[
  {
    "path": ".ditz-plugins",
    "content": "- issue-claiming\n"
  },
  {
    "path": ".gitignore",
    "content": ".kdev4\n*.kdev4\n*.pyc\nshare/k3d/guide/content/._pipeline.txt\n"
  },
  {
    "path": "AUTHORS",
    "content": "This is K-3D, the free-as-in-freedom 3D modeling, animation, and rendering system.\n\nFor a list of K-3D contributors, use the \"Help > About\" menu item.  To see the\nlist of contributors without running K-3D, see the k3dsdk/contributors.cpp file.\n\nFor further information, visit the K-3D web site:\n\n\thttp://www.k-3d.org\n\nThank You,\nThe K-3D Team\n\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "PROJECT(k3d)\n\n# Configure CMake ...\nCMAKE_MINIMUM_REQUIRED(VERSION 3.1 FATAL_ERROR)\nCMAKE_POLICY(SET CMP0003 OLD)\nIF(${CMAKE_MAJOR_VERSION} GREATER 3 OR ${CMAKE_MAJOR_VERSION} EQUAL 3)\n  CMAKE_POLICY(SET CMP0026 OLD)\nENDIF()\n\nset(CMAKE_CXX_STANDARD 11)\n\n\nSET(CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules\")\nSET(CMAKE_INSTALL_NAME_DIR \"@exectuable_path/../lib/\")\n\nINCLUDE(K3DOutOfSourceBuild) # Disallow in-source builds\nINCLUDE(K3DCompileResource)\nINCLUDE(K3DGenerateDEF) # Convenience macro for linking Win32 DLLs using MSVC\nINCLUDE(K3DDependencies)\nINCLUDE(K3DWordSize) # Detect 32/64 bit platform\nINCLUDE(K3DCompiler) # Detect problematic compilers\n\n# Set the K-3D version\nSET(K3D_MAJOR_VERSION 0)\nSET(K3D_MINOR_VERSION 8)\nSET(K3D_RELEASE_VERSION 0)\nSET(K3D_BUILD_VERSION 7)\nSET(K3D_SO_VERSION 1)\n\nSET(K3D_PACKAGE k3d)\nSET(K3D_VERSION ${K3D_MAJOR_VERSION}.${K3D_MINOR_VERSION}.${K3D_RELEASE_VERSION}.${K3D_BUILD_VERSION})\nSET(K3D_HOST ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR})\nSET(K3D_COPYRIGHT \"Copyright (c) 1995-2010, Timothy M. Shead.\tAll Rights Reserved.\")\n\n# Run tests to find external packages ...\nINCLUDE(K3DFind3ds)\nINCLUDE(K3DFindCairomm)\nINCLUDE(K3DFindCARVE)\nINCLUDE(K3DFindCGAL)\nINCLUDE(K3DFindCollada)\nINCLUDE(K3DFindDBus)\nINCLUDE(K3DFindFreetype2)\nINCLUDE(K3DFindFTGL)\nINCLUDE(K3DFindGiomm)\nINCLUDE(K3DFindGlibmm)\nINCLUDE(K3DFindGMM)\nINCLUDE(K3DFindGPerftools)\nINCLUDE(K3DFindGtkGLExt)\nINCLUDE(K3DFindGtkmm)\nINCLUDE(K3DFindGtkSourceView)\nINCLUDE(K3DFindGTS)\nINCLUDE(K3DFindImageMagick)\nINCLUDE(K3DFindInotify)\nINCLUDE(K3DFindIntl)\nINCLUDE(K3DFindJPEG)\nINCLUDE(K3DFindODE)\nINCLUDE(K3DFindOpenEXR)\nINCLUDE(K3DFindOpenGL)\nINCLUDE(K3DFindOSMesa)\nINCLUDE(K3DFindPNG)\nINCLUDE(K3DFindPython)\nINCLUDE(K3DFindSigC)\nINCLUDE(K3DFindSuperLU)\nINCLUDE(K3DFindTBB)\nINCLUDE(K3DFindTIFF)\nINCLUDE(K3DFindXML)\nINCLUDE(K3DFindZlib)\n\nFIND_PACKAGE(Aqsis NO_MODULE QUIET)\nFIND_PACKAGE(Qt4 4.6.2 COMPONENTS QtCore QtGui QtScript)\nFIND_PACKAGE(K3DAsciiDoc)\n\n# Setup platform-specific defaults ...\nIF(WIN32 AND MSVC)\n\tSET(K3D_ENABLE_SYMBOL_VISIBILITY_DEFAULT ON)\nELSE()\n\tSET(K3D_ENABLE_SYMBOL_VISIBILITY_DEFAULT OFF)\nENDIF()\n\nIF(Aqsis_FOUND AND QT4_FOUND)\n\tSET(K3D_QT_AQSIS_FOUND TRUE)\nELSE()\n\tSET(K3D_QT_AQSIS_FOUND FALSE)\nENDIF()\n\nIF(K3D_OSMESA_FOUND AND QT4_FOUND)\n\tSET(K3D_QT_OSMESA_FOUND TRUE)\nELSE()\n\tSET(K3D_QT_OSMESA_FOUND FALSE)\nENDIF()\n\nOPTION(K3D_BUILD_3DS_IO_MODULE \"Build the 3ds_io module\" ${K3D_3DS_FOUND})\nOPTION(K3D_BUILD_ADVANCED_OPENGL_PAINTERS_MODULE \"Build the advanced OpenGL mesh painters module\" ON)\nOPTION(K3D_BUILD_ANIMATION_MODULE \"Build the animation module\" ON)\nOPTION(K3D_BUILD_ANNOTATION_MODULE \"Build the annotation module\" ${K3D_FREETYPE2_FOUND})\nOPTION(K3D_BUILD_AQSIS_MODULE \"Build the embedded Aqsis render engine module\" ${Aqsis_FOUND})\nOPTION(K3D_BUILD_ARRAY_MODULE \"Build the array module\" ON)\nOPTION(K3D_BUILD_BICUBIC_PATCH_MODULE \"Build the bicubic patch module\" ON)\nOPTION(K3D_BUILD_BILINEAR_PATCH_MODULE \"Build the bilinear patch module\" ON)\nOPTION(K3D_BUILD_BITMAP_MODULE \"Build the bitmap module\" ON)\nOPTION(K3D_BUILD_BLOBBY_MODULE \"Build the blobby module\" ON)\nOPTION(K3D_BUILD_BUNDLED_RENDERMAN_ENGINES_MODULE \"Provides integration with RenderMan-compatible render engines that are bundled with K-3D.\" OFF)\nOPTION(K3D_BUILD_CARVE_MODULE \"Build the CARVE module\" ${K3D_CARVE_FOUND})\nOPTION(K3D_BUILD_CGAL_MODULE \"Build the CGAL module\" ${K3D_CGAL_FOUND})\nOPTION(K3D_BUILD_CLOTH_MODULE \"Build the cloth module\" ON)\nOPTION(K3D_BUILD_COLLADA_IO_MODULE \"Build the COLLADA module\" ${K3D_COLLADA_FOUND})\nOPTION(K3D_BUILD_COMPIZ_MODULE \"Build the Compiz module\" ${K3D_DBUS_FOUND})\nOPTION(K3D_BUILD_CORE_MODULE \"Build the core module\" ON)\nOPTION(K3D_BUILD_CUDA_MODULE \"Build the cuda module\" OFF)\nOPTION(K3D_BUILD_DEFORMATION_MODULE \"Build the mesh deformation module\" ON)\nOPTION(K3D_BUILD_DEVELOPMENT_MODULE \"Build the development module\" ON)\nOPTION(K3D_BUILD_DOUBLE_MODULE \"Build the double module\" ON)\nOPTION(K3D_BUILD_EULER_OPERATIONS_MODULE \"Build the module that exposes the Euler mesh operations as mesh modifiers\" OFF)\nOPTION(K3D_BUILD_FILE_MAGIC_MODULE \"Build the file-identification-magic module\" ON)\nOPTION(K3D_BUILD_FREETYPE2_MODULE \"Build the freetype2 module\" ON)\nOPTION(K3D_BUILD_GIO_MODULE \"Build the GIO module for mime type support\" ${K3D_GIOMM_FOUND})\nOPTION(K3D_BUILD_GLX_MODULE \"Build the GLX offscreen rendering module\" OFF)\nOPTION(K3D_BUILD_GMSH_IO_MODULE \"Build the Gmsh file format module\" ON)\nOPTION(K3D_BUILD_GPERFTOOLS_MODULE \"Build the GPerftools profiling module\" ${K3D_GPERFTOOLS_FOUND})\nOPTION(K3D_BUILD_GRAPHVIZ_MODULE \"Build the GraphViz integration module\" ON)\nOPTION(K3D_BUILD_GTS_IO_MODULE \"Build the GNU Triangulated Surfaces file format module\" ON)\nOPTION(K3D_BUILD_GTS_MODULE \"Build the GNU Triangulated Surfaces module\" ${K3D_GTS_FOUND})\nOPTION(K3D_BUILD_HIGHLIGHTING_MODULE \"Build the user interface 'highlighting' module\" ON)\nOPTION(K3D_BUILD_IGES_IO_MODULE \"Build the IGES file format module\" ON)\nOPTION(K3D_BUILD_IMAGEMAGICK_IO_MODULE \"Build the ImageMagick file format module\" ${K3D_IMAGEMAGICK_FOUND})\nOPTION(K3D_BUILD_INDIGO_MODULE \"Build the Indigo render engine integration module\" ON)\nOPTION(K3D_BUILD_INOTIFY_MODULE \"Build the inotify file change notification module\" ${K3D_INOTIFY_FOUND})\nOPTION(K3D_BUILD_JPEG_IO_MODULE \"Build the jpeg file format module\" ${K3D_JPEG_FOUND})\nOPTION(K3D_BUILD_K3D_IO_MODULE \"Build the K-3D file format module\" ON)\nOPTION(K3D_BUILD_LINEAR_CURVE_MODULE \"Build the linear curve module\" ON)\nOPTION(K3D_BUILD_LIPSYNC_MODULE \"Build the lip synchronization tools module\" ON)\nOPTION(K3D_BUILD_LSYSTEM_MODULE \"Build the l-system parser module\" ON)\nOPTION(K3D_BUILD_LUXRENDER_MODULE \"Build the Luxrender render enegine integration module\" ON)\nOPTION(K3D_BUILD_MATRIX_MODULE \"Build the matrix operations module\" ON)\nOPTION(K3D_BUILD_MD2_IO_MODULE \"Build the md2 io module\" ON)\nOPTION(K3D_BUILD_MESH_ATTRIBUTES_MODULE \"Build the mesh attributes module\" ON)\nOPTION(K3D_BUILD_MESH_INSTANCE_MODULE \"Build the mesh-instance module\" ON)\nOPTION(K3D_BUILD_MESH_MODULE \"Build the mesh module\" ON)\nOPTION(K3D_BUILD_NGUI_ABOUT_MODULE \"Build the user interface 'about' dialog module\" ON)\nOPTION(K3D_BUILD_NGUI_ANIMATION_TIMELINE_PANEL_MODULE \"Build the experimental animation timeline panel module\" ON)\nOPTION(K3D_BUILD_NGUI_ASSIGN_HOTKEYS_MODULE \"Build the user interface 'assign hotkeys' module\" ON)\nOPTION(K3D_BUILD_NGUI_ATK_EVENT_RECORDER_MODULE \"Build the user interface ATK 'event recorder' module\" OFF)\nOPTION(K3D_BUILD_NGUI_KNOT_VECTOR_CONTROL_MODULE \"Build the custom knot-vector property control module\" ON)\nOPTION(K3D_BUILD_NGUI_LEARNING_MODULE \"Build the user interface learning (tutorial) dialog module\" ON)\nOPTION(K3D_BUILD_NGUI_LOG_MODULE \"Build the user interface log window module\" ON)\nOPTION(K3D_BUILD_NGUI_MATERIAL_MANAGER_PANEL_MODULE \"Build the user interface manager manager panel module\" OFF)\nOPTION(K3D_BUILD_NGUI_MESH_CONTROL_MODULE \"Build the mesh property control module\" ON)\nOPTION(K3D_BUILD_NGUI_MODULE \"Build the standard graphical user interface module\" ON)\nOPTION(K3D_BUILD_NGUI_MORPH_POINTS_PAGE_MODULE \"Build the MorphPoints custom property page module\" ON)\nOPTION(K3D_BUILD_NGUI_NODE_LIST_PANEL_MODULE \"Build the user interface node list panel module\" ON)\nOPTION(K3D_BUILD_NGUI_NODE_PROPERTIES_PANEL_MODULE \"Build the user interface node properties panel module\" ON)\nOPTION(K3D_BUILD_NGUI_OPENGL_DIALOG_MODULE \"Build the user interface OpenGL information dialog module\" ON)\nOPTION(K3D_BUILD_NGUI_PARENT_TOOL_MODULE \"Build the user interface 'parent tool' module\" ON)\nOPTION(K3D_BUILD_NGUI_PIPELINE_PANEL_MODULE \"Build the user interface pipeline display panel module\" ON)\nOPTION(K3D_BUILD_NGUI_PIPELINE_PROFILER_PANEL_MODULE \"Build the user interface pipeline profiler panel module\" ON)\nOPTION(K3D_BUILD_NGUI_PYTHON_SHELL_MODULE \"Build the interactive Python shell module\" ON)\nOPTION(K3D_BUILD_NGUI_RECTANGLE_CONTROL_MODULE \"Build the custom rectangle property control module\" ON)\nOPTION(K3D_BUILD_NGUI_RENDER_REGION_TOOL_MODULE \"Build the user interface 'render region tool' module\" ON)\nOPTION(K3D_BUILD_NGUI_SELECTION_CONTROL_MODULE \"Build the selection property control module\" ON)\nOPTION(K3D_BUILD_NGUI_SNAP_TOOL_MODULE \"Build the user interface 'snap tool' module\" ON)\nOPTION(K3D_BUILD_NGUI_SPACE_NAVIGATOR_MODULE \"Build the SpaceNavigator 3D mouse integration module\" OFF)\nOPTION(K3D_BUILD_NGUI_TEXT_EDITOR_MODULE \"Build the user interface text editor module\" ON)\nOPTION(K3D_BUILD_NGUI_TIMELINE_PANEL_MODULE \"Build the user interface timeline panel module\" ON)\nOPTION(K3D_BUILD_NGUI_TOOLBAR_PANEL_MODULE \"Build the user interface toolbar panel module\" ON)\nOPTION(K3D_BUILD_NGUI_TOOL_PROPERTIES_PANEL_MODULE \"Build the user interface tool properties panel module\" ON)\nOPTION(K3D_BUILD_NGUI_UNDO_TREE_PANEL_MODULE \"Build the user interface undo panel module\" ON)\nOPTION(K3D_BUILD_NGUI_UV_EDITOR_PANEL_MODULE \"Build the user interface UV editor panel module\" OFF)\nOPTION(K3D_BUILD_NUI_MODULE \"Build the Null User Interface module\" ON)\nOPTION(K3D_BUILD_NURBS_MODULE \"Build the NURBS module\" ON)\nOPTION(K3D_BUILD_NURBS_SOURCES_MODULE \"Build the NURBS sources module\" ON)\nOPTION(K3D_BUILD_OBJ_IO_MODULE \"Build the Wavefront .obj file format module\" ON)\nOPTION(K3D_BUILD_ODE_MODULE \"Build the Open Dynamics Engine (ODE) integration module\" ${K3D_ODE_FOUND})\nOPTION(K3D_BUILD_OGRE_IO_MODULE \"Build the Object-oriented Graphics Engine (OGRE) file I/O module\" ON)\nOPTION(K3D_BUILD_OPENEXR_IO_MODULE \"Build the OpenEXR file format module\" ${K3D_OPENEXR_FOUND})\nOPTION(K3D_BUILD_OPENGL_MODULE \"Build the OpenGL integration module\" ON)\nOPTION(K3D_BUILD_OSMESA_MODULE \"Build the Offscreen Mesa integration module\" ${K3D_OSMESA_FOUND})\nOPTION(K3D_BUILD_OSX_MODULE \"Build the Mac OSX integration module\" ${APPLE})\nOPTION(K3D_BUILD_PARTICLE_MODULE \"Build the point group module\" ON)\nOPTION(K3D_BUILD_PDIFF_MODULE \"Build the perceptual-diff module\" ON)\nOPTION(K3D_BUILD_PIXIE_MODULE \"Build the Pixie render engine integration module\" ON)\nOPTION(K3D_BUILD_PLOT_MODULE \"Build the function-plot module\" ON)\nOPTION(K3D_BUILD_PLY_IO_MODULE \"Build the Stanford .ply file format module\" ON)\nOPTION(K3D_BUILD_PNG_IO_MODULE \"Build the PNG file format module\" ON)\nOPTION(K3D_BUILD_POLYHEDRON_MODULE \"Build the polyhedron module\" ON)\nOPTION(K3D_BUILD_POLYHEDRON_SOURCES_MODULE \"Build the polyhedron sources module\" ON)\nOPTION(K3D_BUILD_PYTHON_MODULE \"Build the Python scripting language module\" ON)\nOPTION(K3D_BUILD_PYUI_MODULE \"Build the Python user interface plugin\" ON)\nOPTION(K3D_BUILD_QSLIM_MODULE \"Build the qslim module\" ON)\nOPTION(K3D_BUILD_QTUI_ABOUT_DIALOG_MODULE \"Build the Qt user interface 'about' dialog module\" OFF)\nOPTION(K3D_BUILD_QTUI_AQSIS_MODE_MODULE \"Build the Qt-Aqsis integration mode module\" OFF)\nOPTION(K3D_BUILD_QTUI_AQSIS_MODULE \"Build the Qt-Aqsis integration module\" OFF)\nOPTION(K3D_BUILD_QTUI_BOOLEAN_MODULE \"Build the Qt graphical user interface boolean property widget module\" OFF)\nOPTION(K3D_BUILD_QTUI_COLOR_MODULE \"Build the Qt graphical user interface color property widget module\" OFF)\nOPTION(K3D_BUILD_QTUI_DEFAULT_MODE_MODULE \"Build the Qt graphical user interface default mode module\" OFF)\nOPTION(K3D_BUILD_QTUI_JAVASCRIPT_SHELL_MODULE \"Build the Qt graphical user interface interactive JavaScript shell module\" OFF)\nOPTION(K3D_BUILD_QTUI_LOG_MODULE \"Build the Qt user interface log window module\" OFF)\nOPTION(K3D_BUILD_QTUI_MATRIX_MODULE \"Build the Qt graphical user interface matrix property widget module\" OFF)\nOPTION(K3D_BUILD_QTUI_MODULE \"Build the Qt graphical user interface module\" OFF)\nOPTION(K3D_BUILD_QTUI_MOVE_MODE_MODULE \"Build the user interface mode to move components\" OFF)\nOPTION(K3D_BUILD_QTUI_NODE_LIST_MODULE \"Build the Qt graphical user interface node list module\" OFF)\nOPTION(K3D_BUILD_QTUI_NODE_PROPERTIES_MODULE \"Build the Qt graphical user interface node properties module\" OFF)\nOPTION(K3D_BUILD_QTUI_OPENGL_MODULE \"Build the Qt graphical user interface OpenGL-test module\" OFF)\nOPTION(K3D_BUILD_QTUI_PATH_MODULE \"Build the Qt graphical user interface filesystem path property widget module\" OFF)\nOPTION(K3D_BUILD_QTUI_PROGRAMMABLE_MODE_MODULE \"Build the Qt graphical user interface programmable mode module\" OFF)\nOPTION(K3D_BUILD_QTUI_STRING_MODULE \"Build the Qt graphical user interface string property widget module\" OFF)\nOPTION(K3D_BUILD_QTUI_TEXT_EDITOR_MODULE \"Build the Qt graphical user interface text editor module\" OFF)\nOPTION(K3D_BUILD_QUADRICS_MODULE \"Build the quadrics module\" ON)\nOPTION(K3D_BUILD_REFERENCE_OPENGL_PAINTERS_MODULE \"Build the reference OpenGL mesh painters module\" ON)\nOPTION(K3D_BUILD_RENDERMAN_ENGINES_MODULE \"Provides integration with many RenderMan-compatible render engines.\" ON)\nOPTION(K3D_BUILD_RENDERMAN_MODULE \"Build the RenderMan integration module\" ON)\nOPTION(K3D_BUILD_RENDERMAN_PAINTERS_MODULE \"Build the RenderMan mesh painters module\" ON)\nOPTION(K3D_BUILD_RELEASE_MODULE \"Build the release nag-messages module\" ON)\nOPTION(K3D_BUILD_SCRIPTED_PLUGINS_MODULE \"Build the scripted plugins module\" ON)\nOPTION(K3D_BUILD_SCRIPTING_MODULE \"Build the scripting module\" ON)\nOPTION(K3D_BUILD_SELECTION_MODULE \"Build the selection module\" ON)\nOPTION(K3D_BUILD_SOLAR_MODULE \"Build the solar module\" ON)\nOPTION(K3D_BUILD_STL_IO_MODULE \"Build the STL file format module\" ON)\nOPTION(K3D_BUILD_SUBDIVISION_SURFACE_MODULE \"Build the subdivision surface module\" ON)\nOPTION(K3D_BUILD_SVG_IO_MODULE \"Build the SVG file format module\" ON)\nOPTION(K3D_BUILD_TEST_MODULE \"Build the regression test module\" ON)\nOPTION(K3D_BUILD_TIFF_IO_MODULE \"Build the TIFF file format module\" ON)\nOPTION(K3D_BUILD_TIME_MODULE \"Build the time source module\" ON)\nOPTION(K3D_BUILD_UNIFORM_POLYHEDRON_MODULE \"Build the uniform polyhedron source module\" ON)\nOPTION(K3D_BUILD_VIRTUAL_OFFSCREEN_MODULE \"Build the virtual offscreen OpenGL rendering module\" OFF)\nOPTION(K3D_BUILD_VIRTUAL_OPENGL_PAINTERS_MODULE \"Build virtual OpenGL painters modules\" ON)\nOPTION(K3D_BUILD_WGL_MODULE \"Build the Windows offscreen rendering module\" ${WIN32})\nOPTION(K3D_BUILD_WINDOWS_MODULE \"Build the Windows integration module\" ${WIN32})\nOPTION(K3D_BUILD_XTRACKCAD_MODULE \"Build the XTrackCAD Model Railroad integration module\" ON)\nOPTION(K3D_BUILD_YAFRAY_MODULE \"Build the YAFRAY render engine integration module\" ON)\n\nOPTION(K3D_BUILD_DOCS \"Build the documentation\" OFF)\nOPTION(K3D_BUILD_GUIDE \"Build the html guide\" OFF)\n\nOPTION(K3D_ENABLE_OSX_BUNDLE \"Package K-3D as an OSX bundle (ignored on other platforms).\" OFF)\nOPTION(K3D_ENABLE_DISTRIBUTION \"Enable distribution targets.\" OFF)\nOPTION(K3D_ENABLE_NLS \"Build K-3D with native language support\" ON)\nOPTION(K3D_ENABLE_PARALLEL \"Enable parallel computation using the Threaded Building Blocks library.\" OFF)\nOPTION(K3D_ENABLE_PROFILING \"Enable code profiling using GPerftools.\" OFF)\nOPTION(K3D_ENABLE_PYTHON \"Build K-3D with Python support\" ON)\nOPTION(K3D_ENABLE_SYMBOL_VISIBILITY \"Minimize the number of symbols exported from shared libraries.\" ${K3D_ENABLE_SYMBOL_VISIBILITY_DEFAULT})\nOPTION(K3D_ENABLE_TESTING \"Build the K-3D regression test suite.\" OFF)\n\n# Find Boost - this logic must follow all user-definable options\nSET(K3D_BOOST_COMPONENTS date_time program_options regex system unit_test_framework)\nIF(K3D_ENABLE_PYTHON)\n\tLIST(APPEND K3D_BOOST_COMPONENTS python)\nENDIF()\nIF(K3D_BUILD_COLLADA_IO_MODULE)\n\tLIST(APPEND K3D_BOOST_COMPONENTS filesystem)\nENDIF()\nIF(K3D_BUILD_CGAL_MODULE)\n\tLIST(APPEND K3D_BOOST_COMPONENTS thread)\nENDIF()\nINCLUDE(K3DFindBoost)\n\n# Find required external packages\nK3D_CHECK(\"K-3D\" REQUIRES Boost_FOUND RESOURCE \"Boost\" URL \"http://www.boost.org\" MESSAGE \"Note: K-3D requires many of the compiled Boost libraries, which may be distributed separately on some systems.\")\nK3D_CHECK(\"K-3D\" REQUIRES K3D_GLIBMM_FOUND RESOURCE \"glibmm\" URL \"http://gtkmm.org\")\nK3D_CHECK(\"K-3D\" REQUIRES K3D_OPENGL_FOUND RESOURCE \"OpenGL\" URL \"http://opengl.org\")\nK3D_CHECK(\"K-3D\" REQUIRES K3D_SIGC_FOUND RESOURCE \"libsigc++\" URL \"http://libsigc.sourceforge.net\")\nK3D_CHECK(\"K-3D\" REQUIRES K3D_XML_FOUND RESOURCE \"XML parser\" URL \"http://xmlsoft.org\")\nK3D_CHECK(\"K-3D\" REQUIRES K3D_ZLIB_FOUND RESOURCE \"zlib\" URL \"http://www.zlib.net\")\n\nK3D_CHECK(K3D_BUILD_3DS_IO_MODULE REQUIRES K3D_3DS_FOUND RESOURCE \"lib3ds\")\nK3D_CHECK(K3D_BUILD_ANNOTATION_MODULE REQUIRES K3D_FREETYPE2_FOUND RESOURCE \"freetype2\")\nK3D_CHECK(K3D_BUILD_AQSIS_MODULE REQUIRES Aqsis_FOUND MESSAGE \"To build this module you need to set Aqsis_DIR to the path to an Aqsis build directory.\")\nK3D_CHECK(K3D_BUILD_CARVE_MODULE REQUIRES K3D_CARVE_FOUND RESOURCE \"CARVE\")\nK3D_CHECK(K3D_BUILD_CGAL_MODULE REQUIRES K3D_CGAL_FOUND RESOURCE \"CGAL\")\nK3D_CHECK(K3D_BUILD_COLLADA_MODULE REQUIRES K3D_COLLADA_FOUND RESOURCE \"Collada DOM\")\nK3D_CHECK(K3D_BUILD_COMPIZ_MODULE REQUIRES K3D_DBUS_FOUND RESOURCE \"libdbus\")\nK3D_CHECK(K3D_BUILD_FREETYPE2_MODULE REQUIRES K3D_FREETYPE2_FOUND RESOURCE \"freetype2\")\nK3D_CHECK(K3D_BUILD_GTS_MODULE REQUIRES K3D_GTS_FOUND RESOURCE \"GNU Triangulated Surface\")\nK3D_CHECK(K3D_BUILD_IMAGEMAGICK_IO_MODULE REQUIRES K3D_IMAGEMAGICK_FOUND RESOURCE \"ImageMagick\")\nK3D_CHECK(K3D_BUILD_JPEG_IO_MODULE REQUIRES K3D_JPEG_FOUND RESOURCE \"JPEG\")\nK3D_CHECK(K3D_BUILD_NGUI_ABOUT_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_ANIMATION_TIMELINE_PANEL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_ASSIGN_HOTKEYS_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_ATK_EVENT_RECORDER_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_KNOT_VECTOR_CONTROL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_LEARNING_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_LOG_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_MESH_CONTROL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_MODULE REQUIRES K3D_GTKGLEXT_FOUND RESOURCE \"gtkglext\")\nK3D_CHECK(K3D_BUILD_NGUI_MODULE REQUIRES K3D_GTKGLEXT_FOUND RESOURCE \"gtkglext\")\nK3D_CHECK(K3D_BUILD_NGUI_MODULE REQUIRES K3D_GTKMM_FOUND RESOURCE \"gtkmm\")\nK3D_CHECK(K3D_BUILD_NGUI_MODULE REQUIRES K3D_GTKMM_FOUND RESOURCE \"gtkmm\")\nK3D_CHECK(K3D_BUILD_NGUI_MORPH_POINTS_PAGE_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_NODE_HISTORY_PANEL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_NODE_LIST_PANEL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_NODE_PROPERTIES_PANEL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_OPENGL_DIALOG_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_PARENT_TOOL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_PIPELINE_PANEL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_PIPELINE_PANEL_MODULE REQUIRES K3D_CAIROMM_FOUND RESOURCE \"cairomm\")\nK3D_CHECK(K3D_BUILD_NGUI_PIPELINE_PANEL_MODULE REQUIRES K3D_CAIROMM_FOUND RESOURCE \"cairomm\")\nK3D_CHECK(K3D_BUILD_NGUI_PIPELINE_PROFILER_PANEL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_PYTHON_SHELL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_PYTHON_SHELL_MODULE REQUIRES K3D_ENABLE_PYTHON)\nK3D_CHECK(K3D_BUILD_NGUI_PYTHON_SHELL_MODULE REQUIRES K3D_ENABLE_PYTHON)\nK3D_CHECK(K3D_BUILD_NGUI_RECTANGLE_CONTROL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_RENDER_REGION_TOOL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_SELECTION_CONTROL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_SNAP_TOOL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_SPACE_NAVIGATOR_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_TEXT_EDITOR_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_TIMELINE_PANEL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_TOOLBAR_PANEL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_TOOL_PROPERTIES_PANEL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_UNDO_TREE_PANEL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_NGUI_UV_EDITOR_PANEL_MODULE REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_CHECK(K3D_BUILD_OPENEXR_IO_MODULE REQUIRES K3D_OPENEXR_FOUND RESOURCE \"OpenEXR\")\nK3D_CHECK(K3D_BUILD_OSMESA_MODULE REQUIRES K3D_OSMESA_FOUND RESOURCE \"OSMesa\")\nK3D_CHECK(K3D_BUILD_PGP_REMESH_MODULE REQUIRES K3D_GMM_FOUND RESOURCE \"gmm\")\nK3D_CHECK(K3D_BUILD_PNG_IO_MODULE REQUIRES K3D_PNG_FOUND RESOURCE \"PNG\")\nK3D_CHECK(K3D_BUILD_PYTHON_MODULE REQUIRES K3D_ENABLE_PYTHON)\nK3D_CHECK(K3D_BUILD_PYUI_MODULE REQUIRES K3D_ENABLE_PYTHON)\nK3D_CHECK(K3D_BUILD_QTUI_ABOUT_DIALOG_MODULE REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_CHECK(K3D_BUILD_QTUI_AQSIS_MODULE REQUIRES Aqsis_FOUND K3D_BUILD_QTUI_MODULE MESSAGE \"To build this module you need to set Aqsis_DIR to the path to an Aqsis build directory.\")\nK3D_CHECK(K3D_BUILD_QTUI_AQSIS_MODE_MODULE REQUIRES Aqsis_FOUND K3D_BUILD_QTUI_MODULE MESSAGE \"To build this module you need to set Aqsis_DIR to the path to an Aqsis build directory.\")\nK3D_CHECK(K3D_BUILD_QTUI_BOOLEAN_MODULE REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_CHECK(K3D_BUILD_QTUI_COLOR_MODULE REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_CHECK(K3D_BUILD_QTUI_DEFAULT_MODE_MODULE REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_CHECK(K3D_BUILD_QTUI_JAVASCRIPT_SHELL_MODULE REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_CHECK(K3D_BUILD_QTUI_LOG_MODULE REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_CHECK(K3D_BUILD_QTUI_MATRIX_MODULE REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_CHECK(K3D_BUILD_QTUI_MODULE REQUIRES QT4_FOUND RESOURCE \"Qt4\")\nK3D_CHECK(K3D_BUILD_QTUI_MOVE_MODE_MODULE REQUIRES QT4_FOUND)\nK3D_CHECK(K3D_BUILD_QTUI_NODE_LIST_MODULE REQUIRES QT4_FOUND)\nK3D_CHECK(K3D_BUILD_QTUI_NODE_PROPERTIES_MODULE REQUIRES QT4_FOUND)\nK3D_CHECK(K3D_BUILD_QTUI_OPENGL_MODULE REQUIRES K3D_BUILD_QTUI_MODULE K3D_BUILD_OSMESA_MODULE)\nK3D_CHECK(K3D_BUILD_QTUI_PATH_MODULE REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_CHECK(K3D_BUILD_QTUI_PROGRAMMABLE_MODE_MODULE REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_CHECK(K3D_BUILD_QTUI_STRING_MODULE REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_CHECK(K3D_BUILD_QTUI_TEXT_EDITOR_MODULE REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_CHECK(K3D_BUILD_TIFF_IO_MODULE REQUIRES K3D_TIFF_FOUND RESOURCE \"libtiff\")\nK3D_CHECK(K3D_ENABLE_NLS REQUIRES K3D_INTL_FOUND RESOURCE \"intl\")\nK3D_CHECK(K3D_ENABLE_PARALLEL REQUIRES K3D_TBB_FOUND RESOURCE \"Threading Building Blocks\" URL \"http://threadingbuildingblocks.org\")\nK3D_CHECK(K3D_ENABLE_PROFILING REQUIRES K3D_GPERFTOOLS_FOUND RESOURCE \"GPerftools\" URL \"https://github.com/gperftools/gperftools\")\nK3D_CHECK(K3D_ENABLE_PYTHON REQUIRES K3D_PYTHON_FOUND RESOURCE \"Python\")\n\n# Setup testing\nSET(BUILD_TESTING ${K3D_ENABLE_TESTING} CACHE INTERNAL \"\" FORCE)\nINCLUDE(CTest)\nIF(K3D_ENABLE_TESTING)\n\tCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/CTestCustom.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CTestCustom.cmake @ONLY)\nENDIF()\n\n# Capture system configuration\nINCLUDE(K3DSystemConfiguration)\n\n# Win32 configuration\nIF(WIN32 AND NOT MSVC)\n\tSET(CMAKE_EXE_LINKER_FLAGS \"-Wl,--enable-runtime-pseudo-reloc\" CACHE STRING \"\" FORCE)\n\tSET(CMAKE_SHARED_LINKER_FLAGS \"-Wl,--enable-runtime-pseudo-reloc -Wl,--export-all-symbols\" CACHE STRING \"\" FORCE)\nENDIF()\n\n# Setup output directories ...\nSET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${k3d_BINARY_DIR}/bin)\n\nSET(K3D_LIBDIR lib) # Allows us to handle 64-bit libs if/when it becomes necessary.\n\nIF(APPLE AND K3D_ENABLE_OSX_BUNDLE)\n\tSET(K3D_BUNDLE_DIRECTORY ${k3d_BINARY_DIR}/K-3D.app/Contents)\n\tSET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${K3D_BUNDLE_DIRECTORY}/${K3D_LIBDIR})\n\tSET(K3D_RUNTIME_OUTPUT_DIRECTORY ${K3D_BUNDLE_DIRECTORY}/MacOS)\n\tSET(K3D_MODULE_OUTPUT_DIRECTORY ${K3D_BUNDLE_DIRECTORY}/${K3D_LIBDIR}/k3d/plugins)\n\tSET(K3D_SHARE_OUTPUT_DIRECTORY ${K3D_BUNDLE_DIRECTORY}/share)\nELSEIF(WIN32)\n\tSET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${k3d_BINARY_DIR}/bin)\n\tSET(K3D_RUNTIME_OUTPUT_DIRECTORY ${k3d_BINARY_DIR}/bin)\n\tSET(K3D_MODULE_OUTPUT_DIRECTORY ${k3d_BINARY_DIR}/${K3D_LIBDIR}/k3d/plugins)\n\tSET(K3D_SHARE_OUTPUT_DIRECTORY ${k3d_BINARY_DIR}/share)\nELSE()\n\tSET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${k3d_BINARY_DIR}/${K3D_LIBDIR})\n\tSET(K3D_RUNTIME_OUTPUT_DIRECTORY ${k3d_BINARY_DIR}/bin)\n\tSET(K3D_MODULE_OUTPUT_DIRECTORY ${k3d_BINARY_DIR}/${K3D_LIBDIR}/k3d/plugins)\n\tSET(K3D_SHARE_OUTPUT_DIRECTORY ${k3d_BINARY_DIR}/share)\nENDIF()\n\n# Setup subdirectories ...\nK3D_ADD_SUBDIRECTORY(gendef REQUIRES MSVC)\n\nADD_SUBDIRECTORY(k3dsdk)\nADD_SUBDIRECTORY(resource-compiler)\n\nADD_SUBDIRECTORY(application)\nADD_SUBDIRECTORY(desktop)\nADD_SUBDIRECTORY(make-module-proxy)\nADD_SUBDIRECTORY(renderjob)\nADD_SUBDIRECTORY(renderframe)\nADD_SUBDIRECTORY(sl2xml)\nADD_SUBDIRECTORY(uuidgen)\nADD_SUBDIRECTORY(modules)\nADD_SUBDIRECTORY(share)\n\nK3D_ADD_SUBDIRECTORY(tests REQUIRES K3D_ENABLE_TESTING)\nK3D_ADD_SUBDIRECTORY(po REQUIRES K3D_ENABLE_NLS)\n\nADD_SUBDIRECTORY(bugs)\nK3D_ADD_SUBDIRECTORY(docs REQUIRES K3D_BUILD_DOCS)\nADD_SUBDIRECTORY(web)\n\nK3D_ADD_SUBDIRECTORY(distribution REQUIRES K3D_ENABLE_DISTRIBUTION)\n\n# Hide some cruft ...\nMARK_AS_ADVANCED(A2X_COMMAND)\nMARK_AS_ADVANCED(AQSIS_COMMAND)\nMARK_AS_ADVANCED(AQSL_COMMAND)\nMARK_AS_ADVANCED(ASCIIDOC_COMMAND)\nMARK_AS_ADVANCED(ASSISTANT_COMMAND)\nMARK_AS_ADVANCED(ASTYLE_COMMAND)\nMARK_AS_ADVANCED(Aqsis_DIR)\nMARK_AS_ADVANCED(CMAKE_BACKWARDS_COMPATIBILITY)\nMARK_AS_ADVANCED(CMAKE_EXECUTABLE_FORMAT)\nMARK_AS_ADVANCED(CMAKE_LIBRARY_OUTPUT_DIRECTORY)\nMARK_AS_ADVANCED(CMAKE_OSX_ARCHITECTURES)\nMARK_AS_ADVANCED(CMAKE_OSX_DEPLOYMENT_TARGET)\nMARK_AS_ADVANCED(CMAKE_OSX_SYSROOT)\nMARK_AS_ADVANCED(CMAKE_RUNTIME_OUTPUT_DIRECTORY)\nMARK_AS_ADVANCED(CMAKE_USE_CHRPATH)\nMARK_AS_ADVANCED(CUDA_FOUND CUDA_COMPILER CUDA_RUNTIME_LIBRARY)\nMARK_AS_ADVANCED(DART_TESTING_TIMEOUT)\nMARK_AS_ADVANCED(DITZ_EXECUTABLE)\nMARK_AS_ADVANCED(GDB_COMMAND)\nMARK_AS_ADVANCED(GIT_COMMAND)\nMARK_AS_ADVANCED(K3D_AQSIS_COMMAND)\nMARK_AS_ADVANCED(K3D_BOOST_INCLUDE_DIR)\nMARK_AS_ADVANCED(K3D_BOOST_LIBRARY_DIR)\nMARK_AS_ADVANCED(K3D_BOOST_USE_MULTITHREADED)\nMARK_AS_ADVANCED(K3D_ENABLE_PARALLEL)\nMARK_AS_ADVANCED(K3D_ENABLE_PROFILING)\nMARK_AS_ADVANCED(K3D_ENABLE_SYMBOL_VISIBILITY)\nMARK_AS_ADVANCED(K3D_EXTRA_GDB_ARGUMENTS)\nMARK_AS_ADVANCED(K3D_EXTRA_QT_PLUGINS)\nMARK_AS_ADVANCED(K3D_GTK_DIR)\nMARK_AS_ADVANCED(K3D_INTLTOOL_UPDATE)\nMARK_AS_ADVANCED(K3D_MACPORTS_DIR)\nMARK_AS_ADVANCED(K3D_MINGW_GCC)\nMARK_AS_ADVANCED(K3D_MSGFMT)\nMARK_AS_ADVANCED(K3D_MSGMERGE)\nMARK_AS_ADVANCED(K3D_PYTHON_COMMAND)\nMARK_AS_ADVANCED(K3D_PYTHON_LIBRARY)\nMARK_AS_ADVANCED(K3D_SOURCEFORGE_USERNAME)\nMARK_AS_ADVANCED(K3D_XGETTEXT)\nMARK_AS_ADVANCED(MAKO_COMMAND)\nMARK_AS_ADVANCED(QCOLLECTIONGENERATOR_COMMAND)\nMARK_AS_ADVANCED(QHELPGENERATOR_COMMAND)\nMARK_AS_ADVANCED(QT_MKSPECS_DIR)\nMARK_AS_ADVANCED(QT_PLUGINS_DIR)\nMARK_AS_ADVANCED(QT_QMAKE_EXECUTABLE)\nMARK_AS_ADVANCED(QT_QTMOTIF_INCLUDE_DIR)\nMARK_AS_ADVANCED(QT_QTMOTIF_LIBRARY_DEBUG)\nMARK_AS_ADVANCED(QT_QTMOTIF_LIBRARY_RELEASE)\nMARK_AS_ADVANCED(QT_X11_X11_LIBRARY)\nMARK_AS_ADVANCED(QT_X11_Xext_LIBRARY)\nMARK_AS_ADVANCED(QT_X11_m_LIBRARY)\nMARK_AS_ADVANCED(RNDR_COMMAND)\nMARK_AS_ADVANCED(RSVG_COMMAND)\nMARK_AS_ADVANCED(SDRC_COMMAND)\n"
  },
  {
    "path": "COPYING",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n\t    How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year  name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type 'show c' for details.\n\nThe hypothetical commands 'show w' and 'show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than 'show w' and 'show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  'Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Library General\nPublic License instead of this License.\n"
  },
  {
    "path": "CTestConfig.cmake",
    "content": "SET(CTEST_PROJECT_NAME \"K-3D\")\nSET(CTEST_NIGHTLY_START_TIME \"02:00:00 MST\")\n\nSET(CTEST_DROP_METHOD \"http\")\nSET(CTEST_DROP_SITE \"www.k-3d.org\")\nSET(CTEST_DROP_LOCATION \"/cdash/submit.php?project=K-3D\")\nSET(CTEST_DROP_SITE_CDASH TRUE)\n\n"
  },
  {
    "path": "CTestCustom.cmake.in",
    "content": "\nSET(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS 400)\nSET(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 400)\n\nSET(CTEST_CUSTOM_WARNING_EXCEPTION\n\t${CTEST_CUSTOM_WARNING_EXCEPTION}\n\t\"[/]usr[/]include[/]c[+][+][/]4.3[/]backward[/]backward_warning.h[:]33[:]2\"\n\t)\n\n"
  },
  {
    "path": "INSTALL",
    "content": "This is K-3D, the free-as-in-freedom 3D modeling, animation, and rendering system.\n\nYou will need CMake, http://www.cmake.org, to build K-3D on all platforms.\n\nFor detailed, platform-specific instructions on how to build and install K-3D,\nplease visit the \"Getting Started\" section of the K-3D website, located at:\n\n\thttp://www.k-3d.org/wiki/Getting_Started\n\nThank you,\nThe K-3D Team\n\n"
  },
  {
    "path": "README",
    "content": "This is K-3D, the free-as-in-freedom 3D modeling, animation, and rendering system.\n\nFor instructions on building the project, refer to INSTALL, located within this directory.\nThe project is licensed under the GNU General Public License.  A copy of the license is\nlocated in COPYING.  Contributors to the project are listed in the AUTHORS file.\n\nFor further information, visit the K-3D web site:\n\n\thttp://www.k-3d.org\n\nThank You,\nThe K-3D Team\n\n"
  },
  {
    "path": "application/CMakeLists.txt",
    "content": "PROJECT(application)\n\nCONFIGURE_FILE(config.h.in config.h)\nCONFIGURE_FILE(Info.plist.in Info.plist @ONLY)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\nINCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GLIBMM_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_SIGC_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nSET(SOURCES k3d_main.cpp)\n\nIF(WIN32 AND MSVC)\n\tSET(SOURCES ${SOURCES} winmain.cpp)\nELSE(WIN32 AND MSVC)\n\tSET(SOURCES ${SOURCES} main.cpp)\nENDIF(WIN32 AND MSVC)\n\nIF(WIN32)\n\tIF(MINGW)\n\t\tADD_CUSTOM_COMMAND(\n\t\t\tOUTPUT ${CMAKE_CURRENT_BINARY_DIR}/icon.o\n\t\t\tCOMMAND\n\t\t\t\twindres.exe\n\t\t\t\t-I${CMAKE_CURRENT_SOURCE_DIR}\n\t\t\t\t-i${CMAKE_CURRENT_SOURCE_DIR}/icon.rc\n\t\t\t\t-o ${CMAKE_CURRENT_BINARY_DIR}/icon.o\n\t\t\t)\n\n\t\tSET(SOURCES ${SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/icon.o)\n\tELSE(MINGW)\n\t\tSET(SOURCES ${SOURCES} icon.rc)\n\tENDIF(MINGW)\nENDIF(WIN32)\n\nADD_EXECUTABLE(k3d WIN32 ${SOURCES})\n\nSET_TARGET_PROPERTIES(k3d PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY ${K3D_RUNTIME_OUTPUT_DIRECTORY}\n  )\n\nTARGET_LINK_LIBRARIES(k3d\n\tk3dsdk\n\tk3dsdk-opengl\n\t)\n\nIF(UNIX AND NOT APPLE)\n\tSET_TARGET_PROPERTIES(k3d PROPERTIES LINK_FLAGS -Wl,-E)\nENDIF()\n\nIF(K3D_ENABLE_NLS)\n\tINCLUDE_DIRECTORIES(${K3D_INTL_INCLUDE_DIRS})\n\tTARGET_LINK_LIBRARIES(k3d ${K3D_INTL_LIBS})\nENDIF(K3D_ENABLE_NLS)\n\nIF(APPLE AND K3D_ENABLE_OSX_BUNDLE)\n  ADD_CUSTOM_COMMAND(\n    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/Info.plist\n    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/Info.plist ${K3D_BUNDLE_DIRECTORY}\n    OUTPUT ${K3D_BUNDLE_DIRECTORY}/Info.plist\n    )\n  ADD_CUSTOM_COMMAND(\n    DEPENDS k3d\n    COMMAND ${CMAKE_COMMAND} -E make_directory ${K3D_BUNDLE_DIRECTORY}/Resources\n    OUTPUT ${K3D_BUNDLE_DIRECTORY}/Resources\n    )\n  ADD_CUSTOM_COMMAND(\n    DEPENDS ${K3D_BUNDLE_DIRECTORY}/Resources ${share_SOURCE_DIR}/k3d/icons/k3d.icns\n    COMMAND ${CMAKE_COMMAND} -E copy ${share_SOURCE_DIR}/k3d/icons/k3d.icns ${K3D_BUNDLE_DIRECTORY}/Resources/K-3D.icns\n    OUTPUT ${K3D_BUNDLE_DIRECTORY}/Resources/K-3D.icns\n    )\n  ADD_CUSTOM_TARGET(bundle ALL\n    DEPENDS\n      ${K3D_BUNDLE_DIRECTORY}/Info.plist\n      ${K3D_BUNDLE_DIRECTORY}/Resources/K-3D.icns\n    )\nENDIF()\n\n# Setup convenience targets for running the application out of the build directory ...\nFIND_PROGRAM(GDB_COMMAND gdb)\nSET(K3D_EXTRA_GDB_ARGUMENTS \"\" CACHE STRING \"Extra arguments to pass to gdb for debugging.\")\n\nGET_TARGET_PROPERTY(K3D_COMMAND k3d LOCATION)\n\nSET(K3D_DEFAULT_ARGUMENTS \"\")\nLIST(APPEND K3D_DEFAULT_ARGUMENTS \"--color\")\nLIST(APPEND K3D_DEFAULT_ARGUMENTS \"--log-level=debug\")\nLIST(APPEND K3D_DEFAULT_ARGUMENTS \"--add-path=${k3d_BINARY_DIR}/bin\")\nLIST(APPEND K3D_DEFAULT_ARGUMENTS \"--locale=${k3d_BINARY_DIR}/po\")\n\nSET(K3D_GDB_COMMAND_LINE ${GDB_COMMAND} ${K3D_EXTRA_GDB_ARGUMENTS})\nSET(K3D_NGUI_COMMAND_LINE ${K3D_COMMAND} ${K3D_DEFAULT_ARGUMENTS} --ui=ngui)\nSET(K3D_NUI_COMMAND_LINE ${K3D_COMMAND} ${K3D_DEFAULT_ARGUMENTS} --ui=nui)\nSET(K3D_PYUI_COMMAND_LINE ${K3D_COMMAND} ${K3D_DEFAULT_ARGUMENTS} --ui=pyui)\nSET(K3D_QTUI_COMMAND_LINE ${K3D_COMMAND} ${K3D_DEFAULT_ARGUMENTS} --ui=qtui)\n\nK3D_ADD_CUSTOM_TARGET(run-ngui REQUIRES K3D_BUILD_NGUI_MODULE COMMAND ${K3D_NGUI_COMMAND_LINE})\nK3D_ADD_CUSTOM_TARGET(run-ngui-gdb REQUIRES K3D_BUILD_NGUI_MODULE GDB_COMMAND COMMAND ${K3D_GDB_COMMAND_LINE} --args ${K3D_NGUI_COMMAND_LINE})\nK3D_ADD_CUSTOM_TARGET(run-nui REQUIRES K3D_BUILD_NUI_MODULE COMMAND ${K3D_NUI_COMMAND_LINE})\nK3D_ADD_CUSTOM_TARGET(run-nui-gdb REQUIRES K3D_BUILD_NUI_MODULE GDB_COMMAND COMMAND ${K3D_GDB_COMMAND_LINE} --args ${K3D_NUI_COMMAND_LINE})\nK3D_ADD_CUSTOM_TARGET(run-pyui REQUIRES K3D_BUILD_PYUI_MODULE COMMAND ${K3D_PYUI_COMMAND_LINE})\nK3D_ADD_CUSTOM_TARGET(run-pyui-gdb REQUIRES K3D_BUILD_PYUI_MODULE GDB_COMMAND COMMAND ${K3D_GDB_COMMAND_LINE} --args ${K3D_PYUI_COMMAND_LINE})\nK3D_ADD_CUSTOM_TARGET(run-qtui REQUIRES K3D_BUILD_QTUI_MODULE COMMAND ${K3D_QTUI_COMMAND_LINE})\nK3D_ADD_CUSTOM_TARGET(run-qtui-gdb REQUIRES K3D_BUILD_QTUI_MODULE GDB_COMMAND COMMAND ${K3D_GDB_COMMAND_LINE} --args ${K3D_QTUI_COMMAND_LINE})\n\nIF(K3D_BUILD_NGUI_MODULE)\n\tK3D_ADD_CUSTOM_TARGET(run REQUIRES K3D_BUILD_NGUI_MODULE COMMAND ${K3D_NGUI_COMMAND_LINE})\n\tK3D_ADD_CUSTOM_TARGET(run-gdb REQUIRES K3D_BUILD_NGUI_MODULE GDB_COMMAND COMMAND ${K3D_GDB_COMMAND_LINE} --args ${K3D_NGUI_COMMAND_LINE})\nELSEIF(K3D_BUILD_QTUI_MODULE)\n\tK3D_ADD_CUSTOM_TARGET(run REQUIRES K3D_BUILD_QTUI_MODULE COMMAND ${K3D_QTUI_COMMAND_LINE})\n\tK3D_ADD_CUSTOM_TARGET(run-gdb REQUIRES K3D_BUILD_QTUI_MODULE GDB_COMMAND COMMAND ${K3D_GDB_COMMAND_LINE} --args ${K3D_QTUI_COMMAND_LINE})\nELSEIF(K3D_BUILD_PYUI_MODULE)\n\tK3D_ADD_CUSTOM_TARGET(run REQUIRES K3D_BUILD_PYUI_MODULE COMMAND ${K3D_PYUI_COMMAND_LINE})\n\tK3D_ADD_CUSTOM_TARGET(run-gdb REQUIRES K3D_BUILD_PYUI_MODULE GDB_COMMAND COMMAND ${K3D_GDB_COMMAND_LINE} --args ${K3D_PYUI_COMMAND_LINE})\nELSEIF(K3D_BUILD_NUI_MODULE)\n\tK3D_ADD_CUSTOM_TARGET(run REQUIRES K3D_BUILD_NUI_MODULE COMMAND ${K3D_NUI_COMMAND_LINE})\n\tK3D_ADD_CUSTOM_TARGET(run-gdb REQUIRES K3D_BUILD_NUI_MODULE GDB_COMMAND COMMAND ${K3D_GDB_COMMAND_LINE} --args ${K3D_NUI_COMMAND_LINE})\nENDIF()\n\nK3D_ADD_CUSTOM_TARGET(run-gdb-core REQUIRES GDB_COMMAND COMMAND ${K3D_GDB_COMMAND_LINE} ${K3D_COMMAND} core)\n#ADD_CUSTOM_TARGET(run-valgrind COMMAND valgrind -v ${k3d_BINARY_DIR}/bin/k3d ${K3D_DEFAULT_ARGUMENTS} --ui=${K3D_NGUI_BINARY})\n#ADD_CUSTOM_TARGET(run-strace COMMAND strace ${k3d_BINARY_DIR}/bin/k3d ${K3D_DEFAULT_ARGUMENTS} --ui=${K3D_NGUI_BINARY})\n\nINSTALL(TARGETS k3d DESTINATION bin)\n\n"
  },
  {
    "path": "application/Info.plist.in",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n\t<dict>\n\t\t<key>CFBundleDevelopmentRegion</key>\n\t\t<string>English</string>\n\t\t<key>CFBundleExecutable</key>\n\t\t<string>K-3D</string>\n\t\t<key>CFBundleGetInfoString</key>\n\t\t<string>@K3D_VERSION@, @K3D_COPYRIGHT@</string>\n\t\t<key>CFBundleIconFile</key>\n\t\t<string>K-3D</string>\n\t\t<key>CFBundleIdentifier</key>\n\t\t<string>org.k-3d.K-3D</string>\n\t\t<key>CFBundleInfoDictionaryVersion</key>\n\t\t<string>6.0</string>\n\t\t<key>CFBundlePackageType</key>\n\t\t<string>APPL</string>\n\t\t<key>CFBundleShortVersionString</key>\n\t\t<string>@K3D_VERSION@</string>\n\t\t<key>CFBundleSignature</key>\n\t\t<string>K-3D</string>\n\t\t<key>CFBundleVersion</key>\n\t\t<string>@K3D_VERSION@</string>\n\t\t<key>NSHumanReadableCopyright</key>\n\t\t<string>@K3D_COPYRIGHT@</string>\n<!--\n\t\t<key>LSMinimumSystemVersion</key>\n\t\t<string>10.5</string>\n-->\n\t</dict>\n</plist>\n"
  },
  {
    "path": "application/config.h.in",
    "content": "#ifndef APPLICATION_CONFIG_H\n#define APPLICATION_CONFIG_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#cmakedefine K3D_ENABLE_OSX_BUNDLE\n#define K3D_LIBDIR \"@K3D_LIBDIR@\"\n\n#endif // !APPLICATION_CONFIG_H\n\n"
  },
  {
    "path": "application/icon.rc",
    "content": "IDI_ICON1 ICON DISCARDABLE \"../share/k3d/icons/k3d.ico\"\r\n\r\n"
  },
  {
    "path": "application/k3d_main.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <config.h>\n\n#include <k3d-i18n-config.h>\n#include <k3d-platform-config.h>\n#include <k3d-version-config.h>\n\n// Specialized K-3D interfaces for embedding\n#include <k3dsdk/application_detail.h>\n#include <k3dsdk/batch_mode_init.h>\n#include <k3dsdk/plugin_factory_collection.h>\n#include <k3dsdk/network_render_farm.h>\n#include <k3dsdk/network_render_farm_detail.h>\n#include <k3dsdk/user_interface_init.h>\n\n// Standard K-3D interfaces\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/application.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/gzstream.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/ievent_loop.h>\n#include <k3dsdk/iscripted_action.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/log_control.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/options_policy.h>\n#include <k3dsdk/parallel/threads.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/register_application.h>\n#include <k3dsdk/register_plugin_factories.h>\n#include <k3dsdk/scripting.h>\n#include <k3dsdk/shader_cache_detail.h>\n#include <k3dsdk/share_detail.h>\n#include <k3dsdk/string_modifiers.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/xml.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iomanip>\n#include <iterator>\n\n#ifdef K3D_API_WIN32\n\t#include <k3dsdk/win32.h>\n#endif // K3D_API_WIN32\n\nnamespace\n{\n\n/// Defines storage for parsed command-line arguments\ntypedef std::vector<boost::program_options::basic_option<char> > arguments_t;\n\n/////////////////////////////////////////////////////////////////////////////\n// User options specified on the command line\n\nk3d::bool_t g_show_timestamps = false;\nk3d::bool_t g_show_process = false;\nk3d::bool_t g_syslog = false;\nk3d::bool_t g_color_level = false;\nk3d::log_level_t g_minimum_log_level = k3d::K3D_LOG_LEVEL_WARNING;\n\nk3d::filesystem::path g_default_ngui_path;\nk3d::filesystem::path g_default_nui_path;\nk3d::filesystem::path g_default_options_path;\nk3d::filesystem::path g_default_pyui_path;\nk3d::filesystem::path g_default_qtui_path;\nk3d::filesystem::path g_default_shader_cache_path;\nk3d::filesystem::path g_default_share_path;\nk3d::filesystem::path g_default_tutorials_path;\nk3d::filesystem::path g_default_user_interface_path;\nk3d::string_t g_default_plugin_paths;\n\nk3d::filesystem::path g_override_locale_path;\nk3d::filesystem::path g_options_path;\nk3d::filesystem::path g_shader_cache_path;\nk3d::filesystem::path g_share_path;\nk3d::filesystem::path g_user_interface_path;\nk3d::string_t g_plugin_paths;\n\nk3d::ievent_loop* g_user_interface = 0;\n\n/////////////////////////////////////////////////////////////////////////////\n// handle_error\n\nvoid handle_error(const k3d::string_t& Message, k3d::bool_t& Quit, k3d::bool_t& Error)\n{\n\tQuit = true;\n\tError = true;\n\n\tthrow std::runtime_error(Message);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// startup_message_handler\n\n/// Called during application startup to display progress to the user\nvoid startup_message_handler(const k3d::string_t& Message)\n{\n\tk3d::log() << info << Message << std::endl;\n\n\tif(g_user_interface)\n\t\tg_user_interface->startup_message_handler(Message);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// exit_request_handler\n\n/// Called when the user wants to shut everything down\nk3d::bool_t exit_request_handler()\n{\n\tif(g_user_interface)\n\t\tg_user_interface->stop_event_loop();\n\n\treturn true;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// set_default_options\n\n/// Sets-up default user options for various platforms\nvoid set_default_options(k3d::bool_t& Quit, k3d::bool_t& Error)\n{\n\t// Setup default paths based on the location of the executable ...\n\tconst k3d::filesystem::path executable_dir = k3d::system::executable_path().branch_path();\n\tconst k3d::filesystem::path user_dir = k3d::system::get_home_directory() / k3d::filesystem::generic_path(\".k3d\");\n\n\tg_default_ngui_path = executable_dir / k3d::filesystem::generic_path(\"../\" K3D_LIBDIR \"/k3d/plugins/k3d-ngui.module\");\n\tg_default_nui_path = executable_dir / k3d::filesystem::generic_path(\"../\" K3D_LIBDIR \"/k3d/plugins/k3d-nui.module\");\n\tg_default_options_path = user_dir / k3d::filesystem::generic_path(\"options.k3d\");\n\tg_default_plugin_paths = (executable_dir / k3d::filesystem::generic_path(\"../\" K3D_LIBDIR \"/k3d/plugins\")).native_filesystem_string();\n\tg_default_pyui_path = executable_dir / k3d::filesystem::generic_path(\"../\" K3D_LIBDIR \"/k3d/plugins/k3d-pyui.module\");\n\tg_default_qtui_path = executable_dir / k3d::filesystem::generic_path(\"../\" K3D_LIBDIR \"/k3d/plugins/k3d-qtui.module\");\n\tg_default_shader_cache_path = user_dir / k3d::filesystem::generic_path(\"shadercache\");\n\tg_default_share_path = executable_dir / k3d::filesystem::generic_path(\"../share/k3d\");\n\n#ifdef K3D_ENABLE_OSX_BUNDLE\n\tg_default_user_interface_path = g_default_qtui_path;\n#else\n\tg_default_user_interface_path = g_default_ngui_path;\n#endif\n\n\t// Setup path options based on the defaults ...\n\tg_options_path = g_default_options_path;\n\tg_plugin_paths = g_default_plugin_paths;\n\tg_shader_cache_path = g_default_shader_cache_path;\n\tg_share_path = g_default_share_path;\n\tg_user_interface_path = g_default_user_interface_path;\n\n\t// Optionally override paths using environment variables ...\n\tif(!k3d::system::getenv(\"K3D_LOCALE_PATH\").empty())\n\t\tg_override_locale_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(k3d::system::getenv(\"K3D_LOCALE_PATH\")));\n\n\tif(!k3d::system::getenv(\"K3D_OPTIONS_PATH\").empty())\n\t\tg_options_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(k3d::system::getenv(\"K3D_OPTIONS_PATH\")));\n\n\tif(!k3d::system::getenv(\"K3D_PLUGIN_PATHS\").empty())\n\t\tg_plugin_paths = k3d::system::getenv(\"K3D_PLUGIN_PATHS\");\n\n\tif(!k3d::system::getenv(\"K3D_SHADER_CACHE_PATH\").empty())\n\t\tg_shader_cache_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(k3d::system::getenv(\"K3D_SHADER_CACHE_PATH\")));\n\n\tif(!k3d::system::getenv(\"K3D_SHARE_PATH\").empty())\n\t\tg_share_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(k3d::system::getenv(\"K3D_SHARE_PATH\")));\n\n\tif(!k3d::system::getenv(\"K3D_USER_INTERFACE_PATH\").empty())\n\t\tg_user_interface_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(k3d::system::getenv(\"K3D_USER_INTERFACE_PATH\")));\n\n#ifdef K3D_API_WIN32\n\t// Add the executable directory to PATH\n\tk3d::system::setenv(\"PATH\", executable_dir.native_filesystem_string() + \";\" + k3d::system::getenv(\"PATH\"));\n#endif // K3D_API_WIN32\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// parse_log_arguments\n\n/// Looks for command-line arguments that apply to logging (so we can set them up right away)\nconst arguments_t parse_log_arguments(const arguments_t& Arguments, k3d::bool_t& Quit, k3d::bool_t& Error)\n{\n\t// Keep track of \"unused\" options ...\n\targuments_t unused;\n\n\tfor(arguments_t::const_iterator argument = Arguments.begin(); argument != Arguments.end(); ++argument)\n\t{\n\t\tif(argument->string_key == \"show-timestamps\")\n\t\t{\n\t\t\tg_show_timestamps = true;\n\t\t}\n\t\telse if(argument->string_key == \"show-process\")\n\t\t{\n\t\t\tg_show_process = true;\n\t\t}\n\t\telse if(argument->string_key == \"syslog\")\n\t\t{\n\t\t\tg_syslog = true;\n\t\t}\n\t\telse if(argument->string_key == \"color\")\n\t\t{\n\t\t\tg_color_level = true;\n\t\t}\n\t\telse if(argument->string_key == \"no-color\")\n\t\t{\n\t\t\tg_color_level = false;\n\t\t}\n\t\telse if(argument->string_key == \"log-level\")\n\t\t{\n\t\t\tif(argument->value[0] == \"warning\")\n\t\t\t\tg_minimum_log_level = k3d::K3D_LOG_LEVEL_WARNING;\n\t\t\telse if(argument->value[0] == \"information\")\n\t\t\t\tg_minimum_log_level = k3d::K3D_LOG_LEVEL_INFO;\n\t\t\telse if(argument->value[0] == \"debug\")\n\t\t\t\tg_minimum_log_level = k3d::K3D_LOG_LEVEL_DEBUG;\n\t\t\telse\n\t\t\t{\n\t\t\t\thandle_error(\"Valid values for the --log-level option are \\\"warning\\\", \\\"information\\\", or \\\"debug\\\"\", Quit, Error);\n\t\t\t\treturn arguments_t();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tunused.push_back(*argument);\n\t\t}\n\t}\n\n\tk3d::log_show_timestamps(g_show_timestamps);\n\tk3d::log_set_tag(g_show_process ? \"[k3d]\" : k3d::string_t());\n\tk3d::log_color_level(g_color_level);\n\tk3d::log_show_level(true);\n\tk3d::log_syslog(g_syslog);\n\tk3d::log_minimum_level(g_minimum_log_level);\n\n\treturn unused;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// parse_startup_arguments\n\n/// Handles \"normal\" command-line arguments that specify initial application state\nconst arguments_t parse_startup_arguments(const arguments_t& Arguments, k3d::bool_t& Quit, k3d::bool_t& Error)\n{\n\t// We return any \"unused\" options ...\n\targuments_t unused;\n\n\t// For each command-line argument ...\n\tfor(arguments_t::const_iterator argument = Arguments.begin(); argument != Arguments.end(); ++argument)\n\t{\n\t\tif(argument->string_key == \"batch\")\n\t\t{\n\t\t\tk3d::set_batch_mode(true);\n\t\t}\n\t\telse if(argument->string_key == \"ui\")\n\t\t{\n\t\t\tif(argument->value[0] == \"nui\" || argument->value[0] == \"none\")\n\t\t\t\tg_user_interface_path = g_default_nui_path;\n\t\t\telse if(argument->value[0] == \"ngui\")\n\t\t\t\tg_user_interface_path = g_default_ngui_path;\n\t\t\telse if(argument->value[0] == \"qtui\")\n\t\t\t\tg_user_interface_path = g_default_qtui_path;\n\t\t\telse if(argument->value[0] == \"pyui\")\n\t\t\t\tg_user_interface_path = g_default_pyui_path;\n\t\t\telse\n\t\t\t\tg_user_interface_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(argument->value[0]));\n\t\t}\n\t\telse if(argument->string_key == \"plugins\")\n\t\t{\n\t\t\tg_plugin_paths = argument->value[0];\n\t\t\tg_plugin_paths = k3d::replace_all(\"&\", g_default_plugin_paths, g_plugin_paths);\n\t\t}\n\t\telse if(argument->string_key == \"shadercache\")\n\t\t{\n\t\t\tg_shader_cache_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(argument->value[0]));\n\t\t}\n\t\telse if(argument->string_key == \"share\")\n\t\t{\n\t\t\tg_share_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(argument->value[0]));\n\t\t}\n\t\telse if(argument->string_key == \"options\")\n\t\t{\n\t\t\tg_options_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(argument->value[0]));\n\t\t}\n\t\telse if(argument->string_key == \"add-path\")\n\t\t{\n#ifdef K3D_API_WIN32\n\t\t\tk3d::system::setenv(\"PATH\", argument->value[0] + \";\" + k3d::system::getenv(\"PATH\"));\n#else // K3D_API_WIN32\n\t\t\tk3d::system::setenv(\"PATH\", argument->value[0] + \":\" + k3d::system::getenv(\"PATH\"));\n#endif // !K3D_API_WIN32\n\t\t}\n\t\telse if(argument->string_key == \"disable-gl-extension\")\n\t\t{\n\t\t\tk3d::gl::extension::disable(argument->value[0]);\n\t\t}\n\t\telse if(argument->string_key == \"enable-gl-extension\")\n\t\t{\n\t\t\tk3d::gl::extension::enable(argument->value[0]);\n\t\t}\n\t\telse if(argument->string_key == \"setenv\")\n\t\t{\n\t\t\tk3d::system::setenv(argument->value[0]);\n\t\t}\n\t\telse if(argument->string_key == \"locale\")\n\t\t{\n\t\t\tg_override_locale_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(argument->value[0]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tunused.push_back(*argument);\n\t\t}\n\t}\n\n\treturn unused;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// check_dependencies\n\n/// Checks for any runtime resources required to continue program execution\nvoid check_dependencies(k3d::bool_t& Quit, k3d::bool_t& Error)\n{\n\tk3d::log() << info << \"package: \" << K3D_PACKAGE << std::endl;\n\tk3d::log() << info << \"version: \" << K3D_VERSION << std::endl;\n\tk3d::log() << info << \"platform: \" << K3D_HOST << std::endl;\n\tk3d::log() << info << \"compiler: \" << K3D_COMPILER_NAME << std::endl;\n\tk3d::log() << info << \"build time: \" << __DATE__ << \" \" << __TIME__ << \" local\" << std::endl;\n\n#ifdef K3D_HAVE_EXPAT\n\tk3d::log() << info << \"xml parser: expat\" << std::endl;\n#elif defined K3D_HAVE_LIBXML2\n\tk3d::log() << info << \"xml parser: libxml2\" << std::endl;\n#else\n\tk3d::log() << warning \"xml parser: unknown\" << std::endl;\n#endif\n\n\tk3d::log() << info << \"executable: \" << k3d::system::executable_path().native_console_string() << std::endl;\n\tk3d::log() << info << \"options file: \" << g_options_path.native_console_string() << std::endl;\n\tk3d::log() << info << \"plugin path(s): \" << g_plugin_paths << std::endl;\n\tk3d::log() << info << \"shader cache path: \" << g_shader_cache_path.native_console_string() << std::endl;\n\tk3d::log() << info << \"share path: \" << g_share_path.native_console_string() << std::endl;\n\tk3d::log() << info << \"user interface: \" << g_user_interface_path.native_console_string() << std::endl;\n\tk3d::log() << info << \"home directory: \" << k3d::system::get_home_directory().native_console_string() << std::endl;\n\tk3d::log() << info << \"temp directory: \" << k3d::system::get_temp_directory().native_console_string() << std::endl;\n\n\t// The options file must be specified and must exist ...\n\tif(g_options_path.empty())\n\t{\n\t\thandle_error(\"Options path must be specified using --options <path>.\", Quit, Error);\n\t\treturn;\n\t}\n\n\tk3d::filesystem::create_directories(g_options_path.branch_path());\n\tif(!k3d::filesystem::exists(g_options_path.branch_path()))\n\t{\n\t\thandle_error(\"Options directory [\" + g_options_path.branch_path().native_console_string() + \"] does not exist and could not be created.\", Quit, Error);\n\t\treturn;\n\t}\n\n\t// Every specified plugin path must exist ...\n\tconst k3d::system::paths_t plugin_paths = k3d::system::decompose_path_list(g_plugin_paths);\n\tfor(k3d::system::paths_t::const_iterator plugin_path = plugin_paths.begin(); plugin_path != plugin_paths.end(); ++plugin_path)\n\t{\n\t\tif(!k3d::filesystem::exists(*plugin_path))\n\t\t{\n\t\t\thandle_error(\"Plugin path [\" + plugin_path->native_console_string() + \"] does not exist.\", Quit, Error);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// The shader cache path must be specified, and must already exist or be successfully created ...\n\tif(g_shader_cache_path.empty())\n\t{\n\t\thandle_error(\"Shader cache path must be specified using --shadercache <path>.\", Quit, Error);\n\t\treturn;\n\t}\n\n\tk3d::filesystem::create_directories(g_shader_cache_path);\n\tif(!k3d::filesystem::exists(g_shader_cache_path))\n\t{\n\t\thandle_error(\"Shader cache path [\" + g_shader_cache_path.native_console_string() + \"] does not exist and could not be created.\", Quit, Error);\n\t\treturn;\n\t}\n\n\t// The share path must exist ...\n\tif(!k3d::filesystem::exists(g_share_path))\n\t{\n\t\thandle_error(\"Share path [\" + g_share_path.native_console_string() + \"] does not exist.\", Quit, Error);\n\t\treturn;\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// create_user_interface\n\n/// Instantiates the (optional) user interface plugin\nvoid create_user_interface(k3d::plugin_factory_collection& Plugins, k3d::bool_t& Quit, k3d::bool_t& Error)\n{\n\tconst k3d::string_t module_name = g_user_interface_path.native_console_string();\n\tif(!g_user_interface_path.empty() && !k3d::filesystem::exists(g_user_interface_path))\n\t{\n\t\thandle_error(\"UI plugin module [\" + module_name + \"] does not exist\", Quit, Error);\n\t\treturn;\n\t}\n\tPlugins.load_module(g_user_interface_path, k3d::plugin_factory_collection::IGNORE_PROXIES);\n\n\tif(Plugins.factories().empty())\n\t{\n\t\thandle_error(\"UI plugin module [\" + module_name + \"] does not contain any K-3D plugins\", Quit, Error);\n\t\treturn;\n\t}\n\tif(Plugins.factories().size() > 1)\n\t{\n\t\thandle_error(\"UI plugin module [\" + module_name + \"] contains more than one K-3D plugin\", Quit, Error);\n\t\treturn;\n\t}\n\n\tg_user_interface = k3d::plugin::create<k3d::ievent_loop>(**Plugins.factories().begin());\n\tif(!g_user_interface)\n\t{\n\t\thandle_error(\"UI plugin module [\" + module_name + \"] does not contain a user interface plugin\", Quit, Error);\n\t\treturn;\n\t}\n\n\tif(!dynamic_cast<k3d::iuser_interface*>(g_user_interface))\n\t{\n\t\tdelete g_user_interface;\n\t\tg_user_interface = 0;\n\t\thandle_error(\"UI plugin module [\" + module_name + \"] does not implement k3d::iuser_interface\", Quit, Error);\n\t\treturn;\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_modules\n\n/// Loads (statically- or dynamically-linked) plugin modules\nvoid load_modules(k3d::plugin_factory_collection& Plugins, k3d::bool_t& Quit, k3d::bool_t& Error)\n{\n\tPlugins.load_modules(g_plugin_paths, true, k3d::plugin_factory_collection::LOAD_PROXIES);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// parse_runtime_arguments\n\n/// Handles any command-line options that run once startup is complete (e.g. running a script / tutorial)\nconst arguments_t parse_runtime_arguments(const arguments_t& Arguments, k3d::bool_t& Quit, k3d::bool_t& Error, k3d::iapplication& Application)\n{\n\t// Keep track of \"unused\" arguments ...\n\targuments_t unused;\n\n\t// Provide a single script context object that will be used by all scripts, so they can share state ...\n\tk3d::iscript_engine::context context;\n\n\t// For each command-line argument ...\n\tfor(arguments_t::const_iterator argument = Arguments.begin(); argument != Arguments.end(); ++argument)\n\t{\n\t\tif(argument->string_key == \"script\" || argument->string_key == \"script-file\")\n\t\t{\n\t\t\tk3d::bool_t recognized = false;\n\t\t\tk3d::bool_t executed = false;\n\t\t\tk3d::string_t script_name;\n\t\t\tk3d::script::code script_code(\"\");\n\n\t\t\tif(argument->string_key == \"script\")\n\t\t\t{\n\t\t\t\tscript_name = \"COMMANDLINE\";\n\t\t\t\tscript_code = k3d::script::code(argument->value[0]);\n\t\t\t}\n\t\t\telse if(argument->string_key == \"script-file\")\n\t\t\t{\n\t\t\t\tif(argument->value[0] == \"-\")\n\t\t\t\t{\n\t\t\t\t\tscript_name = \"STDIN\";\n\t\t\t\t\tscript_code = k3d::script::code(std::cin);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tscript_name = argument->value[0];\n\t\t\t\t\tconst k3d::filesystem::path script_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(script_name));\n\t\t\t\t\tif(!k3d::filesystem::exists(script_path))\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"Script [\" << script_name << \"] doesn't exist\" << std::endl;\n\t\t\t\t\t\tQuit = true;\n\t\t\t\t\t\tError = true;\n\t\t\t\t\t\treturn arguments_t();\n\t\t\t\t\t}\n\n\t\t\t\t\tk3d::log() << info << \"Running script [\" << script_name << \"]\" << std::endl;\n\t\t\t\t\tk3d::filesystem::igzstream script_stream(script_path);\n\t\t\t\t\tscript_code = k3d::script::code(script_stream);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tk3d::script::execute(script_code, script_name, context, recognized, executed);\n\n\t\t\tif(!recognized)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Couldn't recognize scripting language for script [ \" << script_name << \" ]\" << std::endl;\n\t\t\t\tQuit = true;\n\t\t\t\tError = true;\n\t\t\t\treturn arguments_t();\n\t\t\t}\n\n\t\t\tif(!executed)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Error executing script [ \" << script_name << \" ]\" << std::endl;\n\t\t\t\tQuit = true;\n\t\t\t\tError = true;\n\t\t\t\treturn arguments_t();\n\t\t\t}\n\t\t}\n\t\telse if(argument->string_key == \"list-gl-extensions\")\n\t\t{\n\t\t\tconst std::set<k3d::string_t> extensions = k3d::gl::extension::list();\n\t\t\tfor(std::set<k3d::string_t>::const_iterator extension = extensions.begin(); extension != extensions.end(); ++extension)\n\t\t\t\tstd::cout << *extension << \"\\n\";\n\n\t\t\tQuit = true;\n\t\t\treturn arguments_t();\n\t\t}\n\t\telse if(argument->string_key == \"exit\")\n\t\t{\n\t\t\tQuit = true;\n\t\t\treturn arguments_t();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tunused.push_back(*argument);\n\t\t}\n\t}\n\n\treturn unused;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// check_unused_arguments\n\n/// Handles any arguments that weren't recognized by either the application or the user interface plugin\nvoid check_unused_arguments(const arguments_t& Arguments, k3d::bool_t& Quit, k3d::bool_t& Error)\n{\n\t// If there aren't any leftover arguments, we're done ...\n\tif(Arguments.empty())\n\t\treturn;\n\n\tk3d::log() << warning << \"The following unknown command-line arguments will be ignored: \" << std::endl;\n\tfor(arguments_t::const_iterator argument = Arguments.begin(); argument != Arguments.end(); ++argument)\n\t    k3d::log() << warning << \"name: \" << argument->string_key << \" value: \" << argument->value[0] << std::endl;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// create_auto_start_plugins\n\ntypedef std::vector<k3d::iunknown*> auto_start_plugins_t;\n\nvoid create_auto_start_plugins(auto_start_plugins_t& Plugins)\n{\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup();\n\tfor(k3d::plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t{\n\t\tk3d::iplugin_factory::metadata_t metadata = (**factory).metadata();\n\n\t\tif(!metadata.count(\"k3d:application-start\"))\n\t\t\tcontinue;\n\n\t\tk3d::log() << info << \"Creating plugin [\" << (**factory).name() << \"] via k3d:application-start\" << std::endl;\n\n\t\tk3d::iunknown* const plugin = k3d::plugin::create(**factory);\n\t\tif(!plugin)\n\t\t{\n\t\t\tk3d::log() << error << \"Error creating plugin [\" << (**factory).name() << \"] via k3d:application-start\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\t\tPlugins.push_back(plugin);\n\n\t\tif(k3d::iscripted_action* const scripted_action = dynamic_cast<k3d::iscripted_action*>(plugin))\n\t\t{\n\t\t\tk3d::iscript_engine::context context;\n\t\t\tcontext[\"command\"] = k3d::string_t(\"startup\");\n\t\t\tscripted_action->execute(context);\n\t\t}\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// delete_auto_start_plugins\n\nvoid delete_auto_start_plugins(auto_start_plugins_t& Plugins)\n{\n\tfor(auto_start_plugins_t::iterator plugin = Plugins.begin(); plugin != Plugins.end(); ++plugin)\n\t{\n\t\tif(k3d::iscripted_action* const scripted_action = dynamic_cast<k3d::iscripted_action*>(*plugin))\n\t\t{\n\t\t\tk3d::iscript_engine::context context;\n\t\t\tcontext[\"command\"] = k3d::string_t(\"shutdown\");\n\t\t\tscripted_action->execute(context);\n\t\t}\n\t}\n\n\tfor(auto_start_plugins_t::iterator plugin = Plugins.begin(); plugin != Plugins.end(); ++plugin)\n\t\tdelete *plugin;\n\n\tPlugins.clear();\n}\n\n} // namespace\n\nint k3d_main(std::vector<k3d::string_t> raw_arguments)\n{\n\t// Append extra options from the environment ...\n\tstd::istringstream buffer(k3d::system::getenv(\"K3D_EXTRA_OPTIONS\"));\n\tstd::copy(std::istream_iterator<k3d::string_t>(buffer), std::istream_iterator<k3d::string_t>(), std::back_inserter(raw_arguments));\n\n\ttry\n\t{\n\t\tk3d::bool_t quit = false;\n\t\tk3d::bool_t error = false;\n\n\t\t// Set default values for all user-configurable options ...\n\t\tset_default_options(quit, error);\n\t\tif(quit)\n\t\t\treturn error ? 1 : 0;\n\n\t\t// Parse command-line options ...\n\t\tboost::program_options::options_description description(\"K-3D options\");\n\t\tdescription.add_options()\n\t\t\t(\"add-path\", boost::program_options::value<k3d::string_t>(), \"Prepend a path to the PATH environment variable at runtime.\")\n\t\t\t(\"batch\", \"Enable batch (no user intervention) mode.\")\n\t\t\t(\"color\", \"Color-code log messages based on their level.\")\n\t\t\t(\"disable-gl-extension\", boost::program_options::value<k3d::string_t>(), \"Disables the given OpenGL extension.\")\n\t\t\t(\"enable-gl-extension\", boost::program_options::value<k3d::string_t>(), \"Enables the given OpenGL extension.\")\n\t\t\t(\"exit\", \"Exits the program (useful after running scripts in batch mode.\")\n\t\t\t(\"help,h\", \"Prints this help message and exits.\")\n\t\t\t(\"list-gl-extensions\", \"List available OpenGL extensions and exit.\")\n#ifdef K3D_ENABLE_NLS\n\t\t\t(\"locale\", boost::program_options::value<k3d::string_t>(), \"Overrides the path for loading locales\")\n#endif // K3D_ENABLE_NLS\n\t\t\t(\"log-level\", boost::program_options::value<k3d::string_t>(), \"Specifies the minimum message priority to log - valid values are \\\"warning\\\", \\\"information\\\", \\\"debug\\\" [default: warning].\")\n\t\t\t(\"no-color\", \"Disable color-coding of log messages based on their level.\")\n\t\t\t(\"options\", boost::program_options::value<k3d::string_t>(), \"Overrides the filepath for storing user options [default: /home/tshead/.k3d/options.k3d].\")\n\t\t\t(\"plugins\", boost::program_options::value<k3d::string_t>(), \"Overrides the path(s) for loading plugin libraries [default: /usr/local/k3d/lib/k3d].\")\n\t\t\t(\"script,e\", boost::program_options::value<k3d::string_t>(), \"Executes the given script text after startup.\")\n\t\t\t(\"script-file,f\", boost::program_options::value<k3d::string_t>(), \"Executes the given script file after startup (use - for stdin).\")\n\t\t\t(\"setenv\", boost::program_options::value<k3d::string_t>(), \"Set an environment variable using name=value syntax.\")\n\t\t\t(\"shadercache\", boost::program_options::value<k3d::string_t>(), \"Overrides the path for storing compiled shaders [default: /home/tshead/.k3d/shadercache].\")\n\t\t\t(\"share\", boost::program_options::value<k3d::string_t>(), \"Overrides the path for loading shared data files [default: /usr/local/k3d/share/k3d].\")\n\t\t\t(\"show-process\", \"Prints the process name next to log messages.\")\n\t\t\t(\"show-timestamps\", \"Prints timestamps next to log messages.\")\n\t\t\t(\"syslog\", \"Logs messages to syslog.\")\n\t\t\t(\"ui,u\", boost::program_options::value<k3d::string_t>(), \"Specifies the user interface plugin to use - valid values are a plugin path, \\\"nui\\\", \\\"ngui\\\", \\\"qtui\\\", or \\\"pyui\\\" [default: qtui].\")\n\t\t\t(\"user-interface-help,H\", \"Prints user interface help message and exits.\")\n\t\t\t(\"version\", \"Prints program version information and exits.\")\n\t\t\t;\n\n\t\targuments_t arguments = boost::program_options::command_line_parser(raw_arguments)\n\t\t\t.options(description)\n\t\t\t.allow_unregistered()\n\t\t\t.style(\n\t\t\t\tboost::program_options::command_line_style::allow_long\n\t\t\t\t| boost::program_options::command_line_style::allow_short\n\t\t\t\t| boost::program_options::command_line_style::allow_dash_for_short\n\t\t\t\t| boost::program_options::command_line_style::long_allow_adjacent\n\t\t\t\t| boost::program_options::command_line_style::long_allow_next\n\t\t\t\t| boost::program_options::command_line_style::short_allow_adjacent\n\t\t\t\t| boost::program_options::command_line_style::short_allow_next\n\t\t\t\t)\n\t\t\t.run()\n\t\t\t.options;\n\n\t\t// Handle arguments that cause an immediate exit ...\n\t\tfor(arguments_t::const_iterator argument = arguments.begin(); argument != arguments.end(); ++argument)\n\t\t{\n\t\t\tif(argument->string_key == \"help\")\n\t\t\t{\n\t\t\t\tstd::cout << description << \"\\n\";\n\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if(argument->string_key == \"version\")\n\t\t\t{\n\t\t\t\tstd::cout << \"K-3D Version \" << K3D_VERSION << \"\\n\";\n\t\t\t\tstd::cout << K3D_COPYRIGHT << \"  See the AUTHORS file for contributors.\\n\";\n\t\t\t\tstd::cout << \"Licensed under the GNU General Public License.  See the COPYING file for details.\\n\";\n\t\t\t\tstd::cout << \"K-3D home page: http://k3d.sourceforge.net\\n\";\n\t\t\t\tstd::cout << \"Bug reports to: tshead@k-3d.com\\n\";\n\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\t// Setup our logging options before going any further ...\n\t\targuments = parse_log_arguments(arguments, quit, error);\n\t\tif(quit)\n\t\t\treturn error ? 1 : 0;\n\n\t\t// Look for command-line options that will configure our subsequent behavior ...\n\t\targuments = parse_startup_arguments(arguments, quit, error);\n\t\tif(quit)\n\t\t\treturn error ? 1 : 0;\n\n\t\t// Make sure we have all resources required to run ...\n\t\tcheck_dependencies(quit, error);\n\t\tif(quit)\n\t\t\treturn error ? 1 : 0;\n\n\t\t// Initialize parallel processing ...\n\t\tk3d::parallel::set_thread_count(k3d::parallel::automatic);\n\n\t\t// Set the shader cache path ...\n\t\tk3d::set_shader_cache_path(g_shader_cache_path);\n\n\t\t// Set the share path ...\n\t\tk3d::set_share_path(g_share_path);\n\n#ifdef K3D_ENABLE_NLS\n\t\tk3d::filesystem::path locale_path = g_share_path / k3d::filesystem::generic_path(\"locale\");\n\t\tif(!g_override_locale_path.empty())\n\t\t\tlocale_path = g_override_locale_path;\n\n\t\tk3d::log() << info << \"locale path: \" << locale_path.native_console_string() << std::endl;\n\n\t\tsetlocale(LC_ALL, \"\");\n\t\tbindtextdomain(\"k3d\", locale_path.native_filesystem_string().c_str());\n\t\tbind_textdomain_codeset(\"k3d\", \"UTF-8\");\n\t\ttextdomain(\"k3d\");\n#endif // K3D_ENABLE_NLS\n\n\t\t// Load user options ...\n\t\tk3d::options::file_storage user_options(g_options_path);\n\t\tk3d::options::set_storage(user_options);\n\n\t\t// Handle creation of the required user interface plugin ...\n\t\tk3d::plugin_factory_collection ui_plugins;\n\t\tui_plugins.connect_message_signal(sigc::ptr_fun(startup_message_handler));\n\t\tcreate_user_interface(ui_plugins, quit, error);\n\t\tif(quit)\n\t\t\treturn error ? 1 : 0;\n\t\treturn_val_if_fail(g_user_interface, 1);\n\n\t\t// Handle more arguments that may cause our immediate exit ...\n\t\tfor(arguments_t::const_iterator argument = arguments.begin(); argument != arguments.end(); ++argument)\n\t\t{\n\t\t\tif(argument->string_key == \"user-interface-help\")\n\t\t\t{\n\t\t\t\tboost::program_options::options_description description(\"User interface options\");\n\t\t\t\tg_user_interface->get_command_line_arguments(description);\n\t\t\t\tstd::cout << description << \"\\n\";\n\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\t// Register our user interface ...\n\t\tk3d::set_user_interface(*dynamic_cast<k3d::iuser_interface*>(g_user_interface));\n\n\t\t// Ensure the user interface gets cleaned-up ...\n\t\tboost::scoped_ptr<k3d::ievent_loop> ui_cleanup(g_user_interface);\n\n\t\t// Give the UI a chance to handle command-line arguments ...\n\t\targuments = g_user_interface->parse_startup_arguments(arguments, quit, error);\n\t\tif(quit)\n\t\t\treturn error ? 1 : 0;\n\n\t\t// Load plugins ...\n\t\tk3d::plugin_factory_collection plugins;\n\t\tplugins.connect_message_signal(sigc::ptr_fun(startup_message_handler));\n\t\tload_modules(plugins, quit, error);\n\t\tif(quit)\n\t\t\treturn error ? 1 : 0;\n\n\t\t// Setup a render farm ...\n\t\tk3d::network_render_farm render_farm(g_options_path);\n\t\tk3d::set_network_render_farm(render_farm);\n\n\t\t// Register plugins ...\n\t\tk3d::register_plugin_factories(plugins);\n\n\t\t// Create the main application object ...\n\t\tk3d::application_implementation application;\n\n\t\t// We want to be notified when the user requests a shutdown ...\n\t\tapplication.connect_exit_signal(sigc::ptr_fun(exit_request_handler));\n\n\t\t// Register it with the library as the global application object ...\n\t\tk3d::register_application(application.interface());\n\n\t\t// Switch the UI to its \"normal\" (post-startup) layout ...\n\t\tstartup_message_handler(_(\"Starting user interface\"));\n\t\tg_user_interface->display_user_interface();\n\n\t\t// Instantiate \"auto-start\" plugins ...\n\t\tauto_start_plugins_t auto_start_plugins;\n\t\tcreate_auto_start_plugins(auto_start_plugins);\n\n\t\t// Let the UI parse arguments now that startup is complete ...\n\t\targuments = g_user_interface->parse_runtime_arguments(arguments, quit, error);\n\t\tif(quit)\n\t\t\treturn error ? 1 : 0;\n\n\t        // Parse any remaining arguments now that startup is complete ...\n\t\targuments = parse_runtime_arguments(arguments, quit, error, application.interface());\n\t\tif(quit)\n\t\t\treturn error ? 1 : 0;\n\n\t\t// Check for \"unused\" command-line arguments ...\n\t\tcheck_unused_arguments(arguments, quit, error);\n\t\tif(quit)\n\t\t\treturn error ? 1 : 0;\n\n\t\t// Main UI event-loop ...\n\t\tg_user_interface->start_event_loop();\n\n\t\t// Cleanup \"auto-start\" plugins ...\n\t\tdelete_auto_start_plugins(auto_start_plugins);\n\n\t\t//g_user_interface.reset();\n\n\t\treturn 0;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tk3d::string_t message = \"Caught exception [\";\n\t\t\tmessage += k3d::demangle(typeid(e));\n\t\t\tmessage += \"] - \";\n\t\t\tmessage += e.what();\n\n\t\tk3d::log() << critical << message << std::endl;\n\n#ifdef K3D_API_WIN32\n\t\tMessageBox(0, message.c_str(), _(\"K-3D Fatal Error\"), MB_OK | MB_ICONSTOP);\n#endif // K3D_API_WIN32\n\n\t\treturn 1;\n\t}\n\tcatch(...)\n\t{\n\t\tconst k3d::string_t message = \"Caught unknown exception.\";\n\n\t\tk3d::log() << critical << message << std::endl;\n\n#ifdef K3D_API_WIN32\n\t\tMessageBox(0, message.c_str(), _(\"K-3D Fatal Error\"), MB_OK | MB_ICONSTOP);\n#endif // K3D_API_WIN32\n\n\t\treturn 1;\n\t}\n}\n\n"
  },
  {
    "path": "application/k3d_main.h",
    "content": "#ifndef APPLICATION_K3D_MAIN_H\n#define APPLICATION_K3D_MAIN_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n#include <vector>\n\n/// Main entry-point for the application ... callers should pass all command-line arguments *except for* the program name (i.e. argv[0])\nint k3d_main(std::vector<k3d::string_t> arguments);\n\n#endif // !APPLICATION_K3D_MAIN_H\n\n"
  },
  {
    "path": "application/main.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"k3d_main.h\"\n#include <k3dsdk/system.h>\n\nint main(int argc, char* argv[])\n{\n\tk3d::system::initialize_executable_path(argc, argv);\n\n\tstd::vector<k3d::string_t> arguments(argv, argv + argc);\n\tif(arguments.size())\n\t\targuments.erase(arguments.begin());\n\n\treturn k3d_main(arguments);\n}\n\n"
  },
  {
    "path": "application/winmain.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"k3d_main.h\"\n\n#include <k3dsdk/system.h>\n#include <k3dsdk/win32.h>\n\nint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)\n{\n\tk3d::system::initialize_executable_path(__argc, __argv);\n\n\tstd::vector<k3d::string_t> arguments(__argv, __argv + __argc);\n\tif(arguments.size())\n\t\targuments.erase(arguments.begin());\n\n\treturn k3d_main(arguments);\n}\n\n"
  },
  {
    "path": "bugs/CMakeLists.txt",
    "content": "PROJECT(ditz)\n\nFIND_PROGRAM(DITZ_EXECUTABLE ditz)\n\nADD_CUSTOM_TARGET(bugs-html\n\tWORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\"\n\tCOMMAND ${DITZ_EXECUTABLE} html \"${CMAKE_CURRENT_BINARY_DIR}/html\"\n\t)\n"
  },
  {
    "path": "bugs/issue-000e833956e3ebedbddc7a8f239368296cef05cf.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Remove legacy code from CollapseEdges.\ndesc: Like it says.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-12-29 03:13:38.485549 Z\nreferences: []\n\nid: 000e833956e3ebedbddc7a8f239368296cef05cf\nlog_events: \n- - 2009-12-29 03:13:39.029483 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-01 02:50:23.773581 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - edited title\n  - \"\"\n- - 2010-01-10 20:14:22.182315 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-01d720a02d5558508a3b56a7ad0e603d0b8e57f7.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" Bug while moving vertices, edges and faces on a tutorial\"\ndesc: \"Resuming:\\n\\\n  1-Start recording a tutorial\\n\\\n  2-Select a face/edge/vertex\\n\\\n  3-Move it\\n\\\n  4-Without changing the move tool select and move another face/edge/vertex\\n\\\n  5-Play the script\\n\\n\\\n  I attach a k3dscript file for reproducing the bug.\\n\\\n  It throws on the terminal (in 0.6.7 and 0.7.0)\\n\\\n  WARNING: Selection contained records without nodes\\n\\\n  ERROR Command node [move_tool] unhandled command: [lmb_click_replace]\\n\\\n  [<arguments><viewport>/document/window/viewport</viewport><mouse>0.418126\\n\\\n  0.638689</mouse></arguments>]\\n\\n\\\n  This script was recorded on k3d 0.6.7 and when played on 0.7 it selects a\\n\\\n  different face. Seems like coordinates are upside down. I'll will submit\\n\\\n  another bug report on this subject.\\n\\n\\\n  Thanks for merging the mug script!\\n\\n\\\n  Cheers,\\n\\\n  Joaqu\\xC3\\xADn.\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-19 03:46:01.911919 Z\nreferences: []\n\nid: 01d720a02d5558508a3b56a7ad0e603d0b8e57f7\nlog_events: \n- - 2009-05-19 03:46:02.495726 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:03:39.979069 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:06:42.765331 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-028d81eef227a051d03293c46b451db439f0c460.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5 Black screen on the work area\ndesc: |-\n  Contact: hiper_army@hotmail.com\n  Summary: Black screen on the work area\n  Report Generated: 2008-Mar-07 21:25:28 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.1.3 20070831 (prerelease) (Ubuntu 4.1.2-16ubuntu1)\n  Build Time: Sep 13 2007 03:47:14 local\n  Description of problem:\n  i have a black screen on the place ho i put 3d object\n  Steps to reproduce problem:\n  \n  1. just simply open K-3D\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  ALAWS wen i open it\n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:32:48.800093 Z\nreferences: []\n\nid: 028d81eef227a051d03293c46b451db439f0c460\nlog_events: \n- - 2009-05-19 03:32:49.536497 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:23.503077 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:42:08.446849 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-02e36eaa0b39160335d6eb8d576d75c56577c5f7.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: NURBS OpenGL rendering weird on OSX\ndesc: On OSX, NURBS patches have strange render artifacts, as if normals are flipped or something.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-08-03 14:54:17.959519 Z\nreferences: []\n\nid: 02e36eaa0b39160335d6eb8d576d75c56577c5f7\nlog_events: \n- - 2009-08-03 14:54:19.159406 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-12-26 17:18:11.644487 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-067c122609d0478c12319a8cfebda9c4f290bc78.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Path User Properties are not well serialized\ndesc: |-\n  Inspecting the file, they are serialized\n  <property name=\"test\" reference=\"relative\" relative_path=\"\"/>\n  This xml above won't load any property\n  \n  If I edit it it will load well\n  <property name=\"test\" reference=\"relative\" relative_path=\"\"\n  type=\"k3d::filesystem::path\" user_property=\"generic\"/>\n  \n  Cheers!\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-06 04:10:14.184556 Z\nreferences: []\n\nid: 067c122609d0478c12319a8cfebda9c4f290bc78\nlog_events: \n- - 2009-05-06 04:10:15.376459 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:07.015080 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-21 05:47:33.209467 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-0ca786b59608c113bdb0a99f16c1e0e8e0076d8f.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"5 Cannot correctly Undo a \\\"Delete All\\\" from a script \"\ndesc: \"1-Run the following code on the script editor\\n\\n\\\n  #python\\n\\n\\\n  import k3d\\n\\\n  doc = Document\\n\\\n  doc.start_change_set()\\n\\\n  for i in doc.nodes():\\n\\\n  doc.delete_node(i)\\n\\\n  doc.finish_change_set(\\\"Delete All\\\")\\n\\n\\\n  2- Undo the script\\n\\\n  3- The viewport stays grayed\\n\\\n  Users need to change the viewport to another panel then back to viewport\\n\\n\\\n  not a big deal :D\\n\\n\\\n  Saludos!\\n\\\n  Joaqu\\xC3\\xADn\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:39:30.848536 Z\nreferences: []\n\nid: 0ca786b59608c113bdb0a99f16c1e0e8e0076d8f\nlog_events: \n- - 2009-05-19 03:39:31.639851 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:53:28.335169 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-21 05:49:42.137469 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-0f0dc8929f4bd8dd646aedbab164defb8b01ba68.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Closing main window during tutorial playback causes errors\ndesc: |-\n  Contact: hendra_uzia@yahoo.com\n  Summary: Errored Mouse after Tutorial\n  Report Generated: 2007-Mar-12 03:15:06 UTC\n  Package: k3d\n  Version: 0.6.6.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 6 2007 13:08:21 local\n  Description of problem:\n  When I Finished my Tutorial, but unfortunately, I don't realy finished it\n  yet by closing the tutorial panel, my mouse becomes errored and and cannot\n  be controled.\n  Even if I Force to end task, it ends in minutes, not in an immediate\n  seconds.\n  \n  Steps to reproduce problem:\n  I Use Windows XP\n  1. Start tutorial\n  2. When it finished (the mouse is moving to the help button), press\n  [Alt]+[F4], so the tutorial window will clossed\n  3. Switch to other apps.\n  4. Bingo, The mouse cannot be controled anymore.\n  \n  Expected results:\n  Non errored mouse after unfinished tutorial.\n  \n  Actual results:\n  \n  How often does this happen?\n  This is my first error.\n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-19 03:48:51.360421 Z\nreferences: []\n\nid: 0f0dc8929f4bd8dd646aedbab164defb8b01ba68\nlog_events: \n- - 2009-05-19 03:48:51.983381 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:03:48.675051 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:06:46.355156 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-0f2e779987beba2c16355000e49002e668efe3cd.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Provide manual creation of points.\ndesc: Like it says ... this is a very common request.\ntype: :feature\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-12-19 02:20:11.452512 Z\nreferences: []\n\nid: 0f2e779987beba2c16355000e49002e668efe3cd\nlog_events: \n- - 2009-12-19 02:20:12.541491 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-12ac6cbd6ff111c686796d107c8a9b8338158e8f.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"hings keep freezing and images stay up even after they've been exited out of \"\ndesc: |-\n  Contact: Junin_Ninja@yahoo.com\n  Summary: Things keep freezing and images stay up even after they've been\n  exited out of\n  Report Generated: 2009-Jan-25 01:52:18 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem: Whenever I start up the program it shows a block of\n  my desktop picture. Also after tutorial windows are exited out of the image\n  still remains.\n  \n  Steps to reproduce problem:open program\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-06 04:04:37.984268 Z\nreferences: []\n\nid: 12ac6cbd6ff111c686796d107c8a9b8338158e8f\nlog_events: \n- - 2009-05-06 04:04:38.847914 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:03.279071 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:48:25.623078 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This may be a duplicate of {issue da8965ea23097589e5b98a3b8c42580329dad12c}.\n"
  },
  {
    "path": "bugs/issue-13cd1ca286fd727add47164d6b9829a864732688.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Support display of non-SI units of measure.\ndesc: K-3D uses SI units internally for all data storage.  The UI supports automatic conversion from other units to SI, but there is no provision currently to display alternate units.  It should be possible to set global user preferences for display units, as-well-as changing preferences on a control-by-control basis.  Similarly, it should be possible to specify the number of digits to display.\ntype: :feature\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-11-14 23:18:23.284634 Z\nreferences: []\n\nid: 13cd1ca286fd727add47164d6b9829a864732688\nlog_events: \n- - 2009-11-14 23:18:24.252580 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-11-21 05:08:42.265667 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-1478f28b825b4003e89e19fd6627210de42670f1.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Fix MergeCoplanarFaces.\ndesc: Need to update MergeCoplanarFaces to match changes to the polyhedron schema for shells.\ntype: :task\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-01-01 03:16:51.261549 Z\nreferences: []\n\nid: 1478f28b825b4003e89e19fd6627210de42670f1\nlog_events: \n- - 2010-01-01 03:16:51.966218 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-17 16:54:24.893287 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n- - 2010-02-21 06:13:49.194877 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-162c9fd22b62e2228b4963639d7cd652b4af2e5d.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Polygon meshes and NURBS meshes don't snap when translated.\ndesc: |-\n  Polygon meshes and NURBS meshes don't snap when translated. That's pretty\n  much all I need to say, I believe.\n  \n  -leiget\n  leiget at gmail\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-06 04:06:43.128689 Z\nreferences: []\n\nid: 162c9fd22b62e2228b4963639d7cd652b4af2e5d\nlog_events: \n- - 2009-05-06 04:06:44.424268 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:04.559088 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:23:56.838746 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-164f2e0cd8b280e764bc49d2f1db806e4fef7fa3.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Create a test to ensure that const_cast isn't abused.\ndesc: \"\"\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-07-19 20:53:20.743085 Z\nreferences: []\n\nid: 164f2e0cd8b280e764bc49d2f1db806e4fef7fa3\nlog_events: \n- - 2009-07-19 20:53:22.023030 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-19 21:23:29.542665 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-1787ece116f7300528f97ab0a9eb6c128a4ae826.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"Wiever doesn't show block being still, when moved it diplays. What's wrong? drivers are from ati \"\ndesc: |-\n  Contact: etteeeee@hotmail.com\n  Summary: Wiever doesn't show block being still, when moved it diplays.\n  What's wrong? drivers are from ati\n  Report Generated: 2008-Jul-22 13:47:31 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.2.3 (Ubuntu 4.2.3-2ubuntu1)\n  Build Time: Feb 27 2008 23:29:50 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-07 04:13:46.669585 Z\nreferences: []\n\nid: 1787ece116f7300528f97ab0a9eb6c128a4ae826\nlog_events: \n- - 2009-05-07 04:13:47.533432 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:12.839075 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:56:19.950674 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This may be a duplicate of {issue deed7f51f539b6c62b97c585ed7453b3242c9992}.\n"
  },
  {
    "path": "bugs/issue-1850897e4259a756faf449a72ea07ac863d83cd0.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5 shifted gizmo\ndesc: |-\n  I created 3x3 cube, turned it to SDS, then selected a face; the\n  transform/rotate/etc. gizmo is shifted, there is offset between the\n  selected face and the gizmo. (See screenshots.)\n  \n  [K-3D .7.3 on Vista 64b, K-3D started with desktop composition disabled]\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:26:56.312764 Z\nreferences: []\n\nid: 1850897e4259a756faf449a72ea07ac863d83cd0\nlog_events: \n- - 2009-05-19 03:26:57.120619 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:18.999069 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-10-19 05:05:17.831079 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - This is expected behavior - the transform tools are transforming the SDS mesh, not the limit surface.\n"
  },
  {
    "path": "bugs/issue-1ae2d51bee03627b3d7136008951efc67ab7766e.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: GUI widgets to help users know direction and orientation of lights.\ndesc: |-\n  All lights that are directional, including those with maps need a\n  visual clue in the 3D view-port as to their orientation, even if it is\n  fixed. Mapping an environment light's EXR file to the back of the\n  veiw-port would be ideal, but in truth a luxury. All that is needed a\n  simple arrow or other way of showing where the map's 0,0 point is and\n  it's orientation.\ntype: :feature\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-06-27 15:33:51.240727 Z\nreferences: []\n\nid: 1ae2d51bee03627b3d7136008951efc67ab7766e\nlog_events: \n- - 2009-06-27 15:33:52.232586 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:46:56.006937 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from unassigned\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-1af4c139c1c4fe06ca2e3fbe31f1237cf963a20e.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: program freezing\ndesc: |-\n  Contact: db_silvis@yahoo.com\n  Summary: program freezing\n  Report Generated: 2008-Oct-21 22:42:24 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.as soon as I start the program\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-07 04:04:40.125460 Z\nreferences: []\n\nid: 1af4c139c1c4fe06ca2e3fbe31f1237cf963a20e\nlog_events: \n- - 2009-05-07 04:04:42.333757 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:08.382631 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:29:59.534875 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-1e7b3a952423fcf332c8f369ee0646873cafb877.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"Python Script: bug on Document.delete_node()\"\ndesc: \"Steps:\\n\\n\\\n  1- Select a node (A) property on connect it to another's node property\\n\\\n  (B).\\n\\\n  2- Delete node B from the python engine.\\n\\\n  3- Node A property is still connected to node B property although B doesn't\\n\\\n  exist anymore.\\n\\n\\\n  I attach an example file.\\n\\\n  1- Open test_doc.k3d\\n\\\n  2- select polycube instance (the cube on the right)\\n\\\n  3- run the delete_selected_instance.py\\n\\n\\\n  Go and see the input_mesh property of MeshInstance node.\\n\\\n  It can't be disconnected unless you connect it first to other node.\\n\\n\\\n  Cheers!\\n\\\n  Joaqu\\xC3\\xADn\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:40:06.207476 Z\nreferences: []\n\nid: 1e7b3a952423fcf332c8f369ee0646873cafb877\nlog_events: \n- - 2009-05-19 03:40:06.904099 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:50:30.231031 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-21 05:49:56.041474 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n- - 2010-05-22 00:36:19.846768 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.1.0 from 1.0.0.0\n  - \"\"\n- - 2010-05-22 00:44:32.070902 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - edited title\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-1f0827906ae4174800898596b0c8e4c623425ebd.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" k3d 0.7.8 does not build in x86_64 arch\"\ndesc: |-\n  In file included from\n  /home/mandrake/rpm/BUILD/k3d-source-0.7.8.0/modules/nurbs/nurbs_curve_modif\n  ier.h:48,\n  from\n  /home/mandrake/rpm/BUILD/k3d-source-0.7.8.0/modules/nurbs/insert_knot.cpp:4\n  4:\n  /home/mandrake/rpm/BUILD/k3d-source-0.7.8.0/modules/nurbs/nurbs_patch_modif\n  ier.h:56: warning: 'typedef' was ignored in this declaration\n  /home/mandrake/rpm/BUILD/k3d-source-0.7.8.0/modules/nurbs/nurbs_patch_modif\n  ier.h:66: warning: 'typedef' was ignored in this declaration\n  /home/mandrake/rpm/BUILD/k3d-source-0.7.8.0/modules/nurbs/insert_knot.cpp:\n  In member function 'virtual void\n  module::nurbs::insert_knot::on_update_mesh(const k3d::mesh&, k3d::mesh&)':\n  /home/mandrake/rpm/BUILD/k3d-source-0.7.8.0/modules/nurbs/insert_knot.cpp:9\n  8: error: no matching function for call to\n  'module::nurbs::nurbs_curve_modifier::knot_vector_adaption(std::vector<unsi\n  gned int, std::allocator<unsigned int> >&)'\n  /home/mandrake/rpm/BUILD/k3d-source-0.7.8.0/modules/nurbs/nurbs_curve_modif\n  ier.h:166: note: candidates are: void\n  module::nurbs::nurbs_curve_modifier::knot_vector_adaption(std::vector<long\n  unsigned int, std::allocator<long unsigned inunsignedke[2]: unsigned int, std::allocator<long unsigned inunsignedke[2]: unsigned int,  could be found at attachment.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-07 04:10:55.493673 Z\nreferences: []\n\nid: 1f0827906ae4174800898596b0c8e4c623425ebd\nlog_events: \n- - 2009-05-07 04:10:57.069963 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:11.975067 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:58:53.103151 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Should be fixed in mercurial.\n"
  },
  {
    "path": "bugs/issue-20324fd0e902a7a6bdb85dbf5f2ae4ce8180a61a.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Fix CatmullClark implementation.\ndesc: Need to update the CatmullClark implementation to handle changes to the polyhedron schema for shells.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-01-01 03:13:49.689458 Z\nreferences: []\n\nid: 20324fd0e902a7a6bdb85dbf5f2ae4ce8180a61a\nlog_events: \n- - 2010-01-01 03:13:50.285467 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-19 03:50:27.733213 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-20c18a2b4fe16b8e1a3982d83be136220b4cf863.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Restore robust picking.\ndesc: Robust primitive picking by looking at nearby components was commented-out during the transition to generic primitives / selections.  Restore it.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-21 05:52:31.977624 Z\nreferences: []\n\nid: 20c18a2b4fe16b8e1a3982d83be136220b4cf863\nlog_events: \n- - 2009-08-21 05:52:32.593544 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-27 03:43:59.461666 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-250f99eac16ec2eda3d6b7e324592efc46a1e250.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Duplicated / instantiated objects aren't visible when rendered.\ndesc: This is an error-of-omission, the duplicate / instantiate UI code needs to make the new objects visible to render engines.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-01-09 17:21:52.037546 Z\nreferences: []\n\nid: 250f99eac16ec2eda3d6b7e324592efc46a1e250\nlog_events: \n- - 2010-01-09 17:21:52.725491 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-12 06:51:38.878192 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-25c0b2699b08309f7452d4d7390d05a3fa78bf57.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Harmless warning messages when ATK is disabled.\ndesc: |-\n  At startup, ATK code emits warning messages if the user hasn't enabled accessibility.  Typically (but not exclusively), this is done by checking \"Enable assistive technologies\" in the Gnome Assistive Technologies Preferences control center applet.\n  \n  Ideally, we should try to disable, prevent, or hide these warnings, since they generate support requests.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-02-03 01:58:46.629278 Z\nreferences: []\n\nid: 25c0b2699b08309f7452d4d7390d05a3fa78bf57\nlog_events: \n- - 2010-02-03 01:58:47.589285 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-06 06:04:53.400647 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Forcing GTK to load atk-bridge at startup when the user didn't have accessibility turned-on for their desktop caused these warning messages.  We dont' actually need atk-bridge, since we call ATK interfaces directly in-process.  So turning this off fixes everything.\nclaimer: \n"
  },
  {
    "path": "bugs/issue-26470a23cd083556484c98f6120b5f33661775c6.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Remove legacy code from BevelFaces.\ndesc: Like it says.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-12-29 03:15:26.813547 Z\nreferences: []\n\nid: 26470a23cd083556484c98f6120b5f33661775c6\nlog_events: \n- - 2009-12-29 03:15:27.445492 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-15 06:13:06.225749 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-28d83330170a35565ca1ada32317f34b2daf37a2.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: when doing \"unparent\", the software crashes.\ndesc: |-\n  Contact: ingirafn@this.is\n  Summary: when doing \"unparent\", the software crashes.\n  Report Generated: 2009-Mar-29 22:47:16 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.3.1\n  Build Time: Jun 22 2008 18:41:27 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  everytime\n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-06 03:55:34.072363 Z\nreferences: []\n\nid: 28d83330170a35565ca1ada32317f34b2daf37a2\nlog_events: \n- - 2009-05-06 03:55:36.184301 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:07:14.907209 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:18:54.550887 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Already fixed.\n"
  },
  {
    "path": "bugs/issue-28e8b98350d458dfe53427f2497401663b0dc97a.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: the K-3D wont start\ndesc: |-\n  Contact: colonization1@yahoo.com\n  Summary: the K-3D wont start\n  Report Generated: 2008-Sep-01 07:13:28 UTC\n  Package: k3d\n  Version: 0.7.9.0\n  Platform: Windows-5.1;x86\n  Compiler: 3.4.5 (mingw special)\n  Build Time: Aug 13 2008 17:13:57 local\n  Description of problem:it wont start\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-07 04:07:15.781672 Z\nreferences: []\n\nid: 28e8b98350d458dfe53427f2497401663b0dc97a\nlog_events: \n- - 2009-05-07 04:07:17.245500 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:09.815133 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:33:17.679161 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-2c158e15ef869a5b8ec01db38e4ed19a507b0bc2.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Tried to render\ndesc: |-\n  Contact: jfmotion@gmail.com\n  Summary: Tried to render\n  Report Generated: 2007-Jul-25 07:03:36 UTC\n  Package: k3d\n  Version: 0.6.6.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.1.2 20070106 (prerelease) (Ubuntu 4.1.1-21ubuntu7)\n  Build Time: Jan 16 2007 15:55:06 local\n  Description of problem:\n  Without it, RIB files cannot be rendered. Check to ensure that you have\n  Aqsis installed, and that the PATH envrionment variable points to the Aqsis\n  binary installation directory.\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:44:08.808584 Z\nreferences: []\n\nid: 2c158e15ef869a5b8ec01db38e4ed19a507b0bc2\nlog_events: \n- - 2009-05-19 03:44:09.503967 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:49:43.231031 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:18:04.038993 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - The OP is describing expected behavior.  The real solution is to ensure that downstream distributors setup appropriate render engine support.\n"
  },
  {
    "path": "bugs/issue-2c5ca49215d98ef29255e323180b3715cee1b1c1.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: By default, automatically select both half-edges in the UI layer.\ndesc: Like it says.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-09-02 04:39:47.798984 Z\nreferences: []\n\nid: 2c5ca49215d98ef29255e323180b3715cee1b1c1\nlog_events: \n- - 2009-09-02 04:39:48.518792 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-07 17:48:33.240632 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-2e6128ca3bb63de99d369f1ae2f4f457cf7a1470.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: viewport doesn't work\ndesc: |-\n  Contact: 4d3l.jarrah@gmail.com\n  Summary: viewport doesn't work\n  Report Generated: 2009-Apr-07 22:33:06 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.2.3 (Ubuntu 4.2.3-2ubuntu1)\n  Build Time: Feb 27 2008 23:29:50 local\n  Description of problem:\n  When i chose the viewport tab from any window the viewport keeps on\n  disappearing\n  giving me a blank screen, i can only see the objects when i move the\n  objects\n  Steps to reproduce problem:\n  At startup always.\n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  Since i first installed k-3d til now\n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-06 03:53:31.136389 Z\nreferences: []\n\nid: 2e6128ca3bb63de99d369f1ae2f4f457cf7a1470\nlog_events: \n- - 2009-05-06 03:53:33.160309 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-22 02:50:05.268385 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:13:03.198817 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Works for me on Ubuntu 8.10, 9.04 with nvidia graphics cards.\n"
  },
  {
    "path": "bugs/issue-3074be871fbce4de2da49a1abc0432d8e49e30c1.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Complete LuxRender material set.\ndesc: |-\n  With materials the the missing part is texture input not a color,\n  treat color as a 1x1 map of a given color, all the attributes of\n  textures need map input to allow for realism and also to simulate\n  things such as mesh http://images.google.com.au/images?q=architectural\n  mesh and fritted glass\n  http://images.google.com.au/images?q=fritted+glass  which is a common\n  method of sun control in architecture.\ntype: :feature\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-06-27 15:34:38.921913 Z\nreferences: []\n\nid: 3074be871fbce4de2da49a1abc0432d8e49e30c1\nlog_events: \n- - 2009-06-27 15:34:39.657825 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-19 21:09:04.326798 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n- - 2009-07-22 02:45:42.372434 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-361aa608201ea4f1ec2fd204a7c62df2ebfeb1b8.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: My view port is blank. does not show coordinates.\ndesc: |-\n  Contact: justshonuff@yahoo.com\n  Summary: My view port is blank. does not show coordinates.\n  Report Generated: 2008-Nov-05 11:58:32 UTC\n  Package: k3d\n  Version: 0.5.14.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jul 9 2006 10:24:48 local\n  Description of problem:\n  my viewport has been blank since i installed the software. please help\n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-06 04:12:57.304498 Z\nreferences: []\n\nid: 361aa608201ea4f1ec2fd204a7c62df2ebfeb1b8\nlog_events: \n- - 2009-05-06 04:12:58.232230 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:07.463065 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:28:25.942855 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - This is an extremely out-of-date version of K-3D.\n"
  },
  {
    "path": "bugs/issue-363308f0b4815dcf1b3fb24103eb8b40f6645779.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Add filtering to the Node List Panel.\ndesc: Like it says, much of the content in the Node List Panel is overkill for the casual user.  Need to add some reasonable filtering capabilities, i.e. show \"common\" nodes, nodes in specific categories (lights, materials, etc), nodes of a specific type, name matching, etc.\ntype: :feature\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-05-22 00:43:21.654820 Z\nreferences: []\n\nid: 363308f0b4815dcf1b3fb24103eb8b40f6645779\nlog_events: \n- - 2010-05-22 00:43:22.270780 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-05-22 00:44:06.238848 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - edited title, description\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-38ed366c277ad6ad3cbf7113a50c73ab0dc6ecb9.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Ensure primitive attributes are updated correctly.\ndesc: Many (probably most) current modifiers that create new geometry fail to update primitive attributes, meaning that those modifiers will fail when applied to primitives with attributes.  Since it's really easy to write code that doesn't take attributes into account, we need a way to consistently catch such errors.  One heavy-handed way to do it would be to simply update every mesh source to generate output with attributes - then, current tests would automatically start failing in an obvious way.  On the down-side, this means increasing memory usage for everyone for what is basically a test case.  Second alternative would be to do something in the test layer that automatically adds attributes to sources.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-12-26 17:27:03.044526 Z\nreferences: []\n\nid: 38ed366c277ad6ad3cbf7113a50c73ab0dc6ecb9\nlog_events: \n- - 2009-12-26 17:27:03.964468 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-09 17:50:08.324400 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Enabled aggressive testing of primitive attributes on the dashboard - all mesh-related tests now generate attributes and enforce the validity of their output tests, so it should be impossible for a plugin to pass a regression test without generating valid attributes.\"\n"
  },
  {
    "path": "bugs/issue-3c77f6ba4e20fe744f97629df5b855476eaefef0.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Separate cuda bitmap functionality from cuda mesh functionality that doesn't build.\ndesc: In theory, the bitmap stuff works fine, just needs to be moved into a separate module.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-08-02 21:19:56.399190 Z\nreferences: []\n\nid: 3c77f6ba4e20fe744f97629df5b855476eaefef0\nlog_events: \n- - 2009-08-02 21:19:56.895141 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-3cb4616e3fdf2b348db28c1ec4761759e7570b91.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Segmentation fault on startup (Linux/PPC)\ndesc: |-\n  Hi,\n  I'm running Debian etch (gcc-4.2, libstdc++.so.6.0.9, libc-2.5.so, let me\n  know whatever else you need) on a powerpc (G4). I compiled a 0.6.6 tree and\n  everything went fine:\n  \n  $ ./configure\n  $ make\n  (sleep a couple of hours)\n  $ make install\n  \n  Unfortunately when I launch\n  \n  $ /usr/local/k3d/bin/k3d\n  \n  I get for a while the splash screen and a sudden\n  \n  /usr/local/k3d/bin/k3d: line 180: 23586 Segmentation fault\n  /usr/local/k3d/bin/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  /usr/local/k3d/lib/k3d --shadercache /home/alex/.k3d/shadercache --share\n  /usr/local/k3d/share/k3d --tutorials /usr/local/k3d/share/k3d/tutorials\n  --ui /usr/local/k3d/lib/libk3dngui.so\n  \n  Just to keep doing something, I tried\n  \n  $ make check\n  \n  in the tree top directory; I attach the last part of the output:\n  \n  make check-TESTS\n  make[3]: Entering directory `/home/alex/install/k3d-0.6.6.0/tests'\n  ../application/k3d: line 180: 29954 Segmentation fault\n  ../application/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --shadercache /ho../alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../nui/.libs/libk3dnui.so --batch --color --log-level warning --no-splash\n  --shaders ../share/shaders --show-process --exit\n  FAIL: testharness.startFAIL: testharness.startFAIcriptrecognition.null.001\n  ../application/k3d: line 180: 30003 Segmentation fault\n  ../application/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../nui/.libs/libk3dnui.so --batch --color --log-level warning --no-splash\n  --shad--shad--shad--shad--shad--shad--shad--s--shad--shad--shad--shad--shad--shadipt--shad--sha.k3--shad--shad--shad--shad--shad--shad--shad--s--shad--shad--shadult--shad--shad--s/k--shad--shad--shad--shad--shad--shad--shad--s--shad--shad--shad--gi--shad--shad--shad--shad--shad--shad--shad--s--shad--../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../nui/.libs/libk3dnui.so --batch --color --log-level warning --no-splash\n  --shaders ..--shaders ..--shaders ..--shaders ..--shaders ..--IL: testharness.scriptrecognition.python.001\n  PASS: testharness.scriptfailure.k3dscript.001\n  PASS: testharness.scriptfailure.pyPASS: testharness.scriptfailure.pyPASS: testharness.scriptfailure.pyPASS: 4PASS: testharness.scriptfailure.pyPASS: testharness.snsPASS: testharness.scriptfailure.pyPASS: testharness.scriptfailure.pyPhoPASS: testharness.scriptfailure.pyPASS: testharness.scriptfailure.pyPASSre/k3d/tutorials --ui\n  ../nui/.libs/libk3dnui.so --batch --color --log-level warning --no-splash\n  --shaders ../share/shaders --sho--shaders ../share/shaders --sho--shaders ../share/shaders --sho--shaders ../share/shaders --sho--shaders ../share/shaders --sho--shaders ../share/shaders --sho--shaders ../share/shaders --sho--shaders ../share/shaders --sho--shaders ../share/shaders --sho--shaders ../share/shaders --sho--shaders ../share/s--ui\n  ../nui/.libs/libk3dnui.so --batch --color --log-l../nui/.libs/libk3dnui.so --batch --color --log-l../nui/.libs/libk3dnui.ip../nui/.libs/libk3dnui.so --batch --color --log-l../nui/.libs/libk3dnui.so --batch --color --log-l../nui/lication/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../nui/.libs/libk3dnui.so --batch --color --log-level warning --no-splash\n  --shaders ../share/shaders --show-process --script - --exit\n  FAIL: document.stress_test.001\n  ../application/k3d: l../application/k3d: l../application/k3d: l../application/k3d: l../applical../application/k3d: l../application/k3d: l../application/k3d: l../application/k3d: l../applical../application/k3d: l../application/k3d: l../application/k3d: l../application/k3d: l../applical../application/k3d: l../application/k3d: l../application/k3d: l../application/k3d: l../applical../application/k3d: l../application/k3d: l../application/kne../application/k3d: l../application/k3d: l../application/k3d: l../application/k3d: l../applical../application/k3d: l../application/k3d: l../application/k3d: l../application/k3d: l../applical../application/k3d: l../application/k3d: l../application/k3d: l../application/k3d: l../applical../appno../application/k3d: l../application/k3d: l../application/k3d: l../applic: ../application/k3d: l../application/k3d: l../appli0: 4961 Segmentation fault\n  ../application/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../s../bin/plugins --shadercache /home/alex/.k3d/shadercacui../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../se/ns.k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script - --exit\n  FAIL: ngui.menu.activate.001\n  ../application/k3d: line 180: 5101 Segmentation fault\n  ../application/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script - --exit\n  FAIL: ngui.menu.activate.002\n  ../application/k3d: line 180: 5124 Segmentation fault\n  ../application/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script - --exit\n  FAIL: ngui.add_viewport.001\n  ../application/k3d: line 180: 51../application/k3d: line 180: 51../application/k3d: line 180: 51../applipt../application/kns../application/k3d: line 18he../application/k3d: line 180: 51../application/k3d: rials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so../ngui/.libs/libk3dngui.so../ngui/.libs/libk3dngui.so../ngui/.libs/libkhaders ../share/shaders --show-process\n  --script - --exit\n  FAIL: ngui.assign_hotkeys.001\n  ../application/k3d: line 180: 5172 Segmentation fault\n  ../application/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --sh--no-custom-layouts --no-splash --sh--no-custom-la-e--no-custom-layouts --no-splash --sh--no-custom-layouts --no-s19--no-custom-layouts --no-splash --sh--no-custom-layouts --no-splash --shtions.k3d --plugins\n  --no-custom-layouts --no-she /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script - --exit\n  FAIL: ngui.bitmaps.color_monochrome.001\n  ../application/k3d: line 180: 5222 Segmentation fault\n  ../application/k3d-bin --options /home/al../application/kk3d --plugins\n  ../bin/plugins --s../bin/plugins --s../bin/plugins --s../bin/plugins -ar../bin/plugins --s../bin/plugins --s../bin/plugins --s../bin/plugins ibk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script - --exit\n  FAIL: ngui.bitmaps.gamma.001\n  ../application/k3d: li../application/k3d: li../application/k3d: li../application/k3d: li../application/k3d: li../application/k3d: li../application/k3d: li../application/k3d: li../application/k3d: li../application/k3d: li../application/k3d: li../application/k3d: li/l../application/k3d: li../application/k3d: li../application/k3d: li../appo-../application/k3d: li../application/k3d: li../app-script - --exit\n  FAIL: ngui.bitmaps.matte_colordiff.001\n  ../applica../applica../applica../applica../applica../applica../applica../applica..ions /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --../bin/plugins --../bin/plugins --../bin/plugins --.ha../bin/plugins --../bin/plugins --../bin/plugins --../bin/plugins --.libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script - --exit\n  FAIL: ngui.bitmaps.multiply.001\n  ../application/k3d: line 180: 5291 Segmentation fault\n  ../application/k3d-bin --options /home../application/kns../application/k3d-bin --opns --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script - --exit\n  FAIL: ngui.bitmaps.subtract.001\n  ../application/k3d: line 180: 5315 Segmentation fault\n  ../application/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script - --exit\n  FAIL: ngui.bitmaps.threshold.001\n  ../application/k3d: line 180: 5338 Segmentation fault\n  ../application/k3d-bin --options /home/al../application/kk3../application/k3d-bin --optioha../application/k3d-bin --options /home/al../applicate\n  ../application/k3d-bin --options /home/al../application/kk3../application/k3d-bin --optioha../application/k3d-bin --options /home/al../applicatlash --shaders ../share/shaders --show-process\n  --script - --exit\n  FAIL: ngui.shaders.undo_selection.001\n  ../application/k3d: line 180: 5362 Segmentation fault\n  ../application/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script - --exit\n  FAIL: ngui.tools.unparent.001\n  ../application/k3../application/k3../application/k3../application/k3../application/k3../aome/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --../bin/plugins --../bin/plugins --../bin/plugins --.hare\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-s--no-custom-layouts --no-s--no-custom-layouts --no-s--no-custom-layouts --no-s--no-custom-layouts --no-s--no-custom-layouts --no-s--no-custom-layouts --no-s--no-custom-layouts --no-s--no-cions /home/alex/.k3d--no-custom-layouts --no-s--no-custos --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no--no-custom-layouts --no--no-custom-layouts --no----script ../share/tutorials/getting_started.k3dscript --exit\n  FAIL: ngui.tutorials.getting_started.001\n  ../application/k3d: line 180: 5431 Segmentation fault\n  ../application/k3d-bin --options../application/k3d-bin --options../application/k3d-bin --options../application/k3d-bin --options../application/k3d-bin --ops ../application/k3d-bin --options../application/k3d-bin --options../applitc../application/k3d-bin --options../application/k3d--../application/k3d-bin --options../application/k3d-bin --optio./share/tutorials/panel_basics.k3dscript --exit\n  FAIL: ngui.tutorials.panel_basics.001\n  ../application/k3d: line 180: 5455 Segmentation fault\n  ../application/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials ---tutorials /usr/local/k3d/share/k3d/tutorials ---log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script ../share/tutorials/navigation.k3dscript --exit\n  FAIL: ngui.tutorials.navigation.001\n  ../application/k3../application/k3../application/k3../ap/a../application/k3../application/k3../application/k3..k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shadercache --share ../share\n  --tutorials /usr/local/k3d/share/k3d/tutorials --ui\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script ../share/tutorials/basic_selection.k3dscript --exit\n  FAIL: ngui.tutorials.basic_selection.001\n  ../application../application../application../appliult\n  ../application/k3d-bin --options /home/alex/.k3d/options.k3d --plugins\n  ../bin/plugins --shadercache /home/alex/.k3d/shaderc../bin/plugins --shadercache /home/alex/.k3d/shaderc../bin/plugins --shai\n  ../ngui/.libs/libk3dngui.so --batch --color --log-level warning\n  --no-custom-layouts --no-splash --shaders ../share/shaders --show-process\n  --script ../share/tutorials/gts_boolean.py --exit\n  FAIL: ngui.tutorials.gts_boolean.001\n  ====================================================================================================================================================================================[c========================================================================6.0/tests'\n  make[1]: *** [check-recursive] Error 1\n  makemakemakemakemakemakemakemakemakemakemakemakemakemakemakemakemamake: *** [check-recursive] Error 1\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:47:18.127477 Z\nreferences: []\n\nid: 3cb4616e3fdf2b348db28c1ec4761759e7570b91\nlog_events: \n- - 2009-05-19 03:47:18.928081 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:49:12.119165 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:37:46.415099 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - From the OP, 'make check' implies a really out-of-date version of K-3D.\n"
  },
  {
    "path": "bugs/issue-4084f1c41c9a58ab4b0b49b7c8f988f45328edcc.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: My Viewport is Blank. No Grid/ Axis Lines\ndesc: |-\n  Contact: justshonuff@yahoo.com\n  Summary: My Viewport is Blank. No Grid/ Axis Lines\n  Report Generated: 2008-Oct-31 12:38:58 UTC\n  Package: k3d\n  Version: 0.5.14.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jul 9 2006 10:24:48 local\n  Description of problem:\n  This has been the case since I installed the sofware. Any Remedy?\n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-07 04:03:49.116953 Z\nreferences: []\n\nid: 4084f1c41c9a58ab4b0b49b7c8f988f45328edcc\nlog_events: \n- - 2009-05-07 04:04:01.981448 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:07.934634 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:28:39.766838 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - This is an extremely out-of-date version of K-3D.\n"
  },
  {
    "path": "bugs/issue-40ed654ea75987f34bbe51980b5622cc079d3c7e.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Optionally create 'back' faces in ExtrudeFaces.\ndesc: When extruding outlines (such as 2D text), it would be useful for ExtrudeFaces to create 'back' faces, so the result is a solid polyhedron.\ntype: :feature\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-02-23 04:03:15.931930 Z\nreferences: []\n\nid: 40ed654ea75987f34bbe51980b5622cc079d3c7e\nlog_events: \n- - 2010-02-23 04:03:16.451870 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-27 06:42:08.882958 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-413564006de7bfe4283dc79f9165dedd9b49c271.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: SDSCorner modifier should produce vertex attributes instead of point attributes.\ndesc: Like it says.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-01-03 15:48:36.044517 Z\nreferences: []\n\nid: 413564006de7bfe4283dc79f9165dedd9b49c271\nlog_events: \n- - 2010-01-03 15:48:36.604554 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-19 17:05:05.148549 Z\n  - Bart Janssens <bart.janssens@lid.kviv.be>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-41f14db348415ee631409034dafa0d42d0deddea.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Make the K-3D guide readable from the NGUI.\ndesc: |-\n  Users should be able to open the K-3D guide from the NGUI, i.e. it should be distributed with the app and openable, either via HTML or PDF or both.\n  \n  Notes: we could use GtkHtml, or open the guide in the user's browser.\ntype: :feature\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-07-04 19:13:18.774227 Z\nreferences: []\n\nid: 41f14db348415ee631409034dafa0d42d0deddea\nlog_events: \n- - 2010-07-04 19:13:19.629998 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-42a7588ab85a23f2a39a9fb36b63b6fa9d7af0f5.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"5 (k3d:26077): GdkGLExt-WARNING **: cannot load PangoFont Segmentation fault (core dumped)\"\ndesc: |-\n  Contact: jiricka@ints.cz\n  Summary: (k3d:26077): GdkGLExt-WARNING **: cannot load PangoFont\n  Segmentation fault (core dumped)\n  \n  Report Generated: 2008-Mar-25 23:27:24 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.1.3 20070831 (prerelease) (Ubuntu 4.1.2-16ubuntu1)\n  Build Time: Sep 13 2007 03:47:14 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:30:12.528467 Z\nreferences: []\n\nid: 42a7588ab85a23f2a39a9fb36b63b6fa9d7af0f5\nlog_events: \n- - 2009-05-19 03:30:13.703998 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:21.926641 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:27:15.247046 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Can't reproduce.\n"
  },
  {
    "path": "bugs/issue-432f8b1d7711eb5d22d6046d20bc006c18d5090b.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Empty viewport on Windows Vista\ndesc: |-\n  Contact: matts-address@hotmail.com\n  Summary: The viewport does not display anything.\n  Report Generated: 2007-Dec-12 23:28:38 UTC\n  Package: k3d\n  Version: 0.6.6.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 6 2007 13:08:21 local\n  Description of problem: Upon opening, the viewport does not display\n  anything, unless a shape has just been inserted. I'm running Vista.\n  \n  Steps to reproduce problem: Open up K-3D\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen? All the time.\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-19 03:35:47.936321 Z\nreferences: []\n\nid: 432f8b1d7711eb5d22d6046d20bc006c18d5090b\nlog_events: \n- - 2009-05-19 03:35:48.712753 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:53:05.446654 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-11-11 05:42:44.867642 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - edited title\n  - \"\"\n- - 2009-11-15 16:12:46.718277 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This is already fixed in 0.7, using the DisableDesktopComposition plugin.\n"
  },
  {
    "path": "bugs/issue-43ed5f6b35f29c0788a75461bf33f3120387f6c1.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Texture baking from RM SL to bitmaps.\ndesc: |-\n  CGKit lets you bake a Renderman texture\n  http://cgkit.sourceforge.net/tutorials/baking/baking.html  this method\n  would allow renderman shaders as input to Luxrender textures, or any\n  of the bitmap nodes for that matter. Perhaps not now, but in the\n  future having GEGL in the pipeline would be very powerful (replace\n  imagemagik?) http://gegl.org/  their way of doing things is very\n  similar to your design of K-3D's architecture.\ntype: :feature\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-06-27 15:35:19.707036 Z\nreferences: []\n\nid: 43ed5f6b35f29c0788a75461bf33f3120387f6c1\nlog_events: \n- - 2009-06-27 15:35:20.466978 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:46:45.047080 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from unassigned\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-44735744038c3434abe3f3a7e13f881e2e2cc48e.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Remove legacy code from FilletEdges\ndesc: Like it says.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-12-29 03:13:14.813546 Z\nreferences: []\n\nid: 44735744038c3434abe3f3a7e13f881e2e2cc48e\nlog_events: \n- - 2009-12-29 03:13:15.781482 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-15 06:12:48.958327 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-4523543999b211ff2977debc785b31e70964ea2b.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: compilation errors\ndesc: |-\n  hi, i have compilation errors... version 0.7.9.0\n  \n  [ 26%] Building CXX object\n  k3dsdk/ngui/CMakeFiles/k3dsdk-ngui.dir/widget_manip.o\n  In file included from\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/inode.h:28,\n  from /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/data.h:28,\n  from\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/ngui/application_state.h:\n  27,\n  from\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/ngui/widget_manip.cpp:24:\n  \n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/almost_equal.h: In member\n  function 'const bool k3d::almost_equal<double>::operator()(k3d::double_t,\n  k3d::double_t) const':\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/almost_equal.h:149:\n  warning: comparison between signed and unsigned integer expressions\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/almost_equal.h:149:\n  warning: comparison between signed and unsigned integer expressions\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/almost_equal.h: In static\n  member function 'static const k3d::int64_t\n  k3d::almost_equal<double>::to_integer(k3d::double_t)':\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/almost_equal.h:156:\n  warning: dereferencing type-punned pointer will break strict-aliasing\n  rules\n  Linking CXX shared library ../../lib/libk3dsdk-ngui.so\n  [ 26%] Built target k3dsdk-ngui\n  Scanning dependencies of target k3dsdk-python-types\n  [ 26%] Building CXX object\n  k3dsdk/k3dhok3dsdk/k3dhok3dsdk/k3dhok3dsdk/k3dhok3dsdk/k3dhok3dsdk/k3dhok3dsdk/k3dhok3frok3dsdk/k3dhok3dsdk/k3dhok3dsdk/k3dhok3dsdk/k3dhok3dsdk/k3dhok3dsdk/k3dhok3r/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/algebra.h:30,\n  from\n  /usr/src/p/usr/src/p/usr/src/p/rce-0.7.9.0/k3dsdk/python/angle_axis_python.\n  h:27,\n  from\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/python/angle_axis_python.\n  cpp:24:\n  cpp:24:\n  /packages/BUILD/k3d-source-0.7.9.0/k3dsdk/python/angle_axis_ m/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/python/angle_axis_ m/pac3d/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/python/angle_axis_ m/packages/BU9.0/k3dsdk/almost_equal.h:149:\n  warning: comparison between signed and unsigned integer expressions\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/almost_equal.h:149:\n  warning: comparison between signed and unsigned integer expressions\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/almost_equal.h/usr/src/packages/BUILD/k3d-sota/usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/to_integer(k3d::double_t)':\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/almost_equal.h:156:\n  warning: dereferencing type-punned pointer will break strict-aliasing\n  rules\n  In file included from /usr/include/boost/python/class.hpp:29,\n  from /usr/includefroost/python.hpp:18,\n  from\n  /usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/pyth/usrngle_ax/usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/pyth/usrngle_ax/usr/src/ba/usr/se:/usr/sin/usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/pyth/usrngle_ax/usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/pyth/usrngle_ax/usr/src/ba/usr/se:/usr/sin/usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/pyth/usrngle_ax/usr/src/pa::/usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/pyth/usrngle_ax/t_/usr/src/packages/BUILD/k3d-source-0.7.9.0/k3dsdk/pyth/usrngle_ax/us >::result_type\n  boost::python::detail::def_helper<T1, T2, T3, T4>::keyboost::python::detail::def_helper<T1, T2, T3, T4>::keyboost::python::detail::def_helper<T1, T2, T3, T4>::keyboost::python::detail::def_helper<T1, T2, T3, T4>::keyboost::pyt/Cboost::python::detail::def_helper<T1, T2, T3, T4>::keyboost::python:1]boost::python::detail::def_helper<T1, T2, T3, T4>::keyboost::python:\n  mmmmm *** [all] Error 2\n  \n  can i fix it?\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:21:42.809002 Z\nreferences: []\n\nid: 4523543999b211ff2977debc785b31e70964ea2b\nlog_events: \n- - 2009-05-19 03:21:44.305029 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:16.102653 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-09-27 01:14:35.122172 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Can't reproduce.\n"
  },
  {
    "path": "bugs/issue-45a8e81c24329d52763349b662988a9969e2a929.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Cleanup icons\ndesc: We have many misnamed, obsolete, and missing icons - clean 'em up.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.1\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-04-17 03:12:11.601190 Z\nreferences: []\n\nid: 45a8e81c24329d52763349b662988a9969e2a929\nlog_events: \n- - 2010-04-17 03:12:12.249148 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-04-17 21:17:47.089170 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-478fd768c3286ce365c29af422175f8b9969ca11.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Revisit how to properly interpolate integer attributes.\ndesc: Currently, interpolation of weighted integer primitive attributes produces wildly different results in some cases.  We need to figure-out how to get consistent results - perhaps we should simply pick the attribute with the largest weight, as we do with pointer attributes?\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-04-04 05:05:15.345316 Z\nreferences: []\n\nid: 478fd768c3286ce365c29af422175f8b9969ca11\nlog_events: \n- - 2010-04-04 05:05:16.225256 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-49b3bc440ae6da65fec9979da016681ccdd7df24.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5 .7.3 crashes (SelectEdgeLoops Undo)\ndesc: |-\n  0: Start K-3D,\n  1: create a PolyCone (or make your choice),\n  2: use \";\" to SelectEdgeLoops,\n  3: Undo the last operation\n  4: Start K-3D again ;)\n  \n  Vista 64bit\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:26:22.464921 Z\nreferences: []\n\nid: 49b3bc440ae6da65fec9979da016681ccdd7df24\nlog_events: \n- - 2009-05-19 03:26:23.576851 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:18.583071 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-11-15 16:16:05.094276 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-4a400f4d42a40bb64cb5df9e83481ec74ea8974e.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"assertion `WIDGET_REALIZED_FOR_EVENT (widget, event)' failed \"\ndesc: |-\n  I typed in \"shadowdistant\" in the shader path string space, and then\n  pressed the \"Relative\"\n  pulldown menu, and then pressed it really fast, again. The error I get is:\n  \n  ERROR Gtk: gtk_widget_event: assertion `WIDGET_REALIZED_FOR_EVENT (widget,\n  event)' failed\n  \n  K3D is still going, and when I highlight something with my cursor(like\n  \"Shader Path\"), it\n  shows a tooltip. I am not able to exit using the \"X\" in the upperright\n  corner of K3D. I had to \"Ctrl+C\" K3D in the console I ran it from.\n  \n  Unfortunatly, I am not able to reproduce this bug on purpose, only on\n  accident. But I know\n  for a positive, 100% fact that it has to do with the \"Relative, Absolute,\n  Inline\" pulldown menu.\n  \n  I hope this was descriptive enough. I've had a lot of problems with this in\n  the past 2 days of working with K3D, and think it's a pretty big bug.\n  \n  System specs:\n  PCLinuxOS 2007\n  GTK 2.12.2-4pclos2007\n  K3D 0.6.7.0\n  \n  K3D is nice, btw. I hope it \"grows up\" more.\n  \n  email: leiget at gmail . com\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-06 04:07:21.056584 Z\nreferences: []\n\nid: 4a400f4d42a40bb64cb5df9e83481ec74ea8974e\nlog_events: \n- - 2009-05-06 04:07:22.384467 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:05.111069 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-10-17 20:25:20.674081 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Can't reproduce.\n"
  },
  {
    "path": "bugs/issue-4a7cea3d5863e1dec9aa8e78e239963e9c451926.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Restore BridgeFaces\ndesc: Now that I understand how BridgeFaces differs from BridgeEdges, bring it back.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-02-21 06:15:36.907229 Z\nreferences: []\n\nid: 4a7cea3d5863e1dec9aa8e78e239963e9c451926\nlog_events: \n- - 2010-02-21 06:15:37.562852 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-24 08:18:57.627879 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-4ac006d705b9b7b5b3468932c4e7750d95564cce.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: no images come up on viewport\ndesc: |-\n  Contact: markbaird88@hotmail.co.uk\n  Summary: no images come up on viewport\n  Report Generated: 2008-May-04 17:17:47 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:22:32.920909 Z\nreferences: []\n\nid: 4ac006d705b9b7b5b3468932c4e7750d95564cce\nlog_events: \n- - 2009-05-19 03:22:33.936926 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:16.470642 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:31:01.095070 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Works here.\n"
  },
  {
    "path": "bugs/issue-52654f9476391c6612de54e91d54e4dcda7bb847.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: build error\ndesc: \"In file included from\\n\\\n  /home/7eggert/l/k3d-source-0.7.10.0/k3dsdk/python/const_typed_array_python.\\n\\\n  cpp:27:\\n\\\n  /home/7eggert/l/k3d-source-0.7.10.0/k3dsdk/python/utility_python.h: In\\n\\\n  function \\xE2\\x80\\x98void k3d::python::utility::copy(const boost::python::list&,\\n\\\n  target_t&)\\xE2\\x80\\x99:\\n\\\n  /home/7eggert/l/k3d-source-0.7.10.0/k3dsdk/python/utility_python.h:102:\\n\\\n  error: \\xE2\\x80\\x98len\\xE2\\x80\\x99 is not a member of \\xE2\\x80\\x98boost::python\\xE2\\x80\\x99\\n\\\n  make[2]: ***\\n\\\n  [k3dsdk/python/CMakeFiles/k3dsdk-python-const-arrays.dir/const_typed_array_\\n\\\n  python.o] Error 1\\n\\\n  make[1]: *** [k3dsdk/python/CMakeFiles/k3dsdk-python-const-arrays.dir/all]\\n\\\n  Error 2\\n\\\n  make: *** [all] Error 2\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-06 03:57:46.656158 Z\nreferences: []\n\nid: 52654f9476391c6612de54e91d54e4dcda7bb847\nlog_events: \n- - 2009-05-06 03:57:48.248324 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-22 02:51:26.468479 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:22:09.566809 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Works fine here; there's been enough change in the file that it's difficult to tell whether this could be an issue for someone else, so punt.\n"
  },
  {
    "path": "bugs/issue-538f9fab4a345ba7c88ba39b4faa0ef55cfffaad.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Manipulators dissapear when changing the selection mode.\ndesc: \"Steps:\\n\\\n  1- New document\\n\\\n  2- Create cube\\n\\\n  3- Switch to vertex selection and select something\\n\\\n  4- Change the selection mode. Manipulators are gone.\\n\\n\\\n  Seems that manipulators and transformations tools are acting weird. More\\n\\\n  bugs on this later\\n\\n\\\n  Cheers!\\n\\\n  Joaqu\\xC3\\xADn\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:41:03.800783 Z\nreferences: []\n\nid: 538f9fab4a345ba7c88ba39b4faa0ef55cfffaad\nlog_events: \n- - 2009-05-19 03:41:04.512090 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:50:15.382652 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-20 06:33:06.249464 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-555cc14dcbca30e03f0a333f0236c8f653e0a7f1.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: keeps just closing (as if i had told it to do so, no error message) when using the tutorial\ndesc: |-\n  Contact: wpi2@aol.com\n  Summary: keeps just closing (as if i had told it to do so, no error\n  message) when using the tutorial\n  Report Generated: 2008-Mar-11 17:15:31 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.1.3 20070831 (prerelease) (Ubuntu 4.1.2-16ubuntu1)\n  Build Time: Sep 13 2007 03:47:14 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1. I start the tutorial normally\n  2. everything goes fine until it just closes everything and that's it.\n  3. Particularly when i get to the fourth chapter in tuto, but also did the\n  same a few times before getting that far\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-19 03:32:22.176629 Z\nreferences: []\n\nid: 555cc14dcbca30e03f0a333f0236c8f653e0a7f1\nlog_events: \n- - 2009-05-19 03:32:22.696225 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:03:05.939119 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:06:15.859240 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-5970a8d939cc358d1ab2bef5c0eeabf2baa2a9e8.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Remove legacy code from DissolveComponents.\ndesc: Like it says.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-12-29 03:14:04.757547 Z\nreferences: []\n\nid: 5970a8d939cc358d1ab2bef5c0eeabf2baa2a9e8\nlog_events: \n- - 2009-12-29 03:14:05.717480 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-02 01:37:53.526297 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - issue claimed\n  - \"\"\n- - 2010-02-06 04:59:42.583540 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n- - 2010-02-21 06:16:04.978883 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from 1.0.0.0\n  - \"\"\n- - 2010-03-17 05:23:06.705251 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"Replaced DissolveComponents with DissolveFaces.  TODO in a later release: create DissolveEdges and DissolvePoints to match.\"\nclaimer: Timothy M. Shead <tshead@k-3d.com>\n"
  },
  {
    "path": "bugs/issue-5d9c8400eb4dcb02edcf8dc56ce8bcd91955a53c.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: MakeCreases has no implementation.\ndesc: Like it says ... we either need to provide an implementation or remove it.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-12-01 06:34:31.520276 Z\nreferences: []\n\nid: 5d9c8400eb4dcb02edcf8dc56ce8bcd91955a53c\nlog_events: \n- - 2009-12-01 06:34:32.432220 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-11 16:42:28.958175 Z\n  - Bart Janssens <bart.janssens@lid.kviv.be>\n  - commented\n  - Implementation should be postponed until we have a complete set of EUler operations. The last implementation dates back to the legacy mesh structure and was quite complex, but Euler operations would greatly simplify things.\n- - 2010-01-12 06:16:55.565269 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - We are going to postpone work on this.\n"
  },
  {
    "path": "bugs/issue-5f88eac8fa3003c363a0364ee8827a438bcda2ca.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Viewport Display Not functioning\ndesc: |-\n  Contact: truswellj@gmail.com\n  Summary: Viewport Display Not functioning\n  Report Generated: 2008-Mar-17 19:29:32 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.1.3 20070831 (prerelease) (Ubuntu 4.1.2-16ubuntu1)\n  Build Time: Sep 13 2007 03:47:14 local\n  Description of problem: Upon opening the program, the viewport area is\n  black. I can get it to show the display but as soon as I click anyway, the\n  display changes to completely gray.\n  \n  Steps to reproduce problem:\n  \n  1. Open K-3D\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:31:42.280743 Z\nreferences: []\n\nid: 5f88eac8fa3003c363a0364ee8827a438bcda2ca\nlog_events: \n- - 2009-05-19 03:31:42.880562 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:23.094726 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:43:10.879146 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - This might be a duplicate of {issue deed7f51f539b6c62b97c585ed7453b3242c9992}.\n"
  },
  {
    "path": "bugs/issue-5fde01d7a4fcdff886003dbaeb9773d33e2b9f18.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Selection issues when moving from 64-bit to 32-bit platforms.\ndesc: We store \"select all\" and \"deselect all\" operations as an assignment of selection weights to the entire range of values that can be stored in uint_t.  Because the range varies depending on platform word size, documents saved on a 64-bit platform cannot be deserialized on 32-bit platforms.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-07-19 22:11:44.622812 Z\nreferences: []\n\nid: 5fde01d7a4fcdff886003dbaeb9773d33e2b9f18\nlog_events: \n- - 2009-07-19 22:11:46.198687 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-20 05:07:10.686826 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Clamp 64-bit values when loading files on a 32-bit platform.  This provides the correct semantics for selections, which will continue to work.\n"
  },
  {
    "path": "bugs/issue-607cbe27448028c9efc67e008d01f1e507bb1fbd.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Review plugin names\ndesc: |-\n  Among other proposals:\n  \n  Should JoinPoints be changed to FusePoints, or UnitePoints, because\n  join points means form a line between two points (or more if there is\n  sequence data in the selection set)?\n  \n  \"Join\" has also been misused elsewhere so if we change join to a more\n  appropriate word it should be done consistently.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-10 05:20:59.666799 Z\nreferences: []\n\nid: 607cbe27448028c9efc67e008d01f1e507bb1fbd\nlog_events: \n- - 2009-08-10 05:21:00.458739 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-23 03:48:27.282805 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-624ea57c7b26a27eba7f3bfd65f0dee40eb814d3.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5 when I try to point element, viewport become black, and after it return grid, but I cannot select nothing\ndesc: |-\n  Contact: win22@pochta.ru\n  Summary: when I try to point element, viewport become black, and after it\n  return grid, but I cannot select nothing\n  Report Generated: 2007-Dec-06 19:54:18 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.1.3 20070831 (prerelease) (Ubuntu 4.1.2-16ubuntu1)\n  Build Time: Sep 13 2007 03:47:14 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:36:44.719801 Z\nreferences: []\n\nid: 624ea57c7b26a27eba7f3bfd65f0dee40eb814d3\nlog_events: \n- - 2009-05-19 03:36:46.816197 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:53:09.039044 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:40:20.167186 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-630255130a08cc316bba010d111dad725f7f9258.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Doesn't work with Windows 7\ndesc: |-\n  This program isn't work with Windows 7 (Vienna). It gave about 55% of CPU\n  and do nothing.\n  \n  version 0.6.7.0 os Windows 7 Ultimate build 7000\n  I've installed full of package downloaded from\n  http://switch.dl.sourceforge.net/sourceforge/k3d/k3d-all-in-one-setup-0.6.7\n  .0.exe\n  \n  What about this reason?\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-06 03:48:51.680121 Z\nreferences: []\n\nid: 630255130a08cc316bba010d111dad725f7f9258\nlog_events: \n- - 2009-05-06 03:48:56.640234 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-22 02:48:29.156378 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:49:54.607054 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-637f683833589ed1b5cd3f5028206c80ec97d3e9.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: NurbsEditCurveKnotVector segfaults when created.\ndesc: \"\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-23 20:49:00.397697 Z\nreferences: []\n\nid: 637f683833589ed1b5cd3f5028206c80ec97d3e9\nlog_events: \n- - 2009-08-23 20:49:01.117777 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-10-07 01:24:35.873135 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-63e3d51ee3915a539f21adf515ed7275f359295b.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Fix broken NURBS tests.\ndesc: \"\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-23 23:44:54.773621 Z\nreferences: []\n\nid: 63e3d51ee3915a539f21adf515ed7275f359295b\nlog_events: \n- - 2009-08-23 23:44:55.413561 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-12-12 03:57:42.028512 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-66dbf9444de6bcf5ef19d5ad94b51e0e5b58c3cd.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"black box were the model should be \"\ndesc: |-\n  Contact: macfuehrbush@gmail.com\n  Summary: black box were the model should be\n  Report Generated: 2008-Jun-08 02:45:05 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.2.3 (Ubuntu 4.2.3-2ubuntu1)\n  Build Time: Feb 27 2008 23:29:50 local\n  black box were the model should be\n  Steps to reproduce problem:\n  \n  1. open k 3d in extra efecks mode on ubuntu\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-07 04:15:37.261676 Z\nreferences: []\n\nid: 66dbf9444de6bcf5ef19d5ad94b51e0e5b58c3cd\nlog_events: \n- - 2009-05-07 04:15:37.813342 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:14.078701 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:33:26.079051 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This appears to be a duplicate of {issue deed7f51f539b6c62b97c585ed7453b3242c9992}.\n"
  },
  {
    "path": "bugs/issue-6a66838dfc4773a21c04575103c92d8e8802f5ff.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Remove legacy code from CollapseFaces.\ndesc: Like it says.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-12-29 03:14:35.677573 Z\nreferences: []\n\nid: 6a66838dfc4773a21c04575103c92d8e8802f5ff\nlog_events: \n- - 2009-12-29 03:14:36.509493 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-14 21:58:15.053279 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-6aedc6869efacb25e643f2bb3d447338cc7307e5.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"5 Das Tutorial Skript Nr. 5 st\\xC3\\xBCrzt ab\"\ndesc: \"Contact: hans.frericks@web.de\\n\\\n  Summary: Das Tutorial Skript Nr. 5 st\\xC3\\xBCrzt ab\\n\\\n  Report Generated: 2008-Oct-12 09:57:46 UTC\\n\\\n  Package: k3d\\n\\\n  Version: 0.6.7.0\\n\\\n  Platform: i486-pc-linux-gnu\\n\\\n  Compiler: 4.2.3 (Ubuntu 4.2.3-2ubuntu1)\\n\\\n  Build Time: Feb 27 2008 23:29:50 local\\n\\\n  Description of problem:\\n\\n\\\n  Steps to reproduce problem:\\n\\n\\\n  1. Help - Tutorial - GTS Boolean (Advanced) --> Programmabsturz\\n\\\n  2.\\n\\\n  3.\\n\\n\\\n  Expected results:\\n\\n\\\n  Actual results:\\n\\n\\\n  How often does this happen?\\n\\n\\\n  Additional information:\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-07 04:05:21.149679 Z\nreferences: []\n\nid: 6aedc6869efacb25e643f2bb3d447338cc7307e5\nlog_events: \n- - 2009-05-07 04:05:22.205545 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:01:29.067072 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:05:33.043156 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n- - 2009-08-03 00:30:04.398851 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-6b7163b333419334ced5dd726d5b5a5c669cb9c8.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5 Rendering of files does not work\ndesc: |-\n  Contact: shashank.araokar@gmail.com\n  Summary: Rendering of files does not work\n  Report Generated: 2007-Aug-14 20:21:32 UTC\n  Package: k3d\n  Version: 0.6.6.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.1.2 20070106 (prerelease) (Ubuntu 4.1.1-21ubuntu7)\n  Build Time: Jan 16 2007 15:55:06 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1. Create any simple model\n  2. Say render (either press F12 or render frame)\n  3. Save the file as needed (if needed)\n  \n  Expected results:\n  Anything sensible (say a preview or something)\n  \n  Actual results:\n  Nothing happens. File is not saved. No error is reported. No warnings, no\n  results\n  \n  How often does this happen?\n  Each time\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:43:08.584443 Z\nreferences: []\n\nid: 6b7163b333419334ced5dd726d5b5a5c669cb9c8\nlog_events: \n- - 2009-05-19 03:43:09.280302 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:49:54.479171 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:19:42.470995 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Works here.\n"
  },
  {
    "path": "bugs/issue-6d0f5f71bcca568aab7d418c23ea12de51a07b88.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5  Bug while moving vertices, edges and faces on a tutorial\ndesc: \"Resuming:\\n\\\n  1-Start recording a tutorial\\n\\\n  2-Select a face/edge/vertex\\n\\\n  3-Move it\\n\\\n  4-Without changing the move tool select and move another face/edge/vertex\\n\\\n  5-Play the script\\n\\n\\\n  I attach a k3dscript file for reproducing the bug.\\n\\\n  It throws on the terminal (in 0.6.7 and 0.7.0)\\n\\\n  WARNING: Selection contained records without nodes\\n\\\n  ERROR Command node [move_tool] unhandled command: [lmb_click_replace]\\n\\\n  [<arguments><viewport>/document/window/viewport</viewport><mouse>0.418126\\n\\\n  0.638689</mouse></arguments>]\\n\\n\\\n  This script was recorded on k3d 0.6.7 and when played on 0.7 it selects a\\n\\\n  different face. Seems like coordinates are upside down. I'll will submit\\n\\\n  another bug report on this subject.\\n\\n\\\n  Thanks for merging the mug script!\\n\\n\\\n  Cheers,\\n\\\n  Joaqu\\xC3\\xADn.\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-19 03:45:29.375947 Z\nreferences: []\n\nid: 6d0f5f71bcca568aab7d418c23ea12de51a07b88\nlog_events: \n- - 2009-05-19 03:45:29.871867 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:03:32.795165 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:06:39.795088 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-6e358533fc719d3b3c1fe8b061f7091cd046453e.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: lots of soft of this packages are unsigned , loaded from mandriva 2008.0.rpm.I586\ndesc: |-\n  Contact: mgb-system@wanadoo.fr\n  Summary: lots of soft of this packages are unsigned , loaded from mandriva\n  2008.0.rpm.I586\n  Report Generated: 2008-Aug-30 14:21:44 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i586-mandriva-linux-gnu\n  Compiler: 4.1.2 20070302 (prerelease) (4.1.2-1mdv2007.1)\n  Build Time: Jun 12 2007 17:42:53 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-07 04:08:41.813615 Z\nreferences: []\n\nid: 6e358533fc719d3b3c1fe8b061f7091cd046453e\nlog_events: \n- - 2009-05-07 04:08:42.533530 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:10.686639 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-02 23:17:10.927021 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - This is a downstream distribution issue, if I understand the OP's meaning correctly.\n"
  },
  {
    "path": "bugs/issue-703980e3eb7434bec1481e3f7b5558bf64926f9e.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5  Segfault right after the splash screen comes up\ndesc: |-\n  Contact: tuomi6@cs.tut.fi\n  Summary: Segfault right after the splash screen comes up\n  Report Generated: 2007-Jun-11 14:59:03 UTC\n  Package: k3d\n  Version: 0.6.0.0\n  Platform: x86_64-pc-linux-gnu\n  Compiler: 4.1.2 20061115 (prerelease) (Debian 4.1.1-20)\n  Build Time: Dec 3 2006 00:16:05 local\n  Description of problem:\n  Program starts up, displays splash screen, then segfaults:\n  /usr/bin/k3d: line 180: 12802 Segmentation fault /usr/bin/k3d-bin\n  --options /home/tuomi/.k3d/options.k3d --plugins /usr/lib/k3d --shadercache\n  /home/tuomi/.k3d/shadercache --share /usr/share/k3d --tutorials\n  /usr/share/k3d/tutorials --ui /usr/lib/libk3dngui.so\n  \n  Steps to reproduce problem:\n  \n  1. Start program.\n  2.\n  3. Crash and burn.\n  \n  Expected results:\n  Wanted to try out this program.\n  \n  Actual results:\n  It segfaulted before I even got it to load.\n  \n  How often does this happen?\n  Every time I try.\n  \n  Additional information:\n  Using k3d 0.6.0.0 (Debian package) on Debian 2.6.18-3-amd64 (testing), on\n  my home computer.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:46:30.983802 Z\nreferences: []\n\nid: 703980e3eb7434bec1481e3f7b5558bf64926f9e\nlog_events: \n- - 2009-05-19 03:46:31.664463 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:49:18.510706 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:38:48.783075 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-7186061f7d139f1591333c49d6bc53b93cb6ecc3.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: RenderManArrayXD plugins should be more generic.\ndesc: |-\n  I think that RenderManArray...\n  (http://www.k-3d.org/wiki/Array_Plugins) should be converted into a\n  more generic RenderingProxyArray and that it should also be able to\n  generate an array of actual object instances so that it can be used as\n  a modeling tool and for cases where a proxy cannot be used in the\n  chosen output format.\n  \n  At the moment it will not work with LuxRender but Lux does support\n  geometry instancing.\ntype: :feature\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-07-14 03:54:59.949374 Z\nreferences: []\n\nid: 7186061f7d139f1591333c49d6bc53b93cb6ecc3\nlog_events: \n- - 2009-07-14 03:55:01.277314 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:46:31.191045 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from unassigned\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-71a4669f4804254394b5e170afb5ca0fc537ad62.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Hint Refactoring\ndesc: Complete the action items documented in http://www.k-3d.org/wiki/Hint_Refactoring - in particular, update all pipeline components to implement hint-mapping when updating their state in response to property changed signals.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-04-29 01:55:58.107159 Z\nreferences: []\n\nid: 71a4669f4804254394b5e170afb5ca0fc537ad62\nlog_events: \n- - 2009-04-29 01:55:59.307170 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-21 05:53:07.681355 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n- - 2010-05-22 00:34:48.558807 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.1.0 from 1.0.0.0\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-71abd763037b718e574529c33c58a458f05af48c.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"User properties Order and NullOutputScript \"\ndesc: |-\n  On 0.7 rev 899, ubuntu feisty fawn\n  \n  When user properties are created via script, when the file is reloaded,\n  they are reordered missing it's original order. (this doesn't happen on\n  manually created user properties)\n  \n  NullOutputScript\n  When opening a file it evaluates its script before its user properties are\n  created.\n  I guess is has to do with /scripting/null_output_script.cpp\n  line 51: connect_script_changed_signal(sigc::mem_fun(*this,\n  &null_output_script::on_execute));\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:24:08.601156 Z\nreferences: []\n\nid: 71abd763037b718e574529c33c58a458f05af48c\nlog_events: \n- - 2009-05-19 03:24:09.880832 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:17.303072 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-21 05:48:04.465475 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-71e0e500fc3a528e690296d69e5f6c8d62cb0076.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Add support for merging polyhedra.\ndesc: |-\n  The MergeMesh modifier generates the 'union' of geometric primitives in its output, but many operations (BridgeFaces and BridgeEdges come to mind) can only work on individual primitives.  Similarly, multiple polyhedron primitives must be merged into one to create a solid / manifold for operations such as CatmullClark.\n  \n  Create a MergePolyhedra filter to address these cases.\ntype: :feature\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-02-27 06:47:22.555937 Z\nreferences: []\n\nid: 71e0e500fc3a528e690296d69e5f6c8d62cb0076\nlog_events: \n- - 2010-02-27 06:47:23.178841 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-720f97d969465f88647103a679fccfba9fdfe595.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Interactive node selection doesn't update node properties panel.\ndesc: When selecting nodes interactively, the node properties panel no longer updates to display properties for the selected node.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-03 15:29:18.385155 Z\nreferences: []\n\nid: 720f97d969465f88647103a679fccfba9fdfe595\nlog_events: \n- - 2009-08-03 15:29:19.233178 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-10-12 01:33:23.928497 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-726036fd940e69af892483f4fb81ced5076343c0.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Add information on materials to the Guide.\ndesc: Like it says - there are a lot of support requests around material management.\ntype: :feature\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-07-04 19:13:56.370134 Z\nreferences: []\n\nid: 726036fd940e69af892483f4fb81ced5076343c0\nlog_events: \n- - 2010-07-04 19:13:57.177396 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-72b9eb7ea6f2ee49a1aa6de0f9bdda95fd8226af.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5  Nothing showing in the view port\ndesc: |-\n  Contact: vnhg@yahoo.com\n  Summary: Nothing showing in the view port\n  Report Generated: 2008-Jan-28 03:37:34 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:33:18.128479 Z\nreferences: []\n\nid: 72b9eb7ea6f2ee49a1aa6de0f9bdda95fd8226af\nlog_events: \n- - 2009-05-19 03:33:20.192201 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:23.959067 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:41:29.087182 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-734d997c30a2208e4cc49cfc83071a6e8c446203.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5 The viewport does not update\ndesc: |-\n  Contact: wil.lemmelliw@gmail.com\n  Summary: The viewport does not update\n  Report Generated: 2008-Jun-17 02:45:04 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:\n  I installed k3d-all-in-one-setup-0.6.7.0.exe on a Vista buisiness AsusG2\n  laptop\n  with Nvidia geforce_8600M (1440x900)\n  The viewport does not update or show at all\n  I cannot rotate the view even if the grid shows.\n  I have seen a reported framerate of 1000 or maybe even 4000 (can't repeat\n  it right now)\n  \n  Steps to reproduce problem:\n  Run the k3d-all-in-one-setup-0.6.7.0.exe installer on my system.\n  Note:\n  I did intall the components all in 1 directory on my D drive.\n  \n  How often does this happen?\n  From the first run on.\n  \n  Additional information:\n  I'm willing to test any (alpha) code that might solve this problem\n  or can help to identify the bug.\n  \n  Cheers\n  Willem.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-07 04:14:59.604742 Z\nreferences: []\n\nid: 734d997c30a2208e4cc49cfc83071a6e8c446203\nlog_events: \n- - 2009-05-07 04:15:00.717527 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:13.712926 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 04:00:04.783041 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This may be a duplicate of {issue da8965ea23097589e5b98a3b8c42580329dad12c}.\n"
  },
  {
    "path": "bugs/issue-73b9d9eaea5e3100dfbd016ed74852541fea45b3.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Nothing right\ndesc: |-\n  When i want to open K-3D it is on another language, like china or japan (i\n  don't know).\n  But that's not all: it don't work (with version 0.5.x, 0.6.x and 0.7.x\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-07 04:16:50.381733 Z\nreferences: []\n\nid: 73b9d9eaea5e3100dfbd016ed74852541fea45b3\nlog_events: \n- - 2009-05-07 04:16:51.237604 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:14.910664 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-09-27 01:13:36.946174 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Can't reproduce.\n"
  },
  {
    "path": "bugs/issue-748f4bfe0ef0aca0e383b81aa75f4ea91b90a9fb.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Use the solar position data in other parts of the pipeline.\ndesc: A means of connecting a Sun Position (Vector3 ?) to a Matrix (rotation in particular) so I can point things at the sun, or calculate a building's roof overhang by intersecting a line along a vector from the base of it's wall to the sun, with another line from the top of the wall.  e.g. say I want to let the (mid day) winter/fall sun into the windows of my house from a given date onwards, I need to plot the height of the sun at that time. Having what we know about the sun drive the geometry of the building is the key to energy efficient solar oriented design.\ntype: :feature\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-06-27 15:30:14.762912 Z\nreferences: []\n\nid: 748f4bfe0ef0aca0e383b81aa75f4ea91b90a9fb\nlog_events: \n- - 2009-06-27 15:30:16.226721 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-06-27 15:32:43.574722 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - edited title, description\n  - \"\"\n- - 2009-08-02 22:47:03.999068 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from unassigned\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-7642bc88b925585b8359bf58a5e818edf5575823.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Create a test to validate that code never calls exit().\ndesc: \"\"\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-04-30 05:22:36.017534 Z\nreferences: []\n\nid: 7642bc88b925585b8359bf58a5e818edf5575823\nlog_events: \n- - 2009-04-30 05:22:37.529359 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:00:11.659989 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-19 21:33:24.462772 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-79d92fefbdd858ed65e5dcc7605f304a4d29f4db.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5 After importing k3d file, render doesnt work.\ndesc: |-\n  Contact: marchalas@yahoo.com\n  Summary: After importing k3d file, render doesnt work.\n  Report Generated: 2007-Dec-03 15:27:35 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.1.3 20070831 (prerelease) (Ubuntu 4.1.2-16ubuntu1)\n  Build Time: Sep 13 2007 03:47:14 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:37:15.816725 Z\nreferences: []\n\nid: 79d92fefbdd858ed65e5dcc7605f304a4d29f4db\nlog_events: \n- - 2009-05-19 03:37:16.591663 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:53:12.591024 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-21 05:48:34.665463 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-7b49e59fee09d9c477c0bc0099d17bda335bafc1.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: k3d should use cmake's module to find system boost\ndesc: |-\n  cmake already provides a FindBoost module which could be used as a wrapper\n  for boost.\n  \n  I've put a draft patch at here:\n  http://svn.mandriva.com/cgi-bin/viewvc.cgi/packages/cooker/k3d/current/SOUR\n  CES/k3d-0.7.8.0-fix-boost.patch\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-07 04:09:57.453669 Z\nreferences: []\n\nid: 7b49e59fee09d9c477c0bc0099d17bda335bafc1\nlog_events: \n- - 2009-05-07 04:09:58.309676 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:11.550649 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-02 23:11:30.006875 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - We've completely revamped our boost-related configuration; under the hood we use the standard CMake FindBoost module.\n"
  },
  {
    "path": "bugs/issue-7bc390041917f4dad49790f8eaf5b365add00512.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" Orthographic Toggle doesn't work inside a Tutorial \"\ndesc: \"1-Run the mug tutorial\\n\\\n  2-When it tries to toggle to Orthographic mode nothing happens. It seems\\n\\\n  that the focus on the current viewport is lost.\\n\\\n  Same thing for View->Set View menu.\\n\\n\\\n  Cheers!\\n\\\n  Joaqu\\xC3\\xADn\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-19 03:41:31.160261 Z\nreferences: []\n\nid: 7bc390041917f4dad49790f8eaf5b365add00512\nlog_events: \n- - 2009-05-19 03:41:31.839724 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:03:28.627190 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:06:31.853531 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-7c1f591407ab1ed2d13f8d12ac20f23ba757029b.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Fatal Error\ndesc: |-\n  Contact: zeletik@seznam.cz\n  Summary: Fatal Error\n  Report Generated: 2008-Dec-08 17:46:06 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:\n  When I click on icon of K-3D it shows me a window with \"Caught unknown\n  exception.\n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-06 04:09:37.344491 Z\nreferences: []\n\nid: 7c1f591407ab1ed2d13f8d12ac20f23ba757029b\nlog_events: \n- - 2009-05-06 04:09:38.336473 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:06.534647 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:32:34.998865 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-7d151b992517ccf1a476e994da4ae95f811a0f28.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" vertex selection is not visible\"\ndesc: |-\n  Vertex selection is nigh unusable because the selected vertices are not\n  visible. Please enlarge them (and maybe the non-selected vertices, too for\n  easier selection).\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:31:15.272470 Z\nreferences: []\n\nid: 7d151b992517ccf1a476e994da4ae95f811a0f28\nlog_events: \n- - 2009-05-19 03:31:16.008578 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:22.671075 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 14:49:27.355478 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-7d2708ff9bb5cd775481c46e2c34639a6baece89.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: NGUI startup fails on FreeBSD.\ndesc: |-\n  During startup on FreeBSD 8, initialization of the user interface plugin fails, generating the following error message:\n  \n  CRITICAL: Caught exception [std::runtime_error] - UI plugin module [/home/jared/k3d-build/lib/k3d/plugins/k3d-ngui.module] does not implement k3d::iuser_interface\n  *** Error code 1\n  \n  ... this error means that a dynamic_cast to k3d::iuser_interface is failing, which should never happen since we know that the NGUI does, in fact, implement k3d::iuser_interface.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-02-03 02:02:04.445265 Z\nreferences: []\n\nid: 7d2708ff9bb5cd775481c46e2c34639a6baece89\nlog_events: \n- - 2010-02-03 02:02:11.021207 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-04 02:22:55.512064 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - commented\n  - It looks like this problem is solved using the description at http://gcc.gnu.org/faq.html#dso ... in light of what the FAQ says, it's surprising that this has ever worked with any gcc build !?\n- - 2010-02-06 03:03:49.773614 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Making executable symbols explicitly available to the dynamic linker fixes this issue.\nclaimer: \n"
  },
  {
    "path": "bugs/issue-7f5736e37d226ef0df24d5ff0a103233993c1871.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"Crash deleting a node with property connections with undo/redo disabled:\"\ndesc: |-\n  The following script causes a segfault:\n  \n  #python\n  \n  import k3d\n  doc = context.document\n  \n  camera_name = \"Camera Top\"\n  camera_pos = (0, 0, 10)\n  camera = k3d.plugin.create(\"Camera\", doc)\n  camera.name = camera_name\n  camera_position = k3d.plugin.create(\"FrozenMatrix\", doc)\n  camera_position.matrix = k3d.translate3(camera_pos)\n  #no crash if the following line is commented out\n  k3d.property.connect(doc, camera_position.get_property(\"output_matrix\"), \\\n  camera.get_property(\"input_matrix\"))\n  existing = k3d.node.lookup_one(doc, camera_name)\n  doc.delete_node(existing)\n  \n  The segfault disappears if you a) don't make the property connection, or b) make the deletion undoable.\ntype: :bugfix\ncomponent: K-3D\nrelease: \nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-11-05 04:19:41.731209 Z\nreferences: []\n\nid: 7f5736e37d226ef0df24d5ff0a103233993c1871\nlog_events: \n- - 2010-11-05 04:19:43.067208 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-809dbf8876e9da36c54d116410338e64ea634de7.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Fix SubdivideFaces.\ndesc: Need to update SubdivideFaces to match changes to the polyhedron schema for shells.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-01-01 03:17:29.412511 Z\nreferences: []\n\nid: 809dbf8876e9da36c54d116410338e64ea634de7\nlog_events: \n- - 2010-01-01 03:17:29.860444 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-15 04:46:22.046305 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-80b04a4ce93501dca03dff1f05711e2e22a6cdf7.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"5  Tutorial and Examples - Panel Basics - Timeline short description - continue - Error executing script \"\ndesc: |-\n  Contact: matachuk@gmail.com\n  Summary: Tutorial and Examples - Panel Basics - Timeline short description\n  - continue - Error executing script\n  Report Generated: 2008-Aug-17 10:54:40 UTC\n  Package: k3d\n  Version: 0.7.6.0\n  Platform: Windows-5.1;x86\n  Compiler: 3.4.5 (mingw special)\n  Build Time: Jun 23 2008 19:34:18 local\n  Description of problem:\n  I watched tutorial and after some steps the tutorial stops unexpectedly.\n  \n  Steps to reproduce problem:\n  \n  1. Start Help->Tutorial and Examples and choose Panel Basics, ckick on the\n  Continue Tutorial\n  2. continue with the tutorial\n  3. after Time Line is being mentioned, click on the Continue Tutorial and\n  then the dialog 'Error executing script' will popup\n  \n  Expected results:\n  Tutorial should continue with lessons\n  \n  Actual results:\n  Tutorial is stopped and tutorial tool bar disapears\n  \n  How often does this happen?\n  Every time you try to go to the step after Time Line explanation\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-07 04:11:35.805630 Z\nreferences: []\n\nid: 80b04a4ce93501dca03dff1f05711e2e22a6cdf7\nlog_events: \n- - 2009-05-07 04:11:36.485562 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:02:43.227182 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:05:40.779132 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-810cbd67c6f6737ee2900a8a85fd107e81a416bf.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: help() in python shell locks up K-3D with 0% CPU usage.\ndesc: \"\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-02-05 07:57:21.457261 Z\nreferences: []\n\nid: 810cbd67c6f6737ee2900a8a85fd107e81a416bf\nlog_events: \n- - 2010-02-05 07:57:22.321223 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-05 07:57:56.969314 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Disabled interactive help() in the Python Shell.\nclaimer: \n"
  },
  {
    "path": "bugs/issue-83af56cb47d6d6414fdc911fd5ae4ea45b23691b.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Add a nag message when using experimental plugins.\ndesc: Like it says.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-02-21 05:46:25.778913 Z\nreferences: []\n\nid: 83af56cb47d6d6414fdc911fd5ae4ea45b23691b\nlog_events: \n- - 2010-02-21 05:46:26.330843 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-21 07:08:20.594891 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-85307f5c478fef938ea9202d85d4fb6ca351f82b.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"5 uuid.random wrongly implemented \"\ndesc: |-\n  uuid.random() implementation in Subversion generates only \"00000 ...\" . The\n  code body missed \"uuid_make\" to produce correct uuid value.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:30:39.904679 Z\nreferences: []\n\nid: 85307f5c478fef938ea9202d85d4fb6ca351f82b\nlog_events: \n- - 2009-05-19 03:30:40.681825 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:22.303074 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-02 23:19:16.023057 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Works for me.\n"
  },
  {
    "path": "bugs/issue-87422f875fafba82217cb6ea9926431c664008e1.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Problems selecting points in instanced geometry.\ndesc: |-\n  Steps to reproduce:\n  \n  * Start K-3D.\n  * Create a PolyCube.\n  * Right click on the cube and choose Instantiate.\n  * Use the Translate Tool to offset the new instance so it doesn't overlap with the original.\n  * Choose Select > Points.\n  * Try to select some points in the new instance - doesn't work.\n  * Choose Select > Nodes.\n  * Shift-click on the original instance so both instances are selected.\n  * Choose Select > Points.\n  * Try to select some points in the original instance - corresponding points in both instances are selected.\n  * Choose Select > Edges.\n  * Make selections in both instances - works fine.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-01-02 00:18:21.628527 Z\nreferences: []\n\nid: 87422f875fafba82217cb6ea9926431c664008e1\nlog_events: \n- - 2010-01-02 00:18:22.388479 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-13 01:25:48.086236 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - commented\n  - Turning-off K3D_BUILD_ADVANCED_OPENGL_PAINTERS fixes this issue, need to figure-out where things are going wrong ... VBO point painters?\n- - 2010-02-14 01:35:45.277214 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - We've disabled the experimental VBO points painter, so this will only be an issue when it is finally ready to be released.\nclaimer: \n"
  },
  {
    "path": "bugs/issue-880751463fbb518318275de1613945c253d371d4.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Script with NURBS\ndesc: |-\n  mpetion1@gmail.com writes\n  \n  This attached script is for importing a bv file, which is used here at the\n  Univerisity for research purposes. Initially the script was written in\n  version .6.7 the current script imports a polyhedron type mesh\n  \n  ###########################\n  sample bv file of a cube where 1 denotes the file type (polyhedron)and 8\n  represents the # of vertices, 6 the # of faces\n  1\n  8 6\n  1.0 1.0 -1.0 #points that describe the cube\n  1.0 -1.0 -1.0\n  -1.0 -1.0 -1.0\n  -1.0 1.0 -1.0\n  1.0 0.999999 1.0\n  0.999999 -1.000001 1.0\n  -1.0 -1.0 1.0\n  -1.0 1.0 1.0\n  4 0 1 2 3 #gives the connecting points\n  4 4 7 6 5\n  4 0 4 5 1\n  4 1 5 6 2\n  4 2 6 7 3\n  4 4 0 3 7\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:27:38.616463 Z\nreferences: []\n\nid: 880751463fbb518318275de1613945c253d371d4\nlog_events: \n- - 2009-05-19 03:27:39.296825 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:19.446661 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-11-11 05:35:23.011551 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - The new generic geometric primitive API makes this item obsolete.\n"
  },
  {
    "path": "bugs/issue-895d272b3cce6c0d083757a9b1d22066be7e8d48.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Desktop is all horz lines\ndesc: |-\n  Contact: ladrnbrgr@gmail.com\n  Summary: Desktop is all horz lines\n  Report Generated: 2009-Mar-01 04:46:04 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.3.1\n  Build Time: Aug 26 2008 08:33:39 local\n  Description of problem:\n  When program starts and opens to an untitled document, the screen is full\n  of Horizontal lines\n  Steps to reproduce problem:\n  Launch program\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-06 03:57:04.568248 Z\nreferences: []\n\nid: 895d272b3cce6c0d083757a9b1d22066be7e8d48\nlog_events: \n- - 2009-05-06 03:57:06.040297 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-22 02:50:51.236490 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:50:40.439152 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This may be a duplicate of {issue deed7f51f539b6c62b97c585ed7453b3242c9992}.\n"
  },
  {
    "path": "bugs/issue-8b7048ef71c42a4ddfbd754d0eec458ced28cabb.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Fix the Delete modifier implementation.\ndesc: Need to update the Delete implementation to handle changes to the polyhedron schema for shells.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-01-01 03:14:42.452522 Z\nreferences: []\n\nid: 8b7048ef71c42a4ddfbd754d0eec458ced28cabb\nlog_events: \n- - 2010-01-01 03:14:43.245471 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-01 19:32:19.028475 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-8e23f26186d044718dee4d0c597684d194ebb3ab.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Fix (non-VBO) SDS painter.\ndesc: \"\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-02 21:17:24.375092 Z\nreferences: []\n\nid: 8e23f26186d044718dee4d0c597684d194ebb3ab\nlog_events: \n- - 2009-08-02 21:17:25.359020 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-11 06:56:37.845209 Z\n  - Bart Janssens <bart.janssens@lid.kviv.be>\n  - changed status from unstarted to in_progress\n  - \"\"\n- - 2010-01-12 07:21:33.075814 Z\n  - Bart Janssens <bart.janssens@lid.kviv.be>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-91df55f58cd343ef052644a22be6ed6da975f4ff.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Review plugin categories.\ndesc: Before the release we need to review plugin categories.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-03 15:34:22.468855 Z\nreferences: []\n\nid: 91df55f58cd343ef052644a22be6ed6da975f4ff\nlog_events: \n- - 2009-08-03 15:34:23.444788 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-18 05:59:46.467914 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - edited title, description\n  - \"\"\n- - 2010-02-18 06:00:45.930868 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-9340867dbd5c408b4505e0a5aac01dfd7cf13531.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"5 the viewport is black and i can't see anything thats on it,,, and every window i open leaves a print on the screen like it won't go away \"\ndesc: |-\n  Contact: lordofthedrum@yahoo.com\n  Summary: the viewport is black and i can't see anything thats on it,,, and\n  every window i open leaves a print on the screen like it won't go away\n  Report Generated: 2008-Sep-18 01:55:36 UTC\n  Package: k3d\n  Version: 0.7.9.0\n  Platform: Windows-5.1;x86\n  Compiler: 3.4.5 (mingw special)\n  Build Time: Aug 13 2008 17:13:57 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-07 04:06:40.213645 Z\nreferences: []\n\nid: 9340867dbd5c408b4505e0a5aac01dfd7cf13531\nlog_events: \n- - 2009-05-07 04:06:41.213557 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:09.343073 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:54:56.247058 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This may be a duplicate of {issue da8965ea23097589e5b98a3b8c42580329dad12c}.\n"
  },
  {
    "path": "bugs/issue-93918136ae33aada69f7550025c0fc8b9844630f.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Pick a better component name for \"varying\" components.\ndesc: Choose something other than \"varying\" for K-3D components to avoid confusion with RenderMan \"varying\".\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-12-29 02:44:08.925548 Z\nreferences: []\n\nid: 93918136ae33aada69f7550025c0fc8b9844630f\nlog_events: \n- - 2009-12-29 02:44:10.013477 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-02 06:50:29.364479 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-94d550d30436720fef32ba3311fd367a4b5317d2.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: The last Tutorial cannot be loaded , because of the wrong language\ndesc: |-\n  Contact: SuperMarc1301@gmx.de\n  Summary: The last Tutorial cannot be loaded , because of the wrong\n  language\n  Report Generated: 2008-May-01 19:23:05 UTC\n  Package: k3d\n  Version: 0.6.6.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 6 2007 13:08:21 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1. klick on help --> Tutorials\n  2. klick the last tutorial\n  3. an error occured.\n  \n  Expected results: That the last tut opens\n  \n  Actual results: an error occured\n  \n  How often does this happen? every time\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-19 03:24:44.858168 Z\nreferences: []\n\nid: 94d550d30436720fef32ba3311fd367a4b5317d2\nlog_events: \n- - 2009-05-19 03:24:45.608982 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:02:50.771163 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:05:44.332356 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-956ceb914b4a6b27defd0c78bb54adc3c4893b32.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Create a test to validate copyright notices.\ndesc: \"\"\ntype: :task\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-08 21:50:27.127712 Z\nreferences: []\n\nid: 956ceb914b4a6b27defd0c78bb54adc3c4893b32\nlog_events: \n- - 2009-05-08 21:50:28.887157 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:15.262689 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:36:10.495025 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n- - 2010-05-22 00:35:24.998811 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.1.0 from 1.0.0.0\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-9a2fb7311eae397db36e237be063404532b3b4a0.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Tutorial Error\ndesc: |-\n  Contact: rls@cx3.net\n  Summary: Tutorial Error\n  Report Generated: 2009-Apr-23 04:36:39 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:Tried using tutorial after installation of software.\n  On getting started section it would go for a few lines. Gave message:\n  ERROR executing script\n  \n  Steps to reproduce problem:\n  \n  1. Occurs on each part of the the tutorial\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-06 03:45:23.120332 Z\nreferences: []\n\nid: 9a2fb7311eae397db36e237be063404532b3b4a0\nlog_events: \n- - 2009-05-06 03:45:25.512237 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:00:29.787370 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:05:13.003551 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-9b2e091f7e3b9e36ff649b48155458080d7da913.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Errors creating VirtualOpenGLSDSPainter at startup with advanced painters disabled\ndesc: |-\n  We get harmless-but-annoying errors loading the VirtualOpenGLSDSFacePainter plugin at startup:\n  \n  ERROR: /home/jared/k3d/modules/virtual_opengl_painters/sds_point_painter.cpp line 73: assertion\n  \n  delegate' failed\n  ERROR: Error creating document plugin: VirtualOpenGLSDSPointPainter\n  ERROR: /home/jared/k3d/modules/virtual_opengl_painters/sds_edge_painter.cpp line 73: assertion `delegate' failed\n  ERROR: Error creating document plugin: VirtualOpenGLSDSEdgePainter\n  ERROR: /home/jared/k3d/modules/virtual_opengl_painters/sds_face_painter.cpp line 73: assertion `delegate' failed\n  ERROR: Error creating document plugin: VirtualOpenGLSDSFacePainter\n  \n  ... this is because the UI layer unconditionally loads the virtual SDS painters at startup, but all the\n  SDS painters are in the advanced painter module, which is off by default.\n  \n  We need to: move the SDS painters out of the advanced module; turn the advanced module on by default; don't create\n  SDS painters by default; best - figure-out a way to avoid creating any painters until they're needed.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-02-03 02:04:10.510360 Z\nreferences: []\n\nid: 9b2e091f7e3b9e36ff649b48155458080d7da913\nlog_events: \n- - 2010-02-03 02:04:11.830300 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-06 05:16:24.063715 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - edited title, description\n  - \"\"\n- - 2010-02-14 01:34:32.062239 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - In the short-term, we've disabled all of the experimental painters and enabled the SDS painters, so the advanced painter module can be enabled by default.\nclaimer: \n"
  },
  {
    "path": "bugs/issue-9c495b89016c7cceebed30b1c37286a935f9a2eb.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Update regression tests to use CMake labels\ndesc: Recent versions of CMake allow assignment of user-defined labels to tests, and filtering of tests based on those labels.  Update the current tests to use labels for categorization so we don't have to rely on test names for running categories of tests.\ntype: :task\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-17 06:02:44.983929 Z\nreferences: []\n\nid: 9c495b89016c7cceebed30b1c37286a935f9a2eb\nlog_events: \n- - 2009-05-17 06:02:46.135798 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:15.703064 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:36:21.503067 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n- - 2010-02-21 06:16:44.794873 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-9cc79c6fd45d45ec92cdac3eef3ad3f050bae375.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Double-check that all scripts are working\ndesc: Preferably, create tests to run all scripts.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-07-26 16:51:18.929858 Z\nreferences: []\n\nid: 9cc79c6fd45d45ec92cdac3eef3ad3f050bae375\nlog_events: \n- - 2009-07-26 16:51:19.817759 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-03-13 19:30:23.947488 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-9d6b0d8eaf8d80a966066c342bf1de0dd67869cf.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" the program froze and the clicker got stuck in the top left corner and would not let me move \"\ndesc: |-\n  Contact: william1029384756@yahoo.com\n  Summary: the program froze and the clicker got stuck in the top left corner\n  and would not let me move\n  Report Generated: 2007-Jul-10 05:24:34 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:44:37.681832 Z\nreferences: []\n\nid: 9d6b0d8eaf8d80a966066c342bf1de0dd67869cf\nlog_events: \n- - 2009-05-19 03:44:38.376192 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:49:38.399126 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:39:28.927130 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - The OP doesn't provide enough context to know what was happening at the time; I'm going to assume that is was tutorial-related, since that's the main place where we manipulate the mouse pointer.\n"
  },
  {
    "path": "bugs/issue-9e18e7eda2cde5ef31f3c5d75099f7e5aafbbb70.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Create DissolveEdges and DissolvePoints modifiers.\ndesc: Like it says.\ntype: :task\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-03-17 05:23:47.137293 Z\nreferences: []\n\nid: 9e18e7eda2cde5ef31f3c5d75099f7e5aafbbb70\nlog_events: \n- - 2010-03-17 05:23:48.314235 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-9e5b6f8facf5da51725b10a558ac3560e03d651d.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Rotate and Scale Tools don't work around correct center\ndesc: |-\n  When using the scale or rotate tools on component selections such as faces,\n  the tools don't rotate around the center of the selected geometry.\n  \n  In much earlier versions of k3d this used to work correctly. Something has\n  changed.\n  \n  Tested in SVN from 2007 Nov 27th on Ubuntu Gnu/Linux 7.10 Gutsy.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:38:26.040406 Z\nreferences: []\n\nid: 9e5b6f8facf5da51725b10a558ac3560e03d651d\nlog_events: \n- - 2009-05-19 03:38:26.983623 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:53:20.367034 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-20 06:32:53.313466 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-a121afe2e22a6a972946c3f90472758987ca1d11.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Add LuxRender usage to the Guide.\ndesc: Like it says - there seems to be a fair amount of confusion on how to use LuxRender.\ntype: :feature\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-07-04 19:14:39.467840 Z\nreferences: []\n\nid: a121afe2e22a6a972946c3f90472758987ca1d11\nlog_events: \n- - 2010-07-04 19:14:40.115653 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-a30d997fb6cf859f56794c2ba693d986d109a143.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Replace 'mesh' with 'geometry' in all classes / tests / documentation\ndesc: As discussed at length on the mailing list, the term 'mesh' has strong associations with polygonal meshes, causing confusion for many potential developers.  We have agreed that we will change all related source and documentation to use the more generic term 'geometry' in place of 'mesh'.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-17 04:16:39.648417 Z\nreferences: []\n\nid: a30d997fb6cf859f56794c2ba693d986d109a143\nlog_events: \n- - 2009-05-17 04:16:40.872238 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-05-17 06:17:33.916931 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from unassigned\n  - \"\"\n- - 2010-05-22 00:36:08.598810 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.1.0 from 1.0.0.0\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-a35971476137c99b326c5df30dc1c65c05d251fa.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Generic Primitive Refactoring\ndesc: Complete the action items documented in http://www.k-3d.org/wiki/Generic_Mesh_Primitives - fix all broken plugins and tests.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-04-29 02:07:25.539153 Z\nreferences: []\n\nid: a35971476137c99b326c5df30dc1c65c05d251fa\nlog_events: \n- - 2009-04-29 02:07:26.514654 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 05:31:48.939321 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-a51f6fb9050dd6b4fc6b07052508b122ad181762.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Transform manipulators don't appear when selecting in transform mode\ndesc: |-\n  When starting from an empty selection, selecting something while the transform modifier is active does not\n  make the manipulators appear.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Bart Janssens <bart.janssens@lid.kviv.be>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-01-19 07:11:57.663235 Z\nreferences: []\n\nid: a51f6fb9050dd6b4fc6b07052508b122ad181762\nlog_events: \n- - 2010-01-19 07:12:03.535418 Z\n  - Bart Janssens <bart.janssens@lid.kviv.be>\n  - created\n  - \"\"\n- - 2010-02-12 06:54:12.782219 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-a8c5a1d70781b39476748bd155c24a309d8ff50f.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Add support for binary STL files to STLMeshReader and STLMeshWriter.\ndesc: Like it says.\ntype: :feature\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-02-23 03:49:39.323943 Z\nreferences: []\n\nid: a8c5a1d70781b39476748bd155c24a309d8ff50f\nlog_events: \n- - 2010-02-23 03:49:39.970843 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-05-22 00:29:14.374781 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.1.0 from 1.0.0.0\n  - \"\"\n- - 2010-05-22 00:33:25.078865 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - edited title\n  - \"\"\n- - 2010-06-08 02:20:28.647834 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Implemented by Bart Janssens.\nclaimer: \n"
  },
  {
    "path": "bugs/issue-ab67e65a87a4e7a37e5d858119e62a23fe218e09.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" selecting viewport after exiting tutorial \"\ndesc: |-\n  Contact: mikeh@gopettibone.com\n  Summary: selecting viewport after exiting tutorial\n  Report Generated: 2007-Dec-12 17:16:57 UTC\n  Package: k3d\n  Version: 0.6.6.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 6 2007 13:08:21 local\n  Description of problem:consistent error when selecting within viewport\n  after exiting tutorial\n  \n  Steps to reproduce problem:close tutorial then click LMB in viewport\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-19 03:36:16.744345 Z\nreferences: []\n\nid: ab67e65a87a4e7a37e5d858119e62a23fe218e09\nlog_events: \n- - 2009-05-19 03:36:17.424219 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:03:19.115334 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:06:22.243337 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-ab989d228e5a69168eb8a345a1dd5d59e0e264c0.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" viewport black except when clicking\"\ndesc: |-\n  Contact: ginkgo389@gmail.com\n  Summary: viewport black except when clicking\n  Report Generated: 2008-Dec-13 06:26:38 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.3.1\n  Build Time: Aug 26 2008 08:33:39 local\n  Description of problem:\n  started with viewport incomplete, and black.\n  Steps to reproduce problem:\n  \n  1. Start k-3d `\n  2. look\n  3.observe viewport\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-06 04:09:10.899577 Z\nreferences: []\n\nid: ab989d228e5a69168eb8a345a1dd5d59e0e264c0\nlog_events: \n- - 2009-05-06 04:09:11.648489 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:06.094719 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:52:25.255063 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This may be a duplicate of {issue deed7f51f539b6c62b97c585ed7453b3242c9992}.\n"
  },
  {
    "path": "bugs/issue-abb391e69f742b790e8da66ffaa784db0a5988bb.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Create image-based regression tests for reference painters.\ndesc: \"\"\ntype: :task\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-08-23 23:55:00.567730 Z\nreferences: []\n\nid: abb391e69f742b790e8da66ffaa784db0a5988bb\nlog_events: \n- - 2009-08-23 23:55:01.367688 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-01 03:21:32.180481 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-ac1657b6dc20fb04947f9d412ada980948978fb5.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: the screens gone crazy, just a mess of colors, fresh install, could be driver issue.\ndesc: |-\n  Contact: oliclarke@hotmail.com\n  Summary: the screens gone crazy, just a mess of colors, fresh install,\n  could be driver issue.\n  Report Generated: 2009-Jan-22 21:21:16 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.3.1\n  Build Time: Aug 26 2008 08:33:39 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-06 04:05:16.296456 Z\nreferences: []\n\nid: ac1657b6dc20fb04947f9d412ada980948978fb5\nlog_events: \n- - 2009-05-06 04:05:17.040390 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:03.982676 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:45:16.727176 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This may be a duplicate of {issue deed7f51f539b6c62b97c585ed7453b3242c9992}.\n"
  },
  {
    "path": "bugs/issue-acffc0b1158b9235a406f1e988c574800e4cd368.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: The Tutorial Crashed\ndesc: |-\n  Contact: deskr@comcast.net\n  Summary: The tutorial crashed.\n  Report Generated: 2009-Jan-12 11:02:53 UTC\n  Package: k3d\n  Version: 0.7.6.0\n  Platform: Windows-5.1;x86\n  Compiler: 3.4.5 (mingw special)\n  Build Time: Jun 23 2008 19:34:18 local\n  Description of problem:\n  During the Panel Basics Tutorial, I clicked the green button that advances\n  to the next step, and I recieved an 'Error executing script' message with\n  an OK button. I clicked OK, and it closed the tutorial. I attempted to run\n  the tutorial again, and the same event ocurred at the same point.\n  \n  Steps to reproduce problem:\n  \n  1. Help -> Tutorials and Examples -> Panel Basics\n  2. Run through tutorial.\n  \n  Expected results:\n  \n  The tutorial runs...\n  \n  Actual results:\n  \n  After the step \"The Tool Properties Panel is used to Display Tool-specific\n  options (and resembles the Node Properties Panel) ...,\" pressing the green\n  button to advance instead brings up the \"Error executing script\" window.\n  \n  How often does this happen?\n  \n  Every time i have tried running the tutorial.\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-06 04:05:57.848472 Z\nreferences: []\n\nid: acffc0b1158b9235a406f1e988c574800e4cd368\nlog_events: \n- - 2009-05-06 04:05:58.720443 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:01:15.987193 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:05:29.539200 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-ad39f08267111c35c8e26b5264df5d06af65f718.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Remove legacy code from JoinPoints.\ndesc: Like it says.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-12-29 03:15:04.101551 Z\nreferences: []\n\nid: ad39f08267111c35c8e26b5264df5d06af65f718\nlog_events: \n- - 2009-12-29 03:15:04.708447 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-10 04:52:01.220464 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-ad7ebb0ae83ac37ee352a9775b601e181d460e3d.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" Fatal error \\\"Caught unknown exception\\\"\"\ndesc: |-\n  Contact: itsikbe@gmail.com\n  Summary: Fatal error \"Caught unknown exception\"\n  Report Generated: 2008-Aug-26 22:22:26 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem: I've installed k3d all-in-one, then I've launched\n  the fix for the PATH and reLogged in\n  but when I've tried to start k3d.exe I've got:\n  \n  \"K - 3D Fatal Error\" (title)\n  \"Caught unknown exception\"\n  \n  Steps to reproduce problem:\n  \n  1. Run k3d.exe\n  \n  Expected results: Run the program\n  \n  Actual results:Fatal Error: Caught unknown exception\n  \n  How often does this happen? each time when I run it\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-07 04:09:21.477649 Z\nreferences: []\n\nid: ad7ebb0ae83ac37ee352a9775b601e181d460e3d\nlog_events: \n- - 2009-05-07 04:09:22.301550 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:11.126668 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:55:37.679061 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-ae912d5a99e4737fe82a9576842bf25a9b7a83bf.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Create tests to ensure that new code uses the standard K-3D types.\ndesc: \"\"\ntype: :task\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-04-30 05:26:34.718270 Z\nreferences: []\n\nid: ae912d5a99e4737fe82a9576842bf25a9b7a83bf\nlog_events: \n- - 2009-04-30 05:26:35.581870 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:00:22.427191 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-02 23:09:43.439069 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n- - 2010-05-22 00:34:59.750775 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.1.0 from 1.0.0.0\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-afe8a5c7a2db5849096010a7e4e37ffd246fc5de.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Modifiers break per-face attributes (among others)\ndesc: |-\n  The way things work in RenderMan, you have a lot of\n  flexibility\n  to \"tag\" geometry with attributes of various types -\n  colors, scalars,\n  strings, normals, matrices, etc. You do this tagging\n  at many levels:\n  per-face, per-vertex, per-edge, etc. However, you do\n  have to be\n  consistent: if you provide (in this case) per-face\n  colors for some\n  faces, you must provide them for *all* faces.\n  Polyhedron is doing that\n  fine, but what's happening is that the subsequent\n  ExtrudeFaces modifiers\n  aren't assigning per-face colors for the new faces they\n  create. So the\n  RIB output produced by K-3D isn't valid in this case.\n  \n  The short-term workaround is to use the TagColors\n  modifier with the \"tag\n  faces\" property enabled, to assign colors to all the faces.\n  \n  I will add some sanity checking in our RIB output to\n  catch this scenario\n  and correct it.\n  \n  Longer-term, it's going to be a bear to fix all of the\n  modifiers that\n  aren't generating tags ... doh! But it'll have to be\n  done. I will\n  postpone it to after 0.6 because there are some other\n  performance-related changes to k3d::mesh that will have\n  an impact on the\n  work.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-19 03:51:38.407653 Z\nreferences: []\n\nid: afe8a5c7a2db5849096010a7e4e37ffd246fc5de\nlog_events: \n- - 2009-05-19 03:51:39.103767 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:47:17.207032 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from unassigned\n  - \"\"\n- - 2010-01-09 17:52:03.796477 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - The generic mesh primitives introduced in K-3D 0.7 prevent this from happening.\n"
  },
  {
    "path": "bugs/issue-b143f0495234766027975401fdc8c071ceaccdc2.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Viewport black, unusable.\ndesc: |-\n  The viewport has a large rectangular black hole across it. I cannot do\n  anything. I am Using the Ubuntu 7.10 OS.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:33:52.205809 Z\nreferences: []\n\nid: b143f0495234766027975401fdc8c071ceaccdc2\nlog_events: \n- - 2009-05-19 03:33:52.856340 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:24.383070 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:40:56.351170 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Works here.\n"
  },
  {
    "path": "bugs/issue-b56196fba885cf00f611139e6b09a9135d465338.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Prog quits loading in same place each attempt (see log). Veiwport not active. Pop-up menus, windows,etc won't close ( stay visible in viewport area ) after requested action completes.\ndesc: |-\n  Contact: vorpman@yahoo.com\n  Summary: Prog quits loading in same place each attempt (see log). Veiwport\n  not active. Pop-up menus, windows,etc won't close ( stay visible in\n  viewport area ) after requested action completes.\n  Report Generated: 2008-Jan-05 16:10:23 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:See above.\n  \n  Steps to reproduce problem: Launch K3d on XP SP2\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen? Each attempt to launch.\n  \n  Additional information: Most tools respond in some fashion. Veiwport never\n  created.\n  Always stops loading when Tutorial window opens. Log window shows where\n  loading\n  stops each time. Paste from Log window follows:\n  \n  01/05/2008 10:59:35 INFO: Starting user interface\n  01/05/2008 10:59:35 INFO: Loading hotkeys from C:\\Documents and\n  Settings\\Fred\\Application Data\\.k3d\\hotkeys\n  01/05/2008 10:59:35 INFO: Loading icons from C:\\k3d\\share\\ngui\\rasterized\n  01/05/2008 10:59:35 INFO: Loading icons from C:\\k3d\\share\\ngui\\pixmap\n  01/05/2008 10:59:36 INFO: Loading toolbar layout from\n  C:\\k3d\\share\\ngui\\toolbar_layout.k3d\n  01/05/2008 10:01/05/2008 10:01/05/2008 10:01/05/2008 10:01/05/].01/05/2008 10:01/05/2008 10:01/05/2008 10t_01/05/2008 em01/05/2008 10:0tt01/05/2008 10:01/05/2008ewport::control&, const GdkEventBu01/05/2008 10:01/05/2008 10:01/05/200ode. If that works, could it poossibly be\n  interferance from some other process?\n  Is thisIa Inown bug? Any patch? The FAQ on your site does not seem to\n  address this issue.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:35:21.320424 Z\nreferences: []\n\nid: b56196fba885cf00f611139e6b09a9135d465338\nlog_events: \n- - 2009-05-19 03:35:22.112314 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:57.135034 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-10-19 23:41:54.175004 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-baacef33fb990943146dd8064244e33486e5ea09.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Review plugin status\ndesc: Before the release we need to review each plugin's stable / experimental / deprecated status.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-02-18 06:00:27.643930 Z\nreferences: []\n\nid: baacef33fb990943146dd8064244e33486e5ea09\nlog_events: \n- - 2010-02-18 06:00:28.315875 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-21 05:57:36.498845 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-c08027d5b63ee4951a747d366509431f86626ce3.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Selected polygon face colors rendered incorrectly.\ndesc: |-\n  Is anyone else having trouble seeing the selected face color (red)\n  when selecting polygon faces? Debug output shows the color gets set,\n  but somehow it doesn't show in the viewport (only orientation and\n  normal show up). The code (regular_opengl_painters/face_painter.cpp)\n  seems fine to me, so I suspect this is another bug in the Intel X\n  driver for laptop chipsets. I am using a GM965/GL960 and Ubuntu\n  Jaunty.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-23 23:46:39.829705 Z\nreferences: []\n\nid: c08027d5b63ee4951a747d366509431f86626ce3\nlog_events: \n- - 2009-08-23 23:46:40.749610 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-11-17 05:00:20.826238 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-c15440cffbee3a681e073542040ad92aaa03e211.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: K-3D Fatal Error - Caught unknown exception.\ndesc: |-\n  Contact: jneo@lnsystem.pl\n  Summary: K-3D Fatal Error - Caught unknown exception.\n  Report Generated: 2009-Jan-29 19:33:23 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem: when I start up program the falowing info has came\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-06 04:03:23.816486 Z\nreferences: []\n\nid: c15440cffbee3a681e073542040ad92aaa03e211\nlog_events: \n- - 2009-05-06 04:03:25.104351 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:01.735073 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:51:10.751059 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-c24cff95ec0290dc053789f3749c2d3a576427e6.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Owning document not visible in the NGUIPythonShellDialog context.\ndesc: Although the Python interactive shell is tied to a specific document, the document isn't visible in the shell context.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-10-08 02:41:07.619195 Z\nreferences: []\n\nid: c24cff95ec0290dc053789f3749c2d3a576427e6\nlog_events: \n- - 2010-10-08 02:41:08.316141 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-10-08 02:41:58.032158 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Not much to say - it's fixed :)\nclaimer: \n"
  },
  {
    "path": "bugs/issue-c3442cdcfa64300b26c4e16560338858110051e0.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"5 The 3D view only updates when i hit a buoon that moves or rotates an object \"\ndesc: |-\n  Contact: matt_9999@hotmail.com\n  Summary: The 3D view only updates when i hit a buoon that moves or rotates\n  an object\n  Report Generated: 2008-Apr-25 20:24:11 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:\n  email me and i can sent you a video about it, you probabily cant reproduce\n  it\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:25:50.528831 Z\nreferences: []\n\nid: c3442cdcfa64300b26c4e16560338858110051e0\nlog_events: \n- - 2009-05-19 03:25:51.568731 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:18.150669 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-09-27 01:16:12.818118 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Can't reproduce.\n"
  },
  {
    "path": "bugs/issue-c35b6212ab0df100143b32254a41325252ffec42.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Cleanup RenderMan shaders\ndesc: \"We have lots of shaders that are: redundant, weird, broken, won't build.  Fix the ones that we should keep, and get rid of the ones we shouldn't.\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.1\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-04-16 04:44:03.593225 Z\nreferences: []\n\nid: c35b6212ab0df100143b32254a41325252ffec42\nlog_events: \n- - 2010-04-16 04:44:04.177148 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-04-17 21:17:15.809169 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-c38bd09d7aa33d18d9df72894e7d7f4231a7afa4.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Eliminate legacy mesh code.\ndesc: ExtrudeFaces (and all other legacy plugins) are broken, since conversion between legacy meshes and generic primitives isn't implemented.  Either do the conversion, or refactor the legacy plugins.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-11-21 23:57:59.537310 Z\nreferences: []\n\nid: c38bd09d7aa33d18d9df72894e7d7f4231a7afa4\nlog_events: \n- - 2009-11-21 23:58:00.769253 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-12-01 06:35:52.416307 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - edited title\n  - \"\"\n- - 2009-12-29 03:12:38.645492 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - Splitting this into several individual items, to better reflect the scope of the work.\n"
  },
  {
    "path": "bugs/issue-c3ec9bb8e635c2592d8ee6f80f29b56e939c7be4.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Rubber band selection not visible on OSX.\ndesc: It seems that graphic XOR operations just aren't available on OSX at all, we likely have to completely revisit how we render rubber-band selections.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-03 14:52:24.626335 Z\nreferences: []\n\nid: c3ec9bb8e635c2592d8ee6f80f29b56e939c7be4\nlog_events: \n- - 2009-08-03 14:52:25.403251 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-11-14 04:22:27.956574 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Switched to rendered-highlighting, instead of playing tricks with framebuffer bits.\n"
  },
  {
    "path": "bugs/issue-c4141d8b96026e37fc47c03ec3a610eb76d255e4.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Need alternative interaction modes for use with trackpads.\ndesc: Currently, K-3D is difficult to use without a three-button mouse, and totally unusable with trackpads.  Explore alternative keyboard/mouse mappings to address this.\ntype: :feature\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-08-03 15:46:31.379461 Z\nreferences: []\n\nid: c4141d8b96026e37fc47c03ec3a610eb76d255e4\nlog_events: \n- - 2009-08-03 15:46:32.215311 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-c4fac5d4134a27c60a732f65c7aca6d081d888bd.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Pass normals to the LuxRender engine.\ndesc: Currently, normal attribute data is ignored when rendering in LuxRender.  Pass the data along.\ntype: :feature\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-07-19 23:34:29.094984 Z\nreferences: []\n\nid: c4fac5d4134a27c60a732f65c7aca6d081d888bd\nlog_events: \n- - 2009-07-19 23:34:30.782971 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-20 06:18:18.478924 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-c566b10c51cf9be076002e098a80e627f7e57ad7.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"5 \\\"Duplicated\\\" nodes after importing a .k3d \"\ndesc: \"Steps\\n\\\n  1- Run the script from\\n\\\n  http://k-3d.org/wiki/User:JoaquinDuo/Freeze_Script\\n\\\n  with the \\\"new\\\" mode\\n\\\n  2- This will create a document containing only the freezed objects.\\n\\\n  3- Save it\\n\\\n  4- New document -> import the last file\\n\\\n  5- Try to set the default GL painter for the object\\n\\\n  6- Displays Duplicated GL default painter node\\n\\n\\\n  Saludos!\\n\\\n  Joaqu\\xC3\\xADn\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:38:57.032547 Z\nreferences: []\n\nid: c566b10c51cf9be076002e098a80e627f7e57ad7\nlog_events: \n- - 2009-05-19 03:38:57.799861 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:53:23.183212 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 14:56:17.750756 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-c5bb24ef560d028232ce7243e179caf89232424a.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Ensure polyhedron shells are updated correctly.\ndesc: There is probably a lot of code that doesn't update polyhedron shells correctly.  In particular, when appending faces to a polyhedron we usually just increment the shell face count, but this isn't correct, since the current schema assumes that all faces for a given shell are adjacent within the face table.  That means that filters that create new faces need to do inserts instead of appends, or we need to rethink how we handle shells.  One option would be to add a \"shell number\" array to the face table, so that it wouldn't matter whether the faces in a given shell are scattered throughout the face table.  This would have the additional benefit of simplifying lots of code that otherwise has to update the face count for a shell.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-12-26 17:22:42.581537 Z\nreferences: []\n\nid: c5bb24ef560d028232ce7243e179caf89232424a\nlog_events: \n- - 2009-12-26 17:22:43.365497 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-09 17:47:32.420464 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - After changing the way the polyhedron schema stores shells, it should be much more difficult to get them wrong.\n"
  },
  {
    "path": "bugs/issue-c60b33c866619f09ee3d9d98a588097c246dce9d.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Eliminate libuuid dependency.\ndesc: It would be nice if we could switch to using the uuid support in Boost to eliminate our dependency on libuuid (requires Boost 1.42).  This assumes that Boost 1.42-or-better is widely available (i.e. on Ubuntu).\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-05-14 04:30:13.142803 Z\nreferences: []\n\nid: c60b33c866619f09ee3d9d98a588097c246dce9d\nlog_events: \n- - 2010-05-14 04:30:16.262745 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-05-22 00:33:06.414879 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - edited title, description\n  - \"\"\n- - 2010-06-08 04:50:30.243459 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Updated our Boost dependency to 1.42, which provides UUID functionality, and provided our own fallback implementation of the Boost 1.43 boost::uuids::random_generator.\nclaimer: \n"
  },
  {
    "path": "bugs/issue-c62d4189ed3035ce0a2c7896f97007ac715a1159.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5  Prompt for camera when splitting viewport panel\ndesc: |-\n  Like it says ... we prompt for a camera when the user *mounts* a new\n  viewport panel, we should do the same when splitting an existing viewport\n  panel.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:49:19.479814 Z\nreferences: []\n\nid: c62d4189ed3035ce0a2c7896f97007ac715a1159\nlog_events: \n- - 2009-05-19 03:49:20.128404 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:48:45.551021 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from unassigned\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-c7068025feb6bc837b3c8238689cbd2808e602ec.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: The 3d environment view is not stable; scrambles and freezes when moving objects\ndesc: |-\n  Contact: jocceus@live.com\n  Summary: The 3d environment view is not stable; scrambles and freezes when\n  moving objects\n  Report Generated: 2009-Jan-25 21:11:55 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.3.1\n  Build Time: Aug 26 2008 08:33:39 local\n  Description of problem: When running any 3d program the enviroment freezes\n  or scrambles when moving objects\n  \n  Steps to reproduce problem: Open program, insert object, and attempt to\n  move object.\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-06 04:04:00.656484 Z\nreferences: []\n\nid: c7068025feb6bc837b3c8238689cbd2808e602ec\nlog_events: \n- - 2009-05-06 04:04:01.736181 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:02.567069 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:51:50.071048 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This may be a duplicate of {issue deed7f51f539b6c62b97c585ed7453b3242c9992}.\n"
  },
  {
    "path": "bugs/issue-c88402eb19c30deba7254e8583c5554e169b4ee2.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Edge selection broken.\ndesc: Currently, interactive selection of polyhedron edges does nothing.  Point and face selection still seem to work fine.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-03 03:25:39.263237 Z\nreferences: []\n\nid: c88402eb19c30deba7254e8583c5554e169b4ee2\nlog_events: \n- - 2009-08-03 03:25:39.807127 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-21 05:26:50.809458 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-c920698bb22ce982c3f377ceebe1c146ff08fa9e.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Add explicit check / nag screen when loading legacy documents.\ndesc: Like it says.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-01-01 03:51:58.501547 Z\nreferences: []\n\nid: c920698bb22ce982c3f377ceebe1c146ff08fa9e\nlog_events: \n- - 2010-01-01 03:51:59.029477 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-27 23:42:23.922874 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-caa327a1b446cc943f4f8563d11862bb9a323006.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Make SUSE 10.2, make install, try to run and go boom.. LOL\ndesc: |-\n  Contact: prh@cemtach.com\n  Summary: Make SUSE 10.2, make install, try to run and go boom.. LOL\n  Report Generated: 2007-Apr-21 07:32:24 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-linux-gnu\n  Compiler: 4.1.2 20061115 (prerelease) (SUSE Linux)\n  Build Time: Apr 20 2007 15:29:04 local\n  Description of problem:\n  \n  Did standard install with internal boost library and it dies upon starting.\n  The initial screens come up (with the little guy), but dies shortly after\n  that..\n  \n  hayes/src> /usr/local/k3d/bin/k3d\n  \n  (k3d:22286): GdkGLExt-WARNING **: cannot load PangoFont\n  /usr/local/k3d/bin/k3d: line 180: 22286 Segmentation fault\n  /usr/local/k3d/bin/k3d-bin --options /home/hayes/.k3d/options.k3d --plugins\n  /usr/local/k3d/lib/k3d --shadercache /home/hayes/.k3d/shadercache --share\n  /usr/local/k3d/share/k3d --tutorials /usr/local/k3d/share/k3d/tutorials\n  --ui /usr/local/k3d/lib/libk3dngui.so\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:48:19.199766 Z\nreferences: []\n\nid: caa327a1b446cc943f4f8563d11862bb9a323006\nlog_events: \n- - 2009-05-19 03:48:19.903752 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:48:58.287127 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-11-11 05:37:55.931560 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-cbc65707315095a3c85694e09e179f711248ae01.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Display component selections when adding a selection modifier.\ndesc: When adding a geometry selection modifier to the pipeline, component selection visibility isn't enabled, making it impossible to see the effects of the modifier and causing user confusion.  We need a mechanism so the UI layer can turn-on component selection visibility in the MeshInstance when a selection modifier is created.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-11-24 07:09:39.658326 Z\nreferences: []\n\nid: cbc65707315095a3c85694e09e179f711248ae01\nlog_events: \n- - 2009-11-24 07:09:40.442279 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-cf2cdc4985a66db59f55052f03c3c620237b451f.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Program hang loading documents in OSX release build.\ndesc: Like it says ... document.serialization.properties and sdk.xml-xpath display this behavior - the process is 'hung' with zero CPU, and can't be killed.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-03-14 04:38:33.032053 Z\nreferences: []\n\nid: cf2cdc4985a66db59f55052f03c3c620237b451f\nlog_events: \n- - 2010-03-14 04:38:34.423257 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-03-21 17:06:48.779232 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - |-\n    This issue manifests during k3d::xml::xpath parsing as a program hang when doing XPath matching with an attribute-value test.\n    For example, line 101 of k3d/tests/sdk/xml_xpath.cpp when doing a match on /k3d/nodes/node/properties/property[@user_property][@type='double']\n    Upgrading from Apple gcc 4.0.1 to XCode 3.1.4 and 686-apple-darwin9-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5577) fixes the problem.\nclaimer: \n"
  },
  {
    "path": "bugs/issue-cfefcca75810ec3b784ee014ff12c2b345d0e37d.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5 Components move via typeng wont be saved\ndesc: |-\n  Details:\n  \n  Steps to reproduce it.\n  \n  1- create an object\n  2- Select one or more vertexes\n  3- Select a transformation tool\n  3- Type a transformation from the Tool properties panel\n  4- Save the document\n  5- Open it again\n  6- You won't see any transformation on points.\n  \n  Ubuntu 8.10\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-06 04:08:15.024350 Z\nreferences: []\n\nid: cfefcca75810ec3b784ee014ff12c2b345d0e37d\nlog_events: \n- - 2009-05-06 04:08:16.496431 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:05.623076 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-21 05:47:18.897465 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-d171dd355a94e4b8c639dce81bab88f3b30ad4c1.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: K3D disappeared\ndesc: |-\n  Contact: b.lewkow@chello.fr\n  Summary: K3D disappeared\n  Report Generated: 2008-May-23 00:50:49 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i586-mandriva-linux-gnu\n  Compiler: 4.2.2 20071128 (prerelease) (4.2.2-2mdv2008.1)\n  Build Time: Feb 3 2008 00:45:58 local\n  Description of problem:\n  i klicked some many symbols on the create tab and then it disappeared\n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-07 04:16:09.749696 Z\nreferences: []\n\nid: d171dd355a94e4b8c639dce81bab88f3b30ad4c1\nlog_events: \n- - 2009-05-07 04:16:10.453719 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:14.503066 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:31:30.943039 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Works here.\n"
  },
  {
    "path": "bugs/issue-d33d9c38e1484b8ca1380cee2cc381a58073f2b8.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Confirm that all sample documents are working.\ndesc: \"\"\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-15 16:21:29.338826 Z\nreferences: []\n\nid: d33d9c38e1484b8ca1380cee2cc381a58073f2b8\nlog_events: \n- - 2009-08-15 16:21:30.330763 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-06 08:01:53.951609 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-d641db2e9857dad68c2cb5cddad523f6a11a9f4c.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Problems with rendering\ndesc: |-\n  Contact: shashank.araokar@gmail.com\n  Summary: Problems with rendering\n  Report Generated: 2007-Aug-14 20:26:51 UTC\n  Package: k3d\n  Version: 0.6.6.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.1.2 20070106 (prerelease) (Ubuntu 4.1.1-21ubuntu7)\n  Build Time: Jan 16 2007 15:55:06 local\n  Description of problem:\n  The program often simply crashes when F12 is pressed. Changing the preview\n  engine is often\n  not reflected. Trying to create a preview simply does nothing.\n  \n  Steps to reproduce problem:\n  \n  1. Add a cone in the viewport\n  2. Press F12 and try the same with engines (the program said I did not have\n  any installed)\n  \n  Expected results:\n  Either a result or an error\n  \n  Actual results:\n  Program crashes or does absolutely nothing\n  \n  How often does this happen?\n  Always\n  \n  Additional information:\n  The program simply says that some engine executable is missing (only once\n  in the runtime).\n  Thereafter neither an error nor a result is seen.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:42:35.864548 Z\nreferences: []\n\nid: d641db2e9857dad68c2cb5cddad523f6a11a9f4c\nlog_events: \n- - 2009-05-19 03:42:36.631966 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:50:04.407070 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:20:23.631068 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Works here.\n"
  },
  {
    "path": "bugs/issue-d7a44bff78ad31a7e7a6762e37c67cc721882f83.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Fix MergeCollinearEdges.\ndesc: Need to update MergeCollinearEdges to match changes to the polyhedron schema for shells.\ntype: :task\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-01-01 03:16:11.910723 Z\nreferences: []\n\nid: d7a44bff78ad31a7e7a6762e37c67cc721882f83\nlog_events: \n- - 2010-01-01 03:16:12.821467 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-01 03:18:58.036546 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - edited title\n  - \"\"\n- - 2010-01-17 16:54:15.430299 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n- - 2010-02-21 06:13:44.962876 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-d8ead7e3cb76c1f6312855dfb1007959bf2a81a3.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Fix Collada reader.\ndesc: Doesn't compile due to code changes.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-08-02 21:17:51.231052 Z\nreferences: []\n\nid: d8ead7e3cb76c1f6312855dfb1007959bf2a81a3\nlog_events: \n- - 2009-08-02 21:17:52.454985 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-06 05:01:07.295628 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n- - 2010-05-22 00:36:29.918796 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.1.0 from 1.0.0.0\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-da7d93a9b31ed0769f5b56af3f388737dd957b7f.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Normals flipped when extruding 0 m\ndesc: |-\n  Summary: Normals are flipped (point inwards) when extruding a face 0m and\n  moving the face afterwards via the move tool.\n  \n  Steps to reproduce:\n  \n  1. Create a cube (or whatever)\n  2. Go into face mode and select a face\n  3. Use the \"Modify|Mesh|Extrude Faces\" command\n  4. Go into the Node Properties panel and change the distance value to \"0\n  m\"\n  5. Go into move mode (press w) and move the face manually. Than you will\n  see that the normals of the newly created polygons of the extrusion point\n  inwards.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:28:11.072707 Z\nreferences: []\n\nid: da7d93a9b31ed0769f5b56af3f388737dd957b7f\nlog_events: \n- - 2009-05-19 03:28:12.272543 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:19.806678 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-21 05:49:16.809456 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-da8965ea23097589e5b98a3b8c42580329dad12c.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"Viewport update problems with Windows Vista \"\ndesc: |-\n  Contact: tammys-dad@hotmail.com\n  Summary: viewport won't clear.It keeps overwriting previous material.\n  Report Generated: 2007-Apr-26 02:49:57 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:anything in viewport remains there.It keeps stacking\n  up on itself.\n  \n  Steps to reproduce problem:I tried uninstalling and reinstalling,problem\n  remains. Using Vista.\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-19 03:47:43.767814 Z\nreferences: []\n\nid: da8965ea23097589e5b98a3b8c42580329dad12c\nlog_events: \n- - 2009-05-19 03:47:44.448534 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:49:05.206955 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-11-11 05:37:01.892575 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This is a duplicate of {issue 432f8b1d7711eb5d22d6046d20bc006c18d5090b}.\n"
  },
  {
    "path": "bugs/issue-daee8a01c7a1e37079658831fb65738559dc0493.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Replace interactive tutorial code with ATK-based tests\ndesc: As described in http://www.k-3d.org/wiki/User_Interface_Testing - remove K-3D's interactive tutorial code, simplify all UI components, and replace existing UI regression tests with alternatives such as ATK-based tests.\ntype: :task\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-04-29 02:14:17.324186 Z\nreferences: []\n\nid: daee8a01c7a1e37079658831fb65738559dc0493\nlog_events: \n- - 2009-04-29 02:14:18.668078 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-05-22 00:30:21.166779 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Because the Qt work is going so well, this would be wasted effort.\nclaimer: \n"
  },
  {
    "path": "bugs/issue-dbaae5eafd86c96dd10c4636fee6dbcf4a6223d2.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Paint-deselection broken.\ndesc: Although paint *selection* works, paint *deselection* seems to be broken.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-03 15:28:25.625127 Z\nreferences: []\n\nid: dbaae5eafd86c96dd10c4636fee6dbcf4a6223d2\nlog_events: \n- - 2009-08-03 15:28:26.945147 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-28 07:12:08.445775 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-dbc9bdf294e3af3096d5b7b0777fbd501dbec183.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" We need edge bevelling\"\ndesc: We need edge bevelling\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:50:17.799652 Z\nreferences: []\n\nid: dbc9bdf294e3af3096d5b7b0777fbd501dbec183\nlog_events: \n- - 2009-05-19 03:50:18.519703 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:48:09.694995 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from unassigned\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-dbddd7fdc90195a94e62d0ae6440ac9d90308f40.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: ConnectVertices problem with concave polys\ndesc: See attached.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:52:05.479968 Z\nreferences: []\n\nid: dbddd7fdc90195a94e62d0ae6440ac9d90308f40\nlog_events: \n- - 2009-05-19 03:52:06.151593 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:47:11.967028 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from unassigned\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-dc74ee9aa83bfe125ef4948bd8e8a46d3b895167.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"closed tutorial window, created nurb sphere, app crashed - ID: 2761553\"\ndesc: |-\n  Contact: youngpj@tesco.net\n  Summary: closed tutorial window, created nurb sphere, app crashed\n  Report Generated: 2009-Apr-14 10:13:55 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i386-redhat-linux-gnu\n  Compiler: 4.3.0 20080326 (Red Hat 4.3.0-5)\n  Build Time: Apr 1 2008 17:35:02 local\n  Description of problem:the prog keeps crashing!\n  that's about as descriptive as it gets, sorry\n  \n  Steps to reproduce problem: see summary\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-06 03:52:10.368356 Z\nreferences: []\n\nid: dc74ee9aa83bfe125ef4948bd8e8a46d3b895167\nlog_events: \n- - 2009-05-06 03:52:16.024324 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:02:34.259245 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:05:26.251097 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-dcaa8d49244983968dcc3d24b45671270e0238ba.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Fix cuda mesh functionality.\ndesc: \"\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-08-02 21:19:11.047050 Z\nreferences: []\n\nid: dcaa8d49244983968dcc3d24b45671270e0238ba\nlog_events: \n- - 2009-08-02 21:19:11.918991 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-deed7f51f539b6c62b97c585ed7453b3242c9992.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: K-3D viewport onlys shows a black screen when starting application while Compiz fusion enabled on Ubuntu 8.04\ndesc: |-\n  Contact: fate.bennett@gmail.com\n  Summary: K-3D viewport onlys shows a black screen when starting application\n  while Compiz fusion enabled on Ubuntu 8.04\n  Report Generated: 2008-Aug-31 05:39:14 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.2.3 (Ubuntu 4.2.3-2ubuntu1)\n  Build Time: Feb 27 2008 23:29:50 local\n  Description of problem:\n  When starting K-3D, only a black screen is visible in the main window under\n  Viewport. I'm new to this\n  application, and I do see an X and Y Grid pop up for a second when I\n  attempt to create a new object such as a cube or cone, and then\n  the screen goes black again.\n  Steps to reproduce problem:\n  \n  1. Install Ubuntu 8.04\n  2. Enable desktop effects\n  3. Install K-3D using Synaptic package manager\n  4. Start the application, and only a black screen under Viewport should be\n  visible\n  5. Try creating a cube, and the black screen should display the workspace\n  grid for about a\n  half second.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-07 04:08:04.573467 Z\nreferences: []\n\nid: deed7f51f539b6c62b97c585ed7453b3242c9992\nlog_events: \n- - 2009-05-07 04:08:05.125307 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:10.263073 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-10-19 04:18:21.199118 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - This is a known issue with Compiz and DRI, it is addressed by DRI2.  To mitigate the problem, I've added a CheckCompiz plugin that warns end-users if Compiz is running when they start K-3D.\n"
  },
  {
    "path": "bugs/issue-e200400ec942d61b5d25ff523fbc59331e5cd00c.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: bug report for scripting issue\ndesc: |-\n  http://sourceforge.net/forum/forum.php?thread_id=1772963&forum_id=34831\n  \n  keeping in mind that I'm a total newbie to this and I should probably just\n  learn how to create before I tackle scripting; that said Ive tried\n  opening/playing any and all scripts that I have. Basically ones that came\n  with the program upon installation. There's a file extention of py and pyc\n  for each file. I tried editing a file and adding #python on the 1st line\n  but that didnt work. Ive attached a file for you.\n  \n  hope this helps a bit. lemme know if you need any more info.\n  thanks\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:45:02.880102 Z\nreferences: []\n\nid: e200400ec942d61b5d25ff523fbc59331e5cd00c\nlog_events: \n- - 2009-05-19 03:45:03.599829 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:49:34.607030 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-11-14 06:32:28.644573 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Can't reproduce.\n"
  },
  {
    "path": "bugs/issue-e223abcb170a54b129321cb4020ec090b91aa06d.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Restore selection-conversion functionality.\ndesc: Selection conversion when switching selection modes in the UI was commented-out during the transition to generic primitives / selections.  Restore it.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-21 05:51:29.057538 Z\nreferences: []\n\nid: e223abcb170a54b129321cb4020ec090b91aa06d\nlog_events: \n- - 2009-08-21 05:51:29.889466 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-10-17 03:45:51.769060 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-e24dc27f9e5a9b6debdc7fbacdaef0390aa835b5.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5 Rotate manipulator works wrong on multiple viewports\ndesc: \"Having multiples viewports makes the rotate manipulator work wrong.\\n\\n\\\n  Steps:\\n\\\n  1-Create several viewports\\n\\\n  2-Try to manipulate an object on one viewport other that the \\\"main\\\"\\n\\\n  viewport\\n\\\n  3-The selected manipulator is chosen as if the user were clicking on the\\n\\\n  \\\"main\\\" viewport (using the current user coordinates to select the\\n\\\n  manipulator on the \\\"main\\\" viewport coordinates).\\n\\n\\\n  I guess this should also happen to the move and rotate manipulator.\\n\\n\\\n  Cheers!\\n\\\n  Joaqu\\xC3\\xADn\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:37:50.096255 Z\nreferences: []\n\nid: e24dc27f9e5a9b6debdc7fbacdaef0390aa835b5\nlog_events: \n- - 2009-05-19 03:37:51.168218 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:53:16.463128 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-20 06:32:40.393454 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-e345f325aab4099f88dfc47616a86d4ddea54db3.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"5  K-3D crashes on pipeline panel \"\ndesc: |-\n  On k3d 0.7 on linux ubuntu\n  while selecting a object if the user makes several undos and the pipeline\n  panel is open the system crashes\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-19 03:25:18.866223 Z\nreferences: []\n\nid: e345f325aab4099f88dfc47616a86d4ddea54db3\nlog_events: \n- - 2009-05-19 03:25:19.664928 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:17.694650 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-11-11 03:46:00.899548 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - The tree extraction filter was crashing if the requested root vertex was out-of-bounds.\n"
  },
  {
    "path": "bugs/issue-e4ab51a81942250ae3e8a0ecff44c1e0b329859e.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: will not let me use polygons\ndesc: |-\n  Contact: SeamonkeyC1@AOL.com\n  Summary: will not let me use polygons\n  Report Generated: 2008-May-03 05:47:56 UTC\n  Package: k3d\n  Version: 0.7.3.0\n  Platform: Windows-5.1;x86\n  Compiler: 3.4.5 (mingw special)\n  Build Time: Apr 19 2008 21:46:44 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:23:33.224471 Z\nreferences: []\n\nid: e4ab51a81942250ae3e8a0ecff44c1e0b329859e\nlog_events: \n- - 2009-05-19 03:23:34.097240 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:16.951069 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:30:21.838658 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Works here.\n"
  },
  {
    "path": "bugs/issue-e4e3a8d3d7b0effd24b47227a38154c7f9ad1af1.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Material Manager crashes\ndesc: Mount a material manager panel -> boom!\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2010-04-17 15:23:53.081184 Z\nreferences: []\n\nid: e4e3a8d3d7b0effd24b47227a38154c7f9ad1af1\nlog_events: \n- - 2010-04-17 15:23:53.593123 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-04-17 21:19:57.921139 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.1\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-e695dc7181caa53d244666975fcb9416d23456d6.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: shortcuts assignment is wacky\ndesc: |-\n  Contact: kartalgoz@bluebottle.com\n  Summary: shortcuts assignment is wacky\n  Report Generated: 2007-Jan-15 14:32:04 UTC\n  Package: k3d\n  Version: 0.6.6.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 6 2007 13:08:21 local\n  Description of problem:i cannot assign keys like \"a\" to any function\n  \n  Steps to reproduce problem:\n  \n  1. start shortcut mode by pressing insert\n  2. goto face from select menu\n  3. press \"aa\n  \n  Expected results:using a as shortcut\n  \n  Actual results: does not happen\n  \n  How often does this happen?everytime\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:51:09.376554 Z\nreferences: []\n\nid: e695dc7181caa53d244666975fcb9416d23456d6\nlog_events: \n- - 2009-05-19 03:51:10.047953 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:47:29.015138 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from unassigned\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-e7da3769c8568a8dd24b895d954ce0f2afb278fb.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"It can't read the 5th tutorial. \"\ndesc: |-\n  Contact: daniel.craven@hotmail.com\n  Summary: It can't read the 5th tutorial.\n  Report Generated: 2008-Mar-29 12:46:53 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem: A box appears which sais that it can't read the 5th\n  chapter of the tutorials, because it has a different scripting language.\n  \n  Steps to reproduce problem: Open menu Help, open submenu Tutorials, open\n  chapter 5. GTS Boolean (Advanced).\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-19 03:29:10.912901 Z\nreferences: []\n\nid: e7da3769c8568a8dd24b895d954ce0f2afb278fb\nlog_events: \n- - 2009-05-19 03:29:11.584033 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-15 06:02:56.067209 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-07-15 06:06:11.459166 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-e7e2260686f43af5350ced8daf3fd52f748b7d4d.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: programs not starting\ndesc: |-\n  Contact: darius_persaud@yahoo.com\n  Summary: programs not starting\n  Report Generated: 2008-Oct-01 00:59:35 UTC\n  Package: k3d\n  Version: 0.7.9.0\n  Platform: Windows-5.1;x86\n  Compiler: 3.4.5 (mingw special)\n  Build Time: Aug 13 2008 17:13:57 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-07 04:05:59.285456 Z\nreferences: []\n\nid: e7e2260686f43af5350ced8daf3fd52f748b7d4d\nlog_events: \n- - 2009-05-07 04:06:00.693561 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:08.847077 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:30:40.318846 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-e7f06c793e88c43060dc24a5e7b645e87f5c3372.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Segfault using autocompletion in the NGUIPythonShellDialog\ndesc: Entering \"context.__class__;.\" then hitting \"tab\" in the shell caused a segfault.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.1.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-10-08 02:39:58.782010 Z\nreferences: []\n\nid: e7f06c793e88c43060dc24a5e7b645e87f5c3372\nlog_events: \n- - 2010-10-08 02:40:01.091118 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-10-08 02:41:40.339124 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Reimplemented autocompletion using the rlcompleter module that is part of the official Python distribution.\nclaimer: \n"
  },
  {
    "path": "bugs/issue-e83e4967aac6828eb4e02208edacd68d23252cde.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5 Animation rendering code can't handle negative time values\ndesc: |-\n  The main animation loops in the RenderMan and Yafray engines convert the\n  start and end times to unsigned integers, then loop over them to create\n  frames. This won't work for ranges of negative time - we need to be\n  smarter about how we map the range of times to be rendered to frame\n  names.\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:49:47.991804 Z\nreferences: []\n\nid: e83e4967aac6828eb4e02208edacd68d23252cde\nlog_events: \n- - 2009-05-19 03:49:48.527694 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:47:48.734983 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from unassigned\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-e86ef362f926037001e1c60a9fedea2822620595.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"5  Array out of bounds in point painter \"\ndesc: |-\n  I'm not sure how to reproduce this, since it actually happened when my cat\n  jumped up on the keyboard. :)\n  \n  Either way, in point_vbo::on_execute, an array range check failed on line\n  114:\n  glBufferData(GL_ARRAY_BUFFER, sizeof(points[0]) * points.size(),\n  &points[0], GL_STATIC_DRAW);\n  \n  It seems like the \"points\" array is empty, which means the points[0] will\n  fail. Not sure if it's even supposed to get there if point size is zero,\n  which is why someone who knows about it should have a look.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-07 04:13:10.997672 Z\nreferences: []\n\nid: e86ef362f926037001e1c60a9fedea2822620595\nlog_events: \n- - 2009-05-07 04:13:11.981614 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:12.399083 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-05 06:47:45.919072 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Changes to the way we validate geometric primitives should prevent this from happening from now on.\n"
  },
  {
    "path": "bugs/issue-eab8f46b39c3ce8da3052e6c33ad2942556f3c8d.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" BevelFaces only works on one face at a time? \"\ndesc: |-\n  I am trying to bevel faces. SO i select the faces and apply bevel from\n  create-polygons-bevel faces. It does not do anything. But if i use right\n  click mesh modifier-bevel, it works. Problem with that one is that it does\n  not work with multiple face selection, it only applies to one of the\n  selected faces\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:50:42.743748 Z\nreferences: []\n\nid: eab8f46b39c3ce8da3052e6c33ad2942556f3c8d\nlog_events: \n- - 2009-05-19 03:50:43.407681 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:47:39.919075 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-21 05:49:05.441464 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-ebaf6c348e0fa045023a7a486ea7c70969f96dde.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \"5 Didn't do much of anything exept mess with a tube, and import another tube, tried to render, no preview, no frame render, no nothing, messed with the render settings, tried to make a new one, nothing, saved, quit K3d reloded K3d loaded the file, still can't render. \"\ndesc: |-\n  Contact: mayapaladin@gmail.com\n  Summary: Didn't do much of anything exept mess with a tube, and import\n  another tube, tried to render, no preview, no frame render, no nothing,\n  messed with the render settings, tried to make a new one, nothing, saved,\n  quit K3d reloded K3d loaded the file, still can't render.\n  Report Generated: 2007-Aug-23 16:44:44 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:No rendering\n  \n  Steps to reproduce problem:\n  \n  1.create poly tube\n  2.rotate 90` save as 90` tube\n  3. save as 90` tube\n  4.mess with the faces, extruding and undoing a few times.\n  5.import 90`tube file\n  6.resise new tube\n  7.try and render while inside the objects\n  8.it doesn't work so zoom out.\n  9.no render\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:42:05.504249 Z\nreferences: []\n\nid: ebaf6c348e0fa045023a7a486ea7c70969f96dde\nlog_events: \n- - 2009-05-19 03:42:06.176001 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:50:09.431027 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-11-11 05:41:41.227550 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-ec7e14fd48fc42fd5b2ca9a3d30caf4f1b027c1a.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" Segmentation fault (core dumped)\"\ndesc: |-\n  Contact: gabriel.andrey@medecine.unige.ch\n  Summary: Segmentation fault (core dumped)\n  Report Generated: 2007-Aug-08 15:51:33 UTC\n  Package: k3d\n  Version: 0.6.6.0\n  Platform: i486-pc-linux-gnu\n  Compiler: 4.1.2 20070106 (prerelease) (Ubuntu 4.1.1-21ubuntu7)\n  Build Time: Jan 16 2007 15:55:06 local\n  Description of problem:\n  \n  Steps to reproduce problem:\n  \n  1. in command line k3d it crash after the splah screen\n  2. launching with log-level debug it crash right after: INFO: Loading\n  toolbar layout from /usr/share/k3d/ngui/toolbar_layout.k3d\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  all the time\n  Additional information:\n  Ubuntu Feisty 7.04\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:43:41.544049 Z\nreferences: []\n\nid: ec7e14fd48fc42fd5b2ca9a3d30caf4f1b027c1a\nlog_events: \n- - 2009-05-19 03:43:42.192236 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:49:48.407028 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:19:02.639170 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Works fine here.\n"
  },
  {
    "path": "bugs/issue-ee2fe3f71ced0add4f940683db864c5cfe7422d9.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Generic Selection Refactoring\ndesc: Complete the action items documented at http://www.k-3d.org/wiki/Generic_Mesh_Selection\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-04-29 02:08:16.267882 Z\nreferences: []\n\nid: ee2fe3f71ced0add4f940683db864c5cfe7422d9\nlog_events: \n- - 2009-04-29 02:08:17.867786 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-19 23:37:03.630949 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-eefe2f1c031bdf2fbe9723b6baf8aaa7a6daac91.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: k3d crashes. File not saved. Frame not saved\ndesc: |-\n  Contact: super_bisquit@yahoo.com\n  Summary: k3d crashes. File not saved. Frame not saved\n  Report Generated: 2009-Feb-03 02:53:15 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: x86_64-pc-linux-gnu\n  Compiler: 4.3.1\n  Build Time: Jun 22 2008 18:29:22 local\n  Description of problem: k3d would crash when rendring a previewframe.\n  \n  Steps to reproduce problem: I don't know. I'm not trying to reproduce it,\n  I'm trying to stop it.\n  \n  1.\n  2.\n  3.\n  \n  Expected results:\n  \n  Actual results:\n  \n  How often does this happen?\n  \n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-06 03:59:55.792278 Z\nreferences: []\n\nid: eefe2f1c031bdf2fbe9723b6baf8aaa7a6daac91\nlog_events: \n- - 2009-05-06 03:59:56.768496 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:51:57.951068 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-22 01:02:32.601499 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-efc598f7db94d366529406ccc835541ed77da749.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Segfault connecting an output property to an input property\ndesc: \"Steps:\\n\\\n  1- create a cube\\n\\\n  2- go to the instance node\\n\\\n  3- connect the input_mesh property to the output_mesh property of the same\\n\\\n  node\\n\\\n  4- crashes\\n\\n\\\n  Cheers!\\n\\\n  Joaqu\\xC3\\xADn\"\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-19 03:40:35.960222 Z\nreferences: []\n\nid: efc598f7db94d366529406ccc835541ed77da749\nlog_events: \n- - 2009-05-19 03:40:36.736067 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:50:23.879022 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 14:59:10.253048 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Cannot reproduce.\n"
  },
  {
    "path": "bugs/issue-f0214576609193a60f014f6c1b55e5b01af8197d.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Problems with Axes text labels\ndesc: |-\n  But I still have a problem with the text labels of the Axes node, they\n  all seem to read Z but it is in wire-frame and light gray, basically\n  unreadable, and changing the font does not help, but you can see the\n  size change.\n  \n  This is using \"make run\" from the build directory. I also tried\n  copying the fonts to the /k3d-build/share/fonts dir and also\n  installing them on my system with sudo cp *.ttf\n  /usr/share/fonts/truetype/; sudo fc-cache -f -v\n  \n  Text annotations 2D and 3D work without a problem.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-07-20 04:12:18.454952 Z\nreferences: []\n\nid: f0214576609193a60f014f6c1b55e5b01af8197d\nlog_events: \n- - 2009-07-20 04:12:19.622889 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-11-15 06:38:16.986581 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-f20b5cc0c3904cfa8ec18ee3c7753e4bbff69d4e.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: White Screen on startup\ndesc: |-\n  Contact: whitejediguy@gmail.com\n  Summary: White Screen on startup\n  Report Generated: 2008-Jul-20 04:07:04 UTC\n  Package: k3d\n  Version: 0.6.7.0\n  Platform: i686-pc-mingw32\n  Compiler: 3.4.4 (mingw special)\n  Build Time: Jan 23 2007 09:37:14 local\n  Description of problem:Just open in updated VistaWhere it should be black\n  when I open the program, it is white.. If I minimize then maximize, it will\n  be black. Cannot see anything I have made previously.. This is windows\n  vista\n  \n  Steps to reproduce problem\n  \n  1. :Just open in updated Vista\n  2. try adding anything to the viewport and nothing happens\n  3.\n  \n  Expected results:\n  should work normally as before\n  Actual results:\n  white screen, cannot do anything\n  How often does this happen?\n  everytime now\n  Additional information:\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :reorg\ncreation_time: 2009-05-07 04:14:21.541544 Z\nreferences: []\n\nid: f20b5cc0c3904cfa8ec18ee3c7753e4bbff69d4e\nlog_events: \n- - 2009-05-07 04:14:22.662315 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:13.262679 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 03:57:06.399199 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition reorg\n  - This may be a duplicate of {issue da8965ea23097589e5b98a3b8c42580329dad12c}.\n"
  },
  {
    "path": "bugs/issue-f70081ac577a3f841537885c3d1d3af7f23f5aef.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: CMakeCache.txt have wrong path\ndesc: |-\n  CMakeCache.txt have your own path, wrong on any other pcs:\n  \n  CMake Error: The current CMakeCache.txt directory\n  /home/anubis/Desktop/k3d-source-0.7.11.0/CMakeCache.txt is different than\n  the directory /home/bartj/d/3d/k3d-release where CMackeCache.txt was\n  created. This may result in binaries being created in the wrong place. If\n  you are not sure, reedit the CMakeCache.txt\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :wontfix\ncreation_time: 2009-05-06 03:54:28.096410 Z\nreferences: []\n\nid: f70081ac577a3f841537885c3d1d3af7f23f5aef\nlog_events: \n- - 2009-05-06 03:54:32.488316 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-07-22 02:47:47.436479 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-03 00:16:14.526852 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition wontfix\n  - Can't find anyplace in the code where there's a hard-coded path as described by the OP.  Either it's already cleaned-up, or some other issue.\n"
  },
  {
    "path": "bugs/issue-f7a6867233d707004a53404495ec68af38de7dc2.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: MakeSDS segfault.\ndesc: |-\n  Steps to reproduce:\n  \n  * Start K-3D.\n  * Create a PolyCube.\n  * Right-click on the cube and choose Mesh Modifier > MakeSDS\n  * Segfault with the following output:\n  \n  DEBUG: SDS create timings: Total: 0.0007319, copy input: 1.6909e-05 (2.31029%), calculate companions/point to face: 0.00032312 (44.1482%), calculate indices: 0.000109156 (14.914%), allocate memory: 7.10989e-05 (9.7143%), subdivide topology: 2.19508e-05 (2.99916%), vertex valences: 2.81077e-05 (3.84037%)\n  DEBUG: SDS update timings: Total: 0.00153288, face centers: 0.000555908 (36.2655%), edge midpoints: 0.000259009 (16.8968%), point positions: 0.000253795 (16.5567%)\n  Segmentation fault (core dumped)\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-01-01 03:48:25.796512 Z\nreferences: []\n\nid: f7a6867233d707004a53404495ec68af38de7dc2\nlog_events: \n- - 2010-01-01 03:48:26.509507 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-01-19 03:53:50.509215 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-f838455f2a342a4d7c1d2aa13e3bd4d459d9c289.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Support grouped inset in ExtrudeFaces\ndesc: Currently, the inset property is ignored when grouping is enabled in ExtrudeFaces.  Make it work again.\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2010-02-23 04:02:01.458926 Z\nreferences: []\n\nid: f838455f2a342a4d7c1d2aa13e3bd4d459d9c289\nlog_events: \n- - 2010-02-23 04:02:02.026851 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2010-02-27 06:35:42.570878 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\nclaimer: \n"
  },
  {
    "path": "bugs/issue-fd6e33c28fa0b3d7a02b1c4972bc5577b61d8838.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: 5 Mouse jumps to right screen border with manipulators\ndesc: |-\n  My mouse cursor jumps to the right border of my primary screen (note: I\n  have a dual screen setup, my primary is on the right). This happens\n  whenever you have nothing selected and select something while you either\n  use the move, rotate or scale tool (those with manipulators). I used an svn\n  build of today (30.03.08) which is build via mingw on windows xp.\n  \n  Steps to reproduce:\n  \n  1. Open K3D\n  2. Create a poly cube\n  3. Press space to deselect it\n  4. go into either move, rotate or scale mode (w,e,r)\n  5. Click on the cube and the mouse jumps to the right border of your screen\ntype: :bugfix\ncomponent: K-3D\nrelease: 1.0.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :unstarted\ndisposition: \ncreation_time: 2009-05-19 03:28:41.368708 Z\nreferences: []\n\nid: fd6e33c28fa0b3d7a02b1c4972bc5577b61d8838\nlog_events: \n- - 2009-05-19 03:28:42.240542 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:20.230708 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-08-20 06:32:25.281472 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 1.0.0.0 from 0.8.0.0\n  - \"\"\n"
  },
  {
    "path": "bugs/issue-ff8b9cee50b4d5422d195a8a64467eaca0b11ded.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: Complete refactoring the set of geometric primitive component names and selections.\ndesc: Like it says.\ntype: :task\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Timothy M. Shead <tshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-08-02 21:16:35.958951 Z\nreferences: []\n\nid: ff8b9cee50b4d5422d195a8a64467eaca0b11ded\nlog_events: \n- - 2009-08-02 21:16:36.935002 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-23 20:50:33.213543 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - Done, and not a minute too soon.\n"
  },
  {
    "path": "bugs/issue-ff93d0f500a475dc818ff0f85fa530f5fbc58be0.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/issue \ntitle: \" Mesh disappears after Modify|Mesh|CatmullClark \"\ndesc: |-\n  Meshes always disappear when using the CatmullClark command. I'm using the\n  \"official\" 0.7.2.0 build for windows.\n  \n  Steps to reproduce:\n  \n  1. Create a cube\n  2. Select the cube\n  3. Click on Modify|Mesh|CatmullClark\ntype: :bugfix\ncomponent: K-3D\nrelease: 0.8.0.0\nreporter: Beverly L. Shead <bshead@k-3d.com>\nstatus: :closed\ndisposition: :fixed\ncreation_time: 2009-05-19 03:29:41.768645 Z\nreferences: []\n\nid: ff93d0f500a475dc818ff0f85fa530f5fbc58be0\nlog_events: \n- - 2009-05-19 03:29:42.536589 Z\n  - Beverly L. Shead <bshead@k-3d.com>\n  - created\n  - \"\"\n- - 2009-08-02 22:52:21.471071 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - assigned to release 0.8.0.0 from unassigned\n  - \"\"\n- - 2009-11-15 16:17:09.197260 Z\n  - Timothy M. Shead <tshead@k-3d.com>\n  - closed with disposition fixed\n  - \"\"\n"
  },
  {
    "path": "bugs/project.yaml",
    "content": "--- !ditz.rubyforge.org,2008-03-06/project \nname: K-3D\nversion: \"0.5\"\ncomponents: \n- !ditz.rubyforge.org,2008-03-06/component \n  name: K-3D\nreleases: \n- !ditz.rubyforge.org,2008-03-06/release \n  name: 0.7.11.0\n  status: :released\n  release_time: 2009-03-19 04:17:40.762513 Z\n  log_events: \n  - - 2009-03-19 04:17:30.288207 Z\n    - Timothy M. Shead <tshead@k-3d.com>\n    - created\n    - \"\"\n  - - 2009-03-19 04:17:40.762532 Z\n    - Timothy M. Shead <tshead@k-3d.com>\n    - released\n    - \"\"\n- !ditz.rubyforge.org,2008-03-06/release \n  name: 0.8.0.0\n  status: :released\n  release_time: 2010-04-07 04:41:08.206138 Z\n  log_events: \n  - - 2009-04-29 01:21:57.847477 Z\n    - Timothy M. Shead <tshead@k-3d.com>\n    - created\n    - \"\"\n  - - 2010-04-07 04:41:08.206160 Z\n    - Timothy M. Shead <tshead@k-3d.com>\n    - released\n    - \"\"\n- !ditz.rubyforge.org,2008-03-06/release \n  name: 0.8.0.1\n  status: :released\n  release_time: 2010-04-20 17:04:23.619456 Z\n  log_events: \n  - - 2010-04-16 04:43:07.032042 Z\n    - Timothy M. Shead <tshead@k-3d.com>\n    - created\n    - \"\"\n  - - 2010-04-20 17:04:23.619477 Z\n    - Timothy M. Shead <tshead@k-3d.com>\n    - released\n    - \"\"\n- !ditz.rubyforge.org,2008-03-06/release \n  name: 0.8.1.0\n  status: :unreleased\n  release_time: \n  log_events: \n  - - 2010-05-14 04:28:28.798785 Z\n    - Timothy M. Shead <tshead@k-3d.com>\n    - created\n    - \"\"\n- !ditz.rubyforge.org,2008-03-06/release \n  name: 1.0.0.0\n  status: :unreleased\n  release_time: \n  log_events: \n  - - 2009-04-29 01:22:55.792756 Z\n    - Timothy M. Shead <tshead@k-3d.com>\n    - created\n    - \"\"\n"
  },
  {
    "path": "cmake/dashboards/continuous-debug.cmake",
    "content": "# Setup default test variables ... \nSET(CTEST_CMAKE_COMMAND \"\\\"${CMAKE_EXECUTABLE_NAME}\\\"\")\nSET(CTEST_COMMAND \"\\\"${CTEST_EXECUTABLE_NAME}\\\" -D Continuous -E benchmark -A \\\"${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}\\\"\")\nSET(CTEST_SOURCE_DIRECTORY \"${CTEST_SCRIPT_DIRECTORY}/../..\")\n#SET(CTEST_START_WITH_EMPTY_BINARY_DIRECTORY_ONCE TRUE)\n\nSET(CTEST_INITIAL_CACHE \"\n\nCMAKE_BUILD_TYPE:STRING=Debug\nK3D_BUILD_GLX_MODULE:BOOL=OFF\nK3D_BUILD_VIRTUAL_OFFSCREEN_MODULE:BOOL=OFF\nK3D_ENABLE_TESTING:BOOL=ON\n$ENV{K3D_EXTRA_INITIAL_CACHE}\n\n\")\n\nSET(CTEST_CONTINUOUS_DURATION 960)\nSET(CTEST_CONTINUOUS_MINIMUM_INTERVAL 10)\n\n# Allow the caller to override test variables ... note that the caller MUST specify CTEST_BINARY_DIRECTORY at-a-minimum.\nSET(VARIABLE)\nFOREACH(ARGUMENT ${CTEST_SCRIPT_ARG})\n\tIF(VARIABLE)\n\t\tSET(${VARIABLE} ${ARGUMENT})\n\t\tSET(VARIABLE)\n\tELSE(VARIABLE)\n\t\tSET(VARIABLE ${ARGUMENT})\n\tENDIF(VARIABLE)\nENDFOREACH(ARGUMENT)\n\n"
  },
  {
    "path": "cmake/dashboards/nightly-coverage.cmake",
    "content": "# Setup default test variables ... \nSET(CTEST_CMAKE_COMMAND \"\\\"${CMAKE_EXECUTABLE_NAME}\\\"\")\nSET(CTEST_COMMAND \"\\\"${CTEST_EXECUTABLE_NAME}\\\" -D Nightly -A \\\"${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}\\\"\")\nSET(CTEST_SOURCE_DIRECTORY \"${CTEST_SCRIPT_DIRECTORY}/../..\")\nSET(CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)\n\nSET(CTEST_INITIAL_CACHE \"\n\nCMAKE_BUILD_TYPE:STRING=Debug\nK3D_BUILD_GLX_MODULE:BOOL=OFF\nK3D_BUILD_VIRTUAL_OFFSCREEN_MODULE:BOOL=OFF\nK3D_ENABLE_TESTING:BOOL=ON\n$ENV{K3D_EXTRA_INITIAL_CACHE}\n\n\")\n\nSET(CTEST_ENVIRONMENT\n  \"CFLAGS=-g -O0 -fprofile-arcs -ftest-coverage\"\n  \"CXXFLAGS=-g -O0 -fprofile-arcs -ftest-coverage\"\n  \"LDFLAGS=-fprofile-arcs -ftest-coverage\"\n)\n\n# Allow the caller to override test variables ... note that the caller MUST specify CTEST_BINARY_DIRECTORY at-a-minimum.\nSET(VARIABLE)\nFOREACH(ARGUMENT ${CTEST_SCRIPT_ARG})\n\tIF(VARIABLE)\n\t\tSET(${VARIABLE} ${ARGUMENT})\n\t\tSET(VARIABLE)\n\tELSE(VARIABLE)\n\t\tSET(VARIABLE ${ARGUMENT})\n\tENDIF(VARIABLE)\nENDFOREACH(ARGUMENT)\n\n"
  },
  {
    "path": "cmake/dashboards/nightly-debug.cmake",
    "content": "# Setup default test variables ... \nSET(CTEST_CMAKE_COMMAND \"\\\"${CMAKE_EXECUTABLE_NAME}\\\"\")\nSET(CTEST_COMMAND \"\\\"${CTEST_EXECUTABLE_NAME}\\\" -D Nightly -A \\\"${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}\\\"\")\nSET(CTEST_SOURCE_DIRECTORY \"${CTEST_SCRIPT_DIRECTORY}/../..\")\nSET(CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)\n\nSET(CTEST_INITIAL_CACHE \"\n\nCMAKE_BUILD_TYPE:STRING=Debug\nK3D_BUILD_GLX_MODULE:BOOL=OFF\nK3D_BUILD_VIRTUAL_OFFSCREEN_MODULE:BOOL=OFF\nK3D_ENABLE_TESTING:BOOL=ON\n$ENV{K3D_EXTRA_INITIAL_CACHE}\n\n\")\n\n# Allow the caller to override test variables ... note that the caller MUST specify CTEST_BINARY_DIRECTORY at-a-minimum.\nSET(VARIABLE)\nFOREACH(ARGUMENT ${CTEST_SCRIPT_ARG})\n\tIF(VARIABLE)\n\t\tSET(${VARIABLE} ${ARGUMENT})\n\t\tSET(VARIABLE)\n\tELSE(VARIABLE)\n\t\tSET(VARIABLE ${ARGUMENT})\n\tENDIF(VARIABLE)\nENDFOREACH(ARGUMENT)\n\n"
  },
  {
    "path": "cmake/dashboards/nightly-release.cmake",
    "content": "# Setup default test variables ... \nSET(CTEST_CMAKE_COMMAND \"\\\"${CMAKE_EXECUTABLE_NAME}\\\"\")\nSET(CTEST_COMMAND \"\\\"${CTEST_EXECUTABLE_NAME}\\\" --track Nightly-Release -D Nightly -A \\\"${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}\\\"\")\nSET(CTEST_SOURCE_DIRECTORY \"${CTEST_SCRIPT_DIRECTORY}/../..\")\nSET(CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)\n\nSET(CTEST_INITIAL_CACHE \"\n\nCMAKE_BUILD_TYPE:STRING=Release\nK3D_BUILD_DEVELOPMENT_MODULE:BOOL=OFF\nK3D_BUILD_EULER_OPERATIONS_MODULE:BOOL=OFF\nK3D_BUILD_GLX_MODULE:BOOL=OFF\nK3D_BUILD_LSYSTEM_MODULE:BOOL=OFF\nK3D_BUILD_QSLIM_MODULE:BOOL=OFF\nK3D_BUILD_VIRTUAL_OFFSCREEN_MODULE:BOOL=OFF\nK3D_ENABLE_DISTRIBUTION:BOOL=ON\nK3D_ENABLE_TESTING:BOOL=ON\n$ENV{K3D_EXTRA_INITIAL_CACHE}\n\n\")\n\n# Allow the caller to override test variables ... note that the caller MUST specify CTEST_BINARY_DIRECTORY at-a-minimum.\nSET(VARIABLE)\nFOREACH(ARGUMENT ${CTEST_SCRIPT_ARG})\n\tIF(VARIABLE)\n\t\tSET(${VARIABLE} ${ARGUMENT})\n\t\tSET(VARIABLE)\n\tELSE(VARIABLE)\n\t\tSET(VARIABLE ${ARGUMENT})\n\tENDIF(VARIABLE)\nENDFOREACH(ARGUMENT)\n\n"
  },
  {
    "path": "cmake/modules/FindK3DAsciiDoc.cmake",
    "content": "INCLUDE(K3DParseArguments)\n\nFIND_PROGRAM(ASCIIDOC_COMMAND asciidoc)\nFIND_PROGRAM(A2X_COMMAND a2x)\n\nFUNCTION(K3D_ADD_ASCIIDOC_MAN_PAGE DOCUMENT_NAME)\n\tK3D_PARSE_ARGUMENTS(DOCUMENT \"SOURCE;DESTINATION\" \"\" ${ARGN})\n\n\tSET(ARGUMENTS \"\")\n#\tLIST(APPEND ARGUMENTS --attribute docinfo)\n#\tLIST(APPEND ARGUMENTS --doctype manpage)\n#\tLIST(APPEND ARGUMENTS --backend docbook)\n#\tLIST(APPEND ARGUMENTS --out-file ${CMAKE_CURRENT_BINARY_DIR}/${DOCUMENT_NAME}.xml)\n\tLIST(APPEND ARGUMENTS --format manpage)\n\tLIST(APPEND ARGUMENTS --destination-dir ${DOCUMENT_DESTINATION})\n\n\tADD_CUSTOM_COMMAND(\n\t\tCOMMAND ${CMAKE_COMMAND} -E make_directory ${DOCUMENT_DESTINATION}\n\t\tOUTPUT ${DOCUMENT_DESTINATION}\n\t\t)\n\n\tADD_CUSTOM_COMMAND(\n\t\tDEPENDS ${DOCUMENT_SOURCE} ${DOCUMENT_DESTINATION}\n\t\tWORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n\t\tCOMMAND ${A2X_COMMAND} ${ARGUMENTS} ${DOCUMENT_SOURCE}\n\t\tOUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${DOCUMENT_NAME}\n\t\t)\n\n\tADD_CUSTOM_TARGET(${DOCUMENT_NAME} ALL\n\t\tDEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${DOCUMENT_NAME}\n\t\t)\nENDFUNCTION()\n"
  },
  {
    "path": "cmake/modules/K3DCompileResource.cmake",
    "content": "# Setup a macro for compiling resources ...\nMACRO(K3D_COMPILE_RESOURCE OUTPUT INPUT RESOURCE_PATH)\n\n\tSET(INPUT_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/${INPUT}\")\n\tSET(OUTPUT_FILE \"${CMAKE_CURRENT_BINARY_DIR}/${INPUT}.cpp\")\n\tGET_FILENAME_COMPONENT(OUTPUT_PATH ${OUTPUT_FILE} PATH)\n\n\tGET_TARGET_PROPERTY(K3D_RESOURCE_COMPILER k3d-resource-compiler LOCATION)\n\n\tADD_CUSTOM_COMMAND(\n\t\tDEPENDS k3d-resource-compiler\n\t\tDEPENDS ${INPUT_FILE}\n\t\tCOMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_PATH}\n\t\tCOMMAND ${K3D_RESOURCE_COMPILER} --input ${INPUT_FILE} --path \\\"<path>${RESOURCE_PATH}</path>\\\" --output ${OUTPUT_FILE}\n\t\tOUTPUT ${OUTPUT_FILE}\n\t\tCOMMENT \"Compiling resource ${INPUT_FILE}\"\n\t\t)\n\n\tLIST(APPEND ${OUTPUT} ${OUTPUT_FILE})\n\nENDMACRO(K3D_COMPILE_RESOURCE)\n"
  },
  {
    "path": "cmake/modules/K3DCompiler.cmake",
    "content": "IF(APPLE AND CMAKE_BUILD_TYPE STREQUAL \"Release\")\n\tEXECUTE_PROCESS(\n\t\tCOMMAND ${CMAKE_CXX_COMPILER} --version\n\t\tOUTPUT_VARIABLE K3D_COMPILER_VERSION\n\t)\n\n\tIF(K3D_COMPILER_VERSION MATCHES \"4.0.1\")\n\t\tMESSAGE(SEND_ERROR \"The Apple gcc 4.0.1 compiler produces release binaries that fail at runtime.  Try the gcc 4.2 compiler included in recent version of XCode instead.  See http://developer.k-3d.org/tracker/issue-cf2cdc4985a66db59f55052f03c3c620237b451f.html for details.\")\n\tENDIF()\nENDIF()\n\n"
  },
  {
    "path": "cmake/modules/K3DDependencies.cmake",
    "content": "INCLUDE(K3DParseArguments)\n\nFUNCTION(K3D_CHECK CONFIG)\n\tK3D_PARSE_ARGUMENTS(BUILD \"REQUIRES;RESOURCE;URL;MESSAGE\" \"\" ${ARGN})\n\n\tIF(CONFIG STREQUAL \"K-3D\" OR ${CONFIG})\n\t\tFOREACH(REQUIREMENT ${BUILD_REQUIRES})\n\t\t\tIF(NOT ${REQUIREMENT})\n\t\t\t\tIF(BUILD_RESOURCE AND BUILD_URL)\n\t\t\t\t\tMESSAGE(SEND_ERROR \"${CONFIG} requires ${BUILD_RESOURCE}, which can be obtained from ${BUILD_URL}. ${BUILD_MESSAGE}\")\n\t\t\t\tELSEIF(BUILD_RESOURCE)\n\t\t\t\t\tMESSAGE(SEND_ERROR \"${CONFIG} requires ${BUILD_RESOURCE}. ${BUILD_MESSAGE}\")\n\t\t\t\tELSE()\n\t\t\t\t\tMESSAGE(SEND_ERROR \"${CONFIG} requires ${REQUIREMENT}. ${BUILD_MESSAGE}\")\n\t\t\t\tENDIF()\n\t\t\tENDIF()\n\t\tENDFOREACH()\n\tENDIF()\nENDFUNCTION()\n\nFUNCTION(K3D_ADD_SUBDIRECTORY DIRECTORY)\n\tK3D_PARSE_ARGUMENTS(DIRECTORY \"REQUIRES\" \"\" ${ARGN})\n\n\tFOREACH(REQUIREMENT ${DIRECTORY_REQUIRES})\n\t\tIF(NOT ${REQUIREMENT})\n\t\t\tRETURN()\n\t\tENDIF()\n\tENDFOREACH()\n\n\tADD_SUBDIRECTORY(${DIRECTORY})\nENDFUNCTION()\n\nFUNCTION(K3D_ADD_CUSTOM_TARGET TARGET_NAME)\n\tK3D_PARSE_ARGUMENTS(TARGET \"REQUIRES;COMMAND\" \"\" ${ARGN})\n\n\tFOREACH(REQUIREMENT ${TARGET_REQUIRES})\n\t\tIF(NOT ${REQUIREMENT})\n\t\t\tRETURN()\n\t\tENDIF()\n\tENDFOREACH()\n\n\tADD_CUSTOM_TARGET(${TARGET_NAME} COMMAND ${TARGET_COMMAND})\nENDFUNCTION()\n\nFUNCTION(K3D_ADD_LIBRARY LIBRARY_NAME)\n\tADD_LIBRARY(${LIBRARY_NAME} ${ARGN})\n\tSET_TARGET_PROPERTIES(${LIBRARY_NAME} PROPERTIES VERSION \"${K3D_SO_VERSION}\")\nENDFUNCTION()\n\nMACRO(K3D_ADD_LIBRARY LIBRARY_NAME)\n\tADD_LIBRARY(${LIBRARY_NAME} ${ARGN})\n\tSET_TARGET_PROPERTIES(${LIBRARY_NAME} PROPERTIES VERSION \"${K3D_SO_VERSION}\")\nENDMACRO()\n\n"
  },
  {
    "path": "cmake/modules/K3DFind3ds.cmake",
    "content": "SET(K3D_3DS_FOUND FALSE)\n\n#Unix configuration\nIF(UNIX AND NOT APPLE)\n\tFIND_PATH(K3D_3DS_INCLUDE_PATH /lib3ds\n\t\t/usr/local/include\n\t\t/usr/include\n\t\tDOC \"Directory where the lib3ds header files are located\"\n\t\t)\n\t\n\tFIND_LIBRARY(K3D_3DS_LIBRARY\n\t\tNAMES 3ds\n\t\tPATHS\n\t\t/usr/local/lib\n\t\t/usr/lib\n\t\tDOC \"The lib3ds library\"\n\t\t)\n\t\nENDIF(UNIX AND NOT APPLE)\n\t\n#Apple configuration\nIF(UNIX AND APPLE)\n\tFIND_PATH(K3D_COLLADA_DOM_INCLUDE_PATH /lib3ds\n\t\t/Library/Frameworks/lib3ds.framework\n\t\tDOC \"Directory where the lib3ds header files are located\"\n\t\t)\n\n\tFIND_LIBRARY(K3D_3DS_LIBRARY\n\t\tNAMES lib3ds\n\t\tPATHS\n\t\t/Library/Frameworks/lib3ds.framework\n\t\tDOC \"The lib3ds library\"\n\t\t)\n\nENDIF(UNIX AND APPLE)\n\n#Windows configuration\nIF(WIN32)\n\tFIND_PATH(K3D_3DS_INCLUDE_PATH lib3ds/\n\t\tC:/Program Files/lib3ds/include\n\t\tDOC \"Directory where the lib3ds header files are located\"\n\t\t)\n\t\n\tFIND_LIBRARY(K3D_3DS_LIBRARY\n\t\tNAMES lib3ds\n\t\tPATHS\n\t\tC:/Program Files/lib3ds/lib/\n\t\tDOC \"The lib3ds library\"\n\t\t)\nENDIF(WIN32)\n\nMARK_AS_ADVANCED(K3D_3DS_INCLUDE_PATH)\t\nMARK_AS_ADVANCED(K3D_3DS_LIBRARY)\n\nSET(K3D_3DS_INCLUDE_DIRS ${K3D_3DS_INCLUDE_PATH})\nSET(K3D_3DS_LIBS ${K3D_3DS_LIBRARY})\n\nIF(WIN32)\n    SET(K3D_3DS_LIBS ${K3D_3DS_LIBS}) # pcrecpp pcre)\nENDIF(WIN32)\n\nIF(K3D_3DS_INCLUDE_PATH AND K3D_3DS_LIBRARY)\n\tSET(K3D_3DS_FOUND TRUE)\nENDIF(K3D_3DS_INCLUDE_PATH AND K3D_3DS_LIBRARY)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindBoost.cmake",
    "content": "SET(K3D_BOOST_INCLUDE_DIR \"\" CACHE PATH \"Override the default location for Boost header files.\")\nSET(K3D_BOOST_LIBRARY_DIR \"\" CACHE PATH \"Override the default location for Boost libraries.\")\nSET(K3D_BOOST_USE_MULTITHREADED OFF CACHE BOOL \"Use multithreaded Boost libraries.\")\n\nSET(BOOST_INCLUDEDIR ${K3D_BOOST_INCLUDE_DIR})\nSET(BOOST_LIBRARYDIR ${K3D_BOOST_LIBRARY_DIR})\nSET(Boost_ADDITIONAL_VERSIONS 1.43 1.43.0)\nSET(Boost_USE_MULTITHREADED ${K3D_BOOST_USE_MULTITHREADED})\nFIND_PACKAGE(Boost 1.42 COMPONENTS ${K3D_BOOST_COMPONENTS} REQUIRED)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindCARVE.cmake",
    "content": "SET(K3D_CARVE_FOUND 0)\n\nFIND_PATH(K3D_CARVE_INCLUDE_DIR carve\n\t/usr/include\n\t/usr/local/include\n\tDOC \"Directory where the carve directory, containing the headers, is located\"\n\t)\nMARK_AS_ADVANCED(K3D_CARVE_INCLUDE_DIR)\n\nFIND_LIBRARY(K3D_CARVE_LIBRARY intersect\n\tDOC \"The CARVE polyhedron boolean library\"\n\t)\nMARK_AS_ADVANCED(K3D_CARVE_LIBRARY)\n\nIF(K3D_CARVE_INCLUDE_DIR AND K3D_CARVE_LIBRARY)\n\tSET(K3D_CARVE_FOUND 1)\nENDIF()\n\n"
  },
  {
    "path": "cmake/modules/K3DFindCGAL.cmake",
    "content": "SET(K3D_CGAL_FOUND 0)\n\nFIND_PATH(K3D_CGAL_INCLUDE_DIR CGAL\n\t/usr/include\n\t/usr/local/include\n\tDOC \"Directory where the CGAL header directory is located\"\n\t)\nMARK_AS_ADVANCED(K3D_CGAL_INCLUDE_DIR)\n\nFIND_LIBRARY(K3D_CGAL_LIBRARY CGAL\n\tDOC \"The CGAL library\"\n\t)\nMARK_AS_ADVANCED(K3D_CGAL_LIBRARY)\n\nFIND_LIBRARY(K3D_MPFR_LIBRARY mpfr\n\tDOC \"The mpfr library\"\n\t)\nMARK_AS_ADVANCED(K3D_MPFR_LIBRARY)\n\nFIND_LIBRARY(K3D_GMP_LIBRARY gmp\n\tDOC \"The GMP library\"\n\t)\nMARK_AS_ADVANCED(K3D_GMP_LIBRARY)\n\nIF(K3D_CGAL_INCLUDE_DIR AND K3D_CGAL_LIBRARY AND K3D_MPFR_LIBRARY AND K3D_GMP_LIBRARY)\n\tSET(K3D_CGAL_FOUND 1)\nENDIF(K3D_CGAL_INCLUDE_DIR AND K3D_CGAL_LIBRARY AND K3D_MPFR_LIBRARY AND K3D_GMP_LIBRARY)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindCairomm.cmake",
    "content": "SET(K3D_CAIROMM_FOUND 0)\n\nINCLUDE(K3DFindPkgConfig)\nPKG_CHECK_MODULES(CAIROMM cairomm-1.0)\n\nIF(CAIROMM_FOUND)\n\tSET(K3D_CAIROMM_INCLUDE_DIRS\n\t\t${CAIROMM_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_CAIROMM_LIB_DIRS\n\t\t${CAIROMM_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_CAIROMM_LIBS\n\t\t${CAIROMM_LIBRARIES}\n\t\t)\n\n\tSET(K3D_CAIROMM_FOUND 1)\nENDIF(CAIROMM_FOUND)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindCollada.cmake",
    "content": "SET(K3D_COLLADA_FOUND FALSE)\n\nIF(NOT APPLE)\n\tFIND_PATH(K3D_COLLADA_BASE_INCLUDE_PATH 1.4\n\t\t/usr/include/collada-dom2.4\n\t\t/usr/include/colladadom\n\t\t/usr/local/include/collada-dom2.4\n\t\t/usr/local/include/colladadom\n\t\tDOC \"Directory where the collada includes are located\"\n\t\t)\n\n    SET(K3D_COLLADA_DAE_INCLUDE_PATH ${K3D_COLLADA_BASE_INCLUDE_PATH} CACHE PATH\n\t\"Directoy containing the Collada dae.h include file\")\n\n\tSET(K3D_COLLADA_DOM_INCLUDE_PATH ${K3D_COLLADA_BASE_INCLUDE_PATH}/1.4 CACHE PATH\n\t\"Directoy containing the Collada dom includes\")\n\n\tFIND_LIBRARY(K3D_COLLADA_LIBRARY\n\t\tNAMES collada14dom collada-dom2.4-dp collada-dom2.4\n\t\tPATHS\n\t\t/usr/local/lib\n\t\t/usr/lib\n\t\tDOC \"The ColladaDOM 1.4 library\"\n\t\t)\nENDIF(NOT APPLE)\n\n#Apple configuration\nIF(UNIX AND APPLE)\n\tFIND_PATH(K3D_COLLADA_DAE_INCLUDE_PATH dae.h\n\t\t/Library/Frameworks/Collada14Dom.framework\n\t\tDOC \"Directory where the ColladaDOM dae.h file is located\"\n\t\t)\n\n\tFIND_PATH(K3D_COLLADA_DOM_INCLUDE_PATH dom/\n\t\t/Library/Frameworks/Collada14Dom.framework/1.4\n\t\tDOC \"Directory where the ColladaDOM 1.4 header files are located\"\n\t\t)\n\n\tFIND_LIBRARY(K3D_COLLADA_LIBRARY\n\t\tNAMES Collada14Dom\n\t\tPATHS\n\t\t/Library/Frameworks/Collada14Dom.framework\n\t\tDOC \"The ColladaDOM 1.4 library\"\n\t\t)\n\nENDIF(UNIX AND APPLE)\n\nMARK_AS_ADVANCED(K3D_COLLADA_BASE_INCLUDE_PATH)\nMARK_AS_ADVANCED(K3D_COLLADA_DAE_INCLUDE_PATH)\nMARK_AS_ADVANCED(K3D_COLLADA_DOM_INCLUDE_PATH)\nMARK_AS_ADVANCED(K3D_COLLADA_LIBRARY)\n\nSET(K3D_COLLADA_INCLUDE_DIRS ${K3D_COLLADA_DAE_INCLUDE_PATH} ${K3D_COLLADA_DOM_INCLUDE_PATH})\nSET(K3D_COLLADA_LIBS ${K3D_COLLADA_LIBRARY})\n\nIF(K3D_COLLADA_DAE_INCLUDE_PATH AND K3D_COLLADA_DOM_INCLUDE_PATH AND K3D_COLLADA_LIBRARY)\n\tSET(K3D_COLLADA_FOUND TRUE)\nENDIF(K3D_COLLADA_DAE_INCLUDE_PATH AND K3D_COLLADA_DOM_INCLUDE_PATH AND K3D_COLLADA_LIBRARY)\n"
  },
  {
    "path": "cmake/modules/K3DFindDBus.cmake",
    "content": "SET(K3D_DBUS_FOUND 0)\n\nINCLUDE(K3DFindPkgConfig)\nPKG_CHECK_MODULES(DBUS dbus-glib-1)\n\nIF(DBUS_FOUND)\n\tSET(K3D_DBUS_INCLUDE_DIRS\n\t\t${DBUS_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_DBUS_LIB_DIRS\n\t\t${DBUS_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_DBUS_LIBS\n\t\t${DBUS_LIBRARIES}\n\t\t)\n\n\tSET(K3D_DBUS_FOUND 1)\nENDIF(DBUS_FOUND)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindFTGL.cmake",
    "content": "SET(K3D_FTGL_FOUND 0)\n\nFIND_PATH(K3D_FTGL_INCLUDE_DIR FTGL/ftgl.h\n\tDOC \"Directory where the FTGL directory, containing the ftgl headers, is located\"\n\t)\nMARK_AS_ADVANCED(K3D_FTGL_INCLUDE_DIR)\n\nFIND_LIBRARY(K3D_FTGL_LIBRARY ftgl\n\tDOC \"The FTGL library\"\n\t)\nMARK_AS_ADVANCED(K3D_FTGL_LIBRARY)\n\nIF(K3D_FTGL_INCLUDE_DIR AND K3D_FTGL_LIBRARY)\n\tSET(K3D_FTGL_FOUND 1)\nENDIF()\n\n"
  },
  {
    "path": "cmake/modules/K3DFindFreetype2.cmake",
    "content": "SET(K3D_FREETYPE2_FOUND 0)\n\nINCLUDE(K3DFindPkgConfig)\nPKG_CHECK_MODULES(FREETYPE2 freetype2)\n\nIF(FREETYPE2_FOUND)\n\tSET(K3D_FREETYPE2_INCLUDE_DIRS\n\t\t${FREETYPE2_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_FREETYPE2_LIB_DIRS\n\t\t${FREETYPE2_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_FREETYPE2_LIBS\n\t\t${FREETYPE2_LIBRARIES}\n\t\t)\n\n\tSET(K3D_FREETYPE2_FOUND 1)\nENDIF(FREETYPE2_FOUND)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindGMM.cmake",
    "content": "SET(K3D_GMM_FOUND 0)\n\nFIND_PATH(K3D_GMM_INCLUDE_DIR gmm/gmm.h \n\t/usr/include\n\tDOC \"Directory where the gmm directory containing header files is located\"\n\t)\nMARK_AS_ADVANCED(K3D_GMM_INCLUDE_DIR)\n\nIF(EXISTS ${K3D_GMM_INCLUDE_DIR}/gmm/gmm.h)\n\tSET(K3D_GMM_FOUND 1)\nENDIF(EXISTS ${K3D_GMM_INCLUDE_DIR}/gmm/gmm.h)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindGPerftools.cmake",
    "content": "SET(K3D_GPERFTOOLS_FOUND 0)\n\nFIND_PATH(K3D_GPERFTOOLS_INCLUDE_DIR gperftools\n\t/usr/include\n\t/usr/local/include\n\tDOC \"Directory where the gperftools directory, containing the perftools headers, is located\"\n\t)\nMARK_AS_ADVANCED(K3D_GPERFTOOLS_INCLUDE_DIR)\n\nFIND_LIBRARY(K3D_PROFILER_LIBRARY profiler\n\tDOC \"The gperftools profiler library\"\n\t)\nMARK_AS_ADVANCED(K3D_PROFILER_LIBRARY)\n\nIF(K3D_GPERFTOOLS_INCLUDE_DIR AND K3D_PROFILER_LIBRARY)\n\tSET(K3D_GPERFTOOLS_FOUND 1)\nENDIF()\n"
  },
  {
    "path": "cmake/modules/K3DFindGTS.cmake",
    "content": "SET(K3D_GTS_FOUND 0)\n\n######################################################################\n# Posix specific configuration\n\nIF(UNIX)\n\tINCLUDE(K3DFindPkgConfig)\n\tPKG_CHECK_MODULES(GTS gts)\n\n\tIF(GTS_FOUND)\n\t\tSET(K3D_GTS_INCLUDE_DIRS\n\t\t\t${GTS_INCLUDE_DIRS}\n\t\t\t)\n\n\t\tSET(K3D_GTS_LIB_DIRS\n\t\t\t${GTS_LIBRARY_DIRS}\n\t\t\t)\n\n\t\tSET(K3D_GTS_LIBS\n\t\t\t${GTS_LIBRARIES}\n\t\t\t)\n\n\t\tSET(K3D_GTS_FOUND 1)\n\tENDIF(GTS_FOUND)\n\nENDIF(UNIX)\n\n######################################################################\n# Win32 specific configuration\n\nIF(WIN32)\nENDIF(WIN32)\n\n######################################################################\n# Mac OS X specific configuration\n\nIF(APPLE)\nENDIF(APPLE)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindGiomm.cmake",
    "content": "SET(K3D_GIOMM_FOUND 0)\n\nINCLUDE(K3DFindPkgConfig)\nPKG_CHECK_MODULES(GIOMM giomm-2.4)\n\nIF(GIOMM_FOUND)\n\tSET(K3D_GIOMM_INCLUDE_DIRS\n\t\t${GIOMM_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_GIOMM_LIB_DIRS\n\t\t${GIOMM_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_GIOMM_LIBS\n\t\t${GIOMM_LIBRARIES}\n\t\t)\n\n\tSET(K3D_GIOMM_FOUND 1)\nENDIF(GIOMM_FOUND)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindGlibmm.cmake",
    "content": "SET(K3D_GLIBMM_FOUND 0)\n\nINCLUDE(K3DFindPkgConfig)\nPKG_CHECK_MODULES(GLIBMM glibmm-2.4>=2.26)\n\nIF(GLIBMM_FOUND)\n\tSET(K3D_GLIBMM_INCLUDE_DIRS\n\t\t${GLIBMM_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_GLIBMM_LIB_DIRS\n\t\t${GLIBMM_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_GLIBMM_LIBS\n\t\t${GLIBMM_LIBRARIES}\n\t\t)\n\n\tSET(K3D_GLIBMM_FOUND 1)\nENDIF(GLIBMM_FOUND)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindGthread.cmake",
    "content": "SET(K3D_GTHREAD_FOUND 0)\n\n######################################################################\n# Posix specific configuration\n\nINCLUDE(K3DFindPkgConfig)\nPKG_CHECK_MODULES(GTHREAD gthread-2.0)\n\nIF(GTHREAD_FOUND)\n\tSET(K3D_GTHREAD_INCLUDE_DIRS\n\t\t${GTHREAD_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_GTHREAD_LIB_DIRS\n\t\t${GTHREAD_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_GTHREAD_LIBS\n\t\t${GTHREAD_LIBRARIES}\n\t\t)\n\n\tSET(K3D_GTHREAD_FOUND 1)\nENDIF(GTHREAD_FOUND)\n"
  },
  {
    "path": "cmake/modules/K3DFindGtkGLExt.cmake",
    "content": "SET(K3D_GTKGLEXT_FOUND 0)\n\nINCLUDE(K3DFindPkgConfig)\nPKG_CHECK_MODULES(GTKGLEXT gtkglext-1.0)\n\nIF(GTKGLEXT_FOUND)\n\tSET(K3D_GTKGLEXT_INCLUDE_DIRS\n\t\t${GTKGLEXT_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_GTKGLEXT_LIB_DIRS\n\t\t${GTKGLEXT_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_GTKGLEXT_LIBS\n\t\t${GTKGLEXT_LIBRARIES}\n\t\t)\n\n\tSET(K3D_GTKGLEXT_FOUND 1)\nENDIF(GTKGLEXT_FOUND)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindGtkSourceView.cmake",
    "content": "SET(K3D_GTKSOURCEVIEW_FOUND 0)\n\nINCLUDE(K3DFindPkgConfig)\nPKG_CHECK_MODULES(GTKSOURCEVIEW gtksourceview-2.0)\n\nIF(GTKSOURCEVIEW_FOUND)\n\tSET(K3D_GTKSOURCEVIEW_INCLUDE_DIRS\n\t\t${GTKSOURCEVIEW_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_GTKSOURCEVIEW_LIBRARY_DIRS\n\t\t${GTKSOURCEVIEW_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_GTKSOURCEVIEW_LIBRARIES\n\t\t${GTKSOURCEVIEW_LIBRARIES}\n\t\t)\n\n\tSET(K3D_GTKSOURCEVIEW_FOUND 1)\nENDIF(GTKSOURCEVIEW_FOUND)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindGtkmm.cmake",
    "content": "SET(K3D_GTKMM_FOUND 0)\n\n######################################################################\n# Posix specific configuration\n\nINCLUDE(K3DFindPkgConfig)\nPKG_CHECK_MODULES(GTKMM gtkmm-2.4)\n\nIF(GTKMM_FOUND)\n\tSET(K3D_GTKMM_INCLUDE_DIRS\n\t\t${GTKMM_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_GTKMM_LIB_DIRS\n\t\t${GTKMM_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_GTKMM_LIBS\n\t\t${GTKMM_LIBRARIES}\n\t\t)\n\n\tSET(K3D_GTKMM_FOUND 1)\nENDIF(GTKMM_FOUND)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindImageMagick.cmake",
    "content": "SET(K3D_IMAGEMAGICK_FOUND 0)\n\nfind_package(ImageMagick COMPONENTS Magick++)\n\nIF(ImageMagick_FOUND)\n\tSET(K3D_IMAGEMAGICK_INCLUDE_DIRS\n\t\t${ImageMagick_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_IMAGEMAGICK_LIBS\n\t\t${ImageMagick_LIBRARIES}\n\t\t)\n\n\tSET(K3D_IMAGEMAGICK_FOUND 1)\nENDIF(ImageMagick_FOUND)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindInotify.cmake",
    "content": "SET(K3D_INOTIFY_FOUND 0)\n\nFIND_PATH(K3D_INOTIFY_INCLUDE_DIR sys/inotify.h\n\t/usr/include\n\tDOC \"Directory where the sys/inotify.h header file is located\"\n\t)\nMARK_AS_ADVANCED(K3D_INOTIFY_INCLUDE_DIR)\n\nIF(K3D_INOTIFY_INCLUDE_DIR)\n\tSET(K3D_INOTIFY_FOUND 1)\nENDIF()\n\n"
  },
  {
    "path": "cmake/modules/K3DFindIntl.cmake",
    "content": "INCLUDE(FindGTK)\n\nFIND_PATH(K3D_INTL_INCLUDE_DIR libintl.h\n\t/usr/include\n\tc:/gtk/include\n\t${K3D_GTK_DIR}/include\n\tDOC \"Directory where the libintl header files are located\"\n\t)\nMARK_AS_ADVANCED(K3D_INTL_INCLUDE_DIR)\n\nIF(WIN32 OR APPLE)\n  SET(K3D_INTL_LIB intl CACHE FILEPATH \"\")\n\tMARK_AS_ADVANCED(K3D_INTL_LIB)\nENDIF()\n\nSET(K3D_INTL_INCLUDE_DIRS\n\t${K3D_INTL_INCLUDE_DIR}\n\t)\n\nSET(K3D_INTL_LIBS\n\t${K3D_INTL_LIB}\n\t)\n\nSET(K3D_INTL_FOUND 1)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindJPEG.cmake",
    "content": "INCLUDE(FindGTK)\n\nFIND_PATH(K3D_JPEG_INCLUDE_DIR jpeglib.h\n\t/usr/include\n\tc:/gtk/include\n\t${K3D_GTK_DIR}/include \n\tDOC \"Directory where the jpeg header files are located\"\n\t)\nMARK_AS_ADVANCED(K3D_JPEG_INCLUDE_DIR)\n\nSET(K3D_JPEG_LIB jpeg CACHE STRING \"\")\nMARK_AS_ADVANCED(K3D_JPEG_LIB)\n\nSET(K3D_JPEG_INCLUDE_DIRS\n\t${K3D_JPEG_INCLUDE_DIR}\n\t)\n\nSET(K3D_JPEG_LIBS\n\t${K3D_JPEG_LIB}\n\t)\n\nSET(K3D_JPEG_FOUND 1)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindODE.cmake",
    "content": "SET(K3D_ODE_FOUND 0)\n\nFIND_PATH(K3D_ODE_INCLUDE_DIR ode/ode.h\n\t)\n\nFIND_LIBRARY(K3D_ODE_LIBRARY ode\n\t)\n\nIF(K3D_ODE_INCLUDE_DIR AND K3D_ODE_LIBRARY)\n\tSET(K3D_ODE_FOUND 1)\nENDIF()\n\nMARK_AS_ADVANCED(\n\tK3D_ODE_INCLUDE_DIR\n\tK3D_ODE_LIBRARY\n\t)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindOSMesa.cmake",
    "content": "SET(K3D_OSMESA_FOUND 0)\n\nINCLUDE(K3DFindPkgConfig)\nPKG_CHECK_MODULES(OSMESA osmesa)\n\nIF(OSMESA_FOUND)\n\tSET(K3D_OSMESA_INCLUDE_DIRECTORIES\n\t\t${OSMESA_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_OSMESA_LIB_DIRECTORIES\n\t\t${OSMESA_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_OSMESA_LIBRARIES\n\t\t${OSMESA_LIBRARIES}\n\t\t)\n\n\tSET(K3D_OSMESA_FOUND 1)\nENDIF()\n\n"
  },
  {
    "path": "cmake/modules/K3DFindOpenEXR.cmake",
    "content": "SET(K3D_OPENEXR_FOUND 0)\n\n######################################################################\n# Posix specific configuration\n\nIF(UNIX)\n\tINCLUDE(K3DFindPkgConfig)\n\tPKG_CHECK_MODULES(OPENEXR OpenEXR)\n\n\tIF(OPENEXR_FOUND)\n\t\tSET(K3D_OPENEXR_INCLUDE_DIRS\n\t\t\t${OPENEXR_INCLUDE_DIRS}\n\t\t\t)\n\n\t\tSET(K3D_OPENEXR_LIB_DIRS\n\t\t\t${OPENEXR_LIBRARY_DIRS}\n\t\t\t)\n\n\t\tSET(K3D_OPENEXR_LIBS\n\t\t\t${OPENEXR_LIBRARIES}\n\t\t\t)\n\n\t\tSET(K3D_OPENEXR_FOUND 1)\n\tENDIF(OPENEXR_FOUND)\n\nENDIF(UNIX)\n\n######################################################################\n# Win32 specific configuration\n\nIF(WIN32)\nENDIF(WIN32)\n\n######################################################################\n# Mac OS X specific configuration\n\nIF(APPLE)\nENDIF(APPLE)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindOpenGL.cmake",
    "content": "SET(K3D_OPENGL_FOUND 0)\n\nFIND_PACKAGE(OpenGL)\n\npkg_search_module(GLEW glewmx glew)\n\nIF(OPENGL_FOUND AND OPENGL_GLU_FOUND AND GLEW_FOUND)\n  SET(K3D_OPENGL_INCLUDE_DIR ${OPENGL_INCLUDE_DIR} ${GLEW_INCLUDE_DIRS})\n  SET(K3D_OPENGL_LIBRARIES ${GLEW_LIBRARIES} ${OPENGL_LIBRARIES})\n\tSET(K3D_GLEW_VERSION ${GLEW_VERSION})\n\tstring(REPLACE \".\" \";\" GLEW_VERSION_LIST ${GLEW_VERSION})\n\tlist(GET GLEW_VERSION_LIST 0 K3D_GLEW_MAJOR_VERSION)\n  SET(K3D_OPENGL_FOUND 1)\nENDIF()\n"
  },
  {
    "path": "cmake/modules/K3DFindPNG.cmake",
    "content": "SET(K3D_PNG_FOUND 0)\n\nfind_package(PNG)\n\nIF(PNG_FOUND)\n\tSET(K3D_PNG_INCLUDE_DIRS\n\t\t${PNG_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_PNG_LIB_DIRS\n\t\t${PNG_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_PNG_LIBS\n\t\t${PNG_LIBRARIES}\n\t\t)\n\n\tSET(K3D_PNG_FOUND 1)\nENDIF(PNG_FOUND)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindPkgConfig.cmake",
    "content": "# - a pkg-config module for CMake\n#\n# Usage:\n#   pkg_check_modules(<PREFIX> [REQUIRED] <MODULE> [<MODULE>]*)\n#     checks for all the given modules\n#\n#   pkg_search_module(<PREFIX> [REQUIRED] <MODULE> [<MODULE>]*)\n#     checks for given modules and uses the first working one\n#\n# When the 'REQUIRED' argument was set, macros will fail with an error\n# when module(s) could not be found\n#\n# It sets the following variables:\n#   PKG_CONFIG_FOUND         ... true iff pkg-config works on the system\n#   PKG_CONFIG_EXECUTABLE    ... pathname of the pkg-config program\n#   <PREFIX>_FOUND           ... set to 1 iff module(s) exist\n#\n# For the following variables two sets of values exist; first one is the\n# common one and has the given PREFIX. The second set contains flags\n# which are given out when pkgconfig was called with the '--static'\n# option.\n#   <XPREFIX>_LIBRARIES      ... only the libraries (w/o the '-l')\n#   <XPREFIX>_LIBRARY_DIRS   ... the paths of the libraries (w/o the '-L')\n#   <XPREFIX>_LDFLAGS        ... all required linker flags\n#   <XPREFIX>_LDFLAGS_OTHERS ... all other linker flags\n#   <XPREFIX>_INCLUDE_DIRS   ... the '-I' preprocessor flags (w/o the '-I')\n#   <XPREFIX>_CFLAGS         ... all required cflags\n#   <XPREFIX>_CFLAGS_OTHERS  ... the other compiler flags\n#\n#   <XPREFIX> = <PREFIX>        for common case\n#   <XPREFIX> = <PREFIX>_STATIC for static linking\n#\n# There are some special variables whose prefix depends on the count\n# of given modules. When there is only one module, <PREFIX> stays\n# unchanged. When there are multiple modules, the prefix will be\n# changed to <PREFIX>_<MODNAME>:\n#   <XPREFIX>_VERSION    ... version of the module\n#   <XPREFIX>_PREFIX     ... prefix-directory of the module\n#   <XPREFIX>_INCLUDEDIR ... include-dir of the module\n#   <XPREFIX>_LIBDIR     ... lib-dir of the module\n#\n#   <XPREFIX> = <PREFIX>  when |MODULES| == 1, else\n#   <XPREFIX> = <PREFIX>_<MODNAME>\n#\n# A <MODULE> parameter can have the following formats:\n#   {MODNAME}            ... matches any version\n#   {MODNAME}>={VERSION} ... at least version <VERSION> is required\n#   {MODNAME}={VERSION}  ... exactly version <VERSION> is required\n#   {MODNAME}<={VERSION} ... modules must not be newer than <VERSION>\n#\n# Examples\n#   pkg_check_modules (GLIB2   glib-2.0)\n#\n#   pkg_check_modules (GLIB2   glib-2.0>=2.10)\n#     requires at least version 2.10 of glib2 and defines e.g.\n#       GLIB2_VERSION=2.10.3\n#\n#   pkg_check_modules (FOO     glib-2.0>=2.10 gtk+-2.0)\n#     requires both glib2 and gtk2, and defines e.g.\n#       FOO_glib-2.0_VERSION=2.10.3\n#       FOO_gtk+-2.0_VERSION=2.8.20\n#\n#   pkg_check_modules (XRENDER REQUIRED xrender)\n#     defines e.g.:\n#       XRENDER_LIBRARIES=Xrender;X11\n#       XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp\n#\n#   pkg_search_module (BAR     libxml-2.0 libxml2 libxml>=2)\n\n\n# Copyright (C) 2006 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>\n#\n# Redistribution and use, with or without modification, are permitted\n# provided that the following conditions are met:\n# \n#    1. Redistributions must retain the above copyright notice, this\n#       list of conditions and the following disclaimer.\n#    2. The name of the author may not be used to endorse or promote\n#       products derived from this software without specific prior\n#       written permission.\n# \n# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\n# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\n# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n### Common stuff ####\nset(PKG_CONFIG_VERSION 1)\nset(PKG_CONFIG_FOUND   0)\n\nfind_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC \"pkg-config executable\")\nmark_as_advanced(PKG_CONFIG_EXECUTABLE)\n\nif(PKG_CONFIG_EXECUTABLE)\n  set(PKG_CONFIG_FOUND 1)\nendif(PKG_CONFIG_EXECUTABLE)\n\n\n# Unsets the given variables\nmacro(_pkgconfig_unset var)\n  set(${var} \"\" CACHE INTERNAL \"\")\nendmacro(_pkgconfig_unset)\n\nmacro(_pkgconfig_set var value)\n  set(${var} ${value} CACHE INTERNAL \"\")\nendmacro(_pkgconfig_set)\n\n# Invokes pkgconfig, cleans up the result and sets variables\nmacro(_pkgconfig_invoke _pkglist _prefix _varname _regexp)\n  set(_pkgconfig_invoke_result)\n\n  execute_process(\n    COMMAND ${PKG_CONFIG_EXECUTABLE} ${ARGN} ${_pkglist}\n    OUTPUT_VARIABLE _pkgconfig_invoke_result\n    RESULT_VARIABLE _pkgconfig_failed)\n\n  if (_pkgconfig_failed)\n    set(_pkgconfig_${_varname} \"\")\n    _pkgconfig_unset(${_prefix}_${_varname})\n  else(_pkgconfig_failed)\n    string(REGEX REPLACE \"[\\r\\n]\"                  \" \" _pkgconfig_invoke_result \"${_pkgconfig_invoke_result}\")\n    string(REGEX REPLACE \" +$\"                     \"\"  _pkgconfig_invoke_result \"${_pkgconfig_invoke_result}\")\n\n    if (NOT ${_regexp} STREQUAL \"\")\n      string(REGEX REPLACE \"${_regexp}\" \" \" _pkgconfig_invoke_result \"${_pkgconfig_invoke_result}\")\n    endif(NOT ${_regexp} STREQUAL \"\")\n\n    separate_arguments(_pkgconfig_invoke_result)\n\n    #message(STATUS \"  ${_varname} ... ${_pkgconfig_invoke_result}\")\n    set(_pkgconfig_${_varname} ${_pkgconfig_invoke_result})\n    _pkgconfig_set(${_prefix}_${_varname} \"${_pkgconfig_invoke_result}\")\n  endif(_pkgconfig_failed)\nendmacro(_pkgconfig_invoke)\n\n# Invokes pkgconfig two times; once without '--static' and once with\n# '--static'\nmacro(_pkgconfig_invoke_dyn _pkglist _prefix _varname cleanup_regexp)\n  _pkgconfig_invoke(\"${_pkglist}\" ${_prefix}        ${_varname} \"${cleanup_regexp}\" ${ARGN})\n  _pkgconfig_invoke(\"${_pkglist}\" ${_prefix} STATIC_${_varname} \"${cleanup_regexp}\" --static  ${ARGN})\nendmacro(_pkgconfig_invoke_dyn)\n\n# Splits given arguments into options and a package list\nmacro(_pkgconfig_parse_options _result _is_req)\n  set(${_is_req} 0)\n  \n  foreach(_pkg ${ARGN})\n    if (_pkg STREQUAL \"REQUIRED\")\n      set(${_is_req} 1)\n    endif (_pkg STREQUAL \"REQUIRED\")\n  endforeach(_pkg ${ARGN})\n\n  set(${_result} ${ARGN})\n  list(REMOVE_ITEM ${_result} \"REQUIRED\")\nendmacro(_pkgconfig_parse_options)\n\n###\nmacro(_pkg_check_modules_internal _is_required _is_silent _prefix)\n  _pkgconfig_unset(${_prefix}_FOUND)\n  _pkgconfig_unset(${_prefix}_VERSION)\n  _pkgconfig_unset(${_prefix}_PREFIX)\n  _pkgconfig_unset(${_prefix}_INCLUDEDIR)\n  _pkgconfig_unset(${_prefix}_LIBDIR)\n  _pkgconfig_unset(${_prefix}_LIBS)\n  _pkgconfig_unset(${_prefix}_LIBS_L)\n  _pkgconfig_unset(${_prefix}_LIBS_PATHS)\n  _pkgconfig_unset(${_prefix}_LIBS_OTHER)\n  _pkgconfig_unset(${_prefix}_CFLAGS)\n  _pkgconfig_unset(${_prefix}_CFLAGS_I)\n  _pkgconfig_unset(${_prefix}_CFLAGS_OTHER)\n  _pkgconfig_unset(${_prefix}_STATIC_LIBDIR)\n  _pkgconfig_unset(${_prefix}_STATIC_LIBS)\n  _pkgconfig_unset(${_prefix}_STATIC_LIBS_L)\n  _pkgconfig_unset(${_prefix}_STATIC_LIBS_PATHS)\n  _pkgconfig_unset(${_prefix}_STATIC_LIBS_OTHER)\n  _pkgconfig_unset(${_prefix}_STATIC_CFLAGS)\n  _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_I)\n  _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_OTHER)\n\n  # create a better addressable variable of the modules and calculate its size\n  set(_pkg_check_modules_list ${ARGN})\n  list(LENGTH _pkg_check_modules_list _pkg_check_modules_cnt)\n\n  if(PKG_CONFIG_EXECUTABLE)\n    # give out status message telling checked module\n    if (NOT ${_is_silent})\n      if (_pkg_check_modules_cnt EQUAL 1)\n        message(STATUS \"checking for module '${_pkg_check_modules_list}'\")\n      else(_pkg_check_modules_cnt EQUAL 1)\n        message(STATUS \"checking for modules '${_pkg_check_modules_list}'\")\n      endif(_pkg_check_modules_cnt EQUAL 1)\n    endif(NOT ${_is_silent})\n    \n    set(_pkg_check_modules_packages)\n    set(_pkg_check_modules_failed)\n\n    # iterate through module list and check whether they exist and match the required version\n    foreach (_pkg_check_modules_pkg ${_pkg_check_modules_list})\n      set(_pkg_check_modules_exist_query)\n\n      # check whether version is given\n      if (_pkg_check_modules_pkg MATCHES \".*(>=|=|<=).*\")\n        string(REGEX REPLACE \"(.*[^><])(>=|=|<=)(.*)\" \"\\\\1\" _pkg_check_modules_pkg_name \"${_pkg_check_modules_pkg}\")\n        string(REGEX REPLACE \"(.*[^><])(>=|=|<=)(.*)\" \"\\\\2\" _pkg_check_modules_pkg_op   \"${_pkg_check_modules_pkg}\")\n        string(REGEX REPLACE \"(.*[^><])(>=|=|<=)(.*)\" \"\\\\3\" _pkg_check_modules_pkg_ver  \"${_pkg_check_modules_pkg}\")\n      else(_pkg_check_modules_pkg MATCHES \".*(>=|=|<=).*\")\n        set(_pkg_check_modules_pkg_name \"${_pkg_check_modules_pkg}\")\n        set(_pkg_check_modules_pkg_op)\n        set(_pkg_check_modules_pkg_ver)\n      endif(_pkg_check_modules_pkg MATCHES \".*(>=|=|<=).*\")\n\n      # handle the operands\n      if (_pkg_check_modules_pkg_op STREQUAL \">=\")\n        list(APPEND _pkg_check_modules_exist_query --atleast-version)\n      endif(_pkg_check_modules_pkg_op STREQUAL \">=\")\n\n      if (_pkg_check_modules_pkg_op STREQUAL \"=\")\n        list(APPEND _pkg_check_modules_exist_query --exact-version)\n      endif(_pkg_check_modules_pkg_op STREQUAL \"=\")\n      \n      if (_pkg_check_modules_pkg_op STREQUAL \"<=\")\n        list(APPEND _pkg_check_modules_exist_query --max-version)\n      endif(_pkg_check_modules_pkg_op STREQUAL \"<=\")\n\n      # create the final query which is of the format:\n      # * --atleast-version <version> <pkg-name>\n      # * --exact-version <version> <pkg-name>      \n      # * --max-version <version> <pkg-name>\n      # * --exists <pkg-name>\n      if (_pkg_check_modules_pkg_op)\n        list(APPEND _pkg_check_modules_exist_query \"${_pkg_check_modules_pkg_ver}\")\n      else(_pkg_check_modules_pkg_op)\n        list(APPEND _pkg_check_modules_exist_query --exists)\n      endif(_pkg_check_modules_pkg_op)\n\n      _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_VERSION)\n      _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_PREFIX)\n      _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_INCLUDEDIR)\n      _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_LIBDIR)\n\n      list(APPEND _pkg_check_modules_exist_query \"${_pkg_check_modules_pkg_name}\")\n      list(APPEND _pkg_check_modules_packages    \"${_pkg_check_modules_pkg_name}\")\n\n      # execute the query\n      execute_process(\n        COMMAND ${PKG_CONFIG_EXECUTABLE} ${_pkg_check_modules_exist_query}\n        RESULT_VARIABLE _pkgconfig_retval)\n\n      # evaluate result and tell failures\n      if (_pkgconfig_retval)\n        if(NOT ${_is_silent})\n          message(STATUS \"  package '${_pkg_check_modules_pkg}' not found\")\n        endif(NOT ${_is_silent})\n\n        set(_pkg_check_modules_failed 1)\n      endif(_pkgconfig_retval)\n    endforeach(_pkg_check_modules_pkg)\n\n    if(_pkg_check_modules_failed)\n      # fail when requested\n      if (${_is_required})\n        message(SEND_ERROR \"A required package was not found\")\n      endif (${_is_required})\n    else(_pkg_check_modules_failed)\n      # when we are here, we checked whether requested modules\n      # exist. Now, go through them and set variables\n      \n      _pkgconfig_set(${_prefix}_FOUND 1)\n      list(LENGTH _pkg_check_modules_packages pkg_count)\n\n      # iterate through all modules again and set individual variables\n      foreach (_pkg_check_modules_pkg ${_pkg_check_modules_packages})\n        # handle case when there is only one package required\n        if (pkg_count EQUAL 1)\n          set(_pkg_check_prefix \"${_prefix}\")\n        else(pkg_count EQUAL 1)\n          set(_pkg_check_prefix \"${_prefix}_${_pkg_check_modules_pkg}\")\n        endif(pkg_count EQUAL 1)\n        \n        _pkgconfig_invoke(${_pkg_check_modules_pkg} \"${_pkg_check_prefix}\" VERSION    \"\"   --modversion )\n        _pkgconfig_invoke(${_pkg_check_modules_pkg} \"${_pkg_check_prefix}\" PREFIX     \"\"   --variable=prefix )\n        _pkgconfig_invoke(${_pkg_check_modules_pkg} \"${_pkg_check_prefix}\" INCLUDEDIR \"\"   --variable=includedir )\n        _pkgconfig_invoke(${_pkg_check_modules_pkg} \"${_pkg_check_prefix}\" LIBDIR     \"\"   --variable=libdir )\n\n        message(STATUS \"  found ${_pkg_check_modules_pkg}, version ${_pkgconfig_VERSION}\")\n      endforeach(_pkg_check_modules_pkg)\n\n      # set variables which are combined for multiple modules\n      _pkgconfig_invoke_dyn(\"${_pkg_check_modules_packages}\" \"${_prefix}\" LIBRARIES           \"(^| )-l\" --libs-only-l )\n      _pkgconfig_invoke_dyn(\"${_pkg_check_modules_packages}\" \"${_prefix}\" LIBRARY_DIRS        \"(^| )-L\" --libs-only-L )\n      _pkgconfig_invoke_dyn(\"${_pkg_check_modules_packages}\" \"${_prefix}\" LDFLAGS             \"\"        --libs )\n      _pkgconfig_invoke_dyn(\"${_pkg_check_modules_packages}\" \"${_prefix}\" LDFLAGS_OTHER       \"\"        --libs-only-other )\n\n      _pkgconfig_invoke_dyn(\"${_pkg_check_modules_packages}\" \"${_prefix}\" INCLUDE_DIRS        \"(^| )-I\" --cflags-only-I )\n      _pkgconfig_invoke_dyn(\"${_pkg_check_modules_packages}\" \"${_prefix}\" CFLAGS              \"\"        --cflags )\n      _pkgconfig_invoke_dyn(\"${_pkg_check_modules_packages}\" \"${_prefix}\" CFLAGS_OTHER        \"\"        --cflags-only-other )\n    endif(_pkg_check_modules_failed)\n  else(PKG_CONFIG_EXECUTABLE)\n    if (${_is_required})\n      message(SEND_ERROR \"pkg-config tool not found\")\n    endif (${_is_required})\n  endif(PKG_CONFIG_EXECUTABLE)\nendmacro(_pkg_check_modules_internal)\n\n###\n### User visible macros start here\n###\n\n###\nmacro(pkg_check_modules _prefix _module0)\n  # check cached value\n#  if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION})\n    _pkgconfig_parse_options   (_pkg_modules _pkg_is_required \"${_module0}\" ${ARGN})\n    _pkg_check_modules_internal(\"${_pkg_is_required}\" 0 \"${_prefix}\" ${_pkg_modules})\n\n#    _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION})\n#  endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION})\nendmacro(pkg_check_modules)\n\n###\nmacro(pkg_search_module _prefix _module0)\n  # check cached value\n#  if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION})\n    set(_pkg_modules_found 0)\n    _pkgconfig_parse_options(_pkg_modules_alt _pkg_is_required \"${_module0}\" ${ARGN})\n\n    message(STATUS \"checking for one of the modules '${_pkg_modules_alt}'\")\n\n    # iterate through all modules and stop at the first working one.\n    foreach(_pkg_alt ${_pkg_modules_alt})\n      if(NOT _pkg_modules_found)\n        _pkg_check_modules_internal(0 1 \"${_prefix}\" \"${_pkg_alt}\")\n      endif(NOT _pkg_modules_found)\n\n      if (${_prefix}_FOUND)\n        set(_pkg_modules_found 1)\n      endif(${_prefix}_FOUND)\n    endforeach(_pkg_alt)\n\n    if (NOT ${_prefix}_FOUND)\n      if(${_pkg_is_required})\n        message(SEND_ERROR \"None of the required '${_pkg_modules_alt}' found\")\n      endif(${_pkg_is_required})\n    endif(NOT ${_prefix}_FOUND)\n    \n#    _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION})\n#  endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION})  \nendmacro(pkg_search_module)\n\n### Local Variables:\n### mode: cmake\n### End:\n"
  },
  {
    "path": "cmake/modules/K3DFindPython.cmake",
    "content": "SET(K3D_PYTHON_FOUND 0)\n\nIF(APPLE)\n\tFIND_PROGRAM(PYTHON_EXECUTABLE\n\t\tNAMES python\n\t\t)\n\n\tIF(PYTHON_EXECUTABLE)\n\t\tEXECUTE_PROCESS(\n\t\t\tCOMMAND ${PYTHON_EXECUTABLE} -c \"import sys; sys.stdout.write(sys.prefix + '/include/python' + sys.version[:3])\"\n\t\t\tOUTPUT_VARIABLE PYTHON_INCLUDE_PATH\n\t\t\t)\n\t\tEXECUTE_PROCESS(\n\t\t\tCOMMAND ${PYTHON_EXECUTABLE} -c \"import sys; sys.stdout.write(sys.exec_prefix + '/Python')\"\n\t\t\tOUTPUT_VARIABLE PYTHON_LIBRARY\n\t\t\t)\n\n\t\tSET(K3D_PYTHON_INCLUDE_PATH\n\t\t\t${PYTHON_INCLUDE_PATH} CACHE PATH \"Path to the directory containg Python header files.\"\n\t\t\t)\n\n\t\tSET(K3D_PYTHON_LIBRARY\n\t\t\t${PYTHON_LIBRARY} CACHE FILEPATH \"Path to the Python link library.\"\n\t\t\t)\n\n\t\tMARK_AS_ADVANCED(K3D_PYTHON_INCLUDE_PATH)\n\t\tMARK_AS_ADVANCED(K3D_PYTHON_LIBRARY)\n\t\tMARK_AS_ADVANCED(PYTHON_EXECUTABLE)\n\n\t\tIF(K3D_PYTHON_INCLUDE_PATH AND K3D_PYTHON_LIBRARY)\n\t\t\tSET(K3D_PYTHON_INCLUDE_DIRS\n\t\t\t\t${K3D_PYTHON_INCLUDE_PATH}\n\t\t\t\t)\n\n\t\t\tSET(K3D_PYTHON_LIBS\n\t\t\t\t${K3D_PYTHON_LIBRARY}\n\t\t\t\t)\n\n\t\t\tSET(K3D_PYTHON_FOUND 1)\n\t\tENDIF()\n\tENDIF()\nELSE(APPLE)\n\tINCLUDE(FindPythonInterp)\n\tINCLUDE(FindPythonLibs)\n\n\tIF(PYTHONINTERP_FOUND AND PYTHONLIBS_FOUND)\n\t\tSET(K3D_PYTHON_INCLUDE_DIRS\n\t\t\t${PYTHON_INCLUDE_PATH}\n\t\t\t)\n\n\t\tSET(K3D_PYTHON_LIBS\n\t\t\t${PYTHON_LIBRARY}\n\t\t\t)\n\n\t\tMARK_AS_ADVANCED(PYTHON_INCLUDE_PATH)\n\t\tMARK_AS_ADVANCED(PYTHON_LIBRARY)\n\t\tMARK_AS_ADVANCED(PYTHON_DEBUG_LIBRARIES)\n\t\tMARK_AS_ADVANCED(PY_MODULES_LIST)\n\t\tMARK_AS_ADVANCED(PY_STATIC_MODULES_LIST)\n\n\t\tSET(K3D_PYTHON_FOUND 1)\n\tENDIF()\nENDIF(APPLE)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindSigC.cmake",
    "content": "SET(K3D_SIGC_FOUND 0)\n\nINCLUDE(K3DFindPkgConfig)\nPKG_CHECK_MODULES(SIGC sigc++-2.0)\n\nIF(SIGC_FOUND)\n\tSET(K3D_SIGC_INCLUDE_DIRS\n\t\t${SIGC_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_SIGC_LIB_DIRS\n\t\t${SIGC_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_SIGC_LIBS\n\t\t${SIGC_LIBRARIES}\n\t\t)\n\n\tSET(K3D_SIGC_FOUND 1)\n\n\tADD_DEFINITIONS(-DK3D_HAVE_SIGC_2_0)\n\nENDIF(SIGC_FOUND)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindSuperLU.cmake",
    "content": "SET(K3D_SUPERLU_FOUND 0)\n\n#note: Include files are assumed to be in the standard include path, in the superlu dir\n\nFIND_LIBRARY(K3D_SUPERLU_LIBRARY superlu\n\tDOC \"The SuperLU library\"\n\t)\nMARK_AS_ADVANCED(K3D_SUPERLU_LIBRARY)\n\nFIND_LIBRARY(K3D_BLAS_LIBRARY blas\n\tDOC \"The BLAS library used by SuperLU\"\n\t)\nMARK_AS_ADVANCED(K3D_BLAS_LIBRARY)\n\nIF(K3D_SUPERLU_LIBRARY AND K3D_BLAS_LIBRARY)\n\tSET(K3D_SUPERLU_FOUND 1)\nENDIF(K3D_SUPERLU_LIBRARY AND K3D_BLAS_LIBRARY)\n"
  },
  {
    "path": "cmake/modules/K3DFindTBB.cmake",
    "content": "SET(K3D_TBB_FOUND 0)\n\nFIND_PATH(K3D_TBB_INCLUDE_DIR parallel_for.h\n\t/usr/local/include\n\t/usr/include\n\tPATH_SUFFIXES tbb\n\t)\n\nFIND_LIBRARY(K3D_TBB_LIBRARY tbb\n\t/usr/local/lib\n\t/usr/lib\n\t)\n\nIF(K3D_TBB_INCLUDE_DIR AND K3D_TBB_LIBRARY)\n\tSET(K3D_TBB_FOUND 1)\nENDIF(K3D_TBB_INCLUDE_DIR AND K3D_TBB_LIBRARY)\n\nMARK_AS_ADVANCED(\n\tK3D_TBB_INCLUDE_DIR\n\tK3D_TBB_LIBRARY\n\t)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindTIFF.cmake",
    "content": "INCLUDE(FindGTK)\n\nFIND_PATH(K3D_TIFF_INCLUDE_DIR tiff.h\n\t/usr/include\n\tc:/gtk/include\n\t${K3D_GTK_DIR}/include\n\tDOC \"Directory where the libtiff header files are located\"\n\t)\nMARK_AS_ADVANCED(K3D_TIFF_INCLUDE_DIR)\n\nSET(K3D_TIFF_LIB tiff CACHE STRING \"\")\nMARK_AS_ADVANCED(K3D_TIFF_LIB)\n\nSET(K3D_TIFF_INCLUDE_DIRS\n\t${K3D_TIFF_INCLUDE_DIR}\n\t)\n\nSET(K3D_TIFF_LIBS\n\t${K3D_TIFF_LIB}\n\t)\n\nSET(K3D_TIFF_FOUND 1)\n\n"
  },
  {
    "path": "cmake/modules/K3DFindXML.cmake",
    "content": "SET(K3D_XML_FOUND 0)\n\nMESSAGE(STATUS \"checking for package 'EXPAT'\")\nFIND_PACKAGE(EXPAT)\nIF(EXPAT_FOUND)\n\tADD_DEFINITIONS(-DK3D_HAVE_EXPAT)\n\tSET(K3D_XML_INCLUDE_DIR ${EXPAT_INCLUDE_DIRS})\n\tSET(K3D_XML_LIB ${EXPAT_LIBRARIES})\n\tSET(K3D_XML_FOUND 1)\n\tMESSAGE(STATUS \"  found EXPAT\")\nELSE()\n\tMESSAGE(STATUS \"  package 'EXPAT' not found\")\n\tMESSAGE(STATUS \"checking for package 'LibXml2'\")\n\tFIND_PACKAGE(LibXml2)\n\tIF(LIBXML2_FOUND)\n\t\tADD_DEFINITIONS(-DK3D_HAVE_LIBXML2)\n\t\tSET(K3D_XML_INCLUDE_DIR ${LIBXML2_INCLUDE_DIR})\n\t\tSET(K3D_XML_LIB ${LIBXML2_LIBRARIES})\n\t\tSET(K3D_XML_FOUND 1)\n\t\tMESSAGE(STATUS \"  found LibXml2\")\n\tELSE()\n\t\tMESSAGE(STATUS \"  package 'LibXml2' not found\")\n\tENDIF()\nENDIF()\n"
  },
  {
    "path": "cmake/modules/K3DFindZlib.cmake",
    "content": "SET(K3D_ZLIB_FOUND 0)\n\nfind_package(ZLIB)\n\nIF(ZLIB_FOUND)\n\tSET(K3D_ZLIB_INCLUDE_DIRS\n\t\t${ZLIB_INCLUDE_DIRS}\n\t\t)\n\n\tSET(K3D_ZLIB_LIB_DIRS\n\t\t${ZLIB_LIBRARY_DIRS}\n\t\t)\n\n\tSET(K3D_ZLIB_LIBS\n\t\t${ZLIB_LIBRARIES}\n\t\t)\n\n\tSET(K3D_ZLIB_FOUND 1)\nENDIF(ZLIB_FOUND)"
  },
  {
    "path": "cmake/modules/K3DGenerateDEF.cmake",
    "content": "MACRO(K3D_GENERATE_DEF_FILE TARGET_NAME)\n\tIF(MSVC)\n\t\tADD_DEPENDENCIES(${TARGET_NAME} k3d-gendef)\n\t\tGET_TARGET_PROPERTY(gendef_EXE k3d-gendef LOCATION) \n\t\tADD_CUSTOM_COMMAND(TARGET ${TARGET_NAME}\n\t\t\tPRE_LINK\n\t\t\tCOMMAND ${gendef_EXE} $(IntDir)\\\\$(InputName).def $(TargetFileName) $(IntDir)\\\\*.obj)\n\t\tSET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES LINK_FLAGS \"/DEF:$(IntDir)\\\\$(InputName).def\")\n\tENDIF(MSVC)\nENDMACRO(K3D_GENERATE_DEF_FILE)\n\n"
  },
  {
    "path": "cmake/modules/K3DOutOfSourceBuild.cmake",
    "content": "# Disallow in-source build\nSTRING(COMPARE EQUAL \"${CMAKE_SOURCE_DIR}\" \"${CMAKE_BINARY_DIR}\" K3D_IN_SOURCE)\nIF(K3D_IN_SOURCE)\n\tMESSAGE(FATAL_ERROR \"K-3D requires an out of source build. Please create a separate build directory and run 'cmake path_to_k3d [options]' there.\")\nENDIF(K3D_IN_SOURCE)\n\n"
  },
  {
    "path": "cmake/modules/K3DParseArguments.cmake",
    "content": "MACRO(K3D_PARSE_ARGUMENTS prefix arg_names option_names)\n  SET(DEFAULT_ARGS)\n  FOREACH(arg_name ${arg_names})    \n    SET(${prefix}_${arg_name})\n  ENDFOREACH(arg_name)\n  FOREACH(option ${option_names})\n    SET(${prefix}_${option} FALSE)\n  ENDFOREACH(option)\n\n  SET(current_arg_name DEFAULT_ARGS)\n  SET(current_arg_list)\n  FOREACH(arg ${ARGN})            \n    SET(larg_names ${arg_names})    \n    LIST(FIND larg_names \"${arg}\" is_arg_name)                   \n    IF (is_arg_name GREATER -1)\n      SET(${prefix}_${current_arg_name} ${current_arg_list})\n      SET(current_arg_name ${arg})\n      SET(current_arg_list)\n    ELSE (is_arg_name GREATER -1)\n      SET(loption_names ${option_names})    \n      LIST(FIND loption_names \"${arg}\" is_option)            \n      IF (is_option GREATER -1)\n       SET(${prefix}_${arg} TRUE)\n      ELSE (is_option GREATER -1)\n       SET(current_arg_list ${current_arg_list} ${arg})\n      ENDIF (is_option GREATER -1)\n    ENDIF (is_arg_name GREATER -1)\n  ENDFOREACH(arg)\n  SET(${prefix}_${current_arg_name} ${current_arg_list})\nENDMACRO(K3D_PARSE_ARGUMENTS)\n\n"
  },
  {
    "path": "cmake/modules/K3DSystemConfiguration.cmake",
    "content": "# Compiler configuration\nIF(WIN32)\n\tIF(MSVC)\n\t\tSET(K3D_COMPILER_MSVC TRUE)\n\tELSE(MSVC)\n\t\tSET(K3D_COMPILER_GCC TRUE)\n\tENDIF(MSVC)\nELSE(WIN32)\n\tSET(K3D_COMPILER_GCC TRUE)\nENDIF(WIN32)\n\n# Win32 API configuration\nIF(WIN32)\n\tSET(K3D_API_WIN32 TRUE)\nENDIF(WIN32)\n\n# Darwin API configuration\nIF(APPLE)\n\tSET(K3D_API_DARWIN TRUE)\n\n  EXECUTE_PROCESS(\n    COMMAND sw_vers -productVersion\n    OUTPUT_VARIABLE K3D_OSX_VERSION\n    )\n  STRING(REGEX REPLACE \"([0-9]*)[.]([0-9]*)[.]([0-9]*).*\" \"\\\\1\" K3D_OSX_MAJOR_VERSION \"${K3D_OSX_VERSION}\")\n  STRING(REGEX REPLACE \"([0-9]*)[.]([0-9]*)[.]([0-9]*).*\" \"\\\\2\" K3D_OSX_MINOR_VERSION \"${K3D_OSX_VERSION}\")\n\nENDIF(APPLE)\n\n"
  },
  {
    "path": "cmake/modules/K3DWordSize.cmake",
    "content": "# Detect the word-size for the current platform ...\nMESSAGE(STATUS \"checking the width of std::vector<>::size_type for this platform\")\n\nTRY_RUN(\n\tK3D_PLATFORM_SIZE_TYPE\n\tK3D_PLATFORM_SIZE_TYPE_COMPILE\n\t${CMAKE_CURRENT_BINARY_DIR}\n\t${CMAKE_CURRENT_SOURCE_DIR}/configuration/size_type.cpp)\n\nMESSAGE(STATUS \"  std::vector<>::size_type is ${K3D_PLATFORM_SIZE_TYPE} bits\")\n\nIF(K3D_PLATFORM_SIZE_TYPE EQUAL 32)\n\tSET(K3D_UINT_T_32_BITS 1)\nELSEIF(K3D_PLATFORM_SIZE_TYPE EQUAL 64)\n\tSET(K3D_UINT_T_64_BITS 1)\nELSE(K3D_PLATFORM_SIZE_TYPE EQUAL 32)\n\tMESSAGE(SEND_ERROR \"Error detecting platform word-size.\")\nENDIF(K3D_PLATFORM_SIZE_TYPE EQUAL 32)\n\n"
  },
  {
    "path": "configuration/size_type.cpp",
    "content": "#include <vector>\n\nint main(int argc, char* argv[])\n{\n\treturn sizeof(std::vector<int>::size_type) * 8;\n}\n\n"
  },
  {
    "path": "desktop/CMakeLists.txt",
    "content": "configure_file(k3d.desktop.in k3d.desktop)\n\nINSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/k3d.desktop DESTINATION share/applications)\n"
  },
  {
    "path": "desktop/k3d.desktop.in",
    "content": "[Desktop Entry]\nEncoding=UTF-8\nVersion=1.0\nType=Application\nName=K-3D\nGenericName=3D modeling and animation software\nComment=Free-as-in-freedom 3D modeling and animation software\nTryExec=@CMAKE_INSTALL_PREFIX@/bin/k3d\nExec=@CMAKE_INSTALL_PREFIX@/bin/k3d\nCategories=Graphics;3DGraphics\nIcon=@CMAKE_INSTALL_PREFIX@/share/k3d/icons/k3d.png\nTerminal=false\n"
  },
  {
    "path": "distribution/CMakeLists.txt",
    "content": "# Setup automatic generation of the changelog\nADD_CUSTOM_TARGET(changelog\n\tCOMMAND ${HGCOMMAND} log > ${k3d_BINARY_DIR}/ChangeLog\n\tWORKING_DIRECTORY ${k3d_SOURCE_DIR}\n\t)\n\n# Setup convenience targets for tagging and branching\nSET(K3D_VERSION_TAG \"k3d-${K3D_MAJOR_VERSION}.${K3D_MINOR_VERSION}.${K3D_RELEASE_VERSION}.${K3D_BUILD_VERSION}\")\nADD_CUSTOM_TARGET(tag-version\n\tCOMMAND ${HGCOMMAND} tag ${K3D_VERSION_TAG}\n\tWORKING_DIRECTORY ${k3d_SOURCE_DIR}\n\t)\n\n#SET(K3D_BRANCH_TAG \"k3d-release-${K3D_MAJOR_VERSION}.${K3D_MINOR_VERSION}\")\n#ADD_CUSTOM_TARGET(tag-branch\n#\tCOMMAND ${SVNCOMMAND} cp ${K3D_SVN_TRUNK}\n#\t${K3D_SVN_BRANCHES}/${K3D_BRANCH_TAG} -m \"COMP: Branched K-3D Version ${K3D_MAJOR_VERSION}.${K3D_MINOR_VERSION}\"\n#\tWORKING_DIRECTORY ${k3d_SOURCE_DIR}\n#\t)\n\n# Get a SourceForge username so we can upload distributables to the FRS\nIF(WIN32)\n\tSET(K3D_SOURCEFORGE_USERNAME \"$ENV{USERNAME}\" CACHE STRING \"SourceForge user account name, for uploading distribution files.\")\nELSE(WIN32)\n\tSET(K3D_SOURCEFORGE_USERNAME \"$ENV{USER}\" CACHE STRING \"SourceForge user account name, for uploading distribution files.\")\nENDIF(WIN32)\n\n# Setup default packaging parameters (deprecated) ...\nSET(CPACK_PACKAGE_DESCRIPTION \"K-3D free-as-in-freedom modeling, animation and rendering system\")\nSET(CPACK_PACKAGE_FILE_NAME \"k3d-setup-${K3D_VERSION}\")\nSET(CPACK_PACKAGE_INSTALL_DIRECTORY \"K-3D ${K3D_VERSION}\")\nSET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY \"K-3D ${K3D_VERSION}\")\nSET(CPACK_PACKAGE_NAME \"k3d\")\nSET(CPACK_PACKAGE_VENDOR \"www.k-3d.org\")\nSET(CPACK_PACKAGE_VERSION ${K3D_VERSION})\nSET(CPACK_PACKAGE_VERSION_MAJOR ${K3D_MAJOR_VERSION})\nSET(CPACK_PACKAGE_VERSION_MINOR ${K3D_MINOR_VERSION})\nSET(CPACK_PACKAGE_VERSION_PATCH ${K3D_RELEASE_VERSION})\nSET(CPACK_RESOURCE_FILE_LICENSE \"${k3d_SOURCE_DIR}/COPYING\")\n\n# Setup global packaging parameters ...\nSET(K3D_CPACK_INSTALL_CMAKE_PROJECTS \"${k3d_BINARY_DIR};k3d;ALL;/\")\nSET(K3D_CPACK_PACKAGE_DESCRIPTION \"K-3D free-as-in-freedom modeling, animation, and rendering system.\")\nSET(K3D_CPACK_PACKAGE_FILE_NAME \"k3d-setup-${K3D_VERSION}\")\nSET(K3D_CPACK_PACKAGE_NAME \"k3d\")\nSET(K3D_CPACK_PACKAGE_VERSION \"${K3D_VERSION}\")\nSET(K3D_CPACK_RESOURCE_FILE_LICENSE \"${k3d_SOURCE_DIR}/COPYING\")\nSET(K3D_CPACK_SOURCE_IGNORE_FILES \"/CVS/;/.svn/;/.hg/\")\nSET(K3D_CPACK_SOURCE_INSTALLED_DIRECTORIES \"${k3d_SOURCE_DIR};/\")\nSET(K3D_CPACK_SOURCE_PACKAGE_FILE_NAME \"k3d-source-${K3D_VERSION}\")\n\n# Setup some macros that can be used by the platform-specific distribution logic\nMACRO(K3D_CHECK_INSTALLED_VERSION FOUND PACKAGE EXPECTED)\n\tIF(NOT ${FOUND} STREQUAL ${EXPECTED})\n\t\tMESSAGE(SEND_ERROR \"Found ${PACKAGE} version ${FOUND} - for installation, version ${EXPECTED} is required.\")\n\tENDIF(NOT ${FOUND} STREQUAL ${EXPECTED})\nENDMACRO(K3D_CHECK_INSTALLED_VERSION)\n\nMACRO(K3D_CHECK_INSTALLED_PYTHON_DEPENDENCY CONFIG)\n\tIF(${CONFIG} AND NOT K3D_INSTALL_PYTHON)\n\t\tMESSAGE(SEND_ERROR \"K3D_INSTALL_PYTHON is required by ${CONFIG}.\")\n\tENDIF(${CONFIG} AND NOT K3D_INSTALL_PYTHON)\nENDMACRO(K3D_CHECK_INSTALLED_PYTHON_DEPENDENCY)\n\n# Generate source packages\nADD_SUBDIRECTORY(source)\n\n# Generate platform-specific binary packages\nIF(APPLE)\n\tADD_SUBDIRECTORY(osx)\nENDIF(APPLE)\n\nIF(UNIX AND NOT APPLE)\n\tADD_SUBDIRECTORY(posix)\nENDIF(UNIX AND NOT APPLE)\n\nIF(WIN32)\n\tADD_SUBDIRECTORY(win32)\nENDIF(WIN32)\n\n"
  },
  {
    "path": "distribution/genslmeta.bat",
    "content": ":: Check fie name was passed\nIF [%1]==[] GOTO E_FLAG\n\n:: pass shader file through preprocessor then pass results to sl2xml \ncpp.exe -E -P -x c %1 | k3d-sl2xml.exe > %1.slmeta\nEXIT\n\n:E_FLAG\nECHO. shader name missing\nECHO. \n\n"
  },
  {
    "path": "distribution/osx/CMakeLists.txt",
    "content": "OPTION(K3D_CREATE_PACKAGEMAKER_PACKAGE \"Include an option to build a MacOSX PackageMaker package.\" OFF)\n\n# This is an ugly hack, we should be able to detect this automatically, but I'm feeling lazy ...\nSET(K3D_MACPORTS_DIR \"/opt/local\" CACHE PATH \"Root directory containing installed MacPorts packages\")\n\nINSTALL(\n  PROGRAMS\n    ${K3D_MACPORTS_DIR}/lib/libgailutil.18.dylib\n  DESTINATION\n    lib\n  )\n\nINSTALL(\n  DIRECTORY\n    ${K3D_MACPORTS_DIR}/lib/gtk-2.0/2.10.0\n  DESTINATION\n    lib/gtk-2.0\n  USE_SOURCE_PERMISSIONS\n  )\n\nINSTALL(\n  DIRECTORY\n    ${K3D_MACPORTS_DIR}/lib/gtk-2.0/modules\n  DESTINATION\n    lib/gtk-2.0/2.10.0\n  USE_SOURCE_PERMISSIONS\n  )\n\nINSTALL(\n  DIRECTORY\n    ${K3D_MACPORTS_DIR}/lib/pango\n  DESTINATION\n    lib\n  USE_SOURCE_PERMISSIONS\n  )\n\nINSTALL(\n  DIRECTORY\n    ${K3D_MACPORTS_DIR}/etc/gtk-2.0\n    ${K3D_MACPORTS_DIR}/etc/fonts\n    ${K3D_MACPORTS_DIR}/etc/pango\n  DESTINATION\n    etc\n  )\n\n# Dependencies from MacPorts not caught elsewhere\nINSTALL(\n  DIRECTORY\n    ${K3D_MACPORTS_DIR}/lib/gdk-pixbuf-2.0\n  DESTINATION\n    lib\n  USE_SOURCE_PERMISSIONS\n  )\n\n# Enable automatic installation of library dependencies ...\nCONFIGURE_FILE(\"${CMAKE_CURRENT_SOURCE_DIR}/dependencies.cmake.in\" \"${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake\" @ONLY)\nINSTALL(SCRIPT \"${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake\")\n\n# More accurate guess of the OS architecture\nEXEC_PROGRAM(uname ARGS -m OUTPUT_VARIABLE K3D_OSX_ARCH)\n\n# Bundle packaging is always available ...\nADD_SUBDIRECTORY(bundle)\n\n# We optionally support creating packagemaker packages ...\nIF(K3D_CREATE_PACKAGEMAKER_PACKAGE)\n\tADD_SUBDIRECTORY(packagemaker)\nENDIF(K3D_CREATE_PACKAGEMAKER_PACKAGE)\n\n"
  },
  {
    "path": "distribution/osx/bundle/CMakeLists.txt",
    "content": "# Generate an application bundle (new-style)\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-bundle.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-bundle.cpack)\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in ${CMAKE_CURRENT_BINARY_DIR}/Info.plist @ONLY)\nADD_CUSTOM_TARGET(package-binary-bundle\n\t${CMAKE_CPACK_COMMAND}\n\t--config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-bundle.cpack\n\t)\n\n# Upload the binary bundle to SourceForge for use with the FRS\nADD_CUSTOM_TARGET(upload-binary-bundle\n\trsync -avP -e ssh ${CMAKE_CURRENT_BINARY_DIR}/k3d-setup-${K3D_VERSION}-${K3D_OSX_ARCH}.dmg ${K3D_SOURCEFORGE_USERNAME}@frs.sourceforge.net:uploads/\n\t)\n\n"
  },
  {
    "path": "distribution/osx/bundle/Info.plist.in",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n\t<dict>\n\t\t<key>CFBundleDevelopmentRegion</key>\n\t\t<string>English</string>\n\t\t<key>CFBundleExecutable</key>\n\t\t<string>K-3D</string>\n\t\t<key>CFBundleGetInfoString</key>\n\t\t<string>@K3D_VERSION@, @K3D_COPYRIGHT@</string>\n\t\t<key>CFBundleIconFile</key>\n\t\t<string>K-3D</string>\n\t\t<key>CFBundleIdentifier</key>\n\t\t<string>org.k-3d.K-3D</string>\n\t\t<key>CFBundleInfoDictionaryVersion</key>\n\t\t<string>6.0</string>\n\t\t<key>CFBundlePackageType</key>\n\t\t<string>APPL</string>\n\t\t<key>CFBundleShortVersionString</key>\n\t\t<string>@K3D_VERSION@</string>\n\t\t<key>CFBundleSignature</key>\n\t\t<string>K-3D</string>\n\t\t<key>CFBundleVersion</key>\n\t\t<string>@K3D_VERSION@</string>\n\t\t<key>NSHumanReadableCopyright</key>\n\t\t<string>@K3D_COPYRIGHT@</string>\n\t\t<key>LSMinimumSystemVersion</key>\n\t\t<string>10.5</string>\n\t</dict>\n</plist>\n"
  },
  {
    "path": "distribution/osx/bundle/k3d-startup",
    "content": "#!/bin/sh\n#\n# Author: Aaron Voisine <aaron@voisine.org>\n# Inkscape Modifications: Michael Wybrow <mjwybrow@users.sourceforge.net>\n# K-3D Modifications: Timothy M. Shead <tshead@k-3d.com>\n\necho \"INFO: Starting $0\"\n\nK3D_BUNDLE=\"`echo \"$0\" | sed -e 's/\\/Contents\\/MacOS\\/K-3D//'`\"\nK3D_RESOURCES=\"$K3D_BUNDLE/Contents/Resources\"\nK3D_TEMP=\"/tmp/k3d/$(id -ru)\"\nK3D_ETC=\"$K3D_TEMP/etc\"\nK3D_PANGO_RC_FILE=\"$K3D_ETC/pango/pangorc\"\n\nrm -rf \"$K3D_TEMP\"\nmkdir -p \"$K3D_ETC/pango\"\n\nsed -e 's|/opt/local/etc|'\"$K3D_ETC|g\" \"$K3D_RESOURCES/etc/pango/pangorc\" > \"$K3D_ETC/pango/pangorc\"\nsed -e 's|/opt/local|\\\"'\"$K3D_RESOURCES|g\" -e \"s/\\.so/.so\\\"/g\" \"$K3D_RESOURCES/etc/pango/pango.modules\" > \"$K3D_ETC/pango/pango.modules\"\nsed -e 's|/opt/local|'\"$K3D_RESOURCES|g\" -e \"s/\\.so/.so\\\"/g\" \"$K3D_RESOURCES/etc/gtk-2.0/gdk-pixbuf.loaders\" > \"$K3D_ETC/gdk-pixbuf.loaders\"\ncp -f \"$K3D_RESOURCES/etc/pango/pangox.aliases\" \"$K3D_ETC/pango/pangox.aliases\"\n\nexport \"FONTCONFIG_PATH=$K3D_RESOURCES/etc/fonts\"\nexport \"GDK_PIXBUF_MODULE_FILE=$K3D_ETC/gdk-pixbuf.loaders\"\nexport \"GTK_PATH=$K3D_RESOURCES/lib/gtk-2.0\"\nexport \"PANGO_RC_FILE=$K3D_PANGO_RC_FILE\"\nexport \"PATH=$K3D_RESOURCES/bin:$PATH\"\n\nexport\nexec \"$K3D_RESOURCES/bin/k3d\" \"--log-level=debug\" \"--plugins=$K3D_RESOURCES/lib/k3d/plugins\" \"--share=$K3D_RESOURCES/share/k3d\" \"--ui=$K3D_RESOURCES/lib/k3d/plugins/k3d-ngui.module\"\n\necho \"INFO: Finishing $0\"\n\n"
  },
  {
    "path": "distribution/osx/bundle/package-binary-bundle.cpack.in",
    "content": "SET(CPACK_BUNDLE_ICON \"${share_SOURCE_DIR}/k3d/icons/k3d.icns\")\nSET(CPACK_BUNDLE_NAME \"K-3D\")\nSET(CPACK_BUNDLE_PLIST \"${CMAKE_CURRENT_BINARY_DIR}/Info.plist\")\nSET(CPACK_BUNDLE_STARTUP_COMMAND \"${CMAKE_CURRENT_SOURCE_DIR}/k3d-startup\")\nSET(CPACK_CMAKE_GENERATOR \"${CMAKE_GENERATOR}\")\nSET(CPACK_GENERATOR \"Bundle\")\nSET(CPACK_INSTALL_CMAKE_PROJECTS \"${K3D_CPACK_INSTALL_CMAKE_PROJECTS}\")\nSET(CPACK_PACKAGE_DESCRIPTION \"${K3D_CPACK_PACKAGE_DESCRIPTION}\")\nSET(CPACK_PACKAGE_FILE_NAME \"k3d-setup-${K3D_VERSION}-${K3D_OSX_ARCH}\")\nSET(CPACK_PACKAGE_ICON \"${CMAKE_CURRENT_SOURCE_DIR}/volume.icns\")\nSET(CPACK_PACKAGE_NAME \"${K3D_CPACK_PACKAGE_NAME}\")\nSET(CPACK_PACKAGE_VERSION \"${K3D_CPACK_PACKAGE_VERSION}\")\n"
  },
  {
    "path": "distribution/osx/dependencies.cmake.in",
    "content": "include(BundleUtilities)\n\nfunction(gp_item_default_embedded_path_override item default_embedded_path_var)\n  set(${default_embedded_path_var} \"@executable_path/../lib\" PARENT_SCOPE)\nendfunction(gp_item_default_embedded_path_override)\n\nset(K3D_BUNDLE_DYLIBS \"\")\nfile(GLOB_RECURSE dylib_list \"${CMAKE_INSTALL_PREFIX}/*.so\" \"${CMAKE_INSTALL_PREFIX}/*.dylib\" \"${CMAKE_INSTALL_PREFIX}/*.module\")\nforeach(lib ${dylib_list})\n  if(NOT IS_SYMLINK ${lib})\n    list(APPEND K3D_BUNDLE_DYLIBS ${lib})\n  endif()\nendforeach()\n\nset(DEP_LIB_DIRS \"/opt/local/lib\")\nmessage(\"prefix path: ${CMAKE_PREFIX_PATH}\")\nforeach(prefix_path @CMAKE_PREFIX_PATH@)\n  list(APPEND DEP_LIB_DIRS \"${prefix_path}/lib\" )\nendforeach()\nlist(APPEND DEP_LIB_DIRS @BOOST_ROOT@)\n\nmessage(\"Getting dependencies from ${DEP_LIB_DIRS}\")\n\nfixup_bundle(${CMAKE_INSTALL_PREFIX}/bin/k3d \"${K3D_BUNDLE_DYLIBS}\" \"${DEP_LIB_DIRS}\")\nverify_bundle_prerequisites(${CMAKE_INSTALL_PREFIX} verify_result verify_info)\nmessage(\"Bundle verify returned ${verify_result} with info ${verify_info}\")"
  },
  {
    "path": "distribution/osx/packagemaker/CMakeLists.txt",
    "content": "# The CPack PackageMaker generator ignores CMAKE_INSTALL_PREFIX and places everything in /usr, complain if there is a mismatch\nIF(NOT \"${CMAKE_INSTALL_PREFIX}\" STREQUAL \"/usr\")\n       MESSAGE(SEND_ERROR \"K3D_CREATE_PACKAGEMAKER_PACKAGE requires CMAKE_INSTALL_PREFIX set to \\\"/usr\\\".\")\nENDIF(NOT \"${CMAKE_INSTALL_PREFIX}\" STREQUAL \"/usr\")\n\n# Generate a packagemaker package ...\nCONFIGURE_FILE(${k3d_SOURCE_DIR}/COPYING ${CMAKE_CURRENT_BINARY_DIR}/COPYING.txt COPYONLY)\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-packagemaker.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-packagemaker.cpack)\n\nADD_CUSTOM_TARGET(package-binary-packagemaker\n\t${CMAKE_CPACK_COMMAND}\n\t--config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-packagemaker.cpack\n\t)\n\n"
  },
  {
    "path": "distribution/osx/packagemaker/package-binary-packagemaker.cpack.in",
    "content": "SET(CPACK_CMAKE_GENERATOR \"${CMAKE_GENERATOR}\")\nSET(CPACK_GENERATOR \"PackageMaker\")\nSET(CPACK_INSTALL_CMAKE_PROJECTS \"${K3D_CPACK_INSTALL_CMAKE_PROJECTS}\")\nSET(CPACK_PACKAGE_DESCRIPTION \"${K3D_CPACK_PACKAGE_DESCRIPTION}\")\nSET(CPACK_PACKAGE_EXECUTABLES \"k3d\" \"K-3D ${K3D_VERSION}\")\nSET(CPACK_PACKAGE_FILE_NAME \"k3d-setup-${K3D_VERSION}-${CMAKE_SYSTEM_PROCESSOR}\")\nSET(CPACK_PACKAGE_NAME \"K-3D\")\nSET(CPACK_PACKAGE_VENDOR \"www.k-3d.org\")\nSET(CPACK_PACKAGE_VERSION \"${K3D_CPACK_PACKAGE_VERSION}\")\nSET(CPACK_RESOURCE_FILE_LICENSE \"${CMAKE_CURRENT_BINARY_DIR}/COPYING.txt\")\nSET(CPACK_RESOURCE_FILE_README \"${CMAKE_CURRENT_SOURCE_DIR}/readme.txt\")\nSET(CPACK_RESOURCE_FILE_WELCOME \"${CMAKE_CURRENT_SOURCE_DIR}/welcome.txt\")\n"
  },
  {
    "path": "distribution/osx/packagemaker/readme.txt",
    "content": "An X11 server is required to run K-3D!\n\nK-3D is licensed under the GNU General Public License.\n\nFor further information, visit the K-3D web site:\n\nhttp://www.k-3d.org\n\nThank You,\nThe K-3D Team\n\n"
  },
  {
    "path": "distribution/osx/packagemaker/welcome.txt",
    "content": "K-3D is a complete free-as-in-freedom 3D modeling, animation, and rendering system.\n\nK-3D features a robust plugin architecture and visualization pipeline, designed to scale to the needs of professional artists.  K-3D has been written from the ground up to generate motion picture quality animation using RenderMan render engines.\n\n"
  },
  {
    "path": "distribution/posix/CMakeLists.txt",
    "content": "SET(K3D_PACKAGE_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}/K-3D ${K3D_VERSION}\")\nFILE(MAKE_DIRECTORY \"${K3D_PACKAGE_DIRECTORY}\")\n\n# Generate self-extracting tarballs\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-stgz.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-stgz.cpack)\nADD_CUSTOM_TARGET(package-binary-stgz\n\tWORKING_DIRECTORY \"${K3D_PACKAGE_DIRECTORY}\"\n\tCOMMAND ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-stgz.cpack\n\t)\n\n# Generate tarballs\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-tbz2.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-tbz2.cpack)\nADD_CUSTOM_TARGET(package-binary-tbz2\n\tWORKING_DIRECTORY \"${K3D_PACKAGE_DIRECTORY}\"\n\tCOMMAND ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-tbz2.cpack\n\t)\n\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-tgz.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-tgz.cpack)\nADD_CUSTOM_TARGET(package-binary-tgz\n\tWORKING_DIRECTORY \"${K3D_PACKAGE_DIRECTORY}\"\n\tCOMMAND ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-tgz.cpack\n\t)\n\n# Note ... we intentionally don't provide upload capability for Posix packages, and leave distribution to the experts\n\n"
  },
  {
    "path": "distribution/posix/package-binary-stgz.cpack.in",
    "content": "SET(CPACK_CMAKE_GENERATOR \"${CMAKE_GENERATOR}\")\nSET(CPACK_GENERATOR \"STGZ\")\nSET(CPACK_INSTALL_CMAKE_PROJECTS \"${K3D_CPACK_INSTALL_CMAKE_PROJECTS}\")\nSET(CPACK_PACKAGE_DESCRIPTION \"${K3D_CPACK_PACKAGE_DESCRIPTION}\")\nSET(CPACK_PACKAGE_FILE_NAME \"${K3D_CPACK_PACKAGE_FILE_NAME}\")\nSET(CPACK_PACKAGE_NAME \"${K3D_CPACK_PACKAGE_NAME}\")\nSET(CPACK_PACKAGE_VERSION \"${K3D_CPACK_PACKAGE_VERSION}\")\nSET(CPACK_RESOURCE_FILE_LICENSE \"${K3D_CPACK_RESOURCE_FILE_LICENSE}\")\n"
  },
  {
    "path": "distribution/posix/package-binary-tbz2.cpack.in",
    "content": "SET(CPACK_CMAKE_GENERATOR \"${CMAKE_GENERATOR}\")\nSET(CPACK_GENERATOR \"TBZ2\")\nSET(CPACK_INSTALL_CMAKE_PROJECTS \"${K3D_CPACK_INSTALL_CMAKE_PROJECTS}\")\nSET(CPACK_PACKAGE_DESCRIPTION \"${K3D_CPACK_PACKAGE_DESCRIPTION}\")\nSET(CPACK_PACKAGE_FILE_NAME \"${K3D_CPACK_PACKAGE_FILE_NAME}\")\nSET(CPACK_PACKAGE_NAME \"${K3D_CPACK_PACKAGE_NAME}\")\nSET(CPACK_PACKAGE_VERSION \"${K3D_CPACK_PACKAGE_VERSION}\")\nSET(CPACK_RESOURCE_FILE_LICENSE \"${K3D_CPACK_RESOURCE_FILE_LICENSE}\")\n"
  },
  {
    "path": "distribution/posix/package-binary-tgz.cpack.in",
    "content": "SET(CPACK_CMAKE_GENERATOR \"${CMAKE_GENERATOR}\")\nSET(CPACK_GENERATOR \"TGZ\")\nSET(CPACK_INSTALL_CMAKE_PROJECTS \"${K3D_CPACK_INSTALL_CMAKE_PROJECTS}\")\nSET(CPACK_PACKAGE_DESCRIPTION \"${K3D_CPACK_PACKAGE_DESCRIPTION}\")\nSET(CPACK_PACKAGE_FILE_NAME \"${K3D_CPACK_PACKAGE_FILE_NAME}\")\nSET(CPACK_PACKAGE_NAME \"${K3D_CPACK_PACKAGE_NAME}\")\nSET(CPACK_PACKAGE_VERSION \"${K3D_CPACK_PACKAGE_VERSION}\")\nSET(CPACK_RESOURCE_FILE_LICENSE \"${K3D_CPACK_RESOURCE_FILE_LICENSE}\")\n"
  },
  {
    "path": "distribution/source/CMakeLists.txt",
    "content": "SET(K3D_PACKAGE_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}/K-3D ${K3D_VERSION}\")\nFILE(MAKE_DIRECTORY \"${K3D_PACKAGE_DIRECTORY}\")\n\n# Generate source packages\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-source-tbz2.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-source-tbz2.cpack)\nADD_CUSTOM_TARGET(package-source-tbz2\n\tWORKING_DIRECTORY \"${K3D_PACKAGE_DIRECTORY}\"\n\tCOMMAND ${CMAKE_CPACK_COMMAND} --config \"${CMAKE_CURRENT_BINARY_DIR}/package-source-tbz2.cpack\"\n\t)\n\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-source-tgz.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-source-tgz.cpack)\nADD_CUSTOM_TARGET(package-source-tgz\n\tWORKING_DIRECTORY \"${K3D_PACKAGE_DIRECTORY}\"\n\tCOMMAND ${CMAKE_CPACK_COMMAND} --config \"${CMAKE_CURRENT_BINARY_DIR}/package-source-tgz.cpack\"\n\t)\n\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-source-zip.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-source-zip.cpack)\nADD_CUSTOM_TARGET(package-source-zip\n\tWORKING_DIRECTORY \"${K3D_PACKAGE_DIRECTORY}\"\n\tCOMMAND ${CMAKE_CPACK_COMMAND} --config \"${CMAKE_CURRENT_BINARY_DIR}/package-source-zip.cpack\"\n\t)\n\n# Upload source packages to SourceForge\nADD_CUSTOM_TARGET(upload-package-source-tbz2\n\tDEPENDS \"${K3D_PACKAGE_DIRECTORY}/${K3D_CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.bz2\"\n\tWORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\"\n\tCOMMAND rsync -e ssh -R --progress --protect-args \"K-3D ${K3D_VERSION}/${K3D_CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.bz2\" \"${K3D_SOURCEFORGE_USERNAME},k3d@frs.sourceforge.net:/home/frs/project/k/k3/k3d/K-3D Source/\"\n\t)\n\nADD_CUSTOM_TARGET(upload-package-source-tgz\n\tDEPENDS \"${K3D_PACKAGE_DIRECTORY}/${K3D_CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz\"\n\tWORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\"\n\tCOMMAND rsync -e ssh -R --progress --protect-args \"K-3D ${K3D_VERSION}/${K3D_CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz\" \"${K3D_SOURCEFORGE_USERNAME},k3d@frs.sourceforge.net:/home/frs/project/k/k3/k3d/K-3D Source/\"\n\t)\n\nADD_CUSTOM_TARGET(upload-package-source-zip\n\tDEPENDS \"${K3D_PACKAGE_DIRECTORY}/${K3D_CPACK_SOURCE_PACKAGE_FILE_NAME}.zip\"\n\tWORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\"\n\tCOMMAND rsync -e ssh -R --progress --protect-args \"K-3D ${K3D_VERSION}/${K3D_CPACK_SOURCE_PACKAGE_FILE_NAME}.zip\" \"${K3D_SOURCEFORGE_USERNAME},k3d@frs.sourceforge.net:/home/frs/project/k/k3/k3d/K-3D Source/\"\n\t)\n\n"
  },
  {
    "path": "distribution/source/package-source-tbz2.cpack.in",
    "content": "SET(CPACK_CMAKE_GENERATOR \"${CMAKE_GENERATOR}\")\nSET(CPACK_GENERATOR \"TBZ2\")\nSET(CPACK_IGNORE_FILES \"${K3D_CPACK_SOURCE_IGNORE_FILES}\")\nSET(CPACK_INSTALLED_DIRECTORIES \"${K3D_CPACK_SOURCE_INSTALLED_DIRECTORIES}\")\nSET(CPACK_PACKAGE_DESCRIPTION \"${K3D_CPACK_PACKAGE_DESCRIPTION}\")\nSET(CPACK_PACKAGE_FILE_NAME \"${K3D_CPACK_SOURCE_PACKAGE_FILE_NAME}\")\nSET(CPACK_PACKAGE_NAME \"${K3D_CPACK_PACKAGE_NAME}\")\nSET(CPACK_PACKAGE_VERSION \"${K3D_CPACK_PACKAGE_VERSION}\")\n"
  },
  {
    "path": "distribution/source/package-source-tgz.cpack.in",
    "content": "SET(CPACK_GENERATOR \"TGZ\")\nSET(CPACK_CMAKE_GENERATOR \"${CMAKE_GENERATOR}\")\nSET(CPACK_IGNORE_FILES \"${K3D_CPACK_SOURCE_IGNORE_FILES}\")\nSET(CPACK_INSTALLED_DIRECTORIES \"${K3D_CPACK_SOURCE_INSTALLED_DIRECTORIES}\")\nSET(CPACK_PACKAGE_DESCRIPTION \"${K3D_CPACK_PACKAGE_DESCRIPTION}\")\nSET(CPACK_PACKAGE_FILE_NAME \"${K3D_CPACK_SOURCE_PACKAGE_FILE_NAME}\")\nSET(CPACK_PACKAGE_NAME \"${K3D_CPACK_PACKAGE_NAME}\")\nSET(CPACK_PACKAGE_VERSION \"${K3D_CPACK_PACKAGE_VERSION}\")\n"
  },
  {
    "path": "distribution/source/package-source-zip.cpack.in",
    "content": "SET(CPACK_CMAKE_GENERATOR \"${CMAKE_GENERATOR}\")\nSET(CPACK_GENERATOR \"ZIP\")\nSET(CPACK_IGNORE_FILES \"${K3D_CPACK_SOURCE_IGNORE_FILES}\")\nSET(CPACK_INSTALLED_DIRECTORIES \"${K3D_CPACK_SOURCE_INSTALLED_DIRECTORIES}\")\nSET(CPACK_PACKAGE_DESCRIPTION \"${K3D_CPACK_PACKAGE_DESCRIPTION}\")\nSET(CPACK_PACKAGE_FILE_NAME \"${K3D_CPACK_SOURCE_PACKAGE_FILE_NAME}\")\nSET(CPACK_PACKAGE_NAME \"${K3D_CPACK_PACKAGE_NAME}\")\nSET(CPACK_PACKAGE_VERSION \"${K3D_CPACK_PACKAGE_VERSION}\")\n"
  },
  {
    "path": "distribution/win32/CMakeLists.txt",
    "content": "OPTION(K3D_INSTALL_AQSIS \"Include Aqsis in the K-3D installer\" OFF)\nOPTION(K3D_INSTALL_BOOST \"Include Boost in the K-3D installer\" OFF)\nOPTION(K3D_INSTALL_CGKIT \"Include cgkit in the K-3D installer\" OFF)\nOPTION(K3D_INSTALL_GTKMM \"Include gtkmm in the K-3D installer\" OFF)\nOPTION(K3D_INSTALL_PYGTK \"Include PyGTK in the K-3D installer\" OFF)\nOPTION(K3D_INSTALL_PYOPENGL \"Include PyOpenGL in the K-3D installer\" OFF)\nOPTION(K3D_INSTALL_PYTHON \"Include Python in the K-3D installer\" OFF)\n\nK3D_CHECK_INSTALLED_PYTHON_DEPENDENCY(K3D_INSTALL_CGKIT)\nK3D_CHECK_INSTALLED_PYTHON_DEPENDENCY(K3D_INSTALL_PYGTK)\nK3D_CHECK_INSTALLED_PYTHON_DEPENDENCY(K3D_INSTALL_PYOPENGL)\n\n#install mingwm10.dll\nFIND_PROGRAM(K3D_MINGW_GCC mingw32-gcc.exe\n\tC:/mingw/bin\n\tDOC \"Path to the MinGW GCC command\")\n\nGET_FILENAME_COMPONENT(K3D_MINGW_PATH ${K3D_MINGW_GCC} PATH)\nINSTALL(FILES ${K3D_MINGW_PATH}/mingwm10.dll ${K3D_MINGW_PATH}/libstdc++-6.dll ${K3D_MINGW_PATH}/pthreadGC2.dll DESTINATION bin)\n\n# manually copy the HTML docs, since actually generating these on mingw is a royal pain\nINSTALL(DIRECTORY ${CMAKE_BINARY_DIR}/share/k3d/guide/html/ DESTINATION share/k3d/guide/html)\n\nSET(K3D_QT_DIR \"c:/qt\" CACHE PATH \"Root directory containing Qt\")\n\nIF(K3D_EXTRA_INSTALL_ROOT)\n  \tINSTALL(DIRECTORY\n\t\t${K3D_EXTRA_INSTALL_ROOT}/bin/\n\t\tDESTINATION bin\n\t\tFILES_MATCHING PATTERN \"*.dll\"\n\t)\nENDIF()\n\nIF(K3D_INSTALL_AQSIS)\n\tFIND_PROGRAM(K3D_AQSIS_COMMAND aqsis.exe\n\t\tDOC \"Path to an installed aqsis.exe.\"\n\t\t)\n\n\tIF(NOT K3D_AQSIS_COMMAND)\n\t\tMESSAGE(SEND_ERROR \"Could not locate aqsis.exe.\")\n\tENDIF(NOT K3D_AQSIS_COMMAND)\n\n\tIF(NOT K3D_BUILD_BUNDLED_RENDERMAN_ENGINES_MODULE)\n\t\tMESSAGE(SEND_ERROR \"K3D_INSTALL_AQSIS requires K3D_BUILD_BUNDLED_RENDERMAN_ENGINES_MODULE\")\n\tENDIF(NOT K3D_BUILD_BUNDLED_RENDERMAN_ENGINES_MODULE)\n\n\tEXECUTE_PROCESS(\n\t\tCOMMAND ${K3D_AQSIS_COMMAND} --version\n\t\tOUTPUT_VARIABLE K3D_AQSIS_VERSION\n\t\t)\n\tIF(K3D_AQSIS_VERSION)\n\t\tSTRING(REGEX REPLACE \" \\\\(revision.*\" \"\" K3D_AQSIS_VERSION ${K3D_AQSIS_VERSION})\n\t\tSTRING(REGEX REPLACE \"aqsis version \" \"\" K3D_AQSIS_VERSION ${K3D_AQSIS_VERSION})\n\t\tK3D_CHECK_INSTALLED_VERSION(${K3D_AQSIS_VERSION} \"Aqsis\" \"1.7.0\")\n\tELSE(K3D_AQSIS_VERSION)\n\t\tMESSAGE(SEND_ERROR \"Error determining Aqsis version.\")\n\tENDIF(K3D_AQSIS_VERSION)\n\n\tGET_FILENAME_COMPONENT(K3D_AQSIS_PATH ${K3D_AQSIS_COMMAND} PATH)\n\tINSTALL(DIRECTORY ${K3D_AQSIS_PATH}/ DESTINATION bin\n\t    USE_SOURCE_PERMISSIONS\n\t    PATTERN aqsisrc EXCLUDE\n\t\t)\n\tINSTALL(FILES ${K3D_QT_DIR}/bin/QtCore4.dll ${K3D_QT_DIR}/bin/QtGui4.dll DESTINATION bin)\n\t# Install generic aqsisrc, omitting paths (those are set at runtime through command line options)\n\tINSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/aqsisrc DESTINATION bin)\nENDIF(K3D_INSTALL_AQSIS)\n\nIF(K3D_INSTALL_BOOST)\n\tINSTALL(DIRECTORY\n\t\t${Boost_LIBRARY_DIRS}/\n\t\tDESTINATION bin\n\t\tFILES_MATCHING PATTERN \"*.dll\"\n\t\tPATTERN \"*-d-*\" EXCLUDE\n\t)\nENDIF(K3D_INSTALL_BOOST)\n\nIF(K3D_BUILD_COLLADA_IO_MODULE)\n    INSTALL(FILES ${K3D_COLLADA_LIBRARY} DESTINATION bin)\nENDIF(K3D_BUILD_COLLADA_IO_MODULE)\n\nIF(K3D_INSTALL_GTKMM)\n\tINCLUDE(K3DFindPkgConfig)\n\t\n\tPKG_CHECK_MODULES(ATK atk)\n\tPKG_CHECK_MODULES(ATKMM atkmm-1.6)\n\tPKG_CHECK_MODULES(CAIRO cairo)\n\tPKG_CHECK_MODULES(CAIROMM cairomm-1.0)\n\tPKG_CHECK_MODULES(GDK gdk-2.0)\n\tPKG_CHECK_MODULES(GDKGLEXT gdkglext-1.0)\n\tPKG_CHECK_MODULES(GDKGLEXTW gdkglext-win32-1.0)\n\tPKG_CHECK_MODULES(GDKMM gdkmm-2.4)\n\tPKG_CHECK_MODULES(GTK gtk+-2.0)\n\tPKG_CHECK_MODULES(GTKMM gtkmm-2.4)\n\n\t# This is an ugly hack, we should be able to detect this automatically, but I'm feeling lazy ...\n\tSET(K3D_GTK_DIR \"c:/gtk\" CACHE PATH \"Root directory containing GTK/gtkmm\")\n\n\tINSTALL(DIRECTORY ${K3D_GTK_DIR}/bin/ DESTINATION bin\n\t\tUSE_SOURCE_PERMISSIONS FILES_MATCHING\n\t\tPATTERN libgtk*.dll\n\t\tPATTERN libgdk*.dll\n\t\tPATTERN libpango*.dll\n\t\tPATTERN libatk*.dll\n\t\tPATTERN libcairo*.dll\n\t\tPATTERN libgio*.dll\n\t\tPATTERN libglib*.dll\n\t\tPATTERN libsigc*.dll\n\t\tPATTERN libgmodule*.dll\n\t\tPATTERN libgobject*.dll\n\t\tPATTERN libgthread*.dll\n\t\tPATTERN libexpat*.dll\n\t\tPATTERN libfontconfig*.dll\n\t\tPATTERN libpng*.dll\n\t\tPATTERN libintl*.dll\n\t\tPATTERN libfreetype*.dll\n\t\tPATTERN libzlib*.dll\n\t\tPATTERN libgcc*.dll\n\t\tPATTERN gspawn*\n\t\tPATTERN zlib1.dll\n\t\tPATTERN intl.dll\n\t\tPATTERN freetype6.dll\n\t\t)\n\n\tINSTALL(DIRECTORY ${K3D_GTK_DIR}/etc/ DESTINATION etc\n\t\tUSE_SOURCE_PERMISSIONS FILES_MATCHING\n\t\tPATTERN pango\n\t\tPATTERN gtk*\n\t\t)\n\n\tINSTALL(DIRECTORY ${K3D_GTK_DIR}/lib/gtk-2.0 DESTINATION ${K3D_LIBDIR}\n\t\tUSE_SOURCE_PERMISSIONS\n\t\t)\n\n\t# Override the default gtkrc file with our own\n\tINSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gtkrc DESTINATION etc/gtk-2.0)\nENDIF(K3D_INSTALL_GTKMM)\n\nIF(K3D_INSTALL_PYTHON)\n\tFIND_PROGRAM(K3D_PYTHON_COMMAND python.exe\n\t\tPATHS \"c:/python26\"\n\t\tDOC \"Path to an installed python.exe.\"\n\t\t)\n\t\n\tIF(NOT K3D_PYTHON_COMMAND)\n\t\tMESSAGE(SEND_ERROR \"Could not locate python.exe.\")\n\tENDIF(NOT K3D_PYTHON_COMMAND)\n\n\tFIND_PROGRAM(K3D_PYTHON_LIBRARY python26.dll\n\t\tDOC \"Path to the installed python26.dll\"\n\t\t)\n\n\tIF(NOT K3D_PYTHON_LIBRARY)\n\t\tMESSAGE(SEND_ERROR \"Could not locate python26.dll.\")\n\tENDIF(NOT K3D_PYTHON_LIBRARY)\n\n\tEXECUTE_PROCESS(\n\t\tCOMMAND ${K3D_PYTHON_COMMAND} -V\n\t\tERROR_VARIABLE K3D_PYTHON_VERSION\n\t\t)\n\n\tIF(K3D_PYTHON_VERSION)\n\t\tSTRING(REGEX REPLACE \"^Python ([0-9]+\\\\.[0-9]+\\\\.[0-9]+).*\" \"\\\\1\" K3D_PYTHON_VERSION ${K3D_PYTHON_VERSION})\n\t\tK3D_CHECK_INSTALLED_VERSION(${K3D_PYTHON_VERSION} \"Python\" \"2.6.1\")\n\tELSE(K3D_PYTHON_VERSION)\n\t\tMESSAGE(SEND_ERROR \"Error determining Python version.\")\n\tENDIF(K3D_PYTHON_VERSION)\n\n\tINSTALL(PROGRAMS\n\t\t${K3D_PYTHON_COMMAND}\n\t\t${K3D_PYTHON_LIBRARY}\n\t\tDESTINATION bin\n\t\t)\n\n\tGET_FILENAME_COMPONENT(K3D_PYTHON_PATH ${K3D_PYTHON_COMMAND} PATH)\n\tFILE(GLOB K3D_PYTHON_MODULES ${K3D_PYTHON_PATH}/Lib/*.py)\n\tINSTALL(PROGRAMS\n\t\t${K3D_PYTHON_MODULES}\n\t\tDESTINATION ${K3D_LIBDIR}\n\t\t)\n\n\tSET(K3D_PYTHON_SITE_PACKAGES ${K3D_PYTHON_PATH}/Lib/site-packages)\n\n\tIF(K3D_INSTALL_CGKIT)\n\t\tEXECUTE_PROCESS(\n\t\t\tCOMMAND ${K3D_PYTHON_COMMAND} -c \"import cgkit.cgkitinfo;print cgkit.cgkitinfo.version\"\n\t\t\tOUTPUT_VARIABLE K3D_CGKIT_VERSION\n\t\t\t)\n\n\t\tIF(K3D_CGKIT_VERSION)\n\t\t\tSTRING(REGEX REPLACE \"^([0-9]+\\\\.[0-9]+\\\\.[0-9]+[^ ]*).*\" \"\\\\1\" K3D_CGKIT_VERSION ${K3D_CGKIT_VERSION})\n\t\t\tK3D_CHECK_INSTALLED_VERSION(${K3D_CGKIT_VERSION} \"cgkit\" \"2.0.0alpha8\")\n\t\tELSE(K3D_CGKIT_VERSION)\n\t\t\tMESSAGE(SEND_ERROR \"Error determining cgkit version.\")\n\t\tENDIF(K3D_CGKIT_VERSION)\n\n\t\tINSTALL(DIRECTORY\n\t\t\t${K3D_PYTHON_SITE_PACKAGES}/cgkit\n\t\t\tDESTINATION ${K3D_LIBDIR}/site-packages\n\t\t\tPATTERN *.pyc EXCLUDE\n\t\t\tPATTERN *.pyo EXCLUDE\n\t\t\t)\n\tENDIF(K3D_INSTALL_CGKIT)\n\n\tIF(K3D_INSTALL_PYGTK)\n\t\tEXECUTE_PROCESS(\n\t\t\tCOMMAND ${K3D_PYTHON_COMMAND} -c \"import gtk;print gtk.pygtk_version\"\n\t\t\tOUTPUT_VARIABLE K3D_PYGTK_VERSION\n\t\t\t)\n\n\t\tIF(K3D_PYGTK_VERSION)\n\t\t\tSTRING(REGEX REPLACE \".*([0-9]+), ([0-9]+), ([0-9]+).*\" \"\\\\1.\\\\2.\\\\3\" K3D_PYGTK_VERSION ${K3D_PYGTK_VERSION})\n\t\t\tK3D_CHECK_INSTALLED_VERSION(${K3D_PYGTK_VERSION} \"PyGTK\" \"2.12.1\")\n\t\tELSE(K3D_PYGTK_VERSION)\n\t\t\tMESSAGE(SEND_ERROR \"Error determining PyGTK version.\")\n\t\tENDIF(K3D_PYGTK_VERSION)\n\n\t\tINSTALL(DIRECTORY\n\t\t\t${K3D_PYTHON_SITE_PACKAGES}/cairo\n\t\t\tDESTINATION ${K3D_LIBDIR}/site-packages\n\t\t\tPATTERN *.pyc EXCLUDE\n\t\t\tPATTERN *.pyo EXCLUDE\n\t\t\t)\n\t\tINSTALL(DIRECTORY\n\t\t\t${K3D_PYTHON_SITE_PACKAGES}/gtk-2.0\n\t\t\tDESTINATION ${K3D_LIBDIR}/site-packages\n\t\t\tPATTERN *.pyc EXCLUDE\n\t\t\tPATTERN *.pyo EXCLUDE\n\t\t\t)\n\t\tINSTALL(PROGRAMS\n\t\t\t${K3D_PYTHON_SITE_PACKAGES}/pygtk.py\n\t\t\tDESTINATION ${K3D_LIBDIR}/site-packages\n\t\t\t)\n\tENDIF(K3D_INSTALL_PYGTK)\n\n\tIF(K3D_INSTALL_PYOPENGL)\n\t\tEXECUTE_PROCESS(\n\t\t\tCOMMAND ${K3D_PYTHON_COMMAND} -c \"import OpenGL.version;print OpenGL.version.__version__\"\n\t\t\tOUTPUT_VARIABLE K3D_PYOPENGL_VERSION\n\t\t\t)\n\t\tIF(K3D_PYOPENGL_VERSION)\n\t\t\tSTRING(REGEX REPLACE \"^([0-9]+\\\\.[0-9]+\\\\.[0-9]+).*\" \"\\\\1\" K3D_PYOPENGL_VERSION ${K3D_PYOPENGL_VERSION})\n\t\t\tK3D_CHECK_INSTALLED_VERSION(${K3D_PYOPENGL_VERSION} \"PyOpenGL\" \"3.0.0\")\n\t\tELSE(K3D_PYOPENGL_VERSION)\n\t\t\tMESSAGE(SEND_ERROR \"Error determining PyOpenGL version.\")\n\t\tENDIF(K3D_PYOPENGL_VERSION)\n\n\t\tINSTALL(DIRECTORY\n\t\t\t${K3D_PYTHON_SITE_PACKAGES}/OpenGL\n\t\t\tDESTINATION ${K3D_LIBDIR}/site-packages\n\t\t\tPATTERN *.pyc EXCLUDE\n\t\t\tPATTERN *.pyo EXCLUDE\n\t\t\t)\n\tENDIF(K3D_INSTALL_PYOPENGL)\n\nENDIF(K3D_INSTALL_PYTHON)\n\nADD_SUBDIRECTORY(nsis)\n\n"
  },
  {
    "path": "distribution/win32/aqsisrc",
    "content": "Option \"display\" \"string file\" [\"file_dspy.dll\"]\r\nOption \"display\" \"string framebuffer\" [\"piqsl_dspy.dll\"]\r\nOption \"display\" \"string zfile\" [\"file_dspy.dll\"]\r\nOption \"display\" \"string zframebuffer\" [\"piqsl_dspy.dll\"]\r\nOption \"display\" \"string shadow\" [\"file_dspy.dll\"]\r\nOption \"display\" \"string tiff\" [\"file_dspy.dll\"]\r\nOption \"display\" \"string xpm\" [\"xpm_dspy.dll\"]\r\nOption \"display\" \"string exr\" [\"exr_dspy.dll\"]\r\nOption \"display\" \"string bmp\" [\"bmp_dspy.dll\"]\r\nOption \"display\" \"string debugdd\" [\"debugdd\"]\r\nOption \"display\" \"string piqsl\" [\"piqsl_dspy.dll\"]\r\n\r\nOption \"searchpath\" \"string shader\" [\".:@:%SIMBIONT_RM_COMPONENTS%/../SimbiontRM:%SIMBIONT_RM_COMPONENTS%/..:%SIMBIONT_RM_COMPONENTS%/../SimbiontRM:%SIMBIONT_RM_COMPONENTS%/..:\"]\r\nOption \"searchpath\" \"string archive\" [\".:@:\"]\r\nOption \"searchpath\" \"string texture\" [\".:@:\"]\r\nOption \"searchpath\" \"string display\" [\".:@:\"]\r\nOption \"searchpath\" \"string procedural\" [\".:@:%MASSIVE_HOME%/bin:%MASSIVE_HOME%/bin:\"]\r\nOption \"searchpath\" \"string resource\" [\".:@:\"]\r\n"
  },
  {
    "path": "distribution/win32/gtkrc",
    "content": "gtk-icon-sizes = \"gtk-menu=13,13:gtk-small-toolbar=16,16:gtk-large-toolbar=24,24:gtk-dnd=32,32\"\ngtk-toolbar-icon-size = small-toolbar\n\n# disable images in buttons. i've only seen ugly delphi apps use this feature.\ngtk-button-images = 0\n\n# enable/disable images in menus. most \"stock\" microsoft apps don't use these, except sparingly.\n# the office apps use them heavily, though.\ngtk-menu-images = 1\n\n# use the win32 button ordering instead of the GNOME HIG one, where applicable\ngtk-alternative-button-order = 1\n\nstyle \"msw-default\"\n{\n  GtkWidget::interior-focus = 1\n  GtkOptionMenu::indicator-size = { 9, 5 }\n  GtkOptionMenu::indicator-spacing = { 7, 5, 2, 2 }\n  GtkSpinButton::shadow-type = in\n\n  # Owen and I disagree that these should be themable\n  #GtkUIManager::add-tearoffs = 0\n  #GtkComboBox::add-tearoffs = 0\n  \n  GtkComboBox::appears-as-list = 1\n  GtkComboBox::focus-on-click = 0\n  \n  GOComboBox::add_tearoffs = 0\n\n  GtkTreeView::allow-rules = 0\n  GtkTreeView::expander-size = 12\n\n  GtkExpander::expander-size = 12\n\n  GtkScrolledWindow::scrollbar_spacing = 1\n\n  GtkSeparatorMenuItem::horizontal-padding = 2\n\n  engine \"wimp\" \n  {\n  }\n}\nclass \"*\" style \"msw-default\""
  },
  {
    "path": "distribution/win32/nsis/CMakeLists.txt",
    "content": "# Generate NSIS installer\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-nsis.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-nsis.cpack)\nADD_CUSTOM_TARGET(package-binary-nsis\n\t${CMAKE_CPACK_COMMAND}\n\t--config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-nsis.cpack\n\t)\n\n"
  },
  {
    "path": "distribution/win32/nsis/package-binary-nsis.cpack.in",
    "content": "SET(CPACK_CMAKE_GENERATOR \"@CMAKE_GENERATOR@\")\nSET(CPACK_GENERATOR \"NSIS\")\nSET(CPACK_INSTALL_CMAKE_PROJECTS \"@K3D_CPACK_INSTALL_CMAKE_PROJECTS@\")\nSET(CPACK_NSIS_HELP_LINK \"http://www.k-3d.org/wiki/Support\")\nSET(CPACK_NSIS_INSTALLED_ICON_NAME \"bin\\\\\\\\k3d.exe\")\nSET(CPACK_NSIS_MENU_LINKS \"http://www.k-3d.org/wiki/Support\" \"K-3D Help\")\nSET(CPACK_NSIS_MUI_ICON \"@share_SOURCE_DIR@/k3d/icons\\\\\\\\k3d.ico\")\nSET(CPACK_PACKAGE_DESCRIPTION \"@K3D_CPACK_PACKAGE_DESCRIPTION@\")\nSET(CPACK_PACKAGE_EXECUTABLES \"k3d\" \"K-3D @K3D_VERSION@\")\nSET(CPACK_PACKAGE_FILE_NAME \"@K3D_CPACK_PACKAGE_FILE_NAME@\")\nSET(CPACK_PACKAGE_ICON \"@CMAKE_CURRENT_SOURCE_DIR@\\\\\\\\headerimage.bmp\")\nSET(CPACK_NSIS_INSTALL_ROOT \"$PROGRAMFILES\")\nSET(CPACK_PACKAGE_INSTALL_DIRECTORY \"K-3D @K3D_VERSION@\")\nSET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY \"K-3D @K3D_VERSION@\")\nSET(CPACK_PACKAGE_NAME \"@K3D_CPACK_PACKAGE_NAME@\")\nSET(CPACK_NSIS_PACKAGE_NAME \"K-3D\")\nSET(CPACK_PACKAGE_VENDOR \"www.k-3d.org\")\nSET(CPACK_PACKAGE_VERSION \"@K3D_CPACK_PACKAGE_VERSION@\")\nSET(CPACK_RESOURCE_FILE_LICENSE \"@K3D_CPACK_RESOURCE_FILE_LICENSE@\")\nSET(CPACK_NSIS_MODIFY_PATH \"ON\")\nSET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS \"@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@\")\n"
  },
  {
    "path": "docs/CMakeLists.txt",
    "content": "ADD_SUBDIRECTORY(coding_style)\nADD_SUBDIRECTORY(doxygen)\nADD_SUBDIRECTORY(epydoc)\nADD_SUBDIRECTORY(wiki)\n\n"
  },
  {
    "path": "docs/coding_style/CMakeLists.txt",
    "content": "FIND_PROGRAM(ASTYLE_COMMAND\n\tNAMES astyle\n\tDOC \"Path to the Artistic Style source-code formatter.\"\n\t)\n\nIF(ASTYLE_COMMAND)\n\tCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/k3d-style.in ${CMAKE_CURRENT_BINARY_DIR}/k3d-style @ONLY)\n\n\tEXECUTE_PROCESS(\n\t\tCOMMAND chmod u+x ${CMAKE_CURRENT_BINARY_DIR}/k3d-style\n\t\t)\nENDIF(ASTYLE_COMMAND)\n\n"
  },
  {
    "path": "docs/coding_style/astylerc",
    "content": "# This is a style file for the \"Artistic Style\" code formatting program, astyle.\n#\n# It encodes roughly how we'd like the code to look in K-3D, but isn't really\n# a substitute for writing neat code by hand.\n#\n# See the files codestyle.{cpp,h} for a better introduction to the K-3D coding\n# style.\n\n#-------------------------------------------------------------------------------\n# C/C++ indenting mode.\nmode=c\n\nstyle=ansi\n\n#-------------------------------------------------------------------------------\n# Always put block brackets on seperate lines.\n#brackets=break\n# If two statements are on a line, leave them that way.\n#one-line=keep-statements\n\n#-------------------------------------------------------------------------------\n### Indenting\n# Indent 'class' blocks so that the blocks 'public:', 'protected:' and 'private:' are indented.\n#indent-classes\n# Indent with tabs equal to four spaces.\n#indent=tab=4\n# Indent switch blocks. The astyle docs seem a bit confused about this (ie,\n# indent-cases seems to do what indent-switches is advertised to do in the docs...)\n#indent-switches\n#indent-cases\n\n#-------------------------------------------------------------------------------\n### Space-padding\n# We could also insert padding of a single space around all operators:\n#pad=oper\n# And also pad the brackets:\n#pad=paren\n\n# Space is better chosen carefully for emphasis however.  Compare:\n#\n# x = 2*(a-f) + b*(c-d)/2;\n#\n# x = 2 * (a - f) + b * (c - d) / 2;\n#\n# x = 2 * ( a - f ) + b * ( c - d ) / 2;\n#\n# The first is rather clearer than the others.  Unfortunately, we've gotta\n# forgo any astyle padding to get it to stay that way.\n\n"
  },
  {
    "path": "docs/coding_style/k3d-style.in",
    "content": "#!/bin/sh\n\n@ASTYLE_COMMAND@ --mode=c --style=ansi --indent=tab=2 --pad=oper --unpad=paren --suffix=none $*\n\n"
  },
  {
    "path": "docs/doxygen/CMakeLists.txt",
    "content": "PROJECT(doxygen)\n\nINCLUDE(FindDoxygen)\n\nCONFIGURE_FILE(${doxygen_SOURCE_DIR}/Doxyfile.in ${doxygen_BINARY_DIR}/Doxyfile)\n\nADD_CUSTOM_TARGET(docs-doxygen\n\tCOMMAND ${CMAKE_COMMAND} -E remove_directory ${doxygen_BINARY_DIR}/html\n\tCOMMAND ${DOXYGEN_EXECUTABLE} ${doxygen_BINARY_DIR}/Doxyfile\n\tCOMMAND ${CMAKE_COMMAND} -E copy ${doxygen_SOURCE_DIR}/k3d.css ${doxygen_BINARY_DIR}/html/k3d.css\n\t)\n\n"
  },
  {
    "path": "docs/doxygen/Doxyfile.in",
    "content": "# Doxyfile 1.3.7\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project\n#\n# All text after a hash (#) is considered a comment and will be ignored\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \")\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded \n# by quotes) that should identify the project.\n\nPROJECT_NAME           = K-3D\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number. \n# This could be handy for archiving the generated documentation or \n# if some version control system is used.\n\nPROJECT_NUMBER         = @VERSION@\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n# base path where the generated documentation will be put. \n# If a relative path is entered, it will be relative to the location \n# where doxygen was started. If left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = @doxygen_BINARY_DIR@\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create \n# 2 levels of 10 sub-directories under the output directory of each output \n# format and will distribute the generated files over these directories. \n# Enabling this option can be useful when feeding doxygen a huge amount of source \n# files, where putting all generated files in the same directory would otherwise \n# cause performance problems for the file system.\n\nCREATE_SUBDIRS         = YES\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all \n# documentation generated by doxygen is written. Doxygen will use this \n# information to generate all constant output in the proper language. \n# The default language is English, other supported languages are: \n# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, \n# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en \n# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, \n# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will \n# include brief member descriptions after the members that are listed in \n# the file and class documentation (similar to JavaDoc). \n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend \n# the brief description of a member or function before the detailed description. \n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator \n# that is used to form the text in various listings. Each string \n# in this list, if found as the leading text of the brief description, will be \n# stripped from the text and the result after processing the whole list, is used \n# as the annotated text. Otherwise, the brief description is used as-is. If left \n# blank, the following values are used (\"$name\" is automatically replaced with the \n# name of the entity): \"The $name class\" \"The $name widget\" \"The $name file\" \n# \"is\" \"provides\" \"specifies\" \"contains\" \"represents\" \"a\" \"an\" \"the\"\n\nABBREVIATE_BRIEF       = \n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then \n# Doxygen will generate a detailed section even if there is only a brief \n# description.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited \n# members of a class in the documentation of that class as if those members were \n# ordinary class members. Constructors, destructors and assignment operators of \n# the base classes will not be shown.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n# path before files name in the file list and in the header files. If set \n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n# can be used to strip a user-defined part of the path. Stripping is \n# only done if one of the specified strings matches the left-hand part of \n# the path. The tag can be used to show relative paths in the file list. \n# If left blank the directory from which doxygen is run is used as the \n# path to strip.\n\nSTRIP_FROM_PATH        = \n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of \n# the path mentioned in the documentation of a class, which tells \n# the reader which header file to include in order to use a class. \n# If left blank only the name of the header file containing the class \n# definition is used. Otherwise one should specify the include paths that \n# are normally passed to the compiler using the -I flag.\n\nSTRIP_FROM_INC_PATH    = \n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter \n# (but less readable) file names. This can be useful is your file systems \n# doesn't support long names like on DOS, Mac, or CD-ROM.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen \n# will interpret the first line (until the first dot) of a JavaDoc-style \n# comment as the brief description. If set to NO, the JavaDoc \n# comments will behave just like the Qt-style comments (thus requiring an \n# explicit @brief command for a brief description.\n\nJAVADOC_AUTOBRIEF      = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen \n# treat a multi-line C++ special comment block (i.e. a block of //! or /// \n# comments) as a brief description. This used to be the default behaviour. \n# The new default is to treat a multi-line C++ comment block as a detailed \n# description. Set this tag to YES if you prefer the old behaviour instead.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented \n# member inherits the documentation from any documented member that it \n# re-implements.\n\nINHERIT_DOCS           = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC \n# tag is set to YES, then doxygen will reuse the documentation of the first \n# member in the group (if any) for the other members of the group. By default \n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab. \n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 2\n\n# This tag can be used to specify a number of aliases that acts \n# as commands in the documentation. An alias has the form \"name=value\". \n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to \n# put the command \\sideeffect (or @sideeffect) in the documentation, which \n# will result in a user-defined paragraph with heading \"Side Effects:\". \n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                = \n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources \n# only. Doxygen will then generate output that is more tailored for C. \n# For instance, some of the names that are used will be different. The list \n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources \n# only. Doxygen will then generate output that is more tailored for Java. \n# For instance, namespaces will be presented as packages, qualified scopes \n# will look different, etc.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the SUBGROUPING tag to YES (the default) to allow class member groups of \n# the same type (for instance a group of public functions) to be put as a \n# subgroup of that type (e.g. under the Public Functions section). Set it to \n# NO to prevent subgrouping. Alternatively, this can be done per class using \n# the \\nosubgrouping command.\n\nSUBGROUPING            = YES\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n# documentation are documented, even if no documentation was available. \n# Private class members and static file members will be hidden unless \n# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = YES\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class \n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = YES\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file \n# will be included in the documentation.\n\nEXTRACT_STATIC         = YES\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) \n# defined locally in source files will be included in the documentation. \n# If set to NO only classes defined in header files are included.\n\nEXTRACT_LOCAL_CLASSES  = YES\n\n# This flag is only useful for Objective-C code. When set to YES local \n# methods, which are defined in the implementation section but not in \n# the interface are included in the documentation. \n# If set to NO (the default) only methods in the interface are included.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n# undocumented members of documented classes, files or namespaces. \n# If set to NO (the default) these members will be included in the \n# various overviews, but no documentation section is generated. \n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all \n# undocumented classes that are normally visible in the class hierarchy. \n# If set to NO (the default) these classes will be included in the various \n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = NO\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all \n# friend (class|struct|union) declarations. \n# If set to NO (the default) these declarations will be included in the \n# documentation.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any \n# documentation blocks found inside the body of a function. \n# If set to NO (the default) these blocks will be appended to the \n# function's detailed documentation block.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation \n# that is typed after a \\internal command is included. If the tag is set \n# to NO (the default) then the documentation will be excluded. \n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate \n# file names in lower-case letters. If set to YES upper-case letters are also \n# allowed. This is useful if you have classes or files whose names only differ \n# in case and if your file system supports case sensitive file names. Windows \n# users are advised to set this option to NO.\n\nCASE_SENSE_NAMES       = YES\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen \n# will show members with their full class and namespace scopes in the \n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n# will put a list of the files that are included by a file in the documentation \n# of that file.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] \n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen \n# will sort the (detailed) documentation of file and class members \n# alphabetically by member name. If set to NO the members will appear in \n# declaration order.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the \n# brief documentation of file, namespace and class members alphabetically \n# by member name. If set to NO (the default) the members will appear in \n# declaration order.\n\nSORT_BRIEF_DOCS        = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be \n# sorted by fully-qualified names, including namespaces. If set to \n# NO (the default), the class list will be sorted only by class name, \n# not including the namespace part. \n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the \n# alphabetical list.\n\nSORT_BY_SCOPE_NAME     = YES\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or \n# disable (NO) the todo list. This list is created by putting \\todo \n# commands in the documentation.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or \n# disable (NO) the test list. This list is created by putting \\test \n# commands in the documentation.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or \n# disable (NO) the bug list. This list is created by putting \\bug \n# commands in the documentation.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or \n# disable (NO) the deprecated list. This list is created by putting \n# \\deprecated commands in the documentation.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional \n# documentation sections, marked by \\if sectionname ... \\endif.\n\nENABLED_SECTIONS       = \n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines \n# the initial value of a variable or define consists of for it to appear in \n# the documentation. If the initializer consists of more lines than specified \n# here it will be hidden. Use a value of 0 to hide initializers completely. \n# The appearance of the initializer of individual variables and defines in the \n# documentation can be controlled using \\showinitializer or \\hideinitializer \n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated \n# at the bottom of the documentation of classes and structs. If set to YES the \n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated \n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are \n# generated by doxygen. Possible values are YES and NO. If left blank \n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for \n# potential errors in the documentation, such as not documenting some \n# parameters in a documented function, or documenting parameters that \n# don't exist or using markup commands wrongly.\n\nWARN_IF_DOC_ERROR      = YES\n\n# The WARN_FORMAT tag determines the format of the warning messages that \n# doxygen can produce. The string should contain the $file, $line, and $text \n# tags, which will be replaced by the file and line number from which the \n# warning originated and the warning text.\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning \n# and error messages should be written. If left blank the output is written \n# to stderr.\n\nWARN_LOGFILE           = \n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain \n# documented source files. You may enter file names like \"myfile.cpp\" or \n# directories like \"/usr/src/myproject\". Separate the files or directories \n# with spaces.\n\nINPUT                  = @k3d_SOURCE_DIR@\n\n# If the value of the INPUT tag contains directories, you can use the \n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n# and *.h) to filter out the source-files in the directories. If left \n# blank the following patterns are tested: \n# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp \n# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm\n\nFILE_PATTERNS          = \n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories \n# should be searched for input files as well. Possible values are YES and NO. \n# If left blank NO is used.\n\nRECURSIVE              = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should \n# excluded from the INPUT source files. This way you can easily exclude a \n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n\nEXCLUDE                =\t@k3d_SOURCE_DIR@/.hg \\\n\t\t\t\t@k3d_SOURCE_DIR@/k3dsdk/ftgl \\\n\t\t\t\t@k3d_SOURCE_DIR@/k3dsdk/gil \\\n\t\t\t\t@k3d_SOURCE_DIR@/k3dsdk/glew \\\n\t\t\t\t@k3d_SOURCE_DIR@/k3dsdk/gmm \\\n\t\t\t\t@k3d_SOURCE_DIR@/k3dsdk/Half \\\n\t\t\t\t@k3d_SOURCE_DIR@/k3dsdk/tests \\\n\t\t\t\t@k3d_SOURCE_DIR@/po \\\n\t\t\t\t@k3d_SOURCE_DIR@/share\n\n# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories \n# that are symbolic links (a Unix filesystem feature) are excluded from the input.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the \n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude \n# certain files from those directories.\n\nEXCLUDE_PATTERNS       = @k3d_SOURCE_DIR@/modules/qslim/Mx*\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or \n# directories that contain example code fragments that are included (see \n# the \\include command).\n\nEXAMPLE_PATH           = \n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the \n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n# and *.h) to filter out the source-files in the directories. If left \n# blank all files are included.\n\nEXAMPLE_PATTERNS       = \n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be \n# searched for input files to be used with the \\include or \\dontinclude \n# commands irrespective of the value of the RECURSIVE tag. \n# Possible values are YES and NO. If left blank NO is used.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or \n# directories that contain image that are included in the documentation (see \n# the \\image command).\n\nIMAGE_PATH             = \n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should \n# invoke to filter for each input file. Doxygen will invoke the filter program \n# by executing (via popen()) the command <filter> <input-file>, where <filter> \n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an \n# input file. Doxygen will then use the output that the filter program writes \n# to standard output.\n\nINPUT_FILTER           = \n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using \n# INPUT_FILTER) will be used to filter the input files when producing source \n# files to browse (i.e. when SOURCE_BROWSER is set to YES).\n\nFILTER_SOURCE_FILES    = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will \n# be generated. Documented entities will be cross-referenced with these sources. \n# Note: To get rid of all source code in the generated output, make sure also \n# VERBATIM_HEADERS is set to NO.\n\nSOURCE_BROWSER         = NO\n\n# Setting the INLINE_SOURCES tag to YES will include the body \n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct \n# doxygen to hide any special comment blocks from generated source code \n# fragments. Normal C and C++ comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES (the default) \n# then for each documented function all documented \n# functions referencing it will be listed.\n\nREFERENCED_BY_RELATION = YES\n\n# If the REFERENCES_RELATION tag is set to YES (the default) \n# then for each documented function all documented entities \n# called/used by that function will be listed.\n\nREFERENCES_RELATION    = YES\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen \n# will generate a verbatim copy of the header file for each class for \n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index \n# of all compounds will be generated. Enable this if the project \n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = YES\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then \n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns \n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all \n# classes will be put under the same header in the alphabetical index. \n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that \n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          = \n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will \n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for \n# each generated HTML page (for example: .htm,.php,.asp). If it is left blank \n# doxygen will generate files with .html extension.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a personal HTML header for \n# each generated HTML page. If it is left blank doxygen will generate a \n# standard header.\n\nHTML_HEADER            = @doxygen_SOURCE_DIR@/header.html\n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for \n# each generated HTML page. If it is left blank doxygen will generate a \n# standard footer.\n\nHTML_FOOTER            = @doxygen_SOURCE_DIR@/footer.html\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading \n# style sheet that is used by each HTML page. It can be used to \n# fine-tune the look of the HTML output. If the tag is left blank doxygen \n# will generate a default style sheet. Note that doxygen will try to copy \n# the style sheet file to the HTML output directory, so don't put your own \n# stylesheet in the HTML output directory as well, or it will be erased!\n\nHTML_STYLESHEET        = \n\n# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, \n# files or namespaces will be aligned in HTML using tables. If set to \n# NO a bullet list will be used.\n\nHTML_ALIGN_MEMBERS     = YES\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files \n# will be generated that can be used as input for tools like the \n# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) \n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can \n# be used to specify the file name of the resulting .chm file. You \n# can add a path in front of the file if the result should not be \n# written to the html output directory.\n\nCHM_FILE               = \n\n# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can \n# be used to specify the location (absolute path including file name) of \n# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run \n# the HTML help compiler on the generated index.hhp.\n\nHHC_LOCATION           = \n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag \n# controls if a separate .chi index file is generated (YES) or that \n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag \n# controls whether a binary table of contents is generated (YES) or a \n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members \n# to the contents of the HTML help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n# top of each HTML page. The value NO (the default) enables the index and \n# the value YES disables it.\n\nDISABLE_INDEX          = NO\n\n# This tag can be used to set the number of enum values (range [1..20]) \n# that doxygen will group on one line in the generated HTML documentation.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be\n# generated containing a tree-like index structure (just like the one that \n# is generated for HTML Help). For this to work a browser that supports \n# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, \n# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are \n# probably better off using the HTML help feature.\n\nGENERATE_TREEVIEW      = NO\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be \n# used to set the initial width (in pixels) of the frame in which the tree \n# is shown.\n\nTREEVIEW_WIDTH         = 250\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will \n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be \n# invoked. If left blank `latex' will be used as the default command name.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to \n# generate index for LaTeX. If left blank `makeindex' will be used as the \n# default command name.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact \n# LaTeX documents. This may be useful for small projects and may help to \n# save some trees in general.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used \n# by the printer. Possible values are: a4, a4wide, letter, legal and \n# executive. If left blank a4wide will be used.\n\nPAPER_TYPE             = a4wide\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX \n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         = \n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n# the generated latex document. The header should contain everything until \n# the first chapter. If it is left blank doxygen will generate a \n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           = \n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated \n# is prepared for conversion to pdf (using ps2pdf). The pdf file will \n# contain links (just like the HTML output) instead of page references \n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = NO\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of \n# plain latex in the generated Makefile. Set this option to YES to get a \n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = NO\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode. \n# command to the generated LaTeX files. This will instruct LaTeX to keep \n# running if errors occur, instead of asking the user for help. \n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n# If LATEX_HIDE_INDICES is set to YES then doxygen will not \n# include the index chapters (such as File Index, Compound Index, etc.) \n# in the output.\n\nLATEX_HIDE_INDICES     = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n# The RTF output is optimized for Word 97 and may not look very pretty with \n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact \n# RTF documents. This may be useful for small projects and may help to \n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated \n# will contain hyperlink fields. The RTF file will \n# contain links (just like the HTML output) instead of page references. \n# This makes the output suitable for online browsing using WORD or other \n# programs which support those fields. \n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load stylesheet definitions from file. Syntax is similar to doxygen's \n# config file, i.e. a series of assignments. You only have to provide \n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    = \n\n# Set optional variables used in the generation of an rtf document. \n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    = \n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will \n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to \n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = .3\n\n# If the MAN_LINKS tag is set to YES and Doxygen generates man output, \n# then it will generate one additional man file for each entity \n# documented in the real man page(s). These additional files \n# only source the real man page, but without them the man command \n# would be unable to find the correct page. The default is NO.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES Doxygen will \n# generate an XML file that captures the structure of \n# the code including all documentation.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `xml' will be used as the default path.\n\nXML_OUTPUT             = xml\n\n# The XML_SCHEMA tag can be used to specify an XML schema, \n# which can be used by a validating XML parser to check the \n# syntax of the XML files.\n\nXML_SCHEMA             = \n\n# The XML_DTD tag can be used to specify an XML DTD, \n# which can be used by a validating XML parser to check the \n# syntax of the XML files.\n\nXML_DTD                = \n\n# If the XML_PROGRAMLISTING tag is set to YES Doxygen will \n# dump the program listings (including syntax highlighting \n# and cross-referencing information) to the XML output. Note that \n# enabling this will significantly increase the size of the XML output.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will \n# generate an AutoGen Definitions (see autogen.sf.net) file \n# that captures the structure of the code including all \n# documentation. Note that this feature is still experimental \n# and incomplete at the moment.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES Doxygen will \n# generate a Perl module file that captures the structure of \n# the code including all documentation. Note that this \n# feature is still experimental and incomplete at the \n# moment.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES Doxygen will generate \n# the necessary Makefile rules, Perl scripts and LaTeX code to be able \n# to generate PDF and DVI output from the Perl module output.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be \n# nicely formatted so it can be parsed by a human reader.  This is useful \n# if you want to understand what is going on.  On the other hand, if this \n# tag is set to NO the size of the Perl module output will be much smaller \n# and Perl will parse it just the same.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file \n# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. \n# This is useful so different doxyrules.make files included by the same \n# Makefile don't overwrite each other's variables.\n\nPERLMOD_MAKEVAR_PREFIX = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor   \n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will \n# evaluate all C-preprocessor directives found in the sources and include \n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro \n# names in the source code. If set to NO (the default) only conditional \n# compilation will be performed. Macro expansion can be done in a controlled \n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n# then the macro expansion is limited to the macros specified with the \n# PREDEFINED and EXPAND_AS_PREDEFINED tags.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files \n# in the INCLUDE_PATH (see below) will be search if a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that \n# contain include files that are not input files but should be processed by \n# the preprocessor.\n\nINCLUDE_PATH           = \n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard \n# patterns (like *.h and *.hpp) to filter out the header-files in the \n# directories. If left blank, the patterns specified with FILE_PATTERNS will \n# be used.\n\nINCLUDE_FILE_PATTERNS  = \n\n# The PREDEFINED tag can be used to specify one or more macro names that \n# are defined before the preprocessor is started (similar to the -D option of \n# gcc). The argument of the tag is a list of macros of the form: name \n# or name=definition (no spaces). If the definition and the = are \n# omitted =1 is assumed.\n\nPREDEFINED             = \n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then \n# this tag can be used to specify a list of macro names that should be expanded. \n# The macro definition that is found in the sources will be used. \n# Use the PREDEFINED tag if you want to use a different macro definition.\n\nEXPAND_AS_DEFINED      = \n\n# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then \n# doxygen's preprocessor will remove all function-like macros that are alone \n# on a line, have an all uppercase name, and do not end with a semicolon. Such \n# function macros are typically used for boiler-plate code, and will confuse the \n# parser if not removed.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to external references   \n#---------------------------------------------------------------------------\n\n# The TAGFILES option can be used to specify one or more tagfiles. \n# Optionally an initial location of the external documentation \n# can be added for each tagfile. The format of a tag file without \n# this location is as follows: \n#   TAGFILES = file1 file2 ... \n# Adding location for the tag files is done as follows: \n#   TAGFILES = file1=loc1 \"file2 = loc2\" ... \n# where \"loc1\" and \"loc2\" can be relative or absolute paths or \n# URLs. If a location is present for each tag, the installdox tool \n# does not have to be run to correct the links.\n# Note that each tag file must have a unique name\n# (where the name does NOT include the path)\n# If a tag file is not located in the directory in which doxygen \n# is run, you must also specify the path to the tagfile here.\n\nTAGFILES               = \n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create \n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       = \n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed \n# in the class index. If set to NO only the inherited external classes \n# will be listed.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed \n# in the modules index. If set to NO, only the current project's groups will \n# be listed.\n\nEXTERNAL_GROUPS        = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script \n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool   \n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or \n# super classes. Setting the tag to NO turns the diagrams off. Note that this \n# option is superseded by the HAVE_DOT option below. This is only a fallback. It is \n# recommended to install and use dot, since it yields more powerful graphs.\n\nCLASS_DIAGRAMS         = YES\n\n# If set to YES, the inheritance and collaboration graphs will hide \n# inheritance and usage relations if the target is undocumented \n# or is not a class.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is \n# available from the path. This tool is part of Graphviz, a graph visualization \n# toolkit from AT&T and Lucent Bell Labs. The other options in this section \n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = YES\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen \n# will generate a graph for each documented class showing the direct and \n# indirect inheritance relations. Setting this tag to YES will force the \n# the CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n# will generate a graph for each documented class showing the direct and \n# indirect implementation dependencies (inheritance, containment, and \n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = NO\n\n# If the UML_LOOK tag is set to YES doxygen will generate inheritance and \n# collaboration diagrams in a style similar to the OMG's Unified Modeling \n# Language.\n\nUML_LOOK               = NO\n\n# If set to YES, the inheritance and collaboration graphs will show the \n# relations between templates and their instances.\n\nTEMPLATE_RELATIONS     = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT \n# tags are set to YES then doxygen will generate a graph for each documented \n# file showing the direct and indirect include dependencies of the file with \n# other documented files.\n\nINCLUDE_GRAPH          = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and \n# HAVE_DOT tags are set to YES then doxygen will generate a graph for each \n# documented header file showing the documented files that directly or \n# indirectly include this file.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will \n# generate a call dependency graph for every global function or class method. \n# Note that enabling this option will significantly increase the time of a run. \n# So in most cases it will be better to enable call graphs for selected \n# functions only using the \\callgraph command.\n\nCALL_GRAPH             = NO\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n# will graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = NO\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images \n# generated by dot. Possible values are png, jpg, or gif\n# If left blank png will be used.\n\nDOT_IMAGE_FORMAT       = png\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be \n# found. If left blank, it is assumed the dot tool can be found on the path.\n\nDOT_PATH               = @DOXYGEN_DOT_PATH@\n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that \n# contain dot files that are included in the documentation (see the \n# \\dotfile command).\n\nDOTFILE_DIRS           = \n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the \n# graphs generated by dot. A depth value of 3 means that only nodes reachable \n# from the root by following a path via at most 3 edges will be shown. Nodes that \n# lay further from the root node will be omitted. Note that setting this option to \n# 1 or 2 may greatly reduce the computation time needed for large code bases. Also \n# note that a graph may be further truncated if the graph's image dimensions are \n# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). \n# If 0 is used for the depth value (the default), the graph is not depth-constrained.\n\nMAX_DOT_GRAPH_DEPTH    = 0\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will \n# generate a legend page explaining the meaning of the various boxes and \n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will \n# remove the intermediate dot files that are used to generate \n# the various graphs.\n\nDOT_CLEANUP            = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to the search engine   \n#---------------------------------------------------------------------------\n\n# The SEARCHENGINE tag specifies whether or not a search engine should be \n# used. If set to NO the values of all tags below this one will be ignored.\n\nSEARCHENGINE           = NO\n"
  },
  {
    "path": "docs/doxygen/footer.html",
    "content": "<hr size=\"1\"><address style=\"align: right;\"><small>\nGenerated on $datetime for $projectname by&nbsp;<a href=\"http://www.doxygen.org/index.html\"><img src=\"doxygen.png\" alt=\"doxygen\" align=\"middle\" border=\"0\"></a> $doxygenversion</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "docs/doxygen/header.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html><head><meta http-equiv=\"Content-Type\" content=\"text/html;charset=iso-8859-1\">\n<title>$title</title>\n<link href=\"$relpath$doxygen.css\" rel=\"stylesheet\" type=\"text/css\">\n<link href=\"$relpath$tabs.css\" rel=\"stylesheet\" type=\"text/css\">\n<link href=\"$relpath$k3d.css\" rel=\"stylesheet\" type=\"text/css\">\n</head><body>\n"
  },
  {
    "path": "docs/doxygen/k3d.css",
    "content": "DIV.tabs A:link, DIV.tabs A:visited, DIV.tabs A:active, DIV.tabs A:hover\n{\n\tcolor: DarkRed;\n}\n\na, a:visited, a:active, a:hover\n{\n\tcolor: DarkRed;\n}\n\na.qindex, a.qindex:visited, a.qindex:active, a.qindex:hover\n{\n\tcolor: DarkRed;\n}\n\na.el, a.el:visited, a.el:active, a.el:hover\n{\n        color: DarkRed;\n}\n\n.memitem\n{\n\tbackground-color: #eedddd;\n\tborder-top-color: #886666;\n\tborder-right-color: #886666;\n\tborder-bottom-color: #886666;\n\tborder-left-color: #886666;\n}\n\n.memproto\n{\n\tbackground-color: #f2f2f2;\n\tborder-top-color: #bbbbbb;\n\tborder-right-color: #bbbbbb;\n\tborder-bottom-color: #bbbbbb;\n\tborder-left-color: #bbbbbb;\n}\n\n"
  },
  {
    "path": "docs/epydoc/CMakeLists.txt",
    "content": "PROJECT(epydoc)\n\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/make-epydoc-docs.py ${CMAKE_CURRENT_BINARY_DIR}/make-epydoc-docs.py)\n\nADD_CUSTOM_TARGET(docs-epydoc\n\tCOMMAND ${k3d_BINARY_DIR}/bin/k3d --log-level=debug --color\n\t--script-file=${CMAKE_CURRENT_BINARY_DIR}/make-epydoc-docs.py\n\t--ui=nui\n\t)\n\n"
  },
  {
    "path": "docs/epydoc/epydoc.css",
    "content": "\n\n/* Epydoc CSS Stylesheet\n *\n * This stylesheet can be used to customize the appearance of epydoc's\n * HTML output.\n *\n */\n\n/* Default Colors & Styles\n *   - Set the default foreground & background color with 'body'; and \n *     link colors with 'a:link' and 'a:visited'.\n *   - Use bold for decision list terms.\n *   - The heading styles defined here are used for headings *within*\n *     docstring descriptions.  All headings used by epydoc itself use\n *     either class='epydoc' or class='toc' (CSS styles for both\n *     defined below).\n */\nbody                        { background: #ffffff; color: #000000; }\na:link                      { color: #880000; }\na:visited                   { color: #880000; }\ndt                          { font-weight: bold; }\nh1                          { font-size: +140%; font-style: italic;\n                              font-weight: bold; }\nh2                          { font-size: +125%; font-style: italic;\n                              font-weight: bold; }\nh3                          { font-size: +110%; font-style: italic;\n                              font-weight: normal; }\ncode                        { font-size: 100%; }\n \n/* Page Header & Footer\n *   - The standard page header consists of a navigation bar (with\n *     pointers to standard pages such as 'home' and 'trees'); a\n *     breadcrumbs list, which can be used to navigate to containing\n *     classes or modules; options links, to show/hide private\n *     variables and to show/hide frames; and a page title (using\n *     <h1>).  The page title may be followed by a link to the\n *     corresponding source code (using 'span.codelink').\n *   - The footer consists of a navigation bar, a timestamp, and a\n *     pointer to epydoc's homepage.\n */ \nh1.epydoc                   { margin: 0; font-size: +140%; font-weight: bold; }\nh2.epydoc                   { font-size: +130%; font-weight: bold; }\nh3.epydoc                   { font-size: +115%; font-weight: bold; }\ntd h3.epydoc                { font-size: +115%; font-weight: bold;\n                              margin-bottom: 0; }\ntable.navbar                { background: #bbbbbb; color: #000000;\n                              border: 2px groove #c0d0d0; }\ntable.navbar table          { color: #000000; }\nth.navbar-select            { background: #999999;\n                              color: #000000; } \ntable.navbar a              { text-decoration: none; }  \ntable.navbar a:link         { color: #880000; }\ntable.navbar a:visited      { color: #880000; }\nspan.breadcrumbs            { font-size: 85%; font-weight: bold; }\nspan.options                { font-size: 70%; }\nspan.codelink               { font-size: 85%; }\ntd.footer                   { font-size: 85%; }\n\n/* Table Headers\n *   - Each summary table and details section begins with a 'header'\n *     row.  This row contains a section title (marked by\n *     'span.table-header') as well as a show/hide private link\n *     (marked by 'span.options', defined above).\n *   - Summary tables that contain user-defined groups mark those\n *     groups using 'group header' rows.\n */\ntd.table-header             { background: #bbbbbb; color: #000000;\n                              border: 1px solid #888888; }\ntd.table-header table       { color: #000000; }\ntd.table-header table a:link      { color: #880000; }\ntd.table-header table a:visited   { color: #880000; }\nspan.table-header           { font-size: 120%; font-weight: bold; }\nth.group-header             { background: #c0e0f8; color: #000000;\n                              text-align: left; font-style: italic; \n                              font-size: 115%; \n                              border: 1px solid #608090; }\n\n/* Summary Tables (functions, variables, etc)\n *   - Each object is described by a single row of the table with\n *     two cells.  The left cell gives the object's type, and is\n *     marked with 'code.summary-type'.  The right cell gives the\n *     object's name and a summary description.\n *   - CSS styles for the table's header and group headers are\n *     defined above, under 'Table Headers'\n */\ntable.summary               { border-collapse: collapse;\n                              background: #e8e8e8; color: #000000;\n                              border: 1px solid #808080;\n                              margin-bottom: 0.5em; }\ntd.summary                  { border: 1px solid #808080; }\ncode.summary-type           { font-size: 85%; }\ntable.summary a:link        { color: #880000; }\ntable.summary a:visited     { color: #880000; }\n\n\n/* Details Tables (functions, variables, etc)\n *   - Each object is described in its own div.\n *   - A single-row summary table w/ table-header is used as\n *     a header for each details section (CSS style for table-header\n *     is defined above, under 'Table Headers').\n */\ntable.details               { border-collapse: collapse;\n                              background: #e8e8e8; color: #000000;\n                              border: 1px solid #808080;\n                              margin: .2em 0 0 0; }\ntable.details table         { color: #000000; }\ntable.details a:link        { color: #880000; }\ntable.details a:visited     { color: #880000; }\n\n/* Fields */\ndl.fields                   { margin-left: 2em; margin-top: 1em;\n                              margin-bottom: 1em; }\ndl.fields dd ul             { margin-left: 0em; padding-left: 0em; }\ndiv.fields                  { margin-left: 2em; }\ndiv.fields p                { margin-bottom: 0.5em; }\n\n/* Index tables (identifier index, term index, etc)\n *   - link-index is used for indices containing lists of links\n *     (namely, the identifier index & term index).\n *   - index-where is used in link indices for the text indicating\n *     the container/source for each link.\n *   - metadata-index is used for indices containing metadata\n *     extracted from fields (namely, the bug index & todo index).\n */\ntable.link-index            { border-collapse: collapse;\n                              background: #e8e8e8; color: #000000;\n                              border: 1px solid #808080; }\ntd.link-index               { border-width: 0px; }\ntable.link-index a:link     { color: #880000; }\ntable.link-index a:visited  { color: #880000; }\nspan.index-where            { font-size: 70%; }\ntable.metadata-index        { border-collapse: collapse;\n                              background: #e8f0f8; color: #000000;\n                              border: 1px solid #608090; \n                              margin: .2em 0 0 0; }\ntd.metadata-index           { border-width: 1px; border-style: solid; }\ntable.metadata-index a:link { color: #0000ff; }\ntable.metadata-index a:visited  { color: #204080; }\n\n/* Function signatures\n *   - sig* is used for the signature in the details section.\n *   - .summary-sig* is used for the signature in the summary \n *     table, and when listing property accessor functions.\n * */\n.sig-name                   { color: #000000; }\n.sig-arg                    { color: #000000; }\n.sig-default                { color: #602000; }\n.summary-sig                { font-family: monospace; }\n.summary-sig-name           { color: #880000; font-weight: bold; }\ntable.summary a.summary-sig-name:link\n                            { color: #880000; font-weight: bold; }\ntable.summary a.summary-sig-name:visited\n                            { color: #880000; font-weight: bold; }\n.summary-sig-arg            { color: #006040; }\n.summary-sig-default        { color: #501800; }\n\n/* To render variables, classes etc. like functions */\ntable.summary .summary-name { color: #880000; font-weight: bold;\n                              font-family: monospace; }\ntable.summary\n     a.summary-name:link    { color: #880000; font-weight: bold;\n                              font-family: monospace; }\ntable.summary\n    a.summary-name:visited  { color: #880000; font-weight: bold;\n                              font-family: monospace; }\n\n/* Variable values\n *   - In the 'variable details' sections, each varaible's value is\n *     listed in a 'pre.variable' box.  The width of this box is\n *     restricted to 80 chars; if the value's repr is longer than\n *     this it will be wrapped, using a backslash marked with\n *     class 'variable-linewrap'.  If the value's repr is longer\n *     than 3 lines, the rest will be ellided; and an ellipsis\n *     marker ('...' marked with 'variable-ellipsis') will be used.\n *   - If the value is a string, its quote marks will be marked\n *     with 'variable-quote'.\n *   - If the variable is a regexp, it is syntax-highlighted using\n *     the re* CSS classes.\n */\npre.variable                { padding: .5em; margin: 0;\n                              background: #dce4ec; color: #000000;\n                              border: 1px solid #708890; }\n.variable-linewrap          { color: #604000; font-weight: bold; }\n.variable-ellipsis          { color: #604000; font-weight: bold; }\n.variable-quote             { color: #604000; font-weight: bold; }\n.variable-group             { color: #008000; font-weight: bold; }\n.variable-op                { color: #604000; font-weight: bold; }\n.variable-string            { color: #006030; }\n.variable-unknown           { color: #a00000; font-weight: bold; }\n.re                         { color: #000000; }\n.re-char                    { color: #006030; }\n.re-op                      { color: #600000; }\n.re-group                   { color: #003060; }\n.re-ref                     { color: #404040; }\n\n/* Base tree\n *   - Used by class pages to display the base class hierarchy.\n */\npre.base-tree               { font-size: 80%; margin: 0; }\n\n/* Frames-based table of contents headers\n *   - Consists of two frames: one for selecting modules; and\n *     the other listing the contents of the selected module.\n *   - h1.toc is used for each frame's heading\n *   - h2.toc is used for subheadings within each frame.\n */\nh1.toc                      { text-align: center; font-size: 105%;\n                              margin: 0; font-weight: bold;\n                              padding: 0; }\nh2.toc                      { font-size: 100%; font-weight: bold; \n                              margin: 0.5em 0 0 -0.3em; }\n\n/* Syntax Highlighting for Source Code\n *   - doctest examples are displayed in a 'pre.py-doctest' block.\n *     If the example is in a details table entry, then it will use\n *     the colors specified by the 'table pre.py-doctest' line.\n *   - Source code listings are displayed in a 'pre.py-src' block.\n *     Each line is marked with 'span.py-line' (used to draw a line\n *     down the left margin, separating the code from the line\n *     numbers).  Line numbers are displayed with 'span.py-lineno'.\n *     The expand/collapse block toggle button is displayed with\n *     'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not\n *     modify the font size of the text.)\n *   - If a source code page is opened with an anchor, then the\n *     corresponding code block will be highlighted.  The code\n *     block's header is highlighted with 'py-highlight-hdr'; and\n *     the code block's body is highlighted with 'py-highlight'.\n *   - The remaining py-* classes are used to perform syntax\n *     highlighting (py-string for string literals, py-name for names,\n *     etc.)\n */\npre.py-doctest              { padding: .5em; margin: 1em;\n                              background: #e8f0f8; color: #000000;\n                              border: 1px solid #708890; }\ntable pre.py-doctest        { background: #dce4ec;\n                              color: #000000; }\npre.py-src                  { border: 2px solid #000000; \n                              background: #f0f0f0; color: #000000; }\n.py-line                    { border-left: 2px solid #000000; \n                              margin-left: .2em; padding-left: .4em; }\n.py-lineno                  { font-style: italic; font-size: 90%;\n                              padding-left: .5em; }\na.py-toggle                 { text-decoration: none; }\ndiv.py-highlight-hdr        { border-top: 2px solid #000000;\n                              border-bottom: 2px solid #000000;\n                              background: #d8e8e8; }\ndiv.py-highlight            { border-bottom: 2px solid #000000;\n                              background: #d0e0e0; }\n.py-prompt                  { color: #005050; font-weight: bold;}\n.py-more                    { color: #005050; font-weight: bold;}\n.py-string                  { color: #006030; }\n.py-comment                 { color: #003060; }\n.py-keyword                 { color: #600000; }\n.py-output                  { color: #404040; }\n.py-name                    { color: #000050; }\n.py-name:link               { color: #000050 !important; }\n.py-name:visited            { color: #000050 !important; }\n.py-number                  { color: #005000; }\n.py-defname                 { color: #000060; font-weight: bold; }\n.py-def-name                { color: #000060; font-weight: bold; }\n.py-base-class              { color: #000060; }\n.py-param                   { color: #000060; }\n.py-docstring               { color: #006030; }\n.py-decorator               { color: #804020; }\n/* Use this if you don't want links to names underlined: */\n/*a.py-name                   { text-decoration: none; }*/\n\n/* Graphs & Diagrams\n *   - These CSS styles are used for graphs & diagrams generated using\n *     Graphviz dot.  'img.graph-without-title' is used for bare\n *     diagrams (to remove the border created by making the image\n *     clickable).\n */\nimg.graph-without-title     { border: none; }\nimg.graph-with-title        { border: 1px solid #000000; }\nspan.graph-title            { font-weight: bold; }\nspan.graph-caption          { }\n\n/* General-purpose classes\n *   - 'p.indent-wrapped-lines' defines a paragraph whose first line\n *     is not indented, but whose subsequent lines are.\n *   - The 'nomargin-top' class is used to remove the top margin (e.g.\n *     from lists).  The 'nomargin' class is used to remove both the\n *     top and bottom margin (but not the left or right margin --\n *     for lists, that would cause the bullets to disappear.)\n */\np.indent-wrapped-lines      { padding: 0 0 0 7em; text-indent: -7em; \n                              margin: 0; }\n.nomargin-top               { margin-top: 0; }\n.nomargin                   { margin-top: 0; margin-bottom: 0; }\n\n/* HTML Log */\ndiv.log-block               { padding: 0; margin: .5em 0 .5em 0;\n                              background: #e8f0f8; color: #000000;\n                              border: 1px solid #000000; }\ndiv.log-error               { padding: .1em .3em .1em .3em; margin: 4px;\n                              background: #ffb0b0; color: #000000;\n                              border: 1px solid #000000; }\ndiv.log-warning             { padding: .1em .3em .1em .3em; margin: 4px;\n                              background: #ffffb0; color: #000000;\n                              border: 1px solid #000000; }\ndiv.log-info               { padding: .1em .3em .1em .3em; margin: 4px;\n                              background: #b0ffb0; color: #000000;\n                              border: 1px solid #000000; }\nh2.log-hdr                  { background: #70b0ff; color: #000000;\n                              margin: 0; padding: 0em 0.5em 0em 0.5em;\n                              border-bottom: 1px solid #000000; font-size: 110%; }\np.log                       { font-weight: bold; margin: .5em 0 .5em 0; }\ntr.opt-changed              { color: #000000; font-weight: bold; }\ntr.opt-default              { color: #606060; }\npre.log                     { margin: 0; padding: 0; padding-left: 1em; }\n"
  },
  {
    "path": "docs/epydoc/make-epydoc-docs.py",
    "content": "#python\n\nimport k3d\nimport shutil\n\nimport epydoc.docbuilder\nimport epydoc.docwriter.html\n\n# Use restructured text as the default for docstrings\n#import epydoc.docstringparser\n#epydoc.docstringparser.DEFAULT_DOCFORMAT = \"restructuredtext\"\n\nindex = epydoc.docbuilder.build_doc_index([k3d])\nepydoc.docwriter.html.HTMLWriter(index).write(\"html\")\n\n# Overwrite the default CSS\nshutil.copy(\"@epydoc_SOURCE_DIR@/epydoc.css\", \"@epydoc_BINARY_DIR@/html\")\n\n"
  },
  {
    "path": "docs/sample_module/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(sample-module)\nK3D_CREATE_MODULE_PROXY(sample-module)\n\n"
  },
  {
    "path": "docs/sample_module/module.cpp",
    "content": "#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace sample\n{\n\nclass plugin :\n\tpublic k3d::node\n{\npublic:\n\tplugin(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tk3d::node(Factory, Document)\n\t{\n\t\tk3d::log() << debug << \"Howdy, World!\" << std::endl;\n\t}\n\n\t~plugin()\n\t{\n\t\tk3d::log() << debug << \"Goodbye, Cruel World!\" << std::endl;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<plugin> factory(\n\t\t\tk3d::uuid(0x35b34163, 0xa1ee432a, 0x8f8503d2, 0xf09e7ac7),\n\t\t\t\"SamplePlugin\",\n\t\t\t\"Sample K-3D document plugin\",\n\t\t\t\"Sample\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace sample\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::sample::plugin::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "docs/uml/data.xmi",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<XMI xmlns:UML=\"http://schema.omg.org/spec/UML/1.3\" verified=\"false\" timestamp=\"2005-03-30T22:39:38\" xmi.version=\"1.2\" >\n <XMI.header>\n  <XMI.documentation>\n   <XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter>\n   <XMI.exporterVersion>1.4</XMI.exporterVersion>\n   <XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>\n  </XMI.documentation>\n  <XMI.metamodel xmi.name=\"UML\" href=\"UML.xml\" xmi.version=\"1.3\" />\n </XMI.header>\n <XMI.content>\n  <UML:Model isSpecification=\"false\" isLeaf=\"false\" isRoot=\"false\" isAbstract=\"false\" >\n   <UML:Namespace.ownedElement>\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"3\" isRoot=\"false\" isAbstract=\"false\" name=\"datatype\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"66\" isRoot=\"false\" isAbstract=\"false\" name=\"interface\" />\n    <UML:DataType stereotype=\"3\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"2\" isRoot=\"false\" isAbstract=\"false\" name=\"int\" />\n    <UML:DataType stereotype=\"3\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"4\" isRoot=\"false\" isAbstract=\"false\" name=\"char\" />\n    <UML:DataType stereotype=\"3\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"5\" isRoot=\"false\" isAbstract=\"false\" name=\"bool\" />\n    <UML:DataType stereotype=\"3\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"6\" isRoot=\"false\" isAbstract=\"false\" name=\"float\" />\n    <UML:DataType stereotype=\"3\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"7\" isRoot=\"false\" isAbstract=\"false\" name=\"double\" />\n    <UML:DataType stereotype=\"3\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"8\" isRoot=\"false\" isAbstract=\"false\" name=\"long\" />\n    <UML:DataType stereotype=\"3\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"9\" isRoot=\"false\" isAbstract=\"false\" name=\"short\" />\n    <UML:DataType stereotype=\"3\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"10\" isRoot=\"false\" isAbstract=\"false\" name=\"string\" />\n    <UML:DataType stereotype=\"3\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"55\" isRoot=\"false\" isAbstract=\"false\" name=\"void\" />\n    <UML:Package isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"430\" isRoot=\"false\" isAbstract=\"false\" name=\"k3d\" >\n     <UML:Namespace.ownedElement>\n      <UML:Package isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"433\" isRoot=\"false\" isAbstract=\"false\" name=\"data\" >\n       <UML:Namespace.ownedElement>\n        <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"18\" isRoot=\"false\" isAbstract=\"false\" name=\"undo_policy\" >\n         <UML:ModelElement.templateParameter>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"149\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"48\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"47\" isRoot=\"false\" isAbstract=\"false\" name=\"storage_policy_t\" />\n         </UML:ModelElement.templateParameter>\n         <UML:GeneralizableElement.generalization>\n          <UML:Generalization xmi.idref=\"257\" />\n         </UML:GeneralizableElement.generalization>\n         <UML:Classifier.feature>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"150\" isRoot=\"false\" isAbstract=\"false\" name=\"undo_policy\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"151\" isRoot=\"false\" value=\"\" type=\"149\" isAbstract=\"false\" name=\"Init\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"97\" isRoot=\"false\" isAbstract=\"false\" name=\"set_value\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"98\" isRoot=\"false\" value=\"\" type=\"48\" isAbstract=\"false\" name=\"Value\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n         </UML:Classifier.feature>\n         <UML:Namespace.ownedElement>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"149\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"48\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"47\" isRoot=\"false\" isAbstract=\"false\" name=\"storage_policy_t\" />\n         </UML:Namespace.ownedElement>\n        </UML:Class>\n        <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"12\" isRoot=\"false\" isAbstract=\"false\" name=\"storage_policy\" >\n         <UML:ModelElement.templateParameter>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"115\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"45\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"44\" isRoot=\"false\" isAbstract=\"false\" name=\"signal_policy_t\" />\n         </UML:ModelElement.templateParameter>\n         <UML:GeneralizableElement.generalization>\n          <UML:Generalization xmi.idref=\"24\" />\n         </UML:GeneralizableElement.generalization>\n         <UML:Classifier.feature>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"118\" isRoot=\"false\" isAbstract=\"false\" name=\"storage_policy\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"119\" isRoot=\"false\" value=\"\" type=\"115\" isAbstract=\"false\" name=\"Init\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"225\" isRoot=\"false\" isAbstract=\"false\" name=\"start_recording\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"226\" isRoot=\"false\" value=\"\" type=\"65\" isAbstract=\"false\" name=\"Recorder\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"69\" isRoot=\"false\" isAbstract=\"false\" name=\"set_value\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"70\" isRoot=\"false\" value=\"\" type=\"45\" isAbstract=\"false\" name=\"Value\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"229\" isRoot=\"false\" isAbstract=\"false\" name=\"finish_recording\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"230\" isRoot=\"false\" value=\"\" type=\"65\" isAbstract=\"false\" name=\"Recorder\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"68\" isRoot=\"false\" isAbstract=\"false\" name=\"internal_value\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter kind=\"return\" xmi.id=\"598\" type=\"45\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"466\" isRoot=\"false\" isAbstract=\"false\" name=\"value\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter kind=\"return\" xmi.id=\"599\" type=\"45\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n         </UML:Classifier.feature>\n         <UML:Namespace.ownedElement>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"115\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"45\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"44\" isRoot=\"false\" isAbstract=\"false\" name=\"signal_policy_t\" />\n         </UML:Namespace.ownedElement>\n        </UML:Class>\n        <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"16\" isRoot=\"false\" isAbstract=\"false\" name=\"signal_policy\" >\n         <UML:ModelElement.templateParameter>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"67\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n         </UML:ModelElement.templateParameter>\n         <UML:Classifier.feature>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"57\" isRoot=\"false\" isAbstract=\"false\" name=\"start_recording\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"58\" isRoot=\"false\" value=\"\" type=\"63\" isAbstract=\"false\" name=\"Recorder\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"59\" isRoot=\"false\" isAbstract=\"false\" name=\"set_value\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"60\" isRoot=\"false\" value=\"\" type=\"67\" isAbstract=\"false\" name=\"Value\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"61\" isRoot=\"false\" isAbstract=\"false\" name=\"finish_recording\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"62\" isRoot=\"false\" value=\"\" type=\"65\" isAbstract=\"false\" name=\"Recorder\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n         </UML:Classifier.feature>\n         <UML:Namespace.ownedElement>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"67\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n         </UML:Namespace.ownedElement>\n        </UML:Class>\n        <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"17\" isRoot=\"false\" isAbstract=\"false\" name=\"serialization_policy\" >\n         <UML:ModelElement.templateParameter>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"201\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"202\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"373\" isRoot=\"false\" isAbstract=\"false\" name=\"property_policy_t\" />\n         </UML:ModelElement.templateParameter>\n         <UML:GeneralizableElement.generalization>\n          <UML:Generalization xmi.idref=\"384\" />\n         </UML:GeneralizableElement.generalization>\n         <UML:Classifier.feature>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"203\" isRoot=\"false\" isAbstract=\"false\" name=\"serialization_policy\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"204\" isRoot=\"false\" value=\"\" type=\"201\" isAbstract=\"false\" name=\"Init\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n         </UML:Classifier.feature>\n         <UML:Namespace.ownedElement>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"201\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"202\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"373\" isRoot=\"false\" isAbstract=\"false\" name=\"property_policy_t\" />\n         </UML:Namespace.ownedElement>\n        </UML:Class>\n        <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"15\" isRoot=\"false\" isAbstract=\"false\" name=\"property_policy\" >\n         <UML:ModelElement.templateParameter>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"190\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"107\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"361\" isRoot=\"false\" isAbstract=\"false\" name=\"name_policy_t\" />\n         </UML:ModelElement.templateParameter>\n         <UML:GeneralizableElement.generalization>\n          <UML:Generalization xmi.idref=\"364\" />\n         </UML:GeneralizableElement.generalization>\n         <UML:Classifier.feature>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"191\" isRoot=\"false\" isAbstract=\"false\" name=\"property_policy\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"192\" isRoot=\"false\" value=\"\" type=\"190\" isAbstract=\"false\" name=\"Init\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"108\" isRoot=\"false\" isAbstract=\"false\" name=\"value\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter kind=\"return\" xmi.id=\"600\" type=\"107\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n         </UML:Classifier.feature>\n         <UML:Namespace.ownedElement>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"190\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"107\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"361\" isRoot=\"false\" isAbstract=\"false\" name=\"name_policy_t\" />\n         </UML:Namespace.ownedElement>\n        </UML:Class>\n        <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"13\" isRoot=\"false\" isAbstract=\"false\" name=\"name_policy\" >\n         <UML:ModelElement.templateParameter>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"183\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"333\" isRoot=\"false\" isAbstract=\"false\" name=\"constraint_policy_t\" />\n         </UML:ModelElement.templateParameter>\n         <UML:GeneralizableElement.generalization>\n          <UML:Generalization xmi.idref=\"344\" />\n         </UML:GeneralizableElement.generalization>\n         <UML:Classifier.feature>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"184\" isRoot=\"false\" isAbstract=\"false\" name=\"name_policy\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"185\" isRoot=\"false\" value=\"\" type=\"183\" isAbstract=\"false\" name=\"Init\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n         </UML:Classifier.feature>\n         <UML:Namespace.ownedElement>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"183\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"333\" isRoot=\"false\" isAbstract=\"false\" name=\"constraint_policy_t\" />\n         </UML:Namespace.ownedElement>\n        </UML:Class>\n        <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"14\" isRoot=\"false\" isAbstract=\"false\" name=\"constraint_policy\" >\n         <UML:ModelElement.templateParameter>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"132\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"19\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"46\" isRoot=\"false\" isAbstract=\"false\" name=\"undo_policy_t\" />\n         </UML:ModelElement.templateParameter>\n         <UML:GeneralizableElement.generalization>\n          <UML:Generalization xmi.idref=\"264\" />\n         </UML:GeneralizableElement.generalization>\n         <UML:Classifier.feature>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"133\" isRoot=\"false\" isAbstract=\"false\" name=\"constraint_policy\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"136\" isRoot=\"false\" value=\"\" type=\"132\" isAbstract=\"false\" name=\"Init\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"87\" isRoot=\"false\" isAbstract=\"false\" name=\"set_value\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"88\" isRoot=\"false\" value=\"\" type=\"19\" isAbstract=\"false\" name=\"Value\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n         </UML:Classifier.feature>\n         <UML:Namespace.ownedElement>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"132\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"19\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"46\" isRoot=\"false\" isAbstract=\"false\" name=\"undo_policy_t\" />\n         </UML:Namespace.ownedElement>\n        </UML:Class>\n        <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"554\" isRoot=\"false\" isAbstract=\"false\" name=\"container\" >\n         <UML:ModelElement.templateParameter>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"558\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"559\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"560\" isRoot=\"false\" isAbstract=\"false\" name=\"serialization_policy_t\" />\n         </UML:ModelElement.templateParameter>\n         <UML:GeneralizableElement.generalization>\n          <UML:Generalization xmi.idref=\"574\" />\n         </UML:GeneralizableElement.generalization>\n         <UML:Classifier.feature>\n          <UML:Operation isSpecification=\"false\" isLeaf=\"false\" visibility=\"protected\" xmi.id=\"561\" isRoot=\"false\" isAbstract=\"false\" name=\"container\" >\n           <UML:BehavioralFeature.parameter>\n            <UML:Parameter kind=\"return\" xmi.id=\"601\" type=\"558\" />\n            <UML:Parameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"private\" xmi.id=\"562\" isRoot=\"false\" value=\"\" type=\"558\" isAbstract=\"false\" name=\"Init\" />\n           </UML:BehavioralFeature.parameter>\n          </UML:Operation>\n         </UML:Classifier.feature>\n         <UML:Namespace.ownedElement>\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"558\" isRoot=\"false\" isAbstract=\"false\" name=\"init_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"559\" isRoot=\"false\" isAbstract=\"false\" name=\"value_t\" />\n          <UML:TemplateParameter isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"560\" isRoot=\"false\" isAbstract=\"false\" name=\"serialization_policy_t\" />\n         </UML:Namespace.ownedElement>\n        </UML:Class>\n       </UML:Namespace.ownedElement>\n      </UML:Package>\n      <UML:Interface stereotype=\"66\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"65\" isRoot=\"false\" isAbstract=\"false\" name=\"istate_recorder\" />\n      <UML:Interface stereotype=\"66\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"296\" isRoot=\"false\" isAbstract=\"false\" name=\"ipersistent\" />\n      <UML:Interface stereotype=\"66\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" xmi.id=\"299\" isRoot=\"false\" isAbstract=\"false\" name=\"iproperty\" />\n     </UML:Namespace.ownedElement>\n    </UML:Package>\n    <UML:Generalization isSpecification=\"false\" child=\"12\" visibility=\"public\" xmi.id=\"24\" parent=\"16\" discriminator=\"\" name=\"\" />\n    <UML:Generalization isSpecification=\"false\" child=\"27\" visibility=\"public\" xmi.id=\"37\" parent=\"17\" discriminator=\"\" name=\"\" />\n    <UML:Generalization isSpecification=\"false\" child=\"18\" visibility=\"public\" xmi.id=\"257\" parent=\"12\" discriminator=\"\" name=\"\" />\n    <UML:Generalization isSpecification=\"false\" child=\"14\" visibility=\"public\" xmi.id=\"264\" parent=\"18\" discriminator=\"\" name=\"\" />\n    <UML:Generalization isSpecification=\"false\" child=\"27\" visibility=\"public\" xmi.id=\"271\" parent=\"14\" discriminator=\"\" name=\"\" />\n    <UML:Generalization isSpecification=\"false\" child=\"13\" visibility=\"public\" xmi.id=\"344\" parent=\"14\" discriminator=\"\" name=\"\" />\n    <UML:Generalization isSpecification=\"false\" child=\"15\" visibility=\"public\" xmi.id=\"364\" parent=\"13\" discriminator=\"\" name=\"\" />\n    <UML:Generalization isSpecification=\"false\" child=\"17\" visibility=\"public\" xmi.id=\"384\" parent=\"15\" discriminator=\"\" name=\"\" />\n    <UML:Generalization isSpecification=\"false\" child=\"554\" visibility=\"public\" xmi.id=\"574\" parent=\"17\" discriminator=\"\" name=\"\" />\n   </UML:Namespace.ownedElement>\n  </UML:Model>\n </XMI.content>\n <XMI.extensions xmi.extender=\"umbrello\" >\n  <docsettings viewid=\"1\" documentation=\"\" uniqueid=\"601\" />\n  <diagrams>\n   <diagram snapgrid=\"0\" showattsig=\"1\" fillcolor=\"#ffffc0\" linewidth=\"0\" zoom=\"100\" showgrid=\"0\" showopsig=\"1\" usefillcolor=\"1\" snapx=\"10\" canvaswidth=\"854\" snapy=\"10\" showatts=\"1\" xmi.id=\"1\" documentation=\"\" type=\"402\" showops=\"1\" showpackage=\"0\" name=\"class diagram\" localid=\"900000\" showstereotype=\"0\" showscope=\"1\" snapcsgrid=\"0\" font=\"helvetica,12,-1,0,50,0,0,0,0,0\" linecolor=\"#ff0000\" canvasheight=\"1250\" >\n    <widgets>\n     <classwidget usesdiagramfillcolour=\"0\" width=\"412\" showattsigs=\"601\" usesdiagramusefillcolour=\"0\" x=\"37\" linecolour=\"#ff0000\" y=\"162\" showopsigs=\"601\" linewidth=\"none\" usesdiagramlinewidth=\"1\" usesdiagramlinecolour=\"0\" fillcolour=\"#ffffc0\" height=\"183\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"1\" isinstance=\"0\" xmi.id=\"12\" showoperations=\"1\" showpackage=\"0\" showscope=\"1\" showstereotype=\"0\" font=\"Helvetica,11,-1,5,75,0,0,0,0,0\" />\n     <classwidget usesdiagramfillcolour=\"0\" width=\"255\" showattsigs=\"601\" usesdiagramusefillcolour=\"0\" x=\"116\" linecolour=\"#ff0000\" y=\"689\" showopsigs=\"601\" linewidth=\"none\" usesdiagramlinewidth=\"1\" usesdiagramlinecolour=\"0\" fillcolour=\"#ffffc0\" height=\"81\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"1\" isinstance=\"0\" xmi.id=\"13\" showoperations=\"1\" showpackage=\"0\" showscope=\"1\" showstereotype=\"0\" font=\"Helvetica,11,-1,5,75,0,0,0,0,0\" />\n     <classwidget usesdiagramfillcolour=\"0\" width=\"273\" showattsigs=\"601\" usesdiagramusefillcolour=\"0\" x=\"107\" linecolour=\"#ff0000\" y=\"523\" showopsigs=\"601\" linewidth=\"none\" usesdiagramlinewidth=\"1\" usesdiagramlinecolour=\"0\" fillcolour=\"#ffffc0\" height=\"115\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"1\" isinstance=\"0\" xmi.id=\"14\" showoperations=\"1\" showpackage=\"0\" showscope=\"1\" showstereotype=\"0\" font=\"Helvetica,11,-1,5,75,0,0,0,0,0\" />\n     <classwidget usesdiagramfillcolour=\"0\" width=\"264\" showattsigs=\"601\" usesdiagramusefillcolour=\"0\" x=\"111\" linecolour=\"#ff0000\" y=\"820\" showopsigs=\"601\" linewidth=\"none\" usesdiagramlinewidth=\"1\" usesdiagramlinecolour=\"0\" fillcolour=\"#ffffc0\" height=\"115\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"1\" isinstance=\"0\" xmi.id=\"15\" showoperations=\"1\" showpackage=\"0\" showscope=\"1\" showstereotype=\"0\" font=\"Helvetica,11,-1,5,75,0,0,0,0,0\" />\n     <classwidget usesdiagramfillcolour=\"0\" width=\"388\" showattsigs=\"601\" usesdiagramusefillcolour=\"0\" x=\"49\" linecolour=\"#ff0000\" y=\"21\" showopsigs=\"601\" linewidth=\"none\" usesdiagramlinewidth=\"1\" usesdiagramlinecolour=\"0\" fillcolour=\"#ffffc0\" height=\"98\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"1\" isinstance=\"0\" xmi.id=\"16\" showoperations=\"1\" showpackage=\"0\" showscope=\"1\" showstereotype=\"0\" font=\"Helvetica,11,-1,5,75,0,0,0,0,0\" />\n     <classwidget usesdiagramfillcolour=\"0\" width=\"296\" showattsigs=\"601\" usesdiagramusefillcolour=\"0\" x=\"95\" linecolour=\"#ff0000\" y=\"991\" showopsigs=\"601\" linewidth=\"none\" usesdiagramlinewidth=\"1\" usesdiagramlinecolour=\"0\" fillcolour=\"#ffffc0\" height=\"98\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"1\" isinstance=\"0\" xmi.id=\"17\" showoperations=\"1\" showpackage=\"0\" showscope=\"1\" showstereotype=\"0\" font=\"Helvetica,11,-1,5,75,0,0,0,0,0\" />\n     <classwidget usesdiagramfillcolour=\"0\" width=\"259\" showattsigs=\"601\" usesdiagramusefillcolour=\"0\" x=\"114\" linecolour=\"#ff0000\" y=\"371\" showopsigs=\"601\" linewidth=\"none\" usesdiagramlinewidth=\"1\" usesdiagramlinecolour=\"0\" fillcolour=\"#ffffc0\" height=\"115\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"1\" isinstance=\"0\" xmi.id=\"18\" showoperations=\"1\" showpackage=\"0\" showscope=\"1\" showstereotype=\"0\" font=\"Helvetica,11,-1,5,75,0,0,0,0,0\" />\n     <classwidget usesdiagramfillcolour=\"0\" width=\"288\" showattsigs=\"601\" usesdiagramusefillcolour=\"0\" x=\"99\" linecolour=\"#ff0000\" y=\"1148\" showopsigs=\"601\" linewidth=\"none\" usesdiagramlinewidth=\"1\" usesdiagramlinecolour=\"0\" fillcolour=\"#ffffc0\" height=\"98\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"1\" isinstance=\"0\" xmi.id=\"554\" showoperations=\"1\" showpackage=\"0\" showscope=\"1\" showstereotype=\"0\" font=\"Helvetica,11,-1,5,75,0,0,0,0,0\" />\n    </widgets>\n    <messages/>\n    <associations>\n     <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"2\" indexb=\"1\" widgetbid=\"16\" widgetaid=\"12\" xmi.id=\"24\" >\n      <linepath>\n       <startpoint startx=\"243\" starty=\"162\" />\n       <endpoint endx=\"243\" endy=\"119\" />\n      </linepath>\n     </assocwidget>\n     <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"2\" indexb=\"1\" widgetbid=\"12\" widgetaid=\"18\" xmi.id=\"257\" >\n      <linepath>\n       <startpoint startx=\"243\" starty=\"371\" />\n       <endpoint endx=\"243\" endy=\"345\" />\n      </linepath>\n     </assocwidget>\n     <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"2\" indexb=\"1\" widgetbid=\"18\" widgetaid=\"14\" xmi.id=\"264\" >\n      <linepath>\n       <startpoint startx=\"243\" starty=\"523\" />\n       <endpoint endx=\"243\" endy=\"486\" />\n      </linepath>\n     </assocwidget>\n     <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"2\" indexb=\"1\" widgetbid=\"14\" widgetaid=\"13\" xmi.id=\"344\" >\n      <linepath>\n       <startpoint startx=\"243\" starty=\"689\" />\n       <endpoint endx=\"243\" endy=\"638\" />\n      </linepath>\n     </assocwidget>\n     <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"2\" indexb=\"1\" widgetbid=\"13\" widgetaid=\"15\" xmi.id=\"364\" >\n      <linepath>\n       <startpoint startx=\"243\" starty=\"820\" />\n       <endpoint endx=\"243\" endy=\"770\" />\n      </linepath>\n     </assocwidget>\n     <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"2\" indexb=\"1\" widgetbid=\"15\" widgetaid=\"17\" xmi.id=\"384\" >\n      <linepath>\n       <startpoint startx=\"243\" starty=\"991\" />\n       <endpoint endx=\"243\" endy=\"935\" />\n      </linepath>\n     </assocwidget>\n     <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"2\" indexb=\"1\" widgetbid=\"17\" widgetaid=\"554\" xmi.id=\"574\" >\n      <linepath>\n       <startpoint startx=\"243\" starty=\"1148\" />\n       <endpoint endx=\"243\" endy=\"1089\" />\n      </linepath>\n     </assocwidget>\n    </associations>\n   </diagram>\n  </diagrams>\n  <listview>\n   <listitem open=\"1\" type=\"800\" label=\"Views\" >\n    <listitem open=\"1\" type=\"801\" label=\"Logical View\" >\n     <listitem open=\"1\" type=\"818\" id=\"430\" >\n      <listitem open=\"0\" type=\"817\" id=\"296\" />\n      <listitem open=\"0\" type=\"817\" id=\"299\" />\n      <listitem open=\"1\" type=\"817\" id=\"65\" />\n      <listitem open=\"1\" type=\"818\" id=\"433\" >\n       <listitem open=\"0\" type=\"813\" id=\"14\" >\n        <listitem open=\"0\" type=\"815\" id=\"133\" />\n        <listitem open=\"0\" type=\"815\" id=\"87\" />\n        <listitem open=\"0\" type=\"816\" id=\"132\" />\n        <listitem open=\"0\" type=\"816\" id=\"46\" />\n        <listitem open=\"0\" type=\"816\" id=\"19\" />\n       </listitem>\n       <listitem open=\"0\" type=\"813\" id=\"554\" >\n        <listitem open=\"0\" type=\"815\" id=\"561\" />\n        <listitem open=\"0\" type=\"816\" id=\"558\" />\n        <listitem open=\"0\" type=\"816\" id=\"560\" />\n        <listitem open=\"0\" type=\"816\" id=\"559\" />\n       </listitem>\n       <listitem open=\"0\" type=\"813\" id=\"13\" >\n        <listitem open=\"0\" type=\"815\" id=\"184\" />\n        <listitem open=\"0\" type=\"816\" id=\"333\" />\n        <listitem open=\"0\" type=\"816\" id=\"183\" />\n       </listitem>\n       <listitem open=\"0\" type=\"813\" id=\"15\" >\n        <listitem open=\"0\" type=\"815\" id=\"191\" />\n        <listitem open=\"0\" type=\"815\" id=\"108\" />\n        <listitem open=\"0\" type=\"816\" id=\"190\" />\n        <listitem open=\"0\" type=\"816\" id=\"361\" />\n        <listitem open=\"0\" type=\"816\" id=\"107\" />\n       </listitem>\n       <listitem open=\"0\" type=\"813\" id=\"17\" >\n        <listitem open=\"0\" type=\"815\" id=\"203\" />\n        <listitem open=\"0\" type=\"816\" id=\"201\" />\n        <listitem open=\"0\" type=\"816\" id=\"373\" />\n        <listitem open=\"0\" type=\"816\" id=\"202\" />\n       </listitem>\n       <listitem open=\"0\" type=\"813\" id=\"16\" >\n        <listitem open=\"0\" type=\"815\" id=\"57\" />\n        <listitem open=\"0\" type=\"815\" id=\"59\" />\n        <listitem open=\"0\" type=\"815\" id=\"61\" />\n        <listitem open=\"0\" type=\"816\" id=\"67\" />\n       </listitem>\n       <listitem open=\"0\" type=\"813\" id=\"12\" >\n        <listitem open=\"0\" type=\"815\" id=\"118\" />\n        <listitem open=\"0\" type=\"815\" id=\"225\" />\n        <listitem open=\"0\" type=\"815\" id=\"69\" />\n        <listitem open=\"0\" type=\"815\" id=\"229\" />\n        <listitem open=\"0\" type=\"815\" id=\"68\" />\n        <listitem open=\"0\" type=\"815\" id=\"466\" />\n        <listitem open=\"0\" type=\"816\" id=\"115\" />\n        <listitem open=\"0\" type=\"816\" id=\"44\" />\n        <listitem open=\"0\" type=\"816\" id=\"45\" />\n       </listitem>\n       <listitem open=\"0\" type=\"813\" id=\"18\" >\n        <listitem open=\"0\" type=\"815\" id=\"150\" />\n        <listitem open=\"0\" type=\"815\" id=\"97\" />\n        <listitem open=\"0\" type=\"816\" id=\"149\" />\n        <listitem open=\"0\" type=\"816\" id=\"47\" />\n        <listitem open=\"0\" type=\"816\" id=\"48\" />\n       </listitem>\n      </listitem>\n     </listitem>\n     <listitem open=\"0\" type=\"830\" label=\"Datatypes\" >\n      <listitem open=\"1\" type=\"829\" id=\"5\" />\n      <listitem open=\"1\" type=\"829\" id=\"4\" />\n      <listitem open=\"1\" type=\"829\" id=\"7\" />\n      <listitem open=\"1\" type=\"829\" id=\"6\" />\n      <listitem open=\"1\" type=\"829\" id=\"2\" />\n      <listitem open=\"1\" type=\"829\" id=\"8\" />\n      <listitem open=\"1\" type=\"829\" id=\"9\" />\n      <listitem open=\"1\" type=\"829\" id=\"10\" />\n      <listitem open=\"1\" type=\"829\" id=\"55\" />\n     </listitem>\n    </listitem>\n    <listitem open=\"1\" type=\"802\" label=\"Use Case View\" />\n    <listitem open=\"1\" type=\"821\" label=\"Component View\" />\n    <listitem open=\"1\" type=\"827\" label=\"Deployment View\" />\n    <listitem open=\"1\" type=\"836\" label=\"Entity Relationship Model\" />\n   </listitem>\n  </listview>\n  <codegeneration>\n   <codegenerator language=\"Cpp\" >\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"18\" parent_class=\"18\" fileExt=\".cpp\" fileName=\"undo_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &quot;undo_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"constructionMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Constructors/Destructors\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n      <hierarchicalcodeblock tag=\"otherMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Methods\" />\n       </header>\n       <textblocks>\n        <codeoperation parent_id=\"150\" tag=\"operation_150\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n        <codeoperation parent_id=\"97\" tag=\"operation_97\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n       </textblocks>\n      </hierarchicalcodeblock>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tundo_policy.cpp - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.cpp&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"12\" parent_class=\"12\" fileExt=\".cpp\" fileName=\"storage_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &quot;storage_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"constructionMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Constructors/Destructors\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n      <hierarchicalcodeblock tag=\"otherMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Methods\" />\n       </header>\n       <textblocks>\n        <codeoperation parent_id=\"118\" tag=\"operation_118\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n        <codeoperation parent_id=\"225\" tag=\"operation_225\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n        <codeoperation parent_id=\"69\" tag=\"operation_69\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n        <codeoperation parent_id=\"229\" tag=\"operation_229\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n        <codeoperation parent_id=\"68\" tag=\"operation_68\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n        <codeoperation parent_id=\"466\" tag=\"operation_466\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n       </textblocks>\n      </hierarchicalcodeblock>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tstorage_policy.cpp - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.cpp&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"16\" parent_class=\"16\" fileExt=\".cpp\" fileName=\"signal_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &quot;signal_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"constructionMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Constructors/Destructors\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n      <hierarchicalcodeblock tag=\"otherMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Methods\" />\n       </header>\n       <textblocks>\n        <codeoperation parent_id=\"57\" tag=\"operation_57\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n        <codeoperation parent_id=\"59\" tag=\"operation_59\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n        <codeoperation parent_id=\"61\" tag=\"operation_61\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n       </textblocks>\n      </hierarchicalcodeblock>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tsignal_policy.cpp - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.cpp&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"17\" parent_class=\"17\" fileExt=\".cpp\" fileName=\"serialization_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &quot;serialization_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"constructionMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Constructors/Destructors\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n      <hierarchicalcodeblock tag=\"otherMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Methods\" />\n       </header>\n       <textblocks>\n        <codeoperation parent_id=\"203\" tag=\"operation_203\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n       </textblocks>\n      </hierarchicalcodeblock>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tserialization_policy.cpp - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.cpp&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"15\" parent_class=\"15\" fileExt=\".cpp\" fileName=\"property_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &quot;property_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"constructionMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Constructors/Destructors\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n      <hierarchicalcodeblock tag=\"otherMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Methods\" />\n       </header>\n       <textblocks>\n        <codeoperation parent_id=\"191\" tag=\"operation_191\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n        <codeoperation parent_id=\"108\" tag=\"operation_108\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n       </textblocks>\n      </hierarchicalcodeblock>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tproperty_policy.cpp - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.cpp&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"13\" parent_class=\"13\" fileExt=\".cpp\" fileName=\"name_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &quot;name_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"constructionMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Constructors/Destructors\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n      <hierarchicalcodeblock tag=\"otherMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Methods\" />\n       </header>\n       <textblocks>\n        <codeoperation parent_id=\"184\" tag=\"operation_184\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n       </textblocks>\n      </hierarchicalcodeblock>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tname_policy.cpp - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.cpp&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"14\" parent_class=\"14\" fileExt=\".cpp\" fileName=\"constraint_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &quot;constraint_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"constructionMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Constructors/Destructors\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n      <hierarchicalcodeblock tag=\"otherMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Methods\" />\n       </header>\n       <textblocks>\n        <codeoperation parent_id=\"133\" tag=\"operation_133\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n        <codeoperation parent_id=\"87\" tag=\"operation_87\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n       </textblocks>\n      </hierarchicalcodeblock>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tconstraint_policy.cpp - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.cpp&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"554\" parent_class=\"554\" fileExt=\".cpp\" fileName=\"container\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &quot;container.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"constructionMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Constructors/Destructors\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n      <hierarchicalcodeblock tag=\"otherMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Methods\" />\n       </header>\n       <textblocks>\n        <codeoperation parent_id=\"561\" tag=\"operation_561\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" />\n         </header>\n        </codeoperation>\n       </textblocks>\n      </hierarchicalcodeblock>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tcontainer.cpp - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.cpp&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d\" id=\"65\" parent_class=\"65\" fileExt=\".cpp\" fileName=\"istate_recorder\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &quot;istate_recorder.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"constructionMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Constructors/Destructors\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n      <hierarchicalcodeblock tag=\"otherMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Methods\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tistate_recorder.cpp - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.cpp&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d\" id=\"296\" parent_class=\"296\" fileExt=\".cpp\" fileName=\"ipersistent\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &quot;ipersistent.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"constructionMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Constructors/Destructors\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n      <hierarchicalcodeblock tag=\"otherMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Methods\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tipersistent.cpp - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.cpp&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d\" id=\"299\" parent_class=\"299\" fileExt=\".cpp\" fileName=\"iproperty\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &quot;iproperty.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"constructionMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Constructors/Destructors\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n      <hierarchicalcodeblock tag=\"otherMethodsBlock\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" text=\"Methods\" />\n       </header>\n       <textblocks/>\n      </hierarchicalcodeblock>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tiproperty.cpp - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.cpp&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <codedocument writeOutCode=\"false\" package=\"\" id=\"Makefile_DOC\" fileExt=\"\" fileName=\"Makefile\" >\n     <textblocks/>\n     <header>\n      <codecomment tag=\"\" />\n     </header>\n    </codedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"cppheader18\" parent_class=\"18\" fileExt=\".h\" fileName=\"undo_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"hashDefBlock\" text=\"#ifndef UNDO_POLICY_H&amp;#010;#define UNDO_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &lt;string>&amp;#010;#include &quot;storage_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"using\" writeOutText=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"namespace\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" text=\"Namespace\" />\n       </header>\n       <textblocks>\n        <codeblockwithcomments tag=\"enums\" writeOutText=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n         </header>\n        </codeblockwithcomments>\n        <cppheaderclassdeclarationblock parent_id=\"18\" tag=\"classDeclarationBlock\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" text=\"Class undo_policy&amp;#010;\" />\n         </header>\n         <textblocks>\n          <hierarchicalcodeblock tag=\"publicBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Public stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"publicFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"pubMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks>\n                <codeblockwithcomments tag=\"emptyconstructor\" writeOutText=\"false\" indentLevel=\"1\" text=\"undo_policy ( ) { }\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Empty Constructor\" />\n                 </header>\n                </codeblockwithcomments>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"pubStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"pubRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"protectedBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Protected stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"protectedFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"protMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"protStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"protRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks>\n                <codeoperation parent_id=\"150\" tag=\"operation_150\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Init \" />\n                 </header>\n                </codeoperation>\n                <codeoperation parent_id=\"97\" tag=\"operation_97\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Value \" />\n                 </header>\n                </codeoperation>\n               </textblocks>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"privateBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Private stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"privateFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"privMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"privStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"privRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n         </textblocks>\n        </cppheaderclassdeclarationblock>\n       </textblocks>\n      </hierarchicalcodeblock>\n      <codeblockwithcomments tag=\"hashDefBlockEnd\" text=\"#endif //UNDO_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tundo_policy.h - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.h&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"cppheader12\" parent_class=\"12\" fileExt=\".h\" fileName=\"storage_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"hashDefBlock\" text=\"#ifndef STORAGE_POLICY_H&amp;#010;#define STORAGE_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &lt;string>&amp;#010;#include &quot;signal_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"using\" writeOutText=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"namespace\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" text=\"Namespace\" />\n       </header>\n       <textblocks>\n        <codeblockwithcomments tag=\"enums\" writeOutText=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n         </header>\n        </codeblockwithcomments>\n        <cppheaderclassdeclarationblock parent_id=\"12\" tag=\"classDeclarationBlock\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" text=\"Class storage_policy&amp;#010;\" />\n         </header>\n         <textblocks>\n          <hierarchicalcodeblock tag=\"publicBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Public stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"publicFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"pubMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks>\n                <codeblockwithcomments tag=\"emptyconstructor\" writeOutText=\"false\" indentLevel=\"1\" text=\"storage_policy ( ) { }\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Empty Constructor\" />\n                 </header>\n                </codeblockwithcomments>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"pubStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"pubRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks>\n                <codeoperation parent_id=\"68\" tag=\"operation_68\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n                 </header>\n                </codeoperation>\n               </textblocks>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"protectedBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Protected stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"protectedFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"protMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"protStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"protRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks>\n                <codeoperation parent_id=\"118\" tag=\"operation_118\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Init \" />\n                 </header>\n                </codeoperation>\n                <codeoperation parent_id=\"225\" tag=\"operation_225\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Recorder \" />\n                 </header>\n                </codeoperation>\n                <codeoperation parent_id=\"69\" tag=\"operation_69\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Value \" />\n                 </header>\n                </codeoperation>\n                <codeoperation parent_id=\"229\" tag=\"operation_229\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Recorder \" />\n                 </header>\n                </codeoperation>\n                <codeoperation parent_id=\"466\" tag=\"operation_466\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n                 </header>\n                </codeoperation>\n               </textblocks>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"privateBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Private stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"privateFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"privMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"privStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"privRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n         </textblocks>\n        </cppheaderclassdeclarationblock>\n       </textblocks>\n      </hierarchicalcodeblock>\n      <codeblockwithcomments tag=\"hashDefBlockEnd\" text=\"#endif //STORAGE_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tstorage_policy.h - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.h&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"cppheader16\" parent_class=\"16\" fileExt=\".h\" fileName=\"signal_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"hashDefBlock\" text=\"#ifndef SIGNAL_POLICY_H&amp;#010;#define SIGNAL_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &lt;string>&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"using\" writeOutText=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"namespace\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" text=\"Namespace\" />\n       </header>\n       <textblocks>\n        <codeblockwithcomments tag=\"enums\" writeOutText=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n         </header>\n        </codeblockwithcomments>\n        <cppheaderclassdeclarationblock parent_id=\"16\" tag=\"classDeclarationBlock\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" text=\"Class signal_policy&amp;#010;\" />\n         </header>\n         <textblocks>\n          <hierarchicalcodeblock tag=\"publicBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Public stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"publicFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"pubMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks>\n                <codeblockwithcomments tag=\"emptyconstructor\" writeOutText=\"false\" indentLevel=\"1\" text=\"signal_policy ( ) { }\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Empty Constructor\" />\n                 </header>\n                </codeblockwithcomments>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"pubStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"pubRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"protectedBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Protected stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"protectedFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"protMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"protStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"protRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks>\n                <codeoperation parent_id=\"57\" tag=\"operation_57\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Recorder \" />\n                 </header>\n                </codeoperation>\n                <codeoperation parent_id=\"59\" tag=\"operation_59\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Value \" />\n                 </header>\n                </codeoperation>\n                <codeoperation parent_id=\"61\" tag=\"operation_61\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Recorder \" />\n                 </header>\n                </codeoperation>\n               </textblocks>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"privateBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Private stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"privateFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"privMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"privStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"privRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n         </textblocks>\n        </cppheaderclassdeclarationblock>\n       </textblocks>\n      </hierarchicalcodeblock>\n      <codeblockwithcomments tag=\"hashDefBlockEnd\" text=\"#endif //SIGNAL_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tsignal_policy.h - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.h&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"cppheader17\" parent_class=\"17\" fileExt=\".h\" fileName=\"serialization_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"hashDefBlock\" text=\"#ifndef SERIALIZATION_POLICY_H&amp;#010;#define SERIALIZATION_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &lt;string>&amp;#010;#include &quot;property_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"using\" writeOutText=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"namespace\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" text=\"Namespace\" />\n       </header>\n       <textblocks>\n        <codeblockwithcomments tag=\"enums\" writeOutText=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n         </header>\n        </codeblockwithcomments>\n        <cppheaderclassdeclarationblock parent_id=\"17\" tag=\"classDeclarationBlock\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" text=\"Class serialization_policy&amp;#010;\" />\n         </header>\n         <textblocks>\n          <hierarchicalcodeblock tag=\"publicBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Public stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"publicFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"pubMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks>\n                <codeblockwithcomments tag=\"emptyconstructor\" writeOutText=\"false\" indentLevel=\"1\" text=\"serialization_policy ( ) { }\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Empty Constructor\" />\n                 </header>\n                </codeblockwithcomments>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"pubStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"pubRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks>\n                <codeoperation parent_id=\"203\" tag=\"operation_203\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Init \" />\n                 </header>\n                </codeoperation>\n               </textblocks>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"protectedBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Protected stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"protectedFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"protMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"protStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"protRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"privateBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Private stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"privateFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"privMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"privStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"privRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n         </textblocks>\n        </cppheaderclassdeclarationblock>\n       </textblocks>\n      </hierarchicalcodeblock>\n      <codeblockwithcomments tag=\"hashDefBlockEnd\" text=\"#endif //SERIALIZATION_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tserialization_policy.h - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.h&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"cppheader15\" parent_class=\"15\" fileExt=\".h\" fileName=\"property_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"hashDefBlock\" text=\"#ifndef PROPERTY_POLICY_H&amp;#010;#define PROPERTY_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &lt;string>&amp;#010;#include &quot;name_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"using\" writeOutText=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"namespace\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" text=\"Namespace\" />\n       </header>\n       <textblocks>\n        <codeblockwithcomments tag=\"enums\" writeOutText=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n         </header>\n        </codeblockwithcomments>\n        <cppheaderclassdeclarationblock parent_id=\"15\" tag=\"classDeclarationBlock\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" text=\"Class property_policy&amp;#010;\" />\n         </header>\n         <textblocks>\n          <hierarchicalcodeblock tag=\"publicBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Public stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"publicFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"pubMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks>\n                <codeblockwithcomments tag=\"emptyconstructor\" writeOutText=\"false\" indentLevel=\"1\" text=\"property_policy ( ) { }\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Empty Constructor\" />\n                 </header>\n                </codeblockwithcomments>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"pubStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"pubRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks>\n                <codeoperation parent_id=\"191\" tag=\"operation_191\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Init \" />\n                 </header>\n                </codeoperation>\n                <codeoperation parent_id=\"108\" tag=\"operation_108\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n                 </header>\n                </codeoperation>\n               </textblocks>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"protectedBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Protected stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"protectedFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"protMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"protStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"protRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"privateBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Private stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"privateFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"privMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"privStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"privRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n         </textblocks>\n        </cppheaderclassdeclarationblock>\n       </textblocks>\n      </hierarchicalcodeblock>\n      <codeblockwithcomments tag=\"hashDefBlockEnd\" text=\"#endif //PROPERTY_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tproperty_policy.h - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.h&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"cppheader13\" parent_class=\"13\" fileExt=\".h\" fileName=\"name_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"hashDefBlock\" text=\"#ifndef NAME_POLICY_H&amp;#010;#define NAME_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &lt;string>&amp;#010;#include &quot;constraint_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"using\" writeOutText=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"namespace\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" text=\"Namespace\" />\n       </header>\n       <textblocks>\n        <codeblockwithcomments tag=\"enums\" writeOutText=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n         </header>\n        </codeblockwithcomments>\n        <cppheaderclassdeclarationblock parent_id=\"13\" tag=\"classDeclarationBlock\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" text=\"Class name_policy&amp;#010;\" />\n         </header>\n         <textblocks>\n          <hierarchicalcodeblock tag=\"publicBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Public stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"publicFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"pubMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks>\n                <codeblockwithcomments tag=\"emptyconstructor\" writeOutText=\"false\" indentLevel=\"1\" text=\"name_policy ( ) { }\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Empty Constructor\" />\n                 </header>\n                </codeblockwithcomments>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"pubStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"pubRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"protectedBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Protected stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"protectedFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"protMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"protStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"protRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks>\n                <codeoperation parent_id=\"184\" tag=\"operation_184\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Init \" />\n                 </header>\n                </codeoperation>\n               </textblocks>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"privateBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Private stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"privateFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"privMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"privStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"privRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n         </textblocks>\n        </cppheaderclassdeclarationblock>\n       </textblocks>\n      </hierarchicalcodeblock>\n      <codeblockwithcomments tag=\"hashDefBlockEnd\" text=\"#endif //NAME_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tname_policy.h - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.h&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"cppheader14\" parent_class=\"14\" fileExt=\".h\" fileName=\"constraint_policy\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"hashDefBlock\" text=\"#ifndef CONSTRAINT_POLICY_H&amp;#010;#define CONSTRAINT_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &lt;string>&amp;#010;#include &quot;undo_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"using\" writeOutText=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"namespace\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" text=\"Namespace\" />\n       </header>\n       <textblocks>\n        <codeblockwithcomments tag=\"enums\" writeOutText=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n         </header>\n        </codeblockwithcomments>\n        <cppheaderclassdeclarationblock parent_id=\"14\" tag=\"classDeclarationBlock\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" text=\"Class constraint_policy&amp;#010;\" />\n         </header>\n         <textblocks>\n          <hierarchicalcodeblock tag=\"publicBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Public stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"publicFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"pubMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks>\n                <codeblockwithcomments tag=\"emptyconstructor\" writeOutText=\"false\" indentLevel=\"1\" text=\"constraint_policy ( ) { }\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Empty Constructor\" />\n                 </header>\n                </codeblockwithcomments>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"pubStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"pubRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks>\n                <codeoperation parent_id=\"87\" tag=\"operation_87\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Value \" />\n                 </header>\n                </codeoperation>\n               </textblocks>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"protectedBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Protected stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"protectedFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"protMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"protStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"protRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks>\n                <codeoperation parent_id=\"133\" tag=\"operation_133\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Init \" />\n                 </header>\n                </codeoperation>\n               </textblocks>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"privateBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Private stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"privateFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"privMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"privStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"privRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n         </textblocks>\n        </cppheaderclassdeclarationblock>\n       </textblocks>\n      </hierarchicalcodeblock>\n      <codeblockwithcomments tag=\"hashDefBlockEnd\" text=\"#endif //CONSTRAINT_POLICY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tconstraint_policy.h - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.h&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d::data\" id=\"cppheader554\" parent_class=\"554\" fileExt=\".h\" fileName=\"container\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"hashDefBlock\" text=\"#ifndef CONTAINER_H&amp;#010;#define CONTAINER_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &lt;string>&amp;#010;#include &quot;serialization_policy.h&quot;&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"using\" writeOutText=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"namespace\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" text=\"Namespace\" />\n       </header>\n       <textblocks>\n        <codeblockwithcomments tag=\"enums\" writeOutText=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n         </header>\n        </codeblockwithcomments>\n        <cppheaderclassdeclarationblock parent_id=\"554\" tag=\"classDeclarationBlock\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" text=\"Class container&amp;#010;\" />\n         </header>\n         <textblocks>\n          <hierarchicalcodeblock tag=\"publicBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Public stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"publicFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"pubMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks>\n                <codeblockwithcomments tag=\"emptyconstructor\" writeOutText=\"false\" indentLevel=\"1\" text=\"container ( ) { }\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Empty Constructor\" />\n                 </header>\n                </codeblockwithcomments>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"pubStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"pubRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"protectedBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Protected stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"protectedFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"protMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"protStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"protRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks>\n                <codeoperation parent_id=\"561\" tag=\"operation_561\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"&amp;#010;@param Init \" />\n                 </header>\n                </codeoperation>\n               </textblocks>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"privateBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Private stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"privateFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"privMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"privStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"privRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n         </textblocks>\n        </cppheaderclassdeclarationblock>\n       </textblocks>\n      </hierarchicalcodeblock>\n      <codeblockwithcomments tag=\"hashDefBlockEnd\" text=\"#endif //CONTAINER_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tcontainer.h - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.h&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d::data&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d\" id=\"cppheader65\" parent_class=\"65\" fileExt=\".h\" fileName=\"istate_recorder\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"hashDefBlock\" text=\"#ifndef ISTATE_RECORDER_H&amp;#010;#define ISTATE_RECORDER_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &lt;string>&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"using\" writeOutText=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"namespace\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" text=\"Namespace\" />\n       </header>\n       <textblocks>\n        <cppheaderclassdeclarationblock parent_id=\"65\" tag=\"classDeclarationBlock\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" text=\"Interface istate_recorder&amp;#010;\" />\n         </header>\n         <textblocks>\n          <hierarchicalcodeblock tag=\"publicBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Public stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"publicFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"pubMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks>\n                <codeblockwithcomments tag=\"emptyconstructor\" writeOutText=\"false\" indentLevel=\"1\" text=\"istate_recorder ( ) { }\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Empty Constructor\" />\n                 </header>\n                </codeblockwithcomments>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"pubStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"pubRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"protectedBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Protected stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"protectedFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"protMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"protStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"protRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"privateBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Private stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"privateFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"privMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"privStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"privRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n         </textblocks>\n        </cppheaderclassdeclarationblock>\n       </textblocks>\n      </hierarchicalcodeblock>\n      <codeblockwithcomments tag=\"hashDefBlockEnd\" text=\"#endif //ISTATE_RECORDER_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tistate_recorder.h - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.h&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d\" id=\"cppheader296\" parent_class=\"296\" fileExt=\".h\" fileName=\"ipersistent\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"hashDefBlock\" text=\"#ifndef IPERSISTENT_H&amp;#010;#define IPERSISTENT_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &lt;string>&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"using\" writeOutText=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"namespace\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" text=\"Namespace\" />\n       </header>\n       <textblocks>\n        <cppheaderclassdeclarationblock parent_id=\"296\" tag=\"classDeclarationBlock\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" text=\"Interface ipersistent&amp;#010;\" />\n         </header>\n         <textblocks>\n          <hierarchicalcodeblock tag=\"publicBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Public stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"publicFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"pubMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks>\n                <codeblockwithcomments tag=\"emptyconstructor\" writeOutText=\"false\" indentLevel=\"1\" text=\"ipersistent ( ) { }\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Empty Constructor\" />\n                 </header>\n                </codeblockwithcomments>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"pubStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"pubRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"protectedBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Protected stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"protectedFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"protMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"protStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"protRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"privateBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Private stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"privateFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"privMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"privStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"privRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n         </textblocks>\n        </cppheaderclassdeclarationblock>\n       </textblocks>\n      </hierarchicalcodeblock>\n      <codeblockwithcomments tag=\"hashDefBlockEnd\" text=\"#endif //IPERSISTENT_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tipersistent.h - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.h&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n    <classifiercodedocument writeOutCode=\"true\" package=\"k3d\" id=\"cppheader299\" parent_class=\"299\" fileExt=\".h\" fileName=\"iproperty\" >\n     <textblocks>\n      <codeblockwithcomments tag=\"hashDefBlock\" text=\"#ifndef IPROPERTY_H&amp;#010;#define IPROPERTY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"includes\" text=\"#include &lt;string>&amp;#010;\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <codeblockwithcomments tag=\"using\" writeOutText=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n      <hierarchicalcodeblock tag=\"namespace\" canDelete=\"false\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" text=\"Namespace\" />\n       </header>\n       <textblocks>\n        <cppheaderclassdeclarationblock parent_id=\"299\" tag=\"classDeclarationBlock\" canDelete=\"false\" >\n         <header>\n          <cppcodedocumentation tag=\"\" text=\"Interface iproperty&amp;#010;\" />\n         </header>\n         <textblocks>\n          <hierarchicalcodeblock tag=\"publicBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Public stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"publicFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"pubMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks>\n                <codeblockwithcomments tag=\"emptyconstructor\" writeOutText=\"false\" indentLevel=\"1\" text=\"iproperty ( ) { }\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Empty Constructor\" />\n                 </header>\n                </codeblockwithcomments>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"pubStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"pubRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"protectedBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Protected stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"protectedFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"protMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"protStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"protRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n          <hierarchicalcodeblock tag=\"privateBlock\" canDelete=\"false\" >\n           <header>\n            <cppcodedocumentation tag=\"\" text=\"Private stuff\" />\n           </header>\n           <textblocks>\n            <hierarchicalcodeblock tag=\"privateFieldsDecl\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Fields\" />\n             </header>\n             <textblocks/>\n            </hierarchicalcodeblock>\n            <hierarchicalcodeblock tag=\"privMethodsBlock\" canDelete=\"false\" indentLevel=\"1\" >\n             <header>\n              <cppcodedocumentation tag=\"\" indentLevel=\"1\" />\n             </header>\n             <textblocks>\n              <hierarchicalcodeblock tag=\"constructionMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Constructors\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"accessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Accessor Methods\" />\n               </header>\n               <textblocks>\n                <hierarchicalcodeblock tag=\"privStaticAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n                <hierarchicalcodeblock tag=\"privRegularAccessorMethods\" canDelete=\"false\" indentLevel=\"1\" >\n                 <header>\n                  <cppcodedocumentation tag=\"\" writeOutText=\"false\" indentLevel=\"1\" />\n                 </header>\n                 <textblocks/>\n                </hierarchicalcodeblock>\n               </textblocks>\n              </hierarchicalcodeblock>\n              <hierarchicalcodeblock tag=\"operationMethods\" canDelete=\"false\" indentLevel=\"1\" >\n               <header>\n                <cppcodedocumentation tag=\"\" indentLevel=\"1\" text=\"Operations\" />\n               </header>\n               <textblocks/>\n              </hierarchicalcodeblock>\n             </textblocks>\n            </hierarchicalcodeblock>\n           </textblocks>\n          </hierarchicalcodeblock>\n         </textblocks>\n        </cppheaderclassdeclarationblock>\n       </textblocks>\n      </hierarchicalcodeblock>\n      <codeblockwithcomments tag=\"hashDefBlockEnd\" text=\"#endif //IPROPERTY_H\" >\n       <header>\n        <cppcodedocumentation tag=\"\" writeOutText=\"false\" />\n       </header>\n      </codeblockwithcomments>\n     </textblocks>\n     <header>\n      <codecomment tag=\"\" text=\"/************************************************************************&amp;#010;  \t\t\tiproperty.h - Copyright tshead&amp;#010;&amp;#010;Here you can write a license for your code, some comments or any other&amp;#010;information you want to have in your generated code. To to this simply&amp;#010;configure the &quot;headings&quot; directory in uml to point to a directory&amp;#010;where you have your heading files.&amp;#010;&amp;#010;or you can just replace the contents of this file with your own.&amp;#010;If you want to do this, this file is located at&amp;#010;&amp;#010;/usr/kde/3.4/share/apps/umbrello/headings/heading.h&amp;#010;&amp;#010;-->Code Generators searches for heading files based on the file extension&amp;#010;   i.e. it will look for a file name ending in &quot;.h&quot; to include in C++ header&amp;#010;   files, and for a file name ending in &quot;.java&quot; to include in all generated&amp;#010;   java code.&amp;#010;   If you name the file &quot;heading.&lt;extension>&quot;, Code Generator will always&amp;#010;   choose this file even if there are other files with the same extension in the&amp;#010;   directory. If you name the file something else, it must be the only one with that&amp;#010;   extension in the directory to guarantee that Code Generator will choose it.&amp;#010;&amp;#010;you can use variables in your heading files which are replaced at generation&amp;#010;time. possible variables are : author, date, time, filename and filepath.&amp;#010;just write %variable_name%&amp;#010;&amp;#010;This file was generated on Wed Mar 30 2005 at 22:39:12&amp;#010;The original location of this file is k3d&amp;#010;**************************************************************************/&amp;#010;\" />\n     </header>\n     <classfields/>\n    </classifiercodedocument>\n   </codegenerator>\n  </codegeneration>\n </XMI.extensions>\n</XMI>\n"
  },
  {
    "path": "docs/uml/network_rendering.xmi",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<XMI xmlns:UML=\"http://schema.omg.org/spec/UML/1.3\" verified=\"false\" timestamp=\"2007-01-14T10:16:55\" xmi.version=\"1.2\" >\n <XMI.header>\n  <XMI.documentation>\n   <XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter>\n   <XMI.exporterVersion>1.5.5</XMI.exporterVersion>\n   <XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>\n  </XMI.documentation>\n  <XMI.metamodel xmi.name=\"UML\" href=\"UML.xml\" xmi.version=\"1.3\" />\n </XMI.header>\n <XMI.content>\n  <UML:Model isSpecification=\"false\" isLeaf=\"false\" isRoot=\"false\" xmi.id=\"m1\" isAbstract=\"false\" name=\"UML Model\" >\n   <UML:Namespace.ownedElement>\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"m1\" xmi.id=\"2\" isRoot=\"false\" isAbstract=\"false\" name=\"folder\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"3\" isRoot=\"false\" isAbstract=\"false\" name=\"datatype\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"66\" isRoot=\"false\" isAbstract=\"false\" name=\"interface\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"2\" isRoot=\"false\" isAbstract=\"false\" name=\"folder\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"2\" isRoot=\"false\" isAbstract=\"false\" name=\"folder\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"11\" isRoot=\"false\" isAbstract=\"false\" name=\"datatype\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"2\" isRoot=\"false\" isAbstract=\"false\" name=\"folder\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"11\" isRoot=\"false\" isAbstract=\"false\" name=\"datatype\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"2\" isRoot=\"false\" isAbstract=\"false\" name=\"folder\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"2\" isRoot=\"false\" isAbstract=\"false\" name=\"folder\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"11\" isRoot=\"false\" isAbstract=\"false\" name=\"datatype\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"2\" isRoot=\"false\" isAbstract=\"false\" name=\"folder\" />\n    <UML:Stereotype isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"11\" isRoot=\"false\" isAbstract=\"false\" name=\"datatype\" />\n    <UML:Model stereotype=\"2\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"m1\" xmi.id=\"1\" isRoot=\"false\" isAbstract=\"false\" name=\"Logical View\" >\n     <UML:Namespace.ownedElement>\n      <UML:Package stereotype=\"2\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"8\" isRoot=\"false\" isAbstract=\"false\" name=\"Datatypes\" >\n       <UML:Namespace.ownedElement>\n        <UML:DataType stereotype=\"11\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"8\" xmi.id=\"10\" isRoot=\"false\" isAbstract=\"false\" name=\"int\" />\n        <UML:DataType stereotype=\"11\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"8\" xmi.id=\"12\" isRoot=\"false\" isAbstract=\"false\" name=\"char\" />\n        <UML:DataType stereotype=\"11\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"8\" xmi.id=\"13\" isRoot=\"false\" isAbstract=\"false\" name=\"bool\" />\n        <UML:DataType stereotype=\"11\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"8\" xmi.id=\"14\" isRoot=\"false\" isAbstract=\"false\" name=\"float\" />\n        <UML:DataType stereotype=\"11\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"8\" xmi.id=\"15\" isRoot=\"false\" isAbstract=\"false\" name=\"double\" />\n        <UML:DataType stereotype=\"11\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"8\" xmi.id=\"16\" isRoot=\"false\" isAbstract=\"false\" name=\"short\" />\n        <UML:DataType stereotype=\"11\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"8\" xmi.id=\"17\" isRoot=\"false\" isAbstract=\"false\" name=\"long\" />\n        <UML:DataType stereotype=\"11\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"8\" xmi.id=\"18\" isRoot=\"false\" isAbstract=\"false\" name=\"unsigned int\" />\n        <UML:DataType stereotype=\"11\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"8\" xmi.id=\"19\" isRoot=\"false\" isAbstract=\"false\" name=\"unsigned short\" />\n        <UML:DataType stereotype=\"11\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"8\" xmi.id=\"20\" isRoot=\"false\" isAbstract=\"false\" name=\"unsigned long\" />\n        <UML:DataType stereotype=\"11\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"8\" xmi.id=\"21\" isRoot=\"false\" isAbstract=\"false\" name=\"string\" />\n       </UML:Namespace.ownedElement>\n      </UML:Package>\n      <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"43\" isRoot=\"false\" isAbstract=\"false\" name=\"DrQueue Master\" />\n      <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"44\" isRoot=\"false\" isAbstract=\"false\" name=\"DrQueue Slave 1\" />\n      <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"45\" isRoot=\"false\" isAbstract=\"false\" name=\"drqman\" />\n      <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"56\" isRoot=\"false\" isAbstract=\"false\" name=\"K-3D Application\" />\n      <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"57\" isRoot=\"false\" isAbstract=\"false\" name=\"K-3D Master + Slave\" />\n      <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"58\" isRoot=\"false\" isAbstract=\"false\" name=\"K-3D Job Manager\" />\n      <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"71\" isRoot=\"false\" isAbstract=\"false\" name=\"sendjob\" />\n      <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"72\" isRoot=\"false\" isAbstract=\"false\" name=\"DrKeewee\" />\n      <UML:Class isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"79\" isRoot=\"false\" isAbstract=\"false\" name=\"DrQueue Slave N\" />\n      <UML:Generalization isSpecification=\"false\" child=\"12\" visibility=\"public\" namespace=\"1\" xmi.id=\"24\" parent=\"16\" discriminator=\"\" name=\"\" />\n      <UML:Generalization isSpecification=\"false\" child=\"27\" visibility=\"public\" namespace=\"1\" xmi.id=\"37\" parent=\"17\" discriminator=\"\" name=\"\" />\n      <UML:Generalization isSpecification=\"false\" child=\"18\" visibility=\"public\" namespace=\"1\" xmi.id=\"257\" parent=\"12\" discriminator=\"\" name=\"\" />\n      <UML:Generalization isSpecification=\"false\" child=\"14\" visibility=\"public\" namespace=\"1\" xmi.id=\"264\" parent=\"18\" discriminator=\"\" name=\"\" />\n      <UML:Generalization isSpecification=\"false\" child=\"27\" visibility=\"public\" namespace=\"1\" xmi.id=\"271\" parent=\"14\" discriminator=\"\" name=\"\" />\n      <UML:Generalization isSpecification=\"false\" child=\"13\" visibility=\"public\" namespace=\"1\" xmi.id=\"344\" parent=\"14\" discriminator=\"\" name=\"\" />\n      <UML:Generalization isSpecification=\"false\" child=\"15\" visibility=\"public\" namespace=\"1\" xmi.id=\"364\" parent=\"13\" discriminator=\"\" name=\"\" />\n      <UML:Generalization isSpecification=\"false\" child=\"17\" visibility=\"public\" namespace=\"1\" xmi.id=\"384\" parent=\"15\" discriminator=\"\" name=\"\" />\n      <UML:Generalization isSpecification=\"false\" child=\"554\" visibility=\"public\" namespace=\"1\" xmi.id=\"574\" parent=\"17\" discriminator=\"\" name=\"\" />\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"59\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"60\" aggregation=\"none\" type=\"58\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"61\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"62\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"63\" aggregation=\"none\" type=\"58\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"64\" aggregation=\"none\" type=\"57\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"65\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"66\" aggregation=\"none\" type=\"56\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"67\" aggregation=\"none\" type=\"57\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"68\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"69\" aggregation=\"none\" type=\"56\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"70\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"80\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"81\" aggregation=\"none\" type=\"79\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"82\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"46\" name=\"DQ Protocol\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"47\" aggregation=\"none\" type=\"43\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"48\" aggregation=\"none\" type=\"44\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"51\" name=\"DQ Protocol\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"52\" aggregation=\"none\" type=\"45\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"53\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"59\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"60\" aggregation=\"none\" type=\"58\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"61\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"62\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"63\" aggregation=\"none\" type=\"58\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"64\" aggregation=\"none\" type=\"57\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"65\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"66\" aggregation=\"none\" type=\"56\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"67\" aggregation=\"none\" type=\"57\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"68\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"69\" aggregation=\"none\" type=\"56\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"70\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"73\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"74\" aggregation=\"none\" type=\"71\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"75\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"76\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"77\" aggregation=\"none\" type=\"72\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"78\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"80\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"81\" aggregation=\"none\" type=\"79\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"82\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"46\" name=\"DQ Protocol\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"47\" aggregation=\"none\" type=\"43\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"48\" aggregation=\"none\" type=\"44\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"51\" name=\"DQ Protocol\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"52\" aggregation=\"none\" type=\"45\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"53\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"59\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"60\" aggregation=\"none\" type=\"58\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"61\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"62\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"63\" aggregation=\"none\" type=\"58\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"64\" aggregation=\"none\" type=\"57\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"65\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"66\" aggregation=\"none\" type=\"56\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"67\" aggregation=\"none\" type=\"57\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"68\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"69\" aggregation=\"none\" type=\"56\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"70\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"73\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"74\" aggregation=\"none\" type=\"71\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"75\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"76\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"77\" aggregation=\"none\" type=\"72\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"78\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"80\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"81\" aggregation=\"none\" type=\"79\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"82\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"46\" name=\"DQ Protocol\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"47\" aggregation=\"none\" type=\"43\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"48\" aggregation=\"none\" type=\"44\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"51\" name=\"DQ Protocol\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"52\" aggregation=\"none\" type=\"45\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"53\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"59\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"60\" aggregation=\"none\" type=\"58\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"61\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"62\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"63\" aggregation=\"none\" type=\"58\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"64\" aggregation=\"none\" type=\"57\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"65\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"66\" aggregation=\"none\" type=\"56\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"67\" aggregation=\"none\" type=\"57\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"68\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"69\" aggregation=\"none\" type=\"56\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"70\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"73\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"74\" aggregation=\"none\" type=\"71\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"75\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"76\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"77\" aggregation=\"none\" type=\"72\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"78\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"80\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"81\" aggregation=\"none\" type=\"79\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"82\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"100\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"101\" aggregation=\"none\" type=\"45\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"102\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"103\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"104\" aggregation=\"none\" type=\"71\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"105\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"106\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"107\" aggregation=\"none\" type=\"72\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"108\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n      <UML:Association isSpecification=\"false\" visibility=\"public\" namespace=\"1\" xmi.id=\"109\" name=\"\" >\n       <UML:Association.connection>\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"110\" aggregation=\"none\" type=\"44\" name=\"\" />\n        <UML:AssociationEnd isSpecification=\"false\" visibility=\"public\" changeability=\"changeable\" isNavigable=\"true\" xmi.id=\"111\" aggregation=\"none\" type=\"43\" name=\"\" />\n       </UML:Association.connection>\n      </UML:Association>\n     </UML:Namespace.ownedElement>\n     <XMI.extension xmi.extender=\"umbrello\" >\n      <diagrams>\n       <diagram snapgrid=\"0\" showattsig=\"1\" fillcolor=\"#ffffc0\" linewidth=\"0\" zoom=\"100\" showgrid=\"0\" showopsig=\"1\" usefillcolor=\"1\" snapx=\"10\" canvaswidth=\"1016\" snapy=\"10\" showatts=\"0\" xmi.id=\"9\" documentation=\"\" type=\"1\" showops=\"0\" showpackage=\"0\" name=\"Network Rendering Components\" localid=\"900000\" showstereotype=\"0\" showscope=\"1\" snapcsgrid=\"0\" font=\"Sans Serif,10,-1,0,50,0,0,0,0,0\" linecolor=\"#ff0000\" canvasheight=\"884\" >\n        <widgets>\n         <classwidget usesdiagramfillcolour=\"0\" width=\"132\" showattsigs=\"601\" usesdiagramusefillcolour=\"1\" x=\"418\" y=\"168\" showopsigs=\"601\" linewidth=\"none\" fillcolour=\"#c8ffc1\" height=\"46\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"0\" isinstance=\"0\" xmi.id=\"43\" showoperations=\"0\" showpackage=\"0\" showscope=\"1\" font=\"Sans Serif,10,-1,0,75,0,0,0,0,0\" linecolor=\"none\" />\n         <classwidget usesdiagramfillcolour=\"0\" width=\"134\" showattsigs=\"601\" usesdiagramusefillcolour=\"1\" x=\"602\" y=\"137\" showopsigs=\"601\" linewidth=\"none\" fillcolour=\"#c8ffc1\" height=\"46\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"0\" isinstance=\"0\" xmi.id=\"44\" showoperations=\"0\" showpackage=\"0\" showscope=\"1\" font=\"Sans Serif,10,-1,0,75,0,0,0,0,0\" linecolor=\"none\" />\n         <classwidget usesdiagramfillcolour=\"0\" width=\"81\" showattsigs=\"601\" usesdiagramusefillcolour=\"0\" x=\"267\" y=\"111\" showopsigs=\"601\" linewidth=\"none\" fillcolour=\"#c8ffc1\" height=\"46\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"0\" isinstance=\"0\" xmi.id=\"45\" showoperations=\"0\" showpackage=\"0\" showscope=\"1\" font=\"Sans Serif,10,-1,5,75,0,0,0,0,0\" linecolor=\"#ff0000\" />\n         <classwidget usesdiagramfillcolour=\"1\" width=\"135\" showattsigs=\"601\" usesdiagramusefillcolour=\"1\" x=\"496\" y=\"325\" showopsigs=\"601\" linewidth=\"none\" fillcolour=\"none\" height=\"46\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"0\" isinstance=\"0\" xmi.id=\"56\" showoperations=\"0\" showpackage=\"0\" showscope=\"1\" font=\"Sans Serif,10,-1,0,75,0,0,0,0,0\" linecolor=\"none\" />\n         <classwidget usesdiagramfillcolour=\"0\" width=\"163\" showattsigs=\"601\" usesdiagramusefillcolour=\"0\" x=\"403\" y=\"473\" showopsigs=\"601\" linewidth=\"none\" fillcolour=\"#ffffc0\" height=\"46\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"0\" isinstance=\"0\" xmi.id=\"57\" showoperations=\"0\" showpackage=\"0\" showscope=\"1\" font=\"Sans Serif,10,-1,5,75,0,0,0,0,0\" linecolor=\"#ff0000\" />\n         <classwidget usesdiagramfillcolour=\"1\" width=\"145\" showattsigs=\"601\" usesdiagramusefillcolour=\"1\" x=\"338\" y=\"325\" showopsigs=\"601\" linewidth=\"none\" fillcolour=\"none\" height=\"46\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"0\" isinstance=\"0\" xmi.id=\"58\" showoperations=\"0\" showpackage=\"0\" showscope=\"1\" font=\"Sans Serif,10,-1,0,75,0,0,0,0,0\" linecolor=\"none\" />\n         <classwidget usesdiagramfillcolour=\"0\" width=\"71\" showattsigs=\"601\" usesdiagramusefillcolour=\"1\" x=\"272\" y=\"168\" showopsigs=\"601\" linewidth=\"none\" fillcolour=\"#c8ffc1\" height=\"46\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"0\" isinstance=\"0\" xmi.id=\"71\" showoperations=\"0\" showpackage=\"0\" showscope=\"1\" font=\"Sans Serif,10,-1,0,75,0,0,0,0,0\" linecolor=\"none\" />\n         <classwidget usesdiagramfillcolour=\"0\" width=\"87\" showattsigs=\"601\" usesdiagramusefillcolour=\"1\" x=\"264\" y=\"225\" showopsigs=\"601\" linewidth=\"none\" fillcolour=\"#c8ffc1\" height=\"46\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"0\" isinstance=\"0\" xmi.id=\"72\" showoperations=\"0\" showpackage=\"0\" showscope=\"1\" font=\"Sans Serif,10,-1,0,75,0,0,0,0,0\" linecolor=\"none\" />\n         <classwidget usesdiagramfillcolour=\"0\" width=\"136\" showattsigs=\"601\" usesdiagramusefillcolour=\"1\" x=\"602\" y=\"197\" showopsigs=\"601\" linewidth=\"none\" fillcolour=\"#c8ffc1\" height=\"46\" usefillcolor=\"1\" showpubliconly=\"0\" showattributes=\"0\" isinstance=\"0\" xmi.id=\"79\" showoperations=\"0\" showpackage=\"0\" showscope=\"1\" font=\"Sans Serif,10,-1,0,75,0,0,0,0,0\" linecolor=\"none\" />\n         <floatingtext usesdiagramfillcolour=\"1\" width=\"347\" usesdiagramusefillcolour=\"1\" x=\"623\" y=\"255\" linewidth=\"none\" posttext=\"\" role=\"700\" fillcolour=\"none\" height=\"22\" usefillcolor=\"1\" pretext=\"\" isinstance=\"0\" xmi.id=\"85\" showstereotype=\"1\" text=\"Green: Components created by the DrQueue project.\" font=\"Sans Serif,10,-1,0,50,0,0,0,0,0\" linecolor=\"none\" />\n         <floatingtext usesdiagramfillcolour=\"1\" width=\"320\" usesdiagramusefillcolour=\"1\" x=\"624\" y=\"291\" linewidth=\"none\" posttext=\"\" role=\"700\" fillcolour=\"none\" height=\"22\" usefillcolor=\"1\" pretext=\"\" isinstance=\"0\" xmi.id=\"87\" showstereotype=\"1\" text=\"Yellow: Components created by the K-3D project.\" font=\"Sans Serif,10,-1,0,50,0,0,0,0,0\" linecolor=\"none\" />\n         <notewidget usesdiagramfillcolour=\"1\" width=\"267\" usesdiagramusefillcolour=\"1\" x=\"636\" y=\"340\" linewidth=\"none\" fillcolour=\"none\" height=\"106\" usefillcolor=\"1\" isinstance=\"0\" xmi.id=\"112\" text=\"Uses DrQueue protocol to communicate with any DrQueue-compatible master.\n\nAllows K-3D users to submit and control jobs running on a remote DrQueue master, or a local K-3D master+slave combination.\" font=\"Sans Serif,8,-1,0,50,0,0,0,0,0\" linecolor=\"none\" />\n         <notewidget usesdiagramfillcolour=\"1\" width=\"304\" usesdiagramusefillcolour=\"1\" x=\"331\" y=\"529\" linewidth=\"none\" fillcolour=\"none\" height=\"153\" usefillcolor=\"1\" isinstance=\"0\" xmi.id=\"113\" text=\"Implements the DrQueue protocol, acting as a combined master + slave to handle low-latency local rendering / rendering when no DrQueue installation is available.\n\nAlso provides K-3D specific startup/shutdown behavior (started by K-3D application the first time it's needed, shuts-down automatically after the last job is complete).\n\t\" font=\"Sans Serif,8,-1,0,50,0,0,0,0,0\" linecolor=\"none\" />\n         <notewidget usesdiagramfillcolour=\"1\" width=\"261\" usesdiagramusefillcolour=\"1\" x=\"69\" y=\"335\" linewidth=\"none\" fillcolour=\"none\" height=\"104\" usefillcolor=\"1\" isinstance=\"0\" xmi.id=\"114\" showstereotype=\"1\" text=\"Uses DrQueue protocol to communicate with any DrQueue-compatible master.\n\nAllows K-3D users to control their jobs with a standard K-3D look-and-feel user interface, whether K-3D is running or not.\" font=\"Sans Serif,8,-1,0,50,0,0,0,0,0\" linecolor=\"none\" />\n        </widgets>\n        <messages/>\n        <associations>\n         <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"3\" indexb=\"1\" linewidth=\"none\" widgetbid=\"43\" widgetaid=\"58\" xmi.id=\"59\" linecolor=\"none\" >\n          <linepath>\n           <startpoint startx=\"410\" starty=\"325\" />\n           <endpoint endx=\"462\" endy=\"214\" />\n          </linepath>\n         </assocwidget>\n         <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"3\" indexb=\"1\" linewidth=\"none\" widgetbid=\"57\" widgetaid=\"58\" xmi.id=\"62\" linecolor=\"none\" >\n          <linepath>\n           <startpoint startx=\"410\" starty=\"371\" />\n           <endpoint endx=\"457\" endy=\"473\" />\n          </linepath>\n         </assocwidget>\n         <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"3\" indexb=\"2\" linewidth=\"none\" widgetbid=\"57\" widgetaid=\"56\" xmi.id=\"65\" linecolor=\"none\" >\n          <linepath>\n           <startpoint startx=\"563\" starty=\"371\" />\n           <endpoint endx=\"511\" endy=\"473\" />\n          </linepath>\n         </assocwidget>\n         <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"3\" indexb=\"2\" linewidth=\"none\" widgetbid=\"43\" widgetaid=\"56\" xmi.id=\"68\" linecolor=\"none\" >\n          <linepath>\n           <startpoint startx=\"563\" starty=\"325\" />\n           <endpoint endx=\"506\" endy=\"214\" />\n          </linepath>\n         </assocwidget>\n         <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"3\" indexb=\"2\" linewidth=\"none\" widgetbid=\"43\" widgetaid=\"79\" xmi.id=\"80\" linecolor=\"none\" >\n          <linepath>\n           <startpoint startx=\"602\" starty=\"220\" />\n           <endpoint endx=\"550\" endy=\"198\" />\n          </linepath>\n         </assocwidget>\n         <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"4\" indexb=\"1\" linewidth=\"none\" widgetbid=\"43\" widgetaid=\"45\" xmi.id=\"100\" linecolor=\"none\" >\n          <linepath>\n           <startpoint startx=\"348\" starty=\"134\" />\n           <endpoint endx=\"418\" endy=\"179\" />\n          </linepath>\n         </assocwidget>\n         <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"4\" indexb=\"2\" linewidth=\"none\" widgetbid=\"43\" widgetaid=\"71\" xmi.id=\"103\" linecolor=\"none\" >\n          <linepath>\n           <startpoint startx=\"343\" starty=\"191\" />\n           <endpoint endx=\"418\" endy=\"191\" />\n          </linepath>\n         </assocwidget>\n         <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"4\" indexb=\"3\" linewidth=\"none\" widgetbid=\"43\" widgetaid=\"72\" xmi.id=\"106\" linecolor=\"none\" >\n          <linepath>\n           <startpoint startx=\"351\" starty=\"248\" />\n           <endpoint endx=\"418\" endy=\"202\" />\n          </linepath>\n         </assocwidget>\n         <assocwidget totalcounta=\"2\" indexa=\"1\" totalcountb=\"3\" indexb=\"1\" linewidth=\"none\" widgetbid=\"43\" widgetaid=\"44\" xmi.id=\"109\" linecolor=\"none\" >\n          <linepath>\n           <startpoint startx=\"602\" starty=\"160\" />\n           <endpoint endx=\"550\" endy=\"183\" />\n          </linepath>\n         </assocwidget>\n        </associations>\n       </diagram>\n      </diagrams>\n     </XMI.extension>\n    </UML:Model>\n    <UML:Model stereotype=\"2\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"m1\" xmi.id=\"3\" isRoot=\"false\" isAbstract=\"false\" name=\"Use Case View\" >\n     <UML:Namespace.ownedElement/>\n    </UML:Model>\n    <UML:Model stereotype=\"2\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"m1\" xmi.id=\"4\" isRoot=\"false\" isAbstract=\"false\" name=\"Component View\" >\n     <UML:Namespace.ownedElement/>\n    </UML:Model>\n    <UML:Model stereotype=\"2\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"m1\" xmi.id=\"5\" isRoot=\"false\" isAbstract=\"false\" name=\"Deployment View\" >\n     <UML:Namespace.ownedElement/>\n    </UML:Model>\n    <UML:Model stereotype=\"2\" isSpecification=\"false\" isLeaf=\"false\" visibility=\"public\" namespace=\"m1\" xmi.id=\"6\" isRoot=\"false\" isAbstract=\"false\" name=\"Entity Relationship Model\" >\n     <UML:Namespace.ownedElement/>\n    </UML:Model>\n   </UML:Namespace.ownedElement>\n  </UML:Model>\n </XMI.content>\n <XMI.extensions xmi.extender=\"umbrello\" >\n  <docsettings viewid=\"9\" documentation=\"\" uniqueid=\"114\" />\n  <listview>\n   <listitem open=\"1\" type=\"800\" label=\"Views\" >\n    <listitem open=\"1\" type=\"801\" id=\"1\" >\n     <listitem open=\"0\" type=\"807\" id=\"9\" label=\"Network Rendering Components\" />\n     <listitem open=\"1\" type=\"813\" id=\"72\" />\n     <listitem open=\"1\" type=\"813\" id=\"43\" />\n     <listitem open=\"1\" type=\"813\" id=\"44\" />\n     <listitem open=\"1\" type=\"813\" id=\"79\" />\n     <listitem open=\"1\" type=\"813\" id=\"56\" />\n     <listitem open=\"1\" type=\"813\" id=\"58\" />\n     <listitem open=\"1\" type=\"813\" id=\"57\" />\n     <listitem open=\"1\" type=\"813\" id=\"45\" />\n     <listitem open=\"1\" type=\"813\" id=\"71\" />\n     <listitem open=\"0\" type=\"830\" id=\"8\" >\n      <listitem open=\"1\" type=\"829\" id=\"13\" />\n      <listitem open=\"1\" type=\"829\" id=\"12\" />\n      <listitem open=\"1\" type=\"829\" id=\"15\" />\n      <listitem open=\"1\" type=\"829\" id=\"14\" />\n      <listitem open=\"1\" type=\"829\" id=\"10\" />\n      <listitem open=\"1\" type=\"829\" id=\"17\" />\n      <listitem open=\"1\" type=\"829\" id=\"16\" />\n      <listitem open=\"1\" type=\"829\" id=\"21\" />\n      <listitem open=\"1\" type=\"829\" id=\"18\" />\n      <listitem open=\"1\" type=\"829\" id=\"20\" />\n      <listitem open=\"1\" type=\"829\" id=\"19\" />\n     </listitem>\n    </listitem>\n    <listitem open=\"1\" type=\"802\" id=\"3\" />\n    <listitem open=\"1\" type=\"821\" id=\"4\" />\n    <listitem open=\"1\" type=\"827\" id=\"5\" />\n    <listitem open=\"1\" type=\"836\" id=\"6\" />\n   </listitem>\n  </listview>\n  <codegeneration>\n   <codegenerator language=\"C++\" />\n  </codegeneration>\n </XMI.extensions>\n</XMI>\n"
  },
  {
    "path": "docs/uml/subdivision_surface/sds_design.tex",
    "content": "% Class & Packages %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n\\documentclass[11pt]{article} % Options : fleqn\n\n\\usepackage{a4wide}\n\\usepackage[english]{babel}\n\\usepackage[latin1]{inputenc}\n\\usepackage{fancyhdr}\n\\usepackage[]{graphicx} % OPtions : draft\n\\usepackage[]{color}\n\\usepackage{mathptm}\n\\usepackage{subfigure}\n\\usepackage{float}\n\\usepackage{amsmath}\n\\usepackage{palatino}\n\\usepackage{multirow}\n\\pdfadjustspacing=1\n\\bibliographystyle{plain}\n\\usepackage{longtable}\n\\usepackage{hyperref}\n%\\usepackage{algorithmicx}\n%\\usepackage{algorithm}\n%\\usepackage{algpseudocode}\n\n% Style & Lengths %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n\\setlength{\\parindent}{0cm}\n\\setlength{\\headheight}{26pt}\n\\setlength{\\textheight}{21cm}\n\\frenchspacing\n\n% Commands %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n\\renewcommand{\\baselinestretch}{1}\n\n\\renewcommand{\\[}{\\begin{equation}}\n\\renewcommand{\\]}{\\end{equation}}\n\\renewcommand{\\(}{\\begin{displaymath}}\n\\renewcommand{\\)}{\\end{displaymath}}\n\n\\newcommand{\\dx}{\\Delta x}\n\\newcommand{\\dy}{\\Delta y}\n\\newcommand{\\dz}{\\Delta z}\n\\newcommand{\\dt}{\\Delta t}\n\n% Headers Foot %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n\\pagestyle{fancy} \n\\lhead{\\leftmark}\n\\rhead{}\n\\renewcommand{\\headrulewidth}{0.4pt}\n\n% Title %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n\\title{SDS preview design}\n\\author{Bart Janssens}\n\n\n\\begin{document}\n\\maketitle\n\\begin{abstract}\nIntroduction to the design of the SDS preview module, detailing what classes exist and what they do.\n\\end{abstract}\n\nFigure \\ref{classes} shows the class diagram for the SDS cache.\n\n\\begin{figure}[H]\n\t\\centering\n\t\\includegraphics[width=15cm]{classes}\n\t\\caption{The class diagram.}\n\t\\label{classes}\n\\end{figure}\n\n\\section{catmull\\_clark\\_cache}\nThis class provides the interface to the client program for all SDS operations. It can be seen as a mediator class, and has the advantage that it never becomes invalid, so the client only has to create it once. \\texttt{set\\_input} and \\texttt{update} must be called (in this order) to update the cache. The \\texttt{set\\_input} method makes sure the \\texttt{cache\\_input} is valid, the \\texttt{update} method handles the updating of point positions assuming a valid \\texttt{cache\\_input} is present, and creates or updates the \\texttt{highr\\_level\\_cache}. Sequence diagrams for these operations under different circumstances are shown below.\n\n\\begin{figure}[H]\n\t\\centering\n\t\\includegraphics[width=15cm]{set_input_initial}\n\t\\caption{Input set when the cache is used for the first time.}\n\t\\label{input_initial}\n\\end{figure}\n\n\\begin{figure}[H]\n\t\\centering\n\t\\includegraphics[width=15cm]{set_input_invalid}\n\t\\caption{Input set when the cache is invalid.}\n\t\\label{input_invalid}\n\\end{figure}\n\n\\begin{figure}[H]\n\t\\centering\n\t\\includegraphics[width=15cm]{update_invalid}\n\t\\caption{Update in case the cache is invalid. All points are recalculated in this case, and a new \\texttt{higher\\_level\\_cache} is created. THe old cache is deleted if needed, but this is not shown in the diagram.}\n\t\\label{update_invalid}\n\\end{figure}\n\n\\begin{figure}[H]\n\t\\centering\n\t\\includegraphics[width=15cm]{update_valid}\n\t\\caption{In case the cache is valid, \\texttt{update\\_detail} is called.}\n\t\\label{update_valid}\n\\end{figure}\n\n\\begin{figure}[H]\n\t\\centering\n\t\\includegraphics[width=15cm]{update_detail}\n\t\\caption{The \\texttt{update\\_detail} operation updates point positions in the first level cache and in the higher level cache. The parameter controls if all points are updated or if only the modified points (as determined by \\texttt{cache\\_input}) are updated.}\n\t\\label{update_detail}\n\\end{figure}\n\nIn the \\texttt{catmull\\_clark\\_cache} class there are two pure virtual functions: \\texttt{create\\_cache\\_input} and \\texttt{client\\_output} These need to be defined by \"client\" software like k3d. The \\texttt{create\\_cache\\_input} method is a factory method for creating a client-specific \\texttt{cache\\_input} class. The \\texttt{client\\_output} method is used to output the result of the subdivided mesh. Figure \\ref{classes} shows there are three subclasses defined for k3d:\n\\begin{enumerate}\n\\item \\texttt{k3d\\_sds\\_cache\\_base} handles the input side of things. It is independent of what output module is used.\n\\item \\texttt{k3d\\_opengl\\_sds\\_cache} handles output to opengl.\n\\item \\texttt{k3d\\_mesh\\_sds\\_cache} handles output to a k3d::mesh.\n\\end{enumerate}\n\n\\section{cache\\_input}\nThis class forms the glue between the client mesh representation and the data structure used for the SDS calculations. It has the following tasks:\n\\begin{enumerate}\n\\item Apply the first level of SDS, converting the original mesh format to internal SDS format. The first level calculation is different from subsequent levels since the original mesh may contain non-quadrilateral faces.\n\\item Keep track of what was changed on the original mesh. The faces affected by a chenge are placed in the \\texttt{updated\\_faces} parameter for \\texttt{update}.\n\\item Detect if the cache is still valid (notification is done through \\texttt{set\\_input}, which returns true if the cache is valid).\n\\end{enumerate}\n\nIf the \\texttt{cache\\_input} becomes invalid, it must be destroyed and recreated, as is shown in figure \\ref{input_invalid}. The \\texttt{catmull\\_clark\\_cache} makes this process transparent for the client.\\\\\nAs seen in figure \\ref{classes}, only a single subclass is needed for k3d since there is only one mesh format. The face ordering is preserved by \\texttt{k3d\\_cache\\_input}, which makes associating per-face properties of the original mesh with the resulting faces of the subdiveded mesh (accessed through the \\texttt{face\\_vertices} method) possible.\n\n\\section{higher\\_level\\_cache}\nThis class calculates SDS level 2 and up. It can work on the assumption that all faces are quadrilaterals, which makes an efficient representation using \\texttt{boost::multi\\_array} possible. The \\texttt{update} method expects a list of faces that need updating. This list is filled by the \\texttt{update} method from \\texttt{cache\\_input}.\n\n\n\\end{document}"
  },
  {
    "path": "docs/wiki/CMakeLists.txt",
    "content": "PROJECT(wiki)\n\nIF(NOT WIN32)\n\tCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/make-wiki-docs-plugins.py ${CMAKE_CURRENT_BINARY_DIR}/make-wiki-docs-plugins.py)\n\tCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/make-wiki-docs-primitives.py ${CMAKE_CURRENT_BINARY_DIR}/make-wiki-docs-primitives.py)\n\n\tADD_CUSTOM_TARGET(docs-wiki\n\t\tCOMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/wikitext\n\t\tCOMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/wikitext\n\t\tCOMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/wikitext/articles\n\t\tCOMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/wikitext/categories\n\t\tCOMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/wikitext/templates\n\t\tCOMMAND ${k3d_BINARY_DIR}/bin/k3d --log-level=debug --color --script-file=${CMAKE_CURRENT_BINARY_DIR}/make-wiki-docs-plugins.py --ui=nui\n\t\tCOMMAND ${k3d_BINARY_DIR}/bin/k3d --log-level=debug --color --script-file=${CMAKE_CURRENT_BINARY_DIR}/make-wiki-docs-primitives.py --ui=nui\n\t\tWORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}\n\t\t)\nENDIF(NOT WIN32)\n\n"
  },
  {
    "path": "docs/wiki/make-wiki-docs-plugins.py",
    "content": "#python\n\nimport k3d\nimport sys\nimport os\n\ndoc = k3d.new_document()\n\n# Used to sort plugins by-name ...\ndef plugin_sort(lhs, rhs):\n\tif lhs.name() < rhs.name():\n\t\treturn -1\n\telif lhs.name() == rhs.name():\n\t\treturn 0\n\treturn 1\n\n# Generate a mapping of categories to plugins ...\ncategories = { \"All\" : [], \"Stable\" : [], \"Experimental\" : [], \"Deprecated\" : [] }\n\nfor plugin in k3d.plugin.factory.lookup():\n\tif plugin.metadata().has_key(\"k3d:disable-documentation\"):\n\t\tcontinue\n\n\tcategories[\"All\"].append(plugin)\n\n\tif plugin.quality() == \"stable\":\n\t\tcategories[\"Stable\"].append(plugin)\n\telif plugin.quality() == \"experimental\":\n\t\tcategories[\"Experimental\"].append(plugin)\n\telif plugin.quality() == \"deprecated\":\n\t\tcategories[\"Deprecated\"].append(plugin)\n\n\tfor category in plugin.categories():\n\t\tif category not in categories:\n\t\t\tcategories[category] = []\n\t\tcategories[category].append(plugin)\n\n# Create the main article for each plugin ...\nfor plugin in sorted(k3d.plugin.factory.lookup(), plugin_sort):\n\tif plugin.metadata().has_key(\"k3d:disable-documentation\"):\n\t\tcontinue\n\n\tprint \"\"\"Creating main article for \"\"\" + plugin.name() + \"\"\" ...\"\"\"\n\tarticle = file(\"@CMAKE_CURRENT_BINARY_DIR@/wikitext/articles/\" + plugin.name(), \"w\")\n\tarticle.write(\"{{\" + plugin.name() + \"}}\\n\")\n\n# Create an article listing every plugin category ...\nprint \"\"\"Creating plugin categories article ...\"\"\"\narticle = file(\"@CMAKE_CURRENT_BINARY_DIR@/wikitext/categories/Plugin Categories\", \"w\")\narticle.write(\"\"\"<!-- Machine-generated file, do not edit by hand! -->\\n\"\"\")\n\narticle.write(\"\"\"<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\\n\"\"\")\narticle.write(\"\"\"<tr><th>Plugin Categories</th></tr>\\n\"\"\")\n\nfor category in sorted(categories.keys()):\n\tarticle.write(\"\"\"<tr><td>[[\"\"\" + category + \" Plugins]]</td></tr>\\n\"\"\")\n\narticle.write(\"\"\"<table>\\n\"\"\")\n\narticle.write(\"\"\"<!-- Machine-generated file, do not edit by hand! -->\\n\"\"\")\n\n# Create an article for each plugin category ...\nfor category in sorted(categories.keys()):\n\tprint \"\"\"Creating plugin category article \"\"\" + category + \"\"\" ...\"\"\"\n\tarticle = file(\"@CMAKE_CURRENT_BINARY_DIR@/wikitext/categories/\" + category + \" Plugins\", \"w\")\n\tarticle.write(\"<!-- Machine-generated file, do not edit by hand! -->\\n\")\n\n\tarticle.write(\"\"\"<table border=\"0\" cellpadding=\"5\" cellspacing=\"0\">\\n\"\"\")\n\tarticle.write(\"\"\"<tr><td><b>Category:</b></td><td>\"\"\" + category + \"\"\"</td></tr>\\n\"\"\")\n\tarticle.write(\"\"\"<tr><td><b>Plugins:</b></td><td>\"\"\" + str(len(categories[category])) + \"\"\"</td></tr>\\n\"\"\")\n\tarticle.write(\"\"\"</table>\\n\"\"\")\n\n\tarticle.write(\"\"\"<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\\n\"\"\")\n\tarticle.write(\"\"\"<tr><th>Icon</th><th>Plugin</th><th>Description</th></tr>\\n\"\"\")\n\n\tfor plugin in sorted(categories[category], plugin_sort):\n\t\tarticle.write(\"\"\"<tr>\"\"\")\n\n\t\tif os.path.exists(\"@share_SOURCE_DIR@/ngui/rasterized/\" + plugin.name() + \".png\"):\n\t\t\tarticle.write(\"\"\"<td>[[Image:\"\"\" + plugin.name() + \"\"\".png]]</td>\"\"\")\n\t\telse:\n\t\t\tarticle.write(\"\"\"<td>&nbsp;</td>\"\"\")\n\t\n\t\tarticle.write(\"\"\"<td>[[\"\"\" + plugin.name() + \"\"\"]]</td><td>\"\"\" + plugin.short_description() + \"\"\"</td></tr>\\n\"\"\")\n\n\tarticle.write(\"\"\"</table>\\n\"\"\")\n\n\tarticle.write(\"<!-- Machine-generated file, do not edit by hand! -->\\n\")\n\n# Create the reference documentation for each plugin ...\nfor plugin in sorted(k3d.plugin.factory.lookup(), plugin_sort):\n\n\tif plugin.metadata().has_key(\"k3d:disable-documentation\"):\n\t\tcontinue\n\n\tprint \"\"\"Creating reference documentation for \"\"\" + plugin.name() + \"\"\" ...\"\"\"\n\n\tplugin_quality = \"\"\n\tif plugin.quality() == \"stable\":\n\t\tplugin_quality = \"Stable\"\n\telif plugin.quality() == \"experimental\":\n\t\tplugin_quality = \"Experimental\"\n\telif plugin.quality() == \"deprecated\":\n\t\tplugin_quality = \"Deprecated\"\n\n\tarticle = file(\"@CMAKE_CURRENT_BINARY_DIR@/wikitext/templates/\" + plugin.name(), \"w\")\n\tarticle.write(\"<!-- Machine-generated file, do not edit by hand! -->\\n\")\n\n\tarticle.write(\"== Description == \" + \"\\n\")\n\t\n\tarticle.write(\"{| border=\\\"0\\\" cellpadding=\\\"5\\\" cellspacing=\\\"0\\\"\\n\")\n\tarticle.write(\"|-\\n\")\n\n\tif os.path.exists(\"@share_SOURCE_DIR@/ngui/rasterized/\" + plugin.name() + \".png\"):\n\t\tarticle.write(\"|[[Image:\" + plugin.name() + \".png]]\\n\")\n\t\n\tarticle.write(\"|\" + plugin.short_description() + \"\\n\")\n\tarticle.write(\"|}\\n\")\n\t\n\tarticle.write(\"\"\"<table border=\"0\" cellpadding=\"5\" cellspacing=\"0\">\\n\"\"\")\n\tarticle.write(\"\"\"<tr><td><b>Plugin Status:</b></td><td>[[Plugin Status|\"\"\" + plugin_quality + \"\"\"]]</td></tr>\\n\"\"\")\n\n\tarticle.write(\"\"\"<tr><td><b>Categories:</b></td><td>\"\"\")\n\tarticle.write(\"\"\"[[All Plugins]]\"\"\")\n\tarticle.write(\"\"\", [[\"\"\" + plugin_quality + \" Plugins]]\"\"\")\n\tfor category in plugin.categories():\n\t\tarticle.write(\"\"\", [[\"\"\" + category + \" Plugins]]\"\"\")\n\tarticle.write(\"\"\"</td></tr>\\n\"\"\")\n\n\tarticle.write(\"\"\"</table>\\n\"\"\")\n\n\tarticle.write(\"== Metadata == \" + \"\\n\")\n\n\tarticle.write(\"{| border=\\\"1\\\" cellpadding=\\\"5\\\" cellspacing=\\\"0\\\"\\n\")\n\tarticle.write(\"! Name\\n\")\n\tarticle.write(\"! Value\\n\")\n\n\tfor name in plugin.metadata():\n\t\tarticle.write(\"|-\\n\")\n\t\tarticle.write(\"|'''\" + name + \"'''\\n\")\n\t\tarticle.write(\"|\" + plugin.metadata()[name] + \"\\n\")\n\n\tarticle.write(\"|}\\n\")\n\n\tif plugin.is_document_plugin():\n\t\tnode = k3d.plugin.create(plugin, doc)\n\n\t\tif node:\n\t\t\tarticle.write(\"== Properties == \" + \"\\n\")\n\n\t\t\tarticle.write(\"{| border=\\\"1\\\" cellpadding=\\\"5\\\" cellspacing=\\\"0\\\"\\n\")\n\t\t\tarticle.write(\"! Label\\n\")\n\t\t\tarticle.write(\"! Description\\n\")\n\t\t\tarticle.write(\"! Type\\n\")\n\t\t\tarticle.write(\"! Script Name\\n\")\n\n\t\t\tfor property in node.properties():\n\t\t\t\t# Skip the \"name\" property, which is a special-case ...\n\t\t\t\tif property.name() == \"name\":\n\t\t\t\t\tcontinue\n\n\t\t\t\ttype_link = \"[[Property Types#\" + property.type() + \"|\" + property.type() + \"]]\" if len(property.type()) else \"\"\n\n\t\t\t\tarticle.write(\"|-\\n\")\n\t\t\t\tarticle.write(\"|'''\" + property.label() + \"'''\\n\")\n\t\t\t\tarticle.write(\"|\" + property.description() + \"\\n\")\n\t\t\t\tarticle.write(\"|\" + type_link + \"\\n\")\n\t\t\t\tarticle.write(\"|\" + property.name() + \"\\n\")\n\n\t\t\tarticle.write(\"|}\\n\")\n\n\tarticle.write(\"<!-- Machine-generated file, do not edit by hand! -->\\n\")\n\nk3d.close_document(doc)\n\nsys.stdout.flush()\n\n"
  },
  {
    "path": "docs/wiki/make-wiki-docs-primitives.py",
    "content": "#python\n\nimport k3d\nimport sys\nimport os\n\nprimitive_types = [k3d.bezier_triangle_patch, k3d.bicubic_patch, k3d.bilinear_patch, k3d.blobby, k3d.cone, k3d.cubic_curve, k3d.cylinder, k3d.disk, k3d.hyperboloid, k3d.linear_curve, k3d.nurbs_curve, k3d.nurbs_patch, k3d.paraboloid, k3d.particle, k3d.polyhedron, k3d.sphere, k3d.teapot, k3d.torus]\nprimitive_names = [\"Bezier Triangle Patch\", \"Bicubic Patch\", \"Bilinear Patch\", \"Blobby\", \"Cone\", \"Cubic Curve\", \"Cylinder\", \"Disk\", \"Hyperboloid\", \"Linear Curve\", \"NURBS Curve\", \"NURBS Patch\", \"Paraboloid\", \"Particle\", \"Polyhedron\", \"Sphere\", \"Teapot\", \"Torus\"]\n\n# Create a table listing primitive components ...\nprint \"\"\"Creating primitive components table ...\"\"\"\narticle = file(\"@CMAKE_CURRENT_BINARY_DIR@/wikitext/templates/Primitive Components Table\", \"w\")\narticle.write(\"\"\"<!-- Machine-generated file, do not edit by hand! -->\\n\"\"\")\narticle.write(\"\"\"<table frame=\"box\" rules=\"all\" cellpadding=\"5\">\\n\"\"\")\narticle.write(\"\"\"<tr><th>Primitive Type</th><th>Structure</th><th>Attributes</th></tr>\\n\"\"\")\n\nfor i in range(len(primitive_types)):\n\tprimitive_type = primitive_types[i]\n\tprimitive_name = primitive_names[i]\n\n\tdocument = k3d.new_document()\n\tsource = k3d.plugin.create(\"FrozenMesh\", document)\n\tmesh = source.create_mesh()\n\tprimitive_type.create(mesh)\n\tprimitive = mesh.primitives()[0]\n\n\tarticle.write(\"\"\"<tr>\"\"\")\n\tarticle.write(\"\"\"<td>[[\"\"\" + primitive_name + \"\"\" Primitive]]</td>\"\"\")\n\tarticle.write(\"\"\"<td>\"\"\" + \", \".join(primitive.structure().keys()) + \"\"\"</td>\"\"\")\n\tarticle.write(\"\"\"<td>\"\"\" + \", \".join(primitive.attributes().keys()) + \"\"\"</td>\"\"\")\n\tarticle.write(\"\"\"</tr>\\n\"\"\")\n\n\tk3d.close_document(document)\n\narticle.write(\"\"\"</table>\\n\"\"\")\narticle.write(\"\"\"<!-- Machine-generated file, do not edit by hand! -->\\n\"\"\")\n\n# Create the main article for each primitive type ...\nfor primitive_name in primitive_names:\n\tprint \"\"\"Creating main article for \"\"\" + primitive_name + \"\"\" Primitive ...\"\"\"\n\tarticle = file(\"@CMAKE_CURRENT_BINARY_DIR@/wikitext/articles/\" + primitive_name + \" Primitive\", \"w\")\n\tarticle.write(\"\"\"{{\"\"\" + primitive_name + \"\"\" Primitive}}\\n\"\"\")\n\n# Create the reference material for each primitive type ...\nfor i in range(len(primitive_types)):\n\tprimitive_type = primitive_types[i]\n\tprimitive_name = primitive_names[i]\n\n\tprint \"\"\"Creating reference documentation for \"\"\" + primitive_name + \"\"\" Primitive ...\"\"\"\n\tarticle = file(\"@CMAKE_CURRENT_BINARY_DIR@/wikitext/templates/\" + primitive_name + \" Primitive\", \"w\")\n\tarticle.write(\"\"\"<!-- Machine-generated file, do not edit by hand! -->\\n\"\"\")\n\n\tarticle.write(\"\"\"== Data Structure ==\\n\"\"\")\n\tarticle.write(\"<graphviz>\\n\")\n\n\tdocument = k3d.new_document()\n\tsource = k3d.plugin.create(\"FrozenMesh\", document)\n\tmesh = source.create_mesh()\n\tprimitive_type.create(mesh)\n\n\tneed_points = False\n\tprimitive = mesh.primitives()[0]\n\tfor table_name in primitive.structure().keys():\n\t\ttable = primitive.structure()[table_name]\n\t\tfor array_name in table.keys():\n\t\t\tarray = table[array_name]\n\t\t\tif array.get_metadata_value(\"k3d:domain\") == \"k3d:point-indices\":\n\t\t\t\tneed_points = True\n\n\tif need_points:\n\t\tmesh.create_points()\n\t\tmesh.create_point_selection()\n\n\twriter = k3d.plugin.create(\"GraphVizMeshWriter\", document)\n\tk3d.property.connect(document, source.get_property(\"output_mesh\"), writer.get_property(\"input_mesh\"))\n\tarticle.write(writer.output_string)\n\n\tk3d.close_document(document)\n\n\tarticle.write(\"</graphviz>\\n\")\n\tarticle.write(\"\"\"<!-- Machine-generated file, do not edit by hand! -->\\n\"\"\")\n\n"
  },
  {
    "path": "docs/xml/document_schema.xsd",
    "content": "<?xml version=\"1.0\"?>\n<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n\n\t<!-- Defines a name-value pair that is used to store object state, particularly object property values -->\n\t<xs:complexType name=\"property\">\n\t\t<xs:attribute name=\"name\" type=\"xs:string\"/>\n\t\t<!-- Storing values as attributes is deprecated, new code should store values as element text -->\n\t\t<xs:attribute name=\"value\" type=\"xs:string\" minOccurs=\"0\" maxOccurs=\"1\"/>\n\t\t<xs:simpleContent type=\"xs:string\"/>\n\t</xs:complexType>\n\n\t<!-- Defines a collection of zero-to-many properties, uniquely-identified by their name -->\n\t<xs:complexType name=\"properties\">\n\t\t<xs:sequence>\n\t\t\t<xs:element name=\"property\" type=\"property\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n\t\t</xs:sequence>\n\t\t<xs:key name=\"property\">\n\t\t\t<xs:selector xpath=\"property\"/>\n\t\t\t<xs:field xpath=\"@name\"/>\n\t\t</xs:key>\n\t</xs:complexType>\n\n\t<!-- Defines storage for a single plugin -->\n\t<xs:complexType name=\"plugin\">\n\t\t<xs:attribute name=\"class\" type=\"xs:string\"/>\n\t</xs:complexType>\n\n\t<!-- Defines storage for a collection of zero-to-many plugins, uniquely identified by their class -->\n\t<xs:complexType name=\"plugins\">\n\t\t<xs:sequence>\n\t\t\t<xs:element name=\"plugin\" type=\"plugin\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n\t\t</xs:sequence>\n\t\t<xs:key name=\"plugin\">\n\t\t\t<xs:selector xpath=\"object\"/>\n\t\t\t<xs:field xpath=\"@class\"/>\n\t\t</xs:key>\n\t</xs:complexType>\n\n\t<!-- Defines storage for a single document plugin instance -->\n\t<xs:complexType name=\"node\">\n\t\t<xs:sequence>\n\t\t\t<xs:element name=\"properties\" type=\"properties\" minOccurs=\"0\" maxOccurs=\"1\"/>\t\n\t\t</xs:sequence>\n\t\t<xs:attribute name=\"name\" type=\"xs:string\"/>\n\t\t<xs:attribute name=\"class\" type=\"xs:string\"/>\n\t\t<xs:attribute name=\"id\" type=\"xs:string\"/>\n\t</xs:complexType>\n\n\t<!-- Defines storage for a collection of zero-to-many document plugin instances, uniquely identified by their id -->\n\t<xs:complexType name=\"nodes\">\n\t\t<xs:sequence>\n\t\t\t<xs:element name=\"node\" type=\"node\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n\t\t</xs:sequence>\n\t\t<xs:key name=\"node\">\n\t\t\t<xs:selector xpath=\"node\"/>\n\t\t\t<xs:field xpath=\"@id\"/>\n\t\t</xs:key>\n\t</xs:complexType>\n\n\t<!-- Defines storage for a dependency between two document node properties -->\n\t<xs:complexType name=\"dependency\">\n\t\t<xs:attribute name=\"from_node\" type=\"xs:string\"/>\n\t\t<xs:attribute name=\"from_property\" type=\"xs:string\"/>\n\t\t<xs:attribute name=\"to_node\" type=\"xs:string\"/>\n\t\t<xs:attribute name=\"to_property\" type=\"xs:string\"/>\n\t</xs:complexType>\n\n\t<!-- Defines storage for a collection of property dependencies -->\n\t<xs:complexType name=\"dependencies\">\n\t\t<xs:sequence>\n\t\t\t<xs:element name=\"dependency\" type=\"dependency\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n\t\t</xs:sequence>\n\t\t<xs:key name=\"dependency\">\n\t\t\t<xs:selector xpath=\"dependency\"/>\n\t\t\t<xs:field xpath=\"@to_node\"/>\n\t\t\t<xs:field xpath=\"@to_property\"/>\n\t\t</xs:key>\n\t</xs:complexType>\n\n\t<!-- Defines storage for application-wide data (e.g. user options -->\n\t<xs:complexType name=\"application\">\n\t\t<xs:sequence>\n\t\t\t<xs:element name=\"plugins\" type=\"plugins\" minOccurs=\"0\" maxOccurs=\"1\"/>\n\t\t</xs:sequence>\n\t</xs:complexType>\n\n\t<!-- Defines storage for a single document -->\n\t<xs:complexType name=\"document\">\n\t\t<xs:sequence>\n\t\t\t<xs:element name=\"nodes\" type=\"nodes\" minOccurs=\"0\" maxOccurs=\"1\"/>\n\t\t\t<xs:element name=\"dependencies\" type=\"dependencies\" minOccurs=\"0\" maxOccurs=\"1\"/>\n\t\t</xs:sequence>\n\t</xs:complexType>\n\n\t<!-- Defines the top-level structure for the K-3D document -->\n\t<xs:element name=\"k3dml\">\n\t\t<xs:complexType>\n\t\t\t<xs:sequence>\n\t\t\t\t<xs:element name=\"application\" type=\"application\" minOccurs=\"0\" maxOccurs=\"1\"/>\n\t\t\t\t<xs:element name=\"document\" type=\"document\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n\t\t\t</xs:sequence>\n\t\t\t<xs:attribute name=\"package\" type=\"xs:string\"/> <!-- Stores the name of the application that wrote the file -->\n\t\t\t<xs:attribute name=\"version\" type=\"xs:string\"/> <!-- Stores the version of the application that wrote the file -->\n\t\t\t<xs:attribute name=\"host\" type=\"xs:string\"/> <!-- Stores the platform of the application that wrote the file -->\n\t\t</xs:complexType>\n\t</xs:element>\n</xs:schema>\n\n"
  },
  {
    "path": "docs/xml/slmeta_schema.xsd",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<!--W3C Schema generated by Daniel S. Matthews dan@3-e.net-->\n<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\">\n\t<xs:element name=\"argument\">\n\t\t<xs:complexType>\n\t\t\t<xs:attribute name=\"name\" use=\"required\">\n\t\t\t\t<xs:simpleType>\n\t\t\t\t\t<xs:restriction base=\"xs:string\"/>\n\t\t\t\t</xs:simpleType>\n\t\t\t</xs:attribute>\n\t\t\t<xs:attribute name=\"label\" use=\"required\">\n\t\t\t\t<xs:simpleType>\n\t\t\t\t\t<xs:restriction base=\"xs:string\"/>\n\t\t\t\t</xs:simpleType>\n\t\t\t</xs:attribute>\n\t\t\t<xs:attribute name=\"description\" use=\"required\">\n\t\t\t\t<xs:simpleType>\n\t\t\t\t\t<xs:restriction base=\"xs:string\"/>\n\t\t\t\t</xs:simpleType>\n\t\t\t</xs:attribute>\n\t\t\t<xs:attribute name=\"storage_class\" use=\"required\">\n\t\t\t\t<xs:simpleType>\n\t\t\t\t\t<xs:restriction base=\"xs:string\">\n\t\t\t\t\t\t<xs:enumeration value=\"uniform\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"varying\"/>\n\t\t\t\t\t</xs:restriction>\n\t\t\t\t</xs:simpleType>\n\t\t\t</xs:attribute>\n\t\t\t<xs:attribute name=\"type\" use=\"required\">\n\t\t\t\t<xs:simpleType>\n\t\t\t\t\t<xs:restriction base=\"xs:string\">\n\t\t\t\t\t\t<xs:enumeration value=\"color\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"float\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"point\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"vector\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"normal\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"matrix\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"string\"/>\n\t\t\t\t\t</xs:restriction>\n\t\t\t\t</xs:simpleType>\n\t\t\t</xs:attribute>\n\t\t\t<xs:attribute name=\"extended_type\" use=\"required\">\n\t\t\t\t<xs:simpleType>\n\t\t\t\t\t<xs:restriction base=\"xs:string\">\n\t\t\t\t\t\t<xs:enumeration value=\"color\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"float\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"time\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"angle\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"distance\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"area\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"volume\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"mass\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"force\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"pressure\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"point\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"vector\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"normal\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"matrix\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"string\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"texture\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"space\"/>\n\t\t\t\t\t</xs:restriction>\n\t\t\t\t</xs:simpleType>\n\t\t\t</xs:attribute>\n\t\t\t<xs:attribute name=\"array_count\" use=\"required\">\n\t\t\t\t<xs:simpleType>\n\t\t\t\t\t<xs:restriction base=\"xs:string\"/>\n\t\t\t\t</xs:simpleType>\n\t\t\t</xs:attribute>\n\t\t\t<xs:attribute name=\"space\" type=\"xs:string\" use=\"required\"/>\n\t\t\t<xs:attribute name=\"output\" use=\"required\">\n\t\t\t\t<xs:simpleType>\n\t\t\t\t\t<xs:restriction base=\"xs:boolean\"/>\n\t\t\t\t</xs:simpleType>\n\t\t\t</xs:attribute>\n\t\t\t<xs:attribute name=\"default_value\" use=\"required\">\n\t\t\t\t<xs:simpleType>\n\t\t\t\t\t<xs:restriction base=\"xs:string\"/>\n\t\t\t\t</xs:simpleType>\n\t\t\t</xs:attribute>\n\t\t</xs:complexType>\n\t</xs:element>\n\t<xs:element name=\"authors\">\n\t\t<xs:simpleType>\n\t\t\t<xs:restriction base=\"xs:string\"/>\n\t\t</xs:simpleType>\n\t</xs:element>\n\t<xs:element name=\"copyright\">\n\t\t<xs:simpleType>\n\t\t\t<xs:restriction base=\"xs:string\"/>\n\t\t</xs:simpleType>\n\t</xs:element>\n\t<xs:element name=\"description\">\n\t\t<xs:simpleType>\n\t\t\t<xs:restriction base=\"xs:string\"/>\n\t\t</xs:simpleType>\n\t</xs:element>\n\t<xs:element name=\"k3dml\">\n\t\t<xs:complexType>\n\t\t\t<xs:sequence>\n\t\t\t\t<xs:element ref=\"shaders\"/>\n\t\t\t</xs:sequence>\n\t\t</xs:complexType>\n\t</xs:element>\n\t<xs:element name=\"shader\">\n\t\t<xs:complexType>\n\t\t\t<xs:sequence>\n\t\t\t\t<xs:element ref=\"description\"/>\n\t\t\t\t<xs:element ref=\"authors\"/>\n\t\t\t\t<xs:element ref=\"copyright\"/>\n\t\t\t\t<xs:element ref=\"argument\" maxOccurs=\"unbounded\"/>\n\t\t\t</xs:sequence>\n\t\t\t<xs:attribute name=\"type\" use=\"required\">\n\t\t\t\t<xs:simpleType>\n\t\t\t\t\t<xs:restriction base=\"xs:string\">\n\t\t\t\t\t\t<xs:enumeration value=\"surface\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"light\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"volume\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"imager\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"displacement\"/>\n\t\t\t\t\t\t<xs:enumeration value=\"transformation\"/>\n\t\t\t\t\t</xs:restriction>\n\t\t\t\t</xs:simpleType>\n\t\t\t</xs:attribute>\n\t\t\t<xs:attribute name=\"name\" use=\"required\">\n\t\t\t\t<xs:simpleType>\n\t\t\t\t\t<xs:restriction base=\"xs:string\"/>\n\t\t\t\t</xs:simpleType>\n\t\t\t</xs:attribute>\n\t\t</xs:complexType>\n\t</xs:element>\n\t<xs:element name=\"shaders\">\n\t\t<xs:complexType>\n\t\t\t<xs:sequence>\n\t\t\t\t<xs:element ref=\"shader\"/>\n\t\t\t</xs:sequence>\n\t\t</xs:complexType>\n\t</xs:element>\n</xs:schema>\n"
  },
  {
    "path": "gendef/CMakeLists.txt",
    "content": "PROJECT(gendef)\nADD_EXECUTABLE(k3d-gendef gendef.cc)\n\n"
  },
  {
    "path": "gendef/gendef.cc",
    "content": "/*\n *  MICO --- an Open Source CORBA implementation\n *  Copyright (c) 2003 Harald Bhme\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n *\n *  For more information, visit the MICO Home Page at\n *  http://www.mico.org/\n */\n\n/* Modified by Cedric Gustin <cedric.gustin@gmail.com> on 2006/01/13 :\n * Redirect the output of dumpbin to dumpbin.out instead of reading the\n * output stream of popen, as it fails with Visual Studio 2005 in \n * pre-link build events.\n */\n\n#include <iostream>\n#include <fstream>\n#include <stdio.h>\n\nusing namespace std;\n\nint main(int argc,char** argv)\n{\n  if (argc < 4) {\n\t  cerr << \"Usage: \" << argv[0] << \" <def-file-name> <dll-base-name> <obj-file> ....\" << endl;\n\t  return 2;\n  }\n\n  // CG : Explicitly redirect stdout to dumpbin.out.\n  string dumpbin = \"dumpbin /SYMBOLS /OUT:dumpbin.out\";\n  int i = 3;\n\n  for(;i<argc;) {\n\t  dumpbin += \" \";\n\t  dumpbin += argv[i++];\n  }\n\n  FILE * dump; \n  \n  if( (dump = _popen(dumpbin.c_str(),\"r\")) == NULL ) {\n\t  cerr << \"could not popen dumpbin\" << endl;\n\t  return 3;\n  }\n\n  // CG : Wait for the dumpbin process to finish and open dumpbin.out.\n  _pclose(dump);\n  dump=fopen(\"dumpbin.out\",\"r\");\n\n  ofstream def_file(argv[1]);\n\n  def_file << \"LIBRARY \" << argv[2] << endl;\n  def_file << \"EXPORTS\" << endl;\n\n  i=0;\n  while( !feof(dump)) {\n\t  char buf [65000]; \n\t  \n\t  if( fgets( buf, 64999, dump ) != NULL ) {\n\t\t  if(!strstr(buf,\" UNDEF \") && strstr(buf,\" External \")) {\n\t\t\t  char *s = strchr(buf,'|') + 1;\n\t\t\t  while(*s == ' ' || *s == '\\t') s++;\n\t\t\t  char *e=s;\n\t\t\t  while(*e != ' ' && *e != '\\t' && *e != '\\0' && *e!= '\\n') e++;\n\t\t\t  *e = '\\0';\n\t\t\t\n\t\t\tif(strchr(s,'?')==0 && s[0]=='_' && strchr(s,'@') == 0 )//this is a C export type: _fct -> fct\n\t\t\t\t  def_file << \"    \" << (s+1) << endl;\t\t\t\n\t\t\telse\n\t\t\tif(strchr(s,'?')!=0 && strncmp(s,\"??_G\",4)!=0 && strncmp(s,\"??_E\",4)!=0) {\n\t\t\t\t  def_file << \"    \" << s << endl;\n\t\t\t  }\n\t\t  }\n\t  }\n  }\n\n  // CG : Close dumpbin.out and delete it.\n  fclose(dump);\n  remove(\"dumpbin.out\");\n\n  cout << dumpbin.c_str() << endl;\n}\n"
  },
  {
    "path": "k3dsdk/CMakeLists.txt",
    "content": "PROJECT(k3dsdk)\n\nFILE(GLOB HEADERS *.h)\nFILE(GLOB SOURCES *.cpp)\n\nLIST(SORT HEADERS)\nLIST(SORT SOURCES)\n\nIF(WIN32 AND K3D_COMPILER_GCC)\n\t# For some reason, serialization_xml.cpp takes *forever* to build with optimizations enabled\n\tSET_SOURCE_FILES_PROPERTIES(serialization_xml.cpp PROPERTIES COMPILE_FLAGS -O0)\nENDIF(WIN32 AND K3D_COMPILER_GCC)\n\nCONFIGURE_FILE(${k3dsdk_SOURCE_DIR}/k3d-i18n-config.h.in ${k3dsdk_BINARY_DIR}/k3d-i18n-config.h)\nCONFIGURE_FILE(${k3dsdk_SOURCE_DIR}/k3d-ngui-config.h.in ${k3dsdk_BINARY_DIR}/k3d-ngui-config.h)\nCONFIGURE_FILE(${k3dsdk_SOURCE_DIR}/k3d-parallel-config.h.in ${k3dsdk_BINARY_DIR}/k3d-parallel-config.h)\nCONFIGURE_FILE(${k3dsdk_SOURCE_DIR}/k3d-platform-config.h.in ${k3dsdk_BINARY_DIR}/k3d-platform-config.h)\nCONFIGURE_FILE(${k3dsdk_SOURCE_DIR}/k3d-version-config.h.in ${k3dsdk_BINARY_DIR}/k3d-version-config.h)\n\nINCLUDE_DIRECTORIES(\n\t${k3d_SOURCE_DIR}\n\t${k3dsdk_BINARY_DIR}\n\t${Boost_INCLUDE_DIRS}\n\t${k3dsdk_SOURCE_DIR}/gil\n\t${K3D_GLIBMM_INCLUDE_DIRS}\n\t${K3D_SIGC_INCLUDE_DIRS}\n\t${K3D_OPENGL_INCLUDE_DIR}\n\t)\n\nIF(K3D_ENABLE_PARALLEL)\n\tINCLUDE_DIRECTORIES(${K3D_TBB_INCLUDE_DIR})\nENDIF(K3D_ENABLE_PARALLEL)\n\nIF(K3D_ENABLE_PROFILING)\n    INCLUDE_DIRECTORIES(${K3D_GPERFTOOLS_INCLUDE_DIR})\nENDIF(K3D_ENABLE_PROFILING)\n\nINCLUDE_DIRECTORIES(${K3D_XML_INCLUDE_DIR})\nINCLUDE_DIRECTORIES(${K3D_ZLIB_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${K3D_GLIBMM_LIB_DIRS})\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\nLINK_DIRECTORIES(${K3D_ZLIB_LIB_DIRS})\n\nK3D_ADD_LIBRARY(k3dsdk SHARED ${HEADERS} ${SOURCES})\nK3D_GENERATE_DEF_FILE(k3dsdk)\n\nTARGET_LINK_LIBRARIES(k3dsdk\n\t${K3D_GLIBMM_LIBS}\n\t${K3D_SIGC_LIBS}\n\t${K3D_XML_LIB}\n\t${K3D_ZLIB_LIBS}\n\t${K3D_OPENGL_LIBRARIES}\n\tk3dsdk-half\n\tk3dsdk-sgi-tesselator\n\tk3dsdk-parallel\n\t${Boost_PROGRAM_OPTIONS_LIBRARY}\n\t${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}\n\t${Boost_SYSTEM_LIBRARY}\n\t${CMAKE_DL_LIBS} # for gold linker\n\t)\n\nIF(K3D_ENABLE_NLS)\n\tINCLUDE_DIRECTORIES(${K3D_INTL_INCLUDE_DIRS})\n\tTARGET_LINK_LIBRARIES(k3dsdk ${K3D_INTL_LIBS})\nENDIF(K3D_ENABLE_NLS)\n\nIF(K3D_ENABLE_PROFILING)\n    TARGET_LINK_LIBRARIES(k3dsdk ${K3D_PROFILER_LIBRARY})\nENDIF(K3D_ENABLE_PROFILING)\n\nIF(WIN32)\n\tTARGET_LINK_LIBRARIES(k3dsdk ole32)\n\tTARGET_LINK_LIBRARIES(k3dsdk ws2_32)\nENDIF(WIN32)\n\nADD_SUBDIRECTORY(Half)\nADD_SUBDIRECTORY(expression)\nADD_SUBDIRECTORY(gl)\n\nADD_SUBDIRECTORY(parallel)\nADD_SUBDIRECTORY(resource)\nADD_SUBDIRECTORY(sgi_tesselator)\nADD_SUBDIRECTORY(subdivision_surface)\n\nK3D_ADD_SUBDIRECTORY(ngui REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_ADD_SUBDIRECTORY(python REQUIRES K3D_ENABLE_PYTHON)\n\nINSTALL(TARGETS k3dsdk\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\nINSTALL(FILES ${HEADERS} DESTINATION include/k3d/k3dsdk)\n\nINSTALL(FILES ${k3dsdk_BINARY_DIR}/k3d-i18n-config.h DESTINATION ${K3D_LIBDIR}/k3d/include)\nINSTALL(FILES ${k3dsdk_BINARY_DIR}/k3d-ngui-config.h DESTINATION ${K3D_LIBDIR}/k3d/include)\nINSTALL(FILES ${k3dsdk_BINARY_DIR}/k3d-parallel-config.h DESTINATION ${K3D_LIBDIR}/k3d/include)\nINSTALL(FILES ${k3dsdk_BINARY_DIR}/k3d-platform-config.h DESTINATION ${K3D_LIBDIR}/k3d/include)\nINSTALL(FILES ${k3dsdk_BINARY_DIR}/k3d-version-config.h DESTINATION ${K3D_LIBDIR}/k3d/include)\n"
  },
  {
    "path": "k3dsdk/Half/AUTHORS",
    "content": "Developers:\n-----------\n\nFlorian Kainz <kainz@ilm.com>\nRod Bogart <rgb@ilm.com>\nDrew Hess <dhess@ilm.com>\nPaul Schneider <pauls@ilm.com>\nBill Anderson <wja@ilm.com>\n\nContributors:\n-------------\n\nSimon Green <SGreen@nvidia.com>\nRito Trevino <etrevino@ilm.com>\nJosh Pines\nChristian Rouet\nRodrigo Damazio <rdamazio@lsi.usp.br>\nWojciech Jarosz\nGreg Ward <gward@lmi.net>\nJoseph Goldstone <joseph@lp.com>\n\nWin32 port contributors:\n------------------------\n\nDustin Graves <dgraves@computer.org>\nJukka Liimatta <jukka.liimatta@twilight3d.com>\nBaumann Konstantin <Konstantin.Baumann@hpi.uni-potsdam.de>\nDaniel Koch <daniel@eyeonline.com>\nLuc-Eric Rousseau <lucer@softimage.com>\nE. Scott Larsen <larsene@cs.unc.edu>\nstephan mantler <step@acm.org>\nAndreas Kahler <AKahler@nxn-software.com>\nFrank Jargstorff <fjargstorff@nvidia.com>\nLutz Latta\n"
  },
  {
    "path": "k3dsdk/Half/CMakeLists.txt",
    "content": "PROJECT(k3dsdk-half)\n\nADD_EXECUTABLE(eLut eLut.cpp)\nGET_TARGET_PROPERTY(eLut_EXE eLut LOCATION)\n\nADD_EXECUTABLE(toFloat toFloat.cpp)\nGET_TARGET_PROPERTY(toFloat_EXE toFloat LOCATION)\n\nADD_CUSTOM_COMMAND(\n\tOUTPUT ${CMAKE_CURRENT_BINARY_DIR}/eLut.h\n\tDEPENDS eLut\n\tCOMMAND ${eLut_EXE} > ${CMAKE_CURRENT_BINARY_DIR}/eLut.h\n\t)\n\nADD_CUSTOM_COMMAND(\n\tOUTPUT ${CMAKE_CURRENT_BINARY_DIR}/toFloat.h\n\tDEPENDS toFloat\n\tCOMMAND ${toFloat_EXE} > ${CMAKE_CURRENT_BINARY_DIR}/toFloat.h\n\t)\n\nSET(SOURCES\n\t${CMAKE_CURRENT_BINARY_DIR}/eLut.h\n\t${CMAKE_CURRENT_BINARY_DIR}/toFloat.h\n\thalf.cpp\n\thalf.h\n\thalfFunction.h\n\thalfLimits.h\n\t)\n\nINCLUDE_DIRECTORIES(${k3dsdk-half_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk-half_BINARY_DIR})\n\nK3D_ADD_LIBRARY(k3dsdk-half SHARED ${SOURCES})\nK3D_GENERATE_DEF_FILE(k3dsdk-half)\n\nINSTALL(TARGETS k3dsdk-half\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR}\n\t)\n\n"
  },
  {
    "path": "k3dsdk/Half/COPYING",
    "content": "Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\nDigital Ltd. LLC\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n*       Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n*       Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n*       Neither the name of Industrial Light & Magic nor the names of\nits contributors may be used to endorse or promote products derived\nfrom this software without specific prior written permission. \n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "k3dsdk/Half/LICENSE",
    "content": "Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\nDigital Ltd. LLC\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n*       Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n*       Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n*       Neither the name of Industrial Light & Magic nor the names of\nits contributors may be used to endorse or promote products derived\nfrom this software without specific prior written permission. \n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "k3dsdk/Half/README",
    "content": "ABOUT THE OPENEXR LIBRARIES\n----------------------------\n\nHalf is a class that encapsulates our 16-bit floating-point format.\n\nIlmImf is our \"EXR\" file format for storing 16-bit FP images.\n\nImath is a math library.  IlmImf only uses a subset of it,\nbut we're releasing the full library because it's easier for us to \nmaintain, and we think it'll be useful to others.\n\nIex is an exception-handling library.\n\nDocumentation on all of these libraries is incomplete.  See the .h files\nfor API details.  Most of the interfaces are well-documented from\na programmer's perspective.  See the IlmImfExamples directory for\nsome code that demonstrates how to use the IlmImf library to read\nand write OpenEXR files.  The doc directory contains some high-level\ndocumentation and history about the OpenEXR format.\n\nIf you have questions about using the OpenEXR libraries, you may want\nto join our developer mailing list.  See http://www.openexr.com for\ndetails.\n\n\nLICENSE\n-------\n\nThe OpenEXR distribution is covered by a modified BSD license; see\nthe file named COPYING (included in this distribution) for details.\n\n\nWHAT'S INCLUDED\n---------------\n\nThe release includes exrdisplay, an image viewer for OpenEXR images; and\nexrheader, a utility for dumping header information from OpenEXR files.\n\nexrdisplay requires FLTK 1.1 or greater and OpenGL.  exrdisplay now\nsupports fragment shaders if you have the Nvidia Cg SDK and a graphics\ncard capable of running fp30 profile fragment shaders.  See\nexrdisplay/README for details.\n\nWe have also released an OpenEXR display driver for Renderman and a\nplugin for Adobe Photoshop (on both Windows and MacOS).  These are\npackaged separately.  Go to our GNU Savannah web page to download\nthem:\n\nhttp://savannah.nongnu.org/files/?group=openexr\n\n\n\nBUILDING OPENEXR\n----------------\n\nTo build OpenEXR on GNU/Linux or other UNIX-like systems, do:\n\n./configure\nmake\nmake install\n\nIf you have the Nvidia Cg SDK and you want to build support for\nfragment shaders into exrdisplay, specify the path to the SDK using\nthe \"--with-nvsdk-prefix\" flag.\n\nSee README.OSX for details on building OpenEXR in MacOS X.\n\nDo 'make check' to run confidence tests.  See the INSTALL file for more\ndetails or try \"./configure --help\".\n\nOther UNIX variants haven't been tested, but should be easy to build.\nLet us know if you're having problems porting OpenEXR to a particular\nplatform.  See below for platform-specific notes.\n\nAll include files needed to use the OpenEXR libraries are installed in the \nOpenEXR subdirectory of the install prefix, e.g. /usr/local/include/OpenEXR.\n\nTo build OpenEXR on Windows NT or greater, you have a few choices:\n\n* Use Cygwin and the 'configure' script, see above.\n* Use Visual C++ 6.0 with Intel's C++ compiler.\n* Use Visual Studio .NET 2003 with Microsoft's C++ compiler.\n\nSee README.win32 for details.\n"
  },
  {
    "path": "k3dsdk/Half/eLut.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// Digital Ltd. LLC\n// \n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n// *       Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// *       Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// *       Neither the name of Industrial Light & Magic nor the names of\n// its contributors may be used to endorse or promote products derived\n// from this software without specific prior written permission. \n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////\n\n\n\n#include <iostream>\n#include <iomanip>\n\nusing namespace std;\n\n//-----------------------------------------------------\n// Compute a lookup table for float-to-half conversion.\n//\n// When indexed with the combined sign and exponent of\n// a float, the table either returns the combined sign\n// and exponent of the corresponding half, or zero if\n// the corresponding half may not be normalized (zero,\n// denormalized, overflow).\n//-----------------------------------------------------\n\nvoid\ninitELut (unsigned short eLut[])\n{\n    for (int i = 0; i < 0x100; i++)\n    {\n\tint e = (i & 0x0ff) - (127 - 15);\n\n\tif (e <= 0 || e >= 30)\n\t{\n\t    //\n\t    // Special case\n\t    //\n\n\t    eLut[i]         = 0;\n\t    eLut[i | 0x100] = 0;\n\t}\n\telse\n\t{\n\t    //\n\t    // Common case - normalized half, no exponent overflow possible\n\t    //\n\n\t    eLut[i]         =  (e << 10);\n\t    eLut[i | 0x100] = ((e << 10) | 0x8000);\n\t}\n    }\n}\n\n\n//------------------------------------------------------------\n// Main - prints the sign-and-exponent conversion lookup table\n//------------------------------------------------------------\n\nint\nmain ()\n{\n    const int tableSize = 1 << 9;\n    unsigned short eLut[tableSize];\n    initELut (eLut);\n\n    cout << \"//\\n\"\n\t    \"// This is an automatically generated file.\\n\"\n\t    \"// Do not edit.\\n\"\n\t    \"//\\n\\n\";\n\n    cout << \"{\\n    \";\n\n    for (int i = 0; i < tableSize; i++)\n    {\n\tcout << setw (5) << eLut[i] << \", \";\n\n\tif (i % 8 == 7)\n\t{\n\t    cout << \"\\n\";\n\n\t    if (i < tableSize - 1)\n\t\tcout << \"    \";\n\t}\n    }\n\n    cout << \"};\\n\";\n    return 0;\n}\n"
  },
  {
    "path": "k3dsdk/Half/half.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// Digital Ltd. LLC\n// \n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n// *       Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// *       Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// *       Neither the name of Industrial Light & Magic nor the names of\n// its contributors may be used to endorse or promote products derived\n// from this software without specific prior written permission. \n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////\n\n// Primary authors:\n//     Florian Kainz <kainz@ilm.com>\n//     Rod Bogart <rgb@ilm.com>\n\n\n//---------------------------------------------------------------------------\n//\n//\tclass half --\n//\timplementation of non-inline members\n//\n//---------------------------------------------------------------------------\n\n#include <assert.h>\n#include <half.h>\n\nusing namespace std;\n\n//-------------------------------------------------------------\n// Lookup tables for half-to-float and float-to-half conversion\n//-------------------------------------------------------------\n\nconst half::uif half::_toFloat[1 << 16] =\n    #include <toFloat.h>\n\nconst unsigned short half::_eLut[1 << 9] =\n    #include <eLut.h>\n\n\n//--------------------------------------\n// Dummy flag, initialized by selftest()\n//--------------------------------------\n\nconst bool half::_itWorks =\n    selftest(); \n\n\n//-----------------------------------------------\n// Overflow handler for float-to-half conversion;\n// generates a hardware floating-point overflow,\n// which may be trapped by the operating system.\n//-----------------------------------------------\n\nfloat\nhalf::overflow ()\n{\n    volatile float f = 1e10;\n\n    for (int i = 0; i < 10; i++)\t\n\tf *= f;\t\t\t\t// this will overflow before\n\t\t\t\t\t// the forloop terminates\n    return f;\n}\n\n\n//-----------------------------------------------------\n// Float-to-half conversion -- general case, including\n// zeroes, denormalized numbers and exponent overflows.\n//-----------------------------------------------------\n\nshort\nhalf::convert (int i)\n{\n    //\n    // Our floating point number, f, is represented by the bit\n    // pattern in integer i.  Disassemble that bit pattern into\n    // the sign, s, the exponent, e, and the significand, m.\n    // Shift s into the position where it will go in in the\n    // resulting half number.\n    // Adjust e, accounting for the different exponent bias\n    // of float and half (127 versus 15).\n    //\n\n    register int s =  (i >> 16) & 0x00008000;\n    register int e = ((i >> 23) & 0x000000ff) - (127 - 15);\n    register int m =   i        & 0x007fffff;\n\n    //\n    // Now reassemble s, e and m into a half:\n    //\n\n    if (e <= 0)\n    {\n\tif (e < -10)\n\t{\n\t    //\n\t    // E is less than -10.  The absolute value of f is\n\t    // less than HALF_MIN (f may be a small normalized\n\t    // float, a denormalized float or a zero).\n\t    //\n\t    // We convert f to a half zero.\n\t    //\n\n\t    return 0;\n\t}\n\n\t//\n\t// E is between -10 and 0.  F is a normalized float,\n\t// whose magnitude is less than HALF_NRM_MIN.\n\t//\n\t// We convert f to a denormalized half.\n\t// \n\n\tm = (m | 0x00800000) >> (1 - e);\n\n\t//\n\t// Round to nearest, round \"0.5\" up.\n\t//\n\t// Rounding may cause the significand to overflow and make\n\t// our number normalized.  Because of the way a half's bits\n\t// are laid out, we don't have to treat this case separately;\n\t// the code below will handle it correctly.\n\t// \n\n\tif (m &  0x00001000)\n\t    m += 0x00002000;\n\n\t//\n\t// Assemble the half from s, e (zero) and m.\n\t//\n\n\treturn s | (m >> 13);\n    }\n    else if (e == 0xff - (127 - 15))\n    {\n\tif (m == 0)\n\t{\n\t    //\n\t    // F is an infinity; convert f to a half\n\t    // infinity with the same sign as f.\n\t    //\n\n\t    return s | 0x7c00;\n\t}\n\telse\n\t{\n\t    //\n\t    // F is a NAN; produce a half NAN that preserves\n\t    // the sign bit and the 10 leftmost bits of the\n\t    // significand of f.\n\t    //\n\n\t    return s | 0x7c00 | (m >> 13);\n\t}\n    }\n    else\n    {\n\t//\n\t// E is greater than zero.  F is a normalized float.\n\t// We try to convert f to a normalized half.\n\t//\n\n\t//\n\t// Round to nearest, round \"0.5\" up\n\t//\n\n\tif (m &  0x00001000)\n\t{\n\t    m += 0x00002000;\n\n\t    if (m & 0x00800000)\n\t    {\n\t\tm =  0;\t\t// overflow in significand,\n\t\te += 1;\t\t// adjust exponent\n\t    }\n\t}\n\n\t//\n\t// Handle exponent overflow\n\t//\n\n\tif (e > 30)\n\t{\n\t    overflow ();\t// Cause a hardware floating point overflow;\n\t    return s | 0x7c00;\t// if this returns, the half becomes an\n\t}   \t\t\t// infinity with the same sign as f.\n\n\t//\n\t// Assemble the half from s, e and m.\n\t//\n\n\treturn s | (e << 10) | (m >> 13);\n    }\n}\n\n\n//--------------------------------------\n// Simple selftest, triggered by static\n// initialization of half::_itWorks flag\n//--------------------------------------\n\nnamespace\n{\n    void\n    testNormalized (float f)\n    {\n\thalf  h (f);\n\tfloat e (1 - h / f);\n\n\tif (e < 0)\n\t    e = -e;\n\n\tif (e > HALF_EPSILON * 0.5)\n\t{\n\t    cerr << \"Internal error: float/half conversion does not work.\";\n\t    assert (false);\n\t}\n    }\n\n\n    void\n    testDenormalized (float f)\n    {\n\thalf  h (f);\n\tfloat e (h - f);\n\n\tif (e < 0)\n\t    e = -e;\n\n\tif (e > HALF_MIN * 0.5)\n\t{\n\t    cerr << \"Internal error: float/half conversion does not work.\";\n\t    assert (false);\n\t}\n    }\n}\n\n\nbool\nhalf::selftest ()\n{\n    testNormalized   ((float)  HALF_MAX);\n    testNormalized   ((float) -HALF_MAX);\n    testNormalized   ( 0.1f);\n    testNormalized   (-0.1f);\n    testNormalized   ( 0.5f);\n    testNormalized   (-0.5f);\n    testNormalized   ( 1.0f);\n    testNormalized   (-1.0f);\n    testNormalized   ( 2.0f);\n    testNormalized   (-2.0f);\n    testNormalized   ( 3.0f);\n    testNormalized   (-3.0f);\n    testNormalized   ( 17.0f);\n    testNormalized   (-17.0f);\n    testNormalized   ((float)  HALF_NRM_MIN);\n    testNormalized   ((float) -HALF_NRM_MIN);\n    testDenormalized ((float)  HALF_MIN);\n    testDenormalized ((float) -HALF_MIN);\n    testDenormalized ( 0.0f);\n    testDenormalized (-0.0f);\n\n    return true;\n}\n\n\n//---------------------\n// Stream I/O operators\n//---------------------\n\nostream &\noperator << (ostream &os, half h)\n{\n    os << float (h);\n    return os;\n}\n\n\nistream &\noperator >> (istream &is, half &h)\n{\n    float f;\n    is >> f;\n    h = half (f);\n    return is;\n}\n\n\n//---------------------------------------\n// Functions to print the bit-layout of\n// floats and halfs, mostly for debugging\n//---------------------------------------\n\nvoid\nprintBits (ostream &os, half h)\n{\n    unsigned short b = h.bits();\n\n    for (int i = 15; i >= 0; i--)\n    {\n\tos << (((b >> i) & 1)? '1': '0');\n\n\tif (i == 15 || i == 10)\n\t    os << ' ';\n    }\n}\n\n\nvoid\nprintBits (ostream &os, float f)\n{\n    half::uif x;\n    x.f = f;\n\n    for (int i = 31; i >= 0; i--)\n    {\n\tos << (((x.i >> i) & 1)? '1': '0');\n\n\tif (i == 31 || i == 23)\n\t    os << ' ';\n    }\n}\n\n\nvoid\nprintBits (char c[19], half h)\n{\n    unsigned short b = h.bits();\n\n    for (int i = 15, j = 0; i >= 0; i--, j++)\n    {\n\tc[j] = (((b >> i) & 1)? '1': '0');\n\n\tif (i == 15 || i == 10)\n\t    c[++j] = ' ';\n    }\n    \n    c[18] = 0;\n}\n\n\nvoid\nprintBits (char c[35], float f)\n{\n    half::uif x;\n    x.f = f;\n\n    for (int i = 31, j = 0; i >= 0; i--, j++)\n    {\n\tc[j] = (((x.i >> i) & 1)? '1': '0');\n\n\tif (i == 31 || i == 23)\n\t    c[++j] = ' ';\n    }\n\n    c[34] = 0;\n}\n"
  },
  {
    "path": "k3dsdk/Half/half.h",
    "content": "///////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// Digital Ltd. LLC\n// \n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n// *       Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// *       Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// *       Neither the name of Industrial Light & Magic nor the names of\n// its contributors may be used to endorse or promote products derived\n// from this software without specific prior written permission. \n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////\n\n// Primary authors:\n//     Florian Kainz <kainz@ilm.com>\n//     Rod Bogart <rgb@ilm.com>\n\n//---------------------------------------------------------------------------\n//\n//\thalf -- a 16-bit floating point number class:\n//\n//\tType half can represent positive and negative numbers, whose\n//\tmagnitude is between roughly 6.1e-5 and 6.5e+4, with a relative\n//\terror of 9.8e-4; numbers smaller than 6.1e-5 can be represented\n//\twith an absolute error of 6.0e-8.  All integers from -2048 to\n//\t+2048 can be represented exactly.\n//\n//\tType half behaves (almost) like the built-in C++ floating point\n//\ttypes.  In arithmetic expressions, half, float and double can be\n//\tmixed freely.  Here are a few examples:\n//\n//\t    half a (3.5);\n//\t    float b (a + sqrt (a));\n//\t    a += b;\n//\t    b += a;\n//\t    b = a + 7;\n//\n//\tConversions from half to float are lossless; all half numbers\n//\tare exactly representable as floats.\n//\n//\tConversions from float to half may not preserve the float's\n//\tvalue exactly.  If a float is not representable as a half, the\n//\tfloat value is rounded to the nearest representable half.  If\n//\ta float value is exactly in the middle between the two closest\n//\trepresentable half values, then the float value is rounded to\n//\tthe half with the greater magnitude.\n//\n//\tOverflows during float-to-half conversions cause arithmetic\n//\texceptions.  An overflow occurs when the float value to be\n//\tconverted is too large to be represented as a half, or if the\n//\tfloat value is an infinity or a NAN.\n//\n//\tThe implementation of type half makes the following assumptions\n//\tabout the implementation of the built-in C++ types:\n//\n//\t    float is an IEEE 754 single-precision number\n//\t    sizeof (float) == 4\n//\t    sizeof (unsigned int) == sizeof (float)\n//\t    alignof (unsigned int) == alignof (float)\n//\t    sizeof (unsigned short) == 2\n//\n//---------------------------------------------------------------------------\n\n#ifndef _HALF_H_\n#define _HALF_H_\n\n#include <k3d-platform-config.h>\n#include <iostream>\n\n#ifdef K3D_COMPILER_MSVC\n\n    #ifdef k3dsdk_half_EXPORTS\n\t    \n        #define K3D_HALF_EXPORT // No dllexport needed, since it's handled by gendef\n    \n    #else\n\t    \n        #define K3D_HALF_EXPORT __declspec(dllimport)\n    \n    #endif\n\n#else // K3D_COMPILER_MSVC\n\n\t#define K3D_HALF_EXPORT\n\n#endif // !K3D_COMPILER_MSVC\n\nclass half\n{\n  public:\n\n    //-------------\n    // Constructors\n    //-------------\n\n    half ();\t\t\t// no initialization\n    half (const half &h);\n    half (float f);\n\n\n    //--------------------\n    // Conversion to float\n    //--------------------\n\n    operator\t\tfloat () const;\n\n\n    //------------\n    // Unary minus\n    //------------\n\n    half\t\toperator - () const;\n\n\n    //-----------\n    // Assignment\n    //-----------\n\n    half\t\toperator = (half  h);\n    half\t\toperator = (float f);\n\n    half\t\toperator += (half  h);\n    half\t\toperator += (float f);\n\n    half\t\toperator -= (half  h);\n    half\t\toperator -= (float f);\n\n    half\t\toperator *= (half  h);\n    half\t\toperator *= (float f);\n\n    half\t\toperator /= (half  h);\n    half\t\toperator /= (float f);\n\n\n    //---------------------------------------------------------\n    // Round to n-bit precision (n should be between 0 and 10).\n    // After rounding, the significand's 10-n least significant\n    // bits will be zero.\n    //---------------------------------------------------------\n\n    half\t\tround (unsigned int n) const;\n\n\n    //--------------------------------------------------------------------\n    // Classification:\n    //\n    //\th.isFinite()\t\treturns true if h is a normalized number,\n    //\t\t\t\ta denormalized number or zero\n    //\n    //\th.isNormalized()\treturns true if h is a normalized number\n    //\n    //\th.isDenormalized()\treturns true if h is a denormalized number\n    //\n    //\th.isZero()\t\treturns true if h is zero\n    //\n    //\th.isNan()\t\treturns true if h is a NAN\n    //\n    //\th.isInfinity()\t\treturns true if h is a positive\n    //\t\t\t\tor a negative infinity\n    //\n    //\th.isNegative()\t\treturns true if the sign bit of h\n    //\t\t\t\tis set (negative)\n    //--------------------------------------------------------------------\n\n    bool\t\tisFinite () const;\n    bool\t\tisNormalized () const;\n    bool\t\tisDenormalized () const;\n    bool\t\tisZero () const;\n    bool\t\tisNan () const;\n    bool\t\tisInfinity () const;\n    bool\t\tisNegative () const;\n\n\n    //--------------------------------------------\n    // Special values\n    //\n    //\tposInf()\treturns +infinity\n    //\n    //\tnegInf()\treturns +infinity\n    //\n    //\tqNan()\t\treturns a NAN with the bit\n    //\t\t\tpattern 0111111111111111\n    //\n    //\tsNan()\t\treturns a NAN with the bit\n    //\t\t\tpattern 0111110111111111\n    //--------------------------------------------\n\n    static half\t\tposInf ();\n    static half\t\tnegInf ();\n    static half\t\tqNan ();\n    static half\t\tsNan ();\n\n\n    //--------------------------------------\n    // Access to the internal representation\n    //--------------------------------------\n\n    unsigned short\tbits () const;\n    void\t\tsetBits (unsigned short bits);\n\n\n  public:\n\n    union uif\n    {\n\tunsigned int\ti;\n\tfloat\t\tf;\n    };\n\n  private:\n\n    static short\tconvert (int i);\n    static float\toverflow ();\n    static bool\t\tselftest ();\n\n    unsigned short\t_h;\n\n    K3D_HALF_EXPORT static const uif\t\t_toFloat[1 << 16];\n    K3D_HALF_EXPORT static const unsigned short\t_eLut[1 << 9];\n    K3D_HALF_EXPORT static const bool\t\t_itWorks;\n};\n\n\n//-----------\n// Stream I/O\n//-----------\n\nstd::ostream &\t\toperator << (std::ostream &os, half  h);\nstd::istream &\t\toperator >> (std::istream &is, half &h);\n\n\n//----------\n// Debugging\n//----------\n\nvoid\t\t\tprintBits   (std::ostream &os, half  h);\nvoid\t\t\tprintBits   (std::ostream &os, float f);\nvoid\t\t\tprintBits   (char  c[19], half  h);\nvoid\t\t\tprintBits   (char  c[35], float f);\n\n\n//-------\n// Limits\n//-------\n\n#define HALF_MIN\t5.96046448e-08\t// Smallest positive half\n\n#define HALF_NRM_MIN\t6.10351562e-05\t// Smallest positive normalized half\n\n#define HALF_MAX\t65504.0\t\t// Largest positive half\n\n#define HALF_EPSILON\t0.00097656\t// Smallest positive e for which\n\t\t\t\t\t// half (1.0 + e) != half (1.0)\n\n#define HALF_MANT_DIG\t11\t\t// Number of digits in mantissa\n\t\t\t\t\t// (significand + hidden leading 1)\n\n#define HALF_DIG\t2\t\t// Number of base 10 digits that\n\t\t\t\t\t// can be represented without change\n\n#define HALF_RADIX\t2\t\t// Base of the exponent\n\n#define HALF_MIN_EXP\t-13\t\t// Minimum negative integer such that\n\t\t\t\t\t// HALF_RADIX raised to the power of\n\t\t\t\t\t// one less than that integer is a\n\t\t\t\t\t// normalized half\n\n#define HALF_MAX_EXP\t16\t\t// Maximum positive integer such that\n\t\t\t\t\t// HALF_RADIX raised to the power of\n\t\t\t\t\t// one less than that integer is a\n\t\t\t\t\t// normalized half\n\n#define HALF_MIN_10_EXP\t-4\t\t// Minimum positive integer such\n\t\t\t\t\t// that 10 raised to that power is\n\t\t\t\t\t// a normalized half\n\n#define HALF_MAX_10_EXP\t4\t\t// Maximum positive integer such\n\t\t\t\t\t// that 10 raised to that power is\n\t\t\t\t\t// a normalized half\n\n\n//---------------------------------------------------------------------------\n//\n// Implementation --\n//\n// Representation of a float:\n//\n//\tWe assume that a float, f, is an IEEE 754 single-precision\n//\tfloating point number, whose bits are arranged as follows:\n//\n//\t    31 (msb)\n//\t    | \n//\t    | 30     23\n//\t    | |      | \n//\t    | |      | 22                    0 (lsb)\n//\t    | |      | |                     |\n//\t    X XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX\n//\n//\t    s e        m\n//\n//\tS is the sign-bit, e is the exponent and m is the significand.\n//\n//\tIf e is between 1 and 254, f is a normalized number:\n//\n//\t            s    e-127\n//\t    f = (-1)  * 2      * 1.m\n//\n//\tIf e is 0, and m is not zero, f is a denormalized number:\n//\n//\t            s    -126\n//\t    f = (-1)  * 2      * 0.m\n//\n//\tIf e and m are both zero, f is zero:\n//\n//\t    f = 0.0\n//\n//\tIf e is 255, f is an \"infinity\" or \"not a number\" (NAN),\n//\tdepending on whether m is zero or not.\n//\n//\tExamples:\n//\n//\t    0 00000000 00000000000000000000000 = 0.0\n//\t    0 01111110 00000000000000000000000 = 0.5\n//\t    0 01111111 00000000000000000000000 = 1.0\n//\t    0 10000000 00000000000000000000000 = 2.0\n//\t    0 10000000 10000000000000000000000 = 3.0\n//\t    1 10000101 11110000010000000000000 = -124.0625\n//\t    0 11111111 00000000000000000000000 = +infinity\n//\t    1 11111111 00000000000000000000000 = -infinity\n//\t    0 11111111 10000000000000000000000 = NAN\n//\t    1 11111111 11111111111111111111111 = NAN\n//\n// Representation of a half:\n//\n//\tHere is the bit-layout for a half number, h:\n//\n//\t    15 (msb)\n//\t    | \n//\t    | 14  10\n//\t    | |   |\n//\t    | |   | 9        0 (lsb)\n//\t    | |   | |        |\n//\t    X XXXXX XXXXXXXXXX\n//\n//\t    s e     m\n//\n//\tS is the sign-bit, e is the exponent and m is the significand.\n//\n//\tIf e is between 1 and 30, h is a normalized number:\n//\n//\t            s    e-15\n//\t    h = (-1)  * 2     * 1.m\n//\n//\tIf e is 0, and m is not zero, h is a denormalized number:\n//\n//\t            S    -14\n//\t    h = (-1)  * 2     * 0.m\n//\n//\tIf e and m are both zero, h is zero:\n//\n//\t    h = 0.0\n//\n//\tIf e is 31, h is an \"infinity\" or \"not a number\" (NAN),\n//\tdepending on whether m is zero or not.\n//\n//\tExamples:\n//\n//\t    0 00000 0000000000 = 0.0\n//\t    0 01110 0000000000 = 0.5\n//\t    0 01111 0000000000 = 1.0\n//\t    0 10000 0000000000 = 2.0\n//\t    0 10000 1000000000 = 3.0\n//\t    1 10101 1111000001 = -124.0625\n//\t    0 11111 0000000000 = +infinity\n//\t    1 11111 0000000000 = -infinity\n//\t    0 11111 1000000000 = NAN\n//\t    1 11111 1111111111 = NAN\n//\n// Conversion:\n//\n//\tConverting from a float to a half requires some non-trivial bit\n//\tmanipulations.  In some cases, this makes conversion relatively\n//\tslow, but the most common case is accelerated via table lookups.\n//\n//\tConverting back from a half to a float is easier because we don't\n//\thave to do any rounding.  In addition, there are only 65536\n//\tdifferent half numbers; we can convert each of those numbers once\n//\tand store the results in a table.  Later, all conversions can be\n//\tdone using only simple table lookups.\n//\n//---------------------------------------------------------------------------\n\n\n//--------------------\n// Simple constructors\n//--------------------\n\ninline\nhalf::half ()\n{\n    // no initialization\n}\n\n\ninline\nhalf::half (const half &h)\n{\n    _h = h._h;\n}\n\n\n//----------------------------\n// Half-from-float constructor\n//----------------------------\n\ninline\nhalf::half (float f)\n{\n    if (f == 0)\n    {\n\t//\n\t// Common special case - zero.\n\t// For speed, we don't preserve the zero's sign.\n\t//\n\n\t_h = 0;\n    }\n    else\n    {\n\t//\n\t// We extract the combined sign and exponent, e, from our\n\t// floating-point number, f.  Then we convert e to the sign\n\t// and exponent of the half number via a table lookup.\n\t//\n\t// For the most common case, where a normalized half is produced,\n\t// the table lookup returns a non-zero value; in this case, all\n\t// we have to do, is round f's significand to 10 bits and combine\n\t// the result with e.\n\t//\n\t// For all other cases (overflow, zeroes, denormalized numbers\n\t// resulting from underflow, infinities and NANs), the table\n\t// lookup returns zero, and we call a longer, non-inline function\n\t// to do the float-to-half conversion.\n\t//\n\n\tuif x;\n\n\tx.f = f;\n\n\tregister int e = (x.i >> 23) & 0x000001ff;\n\n\te = _eLut[e];\n\n\tif (e)\n\t{\n\t    //\n\t    // Simple case - round the significand and\n\t    // combine it with the sign and exponent.\n\t    //\n\n\t    _h = e + (((x.i & 0x007fffff) + 0x00001000) >> 13);\n\t}\n\telse\n\t{\n\t    //\n\t    // Difficult case - call a function.\n\t    //\n\n\t    _h = convert (x.i);\n\t}\n    }\n}\n\n\n//------------------------------------------\n// Half-to-float conversion via table lookup\n//------------------------------------------\n\ninline\nhalf::operator float () const\n{\n    return _toFloat[_h].f;\n}\n\n\n//-------------------------\n// Round to n-bit precision\n//-------------------------\n\ninline half\nhalf::round (unsigned int n) const\n{\n    //\n    // Parameter check.\n    //\n\n    if (n >= 10)\n\treturn *this;\n\n    //\n    // Disassemble h into the sign, s,\n    // and the combined exponent and significand, e.\n    //\n\n    unsigned short s = _h & 0x8000;\n    unsigned short e = _h & 0x7fff;\n\n    //\n    // Round the exponent and significand to the nearest value\n    // where ones occur only in the (10-n) most significant bits.\n    // Note that the exponent adjusts automatically if rounding\n    // up causes the significand to overflow.\n    //\n\n    e >>= 9 - n;\n    e  += e & 1;\n    e <<= 9 - n;\n\n    //\n    // Check for exponent overflow.\n    //\n\n    if (e >= 0x7c00)\n    {\n\t//\n\t// Overflow occurred -- truncate instead of rounding.\n\t//\n\n\te = _h;\n\te >>= 10 - n;\n\te <<= 10 - n;\n    }\n\n    //\n    // Put the original sign bit back.\n    //\n\n    half h;\n    h._h = s | e;\n\n    return h;\n}\n\n\n//-----------------------\n// Other inline functions\n//-----------------------\n\ninline half\t\nhalf::operator - () const\n{\n    half h;\n    h._h = _h ^ 0x8000;\n    return h;\n}\n\n\ninline half\t\nhalf::operator = (half h)\n{\n    _h = h._h;\n    return *this;\n}\n\n\ninline half\t\nhalf::operator = (float f)\n{\n    *this = half (f);\n    return *this;\n}\n\n\ninline half\t\nhalf::operator += (half h)\n{\n    *this = half (float (*this) + float (h));\n    return *this;\n}\n\n\ninline half\t\nhalf::operator += (float f)\n{\n    *this = half (float (*this) + f);\n    return *this;\n}\n\n\ninline half\t\nhalf::operator -= (half h)\n{\n    *this = half (float (*this) - float (h));\n    return *this;\n}\n\n\ninline half\t\nhalf::operator -= (float f)\n{\n    *this = half (float (*this) - f);\n    return *this;\n}\n\n\ninline half\t\nhalf::operator *= (half h)\n{\n    *this = half (float (*this) * float (h));\n    return *this;\n}\n\n\ninline half\t\nhalf::operator *= (float f)\n{\n    *this = half (float (*this) * f);\n    return *this;\n}\n\n\ninline half\t\nhalf::operator /= (half h)\n{\n    *this = half (float (*this) / float (h));\n    return *this;\n}\n\n\ninline half\t\nhalf::operator /= (float f)\n{\n    *this = half (float (*this) / f);\n    return *this;\n}\n\n\ninline bool\t\nhalf::isFinite () const\n{\n    unsigned short e = (_h >> 10) & 0x001f;\n    return e < 31;\n}\n\n\ninline bool\nhalf::isNormalized () const\n{\n    unsigned short e = (_h >> 10) & 0x001f;\n    return e > 0 && e < 31;\n}\n\n\ninline bool\nhalf::isDenormalized () const\n{\n    unsigned short e = (_h >> 10) & 0x001f;\n    unsigned short m =  _h & 0x3ff;\n    return e == 0 && m != 0;\n}\n\n\ninline bool\nhalf::isZero () const\n{\n    return (_h & 0x7fff) == 0;\n}\n\n\ninline bool\nhalf::isNan () const\n{\n    unsigned short e = (_h >> 10) & 0x001f;\n    unsigned short m =  _h & 0x3ff;\n    return e == 31 && m != 0;\n}\n\n\ninline bool\nhalf::isInfinity () const\n{\n    unsigned short e = (_h >> 10) & 0x001f;\n    unsigned short m =  _h & 0x3ff;\n    return e == 31 && m == 0;\n}\n\n\ninline bool\t\nhalf::isNegative () const\n{\n    return (_h & 0x8000) != 0;\n}\n\n\ninline half\nhalf::posInf ()\n{\n    half h;\n    h._h = 0x7c00;\n    return h;\n}\n\n\ninline half\nhalf::negInf ()\n{\n    half h;\n    h._h = 0xfc00;\n    return h;\n}\n\n\ninline half\nhalf::qNan ()\n{\n    half h;\n    h._h = 0x7fff;\n    return h;\n}\n\n\ninline half\nhalf::sNan ()\n{\n    half h;\n    h._h = 0x7dff;\n    return h;\n}\n\n\ninline unsigned short\nhalf::bits () const\n{\n    return _h;\n}\n\n\ninline void\nhalf::setBits (unsigned short bits)\n{\n    _h = bits;\n}\n\n\n#endif\n"
  },
  {
    "path": "k3dsdk/Half/halfFunction.h",
    "content": "///////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// Digital Ltd. LLC\n// \n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n// *       Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// *       Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// *       Neither the name of Industrial Light & Magic nor the names of\n// its contributors may be used to endorse or promote products derived\n// from this software without specific prior written permission. \n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////\n\n// Primary authors:\n//     Florian Kainz <kainz@ilm.com>\n//     Rod Bogart <rgb@ilm.com>\n\n\n//---------------------------------------------------------------------------\n//\n//\thalfFunction<T> -- a class for fast evaluation\n//\t\t\t   of half --> T functions\n//\n//\tThe constructor for a halfFunction object,\n//\n//\t    halfFunction (function,\n//\t\t\t  domainMin, domainMax,\n//\t\t\t  defaultValue,\n//\t\t\t  posInfValue, negInfValue,\n//\t\t\t  nanValue);\n//\n//\tevaluates the function for all finite half values in the interval\n//\t[domainMin, domainMax], and stores the results in a lookup table.\n//\tFor finite half values that are not in [domainMin, domainMax], the\n//\tconstructor stores defaultValue in the table.  For positive infinity,\n//\tnegative infinity and NANs, posInfValue, negInfValue and nanValue\n//\tare stored in the table.\n//\n//\tThe tabulated function can then be evaluated quickly for arbitrary\n//\thalf values by calling the the halfFunction object's operator()\n//\tmethod.\n//\n//\tExample:\n//\n//\t    #include <math.h>\n//\t    #include <halfFunction.h>\n//\n//\t    halfFunction<half> hsin (sin);\n//\n//\t    halfFunction<half> hsqrt (sqrt,\t\t// function\n//\t\t\t\t      0, HALF_MAX,\t// domain\n//\t\t\t\t      half::qNan(),\t// sqrt(x) for x < 0\n//\t\t\t\t      half::posInf(),\t// sqrt(+inf)\n//\t\t\t\t      half::qNan(),\t// sqrt(-inf)\n//\t\t\t\t      half::qNan());\t// sqrt(nan)\n//\n//\t    half x = hsin (1);\n//\t    half y = hsqrt (3.5);\n//\n//---------------------------------------------------------------------------\n\n#ifndef _HALF_FUNCTION_H_\n#define _HALF_FUNCTION_H_\n\n#include <float.h>\n#include <half.h>\n\n\ntemplate <class T>\nclass halfFunction\n{\n  public:\n\n    //------------\n    // Constructor\n    //------------\n\n    template <class Function>\n    halfFunction (Function f,\n\t\t  half domainMin = -HALF_MAX,\n\t\t  half domainMax =  HALF_MAX,\n\t\t  T defaultValue = 0,\n\t\t  T posInfValue  = 0,\n\t\t  T negInfValue  = 0,\n\t\t  T nanValue     = 0);\n\n    //-----------\n    // Evaluation\n    //-----------\n\n    T\t\toperator () (half x) const;\n\n  private:\n\n    T\t\t_lut[1 << 16];\n};\n\n\n//---------------\n// Implementation\n//---------------\n\ntemplate <class T>\ntemplate <class Function>\nhalfFunction<T>::halfFunction (Function f,\n\t\t\t       half domainMin,\n\t\t\t       half domainMax,\n\t\t\t       T defaultValue,\n\t\t\t       T posInfValue,\n\t\t\t       T negInfValue,\n\t\t\t       T nanValue)\n{\n    for (int i = 0; i < (1 << 16); i++)\n    {\n\thalf x;\n\tx.setBits (i);\n\n\tif (x.isNan())\n\t    _lut[i] = nanValue;\n\telse if (x.isInfinity())\n\t    _lut[i] = x.isNegative()? negInfValue: posInfValue;\n\telse if (x < domainMin || x > domainMax)\n\t    _lut[i] = defaultValue;\n\telse\n\t    _lut[i] = f (x);\n    }\n}\n\n\ntemplate <class T>\ninline T\nhalfFunction<T>::operator () (half x) const\n{\n    return _lut[x.bits()];\n}\n\n\n#endif\n"
  },
  {
    "path": "k3dsdk/Half/halfLimits.h",
    "content": "///////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// Digital Ltd. LLC\n// \n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n// *       Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// *       Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// *       Neither the name of Industrial Light & Magic nor the names of\n// its contributors may be used to endorse or promote products derived\n// from this software without specific prior written permission. \n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////\n\n\n// Primary authors:\n//     Florian Kainz <kainz@ilm.com>\n//     Rod Bogart <rgb@ilm.com>\n\n\n#ifndef INCLUDED_HALF_LIMITS_H\n#define INCLUDED_HALF_LIMITS_H\n\n\n//------------------------------------------------------------------------\n//\n//\tC++ standard library-style numeric_limits for class half\n//\n//------------------------------------------------------------------------\n\n#ifdef HAVE_STL_LIMITS\n#include <limits>\n#include <half.h>\n\nnamespace std {\n\ntemplate <>\nclass numeric_limits <half>\n{\n  public:\n\n    static const bool is_specialized = true;\n\n    static half min () throw () {return HALF_NRM_MIN;}\n    static half max () throw () {return HALF_MAX;}\n\n    static const int digits = HALF_MANT_DIG;\n    static const int digits10 = HALF_DIG;\n    static const bool is_signed = true;\n    static const bool is_integer = false;\n    static const bool is_exact = false;\n    static const int radix = HALF_RADIX;\n    static half epsilon () throw () {return HALF_EPSILON;}\n    static half round_error () throw () {return HALF_EPSILON / 2;}\n\n    static const int min_exponent = HALF_MIN_EXP;\n    static const int min_exponent10 = HALF_MIN_10_EXP;\n    static const int max_exponent = HALF_MAX_EXP;\n    static const int max_exponent10 = HALF_MAX_10_EXP;\n\n    static const bool has_infinity = true;\n    static const bool has_quiet_NaN = true;\n    static const bool has_signaling_NaN = true;\n    static const float_denorm_style has_denorm = denorm_present;\n    static const bool has_denorm_loss = false;\n    static half infinity () throw () {return half::posInf();}\n    static half quiet_NaN () throw () {return half::qNan();}\n    static half signaling_NaN () throw () {return half::sNan();}\n    static half denorm_min () throw () {return HALF_MIN;}\n\n    static const bool is_iec559 = false;\n    static const bool is_bounded = false;\n    static const bool is_modulo = false;\n\n    static const bool traps = true;\n    static const bool tinyness_before = false;\n    static const float_round_style round_style = round_to_nearest;\n};\n\n\n} // namespace std\n\n#endif\n#endif\n"
  },
  {
    "path": "k3dsdk/Half/toFloat.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// Digital Ltd. LLC\n// \n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n// *       Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// *       Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// *       Neither the name of Industrial Light & Magic nor the names of\n// its contributors may be used to endorse or promote products derived\n// from this software without specific prior written permission. \n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////\n\n\n\n\n//---------------------------------------------------------------------------\n//\n//\ttoFloat\n//\n//\tA program to generate the lookup table for half-to-float\n//\tconversion needed by class half.\n//\tThe program loops over all 65536 possible half numbers,\n//\tconverts each of them to a float, and prints the result.\n//\n//---------------------------------------------------------------------------\n\n\n#include <iostream>\n#include <iomanip>\n\nusing namespace std;\n\n//---------------------------------------------------\n// Interpret an unsigned short bit pattern as a half,\n// and convert that half to the corresponding float's\n// bit pattern.\n//---------------------------------------------------\n\nunsigned int\nhalfToFloat (unsigned short y)\n{\n\n    int s = (y >> 15) & 0x00000001;\n    int e = (y >> 10) & 0x0000001f;\n    int m =  y        & 0x000003ff;\n\n    if (e == 0)\n    {\n\tif (m == 0)\n\t{\n\t    //\n\t    // Plus or minus zero\n\t    //\n\n\t    return s << 31;\n\t}\n\telse\n\t{\n\t    //\n\t    // Denormalized number -- renormalize it\n\t    //\n\n\t    while (!(m & 0x00000400))\n\t    {\n\t\tm <<= 1;\n\t\te -=  1;\n\t    }\n\n\t    e += 1;\n\t    m &= ~0x00000400;\n\t}\n    }\n    else if (e == 31)\n    {\n\tif (m == 0)\n\t{\n\t    //\n\t    // Positive or negative infinity\n\t    //\n\n\t    return (s << 31) | 0x7f800000;\n\t}\n\telse\n\t{\n\t    //\n\t    // Nan -- preserve sign and significand bits\n\t    //\n\n\t    return (s << 31) | 0x7f800000 | (m << 13);\n\t}\n    }\n\n    //\n    // Normalized number\n    //\n\n    e = e + (127 - 15);\n    m = m << 13;\n\n    //\n    // Assemble s, e and m.\n    //\n\n    return (s << 31) | (e << 23) | m;\n}\n\n\n//---------------------------------------------\n// Main - prints the half-to-float lookup table\n//---------------------------------------------\n\nint\nmain ()\n{\n    cout.precision (9);\n#ifndef HAVE_IOS_BASE\n    cout.setf (ios::hex, ios::basefield);\n#else\n    cout.setf (ios_base::hex, ios_base::basefield);\n#endif\n\n    cout << \"//\\n\"\n\t    \"// This is an automatically generated file.\\n\"\n\t    \"// Do not edit.\\n\"\n\t    \"//\\n\\n\";\n\n    cout << \"{\\n    \";\n\n    const int iMax = (1 << 16);\n\n    for (int i = 0; i < iMax; i++)\n    {\n\tcout << \"{0x\" << setfill ('0') << setw (8) << halfToFloat (i) << \"}, \";\n\n\tif (i % 4 == 3)\n\t{\n\t    cout << \"\\n\";\n\n\t    if (i < iMax - 1)\n\t\tcout << \"    \";\n\t}\n    }\n\n    cout << \"};\\n\";\n    return 0;\n}\n"
  },
  {
    "path": "k3dsdk/algebra.h",
    "content": "#ifndef K3DSDK_ALGEBRA_H\n#define K3DSDK_ALGEBRA_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Algebra classes\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/vectors.h>\n\n#include <cfloat>\n#include <cstring>\n\n/****************************************************************\n*\n* C++ Vector and Matrix Algebra routines\n* Author: Jean-Francois DOUE\n* Version 3.1 --- October 1993\n*\n****************************************************************/\n\n//\n//\tFrom \"Graphics Gems IV / Edited by Paul S. Heckbert\n//\tAcademic Press, 1994, ISBN 0-12-336156-9\n//\t\"You are free to use and modify this code in any way\n//\tyou like.\" (p. xv)\n//\n//\tModified by J. Nagle, March 1997\n//\t-\tAll functions are inline.\n//\t-\tAll functions are const-correct.\n//\t-\tAll checking is via the standard \"assert\" macro.\n//\n\n// Modified by Tim Shead for use with K-3D, January 1998\n\nnamespace k3d\n{\n\nclass matrix4;\nclass quaternion;\nclass angle_axis;\nclass euler_angles;\n\n/////////////////////////////////////////////////////////////////////////////\n// point3\n\n/// Matrix multiplication\npoint3 operator*(const matrix4& a, const point3& v);\n/// Matrix multiplication\npoint3 operator*(const point3& v, const matrix4& a);\n\n/////////////////////////////////////////////////////////////////////////////\n// point4\n\n/// Matrix multiplication\npoint4 operator*(const matrix4& a, const point4& v);\n/// Matrix multiplication\npoint4 operator*(const point4& v, const matrix4& a);\n/// Linear transformation\npoint3 operator*(const matrix4& a, const point3& v);\n/// Matrix multiplication\nmatrix4 operator*(const matrix4& a, const matrix4& b);\n\n/////////////////////////////////////////////////////////////////////////////\n// matrix4\n\n/// A 4x4 matrix\nclass matrix4\n{\npublic:\n\t/// Stores the matrix elements\n\tvector4 v[4];\n\t// Constructors\n\tmatrix4();\n\tmatrix4(const vector4& v0, const vector4& v1, const vector4& v2, const vector4& v3);\n\tmatrix4(const double d);\n\tmatrix4(euler_angles Angles);\n\n\t/// Creates a new matrix4 from values in row-major order\n\ttemplate<typename IteratorT>\n\tstatic matrix4 row_major(IteratorT Begin, IteratorT End)\n\t{\n\t\tmatrix4 result;\n\t\tstd::copy(Begin, End, &result.v[0][0]);\n\t\treturn result;\n\t}\n\n\t/// Copy constructor\n\tmatrix4(const matrix4& m);\n\t/// Assignment of an matrix4\n\tmatrix4& operator=(const matrix4& m);\n/*\n\t/// Assignment of a C/C++ array\n\tmatrix4& operator=(const double d[4][4]);\n*/\n\t/// Assignment of a C/C++ array\n\tmatrix4& operator=(const double d[16]);\n\t/// Addition\n\tmatrix4& operator+=(const matrix4& m);\n\t/// Subtraction\n\tmatrix4& operator-=(const matrix4& m);\n\t/// Multiplication by a constant\n\tmatrix4& operator*=(const double d);\n\t/// Division by a constant\n\tmatrix4& operator/=(const double d);\n\t/// Returns a vector by index\n\tvector4& operator[](int i);\n\t/// Returns a vector by index\n\tconst vector4& operator[](int i) const;\n\t/// Copies the matrix contents into a C/C++ style array\n\tvoid CopyArray(float m[16]) const;\n\t/// Copies the matrix contents into a C/C++ style array\n\tvoid CopyArray(double m[16]) const;\n\t/// Casts the matrix to a C/C++ style array\n\toperator double*() { return &v[0][0]; }\n};\n\n/// Negation\nmatrix4 operator-(const matrix4& a);\n/// Addition\nmatrix4 operator+(const matrix4& a, const matrix4& b);\n/// Subtraction\nmatrix4 operator-(const matrix4& a, const matrix4& b);\n/// Matrix multiplication\nmatrix4 operator*(const matrix4& a, const matrix4& b);\n/// Multiplication by a constant\nmatrix4 operator*(const matrix4& a, const double d);\n/// Multiplication by a constant\nmatrix4 operator*(const double d, const matrix4& a);\n/// Division by a constant\nmatrix4 operator/(const matrix4& a, const double d);\n/// Equality\nbool operator==(const matrix4& a, const matrix4& b);\n/// Non-equality\nbool operator!=(const matrix4& a, const matrix4& b);\n/// Linear transformation\npoint4 operator*(const matrix4& a, const point4& v);\n/// Linear transformation\npoint3 operator*(const matrix4& a, const point3& v);\n/// Returns a three-dimensional identity matrix\ninline matrix4 identity3()\n{\n\treturn matrix4(\n\t\tvector4(1, 0, 0, 0),\n\t\tvector4(0, 1, 0, 0),\n\t\tvector4(0, 0, 1, 0),\n\t\tvector4(0, 0, 0, 1));\n}\n/// Returns the transposition of a matrix\ninline matrix4 transpose(const matrix4& v)\n{\n\treturn matrix4(\n\t\tvector4(v[0][0], v[1][0], v[2][0], v[3][0]),\n\t\tvector4(v[0][1], v[1][1], v[2][1], v[3][1]),\n\t\tvector4(v[0][2], v[1][2], v[2][2], v[3][2]),\n\t\tvector4(v[0][3], v[1][3], v[2][3], v[3][3]));\n}\n/// Returns the inverse of a matrix\ninline matrix4 inverse(const matrix4& v)\n{\n\tmatrix4 a(v),\t // As a evolves from original mat into identity\n\tb(identity3()); // b evolves from identity into inverse(a)\n\n\t// Loop over cols of a from left to right, eliminating above and below diag\n\tfor(int j=0; j<4; ++j) { // Find largest pivot in column j among rows j..3\n\t\tint i1 = j;\t\t // Row with largest pivot candidate\n\n\t\tfor(int i=j+1; i<4; ++i)\n\t\t{\n\t\t\tif (fabs(a.v[i].n[j]) > fabs(a.v[i1].n[j]))\n\t\t\t\ti1 = i;\n\t\t}\n\n\t\t// Swap rows i1 and j in a and b to put pivot on diagonal\n\t\tstd::swap(a.v[i1], a.v[j]);\n\t\tstd::swap(b.v[i1], b.v[j]);\n\n\t\t// Scale row j to have a unit diagonal\n\t\tif(!a.v[j].n[j])\n\t\t{\n\t\t\t// Singular matrix - can't invert\n\t\t\tlog() << error << \"Can't invert singular matrix!\" << std::endl;\n\t\t\treturn b;\n\t\t}\n\n\t\tb.v[j] /= a.v[j].n[j];\n\t\ta.v[j] /= a.v[j].n[j];\n\n\t\t// Eliminate off-diagonal elems in col j of a, doing identical ops to b\n\t\tfor(int i=0; i<4; ++i)\n\t\t{\n\t\t\tif(i!=j)\n\t\t\t{\n\t\t\t\tb.v[i] -= a.v[i].n[j]*b.v[j];\n\t\t\t\ta.v[i] -= a.v[i].n[j]*a.v[j];\n\t\t\t}\n\t\t}\n\t}\n\treturn b;\n}\n\n/// Returns true if a matrix contains negative scale factors that will flip an object \"inside-out\"\ninline bool inside_out(const matrix4& m)\n{\n\tconst vector3 a(m[0][0], m[0][1], m[0][2]);\n\tconst vector3 b(m[1][0], m[1][1], m[1][2]);\n\tconst vector3 c(m[2][0], m[2][1], m[2][2]);\n\n\treturn ((a ^ b) * c) < 0 ? true : false;\n}\n\n/// Linear transformation\ninline const vector3 operator*(const matrix4& a, const vector3& v)\n{\n\tconst vector4 temp((a * point4(v[0], v[1], v[2], 1)) - (a * point4(0, 0, 0, 1)));\n\treturn vector3(temp.n[0], temp.n[1], temp.n[2]);\n}\n\n/// Linear transformation\ninline const vector3 operator*(const vector3& v, const matrix4& a)\n{\n\treturn transpose(a) * v;\n}\n\n/// Linear transformation\ninline const normal3 operator*(const matrix4& a, const normal3& v)\n{\n\tconst vector4 temp((a * point4(v[0], v[1], v[2], 1)) - (a * point4(0, 0, 0, 1)));\n\treturn normal3(temp.n[0], temp.n[1], temp.n[2]);\n}\n\n/// Linear transformation\ninline const normal3 operator*(const normal3& v, const matrix4& a)\n{\n\treturn transpose(a) * v;\n}\n\n/// Output inserter\nstd::ostream& operator<<(std::ostream& Stream, const matrix4& Arg);\n/// Input extractor\nstd::istream& operator>>(std::istream& Stream, matrix4& Arg);\n\n/////////////////////////////////////////////////////////////////////////////\n// quaternion\n\n/// Encapsulates a quaternion\nclass quaternion\n{\npublic:\n\t// The scalar+vector representation is used\n\tdouble w;\n\tvector3 v;\n\n\t// Constructors\n\tquaternion();\n\tquaternion(const double u, const point3& t);\n\tquaternion(const double u, const vector3& t);\n\tquaternion(const double u, const double x, const double y, const double z);\n\tquaternion(const angle_axis& AngleAxis);\n\tquaternion(euler_angles Angles);\n\t/// Assignment of a quaternion\n\tquaternion& operator=(const quaternion& q);\n\t/// Assignment of an axis/angle\n\tquaternion& operator=(const angle_axis& AngleAxis);\n\t/// Multiplication by a constant\n\tquaternion& operator*=(const double d);\n\t/// Division by a constant\n\tquaternion& operator/=(const double d);\n\t/// Addition\n\tquaternion& operator+=(const quaternion& q);\n\t/// Substraction\n\tquaternion& operator-=(const quaternion& q);\n\t/// Multiplication\n\tquaternion& operator*=(const quaternion& q);\n\t/// Division\n\tquaternion& operator/=(const quaternion& q);\n\t/// Magnitude\n\tdouble Magnitude() const;\n\t/// Normalization\n\tquaternion& Normalize();\n\t/// Conjugate\n\tquaternion& Conjugate();\n\t/// Inversion in place\n\tquaternion& Inverse();\n\t/// Squares the quaternion in place\n\tquaternion& Square();\n\t/// Axis rotation\n\tquaternion& AxisRotation(const double phi);\n};\n\n/// Negation\nquaternion operator-(quaternion& q);\n/// Addition\nquaternion operator+(const quaternion& q, const quaternion& r);\n/// Substraction\nquaternion operator-(const quaternion& q, const quaternion& r);\n/// Multiplication by a quaternion\nquaternion operator*(const quaternion& q, const quaternion& r);\n/// Multiplication by a constant\nquaternion operator*(const quaternion& q, const double d);\n/// Multiplication by a constant\nquaternion operator*(double d, const quaternion& q);\n/// Division by a quaternion\nquaternion operator/(const quaternion& q, const quaternion& r);\n/// Division by a constant\nquaternion operator/(const quaternion& q, const double d);\n/// Equality test\nbool operator==(const quaternion& q, const quaternion& r);\n/// Non-equality test\nbool operator!=(const quaternion& q, const quaternion& r);\n\n/// Output inserter\nstd::ostream& operator<<(std::ostream& Stream, const quaternion& Arg);\n/// Input extractor\nstd::istream& operator>>(std::istream& Stream, quaternion& Arg);\n\n/////////////////////////////////////////////////////////////////////////////\n// angle_axis\n\n/// Encapsulates an angle/axis representation of an object's orientation\nclass angle_axis\n{\npublic:\n\tdouble angle;\n\tvector3 axis;\n\n\t// Constructors ...\n\tangle_axis();\n\tangle_axis(const double Angle, const point3& Axis);\n\tangle_axis(const double Angle, const vector3& Axis);\n\tangle_axis(const double Angle, const double X, const double Y, const double Z);\n\tangle_axis(const double AngleAxis[4]);\n\tangle_axis(const quaternion& Quaternion);\n\t/// Copy constructor\n\tangle_axis(const angle_axis& AngleAxis);\n\t/// Assignment of an angle_axis\n\tangle_axis& operator=(const angle_axis& AngleAxis);\n\t/// Assignment of a quaternion\n\tangle_axis& operator=(const quaternion& Quaternion);\n\t/// Assignment of a C/C++ style array\n\tangle_axis& operator=(const double AngleAxis[4]);\n\t/// Casting to a C/C++ style array pointer\n\toperator double*() { return &angle; }\n\t/// Copies the vector into a C/C++ style array\n\tvoid CopyArray(float AngleAxis[4]) const;\n\t/// Copies the vector into a C/C++ style array\n\tvoid CopyArray(double AngleAxis[4]) const;\n};\n\n/// Equality test\nbool operator==(const angle_axis& a, const angle_axis& b);\n/// Non-equality test\nbool operator!=(const angle_axis& a, const angle_axis& b);\n\n/// Output inserter\nstd::ostream& operator<<(std::ostream& Stream, const angle_axis& Arg);\n/// Input extractor\nstd::istream& operator>>(std::istream& Stream, angle_axis& Arg);\n\n#define SDPEULERANGLEORDER(initialaxis, parity, repetition, frame) ((((((initialaxis << 1) + parity) << 1) + repetition) << 1) + frame)\n\n/// Encapsulates a set of Euler angles, including the order in which they should be applied\nclass euler_angles\n{\npublic:\n\n\t/// Enumerates what gets rotated - the axes themselves, or the frame they represent\n\ttypedef enum\n\t{\n\t\tStaticFrame = 0,\n\t\tRotatingFrame = 1,\n\t} OrderFrame;\n\n\t/// Enumerates whether the last axis will be the same as the first\n\ttypedef enum\n\t{\n\t\tNoRepetition = 0,\n\t\tRepeats = 1,\n\t} OrderRepetition;\n\n\t/// Enumerates which axes will become the second axis\n\ttypedef enum\n\t{\n\t\tEvenParity = 0,\n\t\tOddParity = 1,\n\t} OrderParity;\n\n\t/// Enumerates all possible axis order permutations\n\ttypedef enum\n\t{\n\t\tXYZstatic = SDPEULERANGLEORDER(0, EvenParity, NoRepetition, StaticFrame),\n\t\tXYXstatic = SDPEULERANGLEORDER(0, EvenParity, Repeats, StaticFrame),\n\t\tXZYstatic = SDPEULERANGLEORDER(0, OddParity, NoRepetition, StaticFrame),\n\t\tXZXstatic = SDPEULERANGLEORDER(0, OddParity, Repeats, StaticFrame),\n\t\tYZXstatic = SDPEULERANGLEORDER(1, EvenParity, NoRepetition, StaticFrame),\n\t\tYZYstatic = SDPEULERANGLEORDER(1, EvenParity, Repeats, StaticFrame),\n\t\tYXZstatic = SDPEULERANGLEORDER(1, OddParity, NoRepetition, StaticFrame),\n\t\tYXYstatic = SDPEULERANGLEORDER(1, OddParity, Repeats, StaticFrame),\n\t\tZXYstatic = SDPEULERANGLEORDER(2, EvenParity, NoRepetition, StaticFrame),\n\t\tZXZstatic = SDPEULERANGLEORDER(2, EvenParity, Repeats, StaticFrame),\n\t\tZYXstatic = SDPEULERANGLEORDER(2, OddParity, NoRepetition, StaticFrame),\n\t\tZYZstatic = SDPEULERANGLEORDER(2, OddParity, Repeats, StaticFrame),\n\t\tZYXrotating = SDPEULERANGLEORDER(0, EvenParity, NoRepetition, RotatingFrame),\n\t\tXYXrotating = SDPEULERANGLEORDER(0, EvenParity, Repeats, RotatingFrame),\n\t\tYZXrotating = SDPEULERANGLEORDER(0, OddParity, NoRepetition, RotatingFrame),\n\t\tXZXrotating = SDPEULERANGLEORDER(0, OddParity, Repeats, RotatingFrame),\n\t\tXZYrotating = SDPEULERANGLEORDER(1, EvenParity, NoRepetition, RotatingFrame),\n\t\tYZYrotating = SDPEULERANGLEORDER(1, EvenParity, Repeats, RotatingFrame),\n\t\tZXYrotating = SDPEULERANGLEORDER(1, OddParity, NoRepetition, RotatingFrame),\n\t\tYXYrotating = SDPEULERANGLEORDER(1, OddParity, Repeats, RotatingFrame),\n\t\tYXZrotating = SDPEULERANGLEORDER(2, EvenParity, NoRepetition, RotatingFrame),\n\t\tZXZrotating = SDPEULERANGLEORDER(2, EvenParity, Repeats, RotatingFrame),\n\t\tXYZrotating = SDPEULERANGLEORDER(2, OddParity, NoRepetition, RotatingFrame),\n\t\tZYZrotating = SDPEULERANGLEORDER(2, OddParity, Repeats, RotatingFrame),\n\t} AngleOrder;\n\n\t/// Stores the three axis angles\n\tdouble n[3];\n\t/// Stores the axis order in packed format\n\tAngleOrder order;\n\n\teuler_angles();\n\teuler_angles(point3 Angles, AngleOrder Order);\n\teuler_angles(double X, double Y, double Z, AngleOrder Order);\n\t/// Conversion from a quaternion\n\teuler_angles(const quaternion& Quaternion, AngleOrder Order);\n\t/// Conversion from a 4x4 matrix\n\teuler_angles(const matrix4& Matrix, AngleOrder Order);\n\n\t/// Returns the frame type from a packed order representation\n\tstatic OrderFrame Frame(AngleOrder& Order) { return OrderFrame(Order & 1); }\n\t/// Returns the repetition type from a packed order representation\n\tstatic OrderRepetition Repetition(AngleOrder& Order) { return OrderRepetition((Order >> 1) & 1); }\n\t/// Returns the parity type from a packed order representation\n\tstatic OrderParity Parity(AngleOrder& Order) { return OrderParity((Order >> 2) & 1); }\n\t/// Returns the axes in order, from a packed order representation\n\tstatic void Axes(AngleOrder& Order, int& i, int& j, int& k);\n\n\t/// Returns the frame type of this instance\n\tOrderFrame Frame() { return Frame(order); }\n\t/// Returns the repetition type of this instance\n\tOrderRepetition Repetition() { return Repetition(order); }\n\t/// Returns the parity type of this instance\n\tOrderParity Parity() { return Parity(order); }\n\t/// Returns the axes in order, for this instance\n\tvoid Axes(int& i, int& j, int& k) { Axes(order, i, j, k); }\n\n\t/// Returns the given angle by reference\n\tdouble& operator[](int i);\n\t/// Returns the given angle by value\n\tdouble operator[](int i) const;\n};\n\n/// Output inserter\nstd::ostream& operator<<(std::ostream& Stream, const euler_angles& Arg);\n/// Input extractor\nstd::istream& operator>>(std::istream& Stream, euler_angles& Arg);\n\n/// Returns a three-dimensional translation matrix\ninline const matrix4 translate3(const vector3& v)\n{\n\treturn matrix4(\n\t\tvector4(1, 0, 0, v[0]),\n\t\tvector4(0, 1, 0, v[1]),\n\t\tvector4(0, 0, 1, v[2]),\n\t\tvector4(0, 0, 0, 1));\n}\n\n/// Returns a three-dimensional translation matrix\ninline const matrix4 translate3(const double_t X, const double_t Y, const double_t Z)\n{\n\treturn matrix4(\n\t\tvector4(1, 0, 0, X),\n\t\tvector4(0, 1, 0, Y),\n\t\tvector4(0, 0, 1, Z),\n\t\tvector4(0, 0, 0, 1));\n}\n\n/// Returns a three-dimensional rotation matrix about an arbitrary axis\ninline const matrix4 rotate3(const double Angle, vector3 Axis)\n{\n\tconst double c = cos(Angle), s = sin(Angle), t = 1.0 - c;\n\n\tAxis = normalize(Axis);\n\n\treturn matrix4(\n\t\tvector4(t * Axis[0] * Axis[0] + c, t * Axis[0] * Axis[1] - s * Axis[2], t * Axis[0] * Axis[2] + s * Axis[1], 0),\n\t\tvector4(t * Axis[0] * Axis[1] + s * Axis[2], t * Axis[1] * Axis[1] + c, t * Axis[1] * Axis[2] - s * Axis[0], 0),\n\t\tvector4(t * Axis[0] * Axis[2] - s * Axis[1], t * Axis[1] * Axis[2] + s * Axis[0], t * Axis[2] * Axis[2] + c, 0),\n\t\tvector4(0, 0, 0, 1));\n}\n/// Returns a three-dimensional rotation matrix about an arbitrary axis\ninline const matrix4 rotate3(const angle_axis& AngleAxis)\n{\n\treturn rotate3(AngleAxis.angle, AngleAxis.axis);\n}\n/// Returns a three-dimensional rotation matrix based on a set of Euler angles\ninline const matrix4 rotate3(const point3& EulerAngles)\n{\n\tmatrix4 matrix = identity3();\n\tmatrix = matrix * rotate3(EulerAngles[1], vector3(0, 1, 0));\n\tmatrix = matrix * rotate3(EulerAngles[0], vector3(1, 0, 0));\n\tmatrix = matrix * rotate3(EulerAngles[2], vector3(0, 0, 1));\n\n\treturn matrix;\n}\n/// Returns a three-dimensional rotation matrix based on a quaternion\ninline const matrix4 rotate3(const quaternion& Quaternion)\n{\n\treturn rotate3(angle_axis(Quaternion));\n}\n/// Returns a quaternion based on a three-dimensional rotation matrix\ninline const quaternion rotate3(const matrix4& m)\n{\n\tdouble d0 = m[0][0];\n\tdouble d1 = m[1][1];\n\tdouble d2 = m[2][2];\n\n\tdouble trace = d0 + d1 + d2 + 1;\n\tif(trace > 0.0)\n\t{\n\t\tdouble s = 0.5 / std::sqrt(trace);\n\t\treturn quaternion(0.25 / s, s * point3(m[2][1] - m[1][2], m[0][2] - m[2][0], m[1][0] - m[0][1]));\n\t}\n\n\t// Identify the major diagonal element with greatest value\n\tif(d0 >= d1 && d0 >= d2)\n\t{\n\t\tdouble s = std::sqrt(1.0 + d0 - d1 - d2) * 2.0;\n\t\treturn quaternion(m[1][2] - m[2][1], point3(0.5, m[0][1] - m[1][0], m[0][2] - m[2][0])) / s;\n\t}\n\telse if(d1 >= d0 && d1 >= d2)\n\t{\n\t\tdouble s = std::sqrt(1.0 + d1 - d0 - d2) * 2.0;\n\t\treturn quaternion(m[0][2] - m[2][0], point3(m[0][1] - m[1][0], 0.5, m[1][2] - m[2][1])) / s;\n\t}\n\telse\n\t{\n\t\tdouble s = std::sqrt(1.0 + d2 - d0 - d1) * 2.0;\n\t\treturn quaternion(m[0][1] - m[1][0], point3(m[0][2] - m[2][0], m[1][2] - m[2][1], 0.5)) / s;\n\t}\n}\n\n/// Returns a three-dimensional scaling matrix that scales uniformly along each dimension.\ninline const matrix4 scale3(const double_t S)\n{\n\treturn matrix4(\n\t\tvector4(S, 0, 0, 0),\n\t\tvector4(0, S, 0, 0),\n\t\tvector4(0, 0, S, 0),\n\t\tvector4(0, 0, 0, 1));\n}\n\n/// Returns a three-dimensional scaling matrix that can scale non-uniformly along each dimension.\ninline const matrix4 scale3(const double_t X, const double_t Y, const double_t Z)\n{\n\treturn matrix4(\n\t\tvector4(X, 0, 0, 0),\n\t\tvector4(0, Y, 0, 0),\n\t\tvector4(0, 0, Z, 0),\n\t\tvector4(0, 0, 0, 1));\n}\n/// Returns a three-dimensional perspective matrix.\ninline const matrix4 perspective3(const double d)\n{\n\treturn matrix4(\n\t\tvector4(1, 0, 0, 0),\n\t\tvector4(0, 1, 0, 0),\n\t\tvector4(0, 0, 1, 0),\n\t\tvector4(0, 0, 1/d, 0));\n}\n/// Returns a three-dimensional shearing matrix.\ninline const matrix4 shear3(const double XY, const double XZ, const double YX, const double YZ, const double ZX, const double ZY)\n{\n\treturn matrix4(\n\t\tvector4(1, XY, XZ, 0),\n\t\tvector4(YX, 1, YZ, 0),\n\t\tvector4(ZX, ZY, 1, 0),\n\t\tvector4(0, 0, 0, 1));\n}\n\n/// Extract a \"look\" vector from a view matrix\ninline const vector3 look_vector(const matrix4& Matrix)\n{\n\treturn normalize(Matrix * vector3(0, 0, 1));\n}\n\n/// Extract an \"up\" vector from a view matrix\ninline const vector3 up_vector(const matrix4& Matrix)\n{\n\treturn normalize(Matrix * vector3(0, 1, 0));\n}\n\n/// Extract a \"right\" vector from a view matrix\ninline const vector3 right_vector(const matrix4& Matrix)\n{\n\treturn normalize(Matrix * vector3(1, 0, 0));\n}\n\n/// Extract position from a view matrix\ninline const point3 position(const matrix4& Matrix)\n{\n\treturn point3(Matrix[0][3], Matrix[1][3], Matrix[2][3]);\n}\n\n/// Construct a view matrix from look, up, right, and position data\ninline const matrix4 view_matrix(const vector3& Look, const vector3& Up, const point3& Position)\n{\n\tconst vector3 look = normalize(Look);\n\tconst vector3 right = normalize(Up ^ look);\n\tconst vector3 up = normalize(look ^ right);\n\n\treturn matrix4(\n\t\tvector4(right[0], up[0], look[0], Position[0]),\n\t\tvector4(right[1], up[1], look[1], Position[1]),\n\t\tvector4(right[2], up[2], look[2], Position[2]),\n\t\tvector4(0, 0, 0, 1));\n}\n\n//\tMatrix utilities for affine matrices.\n//\n//\tThe input matrix must be affine, but need not be orthogonal.\n//\tIn other words, it may contain scaling, rotation, and translation,\n//\tbut not perspective projection.\n//\tRef. Foley and Van Dam, 2nd ed, p. 217.\n//\n/// Extracts translation from a three-dimensional matrix\ninline const vector3 extract_translation(const matrix4& m)\n{\n\treturn(vector3(m[0][3], m[1][3], m[2][3]));\n}\n/// Extracts scaling from a matrix\ninline const matrix4 extract_scaling(const matrix4& m)\n{\n\treturn matrix4(\n\t\tvector4(sqrt(m[0][0] * m[0][0] + m[1][0] * m[1][0] + m[2][0] * m[2][0]), 0, 0, 0),\n\t\tvector4(0, sqrt(m[0][1] * m[0][1] + m[1][1] * m[1][1] + m[2][1] * m[2][1]), 0, 0),\n\t\tvector4(0, 0, sqrt(m[0][2] * m[0][2] + m[1][2] * m[1][2] + m[2][2] * m[2][2]), 0),\n\t\tvector4(0, 0, 0, 1));\n}\n/// Extracts rotation from a matrix\ninline const matrix4 extract_rotation(const matrix4& m)\n{\n\t// Get scaling ...\n\tconst double scale_x = sqrt(m[0][0] * m[0][0] + m[1][0] * m[1][0] + m[2][0] * m[2][0]);\n\tconst double scale_y = sqrt(m[0][1] * m[0][1] + m[1][1] * m[1][1] + m[2][1] * m[2][1]);\n\tconst double scale_z = sqrt(m[0][2] * m[0][2] + m[1][2] * m[1][2] + m[2][2] * m[2][2]);\n\treturn_val_if_fail(scale_x && scale_y && scale_z, identity3());\n\n\t// Apply inverse of scaling as a transformation, to get unit scale ...\n\tmatrix4 unscaled(m * scale3(1.0 / scale_x, 1.0 / scale_y, 1.0 / scale_z));\n\n\treturn matrix4(\n\t\tvector4(unscaled[0][0], unscaled[0][1], unscaled[0][2], 0),\n\t\tvector4(unscaled[1][0], unscaled[1][1], unscaled[1][2], 0),\n\t\tvector4(unscaled[2][0], unscaled[2][1], unscaled[2][2], 0),\n\t\tvector4(0, 0, 0, 1));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// point3 implementation\n\ninline point3 operator*(const matrix4& a, const point3& v)\n{\n\tconst point4 result = a * point4(v[0], v[1], v[2], 1);\n\treturn point3(result[0] / result[3], result[1] / result[3], result[2] / result[3]);\n}\n\ninline point3 operator*(const point3& v, const matrix4& a)\n{\n\treturn transpose(a) * v;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// point4 implementation\n\ninline point4 operator*(const matrix4& a, const point4& v)\n{\n#define ROWCOL(i) a.v[i].n[0]*v.n[0] + a.v[i].n[1]*v.n[1] + a.v[i].n[2]*v.n[2] + a.v[i].n[3]*v.n[3]\n\treturn point4(ROWCOL(0), ROWCOL(1), ROWCOL(2), ROWCOL(3));\n#undef ROWCOL // (i)\n}\n\ninline point4 operator*(const point4& v, const matrix4& a)\n{\n\treturn transpose(a) * v;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// matrix4 implementation\n\ninline matrix4::matrix4() {}\n\ninline matrix4::matrix4(const vector4& v0, const vector4& v1, const vector4& v2, const vector4& v3)\n{ v[0] = v0; v[1] = v1; v[2] = v2; v[3] = v3; }\n\ninline matrix4::matrix4(const double d)\n{ v[0] = v[1] = v[2] = v[3] = vector4(d, d, d, d); }\n\ninline matrix4::matrix4(const matrix4& m)\n{ v[0] = m.v[0]; v[1] = m.v[1]; v[2] = m.v[2]; v[3] = m.v[3]; }\n\ninline matrix4::matrix4(euler_angles Angles)\n{\n\tconst euler_angles::OrderFrame frame = Angles.Frame();\n\tconst euler_angles::OrderParity parity = Angles.Parity();\n\tconst euler_angles::OrderRepetition repetition = Angles.Repetition();\n\tint i, j, k;\n\tAngles.Axes(i, j, k);\n\n\tif(frame == euler_angles::RotatingFrame)\n\t\tstd::swap(Angles.n[0], Angles.n[2]);\n\n\tif(parity == euler_angles::OddParity)\n\t{\n\t\tAngles.n[0] = -Angles.n[0];\n\t\tAngles.n[1] = -Angles.n[1];\n\t\tAngles.n[2] = -Angles.n[2];\n\t}\n\n\tconst double ti = Angles.n[0], tj = Angles.n[1], th = Angles.n[2];\n\tconst double ci = cos(ti), cj = cos(tj), ch = cos(th);\n\tconst double si = sin(ti), sj = sin(tj), sh = sin(th);\n\tconst double cc = ci*ch, cs = ci*sh;\n\tconst double sc = si*ch, ss = si*sh;\n\n\tmatrix4 m = identity3();\n\tif(repetition == euler_angles::Repeats)\n\t{\n\t\tm[i][i] =  cj;\t\tm[i][j] =  sj*si;\tm[i][k] =  sj*ci;\n\t\tm[j][i] =  sj*sh;\tm[j][j] = -cj*ss+cc;\tm[j][k] = -cj*cs-sc;\n\t\tm[k][i] = -sj*ch;\tm[k][j] =  cj*sc+cs;\tm[k][k] =  cj*cc-ss;\n\t}\n\telse\n\t{\n\t\tm[i][i] =  cj*ch;\tm[i][j] = sj*sc-cs;\tm[i][k] = sj*cc+ss;\n\t\tm[j][i] =  cj*sh;\tm[j][j] = sj*ss+cc;\tm[j][k] = sj*cs-sc;\n\t\tm[k][i] = -sj;\t\tm[k][j] = cj*si;\tm[k][k] = cj*ci;\n\t}\n\n\t*this = m;\n}\n\ninline matrix4& matrix4::operator=(const matrix4& m)\n{ v[0] = m.v[0]; v[1] = m.v[1]; v[2] = m.v[2]; v[3] = m.v[3];\nreturn *this; }\n\n/*\ninline matrix4& matrix4::operator=(const double d[4][4])\n{ v[0] = d[0]; v[1] = d[1]; v[2] = d[2]; v[3] = d[3]; return *this; }\n*/\n\ninline matrix4& matrix4::operator=(const double d[16])\n{ memcpy(&v[0][0], &d[0], 16 * sizeof(double)); return *this; }\n\ninline matrix4& matrix4::operator+=(const matrix4& m)\n{ v[0] += m.v[0]; v[1] += m.v[1]; v[2] += m.v[2]; v[3] += m.v[3];\nreturn *this; }\n\ninline matrix4& matrix4::operator-=(const matrix4& m)\n{ v[0] -= m.v[0]; v[1] -= m.v[1]; v[2] -= m.v[2]; v[3] -= m.v[3];\nreturn *this; }\n\ninline matrix4& matrix4::operator*=(const double d)\n{ v[0] *= d; v[1] *= d; v[2] *= d; v[3] *= d; return *this; }\n\ninline matrix4& matrix4::operator/=(const double d)\n{\n\treturn_val_if_fail(d, *this);\n\n\tconst double inv = 1./d;\n\tv[0] *= inv;\n\tv[1] *= inv;\n\tv[2] *= inv;\n\tv[3] *= inv;\n\treturn *this;\n}\n\ninline vector4& matrix4::operator[](int i)\n{\n\treturn v[i];\n}\n\ninline const vector4& matrix4::operator[](int i) const\n{\n\treturn v[i];\n}\n\ninline void matrix4::CopyArray(float m[16]) const\n{\n\tunsigned long index = 0;\n\tfor(unsigned long i = 0; i < 4; ++i)\n\t\tfor(unsigned long j = 0; j < 4; ++j)\n\t\t\tm[index++] = float(v[i][j]);\n}\n\ninline void matrix4::CopyArray(double m[16]) const\n{\n\tunsigned long index = 0;\n\tfor(unsigned long i = 0; i < 4; ++i)\n\t\tfor(unsigned long j = 0; j < 4; ++j)\n\t\t\tm[index++] = v[i][j];\n}\n\ninline matrix4 operator-(const matrix4& a)\n{ return matrix4(-a.v[0], -a.v[1], -a.v[2], -a.v[3]); }\n\ninline matrix4 operator+(const matrix4& a, const matrix4& b)\n{ return matrix4(a.v[0] + b.v[0], a.v[1] + b.v[1], a.v[2] + b.v[2], a.v[3] + b.v[3]); }\n\ninline matrix4 operator-(const matrix4& a, const matrix4& b)\n{ return matrix4(a.v[0] - b.v[0], a.v[1] - b.v[1], a.v[2] - b.v[2], a.v[3] - b.v[3]); }\n\ninline matrix4 operator*(const matrix4& a, const matrix4& b)\n{\n#define ROWCOL(i, j) a.v[i].n[0]*b.v[0][j] + a.v[i].n[1]*b.v[1][j] + a.v[i].n[2]*b.v[2][j] + a.v[i].n[3]*b.v[3][j]\n\treturn matrix4(\n\t\tvector4(ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2), ROWCOL(0,3)),\n\t\tvector4(ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2), ROWCOL(1,3)),\n\t\tvector4(ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2), ROWCOL(2,3)),\n\t\tvector4(ROWCOL(3,0), ROWCOL(3,1), ROWCOL(3,2), ROWCOL(3,3)));\n}\n\ninline matrix4 operator*(const matrix4& a, const double d)\n{ return matrix4(a.v[0] * d, a.v[1] * d, a.v[2] * d, a.v[3] * d); }\n\ninline matrix4 operator*(const double d, const matrix4& a)\n{ return a*d; }\n\ninline matrix4 operator/(const matrix4& a, const double d)\n{\n\treturn_val_if_fail(d, matrix4());\n\n\tconst double inv = 1./d;\n\treturn matrix4(a.v[0] * inv, a.v[1] * inv, a.v[2] * inv, a.v[3] * inv);\n}\n\ninline bool operator==(const matrix4& a, const matrix4& b)\n{ return ((a.v[0] == b.v[0]) && (a.v[1] == b.v[1]) && (a.v[2] == b.v[2]) && (a.v[3] == b.v[3])); }\n\ninline bool operator!=(const matrix4& a, const matrix4& b)\n{ return !(a == b); }\n\ninline std::ostream& operator<<(std::ostream& Stream, const matrix4& Arg)\n{\n\tStream << Arg[0] << \" \" << Arg[1] << \" \" << Arg[2] << \" \" << Arg[3];\n\treturn Stream;\n}\n\ninline std::istream& operator>>(std::istream& Stream, matrix4& Arg)\n{\n\tStream >> Arg[0] >> Arg[1] >> Arg[2] >> Arg[3];\n\treturn Stream;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// quaternion implementation\n\ninline quaternion::quaternion()\n{ w = 1.0; v = vector3(0, 0, 0); }\n\ninline quaternion::quaternion(const double u, const point3& t)\n{ w = u; v = to_vector(t); }\n\ninline quaternion::quaternion(const double u, const vector3& t)\n{ w = u; v = t; }\n\ninline quaternion::quaternion(const double u, const double x, const double y, const double z)\n{ w = u; v = vector3(x, y, z); }\n\ninline quaternion::quaternion(const angle_axis& AngleAxis)\n{ w = cos(AngleAxis.angle * 0.5); vector3 axis = k3d::normalize(AngleAxis.axis); v = sin(AngleAxis.angle * 0.5) * axis; }\n\ninline quaternion::quaternion(euler_angles Angles)\n{\n\tconst euler_angles::OrderFrame frame = Angles.Frame();\n\tconst euler_angles::OrderParity parity = Angles.Parity();\n\tconst euler_angles::OrderRepetition repetition = Angles.Repetition();\n\tint i, j, k;\n\tAngles.Axes(i, j, k);\n\n\tif(frame == euler_angles::RotatingFrame)\n\t\tstd::swap(Angles.n[0], Angles.n[2]);\n\n\tif(parity == euler_angles::OddParity)\n\t\tAngles.n[1] = -Angles.n[1];\n\n\tconst double ti = Angles.n[0]*0.5, tj = Angles.n[1]*0.5, th = Angles.n[2]*0.5;\n\tconst double ci = cos(ti), cj = cos(tj), ch = cos(th);\n\tconst double si = sin(ti), sj = sin(tj), sh = sin(th);\n\tconst double cc = ci*ch, cs = ci*sh;\n\tconst double sc = si*ch, ss = si*sh;\n\n\tif(repetition == euler_angles::Repeats)\n\t{\n\t\tv[i] = cj*(cs + sc);\n\t\tv[j] = sj*(cc + ss);\n\t\tv[k] = sj*(cs - sc);\n\t\tw = cj*(cc - ss);\n\t}\n\telse\n\t{\n\t\tv[i] = cj*sc - sj*cs;\n\t\tv[j] = cj*ss + sj*cc;\n\t\tv[k] = cj*cs - sj*sc;\n\t\tw = cj*cc + sj*ss;\n\t}\n\n\tif(parity == euler_angles::OddParity)\n\t\tv[j] = -v[j];\n}\n\ninline quaternion& quaternion::operator=(const quaternion& q)\n{ w = q.w; v = q.v; return *this; }\n\ninline quaternion& quaternion::operator=(const angle_axis& AngleAxis)\n{ w = cos(AngleAxis.angle * 0.5); vector3 axis = k3d::normalize(AngleAxis.axis); v = sin(AngleAxis.angle * 0.5) * axis; return *this; }\n\ninline quaternion& quaternion::operator*=(const double d)\n{ w *= d; v *= d; return *this; }\n\ninline quaternion& quaternion::operator/=(const double d)\n{\n\treturn_val_if_fail(d, *this);\n\n\tconst double inv = 1./d;\n\tw *= inv;\n\tv *= inv;\n\treturn *this;\n}\n\ninline quaternion& quaternion::operator+=(const quaternion& q)\n{ w += q.w; v += q.v; return *this; }\n\ninline quaternion& quaternion::operator-=(const quaternion& q)\n{ w -= q.w; v -= q.v; return *this; }\n\ninline quaternion& quaternion::operator*=(const quaternion& q)\n{ w = w*q.w - (v*q.v); v = q.w*v + w*q.v + (v^q.v); return *this; }\n\ninline quaternion& quaternion::operator/=(const quaternion& q)\n{ quaternion t = q; (*this) *= t.Inverse(); return *this; }\n\ninline double quaternion::Magnitude() const\n{ return std::sqrt(w*w + v.length2()); }\n\ninline quaternion& quaternion::Normalize()\n{\n\tif(const double magnitude = Magnitude())\n\t\t*this /= magnitude;\n\n\treturn *this;\n}\n\ninline quaternion& quaternion::Conjugate()\n{ v = -v; return *this; }\n\ninline quaternion& quaternion::Inverse()\n{ if(Magnitude() != 0.0) { const double i = 1.0 / Magnitude(); w *= i; v *= -i; } return *this; }\n\ninline quaternion& quaternion::Square()\n{ const double t = 2*w; w = w*w - v.length2(); v *= t; return *this; }\n\ninline quaternion& quaternion::AxisRotation(const double phi)\n{ v = k3d::normalize(v); v *= sin(phi/2.0); w = cos(phi/2); return *this; }\n\ninline quaternion operator-(const quaternion& q)\n{ return quaternion(-q.w,-q.v); }\n\ninline quaternion operator+(const quaternion& q, const quaternion& r)\n{ return quaternion(q.w + r.w, q.v + r.v); }\n\ninline quaternion operator-(const quaternion& q, const quaternion& r)\n{ return quaternion(q.w - r.w, q.v - r.v); }\n\ninline quaternion operator*(const quaternion& q, const quaternion& r)\n{ return quaternion(q.w*r.w - (q.v*r.v), q.w*r.v + r.w*q.v + (q.v^r.v)); }\n\ninline quaternion operator*(const quaternion& q, const double d)\n{ return quaternion(q.w*d, q.v*d); }\n\ninline quaternion operator*(const double d, const quaternion& q)\n{ return quaternion(q.w*d, q.v*d); }\n\ninline quaternion operator/(const quaternion& q, const quaternion& r)\n{ quaternion t = r; return q*t.Inverse(); }\n\ninline quaternion operator/(const quaternion& q, const double d)\n{\n\treturn_val_if_fail(d, quaternion());\n\n\tconst double inv = 1./d;\n\treturn quaternion(q.w * inv, q.v * inv);\n}\n\ninline bool operator==(const quaternion& q, const quaternion& r)\n{ return ((q.w == r.w) && (q.v == r.v)); }\n\ninline bool operator!=(const quaternion& q, const quaternion& r)\n{ return !(q == r); }\n\ninline std::ostream& operator<<(std::ostream& Stream, const quaternion& Arg)\n{\n\tStream << Arg.w << \" \" << Arg.v[0] << \" \" << Arg.v[1] << \" \" << Arg.v[2];\n\treturn Stream;\n}\n\ninline std::istream& operator>>(std::istream& Stream, quaternion& Arg)\n{\n\tStream >> Arg.w >> Arg.v[0] >> Arg.v[1] >> Arg.v[2];\n\treturn Stream;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// angle_axis implementation ...\n\ninline angle_axis::angle_axis()\n{ angle = 0.0; axis = vector3(0, 0, 1); }\n\ninline angle_axis::angle_axis(const double Angle, const point3& Axis)\n{ angle = Angle; axis = normalize(to_vector(Axis)); }\n\ninline angle_axis::angle_axis(const double Angle, const vector3& Axis)\n{ angle = Angle; axis = normalize(Axis); }\n\ninline angle_axis::angle_axis(const double Angle, const double X, const double Y, const double Z)\n{ angle = Angle; axis[0] = X; axis[1] = Y; axis[2] = Z; axis = normalize(axis); }\n\ninline angle_axis::angle_axis(const double AngleAxis[4])\n{ angle = AngleAxis[0]; axis[0] = AngleAxis[1]; axis[1] = AngleAxis[2]; axis[2] = AngleAxis[3]; axis = normalize(axis); }\n\ninline angle_axis::angle_axis(const quaternion& Quaternion)\n{\n\tquaternion q = Quaternion;\n\tq.Normalize();\n\tconst double halftheta = acos(q.w);\n\tconst double sinhalftheta = sin(halftheta);\n\n\tangle = 2.0 * halftheta;\n\tif(sinhalftheta != 0.0)\n\t\taxis = q.v / sinhalftheta;\n\telse\n\t\taxis = vector3(0, 0, 1);\n}\n\ninline angle_axis::angle_axis(const angle_axis& AngleAxis)\n{ angle = AngleAxis.angle; axis = AngleAxis.axis; }\n\ninline angle_axis& angle_axis::operator=(const angle_axis& AngleAxis)\n{ angle = AngleAxis.angle; axis = AngleAxis.axis; return *this; }\n\ninline angle_axis& angle_axis::operator=(const quaternion& Quaternion)\n{\n\tconst double halftheta = acos(Quaternion.w);\n\tconst double sinhalftheta = sin(halftheta);\n\n\tangle = 2.0 * halftheta;\n\tif(sinhalftheta != 0.0)\n\t\taxis = Quaternion.v / sinhalftheta;\n\telse\n\t\taxis = vector3(0, 0, 1);\n\n\treturn *this;\n}\n\ninline angle_axis& angle_axis::operator=(const double AngleAxis[4])\n{ angle = AngleAxis[0]; axis[0] = AngleAxis[1]; axis[1] = AngleAxis[2]; axis[2] = AngleAxis[3]; return *this; }\n\ninline void angle_axis::CopyArray(float AngleAxis[4]) const\n{\tAngleAxis[0] = float(angle); AngleAxis[1] = float(axis[0]); AngleAxis[2] = float(axis[1]); AngleAxis[3] = float(axis[2]); }\n\ninline void angle_axis::CopyArray(double AngleAxis[4]) const\n{\tAngleAxis[0] = angle; AngleAxis[1] = axis[0]; AngleAxis[2] = axis[1]; AngleAxis[3] = axis[2]; }\n\ninline bool operator==(const angle_axis& a, const angle_axis& b)\n{\treturn ((a.angle == b.angle) && (a.axis == b.axis)); }\ninline bool operator!=(const angle_axis& a, const angle_axis& b)\n{\treturn !(a == b); }\n\ninline std::ostream& operator<<(std::ostream& Stream, const angle_axis& Arg)\n{\n\tStream << Arg.angle << \" \" << Arg.axis[0] << \" \" << Arg.axis[1] << \" \" << Arg.axis[2];\n\treturn Stream;\n}\n\ninline std::istream& operator>>(std::istream& Stream, angle_axis& Arg)\n{\n\tStream >> Arg.angle >> Arg.axis[0] >> Arg.axis[1] >> Arg.axis[2];\n\treturn Stream;\n}\n\n//\tUnit quaternion utilities.\n//\n//\tThose special functions deal with rotations, thus require unit quaternions.\n//\n\n//\tEuler/Matrix/Quaternion conversion functions are based on Ken Shoemake code,\n//\tfrom Graphic Gems IV\n\n/// Returns the spherical linear interpolation between two quaternions\ninline quaternion Slerp(const quaternion& q1, const quaternion& q2, double t)\n{\n\t// Calculate the angle between the two quaternions ...\n\tdouble cosangle = q1.w * q2.w + q1.v * q2.v;\n\n\tif(cosangle < -1.0)\n\t\tcosangle = -1.0;\n\tif(cosangle > 1.0)\n\t\tcosangle = 1.0;\n\n\t// If the angle is reasonably large, do the spherical interpolation\n\tif(1.0 - cosangle > 16 * FLT_EPSILON)\n\t{\n\t\tconst double angle = acos(cosangle);\n\t\treturn (sin((1.0 - t)*angle)*q1 + sin(t*angle)*q2) / sin(angle);\n\t}\n\n\t// The angle is too close to zero - do a linear interpolation\n\treturn mix(q1, q2, t);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// euler_angles implementation\n\ninline euler_angles::euler_angles()\n{\n\tn[0] = n[1] = n[2] = 0.0;\n\torder = YXZstatic;\n}\n\ninline euler_angles::euler_angles(point3 Angles, AngleOrder Order)\n{\n\tn[0] = Angles[0];\n\tn[1] = Angles[1];\n\tn[2] = Angles[2];\n\torder = Order;\n}\n\ninline euler_angles::euler_angles(double X, double Y, double Z, AngleOrder Order)\n{\n\tn[0] = X;\n\tn[1] = Y;\n\tn[2] = Z;\n\torder = Order;\n}\n\ninline euler_angles::euler_angles(const quaternion& Quaternion, AngleOrder Order)\n{\n\tconst double NQuaternion = Quaternion.Magnitude();\n\tconst double s = (NQuaternion > 0.0) ? (2.0 / NQuaternion) : 0.0;\n\n\tconst double xs = Quaternion.v[0]*s, ys = Quaternion.v[1]*s, zs = Quaternion.v[2]*s;\n\tconst double wx = Quaternion.w*xs, wy = Quaternion.w*ys, wz = Quaternion.w*zs;\n\tconst double xx = Quaternion.v[0]*xs, xy = Quaternion.v[0]*ys, xz = Quaternion.v[0]*zs;\n\tconst double yy = Quaternion.v[1]*ys, yz = Quaternion.v[1]*zs, zz = Quaternion.v[2]*zs;\n\n\tmatrix4 matrix = identity3();\n\tmatrix[0][0] = 1.0 - (yy + zz);\n\tmatrix[0][1] = xy - wz;\n\tmatrix[0][2] = xz + wy;\n\tmatrix[1][0] = xy + wz;\n\tmatrix[1][1] = 1.0 - (xx + zz);\n\tmatrix[1][2] = yz - wx;\n\tmatrix[2][0] = xz - wy;\n\tmatrix[2][1] = yz + wx;\n\tmatrix[2][2] = 1.0 - (xx + yy);\n\n\t*this = euler_angles(matrix, Order);\n}\n\ninline euler_angles::euler_angles(const matrix4& Matrix, AngleOrder Order)\n{\n\tOrderRepetition repetition = Repetition(Order);\n\tOrderParity parity = Parity(Order);\n\tOrderFrame frame = Frame(Order);\n\tint i, j, k;\n\tAxes(Order, i, j, k);\n\n\tif(repetition == euler_angles::Repeats)\n\t{\n\t\tconst double sy = sqrt(Matrix[i][j]*Matrix[i][j] + Matrix[i][k]*Matrix[i][k]);\n\t\tif(sy > 16*FLT_EPSILON)\n\t\t{\n\t\t\tn[0] = atan2(Matrix[i][j], Matrix[i][k]);\n\t\t\tn[1] = atan2(sy, Matrix[i][i]);\n\t\t\tn[2] = atan2(Matrix[j][i], -Matrix[k][i]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tn[0] = atan2(-Matrix[j][k], Matrix[j][j]);\n\t\t\tn[1] = atan2(sy, Matrix[i][i]);\n\t\t\tn[2] = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\tconst double cy = sqrt(Matrix[i][i]*Matrix[i][i] + Matrix[j][i]*Matrix[j][i]);\n\t\tif(cy > 16*FLT_EPSILON)\n\t\t{\n\t\t\tn[0] = atan2(Matrix[k][j], Matrix[k][k]);\n\t\t\tn[1] = atan2(-Matrix[k][i], cy);\n\t\t\tn[2] = atan2(Matrix[j][i], Matrix[i][i]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tn[0] = atan2(-Matrix[j][k], Matrix[j][j]);\n\t\t\tn[1] = atan2(-Matrix[k][i], cy);\n\t\t\tn[2] = 0;\n\t\t}\n\t}\n\n\tif(parity == euler_angles::OddParity)\n\t{\n\t\tn[0] = -n[0];\n\t\tn[1] = -n[1];\n\t\tn[2] = -n[2];\n\t}\n\n\tif(frame == euler_angles::RotatingFrame)\n\t\tstd::swap(n[0], n[2]);\n\n\torder = Order;\n}\n\ninline void euler_angles::Axes(AngleOrder& Order, int& i, int& j, int& k)\n{\n\tconst int safe[4] = {0, 1, 2, 0};\n\tconst int next[4] = {1, 2, 0, 1};\n\n\ti = safe[(Order >> 3) & 3];\n\tj = next[i + Parity(Order)];\n\tk = next[i + 1 - Parity(Order)];\n}\n\ninline double& euler_angles::operator[](int i)\n{\n\treturn_val_if_fail((i >= 0 && i <= 2), n[0]);\n\treturn n[i];\n}\n\ninline double euler_angles::operator[](int i) const\n{\n\treturn_val_if_fail((i >= 0 && i <= 2), n[0]);\n\treturn n[i];\n}\n\ninline std::ostream& operator<<(std::ostream& Stream, const euler_angles& Arg)\n{\n\tStream << Arg.n[0] << \" \" << Arg.n[1] << \" \" << Arg.n[2] << \" \" << int(Arg.order);\n\treturn Stream;\n}\n\ninline std::istream& operator>>(std::istream& Stream, euler_angles& Arg)\n{\n\tint order;\n\tStream >> Arg.n[0] >> Arg.n[1] >> Arg.n[2] >> order;\n\n\tArg.order = euler_angles::AngleOrder(order);\n\n\treturn Stream;\n}\n\nnamespace difference\n{\n\n/// Specialization of difference::test for matrix4 \ninline void test(const matrix4& A, const matrix4& B, accumulator& Result)\n{\n\trange_test(A.v, A.v + 4, B.v, B.v + 4, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_ALGEBRA_H\n\n"
  },
  {
    "path": "k3dsdk/application.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Provides singleton access to the global K-3D object\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/register_application.h>\n\n#include <cassert>\n\nnamespace\n{\n\nk3d::iapplication* g_application = 0;\n\n} // namespace\n\nnamespace k3d\n{\n\nvoid register_application(k3d::iapplication& Application)\n{\n\tassert(!g_application);\n\tg_application = &Application;\n}\n\niapplication& application()\n{\n\tassert(g_application);\n\treturn *g_application;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/application.h",
    "content": "#ifndef K3DSDK_APPLICATION_H\n#define K3DSDK_APPLICATION_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nclass iapplication;\n\n/// Returns the global singleton K-3D application object\niapplication& application();\n\n} // namespace k3d\n\n#endif // !K3DSDK_APPLICATION_H\n\n"
  },
  {
    "path": "k3dsdk/application_detail.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/application_detail.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/document.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/iapplication_plugin_factory.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/iscripted_action.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/signal_accumulators.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <fstream>\n#include <iostream>\n#include <map>\n\n#ifdef\tinterface\n#undef\tinterface\n#endif\t// interface\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// application_implementation::implementation\n\n/// Encapsulates the running K-3D server application\nclass application_implementation::implementation :\n\tpublic k3d::iapplication\n{\npublic:\n\timplementation()\n\t{\n\t}\n\n\t~implementation()\n\t{\n\t\t// Notify observers that we're going away ...\n\t\tm_close_signal.emit();\n\n\t\t// Delete any remaining documents ...\n\t\tfor(document_collection_t::iterator document = m_documents.begin(); document != m_documents.end(); document = m_documents.begin())\n\t\t\tclose_document(**document);\n\t}\n\n\tbool exit()\n\t{\n\t\treturn m_exit_signal.emit();\n\t}\n\n\tk3d::idocument* create_document()\n\t{\n\t\t// Create the new document ...\n\t\tk3d::idocument* const document = k3d::create_document();\n\t\treturn_val_if_fail(document, 0);\n\t\tm_documents.push_back(document);\n\n\t\t// Create any auto-start plugins ...\n\t\tconst plugin::factory::collection_t factories = plugin::factory::lookup();\n\t\tfor(plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t\t{\n\t\t\tiplugin_factory::metadata_t metadata = (**factory).metadata();\n\n\t\t\tif(!metadata.count(\"k3d:document-start\"))\n\t\t\t\tcontinue;\n\n\t\t\tlog() << info << \"Creating plugin [\" << (**factory).name() << \"] via k3d:document-start\" << std::endl;\n\n\t\t\tiunknown* const plugin = plugin::create(**factory);\n\t\t\tif(!plugin)\n\t\t\t{\n\t\t\t\tlog() << error << \"Error creating plugin [\" << (**factory).name() << \"] via k3d:document-start\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tm_auto_start_plugins.insert(std::make_pair(document, plugin));\n\n\t\t\tif(iscripted_action* const scripted_action = dynamic_cast<iscripted_action*>(plugin))\n\t\t\t{\n\t\t\t\tiscript_engine::context context;\n\t\t\t\tcontext[\"command\"] = string_t(\"startup\");\n\t\t\t\tcontext[\"document\"] = document;\n\t\t\t\tscripted_action->execute(context);\n\t\t\t}\n\t\t}\n\n\t\treturn document;\n\t}\n\n\tvoid close_document(k3d::idocument& Document)\n\t{\n\t\t// Notify observers that the document will be closed\n\t\tm_close_document_signal.emit(Document);\n\n\t\t// Shut-down any auto-start plugins associated with this document ...\n\t\tconst auto_start_plugins_t::iterator plugin_begin = m_auto_start_plugins.lower_bound(&Document);\n\t\tconst auto_start_plugins_t::iterator plugin_end = m_auto_start_plugins.upper_bound(&Document);\n\t\tfor(auto_start_plugins_t::iterator plugin = plugin_begin; plugin != plugin_end; ++plugin)\n\t\t{\n\t\t\tif(k3d::iscripted_action* const scripted_action = dynamic_cast<k3d::iscripted_action*>(plugin->second))\n\t\t\t{\n\t\t\t\tk3d::iscript_engine::context context;\n\t\t\t\tcontext[\"command\"] = k3d::string_t(\"shutdown\");\n\t\t\t\tcontext[\"document\"] = &Document;\n\t\t\t\tscripted_action->execute(context);\n\t\t\t}\n\t\t}\n\n\t\tfor(auto_start_plugins_t::iterator plugin = plugin_begin; plugin != plugin_end; ++plugin)\n\t\t\tdelete plugin->second;\n\n\t\tm_auto_start_plugins.erase(&Document);\n\n\t\t// Remove it from the document list ...\n\t\tm_documents.erase(std::remove(m_documents.begin(), m_documents.end(), &Document), m_documents.end());\n\n\t\t// Delete the document ...\n\t\tk3d::close_document(Document);\n\t}\n\n\tconst k3d::iapplication::document_collection_t documents()\n\t{\n\t\treturn m_documents;\n\t}\n\n\tk3d::iapplication::startup_message_signal_t& startup_message_signal()\n\t{\n\t\treturn m_startup_message_signal;\n\t}\n\n\tsigc::connection connect_close_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_close_signal.connect(Slot);\n\t}\n\n\tsigc::connection connect_close_document_signal(const sigc::slot<void, idocument&>& Slot)\n\t{\n\t\treturn m_close_document_signal.connect(Slot);\n\t}\n\n\t/// Stores the collection of open documents\n\tdocument_collection_t m_documents;\n\t/// Stores any per-document auto-start plugins\n\ttypedef std::multimap<k3d::idocument*, k3d::iunknown*> auto_start_plugins_t;\n\t/// Stores any per-document auto-start plugins\n\tauto_start_plugins_t m_auto_start_plugins;\n\t/// Signal emitted to display progress during application startup\n\tstartup_message_signal_t m_startup_message_signal;\n\t/// Signal emitted when the application is closing\n\tsigc::signal<void> m_close_signal;\n\t/// Signal emitted when an open document is closed\n\tsigc::signal<void, idocument&> m_close_document_signal;\n\t/// Signal emitted to request application close\n\tsigc::signal0<bool, signal::cancelable> m_exit_signal;\n};\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////\n// application_implementation\n\napplication_implementation::application_implementation() :\n\tm_implementation(new implementation())\n{\n}\n\napplication_implementation::~application_implementation()\n{\n\tdelete m_implementation;\n}\n\niapplication& application_implementation::interface()\n{\n\treturn *m_implementation;\n}\n\nsigc::connection application_implementation::connect_exit_signal(const sigc::slot<bool>& Slot)\n{\n\treturn m_implementation->m_exit_signal.connect(Slot);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/application_detail.h",
    "content": "#ifndef K3DSDK_APPLICATION_DETAIL_H\n#define K3DSDK_APPLICATION_DETAIL_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/signal_accumulators.h>\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nclass iapplication;\n\n/// Provides an implementation of k3d::iapplication for use by embedders\nclass application_implementation\n{\npublic:\n\tapplication_implementation();\n\t~application_implementation();\n\n\t/// Returns the underlying k3d::iapplication implementation\n\tiapplication& interface();\n\n\t/// Connects a slot that will be called to request application exit - observers may return false to indicate that this isn't possible (e.g. because we're embedded in a scripting engine)\n\tsigc::connection connect_exit_signal(const sigc::slot<bool>& Slot);\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_APPLICATION_DETAIL_H\n\n"
  },
  {
    "path": "k3dsdk/application_plugin_factory.h",
    "content": "#ifndef K3DSDK_APPLICATION_PLUGIN_FACTORY_H\n#define K3DSDK_APPLICATION_PLUGIN_FACTORY_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iapplication_plugin_factory.h>\n#include <k3dsdk/interface_list.h>\n#include <k3dsdk/plugin_factory.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// application_plugin_factory\n\ntemplate<typename plugin_t, typename interface_list = null_interface>\nclass application_plugin_factory :\n\tpublic plugin_factory,\n\tpublic iapplication_plugin_factory\n{\npublic:\n\tapplication_plugin_factory(const uuid& FactoryID, const std::string& Name, const std::string& ShortDescription, const std::string& Categories, const quality_t Quality = STABLE, const metadata_t& Metadata = metadata_t()) :\n\t\tplugin_factory(FactoryID, Name, ShortDescription, Categories, Quality, Metadata)\n\t{\n\t}\n\n\tiunknown* create_plugin()\n\t{\n\t\treturn new plugin_t();\n\t}\n\n\tbool implements(const std::type_info& InterfaceType)\n\t{\n\t\treturn implements_interface<interface_list>()(InterfaceType);\n\t}\n\n\tconst interfaces_t interfaces()\n\t{\n\t\tinterfaces_t results;\n\t\tget_interfaces<interface_list>()(results);\n\t\treturn results;\n\t}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_APPLICATION_PLUGIN_FACTORY_H\n\n"
  },
  {
    "path": "k3dsdk/array.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/array.h>\n#include <k3dsdk/iomanip.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// array\n\narray::array()\n{\n}\n\narray::array(const metadata_t& Metadata) :\n\tmetadata(Metadata)\n{\n}\n\narray::~array()\n{\n}\n\nvoid array::set_metadata_value(const string_t& Name, const string_t& Value)\n{\n\tmetadata[Name] = Value;\n}\n\nvoid array::set_metadata(const metadata_t& Values)\n{\n\t// Note ... we don't use insert() here because we want to overwrite any existing values\n\tfor(metadata_t::const_iterator pair = Values.begin(); pair != Values.end(); ++pair)\n\t\tmetadata[pair->first] = pair->second;\n}\n\narray::metadata_t array::get_metadata() const\n{\n\treturn metadata;\n}\n\nconst string_t array::get_metadata_value(const string_t& Name) const\n{\n\tmetadata_t::const_iterator pair = metadata.find(Name);\n\treturn pair != metadata.end() ? pair->second : string_t();\n}\n\nvoid array::erase_metadata_value(const string_t& Name)\n{\n\tmetadata.erase(Name);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// operator<<\n\nstd::ostream& operator<<(std::ostream& Stream, const array& RHS)\n{\n\tconst array::metadata_t metadata = RHS.get_metadata();\n\tfor(array::metadata_t::const_iterator pair = metadata.begin(); pair != metadata.end(); ++pair)\n\t\tStream << standard_indent << \"metadata: \" << pair->first << \" = \" << pair->second << \"\\n\";\n\n\tRHS.print(Stream);\n\n\treturn Stream;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/array.h",
    "content": "#ifndef K3DSDK_ARRAY_H\n#define K3DSDK_ARRAY_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/pipeline_data.h>\n#include <map>\n\nnamespace k3d\n{\n\n/// Abstract interface that can be used to store heterogeneous collections of arrays.\n/// Methods are provided for cloning arrays (virtual ctor pattern), plus type-agnostic\n/// methods similar to std::vector, and storage for arbitrary metadata (name-value pairs).\nclass array\n{\npublic:\n\t/// Storage for array metadata\n\ttypedef std::map<string_t, string_t> metadata_t;\n\n\tarray();\n\tarray(const metadata_t& Metadata);\n\tvirtual ~array();\n\n\t/// Returns the string representation for the type stored by this array. \n\tvirtual const string_t type_string() const = 0;\n\t/// Prints the array contents to a stream.\n\tvirtual void print(std::ostream& Stream) const = 0;\n\n\t/// Returns an empty array with the same concrete type as this array (a variation on virtual ctor)\n\tvirtual array* clone_type() const = 0;\n\t/// Returns a copy of this array (virtual ctor)\n\tvirtual array* clone() const = 0;\n\t/// Returns a copy of a half-open range of this array (a variation on virtual ctor)\n\tvirtual array* clone(const uint_t Begin, const uint_t End) const = 0;\n\n\t/// Sets the size of this array.\n\tvirtual void resize(const uint_t NewSize) = 0;\n\t/// Returns the size of this array\n\tvirtual uint_t size() const = 0;\n\t/// Returns true iff this array is empty\n\tvirtual bool_t empty() const = 0;\n\t/// Returns the difference between this array and another, using the imprecise semantics of difference::test()\n\t/// \\note: Returns false if given an array with a different concrete type.\n\tvirtual void difference(const array& Other, difference::accumulator& Result) const = 0;\n\n\t/// Sets a new name-value pair, overwriting the value if the name already exists\n\tvoid set_metadata_value(const string_t& Name, const string_t& Value);\n\t/// Sets a collection of name-value pairs, overwriting any existing values\n\tvoid set_metadata(const metadata_t& Values);\n\t/// Returns the set of all name-value pairs\n\tmetadata_t get_metadata() const;\n\t/// Returns a value by name, or empty-string if the name doesn't exist\n\tconst string_t get_metadata_value(const string_t& Name) const;\n\t/// Erases an existing name-value pair\n\tvoid erase_metadata_value(const string_t& Name);\n\nprotected:\n\t/// Storage for array metadata\n\tmetadata_t metadata;\n};\n\n/// Serialization\nstd::ostream& operator<<(std::ostream& Stream, const array& RHS);\n\n/// Specialization of difference::test for k3d::array\nnamespace difference\n{\n\ninline void test(const array& A, const array& B, accumulator& Result)\n{\n\tA.difference(B, Result);\n}\n\n} // namespace difference\n\n/// Specialization of pipeline_data_traits for use with k3d::array\ntemplate<>\nclass pipeline_data_traits<array>\n{\npublic:\n\tstatic array* clone(const array& Other)\n\t{\n\t\treturn Other.clone();\n\t}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ARRAY_H\n\n"
  },
  {
    "path": "k3dsdk/aspect_ratios.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/aspect_ratios.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/xml.h>\n\nnamespace k3d\n{\n\nconst aspect_ratios_t& aspect_ratios()\n{\n\tstatic aspect_ratios_t results;\n\tif(results.empty())\n\t{\n\t\ttry\n\t\t{\n\t\t\tconst filesystem::path path = share_path() / filesystem::generic_path(\"aspect_ratios.k3d\");\n\t\t\tk3d::filesystem::ifstream stream(path);\n\n\t\t\txml::element xml(\"k3dml\");\n\t\t\tstream >> xml;\n\n\t\t\txml::element& xml_aspect_ratios = xml.safe_element(\"application\").safe_element(\"aspectratios\");\n\n\t\t\tfor(xml::element::elements_t::iterator xml_aspect_ratio = xml_aspect_ratios.children.begin(); xml_aspect_ratio != xml_aspect_ratios.children.end(); ++xml_aspect_ratio)\n\t\t\t{\n\t\t\t\tif(xml_aspect_ratio->name != \"aspectratio\")\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst std::string name = xml::attribute_text(*xml_aspect_ratio, \"name\");\n\t\t\t\tconst std::string description = xml::attribute_text(*xml_aspect_ratio, \"description\");\n\t\t\t\tconst double value = xml::attribute_value<double>(*xml_aspect_ratio, \"value\", 1.0);\n\n\t\t\t\tresults.push_back(aspect_ratio(name, description, value));\n\t\t\t}\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tlog() << error << k3d_file_reference << \": \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tlog() << error << k3d_file_reference << \": Unknown exception\" << std::endl;\n\t\t}\n\t}\n\n\treturn results;\n}\n\nconst ienumeration_property::enumeration_values_t& aspect_ratio_values()\n{\n\tstatic ienumeration_property::enumeration_values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"<Custom>\", \"\", \"Custom aspect ratio\"));\n\t\tconst aspect_ratios_t ratios = aspect_ratios();\n\t\tfor(aspect_ratios_t::const_iterator ratio = ratios.begin(); ratio != ratios.end(); ++ratio)\n\t\t{\n\t\t\tconst std::string label = string_cast(boost::format(\"%1% (%2%:1)\") % ratio->name % ratio->value);\n\t\t\tconst std::string value = ratio->name;\n\t\t\tconst std::string description = ratio->description;\n\t\t\tvalues.push_back(ienumeration_property::enumeration_value_t(label, value, description));\n\t\t}\n\t}\n\n\treturn values;\n}\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/aspect_ratios.h",
    "content": "#ifndef K3DSDK_ASPECT_RATIOS_H\n#define K3DSDK_ASPECT_RATIOS_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ienumeration_property.h>\n\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Encapsulates a named aspect ratio\nstruct aspect_ratio\n{\n\taspect_ratio(const std::string& Name, const std::string& Description, const double Value) : name(Name), description(Description), value(Value) { }\n\n\tstd::string name;\n\tstd::string description;\n\tdouble value;\t\n};\n\n/// Defines a collection of named aspect ratios\ntypedef std::vector<aspect_ratio> aspect_ratios_t;\n\n/// Returns a list of useful aspect ratios\nconst aspect_ratios_t& aspect_ratios();\n/// Returns descriptions of the available aspect ratios for use with enumeration properties\nconst ienumeration_property::enumeration_values_t& aspect_ratio_values();\n\n} // namespace k3d\n\n#endif // !K3DSDK_ASPECT_RATIOS_H\n\n\n"
  },
  {
    "path": "k3dsdk/axis.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n\n#include <iostream>\n\nnamespace k3d\n{\n\nconst ienumeration_property::enumeration_values_t& axis_values()\n{\n\tstatic ienumeration_property::enumeration_values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"X Axis\", \"x\", \"X Axis\"));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"Y Axis\", \"y\", \"Y Axis\"));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"Z Axis\", \"z\", \"Z Axis\"));\n\t}\n\t\n\treturn values;\n}\n\nconst ienumeration_property::enumeration_values_t& signed_axis_values()\n{\n\tstatic ienumeration_property::enumeration_values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"-X Axis\", \"-x\", \"-X Axis\"));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"+X Axis\", \"+x\", \"+X Axis\"));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"-Y Axis\", \"-y\", \"-Y Axis\"));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"+Y Axis\", \"+y\", \"+Y Axis\"));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"-Z Axis\", \"-z\", \"-Z Axis\"));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"+Z Axis\", \"+z\", \"+Z Axis\"));\n\t}\n\t\n\treturn values;\n}\n\nstd::ostream& operator << (std::ostream& Stream, const axis& Value)\n{\n\tswitch(Value)\n\t{\n\t\tcase X:\n\t\t\tStream << \"x\";\n\t\t\tbreak;\n\t\tcase Y:\n\t\t\tStream << \"y\";\n\t\t\tbreak;\n\t\tcase Z:\n\t\t\tStream << \"z\";\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator >> (std::istream& Stream, axis& Value)\n{\n\tchar c;\n\tStream >> c;\n\n\tif('x' == c)\n\t\tValue = X;\n\telse if('y' == c)\n\t\tValue = Y;\n\telse if('z' == c)\n\t\tValue = Z;\n\telse\n\t\tlog() << error << k3d_file_reference << \": could not extract value [\" << c << \"]\" << std::endl;\n\n\treturn Stream;\n}\n\nstd::ostream& operator << (std::ostream& Stream, const signed_axis& Value)\n{\n\tswitch(Value)\n\t{\n\t\tcase NX:\n\t\t\tStream << \"-x\";\n\t\t\tbreak;\n\t\tcase PX:\n\t\t\tStream << \"+x\";\n\t\t\tbreak;\n\t\tcase NY:\n\t\t\tStream << \"-y\";\n\t\t\tbreak;\n\t\tcase PY:\n\t\t\tStream << \"+y\";\n\t\t\tbreak;\n\t\tcase NZ:\n\t\t\tStream << \"-z\";\n\t\t\tbreak;\n\t\tcase PZ:\n\t\t\tStream << \"+z\";\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator >> (std::istream& Stream, signed_axis& Value)\n{\n\tstd::string c;\n\tStream >> c;\n\n\tif(\"-x\" == c)\n\t\tValue = NX;\n\telse if(\"+x\" == c)\n\t\tValue = PX;\n\telse if(\"-y\" == c)\n\t\tValue = NY;\n\telse if(\"+y\" == c)\n\t\tValue = PY;\n\telse if(\"-z\" == c)\n\t\tValue = NZ;\n\telse if(\"+z\" == c)\n\t\tValue = PZ;\n\telse\n\t\tlog() << error << error << k3d_file_reference << \": could not extract value [\" << c << \"]\" << std::endl;\n\n\treturn Stream;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/axis.h",
    "content": "#ifndef K3DSDK_AXIS_H\n#define K3DSDK_AXIS_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Provides an enumerated type for representing axes (useful in a lot of objects)\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ienumeration_property.h>\n#include <iosfwd>\n\nnamespace k3d\n{\n\n/// Enumerates standard axes\ntypedef enum\n{\n\tX,\n\tY,\n\tZ\n} axis;\n\n/// Enumerates signed axes\ntypedef enum\n{\n\tNX,\n\tPX,\n\tNY,\n\tPY,\n\tNZ,\n\tPZ\n} signed_axis;\n\n/// Returns descriptions of the allowed axis values, for use with enumeration properties\nconst ienumeration_property::enumeration_values_t& axis_values();\n/// Returns descriptions of the allowed signed axis values, for use with enumeration properties\nconst ienumeration_property::enumeration_values_t& signed_axis_values();\n\n/// Serialization\nstd::ostream& operator<<(std::ostream& Stream, const axis& Value);\n/// Serialization\nstd::istream& operator>>(std::istream& Stream, axis& Value);\n\n/// Serialization\nstd::ostream& operator<<(std::ostream& Stream, const signed_axis& Value);\n/// Serialization\nstd::istream& operator>>(std::istream& Stream, signed_axis& Value);\n\n} // namespace k3d\n\n#endif // !K3DSDK_AXIS_H\n"
  },
  {
    "path": "k3dsdk/base64.cpp",
    "content": "/*********************************************************************\\\n\nMODULE NAME:    b64.c\n\nAUTHOR:         Bob Trower 08/04/01\n\nPROJECT:        Crypt Data Packaging\n\nCOPYRIGHT:      Copyright (c) Trantor Standard Systems Inc., 2001\n\nNOTES:          This source code may be used as you wish, subject to\n                the MIT license.  See the LICENCE section below.\n\n                Canonical source should be at:\n                    http://base64.sourceforge.net\n\nDESCRIPTION:\n                This little utility implements the Base64\n                Content-Transfer-Encoding standard described in\n                RFC1113 (http://www.faqs.org/rfcs/rfc1113.html).\n\n                This is the coding scheme used by MIME to allow\n                binary data to be transferred by SMTP mail.\n\n                Groups of 3 bytes from a binary stream are coded as\n                groups of 4 bytes in a text stream.\n\n                The input stream is 'padded' with zeros to create\n                an input that is an even multiple of 3.\n\n                A special character ('=') is used to denote padding so\n                that the stream can be decoded back to its exact size.\n\n                Encoded output is formatted in lines which should\n                be a maximum of 72 characters to conform to the\n                specification.  This program defaults to 72 characters,\n                but will allow more or less through the use of a\n                switch.  The program enforces a minimum line size\n                of 4 characters.\n\n                Example encoding:\n\n                The stream 'ABCD' is 32 bits long.  It is mapped as\n                follows:\n\n                ABCD\n\n                 A (65)     B (66)     C (67)     D (68)   (None) (None)\n                01000001   01000010   01000011   01000100\n\n                16 (Q)  20 (U)  9 (J)   3 (D)    17 (R) 0 (A)  NA (=) NA (=)\n                010000  010100  001001  000011   010001 000000 000000 000000\n\n\n                QUJDRA==\n\n                Decoding is the process in reverse.  A 'decode' lookup\n                table has been created to avoid string scans.\n\nDESIGN GOALS:\tSpecifically:\n\t\tCode is a stand-alone utility to perform base64 \n\t\tencoding/decoding. It should be genuinely useful \n\t\twhen the need arises and it meets a need that is \n\t\tlikely to occur for some users.  \n\t\tCode acts as sample code to show the author's \n\t\tdesign and coding style.  \n\n\t\tGenerally: \n\t\tThis program is designed to survive:\n\t\tEverything you need is in a single source file.\n\t\tIt compiles cleanly using a vanilla ANSI C compiler.\n\t\tIt does its job correctly with a minimum of fuss.  \n\t\tThe code is not overly clever, not overly simplistic \n\t\tand not overly verbose. \n\t\tAccess is 'cut and paste' from a web page.  \n\t\tTerms of use are reasonable.  \n\nVALIDATION:     Non-trivial code is never without errors.  This\n                file likely has some problems, since it has only\n                been tested by the author.  It is expected with most\n                source code that there is a period of 'burn-in' when\n                problems are identified and corrected.  That being\n                said, it is possible to have 'reasonably correct'\n                code by following a regime of unit test that covers\n                the most likely cases and regression testing prior\n                to release.  This has been done with this code and\n                it has a good probability of performing as expected.\n\n                Unit Test Cases:\n\n                case 0:empty file:\n                    CASE0.DAT  ->  ->\n                    (Zero length target file created\n                    on both encode and decode.)\n\n                case 1:One input character:\n                    CASE1.DAT A -> QQ== -> A\n\n                case 2:Two input characters:\n                    CASE2.DAT AB -> QUI= -> AB\n\n                case 3:Three input characters:\n                    CASE3.DAT ABC -> QUJD -> ABC\n\n                case 4:Four input characters:\n                    case4.dat ABCD -> QUJDRA== -> ABCD\n\n                case 5:All chars from 0 to ff, linesize set to 50:\n\n                    AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj\n                    JCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZH\n                    SElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWpr\n                    bG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6P\n                    kJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKz\n                    tLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX\n                    2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7\n                    /P3+/w==\n\n                case 6:Mime Block from e-mail:\n                    (Data same as test case 5)\n\n                case 7: Large files:\n                    Tested 28 MB file in/out.\n\n                case 8: Random Binary Integrity:\n                    This binary program (b64.exe) was encoded to base64,\n                    back to binary and then executed.\n\n                case 9 Stress:\n                    All files in a working directory encoded/decoded\n                    and compared with file comparison utility to\n                    ensure that multiple runs do not cause problems\n                    such as exhausting file handles, tmp storage, etc.\n\n                -------------\n\n                Syntax, operation and failure:\n                    All options/switches tested.  Performs as\n                    expected.\n\n                case 10:\n                    No Args -- Shows Usage Screen\n                    Return Code 1 (Invalid Syntax)\n                case 11:\n                    One Arg (invalid) -- Shows Usage Screen\n                    Return Code 1 (Invalid Syntax)\n                case 12:\n                    One Arg Help (-?) -- Shows detailed Usage Screen.\n                    Return Code 0 (Success -- help request is valid).\n                case 13:\n                    One Arg Help (-h) -- Shows detailed Usage Screen.\n                    Return Code 0 (Success -- help request is valid).\n                case 14:\n                    One Arg (valid) -- Uses stdin/stdout (filter)\n                    Return Code 0 (Sucess)\n                case 15:\n                    Two Args (invalid file) -- shows system error.\n                    Return Code 2 (File Error)\n                case 16:\n                    Encode non-existent file -- shows system error.\n                    Return Code 2 (File Error)\n                case 17:\n                    Out of disk space -- shows system error.\n                    Return Code 3 (File I/O Error)\n                case 18:\n                    Too many args -- shows system error.\n                    Return Code 1 (Invalid Syntax)\n\n                -------------\n\n                Compile/Regression test:\n                    gcc compiled binary under Cygwin\n                    Microsoft Visual Studio under Windows 2000\n                    Microsoft Version 6.0 C under Windows 2000\n\nDEPENDENCIES:   None\n\nLICENCE:        Copyright (c) 2001 Bob Trower, Trantor Standard Systems Inc.\n\n                Permission is hereby granted, free of charge, to any person\n                obtaining a copy of this software and associated\n                documentation files (the \"Software\"), to deal in the\n                Software without restriction, including without limitation\n                the rights to use, copy, modify, merge, publish, distribute,\n                sublicense, and/or sell copies of the Software, and to\n                permit persons to whom the Software is furnished to do so,\n                subject to the following conditions:\n\n                The above copyright notice and this permission notice shall\n                be included in all copies or substantial portions of the\n                Software.\n\n                THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY\n                KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n                WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\n                PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\n                OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n                OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n                OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n                SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nVERSION HISTORY:\n                Bob Trower 08/04/01 -- Create Version 0.00.00B\n                Bob Trower 08/17/01 -- Correct documentation, messages.\n                                    -- Correct help for linesize syntax.\n                                    -- Force error on too many arguments.\n                Bob Trower 08/19/01 -- Add sourceforge.net reference to\n                                       help screen prior to release.\n\t\tTim Shead  09/02/05 -- Repackage for use with iostreams, doxygen, K-3D\n\n\\******************************************************************* */\n\n#include <k3dsdk/base64.h>\n\n#include <istream>\n#include <ostream>\n\nnamespace k3d\n{\n\nnamespace base64\n{\n\n/// Translation Table as described in RFC1113\nstatic const char cb64[]=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n/// Translation Table to decode (created by author)\nstatic const char cd64[]=\"|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\\\]^_`abcdefghijklmnopq\";\n\n/// encode 3 8-bit binary bytes as 4 '6-bit' characters\nvoid encodeblock( unsigned char in[3], unsigned char out[4], int len )\n{\n    out[0] = cb64[ in[0] >> 2 ];\n    out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ];\n    out[2] = (unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '=');\n    out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '=');\n}\n\nvoid encode(std::istream& Input, std::ostream& Output, const unsigned long LineWidth)\n{\n    unsigned char in[3], out[4];\n    int i, len, blocksout = 0;\n\n    while(Input) {\n        len = 0;\n        for( i = 0; i < 3; i++ ) {\n            in[i] = Input.get();\n            if(Input) {\n                len++;\n            }\n            else {\n                in[i] = 0;\n            }\n        }\n        if( len ) {\n            encodeblock( in, out, len );\n            for( i = 0; i < 4; i++ ) {\n                Output.put(out[i]);\n            }\n            blocksout++;\n        }\n        if( blocksout >= (LineWidth/4) || !Input ) {\n            if( blocksout ) {\n            \tOutput << \"\\n\";\n            }\n            blocksout = 0;\n        }\n    }\n}\n\n/// decode 4 '6-bit' characters into 3 8-bit binary bytes\nvoid decodeblock( unsigned char in[4], unsigned char out[3] )\n{   \n    out[ 0 ] = (unsigned char ) (in[0] << 2 | in[1] >> 4);\n    out[ 1 ] = (unsigned char ) (in[1] << 4 | in[2] >> 2);\n    out[ 2 ] = (unsigned char ) (((in[2] << 6) & 0xc0) | in[3]);\n}\n\nvoid decode(std::istream& Input, std::ostream& Output)\n{\n    unsigned char in[4], out[3], v;\n    int i, len;\n\n    while(Input) {\n        for( len = 0, i = 0; i < 4 && Input; i++ ) {\n            v = 0;\n            while(Input && v == 0 ) {\n                v = Input.get();\n                v = (unsigned char) ((v < 43 || v > 122) ? 0 : cd64[ v - 43 ]);\n                if( v ) {\n                    v = (unsigned char) ((v == '$') ? 0 : v - 61);\n                }\n            }\n            if(Input) {\n                len++;\n                if( v ) {\n                    in[ i ] = (unsigned char) (v - 1);\n                }\n            }\n            else {\n                in[i] = 0;\n            }\n        }\n        if( len ) {\n            decodeblock( in, out );\n            for( i = 0; i < len - 1; i++ ) {\n            \tOutput.put(out[i]);\n            }\n        }\n    }\n}\n\n} // namespace base64\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/base64.h",
    "content": "#ifndef K3DSDK_BASE64_H\n#define K3DSDK_BASE64_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <iosfwd>\n\nnamespace k3d\n{\n\nnamespace base64\n{\n\n/// Encodes the input stream into base64, sending the results to the output stream\nvoid encode(std::istream& Input, std::ostream& Output, const unsigned long LineWidth = 72);\n\n/// Decodes the input stream from base64, sending the results to the output stream\nvoid decode(std::istream& Input, std::ostream& Output);\n\n} // namespace base64\n\n} // namespace k3d\n\n#endif // !K3DSDK_BASE64_H\n\n"
  },
  {
    "path": "k3dsdk/basic_math.h",
    "content": "#ifndef K3DSDK_BASIC_MATH_H\n#define K3DSDK_BASIC_MATH_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\n#include <algorithm>\n#include <cmath>\n\nnamespace k3d\n{\n\n/// Pi\ninline double_t pi()\n{\n\treturn 3.1415926535897932384626433832795;\n}\n\n/// Pi divided-by two\ninline double_t pi_over_2()\n{\n\treturn pi() * 0.5;\n}\n\n/// Pi times two\ninline double_t pi_times_2()\n{\n\treturn pi() * 2.0;\n}\n\n/// Converts degrees to radians\ninline double_t radians(const double_t degrees)\n{\n\treturn degrees * 0.01745329252;\n}\n\n/// Converts radians to degrees\ninline double_t degrees(const double_t radians)\n{\n\treturn radians * 57.2957795131;\n}\n\n/// Computes N!\ninline double_t factorial(double_t N)\n{\n\tdouble_t result = 1;\n\tfor(double_t i = 2; i <= N; ++i)\n\t\tresult *= i;\n\n\treturn result;\n}\n\n/// Computes an integer power of a base via successive squaring\ntemplate <typename Type>\nType fast_pow(Type base, int exponent)\n{\n\tbool invert = exponent < 0;\n\tif (invert)\n\t\texponent = -exponent;\n\n\t// loop invariant: prod * base^exponent\n\tType prod = Type(1);\n\twhile (exponent > 0) {\n\t\tif (exponent % 2 == 0) {\n\t\t\tbase *= base;\n\t\t\texponent /= 2;\n\t\t}\n\t\telse {\n\t\t\tprod *= base;\n\t\t\t--exponent;\n\t\t}\n\t}\n\n\tif (invert)\n\t\tprod = Type(1) / prod;\n\n\treturn prod;\n}\n\n/// Returns the sign of an argument: -1 if negative, 0 if zero, +1 if positive\ntemplate<class type> double_t sign(const type& Arg)\n{\n\tif(Arg > 0.0) return 1.0;\n\tif(Arg < 0.0) return -1.0;\n\n\treturn 0.0;\n}\n\n/// Rounds a value to the closest integer\ninline double_t round(const double_t Value)\n{\n\treturn (Value - std::floor(Value)) < 0.5 ? std::floor(Value) : std::ceil(Value);\n}\n\n/// Clamps a value within the specified range (conforms to SL usage)\ntemplate<class type>\ntype clamp(const type& x, const type& minval, const type& maxval)\n{\n\treturn std::min(std::max(x, minval), maxval);\n}\n\n/// Returns the linear interpolation of two values\ntemplate<class type>\ntype mix(const type& x, const type& y, const double_t alpha)\n{\n\treturn x * (1 - alpha) + y * (alpha);\n}\n\n/// Returns the ratio of two values (handles type-casting to a floating-point value)\ntemplate<typename type>\ndouble_t ratio(const type& x, const type& y)\n{\n\treturn static_cast<double_t>(x) / static_cast<double_t>(y);\n}\n\n} // namespace k3d\n\n#endif // !K3DSDK_BASIC_MATH_H\n\n"
  },
  {
    "path": "k3dsdk/batch_mode.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/batch_mode_init.h>\n#include <k3dsdk/batch_mode.h>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\n/// Stores the global batch (no user intervention) mode state\nbool_t g_batch_mode = false;\n\t\n} // namespace detail\n\t\nvoid set_batch_mode(const bool Mode)\n{\n\tdetail::g_batch_mode = Mode;\n}\n\nbool_t batch_mode()\n{\n\treturn detail::g_batch_mode;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/batch_mode.h",
    "content": "#ifndef K3DSDK_BATCH_MODE_H\n#define K3DSDK_BATCH_MODE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\n/// Returns the current batch (no user intervention) mode state\nbool_t batch_mode();\n\n} // namespace k3d\n\n#endif // !K3DSDK_BATCH_MODE_H\n\n"
  },
  {
    "path": "k3dsdk/batch_mode_init.h",
    "content": "#ifndef K3DSDK_BATCH_MODE_INIT_H\n#define K3DSDK_BATCH_MODE_INIT_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\n/// Sets the global batch (no user intervention) mode state (call once at startup)\nvoid set_batch_mode(const bool Mode);\n\n} // namespace k3d\n\n#endif // !K3DSDK_BATCH_MODE_INIT_H\n\n"
  },
  {
    "path": "k3dsdk/bezier.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/bezier.h>\n\nnamespace k3d\n{\n\ndouble BernsteinBasis(const unsigned long Order, const unsigned long ControlPoint, const double Parameter)\n{\n\t// Sanity checks ...\n\tassert(Order > 1);\n\tassert(ControlPoint <= Order);\n\n\tconst int n = Order - 1;\n\tconst int i = ControlPoint;\n\tconst double t = Parameter;\n\n\tconst double ni = factorial(n) / (factorial(i) * factorial(n - i));\n\n\treturn ni * pow(t, i) * pow((1 - t), (n - i));\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/bezier.h",
    "content": "#ifndef K3DSDK_BEZIER_H\n#define K3DSDK_BEZIER_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements basic Bezier functions\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/bezier_private.h>\n#include <k3dsdk/vectors.h>\n\n#include <cassert>\n#include <iterator>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Computes a Bezier curve value with given degree, control points, and parameter value\ntemplate<int n, typename value_t, typename iterator_t>\nvalue_t bezier(const iterator_t First, const iterator_t Last, const double t)\n{\n\t// Sanity checks ...\n\tassert(std::distance(First, Last) == n+1);\n\t\n\treturn detail::bezier_implementation<n, n, value_t, iterator_t>().value(t, Last-1);\n}\n\n/// Treats a Bezier curve as a two-dimensional function, returning the curve value Y for a specific X (instead of using the curve parameter t, which is nonlinear)\ntemplate<int n, typename value_t, typename iterator_t>\ndouble bezier_function(const iterator_t First, const iterator_t Last, const double X, const double Hint, const double MaxError, const unsigned long MaxIterations, double& Error, unsigned long& Iterations)\n{\n\tassert(MaxIterations);\n\n\tdouble t = Hint;\n\tvalue_t result;\n\tfor(Iterations = 1; Iterations <= MaxIterations; ++Iterations)\n\t\t{\n\t\t\tresult = bezier<n, value_t, iterator_t>(First, Last, t);\n\t\t\tError = X - result[0];\n\n\t\t\tif(std::abs(Error) < MaxError)\n\t\t\t\treturn result[1];\n\n\t\t\tt += 0.4 * Error;\n\t\t}\n\n\treturn result[1];\n}\n\n/// Returns a Bezier / Bernstein basis for the given order, control point number, and parameter value\ndouble BernsteinBasis(const unsigned long Order, const unsigned long ControlPoint, const double Parameter);\n\n/// Computes a Bezier curve value with given order,  control points, and parameter value\ntemplate<class Type>\nType Bezier(const std::vector<Type>& ControlPoints, const double Parameter)\n{\n\t// Sanity checks ...\n\tassert(ControlPoints.size() > 1);\n\n\tType result = BernsteinBasis(ControlPoints.size(), 0, Parameter) * ControlPoints[0];\n\tfor(unsigned long i = 1; i < ControlPoints.size(); i++)\n\t\tresult += to_vector(BernsteinBasis(ControlPoints.size(), i, Parameter) * ControlPoints[i]);\n\n\treturn result;\n}\n\n} // namespace k3d\n\n#endif // !K3DSDK_BEZIER_H\n"
  },
  {
    "path": "k3dsdk/bezier_private.h",
    "content": "#ifndef K3DSDK_BEZIER_PRIVATE_H\n#define K3DSDK_BEZIER_PRIVATE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements internal Bezier computation functions\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <cmath>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\n/// Compile-time computation of an integer factorial\ntemplate<int n>\nstruct factorial\n{\n\tenum { result = n * factorial<n-1>::result };\n};\n\ntemplate<>\nstruct factorial<0>\n{\n\tenum { result = 1 };\n};\n\ntemplate<int n, int i>\ndouble bernstein_basis(const double t)\n{\n\treturn (static_cast<double>(factorial<n>::result) / static_cast<double>(factorial<i>::result * factorial<n-i>::result)) * std::pow(t, i) * std::pow(1-t, n-i);\n}\n\ntemplate<int n, int i, typename value_t, typename iterator_t>\nstruct bezier_implementation\n{\n\tvalue_t value(double t, iterator_t B)\n\t{\n\t\tvalue_t a(bernstein_basis<n, i>(t) * (*B));\n\t\tvalue_t b(bezier_implementation<n, i-1, value_t, iterator_t>().value(t, --B));\n\t\treturn a + b;\n\t}\n};\n\ntemplate<int n, typename value_t, typename iterator_t>\nstruct bezier_implementation<n, 0, value_t, iterator_t>\n{\n\tvalue_t value(double t, iterator_t B)\n\t{\n\t\treturn bernstein_basis<n, 0>(t) * (*B);\n\t}\n};\n\n} // namespace detail\n\n} // namespace k3d\n\n#endif // !K3DSDK_BEZIER_PRIVATE_H\n"
  },
  {
    "path": "k3dsdk/bezier_triangle_patch.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Ashish Myles (marcianx@gmail.com)\n*/\n\n#include <k3dsdk/bezier_triangle_patch.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\n#include <numeric>\n\nnamespace k3d\n{\n\nnamespace bezier_triangle_patch\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::indices_t& PatchFirstPoints,\n\tconst mesh::orders_t& PatchOrders,\n\tconst mesh::selection_t& PatchSelections,\n\tconst mesh::materials_t& PatchMaterials,\n\tconst mesh::indices_t& PatchPoints,\n\tconst mesh::weights_t& PatchPointWeights,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& PatchAttributes,\n\tconst mesh::table_t& ParameterAttributes,\n\tconst mesh::table_t& VertexAttributes\n\t\t) :\n\tpatch_first_points(PatchFirstPoints),\n\tpatch_orders(PatchOrders),\n\tpatch_selections(PatchSelections),\n\tpatch_materials(PatchMaterials),\n\tpatch_points(PatchPoints),\n\tpatch_point_weights(PatchPointWeights),\n\tconstant_attributes(ConstantAttributes),\n\tpatch_attributes(PatchAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::indices_t& PatchFirstPoints,\n\tmesh::orders_t& PatchOrders,\n\tmesh::selection_t& PatchSelections,\n\tmesh::materials_t& PatchMaterials,\n\tmesh::indices_t& PatchPoints,\n\tmesh::weights_t& PatchPointWeights,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& PatchAttributes,\n\tmesh::table_t& ParameterAttributes,\n\tmesh::table_t& VertexAttributes\n\t\t) :\n\tpatch_first_points(PatchFirstPoints),\n\tpatch_orders(PatchOrders),\n\tpatch_selections(PatchSelections),\n\tpatch_materials(PatchMaterials),\n\tpatch_points(PatchPoints),\n\tpatch_point_weights(PatchPointWeights),\n\tconstant_attributes(ConstantAttributes),\n\tpatch_attributes(PatchAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"bezier_triangle_patch\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"patch\"].create<mesh::indices_t >(\"patch_first_points\"),\n\t\tgeneric_primitive.structure[\"patch\"].create<mesh::orders_t >(\"patch_orders\"),\n\t\tgeneric_primitive.structure[\"patch\"].create<mesh::selection_t >(\"patch_selections\"),\n\t\tgeneric_primitive.structure[\"patch\"].create<mesh::materials_t >(\"patch_materials\"),\n\t\tgeneric_primitive.structure[\"vertex\"].create<mesh::indices_t >(\"patch_points\"),\n\t\tgeneric_primitive.structure[\"vertex\"].create<mesh::weights_t >(\"patch_point_weights\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"patch\"],\n\t\tgeneric_primitive.attributes[\"parameter\"],\n\t\tgeneric_primitive.attributes[\"vertex\"]\n\t\t);\n\n\tresult->patch_selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\tresult->patch_points.set_metadata_value(metadata::key::domain(), metadata::value::point_indices_domain());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"bezier_triangle_patch\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst table& patch_structure = require_structure(Primitive, \"patch\");\n\t\tconst table& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\tconst table& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst table& patch_attributes = require_attributes(Primitive, \"patch\");\n\t\tconst table& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tconst table& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tconst mesh::indices_t& patch_first_points = require_array<mesh::indices_t >(Primitive, patch_structure, \"patch_first_points\");\n\t\tconst mesh::orders_t& patch_orders = require_array<mesh::orders_t >(Primitive, patch_structure, \"patch_orders\");\n\t\tconst mesh::selection_t& patch_selections = require_array<mesh::selection_t >(Primitive, patch_structure, \"patch_selections\");\n\t\tconst mesh::materials_t& patch_materials = require_array<mesh::materials_t >(Primitive, patch_structure, \"patch_materials\");\n\t\tconst mesh::indices_t& patch_points = require_array<mesh::indices_t >(Primitive, vertex_structure, \"patch_points\");\n\t\tconst mesh::weights_t& patch_point_weights = require_array<mesh::weights_t >(Primitive, vertex_structure, \"patch_point_weights\");\n\n\t\trequire_metadata(Primitive, patch_selections, \"patch_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, patch_points, \"patch_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\tk3d::uint_t num_control_points = 0;\n\t\tconst k3d::uint_t num_patches = patch_selections.size();\n\t\tfor(k3d::uint_t patch = 0; patch != num_patches; ++patch)\n\t\t{\n\t\t\tconst k3d::uint_t patch_size = (patch_orders[patch] * (patch_orders[patch] + 1)) / 2;\n\t\t\tnum_control_points += patch_size;\n\t\t\tif (patch < num_patches-1 && patch_first_points[patch] + patch_size != patch_first_points[patch+1])\n\t\t\t{\n\t\t\t\tstd::ostringstream buffer;\n\t\t\t\tbuffer << \"[\" << Primitive.type << \"] primitive [patch_first_points[\" << (patch+1)\n\t\t\t\t       << \"]] incorrect value [\" << patch_first_points[patch+1]\n\t\t\t\t       << \"], expected [\" << (patch_first_points[patch] + patch_size) << \"]\";\n\t\t\t\tthrow std::runtime_error(buffer.str());\n\t\t\t}\n\t\t}\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", num_control_points);\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", patch_structure.row_count() * 3);\n\n\t\treturn new const_primitive(patch_first_points, patch_orders, patch_selections, patch_materials, patch_points, patch_point_weights, constant_attributes, patch_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"bezier_triangle_patch\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\ttable& patch_structure = require_structure(Primitive, \"patch\");\n\t\ttable& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\ttable& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\ttable& patch_attributes = require_attributes(Primitive, \"patch\");\n\t\ttable& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\ttable& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tmesh::indices_t& patch_first_points = require_array<mesh::indices_t >(Primitive, patch_structure, \"patch_first_points\");\n\t\tmesh::orders_t& patch_orders = require_array<mesh::orders_t >(Primitive, patch_structure, \"patch_orders\");\n\t\tmesh::selection_t& patch_selections = require_array<mesh::selection_t >(Primitive, patch_structure, \"patch_selections\");\n\t\tmesh::materials_t& patch_materials = require_array<mesh::materials_t >(Primitive, patch_structure, \"patch_materials\");\n\t\tmesh::indices_t& patch_points = require_array<mesh::indices_t >(Primitive, vertex_structure, \"patch_points\");\n\t\tmesh::weights_t& patch_point_weights = require_array<mesh::weights_t >(Primitive, vertex_structure, \"patch_point_weights\");\n\n\t\trequire_metadata(Primitive, patch_selections, \"patch_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, patch_points, \"patch_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\tk3d::uint_t num_control_points = 0;\n\t\tconst k3d::uint_t num_patches = patch_selections.size();\n\t\tfor(k3d::uint_t patch = 0; patch != num_patches; ++patch)\n\t\t{\n\t\t\tconst k3d::uint_t patch_size = (patch_orders[patch] * (patch_orders[patch] + 1)) / 2;\n\t\t\tnum_control_points += patch_size;\n\t\t\tif (patch < num_patches-1 && patch_first_points[patch] + patch_size != patch_first_points[patch+1])\n\t\t\t{\n\t\t\t\tstd::ostringstream buffer;\n\t\t\t\tbuffer << \"[\" << Primitive.type << \"] primitive [patch_first_points[\" << (patch+1)\n\t\t\t\t       << \"]] incorrect value [\" << patch_first_points[patch+1]\n\t\t\t\t       << \"], expected [\" << (patch_first_points[patch] + patch_size) << \"]\";\n\t\t\t\tthrow std::runtime_error(buffer.str());\n\t\t\t}\n\t\t}\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", num_control_points);\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", patch_structure.row_count() * 3);\n\n\t\treturn new primitive(patch_first_points, patch_orders, patch_selections, patch_materials, patch_points, patch_point_weights, constant_attributes, patch_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"bezier_triangle_patch\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace bezier_triangle_patch\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/bezier_triangle_patch.h",
    "content": "#ifndef K3DSDK_BEZIER_TRIANGLE_PATCH_H\n#define K3DSDK_BEZIER_TRIANGLE_PATCH_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Ashish Myles (marcianx@gmail.com)\n*/\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace bezier_triangle_patch\n{\n\n/// Gathers the member arrays of a bezier_triangle_patch primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::indices_t& PatchFirstPoints,\n\t\tconst mesh::orders_t& PatchOrders,\n\t\tconst mesh::selection_t& PatchSelections,\n\t\tconst mesh::materials_t& PatchMaterials,\n\t\tconst mesh::indices_t& PatchPoints,\n\t\tconst mesh::weights_t& PatchPointWeights,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& PatchAttributes,\n\t\tconst mesh::table_t& ParameterAttributes,\n\t\tconst mesh::table_t& VertexAttributes\n\t\t);\n\n\tconst mesh::indices_t& patch_first_points;\n\tconst mesh::orders_t& patch_orders;\n\tconst mesh::selection_t& patch_selections;\n\tconst mesh::materials_t& patch_materials;\n\tconst mesh::indices_t& patch_points;\n\tconst mesh::weights_t& patch_point_weights;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& patch_attributes;\n\tconst mesh::table_t& parameter_attributes;\n\tconst mesh::table_t& vertex_attributes;\n};\n\n/// Gathers the member arrays of a bezier_triangle_patch primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::indices_t& PatchFirstPoints,\n\t\tmesh::orders_t& PatchOrders,\n\t\tmesh::selection_t& PatchSelections,\n\t\tmesh::materials_t& PatchMaterials,\n\t\tmesh::indices_t& PatchPoints,\n\t\tmesh::weights_t& PatchPointWeights,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& PatchAttributes,\n\t\tmesh::table_t& ParameterAttributes,\n\t\tmesh::table_t& VertexAttributes\n\t\t);\n\n\tmesh::indices_t& patch_first_points;\n\tmesh::orders_t& patch_orders;\n\tmesh::selection_t& patch_selections;\n\tmesh::materials_t& patch_materials;\n\tmesh::indices_t& patch_points;\n\tmesh::weights_t& patch_point_weights;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& patch_attributes;\n\tmesh::table_t& parameter_attributes;\n\tmesh::table_t& vertex_attributes;\n};\n\n/// Creates a new bezier_triangle_patch mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid bezier_triangle_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid bezier_triangle_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid bezier_triangle_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace bezier_triangle_patch\n\n} // namespace k3d\n\n#endif // !K3DSDK_BEZIER_TRIANGLE_PATCH_H\n\n"
  },
  {
    "path": "k3dsdk/bicubic_patch.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\n#include <numeric>\n\nnamespace k3d\n{\n\nnamespace bicubic_patch\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::selection_t& PatchSelections,\n\tconst mesh::materials_t& PatchMaterials,\n\tconst mesh::indices_t& PatchPoints,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& PatchAttributes,\n\tconst mesh::table_t& ParameterAttributes,\n\tconst mesh::table_t& VertexAttributes\n\t\t) :\n\tpatch_selections(PatchSelections),\n\tpatch_materials(PatchMaterials),\n\tpatch_points(PatchPoints),\n\tconstant_attributes(ConstantAttributes),\n\tpatch_attributes(PatchAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::selection_t& PatchSelections,\n\tmesh::materials_t& PatchMaterials,\n\tmesh::indices_t& PatchPoints,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& PatchAttributes,\n\tmesh::table_t& ParameterAttributes,\n\tmesh::table_t& VertexAttributes\n\t\t) :\n\tpatch_selections(PatchSelections),\n\tpatch_materials(PatchMaterials),\n\tpatch_points(PatchPoints),\n\tconstant_attributes(ConstantAttributes),\n\tpatch_attributes(PatchAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"bicubic_patch\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"patch\"].create<mesh::selection_t >(\"patch_selections\"),\n\t\tgeneric_primitive.structure[\"patch\"].create<mesh::materials_t >(\"patch_materials\"),\n\t\tgeneric_primitive.structure[\"vertex\"].create<mesh::indices_t >(\"patch_points\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"patch\"],\n\t\tgeneric_primitive.attributes[\"parameter\"],\n\t\tgeneric_primitive.attributes[\"vertex\"]\n\t\t);\n\n\tresult->patch_selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\tresult->patch_points.set_metadata_value(metadata::key::domain(), metadata::value::point_indices_domain());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"bicubic_patch\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst table& patch_structure = require_structure(Primitive, \"patch\");\n\t\tconst table& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\tconst table& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst table& patch_attributes = require_attributes(Primitive, \"patch\");\n\t\tconst table& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tconst table& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tconst mesh::selection_t& patch_selections = require_array<mesh::selection_t >(Primitive, patch_structure, \"patch_selections\");\n\t\tconst mesh::materials_t& patch_materials = require_array<mesh::materials_t >(Primitive, patch_structure, \"patch_materials\");\n\t\tconst mesh::indices_t& patch_points = require_array<mesh::indices_t >(Primitive, vertex_structure, \"patch_points\");\n\n\t\trequire_metadata(Primitive, patch_selections, \"patch_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, patch_points, \"patch_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", patch_structure.row_count() * 16);\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", patch_structure.row_count() * 4);\n\n\t\treturn new const_primitive(patch_selections, patch_materials, patch_points, constant_attributes, patch_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"bicubic_patch\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\ttable& patch_structure = require_structure(Primitive, \"patch\");\n\t\ttable& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\ttable& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\ttable& patch_attributes = require_attributes(Primitive, \"patch\");\n\t\ttable& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\ttable& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tmesh::selection_t& patch_selections = require_array<mesh::selection_t >(Primitive, patch_structure, \"patch_selections\");\n\t\tmesh::materials_t& patch_materials = require_array<mesh::materials_t >(Primitive, patch_structure, \"patch_materials\");\n\t\tmesh::indices_t& patch_points = require_array<mesh::indices_t >(Primitive, vertex_structure, \"patch_points\");\n\n\t\trequire_metadata(Primitive, patch_selections, \"patch_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, patch_points, \"patch_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", patch_structure.row_count() * 16);\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", patch_structure.row_count() * 4);\n\n\t\treturn new primitive(patch_selections, patch_materials, patch_points, constant_attributes, patch_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n\tif(!Primitive.get())\n\t\treturn 0;\n\n\tif(Primitive->type != \"bicubic_patch\")\n\t\treturn 0;\n\n\treturn validate(Mesh, Primitive.writable());\n}\n\n} // namespace bicubic_patch\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/bicubic_patch.h",
    "content": "#ifndef K3DSDK_BICUBIC_PATCH_H\n#define K3DSDK_BICUBIC_PATCH_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace bicubic_patch\n{\n\n/// Gathers the member arrays of a bicubic_patch primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::selection_t& PatchSelections,\n\t\tconst mesh::materials_t& PatchMaterials,\n\t\tconst mesh::indices_t& PatchPoints,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& PatchAttributes,\n\t\tconst mesh::table_t& ParameterAttributes,\n\t\tconst mesh::table_t& VertexAttributes\n\t\t);\n\n\tconst mesh::selection_t& patch_selections;\n\tconst mesh::materials_t& patch_materials;\n\tconst mesh::indices_t& patch_points;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& patch_attributes;\n\tconst mesh::table_t& parameter_attributes;\n\tconst mesh::table_t& vertex_attributes;\n};\n\n/// Gathers the member arrays of a bicubic_patch primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::selection_t& PatchSelections,\n\t\tmesh::materials_t& PatchMaterials,\n\t\tmesh::indices_t& PatchPoints,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& PatchAttributes,\n\t\tmesh::table_t& ParameterAttributes,\n\t\tmesh::table_t& VertexAttributes\n\t\t);\n\n\tmesh::selection_t& patch_selections;\n\tmesh::materials_t& patch_materials;\n\tmesh::indices_t& patch_points;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& patch_attributes;\n\tmesh::table_t& parameter_attributes;\n\tmesh::table_t& vertex_attributes;\n};\n\n/// Creates a new bicubic_patch mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid bicubic_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid bicubic_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid bicubic_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace bicubic_patch\n\n} // namespace k3d\n\n#endif // !K3DSDK_BICUBIC_PATCH_H\n\n"
  },
  {
    "path": "k3dsdk/bilinear_patch.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\n#include <numeric>\n\nnamespace k3d\n{\n\nnamespace bilinear_patch\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::selection_t& PatchSelections,\n\tconst mesh::materials_t& PatchMaterials,\n\tconst mesh::indices_t& PatchPoints,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& PatchAttributes,\n\tconst mesh::table_t& ParameterAttributes,\n\tconst mesh::table_t& VertexAttributes\n\t\t) :\n\tpatch_selections(PatchSelections),\n\tpatch_materials(PatchMaterials),\n\tpatch_points(PatchPoints),\n\tconstant_attributes(ConstantAttributes),\n\tpatch_attributes(PatchAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::selection_t& PatchSelections,\n\tmesh::materials_t& PatchMaterials,\n\tmesh::indices_t& PatchPoints,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& PatchAttributes,\n\tmesh::table_t& ParameterAttributes,\n\tmesh::table_t& VertexAttributes\n\t\t) :\n\tpatch_selections(PatchSelections),\n\tpatch_materials(PatchMaterials),\n\tpatch_points(PatchPoints),\n\tconstant_attributes(ConstantAttributes),\n\tpatch_attributes(PatchAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"bilinear_patch\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"patch\"].create<mesh::selection_t >(\"patch_selections\"),\n\t\tgeneric_primitive.structure[\"patch\"].create<mesh::materials_t >(\"patch_materials\"),\n\t\tgeneric_primitive.structure[\"vertex\"].create<mesh::indices_t >(\"patch_points\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"patch\"],\n\t\tgeneric_primitive.attributes[\"parameter\"],\n\t\tgeneric_primitive.attributes[\"vertex\"]\n\t\t);\n\n\tresult->patch_selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\tresult->patch_points.set_metadata_value(metadata::key::domain(), metadata::value::point_indices_domain());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"bilinear_patch\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst table& patch_structure = require_structure(Primitive, \"patch\");\n\t\tconst table& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\tconst mesh::selection_t& patch_selections = require_array<mesh::selection_t >(Primitive, patch_structure, \"patch_selections\");\n\t\tconst mesh::materials_t& patch_materials = require_array<mesh::materials_t >(Primitive, patch_structure, \"patch_materials\");\n\t\tconst mesh::indices_t& patch_points = require_array<mesh::indices_t >(Primitive, vertex_structure, \"patch_points\");\n\n\t\tconst table& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst table& patch_attributes = require_attributes(Primitive, \"patch\");\n\t\tconst table& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tconst table& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\trequire_metadata(Primitive, patch_selections, \"patch_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, patch_points, \"patch_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", patch_structure.row_count() * 4);\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", patch_structure.row_count() * 4);\n\n\t\treturn new const_primitive(patch_selections, patch_materials, patch_points, constant_attributes, patch_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"bilinear_patch\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\ttable& patch_structure = require_structure(Primitive, \"patch\");\n\t\ttable& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\tmesh::selection_t& patch_selections = require_array<mesh::selection_t >(Primitive, patch_structure, \"patch_selections\");\n\t\tmesh::materials_t& patch_materials = require_array<mesh::materials_t >(Primitive, patch_structure, \"patch_materials\");\n\t\tmesh::indices_t& patch_points = require_array<mesh::indices_t >(Primitive, vertex_structure, \"patch_points\");\n\n\t\ttable& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\ttable& patch_attributes = require_attributes(Primitive, \"patch\");\n\t\ttable& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\ttable& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\trequire_metadata(Primitive, patch_selections, \"patch_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, patch_points, \"patch_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", patch_structure.row_count() * 4);\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", patch_structure.row_count() * 4);\n\n\t\treturn new primitive(patch_selections, patch_materials, patch_points, constant_attributes, patch_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"bilinear_patch\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace bilinear_patch\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/bilinear_patch.h",
    "content": "#ifndef K3DSDK_BILINEAR_PATCH_H\n#define K3DSDK_BILINEAR_PATCH_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace bilinear_patch\n{\n\n/// Gathers the member arrays of a bilinear_patch primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::selection_t& PatchSelections,\n\t\tconst mesh::materials_t& PatchMaterials,\n\t\tconst mesh::indices_t& PatchPoints,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& PatchAttributes,\n\t\tconst mesh::table_t& ParameterAttributes,\n\t\tconst mesh::table_t& VertexAttributes\n\t\t);\n\n\tconst mesh::selection_t& patch_selections;\n\tconst mesh::materials_t& patch_materials;\n\tconst mesh::indices_t& patch_points;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& patch_attributes;\n\tconst mesh::table_t& parameter_attributes;\n\tconst mesh::table_t& vertex_attributes;\n};\n\n/// Gathers the member arrays of a bilinear_patch primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::selection_t& PatchSelections,\n\t\tmesh::materials_t& PatchMaterials,\n\t\tmesh::indices_t& PatchPoints,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& PatchAttributes,\n\t\tmesh::table_t& ParameterAttributes,\n\t\tmesh::table_t& VertexAttributes\n\t\t);\n\n\tmesh::selection_t& patch_selections;\n\tmesh::materials_t& patch_materials;\n\tmesh::indices_t& patch_points;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& patch_attributes;\n\tmesh::table_t& parameter_attributes;\n\tmesh::table_t& vertex_attributes;\n};\n\n/// Creates a new bilinear_patch mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid bilinear_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid bilinear_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid bilinear_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace bilinear_patch\n\n} // namespace k3d\n\n#endif // !K3DSDK_BILINEAR_PATCH_H\n\n"
  },
  {
    "path": "k3dsdk/bitmap.h",
    "content": "#ifndef K3DSDK_BITMAP_H\n#define K3DSDK_BITMAP_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/Half/half.h>\n#include <k3dsdk/result.h>\n\n#include <algorithm>\n#include <cmath>\n#include <functional>\n#include <iostream>\n#include <string>\n\n#include <boost/version.hpp>\n#if BOOST_VERSION < 106900\n#include <boost/gil/gil_all.hpp>\n#else\n#include <boost/gil.hpp>\n#endif\n\nnamespace boost\n{\n\nnamespace gil\n{\n\ntypedef boost::uint8_t  bits8;\ntypedef float32_t bits32f;\n\ntemplate<>\nstruct channel_traits<half>\n{\n\ttypedef half value_type;\n\ttypedef half& reference;\n\ttypedef half* pointer;\n\ttypedef const half& const_reference;\n\ttypedef const half* const_pointer;\n\tBOOST_STATIC_CONSTANT(bool, is_mutable=true);\n\n\tstatic value_type min_value()\n\t{\n\t\treturn half(0.0f);\n\t}\n\n\tstatic value_type max_value()\n\t{\n\t\treturn half(1.0f);\n\t}\n};\n\ntemplate <> struct channel_converter_unsigned<bits32f,half> : public std::unary_function<bits32f,bits32f>\n{\n\thalf operator()(bits32f   x) const { return half(static_cast<float>(x)); }\n};\n\n} // namespace gil\n\n} // namespace boost\n\nnamespace k3d\n{\n\n/// Defines a standard pixel as half-precision floating-point RGBA\ntypedef boost::gil::pixel<half, boost::gil::rgba_layout_t> pixel;\n/// Defines a standard bitmap as half-precision floating-point RGBA\ntypedef boost::gil::image<pixel, false> bitmap;\n/// Define storage for a pixel coordinate\ntypedef bitmap::coord_t pixel_size_t;\n\n/// Fills a bitmap with a checkerboard pattern with given check dimensions and colors\ntemplate<typename bitmap_t, typename even_color_t, typename odd_color_t>\nvoid checkerboard_fill(bitmap_t& Bitmap, const pixel_size_t CheckWidth, const pixel_size_t CheckHeight, const even_color_t EvenColor, const odd_color_t OddColor)\n{\n\ttypename bitmap_t::iterator target = Bitmap.begin();\n\n\tfor(pixel_size_t y = 0; y < Bitmap.height(); ++y)\n\t{\n\t\tconst bool even_row = (y / CheckHeight) % 2;\n\n\t\tfor(pixel_size_t x = 0; x < Bitmap.width(); ++x)\n\t\t{\n\t\t\tconst bool even_column = (x / CheckWidth) % 2;\n\n\t\t\tif((even_row + even_column) % 2)\n\t\t\t\t*target = EvenColor;\n\t\t\telse\n\t\t\t\t*target = OddColor;\n\n\t\t\t++target;\n\t\t}\n\t}\n}\n\n} // namespace k3d\n\n#endif // !K3DSDK_BITMAP_H\n\n"
  },
  {
    "path": "k3dsdk/bitmap_modifier.h",
    "content": "#ifndef K3DSDK_BITMAP_MODIFIER_H\n#define K3DSDK_BITMAP_MODIFIER_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/ibitmap_sink.h>\n#include <k3dsdk/ibitmap_source.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/pointer_demand_storage.h>\n\nnamespace k3d\n{\n\ntemplate<typename derived_t>\nclass bitmap_modifier :\n\tpublic ibitmap_source,\n\tpublic ibitmap_sink\n{\npublic:\n\tiproperty& bitmap_source_output()\n\t{\n\t\treturn m_output_bitmap;\n\t}\n\n\tiproperty& bitmap_sink_input()\n\t{\n\t\treturn m_input_bitmap;\n\t}\n\n\tsigc::slot<void, ihint*> make_update_bitmap_slot()\n\t{\n\t\treturn m_output_bitmap.make_slot();\n\t}\n\nprotected:\n\tbitmap_modifier() :\n\t\tm_input_bitmap(\n\t\t\tinit_owner(owner())\n\t\t\t+ init_name(\"input_bitmap\")\n\t\t\t+ init_label(_(\"Input Bitmap\"))\n\t\t\t+ init_description(_(\"Input bitmap\"))\n\t\t\t+ init_value<bitmap*>(0)),\n\t\tm_output_bitmap(\n\t\t\tinit_owner(owner())\n\t\t\t+ init_name(\"output_bitmap\")\n\t\t\t+ init_label(_(\"Output Bitmap\"))\n\t\t\t+ init_description(_(\"Output bitmap\")))\n\t{\n\t\tm_output_bitmap.set_update_slot(sigc::mem_fun(*this, &bitmap_modifier<derived_t>::execute));\n\n\t\tm_input_bitmap.changed_signal().connect(hint::converter<\n\t\t\thint::convert<hint::bitmap_dimensions_changed, hint::unchanged,\n\t\t\thint::convert<hint::bitmap_pixels_changed, hint::unchanged,\n\t\t\thint::convert<hint::any, hint::none> > > >(m_output_bitmap.make_slot()));\n\t}\n\n\tk3d_data(bitmap*, immutable_name, change_signal, no_undo, local_storage, no_constraint, read_only_property, no_serialization) m_input_bitmap;\n\tk3d_data(bitmap*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_output_bitmap;\n\nprivate:\n\tinline derived_t& owner()\n\t{\n\t\treturn *static_cast<derived_t*>(this);\n\t}\n\n\tvoid execute(const std::vector<ihint*>& Hints, bitmap& Bitmap)\n\t{\n\t\tif(const bitmap* const input = m_input_bitmap.pipeline_value())\n\t\t{\n\t\t\tbool resize_bitmap = false;\n\t\t\tbool assign_pixels = false;\n\n\t\t\tfor(int i = 0; i != Hints.size(); ++i)\n\t\t\t{\n\t\t\t\t// Input pixels changed, so all we have to do is reassign ours ...\n\t\t\t\tif(dynamic_cast<hint::bitmap_pixels_changed*>(Hints[i]))\n\t\t\t\t{\n\t\t\t\t\tassign_pixels = true;\n\t\t\t\t}\n\t\t\t\t// In every other case (bitmap_dimensions_changed, unknown hint, or no hint),\n\t\t\t\t// we must assume the worst and recreate everything from scratch ...\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tresize_bitmap = true;\n\t\t\t\t\tassign_pixels = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(resize_bitmap)\n\t\t\t{\n\t\t\t\towner().document().pipeline_profiler().start_execution(owner(), \"Resize Bitmap\");\n\t\t\t\ton_resize_bitmap(*input, Bitmap);\n\t\t\t\towner().document().pipeline_profiler().finish_execution(owner(), \"Resize Bitmap\");\n\t\t\t}\n\n\t\t\tif(assign_pixels)\n\t\t\t{\n\t\t\t\towner().document().pipeline_profiler().start_execution(owner(), \"Assign Pixels\");\n\t\t\t\ton_assign_pixels(*input, Bitmap);\n\t\t\t\towner().document().pipeline_profiler().finish_execution(owner(), \"Assign Pixels\");\n\t\t\t}\n\t\t}\n\t}\n\n\tvirtual void on_resize_bitmap(const bitmap& Input, bitmap& Output) = 0;\n\tvirtual void on_assign_pixels(const bitmap& Input, bitmap& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_BITMAP_MODIFIER_H\n\n"
  },
  {
    "path": "k3dsdk/bitmap_sink.h",
    "content": "#ifndef K3DSDK_BITMAP_SINK_H\n#define K3DSDK_BITMAP_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/ibitmap_sink.h>\n#include <k3d-i18n-config.h>\n\nnamespace k3d\n{\n\ntemplate<typename derived_t>\nclass bitmap_sink :\n\tpublic ibitmap_sink\n{\npublic:\n\tiproperty& bitmap_sink_input()\n\t{\n\t\treturn m_input_bitmap;\n\t}\n\n\tsigc::slot<void, ihint*> make_input_changed_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &bitmap_sink<derived_t>::input_changed);\n\t}\n\nprotected:\n\tbitmap_sink() :\n\t\tm_input_bitmap(\n\t\t\tinit_owner(*static_cast<derived_t*>(this))\n\t\t\t+ init_name(\"input_bitmap\")\n\t\t\t+ init_label(_(\"Input Bitmap\"))\n\t\t\t+ init_description(_(\"Input bitmap\"))\n\t\t\t+ init_value<bitmap*>(0))\n\t{\n\t\tm_input_bitmap.changed_signal().connect(make_input_changed_slot());\n\t}\n\n\tk3d_data(bitmap*, data::immutable_name, data::change_signal, data::no_undo, data::local_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_input_bitmap;\n\nprivate:\n\tvoid input_changed(k3d::ihint* Hint)\n\t{\n\t\ton_input_changed(Hint);\n\t}\n\n\tvirtual void on_input_changed(k3d::ihint*) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_BITMAP_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/bitmap_source.h",
    "content": "#ifndef K3DSDK_BITMAP_SOURCE_H\n#define K3DSDK_BITMAP_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/ibitmap_source.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/pointer_demand_storage.h>\n\nnamespace k3d\n{\n\n/// Boilerplate CRTP class for bitmap source objects that produce a k3d::bitmap* as output.\ntemplate<typename derived_t>\nclass bitmap_source :\n\tpublic ibitmap_source\n{\npublic:\n\tiproperty& bitmap_source_output()\n\t{\n\t\treturn m_output_bitmap;\n\t}\n\n\t/// Returns a slot that should be connected to input properties to signal that the output has changed.\n\tsigc::slot<void, ihint*> make_update_bitmap_slot()\n\t{\n\t\treturn m_output_bitmap.make_slot();\n\t}\n\nprotected:\n\tbitmap_source() :\n\t\tm_output_bitmap(\n\t\t\tinit_owner(owner())\n\t\t\t+ init_name(\"output_bitmap\")\n\t\t\t+ init_label(_(\"Output Bitmap\"))\n\t\t\t+ init_description(_(\"Output bitmap\")))\n\t{\n\t\tm_output_bitmap.set_update_slot(sigc::mem_fun(*this, &bitmap_source<derived_t>::execute));\n\t}\n\n\t/// Stores the output bitmap, which is created on-demand.\n\tk3d_data(bitmap*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_output_bitmap;\n\nprivate:\n\tinline derived_t& owner()\n\t{\n\t\treturn *static_cast<derived_t*>(this);\n\t}\n\n\t/// Called whenever the output has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, bitmap& Bitmap)\n\t{\n\t\tbool_t resize_bitmap = false;\n\t\tbool_t assign_pixels = false;\n\n\t\tfor(uint_t i = 0; i != Hints.size(); ++i)\n\t\t{\n\t\t\t// Input pixels changed, so all we have to do is reassign ours ...\n\t\t\tif(dynamic_cast<hint::bitmap_pixels_changed*>(Hints[i]))\n\t\t\t{\n\t\t\t\tassign_pixels = true;\n\t\t\t}\n\t\t\t// In every other case (bitmap_dimensions_changed, unknown hint, or no hint),\n\t\t\t// we must assume the worst and recreate everything from scratch ...\n\t\t\telse\n\t\t\t{\n\t\t\t\tresize_bitmap = true;\n\t\t\t\tassign_pixels = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(resize_bitmap)\n\t\t{\n\t\t\towner().document().pipeline_profiler().start_execution(owner(), \"Resize Bitmap\");\n\t\t\ton_resize_bitmap(Bitmap);\n\t\t\towner().document().pipeline_profiler().finish_execution(owner(), \"Resize Bitmap\");\n\t\t}\n\n\t\tif(assign_pixels)\n\t\t{\n\t\t\towner().document().pipeline_profiler().start_execution(owner(), \"Assign Pixels\");\n\t\t\ton_assign_pixels(Bitmap);\n\t\t\towner().document().pipeline_profiler().finish_execution(owner(), \"Assign Pixels\");\n\t\t}\n\t}\n\n\t/// Implement this in derived classes to set the size of the output bitmap.\n\tvirtual void on_resize_bitmap(bitmap& Output) = 0;\n\t/// Implement this in derived classes to assign values to each output pixel.\n\tvirtual void on_assign_pixels(bitmap& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_BITMAP_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/blobby.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/blobby.h>\n#include <k3dsdk/primitive_validation.h>\n\n#include <numeric>\n\nnamespace k3d\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::indices_t& FirstPrimitives,\n\tconst mesh::counts_t& PrimitiveCounts,\n\tconst mesh::indices_t& FirstOperators,\n\tconst mesh::counts_t& OperatorCounts,\n\tconst mesh::materials_t& Materials,\n\tconst typed_array<int32_t>& Primitives,\n\tconst mesh::indices_t& PrimitiveFirstFloats,\n\tconst mesh::counts_t& PrimitiveFloatCounts,\n\tconst typed_array<int32_t>& Operators,\n\tconst mesh::indices_t& OperatorFirstOperands,\n\tconst mesh::counts_t& OperatorOperandCounts,\n\tconst mesh::doubles_t& Floats,\n\tconst mesh::indices_t& Operands,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& SurfaceAttributes,\n\tconst mesh::table_t& ParameterAttributes,\n\tconst mesh::table_t& VertexAttributes\n\t\t) :\n\tfirst_primitives(FirstPrimitives),\n\tprimitive_counts(PrimitiveCounts),\n\tfirst_operators(FirstOperators),\n\toperator_counts(OperatorCounts),\n\tmaterials(Materials),\n\tprimitives(Primitives),\n\tprimitive_first_floats(PrimitiveFirstFloats),\n\tprimitive_float_counts(PrimitiveFloatCounts),\n\toperators(Operators),\n\toperator_first_operands(OperatorFirstOperands),\n\toperator_operand_counts(OperatorOperandCounts),\n\tfloats(Floats),\n\toperands(Operands),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::indices_t& FirstPrimitives,\n\tmesh::counts_t& PrimitiveCounts,\n\tmesh::indices_t& FirstOperators,\n\tmesh::counts_t& OperatorCounts,\n\tmesh::materials_t& Materials,\n\ttyped_array<int32_t>& Primitives,\n\tmesh::indices_t& PrimitiveFirstFloats,\n\tmesh::counts_t& PrimitiveFloatCounts,\n\ttyped_array<int32_t>& Operators,\n\tmesh::indices_t& OperatorFirstOperands,\n\tmesh::counts_t& OperatorOperandCounts,\n\tmesh::doubles_t& Floats,\n\tmesh::indices_t& Operands,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& SurfaceAttributes,\n\tmesh::table_t& ParameterAttributes,\n\tmesh::table_t& VertexAttributes\n\t\t) :\n\tfirst_primitives(FirstPrimitives),\n\tprimitive_counts(PrimitiveCounts),\n\tfirst_operators(FirstOperators),\n\toperator_counts(OperatorCounts),\n\tmaterials(Materials),\n\tprimitives(Primitives),\n\tprimitive_first_floats(PrimitiveFirstFloats),\n\tprimitive_float_counts(PrimitiveFloatCounts),\n\toperators(Operators),\n\toperator_first_operands(OperatorFirstOperands),\n\toperator_operand_counts(OperatorOperandCounts),\n\tfloats(Floats),\n\toperands(Operands),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"blobby\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::indices_t>(\"first_primitives\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::counts_t>(\"primitive_counts\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::indices_t>(\"first_operators\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::counts_t>(\"operator_counts\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::materials_t>(\"materials\"),\n\t\tgeneric_primitive.structure[\"vertex\"].create<typed_array<int32_t> >(\"primitives\"),\n\t\tgeneric_primitive.structure[\"vertex\"].create<mesh::indices_t>(\"primitive_first_floats\"),\n\t\tgeneric_primitive.structure[\"vertex\"].create<mesh::counts_t>(\"primitive_float_counts\"),\n\t\tgeneric_primitive.structure[\"operator\"].create<typed_array<int32_t> >(\"operators\"),\n\t\tgeneric_primitive.structure[\"operator\"].create<mesh::indices_t>(\"operator_first_operands\"),\n\t\tgeneric_primitive.structure[\"operator\"].create<mesh::counts_t >(\"operator_operand_counts\"),\n\t\tgeneric_primitive.structure[\"float\"].create<mesh::doubles_t>(\"floats\"),\n\t\tgeneric_primitive.structure[\"operand\"].create<mesh::indices_t>(\"operands\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"surface\"],\n\t\tgeneric_primitive.attributes[\"parameter\"],\n\t\tgeneric_primitive.attributes[\"vertex\"]\n\t\t);\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"blobby\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\t\tconst mesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\t\tconst mesh::table_t& operator_structure = require_structure(Primitive, \"operator\");\n\t\tconst mesh::table_t& float_structure = require_structure(Primitive, \"float\");\n\t\tconst mesh::table_t& operand_structure = require_structure(Primitive, \"operand\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tconst mesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tconst mesh::indices_t& first_primitives = require_array<mesh::indices_t>(Primitive, surface_structure, \"first_primitives\");\n\t\tconst mesh::counts_t& primitive_counts = require_array<mesh::counts_t>(Primitive, surface_structure, \"primitive_counts\");\n\t\tconst mesh::indices_t& first_operators = require_array<mesh::indices_t>(Primitive, surface_structure, \"first_operators\");\n\t\tconst mesh::counts_t& operator_counts = require_array<mesh::counts_t>(Primitive, surface_structure, \"operator_counts\");\n\t\tconst mesh::materials_t& materials = require_array<mesh::materials_t>(Primitive, surface_structure, \"materials\");\n\t\tconst typed_array<int32_t>& primitives = require_array<typed_array<int32_t> >(Primitive, vertex_structure, \"primitives\");\n\t\tconst mesh::indices_t& primitive_first_floats = require_array<mesh::indices_t>(Primitive, vertex_structure, \"primitive_first_floats\");\n\t\tconst mesh::counts_t& primitive_float_counts = require_array<mesh::counts_t>(Primitive, vertex_structure, \"primitive_float_counts\");\n\t\tconst typed_array<int32_t>& operators = require_array<typed_array<int32_t> >(Primitive, operator_structure, \"operators\");\n\t\tconst mesh::indices_t& operator_first_operands = require_array<mesh::indices_t>(Primitive, operator_structure, \"operator_first_operands\");\n\t\tconst mesh::counts_t& operator_operand_counts = require_array<mesh::counts_t>(Primitive, operator_structure, \"operator_operand_counts\");\n\t\tconst mesh::doubles_t& floats = require_array<mesh::doubles_t>(Primitive, float_structure, \"floats\");\n\t\tconst mesh::indices_t& operands = require_array<mesh::indices_t>(Primitive, operand_structure, \"operands\");\n\n\t\t/** \\todo Validate table lengths here */\n\n\t\treturn new const_primitive(first_primitives, primitive_counts, first_operators, operator_counts, materials, primitives, primitive_first_floats, primitive_float_counts, operators, operator_first_operands, operator_operand_counts, floats, operands, constant_attributes, surface_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"blobby\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\t\tmesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\t\tmesh::table_t& operator_structure = require_structure(Primitive, \"operator\");\n\t\tmesh::table_t& float_structure = require_structure(Primitive, \"float\");\n\t\tmesh::table_t& operand_structure = require_structure(Primitive, \"operand\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tmesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tmesh::indices_t& first_primitives = require_array<mesh::indices_t>(Primitive, surface_structure, \"first_primitives\");\n\t\tmesh::counts_t& primitive_counts = require_array<mesh::counts_t>(Primitive, surface_structure, \"primitive_counts\");\n\t\tmesh::indices_t& first_operators = require_array<mesh::indices_t>(Primitive, surface_structure, \"first_operators\");\n\t\tmesh::counts_t& operator_counts = require_array<mesh::counts_t>(Primitive, surface_structure, \"operator_counts\");\n\t\tmesh::materials_t& materials = require_array<mesh::materials_t>(Primitive, surface_structure, \"materials\");\n\t\ttyped_array<int32_t>& primitives = require_array<typed_array<int32_t> >(Primitive, vertex_structure, \"primitives\");\n\t\tmesh::indices_t& primitive_first_floats = require_array<mesh::indices_t>(Primitive, vertex_structure, \"primitive_first_floats\");\n\t\tmesh::counts_t& primitive_float_counts = require_array<mesh::counts_t>(Primitive, vertex_structure, \"primitive_float_counts\");\n\t\ttyped_array<int32_t>& operators = require_array<typed_array<int32_t> >(Primitive, operator_structure, \"operators\");\n\t\tmesh::indices_t& operator_first_operands = require_array<mesh::indices_t>(Primitive, operator_structure, \"operator_first_operands\");\n\t\tmesh::counts_t& operator_operand_counts = require_array<mesh::counts_t>(Primitive, operator_structure, \"operator_operand_counts\");\n\t\tmesh::doubles_t& floats = require_array<mesh::doubles_t>(Primitive, float_structure, \"floats\");\n\t\tmesh::indices_t& operands = require_array<mesh::indices_t>(Primitive, operand_structure, \"operands\");\n\n\t\t/** \\todo Validate table lengths here */\n\n\t\treturn new primitive(first_primitives, primitive_counts, first_operators, operator_counts, materials, primitives, primitive_first_floats, primitive_float_counts, operators, operator_first_operands, operator_operand_counts, floats, operands, constant_attributes, surface_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"blobby\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace blobby\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/blobby.h",
    "content": "#ifndef K3DSDK_BLOBBY_H\n#define K3DSDK_BLOBBY_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace blobby\n{\n\n/// Predefined primitive types from the RenderMan Specification\nenum primitive_type\n{\n\tCONSTANT = 1000,\n\tELLIPSOID = 1001,\n\tSEGMENT = 1002,\n};\n\n/// Predefined operator types from the RenderMan Specification\nenum operator_type\n{\n\tADD = 0,\n\tMULTIPLY = 1,\n\tMAXIMUM = 2,\n\tMINIMUM = 3,\n\tSUBTRACT = 4,\n\tDIVIDE = 5,\n\tNEGATE = 6,\n\tIDENTITY = 7,\n};\n\n/// Gathers the member arrays of a blobby primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::indices_t& FirstPrimitives,\n\t\tconst mesh::counts_t& PrimitiveCounts,\n\t\tconst mesh::indices_t& FirstOperators,\n\t\tconst mesh::counts_t& OperatorCounts,\n\t\tconst mesh::materials_t& Materials,\n\t\tconst typed_array<int32_t>& Primitives,\n\t\tconst mesh::indices_t& PrimitiveFirstFloats,\n\t\tconst mesh::counts_t& PrimitiveFloatCounts,\n\t\tconst typed_array<int32_t>& Operators,\n\t\tconst mesh::indices_t& OperatorFirstOperands,\n\t\tconst mesh::counts_t& OperatorOperandCounts,\n\t\tconst mesh::doubles_t& Floats,\n\t\tconst mesh::indices_t& Operands,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& SurfaceAttributes,\n\t\tconst mesh::table_t& ParameterAttributes,\n\t\tconst mesh::table_t& VertexAttributes\n\t\t);\n\n\tconst mesh::indices_t& first_primitives;\n\tconst mesh::counts_t& primitive_counts;\n\tconst mesh::indices_t& first_operators;\n\tconst mesh::counts_t& operator_counts;\n\tconst mesh::materials_t& materials;\n\tconst typed_array<int32_t>& primitives;\n\tconst mesh::indices_t& primitive_first_floats;\n\tconst mesh::counts_t& primitive_float_counts;\n\tconst typed_array<int32_t>& operators;\n\tconst mesh::indices_t& operator_first_operands;\n\tconst mesh::counts_t& operator_operand_counts;\n\tconst mesh::doubles_t& floats;\n\tconst mesh::indices_t& operands;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& surface_attributes;\n\tconst mesh::table_t& parameter_attributes;\n\tconst mesh::table_t& vertex_attributes;\n};\n\n/// Gathers the member arrays of a blobby primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::indices_t& FirstPrimitives,\n\t\tmesh::counts_t& PrimitiveCounts,\n\t\tmesh::indices_t& FirstOperators,\n\t\tmesh::counts_t& OperatorCounts,\n\t\tmesh::materials_t& Materials,\n\t\ttyped_array<int32_t>& Primitives,\n\t\tmesh::indices_t& PrimitiveFirstFloats,\n\t\tmesh::counts_t& PrimitiveFloatCounts,\n\t\ttyped_array<int32_t>& Operators,\n\t\tmesh::indices_t& OperatorFirstOperands,\n\t\tmesh::counts_t& OperatorOperandCounts,\n\t\tmesh::doubles_t& Floats,\n\t\tmesh::indices_t& Operands,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& SurfaceAttributes,\n\t\tmesh::table_t& ParameterAttributes,\n\t\tmesh::table_t& VertexAttributes\n\t\t);\n\n\tmesh::indices_t& first_primitives;\n\tmesh::counts_t& primitive_counts;\n\tmesh::indices_t& first_operators;\n\tmesh::counts_t& operator_counts;\n\tmesh::materials_t& materials;\n\ttyped_array<int32_t>& primitives;\n\tmesh::indices_t& primitive_first_floats;\n\tmesh::counts_t& primitive_float_counts;\n\ttyped_array<int32_t>& operators;\n\tmesh::indices_t& operator_first_operands;\n\tmesh::counts_t& operator_operand_counts;\n\tmesh::doubles_t& floats;\n\tmesh::indices_t& operands;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& surface_attributes;\n\tmesh::table_t& parameter_attributes;\n\tmesh::table_t& vertex_attributes;\n};\n\n/// Creates a new blobby mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid blobby primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid blobby primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid blobby primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace blobby\n\n} // namespace k3d\n\n#endif // !K3DSDK_BLOBBY_H\n\n"
  },
  {
    "path": "k3dsdk/boost_throw_exception.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/log.h>\n\n#include <cassert>\n#include <exception>\n#include <ostream>\n\nnamespace boost\n{\n\n/// Override the boost exception handler to make debugging easier\nvoid throw_exception(std::exception const & e)\n{\n\tk3d::log() << critical << \"Boost exception: \" << e.what() << std::endl;\n\tassert(0);\n}\n\n} // namespace boost\n\n"
  },
  {
    "path": "k3dsdk/bounding_box3.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/bounding_box3.h>\n#include <k3dsdk/algebra.h>\n\nnamespace k3d\n{\n\nbounding_box3& bounding_box3::operator*=(const matrix4 Transformation)\n{\n\tbounding_box3 transformed;\n\ttransformed.insert(Transformation * point3(px, py, pz));\n\ttransformed.insert(Transformation * point3(nx, py, pz));\n\ttransformed.insert(Transformation * point3(nx, py, nz));\n\ttransformed.insert(Transformation * point3(px, py, nz));\n\ttransformed.insert(Transformation * point3(px, ny, pz));\n\ttransformed.insert(Transformation * point3(nx, ny, pz));\n\ttransformed.insert(Transformation * point3(nx, ny, nz));\n\ttransformed.insert(Transformation * point3(px, ny, nz));\n\n\t*this = transformed;\n\n\treturn *this;\n}\n\nbounding_box3 operator*(const bounding_box3& BBox, const matrix4& Transformation)\n{\n\tbounding_box3 new_box = BBox;\n\tnew_box *= Transformation;\n\n\treturn new_box;\n}\n\nbounding_box3 operator*(const matrix4& Transformation, const bounding_box3& BBox)\n{\n\tbounding_box3 new_box = BBox;\n\tnew_box *= Transformation;\n\n\treturn new_box;\n}\n\nbool operator==(const bounding_box3& LHS, const bounding_box3& RHS)\n{\n\treturn LHS.nx == RHS.nx && LHS.px == RHS.px && LHS.ny == RHS.ny && LHS.py == RHS.py && LHS.nz == RHS.nz && LHS.pz == RHS.pz;\n}\n\nbool operator!=(const bounding_box3& LHS, const bounding_box3& RHS)\n{\n\treturn !(LHS == RHS);\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const bounding_box3& RHS)\n{\n\tStream << RHS.nx << \" \" << RHS.px << \" \" << RHS.ny << \" \" << RHS.py << \" \" << RHS.nz << \" \" << RHS.pz;\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, bounding_box3& RHS)\n{\n\tStream >> RHS.nx >> RHS.px >> RHS.ny >> RHS.py >> RHS.nz >> RHS.pz;\n\treturn Stream;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/bounding_box3.h",
    "content": "#ifndef K3DSDK_BOUNDING_BOX3_H\n#define K3DSDK_BOUNDING_BOX3_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include <k3dsdk/point3.h>\n\n#include <algorithm>\n#include <cassert>\n#include <cmath>\n#include <iosfwd>\n#include <limits>\n\nnamespace k3d\n{\n\nclass matrix4;\n\n/// Stores an axis-aligned bounding-box in three space\nclass bounding_box3\n{\npublic:\n\t/// Initializes an \"empty\" bounding box (note: \"empty\" means \"undefined\" - it's not the same as having all values zero)\n\texplicit bounding_box3() :\n\t\tpx(-std::numeric_limits<double>::max()),\n\t\tnx(std::numeric_limits<double>::max()),\n\t\tpy(-std::numeric_limits<double>::max()),\n\t\tny(std::numeric_limits<double>::max()),\n\t\tpz(-std::numeric_limits<double>::max()),\n\t\tnz(std::numeric_limits<double>::max())\n\t{\n\t}\n\n\tbounding_box3(double PX, double NX, double PY, double NY, double PZ, double NZ) :\n\t\tpx(std::max(PX, NX)),\n\t\tnx(std::min(PX, NX)),\n\t\tpy(std::max(PY, NY)),\n\t\tny(std::min(PY, NY)),\n\t\tpz(std::max(PZ, NZ)),\n\t\tnz(std::min(PZ, NZ))\n\t{\n\t}\n\n\t/// Grows the bounding box as needed to contain the given point\n\tvoid insert(const point3& Point)\n\t{\n\t\tpx = std::max(px, Point[0]);\n\t\tnx = std::min(nx, Point[0]);\n\t\tpy = std::max(py, Point[1]);\n\t\tny = std::min(ny, Point[1]);\n\t\tpz = std::max(pz, Point[2]);\n\t\tnz = std::min(nz, Point[2]);\n\t}\n\n\t/// Grows the bounding box as needed to contain the given bounding box\n\tvoid insert(const bounding_box3& Box)\n\t{\n\t\tpx = std::max(px, Box.px);\n\t\tnx = std::min(nx, Box.nx);\n\t\tpy = std::max(py, Box.py);\n\t\tny = std::min(ny, Box.ny);\n\t\tpz = std::max(pz, Box.pz);\n\t\tnz = std::min(nz, Box.nz);\n\t}\n\n\t/// Returns true iff the bounding box contains the given point\n\tbool contains(const point3& Point) const\n\t{\n\t\treturn nx <= Point[0] && Point[0] <= px && ny <= Point[1] && Point[1] <= py && nz <= Point[2] && Point[2] <= pz;\n\t}\n\n\t/// Returns true iff the box is empty (undefined)\n\tbool empty() const\n\t{\n\t\treturn px < nx || py < ny || pz < nz;\n\t}\n\n\t/// Returns the width of the bounding box, or zero if the box is empty\n\tdouble width() const\n\t{\n\t\treturn empty() ? 0.0 : px-nx;\n\t}\n\n\t/// Returns the height of the bounding box, or zero if the box is empty\n\tdouble height() const\n\t{\n\t\treturn empty() ? 0.0 : py-ny;\n\t}\n\n\t/// Returns the depth of the bounding box, or zero if the box is empty\n\tdouble depth() const\n\t{\n\t\treturn empty() ? 0.0 : pz-nz;\n\t}\n\n\t/// Returns the center of the bounding box, asserts if the box is empty\n\tconst point3 center() const\n\t{\n\t\tassert(!empty());\n\t\treturn point3((px + nx) / 2, (py + ny) / 2, (pz + nz) / 2);\n\t}\n\n\tbounding_box3& operator*=(const matrix4 Transformation);\n\n\t/// Stores the maximum x value (not necessarily positive)\n\tdouble px;\n\t/// Stores the minimum x value (not necessarily negative)\n\tdouble nx;\n\t/// Stores the maximum y value (not necessarily positive)\n\tdouble py;\n\t/// Stores the minimum y value (not necessarily negative)\n\tdouble ny;\n\t/// Stores the maximum z value (not necessarily positive)\n\tdouble pz;\n\t/// Stores the minimum z value (not necessarily negative)\n\tdouble nz;\n};\n\nbounding_box3 operator*(const bounding_box3& BBox, const matrix4& Transformation);\nbounding_box3 operator*(const matrix4& Transformation, const bounding_box3& BBox);\nbool operator==(const bounding_box3& LHS, const bounding_box3& RHS);\nbool operator!=(const bounding_box3& LHS, const bounding_box3& RHS);\n\nstd::ostream& operator<<(std::ostream& Stream, const bounding_box3& RHS);\nstd::istream& operator>>(std::istream& Stream, bounding_box3& RHS);\n\n} // namespace k3d\n\n#endif // !K3DSDK_BOUNDING_BOX3_H\n\n"
  },
  {
    "path": "k3dsdk/classes.h",
    "content": "#ifndef K3DSDK_CLASSES_H\n#define K3DSDK_CLASSES_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Provides public definitions of a subset of commonly-used class IDs\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/uuid.h>\n\nnamespace k3d\n{\n\n// Forward declarations\nclass iunknown;\n\nnamespace classes\n{\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////\n////\n//// DO NOT ADD TO THIS LIST!!!\n////\n//// You DO NOT have to add your objects' class IDs to this list to get them recognized\n//// by K-3D!  This list only defines the class IDs for a subset of commonly-used objects\n//// that need to be explicitly instantiated by other objects (like import plugins).\n////\n//// In general, you should never care about an object's class ID - only its capabilities,\n//// as advertised by its interfaces!\n////\n//// Never, never change the values of the class IDs in this list - they get serialized in\n//// documents, and are used to thaw out the correct object types!\n////\n//// Now go call your mother!\n////\n//////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////\n\n/** \\name Active class IDs */\n//@{\ninline const uuid Axes() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000001); }\ninline const uuid FileBitmap() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000003); }\ninline const uuid RenderManLight() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x0000001d); }\ninline const uuid RenderManMaterial() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000024); }\ninline const uuid Cone() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000064); }\ninline const uuid Cylinder() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000065); }\ninline const uuid Disk() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000066); }\ninline const uuid Hyperboloid() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000067); }\ninline const uuid Paraboloid() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000068); }\ninline const uuid Sphere() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000069); }\ninline const uuid Torus() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x0000006a); }\ninline const uuid PerlEngine() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000075); }\ninline const uuid PythonEngine() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000076); }\ninline const uuid ScalarBezierChannel() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x0000007c); }\ninline const uuid ColorBezierChannel() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x0000007d); }\ninline const uuid TIFFBitmapExporter() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000085); }\ninline const uuid FrozenMesh() { return uuid(0x305ceb88, 0x7cf34870, 0x8b5e673c, 0x636beab9); }\ninline const uuid MeshInstance() { return uuid(0x2c1d60a6, 0x863541a1, 0xbd649bd1, 0x1ea8ae24); }\ninline const uuid TimeSource() { return uuid(0x1978f1f7, 0x4a864c99, 0x8caf7cfc, 0xd2591baf); }\ninline const uuid OpenGLEngine() { return uuid(0x0059ba47, 0x7bf740f3, 0x93fb523d, 0x5899f22c); }\ninline const uuid RenderManEngine() { return uuid(0x0dc5e733, 0xfa684e05, 0x86a3865f, 0x42f7a99d); }\ninline const uuid RenderManDisplacementShader() { return uuid(0x62827bb7, 0x4cb64427, 0xa9eadbc8, 0x62e1a3f2); }\ninline const uuid RenderManImagerShader() { return uuid(0x91659033, 0xbd124ba0, 0x81eabb0a, 0xc5ecd094); }\ninline const uuid RenderManLightShader() { return uuid(0x830e867b, 0x7bc94c6c, 0x8d5087ee, 0x8aa35db2); }\ninline const uuid RenderManSurfaceShader() { return uuid(0xb553a3bd, 0xd1044c6e, 0xb3f21e07, 0x87132c31); }\ninline const uuid RenderManVolumeShader() { return uuid(0xfd07a255, 0x9bb84841, 0x87632abe, 0x3ceb9fc7); }\ninline const uuid Position() { return uuid(0xe2edd795, 0x08f9416a, 0x84139876, 0x9c25a60a); }\ninline const uuid Orientation() { return uuid(0xcf562348, 0x02624035, 0xae649a84, 0xf42e0b69); }\ninline const uuid Scale() { return uuid(0x542de0d6, 0xe1e94e4a, 0x883eb23c, 0x3612fb8a); }\ninline const uuid FrozenMatrix() { return uuid(0x6ea85710, 0x90da4d35, 0xacec30ee, 0xa6aacb9d); }\ninline const uuid Camera() { return uuid(0x45ce1872, 0xaf184b6d, 0xb391e136, 0x0dcfe8b5); }\ninline const uuid DocumentExporter() { return uuid(0x0cbc9131, 0x172541b2, 0xb424afab, 0x25143d55); }\ninline const uuid DocumentImporter() { return uuid(0xf02e8dac, 0xa57d4d76, 0xa6170c3a, 0x9bf09d3b); }\ninline const uuid AqsisDisplacementShaderLayer() { return uuid(0x1802dce3, 0x71004329, 0x80cbdf0e, 0xbc7f142c); }\ninline const uuid AqsisSurfaceShaderLayer() { return uuid(0x261e244e, 0xd82947ba, 0x9e56a9af, 0x03d4cc0f); }\ninline const uuid MultiMaterial() { return uuid(0x00000001, 0x00000002, 0x00000003, 0x00000004); }\n//@}\n\n/** \\name Inactive class IDs for plugins that have been removed */\n//@{\ninline const uuid JavaScriptEngine() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000048); }\ninline const uuid Transform() { return uuid(0x00000001, 0x00000000, 0x00000000, 0x00000081); }\n//@}\n\n} // namespace classes\n\n} // namespace k3d\n\n#endif // !K3DSDK_CLASSES_H\n\n"
  },
  {
    "path": "k3dsdk/color.h",
    "content": "#ifndef K3DSDK_COLOR_H\n#define K3DSDK_COLOR_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/Half/half.h>\n#include <k3dsdk/result.h>\n\n#include <algorithm>\n#include <cmath>\n#include <functional>\n#include <iomanip>\n#include <iostream>\n#include <string>\n\n#include <boost/cstdint.hpp>\n#include <boost/io/ios_state.hpp>\n\n\nnamespace k3d\n{\n\ntemplate<typename, typename>\nclass basic_alpha;\n\t\ntemplate<typename, typename>\nclass basic_luma;\n\ntemplate<typename, typename>\nclass basic_luma_alpha;\n\ntemplate<typename, typename>\nclass basic_rgb;\n\ntemplate<typename, typename>\nclass basic_rgba;\n\n/////////////////////////////////////////////////////////////////////////////\n// color_traits\n\n/// Describes traits of a type used as a sample within a color specification\ntemplate<typename SampleType>\nclass color_traits\n{\npublic:\n\ttypedef SampleType sample_type;\n\n\t/// Returns the maximum value of a sample\n\tstatic sample_type minimum();\n\t/// Returns the minimum value of a sample\n\tstatic sample_type maximum();\n\t/// Returns the sample value corresponding to transparent alpha\n\tstatic sample_type transparent() { return minimum(); }\n\t/// Returns the sample value corresponding to opaque alpha\n\tstatic sample_type opaque() { return maximum(); }\n\t/// Inverts the value of a sample\n\tstatic sample_type invert(const sample_type& Sample);\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// color_traits<boost::uint_t>\n\n/// Specialization of color_traits for 8 bit samples\ntemplate<>\nclass color_traits<boost::uint8_t>\n{\npublic:\n\t/// Defines the sample type for this specialization\n\ttypedef boost::uint8_t sample_type;\n\n\t/// Returns the minimum value of a sample\n\tstatic inline sample_type minimum() { return 0; }\n\t/// Returns the maximum value of a sample\n\tstatic inline sample_type maximum() { return 255; }\n\t/// Returns the sample value corresponding to transparent alpha\n\tstatic inline sample_type transparent() { return minimum(); }\n\t/// Returns the sample value corresponding to opaque alpha\n\tstatic inline sample_type opaque() { return maximum(); }\n\t/// Inverts the value of a sample\n\tstatic inline sample_type invert(const sample_type& Sample) { return maximum() - Sample; }\n\n\t/// Converts a sample from a uint8_t\n\tstatic inline sample_type convert(const sample_type Sample) { return Sample; }\n\t/// Converts a sample from a half\n\tstatic inline sample_type convert(const half Sample) { return static_cast<sample_type>(clamp(Sample, half(0), half(1)) * maximum()); }\n\t/// Converts a sample from a float\n\tstatic inline sample_type convert(const float Sample) { return static_cast<sample_type>(clamp(Sample, float(0), float(1)) * maximum()); }\n\t/// Converts a sample from a double\n\tstatic inline sample_type convert(const double_t Sample) { return static_cast<sample_type>(clamp(Sample, double_t(0), double_t(1)) * maximum()); }\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// color_traits<boost::uint16_t>\n\n/// Specialization of color_traits for 16 bit samples\ntemplate<>\nclass color_traits<boost::uint16_t>\n{\npublic:\n\t/// Defines the sample type for this specialization\n\ttypedef boost::uint16_t sample_type;\n\n\t/// Returns the minimum value of a sample\n\tstatic inline sample_type minimum() { return 0; }\n\t/// Returns the maximum value of a sample\n\tstatic inline sample_type maximum() { return 65535; }\n\t/// Returns the sample value corresponding to transparent alpha\n\tstatic inline sample_type transparent() { return minimum(); }\n\t/// Returns the sample value corresponding to opaque alpha\n\tstatic inline sample_type opaque() { return maximum(); }\n\t/// Inverts the value of a sample\n\tstatic inline sample_type invert(const sample_type& Sample) { return maximum() - Sample; }\n\n\t/// Converts a sample from a uint16_t\n\tstatic inline sample_type convert(const sample_type Sample) { return Sample; }\n\t/// Converts a sample from a half\n\tstatic inline sample_type convert(const half Sample) { return static_cast<sample_type>(clamp(Sample, half(0), half(1)) * maximum()); }\n\t/// Converts a sample from a float\n\tstatic inline sample_type convert(const float Sample) { return static_cast<sample_type>(clamp(Sample, float(0), float(1)) * maximum()); }\n\t/// Converts a sample from a double\n\tstatic inline sample_type convert(const double_t Sample) { return static_cast<sample_type>(clamp(Sample, double_t(0), double_t(1)) * maximum()); }\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// color_traits<half>\n\n/// Specialization of color_traits for half samples\ntemplate<>\nclass color_traits<half>\n{\npublic:\n\t/// Defines the sample type for this specialization\n\ttypedef half sample_type;\n\n\t/// Returns the minimum value of a sample\n\tstatic inline sample_type minimum() { return 0; }\n\t/// Returns the maximum value of a sample\n\tstatic inline sample_type maximum() { return 1; }\n\t/// Returns the sample value corresponding to transparent alpha\n\tstatic inline sample_type transparent() { return minimum(); }\n\t/// Returns the sample value corresponding to opaque alpha\n\tstatic inline sample_type opaque() { return maximum(); }\n\t/// Inverts the value of a sample\n\tstatic inline sample_type invert(const sample_type& Sample) { return maximum() - Sample; }\n\n\t/// Converts a sample from a uint8_t\n\tstatic inline sample_type convert(const boost::uint8_t Sample) { return static_cast<sample_type>(Sample) / 255.0f; }\n\t/// Converts a sample from a uint16_t\n\tstatic inline sample_type convert(const boost::uint16_t Sample) { return static_cast<sample_type>(Sample) / 65535.0f; }\n\t/// Converts a sample from a half\n\tstatic inline sample_type convert(const sample_type Sample) { return Sample; }\n\t/// Converts a sample from a float\n\tstatic inline sample_type convert(const float Sample) { return static_cast<sample_type>(Sample); }\n\t/// Converts a sample from a double\n\tstatic inline sample_type convert(const double_t Sample) { return static_cast<sample_type>(static_cast<float>(Sample)); }\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// color_traits<float>\n\n/// Specialization of color_traits for float samples\ntemplate<>\nclass color_traits<float>\n{\npublic:\n\t/// Defines the sample type for this specialization\n\ttypedef float sample_type;\n\n\t/// Returns the minimum value of a sample\n\tstatic inline sample_type minimum() { return 0; }\n\t/// Returns the maximum value of a sample\n\tstatic inline sample_type maximum() { return 1; }\n\t/// Returns the sample value corresponding to transparent alpha\n\tstatic inline sample_type transparent() { return minimum(); }\n\t/// Returns the sample value corresponding to opaque alpha\n\tstatic inline sample_type opaque() { return maximum(); }\n\t/// Inverts the value of a sample\n\tstatic inline sample_type invert(const sample_type& Sample) { return maximum() - Sample; }\n\n\t/// Converts a sample from a uint8_t\n\tstatic inline sample_type convert(const boost::uint8_t Sample) { return static_cast<sample_type>(Sample) / 255.0f; }\n\t/// Converts a sample from a half\n\tstatic inline sample_type convert(const half Sample) { return Sample; }\n\t/// Converts a sample from a float\n\tstatic inline sample_type convert(const sample_type Sample) { return static_cast<sample_type>(Sample); }\n\t/// Converts a sample from a double\n\tstatic inline sample_type convert(const double_t Sample) { return static_cast<sample_type>(Sample); }\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// color_traits<double>\n\n/// Specialization of color_traits for double samples\ntemplate<>\nclass color_traits<double_t>\n{\npublic:\n\t/// Defines the sample type for this specialization\n\ttypedef double_t sample_type;\n\n\t/// Returns the minimum value of a sample\n\tstatic inline sample_type minimum() { return 0; }\n\t/// Returns the maximum value of a sample\n\tstatic inline sample_type maximum() { return 1; }\n\t/// Returns the sample value corresponding to transparent alpha\n\tstatic inline sample_type transparent() { return minimum(); }\n\t/// Returns the sample value corresponding to opaque alpha\n\tstatic inline sample_type opaque() { return maximum(); }\n\t/// Inverts the value of a sample\n\tstatic inline sample_type invert(const sample_type& Sample) { return maximum() - Sample; }\n\n\t/// Converts a sample from a uint8_t\n\tstatic inline sample_type convert(const boost::uint8_t Sample) { return static_cast<sample_type>(Sample) / 255.0; }\n\t/// Converts a sample from a half\n\tstatic inline sample_type convert(const half Sample) { return Sample; }\n\t/// Converts a sample from a float\n\tstatic inline sample_type convert(const float Sample) { return Sample; }\n\t/// Converts a sample from a double\n\tstatic inline sample_type convert(const sample_type Sample) { return Sample; }\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_hsv\n\n/// Encapsulates storage for an HSV color sample\nclass basic_hsv\n{\npublic:\n\ttypedef double_t sample_type;\n\ttypedef color_traits<sample_type> sample_traits;\n\ttypedef basic_hsv this_type;\n\n\t/// Default constructor sets all samples to zero\n\tbasic_hsv() :\n\t\thue(sample_traits::minimum()),\n\t\tsaturation(sample_traits::minimum()),\n\t\tvalue(sample_traits::minimum())\n\t{\n\t}\n\n\t/// Constructor that takes hue, saturation, and value samples\n\tbasic_hsv(const sample_type Hue, const sample_type Saturation, const sample_type Value) :\n\t\thue(Hue),\n\t\tsaturation(Saturation),\n\t\tvalue(Value)\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_hsv(const basic_luma<ForeignType, ForeignTraits>& RHS) :\n\t\thue(sample_traits::minimum()),\n\t\tsaturation(sample_traits::minimum()),\n\t\tvalue(sample_traits::convert(RHS.luma))\n\t{\n\t}\n\n\ttemplate<typename ForeignType>\n\tbasic_hsv(const ForeignType& RHS)\n\t{\n\t\tconst sample_type red = sample_traits::convert(RHS.red);\n\t\tconst sample_type green = sample_traits::convert(RHS.green);\n\t\tconst sample_type blue = sample_traits::convert(RHS.blue);\n\n\t\tconst sample_type maxcomponent = std::max(std::max(red, green), blue);\n\t\tconst sample_type mincomponent = std::min(std::min(red, green), blue);\n\t\tconst sample_type difference = maxcomponent - mincomponent;\n\n\t\tvalue = maxcomponent;\n\n\t\tsaturation = maxcomponent ? difference / maxcomponent : sample_traits::minimum();\n\n\t\tif(saturation != sample_traits::minimum())\n\t\t{\n\t\t\tconst sample_type reddistance = (maxcomponent - red) / difference;\n\t\t\tconst sample_type greendistance = (maxcomponent - green) / difference;\n\t\t\tconst sample_type bluedistance = (maxcomponent - blue) / difference;\n\n\t\t\tif(red == maxcomponent)\n\t\t\t{\n\t\t\t\thue = bluedistance - greendistance;\n\t\t\t}\n\t\t\telse if(green == maxcomponent)\n\t\t\t{\n\t\t\t\thue = 2 + reddistance - bluedistance;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thue = 4 + greendistance - reddistance;\n\t\t\t}\n\n\t\t\thue *= 60;\n\t\t\twhile(hue < 0)\n\t\t\t\thue += 360;\n\t\t\twhile(hue >= 360)\n\t\t\t\thue -= 360;\n\t\t}\n\t\telse\n\t\t{\n\t\t\thue = sample_traits::minimum();\n\t\t}\n\t}\n\n\t/// Serialization\n\tfriend std::ostream& operator<<(std::ostream& Stream, const basic_hsv& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.hue << \" \" << RHS.saturation << \" \" << RHS.value;\n\t\treturn Stream;\n\t}\n\n\t/// Deserialization\n\tfriend std::istream& operator>>(std::istream& Stream, basic_hsv& RHS)\n\t{\n\t\tStream >> RHS.hue >> RHS.saturation >> RHS.value;\n\t\treturn Stream;\n\t}\n\n\tsample_type hue;\n\tsample_type saturation;\n\tsample_type value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_alpha\n\n/// Encapsulates storage for an alpha color sample\ntemplate<typename SampleType, typename SampleTraits = color_traits<SampleType> >\nclass basic_alpha\n{\npublic:\n\ttypedef SampleType sample_type;\n\ttypedef SampleTraits sample_traits;\n\ttypedef basic_alpha<sample_type, sample_traits> this_type;\n\n\t/// Default constructor sets all samples to zero\n\tbasic_alpha() :\n\t\talpha(sample_traits::transparent())\n\t{\n\t}\n\n\t/// Straightforward constructor that initializes samples\n\tbasic_alpha(const sample_type Alpha) :\n\t\talpha(Alpha)\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_alpha(const basic_alpha<ForeignType, ForeignTraits>& RHS) :\n\t\talpha(sample_traits::convert(RHS.Alpha))\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_alpha(const basic_rgb<ForeignType, ForeignTraits>& RHS) :\n\t\talpha(sample_traits::opaque())\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_alpha(const basic_rgba<ForeignType, ForeignTraits>& RHS) :\n\t\talpha(sample_traits::convert(RHS.alpha))\n\t{\n\t}\n\n\tbasic_alpha(const basic_hsv& RHS) :\n\t\talpha(sample_traits::opaque())\n\t{\n\t}\n\n\t/// Serialization\n\tfriend std::ostream& operator<<(std::ostream& Stream, const basic_alpha<sample_type, sample_traits>& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.alpha;\n\t\treturn Stream;\n\t}\n\n\t/// Deserialization\n\tfriend std::istream& operator>>(std::istream& Stream, basic_alpha<sample_type, sample_traits>& RHS)\n\t{\n\t\tStream >> RHS.alpha;\n\t\treturn Stream;\n\t}\n\n\tsample_type alpha;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_luma\n\n/// Encapsulates storage for a luma color sample\ntemplate<typename SampleType, typename SampleTraits = color_traits<SampleType> >\nclass basic_luma\n{\npublic:\n\ttypedef SampleType sample_type;\n\ttypedef SampleTraits sample_traits;\n\ttypedef basic_luma<sample_type, sample_traits> this_type;\n\n\t/// Default constructor sets all samples to zero\n\tbasic_luma() :\n\t\tluma(sample_traits::minimum())\n\t{\n\t}\n\n\t/// Straightforward constructor that initializes samples\n\tbasic_luma(const sample_type Luma) :\n\t\tluma(Luma)\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_luma(const basic_luma<ForeignType, ForeignTraits>& RHS) :\n\t\tluma(sample_traits::convert(RHS.luma))\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_luma(const basic_rgb<ForeignType, ForeignTraits>& RHS) :\n\t\tluma(sample_traits::convert(std::max(RHS.red, std::max(RHS.green, RHS.blue))))\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_luma(const basic_rgba<ForeignType, ForeignTraits>& RHS) :\n\t\tluma(sample_traits::convert(std::max(RHS.red, std::max(RHS.green, RHS.blue))))\n\t{\n\t}\n\n\tbasic_luma(const basic_hsv& RHS) :\n\t\tluma(sample_traits::convert(RHS.value))\n\t{\n\t}\n\n\t/// Serialization\n\tfriend std::ostream& operator<<(std::ostream& Stream, const basic_luma<sample_type, sample_traits>& RHS)\n\t{ \n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.luma;\n\t\treturn Stream;\n\t}\n\n\t/// Deserialization\n\tfriend std::istream& operator>>(std::istream& Stream, basic_luma<sample_type, sample_traits>& RHS)\n\t{\n\t\tStream >> RHS.luma;\n\t\treturn Stream;\n\t}\n\n\tsample_type luma;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_luma_alpha\n\n/// Encapsulates storage for a luma color sample with alpha\ntemplate<typename SampleType, typename SampleTraits = color_traits<SampleType> >\nclass basic_luma_alpha\n{\npublic:\n\ttypedef SampleType sample_type;\n\ttypedef SampleTraits sample_traits;\n\ttypedef basic_luma_alpha<sample_type, sample_traits> this_type;\n\n\t/// Default constructor sets all samples to zero\n\tbasic_luma_alpha() :\n\t\tluma(sample_traits::minimum()),\n\t\talpha(sample_traits::opaque())\n\t{\n\t}\n\n\t/// Straightforward constructor that initializes samples\n\tbasic_luma_alpha(const sample_type Luma) :\n\t\tluma(Luma),\n\t\talpha(sample_traits::opaque())\n\t{\n\t}\n\n\tbasic_luma_alpha(const sample_type Luma, const sample_type Alpha) :\n\t\tluma(Luma),\n\t\talpha(Alpha)\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_luma_alpha(const basic_luma_alpha<ForeignType, ForeignTraits>& RHS) :\n\t\tluma(sample_traits::convert(RHS.luma)),\n\t\talpha(sample_traits::convert(RHS.alpha))\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_luma_alpha(const basic_rgb<ForeignType, ForeignTraits>& RHS) :\n\t\tluma(sample_traits::convert(std::max(RHS.red, std::max(RHS.green, RHS.blue)))),\n\t\talpha(sample_traits::opaque())\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_luma_alpha(const basic_rgba<ForeignType, ForeignTraits>& RHS) :\n\t\tluma(sample_traits::convert(std::max(RHS.red, std::max(RHS.green, RHS.blue)))),\n\t\talpha(sample_traits::convert(RHS.alpha))\n\t{\n\t}\n\n\tbasic_luma_alpha(const basic_hsv& RHS) :\n\t\tluma(sample_traits::convert(RHS.value)),\n\t\talpha(sample_traits::opaque())\n\t{\n\t}\n\n\t/// Serialization\n\tfriend std::ostream& operator<<(std::ostream& Stream, const basic_luma_alpha<sample_type, sample_traits>& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.luma << RHS.alpha;\n\t\treturn Stream;\n\t}\n\n\t/// Deserialization\n\tfriend std::istream& operator>>(std::istream& Stream, basic_luma_alpha<sample_type, sample_traits>& RHS)\n\t{\n\t\tStream >> RHS.luma >> RHS.alpha;\n\t\treturn Stream;\n\t}\n\n\tsample_type luma;\n\tsample_type alpha;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_rgb\n\n/// Encapsulates storage for an RGB color sample\ntemplate<typename SampleType, typename SampleTraits = color_traits<SampleType> >\nclass basic_rgb\n{\npublic:\n\ttypedef SampleType sample_type;\n\ttypedef SampleTraits sample_traits;\n\ttypedef basic_rgb<sample_type, sample_traits> this_type;\n\n\t/// Default constructor sets all samples to zero\n\tbasic_rgb() :\n\t\tred(sample_traits::minimum()),\n\t\tgreen(sample_traits::minimum()),\n\t\tblue(sample_traits::minimum())\n\t{\n\t}\n\n\t/// Constructor that takes red, green, and blue samples\n\tbasic_rgb(const sample_type Red, const sample_type Green, const sample_type Blue) :\n\t\tred(Red),\n\t\tgreen(Green),\n\t\tblue(Blue)\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_rgb(const basic_alpha<ForeignType, ForeignTraits>& RHS) :\n\t\tred(sample_traits::convert(RHS.alpha)),\n\t\tgreen(sample_traits::convert(RHS.alpha)),\n\t\tblue(sample_traits::convert(RHS.alpha))\n\t{\n\t}\n\t\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_rgb(const basic_luma<ForeignType, ForeignTraits>& RHS) :\n\t\tred(sample_traits::convert(RHS.luma)),\n\t\tgreen(sample_traits::convert(RHS.luma)),\n\t\tblue(sample_traits::convert(RHS.luma))\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_rgb(const basic_rgb<ForeignType, ForeignTraits>& RHS) :\n\t\tred(sample_traits::convert(RHS.red)),\n\t\tgreen(sample_traits::convert(RHS.green)),\n\t\tblue(sample_traits::convert(RHS.blue))\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_rgb(const basic_rgba<ForeignType, ForeignTraits>& RHS) :\n\t\tred(sample_traits::convert(RHS.red)),\n\t\tgreen(sample_traits::convert(RHS.green)),\n\t\tblue(sample_traits::convert(RHS.blue))\n\t{\n\t}\n\n\tbasic_rgb(const basic_hsv& RHS)\n\t{\n\t\t// Easiest case - saturation is zero\n\t\tif(0 == RHS.saturation)\n\t\t{\n\t\t\tred = green = blue = sample_traits::convert(RHS.value);\n\t\t\treturn;\n\t\t}\n\n\t\tconst double_t h = RHS.hue / 60;\n\t\tconst double_t i = floor(h);\n\t\tconst double_t f = h - i;\n\t\tconst double_t p = RHS.value * (1 - RHS.saturation);\n\t\tconst double_t q = RHS.value * (1 - (RHS.saturation * f));\n\t\tconst double_t t = RHS.value * (1 - (RHS.saturation * (1 - f)));\n\n\t\tif(0.0 == i)\n\t\t{\n\t\t\tred = sample_traits::convert(RHS.value);\n\t\t\tgreen = sample_traits::convert(t);\n\t\t\tblue = sample_traits::convert(p);\n\t\t}\n\t\telse if(1.0 == i)\n\t\t{\n\t\t\tred = sample_traits::convert(q);\n\t\t\tgreen = sample_traits::convert(RHS.value);\n\t\t\tblue = sample_traits::convert(p);\n\t\t}\n\t\telse if(2.0 == i)\n\t\t{\n\t\t\tred = sample_traits::convert(p);\n\t\t\tgreen = sample_traits::convert(RHS.value);\n\t\t\tblue = sample_traits::convert(t);\n\t\t}\n\t\telse if(3.0 == i)\n\t\t{\n\t\t\tred = sample_traits::convert(p);\n\t\t\tgreen = sample_traits::convert(q);\n\t\t\tblue = sample_traits::convert(RHS.value);\n\t\t}\n\t\telse if(4.0 == i)\n\t\t{\n\t\t\tred = sample_traits::convert(t);\n\t\t\tgreen = sample_traits::convert(p);\n\t\t\tblue = sample_traits::convert(RHS.value);\n\t\t}\n\t\telse if(5.0 == i)\n\t\t{\n\t\t\tred = sample_traits::convert(RHS.value);\n\t\t\tgreen = sample_traits::convert(p);\n\t\t\tblue = sample_traits::convert(q);\n\t\t}\n\t}\n\n\tconst double_t* data() const\n\t{\n\t\treturn &red;\n\t}\n\n\tfriend bool operator==(const this_type& LHS, const this_type& RHS)\n\t{\n\t\treturn LHS.red == RHS.red && LHS.green == RHS.green && LHS.blue == RHS.blue;\n\t}\n\n\tfriend bool operator!=(const this_type& LHS, const this_type& RHS)\n\t{\n\t\treturn !(LHS == RHS);\n\t}\n\n\tfriend const this_type operator+(const this_type& LHS, const this_type& RHS)\n\t{\n\t\treturn this_type(LHS.red + RHS.red, LHS.green + RHS.green, LHS.blue + RHS.blue);\n\t}\n\t\n\tfriend const this_type operator-(const this_type& LHS, const this_type& RHS)\n\t{\n\t\treturn this_type(LHS.red - RHS.red, LHS.green - RHS.green, LHS.blue - RHS.blue);\n\t}\n\t\n\tfriend const this_type operator*(const this_type& LHS, const double_t RHS)\n\t{\n\t\treturn this_type(LHS.red * RHS, LHS.green * RHS, LHS.blue * RHS);\n\t}\n\n\tfriend const this_type operator*(const double_t LHS, const this_type& RHS)\n\t{\n\t\treturn RHS * LHS;\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const basic_rgb<sample_type, sample_traits>& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.red << \" \" << RHS.green << \" \" << RHS.blue;\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, basic_rgb<sample_type, sample_traits>& RHS)\n\t{\n\t\tStream >> RHS.red >> RHS.green >> RHS.blue;\n\t\treturn Stream;\n\t}\n\n\tsample_type red;\n\tsample_type green;\n\tsample_type blue;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_rgba\n\n/// Encapsulates storage for an RGBA color sample\ntemplate<typename SampleType, typename SampleTraits = color_traits<SampleType> >\nclass basic_rgba\n{\npublic:\n\ttypedef SampleType sample_type;\n\ttypedef SampleTraits sample_traits;\n\ttypedef basic_rgba<sample_type, sample_traits> this_type;\n\n\t/// Default constructor sets all samples to zero\n\tbasic_rgba() :\n\t\tred(sample_traits::minimum()),\n\t\tgreen(sample_traits::minimum()),\n\t\tblue(sample_traits::minimum()),\n\t\talpha(sample_traits::opaque())\n\t{\n\t}\n\n\t/// Constructor that takes red, green, and blue samples, and sets alpha opaque\n\tbasic_rgba(const sample_type Red, const sample_type Green, const sample_type Blue) :\n\t\tred(Red),\n\t\tgreen(Green),\n\t\tblue(Blue),\n\t\talpha(sample_traits::opaque())\n\t{\n\t}\n\n\t/// Constructor that takes red, green, blue, and alpha samples\n\tbasic_rgba(const sample_type Red, const sample_type Green, const sample_type Blue, const sample_type Alpha) :\n\t\tred(Red),\n\t\tgreen(Green),\n\t\tblue(Blue),\n\t\talpha(Alpha)\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_rgba(const basic_luma<ForeignType, ForeignTraits>& RHS) :\n\t\tred(sample_traits::convert(RHS.luma)),\n\t\tgreen(sample_traits::convert(RHS.luma)),\n\t\tblue(sample_traits::convert(RHS.luma)),\n\t\talpha(sample_traits::opaque())\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_rgba(const basic_luma_alpha<ForeignType, ForeignTraits>& RHS) :\n\t\tred(sample_traits::convert(RHS.luma)),\n\t\tgreen(sample_traits::convert(RHS.luma)),\n\t\tblue(sample_traits::convert(RHS.luma)),\n\t\talpha(sample_traits::convert(RHS.alpha))\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_rgba(const basic_rgb<ForeignType, ForeignTraits>& RHS) :\n\t\tred(sample_traits::convert(RHS.red)),\n\t\tgreen(sample_traits::convert(RHS.green)),\n\t\tblue(sample_traits::convert(RHS.blue)),\n\t\talpha(sample_traits::opaque())\n\t{\n\t}\n\n\ttemplate<typename ForeignType, typename ForeignTraits>\n\tbasic_rgba(const basic_rgba<ForeignType, ForeignTraits>& RHS) :\n\t\tred(sample_traits::convert(RHS.red)),\n\t\tgreen(sample_traits::convert(RHS.green)),\n\t\tblue(sample_traits::convert(RHS.blue)),\n\t\talpha(sample_traits::convert(RHS.alpha))\n\t{\n\t}\n\n\t/// Serialization\n\tfriend std::ostream& operator<<(std::ostream& Stream, const basic_rgba<sample_type, sample_traits>& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.red << \" \" << RHS.green << \" \" << RHS.blue << \" \" << RHS.alpha;\n\t\treturn Stream;\n\t}\n\n\t/// Deserialization\n\tfriend std::istream& operator>>(std::istream& Stream, basic_rgba<sample_type, sample_traits>& RHS)\n\t{\n\t\tStream >> RHS.red >> RHS.green >> RHS.blue >> RHS.alpha;\n\t\treturn Stream;\n\t}\n\n\tsample_type red;\n\tsample_type green;\n\tsample_type blue;\n\tsample_type alpha;\n};\n\n/// Convenience typedef for our \"standard\" color type\ntypedef basic_rgb<double_t> color;\n\n/// Specialization of difference::test for color \nnamespace difference\n{\n\ninline void test(const color& A, const color& B, accumulator& Result)\n{\n\ttest(A.red, B.red, Result);\n\ttest(A.green, B.green, Result);\n\ttest(A.blue, B.blue, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_COLOR_H\n\n"
  },
  {
    "path": "k3dsdk/color_source.h",
    "content": "#ifndef K3DSDK_COLOR_SOURCE_H\n#define K3DSDK_COLOR_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/icolor_source.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace k3d\n{\n\ntemplate<typename derived_t>\nclass color_source :\n\tpublic icolor_source\n{\npublic:\n\tiproperty& color_source_output()\n\t{\n\t\treturn m_output_color;\n\t}\n\n\t/// Returns a slot that should be connected to input properties to signal that the output has changed\n\tsigc::slot<void, ihint*> make_update_color_slot()\n\t{\n\t\treturn m_output_color.make_slot();\n\t}\n\nprotected:\n\tcolor_source() :\n\t\tm_output_color(\n\t\t\tinit_owner(*static_cast<derived_t*>(this))\n\t\t\t+ init_name(\"output_color\")\n\t\t\t+ init_label(_(\"Output Color\"))\n\t\t\t+ init_description(_(\"Output color\"))\n\t\t\t+ init_value(k3d::color(1, 1, 1)))\n\t{\n\t\tm_output_color.set_update_slot(sigc::mem_fun(*this, &color_source<derived_t>::execute));\n\t}\n\nprivate:\n\tk3d_data(color, data::immutable_name, data::change_signal, data::no_undo, data::value_demand_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_output_color;\n\n\t/// Called whenever the output has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, color& Output)\n\t{\n\t\t// We can safely ignore any hints ...\n\t\ton_update_color(Output);\n\t}\n\n\tvirtual void on_update_color(color& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_COLOR_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/component.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/component.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n\n#include <boost/assign/list_of.hpp>\n#include <set>\n\nnamespace k3d\n{\n\nconst ilist_property<string_t>::values_t& component_values()\n{\n\tstatic ilist_property<string_t>::values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(\"constant\");\n\t\tvalues.push_back(\"curve\");\n\t\tvalues.push_back(\"edge\");\n\t\tvalues.push_back(\"face\");\n\t\tvalues.push_back(\"parameter\");\n\t\tvalues.push_back(\"patch\");\n\t\tvalues.push_back(\"surface\");\n\t\tvalues.push_back(\"vertex\");\n\t}\n\t\n\treturn values;\n}\n\nconst uint_t component_size(const mesh::primitive& Primitive, const string_t Component)\n{\n\tstatic const std::set<string_t> two_sided_curves = boost::assign::list_of(\"linear_curve\")(\"cubic_curve\")(\"nurbs_curve\");\n\tstatic const std::set<string_t> three_sided_patches = boost::assign::list_of(\"bezier_triangle_patch\");\n\tstatic const std::set<string_t> four_sided_patches = boost::assign::list_of(\"bilinear_patch\")(\"bicubic_patch\")(\"nurbs_patch\");\n\tstatic const std::set<string_t> four_sided_surfaces = boost::assign::list_of(\"cone\")(\"cylinder\")(\"disk\")(\"hyperboloid\")(\"paraboloid\")(\"sphere\")(\"torus\");\n\n\tif(Primitive.structure.count(Component))\n\t{\n\t\treturn Primitive.structure.find(Component)->second.row_count();\n\t}\n\telse if(Component == \"constant\")\n\t{\n\t\treturn 1;\n\t}\n\telse if(Component == \"parameter\" && two_sided_curves.count(Primitive.type))\n\t{\n\t\treturn Primitive.structure.find(\"curve\")->second.row_count() * 2;\n\t}\n\telse if(Component == \"parameter\" && three_sided_patches.count(Primitive.type))\n\t{\n\t\treturn Primitive.structure.find(\"patch\")->second.row_count() * 3;\n\t}\n\telse if(Component == \"parameter\" && four_sided_patches.count(Primitive.type))\n\t{\n\t\treturn Primitive.structure.find(\"patch\")->second.row_count() * 4;\n\t}\n\telse if(Component == \"parameter\" && four_sided_surfaces.count(Primitive.type))\n\t{\n\t\treturn Primitive.structure.find(\"surface\")->second.row_count() * 4;\n\t}\n\n\tk3d::log() << error << \"Cannot determine count for unknown attribute [\" << Component << \"] in [\" << Primitive.type << \"] primitive\" << std::endl;\n\treturn 0;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/component.h",
    "content": "#ifndef K3DSDK_COMPONENT_H\n#define K3DSDK_COMPONENT_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ilist_property.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\n/// Returns a list of common component names, for use with list properties.\nconst ilist_property<string_t>::values_t& component_values();\n\n/// Returns the correct size for the given component, or zero if no size can be determined.\nconst uint_t component_size(const mesh::primitive& Primitive, const string_t Component);\n\n} // namespace k3d\n\n#endif // !K3DSDK_COMPONENT_H\n"
  },
  {
    "path": "k3dsdk/cone.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/cone.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\nnamespace k3d\n{\n\nnamespace cone\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::matrices_t& Matrices,\n\tconst mesh::materials_t& Materials,\n\tconst mesh::doubles_t& Heights,\n\tconst mesh::doubles_t& Radii,\n\tconst mesh::doubles_t& SweepAngles,\n\tconst mesh::selection_t& Selections,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& SurfaceAttributes,\n\tconst mesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\theights(Heights),\n\tradii(Radii),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::matrices_t& Matrices,\n\tmesh::materials_t& Materials,\n\tmesh::doubles_t& Heights,\n\tmesh::doubles_t& Radii,\n\tmesh::doubles_t& SweepAngles,\n\tmesh::selection_t& Selections,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& SurfaceAttributes,\n\tmesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\theights(Heights),\n\tradii(Radii),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"cone\");\n\n\tprimitive* const result =  new primitive(\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::matrices_t >(\"matrices\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::materials_t>(\"materials\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t>(\"heights\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t>(\"radii\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t>(\"sweep_angles\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::selection_t>(\"selections\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"surface\"],\n\t\tgeneric_primitive.attributes[\"parameter\"]\n\t\t);\n\n\tresult->selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"cone\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tconst mesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tconst mesh::materials_t& materials = require_array<mesh::materials_t>(Primitive, surface_structure, \"materials\");\n\t\tconst mesh::doubles_t& heights = require_array<mesh::doubles_t>(Primitive, surface_structure, \"heights\");\n\t\tconst mesh::doubles_t& radii = require_array<mesh::doubles_t>(Primitive, surface_structure, \"radii\");\n\t\tconst mesh::doubles_t& sweep_angles = require_array<mesh::doubles_t>(Primitive, surface_structure, \"sweep_angles\");\n\t\tconst mesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new const_primitive(matrices, materials, heights, radii, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"cone\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tmesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tmesh::materials_t& materials = require_array<mesh::materials_t>(Primitive, surface_structure, \"materials\");\n\t\tmesh::doubles_t& heights = require_array<mesh::doubles_t>(Primitive, surface_structure, \"heights\");\n\t\tmesh::doubles_t& radii = require_array<mesh::doubles_t>(Primitive, surface_structure, \"radii\");\n\t\tmesh::doubles_t& sweep_angles = require_array<mesh::doubles_t>(Primitive, surface_structure, \"sweep_angles\");\n\t\tmesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new primitive(matrices, materials, heights, radii, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"cone\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace cone\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/cone.h",
    "content": "#ifndef K3DSDK_CONE_H\n#define K3DSDK_CONE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace cone\n{\n\n/// Gathers the member arrays of a cone primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::matrices_t& Matrices,\n\t\tconst mesh::materials_t& Materials,\n\t\tconst mesh::doubles_t& Heights,\n\t\tconst mesh::doubles_t& Radii,\n\t\tconst mesh::doubles_t& SweepAngles,\n\t\tconst mesh::selection_t& Selections,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& SurfaceAttributes,\n\t\tconst mesh::table_t& ParameterAttributes);\n\n\tconst mesh::matrices_t& matrices;\n\tconst mesh::materials_t& materials;\n\tconst mesh::doubles_t& heights;\n\tconst mesh::doubles_t& radii;\n\tconst mesh::doubles_t& sweep_angles;\n\tconst mesh::selection_t& selections;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& surface_attributes;\n\tconst mesh::table_t& parameter_attributes;\n};\n\n/// Gathers the member arrays of a cone primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::matrices_t& Matrices,\n\t\tmesh::materials_t& Materials,\n\t\tmesh::doubles_t& Heights,\n\t\tmesh::doubles_t& Radii,\n\t\tmesh::doubles_t& SweepAngles,\n\t\tmesh::selection_t& Selections,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& SurfaceAttributes,\n\t\tmesh::table_t& ParameterAttributes);\n\n\tmesh::matrices_t& matrices;\n\tmesh::materials_t& materials;\n\tmesh::doubles_t& heights;\n\tmesh::doubles_t& radii;\n\tmesh::doubles_t& sweep_angles;\n\tmesh::selection_t& selections;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& surface_attributes;\n\tmesh::table_t& parameter_attributes;\n};\n\n/// Creates a new cone mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid cone primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid cone primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid cone primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace cone\n\n} // namespace k3d\n\n#endif // !K3DSDK_CONE_H\n\n"
  },
  {
    "path": "k3dsdk/contributors.cpp",
    "content": "\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/contributors.h>\n\nnamespace k3d\n{\n\ncontributor::contributor(const string_t& Category) :\n\tcategory(Category)\n{\n}\n\ncontributor::contributor(const ustring& Name, const string_t& Description) :\n\tname(Name),\n\tdescription(Description)\n{\n}\n\nconst contributors_t& contributors()\n{\n\tstatic contributors_t storage;\n\tif(storage.empty())\n\t{\n\t\tstorage.push_back(contributor(\"Founders\"));\n\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Timothy M. Shead\"), \"K-3D Founder\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Romain Behar\"), \"K-3D Co-Founder\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Bart Janssens\"), \"K-3D Co-Founder\")); \n\t\n\t\tstorage.push_back(contributor(\"Contributors\"));\n\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Alexander Curtis\"), \"Integrated material manager\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Anders Dahnielson\"), \"Documentation, script engines, web design\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Anders Stenberg\"), \"UV mapping, MSVC build\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Ashish Myles\"), \"Bezier Triangles\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Carlos Andres Dominguez Caballero\"), \"File import / export plugins\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Carsten Thomas Haubold\"), \"NURBS modeling tools\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Daniel S. \\\"Scalable Vector\\\" Matthews\"), \"Win32 build, icons, documentation, samples\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Evan Lezar\"), \"GPU-based processing\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Joaqu\\303\\255n Duo\"), \"User interface enhancements, documentation, web design\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Joe \\\"Incredibly-Super-Critical!\\\" Crawford\"), \"User interface design\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Jotham Ritorze\"), \"Logo design\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Rene Jensen\"), \"Icon design\")); \n\t\t\n\t\tstorage.push_back(contributor(\"Past Contributors\"));\n\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Adam Hupp\"), \"Python script engine enhancements\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Adam Sakareassen\"), \".X file format writer\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Alexander Leidinger\"), \"BSD build\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Alper Ersoy\"), \"Web design\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Andreas Haferburg\"), \"Win32 build\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Andy Gill\"), \"Too many plugins and tools to count\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Anonymous\"), \"Bugfixes\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Anonymous\"), \"Mandrake 9 RPMs\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Ben Campbell\"), \"3DS file format reader\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Brett W. McCoy\"), \"Configuration, ImageMagick plugins\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Chris Funke\"), \"Suse 8.0 build\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Damien Pollet\"), \"MacOSX build\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Dan Erikson\"), \"User interface enhancements\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Daniel MacDonald\"), \"PPC build\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Dave Crane\"), \"Configuration and JavaScript enhancements\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Dave Wallace\"), \"GCC 3.0 fixes\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"David Mart\\303\\255nez Moreno\"), \"Debian build, portability enhancements\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Denis Leroy\"), \"GCC 4.1, Python 2.5 fixes\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Diego Petteno\"), \"NLS fixes, enhancements\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Ed Millard\"), \"User interface fixes, prototype pipeline viewer\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Francisco Andrades Grassi\"), \"Startup script improvements\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Fred Labrosse\"), \"RedHat RPM packages\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Gerhard Reitmayr\"), \"Reentrant Python scripting\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"German Gomez Garcia\"), \"Shader cache enhancements\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Gilles J. Seguin\"), \"Bugfixes\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Giuseppe Zompatori\"), \"RenderMan enhancements\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Gregory Junker\"), \"Shader compilation fixes\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Ian South-Dickinson\"), \"PGP Remesh plugins\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Ilya Volynets\"), \"SGI IRIX build, GCC 3.1 fixes\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Joal Heagney\"), \"Gallery contributions\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Joshua Moline\"), \"Configuration and portability enhancements\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Kevin McBride\"), \"Configure/install fixes\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Kirstyn Amanda \\\"GeekGirl\\\" Fox\"), \"Win32 installer\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Louis-Dominique Dubeau\"), \"Bugfixes and enhancements\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Lukas Schroeder\"), \"Configuration\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Manuel Bastioni\"), \"Authored the first K-3D fan page\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Marco Amato from Udine\"), \"Tutorial localization\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Patrick Mauritz\"), \"Plugin build enhancements\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Peter Balon\"), \"GCC 3.3 fixes\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Paul Gregory\"), \"Win32 build, subdivision surfaces, bug fixes\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Steve Sorensen\"), \"Documentation\"));\n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Tom Browder\"), \"GNU Triangulated Surface support\")); \n\t\tstorage.push_back(contributor(ustring::from_utf8(\"Wladyslaw Strugala\"), \"Win32 build and support\")); \n\t}\n\n\treturn storage;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/contributors.h",
    "content": "#ifndef K3DSDK_CONTRIBUTORS_H\n#define K3DSDK_CONTRIBUTORS_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/types.h>\n#include <k3dsdk/ustring.h>\n#include <vector>\n\nnamespace k3d\n{\n\nstruct contributor\n{\n\tcontributor(const string_t& Category);\n\tcontributor(const ustring& Name, const string_t& Description = \"\");\n\n\tstring_t category;\n\tustring name;\n\tstring_t description;\n};\n\ntypedef std::vector<contributor> contributors_t;\n\nconst contributors_t& contributors();\n\n} // namespace k3d\n\n#endif // !K3DSDK_CONTRIBUTORS_H\n\n"
  },
  {
    "path": "k3dsdk/convert.h",
    "content": "#ifndef K3DSDK_CONVERT_H\n#define K3DSDK_CONVERT_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/static_assert.hpp>\n\nnamespace k3d\n{\n\n/// Perform an explicit conversion between two types.  This template is designed to be specialized on an as-needed\n/// basis so we have a consistent syntax for performing explicit conversions (for example: from k3d::ustring to QString).\ntemplate<typename Target, typename Source>\nTarget convert(const Source& From)\n{\n\t// This will be triggered if this template is ever instantiated\n\tBOOST_STATIC_ASSERT(sizeof(Target) == 0);\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_CONVERT_H\n\n"
  },
  {
    "path": "k3dsdk/cubic_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/cubic_curve.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\n#include <numeric>\n\nnamespace k3d\n{\n\nnamespace cubic_curve\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::bools_t& Periodic,\n\tconst mesh::materials_t& Material,\n\tconst mesh::indices_t& CurveFirstPoints,\n\tconst mesh::counts_t& CurvePointCounts,\n\tconst mesh::selection_t& CurveSelections,\n\tconst mesh::indices_t& CurvePoints,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& CurveAttributes,\n\tconst mesh::table_t& ParameterAttributes,\n\tconst mesh::table_t& VertexAttributes\n\t\t) :\n\tperiodic(Periodic),\n\tmaterial(Material),\n\tcurve_first_points(CurveFirstPoints),\n\tcurve_point_counts(CurvePointCounts),\n\tcurve_selections(CurveSelections),\n\tcurve_points(CurvePoints),\n\tconstant_attributes(ConstantAttributes),\n\tcurve_attributes(CurveAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::bools_t& Periodic,\n\tmesh::materials_t& Material,\n\tmesh::indices_t& CurveFirstPoints,\n\tmesh::counts_t& CurvePointCounts,\n\tmesh::selection_t& CurveSelections,\n\tmesh::indices_t& CurvePoints,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& CurveAttributes,\n\tmesh::table_t& ParameterAttributes,\n\tmesh::table_t& VertexAttributes\n\t\t) :\n\tperiodic(Periodic),\n\tmaterial(Material),\n\tcurve_first_points(CurveFirstPoints),\n\tcurve_point_counts(CurvePointCounts),\n\tcurve_selections(CurveSelections),\n\tcurve_points(CurvePoints),\n\tconstant_attributes(ConstantAttributes),\n\tcurve_attributes(CurveAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"cubic_curve\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"constant\"].create<mesh::bools_t>(\"periodic\"),\n\t\tgeneric_primitive.structure[\"constant\"].create<mesh::materials_t>(\"material\"),\n\t\tgeneric_primitive.structure[\"curve\"].create<mesh::indices_t>(\"curve_first_points\"),\n\t\tgeneric_primitive.structure[\"curve\"].create<mesh::counts_t>(\"curve_point_counts\"),\n\t\tgeneric_primitive.structure[\"curve\"].create<mesh::selection_t>(\"curve_selections\"),\n\t\tgeneric_primitive.structure[\"vertex\"].create<mesh::indices_t>(\"curve_points\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"curve\"],\n\t\tgeneric_primitive.attributes[\"parameter\"],\n\t\tgeneric_primitive.attributes[\"vertex\"]\n\t\t);\n\n\tresult->curve_selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\tresult->curve_points.set_metadata_value(metadata::key::domain(), metadata::value::point_indices_domain());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"cubic_curve\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& constant_structure = require_structure(Primitive, \"constant\");\n\t\tconst mesh::table_t& curve_structure = require_structure(Primitive, \"curve\");\n\t\tconst mesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& curve_attributes = require_attributes(Primitive, \"curve\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tconst mesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tconst mesh::bools_t& periodic = require_array<mesh::bools_t>(Primitive, constant_structure, \"periodic\");\n\t\tconst mesh::materials_t& material = require_array<mesh::materials_t>(Primitive, constant_structure, \"material\");\n\t\tconst mesh::indices_t& curve_first_points = require_array<mesh::indices_t>(Primitive, curve_structure, \"curve_first_points\");\n\t\tconst mesh::counts_t& curve_point_counts = require_array<mesh::counts_t>(Primitive, curve_structure, \"curve_point_counts\");\n\t\tconst mesh::selection_t& curve_selections = require_array<mesh::selection_t>(Primitive, curve_structure, \"curve_selections\");\n\t\tconst mesh::indices_t& curve_points = require_array<mesh::indices_t>(Primitive, vertex_structure, \"curve_points\");\n\n\t\trequire_metadata(Primitive, curve_selections, \"curve_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, curve_points, \"curve_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", std::accumulate(curve_point_counts.begin(), curve_point_counts.end(), 0));\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", curve_structure.row_count() * 2);\n\n\t\treturn new const_primitive(periodic, material, curve_first_points, curve_point_counts, curve_selections, curve_points, constant_attributes, curve_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"cubic_curve\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& constant_structure = require_structure(Primitive, \"constant\");\n\t\tmesh::table_t& curve_structure = require_structure(Primitive, \"curve\");\n\t\tmesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& curve_attributes = require_attributes(Primitive, \"curve\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tmesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tmesh::bools_t& periodic = require_array<mesh::bools_t>(Primitive, constant_structure, \"periodic\");\n\t\tmesh::materials_t& material = require_array<mesh::materials_t>(Primitive, constant_structure, \"material\");\n\t\tmesh::indices_t& curve_first_points = require_array<mesh::indices_t>(Primitive, curve_structure, \"curve_first_points\");\n\t\tmesh::counts_t& curve_point_counts = require_array<mesh::counts_t>(Primitive, curve_structure, \"curve_point_counts\");\n\t\tmesh::selection_t& curve_selections = require_array<mesh::selection_t>(Primitive, curve_structure, \"curve_selections\");\n\t\tmesh::indices_t& curve_points = require_array<mesh::indices_t>(Primitive, vertex_structure, \"curve_points\");\n\n\t\trequire_metadata(Primitive, curve_selections, \"curve_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, curve_points, \"curve_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", std::accumulate(curve_point_counts.begin(), curve_point_counts.end(), 0));\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", curve_structure.row_count() * 2);\n\n\t\treturn new primitive(periodic, material, curve_first_points, curve_point_counts, curve_selections, curve_points, constant_attributes, curve_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"cubic_curve\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace cubic_curve\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/cubic_curve.h",
    "content": "#ifndef K3DSDK_CUBIC_CURVE_H\n#define K3DSDK_CUBIC_CURVE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace cubic_curve\n{\n\n/// Gathers the member arrays of a cubic_curve primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::bools_t& Periodic,\n\t\tconst mesh::materials_t& Material,\n\t\tconst mesh::indices_t& CurveFirstPoints,\n\t\tconst mesh::counts_t& CurvePointCounts,\n\t\tconst mesh::selection_t& CurveSelections,\n\t\tconst mesh::indices_t& CurvePoints,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& CurveAttributes,\n\t\tconst mesh::table_t& ParameterAttributes,\n\t\tconst mesh::table_t& VertexAttributes\n\t\t);\n\n\tconst mesh::bools_t& periodic;\n\tconst mesh::materials_t& material;\n\tconst mesh::indices_t& curve_first_points;\n\tconst mesh::counts_t& curve_point_counts;\n\tconst mesh::selection_t& curve_selections;\n\tconst mesh::indices_t& curve_points;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& curve_attributes;\n\tconst mesh::table_t& parameter_attributes;\n\tconst mesh::table_t& vertex_attributes;\n};\n\n/// Gathers the member arrays of a cubic_curve primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::bools_t& Periodic,\n\t\tmesh::materials_t& Material,\n\t\tmesh::indices_t& CurveFirstPoints,\n\t\tmesh::counts_t& CurvePointCounts,\n\t\tmesh::selection_t& CurveSelections,\n\t\tmesh::indices_t& CurvePoints,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& CurveAttributes,\n\t\tmesh::table_t& ParameterAttributes,\n\t\tmesh::table_t& VertexAttributes\n\t\t);\n\n\tmesh::bools_t& periodic;\n\tmesh::materials_t& material;\n\tmesh::indices_t& curve_first_points;\n\tmesh::counts_t& curve_point_counts;\n\tmesh::selection_t& curve_selections;\n\tmesh::indices_t& curve_points;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& curve_attributes;\n\tmesh::table_t& parameter_attributes;\n\tmesh::table_t& vertex_attributes;\n};\n\n/// Creates a new cubic_curve mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid cubic_curve primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid cubic_curve primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid cubic_curve primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace cubic_curve\n\n} // namespace k3d\n\n#endif // !K3DSDK_CUBIC_CURVE_H\n\n"
  },
  {
    "path": "k3dsdk/cylinder.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-200 7, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/cylinder.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\nnamespace k3d\n{\n\nnamespace cylinder\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::matrices_t& Matrices,\n\tconst mesh::materials_t& Materials,\n\tconst mesh::doubles_t& Radii,\n\tconst mesh::doubles_t& ZMin,\n\tconst mesh::doubles_t& ZMax,\n\tconst mesh::doubles_t& SweepAngles,\n\tconst mesh::selection_t& Selections,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& SurfaceAttributes,\n\tconst mesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tradii(Radii),\n\tz_min(ZMin),\n\tz_max(ZMax),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::matrices_t& Matrices,\n\tmesh::materials_t& Materials,\n\tmesh::doubles_t& Radii,\n\tmesh::doubles_t& ZMin,\n\tmesh::doubles_t& ZMax,\n\tmesh::doubles_t& SweepAngles,\n\tmesh::selection_t& Selections,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& SurfaceAttributes,\n\tmesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tradii(Radii),\n\tz_min(ZMin),\n\tz_max(ZMax),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"cylinder\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::matrices_t >(\"matrices\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::materials_t >(\"materials\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"radii\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"z_min\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"z_max\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"sweep_angles\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::selection_t>(\"selections\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"surface\"],\n\t\tgeneric_primitive.attributes[\"parameter\"]\n\t\t);\n\n\tresult->selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"cylinder\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tconst mesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tconst mesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tconst mesh::doubles_t& radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"radii\");\n\t\tconst mesh::doubles_t& z_min = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_min\");\n\t\tconst mesh::doubles_t& z_max = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_max\");\n\t\tconst mesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tconst mesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new const_primitive(matrices, materials, radii, z_min, z_max, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"cylinder\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tmesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tmesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tmesh::doubles_t& radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"radii\");\n\t\tmesh::doubles_t& z_min = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_min\");\n\t\tmesh::doubles_t& z_max = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_max\");\n\t\tmesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tmesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new primitive(matrices, materials, radii, z_min, z_max, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"cylinder\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace cylinder\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/cylinder.h",
    "content": "#ifndef K3DSDK_CYLINDER_H\n#define K3DSDK_CYLINDER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace cylinder\n{\n\n/// Gathers the member arrays of a cylinder primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::matrices_t& Matrices,\n\t\tconst mesh::materials_t& Materials,\n\t\tconst mesh::doubles_t& Radii,\n\t\tconst mesh::doubles_t& ZMin,\n\t\tconst mesh::doubles_t& ZMax,\n\t\tconst mesh::doubles_t& SweepAngles,\n\t\tconst mesh::selection_t& Selections,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& SurfaceAttributes,\n\t\tconst mesh::table_t& ParameterAttributes);\n\n\tconst mesh::matrices_t& matrices;\n\tconst mesh::materials_t& materials;\n\tconst mesh::doubles_t& radii;\n\tconst mesh::doubles_t& z_min;\n\tconst mesh::doubles_t& z_max;\n\tconst mesh::doubles_t& sweep_angles;\n\tconst mesh::selection_t& selections;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& surface_attributes;\n\tconst mesh::table_t& parameter_attributes;\n};\n\n/// Gathers the member arrays of a cylinder primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::matrices_t& Matrices,\n\t\tmesh::materials_t& Materials,\n\t\tmesh::doubles_t& Radii,\n\t\tmesh::doubles_t& ZMin,\n\t\tmesh::doubles_t& ZMax,\n\t\tmesh::doubles_t& SweepAngles,\n\t\tmesh::selection_t& Selections,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& SurfaceAttributes,\n\t\tmesh::table_t& ParameterAttributes);\n\n\tmesh::matrices_t& matrices;\n\tmesh::materials_t& materials;\n\tmesh::doubles_t& radii;\n\tmesh::doubles_t& z_min;\n\tmesh::doubles_t& z_max;\n\tmesh::doubles_t& sweep_angles;\n\tmesh::selection_t& selections;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& surface_attributes;\n\tmesh::table_t& parameter_attributes;\n};\n\n/// Creates a new cylinder mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid cylinder primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid cylinder primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid cylinder primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace cylinder\n\n} // namespace k3d\n\n#endif // !K3DSDK_CYLINDER_H\n\n"
  },
  {
    "path": "k3dsdk/data.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/base64.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\nnamespace k3d\n{\n\nstd::ostream& operator<<(std::ostream& Stream, const ipath_property::reference_t& RHS)\n{\n\tswitch(RHS)\n\t{\n\t\tcase ipath_property::ABSOLUTE_REFERENCE:\n\t\t\tStream << \"absolute\";\n\t\t\tbreak;\n\t\tcase ipath_property::RELATIVE_REFERENCE:\n\t\t\tStream << \"relative\";\n\t\t\tbreak;\n\t\tcase ipath_property::INLINE_REFERENCE:\n\t\t\tStream << \"inline\";\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, ipath_property::reference_t& RHS)\n{\n\tstd::string temp;\n\tStream >> temp;\n\n\tif(temp == \"absolute\")\n\t\tRHS = ipath_property::ABSOLUTE_REFERENCE;\n\telse if(temp == \"relative\")\n\t\tRHS = ipath_property::RELATIVE_REFERENCE;\n\telse if(temp == \"inline\")\n\t\tRHS = ipath_property::INLINE_REFERENCE;\n\telse\n\t{\n\t\tlog() << error << \"unknown enumeration\" << std::endl;\n\t\tRHS = ipath_property::RELATIVE_REFERENCE;\n\t}\n\n\treturn Stream;\n}\n\nnamespace data\n{\n\niproperty* property_lookup(iproperty* const Source)\n{\n\tiproperty* result = Source;\n\n\t// We lookup property dependencies using two pointers so we can detect cycles ...\n\tiproperty* slow = Source ? Source->property_dependency() : 0;\n\tiproperty* fast = slow ? slow->property_dependency() : 0;\n\twhile(slow)\n\t{\n\t\tif(slow == fast)\n\t\t\treturn Source;\n\n\t\tresult = slow;\n\n\t\tslow = slow->property_dependency();\n\t\tfast = fast ? fast->property_dependency() : 0;\n\t\tfast = fast ? fast->property_dependency() : 0;\n\t}\n\n\treturn result;\n}\n\nxml::element& save_external_resource(xml::element& Element, const ipersistent::save_context& Context, const std::string& Name, const ipath_property::reference_t Reference, const filesystem::path& Value)\n{\n\txml::element& xml_storage = Element.append(\n\txml::element(\"property\",\n\txml::attribute(\"name\", Name)));\n\n\t// Construct absolute and relative paths for later reference\n\tconst filesystem::path absolute_path = filesystem::path(Value.is_complete() ? Value : Context.root_path / Value);\n\n\t// Under certain circumstances, we override the user's choice of reference ...\n\n\t// As a special-case, if the value doesn't have the same root name as the reference\n\t// (i.e. different drive letters on Win32), force an absolute path ...\n\tipath_property::reference_t reference = Reference;\n\tif(reference == ipath_property::RELATIVE_REFERENCE)\n\t{\n\t\tif(Value.is_complete() && Value.root_name() != Context.root_path.root_name())\n\t\t\treference = ipath_property::ABSOLUTE_REFERENCE;\n\t}\n\n\t// As a special-case, an absolute path that points into the share directory\n\t// becomes a relative path ...\n\tif(reference == ipath_property::ABSOLUTE_REFERENCE)\n\t{\n\t\tif(0 == absolute_path.generic_utf8_string().find(share_path().generic_utf8_string()))\n\t\t\treference = ipath_property::RELATIVE_REFERENCE;\n\t}\n\n\t// Actually store the data ...\n\tswitch(reference)\n\t{\n\t\tcase ipath_property::ABSOLUTE_REFERENCE:\n\t\t{\n\t\t\txml_storage.append(xml::attribute(\"reference\", string_cast(ipath_property::ABSOLUTE_REFERENCE)));\n\t\t\txml_storage.append(xml::attribute(\"absolute_path\", absolute_path.generic_utf8_string().raw()));\n\t\t\tbreak;\n\t\t}\n\t\tcase ipath_property::RELATIVE_REFERENCE:\n\t\t{\n\t\t\t// As a special-case, a path that points into the share directory\n\t\t\t// will be stored relative to share, instead of relative to the document\n\t\t\tif(0 == absolute_path.generic_utf8_string().find(share_path().generic_utf8_string()))\n\t\t\t{\n\t\t\t\tconst filesystem::path relative_path = filesystem::make_relative_path(absolute_path, share_path());\n\t\t\t\txml_storage.append(xml::attribute(\"reference\", string_cast(ipath_property::RELATIVE_REFERENCE)));\n\t\t\t\txml_storage.append(xml::attribute(\"relative_path\", relative_path.generic_utf8_string().raw()));\n\t\t\t\txml_storage.append(xml::element(\"root\", \"$K3D_SHARE_PATH\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst filesystem::path relative_path = filesystem::make_relative_path(absolute_path, Context.root_path);\n\t\t\t\txml_storage.append(xml::attribute(\"reference\", string_cast(ipath_property::RELATIVE_REFERENCE)));\n\t\t\t\txml_storage.append(xml::attribute(\"relative_path\", relative_path.generic_utf8_string().raw()));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ipath_property::INLINE_REFERENCE:\n\t\t{\n\t\t\txml_storage.append(xml::attribute(\"reference\", string_cast(ipath_property::INLINE_REFERENCE)));\n\t\t\txml_storage.append(xml::attribute(\"filename\", absolute_path.leaf().raw()));\n\t\t\txml_storage.append(xml::attribute(\"encoding\", \"base64\"));\n\n\t\t\tfilesystem::ifstream file(absolute_path);\n\t\t\tstd::stringstream buffer;\n\t\t\tbase64::encode(file, buffer);\n\t\t\txml_storage.text = \"\\n\" + buffer.str();\n\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\treturn xml_storage;\n}\n\nvoid load_external_resource(xml::element& Element, const ipersistent::load_context& Context, ipath_property::reference_t& Reference, filesystem::path& Value)\n{\n\tReference = xml::attribute_value<ipath_property::reference_t>(Element, \"reference\", ipath_property::RELATIVE_REFERENCE);\n\tswitch(Reference)\n\t{\n\t\tcase ipath_property::ABSOLUTE_REFERENCE:\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\t/** \\todo Change this to use generic_path after version 0.8 */\n\t\t\t\tValue = filesystem::native_path(ustring::from_utf8(xml::attribute_text(Element, \"absolute_path\")));\n\t\t\t\tlog() << info << \"Resolved absolute path \" << Value.native_console_string() << std::endl;\n\t\t\t}\n\t\t\tcatch(std::exception& e)\n\t\t\t{\n\t\t\t\tlog() << error << e.what() << std::endl;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ipath_property::RELATIVE_REFERENCE:\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tfilesystem::path root_path = Context.root_path;\n\t\t\t\tif(xml::element* const xml_root = xml::find_element(Element, \"root\"))\n\t\t\t\t{\n\t\t\t\t\tif(xml_root->text == \"$K3D_SHARE_PATH\")\n\t\t\t\t\t\troot_path = share_path();\n\t\t\t\t\telse\n\t\t\t\t\t\troot_path = filesystem::generic_path(xml_root->text);\n\t\t\t\t}\n\n\t\t\t\tValue = root_path / filesystem::generic_path(xml::attribute_text(Element, \"relative_path\"));\n\t\t\t\tlog() << info << \"Resolved relative path as \" << Value.native_console_string() << std::endl;\n\t\t\t}\n\t\t\tcatch(std::exception& e)\n\t\t\t{\n\t\t\t\tlog() << error << e.what() << std::endl;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ipath_property::INLINE_REFERENCE:\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tValue = system::get_temp_directory() / filesystem::generic_path(xml::attribute_text(Element, \"filename\"));\n\t\t\t\tfilesystem::ofstream file(Value);\n\t\t\t\tstd::stringstream buffer(Element.text);\n\t\t\t\tbase64::decode(buffer, file);\n\n\t\t\t\tlog() << info << \"Extracted inline document to \" << Value.native_console_string() << std::endl;\n\t\t\t}\n\t\t\tcatch(std::exception& e)\n\t\t\t{\n\t\t\t\tlog() << error << e.what() << std::endl;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n} // namespace data\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/data.h",
    "content": "#ifndef K3DSDK_DATA_H\n#define K3DSDK_DATA_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/ienumeration_property.h>\n#include <k3dsdk/ihint.h>\n#include <k3dsdk/ilist_property.h>\n#include <k3dsdk/imeasurement_property.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_change_signal.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/inode_collection_property.h>\n#include <k3dsdk/inode_property.h>\n#include <k3dsdk/ipath_property.h>\n#include <k3dsdk/ipersistent.h>\n#include <k3dsdk/ipersistent_collection.h>\n#include <k3dsdk/ipersistent_lookup.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/iscript_property.h>\n#include <k3dsdk/istate_container.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/xml.h>\n\n#include <boost/lexical_cast.hpp>\n#include <boost/static_assert.hpp>\n#include <boost/type_traits.hpp>\n#include <boost/version.hpp>\n\n#include <cassert>\n#include <string>\n#include <typeinfo>\n\nnamespace k3d\n{\n\nnamespace data\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// container\n\n/// Host class for storing data using serialization, property, name, constraint, undo, storage, and signal policies\ntemplate<typename value_t, class serialization_policy_t>\nclass container :\n\tpublic serialization_policy_t\n{\npublic:\n\ttemplate<typename init_t>\n\tcontainer(const init_t& Init) :\n\t\tserialization_policy_t(Init)\n\t{\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// no_serialization\n\n/// Serialization policy for data containers that do not need to be serialized\ntemplate<typename value_t, class property_policy_t>\nclass no_serialization :\n\tpublic property_policy_t\n{\nprotected:\n\ttemplate<typename init_t>\n\tno_serialization(const init_t& Init) :\n\t\tproperty_policy_t(Init)\n\t{\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// with_serialization\n\n/// Serialization policy for data containers that can be serialized as XML\ntemplate<typename value_t, class property_policy_t>\nclass with_serialization :\n\tpublic property_policy_t,\n\tpublic ipersistent\n{\n\t// This policy only works for data stored by-value\n\tBOOST_STATIC_ASSERT((!boost::is_pointer<value_t>::value));\n\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context&)\n\t{\n\t\tElement.append(xml::element(\"property\", string_cast(property_policy_t::internal_value()), xml::attribute(\"name\", property_policy_t::name())));\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context&)\n\t{\n\t\tstd::string value = Element.text;\n\t\tproperty_policy_t::set_value(from_string(value, property_policy_t::internal_value()));\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\twith_serialization(const init_t& Init) :\n\t\tproperty_policy_t(Init)\n\t{\n\t\tInit.persistent_collection().enable_serialization(Init.name(), *this);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// path_serialization\n\nxml::element& save_external_resource(xml::element& Element, const ipersistent::save_context& Context, const std::string& Name, const ipath_property::reference_t Reference, const filesystem::path& Value);\nvoid load_external_resource(xml::element& Element, const ipersistent::load_context& Context, ipath_property::reference_t& Reference, filesystem::path& Value);\n\n/// Serialization policy for filesystem path data that handles external filesystem resources\ntemplate<typename value_t, class property_policy_t>\nclass path_serialization :\n\tpublic property_policy_t,\n\tpublic ipersistent\n{\n\t// This policy only works for data stored by-value\n\tBOOST_STATIC_ASSERT((!boost::is_pointer<value_t>::value));\n\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context& Context)\n\t{\n\t\tsave_external_resource(Element, Context, property_policy_t::name(), property_policy_t::property_path_reference(), property_policy_t::internal_value());\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context)\n\t{\n\t\tipath_property::reference_t reference;\n\t\tfilesystem::path value;\n\n\t\tload_external_resource(Element, Context, reference, value);\n\n\t\tproperty_policy_t::set_property_path_reference(reference);\n\t\tproperty_policy_t::set_value(value);\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tpath_serialization(const init_t& Init) :\n\t\tproperty_policy_t(Init)\n\t{\n\t\tInit.persistent_collection().enable_serialization(Init.name(), *this);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// node_serialization\n\n/// Serialization policy for data containers that store a document node and can be serialized as XML\ntemplate<typename value_t, class property_policy_t>\nclass node_serialization :\n\tpublic property_policy_t,\n\tpublic ipersistent\n{\n\t// If this assertion fires, it means that you're trying to use node_serialization with a non-node data type\n\tBOOST_STATIC_ASSERT((boost::is_base_and_derived<iunknown, typename boost::remove_pointer<value_t>::type>::value));\n\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context& Context)\n\t{\n\t\tif(property_policy_t::internal_node())\n\t\t\tElement.append(xml::element(\"property\", string_cast(Context.lookup.lookup_id(property_policy_t::internal_node())), xml::attribute(\"name\", property_policy_t::name())));\n\t\telse\n\t\t\tElement.append(xml::element(\"property\", \"0\", xml::attribute(\"name\", property_policy_t::name())));\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context)\n\t{\n\t\tstd::string value = Element.text;\n\t\tproperty_policy_t::set_value(dynamic_cast<value_t>(Context.lookup.lookup_object(from_string(value, static_cast<ipersistent_lookup::id_type>(0)))));\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tnode_serialization(const init_t& Init) :\n\t\tproperty_policy_t(Init)\n\t{\n\t\tInit.persistent_collection().enable_serialization(Init.name(), *this);\n\t}\n\nprivate:\n\tipersistent_lookup::id_type m_node_id;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// node_collection_serialization\n\n/// Serialization policy for data containers that can be serialized as XML\ntemplate<typename value_t, class property_policy_t>\nclass node_collection_serialization :\n\tpublic property_policy_t,\n\tpublic ipersistent\n{\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context& Context)\n\t{\n\t\tstd::stringstream buffer;\n\n\t\tconst inode_collection_property::nodes_t& nodes = property_policy_t::internal_value();\n\t\tfor(inode_collection_property::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\tif(*node)\n\t\t\t\tbuffer << \" \" << string_cast(Context.lookup.lookup_id(*node));\n\t\t\telse\n\t\t\t\tbuffer << \" 0\";\n\t\t}\n\n\t\tElement.append(xml::element(\"property\", buffer.str(), xml::attribute(\"name\", property_policy_t::name())));\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context)\n\t{\n\t\tinode_collection_property::nodes_t nodes;\n\n\t\tstd::stringstream buffer(Element.text);\n\t\tstd::string node;\n\t\twhile(buffer >> node)\n\t\t\tnodes.push_back(dynamic_cast<inode*>(Context.lookup.lookup_object(from_string(node, static_cast<ipersistent_lookup::id_type>(0)))));\n\t\tnodes.erase(std::remove(nodes.begin(), nodes.end(), static_cast<inode*>(0)), nodes.end());\n\n\t\tproperty_policy_t::set_value(nodes);\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tnode_collection_serialization(const init_t& Init) :\n\t\tproperty_policy_t(Init)\n\t{\n\t\tInit.persistent_collection().enable_serialization(Init.name(), *this);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// property_lookup\n\n/** \\brief Encapsulates the lookup process for connected properties\n\t\\note In the case of circular dependencies, returns the same value as the input property\n*/\niproperty* property_lookup(iproperty* const Source);\n\n/////////////////////////////////////////////////////////////////////////////\n// no_property\n\n/// Property policy for data containers that do not expose their values using the K-3D property mechanism\ntemplate<typename value_t, class name_policy_t>\nclass no_property :\n\tpublic name_policy_t\n{\npublic:\n\nprotected:\n\ttemplate<typename init_t>\n\tno_property(const init_t& Init) :\n\t\tname_policy_t(Init)\n\t{\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// read_only_property\n\n/// Property policy that exposes a data container as a read-only K-3D property\ntemplate<typename value_t, class name_policy_t>\nclass read_only_property :\n\tpublic name_policy_t,\n\tpublic iproperty\n{\npublic:\n\tconst value_t pipeline_value()\n\t{\n\t\tiproperty* const source = property_lookup(this);\n\t\tif(source != this)\n\t\t\treturn name_policy_t::constrain_value(boost::any_cast<value_t>(source->property_internal_value()));\n\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst std::string property_name()\n\t{\n\t\treturn name_policy_t::name();\n\t}\n\n\tconst std::string property_label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst std::string property_description()\n\t{\n\t\treturn m_description;\n\t}\n\n\tconst std::type_info& property_type()\n\t{\n\t\treturn typeid(value_t);\n\t}\n\n\tconst boost::any property_internal_value()\n\t{\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst boost::any property_pipeline_value()\n\t{\n\t\treturn pipeline_value();\n\t}\n\n\tinode* property_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\ttypename name_policy_t::changed_signal_t& property_changed_signal()\n\t{\n\t\treturn name_policy_t::changed_signal();\n\t}\n\n\tdeleted_signal_t& property_deleted_signal()\n\t{\n\t\treturn m_deleted_signal;\n\t}\n\n\tiproperty* property_dependency()\n\t{\n\t\treturn m_dependency;\n\t}\n\n\tvoid property_set_dependency(iproperty* Dependency)\n\t{\n\t\tm_dependency = Dependency;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tread_only_property(const init_t& Init) :\n\t\tname_policy_t(Init),\n\t\tm_node(Init.node()),\n\t\tm_label(Init.label()),\n\t\tm_description(Init.description()),\n\t\tm_dependency(0)\n\t{\n\t\tInit.property_collection().register_property(*this);\n\t}\n\n\t~read_only_property()\n\t{\n\t\tm_deleted_signal.emit();\n\t}\n\nprivate:\n\tinode* const m_node;\n\tconst char* const m_label;\n\tconst char* const m_description;\n\tdeleted_signal_t m_deleted_signal;\n\tiproperty* m_dependency;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// writable_property\n\n/// Property policy that exposes a data container as a writable K-3D property\ntemplate<typename value_t, class name_policy_t>\nclass writable_property :\n\tpublic name_policy_t,\n\tpublic iproperty,\n\tpublic iwritable_property\n{\npublic:\n\tconst value_t pipeline_value()\n\t{\n\t\tiproperty* const source = property_lookup(this);\n\t\tif(source != this)\n\t\t\treturn name_policy_t::constrain_value(boost::any_cast<value_t>(source->property_internal_value()));\n\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst std::string property_name()\n\t{\n\t\treturn name_policy_t::name();\n\t}\n\n\tconst std::string property_label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst std::string property_description()\n\t{\n\t\treturn m_description;\n\t}\n\n\tconst std::type_info& property_type()\n\t{\n\t\treturn typeid(value_t);\n\t}\n\n\tconst boost::any property_internal_value()\n\t{\n\t\treturn name_policy_t::internal_value();\n\t}\n\t\n\tconst boost::any property_pipeline_value()\n\t{\n\t\treturn pipeline_value();\n\t}\n\n\tinode* property_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\ttypename name_policy_t::changed_signal_t& property_changed_signal()\n\t{\n\t\treturn name_policy_t::changed_signal();\n\t}\n\n\tdeleted_signal_t& property_deleted_signal()\n\t{\n\t\treturn m_deleted_signal;\n\t}\n\n\tbool property_set_value(const boost::any Value, ihint* const Hint)\n\t{\n\t\tconst value_t* const new_value = boost::any_cast<value_t>(&Value);\n\t\tif(!new_value)\n\t\t\treturn false;\n\n\t\tname_policy_t::set_value(*new_value, Hint);\n\t\treturn true;\n\t}\n\n\tiproperty* property_dependency()\n\t{\n\t\treturn m_dependency;\n\t}\n\n\tvoid property_set_dependency(iproperty* Dependency)\n\t{\n\t\tm_dependency = Dependency;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\twritable_property(const init_t& Init) :\n\t\tname_policy_t(Init),\n\t\tm_node(Init.node()),\n\t\tm_label(Init.label()),\n\t\tm_description(Init.description()),\n\t\tm_dependency(0)\n\t{\n\t\tInit.property_collection().register_property(*this);\n\t}\n\n\t~writable_property()\n\t{\n\t\tm_deleted_signal.emit();\n\t}\n\nprivate:\n\tinode* const m_node;\n\tconst char* const m_label;\n\tconst char* const m_description;\n\tdeleted_signal_t m_deleted_signal;\n\tiproperty* m_dependency;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// string_property\n\n/// Property policy that exposes a data container as a writable string property\ntemplate<typename value_t, class name_policy_t>\nclass string_property :\n\tpublic name_policy_t,\n\tpublic iproperty,\n\tpublic iwritable_property\n{\npublic:\n\tconst value_t pipeline_value()\n\t{\n\t\tiproperty* const source = property_lookup(this);\n\t\tif(source != this)\n\t\t\treturn name_policy_t::constrain_value(boost::any_cast<value_t>(source->property_internal_value()));\n\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst std::string property_name()\n\t{\n\t\treturn name_policy_t::name();\n\t}\n\n\tconst std::string property_label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst std::string property_description()\n\t{\n\t\treturn m_description;\n\t}\n\n\tconst std::type_info& property_type()\n\t{\n\t\treturn typeid(std::string);\n\t}\n\n\tconst boost::any property_internal_value()\n\t{\n\t\ttry\n\t\t{\n\t\t\treturn boost::any(boost::lexical_cast<std::string>(name_policy_t::internal_value()));\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t}\n\n\t\treturn boost::any();\n\t}\n\n\tconst boost::any property_pipeline_value()\n\t{\n\t\treturn pipeline_value();\n\t}\n\n\tinode* property_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\ttypename name_policy_t::changed_signal_t& property_changed_signal()\n\t{\n\t\treturn name_policy_t::changed_signal();\n\t}\n\n\tdeleted_signal_t& property_deleted_signal()\n\t{\n\t\treturn m_deleted_signal;\n\t}\n\n\tiproperty* property_dependency()\n\t{\n\t\treturn m_dependency;\n\t}\n\n\tvoid property_set_dependency(iproperty* Dependency)\n\t{\n\t\tm_dependency = Dependency;\n\t}\n\n\tbool property_set_value(const boost::any Value, ihint* const Hint)\n\t{\n\t\tconst std::string* const new_value = boost::any_cast<std::string>(&Value);\n\t\tif(!new_value)\n\t\t\treturn false;\n\n\t\ttry\n\t\t{\n\t\t\tset_value(boost::lexical_cast<value_t>(*new_value), Hint);\n\t\t\treturn true;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t}\n\n\t\treturn false;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tstring_property(const init_t& Init) :\n\t\tname_policy_t(Init),\n\t\tm_node(Init.node()),\n\t\tm_label(Init.label()),\n\t\tm_description(Init.description()),\n\t\tm_dependency(0)\n\t{\n\t\tInit.property_collection().register_property(*this);\n\t}\n\n\t~string_property()\n\t{\n\t\tm_deleted_signal.emit();\n\t}\n\nprivate:\n\tinode* const m_node;\n\tconst char* const m_label;\n\tconst char* const m_description;\n\tdeleted_signal_t m_deleted_signal;\n\tiproperty* m_dependency;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// path_property\n\n/// Property policy that exposes a data container as a writable K-3D path property\ntemplate<typename value_t, class name_policy_t>\nclass path_property :\n\tpublic name_policy_t,\n\tpublic iproperty,\n\tpublic iwritable_property,\n\tpublic ipath_property\n{\npublic:\n\tconst value_t pipeline_value()\n\t{\n\t\tiproperty* const source = property_lookup(this);\n\t\tif(source != this)\n\t\t\treturn name_policy_t::constrain_value(boost::any_cast<value_t>(source->property_internal_value()));\n\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst std::string property_name()\n\t{\n\t\treturn name_policy_t::name();\n\t}\n\n\tconst std::string property_label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst std::string property_description()\n\t{\n\t\treturn m_description;\n\t}\n\n\tconst std::type_info& property_type()\n\t{\n\t\treturn typeid(value_t);\n\t}\n\n\tconst boost::any property_internal_value()\n\t{\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst boost::any property_pipeline_value()\n\t{\n\t\treturn pipeline_value();\n\t}\n\n\tinode* property_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\ttypename name_policy_t::changed_signal_t& property_changed_signal()\n\t{\n\t\treturn name_policy_t::changed_signal();\n\t}\n\n\tdeleted_signal_t& property_deleted_signal()\n\t{\n\t\treturn m_deleted_signal;\n\t}\n\n\tiproperty* property_dependency()\n\t{\n\t\treturn m_dependency;\n\t}\n\n\tvoid property_set_dependency(iproperty* Dependency)\n\t{\n\t\tm_dependency = Dependency;\n\t}\n\n\tbool property_set_value(const boost::any Value, ihint* const Hint)\n\t{\n\t\tconst value_t* const new_value = boost::any_cast<value_t>(&Value);\n\t\tif(!new_value)\n\t\t\treturn false;\n\t\tname_policy_t::set_value(*new_value, Hint);\n\t\treturn true;\n\t}\n\n\tipath_property::mode_t property_path_mode()\n\t{\n\t\treturn m_mode;\n\t}\n\n\tconst std::string property_path_type()\n\t{\n\t\treturn m_type;\n\t}\n\n\tipath_property::reference_t property_path_reference()\n\t{\n\t\treturn m_reference;\n\t}\n\n\tvoid set_property_path_reference(const ipath_property::reference_t Reference)\n\t{\n\t\tif(Reference != m_reference)\n\t\t{\n\t\t\tm_reference = Reference;\n\t\t\tm_reference_changed_signal.emit();\n\t\t}\n\t}\n\n\tipath_property::path_reference_changed_signal_t& property_path_reference_changed_signal()\n\n\t{\n\t\treturn m_reference_changed_signal;\n\t}\n\n\tconst ipath_property::pattern_filters_t pattern_filters()\n\t{\n\t\treturn m_pattern_filters;\n\t}\n\n\tvoid add_pattern_filter(const ipath_property::pattern_filter& PatternFilter)\n\t{\n\t\tm_pattern_filters.push_back(PatternFilter);\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tpath_property(const init_t& Init) :\n\t\tname_policy_t(Init),\n\t\tm_node(Init.node()),\n\t\tm_label(Init.label()),\n\t\tm_description(Init.description()),\n\t\tm_mode(Init.path_mode()),\n\t\tm_type(Init.path_type()),\n\t\tm_reference(RELATIVE_REFERENCE),\n\t\tm_dependency(0)\n\t{\n\t\tInit.property_collection().register_property(*this);\n\t}\n\n\t~path_property()\n\t{\n\t\tm_deleted_signal.emit();\n\t}\n\nprivate:\n\tinode* const m_node;\n\tconst char* const m_label;\n\tconst char* const m_description;\n\tdeleted_signal_t m_deleted_signal;\n\tconst ipath_property::mode_t m_mode;\n\tconst std::string m_type;\n\tipath_property::reference_t m_reference;\n\tipath_property::path_reference_changed_signal_t m_reference_changed_signal;\n\tipath_property::pattern_filters_t m_pattern_filters;\n\tiproperty* m_dependency;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// script_property\n\n/// Property policy that exposes a data container as a writable K-3D script property\ntemplate<typename value_t, class name_policy_t>\nclass script_property :\n\tpublic name_policy_t,\n\tpublic iproperty,\n\tpublic iwritable_property,\n\tpublic iscript_property\n{\npublic:\n\tconst value_t pipeline_value()\n\t{\n\t\tiproperty* const source = property_lookup(this);\n\t\tif(source != this)\n\t\t\treturn name_policy_t::constrain_value(boost::any_cast<value_t>(source->property_internal_value()));\n\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst std::string property_name()\n\t{\n\t\treturn name_policy_t::name();\n\t}\n\n\tconst std::string property_label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst std::string property_description()\n\t{\n\t\treturn m_description;\n\t}\n\n\tconst std::type_info& property_type()\n\t{\n\t\treturn typeid(std::string);\n\t}\n\n\tconst boost::any property_internal_value()\n\t{\n\t\ttry\n\t\t{\n\t\t\treturn boost::any(boost::lexical_cast<std::string>(name_policy_t::internal_value()));\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t}\n\n\t\treturn boost::any();\n\t}\n\n\tconst boost::any property_pipeline_value()\n\t{\n\t\treturn pipeline_value();\n\t}\n\n\tinode* property_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\ttypename name_policy_t::changed_signal_t& property_changed_signal()\n\t{\n\t\treturn name_policy_t::changed_signal();\n\t}\n\n\tdeleted_signal_t& property_deleted_signal()\n\t{\n\t\treturn m_deleted_signal;\n\t}\n\n\tiproperty* property_dependency()\n\t{\n\t\treturn m_dependency;\n\t}\n\n\tvoid property_set_dependency(iproperty* Dependency)\n\t{\n\t\tm_dependency = Dependency;\n\t}\n\n\tbool property_set_value(const boost::any Value, ihint* const Hint)\n\t{\n\t\tconst std::string* const new_value = boost::any_cast<std::string>(&Value);\n\t\tif(!new_value)\n\t\t\treturn false;\n\n\t\ttry\n\t\t{\n\t\t\tname_policy_t::set_value(boost::lexical_cast<value_t>(*new_value), Hint);\n\t\t\treturn true;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t}\n\n\t\treturn false;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tscript_property(const init_t& Init) :\n\t\tname_policy_t(Init),\n\t\tm_node(Init.node()),\n\t\tm_label(Init.label()),\n\t\tm_description(Init.description()),\n\t\tm_dependency(0)\n\t{\n\t\tInit.property_collection().register_property(*this);\n\t}\n\n\t~script_property()\n\t{\n\t\tm_deleted_signal.emit();\n\t}\n\nprivate:\n\tinode* const m_node;\n\tconst char* const m_label;\n\tconst char* const m_description;\n\tdeleted_signal_t m_deleted_signal;\n\tiproperty* m_dependency;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// enumeration_property\n\n/// Property policy that exposes a data container as a K-3D enumeration property\ntemplate<typename value_t, class name_policy_t>\nclass enumeration_property :\n\tpublic name_policy_t,\n\tpublic iproperty,\n\tpublic iwritable_property,\n\tpublic ienumeration_property\n{\npublic:\n\tconst value_t pipeline_value()\n\t{\n\t\tiproperty* const source = property_lookup(this);\n\t\tif(source != this)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// Because enumeration properties all have type \"string\", we have to convert the source property into our internal type (which\n\t\t\t\t// could fail) before applying any constraints.\n\t\t\t\treturn name_policy_t::constrain_value(boost::lexical_cast<value_t>(boost::any_cast<string_t>(source->property_internal_value())));\n\t\t\t}\n\t\t\tcatch(...)\n\t\t\t{\n\t\t\t\treturn name_policy_t::internal_value();\n\t\t\t}\n\t\t}\n\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst string_t property_name()\n\t{\n\t\treturn name_policy_t::name();\n\t}\n\n\tconst string_t property_label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst string_t property_description()\n\t{\n\t\treturn m_description;\n\t}\n\n\tconst std::type_info& property_type()\n\t{\n\t\treturn typeid(string_t);\n\t}\n\n\tconst boost::any property_internal_value()\n\t{\n\t\ttry\n\t\t{\n\t\t\treturn boost::any(boost::lexical_cast<string_t>(name_policy_t::internal_value()));\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t}\n\n\t\treturn boost::any();\n\t}\n\n\tconst boost::any property_pipeline_value()\n\t{\n\t\ttry\n\t\t{\n\t\t\treturn boost::any(boost::lexical_cast<string_t>(pipeline_value()));\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t}\n\n\t\treturn boost::any();\n\t}\n\n\tinode* property_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\ttypename name_policy_t::changed_signal_t& property_changed_signal()\n\t{\n\t\treturn name_policy_t::changed_signal();\n\t}\n\n\tdeleted_signal_t& property_deleted_signal()\n\t{\n\t\treturn m_deleted_signal;\n\t}\n\n\tiproperty* property_dependency()\n\t{\n\t\treturn m_dependency;\n\t}\n\n\tvoid property_set_dependency(iproperty* Dependency)\n\t{\n\t\tm_dependency = Dependency;\n\t}\n\n\tbool property_set_value(const boost::any Value, ihint* const Hint)\n\t{\n\t\tconst string_t* const new_value = boost::any_cast<string_t>(&Value);\n\t\tif(!new_value)\n\t\t\treturn false;\n\n\t\ttry\n\t\t{\n\t\t\tname_policy_t::set_value(boost::lexical_cast<value_t>(*new_value), Hint);\n\t\t\treturn true;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tenumeration_values_t enumeration_values()\n\t{\n\t\treturn m_values;\n\t}\n\n\tsigc::connection connect_enumeration_values_changed(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_values_changed_signal.connect(Slot);\n\t}\n\n\tvoid notify_enumeration_values_changed()\n\t{\n\t\tm_values_changed_signal.emit();\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tenumeration_property(const init_t& Init) :\n\t\tname_policy_t(Init),\n\t\tm_node(Init.node()),\n\t\tm_label(Init.label()),\n\t\tm_description(Init.description()),\n\t\tm_values(Init.values()),\n\t\tm_dependency(0)\n\t{\n\t\tInit.property_collection().register_property(*this);\n\t}\n\n\t~enumeration_property()\n\t{\n\t\tm_deleted_signal.emit();\n\t}\n\nprivate:\n\tinode* const m_node;\n\tconst char* const m_label;\n\tconst char* const m_description;\n\tconst ienumeration_property::enumeration_values_t& m_values;\n\tsigc::signal<void> m_values_changed_signal;\n\tdeleted_signal_t m_deleted_signal;\n\tiproperty* m_dependency;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// list_property\n\n/// Property policy that exposes a data container as a K-3D list property\ntemplate<typename value_t, class name_policy_t>\nclass list_property :\n\tpublic name_policy_t,\n\tpublic iproperty,\n\tpublic iwritable_property,\n\tpublic ilist_property<value_t>\n{\npublic:\n\tconst value_t pipeline_value()\n\t{\n\t\tiproperty* const source = property_lookup(this);\n\t\tif(source != this)\n\t\t\treturn name_policy_t::constrain_value(boost::any_cast<value_t>(source->property_internal_value()));\n\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst std::string property_name()\n\t{\n\t\treturn name_policy_t::name();\n\t}\n\n\tconst std::string property_label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst std::string property_description()\n\t{\n\t\treturn m_description;\n\t}\n\n\tconst std::type_info& property_type()\n\t{\n\t\treturn typeid(value_t);\n\t}\n\n\tconst boost::any property_internal_value()\n\t{\n\t\treturn boost::any(name_policy_t::internal_value());\n\t}\n\n\tconst boost::any property_pipeline_value()\n\t{\n\t\treturn pipeline_value();\n\t}\n\n\tinode* property_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\ttypename name_policy_t::changed_signal_t& property_changed_signal()\n\t{\n\t\treturn name_policy_t::changed_signal();\n\t}\n\n\tdeleted_signal_t& property_deleted_signal()\n\t{\n\t\treturn m_deleted_signal;\n\t}\n\n\tiproperty* property_dependency()\n\t{\n\t\treturn m_dependency;\n\t}\n\n\tvoid property_set_dependency(iproperty* Dependency)\n\t{\n\t\tm_dependency = Dependency;\n\t}\n\n\tbool property_set_value(const boost::any Value, ihint* const Hint)\n\t{\n\t\tconst value_t* const new_value = boost::any_cast<value_t>(&Value);\n\t\tif(!new_value)\n\t\t\treturn false;\n\n\t\tname_policy_t::set_value(*new_value, Hint);\n\t\treturn true;\n\t}\n\n\ttypename ilist_property<value_t>::values_t property_values()\n\t{\n\t\treturn m_values;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tlist_property(const init_t& Init) :\n\t\tname_policy_t(Init),\n\t\tm_node(Init.node()),\n\t\tm_label(Init.label()),\n\t\tm_description(Init.description()),\n\t\tm_values(Init.values()),\n\t\tm_dependency(0)\n\t{\n\t\tInit.property_collection().register_property(*this);\n\t}\n\n\t~list_property()\n\t{\n\t\tm_deleted_signal.emit();\n\t}\n\nprivate:\n\tinode* const m_node;\n\tconst char* const m_label;\n\tconst char* const m_description;\n\tconst typename ilist_property<value_t>::values_t& m_values;\n\tdeleted_signal_t m_deleted_signal;\n\tiproperty* m_dependency;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// node_property\n\n/// Property policy that exposes a data container as a K-3D node property\ntemplate<typename value_t, class name_policy_t>\nclass node_property :\n\tpublic name_policy_t,\n\tpublic iproperty,\n\tpublic iwritable_property,\n\tpublic inode_property\n{\npublic:\n\tconst value_t pipeline_value()\n\t{\n\t\tiproperty* const source = property_lookup(this);\n\t\tif(source != this)\n\t\t\treturn name_policy_t::constrain_value(dynamic_cast<value_t>(boost::any_cast<inode*>(source->property_internal_value())));\n\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst std::string property_name()\n\t{\n\t\treturn name_policy_t::name();\n\t}\n\n\tconst std::string property_label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst std::string property_description()\n\t{\n\t\treturn m_description;\n\t}\n\n\tconst std::type_info& property_type()\n\t{\n\t\treturn typeid(inode*);\n\t}\n\n\tconst boost::any property_internal_value()\n\t{\n\t\treturn boost::any(name_policy_t::internal_node());\n\t}\n\n\tconst boost::any property_pipeline_value()\n\t{\n\t\treturn dynamic_cast<inode*>(pipeline_value());\n\t}\n\n\tinode* property_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\ttypename name_policy_t::changed_signal_t& property_changed_signal()\n\t{\n\t\treturn name_policy_t::changed_signal();\n\t}\n\n\tdeleted_signal_t& property_deleted_signal()\n\t{\n\t\treturn m_deleted_signal;\n\t}\n\n\tiproperty* property_dependency()\n\t{\n\t\treturn m_dependency;\n\t}\n\n\tvoid property_set_dependency(iproperty* Dependency)\n\t{\n\t\tm_dependency = Dependency;\n\t}\n\n\tbool property_set_value(const boost::any Value, ihint* const Hint)\n\t{\n\t\tinode* const * new_value = boost::any_cast<inode*>(&Value);\n\t\tif(!new_value)\n\t\t\treturn false;\n\n\t\tname_policy_t::set_value(dynamic_cast<value_t>(*new_value), Hint);\n\t\treturn true;\n\t}\n\n\tbool property_allow_none()\n\t{\n\t\treturn name_policy_t::allow_none();\n\t}\n\n\tbool property_allow(iplugin_factory& Factory)\n\t{\n\t\treturn name_policy_t::allow(Factory);\n\t}\n\n\tbool property_allow(inode& Object)\n\t{\n\t\treturn name_policy_t::allow(Object);\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tnode_property(const init_t& Init) :\n\t\tname_policy_t(Init),\n\t\tm_node(Init.node()),\n\t\tm_label(Init.label()),\n\t\tm_description(Init.description()),\n\t\tm_dependency(0)\n\t{\n\t\tInit.property_collection().register_property(*this);\n\t}\n\n\t~node_property()\n\t{\n\t\tm_deleted_signal.emit();\n\t}\n\nprivate:\n\tinode* const m_node;\n\tconst char* const m_label;\n\tconst char* const m_description;\n\tdeleted_signal_t m_deleted_signal;\n\tiproperty* m_dependency;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// measurement_property\n\n/// Property policy that exposes a data container as a K-3D measurement property\ntemplate<typename value_t, class name_policy_t>\nclass measurement_property :\n\tpublic name_policy_t,\n\tpublic iproperty,\n\tpublic iwritable_property,\n\tpublic imeasurement_property\n{\npublic:\n\tconst value_t pipeline_value()\n\t{\n\t\tiproperty* const source = property_lookup(this);\n\t\tif(source != this)\n\t\t\treturn name_policy_t::constrain_value(boost::any_cast<value_t>(source->property_internal_value()));\n\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst std::string property_name()\n\t{\n\t\treturn name_policy_t::name();\n\t}\n\n\tconst std::string property_label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst std::string property_description()\n\t{\n\t\treturn m_description;\n\t}\n\n\tconst std::type_info& property_type()\n\t{\n\t\treturn typeid(value_t);\n\t}\n\n\tconst boost::any property_internal_value()\n\t{\n\t\treturn boost::any(name_policy_t::internal_value());\n\t}\n\n\tconst boost::any property_pipeline_value()\n\t{\n\t\treturn pipeline_value();\n\t}\n\n\tinode* property_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\ttypename name_policy_t::changed_signal_t& property_changed_signal()\n\t{\n\t\treturn name_policy_t::changed_signal();\n\t}\n\n\tdeleted_signal_t& property_deleted_signal()\n\t{\n\t\treturn m_deleted_signal;\n\t}\n\n\tiproperty* property_dependency()\n\t{\n\t\treturn m_dependency;\n\t}\n\n\tvoid property_set_dependency(iproperty* Dependency)\n\t{\n\t\tm_dependency = Dependency;\n\t}\n\n\tbool property_set_value(const boost::any Value, ihint* const Hint)\n\t{\n\t\tconst value_t* const new_value = boost::any_cast<value_t>(&Value);\n\t\tif(!new_value)\n\t\t\treturn false;\n\n\t\tname_policy_t::set_value(*new_value, Hint);\n\t\treturn true;\n\t}\n\n\tdouble property_step_increment()\n\t{\n\t\treturn m_step_increment;\n\t}\n\n\tconst std::type_info& property_units()\n\t{\n\t\treturn m_units;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tmeasurement_property(const init_t& Init) :\n\t\tname_policy_t(Init),\n\t\tm_node(Init.node()),\n\t\tm_label(Init.label()),\n\t\tm_description(Init.description()),\n\t\tm_step_increment(Init.step_increment()),\n\t\tm_units(Init.units()),\n\t\tm_dependency(0)\n\t{\n\t\tInit.property_collection().register_property(*this);\n\t}\n\n\t~measurement_property()\n\t{\n\t\tm_deleted_signal.emit();\n\t}\n\nprivate:\n\tinode* const m_node;\n\tconst char* const m_label;\n\tconst char* const m_description;\n\tconst double m_step_increment;\n\tconst std::type_info& m_units;\n\tdeleted_signal_t m_deleted_signal;\n\tiproperty* m_dependency;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// no_name\n\n/// Name policy for unnamed data containers\ntemplate<class constraint_policy_t>\nclass no_name :\n\tpublic constraint_policy_t\n{\nprotected:\n\ttemplate<typename init_t>\n\tno_name(const init_t& Init) :\n\t\tconstraint_policy_t(Init)\n\t{\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// immutable_name\n\n/// Name policy for data containers whose name cannot be changed\ntemplate<class constraint_policy_t>\nclass immutable_name :\n\tpublic constraint_policy_t\n{\npublic:\n\t/// Returns the container name\n\tconst std::string name() const\n\t{\n\t\treturn m_name;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\timmutable_name(const init_t& Init) :\n\t\tconstraint_policy_t(Init),\n\t\tm_name(Init.name())\n\t{\n\t}\n\nprivate:\n\t/// Storage for the container name\n\tconst char* const m_name;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// no_constraint\n\n/// Constraint policy for data containers whose values are unconstrained\ntemplate<typename value_t, class undo_policy_t>\nclass no_constraint :\n\tpublic undo_policy_t\n{\npublic:\n\tvoid set_value(const value_t& Value, ihint* const Hint = 0)\n\t{\n\t\tif(Value != undo_policy_t::internal_value())\n\t\t\tundo_policy_t::set_value(Value, Hint);\n\t}\n\n\tconst value_t constrain_value(const value_t Value)\n\t{\n\t\treturn Value;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tno_constraint(const init_t& Init) :\n\t\tundo_policy_t(Init)\n\t{\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// iconstraint\n\n/// Abstract interface for a chain-of-responsibility constraint node\ntemplate<typename value_t>\nclass iconstraint\n{\npublic:\n\tvirtual ~iconstraint() {}\n\n\tvoid constrain(value_t& Value)\n\t{\n\t\ton_constrain(Value);\n\n\t\tif(m_next_constraint.get())\n\t\t\tm_next_constraint->constrain(Value);\n\t}\n\nprotected:\n\texplicit iconstraint(iconstraint<value_t>* NextConstraint) :\n\t\tm_next_constraint(NextConstraint)\n\t{\n\t}\n\nprivate:\n\t/// Implement this method in a derived class to modify / constrain the input Value\n\tvirtual void on_constrain(value_t& Value) = 0;\n\n\t/// Storage for the (optional) next constraint to apply in the chain\n\tconst std::unique_ptr<iconstraint<value_t> > m_next_constraint;\n};\n\nnamespace constraint\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// minimum_t\n\n/// Constraint node that enforces a minimum value (using the std::max concept)\ntemplate<typename value_t>\nclass minimum_t :\n\tpublic iconstraint<value_t>\n{\n\t// We require that the minimum constraint be applied only to signed types, to prevent\n\t// overflow problems associated with unsigned types (for example, if you had a minimum\n\t// constraint of 0 applied to an unsigned long with current value 0, and subtract 1, the\n\t// result will 0xffffffff, which compares as larger than 0)\n\tBOOST_STATIC_ASSERT((std::numeric_limits<value_t>::is_signed));\n\npublic:\n\tminimum_t(const value_t MinimumValue, iconstraint<value_t>* NextConstraint = 0) :\n\t\ticonstraint<value_t>(NextConstraint),\n\t\tm_minimum_value(MinimumValue)\n\t{\n\t}\n\nprivate:\n\tvoid on_constrain(value_t& Value)\n\t{\n\t\tValue = std::max(Value, m_minimum_value);\n\t}\n\n\tconst value_t m_minimum_value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// minimum\n\n/// Convenience factory function for creating minimum_t constraint nodes\ntemplate<typename value_t>\niconstraint<value_t>* minimum(const value_t MinimumValue, iconstraint<value_t>* NextConstraint = 0)\n{\n\treturn new minimum_t<value_t>(MinimumValue, NextConstraint);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// maximum_t\n\n/// Constraint node that enforces a maximum value (using the std::min concept)\ntemplate<typename value_t>\nclass maximum_t :\n\tpublic iconstraint<value_t>\n{\npublic:\n\tmaximum_t(const value_t MaximumValue, iconstraint<value_t>* NextConstraint = 0) :\n\t\ticonstraint<value_t>(NextConstraint),\n\t\tm_maximum_value(MaximumValue)\n\t{\n\t}\n\nprivate:\n\tvoid on_constrain(value_t& Value)\n\t{\n\t\tValue = std::min(Value, m_maximum_value);\n\t}\n\n\tconst value_t m_maximum_value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// maximum\n\n/// Convenience factory function for creating maximum_t constraint nodes\ntemplate<typename value_t>\niconstraint<value_t>* maximum(const value_t MaximumValue, iconstraint<value_t>* NextConstraint = 0)\n{\n\treturn new maximum_t<value_t>(MaximumValue, NextConstraint);\n}\n\n} // namespace constraint\n\n/////////////////////////////////////////////////////////////////////////////\n// with_constraint\n\n/// Policy for data nodes whose values are constrained by a chain of one-to-many iconstraint nodes\ntemplate<typename value_t, class undo_policy_t>\nclass with_constraint :\n\tpublic undo_policy_t\n{\npublic:\n\tvoid set_value(value_t Value, ihint* const Hint = 0)\n\t{\n\t\tm_constraint->constrain(Value);\n\n\t\tif(Value != undo_policy_t::internal_value())\n\t\t\tundo_policy_t::set_value(Value, Hint);\n\t}\n\n\tconst value_t constrain_value(value_t Value)\n\t{\n\t\tm_constraint->constrain(Value);\n\t\treturn Value;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\twith_constraint(const init_t& Init) :\n\t\tundo_policy_t(Init),\n\t\tm_constraint(Init.constraint())\n\t{\n\t\tassert(m_constraint.get());\n\t}\n\nprivate:\n\t/// Stores the (mandatory) chain of constraint nodes to apply to incoming values\n\tconst std::unique_ptr<iconstraint<value_t> > m_constraint;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// no_undo\n\n/// Undo policy for data containers that do not store state changes for undo/redo\ntemplate<typename value_t, class storage_policy_t>\nclass no_undo :\n\tpublic storage_policy_t\n{\nprotected:\n\ttemplate<typename init_t>\n\tno_undo(const init_t& Init) :\n\t\tstorage_policy_t(Init)\n\t{\n\t}\n\n\t/// This little bit of magic makes it possible for base classes (such as node_storage) to update their own values while observing the correct undo policy\n\tvoid internal_set_value(const value_t& Value, ihint* const Hint)\n\t{\n\t\tstorage_policy_t::set_value(Value, Hint);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// with_undo\n\n/// Undo policy for data containers that stores state changes for undo/redo\ntemplate <typename value_t, class storage_policy_t>\nclass with_undo :\n\tpublic storage_policy_t,\n\tpublic virtual sigc::trackable\n{\npublic:\n\t/// Returns true iff the next write to the underlying storage will generate undo/redo data (useful if you need to perform additional undo/redo related operations, such as creating a signal connection)\n\tbool ready_to_record()\n\t{\n\t\treturn !m_changes && m_state_recorder.current_change_set();\n\t}\n\n\t/// Returns the state recorder for storing undo/redo data\n\tistate_recorder& state_recorder()\n\t{\n\t\treturn m_state_recorder;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\twith_undo(const init_t& Init) :\n\t\tstorage_policy_t(Init),\n\t\tm_state_recorder(Init.document().state_recorder()),\n\t\tm_changes(false)\n\t{\n\t}\n\n\ttypedef with_undo<value_t, storage_policy_t> this_t;\n\n\t/// This little bit of magic makes it possible for base classes (such as node_storage) to update their own values while observing the correct undo policy\n\tvoid internal_set_value(const value_t& Value, ihint* const Hint)\n\t{\n\t\tset_value(Value, Hint);\n\t}\n\n\tvoid set_value(const value_t& Value, ihint* const Hint = 0)\n\t{\n\t\tif(ready_to_record())\n\t\t{\n\t\t\tm_changes = true;\n\t\t\t/// Note ... we don't save the connection here because connections are automatically disconnected when the signal is emitted\n\t\t\tm_state_recorder.connect_recording_done_signal(sigc::mem_fun(*this, &this_t::on_recording_done));\n\t\t\tstorage_policy_t::start_recording(m_state_recorder);\n\t\t}\n\n\t\tstorage_policy_t::set_value(Value, Hint);\n\t}\n\nprivate:\n\t/// Called by the signal system once undo/redo recording is complete, so we can record our final value for redo purposes\n\tvoid on_recording_done()\n\t{\n\t\t// Sanity check ...\n\t\tassert(m_changes);\n\t\tassert(m_state_recorder.current_change_set());\n\n\t\tm_changes = false;\n\t\tstorage_policy_t::finish_recording(m_state_recorder);\n\t}\n\n\t/// Central location where undo/redo data is stored\n\tistate_recorder& m_state_recorder;\n\t/// Set to true iff the underlying data has changed during undo/redo recording\n\tbool m_changes;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// local_storage\n\n/// Storage policy for data containers that store their state by value\ntemplate<typename value_t, class signal_policy_t>\nclass local_storage :\n\tpublic signal_policy_t\n{\npublic:\n\t/// Writable access to the underlying data - this is handy for working with STL containers, but be careful - writing data in this way will bypass signal and undo policies\n\tvalue_t& internal_value()\n\t{\n\t\treturn m_value;\n\t}\n\n\t/// Read-only access to the underlying data\n\tconst value_t& internal_value() const\n\t{\n\t\treturn m_value;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tlocal_storage(const init_t& Init) :\n\t\tsignal_policy_t(Init),\n\t\tm_value(Init.value())\n\t{\n\t}\n\n\t/// Optionally called to store the original state of the data prior to modification\n\tvoid start_recording(istate_recorder& StateRecorder)\n\t{\n\t\tsignal_policy_t::start_recording(StateRecorder);\n\t\tStateRecorder.current_change_set()->record_old_state(new value_container(m_value));\n\t}\n\n\t/// Sets a new value for the data\n\tvoid set_value(const value_t& Value, ihint* const Hint = 0)\n\t{\n\t\tm_value = Value;\n\t\tsignal_policy_t::set_value(Hint);\n\t}\n\n\t/// Optionally called to store the new state of the data after one-or-more modifications\n\tvoid finish_recording(istate_recorder& StateRecorder)\n\t{\n\t\tStateRecorder.current_change_set()->record_new_state(new value_container(m_value));\n\t\tsignal_policy_t::finish_recording(StateRecorder);\n\t}\n\nprivate:\n\t/// Local storage for the data stored by this policy\n\tvalue_t m_value;\n\n\t/// Provides an implementation of istate_container for storing nodes by value (ValueType must have a copy constructor and assignment operator)\n\tclass value_container :\n\t\tpublic istate_container\n\t{\n\tpublic:\n\t\tvalue_container(value_t& Instance) :\n\t\t\tm_instance(Instance),\n\t\t\tm_value(Instance)\n\t\t{\n\t\t}\n\n\t\tvoid restore_state()\n\t\t{\n\t\t\tm_instance = m_value;\n\t\t}\n\n\tprivate:\n\t\tvalue_t& m_instance;\n\t\tconst value_t m_value;\n\t};\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// node_storage\n\n/// Storage policy for data containers that store a pointer to a document node that could be deleted by the user at any time - note that value_t should be the interface type used to access the node\ntemplate<typename value_t, class signal_policy_t>\nclass node_storage :\n\tpublic signal_policy_t,\n\tpublic virtual sigc::trackable\n{\npublic:\n\t/// Returns an interface pointer to the node (could be NULL)\n\tvalue_t internal_value()\n\t{\n\t\treturn dynamic_cast<value_t>(m_node);\n\t}\n\n\t/// Returns the underlying node (could be NULL)\n\tinode* internal_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\t/// Returns true iff the value is allowed to be NULL\n\tbool allow_none()\n\t{\n\t\treturn true;\n\t}\n\n\t/// Returns true iff the given factory creates an node that could be stored by this container\n\tbool allow(iplugin_factory& Factory)\n\t{\n\t\treturn Factory.implements(typeid(typename boost::remove_pointer<value_t>::type));\n\t}\n\n\t/// Returns true iff the given node coult be stored by this container\n\tbool allow(inode& Object)\n\t{\n\t\treturn dynamic_cast<value_t>(&Object) ? true : false;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tnode_storage(const init_t& Init) :\n\t\tsignal_policy_t(Init),\n\t\tm_node(dynamic_cast<inode*>(Init.value()))\n\t{\n\t\tif(m_node)\n\t\t{\n\t\t\tm_node_deleted_connection = m_node->deleted_signal().connect(sigc::mem_fun(*this, &node_storage::on_node_deleted));\n\t\t\tif(inode_change_signal* const node_change_signal = dynamic_cast<inode_change_signal*>(m_node))\n\t\t\t\tm_node_changed_connection = node_change_signal->connect_node_changed_signal(signal_policy_t::changed_signal().make_slot());\n\t\t}\n\t}\n\n\tvirtual ~node_storage()\n\t{\n\t}\n\n\tvoid on_node_deleted()\n\t{\n\t\tinternal_set_value(0, 0);\n\t}\n\n\t/// Optionally called to store the original state of the data prior to modification\n\tvoid start_recording(istate_recorder& StateRecorder)\n\t{\n\t\tsignal_policy_t::start_recording(StateRecorder);\n\t\tStateRecorder.current_change_set()->record_old_state(new value_container(m_node));\n\t}\n\n\t/// Sets a new value for the data\n\tvoid set_value(value_t Value, ihint* const Hint)\n\t{\n\t\tif(m_node)\n\t\t{\n\t\t\tm_node_deleted_connection.disconnect();\n\t\t\tm_node_changed_connection.disconnect();\n\t\t}\n\n\t\tm_node = dynamic_cast<inode*>(Value);\n\n\t\tif(m_node)\n\t\t{\n\t\t\tm_node_deleted_connection = m_node->deleted_signal().connect(sigc::mem_fun(*this, &node_storage::on_node_deleted));\n\t\t\tif(inode_change_signal* const node_change_signal = dynamic_cast<inode_change_signal*>(m_node))\n\t\t\t\tm_node_changed_connection = node_change_signal->connect_node_changed_signal(signal_policy_t::changed_signal().make_slot());\n\t\t}\n\n\t\tsignal_policy_t::set_value(Hint);\n\t}\n\n\t/// Optionally called to store the new state of the data after one-or-more modifications\n\tvoid finish_recording(istate_recorder& StateRecorder)\n\t{\n\t\tStateRecorder.current_change_set()->record_new_state(new value_container(m_node));\n\t\tsignal_policy_t::finish_recording(StateRecorder);\n\t}\n\nprivate:\n\t/// This little bit of magic allows us to \"call\" the derived undo policy when our state is modified internally, e.g. if the node is deleted\n\tvirtual void internal_set_value(const value_t&, ihint* const)\n\t{\n\t}\n\n\t/// Local storage for the node stored by this policy\n\tinode* m_node;\n\tsigc::connection m_node_deleted_connection;\n\tsigc::connection m_node_changed_connection;\n\n\t/// Provides an implementation of istate_container for storing nodes by value (ValueType must have a copy constructor and assignment operator)\n\tclass value_container :\n\t\tpublic istate_container\n\t{\n\tpublic:\n\t\tvalue_container(inode*& Instance) :\n\t\t\tm_instance(Instance),\n\t\t\tm_value(Instance)\n\t\t{\n\t\t}\n\n\t\tvoid restore_state()\n\t\t{\n\t\t\tm_instance = m_value;\n\t\t}\n\n\tprivate:\n\t\tinode*& m_instance;\n\t\tinode* m_value;\n\t};\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// pointer_storage\n\n/// Read-only storage policy that stores a value by pointer, created on-demand\n/** \\deprecated Use pointer_demand_storage instead */\ntemplate<typename pointer_t, typename signal_policy_t>\nclass pointer_storage :\n\tpublic signal_policy_t\n{\n\t// This policy only works for data stored by-pointer\n\tBOOST_STATIC_ASSERT((boost::is_pointer<pointer_t>::value));\n\npublic:\n\ttypedef typename boost::remove_pointer<pointer_t>::type non_pointer_t;\n\ttypedef pointer_storage<pointer_t, signal_policy_t> this_t;\n\n\t/// Set a slot that will be called to initialize the value when first created\n\tvoid set_initialize_slot(const sigc::slot<void, non_pointer_t&>& Slot)\n\t{\n\t\tm_initialize_slot = Slot;\n\t\treset();\n\t}\n\n\t/// Set the slot that will be called to update the value whenever it changes\n\tvoid set_update_slot(const sigc::slot<void, non_pointer_t&>& Slot)\n\t{\n\t\tm_update_slot = Slot;\n\t\tupdate();\n\t}\n\n\t/// Returns a slot that will invoke the reset() method\n\tsigc::slot<void, ihint*> make_reset_slot()\n\t{\n\t\treturn sigc::bind<0>(sigc::mem_fun(*this, &this_t::reset), static_cast<pointer_t>(0));\n\t}\n\n\t/// Returns a slot that will invoke the update() method\n\tsigc::slot<void, ihint*> make_update_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &this_t::update);\n\t}\n\n\t/// Store an object as the new value, taking control of its lifetime\n\tvoid reset(pointer_t NewValue = 0, ihint* const Hint = 0)\n\t{\n\t\t// Ensure that our value doesn't go out-of-scope while it's being modified\n\t\tif(m_executing)\n\t\t\treturn;\n\n\t\tm_value.reset(NewValue);\n\t\tsignal_policy_t::set_value(Hint);\n\t}\n\n\t/// Schedule an update for the value the next time it's read\n\tvoid update(ihint* const Hint = 0)\n\t{\n\t\t// Ensure that our value doesn't go out-of-scope while it's being modified\n\t\tif(m_executing)\n\t\t\treturn;\n\n\t\tm_update = true;\n\t\tsignal_policy_t::set_value(Hint);\n\t}\n\n\t/// Accesses the underlying value, creating it if it doesn't already exist\n\tpointer_t internal_value()\n\t{\n\t\tif(!m_value.get())\n\t\t{\n\t\t\tm_executing = true;\n\n\t\t\t// We can cancel pending updates since we're creating the value from scratch\n\t\t\tm_update = false;\n\n\t\t\t// Note: we create the value and update its state in two steps\n\t\t\t// because m_data_slot() may cause this method to be executed in a loop\n\t\t\tm_value.reset(new non_pointer_t());\n\t\t\tm_initialize_slot(*m_value);\n\n\t\t\tm_executing = false;\n\t\t}\n\t\t\n\t\tif(m_update)\n\t\t{\n\t\t\tm_executing = true;\n\n\t\t\tm_update = false;\n\t\t\tm_update_slot(*m_value);\n\n\t\t\tm_executing = false;\n\t\t}\n\n\t\treturn m_value.get();\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tpointer_storage(const init_t& Init) :\n\t\tsignal_policy_t(Init),\n\t\tm_update(false),\n\t\tm_executing(false)\n\t{\n\t}\n\nprivate:\n\t/// Storage for this policy's value\n\tstd::unique_ptr<non_pointer_t> m_value;\n\t/// Set to true if this policy's value is stale and needs to be updated\n\tbool m_update;\n\t/// Stores a slot that will be executed to initialize this policy's value\n\tsigc::slot<void, non_pointer_t&> m_initialize_slot;\n\t/// Stores a slot that will be executed to update this policy's value\n\tsigc::slot<void, non_pointer_t&> m_update_slot;\n\t/// Set to true during initialization / update of the policy value, to prevent problems with recursion\n\tbool m_executing;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// no_signal\n\n/// Signal policy for data containers that do not notify observers when their value changes\ntemplate<typename value_t>\nclass no_signal\n{\nprotected:\n\ttemplate<typename init_t>\n\tno_signal(const init_t&)\n\t{\n\t}\n\n\tvoid start_recording(istate_recorder&)\n\t{\n\t}\n\n\tvoid set_value(ihint* const)\n\t{\n\t}\n\n\tvoid finish_recording(istate_recorder&)\n\t{\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// change_signal\n\n/// Signal policy for data containers that notify observers when their value changes, including through undo/redo.\ntemplate<typename value_t>\nclass change_signal\n{\npublic:\n\t/// Defines a signal emitted when the underlying data changes.  The signal includes an optional \"hint\" that describes the nature of the change.\n\ttypedef sigc::signal<void, ihint*> changed_signal_t;\n\n\t/// Returns a reference to the signal that is emitted whenever the underlying data changes\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_changed_signal;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tchange_signal(const init_t&)\n\t{\n\t}\n\n\tvoid start_recording(istate_recorder&)\n\t{\n\t}\n\n\tvoid set_value(ihint* const Hint)\n\t{\n\t\tm_changed_signal.emit(Hint);\n\t}\n\n\tvoid finish_recording(istate_recorder& StateRecorder)\n\t{\n\t\tStateRecorder.current_change_set()->connect_undo_signal(sigc::bind(m_changed_signal.make_slot(), static_cast<ihint*>(0)));\n\t\tStateRecorder.current_change_set()->connect_redo_signal(sigc::bind(m_changed_signal.make_slot(), static_cast<ihint*>(0)));\n\t}\n\nprivate:\n\tchanged_signal_t m_changed_signal;\n};\n\n/// Signal policy for data containers that notify observers when their value changes.  Observers can choose whether to be notified every time the value changes (including undo/redo), or only when the value is changed explicitly by a caller.\ntemplate<typename value_t>\nclass explicit_change_signal\n{\npublic:\n\t/// Defines a signal emitted when the underlying data changes.  The signal includes an optional \"hint\" that describes the nature of the change.\n\ttypedef sigc::signal<void, k3d::ihint*> changed_signal_t;\n\n\t/// Returns a reference to the signal that is emitted whenever the underlying data changes.\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_changed_signal;\n\t}\n\n\t/// Connects a slot to a signal that is emitted whenever the underlying data is modified explicitly through set_value, never by undo/redo\n\tconst sigc::connection connect_explicit_change_signal(const sigc::slot<void, k3d::ihint*>& Slot)\n\t{\n\t\treturn m_explicit_change_signal.connect(Slot);\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\texplicit_change_signal(const init_t&)\n\t{\n\t}\n\n\tvoid start_recording(k3d::istate_recorder&)\n\t{\n\t}\n\n\tvoid set_value(k3d::ihint* const Hint)\n\t{\n\t\tm_changed_signal.emit(Hint);\n\t\tm_explicit_change_signal.emit(Hint);\n\t}\n\n\tvoid finish_recording(k3d::istate_recorder& StateRecorder)\n\t{\n\t\tStateRecorder.current_change_set()->connect_undo_signal(sigc::bind(m_changed_signal.make_slot(), static_cast<k3d::ihint*>(0)));\n\t\tStateRecorder.current_change_set()->connect_redo_signal(sigc::bind(m_changed_signal.make_slot(), static_cast<k3d::ihint*>(0)));\n\t}\n\nprivate:\n\tchanged_signal_t m_changed_signal;\n\tchanged_signal_t m_explicit_change_signal;\n};\n\n/// Convenience macro for declaring k3d::data::container nodes\n#define k3d_data(value_type, name_policy, signal_policy, undo_policy, storage_policy, constraint_policy, property_policy, serialization_policy) \\\n\tk3d::data::container<value_type, serialization_policy<value_type, property_policy<value_type, name_policy<constraint_policy<value_type, undo_policy<value_type, storage_policy<value_type, signal_policy<value_type> > > > > > > >\n\n/// Allows an arbitrary set of initializers to be consolidated into a single node\ntemplate<class init_t>\nclass initializer_t :\n\tpublic init_t\n{\npublic:\n\texplicit initializer_t(const init_t& Init) :\n\t\tinit_t(Init)\n\t{\n\t};\n};\n\n/// Helper class used to consolidate two initializers into a single node\ntemplate<typename lhs_t, typename rhs_t>\nclass composition_t :\n\tpublic lhs_t,\n\tpublic rhs_t\n{\npublic:\n\texplicit composition_t(const lhs_t& LHS, const rhs_t& RHS) :\n\t\tlhs_t(LHS),\n\t\trhs_t(RHS)\n\t{\n\t}\n};\n\n/// Consolidates two initializers into a single node, which can be consolidated in-turn\ntemplate<typename lhs_t, typename rhs_t>\ninline const initializer_t<composition_t<lhs_t, rhs_t> > operator+(const initializer_t<lhs_t>& LHS, const initializer_t<rhs_t>& RHS)\n{\n\treturn initializer_t<composition_t<lhs_t, rhs_t> >(composition_t<lhs_t, rhs_t>(LHS, RHS));\n}\n\n/// Helper class used to set a data container's initial value\ntemplate<typename value_t>\nclass value_initializer_t\n{\npublic:\n\texplicit value_initializer_t(const value_t& Value) :\n\t\tm_value(Value)\n\t{\n\t}\n\n\tconst value_t& value() const\n\t{\n\t\treturn m_value;\n\t}\n\nprivate:\n\tconst value_t m_value;\n};\n\ntemplate<typename value_t>\ninline const initializer_t<value_initializer_t<value_t> > init_value(const value_t& Value)\n{\n\treturn initializer_t<value_initializer_t<value_t> >(value_initializer_t<value_t>(Value));\n}\n\n/// Helper class used to set a data container's name\nclass name_t\n{\npublic:\n\texplicit name_t(const char* const Name) :\n\t\tm_name(Name)\n\t{\n\t}\n\n\tconst char* name() const\n\t{\n\t\treturn m_name;\n\t}\n\nprivate:\n\tconst char* const m_name;\n};\n\ninline const initializer_t<name_t> init_name(const char* const Name)\n{\n\treturn initializer_t<name_t>(name_t(Name));\n}\n\n/// Helper class used to initialize a data container's label\nclass label_t\n{\npublic:\n\texplicit label_t(const char* const Label) :\n\t\tm_label(Label)\n\t{\n\t}\n\n\tconst char* label() const\n\t{\n\t\treturn m_label;\n\t}\n\nprivate:\n\tconst char* const m_label;\n};\n\ninline const initializer_t<label_t> init_label(const char* const Label)\n{\n\treturn initializer_t<label_t>(label_t(Label));\n}\n\n/// Helper class used to initialize a data container's description\nclass description_t\n{\npublic:\n\texplicit description_t(const char* const Description) :\n\t\tm_description(Description)\n\t{\n\t}\n\n\tconst char* description() const\n\t{\n\t\treturn m_description;\n\t}\n\nprivate:\n\tconst char* const m_description;\n};\n\ninline const initializer_t<description_t> init_description(const char* const Description)\n{\n\treturn initializer_t<description_t>(description_t(Description));\n}\n\n/// Helper class used to initialize a data container's constraints\ntemplate<typename data_t>\nclass constraint_t\n{\npublic:\n\texplicit constraint_t(iconstraint<data_t>* Constraint) :\n\t\tm_constraint(Constraint)\n\t{\n\t}\n\n\ticonstraint<data_t>* constraint() const\n\t{\n\t\treturn m_constraint;\n\t}\n\nprivate:\n\ticonstraint<data_t>* const m_constraint;\n};\n\ntemplate<typename data_t>\ninline const initializer_t<constraint_t<data_t> > init_constraint(iconstraint<data_t>* Constraint)\n{\n\treturn initializer_t<constraint_t<data_t> >(constraint_t<data_t>(Constraint));\n}\n\n/// Helper class used to initialize the mode for path property nodes\nclass path_mode_t\n{\npublic:\n\texplicit path_mode_t(const ipath_property::mode_t Mode) :\n\t\tm_mode(Mode)\n\t{\n\t}\n\n\tipath_property::mode_t path_mode() const\n\t{\n\t\treturn m_mode;\n\t}\n\nprivate:\n\tipath_property::mode_t m_mode;\n};\n\ninline const initializer_t<path_mode_t> init_path_mode(const ipath_property::mode_t Mode)\n{\n\treturn initializer_t<path_mode_t>(path_mode_t(Mode));\n}\n\n/// Helper class used to initialize the type for path property nodes\nclass path_type_t\n{\npublic:\n\texplicit path_type_t(const std::string& Type) :\n\t\tm_type(Type)\n\t{\n\t}\n\n\tconst std::string& path_type() const\n\t{\n\t\treturn m_type;\n\t}\n\nprivate:\n\tconst std::string m_type;\n};\n\ninline const initializer_t<path_type_t> init_path_type(const std::string& Type)\n{\n\treturn initializer_t<path_type_t>(path_type_t(Type));\n}\n\n/// Helper class used to initialize enumeration property types\nclass enumeration_t\n{\npublic:\n\texplicit enumeration_t(const ienumeration_property::enumeration_values_t& Values) :\n\t\tm_values(Values)\n\t{\n\t}\n\n\tconst ienumeration_property::enumeration_values_t& values() const\n\t{\n\t\treturn m_values;\n\t}\n\nprivate:\n\tconst ienumeration_property::enumeration_values_t& m_values;\n};\n\ninline const initializer_t<enumeration_t> init_enumeration(const ienumeration_property::enumeration_values_t& Values)\n{\n\treturn initializer_t<enumeration_t>(enumeration_t(Values));\n}\n\n/// Helper class used to initialize list properties\ntemplate<typename data_t>\nclass values_t\n{\npublic:\n\texplicit values_t(const data_t& Values) :\n\t\tm_values(Values)\n\t{\n\t}\n\n\tconst data_t& values() const\n\t{\n\t\treturn m_values;\n\t}\n\nprivate:\n\tconst data_t& m_values;\n};\n\ntemplate<typename data_t>\ninline const initializer_t<values_t<data_t> > init_values(const data_t& Values)\n{\n\treturn initializer_t<values_t<data_t> >(values_t<data_t>(Values));\n}\n\n/// Helper class used to initialize measurement properties\nclass step_increment_t\n{\npublic:\n\texplicit step_increment_t(const double StepIncrement) :\n\t\tm_step_increment(StepIncrement)\n\t{\n\t}\n\n\tdouble step_increment() const\n\t{\n\t\treturn m_step_increment;\n\t}\n\nprivate:\n\tconst double m_step_increment;\n};\n\ninline const initializer_t<step_increment_t> init_step_increment(const double StepIncrement)\n{\n\treturn initializer_t<step_increment_t>(step_increment_t(StepIncrement));\n}\n\n/// Helper class used to initialize measurement properties\nclass units_t\n{\npublic:\n\texplicit units_t(const std::type_info& Units) :\n\t\tm_units(Units)\n\t{\n\t}\n\n\tconst std::type_info& units() const\n\t{\n\t\treturn m_units;\n\t}\n\nprivate:\n\tconst std::type_info& m_units;\n};\n\ninline const initializer_t<units_t> init_units(const std::type_info& Units)\n{\n\treturn initializer_t<units_t>(units_t(Units));\n}\n\n/// Helper class used to initialize data containers\ntemplate<typename owner_t>\nclass owner_initializer_t\n{\npublic:\n\texplicit owner_initializer_t(owner_t& Owner) :\n\t\tm_owner(Owner)\n\t{\n\t}\n\n\towner_t& owner() const\n\t{\n\t\treturn m_owner;\n\t}\n\n\tidocument& document() const\n\t{\n\t\treturn m_owner.document();\n\t}\n\n\tiproperty_collection& property_collection() const\n\t{\n\t\treturn m_owner;\n\t}\n\n\tipersistent_collection& persistent_collection() const\n\t{\n\t\treturn m_owner;\n\t}\n\n\tinode* node() const\n\t{\n\t\treturn dynamic_cast<inode*>(&m_owner);\n\t}\n\nprivate:\n\towner_t& m_owner;\n};\n\ntemplate<typename owner_t>\ninline const initializer_t<owner_initializer_t<owner_t> > init_owner(owner_t& Owner)\n{\n\treturn initializer_t<owner_initializer_t<owner_t> >(owner_initializer_t<owner_t>(Owner));\n}\n\n/// Helper class used to initialize data containers\nclass external_owner_initializer_t\n{\npublic:\n\texplicit external_owner_initializer_t(idocument& Document, iproperty_collection& PropertyCollection, ipersistent_collection& PersistentCollection, inode* const Node) :\n\t\tm_document(Document),\n\t\tm_property_collection(PropertyCollection),\n\t\tm_persistent_collection(PersistentCollection),\n\t\tm_node(Node)\n\t{\n\t}\n\n\tidocument& document() const\n\t{\n\t\treturn m_document;\n\t}\n\n\tiproperty_collection& property_collection() const\n\t{\n\t\treturn m_property_collection;\n\t}\n\n\tipersistent_collection& persistent_collection() const\n\t{\n\t\treturn m_persistent_collection;\n\t}\n\n\tinode* node() const\n\t{\n\t\treturn m_node;\n\t}\n\nprivate:\n\tidocument& m_document;\n\tiproperty_collection& m_property_collection;\n\tipersistent_collection& m_persistent_collection;\n\tinode* const m_node;\n};\n\ninline const initializer_t<external_owner_initializer_t> init_owner(idocument& Document, iproperty_collection& PropertyCollection, ipersistent_collection& PersistentCollection, inode* const Object)\n{\n\treturn initializer_t<external_owner_initializer_t>(external_owner_initializer_t(Document, PropertyCollection, PersistentCollection, Object));\n}\n\n/// Helper class used to initialize slots\ntemplate<typename slot_t>\nclass slot_initializer_t\n{\npublic:\n\texplicit slot_initializer_t(const slot_t& Slot) :\n\t\tm_slot(Slot)\n\t{\n\t}\n\n\tconst slot_t& slot() const\n\t{\n\t\treturn m_slot;\n\t}\n\nprivate:\n\tconst slot_t& m_slot;\n};\n\ntemplate<typename slot_t>\ninline const initializer_t<slot_initializer_t<slot_t> > init_slot(const slot_t& Slot)\n{\n\treturn initializer_t<slot_initializer_t<slot_t> >(slot_initializer_t<slot_t>(Slot));\n}\n\n} // namespace data\n\nnamespace detail\n{\n\ntemplate<typename instance_t>\nclass instance_container :\n\tpublic istate_container,\n\tpublic sigc::trackable\n{\npublic:\n\tinstance_container(instance_t* const Instance, const bool Owned) :\n\t\tm_instance(Instance),\n\t\tm_owned(Owned)\n\t{\n\t}\n\n\tvirtual ~instance_container()\n\t{\n\t\tif(m_owned)\n\t\t\tdelete m_instance;\n\t}\n\n\tvoid restore_state()\n\t{\n\t}\n\n\tvoid on_owned(bool Owned)\n\t{\n\t\tm_owned = Owned;\n\t}\n\nprivate:\n\tinstance_t* const m_instance;\n\tbool m_owned;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// undoable_new\n\n/// To make creation of an object undoable / redoable, pass it to this function after calling operator new\ntemplate<typename object_t>\nvoid undoable_new(object_t* const Object, idocument& Document)\n{\n\t// If we aren't recording undos, we're done...\n\tstate_change_set* const changeset = Document.state_recorder().current_change_set();\n\tif(!changeset)\n\t\treturn;\n\n\t// Create an instance container that only deletes the object if it has been undone\n\ttypedef detail::instance_container<object_t> container_t;\n\tcontainer_t* const container = new container_t(Object, false);\n\tchangeset->connect_undo_signal(sigc::bind(sigc::mem_fun(*container, &container_t::on_owned), true));\n\tchangeset->connect_redo_signal(sigc::bind(sigc::mem_fun(*container, &container_t::on_owned), false));\n\n\tchangeset->record_old_state(container);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// undoable_delete\n\n/// To make deletion of an object undoable / redoable, pass it to this function instead of calling operator delete\ntemplate<typename object_t>\nvoid undoable_delete(object_t* const Object, idocument& Document)\n{\n\t// If we aren't recording undos, delete it the old-fashioned way ...\n\tstate_change_set* const changeset = Document.state_recorder().current_change_set();\n\tif(!changeset)\n\t{\n\t\tdelete Object;\n\t\treturn;\n\t}\n\n\t// Create an instance container that only deletes the object if it hasn't been undone\n\ttypedef detail::instance_container<object_t> container_t;\n\tcontainer_t* const container = new container_t(Object, true);\n\tchangeset->connect_undo_signal(sigc::bind(sigc::mem_fun(*container, &container_t::on_owned), false));\n\tchangeset->connect_redo_signal(sigc::bind(sigc::mem_fun(*container, &container_t::on_owned), true));\n\n\tchangeset->record_old_state(container);\n}\n\n} // namespace k3d\n\nusing namespace k3d::data;\n\n#endif // !K3DSDK_DATA_H\n\n"
  },
  {
    "path": "k3dsdk/dependencies.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the k3d::dependencies class, which provides an implementation of k3d::idependencies\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/dependencies.h>\n\nnamespace k3d\n{\n\nvoid dependencies::register_object_dependency(inode& Object, const bool CopyByReference)\n{\n\t// Add this object to the list ...\n\tm_objects.insert(std::make_pair(&Object, CopyByReference));\n}\n\nconst dependencies::objects_t& dependencies::objects() const\n{\n\treturn m_objects;\n}\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/dependencies.h",
    "content": "#ifndef K3DSDK_DEPENDENCIES_H\n#define K3DSDK_DEPENDENCIES_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares the k3d::dependencies class, which provides an implementation of k3d::idependencies\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/idependencies.h>\n#include <map>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dependencies\n\nclass dependencies :\n\tpublic idependencies\n{\npublic:\n\tvoid register_object_dependency(inode& Object, const bool CopyByReference);\n\n\ttypedef std::map<inode*, bool> objects_t;\n\tconst objects_t& objects() const;\n\t\nprivate:\n\t// The set of dependent objects ...\n\tobjects_t m_objects;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_DEPENDENCIES_H\n"
  },
  {
    "path": "k3dsdk/difference.h",
    "content": "#ifndef K3DSDK_DIFFERENCE_H\n#define K3DSDK_DIFFERENCE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-platform-config.h>\n#include <k3dsdk/types.h>\n\n#include <boost/accumulators/accumulators.hpp>\n#include <boost/accumulators/statistics/max.hpp>\n#include <boost/accumulators/statistics/mean.hpp>\n#include <boost/accumulators/statistics/median.hpp>\n#include <boost/accumulators/statistics/min.hpp>\n#include <boost/accumulators/statistics/stats.hpp>\n#include <boost/accumulators/statistics/variance.hpp>\n#include <boost/math/special_functions/next.hpp>\n#include <boost/static_assert.hpp>\n\nnamespace k3d\n{\n\nnamespace difference\n{\n\n/// Stores the results of the difference::test() function.\nclass accumulator\n{\npublic:\n\t/// Stores statistics for comparisons of exact (string and integer) types, including the number of tests, and the min and max test values.\n\tboost::accumulators::accumulator_set<bool_t, boost::accumulators::stats<boost::accumulators::tag::count, boost::accumulators::tag::min, boost::accumulators::tag::max> > exact;\n\t/// Stores statistics for comparisons of inexact (floating-point) types using Units in the Last Place (ULPS), including the number of tests, min, max, mean, median, and variance.\n\tboost::accumulators::accumulator_set<double_t, boost::accumulators::stats<boost::accumulators::tag::min, boost::accumulators::tag::mean, boost::accumulators::tag::max, boost::accumulators::tag::median, boost::accumulators::tag::lazy_variance> > ulps;\n};\n\n/// Function that tests the difference between two objects, returning separate results for exact (integer and string) and inexact (floating-point) types.\n/// See \"Comparing floating point numbers\" by Bruce Dawson at http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm\ntemplate<typename T>\nconst accumulator test(const T& A, const T& B)\n{\n\taccumulator result;\n\ttest(A, B, result);\n\treturn result;\n};\n\n/// Function that tests the difference between two objects, returning separate results for exact (integer and string) and inexact (floating-point) types.\n/// See \"Comparing floating point numbers\" by Bruce Dawson at http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm\ntemplate<typename T>\nvoid test(const T& A, const T& B, accumulator& Result)\n{\n\t// This will be triggered if this template is ever instantiated\n\tBOOST_STATIC_ASSERT(sizeof(T) == 0);\n};\n\n/// Specialization of test() that tests bool_t\ninline void test(const bool_t& A, const bool_t& B, accumulator& Result)\n{\n\tResult.exact(A == B);\n};\n\n#ifdef _LIBCPP_VERSION\n// For libc++\ninline void test(const std::vector<bool>::reference& A, const std::vector<bool>::reference& B, accumulator& Result)\n{\n  Result.exact(A == B);\n};\n\ninline void test(const std::vector<bool>::const_reference& A, const std::vector<bool>::const_reference& B, accumulator& Result)\n{\n  Result.exact(A == B);\n};\n#endif\n\n/// Specialization of test that tests int8_t\ninline void test(const int8_t& A, const int8_t& B, accumulator& Result)\n{\n\tResult.exact(A == B);\n};\n\n/// Specialization of test that tests int16_t\ninline void test(const int16_t& A, const int16_t& B, accumulator& Result)\n{\n\tResult.exact(A == B);\n};\n\n/// Specialization of test that tests int32_t\ninline void test(const int32_t& A, const int32_t& B, accumulator& Result)\n{\n\tResult.exact(A == B);\n};\n\n/// Specialization of test that tests int64_t\ninline void test(const int64_t& A, const int64_t& B, accumulator& Result)\n{\n\tResult.exact(A == B);\n};\n\n/// Specialization of test that tests uint8_t\ninline void test(const uint8_t& A, const uint8_t& B, accumulator& Result)\n{\n\tResult.exact(A == B);\n};\n\n/// Specialization of test that tests uint16_t\ninline void test(const uint16_t& A, const uint16_t& B, accumulator& Result)\n{\n\tResult.exact(A == B);\n};\n\n/// Specialization of test that tests uint32_t\ninline void test(const uint32_t& A, const uint32_t& B, accumulator& Result)\n{\n\tResult.exact(A == B);\n};\n\n/// Specialization of test that tests uint64_t\ninline void test(const uint64_t& A, const uint64_t& B, accumulator& Result)\n{\n\tResult.exact(A == B);\n};\n\n/// Specialization of test that tests double_t\ninline void test(const double_t& A, const double_t& B, accumulator& Result)\n{\n\tResult.ulps(std::fabs(boost::math::float_distance(A, B)));\n};\n\n/// Specialization of test that tests string_t\ninline void test(const string_t& A, const string_t& B, accumulator& Result)\n{\n\tResult.exact(A == B);\n};\n\n#ifdef K3D_API_DARWIN\n\n/// Specialization of test for use with unsigned long (required on OSX)\n/// \\deprecated New code must use the sized K-3D types instead of unsigned long\ninline void test(const unsigned long& A, const unsigned long& B, accumulator& Result)\n{\n\tResult.exact(A == B);\n};\n\n#endif // K3D_API_DARWIN\n\n/// Given iterators designating two sequences, calls the test() function for each pair of values,\n/// and confirms that both sequences are the same length.\ntemplate<typename IteratorT>\nvoid range_test(IteratorT A, IteratorT LastA, IteratorT B, IteratorT LastB, accumulator& Result)\n{\n\tfor(; A != LastA && B != LastB; ++A, ++B)\n\t\ttest(*A, *B, Result);\n\n\tResult.exact(A == LastA && B == LastB);\n};\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_DIFFERENCE_H\n\n"
  },
  {
    "path": "k3dsdk/disk.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-200 7, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/disk.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\nnamespace k3d\n{\n\nnamespace disk\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::matrices_t& Matrices,\n\tconst mesh::materials_t& Materials,\n\tconst mesh::doubles_t& Heights,\n\tconst mesh::doubles_t& Radii,\n\tconst mesh::doubles_t& SweepAngles,\n\tconst mesh::selection_t& Selections,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& SurfaceAttributes,\n\tconst mesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\theights(Heights),\n\tradii(Radii),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::matrices_t& Matrices,\n\tmesh::materials_t& Materials,\n\tmesh::doubles_t& Heights,\n\tmesh::doubles_t& Radii,\n\tmesh::doubles_t& SweepAngles,\n\tmesh::selection_t& Selections,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& SurfaceAttributes,\n\tmesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\theights(Heights),\n\tradii(Radii),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"disk\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::matrices_t >(\"matrices\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::materials_t >(\"materials\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"heights\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"radii\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"sweep_angles\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::selection_t>(\"selections\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"surface\"],\n\t\tgeneric_primitive.attributes[\"parameter\"]\n\t\t);\n\n\tresult->selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"disk\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tconst mesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tconst mesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tconst mesh::doubles_t& heights = require_array<mesh::doubles_t >(Primitive, surface_structure, \"heights\");\n\t\tconst mesh::doubles_t& radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"radii\");\n\t\tconst mesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tconst mesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new const_primitive(matrices, materials, heights, radii, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"disk\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tmesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tmesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tmesh::doubles_t& heights = require_array<mesh::doubles_t >(Primitive, surface_structure, \"heights\");\n\t\tmesh::doubles_t& radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"radii\");\n\t\tmesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tmesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new primitive(matrices, materials, heights, radii, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"disk\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace disk\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/disk.h",
    "content": "#ifndef K3DSDK_DISK_H\n#define K3DSDK_DISK_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace disk\n{\n\n/// Gathers the member arrays of a disk primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::matrices_t& Matrices,\n\t\tconst mesh::materials_t& Materials,\n\t\tconst mesh::doubles_t& Heights,\n\t\tconst mesh::doubles_t& Radii,\n\t\tconst mesh::doubles_t& SweepAngles,\n\t\tconst mesh::selection_t& Selections,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& SurfaceAttributes,\n\t\tconst mesh::table_t& ParameterAttributes);\n\n\tconst mesh::matrices_t& matrices;\n\tconst mesh::materials_t& materials;\n\tconst mesh::doubles_t& heights;\n\tconst mesh::doubles_t& radii;\n\tconst mesh::doubles_t& sweep_angles;\n\tconst mesh::selection_t& selections;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& surface_attributes;\n\tconst mesh::table_t& parameter_attributes;\n};\n\n/// Gathers the member arrays of a disk primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::matrices_t& Matrices,\n\t\tmesh::materials_t& Materials,\n\t\tmesh::doubles_t& Heights,\n\t\tmesh::doubles_t& Radii,\n\t\tmesh::doubles_t& SweepAngles,\n\t\tmesh::selection_t& Selections,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& SurfaceAttributes,\n\t\tmesh::table_t& ParameterAttributes);\n\n\tmesh::matrices_t& matrices;\n\tmesh::materials_t& materials;\n\tmesh::doubles_t& heights;\n\tmesh::doubles_t& radii;\n\tmesh::doubles_t& sweep_angles;\n\tmesh::selection_t& selections;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& surface_attributes;\n\tmesh::table_t& parameter_attributes;\n};\n\n/// Creates a new disk mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid disk primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid disk primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid disk primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace disk\n\n} // namespace k3d\n\n#endif // !K3DSDK_DISK_H\n\n"
  },
  {
    "path": "k3dsdk/document.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Provides a concrete implementation of idocument, which encapsulates an open K-3D document\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Dan Erikson (derikson@montana.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n\n#include <k3dsdk/application.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/dependencies.h>\n#include <k3dsdk/document.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/node_name_map.h>\n#include <k3dsdk/pipeline.h>\n#include <k3dsdk/pipeline_profiler.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/signal_slots.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/string_modifiers.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/xml.h>\nusing namespace k3d::xml;\n\n#include <sigc++/bind.h>\n\n#include <k3dsdk/fstream.h>\n\n#include <fstream>\n#include <iterator>\n#include <memory>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\t\n/////////////////////////////////////////////////////////////////////////////\n// state_recorder_implementation\n\n/// Provides a concrete implementation of istate_recorder\nclass state_recorder_implementation :\n\tpublic istate_recorder\n{\npublic:\n\tstate_recorder_implementation() :\n\t\tm_current_node(0),\n\t\tm_newest_node(0),\n\t\tm_last_saved_node(0)\n\t{\n\t}\n\n\t~state_recorder_implementation()\n\t{\n\t\t// Delete all nodes ...\n\t\tfor(nodes_t::iterator node = m_root_nodes.begin(); node != m_root_nodes.end(); ++node)\n\t\t\tdelete_node(*node);\n\n\t\tif(m_current_recording.get())\n\t\t\tlog() << warning << \"Still recording undo/redo data at shutdown, this indicates an undo/redo leak\" << std::endl;\n\t}\n\n\tvoid delete_node(node* const Node)\n\t{\n\t\tif(!Node)\n\t\t\treturn;\n\n\t\tfor(nodes_t::iterator node = Node->children.begin(); node != Node->children.end(); ++node)\n\t\t\tdelete_node(*node);\n\t\tdelete Node;\n\t}\n\n\tvoid start_recording(std::unique_ptr<state_change_set> ChangeSet, const char* const Context)\n\t{\n\t\tif(!ChangeSet.get())\n\t\t{\n\t\t\tlog() << error << \"start_recording() attempt with NULL changeset.  Context: \" << Context << std::endl;\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(m_current_recording.get())\n\t\t{\n\t\t\tlog() << warning << \"Forcing termination of unfinished changeset.  Context: \" << m_current_context << std::endl;\n\t\t\tstd::unique_ptr<state_change_set> changeset = stop_recording(Context);\n\t\t\tcommit_change_set(std::move(changeset), \"Unfinished changeset\", Context);\n\t\t}\n\n\t\tm_current_recording = std::move(ChangeSet);\n\t\tm_current_context = Context;\n\t}\n\n\tstate_change_set* current_change_set()\n\t{\n\t\treturn m_current_recording.get();\n\t}\n\n\tstd::unique_ptr<state_change_set> stop_recording(const char* const Context)\n\t{\n\t\tif(!m_current_recording.get())\n\t\t{\n\t\t\tlog() << error << \"stop_recording() attempt with NULL changeset.  Context: \" << Context << std::endl;\n\t\t\treturn std::move(m_current_recording);\n\t\t}\n\t\t\n\t\t// Let the world know that recording is finished ...\n\t\tm_recording_done_signal.emit();\n\n\t\t// Now that recording is complete, get rid of leftover connections ...\n\t\tsigc::signal<void>::slot_list_type slots = m_recording_done_signal.slots();\n\t\tslots.erase(slots.begin(), slots.end());\n\n\t\treturn std::move(m_current_recording);\n\t}\n\n\tvoid commit_change_set(std::unique_ptr<state_change_set> ChangeSet, const std::string& Label, const char* const Context)\n\t{\n\t\tif(!ChangeSet.get())\n\t\t{\n\t\t\tlog() << error << \"commit_change_set() attempt with NULL changeset.  Context: \" << Context << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tif(!ChangeSet->undo_count() && !ChangeSet->redo_count())\n\t\t{\n\t\t\tlog() << error << \"discarding empty changeset [\" << Label << \"].  Context: \" << Context << std::endl;\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tstd::string label = Label;\n\t\tif(label.empty())\n\t\t{\n\t\t\tlog() << warning << \"committing anonymous changeset.  Context: \" << Context << std::endl;\n\t\t\tlabel = \"Unnamed changeset\";\n\t\t}\n\n\t\t// Create a new node in the hierarchy, branching it from the current node if necessary ...\n\t\tm_newest_node = new node(label, ChangeSet.release(), m_current_node);\n\n\t\tif(m_current_node)\n\t\t\tm_current_node->children.push_back(m_newest_node);\n\t\telse\n\t\t\tm_root_nodes.push_back(m_newest_node);\n\n\t\tm_current_node = m_newest_node;\n\n\t\tm_node_added_signal.emit(m_newest_node);\n\t\tm_current_node_changed_signal.emit();\n\t}\n\n\tconst nodes_t& root_nodes()\n\t{\n\t\treturn m_root_nodes;\n\t}\n\n\tconst node* current_node()\n\t{\n\t\treturn m_current_node;\n\t}\n\n\tconst node* newest_node()\n\t{\n\t\treturn m_newest_node;\n\t}\n\n\tconst node* last_saved_node()\n\t{\n\t\treturn m_last_saved_node;\n\t}\n\n\tvoid mark_saved()\n\t{\n\t\tm_last_saved_node = m_current_node;\n\t\tm_last_saved_node_changed_signal.emit();\n\t}\n\n\tvoid set_current_node(const node* const Node)\n\t{\n\t\tm_current_node = const_cast<node*>(Node);\n\t\tm_current_node_changed_signal.emit();\n\t}\n\n\tsigc::connection connect_recording_done_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_recording_done_signal.connect(Slot);\n\t}\n\t\n\tsigc::connection connect_node_added_signal(const sigc::slot<void, const node*>& Slot)\n\t{\n\t\treturn m_node_added_signal.connect(Slot);\n\t}\n\t\n\tsigc::connection connect_current_node_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_current_node_changed_signal.connect(Slot);\n\t}\n\t\n\tsigc::connection connect_last_saved_node_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_last_saved_node_changed_signal.connect(Slot);\n\t}\n\nprivate:\n\t/// Stores the current change set\n\tstd::unique_ptr<state_change_set> m_current_recording;\n\t/// Stores the context for the current change set\n\tconst char* m_current_context;\n\t/// Stores the root node(s) (if any)\n\tnodes_t m_root_nodes;\n\t/// Stores a reference to the current node (if any)\n\tnode* m_current_node;\n\t/// Stores a reference to the most-recently-added node (if any)\n\tnode* m_newest_node;\n\t/// Stores a reference to the most-recently-saved node (if any)\n\tnode* m_last_saved_node;\n\n\tsigc::signal<void> m_recording_done_signal;\n\tsigc::signal<void, const node*> m_node_added_signal;\n\tsigc::signal<void> m_current_node_changed_signal;\n\tsigc::signal<void> m_last_saved_node_changed_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// node_collection_implementation\n\nclass node_collection_implementation :\n\tpublic inode_collection\n{\npublic:\n\tnode_collection_implementation(istate_recorder& StateRecorder) :\n\t\tm_state_recorder(StateRecorder)\n\t{\n\t}\n\n\t~node_collection_implementation()\n\t{\n\t}\n\n\tvoid add_nodes(const nodes_t& Nodes)\n\t{\n\t\t// Ensure no NULLs creep in ...\n\t\tnodes_t nodes(Nodes);\n\t\tnodes.erase(std::remove(nodes.begin(), nodes.end(), static_cast<inode*>(0)), nodes.end());\n\t\tif(nodes.size() != Nodes.size())\n\t\t\tlog() << warning << \"NULL node cannot be inserted into node collection and will be ignored\" << std::endl;\n\n\t\t// We want to emit a signal whenever an node's name changes ...\n\t\tfor(nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t\t(*node)->name_changed_signal().connect(sigc::bind(m_rename_node_signal.make_slot(), *node));\n\n\t\t// If we're recording undo/redo data, record the new state ...\n\t\tif(m_state_recorder.current_change_set())\n\t\t{\n\t\t\tm_state_recorder.current_change_set()->record_old_state(new remove_nodes_container(*this, nodes));\n\t\t\tm_state_recorder.current_change_set()->record_new_state(new add_nodes_container(*this, nodes));\n\t\t}\n\n\t\t// Make the change and notify observers ...\n\t\tm_nodes.insert(m_nodes.end(), nodes.begin(), nodes.end());\n\t\tm_add_nodes_signal.emit(nodes);\n\t}\n\n\tconst inode_collection::nodes_t& collection()\n\t{\n\t\treturn m_nodes;\n\t}\n\n\tvoid remove_nodes(const nodes_t& Nodes)\n\t{\n\t\t// Ensure no NULLs creep in ...\n\t\tnodes_t nodes(Nodes);\n\t\tnodes.erase(std::remove(nodes.begin(), nodes.end(), static_cast<inode*>(0)), nodes.end());\n\t\tif(nodes.size() != Nodes.size())\n\t\t\tlog() << warning << \"NULL node will be ignored\" << std::endl;\n\n\t\t// If we're recording undo/redo data, record the new state ...\n\t\tif(m_state_recorder.current_change_set())\n\t\t{\n\t\t\tm_state_recorder.current_change_set()->record_old_state(new add_nodes_container(*this, nodes));\n\t\t\tm_state_recorder.current_change_set()->record_new_state(new remove_nodes_container(*this, nodes));\n\t\t}\n\n\t\t// Make the change and notify observers ...\n\t\tfor(nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\t(*node)->deleted_signal().emit();\n\t\t\tm_nodes.erase(std::remove(m_nodes.begin(), m_nodes.end(), *node), m_nodes.end());\n\t\t}\n\t\tm_remove_nodes_signal.emit(nodes);\n\n\t}\n\n\tadd_nodes_signal_t& add_nodes_signal()\n\t{\n\t\treturn m_add_nodes_signal;\n\t}\n\n\tremove_nodes_signal_t& remove_nodes_signal()\n\t{\n\t\treturn m_remove_nodes_signal;\n\t}\n\n\trename_node_signal_t& rename_node_signal()\n\t{\n\t\treturn m_rename_node_signal;\n\t}\n\n\tvoid on_close_document()\n\t{\n\t\t// Give nodes a chance to shut down ...\n\t\tfor(inode_collection::nodes_t::iterator node = m_nodes.begin(); node != m_nodes.end(); ++node)\n\t\t{\n\t\t\t(*node)->deleted_signal().emit();\n\t\t}\n\n\t\t// Zap nodes ...\n\t\tfor(inode_collection::nodes_t::iterator node = m_nodes.begin(); node != m_nodes.end(); ++node)\n\t\t\tdelete *node;\n\t}\n\nprivate:\n\tclass add_nodes_container :\n\t\tpublic istate_container\n\t{\n\tpublic:\n\t\tadd_nodes_container(inode_collection& Collection, const inode_collection::nodes_t& Nodes) :\n\t\t\tm_collection(Collection),\n\t\t\tm_nodes(Nodes)\n\t\t{\n\t\t}\n\n\t\t~add_nodes_container()\n\t\t{\n\t\t}\n\n\t\tvoid restore_state()\n\t\t{\n\t\t\tm_collection.add_nodes(m_nodes);\n\t\t}\n\n\tprivate:\n\t\tinode_collection& m_collection;\n\t\tconst inode_collection::nodes_t m_nodes;\n\t};\n\n\tclass remove_nodes_container :\n\t\tpublic istate_container\n\t{\n\tpublic:\n\t\tremove_nodes_container(inode_collection& Collection, const inode_collection::nodes_t& Nodes) :\n\t\t\tm_collection(Collection),\n\t\t\tm_nodes(Nodes)\n\t\t{\n\t\t}\n\n\t\t~remove_nodes_container()\n\t\t{\n\t\t}\n\n\t\tvoid restore_state()\n\t\t{\n\t\t\tm_collection.remove_nodes(m_nodes);\n\t\t}\n\n\tprivate:\n\t\tinode_collection& m_collection;\n\t\tconst inode_collection::nodes_t m_nodes;\n\t};\n\n\t/// Provides storage for undo/redo information\n\tistate_recorder& m_state_recorder;\n\t/// Provides undo-able storage for a collection of nodes\n\tinode_collection::nodes_t m_nodes;\n\t/// Signal for notifying observers when nodes are added to the collection\n\tadd_nodes_signal_t m_add_nodes_signal;\n\t/// Signal for notifying observers when nodes are removed from the collection\n\tremove_nodes_signal_t m_remove_nodes_signal;\n\t/// Signal for notifying observers when an node's name is changed\n\trename_node_signal_t m_rename_node_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// public_document_implementation\n\n/// Encapsulates an open K-3D document\nclass public_document_implementation :\n\tpublic idocument,\n\tpublic property_collection,\n\tpublic sigc::trackable\n{\npublic:\n\tpublic_document_implementation(istate_recorder& StateRecorder, inode_collection& Nodes, ipipeline& Pipeline) :\n\t\tm_state_recorder(StateRecorder),\n\t\tm_nodes(Nodes),\n\t\tm_pipeline(Pipeline),\n\t\tm_path(init_owner(*this) + init_name(\"path\") + init_label(_(\"Document Path\")) + init_description(_(\"Document Path\")) + init_value(filesystem::path())),\n\t\tm_title(init_owner(*this) + init_name(\"title\") + init_label(_(\"Document Title\")) + init_description(_(\"Document Title\")) + init_value(k3d::ustring()))\n\t{\n \t\t// Automatically add nodes to the unique node name collection\n \t\tm_nodes.add_nodes_signal().connect(sigc::mem_fun(m_unique_node_names, &node_name_map::add_nodes));\n\t}\n\n\t~public_document_implementation()\n\t{\n\t\t// Note: our close signal gets called by our owner - yes, it's a hack\n\t}\n\n\tidocument& document()\n\t{\n\t\treturn *this;\n\t}\n\n\tinode_collection& nodes()\n\t{\n\t\treturn m_nodes;\n\t}\n\n\tipipeline& pipeline()\n\t{\n\t\treturn m_pipeline;\n\t}\n\n\tipipeline_profiler& pipeline_profiler()\n\t{\n\t\treturn m_pipeline_profiler;\n\t}\n\t\n\tistate_recorder& state_recorder()\n\t{\n\t\treturn m_state_recorder;\n\t}\n\n \tinode_name_map& unique_node_names()\n \t{\n \t\treturn m_unique_node_names;\n \t}\n\n\tiproperty& path()\n\t{\n\t\treturn m_path;\n\t}\n\n\tiproperty& title()\n\t{\n\t\treturn m_title;\n\t}\n\n\tidocument::close_signal_t& close_signal()\n\t{\n\t\treturn m_close_signal;\n\t}\n\nprivate:\n\t/// Notifies observers that the document is being closed\n\tclose_signal_t m_close_signal;\n\n\t/// Records changes made by the user for Undo / Redo purposes\n\tistate_recorder& m_state_recorder;\n\t/// Stores document nodes ...\n\tinode_collection& m_nodes;\n\t/// Stores a reference to an implementation of ipipeline\n\tipipeline& m_pipeline;\n\t/// Stores a pipeline profiler object\n\tk3d::pipeline_profiler m_pipeline_profiler;\n \t/// Stores unique node names\n \tnode_name_map m_unique_node_names;\n\n\t/// Stores the full document filepath (if any)\n\tk3d_data(filesystem::path, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) m_path;\n\t/// Stores the document title (if any)\n\tk3d_data(ustring, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) m_title;\n};\n\n/// This is a real abortion, but it solves our interdependency problems among state recorder, pipeline, and property collection implementations\nclass document_implementation\n{\npublic:\n\tdocument_implementation() :\n\t\tm_state_recorder(new state_recorder_implementation()),\n\t\tm_nodes(new node_collection_implementation(*m_state_recorder)),\n\t\tm_pipeline(new pipeline(m_state_recorder)),\n\t\tm_document(new public_document_implementation(*m_state_recorder, *m_nodes, *m_pipeline))\n\t{\n\t}\n\n\t~document_implementation()\n\t{\n\t\tm_document->close_signal().emit();\n\n\t\t// Completely remove all pipeline connections so we don't waste time updating individual properties\n\t\tm_pipeline->clear();\n\t\tm_nodes->on_close_document();\n\n\t\tdelete m_document;\n\t\tdelete m_pipeline;\n\t\tdelete m_nodes;\n\t\tdelete m_state_recorder;\n\t}\n\n\tstate_recorder_implementation* const m_state_recorder;\n\tnode_collection_implementation* const m_nodes;\n\tpipeline* const m_pipeline;\n\tpublic_document_implementation* const m_document;\n\nprivate:\n\tdocument_implementation(const document_implementation&);\n\tdocument_implementation& operator=(const document_implementation&);\n};\n\ntypedef std::vector<document_implementation*> documents_t;\n\ndocuments_t& documents()\n{\n\tstatic documents_t g_documents;\n\treturn g_documents;\n}\n\n} // namespace detail\n\nidocument* create_document()\n{\n\tstd::unique_ptr<detail::document_implementation> document(new detail::document_implementation());\n\tdetail::documents().push_back(document.get());\n\treturn document.release()->m_document;\n}\n\nvoid close_document(idocument& Document)\n{\n\tfor(detail::documents_t::iterator document = detail::documents().begin(); document != detail::documents().end(); ++document)\n\t{\n\t\tif((*document)->m_document == &Document)\n\t\t{\n\t\t\tdelete *document;\n\t\t\tdetail::documents().erase(document);\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\tlog() << error << \"close_document(): could not find document to destroy\" << std::endl;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/document.h",
    "content": "#ifndef K3DSDK_DOCUMENT_H\n#define K3DSDK_DOCUMENT_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares the CDocument class, which encapsulates an open K-3D document\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\n// Forward declarations\nclass idocument;\n\n/// Factory function that creates a new document with (optional) template (could return NULL)\nidocument* create_document();\n/// Destroys a document,  freeing all resources\nvoid close_document(idocument& Document);\n\n} // namespace k3d\n\n#endif // !K3DSDK_DOCUMENT_H\n\n"
  },
  {
    "path": "k3dsdk/document_plugin_factory.h",
    "content": "#ifndef K3DSDK_DOCUMENT_PLUGIN_FACTORY_H\n#define K3DSDK_DOCUMENT_PLUGIN_FACTORY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/interface_list.h>\n#include <k3dsdk/plugin_factory.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// document_plugin_factory\n\ntemplate<typename plugin_t, typename interface_list = null_interface>\nclass document_plugin_factory :\n\tpublic plugin_factory,\n\tpublic idocument_plugin_factory\n{\npublic:\n\tdocument_plugin_factory(const uuid& FactoryID, const std::string& Name, const std::string& ShortDescription, const std::string& Categories, const quality_t Quality = STABLE, const metadata_t& Metadata = metadata_t()) :\n\t\tplugin_factory(FactoryID, Name, ShortDescription, Categories, Quality, Metadata)\n\t{\n\t}\n\n\tinode* create_plugin(iplugin_factory& Factory, idocument& Document)\n\t{\n\t\treturn new plugin_t(Factory, Document);\n\t}\n\n\tbool implements(const std::type_info& InterfaceType)\n\t{\n\t\treturn implements_interface<interface_list>()(InterfaceType);\n\t}\n\n\tconst interfaces_t interfaces()\n\t{\n\t\tinterfaces_t results;\n\t\tget_interfaces<interface_list>()(results);\n\t\treturn results;\n\t}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_DOCUMENT_PLUGIN_FACTORY_H\n\n"
  },
  {
    "path": "k3dsdk/double_source.h",
    "content": "#ifndef K3DSDK_DOUBLE_SOURCE_H\n#define K3DSDK_DOUBLE_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/idouble_source.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace k3d\n{\n\ntemplate<typename derived_t>\nclass double_source :\n\tpublic idouble_source\n{\npublic:\n\tiproperty& double_source_output()\n\t{\n\t\treturn m_output_double;\n\t}\n\n\tsigc::slot<void, ihint*> make_update_double_slot()\n\t{\n\t\treturn m_output_double.make_slot();\n\t}\n\nprotected:\n\tdouble_source() :\n\t\tm_output_double(\n\t\t\tinit_owner(*static_cast<derived_t*>(this))\n\t\t\t+ init_name(\"output_double\")\n\t\t\t+ init_label(_(\"Output Double\"))\n\t\t\t+ init_description(\"Output double\")\n\t\t\t+ init_value(0.0))\n\t{\n\t\tm_output_double.set_update_slot(sigc::mem_fun(*this, &double_source<derived_t>::execute));\n\t}\n\nprivate:\n\tk3d_data(double_t, data::immutable_name, data::change_signal, data::no_undo, data::value_demand_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_output_double;\n\n\t/// Called whenever the output has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, double_t& Output)\n\t{\n\t\t// We can safely ignore any hints ...\n\t\ton_update_double(Output);\n\t}\n\n\tvirtual void on_update_double(double_t& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_DOUBLE_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/euler_operations.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/euler_operations.h>\n#include <k3dsdk/table_copier.h>\n\n#include <set>\n\nnamespace k3d\n{\n\nnamespace euler\n{\n\nnamespace detail\n{\n\ntemplate<class ArrayT> void cumulative_sum(const ArrayT& InputArray, ArrayT& OutputArray)\n{\n\treturn_if_fail(InputArray.size() == OutputArray.size());\n\tif(InputArray.empty())\n\t\treturn;\n\tconst uint_t array_begin = 0;\n\tconst uint_t array_end = InputArray.size();\n\tOutputArray[0] = InputArray[0];\n\tfor(uint_t i = array_begin + 1; i != array_end; ++i)\n\t\tOutputArray[i] = OutputArray[i-1] + InputArray[i];\n}\n\n/// Sets the loop number associated with each edge in the loop to Loop\nvoid set_edge_loop(const uint_t Loop, const uint_t FirstEdge, const mesh::indices_t& ClockwiseEdges, mesh::indices_t& EdgeLoops)\n{\n\tfor(uint_t edge = FirstEdge; ;)\n\t{\n\t\tEdgeLoops[edge] = Loop;\n\t\t\n\t\tedge = ClockwiseEdges[edge];\n\t\tif(edge == FirstEdge)\n\t\t\tbreak;\n\t}\n}\n\n/// True if the given loop is really a polyline of adjacent edges\nbool_t is_polyline(const uint_t FirstEdge, const mesh::indices_t& ClockwiseEdges, const mesh::indices_t& EdgeLoops, const mesh::indices_t& AdjacentEdges)\n{\n\tfor(uint_t edge = FirstEdge; ;)\n\t{\n\t\tif(AdjacentEdges[edge] == edge || EdgeLoops[AdjacentEdges[edge]] != EdgeLoops[edge])\n\t\t\treturn false;\n\t\t\n\t\tedge = ClockwiseEdges[edge];\n\t\tif(edge == FirstEdge)\n\t\t\tbreak;\n\t}\n\t\n\treturn true;\n}\n\n/// Deletes the given loop\nvoid delete_loop(const uint_t Loop, const mesh::indices_t& LoopFaces, const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& ClockwiseEdges, mesh::indices_t& FacesToDelete, mesh::indices_t& LoopsToDelete, mesh::indices_t& EdgesToDelete, mesh::indices_t& Companions, mesh::indices_t& OutputFaceLoopCounts)\n{\n\tconst uint_t face = LoopFaces[Loop];\n\t--OutputFaceLoopCounts[face];\n\tif(Loop == FaceFirstLoops[face])\n\t{\n\t\tFacesToDelete[face] = 1;\n\t\tfor(uint_t loop = 0; loop != LoopFaces.size(); ++loop)\n\t\t{\n\t\t\tif(LoopFaces[loop] == face && !LoopsToDelete[loop])\n\t\t\t{\n\t\t\t\tLoopsToDelete[loop] = 1;\n\t\t\t\t--OutputFaceLoopCounts[face];\n\t\t\t\tconst uint_t first_edge2 = LoopFirstEdges[loop];\n\t\t\t\tfor(uint_t edge = first_edge2; ;)\n\t\t\t\t{\n\t\t\t\t\t//return_if_fail(!EdgesToDelete[edge]);\n\t\t\t\t\tEdgesToDelete[edge] = 1;\n\t\t\t\t\t\n\t\t\t\t\tedge = ClockwiseEdges[edge];\n\t\t\t\t\tif(edge == first_edge2)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tLoopsToDelete[Loop] = 1;\n\t}\n}\n\n/// Deletes the given loop if it consists of two edges, as well as the face if tis was the last loop\nvoid delete_loop_if_degenerate(const uint_t Loop, const mesh::indices_t& LoopFaces, const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& ClockwiseEdges, mesh::indices_t& FacesToDelete, mesh::indices_t& LoopsToDelete, mesh::indices_t& EdgesToDelete, mesh::indices_t& Companions, mesh::indices_t& OutputFaceLoopCounts)\n{\n\tconst uint_t first_edge = LoopFirstEdges[Loop];\n\tif(first_edge != ClockwiseEdges[ClockwiseEdges[first_edge]]) // not a degenerate loop\n\t\treturn;\n\t\n\tdelete_loop(Loop, LoopFaces, FaceFirstLoops, LoopFirstEdges, ClockwiseEdges, FacesToDelete, LoopsToDelete, EdgesToDelete, Companions, OutputFaceLoopCounts);\n\tconst uint_t companion1 = Companions[first_edge];\n\tconst uint_t companion2 = Companions[ClockwiseEdges[first_edge]];\n\tCompanions[companion1] = companion2;\n\tCompanions[companion2] = companion1;\n}\n\n/// Update output arrays based on geometry that is marked for deletion\nvoid remove_deleted_geometry(polyhedron::primitive& Output,\n\t\tconst mesh::indices_t& FaceFirstLoops,\n\t\tconst mesh::counts_t& FaceLoopCounts,\n\t\tconst mesh::indices_t& LoopFirstEdges,\n\t\tconst mesh::indices_t& EdgePoints,\n\t\tconst mesh::indices_t& ClockwiseEdges,\n\t\tconst mesh::indices_t& FacesToDelete,\n\t\tconst mesh::indices_t& LoopsToDelete,\n\t\tconst mesh::indices_t& EdgesToDelete,\n\t\tconst mesh::indices_t& LoopFaces,\n\t\tconst mesh::selection_t& FaceSelection,\n\t\tconst mesh::indices_t& FaceShells)\n{\n\tconst uint_t edge_count = EdgePoints.size();\n\tconst uint_t face_count = FaceFirstLoops.size();\n\tmesh::counts_t edges_to_delete_sum(edge_count);\n\tdetail::cumulative_sum(EdgesToDelete, edges_to_delete_sum);\n\tmesh::indices_t loop_map(LoopFirstEdges.size()); // mapping between old and new loop numbers\n\tmesh::indices_t& output_loop_first_edges = Output.loop_first_edges;\n\toutput_loop_first_edges.clear();\n\tmesh::indices_t& output_face_first_loops = Output.face_first_loops;\n\toutput_face_first_loops.clear();\n\tmesh::indices_t& output_face_loop_counts = Output.face_loop_counts;\n\toutput_face_loop_counts.clear();\n\tmesh::selection_t& output_face_selection = Output.face_selections;\n\toutput_face_selection.clear();\n\tOutput.face_shells.clear();\n\tmesh::indices_t face_map(face_count);\n\n\tconst k3d::table input_edge_attributes = Output.edge_attributes;\n\tconst k3d::table input_vertex_attributes = Output.vertex_attributes;\n\tconst k3d::table input_face_attributes = Output.face_attributes;\n\tOutput.edge_attributes = input_edge_attributes.clone_types();\n\tOutput.vertex_attributes = input_vertex_attributes.clone_types();\n\tOutput.face_attributes = input_face_attributes.clone_types();\n\tk3d::table_copier edge_copier(input_edge_attributes, Output.edge_attributes);\n\tk3d::table_copier vertex_copier(input_vertex_attributes, Output.vertex_attributes);\n\tk3d::table_copier face_copier(input_face_attributes, Output.face_attributes);\n\n\tfor(uint_t loop = 0; loop != LoopFirstEdges.size(); ++loop)\n\t{\n\t\tif(!LoopsToDelete[loop] && !FacesToDelete[LoopFaces[loop]])\n\t\t{\n\t\t\tconst uint_t face = LoopFaces[loop];\n\t\t\t//return_if_fail(!FacesToDelete[face]);\n\t\t\tif(loop == FaceFirstLoops[face])\n\t\t\t{\n\t\t\t\tface_map[face] = output_face_first_loops.size();\n\t\t\t\toutput_face_first_loops.push_back(output_loop_first_edges.size());\n\t\t\t\toutput_face_loop_counts.push_back(FaceLoopCounts[face]);\n\t\t\t\toutput_face_selection.push_back(FaceSelection[face]);\n\t\t\t\tface_copier.push_back(face);\n\t\t\t\tOutput.face_shells.push_back(FaceShells[face]);\n\t\t\t\treturn_if_fail(!EdgesToDelete[LoopFirstEdges[loop]]);\n\t\t\t\toutput_loop_first_edges.push_back(LoopFirstEdges[loop] - edges_to_delete_sum[LoopFirstEdges[loop]]);\n\t\t\t\toutput_loop_first_edges.resize(output_loop_first_edges.size() + FaceLoopCounts[face] - 1);\n\t\t\t}\n\t\t}\n\t}\n\tmesh::counts_t added_loops(output_face_first_loops.size(), 1);\n\tfor(uint_t loop = 0; loop != LoopFirstEdges.size(); ++loop)\n\t{\n\t\tif(!LoopsToDelete[loop] && !FacesToDelete[LoopFaces[loop]])\n\t\t{\n\t\t\tconst uint_t face = LoopFaces[loop];\n\t\t\tconst uint_t new_face = face_map[face];\n\t\t\tif(loop != FaceFirstLoops[face])\n\t\t\t{\n\t\t\t\toutput_loop_first_edges[output_face_first_loops[new_face] + added_loops[new_face]] = LoopFirstEdges[loop] - edges_to_delete_sum[LoopFirstEdges[loop]];\n\t\t\t\t++added_loops[new_face];\n\t\t\t}\n\t\t}\n\t}\n\tmesh::indices_t& output_edge_points = Output.vertex_points;\n\toutput_edge_points.clear();\n\tmesh::indices_t& output_clockwise_edges = Output.clockwise_edges;\n\toutput_clockwise_edges.clear();\n\tfor(uint_t edge = 0; edge != edge_count; ++edge)\n\t{\n\t\tif(!EdgesToDelete[edge])\n\t\t{\n\t\t\toutput_edge_points.push_back(EdgePoints[edge]);\n\t\t\toutput_clockwise_edges.push_back(ClockwiseEdges[edge] - edges_to_delete_sum[ClockwiseEdges[edge]]);\n\t\t\tedge_copier.push_back(edge);\n\t\t\tvertex_copier.push_back(edge);\n\t\t}\n\t}\n\tstd::set<uint_t> shells_to_erase;\n\tconst uint_t shell_count = Output.shell_types.size();\n\tfor(uint_t shell_idx = 0; shell_idx != shell_count; ++shell_idx)\n\t{\n\t\tif(!std::count(Output.face_shells.begin(), Output.face_shells.end(), shell_idx))\n\t\t{\n\t\t\tshells_to_erase.insert(shell_idx);\n\t\t}\n\t}\n\tfor(std::set<uint_t>::const_reverse_iterator it = shells_to_erase.rbegin(); it != shells_to_erase.rend(); ++it)\n\t{\n\t\tconst uint_t faces_end = Output.face_shells.size();\n\t\tfor(uint_t face = 0; face != faces_end; ++face)\n\t\t{\n\t\t\tif(Output.face_shells[face] > *it)\n\t\t\t\t--Output.face_shells[face];\n\t\t}\n\t}\n\tfor(typed_array<int32_t>::iterator shell = Output.shell_types.begin(); shell != Output.shell_types.end();)\n\t{\n\t\tif(shells_to_erase.count(shell - Output.shell_types.begin()))\n\t\t{\n\t\t\tshell = Output.shell_types.erase(shell);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t++shell;\n\t\t}\n\t}\n}\n\n/// Creates lookup arrays linking edges to their loops, and loops to their faces\nvoid create_edge_loop_face_lookup(const mesh::indices_t& FaceFirstLoops,\n\t\tconst mesh::counts_t& FaceLoopCounts,\n\t\tconst mesh::indices_t& LoopFirstEdges,\n\t\tconst mesh::indices_t& ClockwiseEdges,\n\t\tmesh::indices_t& EdgeLoops,\n\t\tmesh::indices_t& LoopFaces)\n{\n\tconst uint_t face_count = FaceFirstLoops.size();\n\tEdgeLoops.resize(ClockwiseEdges.size());\n\tLoopFaces.resize(LoopFirstEdges.size());\n\tfor(uint_t face = 0; face != face_count; ++face) // fill the above arrays\n\t{\n\t\tconst uint_t loop_begin = FaceFirstLoops[face];\n\t\tconst uint_t loop_end = loop_begin + FaceLoopCounts[face];\n\t\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tLoopFaces[loop] = face;\n\t\t\tconst uint_t first_edge = LoopFirstEdges[loop];\n\t\t\tfor(uint_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\tEdgeLoops[edge] = loop;\n\n\t\t\t\tedge = ClockwiseEdges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n} // namespace detail\n\nvoid kill_edge_make_loop(polyhedron::primitive& Output, const mesh::indices_t& EdgeList, const mesh::bools_t BoundaryEdges, const mesh::indices_t& AdjacentEdges, const mesh::points_t& Points, const mesh::normals_t& FaceNormals)\n{\n\n\t// Copies, so we can use them as temp storage between the individiual KEML operations\n\tconst mesh::indices_t face_first_loops = Output.face_first_loops;\n\tmesh::counts_t face_loop_counts = Output.face_loop_counts;\n\tmesh::indices_t loop_first_edges = Output.loop_first_edges;\n\tmesh::indices_t clockwise_edges = Output.clockwise_edges;\n\tconst mesh::indices_t edge_points = Output.vertex_points;\n\t\n\tconst double_t threshold = 1e-1; // Threshold for normal comparison\n\t\n\t// Initiate some helper arrays\n\tconst uint_t face_count = face_first_loops.size();\n\tconst uint_t loop_count = loop_first_edges.size();\n\tconst uint_t edge_count = clockwise_edges.size();\n\tmesh::selection_t face_selection(face_count, 0.0);\n\tmesh::counts_t faces_to_delete(face_count, 0);\n\tmesh::counts_t loops_to_delete(loop_count, 0);\n\tmesh::counts_t edges_to_delete(edge_count, 0);\n\tmesh::indices_t loop_faces(loop_count); // for each loop, the face it belongs to\n\tmesh::indices_t edge_loops(edge_count); // for each edge, the loop it belongs to\n\tdetail::create_edge_loop_face_lookup(face_first_loops, face_loop_counts, loop_first_edges, clockwise_edges, edge_loops, loop_faces);\n\tmesh::indices_t counter_clockwise_edges(edge_count);\n\tfor(uint_t edge = 0; edge != edge_count; ++edge)\n\t{\n\t\tcounter_clockwise_edges[clockwise_edges[edge]] = edge;\n\t}\n\t\n\tmesh::selection_t marked_edges(edge_count, 0.0); \n\t\n\tfor(uint_t i = 0; i != EdgeList.size(); ++i)\n\t\tmarked_edges[EdgeList[i]] = 1.0;\n\t\n\t\n\tfor(uint_t edge_list_index = 0; edge_list_index != EdgeList.size(); ++edge_list_index)\n\t{\n\t\tconst uint_t edge = EdgeList[edge_list_index];\n\t\tconst uint_t companion = AdjacentEdges[edge];\n\t\tif(!marked_edges[edge] && !marked_edges[companion])\n\t\t\tcontinue;\n\t\tif(BoundaryEdges[edge])\n\t\t\tcontinue;\n\t\tif(edges_to_delete[edge])\n\t\t\tcontinue;\n\t\treturn_if_fail(!edges_to_delete[companion]);\n\t\t\n\t\tconst uint_t loop = edge_loops[edge];\n\t\tconst uint_t companion_loop = edge_loops[companion];\n\t\tconst uint_t face = loop_faces[loop];\n\t\tconst uint_t companion_face = loop_faces[companion_loop];\n\t\t\n\t\t// Treat this case when we hit the companion edge\n\t\tif(loop == face_first_loops[face] && companion_loop != face_first_loops[companion_face])\n\t\t{  \n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\treturn_if_fail(!faces_to_delete[face]);\n\t\treturn_if_fail(!faces_to_delete[companion_face]);\n\t\treturn_if_fail(!loops_to_delete[loop]);\n\t\treturn_if_fail(!loops_to_delete[companion_loop]);\n\t\t\n\t\treturn_if_fail(clockwise_edges[counter_clockwise_edges[edge]] == edge);\n\t\treturn_if_fail(clockwise_edges[counter_clockwise_edges[companion]] == companion);\n\t\treturn_if_fail(counter_clockwise_edges[clockwise_edges[edge]] == edge);\n\t\treturn_if_fail(counter_clockwise_edges[clockwise_edges[companion]] == companion);\n\t\t\n\t\tedges_to_delete[edge] = 1;\n\t\tedges_to_delete[companion] = 1;\n\t\t\n\t\tface_selection[face] = 1.0;\n\t\t\n\t\tif(edge == clockwise_edges[clockwise_edges[edge]])\n\t\t{\n\t\t\treturn_if_fail(loop == companion_loop);\n\t\t\treturn_if_fail(loop != face_first_loops[face]);\n\t\t\treturn_if_fail(counter_clockwise_edges[counter_clockwise_edges[edge]] == edge);\n\t\t\tloops_to_delete[loop] = 1;\n\t\t\t--face_loop_counts[face];\n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tbool_t loop_is_polyline = detail::is_polyline(edge, clockwise_edges, edge_loops, AdjacentEdges);\n\t\tbool_t companion_loop_is_polyline = detail::is_polyline(companion, clockwise_edges, edge_loops, AdjacentEdges);\n\t\t\n\t\t// Reconnect edges\n\t\tclockwise_edges[counter_clockwise_edges[edge]] = clockwise_edges[companion];\n\t\tclockwise_edges[counter_clockwise_edges[companion]] = clockwise_edges[edge];\n\t\tcounter_clockwise_edges[clockwise_edges[edge]] = counter_clockwise_edges[companion];\n\t\tcounter_clockwise_edges[clockwise_edges[companion]] = counter_clockwise_edges[edge];\n\t\t\n\t\tif(loop == companion_loop)\n\t\t{\n\t\t\treturn_if_fail(face == companion_face);\n\t\t\tif(clockwise_edges[edge] == companion)\n\t\t\t{\n\t\t\t\tloop_first_edges[loop] = clockwise_edges[companion];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif(clockwise_edges[companion] == edge)\n\t\t\t{\n\t\t\t\tloop_first_edges[loop] = clockwise_edges[edge];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif(!detail::is_polyline(clockwise_edges[companion], clockwise_edges, edge_loops, AdjacentEdges)\n\t\t\t\t&& std::abs(normalize(polyhedron::normal(edge_points, clockwise_edges, Points, clockwise_edges[companion])) * FaceNormals[face] - 1) < threshold)\n\t\t\t{\n\t\t\t\tloop_first_edges[loop] = clockwise_edges[companion];\n\t\t\t\tconst uint_t new_loop = loop_first_edges.size();\n\t\t\t\tloop_first_edges.push_back(clockwise_edges[edge]);\n\t\t\t\tdetail::set_edge_loop(new_loop, clockwise_edges[edge], clockwise_edges, edge_loops);\n\t\t\t\tloop_faces.push_back(face);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(loop == face_first_loops[face]) // first loops should not degenerate to a polyline\n\t\t\t\t{\n\t\t\t\t\treturn_if_fail(!detail::is_polyline(clockwise_edges[edge], clockwise_edges, edge_loops, AdjacentEdges));\n\t\t\t\t\treturn_if_fail(std::abs(normalize(polyhedron::normal(edge_points, clockwise_edges, Points, clockwise_edges[edge])) * FaceNormals[face] - 1) < threshold);\n\t\t\t\t}\n\t\t\t\tloop_first_edges[loop] = clockwise_edges[edge];\n\t\t\t\tconst uint_t new_loop = loop_first_edges.size();\n\t\t\t\tloop_first_edges.push_back(clockwise_edges[companion]);\n\t\t\t\tdetail::set_edge_loop(new_loop, clockwise_edges[companion], clockwise_edges, edge_loops);\n\t\t\t\tloop_faces.push_back(face);\n\t\t\t}\n\t\t\t++face_loop_counts[face];\n\t\t\tloops_to_delete.push_back(0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(companion_loop == face_first_loops[companion_face])\n\t\t\t{\n\t\t\t\tloop_first_edges[loop] = counter_clockwise_edges[edge];\n\t\t\t\tdetail::set_edge_loop(loop, loop_first_edges[loop], clockwise_edges, edge_loops);\n\t\t\t\tloops_to_delete[companion_loop] = 1;\n\t\t\t\t--face_loop_counts[companion_face];\n\t\t\t\tfaces_to_delete[companion_face] = 1;\n\t\t\t\tfor(uint_t l = 0; l != loop_faces.size(); ++l)\n\t\t\t\t{\n\t\t\t\t\tif(loop_faces[l] == companion_face && !loops_to_delete[l])\n\t\t\t\t\t{\n\t\t\t\t\t\tloop_faces[l] = face;\n\t\t\t\t\t\t++face_loop_counts[face];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tassert_not_implemented();\n\t\t\t}\n\t\t}\n\t}\n\treturn_if_fail(loops_to_delete.size() == loop_first_edges.size());\n\treturn_if_fail(loop_faces.size() == loop_first_edges.size());\n\tmesh::indices_t edges_to_delete_sum(edges_to_delete.size());\n\tdetail::cumulative_sum(edges_to_delete, edges_to_delete_sum);\n\t// Update the output arrays\n\tconst k3d::mesh::indices_t face_shells = Output.face_shells;\n\tdetail::remove_deleted_geometry(Output, face_first_loops, face_loop_counts, loop_first_edges, edge_points, clockwise_edges, faces_to_delete, loops_to_delete, edges_to_delete, loop_faces, face_selection, face_shells);\n\tOutput.face_materials.assign(Output.face_first_loops.size(), static_cast<imaterial*>(0));\n\tOutput.edge_selections.assign(Output.vertex_points.size(), 0.0);\n\tOutput.vertex_selections.assign(Output.vertex_points.size(), 0.0);\n\n}\n\nvoid kill_edge_and_vertex(polyhedron::primitive& Output, const mesh::indices_t& EdgeList, const mesh::bools_t BoundaryEdges, const mesh::indices_t& AdjacentEdges, const uint_t PointCount)\n{\n\tconst mesh::indices_t face_first_loops = Output.face_first_loops;\n\tmesh::counts_t face_loop_counts = Output.face_loop_counts;\n\tmesh::indices_t loop_first_edges = Output.loop_first_edges;\n\tmesh::indices_t clockwise_edges = Output.clockwise_edges;\n\tmesh::indices_t edge_points = Output.vertex_points;\n\t// Copy the companions array, since it will change\n\tmesh::indices_t companions = AdjacentEdges;\n\t\n\t// Initiate some helper arrays\n\tconst uint_t face_count = face_first_loops.size();\n\tconst uint_t loop_count = loop_first_edges.size();\n\tconst uint_t edge_count = clockwise_edges.size();\n\tmesh::selection_t face_selection(face_count, 0.0);\n\tmesh::counts_t faces_to_delete(face_count, 0);\n\tmesh::counts_t loops_to_delete(loop_count, 0);\n\tmesh::counts_t edges_to_delete(edge_count, 0);\n\tmesh::indices_t loop_faces(loop_count); // for each loop, the face it belongs to\n\tmesh::indices_t edge_loops(edge_count); // for each edge, the loop it belongs to\n\tdetail::create_edge_loop_face_lookup(face_first_loops, face_loop_counts, loop_first_edges, clockwise_edges, edge_loops, loop_faces);\n\tmesh::indices_t counter_clockwise_edges(edge_count);\n\tfor(uint_t edge = 0; edge != edge_count; ++edge)\n\t{\n\t\tconst uint_t clockwise = clockwise_edges[edge];\n\t\tcounter_clockwise_edges[clockwise] = edge;\n\t}\n\t\n\t// maps old point indices to the indices that replace them.\n\tmesh::indices_t point_map(PointCount, 0.0);\n\tfor(uint_t point = 0; point != PointCount; ++point)\n\t\tpoint_map[point] = point;\n\t\n\tfor(uint_t edge_list_index = 0; edge_list_index != EdgeList.size(); ++edge_list_index)\n\t{\n\t\tconst uint_t edge = EdgeList[edge_list_index];\n\t\t//const uint_t edge = affected_edges[i];\n\t\tconst uint_t companion = companions[edge];\n\t\tconst uint_t loop = edge_loops[edge];\n\t\tconst uint_t face = loop_faces[loop];\n\t\t\n\t\tif(!edges_to_delete[companion])\n\t\t{\n\t\t\tconst uint_t edge_point = edge_points[edge];\n\t\t\tif(edge_point == point_map[edge_point])\n\t\t\t\tpoint_map[edge_point] = edge_points[clockwise_edges[edge]];\n\t\t}\n\t\t\n\t\treturn_if_fail(clockwise_edges[counter_clockwise_edges[edge]] == edge);\n\n\t\t// Mark edge to delete\n\t\tedges_to_delete[edge] = 1;\n\t\t\n\t\t// Reconnect edges\n\t\tif(companion == counter_clockwise_edges[edge]) // first antenna case\n\t\t{\n\t\t\tcounter_clockwise_edges[clockwise_edges[edge]] = companions[clockwise_edges[edge]];\n\t\t\tloop_first_edges[loop] = companions[clockwise_edges[edge]];\n\t\t}\n\t\telse if(companion == clockwise_edges[edge]) // second antenna case\n\t\t{\n\t\t\tclockwise_edges[counter_clockwise_edges[edge]] = companions[counter_clockwise_edges[edge]];\n\t\t\tloop_first_edges[loop] = companions[counter_clockwise_edges[edge]];\n\t\t}\n\t\telse // normal edge\n\t\t{\n\t\t\tclockwise_edges[counter_clockwise_edges[edge]] = clockwise_edges[edge];\n\t\t\tcounter_clockwise_edges[clockwise_edges[edge]] = counter_clockwise_edges[edge];\n\t\t\treturn_if_fail(edge_loops[counter_clockwise_edges[edge]] == edge_loops[clockwise_edges[edge]]);\n\t\t\tloop_first_edges[loop] = clockwise_edges[edge];\n\t\t}\n\t\t// Check if we created a loop that has only 2 edges, and if we did, delete it\n\t\tdetail::delete_loop_if_degenerate(loop, loop_faces, face_first_loops, loop_first_edges, clockwise_edges, faces_to_delete, loops_to_delete, edges_to_delete, companions, face_loop_counts);\n\t}\n\t\n\t// Set edge points\n\tfor(uint_t edge = 0; edge != edge_count; ++edge)\n\t{\n\t\tif(!edges_to_delete[edge] && edge_points[edge] != edge_points[clockwise_edges[edge]])\n\t\t{\n\t\t\tuint_t new_edge_point = edge_points[edge];\n\t\t\t// recursively get the new edge point\n\t\t\twhile(new_edge_point != point_map[new_edge_point])\n\t\t\t{\n\t\t\t\tnew_edge_point = point_map[new_edge_point];\n\t\t\t\t// if we get a loop, leave the point unchanged\n\t\t\t\tif(new_edge_point != point_map[new_edge_point] && new_edge_point == point_map[point_map[new_edge_point]])\n\t\t\t\t{\n\t\t\t\t\tnew_edge_point = edge_points[edge];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(edge_points[edge] != new_edge_point)\n\t\t\t{\n\t\t\t\tface_selection[loop_faces[edge_loops[edge]]] = 1.0;\n\t\t\t}\n\t\t\tedge_points[edge] = new_edge_point;\n\t\t}\n\t}\n\t\n\t// Remove edges that have the same start and end\n\tfor(uint_t edge = 0; edge != edge_count; ++edge)\n\t{\n\t\tif(edge_points[edge] == edge_points[clockwise_edges[edge]])\n\t\t{\n\t\t\tedges_to_delete[edge] = 1;\n\t\t\tclockwise_edges[counter_clockwise_edges[edge]] = clockwise_edges[edge];\n\t\t\tcounter_clockwise_edges[clockwise_edges[edge]] = counter_clockwise_edges[edge];\n\t\t\tloop_first_edges[edge_loops[edge]] = clockwise_edges[edge];\n\t\t}\n\t}\n\t\n\t// Update output arrays\n\tconst k3d::mesh::indices_t face_shells = Output.face_shells;\n\tdetail::remove_deleted_geometry(Output,face_first_loops, face_loop_counts, loop_first_edges, edge_points, clockwise_edges, faces_to_delete, loops_to_delete, edges_to_delete, loop_faces, face_selection, face_shells);\n\tOutput.face_materials.assign(Output.face_first_loops.size(), static_cast<imaterial*>(0));\n\tOutput.edge_selections.assign(Output.clockwise_edges.size(), 0.0);\n\tOutput.vertex_selections.assign(Output.clockwise_edges.size(), 0.0);\n}\n\n} // namespace euler\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/euler_operations.h",
    "content": "#ifndef K3DSDK_EULER_OPERATIONS_H\n#define K3DSDK_EULER_OPERATIONS_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/polyhedron.h>\n\nnamespace k3d\n{\n\nnamespace euler\n{\n\n/// Apply the Kill Edge Make Loop (KEML) Euler operation to all edges in EdgeList that are not boundary edges\n/**\n * This operations removes an edge and its companion, and makes one loop out of the loops that are on either side of the edge.\n * This effectively merges two faces, if neither loop is a hole.\n * \\param Output The polyhedron containing the input, which will be transformed so it contains the output\n * \\param EdgeList A list of edge indices that the operation will be applied to\n * \\param BoundaryEdges True for all edges that are on the mesh boundary\n * \\param AdjacentEdges The index of the adjacent edge (companion) for each edge\n * \\param Points The coordinates of the points for the mesh\n * \\param FaceNormals The normal for each face\n */\nvoid kill_edge_make_loop(polyhedron::primitive& Output, const mesh::indices_t& EdgeList, const mesh::bools_t BoundaryEdges, const mesh::indices_t& AdjacentEdges, const mesh::points_t& Points, const mesh::normals_t& FaceNormals);\n\n/// Apply the Kill Edge and Vertex (KEV) Euler operation to all selected edges\n/**\n * This operation removes an edge and its vertex. If an edge pair is selected, the vertex of the lowest numbered halfedge in\n * the pair is removed. If only one halfedge of an edge pair is selected, the vertex belonging to that edge is removed.\n * \\param Output The polyhedron containing the input, which will be transformed so it contains the output\n * \\param EdgeList A list of edge indices that the operation will be applied to\n * \\param BoundaryEdges True for all edges that are on the mesh boundary\n * \\param AdjacentEdges The index of the adjacent edge (companion) for each edge\n * \\param PointCount The number of points in the mesh\n */\nvoid kill_edge_and_vertex(polyhedron::primitive& Output, const mesh::indices_t& EdgeList, const mesh::bools_t BoundaryEdges, const mesh::indices_t& AdjacentEdges, const uint_t PointCount);\n\n} // namespace euler\n\n} // namespace k3d\n\n#endif // !K3DSDK_EULER_OPERATIONS_H\n\n"
  },
  {
    "path": "k3dsdk/exceptions.h",
    "content": "#ifndef K3DSDK_EXCEPTIONS_H\n#define K3DSDK_EXCEPTIONS_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\nnamespace k3d\n{\n\n/// All code should use this template to throw exceptions (Why? Because We Told You So)\ntemplate<class E> void throw_exception(const E& e)\n{\n    throw e;\n}\n\n} // namespace k3d\n\n#endif // !K3DSDK_EXCEPTIONS_H\n\n"
  },
  {
    "path": "k3dsdk/explicit_instantiation.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n#include <boost/any.hpp>\n\n/*\n\nExcerpted from http://mail.python.org/pipermail/c++-sig/2003-July/004906.html:\n\nMost of the subtle problems with dynamic linking C++ have to do with\nsymbols C++ generates implicitly:\n\n    RTTI and EH information\n    virtual tables\n    static data members of class template instantiations\n    static variables in function template instantiations\n\nTypically, in the Global model this information (known as \"weak\nsymbols\" on Linux) is generated in every translation unit where it is\nused, and resolved away at link time.  Of course, that leaves us with\na single copy per link unit (executable or shared library), and which\ncopy is used needs to be resolved at load time.**\n\nThe solutions generally come down to controlling where those symbols\nare generated and how they are shared across boundaries.\n\nWhether the first two things are a problem for your application\ndepends in part on the ABI (application binary interface) of your\ncompiler.  The ABI encompasses issues such as function calling\nconvention, class layout, the format of EH tables, the format of RTTI\ninformation, and of course, the procedures the compiler uses to\nmanipulate that information.\n\nYour problem with boost::any was an interaction with the compiler's\nimplementation of dynamic_cast.  Recent GCCs determine dynamic type\nequivalence by comparing the *addresses* (not the contents) of their\nRTTI information.  Because your two extension modules are not sharing\nany symbols other than those in the Boost.Python library, each one\ngets its own copy of the RTTI for the class in the any object, and the\ntemplate instantiation of the any_cast on each side of the library\nboundary uses a different copy.  The solution is to get that RTTI\ninformation generated in a place that both libraries can see.  The\nbest way to achieve that is to link both extension modules to a common\nshared library using the global model, and put the RTTI information\nthere.  For the case in question, you might achieve that by explicitly\ninstantiating the any_cast template there.\n\nThe problem we had earlier with catching exceptions is an interaction\nwith the compiler's implementation of EH and the behavior of glibc\nunder dynamic linking.  Recent glibc implementations have an\n\"inconvenient\" (charitably speaking) behavior with weak symbols.  The\nresult is that if the symbol appears in both extension modules *and*\nin the Boost.Python shared library, the first extension module loaded\nwill share a copy with the Boost.Python library and each module loaded\nthereafter will get its own copy.  Fortunately, I knew that classes\nwith non-inline virtual functions are different, and usually a\n*strong* symbol gets generated in the translation unit containing the\nclass' first non-inline virtual function.  By adding a virtual\ndestructor in the Boost.Python library we ensured that both extension\nmodules got the same copy of the exception's EH info.\n\n>>The Windows crash, FWIW, is a poor-QOI issue \"bug\" in the Dinkumware\n>>standard library that ships with vc6.  vc7 solves it:\n\nThis problem is that the vc6 associative containers use a special\nstatic data member representing a \"NULL\" node, used as a sentinel to\ntell the container implementation where the \"edge\" is, so it would\nstop searching there.  Because you instantiated the map<> template in\ntwo separate extension modules, each one got it's own copy of the\n\"NULL\" node, and a map passed across the boundary would contain the\nwrong sentinel value for the code on the other side.\n\n-- \nDave Abrahams\nBoost Consulting\nwww.boost-consulting.com\n\n*/\n\ntemplate k3d::mesh* boost::any_cast<k3d::mesh*>(boost::any&);\ntemplate k3d::mesh* boost::any_cast<k3d::mesh*>(const boost::any&);\n\n"
  },
  {
    "path": "k3dsdk/explicit_snap_source.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <algorithm>\n\n#include <k3dsdk/explicit_snap_source.h>\n#include <k3dsdk/result.h>\n\nnamespace k3d\n{\n\n////////////////////////////////////////////////////////////////////////////////////\n// explicit_snap_source\n\nexplicit_snap_source::explicit_snap_source(const std::string& Label, const k3d::point3& Position) :\n\tm_label(Label),\n\tm_position(Position)\n{\n}\n\nexplicit_snap_source::explicit_snap_source(const std::string& Label, const k3d::point3& Position, const k3d::vector3& Look, const k3d::vector3& Up) :\n\tm_label(Label),\n\tm_position(Position),\n\tm_look(new k3d::vector3(Look)),\n\tm_up(new k3d::vector3(Up))\n{\n}\n\nvoid explicit_snap_source::add_group(const std::string& Group)\n{\n\treturn_if_fail(Group.size());\n\treturn_if_fail(std::find(m_groups.begin(), m_groups.end(), Group) == m_groups.end());\n\n\tm_groups.push_back(Group);\n}\n\nconst std::string explicit_snap_source::label()\n{\n\treturn m_label;\n}\n\nconst isnap_source::groups_t explicit_snap_source::groups()\n{\n\treturn m_groups;\n}\n\nconst point3 explicit_snap_source::source_position()\n{\n\treturn m_position;\n}\n\nbool explicit_snap_source::source_orientation(vector3& SourceLook, vector3& SourceUp)\n{\n\tif(m_look.get() && m_up.get())\n\t{\n\t\tSourceLook = *m_look;\n\t\tSourceUp = *m_up;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/explicit_snap_source.h",
    "content": "#ifndef K3DSDK_EXPLICIT_SNAP_SOURCE_H\n#define K3DSDK_EXPLICIT_SNAP_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/isnap_source.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/vector3.h>\n#include <memory>\n\nnamespace k3d\n{\n\nclass explicit_snap_source :\n\tpublic isnap_source\n{\npublic:\n\texplicit_snap_source(const std::string& Label, const k3d::point3& Position);\n\texplicit_snap_source(const std::string& Label, const k3d::point3& Position, const k3d::vector3& Look, const k3d::vector3& Up);\n\n\tvoid add_group(const std::string& Group);\n\t\n\tconst std::string label();\n\tconst groups_t groups();\n\tconst point3 source_position();\n\tbool source_orientation(vector3& SourceLook, vector3& SourceUp);\n\n\tstd::string m_label;\n\tk3d::point3 m_position;\n\tstd::unique_ptr<k3d::vector3> m_look;\n\tstd::unique_ptr<k3d::vector3> m_up;\n\tgroups_t m_groups;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_EXPLICIT_SNAP_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/explicit_snap_target.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <algorithm>\n\n#include <k3dsdk/explicit_snap_target.h>\n#include <k3dsdk/result.h>\n\nnamespace k3d\n{\n\n////////////////////////////////////////////////////////////////////////////////////\n// explicit_snap_target\n\nexplicit_snap_target::explicit_snap_target(const std::string& Label, const k3d::point3& Position) :\n\tm_label(Label),\n\tm_position(Position)\n{\n}\n\nexplicit_snap_target::explicit_snap_target(const std::string& Label, const k3d::point3& Position, const k3d::vector3& Look, const k3d::vector3& Up) :\n\tm_label(Label),\n\tm_position(Position),\n\tm_look(new k3d::vector3(Look)),\n\tm_up(new k3d::vector3(Up))\n{\n}\n\nvoid explicit_snap_target::add_group(const std::string& Group)\n{\n\treturn_if_fail(Group.size());\n\treturn_if_fail(std::find(m_groups.begin(), m_groups.end(), Group) == m_groups.end());\n\n\tm_groups.push_back(Group);\n}\n\nconst std::string explicit_snap_target::label()\n{\n\treturn m_label;\n}\n\nconst isnap_target::groups_t explicit_snap_target::groups()\n{\n\treturn m_groups;\n}\n\nbool explicit_snap_target::target_position(const point3&, point3& TargetPosition)\n{\n\tTargetPosition = m_position;\n\treturn true;\n}\n\nbool explicit_snap_target::target_orientation(const point3&, vector3& TargetLook, vector3& TargetUp)\n{\n\tif(m_look.get() && m_up.get())\n\t{\n\t\tTargetLook = *m_look;\n\t\tTargetUp = *m_up;\n\t\treturn true;\n\t}\n\t\n\treturn false;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/explicit_snap_target.h",
    "content": "#ifndef K3DSDK_EXPLICIT_SNAP_TARGET_H\n#define K3DSDK_EXPLICIT_SNAP_TARGET_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/isnap_target.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/vector3.h>\n\n#include <memory>\n\nnamespace k3d\n{\n\nclass explicit_snap_target :\n\tpublic isnap_target\n{\npublic:\n\texplicit_snap_target(const std::string& Label, const k3d::point3& Position);\n\texplicit_snap_target(const std::string& Label, const k3d::point3& Position, const k3d::vector3& Look, const k3d::vector3& Up);\n\t\n\tvoid add_group(const std::string& Group);\n\t\n\tconst std::string label();\n\tconst groups_t groups();\n\tbool target_position(const point3& Position, point3& TargetPosition);\n\tbool target_orientation(const point3& Position, vector3& TargetLook, vector3& TargetUp);\n\n\tstd::string m_label;\n\tk3d::point3 m_position;\n\tstd::unique_ptr<k3d::vector3> m_look;\n\tstd::unique_ptr<k3d::vector3> m_up;\n\tgroups_t m_groups;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_EXPLICIT_SNAP_TARGET_H\n\n"
  },
  {
    "path": "k3dsdk/expression/CMakeLists.txt",
    "content": "PROJECT(k3dsdk-expression)\n\nFILE(GLOB HEADERS *.h)\nFILE(GLOB SOURCES *.cpp)\n\nLIST(SORT HEADERS)\nLIST(SORT SOURCES)\n\nINCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\n\nK3D_ADD_LIBRARY(k3dsdk-expression SHARED ${HEADERS} ${SOURCES})\nK3D_GENERATE_DEF_FILE(k3dsdk-expression)\n\nTARGET_LINK_LIBRARIES(k3dsdk-expression k3dsdk)\n\nINSTALL(TARGETS k3dsdk-expression\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\n"
  },
  {
    "path": "k3dsdk/expression/basic_parser.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/expression/basic_parser.h>\n#include <k3dsdk/expression/fparser.h>\n#include <k3dsdk/result.h>\n\nnamespace k3d\n{\n\nnamespace expression\n{\n\nclass basic_parser::implementation\n{\npublic:\n\tFunctionParser basic_parser;\n};\n\nbasic_parser::basic_parser() :\n\tm_implementation(new implementation())\n{\n}\n\nbasic_parser::~basic_parser()\n{\n\tdelete m_implementation;\n}\n\nvoid basic_parser::add_constant(const std::string& Name, double_t Value)\n{\n\treturn_if_fail(m_implementation->basic_parser.AddConstant(Name, Value));\n}\n\nvoid basic_parser::add_function(const std::string& Name, FunctionPtr Function, uint8_t ParameterCount)\n{\n\treturn_if_fail(m_implementation->basic_parser.AddFunction(Name, Function, ParameterCount));\n}\n\nbool_t basic_parser::parse(const std::string& Function, const std::string& Variables)\n{\n\treturn m_implementation->basic_parser.Parse(Function, Variables) <= -1;\n}\n\nconst std::string basic_parser::last_parse_error()\n{\n\treturn m_implementation->basic_parser.ErrorMsg() ? m_implementation->basic_parser.ErrorMsg() : \"\";\n}\n\nvoid basic_parser::optimize()\n{\n\tm_implementation->basic_parser.Optimize();\n}\n\ndouble_t basic_parser::evaluate(const double_t* Variables)\n{\n\treturn m_implementation->basic_parser.Eval(Variables);\n}\n\n} // namespace expression\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/expression/basic_parser.h",
    "content": "#ifndef K3DSDK_EXPRESSION_BASIC_PARSER_H\n#define K3DSDK_EXPRESSION_BASIC_PARSER_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace expression\n{\n\n/// Provides a parser that can execute functions with C-like syntax, returning a double result\n/** \\note The implementation is provided by http://iki.fi/warp/FunctionParser */\nclass basic_parser\n{\npublic:\n\tbasic_parser();\n\t~basic_parser();\n\n\t/// Adds a named constant that can be used in expressions\n\tvoid add_constant(const std::string& Name, double_t Value);\n\n\ttypedef double_t (*FunctionPtr)(const double_t*);\n\t/// Adds a function that can be used in expressions\n\tvoid add_function(const std::string& Name, FunctionPtr Function, uint8_t ParameterCount);\n\n\t/// Parse an expression, returning true on success, otherwise false.\n\t/// If parsing fails, Error will contain a human-readable string describing the reason.\n\tbool_t parse(const std::string& Function, const std::string& Variables);\n\t/// Returns a human-readable string describing the most recent parse error\n\tconst std::string last_parse_error();\n\n\t/// Run an optimizer on the currently parsed expression, for (potentially) faster execution\n\tvoid optimize();\n\n\t/// Evaluate the expression with the given variable values, returning the result\n\tdouble_t evaluate(const double_t* Variables);\n\n\nprivate:\n\tbasic_parser(const basic_parser&);\n\tbasic_parser& operator=(const basic_parser&);\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace expression\n\n} // namespace k3d\n\n#endif // !K3DSDK_EXPRESSION_BASIC_PARSER_H\n\n"
  },
  {
    "path": "k3dsdk/expression/fparser.cpp",
    "content": "//==============================\n// Function parser v2.8 by Warp\n//==============================\n// =============================================================================\n//   Usage license:\n// =============================================================================\n// \n// Copyright © 2003-2005 Juha Nieminen, Joel Yliluoma\n// \n//   This library is distributed under two distinct usage licenses depending\n// on the software (\"Software\" below) which uses the Function Parser library\n// (\"Library\" below).\n//   The reason for having two distinct usage licenses is to make the library\n// compatible with the GPL license while still being usable in other non-GPL\n// (even commercial) software. See fparser_license.txt for more details.\n\n#include \"fparser.h\"\n#include \"fpconfig.h\"\n#include \"fptypes.h\"\nusing namespace FUNCTIONPARSERTYPES;\n\n#include <cstdlib>\n#include <cstring>\n#include <cctype>\n#include <cmath>\n\nusing namespace std;\n\n#ifndef M_PI\n#define M_PI 3.1415926535897932384626433832795\n#endif\n\nnamespace\n{\n    const unsigned FUNC_AMOUNT = sizeof(Functions)/sizeof(Functions[0]);\n\n\n    // BCB4 does not implement the standard lower_bound function.\n    // This is used instead:\n    const FuncDefinition* fp_lower_bound(const FuncDefinition* first,\n                                         const FuncDefinition* last,\n                                         const FuncDefinition& value)\n    {\n        while(first < last)\n        {\n            const FuncDefinition* middle = first+(last-first)/2;\n            if(*middle < value) first = middle+1;\n            else last = middle;\n        }\n        return last;\n    }\n\n\n    // Returns a pointer to the FuncDefinition instance which 'name' is\n    // the same as the one given by 'F'. If no such function name exists,\n    // returns 0.\n    inline const FuncDefinition* FindFunction(const char* F)\n    {\n        FuncDefinition func = { F, 0, 0, 0 };\n        while(isalnum(F[func.nameLength])) ++func.nameLength;\n        if(func.nameLength)\n        {\n            const FuncDefinition* found =\n                fp_lower_bound(Functions, Functions+FUNC_AMOUNT, func);\n            if(found == Functions+FUNC_AMOUNT || func < *found)\n                return 0;\n            return found;\n        }\n        return 0;\n    }\n}\n\n\n//---------------------------------------------------------------------------\n// Copy-on-write method\n//---------------------------------------------------------------------------\nvoid FunctionParser::copyOnWrite()\n{\n    if(data->referenceCounter > 1)\n    {\n        Data* oldData = data;\n        data = new Data(*oldData);\n        --(oldData->referenceCounter);\n        data->referenceCounter = 1;\n    }\n}\n\n\n//---------------------------------------------------------------------------\n// Constructors and destructors\n//---------------------------------------------------------------------------\n//===========================================================================\nFunctionParser::FunctionParser():\n    parseErrorType(FP_NO_ERROR), evalErrorType(0),\n    data(new Data),\n    evalRecursionLevel(0)\n{\n    data->referenceCounter = 1;\n}\n\nFunctionParser::~FunctionParser()\n{\n    if(--(data->referenceCounter) == 0)\n    {\n        delete data;\n    }\n}\n\nFunctionParser::FunctionParser(const FunctionParser& cpy):\n    parseErrorType(cpy.parseErrorType),\n    evalErrorType(cpy.evalErrorType),\n    data(cpy.data),\n    evalRecursionLevel(0)\n{\n    ++(data->referenceCounter);\n}\n\nFunctionParser& FunctionParser::operator=(const FunctionParser& cpy)\n{\n    if(data != cpy.data)\n    {\n        if(--(data->referenceCounter) == 0) delete data;\n\n        parseErrorType = cpy.parseErrorType;\n        evalErrorType = cpy.evalErrorType;\n        data = cpy.data;\n        evalRecursionLevel = cpy.evalRecursionLevel;\n\n        ++(data->referenceCounter);\n    }\n\n    return *this;\n}\n\n\nFunctionParser::Data::Data():\n    useDegreeConversion(false),\n    ByteCode(0), ByteCodeSize(0),\n    Immed(0), ImmedSize(0),\n    Stack(0), StackSize(0)\n{}\n\nFunctionParser::Data::~Data()\n{\n    if(ByteCode) { delete[] ByteCode; ByteCode=0; }\n    if(Immed) { delete[] Immed; Immed=0; }\n    if(Stack) { delete[] Stack; Stack=0; }\n}\n\n// Makes a deep-copy of Data:\nFunctionParser::Data::Data(const Data& cpy):\n    varAmount(cpy.varAmount), useDegreeConversion(cpy.useDegreeConversion),\n    Variables(cpy.Variables), Constants(cpy.Constants),\n    FuncPtrNames(cpy.FuncPtrNames), FuncPtrs(cpy.FuncPtrs),\n    FuncParserNames(cpy.FuncParserNames), FuncParsers(cpy.FuncParsers),\n    ByteCode(0), ByteCodeSize(cpy.ByteCodeSize),\n    Immed(0), ImmedSize(cpy.ImmedSize),\n    Stack(0), StackSize(cpy.StackSize)\n{\n    if(ByteCodeSize) ByteCode = new unsigned[ByteCodeSize];\n    if(ImmedSize) Immed = new double[ImmedSize];\n    if(StackSize) Stack = new double[StackSize];\n\n    for(unsigned i=0; i<ByteCodeSize; ++i) ByteCode[i] = cpy.ByteCode[i];\n    for(unsigned i=0; i<ImmedSize; ++i) Immed[i] = cpy.Immed[i];\n\n    // No need to copy the stack contents because it's obsolete outside Eval()\n}\n\n\n//---------------------------------------------------------------------------\n// Function parsing\n//---------------------------------------------------------------------------\n//===========================================================================\nnamespace\n{\n    // Error messages returned by ErrorMsg():\n    const char* ParseErrorMessage[]=\n    {\n        \"Syntax error\",                             // 0\n        \"Mismatched parenthesis\",                   // 1\n        \"Missing ')'\",                              // 2\n        \"Empty parentheses\",                        // 3\n        \"Syntax error: Operator expected\",          // 4\n        \"Not enough memory\",                        // 5\n        \"An unexpected error occurred. Please make a full bug report \"\n        \"to the author\",                            // 6\n        \"Syntax error in parameter 'Vars' given to \"\n        \"FunctionParser::Parse()\",                  // 7\n        \"Illegal number of parameters to function\", // 8\n        \"Syntax error: Premature end of string\",    // 9\n        \"Syntax error: Expecting ( after function\", // 10\n        \"\"\n    };\n\n\n    // Parse variables\n    bool ParseVars(const string& Vars, map<string, unsigned>& dest)\n    {\n        unsigned varNumber = VarBegin;\n        unsigned ind1 = 0, ind2;\n\n        while(ind1 < Vars.size())\n        {\n            if(!isalpha(Vars[ind1]) && Vars[ind1]!='_') return false;\n            for(ind2=ind1+1; ind2<Vars.size() && Vars[ind2]!=','; ++ind2)\n                if(!isalnum(Vars[ind2]) && Vars[ind2]!='_') return false;\n            const string varName = Vars.substr(ind1, ind2-ind1);\n\n            if(dest.insert(make_pair(varName, varNumber++)).second == false)\n                return false;\n\n            ind1 = ind2+1;\n        }\n        return true;\n    }\n}\n\nbool FunctionParser::isValidName(const std::string& name) const\n{\n    if(name.empty() || (!isalpha(name[0]) && name[0] != '_')) return false;\n    for(unsigned i=0; i<name.size(); ++i)\n        if(!isalnum(name[i]) && name[i] != '_') return false;\n\n    if(FindFunction(name.c_str())) return false;\n\n    return true;\n}\n\n\n// Constants:\nbool FunctionParser::AddConstant(const string& name, double value)\n{\n    if(isValidName(name))\n    {\n        const char* n = name.c_str();\n        if(FindVariable(n, data->FuncParserNames) !=\n           data->FuncParserNames.end() ||\n           FindVariable(n, data->FuncPtrNames) !=\n           data->FuncPtrNames.end())\n            return false;\n\n        copyOnWrite();\n\n        data->Constants[name] = value;\n        return true;\n    }\n    return false;\n}\n\n// Function pointers\nbool FunctionParser::AddFunction(const std::string& name,\n                                 FunctionPtr func, unsigned paramsAmount)\n{\n    if(isValidName(name))\n    {\n        const char* n = name.c_str();\n        if(FindVariable(n, data->FuncParserNames) !=\n           data->FuncParserNames.end() ||\n           FindConstant(n) != data->Constants.end())\n            return false;\n\n        copyOnWrite();\n\n        data->FuncPtrNames[name] = data->FuncPtrs.size();\n        data->FuncPtrs.push_back(Data::FuncPtrData(func, paramsAmount));\n        return true;\n    }\n    return false;\n}\n\nbool FunctionParser::checkRecursiveLinking(const FunctionParser* fp) const\n{\n    if(fp == this) return true;\n    for(unsigned i=0; i<fp->data->FuncParsers.size(); ++i)\n        if(checkRecursiveLinking(fp->data->FuncParsers[i])) return true;\n    return false;\n}\n\nbool FunctionParser::AddFunction(const std::string& name,\n                                 FunctionParser& parser)\n{\n    if(isValidName(name))\n    {\n        const char* n = name.c_str();\n        if(FindVariable(n, data->FuncPtrNames) != data->FuncPtrNames.end() ||\n           FindConstant(n) != data->Constants.end())\n            return false;\n\n        if(checkRecursiveLinking(&parser)) return false;\n\n        copyOnWrite();\n\n        data->FuncParserNames[name] = data->FuncParsers.size();\n        data->FuncParsers.push_back(&parser);\n        return true;\n    }\n    return false;\n}\n\n\n\n// Main parsing function\n// ---------------------\nint FunctionParser::Parse(const std::string& Function,\n                          const std::string& Vars,\n                          bool useDegrees)\n{\n    copyOnWrite();\n\n    data->Variables.clear();\n\n    if(!ParseVars(Vars, data->Variables))\n    {\n        parseErrorType = INVALID_VARS;\n        return Function.size();\n    }\n    data->varAmount = data->Variables.size(); // this is for Eval()\n\n    const char* Func = Function.c_str();\n\n    parseErrorType = FP_NO_ERROR;\n\n    int Result = CheckSyntax(Func);\n    if(Result>=0) return Result;\n\n    data->useDegreeConversion = useDegrees;\n    if(!Compile(Func)) return Function.size();\n\n    data->Variables.clear();\n\n    parseErrorType = FP_NO_ERROR;\n    return -1;\n}\n\nnamespace\n{\n    const char* const fpOperators[] =\n    {\n        \"+\", \"-\", \"*\", \"/\", \"%\", \"^\",\n        \"=\", \"!=\", \"<=\", \"<\", \">=\", \">\", \"&\", \"|\",\n        0\n    };\n\n    // Is given char an operator?\n    // (Returns 0 if not, else the size of the operator)\n    inline int IsOperator(const char* F)\n    {\n        for(unsigned opInd = 0; fpOperators[opInd]; ++opInd)\n        {\n            const char* op = fpOperators[opInd];\n            for(unsigned n = 0; F[n] == *op; ++n)\n            {\n                ++op;\n                if(*op == 0) return op-fpOperators[opInd];\n            }\n        }\n        return 0;\n    }\n\n    // skip whitespace\n    inline void sws(const char* F, int& Ind)\n    {\n        while(F[Ind] && isspace(F[Ind])) ++Ind;\n    }\n}\n\n// Returns an iterator to the variable with the same name as 'F', or to\n// Variables.end() if no such variable exists:\ninline FunctionParser::Data::VarMap_t::const_iterator\nFunctionParser::FindVariable(const char* F, const Data::VarMap_t& vars) const\n{\n    if(vars.size())\n    {\n        unsigned ind = 0;\n        while(isalnum(F[ind]) || F[ind] == '_') ++ind;\n        if(ind)\n        {\n            string name(F, ind);\n            return vars.find(name);\n        }\n    }\n    return vars.end();\n}\n\ninline FunctionParser::Data::ConstMap_t::const_iterator\nFunctionParser::FindConstant(const char* F) const\n{\n    if(data->Constants.size())\n    {\n        unsigned ind = 0;\n        while(isalnum(F[ind]) || F[ind] == '_') ++ind;\n        if(ind)\n        {\n            string name(F, ind);\n            return data->Constants.find(name);\n        }\n    }\n    return data->Constants.end();\n}\n\n//---------------------------------------------------------------------------\n// Check function string syntax\n// ----------------------------\nint FunctionParser::CheckSyntax(const char* Function)\n{\n    const Data::VarMap_t& Variables = data->Variables;\n    const Data::ConstMap_t& Constants = data->Constants;\n    const Data::VarMap_t& FuncPtrNames = data->FuncPtrNames;\n    const Data::VarMap_t& FuncParserNames = data->FuncParserNames;\n\n    vector<int> functionParenthDepth;\n\n    int Ind=0, ParenthCnt=0, c;\n    char* Ptr;\n\n    while(true)\n    {\n        sws(Function, Ind);\n        c=Function[Ind];\n\n// Check for valid operand (must appear)\n\n        // Check for leading - or !\n        if(c=='-' || c=='!') { sws(Function, ++Ind); c=Function[Ind]; }\n        if(c==0) { parseErrorType=PREMATURE_EOS; return Ind; }\n\n        // Check for math function\n        bool foundFunc = false;\n        const FuncDefinition* fptr = FindFunction(&Function[Ind]);\n        if(fptr)\n        {\n            Ind += fptr->nameLength;\n            foundFunc = true;\n        }\n        else\n        {\n            // Check for user-defined function\n            Data::VarMap_t::const_iterator fIter =\n                FindVariable(&Function[Ind], FuncPtrNames);\n            if(fIter != FuncPtrNames.end())\n            {\n                Ind += fIter->first.size();\n                foundFunc = true;\n            }\n            else\n            {\n                Data::VarMap_t::const_iterator pIter =\n                    FindVariable(&Function[Ind], FuncParserNames);\n                if(pIter != FuncParserNames.end())\n                {\n                    Ind += pIter->first.size();\n                    foundFunc = true;\n                }\n            }\n        }\n\n        if(foundFunc)\n        {\n            sws(Function, Ind);\n            c = Function[Ind];\n            if(c!='(') { parseErrorType=EXPECT_PARENTH_FUNC; return Ind; }\n\n            int Ind2 = Ind+1;\n            sws(Function, Ind2);\n            if(Function[Ind2] == ')')\n            {\n                Ind = Ind2+1;\n                sws(Function, Ind);\n                c = Function[Ind];\n                // Ugly, but other methods would just be uglier...\n                goto CheckOperator;\n            }\n\n            functionParenthDepth.push_back(ParenthCnt+1);\n        }\n\n        // Check for opening parenthesis\n        if(c=='(')\n        {\n            ++ParenthCnt;\n            sws(Function, ++Ind);\n            if(Function[Ind]==')') { parseErrorType=EMPTY_PARENTH; return Ind;}\n            continue;\n        }\n\n        // Check for number\n        if(isdigit(c) || (c=='.' && isdigit(Function[Ind+1])))\n        {\n            strtod(&Function[Ind], &Ptr);\n            Ind += int(Ptr-&Function[Ind]);\n            sws(Function, Ind);\n            c = Function[Ind];\n        }\n        else\n        { // Check for variable\n            Data::VarMap_t::const_iterator vIter =\n                FindVariable(&Function[Ind], Variables);\n            if(vIter != Variables.end())\n                Ind += vIter->first.size();\n            else\n            {\n                // Check for constant\n                Data::ConstMap_t::const_iterator cIter =\n                    FindConstant(&Function[Ind]);\n                if(cIter != Constants.end())\n                    Ind += cIter->first.size();\n                else\n                { parseErrorType=SYNTAX_ERROR; return Ind; }\n            }\n            sws(Function, Ind);\n            c = Function[Ind];\n        }\n\n        // Check for closing parenthesis\n        while(c==')')\n        {\n            if(functionParenthDepth.size() &&\n               functionParenthDepth.back() == ParenthCnt)\n                functionParenthDepth.pop_back();\n            if((--ParenthCnt)<0) { parseErrorType=MISM_PARENTH; return Ind; }\n            sws(Function, ++Ind);\n            c=Function[Ind];\n        }\n\n// If we get here, we have a legal operand and now a legal operator or\n// end of string must follow\n\n    CheckOperator:\n        // Check for EOS\n        if(c==0) break; // The only way to end the checking loop without error\n\n        // Check for operator\n        int opSize = 0;\n        if(c == ',' && !functionParenthDepth.empty() &&\n           functionParenthDepth.back() == ParenthCnt)\n            opSize = 1;\n        else\n            opSize = IsOperator(Function+Ind);\n        if(opSize == 0)\n        { parseErrorType=EXPECT_OPERATOR; return Ind; }\n\n// If we get here, we have an operand and an operator; the next loop will\n// check for another operand (must appear)\n        Ind += opSize;\n    } // while\n\n    // Check that all opened parentheses are also closed\n    if(ParenthCnt>0) { parseErrorType=MISSING_PARENTH; return Ind; }\n\n// The string is ok\n    parseErrorType=FP_NO_ERROR;\n    return -1;\n}\n\n\n// Compile function string to bytecode\n// -----------------------------------\nbool FunctionParser::Compile(const char* Function)\n{\n    if(data->ByteCode) { delete[] data->ByteCode; data->ByteCode=0; }\n    if(data->Immed) { delete[] data->Immed; data->Immed=0; }\n    if(data->Stack) { delete[] data->Stack; data->Stack=0; }\n\n    vector<unsigned> byteCode; byteCode.reserve(1024);\n    tempByteCode = &byteCode;\n\n    vector<double> immed; immed.reserve(1024);\n    tempImmed = &immed;\n\n    data->StackSize = StackPtr = 0;\n\n    CompileExpression(Function, 0);\n    if(parseErrorType != FP_NO_ERROR) return false;\n\n    data->ByteCodeSize = byteCode.size();\n    data->ImmedSize = immed.size();\n\n    if(data->ByteCodeSize)\n    {\n        data->ByteCode = new unsigned[data->ByteCodeSize];\n        memcpy(data->ByteCode, &byteCode[0],\n               sizeof(unsigned)*data->ByteCodeSize);\n    }\n    if(data->ImmedSize)\n    {\n        data->Immed = new double[data->ImmedSize];\n        memcpy(data->Immed, &immed[0],\n               sizeof(double)*data->ImmedSize);\n    }\n    if(data->StackSize)\n        data->Stack = new double[data->StackSize];\n\n    return true;\n}\n\n\ninline void FunctionParser::AddCompiledByte(unsigned c)\n{\n    tempByteCode->push_back(c);\n}\n\ninline void FunctionParser::AddImmediate(double i)\n{\n    tempImmed->push_back(i);\n}\n\ninline void FunctionParser::AddFunctionOpcode(unsigned opcode)\n{\n    if(data->useDegreeConversion)\n        switch(opcode)\n        {\n          case cCos:\n          case cCosh:\n          case cCot:\n          case cCsc:\n          case cSec:\n          case cSin:\n          case cSinh:\n          case cTan:\n          case cTanh:\n              AddCompiledByte(cRad);\n        }\n\n    AddCompiledByte(opcode);\n\n    if(data->useDegreeConversion)\n        switch(opcode)\n        {\n          case cAcos:\n#ifndef NO_ASINH\n          case cAcosh:\n          case cAsinh:\n          case cAtanh:\n#endif\n          case cAsin:\n          case cAtan:\n          case cAtan2:\n              AddCompiledByte(cDeg);\n        }\n}\n\ninline void FunctionParser::incStackPtr()\n{\n    if(++StackPtr > data->StackSize) ++(data->StackSize);\n}\n\n\n// Compile if()\nint FunctionParser::CompileIf(const char* F, int ind)\n{\n    int ind2 = CompileExpression(F, ind, true); // condition\n    sws(F, ind2);\n    if(F[ind2] != ',') { parseErrorType=ILL_PARAMS_AMOUNT; return ind2; }\n    AddCompiledByte(cIf);\n    unsigned curByteCodeSize = tempByteCode->size();\n    AddCompiledByte(0); // Jump index; to be set later\n    AddCompiledByte(0); // Immed jump index; to be set later\n\n    --StackPtr;\n\n    ind2 = CompileExpression(F, ind2+1, true); // then\n    sws(F, ind2);\n    if(F[ind2] != ',') { parseErrorType=ILL_PARAMS_AMOUNT; return ind2; }\n    AddCompiledByte(cJump);\n    unsigned curByteCodeSize2 = tempByteCode->size();\n    unsigned curImmedSize2 = tempImmed->size();\n    AddCompiledByte(0); // Jump index; to be set later\n    AddCompiledByte(0); // Immed jump index; to be set later\n\n    --StackPtr;\n\n    ind2 = CompileExpression(F, ind2+1, true); // else\n    sws(F, ind2);\n    if(F[ind2] != ')') { parseErrorType=ILL_PARAMS_AMOUNT; return ind2; }\n\n    // Set jump indices\n    (*tempByteCode)[curByteCodeSize] = curByteCodeSize2+1;\n    (*tempByteCode)[curByteCodeSize+1] = curImmedSize2;\n    (*tempByteCode)[curByteCodeSize2] = tempByteCode->size()-1;\n    (*tempByteCode)[curByteCodeSize2+1] = tempImmed->size();\n\n    return ind2+1;\n}\n\nint FunctionParser::CompileFunctionParams(const char* F, int ind,\n                                          unsigned requiredParams)\n{\n    int ind2 = ind;\n    if(requiredParams > 0)\n    {\n        unsigned curStackPtr = StackPtr;\n        ind2 = CompileExpression(F, ind);\n\n        if(StackPtr != curStackPtr+requiredParams)\n        { parseErrorType=ILL_PARAMS_AMOUNT; return ind; }\n\n        StackPtr -= requiredParams - 1;\n    }\n    else\n    {\n        incStackPtr();\n    }\n\n    sws(F, ind2);\n    return ind2+1; // F[ind2] is ')'\n}\n\n// Compiles element\nint FunctionParser::CompileElement(const char* F, int ind)\n{\n    sws(F, ind);\n    char c = F[ind];\n\n    if(c == '(')\n    {\n        ind = CompileExpression(F, ind+1);\n        sws(F, ind);\n        return ind+1; // F[ind] is ')'\n    }\n\n    if(isdigit(c) || c=='.' /*|| c=='-'*/) // Number\n    {\n        const char* startPtr = &F[ind];\n        char* endPtr;\n        double val = strtod(startPtr, &endPtr);\n        AddImmediate(val);\n        AddCompiledByte(cImmed);\n        incStackPtr();\n        return ind+(endPtr-startPtr);\n    }\n\n    if(isalpha(c) || c == '_') // Function, variable or constant\n    {\n        const FuncDefinition* func = FindFunction(F+ind);\n        if(func) // is function\n        {\n            int ind2 = ind + func->nameLength;\n            sws(F, ind2); // F[ind2] is '('\n            if(strcmp(func->name, \"if\") == 0) // \"if\" is a special case\n            {\n                return CompileIf(F, ind2+1);\n            }\n\n#ifndef DISABLE_EVAL\n            unsigned requiredParams =\n                strcmp(func->name, \"eval\") == 0 ?\n                data->Variables.size() : func->params;\n#else\n            unsigned requiredParams = func->params;\n#endif\n            ind2 = CompileFunctionParams(F, ind2+1, requiredParams);\n            AddFunctionOpcode(func->opcode);\n            return ind2; // F[ind2-1] is ')'\n        }\n\n        Data::VarMap_t::const_iterator vIter =\n            FindVariable(F+ind, data->Variables);\n        if(vIter != data->Variables.end()) // is variable\n        {\n            AddCompiledByte(vIter->second);\n            incStackPtr();\n            return ind + vIter->first.size();\n        }\n\n        Data::ConstMap_t::const_iterator cIter = FindConstant(F+ind);\n        if(cIter != data->Constants.end()) // is constant\n        {\n            AddImmediate(cIter->second);\n            AddCompiledByte(cImmed);\n            incStackPtr();\n            return ind + cIter->first.size();\n        }\n\n        Data::VarMap_t::const_iterator fIter =\n            FindVariable(F+ind, data->FuncPtrNames);\n        if(fIter != data->FuncPtrNames.end()) // is user-defined func pointer\n        {\n            unsigned index = fIter->second;\n\n            int ind2 = ind + fIter->first.length();\n            sws(F, ind2); // F[ind2] is '('\n\n            ind2 = CompileFunctionParams(F, ind2+1,\n                                         data->FuncPtrs[index].params);\n\n            AddCompiledByte(cFCall);\n            AddCompiledByte(index);\n            return ind2;\n        }\n\n        Data::VarMap_t::const_iterator pIter =\n            FindVariable(F+ind, data->FuncParserNames);\n        if(pIter != data->FuncParserNames.end()) // is user-defined func parser\n        {\n            unsigned index = pIter->second;\n\n            int ind2 = ind + pIter->first.length();\n            sws(F, ind2); // F[ind2] is '('\n\n            ind2 = CompileFunctionParams\n                (F, ind2+1, data->FuncParsers[index]->data->varAmount);\n\n            AddCompiledByte(cPCall);\n            AddCompiledByte(index);\n            return ind2;\n        }\n    }\n\n    parseErrorType = UNEXPECTED_ERROR;\n    return ind;\n}\n\n// Compiles '^'\nint FunctionParser::CompilePow(const char* F, int ind)\n{\n    int ind2 = CompileElement(F, ind);\n    sws(F, ind2);\n\n    while(F[ind2] == '^')\n    {\n        ind2 = CompileUnaryMinus(F, ind2+1);\n        sws(F, ind2);\n        AddCompiledByte(cPow);\n        --StackPtr;\n    }\n\n    return ind2;\n}\n\n// Compiles unary '-'\nint FunctionParser::CompileUnaryMinus(const char* F, int ind)\n{\n    sws(F, ind);\n    if(F[ind] == '-' || F[ind] == '!')\n    {\n        int ind2 = ind+1;\n        sws(F, ind2);\n        ind2 = CompilePow(F, ind2);\n        sws(F, ind2);\n\n        // if we are negating a constant, negate the constant itself:\n        if(F[ind] == '-' && tempByteCode->back() == cImmed)\n            tempImmed->back() = -tempImmed->back();\n\n        // if we are negating a negation, we can remove both:\n        else if((F[ind] == '-' && tempByteCode->back() == cNeg))\n            tempByteCode->pop_back();\n\n        else\n            AddCompiledByte(F[ind] == '-' ? cNeg : cNot);\n\n        return ind2;\n    }\n\n    int ind2 = CompilePow(F, ind);\n    sws(F, ind2);\n    return ind2;\n}\n\n// Compiles '*', '/' and '%'\nint FunctionParser::CompileMult(const char* F, int ind)\n{\n    int ind2 = CompileUnaryMinus(F, ind);\n    sws(F, ind2);\n    char op;\n\n    while((op = F[ind2]) == '*' || op == '/' || op == '%')\n    {\n        ind2 = CompileUnaryMinus(F, ind2+1);\n        sws(F, ind2);\n        switch(op)\n        {\n          case '*': AddCompiledByte(cMul); break;\n          case '/': AddCompiledByte(cDiv); break;\n          case '%': AddCompiledByte(cMod); break;\n        }\n        --StackPtr;\n    }\n\n    return ind2;\n}\n\n// Compiles '+' and '-'\nint FunctionParser::CompileAddition(const char* F, int ind)\n{\n    int ind2 = CompileMult(F, ind);\n    sws(F, ind2);\n    char op;\n\n    while((op = F[ind2]) == '+' || op == '-')\n    {\n        ind2 = CompileMult(F, ind2+1);\n        sws(F, ind2);\n        AddCompiledByte(op=='+' ? cAdd : cSub);\n        --StackPtr;\n    }\n\n    return ind2;\n}\n\n// Compiles '=', '<' and '>'\nint FunctionParser::CompileComparison(const char* F, int ind)\n{\n    int ind2 = CompileAddition(F, ind);\n    sws(F, ind2);\n    char op;\n\n    while((op = F[ind2]) == '=' || op == '<' || op == '>' || op == '!')\n    {\n        int opSize = (F[ind2+1] == '=' ? 2 : 1);\n        ind2 = CompileAddition(F, ind2+opSize);\n        sws(F, ind2);\n        switch(op)\n        {\n          case '=':\n              AddCompiledByte(cEqual); break;\n          case '<':\n              AddCompiledByte(opSize == 1 ? cLess : cLessOrEq); break;\n          case '>':\n              AddCompiledByte(opSize == 1 ? cGreater : cGreaterOrEq); break;\n          case '!':\n              AddCompiledByte(cNEqual); break;\n        }\n        --StackPtr;\n    }\n\n    return ind2;\n}\n\n// Compiles '&'\nint FunctionParser::CompileAnd(const char* F, int ind)\n{\n    int ind2 = CompileComparison(F, ind);\n    sws(F, ind2);\n\n    while(F[ind2] == '&')\n    {\n        ind2 = CompileComparison(F, ind2+1);\n        sws(F, ind2);\n        AddCompiledByte(cAnd);\n        --StackPtr;\n    }\n\n    return ind2;\n}\n\n// Compiles '|'\nint FunctionParser::CompileOr(const char* F, int ind)\n{\n    int ind2 = CompileAnd(F, ind);\n    sws(F, ind2);\n\n    while(F[ind2] == '|')\n    {\n        ind2 = CompileAnd(F, ind2+1);\n        sws(F, ind2);\n        AddCompiledByte(cOr);\n        --StackPtr;\n    }\n\n    return ind2;\n}\n\n// Compiles ','\nint FunctionParser::CompileExpression(const char* F, int ind, bool stopAtComma)\n{\n    int ind2 = CompileOr(F, ind);\n    sws(F, ind2);\n\n    if(stopAtComma) return ind2;\n\n    while(F[ind2] == ',')\n    {\n        ind2 = CompileOr(F, ind2+1);\n        sws(F, ind2);\n    }\n\n    return ind2;\n}\n\n\n// Return parse error message\n// --------------------------\nconst char* FunctionParser::ErrorMsg() const\n{\n    if(parseErrorType != FP_NO_ERROR) return ParseErrorMessage[parseErrorType];\n    return 0;\n}\n\n//---------------------------------------------------------------------------\n// Function evaluation\n//---------------------------------------------------------------------------\n//===========================================================================\nnamespace\n{\n    inline int doubleToInt(double d)\n    {\n        return d<0 ? -int((-d)+.5) : int(d+.5);\n    }\n\n    inline double Min(double d1, double d2)\n    {\n        return d1<d2 ? d1 : d2;\n    }\n    inline double Max(double d1, double d2)\n    {\n        return d1>d2 ? d1 : d2;\n    }\n\n\n    inline double DegreesToRadians(double degrees)\n    {\n        return degrees*(M_PI/180.0);\n    }\n    inline double RadiansToDegrees(double radians)\n    {\n        return radians*(180.0/M_PI);\n    }\n}\n\ndouble FunctionParser::Eval(const double* Vars)\n{\n    const unsigned* const ByteCode = data->ByteCode;\n    const double* const Immed = data->Immed;\n    double* const Stack = data->Stack;\n    const unsigned ByteCodeSize = data->ByteCodeSize;\n    unsigned IP, DP=0;\n    int SP=-1;\n\n    for(IP=0; IP<ByteCodeSize; ++IP)\n    {\n        switch(ByteCode[IP])\n        {\n// Functions:\n          case   cAbs: Stack[SP] = fabs(Stack[SP]); break;\n          case  cAcos: if(Stack[SP] < -1 || Stack[SP] > 1)\n                       { evalErrorType=4; return 0; }\n                       Stack[SP] = acos(Stack[SP]); break;\n#ifndef NO_ASINH\n          case cAcosh: Stack[SP] = acosh(Stack[SP]); break;\n#endif\n          case  cAsin: if(Stack[SP] < -1 || Stack[SP] > 1)\n                       { evalErrorType=4; return 0; }\n                       Stack[SP] = asin(Stack[SP]); break;\n#ifndef NO_ASINH\n          case cAsinh: Stack[SP] = asinh(Stack[SP]); break;\n#endif\n          case  cAtan: Stack[SP] = atan(Stack[SP]); break;\n          case cAtan2: Stack[SP-1] = atan2(Stack[SP-1], Stack[SP]);\n                       --SP; break;\n#ifndef NO_ASINH\n          case cAtanh: Stack[SP] = atanh(Stack[SP]); break;\n#endif\n          case  cCeil: Stack[SP] = ceil(Stack[SP]); break;\n          case   cCos: Stack[SP] = cos(Stack[SP]); break;\n          case  cCosh: Stack[SP] = cosh(Stack[SP]); break;\n\n          case   cCot:\n              {\n                  double t = tan(Stack[SP]);\n                  if(t == 0) { evalErrorType=1; return 0; }\n                  Stack[SP] = 1/t; break;\n              }\n          case   cCsc:\n              {\n                  double s = sin(Stack[SP]);\n                  if(s == 0) { evalErrorType=1; return 0; }\n                  Stack[SP] = 1/s; break;\n              }\n\n\n#ifndef DISABLE_EVAL\n          case  cEval:\n              {\n                  double retVal = 0;\n                  if(evalRecursionLevel == EVAL_MAX_REC_LEVEL)\n                  {\n                      evalErrorType = 5;\n                  }\n                  else\n                  {\n                      data->Stack = new double[data->StackSize];\n                      ++evalRecursionLevel;\n                      retVal = Eval(&Stack[SP-data->varAmount+1]);\n                      --evalRecursionLevel;\n                      delete[] data->Stack;\n                      data->Stack = Stack;\n                  }\n                  SP -= data->varAmount-1;\n                  Stack[SP] = retVal;\n                  break;\n              }\n#endif\n\n          case   cExp: Stack[SP] = exp(Stack[SP]); break;\n          case cFloor: Stack[SP] = floor(Stack[SP]); break;\n\n          case    cIf:\n              {\n                  unsigned jumpAddr = ByteCode[++IP];\n                  unsigned immedAddr = ByteCode[++IP];\n                  if(doubleToInt(Stack[SP]) == 0)\n                  {\n                      IP = jumpAddr;\n                      DP = immedAddr;\n                  }\n                  --SP; break;\n              }\n\n          case   cInt: Stack[SP] = floor(Stack[SP]+.5); break;\n          case   cLog: if(Stack[SP] <= 0) { evalErrorType=3; return 0; }\n                       Stack[SP] = log(Stack[SP]); break;\n          case cLog10: if(Stack[SP] <= 0) { evalErrorType=3; return 0; }\n                       Stack[SP] = log10(Stack[SP]); break;\n          case   cMax: Stack[SP-1] = Max(Stack[SP-1], Stack[SP]);\n                       --SP; break;\n          case   cMin: Stack[SP-1] = Min(Stack[SP-1], Stack[SP]);\n                       --SP; break;\n          case   cSec:\n              {\n                  double c = cos(Stack[SP]);\n                  if(c == 0) { evalErrorType=1; return 0; }\n                  Stack[SP] = 1/c; break;\n              }\n          case   cSin: Stack[SP] = sin(Stack[SP]); break;\n          case  cSinh: Stack[SP] = sinh(Stack[SP]); break;\n          case  cSqrt: if(Stack[SP] < 0) { evalErrorType=2; return 0; }\n                       Stack[SP] = sqrt(Stack[SP]); break;\n          case   cTan: Stack[SP] = tan(Stack[SP]); break;\n          case  cTanh: Stack[SP] = tanh(Stack[SP]); break;\n\n\n// Misc:\n          case cImmed: Stack[++SP] = Immed[DP++]; break;\n          case  cJump: DP = ByteCode[IP+2];\n                       IP = ByteCode[IP+1];\n                       break;\n\n// Operators:\n          case   cNeg: Stack[SP] = -Stack[SP]; break;\n          case   cAdd: Stack[SP-1] += Stack[SP]; --SP; break;\n          case   cSub: Stack[SP-1] -= Stack[SP]; --SP; break;\n          case   cMul: Stack[SP-1] *= Stack[SP]; --SP; break;\n          case   cDiv: if(Stack[SP] == 0) { evalErrorType=1; return 0; }\n                       Stack[SP-1] /= Stack[SP]; --SP; break;\n          case   cMod: if(Stack[SP] == 0) { evalErrorType=1; return 0; }\n                       Stack[SP-1] = fmod(Stack[SP-1], Stack[SP]);\n                       --SP; break;\n          case   cPow: Stack[SP-1] = pow(Stack[SP-1], Stack[SP]);\n                       --SP; break;\n\n#ifdef FP_EPSILON\n          case cEqual: Stack[SP-1] =\n                           (fabs(Stack[SP-1]-Stack[SP]) <= FP_EPSILON);\n                       --SP; break;\n          case cNEqual: Stack[SP-1] =\n                            (fabs(Stack[SP-1] - Stack[SP]) >= FP_EPSILON);\n                       --SP; break;\n          case  cLess: Stack[SP-1] = (Stack[SP-1] < Stack[SP]-FP_EPSILON);\n                       --SP; break;\n          case  cLessOrEq: Stack[SP-1] = (Stack[SP-1] <= Stack[SP]+FP_EPSILON);\n                       --SP; break;\n          case cGreater: Stack[SP-1] = (Stack[SP-1]-FP_EPSILON > Stack[SP]);\n                         --SP; break;\n          case cGreaterOrEq: Stack[SP-1] =\n                                 (Stack[SP-1]+FP_EPSILON >= Stack[SP]);\n                         --SP; break;\n#else\n          case cEqual: Stack[SP-1] = (Stack[SP-1] == Stack[SP]);\n                       --SP; break;\n          case cNEqual: Stack[SP-1] = (Stack[SP-1] != Stack[SP]);\n                       --SP; break;\n          case  cLess: Stack[SP-1] = (Stack[SP-1] < Stack[SP]);\n                       --SP; break;\n          case  cLessOrEq: Stack[SP-1] = (Stack[SP-1] <= Stack[SP]);\n                       --SP; break;\n          case cGreater: Stack[SP-1] = (Stack[SP-1] > Stack[SP]);\n                         --SP; break;\n          case cGreaterOrEq: Stack[SP-1] = (Stack[SP-1] >= Stack[SP]);\n                         --SP; break;\n#endif\n\n          case   cAnd: Stack[SP-1] =\n                           (doubleToInt(Stack[SP-1]) &&\n                            doubleToInt(Stack[SP]));\n                       --SP; break;\n          case    cOr: Stack[SP-1] =\n                           (doubleToInt(Stack[SP-1]) ||\n                            doubleToInt(Stack[SP]));\n                       --SP; break;\n          case   cNot: Stack[SP] = !doubleToInt(Stack[SP]); break;\n\n// Degrees-radians conversion:\n          case   cDeg: Stack[SP] = RadiansToDegrees(Stack[SP]); break;\n          case   cRad: Stack[SP] = DegreesToRadians(Stack[SP]); break;\n\n// User-defined function calls:\n          case cFCall:\n              {\n                  unsigned index = ByteCode[++IP];\n                  unsigned params = data->FuncPtrs[index].params;\n                  double retVal =\n                      data->FuncPtrs[index].ptr(&Stack[SP-params+1]);\n                  SP -= int(params)-1;\n                  Stack[SP] = retVal;\n                  break;\n              }\n\n          case cPCall:\n              {\n                  unsigned index = ByteCode[++IP];\n                  unsigned params = data->FuncParsers[index]->data->varAmount;\n                  double retVal =\n                      data->FuncParsers[index]->Eval(&Stack[SP-params+1]);\n                  SP -= int(params)-1;\n                  Stack[SP] = retVal;\n                  break;\n              }\n\n\n#ifdef SUPPORT_OPTIMIZER\n          case   cVar: break; // Paranoia. These should never exist\n          case   cDup: Stack[SP+1] = Stack[SP]; ++SP; break;\n          case   cInv:\n              if(Stack[SP] == 0.0) { evalErrorType=1; return 0; }\n              Stack[SP] = 1.0/Stack[SP];\n              break;\n#endif\n\n// Variables:\n          default:\n              Stack[++SP] = Vars[ByteCode[IP]-VarBegin];\n        }\n    }\n\n    evalErrorType=0;\n    return Stack[SP];\n}\n\n\n#ifdef FUNCTIONPARSER_SUPPORT_DEBUG_OUTPUT\nnamespace\n{\n    inline void printHex(std::ostream& dest, unsigned n)\n    {\n        dest.width(8); dest.fill('0'); hex(dest); //uppercase(dest);\n        dest << n;\n    }\n}\n\nvoid FunctionParser::PrintByteCode(std::ostream& dest) const\n{\n    const unsigned* const ByteCode = data->ByteCode;\n    const double* const Immed = data->Immed;\n\n    for(unsigned IP=0, DP=0; IP<data->ByteCodeSize; ++IP)\n    {\n        printHex(dest, IP);\n        dest << \": \";\n\n        unsigned opcode = ByteCode[IP];\n\n        switch(opcode)\n        {\n          case cIf:\n              dest << \"jz\\t\";\n              printHex(dest, ByteCode[IP+1]+1);\n              dest << endl;\n              IP += 2;\n              break;\n\n          case cJump:\n              dest << \"jump\\t\";\n              printHex(dest, ByteCode[IP+1]+1);\n              dest << endl;\n              IP += 2;\n              break;\n          case cImmed:\n              dest.precision(10);\n              dest << \"push\\t\" << Immed[DP++] << endl;\n              break;\n\n          case cFCall:\n              {\n                  unsigned index = ByteCode[++IP];\n                  Data::VarMap_t::const_iterator iter =\n                      data->FuncPtrNames.begin();\n                  while(iter->second != index) ++iter;\n                  dest << \"fcall\\t\" << iter->first\n                       << \" (\" << data->FuncPtrs[index].params << \")\" << endl;\n                  break;\n              }\n\n          case cPCall:\n              {\n                  unsigned index = ByteCode[++IP];\n                  Data::VarMap_t::const_iterator iter =\n                      data->FuncParserNames.begin();\n                  while(iter->second != index) ++iter;\n                  dest << \"pcall\\t\" << iter->first\n                       << \" (\" << data->FuncParsers[index]->data->varAmount\n                       << \")\" << endl;\n                  break;\n              }\n\n          default:\n              if(opcode < VarBegin)\n              {\n                  string n;\n                  unsigned params = 1;\n                  switch(opcode)\n                  {\n                    case cNeg: n = \"neg\"; break;\n                    case cAdd: n = \"add\"; break;\n                    case cSub: n = \"sub\"; break;\n                    case cMul: n = \"mul\"; break;\n                    case cDiv: n = \"div\"; break;\n                    case cMod: n = \"mod\"; break;\n                    case cPow: n = \"pow\"; break;\n                    case cEqual: n = \"eq\"; break;\n                    case cNEqual: n = \"neq\"; break;\n                    case cLess: n = \"lt\"; break;\n                    case cLessOrEq: n = \"le\"; break;\n                    case cGreater: n = \"gt\"; break;\n                    case cGreaterOrEq: n = \"ge\"; break;\n                    case cAnd: n = \"and\"; break;\n                    case cOr: n = \"or\"; break;\n                    case cNot: n = \"not\"; break;\n                    case cDeg: n = \"deg\"; break;\n                    case cRad: n = \"rad\"; break;\n\n#ifndef DISABLE_EVAL\n                    case cEval: n = \"call\\t0\"; break;\n#endif\n\n#ifdef SUPPORT_OPTIMIZER\n                    case cVar: n = \"(var)\"; break;\n                    case cDup: n = \"dup\"; break;\n                    case cInv: n = \"inv\"; break;\n#endif\n\n                    default:\n                        n = Functions[opcode-cAbs].name;\n                        params = Functions[opcode-cAbs].params;\n                  }\n                  dest << n;\n                  if(params != 1) dest << \" (\" << params << \")\";\n                  dest << endl;\n              }\n              else\n              {\n                  dest << \"push\\tVar\" << opcode-VarBegin << endl;\n              }\n        }\n    }\n}\n#endif\n\n\n\n\n#ifndef SUPPORT_OPTIMIZER\nvoid FunctionParser::MakeTree(void *) const {}\nvoid FunctionParser::Optimize()\n{\n    // Do nothing if no optimizations are supported.\n}\n#endif\n"
  },
  {
    "path": "k3dsdk/expression/fparser.h",
    "content": "/***************************************************************************\\\n|* Function parser v2.8 by Warp                                            *|\n|* ----------------------------                                            *|\n|* Parses and evaluates the given function with the given variable values. *|\n|* See fparser.txt for details.                                            *|\n|*                                                                         *|\n\\***************************************************************************/\n// =============================================================================\n//   Usage license:\n// =============================================================================\n// \n// Copyright © 2003-2005 Juha Nieminen, Joel Yliluoma\n// \n//   This library is distributed under two distinct usage licenses depending\n// on the software (\"Software\" below) which uses the Function Parser library\n// (\"Library\" below).\n//   The reason for having two distinct usage licenses is to make the library\n// compatible with the GPL license while still being usable in other non-GPL\n// (even commercial) software. See fparser_license.txt for more details.\n\n#ifndef ONCE_FPARSER_H_\n#define ONCE_FPARSER_H_\n\n#include <string>\n#include <map>\n#include <vector>\n\n#ifdef FUNCTIONPARSER_SUPPORT_DEBUG_OUTPUT\n#include <iostream>\n#endif\n\nclass FunctionParser\n{\npublic:\n    enum ParseErrorType\n    {\n        SYNTAX_ERROR=0, MISM_PARENTH, MISSING_PARENTH, EMPTY_PARENTH,\n        EXPECT_OPERATOR, OUT_OF_MEMORY, UNEXPECTED_ERROR, INVALID_VARS,\n        ILL_PARAMS_AMOUNT, PREMATURE_EOS, EXPECT_PARENTH_FUNC,\n        FP_NO_ERROR\n    };\n\n\n    int Parse(const std::string& Function, const std::string& Vars,\n              bool useDegrees = false);\n    const char* ErrorMsg() const;\n    inline ParseErrorType GetParseErrorType() const { return parseErrorType; }\n\n    double Eval(const double* Vars);\n    inline int EvalError() const { return evalErrorType; }\n\n    bool AddConstant(const std::string& name, double value);\n\n    typedef double (*FunctionPtr)(const double*);\n\n    bool AddFunction(const std::string& name,\n                     FunctionPtr, unsigned paramsAmount);\n    bool AddFunction(const std::string& name, FunctionParser&);\n\n    void Optimize();\n\n\n    FunctionParser();\n    ~FunctionParser();\n\n    // Copy constructor and assignment operator (implemented using the\n    // copy-on-write technique for efficiency):\n    FunctionParser(const FunctionParser&);\n    FunctionParser& operator=(const FunctionParser&);\n\n\n#ifdef FUNCTIONPARSER_SUPPORT_DEBUG_OUTPUT\n    // For debugging purposes only:\n    void PrintByteCode(std::ostream& dest) const;\n#endif\n\n\n\n//========================================================================\nprivate:\n//========================================================================\n\n// Private data:\n// ------------\n    ParseErrorType parseErrorType;\n    int evalErrorType;\n\n    struct Data\n    {\n        unsigned referenceCounter;\n\n        int varAmount;\n        bool useDegreeConversion;\n\n        typedef std::map<std::string, unsigned> VarMap_t;\n        VarMap_t Variables;\n\n        typedef std::map<std::string, double> ConstMap_t;\n        ConstMap_t Constants;\n\n        VarMap_t FuncPtrNames;\n        struct FuncPtrData\n        {\n            FunctionPtr ptr; unsigned params;\n            FuncPtrData(FunctionPtr p, unsigned par): ptr(p), params(par) {}\n        };\n        std::vector<FuncPtrData> FuncPtrs;\n\n        VarMap_t FuncParserNames;\n        std::vector<FunctionParser*> FuncParsers;\n\n        unsigned* ByteCode;\n        unsigned ByteCodeSize;\n        double* Immed;\n        unsigned ImmedSize;\n        double* Stack;\n        unsigned StackSize;\n\n        Data();\n        ~Data();\n        Data(const Data&);\n\n        Data& operator=(const Data&); // not implemented on purpose\n    };\n\n    Data* data;\n    unsigned evalRecursionLevel;\n\n    // Temp data needed in Compile():\n    unsigned StackPtr;\n    std::vector<unsigned>* tempByteCode;\n    std::vector<double>* tempImmed;\n\n\n// Private methods:\n// ---------------\n    void copyOnWrite();\n\n\n    bool checkRecursiveLinking(const FunctionParser*) const;\n\n    bool isValidName(const std::string&) const;\n    Data::VarMap_t::const_iterator FindVariable(const char*,\n                                                const Data::VarMap_t&) const;\n    Data::ConstMap_t::const_iterator FindConstant(const char*) const;\n    int CheckSyntax(const char*);\n    bool Compile(const char*);\n    bool IsVariable(int);\n    void AddCompiledByte(unsigned);\n    void AddImmediate(double);\n    void AddFunctionOpcode(unsigned);\n    inline void incStackPtr();\n    int CompileIf(const char*, int);\n    int CompileFunctionParams(const char*, int, unsigned);\n    int CompileElement(const char*, int);\n    int CompilePow(const char*, int);\n    int CompileUnaryMinus(const char*, int);\n    int CompileMult(const char*, int);\n    int CompileAddition(const char*, int);\n    int CompileComparison(const char*, int);\n    int CompileAnd(const char*, int);\n    int CompileOr(const char*, int);\n    int CompileExpression(const char*, int, bool=false);\n\n\n    void MakeTree(void*) const;\n};\n\n#endif\n"
  },
  {
    "path": "k3dsdk/expression/fparser_license.txt",
    "content": "  Function parser for C++  v2.8 by Warp.\n  =====================================\n\n=============================================================================\n  Usage license:\n=============================================================================\n\nCopyright © 2003-2005 Juha Nieminen, Joel Yliluoma\n\n  This library is distributed under two distinct usage licenses depending\non the software (\"Software\" below) which uses the Function Parser library\n(\"Library\" below).\n  The reason for having two distinct usage licenses is to make the library\ncompatible with the GPL license while still being usable in other non-GPL\n(even commercial) software.\n\nA) If the Software using the Library is distributed under the GPL license,\n   then the Library can be used under the GPL license as well.\n\n   The Library will be under the GPL license only when used with the\n   Software. If the Library is separated from the Software and used in\n   another different software under a different license, then the Library\n   will have the B) license below.\n\n   Exception to the above: If the Library is modified for the GPL Software,\n   then the Library cannot be used with the B) license without the express\n   permission of the author of the modifications. A modified library will\n   be under the GPL license by default. That is, only the original,\n   unmodified version of the Library can be taken to another software\n   with the B) license below.\n\n   The author of the Software should provide an URL to the original\n   version of the Library if the one used in the Software has been\n   modified. (http://iki.fi/warp/FunctionParser/)\n\n   This text file must be distributed in its original intact form along\n   with the sources of the Library. (Documentation about possible\n   modifications to the library should be put in a different text file.)\n\nB) If the Software using the Library is not distributed under the GPL\n   license but under any other license, then the following usage license\n   applies to the Library:\n\n  1. This library is free for non-commercial usage. You can do whatever you\n     like with it as long as you don't claim you made it yourself.\n\n  2. It is possible to use this library in a commercial program, but in this\n     case you MUST contact me first (warp@iki.fi) and ask express permission\n     for this. (Read explanation at the end of the file.)\n       If you are making a free program or a shareware program with just a\n     nominal price (5 US dollars or less), you don't have to ask for\n     permission.\n       In any case, I DON'T WANT MONEY for the usage of this library. It is\n     free, period.\n\n  3. You can make any modifications you want to it so that it conforms your\n     needs. If you make modifications to it, you have, of course, credits for\n     the modified parts.\n\n  4. If you use this library in your own program, you don't have to provide\n     the source code if you don't want to (ie. the source code of your program\n     or this library).\n       If you DO include the source code for this library, this text file\n     must be included in its original intact form.\n\n  5. If you distribute a program which uses this library, and specially if you\n     provide the source code, proper credits MUST be included. Trying to\n     obfuscate the fact that this library is not made by you or that it is\n     free is expressly prohibited. When crediting the usage of this library,\n     it's enough to include my name and email address, that is:\n     \"Juha Nieminen (warp@iki.fi)\". Also a URL to the library download page\n     would be nice, although not required. The official URL is:\n       http://iki.fi/warp/FunctionParser/\n\n  6. And the necessary \"lawyer stuff\":\n\n     The above copyright notice and this permission notice shall be\n     included in all copies or substantial portions of the Software.\n\n     The software is provided \"as is\", without warranty of any kind,\n     express or implied, including but not limited to the warranties of\n     merchantability, fitness for a particular purpose and noninfringement.\n     In no event shall the authors or copyright holders be liable for any\n     claim, damages or other liability, whether in an action of contract,\n     tort or otherwise, arising from, out of or in connection with the\n     software or the use or other dealings in the software.\n\n\n---  Explanation of the section 2 of the B) license above:\n\n  The section 2 tries to define \"fair use\" of the library in commercial\nprograms.\n  \"Fair use\" of the library means that the program is not heavily dependent\non the library, but the library only provides a minor secondary feature\nto the program.\n  \"Heavily dependent\" means that the program depends so much on the library\nthat without it the functionality of the program would be seriously\ndegraded or the program would even become completely non-functional.\n\n  In other words: If the program does not depend heavily on the library,\nthat is, the library only provides a minor secondary feature which could\nbe removed without the program being degraded in any considerable way,\nthen it's OK to use the library in the commercial program.\n  If, however, the program depends so heavily on the library that\nremoving it would make the program non-functional or degrade its\nfunctionality considerably, then it's NOT OK to use the library.\n\n  The ideology behind this is that it's not fair to use a free library\nas a base for a commercial program, but it's fair if the library is\njust a minor, unimportant extra.\n\n  If you are going to ask me for permission to use the library in a\ncommercial program, please describe the feature which the library will\nbe providing and how important it is to the program.\n"
  },
  {
    "path": "k3dsdk/expression/fpconfig.h",
    "content": "//==============================\n// Function parser v2.8 by Warp\n//==============================\n// =============================================================================\n//   Usage license:\n// =============================================================================\n// \n// Copyright © 2003-2005 Juha Nieminen, Joel Yliluoma\n// \n//   This library is distributed under two distinct usage licenses depending\n// on the software (\"Software\" below) which uses the Function Parser library\n// (\"Library\" below).\n//   The reason for having two distinct usage licenses is to make the library\n// compatible with the GPL license while still being usable in other non-GPL\n// (even commercial) software. See fparser_license.txt for more details.\n\n// Configuration file\n// ------------------\n\n// NOTE:\n// This file is for the internal use of the function parser only.\n// You don't need to include this file in your source files, just\n// include \"fparser.h\".\n\n/*\n Comment out the following line if your compiler supports the (non-standard)\n asinh, acosh and atanh functions and you want them to be supported. If\n you are not sure, just leave it (those function will then not be supported).\n*/\n#define NO_ASINH\n\n\n/*\n Uncomment the following line to disable the eval() function if it could\n be too dangerous in the target application.\n Note that even though the maximum recursion level of eval() is limited,\n it is still possible to write functions using it which take enormous\n amounts of time to evaluate even though the maximum recursion is never\n reached. This may be undesirable in some applications.\n*/\n//#define DISABLE_EVAL\n\n\n/*\n Maximum recursion level for eval() calls:\n*/\n#define EVAL_MAX_REC_LEVEL 1000\n\n\n/*\n Comment out the following lines out if you are not going to use the\n optimizer and want a slightly smaller library. The Optimize() method\n can still be called, but it will not do anything.\n If you are unsure, just leave it. It won't slow down the other parts of\n the library.\n*/\n#ifndef NO_SUPPORT_OPTIMIZER\n#define SUPPORT_OPTIMIZER\n#endif\n\n\n/*\n Epsilon value used with the comparison operators (must be non-negative):\n (Comment it out if you don't want to use epsilon in comparisons. Might\n lead to marginally faster evaluation of the comparison operators, but\n can introduce inaccuracies in comparisons.)\n*/\n#define FP_EPSILON 1e-14\n"
  },
  {
    "path": "k3dsdk/expression/fpoptimizer.cpp",
    "content": "//===========================================\n// Function parser v2.8 optimizer by Bisqwit\n//===========================================\n// =============================================================================\n//   Usage license:\n// =============================================================================\n// \n// Copyright © 2003-2005 Juha Nieminen, Joel Yliluoma\n// \n//   This library is distributed under two distinct usage licenses depending\n// on the software (\"Software\" below) which uses the Function Parser library\n// (\"Library\" below).\n//   The reason for having two distinct usage licenses is to make the library\n// compatible with the GPL license while still being usable in other non-GPL\n// (even commercial) software. See fparser_license.txt for more details.\n\n\n/*\n NOTE!\n ----\n Everything that goes into the #ifndef SUPPORT_OPTIMIZER part\n (ie. when SUPPORT_OPTIMIZER is not defined) should be put in\n the end of fparser.cc file, not in this file.\n\n Everything in this file should be inside the #ifdef SUPPORT_OPTIMIZER\n block (except the #include \"fpconfig.h\" line).\n*/\n\n\n#include \"fpconfig.h\"\n\n#ifdef SUPPORT_OPTIMIZER\n\n#include \"fparser.h\"\n#include \"fptypes.h\"\nusing namespace FUNCTIONPARSERTYPES;\n\n#include <cmath>\n#include <list>\n#include <utility>\n#include <cassert>\nusing namespace std;\n\n#ifndef M_PI\n#define M_PI 3.1415926535897932384626433832795\n#endif\n\n#define CONSTANT_E     2.71828182845904509080  // exp(1)\n#define CONSTANT_PI    M_PI                    // atan2(0,-1)\n#define CONSTANT_L10   2.30258509299404590109  // log(10)\n#define CONSTANT_L10I  0.43429448190325176116  // 1/log(10)\n#define CONSTANT_L10E  CONSTANT_L10I           // log10(e)\n#define CONSTANT_L10EI CONSTANT_L10            // 1/log10(e)\n#define CONSTANT_DR    (180.0 / M_PI)          // 180/pi\n#define CONSTANT_RD    (M_PI / 180.0)          // pi/180\n\nnamespace {\ninline double Min(double d1, double d2)\n{\n    return d1<d2 ? d1 : d2;\n}\ninline double Max(double d1, double d2)\n{\n    return d1>d2 ? d1 : d2;\n}\n\nclass compres\n{\n    // states: 0=false, 1=true, 2=unknown\npublic:\n    compres(bool b) : state(b) {}\n    compres(char v) : state(v) {}\n    // is it?\n    operator bool() const { return state != 0; }\n    // is it not?\n    bool operator! () const { return state != 1; }\n    bool operator==(bool b) const { return state != !b; }\n    bool operator!=(bool b) const { return state != b; }\nprivate:\n    char state;\n};\n\nconst compres maybe = (char)2;\n\nstruct CodeTree;\n\nclass SubTree\n{\n    CodeTree *tree;\n    bool sign;  // Only possible when parent is cAdd or cMul\n\n    inline void flipsign() { sign = !sign; }\npublic:\n    SubTree();\n    SubTree(double value);\n    SubTree(const SubTree &b);\n    SubTree(const CodeTree &b);\n\n    ~SubTree();\n    const SubTree &operator= (const SubTree &b);\n    const SubTree &operator= (const CodeTree &b);\n\n    bool getsign() const { return sign; }\n\n    const CodeTree* operator-> () const { return tree; }\n    const CodeTree& operator* () const { return *tree; }\n    struct CodeTree* operator-> () { return tree; }\n    struct CodeTree& operator* () { return *tree; }\n\n    bool operator< (const SubTree& b) const;\n    bool operator== (const SubTree& b) const;\n    void Negate(); // Note: Parent must be cAdd\n    void Invert(); // Note: Parent must be cMul\n\n    void CheckConstNeg();\n    void CheckConstInv();\n};\n\nbool IsNegate(const SubTree &p1, const SubTree &p2);\nbool IsInverse(const SubTree &p1, const SubTree &p2);\n\ntypedef list<SubTree> paramlist;\n\nstruct CodeTreeData\n{\n    paramlist args;\n\nprivate:\n    unsigned op;       // Operation\n    double value;      // In case of cImmed\n    unsigned var;      // In case of cVar\n    unsigned funcno;   // In case of cFCall, cPCall\n\npublic:\n    CodeTreeData() : op(cAdd) {}\n    ~CodeTreeData() {}\n\n    void SetOp(unsigned newop)     { op=newop; }\n    void SetFuncNo(unsigned newno) { funcno=newno; }\n    unsigned GetFuncNo() const { return funcno; }\n\n    bool IsFunc() const  { return op == cFCall || op == cPCall; }\n    bool IsImmed() const { return op == cImmed; }\n    bool IsVar() const   { return op == cVar; }\n    inline unsigned GetOp() const { return op; }\n    inline double GetImmed() const\n    {\n        return value;\n    }\n    inline unsigned GetVar() const\n    {\n        return var;\n    }\n\n    void AddParam(const SubTree &p)\n    {\n        args.push_back(p);\n    }\n    void SetVar(unsigned v)\n    {\n        args.clear();\n        op  = cVar;\n        var = v;\n    }\n    void SetImmed(double v)\n    {\n        args.clear();\n        op       = cImmed;\n        value    = orig = v;\n        inverted = negated = false;\n    }\n    void NegateImmed()\n    {\n        negated = !negated;\n        UpdateValue();\n    }\n    void InvertImmed()\n    {\n        inverted = !inverted;\n        UpdateValue();\n    }\n\n    bool IsOriginal() const { return !(IsInverted() || IsNegated()); }\n    bool IsInverted() const { return inverted; }\n    bool IsNegated() const { return negated; }\n    bool IsInvertedOriginal() const { return IsInverted() && !IsNegated(); }\n    bool IsNegatedOriginal() const { return !IsInverted() && IsNegated(); }\n\nprivate:\n    void UpdateValue()\n    {\n        value = orig;\n        if(IsInverted()) { value = 1.0 / value;\n                           // FIXME: potential divide by zero.\n                         }\n        if(IsNegated()) value = -value;\n    }\n\n    double orig;\n    bool inverted;\n    bool negated;\nprotected:\n    // Ensure we don't accidentally copy this\n    void operator=(const CodeTreeData &b);\n};\n\n\nclass CodeTreeDataPtr\n{\n    typedef pair<CodeTreeData, unsigned> p_t;\n    typedef p_t* pp;\n    mutable pp p;\n\n    void Alloc()   const { ++p->second; }\n    void Dealloc() const { if(!--p->second) delete p; p = 0; }\n\n    void PrepareForWrite()\n    {\n        // We're ready if we're the only owner.\n        if(p->second == 1) return;\n\n        // Then make a clone.\n        p_t *newtree = new p_t(p->first, 1);\n        // Forget the old\n        Dealloc();\n        // Keep the new\n        p = newtree;\n    }\n\npublic:\n    CodeTreeDataPtr() : p(new p_t) { p->second = 1; }\n    CodeTreeDataPtr(const CodeTreeDataPtr &b): p(b.p) { Alloc(); }\n    ~CodeTreeDataPtr() { Dealloc(); }\n    const CodeTreeDataPtr &operator= (const CodeTreeDataPtr &b)\n    {\n        b.Alloc();\n        Dealloc();\n        p = b.p;\n        return *this;\n    }\n    const CodeTreeData *operator-> () const { return &p->first; }\n    const CodeTreeData &operator*  () const { return p->first; }\n    CodeTreeData *operator-> () { PrepareForWrite(); return &p->first; }\n    CodeTreeData &operator*  () { PrepareForWrite(); return p->first; }\n\n    void Shock();\n};\n\n\n#define CHECKCONSTNEG(item, op) \\\n    ((op)==cMul) \\\n       ? (item).CheckConstInv() \\\n       : (item).CheckConstNeg()\n\nstruct CodeTree\n{\n    CodeTreeDataPtr data;\n\nprivate:\n    typedef paramlist::iterator pit;\n    typedef paramlist::const_iterator pcit;\n\n    /*\n    template<unsigned v> inline void chk() const\n    {\n    }\n    */\n\npublic:\n    const pcit GetBegin() const { return data->args.begin(); }\n    const pcit GetEnd()   const { return data->args.end(); }\n    const pit GetBegin() { return data->args.begin(); }\n    const pit GetEnd()   { return data->args.end(); }\n    const SubTree& getp0() const { /*chk<1>();*/pcit tmp=GetBegin();               return *tmp; }\n    const SubTree& getp1() const { /*chk<2>();*/pcit tmp=GetBegin(); ++tmp;        return *tmp; }\n    const SubTree& getp2() const { /*chk<3>();*/pcit tmp=GetBegin(); ++tmp; ++tmp; return *tmp; }\n    unsigned GetArgCount() const { return data->args.size(); }\n    void Erase(const pit p)      { data->args.erase(p); }\n\n    SubTree& getp0() { /*chk<1>();*/pit tmp=GetBegin();               return *tmp; }\n    SubTree& getp1() { /*chk<2>();*/pit tmp=GetBegin(); ++tmp;        return *tmp; }\n    SubTree& getp2() { /*chk<3>();*/pit tmp=GetBegin(); ++tmp; ++tmp; return *tmp; }\n\n    // set\n    void SetImmed(double v) { data->SetImmed(v); }\n    void SetOp(unsigned op) { data->SetOp(op); }\n    void SetVar(unsigned v) { data->SetVar(v); }\n    // get\n    double GetImmed() const { return data->GetImmed(); }\n    unsigned GetVar() const { return data->GetVar(); }\n    unsigned GetOp() const  { return data->GetOp(); }\n    // test\n    bool IsImmed() const { return data->IsImmed(); }\n    bool IsVar()   const { return data->IsVar(); }\n    // act\n    void AddParam(const SubTree &p) { data->AddParam(p); }\n    void NegateImmed() { data->NegateImmed(); } // don't use when op!=cImmed\n    void InvertImmed() { data->InvertImmed(); } // don't use when op!=cImmed\n\n    compres NonZero() const { if(!IsImmed()) return maybe;\n                              return GetImmed() != 0.0; }\n    compres IsPositive() const { if(!IsImmed()) return maybe;\n                                 return GetImmed() > 0.0; }\n\nprivate:\n    struct ConstList\n    {\n        double voidvalue;\n        list<pit> cp;\n        double value;\n        unsigned size() const { return cp.size(); }\n    };\n    struct ConstList BuildConstList();\n    void KillConst(const ConstList &cl)\n    {\n        for(list<pit>::const_iterator i=cl.cp.begin(); i!=cl.cp.end(); ++i)\n            Erase(*i);\n    }\n    void FinishConst(const ConstList &cl)\n    {\n        if(cl.value != cl.voidvalue && cl.size() > 1) AddParam(cl.value);\n        if(cl.value == cl.voidvalue || cl.size() > 1) KillConst(cl);\n    }\n\npublic:\n    CodeTree() {}\n    CodeTree(double v) { SetImmed(v); }\n\n    CodeTree(unsigned op, const SubTree &p)\n    {\n        SetOp(op);\n        AddParam(p);\n    }\n    CodeTree(unsigned op, const SubTree &p1, const SubTree &p2)\n    {\n        SetOp(op);\n        AddParam(p1);\n        AddParam(p2);\n    }\n\n    bool operator== (const CodeTree& b) const;\n    bool operator< (const CodeTree& b) const;\n\nprivate:\n    bool IsSortable() const\n    {\n        switch(GetOp())\n        {\n            case cAdd:  case cMul:\n            case cEqual:\n            case cAnd: case cOr:\n            case cMax: case cMin:\n                return true;\n            default:\n                return false;\n        }\n    }\n    void SortIfPossible()\n    {\n        if(IsSortable())\n        {\n            data->args.sort();\n        }\n    }\n\n    void ReplaceWithConst(double value)\n    {\n        SetImmed(value);\n\n        /* REMEMBER TO CALL CheckConstInv / CheckConstNeg\n         * FOR PARENT SubTree, OR MAYHEM HAPPENS\n         */\n    }\n\n    void ReplaceWith(const CodeTree &b)\n    {\n        // If b is child of *this, mayhem\n        // happens. So we first make a clone\n        // and then proceed with copy.\n        CodeTreeDataPtr tmp = b.data;\n        tmp.Shock();\n        data = tmp;\n    }\n\n    void ReplaceWith(unsigned op, const SubTree &p)\n    {\n        ReplaceWith(CodeTree(op, p));\n    }\n\n    void ReplaceWith(unsigned op, const SubTree &p1, const SubTree &p2)\n    {\n        ReplaceWith(CodeTree(op, p1, p2));\n    }\n\n    void OptimizeConflict()\n    {\n        // This optimization does this: x-x = 0, x/x = 1, a+b-a = b.\n\n        if(GetOp() == cAdd || GetOp() == cMul)\n        {\n        Redo:\n            pit a, b;\n            for(a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                for(b=GetBegin(); ++b != GetEnd(); )\n                {\n                    const SubTree &p1 = *a;\n                    const SubTree &p2 = *b;\n\n                    if(GetOp() == cMul ? IsInverse(p1,p2)\n                                       : IsNegate(p1,p2))\n                    {\n                        // These parameters complement each others out\n                        Erase(b);\n                        Erase(a);\n                        goto Redo;\n                    }\n                }\n            }\n        }\n        OptimizeRedundant();\n    }\n\n    void OptimizeRedundant()\n    {\n        // This optimization does this: min()=0, max()=0, add()=0, mul()=1\n\n        if(!GetArgCount())\n        {\n            if(GetOp() == cAdd || GetOp() == cMin || GetOp() == cMax)\n                ReplaceWithConst(0);\n            else if(GetOp() == cMul)\n                ReplaceWithConst(1);\n            return;\n        }\n\n        // And this: mul(x) = x, min(x) = x, max(x) = x, add(x) = x\n\n        if(GetArgCount() == 1)\n        {\n            if(GetOp() == cMul || GetOp() == cAdd || GetOp() == cMin || GetOp() == cMax)\n                if(!getp0().getsign())\n                    ReplaceWith(*getp0());\n        }\n\n        OptimizeDoubleNegations();\n    }\n\n    void OptimizeDoubleNegations()\n    {\n        if(GetOp() == cAdd)\n        {\n            // Eschew double negations\n\n            // If any of the elements is cMul\n            // and has a numeric constant, negate\n            // the constant and negate sign.\n\n            for(pit a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                SubTree &pa = *a;\n                if(pa.getsign()\n                && pa->GetOp() == cMul)\n                {\n                    CodeTree &p = *pa;\n                    for(pit b=p.GetBegin();\n                            b!=p.GetEnd(); ++b)\n                    {\n                        SubTree &pb = *b;\n                        if(pb->IsImmed())\n                        {\n                            pb.Negate();\n                            pa.Negate();\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n\n        if(GetOp() == cMul)\n        {\n            // If any of the elements is cPow\n            // and has a numeric exponent, negate\n            // the exponent and negate sign.\n\n            for(pit a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                SubTree &pa = *a;\n                if(pa.getsign() && pa->GetOp() == cPow)\n                {\n                    CodeTree &p = *pa;\n                    if(p.getp1()->IsImmed())\n                    {\n                        // negate ok for pow when op=cImmed\n                        p.getp1().Negate();\n                        pa.Negate();\n                    }\n                }\n            }\n        }\n    }\n\n    void OptimizeConstantMath1()\n    {\n        // This optimization does three things:\n        //      - For adding groups:\n        //          Constants are added together.\n        //      - For multiplying groups:\n        //          Constants are multiplied together.\n        //      - For function calls:\n        //          If all parameters are constants,\n        //          the call is replaced with constant value.\n\n        // First, do this:\n        OptimizeAddMulFlat();\n\n        switch(GetOp())\n        {\n            case cAdd:\n            {\n                ConstList cl = BuildConstList();\n                FinishConst(cl);\n                break;\n            }\n            case cMul:\n            {\n                ConstList cl = BuildConstList();\n\n                if(cl.value == 0.0) ReplaceWithConst(0.0);\n                else FinishConst(cl);\n\n                break;\n            }\n            #define ConstantUnaryFun(token, fun) \\\n                case token: { const SubTree &p0 = getp0(); \\\n                    if(p0->IsImmed()) ReplaceWithConst(fun(p0->GetImmed())); \\\n                    break; }\n            #define ConstantBinaryFun(token, fun) \\\n                case token: { const SubTree &p0 = getp0(); \\\n                              const SubTree &p1 = getp1(); \\\n                    if(p0->IsImmed() && \\\n                       p1->IsImmed()) ReplaceWithConst(fun(p0->GetImmed(), p1->GetImmed())); \\\n                    break; }\n\n            // FIXME: potential invalid parameters for functions\n            //        can cause exceptions here\n\n            ConstantUnaryFun(cAbs,   fabs);\n            ConstantUnaryFun(cAcos,  acos);\n            ConstantUnaryFun(cAsin,  asin);\n            ConstantUnaryFun(cAtan,  atan);\n            ConstantUnaryFun(cCeil,  ceil);\n            ConstantUnaryFun(cCos,   cos);\n            ConstantUnaryFun(cCosh,  cosh);\n            ConstantUnaryFun(cFloor, floor);\n            ConstantUnaryFun(cLog,   log);\n            ConstantUnaryFun(cSin,   sin);\n            ConstantUnaryFun(cSinh,  sinh);\n            ConstantUnaryFun(cTan,   tan);\n            ConstantUnaryFun(cTanh,  tanh);\n            ConstantBinaryFun(cAtan2, atan2);\n            ConstantBinaryFun(cMax,   Max);\n            ConstantBinaryFun(cMin,   Min);\n            ConstantBinaryFun(cMod,   fmod); // not a func, but belongs here too\n            ConstantBinaryFun(cPow,   pow);\n\n            case cNeg:\n            case cSub:\n            case cDiv:\n                /* Unreached (nonexistent operator)\n                 * TODO: internal error here?\n                 */\n                break;\n\n            case cCot:\n            case cCsc:\n            case cSec:\n            case cDeg:\n            case cRad:\n            case cLog10:\n            case cSqrt:\n            case cExp:\n                /* Unreached (nonexistent function)\n                 * TODO: internal error here?\n                 */\n                 break;\n        }\n\n        OptimizeConflict();\n    }\n\n    void OptimizeAddMulFlat()\n    {\n        // This optimization flattens the topography of the tree.\n        //   Examples:\n        //       x + (y+z) = x+y+z\n        //       x * (y/z) = x*y/z\n        //       x / (y/z) = x/y*z\n\n        if(GetOp() == cAdd || GetOp() == cMul)\n        {\n            // If children are same type as parent add them here\n            for(pit b, a=GetBegin(); a!=GetEnd(); a=b)\n            {\n                const SubTree &pa = *a;  b=a; ++b;\n                if(pa->GetOp() != GetOp()) continue;\n\n                // Child is same type\n                for(pcit c=pa->GetBegin();\n                         c!=pa->GetEnd();\n                         ++c)\n                {\n                    const SubTree &pb = *c;\n                    if(pa.getsign())\n                    {\n                        // +a -(+b +c)\n                        // means b and c will be negated\n\n                        SubTree tmp = pb;\n                        if(GetOp() == cMul)\n                            tmp.Invert();\n                        else\n                            tmp.Negate();\n                        AddParam(tmp);\n                    }\n                    else\n                        AddParam(pb);\n                }\n                Erase(a);\n\n                // Note: OptimizeConstantMath1() would be a good thing to call next.\n            }\n        }\n    }\n\n    void OptimizeLinearCombine()\n    {\n        // This optimization does the following:\n        //\n        //   x*x*x*x -> x^4\n        //   x+x+x+x -> x*4\n        //   x*x     -> x^2\n        //   x/z/z   ->\n        //\n\n        // Remove conflicts first, so we don't have to worry about signs.\n        OptimizeConflict();\n\n        bool didchanges = false;\n        if(GetOp() == cAdd || GetOp() == cMul)\n        {\n        Redo:\n            for(pit a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                const SubTree &pa = *a;\n\n                list<pit> poslist;\n\n                for(pit b=a; ++b!=GetEnd(); )\n                {\n                    const SubTree &pb = *b;\n                    if(*pa == *pb)\n                        poslist.push_back(b);\n                }\n\n                unsigned min = 2;\n                if(poslist.size() >= min)\n                {\n                    SubTree arvo = pa;\n                    bool negate = arvo.getsign();\n\n                    double factor = poslist.size() + 1;\n\n                    if(negate)\n                    {\n                        arvo.Negate();\n                        factor = -factor;\n                    }\n\n                    CodeTree tmp(GetOp()==cAdd ? cMul : cPow,\n                                 arvo,\n                                 factor);\n\n                    list<pit>::const_iterator j;\n                    for(j=poslist.begin(); j!=poslist.end(); ++j)\n                        Erase(*j);\n                    poslist.clear();\n\n                    *a = tmp;\n                    didchanges = true;\n                    goto Redo;\n                }\n            }\n        }\n        if(didchanges)\n        {\n            // As a result, there might be need for this:\n            OptimizeAddMulFlat();\n            // And this:\n            OptimizeRedundant();\n        }\n    }\n\n    void OptimizeLogarithm()\n    {\n        /*\n            This is basic logarithm math:\n              pow(X,Y)/log(Y) = X\n              log(X)/log(Y) = logY(X)\n              log(X^Y)      = log(X)*Y\n              log(X*Y)      = log(X)+log(Y)\n              exp(log(X)*Y) = X^Y\n\n            This function does these optimizations:\n               pow(const_E, log(x))   = x\n               pow(const_E, log(x)*y) = x^y\n               pow(10,      log(x)*const_L10I*y) = x^y\n               pow(z,       log(x)/log(z)*y)     = x^y\n\n            And this:\n               log(x^z)             = z * log(x)\n            Which automatically causes these too:\n               log(pow(const_E, x))         = x\n               log(pow(y,       x))         = x * log(y)\n               log(pow(pow(const_E, y), x)) = x*y\n\n            And it does this too:\n               log(x) + log(y) + log(z) = log(x * y * z)\n               log(x * exp(y)) = log(x) + y\n\n        */\n\n        // Must be already in exponential form.\n\n        // Optimize exponents before doing something.\n        OptimizeExponents();\n\n        if(GetOp() == cLog)\n        {\n            // We should have one parameter for log() function.\n            // If we don't, we're screwed.\n\n            const SubTree &p = getp0();\n\n            if(p->GetOp() == cPow)\n            {\n                // Found log(x^y)\n                SubTree p0 = p->getp0(); // x\n                SubTree p1 = p->getp1(); // y\n\n                // Build the new logarithm.\n                CodeTree tmp(GetOp(), p0);  // log(x)\n\n                // Become log(x) * y\n                ReplaceWith(cMul, tmp, p1);\n            }\n            else if(p->GetOp() == cMul)\n            {\n                // Redefine &p nonconst\n                SubTree &p = getp0();\n\n                p->OptimizeAddMulFlat();\n                p->OptimizeExponents();\n                CHECKCONSTNEG(p, p->GetOp());\n\n                list<SubTree> adds;\n\n                for(pit b, a = p->GetBegin();\n                           a != p->GetEnd(); a=b)\n                {\n                    SubTree &pa = *a;  b=a; ++b;\n                    if(pa->GetOp() == cPow\n                    && pa->getp0()->IsImmed()\n                    && pa->getp0()->GetImmed() == CONSTANT_E)\n                    {\n                        adds.push_back(pa->getp1());\n                        p->Erase(a);\n                        continue;\n                    }\n                }\n                if(adds.size())\n                {\n                    CodeTree tmp(cAdd, *this);\n\n                    list<SubTree>::const_iterator i;\n                    for(i=adds.begin(); i!=adds.end(); ++i)\n                        tmp.AddParam(*i);\n\n                    ReplaceWith(tmp);\n                }\n            }\n        }\n        if(GetOp() == cAdd)\n        {\n            // Check which ones are logs.\n            list<pit> poslist;\n\n            for(pit a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                const SubTree &pa = *a;\n                if(pa->GetOp() == cLog)\n                    poslist.push_back(a);\n            }\n\n            if(poslist.size() >= 2)\n            {\n                CodeTree tmp(cMul, 1.0); // eek\n\n                list<pit>::const_iterator j;\n                for(j=poslist.begin(); j!=poslist.end(); ++j)\n                {\n                    const SubTree &pb = **j;\n                    // Take all of its children\n                    for(pcit b=pb->GetBegin();\n                             b!=pb->GetEnd();\n                             ++b)\n                    {\n                        SubTree tmp2 = *b;\n                        if(pb.getsign()) tmp2.Negate();\n                        tmp.AddParam(tmp2);\n                    }\n                    Erase(*j);\n                }\n                poslist.clear();\n\n                AddParam(CodeTree(cLog, tmp));\n            }\n            // Done, hopefully\n        }\n        if(GetOp() == cPow)\n        {\n            const SubTree &p0 = getp0();\n            SubTree &p1 = getp1();\n\n            if(p0->IsImmed() && p0->GetImmed() == CONSTANT_E\n            && p1->GetOp() == cLog)\n            {\n                // pow(const_E, log(x)) = x\n                ReplaceWith(*(p1->getp0()));\n            }\n            else if(p1->GetOp() == cMul)\n            {\n                //bool didsomething = true;\n\n                pit poslogpos; bool foundposlog = false;\n                pit neglogpos; bool foundneglog = false;\n\n                ConstList cl = p1->BuildConstList();\n\n                for(pit a=p1->GetBegin(); a!=p1->GetEnd(); ++a)\n                {\n                    const SubTree &pa = *a;\n                    if(pa->GetOp() == cLog)\n                    {\n                        if(!pa.getsign())\n                        {\n                            foundposlog = true;\n                            poslogpos   = a;\n                        }\n                        else if(*p0 == *(pa->getp0()))\n                        {\n                            foundneglog = true;\n                            neglogpos   = a;\n                        }\n                    }\n                }\n\n                if(p0->IsImmed()\n                && p0->GetImmed() == 10.0\n                && cl.value == CONSTANT_L10I\n                && foundposlog)\n                {\n                    SubTree base = (*poslogpos)->getp0();\n                    p1->KillConst(cl);\n                    p1->Erase(poslogpos);\n                    p1->OptimizeRedundant();\n                    SubTree mul = p1;\n\n                    ReplaceWith(cPow, base, mul);\n\n                    // FIXME: what optimizations should be done now?\n                    return;\n                }\n\n                // Put back the constant\n                FinishConst(cl);\n\n                if(p0->IsImmed()\n                && p0->GetImmed() == CONSTANT_E\n                && foundposlog)\n                {\n                    SubTree base = (*poslogpos)->getp0();\n                    p1->Erase(poslogpos);\n\n                    p1->OptimizeRedundant();\n                    SubTree mul = p1;\n\n                    ReplaceWith(cPow, base, mul);\n\n                    // FIXME: what optimizations should be done now?\n                    return;\n                }\n\n                if(foundposlog\n                && foundneglog\n                && *((*neglogpos)->getp0()) == *p0)\n                {\n                    SubTree base = (*poslogpos)->getp0();\n                    p1->Erase(poslogpos);\n                    p1->Erase(neglogpos);\n\n                    p1->OptimizeRedundant();\n                    SubTree mul = p1;\n\n                    ReplaceWith(cPow, base, mul);\n\n                    // FIXME: what optimizations should be done now?\n                    return;\n                }\n            }\n        }\n    }\n\n    void OptimizeFunctionCalls()\n    {\n        /* Goals: sin(asin(x)) = x\n         *        cos(acos(x)) = x\n         *        tan(atan(x)) = x\n         * NOTE:\n         *   Do NOT do these:\n         *     asin(sin(x))\n         *     acos(cos(x))\n         *     atan(tan(x))\n         *   Because someone might want to wrap the angle.\n         */\n        // FIXME: TODO\n    }\n\n    void OptimizePowMulAdd()\n    {\n        // x^3 * x -> x^4\n        // x*3 + x -> x*4\n        // FIXME: Do those\n\n        // x^1 -> x\n        if(GetOp() == cPow)\n        {\n            const SubTree &base     = getp0();\n            const SubTree &exponent = getp1();\n\n            if(exponent->IsImmed())\n            {\n                if(exponent->GetImmed() == 1.0)\n                    ReplaceWith(*base);\n                else if(exponent->GetImmed() == 0.0\n                     && base->NonZero())\n                    ReplaceWithConst(1.0);\n            }\n        }\n    }\n\n    void OptimizeExponents()\n    {\n        /* Goals:\n         *     (x^y)^z   -> x^(y*z)\n         *     x^y * x^z -> x^(y+z)\n         */\n        // First move to exponential form.\n        OptimizeLinearCombine();\n\n        bool didchanges = false;\n\n    Redo:\n        if(GetOp() == cPow)\n        {\n            // (x^y)^z   -> x^(y*z)\n\n            const SubTree &p0 = getp0();\n            const SubTree &p1 = getp1();\n            if(p0->GetOp() == cPow)\n            {\n                CodeTree tmp(cMul, p0->getp1(), p1);\n                tmp.Optimize();\n\n                ReplaceWith(cPow, p0->getp0(), tmp);\n\n                didchanges = true;\n                goto Redo;\n            }\n        }\n        if(GetOp() == cMul)\n        {\n            // x^y * x^z -> x^(y+z)\n\n            for(pit a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                const SubTree &pa = *a;\n\n                if(pa->GetOp() != cPow) continue;\n\n                list<pit> poslist;\n\n                for(pit b=a; ++b != GetEnd(); )\n                {\n                    const SubTree &pb = *b;\n                    if(pb->GetOp() == cPow\n                    && *(pa->getp0())\n                    == *(pb->getp0()))\n                    {\n                        poslist.push_back(b);\n                    }\n                }\n\n                if(poslist.size() >= 1)\n                {\n                    poslist.push_back(a);\n\n                    CodeTree base = *(pa->getp0());\n\n                    CodeTree exponent(cAdd, 0.0); //eek\n\n                    // Collect all exponents to cAdd\n                    list<pit>::const_iterator i;\n                    for(i=poslist.begin(); i!=poslist.end(); ++i)\n                    {\n                        const SubTree &pb = **i;\n\n                        SubTree tmp2 = pb->getp1();\n                        if(pb.getsign()) tmp2.Invert();\n\n                        exponent.AddParam(tmp2);\n                    }\n\n                    exponent.Optimize();\n\n                    CodeTree result(cPow, base, exponent);\n\n                    for(i=poslist.begin(); i!=poslist.end(); ++i)\n                        Erase(*i);\n                    poslist.clear();\n\n                    AddParam(result); // We're cMul, remember\n\n                    didchanges = true;\n                    goto Redo;\n                }\n            }\n        }\n\n        OptimizePowMulAdd();\n\n        if(didchanges)\n        {\n            // As a result, there might be need for this:\n            OptimizeConflict();\n        }\n    }\n\n    void OptimizeLinearExplode()\n    {\n        // x^2 -> x*x\n        // But only if x is just a simple thing\n\n        // Won't work on anything else.\n        if(GetOp() != cPow) return;\n\n        // TODO TODO TODO\n    }\n\n    void OptimizePascal()\n    {\n#if 0    // Too big, too specific, etc\n\n        // Won't work on anything else.\n        if(GetOp() != cAdd) return;\n\n        // Must be done after OptimizeLinearCombine();\n\n        // Don't need pascal triangle\n        // Coefficient for x^a * y^b * z^c = 3! / (a! * b! * c!)\n\n        // We are greedy and want other than just binomials\n        // FIXME\n\n        // note: partial ones are also nice\n        //     x*x + x*y + y*y\n        //   = (x+y)^2 - x*y\n        //\n        //     x x * x y * + y y * +\n        // ->  x y + dup * x y * -\n#endif\n    }\n\npublic:\n\n    void Optimize();\n\n    void Assemble(vector<unsigned> &byteCode,\n                  vector<double>   &immed) const;\n\n    void FinalOptimize()\n    {\n        // First optimize each parameter.\n        for(pit a=GetBegin(); a!=GetEnd(); ++a)\n            (*a)->FinalOptimize();\n\n        /* These things are to be done:\n         *\n         * x * CONSTANT_DR        -> cDeg(x)\n         * x * CONSTANT_RD        -> cRad(x)\n         * pow(x, 0.5)            -> sqrt(x)\n         * log(x) * CONSTANT_L10I -> log10(x)\n         * pow(CONSTANT_E, x)     -> exp(x)\n         * inv(sin(x))            -> csc(x)\n         * inv(cos(x))            -> sec(x)\n         * inv(tan(x))            -> cot(x)\n         */\n\n\n        if(GetOp() == cPow)\n        {\n            const SubTree &p0 = getp0();\n            const SubTree &p1 = getp1();\n            if(p0->GetOp()    == cImmed\n            && p0->GetImmed() == CONSTANT_E)\n            {\n                ReplaceWith(cExp, p1);\n            }\n            else if(p1->GetOp()    == cImmed\n                 && p1->GetImmed() == 0.5)\n            {\n                ReplaceWith(cSqrt, p0);\n            }\n        }\n        if(GetOp() == cMul)\n        {\n            if(GetArgCount() == 1 && getp0().getsign())\n            {\n                /***/if(getp0()->GetOp() == cSin)ReplaceWith(cCsc, getp0()->getp0());\n                else if(getp0()->GetOp() == cCos)ReplaceWith(cSec, getp0()->getp0());\n                else if(getp0()->GetOp() == cTan)ReplaceWith(cCot, getp0()->getp0());\n            }\n        }\n        // Separate \"if\", because op may have just changed\n        if(GetOp() == cMul)\n        {\n            CodeTree *found_log = 0;\n\n            ConstList cl = BuildConstList();\n\n            for(pit a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                SubTree &pa = *a;\n                if(pa->GetOp() == cLog && !pa.getsign())\n                    found_log = &*pa;\n            }\n            if(cl.value == CONSTANT_L10I && found_log)\n            {\n                // Change the log() to log10()\n                found_log->SetOp(cLog10);\n                // And forget the constant\n                KillConst(cl);\n            }\n            else if(cl.value == CONSTANT_DR)\n            {\n                OptimizeRedundant();\n                ReplaceWith(cDeg, *this);\n            }\n            else if(cl.value == CONSTANT_RD)\n            {\n                OptimizeRedundant();\n                ReplaceWith(cRad, *this);\n            }\n            else FinishConst(cl);\n        }\n\n        SortIfPossible();\n    }\n};\n\nvoid CodeTreeDataPtr::Shock()\n{\n /*\n    PrepareForWrite();\n    paramlist &p2 = (*this)->args;\n    for(paramlist::iterator i=p2.begin(); i!=p2.end(); ++i)\n    {\n        (*i)->data.Shock();\n    }\n */\n}\n\nCodeTree::ConstList CodeTree::BuildConstList()\n{\n    ConstList result;\n    result.value     =\n    result.voidvalue = GetOp()==cMul ? 1.0 : 0.0;\n\n    list<pit> &cp = result.cp;\n    for(pit b, a=GetBegin(); a!=GetEnd(); a=b)\n    {\n        SubTree &pa = *a;  b=a; ++b;\n        if(!pa->IsImmed()) continue;\n\n        double thisvalue = pa->GetImmed();\n        if(thisvalue == result.voidvalue)\n        {\n            // This value is no good, forget it\n            Erase(a);\n            continue;\n        }\n        if(GetOp() == cMul)\n            result.value *= thisvalue;\n        else\n            result.value += thisvalue;\n        cp.push_back(a);\n    }\n    if(GetOp() == cMul)\n    {\n        /*\n          Jos joku niist� arvoista on -1 eik� se ole ainoa arvo,\n          niin joku muu niist� arvoista negatoidaan.\n        */\n        for(bool done=false; cp.size() > 1 && !done; )\n        {\n            done = true;\n            for(list<pit>::iterator b,a=cp.begin(); a!=cp.end(); a=b)\n            {\n                b=a; ++b;\n                if((**a)->GetImmed() == -1.0)\n                {\n                    Erase(*a);\n                    cp.erase(a);\n\n                    // take randomly something\n                    (**cp.begin())->data->NegateImmed();\n                    if(cp.size() < 2)break;\n                    done = false;\n                }\n            }\n        }\n    }\n    return result;\n}\n\nvoid CodeTree::Assemble\n   (vector<unsigned> &byteCode,\n    vector<double>   &immed) const\n{\n    #define AddCmd(op) byteCode.push_back((op))\n    #define AddConst(v) do { \\\n        byteCode.push_back(cImmed); \\\n        immed.push_back((v)); \\\n    } while(0)\n\n    if(IsVar())\n    {\n        AddCmd(GetVar());\n        return;\n    }\n    if(IsImmed())\n    {\n        AddConst(GetImmed());\n        return;\n    }\n\n    switch(GetOp())\n    {\n        case cAdd:\n        case cMul:\n        {\n            unsigned opcount = 0;\n            for(pcit a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                const SubTree &pa = *a;\n\n                if(opcount < 2) ++opcount;\n\n                bool pnega = pa.getsign();\n\n                bool done = false;\n                if(pa->IsImmed())\n                {\n                    if(GetOp() == cMul\n                    && pa->data->IsInverted()\n                    && (pnega || opcount==2)\n                      )\n                    {\n                        CodeTree tmp = *pa;\n                        tmp.data->InvertImmed();\n                        tmp.Assemble(byteCode, immed);\n                        pnega = !pnega;\n                        done = true;\n                    }\n                    else if(GetOp() == cAdd\n                    && (pa->data->IsNegatedOriginal()\n                //     || pa->GetImmed() < 0\n                       )\n                    && (pnega || opcount==2)\n                           )\n                    {\n                        CodeTree tmp = *pa;\n                        tmp.data->NegateImmed();\n                        tmp.Assemble(byteCode, immed);\n                        pnega = !pnega;\n                        done = true;\n                    }\n                }\n                if(!done)\n                    pa->Assemble(byteCode, immed);\n\n                if(opcount == 2)\n                {\n                    unsigned tmpop = GetOp();\n                    if(pnega) // negate\n                    {\n                        tmpop = (tmpop == cMul) ? cDiv : cSub;\n                    }\n                    AddCmd(tmpop);\n                }\n                else if(pnega)\n                {\n                    if(GetOp() == cMul) AddCmd(cInv);\n                    else AddCmd(cNeg);\n                }\n            }\n            break;\n        }\n        case cIf:\n        {\n            // If the parameter amount is != 3, we're screwed.\n            getp0()->Assemble(byteCode, immed);\n\n            unsigned ofs = byteCode.size();\n            AddCmd(cIf);\n            AddCmd(0); // code index\n            AddCmd(0); // immed index\n\n            getp1()->Assemble(byteCode, immed);\n\n            byteCode[ofs+1] = byteCode.size()+2;\n            byteCode[ofs+2] = immed.size();\n\n            ofs = byteCode.size();\n            AddCmd(cJump);\n            AddCmd(0); // code index\n            AddCmd(0); // immed index\n\n            getp2()->Assemble(byteCode, immed);\n\n            byteCode[ofs+1] = byteCode.size()-1;\n            byteCode[ofs+2] = immed.size();\n\n            break;\n        }\n        case cFCall:\n        {\n            // If the parameter count is invalid, we're screwed.\n            for(pcit a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                const SubTree &pa = *a;\n                pa->Assemble(byteCode, immed);\n            }\n            AddCmd(GetOp());\n            AddCmd(data->GetFuncNo());\n            break;\n        }\n        case cPCall:\n        {\n            // If the parameter count is invalid, we're screwed.\n            for(pcit a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                const SubTree &pa = *a;\n                pa->Assemble(byteCode, immed);\n            }\n            AddCmd(GetOp());\n            AddCmd(data->GetFuncNo());\n            break;\n        }\n        default:\n        {\n            // If the parameter count is invalid, we're screwed.\n            for(pcit a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                const SubTree &pa = *a;\n                pa->Assemble(byteCode, immed);\n            }\n            AddCmd(GetOp());\n            break;\n        }\n    }\n}\n\nvoid CodeTree::Optimize()\n{\n    // Phase:\n    //   Phase 0: Do local optimizations.\n    //   Phase 1: Optimize each.\n    //   Phase 2: Do local optimizations again.\n\n    for(unsigned phase=0; phase<=2; ++phase)\n    {\n        if(phase == 1)\n        {\n            // Optimize each parameter.\n            for(pit a=GetBegin(); a!=GetEnd(); ++a)\n            {\n                (*a)->Optimize();\n                CHECKCONSTNEG(*a, GetOp());\n            }\n            continue;\n        }\n        if(phase == 0 || phase == 2)\n        {\n            // Do local optimizations.\n\n            OptimizeConstantMath1();\n            OptimizeLogarithm();\n            OptimizeFunctionCalls();\n            OptimizeExponents();\n            OptimizeLinearExplode();\n            OptimizePascal();\n\n            /* Optimization paths:\n\n               doublenegations=\n               redundant= * doublenegations\n               conflict= * redundant\n               addmulflat=\n               constantmath1= addmulflat * conflict\n               linearcombine= conflict * addmulflat� redundant�\n               powmuladd=\n               exponents= linearcombine * powmuladd conflict�\n               logarithm= exponents *\n               functioncalls= IDLE\n               linearexplode= IDLE\n               pascal= IDLE\n\n               * = actions here\n               � = only if made changes\n            */\n        }\n    }\n}\n\n\nbool CodeTree::operator== (const CodeTree& b) const\n{\n    if(GetOp() != b.GetOp()) return false;\n    if(IsImmed()) if(GetImmed()  != b.GetImmed())  return false;\n    if(IsVar())   if(GetVar()    != b.GetVar())    return false;\n    if(data->IsFunc())\n        if(data->GetFuncNo() != b.data->GetFuncNo()) return false;\n    return data->args == b.data->args;\n}\n\nbool CodeTree::operator< (const CodeTree& b) const\n{\n    if(GetArgCount() != b.GetArgCount())\n        return GetArgCount() > b.GetArgCount();\n\n    if(GetOp() != b.GetOp())\n    {\n        // sort immeds last\n        if(IsImmed() != b.IsImmed()) return IsImmed() < b.IsImmed();\n\n        return GetOp() < b.GetOp();\n    }\n\n    if(IsImmed())\n    {\n        if(GetImmed() != b.GetImmed()) return GetImmed() < b.GetImmed();\n    }\n    if(IsVar() && GetVar() != b.GetVar())\n    {\n        return GetVar() < b.GetVar();\n    }\n    if(data->IsFunc() && data->GetFuncNo() != b.data->GetFuncNo())\n    {\n        return data->GetFuncNo() < b.data->GetFuncNo();\n    }\n\n    pcit i = GetBegin(), j = b.GetBegin();\n    for(; i != GetEnd(); ++i, ++j)\n    {\n        const SubTree &pa = *i, &pb = *j;\n\n        if(!(pa == pb))\n            return pa < pb;\n    }\n    return false;\n}\n\n\nbool IsNegate(const SubTree &p1, const SubTree &p2) /*const */\n{\n    if(p1->IsImmed() && p2->IsImmed())\n    {\n        return p1->GetImmed() == -p2->GetImmed();\n    }\n    if(p1.getsign() == p2.getsign()) return false;\n    return *p1 == *p2;\n}\nbool IsInverse(const SubTree &p1, const SubTree &p2) /*const*/\n{\n    if(p1->IsImmed() && p2->IsImmed())\n    {\n        // FIXME: potential divide by zero.\n        return p1->GetImmed() == 1.0 / p2->GetImmed();\n    }\n    if(p1.getsign() == p2.getsign()) return false;\n    return *p1 == *p2;\n}\n\nSubTree::SubTree() : tree(new CodeTree), sign(false)\n{\n}\n\nSubTree::SubTree(const SubTree &b) : tree(new CodeTree(*b.tree)), sign(b.sign)\n{\n}\n\n#define SubTreeDecl(p1, p2) \\\n    SubTree::SubTree p1 : tree(new CodeTree p2), sign(false) { }\n\nSubTreeDecl( (const CodeTree &b), (b) )\nSubTreeDecl( (double value),             (value) )\n\n#undef SubTreeDecl\n\nSubTree::~SubTree()\n{\n    delete tree; tree=0;\n}\n\nconst SubTree &SubTree::operator= (const SubTree &b)\n{\n    sign = b.sign;\n    CodeTree *oldtree = tree;\n    tree = new CodeTree(*b.tree);\n    delete oldtree;\n    return *this;\n}\nconst SubTree &SubTree::operator= (const CodeTree &b)\n{\n    sign = false;\n    CodeTree *oldtree = tree;\n    tree = new CodeTree(b);\n    delete oldtree;\n    return *this;\n}\n\nbool SubTree::operator< (const SubTree& b) const\n{\n    if(getsign() != b.getsign()) return getsign() < b.getsign();\n    return *tree < *b.tree;\n}\nbool SubTree::operator== (const SubTree& b) const\n{\n    return sign == b.sign && *tree == *b.tree;\n}\nvoid SubTree::Negate() // Note: Parent must be cAdd\n{\n    flipsign();\n    CheckConstNeg();\n}\nvoid SubTree::CheckConstNeg()\n{\n    if(tree->IsImmed() && getsign())\n    {\n        tree->NegateImmed();\n        sign = false;\n    }\n}\nvoid SubTree::Invert() // Note: Parent must be cMul\n{\n    flipsign();\n    CheckConstInv();\n}\nvoid SubTree::CheckConstInv()\n{\n    if(tree->IsImmed() && getsign())\n    {\n        tree->InvertImmed();\n        sign = false;\n    }\n}\n\n}//namespace\n\nvoid FunctionParser::MakeTree(void *r) const\n{\n    // Dirty hack. Should be fixed.\n    CodeTree* result = static_cast<CodeTree*>(r);\n\n    vector<CodeTree> stack(1);\n\n    #define GROW(n) do { \\\n        stacktop += n; \\\n        if(stack.size() <= stacktop) stack.resize(stacktop+1); \\\n    } while(0)\n\n    #define EAT(n, opcode) do { \\\n        unsigned newstacktop = stacktop-n; \\\n        if((n) == 0) GROW(1); \\\n        stack[stacktop].SetOp((opcode)); \\\n        for(unsigned a=0, b=(n); a<b; ++a) \\\n            stack[stacktop].AddParam(stack[newstacktop+a]); \\\n        stack.erase(stack.begin() + newstacktop, \\\n                    stack.begin() + stacktop); \\\n        stacktop = newstacktop; GROW(1); \\\n    } while(0)\n\n    #define ADDCONST(n) do { \\\n        stack[stacktop].SetImmed((n)); \\\n        GROW(1); \\\n    } while(0)\n\n    unsigned stacktop=0;\n\n    list<unsigned> labels;\n\n    const unsigned* const ByteCode = data->ByteCode;\n    const unsigned ByteCodeSize = data->ByteCodeSize;\n    const double* const Immed = data->Immed;\n\n    for(unsigned IP=0, DP=0; ; ++IP)\n    {\n        while(labels.size() > 0\n        && *labels.begin() == IP)\n        {\n            // The \"else\" of an \"if\" ends here\n            EAT(3, cIf);\n            labels.erase(labels.begin());\n        }\n\n        if(IP >= ByteCodeSize)\n        {\n            break;\n        }\n\n        unsigned opcode = ByteCode[IP];\n\n        if(opcode == cIf)\n        {\n            IP += 2;\n        }\n        else if(opcode == cJump)\n        {\n            labels.push_front(ByteCode[IP+1]+1);\n            IP += 2;\n        }\n        else if(opcode == cImmed)\n        {\n            ADDCONST(Immed[DP++]);\n        }\n        else if(opcode < VarBegin)\n        {\n            switch(opcode)\n            {\n                // Unary operators\n                case cNeg:\n                {\n                    EAT(1, cAdd); // Unary minus is negative adding.\n                    stack[stacktop-1].getp0().Negate();\n                    break;\n                }\n                // Binary operators\n                case cSub:\n                {\n                    EAT(2, cAdd); // Minus is negative adding\n                    stack[stacktop-1].getp1().Negate();\n                    break;\n                }\n                case cDiv:\n                {\n                    EAT(2, cMul); // Divide is inverse multiply\n                    stack[stacktop-1].getp1().Invert();\n                    break;\n                }\n\n                // ADD ALL TWO PARAMETER NON-FUNCTIONS HERE\n                case cAdd: case cMul:\n                case cMod: case cPow:\n                case cEqual: case cLess: case cGreater:\n                case cNEqual: case cLessOrEq: case cGreaterOrEq:\n                case cAnd: case cOr:\n                    EAT(2, opcode);\n                    break;\n\n                // ADD ALL UNARY NON-FUNCTIONS HERE\n                case cNot:\n                    EAT(1, opcode);\n                    break;\n\n                case cFCall:\n                {\n                    unsigned index = ByteCode[++IP];\n                    unsigned params = data->FuncPtrs[index].params;\n                    EAT(params, opcode);\n                    stack[stacktop-1].data->SetFuncNo(index);\n                    break;\n                }\n                case cPCall:\n                {\n                    unsigned index = ByteCode[++IP];\n                    unsigned params =\n                        data->FuncParsers[index]->data->varAmount;\n                    EAT(params, opcode);\n                    stack[stacktop-1].data->SetFuncNo(index);\n                    break;\n                }\n\n                // Converted to cMul on fly\n                case cDeg:\n                    ADDCONST(CONSTANT_DR);\n                    EAT(2, cMul);\n                    break;\n\n                // Converted to cMul on fly\n                case cRad:\n                    ADDCONST(CONSTANT_RD);\n                    EAT(2, cMul);\n                    break;\n\n                // Functions\n                default:\n                {\n                    //assert(opcode >= cAbs);\n                    unsigned funcno = opcode-cAbs;\n                    assert(funcno < sizeof(Functions)/sizeof(Functions[0]));\n                    const FuncDefinition& func = Functions[funcno];\n\n                    //const FuncDefinition& func = Functions[opcode-cAbs];\n\n                    unsigned paramcount = func.params;\n#ifndef DISABLE_EVAL\n                    if(opcode == cEval) paramcount = data->varAmount;\n#endif\n                    if(opcode == cSqrt)\n                    {\n                        // Converted on fly: sqrt(x) = x^0.5\n                        opcode = cPow;\n                        paramcount = 2;\n                        ADDCONST(0.5);\n                    }\n                    if(opcode == cExp)\n                    {\n                        // Converted on fly: exp(x) = CONSTANT_E^x\n\n                        opcode = cPow;\n                        paramcount = 2;\n                        // reverse the parameters... kludgey\n                        stack[stacktop] = stack[stacktop-1];\n                        stack[stacktop-1].SetImmed(CONSTANT_E);\n                        GROW(1);\n                    }\n                    bool do_inv = false;\n                    if(opcode == cCot) { do_inv = true; opcode = cTan; }\n                    if(opcode == cCsc) { do_inv = true; opcode = cSin; }\n                    if(opcode == cSec) { do_inv = true; opcode = cCos; }\n\n                    bool do_log10 = false;\n                    if(opcode == cLog10)\n                    {\n                        // Converted on fly: log10(x) = log(x) * CONSTANT_L10I\n                        opcode = cLog;\n                        do_log10 = true;\n                    }\n                    EAT(paramcount, opcode);\n                    if(do_log10)\n                    {\n                        ADDCONST(CONSTANT_L10I);\n                        EAT(2, cMul);\n                    }\n                    if(do_inv)\n                    {\n                        // Unary cMul, inverted. No need for \"1.0\"\n                        EAT(1, cMul);\n                        stack[stacktop-1].getp0().Invert();\n                    }\n                    break;\n                }\n            }\n        }\n        else\n        {\n            stack[stacktop].SetVar(opcode);\n            GROW(1);\n        }\n    }\n\n    if(!stacktop)\n    {\n        // ERROR: Stack does not have any values!\n        return;\n    }\n\n    --stacktop; // Ignore the last element, it is always nop (cAdd).\n\n    if(stacktop > 0)\n    {\n        // ERROR: Stack has too many values!\n        return;\n    }\n\n    // Okay, the tree is now stack[0]\n    *result = stack[0];\n}\n\nvoid FunctionParser::Optimize()\n{\n    copyOnWrite();\n\n    CodeTree tree;\n    MakeTree(&tree);\n\n    // Do all sorts of optimizations\n    tree.Optimize();\n    // Last changes before assembly\n    tree.FinalOptimize();\n\n    // Now rebuild from the tree.\n\n    vector<unsigned> byteCode;\n    vector<double> immed;\n\n#if 0\n    byteCode.resize(Comp.ByteCodeSize);\n    for(unsigned a=0; a<Comp.ByteCodeSize; ++a)byteCode[a] = Comp.ByteCode[a];\n\n    immed.resize(Comp.ImmedSize);\n    for(unsigned a=0; a<Comp.ImmedSize; ++a)immed[a] = Comp.Immed[a];\n#else\n    byteCode.clear(); immed.clear();\n    tree.Assemble(byteCode, immed);\n#endif\n\n    delete[] data->ByteCode; data->ByteCode = 0;\n    if((data->ByteCodeSize = byteCode.size()) > 0)\n    {\n        data->ByteCode = new unsigned[data->ByteCodeSize];\n        for(unsigned a=0; a<byteCode.size(); ++a)\n            data->ByteCode[a] = byteCode[a];\n    }\n\n    delete[] data->Immed; data->Immed = 0;\n    if((data->ImmedSize = immed.size()) > 0)\n    {\n        data->Immed = new double[data->ImmedSize];\n        for(unsigned a=0; a<immed.size(); ++a)\n            data->Immed[a] = immed[a];\n    }\n}\n\n\n#endif // #ifdef SUPPORT_OPTIMIZER\n"
  },
  {
    "path": "k3dsdk/expression/fptypes.h",
    "content": "//==============================\n// Function parser v2.8 by Warp\n//==============================\n// =============================================================================\n//   Usage license:\n// =============================================================================\n// \n// Copyright © 2003-2005 Juha Nieminen, Joel Yliluoma\n// \n//   This library is distributed under two distinct usage licenses depending\n// on the software (\"Software\" below) which uses the Function Parser library\n// (\"Library\" below).\n//   The reason for having two distinct usage licenses is to make the library\n// compatible with the GPL license while still being usable in other non-GPL\n// (even commercial) software. See fparser_license.txt for more details.\n\n// NOTE:\n// This file contains only internal types for the function parser library.\n// You don't need to include this file in your code. Include \"fparser.h\"\n// only.\n\n\n\nnamespace FUNCTIONPARSERTYPES\n{\n// The functions must be in alphabetical order:\n    enum OPCODE\n    {\n        cAbs, cAcos,\n#ifndef NO_ASINH\n        cAcosh,\n#endif\n        cAsin,\n#ifndef NO_ASINH\n        cAsinh,\n#endif\n        cAtan,\n        cAtan2,\n#ifndef NO_ASINH\n        cAtanh,\n#endif\n        cCeil, cCos, cCosh, cCot, cCsc,\n#ifndef DISABLE_EVAL\n        cEval,\n#endif\n        cExp, cFloor, cIf, cInt, cLog, cLog10, cMax, cMin,\n        cSec, cSin, cSinh, cSqrt, cTan, cTanh,\n\n// These do not need any ordering:\n        cImmed, cJump,\n        cNeg, cAdd, cSub, cMul, cDiv, cMod, cPow,\n        cEqual, cNEqual, cLess, cLessOrEq, cGreater, cGreaterOrEq,\n        cNot, cAnd, cOr,\n\n        cDeg, cRad,\n\n        cFCall, cPCall,\n\n#ifdef SUPPORT_OPTIMIZER\n        cVar, cDup, cInv,\n#endif\n\n        VarBegin\n    };\n\n    struct FuncDefinition\n    {\n        const char* name;\n        unsigned nameLength;\n        unsigned opcode;\n        unsigned params;\n\n        // This is basically strcmp(), but taking 'nameLength' as string\n        // length (not ending '\\0'):\n        bool operator<(const FuncDefinition& rhs) const\n        {\n            for(unsigned i = 0; i < nameLength; ++i)\n            {\n                if(i == rhs.nameLength) return false;\n                const char c1 = name[i], c2 = rhs.name[i];\n                if(c1 < c2) return true;\n                if(c2 < c1) return false;\n            }\n            return nameLength < rhs.nameLength;\n        }\n    };\n\n\n// This list must be in alphabetical order:\n    const FuncDefinition Functions[]=\n    {\n        { \"abs\", 3, cAbs, 1 },\n        { \"acos\", 4, cAcos, 1 },\n#ifndef NO_ASINH\n        { \"acosh\", 5, cAcosh, 1 },\n#endif\n        { \"asin\", 4, cAsin, 1 },\n#ifndef NO_ASINH\n        { \"asinh\", 5, cAsinh, 1 },\n#endif\n        { \"atan\", 4, cAtan, 1 },\n        { \"atan2\", 5, cAtan2, 2 },\n#ifndef NO_ASINH\n        { \"atanh\", 5, cAtanh, 1 },\n#endif\n        { \"ceil\", 4, cCeil, 1 },\n        { \"cos\", 3, cCos, 1 },\n        { \"cosh\", 4, cCosh, 1 },\n        { \"cot\", 3, cCot, 1 },\n        { \"csc\", 3, cCsc, 1 },\n#ifndef DISABLE_EVAL\n        { \"eval\", 4, cEval, 0 },\n#endif\n        { \"exp\", 3, cExp, 1 },\n        { \"floor\", 5, cFloor, 1 },\n        { \"if\", 2, cIf, 0 },\n        { \"int\", 3, cInt, 1 },\n        { \"log\", 3, cLog, 1 },\n        { \"log10\", 5, cLog10, 1 },\n        { \"max\", 3, cMax, 2 },\n        { \"min\", 3, cMin, 2 },\n        { \"sec\", 3, cSec, 1 },\n        { \"sin\", 3, cSin, 1 },\n        { \"sinh\", 4, cSinh, 1 },\n        { \"sqrt\", 4, cSqrt, 1 },\n        { \"tan\", 3, cTan, 1 },\n        { \"tanh\", 4, cTanh, 1 }\n    };\n}\n"
  },
  {
    "path": "k3dsdk/expression/parser.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/expression/parser.h>\n\nnamespace k3d\n{\n\nnamespace expression\n{\n\nparser::parser() :\n\tbase_t()\n{\n\tadd_constant(\"pi\", pi());\n}\n\n} // namespace expression\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/expression/parser.h",
    "content": "#ifndef K3DSDK_EXPRESSION_PARSER_H\n#define K3DSDK_EXPRESSION_PARSER_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/expression/basic_parser.h>\n\nnamespace k3d\n{\n\nnamespace expression\n{\n\n/// Refinement of basic_parser that provides a standard set of functions and constants\nclass parser :\n\tpublic basic_parser\n{\n\ttypedef basic_parser base_t;\n\npublic:\n\tparser();\n};\n\n} // namespace expression\n\n} // namespace k3d\n\n#endif // !K3DSDK_EXPRESSION_PARSER_H\n\n"
  },
  {
    "path": "k3dsdk/expression_grammar.h",
    "content": "#ifndef K3DSDK_EXPRESSION_GRAMMAR_H\n#define K3DSDK_EXPRESSION_GRAMMAR_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/spirit/include/classic_core.hpp>\nusing namespace boost::spirit::classic;\n\n#include <cmath>\n#include <functional>\n#include <iostream>\n#include <stack>\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\nnamespace expression\n{\n\n/// Defines a stack for holding intermediate values during parsing\ntypedef std::stack<double> stack_t;\n\n/// Inserts a parsed numeric value onto the stack\nclass push_number\n{\npublic:\n\tpush_number(stack_t& Stack) :\n\t\tm_stack(Stack)\n\t{\n\t}\n\n\tvoid operator()(const double Constant) const\n\t{\n\t\tm_stack.push(Constant);\n\t}\n\nprivate:\n\tstack_t& m_stack;\n};\n\n/// Inserts a constant numeric value onto the stack\nclass push_constant\n{\npublic:\n\tpush_constant(const double Constant, stack_t& Stack) :\n\t\tm_constant(Constant),\n\t\tm_stack(Stack)\n\t{\n\t}\n\n\ttemplate<typename iterator_t>\n\tvoid operator()(iterator_t, iterator_t) const\n\t{\n\t\tm_stack.push(m_constant);\n\t}\n\nprivate:\n\tconst double m_constant;\n\tstack_t& m_stack;\n};\n\n/// Applies a unary function to the top of the stack\ntemplate<typename operator_t>\nclass unary_operator_t\n{\npublic:\n\texplicit unary_operator_t(operator_t Operator, stack_t& Stack) :\n\t\tm_operator(Operator),\n\t\tm_stack(Stack)\n\t{\n\t}\n\n\ttemplate<typename iterator_t>\n\tvoid operator()(iterator_t, iterator_t) const\n\t{\n\t\tconst double rhs = m_stack.top(); m_stack.pop();\n\t\tm_stack.push(m_operator(rhs));\n\t}\n\nprivate:\n\toperator_t m_operator;\n\tstack_t& m_stack;\n};\n\n/// Convenience factory function for instantiating unary_operator_t objects\ntemplate<typename operator_t>\nunary_operator_t<operator_t> unary_operator(operator_t Operator, stack_t& Stack)\n{\n\treturn unary_operator_t<operator_t>(Operator, Stack);\n}\n\n/// Applies a binary function to the top two values of the stack\ntemplate<typename operator_t>\nclass binary_operator_t\n{\npublic:\n\texplicit binary_operator_t(operator_t Operator, stack_t& Stack) :\n\t\tm_operator(Operator),\n\t\tm_stack(Stack)\n\t{\n\t}\n\n\ttemplate<typename iterator_t>\n\tvoid operator()(iterator_t, iterator_t) const\n\t{\n\t\tconst double rhs = m_stack.top(); m_stack.pop();\n\t\tconst double lhs = m_stack.top(); m_stack.pop();\n\t\tm_stack.push(m_operator(lhs, rhs));\n\t}\n\nprivate:\n\toperator_t m_operator;\n\tstack_t& m_stack;\n};\n\n/// Convenience factory function for instantiating binary_operator_t objects\ntemplate<typename operator_t>\nbinary_operator_t<operator_t> binary_operator(operator_t Operator, stack_t& Stack)\n{\n\treturn binary_operator_t<operator_t>(Operator, Stack);\n}\n\n/// Encapsulates a grammar for evaluating basic mathematics expressions\nstruct expression_grammar :\n\tpublic grammar<expression_grammar>\n{\n\texpression_grammar(stack_t& Stack) :\n\t\tm_stack(Stack)\n\t{\n\t}\n\n\ttemplate<typename ScannerT>\n\tstruct definition\n\t{\n\t\tdefinition(const expression_grammar& self)\n\t\t{\n\t\t\tnumber = (real_p)[push_number(self.m_stack)];\n\n\t\t\tpi = (nocase_d[str_p(\"pi\")])[push_constant(3.14159265358979323846, self.m_stack)];\n\n\t\t\tconstant = number\n\t\t\t\t | pi;\n\n\t\t\tprimary_expression = constant\n\t\t\t                   | (ch_p('(') >> expression >> ch_p(')'))\n\t\t\t\t\t   | (ch_p('-') >> expression)[unary_operator(std::negate<double>(), self.m_stack)]\n\t\t\t\t\t   | (ch_p('+') >> expression);\n\n\t\t\tunary_function_arguments = ch_p('(') >> expression >> ch_p(')');\n\n\t\t\tbinary_function_arguments = ch_p('(') >> expression >> ch_p(',') >> expression >> ch_p(')');\n\n\t\t\tbuiltins = primary_expression\n\t\t\t\t | (str_p(\"abs\") >> unary_function_arguments)[unary_operator((double(*)(double))&fabs, self.m_stack)]\n\t\t\t\t | (str_p(\"acos\") >> unary_function_arguments)[unary_operator((double(*)(double))&acos, self.m_stack)]\n\t\t\t\t | (str_p(\"asin\") >> unary_function_arguments)[unary_operator((double(*)(double))&asin, self.m_stack)]\n\t\t\t\t | (str_p(\"atan\") >> unary_function_arguments)[unary_operator((double(*)(double))&atan, self.m_stack)]\n\t\t\t\t | (str_p(\"ceil\") >> unary_function_arguments)[unary_operator((double(*)(double))&ceil, self.m_stack)]\n\t\t\t\t | (str_p(\"cos\") >> unary_function_arguments)[unary_operator((double(*)(double))&cos, self.m_stack)]\n\t\t\t\t | (str_p(\"cosh\") >> unary_function_arguments)[unary_operator((double(*)(double))&cosh, self.m_stack)]\n\t\t\t\t | (str_p(\"exp\") >> unary_function_arguments)[unary_operator((double(*)(double))&exp, self.m_stack)]\n\t\t\t\t | (str_p(\"floor\") >> unary_function_arguments)[unary_operator((double(*)(double))&floor, self.m_stack)]\n\t\t\t\t | (str_p(\"log\") >> unary_function_arguments)[unary_operator((double(*)(double))&::log, self.m_stack)]\n\t\t\t\t | (str_p(\"log10\") >> unary_function_arguments)[unary_operator((double(*)(double))&log10, self.m_stack)]\n\t\t\t\t | (str_p(\"pow\") >> binary_function_arguments)[binary_operator((double(*)(double, double))&pow, self.m_stack)]\n\t\t\t\t | (str_p(\"sin\") >> unary_function_arguments)[unary_operator((double(*)(double))&sin, self.m_stack)]\n\t\t\t\t | (str_p(\"sinh\") >> unary_function_arguments)[unary_operator((double(*)(double))&sinh, self.m_stack)]\n\t\t\t\t | (str_p(\"sqrt\") >> unary_function_arguments)[unary_operator((double(*)(double))&sqrt, self.m_stack)]\n\t\t\t\t | (str_p(\"tan\") >> unary_function_arguments)[unary_operator((double(*)(double))&tan, self.m_stack)]\n\t\t\t\t | (str_p(\"tanh\") >> unary_function_arguments)[unary_operator((double(*)(double))&tanh, self.m_stack)];\n\n\t\t\tmultiplicative_expression = builtins >>\n\t\t\t\t*((ch_p('*') >> builtins)[binary_operator(std::multiplies<double>(), self.m_stack)]\n\t\t\t\t| (ch_p('/') >> builtins)[binary_operator(std::divides<double>(), self.m_stack)]);\n\n\t\t\tadditive_expression = multiplicative_expression >>\n\t\t\t\t*((ch_p('+') >> multiplicative_expression)[binary_operator(std::plus<double>(), self.m_stack)]\n\t\t\t\t| (ch_p('-') >> multiplicative_expression)[binary_operator(std::minus<double>(), self.m_stack)]);\n\n\t\t\texpression = (additive_expression);\n\t\t}\n\n\t\trule<ScannerT> const& start() const { return expression; }\n\t\trule<ScannerT> number, pi, constant, primary_expression, unary_function_arguments, binary_function_arguments, builtins, multiplicative_expression, additive_expression, expression;\n\t};\n\n\tstack_t& m_stack;\n};\n\n} //namespace expression\n\n} // namespace k3d\n\n#endif // !K3DSDK_EXPRESSION_GRAMMAR_H\n\n"
  },
  {
    "path": "k3dsdk/file_helpers.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/file_helpers.h>\n\nnamespace\n{\n\nclass endian_test\n{\npublic:\n\tendian_test()\n\t{\n\t\tm_union.Long = 1;\n\t}\n\n\tbool little_endian()\n\t{\n\t\treturn 1 == m_union.Char[0];\n\t}\n\nprivate:\n\tunion\n\t{\n\t\n\t\tlong Long;\n\t\tchar Char[sizeof(long)];\n\t\t\n\t} m_union;\n};\n\n} // namespace\n\nnamespace k3d\n{\n\nvoid getline(std::istream& Stream, std::ostream& LineBuffer)\n{\n\tfor(char c = Stream.get(); !Stream.eof(); c = Stream.get())\n\t{\n\t\tif('\\r' == c)\n\t\t{\n\t\t\tif('\\n' == Stream.peek())\n\t\t\t\tStream.get();\n\t\t\tbreak;\n\t\t}\n\t\telse if('\\n' == c)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\tLineBuffer << c;\n\t}\n}\n\nvoid getline(std::istream& Stream, std::string& LineBuffer)\n{\n\tstd::ostringstream buffer;\n\tgetline(Stream, buffer);\n\tLineBuffer = buffer.str();\n}\n\nbool big_endian()\n{\n\tstatic endian_test test;\n\treturn !test.little_endian();\n}\n\nbool little_endian()\n{\n\tstatic endian_test test;\n\treturn test.little_endian();\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/file_helpers.h",
    "content": "#ifndef K3DSDK_FILE_HELPERS_H\n#define K3DSDK_FILE_HELPERS_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <sstream>\n#include <string>\n\nnamespace k3d\n{\n\n/// Extracts a line from a stream; handles Posix/DOS linebreaks\nvoid getline(std::istream& Stream, std::ostream& LineBuffer);\n/// Extracts a line from a stream; handles Posix/DOS linebreaks\nvoid getline(std::istream& Stream, std::string& LineBuffer);\n\n/// Returns true if the architecture is big endian\nbool big_endian();\n/// Returns true if the architecture is little endian\nbool little_endian();\n\n} // namespace k3d\n\n#endif // !K3DSDK_FILE_HELPERS_H\n\n"
  },
  {
    "path": "k3dsdk/file_range.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/file_range.h>\n\n#include <cmath>\n#include <iomanip>\n#include <sstream>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// file_range\n\nfile_range::file_range() :\n\tdigits(0),\n\tbegin(0),\n\tend(0)\n{\n}\n\nsize_t file_range::max_file_count() const\n{\n\treturn static_cast<size_t>(std::pow(10.0, static_cast<double>(digits)));\n}\n\nconst filesystem::path file_range::file(const size_t N) const\n{\n\tstd::ostringstream buffer;\n\tbuffer << std::setfill('0') << std::setw(digits) << N;\n\n\treturn directory / filesystem::generic_path(before + ustring::from_utf8(buffer.str()) + after);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/file_range.h",
    "content": "#ifndef K3DSDK_FILE_RANGE_H\n#define K3DSDK_FILE_RANGE_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/path.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// file_range\n\n/// Encapsulates a half-open range of numbered files (useful for working with animation frames)\nclass file_range\n{\npublic:\n\t/// Creates an empty range\n\tfile_range();\n\n\t/// Returns the maximum number of files that can be represented by this range\n\tsize_t max_file_count() const;\n\t/// Returns the full path to the Nth file (N does *not* have to be within the valid range)\n\tconst filesystem::path file(const size_t N) const;\n\n\t/// Stores the directory that contains the range of files\n\tfilesystem::path directory;\n\t/// Stores an optional string that precedes the filename number\n\tustring before;\n\t/// Stores the number of digits used to number the filename\n\tsize_t digits;\n\t/// Stores an optional string that follows the filename number (including file extension, etc)\n\tustring after;\n\t/// Stores the first filename number in the range\n\tsize_t begin;\n\t/// Stores the one-past-last filename number in the range\n\tsize_t end;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_FILE_RANGE_H\n\n"
  },
  {
    "path": "k3dsdk/frames.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/frames.h>\n\n#include <algorithm>\n#include <iterator>\n\nnamespace k3d\n{\n\n///////////////////////////////////////////////////////////////////\n// frame\n\nframe::frame() :\n\tbegin_time(0),\n\tend_time(0)\n{\n}\n\nframe::frame(const double_t BeginTime, const double_t EndTime) :\n\tbegin_time(BeginTime),\n\tend_time(EndTime)\n{\n}\n\nframe::frame(const double_t BeginTime, const double_t EndTime, const filesystem::path& Destination) :\n\tbegin_time(BeginTime),\n\tend_time(EndTime),\n\tdestination(Destination)\n{\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const frame& RHS)\n{\n\tStream << \"frame: \" << RHS.begin_time << \" \" << RHS.end_time << \" \" << RHS.destination.native_console_string();\n\treturn Stream;\n}\n\n///////////////////////////////////////////////////////////////////\n// frames\n\nstd::ostream& operator<<(std::ostream& Stream, const frames& RHS)\n{\n\tstd::copy(RHS.begin(), RHS.end(), std::ostream_iterator<frame>(Stream, \"\\n\"));\n\treturn Stream;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/frames.h",
    "content": "#ifndef K3DSDK_FRAMES_H\n#define K3DSDK_FRAMES_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/path.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// frame\n\n/// Encapsulates an animation frame (a range of time) to be rendered\nclass frame\n{\npublic:\n\tframe();\n\tframe(const double_t BeginTime, const double_t EndTime);\n\tframe(const double_t BeginTime, const double_t EndTime, const filesystem::path& Destination);\n\n\t/// Stores the beginning of the frame\n\tdouble_t begin_time;\n\t/// Stores the end of the frame\n\tdouble_t end_time;\n\t/// Stores the filesystem location where the rendered frame should be stored\n\tfilesystem::path destination;\n};\n\nstd::ostream& operator<<(std::ostream& Stream, const frame& RHS);\n\n/////////////////////////////////////////////////////////////////////////////\n// frames\n\n/// Stores a collection of animation frames to be rendered\ntypedef std::vector<frame> frames;\n\nstd::ostream& operator<<(std::ostream& Stream, const frames& RHS);\n\n} // namespace k3d\n\n#endif // !K3DSDK_FRAMES_H\n\n"
  },
  {
    "path": "k3dsdk/fstream.h",
    "content": "#ifndef K3DSDK_FSTREAM_H\n#define K3DSDK_FSTREAM_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/path.h>\n#include <fstream>\n\nnamespace k3d\n{\n\nnamespace filesystem\n{\n\n/// Convenience wrapper for standard fstream that opens a k3d::filesystem::path in binary mode\ntemplate< class charT, class traits = std::char_traits<charT> >\nclass basic_ifstream : public std::basic_ifstream<charT,traits>\n{\npublic:\n\tbasic_ifstream()\n\t{\n\t}\n\n\texplicit basic_ifstream(const path& file, std::ios_base::openmode mode = std::ios_base::in | std::ios_base::binary) :\n\t\tstd::basic_ifstream<charT,traits>(file.native_filesystem_string().c_str(), mode)\n\t{\n\t}\n\n\tvirtual ~basic_ifstream()\n\t{\n\t}\n\n\tvoid open(const path& file, std::ios_base::openmode mode = std::ios_base::in | std::ios_base::binary)\n\t{\n\t\tstd::basic_ifstream<charT,traits>::open(file.native_filesystem_string().c_str(), mode);\n\t}\n};\n\n/// Convenience wrapper for standard fstream that opens a k3d::filesystem::path in binary mode\ntypedef basic_ifstream<char> ifstream;\n// typedef basic_ifstream<wchar_t> wifstream; // Why do you want to use this?  It isn't portable, and you should be using UTF-8!\n\n/// Convenience wrapper for standard fstream that opens a k3d::filesystem::path in binary mode\ntemplate < class charT, class traits = std::char_traits<charT> >\nclass basic_ofstream : public std::basic_ofstream<charT,traits>\n{\npublic:\n\tbasic_ofstream()\n\t{\n\t}\n\n\texplicit basic_ofstream(const path& file, std::ios_base::openmode mode = std::ios_base::out | std::ios_base::binary) :\n\t\tstd::basic_ofstream<charT,traits>(file.native_filesystem_string().c_str(), mode)\n\t{\n\t}\n\n\tvirtual ~basic_ofstream()\n\t{\n\t}\n\n\tvoid open(const path& file, std::ios_base::openmode mode = std::ios_base::out | std::ios_base::binary)\n\t{\n\t\tstd::basic_ofstream<charT,traits>::open(file.native_filesystem_string().c_str(), mode);\n\t}\n};\n\n/// Convenience wrapper for standard fstream that opens a k3d::filesystem::path in binary mode\ntypedef basic_ofstream<char> ofstream;\n// typedef basic_ofstream<wchar_t> wofstream; // Why do you want to use this?  It isn't portable, and you should be using UTF-8!\n\n/// Convenience wrapper for standard fstream that opens a k3d::filesystem::path in binary mode\ntemplate < class charT, class traits = std::char_traits<charT> >\nclass basic_fstream : public std::basic_fstream<charT,traits>\n{\npublic:\n\tbasic_fstream()\n\t{\n\t}\n\n\texplicit basic_fstream(const path& file, std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out | std::ios_base::binary) :\n\t\tstd::basic_fstream<charT,traits>(file.native_filesystem_string(), mode)\n\t{\n\t}\n\n\tvirtual ~basic_fstream()\n\t{\n\t}\n\n\tvoid open(const path& file, std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out | std::ios_base::binary)\n\t{\n\t\tstd::basic_fstream<charT,traits>::open(file.native_filesystem_string().c_str(), mode);\n\t}\n};\n\n/// Convenience wrapper for standard fstream that opens a k3d::filesystem::path in binary mode\ntypedef basic_fstream<char> fstream;\n// typedef basic_fstream<wchar_t> wfstream; // Why do you want to use this?  It isn't portable, and you should be using UTF-8!\n\n} // namespace filesystem\n\n} // namespace k3d\n\n#endif // !K3DSDK_FSTREAM_H\n"
  },
  {
    "path": "k3dsdk/geometric_operations.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief 2D geometry routines implementation\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/geometric_operations.h>\n#include <k3dsdk/line2.h>\n#include <k3dsdk/line3.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/plane.h>\n#include <k3dsdk/point2.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/vectors.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// intersect\n\nbool_t intersect(const plane& Plane, const line3& Line, point3& Intersection)\n{\n\t// Calculate the angle (dot product) between line and plane ...\n\tconst double_t theta = Plane.normal * Line.direction;\n\n\t// Make sure the line & plane aren't parallel ...\n\tif(0.0 == theta)\n\t\treturn false;\n\n\tconst double_t v0 = -(Plane.normal * to_vector(Line.point) + Plane.distance);\n\tconst double_t t = v0 / theta;\n\n\tIntersection = Line.point + (t * Line.direction);\n\treturn true;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// distance\n\ndouble_t distance(const point2& Point, const line2& Line)\n{\n\tconst double_t x0 = Point[0];\n\tconst double_t y0 = Point[1];\n\tconst double_t x1 = Line.point[0];\n\tconst double_t y1 = Line.point[1];\n\tconst double_t x2 = x1 + Line.direction[0];\n\tconst double_t y2 = y1 + Line.direction[1];\n\n\tconst double_t denominator = sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));\n\treturn_val_if_fail(denominator, 0.0); // Happens if the line direction is undefined\n\n\tconst double_t numerator = fabs((x2-x1) * (y1-y0) - (x1-x0) * (y2-y1));\n\treturn numerator / denominator;\n}\n\nbool_t intersect_lines(const point3& P1, const vector3& T1, const point3& P2, const vector3& T2, point3& Result)\n{\n\t// Code originally from Aqsis, http://www.aqsis.com\n\tvector3 px = T1 ^ to_vector( P1 - T2 );\n\tvector3 v = px ^ T1;\n\n\tdouble_t t = (P1 - P2) * v;\n\tdouble_t vw = v * T2;\n\tif ( ( vw * vw ) < 1.0e-07 )\n\t\treturn false;\n\n\tt /= vw;\n\tResult = P2 + (((P1 - P2) * v) / vw) * T2;\n\treturn true;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/geometric_operations.h",
    "content": "#ifndef K3DSDK_GEOMETRIC_OPERATIONS_H\n#define K3DSDK_GEOMETRIC_OPERATIONS_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief 2D geometry routines\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nclass line2;\nclass line3;\nclass plane;\nclass point2;\nclass point3;\nclass vector3;\n\n/// Returns the (minimum) distance between a point and a line in two dimensions\ndouble_t distance(const point2& Point, const line2& Line);\n/// Calculates the intersection of a plane with a line, returns false if the line and plane are parallel\nbool_t intersect(const plane& Plane, const line3& Line, point3& Intersection);\n\n/** Find the point at which two infinite lines intersect. The algorithm generates a plane from one of the lines and finds the intersection point between this plane and the other line.\n\t\\param P1 A point that lies on the first line\n\t\\param T1 Direction vector for the first line\n\t\\param P2 A point that lies on the second line\n\t\\param T2 Direction vector for the second line\n\t\\param Result Returns the intersection between the two lines\n\t\\result Returns true iff the lines intersect, false if they are parallel\n\t\\note Code originally from Aqsis, http://www.aqsis.com\n*/\nbool_t intersect_lines(const point3& P1, const vector3& T1, const point3& P2, const vector3& T2, point3& Result);\n\n} // namespace k3d\n\n#endif // !K3DSDK_GEOMETRIC_OPERATIONS_H\n\n"
  },
  {
    "path": "k3dsdk/geometry.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/selection_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace geometry\n{\n\nnamespace point_selection\n{\n\n//////////////////////////////////////////////////////////////////////\n// const_storage\n\nconst_storage::const_storage(\n\tconst mesh::indices_t& IndexBegin,\n\tconst mesh::indices_t& IndexEnd,\n\tconst mesh::selection_t& Weight\n\t\t) :\n\tindex_begin(IndexBegin),\n\tindex_end(IndexEnd),\n\tweight(Weight)\n{\n}\n\n//////////////////////////////////////////////////////////////////////\n// storage\n\nstorage::storage(\n\tmesh::indices_t& IndexBegin,\n\tmesh::indices_t& IndexEnd,\n\tmesh::selection_t& Weight\n\t\t) :\n\tindex_begin(IndexBegin),\n\tindex_end(IndexEnd),\n\tweight(Weight)\n{\n}\n\n//////////////////////////////////////////////////////////////////////\n// create\n\nstorage* create(k3d::selection::set& Set)\n{\n\tk3d::selection::storage& generic_storage = Set.create(\"point\");\n\n\tstorage* const result = new storage(\n\t\tgeneric_storage.structure.create<mesh::indices_t>(\"index_begin\"),\n\t\tgeneric_storage.structure.create<mesh::indices_t>(\"index_end\"),\n\t\tgeneric_storage.structure.create<mesh::selection_t>(\"weight\")\n\t\t);\n\n\treturn result;\n}\n\nstorage* create(k3d::selection::set& Set, const double_t Weight)\n{\n\tstorage* const result = create(Set);\n\tappend(*result, Weight);\n\treturn result;\n}\n\n//////////////////////////////////////////////////////////////////////\n// validate\n\nconst_storage* validate(const k3d::selection::storage& Storage)\n{\n\tif(Storage.type != \"point\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\tconst mesh::indices_t& index_begin = require_array<mesh::indices_t >(Storage, \"index_begin\");\n\t\tconst mesh::indices_t& index_end = require_array<mesh::indices_t>(Storage, \"index_end\");\n\t\tconst mesh::selection_t& weight = require_array<mesh::selection_t>(Storage, \"weight\");\n\n\t\trequire_array_size(Storage, index_end, \"index_end\", index_begin.size());\n\t\trequire_array_size(Storage, weight, \"weight\", index_begin.size());\n\n\t\treturn new const_storage(index_begin, index_end, weight);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\n//////////////////////////////////////////////////////////////////////\n// validate\n\nstorage* validate(k3d::selection::storage& Storage)\n{\n\tif(Storage.type != \"point\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\tmesh::indices_t& index_begin = require_array<mesh::indices_t>(Storage, \"index_begin\");\n\t\tmesh::indices_t& index_end = require_array<mesh::indices_t>(Storage, \"index_end\");\n\t\tmesh::selection_t& weight = require_array<mesh::selection_t>(Storage, \"weight\");\n\n\t\trequire_array_size(Storage, index_end, \"index_end\", index_begin.size());\n\t\trequire_array_size(Storage, weight, \"weight\", index_begin.size());\n\n\t\treturn new storage(index_begin, index_end, weight);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\n//////////////////////////////////////////////////////////////////////\n// append\n\nvoid append(storage& Storage, const double_t Weight)\n{\n\tStorage.index_begin.push_back(0);\n\tStorage.index_end.push_back(uint_t(-1));\n\tStorage.weight.push_back(Weight);\n}\n\n//////////////////////////////////////////////////////////////////////\n// append\n\nvoid append(storage& Storage, const uint_t Begin, const uint_t End, const double_t Weight)\n{\n\tStorage.index_begin.push_back(Begin);\n\tStorage.index_end.push_back(End);\n\tStorage.weight.push_back(Weight);\n}\n\n//////////////////////////////////////////////////////////////////////\n// merge\n\nvoid merge(const_storage& Storage, mesh& Mesh)\n{\n\tif(!Mesh.point_selection)\n\t\treturn;\n\n\tmesh::selection_t& point_selection = Mesh.point_selection.writable();\n\tconst uint_t point_selection_count = point_selection.size();\n\n\tconst uint_t record_count = Storage.index_begin.size();\n\tfor(uint_t record = 0; record != record_count; ++record)\n\t{\n\t\tconst uint_t index_begin = Storage.index_begin[record];\n\t\tconst uint_t index_end = std::max(index_begin, Storage.index_end[record]);\n\t\tconst double_t weight = Storage.weight[record];\n\n\t\tconst mesh::selection_t::iterator begin = point_selection.begin() + std::min(point_selection_count, index_begin);\n\t\tconst mesh::selection_t::iterator end = point_selection.begin() + std::min(point_selection_count, index_end);\n\n\t\tstd::fill(begin, end, weight);\n\t}\n}\n\n} // namespace point_selection\n\nnamespace primitive_selection\n{\n\n//////////////////////////////////////////////////////////////////////\n// const_storage\n\nconst_storage::const_storage(\n\tconst mesh::indices_t& PrimitiveBegin,\n\tconst mesh::indices_t& PrimitiveEnd,\n\tconst typed_array<k3d::int32_t>& PrimitiveSelectionType,\n\tconst mesh::indices_t& PrimitiveFirstRange,\n\tconst mesh::counts_t& PrimitiveRangeCount,\n\tconst mesh::indices_t& IndexBegin,\n\tconst mesh::indices_t& IndexEnd,\n\tconst mesh::selection_t& Weight\n\t\t) :\n\tprimitive_begin(PrimitiveBegin),\n\tprimitive_end(PrimitiveEnd),\n\tprimitive_selection_type(PrimitiveSelectionType),\n\tprimitive_first_range(PrimitiveFirstRange),\n\tprimitive_range_count(PrimitiveRangeCount),\n\tindex_begin(IndexBegin),\n\tindex_end(IndexEnd),\n\tweight(Weight)\n{\n}\n\n//////////////////////////////////////////////////////////////////////\n// storage\n\nstorage::storage(\n\tmesh::indices_t& PrimitiveBegin,\n\tmesh::indices_t& PrimitiveEnd,\n\ttyped_array<k3d::int32_t>& PrimitiveSelectionType,\n\tmesh::indices_t& PrimitiveFirstRange,\n\tmesh::counts_t& PrimitiveRangeCount,\n\tmesh::indices_t& IndexBegin,\n\tmesh::indices_t& IndexEnd,\n\tmesh::selection_t& Weight\n\t\t) :\n\tprimitive_begin(PrimitiveBegin),\n\tprimitive_end(PrimitiveEnd),\n\tprimitive_selection_type(PrimitiveSelectionType),\n\tprimitive_first_range(PrimitiveFirstRange),\n\tprimitive_range_count(PrimitiveRangeCount),\n\tindex_begin(IndexBegin),\n\tindex_end(IndexEnd),\n\tweight(Weight)\n{\n}\n\n//////////////////////////////////////////////////////////////////////\n// create\n\nstorage* create(k3d::selection::set& Set)\n{\n\tk3d::selection::storage& generic_storage = Set.create(\"primitive\");\n\n\tstorage* const result = new storage(\n\t\tgeneric_storage.structure.create<mesh::indices_t>(\"primitive_begin\"),\n\t\tgeneric_storage.structure.create<mesh::indices_t>(\"primitive_end\"),\n\t\tgeneric_storage.structure.create<typed_array<k3d::int32_t> >(\"primitive_selection_type\"),\n\t\tgeneric_storage.structure.create<mesh::indices_t>(\"primitive_first_range\"),\n\t\tgeneric_storage.structure.create<mesh::counts_t>(\"primitive_range_count\"),\n\t\tgeneric_storage.structure.create<mesh::indices_t>(\"index_begin\"),\n\t\tgeneric_storage.structure.create<mesh::indices_t>(\"index_end\"),\n\t\tgeneric_storage.structure.create<mesh::selection_t>(\"weight\")\n\t\t);\n\n\treturn result;\n}\n\nstorage* create(k3d::selection::set& Set, const uint_t PrimitiveBegin, const uint_t PrimitiveEnd, const int32_t SelectionType)\n{\n\tstorage* const result = create(Set);\n\n\tresult->primitive_begin.push_back(PrimitiveBegin);\n\tresult->primitive_end.push_back(PrimitiveEnd);\n\tresult->primitive_selection_type.push_back(SelectionType);\n\tresult->primitive_first_range.push_back(0);\n\tresult->primitive_range_count.push_back(0);\n\n\treturn result;\n}\n\nstorage* create(k3d::selection::set& Set, const int32_t SelectionType)\n{\n\tstorage* const result = create(Set);\n\n\tresult->primitive_begin.push_back(0);\n\tresult->primitive_end.push_back(uint_t(-1));\n\tresult->primitive_selection_type.push_back(SelectionType);\n\tresult->primitive_first_range.push_back(0);\n\tresult->primitive_range_count.push_back(0);\n\n\treturn result;\n}\n\n//////////////////////////////////////////////////////////////////////\n// validate\n\nconst_storage* validate(const k3d::selection::storage& Storage)\n{\n\tif(Storage.type != \"primitive\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\tconst mesh::indices_t& primitive_begin = require_array<mesh::indices_t>(Storage, \"primitive_begin\");\n\t\tconst mesh::indices_t& primitive_end = require_array<mesh::indices_t>(Storage, \"primitive_end\");\n\t\tconst typed_array<k3d::int32_t>& primitive_selection_type = require_array<typed_array<k3d::int32_t> >(Storage, \"primitive_selection_type\");\n\t\tconst mesh::indices_t& primitive_first_range = require_array<mesh::indices_t>(Storage, \"primitive_first_range\");\n\t\tconst mesh::indices_t& primitive_range_count = require_array<mesh::counts_t>(Storage, \"primitive_range_count\");\n\t\tconst mesh::indices_t& index_begin = require_array<mesh::indices_t>(Storage, \"index_begin\");\n\t\tconst mesh::indices_t& index_end = require_array<mesh::indices_t>(Storage, \"index_end\");\n\t\tconst mesh::selection_t& weight = require_array<mesh::selection_t>(Storage, \"weight\");\n\n\t\trequire_array_size(Storage, primitive_end, \"primitive_end\", primitive_begin.size());\n\t\trequire_array_size(Storage, primitive_selection_type, \"primitive_selection_type\", primitive_begin.size());\n\t\trequire_array_size(Storage, primitive_first_range, \"primitive_first_range\", primitive_begin.size());\n\t\trequire_array_size(Storage, primitive_range_count, \"primitive_range_count\", primitive_begin.size());\n\t\trequire_array_size(Storage, index_end, \"index_end\", index_begin.size());\n\t\trequire_array_size(Storage, weight, \"weight\", index_begin.size());\n\n\t\treturn new const_storage(primitive_begin, primitive_end, primitive_selection_type, primitive_first_range, primitive_range_count, index_begin, index_end, weight);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\n//////////////////////////////////////////////////////////////////////\n// validate\n\nstorage* validate(k3d::selection::storage& Storage)\n{\n\tif(Storage.type != \"primitive\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\tmesh::indices_t& primitive_begin = require_array<mesh::indices_t>(Storage, \"primitive_begin\");\n\t\tmesh::indices_t& primitive_end = require_array<mesh::indices_t>(Storage, \"primitive_end\");\n\t\ttyped_array<k3d::int32_t>& primitive_selection_type = require_array<typed_array<k3d::int32_t> >(Storage, \"primitive_selection_type\");\n\t\tmesh::indices_t& primitive_first_range = require_array<mesh::indices_t>(Storage, \"primitive_first_range\");\n\t\tmesh::indices_t& primitive_range_count = require_array<mesh::counts_t>(Storage, \"primitive_range_count\");\n\t\tmesh::indices_t& index_begin = require_array<mesh::indices_t>(Storage, \"index_begin\");\n\t\tmesh::indices_t& index_end = require_array<mesh::indices_t>(Storage, \"index_end\");\n\t\tmesh::selection_t& weight = require_array<mesh::selection_t>(Storage, \"weight\");\n\n\t\trequire_array_size(Storage, primitive_end, \"primitive_end\", primitive_begin.size());\n\t\trequire_array_size(Storage, primitive_selection_type, \"primitive_selection_type\", primitive_begin.size());\n\t\trequire_array_size(Storage, primitive_first_range, \"primitive_first_range\", primitive_begin.size());\n\t\trequire_array_size(Storage, primitive_range_count, \"primitive_range_count\", primitive_begin.size());\n\t\trequire_array_size(Storage, index_end, \"index_end\", index_begin.size());\n\t\trequire_array_size(Storage, weight, \"weight\", index_begin.size());\n\n\t\treturn new storage(primitive_begin, primitive_end, primitive_selection_type, primitive_first_range, primitive_range_count, index_begin, index_end, weight);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\n//////////////////////////////////////////////////////////////////////\n// append\n\nvoid append(storage& Storage, const uint_t PrimitiveBegin, const uint_t PrimitiveEnd, const int32_t SelectionType, const uint_t Begin, const uint_t End, const double_t Weight)\n{\n\tStorage.primitive_begin.push_back(PrimitiveBegin);\n\tStorage.primitive_end.push_back(PrimitiveEnd);\n\tStorage.primitive_selection_type.push_back(SelectionType);\n\tStorage.primitive_first_range.push_back(Storage.index_begin.size());\n\tStorage.primitive_range_count.push_back(1);\n\n\tStorage.index_begin.push_back(Begin);\n\tStorage.index_end.push_back(End);\n\tStorage.weight.push_back(Weight);\n}\n\nvoid append(storage& Storage, const int32_t SelectionType, const uint_t Begin, const uint_t End, const double_t Weight)\n{\n\tStorage.primitive_begin.push_back(0);\n\tStorage.primitive_end.push_back(uint_t(-1));\n\tStorage.primitive_selection_type.push_back(SelectionType);\n\tStorage.primitive_first_range.push_back(Storage.index_begin.size());\n\tStorage.primitive_range_count.push_back(1);\n\n\tStorage.index_begin.push_back(Begin);\n\tStorage.index_end.push_back(End);\n\tStorage.weight.push_back(Weight);\n}\n\nvoid append(storage& Storage, const int32_t SelectionType, const double_t Weight)\n{\n\tStorage.primitive_begin.push_back(0);\n\tStorage.primitive_end.push_back(uint_t(-1));\n\tStorage.primitive_selection_type.push_back(SelectionType);\n\tStorage.primitive_first_range.push_back(Storage.index_begin.size());\n\tStorage.primitive_range_count.push_back(1);\n\n\tStorage.index_begin.push_back(0);\n\tStorage.index_end.push_back(uint_t(-1));\n\tStorage.weight.push_back(Weight);\n}\n\nvoid append(storage& Storage, const uint_t Begin, const uint_t End, const double_t Weight)\n{\n\treturn_if_fail(Storage.primitive_begin.size());\n\n\tStorage.primitive_range_count.back() += 1;\n\n\tStorage.index_begin.push_back(Begin);\n\tStorage.index_end.push_back(End);\n\tStorage.weight.push_back(Weight);\n}\n\nvoid append(storage& Storage, const double_t Weight)\n{\n\treturn_if_fail(Storage.primitive_begin.size());\n\n\tStorage.primitive_range_count.back() += 1;\n\n\tStorage.index_begin.push_back(0);\n\tStorage.index_end.push_back(uint_t(-1));\n\tStorage.weight.push_back(Weight);\n}\n\n//////////////////////////////////////////////////////////////////////\n// merge\n\nclass merge_primitive_selection\n{\npublic:\n\tmerge_primitive_selection(const_storage& Storage, const string_t& PrimitiveSelectionType, const uint_t PrimitiveFirstRange, const uint_t PrimitiveRangeCount) :\n\t\tm_storage(Storage),\n\t\tm_primitive_selection_type(PrimitiveSelectionType),\n\t\tm_primitive_first_range(PrimitiveFirstRange),\n\t\tm_primitive_range_count(PrimitiveRangeCount)\n\t{\n\t}\n\n\tvoid operator()(const string_t& StructureName, table& Structure, const string_t& ArrayName, pipeline_data<array>& Array)\n\t{\n\t\tif(StructureName != m_primitive_selection_type)\n\t\t\treturn;\n\n\t\tif(Array->get_metadata_value(metadata::key::role()) != metadata::value::selection_role())\n\t\t\treturn;\n\n\t\tmesh::selection_t* const array = dynamic_cast<mesh::selection_t*>(&Array.writable());\n\t\tif(!array)\n\t\t{\n\t\t\tlog() << error << \"unexpected type for array [\" << ArrayName << \"] with k3d:selection-component = \" << m_primitive_selection_type << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tconst uint_t range_begin = m_primitive_first_range;\n\t\tconst uint_t range_end = range_begin + m_primitive_range_count;\n\t\tfor(uint_t range = range_begin; range != range_end; ++range)\n\t\t{\n\t\t\tstd::fill(\n\t\t\t\tarray->begin() + std::min(array->size(), m_storage.index_begin[range]),\n\t\t\t\tarray->begin() + std::min(array->size(), m_storage.index_end[range]),\n\t\t\t\tm_storage.weight[range]);\n\t\t}\n\t}\n\nprivate:\n\tconst_storage& m_storage;\n\tconst string_t& m_primitive_selection_type;\n\tconst uint_t m_primitive_first_range;\n\tconst uint_t m_primitive_range_count;\n};\n\nvoid merge(const_storage& Storage, mesh& Mesh)\n{\n\tconst uint_t mesh_primitive_count = static_cast<uint_t>(Mesh.primitives.size());\n\tconst uint_t component_count = Storage.primitive_begin.size();\n\tfor(uint_t component = 0; component != component_count; ++component)\n\t{\n\t\tconst uint_t primitive_begin = std::min(mesh_primitive_count, Storage.primitive_begin[component]);\n\t\tconst uint_t primitive_end = std::min(mesh_primitive_count, std::max(primitive_begin, Storage.primitive_end[component]));\n\t\tconst string_t primitive_selection_type = string_cast(static_cast<k3d::selection::type>(Storage.primitive_selection_type[component]));\n\t\tconst uint_t primitive_first_range = Storage.primitive_first_range[component];\n\t\tconst uint_t primitive_range_count = Storage.primitive_range_count[component];\n\n\t\tfor(uint_t primitive = primitive_begin; primitive != primitive_end; ++primitive)\n\t\t{\n\t\t\tmesh::visit_arrays(Mesh.primitives[primitive].writable(), merge_primitive_selection(Storage, primitive_selection_type, primitive_first_range, primitive_range_count));\n\t\t}\n\t}\n}\n\n} // namespace primitive_selection\n\nnamespace selection\n{\n\nk3d::selection::set create(const double_t Weight)\n{\n\tk3d::selection::set result;\n\n\tboost::scoped_ptr<point_selection::storage> point_selection_storage(point_selection::create(result));\n\tpoint_selection::append(*point_selection_storage, Weight);\n\n\tboost::scoped_ptr<primitive_selection::storage> primitive_selection_storage(primitive_selection::create(result));\n\tprimitive_selection::append(*primitive_selection_storage, k3d::selection::CONSTANT, Weight);\n\tprimitive_selection::append(*primitive_selection_storage, k3d::selection::CURVE, Weight);\n\tprimitive_selection::append(*primitive_selection_storage, k3d::selection::EDGE, Weight);\n\tprimitive_selection::append(*primitive_selection_storage, k3d::selection::FACE, Weight);\n\tprimitive_selection::append(*primitive_selection_storage, k3d::selection::PARAMETER, Weight);\n\tprimitive_selection::append(*primitive_selection_storage, k3d::selection::PATCH, Weight);\n\tprimitive_selection::append(*primitive_selection_storage, k3d::selection::SURFACE, Weight);\n\tprimitive_selection::append(*primitive_selection_storage, k3d::selection::VERTEX, Weight);\n\n\treturn result;\n}\n\nvoid merge(const k3d::selection::set& Set, mesh& Mesh)\n{\n\tfor(k3d::selection::set::const_iterator storage = Set.begin(); storage != Set.end(); ++storage)\n\t{\n\t\tboost::scoped_ptr<point_selection::const_storage> point_selection_storage(point_selection::validate(**storage));\n\t\tif(point_selection_storage)\n\t\t{\n\t\t\tpoint_selection::merge(*point_selection_storage, Mesh);\n\t\t\tcontinue;\n\t\t}\n\n\t\tboost::scoped_ptr<primitive_selection::const_storage> primitive_selection_storage(primitive_selection::validate(**storage));\n\t\tif(primitive_selection_storage)\n\t\t{\n\t\t\tprimitive_selection::merge(*primitive_selection_storage, Mesh);\n\t\t\tcontinue;\n\t\t}\n\t}\n}\n\n} // namespace selection\n\n} // namespace geometry\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/geometry.h",
    "content": "#ifndef K3DSDK_GEOMETRY_H\n#define K3DSDK_GEOMETRY_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace selection { class set; }\nnamespace selection { class storage; }\n\nnamespace geometry\n{\n\nnamespace point_selection\n{\n\n/// Gathers the member arrays of a point selection into a convenient package.\nclass const_storage\n{\npublic:\n\tconst_storage(\n\t\tconst mesh::indices_t& IndexBegin,\n\t\tconst mesh::indices_t& IndexEnd,\n\t\tconst mesh::selection_t& Weight\n\t\t);\n\n\tconst mesh::indices_t& index_begin;\n\tconst mesh::indices_t& index_end;\n\tconst mesh::selection_t& weight;\n};\n\n/// Gathers the member arrays of a mutable point selection into a convenient package.\nclass storage\n{\npublic:\n\tstorage(\n\t\tmesh::indices_t& IndexBegin,\n\t\tmesh::indices_t& IndexEnd,\n\t\tmesh::selection_t& Weight\n\t\t);\n\n\tmesh::indices_t& index_begin;\n\tmesh::indices_t& index_end;\n\tmesh::selection_t& weight;\n};\n\n/// Creates an empty point selection, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nstorage* create(k3d::selection::set& Set);\n/// Creates a point selection that assigns a uniform weight to all points, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nstorage* create(k3d::selection::set& Set, const double_t Weight);\n\n/// Tests the given storage to see if it is a valid point selection, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_storage* validate(const k3d::selection::storage& GenericStorage);\n\n/// Tests the given storage to see if it is a valid point selection, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nstorage* validate(k3d::selection::storage& GenericStorage);\n\n/// Appends a uniform weight to all points.  Useful for \"select all\" and \"deselect all\".\nvoid append(storage& Storage, const double_t Weight);\n\n/// Appends a weight to a range of points.\nvoid append(storage& Storage, const uint_t Begin, const uint_t End, const double_t Weight);\n\n/// Merges a point selection with the points in a mesh.\nvoid merge(const_storage& Storage, mesh& Mesh);\n\n} // namespace point_selection\n\nnamespace primitive_selection\n{\n\n/// Gathers the member arrays of a primitive selection into a convenient package.\nclass const_storage\n{\npublic:\n\tconst_storage(\n\t\tconst mesh::indices_t& PrimitiveBegin,\n\t\tconst mesh::indices_t& PrimitiveEnd,\n\t\tconst typed_array<k3d::int32_t>& PrimitiveSelectionType,\n\t\tconst mesh::indices_t& PrimitiveFirstRange,\n\t\tconst mesh::counts_t& PrimitiveRangeCount,\n\t\tconst mesh::indices_t& IndexBegin,\n\t\tconst mesh::indices_t& IndexEnd,\n\t\tconst mesh::selection_t& Weight\n\t\t);\n\n\tconst mesh::indices_t& primitive_begin;\n\tconst mesh::indices_t& primitive_end;\n\tconst typed_array<k3d::int32_t>& primitive_selection_type;\n\tconst mesh::indices_t& primitive_first_range;\n\tconst mesh::counts_t& primitive_range_count;\n\tconst mesh::indices_t& index_begin;\n\tconst mesh::indices_t& index_end;\n\tconst mesh::selection_t& weight;\n};\n\n/// Gathers the member arrays of a mutable primitive selection into a convenient package.\nclass storage\n{\npublic:\n\tstorage(\n\t\tmesh::indices_t& PrimitiveBegin,\n\t\tmesh::indices_t& PrimitiveEnd,\n\t\ttyped_array<k3d::int32_t>& PrimitiveSelectionType,\n\t\tmesh::indices_t& PrimitiveFirstRange,\n\t\tmesh::counts_t& PrimitiveRangeCount,\n\t\tmesh::indices_t& IndexBegin,\n\t\tmesh::indices_t& IndexEnd,\n\t\tmesh::selection_t& Weight\n\t\t);\n\n\tmesh::indices_t& primitive_begin;\n\tmesh::indices_t& primitive_end;\n\ttyped_array<k3d::int32_t>& primitive_selection_type;\n\tmesh::indices_t& primitive_first_range;\n\tmesh::counts_t& primitive_range_count;\n\tmesh::indices_t& index_begin;\n\tmesh::indices_t& index_end;\n\tmesh::selection_t& weight;\n};\n\n/// Creates an empty primitive selection, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nstorage* create(k3d::selection::set& Set);\n/// Creates a primitive selection that will apply to all primitives, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nstorage* create(k3d::selection::set& Set, const int32_t SelectionType);\n/// Creates a primitive selection that will apply to a range of primitives, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nstorage* create(k3d::selection::set& Set, const uint_t PrimitiveBegin, const uint_t PrimitiveEnd, const int32_t SelectionType);\n\n/// Tests the given storage to see if it is a valid primitive selection, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_storage* validate(const k3d::selection::storage& GenericStorage);\n\n/// Tests the given storage to see if it is a valid primitive selection, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nstorage* validate(k3d::selection::storage& GenericStorage);\n\n/// Appends a selection weight to a range of components within a range of primitives.\nvoid append(storage& Storage, const uint_t PrimitiveBegin, const uint_t PrimitiveEnd, const int32_t SelectionType, const uint_t Begin, const uint_t End, const double_t Weight);\n/// Appends a selection weight to a range of components across all primitives.\nvoid append(storage& Storage, const int32_t SelectionType, const uint_t Begin, const uint_t End, const double_t Weight);\n/// Appends a selection weight to all components across all primitives.\nvoid append(storage& Storage, const int32_t SelectionType, const double_t Weight);\n/// Appends a selection weight to a range of components.\nvoid append(storage& Storage, const uint_t Begin, const uint_t End, const double_t Weight);\n/// Appends a selection weight to all components.\nvoid append(storage& Storage, const double_t Weight);\n\n/// Merges a primitive selection with the primitives in a mesh.\nvoid merge(const_storage& Storage, mesh& Mesh);\n\n} // namespace primitive_selection\n\nnamespace selection\n{\n\n/// Returns a selection set that applies a uniform weight to every component.\n/// Useful for \"select all\" and \"deselect all\".\nk3d::selection::set create(const double_t Weight);\n/// Merges a selection set with the selections in a mesh.\nvoid merge(const k3d::selection::set& Set, mesh& Mesh);\n\n} // namespace selection\n\n} // namespace geometry\n\n} // namespace k3d\n\n#endif // !K3DSDK_GEOMETRY_H\n\n"
  },
  {
    "path": "k3dsdk/gil/boost/gil/extension/numeric/affine.hpp",
    "content": "/*\r\n  Copyright 2005-2007 Adobe Systems Incorporated\r\n  Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt\r\n  or a copy at http://opensource.adobe.com/licenses.html)\r\n*/\r\n\r\n/*************************************************************************************************/\r\n\r\n#ifndef GIL_AFFINE_HPP\r\n#define GIL_AFFINE_HPP\r\n\r\n#include <boost/gil/utilities.hpp>     // point2\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n/// \\file               \r\n/// \\brief support for affine transformations\r\n/// \\author Lubomir Bourdev and Hailin Jin \\n\r\n///         Adobe Systems Incorporated\r\n/// \\date   2005-2007 \\n September 21, 2006\r\n///\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nnamespace boost { namespace gil {\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n///\r\n/// Simple matrix to do 2D affine transformations. It is actually 3x3 but the last column is [0 0 1]\r\n///\r\n////////////////////////////////////////////////////////////////////////////////////////\r\ntemplate <typename T>\r\nclass matrix3x2 {\r\npublic:\r\n    matrix3x2() : a(1), b(0), c(0), d(1), e(0), f(0) {}\r\n    matrix3x2(T A, T B, T C, T D, T E, T F) : a(A),b(B),c(C),d(D),e(E),f(F) {}\r\n    matrix3x2(const matrix3x2& mat) : a(mat.a), b(mat.b), c(mat.c), d(mat.d), e(mat.e), f(mat.f) {}\r\n    matrix3x2& operator=(const matrix3x2& m)           { a=m.a; b=m.b; c=m.c; d=m.d; e=m.e; f=m.f; return *this; }\r\n\r\n    matrix3x2& operator*=(const matrix3x2& m)          { (*this) = (*this)*m; return *this; }\r\n\r\n    static matrix3x2 get_rotate(T rads)                { T c=std::cos(rads); T s=std::sin(rads); return matrix3x2(c,s,-s,c,0,0); }\r\n    static matrix3x2 get_translate(const point2<T>& t) { return matrix3x2(1  ,0,0,1  ,t.x,t.y); }\r\n    static matrix3x2 get_translate(T x, T y)           { return matrix3x2(1  ,0,0,1  ,x,  y  ); }\r\n    static matrix3x2 get_scale    (const point2<T>& s) { return matrix3x2(s.x,0,0,s.y,0  ,0  ); }\r\n    static matrix3x2 get_scale    (T x, T y)           { return matrix3x2(x,  0,0,y,  0  ,0  ); }\r\n    static matrix3x2 get_scale    (T s)                { return matrix3x2(s  ,0,0,s  ,0  ,0  ); }\r\n\r\n    T a,b,c,d,e,f;\r\n};\r\n\r\ntemplate <typename T> BOOST_FORCEINLINE\r\nmatrix3x2<T> operator*(const matrix3x2<T>& m1, const matrix3x2<T>& m2) {\r\n    return matrix3x2<T>(\r\n                m1.a * m2.a + m1.b * m2.c,\r\n                m1.a * m2.b + m1.b * m2.d,\r\n                m1.c * m2.a + m1.d * m2.c,\r\n                m1.c * m2.b + m1.d * m2.d,\r\n                m1.e * m2.a + m1.f * m2.c + m2.e,\r\n                m1.e * m2.b + m1.f * m2.d + m2.f );\r\n}\r\n\r\ntemplate <typename T, typename F> BOOST_FORCEINLINE\r\npoint2<F> operator*(const point2<T>& p, const matrix3x2<F>& m) {\r\n    return point2<F>(m.a*p.x + m.c*p.y + m.e, m.b*p.x + m.d*p.y + m.f);\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n/// Define affine mapping that transforms the source coordinates by the affine transformation\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n/*\r\ntemplate <typename MapFn>\r\nconcept MappingFunctionConcept {\r\n    typename mapping_traits<MapFn>::result_type;   where PointNDConcept<result_type>;\r\n\r\n    template <typename Domain> { where PointNDConcept<Domain> }\r\n    result_type transform(MapFn&, const Domain& src); \r\n};\r\n*/\r\n\r\ntemplate <typename T> struct mapping_traits;\r\n\r\ntemplate <typename F>\r\nstruct mapping_traits<matrix3x2<F> > {\r\n    typedef point2<F> result_type;\r\n};\r\n\r\ntemplate <typename F, typename F2> BOOST_FORCEINLINE\r\npoint2<F> transform(const matrix3x2<F>& mat, const point2<F2>& src) { return src * mat; }\r\n\r\n} }  // namespace boost::gil\r\n\r\n#endif\r\n"
  },
  {
    "path": "k3dsdk/gil/boost/gil/extension/numeric/algorithm.hpp",
    "content": "/*\r\n    Copyright 2005-2007 Adobe Systems Incorporated\r\n    Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt\r\n    or a copy at http://opensource.adobe.com/licenses.html)\r\n*/\r\n\r\n/*************************************************************************************************/\r\n\r\n#ifndef GIL_NUMERIC_ALGORITHM_HPP\r\n#define GIL_NUMERIC_ALGORITHM_HPP\r\n\r\n/*!\r\n/// \\file               \r\n/// \\brief Numeric algorithms\r\n/// \\author Hailin Jin and Lubomir Bourdev \\n\r\n///         Adobe Systems Incorporated\r\n/// \\date   2005-2007 \\n Last updated on February 6, 2007\r\n*/\r\n\r\n#include <cassert>\r\n#include <iterator>\r\n#include <algorithm>\r\n#include <numeric>\r\n#include <boost/version.hpp>\n#if BOOST_VERSION < 106900\n#include <boost/gil/gil_config.hpp>\n#else\n#include <boost/gil.hpp>\n#endif\n#include <boost/gil/pixel_iterator.hpp>\r\n#include <boost/gil/metafunctions.hpp>\r\n\r\nnamespace boost { namespace gil {\r\n\r\n/// \\brief Returns the reference proxy associated with a type that has a \\p \"reference\" member typedef.\r\n///\r\n/// The reference proxy is the reference type, but with stripped-out C++ reference. It models PixelConcept\r\ntemplate <typename T>\r\nstruct pixel_proxy : public remove_reference<typename T::reference> {};\r\n\r\n/// \\brief std::for_each for a pair of iterators\r\ntemplate <typename Iterator1,typename Iterator2,typename BinaryFunction>\r\nBinaryFunction for_each(Iterator1 first1,Iterator1 last1,Iterator2 first2,BinaryFunction f) {\r\n    while(first1!=last1)\r\n        f(*first1++,*first2++);\r\n    return f;\r\n}\r\n\r\ntemplate <typename SrcIterator,typename DstIterator>\r\ninline DstIterator assign_pixels(SrcIterator src,SrcIterator src_end,DstIterator dst) {\r\n    for_each(src,src_end,dst,pixel_assigns_t<typename pixel_proxy<typename std::iterator_traits<SrcIterator>::value_type>::type,\r\n                                             typename pixel_proxy<typename std::iterator_traits<DstIterator>::value_type>::type>());             \r\n    return dst+(src_end-src);\r\n}\r\n\r\nnamespace detail {\r\ntemplate <std::size_t Size>\r\nstruct inner_product_k_t {\r\n    template <class _InputIterator1, class _InputIterator2, class _Tp,\r\n              class _BinaryOperation1, class _BinaryOperation2>\r\n    static _Tp apply(_InputIterator1 __first1, \r\n                     _InputIterator2 __first2, _Tp __init, \r\n                     _BinaryOperation1 __binary_op1,\r\n                     _BinaryOperation2 __binary_op2) {\r\n        __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));\r\n        return inner_product_k_t<Size-1>::template apply(__first1+1,__first2+1,__init,\r\n                                                         __binary_op1, __binary_op2);\r\n    }\r\n};\r\n\r\ntemplate <>\r\nstruct inner_product_k_t<0> {\r\n    template <class _InputIterator1, class _InputIterator2, class _Tp,\r\n              class _BinaryOperation1, class _BinaryOperation2>\r\n    static _Tp apply(_InputIterator1 __first1, \r\n                     _InputIterator2 __first2, _Tp __init, \r\n                     _BinaryOperation1 __binary_op1,\r\n                     _BinaryOperation2 __binary_op2) {\r\n        return __init;\r\n    }\r\n};\r\n} // namespace detail\r\n\r\n/// static version of std::inner_product\r\ntemplate <std::size_t Size,\r\n          class _InputIterator1, class _InputIterator2, class _Tp,\r\n          class _BinaryOperation1, class _BinaryOperation2>\r\nBOOST_FORCEINLINE\r\n_Tp inner_product_k(_InputIterator1 __first1, \r\n                    _InputIterator2 __first2,\r\n                    _Tp __init, \r\n                    _BinaryOperation1 __binary_op1,\r\n                    _BinaryOperation2 __binary_op2) {\r\n    return detail::inner_product_k_t<Size>::template apply(__first1,__first2,__init,\r\n                                                           __binary_op1, __binary_op2);\r\n}\r\n\r\n/// \\brief 1D un-guarded correlation with a variable-size kernel\r\ntemplate <typename PixelAccum,typename SrcIterator,typename KernelIterator,typename Integer,typename DstIterator>\r\ninline DstIterator correlate_pixels_n(SrcIterator src_begin,SrcIterator src_end,\r\n                                      KernelIterator ker_begin,Integer ker_size,\r\n                                      DstIterator dst_begin) {\r\n    typedef typename pixel_proxy<typename std::iterator_traits<SrcIterator>::value_type>::type PIXEL_SRC_REF;\r\n    typedef typename pixel_proxy<typename std::iterator_traits<DstIterator>::value_type>::type PIXEL_DST_REF;\r\n    typedef typename std::iterator_traits<KernelIterator>::value_type kernel_type;\r\n    PixelAccum acc_zero; pixel_zeros_t<PixelAccum>()(acc_zero);\r\n    while(src_begin!=src_end) {\r\n        pixel_assigns_t<PixelAccum,PIXEL_DST_REF>()(\r\n            std::inner_product(src_begin,src_begin+ker_size,ker_begin,acc_zero,\r\n                               pixel_plus_t<PixelAccum,PixelAccum,PixelAccum>(),\r\n                               pixel_multiplies_scalar_t<PIXEL_SRC_REF,kernel_type,PixelAccum>()),\r\n            *dst_begin);\r\n        ++src_begin; ++dst_begin;\r\n    }\r\n    return dst_begin;\r\n}\r\n\r\n/// \\brief 1D un-guarded correlation with a fixed-size kernel\r\ntemplate <std::size_t Size,typename PixelAccum,typename SrcIterator,typename KernelIterator,typename DstIterator>\r\ninline DstIterator correlate_pixels_k(SrcIterator src_begin,SrcIterator src_end,\r\n                                      KernelIterator ker_begin,\r\n                                      DstIterator dst_begin) {\r\n    typedef typename pixel_proxy<typename std::iterator_traits<SrcIterator>::value_type>::type PIXEL_SRC_REF;\r\n    typedef typename pixel_proxy<typename std::iterator_traits<DstIterator>::value_type>::type PIXEL_DST_REF;\r\n    typedef typename std::iterator_traits<KernelIterator>::value_type kernel_type;\r\n    PixelAccum acc_zero; pixel_zeros_t<PixelAccum>()(acc_zero);\r\n    while(src_begin!=src_end) {\r\n        pixel_assigns_t<PixelAccum,PIXEL_DST_REF>()(\r\n            inner_product_k<Size>(src_begin,ker_begin,acc_zero,\r\n                                  pixel_plus_t<PixelAccum,PixelAccum,PixelAccum>(),\r\n                                  pixel_multiplies_scalar_t<PIXEL_SRC_REF,kernel_type,PixelAccum>()),\r\n            *dst_begin);\r\n        ++src_begin; ++dst_begin;\r\n    }\r\n    return dst_begin;\r\n}\r\n\r\n/// \\brief destination is set to be product of the source and a scalar\r\ntemplate <typename PixelAccum,typename SrcView,typename Scalar,typename DstView>\r\ninline void view_multiplies_scalar(const SrcView& src,const Scalar& scalar,const DstView& dst) {\r\n    assert(src.dimensions()==dst.dimensions());\r\n    typedef typename pixel_proxy<typename SrcView::value_type>::type PIXEL_SRC_REF;\r\n    typedef typename pixel_proxy<typename DstView::value_type>::type PIXEL_DST_REF;\r\n    int height=src.height();\r\n    for(int rr=0;rr<height;++rr) {\r\n        typename SrcView::x_iterator it_src=src.row_begin(rr);\r\n        typename DstView::x_iterator it_dst=dst.row_begin(rr);\r\n        typename SrcView::x_iterator it_src_end=src.row_end(rr);\r\n        while(it_src!=it_src_end) {\r\n            pixel_assigns_t<PixelAccum,PIXEL_DST_REF>()(\r\n                pixel_multiplies_scalar_t<PIXEL_SRC_REF,Scalar,PixelAccum>()(*it_src,scalar),\r\n                *it_dst);\r\n            ++it_src; ++it_dst;\r\n        }\r\n    }\r\n}\r\n\r\n} }  // namespace boost::gil\r\n\r\n#endif\r\n"
  },
  {
    "path": "k3dsdk/gil/boost/gil/extension/numeric/channel_numeric_operations.hpp",
    "content": "/*\r\n    Copyright 2005-2007 Adobe Systems Incorporated\r\n    Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt\r\n    or a copy at http://opensource.adobe.com/licenses.html)\r\n*/\r\n\r\n/*************************************************************************************************/\r\n\r\n#ifndef GIL_CHANNEL_NUMERIC_OPERATIONS_HPP\r\n#define GIL_CHANNEL_NUMERIC_OPERATIONS_HPP\r\n\r\n/*!\r\n/// \\file               \r\n/// \\brief Structures for channel-wise numeric operations\r\n/// \\author Hailin Jin and Lubomir Bourdev \\n\r\n///         Adobe Systems Incorporated\r\n/// \\date   2005-2007 \\n Last updated on September 30, 2006\r\n/// Currently defined structures:\r\n///    channel_plus_t (+), channel_minus_t (-),\r\n///    channel_multiplies_t (*), channel_divides_t (/),\r\n///    channel_plus_scalar_t (+s), channel_minus_scalar_t (-s),\r\n///    channel_multiplies_scalar_t (*s), channel_divides_scalar_t (/s),\r\n///    channel_halves_t (/=2), channel_zeros_t (=0), channel_assigns_t (=)\r\n*/\r\n\r\n#include <functional>\r\n#include <boost/version.hpp>\n#if BOOST_VERSION < 106900\n#include <boost/gil/gil_config.hpp>\n#else\n#include <boost/gil.hpp>\n#endif\n#include <boost/gil/channel.hpp>\r\n\r\nnamespace boost { namespace gil {\r\n\r\n/// \\ingroup ChannelNumericOperations\r\n/// structure for adding one channel to another\r\n/// this is a generic implementation; user should specialize it for better performance\r\ntemplate <typename Channel1,typename Channel2,typename ChannelR>\r\nstruct channel_plus_t : public std::binary_function<Channel1,Channel2,ChannelR> {\r\n    ChannelR operator()(typename channel_traits<Channel1>::const_reference ch1,\r\n                        typename channel_traits<Channel2>::const_reference ch2) const {\r\n        return ChannelR(ch1)+ChannelR(ch2);\r\n    }\r\n};\r\n\r\n/// \\ingroup ChannelNumericOperations\r\n/// structure for subtracting one channel from another\r\n/// this is a generic implementation; user should specialize it for better performance\r\ntemplate <typename Channel1,typename Channel2,typename ChannelR>\r\nstruct channel_minus_t : public std::binary_function<Channel1,Channel2,ChannelR> {\r\n    ChannelR operator()(typename channel_traits<Channel1>::const_reference ch1,\r\n                        typename channel_traits<Channel2>::const_reference ch2) const {\r\n        return ChannelR(ch1)-ChannelR(ch2);\r\n    }\r\n};\r\n\r\n/// \\ingroup ChannelNumericOperations\r\n/// structure for multiplying one channel to another\r\n/// this is a generic implementation; user should specialize it for better performance\r\ntemplate <typename Channel1,typename Channel2,typename ChannelR>\r\nstruct channel_multiplies_t : public std::binary_function<Channel1,Channel2,ChannelR> {\r\n    ChannelR operator()(typename channel_traits<Channel1>::const_reference ch1,\r\n                        typename channel_traits<Channel2>::const_reference ch2) const {\r\n        return ChannelR(ch1)*ChannelR(ch2);\r\n    }\r\n};\r\n\r\n/// \\ingroup ChannelNumericOperations\r\n/// structure for dividing channels\r\n/// this is a generic implementation; user should specialize it for better performance\r\ntemplate <typename Channel1,typename Channel2,typename ChannelR>\r\nstruct channel_divides_t : public std::binary_function<Channel1,Channel2,ChannelR> {\r\n    ChannelR operator()(typename channel_traits<Channel1>::const_reference ch1,\r\n                        typename channel_traits<Channel2>::const_reference ch2) const {\r\n        return ChannelR(ch1)/ChannelR(ch2);\r\n    }\r\n};\r\n\r\n/// \\ingroup ChannelNumericOperations\r\n/// structure for adding a scalar to a channel\r\n/// this is a generic implementation; user should specialize it for better performance\r\ntemplate <typename Channel,typename Scalar,typename ChannelR>\r\nstruct channel_plus_scalar_t : public std::binary_function<Channel,Scalar,ChannelR> {\r\n    ChannelR operator()(typename channel_traits<Channel>::const_reference ch,\r\n                        const Scalar& s) const {\r\n        return ChannelR(ch)+ChannelR(s);\r\n    }\r\n};\r\n\r\n/// \\ingroup ChannelNumericOperations\r\n/// structure for subtracting a scalar from a channel\r\n/// this is a generic implementation; user should specialize it for better performance\r\ntemplate <typename Channel,typename Scalar,typename ChannelR>\r\nstruct channel_minus_scalar_t : public std::binary_function<Channel,Scalar,ChannelR> {\r\n    ChannelR operator()(typename channel_traits<Channel>::const_reference ch,\r\n                        const Scalar& s) const {\r\n        return ChannelR(ch-s);\r\n    }\r\n};\r\n\r\n/// \\ingroup ChannelNumericOperations\r\n/// structure for multiplying a scalar to one channel\r\n/// this is a generic implementation; user should specialize it for better performance\r\ntemplate <typename Channel,typename Scalar,typename ChannelR>\r\nstruct channel_multiplies_scalar_t : public std::binary_function<Channel,Scalar,ChannelR> {\r\n    ChannelR operator()(typename channel_traits<Channel>::const_reference ch,\r\n                        const Scalar& s) const {\r\n        return ChannelR(ch)*ChannelR(s);\r\n    }\r\n};\r\n\r\n/// \\ingroup ChannelNumericOperations\r\n/// structure for dividing a channel by a scalar\r\n/// this is a generic implementation; user should specialize it for better performance\r\ntemplate <typename Channel,typename Scalar,typename ChannelR>\r\nstruct channel_divides_scalar_t : public std::binary_function<Channel,Scalar,ChannelR> {\r\n    ChannelR operator()(typename channel_traits<Channel>::const_reference ch,\r\n                        const Scalar& s) const {\r\n        return ChannelR(ch)/ChannelR(s);\r\n    }\r\n};\r\n\r\n/// \\ingroup ChannelNumericOperations\r\n/// structure for halving a channel\r\n/// this is a generic implementation; user should specialize it for better performance\r\ntemplate <typename Channel>\r\nstruct channel_halves_t : public std::unary_function<Channel,Channel> {\r\n    typename channel_traits<Channel>::reference\r\n    operator()(typename channel_traits<Channel>::reference ch) const {\r\n        return ch/=2.0;\r\n    }\r\n};\r\n\r\n/// \\ingroup ChannelNumericOperations\r\n/// structure for setting a channel to zero\r\n/// this is a generic implementation; user should specialize it for better performance\r\ntemplate <typename Channel>\r\nstruct channel_zeros_t : public std::unary_function<Channel,Channel> {\r\n    typename channel_traits<Channel>::reference\r\n    operator()(typename channel_traits<Channel>::reference ch) const {\r\n        return ch=Channel(0);\r\n    }\r\n};\r\n\r\n/// \\ingroup ChannelNumericOperations\r\n/// structure for assigning one channel to another\r\n/// this is a generic implementation; user should specialize it for better performance\r\ntemplate <typename Channel1,typename Channel2>\r\nstruct channel_assigns_t : public std::binary_function<Channel1,Channel2,Channel2> {\r\n    typename channel_traits<Channel2>::reference\r\n    operator()(typename channel_traits<Channel1>::const_reference ch1,\r\n               typename channel_traits<Channel2>::reference ch2) const {\r\n        return ch2=Channel2(ch1);\r\n    }\r\n};\r\n\r\n} }  // namespace boost::gil\r\n\r\n#endif\r\n"
  },
  {
    "path": "k3dsdk/gil/boost/gil/extension/numeric/convolve.hpp",
    "content": "/*\r\n    Copyright 2005-2007 Adobe Systems Incorporated\r\n    Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt\r\n    or a copy at http://opensource.adobe.com/licenses.html)\r\n*/\r\n\r\n/*************************************************************************************************/\r\n\r\n#ifndef GIL_CONVOLVE_HPP\r\n#define GIL_CONVOLVE_HPP\r\n\r\n/*!\r\n/// \\file \r\n/// \\brief 2D seperable convolutions and correlations\r\n///\r\n/// \\author Hailin Jin and Lubomir Bourdev \\n\r\n///         Adobe Systems Incorporated\r\n/// \\date   2005-2007 \\n Last updated on February 6, 2007\r\n*/\r\n\r\n\r\n#include <cstddef>\r\n#include <cassert>\r\n#include <algorithm>\r\n#include <vector>\r\n#include <functional>\r\n#include <boost/version.hpp>\n#if BOOST_VERSION < 106900\n#include <boost/gil/gil_config.hpp>\n#else\n#include <boost/gil.hpp>\n#endif\n#include <boost/gil/image_view_factory.hpp>\r\n#include <boost/gil/algorithm.hpp>\r\n#include <boost/gil/metafunctions.hpp>\r\n#include \"pixel_numeric_operations.hpp\"\r\n#include \"algorithm.hpp\"\r\n\r\nnamespace boost { namespace gil {\r\n\r\n/// \\ingroup ImageAlgorithms\r\n/// Boundary options for 1D correlations/convolutions\r\nenum convolve_boundary_option  {\r\n    convolve_option_output_ignore,  /// do nothing to the output\r\n    convolve_option_output_zero,    /// set the output to zero\r\n    convolve_option_extend_padded,  /// assume the source boundaries to be padded already \r\n    convolve_option_extend_zero,    /// assume the source boundaries to be zero\r\n    convolve_option_extend_constant /// assume the source boundaries to be the boundary value\r\n};\r\n\r\nnamespace detail {\r\n/// compute the correlation of 1D kernel with the rows of an image\r\ntemplate <typename PixelAccum,typename SrcView,typename Kernel,typename DstView,typename Correlator>\r\nvoid correlate_rows_imp(const SrcView& src, const Kernel& ker, const DstView& dst,\r\n                        convolve_boundary_option option,\r\n                        Correlator correlator) {\r\n    assert(src.dimensions()==dst.dimensions());\r\n    assert(ker.size()!=0);\r\n\r\n    typedef typename pixel_proxy<typename SrcView::value_type>::type PIXEL_SRC_REF;\r\n    typedef typename pixel_proxy<typename DstView::value_type>::type PIXEL_DST_REF;\r\n    typedef typename Kernel::value_type kernel_type;\r\n\r\n    if(ker.size()==1) {//reduces to a multiplication\r\n        view_multiplies_scalar<PixelAccum>(src,*ker.begin(),dst);\r\n        return;\r\n    }\r\n\r\n    int width=src.width(),height=src.height();\r\n    PixelAccum acc_zero; pixel_zeros_t<PixelAccum>()(acc_zero);\r\n    if (width==0) return;\r\n    if (option==convolve_option_output_ignore || option==convolve_option_output_zero) {\r\n        typename DstView::value_type dst_zero; pixel_assigns_t<PixelAccum,PIXEL_DST_REF>()(acc_zero,dst_zero);\r\n        if (width<(int)ker.size()) {\r\n            if (option==convolve_option_output_zero)\r\n                fill_pixels(dst,dst_zero);\r\n        } else {\r\n            std::vector<PixelAccum> buffer(width);\r\n            for(int rr=0;rr<height;++rr) {\r\n                assign_pixels(src.row_begin(rr),src.row_end(rr),&buffer.front());\r\n                typename DstView::x_iterator it_dst=dst.row_begin(rr);\r\n                if (option==convolve_option_output_zero)\r\n                    std::fill_n(it_dst,ker.left_size(),dst_zero);\r\n                it_dst+=ker.left_size();\r\n                correlator(&buffer.front(),&buffer.front()+width+1-ker.size(),\r\n                           ker.begin(),it_dst);\r\n                it_dst+=width+1-ker.size();\r\n                if (option==convolve_option_output_zero) \r\n                    std::fill_n(it_dst,ker.right_size(),dst_zero);\r\n            }\r\n        }\r\n    } else {\r\n        std::vector<PixelAccum> buffer(width+ker.size()-1);\r\n        for(int rr=0;rr<height;++rr) {\r\n            PixelAccum* it_buffer=&buffer.front();\r\n            if        (option==convolve_option_extend_padded) {\r\n                assign_pixels(src.row_begin(rr)-ker.left_size(),\r\n                              src.row_end(rr)+ker.right_size(),\r\n                              it_buffer);\r\n            } else if (option==convolve_option_extend_zero) {\r\n                std::fill_n(it_buffer,ker.left_size(),acc_zero);\r\n                it_buffer+=ker.left_size();\r\n                assign_pixels(src.row_begin(rr),src.row_end(rr),it_buffer);\r\n                it_buffer+=width;\r\n                std::fill_n(it_buffer,ker.right_size(),acc_zero);\r\n            } else if (option==convolve_option_extend_constant) {\r\n                PixelAccum filler;\r\n                pixel_assigns_t<PIXEL_SRC_REF,PixelAccum>()(*src.row_begin(rr),filler);\r\n                std::fill_n(it_buffer,ker.left_size(),filler);\r\n                it_buffer+=ker.left_size();\r\n                assign_pixels(src.row_begin(rr),src.row_end(rr),it_buffer);\r\n                it_buffer+=width;\r\n                pixel_assigns_t<PIXEL_SRC_REF,PixelAccum>()(src.row_end(rr)[-1],filler);\r\n                std::fill_n(it_buffer,ker.right_size(),filler);\r\n            }\r\n            correlator(&buffer.front(),&buffer.front()+width,\r\n                       ker.begin(),\r\n                       dst.row_begin(rr));\r\n        }\r\n    }\r\n}\r\ntemplate <typename PixelAccum>\r\nclass correlator_n {\r\nprivate:\r\n    std::size_t _size;\r\npublic:\r\n    correlator_n(std::size_t size_in) : _size(size_in) {}\r\n    template <typename SrcIterator,typename KernelIterator,typename DstIterator>\r\n    void operator()(SrcIterator src_begin,SrcIterator src_end,\r\n                    KernelIterator ker_begin,\r\n                    DstIterator dst_begin) {\r\n        correlate_pixels_n<PixelAccum>(src_begin,src_end,ker_begin,_size,dst_begin);\r\n    }\r\n};\r\ntemplate <std::size_t Size,typename PixelAccum>\r\nstruct correlator_k {\r\npublic:\r\n    template <typename SrcIterator,typename KernelIterator,typename DstIterator>\r\n    void operator()(SrcIterator src_begin,SrcIterator src_end,\r\n                    KernelIterator ker_begin,\r\n                    DstIterator dst_begin){\r\n        correlate_pixels_k<Size,PixelAccum>(src_begin,src_end,ker_begin,dst_begin);\r\n    }\r\n};\r\n} // namespace detail\r\n\r\n/// \\ingroup ImageAlgorithms\r\n///correlate a 1D variable-size kernel along the rows of an image\r\ntemplate <typename PixelAccum,typename SrcView,typename Kernel,typename DstView>\r\nBOOST_FORCEINLINE\r\nvoid correlate_rows(const SrcView& src, const Kernel& ker, const DstView& dst,\r\n                    convolve_boundary_option option=convolve_option_extend_zero) {\r\n    detail::correlate_rows_imp<PixelAccum>(src,ker,dst,option,detail::correlator_n<PixelAccum>(ker.size()));\r\n}\r\n\r\n/// \\ingroup ImageAlgorithms\r\n///correlate a 1D variable-size kernel along the columns of an image\r\ntemplate <typename PixelAccum,typename SrcView,typename Kernel,typename DstView>\r\nBOOST_FORCEINLINE\r\nvoid correlate_cols(const SrcView& src, const Kernel& ker, const DstView& dst,\r\n                    convolve_boundary_option option=convolve_option_extend_zero) {\r\n    correlate_rows<PixelAccum>(transposed_view(src),ker,transposed_view(dst),option);\r\n}\r\n\r\n/// \\ingroup ImageAlgorithms\r\n///convolve a 1D variable-size kernel along the rows of an image\r\ntemplate <typename PixelAccum,typename SrcView,typename Kernel,typename DstView>\r\nBOOST_FORCEINLINE\r\nvoid convolve_rows(const SrcView& src, const Kernel& ker, const DstView& dst,\r\n                   convolve_boundary_option option=convolve_option_extend_zero) {\r\n    correlate_rows<PixelAccum>(src,reverse_kernel(ker),dst,option);\r\n}\r\n\r\n/// \\ingroup ImageAlgorithms\r\n///convolve a 1D variable-size kernel along the columns of an image\r\ntemplate <typename PixelAccum,typename SrcView,typename Kernel,typename DstView>\r\nBOOST_FORCEINLINE\r\nvoid convolve_cols(const SrcView& src, const Kernel& ker, const DstView& dst,\r\n                   convolve_boundary_option option=convolve_option_extend_zero) {\r\n    convolve_rows<PixelAccum>(transposed_view(src),ker,transposed_view(dst),option);\r\n}\r\n\r\n/// \\ingroup ImageAlgorithms\r\n///correlate a 1D fixed-size kernel along the rows of an image\r\ntemplate <typename PixelAccum,typename SrcView,typename Kernel,typename DstView>\r\nBOOST_FORCEINLINE\r\nvoid correlate_rows_fixed(const SrcView& src, const Kernel& ker, const DstView& dst,\r\n                          convolve_boundary_option option=convolve_option_extend_zero) {\r\n    detail::correlate_rows_imp<PixelAccum>(src,ker,dst,option,detail::correlator_k<Kernel::static_size,PixelAccum>());\r\n}\r\n\r\n/// \\ingroup ImageAlgorithms\r\n///correlate a 1D fixed-size kernel along the columns of an image\r\ntemplate <typename PixelAccum,typename SrcView,typename Kernel,typename DstView>\r\nBOOST_FORCEINLINE\r\nvoid correlate_cols_fixed(const SrcView& src, const Kernel& ker, const DstView& dst,\r\n                          convolve_boundary_option option=convolve_option_extend_zero) {\r\n    correlate_rows_fixed<PixelAccum>(transposed_view(src),ker,transposed_view(dst),option);\r\n}\r\n\r\n/// \\ingroup ImageAlgorithms\r\n///convolve a 1D fixed-size kernel along the rows of an image\r\ntemplate <typename PixelAccum,typename SrcView,typename Kernel,typename DstView>\r\nBOOST_FORCEINLINE\r\nvoid convolve_rows_fixed(const SrcView& src, const Kernel& ker, const DstView& dst,\r\n                         convolve_boundary_option option=convolve_option_extend_zero) {\r\n    correlate_rows_fixed<PixelAccum>(src,reverse_kernel(ker),dst,option);\r\n}\r\n\r\n/// \\ingroup ImageAlgorithms\r\n///convolve a 1D fixed-size kernel along the columns of an image\r\ntemplate <typename PixelAccum,typename SrcView,typename Kernel,typename DstView>\r\nBOOST_FORCEINLINE\r\nvoid convolve_cols_fixed(const SrcView& src, const Kernel& ker, const DstView& dst,\r\n                         convolve_boundary_option option=convolve_option_extend_zero) {\r\n    convolve_rows_fixed<PixelAccum>(transposed_view(src),ker,transposed_view(dst),option);\r\n}\r\n\r\n} }  // namespace boost::gil\r\n\r\n#endif\r\n"
  },
  {
    "path": "k3dsdk/gil/boost/gil/extension/numeric/kernel.hpp",
    "content": "/*\r\n    Copyright 2005-2007 Adobe Systems Incorporated\r\n    Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt\r\n    or a copy at http://opensource.adobe.com/licenses.html)\r\n*/\r\n\r\n/*************************************************************************************************/\r\n\r\n#ifndef GIL_KERNEL_HPP\r\n#define GIL_KERNEL_HPP\r\n\r\n/*!\r\n/// \\file\r\n/// \\brief Definitions of 1D fixed-size and variable-size kernels and related operations\r\n/// \\author Hailin Jin and Lubomir Bourdev \\n\r\n///         Adobe Systems Incorporated\r\n/// \\date   2005-2007 \\n Last updated on September 26, 2006\r\n*/\r\n\r\n#include <cstddef>\r\n#include <cassert>\r\n#include <algorithm>\r\n#include <vector>\r\n#include <memory>\r\n#include <boost/version.hpp>\n#if BOOST_VERSION < 106900\n#include <boost/gil/gil_config.hpp>\n#else\n#include <boost/gil.hpp>\n#endif\n#include <boost/array.hpp>\r\n#include <boost/gil/utilities.hpp>\r\n\r\nnamespace boost { namespace gil {\r\n\r\nnamespace detail {\r\n\r\n/// \\brief kernel adaptor for one-dimensional cores\r\n/// Core needs to provide size(),begin(),end(),operator[],\r\n///                       value_type,iterator,const_iterator,reference,const_reference\r\ntemplate <typename Core>\r\nclass kernel_1d_adaptor : public Core {\r\nprivate:\r\n    std::size_t _center;\r\npublic:\r\n    kernel_1d_adaptor() : _center(0) {}\r\n    explicit kernel_1d_adaptor(std::size_t center_in) : _center(center_in) {assert(_center<this->size());}\r\n    kernel_1d_adaptor(std::size_t size_in,std::size_t center_in) :\r\n        Core(size_in), _center(center_in) {assert(_center<this->size());}\r\n    kernel_1d_adaptor(const kernel_1d_adaptor& k_in) : Core(k_in), _center(k_in._center) {}\r\n\r\n    kernel_1d_adaptor& operator=(const kernel_1d_adaptor& k_in) {\r\n        Core::operator=(k_in);\r\n        _center=k_in._center;\r\n        return *this;\r\n    }\r\n    std::size_t left_size() const {assert(_center<this->size());return _center;}\r\n    std::size_t right_size() const {assert(_center<this->size());return this->size()-_center-1;}\r\n          std::size_t& center()       {return _center;}\r\n    const std::size_t& center() const {return _center;}\r\n};\r\n\r\n} // namespace detail\r\n\r\n/// \\brief variable-size kernel\r\ntemplate <typename T, typename Alloc = std::allocator<T> >\r\nclass kernel_1d : public detail::kernel_1d_adaptor<std::vector<T,Alloc> > {\r\n    typedef detail::kernel_1d_adaptor<std::vector<T,Alloc> > parent_t;\r\npublic:\r\n    kernel_1d() {}\r\n    kernel_1d(std::size_t size_in,std::size_t center_in) : parent_t(size_in,center_in) {}\r\n    template <typename FwdIterator>\r\n    kernel_1d(FwdIterator elements, std::size_t size_in, std::size_t center_in) : parent_t(size_in,center_in) {\r\n        detail::copy_n(elements,size_in,this->begin());\r\n    }\r\n    kernel_1d(const kernel_1d& k_in)                     : parent_t(k_in) {}\r\n};\r\n\r\n/// \\brief static-size kernel\r\ntemplate <typename T,std::size_t Size>\r\nclass kernel_1d_fixed : public detail::kernel_1d_adaptor<array<T,Size> > {\r\n    typedef detail::kernel_1d_adaptor<array<T,Size> > parent_t;\r\npublic:\r\n    kernel_1d_fixed() {}\r\n    explicit kernel_1d_fixed(std::size_t center_in) : parent_t(center_in) {}\r\n    \r\n    template <typename FwdIterator>\r\n    explicit kernel_1d_fixed(FwdIterator elements, std::size_t center_in) : parent_t(center_in) {\r\n        detail::copy_n(elements,Size,this->begin());\r\n    }\r\n    kernel_1d_fixed(const kernel_1d_fixed& k_in)    : parent_t(k_in) {}\r\n};\r\n\r\n/// \\brief reverse a kernel\r\ntemplate <typename Kernel>\r\ninline Kernel reverse_kernel(const Kernel& kernel) {\r\n    Kernel result(kernel);\r\n    result.center()=kernel.right_size();\r\n    std::reverse(result.begin(), result.end());\r\n    return result;\r\n}\r\n\r\n\r\n} }  // namespace boost::gil\r\n\r\n#endif\r\n"
  },
  {
    "path": "k3dsdk/gil/boost/gil/extension/numeric/pixel_numeric_operations.hpp",
    "content": "/*\r\n    Copyright 2005-2007 Adobe Systems Incorporated\r\n    Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt\r\n    or a copy at http://opensource.adobe.com/licenses.html)\r\n*/\r\n\r\n/*************************************************************************************************/\r\n\r\n#ifndef GIL_PIXEL_NUMERIC_OPERATIONS_HPP\r\n#define GIL_PIXEL_NUMERIC_OPERATIONS_HPP\r\n\r\n/*!\r\n/// \\file               \r\n/// \\brief Structures for pixel-wise numeric operations\r\n/// \\author Lubomir Bourdev and Hailin Jin \\n\r\n///         Adobe Systems Incorporated\r\n/// \\date   2005-2007 \\n Last updated on February 6, 2007\r\n/// Currently defined structures:\r\n///     pixel_plus_t (+), pixel_minus_t (-)\r\n///     pixel_multiplies_scalar_t (*), pixel_divides_scalar_t (/)\r\n///     pixel_halves_t (/=2), pixel_zeros_t (=0)\r\n///     pixel_assigns_t (=)\r\n*/\r\n\r\n#include <functional>\r\n#include <boost/version.hpp>\n#if BOOST_VERSION < 106900\n#include <boost/gil/gil_config.hpp>\n#else\n#include <boost/gil.hpp>\n#endif\n#include <boost/gil/pixel.hpp>\r\n#include <boost/gil/color_base_algorithm.hpp>\r\n#include \"channel_numeric_operations.hpp\"\r\n\r\nnamespace boost { namespace gil {\r\n\r\n/// \\ingroup PixelNumericOperations\r\n/// \\brief construct for adding two pixels\r\ntemplate <typename PixelRef1, // models pixel concept\r\n          typename PixelRef2, // models pixel concept\r\n          typename PixelR>    // models pixel value concept\r\nstruct pixel_plus_t {\r\n    PixelR operator() (const PixelRef1& p1,\r\n                       const PixelRef2& p2) const {\r\n        PixelR result;\r\n        static_transform(p1,p2,result,\r\n                           channel_plus_t<typename channel_type<PixelRef1>::type,\r\n                                          typename channel_type<PixelRef2>::type,\r\n                                          typename channel_type<PixelR>::type>());\r\n        return result;\r\n    }\r\n};\r\n\r\n/// \\ingroup PixelNumericOperations\r\n/// \\brief construct for subtracting two pixels\r\ntemplate <typename PixelRef1, // models pixel concept\r\n          typename PixelRef2, // models pixel concept\r\n          typename PixelR>    // models pixel value concept\r\nstruct pixel_minus_t {\r\n    PixelR operator() (const PixelRef1& p1,\r\n                       const PixelRef2& p2) const {\r\n        PixelR result;\r\n        static_transform(p1,p2,result,\r\n                           channel_minus_t<typename channel_type<PixelRef1>::type,\r\n                                           typename channel_type<PixelRef2>::type,\r\n                                           typename channel_type<PixelR>::type>());\r\n        return result;\r\n    }\r\n};\r\n\r\n/// \\ingroup PixelNumericOperations\r\n/// \\brief construct for multiplying scalar to a pixel\r\ntemplate <typename PixelRef, // models pixel concept\r\n          typename Scalar,   // models a scalar type\r\n          typename PixelR>   // models pixel value concept\r\nstruct pixel_multiplies_scalar_t {\r\n    PixelR operator () (const PixelRef& p,\r\n                        const Scalar& s) const {\r\n        PixelR result;\r\n        static_transform(p,result,\r\n                           std::bind2nd(channel_multiplies_scalar_t<typename channel_type<PixelRef>::type,\r\n                                                                    Scalar,\r\n                                                                    typename channel_type<PixelR>::type>(),s));\r\n        return result;\r\n    }\r\n};\r\n\r\n/// \\ingroup PixelNumericOperations\r\n/// \\brief construct for dividing a pixel by a scalar\r\ntemplate <typename PixelRef, // models pixel concept\r\n          typename Scalar,   // models a scalar type\r\n          typename PixelR>   // models pixel value concept\r\nstruct pixel_divides_scalar_t {\r\n    PixelR operator () (const PixelRef& p,\r\n                        const Scalar& s) const {\r\n        PixelR result;\r\n        static_transform(p,result,\r\n                           std::bind2nd(channel_divides_scalar_t<typename channel_type<PixelRef>::type,\r\n                                                                 Scalar,\r\n                                                                 typename channel_type<PixelR>::type>(),s));\r\n        return result;\r\n    }\r\n};\r\n\r\n/// \\ingroup PixelNumericOperations\r\n/// \\brief construct for dividing a pixel by 2\r\ntemplate <typename PixelRef> // models pixel concept\r\nstruct pixel_halves_t {\r\n    PixelRef& operator () (PixelRef& p) const {\r\n        static_for_each(p,channel_halves_t<typename channel_type<PixelRef>::type>());\r\n        return p;\r\n    }\r\n};\r\n\r\n/// \\ingroup PixelNumericOperations\r\n/// \\brief construct for setting a pixel to zero (for whatever zero means)\r\ntemplate <typename PixelRef> // models pixel concept\r\nstruct pixel_zeros_t {\r\n    PixelRef& operator () (PixelRef& p) const {\r\n        static_for_each(p,channel_zeros_t<typename channel_type<PixelRef>::type>());\r\n        return p;\r\n    }\r\n};\r\n\r\n// Hailin: This is how you can do it:\r\ntemplate <typename Pixel>\r\nvoid zero_channels(Pixel& p) {\r\n    static_for_each(p,channel_zeros_t<typename channel_type<Pixel>::type>());\r\n}\r\n\r\n\r\n/// \\ingroup PixelNumericOperations\r\n///definition and a generic implementation for casting and assigning a pixel to another\r\n///user should specialize it for better performance\r\ntemplate <typename PixelRef,  // models pixel concept\r\n          typename PixelRefR> // models pixel concept\r\nstruct pixel_assigns_t {\r\n    PixelRefR operator () (const PixelRef& src,\r\n                           PixelRefR& dst) const {\r\n        static_for_each(src,dst,channel_assigns_t<typename channel_type<PixelRef>::type,\r\n                                                  typename channel_type<PixelRefR>::type>());\r\n        return dst;\r\n    }\r\n};\r\n\r\n} }  // namespace boost::gil\r\n\r\n#endif\r\n"
  },
  {
    "path": "k3dsdk/gil/boost/gil/extension/numeric/resample.hpp",
    "content": "/*\r\n  Copyright 2005-2007 Adobe Systems Incorporated\r\n  Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt\r\n  or a copy at http://opensource.adobe.com/licenses.html)\r\n*/\r\n\r\n/*************************************************************************************************/\r\n\r\n#ifndef GIL_RESAMPLE_HPP\r\n#define GIL_RESAMPLE_HPP\r\n\r\n#include <boost/lambda/lambda.hpp>\r\n#include <boost/lambda/bind.hpp>\r\n#include <boost/gil/extension/dynamic_image/dynamic_image_all.hpp>\r\n#include \"affine.hpp\"\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n/// \\file               \r\n/// \\brief support for generic image resampling\r\n///        NOTE: The code is for example use only. It is not optimized for performance\r\n/// \\author Lubomir Bourdev and Hailin Jin \\n\r\n///         Adobe Systems Incorporated\r\n/// \\date   2005-2007 \\n October 30, 2006\r\n///\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nnamespace boost { namespace gil {\r\n\r\n///////////////////////////////////////////////////////////////////////////\r\n////\r\n////   resample_pixels: set each pixel in the destination view as the result of a sampling function over the transformed coordinates of the source view\r\n////\r\n///////////////////////////////////////////////////////////////////////////\r\n\r\ntemplate <typename MapFn> struct mapping_traits {};\r\n\r\n/// \\brief Set each pixel in the destination view as the result of a sampling function over the transformed coordinates of the source view\r\n/// \\ingroup ImageAlgorithms\r\n///\r\n/// The provided implementation works for 2D image views only\r\ntemplate <typename Sampler,        // Models SamplerConcept\r\n          typename SrcView,        // Models RandomAccess2DImageViewConcept\r\n          typename DstView,        // Models MutableRandomAccess2DImageViewConcept\r\n          typename MapFn>        // Models MappingFunctionConcept\r\nvoid resample_pixels(const SrcView& src_view, const DstView& dst_view, const MapFn& dst_to_src, Sampler sampler=Sampler()) {\r\n    typename DstView::point_t dst_dims=dst_view.dimensions();\r\n    typename DstView::point_t dst_p;\r\n    typename mapping_traits<MapFn>::result_type src_p;\r\n\r\n    for (dst_p.y=0; dst_p.y<dst_dims.y; ++dst_p.y) {\r\n        typename DstView::x_iterator xit = dst_view.row_begin(dst_p.y);\r\n        for (dst_p.x=0; dst_p.x<dst_dims.x; ++dst_p.x) {\r\n            sample(sampler, src_view, transform(dst_to_src, dst_p), xit[dst_p.x]);\r\n        }\r\n    }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////\r\n////\r\n////   resample_pixels when one or both image views are run-time instantiated. \r\n////\r\n///////////////////////////////////////////////////////////////////////////\r\n\r\nnamespace detail {\r\n    template <typename Sampler, typename MapFn>\r\n    struct resample_pixels_fn : public binary_operation_obj<resample_pixels_fn<Sampler,MapFn> > {\r\n        MapFn  _dst_to_src;\r\n        Sampler _sampler;\r\n        resample_pixels_fn(const MapFn& dst_to_src, const Sampler& sampler) : _dst_to_src(dst_to_src), _sampler(sampler) {}\r\n\r\n        template <typename SrcView, typename DstView> BOOST_FORCEINLINE void apply_compatible(const SrcView& src, const DstView& dst)  const { \r\n            resample_pixels(src, dst, _dst_to_src, _sampler); \r\n        }\r\n    };\r\n}\r\n\r\n/// \\brief resample_pixels when the source is run-time specified\r\n///        If invoked on incompatible views, throws std::bad_cast()\r\n/// \\ingroup ImageAlgorithms\r\ntemplate <typename Sampler, typename Types1, typename V2, typename MapFn>\r\nvoid resample_pixels(const any_image_view<Types1>& src, const V2& dst, const MapFn& dst_to_src, Sampler sampler=Sampler()) {\r\n    apply_operation(src,bind(detail::resample_pixels_fn<Sampler,MapFn>(dst_to_src,sampler), _1, dst));\r\n}\r\n\r\n/// \\brief resample_pixels when the destination is run-time specified\r\n///        If invoked on incompatible views, throws std::bad_cast()\r\n/// \\ingroup ImageAlgorithms\r\ntemplate <typename Sampler, typename V1, typename Types2, typename MapFn>\r\nvoid resample_pixels(const V1& src, const any_image_view<Types2>& dst, const MapFn& dst_to_src, Sampler sampler=Sampler()) {\r\n    apply_operation(dst,bind(detail::resample_pixels_fn<Sampler,MapFn>(dst_to_src,sampler), src, _1));\r\n}\r\n\r\n/// \\brief resample_pixels when both the source and the destination are run-time specified\r\n///        If invoked on incompatible views, throws std::bad_cast()\r\n/// \\ingroup ImageAlgorithms\r\ntemplate <typename Sampler, typename SrcTypes, typename DstTypes, typename MapFn> \r\nvoid resample_pixels(const any_image_view<SrcTypes>& src, const any_image_view<DstTypes>& dst, const MapFn& dst_to_src, Sampler sampler=Sampler()) {\r\n    apply_operation(src,dst,detail::resample_pixels_fn<Sampler,MapFn>(dst_to_src,sampler));\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////\r\n////\r\n////   resample_subimage: copy into the destination a rotated rectangular region from the source, rescaling it to fit into the destination\r\n////\r\n///////////////////////////////////////////////////////////////////////////\r\n\r\n// Extract into dst the rotated bounds [src_min..src_max] rotated at 'angle' from the source view 'src'\r\n// The source coordinates are in the coordinate space of the source image\r\n// Note that the views could also be variants (i.e. any_image_view)\r\ntemplate <typename Sampler, typename SrcMetaView, typename DstMetaView> \r\nvoid resample_subimage(const SrcMetaView& src, const DstMetaView& dst, \r\n                         double src_min_x, double src_min_y,\r\n                         double src_max_x, double src_max_y,\r\n                         double angle, const Sampler& sampler=Sampler()) {\r\n    double src_width  = std::max<double>(src_max_x - src_min_x - 1,1);\r\n    double src_height = std::max<double>(src_max_y - src_min_y - 1,1);\r\n    double dst_width  = std::max<double>(dst.width()-1,1);\r\n    double dst_height = std::max<double>(dst.height()-1,1);\r\n\r\n    matrix3x2<double> mat = \r\n        matrix3x2<double>::get_translate(-dst_width/2.0, -dst_height/2.0) * \r\n        matrix3x2<double>::get_scale(src_width / dst_width, src_height / dst_height)*\r\n        matrix3x2<double>::get_rotate(-angle)*\r\n        matrix3x2<double>::get_translate(src_min_x + src_width/2.0, src_min_y + src_height/2.0);\r\n    resample_pixels(src,dst,mat,sampler);\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////\r\n////\r\n////   resize_view: Copy the source view into the destination, scaling to fit\r\n////\r\n///////////////////////////////////////////////////////////////////////////\r\n\r\ntemplate <typename Sampler, typename SrcMetaView, typename DstMetaView> \r\nvoid resize_view(const SrcMetaView& src, const DstMetaView& dst, const Sampler& sampler=Sampler()) {\r\n    resample_subimage(src,dst,0,0,src.width(),src.height(),0,sampler);\r\n}\r\n\r\n} }  // namespace boost::gil\r\n\r\n#endif\r\n"
  },
  {
    "path": "k3dsdk/gil/boost/gil/extension/numeric/sampler.hpp",
    "content": "/*\r\n  Copyright 2005-2007 Adobe Systems Incorporated\r\n  Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt\r\n  or a copy at http://opensource.adobe.com/licenses.html)\r\n*/\r\n\r\n/*************************************************************************************************/\r\n\r\n#ifndef GIL_SAMPLER_HPP\r\n#define GIL_SAMPLER_HPP\r\n\r\n#include <boost/gil/extension/dynamic_image/dynamic_image_all.hpp>\r\n#include \"pixel_numeric_operations.hpp\"\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n/// \\file               \r\n/// \\brief Nearest-neighbor and bilinear image samplers.\r\n///        NOTE: The code is for example use only. It is not optimized for performance\r\n/// \\author Lubomir Bourdev and Hailin Jin \\n\r\n///         Adobe Systems Incorporated\r\n/// \\date   2005-2007 \\n October 30, 2006\r\n///\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nnamespace boost { namespace gil {\r\n\r\n///////////////////////////////////////////////////////////////////////////\r\n////\r\n////     resample_pixels: set each pixel in the destination view as the result of a sampling function over the transformed coordinates of the source view\r\n////\r\n///////////////////////////////////////////////////////////////////////////\r\n/*\r\ntemplate <typename Sampler>\r\nconcept SamplerConcept {\r\n    template <typename DstP,      // Models PixelConcept\r\n              typename SrcView,    // Models RandomAccessNDImageViewConcept\r\n              typename S_COORDS>  // Models PointNDConcept, where S_COORDS::num_dimensions == SrcView::num_dimensions\r\n    bool sample(const Sampler& s, const SrcView& src, const S_COORDS& p, DstP result);\r\n};\r\n*/\r\n\r\n/// \\brief A sampler that sets the destination pixel to the closest one in the source. If outside the bounds, it doesn't change the destination\r\n/// \\ingroup ImageAlgorithms\r\nstruct nearest_neighbor_sampler {};\r\n\r\ntemplate <typename DstP, typename SrcView, typename F>\r\nbool sample(nearest_neighbor_sampler, const SrcView& src, const point2<F>& p, DstP& result) {\r\n    point2<int> center(iround(p));\r\n    if (center.x>=0 && center.y>=0 && center.x<src.width() && center.y<src.height()) {\r\n        result=src(center.x,center.y);\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n\r\ntemplate <typename SrcPixel, typename DstPixel>\r\nvoid cast_pixel(const SrcPixel& src, DstPixel& dst) {\r\n       static_for_each(src,dst,channel_assigns_t<typename channel_type<SrcPixel>::type,\r\n                                                 typename channel_type<DstPixel>::type>());\r\n}\r\n\r\nnamespace detail {\r\n\r\ntemplate <typename Weight>\r\nstruct add_dst_mul_src_channel {\r\n    Weight _w;\r\n    add_dst_mul_src_channel(Weight w) : _w(w) {}\r\n\r\n    template <typename SrcChannel, typename DstChannel>\r\n    void operator()(const SrcChannel& src, DstChannel& dst) const {\r\n        dst += DstChannel(src*_w);\r\n    }\r\n};\r\n\r\n// dst += DST_TYPE(src * w)\r\ntemplate <typename SrcP,typename Weight,typename DstP>\r\nstruct add_dst_mul_src {\r\n    void operator()(const SrcP& src, Weight weight, DstP& dst) const {\r\n        static_for_each(src,dst, add_dst_mul_src_channel<Weight>(weight));\r\n//        pixel_assigns_t<DstP,DstP&>()(\r\n//            pixel_plus_t<DstP,DstP,DstP>()(\r\n//                pixel_multiplies_scalar_t<SrcP,Weight,DstP>()(src,weight),\r\n//                dst),\r\n//            dst);\r\n    }\r\n};\r\n} // namespace detail\r\n\r\n/// \\brief A sampler that sets the destination pixel as the bilinear interpolation of the four closest pixels from the source. \r\n/// If outside the bounds, it doesn't change the destination\r\n/// \\ingroup ImageAlgorithms\r\nstruct bilinear_sampler {};\r\n\r\ntemplate <typename DstP, typename SrcView, typename F>\r\nbool sample(bilinear_sampler, const SrcView& src, const point2<F>& p, DstP& result) {\r\n    typedef typename SrcView::value_type SrcP;\r\n    point2<std::ptrdiff_t> p0(ifloor(p)); // the closest integer coordinate top left from p\r\n    point2<F> frac(p.x-p0.x, p.y-p0.y);\r\n    if (p0.x < 0 || p0.y < 0 || p0.x>=src.width() || p0.y>=src.height()) return false;\r\n\r\n    pixel<F,devicen_layout_t<num_channels<SrcView>::value> > mp(0);                     // suboptimal\r\n    typename SrcView::xy_locator loc=src.xy_at(p0.x,p0.y);\r\n\r\n    if (p0.x+1<src.width()) {\r\n        if (p0.y+1<src.height()) {\r\n            // most common case - inside the image, not on the last row or column\r\n            detail::add_dst_mul_src<SrcP,F,pixel<F,devicen_layout_t<num_channels<SrcView>::value> > >()(*loc,      (1-frac.x)*(1-frac.y),mp);\r\n            detail::add_dst_mul_src<SrcP,F,pixel<F,devicen_layout_t<num_channels<SrcView>::value> > >()(loc.x()[1],   frac.x *(1-frac.y),mp);\r\n            ++loc.y();\r\n            detail::add_dst_mul_src<SrcP,F,pixel<F,devicen_layout_t<num_channels<SrcView>::value> > >()(*loc,      (1-frac.x)*   frac.y ,mp);\r\n            detail::add_dst_mul_src<SrcP,F,pixel<F,devicen_layout_t<num_channels<SrcView>::value> > >()(loc.x()[1],   frac.x *   frac.y ,mp);\r\n        } else {\r\n            // on the last row, but not the bottom-right corner pixel\r\n            detail::add_dst_mul_src<SrcP,F,pixel<F,devicen_layout_t<num_channels<SrcView>::value> > >()(*loc,      (1-frac.x),mp);\r\n            detail::add_dst_mul_src<SrcP,F,pixel<F,devicen_layout_t<num_channels<SrcView>::value> > >()(loc.x()[1],   frac.x ,mp);\r\n        }\r\n    } else {\r\n        if (p0.y+1<src.height()) {\r\n            // on the last column, but not the bottom-right corner pixel\r\n            detail::add_dst_mul_src<SrcP,F,pixel<F,devicen_layout_t<num_channels<SrcView>::value> > >()(*loc,      (1-frac.y),mp);\r\n            ++loc.y();\r\n            detail::add_dst_mul_src<SrcP,F,pixel<F,devicen_layout_t<num_channels<SrcView>::value> > >()(*loc,         frac.y ,mp);\r\n        } else {\r\n            // the bottom-right corner pixel\r\n            detail::add_dst_mul_src<SrcP,F,pixel<F,devicen_layout_t<num_channels<SrcView>::value> > >()(*loc,1,mp);\r\n        }\r\n    }\r\n\r\n//    pixel_assigns_t<pixel<F,devicen_layout_t<num_channels<SrcView>::value> >,DstP&>()(mp,result);\r\n    cast_pixel(mp,result);\r\n    return true;\r\n}\r\n\r\n} }  // namespace boost::gil\r\n\r\n#endif\r\n"
  },
  {
    "path": "k3dsdk/gil/boost/uuid/nil_generator.hpp",
    "content": "// Boost nil_generator.hpp header file  ----------------------------------------------//\n\n// Copyright 2010 Andy Tompkins.\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_UUID_NIL_GENERATOR_HPP\n#define BOOST_UUID_NIL_GENERATOR_HPP\n\n#include <boost/uuid/uuid.hpp>\n\nnamespace boost {\nnamespace uuids {\n\n// generate a nil uuid\nstruct nil_generator {\n    typedef uuid result_type;\n    \n    uuid operator()() const {\n        // initialize to all zeros\n        uuid u = {{0}};\n        return u;\n    }\n};\n\ninline uuid nil_uuid() {\n    return nil_generator()();\n}\n\n}} // namespace boost::uuids\n\n#endif // BOOST_UUID_NIL_GENERATOR_HPP\n\n"
  },
  {
    "path": "k3dsdk/gil/boost/uuid/random_generator.hpp",
    "content": "// Boost random_generator.hpp header file  ----------------------------------------------//\n\n// Copyright 2010 Andy Tompkins.\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_UUID_RANDOM_GENERATOR_HPP\n#define BOOST_UUID_RANDOM_GENERATOR_HPP\n\n#include <boost/uuid/uuid.hpp>\n#include <boost/uuid/seed_rng.hpp>\n#include <boost/random/uniform_int.hpp>\n#include <boost/random/variate_generator.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/assert.hpp>\n#include <boost/shared_ptr.hpp>\n#include <limits>\n\nnamespace boost {\nnamespace uuids {\n\n// generate a random-based uuid\ntemplate <typename UniformRandomNumberGenerator>\nclass basic_random_generator {\nprivate:\n    typedef uniform_int<unsigned long> distribution_type;\n    typedef variate_generator<UniformRandomNumberGenerator*, distribution_type> generator_type;\n\n    struct null_deleter\n    {\n        void operator()(void const *) const {}\n    };\n\npublic:\n    typedef uuid result_type;\n    \n    // default constructor creates the random number generator\n    basic_random_generator()\n        : pURNG(new UniformRandomNumberGenerator)\n        , generator\n          ( pURNG.get()\n          , distribution_type\n            ( (std::numeric_limits<unsigned long>::min)()\n            , (std::numeric_limits<unsigned long>::max)()\n            )\n          )\n    {\n        // seed the random number generator\n        detail::seed(*pURNG);\n    }\n    \n    // keep a reference to a random number generator\n    // don't seed a given random number generator\n    explicit basic_random_generator(UniformRandomNumberGenerator& gen)\n        : pURNG(&gen, null_deleter())\n        , generator\n          ( pURNG.get()\n          , distribution_type\n            ( (std::numeric_limits<unsigned long>::min)()\n            , (std::numeric_limits<unsigned long>::max)()\n            )\n          )\n    {}\n    \n    // keep a pointer to a random number generator\n    // don't seed a given random number generator\n    explicit basic_random_generator(UniformRandomNumberGenerator* pGen)\n        : pURNG(pGen, null_deleter())\n        , generator\n          ( pURNG.get()\n          , distribution_type\n            ( (std::numeric_limits<unsigned long>::min)()\n            , (std::numeric_limits<unsigned long>::max)()\n            )\n          )\n    {\n        BOOST_ASSERT(pURNG);\n    }\n    \n    uuid operator()()\n    {\n        uuid u;\n        \n        int i=0;\n        unsigned long random_value = generator();\n        for (uuid::iterator it=u.begin(); it!=u.end(); ++it, ++i) {\n            if (i==sizeof(unsigned long)) {\n                random_value = generator();\n                i = 0;\n            }\n\n            *it = ((random_value >> (i*8)) & 0xFF);\n        }\n\n        // set variant\n        // must be 0b10xxxxxx\n        *(u.begin()+8) &= 0xBF;\n        *(u.begin()+8) |= 0x80;\n\n        // set version\n        // must be 0b0100xxxx\n        *(u.begin()+6) &= 0x4F; //0b01001111\n        *(u.begin()+6) |= 0x40; //0b01000000\n\n        return u;\n    }\n\nprivate:\n    shared_ptr<UniformRandomNumberGenerator> pURNG;\n    generator_type generator;\n};\n\ntypedef basic_random_generator<mt19937> random_generator;\n\n}} // namespace boost::uuids\n\n#endif //BOOST_UUID_RANDOM_GENERATOR_HPP\n"
  },
  {
    "path": "k3dsdk/gil/boost/uuid/seed_rng.hpp",
    "content": "// Boost seed_rng.hpp header file  ----------------------------------------------//\n\n// Copyright 2007 Andy Tompkins.\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// Revision History\n//  09 Nov 2007 - Initial Revision\n//  25 Feb 2008 - moved to namespace boost::uuids::detail\n//  28 Nov 2009 - disabled deprecated warnings for MSVC\n\n// seed_rng models a UniformRandomNumberGenerator (see Boost.Random).\n// Random number generators are hard to seed well.  This is intended to provide\n// good seed values for random number generators.\n// It creates random numbers from a sha1 hash of data from a variary of sources,\n// all of which are standard function calls.  It produces random numbers slowly.\n// Peter Dimov provided the details of sha1_random_digest_().\n// see http://archives.free.net.ph/message/20070507.175609.4c4f503a.en.html\n\n#ifndef BOOST_UUID_SEED_RNG_HPP\n#define BOOST_UUID_SEED_RNG_HPP\n\n#include <boost/config.hpp>\n#include <cstring> // for memcpy\n#include <limits>\n#include <memory.h>\n#include <ctime> // for time_t, time, clock_t, clock\n#include <cstdlib> // for rand\n#include <cstdio> // for FILE, fopen, fread, fclose\n#include <boost/uuid/sha1.hpp>\n//#include <boost/nondet_random.hpp> //forward declare boost::random_device\n\n// can't use boost::generator_iterator since boost::random number seed(Iter&, Iter)\n// functions need a last iterator\n//#include <boost/generator_iterator.hpp>\n# include <boost/iterator/iterator_facade.hpp>\n\n#if defined(_MSC_VER)\n#pragma warning(push) // Save warning settings.\n#pragma warning(disable : 4996) // Disable deprecated std::fopen\n#endif\n\n#ifdef BOOST_NO_STDC_NAMESPACE\nnamespace std {\n    using ::memcpy;\n    using ::time_t;\n    using ::time;\n    using ::clock_t;\n    using ::clock;\n    using ::rand;\n    using ::FILE;\n    using ::fopen;\n    using ::fread;\n    using ::fclose;\n} //namespace std\n#endif\n\n// forward declare random number generators\nnamespace boost {\nclass random_device;\n} //namespace boost\n\nnamespace boost {\nnamespace uuids {\nnamespace detail {\n\n// should this be part of Boost.Random?\nclass seed_rng\n{\npublic:\n    typedef unsigned int result_type;\n    BOOST_STATIC_CONSTANT(bool, has_fixed_range = false);\n    //BOOST_STATIC_CONSTANT(unsigned int, min_value = 0);\n    //BOOST_STATIC_CONSTANT(unsigned int, max_value = UINT_MAX);\n\npublic:\n    // note: rd_ intentionally left uninitialized\n    seed_rng()\n        : rd_index_(5)\n        , random_(std::fopen( \"/dev/urandom\", \"rb\" ))\n    {}\n    \n    ~seed_rng()\n    {\n        if (random_) {\n            std::fclose(random_);\n        }\n    }\n\n    result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const\n    {\n        return (std::numeric_limits<result_type>::min)();\n    }\n    result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const\n    {\n        return (std::numeric_limits<result_type>::max)();\n    }\n\n    result_type operator()()\n    {\n        if (rd_index_ >= 5) {\n            //get new digest\n            sha1_random_digest_();\n\n            rd_index_ = 0;\n        }\n\n        return rd_[rd_index_++];\n    }\n\nprivate:\n    static unsigned int * sha1_random_digest_state_()\n    {\n        // intentionally left uninitialized\n        static unsigned int state[ 5 ];\n        return state;\n    }\n\n    void sha1_random_digest_()\n    {\n        boost::uuids::detail::sha1 sha;\n\n        unsigned int * ps = sha1_random_digest_state_();\n\n        unsigned int state[ 5 ];\n        std::memcpy( state, ps, sizeof( state ) ); // harmless data race\n\n        sha.process_bytes( (unsigned char const*)state, sizeof( state ) );\n        sha.process_bytes( (unsigned char const*)&ps, sizeof( ps ) );\n\n        {\n            std::time_t tm = std::time( 0 );\n            sha.process_bytes( (unsigned char const*)&tm, sizeof( tm ) );\n        }\n\n        {\n            std::clock_t ck = std::clock();\n            sha.process_bytes( (unsigned char const*)&ck, sizeof( ck ) );\n        }\n\n        {\n            unsigned int rn[] = { static_cast<unsigned int>(std::rand()), static_cast<unsigned int>(std::rand()), static_cast<unsigned int>(std::rand()) };\n            sha.process_bytes( (unsigned char const*)rn, sizeof( rn ) );\n        }\n\n        {\n            // intentionally left uninitialized\n            unsigned char buffer[ 20 ];\n\n            if(random_)\n            {\n                std::fread( buffer, 1, 20, random_ );\n            }\n\n            // using an uninitialized buffer[] if fopen fails\n            // intentional, we rely on its contents being random\n            sha.process_bytes( buffer, sizeof( buffer ) );\n        }\n\n        {\n            // *p is intentionally left uninitialized\n            unsigned int * p = new unsigned int;\n\n            sha.process_bytes( (unsigned char const*)p, sizeof( *p ) );\n            sha.process_bytes( (unsigned char const*)&p, sizeof( p ) );\n\n            delete p;\n        }\n\n        sha.process_bytes( (unsigned char const*)rd_, sizeof( rd_ ) );\n\n        unsigned int digest[ 5 ];\n        sha.get_digest( digest );\n\n        for( int i = 0; i < 5; ++i )\n        {\n            // harmless data race\n            ps[ i ] ^= digest[ i ];\n            rd_[ i ] ^= digest[ i ];\n        }\n    }\n\nprivate:\n    unsigned int rd_[5];\n    int rd_index_;\n    std::FILE * random_;\n    \nprivate: // make seed_rng noncopyable\n    seed_rng(seed_rng const&);\n    seed_rng& operator=(seed_rng const&);\n};\n\n// almost a copy of boost::generator_iterator\n// but default constructor sets m_g to NULL\ntemplate <class Generator>\nclass generator_iterator\n  : public iterator_facade<\n        generator_iterator<Generator>\n      , typename Generator::result_type\n      , single_pass_traversal_tag\n      , typename Generator::result_type const&\n    >\n{\n    typedef iterator_facade<\n        generator_iterator<Generator>\n      , typename Generator::result_type\n      , single_pass_traversal_tag\n      , typename Generator::result_type const&\n    > super_t;\n    \n public:\n    generator_iterator() : m_g(NULL) {}\n    generator_iterator(Generator* g) : m_g(g), m_value((*m_g)()) {}\n\n    void increment()\n    {\n        m_value = (*m_g)();\n    }\n\n    const typename Generator::result_type&\n    dereference() const\n    {\n        return m_value;\n    }\n\n    bool equal(generator_iterator const& y) const\n    {\n        return this->m_g == y.m_g && this->m_value == y.m_value;\n    }\n\n private:\n    Generator* m_g;\n    typename Generator::result_type m_value;\n};\n\n// seed() seeds a random number generator with good seed values\n\ntemplate <typename UniformRandomNumberGenerator>\ninline void seed(UniformRandomNumberGenerator& rng)\n{\n    seed_rng seed_gen;\n    generator_iterator<seed_rng> begin(&seed_gen);\n    generator_iterator<seed_rng> end;\n    rng.seed(begin, end);\n}\n\n// random_device does not / can not be seeded\ntemplate <>\ninline void seed<boost::random_device>(boost::random_device&) {}\n\n// random_device does not / can not be seeded\ntemplate <>\ninline void seed<seed_rng>(seed_rng&) {}\n\n}}} //namespace boost::uuids::detail\n\n#if defined(_MSC_VER)\n#pragma warning(pop) // Restore warnings to previous state.\n#endif\n\n#endif\n"
  },
  {
    "path": "k3dsdk/gil/boost/uuid/sha1.hpp",
    "content": "// boost/uuid/sha1.hpp header file  ----------------------------------------------//\n\n// Copyright 2007 Andy Tompkins.\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// Revision History\n//  29 May 2007 - Initial Revision\n//  25 Feb 2008 - moved to namespace boost::uuids::detail\n\n// This is a byte oriented implementation\n// Note: this implementation does not handle message longer than\n//       2^32 bytes.\n\n#ifndef BOOST_UUID_SHA1_H\n#define BOOST_UUID_SHA1_H\n\n#include <boost/static_assert.hpp>\n#include <cstddef>\n\n#ifdef BOOST_NO_STDC_NAMESPACE\nnamespace std {\n    using ::size_t;\n} // namespace std\n#endif\n\nnamespace boost {\nnamespace uuids {\nnamespace detail {\n\nBOOST_STATIC_ASSERT(sizeof(unsigned char)*8 == 8);\nBOOST_STATIC_ASSERT(sizeof(unsigned int)*8 == 32);\n\ninline unsigned int left_rotate(unsigned int x, std::size_t n)\n{\n    return (x<<n) ^ (x>> (32-n));\n}\n\nclass sha1\n{\npublic:\n    typedef unsigned int(&digest_type)[5];\npublic:\n    sha1();\n\n    void reset();\n\n    void process_byte(unsigned char byte);\n    void process_block(void const* bytes_begin, void const* bytes_end);\n    void process_bytes(void const* buffer, std::size_t byte_count);\n\n    void get_digest(digest_type digest);\n\nprivate:\n    void process_block();\n\nprivate:\n    unsigned int h_[5];\n\n    unsigned char block_[64];\n\n    std::size_t block_byte_index_;\n    std::size_t byte_count_;\n};\n\ninline sha1::sha1()\n{\n    reset();\n}\n\ninline void sha1::reset()\n{\n    h_[0] = 0x67452301;\n    h_[1] = 0xEFCDAB89;\n    h_[2] = 0x98BADCFE;\n    h_[3] = 0x10325476;\n    h_[4] = 0xC3D2E1F0;\n\n    block_byte_index_ = 0;\n    byte_count_ = 0;\n}\n\ninline void sha1::process_byte(unsigned char byte)\n{\n    block_[block_byte_index_++] = byte;\n    ++byte_count_;\n    if (block_byte_index_ == 64) {\n        block_byte_index_ = 0;\n        process_block();\n    }\n}\n\ninline void sha1::process_block(void const* bytes_begin, void const* bytes_end)\n{\n    unsigned char const* begin = static_cast<unsigned char const*>(bytes_begin);\n    unsigned char const* end = static_cast<unsigned char const*>(bytes_end);\n    for(; begin != end; ++begin) {\n        process_byte(*begin);\n    }\n}\n\ninline void sha1::process_bytes(void const* buffer, std::size_t byte_count)\n{\n    unsigned char const* b = static_cast<unsigned char const*>(buffer);\n    process_block(b, b+byte_count);\n}\n\ninline void sha1::process_block()\n{\n    unsigned int w[80];\n    for (std::size_t i=0; i<16; ++i) {\n        w[i]  = (block_[i*4 + 0] << 24);\n        w[i] |= (block_[i*4 + 1] << 16);\n        w[i] |= (block_[i*4 + 2] << 8);\n        w[i] |= (block_[i*4 + 3]);\n    }\n    for (std::size_t i=16; i<80; ++i) {\n        w[i] = left_rotate((w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]), 1);\n    }\n\n    unsigned int a = h_[0];\n    unsigned int b = h_[1];\n    unsigned int c = h_[2];\n    unsigned int d = h_[3];\n    unsigned int e = h_[4];\n\n    for (std::size_t i=0; i<80; ++i) {\n        unsigned int f;\n        unsigned int k;\n\n        if (i<20) {\n            f = (b & c) | (~b & d);\n            k = 0x5A827999;\n        } else if (i<40) {\n            f = b ^ c ^ d;\n            k = 0x6ED9EBA1;\n        } else if (i<60) {\n            f = (b & c) | (b & d) | (c & d);\n            k = 0x8F1BBCDC;\n        } else {\n            f = b ^ c ^ d;\n            k = 0xCA62C1D6;\n        }\n\n        unsigned temp = left_rotate(a, 5) + f + e + k + w[i];\n        e = d;\n        d = c;\n        c = left_rotate(b, 30);\n        b = a;\n        a = temp;\n    }\n\n    h_[0] += a;\n    h_[1] += b;\n    h_[2] += c;\n    h_[3] += d;\n    h_[4] += e;\n}\n\ninline void sha1::get_digest(digest_type digest)\n{\n    std::size_t bit_count = byte_count_*8;\n\n    // append the bit '1' to the message\n    process_byte(0x80);\n\n    // append k bits '0', where k is the minimum number >= 0\n    // such that the resulting message length is congruent to 56 (mod 64)\n    // check if there is enough space for padding and bit_count\n    if (block_byte_index_ > 56) {\n        // finish this block\n        while (block_byte_index_ != 0) {\n            process_byte(0);\n        }\n\n        // one more block\n        while (block_byte_index_ < 56) {\n            process_byte(0);\n        }\n    } else {\n        while (block_byte_index_ < 56) {\n            process_byte(0);\n        }\n    }\n\n    // append length of message (before pre-processing) \n    // as a 64-bit big-endian integer\n    process_byte(0);\n    process_byte(0);\n    process_byte(0);\n    process_byte(0);\n    process_byte( static_cast<unsigned char>((bit_count>>24) & 0xFF));\n    process_byte( static_cast<unsigned char>((bit_count>>16) & 0xFF));\n    process_byte( static_cast<unsigned char>((bit_count>>8 ) & 0xFF));\n    process_byte( static_cast<unsigned char>((bit_count)     & 0xFF));\n\n    // get final digest\n    digest[0] = h_[0];\n    digest[1] = h_[1];\n    digest[2] = h_[2];\n    digest[3] = h_[3];\n    digest[4] = h_[4];\n}\n\n}}} // namespace boost::uuids::detail\n\n#endif\n"
  },
  {
    "path": "k3dsdk/gl/CMakeLists.txt",
    "content": "FILE(GLOB HEADERS *.h)\nFILE(GLOB SOURCES *.cpp)\n\nLIST(SORT HEADERS)\nLIST(SORT SOURCES)\n\nK3D_ADD_LIBRARY(k3dsdk-opengl SHARED ${HEADERS} ${SOURCES})\nK3D_GENERATE_DEF_FILE(K3dsdk-opengl)\nTARGET_LINK_LIBRARIES(k3dsdk-opengl\n\tk3dsdk\n\t)\n\nINSTALL(TARGETS k3dsdk-opengl\n\tRUNTIME DESTINATION bin \n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n"
  },
  {
    "path": "k3dsdk/gl/context.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/gl/context.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/log_control.h>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\nstatic context*& g_current()\n{\n\tstatic context* storage = 0;\n\treturn storage;\n}\n\nstatic GLEWContext*& g_current_glew()\n{\n\tstatic GLEWContext* storage = 0;\n\treturn storage;\n}\n\nvoid context::begin()\n{\n\tg_current() = this;\n\tg_current_glew() = glew_context();\n\ton_begin();\n}\n\ncontext* context::current()\n{\n\treturn g_current();\n}\n\nGLEWContext* context::current_glew_context()\n{\n\treturn g_current_glew();\n}\n\nvoid context::end()\n{\n\ton_end();\n\tg_current() = 0;\n}\n\nGLEWContext* context::glew_context()\n{\n\tif(!m_glew_context)\n\t{\n\t\ton_begin();\n\t\tm_glew_context.reset(new GLEWContext());\n\t\tg_current_glew() = m_glew_context.get();\n\t\tGLenum err = glewInit(); // needs to be called after context creation\n\t\tif (GLEW_OK != err)\n\t\t{\n\t\t\tk3d::log() << error << \"GLEW init failed: \" << glewGetErrorString(err) << std::endl;\n\t\t\tm_glew_context.reset();\n\t\t}\n\t\ton_end();\n\t\tassert(m_glew_context);\n\t}\n\treturn m_glew_context.get();\n}\n\n} // namespace gl\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/gl/context.h",
    "content": "#ifndef K3DSDK_GL_CONTEXT_H\n#define K3DSDK_GL_CONTEXT_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n#include <k3dsdk/gl.h>\n#include <k3dsdk/iunknown.h>\n#include <boost/scoped_ptr.hpp>\n\n#if K3D_GLEW_MAJOR_VERSION > 1\n\tstruct GLEWContext {};\n#endif\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\n/// Abstract interface implemented by OpenGL context objects\nclass context :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~context() {}\n\n\t/// Activates this context for drawing in the calling thread\n\tvoid begin();\n\n\t/// Returns the currently-active context, if any, or NULL.\n\tstatic context* current();\n\n\t/// Returns the currently-active GLEW context, if any, or NULL. Mostly used internally by GLEW\n\tstatic GLEWContext* current_glew_context();\n\n\t/// If the context is double-buffered, swaps the front and back buffers.  Otherwise, a no-op.\n\tvoid end();\n\n\t/// Return the GLEW context associated with this context, or NULL if there is none\n\tGLEWContext* glew_context();\n\nprotected:\n\tcontext() {}\n\tcontext(const context&) {}\n\tcontext& operator=(const context&) { return *this; }\n\n\t/// Concrete implementations should activate this context for drawing in the calling thread\n\tvirtual void on_begin() = 0;\n\n\t/// If the context is double-buffered, concrete implementations should swap the front and back buffers.  Otherwise, a no-op.\n\tvirtual void on_end() = 0;\nprivate:\n\tboost::scoped_ptr<GLEWContext> m_glew_context;\n};\n\n} // namespace gl\n\n} // namespace k3d\n\n#define glewGetContext() k3d::gl::context::current_glew_context()\n\n#endif // !K3DSDK_GL_CONTEXT_H\n"
  },
  {
    "path": "k3dsdk/gl/context_factory.h",
    "content": "#ifndef K3DSDK_GL_CONTEXT_FACTORY_H\n#define K3DSDK_GL_CONTEXT_FACTORY_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\nclass context;\n\t\n/// Abstract interface implemented by objects that can create OpenGL render context objects,\nclass context_factory :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~context_factory() {}\n\n\t/// Creates a new OpenGL render context for use with the given drawable.  Note that\n\t/// the drawable could be an X11 XID, a Windows HWND, etc.  The caller is responsible\n\t/// for the lifetime of the returned object.\n\tvirtual context* create(uint64_t Drawable) = 0;\n\nprotected:\n\tcontext_factory() {}\n\tcontext_factory(const context_factory&) {}\n\tcontext_factory& operator=(const context_factory&) { return *this; }\n};\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_GL_CONTEXT_FACTORY_H\n\n"
  },
  {
    "path": "k3dsdk/gl/enum.spec",
    "content": "# This is the OpenGL and OpenGL ES enumerant registry.\n#\n# It is an extremely important file. Do not mess with it unless\n# you know what you're doing and have permission to do so.\n#\n# $Revision: 10796 $ on $Date: 2010-03-19 17:31:10 -0700 (Fri, 19 Mar 2010) $\n\n###############################################################################\n#\n# Before modifying this file, read the following:\n#\n#   ONLY the Khronos API Registrar (Jon Leech, jon 'at' alumni.caltech.edu)\n#   may allocate new enumerants outside the 'experimental' range described\n#   below. Any modifications to this file not performed by the Registrar\n#   are incompatible with the OpenGL API. The master copy of the registry,\n#   showing up-to-date enumerant allocations, is maintained in the\n#   OpenGL registry at\n#\n#\thttp://www.opengl.org/registry/\n#\n#   The following guidelines are thus only for reference purposes\n#   (unless you're the Registrar)\n#\n#   Enumerant values for extensions CANNOT be chosen arbitrarily, since\n#   the enumerant value space is shared by all GL implementations. It is\n#   therefore imperative that the procedures described in this file be\n#   followed carefully when allocating extension enum values.\n#\n# - Use tabs, not spaces.\n#\n# - When adding enum values for a new extension, use existing extensions\n#   as a guide.\n#\n# - When a vendor has committed to releasing a new extension and needs to\n#   allocate enum values for that extension, the vendor may request that the\n#   ARB allocate a previously unallocated block of 16 enum values, in the\n#   range 0x8000-0xFFFF, for the vendor's exclusive use.\n#\n# - The vendor that introduces an extension will allocate enum values for\n#   it as if it is a single-vendor extension, even if it is a multi-vendor\n#   (EXT) extension.\n#\n# - The file enum.spec is primarily a reference. The file enumext.spec\n#   contains enumerants for all OpenGL 1.2 and OpenGL extensions in a form\n#   used to generate <GL/glext.h>.\n#\n# - If a vendor hasn't yet released an extension, just add a comment to\n#   enum.spec that contains the name of the extension and the range of enum\n#   values used by the extension. When the vendor releases the extension,\n#   put the actual enum assignments in enum.spec and enumext.spec.\n#\n# - Allocate all of the enum values for an extension in a single contiguous\n#   block.\n#\n# - If an extension is experimental, allocate temporary enum values in the\n#   range 0x6000-0x8000 during development work.  When the vendor commits to\n#   releasing the extension, allocate permanent enum values (see below).\n#   There are two reasons for this policy:\n#\n#   1.\tIt is desirable to keep extension enum values tightly packed and to\n#\tmake all of the enum values for an extension be contiguous.  This is\n#\tpossible only if permanent enum values for a new extension are not\n#\tallocated until the extension spec is stable and the number of new\n#\tenum values needed by the extension has therefore stopped changing.\n#\n#   2.\tOpenGL ARB policy is that a vendor may allocate a new block of 16\n#\textension enum values only if it has committed to releasing an\n#\textension that will use values in that block.\n#\n# - To allocate a new block of permanent enum values for an extension, do the\n#   following:\n#\n#   1.\tStart at the top of enum.spec and choose the first future_use\n#\trange that is not allocated to another vendor and is large enough\n#\tto contain the new block. This will almost certainly be the\n#\t'Any_vendor_future_use' range near the end of enum.spec. This\n#\tprocess helps keep allocated enum values tightly packed into\n#\tthe start of the 0x8000-0xFFFF range.\n#\n#   2.\tAllocate a block of enum values at the start of this range.  If\n#\tthe enum definitions are going into enumfuture.spec, add a comment\n#\tto enum.spec that contains the name of the extension and the range\n#\tof values in the new block. Use existing extensions as a guide.\n#\n#   3.\tAdd the size of the block you just allocated to the start of the\n#\tchosen future_use range.  If you have allocated the entire range,\n#\teliminate its future_use entry.\n#\n#   4.\tNote that there are historical enum allocations above 0xFFFF, but\n#\tno new allocations will be made there in the forseeable future.\n#\n###############################################################################\n\nExtensions define:\n\tVERSION_1_1\t\t\t\t\t= 1\n\tVERSION_1_2\t\t\t\t\t= 1\n\tVERSION_1_3\t\t\t\t\t= 1\n\tVERSION_1_4\t\t\t\t\t= 1\n\tVERSION_1_5\t\t\t\t\t= 1\n\tVERSION_2_0\t\t\t\t\t= 1\n\tVERSION_2_1\t\t\t\t\t= 1\n\tVERSION_3_0\t\t\t\t\t= 1\n\tVERSION_3_1\t\t\t\t\t= 1\n\tVERSION_3_2\t\t\t\t\t= 1\n\tARB_imaging\t\t\t\t\t= 1\n\tEXT_abgr\t\t\t\t\t= 1\n\tEXT_blend_color\t\t\t\t\t= 1\n\tEXT_blend_logic_op\t\t\t\t= 1\n\tEXT_blend_minmax\t\t\t\t= 1\n\tEXT_blend_subtract\t\t\t\t= 1\n\tEXT_cmyka\t\t\t\t\t= 1\n\tEXT_convolution\t\t\t\t\t= 1\n\tEXT_copy_texture\t\t\t\t= 1\n\tEXT_histogram\t\t\t\t\t= 1\n\tEXT_packed_pixels\t\t\t\t= 1\n\tEXT_point_parameters\t\t\t\t= 1\n\tEXT_polygon_offset\t\t\t\t= 1\n\tEXT_rescale_normal\t\t\t\t= 1\n\tEXT_shared_texture_palette\t\t\t= 1\n\tEXT_subtexture\t\t\t\t\t= 1\n\tEXT_texture\t\t\t\t\t= 1\n\tEXT_texture3D\t\t\t\t\t= 1\n\tEXT_texture_object\t\t\t\t= 1\n\tEXT_vertex_array\t\t\t\t= 1\n\tSGIS_detail_texture\t\t\t\t= 1\n\tSGIS_fog_function\t\t\t\t= 1\n\tSGIS_generate_mipmap\t\t\t\t= 1\n\tSGIS_multisample\t\t\t\t= 1\n\tSGIS_pixel_texture\t\t\t\t= 1\n\tSGIS_point_line_texgen\t\t\t\t= 1\n\tSGIS_point_parameters\t\t\t\t= 1\n\tSGIS_sharpen_texture\t\t\t\t= 1\n\tSGIS_texture4D\t\t\t\t\t= 1\n\tSGIS_texture_border_clamp\t\t\t= 1\n\tSGIS_texture_edge_clamp\t\t\t\t= 1\n\tSGIS_texture_filter4\t\t\t\t= 1\n\tSGIS_texture_lod\t\t\t\t= 1\n\tSGIS_texture_select\t\t\t\t= 1\n\tSGIX_async\t\t\t\t\t= 1\n\tSGIX_async_histogram\t\t\t\t= 1\n\tSGIX_async_pixel\t\t\t\t= 1\n\tSGIX_blend_alpha_minmax\t\t\t\t= 1\n\tSGIX_calligraphic_fragment\t\t\t= 1\n\tSGIX_clipmap\t\t\t\t\t= 1\n\tSGIX_convolution_accuracy\t\t\t= 1\n\tSGIX_depth_texture\t\t\t\t= 1\n\tSGIX_flush_raster\t\t\t\t= 1\n\tSGIX_fog_offset\t\t\t\t\t= 1\n\tSGIX_fragment_lighting\t\t\t\t= 1\n\tSGIX_framezoom\t\t\t\t\t= 1\n\tSGIX_icc_texture\t\t\t\t= 1\n\tSGIX_impact_pixel_texture\t\t\t= 1\n\tSGIX_instruments\t\t\t\t= 1\n\tSGIX_interlace\t\t\t\t\t= 1\n\tSGIX_ir_instrument1\t\t\t\t= 1\n\tSGIX_list_priority\t\t\t\t= 1\n\tSGIX_pixel_texture\t\t\t\t= 1\n\tSGIX_pixel_tiles\t\t\t\t= 1\n\tSGIX_polynomial_ffd\t\t\t\t= 1\n\tSGIX_reference_plane\t\t\t\t= 1\n\tSGIX_resample\t\t\t\t\t= 1\n\tSGIX_scalebias_hint\t\t\t\t= 1\n\tSGIX_shadow\t\t\t\t\t= 1\n\tSGIX_shadow_ambient\t\t\t\t= 1\n\tSGIX_sprite\t\t\t\t\t= 1\n\tSGIX_subsample\t\t\t\t\t= 1\n\tSGIX_tag_sample_buffer\t\t\t\t= 1\n\tSGIX_texture_add_env\t\t\t\t= 1\n\tSGIX_texture_coordinate_clamp\t\t\t= 1\n\tSGIX_texture_lod_bias\t\t\t\t= 1\n\tSGIX_texture_multi_buffer\t\t\t= 1\n\tSGIX_texture_scale_bias\t\t\t\t= 1\n\tSGIX_vertex_preclip\t\t\t\t= 1\n\tSGIX_ycrcb\t\t\t\t\t= 1\n\tSGI_color_matrix\t\t\t\t= 1\n\tSGI_color_table\t\t\t\t\t= 1\n\tSGI_texture_color_table\t\t\t\t= 1\n\n###############################################################################\n\nAttribMask enum:\n\tCURRENT_BIT\t\t\t\t\t= 0x00000001\n\tPOINT_BIT\t\t\t\t\t= 0x00000002\n\tLINE_BIT\t\t\t\t\t= 0x00000004\n\tPOLYGON_BIT\t\t\t\t\t= 0x00000008\n\tPOLYGON_STIPPLE_BIT\t\t\t\t= 0x00000010\n\tPIXEL_MODE_BIT\t\t\t\t\t= 0x00000020\n\tLIGHTING_BIT\t\t\t\t\t= 0x00000040\n\tFOG_BIT\t\t\t\t\t\t= 0x00000080\n\tDEPTH_BUFFER_BIT\t\t\t\t= 0x00000100\n\tACCUM_BUFFER_BIT\t\t\t\t= 0x00000200\n\tSTENCIL_BUFFER_BIT\t\t\t\t= 0x00000400\n\tVIEWPORT_BIT\t\t\t\t\t= 0x00000800\n\tTRANSFORM_BIT\t\t\t\t\t= 0x00001000\n\tENABLE_BIT\t\t\t\t\t= 0x00002000\n\tCOLOR_BUFFER_BIT\t\t\t\t= 0x00004000\n\tHINT_BIT\t\t\t\t\t= 0x00008000\n\tEVAL_BIT\t\t\t\t\t= 0x00010000\n\tLIST_BIT\t\t\t\t\t= 0x00020000\n\tTEXTURE_BIT\t\t\t\t\t= 0x00040000\n\tSCISSOR_BIT\t\t\t\t\t= 0x00080000\n\tALL_ATTRIB_BITS\t\t\t\t\t= 0xFFFFFFFF\n#??? ALL_ATTRIB_BITS mask value changed to all-1s in OpenGL 1.3 - this affects covgl.\n#\tuse ARB_multisample MULTISAMPLE_BIT_ARB\n#\tuse EXT_multisample MULTISAMPLE_BIT_EXT\n#\tuse 3DFX_multisample MULTISAMPLE_BIT_3DFX\n\nVERSION_1_3 enum: (Promoted for OpenGL 1.3)\n\tMULTISAMPLE_BIT\t\t\t\t\t= 0x20000000\n\nARB_multisample enum:\n\tMULTISAMPLE_BIT_ARB\t\t\t\t= 0x20000000\n\nEXT_multisample enum:\n\tMULTISAMPLE_BIT_EXT\t\t\t\t= 0x20000000\n\n3DFX_multisample enum:\n\tMULTISAMPLE_BIT_3DFX\t\t\t\t= 0x20000000\n\n###############################################################################\n\n# Note that COVERAGE_BUFFER_BIT_NV collides with AttribMask bit\n# HINT_BIT. This is OK since the extension is for OpenGL ES 2, which\n# doesn't have attribute groups.\nClearBufferMask enum:\n\tuse AttribMask DEPTH_BUFFER_BIT\t\t\t# = 0x00000100\n\tuse AttribMask ACCUM_BUFFER_BIT\t\t\t# = 0x00000200\n\tuse AttribMask STENCIL_BUFFER_BIT\t\t# = 0x00000400\n\tuse AttribMask COLOR_BUFFER_BIT\t\t\t# = 0x00004000\n\tuse NV_coverage_sample COVERAGE_BUFFER_BIT_NV\t# = 0x00008000\n\n###############################################################################\n\nClientAttribMask enum:\n\tCLIENT_PIXEL_STORE_BIT\t\t\t\t= 0x00000001\n\tCLIENT_VERTEX_ARRAY_BIT\t\t\t\t= 0x00000002\n\tCLIENT_ALL_ATTRIB_BITS\t\t\t\t= 0xFFFFFFFF\n\n###############################################################################\n\n# There's no obvious better place to put non-attribute-group mask bits\nVERSION_3_0 enum:\n\tuse ARB_map_buffer_range\t    MAP_READ_BIT\n\tuse ARB_map_buffer_range\t    MAP_WRITE_BIT\n\tuse ARB_map_buffer_range\t    MAP_INVALIDATE_RANGE_BIT\n\tuse ARB_map_buffer_range\t    MAP_INVALIDATE_BUFFER_BIT\n\tuse ARB_map_buffer_range\t    MAP_FLUSH_EXPLICIT_BIT\n\tuse ARB_map_buffer_range\t    MAP_UNSYNCHRONIZED_BIT\n\nARB_map_buffer_range enum:\n\tMAP_READ_BIT\t\t\t\t\t= 0x0001    # VERSION_3_0 / ARB_mbr\n\tMAP_WRITE_BIT\t\t\t\t\t= 0x0002    # VERSION_3_0 / ARB_mbr\n\tMAP_INVALIDATE_RANGE_BIT\t\t\t= 0x0004    # VERSION_3_0 / ARB_mbr\n\tMAP_INVALIDATE_BUFFER_BIT\t\t\t= 0x0008    # VERSION_3_0 / ARB_mbr\n\tMAP_FLUSH_EXPLICIT_BIT\t\t\t\t= 0x0010    # VERSION_3_0 / ARB_mbr\n\tMAP_UNSYNCHRONIZED_BIT\t\t\t\t= 0x0020    # VERSION_3_0 / ARB_mbr\n\n###############################################################################\n\nVERSION_3_0 enum:\n\tCONTEXT_FLAG_FORWARD_COMPATIBLE_BIT\t\t= 0x0001    # VERSION_3_0\n\n###############################################################################\n\nBoolean enum:\n\tFALSE\t\t\t\t\t\t= 0\n\tTRUE\t\t\t\t\t\t= 1\n\n###############################################################################\n\nBeginMode enum:\n\tPOINTS\t\t\t\t\t\t= 0x0000\n\tLINES\t\t\t\t\t\t= 0x0001\n\tLINE_LOOP\t\t\t\t\t= 0x0002\n\tLINE_STRIP\t\t\t\t\t= 0x0003\n\tTRIANGLES\t\t\t\t\t= 0x0004\n\tTRIANGLE_STRIP\t\t\t\t\t= 0x0005\n\tTRIANGLE_FAN\t\t\t\t\t= 0x0006\n\tQUADS\t\t\t\t\t\t= 0x0007\n\tQUAD_STRIP\t\t\t\t\t= 0x0008\n\tPOLYGON\t\t\t\t\t\t= 0x0009\n\nVERSION_3_2 enum:\n\tLINES_ADJACENCY\t\t\t\t\t= 0x000A\n\tLINE_STRIP_ADJACENCY\t\t\t\t= 0x000B\n\tTRIANGLES_ADJACENCY\t\t\t\t= 0x000C\n\tTRIANGLE_STRIP_ADJACENCY\t\t\t= 0x000D\n\nARB_geometry_shader4 enum: (additional; see below)\n\tLINES_ADJACENCY_ARB\t\t\t\t= 0x000A\n\tLINE_STRIP_ADJACENCY_ARB\t\t\t= 0x000B\n\tTRIANGLES_ADJACENCY_ARB\t\t\t\t= 0x000C\n\tTRIANGLE_STRIP_ADJACENCY_ARB\t\t\t= 0x000D\n\nNV_geometry_program4 enum: (additional; see below)\n\tLINES_ADJACENCY_EXT\t\t\t\t= 0x000A\n\tLINE_STRIP_ADJACENCY_EXT\t\t\t= 0x000B\n\tTRIANGLES_ADJACENCY_EXT\t\t\t\t= 0x000C\n\tTRIANGLE_STRIP_ADJACENCY_EXT\t\t\t= 0x000D\n\n# BeginMode_future_use: 0x000E\n\n###############################################################################\n\nAccumOp enum:\n\tACCUM\t\t\t\t\t\t= 0x0100\n\tLOAD\t\t\t\t\t\t= 0x0101\n\tRETURN\t\t\t\t\t\t= 0x0102\n\tMULT\t\t\t\t\t\t= 0x0103\n\tADD\t\t\t\t\t\t= 0x0104\n\n###############################################################################\n\nAlphaFunction enum:\n\tNEVER\t\t\t\t\t\t= 0x0200\n\tLESS\t\t\t\t\t\t= 0x0201\n\tEQUAL\t\t\t\t\t\t= 0x0202\n\tLEQUAL\t\t\t\t\t\t= 0x0203\n\tGREATER\t\t\t\t\t\t= 0x0204\n\tNOTEQUAL\t\t\t\t\t= 0x0205\n\tGEQUAL\t\t\t\t\t\t= 0x0206\n\tALWAYS\t\t\t\t\t\t= 0x0207\n\n###############################################################################\n\nBlendingFactorDest enum:\n\tZERO\t\t\t\t\t\t= 0\n\tONE\t\t\t\t\t\t= 1\n\tSRC_COLOR\t\t\t\t\t= 0x0300\n\tONE_MINUS_SRC_COLOR\t\t\t\t= 0x0301\n\tSRC_ALPHA\t\t\t\t\t= 0x0302\n\tONE_MINUS_SRC_ALPHA\t\t\t\t= 0x0303\n\tDST_ALPHA\t\t\t\t\t= 0x0304\n\tONE_MINUS_DST_ALPHA\t\t\t\t= 0x0305\n\tuse EXT_blend_color CONSTANT_COLOR_EXT\n\tuse EXT_blend_color ONE_MINUS_CONSTANT_COLOR_EXT\n\tuse EXT_blend_color CONSTANT_ALPHA_EXT\n\tuse EXT_blend_color ONE_MINUS_CONSTANT_ALPHA_EXT\n\n###############################################################################\n\nBlendingFactorSrc enum:\n\tuse BlendingFactorDest ZERO\n\tuse BlendingFactorDest ONE\n\tDST_COLOR\t\t\t\t\t= 0x0306\n\tONE_MINUS_DST_COLOR\t\t\t\t= 0x0307\n\tSRC_ALPHA_SATURATE\t\t\t\t= 0x0308\n\tuse BlendingFactorDest SRC_ALPHA\n\tuse BlendingFactorDest ONE_MINUS_SRC_ALPHA\n\tuse BlendingFactorDest DST_ALPHA\n\tuse BlendingFactorDest ONE_MINUS_DST_ALPHA\n\tuse EXT_blend_color CONSTANT_COLOR_EXT\n\tuse EXT_blend_color ONE_MINUS_CONSTANT_COLOR_EXT\n\tuse EXT_blend_color CONSTANT_ALPHA_EXT\n\tuse EXT_blend_color ONE_MINUS_CONSTANT_ALPHA_EXT\n\n###############################################################################\n\nBlendEquationModeEXT enum:\n\tuse GetPName LOGIC_OP\n\tuse EXT_blend_minmax FUNC_ADD_EXT\n\tuse EXT_blend_minmax MIN_EXT\n\tuse EXT_blend_minmax MAX_EXT\n\tuse EXT_blend_subtract FUNC_SUBTRACT_EXT\n\tuse EXT_blend_subtract FUNC_REVERSE_SUBTRACT_EXT\n\tuse SGIX_blend_alpha_minmax ALPHA_MIN_SGIX\n\tuse SGIX_blend_alpha_minmax ALPHA_MAX_SGIX\n\n###############################################################################\n\nColorMaterialFace enum:\n\tuse DrawBufferMode FRONT\n\tuse DrawBufferMode BACK\n\tuse DrawBufferMode FRONT_AND_BACK\n\n###############################################################################\n\nColorMaterialParameter enum:\n\tuse LightParameter AMBIENT\n\tuse LightParameter DIFFUSE\n\tuse LightParameter SPECULAR\n\tuse MaterialParameter EMISSION\n\tuse MaterialParameter AMBIENT_AND_DIFFUSE\n\n###############################################################################\n\nColorPointerType enum:\n\tuse DataType BYTE\n\tuse DataType UNSIGNED_BYTE\n\tuse DataType SHORT\n\tuse DataType UNSIGNED_SHORT\n\tuse DataType INT\n\tuse DataType UNSIGNED_INT\n\tuse DataType FLOAT\n\tuse DataType DOUBLE\n\n###############################################################################\n\nColorTableParameterPNameSGI enum:\n\tuse SGI_color_table COLOR_TABLE_SCALE_SGI\n\tuse SGI_color_table COLOR_TABLE_BIAS_SGI\n\n###############################################################################\n\nColorTableTargetSGI enum:\n\tuse SGI_color_table COLOR_TABLE_SGI\n\tuse SGI_color_table POST_CONVOLUTION_COLOR_TABLE_SGI\n\tuse SGI_color_table POST_COLOR_MATRIX_COLOR_TABLE_SGI\n\tuse SGI_color_table PROXY_COLOR_TABLE_SGI\n\tuse SGI_color_table PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI\n\tuse SGI_color_table PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI\n\tuse SGI_texture_color_table TEXTURE_COLOR_TABLE_SGI\n\tuse SGI_texture_color_table PROXY_TEXTURE_COLOR_TABLE_SGI\n\n###############################################################################\n\nConvolutionBorderModeEXT enum:\n\tuse EXT_convolution REDUCE_EXT\n\n###############################################################################\n\nConvolutionParameterEXT enum:\n\tuse EXT_convolution CONVOLUTION_BORDER_MODE_EXT\n\tuse EXT_convolution CONVOLUTION_FILTER_SCALE_EXT\n\tuse EXT_convolution CONVOLUTION_FILTER_BIAS_EXT\n\n###############################################################################\n\nConvolutionTargetEXT enum:\n\tuse EXT_convolution CONVOLUTION_1D_EXT\n\tuse EXT_convolution CONVOLUTION_2D_EXT\n\n###############################################################################\n\nCullFaceMode enum:\n\tuse DrawBufferMode FRONT\n\tuse DrawBufferMode BACK\n\tuse DrawBufferMode FRONT_AND_BACK\n\n###############################################################################\n\nDepthFunction enum:\n\tuse AlphaFunction NEVER\n\tuse AlphaFunction LESS\n\tuse AlphaFunction EQUAL\n\tuse AlphaFunction LEQUAL\n\tuse AlphaFunction GREATER\n\tuse AlphaFunction NOTEQUAL\n\tuse AlphaFunction GEQUAL\n\tuse AlphaFunction ALWAYS\n\n###############################################################################\n\nDrawBufferMode enum:\n\tNONE\t\t\t\t\t\t= 0\n\tFRONT_LEFT\t\t\t\t\t= 0x0400\n\tFRONT_RIGHT\t\t\t\t\t= 0x0401\n\tBACK_LEFT\t\t\t\t\t= 0x0402\n\tBACK_RIGHT\t\t\t\t\t= 0x0403\n\tFRONT\t\t\t\t\t\t= 0x0404\n\tBACK\t\t\t\t\t\t= 0x0405\n\tLEFT\t\t\t\t\t\t= 0x0406\n\tRIGHT\t\t\t\t\t\t= 0x0407\n\tFRONT_AND_BACK\t\t\t\t\t= 0x0408\n\tAUX0\t\t\t\t\t\t= 0x0409\n\tAUX1\t\t\t\t\t\t= 0x040A\n\tAUX2\t\t\t\t\t\t= 0x040B\n\tAUX3\t\t\t\t\t\t= 0x040C\n\n# Aliases DrawBufferMode enum above\nOES_framebuffer_object enum: (OpenGL ES only; additional; see below)\n#\tNONE_OES\t\t\t\t\t= 0\n\n###############################################################################\n\nEnableCap enum:\n\tuse GetPName FOG\n\tuse GetPName LIGHTING\n\tuse GetPName TEXTURE_1D\n\tuse GetPName TEXTURE_2D\n\tuse GetPName LINE_STIPPLE\n\tuse GetPName POLYGON_STIPPLE\n\tuse GetPName CULL_FACE\n\tuse GetPName ALPHA_TEST\n\tuse GetPName BLEND\n\tuse GetPName INDEX_LOGIC_OP\n\tuse GetPName COLOR_LOGIC_OP\n\tuse GetPName DITHER\n\tuse GetPName STENCIL_TEST\n\tuse GetPName DEPTH_TEST\n\tuse GetPName CLIP_PLANE0\n\tuse GetPName CLIP_PLANE1\n\tuse GetPName CLIP_PLANE2\n\tuse GetPName CLIP_PLANE3\n\tuse GetPName CLIP_PLANE4\n\tuse GetPName CLIP_PLANE5\n\tuse GetPName LIGHT0\n\tuse GetPName LIGHT1\n\tuse GetPName LIGHT2\n\tuse GetPName LIGHT3\n\tuse GetPName LIGHT4\n\tuse GetPName LIGHT5\n\tuse GetPName LIGHT6\n\tuse GetPName LIGHT7\n\tuse GetPName TEXTURE_GEN_S\n\tuse GetPName TEXTURE_GEN_T\n\tuse GetPName TEXTURE_GEN_R\n\tuse GetPName TEXTURE_GEN_Q\n\tuse GetPName MAP1_VERTEX_3\n\tuse GetPName MAP1_VERTEX_4\n\tuse GetPName MAP1_COLOR_4\n\tuse GetPName MAP1_INDEX\n\tuse GetPName MAP1_NORMAL\n\tuse GetPName MAP1_TEXTURE_COORD_1\n\tuse GetPName MAP1_TEXTURE_COORD_2\n\tuse GetPName MAP1_TEXTURE_COORD_3\n\tuse GetPName MAP1_TEXTURE_COORD_4\n\tuse GetPName MAP2_VERTEX_3\n\tuse GetPName MAP2_VERTEX_4\n\tuse GetPName MAP2_COLOR_4\n\tuse GetPName MAP2_INDEX\n\tuse GetPName MAP2_NORMAL\n\tuse GetPName MAP2_TEXTURE_COORD_1\n\tuse GetPName MAP2_TEXTURE_COORD_2\n\tuse GetPName MAP2_TEXTURE_COORD_3\n\tuse GetPName MAP2_TEXTURE_COORD_4\n\tuse GetPName POINT_SMOOTH\n\tuse GetPName LINE_SMOOTH\n\tuse GetPName POLYGON_SMOOTH\n\tuse GetPName SCISSOR_TEST\n\tuse GetPName COLOR_MATERIAL\n\tuse GetPName NORMALIZE\n\tuse GetPName AUTO_NORMAL\n\tuse GetPName POLYGON_OFFSET_POINT\n\tuse GetPName POLYGON_OFFSET_LINE\n\tuse GetPName POLYGON_OFFSET_FILL\n\tuse GetPName VERTEX_ARRAY\n\tuse GetPName NORMAL_ARRAY\n\tuse GetPName COLOR_ARRAY\n\tuse GetPName INDEX_ARRAY\n\tuse GetPName TEXTURE_COORD_ARRAY\n\tuse GetPName EDGE_FLAG_ARRAY\n\tuse EXT_convolution CONVOLUTION_1D_EXT\n\tuse EXT_convolution CONVOLUTION_2D_EXT\n\tuse EXT_convolution SEPARABLE_2D_EXT\n\tuse EXT_histogram HISTOGRAM_EXT\n\tuse EXT_histogram MINMAX_EXT\n\tuse EXT_rescale_normal RESCALE_NORMAL_EXT\n\tuse EXT_shared_texture_palette SHARED_TEXTURE_PALETTE_EXT\n\tuse EXT_texture3D TEXTURE_3D_EXT\n\tuse SGIS_multisample MULTISAMPLE_SGIS\n\tuse SGIS_multisample SAMPLE_ALPHA_TO_MASK_SGIS\n\tuse SGIS_multisample SAMPLE_ALPHA_TO_ONE_SGIS\n\tuse SGIS_multisample SAMPLE_MASK_SGIS\n\tuse SGIS_texture4D TEXTURE_4D_SGIS\n\tuse SGIX_async_histogram ASYNC_HISTOGRAM_SGIX\n\tuse SGIX_async_pixel ASYNC_TEX_IMAGE_SGIX\n\tuse SGIX_async_pixel ASYNC_DRAW_PIXELS_SGIX\n\tuse SGIX_async_pixel ASYNC_READ_PIXELS_SGIX\n\tuse SGIX_calligraphic_fragment CALLIGRAPHIC_FRAGMENT_SGIX\n\tuse SGIX_fog_offset FOG_OFFSET_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHTING_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_COLOR_MATERIAL_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT0_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT1_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT2_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT3_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT4_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT5_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT6_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT7_SGIX\n\tuse SGIX_framezoom FRAMEZOOM_SGIX\n\tuse SGIX_interlace INTERLACE_SGIX\n\tuse SGIX_ir_instrument1 IR_INSTRUMENT1_SGIX\n\tuse SGIX_pixel_texture PIXEL_TEX_GEN_SGIX\n\tuse SGIS_pixel_texture PIXEL_TEXTURE_SGIS\n\tuse SGIX_reference_plane REFERENCE_PLANE_SGIX\n\tuse SGIX_sprite SPRITE_SGIX\n\tuse SGI_color_table COLOR_TABLE_SGI\n\tuse SGI_color_table POST_CONVOLUTION_COLOR_TABLE_SGI\n\tuse SGI_color_table POST_COLOR_MATRIX_COLOR_TABLE_SGI\n\tuse SGI_texture_color_table TEXTURE_COLOR_TABLE_SGI\n\n###############################################################################\n\nErrorCode enum:\n\tNO_ERROR\t\t\t\t\t= 0\n\tINVALID_ENUM\t\t\t\t\t= 0x0500\n\tINVALID_VALUE\t\t\t\t\t= 0x0501\n\tINVALID_OPERATION\t\t\t\t= 0x0502\n\tSTACK_OVERFLOW\t\t\t\t\t= 0x0503\n\tSTACK_UNDERFLOW\t\t\t\t\t= 0x0504\n\tOUT_OF_MEMORY\t\t\t\t\t= 0x0505\n\tuse EXT_histogram TABLE_TOO_LARGE_EXT\n\tuse EXT_texture TEXTURE_TOO_LARGE_EXT\n\n# Additional error codes\n\nVERSION_3_0 enum:\n#\tuse ARB_framebuffer_object\t    INVALID_FRAMEBUFFER_OPERATION\n\nARB_framebuffer_object enum: (note: no ARB suffixes)\n\tINVALID_FRAMEBUFFER_OPERATION\t\t\t= 0x0506    # VERSION_3_0 / ARB_fbo\n\nEXT_framebuffer_object enum:\n\tINVALID_FRAMEBUFFER_OPERATION_EXT\t\t= 0x0506\n\n# Aliases EXT_fbo enum above\nOES_framebuffer_object enum: (OpenGL ES only; additional; see below)\n\tINVALID_FRAMEBUFFER_OPERATION_OES\t\t= 0x0506\n\n###############################################################################\n\nFeedbackType enum:\n\t2D\t\t\t\t\t\t= 0x0600\n\t3D\t\t\t\t\t\t= 0x0601\n\t3D_COLOR\t\t\t\t\t= 0x0602\n\t3D_COLOR_TEXTURE\t\t\t\t= 0x0603\n\t4D_COLOR_TEXTURE\t\t\t\t= 0x0604\n\n###############################################################################\n\nFeedBackToken enum:\n\tPASS_THROUGH_TOKEN\t\t\t\t= 0x0700\n\tPOINT_TOKEN\t\t\t\t\t= 0x0701\n\tLINE_TOKEN\t\t\t\t\t= 0x0702\n\tPOLYGON_TOKEN\t\t\t\t\t= 0x0703\n\tBITMAP_TOKEN\t\t\t\t\t= 0x0704\n\tDRAW_PIXEL_TOKEN\t\t\t\t= 0x0705\n\tCOPY_PIXEL_TOKEN\t\t\t\t= 0x0706\n\tLINE_RESET_TOKEN\t\t\t\t= 0x0707\n\n###############################################################################\n\nFfdMaskSGIX enum:\n\tTEXTURE_DEFORMATION_BIT_SGIX\t\t\t= 0x00000001\n\tGEOMETRY_DEFORMATION_BIT_SGIX\t\t\t= 0x00000002\n\n###############################################################################\n\nFfdTargetSGIX enum:\n\tuse SGIX_polynomial_ffd GEOMETRY_DEFORMATION_SGIX\n\tuse SGIX_polynomial_ffd TEXTURE_DEFORMATION_SGIX\n\n###############################################################################\n\nFogMode enum:\n\tuse TextureMagFilter LINEAR\n\tEXP\t\t\t\t\t\t= 0x0800\n\tEXP2\t\t\t\t\t\t= 0x0801\n\tuse SGIS_fog_function FOG_FUNC_SGIS\n\n###############################################################################\n\nFogParameter enum:\n\tuse GetPName FOG_COLOR\n\tuse GetPName FOG_DENSITY\n\tuse GetPName FOG_END\n\tuse GetPName FOG_INDEX\n\tuse GetPName FOG_MODE\n\tuse GetPName FOG_START\n\tuse SGIX_fog_offset FOG_OFFSET_VALUE_SGIX\n\n###############################################################################\n\nFragmentLightModelParameterSGIX enum:\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX\n\n###############################################################################\n\nFrontFaceDirection enum:\n\tCW\t\t\t\t\t\t= 0x0900\n\tCCW\t\t\t\t\t\t= 0x0901\n\n###############################################################################\n\nGetColorTableParameterPNameSGI enum:\n\tuse SGI_color_table COLOR_TABLE_SCALE_SGI\n\tuse SGI_color_table COLOR_TABLE_BIAS_SGI\n\tuse SGI_color_table COLOR_TABLE_FORMAT_SGI\n\tuse SGI_color_table COLOR_TABLE_WIDTH_SGI\n\tuse SGI_color_table COLOR_TABLE_RED_SIZE_SGI\n\tuse SGI_color_table COLOR_TABLE_GREEN_SIZE_SGI\n\tuse SGI_color_table COLOR_TABLE_BLUE_SIZE_SGI\n\tuse SGI_color_table COLOR_TABLE_ALPHA_SIZE_SGI\n\tuse SGI_color_table COLOR_TABLE_LUMINANCE_SIZE_SGI\n\tuse SGI_color_table COLOR_TABLE_INTENSITY_SIZE_SGI\n\n###############################################################################\n\nGetConvolutionParameter enum:\n\tuse EXT_convolution CONVOLUTION_BORDER_MODE_EXT\n\tuse EXT_convolution CONVOLUTION_FILTER_SCALE_EXT\n\tuse EXT_convolution CONVOLUTION_FILTER_BIAS_EXT\n\tuse EXT_convolution CONVOLUTION_FORMAT_EXT\n\tuse EXT_convolution CONVOLUTION_WIDTH_EXT\n\tuse EXT_convolution CONVOLUTION_HEIGHT_EXT\n\tuse EXT_convolution MAX_CONVOLUTION_WIDTH_EXT\n\tuse EXT_convolution MAX_CONVOLUTION_HEIGHT_EXT\n\n###############################################################################\n\nGetHistogramParameterPNameEXT enum:\n\tuse EXT_histogram HISTOGRAM_WIDTH_EXT\n\tuse EXT_histogram HISTOGRAM_FORMAT_EXT\n\tuse EXT_histogram HISTOGRAM_RED_SIZE_EXT\n\tuse EXT_histogram HISTOGRAM_GREEN_SIZE_EXT\n\tuse EXT_histogram HISTOGRAM_BLUE_SIZE_EXT\n\tuse EXT_histogram HISTOGRAM_ALPHA_SIZE_EXT\n\tuse EXT_histogram HISTOGRAM_LUMINANCE_SIZE_EXT\n\tuse EXT_histogram HISTOGRAM_SINK_EXT\n\n###############################################################################\n\nGetMapQuery enum:\n\tCOEFF\t\t\t\t\t\t= 0x0A00\n\tORDER\t\t\t\t\t\t= 0x0A01\n\tDOMAIN\t\t\t\t\t\t= 0x0A02\n\n###############################################################################\n\nGetMinmaxParameterPNameEXT enum:\n\tuse EXT_histogram MINMAX_FORMAT_EXT\n\tuse EXT_histogram MINMAX_SINK_EXT\n\n###############################################################################\n\nGetPixelMap enum:\n\tPIXEL_MAP_I_TO_I\t\t\t\t= 0x0C70\n\tPIXEL_MAP_S_TO_S\t\t\t\t= 0x0C71\n\tPIXEL_MAP_I_TO_R\t\t\t\t= 0x0C72\n\tPIXEL_MAP_I_TO_G\t\t\t\t= 0x0C73\n\tPIXEL_MAP_I_TO_B\t\t\t\t= 0x0C74\n\tPIXEL_MAP_I_TO_A\t\t\t\t= 0x0C75\n\tPIXEL_MAP_R_TO_R\t\t\t\t= 0x0C76\n\tPIXEL_MAP_G_TO_G\t\t\t\t= 0x0C77\n\tPIXEL_MAP_B_TO_B\t\t\t\t= 0x0C78\n\tPIXEL_MAP_A_TO_A\t\t\t\t= 0x0C79\n\n###############################################################################\n\nGetPointervPName enum:\n\tVERTEX_ARRAY_POINTER\t\t\t\t= 0x808E\n\tNORMAL_ARRAY_POINTER\t\t\t\t= 0x808F\n\tCOLOR_ARRAY_POINTER\t\t\t\t= 0x8090\n\tINDEX_ARRAY_POINTER\t\t\t\t= 0x8091\n\tTEXTURE_COORD_ARRAY_POINTER\t\t\t= 0x8092\n\tEDGE_FLAG_ARRAY_POINTER\t\t\t\t= 0x8093\n\tFEEDBACK_BUFFER_POINTER\t\t\t\t= 0x0DF0\n\tSELECTION_BUFFER_POINTER\t\t\t= 0x0DF3\n\tuse SGIX_instruments INSTRUMENT_BUFFER_POINTER_SGIX\n\n###############################################################################\n\n# the columns after the comment symbol (#) indicate: number of params, type\n# (F - float, D - double, I - integer) for the returned values\nGetPName enum:\n\tCURRENT_COLOR\t\t\t\t\t= 0x0B00 # 4 F\n\tCURRENT_INDEX\t\t\t\t\t= 0x0B01 # 1 F\n\tCURRENT_NORMAL\t\t\t\t\t= 0x0B02 # 3 F\n\tCURRENT_TEXTURE_COORDS\t\t\t\t= 0x0B03 # 4 F\n\tCURRENT_RASTER_COLOR\t\t\t\t= 0x0B04 # 4 F\n\tCURRENT_RASTER_INDEX\t\t\t\t= 0x0B05 # 1 F\n\tCURRENT_RASTER_TEXTURE_COORDS\t\t\t= 0x0B06 # 4 F\n\tCURRENT_RASTER_POSITION\t\t\t\t= 0x0B07 # 4 F\n\tCURRENT_RASTER_POSITION_VALID\t\t\t= 0x0B08 # 1 I\n\tCURRENT_RASTER_DISTANCE\t\t\t\t= 0x0B09 # 1 F\n\n\tPOINT_SMOOTH\t\t\t\t\t= 0x0B10 # 1 I\n\tPOINT_SIZE\t\t\t\t\t= 0x0B11 # 1 F\n\tPOINT_SIZE_RANGE\t\t\t\t= 0x0B12 # 2 F\n\tPOINT_SIZE_GRANULARITY\t\t\t\t= 0x0B13 # 1 F\n\n\tLINE_SMOOTH\t\t\t\t\t= 0x0B20 # 1 I\n\tLINE_WIDTH\t\t\t\t\t= 0x0B21 # 1 F\n\tLINE_WIDTH_RANGE\t\t\t\t= 0x0B22 # 2 F\n\tLINE_WIDTH_GRANULARITY\t\t\t\t= 0x0B23 # 1 F\n\tLINE_STIPPLE\t\t\t\t\t= 0x0B24 # 1 I\n\tLINE_STIPPLE_PATTERN\t\t\t\t= 0x0B25 # 1 I\n\tLINE_STIPPLE_REPEAT\t\t\t\t= 0x0B26 # 1 I\n\tuse VERSION_1_2 SMOOTH_POINT_SIZE_RANGE\n\tuse VERSION_1_2 SMOOTH_POINT_SIZE_GRANULARITY\n\tuse VERSION_1_2 SMOOTH_LINE_WIDTH_RANGE\n\tuse VERSION_1_2 SMOOTH_LINE_WIDTH_GRANULARITY\n\tuse VERSION_1_2 ALIASED_POINT_SIZE_RANGE\n\tuse VERSION_1_2 ALIASED_LINE_WIDTH_RANGE\n\n\tLIST_MODE\t\t\t\t\t= 0x0B30 # 1 I\n\tMAX_LIST_NESTING\t\t\t\t= 0x0B31 # 1 I\n\tLIST_BASE\t\t\t\t\t= 0x0B32 # 1 I\n\tLIST_INDEX\t\t\t\t\t= 0x0B33 # 1 I\n\n\tPOLYGON_MODE\t\t\t\t\t= 0x0B40 # 2 I\n\tPOLYGON_SMOOTH\t\t\t\t\t= 0x0B41 # 1 I\n\tPOLYGON_STIPPLE\t\t\t\t\t= 0x0B42 # 1 I\n\tEDGE_FLAG\t\t\t\t\t= 0x0B43 # 1 I\n\tCULL_FACE\t\t\t\t\t= 0x0B44 # 1 I\n\tCULL_FACE_MODE\t\t\t\t\t= 0x0B45 # 1 I\n\tFRONT_FACE\t\t\t\t\t= 0x0B46 # 1 I\n\n\tLIGHTING\t\t\t\t\t= 0x0B50 # 1 I\n\tLIGHT_MODEL_LOCAL_VIEWER\t\t\t= 0x0B51 # 1 I\n\tLIGHT_MODEL_TWO_SIDE\t\t\t\t= 0x0B52 # 1 I\n\tLIGHT_MODEL_AMBIENT\t\t\t\t= 0x0B53 # 4 F\n\tSHADE_MODEL\t\t\t\t\t= 0x0B54 # 1 I\n\tCOLOR_MATERIAL_FACE\t\t\t\t= 0x0B55 # 1 I\n\tCOLOR_MATERIAL_PARAMETER\t\t\t= 0x0B56 # 1 I\n\tCOLOR_MATERIAL\t\t\t\t\t= 0x0B57 # 1 I\n\n\tFOG\t\t\t\t\t\t= 0x0B60 # 1 I\n\tFOG_INDEX\t\t\t\t\t= 0x0B61 # 1 I\n\tFOG_DENSITY\t\t\t\t\t= 0x0B62 # 1 F\n\tFOG_START\t\t\t\t\t= 0x0B63 # 1 F\n\tFOG_END\t\t\t\t\t\t= 0x0B64 # 1 F\n\tFOG_MODE\t\t\t\t\t= 0x0B65 # 1 I\n\tFOG_COLOR\t\t\t\t\t= 0x0B66 # 4 F\n\n\tDEPTH_RANGE\t\t\t\t\t= 0x0B70 # 2 F\n\tDEPTH_TEST\t\t\t\t\t= 0x0B71 # 1 I\n\tDEPTH_WRITEMASK\t\t\t\t\t= 0x0B72 # 1 I\n\tDEPTH_CLEAR_VALUE\t\t\t\t= 0x0B73 # 1 F\n\tDEPTH_FUNC\t\t\t\t\t= 0x0B74 # 1 I\n\n\tACCUM_CLEAR_VALUE\t\t\t\t= 0x0B80 # 4 F\n\n\tSTENCIL_TEST\t\t\t\t\t= 0x0B90 # 1 I\n\tSTENCIL_CLEAR_VALUE\t\t\t\t= 0x0B91 # 1 I\n\tSTENCIL_FUNC\t\t\t\t\t= 0x0B92 # 1 I\n\tSTENCIL_VALUE_MASK\t\t\t\t= 0x0B93 # 1 I\n\tSTENCIL_FAIL\t\t\t\t\t= 0x0B94 # 1 I\n\tSTENCIL_PASS_DEPTH_FAIL\t\t\t\t= 0x0B95 # 1 I\n\tSTENCIL_PASS_DEPTH_PASS\t\t\t\t= 0x0B96 # 1 I\n\tSTENCIL_REF\t\t\t\t\t= 0x0B97 # 1 I\n\tSTENCIL_WRITEMASK\t\t\t\t= 0x0B98 # 1 I\n\n\tMATRIX_MODE\t\t\t\t\t= 0x0BA0 # 1 I\n\tNORMALIZE\t\t\t\t\t= 0x0BA1 # 1 I\n\tVIEWPORT\t\t\t\t\t= 0x0BA2 # 4 I\n\tMODELVIEW_STACK_DEPTH\t\t\t\t= 0x0BA3 # 1 I\n\tPROJECTION_STACK_DEPTH\t\t\t\t= 0x0BA4 # 1 I\n\tTEXTURE_STACK_DEPTH\t\t\t\t= 0x0BA5 # 1 I\n\tMODELVIEW_MATRIX\t\t\t\t= 0x0BA6 # 16 F\n\tPROJECTION_MATRIX\t\t\t\t= 0x0BA7 # 16 F\n\tTEXTURE_MATRIX\t\t\t\t\t= 0x0BA8 # 16 F\n\n\tATTRIB_STACK_DEPTH\t\t\t\t= 0x0BB0 # 1 I\n\tCLIENT_ATTRIB_STACK_DEPTH\t\t\t= 0x0BB1 # 1 I\n\n\tALPHA_TEST\t\t\t\t\t= 0x0BC0 # 1 I\n\tALPHA_TEST_FUNC\t\t\t\t\t= 0x0BC1 # 1 I\n\tALPHA_TEST_REF\t\t\t\t\t= 0x0BC2 # 1 F\n\n\tDITHER\t\t\t\t\t\t= 0x0BD0 # 1 I\n\n\tBLEND_DST\t\t\t\t\t= 0x0BE0 # 1 I\n\tBLEND_SRC\t\t\t\t\t= 0x0BE1 # 1 I\n\tBLEND\t\t\t\t\t\t= 0x0BE2 # 1 I\n\n\tLOGIC_OP_MODE\t\t\t\t\t= 0x0BF0 # 1 I\n\tINDEX_LOGIC_OP\t\t\t\t\t= 0x0BF1 # 1 I\n\tLOGIC_OP\t\t\t\t\t= 0x0BF1 # 1 I\n\tCOLOR_LOGIC_OP\t\t\t\t\t= 0x0BF2 # 1 I\n\n\tAUX_BUFFERS\t\t\t\t\t= 0x0C00 # 1 I\n\tDRAW_BUFFER\t\t\t\t\t= 0x0C01 # 1 I\n\tREAD_BUFFER\t\t\t\t\t= 0x0C02 # 1 I\n\n\tSCISSOR_BOX\t\t\t\t\t= 0x0C10 # 4 I\n\tSCISSOR_TEST\t\t\t\t\t= 0x0C11 # 1 I\n\n\tINDEX_CLEAR_VALUE\t\t\t\t= 0x0C20 # 1 I\n\tINDEX_WRITEMASK\t\t\t\t\t= 0x0C21 # 1 I\n\tCOLOR_CLEAR_VALUE\t\t\t\t= 0x0C22 # 4 F\n\tCOLOR_WRITEMASK\t\t\t\t\t= 0x0C23 # 4 I\n\n\tINDEX_MODE\t\t\t\t\t= 0x0C30 # 1 I\n\tRGBA_MODE\t\t\t\t\t= 0x0C31 # 1 I\n\tDOUBLEBUFFER\t\t\t\t\t= 0x0C32 # 1 I\n\tSTEREO\t\t\t\t\t\t= 0x0C33 # 1 I\n\n\tRENDER_MODE\t\t\t\t\t= 0x0C40 # 1 I\n\n\tPERSPECTIVE_CORRECTION_HINT\t\t\t= 0x0C50 # 1 I\n\tPOINT_SMOOTH_HINT\t\t\t\t= 0x0C51 # 1 I\n\tLINE_SMOOTH_HINT\t\t\t\t= 0x0C52 # 1 I\n\tPOLYGON_SMOOTH_HINT\t\t\t\t= 0x0C53 # 1 I\n\tFOG_HINT\t\t\t\t\t= 0x0C54 # 1 I\n\n\tTEXTURE_GEN_S\t\t\t\t\t= 0x0C60 # 1 I\n\tTEXTURE_GEN_T\t\t\t\t\t= 0x0C61 # 1 I\n\tTEXTURE_GEN_R\t\t\t\t\t= 0x0C62 # 1 I\n\tTEXTURE_GEN_Q\t\t\t\t\t= 0x0C63 # 1 I\n\n\tPIXEL_MAP_I_TO_I_SIZE\t\t\t\t= 0x0CB0 # 1 I\n\tPIXEL_MAP_S_TO_S_SIZE\t\t\t\t= 0x0CB1 # 1 I\n\tPIXEL_MAP_I_TO_R_SIZE\t\t\t\t= 0x0CB2 # 1 I\n\tPIXEL_MAP_I_TO_G_SIZE\t\t\t\t= 0x0CB3 # 1 I\n\tPIXEL_MAP_I_TO_B_SIZE\t\t\t\t= 0x0CB4 # 1 I\n\tPIXEL_MAP_I_TO_A_SIZE\t\t\t\t= 0x0CB5 # 1 I\n\tPIXEL_MAP_R_TO_R_SIZE\t\t\t\t= 0x0CB6 # 1 I\n\tPIXEL_MAP_G_TO_G_SIZE\t\t\t\t= 0x0CB7 # 1 I\n\tPIXEL_MAP_B_TO_B_SIZE\t\t\t\t= 0x0CB8 # 1 I\n\tPIXEL_MAP_A_TO_A_SIZE\t\t\t\t= 0x0CB9 # 1 I\n\n\tUNPACK_SWAP_BYTES\t\t\t\t= 0x0CF0 # 1 I\n\tUNPACK_LSB_FIRST\t\t\t\t= 0x0CF1 # 1 I\n\tUNPACK_ROW_LENGTH\t\t\t\t= 0x0CF2 # 1 I\n\tUNPACK_SKIP_ROWS\t\t\t\t= 0x0CF3 # 1 I\n\tUNPACK_SKIP_PIXELS\t\t\t\t= 0x0CF4 # 1 I\n\tUNPACK_ALIGNMENT\t\t\t\t= 0x0CF5 # 1 I\n\n\tPACK_SWAP_BYTES\t\t\t\t\t= 0x0D00 # 1 I\n\tPACK_LSB_FIRST\t\t\t\t\t= 0x0D01 # 1 I\n\tPACK_ROW_LENGTH\t\t\t\t\t= 0x0D02 # 1 I\n\tPACK_SKIP_ROWS\t\t\t\t\t= 0x0D03 # 1 I\n\tPACK_SKIP_PIXELS\t\t\t\t= 0x0D04 # 1 I\n\tPACK_ALIGNMENT\t\t\t\t\t= 0x0D05 # 1 I\n\n\tMAP_COLOR\t\t\t\t\t= 0x0D10 # 1 I\n\tMAP_STENCIL\t\t\t\t\t= 0x0D11 # 1 I\n\tINDEX_SHIFT\t\t\t\t\t= 0x0D12 # 1 I\n\tINDEX_OFFSET\t\t\t\t\t= 0x0D13 # 1 I\n\tRED_SCALE\t\t\t\t\t= 0x0D14 # 1 F\n\tRED_BIAS\t\t\t\t\t= 0x0D15 # 1 F\n\tZOOM_X\t\t\t\t\t\t= 0x0D16 # 1 F\n\tZOOM_Y\t\t\t\t\t\t= 0x0D17 # 1 F\n\tGREEN_SCALE\t\t\t\t\t= 0x0D18 # 1 F\n\tGREEN_BIAS\t\t\t\t\t= 0x0D19 # 1 F\n\tBLUE_SCALE\t\t\t\t\t= 0x0D1A # 1 F\n\tBLUE_BIAS\t\t\t\t\t= 0x0D1B # 1 F\n\tALPHA_SCALE\t\t\t\t\t= 0x0D1C # 1 F\n\tALPHA_BIAS\t\t\t\t\t= 0x0D1D # 1 F\n\tDEPTH_SCALE\t\t\t\t\t= 0x0D1E # 1 F\n\tDEPTH_BIAS\t\t\t\t\t= 0x0D1F # 1 F\n\n\tMAX_EVAL_ORDER\t\t\t\t\t= 0x0D30 # 1 I\n\tMAX_LIGHTS\t\t\t\t\t= 0x0D31 # 1 I\n\n# VERSION_3_0 enum: (aliases)\n\tMAX_CLIP_DISTANCES\t\t\t\t= 0x0D32    # VERSION_3_0   # alias GL_MAX_CLIP_PLANES\n\n\tMAX_CLIP_PLANES\t\t\t\t\t= 0x0D32 # 1 I\n\tMAX_TEXTURE_SIZE\t\t\t\t= 0x0D33 # 1 I\n\tMAX_PIXEL_MAP_TABLE\t\t\t\t= 0x0D34 # 1 I\n\tMAX_ATTRIB_STACK_DEPTH\t\t\t\t= 0x0D35 # 1 I\n\tMAX_MODELVIEW_STACK_DEPTH\t\t\t= 0x0D36 # 1 I\n\tMAX_NAME_STACK_DEPTH\t\t\t\t= 0x0D37 # 1 I\n\tMAX_PROJECTION_STACK_DEPTH\t\t\t= 0x0D38 # 1 I\n\tMAX_TEXTURE_STACK_DEPTH\t\t\t\t= 0x0D39 # 1 I\n\tMAX_VIEWPORT_DIMS\t\t\t\t= 0x0D3A # 2 F\n\tMAX_CLIENT_ATTRIB_STACK_DEPTH\t\t\t= 0x0D3B # 1 I\n\n\tSUBPIXEL_BITS\t\t\t\t\t= 0x0D50 # 1 I\n\tINDEX_BITS\t\t\t\t\t= 0x0D51 # 1 I\n\tRED_BITS\t\t\t\t\t= 0x0D52 # 1 I\n\tGREEN_BITS\t\t\t\t\t= 0x0D53 # 1 I\n\tBLUE_BITS\t\t\t\t\t= 0x0D54 # 1 I\n\tALPHA_BITS\t\t\t\t\t= 0x0D55 # 1 I\n\tDEPTH_BITS\t\t\t\t\t= 0x0D56 # 1 I\n\tSTENCIL_BITS\t\t\t\t\t= 0x0D57 # 1 I\n\tACCUM_RED_BITS\t\t\t\t\t= 0x0D58 # 1 I\n\tACCUM_GREEN_BITS\t\t\t\t= 0x0D59 # 1 I\n\tACCUM_BLUE_BITS\t\t\t\t\t= 0x0D5A # 1 I\n\tACCUM_ALPHA_BITS\t\t\t\t= 0x0D5B # 1 I\n\n\tNAME_STACK_DEPTH\t\t\t\t= 0x0D70 # 1 I\n\n\tAUTO_NORMAL\t\t\t\t\t= 0x0D80 # 1 I\n\n\tMAP1_COLOR_4\t\t\t\t\t= 0x0D90 # 1 I\n\tMAP1_INDEX\t\t\t\t\t= 0x0D91 # 1 I\n\tMAP1_NORMAL\t\t\t\t\t= 0x0D92 # 1 I\n\tMAP1_TEXTURE_COORD_1\t\t\t\t= 0x0D93 # 1 I\n\tMAP1_TEXTURE_COORD_2\t\t\t\t= 0x0D94 # 1 I\n\tMAP1_TEXTURE_COORD_3\t\t\t\t= 0x0D95 # 1 I\n\tMAP1_TEXTURE_COORD_4\t\t\t\t= 0x0D96 # 1 I\n\tMAP1_VERTEX_3\t\t\t\t\t= 0x0D97 # 1 I\n\tMAP1_VERTEX_4\t\t\t\t\t= 0x0D98 # 1 I\n\n\tMAP2_COLOR_4\t\t\t\t\t= 0x0DB0 # 1 I\n\tMAP2_INDEX\t\t\t\t\t= 0x0DB1 # 1 I\n\tMAP2_NORMAL\t\t\t\t\t= 0x0DB2 # 1 I\n\tMAP2_TEXTURE_COORD_1\t\t\t\t= 0x0DB3 # 1 I\n\tMAP2_TEXTURE_COORD_2\t\t\t\t= 0x0DB4 # 1 I\n\tMAP2_TEXTURE_COORD_3\t\t\t\t= 0x0DB5 # 1 I\n\tMAP2_TEXTURE_COORD_4\t\t\t\t= 0x0DB6 # 1 I\n\tMAP2_VERTEX_3\t\t\t\t\t= 0x0DB7 # 1 I\n\tMAP2_VERTEX_4\t\t\t\t\t= 0x0DB8 # 1 I\n\n\tMAP1_GRID_DOMAIN\t\t\t\t= 0x0DD0 # 2 F\n\tMAP1_GRID_SEGMENTS\t\t\t\t= 0x0DD1 # 1 I\n\tMAP2_GRID_DOMAIN\t\t\t\t= 0x0DD2 # 4 F\n\tMAP2_GRID_SEGMENTS\t\t\t\t= 0x0DD3 # 2 I\n\n\tTEXTURE_1D\t\t\t\t\t= 0x0DE0 # 1 I\n\tTEXTURE_2D\t\t\t\t\t= 0x0DE1 # 1 I\n\n\tFEEDBACK_BUFFER_SIZE\t\t\t\t= 0x0DF1 # 1 I\n\tFEEDBACK_BUFFER_TYPE\t\t\t\t= 0x0DF2 # 1 I\n\n\tSELECTION_BUFFER_SIZE\t\t\t\t= 0x0DF4 # 1 I\n\n\tPOLYGON_OFFSET_UNITS\t\t\t\t= 0x2A00 # 1 F\n\tPOLYGON_OFFSET_POINT\t\t\t\t= 0x2A01 # 1 I\n\tPOLYGON_OFFSET_LINE\t\t\t\t= 0x2A02 # 1 I\n\tPOLYGON_OFFSET_FILL\t\t\t\t= 0x8037 # 1 I\n\tPOLYGON_OFFSET_FACTOR\t\t\t\t= 0x8038 # 1 F\n\n\tTEXTURE_BINDING_1D\t\t\t\t= 0x8068 # 1 I\n\tTEXTURE_BINDING_2D\t\t\t\t= 0x8069 # 1 I\n\tTEXTURE_BINDING_3D\t\t\t\t= 0x806A # 1 I\n\n\tVERTEX_ARRAY\t\t\t\t\t= 0x8074 # 1 I\n\tNORMAL_ARRAY\t\t\t\t\t= 0x8075 # 1 I\n\tCOLOR_ARRAY\t\t\t\t\t= 0x8076 # 1 I\n\tINDEX_ARRAY\t\t\t\t\t= 0x8077 # 1 I\n\tTEXTURE_COORD_ARRAY\t\t\t\t= 0x8078 # 1 I\n\tEDGE_FLAG_ARRAY\t\t\t\t\t= 0x8079 # 1 I\n\n\tVERTEX_ARRAY_SIZE\t\t\t\t= 0x807A # 1 I\n\tVERTEX_ARRAY_TYPE\t\t\t\t= 0x807B # 1 I\n\tVERTEX_ARRAY_STRIDE\t\t\t\t= 0x807C # 1 I\n\n\tNORMAL_ARRAY_TYPE\t\t\t\t= 0x807E # 1 I\n\tNORMAL_ARRAY_STRIDE\t\t\t\t= 0x807F # 1 I\n\n\tCOLOR_ARRAY_SIZE\t\t\t\t= 0x8081 # 1 I\n\tCOLOR_ARRAY_TYPE\t\t\t\t= 0x8082 # 1 I\n\tCOLOR_ARRAY_STRIDE\t\t\t\t= 0x8083 # 1 I\n\n\tINDEX_ARRAY_TYPE\t\t\t\t= 0x8085 # 1 I\n\tINDEX_ARRAY_STRIDE\t\t\t\t= 0x8086 # 1 I\n\n\tTEXTURE_COORD_ARRAY_SIZE\t\t\t= 0x8088 # 1 I\n\tTEXTURE_COORD_ARRAY_TYPE\t\t\t= 0x8089 # 1 I\n\tTEXTURE_COORD_ARRAY_STRIDE\t\t\t= 0x808A # 1 I\n\n\tEDGE_FLAG_ARRAY_STRIDE\t\t\t\t= 0x808C # 1 I\n\n\tuse ClipPlaneName CLIP_PLANE0\n\tuse ClipPlaneName CLIP_PLANE1\n\tuse ClipPlaneName CLIP_PLANE2\n\tuse ClipPlaneName CLIP_PLANE3\n\tuse ClipPlaneName CLIP_PLANE4\n\tuse ClipPlaneName CLIP_PLANE5\n\n\tuse LightName LIGHT0\n\tuse LightName LIGHT1\n\tuse LightName LIGHT2\n\tuse LightName LIGHT3\n\tuse LightName LIGHT4\n\tuse LightName LIGHT5\n\tuse LightName LIGHT6\n\tuse LightName LIGHT7\n\n#\tuse ARB_transpose_matrix\t    TRANSPOSE_MODELVIEW_MATRIX_ARB\n#\tuse ARB_transpose_matrix\t    TRANSPOSE_PROJECTION_MATRIX_ARB\n#\tuse ARB_transpose_matrix\t    TRANSPOSE_TEXTURE_MATRIX_ARB\n#\tuse ARB_transpose_matrix\t    TRANSPOSE_COLOR_MATRIX_ARB\n\n\tuse VERSION_1_2 LIGHT_MODEL_COLOR_CONTROL\n\n\tuse EXT_blend_color BLEND_COLOR_EXT\n\n\tuse EXT_blend_minmax BLEND_EQUATION_EXT\n\n\tuse EXT_cmyka PACK_CMYK_HINT_EXT\n\tuse EXT_cmyka UNPACK_CMYK_HINT_EXT\n\n\tuse EXT_convolution CONVOLUTION_1D_EXT\n\tuse EXT_convolution CONVOLUTION_2D_EXT\n\tuse EXT_convolution SEPARABLE_2D_EXT\n\tuse EXT_convolution POST_CONVOLUTION_RED_SCALE_EXT\n\tuse EXT_convolution POST_CONVOLUTION_GREEN_SCALE_EXT\n\tuse EXT_convolution POST_CONVOLUTION_BLUE_SCALE_EXT\n\tuse EXT_convolution POST_CONVOLUTION_ALPHA_SCALE_EXT\n\tuse EXT_convolution POST_CONVOLUTION_RED_BIAS_EXT\n\tuse EXT_convolution POST_CONVOLUTION_GREEN_BIAS_EXT\n\tuse EXT_convolution POST_CONVOLUTION_BLUE_BIAS_EXT\n\tuse EXT_convolution POST_CONVOLUTION_ALPHA_BIAS_EXT\n\n\tuse EXT_histogram HISTOGRAM_EXT\n\tuse EXT_histogram MINMAX_EXT\n\n\tuse EXT_polygon_offset POLYGON_OFFSET_BIAS_EXT\n\n\tuse EXT_rescale_normal RESCALE_NORMAL_EXT\n\n\tuse EXT_shared_texture_palette SHARED_TEXTURE_PALETTE_EXT\n\n\tuse EXT_texture_object TEXTURE_3D_BINDING_EXT\n\n\tuse EXT_texture3D PACK_SKIP_IMAGES_EXT\n\tuse EXT_texture3D PACK_IMAGE_HEIGHT_EXT\n\tuse EXT_texture3D UNPACK_SKIP_IMAGES_EXT\n\tuse EXT_texture3D UNPACK_IMAGE_HEIGHT_EXT\n\tuse EXT_texture3D TEXTURE_3D_EXT\n\tuse EXT_texture3D MAX_3D_TEXTURE_SIZE_EXT\n\n\tuse EXT_vertex_array VERTEX_ARRAY_COUNT_EXT\n\tuse EXT_vertex_array NORMAL_ARRAY_COUNT_EXT\n\tuse EXT_vertex_array COLOR_ARRAY_COUNT_EXT\n\tuse EXT_vertex_array INDEX_ARRAY_COUNT_EXT\n\tuse EXT_vertex_array TEXTURE_COORD_ARRAY_COUNT_EXT\n\tuse EXT_vertex_array EDGE_FLAG_ARRAY_COUNT_EXT\n\n\tuse SGIS_detail_texture DETAIL_TEXTURE_2D_BINDING_SGIS\n\n\tuse SGIS_fog_function FOG_FUNC_POINTS_SGIS\n\tuse SGIS_fog_function MAX_FOG_FUNC_POINTS_SGIS\n\n\tuse SGIS_generate_mipmap GENERATE_MIPMAP_HINT_SGIS\n\n\tuse SGIS_multisample MULTISAMPLE_SGIS\n\tuse SGIS_multisample SAMPLE_ALPHA_TO_MASK_SGIS\n\tuse SGIS_multisample SAMPLE_ALPHA_TO_ONE_SGIS\n\tuse SGIS_multisample SAMPLE_MASK_SGIS\n\tuse SGIS_multisample SAMPLE_BUFFERS_SGIS\n\tuse SGIS_multisample SAMPLES_SGIS\n\tuse SGIS_multisample SAMPLE_MASK_VALUE_SGIS\n\tuse SGIS_multisample SAMPLE_MASK_INVERT_SGIS\n\tuse SGIS_multisample SAMPLE_PATTERN_SGIS\n\n\tuse SGIS_pixel_texture PIXEL_TEXTURE_SGIS\n\n\tuse SGIS_point_parameters POINT_SIZE_MIN_SGIS\n\tuse SGIS_point_parameters POINT_SIZE_MAX_SGIS\n\tuse SGIS_point_parameters POINT_FADE_THRESHOLD_SIZE_SGIS\n\tuse SGIS_point_parameters DISTANCE_ATTENUATION_SGIS\n\n\tuse SGIS_texture4D PACK_SKIP_VOLUMES_SGIS\n\tuse SGIS_texture4D PACK_IMAGE_DEPTH_SGIS\n\tuse SGIS_texture4D UNPACK_SKIP_VOLUMES_SGIS\n\tuse SGIS_texture4D UNPACK_IMAGE_DEPTH_SGIS\n\tuse SGIS_texture4D TEXTURE_4D_SGIS\n\tuse SGIS_texture4D MAX_4D_TEXTURE_SIZE_SGIS\n\tuse SGIS_texture4D TEXTURE_4D_BINDING_SGIS\n\n\tuse SGIX_async ASYNC_MARKER_SGIX\n\n\tuse SGIX_async_histogram ASYNC_HISTOGRAM_SGIX\n\tuse SGIX_async_histogram MAX_ASYNC_HISTOGRAM_SGIX\n\n\tuse SGIX_async_pixel ASYNC_TEX_IMAGE_SGIX\n\tuse SGIX_async_pixel ASYNC_DRAW_PIXELS_SGIX\n\tuse SGIX_async_pixel ASYNC_READ_PIXELS_SGIX\n\tuse SGIX_async_pixel MAX_ASYNC_TEX_IMAGE_SGIX\n\tuse SGIX_async_pixel MAX_ASYNC_DRAW_PIXELS_SGIX\n\tuse SGIX_async_pixel MAX_ASYNC_READ_PIXELS_SGIX\n\n\tuse SGIX_calligraphic_fragment CALLIGRAPHIC_FRAGMENT_SGIX\n\n\tuse SGIX_clipmap MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX\n\tuse SGIX_clipmap MAX_CLIPMAP_DEPTH_SGIX\n\n\tuse SGIX_convolution_accuracy CONVOLUTION_HINT_SGIX\n\n\tuse SGIX_fog_offset FOG_OFFSET_SGIX\n\tuse SGIX_fog_offset FOG_OFFSET_VALUE_SGIX\n\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHTING_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_COLOR_MATERIAL_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_COLOR_MATERIAL_FACE_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX\n\tuse SGIX_fragment_lighting MAX_FRAGMENT_LIGHTS_SGIX\n\tuse SGIX_fragment_lighting MAX_ACTIVE_LIGHTS_SGIX\n\tuse SGIX_fragment_lighting LIGHT_ENV_MODE_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT0_SGIX\n\n\tuse SGIX_framezoom FRAMEZOOM_SGIX\n\tuse SGIX_framezoom FRAMEZOOM_FACTOR_SGIX\n\tuse SGIX_framezoom MAX_FRAMEZOOM_FACTOR_SGIX\n\n\tuse SGIX_instruments INSTRUMENT_MEASUREMENTS_SGIX\n\n\tuse SGIX_interlace INTERLACE_SGIX\n\n\tuse SGIX_ir_instrument1 IR_INSTRUMENT1_SGIX\n\n\tuse SGIX_pixel_texture PIXEL_TEX_GEN_SGIX\n\tuse SGIX_pixel_texture PIXEL_TEX_GEN_MODE_SGIX\n\n\tuse SGIX_pixel_tiles PIXEL_TILE_BEST_ALIGNMENT_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_CACHE_INCREMENT_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_WIDTH_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_HEIGHT_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_GRID_WIDTH_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_GRID_HEIGHT_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_GRID_DEPTH_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_CACHE_SIZE_SGIX\n\n\tuse SGIX_polynomial_ffd DEFORMATIONS_MASK_SGIX\n\n\tuse SGIX_reference_plane REFERENCE_PLANE_EQUATION_SGIX\n\tuse SGIX_reference_plane REFERENCE_PLANE_SGIX\n\n\tuse SGIX_sprite SPRITE_SGIX\n\tuse SGIX_sprite SPRITE_MODE_SGIX\n\tuse SGIX_sprite SPRITE_AXIS_SGIX\n\tuse SGIX_sprite SPRITE_TRANSLATION_SGIX\n\n\tuse SGIX_subsample PACK_SUBSAMPLE_RATE_SGIX\n\tuse SGIX_subsample UNPACK_SUBSAMPLE_RATE_SGIX\n\tuse SGIX_resample PACK_RESAMPLE_SGIX\n\tuse SGIX_resample UNPACK_RESAMPLE_SGIX\n\n\tuse SGIX_texture_scale_bias POST_TEXTURE_FILTER_BIAS_RANGE_SGIX\n\tuse SGIX_texture_scale_bias POST_TEXTURE_FILTER_SCALE_RANGE_SGIX\n\n\tuse SGIX_vertex_preclip VERTEX_PRECLIP_SGIX\n\tuse SGIX_vertex_preclip VERTEX_PRECLIP_HINT_SGIX\n\n\tuse SGI_color_matrix COLOR_MATRIX_SGI\n\tuse SGI_color_matrix COLOR_MATRIX_STACK_DEPTH_SGI\n\tuse SGI_color_matrix MAX_COLOR_MATRIX_STACK_DEPTH_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_RED_SCALE_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_GREEN_SCALE_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_BLUE_SCALE_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_ALPHA_SCALE_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_RED_BIAS_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_GREEN_BIAS_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_BLUE_BIAS_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_ALPHA_BIAS_SGI\n\n\tuse SGI_color_table COLOR_TABLE_SGI\n\tuse SGI_color_table POST_CONVOLUTION_COLOR_TABLE_SGI\n\tuse SGI_color_table POST_COLOR_MATRIX_COLOR_TABLE_SGI\n\n\tuse SGI_texture_color_table TEXTURE_COLOR_TABLE_SGI\n\n###############################################################################\n\nGetTextureParameter enum:\n\tuse TextureParameterName TEXTURE_MAG_FILTER\n\tuse TextureParameterName TEXTURE_MIN_FILTER\n\tuse TextureParameterName TEXTURE_WRAP_S\n\tuse TextureParameterName TEXTURE_WRAP_T\n\tTEXTURE_WIDTH\t\t\t\t\t= 0x1000\n\tTEXTURE_HEIGHT\t\t\t\t\t= 0x1001\n\tTEXTURE_INTERNAL_FORMAT\t\t\t\t= 0x1003\n\tTEXTURE_COMPONENTS\t\t\t\t= 0x1003\n\tTEXTURE_BORDER_COLOR\t\t\t\t= 0x1004\n\tTEXTURE_BORDER\t\t\t\t\t= 0x1005\n\tTEXTURE_RED_SIZE\t\t\t\t= 0x805C\n\tTEXTURE_GREEN_SIZE\t\t\t\t= 0x805D\n\tTEXTURE_BLUE_SIZE\t\t\t\t= 0x805E\n\tTEXTURE_ALPHA_SIZE\t\t\t\t= 0x805F\n\tTEXTURE_LUMINANCE_SIZE\t\t\t\t= 0x8060\n\tTEXTURE_INTENSITY_SIZE\t\t\t\t= 0x8061\n\tTEXTURE_PRIORITY\t\t\t\t= 0x8066\n\tTEXTURE_RESIDENT\t\t\t\t= 0x8067\n\tuse EXT_texture3D TEXTURE_DEPTH_EXT\n\tuse EXT_texture3D TEXTURE_WRAP_R_EXT\n\tuse SGIS_detail_texture DETAIL_TEXTURE_LEVEL_SGIS\n\tuse SGIS_detail_texture DETAIL_TEXTURE_MODE_SGIS\n\tuse SGIS_detail_texture DETAIL_TEXTURE_FUNC_POINTS_SGIS\n\tuse SGIS_generate_mipmap GENERATE_MIPMAP_SGIS\n\tuse SGIS_sharpen_texture SHARPEN_TEXTURE_FUNC_POINTS_SGIS\n\tuse SGIS_texture_filter4 TEXTURE_FILTER4_SIZE_SGIS\n\tuse SGIS_texture_lod TEXTURE_MIN_LOD_SGIS\n\tuse SGIS_texture_lod TEXTURE_MAX_LOD_SGIS\n\tuse SGIS_texture_lod TEXTURE_BASE_LEVEL_SGIS\n\tuse SGIS_texture_lod TEXTURE_MAX_LEVEL_SGIS\n\tuse SGIS_texture_select DUAL_TEXTURE_SELECT_SGIS\n\tuse SGIS_texture_select QUAD_TEXTURE_SELECT_SGIS\n\tuse SGIS_texture4D TEXTURE_4DSIZE_SGIS\n\tuse SGIS_texture4D TEXTURE_WRAP_Q_SGIS\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_CENTER_SGIX\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_FRAME_SGIX\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_OFFSET_SGIX\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_LOD_OFFSET_SGIX\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_DEPTH_SGIX\n\tuse SGIX_shadow TEXTURE_COMPARE_SGIX\n\tuse SGIX_shadow TEXTURE_COMPARE_OPERATOR_SGIX\n\tuse SGIX_shadow TEXTURE_LEQUAL_R_SGIX\n\tuse SGIX_shadow TEXTURE_GEQUAL_R_SGIX\n\tuse SGIX_shadow_ambient SHADOW_AMBIENT_SGIX\n\tuse SGIX_texture_coordinate_clamp TEXTURE_MAX_CLAMP_S_SGIX\n\tuse SGIX_texture_coordinate_clamp TEXTURE_MAX_CLAMP_T_SGIX\n\tuse SGIX_texture_coordinate_clamp TEXTURE_MAX_CLAMP_R_SGIX\n\tuse SGIX_texture_lod_bias TEXTURE_LOD_BIAS_S_SGIX\n\tuse SGIX_texture_lod_bias TEXTURE_LOD_BIAS_T_SGIX\n\tuse SGIX_texture_lod_bias TEXTURE_LOD_BIAS_R_SGIX\n\tuse SGIX_texture_scale_bias POST_TEXTURE_FILTER_BIAS_SGIX\n\tuse SGIX_texture_scale_bias POST_TEXTURE_FILTER_SCALE_SGIX\n\n###############################################################################\n\nHintMode enum:\n\tDONT_CARE\t\t\t\t\t= 0x1100\n\tFASTEST\t\t\t\t\t\t= 0x1101\n\tNICEST\t\t\t\t\t\t= 0x1102\n\n###############################################################################\n\nHintTarget enum:\n\tuse GetPName PERSPECTIVE_CORRECTION_HINT\n\tuse GetPName POINT_SMOOTH_HINT\n\tuse GetPName LINE_SMOOTH_HINT\n\tuse GetPName POLYGON_SMOOTH_HINT\n\tuse GetPName FOG_HINT\n\tuse EXT_cmyka PACK_CMYK_HINT_EXT\n\tuse EXT_cmyka UNPACK_CMYK_HINT_EXT\n\tuse SGIS_generate_mipmap GENERATE_MIPMAP_HINT_SGIS\n\tuse SGIX_convolution_accuracy CONVOLUTION_HINT_SGIX\n\tuse SGIX_texture_multi_buffer TEXTURE_MULTI_BUFFER_HINT_SGIX\n\tuse SGIX_vertex_preclip VERTEX_PRECLIP_HINT_SGIX\n\n###############################################################################\n\nHistogramTargetEXT enum:\n\tuse EXT_histogram HISTOGRAM_EXT\n\tuse EXT_histogram PROXY_HISTOGRAM_EXT\n\n###############################################################################\n\nIndexPointerType enum:\n\tuse DataType SHORT\n\tuse DataType INT\n\tuse DataType FLOAT\n\tuse DataType DOUBLE\n\n###############################################################################\n\nLightEnvModeSGIX enum:\n\tuse StencilOp REPLACE\n\tuse TextureEnvMode MODULATE\n\tuse AccumOp ADD\n\n###############################################################################\n\nLightEnvParameterSGIX enum:\n\tuse SGIX_fragment_lighting LIGHT_ENV_MODE_SGIX\n\n###############################################################################\n\nLightModelColorControl enum:\n\tuse VERSION_1_2 SINGLE_COLOR\n\tuse VERSION_1_2 SEPARATE_SPECULAR_COLOR\n\n###############################################################################\n\nLightModelParameter enum:\n\tuse GetPName LIGHT_MODEL_AMBIENT\n\tuse GetPName LIGHT_MODEL_LOCAL_VIEWER\n\tuse GetPName LIGHT_MODEL_TWO_SIDE\n\tuse VERSION_1_2 LIGHT_MODEL_COLOR_CONTROL\n\n###############################################################################\n\nLightParameter enum:\n\tAMBIENT\t\t\t\t\t\t= 0x1200\n\tDIFFUSE\t\t\t\t\t\t= 0x1201\n\tSPECULAR\t\t\t\t\t= 0x1202\n\tPOSITION\t\t\t\t\t= 0x1203\n\tSPOT_DIRECTION\t\t\t\t\t= 0x1204\n\tSPOT_EXPONENT\t\t\t\t\t= 0x1205\n\tSPOT_CUTOFF\t\t\t\t\t= 0x1206\n\tCONSTANT_ATTENUATION\t\t\t\t= 0x1207\n\tLINEAR_ATTENUATION\t\t\t\t= 0x1208\n\tQUADRATIC_ATTENUATION\t\t\t\t= 0x1209\n\n###############################################################################\n\nListMode enum:\n\tCOMPILE\t\t\t\t\t\t= 0x1300\n\tCOMPILE_AND_EXECUTE\t\t\t\t= 0x1301\n\n###############################################################################\n\nDataType enum:\n\tBYTE\t\t\t\t\t\t= 0x1400\n\tUNSIGNED_BYTE\t\t\t\t\t= 0x1401\n\tSHORT\t\t\t\t\t\t= 0x1402\n\tUNSIGNED_SHORT\t\t\t\t\t= 0x1403\n\tINT\t\t\t\t\t\t= 0x1404\n\tUNSIGNED_INT\t\t\t\t\t= 0x1405\n\tFLOAT\t\t\t\t\t\t= 0x1406\n\t2_BYTES\t\t\t\t\t\t= 0x1407\n\t3_BYTES\t\t\t\t\t\t= 0x1408\n\t4_BYTES\t\t\t\t\t\t= 0x1409\n\tDOUBLE\t\t\t\t\t\t= 0x140A\n\tDOUBLE_EXT\t\t\t\t\t= 0x140A\n\n# OES_byte_coordinates: (OpenGL ES only)\n#\tuse DataType BYTE\n\nOES_element_index_uint enum: (OpenGL ES only)\n#\tuse DataType UNSIGNED_INT\n\nOES_texture_float enum: (OpenGL ES only; additional; see below)\n#\tuse DataType FLOAT\n\nVERSION_3_0 enum:\n#\tuse ARB_half_float_vertex\t    HALF_FLOAT\n\nARB_half_float_vertex enum: (note: no ARB suffixes)\n\tHALF_FLOAT\t\t\t\t\t= 0x140B    # VERSION_3_0 / ARB_half_float_vertex\n\nARB_half_float_pixel enum:\n\tHALF_FLOAT_ARB\t\t\t\t\t= 0x140B\n\nNV_half_float enum:\n\tHALF_FLOAT_NV\t\t\t\t\t= 0x140B\n\nAPPLE_float_pixels enum: (additional; see below)\n\tHALF_APPLE\t\t\t\t\t= 0x140B\n\nOES_fixed_point enum: (OpenGL ES only)\n\tFIXED_OES\t\t\t\t\t= 0x140C\n\n# Leave a gap to preserve even/odd int/uint token values\n# ARB_future_use: 0x140D\n\n# Future NV extension (Khronos bug 5172)\n\tINT64_NV\t\t\t\t\t= 0x140E\n\tUNSIGNED_INT64_NV\t\t\t\t= 0x140F\n\n###############################################################################\n\nListNameType enum:\n\tuse DataType BYTE\n\tuse DataType UNSIGNED_BYTE\n\tuse DataType SHORT\n\tuse DataType UNSIGNED_SHORT\n\tuse DataType INT\n\tuse DataType UNSIGNED_INT\n\tuse DataType FLOAT\n\tuse DataType 2_BYTES\n\tuse DataType 3_BYTES\n\tuse DataType 4_BYTES\n\n###############################################################################\n\nListParameterName enum:\n\tuse SGIX_list_priority LIST_PRIORITY_SGIX\n\n###############################################################################\n\nLogicOp enum:\n\tCLEAR\t\t\t\t\t\t= 0x1500\n\tAND\t\t\t\t\t\t= 0x1501\n\tAND_REVERSE\t\t\t\t\t= 0x1502\n\tCOPY\t\t\t\t\t\t= 0x1503\n\tAND_INVERTED\t\t\t\t\t= 0x1504\n\tNOOP\t\t\t\t\t\t= 0x1505\n\tXOR\t\t\t\t\t\t= 0x1506\n\tOR\t\t\t\t\t\t= 0x1507\n\tNOR\t\t\t\t\t\t= 0x1508\n\tEQUIV\t\t\t\t\t\t= 0x1509\n\tINVERT\t\t\t\t\t\t= 0x150A\n\tOR_REVERSE\t\t\t\t\t= 0x150B\n\tCOPY_INVERTED\t\t\t\t\t= 0x150C\n\tOR_INVERTED\t\t\t\t\t= 0x150D\n\tNAND\t\t\t\t\t\t= 0x150E\n\tSET\t\t\t\t\t\t= 0x150F\n\n###############################################################################\n\nMapTarget enum:\n\tuse GetPName MAP1_COLOR_4\n\tuse GetPName MAP1_INDEX\n\tuse GetPName MAP1_NORMAL\n\tuse GetPName MAP1_TEXTURE_COORD_1\n\tuse GetPName MAP1_TEXTURE_COORD_2\n\tuse GetPName MAP1_TEXTURE_COORD_3\n\tuse GetPName MAP1_TEXTURE_COORD_4\n\tuse GetPName MAP1_VERTEX_3\n\tuse GetPName MAP1_VERTEX_4\n\tuse GetPName MAP2_COLOR_4\n\tuse GetPName MAP2_INDEX\n\tuse GetPName MAP2_NORMAL\n\tuse GetPName MAP2_TEXTURE_COORD_1\n\tuse GetPName MAP2_TEXTURE_COORD_2\n\tuse GetPName MAP2_TEXTURE_COORD_3\n\tuse GetPName MAP2_TEXTURE_COORD_4\n\tuse GetPName MAP2_VERTEX_3\n\tuse GetPName MAP2_VERTEX_4\n\tuse SGIX_polynomial_ffd GEOMETRY_DEFORMATION_SGIX\n\tuse SGIX_polynomial_ffd TEXTURE_DEFORMATION_SGIX\n\n###############################################################################\n\nMaterialFace enum:\n\tuse DrawBufferMode FRONT\n\tuse DrawBufferMode BACK\n\tuse DrawBufferMode FRONT_AND_BACK\n\n\n###############################################################################\n\nMaterialParameter enum:\n\tEMISSION\t\t\t\t\t= 0x1600\n\tSHININESS\t\t\t\t\t= 0x1601\n\tAMBIENT_AND_DIFFUSE\t\t\t\t= 0x1602\n\tCOLOR_INDEXES\t\t\t\t\t= 0x1603\n\tuse LightParameter AMBIENT\n\tuse LightParameter DIFFUSE\n\tuse LightParameter SPECULAR\n\n###############################################################################\n\nMatrixMode enum:\n\tMODELVIEW\t\t\t\t\t= 0x1700\n\tPROJECTION\t\t\t\t\t= 0x1701\n\tTEXTURE\t\t\t\t\t\t= 0x1702\n\n###############################################################################\n\nMeshMode1 enum:\n\tuse PolygonMode POINT\n\tuse PolygonMode LINE\n\n###############################################################################\n\nMeshMode2 enum:\n\tuse PolygonMode POINT\n\tuse PolygonMode LINE\n\tuse PolygonMode FILL\n\n###############################################################################\n\nMinmaxTargetEXT enum:\n\tuse EXT_histogram MINMAX_EXT\n\n###############################################################################\n\nNormalPointerType enum:\n\tuse DataType BYTE\n\tuse DataType SHORT\n\tuse DataType INT\n\tuse DataType FLOAT\n\tuse DataType DOUBLE\n\n###############################################################################\n\nPixelCopyType enum:\n\tCOLOR\t\t\t\t\t\t= 0x1800\n\tDEPTH\t\t\t\t\t\t= 0x1801\n\tSTENCIL\t\t\t\t\t\t= 0x1802\n\nEXT_discard_framebuffer enum: (OpenGL ES only)\n\tCOLOR_EXT\t\t\t\t\t= 0x1800\n\tDEPTH_EXT\t\t\t\t\t= 0x1801\n\tSTENCIL_EXT\t\t\t\t\t= 0x1802\n\n###############################################################################\n\nPixelFormat enum:\n\tCOLOR_INDEX\t\t\t\t\t= 0x1900\n\tSTENCIL_INDEX\t\t\t\t\t= 0x1901\n\tDEPTH_COMPONENT\t\t\t\t\t= 0x1902\n\tRED\t\t\t\t\t\t= 0x1903\n\tGREEN\t\t\t\t\t\t= 0x1904\n\tBLUE\t\t\t\t\t\t= 0x1905\n\tALPHA\t\t\t\t\t\t= 0x1906\n\tRGB\t\t\t\t\t\t= 0x1907\n\tRGBA\t\t\t\t\t\t= 0x1908\n\tLUMINANCE\t\t\t\t\t= 0x1909\n\tLUMINANCE_ALPHA\t\t\t\t\t= 0x190A\n\tuse EXT_abgr ABGR_EXT\n\tuse EXT_cmyka CMYK_EXT\n\tuse EXT_cmyka CMYKA_EXT\n\tuse SGIX_icc_texture R5_G6_B5_ICC_SGIX\n\tuse SGIX_icc_texture R5_G6_B5_A8_ICC_SGIX\n\tuse SGIX_icc_texture ALPHA16_ICC_SGIX\n\tuse SGIX_icc_texture LUMINANCE16_ICC_SGIX\n\tuse SGIX_icc_texture LUMINANCE16_ALPHA8_ICC_SGIX\n\tuse SGIX_ycrcb YCRCB_422_SGIX\n\tuse SGIX_ycrcb YCRCB_444_SGIX\n\nOES_depth_texture enum: (OpenGL ES only)\n#\tuse DataType UNSIGNED_SHORT\n#\tuse DataType UNSIGNED_INT\n#\tuse PixelFormat DEPTH_COMPONENT\n\n###############################################################################\n\nPixelMap enum:\n\tuse GetPixelMap PIXEL_MAP_I_TO_I\n\tuse GetPixelMap PIXEL_MAP_S_TO_S\n\tuse GetPixelMap PIXEL_MAP_I_TO_R\n\tuse GetPixelMap PIXEL_MAP_I_TO_G\n\tuse GetPixelMap PIXEL_MAP_I_TO_B\n\tuse GetPixelMap PIXEL_MAP_I_TO_A\n\tuse GetPixelMap PIXEL_MAP_R_TO_R\n\tuse GetPixelMap PIXEL_MAP_G_TO_G\n\tuse GetPixelMap PIXEL_MAP_B_TO_B\n\tuse GetPixelMap PIXEL_MAP_A_TO_A\n\n###############################################################################\n\nPixelStoreParameter enum:\n\tuse GetPName UNPACK_SWAP_BYTES\n\tuse GetPName UNPACK_LSB_FIRST\n\tuse GetPName UNPACK_ROW_LENGTH\n\tuse GetPName UNPACK_SKIP_ROWS\n\tuse GetPName UNPACK_SKIP_PIXELS\n\tuse GetPName UNPACK_ALIGNMENT\n\tuse GetPName PACK_SWAP_BYTES\n\tuse GetPName PACK_LSB_FIRST\n\tuse GetPName PACK_ROW_LENGTH\n\tuse GetPName PACK_SKIP_ROWS\n\tuse GetPName PACK_SKIP_PIXELS\n\tuse GetPName PACK_ALIGNMENT\n\tuse EXT_texture3D PACK_SKIP_IMAGES_EXT\n\tuse EXT_texture3D PACK_IMAGE_HEIGHT_EXT\n\tuse EXT_texture3D UNPACK_SKIP_IMAGES_EXT\n\tuse EXT_texture3D UNPACK_IMAGE_HEIGHT_EXT\n\tuse SGIS_texture4D PACK_SKIP_VOLUMES_SGIS\n\tuse SGIS_texture4D PACK_IMAGE_DEPTH_SGIS\n\tuse SGIS_texture4D UNPACK_SKIP_VOLUMES_SGIS\n\tuse SGIS_texture4D UNPACK_IMAGE_DEPTH_SGIS\n\tuse SGIX_pixel_tiles PIXEL_TILE_WIDTH_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_HEIGHT_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_GRID_WIDTH_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_GRID_HEIGHT_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_GRID_DEPTH_SGIX\n\tuse SGIX_pixel_tiles PIXEL_TILE_CACHE_SIZE_SGIX\n\tuse SGIX_subsample PACK_SUBSAMPLE_RATE_SGIX\n\tuse SGIX_subsample UNPACK_SUBSAMPLE_RATE_SGIX\n\tuse SGIX_resample PACK_RESAMPLE_SGIX\n\tuse SGIX_resample UNPACK_RESAMPLE_SGIX\n\n###############################################################################\n\nPixelStoreResampleMode enum:\n\tuse SGIX_resample RESAMPLE_REPLICATE_SGIX\n\tuse SGIX_resample RESAMPLE_ZERO_FILL_SGIX\n\tuse SGIX_resample RESAMPLE_DECIMATE_SGIX\n\n###############################################################################\n\nPixelStoreSubsampleRate enum:\n\tuse SGIX_subsample PIXEL_SUBSAMPLE_4444_SGIX\n\tuse SGIX_subsample PIXEL_SUBSAMPLE_2424_SGIX\n\tuse SGIX_subsample PIXEL_SUBSAMPLE_4242_SGIX\n\n###############################################################################\n\nPixelTexGenMode enum:\n\tuse DrawBufferMode NONE\n\tuse PixelFormat RGB\n\tuse PixelFormat RGBA\n\tuse PixelFormat LUMINANCE\n\tuse PixelFormat LUMINANCE_ALPHA\n\tuse SGIX_impact_pixel_texture PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX\n\tuse SGIX_impact_pixel_texture PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX\n\tuse SGIX_impact_pixel_texture PIXEL_TEX_GEN_ALPHA_MS_SGIX\n\tuse SGIX_impact_pixel_texture PIXEL_TEX_GEN_ALPHA_LS_SGIX\n\n###############################################################################\n\nPixelTexGenParameterNameSGIS enum:\n\tuse SGIS_pixel_texture PIXEL_FRAGMENT_RGB_SOURCE_SGIS\n\tuse SGIS_pixel_texture PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS\n\n###############################################################################\n\nPixelTransferParameter enum:\n\tuse GetPName MAP_COLOR\n\tuse GetPName MAP_STENCIL\n\tuse GetPName INDEX_SHIFT\n\tuse GetPName INDEX_OFFSET\n\tuse GetPName RED_SCALE\n\tuse GetPName RED_BIAS\n\tuse GetPName GREEN_SCALE\n\tuse GetPName GREEN_BIAS\n\tuse GetPName BLUE_SCALE\n\tuse GetPName BLUE_BIAS\n\tuse GetPName ALPHA_SCALE\n\tuse GetPName ALPHA_BIAS\n\tuse GetPName DEPTH_SCALE\n\tuse GetPName DEPTH_BIAS\n\tuse EXT_convolution POST_CONVOLUTION_RED_SCALE_EXT\n\tuse EXT_convolution POST_CONVOLUTION_GREEN_SCALE_EXT\n\tuse EXT_convolution POST_CONVOLUTION_BLUE_SCALE_EXT\n\tuse EXT_convolution POST_CONVOLUTION_ALPHA_SCALE_EXT\n\tuse EXT_convolution POST_CONVOLUTION_RED_BIAS_EXT\n\tuse EXT_convolution POST_CONVOLUTION_GREEN_BIAS_EXT\n\tuse EXT_convolution POST_CONVOLUTION_BLUE_BIAS_EXT\n\tuse EXT_convolution POST_CONVOLUTION_ALPHA_BIAS_EXT\n\tuse SGI_color_matrix POST_COLOR_MATRIX_RED_SCALE_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_GREEN_SCALE_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_BLUE_SCALE_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_ALPHA_SCALE_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_RED_BIAS_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_GREEN_BIAS_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_BLUE_BIAS_SGI\n\tuse SGI_color_matrix POST_COLOR_MATRIX_ALPHA_BIAS_SGI\n\n###############################################################################\n\nPixelType enum:\n\tBITMAP\t\t\t\t\t\t= 0x1A00\n\tuse DataType BYTE\n\tuse DataType UNSIGNED_BYTE\n\tuse DataType SHORT\n\tuse DataType UNSIGNED_SHORT\n\tuse DataType INT\n\tuse DataType UNSIGNED_INT\n\tuse DataType FLOAT\n\tuse EXT_packed_pixels UNSIGNED_BYTE_3_3_2_EXT\n\tuse EXT_packed_pixels UNSIGNED_SHORT_4_4_4_4_EXT\n\tuse EXT_packed_pixels UNSIGNED_SHORT_5_5_5_1_EXT\n\tuse EXT_packed_pixels UNSIGNED_INT_8_8_8_8_EXT\n\tuse EXT_packed_pixels UNSIGNED_INT_10_10_10_2_EXT\n\n###############################################################################\n\nPointParameterNameSGIS enum:\n\tuse SGIS_point_parameters POINT_SIZE_MIN_SGIS\n\tuse SGIS_point_parameters POINT_SIZE_MAX_SGIS\n\tuse SGIS_point_parameters POINT_FADE_THRESHOLD_SIZE_SGIS\n\tuse SGIS_point_parameters DISTANCE_ATTENUATION_SGIS\n\n###############################################################################\n\nPolygonMode enum:\n\tPOINT\t\t\t\t\t\t= 0x1B00\n\tLINE\t\t\t\t\t\t= 0x1B01\n\tFILL\t\t\t\t\t\t= 0x1B02\n\n###############################################################################\n\nReadBufferMode enum:\n\tuse DrawBufferMode FRONT_LEFT\n\tuse DrawBufferMode FRONT_RIGHT\n\tuse DrawBufferMode BACK_LEFT\n\tuse DrawBufferMode BACK_RIGHT\n\tuse DrawBufferMode FRONT\n\tuse DrawBufferMode BACK\n\tuse DrawBufferMode LEFT\n\tuse DrawBufferMode RIGHT\n\tuse DrawBufferMode AUX0\n\tuse DrawBufferMode AUX1\n\tuse DrawBufferMode AUX2\n\tuse DrawBufferMode AUX3\n\n###############################################################################\n\nRenderingMode enum:\n\tRENDER\t\t\t\t\t\t= 0x1C00\n\tFEEDBACK\t\t\t\t\t= 0x1C01\n\tSELECT\t\t\t\t\t\t= 0x1C02\n\n###############################################################################\n\nSamplePatternSGIS enum:\n\tuse SGIS_multisample 1PASS_SGIS\n\tuse SGIS_multisample 2PASS_0_SGIS\n\tuse SGIS_multisample 2PASS_1_SGIS\n\tuse SGIS_multisample 4PASS_0_SGIS\n\tuse SGIS_multisample 4PASS_1_SGIS\n\tuse SGIS_multisample 4PASS_2_SGIS\n\tuse SGIS_multisample 4PASS_3_SGIS\n\n###############################################################################\n\nSeparableTargetEXT enum:\n\tuse EXT_convolution SEPARABLE_2D_EXT\n\n###############################################################################\n\nShadingModel enum:\n\tFLAT\t\t\t\t\t\t= 0x1D00\n\tSMOOTH\t\t\t\t\t\t= 0x1D01\n\n###############################################################################\n\nStencilFunction enum:\n\tuse AlphaFunction NEVER\n\tuse AlphaFunction LESS\n\tuse AlphaFunction EQUAL\n\tuse AlphaFunction LEQUAL\n\tuse AlphaFunction GREATER\n\tuse AlphaFunction NOTEQUAL\n\tuse AlphaFunction GEQUAL\n\tuse AlphaFunction ALWAYS\n\n###############################################################################\n\nStencilOp enum:\n\tuse BlendingFactorDest ZERO\n\tKEEP\t\t\t\t\t\t= 0x1E00\n\tREPLACE\t\t\t\t\t\t= 0x1E01\n\tINCR\t\t\t\t\t\t= 0x1E02\n\tDECR\t\t\t\t\t\t= 0x1E03\n\tuse LogicOp INVERT\n\n###############################################################################\n\nStringName enum:\n\tVENDOR\t\t\t\t\t\t= 0x1F00\n\tRENDERER\t\t\t\t\t= 0x1F01\n\tVERSION\t\t\t\t\t\t= 0x1F02\n\tEXTENSIONS\t\t\t\t\t= 0x1F03\n\n###############################################################################\n\nTexCoordPointerType enum:\n\tuse DataType SHORT\n\tuse DataType INT\n\tuse DataType FLOAT\n\tuse DataType DOUBLE\n\n###############################################################################\n\nTextureCoordName enum:\n\tS\t\t\t\t\t\t= 0x2000\n\tT\t\t\t\t\t\t= 0x2001\n\tR\t\t\t\t\t\t= 0x2002\n\tQ\t\t\t\t\t\t= 0x2003\n\n###############################################################################\n\nTextureEnvMode enum:\n\tMODULATE\t\t\t\t\t= 0x2100\n\tDECAL\t\t\t\t\t\t= 0x2101\n\tuse GetPName BLEND\n\tuse EXT_texture REPLACE_EXT\n\tuse AccumOp ADD\n\tuse SGIX_texture_add_env TEXTURE_ENV_BIAS_SGIX\n\n###############################################################################\n\nTextureEnvParameter enum:\n\tTEXTURE_ENV_MODE\t\t\t\t= 0x2200\n\tTEXTURE_ENV_COLOR\t\t\t\t= 0x2201\n\n###############################################################################\n\nTextureEnvTarget enum:\n\tTEXTURE_ENV\t\t\t\t\t= 0x2300\n\n###############################################################################\n\nTextureFilterFuncSGIS enum:\n\tuse SGIS_texture_filter4 FILTER4_SGIS\n\n###############################################################################\n\nTextureGenMode enum:\n\tEYE_LINEAR\t\t\t\t\t= 0x2400\n\tOBJECT_LINEAR\t\t\t\t\t= 0x2401\n\tSPHERE_MAP\t\t\t\t\t= 0x2402\n\tuse SGIS_point_line_texgen EYE_DISTANCE_TO_POINT_SGIS\n\tuse SGIS_point_line_texgen OBJECT_DISTANCE_TO_POINT_SGIS\n\tuse SGIS_point_line_texgen EYE_DISTANCE_TO_LINE_SGIS\n\tuse SGIS_point_line_texgen OBJECT_DISTANCE_TO_LINE_SGIS\n\n###############################################################################\n\nTextureGenParameter enum:\n\tTEXTURE_GEN_MODE\t\t\t\t= 0x2500\n\tOBJECT_PLANE\t\t\t\t\t= 0x2501\n\tEYE_PLANE\t\t\t\t\t= 0x2502\n\tuse SGIS_point_line_texgen EYE_POINT_SGIS\n\tuse SGIS_point_line_texgen OBJECT_POINT_SGIS\n\tuse SGIS_point_line_texgen EYE_LINE_SGIS\n\tuse SGIS_point_line_texgen OBJECT_LINE_SGIS\n\n# Aliases TextureGenParameter enum above\nOES_texture_cube_map enum: (OpenGL ES only; additional; see below)\n\tTEXTURE_GEN_MODE\t\t\t\t= 0x2500\n\n###############################################################################\n\nTextureMagFilter enum:\n\tNEAREST\t\t\t\t\t\t= 0x2600\n\tLINEAR\t\t\t\t\t\t= 0x2601\n\tuse SGIS_detail_texture LINEAR_DETAIL_SGIS\n\tuse SGIS_detail_texture LINEAR_DETAIL_ALPHA_SGIS\n\tuse SGIS_detail_texture LINEAR_DETAIL_COLOR_SGIS\n\tuse SGIS_sharpen_texture LINEAR_SHARPEN_SGIS\n\tuse SGIS_sharpen_texture LINEAR_SHARPEN_ALPHA_SGIS\n\tuse SGIS_sharpen_texture LINEAR_SHARPEN_COLOR_SGIS\n\tuse SGIS_texture_filter4 FILTER4_SGIS\n\tuse SGIX_impact_pixel_texture PIXEL_TEX_GEN_Q_CEILING_SGIX\n\tuse SGIX_impact_pixel_texture PIXEL_TEX_GEN_Q_ROUND_SGIX\n\tuse SGIX_impact_pixel_texture PIXEL_TEX_GEN_Q_FLOOR_SGIX\n\n###############################################################################\n\nTextureMinFilter enum:\n\tuse TextureMagFilter NEAREST\n\tuse TextureMagFilter LINEAR\n\tNEAREST_MIPMAP_NEAREST\t\t\t\t= 0x2700\n\tLINEAR_MIPMAP_NEAREST\t\t\t\t= 0x2701\n\tNEAREST_MIPMAP_LINEAR\t\t\t\t= 0x2702\n\tLINEAR_MIPMAP_LINEAR\t\t\t\t= 0x2703\n\tuse SGIS_texture_filter4 FILTER4_SGIS\n\tuse SGIX_clipmap LINEAR_CLIPMAP_LINEAR_SGIX\n\tuse SGIX_clipmap NEAREST_CLIPMAP_NEAREST_SGIX\n\tuse SGIX_clipmap NEAREST_CLIPMAP_LINEAR_SGIX\n\tuse SGIX_clipmap LINEAR_CLIPMAP_NEAREST_SGIX\n\tuse SGIX_impact_pixel_texture PIXEL_TEX_GEN_Q_CEILING_SGIX\n\tuse SGIX_impact_pixel_texture PIXEL_TEX_GEN_Q_ROUND_SGIX\n\tuse SGIX_impact_pixel_texture PIXEL_TEX_GEN_Q_FLOOR_SGIX\n\n###############################################################################\n\nTextureParameterName enum:\n\tTEXTURE_MAG_FILTER\t\t\t\t= 0x2800\n\tTEXTURE_MIN_FILTER\t\t\t\t= 0x2801\n\tTEXTURE_WRAP_S\t\t\t\t\t= 0x2802\n\tTEXTURE_WRAP_T\t\t\t\t\t= 0x2803\n\tuse GetTextureParameter TEXTURE_BORDER_COLOR\n\tuse GetTextureParameter TEXTURE_PRIORITY\n\tuse EXT_texture3D TEXTURE_WRAP_R_EXT\n\tuse SGIS_detail_texture DETAIL_TEXTURE_LEVEL_SGIS\n\tuse SGIS_detail_texture DETAIL_TEXTURE_MODE_SGIS\n\tuse SGIS_generate_mipmap GENERATE_MIPMAP_SGIS\n\tuse SGIS_texture_select DUAL_TEXTURE_SELECT_SGIS\n\tuse SGIS_texture_select QUAD_TEXTURE_SELECT_SGIS\n\tuse SGIS_texture4D TEXTURE_WRAP_Q_SGIS\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_CENTER_SGIX\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_FRAME_SGIX\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_OFFSET_SGIX\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_LOD_OFFSET_SGIX\n\tuse SGIX_clipmap TEXTURE_CLIPMAP_DEPTH_SGIX\n\tuse SGIX_shadow TEXTURE_COMPARE_SGIX\n\tuse SGIX_shadow TEXTURE_COMPARE_OPERATOR_SGIX\n\tuse SGIX_shadow_ambient SHADOW_AMBIENT_SGIX\n\tuse SGIX_texture_coordinate_clamp TEXTURE_MAX_CLAMP_S_SGIX\n\tuse SGIX_texture_coordinate_clamp TEXTURE_MAX_CLAMP_T_SGIX\n\tuse SGIX_texture_coordinate_clamp TEXTURE_MAX_CLAMP_R_SGIX\n\tuse SGIX_texture_lod_bias TEXTURE_LOD_BIAS_S_SGIX\n\tuse SGIX_texture_lod_bias TEXTURE_LOD_BIAS_T_SGIX\n\tuse SGIX_texture_lod_bias TEXTURE_LOD_BIAS_R_SGIX\n\tuse SGIX_texture_scale_bias POST_TEXTURE_FILTER_BIAS_SGIX\n\tuse SGIX_texture_scale_bias POST_TEXTURE_FILTER_SCALE_SGIX\n\n###############################################################################\n\nTextureTarget enum:\n\tuse GetPName TEXTURE_1D\n\tuse GetPName TEXTURE_2D\n\tPROXY_TEXTURE_1D\t\t\t\t= 0x8063\n\tPROXY_TEXTURE_2D\t\t\t\t= 0x8064\n\tuse EXT_texture3D TEXTURE_3D_EXT\n\tuse EXT_texture3D PROXY_TEXTURE_3D_EXT\n\tuse SGIS_detail_texture DETAIL_TEXTURE_2D_SGIS\n\tuse SGIS_texture4D TEXTURE_4D_SGIS\n\tuse SGIS_texture4D PROXY_TEXTURE_4D_SGIS\n\tuse SGIS_texture_lod TEXTURE_MIN_LOD_SGIS\n\tuse SGIS_texture_lod TEXTURE_MAX_LOD_SGIS\n\tuse SGIS_texture_lod TEXTURE_BASE_LEVEL_SGIS\n\tuse SGIS_texture_lod TEXTURE_MAX_LEVEL_SGIS\n\n###############################################################################\n\nTextureWrapMode enum:\n\tCLAMP\t\t\t\t\t\t= 0x2900\n\tREPEAT\t\t\t\t\t\t= 0x2901\n\tuse SGIS_texture_border_clamp CLAMP_TO_BORDER_SGIS\n\tuse SGIS_texture_edge_clamp CLAMP_TO_EDGE_SGIS\n\n###############################################################################\n\nPixelInternalFormat enum:\n\tR3_G3_B2\t\t\t\t\t= 0x2A10\n\tALPHA4\t\t\t\t\t\t= 0x803B\n\tALPHA8\t\t\t\t\t\t= 0x803C\n\tALPHA12\t\t\t\t\t\t= 0x803D\n\tALPHA16\t\t\t\t\t\t= 0x803E\n\tLUMINANCE4\t\t\t\t\t= 0x803F\n\tLUMINANCE8\t\t\t\t\t= 0x8040\n\tLUMINANCE12\t\t\t\t\t= 0x8041\n\tLUMINANCE16\t\t\t\t\t= 0x8042\n\tLUMINANCE4_ALPHA4\t\t\t\t= 0x8043\n\tLUMINANCE6_ALPHA2\t\t\t\t= 0x8044\n\tLUMINANCE8_ALPHA8\t\t\t\t= 0x8045\n\tLUMINANCE12_ALPHA4\t\t\t\t= 0x8046\n\tLUMINANCE12_ALPHA12\t\t\t\t= 0x8047\n\tLUMINANCE16_ALPHA16\t\t\t\t= 0x8048\n\tINTENSITY\t\t\t\t\t= 0x8049\n\tINTENSITY4\t\t\t\t\t= 0x804A\n\tINTENSITY8\t\t\t\t\t= 0x804B\n\tINTENSITY12\t\t\t\t\t= 0x804C\n\tINTENSITY16\t\t\t\t\t= 0x804D\n\tRGB4\t\t\t\t\t\t= 0x804F\n\tRGB5\t\t\t\t\t\t= 0x8050\n\tRGB8\t\t\t\t\t\t= 0x8051\n\tRGB10\t\t\t\t\t\t= 0x8052\n\tRGB12\t\t\t\t\t\t= 0x8053\n\tRGB16\t\t\t\t\t\t= 0x8054\n\tRGBA2\t\t\t\t\t\t= 0x8055\n\tRGBA4\t\t\t\t\t\t= 0x8056\n\tRGB5_A1\t\t\t\t\t\t= 0x8057\n\tRGBA8\t\t\t\t\t\t= 0x8058\n\tRGB10_A2\t\t\t\t\t= 0x8059\n\tRGBA12\t\t\t\t\t\t= 0x805A\n\tRGBA16\t\t\t\t\t\t= 0x805B\n\tuse EXT_texture RGB2_EXT\n\tuse SGIS_texture_select DUAL_ALPHA4_SGIS\n\tuse SGIS_texture_select DUAL_ALPHA8_SGIS\n\tuse SGIS_texture_select DUAL_ALPHA12_SGIS\n\tuse SGIS_texture_select DUAL_ALPHA16_SGIS\n\tuse SGIS_texture_select DUAL_LUMINANCE4_SGIS\n\tuse SGIS_texture_select DUAL_LUMINANCE8_SGIS\n\tuse SGIS_texture_select DUAL_LUMINANCE12_SGIS\n\tuse SGIS_texture_select DUAL_LUMINANCE16_SGIS\n\tuse SGIS_texture_select DUAL_INTENSITY4_SGIS\n\tuse SGIS_texture_select DUAL_INTENSITY8_SGIS\n\tuse SGIS_texture_select DUAL_INTENSITY12_SGIS\n\tuse SGIS_texture_select DUAL_INTENSITY16_SGIS\n\tuse SGIS_texture_select DUAL_LUMINANCE_ALPHA4_SGIS\n\tuse SGIS_texture_select DUAL_LUMINANCE_ALPHA8_SGIS\n\tuse SGIS_texture_select QUAD_ALPHA4_SGIS\n\tuse SGIS_texture_select QUAD_ALPHA8_SGIS\n\tuse SGIS_texture_select QUAD_LUMINANCE4_SGIS\n\tuse SGIS_texture_select QUAD_LUMINANCE8_SGIS\n\tuse SGIS_texture_select QUAD_INTENSITY4_SGIS\n\tuse SGIS_texture_select QUAD_INTENSITY8_SGIS\n\tuse SGIX_depth_texture DEPTH_COMPONENT16_SGIX\n\tuse SGIX_depth_texture DEPTH_COMPONENT24_SGIX\n\tuse SGIX_depth_texture DEPTH_COMPONENT32_SGIX\n\tuse SGIX_icc_texture RGB_ICC_SGIX\n\tuse SGIX_icc_texture RGBA_ICC_SGIX\n\tuse SGIX_icc_texture ALPHA_ICC_SGIX\n\tuse SGIX_icc_texture LUMINANCE_ICC_SGIX\n\tuse SGIX_icc_texture INTENSITY_ICC_SGIX\n\tuse SGIX_icc_texture LUMINANCE_ALPHA_ICC_SGIX\n\tuse SGIX_icc_texture R5_G6_B5_ICC_SGIX\n\tuse SGIX_icc_texture R5_G6_B5_A8_ICC_SGIX\n\tuse SGIX_icc_texture ALPHA16_ICC_SGIX\n\tuse SGIX_icc_texture LUMINANCE16_ICC_SGIX\n\tuse SGIX_icc_texture INTENSITY16_ICC_SGIX\n\tuse SGIX_icc_texture LUMINANCE16_ALPHA8_ICC_SGIX\n\n# Aliases PixelInternalFormat enums above\nOES_rgb8_rgba8 enum: (OpenGL ES only)\n\tRGB8\t\t\t\t\t\t= 0x8051\n\tRGBA8\t\t\t\t\t\t= 0x8058\n\n###############################################################################\n\nInterleavedArrayFormat enum:\n\tV2F\t\t\t\t\t\t= 0x2A20\n\tV3F\t\t\t\t\t\t= 0x2A21\n\tC4UB_V2F\t\t\t\t\t= 0x2A22\n\tC4UB_V3F\t\t\t\t\t= 0x2A23\n\tC3F_V3F\t\t\t\t\t\t= 0x2A24\n\tN3F_V3F\t\t\t\t\t\t= 0x2A25\n\tC4F_N3F_V3F\t\t\t\t\t= 0x2A26\n\tT2F_V3F\t\t\t\t\t\t= 0x2A27\n\tT4F_V4F\t\t\t\t\t\t= 0x2A28\n\tT2F_C4UB_V3F\t\t\t\t\t= 0x2A29\n\tT2F_C3F_V3F\t\t\t\t\t= 0x2A2A\n\tT2F_N3F_V3F\t\t\t\t\t= 0x2A2B\n\tT2F_C4F_N3F_V3F\t\t\t\t\t= 0x2A2C\n\tT4F_C4F_N3F_V4F\t\t\t\t\t= 0x2A2D\n\n###############################################################################\n\nVertexPointerType enum:\n\tuse DataType SHORT\n\tuse DataType INT\n\tuse DataType FLOAT\n\tuse DataType DOUBLE\n\n###############################################################################\n\n# 0x3000 through 0x3FFF are reserved for clip planes\nClipPlaneName enum:\n\tCLIP_PLANE0\t\t\t\t\t= 0x3000 # 1 I\n\tCLIP_PLANE1\t\t\t\t\t= 0x3001 # 1 I\n\tCLIP_PLANE2\t\t\t\t\t= 0x3002 # 1 I\n\tCLIP_PLANE3\t\t\t\t\t= 0x3003 # 1 I\n\tCLIP_PLANE4\t\t\t\t\t= 0x3004 # 1 I\n\tCLIP_PLANE5\t\t\t\t\t= 0x3005 # 1 I\n\nVERSION_3_0 enum: (aliases)\n\tCLIP_DISTANCE0\t\t\t\t\t= 0x3000    # VERSION_3_0   # alias GL_CLIP_PLANE0\n\tCLIP_DISTANCE1\t\t\t\t\t= 0x3001    # VERSION_3_0   # alias GL_CLIP_PLANE1\n\tCLIP_DISTANCE2\t\t\t\t\t= 0x3002    # VERSION_3_0   # alias GL_CLIP_PLANE2\n\tCLIP_DISTANCE3\t\t\t\t\t= 0x3003    # VERSION_3_0   # alias GL_CLIP_PLANE3\n\tCLIP_DISTANCE4\t\t\t\t\t= 0x3004    # VERSION_3_0   # alias GL_CLIP_PLANE4\n\tCLIP_DISTANCE5\t\t\t\t\t= 0x3005    # VERSION_3_0   # alias GL_CLIP_PLANE5\n\tCLIP_DISTANCE6\t\t\t\t\t= 0x3006    # VERSION_3_0   # alias GL_CLIP_PLANE5\n\tCLIP_DISTANCE7\t\t\t\t\t= 0x3007    # VERSION_3_0   # alias GL_CLIP_PLANE5\n\n###############################################################################\n\n# 0x4000-0x4FFF are reserved for light numbers\nLightName enum:\n\tLIGHT0\t\t\t\t\t\t= 0x4000 # 1 I\n\tLIGHT1\t\t\t\t\t\t= 0x4001 # 1 I\n\tLIGHT2\t\t\t\t\t\t= 0x4002 # 1 I\n\tLIGHT3\t\t\t\t\t\t= 0x4003 # 1 I\n\tLIGHT4\t\t\t\t\t\t= 0x4004 # 1 I\n\tLIGHT5\t\t\t\t\t\t= 0x4005 # 1 I\n\tLIGHT6\t\t\t\t\t\t= 0x4006 # 1 I\n\tLIGHT7\t\t\t\t\t\t= 0x4007 # 1 I\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT0_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT1_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT2_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT3_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT4_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT5_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT6_SGIX\n\tuse SGIX_fragment_lighting FRAGMENT_LIGHT7_SGIX\n\n###############################################################################\n\nEXT_abgr enum:\n\tABGR_EXT\t\t\t\t\t= 0x8000\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tCONSTANT_COLOR\t\t\t\t\t= 0x8001\n\tONE_MINUS_CONSTANT_COLOR\t\t\t= 0x8002\n\tCONSTANT_ALPHA\t\t\t\t\t= 0x8003\n\tONE_MINUS_CONSTANT_ALPHA\t\t\t= 0x8004\n\tBLEND_COLOR\t\t\t\t\t= 0x8005 # 4 F\n\nEXT_blend_color enum:\n\tCONSTANT_COLOR_EXT\t\t\t\t= 0x8001\n\tONE_MINUS_CONSTANT_COLOR_EXT\t\t\t= 0x8002\n\tCONSTANT_ALPHA_EXT\t\t\t\t= 0x8003\n\tONE_MINUS_CONSTANT_ALPHA_EXT\t\t\t= 0x8004\n\tBLEND_COLOR_EXT\t\t\t\t\t= 0x8005 # 4 F\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\nEXT_blend_minmax enum:\n\tFUNC_ADD\t\t\t\t\t= 0x8006\n\tFUNC_ADD_EXT\t\t\t\t\t= 0x8006\n\tMIN\t\t\t\t\t\t= 0x8007\n\tMIN_EXT\t\t\t\t\t\t= 0x8007\n\tMAX\t\t\t\t\t\t= 0x8008\n\tMAX_EXT\t\t\t\t\t\t= 0x8008\n\tBLEND_EQUATION\t\t\t\t\t= 0x8009 # 1 I\n\tBLEND_EQUATION_EXT\t\t\t\t= 0x8009 # 1 I\n\nVERSION_2_0 enum: (Promoted for OpenGL 2.0)\n\tBLEND_EQUATION_RGB\t\t\t\t= 0x8009    # VERSION_2_0   # alias GL_BLEND_EQUATION\n\nEXT_blend_equation_separate enum: (separate; see below)\n\tBLEND_EQUATION_RGB_EXT\t\t\t\t= 0x8009    # alias GL_BLEND_EQUATION\n\n# Aliases EXT_blend_equation_separate enum above\nOES_blend_equation_separate enum: (OpenGL ES only; additional; see below)\n\tBLEND_EQUATION_RGB_OES\t\t\t\t= 0x8009 # 1 I\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\nEXT_blend_subtract enum:\n\tFUNC_SUBTRACT\t\t\t\t\t= 0x800A\n\tFUNC_SUBTRACT_EXT\t\t\t\t= 0x800A\n\tFUNC_REVERSE_SUBTRACT\t\t\t\t= 0x800B\n\tFUNC_REVERSE_SUBTRACT_EXT\t\t\t= 0x800B\n\n# Aliases EXT_blend_minmax and EXT_blend_subtract enums above\nOES_blend_subtract enum: (OpenGL ES only)\n\tFUNC_ADD_OES\t\t\t\t\t= 0x8006\n\tBLEND_EQUATION_OES\t\t\t\t= 0x8009 # 1 I\n\tFUNC_SUBTRACT_OES\t\t\t\t= 0x800A\n\tFUNC_REVERSE_SUBTRACT_OES\t\t\t= 0x800B\n\n###############################################################################\n\nEXT_cmyka enum:\n\tCMYK_EXT\t\t\t\t\t= 0x800C\n\tCMYKA_EXT\t\t\t\t\t= 0x800D\n\tPACK_CMYK_HINT_EXT\t\t\t\t= 0x800E # 1 I\n\tUNPACK_CMYK_HINT_EXT\t\t\t\t= 0x800F # 1 I\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tCONVOLUTION_1D\t\t\t\t\t= 0x8010 # 1 I\n\tCONVOLUTION_2D\t\t\t\t\t= 0x8011 # 1 I\n\tSEPARABLE_2D\t\t\t\t\t= 0x8012 # 1 I\n\tCONVOLUTION_BORDER_MODE\t\t\t\t= 0x8013\n\tCONVOLUTION_FILTER_SCALE\t\t\t= 0x8014\n\tCONVOLUTION_FILTER_BIAS\t\t\t\t= 0x8015\n\tREDUCE\t\t\t\t\t\t= 0x8016\n\tCONVOLUTION_FORMAT\t\t\t\t= 0x8017\n\tCONVOLUTION_WIDTH\t\t\t\t= 0x8018\n\tCONVOLUTION_HEIGHT\t\t\t\t= 0x8019\n\tMAX_CONVOLUTION_WIDTH\t\t\t\t= 0x801A\n\tMAX_CONVOLUTION_HEIGHT\t\t\t\t= 0x801B\n\tPOST_CONVOLUTION_RED_SCALE\t\t\t= 0x801C # 1 F\n\tPOST_CONVOLUTION_GREEN_SCALE\t\t\t= 0x801D # 1 F\n\tPOST_CONVOLUTION_BLUE_SCALE\t\t\t= 0x801E # 1 F\n\tPOST_CONVOLUTION_ALPHA_SCALE\t\t\t= 0x801F # 1 F\n\tPOST_CONVOLUTION_RED_BIAS\t\t\t= 0x8020 # 1 F\n\tPOST_CONVOLUTION_GREEN_BIAS\t\t\t= 0x8021 # 1 F\n\tPOST_CONVOLUTION_BLUE_BIAS\t\t\t= 0x8022 # 1 F\n\tPOST_CONVOLUTION_ALPHA_BIAS\t\t\t= 0x8023 # 1 F\n\nEXT_convolution enum:\n\tCONVOLUTION_1D_EXT\t\t\t\t= 0x8010 # 1 I\n\tCONVOLUTION_2D_EXT\t\t\t\t= 0x8011 # 1 I\n\tSEPARABLE_2D_EXT\t\t\t\t= 0x8012 # 1 I\n\tCONVOLUTION_BORDER_MODE_EXT\t\t\t= 0x8013\n\tCONVOLUTION_FILTER_SCALE_EXT\t\t\t= 0x8014\n\tCONVOLUTION_FILTER_BIAS_EXT\t\t\t= 0x8015\n\tREDUCE_EXT\t\t\t\t\t= 0x8016\n\tCONVOLUTION_FORMAT_EXT\t\t\t\t= 0x8017\n\tCONVOLUTION_WIDTH_EXT\t\t\t\t= 0x8018\n\tCONVOLUTION_HEIGHT_EXT\t\t\t\t= 0x8019\n\tMAX_CONVOLUTION_WIDTH_EXT\t\t\t= 0x801A\n\tMAX_CONVOLUTION_HEIGHT_EXT\t\t\t= 0x801B\n\tPOST_CONVOLUTION_RED_SCALE_EXT\t\t\t= 0x801C # 1 F\n\tPOST_CONVOLUTION_GREEN_SCALE_EXT\t\t= 0x801D # 1 F\n\tPOST_CONVOLUTION_BLUE_SCALE_EXT\t\t\t= 0x801E # 1 F\n\tPOST_CONVOLUTION_ALPHA_SCALE_EXT\t\t= 0x801F # 1 F\n\tPOST_CONVOLUTION_RED_BIAS_EXT\t\t\t= 0x8020 # 1 F\n\tPOST_CONVOLUTION_GREEN_BIAS_EXT\t\t\t= 0x8021 # 1 F\n\tPOST_CONVOLUTION_BLUE_BIAS_EXT\t\t\t= 0x8022 # 1 F\n\tPOST_CONVOLUTION_ALPHA_BIAS_EXT\t\t\t= 0x8023 # 1 F\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tHISTOGRAM\t\t\t\t\t= 0x8024 # 1 I\n\tPROXY_HISTOGRAM\t\t\t\t\t= 0x8025\n\tHISTOGRAM_WIDTH\t\t\t\t\t= 0x8026\n\tHISTOGRAM_FORMAT\t\t\t\t= 0x8027\n\tHISTOGRAM_RED_SIZE\t\t\t\t= 0x8028\n\tHISTOGRAM_GREEN_SIZE\t\t\t\t= 0x8029\n\tHISTOGRAM_BLUE_SIZE\t\t\t\t= 0x802A\n\tHISTOGRAM_ALPHA_SIZE\t\t\t\t= 0x802B\n\tHISTOGRAM_SINK\t\t\t\t\t= 0x802D\n\tMINMAX\t\t\t\t\t\t= 0x802E # 1 I\n\tMINMAX_FORMAT\t\t\t\t\t= 0x802F\n\tMINMAX_SINK\t\t\t\t\t= 0x8030\n\tTABLE_TOO_LARGE\t\t\t\t\t= 0x8031\n\nEXT_histogram enum:\n\tHISTOGRAM_EXT\t\t\t\t\t= 0x8024 # 1 I\n\tPROXY_HISTOGRAM_EXT\t\t\t\t= 0x8025\n\tHISTOGRAM_WIDTH_EXT\t\t\t\t= 0x8026\n\tHISTOGRAM_FORMAT_EXT\t\t\t\t= 0x8027\n\tHISTOGRAM_RED_SIZE_EXT\t\t\t\t= 0x8028\n\tHISTOGRAM_GREEN_SIZE_EXT\t\t\t= 0x8029\n\tHISTOGRAM_BLUE_SIZE_EXT\t\t\t\t= 0x802A\n\tHISTOGRAM_ALPHA_SIZE_EXT\t\t\t= 0x802B\n\tHISTOGRAM_LUMINANCE_SIZE\t\t\t= 0x802C\n\tHISTOGRAM_LUMINANCE_SIZE_EXT\t\t\t= 0x802C\n\tHISTOGRAM_SINK_EXT\t\t\t\t= 0x802D\n\tMINMAX_EXT\t\t\t\t\t= 0x802E # 1 I\n\tMINMAX_FORMAT_EXT\t\t\t\t= 0x802F\n\tMINMAX_SINK_EXT\t\t\t\t\t= 0x8030\n\tTABLE_TOO_LARGE_EXT\t\t\t\t= 0x8031\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tUNSIGNED_BYTE_3_3_2\t\t\t\t= 0x8032\n\tUNSIGNED_SHORT_4_4_4_4\t\t\t\t= 0x8033\n\tUNSIGNED_SHORT_5_5_5_1\t\t\t\t= 0x8034\n\tUNSIGNED_INT_8_8_8_8\t\t\t\t= 0x8035\n\tUNSIGNED_INT_10_10_10_2\t\t\t\t= 0x8036\n\tUNSIGNED_BYTE_2_3_3_REV\t\t\t\t= 0x8362\n\tUNSIGNED_SHORT_5_6_5\t\t\t\t= 0x8363\n\tUNSIGNED_SHORT_5_6_5_REV\t\t\t= 0x8364\n\tUNSIGNED_SHORT_4_4_4_4_REV\t\t\t= 0x8365\n\tUNSIGNED_SHORT_1_5_5_5_REV\t\t\t= 0x8366\n\tUNSIGNED_INT_8_8_8_8_REV\t\t\t= 0x8367\n\tUNSIGNED_INT_2_10_10_10_REV\t\t\t= 0x8368\n\nEXT_packed_pixels enum:\n\tUNSIGNED_BYTE_3_3_2_EXT\t\t\t\t= 0x8032\n\tUNSIGNED_SHORT_4_4_4_4_EXT\t\t\t= 0x8033\n\tUNSIGNED_SHORT_5_5_5_1_EXT\t\t\t= 0x8034\n\tUNSIGNED_INT_8_8_8_8_EXT\t\t\t= 0x8035\n\tUNSIGNED_INT_10_10_10_2_EXT\t\t\t= 0x8036\n\tUNSIGNED_BYTE_2_3_3_REV_EXT\t\t\t= 0x8362\n\tUNSIGNED_SHORT_5_6_5_EXT\t\t\t= 0x8363\n\tUNSIGNED_SHORT_5_6_5_REV_EXT\t\t\t= 0x8364\n\tUNSIGNED_SHORT_4_4_4_4_REV_EXT\t\t\t= 0x8365\n\tUNSIGNED_SHORT_1_5_5_5_REV_EXT\t\t\t= 0x8366\n\tUNSIGNED_INT_8_8_8_8_REV_EXT\t\t\t= 0x8367\n\tUNSIGNED_INT_2_10_10_10_REV_EXT\t\t\t= 0x8368\n\nEXT_texture_type_2_10_10_10_REV enum: (OpenGL ES only)\n#\tuse EXT_packed_pixels UNSIGNED_INT_2_10_10_10_REV_EXT\n\n###############################################################################\n\nEXT_polygon_offset enum:\n\tPOLYGON_OFFSET_EXT\t\t\t\t= 0x8037\n\tPOLYGON_OFFSET_FACTOR_EXT\t\t\t= 0x8038\n\tPOLYGON_OFFSET_BIAS_EXT\t\t\t\t= 0x8039 # 1 F\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tRESCALE_NORMAL\t\t\t\t\t= 0x803A # 1 I\n\nEXT_rescale_normal enum:\n\tRESCALE_NORMAL_EXT\t\t\t\t= 0x803A # 1 I\n\n###############################################################################\n\nEXT_texture enum:\n\tALPHA4_EXT\t\t\t\t\t= 0x803B\n\tALPHA8_EXT\t\t\t\t\t= 0x803C\n\tALPHA12_EXT\t\t\t\t\t= 0x803D\n\tALPHA16_EXT\t\t\t\t\t= 0x803E\n\tLUMINANCE4_EXT\t\t\t\t\t= 0x803F\n\tLUMINANCE8_EXT\t\t\t\t\t= 0x8040\n\tLUMINANCE12_EXT\t\t\t\t\t= 0x8041\n\tLUMINANCE16_EXT\t\t\t\t\t= 0x8042\n\tLUMINANCE4_ALPHA4_EXT\t\t\t\t= 0x8043\n\tLUMINANCE6_ALPHA2_EXT\t\t\t\t= 0x8044\n\tLUMINANCE8_ALPHA8_EXT\t\t\t\t= 0x8045\n\tLUMINANCE12_ALPHA4_EXT\t\t\t\t= 0x8046\n\tLUMINANCE12_ALPHA12_EXT\t\t\t\t= 0x8047\n\tLUMINANCE16_ALPHA16_EXT\t\t\t\t= 0x8048\n\tINTENSITY_EXT\t\t\t\t\t= 0x8049\n\tINTENSITY4_EXT\t\t\t\t\t= 0x804A\n\tINTENSITY8_EXT\t\t\t\t\t= 0x804B\n\tINTENSITY12_EXT\t\t\t\t\t= 0x804C\n\tINTENSITY16_EXT\t\t\t\t\t= 0x804D\n\tRGB2_EXT\t\t\t\t\t= 0x804E\n\tRGB4_EXT\t\t\t\t\t= 0x804F\n\tRGB5_EXT\t\t\t\t\t= 0x8050\n\tRGB8_EXT\t\t\t\t\t= 0x8051\n\tRGB10_EXT\t\t\t\t\t= 0x8052\n\tRGB12_EXT\t\t\t\t\t= 0x8053\n\tRGB16_EXT\t\t\t\t\t= 0x8054\n\tRGBA2_EXT\t\t\t\t\t= 0x8055\n\tRGBA4_EXT\t\t\t\t\t= 0x8056\n\tRGB5_A1_EXT\t\t\t\t\t= 0x8057\n\tRGBA8_EXT\t\t\t\t\t= 0x8058\n\tRGB10_A2_EXT\t\t\t\t\t= 0x8059\n\tRGBA12_EXT\t\t\t\t\t= 0x805A\n\tRGBA16_EXT\t\t\t\t\t= 0x805B\n\tTEXTURE_RED_SIZE_EXT\t\t\t\t= 0x805C\n\tTEXTURE_GREEN_SIZE_EXT\t\t\t\t= 0x805D\n\tTEXTURE_BLUE_SIZE_EXT\t\t\t\t= 0x805E\n\tTEXTURE_ALPHA_SIZE_EXT\t\t\t\t= 0x805F\n\tTEXTURE_LUMINANCE_SIZE_EXT\t\t\t= 0x8060\n\tTEXTURE_INTENSITY_SIZE_EXT\t\t\t= 0x8061\n\tREPLACE_EXT\t\t\t\t\t= 0x8062\n\tPROXY_TEXTURE_1D_EXT\t\t\t\t= 0x8063\n\tPROXY_TEXTURE_2D_EXT\t\t\t\t= 0x8064\n\tTEXTURE_TOO_LARGE_EXT\t\t\t\t= 0x8065\n\n# Aliases EXT_texture enums above\nOES_framebuffer_object enum: (OpenGL ES only; additional; see below)\n\tRGBA4_OES\t\t\t\t\t= 0x8056\n\tRGB5_A1_OES\t\t\t\t\t= 0x8057\n\n###############################################################################\n\nEXT_texture_object enum:\n\tTEXTURE_PRIORITY_EXT\t\t\t\t= 0x8066\n\tTEXTURE_RESIDENT_EXT\t\t\t\t= 0x8067\n\tTEXTURE_1D_BINDING_EXT\t\t\t\t= 0x8068\n\tTEXTURE_2D_BINDING_EXT\t\t\t\t= 0x8069\n\tTEXTURE_3D_BINDING_EXT\t\t\t\t= 0x806A # 1 I\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tPACK_SKIP_IMAGES\t\t\t\t= 0x806B # 1 I\n\tPACK_IMAGE_HEIGHT\t\t\t\t= 0x806C # 1 F\n\tUNPACK_SKIP_IMAGES\t\t\t\t= 0x806D # 1 I\n\tUNPACK_IMAGE_HEIGHT\t\t\t\t= 0x806E # 1 F\n\tTEXTURE_3D\t\t\t\t\t= 0x806F # 1 I\n\tPROXY_TEXTURE_3D\t\t\t\t= 0x8070\n\tTEXTURE_DEPTH\t\t\t\t\t= 0x8071\n\tTEXTURE_WRAP_R\t\t\t\t\t= 0x8072\n\tMAX_3D_TEXTURE_SIZE\t\t\t\t= 0x8073 # 1 I\n\nEXT_texture3D enum:\n\tPACK_SKIP_IMAGES_EXT\t\t\t\t= 0x806B # 1 I\n\tPACK_IMAGE_HEIGHT_EXT\t\t\t\t= 0x806C # 1 F\n\tUNPACK_SKIP_IMAGES_EXT\t\t\t\t= 0x806D # 1 I\n\tUNPACK_IMAGE_HEIGHT_EXT\t\t\t\t= 0x806E # 1 F\n\tTEXTURE_3D_EXT\t\t\t\t\t= 0x806F # 1 I\n\tPROXY_TEXTURE_3D_EXT\t\t\t\t= 0x8070\n\tTEXTURE_DEPTH_EXT\t\t\t\t= 0x8071\n\tTEXTURE_WRAP_R_EXT\t\t\t\t= 0x8072\n\tMAX_3D_TEXTURE_SIZE_EXT\t\t\t\t= 0x8073 # 1 I\n\n# Aliases EXT_texture_object, EXT_texture3D enums above\nOES_texture3D enum: (OpenGL ES only)\n\tTEXTURE_3D_BINDING_OES\t\t\t\t= 0x806A # 1 I\n\tTEXTURE_3D_OES\t\t\t\t\t= 0x806F # 1 I\n\tTEXTURE_WRAP_R_OES\t\t\t\t= 0x8072\n\tMAX_3D_TEXTURE_SIZE_OES\t\t\t\t= 0x8073 # 1 I\n\n###############################################################################\n\nEXT_vertex_array enum:\n\tVERTEX_ARRAY_EXT\t\t\t\t= 0x8074\n\tNORMAL_ARRAY_EXT\t\t\t\t= 0x8075\n\tCOLOR_ARRAY_EXT\t\t\t\t\t= 0x8076\n\tINDEX_ARRAY_EXT\t\t\t\t\t= 0x8077\n\tTEXTURE_COORD_ARRAY_EXT\t\t\t\t= 0x8078\n\tEDGE_FLAG_ARRAY_EXT\t\t\t\t= 0x8079\n\tVERTEX_ARRAY_SIZE_EXT\t\t\t\t= 0x807A\n\tVERTEX_ARRAY_TYPE_EXT\t\t\t\t= 0x807B\n\tVERTEX_ARRAY_STRIDE_EXT\t\t\t\t= 0x807C\n\tVERTEX_ARRAY_COUNT_EXT\t\t\t\t= 0x807D # 1 I\n\tNORMAL_ARRAY_TYPE_EXT\t\t\t\t= 0x807E\n\tNORMAL_ARRAY_STRIDE_EXT\t\t\t\t= 0x807F\n\tNORMAL_ARRAY_COUNT_EXT\t\t\t\t= 0x8080 # 1 I\n\tCOLOR_ARRAY_SIZE_EXT\t\t\t\t= 0x8081\n\tCOLOR_ARRAY_TYPE_EXT\t\t\t\t= 0x8082\n\tCOLOR_ARRAY_STRIDE_EXT\t\t\t\t= 0x8083\n\tCOLOR_ARRAY_COUNT_EXT\t\t\t\t= 0x8084 # 1 I\n\tINDEX_ARRAY_TYPE_EXT\t\t\t\t= 0x8085\n\tINDEX_ARRAY_STRIDE_EXT\t\t\t\t= 0x8086\n\tINDEX_ARRAY_COUNT_EXT\t\t\t\t= 0x8087 # 1 I\n\tTEXTURE_COORD_ARRAY_SIZE_EXT\t\t\t= 0x8088\n\tTEXTURE_COORD_ARRAY_TYPE_EXT\t\t\t= 0x8089\n\tTEXTURE_COORD_ARRAY_STRIDE_EXT\t\t\t= 0x808A\n\tTEXTURE_COORD_ARRAY_COUNT_EXT\t\t\t= 0x808B # 1 I\n\tEDGE_FLAG_ARRAY_STRIDE_EXT\t\t\t= 0x808C\n\tEDGE_FLAG_ARRAY_COUNT_EXT\t\t\t= 0x808D # 1 I\n\tVERTEX_ARRAY_POINTER_EXT\t\t\t= 0x808E\n\tNORMAL_ARRAY_POINTER_EXT\t\t\t= 0x808F\n\tCOLOR_ARRAY_POINTER_EXT\t\t\t\t= 0x8090\n\tINDEX_ARRAY_POINTER_EXT\t\t\t\t= 0x8091\n\tTEXTURE_COORD_ARRAY_POINTER_EXT\t\t\t= 0x8092\n\tEDGE_FLAG_ARRAY_POINTER_EXT\t\t\t= 0x8093\n\n###############################################################################\n\nSGIX_interlace enum:\n\tINTERLACE_SGIX\t\t\t\t\t= 0x8094 # 1 I\n\n###############################################################################\n\nSGIS_detail_texture enum:\n\tDETAIL_TEXTURE_2D_SGIS\t\t\t\t= 0x8095\n\tDETAIL_TEXTURE_2D_BINDING_SGIS\t\t\t= 0x8096 # 1 I\n\tLINEAR_DETAIL_SGIS\t\t\t\t= 0x8097\n\tLINEAR_DETAIL_ALPHA_SGIS\t\t\t= 0x8098\n\tLINEAR_DETAIL_COLOR_SGIS\t\t\t= 0x8099\n\tDETAIL_TEXTURE_LEVEL_SGIS\t\t\t= 0x809A\n\tDETAIL_TEXTURE_MODE_SGIS\t\t\t= 0x809B\n\tDETAIL_TEXTURE_FUNC_POINTS_SGIS\t\t\t= 0x809C\n\n###############################################################################\n\n# Reuses some SGIS_multisample values\nVERSION_1_3 enum: (Promoted for OpenGL 1.3)\n\tMULTISAMPLE\t\t\t\t\t= 0x809D\n\tSAMPLE_ALPHA_TO_COVERAGE\t\t\t= 0x809E\n\tSAMPLE_ALPHA_TO_ONE\t\t\t\t= 0x809F\n\tSAMPLE_COVERAGE\t\t\t\t\t= 0x80A0\n\tSAMPLE_BUFFERS\t\t\t\t\t= 0x80A8 # 1 I\n\tSAMPLES\t\t\t\t\t\t= 0x80A9 # 1 I\n\tSAMPLE_COVERAGE_VALUE\t\t\t\t= 0x80AA # 1 F\n\tSAMPLE_COVERAGE_INVERT\t\t\t\t= 0x80AB # 1 I\n\nARB_multisample enum:\n\tMULTISAMPLE_ARB\t\t\t\t\t= 0x809D\n\tSAMPLE_ALPHA_TO_COVERAGE_ARB\t\t\t= 0x809E\n\tSAMPLE_ALPHA_TO_ONE_ARB\t\t\t\t= 0x809F\n\tSAMPLE_COVERAGE_ARB\t\t\t\t= 0x80A0\n\tSAMPLE_BUFFERS_ARB\t\t\t\t= 0x80A8 # 1 I\n\tSAMPLES_ARB\t\t\t\t\t= 0x80A9 # 1 I\n\tSAMPLE_COVERAGE_VALUE_ARB\t\t\t= 0x80AA # 1 F\n\tSAMPLE_COVERAGE_INVERT_ARB\t\t\t= 0x80AB # 1 I\n\nSGIS_multisample enum:\n\tMULTISAMPLE_SGIS\t\t\t\t= 0x809D # 1 I\n\tSAMPLE_ALPHA_TO_MASK_SGIS\t\t\t= 0x809E # 1 I\n\tSAMPLE_ALPHA_TO_ONE_SGIS\t\t\t= 0x809F # 1 I\n\tSAMPLE_MASK_SGIS\t\t\t\t= 0x80A0 # 1 I\n\t1PASS_SGIS\t\t\t\t\t= 0x80A1\n\t2PASS_0_SGIS\t\t\t\t\t= 0x80A2\n\t2PASS_1_SGIS\t\t\t\t\t= 0x80A3\n\t4PASS_0_SGIS\t\t\t\t\t= 0x80A4\n\t4PASS_1_SGIS\t\t\t\t\t= 0x80A5\n\t4PASS_2_SGIS\t\t\t\t\t= 0x80A6\n\t4PASS_3_SGIS\t\t\t\t\t= 0x80A7\n\tSAMPLE_BUFFERS_SGIS\t\t\t\t= 0x80A8 # 1 I\n\tSAMPLES_SGIS\t\t\t\t\t= 0x80A9 # 1 I\n\tSAMPLE_MASK_VALUE_SGIS\t\t\t\t= 0x80AA # 1 F\n\tSAMPLE_MASK_INVERT_SGIS\t\t\t\t= 0x80AB # 1 I\n\tSAMPLE_PATTERN_SGIS\t\t\t\t= 0x80AC # 1 I\n\n# Reuses SGIS_multisample values.\nEXT_multisample enum:\n\tMULTISAMPLE_EXT\t\t\t\t\t= 0x809D\n\tSAMPLE_ALPHA_TO_MASK_EXT\t\t\t= 0x809E\n\tSAMPLE_ALPHA_TO_ONE_EXT\t\t\t\t= 0x809F\n\tSAMPLE_MASK_EXT\t\t\t\t\t= 0x80A0\n\t1PASS_EXT\t\t\t\t\t= 0x80A1\n\t2PASS_0_EXT\t\t\t\t\t= 0x80A2\n\t2PASS_1_EXT\t\t\t\t\t= 0x80A3\n\t4PASS_0_EXT\t\t\t\t\t= 0x80A4\n\t4PASS_1_EXT\t\t\t\t\t= 0x80A5\n\t4PASS_2_EXT\t\t\t\t\t= 0x80A6\n\t4PASS_3_EXT\t\t\t\t\t= 0x80A7\n\tSAMPLE_BUFFERS_EXT\t\t\t\t= 0x80A8 # 1 I\n\tSAMPLES_EXT\t\t\t\t\t= 0x80A9 # 1 I\n\tSAMPLE_MASK_VALUE_EXT\t\t\t\t= 0x80AA # 1 F\n\tSAMPLE_MASK_INVERT_EXT\t\t\t\t= 0x80AB # 1 I\n\tSAMPLE_PATTERN_EXT\t\t\t\t= 0x80AC # 1 I\n\tMULTISAMPLE_BIT_EXT\t\t\t\t= 0x20000000\n\n###############################################################################\n\nSGIS_sharpen_texture enum:\n\tLINEAR_SHARPEN_SGIS\t\t\t\t= 0x80AD\n\tLINEAR_SHARPEN_ALPHA_SGIS\t\t\t= 0x80AE\n\tLINEAR_SHARPEN_COLOR_SGIS\t\t\t= 0x80AF\n\tSHARPEN_TEXTURE_FUNC_POINTS_SGIS\t\t= 0x80B0\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tCOLOR_MATRIX\t\t\t\t\t= 0x80B1 # 16 F\n\tCOLOR_MATRIX_STACK_DEPTH\t\t\t= 0x80B2 # 1 I\n\tMAX_COLOR_MATRIX_STACK_DEPTH\t\t\t= 0x80B3 # 1 I\n\tPOST_COLOR_MATRIX_RED_SCALE\t\t\t= 0x80B4 # 1 F\n\tPOST_COLOR_MATRIX_GREEN_SCALE\t\t\t= 0x80B5 # 1 F\n\tPOST_COLOR_MATRIX_BLUE_SCALE\t\t\t= 0x80B6 # 1 F\n\tPOST_COLOR_MATRIX_ALPHA_SCALE\t\t\t= 0x80B7 # 1 F\n\tPOST_COLOR_MATRIX_RED_BIAS\t\t\t= 0x80B8 # 1 F\n\tPOST_COLOR_MATRIX_GREEN_BIAS\t\t\t= 0x80B9 # 1 F\n\tPOST_COLOR_MATRIX_BLUE_BIAS\t\t\t= 0x80BA # 1 F\n\tPOST_COLOR_MATRIX_ALPHA_BIAS\t\t\t= 0x80BB # 1 F\n\nSGI_color_matrix enum:\n\tCOLOR_MATRIX_SGI\t\t\t\t= 0x80B1 # 16 F\n\tCOLOR_MATRIX_STACK_DEPTH_SGI\t\t\t= 0x80B2 # 1 I\n\tMAX_COLOR_MATRIX_STACK_DEPTH_SGI\t\t= 0x80B3 # 1 I\n\tPOST_COLOR_MATRIX_RED_SCALE_SGI\t\t\t= 0x80B4 # 1 F\n\tPOST_COLOR_MATRIX_GREEN_SCALE_SGI\t\t= 0x80B5 # 1 F\n\tPOST_COLOR_MATRIX_BLUE_SCALE_SGI\t\t= 0x80B6 # 1 F\n\tPOST_COLOR_MATRIX_ALPHA_SCALE_SGI\t\t= 0x80B7 # 1 F\n\tPOST_COLOR_MATRIX_RED_BIAS_SGI\t\t\t= 0x80B8 # 1 F\n\tPOST_COLOR_MATRIX_GREEN_BIAS_SGI\t\t= 0x80B9 # 1 F\n\tPOST_COLOR_MATRIX_BLUE_BIAS_SGI\t\t\t= 0x80BA # 1 F\n\tPOST_COLOR_MATRIX_ALPHA_BIAS_SGI\t\t= 0x80BB # 1 F\n\n###############################################################################\n\nSGI_texture_color_table enum:\n\tTEXTURE_COLOR_TABLE_SGI\t\t\t\t= 0x80BC # 1 I\n\tPROXY_TEXTURE_COLOR_TABLE_SGI\t\t\t= 0x80BD\n\n###############################################################################\n\nSGIX_texture_add_env enum:\n\tTEXTURE_ENV_BIAS_SGIX\t\t\t\t= 0x80BE\n\n###############################################################################\n\nSGIX_shadow_ambient enum:\n\tSHADOW_AMBIENT_SGIX\t\t\t\t= 0x80BF\n\n###############################################################################\n\n# Intergraph/Intense3D/3Dlabs: 0x80C0-0x80CF\n\n# 3Dlabs_future_use: 0x80C0-0x80C7\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tBLEND_DST_RGB\t\t\t\t\t= 0x80C8\n\tBLEND_SRC_RGB\t\t\t\t\t= 0x80C9\n\tBLEND_DST_ALPHA\t\t\t\t\t= 0x80CA\n\tBLEND_SRC_ALPHA\t\t\t\t\t= 0x80CB\n\nEXT_blend_func_separate enum:\n\tBLEND_DST_RGB_EXT\t\t\t\t= 0x80C8\n\tBLEND_SRC_RGB_EXT\t\t\t\t= 0x80C9\n\tBLEND_DST_ALPHA_EXT\t\t\t\t= 0x80CA\n\tBLEND_SRC_ALPHA_EXT\t\t\t\t= 0x80CB\n\n# Aliases EXT_blend_func_separate enums above\nOES_blend_func_separate enum: (OpenGL ES only)\n\tBLEND_DST_RGB_OES\t\t\t\t= 0x80C8\n\tBLEND_SRC_RGB_OES\t\t\t\t= 0x80C9\n\tBLEND_DST_ALPHA_OES\t\t\t\t= 0x80CA\n\tBLEND_SRC_ALPHA_OES\t\t\t\t= 0x80CB\n\nEXT_422_pixels enum:\n\t422_EXT\t\t\t\t\t\t= 0x80CC\n\t422_REV_EXT\t\t\t\t\t= 0x80CD\n\t422_AVERAGE_EXT\t\t\t\t\t= 0x80CE\n\t422_REV_AVERAGE_EXT\t\t\t\t= 0x80CF\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tCOLOR_TABLE\t\t\t\t\t= 0x80D0 # 1 I\n\tPOST_CONVOLUTION_COLOR_TABLE\t\t\t= 0x80D1 # 1 I\n\tPOST_COLOR_MATRIX_COLOR_TABLE\t\t\t= 0x80D2 # 1 I\n\tPROXY_COLOR_TABLE\t\t\t\t= 0x80D3\n\tPROXY_POST_CONVOLUTION_COLOR_TABLE\t\t= 0x80D4\n\tPROXY_POST_COLOR_MATRIX_COLOR_TABLE\t\t= 0x80D5\n\tCOLOR_TABLE_SCALE\t\t\t\t= 0x80D6\n\tCOLOR_TABLE_BIAS\t\t\t\t= 0x80D7\n\tCOLOR_TABLE_FORMAT\t\t\t\t= 0x80D8\n\tCOLOR_TABLE_WIDTH\t\t\t\t= 0x80D9\n\tCOLOR_TABLE_RED_SIZE\t\t\t\t= 0x80DA\n\tCOLOR_TABLE_GREEN_SIZE\t\t\t\t= 0x80DB\n\tCOLOR_TABLE_BLUE_SIZE\t\t\t\t= 0x80DC\n\tCOLOR_TABLE_ALPHA_SIZE\t\t\t\t= 0x80DD\n\tCOLOR_TABLE_LUMINANCE_SIZE\t\t\t= 0x80DE\n\tCOLOR_TABLE_INTENSITY_SIZE\t\t\t= 0x80DF\n\nSGI_color_table enum:\n\tCOLOR_TABLE_SGI\t\t\t\t\t= 0x80D0 # 1 I\n\tPOST_CONVOLUTION_COLOR_TABLE_SGI\t\t= 0x80D1 # 1 I\n\tPOST_COLOR_MATRIX_COLOR_TABLE_SGI\t\t= 0x80D2 # 1 I\n\tPROXY_COLOR_TABLE_SGI\t\t\t\t= 0x80D3\n\tPROXY_POST_CONVOLUTION_COLOR_TABLE_SGI\t\t= 0x80D4\n\tPROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI\t\t= 0x80D5\n\tCOLOR_TABLE_SCALE_SGI\t\t\t\t= 0x80D6\n\tCOLOR_TABLE_BIAS_SGI\t\t\t\t= 0x80D7\n\tCOLOR_TABLE_FORMAT_SGI\t\t\t\t= 0x80D8\n\tCOLOR_TABLE_WIDTH_SGI\t\t\t\t= 0x80D9\n\tCOLOR_TABLE_RED_SIZE_SGI\t\t\t= 0x80DA\n\tCOLOR_TABLE_GREEN_SIZE_SGI\t\t\t= 0x80DB\n\tCOLOR_TABLE_BLUE_SIZE_SGI\t\t\t= 0x80DC\n\tCOLOR_TABLE_ALPHA_SIZE_SGI\t\t\t= 0x80DD\n\tCOLOR_TABLE_LUMINANCE_SIZE_SGI\t\t\t= 0x80DE\n\tCOLOR_TABLE_INTENSITY_SIZE_SGI\t\t\t= 0x80DF\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tBGR\t\t\t\t\t\t= 0x80E0\n\tBGRA\t\t\t\t\t\t= 0x80E1\n\nARB_vertex_array_bgra enum:\n#\tuse VERSION_1_2\t\t\t    BGRA\n\nEXT_bgra enum:\n\tBGR_EXT\t\t\t\t\t\t= 0x80E0\n\tBGRA_EXT\t\t\t\t\t= 0x80E1\n\n###############################################################################\n\n# Microsoft: 0x80E2-0x80E7\n\n###############################################################################\n\nVERSION_1_2 enum:\n\tMAX_ELEMENTS_VERTICES\t\t\t\t= 0x80E8\n\tMAX_ELEMENTS_INDICES\t\t\t\t= 0x80E9\n\n###############################################################################\n\n# Microsoft: 0x80EA-0x810F\n\n###############################################################################\n\nSGIS_texture_select enum:\n\tDUAL_ALPHA4_SGIS\t\t\t\t= 0x8110\n\tDUAL_ALPHA8_SGIS\t\t\t\t= 0x8111\n\tDUAL_ALPHA12_SGIS\t\t\t\t= 0x8112\n\tDUAL_ALPHA16_SGIS\t\t\t\t= 0x8113\n\tDUAL_LUMINANCE4_SGIS\t\t\t\t= 0x8114\n\tDUAL_LUMINANCE8_SGIS\t\t\t\t= 0x8115\n\tDUAL_LUMINANCE12_SGIS\t\t\t\t= 0x8116\n\tDUAL_LUMINANCE16_SGIS\t\t\t\t= 0x8117\n\tDUAL_INTENSITY4_SGIS\t\t\t\t= 0x8118\n\tDUAL_INTENSITY8_SGIS\t\t\t\t= 0x8119\n\tDUAL_INTENSITY12_SGIS\t\t\t\t= 0x811A\n\tDUAL_INTENSITY16_SGIS\t\t\t\t= 0x811B\n\tDUAL_LUMINANCE_ALPHA4_SGIS\t\t\t= 0x811C\n\tDUAL_LUMINANCE_ALPHA8_SGIS\t\t\t= 0x811D\n\tQUAD_ALPHA4_SGIS\t\t\t\t= 0x811E\n\tQUAD_ALPHA8_SGIS\t\t\t\t= 0x811F\n\tQUAD_LUMINANCE4_SGIS\t\t\t\t= 0x8120\n\tQUAD_LUMINANCE8_SGIS\t\t\t\t= 0x8121\n\tQUAD_INTENSITY4_SGIS\t\t\t\t= 0x8122\n\tQUAD_INTENSITY8_SGIS\t\t\t\t= 0x8123\n\tDUAL_TEXTURE_SELECT_SGIS\t\t\t= 0x8124\n\tQUAD_TEXTURE_SELECT_SGIS\t\t\t= 0x8125\n\n###############################################################################\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tPOINT_SIZE_MIN\t\t\t\t\t= 0x8126 # 1 F\n\tPOINT_SIZE_MAX\t\t\t\t\t= 0x8127 # 1 F\n\tPOINT_FADE_THRESHOLD_SIZE\t\t\t= 0x8128 # 1 F\n\tPOINT_DISTANCE_ATTENUATION\t\t\t= 0x8129 # 3 F\n\nARB_point_parameters enum:\n\tPOINT_SIZE_MIN_ARB\t\t\t\t= 0x8126 # 1 F\n\tPOINT_SIZE_MAX_ARB\t\t\t\t= 0x8127 # 1 F\n\tPOINT_FADE_THRESHOLD_SIZE_ARB\t\t\t= 0x8128 # 1 F\n\tPOINT_DISTANCE_ATTENUATION_ARB\t\t\t= 0x8129 # 3 F\n\nEXT_point_parameters enum:\n\tPOINT_SIZE_MIN_EXT\t\t\t\t= 0x8126 # 1 F\n\tPOINT_SIZE_MAX_EXT\t\t\t\t= 0x8127 # 1 F\n\tPOINT_FADE_THRESHOLD_SIZE_EXT\t\t\t= 0x8128 # 1 F\n\tDISTANCE_ATTENUATION_EXT\t\t\t= 0x8129 # 3 F\n\nSGIS_point_parameters enum:\n\tPOINT_SIZE_MIN_SGIS\t\t\t\t= 0x8126 # 1 F\n\tPOINT_SIZE_MAX_SGIS\t\t\t\t= 0x8127 # 1 F\n\tPOINT_FADE_THRESHOLD_SIZE_SGIS\t\t\t= 0x8128 # 1 F\n\tDISTANCE_ATTENUATION_SGIS\t\t\t= 0x8129 # 3 F\n\n###############################################################################\n\nSGIS_fog_function enum:\n\tFOG_FUNC_SGIS\t\t\t\t\t= 0x812A\n\tFOG_FUNC_POINTS_SGIS\t\t\t\t= 0x812B # 1 I\n\tMAX_FOG_FUNC_POINTS_SGIS\t\t\t= 0x812C # 1 I\n\n###############################################################################\n\nVERSION_1_3 enum: (Promoted for OpenGL 1.3)\n\tCLAMP_TO_BORDER\t\t\t\t\t= 0x812D\n\nARB_texture_border_clamp enum:\n\tCLAMP_TO_BORDER_ARB\t\t\t\t= 0x812D\n\nSGIS_texture_border_clamp enum:\n\tCLAMP_TO_BORDER_SGIS\t\t\t\t= 0x812D\n\n###############################################################################\n\nSGIX_texture_multi_buffer enum:\n\tTEXTURE_MULTI_BUFFER_HINT_SGIX\t\t\t= 0x812E\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tCLAMP_TO_EDGE\t\t\t\t\t= 0x812F\n\nSGIS_texture_edge_clamp enum:\n\tCLAMP_TO_EDGE_SGIS\t\t\t\t= 0x812F\n\n###############################################################################\n\nSGIS_texture4D enum:\n\tPACK_SKIP_VOLUMES_SGIS\t\t\t\t= 0x8130 # 1 I\n\tPACK_IMAGE_DEPTH_SGIS\t\t\t\t= 0x8131 # 1 I\n\tUNPACK_SKIP_VOLUMES_SGIS\t\t\t= 0x8132 # 1 I\n\tUNPACK_IMAGE_DEPTH_SGIS\t\t\t\t= 0x8133 # 1 I\n\tTEXTURE_4D_SGIS\t\t\t\t\t= 0x8134 # 1 I\n\tPROXY_TEXTURE_4D_SGIS\t\t\t\t= 0x8135\n\tTEXTURE_4DSIZE_SGIS\t\t\t\t= 0x8136\n\tTEXTURE_WRAP_Q_SGIS\t\t\t\t= 0x8137\n\tMAX_4D_TEXTURE_SIZE_SGIS\t\t\t= 0x8138 # 1 I\n\tTEXTURE_4D_BINDING_SGIS\t\t\t\t= 0x814F # 1 I\n\n###############################################################################\n\nSGIX_pixel_texture enum:\n\tPIXEL_TEX_GEN_SGIX\t\t\t\t= 0x8139 # 1 I\n\tPIXEL_TEX_GEN_MODE_SGIX\t\t\t\t= 0x832B # 1 I\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tTEXTURE_MIN_LOD\t\t\t\t\t= 0x813A\n\tTEXTURE_MAX_LOD\t\t\t\t\t= 0x813B\n\tTEXTURE_BASE_LEVEL\t\t\t\t= 0x813C\n\tTEXTURE_MAX_LEVEL\t\t\t\t= 0x813D\n\nSGIS_texture_lod enum:\n\tTEXTURE_MIN_LOD_SGIS\t\t\t\t= 0x813A\n\tTEXTURE_MAX_LOD_SGIS\t\t\t\t= 0x813B\n\tTEXTURE_BASE_LEVEL_SGIS\t\t\t\t= 0x813C\n\tTEXTURE_MAX_LEVEL_SGIS\t\t\t\t= 0x813D\n\n###############################################################################\n\nSGIX_pixel_tiles enum:\n\tPIXEL_TILE_BEST_ALIGNMENT_SGIX\t\t\t= 0x813E # 1 I\n\tPIXEL_TILE_CACHE_INCREMENT_SGIX\t\t\t= 0x813F # 1 I\n\tPIXEL_TILE_WIDTH_SGIX\t\t\t\t= 0x8140 # 1 I\n\tPIXEL_TILE_HEIGHT_SGIX\t\t\t\t= 0x8141 # 1 I\n\tPIXEL_TILE_GRID_WIDTH_SGIX\t\t\t= 0x8142 # 1 I\n\tPIXEL_TILE_GRID_HEIGHT_SGIX\t\t\t= 0x8143 # 1 I\n\tPIXEL_TILE_GRID_DEPTH_SGIX\t\t\t= 0x8144 # 1 I\n\tPIXEL_TILE_CACHE_SIZE_SGIX\t\t\t= 0x8145 # 1 I\n\n###############################################################################\n\nSGIS_texture_filter4 enum:\n\tFILTER4_SGIS\t\t\t\t\t= 0x8146\n\tTEXTURE_FILTER4_SIZE_SGIS\t\t\t= 0x8147\n\n###############################################################################\n\nSGIX_sprite enum:\n\tSPRITE_SGIX\t\t\t\t\t= 0x8148 # 1 I\n\tSPRITE_MODE_SGIX\t\t\t\t= 0x8149 # 1 I\n\tSPRITE_AXIS_SGIX\t\t\t\t= 0x814A # 3 F\n\tSPRITE_TRANSLATION_SGIX\t\t\t\t= 0x814B # 3 F\n\tSPRITE_AXIAL_SGIX\t\t\t\t= 0x814C\n\tSPRITE_OBJECT_ALIGNED_SGIX\t\t\t= 0x814D\n\tSPRITE_EYE_ALIGNED_SGIX\t\t\t\t= 0x814E\n\n###############################################################################\n\n# SGIS_texture4D (additional; see above): 0x814F\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tCONSTANT_BORDER\t\t\t\t\t= 0x8151\n#\tWRAP_BORDER\t\t\t\t\t= 0x8152   # Not actually used\n\tREPLICATE_BORDER\t\t\t\t= 0x8153\n\tCONVOLUTION_BORDER_COLOR\t\t\t= 0x8154\n\nHP_convolution_border_modes enum:\n\tIGNORE_BORDER_HP\t\t\t\t= 0x8150    # Not promoted\n\tCONSTANT_BORDER_HP\t\t\t\t= 0x8151\n\tREPLICATE_BORDER_HP\t\t\t\t= 0x8153\n\tCONVOLUTION_BORDER_COLOR_HP\t\t\t= 0x8154\n\n###############################################################################\n\n# HP: 0x8155-0x816F\n\n###############################################################################\n\nSGIX_clipmap enum:\n\tLINEAR_CLIPMAP_LINEAR_SGIX\t\t\t= 0x8170\n\tTEXTURE_CLIPMAP_CENTER_SGIX\t\t\t= 0x8171\n\tTEXTURE_CLIPMAP_FRAME_SGIX\t\t\t= 0x8172\n\tTEXTURE_CLIPMAP_OFFSET_SGIX\t\t\t= 0x8173\n\tTEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX\t\t= 0x8174\n\tTEXTURE_CLIPMAP_LOD_OFFSET_SGIX\t\t\t= 0x8175\n\tTEXTURE_CLIPMAP_DEPTH_SGIX\t\t\t= 0x8176\n\tMAX_CLIPMAP_DEPTH_SGIX\t\t\t\t= 0x8177 # 1 I\n\tMAX_CLIPMAP_VIRTUAL_DEPTH_SGIX\t\t\t= 0x8178 # 1 I\n\tNEAREST_CLIPMAP_NEAREST_SGIX\t\t\t= 0x844D\n\tNEAREST_CLIPMAP_LINEAR_SGIX\t\t\t= 0x844E\n\tLINEAR_CLIPMAP_NEAREST_SGIX\t\t\t= 0x844F\n\n###############################################################################\n\nSGIX_texture_scale_bias enum:\n\tPOST_TEXTURE_FILTER_BIAS_SGIX\t\t\t= 0x8179\n\tPOST_TEXTURE_FILTER_SCALE_SGIX\t\t\t= 0x817A\n\tPOST_TEXTURE_FILTER_BIAS_RANGE_SGIX\t\t= 0x817B # 2 F\n\tPOST_TEXTURE_FILTER_SCALE_RANGE_SGIX\t\t= 0x817C # 2 F\n\n###############################################################################\n\nSGIX_reference_plane enum:\n\tREFERENCE_PLANE_SGIX\t\t\t\t= 0x817D # 1 I\n\tREFERENCE_PLANE_EQUATION_SGIX\t\t\t= 0x817E # 4 F\n\n###############################################################################\n\nSGIX_ir_instrument1 enum:\n\tIR_INSTRUMENT1_SGIX\t\t\t\t= 0x817F # 1 I\n\n###############################################################################\n\nSGIX_instruments enum:\n\tINSTRUMENT_BUFFER_POINTER_SGIX\t\t\t= 0x8180\n\tINSTRUMENT_MEASUREMENTS_SGIX\t\t\t= 0x8181 # 1 I\n\n###############################################################################\n\nSGIX_list_priority enum:\n\tLIST_PRIORITY_SGIX\t\t\t\t= 0x8182\n\n###############################################################################\n\nSGIX_calligraphic_fragment enum:\n\tCALLIGRAPHIC_FRAGMENT_SGIX\t\t\t= 0x8183 # 1 I\n\n###############################################################################\n\nSGIX_impact_pixel_texture enum:\n\tPIXEL_TEX_GEN_Q_CEILING_SGIX\t\t\t= 0x8184\n\tPIXEL_TEX_GEN_Q_ROUND_SGIX\t\t\t= 0x8185\n\tPIXEL_TEX_GEN_Q_FLOOR_SGIX\t\t\t= 0x8186\n\tPIXEL_TEX_GEN_ALPHA_REPLACE_SGIX\t\t= 0x8187\n\tPIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX\t\t= 0x8188\n\tPIXEL_TEX_GEN_ALPHA_LS_SGIX\t\t\t= 0x8189\n\tPIXEL_TEX_GEN_ALPHA_MS_SGIX\t\t\t= 0x818A\n\n###############################################################################\n\nSGIX_framezoom enum:\n\tFRAMEZOOM_SGIX\t\t\t\t\t= 0x818B # 1 I\n\tFRAMEZOOM_FACTOR_SGIX\t\t\t\t= 0x818C # 1 I\n\tMAX_FRAMEZOOM_FACTOR_SGIX\t\t\t= 0x818D # 1 I\n\n###############################################################################\n\nSGIX_texture_lod_bias enum:\n\tTEXTURE_LOD_BIAS_S_SGIX\t\t\t\t= 0x818E\n\tTEXTURE_LOD_BIAS_T_SGIX\t\t\t\t= 0x818F\n\tTEXTURE_LOD_BIAS_R_SGIX\t\t\t\t= 0x8190\n\n###############################################################################\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tGENERATE_MIPMAP\t\t\t\t\t= 0x8191\n\tGENERATE_MIPMAP_HINT\t\t\t\t= 0x8192 # 1 I\n\nSGIS_generate_mipmap enum:\n\tGENERATE_MIPMAP_SGIS\t\t\t\t= 0x8191\n\tGENERATE_MIPMAP_HINT_SGIS\t\t\t= 0x8192 # 1 I\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_spotlight_cutoff: 0x8193\n#\tSPOT_CUTOFF_DELTA_SGIX\t\t\t\t= 0x8193\n\n###############################################################################\n\nSGIX_polynomial_ffd enum:\n\tGEOMETRY_DEFORMATION_SGIX\t\t\t= 0x8194\n\tTEXTURE_DEFORMATION_SGIX\t\t\t= 0x8195\n\tDEFORMATIONS_MASK_SGIX\t\t\t\t= 0x8196 # 1 I\n\tMAX_DEFORMATION_ORDER_SGIX\t\t\t= 0x8197\n\n###############################################################################\n\nSGIX_fog_offset enum:\n\tFOG_OFFSET_SGIX\t\t\t\t\t= 0x8198 # 1 I\n\tFOG_OFFSET_VALUE_SGIX\t\t\t\t= 0x8199 # 4 F\n\n###############################################################################\n\nSGIX_shadow enum:\n\tTEXTURE_COMPARE_SGIX\t\t\t\t= 0x819A\n\tTEXTURE_COMPARE_OPERATOR_SGIX\t\t\t= 0x819B\n\tTEXTURE_LEQUAL_R_SGIX\t\t\t\t= 0x819C\n\tTEXTURE_GEQUAL_R_SGIX\t\t\t\t= 0x819D\n\n###############################################################################\n\n# SGI private extension, not in enumext.spec\n# SGIX_igloo_interface: 0x819E-0x81A4\n#\tIGLOO_FULLSCREEN_SGIX\t\t\t\t= 0x819E\n#\tIGLOO_VIEWPORT_OFFSET_SGIX\t\t\t= 0x819F\n#\tIGLOO_SWAPTMESH_SGIX\t\t\t\t= 0x81A0\n#\tIGLOO_COLORNORMAL_SGIX\t\t\t\t= 0x81A1\n#\tIGLOO_IRISGL_MODE_SGIX\t\t\t\t= 0x81A2\n#\tIGLOO_LMC_COLOR_SGIX\t\t\t\t= 0x81A3\n#\tIGLOO_TMESHMODE_SGIX\t\t\t\t= 0x81A4\n\n###############################################################################\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tDEPTH_COMPONENT16\t\t\t\t= 0x81A5\n\tDEPTH_COMPONENT24\t\t\t\t= 0x81A6\n\tDEPTH_COMPONENT32\t\t\t\t= 0x81A7\n\nARB_depth_texture enum:\n\tDEPTH_COMPONENT16_ARB\t\t\t\t= 0x81A5\n\tDEPTH_COMPONENT24_ARB\t\t\t\t= 0x81A6\n\tDEPTH_COMPONENT32_ARB\t\t\t\t= 0x81A7\n\nSGIX_depth_texture enum:\n\tDEPTH_COMPONENT16_SGIX\t\t\t\t= 0x81A5\n\tDEPTH_COMPONENT24_SGIX\t\t\t\t= 0x81A6\n\tDEPTH_COMPONENT32_SGIX\t\t\t\t= 0x81A7\n\n# Aliases ARB_depth_texture enum above\nOES_framebuffer_object enum: (OpenGL ES only; additional; see below)\n\tDEPTH_COMPONENT16_OES\t\t\t\t= 0x81A5\n\n# Aliases ARB_depth_texture enum above\nOES_depth24 enum: (OpenGL ES only)\n\tDEPTH_COMPONENT24_OES\t\t\t\t= 0x81A6\n\n# Aliases ARB_depth_texture enum above\nOES_depth32 enum: (OpenGL ES only)\n\tDEPTH_COMPONENT32_OES\t\t\t\t= 0x81A7\n\n###############################################################################\n\nEXT_compiled_vertex_array enum:\n\tARRAY_ELEMENT_LOCK_FIRST_EXT\t\t\t= 0x81A8\n\tARRAY_ELEMENT_LOCK_COUNT_EXT\t\t\t= 0x81A9\n\n###############################################################################\n\nEXT_cull_vertex enum:\n\tCULL_VERTEX_EXT\t\t\t\t\t= 0x81AA\n\tCULL_VERTEX_EYE_POSITION_EXT\t\t\t= 0x81AB\n\tCULL_VERTEX_OBJECT_POSITION_EXT\t\t\t= 0x81AC\n\n###############################################################################\n\n# Promoted from SGI?\nEXT_index_array_formats enum:\n\tIUI_V2F_EXT\t\t\t\t\t= 0x81AD\n\tIUI_V3F_EXT\t\t\t\t\t= 0x81AE\n\tIUI_N3F_V2F_EXT\t\t\t\t\t= 0x81AF\n\tIUI_N3F_V3F_EXT\t\t\t\t\t= 0x81B0\n\tT2F_IUI_V2F_EXT\t\t\t\t\t= 0x81B1\n\tT2F_IUI_V3F_EXT\t\t\t\t\t= 0x81B2\n\tT2F_IUI_N3F_V2F_EXT\t\t\t\t= 0x81B3\n\tT2F_IUI_N3F_V3F_EXT\t\t\t\t= 0x81B4\n\n###############################################################################\n\n# Promoted from SGI?\nEXT_index_func enum:\n\tINDEX_TEST_EXT\t\t\t\t\t= 0x81B5\n\tINDEX_TEST_FUNC_EXT\t\t\t\t= 0x81B6\n\tINDEX_TEST_REF_EXT\t\t\t\t= 0x81B7\n\n###############################################################################\n\n# Promoted from SGI?\nEXT_index_material enum:\n\tINDEX_MATERIAL_EXT\t\t\t\t= 0x81B8\n\tINDEX_MATERIAL_PARAMETER_EXT\t\t\t= 0x81B9\n\tINDEX_MATERIAL_FACE_EXT\t\t\t\t= 0x81BA\n\n###############################################################################\n\nSGIX_ycrcb enum:\n\tYCRCB_422_SGIX\t\t\t\t\t= 0x81BB\n\tYCRCB_444_SGIX\t\t\t\t\t= 0x81BC\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGI_complex_type: 0x81BD-0x81C3\n#\tCOMPLEX_UNSIGNED_BYTE_SGI\t\t\t= 0x81BD\n#\tCOMPLEX_BYTE_SGI\t\t\t\t= 0x81BE\n#\tCOMPLEX_UNSIGNED_SHORT_SGI\t\t\t= 0x81BF\n#\tCOMPLEX_SHORT_SGI\t\t\t\t= 0x81C0\n#\tCOMPLEX_UNSIGNED_INT_SGI\t\t\t= 0x81C1\n#\tCOMPLEX_INT_SGI\t\t\t\t\t= 0x81C2\n#\tCOMPLEX_FLOAT_SGI\t\t\t\t= 0x81C3\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGI_fft: 0x81C4-0x81CA\n#\tPOST_TRANSFORM_RED_SCALE_SGI\t\t\t= ????\t # 1 F\n#\tPOST_TRANSFORM_GREEN_SCALE_SGI\t\t\t= ????\t # 1 F\n#\tPOST_TRANSFORM_BLUE_SCALE_SGI\t\t\t= ????\t # 1 F\n#\tPOST_TRANSFORM_ALPHA_SCALE_SGI\t\t\t= ????\t # 1 F\n#\tPOST_TRANSFORM_RED_BIAS_SGI\t\t\t= ????\t # 1 F\n#\tPOST_TRANSFORM_GREEN_BIAS_SGI\t\t\t= ????\t # 1 F\n#\tPOST_TRANSFORM_BLUE_BIAS_SGI\t\t\t= ????\t # 1 F\n#\tPOST_TRANSFORM_ALPHA_BIAS_SGI\t\t\t= ????\t # 1 F\n#\tPIXEL_TRANSFORM_OPERATOR_SGI\t\t\t= 0x81C4 # 1 I\n#\tCONVOLUTION_SGI\t\t\t\t\t= 0x81C5\n#\tFFT_1D_SGI\t\t\t\t\t= 0x81C6\n#\tPIXEL_TRANSFORM_SGI\t\t\t\t= 0x81C7\n#\tMAX_FFT_WIDTH_SGI\t\t\t\t= 0x81C8\n#\tSORT_SGI\t\t\t\t\t= 0x81C9\n#\tTRANSPOSE_SGI\t\t\t\t\t= 0x81CA\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_nurbs_eval: 0x81CB-0x81CF\n#\tMAP1_VERTEX_3_NURBS_SGIX\t\t\t= 0x81CB # 1 I\n#\tMAP1_VERTEX_4_NURBS_SGIX\t\t\t= 0x81CC # 1 I\n#\tMAP1_INDEX_NURBS_SGIX\t\t\t\t= 0x81CD # 1 I\n#\tMAP1_COLOR_4_NURBS_SGIX\t\t\t\t= 0x81CE # 1 I\n#\tMAP1_NORMAL_NURBS_SGIX\t\t\t\t= 0x81CF # 1 I\n#\tMAP1_TEXTURE_COORD_1_NURBS_SGIX\t\t\t= 0x81E0 # 1 I\n#\tMAP1_TEXTURE_COORD_2_NURBS_SGIX\t\t\t= 0x81E1 # 1 I\n#\tMAP1_TEXTURE_COORD_3_NURBS_SGIX\t\t\t= 0x81E2 # 1 I\n#\tMAP1_TEXTURE_COORD_4_NURBS_SGIX\t\t\t= 0x81E3 # 1 I\n#\tMAP2_VERTEX_3_NURBS_SGIX\t\t\t= 0x81E4 # 1 I\n#\tMAP2_VERTEX_4_NURBS_SGIX\t\t\t= 0x81E5 # 1 I\n#\tMAP2_INDEX_NURBS_SGIX\t\t\t\t= 0x81E6 # 1 I\n#\tMAP2_COLOR_4_NURBS_SGIX\t\t\t\t= 0x81E7 # 1 I\n#\tMAP2_NORMAL_NURBS_SGIX\t\t\t\t= 0x81E8 # 1 I\n#\tMAP2_TEXTURE_COORD_1_NURBS_SGIX\t\t\t= 0x81E9 # 1 I\n#\tMAP2_TEXTURE_COORD_2_NURBS_SGIX\t\t\t= 0x81EA # 1 I\n#\tMAP2_TEXTURE_COORD_3_NURBS_SGIX\t\t\t= 0x81EB # 1 I\n#\tMAP2_TEXTURE_COORD_4_NURBS_SGIX\t\t\t= 0x81EC # 1 I\n#\tNURBS_KNOT_COUNT_SGIX\t\t\t\t= 0x81ED\n#\tNURBS_KNOT_VECTOR_SGIX\t\t\t\t= 0x81EE\n\n###############################################################################\n\n# Sun: 0x81D0-0x81DF\n\n# No extension spec, not in enumext.spec\n# SUNX_surface_hint enum:\n#\t SURFACE_SIZE_HINT_SUNX\t\t\t\t= 0x81D2\n#\t LARGE_SUNX\t\t\t\t\t= 0x81D3\n\nSUNX_general_triangle_list enum:\n\t RESTART_SUN\t\t\t\t\t= 0x0001\n\t REPLACE_MIDDLE_SUN\t\t\t\t= 0x0002\n\t REPLACE_OLDEST_SUN\t\t\t\t= 0x0003\n\t WRAP_BORDER_SUN\t\t\t\t= 0x81D4\n\t TRIANGLE_LIST_SUN\t\t\t\t= 0x81D7\n\t REPLACEMENT_CODE_SUN\t\t\t\t= 0x81D8\n\nSUNX_constant_data enum:\n\t UNPACK_CONSTANT_DATA_SUNX\t\t\t= 0x81D5\n\t TEXTURE_CONSTANT_DATA_SUNX\t\t\t= 0x81D6\n\nSUN_global_alpha enum:\n\t GLOBAL_ALPHA_SUN\t\t\t\t= 0x81D9\n\t GLOBAL_ALPHA_FACTOR_SUN\t\t\t= 0x81DA\n\n###############################################################################\n\n# SGIX_nurbs_eval (additional; see above): 0x81E0-0x81EE\n\n###############################################################################\n\nSGIS_texture_color_mask enum:\n\tTEXTURE_COLOR_WRITEMASK_SGIS\t\t\t= 0x81EF\n\n###############################################################################\n\nSGIS_point_line_texgen enum:\n\tEYE_DISTANCE_TO_POINT_SGIS\t\t\t= 0x81F0\n\tOBJECT_DISTANCE_TO_POINT_SGIS\t\t\t= 0x81F1\n\tEYE_DISTANCE_TO_LINE_SGIS\t\t\t= 0x81F2\n\tOBJECT_DISTANCE_TO_LINE_SGIS\t\t\t= 0x81F3\n\tEYE_POINT_SGIS\t\t\t\t\t= 0x81F4\n\tOBJECT_POINT_SGIS\t\t\t\t= 0x81F5\n\tEYE_LINE_SGIS\t\t\t\t\t= 0x81F6\n\tOBJECT_LINE_SGIS\t\t\t\t= 0x81F7\n\n###############################################################################\n\nVERSION_1_2 enum: (Promoted for OpenGL 1.2)\n\tLIGHT_MODEL_COLOR_CONTROL\t\t\t= 0x81F8 # 1 I\n\tSINGLE_COLOR\t\t\t\t\t= 0x81F9\n\tSEPARATE_SPECULAR_COLOR\t\t\t\t= 0x81FA\n\nEXT_separate_specular_color enum:\n\tLIGHT_MODEL_COLOR_CONTROL_EXT\t\t\t= 0x81F8\n\tSINGLE_COLOR_EXT\t\t\t\t= 0x81F9\n\tSEPARATE_SPECULAR_COLOR_EXT\t\t\t= 0x81FA\n\n###############################################################################\n\nEXT_shared_texture_palette enum:\n\tSHARED_TEXTURE_PALETTE_EXT\t\t\t= 0x81FB # 1 I\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_fog_scale: 0x81FC-0x81FD\n#\tFOG_SCALE_SGIX\t\t\t\t\t= 0x81FC # 1 I\n#\tFOG_SCALE_VALUE_SGIX\t\t\t\t= 0x81FD # 1 F\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_fog_blend: 0x81FE-0x81FF\n#\tFOG_BLEND_ALPHA_SGIX\t\t\t\t= 0x81FE # 1 I\n#\tFOG_BLEND_COLOR_SGIX\t\t\t\t= 0x81FF # 1 I\n\n###############################################################################\n\n# ATI: 0x8200-0x820F (released by Microsoft 2002/9/16)\nATI_text_fragment_shader enum:\n\tTEXT_FRAGMENT_SHADER_ATI\t\t\t= 0x8200\n\n###############################################################################\n\n# OpenGL ARB: 0x8210-0x823F\n\nVERSION_3_0 enum:\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_RED_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_GREEN_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_BLUE_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_DEFAULT\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_UNDEFINED\n\tuse ARB_framebuffer_object\t    DEPTH_STENCIL_ATTACHMENT\n\nARB_framebuffer_object enum: (note: no ARB suffixes)\n\tFRAMEBUFFER_ATTACHMENT_COLOR_ENCODING\t\t= 0x8210    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE\t\t= 0x8211    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_RED_SIZE\t\t\t= 0x8212    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_GREEN_SIZE\t\t= 0x8213    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_BLUE_SIZE\t\t= 0x8214    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_ALPHA_SIZE\t\t= 0x8215    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_DEPTH_SIZE\t\t= 0x8216    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_STENCIL_SIZE\t\t= 0x8217    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_DEFAULT\t\t\t\t= 0x8218    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_UNDEFINED\t\t\t\t= 0x8219    # VERSION_3_0 / ARB_fbo\n\tDEPTH_STENCIL_ATTACHMENT\t\t\t= 0x821A    # VERSION_3_0 / ARB_fbo\n\nVERSION_3_0 enum:\n\tMAJOR_VERSION\t\t\t\t\t= 0x821B    # VERSION_3_0\n\tMINOR_VERSION\t\t\t\t\t= 0x821C    # VERSION_3_0\n\tNUM_EXTENSIONS\t\t\t\t\t= 0x821D    # VERSION_3_0\n\tCONTEXT_FLAGS\t\t\t\t\t= 0x821E    # VERSION_3_0\n\n# ARB_future_use: 0x821F-0x8221\n\nVERSION_3_0 enum:\n\tuse ARB_framebuffer_object\t    INDEX\n\nARB_framebuffer_object enum: (note: no ARB suffixes)\n\tINDEX\t\t\t\t\t\t= 0x8222    # VERSION_3_0 / ARB_fbo\n\nVERSION_3_0 enum:\n\tDEPTH_BUFFER\t\t\t\t\t= 0x8223    # VERSION_3_0\n\tSTENCIL_BUFFER\t\t\t\t\t= 0x8224    # VERSION_3_0\n\tCOMPRESSED_RED\t\t\t\t\t= 0x8225    # VERSION_3_0\n\tCOMPRESSED_RG\t\t\t\t\t= 0x8226    # VERSION_3_0\n\nVERSION_3_0 enum:\n\tuse ARB_texture_rg\t\t    RG\n\tuse ARB_texture_rg\t\t    RG_INTEGER\n\tuse ARB_texture_rg\t\t    R8\n\tuse ARB_texture_rg\t\t    R16\n\tuse ARB_texture_rg\t\t    RG8\n\tuse ARB_texture_rg\t\t    RG16\n\tuse ARB_texture_rg\t\t    R16F\n\tuse ARB_texture_rg\t\t    R32F\n\tuse ARB_texture_rg\t\t    RG16F\n\tuse ARB_texture_rg\t\t    RG32F\n\tuse ARB_texture_rg\t\t    R8I\n\tuse ARB_texture_rg\t\t    R8UI\n\tuse ARB_texture_rg\t\t    R16I\n\tuse ARB_texture_rg\t\t    R16UI\n\tuse ARB_texture_rg\t\t    R32I\n\tuse ARB_texture_rg\t\t    R32UI\n\tuse ARB_texture_rg\t\t    RG8I\n\tuse ARB_texture_rg\t\t    RG8UI\n\tuse ARB_texture_rg\t\t    RG16I\n\tuse ARB_texture_rg\t\t    RG16UI\n\tuse ARB_texture_rg\t\t    RG32I\n\tuse ARB_texture_rg\t\t    RG32UI\n\nARB_texture_rg enum: (note: no ARB suffixes)\n\tRG\t\t\t\t\t\t= 0x8227    # VERSION_3_0 / ARB_trg\n\tRG_INTEGER\t\t\t\t\t= 0x8228    # VERSION_3_0 / ARB_trg\n\tR8\t\t\t\t\t\t= 0x8229    # VERSION_3_0 / ARB_trg\n\tR16\t\t\t\t\t\t= 0x822A    # VERSION_3_0 / ARB_trg\n\tRG8\t\t\t\t\t\t= 0x822B    # VERSION_3_0 / ARB_trg\n\tRG16\t\t\t\t\t\t= 0x822C    # VERSION_3_0 / ARB_trg\n\tR16F\t\t\t\t\t\t= 0x822D    # VERSION_3_0 / ARB_trg\n\tR32F\t\t\t\t\t\t= 0x822E    # VERSION_3_0 / ARB_trg\n\tRG16F\t\t\t\t\t\t= 0x822F    # VERSION_3_0 / ARB_trg\n\tRG32F\t\t\t\t\t\t= 0x8230    # VERSION_3_0 / ARB_trg\n\tR8I\t\t\t\t\t\t= 0x8231    # VERSION_3_0 / ARB_trg\n\tR8UI\t\t\t\t\t\t= 0x8232    # VERSION_3_0 / ARB_trg\n\tR16I\t\t\t\t\t\t= 0x8233    # VERSION_3_0 / ARB_trg\n\tR16UI\t\t\t\t\t\t= 0x8234    # VERSION_3_0 / ARB_trg\n\tR32I\t\t\t\t\t\t= 0x8235    # VERSION_3_0 / ARB_trg\n\tR32UI\t\t\t\t\t\t= 0x8236    # VERSION_3_0 / ARB_trg\n\tRG8I\t\t\t\t\t\t= 0x8237    # VERSION_3_0 / ARB_trg\n\tRG8UI\t\t\t\t\t\t= 0x8238    # VERSION_3_0 / ARB_trg\n\tRG16I\t\t\t\t\t\t= 0x8239    # VERSION_3_0 / ARB_trg\n\tRG16UI\t\t\t\t\t\t= 0x823A    # VERSION_3_0 / ARB_trg\n\tRG32I\t\t\t\t\t\t= 0x823B    # VERSION_3_0 / ARB_trg\n\tRG32UI\t\t\t\t\t\t= 0x823C    # VERSION_3_0 / ARB_trg\n\n# ARB_future_use: 0x823D-0x823F\n\n###############################################################################\n\n# @@@ Any_vendor_future_use: 0x8240-0x82AF (released by Microsoft 2002/9/16)\n\n###############################################################################\n\n# ADD: 0x82B0-0x830F\n\n###############################################################################\n\nSGIX_depth_pass_instrument enum: 0x8310-0x8312\n\tDEPTH_PASS_INSTRUMENT_SGIX\t\t\t= 0x8310\n\tDEPTH_PASS_INSTRUMENT_COUNTERS_SGIX\t\t= 0x8311\n\tDEPTH_PASS_INSTRUMENT_MAX_SGIX\t\t\t= 0x8312\n\n###############################################################################\n\nSGIX_fragments_instrument enum: 0x8313-0x8315\n\tFRAGMENTS_INSTRUMENT_SGIX\t\t\t= 0x8313 # 1 I\n\tFRAGMENTS_INSTRUMENT_COUNTERS_SGIX\t\t= 0x8314 # 1 I\n\tFRAGMENTS_INSTRUMENT_MAX_SGIX\t\t\t= 0x8315 # 1 I\n\n###############################################################################\n\nSGIX_convolution_accuracy enum:\n\tCONVOLUTION_HINT_SGIX\t\t\t\t= 0x8316 # 1 I\n\n###############################################################################\n\n# SGIX_color_matrix_accuracy: 0x8317\n\n###############################################################################\n\n# 0x8318-0x8319\nSGIX_ycrcba enum:\n\tYCRCB_SGIX\t\t\t\t\t= 0x8318\n\tYCRCBA_SGIX\t\t\t\t\t= 0x8319\n\n###############################################################################\n\n# 0x831A-0x831F\nSGIX_slim enum:\n\tUNPACK_COMPRESSED_SIZE_SGIX\t\t\t= 0x831A\n\tPACK_MAX_COMPRESSED_SIZE_SGIX\t\t\t= 0x831B\n\tPACK_COMPRESSED_SIZE_SGIX\t\t\t= 0x831C\n\tSLIM8U_SGIX\t\t\t\t\t= 0x831D\n\tSLIM10U_SGIX\t\t\t\t\t= 0x831E\n\tSLIM12S_SGIX\t\t\t\t\t= 0x831F\n\n###############################################################################\n\nSGIX_blend_alpha_minmax enum:\n\tALPHA_MIN_SGIX\t\t\t\t\t= 0x8320\n\tALPHA_MAX_SGIX\t\t\t\t\t= 0x8321\n\n###############################################################################\n\nSGIX_scalebias_hint enum:\n\tSCALEBIAS_HINT_SGIX\t\t\t\t= 0x8322\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_fog_layers: 0x8323-0x8328\n#\tFOG_TYPE_SGIX\t\t\t\t\t= 0x8323 # 1 I\n#\tUNIFORM_SGIX\t\t\t\t\t= 0x8324\n#\tLAYERED_SGIX\t\t\t\t\t= 0x8325\n#\tFOG_GROUND_PLANE_SGIX\t\t\t\t= 0x8326 # 4 F\n#\tFOG_LAYERS_POINTS_SGIX\t\t\t\t= 0x8327 # 1 I\n#\tMAX_FOG_LAYERS_POINTS_SGIX\t\t\t= 0x8328 # 1 I\n\n###############################################################################\n\nSGIX_async enum:\n\tASYNC_MARKER_SGIX\t\t\t\t= 0x8329\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_texture_phase: 0x832A\n#\tPHASE_SGIX\t\t\t\t\t= 0x832A\n\n###############################################################################\n\n# SGIX_pixel_texture (additional; see above): 0x832B\n\n###############################################################################\n\nSGIX_async_histogram enum:\n\tASYNC_HISTOGRAM_SGIX\t\t\t\t= 0x832C\n\tMAX_ASYNC_HISTOGRAM_SGIX\t\t\t= 0x832D\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_texture_mipmap_anisotropic: 0x832E-0x832F\n#\tTEXTURE_MIPMAP_ANISOTROPY_SGIX\t\t\t= 0x832E\n#\tMAX_MIPMAP_ANISOTROPY_SGIX\t\t\t= 0x832F # 1 I\n\n###############################################################################\n\nEXT_pixel_transform enum:\n\tPIXEL_TRANSFORM_2D_EXT\t\t\t\t= 0x8330\n\tPIXEL_MAG_FILTER_EXT\t\t\t\t= 0x8331\n\tPIXEL_MIN_FILTER_EXT\t\t\t\t= 0x8332\n\tPIXEL_CUBIC_WEIGHT_EXT\t\t\t\t= 0x8333\n\tCUBIC_EXT\t\t\t\t\t= 0x8334\n\tAVERAGE_EXT\t\t\t\t\t= 0x8335\n\tPIXEL_TRANSFORM_2D_STACK_DEPTH_EXT\t\t= 0x8336\n\tMAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT\t\t= 0x8337\n\tPIXEL_TRANSFORM_2D_MATRIX_EXT\t\t\t= 0x8338\n\n# SUN_future_use: 0x8339-0x833F\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_cube_map: 0x8340-0x8348\n#\tENV_MAP_SGIX\t\t\t\t\t= 0x8340\n#\tCUBE_MAP_SGIX\t\t\t\t\t= 0x8341\n#\tCUBE_MAP_ZP_SGIX\t\t\t\t= 0x8342\n#\tCUBE_MAP_ZN_SGIX\t\t\t\t= 0x8343\n#\tCUBE_MAP_XN_SGIX\t\t\t\t= 0x8344\n#\tCUBE_MAP_XP_SGIX\t\t\t\t= 0x8345\n#\tCUBE_MAP_YN_SGIX\t\t\t\t= 0x8346\n#\tCUBE_MAP_YP_SGIX\t\t\t\t= 0x8347\n#\tCUBE_MAP_BINDING_SGIX\t\t\t\t= 0x8348 # 1 I\n\n###############################################################################\n\n# Unfortunately, there was a collision promoting to EXT from SGIX.\n# Use fog_coord's value of 0x8452 instead of the previously\n#   assigned FRAGMENT_DEPTH_EXT -> 0x834B.\n# EXT_light_texture: 0x8349-0x8352\nEXT_light_texture enum: 0x8349-0x8352\n\tFRAGMENT_MATERIAL_EXT\t\t\t\t= 0x8349\n\tFRAGMENT_NORMAL_EXT\t\t\t\t= 0x834A\n\tFRAGMENT_COLOR_EXT\t\t\t\t= 0x834C\n\tATTENUATION_EXT\t\t\t\t\t= 0x834D\n\tSHADOW_ATTENUATION_EXT\t\t\t\t= 0x834E\n\tTEXTURE_APPLICATION_MODE_EXT\t\t\t= 0x834F # 1 I\n\tTEXTURE_LIGHT_EXT\t\t\t\t= 0x8350 # 1 I\n\tTEXTURE_MATERIAL_FACE_EXT\t\t\t= 0x8351 # 1 I\n\tTEXTURE_MATERIAL_PARAMETER_EXT\t\t\t= 0x8352 # 1 I\n\tuse EXT_fog_coord FRAGMENT_DEPTH_EXT\n\n###############################################################################\n\nSGIS_pixel_texture enum:\n\tPIXEL_TEXTURE_SGIS\t\t\t\t= 0x8353 # 1 I\n\tPIXEL_FRAGMENT_RGB_SOURCE_SGIS\t\t\t= 0x8354 # 1 I\n\tPIXEL_FRAGMENT_ALPHA_SOURCE_SGIS\t\t= 0x8355 # 1 I\n\tPIXEL_GROUP_COLOR_SGIS\t\t\t\t= 0x8356 # 1 I\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_pixel_texture_bits: 0x8357-0x8359\n#\tCOLOR_TO_TEXTURE_COORD_SGIX\t\t\t= 0x8357\n#\tCOLOR_BIT_PATTERN_SGIX\t\t\t\t= 0x8358\n#\tCOLOR_VALUE_SGIX\t\t\t\t= 0x8359\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_pixel_texture_lod: 0x835A\n#\tPIXEL_TEX_GEN_LAMBDA_SOURCE_SGIX\t\t= 0x835A\n\n###############################################################################\n\nSGIX_line_quality_hint enum:\n\tLINE_QUALITY_HINT_SGIX\t\t\t\t= 0x835B\n\n###############################################################################\n\nSGIX_async_pixel enum:\n\tASYNC_TEX_IMAGE_SGIX\t\t\t\t= 0x835C\n\tASYNC_DRAW_PIXELS_SGIX\t\t\t\t= 0x835D\n\tASYNC_READ_PIXELS_SGIX\t\t\t\t= 0x835E\n\tMAX_ASYNC_TEX_IMAGE_SGIX\t\t\t= 0x835F\n\tMAX_ASYNC_DRAW_PIXELS_SGIX\t\t\t= 0x8360\n\tMAX_ASYNC_READ_PIXELS_SGIX\t\t\t= 0x8361\n\n###############################################################################\n\n# EXT_packed_pixels (additional; see above): 0x8362-0x8368\n\n###############################################################################\n\nSGIX_texture_coordinate_clamp enum:\n\tTEXTURE_MAX_CLAMP_S_SGIX\t\t\t= 0x8369\n\tTEXTURE_MAX_CLAMP_T_SGIX\t\t\t= 0x836A\n\tTEXTURE_MAX_CLAMP_R_SGIX\t\t\t= 0x836B\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_fog_texture: 0x836C-0x836E\n#\tFRAGMENT_FOG_SGIX\t\t\t\t= 0x836C\n#\tTEXTURE_FOG_SGIX\t\t\t\t= 0x836D # 1 I\n#\tFOG_PATCHY_FACTOR_SGIX\t\t\t\t= 0x836E\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_fog_factor_to_alpha: 0x836F\n\tFOG_FACTOR_TO_ALPHA_SGIX\t\t\t= 0x836F\n\n###############################################################################\n\n# HP: 0x8370-0x837F\n# NOTE: IBM is using values in this range, because of a bobble\n# when Pat Brown left at the same time as I assigned them the\n# next range and their registry became inconsistent. Unknown\n# whether HP has any conflicts as they have never reported using\n# any values in this range.\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tMIRRORED_REPEAT\t\t\t\t\t= 0x8370\n\nARB_texture_mirrored_repeat enum:\n\tMIRRORED_REPEAT_ARB\t\t\t\t= 0x8370\n\nIBM_texture_mirrored_repeat enum:\n\tMIRRORED_REPEAT_IBM\t\t\t\t= 0x8370\n\n# Aliases ARB_texture_mirrored_repeat enum above\nOES_texture_mirrored_repeat enum: (OpenGL ES only)\n\tMIRRORED_REPEAT_OES\t\t\t\t= 0x8370\n\n###############################################################################\n\n# IBM: 0x8380-0x839F\n\n###############################################################################\n\n# S3: 0x83A0-0x83BF\n\nS3_s3tc enum:\n\tRGB_S3TC\t\t\t\t\t= 0x83A0\n\tRGB4_S3TC\t\t\t\t\t= 0x83A1\n\tRGBA_S3TC\t\t\t\t\t= 0x83A2\n\tRGBA4_S3TC\t\t\t\t\t= 0x83A3\n\n# S3_future_use: 0x83A4-0x83BF\n\n###############################################################################\n\n# Obsolete extension, never to be put in enumext.spec\n# SGIS_multitexture: 0x83C0-0x83E5\n#\tSELECTED_TEXTURE_SGIS\t\t\t\t= 0x83C0 # 1 I\n#\tSELECTED_TEXTURE_COORD_SET_SGIS\t\t\t= 0x83C1 # 1 I\n#\tSELECTED_TEXTURE_TRANSFORM_SGIS\t\t\t= 0x83C2 # 1 I\n#\tMAX_TEXTURES_SGIS\t\t\t\t= 0x83C3 # 1 I\n#\tMAX_TEXTURE_COORD_SETS_SGIS\t\t\t= 0x83C4 # 1 I\n#\tTEXTURE_COORD_SET_INTERLEAVE_FACTOR_SGIS\t= 0x83C5 # 1 I\n#\tTEXTURE_ENV_COORD_SET_SGIS\t\t\t= 0x83C6\n#\tTEXTURE0_SGIS\t\t\t\t\t= 0x83C7\n#\tTEXTURE1_SGIS\t\t\t\t\t= 0x83C8\n#\tTEXTURE2_SGIS\t\t\t\t\t= 0x83C9\n#\tTEXTURE3_SGIS\t\t\t\t\t= 0x83CA\n#\n# SGIS_multitexture_future_use: 0x83CB-0x83E5\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_bali_g_instruments: 0x83E6-0x83E9\n#\tBALI_NUM_TRIS_CULLED_INSTRUMENT_SGIX\t\t= 0x83E6 # 1 I\n#\tBALI_NUM_PRIMS_CLIPPED_INSTRUMENT_SGIX\t\t= 0x83E7 # 1 I\n#\tBALI_NUM_PRIMS_REJECT_INSTRUMENT_SGIX\t\t= 0x83E8 # 1 I\n#\tBALI_NUM_PRIMS_CLIP_RESULT_INSTRUMENT_SGIX\t= 0x83E9 # 1 I\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_bali_r_instruments: 0x83EA-0x83EC\n#\tBALI_FRAGMENTS_GENERATED_INSTRUMENT_SGIX\t= 0x83EA # 1 I\n#\tBALI_DEPTH_PASS_INSTRUMENT_SGIX\t\t\t= 0x83EB # 1 I\n#\tBALI_R_CHIP_COUNT_SGIX\t\t\t\t= 0x83EC # 1 I\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_occlusion_instrument: 0x83ED\n#\tOCCLUSION_INSTRUMENT_SGIX\t\t\t= 0x83ED # 1 I\n\n###############################################################################\n\nSGIX_vertex_preclip enum:\n\tVERTEX_PRECLIP_SGIX\t\t\t\t= 0x83EE\n\tVERTEX_PRECLIP_HINT_SGIX\t\t\t= 0x83EF\n\n###############################################################################\n\n# INTEL: 0x83F0-0x83FF\n# Note that this block was reclaimed from NTP, who never shipped it,\n#   and reassigned to Intel.\n\nEXT_texture_compression_s3tc enum:\n\tCOMPRESSED_RGB_S3TC_DXT1_EXT\t\t\t= 0x83F0\n\tCOMPRESSED_RGBA_S3TC_DXT1_EXT\t\t\t= 0x83F1\n\tCOMPRESSED_RGBA_S3TC_DXT3_EXT\t\t\t= 0x83F2\n\tCOMPRESSED_RGBA_S3TC_DXT5_EXT\t\t\t= 0x83F3\n\nINTEL_parallel_arrays enum:\n\tPARALLEL_ARRAYS_INTEL\t\t\t\t= 0x83F4\n\tVERTEX_ARRAY_PARALLEL_POINTERS_INTEL\t\t= 0x83F5\n\tNORMAL_ARRAY_PARALLEL_POINTERS_INTEL\t\t= 0x83F6\n\tCOLOR_ARRAY_PARALLEL_POINTERS_INTEL\t\t= 0x83F7\n\tTEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL\t= 0x83F8\n\n# INTEL_future_use: 0x83F9-0x83FF\n\n###############################################################################\n\nSGIX_fragment_lighting enum:\n\tFRAGMENT_LIGHTING_SGIX\t\t\t\t= 0x8400 # 1 I\n\tFRAGMENT_COLOR_MATERIAL_SGIX\t\t\t= 0x8401 # 1 I\n\tFRAGMENT_COLOR_MATERIAL_FACE_SGIX\t\t= 0x8402 # 1 I\n\tFRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX\t\t= 0x8403 # 1 I\n\tMAX_FRAGMENT_LIGHTS_SGIX\t\t\t= 0x8404 # 1 I\n\tMAX_ACTIVE_LIGHTS_SGIX\t\t\t\t= 0x8405 # 1 I\n\tCURRENT_RASTER_NORMAL_SGIX\t\t\t= 0x8406 # 1 I\n\tLIGHT_ENV_MODE_SGIX\t\t\t\t= 0x8407 # 1 I\n\tFRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX\t\t= 0x8408 # 1 I\n\tFRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX\t\t= 0x8409 # 1 I\n\tFRAGMENT_LIGHT_MODEL_AMBIENT_SGIX\t\t= 0x840A # 4 F\n\tFRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX\t= 0x840B # 1 I\n\tFRAGMENT_LIGHT0_SGIX\t\t\t\t= 0x840C # 1 I\n\tFRAGMENT_LIGHT1_SGIX\t\t\t\t= 0x840D\n\tFRAGMENT_LIGHT2_SGIX\t\t\t\t= 0x840E\n\tFRAGMENT_LIGHT3_SGIX\t\t\t\t= 0x840F\n\tFRAGMENT_LIGHT4_SGIX\t\t\t\t= 0x8410\n\tFRAGMENT_LIGHT5_SGIX\t\t\t\t= 0x8411\n\tFRAGMENT_LIGHT6_SGIX\t\t\t\t= 0x8412\n\tFRAGMENT_LIGHT7_SGIX\t\t\t\t= 0x8413\n\n# SGIX_fragment_lighting_future_use: 0x8414-0x842B\n\n###############################################################################\n\nSGIX_resample enum:\n\tPACK_RESAMPLE_SGIX\t\t\t\t= 0x842C\n\tUNPACK_RESAMPLE_SGIX\t\t\t\t= 0x842D\n\tRESAMPLE_REPLICATE_SGIX\t\t\t\t= 0x842E\n\tRESAMPLE_ZERO_FILL_SGIX\t\t\t\t= 0x842F\n\tRESAMPLE_DECIMATE_SGIX\t\t\t\t= 0x8430\n\n# SGIX_resample_future_use: 0x8431-0x8435\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_fragment_lighting_space: 0x8436-0x8449\n#\tEYE_SPACE_SGIX\t\t\t\t\t= 0x8436\n#\tTANGENT_SPACE_SGIX\t\t\t\t= 0x8437\n#\tOBJECT_SPACE_SGIX\t\t\t\t= 0x8438\n#\tTANGENT_ARRAY_SGIX\t\t\t\t= 0x8439\n#\tBINORMAL_ARRAY_SGIX\t\t\t\t= 0x843A\n#\tCURRENT_TANGENT_SGIX\t\t\t\t= 0x843B # 3 F\n#\tCURRENT_BINORMAL_SGIX\t\t\t\t= 0x843C # 3 F\n#\tFRAGMENT_LIGHT_SPACE_SGIX\t\t\t= 0x843D # 1 I\n#\tTANGENT_ARRAY_TYPE_SGIX\t\t\t\t= 0x843E\n#\tTANGENT_ARRAY_STRIDE_SGIX\t\t\t= 0x843F\n#\tTANGENT_ARRAY_COUNT_SGIX\t\t\t= 0x8440\n#\tBINORMAL_ARRAY_TYPE_SGIX\t\t\t= 0x8441\n#\tBINORMAL_ARRAY_STRIDE_SGIX\t\t\t= 0x8442\n#\tBINORMAL_ARRAY_COUNT_SGIX\t\t\t= 0x8443\n#\tTANGENT_ARRAY_POINTER_SGIX\t\t\t= 0x8444\n#\tBINORMAL_ARRAY_POINTER_SGIX\t\t\t= 0x8445\n#\tMAP1_TANGENT_SGIX\t\t\t\t= 0x8446\n#\tMAP2_TANGENT_SGIX\t\t\t\t= 0x8447\n#\tMAP1_BINORMAL_SGIX\t\t\t\t= 0x8448\n#\tMAP2_BINORMAL_SGIX\t\t\t\t= 0x8449\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_bali_timer_instruments: 0x844A-0x844C\n#\tBALI_GEOM_TIMER_INSTRUMENT_SGIX\t\t\t= 0x844A # 1 I\n#\tBALI_RASTER_TIMER_INSTRUMENT_SGIX\t\t= 0x844B # 1 I\n#\tBALI_INSTRUMENT_TIME_UNIT_SGIX\t\t\t= 0x844C # 1 I\n\n###############################################################################\n\n# SGIX_clipmap (additional; see above): 0x844D-0x844F\n\n###############################################################################\n\n# SGI (actually brokered for Id Software): 0x8450-0x845F\n\nVERSION_1_5 enum: (Consistent naming scheme for OpenGL 1.5)\n\tFOG_COORD_SRC\t\t\t\t\t= 0x8450    # alias GL_FOG_COORDINATE_SOURCE\n\tFOG_COORD\t\t\t\t\t= 0x8451    # alias GL_FOG_COORDINATE\n\tCURRENT_FOG_COORD\t\t\t\t= 0x8453    # alias GL_CURRENT_FOG_COORDINATE\n\tFOG_COORD_ARRAY_TYPE\t\t\t\t= 0x8454    # alias GL_FOG_COORDINATE_ARRAY_TYPE\n\tFOG_COORD_ARRAY_STRIDE\t\t\t\t= 0x8455    # alias GL_FOG_COORDINATE_ARRAY_STRIDE\n\tFOG_COORD_ARRAY_POINTER\t\t\t\t= 0x8456    # alias GL_FOG_COORDINATE_ARRAY_POINTER\n\tFOG_COORD_ARRAY\t\t\t\t\t= 0x8457    # alias GL_FOG_COORDINATE_ARRAY\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tFOG_COORDINATE_SOURCE\t\t\t\t= 0x8450 # 1 I\n\tFOG_COORDINATE\t\t\t\t\t= 0x8451\n\tFRAGMENT_DEPTH\t\t\t\t\t= 0x8452\n\tCURRENT_FOG_COORDINATE\t\t\t\t= 0x8453 # 1 F\n\tFOG_COORDINATE_ARRAY_TYPE\t\t\t= 0x8454 # 1 I\n\tFOG_COORDINATE_ARRAY_STRIDE\t\t\t= 0x8455 # 1 I\n\tFOG_COORDINATE_ARRAY_POINTER\t\t\t= 0x8456\n\tFOG_COORDINATE_ARRAY\t\t\t\t= 0x8457 # 1 I\n\nEXT_fog_coord enum:\n\tFOG_COORDINATE_SOURCE_EXT\t\t\t= 0x8450 # 1 I\n\tFOG_COORDINATE_EXT\t\t\t\t= 0x8451\n\tFRAGMENT_DEPTH_EXT\t\t\t\t= 0x8452\n\tCURRENT_FOG_COORDINATE_EXT\t\t\t= 0x8453 # 1 F\n\tFOG_COORDINATE_ARRAY_TYPE_EXT\t\t\t= 0x8454 # 1 I\n\tFOG_COORDINATE_ARRAY_STRIDE_EXT\t\t\t= 0x8455 # 1 I\n\tFOG_COORDINATE_ARRAY_POINTER_EXT\t\t= 0x8456\n\tFOG_COORDINATE_ARRAY_EXT\t\t\t= 0x8457 # 1 I\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tCOLOR_SUM\t\t\t\t\t= 0x8458 # 1 I\n\tCURRENT_SECONDARY_COLOR\t\t\t\t= 0x8459 # 3 F\n\tSECONDARY_COLOR_ARRAY_SIZE\t\t\t= 0x845A # 1 I\n\tSECONDARY_COLOR_ARRAY_TYPE\t\t\t= 0x845B # 1 I\n\tSECONDARY_COLOR_ARRAY_STRIDE\t\t\t= 0x845C # 1 I\n\tSECONDARY_COLOR_ARRAY_POINTER\t\t\t= 0x845D\n\tSECONDARY_COLOR_ARRAY\t\t\t\t= 0x845E # 1 I\n\nEXT_secondary_color enum:\n\tCOLOR_SUM_EXT\t\t\t\t\t= 0x8458 # 1 I\n\tCURRENT_SECONDARY_COLOR_EXT\t\t\t= 0x8459 # 3 F\n\tSECONDARY_COLOR_ARRAY_SIZE_EXT\t\t\t= 0x845A # 1 I\n\tSECONDARY_COLOR_ARRAY_TYPE_EXT\t\t\t= 0x845B # 1 I\n\tSECONDARY_COLOR_ARRAY_STRIDE_EXT\t\t= 0x845C # 1 I\n\tSECONDARY_COLOR_ARRAY_POINTER_EXT\t\t= 0x845D\n\tSECONDARY_COLOR_ARRAY_EXT\t\t\t= 0x845E # 1 I\n\nARB_vertex_program enum:\n\tCOLOR_SUM_ARB\t\t\t\t\t= 0x8458 # 1 I\t# ARB_vertex_program\n\nVERSION_2_1 enum:\n\tCURRENT_RASTER_SECONDARY_COLOR\t\t\t= 0x845F\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\nSGIX_icc_texture enum:\n#\tRGB_ICC_SGIX\t\t\t\t\t= 0x8460\n#\tRGBA_ICC_SGIX\t\t\t\t\t= 0x8461\n#\tALPHA_ICC_SGIX\t\t\t\t\t= 0x8462\n#\tLUMINANCE_ICC_SGIX\t\t\t\t= 0x8463\n#\tINTENSITY_ICC_SGIX\t\t\t\t= 0x8464\n#\tLUMINANCE_ALPHA_ICC_SGIX\t\t\t= 0x8465\n#\tR5_G6_B5_ICC_SGIX\t\t\t\t= 0x8466\n#\tR5_G6_B5_A8_ICC_SGIX\t\t\t\t= 0x8467\n#\tALPHA16_ICC_SGIX\t\t\t\t= 0x8468\n#\tLUMINANCE16_ICC_SGIX\t\t\t\t= 0x8469\n#\tINTENSITY16_ICC_SGIX\t\t\t\t= 0x846A\n#\tLUMINANCE16_ALPHA8_ICC_SGIX\t\t\t= 0x846B\n\n###############################################################################\n\n# SGI_future_use: 0x846C\n\n###############################################################################\n\n# SMOOTH_* enums are new names for pre-1.2 enums.\nVERSION_1_2 enum:\n\tSMOOTH_POINT_SIZE_RANGE\t\t\t\t= 0x0B12 # 2 F\n\tSMOOTH_POINT_SIZE_GRANULARITY\t\t\t= 0x0B13 # 1 F\n\tSMOOTH_LINE_WIDTH_RANGE\t\t\t\t= 0x0B22 # 2 F\n\tSMOOTH_LINE_WIDTH_GRANULARITY\t\t\t= 0x0B23 # 1 F\n\tALIASED_POINT_SIZE_RANGE\t\t\t= 0x846D # 2 F\n\tALIASED_LINE_WIDTH_RANGE\t\t\t= 0x846E # 2 F\n\n###############################################################################\n\n# SGI_future_use: 0x846F\n\n###############################################################################\n\n# ATI Technologies (vendor multitexture, spec not yet released): 0x8470-0x848F\n\n###############################################################################\n\n# REND (Rendition): 0x8490-0x849F\n\nREND_screen_coordinates enum:\n\tSCREEN_COORDINATES_REND\t\t\t\t= 0x8490\n\tINVERTED_SCREEN_W_REND\t\t\t\t= 0x8491\n\n###############################################################################\n\n# ATI Technologies (vendor multitexture, spec not yet released): 0x84A0-84BF\n\n###############################################################################\n\n# OpenGL ARB: 0x84C0-0x84EF\n\nVERSION_1_3 enum: (Promoted for OpenGL 1.3)\n\tTEXTURE0\t\t\t\t\t= 0x84C0\n\tTEXTURE1\t\t\t\t\t= 0x84C1\n\tTEXTURE2\t\t\t\t\t= 0x84C2\n\tTEXTURE3\t\t\t\t\t= 0x84C3\n\tTEXTURE4\t\t\t\t\t= 0x84C4\n\tTEXTURE5\t\t\t\t\t= 0x84C5\n\tTEXTURE6\t\t\t\t\t= 0x84C6\n\tTEXTURE7\t\t\t\t\t= 0x84C7\n\tTEXTURE8\t\t\t\t\t= 0x84C8\n\tTEXTURE9\t\t\t\t\t= 0x84C9\n\tTEXTURE10\t\t\t\t\t= 0x84CA\n\tTEXTURE11\t\t\t\t\t= 0x84CB\n\tTEXTURE12\t\t\t\t\t= 0x84CC\n\tTEXTURE13\t\t\t\t\t= 0x84CD\n\tTEXTURE14\t\t\t\t\t= 0x84CE\n\tTEXTURE15\t\t\t\t\t= 0x84CF\n\tTEXTURE16\t\t\t\t\t= 0x84D0\n\tTEXTURE17\t\t\t\t\t= 0x84D1\n\tTEXTURE18\t\t\t\t\t= 0x84D2\n\tTEXTURE19\t\t\t\t\t= 0x84D3\n\tTEXTURE20\t\t\t\t\t= 0x84D4\n\tTEXTURE21\t\t\t\t\t= 0x84D5\n\tTEXTURE22\t\t\t\t\t= 0x84D6\n\tTEXTURE23\t\t\t\t\t= 0x84D7\n\tTEXTURE24\t\t\t\t\t= 0x84D8\n\tTEXTURE25\t\t\t\t\t= 0x84D9\n\tTEXTURE26\t\t\t\t\t= 0x84DA\n\tTEXTURE27\t\t\t\t\t= 0x84DB\n\tTEXTURE28\t\t\t\t\t= 0x84DC\n\tTEXTURE29\t\t\t\t\t= 0x84DD\n\tTEXTURE30\t\t\t\t\t= 0x84DE\n\tTEXTURE31\t\t\t\t\t= 0x84DF\n\tACTIVE_TEXTURE\t\t\t\t\t= 0x84E0 # 1 I\n\tCLIENT_ACTIVE_TEXTURE\t\t\t\t= 0x84E1 # 1 I\n\tMAX_TEXTURE_UNITS\t\t\t\t= 0x84E2 # 1 I\n\nARB_multitexture enum:\n\tTEXTURE0_ARB\t\t\t\t\t= 0x84C0\n\tTEXTURE1_ARB\t\t\t\t\t= 0x84C1\n\tTEXTURE2_ARB\t\t\t\t\t= 0x84C2\n\tTEXTURE3_ARB\t\t\t\t\t= 0x84C3\n\tTEXTURE4_ARB\t\t\t\t\t= 0x84C4\n\tTEXTURE5_ARB\t\t\t\t\t= 0x84C5\n\tTEXTURE6_ARB\t\t\t\t\t= 0x84C6\n\tTEXTURE7_ARB\t\t\t\t\t= 0x84C7\n\tTEXTURE8_ARB\t\t\t\t\t= 0x84C8\n\tTEXTURE9_ARB\t\t\t\t\t= 0x84C9\n\tTEXTURE10_ARB\t\t\t\t\t= 0x84CA\n\tTEXTURE11_ARB\t\t\t\t\t= 0x84CB\n\tTEXTURE12_ARB\t\t\t\t\t= 0x84CC\n\tTEXTURE13_ARB\t\t\t\t\t= 0x84CD\n\tTEXTURE14_ARB\t\t\t\t\t= 0x84CE\n\tTEXTURE15_ARB\t\t\t\t\t= 0x84CF\n\tTEXTURE16_ARB\t\t\t\t\t= 0x84D0\n\tTEXTURE17_ARB\t\t\t\t\t= 0x84D1\n\tTEXTURE18_ARB\t\t\t\t\t= 0x84D2\n\tTEXTURE19_ARB\t\t\t\t\t= 0x84D3\n\tTEXTURE20_ARB\t\t\t\t\t= 0x84D4\n\tTEXTURE21_ARB\t\t\t\t\t= 0x84D5\n\tTEXTURE22_ARB\t\t\t\t\t= 0x84D6\n\tTEXTURE23_ARB\t\t\t\t\t= 0x84D7\n\tTEXTURE24_ARB\t\t\t\t\t= 0x84D8\n\tTEXTURE25_ARB\t\t\t\t\t= 0x84D9\n\tTEXTURE26_ARB\t\t\t\t\t= 0x84DA\n\tTEXTURE27_ARB\t\t\t\t\t= 0x84DB\n\tTEXTURE28_ARB\t\t\t\t\t= 0x84DC\n\tTEXTURE29_ARB\t\t\t\t\t= 0x84DD\n\tTEXTURE30_ARB\t\t\t\t\t= 0x84DE\n\tTEXTURE31_ARB\t\t\t\t\t= 0x84DF\n\tACTIVE_TEXTURE_ARB\t\t\t\t= 0x84E0 # 1 I\n\tCLIENT_ACTIVE_TEXTURE_ARB\t\t\t= 0x84E1 # 1 I\n\tMAX_TEXTURE_UNITS_ARB\t\t\t\t= 0x84E2 # 1 I\n\n# These are really core ES 1.1 enums, but haven't included\n# ES core enums in enum.spec yet\nOES_texture_env_crossbar enum: (OpenGL ES only)\n\tuse VERSION_1_3 TEXTURE0\n\tuse VERSION_1_3 TEXTURE1\n\tuse VERSION_1_3 TEXTURE2\n\tuse VERSION_1_3 TEXTURE3\n\tuse VERSION_1_3 TEXTURE4\n\tuse VERSION_1_3 TEXTURE5\n\tuse VERSION_1_3 TEXTURE6\n\tuse VERSION_1_3 TEXTURE7\n\tuse VERSION_1_3 TEXTURE8\n\tuse VERSION_1_3 TEXTURE9\n\tuse VERSION_1_3 TEXTURE10\n\tuse VERSION_1_3 TEXTURE11\n\tuse VERSION_1_3 TEXTURE12\n\tuse VERSION_1_3 TEXTURE13\n\tuse VERSION_1_3 TEXTURE14\n\tuse VERSION_1_3 TEXTURE15\n\tuse VERSION_1_3 TEXTURE16\n\tuse VERSION_1_3 TEXTURE17\n\tuse VERSION_1_3 TEXTURE18\n\tuse VERSION_1_3 TEXTURE19\n\tuse VERSION_1_3 TEXTURE20\n\tuse VERSION_1_3 TEXTURE21\n\tuse VERSION_1_3 TEXTURE22\n\tuse VERSION_1_3 TEXTURE23\n\tuse VERSION_1_3 TEXTURE24\n\tuse VERSION_1_3 TEXTURE25\n\tuse VERSION_1_3 TEXTURE26\n\tuse VERSION_1_3 TEXTURE27\n\tuse VERSION_1_3 TEXTURE28\n\tuse VERSION_1_3 TEXTURE29\n\tuse VERSION_1_3 TEXTURE30\n\tuse VERSION_1_3 TEXTURE31\n\n###############################################################################\n\nVERSION_1_3 enum: (Promoted for OpenGL 1.3)\n\tTRANSPOSE_MODELVIEW_MATRIX\t\t\t= 0x84E3 # 16 F\n\tTRANSPOSE_PROJECTION_MATRIX\t\t\t= 0x84E4 # 16 F\n\tTRANSPOSE_TEXTURE_MATRIX\t\t\t= 0x84E5 # 16 F\n\tTRANSPOSE_COLOR_MATRIX\t\t\t\t= 0x84E6 # 16 F\n\nARB_transpose_matrix enum:\n\tTRANSPOSE_MODELVIEW_MATRIX_ARB\t\t\t= 0x84E3 # 16 F\n\tTRANSPOSE_PROJECTION_MATRIX_ARB\t\t\t= 0x84E4 # 16 F\n\tTRANSPOSE_TEXTURE_MATRIX_ARB\t\t\t= 0x84E5 # 16 F\n\tTRANSPOSE_COLOR_MATRIX_ARB\t\t\t= 0x84E6 # 16 F\n\nVERSION_1_3 enum: (Promoted for OpenGL 1.3)\n\tSUBTRACT\t\t\t\t\t= 0x84E7\n\nARB_texture_env_combine enum:\n\tSUBTRACT_ARB\t\t\t\t\t= 0x84E7\n\nVERSION_3_0 enum:\n\tuse ARB_framebuffer_object\t    MAX_RENDERBUFFER_SIZE\n\nARB_framebuffer_object enum: (note: no ARB suffixes)\n\tMAX_RENDERBUFFER_SIZE\t\t\t\t= 0x84E8    # VERSION_3_0 / ARB_fbo\n\nEXT_framebuffer_object enum: (additional; see below):\n\tMAX_RENDERBUFFER_SIZE_EXT\t\t\t= 0x84E8\n\n# Aliases EXT_framebuffer_object enum above\nOES_framebuffer_object enum: (OpenGL ES only; additional; see below)\n\tMAX_RENDERBUFFER_SIZE_OES\t\t\t= 0x84E8\n\nVERSION_1_3 enum: (Promoted for OpenGL 1.3)\n\tCOMPRESSED_ALPHA\t\t\t\t= 0x84E9\n\tCOMPRESSED_LUMINANCE\t\t\t\t= 0x84EA\n\tCOMPRESSED_LUMINANCE_ALPHA\t\t\t= 0x84EB\n\tCOMPRESSED_INTENSITY\t\t\t\t= 0x84EC\n\tCOMPRESSED_RGB\t\t\t\t\t= 0x84ED\n\tCOMPRESSED_RGBA\t\t\t\t\t= 0x84EE\n\tTEXTURE_COMPRESSION_HINT\t\t\t= 0x84EF\n\tTEXTURE_COMPRESSED_IMAGE_SIZE\t\t\t= 0x86A0\n\tTEXTURE_COMPRESSED\t\t\t\t= 0x86A1\n\tNUM_COMPRESSED_TEXTURE_FORMATS\t\t\t= 0x86A2\n\tCOMPRESSED_TEXTURE_FORMATS\t\t\t= 0x86A3\n\nARB_texture_compression enum:\n\tCOMPRESSED_ALPHA_ARB\t\t\t\t= 0x84E9\n\tCOMPRESSED_LUMINANCE_ARB\t\t\t= 0x84EA\n\tCOMPRESSED_LUMINANCE_ALPHA_ARB\t\t\t= 0x84EB\n\tCOMPRESSED_INTENSITY_ARB\t\t\t= 0x84EC\n\tCOMPRESSED_RGB_ARB\t\t\t\t= 0x84ED\n\tCOMPRESSED_RGBA_ARB\t\t\t\t= 0x84EE\n\tTEXTURE_COMPRESSION_HINT_ARB\t\t\t= 0x84EF\n\tTEXTURE_COMPRESSED_IMAGE_SIZE_ARB\t\t= 0x86A0\n\tTEXTURE_COMPRESSED_ARB\t\t\t\t= 0x86A1\n\tNUM_COMPRESSED_TEXTURE_FORMATS_ARB\t\t= 0x86A2\n\tCOMPRESSED_TEXTURE_FORMATS_ARB\t\t\t= 0x86A3\n\n###############################################################################\n\n# NVIDIA: 0x84F0-0x855F\n\n# NV_future_use: 0x84F0-0x84F1\n\nNV_fence enum:\n\tALL_COMPLETED_NV\t\t\t\t= 0x84F2\n\tFENCE_STATUS_NV\t\t\t\t\t= 0x84F3\n\tFENCE_CONDITION_NV\t\t\t\t= 0x84F4\n\nVERSION_3_1 enum:\n\tTEXTURE_RECTANGLE\t\t\t\t= 0x84F5\n\tTEXTURE_BINDING_RECTANGLE\t\t\t= 0x84F6\n\tPROXY_TEXTURE_RECTANGLE\t\t\t\t= 0x84F7\n\tMAX_RECTANGLE_TEXTURE_SIZE\t\t\t= 0x84F8\n\nARB_texture_rectangle enum:\n\tTEXTURE_RECTANGLE_ARB\t\t\t\t= 0x84F5\n\tTEXTURE_BINDING_RECTANGLE_ARB\t\t\t= 0x84F6\n\tPROXY_TEXTURE_RECTANGLE_ARB\t\t\t= 0x84F7\n\tMAX_RECTANGLE_TEXTURE_SIZE_ARB\t\t\t= 0x84F8\n\nNV_texture_rectangle enum:\n\tTEXTURE_RECTANGLE_NV\t\t\t\t= 0x84F5\n\tTEXTURE_BINDING_RECTANGLE_NV\t\t\t= 0x84F6\n\tPROXY_TEXTURE_RECTANGLE_NV\t\t\t= 0x84F7\n\tMAX_RECTANGLE_TEXTURE_SIZE_NV\t\t\t= 0x84F8\n\nVERSION_3_0 enum:\n\tuse ARB_framebuffer_object\t    DEPTH_STENCIL\n\tuse ARB_framebuffer_object\t    UNSIGNED_INT_24_8\n\nARB_framebuffer_object enum: (note: no ARB suffixes)\n\tDEPTH_STENCIL\t\t\t\t\t= 0x84F9    # VERSION_3_0 / ARB_fbo\n\tUNSIGNED_INT_24_8\t\t\t\t= 0x84FA    # VERSION_3_0 / ARB_fbo\n\nEXT_packed_depth_stencil enum:\n\tDEPTH_STENCIL_EXT\t\t\t\t= 0x84F9\n\tUNSIGNED_INT_24_8_EXT\t\t\t\t= 0x84FA\n\nNV_packed_depth_stencil enum:\n\tDEPTH_STENCIL_NV\t\t\t\t= 0x84F9\n\tUNSIGNED_INT_24_8_NV\t\t\t\t= 0x84FA\n\n# Aliases EXT_packed_depth_stencil enums above\nOES_packed_depth_stencil enum: (OpenGL ES only)\n\tDEPTH_STENCIL_OES\t\t\t\t= 0x84F9\n\tUNSIGNED_INT_24_8_OES\t\t\t\t= 0x84FA\n\n# NV_future_use: 0x84FB-0x84FC\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tMAX_TEXTURE_LOD_BIAS\t\t\t\t= 0x84FD\n\nEXT_texture_lod_bias enum:\n\tMAX_TEXTURE_LOD_BIAS_EXT\t\t\t= 0x84FD\n\nEXT_texture_filter_anisotropic enum:\n\tTEXTURE_MAX_ANISOTROPY_EXT\t\t\t= 0x84FE\n\tMAX_TEXTURE_MAX_ANISOTROPY_EXT\t\t\t= 0x84FF\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tTEXTURE_FILTER_CONTROL\t\t\t\t= 0x8500\n\tTEXTURE_LOD_BIAS\t\t\t\t= 0x8501\n\nEXT_texture_lod_bias enum:\n\tTEXTURE_FILTER_CONTROL_EXT\t\t\t= 0x8500\n\tTEXTURE_LOD_BIAS_EXT\t\t\t\t= 0x8501\n\nEXT_vertex_weighting enum:\n\tMODELVIEW1_STACK_DEPTH_EXT\t\t\t= 0x8502\n\n# NV_texture_env_combine4 (additional; see below): 0x8503\n\nNV_light_max_exponent enum:\n\tMAX_SHININESS_NV\t\t\t\t= 0x8504\n\tMAX_SPOT_EXPONENT_NV\t\t\t\t= 0x8505\n\nEXT_vertex_weighting enum:\n\tMODELVIEW_MATRIX1_EXT\t\t\t\t= 0x8506\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tINCR_WRAP\t\t\t\t\t= 0x8507\n\tDECR_WRAP\t\t\t\t\t= 0x8508\n\nEXT_stencil_wrap enum:\n\tINCR_WRAP_EXT\t\t\t\t\t= 0x8507\n\tDECR_WRAP_EXT\t\t\t\t\t= 0x8508\n\n# Aliases EXT_stencil_wrap enums above\nOES_stencil_wrap enum: (OpenGL ES only)\n\tINCR_WRAP_OES\t\t\t\t\t= 0x8507\n\tDECR_WRAP_OES\t\t\t\t\t= 0x8508\n\nEXT_vertex_weighting enum:\n\tVERTEX_WEIGHTING_EXT\t\t\t\t= 0x8509\n\tMODELVIEW1_EXT\t\t\t\t\t= 0x850A\n\tCURRENT_VERTEX_WEIGHT_EXT\t\t\t= 0x850B\n\tVERTEX_WEIGHT_ARRAY_EXT\t\t\t\t= 0x850C\n\tVERTEX_WEIGHT_ARRAY_SIZE_EXT\t\t\t= 0x850D\n\tVERTEX_WEIGHT_ARRAY_TYPE_EXT\t\t\t= 0x850E\n\tVERTEX_WEIGHT_ARRAY_STRIDE_EXT\t\t\t= 0x850F\n\tVERTEX_WEIGHT_ARRAY_POINTER_EXT\t\t\t= 0x8510\n\nVERSION_1_3 enum: (Promoted for OpenGL 1.3)\n\tNORMAL_MAP\t\t\t\t\t= 0x8511\n\tREFLECTION_MAP\t\t\t\t\t= 0x8512\n\tTEXTURE_CUBE_MAP\t\t\t\t= 0x8513\n\tTEXTURE_BINDING_CUBE_MAP\t\t\t= 0x8514\n\tTEXTURE_CUBE_MAP_POSITIVE_X\t\t\t= 0x8515\n\tTEXTURE_CUBE_MAP_NEGATIVE_X\t\t\t= 0x8516\n\tTEXTURE_CUBE_MAP_POSITIVE_Y\t\t\t= 0x8517\n\tTEXTURE_CUBE_MAP_NEGATIVE_Y\t\t\t= 0x8518\n\tTEXTURE_CUBE_MAP_POSITIVE_Z\t\t\t= 0x8519\n\tTEXTURE_CUBE_MAP_NEGATIVE_Z\t\t\t= 0x851A\n\tPROXY_TEXTURE_CUBE_MAP\t\t\t\t= 0x851B\n\tMAX_CUBE_MAP_TEXTURE_SIZE\t\t\t= 0x851C\n\nEXT_texture_cube_map enum:\n\tNORMAL_MAP_EXT\t\t\t\t\t= 0x8511\n\tREFLECTION_MAP_EXT\t\t\t\t= 0x8512\n\tTEXTURE_CUBE_MAP_EXT\t\t\t\t= 0x8513\n\tTEXTURE_BINDING_CUBE_MAP_EXT\t\t\t= 0x8514\n\tTEXTURE_CUBE_MAP_POSITIVE_X_EXT\t\t\t= 0x8515\n\tTEXTURE_CUBE_MAP_NEGATIVE_X_EXT\t\t\t= 0x8516\n\tTEXTURE_CUBE_MAP_POSITIVE_Y_EXT\t\t\t= 0x8517\n\tTEXTURE_CUBE_MAP_NEGATIVE_Y_EXT\t\t\t= 0x8518\n\tTEXTURE_CUBE_MAP_POSITIVE_Z_EXT\t\t\t= 0x8519\n\tTEXTURE_CUBE_MAP_NEGATIVE_Z_EXT\t\t\t= 0x851A\n\tPROXY_TEXTURE_CUBE_MAP_EXT\t\t\t= 0x851B\n\tMAX_CUBE_MAP_TEXTURE_SIZE_EXT\t\t\t= 0x851C\n\nNV_texgen_reflection enum:\n\tNORMAL_MAP\t\t\t\t\t= 0x8511\n\tREFLECTION_MAP\t\t\t\t\t= 0x8512\n\nARB_texture_cube_map enum:\n\tNORMAL_MAP_ARB\t\t\t\t\t= 0x8511\n\tREFLECTION_MAP_ARB\t\t\t\t= 0x8512\n\tTEXTURE_CUBE_MAP_ARB\t\t\t\t= 0x8513\n\tTEXTURE_BINDING_CUBE_MAP_ARB\t\t\t= 0x8514\n\tTEXTURE_CUBE_MAP_POSITIVE_X_ARB\t\t\t= 0x8515\n\tTEXTURE_CUBE_MAP_NEGATIVE_X_ARB\t\t\t= 0x8516\n\tTEXTURE_CUBE_MAP_POSITIVE_Y_ARB\t\t\t= 0x8517\n\tTEXTURE_CUBE_MAP_NEGATIVE_Y_ARB\t\t\t= 0x8518\n\tTEXTURE_CUBE_MAP_POSITIVE_Z_ARB\t\t\t= 0x8519\n\tTEXTURE_CUBE_MAP_NEGATIVE_Z_ARB\t\t\t= 0x851A\n\tPROXY_TEXTURE_CUBE_MAP_ARB\t\t\t= 0x851B\n\tMAX_CUBE_MAP_TEXTURE_SIZE_ARB\t\t\t= 0x851C\n\n# Aliases ARB_texture_cube_map enums above\nOES_texture_cube_map enum: (OpenGL ES only; additional; see below)\n\tNORMAL_MAP_OES\t\t\t\t\t= 0x8511\n\tREFLECTION_MAP_OES\t\t\t\t= 0x8512\n\tTEXTURE_CUBE_MAP_OES\t\t\t\t= 0x8513\n\tTEXTURE_BINDING_CUBE_MAP_OES\t\t\t= 0x8514\n\tTEXTURE_CUBE_MAP_POSITIVE_X_OES\t\t\t= 0x8515\n\tTEXTURE_CUBE_MAP_NEGATIVE_X_OES\t\t\t= 0x8516\n\tTEXTURE_CUBE_MAP_POSITIVE_Y_OES\t\t\t= 0x8517\n\tTEXTURE_CUBE_MAP_NEGATIVE_Y_OES\t\t\t= 0x8518\n\tTEXTURE_CUBE_MAP_POSITIVE_Z_OES\t\t\t= 0x8519\n\tTEXTURE_CUBE_MAP_NEGATIVE_Z_OES\t\t\t= 0x851A\n\tMAX_CUBE_MAP_TEXTURE_SIZE_OES\t\t\t= 0x851C\n\nNV_vertex_array_range enum:\n\tVERTEX_ARRAY_RANGE_NV\t\t\t\t= 0x851D\n\tVERTEX_ARRAY_RANGE_LENGTH_NV\t\t\t= 0x851E\n\tVERTEX_ARRAY_RANGE_VALID_NV\t\t\t= 0x851F\n\tMAX_VERTEX_ARRAY_RANGE_ELEMENT_NV\t\t= 0x8520\n\tVERTEX_ARRAY_RANGE_POINTER_NV\t\t\t= 0x8521\n\n# @@@ How does this interact with NV_vertex_array_range?\nAPPLE_vertex_array_range enum:\n\tVERTEX_ARRAY_RANGE_APPLE\t\t\t= 0x851D\n\tVERTEX_ARRAY_RANGE_LENGTH_APPLE\t\t\t= 0x851E\n\tVERTEX_ARRAY_STORAGE_HINT_APPLE\t\t\t= 0x851F\n\tVERTEX_ARRAY_RANGE_POINTER_APPLE\t\t= 0x8521\n\tSTORAGE_CACHED_APPLE\t\t\t\t= 0x85BE\n\tSTORAGE_SHARED_APPLE\t\t\t\t= 0x85BF\n\nNV_register_combiners enum:\n\tREGISTER_COMBINERS_NV\t\t\t\t= 0x8522\n\tVARIABLE_A_NV\t\t\t\t\t= 0x8523\n\tVARIABLE_B_NV\t\t\t\t\t= 0x8524\n\tVARIABLE_C_NV\t\t\t\t\t= 0x8525\n\tVARIABLE_D_NV\t\t\t\t\t= 0x8526\n\tVARIABLE_E_NV\t\t\t\t\t= 0x8527\n\tVARIABLE_F_NV\t\t\t\t\t= 0x8528\n\tVARIABLE_G_NV\t\t\t\t\t= 0x8529\n\tCONSTANT_COLOR0_NV\t\t\t\t= 0x852A\n\tCONSTANT_COLOR1_NV\t\t\t\t= 0x852B\n\tPRIMARY_COLOR_NV\t\t\t\t= 0x852C\n\tSECONDARY_COLOR_NV\t\t\t\t= 0x852D\n\tSPARE0_NV\t\t\t\t\t= 0x852E\n\tSPARE1_NV\t\t\t\t\t= 0x852F\n\tDISCARD_NV\t\t\t\t\t= 0x8530\n\tE_TIMES_F_NV\t\t\t\t\t= 0x8531\n\tSPARE0_PLUS_SECONDARY_COLOR_NV\t\t\t= 0x8532\n\n# NV_vertex_array_range2:\n\tVERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV\t\t= 0x8533\n\n# NV_multisample_filter_hint:\n\tMULTISAMPLE_FILTER_HINT_NV\t\t\t= 0x8534\n\nNV_register_combiners2 enum:\n\tPER_STAGE_CONSTANTS_NV\t\t\t\t= 0x8535\n\nNV_register_combiners enum: (additional; see above):\n\tUNSIGNED_IDENTITY_NV\t\t\t\t= 0x8536\n\tUNSIGNED_INVERT_NV\t\t\t\t= 0x8537\n\tEXPAND_NORMAL_NV\t\t\t\t= 0x8538\n\tEXPAND_NEGATE_NV\t\t\t\t= 0x8539\n\tHALF_BIAS_NORMAL_NV\t\t\t\t= 0x853A\n\tHALF_BIAS_NEGATE_NV\t\t\t\t= 0x853B\n\tSIGNED_IDENTITY_NV\t\t\t\t= 0x853C\n\tUNSIGNED_NEGATE_NV\t\t\t\t= 0x853D\n\tSCALE_BY_TWO_NV\t\t\t\t\t= 0x853E\n\tSCALE_BY_FOUR_NV\t\t\t\t= 0x853F\n\tSCALE_BY_ONE_HALF_NV\t\t\t\t= 0x8540\n\tBIAS_BY_NEGATIVE_ONE_HALF_NV\t\t\t= 0x8541\n\tCOMBINER_INPUT_NV\t\t\t\t= 0x8542\n\tCOMBINER_MAPPING_NV\t\t\t\t= 0x8543\n\tCOMBINER_COMPONENT_USAGE_NV\t\t\t= 0x8544\n\tCOMBINER_AB_DOT_PRODUCT_NV\t\t\t= 0x8545\n\tCOMBINER_CD_DOT_PRODUCT_NV\t\t\t= 0x8546\n\tCOMBINER_MUX_SUM_NV\t\t\t\t= 0x8547\n\tCOMBINER_SCALE_NV\t\t\t\t= 0x8548\n\tCOMBINER_BIAS_NV\t\t\t\t= 0x8549\n\tCOMBINER_AB_OUTPUT_NV\t\t\t\t= 0x854A\n\tCOMBINER_CD_OUTPUT_NV\t\t\t\t= 0x854B\n\tCOMBINER_SUM_OUTPUT_NV\t\t\t\t= 0x854C\n\tMAX_GENERAL_COMBINERS_NV\t\t\t= 0x854D\n\tNUM_GENERAL_COMBINERS_NV\t\t\t= 0x854E\n\tCOLOR_SUM_CLAMP_NV\t\t\t\t= 0x854F\n\tCOMBINER0_NV\t\t\t\t\t= 0x8550\n\tCOMBINER1_NV\t\t\t\t\t= 0x8551\n\tCOMBINER2_NV\t\t\t\t\t= 0x8552\n\tCOMBINER3_NV\t\t\t\t\t= 0x8553\n\tCOMBINER4_NV\t\t\t\t\t= 0x8554\n\tCOMBINER5_NV\t\t\t\t\t= 0x8555\n\tCOMBINER6_NV\t\t\t\t\t= 0x8556\n\tCOMBINER7_NV\t\t\t\t\t= 0x8557\n\n\nNV_primitive_restart enum:\n\tPRIMITIVE_RESTART_NV\t\t\t\t= 0x8558\n\tPRIMITIVE_RESTART_INDEX_NV\t\t\t= 0x8559\n\nNV_fog_distance enum:\n\tFOG_GEN_MODE_NV\t\t\t\t\t= 0x855A\n\tEYE_RADIAL_NV\t\t\t\t\t= 0x855B\n\tEYE_PLANE_ABSOLUTE_NV\t\t\t\t= 0x855C\n\nNV_texgen_emboss enum:\n\tEMBOSS_LIGHT_NV\t\t\t\t\t= 0x855D\n\tEMBOSS_CONSTANT_NV\t\t\t\t= 0x855E\n\tEMBOSS_MAP_NV\t\t\t\t\t= 0x855F\n\n###############################################################################\n\n# Intergraph/Intense3D/3Dlabs: 0x8560-0x856F\n\nINGR_color_clamp enum:\n\tRED_MIN_CLAMP_INGR\t\t\t\t= 0x8560\n\tGREEN_MIN_CLAMP_INGR\t\t\t\t= 0x8561\n\tBLUE_MIN_CLAMP_INGR\t\t\t\t= 0x8562\n\tALPHA_MIN_CLAMP_INGR\t\t\t\t= 0x8563\n\tRED_MAX_CLAMP_INGR\t\t\t\t= 0x8564\n\tGREEN_MAX_CLAMP_INGR\t\t\t\t= 0x8565\n\tBLUE_MAX_CLAMP_INGR\t\t\t\t= 0x8566\n\tALPHA_MAX_CLAMP_INGR\t\t\t\t= 0x8567\n\nINGR_interlace_read enum:\n\tINTERLACE_READ_INGR\t\t\t\t= 0x8568\n\n# 3Dlabs_future_use: 0x8569-0x856F\n\n###############################################################################\n\n# ATI/NVIDIA: 0x8570-0x859F\n\nVERSION_1_5 enum: (Consistent naming scheme for OpenGL 1.5)\n\tSRC0_RGB\t\t\t\t\t= 0x8580    # alias GL_SOURCE0_RGB\n\tSRC1_RGB\t\t\t\t\t= 0x8581    # alias GL_SOURCE1_RGB\n\tSRC2_RGB\t\t\t\t\t= 0x8582    # alias GL_SOURCE2_RGB\n\tSRC0_ALPHA\t\t\t\t\t= 0x8588    # alias GL_SOURCE0_ALPHA\n\tSRC1_ALPHA\t\t\t\t\t= 0x8589    # alias GL_SOURCE1_ALPHA\n\tSRC2_ALPHA\t\t\t\t\t= 0x858A    # alias GL_SOURCE2_ALPHA\n\nVERSION_1_3 enum: (Promoted for OpenGL 1.3)\n\tCOMBINE\t\t\t\t\t\t= 0x8570\n\tCOMBINE_RGB\t\t\t\t\t= 0x8571\n\tCOMBINE_ALPHA\t\t\t\t\t= 0x8572\n\tRGB_SCALE\t\t\t\t\t= 0x8573\n\tADD_SIGNED\t\t\t\t\t= 0x8574\n\tINTERPOLATE\t\t\t\t\t= 0x8575\n\tCONSTANT\t\t\t\t\t= 0x8576\n\tPRIMARY_COLOR\t\t\t\t\t= 0x8577\n\tPREVIOUS\t\t\t\t\t= 0x8578\n\tSOURCE0_RGB\t\t\t\t\t= 0x8580\n\tSOURCE1_RGB\t\t\t\t\t= 0x8581\n\tSOURCE2_RGB\t\t\t\t\t= 0x8582\n\tSOURCE0_ALPHA\t\t\t\t\t= 0x8588\n\tSOURCE1_ALPHA\t\t\t\t\t= 0x8589\n\tSOURCE2_ALPHA\t\t\t\t\t= 0x858A\n\tOPERAND0_RGB\t\t\t\t\t= 0x8590\n\tOPERAND1_RGB\t\t\t\t\t= 0x8591\n\tOPERAND2_RGB\t\t\t\t\t= 0x8592\n\tOPERAND0_ALPHA\t\t\t\t\t= 0x8598\n\tOPERAND1_ALPHA\t\t\t\t\t= 0x8599\n\tOPERAND2_ALPHA\t\t\t\t\t= 0x859A\n\nEXT_texture_env_combine enum:\n\tCOMBINE_EXT\t\t\t\t\t= 0x8570\n\tCOMBINE_RGB_EXT\t\t\t\t\t= 0x8571\n\tCOMBINE_ALPHA_EXT\t\t\t\t= 0x8572\n\tRGB_SCALE_EXT\t\t\t\t\t= 0x8573\n\tADD_SIGNED_EXT\t\t\t\t\t= 0x8574\n\tINTERPOLATE_EXT\t\t\t\t\t= 0x8575\n\tCONSTANT_EXT\t\t\t\t\t= 0x8576\n\tPRIMARY_COLOR_EXT\t\t\t\t= 0x8577\n\tPREVIOUS_EXT\t\t\t\t\t= 0x8578\n\tSOURCE0_RGB_EXT\t\t\t\t\t= 0x8580\n\tSOURCE1_RGB_EXT\t\t\t\t\t= 0x8581\n\tSOURCE2_RGB_EXT\t\t\t\t\t= 0x8582\n\tSOURCE0_ALPHA_EXT\t\t\t\t= 0x8588\n\tSOURCE1_ALPHA_EXT\t\t\t\t= 0x8589\n\tSOURCE2_ALPHA_EXT\t\t\t\t= 0x858A\n\tOPERAND0_RGB_EXT\t\t\t\t= 0x8590\n\tOPERAND1_RGB_EXT\t\t\t\t= 0x8591\n\tOPERAND2_RGB_EXT\t\t\t\t= 0x8592\n\tOPERAND0_ALPHA_EXT\t\t\t\t= 0x8598\n\tOPERAND1_ALPHA_EXT\t\t\t\t= 0x8599\n\tOPERAND2_ALPHA_EXT\t\t\t\t= 0x859A\n\nNV_texture_env_combine4 enum:\n\tCOMBINE4_NV\t\t\t\t\t= 0x8503\n\tSOURCE3_RGB_NV\t\t\t\t\t= 0x8583\n\tSOURCE3_ALPHA_NV\t\t\t\t= 0x858B\n\tOPERAND3_RGB_NV\t\t\t\t\t= 0x8593\n\tOPERAND3_ALPHA_NV\t\t\t\t= 0x859B\n\n# \"Future use\" => \"additional combiner input/output enums\" only\n# ATI/NVIDIA_future_use: 0x8584-0x8587\n# ATI/NVIDIA_future_use: 0x858C-0x858F\n# ATI/NVIDIA_future_use: 0x8594-0x8597\n# ATI/NVIDIA_future_use: 0x859C-0x859F\n\n###############################################################################\n\nSGIX_subsample enum:\n\tPACK_SUBSAMPLE_RATE_SGIX\t\t\t= 0x85A0\n\tUNPACK_SUBSAMPLE_RATE_SGIX\t\t\t= 0x85A1\n\tPIXEL_SUBSAMPLE_4444_SGIX\t\t\t= 0x85A2\n\tPIXEL_SUBSAMPLE_2424_SGIX\t\t\t= 0x85A3\n\tPIXEL_SUBSAMPLE_4242_SGIX\t\t\t= 0x85A4\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIS_color_range: 0x85A5-0x85AD\n#\tEXTENDED_RANGE_SGIS\t\t\t\t= 0x85A5\n#\tMIN_RED_SGIS\t\t\t\t\t= 0x85A6\n#\tMAX_RED_SGIS\t\t\t\t\t= 0x85A7\n#\tMIN_GREEN_SGIS\t\t\t\t\t= 0x85A8\n#\tMAX_GREEN_SGIS\t\t\t\t\t= 0x85A9\n#\tMIN_BLUE_SGIS\t\t\t\t\t= 0x85AA\n#\tMAX_BLUE_SGIS\t\t\t\t\t= 0x85AB\n#\tMIN_ALPHA_SGIS\t\t\t\t\t= 0x85AC\n#\tMAX_ALPHA_SGIS\t\t\t\t\t= 0x85AD\n\n###############################################################################\n\nEXT_texture_perturb_normal enum:\n\tPERTURB_EXT\t\t\t\t\t= 0x85AE\n\tTEXTURE_NORMAL_EXT\t\t\t\t= 0x85AF\n\n###############################################################################\n\n# Apple: 0x85B0-0x85BF\n\nAPPLE_specular_vector enum:\n\tLIGHT_MODEL_SPECULAR_VECTOR_APPLE\t\t= 0x85B0\n\nAPPLE_transform_hint enum:\n\tTRANSFORM_HINT_APPLE\t\t\t\t= 0x85B1\n\nAPPLE_client_storage enum:\n\tUNPACK_CLIENT_STORAGE_APPLE\t\t\t= 0x85B2\n\n# May also be part of APPLE_fence\nAPPLE_object_purgeable enum: (additional; see below)\n\tBUFFER_OBJECT_APPLE\t\t\t\t= 0x85B3\n\n# APPLE_future_use: 0x85B4\n\n## From Jeremy 2006/10/18 (Khronos bug 632) - unknown extension name\n#\tSTORAGE_CLIENT_APPLE\t\t\t\t= 0x85B4\n\nVERSION_3_0 enum:\n\tuse ARB_vertex_array_object\t    VERTEX_ARRAY_BINDING\n\nARB_vertex_array_object enum: (note: no ARB suffixes)\n\tVERTEX_ARRAY_BINDING\t\t\t\t= 0x85B5    # VERSION_3_0 / ARB_vao\n\nAPPLE_vertex_array_object enum:\n\tVERTEX_ARRAY_BINDING_APPLE\t\t\t= 0x85B5\n\n# APPLE_future_use: 0x85B6\n## From Jeremy 2006/10/18 (Khronos bug 632) - unknown extension name\n#\tTEXTURE_MINIMIZE_STORAGE_APPLE\t\t\t= 0x85B6\n\nAPPLE_texture_range enum:  (additional; see below)\n\tTEXTURE_RANGE_LENGTH_APPLE\t\t\t= 0x85B7\n\tTEXTURE_RANGE_POINTER_APPLE\t\t\t= 0x85B8\n\nAPPLE_ycbcr_422 enum:\n\tYCBCR_422_APPLE\t\t\t\t\t= 0x85B9\n\tUNSIGNED_SHORT_8_8_APPLE\t\t\t= 0x85BA\n\tUNSIGNED_SHORT_8_8_REV_APPLE\t\t\t= 0x85BB\n\nMESA_ycbcr_texture enum: (additional; see below)\n\tUNSIGNED_SHORT_8_8_MESA\t\t\t\t= 0x85BA\n\tUNSIGNED_SHORT_8_8_REV_MESA\t\t\t= 0x85BB\n\nAPPLE_texture_range enum:\n\tTEXTURE_STORAGE_HINT_APPLE\t\t\t= 0x85BC\n\tSTORAGE_PRIVATE_APPLE\t\t\t\t= 0x85BD\n\nAPPLE_vertex_array_range enum: (additional; see above):\n\tSTORAGE_CACHED_APPLE\t\t\t\t= 0x85BE\n\tSTORAGE_SHARED_APPLE\t\t\t\t= 0x85BF\n\nAPPLE_texture_range enum:\n\tuse APPLE_vertex_array_range\t    STORAGE_CACHED_APPLE\n\tuse APPLE_vertex_array_range\t    STORAGE_SHARED_APPLE\n\n###############################################################################\n\n# Sun: 0x85C0-0x85CF\n\nSUNX_general_triangle_list enum: (additional; see above)\n\t REPLACEMENT_CODE_ARRAY_SUN\t\t\t= 0x85C0\n\t REPLACEMENT_CODE_ARRAY_TYPE_SUN\t\t= 0x85C1\n\t REPLACEMENT_CODE_ARRAY_STRIDE_SUN\t\t= 0x85C2\n\t REPLACEMENT_CODE_ARRAY_POINTER_SUN\t\t= 0x85C3\n\t R1UI_V3F_SUN\t\t\t\t\t= 0x85C4\n\t R1UI_C4UB_V3F_SUN\t\t\t\t= 0x85C5\n\t R1UI_C3F_V3F_SUN\t\t\t\t= 0x85C6\n\t R1UI_N3F_V3F_SUN\t\t\t\t= 0x85C7\n\t R1UI_C4F_N3F_V3F_SUN\t\t\t\t= 0x85C8\n\t R1UI_T2F_V3F_SUN\t\t\t\t= 0x85C9\n\t R1UI_T2F_N3F_V3F_SUN\t\t\t\t= 0x85CA\n\t R1UI_T2F_C4F_N3F_V3F_SUN\t\t\t= 0x85CB\n\nSUN_slice_accum enum:\n\tSLICE_ACCUM_SUN\t\t\t\t\t= 0x85CC\n\n# SUN_future_use: 0x85CD-0x85CF\n\n###############################################################################\n\n# Unknown extension name, not in enumext.spec\n# 3Dlabs/Autodesk: 0x85D0-0x85DF\n#\tFACET_NORMAL_AUTODESK\t\t\t\t= 0x85D0\n#\tFACET_NORMAL_ARRAY_AUTODESK\t\t\t= 0x85D1\n\n###############################################################################\n\n# Incomplete extension, not in enumext.spec\n# SGIX_texture_range: 0x85E0-0x85FB\n#\tRGB_SIGNED_SGIX\t\t\t\t\t= 0x85E0\n#\tRGBA_SIGNED_SGIX\t\t\t\t= 0x85E1\n#\tALPHA_SIGNED_SGIX\t\t\t\t= 0x85E2\n#\tLUMINANCE_SIGNED_SGIX\t\t\t\t= 0x85E3\n#\tINTENSITY_SIGNED_SGIX\t\t\t\t= 0x85E4\n#\tLUMINANCE_ALPHA_SIGNED_SGIX\t\t\t= 0x85E5\n#\tRGB16_SIGNED_SGIX\t\t\t\t= 0x85E6\n#\tRGBA16_SIGNED_SGIX\t\t\t\t= 0x85E7\n#\tALPHA16_SIGNED_SGIX\t\t\t\t= 0x85E8\n#\tLUMINANCE16_SIGNED_SGIX\t\t\t\t= 0x85E9\n#\tINTENSITY16_SIGNED_SGIX\t\t\t\t= 0x85EA\n#\tLUMINANCE16_ALPHA16_SIGNED_SGIX\t\t\t= 0x85EB\n#\tRGB_EXTENDED_RANGE_SGIX\t\t\t\t= 0x85EC\n#\tRGBA_EXTENDED_RANGE_SGIX\t\t\t= 0x85ED\n#\tALPHA_EXTENDED_RANGE_SGIX\t\t\t= 0x85EE\n#\tLUMINANCE_EXTENDED_RANGE_SGIX\t\t\t= 0x85EF\n#\tINTENSITY_EXTENDED_RANGE_SGIX\t\t\t= 0x85F0\n#\tLUMINANCE_ALPHA_EXTENDED_RANGE_SGIX\t\t= 0x85F1\n#\tRGB16_EXTENDED_RANGE_SGIX\t\t\t= 0x85F2\n#\tRGBA16_EXTENDED_RANGE_SGIX\t\t\t= 0x85F3\n#\tALPHA16_EXTENDED_RANGE_SGIX\t\t\t= 0x85F4\n#\tLUMINANCE16_EXTENDED_RANGE_SGIX\t\t\t= 0x85F5\n#\tINTENSITY16_EXTENDED_RANGE_SGIX\t\t\t= 0x85F6\n#\tLUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX\t\t= 0x85F7\n#\tMIN_LUMINANCE_SGIS\t\t\t\t= 0x85F8\n#\tMAX_LUMINANCE_SGIS\t\t\t\t= 0x85F9\n#\tMIN_INTENSITY_SGIS\t\t\t\t= 0x85FA\n#\tMAX_INTENSITY_SGIS\t\t\t\t= 0x85FB\n\n###############################################################################\n\n# SGI_future_use: 0x85FC-0x85FF\n\n###############################################################################\n\n# Sun: 0x8600-0x861F\n\n# SUN_future_use: 0x8600-0x8613\n\nSUN_mesh_array enum: 0x8614-0x8615\n\tQUAD_MESH_SUN\t\t\t\t\t= 0x8614\n\tTRIANGLE_MESH_SUN\t\t\t\t= 0x8615\n\n# SUN_future_use: 0x8614-0x861F\n\n###############################################################################\n\n# NVIDIA: 0x8620-0x867F\n\nNV_vertex_program enum:\n\tVERTEX_PROGRAM_NV\t\t\t\t= 0x8620\n\tVERTEX_STATE_PROGRAM_NV\t\t\t\t= 0x8621\n\tATTRIB_ARRAY_SIZE_NV\t\t\t\t= 0x8623\n\tATTRIB_ARRAY_STRIDE_NV\t\t\t\t= 0x8624\n\tATTRIB_ARRAY_TYPE_NV\t\t\t\t= 0x8625\n\tCURRENT_ATTRIB_NV\t\t\t\t= 0x8626\n\tPROGRAM_LENGTH_NV\t\t\t\t= 0x8627\n\tPROGRAM_STRING_NV\t\t\t\t= 0x8628\n\tMODELVIEW_PROJECTION_NV\t\t\t\t= 0x8629\n\tIDENTITY_NV\t\t\t\t\t= 0x862A\n\tINVERSE_NV\t\t\t\t\t= 0x862B\n\tTRANSPOSE_NV\t\t\t\t\t= 0x862C\n\tINVERSE_TRANSPOSE_NV\t\t\t\t= 0x862D\n\tMAX_TRACK_MATRIX_STACK_DEPTH_NV\t\t\t= 0x862E\n\tMAX_TRACK_MATRICES_NV\t\t\t\t= 0x862F\n\tMATRIX0_NV\t\t\t\t\t= 0x8630\n\tMATRIX1_NV\t\t\t\t\t= 0x8631\n\tMATRIX2_NV\t\t\t\t\t= 0x8632\n\tMATRIX3_NV\t\t\t\t\t= 0x8633\n\tMATRIX4_NV\t\t\t\t\t= 0x8634\n\tMATRIX5_NV\t\t\t\t\t= 0x8635\n\tMATRIX6_NV\t\t\t\t\t= 0x8636\n\tMATRIX7_NV\t\t\t\t\t= 0x8637\n##################\n#\n#     Reserved:\n#\n#     MATRIX8_NV\t\t\t\t      = 0x8638\n#     MATRIX9_NV\t\t\t\t      = 0x8639\n#     MATRIX10_NV\t\t\t\t      = 0x863A\n#     MATRIX11_NV\t\t\t\t      = 0x863B\n#     MATRIX12_NV\t\t\t\t      = 0x863C\n#     MATRIX13_NV\t\t\t\t      = 0x863D\n#     MATRIX14_NV\t\t\t\t      = 0x863E\n#     MATRIX15_NV\t\t\t\t      = 0x863F\n#\n###################\n\tCURRENT_MATRIX_STACK_DEPTH_NV\t\t\t= 0x8640\n\tCURRENT_MATRIX_NV\t\t\t\t= 0x8641\n\tVERTEX_PROGRAM_POINT_SIZE_NV\t\t\t= 0x8642\n\tVERTEX_PROGRAM_TWO_SIDE_NV\t\t\t= 0x8643\n\tPROGRAM_PARAMETER_NV\t\t\t\t= 0x8644\n\tATTRIB_ARRAY_POINTER_NV\t\t\t\t= 0x8645\n\tPROGRAM_TARGET_NV\t\t\t\t= 0x8646\n\tPROGRAM_RESIDENT_NV\t\t\t\t= 0x8647\n\tTRACK_MATRIX_NV\t\t\t\t\t= 0x8648\n\tTRACK_MATRIX_TRANSFORM_NV\t\t\t= 0x8649\n\tVERTEX_PROGRAM_BINDING_NV\t\t\t= 0x864A\n\tPROGRAM_ERROR_POSITION_NV\t\t\t= 0x864B\n\tVERTEX_ATTRIB_ARRAY0_NV\t\t\t\t= 0x8650\n\tVERTEX_ATTRIB_ARRAY1_NV\t\t\t\t= 0x8651\n\tVERTEX_ATTRIB_ARRAY2_NV\t\t\t\t= 0x8652\n\tVERTEX_ATTRIB_ARRAY3_NV\t\t\t\t= 0x8653\n\tVERTEX_ATTRIB_ARRAY4_NV\t\t\t\t= 0x8654\n\tVERTEX_ATTRIB_ARRAY5_NV\t\t\t\t= 0x8655\n\tVERTEX_ATTRIB_ARRAY6_NV\t\t\t\t= 0x8656\n\tVERTEX_ATTRIB_ARRAY7_NV\t\t\t\t= 0x8657\n\tVERTEX_ATTRIB_ARRAY8_NV\t\t\t\t= 0x8658\n\tVERTEX_ATTRIB_ARRAY9_NV\t\t\t\t= 0x8659\n\tVERTEX_ATTRIB_ARRAY10_NV\t\t\t= 0x865A\n\tVERTEX_ATTRIB_ARRAY11_NV\t\t\t= 0x865B\n\tVERTEX_ATTRIB_ARRAY12_NV\t\t\t= 0x865C\n\tVERTEX_ATTRIB_ARRAY13_NV\t\t\t= 0x865D\n\tVERTEX_ATTRIB_ARRAY14_NV\t\t\t= 0x865E\n\tVERTEX_ATTRIB_ARRAY15_NV\t\t\t= 0x865F\n\tMAP1_VERTEX_ATTRIB0_4_NV\t\t\t= 0x8660\n\tMAP1_VERTEX_ATTRIB1_4_NV\t\t\t= 0x8661\n\tMAP1_VERTEX_ATTRIB2_4_NV\t\t\t= 0x8662\n\tMAP1_VERTEX_ATTRIB3_4_NV\t\t\t= 0x8663\n\tMAP1_VERTEX_ATTRIB4_4_NV\t\t\t= 0x8664\n\tMAP1_VERTEX_ATTRIB5_4_NV\t\t\t= 0x8665\n\tMAP1_VERTEX_ATTRIB6_4_NV\t\t\t= 0x8666\n\tMAP1_VERTEX_ATTRIB7_4_NV\t\t\t= 0x8667\n\tMAP1_VERTEX_ATTRIB8_4_NV\t\t\t= 0x8668\n\tMAP1_VERTEX_ATTRIB9_4_NV\t\t\t= 0x8669\n\tMAP1_VERTEX_ATTRIB10_4_NV\t\t\t= 0x866A\n\tMAP1_VERTEX_ATTRIB11_4_NV\t\t\t= 0x866B\n\tMAP1_VERTEX_ATTRIB12_4_NV\t\t\t= 0x866C\n\tMAP1_VERTEX_ATTRIB13_4_NV\t\t\t= 0x866D\n\tMAP1_VERTEX_ATTRIB14_4_NV\t\t\t= 0x866E\n\tMAP1_VERTEX_ATTRIB15_4_NV\t\t\t= 0x866F\n\tMAP2_VERTEX_ATTRIB0_4_NV\t\t\t= 0x8670\n\tMAP2_VERTEX_ATTRIB1_4_NV\t\t\t= 0x8671\n\tMAP2_VERTEX_ATTRIB2_4_NV\t\t\t= 0x8672\n\tMAP2_VERTEX_ATTRIB3_4_NV\t\t\t= 0x8673\n\tMAP2_VERTEX_ATTRIB4_4_NV\t\t\t= 0x8674\n\tMAP2_VERTEX_ATTRIB5_4_NV\t\t\t= 0x8675\n\tMAP2_VERTEX_ATTRIB6_4_NV\t\t\t= 0x8676\n\tMAP2_VERTEX_ATTRIB7_4_NV\t\t\t= 0x8677\n\tMAP2_VERTEX_ATTRIB8_4_NV\t\t\t= 0x8678\n\tMAP2_VERTEX_ATTRIB9_4_NV\t\t\t= 0x8679\n\tMAP2_VERTEX_ATTRIB10_4_NV\t\t\t= 0x867A\n\tMAP2_VERTEX_ATTRIB11_4_NV\t\t\t= 0x867B\n\tMAP2_VERTEX_ATTRIB12_4_NV\t\t\t= 0x867C\n\tMAP2_VERTEX_ATTRIB13_4_NV\t\t\t= 0x867D\n\tMAP2_VERTEX_ATTRIB14_4_NV\t\t\t= 0x867E\n\tMAP2_VERTEX_ATTRIB15_4_NV\t\t\t= 0x867F\n\n# NV_texture_shader (additional; see below): 0x864C-0x864E\n\nVERSION_3_2 enum:\n\tPROGRAM_POINT_SIZE\t\t\t\t= 0x8642\n\nARB_geometry_shader4 enum: (additional; see below)\n\tPROGRAM_POINT_SIZE_ARB\t\t\t\t= 0x8642\n\nNV_geometry_program4 enum: (additional; see below)\n\tPROGRAM_POINT_SIZE_EXT\t\t\t\t= 0x8642\n\nVERSION_3_2 enum:\n\tuse ARB_depth_clamp\t\t    DEPTH_CLAMP\n\nARB_depth_clamp enum:\n\tDEPTH_CLAMP\t\t\t\t\t= 0x864F\n\nNV_depth_clamp enum:\n\tDEPTH_CLAMP_NV\t\t\t\t\t= 0x864F\n\nVERSION_2_0 enum: (Promoted from ARB_vertex_shader; only some values)\n\tVERTEX_ATTRIB_ARRAY_ENABLED\t\t\t= 0x8622    # VERSION_2_0\n\tVERTEX_ATTRIB_ARRAY_SIZE\t\t\t= 0x8623    # VERSION_2_0\n\tVERTEX_ATTRIB_ARRAY_STRIDE\t\t\t= 0x8624    # VERSION_2_0\n\tVERTEX_ATTRIB_ARRAY_TYPE\t\t\t= 0x8625    # VERSION_2_0\n\tCURRENT_VERTEX_ATTRIB\t\t\t\t= 0x8626    # VERSION_2_0\n\tVERTEX_PROGRAM_POINT_SIZE\t\t\t= 0x8642    # VERSION_2_0\n\tVERTEX_PROGRAM_TWO_SIDE\t\t\t\t= 0x8643    # VERSION_2_0\n\tVERTEX_ATTRIB_ARRAY_POINTER\t\t\t= 0x8645    # VERSION_2_0\n\nARB_vertex_program enum: (additional; see above; reuses NV_vertex_program values)\nARB_fragment_program enum: (additional; only some values; see below)\n# (Unfortunately, PROGRAM_BINDING_ARB does accidentally reuse 0x8677)\n\tVERTEX_PROGRAM_ARB\t\t\t\t= 0x8620\n\tVERTEX_ATTRIB_ARRAY_ENABLED_ARB\t\t\t= 0x8622\n\tVERTEX_ATTRIB_ARRAY_SIZE_ARB\t\t\t= 0x8623\n\tVERTEX_ATTRIB_ARRAY_STRIDE_ARB\t\t\t= 0x8624\n\tVERTEX_ATTRIB_ARRAY_TYPE_ARB\t\t\t= 0x8625\n\tCURRENT_VERTEX_ATTRIB_ARB\t\t\t= 0x8626\n\tPROGRAM_LENGTH_ARB\t\t\t\t= 0x8627    # ARB_fragment_program\n\tPROGRAM_STRING_ARB\t\t\t\t= 0x8628    # ARB_fragment_program\n\tMAX_PROGRAM_MATRIX_STACK_DEPTH_ARB\t\t= 0x862E    # ARB_fragment_program\n\tMAX_PROGRAM_MATRICES_ARB\t\t\t= 0x862F    # ARB_fragment_program\n\tCURRENT_MATRIX_STACK_DEPTH_ARB\t\t\t= 0x8640    # ARB_fragment_program\n\tCURRENT_MATRIX_ARB\t\t\t\t= 0x8641    # ARB_fragment_program\n\tVERTEX_PROGRAM_POINT_SIZE_ARB\t\t\t= 0x8642\n\tVERTEX_PROGRAM_TWO_SIDE_ARB\t\t\t= 0x8643\n\tVERTEX_ATTRIB_ARRAY_POINTER_ARB\t\t\t= 0x8645\n\tPROGRAM_ERROR_POSITION_ARB\t\t\t= 0x864B    # ARB_fragment_program\n\tPROGRAM_BINDING_ARB\t\t\t\t= 0x8677    # ARB_fragment_program\n\n###############################################################################\n\n# Pixelfusion: 0x8680-0x869F\n\n###############################################################################\n\n# OpenGL ARB: 0x86A0-0x86AF\n\n# ARB_texture_compression/1.3 (additional; see above): 0x86A0-0x86A3\n\nARB_vertex_blend enum:\n\tMAX_VERTEX_UNITS_ARB\t\t\t\t= 0x86A4\n\tACTIVE_VERTEX_UNITS_ARB\t\t\t\t= 0x86A5\n\tWEIGHT_SUM_UNITY_ARB\t\t\t\t= 0x86A6\n\tVERTEX_BLEND_ARB\t\t\t\t= 0x86A7\n\tCURRENT_WEIGHT_ARB\t\t\t\t= 0x86A8\n\tWEIGHT_ARRAY_TYPE_ARB\t\t\t\t= 0x86A9\n\tWEIGHT_ARRAY_STRIDE_ARB\t\t\t\t= 0x86AA\n\tWEIGHT_ARRAY_SIZE_ARB\t\t\t\t= 0x86AB\n\tWEIGHT_ARRAY_POINTER_ARB\t\t\t= 0x86AC\n\tWEIGHT_ARRAY_ARB\t\t\t\t= 0x86AD\n# Note: MODELVIEW0/1 are defined in other extensions, but not as ARB)\n\tMODELVIEW0_ARB\t\t\t\t\t= 0x1700\n\tMODELVIEW1_ARB\t\t\t\t\t= 0x850A\n\tMODELVIEW2_ARB\t\t\t\t\t= 0x8722\n\tMODELVIEW3_ARB\t\t\t\t\t= 0x8723\n\tMODELVIEW4_ARB\t\t\t\t\t= 0x8724\n\tMODELVIEW5_ARB\t\t\t\t\t= 0x8725\n\tMODELVIEW6_ARB\t\t\t\t\t= 0x8726\n\tMODELVIEW7_ARB\t\t\t\t\t= 0x8727\n\tMODELVIEW8_ARB\t\t\t\t\t= 0x8728\n\tMODELVIEW9_ARB\t\t\t\t\t= 0x8729\n\tMODELVIEW10_ARB\t\t\t\t\t= 0x872A\n\tMODELVIEW11_ARB\t\t\t\t\t= 0x872B\n\tMODELVIEW12_ARB\t\t\t\t\t= 0x872C\n\tMODELVIEW13_ARB\t\t\t\t\t= 0x872D\n\tMODELVIEW14_ARB\t\t\t\t\t= 0x872E\n\tMODELVIEW15_ARB\t\t\t\t\t= 0x872F\n\tMODELVIEW16_ARB\t\t\t\t\t= 0x8730\n\tMODELVIEW17_ARB\t\t\t\t\t= 0x8731\n\tMODELVIEW18_ARB\t\t\t\t\t= 0x8732\n\tMODELVIEW19_ARB\t\t\t\t\t= 0x8733\n\tMODELVIEW20_ARB\t\t\t\t\t= 0x8734\n\tMODELVIEW21_ARB\t\t\t\t\t= 0x8735\n\tMODELVIEW22_ARB\t\t\t\t\t= 0x8736\n\tMODELVIEW23_ARB\t\t\t\t\t= 0x8737\n\tMODELVIEW24_ARB\t\t\t\t\t= 0x8738\n\tMODELVIEW25_ARB\t\t\t\t\t= 0x8739\n\tMODELVIEW26_ARB\t\t\t\t\t= 0x873A\n\tMODELVIEW27_ARB\t\t\t\t\t= 0x873B\n\tMODELVIEW28_ARB\t\t\t\t\t= 0x873C\n\tMODELVIEW29_ARB\t\t\t\t\t= 0x873D\n\tMODELVIEW30_ARB\t\t\t\t\t= 0x873E\n\tMODELVIEW31_ARB\t\t\t\t\t= 0x873F\n\n# Aliases ARB_vertex_blend enums above\nOES_matrix_palette enum: (OpenGL ES only; additional; see below)\n\tMAX_VERTEX_UNITS_OES\t\t\t\t= 0x86A4\n\tWEIGHT_ARRAY_OES\t\t\t\t= 0x86AD\n\tWEIGHT_ARRAY_TYPE_OES\t\t\t\t= 0x86A9\n\tWEIGHT_ARRAY_STRIDE_OES\t\t\t\t= 0x86AA\n\tWEIGHT_ARRAY_SIZE_OES\t\t\t\t= 0x86AB\n\tWEIGHT_ARRAY_POINTER_OES\t\t\t= 0x86AC\n\nVERSION_1_3 enum: (Promoted for OpenGL 1.3)\n\tDOT3_RGB\t\t\t\t\t= 0x86AE\n\tDOT3_RGBA\t\t\t\t\t= 0x86AF\n\nARB_texture_env_dot3 enum:\n\tDOT3_RGB_ARB\t\t\t\t\t= 0x86AE\n\tDOT3_RGBA_ARB\t\t\t\t\t= 0x86AF\n\nIMG_texture_env_enhanced_fixed_function enum: (OpenGL ES only; additional; see below)\n\tDOT3_RGBA_IMG\t\t\t\t\t= 0x86AF\n\n###############################################################################\n\n# 3Dfx: 0x86B0-0x86BF\n\n3DFX_texture_compression_FXT1 enum:\n\tCOMPRESSED_RGB_FXT1_3DFX\t\t\t= 0x86B0\n\tCOMPRESSED_RGBA_FXT1_3DFX\t\t\t= 0x86B1\n\n3DFX_multisample enum:\n\tMULTISAMPLE_3DFX\t\t\t\t= 0x86B2\n\tSAMPLE_BUFFERS_3DFX\t\t\t\t= 0x86B3\n\tSAMPLES_3DFX\t\t\t\t\t= 0x86B4\n\tMULTISAMPLE_BIT_3DFX\t\t\t\t= 0x20000000\n\n# 3DFX_future_use: 0x86B5-0x86BF\n\n###############################################################################\n\n# NVIDIA: 0x86C0-0x871F\n\nNV_evaluators enum:\n\tEVAL_2D_NV\t\t\t\t\t= 0x86C0\n\tEVAL_TRIANGULAR_2D_NV\t\t\t\t= 0x86C1\n\tMAP_TESSELLATION_NV\t\t\t\t= 0x86C2\n\tMAP_ATTRIB_U_ORDER_NV\t\t\t\t= 0x86C3\n\tMAP_ATTRIB_V_ORDER_NV\t\t\t\t= 0x86C4\n\tEVAL_FRACTIONAL_TESSELLATION_NV\t\t\t= 0x86C5\n\tEVAL_VERTEX_ATRRIB0_NV\t\t\t\t= 0x86C6\n\tEVAL_VERTEX_ATRRIB1_NV\t\t\t\t= 0x86C7\n\tEVAL_VERTEX_ATRRIB2_NV\t\t\t\t= 0x86C8\n\tEVAL_VERTEX_ATRRIB3_NV\t\t\t\t= 0x86C9\n\tEVAL_VERTEX_ATRRIB4_NV\t\t\t\t= 0x86CA\n\tEVAL_VERTEX_ATRRIB5_NV\t\t\t\t= 0x86CB\n\tEVAL_VERTEX_ATRRIB6_NV\t\t\t\t= 0x86CC\n\tEVAL_VERTEX_ATRRIB7_NV\t\t\t\t= 0x86CD\n\tEVAL_VERTEX_ATRRIB8_NV\t\t\t\t= 0x86CE\n\tEVAL_VERTEX_ATRRIB9_NV\t\t\t\t= 0x86CF\n\tEVAL_VERTEX_ATRRIB10_NV\t\t\t\t= 0x86D0\n\tEVAL_VERTEX_ATRRIB11_NV\t\t\t\t= 0x86D1\n\tEVAL_VERTEX_ATRRIB12_NV\t\t\t\t= 0x86D2\n\tEVAL_VERTEX_ATRRIB13_NV\t\t\t\t= 0x86D3\n\tEVAL_VERTEX_ATRRIB14_NV\t\t\t\t= 0x86D4\n\tEVAL_VERTEX_ATRRIB15_NV\t\t\t\t= 0x86D5\n\tMAX_MAP_TESSELLATION_NV\t\t\t\t= 0x86D6\n\tMAX_RATIONAL_EVAL_ORDER_NV\t\t\t= 0x86D7\n\n# NV_future_use: 0x86D8\n\nNV_texture_shader enum:\n\tOFFSET_TEXTURE_RECTANGLE_NV\t\t\t= 0x864C\n\tOFFSET_TEXTURE_RECTANGLE_SCALE_NV\t\t= 0x864D\n\tDOT_PRODUCT_TEXTURE_RECTANGLE_NV\t\t= 0x864E\n\tRGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV\t\t= 0x86D9\n\tUNSIGNED_INT_S8_S8_8_8_NV\t\t\t= 0x86DA\n\tUNSIGNED_INT_8_8_S8_S8_REV_NV\t\t\t= 0x86DB\n\tDSDT_MAG_INTENSITY_NV\t\t\t\t= 0x86DC\n\tSHADER_CONSISTENT_NV\t\t\t\t= 0x86DD\n\tTEXTURE_SHADER_NV\t\t\t\t= 0x86DE\n\tSHADER_OPERATION_NV\t\t\t\t= 0x86DF\n\tCULL_MODES_NV\t\t\t\t\t= 0x86E0\n\tOFFSET_TEXTURE_MATRIX_NV\t\t\t= 0x86E1\n\tOFFSET_TEXTURE_SCALE_NV\t\t\t\t= 0x86E2\n\tOFFSET_TEXTURE_BIAS_NV\t\t\t\t= 0x86E3\n\tOFFSET_TEXTURE_2D_MATRIX_NV\t\t\t= GL_OFFSET_TEXTURE_MATRIX_NV\n\tOFFSET_TEXTURE_2D_SCALE_NV\t\t\t= GL_OFFSET_TEXTURE_SCALE_NV\n\tOFFSET_TEXTURE_2D_BIAS_NV\t\t\t= GL_OFFSET_TEXTURE_BIAS_NV\n\tPREVIOUS_TEXTURE_INPUT_NV\t\t\t= 0x86E4\n\tCONST_EYE_NV\t\t\t\t\t= 0x86E5\n\tPASS_THROUGH_NV\t\t\t\t\t= 0x86E6\n\tCULL_FRAGMENT_NV\t\t\t\t= 0x86E7\n\tOFFSET_TEXTURE_2D_NV\t\t\t\t= 0x86E8\n\tDEPENDENT_AR_TEXTURE_2D_NV\t\t\t= 0x86E9\n\tDEPENDENT_GB_TEXTURE_2D_NV\t\t\t= 0x86EA\n\tDOT_PRODUCT_NV\t\t\t\t\t= 0x86EC\n\tDOT_PRODUCT_DEPTH_REPLACE_NV\t\t\t= 0x86ED\n\tDOT_PRODUCT_TEXTURE_2D_NV\t\t\t= 0x86EE\n\tDOT_PRODUCT_TEXTURE_CUBE_MAP_NV\t\t\t= 0x86F0\n\tDOT_PRODUCT_DIFFUSE_CUBE_MAP_NV\t\t\t= 0x86F1\n\tDOT_PRODUCT_REFLECT_CUBE_MAP_NV\t\t\t= 0x86F2\n\tDOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV\t= 0x86F3\n\tHILO_NV\t\t\t\t\t\t= 0x86F4\n\tDSDT_NV\t\t\t\t\t\t= 0x86F5\n\tDSDT_MAG_NV\t\t\t\t\t= 0x86F6\n\tDSDT_MAG_VIB_NV\t\t\t\t\t= 0x86F7\n\tHILO16_NV\t\t\t\t\t= 0x86F8\n\tSIGNED_HILO_NV\t\t\t\t\t= 0x86F9\n\tSIGNED_HILO16_NV\t\t\t\t= 0x86FA\n\tSIGNED_RGBA_NV\t\t\t\t\t= 0x86FB\n\tSIGNED_RGBA8_NV\t\t\t\t\t= 0x86FC\n\tSIGNED_RGB_NV\t\t\t\t\t= 0x86FE\n\tSIGNED_RGB8_NV\t\t\t\t\t= 0x86FF\n\tSIGNED_LUMINANCE_NV\t\t\t\t= 0x8701\n\tSIGNED_LUMINANCE8_NV\t\t\t\t= 0x8702\n\tSIGNED_LUMINANCE_ALPHA_NV\t\t\t= 0x8703\n\tSIGNED_LUMINANCE8_ALPHA8_NV\t\t\t= 0x8704\n\tSIGNED_ALPHA_NV\t\t\t\t\t= 0x8705\n\tSIGNED_ALPHA8_NV\t\t\t\t= 0x8706\n\tSIGNED_INTENSITY_NV\t\t\t\t= 0x8707\n\tSIGNED_INTENSITY8_NV\t\t\t\t= 0x8708\n\tDSDT8_NV\t\t\t\t\t= 0x8709\n\tDSDT8_MAG8_NV\t\t\t\t\t= 0x870A\n\tDSDT8_MAG8_INTENSITY8_NV\t\t\t= 0x870B\n\tSIGNED_RGB_UNSIGNED_ALPHA_NV\t\t\t= 0x870C\n\tSIGNED_RGB8_UNSIGNED_ALPHA8_NV\t\t\t= 0x870D\n\tHI_SCALE_NV\t\t\t\t\t= 0x870E\n\tLO_SCALE_NV\t\t\t\t\t= 0x870F\n\tDS_SCALE_NV\t\t\t\t\t= 0x8710\n\tDT_SCALE_NV\t\t\t\t\t= 0x8711\n\tMAGNITUDE_SCALE_NV\t\t\t\t= 0x8712\n\tVIBRANCE_SCALE_NV\t\t\t\t= 0x8713\n\tHI_BIAS_NV\t\t\t\t\t= 0x8714\n\tLO_BIAS_NV\t\t\t\t\t= 0x8715\n\tDS_BIAS_NV\t\t\t\t\t= 0x8716\n\tDT_BIAS_NV\t\t\t\t\t= 0x8717\n\tMAGNITUDE_BIAS_NV\t\t\t\t= 0x8718\n\tVIBRANCE_BIAS_NV\t\t\t\t= 0x8719\n\tTEXTURE_BORDER_VALUES_NV\t\t\t= 0x871A\n\tTEXTURE_HI_SIZE_NV\t\t\t\t= 0x871B\n\tTEXTURE_LO_SIZE_NV\t\t\t\t= 0x871C\n\tTEXTURE_DS_SIZE_NV\t\t\t\t= 0x871D\n\tTEXTURE_DT_SIZE_NV\t\t\t\t= 0x871E\n\tTEXTURE_MAG_SIZE_NV\t\t\t\t= 0x871F\n\nNV_texture_shader2 enum:\n\tDOT_PRODUCT_TEXTURE_3D_NV\t\t\t= 0x86EF\n\n# NV_future_use: 0x86EB\n# NV_future_use: 0x86FD\n# NV_future_use: 0x8700\n\n###############################################################################\n\n# OpenGL ARB: 0x8720-0x873F\n\n# ARB_vertex_blend (additional; see above): 0x8720-0x873F\n\n###############################################################################\n\n# ATI: 0x8740-0x874F\n\nEXT_texture_env_dot3 enum:\n\tDOT3_RGB_EXT\t\t\t\t\t= 0x8740\n\tDOT3_RGBA_EXT\t\t\t\t\t= 0x8741\n\n# There's a collision between AMD_program_binary_Z400 and EXT_texture_env_dot3!\nAMD_program_binary_Z400 enum: (OpenGL ES only)\n\tZ400_BINARY_AMD\t\t\t\t\t= 0x8740\n\n# There's a collision between OES_get_program_binary and EXT_texture_env_dot3!\nOES_get_program_binary enum: (OpenGL ES only; additional; see below)\n\tPROGRAM_BINARY_LENGTH_OES\t\t\t= 0x8741\n\nATI_texture_mirror_once enum:\n\tMIRROR_CLAMP_ATI\t\t\t\t= 0x8742\n\tMIRROR_CLAMP_TO_EDGE_ATI\t\t\t= 0x8743\n\nEXT_texture_mirror_clamp enum:\n\tMIRROR_CLAMP_EXT\t\t\t\t= 0x8742\n\tMIRROR_CLAMP_TO_EDGE_EXT\t\t\t= 0x8743\n\nATI_texture_env_combine3 enum:\n\tMODULATE_ADD_ATI\t\t\t\t= 0x8744\n\tMODULATE_SIGNED_ADD_ATI\t\t\t\t= 0x8745\n\tMODULATE_SUBTRACT_ATI\t\t\t\t= 0x8746\n\n# ATI_future_use: 0x8747-0x874F\n\n###############################################################################\n\n# MESA: 0x8750-0x875F\n\nMESA_packed_depth_stencil enum:\n\tDEPTH_STENCIL_MESA\t\t\t\t= 0x8750\n\tUNSIGNED_INT_24_8_MESA\t\t\t\t= 0x8751\n\tUNSIGNED_INT_8_24_REV_MESA\t\t\t= 0x8752\n\tUNSIGNED_SHORT_15_1_MESA\t\t\t= 0x8753\n\tUNSIGNED_SHORT_1_15_REV_MESA\t\t\t= 0x8754\n\nMESA_trace enum:\n\tTRACE_ALL_BITS_MESA\t\t\t\t= 0xFFFF\n\tTRACE_OPERATIONS_BIT_MESA\t\t\t= 0x0001\n\tTRACE_PRIMITIVES_BIT_MESA\t\t\t= 0x0002\n\tTRACE_ARRAYS_BIT_MESA\t\t\t\t= 0x0004\n\tTRACE_TEXTURES_BIT_MESA\t\t\t\t= 0x0008\n\tTRACE_PIXELS_BIT_MESA\t\t\t\t= 0x0010\n\tTRACE_ERRORS_BIT_MESA\t\t\t\t= 0x0020\n\tTRACE_MASK_MESA\t\t\t\t\t= 0x8755\n\tTRACE_NAME_MESA\t\t\t\t\t= 0x8756\n\nMESA_ycbcr_texture enum:\n\tYCBCR_MESA\t\t\t\t\t= 0x8757\n\nMESA_pack_invert enum:\n\tPACK_INVERT_MESA\t\t\t\t= 0x8758\n\nMESAX_texture_stack enum:\n\tTEXTURE_1D_STACK_MESAX\t\t\t\t= 0x8759\n\tTEXTURE_2D_STACK_MESAX\t\t\t\t= 0x875A\n\tPROXY_TEXTURE_1D_STACK_MESAX\t\t\t= 0x875B\n\tPROXY_TEXTURE_2D_STACK_MESAX\t\t\t= 0x875C\n\tTEXTURE_1D_STACK_BINDING_MESAX\t\t\t= 0x875D\n\tTEXTURE_2D_STACK_BINDING_MESAX\t\t\t= 0x875E\n\nMESA_shader_debug enum:\n\tDEBUG_OBJECT_MESA\t\t\t\t= 0x8759\n\tDEBUG_PRINT_MESA\t\t\t\t= 0x875A\n\tDEBUG_ASSERT_MESA\t\t\t\t= 0x875B\n\n# MESA_future_use: 0x875F\n\n###############################################################################\n\n# ATI: 0x8760-0x883F\n\nATI_vertex_array_object enum:\n\tSTATIC_ATI\t\t\t\t\t= 0x8760\n\tDYNAMIC_ATI\t\t\t\t\t= 0x8761\n\tPRESERVE_ATI\t\t\t\t\t= 0x8762\n\tDISCARD_ATI\t\t\t\t\t= 0x8763\n\tOBJECT_BUFFER_SIZE_ATI\t\t\t\t= 0x8764\n\tOBJECT_BUFFER_USAGE_ATI\t\t\t\t= 0x8765\n\tARRAY_OBJECT_BUFFER_ATI\t\t\t\t= 0x8766\n\tARRAY_OBJECT_OFFSET_ATI\t\t\t\t= 0x8767\n\nVERSION_1_5 enum: (Promoted for OpenGL 1.5)\n\tBUFFER_SIZE\t\t\t\t\t= 0x8764\n\tBUFFER_USAGE\t\t\t\t\t= 0x8765\n\nARB_vertex_buffer_object enum: (additional; aliases some ATI enums; see below)\n\tBUFFER_SIZE_ARB\t\t\t\t\t= 0x8764\n\tBUFFER_USAGE_ARB\t\t\t\t= 0x8765\n\nATI_element_array enum:\n\tELEMENT_ARRAY_ATI\t\t\t\t= 0x8768\n\tELEMENT_ARRAY_TYPE_ATI\t\t\t\t= 0x8769\n\tELEMENT_ARRAY_POINTER_ATI\t\t\t= 0x876A\n\n# @@@ (extends ATI_element_array, I think???)\nAPPLE_element_array enum:\n\tELEMENT_ARRAY_APPLE\t\t\t\t= 0x8768\n\tELEMENT_ARRAY_TYPE_APPLE\t\t\t= 0x8769\n\tELEMENT_ARRAY_POINTER_APPLE\t\t\t= 0x876A\n\nATI_vertex_streams enum:\n\tMAX_VERTEX_STREAMS_ATI\t\t\t\t= 0x876B\n\tVERTEX_STREAM0_ATI\t\t\t\t= 0x876C\n\tVERTEX_STREAM1_ATI\t\t\t\t= 0x876D\n\tVERTEX_STREAM2_ATI\t\t\t\t= 0x876E\n\tVERTEX_STREAM3_ATI\t\t\t\t= 0x876F\n\tVERTEX_STREAM4_ATI\t\t\t\t= 0x8770\n\tVERTEX_STREAM5_ATI\t\t\t\t= 0x8771\n\tVERTEX_STREAM6_ATI\t\t\t\t= 0x8772\n\tVERTEX_STREAM7_ATI\t\t\t\t= 0x8773\n\tVERTEX_SOURCE_ATI\t\t\t\t= 0x8774\n\nATI_envmap_bumpmap enum:\n\tBUMP_ROT_MATRIX_ATI\t\t\t\t= 0x8775\n\tBUMP_ROT_MATRIX_SIZE_ATI\t\t\t= 0x8776\n\tBUMP_NUM_TEX_UNITS_ATI\t\t\t\t= 0x8777\n\tBUMP_TEX_UNITS_ATI\t\t\t\t= 0x8778\n\tDUDV_ATI\t\t\t\t\t= 0x8779\n\tDU8DV8_ATI\t\t\t\t\t= 0x877A\n\tBUMP_ENVMAP_ATI\t\t\t\t\t= 0x877B\n\tBUMP_TARGET_ATI\t\t\t\t\t= 0x877C\n\n# ATI_future_use: 0x877D-0x877F\n\nEXT_vertex_shader enum:\n\tVERTEX_SHADER_EXT\t\t\t\t= 0x8780\n\tVERTEX_SHADER_BINDING_EXT\t\t\t= 0x8781\n\tOP_INDEX_EXT\t\t\t\t\t= 0x8782\n\tOP_NEGATE_EXT\t\t\t\t\t= 0x8783\n\tOP_DOT3_EXT\t\t\t\t\t= 0x8784\n\tOP_DOT4_EXT\t\t\t\t\t= 0x8785\n\tOP_MUL_EXT\t\t\t\t\t= 0x8786\n\tOP_ADD_EXT\t\t\t\t\t= 0x8787\n\tOP_MADD_EXT\t\t\t\t\t= 0x8788\n\tOP_FRAC_EXT\t\t\t\t\t= 0x8789\n\tOP_MAX_EXT\t\t\t\t\t= 0x878A\n\tOP_MIN_EXT\t\t\t\t\t= 0x878B\n\tOP_SET_GE_EXT\t\t\t\t\t= 0x878C\n\tOP_SET_LT_EXT\t\t\t\t\t= 0x878D\n\tOP_CLAMP_EXT\t\t\t\t\t= 0x878E\n\tOP_FLOOR_EXT\t\t\t\t\t= 0x878F\n\tOP_ROUND_EXT\t\t\t\t\t= 0x8790\n\tOP_EXP_BASE_2_EXT\t\t\t\t= 0x8791\n\tOP_LOG_BASE_2_EXT\t\t\t\t= 0x8792\n\tOP_POWER_EXT\t\t\t\t\t= 0x8793\n\tOP_RECIP_EXT\t\t\t\t\t= 0x8794\n\tOP_RECIP_SQRT_EXT\t\t\t\t= 0x8795\n\tOP_SUB_EXT\t\t\t\t\t= 0x8796\n\tOP_CROSS_PRODUCT_EXT\t\t\t\t= 0x8797\n\tOP_MULTIPLY_MATRIX_EXT\t\t\t\t= 0x8798\n\tOP_MOV_EXT\t\t\t\t\t= 0x8799\n\tOUTPUT_VERTEX_EXT\t\t\t\t= 0x879A\n\tOUTPUT_COLOR0_EXT\t\t\t\t= 0x879B\n\tOUTPUT_COLOR1_EXT\t\t\t\t= 0x879C\n\tOUTPUT_TEXTURE_COORD0_EXT\t\t\t= 0x879D\n\tOUTPUT_TEXTURE_COORD1_EXT\t\t\t= 0x879E\n\tOUTPUT_TEXTURE_COORD2_EXT\t\t\t= 0x879F\n\tOUTPUT_TEXTURE_COORD3_EXT\t\t\t= 0x87A0\n\tOUTPUT_TEXTURE_COORD4_EXT\t\t\t= 0x87A1\n\tOUTPUT_TEXTURE_COORD5_EXT\t\t\t= 0x87A2\n\tOUTPUT_TEXTURE_COORD6_EXT\t\t\t= 0x87A3\n\tOUTPUT_TEXTURE_COORD7_EXT\t\t\t= 0x87A4\n\tOUTPUT_TEXTURE_COORD8_EXT\t\t\t= 0x87A5\n\tOUTPUT_TEXTURE_COORD9_EXT\t\t\t= 0x87A6\n\tOUTPUT_TEXTURE_COORD10_EXT\t\t\t= 0x87A7\n\tOUTPUT_TEXTURE_COORD11_EXT\t\t\t= 0x87A8\n\tOUTPUT_TEXTURE_COORD12_EXT\t\t\t= 0x87A9\n\tOUTPUT_TEXTURE_COORD13_EXT\t\t\t= 0x87AA\n\tOUTPUT_TEXTURE_COORD14_EXT\t\t\t= 0x87AB\n\tOUTPUT_TEXTURE_COORD15_EXT\t\t\t= 0x87AC\n\tOUTPUT_TEXTURE_COORD16_EXT\t\t\t= 0x87AD\n\tOUTPUT_TEXTURE_COORD17_EXT\t\t\t= 0x87AE\n\tOUTPUT_TEXTURE_COORD18_EXT\t\t\t= 0x87AF\n\tOUTPUT_TEXTURE_COORD19_EXT\t\t\t= 0x87B0\n\tOUTPUT_TEXTURE_COORD20_EXT\t\t\t= 0x87B1\n\tOUTPUT_TEXTURE_COORD21_EXT\t\t\t= 0x87B2\n\tOUTPUT_TEXTURE_COORD22_EXT\t\t\t= 0x87B3\n\tOUTPUT_TEXTURE_COORD23_EXT\t\t\t= 0x87B4\n\tOUTPUT_TEXTURE_COORD24_EXT\t\t\t= 0x87B5\n\tOUTPUT_TEXTURE_COORD25_EXT\t\t\t= 0x87B6\n\tOUTPUT_TEXTURE_COORD26_EXT\t\t\t= 0x87B7\n\tOUTPUT_TEXTURE_COORD27_EXT\t\t\t= 0x87B8\n\tOUTPUT_TEXTURE_COORD28_EXT\t\t\t= 0x87B9\n\tOUTPUT_TEXTURE_COORD29_EXT\t\t\t= 0x87BA\n\tOUTPUT_TEXTURE_COORD30_EXT\t\t\t= 0x87BB\n\tOUTPUT_TEXTURE_COORD31_EXT\t\t\t= 0x87BC\n\tOUTPUT_FOG_EXT\t\t\t\t\t= 0x87BD\n\tSCALAR_EXT\t\t\t\t\t= 0x87BE\n\tVECTOR_EXT\t\t\t\t\t= 0x87BF\n\tMATRIX_EXT\t\t\t\t\t= 0x87C0\n\tVARIANT_EXT\t\t\t\t\t= 0x87C1\n\tINVARIANT_EXT\t\t\t\t\t= 0x87C2\n\tLOCAL_CONSTANT_EXT\t\t\t\t= 0x87C3\n\tLOCAL_EXT\t\t\t\t\t= 0x87C4\n\tMAX_VERTEX_SHADER_INSTRUCTIONS_EXT\t\t= 0x87C5\n\tMAX_VERTEX_SHADER_VARIANTS_EXT\t\t\t= 0x87C6\n\tMAX_VERTEX_SHADER_INVARIANTS_EXT\t\t= 0x87C7\n\tMAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT\t\t= 0x87C8\n\tMAX_VERTEX_SHADER_LOCALS_EXT\t\t\t= 0x87C9\n\tMAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT\t= 0x87CA\n\tMAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT\t= 0x87CB\n\tMAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = 0x87CC\n\tMAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT\t= 0x87CD\n\tMAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT\t\t= 0x87CE\n\tVERTEX_SHADER_INSTRUCTIONS_EXT\t\t\t= 0x87CF\n\tVERTEX_SHADER_VARIANTS_EXT\t\t\t= 0x87D0\n\tVERTEX_SHADER_INVARIANTS_EXT\t\t\t= 0x87D1\n\tVERTEX_SHADER_LOCAL_CONSTANTS_EXT\t\t= 0x87D2\n\tVERTEX_SHADER_LOCALS_EXT\t\t\t= 0x87D3\n\tVERTEX_SHADER_OPTIMIZED_EXT\t\t\t= 0x87D4\n\tX_EXT\t\t\t\t\t\t= 0x87D5\n\tY_EXT\t\t\t\t\t\t= 0x87D6\n\tZ_EXT\t\t\t\t\t\t= 0x87D7\n\tW_EXT\t\t\t\t\t\t= 0x87D8\n\tNEGATIVE_X_EXT\t\t\t\t\t= 0x87D9\n\tNEGATIVE_Y_EXT\t\t\t\t\t= 0x87DA\n\tNEGATIVE_Z_EXT\t\t\t\t\t= 0x87DB\n\tNEGATIVE_W_EXT\t\t\t\t\t= 0x87DC\n\tZERO_EXT\t\t\t\t\t= 0x87DD\n\tONE_EXT\t\t\t\t\t\t= 0x87DE\n\tNEGATIVE_ONE_EXT\t\t\t\t= 0x87DF\n\tNORMALIZED_RANGE_EXT\t\t\t\t= 0x87E0\n\tFULL_RANGE_EXT\t\t\t\t\t= 0x87E1\n\tCURRENT_VERTEX_EXT\t\t\t\t= 0x87E2\n\tMVP_MATRIX_EXT\t\t\t\t\t= 0x87E3\n\tVARIANT_VALUE_EXT\t\t\t\t= 0x87E4\n\tVARIANT_DATATYPE_EXT\t\t\t\t= 0x87E5\n\tVARIANT_ARRAY_STRIDE_EXT\t\t\t= 0x87E6\n\tVARIANT_ARRAY_TYPE_EXT\t\t\t\t= 0x87E7\n\tVARIANT_ARRAY_EXT\t\t\t\t= 0x87E8\n\tVARIANT_ARRAY_POINTER_EXT\t\t\t= 0x87E9\n\tINVARIANT_VALUE_EXT\t\t\t\t= 0x87EA\n\tINVARIANT_DATATYPE_EXT\t\t\t\t= 0x87EB\n\tLOCAL_CONSTANT_VALUE_EXT\t\t\t= 0x87EC\n\tLOCAL_CONSTANT_DATATYPE_EXT\t\t\t= 0x87ED\n\nAMD_compressed_ATC_texture enum: (OpenGL ES only) (additional; see below)\n\tATC_RGBA_INTERPOLATED_ALPHA_AMD\t\t\t= 0x87EE\n\nATI_pn_triangles enum:\n\tPN_TRIANGLES_ATI\t\t\t\t= 0x87F0\n\tMAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI\t\t= 0x87F1\n\tPN_TRIANGLES_POINT_MODE_ATI\t\t\t= 0x87F2\n\tPN_TRIANGLES_NORMAL_MODE_ATI\t\t\t= 0x87F3\n\tPN_TRIANGLES_TESSELATION_LEVEL_ATI\t\t= 0x87F4\n\tPN_TRIANGLES_POINT_MODE_LINEAR_ATI\t\t= 0x87F5\n\tPN_TRIANGLES_POINT_MODE_CUBIC_ATI\t\t= 0x87F6\n\tPN_TRIANGLES_NORMAL_MODE_LINEAR_ATI\t\t= 0x87F7\n\tPN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI\t\t= 0x87F8\n\nAMD_compressed_3DC_texture enum: (OpenGL ES only)\n\t3DC_X_AMD\t\t\t\t\t= 0x87F9\n\t3DC_XY_AMD\t\t\t\t\t= 0x87FA\n\nATI_meminfo enum:\n\tVBO_FREE_MEMORY_ATI\t\t\t\t= 0x87FB\n\tTEXTURE_FREE_MEMORY_ATI\t\t\t\t= 0x87FC\n\tRENDERBUFFER_FREE_MEMORY_ATI\t\t\t= 0x87FD\n\nOES_get_program_binary enum: (OpenGL ES only;\n\tNUM_PROGRAM_BINARY_FORMATS_OES\t\t\t= 0x87FE\n\tPROGRAM_BINARY_FORMATS_OES\t\t\t= 0x87FF\n\nVERSION_2_0 enum: (Promoted for OpenGL 2.0)\n\tSTENCIL_BACK_FUNC\t\t\t\t= 0x8800    # VERSION_2_0\n\tSTENCIL_BACK_FAIL\t\t\t\t= 0x8801    # VERSION_2_0\n\tSTENCIL_BACK_PASS_DEPTH_FAIL\t\t\t= 0x8802    # VERSION_2_0\n\tSTENCIL_BACK_PASS_DEPTH_PASS\t\t\t= 0x8803    # VERSION_2_0\n\tSTENCIL_BACK_FAIL_ATI\t\t\t\t= 0x8801\n\nATI_separate_stencil enum:\n\tSTENCIL_BACK_FUNC_ATI\t\t\t\t= 0x8800\n\tSTENCIL_BACK_PASS_DEPTH_FAIL_ATI\t\t= 0x8802\n\tSTENCIL_BACK_PASS_DEPTH_PASS_ATI\t\t= 0x8803\n\nARB_fragment_program enum:\n\tFRAGMENT_PROGRAM_ARB\t\t\t\t= 0x8804\n\tPROGRAM_ALU_INSTRUCTIONS_ARB\t\t\t= 0x8805\n\tPROGRAM_TEX_INSTRUCTIONS_ARB\t\t\t= 0x8806\n\tPROGRAM_TEX_INDIRECTIONS_ARB\t\t\t= 0x8807\n\tPROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB\t\t= 0x8808\n\tPROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB\t\t= 0x8809\n\tPROGRAM_NATIVE_TEX_INDIRECTIONS_ARB\t\t= 0x880A\n\tMAX_PROGRAM_ALU_INSTRUCTIONS_ARB\t\t= 0x880B\n\tMAX_PROGRAM_TEX_INSTRUCTIONS_ARB\t\t= 0x880C\n\tMAX_PROGRAM_TEX_INDIRECTIONS_ARB\t\t= 0x880D\n\tMAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB\t\t= 0x880E\n\tMAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB\t\t= 0x880F\n\tMAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB\t\t= 0x8810\n\n# ATI_future_use: 0x8811-0x8813\n\nVERSION_3_0 enum:\n\tRGBA32F\t\t\t\t\t\t= 0x8814    # VERSION_3_0\n\tRGB32F\t\t\t\t\t\t= 0x8815    # VERSION_3_0\n\tRGBA16F\t\t\t\t\t\t= 0x881A    # VERSION_3_0\n\tRGB16F\t\t\t\t\t\t= 0x881B    # VERSION_3_0\n\nARB_texture_float enum:\n\tRGBA32F_ARB\t\t\t\t\t= 0x8814\n\tRGB32F_ARB\t\t\t\t\t= 0x8815\n\tALPHA32F_ARB\t\t\t\t\t= 0x8816\n\tINTENSITY32F_ARB\t\t\t\t= 0x8817\n\tLUMINANCE32F_ARB\t\t\t\t= 0x8818\n\tLUMINANCE_ALPHA32F_ARB\t\t\t\t= 0x8819\n\tRGBA16F_ARB\t\t\t\t\t= 0x881A\n\tRGB16F_ARB\t\t\t\t\t= 0x881B\n\tALPHA16F_ARB\t\t\t\t\t= 0x881C\n\tINTENSITY16F_ARB\t\t\t\t= 0x881D\n\tLUMINANCE16F_ARB\t\t\t\t= 0x881E\n\tLUMINANCE_ALPHA16F_ARB\t\t\t\t= 0x881F\n\nATI_texture_float enum:\n\tRGBA_FLOAT32_ATI\t\t\t\t= 0x8814\n\tRGB_FLOAT32_ATI\t\t\t\t\t= 0x8815\n\tALPHA_FLOAT32_ATI\t\t\t\t= 0x8816\n\tINTENSITY_FLOAT32_ATI\t\t\t\t= 0x8817\n\tLUMINANCE_FLOAT32_ATI\t\t\t\t= 0x8818\n\tLUMINANCE_ALPHA_FLOAT32_ATI\t\t\t= 0x8819\n\tRGBA_FLOAT16_ATI\t\t\t\t= 0x881A\n\tRGB_FLOAT16_ATI\t\t\t\t\t= 0x881B\n\tALPHA_FLOAT16_ATI\t\t\t\t= 0x881C\n\tINTENSITY_FLOAT16_ATI\t\t\t\t= 0x881D\n\tLUMINANCE_FLOAT16_ATI\t\t\t\t= 0x881E\n\tLUMINANCE_ALPHA_FLOAT16_ATI\t\t\t= 0x881F\n\nAPPLE_float_pixels enum: (additional; see below)\n\tRGBA_FLOAT32_APPLE\t\t\t\t= 0x8814\n\tRGB_FLOAT32_APPLE\t\t\t\t= 0x8815\n\tALPHA_FLOAT32_APPLE\t\t\t\t= 0x8816\n\tINTENSITY_FLOAT32_APPLE\t\t\t\t= 0x8817\n\tLUMINANCE_FLOAT32_APPLE\t\t\t\t= 0x8818\n\tLUMINANCE_ALPHA_FLOAT32_APPLE\t\t\t= 0x8819\n\tRGBA_FLOAT16_APPLE\t\t\t\t= 0x881A\n\tRGB_FLOAT16_APPLE\t\t\t\t= 0x881B\n\tALPHA_FLOAT16_APPLE\t\t\t\t= 0x881C\n\tINTENSITY_FLOAT16_APPLE\t\t\t\t= 0x881D\n\tLUMINANCE_FLOAT16_APPLE\t\t\t\t= 0x881E\n\tLUMINANCE_ALPHA_FLOAT16_APPLE\t\t\t= 0x881F\n\nARB_color_buffer_float enum:\n\tRGBA_FLOAT_MODE_ARB\t\t\t\t= 0x8820    # Equivalent to TYPE_RGBA_FLOAT_ATI\n\nATI_pixel_format_float enum: (really WGL_ATI_pixel_format_float)\n\tTYPE_RGBA_FLOAT_ATI\t\t\t\t= 0x8820\n\n# ATI_future_use: 0x8821-0x8822\n\nQCOM_writeonly_rendering enum: (OpenGL ES only)\n\tWRITEONLY_RENDERING_QCOM\t\t\t= 0x8823\n\nVERSION_2_0 enum: (Promoted for OpenGL 2.0)\n\tMAX_DRAW_BUFFERS\t\t\t\t= 0x8824    # VERSION_2_0\n\tDRAW_BUFFER0\t\t\t\t\t= 0x8825    # VERSION_2_0\n\tDRAW_BUFFER1\t\t\t\t\t= 0x8826    # VERSION_2_0\n\tDRAW_BUFFER2\t\t\t\t\t= 0x8827    # VERSION_2_0\n\tDRAW_BUFFER3\t\t\t\t\t= 0x8828    # VERSION_2_0\n\tDRAW_BUFFER4\t\t\t\t\t= 0x8829    # VERSION_2_0\n\tDRAW_BUFFER5\t\t\t\t\t= 0x882A    # VERSION_2_0\n\tDRAW_BUFFER6\t\t\t\t\t= 0x882B    # VERSION_2_0\n\tDRAW_BUFFER7\t\t\t\t\t= 0x882C    # VERSION_2_0\n\tDRAW_BUFFER8\t\t\t\t\t= 0x882D    # VERSION_2_0\n\tDRAW_BUFFER9\t\t\t\t\t= 0x882E    # VERSION_2_0\n\tDRAW_BUFFER10\t\t\t\t\t= 0x882F    # VERSION_2_0\n\tDRAW_BUFFER11\t\t\t\t\t= 0x8830    # VERSION_2_0\n\tDRAW_BUFFER12\t\t\t\t\t= 0x8831    # VERSION_2_0\n\tDRAW_BUFFER13\t\t\t\t\t= 0x8832    # VERSION_2_0\n\tDRAW_BUFFER14\t\t\t\t\t= 0x8833    # VERSION_2_0\n\tDRAW_BUFFER15\t\t\t\t\t= 0x8834    # VERSION_2_0\n\nARB_draw_buffers enum:\n\tMAX_DRAW_BUFFERS_ARB\t\t\t\t= 0x8824\n\tDRAW_BUFFER0_ARB\t\t\t\t= 0x8825\n\tDRAW_BUFFER1_ARB\t\t\t\t= 0x8826\n\tDRAW_BUFFER2_ARB\t\t\t\t= 0x8827\n\tDRAW_BUFFER3_ARB\t\t\t\t= 0x8828\n\tDRAW_BUFFER4_ARB\t\t\t\t= 0x8829\n\tDRAW_BUFFER5_ARB\t\t\t\t= 0x882A\n\tDRAW_BUFFER6_ARB\t\t\t\t= 0x882B\n\tDRAW_BUFFER7_ARB\t\t\t\t= 0x882C\n\tDRAW_BUFFER8_ARB\t\t\t\t= 0x882D\n\tDRAW_BUFFER9_ARB\t\t\t\t= 0x882E\n\tDRAW_BUFFER10_ARB\t\t\t\t= 0x882F\n\tDRAW_BUFFER11_ARB\t\t\t\t= 0x8830\n\tDRAW_BUFFER12_ARB\t\t\t\t= 0x8831\n\tDRAW_BUFFER13_ARB\t\t\t\t= 0x8832\n\tDRAW_BUFFER14_ARB\t\t\t\t= 0x8833\n\tDRAW_BUFFER15_ARB\t\t\t\t= 0x8834\n\nATI_draw_buffers enum:\n\tMAX_DRAW_BUFFERS_ATI\t\t\t\t= 0x8824\n\tDRAW_BUFFER0_ATI\t\t\t\t= 0x8825\n\tDRAW_BUFFER1_ATI\t\t\t\t= 0x8826\n\tDRAW_BUFFER2_ATI\t\t\t\t= 0x8827\n\tDRAW_BUFFER3_ATI\t\t\t\t= 0x8828\n\tDRAW_BUFFER4_ATI\t\t\t\t= 0x8829\n\tDRAW_BUFFER5_ATI\t\t\t\t= 0x882A\n\tDRAW_BUFFER6_ATI\t\t\t\t= 0x882B\n\tDRAW_BUFFER7_ATI\t\t\t\t= 0x882C\n\tDRAW_BUFFER8_ATI\t\t\t\t= 0x882D\n\tDRAW_BUFFER9_ATI\t\t\t\t= 0x882E\n\tDRAW_BUFFER10_ATI\t\t\t\t= 0x882F\n\tDRAW_BUFFER11_ATI\t\t\t\t= 0x8830\n\tDRAW_BUFFER12_ATI\t\t\t\t= 0x8831\n\tDRAW_BUFFER13_ATI\t\t\t\t= 0x8832\n\tDRAW_BUFFER14_ATI\t\t\t\t= 0x8833\n\tDRAW_BUFFER15_ATI\t\t\t\t= 0x8834\n\nATI_pixel_format_float enum: (really WGL_ATI_pixel_format_float) (additional; see above)\n\tCOLOR_CLEAR_UNCLAMPED_VALUE_ATI\t\t\t= 0x8835\n\n# ATI_future_use: 0x8836-0x883F\n\nVERSION_2_0 enum: (Promoted for OpenGL 2.0)\n\tBLEND_EQUATION_ALPHA\t\t\t\t= 0x883D    # VERSION_2_0\n\nEXT_blend_equation_separate enum:\n\tBLEND_EQUATION_ALPHA_EXT\t\t\t= 0x883D\n\n# Aliases EXT_blend_equation_separate enum above\nOES_blend_equation_separate enum: (OpenGL ES only)\n\tBLEND_EQUATION_ALPHA_OES\t\t\t= 0x883D\n\n###############################################################################\n\n# OpenGL ARB: 0x8840-0x884F\n\nARB_matrix_palette enum:\n\tMATRIX_PALETTE_ARB\t\t\t\t= 0x8840\n\tMAX_MATRIX_PALETTE_STACK_DEPTH_ARB\t\t= 0x8841\n\tMAX_PALETTE_MATRICES_ARB\t\t\t= 0x8842\n\tCURRENT_PALETTE_MATRIX_ARB\t\t\t= 0x8843\n\tMATRIX_INDEX_ARRAY_ARB\t\t\t\t= 0x8844\n\tCURRENT_MATRIX_INDEX_ARB\t\t\t= 0x8845\n\tMATRIX_INDEX_ARRAY_SIZE_ARB\t\t\t= 0x8846\n\tMATRIX_INDEX_ARRAY_TYPE_ARB\t\t\t= 0x8847\n\tMATRIX_INDEX_ARRAY_STRIDE_ARB\t\t\t= 0x8848\n\tMATRIX_INDEX_ARRAY_POINTER_ARB\t\t\t= 0x8849\n\n# Aliases ARB_matrix_palette enums above\nOES_matrix_palette enum: (OpenGL ES only; additional; see below)\n\tMATRIX_PALETTE_OES\t\t\t\t= 0x8840\n\tMAX_PALETTE_MATRICES_OES\t\t\t= 0x8842\n\tCURRENT_PALETTE_MATRIX_OES\t\t\t= 0x8843\n\tMATRIX_INDEX_ARRAY_OES\t\t\t\t= 0x8844\n\tMATRIX_INDEX_ARRAY_SIZE_OES\t\t\t= 0x8846\n\tMATRIX_INDEX_ARRAY_TYPE_OES\t\t\t= 0x8847\n\tMATRIX_INDEX_ARRAY_STRIDE_OES\t\t\t= 0x8848\n\tMATRIX_INDEX_ARRAY_POINTER_OES\t\t\t= 0x8849\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tTEXTURE_DEPTH_SIZE\t\t\t\t= 0x884A\n\tDEPTH_TEXTURE_MODE\t\t\t\t= 0x884B\n\nARB_depth_texture enum:\n\tTEXTURE_DEPTH_SIZE_ARB\t\t\t\t= 0x884A\n\tDEPTH_TEXTURE_MODE_ARB\t\t\t\t= 0x884B\n\nVERSION_3_0 enum: (aliases)\n\tCOMPARE_REF_TO_TEXTURE\t\t\t\t= 0x884E    # VERSION_3_0   # alias GL_COMPARE_R_TO_TEXTURE_ARB\n\nVERSION_1_4 enum: (Promoted for OpenGL 1.4)\n\tTEXTURE_COMPARE_MODE\t\t\t\t= 0x884C\n\tTEXTURE_COMPARE_FUNC\t\t\t\t= 0x884D\n\tCOMPARE_R_TO_TEXTURE\t\t\t\t= 0x884E\n\nARB_shadow enum:\n\tTEXTURE_COMPARE_MODE_ARB\t\t\t= 0x884C\n\tTEXTURE_COMPARE_FUNC_ARB\t\t\t= 0x884D\n\tCOMPARE_R_TO_TEXTURE_ARB\t\t\t= 0x884E\n\nEXT_texture_array enum: (additional; see below)\n\tCOMPARE_REF_DEPTH_TO_TEXTURE_EXT\t\t= 0x884E\n\nVERSION_3_2 enum:\n\tuse ARB_seamless_cube_map\t    TEXTURE_CUBE_MAP_SEAMLESS\n\nARB_seamless_cube_map enum:\n\tTEXTURE_CUBE_MAP_SEAMLESS\t\t\t= 0x884F\n\n###############################################################################\n\n# NVIDIA: 0x8850-0x891F\n\nNV_texture_shader3 enum:\n\tOFFSET_PROJECTIVE_TEXTURE_2D_NV\t\t\t= 0x8850\n\tOFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV\t\t= 0x8851\n\tOFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV\t\t= 0x8852\n\tOFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV\t= 0x8853\n\tOFFSET_HILO_TEXTURE_2D_NV\t\t\t= 0x8854\n\tOFFSET_HILO_TEXTURE_RECTANGLE_NV\t\t= 0x8855\n\tOFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV\t\t= 0x8856\n\tOFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV\t= 0x8857\n\tDEPENDENT_HILO_TEXTURE_2D_NV\t\t\t= 0x8858\n\tDEPENDENT_RGB_TEXTURE_3D_NV\t\t\t= 0x8859\n\tDEPENDENT_RGB_TEXTURE_CUBE_MAP_NV\t\t= 0x885A\n\tDOT_PRODUCT_PASS_THROUGH_NV\t\t\t= 0x885B\n\tDOT_PRODUCT_TEXTURE_1D_NV\t\t\t= 0x885C\n\tDOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV\t\t= 0x885D\n\tHILO8_NV\t\t\t\t\t= 0x885E\n\tSIGNED_HILO8_NV\t\t\t\t\t= 0x885F\n\tFORCE_BLUE_TO_ONE_NV\t\t\t\t= 0x8860\n\nVERSION_2_0 enum: (Promoted for OpenGL 2.0)\n\tPOINT_SPRITE\t\t\t\t\t= 0x8861    # VERSION_2_0\n\tCOORD_REPLACE\t\t\t\t\t= 0x8862    # VERSION_2_0\n\nARB_point_sprite enum:\n\tPOINT_SPRITE_ARB\t\t\t\t= 0x8861\n\tCOORD_REPLACE_ARB\t\t\t\t= 0x8862\n\nNV_point_sprite enum:\n\tPOINT_SPRITE_NV\t\t\t\t\t= 0x8861\n\tCOORD_REPLACE_NV\t\t\t\t= 0x8862\n\n# Aliases ARB_point_sprite enums above\nOES_point_sprite enum: (OpenGL ES only)\n\tPOINT_SPRITE_ARB\t\t\t\t= 0x8861\n\tCOORD_REPLACE_ARB\t\t\t\t= 0x8862\n\nNV_point_sprite enum:\n\tPOINT_SPRITE_R_MODE_NV\t\t\t\t= 0x8863\n\nVERSION_1_5 enum: (Promoted for OpenGL 1.5)\n\tQUERY_COUNTER_BITS\t\t\t\t= 0x8864\n\tCURRENT_QUERY\t\t\t\t\t= 0x8865\n\tQUERY_RESULT\t\t\t\t\t= 0x8866\n\tQUERY_RESULT_AVAILABLE\t\t\t\t= 0x8867\n\nARB_occlusion_query enum:\n\tQUERY_COUNTER_BITS_ARB\t\t\t\t= 0x8864\n\tCURRENT_QUERY_ARB\t\t\t\t= 0x8865\n\tQUERY_RESULT_ARB\t\t\t\t= 0x8866\n\tQUERY_RESULT_AVAILABLE_ARB\t\t\t= 0x8867\n\nNV_occlusion_query enum:\n\tPIXEL_COUNTER_BITS_NV\t\t\t\t= 0x8864\n\tCURRENT_OCCLUSION_QUERY_ID_NV\t\t\t= 0x8865\n\tPIXEL_COUNT_NV\t\t\t\t\t= 0x8866\n\tPIXEL_COUNT_AVAILABLE_NV\t\t\t= 0x8867\n\nNV_fragment_program enum:\n\tMAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV\t= 0x8868\n\nVERSION_2_0 enum: (Promoted from ARB_vertex_shader)\n\tMAX_VERTEX_ATTRIBS\t\t\t\t= 0x8869    # VERSION_2_0\n\tVERTEX_ATTRIB_ARRAY_NORMALIZED\t\t\t= 0x886A    # VERSION_2_0\n\nARB_vertex_program enum: (additional; see above)\n\tMAX_VERTEX_ATTRIBS_ARB\t\t\t\t= 0x8869\n\tVERTEX_ATTRIB_ARRAY_NORMALIZED_ARB\t\t= 0x886A\n\n# NV_future_use: 0x886B-0x886D\n\nNV_copy_depth_to_color enum:\n\tDEPTH_STENCIL_TO_RGBA_NV\t\t\t= 0x886E\n\tDEPTH_STENCIL_TO_BGRA_NV\t\t\t= 0x886F\n\nNV_fragment_program enum: (additional; see above)\n\tFRAGMENT_PROGRAM_NV\t\t\t\t= 0x8870\n\tMAX_TEXTURE_COORDS_NV\t\t\t\t= 0x8871\n\tMAX_TEXTURE_IMAGE_UNITS_NV\t\t\t= 0x8872\n\tFRAGMENT_PROGRAM_BINDING_NV\t\t\t= 0x8873\n\tPROGRAM_ERROR_STRING_NV\t\t\t\t= 0x8874\n\nVERSION_2_0 enum: (Promoted from ARB_fragment_shader; only some values)\n\tMAX_TEXTURE_COORDS\t\t\t\t= 0x8871    # VERSION_2_0\n\tMAX_TEXTURE_IMAGE_UNITS\t\t\t\t= 0x8872    # VERSION_2_0\n\nARB_vertex_program enum: (additional; see above)\nARB_fragment_program enum: (additional; see above)\n\tMAX_TEXTURE_COORDS_ARB\t\t\t\t= 0x8871    # ARB_fragment_program\n\tMAX_TEXTURE_IMAGE_UNITS_ARB\t\t\t= 0x8872    # ARB_fragment_program\n\tPROGRAM_ERROR_STRING_ARB\t\t\t= 0x8874    # ARB_vertex_program / ARB_fragment_program\n\tPROGRAM_FORMAT_ASCII_ARB\t\t\t= 0x8875    # ARB_vertex_program / ARB_fragment_program\n\tPROGRAM_FORMAT_ARB\t\t\t\t= 0x8876    # ARB_vertex_program / ARB_fragment_program\n\n# 0x8877 *should have been* assigned to PROGRAM_BINDING_ARB. Oops.\n\nNV_pixel_data_range enum:\n\tWRITE_PIXEL_DATA_RANGE_NV\t\t\t= 0x8878\n\tREAD_PIXEL_DATA_RANGE_NV\t\t\t= 0x8879\n\tWRITE_PIXEL_DATA_RANGE_LENGTH_NV\t\t= 0x887A\n\tREAD_PIXEL_DATA_RANGE_LENGTH_NV\t\t\t= 0x887B\n\tWRITE_PIXEL_DATA_RANGE_POINTER_NV\t\t= 0x887C\n\tREAD_PIXEL_DATA_RANGE_POINTER_NV\t\t= 0x887D\n\n# NV_future_use: 0x887E-0x887F\n\nNV_float_buffer enum:\n\tFLOAT_R_NV\t\t\t\t\t= 0x8880\n\tFLOAT_RG_NV\t\t\t\t\t= 0x8881\n\tFLOAT_RGB_NV\t\t\t\t\t= 0x8882\n\tFLOAT_RGBA_NV\t\t\t\t\t= 0x8883\n\tFLOAT_R16_NV\t\t\t\t\t= 0x8884\n\tFLOAT_R32_NV\t\t\t\t\t= 0x8885\n\tFLOAT_RG16_NV\t\t\t\t\t= 0x8886\n\tFLOAT_RG32_NV\t\t\t\t\t= 0x8887\n\tFLOAT_RGB16_NV\t\t\t\t\t= 0x8888\n\tFLOAT_RGB32_NV\t\t\t\t\t= 0x8889\n\tFLOAT_RGBA16_NV\t\t\t\t\t= 0x888A\n\tFLOAT_RGBA32_NV\t\t\t\t\t= 0x888B\n\tTEXTURE_FLOAT_COMPONENTS_NV\t\t\t= 0x888C\n\tFLOAT_CLEAR_COLOR_VALUE_NV\t\t\t= 0x888D\n\tFLOAT_RGBA_MODE_NV\t\t\t\t= 0x888E\n\nNV_texture_expand_normal enum:\n\tTEXTURE_UNSIGNED_REMAP_MODE_NV\t\t\t= 0x888F\n\nEXT_depth_bounds_test enum:\n\tDEPTH_BOUNDS_TEST_EXT\t\t\t\t= 0x8890\n\tDEPTH_BOUNDS_EXT\t\t\t\t= 0x8891\n\nVERSION_1_5 enum: (Promoted for OpenGL 1.5)\n\tARRAY_BUFFER\t\t\t\t\t= 0x8892\n\tELEMENT_ARRAY_BUFFER\t\t\t\t= 0x8893\n\tARRAY_BUFFER_BINDING\t\t\t\t= 0x8894\n\tELEMENT_ARRAY_BUFFER_BINDING\t\t\t= 0x8895\n\tVERTEX_ARRAY_BUFFER_BINDING\t\t\t= 0x8896\n\tNORMAL_ARRAY_BUFFER_BINDING\t\t\t= 0x8897\n\tCOLOR_ARRAY_BUFFER_BINDING\t\t\t= 0x8898\n\tINDEX_ARRAY_BUFFER_BINDING\t\t\t= 0x8899\n\tTEXTURE_COORD_ARRAY_BUFFER_BINDING\t\t= 0x889A\n\tEDGE_FLAG_ARRAY_BUFFER_BINDING\t\t\t= 0x889B\n\tSECONDARY_COLOR_ARRAY_BUFFER_BINDING\t\t= 0x889C\n\tFOG_COORD_ARRAY_BUFFER_BINDING\t\t\t= 0x889D    # alias GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING\n\tFOG_COORDINATE_ARRAY_BUFFER_BINDING\t\t= 0x889D\n\tWEIGHT_ARRAY_BUFFER_BINDING\t\t\t= 0x889E\n\tVERTEX_ATTRIB_ARRAY_BUFFER_BINDING\t\t= 0x889F\n\nARB_vertex_buffer_object enum:\n\tARRAY_BUFFER_ARB\t\t\t\t= 0x8892\n\tELEMENT_ARRAY_BUFFER_ARB\t\t\t= 0x8893\n\tARRAY_BUFFER_BINDING_ARB\t\t\t= 0x8894\n\tELEMENT_ARRAY_BUFFER_BINDING_ARB\t\t= 0x8895\n\tVERTEX_ARRAY_BUFFER_BINDING_ARB\t\t\t= 0x8896\n\tNORMAL_ARRAY_BUFFER_BINDING_ARB\t\t\t= 0x8897\n\tCOLOR_ARRAY_BUFFER_BINDING_ARB\t\t\t= 0x8898\n\tINDEX_ARRAY_BUFFER_BINDING_ARB\t\t\t= 0x8899\n\tTEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB\t\t= 0x889A\n\tEDGE_FLAG_ARRAY_BUFFER_BINDING_ARB\t\t= 0x889B\n\tSECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB\t= 0x889C\n\tFOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB\t\t= 0x889D\n\tWEIGHT_ARRAY_BUFFER_BINDING_ARB\t\t\t= 0x889E\n\tVERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB\t\t= 0x889F\n\n# Aliases ARB_vertex_buffer_object enum above\nOES_matrix_palette enum: (OpenGL ES only; additional; see below)\n\tWEIGHT_ARRAY_BUFFER_BINDING_OES\t\t\t= 0x889E\n\nARB_vertex_program enum: (additional; see above)\nARB_fragment_program enum: (additional; see above)\n\tPROGRAM_INSTRUCTIONS_ARB\t\t\t= 0x88A0\n\tMAX_PROGRAM_INSTRUCTIONS_ARB\t\t\t= 0x88A1\n\tPROGRAM_NATIVE_INSTRUCTIONS_ARB\t\t\t= 0x88A2\n\tMAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB\t\t= 0x88A3\n\tPROGRAM_TEMPORARIES_ARB\t\t\t\t= 0x88A4\n\tMAX_PROGRAM_TEMPORARIES_ARB\t\t\t= 0x88A5\n\tPROGRAM_NATIVE_TEMPORARIES_ARB\t\t\t= 0x88A6\n\tMAX_PROGRAM_NATIVE_TEMPORARIES_ARB\t\t= 0x88A7\n\tPROGRAM_PARAMETERS_ARB\t\t\t\t= 0x88A8\n\tMAX_PROGRAM_PARAMETERS_ARB\t\t\t= 0x88A9\n\tPROGRAM_NATIVE_PARAMETERS_ARB\t\t\t= 0x88AA\n\tMAX_PROGRAM_NATIVE_PARAMETERS_ARB\t\t= 0x88AB\n\tPROGRAM_ATTRIBS_ARB\t\t\t\t= 0x88AC\n\tMAX_PROGRAM_ATTRIBS_ARB\t\t\t\t= 0x88AD\n\tPROGRAM_NATIVE_ATTRIBS_ARB\t\t\t= 0x88AE\n\tMAX_PROGRAM_NATIVE_ATTRIBS_ARB\t\t\t= 0x88AF\n\tPROGRAM_ADDRESS_REGISTERS_ARB\t\t\t= 0x88B0\n\tMAX_PROGRAM_ADDRESS_REGISTERS_ARB\t\t= 0x88B1\n\tPROGRAM_NATIVE_ADDRESS_REGISTERS_ARB\t\t= 0x88B2\n\tMAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB\t= 0x88B3\n\tMAX_PROGRAM_LOCAL_PARAMETERS_ARB\t\t= 0x88B4\n\tMAX_PROGRAM_ENV_PARAMETERS_ARB\t\t\t= 0x88B5\n\tPROGRAM_UNDER_NATIVE_LIMITS_ARB\t\t\t= 0x88B6\n\tTRANSPOSE_CURRENT_MATRIX_ARB\t\t\t= 0x88B7\n\nVERSION_1_5 enum: (Promoted for OpenGL 1.5)\n\tREAD_ONLY\t\t\t\t\t= 0x88B8\n\tWRITE_ONLY\t\t\t\t\t= 0x88B9\n\tREAD_WRITE\t\t\t\t\t= 0x88BA\n\tBUFFER_ACCESS\t\t\t\t\t= 0x88BB\n\tBUFFER_MAPPED\t\t\t\t\t= 0x88BC\n\tBUFFER_MAP_POINTER\t\t\t\t= 0x88BD\n\nARB_vertex_buffer_object enum: (additional; see above)\n\tREAD_ONLY_ARB\t\t\t\t\t= 0x88B8\n\tWRITE_ONLY_ARB\t\t\t\t\t= 0x88B9\n\tREAD_WRITE_ARB\t\t\t\t\t= 0x88BA\n\tBUFFER_ACCESS_ARB\t\t\t\t= 0x88BB\n\tBUFFER_MAPPED_ARB\t\t\t\t= 0x88BC\n\tBUFFER_MAP_POINTER_ARB\t\t\t\t= 0x88BD\n\n# Aliases ARB_vertex_buffer_object enums above\nOES_mapbuffer enum: (OpenGL ES only)\n\tWRITE_ONLY_OES\t\t\t\t\t= 0x88B9\n\tBUFFER_ACCESS_OES\t\t\t\t= 0x88BB\n\tBUFFER_MAPPED_OES\t\t\t\t= 0x88BC\n\tBUFFER_MAP_POINTER_OES\t\t\t\t= 0x88BD\n\n# NV_future_use: 0x88BE\n\nEXT_timer_query enum:\n\tTIME_ELAPSED_EXT\t\t\t\t= 0x88BF\n\nARB_vertex_program enum: (additional; see above)\nARB_fragment_program enum: (additional; see above)\n\tMATRIX0_ARB\t\t\t\t\t= 0x88C0\n\tMATRIX1_ARB\t\t\t\t\t= 0x88C1\n\tMATRIX2_ARB\t\t\t\t\t= 0x88C2\n\tMATRIX3_ARB\t\t\t\t\t= 0x88C3\n\tMATRIX4_ARB\t\t\t\t\t= 0x88C4\n\tMATRIX5_ARB\t\t\t\t\t= 0x88C5\n\tMATRIX6_ARB\t\t\t\t\t= 0x88C6\n\tMATRIX7_ARB\t\t\t\t\t= 0x88C7\n\tMATRIX8_ARB\t\t\t\t\t= 0x88C8\n\tMATRIX9_ARB\t\t\t\t\t= 0x88C9\n\tMATRIX10_ARB\t\t\t\t\t= 0x88CA\n\tMATRIX11_ARB\t\t\t\t\t= 0x88CB\n\tMATRIX12_ARB\t\t\t\t\t= 0x88CC\n\tMATRIX13_ARB\t\t\t\t\t= 0x88CD\n\tMATRIX14_ARB\t\t\t\t\t= 0x88CE\n\tMATRIX15_ARB\t\t\t\t\t= 0x88CF\n\tMATRIX16_ARB\t\t\t\t\t= 0x88D0\n\tMATRIX17_ARB\t\t\t\t\t= 0x88D1\n\tMATRIX18_ARB\t\t\t\t\t= 0x88D2\n\tMATRIX19_ARB\t\t\t\t\t= 0x88D3\n\tMATRIX20_ARB\t\t\t\t\t= 0x88D4\n\tMATRIX21_ARB\t\t\t\t\t= 0x88D5\n\tMATRIX22_ARB\t\t\t\t\t= 0x88D6\n\tMATRIX23_ARB\t\t\t\t\t= 0x88D7\n\tMATRIX24_ARB\t\t\t\t\t= 0x88D8\n\tMATRIX25_ARB\t\t\t\t\t= 0x88D9\n\tMATRIX26_ARB\t\t\t\t\t= 0x88DA\n\tMATRIX27_ARB\t\t\t\t\t= 0x88DB\n\tMATRIX28_ARB\t\t\t\t\t= 0x88DC\n\tMATRIX29_ARB\t\t\t\t\t= 0x88DD\n\tMATRIX30_ARB\t\t\t\t\t= 0x88DE\n\tMATRIX31_ARB\t\t\t\t\t= 0x88DF\n\nVERSION_1_5 enum: (Promoted for OpenGL 1.5)\n\tSTREAM_DRAW\t\t\t\t\t= 0x88E0\n\tSTREAM_READ\t\t\t\t\t= 0x88E1\n\tSTREAM_COPY\t\t\t\t\t= 0x88E2\n\tSTATIC_DRAW\t\t\t\t\t= 0x88E4\n\tSTATIC_READ\t\t\t\t\t= 0x88E5\n\tSTATIC_COPY\t\t\t\t\t= 0x88E6\n\tDYNAMIC_DRAW\t\t\t\t\t= 0x88E8\n\tDYNAMIC_READ\t\t\t\t\t= 0x88E9\n\tDYNAMIC_COPY\t\t\t\t\t= 0x88EA\n\nARB_vertex_buffer_object enum: (additional; see above)\n\tSTREAM_DRAW_ARB\t\t\t\t\t= 0x88E0\n\tSTREAM_READ_ARB\t\t\t\t\t= 0x88E1\n\tSTREAM_COPY_ARB\t\t\t\t\t= 0x88E2\n\tSTATIC_DRAW_ARB\t\t\t\t\t= 0x88E4\n\tSTATIC_READ_ARB\t\t\t\t\t= 0x88E5\n\tSTATIC_COPY_ARB\t\t\t\t\t= 0x88E6\n\tDYNAMIC_DRAW_ARB\t\t\t\t= 0x88E8\n\tDYNAMIC_READ_ARB\t\t\t\t= 0x88E9\n\tDYNAMIC_COPY_ARB\t\t\t\t= 0x88EA\n\nVERSION_2_1 enum:\n\tPIXEL_PACK_BUFFER\t\t\t\t= 0x88EB    # VERSION_2_1\n\tPIXEL_UNPACK_BUFFER\t\t\t\t= 0x88EC    # VERSION_2_1\n\tPIXEL_PACK_BUFFER_BINDING\t\t\t= 0x88ED    # VERSION_2_1\n\tPIXEL_UNPACK_BUFFER_BINDING\t\t\t= 0x88EF    # VERSION_2_1\n\nARB_pixel_buffer_object enum:\n\tPIXEL_PACK_BUFFER_ARB\t\t\t\t= 0x88EB    # ARB_pixel_buffer_object\n\tPIXEL_UNPACK_BUFFER_ARB\t\t\t\t= 0x88EC    # ARB_pixel_buffer_object\n\tPIXEL_PACK_BUFFER_BINDING_ARB\t\t\t= 0x88ED    # ARB_pixel_buffer_object\n\tPIXEL_UNPACK_BUFFER_BINDING_ARB\t\t\t= 0x88EF    # ARB_pixel_buffer_object\n\nEXT_pixel_buffer_object enum:\n\tPIXEL_PACK_BUFFER_EXT\t\t\t\t= 0x88EB    # EXT_pixel_buffer_object\n\tPIXEL_UNPACK_BUFFER_EXT\t\t\t\t= 0x88EC    # EXT_pixel_buffer_object\n\tPIXEL_PACK_BUFFER_BINDING_EXT\t\t\t= 0x88ED    # EXT_pixel_buffer_object\n\tPIXEL_UNPACK_BUFFER_BINDING_EXT\t\t\t= 0x88EF    # EXT_pixel_buffer_object\n\n# ARB_future_use: 0x88E3, 0x88E7, 0x88EE\n# (for extending ARB_vertex_buffer_object):\n\nVERSION_3_0 enum:\n\tuse ARB_framebuffer_object\t    DEPTH24_STENCIL8\n\tuse ARB_framebuffer_object\t    TEXTURE_STENCIL_SIZE\n\nARB_framebuffer_object enum: (note: no ARB suffixes)\n\tDEPTH24_STENCIL8\t\t\t\t= 0x88F0    # VERSION_3_0 / ARB_fbo\n\tTEXTURE_STENCIL_SIZE\t\t\t\t= 0x88F1    # VERSION_3_0 / ARB_fbo\n\nEXT_packed_depth_stencil enum: (additional; see above)\n\tDEPTH24_STENCIL8_EXT\t\t\t\t= 0x88F0\n\tTEXTURE_STENCIL_SIZE_EXT\t\t\t= 0x88F1\n\n# Aliases EXT_packed_depth_stencil enum above\nOES_packed_depth_stencil enum: (OpenGL ES only; additional; see above)\n\tDEPTH24_STENCIL8_OES\t\t\t\t= 0x88F0\n\nEXT_stencil_clear_tag enum:\n\tSTENCIL_TAG_BITS_EXT\t\t\t\t= 0x88F2\n\tSTENCIL_CLEAR_TAG_VALUE_EXT\t\t\t= 0x88F3\n\nNV_vertex_program2_option enum: (duplicated in NV_fragment_prgoram2 below)\n\tMAX_PROGRAM_EXEC_INSTRUCTIONS_NV\t\t= 0x88F4\n\tMAX_PROGRAM_CALL_DEPTH_NV\t\t\t= 0x88F5\n\nNV_fragment_program2 enum:\n\tMAX_PROGRAM_EXEC_INSTRUCTIONS_NV\t\t= 0x88F4\n\tMAX_PROGRAM_CALL_DEPTH_NV\t\t\t= 0x88F5\n\tMAX_PROGRAM_IF_DEPTH_NV\t\t\t\t= 0x88F6\n\tMAX_PROGRAM_LOOP_DEPTH_NV\t\t\t= 0x88F7\n\tMAX_PROGRAM_LOOP_COUNT_NV\t\t\t= 0x88F8\n\n# NV_future_use: 0x88F9-0x88FC\n\nVERSION_3_0 enum:\n\tVERTEX_ATTRIB_ARRAY_INTEGER\t\t\t= 0x88FD    # VERSION_3_0\n\nNV_vertex_program4 enum:\n\tVERTEX_ATTRIB_ARRAY_INTEGER_NV\t\t\t= 0x88FD\n\nARB_instanced_arrays enum:\n\tVERTEX_ATTRIB_ARRAY_DIVISOR_ARB\t\t\t= 0x88FE\n\nVERSION_3_0 enum:\n\tMAX_ARRAY_TEXTURE_LAYERS\t\t\t= 0x88FF    # VERSION_3_0\n\nEXT_texture_array enum: (additional; see below)\n\tMAX_ARRAY_TEXTURE_LAYERS_EXT\t\t\t= 0x88FF\n\nVERSION_3_0 enum:\n\tMIN_PROGRAM_TEXEL_OFFSET\t\t\t= 0x8904    # VERSION_3_0\n\tMAX_PROGRAM_TEXEL_OFFSET\t\t\t= 0x8905    # VERSION_3_0\n\nNV_gpu_program4 enum:\n\tMIN_PROGRAM_TEXEL_OFFSET_NV\t\t\t= 0x8904\n\tMAX_PROGRAM_TEXEL_OFFSET_NV\t\t\t= 0x8905\n\tPROGRAM_ATTRIB_COMPONENTS_NV\t\t\t= 0x8906\n\tPROGRAM_RESULT_COMPONENTS_NV\t\t\t= 0x8907\n\tMAX_PROGRAM_ATTRIB_COMPONENTS_NV\t\t= 0x8908\n\tMAX_PROGRAM_RESULT_COMPONENTS_NV\t\t= 0x8909\n\nEXT_stencil_two_side enum:\n\tSTENCIL_TEST_TWO_SIDE_EXT\t\t\t= 0x8910\n\tACTIVE_STENCIL_FACE_EXT\t\t\t\t= 0x8911\n\nEXT_texture_mirror_clamp enum: (additional; see above):\n\tMIRROR_CLAMP_TO_BORDER_EXT\t\t\t= 0x8912\n\n# NV_future_use: 0x8913\n\nVERSION_1_5 enum: (Promoted for OpenGL 1.5)\n\tSAMPLES_PASSED\t\t\t\t\t= 0x8914\n\nARB_occlusion_query enum: (additional; see above)\n\tSAMPLES_PASSED_ARB\t\t\t\t= 0x8914\n\n# NV_future_use: 0x8915\n\nVERSION_3_2 enum:\n\tGEOMETRY_VERTICES_OUT\t\t\t\t= 0x8916\n\tGEOMETRY_INPUT_TYPE\t\t\t\t= 0x8917\n\tGEOMETRY_OUTPUT_TYPE\t\t\t\t= 0x8918\n\n# NV_future_use: 0x8919\n\nVERSION_3_0 enum:\n\tCLAMP_VERTEX_COLOR\t\t\t\t= 0x891A    # VERSION_3_0\n\tCLAMP_FRAGMENT_COLOR\t\t\t\t= 0x891B    # VERSION_3_0\n\tCLAMP_READ_COLOR\t\t\t\t= 0x891C    # VERSION_3_0\n\tFIXED_ONLY\t\t\t\t\t= 0x891D    # VERSION_3_0\n\nARB_color_buffer_float enum: (additional; see above)\n\tCLAMP_VERTEX_COLOR_ARB\t\t\t\t= 0x891A\n\tCLAMP_FRAGMENT_COLOR_ARB\t\t\t= 0x891B\n\tCLAMP_READ_COLOR_ARB\t\t\t\t= 0x891C\n\tFIXED_ONLY_ARB\t\t\t\t\t= 0x891D\n\n# NV_future_use: 0x891E-0x891F\n\n###############################################################################\n\n# ATI: 0x8920-0x897F\n\nATI_fragment_shader enum:\n\tFRAGMENT_SHADER_ATI\t\t\t\t= 0x8920\n\tREG_0_ATI\t\t\t\t\t= 0x8921\n\tREG_1_ATI\t\t\t\t\t= 0x8922\n\tREG_2_ATI\t\t\t\t\t= 0x8923\n\tREG_3_ATI\t\t\t\t\t= 0x8924\n\tREG_4_ATI\t\t\t\t\t= 0x8925\n\tREG_5_ATI\t\t\t\t\t= 0x8926\n\tREG_6_ATI\t\t\t\t\t= 0x8927\n\tREG_7_ATI\t\t\t\t\t= 0x8928\n\tREG_8_ATI\t\t\t\t\t= 0x8929\n\tREG_9_ATI\t\t\t\t\t= 0x892A\n\tREG_10_ATI\t\t\t\t\t= 0x892B\n\tREG_11_ATI\t\t\t\t\t= 0x892C\n\tREG_12_ATI\t\t\t\t\t= 0x892D\n\tREG_13_ATI\t\t\t\t\t= 0x892E\n\tREG_14_ATI\t\t\t\t\t= 0x892F\n\tREG_15_ATI\t\t\t\t\t= 0x8930\n\tREG_16_ATI\t\t\t\t\t= 0x8931\n\tREG_17_ATI\t\t\t\t\t= 0x8932\n\tREG_18_ATI\t\t\t\t\t= 0x8933\n\tREG_19_ATI\t\t\t\t\t= 0x8934\n\tREG_20_ATI\t\t\t\t\t= 0x8935\n\tREG_21_ATI\t\t\t\t\t= 0x8936\n\tREG_22_ATI\t\t\t\t\t= 0x8937\n\tREG_23_ATI\t\t\t\t\t= 0x8938\n\tREG_24_ATI\t\t\t\t\t= 0x8939\n\tREG_25_ATI\t\t\t\t\t= 0x893A\n\tREG_26_ATI\t\t\t\t\t= 0x893B\n\tREG_27_ATI\t\t\t\t\t= 0x893C\n\tREG_28_ATI\t\t\t\t\t= 0x893D\n\tREG_29_ATI\t\t\t\t\t= 0x893E\n\tREG_30_ATI\t\t\t\t\t= 0x893F\n\tREG_31_ATI\t\t\t\t\t= 0x8940\n\tCON_0_ATI\t\t\t\t\t= 0x8941\n\tCON_1_ATI\t\t\t\t\t= 0x8942\n\tCON_2_ATI\t\t\t\t\t= 0x8943\n\tCON_3_ATI\t\t\t\t\t= 0x8944\n\tCON_4_ATI\t\t\t\t\t= 0x8945\n\tCON_5_ATI\t\t\t\t\t= 0x8946\n\tCON_6_ATI\t\t\t\t\t= 0x8947\n\tCON_7_ATI\t\t\t\t\t= 0x8948\n\tCON_8_ATI\t\t\t\t\t= 0x8949\n\tCON_9_ATI\t\t\t\t\t= 0x894A\n\tCON_10_ATI\t\t\t\t\t= 0x894B\n\tCON_11_ATI\t\t\t\t\t= 0x894C\n\tCON_12_ATI\t\t\t\t\t= 0x894D\n\tCON_13_ATI\t\t\t\t\t= 0x894E\n\tCON_14_ATI\t\t\t\t\t= 0x894F\n\tCON_15_ATI\t\t\t\t\t= 0x8950\n\tCON_16_ATI\t\t\t\t\t= 0x8951\n\tCON_17_ATI\t\t\t\t\t= 0x8952\n\tCON_18_ATI\t\t\t\t\t= 0x8953\n\tCON_19_ATI\t\t\t\t\t= 0x8954\n\tCON_20_ATI\t\t\t\t\t= 0x8955\n\tCON_21_ATI\t\t\t\t\t= 0x8956\n\tCON_22_ATI\t\t\t\t\t= 0x8957\n\tCON_23_ATI\t\t\t\t\t= 0x8958\n\tCON_24_ATI\t\t\t\t\t= 0x8959\n\tCON_25_ATI\t\t\t\t\t= 0x895A\n\tCON_26_ATI\t\t\t\t\t= 0x895B\n\tCON_27_ATI\t\t\t\t\t= 0x895C\n\tCON_28_ATI\t\t\t\t\t= 0x895D\n\tCON_29_ATI\t\t\t\t\t= 0x895E\n\tCON_30_ATI\t\t\t\t\t= 0x895F\n\tCON_31_ATI\t\t\t\t\t= 0x8960\n\tMOV_ATI\t\t\t\t\t\t= 0x8961\n\tADD_ATI\t\t\t\t\t\t= 0x8963\n\tMUL_ATI\t\t\t\t\t\t= 0x8964\n\tSUB_ATI\t\t\t\t\t\t= 0x8965\n\tDOT3_ATI\t\t\t\t\t= 0x8966\n\tDOT4_ATI\t\t\t\t\t= 0x8967\n\tMAD_ATI\t\t\t\t\t\t= 0x8968\n\tLERP_ATI\t\t\t\t\t= 0x8969\n\tCND_ATI\t\t\t\t\t\t= 0x896A\n\tCND0_ATI\t\t\t\t\t= 0x896B\n\tDOT2_ADD_ATI\t\t\t\t\t= 0x896C\n\tSECONDARY_INTERPOLATOR_ATI\t\t\t= 0x896D\n\tNUM_FRAGMENT_REGISTERS_ATI\t\t\t= 0x896E\n\tNUM_FRAGMENT_CONSTANTS_ATI\t\t\t= 0x896F\n\tNUM_PASSES_ATI\t\t\t\t\t= 0x8970\n\tNUM_INSTRUCTIONS_PER_PASS_ATI\t\t\t= 0x8971\n\tNUM_INSTRUCTIONS_TOTAL_ATI\t\t\t= 0x8972\n\tNUM_INPUT_INTERPOLATOR_COMPONENTS_ATI\t\t= 0x8973\n\tNUM_LOOPBACK_COMPONENTS_ATI\t\t\t= 0x8974\n\tCOLOR_ALPHA_PAIRING_ATI\t\t\t\t= 0x8975\n\tSWIZZLE_STR_ATI\t\t\t\t\t= 0x8976\n\tSWIZZLE_STQ_ATI\t\t\t\t\t= 0x8977\n\tSWIZZLE_STR_DR_ATI\t\t\t\t= 0x8978\n\tSWIZZLE_STQ_DQ_ATI\t\t\t\t= 0x8979\n\tSWIZZLE_STRQ_ATI\t\t\t\t= 0x897A\n\tSWIZZLE_STRQ_DQ_ATI\t\t\t\t= 0x897B\n# ??? Not clear where to put new types of mask bits yet\n\tRED_BIT_ATI\t\t\t\t\t= 0x00000001\n\tGREEN_BIT_ATI\t\t\t\t\t= 0x00000002\n\tBLUE_BIT_ATI\t\t\t\t\t= 0x00000004\n\t2X_BIT_ATI\t\t\t\t\t= 0x00000001\n\t4X_BIT_ATI\t\t\t\t\t= 0x00000002\n\t8X_BIT_ATI\t\t\t\t\t= 0x00000004\n\tHALF_BIT_ATI\t\t\t\t\t= 0x00000008\n\tQUARTER_BIT_ATI\t\t\t\t\t= 0x00000010\n\tEIGHTH_BIT_ATI\t\t\t\t\t= 0x00000020\n\tSATURATE_BIT_ATI\t\t\t\t= 0x00000040\n\t2X_BIT_ATI\t\t\t\t\t= 0x00000001\n\tCOMP_BIT_ATI\t\t\t\t\t= 0x00000002\n\tNEGATE_BIT_ATI\t\t\t\t\t= 0x00000004\n\tBIAS_BIT_ATI\t\t\t\t\t= 0x00000008\n\n# ATI_future_use: 0x897C-0x897F\n\n###############################################################################\n\n# Khronos OpenML WG / OpenGL ES WG: 0x8980-0x898F\n\nOML_interlace enum:\n\tINTERLACE_OML\t\t\t\t\t= 0x8980\n\tINTERLACE_READ_OML\t\t\t\t= 0x8981\n\nOML_subsample enum:\n\tFORMAT_SUBSAMPLE_24_24_OML\t\t\t= 0x8982\n\tFORMAT_SUBSAMPLE_244_244_OML\t\t\t= 0x8983\n\nOML_resample enum:\n\tPACK_RESAMPLE_OML\t\t\t\t= 0x8984\n\tUNPACK_RESAMPLE_OML\t\t\t\t= 0x8985\n\tRESAMPLE_REPLICATE_OML\t\t\t\t= 0x8986\n\tRESAMPLE_ZERO_FILL_OML\t\t\t\t= 0x8987\n\tRESAMPLE_AVERAGE_OML\t\t\t\t= 0x8988\n\tRESAMPLE_DECIMATE_OML\t\t\t\t= 0x8989\n\nOES_point_size_array enum: (OpenGL ES only)\n\tPOINT_SIZE_ARRAY_TYPE_OES\t\t\t= 0x898A\n\tPOINT_SIZE_ARRAY_STRIDE_OES\t\t\t= 0x898B\n\tPOINT_SIZE_ARRAY_POINTER_OES\t\t\t= 0x898C\n\nOES_matrix_get enum: (OpenGL ES only)\n\tMODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES\t\t= 0x898D\n\tPROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES\t\t= 0x898E\n\tTEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES\t\t= 0x898F\n\n###############################################################################\n\n# 3dlabs: 0x8990-0x899F\n\n###############################################################################\n\n# Matrox: 0x89A0-0x89FF\n\n###############################################################################\n\n# Apple: 0x8A00-0x8A7F\n\nAPPLE_vertex_program_evaluators enum:\n\tVERTEX_ATTRIB_MAP1_APPLE\t\t\t= 0x8A00\n\tVERTEX_ATTRIB_MAP2_APPLE\t\t\t= 0x8A01\n\tVERTEX_ATTRIB_MAP1_SIZE_APPLE\t\t\t= 0x8A02\n\tVERTEX_ATTRIB_MAP1_COEFF_APPLE\t\t\t= 0x8A03\n\tVERTEX_ATTRIB_MAP1_ORDER_APPLE\t\t\t= 0x8A04\n\tVERTEX_ATTRIB_MAP1_DOMAIN_APPLE\t\t\t= 0x8A05\n\tVERTEX_ATTRIB_MAP2_SIZE_APPLE\t\t\t= 0x8A06\n\tVERTEX_ATTRIB_MAP2_COEFF_APPLE\t\t\t= 0x8A07\n\tVERTEX_ATTRIB_MAP2_ORDER_APPLE\t\t\t= 0x8A08\n\tVERTEX_ATTRIB_MAP2_DOMAIN_APPLE\t\t\t= 0x8A09\n\nAPPLE_fence enum:\n\tDRAW_PIXELS_APPLE\t\t\t\t= 0x8A0A\n\tFENCE_APPLE\t\t\t\t\t= 0x8A0B\n\n## From Jeremy 2006/10/18 (Khronos bug 632) - unknown extension name\n\tELEMENT_ARRAY_APPLE\t\t\t\t= 0x8A0C\n\tELEMENT_ARRAY_TYPE_APPLE\t\t\t= 0x8A0D\n\tELEMENT_ARRAY_POINTER_APPLE\t\t\t= 0x8A0E\n\nAPPLE_float_pixels enum:\n\tCOLOR_FLOAT_APPLE\t\t\t\t= 0x8A0F\n\n# APPLE_future_use: 0x8A10\n## From Jeremy 2006/10/18 (Khronos bug 632) - unknown extension name\n#\tMIN_PBUFFER_VIEWPORT_DIMS_APPLE\t\t\t= 0x8A10\n#\tELEMENT_BUFFER_BINDING_APPLE\t\t\t= 0x8A11\n# Apple says the extension that defined ELEMENT_BUFFER_BINDING_APPLE\n# never shipped and there's no actual collision with UNIFORM_BUFFER\n\nVERSION_3_1 enum:\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BUFFER\n\nARB_uniform_buffer_object enum: (additional; see below)\n\tUNIFORM_BUFFER\t\t\t\t\t= 0x8A11\n\nAPPLE_flush_buffer_range enum:\n\tBUFFER_SERIALIZED_MODIFY_APPLE\t\t\t= 0x8A12\n\tBUFFER_FLUSHING_UNMAP_APPLE\t\t\t= 0x8A13\n\nAPPLE_aux_depth_stencil enum:\n\tAUX_DEPTH_STENCIL_APPLE\t\t\t\t= 0x8A14\n\nAPPLE_row_bytes enum:\n\tPACK_ROW_BYTES_APPLE\t\t\t\t= 0x8A15\n\tUNPACK_ROW_BYTES_APPLE\t\t\t\t= 0x8A16\n\n# APPLE_future_use: 0x8A17-0x8A18\n\nAPPLE_object_purgeable enum:\n\tRELEASED_APPLE\t\t\t\t\t= 0x8A19\n\tVOLATILE_APPLE\t\t\t\t\t= 0x8A1A\n\tRETAINED_APPLE\t\t\t\t\t= 0x8A1B\n\tUNDEFINED_APPLE\t\t\t\t\t= 0x8A1C\n\tPURGEABLE_APPLE\t\t\t\t\t= 0x8A1D\n\n# APPLE_future_use: 0x8A1E\n\nAPPLE_rgb_422 enum:\n\tRGB_422_APPLE\t\t\t\t\t= 0x8A1F\n\tuse APPLE_ycbcr_422\t\t    UNSIGNED_SHORT_8_8_APPLE\n\tuse APPLE_ycbcr_422\t\t    UNSIGNED_SHORT_8_8_REV_APPLE\n\n# APPLE_future_use: 0x8A20--0x8A27\n\nVERSION_3_1 enum:\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BUFFER_BINDING\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BUFFER_START\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BUFFER_SIZE\n\tuse ARB_uniform_buffer_object\t    MAX_VERTEX_UNIFORM_BLOCKS\n\tuse ARB_uniform_buffer_object\t    MAX_GEOMETRY_UNIFORM_BLOCKS\n\tuse ARB_uniform_buffer_object\t    MAX_FRAGMENT_UNIFORM_BLOCKS\n\tuse ARB_uniform_buffer_object\t    MAX_COMBINED_UNIFORM_BLOCKS\n\tuse ARB_uniform_buffer_object\t    MAX_UNIFORM_BUFFER_BINDINGS\n\tuse ARB_uniform_buffer_object\t    MAX_UNIFORM_BLOCK_SIZE\n\tuse ARB_uniform_buffer_object\t    MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS\n\tuse ARB_uniform_buffer_object\t    MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS\n\tuse ARB_uniform_buffer_object\t    MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BUFFER_OFFSET_ALIGNMENT\n\tuse ARB_uniform_buffer_object\t    ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH\n\tuse ARB_uniform_buffer_object\t    ACTIVE_UNIFORM_BLOCKS\n\tuse ARB_uniform_buffer_object\t    UNIFORM_TYPE\n\tuse ARB_uniform_buffer_object\t    UNIFORM_SIZE\n\tuse ARB_uniform_buffer_object\t    UNIFORM_NAME_LENGTH\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_INDEX\n\tuse ARB_uniform_buffer_object\t    UNIFORM_OFFSET\n\tuse ARB_uniform_buffer_object\t    UNIFORM_ARRAY_STRIDE\n\tuse ARB_uniform_buffer_object\t    UNIFORM_MATRIX_STRIDE\n\tuse ARB_uniform_buffer_object\t    UNIFORM_IS_ROW_MAJOR\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_BINDING\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_DATA_SIZE\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_NAME_LENGTH\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_ACTIVE_UNIFORMS\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER\n\tuse ARB_uniform_buffer_object\t    INVALID_INDEX\n\nARB_uniform_buffer_object enum:\n\tUNIFORM_BUFFER_BINDING\t\t\t\t= 0x8A28\n\tUNIFORM_BUFFER_START\t\t\t\t= 0x8A29\n\tUNIFORM_BUFFER_SIZE\t\t\t\t= 0x8A2A\n\tMAX_VERTEX_UNIFORM_BLOCKS\t\t\t= 0x8A2B\n\tMAX_GEOMETRY_UNIFORM_BLOCKS\t\t\t= 0x8A2C\n\tMAX_FRAGMENT_UNIFORM_BLOCKS\t\t\t= 0x8A2D\n\tMAX_COMBINED_UNIFORM_BLOCKS\t\t\t= 0x8A2E\n\tMAX_UNIFORM_BUFFER_BINDINGS\t\t\t= 0x8A2F\n\tMAX_UNIFORM_BLOCK_SIZE\t\t\t\t= 0x8A30\n\tMAX_COMBINED_VERTEX_UNIFORM_COMPONENTS\t\t= 0x8A31\n\tMAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS\t= 0x8A32\n\tMAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS\t= 0x8A33\n\tUNIFORM_BUFFER_OFFSET_ALIGNMENT\t\t\t= 0x8A34\n\tACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH\t\t= 0x8A35\n\tACTIVE_UNIFORM_BLOCKS\t\t\t\t= 0x8A36\n\tUNIFORM_TYPE\t\t\t\t\t= 0x8A37\n\tUNIFORM_SIZE\t\t\t\t\t= 0x8A38\n\tUNIFORM_NAME_LENGTH\t\t\t\t= 0x8A39\n\tUNIFORM_BLOCK_INDEX\t\t\t\t= 0x8A3A\n\tUNIFORM_OFFSET\t\t\t\t\t= 0x8A3B\n\tUNIFORM_ARRAY_STRIDE\t\t\t\t= 0x8A3C\n\tUNIFORM_MATRIX_STRIDE\t\t\t\t= 0x8A3D\n\tUNIFORM_IS_ROW_MAJOR\t\t\t\t= 0x8A3E\n\tUNIFORM_BLOCK_BINDING\t\t\t\t= 0x8A3F\n\tUNIFORM_BLOCK_DATA_SIZE\t\t\t\t= 0x8A40\n\tUNIFORM_BLOCK_NAME_LENGTH\t\t\t= 0x8A41\n\tUNIFORM_BLOCK_ACTIVE_UNIFORMS\t\t\t= 0x8A42\n\tUNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES\t\t= 0x8A43\n\tUNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER\t= 0x8A44\n\tUNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER\t= 0x8A45\n\tUNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER\t= 0x8A46\n\tINVALID_INDEX\t\t\t\t\t= 0xFFFFFFFFu\n\n# APPLE_future_use: 0x8A47-0x8A7F\n\n###############################################################################\n\n# Matrox: 0x8A80-0x8AEF\n\n###############################################################################\n\n# Chromium (Brian Paul): 0x8AF0-0x8B2F\n\n###############################################################################\n\n# ARB HLSL shader extensions: 0x8B30-0x8B8F\n\n\nVERSION_3_1 enum: (Promoted from ARB_shader_objects + ARB_texture_rectangle)\n\tSAMPLER_2D_RECT\t\t\t\t\t= 0x8B63    # ARB_shader_objects + ARB_texture_rectangle\n\tSAMPLER_2D_RECT_SHADOW\t\t\t\t= 0x8B64    # ARB_shader_objects + ARB_texture_rectangle\n\n#@@ separate extensions\nVERSION_2_0 enum: (Promoted for OpenGL 2.0; only some values; renaming in many cases)\nARB_shader_objects, ARB_vertex_shader, ARB_fragment_shader enum:\nNV_vertex_program3 enum: (reuses 0x8B4C)\n##Shader types + room for expansion\n\tFRAGMENT_SHADER\t\t\t\t\t= 0x8B30    # VERSION_2_0\n\tFRAGMENT_SHADER_ARB\t\t\t\t= 0x8B30    # ARB_fragment_shader\n\tVERTEX_SHADER\t\t\t\t\t= 0x8B31    # VERSION_2_0\n\tVERTEX_SHADER_ARB\t\t\t\t= 0x8B31    # ARB_vertex_shader\n# ARB_future_use: 0x8B32-0x8B3F (for shader types)\n##Container types + room for expansion\n\tPROGRAM_OBJECT_ARB\t\t\t\t= 0x8B40    # ARB_shader_objects\n# ARB_future_use: 0x8B41-0x8B47 (for container types)\n##Misc. shader enums\n\tSHADER_OBJECT_ARB\t\t\t\t= 0x8B48    # ARB_shader_objects\n\tMAX_FRAGMENT_UNIFORM_COMPONENTS\t\t\t= 0x8B49    # VERSION_2_0\n\tMAX_FRAGMENT_UNIFORM_COMPONENTS_ARB\t\t= 0x8B49    # ARB_fragment_shader\n\tMAX_VERTEX_UNIFORM_COMPONENTS\t\t\t= 0x8B4A    # VERSION_2_0\n\tMAX_VERTEX_UNIFORM_COMPONENTS_ARB\t\t= 0x8B4A    # ARB_vertex_shader\n\tMAX_VARYING_FLOATS\t\t\t\t= 0x8B4B    # VERSION_2_0\n\tMAX_VARYING_FLOATS_ARB\t\t\t\t= 0x8B4B    # ARB_vertex_shader\n\tMAX_VERTEX_TEXTURE_IMAGE_UNITS\t\t\t= 0x8B4C    # VERSION_2_0\n\tMAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB\t\t= 0x8B4C    # ARB_vertex_shader, NV_vertex_program3\n\tMAX_COMBINED_TEXTURE_IMAGE_UNITS\t\t= 0x8B4D    # VERSION_2_0\n\tMAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB\t\t= 0x8B4D    # ARB_vertex_shader\n\tOBJECT_TYPE_ARB\t\t\t\t\t= 0x8B4E    # ARB_shader_objects\n\tSHADER_TYPE\t\t\t\t\t= 0x8B4F    # VERSION_2_0 (renamed)\n\tOBJECT_SUBTYPE_ARB\t\t\t\t= 0x8B4F    # ARB_shader_objects\n##Attribute types + room for expansion.\n\tFLOAT_VEC2\t\t\t\t\t= 0x8B50    # VERSION_2_0\n\tFLOAT_VEC2_ARB\t\t\t\t\t= 0x8B50    # ARB_shader_objects\n\tFLOAT_VEC3\t\t\t\t\t= 0x8B51    # VERSION_2_0\n\tFLOAT_VEC3_ARB\t\t\t\t\t= 0x8B51    # ARB_shader_objects\n\tFLOAT_VEC4\t\t\t\t\t= 0x8B52    # VERSION_2_0\n\tFLOAT_VEC4_ARB\t\t\t\t\t= 0x8B52    # ARB_shader_objects\n\tINT_VEC2\t\t\t\t\t= 0x8B53    # VERSION_2_0\n\tINT_VEC2_ARB\t\t\t\t\t= 0x8B53    # ARB_shader_objects\n\tINT_VEC3\t\t\t\t\t= 0x8B54    # VERSION_2_0\n\tINT_VEC3_ARB\t\t\t\t\t= 0x8B54    # ARB_shader_objects\n\tINT_VEC4\t\t\t\t\t= 0x8B55    # VERSION_2_0\n\tINT_VEC4_ARB\t\t\t\t\t= 0x8B55    # ARB_shader_objects\n\tBOOL\t\t\t\t\t\t= 0x8B56    # VERSION_2_0\n\tBOOL_ARB\t\t\t\t\t= 0x8B56    # ARB_shader_objects\n\tBOOL_VEC2\t\t\t\t\t= 0x8B57    # VERSION_2_0\n\tBOOL_VEC2_ARB\t\t\t\t\t= 0x8B57    # ARB_shader_objects\n\tBOOL_VEC3\t\t\t\t\t= 0x8B58    # VERSION_2_0\n\tBOOL_VEC3_ARB\t\t\t\t\t= 0x8B58    # ARB_shader_objects\n\tBOOL_VEC4\t\t\t\t\t= 0x8B59    # VERSION_2_0\n\tBOOL_VEC4_ARB\t\t\t\t\t= 0x8B59    # ARB_shader_objects\n\tFLOAT_MAT2\t\t\t\t\t= 0x8B5A    # VERSION_2_0\n\tFLOAT_MAT2_ARB\t\t\t\t\t= 0x8B5A    # ARB_shader_objects\n\tFLOAT_MAT3\t\t\t\t\t= 0x8B5B    # VERSION_2_0\n\tFLOAT_MAT3_ARB\t\t\t\t\t= 0x8B5B    # ARB_shader_objects\n\tFLOAT_MAT4\t\t\t\t\t= 0x8B5C    # VERSION_2_0\n\tFLOAT_MAT4_ARB\t\t\t\t\t= 0x8B5C    # ARB_shader_objects\n\tSAMPLER_1D\t\t\t\t\t= 0x8B5D    # VERSION_2_0\n\tSAMPLER_1D_ARB\t\t\t\t\t= 0x8B5D    # ARB_shader_objects\n\tSAMPLER_2D\t\t\t\t\t= 0x8B5E    # VERSION_2_0\n\tSAMPLER_2D_ARB\t\t\t\t\t= 0x8B5E    # ARB_shader_objects\n\tSAMPLER_3D\t\t\t\t\t= 0x8B5F    # VERSION_2_0\n\tSAMPLER_3D_ARB\t\t\t\t\t= 0x8B5F    # ARB_shader_objects\n\tSAMPLER_CUBE\t\t\t\t\t= 0x8B60    # VERSION_2_0\n\tSAMPLER_CUBE_ARB\t\t\t\t= 0x8B60    # ARB_shader_objects\n\tSAMPLER_1D_SHADOW\t\t\t\t= 0x8B61    # VERSION_2_0\n\tSAMPLER_1D_SHADOW_ARB\t\t\t\t= 0x8B61    # ARB_shader_objects\n\tSAMPLER_2D_SHADOW\t\t\t\t= 0x8B62    # VERSION_2_0\n\tSAMPLER_2D_SHADOW_ARB\t\t\t\t= 0x8B62    # ARB_shader_objects\n\tSAMPLER_2D_RECT_ARB\t\t\t\t= 0x8B63    # ARB_shader_objects\n\tSAMPLER_2D_RECT_SHADOW_ARB\t\t\t= 0x8B64    # ARB_shader_objects\n\tFLOAT_MAT2x3\t\t\t\t\t= 0x8B65    # VERSION_2_1\n\tFLOAT_MAT2x4\t\t\t\t\t= 0x8B66    # VERSION_2_1\n\tFLOAT_MAT3x2\t\t\t\t\t= 0x8B67    # VERSION_2_1\n\tFLOAT_MAT3x4\t\t\t\t\t= 0x8B68    # VERSION_2_1\n\tFLOAT_MAT4x2\t\t\t\t\t= 0x8B69    # VERSION_2_1\n\tFLOAT_MAT4x3\t\t\t\t\t= 0x8B6A    # VERSION_2_1\n# ARB_future_use: 0x8B6B-0x8B7F (for attribute types)\n\tDELETE_STATUS\t\t\t\t\t= 0x8B80    # VERSION_2_0 (renamed)\n\tOBJECT_DELETE_STATUS_ARB\t\t\t= 0x8B80    # ARB_shader_objects\n\tCOMPILE_STATUS\t\t\t\t\t= 0x8B81    # VERSION_2_0 (renamed)\n\tOBJECT_COMPILE_STATUS_ARB\t\t\t= 0x8B81    # ARB_shader_objects\n\tLINK_STATUS\t\t\t\t\t= 0x8B82    # VERSION_2_0 (renamed)\n\tOBJECT_LINK_STATUS_ARB\t\t\t\t= 0x8B82    # ARB_shader_objects\n\tVALIDATE_STATUS\t\t\t\t\t= 0x8B83    # VERSION_2_0 (renamed)\n\tOBJECT_VALIDATE_STATUS_ARB\t\t\t= 0x8B83    # ARB_shader_objects\n\tINFO_LOG_LENGTH\t\t\t\t\t= 0x8B84    # VERSION_2_0 (renamed)\n\tOBJECT_INFO_LOG_LENGTH_ARB\t\t\t= 0x8B84    # ARB_shader_objects\n\tATTACHED_SHADERS\t\t\t\t= 0x8B85    # VERSION_2_0 (renamed)\n\tOBJECT_ATTACHED_OBJECTS_ARB\t\t\t= 0x8B85    # ARB_shader_objects\n\tACTIVE_UNIFORMS\t\t\t\t\t= 0x8B86    # VERSION_2_0 (renamed)\n\tOBJECT_ACTIVE_UNIFORMS_ARB\t\t\t= 0x8B86    # ARB_shader_objects\n\tACTIVE_UNIFORM_MAX_LENGTH\t\t\t= 0x8B87    # VERSION_2_0 (renamed)\n\tOBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB\t\t= 0x8B87    # ARB_shader_objects\n\tSHADER_SOURCE_LENGTH\t\t\t\t= 0x8B88    # VERSION_2_0 (renamed)\n\tOBJECT_SHADER_SOURCE_LENGTH_ARB\t\t\t= 0x8B88    # ARB_shader_objects\n\tACTIVE_ATTRIBUTES\t\t\t\t= 0x8B89    # VERSION_2_0 (renamed)\n\tOBJECT_ACTIVE_ATTRIBUTES_ARB\t\t\t= 0x8B89    # ARB_vertex_shader\n\tACTIVE_ATTRIBUTE_MAX_LENGTH\t\t\t= 0x8B8A    # VERSION_2_0 (renamed)\n\tOBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB\t\t= 0x8B8A    # ARB_vertex_shader\n\tFRAGMENT_SHADER_DERIVATIVE_HINT\t\t\t= 0x8B8B    # VERSION_2_0\n\tFRAGMENT_SHADER_DERIVATIVE_HINT_ARB\t\t= 0x8B8B    # ARB_fragment_shader\n\tSHADING_LANGUAGE_VERSION\t\t\t= 0x8B8C    # VERSION_2_0\n\tSHADING_LANGUAGE_VERSION_ARB\t\t\t= 0x8B8C    # ARB_shading_language_100\n\n# Aliases ARB_shader_objects enum above\nOES_texture3D enum: (OpenGL ES only; additional; see above)\n\tSAMPLER_3D_OES\t\t\t\t\t= 0x8B5F    # ARB_shader_objects\n\n# Aliases ARB_fragment_shader enum above\nOES_standard_derivatives enum: (OpenGL ES only)\n\tFRAGMENT_SHADER_DERIVATIVE_HINT_OES\t\t= 0x8B8B\n\nVERSION_3_0 enum:\n\tMAX_VARYING_COMPONENTS\t\t\t\t= 0x8B4B    # VERSION_3_0   # alias GL_MAX_VARYING_FLOATS\n\nARB_geometry_shader4 enum: (additional; see below; note: no ARB suffixes)\n\tuse VERSION_3_0\t\t\t    MAX_VARYING_COMPONENTS\n\nEXT_geometry_shader4 enum: (additional; see below)\n\tMAX_VARYING_COMPONENTS_EXT\t\t\t= 0x8B4B\n\nVERSION_2_0 enum:\n\tCURRENT_PROGRAM\t\t\t\t\t= 0x8B8D\n\n# Aliases CURRENT_PROGRAM\nEXT_separate_shader_objects enum:\n\tACTIVE_PROGRAM_EXT\t\t\t\t= 0x8B8D\n\n# ARB_future_use: 0x8B8E-0x8B8F\n\n###############################################################################\n\n# Khronos OpenGL ES WG: 0x8B90-0x8B9F\n\nOES_compressed_paletted_texture enum: (OpenGL ES only)\n\tPALETTE4_RGB8_OES\t\t\t\t= 0x8B90\n\tPALETTE4_RGBA8_OES\t\t\t\t= 0x8B91\n\tPALETTE4_R5_G6_B5_OES\t\t\t\t= 0x8B92\n\tPALETTE4_RGBA4_OES\t\t\t\t= 0x8B93\n\tPALETTE4_RGB5_A1_OES\t\t\t\t= 0x8B94\n\tPALETTE8_RGB8_OES\t\t\t\t= 0x8B95\n\tPALETTE8_RGBA8_OES\t\t\t\t= 0x8B96\n\tPALETTE8_R5_G6_B5_OES\t\t\t\t= 0x8B97\n\tPALETTE8_RGBA4_OES\t\t\t\t= 0x8B98\n\tPALETTE8_RGB5_A1_OES\t\t\t\t= 0x8B99\n\nOES_read_format enum: (OpenGL ES, also implemented in Mesa)\n\tIMPLEMENTATION_COLOR_READ_TYPE_OES\t\t= 0x8B9A\n\tIMPLEMENTATION_COLOR_READ_FORMAT_OES\t\t= 0x8B9B\n\nOES_point_size_array enum: (OpenGL ES only; additional; see above)\n\tPOINT_SIZE_ARRAY_OES\t\t\t\t= 0x8B9C\n\nOES_draw_texture enum: (OpenGL ES only)\n\tTEXTURE_CROP_RECT_OES\t\t\t\t= 0x8B9D\n\nOES_matrix_palette enum: (OpenGL ES only)\n\tMATRIX_INDEX_ARRAY_BUFFER_BINDING_OES\t\t= 0x8B9E\n\nOES_point_size_array enum: (OpenGL ES only; additional; see above)\n\tPOINT_SIZE_ARRAY_BUFFER_BINDING_OES\t\t= 0x8B9F\n\n###############################################################################\n\n# Seaweed: 0x8BA0-0x8BAF\n\n###############################################################################\n\n# Mesa: 0x8BB0-0x8BBF\n#   Probably one of the two 0x8BB4 enums should be 0x8BB5, but the\n#   extension spec is not complete in any event.\nMESA_program_debug enum:\n\tFRAGMENT_PROGRAM_POSITION_MESA\t\t\t= 0x8BB0\n\tFRAGMENT_PROGRAM_CALLBACK_MESA\t\t\t= 0x8BB1\n\tFRAGMENT_PROGRAM_CALLBACK_FUNC_MESA\t\t= 0x8BB2\n\tFRAGMENT_PROGRAM_CALLBACK_DATA_MESA\t\t= 0x8BB3\n\tVERTEX_PROGRAM_CALLBACK_MESA\t\t\t= 0x8BB4\n\tVERTEX_PROGRAM_POSITION_MESA\t\t\t= 0x8BB4\n\tVERTEX_PROGRAM_CALLBACK_FUNC_MESA\t\t= 0x8BB6\n\tVERTEX_PROGRAM_CALLBACK_DATA_MESA\t\t= 0x8BB7\n\n###############################################################################\n\n# ATI: 0x8BC0-0x8BFF\n\nAMD_performance_monitor enum:\n\tCOUNTER_TYPE_AMD\t\t\t\t= 0x8BC0\n\tCOUNTER_RANGE_AMD\t\t\t\t= 0x8BC1\n\tUNSIGNED_INT64_AMD\t\t\t\t= 0x8BC2\n\tPERCENTAGE_AMD\t\t\t\t\t= 0x8BC3\n\tPERFMON_RESULT_AVAILABLE_AMD\t\t\t= 0x8BC4\n\tPERFMON_RESULT_SIZE_AMD\t\t\t\t= 0x8BC5\n\tPERFMON_RESULT_AMD\t\t\t\t= 0x8BC6\n\n# ATI_future_use: 0x8BC7-0x8BD1\n\nQCOM_extended_get enum: (OpenGL ES only)\n\tTEXTURE_WIDTH_QCOM\t\t\t\t= 0x8BD2\n\tTEXTURE_HEIGHT_QCOM\t\t\t\t= 0x8BD3\n\tTEXTURE_DEPTH_QCOM\t\t\t\t= 0x8BD4\n\tTEXTURE_INTERNAL_FORMAT_QCOM\t\t\t= 0x8BD5\n\tTEXTURE_FORMAT_QCOM\t\t\t\t= 0x8BD6\n\tTEXTURE_TYPE_QCOM\t\t\t\t= 0x8BD7\n\tTEXTURE_IMAGE_VALID_QCOM\t\t\t= 0x8BD8\n\tTEXTURE_NUM_LEVELS_QCOM\t\t\t\t= 0x8BD9\n\tTEXTURE_TARGET_QCOM\t\t\t\t= 0x8BDA\n\tTEXTURE_OBJECT_VALID_QCOM\t\t\t= 0x8BDB\n\tSTATE_RESTORE\t\t\t\t\t= 0x8BDC\n\n# ATI_future_use: 0x8BDD-0x8BFF\n\n###############################################################################\n\n# Imagination Tech.: 0x8C00-0x8C0F\n\nIMG_texture_compression_pvrtc enum: (OpenGL ES only)\n\tCOMPRESSED_RGB_PVRTC_4BPPV1_IMG\t\t\t= 0x8C00\n\tCOMPRESSED_RGB_PVRTC_2BPPV1_IMG\t\t\t= 0x8C01\n\tCOMPRESSED_RGBA_PVRTC_4BPPV1_IMG\t\t= 0x8C02\n\tCOMPRESSED_RGBA_PVRTC_2BPPV1_IMG\t\t= 0x8C03\n\nIMG_texture_env_enhanced_fixed_function enum: (OpenGL ES only)\n\tMODULATE_COLOR_IMG\t\t\t\t= 0x8C04\n\tRECIP_ADD_SIGNED_ALPHA_IMG\t\t\t= 0x8C05\n\tTEXTURE_ALPHA_MODULATE_IMG\t\t\t= 0x8C06\n\tFACTOR_ALPHA_MODULATE_IMG\t\t\t= 0x8C07\n\tFRAGMENT_ALPHA_MODULATE_IMG\t\t\t= 0x8C08\n\tADD_BLEND_IMG\t\t\t\t\t= 0x8C09\n\nIMG_shader_binary: (OpenGL ES only)\n\tSGX_BINARY_IMG\t\t\t\t\t= 0x8C0A\n\n# IMG_future_use: 0x8C0B-0x8C0F\n\n###############################################################################\n\n# NVIDIA: 0x8C10-0x8C8F (Pat Brown)\n\nVERSION_3_0 enum:\n\tuse ARB_framebuffer_object\t    TEXTURE_RED_TYPE\n\tuse ARB_framebuffer_object\t    TEXTURE_GREEN_TYPE\n\tuse ARB_framebuffer_object\t    TEXTURE_BLUE_TYPE\n\tuse ARB_framebuffer_object\t    TEXTURE_ALPHA_TYPE\n\tuse ARB_framebuffer_object\t    TEXTURE_LUMINANCE_TYPE\n\tuse ARB_framebuffer_object\t    TEXTURE_INTENSITY_TYPE\n\tuse ARB_framebuffer_object\t    TEXTURE_DEPTH_TYPE\n\tuse ARB_framebuffer_object\t    UNSIGNED_NORMALIZED\n\nARB_framebuffer_object enum: (note: no ARB suffixes)\n\tTEXTURE_RED_TYPE\t\t\t\t= 0x8C10    # VERSION_3_0 / ARB_fbo\n\tTEXTURE_GREEN_TYPE\t\t\t\t= 0x8C11    # VERSION_3_0 / ARB_fbo\n\tTEXTURE_BLUE_TYPE\t\t\t\t= 0x8C12    # VERSION_3_0 / ARB_fbo\n\tTEXTURE_ALPHA_TYPE\t\t\t\t= 0x8C13    # VERSION_3_0 / ARB_fbo\n\tTEXTURE_LUMINANCE_TYPE\t\t\t\t= 0x8C14    # VERSION_3_0 / ARB_fbo\n\tTEXTURE_INTENSITY_TYPE\t\t\t\t= 0x8C15    # VERSION_3_0 / ARB_fbo\n\tTEXTURE_DEPTH_TYPE\t\t\t\t= 0x8C16    # VERSION_3_0 / ARB_fbo\n\tUNSIGNED_NORMALIZED\t\t\t\t= 0x8C17    # VERSION_3_0 / ARB_fbo\n\nARB_texture_float enum: (additional; see above)\n\tTEXTURE_RED_TYPE_ARB\t\t\t\t= 0x8C10\n\tTEXTURE_GREEN_TYPE_ARB\t\t\t\t= 0x8C11\n\tTEXTURE_BLUE_TYPE_ARB\t\t\t\t= 0x8C12\n\tTEXTURE_ALPHA_TYPE_ARB\t\t\t\t= 0x8C13\n\tTEXTURE_LUMINANCE_TYPE_ARB\t\t\t= 0x8C14\n\tTEXTURE_INTENSITY_TYPE_ARB\t\t\t= 0x8C15\n\tTEXTURE_DEPTH_TYPE_ARB\t\t\t\t= 0x8C16\n\tUNSIGNED_NORMALIZED_ARB\t\t\t\t= 0x8C17\n\nVERSION_3_0 enum:\n\tTEXTURE_1D_ARRAY\t\t\t\t= 0x8C18    # VERSION_3_0\n\tPROXY_TEXTURE_1D_ARRAY\t\t\t\t= 0x8C19    # VERSION_3_0\n\tTEXTURE_2D_ARRAY\t\t\t\t= 0x8C1A    # VERSION_3_0\n\tPROXY_TEXTURE_2D_ARRAY\t\t\t\t= 0x8C1B    # VERSION_3_0\n\tTEXTURE_BINDING_1D_ARRAY\t\t\t= 0x8C1C    # VERSION_3_0\n\tTEXTURE_BINDING_2D_ARRAY\t\t\t= 0x8C1D    # VERSION_3_0\n\nEXT_texture_array enum:\n\tTEXTURE_1D_ARRAY_EXT\t\t\t\t= 0x8C18\n\tPROXY_TEXTURE_1D_ARRAY_EXT\t\t\t= 0x8C19\n\tTEXTURE_2D_ARRAY_EXT\t\t\t\t= 0x8C1A\n\tPROXY_TEXTURE_2D_ARRAY_EXT\t\t\t= 0x8C1B\n\tTEXTURE_BINDING_1D_ARRAY_EXT\t\t\t= 0x8C1C\n\tTEXTURE_BINDING_2D_ARRAY_EXT\t\t\t= 0x8C1D\n\n# NV_future_use: 0x8C1E-0x8C25\n\nVERSION_3_2 enum:\n\tMAX_GEOMETRY_TEXTURE_IMAGE_UNITS\t\t= 0x8C29\n\nARB_geometry_shader4 enum: (additional; see below)\n\tMAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB\t\t= 0x8C29\n\nNV_geometry_program4 enum:\n\tGEOMETRY_PROGRAM_NV\t\t\t\t= 0x8C26\n\tMAX_PROGRAM_OUTPUT_VERTICES_NV\t\t\t= 0x8C27\n\tMAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV\t\t= 0x8C28\n\tMAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT\t\t= 0x8C29\n\nVERSION_3_1 enum:\n\tTEXTURE_BUFFER\t\t\t\t\t= 0x8C2A\n\tMAX_TEXTURE_BUFFER_SIZE\t\t\t\t= 0x8C2B\n\tTEXTURE_BINDING_BUFFER\t\t\t\t= 0x8C2C\n\tTEXTURE_BUFFER_DATA_STORE_BINDING\t\t= 0x8C2D\n\tTEXTURE_BUFFER_FORMAT\t\t\t\t= 0x8C2E\n\nARB_texture_buffer_object enum:\n\tTEXTURE_BUFFER_ARB\t\t\t\t= 0x8C2A\n\tMAX_TEXTURE_BUFFER_SIZE_ARB\t\t\t= 0x8C2B\n\tTEXTURE_BINDING_BUFFER_ARB\t\t\t= 0x8C2C\n\tTEXTURE_BUFFER_DATA_STORE_BINDING_ARB\t\t= 0x8C2D\n\tTEXTURE_BUFFER_FORMAT_ARB\t\t\t= 0x8C2E\n\nEXT_texture_buffer_object enum:\n\tTEXTURE_BUFFER_EXT\t\t\t\t= 0x8C2A\n\tMAX_TEXTURE_BUFFER_SIZE_EXT\t\t\t= 0x8C2B\n\tTEXTURE_BINDING_BUFFER_EXT\t\t\t= 0x8C2C\n\tTEXTURE_BUFFER_DATA_STORE_BINDING_EXT\t\t= 0x8C2D\n\tTEXTURE_BUFFER_FORMAT_EXT\t\t\t= 0x8C2E\n\n# NV_future_use: 0x8C2F-0x8C35\n\nARB_sample_shading enum:\n\tSAMPLE_SHADING_ARB\t\t\t\t= 0x8C36\n\tMIN_SAMPLE_SHADING_VALUE_ARB\t\t\t= 0x8C37\n\n# NV_future_use: 0x8C38-0x8C39\n\nVERSION_3_0 enum:\n\tR11F_G11F_B10F\t\t\t\t\t= 0x8C3A    # VERSION_3_0\n\tUNSIGNED_INT_10F_11F_11F_REV\t\t\t= 0x8C3B    # VERSION_3_0\n\nEXT_packed_float enum:\n\tR11F_G11F_B10F_EXT\t\t\t\t= 0x8C3A\n\tUNSIGNED_INT_10F_11F_11F_REV_EXT\t\t= 0x8C3B\n\tRGBA_SIGNED_COMPONENTS_EXT\t\t\t= 0x8C3C\n\nVERSION_3_0 enum:\n\tRGB9_E5\t\t\t\t\t\t= 0x8C3D    # VERSION_3_0\n\tUNSIGNED_INT_5_9_9_9_REV\t\t\t= 0x8C3E    # VERSION_3_0\n\tTEXTURE_SHARED_SIZE\t\t\t\t= 0x8C3F    # VERSION_3_0\n\nEXT_texture_shared_exponent enum:\n\tRGB9_E5_EXT\t\t\t\t\t= 0x8C3D\n\tUNSIGNED_INT_5_9_9_9_REV_EXT\t\t\t= 0x8C3E\n\tTEXTURE_SHARED_SIZE_EXT\t\t\t\t= 0x8C3F\n\nVERSION_2_1 enum: (Generic formats promoted for OpenGL 2.1)\n\tSRGB\t\t\t\t\t\t= 0x8C40    # VERSION_2_1\n\tSRGB8\t\t\t\t\t\t= 0x8C41    # VERSION_2_1\n\tSRGB_ALPHA\t\t\t\t\t= 0x8C42    # VERSION_2_1\n\tSRGB8_ALPHA8\t\t\t\t\t= 0x8C43    # VERSION_2_1\n\tSLUMINANCE_ALPHA\t\t\t\t= 0x8C44    # VERSION_2_1\n\tSLUMINANCE8_ALPHA8\t\t\t\t= 0x8C45    # VERSION_2_1\n\tSLUMINANCE\t\t\t\t\t= 0x8C46    # VERSION_2_1\n\tSLUMINANCE8\t\t\t\t\t= 0x8C47    # VERSION_2_1\n\tCOMPRESSED_SRGB\t\t\t\t\t= 0x8C48    # VERSION_2_1\n\tCOMPRESSED_SRGB_ALPHA\t\t\t\t= 0x8C49    # VERSION_2_1\n\tCOMPRESSED_SLUMINANCE\t\t\t\t= 0x8C4A    # VERSION_2_1\n\tCOMPRESSED_SLUMINANCE_ALPHA\t\t\t= 0x8C4B    # VERSION_2_1\n\nEXT_texture_sRGB enum:\n\tSRGB_EXT\t\t\t\t\t= 0x8C40    # EXT_texture_sRGB\n\tSRGB8_EXT\t\t\t\t\t= 0x8C41    # EXT_texture_sRGB\n\tSRGB_ALPHA_EXT\t\t\t\t\t= 0x8C42    # EXT_texture_sRGB\n\tSRGB8_ALPHA8_EXT\t\t\t\t= 0x8C43    # EXT_texture_sRGB\n\tSLUMINANCE_ALPHA_EXT\t\t\t\t= 0x8C44    # EXT_texture_sRGB\n\tSLUMINANCE8_ALPHA8_EXT\t\t\t\t= 0x8C45    # EXT_texture_sRGB\n\tSLUMINANCE_EXT\t\t\t\t\t= 0x8C46    # EXT_texture_sRGB\n\tSLUMINANCE8_EXT\t\t\t\t\t= 0x8C47    # EXT_texture_sRGB\n\tCOMPRESSED_SRGB_EXT\t\t\t\t= 0x8C48    # EXT_texture_sRGB\n\tCOMPRESSED_SRGB_ALPHA_EXT\t\t\t= 0x8C49    # EXT_texture_sRGB\n\tCOMPRESSED_SLUMINANCE_EXT\t\t\t= 0x8C4A    # EXT_texture_sRGB\n\tCOMPRESSED_SLUMINANCE_ALPHA_EXT\t\t\t= 0x8C4B    # EXT_texture_sRGB\n\tCOMPRESSED_SRGB_S3TC_DXT1_EXT\t\t\t= 0x8C4C\n\tCOMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT\t\t= 0x8C4D\n\tCOMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT\t\t= 0x8C4E\n\tCOMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT\t\t= 0x8C4F\n\n# NV_future_use: 0x8C50-0x8C6F\n\nEXT_texture_compression_latc enum:\n\tCOMPRESSED_LUMINANCE_LATC1_EXT\t\t\t= 0x8C70\n\tCOMPRESSED_SIGNED_LUMINANCE_LATC1_EXT\t\t= 0x8C71\n\tCOMPRESSED_LUMINANCE_ALPHA_LATC2_EXT\t\t= 0x8C72\n\tCOMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT\t= 0x8C73\n\n# NV_future_use: 0x8C74-0x8C75\n\n#@@ separate extensions\nVERSION_3_0 enum:\nEXT_transform_feedback enum:\nNV_transform_feedback enum:\n\tTRANSFORM_FEEDBACK_VARYING_MAX_LENGTH\t\t= 0x8C76    # VERSION_3_0\n\tTRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT\t= 0x8C76\n\tBACK_PRIMARY_COLOR_NV\t\t\t\t= 0x8C77\n\tBACK_SECONDARY_COLOR_NV\t\t\t\t= 0x8C78\n\tTEXTURE_COORD_NV\t\t\t\t= 0x8C79\n\tCLIP_DISTANCE_NV\t\t\t\t= 0x8C7A\n\tVERTEX_ID_NV\t\t\t\t\t= 0x8C7B\n\tPRIMITIVE_ID_NV\t\t\t\t\t= 0x8C7C\n\tGENERIC_ATTRIB_NV\t\t\t\t= 0x8C7D\n\tTRANSFORM_FEEDBACK_ATTRIBS_NV\t\t\t= 0x8C7E\n\tTRANSFORM_FEEDBACK_BUFFER_MODE\t\t\t= 0x8C7F    # VERSION_3_0\n\tTRANSFORM_FEEDBACK_BUFFER_MODE_EXT\t\t= 0x8C7F\n\tTRANSFORM_FEEDBACK_BUFFER_MODE_NV\t\t= 0x8C7F\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS\t= 0x8C80    # VERSION_3_0\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT\t= 0x8C80\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV\t= 0x8C80\n\tACTIVE_VARYINGS_NV\t\t\t\t= 0x8C81\n\tACTIVE_VARYING_MAX_LENGTH_NV\t\t\t= 0x8C82\n\tTRANSFORM_FEEDBACK_VARYINGS\t\t\t= 0x8C83    # VERSION_3_0\n\tTRANSFORM_FEEDBACK_VARYINGS_EXT\t\t\t= 0x8C83\n\tTRANSFORM_FEEDBACK_VARYINGS_NV\t\t\t= 0x8C83\n\tTRANSFORM_FEEDBACK_BUFFER_START\t\t\t= 0x8C84    # VERSION_3_0\n\tTRANSFORM_FEEDBACK_BUFFER_START_EXT\t\t= 0x8C84\n\tTRANSFORM_FEEDBACK_BUFFER_START_NV\t\t= 0x8C84\n\tTRANSFORM_FEEDBACK_BUFFER_SIZE\t\t\t= 0x8C85    # VERSION_3_0\n\tTRANSFORM_FEEDBACK_BUFFER_SIZE_EXT\t\t= 0x8C85\n\tTRANSFORM_FEEDBACK_BUFFER_SIZE_NV\t\t= 0x8C85\n\tTRANSFORM_FEEDBACK_RECORD_NV\t\t\t= 0x8C86\n\tPRIMITIVES_GENERATED\t\t\t\t= 0x8C87    # VERSION_3_0\n\tPRIMITIVES_GENERATED_EXT\t\t\t= 0x8C87\n\tPRIMITIVES_GENERATED_NV\t\t\t\t= 0x8C87\n\tTRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN\t\t= 0x8C88    # VERSION_3_0\n\tTRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT\t= 0x8C88\n\tTRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV\t= 0x8C88\n\tRASTERIZER_DISCARD\t\t\t\t= 0x8C89    # VERSION_3_0\n\tRASTERIZER_DISCARD_EXT\t\t\t\t= 0x8C89\n\tRASTERIZER_DISCARD_NV\t\t\t\t= 0x8C89\n\tMAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS\t= 0x8C8A    # VERSION_3_0\n\tMAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT = 0x8C8A\n\tMAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV\t= 0x8C8A\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS\t\t= 0x8C8B    # VERSION_3_0\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT\t= 0x8C8B\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV\t= 0x8C8B\n\tINTERLEAVED_ATTRIBS\t\t\t\t= 0x8C8C    # VERSION_3_0\n\tINTERLEAVED_ATTRIBS_EXT\t\t\t\t= 0x8C8C\n\tINTERLEAVED_ATTRIBS_NV\t\t\t\t= 0x8C8C\n\tSEPARATE_ATTRIBS\t\t\t\t= 0x8C8D    # VERSION_3_0\n\tSEPARATE_ATTRIBS_EXT\t\t\t\t= 0x8C8D\n\tSEPARATE_ATTRIBS_NV\t\t\t\t= 0x8C8D\n\tTRANSFORM_FEEDBACK_BUFFER\t\t\t= 0x8C8E    # VERSION_3_0\n\tTRANSFORM_FEEDBACK_BUFFER_EXT\t\t\t= 0x8C8E\n\tTRANSFORM_FEEDBACK_BUFFER_NV\t\t\t= 0x8C8E\n\tTRANSFORM_FEEDBACK_BUFFER_BINDING\t\t= 0x8C8F    # VERSION_3_0\n\tTRANSFORM_FEEDBACK_BUFFER_BINDING_EXT\t\t= 0x8C8F\n\tTRANSFORM_FEEDBACK_BUFFER_BINDING_NV\t\t= 0x8C8F\n\n###############################################################################\n\n# ATI: 0x8C90-0x8C9F (Affie Munshi, OpenGL ES extensions)\n\n# Reassigned to Qualcomm at time of mobile/desktop split (bug 5874)\n# Qualcomm__future_use: 0x8C90-0x8C91\n\nAMD_compressed_ATC_texture enum: (OpenGL ES only)\n\tATC_RGB_AMD\t\t\t\t\t= 0x8C92\n\tATC_RGBA_EXPLICIT_ALPHA_AMD\t\t\t= 0x8C93\n\n# Reassigned to Qualcomm at time of mobile/desktop split (bug 5874)\n# Qualcomm_future_use: 0x8C94-0x8C9F\n\n###############################################################################\n\n# OpenGL ARB: 0x8CA0-0x8CAF\n\nVERSION_2_0 enum:\n\tPOINT_SPRITE_COORD_ORIGIN\t\t\t= 0x8CA0\n\tLOWER_LEFT\t\t\t\t\t= 0x8CA1\n\tUPPER_LEFT\t\t\t\t\t= 0x8CA2\n\tSTENCIL_BACK_REF\t\t\t\t= 0x8CA3\n\tSTENCIL_BACK_VALUE_MASK\t\t\t\t= 0x8CA4\n\tSTENCIL_BACK_WRITEMASK\t\t\t\t= 0x8CA5\n\nVERSION_3_0 enum:\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_BINDING\n\tuse ARB_framebuffer_object\t    DRAW_FRAMEBUFFER_BINDING\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_BINDING\n\nARB_framebuffer_object enum: (note: no ARB suffixes)\n\tFRAMEBUFFER_BINDING\t\t\t\t= 0x8CA6    # VERSION_3_0 / ARB_fbo\n\tDRAW_FRAMEBUFFER_BINDING\t\t\t= 0x8CA6    # VERSION_3_0 / ARB_fbo # alias GL_FRAMEBUFFER_BINDING\n\tRENDERBUFFER_BINDING\t\t\t\t= 0x8CA7    # VERSION_3_0 / ARB_fbo\n\nEXT_framebuffer_object enum: (additional; see below)\n\tFRAMEBUFFER_BINDING_EXT\t\t\t\t= 0x8CA6\n\tRENDERBUFFER_BINDING_EXT\t\t\t= 0x8CA7\n\nEXT_framebuffer_blit enum: (additional; see below)\n\tDRAW_FRAMEBUFFER_BINDING_EXT\t\t\t= 0x8CA6    # EXT_framebuffer_blit  # alias GL_FRAMEBUFFER_BINDING_EXT\n\n# Aliases EXT_framebuffer_object enums above\nOES_framebuffer_object enum: (OpenGL ES only; additional; see below)\n\tFRAMEBUFFER_BINDING_OES\t\t\t\t= 0x8CA6\n\tRENDERBUFFER_BINDING_OES\t\t\t= 0x8CA7\n\nVERSION_3_0 enum:\n\tuse ARB_framebuffer_object\t    READ_FRAMEBUFFER\n\tuse ARB_framebuffer_object\t    DRAW_FRAMEBUFFER\n\tuse ARB_framebuffer_object\t    READ_FRAMEBUFFER_BINDING\n\nARB_framebuffer_object enum: (note: no ARB suffixes)\n\tREAD_FRAMEBUFFER\t\t\t\t= 0x8CA8    # VERSION_3_0 / ARB_fbo\n\tDRAW_FRAMEBUFFER\t\t\t\t= 0x8CA9    # VERSION_3_0 / ARB_fbo\n\tREAD_FRAMEBUFFER_BINDING\t\t\t= 0x8CAA    # VERSION_3_0 / ARB_fbo\n\nEXT_framebuffer_blit enum:\n\tREAD_FRAMEBUFFER_EXT\t\t\t\t= 0x8CA8\n\tDRAW_FRAMEBUFFER_EXT\t\t\t\t= 0x8CA9\n\tDRAW_FRAMEBUFFER_BINDING_EXT\t\t\t= 0x8CA6    # alias GL_FRAMEBUFFER_BINDING_EXT\n\tREAD_FRAMEBUFFER_BINDING_EXT\t\t\t= 0x8CAA\n\nVERSION_3_0 enum:\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_SAMPLES\n\nARB_framebuffer_object enum: (note: no ARB suffixes)\n\tRENDERBUFFER_SAMPLES\t\t\t\t= 0x8CAB    # VERSION_3_0 / ARB_fbo\n\nEXT_framebuffer_multisample enum:\n\tRENDERBUFFER_SAMPLES_EXT\t\t\t= 0x8CAB\n\nNV_framebuffer_multisample_coverage enum: (additional; see below)\n\tRENDERBUFFER_COVERAGE_SAMPLES_NV\t\t= 0x8CAB\n\n# All enums except external format are incompatible with NV_depth_buffer_float\nVERSION_3_0 enum:\nARB_depth_buffer_float enum: (note: no ARB suffixes)\n\tDEPTH_COMPONENT32F\t\t\t\t= 0x8CAC\n\tDEPTH32F_STENCIL8\t\t\t\t= 0x8CAD\n\n# ARB_future_use: 0x8CAF\n\n###############################################################################\n\n# 3Dlabs: 0x8CB0-0x8CCF (Barthold Lichtenbelt, 2004/12/1)\n\n###############################################################################\n\n# OpenGL ARB: 0x8CD0-0x8D5F (Framebuffer object specification + headroom)\n\n#@@ separate extensions\nVERSION_3_0 enum:\nARB_geometry_shader4 enum: (additional; see below; note: no ARB suffixes)\nARB_framebuffer_object enum: (note: no ARB suffixes)\nEXT_framebuffer_object enum: (additional; see above)\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_TYPE\t\t= 0x8CD0    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT\t\t= 0x8CD0\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_NAME\t\t= 0x8CD1    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT\t\t= 0x8CD1\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL\t\t= 0x8CD2    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT\t= 0x8CD2\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE\t= 0x8CD3    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT = 0x8CD3\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER\t\t= 0x8CD4    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT\t= 0x8CD4\n\tFRAMEBUFFER_COMPLETE\t\t\t\t= 0x8CD5    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_COMPLETE_EXT\t\t\t= 0x8CD5\n\tFRAMEBUFFER_INCOMPLETE_ATTACHMENT\t\t= 0x8CD6    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT\t\t= 0x8CD6\n\tFRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\t= 0x8CD7    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT\t= 0x8CD7\n## Removed 2005/09/26 in revision #117 of the extension:\n##\t  FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT = 0x8CD8\n\tFRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT\t\t= 0x8CD9\n\tFRAMEBUFFER_INCOMPLETE_FORMATS_EXT\t\t= 0x8CDA\n\tFRAMEBUFFER_INCOMPLETE_DRAW_BUFFER\t\t= 0x8CDB    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT\t\t= 0x8CDB\n\tFRAMEBUFFER_INCOMPLETE_READ_BUFFER\t\t= 0x8CDC    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT\t\t= 0x8CDC\n\tFRAMEBUFFER_UNSUPPORTED\t\t\t\t= 0x8CDD    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_UNSUPPORTED_EXT\t\t\t= 0x8CDD\n## Removed 2005/05/31 in revision #113 of the extension:\n## FRAMEBUFFER_STATUS_ERROR_EXT\t\t\t   = 0x8CDE\n\tMAX_COLOR_ATTACHMENTS\t\t\t\t= 0x8CDF    # VERSION_3_0 / ARB_fbo\n\tMAX_COLOR_ATTACHMENTS_EXT\t\t\t= 0x8CDF\n\tCOLOR_ATTACHMENT0\t\t\t\t= 0x8CE0    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT0_EXT\t\t\t\t= 0x8CE0\n\tCOLOR_ATTACHMENT1\t\t\t\t= 0x8CE1    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT1_EXT\t\t\t\t= 0x8CE1\n\tCOLOR_ATTACHMENT2\t\t\t\t= 0x8CE2    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT2_EXT\t\t\t\t= 0x8CE2\n\tCOLOR_ATTACHMENT3\t\t\t\t= 0x8CE3    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT3_EXT\t\t\t\t= 0x8CE3\n\tCOLOR_ATTACHMENT4\t\t\t\t= 0x8CE4    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT4_EXT\t\t\t\t= 0x8CE4\n\tCOLOR_ATTACHMENT5\t\t\t\t= 0x8CE5    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT5_EXT\t\t\t\t= 0x8CE5\n\tCOLOR_ATTACHMENT6\t\t\t\t= 0x8CE6    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT6_EXT\t\t\t\t= 0x8CE6\n\tCOLOR_ATTACHMENT7\t\t\t\t= 0x8CE7    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT7_EXT\t\t\t\t= 0x8CE7\n\tCOLOR_ATTACHMENT8\t\t\t\t= 0x8CE8    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT8_EXT\t\t\t\t= 0x8CE8\n\tCOLOR_ATTACHMENT9\t\t\t\t= 0x8CE9    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT9_EXT\t\t\t\t= 0x8CE9\n\tCOLOR_ATTACHMENT10\t\t\t\t= 0x8CEA    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT10_EXT\t\t\t\t= 0x8CEA\n\tCOLOR_ATTACHMENT11\t\t\t\t= 0x8CEB    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT11_EXT\t\t\t\t= 0x8CEB\n\tCOLOR_ATTACHMENT12\t\t\t\t= 0x8CEC    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT12_EXT\t\t\t\t= 0x8CEC\n\tCOLOR_ATTACHMENT13\t\t\t\t= 0x8CED    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT13_EXT\t\t\t\t= 0x8CED\n\tCOLOR_ATTACHMENT14\t\t\t\t= 0x8CEE    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT14_EXT\t\t\t\t= 0x8CEE\n\tCOLOR_ATTACHMENT15\t\t\t\t= 0x8CEF    # VERSION_3_0 / ARB_fbo\n\tCOLOR_ATTACHMENT15_EXT\t\t\t\t= 0x8CEF\n# 0x8CF0-0x8CFF reserved for color attachments 16-31, if needed\n\tDEPTH_ATTACHMENT\t\t\t\t= 0x8D00    # VERSION_3_0 / ARB_fbo\n\tDEPTH_ATTACHMENT_EXT\t\t\t\t= 0x8D00\n# 0x8D01-0x8D1F reserved for depth attachments 1-31, if needed\n\tSTENCIL_ATTACHMENT\t\t\t\t= 0x8D20    # VERSION_3_0 / ARB_fbo\n\tSTENCIL_ATTACHMENT_EXT\t\t\t\t= 0x8D20\n# 0x8D21-0x8D3F reserved for stencil attachments 1-31, if needed\n\tFRAMEBUFFER\t\t\t\t\t= 0x8D40    # VERSION_3_0 / ARB_fbo\n\tFRAMEBUFFER_EXT\t\t\t\t\t= 0x8D40\n\tRENDERBUFFER\t\t\t\t\t= 0x8D41    # VERSION_3_0 / ARB_fbo\n\tRENDERBUFFER_EXT\t\t\t\t= 0x8D41\n\tRENDERBUFFER_WIDTH\t\t\t\t= 0x8D42    # VERSION_3_0 / ARB_fbo\n\tRENDERBUFFER_WIDTH_EXT\t\t\t\t= 0x8D42\n\tRENDERBUFFER_HEIGHT\t\t\t\t= 0x8D43    # VERSION_3_0 / ARB_fbo\n\tRENDERBUFFER_HEIGHT_EXT\t\t\t\t= 0x8D43\n\tRENDERBUFFER_INTERNAL_FORMAT\t\t\t= 0x8D44    # VERSION_3_0 / ARB_fbo\n\tRENDERBUFFER_INTERNAL_FORMAT_EXT\t\t= 0x8D44\n# 0x8D45 unused (reserved for STENCIL_INDEX_EXT, but now use core STENCIL_INDEX instead)\n\tSTENCIL_INDEX1\t\t\t\t\t= 0x8D46    # VERSION_3_0 / ARB_fbo\n\tSTENCIL_INDEX1_EXT\t\t\t\t= 0x8D46\n\tSTENCIL_INDEX4\t\t\t\t\t= 0x8D47    # VERSION_3_0 / ARB_fbo\n\tSTENCIL_INDEX4_EXT\t\t\t\t= 0x8D47\n\tSTENCIL_INDEX8\t\t\t\t\t= 0x8D48    # VERSION_3_0 / ARB_fbo\n\tSTENCIL_INDEX8_EXT\t\t\t\t= 0x8D48\n\tSTENCIL_INDEX16\t\t\t\t\t= 0x8D49    # VERSION_3_0 / ARB_fbo\n\tSTENCIL_INDEX16_EXT\t\t\t\t= 0x8D49\n# 0x8D4A-0x8D4D reserved for additional stencil formats\n# Added 2005/05/31 in revision #113 of the extension:\n\tRENDERBUFFER_RED_SIZE\t\t\t\t= 0x8D50    # VERSION_3_0 / ARB_fbo\n\tRENDERBUFFER_RED_SIZE_EXT\t\t\t= 0x8D50\n\tRENDERBUFFER_GREEN_SIZE\t\t\t\t= 0x8D51    # VERSION_3_0 / ARB_fbo\n\tRENDERBUFFER_GREEN_SIZE_EXT\t\t\t= 0x8D51\n\tRENDERBUFFER_BLUE_SIZE\t\t\t\t= 0x8D52    # VERSION_3_0 / ARB_fbo\n\tRENDERBUFFER_BLUE_SIZE_EXT\t\t\t= 0x8D52\n\tRENDERBUFFER_ALPHA_SIZE\t\t\t\t= 0x8D53    # VERSION_3_0 / ARB_fbo\n\tRENDERBUFFER_ALPHA_SIZE_EXT\t\t\t= 0x8D53\n\tRENDERBUFFER_DEPTH_SIZE\t\t\t\t= 0x8D54    # VERSION_3_0 / ARB_fbo\n\tRENDERBUFFER_DEPTH_SIZE_EXT\t\t\t= 0x8D54\n\tRENDERBUFFER_STENCIL_SIZE\t\t\t= 0x8D55    # VERSION_3_0 / ARB_fbo\n\tRENDERBUFFER_STENCIL_SIZE_EXT\t\t\t= 0x8D55\n\n# Aliases EXT_framebuffer_object enum above\n# @@@??? does this appear in OES_texture3D, or OES_framebuffer_object?\n# extension spec & gl2ext.h disagree!\nOES_texture3D enum: (OpenGL ES only; additional; see above)\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES\t= 0x8CD4\n\n# Aliases EXT_framebuffer_object enums above\nOES_framebuffer_object enum: (OpenGL ES only; additional; see below)\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES\t\t= 0x8CD0\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES\t\t= 0x8CD1\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES\t= 0x8CD2\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES = 0x8CD3\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES\t= 0x8CD4\n\tFRAMEBUFFER_COMPLETE_OES\t\t\t= 0x8CD5\n\tFRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES\t\t= 0x8CD6\n\tFRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES\t= 0x8CD7\n\tFRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES\t\t= 0x8CD9\n\tFRAMEBUFFER_INCOMPLETE_FORMATS_OES\t\t= 0x8CDA\n\tFRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES\t\t= 0x8CDB\n\tFRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES\t\t= 0x8CDC\n\tFRAMEBUFFER_UNSUPPORTED_OES\t\t\t= 0x8CDD\n\tCOLOR_ATTACHMENT0_OES\t\t\t\t= 0x8CE0\n\tDEPTH_ATTACHMENT_OES\t\t\t\t= 0x8D00\n\tSTENCIL_ATTACHMENT_OES\t\t\t\t= 0x8D20\n\tFRAMEBUFFER_OES\t\t\t\t\t= 0x8D40\n\tRENDERBUFFER_OES\t\t\t\t= 0x8D41\n\tRENDERBUFFER_WIDTH_OES\t\t\t\t= 0x8D42\n\tRENDERBUFFER_HEIGHT_OES\t\t\t\t= 0x8D43\n\tRENDERBUFFER_INTERNAL_FORMAT_OES\t\t= 0x8D44\n\tSTENCIL_INDEX1_OES\t\t\t\t= 0x8D46\n\tSTENCIL_INDEX4_OES\t\t\t\t= 0x8D47\n\tSTENCIL_INDEX8_OES\t\t\t\t= 0x8D48\n\tRENDERBUFFER_RED_SIZE_OES\t\t\t= 0x8D50\n\tRENDERBUFFER_GREEN_SIZE_OES\t\t\t= 0x8D51\n\tRENDERBUFFER_BLUE_SIZE_OES\t\t\t= 0x8D52\n\tRENDERBUFFER_ALPHA_SIZE_OES\t\t\t= 0x8D53\n\tRENDERBUFFER_DEPTH_SIZE_OES\t\t\t= 0x8D54\n\tRENDERBUFFER_STENCIL_SIZE_OES\t\t\t= 0x8D55\n\nOES_stencil1 enum: (OpenGL ES only; additional; see below)\n\tuse OES_framebuffer_object STENCIL_INDEX1_OES\n\nOES_stencil4 enum: (OpenGL ES only; additional; see below)\n\tuse OES_framebuffer_object STENCIL_INDEX4_OES\n\nOES_stencil8 enum: (OpenGL ES only; additional; see below)\n\tuse OES_framebuffer_object STENCIL_INDEX8_OES\n\nVERSION_3_0 enum:\nARB_framebuffer_object enum: (note: no ARB suffixes)\n# Added 2006/10/10 in revision #6b of the extension.\n\tFRAMEBUFFER_INCOMPLETE_MULTISAMPLE\t\t= 0x8D56    # VERSION_3_0 / ARB_fbo\n\tMAX_SAMPLES\t\t\t\t\t= 0x8D57    # VERSION_3_0 / ARB_fbo\n\nEXT_framebuffer_multisample enum: (additional; see above)\n\tFRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT\t\t= 0x8D56\n\tMAX_SAMPLES_EXT\t\t\t\t\t= 0x8D57\n\n# 0x8D58-0x8D5F reserved for additional FBO enums\n\nNV_geometry_program4 enum: (additional; see above)\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT\t= 0x8CD4\n\n###############################################################################\n\n# Khronos OpenGL ES WG: 0x8D60-0x8D6F\n\nOES_texture_cube_map enum: (OpenGL ES only)\n\tTEXTURE_GEN_STR_OES\t\t\t\t= 0x8D60\n\nOES_texture_float enum: (OpenGL ES only)\n\tHALF_FLOAT_OES\t\t\t\t\t= 0x8D61\n\nOES_vertex_half_float enum: (OpenGL ES only)\n\tuse OES_texture_float HALF_FLOAT_OES\n\nOES_framebuffer_object enum: (OpenGL ES only)\n\tRGB565_OES\t\t\t\t\t= 0x8D62\n\n# Khronos_future_use: 0x8D63\n\nOES_compressed_ETC1_RGB8_texture enum: (OpenGL ES only)\n\tETC1_RGB8_OES\t\t\t\t\t= 0x8D64\n\nOES_EGL_image_external enum: (OpenGL ES only) (Khronos bug 4621)\n\tTEXTURE_EXTERNAL_OES\t\t\t\t= 0x8D65\n\tSAMPLER_EXTERNAL_OES\t\t\t\t= 0x8D66\n\tTEXTURE_BINDING_EXTERNAL_OES\t\t\t= 0x8D67\n\tREQUIRED_TEXTURE_IMAGE_UNITS_OES\t\t= 0x8D68\n\n# Khronos_future_use: 0x8D69-0x8D6F\n\n###############################################################################\n\n# NVIDIA: 0x8D70-0x8DEF\n# Reserved per email from Pat Brown 2005/10/13\n\n#@@ separate extensions\nVERSION_3_0 enum:\nEXT_texture_integer enum:\n\tRGBA32UI\t\t\t\t\t= 0x8D70    # VERSION_3_0\n\tRGBA32UI_EXT\t\t\t\t\t= 0x8D70\n\tRGB32UI\t\t\t\t\t\t= 0x8D71    # VERSION_3_0\n\tRGB32UI_EXT\t\t\t\t\t= 0x8D71\n\tALPHA32UI_EXT\t\t\t\t\t= 0x8D72\n\tINTENSITY32UI_EXT\t\t\t\t= 0x8D73\n\tLUMINANCE32UI_EXT\t\t\t\t= 0x8D74\n\tLUMINANCE_ALPHA32UI_EXT\t\t\t\t= 0x8D75\n\tRGBA16UI\t\t\t\t\t= 0x8D76    # VERSION_3_0\n\tRGBA16UI_EXT\t\t\t\t\t= 0x8D76\n\tRGB16UI\t\t\t\t\t\t= 0x8D77    # VERSION_3_0\n\tRGB16UI_EXT\t\t\t\t\t= 0x8D77\n\tALPHA16UI_EXT\t\t\t\t\t= 0x8D78\n\tINTENSITY16UI_EXT\t\t\t\t= 0x8D79\n\tLUMINANCE16UI_EXT\t\t\t\t= 0x8D7A\n\tLUMINANCE_ALPHA16UI_EXT\t\t\t\t= 0x8D7B\n\tRGBA8UI\t\t\t\t\t\t= 0x8D7C    # VERSION_3_0\n\tRGBA8UI_EXT\t\t\t\t\t= 0x8D7C\n\tRGB8UI\t\t\t\t\t\t= 0x8D7D    # VERSION_3_0\n\tRGB8UI_EXT\t\t\t\t\t= 0x8D7D\n\tALPHA8UI_EXT\t\t\t\t\t= 0x8D7E\n\tINTENSITY8UI_EXT\t\t\t\t= 0x8D7F\n\tLUMINANCE8UI_EXT\t\t\t\t= 0x8D80\n\tLUMINANCE_ALPHA8UI_EXT\t\t\t\t= 0x8D81\n\tRGBA32I\t\t\t\t\t\t= 0x8D82    # VERSION_3_0\n\tRGBA32I_EXT\t\t\t\t\t= 0x8D82\n\tRGB32I\t\t\t\t\t\t= 0x8D83    # VERSION_3_0\n\tRGB32I_EXT\t\t\t\t\t= 0x8D83\n\tALPHA32I_EXT\t\t\t\t\t= 0x8D84\n\tINTENSITY32I_EXT\t\t\t\t= 0x8D85\n\tLUMINANCE32I_EXT\t\t\t\t= 0x8D86\n\tLUMINANCE_ALPHA32I_EXT\t\t\t\t= 0x8D87\n\tRGBA16I\t\t\t\t\t\t= 0x8D88    # VERSION_3_0\n\tRGBA16I_EXT\t\t\t\t\t= 0x8D88\n\tRGB16I\t\t\t\t\t\t= 0x8D89    # VERSION_3_0\n\tRGB16I_EXT\t\t\t\t\t= 0x8D89\n\tALPHA16I_EXT\t\t\t\t\t= 0x8D8A\n\tINTENSITY16I_EXT\t\t\t\t= 0x8D8B\n\tLUMINANCE16I_EXT\t\t\t\t= 0x8D8C\n\tLUMINANCE_ALPHA16I_EXT\t\t\t\t= 0x8D8D\n\tRGBA8I\t\t\t\t\t\t= 0x8D8E    # VERSION_3_0\n\tRGBA8I_EXT\t\t\t\t\t= 0x8D8E\n\tRGB8I\t\t\t\t\t\t= 0x8D8F    # VERSION_3_0\n\tRGB8I_EXT\t\t\t\t\t= 0x8D8F\n\tALPHA8I_EXT\t\t\t\t\t= 0x8D90\n\tINTENSITY8I_EXT\t\t\t\t\t= 0x8D91\n\tLUMINANCE8I_EXT\t\t\t\t\t= 0x8D92\n\tLUMINANCE_ALPHA8I_EXT\t\t\t\t= 0x8D93\n\tRED_INTEGER\t\t\t\t\t= 0x8D94    # VERSION_3_0\n\tRED_INTEGER_EXT\t\t\t\t\t= 0x8D94\n\tGREEN_INTEGER\t\t\t\t\t= 0x8D95    # VERSION_3_0\n\tGREEN_INTEGER_EXT\t\t\t\t= 0x8D95\n\tBLUE_INTEGER\t\t\t\t\t= 0x8D96    # VERSION_3_0\n\tBLUE_INTEGER_EXT\t\t\t\t= 0x8D96\n\tALPHA_INTEGER\t\t\t\t\t= 0x8D97    # VERSION_3_0\n\tALPHA_INTEGER_EXT\t\t\t\t= 0x8D97\n\tRGB_INTEGER\t\t\t\t\t= 0x8D98    # VERSION_3_0\n\tRGB_INTEGER_EXT\t\t\t\t\t= 0x8D98\n\tRGBA_INTEGER\t\t\t\t\t= 0x8D99    # VERSION_3_0\n\tRGBA_INTEGER_EXT\t\t\t\t= 0x8D99\n\tBGR_INTEGER\t\t\t\t\t= 0x8D9A    # VERSION_3_0\n\tBGR_INTEGER_EXT\t\t\t\t\t= 0x8D9A\n\tBGRA_INTEGER\t\t\t\t\t= 0x8D9B    # VERSION_3_0\n\tBGRA_INTEGER_EXT\t\t\t\t= 0x8D9B\n\tLUMINANCE_INTEGER_EXT\t\t\t\t= 0x8D9C\n\tLUMINANCE_ALPHA_INTEGER_EXT\t\t\t= 0x8D9D\n\tRGBA_INTEGER_MODE_EXT\t\t\t\t= 0x8D9E\n\n# NV_future_use: 0x8D9F\n\nNV_parameter_buffer_object enum:\n\tMAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV\t= 0x8DA0\n\tMAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV\t\t= 0x8DA1\n\tVERTEX_PROGRAM_PARAMETER_BUFFER_NV\t\t= 0x8DA2\n\tGEOMETRY_PROGRAM_PARAMETER_BUFFER_NV\t\t= 0x8DA3\n\tFRAGMENT_PROGRAM_PARAMETER_BUFFER_NV\t\t= 0x8DA4\n\nNV_gpu_program4 enum: (additional; see above)\n\tMAX_PROGRAM_GENERIC_ATTRIBS_NV\t\t\t= 0x8DA5\n\tMAX_PROGRAM_GENERIC_RESULTS_NV\t\t\t= 0x8DA6\n\nVERSION_3_2 enum:\n\tFRAMEBUFFER_ATTACHMENT_LAYERED\t\t\t= 0x8DA7\n\tFRAMEBUFFER_INCOMPLETE_LAYER_TARGETS\t\t= 0x8DA8\n\nARB_geometry_shader4 enum: (additional; see below)\n\tFRAMEBUFFER_ATTACHMENT_LAYERED_ARB\t\t= 0x8DA7\n\tFRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB\t= 0x8DA8\n\tFRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB\t\t= 0x8DA9\n\nNV_geometry_program4 enum: (additional; see above)\n\tFRAMEBUFFER_ATTACHMENT_LAYERED_EXT\t\t= 0x8DA7\n\tFRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT\t= 0x8DA8\n\tFRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT\t\t= 0x8DA9\n\n# NV_future_use: 0x8DAA\n\nVERSION_3_0 enum:\nARB_depth_buffer_float enum: (additional; see above; some values different from NV; note: no ARB suffixes)\n\tFLOAT_32_UNSIGNED_INT_24_8_REV\t\t\t= 0x8DAD\n\nNV_depth_buffer_float enum:\n\tDEPTH_COMPONENT32F_NV\t\t\t\t= 0x8DAB\n\tDEPTH32F_STENCIL8_NV\t\t\t\t= 0x8DAC\n\tFLOAT_32_UNSIGNED_INT_24_8_REV_NV\t\t= 0x8DAD\n\tDEPTH_BUFFER_FLOAT_MODE_NV\t\t\t= 0x8DAF\n\n# NV_future_use: 0x8DAE\n# NV_future_use: 0x8DB0-0x8DB8\n\nVERSION_3_0 enum:\nARB_framebuffer_sRGB enum: (note: no ARB suffixes)\n\tFRAMEBUFFER_SRGB\t\t\t\t= 0x8DB9    # VERSION_3_0 / ARB_sRGB\n\nEXT_framebuffer_sRGB enum:\n\tFRAMEBUFFER_SRGB_EXT\t\t\t\t= 0x8DB9\n\tFRAMEBUFFER_SRGB_CAPABLE_EXT\t\t\t= 0x8DBA\n\nVERSION_3_0 enum:\nARB_texture_compression_rgtc enum: (note: no ARB suffixes)\n\tCOMPRESSED_RED_RGTC1\t\t\t\t= 0x8DBB    # VERSION_3_0 / ARB_tcrgtc\n\tCOMPRESSED_SIGNED_RED_RGTC1\t\t\t= 0x8DBC    # VERSION_3_0 / ARB_tcrgtc\n\tCOMPRESSED_RG_RGTC2\t\t\t\t= 0x8DBD    # VERSION_3_0 / ARB_tcrgtc\n\tCOMPRESSED_SIGNED_RG_RGTC2\t\t\t= 0x8DBE    # VERSION_3_0 / ARB_tcrgtc\n\nEXT_texture_compression_rgtc enum:\n\tCOMPRESSED_RED_RGTC1_EXT\t\t\t= 0x8DBB\n\tCOMPRESSED_SIGNED_RED_RGTC1_EXT\t\t\t= 0x8DBC\n\tCOMPRESSED_RED_GREEN_RGTC2_EXT\t\t\t= 0x8DBD\n\tCOMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT\t\t= 0x8DBE\n\n# NV_future_use: 0x8DBF\n\nVERSION_3_0 enum:\n\tSAMPLER_1D_ARRAY\t\t\t\t= 0x8DC0    # VERSION_3_0\n\tSAMPLER_2D_ARRAY\t\t\t\t= 0x8DC1    # VERSION_3_0\n\tSAMPLER_1D_ARRAY_SHADOW\t\t\t\t= 0x8DC3    # VERSION_3_0\n\tSAMPLER_2D_ARRAY_SHADOW\t\t\t\t= 0x8DC4    # VERSION_3_0\n\tSAMPLER_CUBE_SHADOW\t\t\t\t= 0x8DC5    # VERSION_3_0\n\tUNSIGNED_INT_VEC2\t\t\t\t= 0x8DC6    # VERSION_3_0\n\tUNSIGNED_INT_VEC3\t\t\t\t= 0x8DC7    # VERSION_3_0\n\tUNSIGNED_INT_VEC4\t\t\t\t= 0x8DC8    # VERSION_3_0\n\tINT_SAMPLER_1D\t\t\t\t\t= 0x8DC9    # VERSION_3_0\n\tINT_SAMPLER_2D\t\t\t\t\t= 0x8DCA    # VERSION_3_0\n\tINT_SAMPLER_3D\t\t\t\t\t= 0x8DCB    # VERSION_3_0\n\tINT_SAMPLER_CUBE\t\t\t\t= 0x8DCC    # VERSION_3_0\n\tINT_SAMPLER_1D_ARRAY\t\t\t\t= 0x8DCE    # VERSION_3_0\n\tINT_SAMPLER_2D_ARRAY\t\t\t\t= 0x8DCF    # VERSION_3_0\n\tUNSIGNED_INT_SAMPLER_1D\t\t\t\t= 0x8DD1    # VERSION_3_0\n\tUNSIGNED_INT_SAMPLER_2D\t\t\t\t= 0x8DD2    # VERSION_3_0\n\tUNSIGNED_INT_SAMPLER_3D\t\t\t\t= 0x8DD3    # VERSION_3_0\n\tUNSIGNED_INT_SAMPLER_CUBE\t\t\t= 0x8DD4    # VERSION_3_0\n\tUNSIGNED_INT_SAMPLER_1D_ARRAY\t\t\t= 0x8DD6    # VERSION_3_0\n\tUNSIGNED_INT_SAMPLER_2D_ARRAY\t\t\t= 0x8DD7    # VERSION_3_0\n\nVERSION_3_1 enum: (Promoted from EXT_gpu_shader4 + ARB_texture_rectangle / ARB_uniform_buffer_object)\n\tSAMPLER_BUFFER\t\t\t\t\t= 0x8DC2    # EXT_gpu_shader4 + ARB_texture_buffer_object\n\tINT_SAMPLER_2D_RECT\t\t\t\t= 0x8DCD    # EXT_gpu_shader4 + ARB_texture_rectangle\n\tINT_SAMPLER_BUFFER\t\t\t\t= 0x8DD0    # EXT_gpu_shader4 + ARB_texture_buffer_object\n\tUNSIGNED_INT_SAMPLER_2D_RECT\t\t\t= 0x8DD5    # EXT_gpu_shader4 + ARB_texture_rectangle\n\tUNSIGNED_INT_SAMPLER_BUFFER\t\t\t= 0x8DD8    # EXT_gpu_shader4 + ARB_texture_buffer_object\n\nEXT_gpu_shader4 enum:\n\tSAMPLER_1D_ARRAY_EXT\t\t\t\t= 0x8DC0\n\tSAMPLER_2D_ARRAY_EXT\t\t\t\t= 0x8DC1\n\tSAMPLER_BUFFER_EXT\t\t\t\t= 0x8DC2\n\tSAMPLER_1D_ARRAY_SHADOW_EXT\t\t\t= 0x8DC3\n\tSAMPLER_2D_ARRAY_SHADOW_EXT\t\t\t= 0x8DC4\n\tSAMPLER_CUBE_SHADOW_EXT\t\t\t\t= 0x8DC5\n\tUNSIGNED_INT_VEC2_EXT\t\t\t\t= 0x8DC6\n\tUNSIGNED_INT_VEC3_EXT\t\t\t\t= 0x8DC7\n\tUNSIGNED_INT_VEC4_EXT\t\t\t\t= 0x8DC8\n\tINT_SAMPLER_1D_EXT\t\t\t\t= 0x8DC9\n\tINT_SAMPLER_2D_EXT\t\t\t\t= 0x8DCA\n\tINT_SAMPLER_3D_EXT\t\t\t\t= 0x8DCB\n\tINT_SAMPLER_CUBE_EXT\t\t\t\t= 0x8DCC\n\tINT_SAMPLER_2D_RECT_EXT\t\t\t\t= 0x8DCD\n\tINT_SAMPLER_1D_ARRAY_EXT\t\t\t= 0x8DCE\n\tINT_SAMPLER_2D_ARRAY_EXT\t\t\t= 0x8DCF\n\tINT_SAMPLER_BUFFER_EXT\t\t\t\t= 0x8DD0\n\tUNSIGNED_INT_SAMPLER_1D_EXT\t\t\t= 0x8DD1\n\tUNSIGNED_INT_SAMPLER_2D_EXT\t\t\t= 0x8DD2\n\tUNSIGNED_INT_SAMPLER_3D_EXT\t\t\t= 0x8DD3\n\tUNSIGNED_INT_SAMPLER_CUBE_EXT\t\t\t= 0x8DD4\n\tUNSIGNED_INT_SAMPLER_2D_RECT_EXT\t\t= 0x8DD5\n\tUNSIGNED_INT_SAMPLER_1D_ARRAY_EXT\t\t= 0x8DD6\n\tUNSIGNED_INT_SAMPLER_2D_ARRAY_EXT\t\t= 0x8DD7\n\tUNSIGNED_INT_SAMPLER_BUFFER_EXT\t\t\t= 0x8DD8\n\nVERSION_3_2 enum:\n\tGEOMETRY_SHADER\t\t\t\t\t= 0x8DD9\n\nARB_geometry_shader4 enum:\n\tGEOMETRY_SHADER_ARB\t\t\t\t= 0x8DD9\n\nEXT_geometry_shader4 enum:\n\tGEOMETRY_SHADER_EXT\t\t\t\t= 0x8DD9\n\nARB_geometry_shader4 enum: (additional; see above)\n\tGEOMETRY_VERTICES_OUT_ARB\t\t\t= 0x8DDA\n\tGEOMETRY_INPUT_TYPE_ARB\t\t\t\t= 0x8DDB\n\tGEOMETRY_OUTPUT_TYPE_ARB\t\t\t= 0x8DDC\n\nNV_geometry_program4 enum: (additional; see above)\n\tGEOMETRY_VERTICES_OUT_EXT\t\t\t= 0x8DDA\n\tGEOMETRY_INPUT_TYPE_EXT\t\t\t\t= 0x8DDB\n\tGEOMETRY_OUTPUT_TYPE_EXT\t\t\t= 0x8DDC\n\nARB_geometry_shader4 enum: (additional; see above)\n\tMAX_GEOMETRY_VARYING_COMPONENTS_ARB\t\t= 0x8DDD\n\tMAX_VERTEX_VARYING_COMPONENTS_ARB\t\t= 0x8DDE\n\tMAX_GEOMETRY_UNIFORM_COMPONENTS_ARB\t\t= 0x8DDF\n\tMAX_GEOMETRY_OUTPUT_VERTICES_ARB\t\t= 0x8DE0\n\tMAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB\t= 0x8DE1\n\nVERSION_3_2 enum:\n\tMAX_GEOMETRY_UNIFORM_COMPONENTS\t\t\t= 0x8DDF\n\tMAX_GEOMETRY_OUTPUT_VERTICES\t\t\t= 0x8DE0\n\tMAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS\t\t= 0x8DE1\n\nEXT_geometry_shader4 enum: (additional; see above)\n\tMAX_GEOMETRY_VARYING_COMPONENTS_EXT\t\t= 0x8DDD\n\tMAX_VERTEX_VARYING_COMPONENTS_EXT\t\t= 0x8DDE\n\tMAX_GEOMETRY_UNIFORM_COMPONENTS_EXT\t\t= 0x8DDF\n\tMAX_GEOMETRY_OUTPUT_VERTICES_EXT\t\t= 0x8DE0\n\tMAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT\t= 0x8DE1\n\nEXT_bindable_uniform enum:\n\tMAX_VERTEX_BINDABLE_UNIFORMS_EXT\t\t= 0x8DE2\n\tMAX_FRAGMENT_BINDABLE_UNIFORMS_EXT\t\t= 0x8DE3\n\tMAX_GEOMETRY_BINDABLE_UNIFORMS_EXT\t\t= 0x8DE4\n\n# NV_future_use: 0x8DE5-0x8DEC\n\nEXT_bindable_uniform enum: (additional; see above)\n\tMAX_BINDABLE_UNIFORM_SIZE_EXT\t\t\t= 0x8DED\n\tUNIFORM_BUFFER_EXT\t\t\t\t= 0x8DEE\n\tUNIFORM_BUFFER_BINDING_EXT\t\t\t= 0x8DEF\n\n###############################################################################\n\n# Khronos OpenGL ES WG: 0x8DF0-0x8E0F\n\n# Khronos_future_use: 0x8DF0-0x8DF5\n\nOES_vertex_type_10_10_10_2 enum: (OpenGL ES only)\n\tUNSIGNED_INT_10_10_10_2_OES\t\t\t= 0x8DF6\n\tINT_10_10_10_2_OES\t\t\t\t= 0x8DF7\n\n# Khronos_future_use: 0x8DF8-0x8E0F\n\n###############################################################################\n\n# NVIDIA: 0x8E10-0x8E8F\n# Reserved per email from Michael Gold 2006/8/7\n\nNV_framebuffer_multisample_coverage enum:\n\tRENDERBUFFER_COLOR_SAMPLES_NV\t\t\t= 0x8E10\n\tMAX_MULTISAMPLE_COVERAGE_MODES_NV\t\t= 0x8E11\n\tMULTISAMPLE_COVERAGE_MODES_NV\t\t\t= 0x8E12\n\nVERSION_3_0 enum:\n\tQUERY_WAIT\t\t\t\t\t= 0x8E13    # VERSION_3_0\n\tQUERY_NO_WAIT\t\t\t\t\t= 0x8E14    # VERSION_3_0\n\tQUERY_BY_REGION_WAIT\t\t\t\t= 0x8E15    # VERSION_3_0\n\tQUERY_BY_REGION_NO_WAIT\t\t\t\t= 0x8E16    # VERSION_3_0\n\nGL_NV_conditional_render enum:\n\tQUERY_WAIT_NV\t\t\t\t\t= 0x8E13\n\tQUERY_NO_WAIT_NV\t\t\t\t= 0x8E14\n\tQUERY_BY_REGION_WAIT_NV\t\t\t\t= 0x8E15\n\tQUERY_BY_REGION_NO_WAIT_NV\t\t\t= 0x8E16\n\n# NV_future_use: 0x8E17-0x8E21\n\nNV_transform_feedback2 enum:\n      TRANSFORM_FEEDBACK_NV\t\t\t\t= 0x8E22\n      TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV\t\t= 0x8E23\n      TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV\t\t= 0x8E24\n      TRANSFORM_FEEDBACK_BINDING_NV\t\t\t= 0x8E25\n\nNV_present_video enum:\n\tFRAME_NV\t\t\t\t\t= 0x8E26\n\tFIELDS_NV\t\t\t\t\t= 0x8E27\n\tCURRENT_TIME_NV\t\t\t\t\t= 0x8E28\n\tNUM_FILL_STREAMS_NV\t\t\t\t= 0x8E29\n\tPRESENT_TIME_NV\t\t\t\t\t= 0x8E2A\n\tPRESENT_DURATION_NV\t\t\t\t= 0x8E2B\n\nNV_depth_nonlinear enum: (OpenGL ES only)\n\tDEPTH_COMPONENT16_NONLINEAR_NV\t\t\t= 0x8E2C\n\nEXT_direct_state_access enum:\n\tPROGRAM_MATRIX_EXT\t\t\t\t= 0x8E2D\n\tTRANSPOSE_PROGRAM_MATRIX_EXT\t\t\t= 0x8E2E\n\tPROGRAM_MATRIX_STACK_DEPTH_EXT\t\t\t= 0x8E2F\n\n# NV_future_use: 0x8E30-0x8E41\n\nEXT_texture_swizzle enum:\n\tTEXTURE_SWIZZLE_R_EXT\t\t\t\t= 0x8E42\n\tTEXTURE_SWIZZLE_G_EXT\t\t\t\t= 0x8E43\n\tTEXTURE_SWIZZLE_B_EXT\t\t\t\t= 0x8E44\n\tTEXTURE_SWIZZLE_A_EXT\t\t\t\t= 0x8E45\n\tTEXTURE_SWIZZLE_RGBA_EXT\t\t\t= 0x8E46\n\n# NV_future_use: 0x8E47-0x8E4B\n\nVERSION_3_2 enum:\n\tuse ARB_provoking_vertex\t    QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION\n\tuse ARB_provoking_vertex\t    FIRST_VERTEX_CONVENTION\n\tuse ARB_provoking_vertex\t    LAST_VERTEX_CONVENTION\n\tuse ARB_provoking_vertex\t    PROVOKING_VERTEX\n\nARB_provoking_vertex enum:\n\tQUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION\t= 0x8E4C\n\tFIRST_VERTEX_CONVENTION\t\t\t\t= 0x8E4D\n\tLAST_VERTEX_CONVENTION\t\t\t\t= 0x8E4E\n\tPROVOKING_VERTEX\t\t\t\t= 0x8E4F\n\nEXT_provoking_vertex enum:\n\tQUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT\t= 0x8E4C\n\tFIRST_VERTEX_CONVENTION_EXT\t\t\t= 0x8E4D\n\tLAST_VERTEX_CONVENTION_EXT\t\t\t= 0x8E4E\n\tPROVOKING_VERTEX_EXT\t\t\t\t= 0x8E4F\n\nVERSION_3_2 enum:\n\tuse ARB_texture_multisample\t    SAMPLE_POSITION\n\tuse ARB_texture_multisample\t    SAMPLE_MASK\n\tuse ARB_texture_multisample\t    SAMPLE_MASK_VALUE\n\tuse ARB_texture_multisample\t    MAX_SAMPLE_MASK_WORDS\n\nARB_texture_multisample enum:\n\tSAMPLE_POSITION\t\t\t\t\t= 0x8E50\n\tSAMPLE_MASK\t\t\t\t\t= 0x8E51\n\tSAMPLE_MASK_VALUE\t\t\t\t= 0x8E52\n\tMAX_SAMPLE_MASK_WORDS\t\t\t\t= 0x8E59\n\nNV_explicit_multisample enum:\n\tSAMPLE_POSITION_NV\t\t\t\t= 0x8E50\n\tSAMPLE_MASK_NV\t\t\t\t\t= 0x8E51\n\tSAMPLE_MASK_VALUE_NV\t\t\t\t= 0x8E52\n\tTEXTURE_BINDING_RENDERBUFFER_NV\t\t\t= 0x8E53\n\tTEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV\t= 0x8E54\n\tTEXTURE_RENDERBUFFER_NV\t\t\t\t= 0x8E55\n\tSAMPLER_RENDERBUFFER_NV\t\t\t\t= 0x8E56\n\tINT_SAMPLER_RENDERBUFFER_NV\t\t\t= 0x8E57\n\tUNSIGNED_INT_SAMPLER_RENDERBUFFER_NV\t\t= 0x8E58\n\tMAX_SAMPLE_MASK_WORDS_NV\t\t\t= 0x8E59\n\n# NV_future_use: 0x8E5A-0x8E5D\n\nARB_texture_gather enum:\n\tMIN_PROGRAM_TEXTURE_GATHER_OFFSET\t\t= 0x8E5E\n\tMAX_PROGRAM_TEXTURE_GATHER_OFFSET\t\t= 0x8E5F\n\n# NV_future_use: 0x8E60-0x8E8F\n\n###############################################################################\n\n# QNX: 0x8E90-0x8E9F\n# For GL_QNX_texture_tiling, GL_QNX_complex_polygon, GL_QNX_stippled_lines\n# (Khronos bug 696)\n\n# QNX_future_use: 0x8E90-0x8E9F\n\n###############################################################################\n\n# Imagination Tech.: 0x8EA0-0x8EAF\n\n###############################################################################\n\n# Khronos OpenGL ES WG: 0x8EB0-0x8EBF\n# Assigned for Affie Munshi on 2007/07/20\n\n###############################################################################\n\n# Vincent: 0x8EC0-0x8ECF\n\n###############################################################################\n\n# NVIDIA: 0x8ED0-0x8F4F\n# Assigned for Pat Brown (Khronos bug 3191)\n\nNV_coverage_sample enum: (OpenGL ES only)\n\tCOVERAGE_COMPONENT_NV\t\t\t\t= 0x8ED0\n\tCOVERAGE_COMPONENT4_NV\t\t\t\t= 0x8ED1\n\tCOVERAGE_ATTACHMENT_NV\t\t\t\t= 0x8ED2\n\tCOVERAGE_BUFFERS_NV\t\t\t\t= 0x8ED3\n\tCOVERAGE_SAMPLES_NV\t\t\t\t= 0x8ED4\n\tCOVERAGE_ALL_FRAGMENTS_NV\t\t\t= 0x8ED5\n\tCOVERAGE_EDGE_FRAGMENTS_NV\t\t\t= 0x8ED6\n\tCOVERAGE_AUTOMATIC_NV\t\t\t\t= 0x8ED7\n\tCOVERAGE_BUFFER_BIT_NV\t\t\t\t= 0x00008000\n\n# NV_future_use: 0x8ED8-0x8F1C\n\nNV_shader_buffer_load enum:\n\tBUFFER_GPU_ADDRESS_NV\t\t\t\t= 0x8F1D\n\nNV_vertex_buffer_unified_memory enum:\n\tVERTEX_ATTRIB_ARRAY_UNIFIED_NV\t\t\t= 0x8F1E\n\tELEMENT_ARRAY_UNIFIED_NV\t\t\t= 0x8F1F\n\tVERTEX_ATTRIB_ARRAY_ADDRESS_NV\t\t\t= 0x8F20\n\tVERTEX_ARRAY_ADDRESS_NV\t\t\t\t= 0x8F21\n\tNORMAL_ARRAY_ADDRESS_NV\t\t\t\t= 0x8F22\n\tCOLOR_ARRAY_ADDRESS_NV\t\t\t\t= 0x8F23\n\tINDEX_ARRAY_ADDRESS_NV\t\t\t\t= 0x8F24\n\tTEXTURE_COORD_ARRAY_ADDRESS_NV\t\t\t= 0x8F25\n\tEDGE_FLAG_ARRAY_ADDRESS_NV\t\t\t= 0x8F26\n\tSECONDARY_COLOR_ARRAY_ADDRESS_NV\t\t= 0x8F27\n\tFOG_COORD_ARRAY_ADDRESS_NV\t\t\t= 0x8F28\n\tELEMENT_ARRAY_ADDRESS_NV\t\t\t= 0x8F29\n\tVERTEX_ATTRIB_ARRAY_LENGTH_NV\t\t\t= 0x8F2A\n\tVERTEX_ARRAY_LENGTH_NV\t\t\t\t= 0x8F2B\n\tNORMAL_ARRAY_LENGTH_NV\t\t\t\t= 0x8F2C\n\tCOLOR_ARRAY_LENGTH_NV\t\t\t\t= 0x8F2D\n\tINDEX_ARRAY_LENGTH_NV\t\t\t\t= 0x8F2E\n\tTEXTURE_COORD_ARRAY_LENGTH_NV\t\t\t= 0x8F2F\n\tEDGE_FLAG_ARRAY_LENGTH_NV\t\t\t= 0x8F30\n\tSECONDARY_COLOR_ARRAY_LENGTH_NV\t\t\t= 0x8F31\n\tFOG_COORD_ARRAY_LENGTH_NV\t\t\t= 0x8F32\n\tELEMENT_ARRAY_LENGTH_NV\t\t\t\t= 0x8F33\n\nNV_shader_buffer_load enum: (additional; see above)\n\tGPU_ADDRESS_NV\t\t\t\t\t= 0x8F34\n\tMAX_SHADER_BUFFER_ADDRESS_NV\t\t\t= 0x8F35\n\nARB_copy_buffer enum:\n\tCOPY_READ_BUFFER\t\t\t\t= 0x8F36\n\tCOPY_WRITE_BUFFER\t\t\t\t= 0x8F37\n\nVERSION_3_1 enum:\n\tuse ARB_copy_buffer\t\t    COPY_READ_BUFFER\n\tuse ARB_copy_buffer\t\t    COPY_WRITE_BUFFER\n\n# NVIDIA_future_use: 0x8F38-0x8F4F\n\n###############################################################################\n\n# 3Dlabs: 0x8F50-0x8F5F\n# Assigned for Jon Kennedy (Khronos public bug 75)\n\n###############################################################################\n\n# ARM: 0x8F60-0x8F6F\n# Assigned for Remi Pedersen (Khronos bug 3745)\n\n###############################################################################\n\n# HI Corp: 0x8F70-0x8F7F\n# Assigned for Mark Callow (Khronos bug 4055)\n\n###############################################################################\n\n# Zebra Imaging: 0x8F80-0x8F8F\n# Assigned for Mike Weiblen (Khronos public bug 91)\n\n###############################################################################\n\n# OpenGL ARB: 0x8F90-0x8F9F (SNORM textures, 3.1 primitive restart server state)\n\nVERSION_3_1 enum:\n\tRED_SNORM\t\t\t\t\t= 0x8F90    # VERSION_3_1\n\tRG_SNORM\t\t\t\t\t= 0x8F91    # VERSION_3_1\n\tRGB_SNORM\t\t\t\t\t= 0x8F92    # VERSION_3_1\n\tRGBA_SNORM\t\t\t\t\t= 0x8F93    # VERSION_3_1\n\tR8_SNORM\t\t\t\t\t= 0x8F94    # VERSION_3_1\n\tRG8_SNORM\t\t\t\t\t= 0x8F95    # VERSION_3_1\n\tRGB8_SNORM\t\t\t\t\t= 0x8F96    # VERSION_3_1\n\tRGBA8_SNORM\t\t\t\t\t= 0x8F97    # VERSION_3_1\n\tR16_SNORM\t\t\t\t\t= 0x8F98    # VERSION_3_1\n\tRG16_SNORM\t\t\t\t\t= 0x8F99    # VERSION_3_1\n\tRGB16_SNORM\t\t\t\t\t= 0x8F9A    # VERSION_3_1\n\tRGBA16_SNORM\t\t\t\t\t= 0x8F9B    # VERSION_3_1\n\tSIGNED_NORMALIZED\t\t\t\t= 0x8F9C    # VERSION_3_1\n\tPRIMITIVE_RESTART\t\t\t\t= 0x8F9D    # Different from NV_primitive_restart value\n\tPRIMITIVE_RESTART_INDEX\t\t\t\t= 0x8F9E    # Different from NV_primitive_restart value\n\nARB_texture_gather enum: (additional; see above)\n\tMAX_PROGRAM_TEXTURE_GATHER_COMPONENTS\t\t= 0x8F9F\n\n###############################################################################\n\n# Qualcomm: 0x8FA0-0x8FBF\n# Assigned for Maurice Ribble (Khronos bug 4512)\n\nQCOM_driver_control enum: (OpenGL ES only)\n\tPERFMON_GLOBAL_MODE_QCOM\t\t\t= 0x8FA0\n\n# QCOM_future_use: 0x8FA1-0x8FBF\n\n###############################################################################\n\n# Vivante: 0x8FC0-0x8FDF\n# Assigned for Frido Garritsen\t(Khronos bug 4526)\n\n###############################################################################\n\n# NVIDIA: 0x8FE0-0x8FFF\n# Assigned for Pat Brown (Khronos bug 4935)\n\n# NV_future_use: 0x8FE0-0x8FFF\n\n###############################################################################\n\n# AMD: 0x9000-0x901F\n# Assigned for Bill Licea-Kane\n\nAMD_vertex_shader_tesselator enum:\n\tSAMPLER_BUFFER_AMD\t\t\t\t= 0x9001\n\tINT_SAMPLER_BUFFER_AMD\t\t\t\t= 0x9002\n\tUNSIGNED_INT_SAMPLER_BUFFER_AMD\t\t\t= 0x9003\n\tTESSELLATION_MODE_AMD\t\t\t\t= 0x9004\n\tTESSELLATION_FACTOR_AMD\t\t\t\t= 0x9005\n\tDISCRETE_AMD\t\t\t\t\t= 0x9006\n\tCONTINUOUS_AMD\t\t\t\t\t= 0x9007\n\n# AMD_future_use: 0x9008\n\nARB_texture_cube_map_array enum:\n\tTEXTURE_CUBE_MAP_ARRAY\t\t\t\t= 0x9009\n\tTEXTURE_BINDING_CUBE_MAP_ARRAY\t\t\t= 0x900A\n\tPROXY_TEXTURE_CUBE_MAP_ARRAY\t\t\t= 0x900B\n\tSAMPLER_CUBE_MAP_ARRAY\t\t\t\t= 0x900C\n\tSAMPLER_CUBE_MAP_ARRAY_SHADOW\t\t\t= 0x900D\n\tINT_SAMPLER_CUBE_MAP_ARRAY\t\t\t= 0x900E\n\tUNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY\t\t= 0x900F\n\nEXT_texture_snorm enum:\n\tALPHA_SNORM\t\t\t\t\t= 0x9010\n\tLUMINANCE_SNORM\t\t\t\t\t= 0x9011\n\tLUMINANCE_ALPHA_SNORM\t\t\t\t= 0x9012\n\tINTENSITY_SNORM\t\t\t\t\t= 0x9013\n\tALPHA8_SNORM\t\t\t\t\t= 0x9014\n\tLUMINANCE8_SNORM\t\t\t\t= 0x9015\n\tLUMINANCE8_ALPHA8_SNORM\t\t\t\t= 0x9016\n\tINTENSITY8_SNORM\t\t\t\t= 0x9017\n\tALPHA16_SNORM\t\t\t\t\t= 0x9018\n\tLUMINANCE16_SNORM\t\t\t\t= 0x9019\n\tLUMINANCE16_ALPHA16_SNORM\t\t\t= 0x901A\n\tINTENSITY16_SNORM\t\t\t\t= 0x901B\n\n# AMD_future_use: 0x901C-0x901F\n\n###############################################################################\n\n# NVIDIA: 0x9020-0x90FF\n# Assigned for Pat Brown (Khronos bug 4935)\n\nNV_video_capture enum:\n\t  VIDEO_BUFFER_NV\t\t\t\t  = 0x9020\n\t  VIDEO_BUFFER_BINDING_NV\t\t\t  = 0x9021\n\t  FIELD_UPPER_NV\t\t\t\t  = 0x9022\n\t  FIELD_LOWER_NV\t\t\t\t  = 0x9023\n\t  NUM_VIDEO_CAPTURE_STREAMS_NV\t\t\t  = 0x9024\n\t  NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV\t\t  = 0x9025\n\t  VIDEO_CAPTURE_TO_422_SUPPORTED_NV\t\t  = 0x9026\n\t  LAST_VIDEO_CAPTURE_STATUS_NV\t\t\t  = 0x9027\n\t  VIDEO_BUFFER_PITCH_NV\t\t\t\t  = 0x9028\n\t  VIDEO_COLOR_CONVERSION_MATRIX_NV\t\t  = 0x9029\n\t  VIDEO_COLOR_CONVERSION_MAX_NV\t\t\t  = 0x902A\n\t  VIDEO_COLOR_CONVERSION_MIN_NV\t\t\t  = 0x902B\n\t  VIDEO_COLOR_CONVERSION_OFFSET_NV\t\t  = 0x902C\n\t  VIDEO_BUFFER_INTERNAL_FORMAT_NV\t\t  = 0x902D\n\t  PARTIAL_SUCCESS_NV\t\t\t\t  = 0x902E\n\t  SUCCESS_NV\t\t\t\t\t  = 0x902F\n\t  FAILURE_NV\t\t\t\t\t  = 0x9030\n\t  YCBYCR8_422_NV\t\t\t\t  = 0x9031\n\t  YCBAYCR8A_4224_NV\t\t\t\t  = 0x9032\n\t  Z6Y10Z6CB10Z6Y10Z6CR10_422_NV\t\t\t  = 0x9033\n\t  Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV\t  = 0x9034\n\t  Z4Y12Z4CB12Z4Y12Z4CR12_422_NV\t\t\t  = 0x9035\n\t  Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV\t  = 0x9036\n\t  Z4Y12Z4CB12Z4CR12_444_NV\t\t\t  = 0x9037\n\t  VIDEO_CAPTURE_FRAME_WIDTH_NV\t\t\t  = 0x9038\n\t  VIDEO_CAPTURE_FRAME_HEIGHT_NV\t\t\t  = 0x9039\n\t  VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV\t\t  = 0x903A\n\t  VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV\t\t  = 0x903B\n\t  VIDEO_CAPTURE_SURFACE_ORIGIN_NV\t\t  = 0x903C\n\n# NV_future_use: 0x903D-0x90FF\n\n###############################################################################\n\n# OpenGL ARB: 0x9100-0x912F\n\nVERSION_3_2 enum:\n\tuse ARB_texture_multisample\t    TEXTURE_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    PROXY_TEXTURE_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    TEXTURE_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    TEXTURE_BINDING_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    TEXTURE_SAMPLES\n\tuse ARB_texture_multisample\t    TEXTURE_FIXED_SAMPLE_LOCATIONS\n\tuse ARB_texture_multisample\t    SAMPLER_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    INT_SAMPLER_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    SAMPLER_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    INT_SAMPLER_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    MAX_COLOR_TEXTURE_SAMPLES\n\tuse ARB_texture_multisample\t    MAX_DEPTH_TEXTURE_SAMPLES\n\tuse ARB_texture_multisample\t    MAX_INTEGER_SAMPLES\n\nARB_texture_multisample enum:\n\tTEXTURE_2D_MULTISAMPLE\t\t\t\t= 0x9100\n\tPROXY_TEXTURE_2D_MULTISAMPLE\t\t\t= 0x9101\n\tTEXTURE_2D_MULTISAMPLE_ARRAY\t\t\t= 0x9102\n\tPROXY_TEXTURE_2D_MULTISAMPLE_ARRAY\t\t= 0x9103\n\tTEXTURE_BINDING_2D_MULTISAMPLE\t\t\t= 0x9104\n\tTEXTURE_BINDING_2D_MULTISAMPLE_ARRAY\t\t= 0x9105\n\tTEXTURE_SAMPLES\t\t\t\t\t= 0x9106\n\tTEXTURE_FIXED_SAMPLE_LOCATIONS\t\t\t= 0x9107\n\tSAMPLER_2D_MULTISAMPLE\t\t\t\t= 0x9108\n\tINT_SAMPLER_2D_MULTISAMPLE\t\t\t= 0x9109\n\tUNSIGNED_INT_SAMPLER_2D_MULTISAMPLE\t\t= 0x910A\n\tSAMPLER_2D_MULTISAMPLE_ARRAY\t\t\t= 0x910B\n\tINT_SAMPLER_2D_MULTISAMPLE_ARRAY\t\t= 0x910C\n\tUNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY\t= 0x910D\n\tMAX_COLOR_TEXTURE_SAMPLES\t\t\t= 0x910E\n\tMAX_DEPTH_TEXTURE_SAMPLES\t\t\t= 0x910F\n\tMAX_INTEGER_SAMPLES\t\t\t\t= 0x9110\n\nVERSION_3_2 enum:\n\tuse ARB_sync\t\t\t    MAX_SERVER_WAIT_TIMEOUT\n\tuse ARB_sync\t\t\t    OBJECT_TYPE\n\tuse ARB_sync\t\t\t    SYNC_CONDITION\n\tuse ARB_sync\t\t\t    SYNC_STATUS\n\tuse ARB_sync\t\t\t    SYNC_FLAGS\n\tuse ARB_sync\t\t\t    SYNC_FENCE\n\tuse ARB_sync\t\t\t    SYNC_GPU_COMMANDS_COMPLETE\n\tuse ARB_sync\t\t\t    UNSIGNALED\n\tuse ARB_sync\t\t\t    SIGNALED\n\tuse ARB_sync\t\t\t    ALREADY_SIGNALED\n\tuse ARB_sync\t\t\t    TIMEOUT_EXPIRED\n\tuse ARB_sync\t\t\t    CONDITION_SATISFIED\n\tuse ARB_sync\t\t\t    WAIT_FAILED\n\tuse ARB_sync\t\t\t    TIMEOUT_IGNORED\n\tuse ARB_sync\t\t\t    SYNC_FLUSH_COMMANDS_BIT\n\tuse ARB_sync\t\t\t    TIMEOUT_IGNORED\n\nARB_sync enum:\n\tMAX_SERVER_WAIT_TIMEOUT\t\t\t\t= 0x9111\n\tOBJECT_TYPE\t\t\t\t\t= 0x9112\n\tSYNC_CONDITION\t\t\t\t\t= 0x9113\n\tSYNC_STATUS\t\t\t\t\t= 0x9114\n\tSYNC_FLAGS\t\t\t\t\t= 0x9115\n\tSYNC_FENCE\t\t\t\t\t= 0x9116\n\tSYNC_GPU_COMMANDS_COMPLETE\t\t\t= 0x9117\n\tUNSIGNALED\t\t\t\t\t= 0x9118\n\tSIGNALED\t\t\t\t\t= 0x9119\n\tALREADY_SIGNALED\t\t\t\t= 0x911A\n\tTIMEOUT_EXPIRED\t\t\t\t\t= 0x911B\n\tCONDITION_SATISFIED\t\t\t\t= 0x911C\n\tWAIT_FAILED\t\t\t\t\t= 0x911D\n\tSYNC_FLUSH_COMMANDS_BIT\t\t\t\t= 0x00000001\n\tTIMEOUT_IGNORED\t\t\t\t\t= 0xFFFFFFFFFFFFFFFFull\n\nVERSION_3_0 enum:\n\tBUFFER_ACCESS_FLAGS\t\t\t\t= 0x911F\n\tBUFFER_MAP_LENGTH\t\t\t\t= 0x9120\n\tBUFFER_MAP_OFFSET\t\t\t\t= 0x9121\n\nVERSION_3_2 enum:\n\tMAX_VERTEX_OUTPUT_COMPONENTS\t\t\t= 0x9122\n\tMAX_GEOMETRY_INPUT_COMPONENTS\t\t\t= 0x9123\n\tMAX_GEOMETRY_OUTPUT_COMPONENTS\t\t\t= 0x9124\n\tMAX_FRAGMENT_INPUT_COMPONENTS\t\t\t= 0x9125\n\nVERSION_3_2 enum:\n\tCONTEXT_CORE_PROFILE_BIT\t\t\t= 0x00000001\n\tCONTEXT_COMPATIBILITY_PROFILE_BIT\t\t= 0x00000002\n\tCONTEXT_PROFILE_MASK\t\t\t\t= 0x9126\n\n# ARB_future_use: 0x9127-0x912F\n\n###############################################################################\n\n# Imagination Tech.: 0x9130-0x913F (Khronos bug 882)\n\nIMG_program_binary: (OpenGL ES only)\n\tSGX_PROGRAM_BINARY_IMG\t\t\t\t= 0x9130\n\n# IMG_future_use: 0x9131-0x913F\n\n###############################################################################\n\n# AMD: 0x9140-0x91BF (Khronos bugs 5899, 6004)\n\n# AMD_future_use: 0x9140-0x91BF\n# AMD_future_use: 0x91C0-0x923F\n\n###############################################################################\n### Please remember that new enumerant allocations must be obtained by request\n### to the Khronos API registrar (see comments at the top of this file)\n### File requests in the Khronos Bugzilla, OpenGL project, Registry component.\n###############################################################################\n\n# Any_vendor_future_use: 0x9140-0xFFFF\n#\n#   This range must be the last range in the file.  To generate a new\n#   range, allocate multiples of 16 from the beginning of the\n#   Any_vendor_future_use range and update enum.spec\n\n# (NOTE: first fill the gap from 0x8FE0-0x8FFF before proceeding here)\n\n###############################################################################\n\n# ARB:\t  100000-100999 (GLU enumerants only)\n# ARB:\t  101000-101999 (Conformance tests only)\n\n###############################################################################\n\n# IBM:\t  103000-103999\n#\tCULL_VERTEX_IBM\t\t\t\t\t= 103050\n#\tVERTEX_ARRAY_LIST_IBM\t\t\t\t= 103070\n#\tNORMAL_ARRAY_LIST_IBM\t\t\t\t= 103071\n#\tCOLOR_ARRAY_LIST_IBM\t\t\t\t= 103072\n#\tINDEX_ARRAY_LIST_IBM\t\t\t\t= 103073\n#\tTEXTURE_COORD_ARRAY_LIST_IBM\t\t\t= 103074\n#\tEDGE_FLAG_ARRAY_LIST_IBM\t\t\t= 103075\n#\tFOG_COORDINATE_ARRAY_LIST_IBM\t\t\t= 103076\n#\tSECONDARY_COLOR_ARRAY_LIST_IBM\t\t\t= 103077\n#\tVERTEX_ARRAY_LIST_STRIDE_IBM\t\t\t= 103080\n#\tNORMAL_ARRAY_LIST_STRIDE_IBM\t\t\t= 103081\n#\tCOLOR_ARRAY_LIST_STRIDE_IBM\t\t\t= 103082\n#\tINDEX_ARRAY_LIST_STRIDE_IBM\t\t\t= 103083\n#\tTEXTURE_COORD_ARRAY_LIST_STRIDE_IBM\t\t= 103084\n#\tEDGE_FLAG_ARRAY_LIST_STRIDE_IBM\t\t\t= 103085\n#\tFOG_COORDINATE_ARRAY_LIST_STRIDE_IBM\t\t= 103086\n#\tSECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM\t\t= 103087\n\n###############################################################################\n\n# NEC:\t  104000-104999\n# Compaq: 105000-105999 (Compaq was acquired by HP)\n# KPC:\t  106000-106999 (Kubota is out of business)\n# PGI:\t  107000-107999 (Portable was acquired by Template Graphics)\n# E&S:\t  108000-108999\n\n###############################################################################\n"
  },
  {
    "path": "k3dsdk/gl/enumext.spec",
    "content": "# enumext.spec - list of GL enumerants for glext.h header\n#\n# $Revision: 10796 $ on $Date: 2010-03-19 17:31:10 -0700 (Fri, 19 Mar 2010) $\n\n# This is derived from the master GL enumerant registry (enum.spec).\n#\n# Unlike enum.spec, enumext.spec is\n#   (1) Grouped by GL core version or extension number\n#   (2) While it includes all extension and core enumerants, the\n#\tgenerator scripts for glext.h leave out VERSION_1_1\n#\ttokens since it's assumed all <gl.h> today support at least\n#\tOpenGL 1.1\n#   (3) Has no 'Extensions' section, since enums are always\n#\tconditionally protected against multiple definition\n#\tby glextenum.pl.\n#   (4) Is processed by glextenum.pl, which has evolved\n#\tfrom enum.pl - should merge back into one script.\n\n# The release number encoded into glext.h is now defined in\n# glextrelease.txt.\n\n###############################################################################\n#\n# OpenGL 1.0/1.1 enums (there is no VERSION_1_0 token)\n#\n###############################################################################\n\nVERSION_1_1 enum:\npassthru: /* AttribMask */\n\tDEPTH_BUFFER_BIT\t\t\t\t= 0x00000100\t# AttribMask\n\tSTENCIL_BUFFER_BIT\t\t\t\t= 0x00000400\t# AttribMask\n\tCOLOR_BUFFER_BIT\t\t\t\t= 0x00004000\t# AttribMask\npassthru: /* Boolean */\n\tFALSE\t\t\t\t\t\t= 0\t\t# Boolean\n\tTRUE\t\t\t\t\t\t= 1\t\t# Boolean\npassthru: /* BeginMode */\n\tPOINTS\t\t\t\t\t\t= 0x0000\t# BeginMode\n\tLINES\t\t\t\t\t\t= 0x0001\t# BeginMode\n\tLINE_LOOP\t\t\t\t\t= 0x0002\t# BeginMode\n\tLINE_STRIP\t\t\t\t\t= 0x0003\t# BeginMode\n\tTRIANGLES\t\t\t\t\t= 0x0004\t# BeginMode\n\tTRIANGLE_STRIP\t\t\t\t\t= 0x0005\t# BeginMode\n\tTRIANGLE_FAN\t\t\t\t\t= 0x0006\t# BeginMode\npassthru: /* AlphaFunction */\n\tNEVER\t\t\t\t\t\t= 0x0200\t# AlphaFunction\n\tLESS\t\t\t\t\t\t= 0x0201\t# AlphaFunction\n\tEQUAL\t\t\t\t\t\t= 0x0202\t# AlphaFunction\n\tLEQUAL\t\t\t\t\t\t= 0x0203\t# AlphaFunction\n\tGREATER\t\t\t\t\t\t= 0x0204\t# AlphaFunction\n\tNOTEQUAL\t\t\t\t\t= 0x0205\t# AlphaFunction\n\tGEQUAL\t\t\t\t\t\t= 0x0206\t# AlphaFunction\n\tALWAYS\t\t\t\t\t\t= 0x0207\t# AlphaFunction\npassthru: /* BlendingFactorDest */\n\tZERO\t\t\t\t\t\t= 0\t\t# BlendingFactorDest\n\tONE\t\t\t\t\t\t= 1\t\t# BlendingFactorDest\n\tSRC_COLOR\t\t\t\t\t= 0x0300\t# BlendingFactorDest\n\tONE_MINUS_SRC_COLOR\t\t\t\t= 0x0301\t# BlendingFactorDest\n\tSRC_ALPHA\t\t\t\t\t= 0x0302\t# BlendingFactorDest\n\tONE_MINUS_SRC_ALPHA\t\t\t\t= 0x0303\t# BlendingFactorDest\n\tDST_ALPHA\t\t\t\t\t= 0x0304\t# BlendingFactorDest\n\tONE_MINUS_DST_ALPHA\t\t\t\t= 0x0305\t# BlendingFactorDest\npassthru: /* BlendingFactorSrc */\n\tDST_COLOR\t\t\t\t\t= 0x0306\t# BlendingFactorSrc\n\tONE_MINUS_DST_COLOR\t\t\t\t= 0x0307\t# BlendingFactorSrc\n\tSRC_ALPHA_SATURATE\t\t\t\t= 0x0308\t# BlendingFactorSrc\npassthru: /* DrawBufferMode */\n\tNONE\t\t\t\t\t\t= 0\t\t# DrawBufferMode\n\tFRONT_LEFT\t\t\t\t\t= 0x0400\t# DrawBufferMode\n\tFRONT_RIGHT\t\t\t\t\t= 0x0401\t# DrawBufferMode\n\tBACK_LEFT\t\t\t\t\t= 0x0402\t# DrawBufferMode\n\tBACK_RIGHT\t\t\t\t\t= 0x0403\t# DrawBufferMode\n\tFRONT\t\t\t\t\t\t= 0x0404\t# DrawBufferMode\n\tBACK\t\t\t\t\t\t= 0x0405\t# DrawBufferMode\n\tLEFT\t\t\t\t\t\t= 0x0406\t# DrawBufferMode\n\tRIGHT\t\t\t\t\t\t= 0x0407\t# DrawBufferMode\n\tFRONT_AND_BACK\t\t\t\t\t= 0x0408\t# DrawBufferMode\npassthru: /* ErrorCode */\n\tNO_ERROR\t\t\t\t\t= 0\t\t# ErrorCode\n\tINVALID_ENUM\t\t\t\t\t= 0x0500\t# ErrorCode\n\tINVALID_VALUE\t\t\t\t\t= 0x0501\t# ErrorCode\n\tINVALID_OPERATION\t\t\t\t= 0x0502\t# ErrorCode\n\tOUT_OF_MEMORY\t\t\t\t\t= 0x0505\t# ErrorCode\npassthru: /* FrontFaceDirection */\n\tCW\t\t\t\t\t\t= 0x0900\t# FrontFaceDirection\n\tCCW\t\t\t\t\t\t= 0x0901\t# FrontFaceDirection\npassthru: /* GetPName */\n\tPOINT_SIZE\t\t\t\t\t= 0x0B11 # 1 F\t# GetPName\n\tPOINT_SIZE_RANGE\t\t\t\t= 0x0B12 # 2 F\t# GetPName\n\tPOINT_SIZE_GRANULARITY\t\t\t\t= 0x0B13 # 1 F\t# GetPName\n\tLINE_SMOOTH\t\t\t\t\t= 0x0B20 # 1 I\t# GetPName\n\tLINE_WIDTH\t\t\t\t\t= 0x0B21 # 1 F\t# GetPName\n\tLINE_WIDTH_RANGE\t\t\t\t= 0x0B22 # 2 F\t# GetPName\n\tLINE_WIDTH_GRANULARITY\t\t\t\t= 0x0B23 # 1 F\t# GetPName\n\tPOLYGON_SMOOTH\t\t\t\t\t= 0x0B41 # 1 I\t# GetPName\n\tCULL_FACE\t\t\t\t\t= 0x0B44 # 1 I\t# GetPName\n\tCULL_FACE_MODE\t\t\t\t\t= 0x0B45 # 1 I\t# GetPName\n\tFRONT_FACE\t\t\t\t\t= 0x0B46 # 1 I\t# GetPName\n\tDEPTH_RANGE\t\t\t\t\t= 0x0B70 # 2 F\t# GetPName\n\tDEPTH_TEST\t\t\t\t\t= 0x0B71 # 1 I\t# GetPName\n\tDEPTH_WRITEMASK\t\t\t\t\t= 0x0B72 # 1 I\t# GetPName\n\tDEPTH_CLEAR_VALUE\t\t\t\t= 0x0B73 # 1 F\t# GetPName\n\tDEPTH_FUNC\t\t\t\t\t= 0x0B74 # 1 I\t# GetPName\n\tSTENCIL_TEST\t\t\t\t\t= 0x0B90 # 1 I\t# GetPName\n\tSTENCIL_CLEAR_VALUE\t\t\t\t= 0x0B91 # 1 I\t# GetPName\n\tSTENCIL_FUNC\t\t\t\t\t= 0x0B92 # 1 I\t# GetPName\n\tSTENCIL_VALUE_MASK\t\t\t\t= 0x0B93 # 1 I\t# GetPName\n\tSTENCIL_FAIL\t\t\t\t\t= 0x0B94 # 1 I\t# GetPName\n\tSTENCIL_PASS_DEPTH_FAIL\t\t\t\t= 0x0B95 # 1 I\t# GetPName\n\tSTENCIL_PASS_DEPTH_PASS\t\t\t\t= 0x0B96 # 1 I\t# GetPName\n\tSTENCIL_REF\t\t\t\t\t= 0x0B97 # 1 I\t# GetPName\n\tSTENCIL_WRITEMASK\t\t\t\t= 0x0B98 # 1 I\t# GetPName\n\tVIEWPORT\t\t\t\t\t= 0x0BA2 # 4 I\t# GetPName\n\tDITHER\t\t\t\t\t\t= 0x0BD0 # 1 I\t# GetPName\n\tBLEND_DST\t\t\t\t\t= 0x0BE0 # 1 I\t# GetPName\n\tBLEND_SRC\t\t\t\t\t= 0x0BE1 # 1 I\t# GetPName\n\tBLEND\t\t\t\t\t\t= 0x0BE2 # 1 I\t# GetPName\n\tLOGIC_OP_MODE\t\t\t\t\t= 0x0BF0 # 1 I\t# GetPName\n\tCOLOR_LOGIC_OP\t\t\t\t\t= 0x0BF2 # 1 I\t# GetPName\n\tDRAW_BUFFER\t\t\t\t\t= 0x0C01 # 1 I\t# GetPName\n\tREAD_BUFFER\t\t\t\t\t= 0x0C02 # 1 I\t# GetPName\n\tSCISSOR_BOX\t\t\t\t\t= 0x0C10 # 4 I\t# GetPName\n\tSCISSOR_TEST\t\t\t\t\t= 0x0C11 # 1 I\t# GetPName\n\tCOLOR_CLEAR_VALUE\t\t\t\t= 0x0C22 # 4 F\t# GetPName\n\tCOLOR_WRITEMASK\t\t\t\t\t= 0x0C23 # 4 I\t# GetPName\n\tDOUBLEBUFFER\t\t\t\t\t= 0x0C32 # 1 I\t# GetPName\n\tSTEREO\t\t\t\t\t\t= 0x0C33 # 1 I\t# GetPName\n\tLINE_SMOOTH_HINT\t\t\t\t= 0x0C52 # 1 I\t# GetPName\n\tPOLYGON_SMOOTH_HINT\t\t\t\t= 0x0C53 # 1 I\t# GetPName\n\tUNPACK_SWAP_BYTES\t\t\t\t= 0x0CF0 # 1 I\t# GetPName\n\tUNPACK_LSB_FIRST\t\t\t\t= 0x0CF1 # 1 I\t# GetPName\n\tUNPACK_ROW_LENGTH\t\t\t\t= 0x0CF2 # 1 I\t# GetPName\n\tUNPACK_SKIP_ROWS\t\t\t\t= 0x0CF3 # 1 I\t# GetPName\n\tUNPACK_SKIP_PIXELS\t\t\t\t= 0x0CF4 # 1 I\t# GetPName\n\tUNPACK_ALIGNMENT\t\t\t\t= 0x0CF5 # 1 I\t# GetPName\n\tPACK_SWAP_BYTES\t\t\t\t\t= 0x0D00 # 1 I\t# GetPName\n\tPACK_LSB_FIRST\t\t\t\t\t= 0x0D01 # 1 I\t# GetPName\n\tPACK_ROW_LENGTH\t\t\t\t\t= 0x0D02 # 1 I\t# GetPName\n\tPACK_SKIP_ROWS\t\t\t\t\t= 0x0D03 # 1 I\t# GetPName\n\tPACK_SKIP_PIXELS\t\t\t\t= 0x0D04 # 1 I\t# GetPName\n\tPACK_ALIGNMENT\t\t\t\t\t= 0x0D05 # 1 I\t# GetPName\n\tMAX_TEXTURE_SIZE\t\t\t\t= 0x0D33 # 1 I\t# GetPName\n\tMAX_VIEWPORT_DIMS\t\t\t\t= 0x0D3A # 2 F\t# GetPName\n\tSUBPIXEL_BITS\t\t\t\t\t= 0x0D50 # 1 I\t# GetPName\n\tTEXTURE_1D\t\t\t\t\t= 0x0DE0 # 1 I\t# GetPName\n\tTEXTURE_2D\t\t\t\t\t= 0x0DE1 # 1 I\t# GetPName\n\tPOLYGON_OFFSET_UNITS\t\t\t\t= 0x2A00 # 1 F\t# GetPName\n\tPOLYGON_OFFSET_POINT\t\t\t\t= 0x2A01 # 1 I\t# GetPName\n\tPOLYGON_OFFSET_LINE\t\t\t\t= 0x2A02 # 1 I\t# GetPName\n\tPOLYGON_OFFSET_FILL\t\t\t\t= 0x8037 # 1 I\t# GetPName\n\tPOLYGON_OFFSET_FACTOR\t\t\t\t= 0x8038 # 1 F\t# GetPName\n\tTEXTURE_BINDING_1D\t\t\t\t= 0x8068 # 1 I\t# GetPName\n\tTEXTURE_BINDING_2D\t\t\t\t= 0x8069 # 1 I\t# GetPName\npassthru: /* GetTextureParameter */\n\tTEXTURE_WIDTH\t\t\t\t\t= 0x1000\t# GetTextureParameter\n\tTEXTURE_HEIGHT\t\t\t\t\t= 0x1001\t# GetTextureParameter\n\tTEXTURE_INTERNAL_FORMAT\t\t\t\t= 0x1003\t# GetTextureParameter\n\tTEXTURE_BORDER_COLOR\t\t\t\t= 0x1004\t# GetTextureParameter\n\tTEXTURE_RED_SIZE\t\t\t\t= 0x805C\t# GetTextureParameter\n\tTEXTURE_GREEN_SIZE\t\t\t\t= 0x805D\t# GetTextureParameter\n\tTEXTURE_BLUE_SIZE\t\t\t\t= 0x805E\t# GetTextureParameter\n\tTEXTURE_ALPHA_SIZE\t\t\t\t= 0x805F\t# GetTextureParameter\npassthru: /* HintMode */\n\tDONT_CARE\t\t\t\t\t= 0x1100\t# HintMode\n\tFASTEST\t\t\t\t\t\t= 0x1101\t# HintMode\n\tNICEST\t\t\t\t\t\t= 0x1102\t# HintMode\npassthru: /* DataType */\n\tBYTE\t\t\t\t\t\t= 0x1400\t# DataType\n\tUNSIGNED_BYTE\t\t\t\t\t= 0x1401\t# DataType\n\tSHORT\t\t\t\t\t\t= 0x1402\t# DataType\n\tUNSIGNED_SHORT\t\t\t\t\t= 0x1403\t# DataType\n\tINT\t\t\t\t\t\t= 0x1404\t# DataType\n\tUNSIGNED_INT\t\t\t\t\t= 0x1405\t# DataType\n\tFLOAT\t\t\t\t\t\t= 0x1406\t# DataType\n\tDOUBLE\t\t\t\t\t\t= 0x140A\t# DataType\npassthru: /* LogicOp */\n\tCLEAR\t\t\t\t\t\t= 0x1500\t# LogicOp\n\tAND\t\t\t\t\t\t= 0x1501\t# LogicOp\n\tAND_REVERSE\t\t\t\t\t= 0x1502\t# LogicOp\n\tCOPY\t\t\t\t\t\t= 0x1503\t# LogicOp\n\tAND_INVERTED\t\t\t\t\t= 0x1504\t# LogicOp\n\tNOOP\t\t\t\t\t\t= 0x1505\t# LogicOp\n\tXOR\t\t\t\t\t\t= 0x1506\t# LogicOp\n\tOR\t\t\t\t\t\t= 0x1507\t# LogicOp\n\tNOR\t\t\t\t\t\t= 0x1508\t# LogicOp\n\tEQUIV\t\t\t\t\t\t= 0x1509\t# LogicOp\n\tINVERT\t\t\t\t\t\t= 0x150A\t# LogicOp\n\tOR_REVERSE\t\t\t\t\t= 0x150B\t# LogicOp\n\tCOPY_INVERTED\t\t\t\t\t= 0x150C\t# LogicOp\n\tOR_INVERTED\t\t\t\t\t= 0x150D\t# LogicOp\n\tNAND\t\t\t\t\t\t= 0x150E\t# LogicOp\n\tSET\t\t\t\t\t\t= 0x150F\t# LogicOp\npassthru: /* MatrixMode (for gl3.h, FBO attachment type) */\n\tTEXTURE\t\t\t\t\t\t= 0x1702\t# MatrixMode\npassthru: /* PixelCopyType */\n\tCOLOR\t\t\t\t\t\t= 0x1800\t# PixelCopyType\n\tDEPTH\t\t\t\t\t\t= 0x1801\t# PixelCopyType\n\tSTENCIL\t\t\t\t\t\t= 0x1802\t# PixelCopyType\npassthru: /* PixelFormat */\n\tSTENCIL_INDEX\t\t\t\t\t= 0x1901\t# PixelFormat\n\tDEPTH_COMPONENT\t\t\t\t\t= 0x1902\t# PixelFormat\n\tRED\t\t\t\t\t\t= 0x1903\t# PixelFormat\n\tGREEN\t\t\t\t\t\t= 0x1904\t# PixelFormat\n\tBLUE\t\t\t\t\t\t= 0x1905\t# PixelFormat\n\tALPHA\t\t\t\t\t\t= 0x1906\t# PixelFormat\n\tRGB\t\t\t\t\t\t= 0x1907\t# PixelFormat\n\tRGBA\t\t\t\t\t\t= 0x1908\t# PixelFormat\npassthru: /* PolygonMode */\n\tPOINT\t\t\t\t\t\t= 0x1B00\t# PolygonMode\n\tLINE\t\t\t\t\t\t= 0x1B01\t# PolygonMode\n\tFILL\t\t\t\t\t\t= 0x1B02\t# PolygonMode\npassthru: /* StencilOp */\n\tKEEP\t\t\t\t\t\t= 0x1E00\t# StencilOp\n\tREPLACE\t\t\t\t\t\t= 0x1E01\t# StencilOp\n\tINCR\t\t\t\t\t\t= 0x1E02\t# StencilOp\n\tDECR\t\t\t\t\t\t= 0x1E03\t# StencilOp\npassthru: /* StringName */\n\tVENDOR\t\t\t\t\t\t= 0x1F00\t# StringName\n\tRENDERER\t\t\t\t\t= 0x1F01\t# StringName\n\tVERSION\t\t\t\t\t\t= 0x1F02\t# StringName\n\tEXTENSIONS\t\t\t\t\t= 0x1F03\t# StringName\npassthru: /* TextureMagFilter */\n\tNEAREST\t\t\t\t\t\t= 0x2600\t# TextureMagFilter\n\tLINEAR\t\t\t\t\t\t= 0x2601\t# TextureMagFilter\npassthru: /* TextureMinFilter */\n\tNEAREST_MIPMAP_NEAREST\t\t\t\t= 0x2700\t# TextureMinFilter\n\tLINEAR_MIPMAP_NEAREST\t\t\t\t= 0x2701\t# TextureMinFilter\n\tNEAREST_MIPMAP_LINEAR\t\t\t\t= 0x2702\t# TextureMinFilter\n\tLINEAR_MIPMAP_LINEAR\t\t\t\t= 0x2703\t# TextureMinFilter\npassthru: /* TextureParameterName */\n\tTEXTURE_MAG_FILTER\t\t\t\t= 0x2800\t# TextureParameterName\n\tTEXTURE_MIN_FILTER\t\t\t\t= 0x2801\t# TextureParameterName\n\tTEXTURE_WRAP_S\t\t\t\t\t= 0x2802\t# TextureParameterName\n\tTEXTURE_WRAP_T\t\t\t\t\t= 0x2803\t# TextureParameterName\npassthru: /* TextureTarget */\n\tPROXY_TEXTURE_1D\t\t\t\t= 0x8063\t# TextureTarget\n\tPROXY_TEXTURE_2D\t\t\t\t= 0x8064\t# TextureTarget\npassthru: /* TextureWrapMode */\n\tREPEAT\t\t\t\t\t\t= 0x2901\t# TextureWrapMode\npassthru: /* PixelInternalFormat */\n\tR3_G3_B2\t\t\t\t\t= 0x2A10\t# PixelInternalFormat\n\tRGB4\t\t\t\t\t\t= 0x804F\t# PixelInternalFormat\n\tRGB5\t\t\t\t\t\t= 0x8050\t# PixelInternalFormat\n\tRGB8\t\t\t\t\t\t= 0x8051\t# PixelInternalFormat\n\tRGB10\t\t\t\t\t\t= 0x8052\t# PixelInternalFormat\n\tRGB12\t\t\t\t\t\t= 0x8053\t# PixelInternalFormat\n\tRGB16\t\t\t\t\t\t= 0x8054\t# PixelInternalFormat\n\tRGBA2\t\t\t\t\t\t= 0x8055\t# PixelInternalFormat\n\tRGBA4\t\t\t\t\t\t= 0x8056\t# PixelInternalFormat\n\tRGB5_A1\t\t\t\t\t\t= 0x8057\t# PixelInternalFormat\n\tRGBA8\t\t\t\t\t\t= 0x8058\t# PixelInternalFormat\n\tRGB10_A2\t\t\t\t\t= 0x8059\t# PixelInternalFormat\n\tRGBA12\t\t\t\t\t\t= 0x805A\t# PixelInternalFormat\n\tRGBA16\t\t\t\t\t\t= 0x805B\t# PixelInternalFormat\n\nVERSION_1_1_DEPRECATED enum:\npassthru: /* AttribMask */\n\tCURRENT_BIT\t\t\t\t\t= 0x00000001\t# AttribMask\n\tPOINT_BIT\t\t\t\t\t= 0x00000002\t# AttribMask\n\tLINE_BIT\t\t\t\t\t= 0x00000004\t# AttribMask\n\tPOLYGON_BIT\t\t\t\t\t= 0x00000008\t# AttribMask\n\tPOLYGON_STIPPLE_BIT\t\t\t\t= 0x00000010\t# AttribMask\n\tPIXEL_MODE_BIT\t\t\t\t\t= 0x00000020\t# AttribMask\n\tLIGHTING_BIT\t\t\t\t\t= 0x00000040\t# AttribMask\n\tFOG_BIT\t\t\t\t\t\t= 0x00000080\t# AttribMask\n\tACCUM_BUFFER_BIT\t\t\t\t= 0x00000200\t# AttribMask\n\tVIEWPORT_BIT\t\t\t\t\t= 0x00000800\t# AttribMask\n\tTRANSFORM_BIT\t\t\t\t\t= 0x00001000\t# AttribMask\n\tENABLE_BIT\t\t\t\t\t= 0x00002000\t# AttribMask\n\tHINT_BIT\t\t\t\t\t= 0x00008000\t# AttribMask\n\tEVAL_BIT\t\t\t\t\t= 0x00010000\t# AttribMask\n\tLIST_BIT\t\t\t\t\t= 0x00020000\t# AttribMask\n\tTEXTURE_BIT\t\t\t\t\t= 0x00040000\t# AttribMask\n\tSCISSOR_BIT\t\t\t\t\t= 0x00080000\t# AttribMask\n\tALL_ATTRIB_BITS\t\t\t\t\t= 0xFFFFFFFF\t# AttribMask\npassthru: /* ClientAttribMask */\n\tCLIENT_PIXEL_STORE_BIT\t\t\t\t= 0x00000001\t# ClientAttribMask\n\tCLIENT_VERTEX_ARRAY_BIT\t\t\t\t= 0x00000002\t# ClientAttribMask\n\tCLIENT_ALL_ATTRIB_BITS\t\t\t\t= 0xFFFFFFFF\t# ClientAttribMask\npassthru: /* BeginMode */\n\tQUADS\t\t\t\t\t\t= 0x0007\t# BeginMode\n\tQUAD_STRIP\t\t\t\t\t= 0x0008\t# BeginMode\n\tPOLYGON\t\t\t\t\t\t= 0x0009\t# BeginMode\npassthru: /* AccumOp */\n\tACCUM\t\t\t\t\t\t= 0x0100\t# AccumOp\n\tLOAD\t\t\t\t\t\t= 0x0101\t# AccumOp\n\tRETURN\t\t\t\t\t\t= 0x0102\t# AccumOp\n\tMULT\t\t\t\t\t\t= 0x0103\t# AccumOp\n\tADD\t\t\t\t\t\t= 0x0104\t# AccumOp\npassthru: /* DrawBufferMode */\n\tAUX0\t\t\t\t\t\t= 0x0409\t# DrawBufferMode\n\tAUX1\t\t\t\t\t\t= 0x040A\t# DrawBufferMode\n\tAUX2\t\t\t\t\t\t= 0x040B\t# DrawBufferMode\n\tAUX3\t\t\t\t\t\t= 0x040C\t# DrawBufferMode\npassthru: /* ErrorCode */\n\tSTACK_OVERFLOW\t\t\t\t\t= 0x0503\t# ErrorCode\n\tSTACK_UNDERFLOW\t\t\t\t\t= 0x0504\t# ErrorCode\npassthru: /* FeedbackType */\n\t2D\t\t\t\t\t\t= 0x0600\t# FeedbackType\n\t3D\t\t\t\t\t\t= 0x0601\t# FeedbackType\n\t3D_COLOR\t\t\t\t\t= 0x0602\t# FeedbackType\n\t3D_COLOR_TEXTURE\t\t\t\t= 0x0603\t# FeedbackType\n\t4D_COLOR_TEXTURE\t\t\t\t= 0x0604\t# FeedbackType\npassthru: /* FeedBackToken */\n\tPASS_THROUGH_TOKEN\t\t\t\t= 0x0700\t# FeedBackToken\n\tPOINT_TOKEN\t\t\t\t\t= 0x0701\t# FeedBackToken\n\tLINE_TOKEN\t\t\t\t\t= 0x0702\t# FeedBackToken\n\tPOLYGON_TOKEN\t\t\t\t\t= 0x0703\t# FeedBackToken\n\tBITMAP_TOKEN\t\t\t\t\t= 0x0704\t# FeedBackToken\n\tDRAW_PIXEL_TOKEN\t\t\t\t= 0x0705\t# FeedBackToken\n\tCOPY_PIXEL_TOKEN\t\t\t\t= 0x0706\t# FeedBackToken\n\tLINE_RESET_TOKEN\t\t\t\t= 0x0707\t# FeedBackToken\npassthru: /* FogMode */\n\tEXP\t\t\t\t\t\t= 0x0800\t# FogMode\n\tEXP2\t\t\t\t\t\t= 0x0801\t# FogMode\npassthru: /* GetMapQuery */\n\tCOEFF\t\t\t\t\t\t= 0x0A00\t# GetMapQuery\n\tORDER\t\t\t\t\t\t= 0x0A01\t# GetMapQuery\n\tDOMAIN\t\t\t\t\t\t= 0x0A02\t# GetMapQuery\npassthru: /* GetPixelMap */\n\tPIXEL_MAP_I_TO_I\t\t\t\t= 0x0C70\t# GetPixelMap\n\tPIXEL_MAP_S_TO_S\t\t\t\t= 0x0C71\t# GetPixelMap\n\tPIXEL_MAP_I_TO_R\t\t\t\t= 0x0C72\t# GetPixelMap\n\tPIXEL_MAP_I_TO_G\t\t\t\t= 0x0C73\t# GetPixelMap\n\tPIXEL_MAP_I_TO_B\t\t\t\t= 0x0C74\t# GetPixelMap\n\tPIXEL_MAP_I_TO_A\t\t\t\t= 0x0C75\t# GetPixelMap\n\tPIXEL_MAP_R_TO_R\t\t\t\t= 0x0C76\t# GetPixelMap\n\tPIXEL_MAP_G_TO_G\t\t\t\t= 0x0C77\t# GetPixelMap\n\tPIXEL_MAP_B_TO_B\t\t\t\t= 0x0C78\t# GetPixelMap\n\tPIXEL_MAP_A_TO_A\t\t\t\t= 0x0C79\t# GetPixelMap\npassthru: /* GetPointervPName */\n\tVERTEX_ARRAY_POINTER\t\t\t\t= 0x808E\t# GetPointervPName\n\tNORMAL_ARRAY_POINTER\t\t\t\t= 0x808F\t# GetPointervPName\n\tCOLOR_ARRAY_POINTER\t\t\t\t= 0x8090\t# GetPointervPName\n\tINDEX_ARRAY_POINTER\t\t\t\t= 0x8091\t# GetPointervPName\n\tTEXTURE_COORD_ARRAY_POINTER\t\t\t= 0x8092\t# GetPointervPName\n\tEDGE_FLAG_ARRAY_POINTER\t\t\t\t= 0x8093\t# GetPointervPName\n\tFEEDBACK_BUFFER_POINTER\t\t\t\t= 0x0DF0\t# GetPointervPName\n\tSELECTION_BUFFER_POINTER\t\t\t= 0x0DF3\t# GetPointervPName\npassthru: /* GetPName */\n\tCURRENT_COLOR\t\t\t\t\t= 0x0B00 # 4 F\t# GetPName\n\tCURRENT_INDEX\t\t\t\t\t= 0x0B01 # 1 F\t# GetPName\n\tCURRENT_NORMAL\t\t\t\t\t= 0x0B02 # 3 F\t# GetPName\n\tCURRENT_TEXTURE_COORDS\t\t\t\t= 0x0B03 # 4 F\t# GetPName\n\tCURRENT_RASTER_COLOR\t\t\t\t= 0x0B04 # 4 F\t# GetPName\n\tCURRENT_RASTER_INDEX\t\t\t\t= 0x0B05 # 1 F\t# GetPName\n\tCURRENT_RASTER_TEXTURE_COORDS\t\t\t= 0x0B06 # 4 F\t# GetPName\n\tCURRENT_RASTER_POSITION\t\t\t\t= 0x0B07 # 4 F\t# GetPName\n\tCURRENT_RASTER_POSITION_VALID\t\t\t= 0x0B08 # 1 I\t# GetPName\n\tCURRENT_RASTER_DISTANCE\t\t\t\t= 0x0B09 # 1 F\t# GetPName\n\tPOINT_SMOOTH\t\t\t\t\t= 0x0B10 # 1 I\t# GetPName\n\tLINE_STIPPLE\t\t\t\t\t= 0x0B24 # 1 I\t# GetPName\n\tLINE_STIPPLE_PATTERN\t\t\t\t= 0x0B25 # 1 I\t# GetPName\n\tLINE_STIPPLE_REPEAT\t\t\t\t= 0x0B26 # 1 I\t# GetPName\n\tLIST_MODE\t\t\t\t\t= 0x0B30 # 1 I\t# GetPName\n\tMAX_LIST_NESTING\t\t\t\t= 0x0B31 # 1 I\t# GetPName\n\tLIST_BASE\t\t\t\t\t= 0x0B32 # 1 I\t# GetPName\n\tLIST_INDEX\t\t\t\t\t= 0x0B33 # 1 I\t# GetPName\n\tPOLYGON_MODE\t\t\t\t\t= 0x0B40 # 2 I\t# GetPName\n\tPOLYGON_STIPPLE\t\t\t\t\t= 0x0B42 # 1 I\t# GetPName\n\tEDGE_FLAG\t\t\t\t\t= 0x0B43 # 1 I\t# GetPName\n\tLIGHTING\t\t\t\t\t= 0x0B50 # 1 I\t# GetPName\n\tLIGHT_MODEL_LOCAL_VIEWER\t\t\t= 0x0B51 # 1 I\t# GetPName\n\tLIGHT_MODEL_TWO_SIDE\t\t\t\t= 0x0B52 # 1 I\t# GetPName\n\tLIGHT_MODEL_AMBIENT\t\t\t\t= 0x0B53 # 4 F\t# GetPName\n\tSHADE_MODEL\t\t\t\t\t= 0x0B54 # 1 I\t# GetPName\n\tCOLOR_MATERIAL_FACE\t\t\t\t= 0x0B55 # 1 I\t# GetPName\n\tCOLOR_MATERIAL_PARAMETER\t\t\t= 0x0B56 # 1 I\t# GetPName\n\tCOLOR_MATERIAL\t\t\t\t\t= 0x0B57 # 1 I\t# GetPName\n\tFOG\t\t\t\t\t\t= 0x0B60 # 1 I\t# GetPName\n\tFOG_INDEX\t\t\t\t\t= 0x0B61 # 1 I\t# GetPName\n\tFOG_DENSITY\t\t\t\t\t= 0x0B62 # 1 F\t# GetPName\n\tFOG_START\t\t\t\t\t= 0x0B63 # 1 F\t# GetPName\n\tFOG_END\t\t\t\t\t\t= 0x0B64 # 1 F\t# GetPName\n\tFOG_MODE\t\t\t\t\t= 0x0B65 # 1 I\t# GetPName\n\tFOG_COLOR\t\t\t\t\t= 0x0B66 # 4 F\t# GetPName\n\tACCUM_CLEAR_VALUE\t\t\t\t= 0x0B80 # 4 F\t# GetPName\n\tMATRIX_MODE\t\t\t\t\t= 0x0BA0 # 1 I\t# GetPName\n\tNORMALIZE\t\t\t\t\t= 0x0BA1 # 1 I\t# GetPName\n\tMODELVIEW_STACK_DEPTH\t\t\t\t= 0x0BA3 # 1 I\t# GetPName\n\tPROJECTION_STACK_DEPTH\t\t\t\t= 0x0BA4 # 1 I\t# GetPName\n\tTEXTURE_STACK_DEPTH\t\t\t\t= 0x0BA5 # 1 I\t# GetPName\n\tMODELVIEW_MATRIX\t\t\t\t= 0x0BA6 # 16 F # GetPName\n\tPROJECTION_MATRIX\t\t\t\t= 0x0BA7 # 16 F # GetPName\n\tTEXTURE_MATRIX\t\t\t\t\t= 0x0BA8 # 16 F # GetPName\n\tATTRIB_STACK_DEPTH\t\t\t\t= 0x0BB0 # 1 I\t# GetPName\n\tCLIENT_ATTRIB_STACK_DEPTH\t\t\t= 0x0BB1 # 1 I\t# GetPName\n\tALPHA_TEST\t\t\t\t\t= 0x0BC0 # 1 I\t# GetPName\n\tALPHA_TEST_FUNC\t\t\t\t\t= 0x0BC1 # 1 I\t# GetPName\n\tALPHA_TEST_REF\t\t\t\t\t= 0x0BC2 # 1 F\t# GetPName\n\tINDEX_LOGIC_OP\t\t\t\t\t= 0x0BF1 # 1 I\t# GetPName\n\tLOGIC_OP\t\t\t\t\t= 0x0BF1 # 1 I\t# GetPName\n\tAUX_BUFFERS\t\t\t\t\t= 0x0C00 # 1 I\t# GetPName\n\tINDEX_CLEAR_VALUE\t\t\t\t= 0x0C20 # 1 I\t# GetPName\n\tINDEX_WRITEMASK\t\t\t\t\t= 0x0C21 # 1 I\t# GetPName\n\tINDEX_MODE\t\t\t\t\t= 0x0C30 # 1 I\t# GetPName\n\tRGBA_MODE\t\t\t\t\t= 0x0C31 # 1 I\t# GetPName\n\tRENDER_MODE\t\t\t\t\t= 0x0C40 # 1 I\t# GetPName\n\tPERSPECTIVE_CORRECTION_HINT\t\t\t= 0x0C50 # 1 I\t# GetPName\n\tPOINT_SMOOTH_HINT\t\t\t\t= 0x0C51 # 1 I\t# GetPName\n\tFOG_HINT\t\t\t\t\t= 0x0C54 # 1 I\t# GetPName\n\tTEXTURE_GEN_S\t\t\t\t\t= 0x0C60 # 1 I\t# GetPName\n\tTEXTURE_GEN_T\t\t\t\t\t= 0x0C61 # 1 I\t# GetPName\n\tTEXTURE_GEN_R\t\t\t\t\t= 0x0C62 # 1 I\t# GetPName\n\tTEXTURE_GEN_Q\t\t\t\t\t= 0x0C63 # 1 I\t# GetPName\n\tPIXEL_MAP_I_TO_I_SIZE\t\t\t\t= 0x0CB0 # 1 I\t# GetPName\n\tPIXEL_MAP_S_TO_S_SIZE\t\t\t\t= 0x0CB1 # 1 I\t# GetPName\n\tPIXEL_MAP_I_TO_R_SIZE\t\t\t\t= 0x0CB2 # 1 I\t# GetPName\n\tPIXEL_MAP_I_TO_G_SIZE\t\t\t\t= 0x0CB3 # 1 I\t# GetPName\n\tPIXEL_MAP_I_TO_B_SIZE\t\t\t\t= 0x0CB4 # 1 I\t# GetPName\n\tPIXEL_MAP_I_TO_A_SIZE\t\t\t\t= 0x0CB5 # 1 I\t# GetPName\n\tPIXEL_MAP_R_TO_R_SIZE\t\t\t\t= 0x0CB6 # 1 I\t# GetPName\n\tPIXEL_MAP_G_TO_G_SIZE\t\t\t\t= 0x0CB7 # 1 I\t# GetPName\n\tPIXEL_MAP_B_TO_B_SIZE\t\t\t\t= 0x0CB8 # 1 I\t# GetPName\n\tPIXEL_MAP_A_TO_A_SIZE\t\t\t\t= 0x0CB9 # 1 I\t# GetPName\n\tMAP_COLOR\t\t\t\t\t= 0x0D10 # 1 I\t# GetPName\n\tMAP_STENCIL\t\t\t\t\t= 0x0D11 # 1 I\t# GetPName\n\tINDEX_SHIFT\t\t\t\t\t= 0x0D12 # 1 I\t# GetPName\n\tINDEX_OFFSET\t\t\t\t\t= 0x0D13 # 1 I\t# GetPName\n\tRED_SCALE\t\t\t\t\t= 0x0D14 # 1 F\t# GetPName\n\tRED_BIAS\t\t\t\t\t= 0x0D15 # 1 F\t# GetPName\n\tZOOM_X\t\t\t\t\t\t= 0x0D16 # 1 F\t# GetPName\n\tZOOM_Y\t\t\t\t\t\t= 0x0D17 # 1 F\t# GetPName\n\tGREEN_SCALE\t\t\t\t\t= 0x0D18 # 1 F\t# GetPName\n\tGREEN_BIAS\t\t\t\t\t= 0x0D19 # 1 F\t# GetPName\n\tBLUE_SCALE\t\t\t\t\t= 0x0D1A # 1 F\t# GetPName\n\tBLUE_BIAS\t\t\t\t\t= 0x0D1B # 1 F\t# GetPName\n\tALPHA_SCALE\t\t\t\t\t= 0x0D1C # 1 F\t# GetPName\n\tALPHA_BIAS\t\t\t\t\t= 0x0D1D # 1 F\t# GetPName\n\tDEPTH_SCALE\t\t\t\t\t= 0x0D1E # 1 F\t# GetPName\n\tDEPTH_BIAS\t\t\t\t\t= 0x0D1F # 1 F\t# GetPName\n\tMAX_EVAL_ORDER\t\t\t\t\t= 0x0D30 # 1 I\t# GetPName\n\tMAX_LIGHTS\t\t\t\t\t= 0x0D31 # 1 I\t# GetPName\n\tMAX_CLIP_PLANES\t\t\t\t\t= 0x0D32 # 1 I\t# GetPName\n\tMAX_PIXEL_MAP_TABLE\t\t\t\t= 0x0D34 # 1 I\t# GetPName\n\tMAX_ATTRIB_STACK_DEPTH\t\t\t\t= 0x0D35 # 1 I\t# GetPName\n\tMAX_MODELVIEW_STACK_DEPTH\t\t\t= 0x0D36 # 1 I\t# GetPName\n\tMAX_NAME_STACK_DEPTH\t\t\t\t= 0x0D37 # 1 I\t# GetPName\n\tMAX_PROJECTION_STACK_DEPTH\t\t\t= 0x0D38 # 1 I\t# GetPName\n\tMAX_TEXTURE_STACK_DEPTH\t\t\t\t= 0x0D39 # 1 I\t# GetPName\n\tMAX_CLIENT_ATTRIB_STACK_DEPTH\t\t\t= 0x0D3B # 1 I\t# GetPName\n\tINDEX_BITS\t\t\t\t\t= 0x0D51 # 1 I\t# GetPName\n\tRED_BITS\t\t\t\t\t= 0x0D52 # 1 I\t# GetPName\n\tGREEN_BITS\t\t\t\t\t= 0x0D53 # 1 I\t# GetPName\n\tBLUE_BITS\t\t\t\t\t= 0x0D54 # 1 I\t# GetPName\n\tALPHA_BITS\t\t\t\t\t= 0x0D55 # 1 I\t# GetPName\n\tDEPTH_BITS\t\t\t\t\t= 0x0D56 # 1 I\t# GetPName\n\tSTENCIL_BITS\t\t\t\t\t= 0x0D57 # 1 I\t# GetPName\n\tACCUM_RED_BITS\t\t\t\t\t= 0x0D58 # 1 I\t# GetPName\n\tACCUM_GREEN_BITS\t\t\t\t= 0x0D59 # 1 I\t# GetPName\n\tACCUM_BLUE_BITS\t\t\t\t\t= 0x0D5A # 1 I\t# GetPName\n\tACCUM_ALPHA_BITS\t\t\t\t= 0x0D5B # 1 I\t# GetPName\n\tNAME_STACK_DEPTH\t\t\t\t= 0x0D70 # 1 I\t# GetPName\n\tAUTO_NORMAL\t\t\t\t\t= 0x0D80 # 1 I\t# GetPName\n\tMAP1_COLOR_4\t\t\t\t\t= 0x0D90 # 1 I\t# GetPName\n\tMAP1_INDEX\t\t\t\t\t= 0x0D91 # 1 I\t# GetPName\n\tMAP1_NORMAL\t\t\t\t\t= 0x0D92 # 1 I\t# GetPName\n\tMAP1_TEXTURE_COORD_1\t\t\t\t= 0x0D93 # 1 I\t# GetPName\n\tMAP1_TEXTURE_COORD_2\t\t\t\t= 0x0D94 # 1 I\t# GetPName\n\tMAP1_TEXTURE_COORD_3\t\t\t\t= 0x0D95 # 1 I\t# GetPName\n\tMAP1_TEXTURE_COORD_4\t\t\t\t= 0x0D96 # 1 I\t# GetPName\n\tMAP1_VERTEX_3\t\t\t\t\t= 0x0D97 # 1 I\t# GetPName\n\tMAP1_VERTEX_4\t\t\t\t\t= 0x0D98 # 1 I\t# GetPName\n\tMAP2_COLOR_4\t\t\t\t\t= 0x0DB0 # 1 I\t# GetPName\n\tMAP2_INDEX\t\t\t\t\t= 0x0DB1 # 1 I\t# GetPName\n\tMAP2_NORMAL\t\t\t\t\t= 0x0DB2 # 1 I\t# GetPName\n\tMAP2_TEXTURE_COORD_1\t\t\t\t= 0x0DB3 # 1 I\t# GetPName\n\tMAP2_TEXTURE_COORD_2\t\t\t\t= 0x0DB4 # 1 I\t# GetPName\n\tMAP2_TEXTURE_COORD_3\t\t\t\t= 0x0DB5 # 1 I\t# GetPName\n\tMAP2_TEXTURE_COORD_4\t\t\t\t= 0x0DB6 # 1 I\t# GetPName\n\tMAP2_VERTEX_3\t\t\t\t\t= 0x0DB7 # 1 I\t# GetPName\n\tMAP2_VERTEX_4\t\t\t\t\t= 0x0DB8 # 1 I\t# GetPName\n\tMAP1_GRID_DOMAIN\t\t\t\t= 0x0DD0 # 2 F\t# GetPName\n\tMAP1_GRID_SEGMENTS\t\t\t\t= 0x0DD1 # 1 I\t# GetPName\n\tMAP2_GRID_DOMAIN\t\t\t\t= 0x0DD2 # 4 F\t# GetPName\n\tMAP2_GRID_SEGMENTS\t\t\t\t= 0x0DD3 # 2 I\t# GetPName\n\tFEEDBACK_BUFFER_SIZE\t\t\t\t= 0x0DF1 # 1 I\t# GetPName\n\tFEEDBACK_BUFFER_TYPE\t\t\t\t= 0x0DF2 # 1 I\t# GetPName\n\tSELECTION_BUFFER_SIZE\t\t\t\t= 0x0DF4 # 1 I\t# GetPName\n\tVERTEX_ARRAY\t\t\t\t\t= 0x8074 # 1 I\t# GetPName\n\tNORMAL_ARRAY\t\t\t\t\t= 0x8075 # 1 I\t# GetPName\n\tCOLOR_ARRAY\t\t\t\t\t= 0x8076 # 1 I\t# GetPName\n\tINDEX_ARRAY\t\t\t\t\t= 0x8077 # 1 I\t# GetPName\n\tTEXTURE_COORD_ARRAY\t\t\t\t= 0x8078 # 1 I\t# GetPName\n\tEDGE_FLAG_ARRAY\t\t\t\t\t= 0x8079 # 1 I\t# GetPName\n\tVERTEX_ARRAY_SIZE\t\t\t\t= 0x807A # 1 I\t# GetPName\n\tVERTEX_ARRAY_TYPE\t\t\t\t= 0x807B # 1 I\t# GetPName\n\tVERTEX_ARRAY_STRIDE\t\t\t\t= 0x807C # 1 I\t# GetPName\n\tNORMAL_ARRAY_TYPE\t\t\t\t= 0x807E # 1 I\t# GetPName\n\tNORMAL_ARRAY_STRIDE\t\t\t\t= 0x807F # 1 I\t# GetPName\n\tCOLOR_ARRAY_SIZE\t\t\t\t= 0x8081 # 1 I\t# GetPName\n\tCOLOR_ARRAY_TYPE\t\t\t\t= 0x8082 # 1 I\t# GetPName\n\tCOLOR_ARRAY_STRIDE\t\t\t\t= 0x8083 # 1 I\t# GetPName\n\tINDEX_ARRAY_TYPE\t\t\t\t= 0x8085 # 1 I\t# GetPName\n\tINDEX_ARRAY_STRIDE\t\t\t\t= 0x8086 # 1 I\t# GetPName\n\tTEXTURE_COORD_ARRAY_SIZE\t\t\t= 0x8088 # 1 I\t# GetPName\n\tTEXTURE_COORD_ARRAY_TYPE\t\t\t= 0x8089 # 1 I\t# GetPName\n\tTEXTURE_COORD_ARRAY_STRIDE\t\t\t= 0x808A # 1 I\t# GetPName\n\tEDGE_FLAG_ARRAY_STRIDE\t\t\t\t= 0x808C # 1 I\t# GetPName\npassthru: /* GetTextureParameter */\n\tTEXTURE_COMPONENTS\t\t\t\t= 0x1003\t# GetTextureParameter\n\tTEXTURE_BORDER\t\t\t\t\t= 0x1005\t# GetTextureParameter\n\tTEXTURE_LUMINANCE_SIZE\t\t\t\t= 0x8060\t# GetTextureParameter\n\tTEXTURE_INTENSITY_SIZE\t\t\t\t= 0x8061\t# GetTextureParameter\n\tTEXTURE_PRIORITY\t\t\t\t= 0x8066\t# GetTextureParameter\n\tTEXTURE_RESIDENT\t\t\t\t= 0x8067\t# GetTextureParameter\npassthru: /* LightParameter */\n\tAMBIENT\t\t\t\t\t\t= 0x1200\t# LightParameter\n\tDIFFUSE\t\t\t\t\t\t= 0x1201\t# LightParameter\n\tSPECULAR\t\t\t\t\t= 0x1202\t# LightParameter\n\tPOSITION\t\t\t\t\t= 0x1203\t# LightParameter\n\tSPOT_DIRECTION\t\t\t\t\t= 0x1204\t# LightParameter\n\tSPOT_EXPONENT\t\t\t\t\t= 0x1205\t# LightParameter\n\tSPOT_CUTOFF\t\t\t\t\t= 0x1206\t# LightParameter\n\tCONSTANT_ATTENUATION\t\t\t\t= 0x1207\t# LightParameter\n\tLINEAR_ATTENUATION\t\t\t\t= 0x1208\t# LightParameter\n\tQUADRATIC_ATTENUATION\t\t\t\t= 0x1209\t# LightParameter\npassthru: /* ListMode */\n\tCOMPILE\t\t\t\t\t\t= 0x1300\t# ListMode\n\tCOMPILE_AND_EXECUTE\t\t\t\t= 0x1301\t# ListMode\npassthru: /* DataType */\n\t2_BYTES\t\t\t\t\t\t= 0x1407\t# DataType\n\t3_BYTES\t\t\t\t\t\t= 0x1408\t# DataType\n\t4_BYTES\t\t\t\t\t\t= 0x1409\t# DataType\npassthru: /* MaterialParameter */\n\tEMISSION\t\t\t\t\t= 0x1600\t# MaterialParameter\n\tSHININESS\t\t\t\t\t= 0x1601\t# MaterialParameter\n\tAMBIENT_AND_DIFFUSE\t\t\t\t= 0x1602\t# MaterialParameter\n\tCOLOR_INDEXES\t\t\t\t\t= 0x1603\t# MaterialParameter\npassthru: /* MatrixMode */\n\tMODELVIEW\t\t\t\t\t= 0x1700\t# MatrixMode\n\tPROJECTION\t\t\t\t\t= 0x1701\t# MatrixMode\npassthru: /* PixelFormat */\n\tCOLOR_INDEX\t\t\t\t\t= 0x1900\t# PixelFormat\n\tLUMINANCE\t\t\t\t\t= 0x1909\t# PixelFormat\n\tLUMINANCE_ALPHA\t\t\t\t\t= 0x190A\t# PixelFormat\npassthru: /* PixelType */\n\tBITMAP\t\t\t\t\t\t= 0x1A00\t# PixelType\npassthru: /* RenderingMode */\n\tRENDER\t\t\t\t\t\t= 0x1C00\t# RenderingMode\n\tFEEDBACK\t\t\t\t\t= 0x1C01\t# RenderingMode\n\tSELECT\t\t\t\t\t\t= 0x1C02\t# RenderingMode\npassthru: /* ShadingModel */\n\tFLAT\t\t\t\t\t\t= 0x1D00\t# ShadingModel\n\tSMOOTH\t\t\t\t\t\t= 0x1D01\t# ShadingModel\npassthru: /* TextureCoordName */\n\tS\t\t\t\t\t\t= 0x2000\t# TextureCoordName\n\tT\t\t\t\t\t\t= 0x2001\t# TextureCoordName\n\tR\t\t\t\t\t\t= 0x2002\t# TextureCoordName\n\tQ\t\t\t\t\t\t= 0x2003\t# TextureCoordName\npassthru: /* TextureEnvMode */\n\tMODULATE\t\t\t\t\t= 0x2100\t# TextureEnvMode\n\tDECAL\t\t\t\t\t\t= 0x2101\t# TextureEnvMode\npassthru: /* TextureEnvParameter */\n\tTEXTURE_ENV_MODE\t\t\t\t= 0x2200\t# TextureEnvParameter\n\tTEXTURE_ENV_COLOR\t\t\t\t= 0x2201\t# TextureEnvParameter\npassthru: /* TextureEnvTarget */\n\tTEXTURE_ENV\t\t\t\t\t= 0x2300\t# TextureEnvTarget\npassthru: /* TextureGenMode */\n\tEYE_LINEAR\t\t\t\t\t= 0x2400\t# TextureGenMode\n\tOBJECT_LINEAR\t\t\t\t\t= 0x2401\t# TextureGenMode\n\tSPHERE_MAP\t\t\t\t\t= 0x2402\t# TextureGenMode\npassthru: /* TextureGenParameter */\n\tTEXTURE_GEN_MODE\t\t\t\t= 0x2500\t# TextureGenParameter\n\tOBJECT_PLANE\t\t\t\t\t= 0x2501\t# TextureGenParameter\n\tEYE_PLANE\t\t\t\t\t= 0x2502\t# TextureGenParameter\npassthru: /* TextureWrapMode */\n\tCLAMP\t\t\t\t\t\t= 0x2900\t# TextureWrapMode\npassthru: /* PixelInternalFormat */\n\tALPHA4\t\t\t\t\t\t= 0x803B\t# PixelInternalFormat\n\tALPHA8\t\t\t\t\t\t= 0x803C\t# PixelInternalFormat\n\tALPHA12\t\t\t\t\t\t= 0x803D\t# PixelInternalFormat\n\tALPHA16\t\t\t\t\t\t= 0x803E\t# PixelInternalFormat\n\tLUMINANCE4\t\t\t\t\t= 0x803F\t# PixelInternalFormat\n\tLUMINANCE8\t\t\t\t\t= 0x8040\t# PixelInternalFormat\n\tLUMINANCE12\t\t\t\t\t= 0x8041\t# PixelInternalFormat\n\tLUMINANCE16\t\t\t\t\t= 0x8042\t# PixelInternalFormat\n\tLUMINANCE4_ALPHA4\t\t\t\t= 0x8043\t# PixelInternalFormat\n\tLUMINANCE6_ALPHA2\t\t\t\t= 0x8044\t# PixelInternalFormat\n\tLUMINANCE8_ALPHA8\t\t\t\t= 0x8045\t# PixelInternalFormat\n\tLUMINANCE12_ALPHA4\t\t\t\t= 0x8046\t# PixelInternalFormat\n\tLUMINANCE12_ALPHA12\t\t\t\t= 0x8047\t# PixelInternalFormat\n\tLUMINANCE16_ALPHA16\t\t\t\t= 0x8048\t# PixelInternalFormat\n\tINTENSITY\t\t\t\t\t= 0x8049\t# PixelInternalFormat\n\tINTENSITY4\t\t\t\t\t= 0x804A\t# PixelInternalFormat\n\tINTENSITY8\t\t\t\t\t= 0x804B\t# PixelInternalFormat\n\tINTENSITY12\t\t\t\t\t= 0x804C\t# PixelInternalFormat\n\tINTENSITY16\t\t\t\t\t= 0x804D\t# PixelInternalFormat\npassthru: /* InterleavedArrayFormat */\n\tV2F\t\t\t\t\t\t= 0x2A20\t# InterleavedArrayFormat\n\tV3F\t\t\t\t\t\t= 0x2A21\t# InterleavedArrayFormat\n\tC4UB_V2F\t\t\t\t\t= 0x2A22\t# InterleavedArrayFormat\n\tC4UB_V3F\t\t\t\t\t= 0x2A23\t# InterleavedArrayFormat\n\tC3F_V3F\t\t\t\t\t\t= 0x2A24\t# InterleavedArrayFormat\n\tN3F_V3F\t\t\t\t\t\t= 0x2A25\t# InterleavedArrayFormat\n\tC4F_N3F_V3F\t\t\t\t\t= 0x2A26\t# InterleavedArrayFormat\n\tT2F_V3F\t\t\t\t\t\t= 0x2A27\t# InterleavedArrayFormat\n\tT4F_V4F\t\t\t\t\t\t= 0x2A28\t# InterleavedArrayFormat\n\tT2F_C4UB_V3F\t\t\t\t\t= 0x2A29\t# InterleavedArrayFormat\n\tT2F_C3F_V3F\t\t\t\t\t= 0x2A2A\t# InterleavedArrayFormat\n\tT2F_N3F_V3F\t\t\t\t\t= 0x2A2B\t# InterleavedArrayFormat\n\tT2F_C4F_N3F_V3F\t\t\t\t\t= 0x2A2C\t# InterleavedArrayFormat\n\tT4F_C4F_N3F_V4F\t\t\t\t\t= 0x2A2D\t# InterleavedArrayFormat\npassthru: /* ClipPlaneName */\n\tCLIP_PLANE0\t\t\t\t\t= 0x3000 # 1 I\t# ClipPlaneName\n\tCLIP_PLANE1\t\t\t\t\t= 0x3001 # 1 I\t# ClipPlaneName\n\tCLIP_PLANE2\t\t\t\t\t= 0x3002 # 1 I\t# ClipPlaneName\n\tCLIP_PLANE3\t\t\t\t\t= 0x3003 # 1 I\t# ClipPlaneName\n\tCLIP_PLANE4\t\t\t\t\t= 0x3004 # 1 I\t# ClipPlaneName\n\tCLIP_PLANE5\t\t\t\t\t= 0x3005 # 1 I\t# ClipPlaneName\npassthru: /* LightName */\n\tLIGHT0\t\t\t\t\t\t= 0x4000 # 1 I\t# LightName\n\tLIGHT1\t\t\t\t\t\t= 0x4001 # 1 I\t# LightName\n\tLIGHT2\t\t\t\t\t\t= 0x4002 # 1 I\t# LightName\n\tLIGHT3\t\t\t\t\t\t= 0x4003 # 1 I\t# LightName\n\tLIGHT4\t\t\t\t\t\t= 0x4004 # 1 I\t# LightName\n\tLIGHT5\t\t\t\t\t\t= 0x4005 # 1 I\t# LightName\n\tLIGHT6\t\t\t\t\t\t= 0x4006 # 1 I\t# LightName\n\tLIGHT7\t\t\t\t\t\t= 0x4007 # 1 I\t# LightName\n\n\n###############################################################################\n#\n# OpenGL 1.2 enums\n#\n###############################################################################\n\nVERSION_1_2 enum:\n\tUNSIGNED_BYTE_3_3_2\t\t\t\t= 0x8032 # Equivalent to EXT_packed_pixels\n\tUNSIGNED_SHORT_4_4_4_4\t\t\t\t= 0x8033\n\tUNSIGNED_SHORT_5_5_5_1\t\t\t\t= 0x8034\n\tUNSIGNED_INT_8_8_8_8\t\t\t\t= 0x8035\n\tUNSIGNED_INT_10_10_10_2\t\t\t\t= 0x8036\n\tTEXTURE_BINDING_3D\t\t\t\t= 0x806A # 1 I\n\tPACK_SKIP_IMAGES\t\t\t\t= 0x806B # 1 I\n\tPACK_IMAGE_HEIGHT\t\t\t\t= 0x806C # 1 F\n\tUNPACK_SKIP_IMAGES\t\t\t\t= 0x806D # 1 I\n\tUNPACK_IMAGE_HEIGHT\t\t\t\t= 0x806E # 1 F\n\tTEXTURE_3D\t\t\t\t\t= 0x806F # 1 I\n\tPROXY_TEXTURE_3D\t\t\t\t= 0x8070\n\tTEXTURE_DEPTH\t\t\t\t\t= 0x8071\n\tTEXTURE_WRAP_R\t\t\t\t\t= 0x8072\n\tMAX_3D_TEXTURE_SIZE\t\t\t\t= 0x8073 # 1 I\n\tUNSIGNED_BYTE_2_3_3_REV\t\t\t\t= 0x8362 # New for OpenGL 1.2\n\tUNSIGNED_SHORT_5_6_5\t\t\t\t= 0x8363\n\tUNSIGNED_SHORT_5_6_5_REV\t\t\t= 0x8364\n\tUNSIGNED_SHORT_4_4_4_4_REV\t\t\t= 0x8365\n\tUNSIGNED_SHORT_1_5_5_5_REV\t\t\t= 0x8366\n\tUNSIGNED_INT_8_8_8_8_REV\t\t\t= 0x8367\n\tUNSIGNED_INT_2_10_10_10_REV\t\t\t= 0x8368\n\tBGR\t\t\t\t\t\t= 0x80E0\n\tBGRA\t\t\t\t\t\t= 0x80E1\n\tMAX_ELEMENTS_VERTICES\t\t\t\t= 0x80E8\n\tMAX_ELEMENTS_INDICES\t\t\t\t= 0x80E9\n\tCLAMP_TO_EDGE\t\t\t\t\t= 0x812F # Equivalent to SGIS_texture_edge_clamp\n\tTEXTURE_MIN_LOD\t\t\t\t\t= 0x813A # Equivalent to SGIS_texture_lod\n\tTEXTURE_MAX_LOD\t\t\t\t\t= 0x813B\n\tTEXTURE_BASE_LEVEL\t\t\t\t= 0x813C\n\tTEXTURE_MAX_LEVEL\t\t\t\t= 0x813D\n\tSMOOTH_POINT_SIZE_RANGE\t\t\t\t= 0x0B12 # 2 F\n\tSMOOTH_POINT_SIZE_GRANULARITY\t\t\t= 0x0B13 # 1 F\n\tSMOOTH_LINE_WIDTH_RANGE\t\t\t\t= 0x0B22 # 2 F\n\tSMOOTH_LINE_WIDTH_GRANULARITY\t\t\t= 0x0B23 # 1 F\n\tALIASED_LINE_WIDTH_RANGE\t\t\t= 0x846E # 2 F\n\nVERSION_1_2_DEPRECATED enum:\n\tRESCALE_NORMAL\t\t\t\t\t= 0x803A # 1 I # Equivalent to EXT_rescale_normal\n\tLIGHT_MODEL_COLOR_CONTROL\t\t\t= 0x81F8 # 1 I\n\tSINGLE_COLOR\t\t\t\t\t= 0x81F9\n\tSEPARATE_SPECULAR_COLOR\t\t\t\t= 0x81FA\n\tALIASED_POINT_SIZE_RANGE\t\t\t= 0x846D # 2 F\n\nARB_imaging enum:\n\tCONSTANT_COLOR\t\t\t\t\t= 0x8001 # Equivalent to EXT_blend_color\n\tONE_MINUS_CONSTANT_COLOR\t\t\t= 0x8002\n\tCONSTANT_ALPHA\t\t\t\t\t= 0x8003\n\tONE_MINUS_CONSTANT_ALPHA\t\t\t= 0x8004\n\tBLEND_COLOR\t\t\t\t\t= 0x8005 # 4 F\n\tFUNC_ADD\t\t\t\t\t= 0x8006 # Equivalent to EXT_blend_minmax\n\tMIN\t\t\t\t\t\t= 0x8007\n\tMAX\t\t\t\t\t\t= 0x8008\n\tBLEND_EQUATION\t\t\t\t\t= 0x8009 # 1 I\n\tFUNC_SUBTRACT\t\t\t\t\t= 0x800A # Equivalent to EXT_blend_subtract\n\tFUNC_REVERSE_SUBTRACT\t\t\t\t= 0x800B\n\nARB_imaging_DEPRECATED enum:\n\tCONVOLUTION_1D\t\t\t\t\t= 0x8010 # 1 I # Equivalent to EXT_convolution\n\tCONVOLUTION_2D\t\t\t\t\t= 0x8011 # 1 I\n\tSEPARABLE_2D\t\t\t\t\t= 0x8012 # 1 I\n\tCONVOLUTION_BORDER_MODE\t\t\t\t= 0x8013\n\tCONVOLUTION_FILTER_SCALE\t\t\t= 0x8014\n\tCONVOLUTION_FILTER_BIAS\t\t\t\t= 0x8015\n\tREDUCE\t\t\t\t\t\t= 0x8016\n\tCONVOLUTION_FORMAT\t\t\t\t= 0x8017\n\tCONVOLUTION_WIDTH\t\t\t\t= 0x8018\n\tCONVOLUTION_HEIGHT\t\t\t\t= 0x8019\n\tMAX_CONVOLUTION_WIDTH\t\t\t\t= 0x801A\n\tMAX_CONVOLUTION_HEIGHT\t\t\t\t= 0x801B\n\tPOST_CONVOLUTION_RED_SCALE\t\t\t= 0x801C # 1 F\n\tPOST_CONVOLUTION_GREEN_SCALE\t\t\t= 0x801D # 1 F\n\tPOST_CONVOLUTION_BLUE_SCALE\t\t\t= 0x801E # 1 F\n\tPOST_CONVOLUTION_ALPHA_SCALE\t\t\t= 0x801F # 1 F\n\tPOST_CONVOLUTION_RED_BIAS\t\t\t= 0x8020 # 1 F\n\tPOST_CONVOLUTION_GREEN_BIAS\t\t\t= 0x8021 # 1 F\n\tPOST_CONVOLUTION_BLUE_BIAS\t\t\t= 0x8022 # 1 F\n\tPOST_CONVOLUTION_ALPHA_BIAS\t\t\t= 0x8023 # 1 F\n\tHISTOGRAM\t\t\t\t\t= 0x8024 # 1 I # Equivalent to EXT_histogram\n\tPROXY_HISTOGRAM\t\t\t\t\t= 0x8025\n\tHISTOGRAM_WIDTH\t\t\t\t\t= 0x8026\n\tHISTOGRAM_FORMAT\t\t\t\t= 0x8027\n\tHISTOGRAM_RED_SIZE\t\t\t\t= 0x8028\n\tHISTOGRAM_GREEN_SIZE\t\t\t\t= 0x8029\n\tHISTOGRAM_BLUE_SIZE\t\t\t\t= 0x802A\n\tHISTOGRAM_ALPHA_SIZE\t\t\t\t= 0x802B\n\tHISTOGRAM_LUMINANCE_SIZE\t\t\t= 0x802C\n\tHISTOGRAM_SINK\t\t\t\t\t= 0x802D\n\tMINMAX\t\t\t\t\t\t= 0x802E # 1 I\n\tMINMAX_FORMAT\t\t\t\t\t= 0x802F\n\tMINMAX_SINK\t\t\t\t\t= 0x8030\n\tTABLE_TOO_LARGE\t\t\t\t\t= 0x8031\n\tCOLOR_MATRIX\t\t\t\t\t= 0x80B1 # 16 F # Equivalent to SGI_color_matrix\n\tCOLOR_MATRIX_STACK_DEPTH\t\t\t= 0x80B2 # 1 I\n\tMAX_COLOR_MATRIX_STACK_DEPTH\t\t\t= 0x80B3 # 1 I\n\tPOST_COLOR_MATRIX_RED_SCALE\t\t\t= 0x80B4 # 1 F\n\tPOST_COLOR_MATRIX_GREEN_SCALE\t\t\t= 0x80B5 # 1 F\n\tPOST_COLOR_MATRIX_BLUE_SCALE\t\t\t= 0x80B6 # 1 F\n\tPOST_COLOR_MATRIX_ALPHA_SCALE\t\t\t= 0x80B7 # 1 F\n\tPOST_COLOR_MATRIX_RED_BIAS\t\t\t= 0x80B8 # 1 F\n\tPOST_COLOR_MATRIX_GREEN_BIAS\t\t\t= 0x80B9 # 1 F\n\tPOST_COLOR_MATRIX_BLUE_BIAS\t\t\t= 0x80BA # 1 F\n\tPOST_COLOR_MATRIX_ALPHA_BIAS\t\t\t= 0x80BB # 1 F\n\tCOLOR_TABLE\t\t\t\t\t= 0x80D0 # 1 I # Equivalent to SGI_color_table\n\tPOST_CONVOLUTION_COLOR_TABLE\t\t\t= 0x80D1 # 1 I\n\tPOST_COLOR_MATRIX_COLOR_TABLE\t\t\t= 0x80D2 # 1 I\n\tPROXY_COLOR_TABLE\t\t\t\t= 0x80D3\n\tPROXY_POST_CONVOLUTION_COLOR_TABLE\t\t= 0x80D4\n\tPROXY_POST_COLOR_MATRIX_COLOR_TABLE\t\t= 0x80D5\n\tCOLOR_TABLE_SCALE\t\t\t\t= 0x80D6\n\tCOLOR_TABLE_BIAS\t\t\t\t= 0x80D7\n\tCOLOR_TABLE_FORMAT\t\t\t\t= 0x80D8\n\tCOLOR_TABLE_WIDTH\t\t\t\t= 0x80D9\n\tCOLOR_TABLE_RED_SIZE\t\t\t\t= 0x80DA\n\tCOLOR_TABLE_GREEN_SIZE\t\t\t\t= 0x80DB\n\tCOLOR_TABLE_BLUE_SIZE\t\t\t\t= 0x80DC\n\tCOLOR_TABLE_ALPHA_SIZE\t\t\t\t= 0x80DD\n\tCOLOR_TABLE_LUMINANCE_SIZE\t\t\t= 0x80DE\n\tCOLOR_TABLE_INTENSITY_SIZE\t\t\t= 0x80DF\n\tCONSTANT_BORDER\t\t\t\t\t= 0x8151\n\tREPLICATE_BORDER\t\t\t\t= 0x8153\n\tCONVOLUTION_BORDER_COLOR\t\t\t= 0x8154\n\n\n###############################################################################\n#\n# OpenGL 1.3 enums\n#\n###############################################################################\n\nVERSION_1_3 enum:\n\tTEXTURE0\t\t\t\t\t= 0x84C0\t# Promoted from ARB_multitexture\n\tTEXTURE1\t\t\t\t\t= 0x84C1\n\tTEXTURE2\t\t\t\t\t= 0x84C2\n\tTEXTURE3\t\t\t\t\t= 0x84C3\n\tTEXTURE4\t\t\t\t\t= 0x84C4\n\tTEXTURE5\t\t\t\t\t= 0x84C5\n\tTEXTURE6\t\t\t\t\t= 0x84C6\n\tTEXTURE7\t\t\t\t\t= 0x84C7\n\tTEXTURE8\t\t\t\t\t= 0x84C8\n\tTEXTURE9\t\t\t\t\t= 0x84C9\n\tTEXTURE10\t\t\t\t\t= 0x84CA\n\tTEXTURE11\t\t\t\t\t= 0x84CB\n\tTEXTURE12\t\t\t\t\t= 0x84CC\n\tTEXTURE13\t\t\t\t\t= 0x84CD\n\tTEXTURE14\t\t\t\t\t= 0x84CE\n\tTEXTURE15\t\t\t\t\t= 0x84CF\n\tTEXTURE16\t\t\t\t\t= 0x84D0\n\tTEXTURE17\t\t\t\t\t= 0x84D1\n\tTEXTURE18\t\t\t\t\t= 0x84D2\n\tTEXTURE19\t\t\t\t\t= 0x84D3\n\tTEXTURE20\t\t\t\t\t= 0x84D4\n\tTEXTURE21\t\t\t\t\t= 0x84D5\n\tTEXTURE22\t\t\t\t\t= 0x84D6\n\tTEXTURE23\t\t\t\t\t= 0x84D7\n\tTEXTURE24\t\t\t\t\t= 0x84D8\n\tTEXTURE25\t\t\t\t\t= 0x84D9\n\tTEXTURE26\t\t\t\t\t= 0x84DA\n\tTEXTURE27\t\t\t\t\t= 0x84DB\n\tTEXTURE28\t\t\t\t\t= 0x84DC\n\tTEXTURE29\t\t\t\t\t= 0x84DD\n\tTEXTURE30\t\t\t\t\t= 0x84DE\n\tTEXTURE31\t\t\t\t\t= 0x84DF\n\tACTIVE_TEXTURE\t\t\t\t\t= 0x84E0 # 1 I\n\tMULTISAMPLE\t\t\t\t\t= 0x809D\t# Promoted from ARB_multisample\n\tSAMPLE_ALPHA_TO_COVERAGE\t\t\t= 0x809E\n\tSAMPLE_ALPHA_TO_ONE\t\t\t\t= 0x809F\n\tSAMPLE_COVERAGE\t\t\t\t\t= 0x80A0\n\tSAMPLE_BUFFERS\t\t\t\t\t= 0x80A8\n\tSAMPLES\t\t\t\t\t\t= 0x80A9\n\tSAMPLE_COVERAGE_VALUE\t\t\t\t= 0x80AA\n\tSAMPLE_COVERAGE_INVERT\t\t\t\t= 0x80AB\n\tTEXTURE_CUBE_MAP\t\t\t\t= 0x8513\n\tTEXTURE_BINDING_CUBE_MAP\t\t\t= 0x8514\n\tTEXTURE_CUBE_MAP_POSITIVE_X\t\t\t= 0x8515\n\tTEXTURE_CUBE_MAP_NEGATIVE_X\t\t\t= 0x8516\n\tTEXTURE_CUBE_MAP_POSITIVE_Y\t\t\t= 0x8517\n\tTEXTURE_CUBE_MAP_NEGATIVE_Y\t\t\t= 0x8518\n\tTEXTURE_CUBE_MAP_POSITIVE_Z\t\t\t= 0x8519\n\tTEXTURE_CUBE_MAP_NEGATIVE_Z\t\t\t= 0x851A\n\tPROXY_TEXTURE_CUBE_MAP\t\t\t\t= 0x851B\n\tMAX_CUBE_MAP_TEXTURE_SIZE\t\t\t= 0x851C\n\tCOMPRESSED_RGB\t\t\t\t\t= 0x84ED\n\tCOMPRESSED_RGBA\t\t\t\t\t= 0x84EE\n\tTEXTURE_COMPRESSION_HINT\t\t\t= 0x84EF\n\tTEXTURE_COMPRESSED_IMAGE_SIZE\t\t\t= 0x86A0\n\tTEXTURE_COMPRESSED\t\t\t\t= 0x86A1\n\tNUM_COMPRESSED_TEXTURE_FORMATS\t\t\t= 0x86A2\n\tCOMPRESSED_TEXTURE_FORMATS\t\t\t= 0x86A3\n\tCLAMP_TO_BORDER\t\t\t\t\t= 0x812D\t# Promoted from ARB_texture_border_clamp\n\nVERSION_1_3_DEPRECATED enum:\n\tCLIENT_ACTIVE_TEXTURE\t\t\t\t= 0x84E1 # 1 I\n\tMAX_TEXTURE_UNITS\t\t\t\t= 0x84E2 # 1 I\n\tTRANSPOSE_MODELVIEW_MATRIX\t\t\t= 0x84E3 # 16 F # Promoted from ARB_transpose_matrix\n\tTRANSPOSE_PROJECTION_MATRIX\t\t\t= 0x84E4 # 16 F\n\tTRANSPOSE_TEXTURE_MATRIX\t\t\t= 0x84E5 # 16 F\n\tTRANSPOSE_COLOR_MATRIX\t\t\t\t= 0x84E6 # 16 F\n\tMULTISAMPLE_BIT\t\t\t\t\t= 0x20000000\n\tNORMAL_MAP\t\t\t\t\t= 0x8511\t# Promoted from ARB_texture_cube_map\n\tREFLECTION_MAP\t\t\t\t\t= 0x8512\n\tCOMPRESSED_ALPHA\t\t\t\t= 0x84E9\t# Promoted from ARB_texture_compression\n\tCOMPRESSED_LUMINANCE\t\t\t\t= 0x84EA\n\tCOMPRESSED_LUMINANCE_ALPHA\t\t\t= 0x84EB\n\tCOMPRESSED_INTENSITY\t\t\t\t= 0x84EC\n\tCOMBINE\t\t\t\t\t\t= 0x8570\t# Promoted from ARB_texture_env_combine\n\tCOMBINE_RGB\t\t\t\t\t= 0x8571\n\tCOMBINE_ALPHA\t\t\t\t\t= 0x8572\n\tSOURCE0_RGB\t\t\t\t\t= 0x8580\n\tSOURCE1_RGB\t\t\t\t\t= 0x8581\n\tSOURCE2_RGB\t\t\t\t\t= 0x8582\n\tSOURCE0_ALPHA\t\t\t\t\t= 0x8588\n\tSOURCE1_ALPHA\t\t\t\t\t= 0x8589\n\tSOURCE2_ALPHA\t\t\t\t\t= 0x858A\n\tOPERAND0_RGB\t\t\t\t\t= 0x8590\n\tOPERAND1_RGB\t\t\t\t\t= 0x8591\n\tOPERAND2_RGB\t\t\t\t\t= 0x8592\n\tOPERAND0_ALPHA\t\t\t\t\t= 0x8598\n\tOPERAND1_ALPHA\t\t\t\t\t= 0x8599\n\tOPERAND2_ALPHA\t\t\t\t\t= 0x859A\n\tRGB_SCALE\t\t\t\t\t= 0x8573\n\tADD_SIGNED\t\t\t\t\t= 0x8574\n\tINTERPOLATE\t\t\t\t\t= 0x8575\n\tSUBTRACT\t\t\t\t\t= 0x84E7\n\tCONSTANT\t\t\t\t\t= 0x8576\n\tPRIMARY_COLOR\t\t\t\t\t= 0x8577\n\tPREVIOUS\t\t\t\t\t= 0x8578\n\tDOT3_RGB\t\t\t\t\t= 0x86AE\t# Promoted from ARB_texture_env_dot3\n\tDOT3_RGBA\t\t\t\t\t= 0x86AF\n\n\n###############################################################################\n#\n# OpenGL 1.4 enums\n#\n###############################################################################\n\nVERSION_1_4 enum:\n\tBLEND_DST_RGB\t\t\t\t\t= 0x80C8\n\tBLEND_SRC_RGB\t\t\t\t\t= 0x80C9\n\tBLEND_DST_ALPHA\t\t\t\t\t= 0x80CA\n\tBLEND_SRC_ALPHA\t\t\t\t\t= 0x80CB\n\tPOINT_FADE_THRESHOLD_SIZE\t\t\t= 0x8128 # 1 F\n\tDEPTH_COMPONENT16\t\t\t\t= 0x81A5\n\tDEPTH_COMPONENT24\t\t\t\t= 0x81A6\n\tDEPTH_COMPONENT32\t\t\t\t= 0x81A7\n\tMIRRORED_REPEAT\t\t\t\t\t= 0x8370\n\tMAX_TEXTURE_LOD_BIAS\t\t\t\t= 0x84FD\n\tTEXTURE_LOD_BIAS\t\t\t\t= 0x8501\n\tINCR_WRAP\t\t\t\t\t= 0x8507\n\tDECR_WRAP\t\t\t\t\t= 0x8508\n\tTEXTURE_DEPTH_SIZE\t\t\t\t= 0x884A\n\tTEXTURE_COMPARE_MODE\t\t\t\t= 0x884C\n\tTEXTURE_COMPARE_FUNC\t\t\t\t= 0x884D\n\nVERSION_1_4_DEPRECATED enum:\n\tPOINT_SIZE_MIN\t\t\t\t\t= 0x8126 # 1 F\n\tPOINT_SIZE_MAX\t\t\t\t\t= 0x8127 # 1 F\n\tPOINT_DISTANCE_ATTENUATION\t\t\t= 0x8129 # 3 F\n\tGENERATE_MIPMAP\t\t\t\t\t= 0x8191\n\tGENERATE_MIPMAP_HINT\t\t\t\t= 0x8192 # 1 I\n\tFOG_COORDINATE_SOURCE\t\t\t\t= 0x8450 # 1 I\n\tFOG_COORDINATE\t\t\t\t\t= 0x8451\n\tFRAGMENT_DEPTH\t\t\t\t\t= 0x8452\n\tCURRENT_FOG_COORDINATE\t\t\t\t= 0x8453 # 1 F\n\tFOG_COORDINATE_ARRAY_TYPE\t\t\t= 0x8454 # 1 I\n\tFOG_COORDINATE_ARRAY_STRIDE\t\t\t= 0x8455 # 1 I\n\tFOG_COORDINATE_ARRAY_POINTER\t\t\t= 0x8456\n\tFOG_COORDINATE_ARRAY\t\t\t\t= 0x8457 # 1 I\n\tCOLOR_SUM\t\t\t\t\t= 0x8458 # 1 I\n\tCURRENT_SECONDARY_COLOR\t\t\t\t= 0x8459 # 3 F\n\tSECONDARY_COLOR_ARRAY_SIZE\t\t\t= 0x845A # 1 I\n\tSECONDARY_COLOR_ARRAY_TYPE\t\t\t= 0x845B # 1 I\n\tSECONDARY_COLOR_ARRAY_STRIDE\t\t\t= 0x845C # 1 I\n\tSECONDARY_COLOR_ARRAY_POINTER\t\t\t= 0x845D\n\tSECONDARY_COLOR_ARRAY\t\t\t\t= 0x845E # 1 I\n\tTEXTURE_FILTER_CONTROL\t\t\t\t= 0x8500\n\tDEPTH_TEXTURE_MODE\t\t\t\t= 0x884B\n\tCOMPARE_R_TO_TEXTURE\t\t\t\t= 0x884E\n\n\n###############################################################################\n#\n# OpenGL 1.5 enums\n#\n###############################################################################\n\nVERSION_1_5 enum:\n\tBUFFER_SIZE\t\t\t\t\t= 0x8764 # ARB_vertex_buffer_object\n\tBUFFER_USAGE\t\t\t\t\t= 0x8765 # ARB_vertex_buffer_object\n\tQUERY_COUNTER_BITS\t\t\t\t= 0x8864 # ARB_occlusion_query\n\tCURRENT_QUERY\t\t\t\t\t= 0x8865 # ARB_occlusion_query\n\tQUERY_RESULT\t\t\t\t\t= 0x8866 # ARB_occlusion_query\n\tQUERY_RESULT_AVAILABLE\t\t\t\t= 0x8867 # ARB_occlusion_query\n\tARRAY_BUFFER\t\t\t\t\t= 0x8892 # ARB_vertex_buffer_object\n\tELEMENT_ARRAY_BUFFER\t\t\t\t= 0x8893 # ARB_vertex_buffer_object\n\tARRAY_BUFFER_BINDING\t\t\t\t= 0x8894 # ARB_vertex_buffer_object\n\tELEMENT_ARRAY_BUFFER_BINDING\t\t\t= 0x8895 # ARB_vertex_buffer_object\n\tVERTEX_ATTRIB_ARRAY_BUFFER_BINDING\t\t= 0x889F # ARB_vertex_buffer_object\n\tREAD_ONLY\t\t\t\t\t= 0x88B8 # ARB_vertex_buffer_object\n\tWRITE_ONLY\t\t\t\t\t= 0x88B9 # ARB_vertex_buffer_object\n\tREAD_WRITE\t\t\t\t\t= 0x88BA # ARB_vertex_buffer_object\n\tBUFFER_ACCESS\t\t\t\t\t= 0x88BB # ARB_vertex_buffer_object\n\tBUFFER_MAPPED\t\t\t\t\t= 0x88BC # ARB_vertex_buffer_object\n\tBUFFER_MAP_POINTER\t\t\t\t= 0x88BD # ARB_vertex_buffer_object\n\tSTREAM_DRAW\t\t\t\t\t= 0x88E0 # ARB_vertex_buffer_object\n\tSTREAM_READ\t\t\t\t\t= 0x88E1 # ARB_vertex_buffer_object\n\tSTREAM_COPY\t\t\t\t\t= 0x88E2 # ARB_vertex_buffer_object\n\tSTATIC_DRAW\t\t\t\t\t= 0x88E4 # ARB_vertex_buffer_object\n\tSTATIC_READ\t\t\t\t\t= 0x88E5 # ARB_vertex_buffer_object\n\tSTATIC_COPY\t\t\t\t\t= 0x88E6 # ARB_vertex_buffer_object\n\tDYNAMIC_DRAW\t\t\t\t\t= 0x88E8 # ARB_vertex_buffer_object\n\tDYNAMIC_READ\t\t\t\t\t= 0x88E9 # ARB_vertex_buffer_object\n\tDYNAMIC_COPY\t\t\t\t\t= 0x88EA # ARB_vertex_buffer_object\n\tSAMPLES_PASSED\t\t\t\t\t= 0x8914 # ARB_occlusion_query\n\nVERSION_1_5_DEPRECATED enum:\n\tVERTEX_ARRAY_BUFFER_BINDING\t\t\t= 0x8896 # ARB_vertex_buffer_object\n\tNORMAL_ARRAY_BUFFER_BINDING\t\t\t= 0x8897 # ARB_vertex_buffer_object\n\tCOLOR_ARRAY_BUFFER_BINDING\t\t\t= 0x8898 # ARB_vertex_buffer_object\n\tINDEX_ARRAY_BUFFER_BINDING\t\t\t= 0x8899 # ARB_vertex_buffer_object\n\tTEXTURE_COORD_ARRAY_BUFFER_BINDING\t\t= 0x889A # ARB_vertex_buffer_object\n\tEDGE_FLAG_ARRAY_BUFFER_BINDING\t\t\t= 0x889B # ARB_vertex_buffer_object\n\tSECONDARY_COLOR_ARRAY_BUFFER_BINDING\t\t= 0x889C # ARB_vertex_buffer_object\n\tFOG_COORDINATE_ARRAY_BUFFER_BINDING\t\t= 0x889D # ARB_vertex_buffer_object\n\tWEIGHT_ARRAY_BUFFER_BINDING\t\t\t= 0x889E # ARB_vertex_buffer_object\n\tFOG_COORD_SRC\t\t\t\t\t= 0x8450    # alias GL_FOG_COORDINATE_SOURCE\n\tFOG_COORD\t\t\t\t\t= 0x8451    # alias GL_FOG_COORDINATE\n\tCURRENT_FOG_COORD\t\t\t\t= 0x8453    # alias GL_CURRENT_FOG_COORDINATE\n\tFOG_COORD_ARRAY_TYPE\t\t\t\t= 0x8454    # alias GL_FOG_COORDINATE_ARRAY_TYPE\n\tFOG_COORD_ARRAY_STRIDE\t\t\t\t= 0x8455    # alias GL_FOG_COORDINATE_ARRAY_STRIDE\n\tFOG_COORD_ARRAY_POINTER\t\t\t\t= 0x8456    # alias GL_FOG_COORDINATE_ARRAY_POINTER\n\tFOG_COORD_ARRAY\t\t\t\t\t= 0x8457    # alias GL_FOG_COORDINATE_ARRAY\n\tFOG_COORD_ARRAY_BUFFER_BINDING\t\t\t= 0x889D    # alias GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING\n# New naming scheme\n\tSRC0_RGB\t\t\t\t\t= 0x8580    # alias GL_SOURCE0_RGB\n\tSRC1_RGB\t\t\t\t\t= 0x8581    # alias GL_SOURCE1_RGB\n\tSRC2_RGB\t\t\t\t\t= 0x8582    # alias GL_SOURCE2_RGB\n\tSRC0_ALPHA\t\t\t\t\t= 0x8588    # alias GL_SOURCE0_ALPHA\n\tSRC1_ALPHA\t\t\t\t\t= 0x8589    # alias GL_SOURCE1_ALPHA\n\tSRC2_ALPHA\t\t\t\t\t= 0x858A    # alias GL_SOURCE2_ALPHA\n\n###############################################################################\n#\n# OpenGL 2.0 enums\n#\n###############################################################################\n\nVERSION_2_0 enum:\n\tBLEND_EQUATION_RGB\t\t\t\t= 0x8009    # EXT_blend_equation_separate   # alias GL_BLEND_EQUATION\n\tVERTEX_ATTRIB_ARRAY_ENABLED\t\t\t= 0x8622    # ARB_vertex_shader\n\tVERTEX_ATTRIB_ARRAY_SIZE\t\t\t= 0x8623    # ARB_vertex_shader\n\tVERTEX_ATTRIB_ARRAY_STRIDE\t\t\t= 0x8624    # ARB_vertex_shader\n\tVERTEX_ATTRIB_ARRAY_TYPE\t\t\t= 0x8625    # ARB_vertex_shader\n\tCURRENT_VERTEX_ATTRIB\t\t\t\t= 0x8626    # ARB_vertex_shader\n\tVERTEX_PROGRAM_POINT_SIZE\t\t\t= 0x8642    # ARB_vertex_shader\n\tVERTEX_ATTRIB_ARRAY_POINTER\t\t\t= 0x8645    # ARB_vertex_shader\n\tSTENCIL_BACK_FUNC\t\t\t\t= 0x8800    # ARB_stencil_two_side\n\tSTENCIL_BACK_FAIL\t\t\t\t= 0x8801    # ARB_stencil_two_side\n\tSTENCIL_BACK_PASS_DEPTH_FAIL\t\t\t= 0x8802    # ARB_stencil_two_side\n\tSTENCIL_BACK_PASS_DEPTH_PASS\t\t\t= 0x8803    # ARB_stencil_two_side\n\tMAX_DRAW_BUFFERS\t\t\t\t= 0x8824    # ARB_draw_buffers\n\tDRAW_BUFFER0\t\t\t\t\t= 0x8825    # ARB_draw_buffers\n\tDRAW_BUFFER1\t\t\t\t\t= 0x8826    # ARB_draw_buffers\n\tDRAW_BUFFER2\t\t\t\t\t= 0x8827    # ARB_draw_buffers\n\tDRAW_BUFFER3\t\t\t\t\t= 0x8828    # ARB_draw_buffers\n\tDRAW_BUFFER4\t\t\t\t\t= 0x8829    # ARB_draw_buffers\n\tDRAW_BUFFER5\t\t\t\t\t= 0x882A    # ARB_draw_buffers\n\tDRAW_BUFFER6\t\t\t\t\t= 0x882B    # ARB_draw_buffers\n\tDRAW_BUFFER7\t\t\t\t\t= 0x882C    # ARB_draw_buffers\n\tDRAW_BUFFER8\t\t\t\t\t= 0x882D    # ARB_draw_buffers\n\tDRAW_BUFFER9\t\t\t\t\t= 0x882E    # ARB_draw_buffers\n\tDRAW_BUFFER10\t\t\t\t\t= 0x882F    # ARB_draw_buffers\n\tDRAW_BUFFER11\t\t\t\t\t= 0x8830    # ARB_draw_buffers\n\tDRAW_BUFFER12\t\t\t\t\t= 0x8831    # ARB_draw_buffers\n\tDRAW_BUFFER13\t\t\t\t\t= 0x8832    # ARB_draw_buffers\n\tDRAW_BUFFER14\t\t\t\t\t= 0x8833    # ARB_draw_buffers\n\tDRAW_BUFFER15\t\t\t\t\t= 0x8834    # ARB_draw_buffers\n\tBLEND_EQUATION_ALPHA\t\t\t\t= 0x883D    # EXT_blend_equation_separate\n\tMAX_VERTEX_ATTRIBS\t\t\t\t= 0x8869    # ARB_vertex_shader\n\tVERTEX_ATTRIB_ARRAY_NORMALIZED\t\t\t= 0x886A    # ARB_vertex_shader\n\tMAX_TEXTURE_IMAGE_UNITS\t\t\t\t= 0x8872    # ARB_vertex_shader, ARB_fragment_shader\n\tFRAGMENT_SHADER\t\t\t\t\t= 0x8B30    # ARB_fragment_shader\n\tVERTEX_SHADER\t\t\t\t\t= 0x8B31    # ARB_vertex_shader\n\tMAX_FRAGMENT_UNIFORM_COMPONENTS\t\t\t= 0x8B49    # ARB_fragment_shader\n\tMAX_VERTEX_UNIFORM_COMPONENTS\t\t\t= 0x8B4A    # ARB_vertex_shader\n\tMAX_VARYING_FLOATS\t\t\t\t= 0x8B4B    # ARB_vertex_shader\n\tMAX_VERTEX_TEXTURE_IMAGE_UNITS\t\t\t= 0x8B4C    # ARB_vertex_shader\n\tMAX_COMBINED_TEXTURE_IMAGE_UNITS\t\t= 0x8B4D    # ARB_vertex_shader\n\tSHADER_TYPE\t\t\t\t\t= 0x8B4F    # ARB_shader_objects\n\tFLOAT_VEC2\t\t\t\t\t= 0x8B50    # ARB_shader_objects\n\tFLOAT_VEC3\t\t\t\t\t= 0x8B51    # ARB_shader_objects\n\tFLOAT_VEC4\t\t\t\t\t= 0x8B52    # ARB_shader_objects\n\tINT_VEC2\t\t\t\t\t= 0x8B53    # ARB_shader_objects\n\tINT_VEC3\t\t\t\t\t= 0x8B54    # ARB_shader_objects\n\tINT_VEC4\t\t\t\t\t= 0x8B55    # ARB_shader_objects\n\tBOOL\t\t\t\t\t\t= 0x8B56    # ARB_shader_objects\n\tBOOL_VEC2\t\t\t\t\t= 0x8B57    # ARB_shader_objects\n\tBOOL_VEC3\t\t\t\t\t= 0x8B58    # ARB_shader_objects\n\tBOOL_VEC4\t\t\t\t\t= 0x8B59    # ARB_shader_objects\n\tFLOAT_MAT2\t\t\t\t\t= 0x8B5A    # ARB_shader_objects\n\tFLOAT_MAT3\t\t\t\t\t= 0x8B5B    # ARB_shader_objects\n\tFLOAT_MAT4\t\t\t\t\t= 0x8B5C    # ARB_shader_objects\n\tSAMPLER_1D\t\t\t\t\t= 0x8B5D    # ARB_shader_objects\n\tSAMPLER_2D\t\t\t\t\t= 0x8B5E    # ARB_shader_objects\n\tSAMPLER_3D\t\t\t\t\t= 0x8B5F    # ARB_shader_objects\n\tSAMPLER_CUBE\t\t\t\t\t= 0x8B60    # ARB_shader_objects\n\tSAMPLER_1D_SHADOW\t\t\t\t= 0x8B61    # ARB_shader_objects\n\tSAMPLER_2D_SHADOW\t\t\t\t= 0x8B62    # ARB_shader_objects\n\tDELETE_STATUS\t\t\t\t\t= 0x8B80    # ARB_shader_objects\n\tCOMPILE_STATUS\t\t\t\t\t= 0x8B81    # ARB_shader_objects\n\tLINK_STATUS\t\t\t\t\t= 0x8B82    # ARB_shader_objects\n\tVALIDATE_STATUS\t\t\t\t\t= 0x8B83    # ARB_shader_objects\n\tINFO_LOG_LENGTH\t\t\t\t\t= 0x8B84    # ARB_shader_objects\n\tATTACHED_SHADERS\t\t\t\t= 0x8B85    # ARB_shader_objects\n\tACTIVE_UNIFORMS\t\t\t\t\t= 0x8B86    # ARB_shader_objects\n\tACTIVE_UNIFORM_MAX_LENGTH\t\t\t= 0x8B87    # ARB_shader_objects\n\tSHADER_SOURCE_LENGTH\t\t\t\t= 0x8B88    # ARB_shader_objects\n\tACTIVE_ATTRIBUTES\t\t\t\t= 0x8B89    # ARB_vertex_shader\n\tACTIVE_ATTRIBUTE_MAX_LENGTH\t\t\t= 0x8B8A    # ARB_vertex_shader\n\tFRAGMENT_SHADER_DERIVATIVE_HINT\t\t\t= 0x8B8B    # ARB_fragment_shader\n\tSHADING_LANGUAGE_VERSION\t\t\t= 0x8B8C    # ARB_shading_language_100\n\tCURRENT_PROGRAM\t\t\t\t\t= 0x8B8D    # ARB_shader_objects (added for 2.0)\n\tPOINT_SPRITE_COORD_ORIGIN\t\t\t= 0x8CA0    # ARB_point_sprite (added for 2.0)\n\tLOWER_LEFT\t\t\t\t\t= 0x8CA1    # ARB_point_sprite (added for 2.0)\n\tUPPER_LEFT\t\t\t\t\t= 0x8CA2    # ARB_point_sprite (added for 2.0)\n\tSTENCIL_BACK_REF\t\t\t\t= 0x8CA3    # ARB_stencil_two_side\n\tSTENCIL_BACK_VALUE_MASK\t\t\t\t= 0x8CA4    # ARB_stencil_two_side\n\tSTENCIL_BACK_WRITEMASK\t\t\t\t= 0x8CA5    # ARB_stencil_two_side\n\nVERSION_2_0_DEPRECATED enum:\n\tVERTEX_PROGRAM_TWO_SIDE\t\t\t\t= 0x8643    # ARB_vertex_shader\n\tPOINT_SPRITE\t\t\t\t\t= 0x8861    # ARB_point_sprite\n\tCOORD_REPLACE\t\t\t\t\t= 0x8862    # ARB_point_sprite\n\tMAX_TEXTURE_COORDS\t\t\t\t= 0x8871    # ARB_vertex_shader, ARB_fragment_shader\n\n\n###############################################################################\n#\n# OpenGL 2.1 enums\n#\n###############################################################################\n\nVERSION_2_1 enum:\n\tPIXEL_PACK_BUFFER\t\t\t\t= 0x88EB    # ARB_pixel_buffer_object\n\tPIXEL_UNPACK_BUFFER\t\t\t\t= 0x88EC    # ARB_pixel_buffer_object\n\tPIXEL_PACK_BUFFER_BINDING\t\t\t= 0x88ED    # ARB_pixel_buffer_object\n\tPIXEL_UNPACK_BUFFER_BINDING\t\t\t= 0x88EF    # ARB_pixel_buffer_object\n\tFLOAT_MAT2x3\t\t\t\t\t= 0x8B65    # New for 2.1\n\tFLOAT_MAT2x4\t\t\t\t\t= 0x8B66    # New for 2.1\n\tFLOAT_MAT3x2\t\t\t\t\t= 0x8B67    # New for 2.1\n\tFLOAT_MAT3x4\t\t\t\t\t= 0x8B68    # New for 2.1\n\tFLOAT_MAT4x2\t\t\t\t\t= 0x8B69    # New for 2.1\n\tFLOAT_MAT4x3\t\t\t\t\t= 0x8B6A    # New for 2.1\n\tSRGB\t\t\t\t\t\t= 0x8C40    # EXT_texture_sRGB\n\tSRGB8\t\t\t\t\t\t= 0x8C41    # EXT_texture_sRGB\n\tSRGB_ALPHA\t\t\t\t\t= 0x8C42    # EXT_texture_sRGB\n\tSRGB8_ALPHA8\t\t\t\t\t= 0x8C43    # EXT_texture_sRGB\n\tCOMPRESSED_SRGB\t\t\t\t\t= 0x8C48    # EXT_texture_sRGB\n\tCOMPRESSED_SRGB_ALPHA\t\t\t\t= 0x8C49    # EXT_texture_sRGB\n\nVERSION_2_1_DEPRECATED enum:\n\tCURRENT_RASTER_SECONDARY_COLOR\t\t\t= 0x845F    # New for 2.1\n\tSLUMINANCE_ALPHA\t\t\t\t= 0x8C44    # EXT_texture_sRGB\n\tSLUMINANCE8_ALPHA8\t\t\t\t= 0x8C45    # EXT_texture_sRGB\n\tSLUMINANCE\t\t\t\t\t= 0x8C46    # EXT_texture_sRGB\n\tSLUMINANCE8\t\t\t\t\t= 0x8C47    # EXT_texture_sRGB\n\tCOMPRESSED_SLUMINANCE\t\t\t\t= 0x8C4A    # EXT_texture_sRGB\n\tCOMPRESSED_SLUMINANCE_ALPHA\t\t\t= 0x8C4B    # EXT_texture_sRGB\n\n\n###############################################################################\n#\n# OpenGL 3.0 enums\n#\n###############################################################################\n\nVERSION_3_0 enum:\n\tCOMPARE_REF_TO_TEXTURE\t\t\t\t= 0x884E    # alias GL_COMPARE_R_TO_TEXTURE_ARB\n\tCLIP_DISTANCE0\t\t\t\t\t= 0x3000    # alias GL_CLIP_PLANE0\n\tCLIP_DISTANCE1\t\t\t\t\t= 0x3001    # alias GL_CLIP_PLANE1\n\tCLIP_DISTANCE2\t\t\t\t\t= 0x3002    # alias GL_CLIP_PLANE2\n\tCLIP_DISTANCE3\t\t\t\t\t= 0x3003    # alias GL_CLIP_PLANE3\n\tCLIP_DISTANCE4\t\t\t\t\t= 0x3004    # alias GL_CLIP_PLANE4\n\tCLIP_DISTANCE5\t\t\t\t\t= 0x3005    # alias GL_CLIP_PLANE5\n\tCLIP_DISTANCE6\t\t\t\t\t= 0x3006\n\tCLIP_DISTANCE7\t\t\t\t\t= 0x3007\n\tMAX_CLIP_DISTANCES\t\t\t\t= 0x0D32    # alias GL_MAX_CLIP_PLANES\n\tMAJOR_VERSION\t\t\t\t\t= 0x821B\n\tMINOR_VERSION\t\t\t\t\t= 0x821C\n\tNUM_EXTENSIONS\t\t\t\t\t= 0x821D\n\tCONTEXT_FLAGS\t\t\t\t\t= 0x821E\n\tDEPTH_BUFFER\t\t\t\t\t= 0x8223\n\tSTENCIL_BUFFER\t\t\t\t\t= 0x8224\n\tCOMPRESSED_RED\t\t\t\t\t= 0x8225\n\tCOMPRESSED_RG\t\t\t\t\t= 0x8226\n\tCONTEXT_FLAG_FORWARD_COMPATIBLE_BIT\t\t= 0x0001\n\tRGBA32F\t\t\t\t\t\t= 0x8814\n\tRGB32F\t\t\t\t\t\t= 0x8815\n\tRGBA16F\t\t\t\t\t\t= 0x881A\n\tRGB16F\t\t\t\t\t\t= 0x881B\n\tVERTEX_ATTRIB_ARRAY_INTEGER\t\t\t= 0x88FD\n\tMAX_ARRAY_TEXTURE_LAYERS\t\t\t= 0x88FF\n\tMIN_PROGRAM_TEXEL_OFFSET\t\t\t= 0x8904\n\tMAX_PROGRAM_TEXEL_OFFSET\t\t\t= 0x8905\n\tCLAMP_READ_COLOR\t\t\t\t= 0x891C\n\tFIXED_ONLY\t\t\t\t\t= 0x891D\n\tMAX_VARYING_COMPONENTS\t\t\t\t= 0x8B4B    # alias GL_MAX_VARYING_FLOATS\n\tTEXTURE_1D_ARRAY\t\t\t\t= 0x8C18\n\tPROXY_TEXTURE_1D_ARRAY\t\t\t\t= 0x8C19\n\tTEXTURE_2D_ARRAY\t\t\t\t= 0x8C1A\n\tPROXY_TEXTURE_2D_ARRAY\t\t\t\t= 0x8C1B\n\tTEXTURE_BINDING_1D_ARRAY\t\t\t= 0x8C1C\n\tTEXTURE_BINDING_2D_ARRAY\t\t\t= 0x8C1D\n\tR11F_G11F_B10F\t\t\t\t\t= 0x8C3A\n\tUNSIGNED_INT_10F_11F_11F_REV\t\t\t= 0x8C3B\n\tRGB9_E5\t\t\t\t\t\t= 0x8C3D\n\tUNSIGNED_INT_5_9_9_9_REV\t\t\t= 0x8C3E\n\tTEXTURE_SHARED_SIZE\t\t\t\t= 0x8C3F\n\tTRANSFORM_FEEDBACK_VARYING_MAX_LENGTH\t\t= 0x8C76\n\tTRANSFORM_FEEDBACK_BUFFER_MODE\t\t\t= 0x8C7F\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS\t= 0x8C80\n\tTRANSFORM_FEEDBACK_VARYINGS\t\t\t= 0x8C83\n\tTRANSFORM_FEEDBACK_BUFFER_START\t\t\t= 0x8C84\n\tTRANSFORM_FEEDBACK_BUFFER_SIZE\t\t\t= 0x8C85\n\tPRIMITIVES_GENERATED\t\t\t\t= 0x8C87\n\tTRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN\t\t= 0x8C88\n\tRASTERIZER_DISCARD\t\t\t\t= 0x8C89\n\tMAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS\t= 0x8C8A\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS\t\t= 0x8C8B\n\tINTERLEAVED_ATTRIBS\t\t\t\t= 0x8C8C\n\tSEPARATE_ATTRIBS\t\t\t\t= 0x8C8D\n\tTRANSFORM_FEEDBACK_BUFFER\t\t\t= 0x8C8E\n\tTRANSFORM_FEEDBACK_BUFFER_BINDING\t\t= 0x8C8F\n\tRGBA32UI\t\t\t\t\t= 0x8D70\n\tRGB32UI\t\t\t\t\t\t= 0x8D71\n\tRGBA16UI\t\t\t\t\t= 0x8D76\n\tRGB16UI\t\t\t\t\t\t= 0x8D77\n\tRGBA8UI\t\t\t\t\t\t= 0x8D7C\n\tRGB8UI\t\t\t\t\t\t= 0x8D7D\n\tRGBA32I\t\t\t\t\t\t= 0x8D82\n\tRGB32I\t\t\t\t\t\t= 0x8D83\n\tRGBA16I\t\t\t\t\t\t= 0x8D88\n\tRGB16I\t\t\t\t\t\t= 0x8D89\n\tRGBA8I\t\t\t\t\t\t= 0x8D8E\n\tRGB8I\t\t\t\t\t\t= 0x8D8F\n\tRED_INTEGER\t\t\t\t\t= 0x8D94\n\tGREEN_INTEGER\t\t\t\t\t= 0x8D95\n\tBLUE_INTEGER\t\t\t\t\t= 0x8D96\n\tRGB_INTEGER\t\t\t\t\t= 0x8D98\n\tRGBA_INTEGER\t\t\t\t\t= 0x8D99\n\tBGR_INTEGER\t\t\t\t\t= 0x8D9A\n\tBGRA_INTEGER\t\t\t\t\t= 0x8D9B\n\tSAMPLER_1D_ARRAY\t\t\t\t= 0x8DC0\n\tSAMPLER_2D_ARRAY\t\t\t\t= 0x8DC1\n\tSAMPLER_1D_ARRAY_SHADOW\t\t\t\t= 0x8DC3\n\tSAMPLER_2D_ARRAY_SHADOW\t\t\t\t= 0x8DC4\n\tSAMPLER_CUBE_SHADOW\t\t\t\t= 0x8DC5\n\tUNSIGNED_INT_VEC2\t\t\t\t= 0x8DC6\n\tUNSIGNED_INT_VEC3\t\t\t\t= 0x8DC7\n\tUNSIGNED_INT_VEC4\t\t\t\t= 0x8DC8\n\tINT_SAMPLER_1D\t\t\t\t\t= 0x8DC9\n\tINT_SAMPLER_2D\t\t\t\t\t= 0x8DCA\n\tINT_SAMPLER_3D\t\t\t\t\t= 0x8DCB\n\tINT_SAMPLER_CUBE\t\t\t\t= 0x8DCC\n\tINT_SAMPLER_1D_ARRAY\t\t\t\t= 0x8DCE\n\tINT_SAMPLER_2D_ARRAY\t\t\t\t= 0x8DCF\n\tUNSIGNED_INT_SAMPLER_1D\t\t\t\t= 0x8DD1\n\tUNSIGNED_INT_SAMPLER_2D\t\t\t\t= 0x8DD2\n\tUNSIGNED_INT_SAMPLER_3D\t\t\t\t= 0x8DD3\n\tUNSIGNED_INT_SAMPLER_CUBE\t\t\t= 0x8DD4\n\tUNSIGNED_INT_SAMPLER_1D_ARRAY\t\t\t= 0x8DD6\n\tUNSIGNED_INT_SAMPLER_2D_ARRAY\t\t\t= 0x8DD7\n\tQUERY_WAIT\t\t\t\t\t= 0x8E13\n\tQUERY_NO_WAIT\t\t\t\t\t= 0x8E14\n\tQUERY_BY_REGION_WAIT\t\t\t\t= 0x8E15\n\tQUERY_BY_REGION_NO_WAIT\t\t\t\t= 0x8E16\n\tBUFFER_ACCESS_FLAGS\t\t\t\t= 0x911F\n\tBUFFER_MAP_LENGTH\t\t\t\t= 0x9120\n\tBUFFER_MAP_OFFSET\t\t\t\t= 0x9121\npassthru: /* Reuse tokens from ARB_depth_buffer_float */\n\tuse ARB_depth_buffer_float\t    DEPTH_COMPONENT32F\n\tuse ARB_depth_buffer_float\t    DEPTH32F_STENCIL8\n\tuse ARB_depth_buffer_float\t    FLOAT_32_UNSIGNED_INT_24_8_REV\npassthru: /* Reuse tokens from ARB_framebuffer_object */\n\tuse ARB_framebuffer_object\t    INVALID_FRAMEBUFFER_OPERATION\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_RED_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_GREEN_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_BLUE_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_DEFAULT\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_UNDEFINED\n\tuse ARB_framebuffer_object\t    DEPTH_STENCIL_ATTACHMENT\n\tuse ARB_framebuffer_object\t    INDEX\n\tuse ARB_framebuffer_object\t    MAX_RENDERBUFFER_SIZE\n\tuse ARB_framebuffer_object\t    DEPTH_STENCIL\n\tuse ARB_framebuffer_object\t    UNSIGNED_INT_24_8\n\tuse ARB_framebuffer_object\t    DEPTH24_STENCIL8\n\tuse ARB_framebuffer_object\t    TEXTURE_STENCIL_SIZE\n\tuse ARB_framebuffer_object\t    TEXTURE_RED_TYPE\n\tuse ARB_framebuffer_object\t    TEXTURE_GREEN_TYPE\n\tuse ARB_framebuffer_object\t    TEXTURE_BLUE_TYPE\n\tuse ARB_framebuffer_object\t    TEXTURE_ALPHA_TYPE\n\tuse ARB_framebuffer_object\t    TEXTURE_DEPTH_TYPE\n\tuse ARB_framebuffer_object\t    UNSIGNED_NORMALIZED\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_BINDING\n\tuse ARB_framebuffer_object\t    DRAW_FRAMEBUFFER_BINDING\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_BINDING\n\tuse ARB_framebuffer_object\t    READ_FRAMEBUFFER\n\tuse ARB_framebuffer_object\t    DRAW_FRAMEBUFFER\n\tuse ARB_framebuffer_object\t    READ_FRAMEBUFFER_BINDING\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_SAMPLES\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_OBJECT_NAME\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_COMPLETE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_INCOMPLETE_ATTACHMENT\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_INCOMPLETE_READ_BUFFER\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_UNSUPPORTED\n\tuse ARB_framebuffer_object\t    MAX_COLOR_ATTACHMENTS\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT0\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT1\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT2\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT3\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT4\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT5\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT6\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT7\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT8\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT9\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT10\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT11\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT12\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT13\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT14\n\tuse ARB_framebuffer_object\t    COLOR_ATTACHMENT15\n\tuse ARB_framebuffer_object\t    DEPTH_ATTACHMENT\n\tuse ARB_framebuffer_object\t    STENCIL_ATTACHMENT\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER\n\tuse ARB_framebuffer_object\t    RENDERBUFFER\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_WIDTH\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_HEIGHT\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_INTERNAL_FORMAT\n\tuse ARB_framebuffer_object\t    STENCIL_INDEX1\n\tuse ARB_framebuffer_object\t    STENCIL_INDEX4\n\tuse ARB_framebuffer_object\t    STENCIL_INDEX8\n\tuse ARB_framebuffer_object\t    STENCIL_INDEX16\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_RED_SIZE\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_GREEN_SIZE\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_BLUE_SIZE\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_ALPHA_SIZE\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_DEPTH_SIZE\n\tuse ARB_framebuffer_object\t    RENDERBUFFER_STENCIL_SIZE\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_INCOMPLETE_MULTISAMPLE\n\tuse ARB_framebuffer_object\t    MAX_SAMPLES\npassthru: /* Reuse tokens from ARB_framebuffer_sRGB */\n\tuse ARB_framebuffer_sRGB\t    FRAMEBUFFER_SRGB\npassthru: /* Reuse tokens from ARB_half_float_vertex */\n\tuse ARB_half_float_vertex\t    HALF_FLOAT\npassthru: /* Reuse tokens from ARB_map_buffer_range */\n\tuse ARB_map_buffer_range\t    MAP_READ_BIT\n\tuse ARB_map_buffer_range\t    MAP_WRITE_BIT\n\tuse ARB_map_buffer_range\t    MAP_INVALIDATE_RANGE_BIT\n\tuse ARB_map_buffer_range\t    MAP_INVALIDATE_BUFFER_BIT\n\tuse ARB_map_buffer_range\t    MAP_FLUSH_EXPLICIT_BIT\n\tuse ARB_map_buffer_range\t    MAP_UNSYNCHRONIZED_BIT\npassthru: /* Reuse tokens from ARB_texture_compression_rgtc */\n\tuse ARB_texture_compression_rgtc    COMPRESSED_RED_RGTC1\n\tuse ARB_texture_compression_rgtc    COMPRESSED_SIGNED_RED_RGTC1\n\tuse ARB_texture_compression_rgtc    COMPRESSED_RG_RGTC2\n\tuse ARB_texture_compression_rgtc    COMPRESSED_SIGNED_RG_RGTC2\npassthru: /* Reuse tokens from ARB_texture_rg */\n\tuse ARB_texture_rg\t\t    RG\n\tuse ARB_texture_rg\t\t    RG_INTEGER\n\tuse ARB_texture_rg\t\t    R8\n\tuse ARB_texture_rg\t\t    R16\n\tuse ARB_texture_rg\t\t    RG8\n\tuse ARB_texture_rg\t\t    RG16\n\tuse ARB_texture_rg\t\t    R16F\n\tuse ARB_texture_rg\t\t    R32F\n\tuse ARB_texture_rg\t\t    RG16F\n\tuse ARB_texture_rg\t\t    RG32F\n\tuse ARB_texture_rg\t\t    R8I\n\tuse ARB_texture_rg\t\t    R8UI\n\tuse ARB_texture_rg\t\t    R16I\n\tuse ARB_texture_rg\t\t    R16UI\n\tuse ARB_texture_rg\t\t    R32I\n\tuse ARB_texture_rg\t\t    R32UI\n\tuse ARB_texture_rg\t\t    RG8I\n\tuse ARB_texture_rg\t\t    RG8UI\n\tuse ARB_texture_rg\t\t    RG16I\n\tuse ARB_texture_rg\t\t    RG16UI\n\tuse ARB_texture_rg\t\t    RG32I\n\tuse ARB_texture_rg\t\t    RG32UI\npassthru: /* Reuse tokens from ARB_vertex_array_object */\n\tuse ARB_vertex_array_object\t    VERTEX_ARRAY_BINDING\n\nVERSION_3_0_DEPRECATED enum:\n\tCLAMP_VERTEX_COLOR\t\t\t\t= 0x891A\n\tCLAMP_FRAGMENT_COLOR\t\t\t\t= 0x891B\n\tALPHA_INTEGER\t\t\t\t\t= 0x8D97\npassthru: /* Reuse tokens from ARB_framebuffer_object */\n\tuse ARB_framebuffer_object\t    TEXTURE_LUMINANCE_TYPE\n\tuse ARB_framebuffer_object\t    TEXTURE_INTENSITY_TYPE\n\n\n###############################################################################\n#\n# OpenGL 3.1 enums\n#\n###############################################################################\n\nVERSION_3_1 enum:\n\tSAMPLER_2D_RECT\t\t\t\t\t= 0x8B63    # ARB_shader_objects + ARB_texture_rectangle\n\tSAMPLER_2D_RECT_SHADOW\t\t\t\t= 0x8B64    # ARB_shader_objects + ARB_texture_rectangle\n\tSAMPLER_BUFFER\t\t\t\t\t= 0x8DC2    # EXT_gpu_shader4 + ARB_texture_buffer_object\n\tINT_SAMPLER_2D_RECT\t\t\t\t= 0x8DCD    # EXT_gpu_shader4 + ARB_texture_rectangle\n\tINT_SAMPLER_BUFFER\t\t\t\t= 0x8DD0    # EXT_gpu_shader4 + ARB_texture_buffer_object\n\tUNSIGNED_INT_SAMPLER_2D_RECT\t\t\t= 0x8DD5    # EXT_gpu_shader4 + ARB_texture_rectangle\n\tUNSIGNED_INT_SAMPLER_BUFFER\t\t\t= 0x8DD8    # EXT_gpu_shader4 + ARB_texture_buffer_object\n\tTEXTURE_BUFFER\t\t\t\t\t= 0x8C2A    # ARB_texture_buffer_object\n\tMAX_TEXTURE_BUFFER_SIZE\t\t\t\t= 0x8C2B    # ARB_texture_buffer_object\n\tTEXTURE_BINDING_BUFFER\t\t\t\t= 0x8C2C    # ARB_texture_buffer_object\n\tTEXTURE_BUFFER_DATA_STORE_BINDING\t\t= 0x8C2D    # ARB_texture_buffer_object\n\tTEXTURE_BUFFER_FORMAT\t\t\t\t= 0x8C2E    # ARB_texture_buffer_object\n\tTEXTURE_RECTANGLE\t\t\t\t= 0x84F5    # ARB_texture_rectangle\n\tTEXTURE_BINDING_RECTANGLE\t\t\t= 0x84F6    # ARB_texture_rectangle\n\tPROXY_TEXTURE_RECTANGLE\t\t\t\t= 0x84F7    # ARB_texture_rectangle\n\tMAX_RECTANGLE_TEXTURE_SIZE\t\t\t= 0x84F8    # ARB_texture_rectangle\n\tRED_SNORM\t\t\t\t\t= 0x8F90    # 3.1\n\tRG_SNORM\t\t\t\t\t= 0x8F91    # 3.1\n\tRGB_SNORM\t\t\t\t\t= 0x8F92    # 3.1\n\tRGBA_SNORM\t\t\t\t\t= 0x8F93    # 3.1\n\tR8_SNORM\t\t\t\t\t= 0x8F94    # 3.1\n\tRG8_SNORM\t\t\t\t\t= 0x8F95    # 3.1\n\tRGB8_SNORM\t\t\t\t\t= 0x8F96    # 3.1\n\tRGBA8_SNORM\t\t\t\t\t= 0x8F97    # 3.1\n\tR16_SNORM\t\t\t\t\t= 0x8F98    # 3.1\n\tRG16_SNORM\t\t\t\t\t= 0x8F99    # 3.1\n\tRGB16_SNORM\t\t\t\t\t= 0x8F9A    # 3.1\n\tRGBA16_SNORM\t\t\t\t\t= 0x8F9B    # 3.1\n\tSIGNED_NORMALIZED\t\t\t\t= 0x8F9C    # 3.1\n\tPRIMITIVE_RESTART\t\t\t\t= 0x8F9D    # 3.1 (different from NV_primitive_restart)\n\tPRIMITIVE_RESTART_INDEX\t\t\t\t= 0x8F9E    # 3.1 (different from NV_primitive_restart)\npassthru: /* Reuse tokens from ARB_copy_buffer */\n\tuse ARB_copy_buffer\t\t    COPY_READ_BUFFER\n\tuse ARB_copy_buffer\t\t    COPY_WRITE_BUFFER\npassthru: /* Would reuse tokens from ARB_draw_instanced, but it has none */\npassthru: /* Reuse tokens from ARB_uniform_buffer_object */\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BUFFER\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BUFFER_BINDING\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BUFFER_START\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BUFFER_SIZE\n\tuse ARB_uniform_buffer_object\t    MAX_VERTEX_UNIFORM_BLOCKS\n\tuse ARB_uniform_buffer_object\t    MAX_FRAGMENT_UNIFORM_BLOCKS\n\tuse ARB_uniform_buffer_object\t    MAX_COMBINED_UNIFORM_BLOCKS\n\tuse ARB_uniform_buffer_object\t    MAX_UNIFORM_BUFFER_BINDINGS\n\tuse ARB_uniform_buffer_object\t    MAX_UNIFORM_BLOCK_SIZE\n\tuse ARB_uniform_buffer_object\t    MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS\n\tuse ARB_uniform_buffer_object\t    MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BUFFER_OFFSET_ALIGNMENT\n\tuse ARB_uniform_buffer_object\t    ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH\n\tuse ARB_uniform_buffer_object\t    ACTIVE_UNIFORM_BLOCKS\n\tuse ARB_uniform_buffer_object\t    UNIFORM_TYPE\n\tuse ARB_uniform_buffer_object\t    UNIFORM_SIZE\n\tuse ARB_uniform_buffer_object\t    UNIFORM_NAME_LENGTH\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_INDEX\n\tuse ARB_uniform_buffer_object\t    UNIFORM_OFFSET\n\tuse ARB_uniform_buffer_object\t    UNIFORM_ARRAY_STRIDE\n\tuse ARB_uniform_buffer_object\t    UNIFORM_MATRIX_STRIDE\n\tuse ARB_uniform_buffer_object\t    UNIFORM_IS_ROW_MAJOR\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_BINDING\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_DATA_SIZE\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_NAME_LENGTH\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_ACTIVE_UNIFORMS\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER\n\tuse ARB_uniform_buffer_object\t    UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER\n\tuse ARB_uniform_buffer_object\t    INVALID_INDEX\n\n\n###############################################################################\n#\n# OpenGL 3.2 enums\n#\n###############################################################################\n\nVERSION_3_2 enum:\n\tCONTEXT_CORE_PROFILE_BIT\t\t\t= 0x00000001\n\tCONTEXT_COMPATIBILITY_PROFILE_BIT\t\t= 0x00000002\n\tLINES_ADJACENCY\t\t\t\t\t= 0x000A\n\tLINE_STRIP_ADJACENCY\t\t\t\t= 0x000B\n\tTRIANGLES_ADJACENCY\t\t\t\t= 0x000C\n\tTRIANGLE_STRIP_ADJACENCY\t\t\t= 0x000D\n\tPROGRAM_POINT_SIZE\t\t\t\t= 0x8642\n\tMAX_GEOMETRY_TEXTURE_IMAGE_UNITS\t\t= 0x8C29\n\tFRAMEBUFFER_ATTACHMENT_LAYERED\t\t\t= 0x8DA7\n\tFRAMEBUFFER_INCOMPLETE_LAYER_TARGETS\t\t= 0x8DA8\n\tGEOMETRY_SHADER\t\t\t\t\t= 0x8DD9\n\tGEOMETRY_VERTICES_OUT\t\t\t\t= 0x8916\n\tGEOMETRY_INPUT_TYPE\t\t\t\t= 0x8917\n\tGEOMETRY_OUTPUT_TYPE\t\t\t\t= 0x8918\n\tMAX_GEOMETRY_UNIFORM_COMPONENTS\t\t\t= 0x8DDF\n\tMAX_GEOMETRY_OUTPUT_VERTICES\t\t\t= 0x8DE0\n\tMAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS\t\t= 0x8DE1\n\tMAX_VERTEX_OUTPUT_COMPONENTS\t\t\t= 0x9122\n\tMAX_GEOMETRY_INPUT_COMPONENTS\t\t\t= 0x9123\n\tMAX_GEOMETRY_OUTPUT_COMPONENTS\t\t\t= 0x9124\n\tMAX_FRAGMENT_INPUT_COMPONENTS\t\t\t= 0x9125\n\tCONTEXT_PROFILE_MASK\t\t\t\t= 0x9126\n\tuse VERSION_3_0\t\t\t    MAX_VARYING_COMPONENTS\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER\npassthru: /* Reuse tokens from ARB_depth_clamp */\n\tuse ARB_depth_clamp\t\t    DEPTH_CLAMP\npassthru: /* Would reuse tokens from ARB_draw_elements_base_vertex, but it has none */\npassthru: /* Would reuse tokens from ARB_fragment_coord_conventions, but it has none */\npassthru: /* Reuse tokens from ARB_provoking_vertex */\n\tuse ARB_provoking_vertex\t    QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION\n\tuse ARB_provoking_vertex\t    FIRST_VERTEX_CONVENTION\n\tuse ARB_provoking_vertex\t    LAST_VERTEX_CONVENTION\n\tuse ARB_provoking_vertex\t    PROVOKING_VERTEX\npassthru: /* Reuse tokens from ARB_seamless_cube_map */\n\tuse ARB_seamless_cube_map\t    TEXTURE_CUBE_MAP_SEAMLESS\npassthru: /* Reuse tokens from ARB_sync */\n\tuse ARB_sync\t\t\t    MAX_SERVER_WAIT_TIMEOUT\n\tuse ARB_sync\t\t\t    OBJECT_TYPE\n\tuse ARB_sync\t\t\t    SYNC_CONDITION\n\tuse ARB_sync\t\t\t    SYNC_STATUS\n\tuse ARB_sync\t\t\t    SYNC_FLAGS\n\tuse ARB_sync\t\t\t    SYNC_FENCE\n\tuse ARB_sync\t\t\t    SYNC_GPU_COMMANDS_COMPLETE\n\tuse ARB_sync\t\t\t    UNSIGNALED\n\tuse ARB_sync\t\t\t    SIGNALED\n\tuse ARB_sync\t\t\t    ALREADY_SIGNALED\n\tuse ARB_sync\t\t\t    TIMEOUT_EXPIRED\n\tuse ARB_sync\t\t\t    CONDITION_SATISFIED\n\tuse ARB_sync\t\t\t    WAIT_FAILED\n\tuse ARB_sync\t\t\t    TIMEOUT_IGNORED\n\tuse ARB_sync\t\t\t    SYNC_FLUSH_COMMANDS_BIT\n\tuse ARB_sync\t\t\t    TIMEOUT_IGNORED\npassthru: /* Reuse tokens from ARB_texture_multisample */\n\tuse ARB_texture_multisample\t    SAMPLE_POSITION\n\tuse ARB_texture_multisample\t    SAMPLE_MASK\n\tuse ARB_texture_multisample\t    SAMPLE_MASK_VALUE\n\tuse ARB_texture_multisample\t    MAX_SAMPLE_MASK_WORDS\n\tuse ARB_texture_multisample\t    TEXTURE_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    PROXY_TEXTURE_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    TEXTURE_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    TEXTURE_BINDING_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    TEXTURE_SAMPLES\n\tuse ARB_texture_multisample\t    TEXTURE_FIXED_SAMPLE_LOCATIONS\n\tuse ARB_texture_multisample\t    SAMPLER_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    INT_SAMPLER_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE\n\tuse ARB_texture_multisample\t    SAMPLER_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    INT_SAMPLER_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY\n\tuse ARB_texture_multisample\t    MAX_COLOR_TEXTURE_SAMPLES\n\tuse ARB_texture_multisample\t    MAX_DEPTH_TEXTURE_SAMPLES\n\tuse ARB_texture_multisample\t    MAX_INTEGER_SAMPLES\npassthru: /* Don't need to reuse tokens from ARB_vertex_array_bgra since they're already in 1.2 core */\n\n###############################################################################\n#\n# OpenGL 3.3 enums\n#\n###############################################################################\n\nVERSION_3_3 enum:\npassthru: /* Reuse tokens from ARB_blend_func_extended */\n\tuse ARB_blend_func_extended\t    SRC1_COLOR\n\tuse ARB_blend_func_extended\t    ONE_MINUS_SRC1_COLOR\n\tuse ARB_blend_func_extended\t    ONE_MINUS_SRC1_ALPHA\n\tuse ARB_blend_func_extended\t    MAX_DUAL_SOURCE_DRAW_BUFFERS\npassthru: /* Would reuse tokens from ARB_explicit_attrib_location, but it has none */\npassthru: /* Reuse tokens from ARB_occlusion_query2 */\n\tuse ARB_occlusion_query2\t    ANY_SAMPLES_PASSED\npassthru: /* Reuse tokens from ARB_sampler_objects */\n\tuse ARB_sampler_objects\t\t    SAMPLER_BINDING\npassthru: /* Would reuse tokens from ARB_shader_bit_encoding, but it has none */\npassthru: /* Reuse tokens from ARB_texture_rgb10_a2ui */\n\tuse ARB_texture_rgb10_a2ui\t    RGB10_A2UI\npassthru: /* Reuse tokens from ARB_texture_swizzle */\n\tuse ARB_texture_swizzle\t\t    TEXTURE_SWIZZLE_R\n\tuse ARB_texture_swizzle\t\t    TEXTURE_SWIZZLE_G\n\tuse ARB_texture_swizzle\t\t    TEXTURE_SWIZZLE_B\n\tuse ARB_texture_swizzle\t\t    TEXTURE_SWIZZLE_A\n\tuse ARB_texture_swizzle\t\t    TEXTURE_SWIZZLE_RGBA\npassthru: /* Reuse tokens from ARB_timer_query */\n\tuse ARB_timer_query\t\t    TIME_ELAPSED\n\tuse ARB_timer_query\t\t    TIMESTAMP\npassthru: /* Reuse tokens from ARB_vertex_type_2_10_10_10_rev */\n\tuse ARB_vertex_type_2_10_10_10_rev  INT_2_10_10_10_REV\n\n###############################################################################\n#\n# OpenGL 4.0 enums\n#\n###############################################################################\n\nVERSION_4_0 enum:\npassthru: /* Reuse tokens from ARB_draw_indirect */\n\tuse ARB_draw_indirect\t\t    DRAW_INDIRECT_BUFFER\n\tuse ARB_draw_indirect\t\t    DRAW_INDIRECT_BUFFER_BINDING\npassthru: /* Reuse tokens from ARB_gpu_shader5 */\n\tuse ARB_gpu_shader5\t\t    GEOMETRY_SHADER_INVOCATIONS\n\tuse ARB_gpu_shader5\t\t    MAX_GEOMETRY_SHADER_INVOCATIONS\n\tuse ARB_gpu_shader5\t\t    MIN_FRAGMENT_INTERPOLATION_OFFSET\n\tuse ARB_gpu_shader5\t\t    MAX_FRAGMENT_INTERPOLATION_OFFSET\n\tuse ARB_gpu_shader5\t\t    FRAGMENT_INTERPOLATION_OFFSET_BITS\n\tuse ARB_gpu_shader5\t\t    MAX_VERTEX_STREAMS\npassthru: /* Reuse tokens from ARB_gpu_shader_fp64 */\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_VEC2\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_VEC3\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_VEC4\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_MAT2\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_MAT3\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_MAT4\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_MAT2x3\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_MAT2x4\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_MAT3x2\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_MAT3x4\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_MAT4x2\n\tuse ARB_gpu_shader_fp64\t\t    DOUBLE_MAT4x3\npassthru: /* Reuse tokens from ARB_shader_subroutine */\n\tuse ARB_shader_subroutine\t    ACTIVE_SUBROUTINES\n\tuse ARB_shader_subroutine\t    ACTIVE_SUBROUTINE_UNIFORMS\n\tuse ARB_shader_subroutine\t    ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS\n\tuse ARB_shader_subroutine\t    ACTIVE_SUBROUTINE_MAX_LENGTH\n\tuse ARB_shader_subroutine\t    ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH\n\tuse ARB_shader_subroutine\t    MAX_SUBROUTINES\n\tuse ARB_shader_subroutine\t    MAX_SUBROUTINE_UNIFORM_LOCATIONS\n\tuse ARB_shader_subroutine\t    NUM_COMPATIBLE_SUBROUTINES\n\tuse ARB_shader_subroutine\t    COMPATIBLE_SUBROUTINES\npassthru: /* Reuse tokens from ARB_tessellation_shader */\n\tuse ARB_tessellation_shader\t    PATCHES\n\tuse ARB_tessellation_shader\t    PATCH_VERTICES\n\tuse ARB_tessellation_shader\t    PATCH_DEFAULT_INNER_LEVEL\n\tuse ARB_tessellation_shader\t    PATCH_DEFAULT_OUTER_LEVEL\n\tuse ARB_tessellation_shader\t    TESS_CONTROL_OUTPUT_VERTICES\n\tuse ARB_tessellation_shader\t    TESS_GEN_MODE\n\tuse ARB_tessellation_shader\t    TESS_GEN_SPACING\n\tuse ARB_tessellation_shader\t    TESS_GEN_VERTEX_ORDER\n\tuse ARB_tessellation_shader\t    TESS_GEN_POINT_MODE\n\tuse ARB_tessellation_shader\t    ISOLINES\n\tuse ARB_tessellation_shader\t    FRACTIONAL_ODD\n\tuse ARB_tessellation_shader\t    FRACTIONAL_EVEN\n\tuse ARB_tessellation_shader\t    MAX_PATCH_VERTICES\n\tuse ARB_tessellation_shader\t    MAX_TESS_GEN_LEVEL\n\tuse ARB_tessellation_shader\t    MAX_TESS_CONTROL_UNIFORM_COMPONENTS\n\tuse ARB_tessellation_shader\t    MAX_TESS_EVALUATION_UNIFORM_COMPONENTS\n\tuse ARB_tessellation_shader\t    MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS\n\tuse ARB_tessellation_shader\t    MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS\n\tuse ARB_tessellation_shader\t    MAX_TESS_CONTROL_OUTPUT_COMPONENTS\n\tuse ARB_tessellation_shader\t    MAX_TESS_PATCH_COMPONENTS\n\tuse ARB_tessellation_shader\t    MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS\n\tuse ARB_tessellation_shader\t    MAX_TESS_EVALUATION_OUTPUT_COMPONENTS\n\tuse ARB_tessellation_shader\t    MAX_TESS_CONTROL_UNIFORM_BLOCKS\n\tuse ARB_tessellation_shader\t    MAX_TESS_EVALUATION_UNIFORM_BLOCKS\n\tuse ARB_tessellation_shader\t    MAX_TESS_CONTROL_INPUT_COMPONENTS\n\tuse ARB_tessellation_shader\t    MAX_TESS_EVALUATION_INPUT_COMPONENTS\n\tuse ARB_tessellation_shader\t    MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS\n\tuse ARB_tessellation_shader\t    MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS\n\tuse ARB_tessellation_shader\t    UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER\n\tuse ARB_tessellation_shader\t    UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER\n\tuse ARB_tessellation_shader\t    TESS_EVALUATION_SHADER\n\tuse ARB_tessellation_shader\t    TESS_CONTROL_SHADER\npassthru: /* Would reuse tokens from ARB_texture_buffer_object_rgb32, but it has none */\npassthru: /* Reuse tokens from ARB_transform_feedback2 */\n\tuse ARB_tessellation_shader\t    TRANSFORM_FEEDBACK\n\tuse ARB_tessellation_shader\t    TRANSFORM_FEEDBACK_BUFFER_PAUSED\n\tuse ARB_tessellation_shader\t    TRANSFORM_FEEDBACK_BUFFER_ACTIVE\n\tuse ARB_tessellation_shader\t    TRANSFORM_FEEDBACK_BINDING\npassthru: /* Reuse tokens from ARB_transform_feedback3 */\n\tuse ARB_tessellation_shader\t    MAX_TRANSFORM_FEEDBACK_BUFFERS\n\tuse ARB_tessellation_shader\t    MAX_VERTEX_STREAMS\n\n\n###############################################################################\n#\n# ARB extensions, in ARB extension order\n#\n###############################################################################\n\n###############################################################################\n\n# ARB Extension #1\nARB_multitexture enum:\n\tTEXTURE0_ARB\t\t\t\t\t= 0x84C0\n\tTEXTURE1_ARB\t\t\t\t\t= 0x84C1\n\tTEXTURE2_ARB\t\t\t\t\t= 0x84C2\n\tTEXTURE3_ARB\t\t\t\t\t= 0x84C3\n\tTEXTURE4_ARB\t\t\t\t\t= 0x84C4\n\tTEXTURE5_ARB\t\t\t\t\t= 0x84C5\n\tTEXTURE6_ARB\t\t\t\t\t= 0x84C6\n\tTEXTURE7_ARB\t\t\t\t\t= 0x84C7\n\tTEXTURE8_ARB\t\t\t\t\t= 0x84C8\n\tTEXTURE9_ARB\t\t\t\t\t= 0x84C9\n\tTEXTURE10_ARB\t\t\t\t\t= 0x84CA\n\tTEXTURE11_ARB\t\t\t\t\t= 0x84CB\n\tTEXTURE12_ARB\t\t\t\t\t= 0x84CC\n\tTEXTURE13_ARB\t\t\t\t\t= 0x84CD\n\tTEXTURE14_ARB\t\t\t\t\t= 0x84CE\n\tTEXTURE15_ARB\t\t\t\t\t= 0x84CF\n\tTEXTURE16_ARB\t\t\t\t\t= 0x84D0\n\tTEXTURE17_ARB\t\t\t\t\t= 0x84D1\n\tTEXTURE18_ARB\t\t\t\t\t= 0x84D2\n\tTEXTURE19_ARB\t\t\t\t\t= 0x84D3\n\tTEXTURE20_ARB\t\t\t\t\t= 0x84D4\n\tTEXTURE21_ARB\t\t\t\t\t= 0x84D5\n\tTEXTURE22_ARB\t\t\t\t\t= 0x84D6\n\tTEXTURE23_ARB\t\t\t\t\t= 0x84D7\n\tTEXTURE24_ARB\t\t\t\t\t= 0x84D8\n\tTEXTURE25_ARB\t\t\t\t\t= 0x84D9\n\tTEXTURE26_ARB\t\t\t\t\t= 0x84DA\n\tTEXTURE27_ARB\t\t\t\t\t= 0x84DB\n\tTEXTURE28_ARB\t\t\t\t\t= 0x84DC\n\tTEXTURE29_ARB\t\t\t\t\t= 0x84DD\n\tTEXTURE30_ARB\t\t\t\t\t= 0x84DE\n\tTEXTURE31_ARB\t\t\t\t\t= 0x84DF\n\tACTIVE_TEXTURE_ARB\t\t\t\t= 0x84E0 # 1 I\n\tCLIENT_ACTIVE_TEXTURE_ARB\t\t\t= 0x84E1 # 1 I\n\tMAX_TEXTURE_UNITS_ARB\t\t\t\t= 0x84E2 # 1 I\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #2 - GLX_ARB_get_proc_address\n\n###############################################################################\n\n# ARB Extension #3\nARB_transpose_matrix enum:\n\tTRANSPOSE_MODELVIEW_MATRIX_ARB\t\t\t= 0x84E3 # 16 F\n\tTRANSPOSE_PROJECTION_MATRIX_ARB\t\t\t= 0x84E4 # 16 F\n\tTRANSPOSE_TEXTURE_MATRIX_ARB\t\t\t= 0x84E5 # 16 F\n\tTRANSPOSE_COLOR_MATRIX_ARB\t\t\t= 0x84E6 # 16 F\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #4 - WGL_ARB_buffer_region\n\n###############################################################################\n\n# ARB Extension #5\nARB_multisample enum:\n\tMULTISAMPLE_ARB\t\t\t\t\t= 0x809D\n\tSAMPLE_ALPHA_TO_COVERAGE_ARB\t\t\t= 0x809E\n\tSAMPLE_ALPHA_TO_ONE_ARB\t\t\t\t= 0x809F\n\tSAMPLE_COVERAGE_ARB\t\t\t\t= 0x80A0\n\tSAMPLE_BUFFERS_ARB\t\t\t\t= 0x80A8\n\tSAMPLES_ARB\t\t\t\t\t= 0x80A9\n\tSAMPLE_COVERAGE_VALUE_ARB\t\t\t= 0x80AA\n\tSAMPLE_COVERAGE_INVERT_ARB\t\t\t= 0x80AB\n\tMULTISAMPLE_BIT_ARB\t\t\t\t= 0x20000000\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #6\nARB_texture_env_add enum:\n\n###############################################################################\n\n# ARB Extension #7\nARB_texture_cube_map enum:\n\tNORMAL_MAP_ARB\t\t\t\t\t= 0x8511\n\tREFLECTION_MAP_ARB\t\t\t\t= 0x8512\n\tTEXTURE_CUBE_MAP_ARB\t\t\t\t= 0x8513\n\tTEXTURE_BINDING_CUBE_MAP_ARB\t\t\t= 0x8514\n\tTEXTURE_CUBE_MAP_POSITIVE_X_ARB\t\t\t= 0x8515\n\tTEXTURE_CUBE_MAP_NEGATIVE_X_ARB\t\t\t= 0x8516\n\tTEXTURE_CUBE_MAP_POSITIVE_Y_ARB\t\t\t= 0x8517\n\tTEXTURE_CUBE_MAP_NEGATIVE_Y_ARB\t\t\t= 0x8518\n\tTEXTURE_CUBE_MAP_POSITIVE_Z_ARB\t\t\t= 0x8519\n\tTEXTURE_CUBE_MAP_NEGATIVE_Z_ARB\t\t\t= 0x851A\n\tPROXY_TEXTURE_CUBE_MAP_ARB\t\t\t= 0x851B\n\tMAX_CUBE_MAP_TEXTURE_SIZE_ARB\t\t\t= 0x851C\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #8 - WGL_ARB_extensions_string\n# ARB Extension #9 - WGL_ARB_pixel_format\n# ARB Extension #10 - WGL_ARB_make_current_read\n# ARB Extension #11 - WGL_ARB_pbuffer\n\n###############################################################################\n\n# ARB Extension #12\nARB_texture_compression enum:\n\tCOMPRESSED_ALPHA_ARB\t\t\t\t= 0x84E9\n\tCOMPRESSED_LUMINANCE_ARB\t\t\t= 0x84EA\n\tCOMPRESSED_LUMINANCE_ALPHA_ARB\t\t\t= 0x84EB\n\tCOMPRESSED_INTENSITY_ARB\t\t\t= 0x84EC\n\tCOMPRESSED_RGB_ARB\t\t\t\t= 0x84ED\n\tCOMPRESSED_RGBA_ARB\t\t\t\t= 0x84EE\n\tTEXTURE_COMPRESSION_HINT_ARB\t\t\t= 0x84EF\n\tTEXTURE_COMPRESSED_IMAGE_SIZE_ARB\t\t= 0x86A0\n\tTEXTURE_COMPRESSED_ARB\t\t\t\t= 0x86A1\n\tNUM_COMPRESSED_TEXTURE_FORMATS_ARB\t\t= 0x86A2\n\tCOMPRESSED_TEXTURE_FORMATS_ARB\t\t\t= 0x86A3\n\n###############################################################################\n\n# ARB Extension #13\n# Promoted from #36 SGIS_texture_border_clamp\nARB_texture_border_clamp enum:\n\tCLAMP_TO_BORDER_ARB\t\t\t\t= 0x812D\n\n###############################################################################\n\n# ARB Extension #14 - promoted from #54 EXT_point_parameters\n# Promoted from #54 {SGIS,EXT}_point_parameters\nARB_point_parameters enum:\n\tPOINT_SIZE_MIN_ARB\t\t\t\t= 0x8126 # 1 F\n\tPOINT_SIZE_MAX_ARB\t\t\t\t= 0x8127 # 1 F\n\tPOINT_FADE_THRESHOLD_SIZE_ARB\t\t\t= 0x8128 # 1 F\n\tPOINT_DISTANCE_ATTENUATION_ARB\t\t\t= 0x8129 # 3 F\n\n###############################################################################\n\n# ARB Extension #15\nARB_vertex_blend enum:\n\tMAX_VERTEX_UNITS_ARB\t\t\t\t= 0x86A4\n\tACTIVE_VERTEX_UNITS_ARB\t\t\t\t= 0x86A5\n\tWEIGHT_SUM_UNITY_ARB\t\t\t\t= 0x86A6\n\tVERTEX_BLEND_ARB\t\t\t\t= 0x86A7\n\tCURRENT_WEIGHT_ARB\t\t\t\t= 0x86A8\n\tWEIGHT_ARRAY_TYPE_ARB\t\t\t\t= 0x86A9\n\tWEIGHT_ARRAY_STRIDE_ARB\t\t\t\t= 0x86AA\n\tWEIGHT_ARRAY_SIZE_ARB\t\t\t\t= 0x86AB\n\tWEIGHT_ARRAY_POINTER_ARB\t\t\t= 0x86AC\n\tWEIGHT_ARRAY_ARB\t\t\t\t= 0x86AD\n\tMODELVIEW0_ARB\t\t\t\t\t= 0x1700\n\tMODELVIEW1_ARB\t\t\t\t\t= 0x850A\n\tMODELVIEW2_ARB\t\t\t\t\t= 0x8722\n\tMODELVIEW3_ARB\t\t\t\t\t= 0x8723\n\tMODELVIEW4_ARB\t\t\t\t\t= 0x8724\n\tMODELVIEW5_ARB\t\t\t\t\t= 0x8725\n\tMODELVIEW6_ARB\t\t\t\t\t= 0x8726\n\tMODELVIEW7_ARB\t\t\t\t\t= 0x8727\n\tMODELVIEW8_ARB\t\t\t\t\t= 0x8728\n\tMODELVIEW9_ARB\t\t\t\t\t= 0x8729\n\tMODELVIEW10_ARB\t\t\t\t\t= 0x872A\n\tMODELVIEW11_ARB\t\t\t\t\t= 0x872B\n\tMODELVIEW12_ARB\t\t\t\t\t= 0x872C\n\tMODELVIEW13_ARB\t\t\t\t\t= 0x872D\n\tMODELVIEW14_ARB\t\t\t\t\t= 0x872E\n\tMODELVIEW15_ARB\t\t\t\t\t= 0x872F\n\tMODELVIEW16_ARB\t\t\t\t\t= 0x8730\n\tMODELVIEW17_ARB\t\t\t\t\t= 0x8731\n\tMODELVIEW18_ARB\t\t\t\t\t= 0x8732\n\tMODELVIEW19_ARB\t\t\t\t\t= 0x8733\n\tMODELVIEW20_ARB\t\t\t\t\t= 0x8734\n\tMODELVIEW21_ARB\t\t\t\t\t= 0x8735\n\tMODELVIEW22_ARB\t\t\t\t\t= 0x8736\n\tMODELVIEW23_ARB\t\t\t\t\t= 0x8737\n\tMODELVIEW24_ARB\t\t\t\t\t= 0x8738\n\tMODELVIEW25_ARB\t\t\t\t\t= 0x8739\n\tMODELVIEW26_ARB\t\t\t\t\t= 0x873A\n\tMODELVIEW27_ARB\t\t\t\t\t= 0x873B\n\tMODELVIEW28_ARB\t\t\t\t\t= 0x873C\n\tMODELVIEW29_ARB\t\t\t\t\t= 0x873D\n\tMODELVIEW30_ARB\t\t\t\t\t= 0x873E\n\tMODELVIEW31_ARB\t\t\t\t\t= 0x873F\n\n###############################################################################\n\n# ARB Extension #16\nARB_matrix_palette enum:\n\tMATRIX_PALETTE_ARB\t\t\t\t= 0x8840\n\tMAX_MATRIX_PALETTE_STACK_DEPTH_ARB\t\t= 0x8841\n\tMAX_PALETTE_MATRICES_ARB\t\t\t= 0x8842\n\tCURRENT_PALETTE_MATRIX_ARB\t\t\t= 0x8843\n\tMATRIX_INDEX_ARRAY_ARB\t\t\t\t= 0x8844\n\tCURRENT_MATRIX_INDEX_ARB\t\t\t= 0x8845\n\tMATRIX_INDEX_ARRAY_SIZE_ARB\t\t\t= 0x8846\n\tMATRIX_INDEX_ARRAY_TYPE_ARB\t\t\t= 0x8847\n\tMATRIX_INDEX_ARRAY_STRIDE_ARB\t\t\t= 0x8848\n\tMATRIX_INDEX_ARRAY_POINTER_ARB\t\t\t= 0x8849\n\n###############################################################################\n\n# ARB Extension #17\n# Shares enum values with EXT_texture_env_combine\nARB_texture_env_combine enum:\n\tCOMBINE_ARB\t\t\t\t\t= 0x8570\n\tCOMBINE_RGB_ARB\t\t\t\t\t= 0x8571\n\tCOMBINE_ALPHA_ARB\t\t\t\t= 0x8572\n\tSOURCE0_RGB_ARB\t\t\t\t\t= 0x8580\n\tSOURCE1_RGB_ARB\t\t\t\t\t= 0x8581\n\tSOURCE2_RGB_ARB\t\t\t\t\t= 0x8582\n\tSOURCE0_ALPHA_ARB\t\t\t\t= 0x8588\n\tSOURCE1_ALPHA_ARB\t\t\t\t= 0x8589\n\tSOURCE2_ALPHA_ARB\t\t\t\t= 0x858A\n\tOPERAND0_RGB_ARB\t\t\t\t= 0x8590\n\tOPERAND1_RGB_ARB\t\t\t\t= 0x8591\n\tOPERAND2_RGB_ARB\t\t\t\t= 0x8592\n\tOPERAND0_ALPHA_ARB\t\t\t\t= 0x8598\n\tOPERAND1_ALPHA_ARB\t\t\t\t= 0x8599\n\tOPERAND2_ALPHA_ARB\t\t\t\t= 0x859A\n\tRGB_SCALE_ARB\t\t\t\t\t= 0x8573\n\tADD_SIGNED_ARB\t\t\t\t\t= 0x8574\n\tINTERPOLATE_ARB\t\t\t\t\t= 0x8575\n\tSUBTRACT_ARB\t\t\t\t\t= 0x84E7\n\tCONSTANT_ARB\t\t\t\t\t= 0x8576\n\tPRIMARY_COLOR_ARB\t\t\t\t= 0x8577\n\tPREVIOUS_ARB\t\t\t\t\t= 0x8578\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #18\nARB_texture_env_crossbar enum:\n\n###############################################################################\n\n# ARB Extension #19\n# Promoted from #220 EXT_texture_env_dot3; enum values changed\nARB_texture_env_dot3 enum:\n\tDOT3_RGB_ARB\t\t\t\t\t= 0x86AE\n\tDOT3_RGBA_ARB\t\t\t\t\t= 0x86AF\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #20 - WGL_ARB_render_texture\n\n###############################################################################\n\n# ARB Extension #21\nARB_texture_mirrored_repeat enum:\n\tMIRRORED_REPEAT_ARB\t\t\t\t= 0x8370\n\n###############################################################################\n\n# ARB Extension #22\nARB_depth_texture enum:\n\tDEPTH_COMPONENT16_ARB\t\t\t\t= 0x81A5\n\tDEPTH_COMPONENT24_ARB\t\t\t\t= 0x81A6\n\tDEPTH_COMPONENT32_ARB\t\t\t\t= 0x81A7\n\tTEXTURE_DEPTH_SIZE_ARB\t\t\t\t= 0x884A\n\tDEPTH_TEXTURE_MODE_ARB\t\t\t\t= 0x884B\n\n###############################################################################\n\n# ARB Extension #23\nARB_shadow enum:\n       TEXTURE_COMPARE_MODE_ARB\t\t\t\t= 0x884C\n       TEXTURE_COMPARE_FUNC_ARB\t\t\t\t= 0x884D\n       COMPARE_R_TO_TEXTURE_ARB\t\t\t\t= 0x884E\n\n###############################################################################\n\n# ARB Extension #24\nARB_shadow_ambient enum:\n\tTEXTURE_COMPARE_FAIL_VALUE_ARB\t\t\t= 0x80BF\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #25\nARB_window_pos enum:\n\n###############################################################################\n\n# ARB Extension #26\n# ARB_vertex_program enums are shared by ARB_fragment_program are so marked.\n# Unfortunately, PROGRAM_BINDING_ARB does accidentally reuse 0x8677 -\n#   this was a spec editing typo that's now uncorrectable.\nARB_vertex_program enum:\n\tCOLOR_SUM_ARB\t\t\t\t\t= 0x8458\n\tVERTEX_PROGRAM_ARB\t\t\t\t= 0x8620\n\tVERTEX_ATTRIB_ARRAY_ENABLED_ARB\t\t\t= 0x8622\n\tVERTEX_ATTRIB_ARRAY_SIZE_ARB\t\t\t= 0x8623\n\tVERTEX_ATTRIB_ARRAY_STRIDE_ARB\t\t\t= 0x8624\n\tVERTEX_ATTRIB_ARRAY_TYPE_ARB\t\t\t= 0x8625\n\tCURRENT_VERTEX_ATTRIB_ARB\t\t\t= 0x8626\n\tPROGRAM_LENGTH_ARB\t\t\t\t= 0x8627    # shared\n\tPROGRAM_STRING_ARB\t\t\t\t= 0x8628    # shared\n\tMAX_PROGRAM_MATRIX_STACK_DEPTH_ARB\t\t= 0x862E    # shared\n\tMAX_PROGRAM_MATRICES_ARB\t\t\t= 0x862F    # shared\n\tCURRENT_MATRIX_STACK_DEPTH_ARB\t\t\t= 0x8640    # shared\n\tCURRENT_MATRIX_ARB\t\t\t\t= 0x8641    # shared\n\tVERTEX_PROGRAM_POINT_SIZE_ARB\t\t\t= 0x8642\n\tVERTEX_PROGRAM_TWO_SIDE_ARB\t\t\t= 0x8643\n\tVERTEX_ATTRIB_ARRAY_POINTER_ARB\t\t\t= 0x8645\n\tPROGRAM_ERROR_POSITION_ARB\t\t\t= 0x864B    # shared\n\tPROGRAM_BINDING_ARB\t\t\t\t= 0x8677    # shared\n\tMAX_VERTEX_ATTRIBS_ARB\t\t\t\t= 0x8869\n\tVERTEX_ATTRIB_ARRAY_NORMALIZED_ARB\t\t= 0x886A\n\tPROGRAM_ERROR_STRING_ARB\t\t\t= 0x8874    # shared\n\tPROGRAM_FORMAT_ASCII_ARB\t\t\t= 0x8875    # shared\n\tPROGRAM_FORMAT_ARB\t\t\t\t= 0x8876    # shared\n\tPROGRAM_INSTRUCTIONS_ARB\t\t\t= 0x88A0    # shared\n\tMAX_PROGRAM_INSTRUCTIONS_ARB\t\t\t= 0x88A1    # shared\n\tPROGRAM_NATIVE_INSTRUCTIONS_ARB\t\t\t= 0x88A2    # shared\n\tMAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB\t\t= 0x88A3    # shared\n\tPROGRAM_TEMPORARIES_ARB\t\t\t\t= 0x88A4    # shared\n\tMAX_PROGRAM_TEMPORARIES_ARB\t\t\t= 0x88A5    # shared\n\tPROGRAM_NATIVE_TEMPORARIES_ARB\t\t\t= 0x88A6    # shared\n\tMAX_PROGRAM_NATIVE_TEMPORARIES_ARB\t\t= 0x88A7    # shared\n\tPROGRAM_PARAMETERS_ARB\t\t\t\t= 0x88A8    # shared\n\tMAX_PROGRAM_PARAMETERS_ARB\t\t\t= 0x88A9    # shared\n\tPROGRAM_NATIVE_PARAMETERS_ARB\t\t\t= 0x88AA    # shared\n\tMAX_PROGRAM_NATIVE_PARAMETERS_ARB\t\t= 0x88AB    # shared\n\tPROGRAM_ATTRIBS_ARB\t\t\t\t= 0x88AC    # shared\n\tMAX_PROGRAM_ATTRIBS_ARB\t\t\t\t= 0x88AD    # shared\n\tPROGRAM_NATIVE_ATTRIBS_ARB\t\t\t= 0x88AE    # shared\n\tMAX_PROGRAM_NATIVE_ATTRIBS_ARB\t\t\t= 0x88AF    # shared\n\tPROGRAM_ADDRESS_REGISTERS_ARB\t\t\t= 0x88B0    # shared\n\tMAX_PROGRAM_ADDRESS_REGISTERS_ARB\t\t= 0x88B1    # shared\n\tPROGRAM_NATIVE_ADDRESS_REGISTERS_ARB\t\t= 0x88B2    # shared\n\tMAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB\t= 0x88B3    # shared\n\tMAX_PROGRAM_LOCAL_PARAMETERS_ARB\t\t= 0x88B4    # shared\n\tMAX_PROGRAM_ENV_PARAMETERS_ARB\t\t\t= 0x88B5    # shared\n\tPROGRAM_UNDER_NATIVE_LIMITS_ARB\t\t\t= 0x88B6    # shared\n\tTRANSPOSE_CURRENT_MATRIX_ARB\t\t\t= 0x88B7    # shared\n\tMATRIX0_ARB\t\t\t\t\t= 0x88C0    # shared\n\tMATRIX1_ARB\t\t\t\t\t= 0x88C1    # shared\n\tMATRIX2_ARB\t\t\t\t\t= 0x88C2    # shared\n\tMATRIX3_ARB\t\t\t\t\t= 0x88C3    # shared\n\tMATRIX4_ARB\t\t\t\t\t= 0x88C4    # shared\n\tMATRIX5_ARB\t\t\t\t\t= 0x88C5    # shared\n\tMATRIX6_ARB\t\t\t\t\t= 0x88C6    # shared\n\tMATRIX7_ARB\t\t\t\t\t= 0x88C7    # shared\n\tMATRIX8_ARB\t\t\t\t\t= 0x88C8    # shared\n\tMATRIX9_ARB\t\t\t\t\t= 0x88C9    # shared\n\tMATRIX10_ARB\t\t\t\t\t= 0x88CA    # shared\n\tMATRIX11_ARB\t\t\t\t\t= 0x88CB    # shared\n\tMATRIX12_ARB\t\t\t\t\t= 0x88CC    # shared\n\tMATRIX13_ARB\t\t\t\t\t= 0x88CD    # shared\n\tMATRIX14_ARB\t\t\t\t\t= 0x88CE    # shared\n\tMATRIX15_ARB\t\t\t\t\t= 0x88CF    # shared\n\tMATRIX16_ARB\t\t\t\t\t= 0x88D0    # shared\n\tMATRIX17_ARB\t\t\t\t\t= 0x88D1    # shared\n\tMATRIX18_ARB\t\t\t\t\t= 0x88D2    # shared\n\tMATRIX19_ARB\t\t\t\t\t= 0x88D3    # shared\n\tMATRIX20_ARB\t\t\t\t\t= 0x88D4    # shared\n\tMATRIX21_ARB\t\t\t\t\t= 0x88D5    # shared\n\tMATRIX22_ARB\t\t\t\t\t= 0x88D6    # shared\n\tMATRIX23_ARB\t\t\t\t\t= 0x88D7    # shared\n\tMATRIX24_ARB\t\t\t\t\t= 0x88D8    # shared\n\tMATRIX25_ARB\t\t\t\t\t= 0x88D9    # shared\n\tMATRIX26_ARB\t\t\t\t\t= 0x88DA    # shared\n\tMATRIX27_ARB\t\t\t\t\t= 0x88DB    # shared\n\tMATRIX28_ARB\t\t\t\t\t= 0x88DC    # shared\n\tMATRIX29_ARB\t\t\t\t\t= 0x88DD    # shared\n\tMATRIX30_ARB\t\t\t\t\t= 0x88DE    # shared\n\tMATRIX31_ARB\t\t\t\t\t= 0x88DF    # shared\n\n###############################################################################\n\n# ARB Extension #27\n# Some ARB_fragment_program enums are shared with ARB_vertex_program,\n#   and are only included in that #define block, for now.\nARB_fragment_program enum:\n#\tPROGRAM_LENGTH_ARB\t\t\t\t= 0x8627    # shared\n#\tPROGRAM_STRING_ARB\t\t\t\t= 0x8628    # shared\n#\tMAX_PROGRAM_MATRIX_STACK_DEPTH_ARB\t\t= 0x862E    # shared\n#\tMAX_PROGRAM_MATRICES_ARB\t\t\t= 0x862F    # shared\n#\tCURRENT_MATRIX_STACK_DEPTH_ARB\t\t\t= 0x8640    # shared\n#\tCURRENT_MATRIX_ARB\t\t\t\t= 0x8641    # shared\n#\tPROGRAM_ERROR_POSITION_ARB\t\t\t= 0x864B    # shared\n#\tPROGRAM_BINDING_ARB\t\t\t\t= 0x8677    # shared\n\tFRAGMENT_PROGRAM_ARB\t\t\t\t= 0x8804\n\tPROGRAM_ALU_INSTRUCTIONS_ARB\t\t\t= 0x8805\n\tPROGRAM_TEX_INSTRUCTIONS_ARB\t\t\t= 0x8806\n\tPROGRAM_TEX_INDIRECTIONS_ARB\t\t\t= 0x8807\n\tPROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB\t\t= 0x8808\n\tPROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB\t\t= 0x8809\n\tPROGRAM_NATIVE_TEX_INDIRECTIONS_ARB\t\t= 0x880A\n\tMAX_PROGRAM_ALU_INSTRUCTIONS_ARB\t\t= 0x880B\n\tMAX_PROGRAM_TEX_INSTRUCTIONS_ARB\t\t= 0x880C\n\tMAX_PROGRAM_TEX_INDIRECTIONS_ARB\t\t= 0x880D\n\tMAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB\t\t= 0x880E\n\tMAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB\t\t= 0x880F\n\tMAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB\t\t= 0x8810\n\tMAX_TEXTURE_COORDS_ARB\t\t\t\t= 0x8871\n\tMAX_TEXTURE_IMAGE_UNITS_ARB\t\t\t= 0x8872\n#\tPROGRAM_ERROR_STRING_ARB\t\t\t= 0x8874    # shared\n#\tPROGRAM_FORMAT_ASCII_ARB\t\t\t= 0x8875    # shared\n#\tPROGRAM_FORMAT_ARB\t\t\t\t= 0x8876    # shared\n#\tPROGRAM_INSTRUCTIONS_ARB\t\t\t= 0x88A0    # shared\n#\tMAX_PROGRAM_INSTRUCTIONS_ARB\t\t\t= 0x88A1    # shared\n#\tPROGRAM_NATIVE_INSTRUCTIONS_ARB\t\t\t= 0x88A2    # shared\n#\tMAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB\t\t= 0x88A3    # shared\n#\tPROGRAM_TEMPORARIES_ARB\t\t\t\t= 0x88A4    # shared\n#\tMAX_PROGRAM_TEMPORARIES_ARB\t\t\t= 0x88A5    # shared\n#\tPROGRAM_NATIVE_TEMPORARIES_ARB\t\t\t= 0x88A6    # shared\n#\tMAX_PROGRAM_NATIVE_TEMPORARIES_ARB\t\t= 0x88A7    # shared\n#\tPROGRAM_PARAMETERS_ARB\t\t\t\t= 0x88A8    # shared\n#\tMAX_PROGRAM_PARAMETERS_ARB\t\t\t= 0x88A9    # shared\n#\tPROGRAM_NATIVE_PARAMETERS_ARB\t\t\t= 0x88AA    # shared\n#\tMAX_PROGRAM_NATIVE_PARAMETERS_ARB\t\t= 0x88AB    # shared\n#\tPROGRAM_ATTRIBS_ARB\t\t\t\t= 0x88AC    # shared\n#\tMAX_PROGRAM_ATTRIBS_ARB\t\t\t\t= 0x88AD    # shared\n#\tPROGRAM_NATIVE_ATTRIBS_ARB\t\t\t= 0x88AE    # shared\n#\tMAX_PROGRAM_NATIVE_ATTRIBS_ARB\t\t\t= 0x88AF    # shared\n#\tPROGRAM_ADDRESS_REGISTERS_ARB\t\t\t= 0x88B0    # shared\n#\tMAX_PROGRAM_ADDRESS_REGISTERS_ARB\t\t= 0x88B1    # shared\n#\tPROGRAM_NATIVE_ADDRESS_REGISTERS_ARB\t\t= 0x88B2    # shared\n#\tMAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB\t= 0x88B3    # shared\n#\tMAX_PROGRAM_LOCAL_PARAMETERS_ARB\t\t= 0x88B4    # shared\n#\tMAX_PROGRAM_ENV_PARAMETERS_ARB\t\t\t= 0x88B5    # shared\n#\tPROGRAM_UNDER_NATIVE_LIMITS_ARB\t\t\t= 0x88B6    # shared\n#\tTRANSPOSE_CURRENT_MATRIX_ARB\t\t\t= 0x88B7    # shared\n#\tMATRIX0_ARB\t\t\t\t\t= 0x88C0    # shared\n#\tMATRIX1_ARB\t\t\t\t\t= 0x88C1    # shared\n#\tMATRIX2_ARB\t\t\t\t\t= 0x88C2    # shared\n#\tMATRIX3_ARB\t\t\t\t\t= 0x88C3    # shared\n#\tMATRIX4_ARB\t\t\t\t\t= 0x88C4    # shared\n#\tMATRIX5_ARB\t\t\t\t\t= 0x88C5    # shared\n#\tMATRIX6_ARB\t\t\t\t\t= 0x88C6    # shared\n#\tMATRIX7_ARB\t\t\t\t\t= 0x88C7    # shared\n#\tMATRIX8_ARB\t\t\t\t\t= 0x88C8    # shared\n#\tMATRIX9_ARB\t\t\t\t\t= 0x88C9    # shared\n#\tMATRIX10_ARB\t\t\t\t\t= 0x88CA    # shared\n#\tMATRIX11_ARB\t\t\t\t\t= 0x88CB    # shared\n#\tMATRIX12_ARB\t\t\t\t\t= 0x88CC    # shared\n#\tMATRIX13_ARB\t\t\t\t\t= 0x88CD    # shared\n#\tMATRIX14_ARB\t\t\t\t\t= 0x88CE    # shared\n#\tMATRIX15_ARB\t\t\t\t\t= 0x88CF    # shared\n#\tMATRIX16_ARB\t\t\t\t\t= 0x88D0    # shared\n#\tMATRIX17_ARB\t\t\t\t\t= 0x88D1    # shared\n#\tMATRIX18_ARB\t\t\t\t\t= 0x88D2    # shared\n#\tMATRIX19_ARB\t\t\t\t\t= 0x88D3    # shared\n#\tMATRIX20_ARB\t\t\t\t\t= 0x88D4    # shared\n#\tMATRIX21_ARB\t\t\t\t\t= 0x88D5    # shared\n#\tMATRIX22_ARB\t\t\t\t\t= 0x88D6    # shared\n#\tMATRIX23_ARB\t\t\t\t\t= 0x88D7    # shared\n#\tMATRIX24_ARB\t\t\t\t\t= 0x88D8    # shared\n#\tMATRIX25_ARB\t\t\t\t\t= 0x88D9    # shared\n#\tMATRIX26_ARB\t\t\t\t\t= 0x88DA    # shared\n#\tMATRIX27_ARB\t\t\t\t\t= 0x88DB    # shared\n#\tMATRIX28_ARB\t\t\t\t\t= 0x88DC    # shared\n#\tMATRIX29_ARB\t\t\t\t\t= 0x88DD    # shared\n#\tMATRIX30_ARB\t\t\t\t\t= 0x88DE    # shared\n#\tMATRIX31_ARB\t\t\t\t\t= 0x88DF    # shared\n\n\n###############################################################################\n\n# ARB Extension #28\nARB_vertex_buffer_object enum:\n\tBUFFER_SIZE_ARB\t\t\t\t\t= 0x8764\n\tBUFFER_USAGE_ARB\t\t\t\t= 0x8765\n\tARRAY_BUFFER_ARB\t\t\t\t= 0x8892\n\tELEMENT_ARRAY_BUFFER_ARB\t\t\t= 0x8893\n\tARRAY_BUFFER_BINDING_ARB\t\t\t= 0x8894\n\tELEMENT_ARRAY_BUFFER_BINDING_ARB\t\t= 0x8895\n\tVERTEX_ARRAY_BUFFER_BINDING_ARB\t\t\t= 0x8896\n\tNORMAL_ARRAY_BUFFER_BINDING_ARB\t\t\t= 0x8897\n\tCOLOR_ARRAY_BUFFER_BINDING_ARB\t\t\t= 0x8898\n\tINDEX_ARRAY_BUFFER_BINDING_ARB\t\t\t= 0x8899\n\tTEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB\t\t= 0x889A\n\tEDGE_FLAG_ARRAY_BUFFER_BINDING_ARB\t\t= 0x889B\n\tSECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB\t= 0x889C\n\tFOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB\t\t= 0x889D\n\tWEIGHT_ARRAY_BUFFER_BINDING_ARB\t\t\t= 0x889E\n\tVERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB\t\t= 0x889F\n\tREAD_ONLY_ARB\t\t\t\t\t= 0x88B8\n\tWRITE_ONLY_ARB\t\t\t\t\t= 0x88B9\n\tREAD_WRITE_ARB\t\t\t\t\t= 0x88BA\n\tBUFFER_ACCESS_ARB\t\t\t\t= 0x88BB\n\tBUFFER_MAPPED_ARB\t\t\t\t= 0x88BC\n\tBUFFER_MAP_POINTER_ARB\t\t\t\t= 0x88BD\n\tSTREAM_DRAW_ARB\t\t\t\t\t= 0x88E0\n\tSTREAM_READ_ARB\t\t\t\t\t= 0x88E1\n\tSTREAM_COPY_ARB\t\t\t\t\t= 0x88E2\n\tSTATIC_DRAW_ARB\t\t\t\t\t= 0x88E4\n\tSTATIC_READ_ARB\t\t\t\t\t= 0x88E5\n\tSTATIC_COPY_ARB\t\t\t\t\t= 0x88E6\n\tDYNAMIC_DRAW_ARB\t\t\t\t= 0x88E8\n\tDYNAMIC_READ_ARB\t\t\t\t= 0x88E9\n\tDYNAMIC_COPY_ARB\t\t\t\t= 0x88EA\n\n###############################################################################\n\n# ARB Extension #29\nARB_occlusion_query enum:\n\tQUERY_COUNTER_BITS_ARB\t\t\t\t= 0x8864\n\tCURRENT_QUERY_ARB\t\t\t\t= 0x8865\n\tQUERY_RESULT_ARB\t\t\t\t= 0x8866\n\tQUERY_RESULT_AVAILABLE_ARB\t\t\t= 0x8867\n\tSAMPLES_PASSED_ARB\t\t\t\t= 0x8914\n\n###############################################################################\n\n# ARB Extension #30\nARB_shader_objects enum:\n\tPROGRAM_OBJECT_ARB\t\t\t\t= 0x8B40\n\tSHADER_OBJECT_ARB\t\t\t\t= 0x8B48\n\tOBJECT_TYPE_ARB\t\t\t\t\t= 0x8B4E\n\tOBJECT_SUBTYPE_ARB\t\t\t\t= 0x8B4F\n\tFLOAT_VEC2_ARB\t\t\t\t\t= 0x8B50\n\tFLOAT_VEC3_ARB\t\t\t\t\t= 0x8B51\n\tFLOAT_VEC4_ARB\t\t\t\t\t= 0x8B52\n\tINT_VEC2_ARB\t\t\t\t\t= 0x8B53\n\tINT_VEC3_ARB\t\t\t\t\t= 0x8B54\n\tINT_VEC4_ARB\t\t\t\t\t= 0x8B55\n\tBOOL_ARB\t\t\t\t\t= 0x8B56\n\tBOOL_VEC2_ARB\t\t\t\t\t= 0x8B57\n\tBOOL_VEC3_ARB\t\t\t\t\t= 0x8B58\n\tBOOL_VEC4_ARB\t\t\t\t\t= 0x8B59\n\tFLOAT_MAT2_ARB\t\t\t\t\t= 0x8B5A\n\tFLOAT_MAT3_ARB\t\t\t\t\t= 0x8B5B\n\tFLOAT_MAT4_ARB\t\t\t\t\t= 0x8B5C\n\tSAMPLER_1D_ARB\t\t\t\t\t= 0x8B5D\n\tSAMPLER_2D_ARB\t\t\t\t\t= 0x8B5E\n\tSAMPLER_3D_ARB\t\t\t\t\t= 0x8B5F\n\tSAMPLER_CUBE_ARB\t\t\t\t= 0x8B60\n\tSAMPLER_1D_SHADOW_ARB\t\t\t\t= 0x8B61\n\tSAMPLER_2D_SHADOW_ARB\t\t\t\t= 0x8B62\n\tSAMPLER_2D_RECT_ARB\t\t\t\t= 0x8B63\n\tSAMPLER_2D_RECT_SHADOW_ARB\t\t\t= 0x8B64\n\tOBJECT_DELETE_STATUS_ARB\t\t\t= 0x8B80\n\tOBJECT_COMPILE_STATUS_ARB\t\t\t= 0x8B81\n\tOBJECT_LINK_STATUS_ARB\t\t\t\t= 0x8B82\n\tOBJECT_VALIDATE_STATUS_ARB\t\t\t= 0x8B83\n\tOBJECT_INFO_LOG_LENGTH_ARB\t\t\t= 0x8B84\n\tOBJECT_ATTACHED_OBJECTS_ARB\t\t\t= 0x8B85\n\tOBJECT_ACTIVE_UNIFORMS_ARB\t\t\t= 0x8B86\n\tOBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB\t\t= 0x8B87\n\tOBJECT_SHADER_SOURCE_LENGTH_ARB\t\t\t= 0x8B88\n\n###############################################################################\n\n# ARB Extension #31\n# Additional enums are reused from ARB_vertex/fragment_program and ARB_shader_objects\nARB_vertex_shader enum:\n\tVERTEX_SHADER_ARB\t\t\t\t= 0x8B31\n\tMAX_VERTEX_UNIFORM_COMPONENTS_ARB\t\t= 0x8B4A\n\tMAX_VARYING_FLOATS_ARB\t\t\t\t= 0x8B4B\n\tMAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB\t\t= 0x8B4C\n\tMAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB\t\t= 0x8B4D\n\tOBJECT_ACTIVE_ATTRIBUTES_ARB\t\t\t= 0x8B89\n\tOBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB\t\t= 0x8B8A\n\n###############################################################################\n\n# ARB Extension #32\n# Additional enums are reused from ARB_fragment_program and ARB_shader_objects\nARB_fragment_shader enum:\n\tFRAGMENT_SHADER_ARB\t\t\t\t= 0x8B30\n\tMAX_FRAGMENT_UNIFORM_COMPONENTS_ARB\t\t= 0x8B49\n\tFRAGMENT_SHADER_DERIVATIVE_HINT_ARB\t\t= 0x8B8B\n\n###############################################################################\n\n# ARB Extension #33\nARB_shading_language_100 enum:\n\tSHADING_LANGUAGE_VERSION_ARB\t\t\t= 0x8B8C\n\n###############################################################################\n\n# ARB Extension #34\n# No new tokens\nARB_texture_non_power_of_two enum:\n\n###############################################################################\n\n# ARB Extension #35\nARB_point_sprite enum:\n\tPOINT_SPRITE_ARB\t\t\t\t= 0x8861\n\tCOORD_REPLACE_ARB\t\t\t\t= 0x8862\n\n###############################################################################\n\n# ARB Extension #36\n# No new tokens\nARB_fragment_program_shadow enum:\n\n###############################################################################\n\n# ARB Extension #37\nARB_draw_buffers enum:\n\tMAX_DRAW_BUFFERS_ARB\t\t\t\t= 0x8824\n\tDRAW_BUFFER0_ARB\t\t\t\t= 0x8825\n\tDRAW_BUFFER1_ARB\t\t\t\t= 0x8826\n\tDRAW_BUFFER2_ARB\t\t\t\t= 0x8827\n\tDRAW_BUFFER3_ARB\t\t\t\t= 0x8828\n\tDRAW_BUFFER4_ARB\t\t\t\t= 0x8829\n\tDRAW_BUFFER5_ARB\t\t\t\t= 0x882A\n\tDRAW_BUFFER6_ARB\t\t\t\t= 0x882B\n\tDRAW_BUFFER7_ARB\t\t\t\t= 0x882C\n\tDRAW_BUFFER8_ARB\t\t\t\t= 0x882D\n\tDRAW_BUFFER9_ARB\t\t\t\t= 0x882E\n\tDRAW_BUFFER10_ARB\t\t\t\t= 0x882F\n\tDRAW_BUFFER11_ARB\t\t\t\t= 0x8830\n\tDRAW_BUFFER12_ARB\t\t\t\t= 0x8831\n\tDRAW_BUFFER13_ARB\t\t\t\t= 0x8832\n\tDRAW_BUFFER14_ARB\t\t\t\t= 0x8833\n\tDRAW_BUFFER15_ARB\t\t\t\t= 0x8834\n\n###############################################################################\n\n# ARB Extension #38\nARB_texture_rectangle enum:\n\tTEXTURE_RECTANGLE_ARB\t\t\t\t= 0x84F5\n\tTEXTURE_BINDING_RECTANGLE_ARB\t\t\t= 0x84F6\n\tPROXY_TEXTURE_RECTANGLE_ARB\t\t\t= 0x84F7\n\tMAX_RECTANGLE_TEXTURE_SIZE_ARB\t\t\t= 0x84F8\n\n###############################################################################\n\n# ARB Extension #39\nARB_color_buffer_float enum:\n\tRGBA_FLOAT_MODE_ARB\t\t\t\t= 0x8820\n\tCLAMP_VERTEX_COLOR_ARB\t\t\t\t= 0x891A\n\tCLAMP_FRAGMENT_COLOR_ARB\t\t\t= 0x891B\n\tCLAMP_READ_COLOR_ARB\t\t\t\t= 0x891C\n\tFIXED_ONLY_ARB\t\t\t\t\t= 0x891D\n\n###############################################################################\n\n# ARB Extension #40\nARB_half_float_pixel enum:\n\tHALF_FLOAT_ARB\t\t\t\t\t= 0x140B\n\n###############################################################################\n\n# ARB Extension #41\nARB_texture_float enum:\n\tTEXTURE_RED_TYPE_ARB\t\t\t\t= 0x8C10\n\tTEXTURE_GREEN_TYPE_ARB\t\t\t\t= 0x8C11\n\tTEXTURE_BLUE_TYPE_ARB\t\t\t\t= 0x8C12\n\tTEXTURE_ALPHA_TYPE_ARB\t\t\t\t= 0x8C13\n\tTEXTURE_LUMINANCE_TYPE_ARB\t\t\t= 0x8C14\n\tTEXTURE_INTENSITY_TYPE_ARB\t\t\t= 0x8C15\n\tTEXTURE_DEPTH_TYPE_ARB\t\t\t\t= 0x8C16\n\tUNSIGNED_NORMALIZED_ARB\t\t\t\t= 0x8C17\n\tRGBA32F_ARB\t\t\t\t\t= 0x8814\n\tRGB32F_ARB\t\t\t\t\t= 0x8815\n\tALPHA32F_ARB\t\t\t\t\t= 0x8816\n\tINTENSITY32F_ARB\t\t\t\t= 0x8817\n\tLUMINANCE32F_ARB\t\t\t\t= 0x8818\n\tLUMINANCE_ALPHA32F_ARB\t\t\t\t= 0x8819\n\tRGBA16F_ARB\t\t\t\t\t= 0x881A\n\tRGB16F_ARB\t\t\t\t\t= 0x881B\n\tALPHA16F_ARB\t\t\t\t\t= 0x881C\n\tINTENSITY16F_ARB\t\t\t\t= 0x881D\n\tLUMINANCE16F_ARB\t\t\t\t= 0x881E\n\tLUMINANCE_ALPHA16F_ARB\t\t\t\t= 0x881F\n\n###############################################################################\n\n# ARB Extension #42\nARB_pixel_buffer_object enum:\n\tPIXEL_PACK_BUFFER_ARB\t\t\t\t= 0x88EB\n\tPIXEL_UNPACK_BUFFER_ARB\t\t\t\t= 0x88EC\n\tPIXEL_PACK_BUFFER_BINDING_ARB\t\t\t= 0x88ED\n\tPIXEL_UNPACK_BUFFER_BINDING_ARB\t\t\t= 0x88EF\n\n###############################################################################\n\n# ARB Extension #43\nARB_depth_buffer_float enum:\n\tDEPTH_COMPONENT32F\t\t\t\t= 0x8CAC\n\tDEPTH32F_STENCIL8\t\t\t\t= 0x8CAD\n\tFLOAT_32_UNSIGNED_INT_24_8_REV\t\t\t= 0x8DAD\n\n###############################################################################\n\n# ARB Extension #44\n# No new tokens\nARB_draw_instanced enum:\n\n###############################################################################\n\n# ARB Extension #45\nARB_framebuffer_object enum:\n\tINVALID_FRAMEBUFFER_OPERATION\t\t\t= 0x0506\n\tFRAMEBUFFER_ATTACHMENT_COLOR_ENCODING\t\t= 0x8210\n\tFRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE\t\t= 0x8211\n\tFRAMEBUFFER_ATTACHMENT_RED_SIZE\t\t\t= 0x8212\n\tFRAMEBUFFER_ATTACHMENT_GREEN_SIZE\t\t= 0x8213\n\tFRAMEBUFFER_ATTACHMENT_BLUE_SIZE\t\t= 0x8214\n\tFRAMEBUFFER_ATTACHMENT_ALPHA_SIZE\t\t= 0x8215\n\tFRAMEBUFFER_ATTACHMENT_DEPTH_SIZE\t\t= 0x8216\n\tFRAMEBUFFER_ATTACHMENT_STENCIL_SIZE\t\t= 0x8217\n\tFRAMEBUFFER_DEFAULT\t\t\t\t= 0x8218\n\tFRAMEBUFFER_UNDEFINED\t\t\t\t= 0x8219\n\tDEPTH_STENCIL_ATTACHMENT\t\t\t= 0x821A\n\tMAX_RENDERBUFFER_SIZE\t\t\t\t= 0x84E8\n\tDEPTH_STENCIL\t\t\t\t\t= 0x84F9\n\tUNSIGNED_INT_24_8\t\t\t\t= 0x84FA\n\tDEPTH24_STENCIL8\t\t\t\t= 0x88F0\n\tTEXTURE_STENCIL_SIZE\t\t\t\t= 0x88F1\n\tTEXTURE_RED_TYPE\t\t\t\t= 0x8C10\n\tTEXTURE_GREEN_TYPE\t\t\t\t= 0x8C11\n\tTEXTURE_BLUE_TYPE\t\t\t\t= 0x8C12\n\tTEXTURE_ALPHA_TYPE\t\t\t\t= 0x8C13\n\tTEXTURE_DEPTH_TYPE\t\t\t\t= 0x8C16\n\tUNSIGNED_NORMALIZED\t\t\t\t= 0x8C17\n\tFRAMEBUFFER_BINDING\t\t\t\t= 0x8CA6\n\tDRAW_FRAMEBUFFER_BINDING\t\t\t= GL_FRAMEBUFFER_BINDING\n\tRENDERBUFFER_BINDING\t\t\t\t= 0x8CA7\n\tREAD_FRAMEBUFFER\t\t\t\t= 0x8CA8\n\tDRAW_FRAMEBUFFER\t\t\t\t= 0x8CA9\n\tREAD_FRAMEBUFFER_BINDING\t\t\t= 0x8CAA\n\tRENDERBUFFER_SAMPLES\t\t\t\t= 0x8CAB\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_TYPE\t\t= 0x8CD0\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_NAME\t\t= 0x8CD1\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL\t\t= 0x8CD2\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE\t= 0x8CD3\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER\t\t= 0x8CD4\n\tFRAMEBUFFER_COMPLETE\t\t\t\t= 0x8CD5\n\tFRAMEBUFFER_INCOMPLETE_ATTACHMENT\t\t= 0x8CD6\n\tFRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\t= 0x8CD7\n\tFRAMEBUFFER_INCOMPLETE_DRAW_BUFFER\t\t= 0x8CDB\n\tFRAMEBUFFER_INCOMPLETE_READ_BUFFER\t\t= 0x8CDC\n\tFRAMEBUFFER_UNSUPPORTED\t\t\t\t= 0x8CDD\n\tMAX_COLOR_ATTACHMENTS\t\t\t\t= 0x8CDF\n\tCOLOR_ATTACHMENT0\t\t\t\t= 0x8CE0\n\tCOLOR_ATTACHMENT1\t\t\t\t= 0x8CE1\n\tCOLOR_ATTACHMENT2\t\t\t\t= 0x8CE2\n\tCOLOR_ATTACHMENT3\t\t\t\t= 0x8CE3\n\tCOLOR_ATTACHMENT4\t\t\t\t= 0x8CE4\n\tCOLOR_ATTACHMENT5\t\t\t\t= 0x8CE5\n\tCOLOR_ATTACHMENT6\t\t\t\t= 0x8CE6\n\tCOLOR_ATTACHMENT7\t\t\t\t= 0x8CE7\n\tCOLOR_ATTACHMENT8\t\t\t\t= 0x8CE8\n\tCOLOR_ATTACHMENT9\t\t\t\t= 0x8CE9\n\tCOLOR_ATTACHMENT10\t\t\t\t= 0x8CEA\n\tCOLOR_ATTACHMENT11\t\t\t\t= 0x8CEB\n\tCOLOR_ATTACHMENT12\t\t\t\t= 0x8CEC\n\tCOLOR_ATTACHMENT13\t\t\t\t= 0x8CED\n\tCOLOR_ATTACHMENT14\t\t\t\t= 0x8CEE\n\tCOLOR_ATTACHMENT15\t\t\t\t= 0x8CEF\n\tDEPTH_ATTACHMENT\t\t\t\t= 0x8D00\n\tSTENCIL_ATTACHMENT\t\t\t\t= 0x8D20\n\tFRAMEBUFFER\t\t\t\t\t= 0x8D40\n\tRENDERBUFFER\t\t\t\t\t= 0x8D41\n\tRENDERBUFFER_WIDTH\t\t\t\t= 0x8D42\n\tRENDERBUFFER_HEIGHT\t\t\t\t= 0x8D43\n\tRENDERBUFFER_INTERNAL_FORMAT\t\t\t= 0x8D44\n\tSTENCIL_INDEX1\t\t\t\t\t= 0x8D46\n\tSTENCIL_INDEX4\t\t\t\t\t= 0x8D47\n\tSTENCIL_INDEX8\t\t\t\t\t= 0x8D48\n\tSTENCIL_INDEX16\t\t\t\t\t= 0x8D49\n\tRENDERBUFFER_RED_SIZE\t\t\t\t= 0x8D50\n\tRENDERBUFFER_GREEN_SIZE\t\t\t\t= 0x8D51\n\tRENDERBUFFER_BLUE_SIZE\t\t\t\t= 0x8D52\n\tRENDERBUFFER_ALPHA_SIZE\t\t\t\t= 0x8D53\n\tRENDERBUFFER_DEPTH_SIZE\t\t\t\t= 0x8D54\n\tRENDERBUFFER_STENCIL_SIZE\t\t\t= 0x8D55\n\tFRAMEBUFFER_INCOMPLETE_MULTISAMPLE\t\t= 0x8D56\n\tMAX_SAMPLES\t\t\t\t\t= 0x8D57\n\nARB_framebuffer_object_DEPRECATED enum:\n\tINDEX\t\t\t\t\t\t= 0x8222\n\tTEXTURE_LUMINANCE_TYPE\t\t\t\t= 0x8C14\n\tTEXTURE_INTENSITY_TYPE\t\t\t\t= 0x8C15\n\n###############################################################################\n\n# ARB Extension #46\nARB_framebuffer_sRGB enum:\n\tFRAMEBUFFER_SRGB\t\t\t\t= 0x8DB9\n\n###############################################################################\n\n# ARB Extension #47\nARB_geometry_shader4 enum:\n\tLINES_ADJACENCY_ARB\t\t\t\t= 0x000A\n\tLINE_STRIP_ADJACENCY_ARB\t\t\t= 0x000B\n\tTRIANGLES_ADJACENCY_ARB\t\t\t\t= 0x000C\n\tTRIANGLE_STRIP_ADJACENCY_ARB\t\t\t= 0x000D\n\tPROGRAM_POINT_SIZE_ARB\t\t\t\t= 0x8642\n\tMAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB\t\t= 0x8C29\n\tFRAMEBUFFER_ATTACHMENT_LAYERED_ARB\t\t= 0x8DA7\n\tFRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB\t= 0x8DA8\n\tFRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB\t\t= 0x8DA9\n\tGEOMETRY_SHADER_ARB\t\t\t\t= 0x8DD9\n\tGEOMETRY_VERTICES_OUT_ARB\t\t\t= 0x8DDA\n\tGEOMETRY_INPUT_TYPE_ARB\t\t\t\t= 0x8DDB\n\tGEOMETRY_OUTPUT_TYPE_ARB\t\t\t= 0x8DDC\n\tMAX_GEOMETRY_VARYING_COMPONENTS_ARB\t\t= 0x8DDD\n\tMAX_VERTEX_VARYING_COMPONENTS_ARB\t\t= 0x8DDE\n\tMAX_GEOMETRY_UNIFORM_COMPONENTS_ARB\t\t= 0x8DDF\n\tMAX_GEOMETRY_OUTPUT_VERTICES_ARB\t\t= 0x8DE0\n\tMAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB\t= 0x8DE1\n\tuse VERSION_3_0\t\t\t    MAX_VARYING_COMPONENTS\n\tuse ARB_framebuffer_object\t    FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER\n\n###############################################################################\n\n# ARB Extension #48\nARB_half_float_vertex enum:\n\tHALF_FLOAT\t\t\t\t\t= 0x140B\n\n###############################################################################\n\n# ARB Extension #49\nARB_instanced_arrays enum:\n       VERTEX_ATTRIB_ARRAY_DIVISOR_ARB\t\t\t= 0x88FE\n\n###############################################################################\n\n# ARB Extension #50\nARB_map_buffer_range enum:\n\tMAP_READ_BIT\t\t\t\t\t= 0x0001\n\tMAP_WRITE_BIT\t\t\t\t\t= 0x0002\n\tMAP_INVALIDATE_RANGE_BIT\t\t\t= 0x0004\n\tMAP_INVALIDATE_BUFFER_BIT\t\t\t= 0x0008\n\tMAP_FLUSH_EXPLICIT_BIT\t\t\t\t= 0x0010\n\tMAP_UNSYNCHRONIZED_BIT\t\t\t\t= 0x0020\n\n###############################################################################\n\n# ARB Extension #51\nARB_texture_buffer_object enum:\n\tTEXTURE_BUFFER_ARB\t\t\t\t= 0x8C2A\n\tMAX_TEXTURE_BUFFER_SIZE_ARB\t\t\t= 0x8C2B\n\tTEXTURE_BINDING_BUFFER_ARB\t\t\t= 0x8C2C\n\tTEXTURE_BUFFER_DATA_STORE_BINDING_ARB\t\t= 0x8C2D\n\tTEXTURE_BUFFER_FORMAT_ARB\t\t\t= 0x8C2E\n\n###############################################################################\n\n# ARB Extension #52\nARB_texture_compression_rgtc enum:\n\tCOMPRESSED_RED_RGTC1\t\t\t\t= 0x8DBB\n\tCOMPRESSED_SIGNED_RED_RGTC1\t\t\t= 0x8DBC\n\tCOMPRESSED_RG_RGTC2\t\t\t\t= 0x8DBD\n\tCOMPRESSED_SIGNED_RG_RGTC2\t\t\t= 0x8DBE\n\n###############################################################################\n\n# ARB Extension #53\nARB_texture_rg enum:\n\tRG\t\t\t\t\t\t= 0x8227\n\tRG_INTEGER\t\t\t\t\t= 0x8228\n\tR8\t\t\t\t\t\t= 0x8229\n\tR16\t\t\t\t\t\t= 0x822A\n\tRG8\t\t\t\t\t\t= 0x822B\n\tRG16\t\t\t\t\t\t= 0x822C\n\tR16F\t\t\t\t\t\t= 0x822D\n\tR32F\t\t\t\t\t\t= 0x822E\n\tRG16F\t\t\t\t\t\t= 0x822F\n\tRG32F\t\t\t\t\t\t= 0x8230\n\tR8I\t\t\t\t\t\t= 0x8231\n\tR8UI\t\t\t\t\t\t= 0x8232\n\tR16I\t\t\t\t\t\t= 0x8233\n\tR16UI\t\t\t\t\t\t= 0x8234\n\tR32I\t\t\t\t\t\t= 0x8235\n\tR32UI\t\t\t\t\t\t= 0x8236\n\tRG8I\t\t\t\t\t\t= 0x8237\n\tRG8UI\t\t\t\t\t\t= 0x8238\n\tRG16I\t\t\t\t\t\t= 0x8239\n\tRG16UI\t\t\t\t\t\t= 0x823A\n\tRG32I\t\t\t\t\t\t= 0x823B\n\tRG32UI\t\t\t\t\t\t= 0x823C\n\n###############################################################################\n\n# ARB Extension #54\nARB_vertex_array_object enum:\n\tVERTEX_ARRAY_BINDING\t\t\t\t= 0x85B5\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #55 - WGL_ARB_create_context\n# ARB Extension #56 - GLX_ARB_create_context\n\n###############################################################################\n\n# ARB Extension #57\nARB_uniform_buffer_object enum:\n\tUNIFORM_BUFFER\t\t\t\t\t= 0x8A11\n\tUNIFORM_BUFFER_BINDING\t\t\t\t= 0x8A28\n\tUNIFORM_BUFFER_START\t\t\t\t= 0x8A29\n\tUNIFORM_BUFFER_SIZE\t\t\t\t= 0x8A2A\n\tMAX_VERTEX_UNIFORM_BLOCKS\t\t\t= 0x8A2B\n\tMAX_GEOMETRY_UNIFORM_BLOCKS\t\t\t= 0x8A2C\n\tMAX_FRAGMENT_UNIFORM_BLOCKS\t\t\t= 0x8A2D\n\tMAX_COMBINED_UNIFORM_BLOCKS\t\t\t= 0x8A2E\n\tMAX_UNIFORM_BUFFER_BINDINGS\t\t\t= 0x8A2F\n\tMAX_UNIFORM_BLOCK_SIZE\t\t\t\t= 0x8A30\n\tMAX_COMBINED_VERTEX_UNIFORM_COMPONENTS\t\t= 0x8A31\n\tMAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS\t= 0x8A32\n\tMAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS\t= 0x8A33\n\tUNIFORM_BUFFER_OFFSET_ALIGNMENT\t\t\t= 0x8A34\n\tACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH\t\t= 0x8A35\n\tACTIVE_UNIFORM_BLOCKS\t\t\t\t= 0x8A36\n\tUNIFORM_TYPE\t\t\t\t\t= 0x8A37\n\tUNIFORM_SIZE\t\t\t\t\t= 0x8A38\n\tUNIFORM_NAME_LENGTH\t\t\t\t= 0x8A39\n\tUNIFORM_BLOCK_INDEX\t\t\t\t= 0x8A3A\n\tUNIFORM_OFFSET\t\t\t\t\t= 0x8A3B\n\tUNIFORM_ARRAY_STRIDE\t\t\t\t= 0x8A3C\n\tUNIFORM_MATRIX_STRIDE\t\t\t\t= 0x8A3D\n\tUNIFORM_IS_ROW_MAJOR\t\t\t\t= 0x8A3E\n\tUNIFORM_BLOCK_BINDING\t\t\t\t= 0x8A3F\n\tUNIFORM_BLOCK_DATA_SIZE\t\t\t\t= 0x8A40\n\tUNIFORM_BLOCK_NAME_LENGTH\t\t\t= 0x8A41\n\tUNIFORM_BLOCK_ACTIVE_UNIFORMS\t\t\t= 0x8A42\n\tUNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES\t\t= 0x8A43\n\tUNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER\t= 0x8A44\n\tUNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER\t= 0x8A45\n\tUNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER\t= 0x8A46\n\tINVALID_INDEX\t\t\t\t\t= 0xFFFFFFFFu\n\n###############################################################################\n\n# ARB Extension #58\n# No new tokens\nARB_compatibility enum:\npassthru: /* ARB_compatibility just defines tokens from core 3.0 */\n\n###############################################################################\n\n# ARB Extension #59\nARB_copy_buffer enum:\n\tCOPY_READ_BUFFER\t\t\t\t= 0x8F36\n\tCOPY_WRITE_BUFFER\t\t\t\t= 0x8F37\n\n###############################################################################\n\n# ARB Extension #60\n# No new tokens\nARB_shader_texture_lod enum:\n\n###############################################################################\n\n# ARB Extension #61\nARB_depth_clamp enum:\n\tDEPTH_CLAMP\t\t\t\t\t= 0x864F\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #62\nARB_draw_elements_base_vertex enum:\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #63\nARB_fragment_coord_conventions enum:\n\n###############################################################################\n\n# ARB Extension #64\nARB_provoking_vertex enum:\n\tQUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION\t= 0x8E4C\n\tFIRST_VERTEX_CONVENTION\t\t\t\t= 0x8E4D\n\tLAST_VERTEX_CONVENTION\t\t\t\t= 0x8E4E\n\tPROVOKING_VERTEX\t\t\t\t= 0x8E4F\n\n###############################################################################\n\n# ARB Extension #65\nARB_seamless_cube_map enum:\n\tTEXTURE_CUBE_MAP_SEAMLESS\t\t\t= 0x884F\n\n###############################################################################\n\n# ARB Extension #66\nARB_sync enum:\n\tMAX_SERVER_WAIT_TIMEOUT\t\t\t\t= 0x9111\n\tOBJECT_TYPE\t\t\t\t\t= 0x9112\n\tSYNC_CONDITION\t\t\t\t\t= 0x9113\n\tSYNC_STATUS\t\t\t\t\t= 0x9114\n\tSYNC_FLAGS\t\t\t\t\t= 0x9115\n\tSYNC_FENCE\t\t\t\t\t= 0x9116\n\tSYNC_GPU_COMMANDS_COMPLETE\t\t\t= 0x9117\n\tUNSIGNALED\t\t\t\t\t= 0x9118\n\tSIGNALED\t\t\t\t\t= 0x9119\n\tALREADY_SIGNALED\t\t\t\t= 0x911A\n\tTIMEOUT_EXPIRED\t\t\t\t\t= 0x911B\n\tCONDITION_SATISFIED\t\t\t\t= 0x911C\n\tWAIT_FAILED\t\t\t\t\t= 0x911D\n\tSYNC_FLUSH_COMMANDS_BIT\t\t\t\t= 0x00000001\n\tTIMEOUT_IGNORED\t\t\t\t\t= 0xFFFFFFFFFFFFFFFFull\n\n###############################################################################\n\n# ARB Extension #67\nARB_texture_multisample enum:\n\tSAMPLE_POSITION\t\t\t\t\t= 0x8E50\n\tSAMPLE_MASK\t\t\t\t\t= 0x8E51\n\tSAMPLE_MASK_VALUE\t\t\t\t= 0x8E52\n\tMAX_SAMPLE_MASK_WORDS\t\t\t\t= 0x8E59\n\tTEXTURE_2D_MULTISAMPLE\t\t\t\t= 0x9100\n\tPROXY_TEXTURE_2D_MULTISAMPLE\t\t\t= 0x9101\n\tTEXTURE_2D_MULTISAMPLE_ARRAY\t\t\t= 0x9102\n\tPROXY_TEXTURE_2D_MULTISAMPLE_ARRAY\t\t= 0x9103\n\tTEXTURE_BINDING_2D_MULTISAMPLE\t\t\t= 0x9104\n\tTEXTURE_BINDING_2D_MULTISAMPLE_ARRAY\t\t= 0x9105\n\tTEXTURE_SAMPLES\t\t\t\t\t= 0x9106\n\tTEXTURE_FIXED_SAMPLE_LOCATIONS\t\t\t= 0x9107\n\tSAMPLER_2D_MULTISAMPLE\t\t\t\t= 0x9108\n\tINT_SAMPLER_2D_MULTISAMPLE\t\t\t= 0x9109\n\tUNSIGNED_INT_SAMPLER_2D_MULTISAMPLE\t\t= 0x910A\n\tSAMPLER_2D_MULTISAMPLE_ARRAY\t\t\t= 0x910B\n\tINT_SAMPLER_2D_MULTISAMPLE_ARRAY\t\t= 0x910C\n\tUNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY\t= 0x910D\n\tMAX_COLOR_TEXTURE_SAMPLES\t\t\t= 0x910E\n\tMAX_DEPTH_TEXTURE_SAMPLES\t\t\t= 0x910F\n\tMAX_INTEGER_SAMPLES\t\t\t\t= 0x9110\n\n###############################################################################\n\n# ARB Extension #68\nARB_vertex_array_bgra enum:\n\tuse VERSION_1_2\t\t\t    BGRA\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #69\nARB_draw_buffers_blend enum:\n#@@@ Add ARB suffixes here & functions!\n\n###############################################################################\n\n# ARB Extension #70\n#@@@ Add ARB suffixes here & functions!\nARB_sample_shading enum:\n\tSAMPLE_SHADING\t\t\t\t\t= 0x8C36\n\tMIN_SAMPLE_SHADING_VALUE\t\t\t= 0x8C37\n\n###############################################################################\n\n# ARB Extension #71\n#@@@ Add ARB suffixes here & functions!\nARB_texture_cube_map_array enum:\n\tTEXTURE_CUBE_MAP_ARRAY\t\t\t\t= 0x9009\n\tTEXTURE_BINDING_CUBE_MAP_ARRAY\t\t\t= 0x900A\n\tPROXY_TEXTURE_CUBE_MAP_ARRAY\t\t\t= 0x900B\n\tSAMPLER_CUBE_MAP_ARRAY\t\t\t\t= 0x900C\n\tSAMPLER_CUBE_MAP_ARRAY_SHADOW\t\t\t= 0x900D\n\tINT_SAMPLER_CUBE_MAP_ARRAY\t\t\t= 0x900E\n\tUNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY\t\t= 0x900F\n\n###############################################################################\n\n# ARB Extension #72\n#@@@ Add ARB suffixes here & functions!\nARB_texture_gather enum:\n\tMIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB\t\t= 0x8E5E\n\tMAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB\t\t= 0x8E5F\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #73\nARB_texture_query_lod enum:\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #74 - WGL_ARB_create_context_profile\n# ARB Extension #75 - GLX_ARB_create_context_profile\n\n###############################################################################\n\n# ARB Extension #76\nARB_shading_language_include enum:\n\tSHADER_INCLUDE_ARB\t\t\t\t= 0x8DAE\n\tNAMED_STRING_LENGTH_ARB\t\t\t\t= 0x8DE9\n\tNAMED_STRING_TYPE_ARB\t\t\t\t= 0x8DEA\n\n###############################################################################\n\n# ARB Extension #77\nARB_texture_compression_bptc enum:\n\tCOMPRESSED_RGBA_BPTC_UNORM_ARB\t\t\t= 0x8E8C\n\tCOMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB\t\t= 0x8E8D\n\tCOMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB\t\t= 0x8E8E\n\tCOMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB\t\t= 0x8E8F\n\n###############################################################################\n\n# ARB Extension #78\nARB_blend_func_extended enum:\n\tSRC1_COLOR\t\t\t\t\t= 0x88F9\n\tuse VERSION_1_5_DEPRECATED\t    SRC1_ALPHA\n\tONE_MINUS_SRC1_COLOR\t\t\t\t= 0x88FA\n\tONE_MINUS_SRC1_ALPHA\t\t\t\t= 0x88FB\n\tMAX_DUAL_SOURCE_DRAW_BUFFERS\t\t\t= 0x88FC\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #79\nARB_explicit_attrib_location enum:\n\n###############################################################################\n\n# ARB Extension #80\nARB_occlusion_query2 enum:\n\tANY_SAMPLES_PASSED\t\t\t\t= 0x8C2F\n\n###############################################################################\n\n# ARB Extension #81\nARB_sampler_objects enum:\n\tSAMPLER_BINDING\t\t\t\t\t= 0x8919\n\n###############################################################################\n\n# No new tokens\n# ARB Extension #82\nARB_shader_bit_encoding enum:\n\n###############################################################################\n\n# ARB Extension #83\nARB_texture_rgb10_a2ui enum:\n\tRGB10_A2UI\t\t\t\t\t= 0x906F\n\n###############################################################################\n\n# ARB Extension #84\nARB_texture_swizzle enum:\n\tTEXTURE_SWIZZLE_R\t\t\t\t= 0x8E42\n\tTEXTURE_SWIZZLE_G\t\t\t\t= 0x8E43\n\tTEXTURE_SWIZZLE_B\t\t\t\t= 0x8E44\n\tTEXTURE_SWIZZLE_A\t\t\t\t= 0x8E45\n\tTEXTURE_SWIZZLE_RGBA\t\t\t\t= 0x8E46\n\n###############################################################################\n\n# ARB Extension #85\nARB_timer_query enum:\n\tTIME_ELAPSED\t\t\t\t\t= 0x88BF\n\tTIMESTAMP\t\t\t\t\t= 0x8E28\n\n###############################################################################\n\n# ARB Extension #86\nARB_vertex_type_2_10_10_10_rev enum:\n\tuse VERSION_1_2\t\t\t    UNSIGNED_INT_2_10_10_10_REV\n\tINT_2_10_10_10_REV\t\t\t\t= 0x8D9F\n\n###############################################################################\n\n# ARB Extension #87\nARB_draw_indirect enum:\n\tDRAW_INDIRECT_BUFFER\t\t\t\t= 0x8F3F\n\tDRAW_INDIRECT_BUFFER_BINDING\t\t\t= 0x8F43\n\n###############################################################################\n\n# ARB Extension #88\nARB_gpu_shader5 enum:\n\tGEOMETRY_SHADER_INVOCATIONS\t\t\t= 0x887F\n\tMAX_GEOMETRY_SHADER_INVOCATIONS\t\t\t= 0x8E5A\n\tMIN_FRAGMENT_INTERPOLATION_OFFSET\t\t= 0x8E5B\n\tMAX_FRAGMENT_INTERPOLATION_OFFSET\t\t= 0x8E5C\n\tFRAGMENT_INTERPOLATION_OFFSET_BITS\t\t= 0x8E5D\n\tMAX_VERTEX_STREAMS\t\t\t\t= 0x8E71\n\n###############################################################################\n\n# ARB Extension #89\nARB_gpu_shader_fp64 enum:\n\tuse VERSION_1_1\t\t\t    DOUBLE\n\tDOUBLE_VEC2\t\t\t\t\t= 0x8FFC\n\tDOUBLE_VEC3\t\t\t\t\t= 0x8FFD\n\tDOUBLE_VEC4\t\t\t\t\t= 0x8FFE\n\tDOUBLE_MAT2\t\t\t\t\t= 0x8F46\n\tDOUBLE_MAT3\t\t\t\t\t= 0x8F47\n\tDOUBLE_MAT4\t\t\t\t\t= 0x8F48\n\tDOUBLE_MAT2x3\t\t\t\t\t= 0x8F49\n\tDOUBLE_MAT2x4\t\t\t\t\t= 0x8F4A\n\tDOUBLE_MAT3x2\t\t\t\t\t= 0x8F4B\n\tDOUBLE_MAT3x4\t\t\t\t\t= 0x8F4C\n\tDOUBLE_MAT4x2\t\t\t\t\t= 0x8F4D\n\tDOUBLE_MAT4x3\t\t\t\t\t= 0x8F4E\n\n###############################################################################\n\n# ARB Extension #90\nARB_shader_subroutine enum:\n\tACTIVE_SUBROUTINES\t\t\t\t= 0x8DE5\n\tACTIVE_SUBROUTINE_UNIFORMS\t\t\t= 0x8DE6\n\tACTIVE_SUBROUTINE_UNIFORM_LOCATIONS\t\t= 0x8E47\n\tACTIVE_SUBROUTINE_MAX_LENGTH\t\t\t= 0x8E48\n\tACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH\t\t= 0x8E49\n\tMAX_SUBROUTINES\t\t\t\t\t= 0x8DE7\n\tMAX_SUBROUTINE_UNIFORM_LOCATIONS\t\t= 0x8DE8\n\tNUM_COMPATIBLE_SUBROUTINES\t\t\t= 0x8E4A\n\tCOMPATIBLE_SUBROUTINES\t\t\t\t= 0x8E4B\n\tuse ARB_uniform_buffer_object\t    UNIFORM_SIZE\n\tuse ARB_uniform_buffer_object\t    UNIFORM_NAME_LENGTH\n\n###############################################################################\n\n# ARB Extension #91\nARB_tessellation_shader enum:\n\tPATCHES\t\t\t\t\t\t= 0x000E\n\tPATCH_VERTICES\t\t\t\t\t= 0x8E72\n\tPATCH_DEFAULT_INNER_LEVEL\t\t\t= 0x8E73\n\tPATCH_DEFAULT_OUTER_LEVEL\t\t\t= 0x8E74\n\tTESS_CONTROL_OUTPUT_VERTICES\t\t\t= 0x8E75\n\tTESS_GEN_MODE\t\t\t\t\t= 0x8E76\n\tTESS_GEN_SPACING\t\t\t\t= 0x8E77\n\tTESS_GEN_VERTEX_ORDER\t\t\t\t= 0x8E78\n\tTESS_GEN_POINT_MODE\t\t\t\t= 0x8E79\n\tuse VERSION_1_1\t\t\t    TRIANGLES\n\tuse VERSION_1_1\t\t\t    QUADS\n\tISOLINES\t\t\t\t\t= 0x8E7A\n\tuse VERSION_1_1\t\t\t    EQUAL\n\tFRACTIONAL_ODD\t\t\t\t\t= 0x8E7B\n\tFRACTIONAL_EVEN\t\t\t\t\t= 0x8E7C\n\tuse VERSION_1_1\t\t\t    CCW\n\tuse VERSION_1_1\t\t\t    CW\n\tMAX_PATCH_VERTICES\t\t\t\t= 0x8E7D\n\tMAX_TESS_GEN_LEVEL\t\t\t\t= 0x8E7E\n\tMAX_TESS_CONTROL_UNIFORM_COMPONENTS\t\t= 0x8E7F\n\tMAX_TESS_EVALUATION_UNIFORM_COMPONENTS\t\t= 0x8E80\n\tMAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS\t\t= 0x8E81\n\tMAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS\t\t= 0x8E82\n\tMAX_TESS_CONTROL_OUTPUT_COMPONENTS\t\t= 0x8E83\n\tMAX_TESS_PATCH_COMPONENTS\t\t\t= 0x8E84\n\tMAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS\t= 0x8E85\n\tMAX_TESS_EVALUATION_OUTPUT_COMPONENTS\t\t= 0x8E86\n\tMAX_TESS_CONTROL_UNIFORM_BLOCKS\t\t\t= 0x8E89\n\tMAX_TESS_EVALUATION_UNIFORM_BLOCKS\t\t= 0x8E8A\n\tMAX_TESS_CONTROL_INPUT_COMPONENTS\t\t= 0x886C\n\tMAX_TESS_EVALUATION_INPUT_COMPONENTS\t\t= 0x886D\n\tMAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS\t= 0x8E1E\n\tMAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E1F\n\tUNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER = 0x84F0\n\tUNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x84F1\n\tTESS_EVALUATION_SHADER\t\t\t\t= 0x8E87\n\tTESS_CONTROL_SHADER\t\t\t\t= 0x8E88\n\n###############################################################################\n\n# ARB Extension #92\nARB_texture_buffer_object_rgb32 enum:\n\tuse VERSION_3_0\t\t\t    RGB32F\n\tuse VERSION_3_0\t\t\t    RGB32UI\n\tuse VERSION_3_0\t\t\t    RGB32I\n\n###############################################################################\n\n# ARB Extension #93\nARB_transform_feedback2 enum:\n\tTRANSFORM_FEEDBACK\t\t\t\t= 0x8E22\n\tTRANSFORM_FEEDBACK_BUFFER_PAUSED\t\t= 0x8E23\n\tTRANSFORM_FEEDBACK_BUFFER_ACTIVE\t\t= 0x8E24\n\tTRANSFORM_FEEDBACK_BINDING\t\t\t= 0x8E25\n\n###############################################################################\n\n# ARB Extension #94\nARB_transform_feedback3 enum:\n\tMAX_TRANSFORM_FEEDBACK_BUFFERS\t\t\t= 0x8E70\n\tMAX_VERTEX_STREAMS\t\t\t\t= 0x8E71\n\n\n###############################################################################\n#\n# non-ARB extensions follow, in registry order\n#\n###############################################################################\n\n###############################################################################\n\n# Extension #1\nEXT_abgr enum:\n\tABGR_EXT\t\t\t\t\t= 0x8000\n\n###############################################################################\n\n# Extension #2\nEXT_blend_color enum:\n\tCONSTANT_COLOR_EXT\t\t\t\t= 0x8001\n\tONE_MINUS_CONSTANT_COLOR_EXT\t\t\t= 0x8002\n\tCONSTANT_ALPHA_EXT\t\t\t\t= 0x8003\n\tONE_MINUS_CONSTANT_ALPHA_EXT\t\t\t= 0x8004\n\tBLEND_COLOR_EXT\t\t\t\t\t= 0x8005 # 4 F\n\n###############################################################################\n\n# Extension #3\nEXT_polygon_offset enum:\n\tPOLYGON_OFFSET_EXT\t\t\t\t= 0x8037\n\tPOLYGON_OFFSET_FACTOR_EXT\t\t\t= 0x8038\n\tPOLYGON_OFFSET_BIAS_EXT\t\t\t\t= 0x8039 # 1 F\n\n###############################################################################\n\n# Extension #4\nEXT_texture enum:\n\tALPHA4_EXT\t\t\t\t\t= 0x803B\n\tALPHA8_EXT\t\t\t\t\t= 0x803C\n\tALPHA12_EXT\t\t\t\t\t= 0x803D\n\tALPHA16_EXT\t\t\t\t\t= 0x803E\n\tLUMINANCE4_EXT\t\t\t\t\t= 0x803F\n\tLUMINANCE8_EXT\t\t\t\t\t= 0x8040\n\tLUMINANCE12_EXT\t\t\t\t\t= 0x8041\n\tLUMINANCE16_EXT\t\t\t\t\t= 0x8042\n\tLUMINANCE4_ALPHA4_EXT\t\t\t\t= 0x8043\n\tLUMINANCE6_ALPHA2_EXT\t\t\t\t= 0x8044\n\tLUMINANCE8_ALPHA8_EXT\t\t\t\t= 0x8045\n\tLUMINANCE12_ALPHA4_EXT\t\t\t\t= 0x8046\n\tLUMINANCE12_ALPHA12_EXT\t\t\t\t= 0x8047\n\tLUMINANCE16_ALPHA16_EXT\t\t\t\t= 0x8048\n\tINTENSITY_EXT\t\t\t\t\t= 0x8049\n\tINTENSITY4_EXT\t\t\t\t\t= 0x804A\n\tINTENSITY8_EXT\t\t\t\t\t= 0x804B\n\tINTENSITY12_EXT\t\t\t\t\t= 0x804C\n\tINTENSITY16_EXT\t\t\t\t\t= 0x804D\n\tRGB2_EXT\t\t\t\t\t= 0x804E\n\tRGB4_EXT\t\t\t\t\t= 0x804F\n\tRGB5_EXT\t\t\t\t\t= 0x8050\n\tRGB8_EXT\t\t\t\t\t= 0x8051\n\tRGB10_EXT\t\t\t\t\t= 0x8052\n\tRGB12_EXT\t\t\t\t\t= 0x8053\n\tRGB16_EXT\t\t\t\t\t= 0x8054\n\tRGBA2_EXT\t\t\t\t\t= 0x8055\n\tRGBA4_EXT\t\t\t\t\t= 0x8056\n\tRGB5_A1_EXT\t\t\t\t\t= 0x8057\n\tRGBA8_EXT\t\t\t\t\t= 0x8058\n\tRGB10_A2_EXT\t\t\t\t\t= 0x8059\n\tRGBA12_EXT\t\t\t\t\t= 0x805A\n\tRGBA16_EXT\t\t\t\t\t= 0x805B\n\tTEXTURE_RED_SIZE_EXT\t\t\t\t= 0x805C\n\tTEXTURE_GREEN_SIZE_EXT\t\t\t\t= 0x805D\n\tTEXTURE_BLUE_SIZE_EXT\t\t\t\t= 0x805E\n\tTEXTURE_ALPHA_SIZE_EXT\t\t\t\t= 0x805F\n\tTEXTURE_LUMINANCE_SIZE_EXT\t\t\t= 0x8060\n\tTEXTURE_INTENSITY_SIZE_EXT\t\t\t= 0x8061\n\tREPLACE_EXT\t\t\t\t\t= 0x8062\n\tPROXY_TEXTURE_1D_EXT\t\t\t\t= 0x8063\n\tPROXY_TEXTURE_2D_EXT\t\t\t\t= 0x8064\n\tTEXTURE_TOO_LARGE_EXT\t\t\t\t= 0x8065\n\n###############################################################################\n\n# Extension #5 - skipped\n\n###############################################################################\n\n# Extension #6\nEXT_texture3D enum:\n\tPACK_SKIP_IMAGES_EXT\t\t\t\t= 0x806B # 1 I\n\tPACK_IMAGE_HEIGHT_EXT\t\t\t\t= 0x806C # 1 F\n\tUNPACK_SKIP_IMAGES_EXT\t\t\t\t= 0x806D # 1 I\n\tUNPACK_IMAGE_HEIGHT_EXT\t\t\t\t= 0x806E # 1 F\n\tTEXTURE_3D_EXT\t\t\t\t\t= 0x806F # 1 I\n\tPROXY_TEXTURE_3D_EXT\t\t\t\t= 0x8070\n\tTEXTURE_DEPTH_EXT\t\t\t\t= 0x8071\n\tTEXTURE_WRAP_R_EXT\t\t\t\t= 0x8072\n\tMAX_3D_TEXTURE_SIZE_EXT\t\t\t\t= 0x8073 # 1 I\n\n###############################################################################\n\n# Extension #7\nSGIS_texture_filter4 enum:\n\tFILTER4_SGIS\t\t\t\t\t= 0x8146\n\tTEXTURE_FILTER4_SIZE_SGIS\t\t\t= 0x8147\n\n###############################################################################\n\n# Extension #8 - skipped\n\n###############################################################################\n\n# No new tokens\n# Extension #9\nEXT_subtexture enum:\n\n###############################################################################\n\n# No new tokens\n# Extension #10\nEXT_copy_texture enum:\n\n###############################################################################\n\n# Extension #11\nEXT_histogram enum:\n\tHISTOGRAM_EXT\t\t\t\t\t= 0x8024 # 1 I\n\tPROXY_HISTOGRAM_EXT\t\t\t\t= 0x8025\n\tHISTOGRAM_WIDTH_EXT\t\t\t\t= 0x8026\n\tHISTOGRAM_FORMAT_EXT\t\t\t\t= 0x8027\n\tHISTOGRAM_RED_SIZE_EXT\t\t\t\t= 0x8028\n\tHISTOGRAM_GREEN_SIZE_EXT\t\t\t= 0x8029\n\tHISTOGRAM_BLUE_SIZE_EXT\t\t\t\t= 0x802A\n\tHISTOGRAM_ALPHA_SIZE_EXT\t\t\t= 0x802B\n\tHISTOGRAM_LUMINANCE_SIZE_EXT\t\t\t= 0x802C\n\tHISTOGRAM_SINK_EXT\t\t\t\t= 0x802D\n\tMINMAX_EXT\t\t\t\t\t= 0x802E # 1 I\n\tMINMAX_FORMAT_EXT\t\t\t\t= 0x802F\n\tMINMAX_SINK_EXT\t\t\t\t\t= 0x8030\n\tTABLE_TOO_LARGE_EXT\t\t\t\t= 0x8031\n\n###############################################################################\n\n# Extension #12\nEXT_convolution enum:\n\tCONVOLUTION_1D_EXT\t\t\t\t= 0x8010 # 1 I\n\tCONVOLUTION_2D_EXT\t\t\t\t= 0x8011 # 1 I\n\tSEPARABLE_2D_EXT\t\t\t\t= 0x8012 # 1 I\n\tCONVOLUTION_BORDER_MODE_EXT\t\t\t= 0x8013\n\tCONVOLUTION_FILTER_SCALE_EXT\t\t\t= 0x8014\n\tCONVOLUTION_FILTER_BIAS_EXT\t\t\t= 0x8015\n\tREDUCE_EXT\t\t\t\t\t= 0x8016\n\tCONVOLUTION_FORMAT_EXT\t\t\t\t= 0x8017\n\tCONVOLUTION_WIDTH_EXT\t\t\t\t= 0x8018\n\tCONVOLUTION_HEIGHT_EXT\t\t\t\t= 0x8019\n\tMAX_CONVOLUTION_WIDTH_EXT\t\t\t= 0x801A\n\tMAX_CONVOLUTION_HEIGHT_EXT\t\t\t= 0x801B\n\tPOST_CONVOLUTION_RED_SCALE_EXT\t\t\t= 0x801C # 1 F\n\tPOST_CONVOLUTION_GREEN_SCALE_EXT\t\t= 0x801D # 1 F\n\tPOST_CONVOLUTION_BLUE_SCALE_EXT\t\t\t= 0x801E # 1 F\n\tPOST_CONVOLUTION_ALPHA_SCALE_EXT\t\t= 0x801F # 1 F\n\tPOST_CONVOLUTION_RED_BIAS_EXT\t\t\t= 0x8020 # 1 F\n\tPOST_CONVOLUTION_GREEN_BIAS_EXT\t\t\t= 0x8021 # 1 F\n\tPOST_CONVOLUTION_BLUE_BIAS_EXT\t\t\t= 0x8022 # 1 F\n\tPOST_CONVOLUTION_ALPHA_BIAS_EXT\t\t\t= 0x8023 # 1 F\n\n###############################################################################\n\n# Extension #13\nSGI_color_matrix enum:\n\tCOLOR_MATRIX_SGI\t\t\t\t= 0x80B1 # 16 F\n\tCOLOR_MATRIX_STACK_DEPTH_SGI\t\t\t= 0x80B2 # 1 I\n\tMAX_COLOR_MATRIX_STACK_DEPTH_SGI\t\t= 0x80B3 # 1 I\n\tPOST_COLOR_MATRIX_RED_SCALE_SGI\t\t\t= 0x80B4 # 1 F\n\tPOST_COLOR_MATRIX_GREEN_SCALE_SGI\t\t= 0x80B5 # 1 F\n\tPOST_COLOR_MATRIX_BLUE_SCALE_SGI\t\t= 0x80B6 # 1 F\n\tPOST_COLOR_MATRIX_ALPHA_SCALE_SGI\t\t= 0x80B7 # 1 F\n\tPOST_COLOR_MATRIX_RED_BIAS_SGI\t\t\t= 0x80B8 # 1 F\n\tPOST_COLOR_MATRIX_GREEN_BIAS_SGI\t\t= 0x80B9 # 1 F\n\tPOST_COLOR_MATRIX_BLUE_BIAS_SGI\t\t\t= 0x80BA # 1 F\n\tPOST_COLOR_MATRIX_ALPHA_BIAS_SGI\t\t= 0x80BB # 1 F\n\n###############################################################################\n\n# Extension #14\nSGI_color_table enum:\n\tCOLOR_TABLE_SGI\t\t\t\t\t= 0x80D0 # 1 I\n\tPOST_CONVOLUTION_COLOR_TABLE_SGI\t\t= 0x80D1 # 1 I\n\tPOST_COLOR_MATRIX_COLOR_TABLE_SGI\t\t= 0x80D2 # 1 I\n\tPROXY_COLOR_TABLE_SGI\t\t\t\t= 0x80D3\n\tPROXY_POST_CONVOLUTION_COLOR_TABLE_SGI\t\t= 0x80D4\n\tPROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI\t\t= 0x80D5\n\tCOLOR_TABLE_SCALE_SGI\t\t\t\t= 0x80D6\n\tCOLOR_TABLE_BIAS_SGI\t\t\t\t= 0x80D7\n\tCOLOR_TABLE_FORMAT_SGI\t\t\t\t= 0x80D8\n\tCOLOR_TABLE_WIDTH_SGI\t\t\t\t= 0x80D9\n\tCOLOR_TABLE_RED_SIZE_SGI\t\t\t= 0x80DA\n\tCOLOR_TABLE_GREEN_SIZE_SGI\t\t\t= 0x80DB\n\tCOLOR_TABLE_BLUE_SIZE_SGI\t\t\t= 0x80DC\n\tCOLOR_TABLE_ALPHA_SIZE_SGI\t\t\t= 0x80DD\n\tCOLOR_TABLE_LUMINANCE_SIZE_SGI\t\t\t= 0x80DE\n\tCOLOR_TABLE_INTENSITY_SIZE_SGI\t\t\t= 0x80DF\n\n###############################################################################\n\n# Extension #15\nSGIS_pixel_texture enum:\n\tPIXEL_TEXTURE_SGIS\t\t\t\t= 0x8353 # 1 I\n\tPIXEL_FRAGMENT_RGB_SOURCE_SGIS\t\t\t= 0x8354 # 1 I\n\tPIXEL_FRAGMENT_ALPHA_SOURCE_SGIS\t\t= 0x8355 # 1 I\n\tPIXEL_GROUP_COLOR_SGIS\t\t\t\t= 0x8356 # 1 I\n\n###############################################################################\n\n# Extension #15a\nSGIX_pixel_texture enum:\n\tPIXEL_TEX_GEN_SGIX\t\t\t\t= 0x8139 # 1 I\n\tPIXEL_TEX_GEN_MODE_SGIX\t\t\t\t= 0x832B # 1 I\n\n###############################################################################\n\n# Extension #16\nSGIS_texture4D enum:\n\tPACK_SKIP_VOLUMES_SGIS\t\t\t\t= 0x8130 # 1 I\n\tPACK_IMAGE_DEPTH_SGIS\t\t\t\t= 0x8131 # 1 I\n\tUNPACK_SKIP_VOLUMES_SGIS\t\t\t= 0x8132 # 1 I\n\tUNPACK_IMAGE_DEPTH_SGIS\t\t\t\t= 0x8133 # 1 I\n\tTEXTURE_4D_SGIS\t\t\t\t\t= 0x8134 # 1 I\n\tPROXY_TEXTURE_4D_SGIS\t\t\t\t= 0x8135\n\tTEXTURE_4DSIZE_SGIS\t\t\t\t= 0x8136\n\tTEXTURE_WRAP_Q_SGIS\t\t\t\t= 0x8137\n\tMAX_4D_TEXTURE_SIZE_SGIS\t\t\t= 0x8138 # 1 I\n\tTEXTURE_4D_BINDING_SGIS\t\t\t\t= 0x814F # 1 I\n\n###############################################################################\n\n# Extension #17\nSGI_texture_color_table enum:\n\tTEXTURE_COLOR_TABLE_SGI\t\t\t\t= 0x80BC # 1 I\n\tPROXY_TEXTURE_COLOR_TABLE_SGI\t\t\t= 0x80BD\n\n###############################################################################\n\n# Extension #18\nEXT_cmyka enum:\n\tCMYK_EXT\t\t\t\t\t= 0x800C\n\tCMYKA_EXT\t\t\t\t\t= 0x800D\n\tPACK_CMYK_HINT_EXT\t\t\t\t= 0x800E # 1 I\n\tUNPACK_CMYK_HINT_EXT\t\t\t\t= 0x800F # 1 I\n\n###############################################################################\n\n# Extension #19 - skipped\n\n###############################################################################\n\n# Extension #20\nEXT_texture_object enum:\n\tTEXTURE_PRIORITY_EXT\t\t\t\t= 0x8066\n\tTEXTURE_RESIDENT_EXT\t\t\t\t= 0x8067\n\tTEXTURE_1D_BINDING_EXT\t\t\t\t= 0x8068\n\tTEXTURE_2D_BINDING_EXT\t\t\t\t= 0x8069\n\tTEXTURE_3D_BINDING_EXT\t\t\t\t= 0x806A # 1 I\n\n###############################################################################\n\n# Extension #21\nSGIS_detail_texture enum:\n\tDETAIL_TEXTURE_2D_SGIS\t\t\t\t= 0x8095\n\tDETAIL_TEXTURE_2D_BINDING_SGIS\t\t\t= 0x8096 # 1 I\n\tLINEAR_DETAIL_SGIS\t\t\t\t= 0x8097\n\tLINEAR_DETAIL_ALPHA_SGIS\t\t\t= 0x8098\n\tLINEAR_DETAIL_COLOR_SGIS\t\t\t= 0x8099\n\tDETAIL_TEXTURE_LEVEL_SGIS\t\t\t= 0x809A\n\tDETAIL_TEXTURE_MODE_SGIS\t\t\t= 0x809B\n\tDETAIL_TEXTURE_FUNC_POINTS_SGIS\t\t\t= 0x809C\n\n###############################################################################\n\n# Extension #22\nSGIS_sharpen_texture enum:\n\tLINEAR_SHARPEN_SGIS\t\t\t\t= 0x80AD\n\tLINEAR_SHARPEN_ALPHA_SGIS\t\t\t= 0x80AE\n\tLINEAR_SHARPEN_COLOR_SGIS\t\t\t= 0x80AF\n\tSHARPEN_TEXTURE_FUNC_POINTS_SGIS\t\t= 0x80B0\n\n###############################################################################\n\n# Extension #23\nEXT_packed_pixels enum:\n\tUNSIGNED_BYTE_3_3_2_EXT\t\t\t\t= 0x8032\n\tUNSIGNED_SHORT_4_4_4_4_EXT\t\t\t= 0x8033\n\tUNSIGNED_SHORT_5_5_5_1_EXT\t\t\t= 0x8034\n\tUNSIGNED_INT_8_8_8_8_EXT\t\t\t= 0x8035\n\tUNSIGNED_INT_10_10_10_2_EXT\t\t\t= 0x8036\n\n###############################################################################\n\n# Extension #24\nSGIS_texture_lod enum:\n\tTEXTURE_MIN_LOD_SGIS\t\t\t\t= 0x813A\n\tTEXTURE_MAX_LOD_SGIS\t\t\t\t= 0x813B\n\tTEXTURE_BASE_LEVEL_SGIS\t\t\t\t= 0x813C\n\tTEXTURE_MAX_LEVEL_SGIS\t\t\t\t= 0x813D\n\n###############################################################################\n\n# Extension #25\nSGIS_multisample enum:\n\tMULTISAMPLE_SGIS\t\t\t\t= 0x809D # 1 I\n\tSAMPLE_ALPHA_TO_MASK_SGIS\t\t\t= 0x809E # 1 I\n\tSAMPLE_ALPHA_TO_ONE_SGIS\t\t\t= 0x809F # 1 I\n\tSAMPLE_MASK_SGIS\t\t\t\t= 0x80A0 # 1 I\n\t1PASS_SGIS\t\t\t\t\t= 0x80A1\n\t2PASS_0_SGIS\t\t\t\t\t= 0x80A2\n\t2PASS_1_SGIS\t\t\t\t\t= 0x80A3\n\t4PASS_0_SGIS\t\t\t\t\t= 0x80A4\n\t4PASS_1_SGIS\t\t\t\t\t= 0x80A5\n\t4PASS_2_SGIS\t\t\t\t\t= 0x80A6\n\t4PASS_3_SGIS\t\t\t\t\t= 0x80A7\n\tSAMPLE_BUFFERS_SGIS\t\t\t\t= 0x80A8 # 1 I\n\tSAMPLES_SGIS\t\t\t\t\t= 0x80A9 # 1 I\n\tSAMPLE_MASK_VALUE_SGIS\t\t\t\t= 0x80AA # 1 F\n\tSAMPLE_MASK_INVERT_SGIS\t\t\t\t= 0x80AB # 1 I\n\tSAMPLE_PATTERN_SGIS\t\t\t\t= 0x80AC # 1 I\n\n###############################################################################\n\n# Extension #26 - no specification?\n# SGIS_premultiply_blend enum:\n\n##############################################################################\n\n# Extension #27\n# Diamond ships an otherwise identical IBM_rescale_normal extension;\n#  Dan Brokenshire says this is deprecated and should not be advertised.\nEXT_rescale_normal enum:\n\tRESCALE_NORMAL_EXT\t\t\t\t= 0x803A # 1 I\n\n###############################################################################\n\n# Extension #28 - GLX_EXT_visual_info\n\n###############################################################################\n\n# Extension #29 - skipped\n\n###############################################################################\n\n# Extension #30\nEXT_vertex_array enum:\n\tVERTEX_ARRAY_EXT\t\t\t\t= 0x8074\n\tNORMAL_ARRAY_EXT\t\t\t\t= 0x8075\n\tCOLOR_ARRAY_EXT\t\t\t\t\t= 0x8076\n\tINDEX_ARRAY_EXT\t\t\t\t\t= 0x8077\n\tTEXTURE_COORD_ARRAY_EXT\t\t\t\t= 0x8078\n\tEDGE_FLAG_ARRAY_EXT\t\t\t\t= 0x8079\n\tVERTEX_ARRAY_SIZE_EXT\t\t\t\t= 0x807A\n\tVERTEX_ARRAY_TYPE_EXT\t\t\t\t= 0x807B\n\tVERTEX_ARRAY_STRIDE_EXT\t\t\t\t= 0x807C\n\tVERTEX_ARRAY_COUNT_EXT\t\t\t\t= 0x807D # 1 I\n\tNORMAL_ARRAY_TYPE_EXT\t\t\t\t= 0x807E\n\tNORMAL_ARRAY_STRIDE_EXT\t\t\t\t= 0x807F\n\tNORMAL_ARRAY_COUNT_EXT\t\t\t\t= 0x8080 # 1 I\n\tCOLOR_ARRAY_SIZE_EXT\t\t\t\t= 0x8081\n\tCOLOR_ARRAY_TYPE_EXT\t\t\t\t= 0x8082\n\tCOLOR_ARRAY_STRIDE_EXT\t\t\t\t= 0x8083\n\tCOLOR_ARRAY_COUNT_EXT\t\t\t\t= 0x8084 # 1 I\n\tINDEX_ARRAY_TYPE_EXT\t\t\t\t= 0x8085\n\tINDEX_ARRAY_STRIDE_EXT\t\t\t\t= 0x8086\n\tINDEX_ARRAY_COUNT_EXT\t\t\t\t= 0x8087 # 1 I\n\tTEXTURE_COORD_ARRAY_SIZE_EXT\t\t\t= 0x8088\n\tTEXTURE_COORD_ARRAY_TYPE_EXT\t\t\t= 0x8089\n\tTEXTURE_COORD_ARRAY_STRIDE_EXT\t\t\t= 0x808A\n\tTEXTURE_COORD_ARRAY_COUNT_EXT\t\t\t= 0x808B # 1 I\n\tEDGE_FLAG_ARRAY_STRIDE_EXT\t\t\t= 0x808C\n\tEDGE_FLAG_ARRAY_COUNT_EXT\t\t\t= 0x808D # 1 I\n\tVERTEX_ARRAY_POINTER_EXT\t\t\t= 0x808E\n\tNORMAL_ARRAY_POINTER_EXT\t\t\t= 0x808F\n\tCOLOR_ARRAY_POINTER_EXT\t\t\t\t= 0x8090\n\tINDEX_ARRAY_POINTER_EXT\t\t\t\t= 0x8091\n\tTEXTURE_COORD_ARRAY_POINTER_EXT\t\t\t= 0x8092\n\tEDGE_FLAG_ARRAY_POINTER_EXT\t\t\t= 0x8093\n\n###############################################################################\n\n# Extension #31\nEXT_misc_attribute enum:\n#\t MISC_BIT\t\t\t\t\t = 0x????\n\n###############################################################################\n\n# Extension #32\nSGIS_generate_mipmap enum:\n\tGENERATE_MIPMAP_SGIS\t\t\t\t= 0x8191\n\tGENERATE_MIPMAP_HINT_SGIS\t\t\t= 0x8192 # 1 I\n\n###############################################################################\n\n# Extension #33\nSGIX_clipmap enum:\n\tLINEAR_CLIPMAP_LINEAR_SGIX\t\t\t= 0x8170\n\tTEXTURE_CLIPMAP_CENTER_SGIX\t\t\t= 0x8171\n\tTEXTURE_CLIPMAP_FRAME_SGIX\t\t\t= 0x8172\n\tTEXTURE_CLIPMAP_OFFSET_SGIX\t\t\t= 0x8173\n\tTEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX\t\t= 0x8174\n\tTEXTURE_CLIPMAP_LOD_OFFSET_SGIX\t\t\t= 0x8175\n\tTEXTURE_CLIPMAP_DEPTH_SGIX\t\t\t= 0x8176\n\tMAX_CLIPMAP_DEPTH_SGIX\t\t\t\t= 0x8177 # 1 I\n\tMAX_CLIPMAP_VIRTUAL_DEPTH_SGIX\t\t\t= 0x8178 # 1 I\n\tNEAREST_CLIPMAP_NEAREST_SGIX\t\t\t= 0x844D\n\tNEAREST_CLIPMAP_LINEAR_SGIX\t\t\t= 0x844E\n\tLINEAR_CLIPMAP_NEAREST_SGIX\t\t\t= 0x844F\n\n###############################################################################\n\n# Extension #34\nSGIX_shadow enum:\n\tTEXTURE_COMPARE_SGIX\t\t\t\t= 0x819A\n\tTEXTURE_COMPARE_OPERATOR_SGIX\t\t\t= 0x819B\n\tTEXTURE_LEQUAL_R_SGIX\t\t\t\t= 0x819C\n\tTEXTURE_GEQUAL_R_SGIX\t\t\t\t= 0x819D\n\n###############################################################################\n\n# Extension #35\nSGIS_texture_edge_clamp enum:\n\tCLAMP_TO_EDGE_SGIS\t\t\t\t= 0x812F\n\n###############################################################################\n\n# Extension #36\n# Promoted to ARB_texture_border_clamp\nSGIS_texture_border_clamp enum:\n\tCLAMP_TO_BORDER_SGIS\t\t\t\t= 0x812D\n\n###############################################################################\n\n# Extension #37\nEXT_blend_minmax enum:\n\tFUNC_ADD_EXT\t\t\t\t\t= 0x8006\n\tMIN_EXT\t\t\t\t\t\t= 0x8007\n\tMAX_EXT\t\t\t\t\t\t= 0x8008\n\tBLEND_EQUATION_EXT\t\t\t\t= 0x8009 # 1 I\n\n###############################################################################\n\n# Extension #38\nEXT_blend_subtract enum:\n\tFUNC_SUBTRACT_EXT\t\t\t\t= 0x800A\n\tFUNC_REVERSE_SUBTRACT_EXT\t\t\t= 0x800B\n\n###############################################################################\n\n# No new tokens\n# Extension #39\nEXT_blend_logic_op enum:\n\n###############################################################################\n\n# Extension #40 - GLX_SGI_swap_control\n# Extension #41 - GLX_SGI_video_sync\n# Extension #42 - GLX_SGI_make_current_read\n# Extension #43 - GLX_SGIX_video_source\n# Extension #44 - GLX_EXT_visual_rating\n\n###############################################################################\n\n# Extension #45\nSGIX_interlace enum:\n\tINTERLACE_SGIX\t\t\t\t\t= 0x8094 # 1 I\n\n###############################################################################\n\n# Extension #46\nSGIX_pixel_tiles enum:\n\tPIXEL_TILE_BEST_ALIGNMENT_SGIX\t\t\t= 0x813E # 1 I\n\tPIXEL_TILE_CACHE_INCREMENT_SGIX\t\t\t= 0x813F # 1 I\n\tPIXEL_TILE_WIDTH_SGIX\t\t\t\t= 0x8140 # 1 I\n\tPIXEL_TILE_HEIGHT_SGIX\t\t\t\t= 0x8141 # 1 I\n\tPIXEL_TILE_GRID_WIDTH_SGIX\t\t\t= 0x8142 # 1 I\n\tPIXEL_TILE_GRID_HEIGHT_SGIX\t\t\t= 0x8143 # 1 I\n\tPIXEL_TILE_GRID_DEPTH_SGIX\t\t\t= 0x8144 # 1 I\n\tPIXEL_TILE_CACHE_SIZE_SGIX\t\t\t= 0x8145 # 1 I\n\n###############################################################################\n\n# Extension #47 - GLX_EXT_import_context\n\n###############################################################################\n\n# Extension #48 - skipped\n\n###############################################################################\n\n# Extension #49 - GLX_SGIX_fbconfig\n# Extension #50 - GLX_SGIX_pbuffer\n\n###############################################################################\n\n# Extension #51\nSGIS_texture_select enum:\n\tDUAL_ALPHA4_SGIS\t\t\t\t= 0x8110\n\tDUAL_ALPHA8_SGIS\t\t\t\t= 0x8111\n\tDUAL_ALPHA12_SGIS\t\t\t\t= 0x8112\n\tDUAL_ALPHA16_SGIS\t\t\t\t= 0x8113\n\tDUAL_LUMINANCE4_SGIS\t\t\t\t= 0x8114\n\tDUAL_LUMINANCE8_SGIS\t\t\t\t= 0x8115\n\tDUAL_LUMINANCE12_SGIS\t\t\t\t= 0x8116\n\tDUAL_LUMINANCE16_SGIS\t\t\t\t= 0x8117\n\tDUAL_INTENSITY4_SGIS\t\t\t\t= 0x8118\n\tDUAL_INTENSITY8_SGIS\t\t\t\t= 0x8119\n\tDUAL_INTENSITY12_SGIS\t\t\t\t= 0x811A\n\tDUAL_INTENSITY16_SGIS\t\t\t\t= 0x811B\n\tDUAL_LUMINANCE_ALPHA4_SGIS\t\t\t= 0x811C\n\tDUAL_LUMINANCE_ALPHA8_SGIS\t\t\t= 0x811D\n\tQUAD_ALPHA4_SGIS\t\t\t\t= 0x811E\n\tQUAD_ALPHA8_SGIS\t\t\t\t= 0x811F\n\tQUAD_LUMINANCE4_SGIS\t\t\t\t= 0x8120\n\tQUAD_LUMINANCE8_SGIS\t\t\t\t= 0x8121\n\tQUAD_INTENSITY4_SGIS\t\t\t\t= 0x8122\n\tQUAD_INTENSITY8_SGIS\t\t\t\t= 0x8123\n\tDUAL_TEXTURE_SELECT_SGIS\t\t\t= 0x8124\n\tQUAD_TEXTURE_SELECT_SGIS\t\t\t= 0x8125\n\n###############################################################################\n\n# Extension #52\nSGIX_sprite enum:\n\tSPRITE_SGIX\t\t\t\t\t= 0x8148 # 1 I\n\tSPRITE_MODE_SGIX\t\t\t\t= 0x8149 # 1 I\n\tSPRITE_AXIS_SGIX\t\t\t\t= 0x814A # 3 F\n\tSPRITE_TRANSLATION_SGIX\t\t\t\t= 0x814B # 3 F\n\tSPRITE_AXIAL_SGIX\t\t\t\t= 0x814C\n\tSPRITE_OBJECT_ALIGNED_SGIX\t\t\t= 0x814D\n\tSPRITE_EYE_ALIGNED_SGIX\t\t\t\t= 0x814E\n\n###############################################################################\n\n# Extension #53\nSGIX_texture_multi_buffer enum:\n\tTEXTURE_MULTI_BUFFER_HINT_SGIX\t\t\t= 0x812E\n\n###############################################################################\n\n# Extension #54\n# EXT form promoted from SGIS form; both are included\nEXT_point_parameters enum:\n\tPOINT_SIZE_MIN_EXT\t\t\t\t= 0x8126 # 1 F\n\tPOINT_SIZE_MAX_EXT\t\t\t\t= 0x8127 # 1 F\n\tPOINT_FADE_THRESHOLD_SIZE_EXT\t\t\t= 0x8128 # 1 F\n\tDISTANCE_ATTENUATION_EXT\t\t\t= 0x8129 # 3 F\n\nSGIS_point_parameters enum:\n\tPOINT_SIZE_MIN_SGIS\t\t\t\t= 0x8126 # 1 F\n\tPOINT_SIZE_MAX_SGIS\t\t\t\t= 0x8127 # 1 F\n\tPOINT_FADE_THRESHOLD_SIZE_SGIS\t\t\t= 0x8128 # 1 F\n\tDISTANCE_ATTENUATION_SGIS\t\t\t= 0x8129 # 3 F\n\n###############################################################################\n\n# Extension #55\nSGIX_instruments enum:\n\tINSTRUMENT_BUFFER_POINTER_SGIX\t\t\t= 0x8180\n\tINSTRUMENT_MEASUREMENTS_SGIX\t\t\t= 0x8181 # 1 I\n\n###############################################################################\n\n# Extension #56\nSGIX_texture_scale_bias enum:\n\tPOST_TEXTURE_FILTER_BIAS_SGIX\t\t\t= 0x8179\n\tPOST_TEXTURE_FILTER_SCALE_SGIX\t\t\t= 0x817A\n\tPOST_TEXTURE_FILTER_BIAS_RANGE_SGIX\t\t= 0x817B # 2 F\n\tPOST_TEXTURE_FILTER_SCALE_RANGE_SGIX\t\t= 0x817C # 2 F\n\n###############################################################################\n\n# Extension #57\nSGIX_framezoom enum:\n\tFRAMEZOOM_SGIX\t\t\t\t\t= 0x818B # 1 I\n\tFRAMEZOOM_FACTOR_SGIX\t\t\t\t= 0x818C # 1 I\n\tMAX_FRAMEZOOM_FACTOR_SGIX\t\t\t= 0x818D # 1 I\n\n###############################################################################\n\n# No new tokens\n# Extension #58\nSGIX_tag_sample_buffer enum:\n\n###############################################################################\n\n# Extension #59\nFfdMaskSGIX enum:\n\tTEXTURE_DEFORMATION_BIT_SGIX\t\t\t= 0x00000001\n\tGEOMETRY_DEFORMATION_BIT_SGIX\t\t\t= 0x00000002\nSGIX_polynomial_ffd enum:\n\tGEOMETRY_DEFORMATION_SGIX\t\t\t= 0x8194\n\tTEXTURE_DEFORMATION_SGIX\t\t\t= 0x8195\n\tDEFORMATIONS_MASK_SGIX\t\t\t\t= 0x8196 # 1 I\n\tMAX_DEFORMATION_ORDER_SGIX\t\t\t= 0x8197\n\n###############################################################################\n\n# Extension #60\nSGIX_reference_plane enum:\n\tREFERENCE_PLANE_SGIX\t\t\t\t= 0x817D # 1 I\n\tREFERENCE_PLANE_EQUATION_SGIX\t\t\t= 0x817E # 4 F\n\n###############################################################################\n\n# No new tokens\n# Extension #61\nSGIX_flush_raster enum:\n\n###############################################################################\n\n# Extension #62 - GLX_SGIX_cushion\n\n###############################################################################\n\n# Extension #63\nSGIX_depth_texture enum:\n\tDEPTH_COMPONENT16_SGIX\t\t\t\t= 0x81A5\n\tDEPTH_COMPONENT24_SGIX\t\t\t\t= 0x81A6\n\tDEPTH_COMPONENT32_SGIX\t\t\t\t= 0x81A7\n\n###############################################################################\n\n# Extension #64\nSGIS_fog_function enum:\n\tFOG_FUNC_SGIS\t\t\t\t\t= 0x812A\n\tFOG_FUNC_POINTS_SGIS\t\t\t\t= 0x812B # 1 I\n\tMAX_FOG_FUNC_POINTS_SGIS\t\t\t= 0x812C # 1 I\n\n###############################################################################\n\n# Extension #65\nSGIX_fog_offset enum:\n\tFOG_OFFSET_SGIX\t\t\t\t\t= 0x8198 # 1 I\n\tFOG_OFFSET_VALUE_SGIX\t\t\t\t= 0x8199 # 4 F\n\n###############################################################################\n\n# Extension #66\nHP_image_transform enum:\n\tIMAGE_SCALE_X_HP\t\t\t\t= 0x8155\n\tIMAGE_SCALE_Y_HP\t\t\t\t= 0x8156\n\tIMAGE_TRANSLATE_X_HP\t\t\t\t= 0x8157\n\tIMAGE_TRANSLATE_Y_HP\t\t\t\t= 0x8158\n\tIMAGE_ROTATE_ANGLE_HP\t\t\t\t= 0x8159\n\tIMAGE_ROTATE_ORIGIN_X_HP\t\t\t= 0x815A\n\tIMAGE_ROTATE_ORIGIN_Y_HP\t\t\t= 0x815B\n\tIMAGE_MAG_FILTER_HP\t\t\t\t= 0x815C\n\tIMAGE_MIN_FILTER_HP\t\t\t\t= 0x815D\n\tIMAGE_CUBIC_WEIGHT_HP\t\t\t\t= 0x815E\n\tCUBIC_HP\t\t\t\t\t= 0x815F\n\tAVERAGE_HP\t\t\t\t\t= 0x8160\n\tIMAGE_TRANSFORM_2D_HP\t\t\t\t= 0x8161\n\tPOST_IMAGE_TRANSFORM_COLOR_TABLE_HP\t\t= 0x8162\n\tPROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP\t= 0x8163\n\n###############################################################################\n\n# Extension #67\nHP_convolution_border_modes enum:\n\tIGNORE_BORDER_HP\t\t\t\t= 0x8150\n\tCONSTANT_BORDER_HP\t\t\t\t= 0x8151\n\tREPLICATE_BORDER_HP\t\t\t\t= 0x8153\n\tCONVOLUTION_BORDER_COLOR_HP\t\t\t= 0x8154\n\n###############################################################################\n\n# Extension #68\n# (Unknown token values???)\nINGR_palette_buffer enum:\n\n###############################################################################\n\n# Extension #69\nSGIX_texture_add_env enum:\n\tTEXTURE_ENV_BIAS_SGIX\t\t\t\t= 0x80BE\n\n###############################################################################\n\n# Extension #70 - skipped\n# Extension #71 - skipped\n# Extension #72 - skipped\n# Extension #73 - skipped\n\n###############################################################################\n\n# No new tokens\n# Extension #74\nEXT_color_subtable enum:\n\n###############################################################################\n\n# Extension #75 - GLU_EXT_object_space_tess\n\n###############################################################################\n\n# Extension #76\nPGI_vertex_hints enum:\n\tVERTEX_DATA_HINT_PGI\t\t\t\t= 0x1A22A\n\tVERTEX_CONSISTENT_HINT_PGI\t\t\t= 0x1A22B\n\tMATERIAL_SIDE_HINT_PGI\t\t\t\t= 0x1A22C\n\tMAX_VERTEX_HINT_PGI\t\t\t\t= 0x1A22D\n\tCOLOR3_BIT_PGI\t\t\t\t\t= 0x00010000\n\tCOLOR4_BIT_PGI\t\t\t\t\t= 0x00020000\n\tEDGEFLAG_BIT_PGI\t\t\t\t= 0x00040000\n\tINDEX_BIT_PGI\t\t\t\t\t= 0x00080000\n\tMAT_AMBIENT_BIT_PGI\t\t\t\t= 0x00100000\n\tMAT_AMBIENT_AND_DIFFUSE_BIT_PGI\t\t\t= 0x00200000\n\tMAT_DIFFUSE_BIT_PGI\t\t\t\t= 0x00400000\n\tMAT_EMISSION_BIT_PGI\t\t\t\t= 0x00800000\n\tMAT_COLOR_INDEXES_BIT_PGI\t\t\t= 0x01000000\n\tMAT_SHININESS_BIT_PGI\t\t\t\t= 0x02000000\n\tMAT_SPECULAR_BIT_PGI\t\t\t\t= 0x04000000\n\tNORMAL_BIT_PGI\t\t\t\t\t= 0x08000000\n\tTEXCOORD1_BIT_PGI\t\t\t\t= 0x10000000\n\tTEXCOORD2_BIT_PGI\t\t\t\t= 0x20000000\n\tTEXCOORD3_BIT_PGI\t\t\t\t= 0x40000000\n\tTEXCOORD4_BIT_PGI\t\t\t\t= 0x80000000\n\tVERTEX23_BIT_PGI\t\t\t\t= 0x00000004\n\tVERTEX4_BIT_PGI\t\t\t\t\t= 0x00000008\n\n###############################################################################\n\n# Extension #77\nPGI_misc_hints enum:\n\tPREFER_DOUBLEBUFFER_HINT_PGI\t\t\t= 0x1A1F8\n\tCONSERVE_MEMORY_HINT_PGI\t\t\t= 0x1A1FD\n\tRECLAIM_MEMORY_HINT_PGI\t\t\t\t= 0x1A1FE\n\tNATIVE_GRAPHICS_HANDLE_PGI\t\t\t= 0x1A202\n\tNATIVE_GRAPHICS_BEGIN_HINT_PGI\t\t\t= 0x1A203\n\tNATIVE_GRAPHICS_END_HINT_PGI\t\t\t= 0x1A204\n\tALWAYS_FAST_HINT_PGI\t\t\t\t= 0x1A20C\n\tALWAYS_SOFT_HINT_PGI\t\t\t\t= 0x1A20D\n\tALLOW_DRAW_OBJ_HINT_PGI\t\t\t\t= 0x1A20E\n\tALLOW_DRAW_WIN_HINT_PGI\t\t\t\t= 0x1A20F\n\tALLOW_DRAW_FRG_HINT_PGI\t\t\t\t= 0x1A210\n\tALLOW_DRAW_MEM_HINT_PGI\t\t\t\t= 0x1A211\n\tSTRICT_DEPTHFUNC_HINT_PGI\t\t\t= 0x1A216\n\tSTRICT_LIGHTING_HINT_PGI\t\t\t= 0x1A217\n\tSTRICT_SCISSOR_HINT_PGI\t\t\t\t= 0x1A218\n\tFULL_STIPPLE_HINT_PGI\t\t\t\t= 0x1A219\n\tCLIP_NEAR_HINT_PGI\t\t\t\t= 0x1A220\n\tCLIP_FAR_HINT_PGI\t\t\t\t= 0x1A221\n\tWIDE_LINE_HINT_PGI\t\t\t\t= 0x1A222\n\tBACK_NORMALS_HINT_PGI\t\t\t\t= 0x1A223\n\n###############################################################################\n\n# Extension #78\nEXT_paletted_texture enum:\n\tCOLOR_INDEX1_EXT\t\t\t\t= 0x80E2\n\tCOLOR_INDEX2_EXT\t\t\t\t= 0x80E3\n\tCOLOR_INDEX4_EXT\t\t\t\t= 0x80E4\n\tCOLOR_INDEX8_EXT\t\t\t\t= 0x80E5\n\tCOLOR_INDEX12_EXT\t\t\t\t= 0x80E6\n\tCOLOR_INDEX16_EXT\t\t\t\t= 0x80E7\n\tTEXTURE_INDEX_SIZE_EXT\t\t\t\t= 0x80ED\n\n###############################################################################\n\n# Extension #79\nEXT_clip_volume_hint enum:\n\tCLIP_VOLUME_CLIPPING_HINT_EXT\t\t\t= 0x80F0\n\n###############################################################################\n\n# Extension #80\nSGIX_list_priority enum:\n\tLIST_PRIORITY_SGIX\t\t\t\t= 0x8182\n\n###############################################################################\n\n# Extension #81\nSGIX_ir_instrument1 enum:\n\tIR_INSTRUMENT1_SGIX\t\t\t\t= 0x817F # 1 I\n\n###############################################################################\n\n# Extension #82\nSGIX_calligraphic_fragment enum:\n\tCALLIGRAPHIC_FRAGMENT_SGIX\t\t\t= 0x8183 # 1 I\n\n###############################################################################\n\n# Extension #83 - GLX_SGIX_video_resize\n\n###############################################################################\n\n# Extension #84\nSGIX_texture_lod_bias enum:\n\tTEXTURE_LOD_BIAS_S_SGIX\t\t\t\t= 0x818E\n\tTEXTURE_LOD_BIAS_T_SGIX\t\t\t\t= 0x818F\n\tTEXTURE_LOD_BIAS_R_SGIX\t\t\t\t= 0x8190\n\n###############################################################################\n\n# Extension #85 - skipped\n\n###############################################################################\n\n# Extension #86 - GLX_SGIX_dmbuffer\n\n###############################################################################\n\n# Extension #87 - skipped\n# Extension #88 - skipped\n# Extension #89 - skipped\n\n###############################################################################\n\n# Extension #90\nSGIX_shadow_ambient enum:\n\tSHADOW_AMBIENT_SGIX\t\t\t\t= 0x80BF\n\n###############################################################################\n\n# Extension #91 - GLX_SGIX_swap_group\n# Extension #92 - GLX_SGIX_swap_barrier\n\n###############################################################################\n\n# No new tokens\n# Extension #93\nEXT_index_texture enum:\n\n###############################################################################\n\n# Extension #94\n# Promoted from SGI?\nEXT_index_material enum:\n\tINDEX_MATERIAL_EXT\t\t\t\t= 0x81B8\n\tINDEX_MATERIAL_PARAMETER_EXT\t\t\t= 0x81B9\n\tINDEX_MATERIAL_FACE_EXT\t\t\t\t= 0x81BA\n\n###############################################################################\n\n# Extension #95\n# Promoted from SGI?\nEXT_index_func enum:\n\tINDEX_TEST_EXT\t\t\t\t\t= 0x81B5\n\tINDEX_TEST_FUNC_EXT\t\t\t\t= 0x81B6\n\tINDEX_TEST_REF_EXT\t\t\t\t= 0x81B7\n\n###############################################################################\n\n# Extension #96\n# Promoted from SGI?\nEXT_index_array_formats enum:\n\tIUI_V2F_EXT\t\t\t\t\t= 0x81AD\n\tIUI_V3F_EXT\t\t\t\t\t= 0x81AE\n\tIUI_N3F_V2F_EXT\t\t\t\t\t= 0x81AF\n\tIUI_N3F_V3F_EXT\t\t\t\t\t= 0x81B0\n\tT2F_IUI_V2F_EXT\t\t\t\t\t= 0x81B1\n\tT2F_IUI_V3F_EXT\t\t\t\t\t= 0x81B2\n\tT2F_IUI_N3F_V2F_EXT\t\t\t\t= 0x81B3\n\tT2F_IUI_N3F_V3F_EXT\t\t\t\t= 0x81B4\n\n###############################################################################\n\n# Extension #97\n# Promoted from SGI?\nEXT_compiled_vertex_array enum:\n\tARRAY_ELEMENT_LOCK_FIRST_EXT\t\t\t= 0x81A8\n\tARRAY_ELEMENT_LOCK_COUNT_EXT\t\t\t= 0x81A9\n\n###############################################################################\n\n# Extension #98\n# Promoted from SGI?\nEXT_cull_vertex enum:\n\tCULL_VERTEX_EXT\t\t\t\t\t= 0x81AA\n\tCULL_VERTEX_EYE_POSITION_EXT\t\t\t= 0x81AB\n\tCULL_VERTEX_OBJECT_POSITION_EXT\t\t\t= 0x81AC\n\n###############################################################################\n\n# Extension #99 - skipped\n\n###############################################################################\n\n# Extension #100 - GLU_EXT_nurbs_tessellator\n\n###############################################################################\n\n# Extension #101\nSGIX_ycrcb enum:\n\tYCRCB_422_SGIX\t\t\t\t\t= 0x81BB\n\tYCRCB_444_SGIX\t\t\t\t\t= 0x81BC\n\n###############################################################################\n\n# Extension #102\nSGIX_fragment_lighting enum:\n\tFRAGMENT_LIGHTING_SGIX\t\t\t\t= 0x8400 # 1 I\n\tFRAGMENT_COLOR_MATERIAL_SGIX\t\t\t= 0x8401 # 1 I\n\tFRAGMENT_COLOR_MATERIAL_FACE_SGIX\t\t= 0x8402 # 1 I\n\tFRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX\t\t= 0x8403 # 1 I\n\tMAX_FRAGMENT_LIGHTS_SGIX\t\t\t= 0x8404 # 1 I\n\tMAX_ACTIVE_LIGHTS_SGIX\t\t\t\t= 0x8405 # 1 I\n\tCURRENT_RASTER_NORMAL_SGIX\t\t\t= 0x8406 # 1 I\n\tLIGHT_ENV_MODE_SGIX\t\t\t\t= 0x8407 # 1 I\n\tFRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX\t\t= 0x8408 # 1 I\n\tFRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX\t\t= 0x8409 # 1 I\n\tFRAGMENT_LIGHT_MODEL_AMBIENT_SGIX\t\t= 0x840A # 4 F\n\tFRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX\t= 0x840B # 1 I\n\tFRAGMENT_LIGHT0_SGIX\t\t\t\t= 0x840C # 1 I\n\tFRAGMENT_LIGHT1_SGIX\t\t\t\t= 0x840D\n\tFRAGMENT_LIGHT2_SGIX\t\t\t\t= 0x840E\n\tFRAGMENT_LIGHT3_SGIX\t\t\t\t= 0x840F\n\tFRAGMENT_LIGHT4_SGIX\t\t\t\t= 0x8410\n\tFRAGMENT_LIGHT5_SGIX\t\t\t\t= 0x8411\n\tFRAGMENT_LIGHT6_SGIX\t\t\t\t= 0x8412\n\tFRAGMENT_LIGHT7_SGIX\t\t\t\t= 0x8413\n\n###############################################################################\n\n# Extension #103 - skipped\n# Extension #104 - skipped\n# Extension #105 - skipped\n# Extension #106 - skipped\n# Extension #107 - skipped\n# Extension #108 - skipped\n# Extension #109 - skipped\n\n###############################################################################\n\n# Extension #110\nIBM_rasterpos_clip enum:\n\tRASTER_POSITION_UNCLIPPED_IBM\t\t\t= 0x19262\n\n###############################################################################\n\n# Extension #111\nHP_texture_lighting enum:\n\tTEXTURE_LIGHTING_MODE_HP\t\t\t= 0x8167\n\tTEXTURE_POST_SPECULAR_HP\t\t\t= 0x8168\n\tTEXTURE_PRE_SPECULAR_HP\t\t\t\t= 0x8169\n\n###############################################################################\n\n# Extension #112\nEXT_draw_range_elements enum:\n\tMAX_ELEMENTS_VERTICES_EXT\t\t\t= 0x80E8\n\tMAX_ELEMENTS_INDICES_EXT\t\t\t= 0x80E9\n\n###############################################################################\n\n# Extension #113\nWIN_phong_shading enum:\n\tPHONG_WIN\t\t\t\t\t= 0x80EA\n\tPHONG_HINT_WIN\t\t\t\t\t= 0x80EB\n\n###############################################################################\n\n# Extension #114\nWIN_specular_fog enum:\n\tFOG_SPECULAR_TEXTURE_WIN\t\t\t= 0x80EC\n\n###############################################################################\n\n# Extension #115 - skipped\n# Extension #116 - skipped\n\n###############################################################################\n\n# Extension #117\nEXT_light_texture enum:\n\tFRAGMENT_MATERIAL_EXT\t\t\t\t= 0x8349\n\tFRAGMENT_NORMAL_EXT\t\t\t\t= 0x834A\n\tFRAGMENT_COLOR_EXT\t\t\t\t= 0x834C\n\tATTENUATION_EXT\t\t\t\t\t= 0x834D\n\tSHADOW_ATTENUATION_EXT\t\t\t\t= 0x834E\n\tTEXTURE_APPLICATION_MODE_EXT\t\t\t= 0x834F # 1 I\n\tTEXTURE_LIGHT_EXT\t\t\t\t= 0x8350 # 1 I\n\tTEXTURE_MATERIAL_FACE_EXT\t\t\t= 0x8351 # 1 I\n\tTEXTURE_MATERIAL_PARAMETER_EXT\t\t\t= 0x8352 # 1 I\n\tuse EXT_fog_coord\t\t    FRAGMENT_DEPTH_EXT\n\n###############################################################################\n\n# Extension #118 - skipped\n\n###############################################################################\n\n# Extension #119\nSGIX_blend_alpha_minmax enum:\n\tALPHA_MIN_SGIX\t\t\t\t\t= 0x8320\n\tALPHA_MAX_SGIX\t\t\t\t\t= 0x8321\n\n###############################################################################\n\n# Extension #120 - skipped\n# Extension #121 - skipped\n# Extension #122 - skipped\n# Extension #123 - skipped\n# Extension #124 - skipped\n# Extension #125 - skipped\n\n###############################################################################\n\n# Extension #126\nSGIX_impact_pixel_texture enum:\n\tPIXEL_TEX_GEN_Q_CEILING_SGIX\t\t\t= 0x8184\n\tPIXEL_TEX_GEN_Q_ROUND_SGIX\t\t\t= 0x8185\n\tPIXEL_TEX_GEN_Q_FLOOR_SGIX\t\t\t= 0x8186\n\tPIXEL_TEX_GEN_ALPHA_REPLACE_SGIX\t\t= 0x8187\n\tPIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX\t\t= 0x8188\n\tPIXEL_TEX_GEN_ALPHA_LS_SGIX\t\t\t= 0x8189\n\tPIXEL_TEX_GEN_ALPHA_MS_SGIX\t\t\t= 0x818A\n\n###############################################################################\n\n# Extension #127 - skipped\n# Extension #128 - skipped\n\n###############################################################################\n\n# Extension #129\nEXT_bgra enum:\n\tBGR_EXT\t\t\t\t\t\t= 0x80E0\n\tBGRA_EXT\t\t\t\t\t= 0x80E1\n\n###############################################################################\n\n# Extension #130 - skipped\n# Extension #131 - skipped\n\n###############################################################################\n\n# Extension #132\nSGIX_async enum:\n\tASYNC_MARKER_SGIX\t\t\t\t= 0x8329\n\n###############################################################################\n\n# Extension #133\nSGIX_async_pixel enum:\n\tASYNC_TEX_IMAGE_SGIX\t\t\t\t= 0x835C\n\tASYNC_DRAW_PIXELS_SGIX\t\t\t\t= 0x835D\n\tASYNC_READ_PIXELS_SGIX\t\t\t\t= 0x835E\n\tMAX_ASYNC_TEX_IMAGE_SGIX\t\t\t= 0x835F\n\tMAX_ASYNC_DRAW_PIXELS_SGIX\t\t\t= 0x8360\n\tMAX_ASYNC_READ_PIXELS_SGIX\t\t\t= 0x8361\n\n###############################################################################\n\n# Extension #134\nSGIX_async_histogram enum:\n\tASYNC_HISTOGRAM_SGIX\t\t\t\t= 0x832C\n\tMAX_ASYNC_HISTOGRAM_SGIX\t\t\t= 0x832D\n\n###############################################################################\n\n# Intel has not implemented this; enums never assigned\n# Extension #135\nINTEL_texture_scissor enum:\n#\t TEXTURE_SCISSOR_INTEL\t\t\t\t = 0x????\n#\t TEXTURE_SCISSOR_INTEL\t\t\t\t = 0x????\n#\t TEXTURE_SCISSOR_FUNC_INTEL\t\t\t = 0x????\n#\t TEXTURE_SCISSOR_S_INTEL\t\t\t = 0x????\n#\t TEXTURE_SCISSOR_T_INTEL\t\t\t = 0x????\n#\t TEXTURE_SCISSOR_R_INTEL\t\t\t = 0x????\n\n###############################################################################\n\n# Extension #136\nINTEL_parallel_arrays enum:\n\tPARALLEL_ARRAYS_INTEL\t\t\t\t= 0x83F4\n\tVERTEX_ARRAY_PARALLEL_POINTERS_INTEL\t\t= 0x83F5\n\tNORMAL_ARRAY_PARALLEL_POINTERS_INTEL\t\t= 0x83F6\n\tCOLOR_ARRAY_PARALLEL_POINTERS_INTEL\t\t= 0x83F7\n\tTEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL\t= 0x83F8\n\n###############################################################################\n\n# Extension #137\nHP_occlusion_test enum:\n\tOCCLUSION_TEST_HP\t\t\t\t= 0x8165\n\tOCCLUSION_TEST_RESULT_HP\t\t\t= 0x8166\n\n###############################################################################\n\n# Extension #138\nEXT_pixel_transform enum:\n\tPIXEL_TRANSFORM_2D_EXT\t\t\t\t= 0x8330\n\tPIXEL_MAG_FILTER_EXT\t\t\t\t= 0x8331\n\tPIXEL_MIN_FILTER_EXT\t\t\t\t= 0x8332\n\tPIXEL_CUBIC_WEIGHT_EXT\t\t\t\t= 0x8333\n\tCUBIC_EXT\t\t\t\t\t= 0x8334\n\tAVERAGE_EXT\t\t\t\t\t= 0x8335\n\tPIXEL_TRANSFORM_2D_STACK_DEPTH_EXT\t\t= 0x8336\n\tMAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT\t\t= 0x8337\n\tPIXEL_TRANSFORM_2D_MATRIX_EXT\t\t\t= 0x8338\n\n###############################################################################\n\n# Unknown enum values\n# Extension #139\nEXT_pixel_transform_color_table enum:\n\n#\t PIXEL_TRANSFORM_COLOR_TABLE_EXT\n#\t PROXY_PIXEL_TRANSFORM_COLOR_TABLE_EXT\n\n###############################################################################\n\n# Extension #140 - skipped\n\n###############################################################################\n\n# Extension #141\nEXT_shared_texture_palette enum:\n\tSHARED_TEXTURE_PALETTE_EXT\t\t\t= 0x81FB\n\n###############################################################################\n\n# Extension #142 - GLX_SGIS_blended_overlay\n\n###############################################################################\n\n# Extension #143 - SGIS_shared_multisample\n#\tMULTISAMPLE_SUB_RECT_POSITION_SGIS\t\t= <TBD>\n#\tMULTISAMPLE_SUB_RECT_DIMS_SGIS\t\t\t= <TBD>\n\n###############################################################################\n\n# Extension #144\nEXT_separate_specular_color enum:\n\tLIGHT_MODEL_COLOR_CONTROL_EXT\t\t\t= 0x81F8\n\tSINGLE_COLOR_EXT\t\t\t\t= 0x81F9\n\tSEPARATE_SPECULAR_COLOR_EXT\t\t\t= 0x81FA\n\n###############################################################################\n\n# Extension #145\nEXT_secondary_color enum:\n\tCOLOR_SUM_EXT\t\t\t\t\t= 0x8458 # 1 I\n\tCURRENT_SECONDARY_COLOR_EXT\t\t\t= 0x8459 # 3 F\n\tSECONDARY_COLOR_ARRAY_SIZE_EXT\t\t\t= 0x845A # 1 I\n\tSECONDARY_COLOR_ARRAY_TYPE_EXT\t\t\t= 0x845B # 1 I\n\tSECONDARY_COLOR_ARRAY_STRIDE_EXT\t\t= 0x845C # 1 I\n\tSECONDARY_COLOR_ARRAY_POINTER_EXT\t\t= 0x845D\n\tSECONDARY_COLOR_ARRAY_EXT\t\t\t= 0x845E # 1 I\n\n###############################################################################\n\n# Dead extension - EXT_texture_env_combine was finished instead\n# Extension #146\n#EXT_texture_env enum:\n\n###############################################################################\n\n# Extension #147\nEXT_texture_perturb_normal enum:\n\tPERTURB_EXT\t\t\t\t\t= 0x85AE\n\tTEXTURE_NORMAL_EXT\t\t\t\t= 0x85AF\n\n###############################################################################\n\n# No new tokens\n# Extension #148\n# Diamond ships an otherwise identical IBM_multi_draw_arrays extension;\n#  Dan Brokenshire says this is deprecated and should not be advertised.\nEXT_multi_draw_arrays enum:\n\n###############################################################################\n\n# Extension #149\nEXT_fog_coord enum:\n\tFOG_COORDINATE_SOURCE_EXT\t\t\t= 0x8450 # 1 I\n\tFOG_COORDINATE_EXT\t\t\t\t= 0x8451\n\tFRAGMENT_DEPTH_EXT\t\t\t\t= 0x8452\n\tCURRENT_FOG_COORDINATE_EXT\t\t\t= 0x8453 # 1 F\n\tFOG_COORDINATE_ARRAY_TYPE_EXT\t\t\t= 0x8454 # 1 I\n\tFOG_COORDINATE_ARRAY_STRIDE_EXT\t\t\t= 0x8455 # 1 I\n\tFOG_COORDINATE_ARRAY_POINTER_EXT\t\t= 0x8456\n\tFOG_COORDINATE_ARRAY_EXT\t\t\t= 0x8457 # 1 I\n\n###############################################################################\n\n# Extension #150 - skipped\n# Extension #151 - skipped\n# Extension #152 - skipped\n# Extension #153 - skipped\n# Extension #154 - skipped\n\n###############################################################################\n\n# Extension #155\nREND_screen_coordinates enum:\n\tSCREEN_COORDINATES_REND\t\t\t\t= 0x8490\n\tINVERTED_SCREEN_W_REND\t\t\t\t= 0x8491\n\n###############################################################################\n\n# Extension #156\nEXT_coordinate_frame enum:\n\tTANGENT_ARRAY_EXT\t\t\t\t= 0x8439\n\tBINORMAL_ARRAY_EXT\t\t\t\t= 0x843A\n\tCURRENT_TANGENT_EXT\t\t\t\t= 0x843B\n\tCURRENT_BINORMAL_EXT\t\t\t\t= 0x843C\n\tTANGENT_ARRAY_TYPE_EXT\t\t\t\t= 0x843E\n\tTANGENT_ARRAY_STRIDE_EXT\t\t\t= 0x843F\n\tBINORMAL_ARRAY_TYPE_EXT\t\t\t\t= 0x8440\n\tBINORMAL_ARRAY_STRIDE_EXT\t\t\t= 0x8441\n\tTANGENT_ARRAY_POINTER_EXT\t\t\t= 0x8442\n\tBINORMAL_ARRAY_POINTER_EXT\t\t\t= 0x8443\n\tMAP1_TANGENT_EXT\t\t\t\t= 0x8444\n\tMAP2_TANGENT_EXT\t\t\t\t= 0x8445\n\tMAP1_BINORMAL_EXT\t\t\t\t= 0x8446\n\tMAP2_BINORMAL_EXT\t\t\t\t= 0x8447\n\n###############################################################################\n\n# Extension #157 - skipped\n\n###############################################################################\n\n# Extension #158\nEXT_texture_env_combine enum:\n\tCOMBINE_EXT\t\t\t\t\t= 0x8570\n\tCOMBINE_RGB_EXT\t\t\t\t\t= 0x8571\n\tCOMBINE_ALPHA_EXT\t\t\t\t= 0x8572\n\tRGB_SCALE_EXT\t\t\t\t\t= 0x8573\n\tADD_SIGNED_EXT\t\t\t\t\t= 0x8574\n\tINTERPOLATE_EXT\t\t\t\t\t= 0x8575\n\tCONSTANT_EXT\t\t\t\t\t= 0x8576\n\tPRIMARY_COLOR_EXT\t\t\t\t= 0x8577\n\tPREVIOUS_EXT\t\t\t\t\t= 0x8578\n\tSOURCE0_RGB_EXT\t\t\t\t\t= 0x8580\n\tSOURCE1_RGB_EXT\t\t\t\t\t= 0x8581\n\tSOURCE2_RGB_EXT\t\t\t\t\t= 0x8582\n\tSOURCE0_ALPHA_EXT\t\t\t\t= 0x8588\n\tSOURCE1_ALPHA_EXT\t\t\t\t= 0x8589\n\tSOURCE2_ALPHA_EXT\t\t\t\t= 0x858A\n\tOPERAND0_RGB_EXT\t\t\t\t= 0x8590\n\tOPERAND1_RGB_EXT\t\t\t\t= 0x8591\n\tOPERAND2_RGB_EXT\t\t\t\t= 0x8592\n\tOPERAND0_ALPHA_EXT\t\t\t\t= 0x8598\n\tOPERAND1_ALPHA_EXT\t\t\t\t= 0x8599\n\tOPERAND2_ALPHA_EXT\t\t\t\t= 0x859A\n\n###############################################################################\n\n# Extension #159\nAPPLE_specular_vector enum:\n\tLIGHT_MODEL_SPECULAR_VECTOR_APPLE\t\t= 0x85B0\n\n###############################################################################\n\n# Extension #160\nAPPLE_transform_hint enum:\n\tTRANSFORM_HINT_APPLE\t\t\t\t= 0x85B1\n\n###############################################################################\n\n# Extension #161\nSGIX_fog_scale enum:\n\tFOG_SCALE_SGIX\t\t\t\t\t= 0x81FC\n\tFOG_SCALE_VALUE_SGIX\t\t\t\t= 0x81FD\n\n###############################################################################\n\n# Extension #162 - skipped\n\n###############################################################################\n\n# Extension #163\nSUNX_constant_data enum:\n\tUNPACK_CONSTANT_DATA_SUNX\t\t\t= 0x81D5\n\tTEXTURE_CONSTANT_DATA_SUNX\t\t\t= 0x81D6\n\n###############################################################################\n\n# Extension #164\nSUN_global_alpha enum:\n\tGLOBAL_ALPHA_SUN\t\t\t\t= 0x81D9\n\tGLOBAL_ALPHA_FACTOR_SUN\t\t\t\t= 0x81DA\n\n###############################################################################\n\n# Extension #165\nSUN_triangle_list enum:\n\tRESTART_SUN\t\t\t\t\t= 0x0001\n\tREPLACE_MIDDLE_SUN\t\t\t\t= 0x0002\n\tREPLACE_OLDEST_SUN\t\t\t\t= 0x0003\n\tTRIANGLE_LIST_SUN\t\t\t\t= 0x81D7\n\tREPLACEMENT_CODE_SUN\t\t\t\t= 0x81D8\n\tREPLACEMENT_CODE_ARRAY_SUN\t\t\t= 0x85C0\n\tREPLACEMENT_CODE_ARRAY_TYPE_SUN\t\t\t= 0x85C1\n\tREPLACEMENT_CODE_ARRAY_STRIDE_SUN\t\t= 0x85C2\n\tREPLACEMENT_CODE_ARRAY_POINTER_SUN\t\t= 0x85C3\n\tR1UI_V3F_SUN\t\t\t\t\t= 0x85C4\n\tR1UI_C4UB_V3F_SUN\t\t\t\t= 0x85C5\n\tR1UI_C3F_V3F_SUN\t\t\t\t= 0x85C6\n\tR1UI_N3F_V3F_SUN\t\t\t\t= 0x85C7\n\tR1UI_C4F_N3F_V3F_SUN\t\t\t\t= 0x85C8\n\tR1UI_T2F_V3F_SUN\t\t\t\t= 0x85C9\n\tR1UI_T2F_N3F_V3F_SUN\t\t\t\t= 0x85CA\n\tR1UI_T2F_C4F_N3F_V3F_SUN\t\t\t= 0x85CB\n\n###############################################################################\n\n# No new tokens\n# Extension #166\nSUN_vertex enum:\n\n###############################################################################\n\n# Extension #167 - WGL_EXT_display_color_table\n# Extension #168 - WGL_EXT_extensions_string\n# Extension #169 - WGL_EXT_make_current_read\n# Extension #170 - WGL_EXT_pixel_format\n# Extension #171 - WGL_EXT_pbuffer\n# Extension #172 - WGL_EXT_swap_control\n\n###############################################################################\n\n# Extension #173\nEXT_blend_func_separate enum:\n\tBLEND_DST_RGB_EXT\t\t\t\t= 0x80C8\n\tBLEND_SRC_RGB_EXT\t\t\t\t= 0x80C9\n\tBLEND_DST_ALPHA_EXT\t\t\t\t= 0x80CA\n\tBLEND_SRC_ALPHA_EXT\t\t\t\t= 0x80CB\n\n###############################################################################\n\n# Extension #174\nINGR_color_clamp enum:\n\tRED_MIN_CLAMP_INGR\t\t\t\t= 0x8560\n\tGREEN_MIN_CLAMP_INGR\t\t\t\t= 0x8561\n\tBLUE_MIN_CLAMP_INGR\t\t\t\t= 0x8562\n\tALPHA_MIN_CLAMP_INGR\t\t\t\t= 0x8563\n\tRED_MAX_CLAMP_INGR\t\t\t\t= 0x8564\n\tGREEN_MAX_CLAMP_INGR\t\t\t\t= 0x8565\n\tBLUE_MAX_CLAMP_INGR\t\t\t\t= 0x8566\n\tALPHA_MAX_CLAMP_INGR\t\t\t\t= 0x8567\n\n###############################################################################\n\n# Extension #175\nINGR_interlace_read enum:\n\tINTERLACE_READ_INGR\t\t\t\t= 0x8568\n\n###############################################################################\n\n# Extension #176\nEXT_stencil_wrap enum:\n\tINCR_WRAP_EXT\t\t\t\t\t= 0x8507\n\tDECR_WRAP_EXT\t\t\t\t\t= 0x8508\n\n###############################################################################\n\n# Extension #177 - skipped\n\n###############################################################################\n\n# Extension #178\nEXT_422_pixels enum:\n\t422_EXT\t\t\t\t\t\t= 0x80CC\n\t422_REV_EXT\t\t\t\t\t= 0x80CD\n\t422_AVERAGE_EXT\t\t\t\t\t= 0x80CE\n\t422_REV_AVERAGE_EXT\t\t\t\t= 0x80CF\n\n###############################################################################\n\n# Extension #179\nNV_texgen_reflection enum:\n\tNORMAL_MAP_NV\t\t\t\t\t= 0x8511\n\tREFLECTION_MAP_NV\t\t\t\t= 0x8512\n\n###############################################################################\n\n# Extension #180 - skipped\n# Extension #181 - skipped\n\n###############################################################################\n\n# Is this shipping? No extension number assigned.\n# Extension #?\nEXT_texture_cube_map enum:\n\tNORMAL_MAP_EXT\t\t\t\t\t= 0x8511\n\tREFLECTION_MAP_EXT\t\t\t\t= 0x8512\n\tTEXTURE_CUBE_MAP_EXT\t\t\t\t= 0x8513\n\tTEXTURE_BINDING_CUBE_MAP_EXT\t\t\t= 0x8514\n\tTEXTURE_CUBE_MAP_POSITIVE_X_EXT\t\t\t= 0x8515\n\tTEXTURE_CUBE_MAP_NEGATIVE_X_EXT\t\t\t= 0x8516\n\tTEXTURE_CUBE_MAP_POSITIVE_Y_EXT\t\t\t= 0x8517\n\tTEXTURE_CUBE_MAP_NEGATIVE_Y_EXT\t\t\t= 0x8518\n\tTEXTURE_CUBE_MAP_POSITIVE_Z_EXT\t\t\t= 0x8519\n\tTEXTURE_CUBE_MAP_NEGATIVE_Z_EXT\t\t\t= 0x851A\n\tPROXY_TEXTURE_CUBE_MAP_EXT\t\t\t= 0x851B\n\tMAX_CUBE_MAP_TEXTURE_SIZE_EXT\t\t\t= 0x851C\n\n###############################################################################\n\n# Extension #182\nSUN_convolution_border_modes enum:\n\tWRAP_BORDER_SUN\t\t\t\t\t= 0x81D4\n\n###############################################################################\n\n# Extension #183 - GLX_SUN_transparent_index\n\n###############################################################################\n\n# Extension #184 - skipped\n\n###############################################################################\n\n# No new tokens\n# Extension #185\nEXT_texture_env_add enum:\n\n###############################################################################\n\n# Extension #186\nEXT_texture_lod_bias enum:\n\tMAX_TEXTURE_LOD_BIAS_EXT\t\t\t= 0x84FD\n\tTEXTURE_FILTER_CONTROL_EXT\t\t\t= 0x8500\n\tTEXTURE_LOD_BIAS_EXT\t\t\t\t= 0x8501\n\n###############################################################################\n\n# Extension #187\nEXT_texture_filter_anisotropic enum:\n\tTEXTURE_MAX_ANISOTROPY_EXT\t\t\t= 0x84FE\n\tMAX_TEXTURE_MAX_ANISOTROPY_EXT\t\t\t= 0x84FF\n\n###############################################################################\n\n# Extension #188\nEXT_vertex_weighting enum:\n\tMODELVIEW0_STACK_DEPTH_EXT\t\t\t= GL_MODELVIEW_STACK_DEPTH\n\tMODELVIEW1_STACK_DEPTH_EXT\t\t\t= 0x8502\n\tMODELVIEW0_MATRIX_EXT\t\t\t\t= GL_MODELVIEW_MATRIX\n\tMODELVIEW1_MATRIX_EXT\t\t\t\t= 0x8506\n\tVERTEX_WEIGHTING_EXT\t\t\t\t= 0x8509\n\tMODELVIEW0_EXT\t\t\t\t\t= GL_MODELVIEW\n\tMODELVIEW1_EXT\t\t\t\t\t= 0x850A\n\tCURRENT_VERTEX_WEIGHT_EXT\t\t\t= 0x850B\n\tVERTEX_WEIGHT_ARRAY_EXT\t\t\t\t= 0x850C\n\tVERTEX_WEIGHT_ARRAY_SIZE_EXT\t\t\t= 0x850D\n\tVERTEX_WEIGHT_ARRAY_TYPE_EXT\t\t\t= 0x850E\n\tVERTEX_WEIGHT_ARRAY_STRIDE_EXT\t\t\t= 0x850F\n\tVERTEX_WEIGHT_ARRAY_POINTER_EXT\t\t\t= 0x8510\n\n###############################################################################\n\n# Extension #189\nNV_light_max_exponent enum:\n\tMAX_SHININESS_NV\t\t\t\t= 0x8504\n\tMAX_SPOT_EXPONENT_NV\t\t\t\t= 0x8505\n\n###############################################################################\n\n# Extension #190\nNV_vertex_array_range enum:\n\tVERTEX_ARRAY_RANGE_NV\t\t\t\t= 0x851D\n\tVERTEX_ARRAY_RANGE_LENGTH_NV\t\t\t= 0x851E\n\tVERTEX_ARRAY_RANGE_VALID_NV\t\t\t= 0x851F\n\tMAX_VERTEX_ARRAY_RANGE_ELEMENT_NV\t\t= 0x8520\n\tVERTEX_ARRAY_RANGE_POINTER_NV\t\t\t= 0x8521\n\n###############################################################################\n\n# Extension #191\nNV_register_combiners enum:\n\tREGISTER_COMBINERS_NV\t\t\t\t= 0x8522\n\tVARIABLE_A_NV\t\t\t\t\t= 0x8523\n\tVARIABLE_B_NV\t\t\t\t\t= 0x8524\n\tVARIABLE_C_NV\t\t\t\t\t= 0x8525\n\tVARIABLE_D_NV\t\t\t\t\t= 0x8526\n\tVARIABLE_E_NV\t\t\t\t\t= 0x8527\n\tVARIABLE_F_NV\t\t\t\t\t= 0x8528\n\tVARIABLE_G_NV\t\t\t\t\t= 0x8529\n\tCONSTANT_COLOR0_NV\t\t\t\t= 0x852A\n\tCONSTANT_COLOR1_NV\t\t\t\t= 0x852B\n\tPRIMARY_COLOR_NV\t\t\t\t= 0x852C\n\tSECONDARY_COLOR_NV\t\t\t\t= 0x852D\n\tSPARE0_NV\t\t\t\t\t= 0x852E\n\tSPARE1_NV\t\t\t\t\t= 0x852F\n\tDISCARD_NV\t\t\t\t\t= 0x8530\n\tE_TIMES_F_NV\t\t\t\t\t= 0x8531\n\tSPARE0_PLUS_SECONDARY_COLOR_NV\t\t\t= 0x8532\n\tUNSIGNED_IDENTITY_NV\t\t\t\t= 0x8536\n\tUNSIGNED_INVERT_NV\t\t\t\t= 0x8537\n\tEXPAND_NORMAL_NV\t\t\t\t= 0x8538\n\tEXPAND_NEGATE_NV\t\t\t\t= 0x8539\n\tHALF_BIAS_NORMAL_NV\t\t\t\t= 0x853A\n\tHALF_BIAS_NEGATE_NV\t\t\t\t= 0x853B\n\tSIGNED_IDENTITY_NV\t\t\t\t= 0x853C\n\tSIGNED_NEGATE_NV\t\t\t\t= 0x853D\n\tSCALE_BY_TWO_NV\t\t\t\t\t= 0x853E\n\tSCALE_BY_FOUR_NV\t\t\t\t= 0x853F\n\tSCALE_BY_ONE_HALF_NV\t\t\t\t= 0x8540\n\tBIAS_BY_NEGATIVE_ONE_HALF_NV\t\t\t= 0x8541\n\tCOMBINER_INPUT_NV\t\t\t\t= 0x8542\n\tCOMBINER_MAPPING_NV\t\t\t\t= 0x8543\n\tCOMBINER_COMPONENT_USAGE_NV\t\t\t= 0x8544\n\tCOMBINER_AB_DOT_PRODUCT_NV\t\t\t= 0x8545\n\tCOMBINER_CD_DOT_PRODUCT_NV\t\t\t= 0x8546\n\tCOMBINER_MUX_SUM_NV\t\t\t\t= 0x8547\n\tCOMBINER_SCALE_NV\t\t\t\t= 0x8548\n\tCOMBINER_BIAS_NV\t\t\t\t= 0x8549\n\tCOMBINER_AB_OUTPUT_NV\t\t\t\t= 0x854A\n\tCOMBINER_CD_OUTPUT_NV\t\t\t\t= 0x854B\n\tCOMBINER_SUM_OUTPUT_NV\t\t\t\t= 0x854C\n\tMAX_GENERAL_COMBINERS_NV\t\t\t= 0x854D\n\tNUM_GENERAL_COMBINERS_NV\t\t\t= 0x854E\n\tCOLOR_SUM_CLAMP_NV\t\t\t\t= 0x854F\n\tCOMBINER0_NV\t\t\t\t\t= 0x8550\n\tCOMBINER1_NV\t\t\t\t\t= 0x8551\n\tCOMBINER2_NV\t\t\t\t\t= 0x8552\n\tCOMBINER3_NV\t\t\t\t\t= 0x8553\n\tCOMBINER4_NV\t\t\t\t\t= 0x8554\n\tCOMBINER5_NV\t\t\t\t\t= 0x8555\n\tCOMBINER6_NV\t\t\t\t\t= 0x8556\n\tCOMBINER7_NV\t\t\t\t\t= 0x8557\n\tuse ARB_multitexture\t\t    TEXTURE0_ARB\n\tuse ARB_multitexture\t\t    TEXTURE1_ARB\n\tuse BlendingFactorDest\t\t    ZERO\n\tuse DrawBufferMode\t\t    NONE\n\tuse GetPName\t\t\t    FOG\n\n###############################################################################\n\n# Extension #192\nNV_fog_distance enum:\n\tFOG_DISTANCE_MODE_NV\t\t\t\t= 0x855A\n\tEYE_RADIAL_NV\t\t\t\t\t= 0x855B\n\tEYE_PLANE_ABSOLUTE_NV\t\t\t\t= 0x855C\n\tuse TextureGenParameter\t\t    EYE_PLANE\n\n###############################################################################\n\n# Extension #193\nNV_texgen_emboss enum:\n\tEMBOSS_LIGHT_NV\t\t\t\t\t= 0x855D\n\tEMBOSS_CONSTANT_NV\t\t\t\t= 0x855E\n\tEMBOSS_MAP_NV\t\t\t\t\t= 0x855F\n\n###############################################################################\n\n# No new tokens\n# Extension #194\nNV_blend_square enum:\n\n###############################################################################\n\n# Extension #195\nNV_texture_env_combine4 enum:\n\tCOMBINE4_NV\t\t\t\t\t= 0x8503\n\tSOURCE3_RGB_NV\t\t\t\t\t= 0x8583\n\tSOURCE3_ALPHA_NV\t\t\t\t= 0x858B\n\tOPERAND3_RGB_NV\t\t\t\t\t= 0x8593\n\tOPERAND3_ALPHA_NV\t\t\t\t= 0x859B\n\n###############################################################################\n\n# No new tokens\n# Extension #196\nMESA_resize_buffers enum:\n\n###############################################################################\n\n# No new tokens\n# Extension #197\nMESA_window_pos enum:\n\n###############################################################################\n\n# Extension #198\nEXT_texture_compression_s3tc enum:\n\tCOMPRESSED_RGB_S3TC_DXT1_EXT\t\t\t= 0x83F0\n\tCOMPRESSED_RGBA_S3TC_DXT1_EXT\t\t\t= 0x83F1\n\tCOMPRESSED_RGBA_S3TC_DXT3_EXT\t\t\t= 0x83F2\n\tCOMPRESSED_RGBA_S3TC_DXT5_EXT\t\t\t= 0x83F3\n\n###############################################################################\n\n# Extension #199\nIBM_cull_vertex enum:\n\tCULL_VERTEX_IBM\t\t\t\t\t= 103050\n\n###############################################################################\n\n# No new tokens\n# Extension #200\nIBM_multimode_draw_arrays enum:\n\n###############################################################################\n\n# Extension #201\nIBM_vertex_array_lists enum:\n\tVERTEX_ARRAY_LIST_IBM\t\t\t\t= 103070\n\tNORMAL_ARRAY_LIST_IBM\t\t\t\t= 103071\n\tCOLOR_ARRAY_LIST_IBM\t\t\t\t= 103072\n\tINDEX_ARRAY_LIST_IBM\t\t\t\t= 103073\n\tTEXTURE_COORD_ARRAY_LIST_IBM\t\t\t= 103074\n\tEDGE_FLAG_ARRAY_LIST_IBM\t\t\t= 103075\n\tFOG_COORDINATE_ARRAY_LIST_IBM\t\t\t= 103076\n\tSECONDARY_COLOR_ARRAY_LIST_IBM\t\t\t= 103077\n\tVERTEX_ARRAY_LIST_STRIDE_IBM\t\t\t= 103080\n\tNORMAL_ARRAY_LIST_STRIDE_IBM\t\t\t= 103081\n\tCOLOR_ARRAY_LIST_STRIDE_IBM\t\t\t= 103082\n\tINDEX_ARRAY_LIST_STRIDE_IBM\t\t\t= 103083\n\tTEXTURE_COORD_ARRAY_LIST_STRIDE_IBM\t\t= 103084\n\tEDGE_FLAG_ARRAY_LIST_STRIDE_IBM\t\t\t= 103085\n\tFOG_COORDINATE_ARRAY_LIST_STRIDE_IBM\t\t= 103086\n\tSECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM\t\t= 103087\n\n###############################################################################\n\n# Extension #202\nSGIX_subsample enum:\n\tPACK_SUBSAMPLE_RATE_SGIX\t\t\t= 0x85A0\n\tUNPACK_SUBSAMPLE_RATE_SGIX\t\t\t= 0x85A1\n\tPIXEL_SUBSAMPLE_4444_SGIX\t\t\t= 0x85A2\n\tPIXEL_SUBSAMPLE_2424_SGIX\t\t\t= 0x85A3\n\tPIXEL_SUBSAMPLE_4242_SGIX\t\t\t= 0x85A4\n\n###############################################################################\n\n# Extension #203\nSGIX_ycrcb_subsample enum:\n\tPACK_SUBSAMPLE_RATE_SGIX\t\t\t= 0x85A0\n\tUNPACK_SUBSAMPLE_RATE_SGIX\t\t\t= 0x85A1\n\tPIXEL_SUBSAMPLE_4444_SGIX\t\t\t= 0x85A2\n\tPIXEL_SUBSAMPLE_2424_SGIX\t\t\t= 0x85A3\n\tPIXEL_SUBSAMPLE_4242_SGIX\t\t\t= 0x85A4\n\n###############################################################################\n\n# Extension #204\nSGIX_ycrcba enum:\n\tYCRCB_SGIX\t\t\t\t\t= 0x8318\n\tYCRCBA_SGIX\t\t\t\t\t= 0x8319\n\n###############################################################################\n\n# Extension #205\nSGI_depth_pass_instrument enum:\n\tDEPTH_PASS_INSTRUMENT_SGIX\t\t\t= 0x8310\n\tDEPTH_PASS_INSTRUMENT_COUNTERS_SGIX\t\t= 0x8311\n\tDEPTH_PASS_INSTRUMENT_MAX_SGIX\t\t\t= 0x8312\n\n###############################################################################\n\n# Extension #206\n3DFX_texture_compression_FXT1 enum:\n\tCOMPRESSED_RGB_FXT1_3DFX\t\t\t= 0x86B0\n\tCOMPRESSED_RGBA_FXT1_3DFX\t\t\t= 0x86B1\n\n###############################################################################\n\n# Extension #207\n3DFX_multisample enum:\n\tMULTISAMPLE_3DFX\t\t\t\t= 0x86B2\n\tSAMPLE_BUFFERS_3DFX\t\t\t\t= 0x86B3\n\tSAMPLES_3DFX\t\t\t\t\t= 0x86B4\n\tMULTISAMPLE_BIT_3DFX\t\t\t\t= 0x20000000\n\n###############################################################################\n\n# No new tokens\n# Extension #208\n3DFX_tbuffer enum:\n\n###############################################################################\n\n# Extension #209\nEXT_multisample enum:\n\tMULTISAMPLE_EXT\t\t\t\t\t= 0x809D\n\tSAMPLE_ALPHA_TO_MASK_EXT\t\t\t= 0x809E\n\tSAMPLE_ALPHA_TO_ONE_EXT\t\t\t\t= 0x809F\n\tSAMPLE_MASK_EXT\t\t\t\t\t= 0x80A0\n\t1PASS_EXT\t\t\t\t\t= 0x80A1\n\t2PASS_0_EXT\t\t\t\t\t= 0x80A2\n\t2PASS_1_EXT\t\t\t\t\t= 0x80A3\n\t4PASS_0_EXT\t\t\t\t\t= 0x80A4\n\t4PASS_1_EXT\t\t\t\t\t= 0x80A5\n\t4PASS_2_EXT\t\t\t\t\t= 0x80A6\n\t4PASS_3_EXT\t\t\t\t\t= 0x80A7\n\tSAMPLE_BUFFERS_EXT\t\t\t\t= 0x80A8 # 1 I\n\tSAMPLES_EXT\t\t\t\t\t= 0x80A9 # 1 I\n\tSAMPLE_MASK_VALUE_EXT\t\t\t\t= 0x80AA # 1 F\n\tSAMPLE_MASK_INVERT_EXT\t\t\t\t= 0x80AB # 1 I\n\tSAMPLE_PATTERN_EXT\t\t\t\t= 0x80AC # 1 I\n\tMULTISAMPLE_BIT_EXT\t\t\t\t= 0x20000000\n\n###############################################################################\n\n# Extension #210\nSGIX_vertex_preclip enum:\n\tVERTEX_PRECLIP_SGIX\t\t\t\t= 0x83EE\n\tVERTEX_PRECLIP_HINT_SGIX\t\t\t= 0x83EF\n\n###############################################################################\n\n# Extension #211\nSGIX_convolution_accuracy enum:\n\tCONVOLUTION_HINT_SGIX\t\t\t\t= 0x8316 # 1 I\n\n###############################################################################\n\n# Extension #212\nSGIX_resample enum:\n\tPACK_RESAMPLE_SGIX\t\t\t\t= 0x842C\n\tUNPACK_RESAMPLE_SGIX\t\t\t\t= 0x842D\n\tRESAMPLE_REPLICATE_SGIX\t\t\t\t= 0x842E\n\tRESAMPLE_ZERO_FILL_SGIX\t\t\t\t= 0x842F\n\tRESAMPLE_DECIMATE_SGIX\t\t\t\t= 0x8430\n\n###############################################################################\n\n# Extension #213\nSGIS_point_line_texgen enum:\n\tEYE_DISTANCE_TO_POINT_SGIS\t\t\t= 0x81F0\n\tOBJECT_DISTANCE_TO_POINT_SGIS\t\t\t= 0x81F1\n\tEYE_DISTANCE_TO_LINE_SGIS\t\t\t= 0x81F2\n\tOBJECT_DISTANCE_TO_LINE_SGIS\t\t\t= 0x81F3\n\tEYE_POINT_SGIS\t\t\t\t\t= 0x81F4\n\tOBJECT_POINT_SGIS\t\t\t\t= 0x81F5\n\tEYE_LINE_SGIS\t\t\t\t\t= 0x81F6\n\tOBJECT_LINE_SGIS\t\t\t\t= 0x81F7\n\n###############################################################################\n\n# Extension #214\nSGIS_texture_color_mask enum:\n\tTEXTURE_COLOR_WRITEMASK_SGIS\t\t\t= 0x81EF\n\n###############################################################################\n\n# Extension #220\n# Promoted to ARB_texture_env_dot3, enum values changed\nEXT_texture_env_dot3 enum:\n\tDOT3_RGB_EXT\t\t\t\t\t= 0x8740\n\tDOT3_RGBA_EXT\t\t\t\t\t= 0x8741\n\n###############################################################################\n\n# Extension #221\nATI_texture_mirror_once enum:\n\tMIRROR_CLAMP_ATI\t\t\t\t= 0x8742\n\tMIRROR_CLAMP_TO_EDGE_ATI\t\t\t= 0x8743\n\n###############################################################################\n\n# Extension #222\nNV_fence enum:\n\tALL_COMPLETED_NV\t\t\t\t= 0x84F2\n\tFENCE_STATUS_NV\t\t\t\t\t= 0x84F3\n\tFENCE_CONDITION_NV\t\t\t\t= 0x84F4\n\n###############################################################################\n\n# Extension #224\nIBM_texture_mirrored_repeat enum:\n\tMIRRORED_REPEAT_IBM\t\t\t\t= 0x8370\n\n###############################################################################\n\n# Extension #225\nNV_evaluators enum:\n\tEVAL_2D_NV\t\t\t\t\t= 0x86C0\n\tEVAL_TRIANGULAR_2D_NV\t\t\t\t= 0x86C1\n\tMAP_TESSELLATION_NV\t\t\t\t= 0x86C2\n\tMAP_ATTRIB_U_ORDER_NV\t\t\t\t= 0x86C3\n\tMAP_ATTRIB_V_ORDER_NV\t\t\t\t= 0x86C4\n\tEVAL_FRACTIONAL_TESSELLATION_NV\t\t\t= 0x86C5\n\tEVAL_VERTEX_ATTRIB0_NV\t\t\t\t= 0x86C6\n\tEVAL_VERTEX_ATTRIB1_NV\t\t\t\t= 0x86C7\n\tEVAL_VERTEX_ATTRIB2_NV\t\t\t\t= 0x86C8\n\tEVAL_VERTEX_ATTRIB3_NV\t\t\t\t= 0x86C9\n\tEVAL_VERTEX_ATTRIB4_NV\t\t\t\t= 0x86CA\n\tEVAL_VERTEX_ATTRIB5_NV\t\t\t\t= 0x86CB\n\tEVAL_VERTEX_ATTRIB6_NV\t\t\t\t= 0x86CC\n\tEVAL_VERTEX_ATTRIB7_NV\t\t\t\t= 0x86CD\n\tEVAL_VERTEX_ATTRIB8_NV\t\t\t\t= 0x86CE\n\tEVAL_VERTEX_ATTRIB9_NV\t\t\t\t= 0x86CF\n\tEVAL_VERTEX_ATTRIB10_NV\t\t\t\t= 0x86D0\n\tEVAL_VERTEX_ATTRIB11_NV\t\t\t\t= 0x86D1\n\tEVAL_VERTEX_ATTRIB12_NV\t\t\t\t= 0x86D2\n\tEVAL_VERTEX_ATTRIB13_NV\t\t\t\t= 0x86D3\n\tEVAL_VERTEX_ATTRIB14_NV\t\t\t\t= 0x86D4\n\tEVAL_VERTEX_ATTRIB15_NV\t\t\t\t= 0x86D5\n\tMAX_MAP_TESSELLATION_NV\t\t\t\t= 0x86D6\n\tMAX_RATIONAL_EVAL_ORDER_NV\t\t\t= 0x86D7\n\n###############################################################################\n\n# Extension #226\nNV_packed_depth_stencil enum:\n\tDEPTH_STENCIL_NV\t\t\t\t= 0x84F9\n\tUNSIGNED_INT_24_8_NV\t\t\t\t= 0x84FA\n\n###############################################################################\n\n# Extension #227\nNV_register_combiners2 enum:\n\tPER_STAGE_CONSTANTS_NV\t\t\t\t= 0x8535\n\n###############################################################################\n\n# No new tokens\n# Extension #228\nNV_texture_compression_vtc enum:\n\n###############################################################################\n\n# Extension #229\nNV_texture_rectangle enum:\n\tTEXTURE_RECTANGLE_NV\t\t\t\t= 0x84F5\n\tTEXTURE_BINDING_RECTANGLE_NV\t\t\t= 0x84F6\n\tPROXY_TEXTURE_RECTANGLE_NV\t\t\t= 0x84F7\n\tMAX_RECTANGLE_TEXTURE_SIZE_NV\t\t\t= 0x84F8\n\n###############################################################################\n\n# Extension #230\nNV_texture_shader enum:\n\tOFFSET_TEXTURE_RECTANGLE_NV\t\t\t= 0x864C\n\tOFFSET_TEXTURE_RECTANGLE_SCALE_NV\t\t= 0x864D\n\tDOT_PRODUCT_TEXTURE_RECTANGLE_NV\t\t= 0x864E\n\tRGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV\t\t= 0x86D9\n\tUNSIGNED_INT_S8_S8_8_8_NV\t\t\t= 0x86DA\n\tUNSIGNED_INT_8_8_S8_S8_REV_NV\t\t\t= 0x86DB\n\tDSDT_MAG_INTENSITY_NV\t\t\t\t= 0x86DC\n\tSHADER_CONSISTENT_NV\t\t\t\t= 0x86DD\n\tTEXTURE_SHADER_NV\t\t\t\t= 0x86DE\n\tSHADER_OPERATION_NV\t\t\t\t= 0x86DF\n\tCULL_MODES_NV\t\t\t\t\t= 0x86E0\n\tOFFSET_TEXTURE_MATRIX_NV\t\t\t= 0x86E1\n\tOFFSET_TEXTURE_SCALE_NV\t\t\t\t= 0x86E2\n\tOFFSET_TEXTURE_BIAS_NV\t\t\t\t= 0x86E3\n\tOFFSET_TEXTURE_2D_MATRIX_NV\t\t\t= GL_OFFSET_TEXTURE_MATRIX_NV\n\tOFFSET_TEXTURE_2D_SCALE_NV\t\t\t= GL_OFFSET_TEXTURE_SCALE_NV\n\tOFFSET_TEXTURE_2D_BIAS_NV\t\t\t= GL_OFFSET_TEXTURE_BIAS_NV\n\tPREVIOUS_TEXTURE_INPUT_NV\t\t\t= 0x86E4\n\tCONST_EYE_NV\t\t\t\t\t= 0x86E5\n\tPASS_THROUGH_NV\t\t\t\t\t= 0x86E6\n\tCULL_FRAGMENT_NV\t\t\t\t= 0x86E7\n\tOFFSET_TEXTURE_2D_NV\t\t\t\t= 0x86E8\n\tDEPENDENT_AR_TEXTURE_2D_NV\t\t\t= 0x86E9\n\tDEPENDENT_GB_TEXTURE_2D_NV\t\t\t= 0x86EA\n\tDOT_PRODUCT_NV\t\t\t\t\t= 0x86EC\n\tDOT_PRODUCT_DEPTH_REPLACE_NV\t\t\t= 0x86ED\n\tDOT_PRODUCT_TEXTURE_2D_NV\t\t\t= 0x86EE\n\tDOT_PRODUCT_TEXTURE_CUBE_MAP_NV\t\t\t= 0x86F0\n\tDOT_PRODUCT_DIFFUSE_CUBE_MAP_NV\t\t\t= 0x86F1\n\tDOT_PRODUCT_REFLECT_CUBE_MAP_NV\t\t\t= 0x86F2\n\tDOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV\t= 0x86F3\n\tHILO_NV\t\t\t\t\t\t= 0x86F4\n\tDSDT_NV\t\t\t\t\t\t= 0x86F5\n\tDSDT_MAG_NV\t\t\t\t\t= 0x86F6\n\tDSDT_MAG_VIB_NV\t\t\t\t\t= 0x86F7\n\tHILO16_NV\t\t\t\t\t= 0x86F8\n\tSIGNED_HILO_NV\t\t\t\t\t= 0x86F9\n\tSIGNED_HILO16_NV\t\t\t\t= 0x86FA\n\tSIGNED_RGBA_NV\t\t\t\t\t= 0x86FB\n\tSIGNED_RGBA8_NV\t\t\t\t\t= 0x86FC\n\tSIGNED_RGB_NV\t\t\t\t\t= 0x86FE\n\tSIGNED_RGB8_NV\t\t\t\t\t= 0x86FF\n\tSIGNED_LUMINANCE_NV\t\t\t\t= 0x8701\n\tSIGNED_LUMINANCE8_NV\t\t\t\t= 0x8702\n\tSIGNED_LUMINANCE_ALPHA_NV\t\t\t= 0x8703\n\tSIGNED_LUMINANCE8_ALPHA8_NV\t\t\t= 0x8704\n\tSIGNED_ALPHA_NV\t\t\t\t\t= 0x8705\n\tSIGNED_ALPHA8_NV\t\t\t\t= 0x8706\n\tSIGNED_INTENSITY_NV\t\t\t\t= 0x8707\n\tSIGNED_INTENSITY8_NV\t\t\t\t= 0x8708\n\tDSDT8_NV\t\t\t\t\t= 0x8709\n\tDSDT8_MAG8_NV\t\t\t\t\t= 0x870A\n\tDSDT8_MAG8_INTENSITY8_NV\t\t\t= 0x870B\n\tSIGNED_RGB_UNSIGNED_ALPHA_NV\t\t\t= 0x870C\n\tSIGNED_RGB8_UNSIGNED_ALPHA8_NV\t\t\t= 0x870D\n\tHI_SCALE_NV\t\t\t\t\t= 0x870E\n\tLO_SCALE_NV\t\t\t\t\t= 0x870F\n\tDS_SCALE_NV\t\t\t\t\t= 0x8710\n\tDT_SCALE_NV\t\t\t\t\t= 0x8711\n\tMAGNITUDE_SCALE_NV\t\t\t\t= 0x8712\n\tVIBRANCE_SCALE_NV\t\t\t\t= 0x8713\n\tHI_BIAS_NV\t\t\t\t\t= 0x8714\n\tLO_BIAS_NV\t\t\t\t\t= 0x8715\n\tDS_BIAS_NV\t\t\t\t\t= 0x8716\n\tDT_BIAS_NV\t\t\t\t\t= 0x8717\n\tMAGNITUDE_BIAS_NV\t\t\t\t= 0x8718\n\tVIBRANCE_BIAS_NV\t\t\t\t= 0x8719\n\tTEXTURE_BORDER_VALUES_NV\t\t\t= 0x871A\n\tTEXTURE_HI_SIZE_NV\t\t\t\t= 0x871B\n\tTEXTURE_LO_SIZE_NV\t\t\t\t= 0x871C\n\tTEXTURE_DS_SIZE_NV\t\t\t\t= 0x871D\n\tTEXTURE_DT_SIZE_NV\t\t\t\t= 0x871E\n\tTEXTURE_MAG_SIZE_NV\t\t\t\t= 0x871F\n\n###############################################################################\n\n# Extension #231\nNV_texture_shader2 enum:\n\tDOT_PRODUCT_TEXTURE_3D_NV\t\t\t= 0x86EF\n\n###############################################################################\n\n# Extension #232\nNV_vertex_array_range2 enum:\n\tVERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV\t\t= 0x8533\n\n###############################################################################\n\n# Extension #233\nNV_vertex_program enum:\n\tVERTEX_PROGRAM_NV\t\t\t\t= 0x8620\n\tVERTEX_STATE_PROGRAM_NV\t\t\t\t= 0x8621\n\tATTRIB_ARRAY_SIZE_NV\t\t\t\t= 0x8623\n\tATTRIB_ARRAY_STRIDE_NV\t\t\t\t= 0x8624\n\tATTRIB_ARRAY_TYPE_NV\t\t\t\t= 0x8625\n\tCURRENT_ATTRIB_NV\t\t\t\t= 0x8626\n\tPROGRAM_LENGTH_NV\t\t\t\t= 0x8627\n\tPROGRAM_STRING_NV\t\t\t\t= 0x8628\n\tMODELVIEW_PROJECTION_NV\t\t\t\t= 0x8629\n\tIDENTITY_NV\t\t\t\t\t= 0x862A\n\tINVERSE_NV\t\t\t\t\t= 0x862B\n\tTRANSPOSE_NV\t\t\t\t\t= 0x862C\n\tINVERSE_TRANSPOSE_NV\t\t\t\t= 0x862D\n\tMAX_TRACK_MATRIX_STACK_DEPTH_NV\t\t\t= 0x862E\n\tMAX_TRACK_MATRICES_NV\t\t\t\t= 0x862F\n\tMATRIX0_NV\t\t\t\t\t= 0x8630\n\tMATRIX1_NV\t\t\t\t\t= 0x8631\n\tMATRIX2_NV\t\t\t\t\t= 0x8632\n\tMATRIX3_NV\t\t\t\t\t= 0x8633\n\tMATRIX4_NV\t\t\t\t\t= 0x8634\n\tMATRIX5_NV\t\t\t\t\t= 0x8635\n\tMATRIX6_NV\t\t\t\t\t= 0x8636\n\tMATRIX7_NV\t\t\t\t\t= 0x8637\n##################\n#\n#\tReserved:\n#\n#\tMATRIX8_NV\t\t\t\t\t= 0x8638\n#\tMATRIX9_NV\t\t\t\t\t= 0x8639\n#\tMATRIX10_NV\t\t\t\t\t= 0x863A\n#\tMATRIX11_NV\t\t\t\t\t= 0x863B\n#\tMATRIX12_NV\t\t\t\t\t= 0x863C\n#\tMATRIX13_NV\t\t\t\t\t= 0x863D\n#\tMATRIX14_NV\t\t\t\t\t= 0x863E\n#\tMATRIX15_NV\t\t\t\t\t= 0x863F\n#\n###################\n\tCURRENT_MATRIX_STACK_DEPTH_NV\t\t\t= 0x8640\n\tCURRENT_MATRIX_NV\t\t\t\t= 0x8641\n\tVERTEX_PROGRAM_POINT_SIZE_NV\t\t\t= 0x8642\n\tVERTEX_PROGRAM_TWO_SIDE_NV\t\t\t= 0x8643\n\tPROGRAM_PARAMETER_NV\t\t\t\t= 0x8644\n\tATTRIB_ARRAY_POINTER_NV\t\t\t\t= 0x8645\n\tPROGRAM_TARGET_NV\t\t\t\t= 0x8646\n\tPROGRAM_RESIDENT_NV\t\t\t\t= 0x8647\n\tTRACK_MATRIX_NV\t\t\t\t\t= 0x8648\n\tTRACK_MATRIX_TRANSFORM_NV\t\t\t= 0x8649\n\tVERTEX_PROGRAM_BINDING_NV\t\t\t= 0x864A\n\tPROGRAM_ERROR_POSITION_NV\t\t\t= 0x864B\n\tVERTEX_ATTRIB_ARRAY0_NV\t\t\t\t= 0x8650\n\tVERTEX_ATTRIB_ARRAY1_NV\t\t\t\t= 0x8651\n\tVERTEX_ATTRIB_ARRAY2_NV\t\t\t\t= 0x8652\n\tVERTEX_ATTRIB_ARRAY3_NV\t\t\t\t= 0x8653\n\tVERTEX_ATTRIB_ARRAY4_NV\t\t\t\t= 0x8654\n\tVERTEX_ATTRIB_ARRAY5_NV\t\t\t\t= 0x8655\n\tVERTEX_ATTRIB_ARRAY6_NV\t\t\t\t= 0x8656\n\tVERTEX_ATTRIB_ARRAY7_NV\t\t\t\t= 0x8657\n\tVERTEX_ATTRIB_ARRAY8_NV\t\t\t\t= 0x8658\n\tVERTEX_ATTRIB_ARRAY9_NV\t\t\t\t= 0x8659\n\tVERTEX_ATTRIB_ARRAY10_NV\t\t\t= 0x865A\n\tVERTEX_ATTRIB_ARRAY11_NV\t\t\t= 0x865B\n\tVERTEX_ATTRIB_ARRAY12_NV\t\t\t= 0x865C\n\tVERTEX_ATTRIB_ARRAY13_NV\t\t\t= 0x865D\n\tVERTEX_ATTRIB_ARRAY14_NV\t\t\t= 0x865E\n\tVERTEX_ATTRIB_ARRAY15_NV\t\t\t= 0x865F\n\tMAP1_VERTEX_ATTRIB0_4_NV\t\t\t= 0x8660\n\tMAP1_VERTEX_ATTRIB1_4_NV\t\t\t= 0x8661\n\tMAP1_VERTEX_ATTRIB2_4_NV\t\t\t= 0x8662\n\tMAP1_VERTEX_ATTRIB3_4_NV\t\t\t= 0x8663\n\tMAP1_VERTEX_ATTRIB4_4_NV\t\t\t= 0x8664\n\tMAP1_VERTEX_ATTRIB5_4_NV\t\t\t= 0x8665\n\tMAP1_VERTEX_ATTRIB6_4_NV\t\t\t= 0x8666\n\tMAP1_VERTEX_ATTRIB7_4_NV\t\t\t= 0x8667\n\tMAP1_VERTEX_ATTRIB8_4_NV\t\t\t= 0x8668\n\tMAP1_VERTEX_ATTRIB9_4_NV\t\t\t= 0x8669\n\tMAP1_VERTEX_ATTRIB10_4_NV\t\t\t= 0x866A\n\tMAP1_VERTEX_ATTRIB11_4_NV\t\t\t= 0x866B\n\tMAP1_VERTEX_ATTRIB12_4_NV\t\t\t= 0x866C\n\tMAP1_VERTEX_ATTRIB13_4_NV\t\t\t= 0x866D\n\tMAP1_VERTEX_ATTRIB14_4_NV\t\t\t= 0x866E\n\tMAP1_VERTEX_ATTRIB15_4_NV\t\t\t= 0x866F\n\tMAP2_VERTEX_ATTRIB0_4_NV\t\t\t= 0x8670\n\tMAP2_VERTEX_ATTRIB1_4_NV\t\t\t= 0x8671\n\tMAP2_VERTEX_ATTRIB2_4_NV\t\t\t= 0x8672\n\tMAP2_VERTEX_ATTRIB3_4_NV\t\t\t= 0x8673\n\tMAP2_VERTEX_ATTRIB4_4_NV\t\t\t= 0x8674\n\tMAP2_VERTEX_ATTRIB5_4_NV\t\t\t= 0x8675\n\tMAP2_VERTEX_ATTRIB6_4_NV\t\t\t= 0x8676\n\tMAP2_VERTEX_ATTRIB7_4_NV\t\t\t= 0x8677\n\tMAP2_VERTEX_ATTRIB8_4_NV\t\t\t= 0x8678\n\tMAP2_VERTEX_ATTRIB9_4_NV\t\t\t= 0x8679\n\tMAP2_VERTEX_ATTRIB10_4_NV\t\t\t= 0x867A\n\tMAP2_VERTEX_ATTRIB11_4_NV\t\t\t= 0x867B\n\tMAP2_VERTEX_ATTRIB12_4_NV\t\t\t= 0x867C\n\tMAP2_VERTEX_ATTRIB13_4_NV\t\t\t= 0x867D\n\tMAP2_VERTEX_ATTRIB14_4_NV\t\t\t= 0x867E\n\tMAP2_VERTEX_ATTRIB15_4_NV\t\t\t= 0x867F\n\n###############################################################################\n\n# Extension #235\nSGIX_texture_coordinate_clamp enum:\n\tTEXTURE_MAX_CLAMP_S_SGIX\t\t\t= 0x8369\n\tTEXTURE_MAX_CLAMP_T_SGIX\t\t\t= 0x836A\n\tTEXTURE_MAX_CLAMP_R_SGIX\t\t\t= 0x836B\n\n###############################################################################\n\n# Extension #236\nSGIX_scalebias_hint enum:\n\tSCALEBIAS_HINT_SGIX\t\t\t\t= 0x8322\n\n###############################################################################\n\n# Extension #237 - GLX_OML_swap_method\n# Extension #238 - GLX_OML_sync_control\n\n###############################################################################\n\n# Extension #239\nOML_interlace enum:\n\tINTERLACE_OML\t\t\t\t\t= 0x8980\n\tINTERLACE_READ_OML\t\t\t\t= 0x8981\n\n###############################################################################\n\n# Extension #240\nOML_subsample enum:\n\tFORMAT_SUBSAMPLE_24_24_OML\t\t\t= 0x8982\n\tFORMAT_SUBSAMPLE_244_244_OML\t\t\t= 0x8983\n\n###############################################################################\n\n# Extension #241\nOML_resample enum:\n\tPACK_RESAMPLE_OML\t\t\t\t= 0x8984\n\tUNPACK_RESAMPLE_OML\t\t\t\t= 0x8985\n\tRESAMPLE_REPLICATE_OML\t\t\t\t= 0x8986\n\tRESAMPLE_ZERO_FILL_OML\t\t\t\t= 0x8987\n\tRESAMPLE_AVERAGE_OML\t\t\t\t= 0x8988\n\tRESAMPLE_DECIMATE_OML\t\t\t\t= 0x8989\n\n###############################################################################\n\n# Extension #242 - WGL_OML_sync_control\n\n###############################################################################\n\n# Extension #243\nNV_copy_depth_to_color enum:\n\tDEPTH_STENCIL_TO_RGBA_NV\t\t\t= 0x886E\n\tDEPTH_STENCIL_TO_BGRA_NV\t\t\t= 0x886F\n\n###############################################################################\n\n# Extension #244\nATI_envmap_bumpmap enum:\n\tBUMP_ROT_MATRIX_ATI\t\t\t\t= 0x8775\n\tBUMP_ROT_MATRIX_SIZE_ATI\t\t\t= 0x8776\n\tBUMP_NUM_TEX_UNITS_ATI\t\t\t\t= 0x8777\n\tBUMP_TEX_UNITS_ATI\t\t\t\t= 0x8778\n\tDUDV_ATI\t\t\t\t\t= 0x8779\n\tDU8DV8_ATI\t\t\t\t\t= 0x877A\n\tBUMP_ENVMAP_ATI\t\t\t\t\t= 0x877B\n\tBUMP_TARGET_ATI\t\t\t\t\t= 0x877C\n\n###############################################################################\n\n# Extension #245\nATI_fragment_shader enum:\n\tFRAGMENT_SHADER_ATI\t\t\t\t= 0x8920\n\tREG_0_ATI\t\t\t\t\t= 0x8921\n\tREG_1_ATI\t\t\t\t\t= 0x8922\n\tREG_2_ATI\t\t\t\t\t= 0x8923\n\tREG_3_ATI\t\t\t\t\t= 0x8924\n\tREG_4_ATI\t\t\t\t\t= 0x8925\n\tREG_5_ATI\t\t\t\t\t= 0x8926\n\tREG_6_ATI\t\t\t\t\t= 0x8927\n\tREG_7_ATI\t\t\t\t\t= 0x8928\n\tREG_8_ATI\t\t\t\t\t= 0x8929\n\tREG_9_ATI\t\t\t\t\t= 0x892A\n\tREG_10_ATI\t\t\t\t\t= 0x892B\n\tREG_11_ATI\t\t\t\t\t= 0x892C\n\tREG_12_ATI\t\t\t\t\t= 0x892D\n\tREG_13_ATI\t\t\t\t\t= 0x892E\n\tREG_14_ATI\t\t\t\t\t= 0x892F\n\tREG_15_ATI\t\t\t\t\t= 0x8930\n\tREG_16_ATI\t\t\t\t\t= 0x8931\n\tREG_17_ATI\t\t\t\t\t= 0x8932\n\tREG_18_ATI\t\t\t\t\t= 0x8933\n\tREG_19_ATI\t\t\t\t\t= 0x8934\n\tREG_20_ATI\t\t\t\t\t= 0x8935\n\tREG_21_ATI\t\t\t\t\t= 0x8936\n\tREG_22_ATI\t\t\t\t\t= 0x8937\n\tREG_23_ATI\t\t\t\t\t= 0x8938\n\tREG_24_ATI\t\t\t\t\t= 0x8939\n\tREG_25_ATI\t\t\t\t\t= 0x893A\n\tREG_26_ATI\t\t\t\t\t= 0x893B\n\tREG_27_ATI\t\t\t\t\t= 0x893C\n\tREG_28_ATI\t\t\t\t\t= 0x893D\n\tREG_29_ATI\t\t\t\t\t= 0x893E\n\tREG_30_ATI\t\t\t\t\t= 0x893F\n\tREG_31_ATI\t\t\t\t\t= 0x8940\n\tCON_0_ATI\t\t\t\t\t= 0x8941\n\tCON_1_ATI\t\t\t\t\t= 0x8942\n\tCON_2_ATI\t\t\t\t\t= 0x8943\n\tCON_3_ATI\t\t\t\t\t= 0x8944\n\tCON_4_ATI\t\t\t\t\t= 0x8945\n\tCON_5_ATI\t\t\t\t\t= 0x8946\n\tCON_6_ATI\t\t\t\t\t= 0x8947\n\tCON_7_ATI\t\t\t\t\t= 0x8948\n\tCON_8_ATI\t\t\t\t\t= 0x8949\n\tCON_9_ATI\t\t\t\t\t= 0x894A\n\tCON_10_ATI\t\t\t\t\t= 0x894B\n\tCON_11_ATI\t\t\t\t\t= 0x894C\n\tCON_12_ATI\t\t\t\t\t= 0x894D\n\tCON_13_ATI\t\t\t\t\t= 0x894E\n\tCON_14_ATI\t\t\t\t\t= 0x894F\n\tCON_15_ATI\t\t\t\t\t= 0x8950\n\tCON_16_ATI\t\t\t\t\t= 0x8951\n\tCON_17_ATI\t\t\t\t\t= 0x8952\n\tCON_18_ATI\t\t\t\t\t= 0x8953\n\tCON_19_ATI\t\t\t\t\t= 0x8954\n\tCON_20_ATI\t\t\t\t\t= 0x8955\n\tCON_21_ATI\t\t\t\t\t= 0x8956\n\tCON_22_ATI\t\t\t\t\t= 0x8957\n\tCON_23_ATI\t\t\t\t\t= 0x8958\n\tCON_24_ATI\t\t\t\t\t= 0x8959\n\tCON_25_ATI\t\t\t\t\t= 0x895A\n\tCON_26_ATI\t\t\t\t\t= 0x895B\n\tCON_27_ATI\t\t\t\t\t= 0x895C\n\tCON_28_ATI\t\t\t\t\t= 0x895D\n\tCON_29_ATI\t\t\t\t\t= 0x895E\n\tCON_30_ATI\t\t\t\t\t= 0x895F\n\tCON_31_ATI\t\t\t\t\t= 0x8960\n\tMOV_ATI\t\t\t\t\t\t= 0x8961\n\tADD_ATI\t\t\t\t\t\t= 0x8963\n\tMUL_ATI\t\t\t\t\t\t= 0x8964\n\tSUB_ATI\t\t\t\t\t\t= 0x8965\n\tDOT3_ATI\t\t\t\t\t= 0x8966\n\tDOT4_ATI\t\t\t\t\t= 0x8967\n\tMAD_ATI\t\t\t\t\t\t= 0x8968\n\tLERP_ATI\t\t\t\t\t= 0x8969\n\tCND_ATI\t\t\t\t\t\t= 0x896A\n\tCND0_ATI\t\t\t\t\t= 0x896B\n\tDOT2_ADD_ATI\t\t\t\t\t= 0x896C\n\tSECONDARY_INTERPOLATOR_ATI\t\t\t= 0x896D\n\tNUM_FRAGMENT_REGISTERS_ATI\t\t\t= 0x896E\n\tNUM_FRAGMENT_CONSTANTS_ATI\t\t\t= 0x896F\n\tNUM_PASSES_ATI\t\t\t\t\t= 0x8970\n\tNUM_INSTRUCTIONS_PER_PASS_ATI\t\t\t= 0x8971\n\tNUM_INSTRUCTIONS_TOTAL_ATI\t\t\t= 0x8972\n\tNUM_INPUT_INTERPOLATOR_COMPONENTS_ATI\t\t= 0x8973\n\tNUM_LOOPBACK_COMPONENTS_ATI\t\t\t= 0x8974\n\tCOLOR_ALPHA_PAIRING_ATI\t\t\t\t= 0x8975\n\tSWIZZLE_STR_ATI\t\t\t\t\t= 0x8976\n\tSWIZZLE_STQ_ATI\t\t\t\t\t= 0x8977\n\tSWIZZLE_STR_DR_ATI\t\t\t\t= 0x8978\n\tSWIZZLE_STQ_DQ_ATI\t\t\t\t= 0x8979\n\tSWIZZLE_STRQ_ATI\t\t\t\t= 0x897A\n\tSWIZZLE_STRQ_DQ_ATI\t\t\t\t= 0x897B\n\tRED_BIT_ATI\t\t\t\t\t= 0x00000001\n\tGREEN_BIT_ATI\t\t\t\t\t= 0x00000002\n\tBLUE_BIT_ATI\t\t\t\t\t= 0x00000004\n\t2X_BIT_ATI\t\t\t\t\t= 0x00000001\n\t4X_BIT_ATI\t\t\t\t\t= 0x00000002\n\t8X_BIT_ATI\t\t\t\t\t= 0x00000004\n\tHALF_BIT_ATI\t\t\t\t\t= 0x00000008\n\tQUARTER_BIT_ATI\t\t\t\t\t= 0x00000010\n\tEIGHTH_BIT_ATI\t\t\t\t\t= 0x00000020\n\tSATURATE_BIT_ATI\t\t\t\t= 0x00000040\n\t2X_BIT_ATI\t\t\t\t\t= 0x00000001\n\tCOMP_BIT_ATI\t\t\t\t\t= 0x00000002\n\tNEGATE_BIT_ATI\t\t\t\t\t= 0x00000004\n\tBIAS_BIT_ATI\t\t\t\t\t= 0x00000008\n\n###############################################################################\n\n# Extension #246\nATI_pn_triangles enum:\n\tPN_TRIANGLES_ATI\t\t\t\t= 0x87F0\n\tMAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI\t\t= 0x87F1\n\tPN_TRIANGLES_POINT_MODE_ATI\t\t\t= 0x87F2\n\tPN_TRIANGLES_NORMAL_MODE_ATI\t\t\t= 0x87F3\n\tPN_TRIANGLES_TESSELATION_LEVEL_ATI\t\t= 0x87F4\n\tPN_TRIANGLES_POINT_MODE_LINEAR_ATI\t\t= 0x87F5\n\tPN_TRIANGLES_POINT_MODE_CUBIC_ATI\t\t= 0x87F6\n\tPN_TRIANGLES_NORMAL_MODE_LINEAR_ATI\t\t= 0x87F7\n\tPN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI\t\t= 0x87F8\n\n###############################################################################\n\n# Extension #247\nATI_vertex_array_object enum:\n\tSTATIC_ATI\t\t\t\t\t= 0x8760\n\tDYNAMIC_ATI\t\t\t\t\t= 0x8761\n\tPRESERVE_ATI\t\t\t\t\t= 0x8762\n\tDISCARD_ATI\t\t\t\t\t= 0x8763\n\tOBJECT_BUFFER_SIZE_ATI\t\t\t\t= 0x8764\n\tOBJECT_BUFFER_USAGE_ATI\t\t\t\t= 0x8765\n\tARRAY_OBJECT_BUFFER_ATI\t\t\t\t= 0x8766\n\tARRAY_OBJECT_OFFSET_ATI\t\t\t\t= 0x8767\n\n###############################################################################\n\n# Extension #248\nEXT_vertex_shader enum:\n\tVERTEX_SHADER_EXT\t\t\t\t= 0x8780\n\tVERTEX_SHADER_BINDING_EXT\t\t\t= 0x8781\n\tOP_INDEX_EXT\t\t\t\t\t= 0x8782\n\tOP_NEGATE_EXT\t\t\t\t\t= 0x8783\n\tOP_DOT3_EXT\t\t\t\t\t= 0x8784\n\tOP_DOT4_EXT\t\t\t\t\t= 0x8785\n\tOP_MUL_EXT\t\t\t\t\t= 0x8786\n\tOP_ADD_EXT\t\t\t\t\t= 0x8787\n\tOP_MADD_EXT\t\t\t\t\t= 0x8788\n\tOP_FRAC_EXT\t\t\t\t\t= 0x8789\n\tOP_MAX_EXT\t\t\t\t\t= 0x878A\n\tOP_MIN_EXT\t\t\t\t\t= 0x878B\n\tOP_SET_GE_EXT\t\t\t\t\t= 0x878C\n\tOP_SET_LT_EXT\t\t\t\t\t= 0x878D\n\tOP_CLAMP_EXT\t\t\t\t\t= 0x878E\n\tOP_FLOOR_EXT\t\t\t\t\t= 0x878F\n\tOP_ROUND_EXT\t\t\t\t\t= 0x8790\n\tOP_EXP_BASE_2_EXT\t\t\t\t= 0x8791\n\tOP_LOG_BASE_2_EXT\t\t\t\t= 0x8792\n\tOP_POWER_EXT\t\t\t\t\t= 0x8793\n\tOP_RECIP_EXT\t\t\t\t\t= 0x8794\n\tOP_RECIP_SQRT_EXT\t\t\t\t= 0x8795\n\tOP_SUB_EXT\t\t\t\t\t= 0x8796\n\tOP_CROSS_PRODUCT_EXT\t\t\t\t= 0x8797\n\tOP_MULTIPLY_MATRIX_EXT\t\t\t\t= 0x8798\n\tOP_MOV_EXT\t\t\t\t\t= 0x8799\n\tOUTPUT_VERTEX_EXT\t\t\t\t= 0x879A\n\tOUTPUT_COLOR0_EXT\t\t\t\t= 0x879B\n\tOUTPUT_COLOR1_EXT\t\t\t\t= 0x879C\n\tOUTPUT_TEXTURE_COORD0_EXT\t\t\t= 0x879D\n\tOUTPUT_TEXTURE_COORD1_EXT\t\t\t= 0x879E\n\tOUTPUT_TEXTURE_COORD2_EXT\t\t\t= 0x879F\n\tOUTPUT_TEXTURE_COORD3_EXT\t\t\t= 0x87A0\n\tOUTPUT_TEXTURE_COORD4_EXT\t\t\t= 0x87A1\n\tOUTPUT_TEXTURE_COORD5_EXT\t\t\t= 0x87A2\n\tOUTPUT_TEXTURE_COORD6_EXT\t\t\t= 0x87A3\n\tOUTPUT_TEXTURE_COORD7_EXT\t\t\t= 0x87A4\n\tOUTPUT_TEXTURE_COORD8_EXT\t\t\t= 0x87A5\n\tOUTPUT_TEXTURE_COORD9_EXT\t\t\t= 0x87A6\n\tOUTPUT_TEXTURE_COORD10_EXT\t\t\t= 0x87A7\n\tOUTPUT_TEXTURE_COORD11_EXT\t\t\t= 0x87A8\n\tOUTPUT_TEXTURE_COORD12_EXT\t\t\t= 0x87A9\n\tOUTPUT_TEXTURE_COORD13_EXT\t\t\t= 0x87AA\n\tOUTPUT_TEXTURE_COORD14_EXT\t\t\t= 0x87AB\n\tOUTPUT_TEXTURE_COORD15_EXT\t\t\t= 0x87AC\n\tOUTPUT_TEXTURE_COORD16_EXT\t\t\t= 0x87AD\n\tOUTPUT_TEXTURE_COORD17_EXT\t\t\t= 0x87AE\n\tOUTPUT_TEXTURE_COORD18_EXT\t\t\t= 0x87AF\n\tOUTPUT_TEXTURE_COORD19_EXT\t\t\t= 0x87B0\n\tOUTPUT_TEXTURE_COORD20_EXT\t\t\t= 0x87B1\n\tOUTPUT_TEXTURE_COORD21_EXT\t\t\t= 0x87B2\n\tOUTPUT_TEXTURE_COORD22_EXT\t\t\t= 0x87B3\n\tOUTPUT_TEXTURE_COORD23_EXT\t\t\t= 0x87B4\n\tOUTPUT_TEXTURE_COORD24_EXT\t\t\t= 0x87B5\n\tOUTPUT_TEXTURE_COORD25_EXT\t\t\t= 0x87B6\n\tOUTPUT_TEXTURE_COORD26_EXT\t\t\t= 0x87B7\n\tOUTPUT_TEXTURE_COORD27_EXT\t\t\t= 0x87B8\n\tOUTPUT_TEXTURE_COORD28_EXT\t\t\t= 0x87B9\n\tOUTPUT_TEXTURE_COORD29_EXT\t\t\t= 0x87BA\n\tOUTPUT_TEXTURE_COORD30_EXT\t\t\t= 0x87BB\n\tOUTPUT_TEXTURE_COORD31_EXT\t\t\t= 0x87BC\n\tOUTPUT_FOG_EXT\t\t\t\t\t= 0x87BD\n\tSCALAR_EXT\t\t\t\t\t= 0x87BE\n\tVECTOR_EXT\t\t\t\t\t= 0x87BF\n\tMATRIX_EXT\t\t\t\t\t= 0x87C0\n\tVARIANT_EXT\t\t\t\t\t= 0x87C1\n\tINVARIANT_EXT\t\t\t\t\t= 0x87C2\n\tLOCAL_CONSTANT_EXT\t\t\t\t= 0x87C3\n\tLOCAL_EXT\t\t\t\t\t= 0x87C4\n\tMAX_VERTEX_SHADER_INSTRUCTIONS_EXT\t\t= 0x87C5\n\tMAX_VERTEX_SHADER_VARIANTS_EXT\t\t\t= 0x87C6\n\tMAX_VERTEX_SHADER_INVARIANTS_EXT\t\t= 0x87C7\n\tMAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT\t\t= 0x87C8\n\tMAX_VERTEX_SHADER_LOCALS_EXT\t\t\t= 0x87C9\n\tMAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT\t= 0x87CA\n\tMAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT\t= 0x87CB\n\tMAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = 0x87CC\n\tMAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT\t= 0x87CD\n\tMAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT\t\t= 0x87CE\n\tVERTEX_SHADER_INSTRUCTIONS_EXT\t\t\t= 0x87CF\n\tVERTEX_SHADER_VARIANTS_EXT\t\t\t= 0x87D0\n\tVERTEX_SHADER_INVARIANTS_EXT\t\t\t= 0x87D1\n\tVERTEX_SHADER_LOCAL_CONSTANTS_EXT\t\t= 0x87D2\n\tVERTEX_SHADER_LOCALS_EXT\t\t\t= 0x87D3\n\tVERTEX_SHADER_OPTIMIZED_EXT\t\t\t= 0x87D4\n\tX_EXT\t\t\t\t\t\t= 0x87D5\n\tY_EXT\t\t\t\t\t\t= 0x87D6\n\tZ_EXT\t\t\t\t\t\t= 0x87D7\n\tW_EXT\t\t\t\t\t\t= 0x87D8\n\tNEGATIVE_X_EXT\t\t\t\t\t= 0x87D9\n\tNEGATIVE_Y_EXT\t\t\t\t\t= 0x87DA\n\tNEGATIVE_Z_EXT\t\t\t\t\t= 0x87DB\n\tNEGATIVE_W_EXT\t\t\t\t\t= 0x87DC\n\tZERO_EXT\t\t\t\t\t= 0x87DD\n\tONE_EXT\t\t\t\t\t\t= 0x87DE\n\tNEGATIVE_ONE_EXT\t\t\t\t= 0x87DF\n\tNORMALIZED_RANGE_EXT\t\t\t\t= 0x87E0\n\tFULL_RANGE_EXT\t\t\t\t\t= 0x87E1\n\tCURRENT_VERTEX_EXT\t\t\t\t= 0x87E2\n\tMVP_MATRIX_EXT\t\t\t\t\t= 0x87E3\n\tVARIANT_VALUE_EXT\t\t\t\t= 0x87E4\n\tVARIANT_DATATYPE_EXT\t\t\t\t= 0x87E5\n\tVARIANT_ARRAY_STRIDE_EXT\t\t\t= 0x87E6\n\tVARIANT_ARRAY_TYPE_EXT\t\t\t\t= 0x87E7\n\tVARIANT_ARRAY_EXT\t\t\t\t= 0x87E8\n\tVARIANT_ARRAY_POINTER_EXT\t\t\t= 0x87E9\n\tINVARIANT_VALUE_EXT\t\t\t\t= 0x87EA\n\tINVARIANT_DATATYPE_EXT\t\t\t\t= 0x87EB\n\tLOCAL_CONSTANT_VALUE_EXT\t\t\t= 0x87EC\n\tLOCAL_CONSTANT_DATATYPE_EXT\t\t\t= 0x87ED\n\n###############################################################################\n\n# Extension #249\nATI_vertex_streams enum:\n\tMAX_VERTEX_STREAMS_ATI\t\t\t\t= 0x876B\n\tVERTEX_STREAM0_ATI\t\t\t\t= 0x876C\n\tVERTEX_STREAM1_ATI\t\t\t\t= 0x876D\n\tVERTEX_STREAM2_ATI\t\t\t\t= 0x876E\n\tVERTEX_STREAM3_ATI\t\t\t\t= 0x876F\n\tVERTEX_STREAM4_ATI\t\t\t\t= 0x8770\n\tVERTEX_STREAM5_ATI\t\t\t\t= 0x8771\n\tVERTEX_STREAM6_ATI\t\t\t\t= 0x8772\n\tVERTEX_STREAM7_ATI\t\t\t\t= 0x8773\n\tVERTEX_SOURCE_ATI\t\t\t\t= 0x8774\n\n###############################################################################\n\n# Extension #250 - WGL_I3D_digital_video_control\n# Extension #251 - WGL_I3D_gamma\n# Extension #252 - WGL_I3D_genlock\n# Extension #253 - WGL_I3D_image_buffer\n# Extension #254 - WGL_I3D_swap_frame_lock\n# Extension #255 - WGL_I3D_swap_frame_usage\n\n###############################################################################\n\n# Extension #256\nATI_element_array enum:\n\tELEMENT_ARRAY_ATI\t\t\t\t= 0x8768\n\tELEMENT_ARRAY_TYPE_ATI\t\t\t\t= 0x8769\n\tELEMENT_ARRAY_POINTER_ATI\t\t\t= 0x876A\n\n###############################################################################\n\n# Extension #257\nSUN_mesh_array enum:\n\tQUAD_MESH_SUN\t\t\t\t\t= 0x8614\n\tTRIANGLE_MESH_SUN\t\t\t\t= 0x8615\n\n###############################################################################\n\n# Extension #258\nSUN_slice_accum enum:\n\tSLICE_ACCUM_SUN\t\t\t\t\t= 0x85CC\n\n###############################################################################\n\n# Extension #259\nNV_multisample_filter_hint enum:\n\tMULTISAMPLE_FILTER_HINT_NV\t\t\t= 0x8534\n\n###############################################################################\n\n# Extension #260\nNV_depth_clamp enum:\n\tDEPTH_CLAMP_NV\t\t\t\t\t= 0x864F\n\n###############################################################################\n\n# Extension #261\nNV_occlusion_query enum:\n\tPIXEL_COUNTER_BITS_NV\t\t\t\t= 0x8864\n\tCURRENT_OCCLUSION_QUERY_ID_NV\t\t\t= 0x8865\n\tPIXEL_COUNT_NV\t\t\t\t\t= 0x8866\n\tPIXEL_COUNT_AVAILABLE_NV\t\t\t= 0x8867\n\n###############################################################################\n\n# Extension #262\nNV_point_sprite enum:\n\tPOINT_SPRITE_NV\t\t\t\t\t= 0x8861\n\tCOORD_REPLACE_NV\t\t\t\t= 0x8862\n\tPOINT_SPRITE_R_MODE_NV\t\t\t\t= 0x8863\n\n###############################################################################\n\n# Extension #263 - WGL_NV_render_depth_texture\n# Extension #264 - WGL_NV_render_texture_rectangle\n\n###############################################################################\n\n# Extension #265\nNV_texture_shader3 enum:\n\tOFFSET_PROJECTIVE_TEXTURE_2D_NV\t\t\t= 0x8850\n\tOFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV\t\t= 0x8851\n\tOFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV\t\t= 0x8852\n\tOFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV\t= 0x8853\n\tOFFSET_HILO_TEXTURE_2D_NV\t\t\t= 0x8854\n\tOFFSET_HILO_TEXTURE_RECTANGLE_NV\t\t= 0x8855\n\tOFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV\t\t= 0x8856\n\tOFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV\t= 0x8857\n\tDEPENDENT_HILO_TEXTURE_2D_NV\t\t\t= 0x8858\n\tDEPENDENT_RGB_TEXTURE_3D_NV\t\t\t= 0x8859\n\tDEPENDENT_RGB_TEXTURE_CUBE_MAP_NV\t\t= 0x885A\n\tDOT_PRODUCT_PASS_THROUGH_NV\t\t\t= 0x885B\n\tDOT_PRODUCT_TEXTURE_1D_NV\t\t\t= 0x885C\n\tDOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV\t\t= 0x885D\n\tHILO8_NV\t\t\t\t\t= 0x885E\n\tSIGNED_HILO8_NV\t\t\t\t\t= 0x885F\n\tFORCE_BLUE_TO_ONE_NV\t\t\t\t= 0x8860\n\n###############################################################################\n\n# No new tokens\n# Extension #266\nNV_vertex_program1_1 enum:\n\n###############################################################################\n\n# No new tokens\n# Extension #267\nEXT_shadow_funcs enum:\n\n###############################################################################\n\n# Extension #268\nEXT_stencil_two_side enum:\n\tSTENCIL_TEST_TWO_SIDE_EXT\t\t\t= 0x8910\n\tACTIVE_STENCIL_FACE_EXT\t\t\t\t= 0x8911\n\n###############################################################################\n\n# Extension #269\nATI_text_fragment_shader enum:\n\tTEXT_FRAGMENT_SHADER_ATI\t\t\t= 0x8200\n\n###############################################################################\n\n# Extension #270\nAPPLE_client_storage enum:\n\tUNPACK_CLIENT_STORAGE_APPLE\t\t\t= 0x85B2\n\n###############################################################################\n\n# Extension #271\n# (extends ATI_element_array???)\nAPPLE_element_array enum:\n\tELEMENT_ARRAY_APPLE\t\t\t\t= 0x8768\n\tELEMENT_ARRAY_TYPE_APPLE\t\t\t= 0x8769\n\tELEMENT_ARRAY_POINTER_APPLE\t\t\t= 0x876A\n\n###############################################################################\n\n# Extension #272\n# ??? BUFFER_OBJECT_APPLE appears to be part of the shipping extension,\n# but is not in the spec in the registry. Also appears in\n# APPLE_object_purgeable below.\nAPPLE_fence enum:\n\tDRAW_PIXELS_APPLE\t\t\t\t= 0x8A0A\n\tFENCE_APPLE\t\t\t\t\t= 0x8A0B\n\n###############################################################################\n\n# Extension #273\nAPPLE_vertex_array_object enum:\n\tVERTEX_ARRAY_BINDING_APPLE\t\t\t= 0x85B5\n\n###############################################################################\n\n# Extension #274\n# (How does this interact with NV_vertex_array_range???)\nAPPLE_vertex_array_range enum:\n\tVERTEX_ARRAY_RANGE_APPLE\t\t\t= 0x851D\n\tVERTEX_ARRAY_RANGE_LENGTH_APPLE\t\t\t= 0x851E\n\tVERTEX_ARRAY_STORAGE_HINT_APPLE\t\t\t= 0x851F\n\tVERTEX_ARRAY_RANGE_POINTER_APPLE\t\t= 0x8521\n\tSTORAGE_CACHED_APPLE\t\t\t\t= 0x85BE\n\tSTORAGE_SHARED_APPLE\t\t\t\t= 0x85BF\n\n###############################################################################\n\n# Extension #275\nAPPLE_ycbcr_422 enum:\n\tYCBCR_422_APPLE\t\t\t\t\t= 0x85B9\n\tUNSIGNED_SHORT_8_8_APPLE\t\t\t= 0x85BA\n\tUNSIGNED_SHORT_8_8_REV_APPLE\t\t\t= 0x85BB\n\n###############################################################################\n\n# Extension #276\nS3_s3tc enum:\n\tRGB_S3TC\t\t\t\t\t= 0x83A0\n\tRGB4_S3TC\t\t\t\t\t= 0x83A1\n\tRGBA_S3TC\t\t\t\t\t= 0x83A2\n\tRGBA4_S3TC\t\t\t\t\t= 0x83A3\n\n###############################################################################\n\n# Extension #277\nATI_draw_buffers enum:\n\tMAX_DRAW_BUFFERS_ATI\t\t\t\t= 0x8824\n\tDRAW_BUFFER0_ATI\t\t\t\t= 0x8825\n\tDRAW_BUFFER1_ATI\t\t\t\t= 0x8826\n\tDRAW_BUFFER2_ATI\t\t\t\t= 0x8827\n\tDRAW_BUFFER3_ATI\t\t\t\t= 0x8828\n\tDRAW_BUFFER4_ATI\t\t\t\t= 0x8829\n\tDRAW_BUFFER5_ATI\t\t\t\t= 0x882A\n\tDRAW_BUFFER6_ATI\t\t\t\t= 0x882B\n\tDRAW_BUFFER7_ATI\t\t\t\t= 0x882C\n\tDRAW_BUFFER8_ATI\t\t\t\t= 0x882D\n\tDRAW_BUFFER9_ATI\t\t\t\t= 0x882E\n\tDRAW_BUFFER10_ATI\t\t\t\t= 0x882F\n\tDRAW_BUFFER11_ATI\t\t\t\t= 0x8830\n\tDRAW_BUFFER12_ATI\t\t\t\t= 0x8831\n\tDRAW_BUFFER13_ATI\t\t\t\t= 0x8832\n\tDRAW_BUFFER14_ATI\t\t\t\t= 0x8833\n\tDRAW_BUFFER15_ATI\t\t\t\t= 0x8834\n\n###############################################################################\n\n# Extension #278\n# This is really a WGL extension, but if defined there are\n# some associated GL enumerants.\nATI_pixel_format_float enum:\n\tTYPE_RGBA_FLOAT_ATI\t\t\t\t= 0x8820\n\tCOLOR_CLEAR_UNCLAMPED_VALUE_ATI\t\t\t= 0x8835\n\n###############################################################################\n\n# Extension #279\nATI_texture_env_combine3 enum:\n\tMODULATE_ADD_ATI\t\t\t\t= 0x8744\n\tMODULATE_SIGNED_ADD_ATI\t\t\t\t= 0x8745\n\tMODULATE_SUBTRACT_ATI\t\t\t\t= 0x8746\n\n###############################################################################\n\n# Extension #280\nATI_texture_float enum:\n\tRGBA_FLOAT32_ATI\t\t\t\t= 0x8814\n\tRGB_FLOAT32_ATI\t\t\t\t\t= 0x8815\n\tALPHA_FLOAT32_ATI\t\t\t\t= 0x8816\n\tINTENSITY_FLOAT32_ATI\t\t\t\t= 0x8817\n\tLUMINANCE_FLOAT32_ATI\t\t\t\t= 0x8818\n\tLUMINANCE_ALPHA_FLOAT32_ATI\t\t\t= 0x8819\n\tRGBA_FLOAT16_ATI\t\t\t\t= 0x881A\n\tRGB_FLOAT16_ATI\t\t\t\t\t= 0x881B\n\tALPHA_FLOAT16_ATI\t\t\t\t= 0x881C\n\tINTENSITY_FLOAT16_ATI\t\t\t\t= 0x881D\n\tLUMINANCE_FLOAT16_ATI\t\t\t\t= 0x881E\n\tLUMINANCE_ALPHA_FLOAT16_ATI\t\t\t= 0x881F\n\n###############################################################################\n\n# Extension #281 (also WGL_NV_float_buffer)\nNV_float_buffer enum:\n\tFLOAT_R_NV\t\t\t\t\t= 0x8880\n\tFLOAT_RG_NV\t\t\t\t\t= 0x8881\n\tFLOAT_RGB_NV\t\t\t\t\t= 0x8882\n\tFLOAT_RGBA_NV\t\t\t\t\t= 0x8883\n\tFLOAT_R16_NV\t\t\t\t\t= 0x8884\n\tFLOAT_R32_NV\t\t\t\t\t= 0x8885\n\tFLOAT_RG16_NV\t\t\t\t\t= 0x8886\n\tFLOAT_RG32_NV\t\t\t\t\t= 0x8887\n\tFLOAT_RGB16_NV\t\t\t\t\t= 0x8888\n\tFLOAT_RGB32_NV\t\t\t\t\t= 0x8889\n\tFLOAT_RGBA16_NV\t\t\t\t\t= 0x888A\n\tFLOAT_RGBA32_NV\t\t\t\t\t= 0x888B\n\tTEXTURE_FLOAT_COMPONENTS_NV\t\t\t= 0x888C\n\tFLOAT_CLEAR_COLOR_VALUE_NV\t\t\t= 0x888D\n\tFLOAT_RGBA_MODE_NV\t\t\t\t= 0x888E\n\n###############################################################################\n\n# Extension #282\nNV_fragment_program enum:\n\tMAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV\t= 0x8868\n\tFRAGMENT_PROGRAM_NV\t\t\t\t= 0x8870\n\tMAX_TEXTURE_COORDS_NV\t\t\t\t= 0x8871\n\tMAX_TEXTURE_IMAGE_UNITS_NV\t\t\t= 0x8872\n\tFRAGMENT_PROGRAM_BINDING_NV\t\t\t= 0x8873\n\tPROGRAM_ERROR_STRING_NV\t\t\t\t= 0x8874\n\n###############################################################################\n\n# Extension #283\nNV_half_float enum:\n\tHALF_FLOAT_NV\t\t\t\t\t= 0x140B\n\n###############################################################################\n\n# Extension #284\nNV_pixel_data_range enum:\n\tWRITE_PIXEL_DATA_RANGE_NV\t\t\t= 0x8878\n\tREAD_PIXEL_DATA_RANGE_NV\t\t\t= 0x8879\n\tWRITE_PIXEL_DATA_RANGE_LENGTH_NV\t\t= 0x887A\n\tREAD_PIXEL_DATA_RANGE_LENGTH_NV\t\t\t= 0x887B\n\tWRITE_PIXEL_DATA_RANGE_POINTER_NV\t\t= 0x887C\n\tREAD_PIXEL_DATA_RANGE_POINTER_NV\t\t= 0x887D\n\n###############################################################################\n\n# Extension #285\nNV_primitive_restart enum:\n\tPRIMITIVE_RESTART_NV\t\t\t\t= 0x8558\n\tPRIMITIVE_RESTART_INDEX_NV\t\t\t= 0x8559\n\n###############################################################################\n\n# Extension #286\nNV_texture_expand_normal enum:\n\tTEXTURE_UNSIGNED_REMAP_MODE_NV\t\t\t= 0x888F\n\n###############################################################################\n\n# No new tokens\n# Extension #287\nNV_vertex_program2 enum:\n\n###############################################################################\n\n# No new tokens\n# Extension #288\nATI_map_object_buffer enum:\n\n###############################################################################\n\n# Extension #289\nATI_separate_stencil enum:\n\tSTENCIL_BACK_FUNC_ATI\t\t\t\t= 0x8800\n\tSTENCIL_BACK_FAIL_ATI\t\t\t\t= 0x8801\n\tSTENCIL_BACK_PASS_DEPTH_FAIL_ATI\t\t= 0x8802\n\tSTENCIL_BACK_PASS_DEPTH_PASS_ATI\t\t= 0x8803\n\n###############################################################################\n\n# No new tokens\n# Extension #290\nATI_vertex_attrib_array_object enum:\n\n###############################################################################\n\n# No new tokens\n# Extension #291 - OpenGL ES only, not in glext.h\n# OES_byte_coordinates enum:\n\n###############################################################################\n\n# Extension #292 - OpenGL ES only, not in glext.h\n# OES_fixed_point enum:\n#\tFIXED_OES\t\t\t\t\t= 0x140C\n\n###############################################################################\n\n# No new tokens\n# Extension #293 - OpenGL ES only, not in glext.h\n# OES_single_precision enum:\n\n###############################################################################\n\n# Extension #294 - OpenGL ES only, not in glext.h\n# OES_compressed_paletted_texture enum:\n#\tPALETTE4_RGB8_OES\t\t\t\t= 0x8B90\n#\tPALETTE4_RGBA8_OES\t\t\t\t= 0x8B91\n#\tPALETTE4_R5_G6_B5_OES\t\t\t\t= 0x8B92\n#\tPALETTE4_RGBA4_OES\t\t\t\t= 0x8B93\n#\tPALETTE4_RGB5_A1_OES\t\t\t\t= 0x8B94\n#\tPALETTE8_RGB8_OES\t\t\t\t= 0x8B95\n#\tPALETTE8_RGBA8_OES\t\t\t\t= 0x8B96\n#\tPALETTE8_R5_G6_B5_OES\t\t\t\t= 0x8B97\n#\tPALETTE8_RGBA4_OES\t\t\t\t= 0x8B98\n#\tPALETTE8_RGB5_A1_OES\t\t\t\t= 0x8B99\n\n###############################################################################\n\n# Extension #295 - This is an OpenGL ES extension, but also implemented in Mesa\nOES_read_format enum:\n\tIMPLEMENTATION_COLOR_READ_TYPE_OES\t\t= 0x8B9A\n\tIMPLEMENTATION_COLOR_READ_FORMAT_OES\t\t= 0x8B9B\n\n###############################################################################\n\n# No new tokens\n# Extension #296 - OpenGL ES only, not in glext.h\n# OES_query_matrix enum:\n\n###############################################################################\n\n# Extension #297\nEXT_depth_bounds_test enum:\n\tDEPTH_BOUNDS_TEST_EXT\t\t\t\t= 0x8890\n\tDEPTH_BOUNDS_EXT\t\t\t\t= 0x8891\n\n###############################################################################\n\n# Extension #298\nEXT_texture_mirror_clamp enum:\n\tMIRROR_CLAMP_EXT\t\t\t\t= 0x8742\n\tMIRROR_CLAMP_TO_EDGE_EXT\t\t\t= 0x8743\n\tMIRROR_CLAMP_TO_BORDER_EXT\t\t\t= 0x8912\n\n###############################################################################\n\n# Extension #299\nEXT_blend_equation_separate enum:\n\tBLEND_EQUATION_RGB_EXT\t\t\t\t= 0x8009    # alias GL_BLEND_EQUATION_EXT\n\tBLEND_EQUATION_ALPHA_EXT\t\t\t= 0x883D\n\n###############################################################################\n\n# Extension #300\nMESA_pack_invert enum:\n\tPACK_INVERT_MESA\t\t\t\t= 0x8758\n\n###############################################################################\n\n# Extension #301\nMESA_ycbcr_texture enum:\n\tUNSIGNED_SHORT_8_8_MESA\t\t\t\t= 0x85BA\n\tUNSIGNED_SHORT_8_8_REV_MESA\t\t\t= 0x85BB\n\tYCBCR_MESA\t\t\t\t\t= 0x8757\n\n###############################################################################\n\n# Extension #302\nEXT_pixel_buffer_object enum:\n\tPIXEL_PACK_BUFFER_EXT\t\t\t\t= 0x88EB\n\tPIXEL_UNPACK_BUFFER_EXT\t\t\t\t= 0x88EC\n\tPIXEL_PACK_BUFFER_BINDING_EXT\t\t\t= 0x88ED\n\tPIXEL_UNPACK_BUFFER_BINDING_EXT\t\t\t= 0x88EF\n\n###############################################################################\n\n# No new tokens\n# Extension #303\nNV_fragment_program_option enum:\n\n###############################################################################\n\n# Extension #304\nNV_fragment_program2 enum:\n\tMAX_PROGRAM_EXEC_INSTRUCTIONS_NV\t\t= 0x88F4\n\tMAX_PROGRAM_CALL_DEPTH_NV\t\t\t= 0x88F5\n\tMAX_PROGRAM_IF_DEPTH_NV\t\t\t\t= 0x88F6\n\tMAX_PROGRAM_LOOP_DEPTH_NV\t\t\t= 0x88F7\n\tMAX_PROGRAM_LOOP_COUNT_NV\t\t\t= 0x88F8\n\n###############################################################################\n\n# Extension #305\nNV_vertex_program2_option enum:\n\tuse NV_fragment_program2\t    MAX_PROGRAM_EXEC_INSTRUCTIONS_NV\n\tuse NV_fragment_program2\t    MAX_PROGRAM_CALL_DEPTH_NV\n\n###############################################################################\n\n# Extension #306\nNV_vertex_program3 enum:\n\tuse ARB_vertex_shader\t\t    MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB\n\n###############################################################################\n\n# Extension #307 - GLX_SGIX_hyperpipe\n# Extension #308 - GLX_MESA_agp_offset\n# Extension #309 - GL_EXT_texture_compression_dxt1 (OpenGL ES only, subset of _s3tc version)\n\n###############################################################################\n\n# Extension #310\nEXT_framebuffer_object enum:\n\tINVALID_FRAMEBUFFER_OPERATION_EXT\t\t= 0x0506\n\tMAX_RENDERBUFFER_SIZE_EXT\t\t\t= 0x84E8\n\tFRAMEBUFFER_BINDING_EXT\t\t\t\t= 0x8CA6\n\tRENDERBUFFER_BINDING_EXT\t\t\t= 0x8CA7\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT\t\t= 0x8CD0\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT\t\t= 0x8CD1\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT\t= 0x8CD2\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT = 0x8CD3\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT\t= 0x8CD4\n\tFRAMEBUFFER_COMPLETE_EXT\t\t\t= 0x8CD5\n\tFRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT\t\t= 0x8CD6\n\tFRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT\t= 0x8CD7\n## Removed 2005/09/26 in revision #117 of the extension:\n##\t  FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT = 0x8CD8\n\tFRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT\t\t= 0x8CD9\n\tFRAMEBUFFER_INCOMPLETE_FORMATS_EXT\t\t= 0x8CDA\n\tFRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT\t\t= 0x8CDB\n\tFRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT\t\t= 0x8CDC\n\tFRAMEBUFFER_UNSUPPORTED_EXT\t\t\t= 0x8CDD\n## Removed 2005/05/31 in revision #113 of the extension:\n##\t  FRAMEBUFFER_STATUS_ERROR_EXT\t\t\t  = 0x8CDE\n\tMAX_COLOR_ATTACHMENTS_EXT\t\t\t= 0x8CDF\n\tCOLOR_ATTACHMENT0_EXT\t\t\t\t= 0x8CE0\n\tCOLOR_ATTACHMENT1_EXT\t\t\t\t= 0x8CE1\n\tCOLOR_ATTACHMENT2_EXT\t\t\t\t= 0x8CE2\n\tCOLOR_ATTACHMENT3_EXT\t\t\t\t= 0x8CE3\n\tCOLOR_ATTACHMENT4_EXT\t\t\t\t= 0x8CE4\n\tCOLOR_ATTACHMENT5_EXT\t\t\t\t= 0x8CE5\n\tCOLOR_ATTACHMENT6_EXT\t\t\t\t= 0x8CE6\n\tCOLOR_ATTACHMENT7_EXT\t\t\t\t= 0x8CE7\n\tCOLOR_ATTACHMENT8_EXT\t\t\t\t= 0x8CE8\n\tCOLOR_ATTACHMENT9_EXT\t\t\t\t= 0x8CE9\n\tCOLOR_ATTACHMENT10_EXT\t\t\t\t= 0x8CEA\n\tCOLOR_ATTACHMENT11_EXT\t\t\t\t= 0x8CEB\n\tCOLOR_ATTACHMENT12_EXT\t\t\t\t= 0x8CEC\n\tCOLOR_ATTACHMENT13_EXT\t\t\t\t= 0x8CED\n\tCOLOR_ATTACHMENT14_EXT\t\t\t\t= 0x8CEE\n\tCOLOR_ATTACHMENT15_EXT\t\t\t\t= 0x8CEF\n\tDEPTH_ATTACHMENT_EXT\t\t\t\t= 0x8D00\n\tSTENCIL_ATTACHMENT_EXT\t\t\t\t= 0x8D20\n\tFRAMEBUFFER_EXT\t\t\t\t\t= 0x8D40\n\tRENDERBUFFER_EXT\t\t\t\t= 0x8D41\n\tRENDERBUFFER_WIDTH_EXT\t\t\t\t= 0x8D42\n\tRENDERBUFFER_HEIGHT_EXT\t\t\t\t= 0x8D43\n\tRENDERBUFFER_INTERNAL_FORMAT_EXT\t\t= 0x8D44\n# removed STENCIL_INDEX_EXT = 0x8D45 in rev. #114 of the spec\n\tSTENCIL_INDEX1_EXT\t\t\t\t= 0x8D46\n\tSTENCIL_INDEX4_EXT\t\t\t\t= 0x8D47\n\tSTENCIL_INDEX8_EXT\t\t\t\t= 0x8D48\n\tSTENCIL_INDEX16_EXT\t\t\t\t= 0x8D49\n\tRENDERBUFFER_RED_SIZE_EXT\t\t\t= 0x8D50\n\tRENDERBUFFER_GREEN_SIZE_EXT\t\t\t= 0x8D51\n\tRENDERBUFFER_BLUE_SIZE_EXT\t\t\t= 0x8D52\n\tRENDERBUFFER_ALPHA_SIZE_EXT\t\t\t= 0x8D53\n\tRENDERBUFFER_DEPTH_SIZE_EXT\t\t\t= 0x8D54\n\tRENDERBUFFER_STENCIL_SIZE_EXT\t\t\t= 0x8D55\n\n###############################################################################\n\n# No new tokens\n# Extension #311\nGREMEDY_string_marker enum:\n\n###############################################################################\n\n# Extension #312\nEXT_packed_depth_stencil enum:\n\tDEPTH_STENCIL_EXT\t\t\t\t= 0x84F9\n\tUNSIGNED_INT_24_8_EXT\t\t\t\t= 0x84FA\n\tDEPTH24_STENCIL8_EXT\t\t\t\t= 0x88F0\n\tTEXTURE_STENCIL_SIZE_EXT\t\t\t= 0x88F1\n\n###############################################################################\n\n# Extension #313 - WGL_3DL_stereo_control\n\n###############################################################################\n\n# Extension #314\nEXT_stencil_clear_tag enum:\n\tSTENCIL_TAG_BITS_EXT\t\t\t\t= 0x88F2\n\tSTENCIL_CLEAR_TAG_VALUE_EXT\t\t\t= 0x88F3\n\n###############################################################################\n\n# Extension #315\nEXT_texture_sRGB enum:\n\tSRGB_EXT\t\t\t\t\t= 0x8C40\n\tSRGB8_EXT\t\t\t\t\t= 0x8C41\n\tSRGB_ALPHA_EXT\t\t\t\t\t= 0x8C42\n\tSRGB8_ALPHA8_EXT\t\t\t\t= 0x8C43\n\tSLUMINANCE_ALPHA_EXT\t\t\t\t= 0x8C44\n\tSLUMINANCE8_ALPHA8_EXT\t\t\t\t= 0x8C45\n\tSLUMINANCE_EXT\t\t\t\t\t= 0x8C46\n\tSLUMINANCE8_EXT\t\t\t\t\t= 0x8C47\n\tCOMPRESSED_SRGB_EXT\t\t\t\t= 0x8C48\n\tCOMPRESSED_SRGB_ALPHA_EXT\t\t\t= 0x8C49\n\tCOMPRESSED_SLUMINANCE_EXT\t\t\t= 0x8C4A\n\tCOMPRESSED_SLUMINANCE_ALPHA_EXT\t\t\t= 0x8C4B\n\tCOMPRESSED_SRGB_S3TC_DXT1_EXT\t\t\t= 0x8C4C\n\tCOMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT\t\t= 0x8C4D\n\tCOMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT\t\t= 0x8C4E\n\tCOMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT\t\t= 0x8C4F\n\n###############################################################################\n\n# Extension #316\nEXT_framebuffer_blit enum:\n\tREAD_FRAMEBUFFER_EXT\t\t\t\t= 0x8CA8\n\tDRAW_FRAMEBUFFER_EXT\t\t\t\t= 0x8CA9\n\tDRAW_FRAMEBUFFER_BINDING_EXT\t\t\t= GL_FRAMEBUFFER_BINDING_EXT\n\tREAD_FRAMEBUFFER_BINDING_EXT\t\t\t= 0x8CAA\n\n###############################################################################\n\n# Extension #317\nEXT_framebuffer_multisample enum:\n\tRENDERBUFFER_SAMPLES_EXT\t\t\t= 0x8CAB\n\tFRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT\t\t= 0x8D56\n\tMAX_SAMPLES_EXT\t\t\t\t\t= 0x8D57\n\n###############################################################################\n\n# Extension #318\nMESAX_texture_stack enum:\n\tTEXTURE_1D_STACK_MESAX\t\t\t\t= 0x8759\n\tTEXTURE_2D_STACK_MESAX\t\t\t\t= 0x875A\n\tPROXY_TEXTURE_1D_STACK_MESAX\t\t\t= 0x875B\n\tPROXY_TEXTURE_2D_STACK_MESAX\t\t\t= 0x875C\n\tTEXTURE_1D_STACK_BINDING_MESAX\t\t\t= 0x875D\n\tTEXTURE_2D_STACK_BINDING_MESAX\t\t\t= 0x875E\n\n###############################################################################\n\n# Extension #319\nEXT_timer_query enum:\n\tTIME_ELAPSED_EXT\t\t\t\t= 0x88BF\n\n###############################################################################\n\n# No new tokens\n# Extension #320\nEXT_gpu_program_parameters enum:\n\n###############################################################################\n\n# Extension #321\nAPPLE_flush_buffer_range enum:\n\tBUFFER_SERIALIZED_MODIFY_APPLE\t\t\t= 0x8A12\n\tBUFFER_FLUSHING_UNMAP_APPLE\t\t\t= 0x8A13\n\n###############################################################################\n\n# Extension #322\nNV_gpu_program4 enum:\n\tMIN_PROGRAM_TEXEL_OFFSET_NV\t\t\t= 0x8904\n\tMAX_PROGRAM_TEXEL_OFFSET_NV\t\t\t= 0x8905\n\tPROGRAM_ATTRIB_COMPONENTS_NV\t\t\t= 0x8906\n\tPROGRAM_RESULT_COMPONENTS_NV\t\t\t= 0x8907\n\tMAX_PROGRAM_ATTRIB_COMPONENTS_NV\t\t= 0x8908\n\tMAX_PROGRAM_RESULT_COMPONENTS_NV\t\t= 0x8909\n\tMAX_PROGRAM_GENERIC_ATTRIBS_NV\t\t\t= 0x8DA5\n\tMAX_PROGRAM_GENERIC_RESULTS_NV\t\t\t= 0x8DA6\n\n###############################################################################\n\n# Extension #323\nNV_geometry_program4 enum:\n\tLINES_ADJACENCY_EXT\t\t\t\t= 0x000A\n\tLINE_STRIP_ADJACENCY_EXT\t\t\t= 0x000B\n\tTRIANGLES_ADJACENCY_EXT\t\t\t\t= 0x000C\n\tTRIANGLE_STRIP_ADJACENCY_EXT\t\t\t= 0x000D\n\tGEOMETRY_PROGRAM_NV\t\t\t\t= 0x8C26\n\tMAX_PROGRAM_OUTPUT_VERTICES_NV\t\t\t= 0x8C27\n\tMAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV\t\t= 0x8C28\n\tGEOMETRY_VERTICES_OUT_EXT\t\t\t= 0x8DDA\n\tGEOMETRY_INPUT_TYPE_EXT\t\t\t\t= 0x8DDB\n\tGEOMETRY_OUTPUT_TYPE_EXT\t\t\t= 0x8DDC\n\tMAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT\t\t= 0x8C29\n\tFRAMEBUFFER_ATTACHMENT_LAYERED_EXT\t\t= 0x8DA7\n\tFRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT\t= 0x8DA8\n\tFRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT\t\t= 0x8DA9\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT\t= 0x8CD4\n\tPROGRAM_POINT_SIZE_EXT\t\t\t\t= 0x8642\n\n###############################################################################\n\n# Extension #324\nEXT_geometry_shader4 enum:\n\tGEOMETRY_SHADER_EXT\t\t\t\t= 0x8DD9\n\tuse NV_geometry_program4\t    GEOMETRY_VERTICES_OUT_EXT\n\tuse NV_geometry_program4\t    GEOMETRY_INPUT_TYPE_EXT\n\tuse NV_geometry_program4\t    GEOMETRY_OUTPUT_TYPE_EXT\n\tuse NV_geometry_program4\t    MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT\n\tMAX_GEOMETRY_VARYING_COMPONENTS_EXT\t\t= 0x8DDD\n\tMAX_VERTEX_VARYING_COMPONENTS_EXT\t\t= 0x8DDE\n\tMAX_VARYING_COMPONENTS_EXT\t\t\t= 0x8B4B\n\tMAX_GEOMETRY_UNIFORM_COMPONENTS_EXT\t\t= 0x8DDF\n\tMAX_GEOMETRY_OUTPUT_VERTICES_EXT\t\t= 0x8DE0\n\tMAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT\t= 0x8DE1\n\tuse NV_geometry_program4\t    LINES_ADJACENCY_EXT\n\tuse NV_geometry_program4\t    LINE_STRIP_ADJACENCY_EXT\n\tuse NV_geometry_program4\t    TRIANGLES_ADJACENCY_EXT\n\tuse NV_geometry_program4\t    TRIANGLE_STRIP_ADJACENCY_EXT\n\tuse NV_geometry_program4\t    FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT\n\tuse NV_geometry_program4\t    FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT\n\tuse NV_geometry_program4\t    FRAMEBUFFER_ATTACHMENT_LAYERED_EXT\n\tuse NV_geometry_program4\t    FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT\n\tuse NV_geometry_program4\t    PROGRAM_POINT_SIZE_EXT\n\n###############################################################################\n\n# Extension #325\nNV_vertex_program4 enum:\n\tVERTEX_ATTRIB_ARRAY_INTEGER_NV\t\t\t= 0x88FD\n\n###############################################################################\n\n# Extension #326\nEXT_gpu_shader4 enum:\n\tSAMPLER_1D_ARRAY_EXT\t\t\t\t= 0x8DC0\n\tSAMPLER_2D_ARRAY_EXT\t\t\t\t= 0x8DC1\n\tSAMPLER_BUFFER_EXT\t\t\t\t= 0x8DC2\n\tSAMPLER_1D_ARRAY_SHADOW_EXT\t\t\t= 0x8DC3\n\tSAMPLER_2D_ARRAY_SHADOW_EXT\t\t\t= 0x8DC4\n\tSAMPLER_CUBE_SHADOW_EXT\t\t\t\t= 0x8DC5\n\tUNSIGNED_INT_VEC2_EXT\t\t\t\t= 0x8DC6\n\tUNSIGNED_INT_VEC3_EXT\t\t\t\t= 0x8DC7\n\tUNSIGNED_INT_VEC4_EXT\t\t\t\t= 0x8DC8\n\tINT_SAMPLER_1D_EXT\t\t\t\t= 0x8DC9\n\tINT_SAMPLER_2D_EXT\t\t\t\t= 0x8DCA\n\tINT_SAMPLER_3D_EXT\t\t\t\t= 0x8DCB\n\tINT_SAMPLER_CUBE_EXT\t\t\t\t= 0x8DCC\n\tINT_SAMPLER_2D_RECT_EXT\t\t\t\t= 0x8DCD\n\tINT_SAMPLER_1D_ARRAY_EXT\t\t\t= 0x8DCE\n\tINT_SAMPLER_2D_ARRAY_EXT\t\t\t= 0x8DCF\n\tINT_SAMPLER_BUFFER_EXT\t\t\t\t= 0x8DD0\n\tUNSIGNED_INT_SAMPLER_1D_EXT\t\t\t= 0x8DD1\n\tUNSIGNED_INT_SAMPLER_2D_EXT\t\t\t= 0x8DD2\n\tUNSIGNED_INT_SAMPLER_3D_EXT\t\t\t= 0x8DD3\n\tUNSIGNED_INT_SAMPLER_CUBE_EXT\t\t\t= 0x8DD4\n\tUNSIGNED_INT_SAMPLER_2D_RECT_EXT\t\t= 0x8DD5\n\tUNSIGNED_INT_SAMPLER_1D_ARRAY_EXT\t\t= 0x8DD6\n\tUNSIGNED_INT_SAMPLER_2D_ARRAY_EXT\t\t= 0x8DD7\n\tUNSIGNED_INT_SAMPLER_BUFFER_EXT\t\t\t= 0x8DD8\n\n###############################################################################\n\n# No new tokens\n# Extension #327\nEXT_draw_instanced enum:\n\n###############################################################################\n\n# Extension #328\nEXT_packed_float enum:\n\tR11F_G11F_B10F_EXT\t\t\t\t= 0x8C3A\n\tUNSIGNED_INT_10F_11F_11F_REV_EXT\t\t= 0x8C3B\n\tRGBA_SIGNED_COMPONENTS_EXT\t\t\t= 0x8C3C\n\n###############################################################################\n\n# Extension #329\nEXT_texture_array enum:\n\tTEXTURE_1D_ARRAY_EXT\t\t\t\t= 0x8C18\n\tPROXY_TEXTURE_1D_ARRAY_EXT\t\t\t= 0x8C19\n\tTEXTURE_2D_ARRAY_EXT\t\t\t\t= 0x8C1A\n\tPROXY_TEXTURE_2D_ARRAY_EXT\t\t\t= 0x8C1B\n\tTEXTURE_BINDING_1D_ARRAY_EXT\t\t\t= 0x8C1C\n\tTEXTURE_BINDING_2D_ARRAY_EXT\t\t\t= 0x8C1D\n\tMAX_ARRAY_TEXTURE_LAYERS_EXT\t\t\t= 0x88FF\n\tCOMPARE_REF_DEPTH_TO_TEXTURE_EXT\t\t= 0x884E\n\tuse NV_geometry_program4\t    FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT\n\n###############################################################################\n\n# Extension #330\nEXT_texture_buffer_object enum:\n\tTEXTURE_BUFFER_EXT\t\t\t\t= 0x8C2A\n\tMAX_TEXTURE_BUFFER_SIZE_EXT\t\t\t= 0x8C2B\n\tTEXTURE_BINDING_BUFFER_EXT\t\t\t= 0x8C2C\n\tTEXTURE_BUFFER_DATA_STORE_BINDING_EXT\t\t= 0x8C2D\n\tTEXTURE_BUFFER_FORMAT_EXT\t\t\t= 0x8C2E\n\n###############################################################################\n\n# Extension #331\nEXT_texture_compression_latc enum:\n\tCOMPRESSED_LUMINANCE_LATC1_EXT\t\t\t= 0x8C70\n\tCOMPRESSED_SIGNED_LUMINANCE_LATC1_EXT\t\t= 0x8C71\n\tCOMPRESSED_LUMINANCE_ALPHA_LATC2_EXT\t\t= 0x8C72\n\tCOMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT\t= 0x8C73\n\n###############################################################################\n\n# Extension #332\nEXT_texture_compression_rgtc enum:\n\tCOMPRESSED_RED_RGTC1_EXT\t\t\t= 0x8DBB\n\tCOMPRESSED_SIGNED_RED_RGTC1_EXT\t\t\t= 0x8DBC\n\tCOMPRESSED_RED_GREEN_RGTC2_EXT\t\t\t= 0x8DBD\n\tCOMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT\t\t= 0x8DBE\n\n###############################################################################\n\n# Extension #333\nEXT_texture_shared_exponent enum:\n\tRGB9_E5_EXT\t\t\t\t\t= 0x8C3D\n\tUNSIGNED_INT_5_9_9_9_REV_EXT\t\t\t= 0x8C3E\n\tTEXTURE_SHARED_SIZE_EXT\t\t\t\t= 0x8C3F\n\n###############################################################################\n\n# Extension #334\nNV_depth_buffer_float enum:\n\tDEPTH_COMPONENT32F_NV\t\t\t\t= 0x8DAB\n\tDEPTH32F_STENCIL8_NV\t\t\t\t= 0x8DAC\n\tFLOAT_32_UNSIGNED_INT_24_8_REV_NV\t\t= 0x8DAD\n\tDEPTH_BUFFER_FLOAT_MODE_NV\t\t\t= 0x8DAF\n\n###############################################################################\n\n# No new tokens\n# Extension #335\nNV_fragment_program4 enum:\n\n###############################################################################\n\n# Extension #336\nNV_framebuffer_multisample_coverage enum:\n\tRENDERBUFFER_COVERAGE_SAMPLES_NV\t\t= 0x8CAB\n\tRENDERBUFFER_COLOR_SAMPLES_NV\t\t\t= 0x8E10\n\tMAX_MULTISAMPLE_COVERAGE_MODES_NV\t\t= 0x8E11\n\tMULTISAMPLE_COVERAGE_MODES_NV\t\t\t= 0x8E12\n\n###############################################################################\n\n# Extension #337\n# ??? Also WGL/GLX extensions ???\nEXT_framebuffer_sRGB enum:\n\tFRAMEBUFFER_SRGB_EXT\t\t\t\t= 0x8DB9\n\tFRAMEBUFFER_SRGB_CAPABLE_EXT\t\t\t= 0x8DBA\n\n###############################################################################\n\n# No new tokens\n# Extension #338\nNV_geometry_shader4 enum:\n\n###############################################################################\n\n# Extension #339\nNV_parameter_buffer_object enum:\n\tMAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV\t= 0x8DA0\n\tMAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV\t\t= 0x8DA1\n\tVERTEX_PROGRAM_PARAMETER_BUFFER_NV\t\t= 0x8DA2\n\tGEOMETRY_PROGRAM_PARAMETER_BUFFER_NV\t\t= 0x8DA3\n\tFRAGMENT_PROGRAM_PARAMETER_BUFFER_NV\t\t= 0x8DA4\n\n###############################################################################\n\n# No new tokens\n# Extension #340\nEXT_draw_buffers2 enum:\n\n###############################################################################\n\n# Extension #341\nNV_transform_feedback enum:\n\tBACK_PRIMARY_COLOR_NV\t\t\t\t= 0x8C77\n\tBACK_SECONDARY_COLOR_NV\t\t\t\t= 0x8C78\n\tTEXTURE_COORD_NV\t\t\t\t= 0x8C79\n\tCLIP_DISTANCE_NV\t\t\t\t= 0x8C7A\n\tVERTEX_ID_NV\t\t\t\t\t= 0x8C7B\n\tPRIMITIVE_ID_NV\t\t\t\t\t= 0x8C7C\n\tGENERIC_ATTRIB_NV\t\t\t\t= 0x8C7D\n\tTRANSFORM_FEEDBACK_ATTRIBS_NV\t\t\t= 0x8C7E\n\tTRANSFORM_FEEDBACK_BUFFER_MODE_NV\t\t= 0x8C7F\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV\t= 0x8C80\n\tACTIVE_VARYINGS_NV\t\t\t\t= 0x8C81\n\tACTIVE_VARYING_MAX_LENGTH_NV\t\t\t= 0x8C82\n\tTRANSFORM_FEEDBACK_VARYINGS_NV\t\t\t= 0x8C83\n\tTRANSFORM_FEEDBACK_BUFFER_START_NV\t\t= 0x8C84\n\tTRANSFORM_FEEDBACK_BUFFER_SIZE_NV\t\t= 0x8C85\n\tTRANSFORM_FEEDBACK_RECORD_NV\t\t\t= 0x8C86\n\tPRIMITIVES_GENERATED_NV\t\t\t\t= 0x8C87\n\tTRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV\t= 0x8C88\n\tRASTERIZER_DISCARD_NV\t\t\t\t= 0x8C89\n\tMAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV\t= 0x8C8A\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV\t= 0x8C8B\n\tINTERLEAVED_ATTRIBS_NV\t\t\t\t= 0x8C8C\n\tSEPARATE_ATTRIBS_NV\t\t\t\t= 0x8C8D\n\tTRANSFORM_FEEDBACK_BUFFER_NV\t\t\t= 0x8C8E\n\tTRANSFORM_FEEDBACK_BUFFER_BINDING_NV\t\t= 0x8C8F\n\n###############################################################################\n\n# Extension #342\nEXT_bindable_uniform enum:\n\tMAX_VERTEX_BINDABLE_UNIFORMS_EXT\t\t= 0x8DE2\n\tMAX_FRAGMENT_BINDABLE_UNIFORMS_EXT\t\t= 0x8DE3\n\tMAX_GEOMETRY_BINDABLE_UNIFORMS_EXT\t\t= 0x8DE4\n\tMAX_BINDABLE_UNIFORM_SIZE_EXT\t\t\t= 0x8DED\n\tUNIFORM_BUFFER_EXT\t\t\t\t= 0x8DEE\n\tUNIFORM_BUFFER_BINDING_EXT\t\t\t= 0x8DEF\n\n###############################################################################\n\n# Extension #343\nEXT_texture_integer enum:\n\tRGBA32UI_EXT\t\t\t\t\t= 0x8D70\n\tRGB32UI_EXT\t\t\t\t\t= 0x8D71\n\tALPHA32UI_EXT\t\t\t\t\t= 0x8D72\n\tINTENSITY32UI_EXT\t\t\t\t= 0x8D73\n\tLUMINANCE32UI_EXT\t\t\t\t= 0x8D74\n\tLUMINANCE_ALPHA32UI_EXT\t\t\t\t= 0x8D75\n\tRGBA16UI_EXT\t\t\t\t\t= 0x8D76\n\tRGB16UI_EXT\t\t\t\t\t= 0x8D77\n\tALPHA16UI_EXT\t\t\t\t\t= 0x8D78\n\tINTENSITY16UI_EXT\t\t\t\t= 0x8D79\n\tLUMINANCE16UI_EXT\t\t\t\t= 0x8D7A\n\tLUMINANCE_ALPHA16UI_EXT\t\t\t\t= 0x8D7B\n\tRGBA8UI_EXT\t\t\t\t\t= 0x8D7C\n\tRGB8UI_EXT\t\t\t\t\t= 0x8D7D\n\tALPHA8UI_EXT\t\t\t\t\t= 0x8D7E\n\tINTENSITY8UI_EXT\t\t\t\t= 0x8D7F\n\tLUMINANCE8UI_EXT\t\t\t\t= 0x8D80\n\tLUMINANCE_ALPHA8UI_EXT\t\t\t\t= 0x8D81\n\tRGBA32I_EXT\t\t\t\t\t= 0x8D82\n\tRGB32I_EXT\t\t\t\t\t= 0x8D83\n\tALPHA32I_EXT\t\t\t\t\t= 0x8D84\n\tINTENSITY32I_EXT\t\t\t\t= 0x8D85\n\tLUMINANCE32I_EXT\t\t\t\t= 0x8D86\n\tLUMINANCE_ALPHA32I_EXT\t\t\t\t= 0x8D87\n\tRGBA16I_EXT\t\t\t\t\t= 0x8D88\n\tRGB16I_EXT\t\t\t\t\t= 0x8D89\n\tALPHA16I_EXT\t\t\t\t\t= 0x8D8A\n\tINTENSITY16I_EXT\t\t\t\t= 0x8D8B\n\tLUMINANCE16I_EXT\t\t\t\t= 0x8D8C\n\tLUMINANCE_ALPHA16I_EXT\t\t\t\t= 0x8D8D\n\tRGBA8I_EXT\t\t\t\t\t= 0x8D8E\n\tRGB8I_EXT\t\t\t\t\t= 0x8D8F\n\tALPHA8I_EXT\t\t\t\t\t= 0x8D90\n\tINTENSITY8I_EXT\t\t\t\t\t= 0x8D91\n\tLUMINANCE8I_EXT\t\t\t\t\t= 0x8D92\n\tLUMINANCE_ALPHA8I_EXT\t\t\t\t= 0x8D93\n\tRED_INTEGER_EXT\t\t\t\t\t= 0x8D94\n\tGREEN_INTEGER_EXT\t\t\t\t= 0x8D95\n\tBLUE_INTEGER_EXT\t\t\t\t= 0x8D96\n\tALPHA_INTEGER_EXT\t\t\t\t= 0x8D97\n\tRGB_INTEGER_EXT\t\t\t\t\t= 0x8D98\n\tRGBA_INTEGER_EXT\t\t\t\t= 0x8D99\n\tBGR_INTEGER_EXT\t\t\t\t\t= 0x8D9A\n\tBGRA_INTEGER_EXT\t\t\t\t= 0x8D9B\n\tLUMINANCE_INTEGER_EXT\t\t\t\t= 0x8D9C\n\tLUMINANCE_ALPHA_INTEGER_EXT\t\t\t= 0x8D9D\n\tRGBA_INTEGER_MODE_EXT\t\t\t\t= 0x8D9E\n\n###############################################################################\n\n# Extension #344 - GLX_EXT_texture_from_pixmap\n\n###############################################################################\n\n# No new tokens\n# Extension #345\nGREMEDY_frame_terminator enum:\n\n###############################################################################\n\n# Extension #346\nNV_conditional_render enum:\n\tQUERY_WAIT_NV\t\t\t\t\t= 0x8E13\n\tQUERY_NO_WAIT_NV\t\t\t\t= 0x8E14\n\tQUERY_BY_REGION_WAIT_NV\t\t\t\t= 0x8E15\n\tQUERY_BY_REGION_NO_WAIT_NV\t\t\t= 0x8E16\n\n###############################################################################\n\n# Extension #347\nNV_present_video enum:\n\tFRAME_NV\t\t\t\t\t= 0x8E26\n\tFIELDS_NV\t\t\t\t\t= 0x8E27\n\tCURRENT_TIME_NV\t\t\t\t\t= 0x8E28\n\tNUM_FILL_STREAMS_NV\t\t\t\t= 0x8E29\n\tPRESENT_TIME_NV\t\t\t\t\t= 0x8E2A\n\tPRESENT_DURATION_NV\t\t\t\t= 0x8E2B\n\n###############################################################################\n\n# Extension #348 - GLX_NV_video_out\n# Extension #349 - WGL_NV_video_out\n# Extension #350 - GLX_NV_swap_group\n# Extension #351 - WGL_NV_swap_group\n\n###############################################################################\n\n# Extension #352\nEXT_transform_feedback enum:\n\tTRANSFORM_FEEDBACK_BUFFER_EXT\t\t\t= 0x8C8E\n\tTRANSFORM_FEEDBACK_BUFFER_START_EXT\t\t= 0x8C84\n\tTRANSFORM_FEEDBACK_BUFFER_SIZE_EXT\t\t= 0x8C85\n\tTRANSFORM_FEEDBACK_BUFFER_BINDING_EXT\t\t= 0x8C8F\n\tINTERLEAVED_ATTRIBS_EXT\t\t\t\t= 0x8C8C\n\tSEPARATE_ATTRIBS_EXT\t\t\t\t= 0x8C8D\n\tPRIMITIVES_GENERATED_EXT\t\t\t= 0x8C87\n\tTRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT\t= 0x8C88\n\tRASTERIZER_DISCARD_EXT\t\t\t\t= 0x8C89\n\tMAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT = 0x8C8A\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT\t= 0x8C8B\n\tMAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT\t= 0x8C80\n\tTRANSFORM_FEEDBACK_VARYINGS_EXT\t\t\t= 0x8C83\n\tTRANSFORM_FEEDBACK_BUFFER_MODE_EXT\t\t= 0x8C7F\n\tTRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT\t= 0x8C76\n\n###############################################################################\n\n# Extension #353\nEXT_direct_state_access enum:\n\tPROGRAM_MATRIX_EXT\t\t\t\t= 0x8E2D\n\tTRANSPOSE_PROGRAM_MATRIX_EXT\t\t\t= 0x8E2E\n\tPROGRAM_MATRIX_STACK_DEPTH_EXT\t\t\t= 0x8E2F\n\n###############################################################################\n\n# Extension #354\nEXT_vertex_array_bgra enum:\n\tuse VERSION_1_2\t\t\t    BGRA\n\n###############################################################################\n\n# Extension #355 - WGL_NV_gpu_affinity\n\n###############################################################################\n\n# Extension #356\nEXT_texture_swizzle enum:\n\tTEXTURE_SWIZZLE_R_EXT\t\t\t\t= 0x8E42\n\tTEXTURE_SWIZZLE_G_EXT\t\t\t\t= 0x8E43\n\tTEXTURE_SWIZZLE_B_EXT\t\t\t\t= 0x8E44\n\tTEXTURE_SWIZZLE_A_EXT\t\t\t\t= 0x8E45\n\tTEXTURE_SWIZZLE_RGBA_EXT\t\t\t= 0x8E46\n\n###############################################################################\n\n# Extension #357\nNV_explicit_multisample enum:\n\tSAMPLE_POSITION_NV\t\t\t\t= 0x8E50\n\tSAMPLE_MASK_NV\t\t\t\t\t= 0x8E51\n\tSAMPLE_MASK_VALUE_NV\t\t\t\t= 0x8E52\n\tTEXTURE_BINDING_RENDERBUFFER_NV\t\t\t= 0x8E53\n\tTEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV\t= 0x8E54\n\tTEXTURE_RENDERBUFFER_NV\t\t\t\t= 0x8E55\n\tSAMPLER_RENDERBUFFER_NV\t\t\t\t= 0x8E56\n\tINT_SAMPLER_RENDERBUFFER_NV\t\t\t= 0x8E57\n\tUNSIGNED_INT_SAMPLER_RENDERBUFFER_NV\t\t= 0x8E58\n\tMAX_SAMPLE_MASK_WORDS_NV\t\t\t= 0x8E59\n\n###############################################################################\n\n# Extension #358\nNV_transform_feedback2 enum:\n\tTRANSFORM_FEEDBACK_NV\t\t\t\t= 0x8E22\n\tTRANSFORM_FEEDBACK_BUFFER_PAUSED_NV\t\t= 0x8E23\n\tTRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV\t\t= 0x8E24\n\tTRANSFORM_FEEDBACK_BINDING_NV\t\t\t= 0x8E25\n\n###############################################################################\n\n# Extension #359\nATI_meminfo enum:\n\tVBO_FREE_MEMORY_ATI\t\t\t\t= 0x87FB\n\tTEXTURE_FREE_MEMORY_ATI\t\t\t\t= 0x87FC\n\tRENDERBUFFER_FREE_MEMORY_ATI\t\t\t= 0x87FD\n\n###############################################################################\n\n# Extension #360\nAMD_performance_monitor enum:\n\tCOUNTER_TYPE_AMD\t\t\t\t= 0x8BC0\n\tCOUNTER_RANGE_AMD\t\t\t\t= 0x8BC1\n\tUNSIGNED_INT64_AMD\t\t\t\t= 0x8BC2\n\tPERCENTAGE_AMD\t\t\t\t\t= 0x8BC3\n\tPERFMON_RESULT_AVAILABLE_AMD\t\t\t= 0x8BC4\n\tPERFMON_RESULT_SIZE_AMD\t\t\t\t= 0x8BC5\n\tPERFMON_RESULT_AMD\t\t\t\t= 0x8BC6\n\n###############################################################################\n\n# Extension #361 - WGL_AMD_gpu_association\n\n###############################################################################\n\n# No new tokens\n# Extension #362\nAMD_texture_texture4 enum:\n\n###############################################################################\n\n# Extension #363\nAMD_vertex_shader_tesselator enum:\n\tSAMPLER_BUFFER_AMD\t\t\t\t= 0x9001\n\tINT_SAMPLER_BUFFER_AMD\t\t\t\t= 0x9002\n\tUNSIGNED_INT_SAMPLER_BUFFER_AMD\t\t\t= 0x9003\n\tTESSELLATION_MODE_AMD\t\t\t\t= 0x9004\n\tTESSELLATION_FACTOR_AMD\t\t\t\t= 0x9005\n\tDISCRETE_AMD\t\t\t\t\t= 0x9006\n\tCONTINUOUS_AMD\t\t\t\t\t= 0x9007\n\n###############################################################################\n\n# Extension #364\nEXT_provoking_vertex enum:\n\tQUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT\t= 0x8E4C\n\tFIRST_VERTEX_CONVENTION_EXT\t\t\t= 0x8E4D\n\tLAST_VERTEX_CONVENTION_EXT\t\t\t= 0x8E4E\n\tPROVOKING_VERTEX_EXT\t\t\t\t= 0x8E4F\n\n###############################################################################\n\n# Extension #365\nEXT_texture_snorm enum:\n\tALPHA_SNORM\t\t\t\t\t= 0x9010\n\tLUMINANCE_SNORM\t\t\t\t\t= 0x9011\n\tLUMINANCE_ALPHA_SNORM\t\t\t\t= 0x9012\n\tINTENSITY_SNORM\t\t\t\t\t= 0x9013\n\tALPHA8_SNORM\t\t\t\t\t= 0x9014\n\tLUMINANCE8_SNORM\t\t\t\t= 0x9015\n\tLUMINANCE8_ALPHA8_SNORM\t\t\t\t= 0x9016\n\tINTENSITY8_SNORM\t\t\t\t= 0x9017\n\tALPHA16_SNORM\t\t\t\t\t= 0x9018\n\tLUMINANCE16_SNORM\t\t\t\t= 0x9019\n\tLUMINANCE16_ALPHA16_SNORM\t\t\t= 0x901A\n\tINTENSITY16_SNORM\t\t\t\t= 0x901B\n\tuse VERSION_3_1\t\t\t    RED_SNORM\n\tuse VERSION_3_1\t\t\t    RG_SNORM\n\tuse VERSION_3_1\t\t\t    RGB_SNORM\n\tuse VERSION_3_1\t\t\t    RGBA_SNORM\n\tuse VERSION_3_1\t\t\t    R8_SNORM\n\tuse VERSION_3_1\t\t\t    RG8_SNORM\n\tuse VERSION_3_1\t\t\t    RGB8_SNORM\n\tuse VERSION_3_1\t\t\t    RGBA8_SNORM\n\tuse VERSION_3_1\t\t\t    R16_SNORM\n\tuse VERSION_3_1\t\t\t    RG16_SNORM\n\tuse VERSION_3_1\t\t\t    RGB16_SNORM\n\tuse VERSION_3_1\t\t\t    RGBA16_SNORM\n\tuse VERSION_3_1\t\t\t    SIGNED_NORMALIZED\n\n###############################################################################\n\n# No new tokens\n# Extension #366\nAMD_draw_buffers_blend enum:\n\n###############################################################################\n\n# Extension #367\nAPPLE_texture_range enum:\n\tTEXTURE_RANGE_LENGTH_APPLE\t\t\t= 0x85B7\n\tTEXTURE_RANGE_POINTER_APPLE\t\t\t= 0x85B8\n\tTEXTURE_STORAGE_HINT_APPLE\t\t\t= 0x85BC\n\tSTORAGE_PRIVATE_APPLE\t\t\t\t= 0x85BD\n\tuse APPLE_vertex_array_range\t    STORAGE_CACHED_APPLE\n\tuse APPLE_vertex_array_range\t    STORAGE_SHARED_APPLE\n\n###############################################################################\n\n# Extension #368\nAPPLE_float_pixels enum:\n\tHALF_APPLE\t\t\t\t\t= 0x140B\n\tRGBA_FLOAT32_APPLE\t\t\t\t= 0x8814\n\tRGB_FLOAT32_APPLE\t\t\t\t= 0x8815\n\tALPHA_FLOAT32_APPLE\t\t\t\t= 0x8816\n\tINTENSITY_FLOAT32_APPLE\t\t\t\t= 0x8817\n\tLUMINANCE_FLOAT32_APPLE\t\t\t\t= 0x8818\n\tLUMINANCE_ALPHA_FLOAT32_APPLE\t\t\t= 0x8819\n\tRGBA_FLOAT16_APPLE\t\t\t\t= 0x881A\n\tRGB_FLOAT16_APPLE\t\t\t\t= 0x881B\n\tALPHA_FLOAT16_APPLE\t\t\t\t= 0x881C\n\tINTENSITY_FLOAT16_APPLE\t\t\t\t= 0x881D\n\tLUMINANCE_FLOAT16_APPLE\t\t\t\t= 0x881E\n\tLUMINANCE_ALPHA_FLOAT16_APPLE\t\t\t= 0x881F\n\tCOLOR_FLOAT_APPLE\t\t\t\t= 0x8A0F\n\n###############################################################################\n\n# Extension #369\nAPPLE_vertex_program_evaluators enum:\n\tVERTEX_ATTRIB_MAP1_APPLE\t\t\t= 0x8A00\n\tVERTEX_ATTRIB_MAP2_APPLE\t\t\t= 0x8A01\n\tVERTEX_ATTRIB_MAP1_SIZE_APPLE\t\t\t= 0x8A02\n\tVERTEX_ATTRIB_MAP1_COEFF_APPLE\t\t\t= 0x8A03\n\tVERTEX_ATTRIB_MAP1_ORDER_APPLE\t\t\t= 0x8A04\n\tVERTEX_ATTRIB_MAP1_DOMAIN_APPLE\t\t\t= 0x8A05\n\tVERTEX_ATTRIB_MAP2_SIZE_APPLE\t\t\t= 0x8A06\n\tVERTEX_ATTRIB_MAP2_COEFF_APPLE\t\t\t= 0x8A07\n\tVERTEX_ATTRIB_MAP2_ORDER_APPLE\t\t\t= 0x8A08\n\tVERTEX_ATTRIB_MAP2_DOMAIN_APPLE\t\t\t= 0x8A09\n\n###############################################################################\n\n# Extension #370\nAPPLE_aux_depth_stencil enum:\n\tAUX_DEPTH_STENCIL_APPLE\t\t\t\t= 0x8A14\n\n###############################################################################\n\n# Extension #371\nAPPLE_object_purgeable enum:\n\tBUFFER_OBJECT_APPLE\t\t\t\t= 0x85B3\n\tRELEASED_APPLE\t\t\t\t\t= 0x8A19\n\tVOLATILE_APPLE\t\t\t\t\t= 0x8A1A\n\tRETAINED_APPLE\t\t\t\t\t= 0x8A1B\n\tUNDEFINED_APPLE\t\t\t\t\t= 0x8A1C\n\tPURGEABLE_APPLE\t\t\t\t\t= 0x8A1D\n\n###############################################################################\n\n# Extension #372\nAPPLE_row_bytes enum:\n\tPACK_ROW_BYTES_APPLE\t\t\t\t= 0x8A15\n\tUNPACK_ROW_BYTES_APPLE\t\t\t\t= 0x8A16\n\n###############################################################################\n\n# Extension #373\nAPPLE_rgb_422 enum:\n\tRGB_422_APPLE\t\t\t\t\t= 0x8A1F\n\tuse APPLE_ycbcr_422\t\t    UNSIGNED_SHORT_8_8_APPLE\n\tuse APPLE_ycbcr_422\t\t    UNSIGNED_SHORT_8_8_REV_APPLE\n\n###############################################################################\n\n# Extension #374\n\nNV_video_capture enum:\n\tVIDEO_BUFFER_NV\t\t\t\t\t= 0x9020\n\tVIDEO_BUFFER_BINDING_NV\t\t\t\t= 0x9021\n\tFIELD_UPPER_NV\t\t\t\t\t= 0x9022\n\tFIELD_LOWER_NV\t\t\t\t\t= 0x9023\n\tNUM_VIDEO_CAPTURE_STREAMS_NV\t\t\t= 0x9024\n\tNEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV\t\t= 0x9025\n\tVIDEO_CAPTURE_TO_422_SUPPORTED_NV\t\t= 0x9026\n\tLAST_VIDEO_CAPTURE_STATUS_NV\t\t\t= 0x9027\n\tVIDEO_BUFFER_PITCH_NV\t\t\t\t= 0x9028\n\tVIDEO_COLOR_CONVERSION_MATRIX_NV\t\t= 0x9029\n\tVIDEO_COLOR_CONVERSION_MAX_NV\t\t\t= 0x902A\n\tVIDEO_COLOR_CONVERSION_MIN_NV\t\t\t= 0x902B\n\tVIDEO_COLOR_CONVERSION_OFFSET_NV\t\t= 0x902C\n\tVIDEO_BUFFER_INTERNAL_FORMAT_NV\t\t\t= 0x902D\n\tPARTIAL_SUCCESS_NV\t\t\t\t= 0x902E\n\tSUCCESS_NV\t\t\t\t\t= 0x902F\n\tFAILURE_NV\t\t\t\t\t= 0x9030\n\tYCBYCR8_422_NV\t\t\t\t\t= 0x9031\n\tYCBAYCR8A_4224_NV\t\t\t\t= 0x9032\n\tZ6Y10Z6CB10Z6Y10Z6CR10_422_NV\t\t\t= 0x9033\n\tZ6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV\t= 0x9034\n\tZ4Y12Z4CB12Z4Y12Z4CR12_422_NV\t\t\t= 0x9035\n\tZ4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV\t= 0x9036\n\tZ4Y12Z4CB12Z4CR12_444_NV\t\t\t= 0x9037\n\tVIDEO_CAPTURE_FRAME_WIDTH_NV\t\t\t= 0x9038\n\tVIDEO_CAPTURE_FRAME_HEIGHT_NV\t\t\t= 0x9039\n\tVIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV\t\t= 0x903A\n\tVIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV\t\t= 0x903B\n\tVIDEO_CAPTURE_SURFACE_ORIGIN_NV\t\t\t= 0x903C\n\n###############################################################################\n\n# Extension #375 - GLX_EXT_swap_control\n\n###############################################################################\n\n# No new tokens\n# Extension #376 - also GLX_NV_copy_image, WGL_NV_copy_image\nNV_copy_image enum:\n\n###############################################################################\n\n# Extension #377\nEXT_separate_shader_objects enum:\n\tACTIVE_PROGRAM_EXT\t\t\t\t= 0x8B8D\n\n###############################################################################\n\n# No new tokens\n# Extension #378\nNV_parameter_buffer_object2 enum:\n\n###############################################################################\n\n# Extension #379\nNV_shader_buffer_load enum:\n\tBUFFER_GPU_ADDRESS_NV\t\t\t\t= 0x8F1D\n\tGPU_ADDRESS_NV\t\t\t\t\t= 0x8F34\n\tMAX_SHADER_BUFFER_ADDRESS_NV\t\t\t= 0x8F35\n\n###############################################################################\n\n# Extension #380\nNV_vertex_buffer_unified_memory enum:\n\tVERTEX_ATTRIB_ARRAY_UNIFIED_NV\t\t\t= 0x8F1E\n\tELEMENT_ARRAY_UNIFIED_NV\t\t\t= 0x8F1F\n\tVERTEX_ATTRIB_ARRAY_ADDRESS_NV\t\t\t= 0x8F20\n\tVERTEX_ARRAY_ADDRESS_NV\t\t\t\t= 0x8F21\n\tNORMAL_ARRAY_ADDRESS_NV\t\t\t\t= 0x8F22\n\tCOLOR_ARRAY_ADDRESS_NV\t\t\t\t= 0x8F23\n\tINDEX_ARRAY_ADDRESS_NV\t\t\t\t= 0x8F24\n\tTEXTURE_COORD_ARRAY_ADDRESS_NV\t\t\t= 0x8F25\n\tEDGE_FLAG_ARRAY_ADDRESS_NV\t\t\t= 0x8F26\n\tSECONDARY_COLOR_ARRAY_ADDRESS_NV\t\t= 0x8F27\n\tFOG_COORD_ARRAY_ADDRESS_NV\t\t\t= 0x8F28\n\tELEMENT_ARRAY_ADDRESS_NV\t\t\t= 0x8F29\n\tVERTEX_ATTRIB_ARRAY_LENGTH_NV\t\t\t= 0x8F2A\n\tVERTEX_ARRAY_LENGTH_NV\t\t\t\t= 0x8F2B\n\tNORMAL_ARRAY_LENGTH_NV\t\t\t\t= 0x8F2C\n\tCOLOR_ARRAY_LENGTH_NV\t\t\t\t= 0x8F2D\n\tINDEX_ARRAY_LENGTH_NV\t\t\t\t= 0x8F2E\n\tTEXTURE_COORD_ARRAY_LENGTH_NV\t\t\t= 0x8F2F\n\tEDGE_FLAG_ARRAY_LENGTH_NV\t\t\t= 0x8F30\n\tSECONDARY_COLOR_ARRAY_LENGTH_NV\t\t\t= 0x8F31\n\tFOG_COORD_ARRAY_LENGTH_NV\t\t\t= 0x8F32\n\tELEMENT_ARRAY_LENGTH_NV\t\t\t\t= 0x8F33\n\n###############################################################################\n\n# No new tokens\n# Extension #381\nNV_texture_barrier enum:\n\n###############################################################################\n\n# No new tokens\n# Extension #382\nAMD_shader_stencil_export enum:\n\n###############################################################################\n\n# Extension #383\nAMD_seamless_cubemap_per_texture enum:\n    use ARB_seamless_cube_map\t\t    TEXTURE_CUBE_MAP_SEAMLESS_ARB\n\n###############################################################################\n\n# Extension #384 - GLX_INTEL_swap_event\n\n"
  },
  {
    "path": "k3dsdk/gl/extension.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/gl.h>\n#include <k3dsdk/gl/context.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/result.h>\n\n#include <boost/tokenizer.hpp>\n\n#include <set>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\nnamespace extension\n{\n\n/// Returns the set of explicitly-disabled extensions\nstatic std::set<string_t>& disabled()\n{\n\tstatic std::set<string_t> results;\n\treturn results;\n}\n\n/// Returns the set of explicitly-enabled extensions\nstatic std::set<string_t>& enabled()\n{\n\tstatic std::set<string_t> results;\n\treturn results;\n}\n\n/// Returns the set of available extensions reported by OpenGL\nstatic std::set<string_t>& extensions()\n{\n\tstatic std::set<string_t> results;\n\tstatic bool initialized = false;\n\n\tif(!context::current())\n\t{\n\t\tlog() << error << \"Cannot retrieve OpenGL extensions without a current OpenGL context.\" << std::endl;\n\t\treturn results;\n\t}\n\n\tif(!initialized)\n\t{\n\t\tinitialized = true;\n\n\t\tconst char* const extension_c_string = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));\n\t\tif(!extension_c_string)\n\t\t{\n\t\t\tlog() << warning << \"GL extension query executed before context creation\" << std::endl;\n\t\t\treturn results;\n\t\t}\n\t\tconst string_t extension_string = extension_c_string;\n\n\t\tboost::char_separator<char> separator(\" \");\n\t\tboost::tokenizer<boost::char_separator<char> > tokenizer(extension_string, separator);\n\t\tstd::copy(tokenizer.begin(), tokenizer.end(), std::inserter(results, results.end()));\n\t}\n\n\treturn results;\n}\n\nconst std::set<string_t> list()\n{\n\treturn extensions();\n}\n\nvoid disable(const string_t& Extension)\n{\n\tenabled().erase(Extension);\n\tdisabled().insert(Extension);\n}\n\nvoid enable(const string_t& Extension)\n{\n\tdisabled().erase(Extension);\n\tenabled().insert(Extension);\n}\n\nbool_t query(const string_t& Extension)\n{\n\tif(disabled().count(Extension))\n\t\treturn false;\n\n\tif(enabled().count(Extension))\n\t\treturn true;\n\n\treturn extensions().count(Extension) ? true : false;\n}\n\nbool_t query_vbo()\n{\n\treturn query(\"GL_ARB_vertex_buffer_object\");\n}\n\n} // namespace extension\n\n} // namespace gl\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/gl/extension.h",
    "content": "#ifndef K3DSDK_GL_EXTENSION_H\n#define K3DSDK_GL_EXTENSION_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n#include <set>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\nnamespace extension\n{\n\n/// \"Disables\" an OpenGL extension, so that query() will always return false (regardless of the underlying hardware)\nvoid disable(const k3d::string_t& Extension);\n/// \"Enables\" an OpenGL extension, so that query() will always return true (regardless of the underlying hardware)\nvoid enable(const k3d::string_t& Extension);\n\n/// Returns the list of OpenGL extensions supported by underlying hardware\nconst std::set<k3d::string_t> list();\n\n/// Returns true iff the requested OpenGL extension is available\nbool_t query(const k3d::string_t& Extension);\n\n/// Convenience function that returns true iff the VBO extension is supported\nbool_t query_vbo();\n\n} // namespace extension\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_GL_EXTENSION_H\n\n"
  },
  {
    "path": "k3dsdk/gl/gl.spec",
    "content": "# gl.spec file\n# DON'T REMOVE PREVIOUS LINE!!! libspec depends on it!\n#\n# Copyright (c) 1991-2005 Silicon Graphics, Inc. All Rights Reserved.\n# Copyright (c) 2006-2010 The Khronos Group Inc.\n#\n# This document is licensed under the SGI Free Software B License Version\n# 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .\n#\n# $Revision: 10796 $ on $Date: 2010-03-19 17:31:10 -0700 (Fri, 19 Mar 2010) $\n\nrequired-props:\n# Description of a parameter\nparam:\t\tretval retained\n# Display list flags\ndlflags:\tnotlistable handcode\n# GLX implementation flags\nglxflags:\tclient-intercept client-handcode server-handcode EXT SGI ignore ARB\n# Vector ('v') equivalent form of a command taking 1-4 explicit xyzw/rgba arguments\nvectorequiv:\t*\n# Category this function falls in. While there are many categories for\n# early GL 1.0 functions, later functions just have a core version\n# (e.g. VERSION_major_minor) or extension name for the category.\ncategory:\tdisplay-list drawing drawing-control feedback framebuf misc modeling pixel-op pixel-rw state-req xform VERSION_1_0 VERSION_1_0_DEPRECATED VERSION_1_1 VERSION_1_1_DEPRECATED VERSION_1_2 VERSION_1_2_DEPRECATED VERSION_1_3 VERSION_1_3_DEPRECATED VERSION_1_4 VERSION_1_4_DEPRECATED VERSION_1_5 VERSION_2_0 VERSION_2_1 VERSION_3_0 VERSION_3_0_DEPRECATED VERSION_3_1 VERSION_3_2 VERSION_3_3 VERSION_4_0 ATI_element_array ATI_envmap_bumpmap ATI_fragment_shader ATI_pn_triangles ATI_vertex_array_object ATI_vertex_streams EXT_blend_color EXT_blend_minmax EXT_convolution EXT_copy_texture EXT_histogram EXT_polygon_offset EXT_subtexture EXT_texture3D EXT_texture_object EXT_vertex_array EXT_vertex_shader SGIS_detail_texture SGIS_multisample SGIS_pixel_texture ARB_point_parameters EXT_point_parameters SGIS_point_parameters SGIS_sharpen_texture SGIS_texture4D SGIS_texture_filter4 SGIX_async SGIX_flush_raster SGIX_fragment_lighting SGIX_framezoom SGIX_igloo_interface SGIX_instruments SGIX_list_priority SGIX_pixel_texture SGIX_polynomial_ffd SGIX_reference_plane SGIX_sprite SGIX_tag_sample_buffer SGI_color_table ARB_multitexture ARB_multisample ARB_texture_compression ARB_transpose_matrix ARB_vertex_blend ARB_matrix_palette EXT_compiled_vertex_array EXT_cull_vertex EXT_index_func EXT_index_material EXT_draw_range_elements EXT_vertex_weighting INGR_blend_func_separate NV_evaluators NV_fence NV_occlusion_query NV_point_sprite NV_register_combiners NV_register_combiners2 NV_vertex_array_range NV_vertex_program NV_vertex_program1_1_dcc MESA_resize_buffers MESA_window_pos PGI_misc_hints EXT_fog_coord EXT_blend_func_separate EXT_color_subtable EXT_coordinate_frame EXT_light_texture EXT_multi_draw_arrays EXT_paletted_texture EXT_pixel_transform EXT_secondary_color EXT_texture_perturb_normal HP_image_transform IBM_multimode_draw_arrays IBM_vertex_array_lists INTEL_parallel_arrays SUNX_constant_data SUN_global_alpha SUN_mesh_array SUN_triangle_list SUN_vertex 3DFX_tbuffer EXT_multisample SGIS_fog_function SGIS_texture_color_mask ARB_window_pos EXT_stencil_two_side EXT_depth_bounds_test EXT_blend_equation_separate ARB_vertex_program ARB_fragment_program ARB_vertex_buffer_object ARB_occlusion_query ARB_shader_objects ARB_vertex_shader ARB_fragment_shader S3_s3tc ATI_draw_buffers ATI_texture_env_combine3 ATI_texture_float NV_float_buffer NV_fragment_program NV_half_float NV_pixel_data_range NV_primitive_restart NV_texture_expand_normal NV_texture_expand_normal NV_vertex_program2 APPLE_element_array APPLE_fence APPLE_vertex_array_object APPLE_vertex_array_range ATI_draw_buffers NV_fragment_program NV_half_float NV_pixel_data_range NV_primitive_restart ATI_map_object_buffer ATI_separate_stencil ATI_vertex_attrib_array_object ARB_draw_buffers ARB_texture_rectangle ARB_color_buffer_float EXT_framebuffer_object GREMEDY_string_marker EXT_stencil_clear_tag EXT_framebuffer_blit EXT_framebuffer_multisample MESAX_texture_stack EXT_timer_query EXT_gpu_program_parameters APPLE_flush_buffer_range NV_gpu_program4 NV_geometry_program4 EXT_geometry_shader4 NV_vertex_program4 EXT_gpu_shader4 EXT_draw_instanced EXT_texture_buffer_object NV_depth_buffer_float NV_framebuffer_multisample_coverage NV_parameter_buffer_object EXT_draw_buffers2 NV_transform_feedback EXT_bindable_uniform EXT_texture_integer GREMEDY_frame_terminator NV_conditional_render NV_present_video EXT_transform_feedback ARB_depth_buffer_float ARB_draw_instanced ARB_framebuffer_object ARB_framebuffer_sRGB ARB_geometry_shader4 ARB_half_float_vertex ARB_instanced_arrays ARB_map_buffer_range ARB_texture_buffer_object ARB_texture_compression_rgtc ARB_texture_rg ARB_vertex_array_object EXT_direct_state_access EXT_vertex_array_bgra EXT_texture_swizzle NV_explicit_multisample NV_transform_feedback2 ATI_meminfo AMD_performance_monitor AMD_vertex_shader_tesselator EXT_provoking_vertex ARB_uniform_buffer_object ARB_copy_buffer EXT_texture_snorm AMD_draw_buffers_blend APPLE_texture_range APPLE_float_pixels APPLE_vertex_program_evaluators APPLE_aux_depth_stencil APPLE_object_purgeable APPLE_row_bytes ARB_draw_elements_base_vertex ARB_provoking_vertex ARB_sync ARB_texture_multisample ARB_draw_buffers_blend ARB_sample_shading NV_video_capture NV_copy_image EXT_separate_shader_objects NV_parameter_buffer_object2 NV_shader_buffer_load NV_vertex_buffer_unified_memory NV_texture_barrier ARB_shading_language_include ARB_blend_func_extended ARB_sampler_objects ARB_timer_query ARB_vertex_type_2_10_10_10_rev ARB_draw_indirect ARB_gpu_shader_fp64 ARB_shader_subroutine ARB_tessellation_shader ARB_transform_feedback2 ARB_transform_feedback3\n\n# Categories for extensions with no functions - need not be included now\n# ARB_texture_env_add ARB_texture_cube_map ARB_texture_border_clamp\n# ARB_shading_language_100 ARB_texture_non_power_of_two ARB_point_sprite\n# ARB_half_float_pixel ARB_texture_float ARB_pixel_buffer_object EXT_abgr\n# EXT_texture SGI_color_matrix SGI_texture_color_table EXT_cmyka\n# EXT_packed_pixels SGIS_texture_lod EXT_rescale_normal EXT_misc_attribute\n# SGIS_generate_mipmap SGIX_clipmap SGIX_shadow SGIS_texture_edge_clamp\n# SGIS_texture_border_clamp EXT_blend_subtract EXT_blend_logic_op\n# SGIX_async_histogram SGIX_async_pixel SGIX_interlace SGIX_pixel_tiles\n# SGIX_texture_select SGIX_texture_multi_buffer SGIX_texture_scale_bias\n# SGIX_depth_texture SGIX_fog_offset HP_convolution_border_modes\n# SGIX_texture_add_env PGI_vertex_hints EXT_clip_volume_hint\n# SGIX_ir_instrument1 SGIX_calligraphic_fragment SGIX_texture_lod_bias\n# SGIX_shadow_ambient EXT_index_texture EXT_index_array_formats SGIX_ycrcb\n# IBM_rasterpos_clip HP_texture_lighting WIN_phong_shading\n# WIN_specular_fog SGIX_blend_alpha_minmax EXT_bgra HP_occlusion_test\n# EXT_pixel_transform_color_table EXT_shared_texture_palette\n# EXT_separate_specular_color EXT_texture_env REND_screen_coordinates\n# EXT_texture_env_combine APPLE_specular_vector APPLE_transform_hint\n# SGIX_fog_scale INGR_color_clamp INGR_interlace_read EXT_stencil_wrap\n# EXT_422_pixels NV_texgen_reflection SUN_convolution_border_modes\n# SUN_slice_accum EXT_texture_env_add EXT_texture_lod_bias\n# EXT_texture_filter_anisotropic NV_light_max_exponent NV_fog_distance\n# NV_texgen_emboss NV_blend_square NV_texture_env_combine4\n# NV_packed_depth_stencil NV_texture_compression_vtc NV_texture_rectangle\n# NV_texture_shader NV_texture_shader2 NV_vertex_array_range2\n# IBM_cull_vertex SGIX_subsample SGIX_ycrcba SGIX_ycrcb_subsample\n# SGIX_depth_pass_instrument 3DFX_texture_compression_FXT1\n# 3DFX_multisample SGIX_vertex_preclip SGIX_convolution_accuracy\n# SGIX_resample SGIX_scalebias_hint SGIX_texture_coordinate_clamp\n# EXT_shadow_funcs MESA_pack_invert MESA_ycbcr_texture EXT_packed_float\n# EXT_texture_array EXT_texture_compression_latc\n# EXT_texture_compression_rgtc EXT_texture_shared_exponent\n# NV_fragment_program4 EXT_framebuffer_sRGB NV_geometry_shader4\n# EXT_vertex_array_bgra ARB_depth_clamp ARB_fragment_coord_conventions\n# ARB_seamless_cube_map ARB_vertex_array_bgra ARB_texture_cube_map_array\n# ARB_texture_gather ARB_texture_query_lod\n# AMD_shader_stencil_export AMD_seamless_cubemap_per_texture\n\n# Core version in which a function was introduced, or against\n# which an extension can be implemented\nversion:\t1.0 1.1 1.2 1.3 1.4 1.5 2.0 2.1 3.0 3.1 3.2 3.3 4.0\n# Core version in which a function was removed\ndeprecated:\t3.1\n# GLX Single, Rendering, or Vendor Private opcode\nglxsingle:\t*\nglxropcode:\t*\nglxvendorpriv:\t*\n# WGL implementation flags (incomplete)\nwglflags:\tclient-handcode server-handcode small-data batchable\n# Drivers in which this is implemented (very incomplete)\nextension:\tfuture not_implemented soft WINSOFT NV10 NV20 NV50\n# Function this aliases (indistinguishable to the GL)\nalias:\t\t*\n# Mesa dispatch table offset (incomplete)\noffset:\t\t*\n# These properties are picked up from NVIDIA .spec files, we don't use them\nglfflags:\t*\nbeginend:\t*\nglxvectorequiv: *\nsubcategory:\t*\nglextmask:\t*\n\n###############################################################################\n#\n# glxsingle, glxropcode, and other GLX allocations to vendors\n# are used here, but the master registry for GLX is in\n# /ogl/trunk/doc/registry/extensions.reserved\n#\n# XFree86 dispatch offsets:\t0-645\n#\t\t\t\t578-641     NV_vertex_program\n# GLS opcodes:\t\t\t0x0030-0x0269\n#\n###############################################################################\n\n###############################################################################\n#\n# things to remember when adding an extension command\n#\n# - append new ARB and non-ARB extensions to the appropriate portion of\n#   the spec file, in extension number order.\n# - use tabs, not spaces\n# - set glxflags to \"ignore\" until GLX is updated to support the new command\n# - add new data types to typemaps/spec2wire.map\n# - add extension name in alphabetical order to category list\n# - add commands within an extension in spec order\n# - use existing command entries as a model (where possible)\n# - when reserving new glxropcodes, update\n#\tgfx/lib/opengl/doc/glspec/extensions.reserved to indicate this\n#\n###############################################################################\n\n# New type declarations\n\npassthru: #include <stddef.h>\n\npassthru: #ifndef GL_VERSION_2_0\npassthru: /* GL type for program/shader text */\npassthru: typedef char GLchar;\npassthru: #endif\npassthru:\npassthru: #ifndef GL_VERSION_1_5\npassthru: /* GL types for handling large vertex buffer objects */\npassthru: typedef ptrdiff_t GLintptr;\npassthru: typedef ptrdiff_t GLsizeiptr;\npassthru: #endif\npassthru:\npassthru: #ifndef GL_ARB_vertex_buffer_object\npassthru: /* GL types for handling large vertex buffer objects */\npassthru: typedef ptrdiff_t GLintptrARB;\npassthru: typedef ptrdiff_t GLsizeiptrARB;\npassthru: #endif\npassthru:\npassthru: #ifndef GL_ARB_shader_objects\npassthru: /* GL types for program/shader text and shader object handles */\npassthru: typedef char GLcharARB;\npassthru: typedef unsigned int GLhandleARB;\npassthru: #endif\npassthru:\npassthru: /* GL type for \"half\" precision (s10e5) float data in host memory */\npassthru: #ifndef GL_ARB_half_float_pixel\npassthru: typedef unsigned short GLhalfARB;\npassthru: #endif\npassthru:\npassthru: #ifndef GL_NV_half_float\npassthru: typedef unsigned short GLhalfNV;\npassthru: #endif\npassthru:\npassthru: #ifndef GLEXT_64_TYPES_DEFINED\npassthru: /* This code block is duplicated in glxext.h, so must be protected */\npassthru: #define GLEXT_64_TYPES_DEFINED\npassthru: /* Define int32_t, int64_t, and uint64_t types for UST/MSC */\npassthru: /* (as used in the GL_EXT_timer_query extension). */\npassthru: #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\npassthru: #include <inttypes.h>\npassthru: #elif defined(__sun__) || defined(__digital__)\npassthru: #include <inttypes.h>\npassthru: #if defined(__STDC__)\npassthru: #if defined(__arch64__) || defined(_LP64)\npassthru: typedef long int int64_t;\npassthru: typedef unsigned long int uint64_t;\npassthru: #else\npassthru: typedef long long int int64_t;\npassthru: typedef unsigned long long int uint64_t;\npassthru: #endif /* __arch64__ */\npassthru: #endif /* __STDC__ */\npassthru: #elif defined( __VMS ) || defined(__sgi)\npassthru: #include <inttypes.h>\npassthru: #elif defined(__SCO__) || defined(__USLC__)\npassthru: #include <stdint.h>\npassthru: #elif defined(__UNIXOS2__) || defined(__SOL64__)\npassthru: typedef long int int32_t;\npassthru: typedef long long int int64_t;\npassthru: typedef unsigned long long int uint64_t;\npassthru: #elif defined(_WIN32) && defined(__GNUC__)\npassthru: #include <stdint.h>\npassthru: #elif defined(_WIN32)\npassthru: typedef __int32 int32_t;\npassthru: typedef __int64 int64_t;\npassthru: typedef unsigned __int64 uint64_t;\npassthru: #else\npassthru: /* Fallback if nothing above works */\npassthru: #include <inttypes.h>\npassthru: #endif\npassthru: #endif\npassthru:\npassthru: #ifndef GL_EXT_timer_query\npassthru: typedef int64_t GLint64EXT;\npassthru: typedef uint64_t GLuint64EXT;\npassthru: #endif\npassthru:\npassthru: #ifndef ARB_sync\npassthru: typedef int64_t GLint64;\npassthru: typedef uint64_t GLuint64;\npassthru: typedef struct __GLsync *GLsync;\npassthru: #endif\npassthru:\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 1.0 commands\n#\n###############################################################################\n###############################################################################\n\n###############################################################################\n#\n# drawing-control commands\n#\n###############################################################################\n\nCullFace(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tCullFaceMode in value\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tversion\t\t1.0\n\tglxropcode\t79\n\toffset\t\t152\n\nFrontFace(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tFrontFaceDirection in value\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tversion\t\t1.0\n\tglxropcode\t84\n\toffset\t\t157\n\nHint(target, mode)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHintTarget in value\n\tparam\t\tmode\t\tHintMode in value\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tversion\t\t1.0\n\tglxropcode\t85\n\toffset\t\t158\n\nLineWidth(width)\n\treturn\t\tvoid\n\tparam\t\twidth\t\tCheckedFloat32 in value\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tversion\t\t1.0\n\tglxropcode\t95\n\toffset\t\t168\n\nPointSize(size)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tCheckedFloat32 in value\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tversion\t\t1.0\n\tglxropcode\t100\n\toffset\t\t173\n\nPolygonMode(face, mode)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tmode\t\tPolygonMode in value\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tversion\t\t1.0\n\tglxropcode\t101\n\toffset\t\t174\n\nScissor(x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tversion\t\t1.0\n\tglxropcode\t103\n\toffset\t\t176\n\nTexParameterf(target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tversion\t\t1.0\n\tglxropcode\t105\n\twglflags\tsmall-data\n\toffset\t\t178\n\nTexParameterfv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tversion\t\t1.0\n\tglxropcode\t106\n\twglflags\tsmall-data\n\toffset\t\t179\n\nTexParameteri(target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tversion\t\t1.0\n\tglxropcode\t107\n\twglflags\tsmall-data\n\toffset\t\t180\n\nTexParameteriv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tversion\t\t1.0\n\tglxropcode\t108\n\twglflags\tsmall-data\n\toffset\t\t181\n\nTexImage1D(target, level, internalformat, width, border, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureComponentCount in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tglxropcode\t109\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t182\n\nTexImage2D(target, level, internalformat, width, height, border, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureComponentCount in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height)]\n\tcategory\tVERSION_1_0\t\t   # old: drawing-control\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tglxropcode\t110\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t183\n\n###############################################################################\n#\n# framebuf commands\n#\n###############################################################################\n\nDrawBuffer(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tDrawBufferMode in value\n\tcategory\tVERSION_1_0\t\t   # old: framebuf\n\tversion\t\t1.0\n\tglxropcode\t126\n\toffset\t\t202\n\nClear(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tClearBufferMask in value\n\tcategory\tVERSION_1_0\t\t   # old: framebuf\n\tversion\t\t1.0\n\tglxropcode\t127\n\toffset\t\t203\n\nClearColor(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tClampedColorF in value\n\tparam\t\tgreen\t\tClampedColorF in value\n\tparam\t\tblue\t\tClampedColorF in value\n\tparam\t\talpha\t\tClampedColorF in value\n\tcategory\tVERSION_1_0\t\t   # old: framebuf\n\tversion\t\t1.0\n\tglxropcode\t130\n\toffset\t\t206\n\nClearStencil(s)\n\treturn\t\tvoid\n\tparam\t\ts\t\tStencilValue in value\n\tcategory\tVERSION_1_0\t\t   # old: framebuf\n\tversion\t\t1.0\n\tglxropcode\t131\n\toffset\t\t207\n\nClearDepth(depth)\n\treturn\t\tvoid\n\tparam\t\tdepth\t\tClampedFloat64 in value\n\tcategory\tVERSION_1_0\t\t   # old: framebuf\n\tversion\t\t1.0\n\tglxropcode\t132\n\toffset\t\t208\n\nStencilMask(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tMaskedStencilValue in value\n\tcategory\tVERSION_1_0\t\t   # old: framebuf\n\tversion\t\t1.0\n\tglxropcode\t133\n\toffset\t\t209\n\nColorMask(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tBoolean in value\n\tparam\t\tgreen\t\tBoolean in value\n\tparam\t\tblue\t\tBoolean in value\n\tparam\t\talpha\t\tBoolean in value\n\tcategory\tVERSION_1_0\t\t   # old: framebuf\n\tversion\t\t1.0\n\tglxropcode\t134\n\toffset\t\t210\n\nDepthMask(flag)\n\treturn\t\tvoid\n\tparam\t\tflag\t\tBoolean in value\n\tcategory\tVERSION_1_0\t\t   # old: framebuf\n\tversion\t\t1.0\n\tglxropcode\t135\n\toffset\t\t211\n\n###############################################################################\n#\n# misc commands\n#\n###############################################################################\n\nDisable(cap)\n\treturn\t\tvoid\n\tparam\t\tcap\t\tEnableCap in value\n\tcategory\tVERSION_1_0\t\t   # old: misc\n\tversion\t\t1.0\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode client-intercept\n\tglxropcode\t138\n\toffset\t\t214\n\nEnable(cap)\n\treturn\t\tvoid\n\tparam\t\tcap\t\tEnableCap in value\n\tcategory\tVERSION_1_0\t\t   # old: misc\n\tversion\t\t1.0\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode client-intercept\n\tglxropcode\t139\n\toffset\t\t215\n\nFinish()\n\treturn\t\tvoid\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tcategory\tVERSION_1_0\t\t   # old: misc\n\tversion\t\t1.0\n\tglxsingle\t108\n\toffset\t\t216\n\nFlush()\n\treturn\t\tvoid\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tcategory\tVERSION_1_0\t\t   # old: misc\n\tversion\t\t1.0\n\tglxsingle\t142\n\toffset\t\t217\n\n###############################################################################\n#\n# pixel-op commands\n#\n###############################################################################\n\nBlendFunc(sfactor, dfactor)\n\treturn\t\tvoid\n\tparam\t\tsfactor\t\tBlendingFactorSrc in value\n\tparam\t\tdfactor\t\tBlendingFactorDest in value\n\tcategory\tVERSION_1_0\t\t   # old: pixel-op\n\tversion\t\t1.0\n\tglxropcode\t160\n\toffset\t\t241\n\nLogicOp(opcode)\n\treturn\t\tvoid\n\tparam\t\topcode\t\tLogicOp in value\n\tcategory\tVERSION_1_0\t\t   # old: pixel-op\n\tversion\t\t1.0\n\tglxropcode\t161\n\toffset\t\t242\n\nStencilFunc(func, ref, mask)\n\treturn\t\tvoid\n\tparam\t\tfunc\t\tStencilFunction in value\n\tparam\t\tref\t\tClampedStencilValue in value\n\tparam\t\tmask\t\tMaskedStencilValue in value\n\tcategory\tVERSION_1_0\t\t   # old: pixel-op\n\tversion\t\t1.0\n\tglxropcode\t162\n\toffset\t\t243\n\nStencilOp(fail, zfail, zpass)\n\treturn\t\tvoid\n\tparam\t\tfail\t\tStencilOp in value\n\tparam\t\tzfail\t\tStencilOp in value\n\tparam\t\tzpass\t\tStencilOp in value\n\tcategory\tVERSION_1_0\t\t   # old: pixel-op\n\tversion\t\t1.0\n\tglxropcode\t163\n\toffset\t\t244\n\nDepthFunc(func)\n\treturn\t\tvoid\n\tparam\t\tfunc\t\tDepthFunction in value\n\tcategory\tVERSION_1_0\t\t   # old: pixel-op\n\tversion\t\t1.0\n\tglxropcode\t164\n\toffset\t\t245\n\n###############################################################################\n#\n# pixel-rw commands\n#\n###############################################################################\n\nPixelStoref(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPixelStoreParameter in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode\n\tcategory\tVERSION_1_0\t\t   # old: pixel-rw\n\tversion\t\t1.0\n\tglxsingle\t109\n\twglflags\tbatchable\n\toffset\t\t249\n\nPixelStorei(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPixelStoreParameter in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode\n\tcategory\tVERSION_1_0\t\t   # old: pixel-rw\n\tversion\t\t1.0\n\tglxsingle\t110\n\twglflags\tbatchable\n\toffset\t\t250\n\nReadBuffer(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tReadBufferMode in value\n\tcategory\tVERSION_1_0\t\t   # old: pixel-rw\n\tversion\t\t1.0\n\tglxropcode\t171\n\toffset\t\t254\n\nReadPixels(x, y, width, height, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid out array [COMPSIZE(format/type/width/height)]\n\tcategory\tVERSION_1_0\t\t   # old: pixel-rw\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tglxsingle\t111\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t256\n\n###############################################################################\n#\n# state-req commands\n#\n###############################################################################\n\nGetBooleanv(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGetPName in value\n\tparam\t\tparams\t\tBoolean out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode\n\tversion\t\t1.0\n\tglxsingle\t112\n\twglflags\tsmall-data\n\toffset\t\t258\n\nGetDoublev(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGetPName in value\n\tparam\t\tparams\t\tFloat64 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode\n\tversion\t\t1.0\n\tglxsingle\t114\n\twglflags\tsmall-data\n\toffset\t\t260\n\nGetError()\n\treturn\t\tErrorCode\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode\n\tversion\t\t1.0\n\tglxsingle\t115\n\toffset\t\t261\n\nGetFloatv(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGetPName in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode\n\tversion\t\t1.0\n\tglxsingle\t116\n\twglflags\tsmall-data\n\toffset\t\t262\n\nGetIntegerv(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGetPName in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode\n\tversion\t\t1.0\n\tglxsingle\t117\n\twglflags\tsmall-data\n\toffset\t\t263\n\nGetString(name)\n\treturn\t\tString\n\tparam\t\tname\t\tStringName in value\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tglxsingle\t129\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t275\n\nGetTexImage(target, level, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid out array [COMPSIZE(target/level/format/type)]\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tglxsingle\t135\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t281\n\nGetTexParameterfv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxsingle\t136\n\twglflags\tsmall-data\n\toffset\t\t282\n\nGetTexParameteriv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxsingle\t137\n\twglflags\tsmall-data\n\toffset\t\t283\n\nGetTexLevelParameterfv(target, level, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxsingle\t138\n\twglflags\tsmall-data\n\toffset\t\t284\n\nGetTexLevelParameteriv(target, level, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxsingle\t139\n\twglflags\tsmall-data\n\toffset\t\t285\n\nIsEnabled(cap)\n\treturn\t\tBoolean\n\tparam\t\tcap\t\tEnableCap in value\n\tcategory\tVERSION_1_0\t\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxflags\tclient-handcode client-intercept\n\tglxsingle\t140\n\toffset\t\t286\n\n###############################################################################\n#\n# xform commands\n#\n###############################################################################\n\nDepthRange(near, far)\n\treturn\t\tvoid\n\tparam\t\tnear\t\tClampedFloat64 in value\n\tparam\t\tfar\t\tClampedFloat64 in value\n\tcategory\tVERSION_1_0\t\t   # old: xform\n\tversion\t\t1.0\n\tglxropcode\t174\n\toffset\t\t288\n\nViewport(x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tVERSION_1_0\t\t   # old: xform\n\tversion\t\t1.0\n\tglxropcode\t191\n\toffset\t\t305\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 1.0 deprecated commands\n#\n###############################################################################\n###############################################################################\n\n# display-list commands\n\nNewList(list, mode)\n\treturn\t\tvoid\n\tparam\t\tlist\t\tList in value\n\tparam\t\tmode\t\tListMode in value\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: display-list\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t101\n\twglflags\tbatchable\n\toffset\t\t0\n\nEndList()\n\treturn\t\tvoid\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: display-list\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t102\n\twglflags\tbatchable\n\toffset\t\t1\n\nCallList(list)\n\treturn\t\tvoid\n\tparam\t\tlist\t\tList in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: display-list\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t1\n\toffset\t\t2\n\nCallLists(n, type, lists)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\ttype\t\tListNameType in value\n\tparam\t\tlists\t\tVoid in array [COMPSIZE(n/type)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: display-list\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t2\n\toffset\t\t3\n\nDeleteLists(list, range)\n\treturn\t\tvoid\n\tparam\t\tlist\t\tList in value\n\tparam\t\trange\t\tSizeI in value\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: display-list\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t103\n\twglflags\tbatchable\n\toffset\t\t4\n\nGenLists(range)\n\treturn\t\tList\n\tparam\t\trange\t\tSizeI in value\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: display-list\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t104\n\toffset\t\t5\n\nListBase(base)\n\treturn\t\tvoid\n\tparam\t\tbase\t\tList in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: display-list\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t3\n\toffset\t\t6\n\n# drawing commands\n\nBegin(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t4\n\toffset\t\t7\n\nBitmap(width, height, xorig, yorig, xmove, ymove, bitmap)\n\treturn\t\tvoid\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\txorig\t\tCoordF in value\n\tparam\t\tyorig\t\tCoordF in value\n\tparam\t\txmove\t\tCoordF in value\n\tparam\t\tymove\t\tCoordF in value\n\tparam\t\tbitmap\t\tUInt8 in array [COMPSIZE(width/height)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t5\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t8\n\nColor3b(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorB in value\n\tparam\t\tgreen\t\tColorB in value\n\tparam\t\tblue\t\tColorB in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor3bv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t9\n\nColor3bv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorB in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t6\n\toffset\t\t10\n\nColor3d(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorD in value\n\tparam\t\tgreen\t\tColorD in value\n\tparam\t\tblue\t\tColorD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor3dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t11\n\nColor3dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorD in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t7\n\toffset\t\t12\n\nColor3f(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorF in value\n\tparam\t\tgreen\t\tColorF in value\n\tparam\t\tblue\t\tColorF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor3fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t13\n\nColor3fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorF in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t8\n\toffset\t\t14\n\nColor3i(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorI in value\n\tparam\t\tgreen\t\tColorI in value\n\tparam\t\tblue\t\tColorI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor3iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t15\n\nColor3iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorI in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t9\n\toffset\t\t16\n\nColor3s(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorS in value\n\tparam\t\tgreen\t\tColorS in value\n\tparam\t\tblue\t\tColorS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor3sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t17\n\nColor3sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorS in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t10\n\toffset\t\t18\n\nColor3ub(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUB in value\n\tparam\t\tgreen\t\tColorUB in value\n\tparam\t\tblue\t\tColorUB in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor3ubv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t19\n\nColor3ubv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUB in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t11\n\toffset\t\t20\n\nColor3ui(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUI in value\n\tparam\t\tgreen\t\tColorUI in value\n\tparam\t\tblue\t\tColorUI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor3uiv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t21\n\nColor3uiv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUI in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t12\n\toffset\t\t22\n\nColor3us(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUS in value\n\tparam\t\tgreen\t\tColorUS in value\n\tparam\t\tblue\t\tColorUS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor3usv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t23\n\nColor3usv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUS in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t13\n\toffset\t\t24\n\nColor4b(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorB in value\n\tparam\t\tgreen\t\tColorB in value\n\tparam\t\tblue\t\tColorB in value\n\tparam\t\talpha\t\tColorB in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor4bv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t25\n\nColor4bv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorB in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t14\n\toffset\t\t26\n\nColor4d(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorD in value\n\tparam\t\tgreen\t\tColorD in value\n\tparam\t\tblue\t\tColorD in value\n\tparam\t\talpha\t\tColorD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor4dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t27\n\nColor4dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorD in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t15\n\toffset\t\t28\n\nColor4f(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorF in value\n\tparam\t\tgreen\t\tColorF in value\n\tparam\t\tblue\t\tColorF in value\n\tparam\t\talpha\t\tColorF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor4fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t29\n\nColor4fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorF in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t16\n\toffset\t\t30\n\nColor4i(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorI in value\n\tparam\t\tgreen\t\tColorI in value\n\tparam\t\tblue\t\tColorI in value\n\tparam\t\talpha\t\tColorI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor4iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t31\n\nColor4iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorI in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t17\n\toffset\t\t32\n\nColor4s(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorS in value\n\tparam\t\tgreen\t\tColorS in value\n\tparam\t\tblue\t\tColorS in value\n\tparam\t\talpha\t\tColorS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor4sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t33\n\nColor4sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorS in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t18\n\toffset\t\t34\n\nColor4ub(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUB in value\n\tparam\t\tgreen\t\tColorUB in value\n\tparam\t\tblue\t\tColorUB in value\n\tparam\t\talpha\t\tColorUB in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor4ubv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t35\n\nColor4ubv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUB in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t19\n\toffset\t\t36\n\nColor4ui(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUI in value\n\tparam\t\tgreen\t\tColorUI in value\n\tparam\t\tblue\t\tColorUI in value\n\tparam\t\talpha\t\tColorUI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor4uiv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t37\n\nColor4uiv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUI in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t20\n\toffset\t\t38\n\nColor4us(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUS in value\n\tparam\t\tgreen\t\tColorUS in value\n\tparam\t\tblue\t\tColorUS in value\n\tparam\t\talpha\t\tColorUS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tColor4usv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t39\n\nColor4usv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUS in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t21\n\toffset\t\t40\n\nEdgeFlag(flag)\n\treturn\t\tvoid\n\tparam\t\tflag\t\tBoolean in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tEdgeFlagv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t41\n\nEdgeFlagv(flag)\n\treturn\t\tvoid\n\tparam\t\tflag\t\tBoolean in array [1]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t22\n\toffset\t\t42\n\nEnd()\n\treturn\t\tvoid\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t23\n\toffset\t\t43\n\nIndexd(c)\n\treturn\t\tvoid\n\tparam\t\tc\t\tColorIndexValueD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tIndexdv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t44\n\nIndexdv(c)\n\treturn\t\tvoid\n\tparam\t\tc\t\tColorIndexValueD in array [1]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t24\n\toffset\t\t45\n\nIndexf(c)\n\treturn\t\tvoid\n\tparam\t\tc\t\tColorIndexValueF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tIndexfv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t46\n\nIndexfv(c)\n\treturn\t\tvoid\n\tparam\t\tc\t\tColorIndexValueF in array [1]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t25\n\toffset\t\t47\n\nIndexi(c)\n\treturn\t\tvoid\n\tparam\t\tc\t\tColorIndexValueI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tIndexiv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t48\n\nIndexiv(c)\n\treturn\t\tvoid\n\tparam\t\tc\t\tColorIndexValueI in array [1]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t26\n\toffset\t\t49\n\nIndexs(c)\n\treturn\t\tvoid\n\tparam\t\tc\t\tColorIndexValueS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tIndexsv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t50\n\nIndexsv(c)\n\treturn\t\tvoid\n\tparam\t\tc\t\tColorIndexValueS in array [1]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t27\n\toffset\t\t51\n\nNormal3b(nx, ny, nz)\n\treturn\t\tvoid\n\tparam\t\tnx\t\tInt8 in value\n\tparam\t\tny\t\tInt8 in value\n\tparam\t\tnz\t\tInt8 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tNormal3bv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t52\n\nNormal3bv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tInt8 in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t28\n\toffset\t\t53\n\nNormal3d(nx, ny, nz)\n\treturn\t\tvoid\n\tparam\t\tnx\t\tCoordD in value\n\tparam\t\tny\t\tCoordD in value\n\tparam\t\tnz\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tNormal3dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t54\n\nNormal3dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t29\n\toffset\t\t55\n\nNormal3f(nx, ny, nz)\n\treturn\t\tvoid\n\tparam\t\tnx\t\tCoordF in value\n\tparam\t\tny\t\tCoordF in value\n\tparam\t\tnz\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tNormal3fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t56\n\nNormal3fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t30\n\toffset\t\t57\n\nNormal3i(nx, ny, nz)\n\treturn\t\tvoid\n\tparam\t\tnx\t\tInt32 in value\n\tparam\t\tny\t\tInt32 in value\n\tparam\t\tnz\t\tInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tNormal3iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t58\n\nNormal3iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tInt32 in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t31\n\toffset\t\t59\n\nNormal3s(nx, ny, nz)\n\treturn\t\tvoid\n\tparam\t\tnx\t\tInt16 in value\n\tparam\t\tny\t\tInt16 in value\n\tparam\t\tnz\t\tInt16 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tNormal3sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t60\n\nNormal3sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tInt16 in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t32\n\toffset\t\t61\n\nRasterPos2d(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRasterPos2dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t62\n\nRasterPos2dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t33\n\toffset\t\t63\n\nRasterPos2f(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRasterPos2fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t64\n\nRasterPos2fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t34\n\toffset\t\t65\n\nRasterPos2i(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRasterPos2iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t66\n\nRasterPos2iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t35\n\toffset\t\t67\n\nRasterPos2s(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRasterPos2sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t68\n\nRasterPos2sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t36\n\toffset\t\t69\n\nRasterPos3d(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tparam\t\tz\t\tCoordD in value\n\tvectorequiv\tRasterPos3dv\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t70\n\nRasterPos3dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t37\n\toffset\t\t71\n\nRasterPos3f(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tparam\t\tz\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRasterPos3fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t72\n\nRasterPos3fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t38\n\toffset\t\t73\n\nRasterPos3i(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tparam\t\tz\t\tCoordI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRasterPos3iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t74\n\nRasterPos3iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t39\n\toffset\t\t75\n\nRasterPos3s(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tparam\t\tz\t\tCoordS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRasterPos3sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t76\n\nRasterPos3sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t40\n\toffset\t\t77\n\nRasterPos4d(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tparam\t\tz\t\tCoordD in value\n\tparam\t\tw\t\tCoordD in value\n\tvectorequiv\tRasterPos4dv\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t78\n\nRasterPos4dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t41\n\toffset\t\t79\n\nRasterPos4f(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tparam\t\tz\t\tCoordF in value\n\tparam\t\tw\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRasterPos4fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t80\n\nRasterPos4fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t42\n\toffset\t\t81\n\nRasterPos4i(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tparam\t\tz\t\tCoordI in value\n\tparam\t\tw\t\tCoordI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRasterPos4iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t82\n\nRasterPos4iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t43\n\toffset\t\t83\n\nRasterPos4s(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tparam\t\tz\t\tCoordS in value\n\tparam\t\tw\t\tCoordS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRasterPos4sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t84\n\nRasterPos4sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t44\n\toffset\t\t85\n\nRectd(x1, y1, x2, y2)\n\treturn\t\tvoid\n\tparam\t\tx1\t\tCoordD in value\n\tparam\t\ty1\t\tCoordD in value\n\tparam\t\tx2\t\tCoordD in value\n\tparam\t\ty2\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRectdv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t86\n\nRectdv(v1, v2)\n\treturn\t\tvoid\n\tparam\t\tv1\t\tCoordD in array [2]\n\tparam\t\tv2\t\tCoordD in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t45\n\toffset\t\t87\n\nRectf(x1, y1, x2, y2)\n\treturn\t\tvoid\n\tparam\t\tx1\t\tCoordF in value\n\tparam\t\ty1\t\tCoordF in value\n\tparam\t\tx2\t\tCoordF in value\n\tparam\t\ty2\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRectfv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t88\n\nRectfv(v1, v2)\n\treturn\t\tvoid\n\tparam\t\tv1\t\tCoordF in array [2]\n\tparam\t\tv2\t\tCoordF in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t46\n\toffset\t\t89\n\nRecti(x1, y1, x2, y2)\n\treturn\t\tvoid\n\tparam\t\tx1\t\tCoordI in value\n\tparam\t\ty1\t\tCoordI in value\n\tparam\t\tx2\t\tCoordI in value\n\tparam\t\ty2\t\tCoordI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRectiv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t90\n\nRectiv(v1, v2)\n\treturn\t\tvoid\n\tparam\t\tv1\t\tCoordI in array [2]\n\tparam\t\tv2\t\tCoordI in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t47\n\toffset\t\t91\n\nRects(x1, y1, x2, y2)\n\treturn\t\tvoid\n\tparam\t\tx1\t\tCoordS in value\n\tparam\t\ty1\t\tCoordS in value\n\tparam\t\tx2\t\tCoordS in value\n\tparam\t\ty2\t\tCoordS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tRectsv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t92\n\nRectsv(v1, v2)\n\treturn\t\tvoid\n\tparam\t\tv1\t\tCoordS in array [2]\n\tparam\t\tv2\t\tCoordS in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t48\n\toffset\t\t93\n\nTexCoord1d(s)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord1dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t94\n\nTexCoord1dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [1]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t49\n\toffset\t\t95\n\nTexCoord1f(s)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord1fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t96\n\nTexCoord1fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [1]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t50\n\toffset\t\t97\n\nTexCoord1i(s)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord1iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t98\n\nTexCoord1iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [1]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t51\n\toffset\t\t99\n\nTexCoord1s(s)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord1sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t100\n\nTexCoord1sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [1]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t52\n\toffset\t\t101\n\nTexCoord2d(s, t)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordD in value\n\tparam\t\tt\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord2dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t102\n\nTexCoord2dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t53\n\toffset\t\t103\n\nTexCoord2f(s, t)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordF in value\n\tparam\t\tt\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord2fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t104\n\nTexCoord2fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t54\n\toffset\t\t105\n\nTexCoord2i(s, t)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordI in value\n\tparam\t\tt\t\tCoordI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord2iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t106\n\nTexCoord2iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t55\n\toffset\t\t107\n\nTexCoord2s(s, t)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordS in value\n\tparam\t\tt\t\tCoordS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord2sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t108\n\nTexCoord2sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t56\n\toffset\t\t109\n\nTexCoord3d(s, t, r)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordD in value\n\tparam\t\tt\t\tCoordD in value\n\tparam\t\tr\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord3dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t110\n\nTexCoord3dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t57\n\toffset\t\t111\n\nTexCoord3f(s, t, r)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordF in value\n\tparam\t\tt\t\tCoordF in value\n\tparam\t\tr\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord3fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t112\n\nTexCoord3fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t58\n\toffset\t\t113\n\nTexCoord3i(s, t, r)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordI in value\n\tparam\t\tt\t\tCoordI in value\n\tparam\t\tr\t\tCoordI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord3iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t114\n\nTexCoord3iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t59\n\toffset\t\t115\n\nTexCoord3s(s, t, r)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordS in value\n\tparam\t\tt\t\tCoordS in value\n\tparam\t\tr\t\tCoordS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord3sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t116\n\nTexCoord3sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t60\n\toffset\t\t117\n\nTexCoord4d(s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordD in value\n\tparam\t\tt\t\tCoordD in value\n\tparam\t\tr\t\tCoordD in value\n\tparam\t\tq\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord4dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t118\n\nTexCoord4dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t61\n\toffset\t\t119\n\nTexCoord4f(s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordF in value\n\tparam\t\tt\t\tCoordF in value\n\tparam\t\tr\t\tCoordF in value\n\tparam\t\tq\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord4fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t120\n\nTexCoord4fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t62\n\toffset\t\t121\n\nTexCoord4i(s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordI in value\n\tparam\t\tt\t\tCoordI in value\n\tparam\t\tr\t\tCoordI in value\n\tparam\t\tq\t\tCoordI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord4iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t122\n\nTexCoord4iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t63\n\toffset\t\t123\n\nTexCoord4s(s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ts\t\tCoordS in value\n\tparam\t\tt\t\tCoordS in value\n\tparam\t\tr\t\tCoordS in value\n\tparam\t\tq\t\tCoordS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tTexCoord4sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t124\n\nTexCoord4sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t64\n\toffset\t\t125\n\nVertex2d(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex2dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t126\n\nVertex2dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t65\n\toffset\t\t127\n\nVertex2f(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex2fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t128\n\nVertex2fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t66\n\toffset\t\t129\n\nVertex2i(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex2iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t130\n\nVertex2iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t67\n\toffset\t\t131\n\nVertex2s(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex2sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t132\n\nVertex2sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t68\n\toffset\t\t133\n\nVertex3d(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tparam\t\tz\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex3dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t134\n\nVertex3dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t69\n\toffset\t\t135\n\nVertex3f(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tparam\t\tz\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex3fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t136\n\nVertex3fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t70\n\toffset\t\t137\n\nVertex3i(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tparam\t\tz\t\tCoordI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex3iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t138\n\nVertex3iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t71\n\toffset\t\t139\n\nVertex3s(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tparam\t\tz\t\tCoordS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex3sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t140\n\nVertex3sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [3]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t72\n\toffset\t\t141\n\nVertex4d(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tparam\t\tz\t\tCoordD in value\n\tparam\t\tw\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex4dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t142\n\nVertex4dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t73\n\toffset\t\t143\n\nVertex4f(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tparam\t\tz\t\tCoordF in value\n\tparam\t\tw\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex4fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t144\n\nVertex4fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t74\n\toffset\t\t145\n\nVertex4i(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tparam\t\tz\t\tCoordI in value\n\tparam\t\tw\t\tCoordI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex4iv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t146\n\nVertex4iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t75\n\toffset\t\t147\n\nVertex4s(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tparam\t\tz\t\tCoordS in value\n\tparam\t\tw\t\tCoordS in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tvectorequiv\tVertex4sv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t148\n\nVertex4sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t76\n\toffset\t\t149\n\nClipPlane(plane, equation)\n\treturn\t\tvoid\n\tparam\t\tplane\t\tClipPlaneName in value\n\tparam\t\tequation\tFloat64 in array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t77\n\toffset\t\t150\n\nColorMaterial(face, mode)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tmode\t\tColorMaterialParameter in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t78\n\toffset\t\t151\n\nFogf(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tFogParameter in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t80\n\twglflags\tsmall-data\n\toffset\t\t153\n\nFogfv(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tFogParameter in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t81\n\twglflags\tsmall-data\n\toffset\t\t154\n\nFogi(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tFogParameter in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t82\n\twglflags\tsmall-data\n\toffset\t\t155\n\nFogiv(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tFogParameter in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t83\n\twglflags\tsmall-data\n\toffset\t\t156\n\nLightf(light, pname, param)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tLightName in value\n\tparam\t\tpname\t\tLightParameter in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t86\n\twglflags\tsmall-data\n\toffset\t\t159\n\nLightfv(light, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tLightName in value\n\tparam\t\tpname\t\tLightParameter in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t87\n\twglflags\tsmall-data\n\toffset\t\t160\n\nLighti(light, pname, param)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tLightName in value\n\tparam\t\tpname\t\tLightParameter in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t88\n\twglflags\tsmall-data\n\toffset\t\t161\n\nLightiv(light, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tLightName in value\n\tparam\t\tpname\t\tLightParameter in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t89\n\twglflags\tsmall-data\n\toffset\t\t162\n\nLightModelf(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tLightModelParameter in value\n\tparam\t\tparam\t\tFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t90\n\twglflags\tsmall-data\n\toffset\t\t163\n\nLightModelfv(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tLightModelParameter in value\n\tparam\t\tparams\t\tFloat32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t91\n\twglflags\tsmall-data\n\toffset\t\t164\n\nLightModeli(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tLightModelParameter in value\n\tparam\t\tparam\t\tInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t92\n\twglflags\tsmall-data\n\toffset\t\t165\n\nLightModeliv(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tLightModelParameter in value\n\tparam\t\tparams\t\tInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t93\n\twglflags\tsmall-data\n\toffset\t\t166\n\nLineStipple(factor, pattern)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tCheckedInt32 in value\n\tparam\t\tpattern\t\tLineStipple in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t94\n\toffset\t\t167\n\nMaterialf(face, pname, param)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t96\n\twglflags\tsmall-data\n\toffset\t\t169\n\nMaterialfv(face, pname, params)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t97\n\twglflags\tsmall-data\n\toffset\t\t170\n\nMateriali(face, pname, param)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t98\n\twglflags\tsmall-data\n\toffset\t\t171\n\nMaterialiv(face, pname, params)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t99\n\twglflags\tsmall-data\n\toffset\t\t172\n\nPolygonStipple(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tUInt8 in array [COMPSIZE()]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t102\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t175\n\nShadeModel(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tShadingModel in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t104\n\toffset\t\t177\n\nTexEnvf(target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t111\n\twglflags\tsmall-data\n\toffset\t\t184\n\nTexEnvfv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t112\n\twglflags\tsmall-data\n\toffset\t\t185\n\nTexEnvi(target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t113\n\twglflags\tsmall-data\n\toffset\t\t186\n\nTexEnviv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t114\n\twglflags\tsmall-data\n\toffset\t\t187\n\nTexGend(coord, pname, param)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparam\t\tFloat64 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t115\n\twglflags\tsmall-data\n\toffset\t\t188\n\nTexGendv(coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tFloat64 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t116\n\twglflags\tsmall-data\n\toffset\t\t189\n\nTexGenf(coord, pname, param)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t117\n\twglflags\tsmall-data\n\toffset\t\t190\n\nTexGenfv(coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t118\n\twglflags\tsmall-data\n\toffset\t\t191\n\nTexGeni(coord, pname, param)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t119\n\twglflags\tsmall-data\n\toffset\t\t192\n\nTexGeniv(coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: drawing-control\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t120\n\twglflags\tsmall-data\n\toffset\t\t193\n\n# feedback commands\n\nFeedbackBuffer(size, type, buffer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tSizeI in value\n\tparam\t\ttype\t\tFeedbackType in value\n\tparam\t\tbuffer\t\tFeedbackElement out array [size] retained\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: feedback\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t105\n\twglflags\tclient-handcode server-handcode batchable\n\toffset\t\t194\n\nSelectBuffer(size, buffer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tSizeI in value\n\tparam\t\tbuffer\t\tSelectName out array [size] retained\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: feedback\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t106\n\twglflags\tclient-handcode server-handcode batchable\n\toffset\t\t195\n\nRenderMode(mode)\n\treturn\t\tInt32\n\tparam\t\tmode\t\tRenderingMode in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: feedback\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t107\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t196\n\nInitNames()\n\treturn\t\tvoid\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: feedback\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t121\n\toffset\t\t197\n\nLoadName(name)\n\treturn\t\tvoid\n\tparam\t\tname\t\tSelectName in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: feedback\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t122\n\toffset\t\t198\n\nPassThrough(token)\n\treturn\t\tvoid\n\tparam\t\ttoken\t\tFeedbackElement in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: feedback\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t123\n\toffset\t\t199\n\nPopName()\n\treturn\t\tvoid\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: feedback\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t124\n\toffset\t\t200\n\nPushName(name)\n\treturn\t\tvoid\n\tparam\t\tname\t\tSelectName in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: feedback\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t125\n\toffset\t\t201\n\nClearAccum(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tFloat32 in value\n\tparam\t\tgreen\t\tFloat32 in value\n\tparam\t\tblue\t\tFloat32 in value\n\tparam\t\talpha\t\tFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: framebuf\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t128\n\toffset\t\t204\n\nClearIndex(c)\n\treturn\t\tvoid\n\tparam\t\tc\t\tMaskedColorIndexValueF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: framebuf\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t129\n\toffset\t\t205\n\nIndexMask(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tMaskedColorIndexValueI in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: framebuf\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t136\n\toffset\t\t212\n\nAccum(op, value)\n\treturn\t\tvoid\n\tparam\t\top\t\tAccumOp in value\n\tparam\t\tvalue\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: misc\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t137\n\toffset\t\t213\n\nPopAttrib()\n\treturn\t\tvoid\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: misc\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t141\n\toffset\t\t218\n\nPushAttrib(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tAttribMask in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: misc\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t142\n\toffset\t\t219\n\n# modeling commands\n\nMap1d(target, u1, u2, stride, order, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMapTarget in value\n\tparam\t\tu1\t\tCoordD in value\n\tparam\t\tu2\t\tCoordD in value\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\torder\t\tCheckedInt32 in value\n\tparam\t\tpoints\t\tCoordD in array [COMPSIZE(target/stride/order)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t143\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t220\n\nMap1f(target, u1, u2, stride, order, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMapTarget in value\n\tparam\t\tu1\t\tCoordF in value\n\tparam\t\tu2\t\tCoordF in value\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\torder\t\tCheckedInt32 in value\n\tparam\t\tpoints\t\tCoordF in array [COMPSIZE(target/stride/order)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t144\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t221\n\nMap2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMapTarget in value\n\tparam\t\tu1\t\tCoordD in value\n\tparam\t\tu2\t\tCoordD in value\n\tparam\t\tustride\t\tInt32 in value\n\tparam\t\tuorder\t\tCheckedInt32 in value\n\tparam\t\tv1\t\tCoordD in value\n\tparam\t\tv2\t\tCoordD in value\n\tparam\t\tvstride\t\tInt32 in value\n\tparam\t\tvorder\t\tCheckedInt32 in value\n\tparam\t\tpoints\t\tCoordD in array [COMPSIZE(target/ustride/uorder/vstride/vorder)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t145\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t222\n\nMap2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMapTarget in value\n\tparam\t\tu1\t\tCoordF in value\n\tparam\t\tu2\t\tCoordF in value\n\tparam\t\tustride\t\tInt32 in value\n\tparam\t\tuorder\t\tCheckedInt32 in value\n\tparam\t\tv1\t\tCoordF in value\n\tparam\t\tv2\t\tCoordF in value\n\tparam\t\tvstride\t\tInt32 in value\n\tparam\t\tvorder\t\tCheckedInt32 in value\n\tparam\t\tpoints\t\tCoordF in array [COMPSIZE(target/ustride/uorder/vstride/vorder)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t146\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t223\n\nMapGrid1d(un, u1, u2)\n\treturn\t\tvoid\n\tparam\t\tun\t\tInt32 in value\n\tparam\t\tu1\t\tCoordD in value\n\tparam\t\tu2\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t147\n\toffset\t\t224\n\nMapGrid1f(un, u1, u2)\n\treturn\t\tvoid\n\tparam\t\tun\t\tInt32 in value\n\tparam\t\tu1\t\tCoordF in value\n\tparam\t\tu2\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t148\n\toffset\t\t225\n\nMapGrid2d(un, u1, u2, vn, v1, v2)\n\treturn\t\tvoid\n\tparam\t\tun\t\tInt32 in value\n\tparam\t\tu1\t\tCoordD in value\n\tparam\t\tu2\t\tCoordD in value\n\tparam\t\tvn\t\tInt32 in value\n\tparam\t\tv1\t\tCoordD in value\n\tparam\t\tv2\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t149\n\toffset\t\t226\n\nMapGrid2f(un, u1, u2, vn, v1, v2)\n\treturn\t\tvoid\n\tparam\t\tun\t\tInt32 in value\n\tparam\t\tu1\t\tCoordF in value\n\tparam\t\tu2\t\tCoordF in value\n\tparam\t\tvn\t\tInt32 in value\n\tparam\t\tv1\t\tCoordF in value\n\tparam\t\tv2\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t150\n\toffset\t\t227\n\nEvalCoord1d(u)\n\treturn\t\tvoid\n\tparam\t\tu\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tvectorequiv\tEvalCoord1dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t228\n\nEvalCoord1dv(u)\n\treturn\t\tvoid\n\tparam\t\tu\t\tCoordD in array [1]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t151\n\toffset\t\t229\n\nEvalCoord1f(u)\n\treturn\t\tvoid\n\tparam\t\tu\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tvectorequiv\tEvalCoord1fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t230\n\nEvalCoord1fv(u)\n\treturn\t\tvoid\n\tparam\t\tu\t\tCoordF in array [1]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t152\n\toffset\t\t231\n\nEvalCoord2d(u, v)\n\treturn\t\tvoid\n\tparam\t\tu\t\tCoordD in value\n\tparam\t\tv\t\tCoordD in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tvectorequiv\tEvalCoord2dv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t232\n\nEvalCoord2dv(u)\n\treturn\t\tvoid\n\tparam\t\tu\t\tCoordD in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t153\n\toffset\t\t233\n\nEvalCoord2f(u, v)\n\treturn\t\tvoid\n\tparam\t\tu\t\tCoordF in value\n\tparam\t\tv\t\tCoordF in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tvectorequiv\tEvalCoord2fv\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\toffset\t\t234\n\nEvalCoord2fv(u)\n\treturn\t\tvoid\n\tparam\t\tu\t\tCoordF in array [2]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t154\n\toffset\t\t235\n\nEvalMesh1(mode, i1, i2)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMeshMode1 in value\n\tparam\t\ti1\t\tCheckedInt32 in value\n\tparam\t\ti2\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t155\n\toffset\t\t236\n\nEvalPoint1(i)\n\treturn\t\tvoid\n\tparam\t\ti\t\tInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t156\n\toffset\t\t237\n\nEvalMesh2(mode, i1, i2, j1, j2)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMeshMode2 in value\n\tparam\t\ti1\t\tCheckedInt32 in value\n\tparam\t\ti2\t\tCheckedInt32 in value\n\tparam\t\tj1\t\tCheckedInt32 in value\n\tparam\t\tj2\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t157\n\toffset\t\t238\n\nEvalPoint2(i, j)\n\treturn\t\tvoid\n\tparam\t\ti\t\tCheckedInt32 in value\n\tparam\t\tj\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: modeling\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t158\n\toffset\t\t239\n\nAlphaFunc(func, ref)\n\treturn\t\tvoid\n\tparam\t\tfunc\t\tAlphaFunction in value\n\tparam\t\tref\t\tClampedFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: pixel-op\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t159\n\toffset\t\t240\n\nPixelZoom(xfactor, yfactor)\n\treturn\t\tvoid\n\tparam\t\txfactor\t\tFloat32 in value\n\tparam\t\tyfactor\t\tFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: pixel-rw\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t165\n\toffset\t\t246\n\nPixelTransferf(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPixelTransferParameter in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: pixel-rw\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t166\n\toffset\t\t247\n\nPixelTransferi(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPixelTransferParameter in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: pixel-rw\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t167\n\toffset\t\t248\n\nPixelMapfv(map, mapsize, values)\n\treturn\t\tvoid\n\tparam\t\tmap\t\tPixelMap in value\n\tparam\t\tmapsize\t\tCheckedInt32 in value\n\tparam\t\tvalues\t\tFloat32 in array [mapsize]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: pixel-rw\n\tglxflags\tclient-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t168\n\toffset\t\t251\n\nPixelMapuiv(map, mapsize, values)\n\treturn\t\tvoid\n\tparam\t\tmap\t\tPixelMap in value\n\tparam\t\tmapsize\t\tCheckedInt32 in value\n\tparam\t\tvalues\t\tUInt32 in array [mapsize]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: pixel-rw\n\tglxflags\tclient-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t169\n\toffset\t\t252\n\nPixelMapusv(map, mapsize, values)\n\treturn\t\tvoid\n\tparam\t\tmap\t\tPixelMap in value\n\tparam\t\tmapsize\t\tCheckedInt32 in value\n\tparam\t\tvalues\t\tUInt16 in array [mapsize]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: pixel-rw\n\tglxflags\tclient-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t170\n\toffset\t\t253\n\nCopyPixels(x, y, width, height, type)\n\treturn\t\tvoid\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\ttype\t\tPixelCopyType in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: pixel-rw\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t172\n\toffset\t\t255\n\nDrawPixels(width, height, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: pixel-rw\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t173\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t257\n\nGetClipPlane(plane, equation)\n\treturn\t\tvoid\n\tparam\t\tplane\t\tClipPlaneName in value\n\tparam\t\tequation\tFloat64 out array [4]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t113\n\tglxflags\tclient-handcode server-handcode\n\toffset\t\t259\n\nGetLightfv(light, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tLightName in value\n\tparam\t\tpname\t\tLightParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t118\n\twglflags\tsmall-data\n\toffset\t\t264\n\nGetLightiv(light, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tLightName in value\n\tparam\t\tpname\t\tLightParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t119\n\twglflags\tsmall-data\n\toffset\t\t265\n\nGetMapdv(target, query, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMapTarget in value\n\tparam\t\tquery\t\tGetMapQuery in value\n\tparam\t\tv\t\tFloat64 out array [COMPSIZE(target/query)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t120\n\toffset\t\t266\n\nGetMapfv(target, query, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMapTarget in value\n\tparam\t\tquery\t\tGetMapQuery in value\n\tparam\t\tv\t\tFloat32 out array [COMPSIZE(target/query)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t121\n\toffset\t\t267\n\nGetMapiv(target, query, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMapTarget in value\n\tparam\t\tquery\t\tGetMapQuery in value\n\tparam\t\tv\t\tInt32 out array [COMPSIZE(target/query)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t122\n\toffset\t\t268\n\nGetMaterialfv(face, pname, params)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t123\n\twglflags\tsmall-data\n\toffset\t\t269\n\nGetMaterialiv(face, pname, params)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t124\n\twglflags\tsmall-data\n\toffset\t\t270\n\nGetPixelMapfv(map, values)\n\treturn\t\tvoid\n\tparam\t\tmap\t\tPixelMap in value\n\tparam\t\tvalues\t\tFloat32 out array [COMPSIZE(map)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t125\n\toffset\t\t271\n\nGetPixelMapuiv(map, values)\n\treturn\t\tvoid\n\tparam\t\tmap\t\tPixelMap in value\n\tparam\t\tvalues\t\tUInt32 out array [COMPSIZE(map)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t126\n\toffset\t\t272\n\nGetPixelMapusv(map, values)\n\treturn\t\tvoid\n\tparam\t\tmap\t\tPixelMap in value\n\tparam\t\tvalues\t\tUInt16 out array [COMPSIZE(map)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t127\n\toffset\t\t273\n\nGetPolygonStipple(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tUInt8 out array [COMPSIZE()]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t128\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t274\n\nGetTexEnvfv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t130\n\twglflags\tsmall-data\n\toffset\t\t276\n\nGetTexEnviv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t131\n\twglflags\tsmall-data\n\toffset\t\t277\n\nGetTexGendv(coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tFloat64 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t132\n\twglflags\tsmall-data\n\toffset\t\t278\n\nGetTexGenfv(coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t133\n\twglflags\tsmall-data\n\toffset\t\t279\n\nGetTexGeniv(coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t134\n\twglflags\tsmall-data\n\toffset\t\t280\n\nIsList(list)\n\treturn\t\tBoolean\n\tparam\t\tlist\t\tList in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: state-req\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxsingle\t141\n\toffset\t\t287\n\nFrustum(left, right, bottom, top, zNear, zFar)\n\treturn\t\tvoid\n\tparam\t\tleft\t\tFloat64 in value\n\tparam\t\tright\t\tFloat64 in value\n\tparam\t\tbottom\t\tFloat64 in value\n\tparam\t\ttop\t\tFloat64 in value\n\tparam\t\tzNear\t\tFloat64 in value\n\tparam\t\tzFar\t\tFloat64 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t175\n\toffset\t\t289\n\nLoadIdentity()\n\treturn\t\tvoid\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t176\n\toffset\t\t290\n\nLoadMatrixf(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat32 in array [16]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t177\n\toffset\t\t291\n\nLoadMatrixd(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat64 in array [16]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t178\n\toffset\t\t292\n\nMatrixMode(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t179\n\toffset\t\t293\n\nMultMatrixf(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat32 in array [16]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t180\n\toffset\t\t294\n\nMultMatrixd(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat64 in array [16]\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t181\n\toffset\t\t295\n\nOrtho(left, right, bottom, top, zNear, zFar)\n\treturn\t\tvoid\n\tparam\t\tleft\t\tFloat64 in value\n\tparam\t\tright\t\tFloat64 in value\n\tparam\t\tbottom\t\tFloat64 in value\n\tparam\t\ttop\t\tFloat64 in value\n\tparam\t\tzNear\t\tFloat64 in value\n\tparam\t\tzFar\t\tFloat64 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t182\n\toffset\t\t296\n\nPopMatrix()\n\treturn\t\tvoid\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t183\n\toffset\t\t297\n\nPushMatrix()\n\treturn\t\tvoid\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t184\n\toffset\t\t298\n\nRotated(angle, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tangle\t\tFloat64 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t185\n\toffset\t\t299\n\nRotatef(angle, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tangle\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t186\n\toffset\t\t300\n\nScaled(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t187\n\toffset\t\t301\n\nScalef(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t188\n\toffset\t\t302\n\nTranslated(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t189\n\toffset\t\t303\n\nTranslatef(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tVERSION_1_0_DEPRECATED\t   # old: xform\n\tversion\t\t1.0\n\tdeprecated\t3.1\n\tglxropcode\t190\n\toffset\t\t304\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 1.1 commands\n#\n###############################################################################\n###############################################################################\n\nDrawArrays(mode, first, count)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tfirst\t\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tcategory\tVERSION_1_1\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\tglxropcode\t193\n\toffset\t\t310\n\nDrawElements(mode, count, type, indices)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoid in array [COMPSIZE(count/type)]\n\tcategory\tVERSION_1_1\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\toffset\t\t311\n\nGetPointerv(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGetPointervPName in value\n\tparam\t\tparams\t\tVoidPointer out array [1]\n\tcategory\tVERSION_1_1\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\toffset\t\t329\n\nPolygonOffset(factor, units)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tFloat32 in value\n\tparam\t\tunits\t\tFloat32 in value\n\tcategory\tVERSION_1_1\n\tversion\t\t1.1\n\tglxropcode\t192\n\toffset\t\t319\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nCopyTexImage1D(target, level, internalformat, x, y, width, border)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_1\n\tversion\t\t1.1\n\tglxropcode\t4119\n\tglxflags\tEXT\n\toffset\t\t323\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nCopyTexImage2D(target, level, internalformat, x, y, width, height, border)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_1\n\tversion\t\t1.1\n\tglxropcode\t4120\n\tglxflags\tEXT\n\toffset\t\t324\n\nCopyTexSubImage1D(target, level, xoffset, x, y, width)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tcategory\tVERSION_1_1\n\tversion\t\t1.1\n\tglxropcode\t4121\n\tglxflags\tEXT\n\toffset\t\t325\n\nCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tVERSION_1_1\n\tversion\t\t1.1\n\tglxropcode\t4122\n\tglxflags\tEXT\n\toffset\t\t326\n\nTexSubImage1D(target, level, xoffset, width, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tVERSION_1_1\n\tdlflags\t\thandcode\n\tglxflags\tEXT client-handcode server-handcode\n\tversion\t\t1.1\n\tglxropcode\t4099\n\toffset\t\t332\n\nTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height)]\n\tcategory\tVERSION_1_1\n\tdlflags\t\thandcode\n\tglxflags\tEXT client-handcode server-handcode\n\tversion\t\t1.1\n\tglxropcode\t4100\n\toffset\t\t333\n\nBindTexture(target, texture)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\ttexture\t\tTexture in value\n\tcategory\tVERSION_1_1\n\tversion\t\t1.1\n\tglxropcode\t4117\n\tglxflags\tEXT\n\toffset\t\t307\n\nDeleteTextures(n, textures)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\ttextures\tTexture in array [n]\n\tcategory\tVERSION_1_1\n\tdlflags\t\tnotlistable\n\tversion\t\t1.1\n\tglxsingle\t144\n\toffset\t\t327\n\nGenTextures(n, textures)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\ttextures\tTexture out array [n]\n\tcategory\tVERSION_1_1\n\tdlflags\t\tnotlistable\n\tversion\t\t1.1\n\tglxsingle\t145\n\toffset\t\t328\n\nIsTexture(texture)\n\treturn\t\tBoolean\n\tparam\t\ttexture\t\tTexture in value\n\tcategory\tVERSION_1_1\n\tdlflags\t\tnotlistable\n\tversion\t\t1.1\n\tglxsingle\t146\n\toffset\t\t330\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 1.1 deprecated commands\n#\n###############################################################################\n###############################################################################\n\nArrayElement(i)\n\treturn\t\tvoid\n\tparam\t\ti\t\tInt32 in value\n\tcategory\tVERSION_1_1_DEPRECATED\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\toffset\t\t306\n\nColorPointer(size, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tColorPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride)] retained\n\tcategory\tVERSION_1_1_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\toffset\t\t308\n\nDisableClientState(array)\n\treturn\t\tvoid\n\tparam\t\tarray\t\tEnableCap in value\n\tcategory\tVERSION_1_1_DEPRECATED\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\toffset\t\t309\n\nEdgeFlagPointer(stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(stride)] retained\n\tcategory\tVERSION_1_1_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\toffset\t\t312\n\nEnableClientState(array)\n\treturn\t\tvoid\n\tparam\t\tarray\t\tEnableCap in value\n\tcategory\tVERSION_1_1_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\toffset\t\t313\n\nIndexPointer(type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tIndexPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type/stride)] retained\n\tcategory\tVERSION_1_1_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\toffset\t\t314\n\nInterleavedArrays(format, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tformat\t\tInterleavedArrayFormat in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(format/stride)] retained\n\tcategory\tVERSION_1_1_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\toffset\t\t317\n\nNormalPointer(type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tNormalPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type/stride)] retained\n\tcategory\tVERSION_1_1_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\toffset\t\t318\n\nTexCoordPointer(size, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tTexCoordPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride)] retained\n\tcategory\tVERSION_1_1_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\toffset\t\t320\n\nVertexPointer(size, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride)] retained\n\tcategory\tVERSION_1_1_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\toffset\t\t321\n\nAreTexturesResident(n, textures, residences)\n\treturn\t\tBoolean\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\ttextures\tTexture in array [n]\n\tparam\t\tresidences\tBoolean out array [n]\n\tcategory\tVERSION_1_1_DEPRECATED\n\tglxsingle\t143\n\tdlflags\t\tnotlistable\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\toffset\t\t322\n\nPrioritizeTextures(n, textures, priorities)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\ttextures\tTexture in array [n]\n\tparam\t\tpriorities\tClampedFloat32 in array [n]\n\tcategory\tVERSION_1_1_DEPRECATED\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\tglxropcode\t4118\n\tglxflags\tEXT\n\toffset\t\t331\n\nIndexub(c)\n\treturn\t\tvoid\n\tparam\t\tc\t\tColorIndexValueUB in value\n\tcategory\tVERSION_1_1_DEPRECATED\n\tvectorequiv\tIndexubv\n\tversion\t\t1.1\n\toffset\t\t315\n\nIndexubv(c)\n\treturn\t\tvoid\n\tparam\t\tc\t\tColorIndexValueUB in array [1]\n\tcategory\tVERSION_1_1_DEPRECATED\n\tversion\t\t1.1\n\tglxropcode\t194\n\toffset\t\t316\n\nPopClientAttrib()\n\treturn\t\tvoid\n\tcategory\tVERSION_1_1_DEPRECATED\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\toffset\t\t334\n\nPushClientAttrib(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tClientAttribMask in value\n\tcategory\tVERSION_1_1_DEPRECATED\n\tversion\t\t1.1\n\tdeprecated\t3.1\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\toffset\t\t335\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 1.2 commands\n#\n###############################################################################\n###############################################################################\n\nBlendColor(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tClampedColorF in value\n\tparam\t\tgreen\t\tClampedColorF in value\n\tparam\t\tblue\t\tClampedColorF in value\n\tparam\t\talpha\t\tClampedColorF in value\n\tcategory\tVERSION_1_2\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tglxropcode\t4096\n\toffset\t\t336\n\nBlendEquation(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBlendEquationMode in value\n\tcategory\tVERSION_1_2\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tglxropcode\t4097\n\toffset\t\t337\n\nDrawRangeElements(mode, start, end, count, type, indices)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tstart\t\tUInt32 in value\n\tparam\t\tend\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoid in array [COMPSIZE(count/type)]\n\tcategory\tVERSION_1_2\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.2\n\toffset\t\t338\n\n# OpenGL 1.2 (EXT_texture3D) commands\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureComponentCount in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height/depth)]\n\tcategory\tVERSION_1_2\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4114\n\toffset\t\t371\n\nTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height/depth)]\n\tcategory\tVERSION_1_2\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.2\n\tglxropcode\t4115\n\toffset\t\t372\n\n# OpenGL 1.2 (EXT_copy_texture) commands (specific to texture3D)\n\nCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tVERSION_1_2\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tglxropcode\t4123\n\toffset\t\t373\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 1.2 deprecated commands\n#\n###############################################################################\n###############################################################################\n\n# OpenGL 1.2 (SGI_color_table) commands\n\nColorTable(target, internalformat, width, format, type, table)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\ttable\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t2053\n\toffset\t\t339\n\nColorTableParameterfv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tpname\t\tColorTableParameterPName in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t2054\n\toffset\t\t340\n\nColorTableParameteriv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tpname\t\tColorTableParameterPName in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t2055\n\toffset\t\t341\n\nCopyColorTable(target, internalformat, x, y, width)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t2056\n\toffset\t\t342\n\nGetColorTable(target, format, type, table)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\ttable\t\tVoid out array [COMPSIZE(target/format/type)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t147\n\toffset\t\t343\n\nGetColorTableParameterfv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tpname\t\tGetColorTableParameterPName in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t148\n\toffset\t\t344\n\nGetColorTableParameteriv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tpname\t\tGetColorTableParameterPName in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t149\n\toffset\t\t345\n\n# OpenGL 1.2 (EXT_color_subtable) commands\n\nColorSubTable(target, start, count, format, type, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tstart\t\tSizeI in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tdata\t\tVoid in array [COMPSIZE(format/type/count)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t195\n\toffset\t\t346\n\nCopyColorSubTable(target, start, x, y, width)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tstart\t\tSizeI in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tcategory\tVERSION_1_2_DEPRECATED\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t196\n\toffset\t\t347\n\n# OpenGL 1.2 (EXT_convolution) commands\n\nConvolutionFilter1D(target, internalformat, width, format, type, image)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTarget in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\timage\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4101\n\toffset\t\t348\n\nConvolutionFilter2D(target, internalformat, width, height, format, type, image)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTarget in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\timage\t\tVoid in array [COMPSIZE(format/type/width/height)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4102\n\toffset\t\t349\n\nConvolutionParameterf(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTarget in value\n\tparam\t\tpname\t\tConvolutionParameter in value\n\tparam\t\tparams\t\tCheckedFloat32 in value\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4103\n\toffset\t\t350\n\nConvolutionParameterfv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTarget in value\n\tparam\t\tpname\t\tConvolutionParameter in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4104\n\toffset\t\t351\n\nConvolutionParameteri(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTarget in value\n\tparam\t\tpname\t\tConvolutionParameter in value\n\tparam\t\tparams\t\tCheckedInt32 in value\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4105\n\toffset\t\t352\n\nConvolutionParameteriv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTarget in value\n\tparam\t\tpname\t\tConvolutionParameter in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4106\n\toffset\t\t353\n\nCopyConvolutionFilter1D(target, internalformat, x, y, width)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTarget in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4107\n\toffset\t\t354\n\nCopyConvolutionFilter2D(target, internalformat, x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTarget in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4108\n\toffset\t\t355\n\nGetConvolutionFilter(target, format, type, image)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTarget in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\timage\t\tVoid out array [COMPSIZE(target/format/type)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t150\n\toffset\t\t356\n\nGetConvolutionParameterfv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTarget in value\n\tparam\t\tpname\t\tGetConvolutionParameterPName in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t151\n\toffset\t\t357\n\nGetConvolutionParameteriv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTarget in value\n\tparam\t\tpname\t\tGetConvolutionParameterPName in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t152\n\toffset\t\t358\n\nGetSeparableFilter(target, format, type, row, column, span)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tSeparableTarget in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\trow\t\tVoid out array [COMPSIZE(target/format/type)]\n\tparam\t\tcolumn\t\tVoid out array [COMPSIZE(target/format/type)]\n\tparam\t\tspan\t\tVoid out array [COMPSIZE(target/format/type)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t153\n\toffset\t\t359\n\nSeparableFilter2D(target, internalformat, width, height, format, type, row, column)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tSeparableTarget in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\trow\t\tVoid in array [COMPSIZE(target/format/type/width)]\n\tparam\t\tcolumn\t\tVoid in array [COMPSIZE(target/format/type/height)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4109\n\toffset\t\t360\n\n# OpenGL 1.2 (EXT_histogram) commands\n\nGetHistogram(target, reset, format, type, values)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHistogramTarget in value\n\tparam\t\treset\t\tBoolean in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tvalues\t\tVoid out array [COMPSIZE(target/format/type)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t154\n\toffset\t\t361\n\nGetHistogramParameterfv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHistogramTarget in value\n\tparam\t\tpname\t\tGetHistogramParameterPName in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t155\n\toffset\t\t362\n\nGetHistogramParameteriv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHistogramTarget in value\n\tparam\t\tpname\t\tGetHistogramParameterPName in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t156\n\toffset\t\t363\n\nGetMinmax(target, reset, format, type, values)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMinmaxTarget in value\n\tparam\t\treset\t\tBoolean in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tvalues\t\tVoid out array [COMPSIZE(target/format/type)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t157\n\toffset\t\t364\n\nGetMinmaxParameterfv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMinmaxTarget in value\n\tparam\t\tpname\t\tGetMinmaxParameterPName in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t158\n\toffset\t\t365\n\nGetMinmaxParameteriv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMinmaxTarget in value\n\tparam\t\tpname\t\tGetMinmaxParameterPName in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxsingle\t159\n\toffset\t\t366\n\nHistogram(target, width, internalformat, sink)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHistogramTarget in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tsink\t\tBoolean in value\n\tcategory\tVERSION_1_2_DEPRECATED\n\tdlflags\t\thandcode\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4110\n\toffset\t\t367\n\nMinmax(target, internalformat, sink)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMinmaxTarget in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tsink\t\tBoolean in value\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4111\n\toffset\t\t368\n\nResetHistogram(target)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHistogramTarget in value\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4112\n\toffset\t\t369\n\nResetMinmax(target)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMinmaxTarget in value\n\tcategory\tVERSION_1_2_DEPRECATED\n\tglxflags\tEXT\n\tversion\t\t1.2\n\tdeprecated\t3.1\n\tglxropcode\t4113\n\toffset\t\t370\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 1.3 commands\n#\n###############################################################################\n###############################################################################\n\n# OpenGL 1.3 (ARB_multitexture) commands\n\nActiveTexture(texture)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTextureUnit in value\n\tcategory\tVERSION_1_3\n\tglxflags\tARB\n\tversion\t\t1.3\n\tglxropcode\t197\n\toffset\t\t374\n\n# OpenGL 1.3 (ARB_multisample) commands\n\nSampleCoverage(value, invert)\n\treturn\t\tvoid\n\tparam\t\tvalue\t\tClampedFloat32 in value\n\tparam\t\tinvert\t\tBoolean in value\n\tcategory\tVERSION_1_3\n\tglxflags\tARB\n\tversion\t\t1.3\n\tglxropcode\t229\n\toffset\t\t412\n\n# OpenGL 1.3 (ARB_texture_compression) commands\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tVERSION_1_3\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.3\n\tglxropcode\t216\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t554\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tVERSION_1_3\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.3\n\tglxropcode\t215\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t555\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tVERSION_1_3\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.3\n\tglxropcode\t214\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t556\n\nCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tVERSION_1_3\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.3\n\tglxropcode\t219\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t557\n\nCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tVERSION_1_3\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.3\n\tglxropcode\t218\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t558\n\nCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tVERSION_1_3\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.3\n\tglxropcode\t217\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t559\n\nGetCompressedTexImage(target, level, img)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\timg\t\tCompressedTextureARB out array [COMPSIZE(target/level)]\n\tcategory\tVERSION_1_3\n\tdlflags\t\tnotlistable\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.3\n\tglxsingle\t160\n\twglflags\tclient-handcode server-handcode\n\toffset\t\t560\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 1.3 deprecated commands\n#\n###############################################################################\n###############################################################################\n\nClientActiveTexture(texture)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTextureUnit in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tARB client-handcode client-intercept server-handcode\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\toffset\t\t375\n\nMultiTexCoord1d(target, s)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordD in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord1dv\n\toffset\t\t376\n\nMultiTexCoord1dv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordD in array [1]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t198\n\toffset\t\t377\n\nMultiTexCoord1f(target, s)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordF in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord1fv\n\toffset\t\t378\n\nMultiTexCoord1fv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordF in array [1]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t199\n\toffset\t\t379\n\nMultiTexCoord1i(target, s)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordI in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord1iv\n\toffset\t\t380\n\nMultiTexCoord1iv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordI in array [1]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t200\n\toffset\t\t381\n\nMultiTexCoord1s(target, s)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordS in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord1sv\n\toffset\t\t382\n\nMultiTexCoord1sv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordS in array [1]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t201\n\toffset\t\t383\n\nMultiTexCoord2d(target, s, t)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordD in value\n\tparam\t\tt\t\tCoordD in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord2dv\n\toffset\t\t384\n\nMultiTexCoord2dv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordD in array [2]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t202\n\toffset\t\t385\n\nMultiTexCoord2f(target, s, t)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordF in value\n\tparam\t\tt\t\tCoordF in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord2fv\n\toffset\t\t386\n\nMultiTexCoord2fv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordF in array [2]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t203\n\toffset\t\t387\n\nMultiTexCoord2i(target, s, t)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordI in value\n\tparam\t\tt\t\tCoordI in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord2iv\n\toffset\t\t388\n\nMultiTexCoord2iv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordI in array [2]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t204\n\toffset\t\t389\n\nMultiTexCoord2s(target, s, t)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordS in value\n\tparam\t\tt\t\tCoordS in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord2sv\n\toffset\t\t390\n\nMultiTexCoord2sv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordS in array [2]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t205\n\toffset\t\t391\n\nMultiTexCoord3d(target, s, t, r)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordD in value\n\tparam\t\tt\t\tCoordD in value\n\tparam\t\tr\t\tCoordD in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord3dv\n\toffset\t\t392\n\nMultiTexCoord3dv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordD in array [3]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t206\n\toffset\t\t393\n\nMultiTexCoord3f(target, s, t, r)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordF in value\n\tparam\t\tt\t\tCoordF in value\n\tparam\t\tr\t\tCoordF in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord3fv\n\toffset\t\t394\n\nMultiTexCoord3fv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordF in array [3]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t207\n\toffset\t\t395\n\nMultiTexCoord3i(target, s, t, r)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordI in value\n\tparam\t\tt\t\tCoordI in value\n\tparam\t\tr\t\tCoordI in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord3iv\n\toffset\t\t396\n\nMultiTexCoord3iv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordI in array [3]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t208\n\toffset\t\t397\n\nMultiTexCoord3s(target, s, t, r)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordS in value\n\tparam\t\tt\t\tCoordS in value\n\tparam\t\tr\t\tCoordS in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord3sv\n\toffset\t\t398\n\nMultiTexCoord3sv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordS in array [3]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxflags\tARB\n\tglxropcode\t209\n\toffset\t\t399\n\nMultiTexCoord4d(target, s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordD in value\n\tparam\t\tt\t\tCoordD in value\n\tparam\t\tr\t\tCoordD in value\n\tparam\t\tq\t\tCoordD in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord4dv\n\toffset\t\t400\n\nMultiTexCoord4dv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordD in array [4]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t210\n\toffset\t\t401\n\nMultiTexCoord4f(target, s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordF in value\n\tparam\t\tt\t\tCoordF in value\n\tparam\t\tr\t\tCoordF in value\n\tparam\t\tq\t\tCoordF in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord4fv\n\toffset\t\t402\n\nMultiTexCoord4fv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordF in array [4]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t211\n\toffset\t\t403\n\nMultiTexCoord4i(target, s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordI in value\n\tparam\t\tt\t\tCoordI in value\n\tparam\t\tr\t\tCoordI in value\n\tparam\t\tq\t\tCoordI in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord4iv\n\toffset\t\t404\n\nMultiTexCoord4iv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordI in array [4]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t212\n\toffset\t\t405\n\nMultiTexCoord4s(target, s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordS in value\n\tparam\t\tt\t\tCoordS in value\n\tparam\t\tr\t\tCoordS in value\n\tparam\t\tq\t\tCoordS in value\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tvectorequiv\tMultiTexCoord4sv\n\toffset\t\t406\n\nMultiTexCoord4sv(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordS in array [4]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\tglxropcode\t213\n\toffset\t\t407\n\n# OpenGL 1.3 (ARB_transpose_matrix) commands\n\nLoadTransposeMatrixf(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat32 in array [16]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB client-handcode client-intercept server-handcode\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\toffset\t\t408\n\nLoadTransposeMatrixd(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat64 in array [16]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB client-handcode client-intercept server-handcode\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\toffset\t\t409\n\nMultTransposeMatrixf(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat32 in array [16]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB client-handcode client-intercept server-handcode\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\toffset\t\t410\n\nMultTransposeMatrixd(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat64 in array [16]\n\tcategory\tVERSION_1_3_DEPRECATED\n\tglxflags\tARB client-handcode client-intercept server-handcode\n\tversion\t\t1.3\n\tdeprecated\t3.1\n\toffset\t\t411\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 1.4 commands\n#\n###############################################################################\n###############################################################################\n\n# OpenGL 1.4 (EXT_blend_func_separate) commands\n\nBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha)\n\treturn\t\tvoid\n\tparam\t\tsfactorRGB\tBlendFuncSeparateParameterEXT in value\n\tparam\t\tdfactorRGB\tBlendFuncSeparateParameterEXT in value\n\tparam\t\tsfactorAlpha\tBlendFuncSeparateParameterEXT in value\n\tparam\t\tdfactorAlpha\tBlendFuncSeparateParameterEXT in value\n\tcategory\tVERSION_1_4\n\tglxropcode\t4134\n\tversion\t\t1.4\n\textension\n\toffset\t\t537\n\n# OpenGL 1.4 (EXT_multi_draw_arrays) commands\n\n# first and count are really 'in'\nMultiDrawArrays(mode, first, count, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tfirst\t\tInt32 out array [COMPSIZE(count)]\n\tparam\t\tcount\t\tSizeI out array [COMPSIZE(primcount)]\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tVERSION_1_4\n\tversion\t\t1.4\n\tglxropcode\t?\n\toffset\t\t644\n\nMultiDrawElements(mode, count, type, indices, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tcount\t\tSizeI in array [COMPSIZE(primcount)]\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoidPointer in array [COMPSIZE(primcount)]\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tVERSION_1_4\n\tversion\t\t1.4\n\tglxropcode\t?\n\toffset\t\t645\n\n# OpenGL 1.4 (ARB_point_parameters, NV_point_sprite) commands\n\nPointParameterf(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tVERSION_1_4\n\tversion\t\t1.4\n\tglxropcode\t2065\n\textension\n\toffset\t\t458\n\nPointParameterfv(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_4\n\tversion\t\t1.4\n\tglxropcode\t2066\n\textension\n\toffset\t\t459\n\nPointParameteri(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparam\t\tInt32 in value\n\tcategory\tVERSION_1_4\n\tversion\t\t1.4\n\textension\tsoft WINSOFT NV20\n\tglxropcode\t4221\n\toffset\t\t642\n\nPointParameteriv(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparams\t\tInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_4\n\tversion\t\t1.4\n\textension\tsoft WINSOFT NV20\n\tglxropcode\t4222re\n\toffset\t\t643\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 1.4 deprecated commands\n#\n###############################################################################\n###############################################################################\n\n# OpenGL 1.4 (EXT_fog_coord) commands\n\nFogCoordf(coord)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tCoordF in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tFogCoordfv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t545\n\nFogCoordfv(coord)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tCoordF in array [1]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t4124\n\toffset\t\t546\n\nFogCoordd(coord)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tCoordD in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tFogCoorddv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t547\n\nFogCoorddv(coord)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tCoordD in array [1]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t4125\n\toffset\t\t548\n\nFogCoordPointer(type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tFogPointerTypeEXT in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type/stride)] retained\n\tcategory\tVERSION_1_4_DEPRECATED\n\tdlflags\t\tnotlistable\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxflags\tclient-handcode server-handcode\n\toffset\t\t549\n\n# OpenGL 1.4 (EXT_secondary_color) commands\n\nSecondaryColor3b(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorB in value\n\tparam\t\tgreen\t\tColorB in value\n\tparam\t\tblue\t\tColorB in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tSecondaryColor3bv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t561\n\nSecondaryColor3bv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorB in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t4126\n\toffset\t\t562\n\nSecondaryColor3d(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorD in value\n\tparam\t\tgreen\t\tColorD in value\n\tparam\t\tblue\t\tColorD in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tSecondaryColor3dv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t563\n\nSecondaryColor3dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorD in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t4130\n\toffset\t\t564\n\nSecondaryColor3f(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorF in value\n\tparam\t\tgreen\t\tColorF in value\n\tparam\t\tblue\t\tColorF in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tSecondaryColor3fv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t565\n\nSecondaryColor3fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorF in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t4129\n\toffset\t\t566\n\nSecondaryColor3i(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorI in value\n\tparam\t\tgreen\t\tColorI in value\n\tparam\t\tblue\t\tColorI in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tSecondaryColor3iv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t567\n\nSecondaryColor3iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorI in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t4128\n\toffset\t\t568\n\nSecondaryColor3s(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorS in value\n\tparam\t\tgreen\t\tColorS in value\n\tparam\t\tblue\t\tColorS in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tSecondaryColor3sv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t569\n\nSecondaryColor3sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorS in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t4127\n\toffset\t\t570\n\nSecondaryColor3ub(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUB in value\n\tparam\t\tgreen\t\tColorUB in value\n\tparam\t\tblue\t\tColorUB in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tSecondaryColor3ubv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t571\n\nSecondaryColor3ubv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUB in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t4131\n\toffset\t\t572\n\nSecondaryColor3ui(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUI in value\n\tparam\t\tgreen\t\tColorUI in value\n\tparam\t\tblue\t\tColorUI in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tSecondaryColor3uiv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t573\n\nSecondaryColor3uiv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUI in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t4133\n\toffset\t\t574\n\nSecondaryColor3us(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUS in value\n\tparam\t\tgreen\t\tColorUS in value\n\tparam\t\tblue\t\tColorUS in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tSecondaryColor3usv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t575\n\nSecondaryColor3usv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUS in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t4132\n\toffset\t\t576\n\nSecondaryColorPointer(size, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tColorPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride)] retained\n\tcategory\tVERSION_1_4_DEPRECATED\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\textension\n\toffset\t\t577\n\n# OpenGL 1.4 (ARB_window_pos) commands\n# Note: all WindowPos* entry points use glxropcode ropcode 230, with 3 float parameters\n\nWindowPos2d(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tWindowPos2dv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t513\n\nWindowPos2dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [2]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\toffset\t\t514\n\nWindowPos2f(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tWindowPos2fv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t515\n\nWindowPos2fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [2]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\toffset\t\t516\n\nWindowPos2i(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tWindowPos2iv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t517\n\nWindowPos2iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [2]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\toffset\t\t518\n\nWindowPos2s(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tWindowPos2sv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t519\n\nWindowPos2sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [2]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\toffset\t\t520\n\nWindowPos3d(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tparam\t\tz\t\tCoordD in value\n\tvectorequiv\tWindowPos3dv\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t521\n\nWindowPos3dv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\toffset\t\t522\n\nWindowPos3f(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tparam\t\tz\t\tCoordF in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tWindowPos3fv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t523\n\nWindowPos3fv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\toffset\t\t524\n\nWindowPos3i(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tparam\t\tz\t\tCoordI in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tWindowPos3iv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t525\n\nWindowPos3iv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\toffset\t\t526\n\nWindowPos3s(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tparam\t\tz\t\tCoordS in value\n\tcategory\tVERSION_1_4_DEPRECATED\n\tvectorequiv\tWindowPos3sv\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\toffset\t\t527\n\nWindowPos3sv(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [3]\n\tcategory\tVERSION_1_4_DEPRECATED\n\tversion\t\t1.4\n\tdeprecated\t3.1\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\toffset\t\t528\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 1.5 commands\n#\n###############################################################################\n###############################################################################\n\n# OpenGL 1.5 (ARB_occlusion_query) commands\n\nGenQueries(n, ids)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tids\t\tUInt32 out array [n]\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxsingle\t162\n\tglxflags\tignore\n\toffset\t\t700\n\nDeleteQueries(n, ids)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tids\t\tUInt32 in array [n]\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxsingle\t161\n\tglxflags\tignore\n\toffset\t\t701\n\nIsQuery(id)\n\treturn\t\tBoolean\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxsingle\t163\n\tglxflags\tignore\n\toffset\t\t702\n\nBeginQuery(target, id)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxropcode\t231\n\tglxflags\tignore\n\toffset\t\t703\n\nEndQuery(target)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxropcode\t232\n\tglxflags\tignore\n\toffset\t\t704\n\nGetQueryiv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [pname]\n\tcategory\tVERSION_1_5\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\n\tglxsingle\t164\n\tglxflags\tignore\n\toffset\t\t705\n\nGetQueryObjectiv(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [pname]\n\tcategory\tVERSION_1_5\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\n\tglxsingle\t165\n\tglxflags\tignore\n\toffset\t\t706\n\nGetQueryObjectuiv(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tUInt32 out array [pname]\n\tcategory\tVERSION_1_5\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\n\tglxsingle\t166\n\tglxflags\tignore\n\toffset\t\t707\n\n# OpenGL 1.5 (ARB_vertex_buffer_object) commands\n\nBindBuffer(target, buffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t688\n\nDeleteBuffers(n, buffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tbuffers\t\tConstUInt32 in array [n]\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t691\n\nGenBuffers(n, buffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tbuffers\t\tUInt32 out array [n]\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t692\n\nIsBuffer(buffer)\n\treturn\t\tBoolean\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t696\n\nBufferData(target, size, data, usage)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\tsize\t\tBufferSize in value\n\tparam\t\tdata\t\tConstVoid in array [size]\n\tparam\t\tusage\t\tBufferUsageARB in value\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t689\n\nBufferSubData(target, offset, size, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\toffset\t\tBufferOffset in value\n\tparam\t\tsize\t\tBufferSize in value\n\tparam\t\tdata\t\tConstVoid in array [size]\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t690\n\nGetBufferSubData(target, offset, size, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\toffset\t\tBufferOffset in value\n\tparam\t\tsize\t\tBufferSize in value\n\tparam\t\tdata\t\tVoid out array [size]\n\tcategory\tVERSION_1_5\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t695\n\nMapBuffer(target, access)\n\treturn\t\tVoidPointer\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\taccess\t\tBufferAccessARB in value\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t697\n\nUnmapBuffer(target)\n\treturn\t\tBoolean\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tcategory\tVERSION_1_5\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t698\n\nGetBufferParameteriv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\tpname\t\tBufferPNameARB in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_1_5\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t693\n\nGetBufferPointerv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\tpname\t\tBufferPointerNameARB in value\n\tparam\t\tparams\t\tVoidPointer out array [1]\n\tcategory\tVERSION_1_5\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t694\n\n# OpenGL 1.5 (EXT_shadow_funcs) commands - none\n\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 2.0 commands\n#\n###############################################################################\n###############################################################################\n\n# OpenGL 2.0 (EXT_blend_equation_separate) commands\n\nBlendEquationSeparate(modeRGB, modeAlpha)\n\treturn\t\tvoid\n\tparam\t\tmodeRGB\t\tBlendEquationModeEXT in value\n\tparam\t\tmodeAlpha\tBlendEquationModeEXT in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t4228\n\n# OpenGL 2.0 (ARB_draw_buffers) commands\n\nDrawBuffers(n, bufs)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tbufs\t\tDrawBufferModeATI in array [n]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t233\n\tglxflags\tignore\n\toffset\t\t?\n\n# OpenGL 2.0 (ARB_stencil_two_side) commands\n\nStencilOpSeparate(face, sfail, dpfail, dppass)\n\treturn\t\tvoid\n\tparam\t\tface\t\tStencilFaceDirection in value\n\tparam\t\tsfail\t\tStencilOp in value\n\tparam\t\tdpfail\t\tStencilOp in value\n\tparam\t\tdppass\t\tStencilOp in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nStencilFuncSeparate(frontfunc, backfunc, ref, mask)\n\treturn\t\tvoid\n\tparam\t\tfrontfunc\tStencilFunction in value\n\tparam\t\tbackfunc\tStencilFunction in value\n\tparam\t\tref\t\tClampedStencilValue in value\n\tparam\t\tmask\t\tMaskedStencilValue in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nStencilMaskSeparate(face, mask)\n\treturn\t\tvoid\n\tparam\t\tface\t\tStencilFaceDirection in value\n\tparam\t\tmask\t\tMaskedStencilValue in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n# OpenGL 2.0 (ARB_shader_objects / ARB_vertex_shader / ARB_fragment_shader) commands\n\nAttachShader(program, shader)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tshader\t\tUInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBindAttribLocation(program, index, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tname\t\tChar in array []\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nCompileShader(shader)\n\treturn\t\tvoid\n\tparam\t\tshader\t\tUInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nCreateProgram()\n\treturn\t\tUInt32\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nCreateShader(type)\n\treturn\t\tUInt32\n\tparam\t\ttype\t\tGLenum in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteProgram(program)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteShader(shader)\n\treturn\t\tvoid\n\tparam\t\tshader\t\tUInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDetachShader(program, shader)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tshader\t\tUInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDisableVertexAttribArray(index)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t666\n\nEnableVertexAttribArray(index)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t665\n\nGetActiveAttrib(program, index, bufSize, length, size, type, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tsize\t\tInt32 out array [1]\n\tparam\t\ttype\t\tGLenum out array [1]\n\tparam\t\tname\t\tChar out array []\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetActiveUniform(program, index, bufSize, length, size, type, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tsize\t\tInt32 out array [1]\n\tparam\t\ttype\t\tGLenum out array [1]\n\tparam\t\tname\t\tChar out array []\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetAttachedShaders(program, maxCount, count, obj)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tmaxCount\tSizeI in value\n\tparam\t\tcount\t\tSizeI out array [1]\n\tparam\t\tobj\t\tUInt32 out array [count]\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetAttribLocation(program, name)\n\treturn\t\tInt32\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tname\t\tChar in array []\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetProgramiv(program, pname, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [pname]\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetProgramInfoLog(program, bufSize, length, infoLog)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tinfoLog\t\tChar out array [length]\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetShaderiv(shader, pname, params)\n\treturn\t\tvoid\n\tparam\t\tshader\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [pname]\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetShaderInfoLog(shader, bufSize, length, infoLog)\n\treturn\t\tvoid\n\tparam\t\tshader\t\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tinfoLog\t\tChar out array [length]\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetShaderSource(shader, bufSize, length, source)\n\treturn\t\tvoid\n\tparam\t\tshader\t\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tsource\t\tChar out array [length]\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetUniformLocation(program, name)\n\treturn\t\tInt32\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tname\t\tChar in array []\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetUniformfv(program, location, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tparams\t\tFloat32 out array [location]\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetUniformiv(program, location, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tparams\t\tInt32 out array [location]\n\tcategory\tVERSION_2_0\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVertexAttribdv(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribPropertyARB in value\n\tparam\t\tparams\t\tFloat64 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1301\n\toffset\t\t588\n\nGetVertexAttribfv(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribPropertyARB in value\n\tparam\t\tparams\t\tFloat32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1302\n\toffset\t\t589\n\nGetVertexAttribiv(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribPropertyARB in value\n\tparam\t\tparams\t\tInt32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1303\n\toffset\t\t590\n\nGetVertexAttribPointerv(index, pname, pointer)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribPointerPropertyARB in value\n\tparam\t\tpointer\t\tVoidPointer out array [1]\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t591\n\nIsProgram(program)\n\treturn\t\tBoolean\n\tparam\t\tprogram\t\tUInt32 in value\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1304\n\toffset\t\t592\n\nIsShader(shader)\n\treturn\t\tBoolean\n\tparam\t\tshader\t\tUInt32 in value\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t?\n\toffset\t\t?\n\nLinkProgram(program)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nShaderSource(shader, count, string, length)\n\treturn\t\tvoid\n\tparam\t\tshader\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tstring\t\tCharPointer in array [count]\n\tparam\t\tlength\t\tInt32 in array [1]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUseProgram(program)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform1f(location, v0)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform2f(location, v0, v1)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tparam\t\tv1\t\tFloat32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform3f(location, v0, v1, v2)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tparam\t\tv1\t\tFloat32 in value\n\tparam\t\tv2\t\tFloat32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform4f(location, v0, v1, v2, v3)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tparam\t\tv1\t\tFloat32 in value\n\tparam\t\tv2\t\tFloat32 in value\n\tparam\t\tv3\t\tFloat32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform1i(location, v0)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform2i(location, v0, v1)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tparam\t\tv1\t\tInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform3i(location, v0, v1, v2)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tparam\t\tv1\t\tInt32 in value\n\tparam\t\tv2\t\tInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform4i(location, v0, v1, v2, v3)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tparam\t\tv1\t\tInt32 in value\n\tparam\t\tv2\t\tInt32 in value\n\tparam\t\tv3\t\tInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform1fv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform2fv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform3fv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform4fv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform1iv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform2iv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform3iv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform4iv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix2fv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix3fv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix4fv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nValidateProgram(program)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttrib1d(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib1dv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t603\n\nVertexAttrib1dv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [1]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4197\n\toffset\t\t604\n\nVertexAttrib1f(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib1fv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t605\n\nVertexAttrib1fv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [1]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4193\n\toffset\t\t606\n\nVertexAttrib1s(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib1sv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t607\n\nVertexAttrib1sv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [1]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4189\n\toffset\t\t608\n\nVertexAttrib2d(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib2dv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t609\n\nVertexAttrib2dv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [2]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4198\n\toffset\t\t610\n\nVertexAttrib2f(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib2fv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t611\n\nVertexAttrib2fv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [2]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4194\n\toffset\t\t612\n\nVertexAttrib2s(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib2sv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t613\n\nVertexAttrib2sv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [2]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4190\n\toffset\t\t614\n\nVertexAttrib3d(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib3dv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t615\n\nVertexAttrib3dv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [3]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4199\n\toffset\t\t616\n\nVertexAttrib3f(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib3fv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t617\n\nVertexAttrib3fv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4195\n\toffset\t\t618\n\nVertexAttrib3s(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tparam\t\tz\t\tInt16 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib3sv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t619\n\nVertexAttrib3sv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [3]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4191\n\toffset\t\t620\n\nVertexAttrib4Nbv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt8 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t659\n\nVertexAttrib4Niv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t661\n\nVertexAttrib4Nsv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t660\n\nVertexAttrib4Nub(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt8 in value\n\tparam\t\ty\t\tUInt8 in value\n\tparam\t\tz\t\tUInt8 in value\n\tparam\t\tw\t\tUInt8 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t627\n\nVertexAttrib4Nubv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt8 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\tglxropcode\t4201\n\toffset\t\t628\n\nVertexAttrib4Nuiv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t663\n\nVertexAttrib4Nusv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt16 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t662\n\nVertexAttrib4bv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt8 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t654\n\nVertexAttrib4d(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tparam\t\tw\t\tFloat64 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib4dv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t621\n\nVertexAttrib4dv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4200\n\toffset\t\t622\n\nVertexAttrib4f(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tparam\t\tw\t\tFloat32 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib4fv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t623\n\nVertexAttrib4fv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4196\n\toffset\t\t624\n\nVertexAttrib4iv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t655\n\nVertexAttrib4s(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tparam\t\tz\t\tInt16 in value\n\tparam\t\tw\t\tInt16 in value\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\tvectorequiv\tVertexAttrib4sv\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t625\n\nVertexAttrib4sv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\tglxropcode\t4192\n\toffset\t\t626\n\nVertexAttrib4ubv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt8 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t656\n\nVertexAttrib4uiv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t658\n\nVertexAttrib4usv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt16 in array [4]\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\tdeprecated\t3.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t657\n\nVertexAttribPointer(index, size, type, normalized, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexAttribPointerTypeARB in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride)] retained\n\tdlflags\t\tnotlistable\n\tcategory\tVERSION_2_0\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t664\n\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 2.1 commands\n#\n###############################################################################\n###############################################################################\n\n# OpenGL 2.1 (ARB_pixel_buffer_object) commands - none\n\n# OpenGL 2.1 (EXT_texture_sRGB) commands - none\n\n# New commands in OpenGL 2.1\n\nUniformMatrix2x3fv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [6]\n\tcategory\tVERSION_2_1\n\tversion\t\t2.1\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix3x2fv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [6]\n\tcategory\tVERSION_2_1\n\tversion\t\t2.1\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix2x4fv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [8]\n\tcategory\tVERSION_2_1\n\tversion\t\t2.1\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix4x2fv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [8]\n\tcategory\tVERSION_2_1\n\tversion\t\t2.1\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix3x4fv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [12]\n\tcategory\tVERSION_2_1\n\tversion\t\t2.1\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix4x3fv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [12]\n\tcategory\tVERSION_2_1\n\tversion\t\t2.1\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 3.0 commands\n#\n###############################################################################\n###############################################################################\n\n# OpenGL 3.0 (EXT_draw_buffers2) commands\n\nColorMaski(index, r, g, b, a)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tr\t\tBoolean in value\n\tparam\t\tg\t\tBoolean in value\n\tparam\t\tb\t\tBoolean in value\n\tparam\t\ta\t\tBoolean in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglxflags\tignore\n\tglfflags\tignore\n\nGetBooleani_v(target, index, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tdata\t\tBoolean out array [COMPSIZE(target)]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nGetIntegeri_v(target, index, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tdata\t\tInt32 out array [COMPSIZE(target)]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nEnablei(target, index)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglxflags\tignore\n\tglfflags\tignore\n\nDisablei(target, index)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglxflags\tignore\n\tglfflags\tignore\n\nIsEnabledi(target, index)\n\treturn\t\tBoolean\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\n# OpenGL 3.0 (EXT_transform_feedback) commands\n\nBeginTransformFeedback(primitiveMode)\n\treturn\t\tvoid\n\tparam\t\tprimitiveMode\tGLenum in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nEndTransformFeedback()\n\treturn\t\tvoid\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nBindBufferRange(target, index, buffer, offset, size)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\toffset\t\tBufferOffset in value\n\tparam\t\tsize\t\tBufferSize in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nBindBufferBase(target, index, buffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nTransformFeedbackVaryings(program, count, varyings, bufferMode)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvaryings\tCharPointer in array [count]\n\tparam\t\tbufferMode\tGLenum in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nGetTransformFeedbackVarying(program, index, bufSize, length, size, type, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tsize\t\tSizeI out array [1]\n\tparam\t\ttype\t\tGLenum out array [1]\n\tparam\t\tname\t\tChar out array [COMPSIZE(length)]\n\tcategory\tVERSION_3_0\n\tdlflags\t\tnotlistable\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nClampColor(target, clamp)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tClampColorTargetARB in value\n\tparam\t\tclamp\t\tClampColorModeARB in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglxropcode\t234\n\tglxflags\tignore\n\toffset\t\t?\n\nBeginConditionalRender(id, mode)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tmode\t\tTypeEnum in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tglfflags\tignore\n\tglxflags\tignore\n\nEndConditionalRender()\n\treturn\t\tvoid\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribIPointer(index, size, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexAttribEnum in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride)] retained\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdlflags\t\tnotlistable\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetVertexAttribIiv(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnum in value\n\tparam\t\tparams\t\tInt32 out array [1]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdlflags\t\tnotlistable\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetVertexAttribIuiv(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnum in value\n\tparam\t\tparams\t\tUInt32 out array [1]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdlflags\t\tnotlistable\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\n# OpenGL 3.0 (NV_vertex_program4) commands\n\nVertexAttribI1i(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI1iv\n\tglxvectorequiv\tVertexAttribI1iv\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI2i(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI2iv\n\tglxvectorequiv\tVertexAttribI2iv\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI3i(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tparam\t\tz\t\tInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI3iv\n\tglxvectorequiv\tVertexAttribI3iv\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI4i(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tparam\t\tz\t\tInt32 in value\n\tparam\t\tw\t\tInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI4iv\n\tglxvectorequiv\tVertexAttribI4iv\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI1ui(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI1uiv\n\tglxvectorequiv\tVertexAttribI1uiv\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI2ui(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt32 in value\n\tparam\t\ty\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI2uiv\n\tglxvectorequiv\tVertexAttribI2uiv\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI3ui(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt32 in value\n\tparam\t\ty\t\tUInt32 in value\n\tparam\t\tz\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI3uiv\n\tglxvectorequiv\tVertexAttribI3uiv\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI4ui(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt32 in value\n\tparam\t\ty\t\tUInt32 in value\n\tparam\t\tz\t\tUInt32 in value\n\tparam\t\tw\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI4uiv\n\tglxvectorequiv\tVertexAttribI4uiv\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI1iv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [1]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI2iv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [2]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI3iv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [3]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI4iv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [4]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI1uiv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [1]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI2uiv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [2]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI3uiv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [3]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI4uiv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [4]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI4bv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt8 in array [4]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI4sv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [4]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI4ubv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt8 in array [4]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nVertexAttribI4usv(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt16 in array [4]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\tdeprecated\t3.1\n\tbeginend\tallow-inside\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\n# OpenGL 3.0 (EXT_gpu_shader4) commands\n\nGetUniformuiv(program, location, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tparams\t\tUInt32 out array [COMPSIZE(program/location)]\n\tcategory\tVERSION_3_0\n\tdlflags\t\tnotlistable\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nBindFragDataLocation(program, color, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tcolor\t\tUInt32 in value\n\tparam\t\tname\t\tChar in array [COMPSIZE(name)]\n\tcategory\tVERSION_3_0\n\tdlflags\t\tnotlistable\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetFragDataLocation(program, name)\n\treturn\t\tInt32\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tname\t\tChar in array [COMPSIZE(name)]\n\tcategory\tVERSION_3_0\n\tdlflags\t\tnotlistable\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nUniform1ui(location, v0)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nUniform2ui(location, v0, v1)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tparam\t\tv1\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nUniform3ui(location, v0, v1, v2)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tparam\t\tv1\t\tUInt32 in value\n\tparam\t\tv2\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nUniform4ui(location, v0, v1, v2, v3)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tparam\t\tv1\t\tUInt32 in value\n\tparam\t\tv2\t\tUInt32 in value\n\tparam\t\tv3\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nUniform1uiv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nUniform2uiv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count*2]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nUniform3uiv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count*3]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nUniform4uiv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count*4]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\n# OpenGL 3.0 (EXT_texture_integer) commands\n\nTexParameterIiv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nTexParameterIuiv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tUInt32 in array [COMPSIZE(pname)]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetTexParameterIiv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_3_0\n\tdlflags\t\tnotlistable\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetTexParameterIuiv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tUInt32 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_3_0\n\tdlflags\t\tnotlistable\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\n# New commands in OpenGL 3.0\n\nClearBufferiv(buffer, drawbuffer, value)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tGLenum in value\n\tparam\t\tdrawbuffer\tDrawBufferName in value\n\tparam\t\tvalue\t\tInt32 in array [COMPSIZE(buffer)]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nClearBufferuiv(buffer, drawbuffer, value)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tGLenum in value\n\tparam\t\tdrawbuffer\tDrawBufferName in value\n\tparam\t\tvalue\t\tUInt32 in array [COMPSIZE(buffer)]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nClearBufferfv(buffer, drawbuffer, value)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tGLenum in value\n\tparam\t\tdrawbuffer\tDrawBufferName in value\n\tparam\t\tvalue\t\tFloat32 in array [COMPSIZE(buffer)]\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nClearBufferfi(buffer, drawbuffer, depth, stencil)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tGLenum in value\n\tparam\t\tdrawbuffer\tDrawBufferName in value\n\tparam\t\tdepth\t\tFloat32 in value\n\tparam\t\tstencil\t\tInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetStringi(name, index)\n\treturn\t\tString\n\tparam\t\tname\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tVERSION_3_0\n\tversion\t\t3.0\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode\n\tglfflags\tignore\n\tglxsingle\t?\n\npassthru: /* OpenGL 3.0 also reuses entry points from these extensions: */\npassthru: /* ARB_framebuffer_object */\npassthru: /* ARB_map_buffer_range */\npassthru: /* ARB_vertex_array_object */\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 3.0 deprecated commands\n#\n###############################################################################\n###############################################################################\n\n# (none - VertexAttribI* were moved back into non-deprecated)\n\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 3.1 commands\n#\n###############################################################################\n###############################################################################\n\n# New commands in OpenGL 3.1 - none\n\n# OpenGL 3.1 (ARB_draw_instanced) commands\n\nDrawArraysInstanced(mode, first, count, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tfirst\t\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tVERSION_3_1\n\tversion\t\t3.1\n\textension\n\tdlflags\t\tnotlistable\n\tvectorequiv\tArrayElement\n\tglfflags\tignore\n\tglxflags\tignore\n\nDrawElementsInstanced(mode, count, type, indices, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoid in array [COMPSIZE(count/type)]\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tVERSION_3_1\n\tversion\t\t3.1\n\textension\n\tdlflags\t\tnotlistable\n\tvectorequiv\tArrayElement\n\tglfflags\tignore\n\tglxflags\tignore\n\n# OpenGL 3.1 (ARB_texture_buffer_object) commands\n\nTexBuffer(target, internalformat, buffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tinternalformat\tGLenum in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tVERSION_3_1\n\tversion\t\t3.1\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\n# OpenGL 3.1 (ARB_texture_rectangle) commands - none\n\n# OpenGL 3.1 (SNORM texture) commands - none\n\n# OpenGL 3.1 (NV_primitive_restart) commands\n# This is *not* an alias of PrimitiveRestartIndexNV, since it sets\n# server instead of client state.\n\nPrimitiveRestartIndex(index)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tVERSION_3_1\n\tversion\t\t3.1\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\npassthru: /* OpenGL 3.1 also reuses entry points from these extensions: */\npassthru: /* ARB_copy_buffer */\npassthru: /* ARB_uniform_buffer_object */\n\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 3.2 commands\n#\n###############################################################################\n###############################################################################\n\n# New commands in OpenGL 3.2\n\nGetInteger64i_v(target, index, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tdata\t\tInt64 out array [COMPSIZE(target)]\n\tcategory\tVERSION_3_2\n\tversion\t\t3.2\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\n\nGetBufferParameteri64v(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\tpname\t\tBufferPNameARB in value\n\tparam\t\tparams\t\tInt64 out array [COMPSIZE(pname)]\n\tcategory\tVERSION_3_2\n\tdlflags\t\tnotlistable\n\tversion\t\t3.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\n# OpenGL 3.2 (ARB_depth_clamp) commands - none\n# OpenGL 3.2 (ARB_fragment_coord_conventions) commands - none\n\n# OpenGL 3.2 (ARB_geometry_shader4) commands\n\nProgramParameteri(program, pname, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tvalue\t\tInt32 in value\n\tcategory\tVERSION_3_2\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nFramebufferTexture(target, attachment, texture, level)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tattachment\tGLenum in value\n\tparam\t\ttexture\t\tUInt32 in value\n\tparam\t\tlevel\t\tInt32 in value\n\tcategory\tVERSION_3_2\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n# FramebufferTextureLayer already declared in ARB_framebuffer_object\n# FramebufferTextureLayer(target, attachment, texture, level, layer)\n\n# Not promoted to the core along with the rest\n# FramebufferTextureFace(target, attachment, texture, level, face)\n\n# OpenGL 3.2  (ARB_seamless_cube_map) commands - none\n# OpenGL 3.2  (ARB_vertex_array_bgra) commands - none\n\npassthru: /* OpenGL 3.2 also reuses entry points from these extensions: */\npassthru: /* ARB_draw_elements_base_vertex */\npassthru: /* ARB_provoking_vertex */\npassthru: /* ARB_sync */\npassthru: /* ARB_texture_multisample */\n\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 3.3 commands\n#\n###############################################################################\n###############################################################################\n\n# New commands in OpenGL 3.3 - none\nnewcategory: VERSION_3_3\n\npassthru: /* OpenGL 3.3 also reuses entry points from these extensions: */\npassthru: /* ARB_blend_func_extended */\npassthru: /* ARB_sampler_objects */\npassthru: /* ARB_explicit_attrib_location, but it has none */\npassthru: /* ARB_occlusion_query2 (no entry points) */\npassthru: /* ARB_shader_bit_encoding (no entry points) */\npassthru: /* ARB_texture_rgb10_a2ui (no entry points) */\npassthru: /* ARB_texture_swizzle (no entry points) */\npassthru: /* ARB_timer_query */\npassthru: /* ARB_vertex_type_2_10_10_10_rev */\n\n\n###############################################################################\n###############################################################################\n#\n# OpenGL 4.0 commands\n#\n###############################################################################\n###############################################################################\n\n# New commands in OpenGL 4.0 - none\nnewcategory: VERSION_4_0\n\npassthru: /* OpenGL 4.0 also reuses entry points from these extensions: */\npassthru: /* ARB_gpu_shader5 (no entry points) */\npassthru: /* ARB_gpu_shader_fp64 */\npassthru: /* ARB_shader_subroutine */\npassthru: /* ARB_tessellation_shader */\npassthru: /* ARB_texture_buffer_object_rgb32 (no entry points) */\npassthru: /* ARB_transform_feedback2 */\npassthru: /* ARB_transform_feedback3 */\n\n\n###############################################################################\n###############################################################################\n#\n# ARB extensions, in order by ARB extension number\n#\n###############################################################################\n###############################################################################\n\n###############################################################################\n#\n# ARB Extension #1\n# ARB_multitexture commands\n#\n###############################################################################\n\nActiveTextureARB(texture)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTextureUnit in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t197\n\talias\t\tActiveTexture\n\nClientActiveTextureARB(texture)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTextureUnit in value\n\tcategory\tARB_multitexture\n\tdlflags\t\tnotlistable\n\tglxflags\tARB client-handcode client-intercept server-handcode\n\tversion\t\t1.2\n\talias\t\tClientActiveTexture\n\nMultiTexCoord1dARB(target, s)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordD in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord1dv\n\nMultiTexCoord1dvARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordD in array [1]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t198\n\talias\t\tMultiTexCoord1dv\n\nMultiTexCoord1fARB(target, s)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordF in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord1fv\n\nMultiTexCoord1fvARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordF in array [1]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t199\n\talias\t\tMultiTexCoord1fv\n\nMultiTexCoord1iARB(target, s)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordI in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord1iv\n\nMultiTexCoord1ivARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordI in array [1]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t200\n\talias\t\tMultiTexCoord1iv\n\nMultiTexCoord1sARB(target, s)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordS in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord1sv\n\nMultiTexCoord1svARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordS in array [1]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t201\n\talias\t\tMultiTexCoord1sv\n\nMultiTexCoord2dARB(target, s, t)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordD in value\n\tparam\t\tt\t\tCoordD in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord2dv\n\nMultiTexCoord2dvARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordD in array [2]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t202\n\talias\t\tMultiTexCoord2dv\n\nMultiTexCoord2fARB(target, s, t)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordF in value\n\tparam\t\tt\t\tCoordF in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord2fv\n\nMultiTexCoord2fvARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordF in array [2]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t203\n\talias\t\tMultiTexCoord2fv\n\nMultiTexCoord2iARB(target, s, t)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordI in value\n\tparam\t\tt\t\tCoordI in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord2iv\n\nMultiTexCoord2ivARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordI in array [2]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t204\n\talias\t\tMultiTexCoord2iv\n\nMultiTexCoord2sARB(target, s, t)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordS in value\n\tparam\t\tt\t\tCoordS in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord2sv\n\nMultiTexCoord2svARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordS in array [2]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t205\n\talias\t\tMultiTexCoord2sv\n\nMultiTexCoord3dARB(target, s, t, r)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordD in value\n\tparam\t\tt\t\tCoordD in value\n\tparam\t\tr\t\tCoordD in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord3dv\n\nMultiTexCoord3dvARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordD in array [3]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t206\n\talias\t\tMultiTexCoord3dv\n\nMultiTexCoord3fARB(target, s, t, r)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordF in value\n\tparam\t\tt\t\tCoordF in value\n\tparam\t\tr\t\tCoordF in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord3fv\n\nMultiTexCoord3fvARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordF in array [3]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t207\n\talias\t\tMultiTexCoord3fv\n\nMultiTexCoord3iARB(target, s, t, r)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordI in value\n\tparam\t\tt\t\tCoordI in value\n\tparam\t\tr\t\tCoordI in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord3iv\n\nMultiTexCoord3ivARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordI in array [3]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t208\n\talias\t\tMultiTexCoord3iv\n\nMultiTexCoord3sARB(target, s, t, r)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordS in value\n\tparam\t\tt\t\tCoordS in value\n\tparam\t\tr\t\tCoordS in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord3sv\n\nMultiTexCoord3svARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordS in array [3]\n\tcategory\tARB_multitexture\n\tversion\t\t1.2\n\tglxflags\tARB\n\tglxropcode\t209\n\talias\t\tMultiTexCoord3sv\n\nMultiTexCoord4dARB(target, s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordD in value\n\tparam\t\tt\t\tCoordD in value\n\tparam\t\tr\t\tCoordD in value\n\tparam\t\tq\t\tCoordD in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord4dv\n\nMultiTexCoord4dvARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordD in array [4]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t210\n\talias\t\tMultiTexCoord4dv\n\nMultiTexCoord4fARB(target, s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordF in value\n\tparam\t\tt\t\tCoordF in value\n\tparam\t\tr\t\tCoordF in value\n\tparam\t\tq\t\tCoordF in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord4fv\n\nMultiTexCoord4fvARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordF in array [4]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t211\n\talias\t\tMultiTexCoord4fv\n\nMultiTexCoord4iARB(target, s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordI in value\n\tparam\t\tt\t\tCoordI in value\n\tparam\t\tr\t\tCoordI in value\n\tparam\t\tq\t\tCoordI in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord4iv\n\nMultiTexCoord4ivARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordI in array [4]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t212\n\talias\t\tMultiTexCoord4iv\n\nMultiTexCoord4sARB(target, s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tCoordS in value\n\tparam\t\tt\t\tCoordS in value\n\tparam\t\tr\t\tCoordS in value\n\tparam\t\tq\t\tCoordS in value\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tvectorequiv\tMultiTexCoord4sv\n\nMultiTexCoord4svARB(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tCoordS in array [4]\n\tcategory\tARB_multitexture\n\tglxflags\tARB\n\tversion\t\t1.2\n\tglxropcode\t213\n\talias\t\tMultiTexCoord4sv\n\n################################################################################\n#\n# ARB Extension #2 - GLX_ARB_get_proc_address\n#\n###############################################################################\n\n################################################################################\n#\n# ARB Extension #3\n# ARB_transpose_matrix commands\n#\n###############################################################################\n\nLoadTransposeMatrixfARB(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat32 in array [16]\n\tcategory\tARB_transpose_matrix\n\tglxflags\tARB client-handcode client-intercept server-handcode\n\tversion\t\t1.2\n\talias\t\tLoadTransposeMatrixf\n\nLoadTransposeMatrixdARB(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat64 in array [16]\n\tcategory\tARB_transpose_matrix\n\tglxflags\tARB client-handcode client-intercept server-handcode\n\tversion\t\t1.2\n\talias\t\tLoadTransposeMatrixd\n\nMultTransposeMatrixfARB(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat32 in array [16]\n\tcategory\tARB_transpose_matrix\n\tglxflags\tARB client-handcode client-intercept server-handcode\n\tversion\t\t1.2\n\talias\t\tMultTransposeMatrixf\n\nMultTransposeMatrixdARB(m)\n\treturn\t\tvoid\n\tparam\t\tm\t\tFloat64 in array [16]\n\tcategory\tARB_transpose_matrix\n\tglxflags\tARB client-handcode client-intercept server-handcode\n\tversion\t\t1.2\n\talias\t\tMultTransposeMatrixd\n\n################################################################################\n#\n# ARB Extension #4 - WGL_ARB_buffer_region\n#\n###############################################################################\n\n################################################################################\n#\n# ARB Extension #5\n# ARB_multisample commands\n#\n###############################################################################\n\nSampleCoverageARB(value, invert)\n\treturn\t\tvoid\n\tparam\t\tvalue\t\tClampedFloat32 in value\n\tparam\t\tinvert\t\tBoolean in value\n\tcategory\tARB_multisample\n\tglxflags\tARB\n\tversion\t\t1.2\n\talias\t\tSampleCoverage\n\n################################################################################\n#\n# ARB Extension #6\n# ARB_texture_env_add commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_env_add\n\n################################################################################\n#\n# ARB Extension #7\n# ARB_texture_cube_map commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_cube_map\n\n################################################################################\n#\n# ARB Extension #8 - WGL_ARB_extensions_string\n# ARB Extension #9 - WGL_ARB_pixel_format commands\n# ARB Extension #10 - WGL_ARB_make_current_read commands\n# ARB Extension #11 - WGL_ARB_pbuffer\n#\n###############################################################################\n\n################################################################################\n#\n# ARB Extension #12\n# ARB_texture_compression commands\n#\n###############################################################################\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nCompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tARB_texture_compression\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.2\n\tglxropcode\t216\n\talias\t\tCompressedTexImage3D\n\twglflags\tclient-handcode server-handcode\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tARB_texture_compression\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.2\n\tglxropcode\t215\n\talias\t\tCompressedTexImage2D\n\twglflags\tclient-handcode server-handcode\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nCompressedTexImage1DARB(target, level, internalformat, width, border, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tARB_texture_compression\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.2\n\tglxropcode\t214\n\talias\t\tCompressedTexImage1D\n\twglflags\tclient-handcode server-handcode\n\nCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tARB_texture_compression\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.2\n\tglxropcode\t219\n\talias\t\tCompressedTexSubImage3D\n\twglflags\tclient-handcode server-handcode\n\nCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tARB_texture_compression\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.2\n\tglxropcode\t218\n\talias\t\tCompressedTexSubImage2D\n\twglflags\tclient-handcode server-handcode\n\nCompressedTexSubImage1DARB(target, level, xoffset, width, format, imageSize, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tdata\t\tCompressedTextureARB in array [imageSize]\n\tcategory\tARB_texture_compression\n\tdlflags\t\thandcode\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.2\n\tglxropcode\t217\n\talias\t\tCompressedTexSubImage1D\n\twglflags\tclient-handcode server-handcode\n\nGetCompressedTexImageARB(target, level, img)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\timg\t\tCompressedTextureARB out array [COMPSIZE(target/level)]\n\tcategory\tARB_texture_compression\n\tdlflags\t\tnotlistable\n\tglxflags\tARB client-handcode server-handcode\n\tversion\t\t1.2\n\tglxsingle\t160\n\talias\t\tGetCompressedTexImage\n\twglflags\tclient-handcode server-handcode\n\n################################################################################\n#\n# ARB Extension #13\n# ARB_texture_border_clamp commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_border_clamp\n\n###############################################################################\n#\n# ARB Extension #14\n# ARB_point_parameters commands\n#\n###############################################################################\n\nPointParameterfARB(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tARB_point_parameters\n\tversion\t\t1.0\n\tglxflags\tARB\n\tglxropcode\t2065\n\textension\n\talias\t\tPointParameterf\n\nPointParameterfvARB(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tARB_point_parameters\n\tversion\t\t1.0\n\tglxflags\tARB\n\tglxropcode\t2066\n\textension\n\talias\t\tPointParameterfv\n\n################################################################################\n#\n# ARB Extension #15\n# ARB_vertex_blend commands\n#\n###############################################################################\n\nWeightbvARB(size, weights)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\tweights\t\tInt8 in array [size]\n\tcategory\tARB_vertex_blend\n\tversion\t\t1.1\n\textension\n\tglxropcode\t220\n\tglxflags\tignore\n\toffset\t\t?\n\nWeightsvARB(size, weights)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\tweights\t\tInt16 in array [size]\n\tcategory\tARB_vertex_blend\n\tversion\t\t1.1\n\textension\n\tglxropcode\t222\n\tglxflags\tignore\n\toffset\t\t?\n\nWeightivARB(size, weights)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\tweights\t\tInt32 in array [size]\n\tcategory\tARB_vertex_blend\n\tversion\t\t1.1\n\textension\n\tglxropcode\t224\n\tglxflags\tignore\n\toffset\t\t?\n\nWeightfvARB(size, weights)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\tweights\t\tFloat32 in array [size]\n\tcategory\tARB_vertex_blend\n\tversion\t\t1.1\n\textension\n\tglxropcode\t227\n\tglxflags\tignore\n\toffset\t\t?\n\nWeightdvARB(size, weights)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\tweights\t\tFloat64 in array [size]\n\tcategory\tARB_vertex_blend\n\tversion\t\t1.1\n\textension\n\tglxropcode\t228\n\tglxflags\tignore\n\toffset\t\t?\n\nWeightubvARB(size, weights)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\tweights\t\tUInt8 in array [size]\n\tcategory\tARB_vertex_blend\n\tversion\t\t1.1\n\textension\n\tglxropcode\t221\n\tglxflags\tignore\n\toffset\t\t?\n\nWeightusvARB(size, weights)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\tweights\t\tUInt16 in array [size]\n\tcategory\tARB_vertex_blend\n\tversion\t\t1.1\n\textension\n\tglxropcode\t223\n\tglxflags\tignore\n\toffset\t\t?\n\nWeightuivARB(size, weights)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\tweights\t\tUInt32 in array [size]\n\tcategory\tARB_vertex_blend\n\tversion\t\t1.1\n\textension\n\tglxropcode\t225\n\tglxflags\tignore\n\toffset\t\t?\n\nWeightPointerARB(size, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tWeightPointerTypeARB in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type/stride)] retained\n\tcategory\tARB_vertex_blend\n\tversion\t\t1.1\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexBlendARB(count)\n\treturn\t\tvoid\n\tparam\t\tcount\t\tInt32 in value\n\tcategory\tARB_vertex_blend\n\tversion\t\t1.1\n\textension\n\tglxropcode\t226\n\tglxflags\tignore\n\toffset\t\t?\n\n################################################################################\n#\n# ARB Extension #16\n# ARB_matrix_palette commands\n#\n###############################################################################\n\nCurrentPaletteMatrixARB(index)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tInt32 in value\n\tcategory\tARB_matrix_palette\n\tversion\t\t1.1\n\textension\n\tglxropcode\t4329\n\tglxflags\tignore\n\toffset\t\t?\n\nMatrixIndexubvARB(size, indices)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\tindices\t\tUInt8 in array [size]\n\tcategory\tARB_matrix_palette\n\tversion\t\t1.1\n\textension\n\tglxropcode\t4326\n\tglxflags\tignore\n\toffset\t\t?\n\nMatrixIndexusvARB(size, indices)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\tindices\t\tUInt16 in array [size]\n\tcategory\tARB_matrix_palette\n\tversion\t\t1.1\n\textension\n\tglxropcode\t4327\n\tglxflags\tignore\n\toffset\t\t?\n\nMatrixIndexuivARB(size, indices)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\tindices\t\tUInt32 in array [size]\n\tcategory\tARB_matrix_palette\n\tversion\t\t1.1\n\textension\n\tglxropcode\t4328\n\tglxflags\tignore\n\toffset\t\t?\n\nMatrixIndexPointerARB(size, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tMatrixIndexPointerTypeARB in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type/stride)] retained\n\tcategory\tARB_matrix_palette\n\tversion\t\t1.1\n\textension\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\toffset\t\t?\n\n################################################################################\n#\n# ARB Extension #17\n# ARB_texture_env_combine commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_env_combine\n\n################################################################################\n#\n# ARB Extension #18\n# ARB_texture_env_crossbar commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_env_crossbar\n\n################################################################################\n#\n# ARB Extension #19\n# ARB_texture_env_dot3 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_env_dot3\n\n###############################################################################\n#\n# ARB Extension #20 - WGL_ARB_render_texture\n#\n###############################################################################\n\n###############################################################################\n#\n# ARB Extension #21\n# ARB_texture_mirrored_repeat commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_mirrored_repeat\n\n###############################################################################\n#\n# ARB Extension #22\n# ARB_depth_texture commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_depth_texture\n\n###############################################################################\n#\n# ARB Extension #23\n# ARB_shadow commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_shadow\n\n###############################################################################\n#\n# ARB Extension #24\n# ARB_shadow_ambient commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_shadow_ambient\n\n###############################################################################\n#\n# ARB Extension #25\n# ARB_window_pos commands\n# Note: all entry points use glxropcode ropcode 230, with 3 float parameters\n#\n###############################################################################\n\nWindowPos2dARB(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tcategory\tARB_window_pos\n\tvectorequiv\tWindowPos2dvARB\n\tversion\t\t1.0\n\talias\t\tWindowPos2d\n\nWindowPos2dvARB(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [2]\n\tcategory\tARB_window_pos\n\tversion\t\t1.0\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\talias\t\tWindowPos2dv\n\nWindowPos2fARB(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tcategory\tARB_window_pos\n\tvectorequiv\tWindowPos2fvARB\n\tversion\t\t1.0\n\talias\t\tWindowPos2f\n\nWindowPos2fvARB(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [2]\n\tcategory\tARB_window_pos\n\tversion\t\t1.0\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\talias\t\tWindowPos2fv\n\nWindowPos2iARB(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tcategory\tARB_window_pos\n\tvectorequiv\tWindowPos2ivARB\n\tversion\t\t1.0\n\talias\t\tWindowPos2i\n\nWindowPos2ivARB(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [2]\n\tcategory\tARB_window_pos\n\tversion\t\t1.0\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\talias\t\tWindowPos2iv\n\nWindowPos2sARB(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tcategory\tARB_window_pos\n\tvectorequiv\tWindowPos2svARB\n\tversion\t\t1.0\n\talias\t\tWindowPos2s\n\nWindowPos2svARB(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [2]\n\tcategory\tARB_window_pos\n\tversion\t\t1.0\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\talias\t\tWindowPos2sv\n\nWindowPos3dARB(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tparam\t\tz\t\tCoordD in value\n\tvectorequiv\tWindowPos3dvARB\n\tcategory\tARB_window_pos\n\tversion\t\t1.0\n\talias\t\tWindowPos3d\n\nWindowPos3dvARB(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [3]\n\tcategory\tARB_window_pos\n\tversion\t\t1.0\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\talias\t\tWindowPos3dv\n\nWindowPos3fARB(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tparam\t\tz\t\tCoordF in value\n\tcategory\tARB_window_pos\n\tvectorequiv\tWindowPos3fvARB\n\tversion\t\t1.0\n\talias\t\tWindowPos3f\n\nWindowPos3fvARB(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [3]\n\tcategory\tARB_window_pos\n\tversion\t\t1.0\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\talias\t\tWindowPos3fv\n\nWindowPos3iARB(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tparam\t\tz\t\tCoordI in value\n\tcategory\tARB_window_pos\n\tvectorequiv\tWindowPos3ivARB\n\tversion\t\t1.0\n\talias\t\tWindowPos3i\n\nWindowPos3ivARB(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [3]\n\tcategory\tARB_window_pos\n\tversion\t\t1.0\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\talias\t\tWindowPos3iv\n\nWindowPos3sARB(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tparam\t\tz\t\tCoordS in value\n\tcategory\tARB_window_pos\n\tvectorequiv\tWindowPos3svARB\n\tversion\t\t1.0\n\talias\t\tWindowPos3s\n\nWindowPos3svARB(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [3]\n\tcategory\tARB_window_pos\n\tversion\t\t1.0\n\tglxropcode\t230\n\tglxflags\tclient-handcode server-handcode\n\talias\t\tWindowPos3sv\n\n###############################################################################\n#\n# ARB Extension #26\n# ARB_vertex_program commands\n#\n###############################################################################\n\nVertexAttrib1dARB(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib1dvARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib1d\n\nVertexAttrib1dvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [1]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4197\n\talias\t\tVertexAttrib1dv\n\nVertexAttrib1fARB(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib1fvARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib1f\n\nVertexAttrib1fvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [1]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4193\n\talias\t\tVertexAttrib1fv\n\nVertexAttrib1sARB(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib1svARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib1s\n\nVertexAttrib1svARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [1]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4189\n\talias\t\tVertexAttrib1sv\n\nVertexAttrib2dARB(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib2dvARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib2d\n\nVertexAttrib2dvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [2]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4198\n\talias\t\tVertexAttrib2dv\n\nVertexAttrib2fARB(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib2fvARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib2f\n\nVertexAttrib2fvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [2]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4194\n\talias\t\tVertexAttrib2fv\n\nVertexAttrib2sARB(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib2svARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib2s\n\nVertexAttrib2svARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [2]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4190\n\talias\t\tVertexAttrib2sv\n\nVertexAttrib3dARB(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib3dvARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib3d\n\nVertexAttrib3dvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [3]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4199\n\talias\t\tVertexAttrib3dv\n\nVertexAttrib3fARB(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib3fvARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib3f\n\nVertexAttrib3fvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4195\n\talias\t\tVertexAttrib3fv\n\nVertexAttrib3sARB(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tparam\t\tz\t\tInt16 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib3svARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib3s\n\nVertexAttrib3svARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [3]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4191\n\talias\t\tVertexAttrib3sv\n\nVertexAttrib4NbvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt8 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4Nbv\n\nVertexAttrib4NivARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4Niv\n\nVertexAttrib4NsvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4Nsv\n\nVertexAttrib4NubARB(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt8 in value\n\tparam\t\ty\t\tUInt8 in value\n\tparam\t\tz\t\tUInt8 in value\n\tparam\t\tw\t\tUInt8 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4Nub\n\nVertexAttrib4NubvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt8 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4201\n\talias\t\tVertexAttrib4Nubv\n\nVertexAttrib4NuivARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4Nuiv\n\nVertexAttrib4NusvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt16 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4Nusv\n\nVertexAttrib4bvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt8 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4bv\n\nVertexAttrib4dARB(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tparam\t\tw\t\tFloat64 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib4dvARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4d\n\nVertexAttrib4dvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4200\n\talias\t\tVertexAttrib4dv\n\nVertexAttrib4fARB(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tparam\t\tw\t\tFloat32 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib4fvARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4f\n\nVertexAttrib4fvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4196\n\talias\t\tVertexAttrib4fv\n\nVertexAttrib4ivARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4iv\n\nVertexAttrib4sARB(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tparam\t\tz\t\tInt16 in value\n\tparam\t\tw\t\tInt16 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tVertexAttrib4svARB\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4s\n\nVertexAttrib4svARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4192\n\talias\t\tVertexAttrib4sv\n\nVertexAttrib4ubvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt8 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4ubv\n\nVertexAttrib4uivARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4uiv\n\nVertexAttrib4usvARB(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt16 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4usv\n\nVertexAttribPointerARB(index, size, type, normalized, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexAttribPointerTypeARB in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride)] retained\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttribPointer\n\nEnableVertexAttribArrayARB(index)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tEnableVertexAttribArray\n\nDisableVertexAttribArrayARB(index)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\talias\t\tDisableVertexAttribArray\n\nProgramStringARB(target, format, len, string)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tformat\t\tProgramFormatARB in value\n\tparam\t\tlen\t\tSizeI in value\n\tparam\t\tstring\t\tVoid in array [len]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t667\n\nBindProgramARB(target, program)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tprogram\t\tUInt32 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4180\n\toffset\t\t579\n\nDeleteProgramsARB(n, programs)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tprograms\tUInt32 in array [n]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1294\n\toffset\t\t580\n\nGenProgramsARB(n, programs)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tprograms\tUInt32 out array [n]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1295\n\toffset\t\t582\n\nProgramEnvParameter4dARB(target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tparam\t\tw\t\tFloat64 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tProgramEnvParameter4dvARB\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t668\n\nProgramEnvParameter4dvARB(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat64 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t669\n\nProgramEnvParameter4fARB(target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tparam\t\tw\t\tFloat32 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tProgramEnvParameter4fvARB\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t670\n\nProgramEnvParameter4fvARB(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat32 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t671\n\nProgramLocalParameter4dARB(target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tparam\t\tw\t\tFloat64 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tProgramLocalParameter4dvARB\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t672\n\nProgramLocalParameter4dvARB(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat64 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t673\n\nProgramLocalParameter4fARB(target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tparam\t\tw\t\tFloat32 in value\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\tvectorequiv\tProgramLocalParameter4fvARB\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t674\n\nProgramLocalParameter4fvARB(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat32 in array [4]\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t675\n\nGetProgramEnvParameterdvARB(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat64 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t676\n\nGetProgramEnvParameterfvARB(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t677\n\nGetProgramLocalParameterdvARB(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat64 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t678\n\nGetProgramLocalParameterfvARB(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t679\n\nGetProgramivARB(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tpname\t\tProgramPropertyARB in value\n\tparam\t\tparams\t\tInt32 out array [1]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t680\n\nGetProgramStringARB(target, pname, string)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tpname\t\tProgramStringPropertyARB in value\n\tparam\t\tstring\t\tVoid out array [COMPSIZE(target,pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t681\n\nGetVertexAttribdvARB(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribPropertyARB in value\n\tparam\t\tparams\t\tFloat64 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1301\n\talias\t\tGetVertexAttribdv\n\nGetVertexAttribfvARB(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribPropertyARB in value\n\tparam\t\tparams\t\tFloat32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1302\n\talias\t\tGetVertexAttribfv\n\nGetVertexAttribivARB(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribPropertyARB in value\n\tparam\t\tparams\t\tInt32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1303\n\talias\t\tGetVertexAttribiv\n\nGetVertexAttribPointervARB(index, pname, pointer)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribPointerPropertyARB in value\n\tparam\t\tpointer\t\tVoidPointer out array [1]\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\talias\t\tGetVertexAttribPointerv\n\nIsProgramARB(program)\n\treturn\t\tBoolean\n\tparam\t\tprogram\t\tUInt32 in value\n\tdlflags\t\tnotlistable\n\tcategory\tARB_vertex_program\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1304\n\talias\t\tIsProgram\n\n\n###############################################################################\n#\n# ARB Extension #27\n# ARB_fragment_program commands\n#\n###############################################################################\n\n# All ARB_fragment_program entry points are shared with ARB_vertex_program,\n#   and are only included in that #define block, for now.\nnewcategory: ARB_fragment_program\npassthru: /* All ARB_fragment_program entry points are shared with ARB_vertex_program. */\n\n###############################################################################\n#\n# ARB Extension #28\n# ARB_vertex_buffer_object commands\n#\n###############################################################################\n\nBindBufferARB(target, buffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tARB_vertex_buffer_object\n\tversion\t\t1.2\n\textension\n\talias\t\tBindBuffer\n\nDeleteBuffersARB(n, buffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tbuffers\t\tConstUInt32 in array [n]\n\tcategory\tARB_vertex_buffer_object\n\tversion\t\t1.2\n\textension\n\talias\t\tDeleteBuffers\n\nGenBuffersARB(n, buffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tbuffers\t\tUInt32 out array [n]\n\tcategory\tARB_vertex_buffer_object\n\tversion\t\t1.2\n\textension\n\talias\t\tGenBuffers\n\nIsBufferARB(buffer)\n\treturn\t\tBoolean\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tARB_vertex_buffer_object\n\tversion\t\t1.2\n\textension\n\talias\t\tIsBuffer\n\nBufferDataARB(target, size, data, usage)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\tsize\t\tBufferSizeARB in value\n\tparam\t\tdata\t\tConstVoid in array [size]\n\tparam\t\tusage\t\tBufferUsageARB in value\n\tcategory\tARB_vertex_buffer_object\n\tversion\t\t1.2\n\textension\n\talias\t\tBufferData\n\nBufferSubDataARB(target, offset, size, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\toffset\t\tBufferOffsetARB in value\n\tparam\t\tsize\t\tBufferSizeARB in value\n\tparam\t\tdata\t\tConstVoid in array [size]\n\tcategory\tARB_vertex_buffer_object\n\tversion\t\t1.2\n\textension\n\talias\t\tBufferSubData\n\nGetBufferSubDataARB(target, offset, size, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\toffset\t\tBufferOffsetARB in value\n\tparam\t\tsize\t\tBufferSizeARB in value\n\tparam\t\tdata\t\tVoid out array [size]\n\tcategory\tARB_vertex_buffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\talias\t\tGetBufferSubData\n\nMapBufferARB(target, access)\n\treturn\t\tVoidPointer\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\taccess\t\tBufferAccessARB in value\n\tcategory\tARB_vertex_buffer_object\n\tversion\t\t1.2\n\textension\n\talias\t\tMapBuffer\n\nUnmapBufferARB(target)\n\treturn\t\tBoolean\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tcategory\tARB_vertex_buffer_object\n\tversion\t\t1.2\n\textension\n\talias\t\tUnmapBuffer\n\nGetBufferParameterivARB(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\tpname\t\tBufferPNameARB in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tARB_vertex_buffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\talias\t\tGetBufferParameteriv\n\nGetBufferPointervARB(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\tpname\t\tBufferPointerNameARB in value\n\tparam\t\tparams\t\tVoidPointer out array [1]\n\tcategory\tARB_vertex_buffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\talias\t\tGetBufferPointerv\n\n###############################################################################\n#\n# ARB Extension #29\n# ARB_occlusion_query commands\n#\n###############################################################################\n\nGenQueriesARB(n, ids)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tids\t\tUInt32 out array [n]\n\tcategory\tARB_occlusion_query\n\tversion\t\t1.5\n\textension\n\talias\t\tGenQueries\n\nDeleteQueriesARB(n, ids)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tids\t\tUInt32 in array [n]\n\tcategory\tARB_occlusion_query\n\tversion\t\t1.5\n\textension\n\talias\t\tDeleteQueries\n\nIsQueryARB(id)\n\treturn\t\tBoolean\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tARB_occlusion_query\n\tversion\t\t1.5\n\textension\n\talias\t\tIsQuery\n\nBeginQueryARB(target, id)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tARB_occlusion_query\n\tversion\t\t1.5\n\textension\n\talias\t\tBeginQuery\n\nEndQueryARB(target)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tcategory\tARB_occlusion_query\n\tversion\t\t1.5\n\textension\n\talias\t\tEndQuery\n\nGetQueryivARB(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [pname]\n\tcategory\tARB_occlusion_query\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\n\talias\t\tGetQueryiv\n\nGetQueryObjectivARB(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [pname]\n\tcategory\tARB_occlusion_query\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\n\talias\t\tGetQueryObjectiv\n\nGetQueryObjectuivARB(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tUInt32 out array [pname]\n\tcategory\tARB_occlusion_query\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\n\talias\t\tGetQueryObjectuiv\n\n###############################################################################\n#\n# ARB Extension #30\n# ARB_shader_objects commands\n#\n###############################################################################\n\nDeleteObjectARB(obj)\n\treturn\t\tvoid\n\tparam\t\tobj\t\thandleARB in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetHandleARB(pname)\n\treturn\t\thandleARB\n\tparam\t\tpname\t\tGLenum in value\n\tcategory\tARB_shader_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDetachObjectARB(containerObj, attachedObj)\n\treturn\t\tvoid\n\tparam\t\tcontainerObj\thandleARB in value\n\tparam\t\tattachedObj\thandleARB in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tDetachShader\n\nCreateShaderObjectARB(shaderType)\n\treturn\t\thandleARB\n\tparam\t\tshaderType\tGLenum in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tCreateShader\n\nShaderSourceARB(shaderObj, count, string, length)\n\treturn\t\tvoid\n\tparam\t\tshaderObj\thandleARB in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tstring\t\tcharPointerARB in array [count]\n\tparam\t\tlength\t\tInt32 in array [1]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tShaderSource\n\nCompileShaderARB(shaderObj)\n\treturn\t\tvoid\n\tparam\t\tshaderObj\thandleARB in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tCompileShader\n\nCreateProgramObjectARB()\n\treturn\t\thandleARB\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tCreateProgram\n\nAttachObjectARB(containerObj, obj)\n\treturn\t\tvoid\n\tparam\t\tcontainerObj\thandleARB in value\n\tparam\t\tobj\t\thandleARB in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tAttachShader\n\nLinkProgramARB(programObj)\n\treturn\t\tvoid\n\tparam\t\tprogramObj\thandleARB in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tLinkProgram\n\nUseProgramObjectARB(programObj)\n\treturn\t\tvoid\n\tparam\t\tprogramObj\thandleARB in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUseProgram\n\nValidateProgramARB(programObj)\n\treturn\t\tvoid\n\tparam\t\tprogramObj\thandleARB in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tValidateProgram\n\nUniform1fARB(location, v0)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform1f\n\nUniform2fARB(location, v0, v1)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tparam\t\tv1\t\tFloat32 in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform2f\n\nUniform3fARB(location, v0, v1, v2)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tparam\t\tv1\t\tFloat32 in value\n\tparam\t\tv2\t\tFloat32 in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform3f\n\nUniform4fARB(location, v0, v1, v2, v3)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tparam\t\tv1\t\tFloat32 in value\n\tparam\t\tv2\t\tFloat32 in value\n\tparam\t\tv3\t\tFloat32 in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform4f\n\nUniform1iARB(location, v0)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform1i\n\nUniform2iARB(location, v0, v1)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tparam\t\tv1\t\tInt32 in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform2i\n\nUniform3iARB(location, v0, v1, v2)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tparam\t\tv1\t\tInt32 in value\n\tparam\t\tv2\t\tInt32 in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform3i\n\nUniform4iARB(location, v0, v1, v2, v3)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tparam\t\tv1\t\tInt32 in value\n\tparam\t\tv2\t\tInt32 in value\n\tparam\t\tv3\t\tInt32 in value\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform4i\n\nUniform1fvARB(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform1fv\n\nUniform2fvARB(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform2fv\n\nUniform3fvARB(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform3fv\n\nUniform4fvARB(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform4fv\n\nUniform1ivARB(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform1iv\n\nUniform2ivARB(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform2iv\n\nUniform3ivARB(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform3iv\n\nUniform4ivARB(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniform4iv\n\nUniformMatrix2fvARB(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniformMatrix2fv\n\nUniformMatrix3fvARB(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniformMatrix3fv\n\nUniformMatrix4fvARB(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tARB_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tUniformMatrix4fv\n\nGetObjectParameterfvARB(obj, pname, params)\n\treturn\t\tvoid\n\tparam\t\tobj\t\thandleARB in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tFloat32 out array [pname]\n\tcategory\tARB_shader_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetObjectParameterivARB(obj, pname, params)\n\treturn\t\tvoid\n\tparam\t\tobj\t\thandleARB in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [pname]\n\tcategory\tARB_shader_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetInfoLogARB(obj, maxLength, length, infoLog)\n\treturn\t\tvoid\n\tparam\t\tobj\t\thandleARB in value\n\tparam\t\tmaxLength\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tinfoLog\t\tcharARB out array [length]\n\tcategory\tARB_shader_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetAttachedObjectsARB(containerObj, maxCount, count, obj)\n\treturn\t\tvoid\n\tparam\t\tcontainerObj\thandleARB in value\n\tparam\t\tmaxCount\tSizeI in value\n\tparam\t\tcount\t\tSizeI out array [1]\n\tparam\t\tobj\t\thandleARB out array [count]\n\tcategory\tARB_shader_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\talias\t\tGetAttachedShaders\n\nGetUniformLocationARB(programObj, name)\n\treturn\t\tInt32\n\tparam\t\tprogramObj\thandleARB in value\n\tparam\t\tname\t\tcharARB in array []\n\tcategory\tARB_shader_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\talias\t\tGetUniformLocation\n\nGetActiveUniformARB(programObj, index, maxLength, length, size, type, name)\n\treturn\t\tvoid\n\tparam\t\tprogramObj\thandleARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tmaxLength\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tsize\t\tInt32 out array [1]\n\tparam\t\ttype\t\tGLenum out array [1]\n\tparam\t\tname\t\tcharARB out array []\n\tcategory\tARB_shader_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\talias\t\tGetActiveUniform\n\nGetUniformfvARB(programObj, location, params)\n\treturn\t\tvoid\n\tparam\t\tprogramObj\thandleARB in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tparams\t\tFloat32 out array [location]\n\tcategory\tARB_shader_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\talias\t\tGetUniformfv\n\nGetUniformivARB(programObj, location, params)\n\treturn\t\tvoid\n\tparam\t\tprogramObj\thandleARB in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tparams\t\tInt32 out array [location]\n\tcategory\tARB_shader_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\talias\t\tGetUniformiv\n\nGetShaderSourceARB(obj, maxLength, length, source)\n\treturn\t\tvoid\n\tparam\t\tobj\t\thandleARB in value\n\tparam\t\tmaxLength\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tsource\t\tcharARB out array [length]\n\tcategory\tARB_shader_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\talias\t\tGetShaderSource\n\n\n###############################################################################\n#\n# ARB Extension #31\n# ARB_vertex_shader commands\n#\n###############################################################################\n\nBindAttribLocationARB(programObj, index, name)\n\treturn\t\tvoid\n\tparam\t\tprogramObj\thandleARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tname\t\tcharARB in array []\n\tcategory\tARB_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tBindAttribLocation\n\nGetActiveAttribARB(programObj, index, maxLength, length, size, type, name)\n\treturn\t\tvoid\n\tparam\t\tprogramObj\thandleARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tmaxLength\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tsize\t\tInt32 out array [1]\n\tparam\t\ttype\t\tGLenum out array [1]\n\tparam\t\tname\t\tcharARB out array []\n\tcategory\tARB_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\talias\t\tGetActiveAttrib\n\nGetAttribLocationARB(programObj, name)\n\treturn\t\tInt32\n\tparam\t\tprogramObj\thandleARB in value\n\tparam\t\tname\t\tcharARB in array []\n\tcategory\tARB_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\talias\t\tGetAttribLocation\n\n###############################################################################\n#\n# ARB Extension #32\n# ARB_fragment_shader commands\n#\n###############################################################################\n\n#  (none)\nnewcategory: ARB_fragment_shader\n\n###############################################################################\n#\n# ARB Extension #33\n# ARB_shading_language_100 commands\n#\n###############################################################################\n\n#  (none)\nnewcategory: ARB_shading_language_100\n\n###############################################################################\n#\n# ARB Extension #34\n# ARB_texture_non_power_of_two commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_non_power_of_two\n\n###############################################################################\n#\n# ARB Extension #35\n# ARB_point_sprite commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_point_sprite\n\n###############################################################################\n#\n# ARB Extension #36\n# ARB_fragment_program_shadow commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_fragment_program_shadow\n\n###############################################################################\n#\n# ARB Extension #37\n# ARB_draw_buffers commands\n#\n###############################################################################\n\nDrawBuffersARB(n, bufs)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tbufs\t\tDrawBufferModeATI in array [n]\n\tcategory\tARB_draw_buffers\n\tversion\t\t1.5\n\textension\n\talias\t\tDrawBuffers\n\n###############################################################################\n#\n# ARB Extension #38\n# ARB_texture_rectangle commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_rectangle\n\n###############################################################################\n#\n# ARB Extension #39\n# ARB_color_buffer_float commands\n#\n###############################################################################\n\nClampColorARB(target, clamp)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tClampColorTargetARB in value\n\tparam\t\tclamp\t\tClampColorModeARB in value\n\tcategory\tARB_color_buffer_float\n\tversion\t\t1.5\n\textension\n\tglxropcode\t234\n\tglxflags\tignore\n\talias\t\tClampColor\n\n###############################################################################\n#\n# ARB Extension #40\n# ARB_half_float_pixel commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_half_float_pixel\n\n###############################################################################\n#\n# ARB Extension #41\n# ARB_texture_float commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_float\n\n###############################################################################\n#\n# ARB Extension #42\n# ARB_pixel_buffer_object commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_pixel_buffer_object\n\n###############################################################################\n#\n# ARB Extension #43\n# ARB_depth_buffer_float commands (also OpenGL 3.0)\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_depth_buffer_float\n\n###############################################################################\n#\n# ARB Extension #44\n# ARB_draw_instanced commands\n#\n###############################################################################\n\nDrawArraysInstancedARB(mode, first, count, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tfirst\t\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tARB_draw_instanced\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tvectorequiv\tArrayElement\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tDrawArraysInstanced\n\nDrawElementsInstancedARB(mode, count, type, indices, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoid in array [COMPSIZE(count/type)]\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tARB_draw_instanced\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tvectorequiv\tArrayElement\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tDrawElementsInstanced\n\n###############################################################################\n#\n# ARB Extension #45\n# ARB_framebuffer_object commands (also OpenGL 3.0)\n#\n###############################################################################\n\n# Promoted from EXT_framebuffer_object\nIsRenderbuffer(renderbuffer)\n\treturn\t\tBoolean\n\tparam\t\trenderbuffer\tUInt32 in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxvendorpriv\t1422\n\tglxflags\tignore\n\toffset\t\t?\n\nBindRenderbuffer(target, renderbuffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tRenderbufferTarget in value\n\tparam\t\trenderbuffer\tUInt32 in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t4316\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteRenderbuffers(n, renderbuffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\trenderbuffers\tUInt32 in array [n]\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t4317\n\tglxflags\tignore\n\toffset\t\t?\n\nGenRenderbuffers(n, renderbuffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\trenderbuffers\tUInt32 out array [n]\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxvendorpriv\t1423\n\tglxflags\tignore\n\toffset\t\t?\n\nRenderbufferStorage(target, internalformat, width, height)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tRenderbufferTarget in value\n\tparam\t\tinternalformat\tGLenum in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t4318\n\tglxflags\tignore\n\toffset\t\t?\n\nGetRenderbufferParameteriv(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tRenderbufferTarget in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tARB_framebuffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t3.0\n\textension\n\tglxvendorpriv\t1424\n\tglxflags\tignore\n\toffset\t\t?\n\nIsFramebuffer(framebuffer)\n\treturn\t\tBoolean\n\tparam\t\tframebuffer\tUInt32 in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxvendorpriv\t1425\n\tglxflags\tignore\n\toffset\t\t?\n\nBindFramebuffer(target, framebuffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tframebuffer\tUInt32 in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t4319\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteFramebuffers(n, framebuffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tframebuffers\tUInt32 in array [n]\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t4320\n\tglxflags\tignore\n\toffset\t\t?\n\nGenFramebuffers(n, framebuffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tframebuffers\tUInt32 out array [n]\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxvendorpriv\t1426\n\tglxflags\tignore\n\toffset\t\t?\n\nCheckFramebufferStatus(target)\n\treturn\t\tGLenum\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxvendorpriv\t1427\n\tglxflags\tignore\n\toffset\t\t?\n\nFramebufferTexture1D(target, attachment, textarget, texture, level)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttextarget\tGLenum in value\n\tparam\t\ttexture\t\tUInt32 in value\n\tparam\t\tlevel\t\tInt32 in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t4321\n\tglxflags\tignore\n\toffset\t\t?\n\nFramebufferTexture2D(target, attachment, textarget, texture, level)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttextarget\tGLenum in value\n\tparam\t\ttexture\t\tUInt32 in value\n\tparam\t\tlevel\t\tInt32 in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t4322\n\tglxflags\tignore\n\toffset\t\t?\n\nFramebufferTexture3D(target, attachment, textarget, texture, level, zoffset)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttextarget\tGLenum in value\n\tparam\t\ttexture\t\tUInt32 in value\n\tparam\t\tlevel\t\tInt32 in value\n\tparam\t\tzoffset\t\tInt32 in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t4323\n\tglxflags\tignore\n\toffset\t\t?\n\nFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\trenderbuffertarget\tRenderbufferTarget in value\n\tparam\t\trenderbuffer\tUInt32 in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t4324\n\tglxflags\tignore\n\toffset\t\t?\n\nGetFramebufferAttachmentParameteriv(target, attachment, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tARB_framebuffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t3.0\n\textension\n\tglxvendorpriv\t1428\n\tglxflags\tignore\n\toffset\t\t?\n\nGenerateMipmap(target)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t4325\n\tglxflags\tignore\n\toffset\t\t?\n\n# Promoted from EXT_framebuffer_blit\nBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter)\n\treturn\t\tvoid\n\tparam\t\tsrcX0\t\tInt32 in value\n\tparam\t\tsrcY0\t\tInt32 in value\n\tparam\t\tsrcX1\t\tInt32 in value\n\tparam\t\tsrcY1\t\tInt32 in value\n\tparam\t\tdstX0\t\tInt32 in value\n\tparam\t\tdstY0\t\tInt32 in value\n\tparam\t\tdstX1\t\tInt32 in value\n\tparam\t\tdstY1\t\tInt32 in value\n\tparam\t\tmask\t\tClearBufferMask in value\n\tparam\t\tfilter\t\tGLenum in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\tglxropcode\t4330\n\toffset\t\t?\n\n# Promoted from EXT_framebuffer_multisample\nRenderbufferStorageMultisample(target, samples, internalformat, width, height)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tsamples\t\tSizeI in value\n\tparam\t\tinternalformat\tGLenum in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\tglxropcode\t4331\n\toffset\t\t?\n\n# Promoted from ARB_geometry_shader4\nFramebufferTextureLayer(target, attachment, texture, level, layer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tlayer\t\tCheckedInt32 in value\n\tcategory\tARB_framebuffer_object\n\tversion\t\t3.0\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\n\n###############################################################################\n#\n# ARB Extension #46\n# ARB_framebuffer_sRGB commands (also OpenGL 3.0)\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_framebuffer_sRGB\n\n###############################################################################\n#\n# ARB Extension #47\n# ARB_geometry_shader4 commands\n#\n###############################################################################\n\nProgramParameteriARB(program, pname, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tpname\t\tProgramParameterPName in value\n\tparam\t\tvalue\t\tInt32 in value\n\tcategory\tARB_geometry_shader4\n\tversion\t\t3.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\nFramebufferTextureARB(target, attachment, texture, level)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tcategory\tARB_geometry_shader4\n\tversion\t\t3.0\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\nFramebufferTextureLayerARB(target, attachment, texture, level, layer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tlayer\t\tCheckedInt32 in value\n\tcategory\tARB_geometry_shader4\n\tversion\t\t3.0\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tFramebufferTextureLayer\n\nFramebufferTextureFaceARB(target, attachment, texture, level, face)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tface\t\tTextureTarget in value\n\tcategory\tARB_geometry_shader4\n\tversion\t\t3.0\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\n###############################################################################\n#\n# ARB Extension #48\n# ARB_half_float_vertex commands (also OpenGL 3.0)\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_half_float_vertex\n\n###############################################################################\n#\n# ARB Extension #49\n# ARB_instanced_arrays commands\n#\n###############################################################################\n\nVertexAttribDivisorARB(index, divisor)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tdivisor\t\tUInt32 in value\n\tcategory\tARB_instanced_arrays\n\tversion\t\t2.0\n\textension\n\tglfflags\tignore\n\tglxflags\tignore\n\n###############################################################################\n#\n# ARB Extension #50\n# ARB_map_buffer_range commands (also OpenGL 3.0)\n#\n###############################################################################\n\nMapBufferRange(target, offset, length, access)\n\treturn\t\tVoidPointer\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\toffset\t\tBufferOffset in value\n\tparam\t\tlength\t\tBufferSize in value\n\tparam\t\taccess\t\tBufferAccessMask in value\n\tcategory\tARB_map_buffer_range\n\tversion\t\t3.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n# Promoted from APPLE_flush_buffer_range\nFlushMappedBufferRange(target, offset, length)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\toffset\t\tBufferOffset in value\n\tparam\t\tlength\t\tBufferSize in value\n\tcategory\tARB_map_buffer_range\n\tversion\t\t3.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #51\n# ARB_texture_buffer_object commands\n#\n###############################################################################\n\nTexBufferARB(target, internalformat, buffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tinternalformat\tGLenum in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tARB_texture_buffer_object\n\tversion\t\t3.0\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\talias\t\tTexBuffer\n\n###############################################################################\n#\n# ARB Extension #52\n# ARB_texture_compression_rgtc commands (also OpenGL 3.0)\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_compression_rgtc\n\n###############################################################################\n#\n# ARB Extension #53\n# ARB_texture_rg commands (also OpenGL 3.0)\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_rg\n\n###############################################################################\n#\n# ARB Extension #54\n# ARB_vertex_array_object commands (also OpenGL 3.0)\n#\n###############################################################################\n\n# Promoted from APPLE_vertex_array_object\nBindVertexArray(array)\n\treturn\t\tvoid\n\tparam\t\tarray\t\tUInt32 in value\n\tcategory\tARB_vertex_array_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteVertexArrays(n, arrays)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tarrays\t\tUInt32 in array [n]\n\tcategory\tARB_vertex_array_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGenVertexArrays(n, arrays)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tarrays\t\tUInt32 out array [n]\n\tcategory\tARB_vertex_array_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIsVertexArray(array)\n\treturn\t\tBoolean\n\tparam\t\tarray\t\tUInt32 in value\n\tcategory\tARB_vertex_array_object\n\tversion\t\t3.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #55 - WGL_ARB_create_context\n# ARB Extension #56 - GLX_ARB_create_context\n#\n###############################################################################\n\n###############################################################################\n#\n# ARB Extension #57\n# ARB_uniform_buffer_object commands\n#\n###############################################################################\n\nGetUniformIndices(program, uniformCount, uniformNames, uniformIndices)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tuniformCount\tSizeI in value\n\tparam\t\tuniformNames\tCharPointer in array [COMPSIZE(uniformCount)]\n\tparam\t\tuniformIndices\tUInt32 out array [COMPSIZE(uniformCount)]\n\tcategory\tARB_uniform_buffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tuniformCount\tSizeI in value\n\tparam\t\tuniformIndices\tUInt32 in array [COMPSIZE(uniformCount)]\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tARB_uniform_buffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetActiveUniformName(program, uniformIndex, bufSize, length, uniformName)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tuniformIndex\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tuniformName\tChar out array [bufSize]\n\tcategory\tARB_uniform_buffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetUniformBlockIndex(program, uniformBlockName)\n\treturn\t\tUInt32\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tuniformBlockName\tChar in array [COMPSIZE()]\n\tcategory\tARB_uniform_buffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tuniformBlockIndex\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tARB_uniform_buffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tuniformBlockIndex\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tuniformBlockName\tChar out array [bufSize]\n\tcategory\tARB_uniform_buffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tuniformBlockIndex\tUInt32 in value\n\tparam\t\tuniformBlockBinding\tUInt32 in value\n\tcategory\tARB_uniform_buffer_object\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n\n###############################################################################\n#\n# ARB Extension #58\n# ARB_compatibility commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_compatibility\n\n###############################################################################\n#\n# ARB Extension #59\n# ARB_copy_buffer commands\n#\n###############################################################################\n\nCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size)\n\treturn\t\tvoid\n\tparam\t\treadTarget\tGLenum in value\n\tparam\t\twriteTarget\tGLenum in value\n\tparam\t\treadOffset\tBufferOffset in value\n\tparam\t\twriteOffset\tBufferOffset in value\n\tparam\t\tsize\t\tBufferSize in value\n\tcategory\tARB_copy_buffer\n\tversion\t\t3.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #60\n# ARB_shader_texture_lod commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_shader_texture_lod\n\n###############################################################################\n#\n# ARB Extension #61\n# ARB_depth_clamp commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_depth_clamp\n\n###############################################################################\n#\n# ARB Extension #62\n# ARB_draw_elements_base_vertex commands\n#\n###############################################################################\n\nDrawElementsBaseVertex(mode, count, type, indices, basevertex)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoid in array [COMPSIZE(count/type)]\n\tparam\t\tbasevertex\tInt32 in value\n\tcategory\tARB_draw_elements_base_vertex\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tparam\t\tstart\t\tUInt32 in value\n\tparam\t\tend\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoid in array [COMPSIZE(count/type)]\n\tparam\t\tbasevertex\tInt32 in value\n\tcategory\tARB_draw_elements_base_vertex\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDrawElementsInstancedBaseVertex(mode, count, type, indices, primcount, basevertex)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoid in array [COMPSIZE(count/type)]\n\tparam\t\tprimcount\tSizeI in value\n\tparam\t\tbasevertex\tInt32 in value\n\tcategory\tARB_draw_elements_base_vertex\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiDrawElementsBaseVertex(mode, count, type, indices, primcount, basevertex)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tparam\t\tcount\t\tSizeI in array [COMPSIZE(primcount)]\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoidPointer in array [COMPSIZE(primcount)]\n\tparam\t\tprimcount\tSizeI in value\n\tparam\t\tbasevertex\tInt32 in array [COMPSIZE(primcount)]\n\tcategory\tARB_draw_elements_base_vertex\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #63\n# ARB_fragment_coord_conventions commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_fragment_coord_conventions\n\n###############################################################################\n#\n# ARB Extension #64\n# ARB_provoking_vertex commands\n#\n###############################################################################\n\nProvokingVertex(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tcategory\tARB_provoking_vertex\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #65\n# ARB_seamless_cube_map commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_seamless_cube_map\n\n###############################################################################\n#\n# ARB Extension #66\n# ARB_sync commands\n#\n###############################################################################\n\nFenceSync(condition, flags)\n\treturn\t\tsync\n\tparam\t\tcondition\tGLenum in value\n\tparam\t\tflags\t\tGLbitfield in value\n\tcategory\tARB_sync\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIsSync(sync)\n\treturn\t\tBoolean\n\tparam\t\tsync\t\tsync in value\n\tcategory\tARB_sync\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteSync(sync)\n\treturn\t\tvoid\n\tparam\t\tsync\t\tsync in value\n\tcategory\tARB_sync\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nClientWaitSync(sync, flags, timeout)\n\treturn\t\tGLenum\n\tparam\t\tsync\t\tsync in value\n\tparam\t\tflags\t\tGLbitfield in value\n\tparam\t\ttimeout\t\tUInt64 in value\n\tcategory\tARB_sync\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nWaitSync(sync, flags, timeout)\n\treturn\t\tvoid\n\tparam\t\tsync\t\tsync in value\n\tparam\t\tflags\t\tGLbitfield in value\n\tparam\t\ttimeout\t\tUInt64 in value\n\tcategory\tARB_sync\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetInteger64v(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt64 out array [COMPSIZE(pname)]\n\tcategory\tARB_sync\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetSynciv(sync, pname, bufSize, length, values)\n\treturn\t\tvoid\n\tparam\t\tsync\t\tsync in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tvalues\t\tInt32 out array [length]\n\tcategory\tARB_sync\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #67\n# ARB_texture_multisample commands\n#\n###############################################################################\n\nTexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tsamples\t\tSizeI in value\n\tparam\t\tinternalformat\tInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tfixedsamplelocations\tBoolean in value\n\tcategory\tARB_texture_multisample\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tsamples\t\tSizeI in value\n\tparam\t\tinternalformat\tInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tfixedsamplelocations\tBoolean in value\n\tcategory\tARB_texture_multisample\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetMultisamplefv(pname, index, val)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tval\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tARB_texture_multisample\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSampleMaski(index, mask)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tmask\t\tGLbitfield in value\n\tcategory\tARB_texture_multisample\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #68\n# ARB_vertex_array_bgra commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_vertex_array_bgra\n\n###############################################################################\n#\n# ARB Extension #69\n# ARB_draw_buffers_blend commands\n#\n###############################################################################\n\n@@@ Add ARB suffixes here & functions!\nBlendEquationi(buf, mode)\n\treturn\t\tvoid\n\tparam\t\tbuf\t\tUInt32 in value\n\tparam\t\tmode\t\tGLenum in value\n\tcategory\tARB_draw_buffers_blend\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBlendEquationSeparatei(buf, modeRGB, modeAlpha)\n\treturn\t\tvoid\n\tparam\t\tbuf\t\tUInt32 in value\n\tparam\t\tmodeRGB\t\tGLenum in value\n\tparam\t\tmodeAlpha\tGLenum in value\n\tcategory\tARB_draw_buffers_blend\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBlendFunci(buf, src, dst)\n\treturn\t\tvoid\n\tparam\t\tbuf\t\tUInt32 in value\n\tparam\t\tsrc\t\tGLenum in value\n\tparam\t\tdst\t\tGLenum in value\n\tcategory\tARB_draw_buffers_blend\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha)\n\treturn\t\tvoid\n\tparam\t\tbuf\t\tUInt32 in value\n\tparam\t\tsrcRGB\t\tGLenum in value\n\tparam\t\tdstRGB\t\tGLenum in value\n\tparam\t\tsrcAlpha\tGLenum in value\n\tparam\t\tdstAlpha\tGLenum in value\n\tcategory\tARB_draw_buffers_blend\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #70\n# ARB_sample_shading commands\n#\n###############################################################################\n\n@@@ Add ARB suffixes here & functions!\nMinSampleShading(value)\n\treturn\t\tvoid\n\tparam\t\tvalue\t\tClampedColorF in value\n\tcategory\tARB_sample_shading\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #71\n# ARB_texture_cube_map_array commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_cube_map_array\n\n###############################################################################\n#\n# ARB Extension #72\n# ARB_texture_gather commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_gather\n\n###############################################################################\n#\n# ARB Extension #73\n# ARB_texture_query_lod commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ARB_texture_query_lod\n\n###############################################################################\n#\n# ARB Extension #74 - WGL_ARB_create_context_profile\n# ARB Extension #75 - GLX_ARB_create_context_profile\n#\n###############################################################################\n\n###############################################################################\n#\n# ARB Extension #76\n# ARB_shading_language_include commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\nNamedStringARB(type, namelen, name, stringlen, string)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tnamelen\t\tInt32 in value\n\tparam\t\tname\t\tChar in array [namelen]\n\tparam\t\tstringlen\tInt32 in value\n\tparam\t\tstring\t\tChar in array [stringlen]\n\tcategory\tARB_shading_language_include\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteNamedStringARB(namelen, name)\n\treturn\t\tvoid\n\tparam\t\tnamelen\t\tInt32 in value\n\tparam\t\tname\t\tChar in array [namelen]\n\tcategory\tARB_shading_language_include\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nCompileShaderIncludeARB(shader, count, path, length)\n\treturn\t\tvoid\n\tparam\t\tshader\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tpath\t\tCharPointer in array [count]\n\tparam\t\tlength\t\tInt32 in array [count]\n\tcategory\tARB_shading_language_include\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIsNamedStringARB(namelen, name)\n\treturn\t\tBoolean\n\tparam\t\tnamelen\t\tInt32 in value\n\tparam\t\tname\t\tChar in array [namelen]\n\tcategory\tARB_shading_language_include\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetNamedStringARB(namelen, name, bufSize, stringlen, string)\n\treturn\t\tvoid\n\tparam\t\tnamelen\t\tInt32 in value\n\tparam\t\tname\t\tChar in array [namelen]\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tstringlen\tInt32 out array [1]\n\tparam\t\tstring\t\tChar out array [bufSize]\n\tcategory\tARB_shading_language_include\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetNamedStringivARB(namelen, name, pname, params)\n\treturn\t\tvoid\n\tparam\t\tnamelen\t\tInt32 in value\n\tparam\t\tname\t\tChar in array [namelen]\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tARB_shading_language_include\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #77\n# ARB_texture_compression_bptc commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\n###############################################################################\n#\n# ARB Extension #78\n# ARB_blend_func_extended commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\nBindFragDataLocationIndexed(program, colorNumber, index, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tcolorNumber\tUInt32 in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tname\t\tChar in array []\n\tcategory\tARB_blend_func_extended\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetFragDataIndex(program, name)\n\treturn\t\tInt32\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tname\t\tChar in array []\n\tcategory\tARB_blend_func_extended\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #79\n# ARB_explicit_attrib_location commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\n###############################################################################\n#\n# ARB Extension #80\n# ARB_occlusion_query2 commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\n###############################################################################\n#\n# ARB Extension #81\n# ARB_sampler_objects commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\nGenSamplers(count, samplers)\n\treturn\t\tvoid\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tsamplers\tUInt32 out array [count]\n\tcategory\tARB_sampler_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteSamplers(count, samplers)\n\treturn\t\tvoid\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tsamplers\tUInt32 in array [count]\n\tcategory\tARB_sampler_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIsSampler(sampler)\n\treturn\t\tBoolean\n\tparam\t\tsampler\t\tUInt32 in value\n\tcategory\tARB_sampler_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBindSampler(unit, sampler)\n\treturn\t\tvoid\n\tparam\t\tunit\t\tGLenum in value\n\tparam\t\tsampler\t\tUInt32 in value\n\tcategory\tARB_sampler_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSamplerParameteri(sampler, pname, param)\n\treturn\t\tvoid\n\tparam\t\tsampler\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparam\t\tInt32 in value\n\tcategory\tARB_sampler_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSamplerParameteriv(sampler, pname, param)\n\treturn\t\tvoid\n\tparam\t\tsampler\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparam\t\tInt32 in array [COMPSIZE(pname)]\n\tcategory\tARB_sampler_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSamplerParameterf(sampler, pname, param)\n\treturn\t\tvoid\n\tparam\t\tsampler\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparam\t\tFloat32 in value\n\tcategory\tARB_sampler_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSamplerParameterfv(sampler, pname, param)\n\treturn\t\tvoid\n\tparam\t\tsampler\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparam\t\tFloat32 in array [COMPSIZE(pname)]\n\tcategory\tARB_sampler_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSamplerParameterIiv(sampler, pname, param)\n\treturn\t\tvoid\n\tparam\t\tsampler\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparam\t\tInt32 in array [COMPSIZE(pname)]\n\tcategory\tARB_sampler_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSamplerParameterIuiv(sampler, pname, param)\n\treturn\t\tvoid\n\tparam\t\tsampler\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparam\t\tUInt32 in array [COMPSIZE(pname)]\n\tcategory\tARB_sampler_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetSamplerParameteriv(sampler, pname, params)\n\treturn\t\tvoid\n\tparam\t\tsampler\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tARB_sampler_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetSamplerParameterIiv(sampler, pname, params)\n\treturn\t\tvoid\n\tparam\t\tsampler\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tARB_sampler_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetSamplerParameterfv(sampler, pname, params)\n\treturn\t\tvoid\n\tparam\t\tsampler\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tARB_sampler_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetSamplerParameterIfv(sampler, pname, params)\n\treturn\t\tvoid\n\tparam\t\tsampler\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tARB_sampler_objects\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #82\n# ARB_shader_bit_encoding commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\n###############################################################################\n#\n# ARB Extension #83\n# ARB_texture_rgb10_a2ui commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\n###############################################################################\n#\n# ARB Extension #84\n# ARB_texture_swizzle commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\n###############################################################################\n#\n# ARB Extension #85\n# ARB_timer_query commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\nQueryCounter(id, target)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\ttarget\t\tGLenum in value\n\tcategory\tARB_timer_query\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetQueryObjecti64v(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt64 out array [COMPSIZE(pname)]\n\tcategory\tARB_timer_query\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetQueryObjectui64v(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tUInt64 out array [COMPSIZE(pname)]\n\tcategory\tARB_timer_query\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #86\n# ARB_vertex_type_2_10_10_10_rev commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\nVertexP2ui(type, value)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tvalue\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexP2uiv(type, value)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tvalue\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexP3ui(type, value)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tvalue\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexP3uiv(type, value)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tvalue\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexP4ui(type, value)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tvalue\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexP4uiv(type, value)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tvalue\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoordP1ui(type, coords)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoordP1uiv(type, coords)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoordP2ui(type, coords)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoordP2uiv(type, coords)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoordP3ui(type, coords)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoordP3uiv(type, coords)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoordP4ui(type, coords)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoordP4uiv(type, coords)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoordP1ui(texture, type, coords)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tGLenum in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoordP1uiv(texture, type, coords)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tGLenum in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoordP2ui(texture, type, coords)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tGLenum in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoordP2uiv(texture, type, coords)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tGLenum in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoordP3ui(texture, type, coords)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tGLenum in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoordP3uiv(texture, type, coords)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tGLenum in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoordP4ui(texture, type, coords)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tGLenum in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoordP4uiv(texture, type, coords)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tGLenum in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalP3ui(type, coords)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalP3uiv(type, coords)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcoords\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColorP3ui(type, color)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcolor\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColorP3uiv(type, color)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcolor\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColorP4ui(type, color)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcolor\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColorP4uiv(type, color)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcolor\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSecondaryColorP3ui(type, color)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcolor\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSecondaryColorP3uiv(type, color)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tcolor\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribP1ui(index, type, normalized, value)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tvalue\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribP1uiv(index, type, normalized, value)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tvalue\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribP2ui(index, type, normalized, value)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tvalue\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribP2uiv(index, type, normalized, value)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tvalue\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribP3ui(index, type, normalized, value)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tvalue\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribP3uiv(index, type, normalized, value)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tvalue\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribP4ui(index, type, normalized, value)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tvalue\t\tUInt32 in value\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribP4uiv(index, type, normalized, value)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tvalue\t\tUInt32 in array [1]\n\tcategory\tARB_vertex_type_2_10_10_10_rev\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #87\n# ARB_draw_indirect commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\nDrawArraysIndirect(mode, indirect)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tparam\t\tindirect\tVoid in array []\n\tcategory\tARB_draw_indirect\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDrawElementsIndirect(mode, type, indirect)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tindirect\tVoid in array []\n\tcategory\tARB_draw_indirect\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #88\n# ARB_gpu_shader5 commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\n###############################################################################\n#\n# ARB Extension #89\n# ARB_gpu_shader_fp64 commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\nUniform1d(location, x)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform2d(location, x, y)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform3d(location, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform4d(location, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tparam\t\tw\t\tFloat64 in value\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform1dv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform2dv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform3dv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniform4dv(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix2dv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix3dv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix4dv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix2x3dv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix2x4dv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix3x2dv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix3x4dv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix4x2dv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformMatrix4x3dv(location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetUniformdv(program, location, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tparams\t\tFloat64 out array [location]\n\tcategory\tARB_gpu_shader_fp64\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniform1dEXT(program, location, x)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniform2dEXT(program, location, x, y)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniform3dEXT(program, location, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniform4dEXT(program, location, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tparam\t\tw\t\tFloat64 in value\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniform1dvEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniform2dvEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniform3dvEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniform4dvEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniformMatrix2dvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniformMatrix3dvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniformMatrix4dvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniformMatrix2x3dvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniformMatrix2x4dvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniformMatrix3x2dvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniformMatrix3x4dvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniformMatrix4x2dvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniformMatrix4x3dvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat64 in array [count]\n\tcategory\tARB_gpu_shader_fp64\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #90\n# ARB_shader_subroutine commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\nGetSubroutineUniformLocation(program, shadertype, name)\n\treturn\t\tInt32\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tshadertype\tGLenum in value\n\tparam\t\tname\t\tChar in array []\n\tcategory\tARB_shader_subroutine\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetSubroutineIndex(program, shadertype, name)\n\treturn\t\tUInt32\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tshadertype\tGLenum in value\n\tparam\t\tname\t\tChar in array []\n\tcategory\tARB_shader_subroutine\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetActiveSubroutineUniformiv(program, shadertype, index, pname, values)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tshadertype\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tvalues\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tARB_shader_subroutine\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tshadertype\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbufsize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tname\t\tChar out array [bufsize]\n\tcategory\tARB_shader_subroutine\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetActiveSubroutineName(program, shadertype, index, bufsize, length, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tshadertype\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbufsize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tname\t\tChar out array [bufsize]\n\tcategory\tARB_shader_subroutine\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformSubroutinesuiv(shadertype, count, indices)\n\treturn\t\tvoid\n\tparam\t\tshadertype\tGLenum in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tindices\t\tUInt32 in array [count]\n\tcategory\tARB_shader_subroutine\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetUniformSubroutineuiv(shadertype, location, params)\n\treturn\t\tvoid\n\tparam\t\tshadertype\tGLenum in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tparams\t\tUInt32 out array [1]\n\tcategory\tARB_shader_subroutine\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetProgramStageiv(program, shadertype, pname, values)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tshadertype\tGLenum in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tvalues\t\tInt32 out array [1]\n\tcategory\tARB_shader_subroutine\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #91\n# ARB_tessellation_shader commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\nPatchParameteri(pname, value)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tvalue\t\tInt32 in value\n\tcategory\tARB_tessellation_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nPatchParameterfv(pname, values)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tvalues\t\tFloat32 in array [COMPSIZE(pname)]\n\tcategory\tARB_tessellation_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #92\n# ARB_texture_buffer_object_rgb32 commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\n###############################################################################\n#\n# ARB Extension #93\n# ARB_transform_feedback2 commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\nBindTransformFeedback(target, id)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tARB_transform_feedback2\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteTransformFeedbacks(n, ids)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tids\t\tUInt32 in array [n]\n\tcategory\tARB_transform_feedback2\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGenTransformFeedbacks(n, ids)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tids\t\tUInt32 out array [n]\n\tcategory\tARB_transform_feedback2\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIsTransformFeedback(id)\n\treturn\t\tBoolean\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tARB_transform_feedback2\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nPauseTransformFeedback()\n\treturn\t\tvoid\n\tcategory\tARB_transform_feedback2\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nResumeTransformFeedback()\n\treturn\t\tvoid\n\tcategory\tARB_transform_feedback2\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDrawTransformFeedback(mode, id)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tARB_transform_feedback2\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# ARB Extension #94\n# ARB_transform_feedback3 commands\n#\n###############################################################################\n\n# ??? VERIFY DONE ???\n\nDrawTransformFeedbackStream(mode, id, stream)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tstream\t\tUInt32 in value\n\tcategory\tARB_transform_feedback3\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBeginQueryIndexed(target, index, id)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tARB_transform_feedback3\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nEndQueryIndexed(target, index)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tARB_transform_feedback3\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetQueryIndexediv(target, index, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tARB_transform_feedback3\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n\n###############################################################################\n###############################################################################\n#\n# Non-ARB extensions, in order by registry extension number\n#\n###############################################################################\n###############################################################################\n\n###############################################################################\n#\n# Extension #1\n# EXT_abgr commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_abgr\n\n###############################################################################\n#\n# Extension #2\n# EXT_blend_color commands\n#\n###############################################################################\n\nBlendColorEXT(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tClampedColorF in value\n\tparam\t\tgreen\t\tClampedColorF in value\n\tparam\t\tblue\t\tClampedColorF in value\n\tparam\t\talpha\t\tClampedColorF in value\n\tcategory\tEXT_blend_color\n\tversion\t\t1.0\n\tglxropcode\t4096\n\tglxflags\tEXT\n\textension\tsoft\n\talias\t\tBlendColor\n\n###############################################################################\n#\n# Extension #3\n# EXT_polygon_offset commands\n#\n###############################################################################\n\nPolygonOffsetEXT(factor, bias)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tFloat32 in value\n\tparam\t\tbias\t\tFloat32 in value\n\tcategory\tEXT_polygon_offset\n\tversion\t\t1.0\n\tglxropcode\t4098\n\tglxflags\tEXT\n\textension\tsoft\n\toffset\t\t414\n\n###############################################################################\n#\n# Extension #4\n# EXT_texture commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture\n\n###############################################################################\n#\n# Extension #5 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #6\n# EXT_texture3D commands\n#\n###############################################################################\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nTexImage3DEXT(target, level, internalformat, width, height, depth, border, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height/depth)]\n\tcategory\tEXT_texture3D\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxropcode\t4114\n\textension\n\talias\t\tTexImage3D\n\nTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height/depth)]\n\tcategory\tEXT_texture3D\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxropcode\t4115\n\textension\n\talias\t\tTexSubImage3D\n\n###############################################################################\n#\n# Extension #7\n# SGIS_texture_filter4 commands\n#\n###############################################################################\n\nGetTexFilterFuncSGIS(target, filter, weights)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tfilter\t\tTextureFilterSGIS in value\n\tparam\t\tweights\t\tFloat32 out array [COMPSIZE(target/filter)]\n\tcategory\tSGIS_texture_filter4\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxvendorpriv\t4101\n\textension\n\toffset\t\t415\n\nTexFilterFuncSGIS(target, filter, n, weights)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tfilter\t\tTextureFilterSGIS in value\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tweights\t\tFloat32 in array [n]\n\tcategory\tSGIS_texture_filter4\n\tglxflags\tSGI\n\tversion\t\t1.0\n\tglxropcode\t2064\n\textension\n\toffset\t\t416\n\n###############################################################################\n#\n# Extension #8 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #9\n# EXT_subtexture commands\n#\n###############################################################################\n\nTexSubImage1DEXT(target, level, xoffset, width, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tEXT_subtexture\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxropcode\t4099\n\textension\n\talias\t\tTexSubImage1D\n\nTexSubImage2DEXT(target, level, xoffset, yoffset, width, height, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height)]\n\tcategory\tEXT_subtexture\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxropcode\t4100\n\textension\n\talias\t\tTexSubImage2D\n\n###############################################################################\n#\n# Extension #10\n# EXT_copy_texture commands\n#\n###############################################################################\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nCopyTexImage1DEXT(target, level, internalformat, x, y, width, border)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tcategory\tEXT_copy_texture\n\tversion\t\t1.0\n\tglxflags\tEXT\n\tglxropcode\t4119\n\textension\n\talias\t\tCopyTexImage1D\n\n# Arguably TexelInternalFormat, not PixelInternalFormat\nCopyTexImage2DEXT(target, level, internalformat, x, y, width, height, border)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tcategory\tEXT_copy_texture\n\tversion\t\t1.0\n\tglxflags\tEXT\n\tglxropcode\t4120\n\textension\n\talias\t\tCopyTexImage2D\n\nCopyTexSubImage1DEXT(target, level, xoffset, x, y, width)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tcategory\tEXT_copy_texture\n\tversion\t\t1.0\n\tglxflags\tEXT\n\tglxropcode\t4121\n\textension\n\talias\t\tCopyTexSubImage1D\n\nCopyTexSubImage2DEXT(target, level, xoffset, yoffset, x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_copy_texture\n\tversion\t\t1.0\n\tglxflags\tEXT\n\tglxropcode\t4122\n\textension\n\talias\t\tCopyTexSubImage2D\n\nCopyTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_copy_texture\n\tversion\t\t1.0\n\tglxflags\tEXT\n\tglxropcode\t4123\n\textension\n\talias\t\tCopyTexSubImage3D\n\n###############################################################################\n#\n# Extension #11\n# EXT_histogram commands\n#\n###############################################################################\n\nGetHistogramEXT(target, reset, format, type, values)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHistogramTargetEXT in value\n\tparam\t\treset\t\tBoolean in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tvalues\t\tVoid out array [COMPSIZE(target/format/type)]\n\tcategory\tEXT_histogram\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxvendorpriv\t5\n\textension\n\toffset\t\t417\n\nGetHistogramParameterfvEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHistogramTargetEXT in value\n\tparam\t\tpname\t\tGetHistogramParameterPNameEXT in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_histogram\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxvendorpriv\t6\n\tglxflags\tEXT\n\textension\n\toffset\t\t418\n\nGetHistogramParameterivEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHistogramTargetEXT in value\n\tparam\t\tpname\t\tGetHistogramParameterPNameEXT in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_histogram\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxvendorpriv\t7\n\tglxflags\tEXT\n\textension\n\toffset\t\t419\n\nGetMinmaxEXT(target, reset, format, type, values)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMinmaxTargetEXT in value\n\tparam\t\treset\t\tBoolean in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tvalues\t\tVoid out array [COMPSIZE(target/format/type)]\n\tcategory\tEXT_histogram\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxvendorpriv\t8\n\textension\n\toffset\t\t420\n\nGetMinmaxParameterfvEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMinmaxTargetEXT in value\n\tparam\t\tpname\t\tGetMinmaxParameterPNameEXT in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_histogram\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxvendorpriv\t9\n\tglxflags\tEXT\n\textension\n\toffset\t\t421\n\nGetMinmaxParameterivEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMinmaxTargetEXT in value\n\tparam\t\tpname\t\tGetMinmaxParameterPNameEXT in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_histogram\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxvendorpriv\t10\n\tglxflags\tEXT\n\textension\n\toffset\t\t422\n\nHistogramEXT(target, width, internalformat, sink)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHistogramTargetEXT in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tsink\t\tBoolean in value\n\tcategory\tEXT_histogram\n\tversion\t\t1.0\n\tglxropcode\t4110\n\tglxflags\tEXT\n\textension\n\talias\t\tHistogram\n\nMinmaxEXT(target, internalformat, sink)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMinmaxTargetEXT in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tsink\t\tBoolean in value\n\tcategory\tEXT_histogram\n\tversion\t\t1.0\n\tglxropcode\t4111\n\tglxflags\tEXT\n\textension\n\talias\t\tMinmax\n\nResetHistogramEXT(target)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHistogramTargetEXT in value\n\tcategory\tEXT_histogram\n\tversion\t\t1.0\n\tglxropcode\t4112\n\tglxflags\tEXT\n\textension\n\talias\t\tResetHistogram\n\nResetMinmaxEXT(target)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tMinmaxTargetEXT in value\n\tcategory\tEXT_histogram\n\tversion\t\t1.0\n\tglxropcode\t4113\n\tglxflags\tEXT\n\textension\n\talias\t\tResetMinmax\n\n###############################################################################\n#\n# Extension #12\n# EXT_convolution commands\n#\n###############################################################################\n\nConvolutionFilter1DEXT(target, internalformat, width, format, type, image)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTargetEXT in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\timage\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tEXT_convolution\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxropcode\t4101\n\textension\n\talias\t\tConvolutionFilter1D\n\nConvolutionFilter2DEXT(target, internalformat, width, height, format, type, image)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTargetEXT in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\timage\t\tVoid in array [COMPSIZE(format/type/width/height)]\n\tcategory\tEXT_convolution\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxropcode\t4102\n\textension\n\talias\t\tConvolutionFilter2D\n\nConvolutionParameterfEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTargetEXT in value\n\tparam\t\tpname\t\tConvolutionParameterEXT in value\n\tparam\t\tparams\t\tCheckedFloat32 in value\n\tcategory\tEXT_convolution\n\tversion\t\t1.0\n\tglxropcode\t4103\n\tglxflags\tEXT\n\textension\n\talias\t\tConvolutionParameterf\n\nConvolutionParameterfvEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTargetEXT in value\n\tparam\t\tpname\t\tConvolutionParameterEXT in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_convolution\n\tversion\t\t1.0\n\tglxropcode\t4104\n\tglxflags\tEXT\n\textension\n\talias\t\tConvolutionParameterfv\n\nConvolutionParameteriEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTargetEXT in value\n\tparam\t\tpname\t\tConvolutionParameterEXT in value\n\tparam\t\tparams\t\tCheckedInt32 in value\n\tcategory\tEXT_convolution\n\tversion\t\t1.0\n\tglxropcode\t4105\n\tglxflags\tEXT\n\textension\n\talias\t\tConvolutionParameteri\n\nConvolutionParameterivEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTargetEXT in value\n\tparam\t\tpname\t\tConvolutionParameterEXT in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_convolution\n\tversion\t\t1.0\n\tglxropcode\t4106\n\tglxflags\tEXT\n\textension\n\talias\t\tConvolutionParameteriv\n\nCopyConvolutionFilter1DEXT(target, internalformat, x, y, width)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTargetEXT in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tcategory\tEXT_convolution\n\tversion\t\t1.0\n\tglxropcode\t4107\n\tglxflags\tEXT\n\textension\n\talias\t\tCopyConvolutionFilter1D\n\nCopyConvolutionFilter2DEXT(target, internalformat, x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTargetEXT in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_convolution\n\tversion\t\t1.0\n\tglxropcode\t4108\n\tglxflags\tEXT\n\textension\n\talias\t\tCopyConvolutionFilter2D\n\nGetConvolutionFilterEXT(target, format, type, image)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTargetEXT in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\timage\t\tVoid out array [COMPSIZE(target/format/type)]\n\tcategory\tEXT_convolution\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxvendorpriv\t1\n\textension\n\toffset\t\t423\n\nGetConvolutionParameterfvEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTargetEXT in value\n\tparam\t\tpname\t\tConvolutionParameterEXT in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_convolution\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxvendorpriv\t2\n\tglxflags\tEXT\n\textension\n\toffset\t\t424\n\nGetConvolutionParameterivEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tConvolutionTargetEXT in value\n\tparam\t\tpname\t\tConvolutionParameterEXT in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_convolution\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxvendorpriv\t3\n\tglxflags\tEXT\n\textension\n\toffset\t\t425\n\nGetSeparableFilterEXT(target, format, type, row, column, span)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tSeparableTargetEXT in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\trow\t\tVoid out array [COMPSIZE(target/format/type)]\n\tparam\t\tcolumn\t\tVoid out array [COMPSIZE(target/format/type)]\n\tparam\t\tspan\t\tVoid out array [COMPSIZE(target/format/type)]\n\tcategory\tEXT_convolution\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxvendorpriv\t4\n\textension\n\toffset\t\t426\n\nSeparableFilter2DEXT(target, internalformat, width, height, format, type, row, column)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tSeparableTargetEXT in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\trow\t\tVoid in array [COMPSIZE(target/format/type/width)]\n\tparam\t\tcolumn\t\tVoid in array [COMPSIZE(target/format/type/height)]\n\tcategory\tEXT_convolution\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxropcode\t4109\n\textension\n\talias\t\tSeparableFilter2D\n\n###############################################################################\n#\n# Extension #13\n# SGI_color_matrix commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGI_color_matrix\n\n###############################################################################\n#\n# Extension #14\n# SGI_color_table commands\n#\n###############################################################################\n\nColorTableSGI(target, internalformat, width, format, type, table)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTargetSGI in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\ttable\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tSGI_color_table\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode SGI\n\tversion\t\t1.0\n\tglxropcode\t2053\n\textension\n\talias\t\tColorTable\n\nColorTableParameterfvSGI(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTargetSGI in value\n\tparam\t\tpname\t\tColorTableParameterPNameSGI in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tSGI_color_table\n\tversion\t\t1.0\n\tglxropcode\t2054\n\tglxflags\tSGI\n\textension\n\talias\t\tColorTableParameterfv\n\nColorTableParameterivSGI(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTargetSGI in value\n\tparam\t\tpname\t\tColorTableParameterPNameSGI in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tSGI_color_table\n\tversion\t\t1.0\n\tglxropcode\t2055\n\tglxflags\tSGI\n\textension\n\talias\t\tColorTableParameteriv\n\nCopyColorTableSGI(target, internalformat, x, y, width)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTargetSGI in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tcategory\tSGI_color_table\n\tversion\t\t1.0\n\tglxropcode\t2056\n\tglxflags\tSGI\n\textension\n\talias\t\tCopyColorTable\n\nGetColorTableSGI(target, format, type, table)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTargetSGI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\ttable\t\tVoid out array [COMPSIZE(target/format/type)]\n\tcategory\tSGI_color_table\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode SGI\n\tversion\t\t1.0\n\tglxvendorpriv\t4098\n\textension\n\toffset\t\t427\n\nGetColorTableParameterfvSGI(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTargetSGI in value\n\tparam\t\tpname\t\tGetColorTableParameterPNameSGI in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tSGI_color_table\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxvendorpriv\t4099\n\textension\n\toffset\t\t428\n\nGetColorTableParameterivSGI(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTargetSGI in value\n\tparam\t\tpname\t\tGetColorTableParameterPNameSGI in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tSGI_color_table\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxvendorpriv\t4100\n\textension\n\toffset\t\t429\n\n###############################################################################\n#\n# Extension #15\n# SGIX_pixel_texture commands\n#\n###############################################################################\n\nPixelTexGenSGIX(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tPixelTexGenModeSGIX in value\n\tcategory\tSGIX_pixel_texture\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxropcode\t2059\n\textension\n\toffset\t\t430\n\n###############################################################################\n#\n# Extension #15 (variant)\n# SGIS_pixel_texture commands\n# Both SGIS and SGIX forms have extension #15!\n#\n###############################################################################\n\nPixelTexGenParameteriSGIS(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPixelTexGenParameterNameSGIS in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tSGIS_pixel_texture\n\tversion\t\t1.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t431\n\nPixelTexGenParameterivSGIS(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPixelTexGenParameterNameSGIS in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tSGIS_pixel_texture\n\tversion\t\t1.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t432\n\nPixelTexGenParameterfSGIS(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPixelTexGenParameterNameSGIS in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tSGIS_pixel_texture\n\tversion\t\t1.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t433\n\nPixelTexGenParameterfvSGIS(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPixelTexGenParameterNameSGIS in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tSGIS_pixel_texture\n\tversion\t\t1.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t434\n\nGetPixelTexGenParameterivSGIS(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPixelTexGenParameterNameSGIS in value\n\tparam\t\tparams\t\tCheckedInt32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tSGIS_pixel_texture\n\tversion\t\t1.0\n\textension\n\tglxvendorpriv\t?\n\tglxflags\tignore\n\toffset\t\t435\n\nGetPixelTexGenParameterfvSGIS(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPixelTexGenParameterNameSGIS in value\n\tparam\t\tparams\t\tCheckedFloat32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tSGIS_pixel_texture\n\tversion\t\t1.0\n\textension\n\tglxvendorpriv\t?\n\tglxflags\tignore\n\toffset\t\t436\n\n###############################################################################\n#\n# Extension #16\n# SGIS_texture4D commands\n#\n###############################################################################\n\nTexImage4DSGIS(target, level, internalformat, width, height, depth, size4d, border, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tsize4d\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height/depth/size4d)]\n\tcategory\tSGIS_texture4D\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode SGI\n\tversion\t\t1.0\n\tglxropcode\t2057\n\textension\n\toffset\t\t437\n\nTexSubImage4DSGIS(target, level, xoffset, yoffset, zoffset, woffset, width, height, depth, size4d, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\twoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tsize4d\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height/depth/size4d)]\n\tcategory\tSGIS_texture4D\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode SGI\n\tversion\t\t1.0\n\tglxropcode\t2058\n\textension\n\toffset\t\t438\n\n###############################################################################\n#\n# Extension #17\n# SGI_texture_color_table commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGI_texture_color_table\n\n###############################################################################\n#\n# Extension #18\n# EXT_cmyka commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_cmyka\n\n###############################################################################\n#\n# Extension #19 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #20\n# EXT_texture_object commands\n#\n###############################################################################\n\nAreTexturesResidentEXT(n, textures, residences)\n\treturn\t\tBoolean\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\ttextures\tTexture in array [n]\n\tparam\t\tresidences\tBoolean out array [n]\n\tcategory\tEXT_texture_object\n\tglxflags\tEXT\n\tglxvendorpriv\t11\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\textension\n\toffset\t\t439\n\nBindTextureEXT(target, texture)\n\treturn\t\tvoid\n\tparam\t\ttarget\tTextureTarget in value\n\tparam\t\ttexture Texture in value\n\tcategory\tEXT_texture_object\n\tversion\t\t1.0\n\tglxflags\tEXT\n\tglxropcode\t4117\n\textension\n\talias\t\tBindTexture\n\nDeleteTexturesEXT(n, textures)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\ttextures\tTexture in array [n]\n\tcategory\tEXT_texture_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxflags\tEXT\n\tglxvendorpriv\t12\n\textension\n\toffset\t\t561\n\nGenTexturesEXT(n, textures)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\ttextures\tTexture out array [n]\n\tcategory\tEXT_texture_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxflags\tEXT\n\tglxvendorpriv\t13\n\textension\n\toffset\t\t440\n\nIsTextureEXT(texture)\n\treturn\t\tBoolean\n\tparam\t\ttexture Texture in value\n\tcategory\tEXT_texture_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxflags\tEXT\n\tglxvendorpriv\t14\n\textension\n\toffset\t\t441\n\nPrioritizeTexturesEXT(n, textures, priorities)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\ttextures\tTexture in array [n]\n\tparam\t\tpriorities\tClampedFloat32 in array [n]\n\tcategory\tEXT_texture_object\n\tglxflags\tEXT\n\tversion\t\t1.0\n\tglxropcode\t4118\n\textension\n\talias\t\tPrioritizeTextures\n\n###############################################################################\n#\n# Extension #21\n# SGIS_detail_texture commands\n#\n###############################################################################\n\nDetailTexFuncSGIS(target, n, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tpoints\t\tFloat32 in array [n*2]\n\tcategory\tSGIS_detail_texture\n\tglxflags\tSGI\n\tversion\t\t1.0\n\tglxropcode\t2051\n\textension\n\toffset\t\t442\n\nGetDetailTexFuncSGIS(target, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpoints\t\tFloat32 out array [COMPSIZE(target)]\n\tcategory\tSGIS_detail_texture\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxvendorpriv\t4096\n\textension\n\toffset\t\t443\n\n###############################################################################\n#\n# Extension #22\n# SGIS_sharpen_texture commands\n#\n###############################################################################\n\nSharpenTexFuncSGIS(target, n, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tpoints\t\tFloat32 in array [n*2]\n\tcategory\tSGIS_sharpen_texture\n\tglxflags\tSGI\n\tversion\t\t1.0\n\tglxropcode\t2052\n\textension\n\toffset\t\t444\n\nGetSharpenTexFuncSGIS(target, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpoints\t\tFloat32 out array [COMPSIZE(target)]\n\tcategory\tSGIS_sharpen_texture\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxvendorpriv\t4097\n\textension\n\toffset\t\t445\n\n###############################################################################\n#\n# EXT_packed_pixels commands\n# Extension #23\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_packed_pixels\n\n###############################################################################\n#\n# Extension #24\n# SGIS_texture_lod commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIS_texture_lod\n\n###############################################################################\n#\n# Extension #25\n# SGIS_multisample commands\n#\n###############################################################################\n\nSampleMaskSGIS(value, invert)\n\treturn\t\tvoid\n\tparam\t\tvalue\t\tClampedFloat32 in value\n\tparam\t\tinvert\t\tBoolean in value\n\tcategory\tSGIS_multisample\n\tversion\t\t1.1\n\tglxropcode\t2048\n\tglxflags\tSGI\n\textension\n\talias\t\tSampleMaskEXT\n\nSamplePatternSGIS(pattern)\n\treturn\t\tvoid\n\tparam\t\tpattern\t\tSamplePatternSGIS in value\n\tcategory\tSGIS_multisample\n\tversion\t\t1.0\n\tglxropcode\t2049\n\tglxflags\tSGI\n\textension\n\talias\t\tSamplePatternEXT\n\n###############################################################################\n#\n# Extension #26 - no specification?\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #27\n# EXT_rescale_normal commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_rescale_normal\n\n###############################################################################\n#\n# Extension #28 - GLX_EXT_visual_info\n# Extension #29 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #30\n# EXT_vertex_array commands\n#\n###############################################################################\n\nArrayElementEXT(i)\n\treturn\t\tvoid\n\tparam\t\ti\t\tInt32 in value\n\tcategory\tEXT_vertex_array\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\textension\n\talias\t\tArrayElement\n\nColorPointerEXT(size, type, stride, count, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tColorPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride/count)] retained\n\tcategory\tEXT_vertex_array\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\textension\n\toffset\t\t448\n\nDrawArraysEXT(mode, first, count)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tfirst\t\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tcategory\tEXT_vertex_array\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\tglxropcode\t4116\n\textension\n\talias\t\tDrawArrays\n\nEdgeFlagPointerEXT(stride, count, pointer)\n\treturn\t\tvoid\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tpointer\t\tBoolean in array [COMPSIZE(stride/count)] retained\n\tcategory\tEXT_vertex_array\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\textension\n\toffset\t\t449\n\nGetPointervEXT(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGetPointervPName in value\n\tparam\t\tparams\t\tVoidPointer out array [1]\n\tcategory\tEXT_vertex_array\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\textension\n\talias\t\tGetPointerv\n\nIndexPointerEXT(type, stride, count, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tIndexPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type/stride/count)] retained\n\tcategory\tEXT_vertex_array\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\textension\n\toffset\t\t450\n\nNormalPointerEXT(type, stride, count, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tNormalPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type/stride/count)] retained\n\tcategory\tEXT_vertex_array\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\textension\n\toffset\t\t451\n\nTexCoordPointerEXT(size, type, stride, count, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tTexCoordPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride/count)] retained\n\tcategory\tEXT_vertex_array\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\textension\n\toffset\t\t452\n\nVertexPointerEXT(size, type, stride, count, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride/count)] retained\n\tcategory\tEXT_vertex_array\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.0\n\textension\n\toffset\t\t453\n\n###############################################################################\n#\n# Extension #31\n# EXT_misc_attribute commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_misc_attribute\n\n###############################################################################\n#\n# Extension #32\n# SGIS_generate_mipmap commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIS_generate_mipmap\n\n###############################################################################\n#\n# Extension #33\n# SGIX_clipmap commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_clipmap\n\n###############################################################################\n#\n# Extension #34\n# SGIX_shadow commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_shadow\n\n###############################################################################\n#\n# Extension #35\n# SGIS_texture_edge_clamp commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIS_texture_edge_clamp\n\n###############################################################################\n#\n# Extension #36\n# SGIS_texture_border_clamp commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIS_texture_border_clamp\n\n###############################################################################\n#\n# Extension #37\n# EXT_blend_minmax commands\n#\n###############################################################################\n\nBlendEquationEXT(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBlendEquationModeEXT in value\n\tcategory\tEXT_blend_minmax\n\tversion\t\t1.0\n\tglxropcode\t4097\n\tglxflags\tEXT\n\textension\tsoft\n\talias\t\tBlendEquation\n\n###############################################################################\n#\n# Extension #38\n# EXT_blend_subtract commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_blend_subtract\n\n###############################################################################\n#\n# Extension #39\n# EXT_blend_logic_op commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_blend_logic_op\n\n###############################################################################\n#\n# Extension #40 - GLX_SGI_swap_control\n# Extension #41 - GLX_SGI_video_sync\n# Extension #42 - GLX_SGI_make_current_read\n# Extension #43 - GLX_SGIX_video_source\n# Extension #44 - GLX_EXT_visual_rating\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #45\n# SGIX_interlace commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_interlace\n\n###############################################################################\n#\n# Extension #46\n# SGIX_pixel_tiles commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_pixel_tiles\n\n###############################################################################\n#\n# Extension #47 - GLX_EXT_import_context\n# Extension #48 - skipped\n# Extension #49 - GLX_SGIX_fbconfig\n# Extension #50 - GLX_SGIX_pbuffer\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #51\n# SGIX_texture_select commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_texture_select\n\n###############################################################################\n#\n# Extension #52\n# SGIX_sprite commands\n#\n###############################################################################\n\nSpriteParameterfSGIX(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tSpriteParameterNameSGIX in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tSGIX_sprite\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxropcode\t2060\n\textension\n\toffset\t\t454\n\nSpriteParameterfvSGIX(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tSpriteParameterNameSGIX in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tSGIX_sprite\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxropcode\t2061\n\textension\n\toffset\t\t455\n\nSpriteParameteriSGIX(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tSpriteParameterNameSGIX in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tSGIX_sprite\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxropcode\t2062\n\textension\n\toffset\t\t456\n\nSpriteParameterivSGIX(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tSpriteParameterNameSGIX in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tSGIX_sprite\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxropcode\t2063\n\textension\n\toffset\t\t457\n\n###############################################################################\n#\n# Extension #53\n# SGIX_texture_multi_buffer commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_texture_multi_buffer\n\n###############################################################################\n#\n# Extension #54\n# EXT_point_parameters / SGIS_point_parameters commands\n#\n###############################################################################\n\nPointParameterfEXT(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tEXT_point_parameters\n\tversion\t\t1.0\n\tglxflags\tSGI\n\textension\n\talias\t\tPointParameterfARB\n\nPointParameterfvEXT(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_point_parameters\n\tversion\t\t1.0\n\tglxflags\tSGI\n\textension\n\talias\t\tPointParameterfvARB\n\nPointParameterfSGIS(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tSGIS_point_parameters\n\tversion\t\t1.0\n\tglxflags\tSGI\n\textension\n\talias\t\tPointParameterfARB\n\nPointParameterfvSGIS(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tSGIS_point_parameters\n\tversion\t\t1.0\n\tglxflags\tSGI\n\textension\n\talias\t\tPointParameterfvARB\n\n###############################################################################\n#\n# Extension #55\n# SGIX_instruments commands\n#\n###############################################################################\n\nGetInstrumentsSGIX()\n\treturn\t\tInt32\n\tdlflags\t\tnotlistable\n\tcategory\tSGIX_instruments\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxvendorpriv\t4102\n\textension\n\toffset\t\t460\n\nInstrumentsBufferSGIX(size, buffer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tSizeI in value\n\tparam\t\tbuffer\t\tInt32 out array [size] retained\n\tdlflags\t\tnotlistable\n\tcategory\tSGIX_instruments\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxvendorpriv\t4103\n\textension\n\toffset\t\t461\n\nPollInstrumentsSGIX(marker_p)\n\treturn\t\tInt32\n\tparam\t\tmarker_p\tInt32 out array [1]\n\tdlflags\t\tnotlistable\n\tcategory\tSGIX_instruments\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxvendorpriv\t4104\n\textension\n\toffset\t\t462\n\nReadInstrumentsSGIX(marker)\n\treturn\t\tvoid\n\tparam\t\tmarker\t\tInt32 in value\n\tcategory\tSGIX_instruments\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxropcode\t2077\n\textension\n\toffset\t\t463\n\nStartInstrumentsSGIX()\n\treturn\t\tvoid\n\tcategory\tSGIX_instruments\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxropcode\t2069\n\textension\n\toffset\t\t464\n\nStopInstrumentsSGIX(marker)\n\treturn\t\tvoid\n\tparam\t\tmarker\t\tInt32 in value\n\tcategory\tSGIX_instruments\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxropcode\t2070\n\textension\n\toffset\t\t465\n\n###############################################################################\n#\n# Extension #56\n# SGIX_texture_scale_bias commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_texture_scale_bias\n\n###############################################################################\n#\n# Extension #57\n# SGIX_framezoom commands\n#\n###############################################################################\n\nFrameZoomSGIX(factor)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tCheckedInt32 in value\n\tcategory\tSGIX_framezoom\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxropcode\t2072\n\textension\n\toffset\t\t466\n\n###############################################################################\n#\n# Extension #58\n# SGIX_tag_sample_buffer commands\n#\n###############################################################################\n\nTagSampleBufferSGIX()\n\treturn\t\tvoid\n\tcategory\tSGIX_tag_sample_buffer\n\tversion\t\t1.0\n\tglxropcode\t2050\n\tglxflags\tSGI\n\textension\n\toffset\t\t467\n\n###############################################################################\n#\n# Extension #59\n# SGIX_polynomial_ffd commands\n#\n###############################################################################\n\nDeformationMap3dSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFfdTargetSGIX in value\n\tparam\t\tu1\t\tCoordD in value\n\tparam\t\tu2\t\tCoordD in value\n\tparam\t\tustride\t\tInt32 in value\n\tparam\t\tuorder\t\tCheckedInt32 in value\n\tparam\t\tv1\t\tCoordD in value\n\tparam\t\tv2\t\tCoordD in value\n\tparam\t\tvstride\t\tInt32 in value\n\tparam\t\tvorder\t\tCheckedInt32 in value\n\tparam\t\tw1\t\tCoordD in value\n\tparam\t\tw2\t\tCoordD in value\n\tparam\t\twstride\t\tInt32 in value\n\tparam\t\tworder\t\tCheckedInt32 in value\n\tparam\t\tpoints\t\tCoordD in array [COMPSIZE(target/ustride/uorder/vstride/vorder/wstride/worder)]\n\tdlflags\t\thandcode\n\tcategory\tSGIX_polynomial_ffd\n\tversion\t\t1.0\n\tglxflags\tSGI ignore\n\tglxropcode\t2073\n\textension\n\toffset\t\t?\n\nDeformationMap3fSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFfdTargetSGIX in value\n\tparam\t\tu1\t\tCoordF in value\n\tparam\t\tu2\t\tCoordF in value\n\tparam\t\tustride\t\tInt32 in value\n\tparam\t\tuorder\t\tCheckedInt32 in value\n\tparam\t\tv1\t\tCoordF in value\n\tparam\t\tv2\t\tCoordF in value\n\tparam\t\tvstride\t\tInt32 in value\n\tparam\t\tvorder\t\tCheckedInt32 in value\n\tparam\t\tw1\t\tCoordF in value\n\tparam\t\tw2\t\tCoordF in value\n\tparam\t\twstride\t\tInt32 in value\n\tparam\t\tworder\t\tCheckedInt32 in value\n\tparam\t\tpoints\t\tCoordF in array [COMPSIZE(target/ustride/uorder/vstride/vorder/wstride/worder)]\n\tcategory\tSGIX_polynomial_ffd\n\tdlflags\t\thandcode\n\tversion\t\t1.0\n\tglxflags\tSGI ignore\n\tglxropcode\t2074\n\textension\n\toffset\t\t?\n\nDeformSGIX(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tFfdMaskSGIX in value\n\tcategory\tSGIX_polynomial_ffd\n\tversion\t\t1.0\n\tglxflags\tSGI ignore\n\tglxropcode\t2075\n\textension\n\toffset\t\t?\n\nLoadIdentityDeformationMapSGIX(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tFfdMaskSGIX in value\n\tcategory\tSGIX_polynomial_ffd\n\tversion\t\t1.0\n\tglxflags\tSGI ignore\n\tglxropcode\t2076\n\textension\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #60\n# SGIX_reference_plane commands\n#\n###############################################################################\n\nReferencePlaneSGIX(equation)\n\treturn\t\tvoid\n\tparam\t\tequation\tFloat64 in array [4]\n\tcategory\tSGIX_reference_plane\n\tversion\t\t1.0\n\tglxflags\tSGI\n\tglxropcode\t2071\n\textension\n\toffset\t\t468\n\n###############################################################################\n#\n# Extension #61\n# SGIX_flush_raster commands\n#\n###############################################################################\n\nFlushRasterSGIX()\n\treturn\t\tvoid\n\tcategory\tSGIX_flush_raster\n\tversion\t\t1.0\n\tdlflags\t\tnotlistable\n\tglxflags\tSGI\n\tglxvendorpriv\t4105\n\textension\n\toffset\t\t469\n\n###############################################################################\n#\n# Extension #62 - GLX_SGIX_cushion\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #63\n# SGIX_depth_texture commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_depth_texture\n\n###############################################################################\n#\n# Extension #64\n# SGIS_fog_function commands\n#\n###############################################################################\n\nFogFuncSGIS(n, points)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tpoints\t\tFloat32 in array [n*2]\n\tcategory\tSGIS_fog_function\n\tversion\t\t1.1\n\tglxflags\tSGI\n\tglxropcode\t2067\n\textension\n\toffset\n\n# Need to insert GLX information\nGetFogFuncSGIS(points)\n\treturn\t\tvoid\n\tparam\t\tpoints\t\tFloat32 out array [COMPSIZE()]\n\tcategory\tSGIS_fog_function\n\tversion\t\t1.1\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\textension\n\toffset\n\n###############################################################################\n#\n# Extension #65\n# SGIX_fog_offset commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_fog_offset\n\n###############################################################################\n#\n# Extension #66\n# HP_image_transform commands\n#\n###############################################################################\n\nImageTransformParameteriHP(target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tImageTransformTargetHP in value\n\tparam\t\tpname\t\tImageTransformPNameHP in value\n\tparam\t\tparam\t\tInt32 in value\n\tcategory\tHP_image_transform\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nImageTransformParameterfHP(target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tImageTransformTargetHP in value\n\tparam\t\tpname\t\tImageTransformPNameHP in value\n\tparam\t\tparam\t\tFloat32 in value\n\tcategory\tHP_image_transform\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nImageTransformParameterivHP(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tImageTransformTargetHP in value\n\tparam\t\tpname\t\tImageTransformPNameHP in value\n\tparam\t\tparams\t\tInt32 in array [COMPSIZE(pname)]\n\tcategory\tHP_image_transform\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nImageTransformParameterfvHP(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tImageTransformTargetHP in value\n\tparam\t\tpname\t\tImageTransformPNameHP in value\n\tparam\t\tparams\t\tFloat32 in array [COMPSIZE(pname)]\n\tcategory\tHP_image_transform\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nGetImageTransformParameterivHP(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tImageTransformTargetHP in value\n\tparam\t\tpname\t\tImageTransformPNameHP in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tHP_image_transform\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nGetImageTransformParameterfvHP(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tImageTransformTargetHP in value\n\tparam\t\tpname\t\tImageTransformPNameHP in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tHP_image_transform\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #67\n# HP_convolution_border_modes commands\n#\n###############################################################################\n\n# (none)\nnewcategory: HP_convolution_border_modes\n\n###############################################################################\n#\n# Extension #68\n# INGR_palette_buffer commands\n#\n###############################################################################\n\n#@ (Intergraph hasn't provided a spec)\n\n###############################################################################\n#\n# Extension #69\n# SGIX_texture_add_env commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_texture_add_env\n\n###############################################################################\n#\n# Extension #70 - skipped\n# Extension #71 - skipped\n# Extension #72 - skipped\n# Extension #73 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #74\n# EXT_color_subtable commands\n#\n# This was probably never actually shipped as an EXT - just written up as a\n# reference for OpenGL 1.2 ARB_imaging.\n#\n###############################################################################\n\nColorSubTableEXT(target, start, count, format, type, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tstart\t\tSizeI in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tdata\t\tVoid in array [COMPSIZE(format/type/count)]\n\tcategory\tEXT_color_subtable\n\tversion\t\t1.2\n\talias\t\tColorSubTable\n\nCopyColorSubTableEXT(target, start, x, y, width)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tstart\t\tSizeI in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tcategory\tEXT_color_subtable\n\tversion\t\t1.2\n\talias\t\tCopyColorSubTable\n\n###############################################################################\n#\n# Extension #75 - GLU_EXT_object_space_tess\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #76\n# PGI_vertex_hints commands\n#\n###############################################################################\n\n# (none)\nnewcategory: PGI_vertex_hints\n\n###############################################################################\n#\n# Extension #77\n# PGI_misc_hints commands\n#\n###############################################################################\n\nHintPGI(target, mode)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tHintTargetPGI in value\n\tparam\t\tmode\t\tInt32 in value\n\tcategory\tPGI_misc_hints\n\tversion\t\t1.1\n\toffset\t\t544\n\n###############################################################################\n#\n# Extension #78\n# EXT_paletted_texture commands\n#\n###############################################################################\n\nColorTableEXT(target, internalFormat, width, format, type, table)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tinternalFormat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\ttable\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tEXT_paletted_texture\n\tversion\t\t1.1\n\talias\t\tColorTable\n\nGetColorTableEXT(target, format, type, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tdata\t\tVoid out array [COMPSIZE(target/format/type)]\n\tcategory\tEXT_paletted_texture\n\tversion\t\t1.1\n\toffset\t\t550\n\nGetColorTableParameterivEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tpname\t\tGetColorTableParameterPName in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_paletted_texture\n\tversion\t\t1.1\n\toffset\t\t551\n\nGetColorTableParameterfvEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tColorTableTarget in value\n\tparam\t\tpname\t\tGetColorTableParameterPName in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_paletted_texture\n\tversion\t\t1.1\n\toffset\t\t552\n\n###############################################################################\n#\n# Extension #79\n# EXT_clip_volume_hint commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_clip_volume_hint\n\n###############################################################################\n#\n# Extension #80\n# SGIX_list_priority commands\n#\n###############################################################################\n\n# @@@ Needs vendorpriv opcodes assigned\nGetListParameterfvSGIX(list, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlist\t\tList in value\n\tparam\t\tpname\t\tListParameterName in value\n\tparam\t\tparams\t\tCheckedFloat32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tcategory\tSGIX_list_priority\n\tversion\t\t1.0\n\tglxvendorpriv\t?\n\textension\n\toffset\t\t470\n\n# @@@ Needs vendorpriv opcodes assigned\nGetListParameterivSGIX(list, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlist\t\tList in value\n\tparam\t\tpname\t\tListParameterName in value\n\tparam\t\tparams\t\tCheckedInt32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tcategory\tSGIX_list_priority\n\tversion\t\t1.0\n\tglxvendorpriv\t?\n\textension\n\toffset\t\t471\n\nListParameterfSGIX(list, pname, param)\n\treturn\t\tvoid\n\tparam\t\tlist\t\tList in value\n\tparam\t\tpname\t\tListParameterName in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tcategory\tSGIX_list_priority\n\tversion\t\t1.0\n\tglxropcode\t2078\n\textension\n\toffset\t\t472\n\nListParameterfvSGIX(list, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlist\t\tList in value\n\tparam\t\tpname\t\tListParameterName in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tcategory\tSGIX_list_priority\n\tversion\t\t1.0\n\tglxropcode\t2079\n\textension\n\toffset\t\t473\n\nListParameteriSGIX(list, pname, param)\n\treturn\t\tvoid\n\tparam\t\tlist\t\tList in value\n\tparam\t\tpname\t\tListParameterName in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tcategory\tSGIX_list_priority\n\tversion\t\t1.0\n\tglxropcode\t2080\n\textension\n\toffset\t\t474\n\nListParameterivSGIX(list, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlist\t\tList in value\n\tparam\t\tpname\t\tListParameterName in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tcategory\tSGIX_list_priority\n\tversion\t\t1.0\n\tglxropcode\t2081\n\textension\n\toffset\t\t475\n\n###############################################################################\n#\n# Extension #81\n# SGIX_ir_instrument1 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_ir_instrument1\n\n###############################################################################\n#\n# Extension #82\n# SGIX_calligraphic_fragment commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_calligraphic_fragment\n\n###############################################################################\n#\n# Extension #83 - GLX_SGIX_video_resize\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #84\n# SGIX_texture_lod_bias commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_texture_lod_bias\n\n###############################################################################\n#\n# Extension #85 - skipped\n# Extension #86 - GLX_SGIX_dmbuffer\n# Extension #87 - skipped\n# Extension #88 - skipped\n# Extension #89 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #90\n# SGIX_shadow_ambient commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_shadow_ambient\n\n###############################################################################\n#\n# Extension #91 - GLX_SGIX_swap_group\n# Extension #92 - GLX_SGIX_swap_barrier\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #93\n# EXT_index_texture commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_index_texture\n\n###############################################################################\n#\n# Extension #94\n# EXT_index_material commands\n#\n###############################################################################\n\nIndexMaterialEXT(face, mode)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tmode\t\tIndexMaterialParameterEXT in value\n\tcategory\tEXT_index_material\n\tversion\t\t1.1\n\textension\tsoft\n\tglxflags\tignore\n\toffset\t\t538\n\n###############################################################################\n#\n# Extension #95\n# EXT_index_func commands\n#\n###############################################################################\n\nIndexFuncEXT(func, ref)\n\treturn\t\tvoid\n\tparam\t\tfunc\t\tIndexFunctionEXT in value\n\tparam\t\tref\t\tClampedFloat32 in value\n\tcategory\tEXT_index_func\n\tversion\t\t1.1\n\textension\tsoft\n\tglxflags\tignore\n\toffset\t\t539\n\n###############################################################################\n#\n# Extension #96\n# EXT_index_array_formats commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_index_array_formats\n\n###############################################################################\n#\n# Extension #97\n# EXT_compiled_vertex_array commands\n#\n###############################################################################\n\nLockArraysEXT(first, count)\n\treturn\t\tvoid\n\tparam\t\tfirst\t\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tcategory\tEXT_compiled_vertex_array\n\tversion\t\t1.1\n\tdlflags\t\tnotlistable\n\textension\tsoft\n\tglxflags\tignore\n\toffset\t\t540\n\nUnlockArraysEXT()\n\treturn\t\tvoid\n\tcategory\tEXT_compiled_vertex_array\n\tversion\t\t1.1\n\tdlflags\t\tnotlistable\n\textension\tsoft\n\tglxflags\tignore\n\toffset\t\t541\n\n###############################################################################\n#\n# Extension #98\n# EXT_cull_vertex commands\n#\n###############################################################################\n\nCullParameterdvEXT(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tCullParameterEXT in value\n\tparam\t\tparams\t\tFloat64 out array [4]\n\tcategory\tEXT_cull_vertex\n\tversion\t\t1.1\n\tdlflags\t\tnotlistable\n\textension\tsoft\n\tglxflags\tignore\n\toffset\t\t542\n\nCullParameterfvEXT(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tCullParameterEXT in value\n\tparam\t\tparams\t\tFloat32 out array [4]\n\tcategory\tEXT_cull_vertex\n\tversion\t\t1.1\n\tdlflags\t\tnotlistable\n\textension\tsoft\n\tglxflags\tignore\n\toffset\t\t543\n\n###############################################################################\n#\n# Extension #99 - skipped\n# Extension #100 - GLU_EXT_nurbs_tessellator\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #101\n# SGIX_ycrcb commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_ycrcb\n\n###############################################################################\n#\n# Extension #102\n# SGIX_fragment_lighting commands\n#\n###############################################################################\n\nFragmentColorMaterialSGIX(face, mode)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tmode\t\tMaterialParameter in value\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t476\n\nFragmentLightfSGIX(light, pname, param)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tFragmentLightNameSGIX in value\n\tparam\t\tpname\t\tFragmentLightParameterSGIX in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t477\n\nFragmentLightfvSGIX(light, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tFragmentLightNameSGIX in value\n\tparam\t\tpname\t\tFragmentLightParameterSGIX in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t478\n\nFragmentLightiSGIX(light, pname, param)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tFragmentLightNameSGIX in value\n\tparam\t\tpname\t\tFragmentLightParameterSGIX in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t479\n\nFragmentLightivSGIX(light, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tFragmentLightNameSGIX in value\n\tparam\t\tpname\t\tFragmentLightParameterSGIX in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t480\n\nFragmentLightModelfSGIX(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tFragmentLightModelParameterSGIX in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t481\n\nFragmentLightModelfvSGIX(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tFragmentLightModelParameterSGIX in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t482\n\nFragmentLightModeliSGIX(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tFragmentLightModelParameterSGIX in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t483\n\nFragmentLightModelivSGIX(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tFragmentLightModelParameterSGIX in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t484\n\nFragmentMaterialfSGIX(face, pname, param)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t485\n\nFragmentMaterialfvSGIX(face, pname, params)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t486\n\nFragmentMaterialiSGIX(face, pname, param)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t487\n\nFragmentMaterialivSGIX(face, pname, params)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t488\n\nGetFragmentLightfvSGIX(light, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tFragmentLightNameSGIX in value\n\tparam\t\tpname\t\tFragmentLightParameterSGIX in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tSGIX_fragment_lighting\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t489\n\nGetFragmentLightivSGIX(light, pname, params)\n\treturn\t\tvoid\n\tparam\t\tlight\t\tFragmentLightNameSGIX in value\n\tparam\t\tpname\t\tFragmentLightParameterSGIX in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tSGIX_fragment_lighting\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t490\n\nGetFragmentMaterialfvSGIX(face, pname, params)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tSGIX_fragment_lighting\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t491\n\nGetFragmentMaterialivSGIX(face, pname, params)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tpname\t\tMaterialParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tSGIX_fragment_lighting\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t492\n\nLightEnviSGIX(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tLightEnvParameterSGIX in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tSGIX_fragment_lighting\n\tglxflags\tignore\n\tversion\t\t1.0\n\textension\n\toffset\t\t493\n\n###############################################################################\n#\n# Extension #103 - skipped\n# Extension #104 - skipped\n# Extension #105 - skipped\n# Extension #106 - skipped\n# Extension #107 - skipped\n# Extension #108 - skipped\n# Extension #109 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #110\n# IBM_rasterpos_clip commands\n#\n###############################################################################\n\n# (none)\nnewcategory: IBM_rasterpos_clip\n\n###############################################################################\n#\n# Extension #111\n# HP_texture_lighting commands\n#\n###############################################################################\n\n# (none)\nnewcategory: HP_texture_lighting\n\n###############################################################################\n#\n# Extension #112\n# EXT_draw_range_elements commands\n#\n###############################################################################\n\n# Spec entries to be written\nDrawRangeElementsEXT(mode, start, end, count, type, indices)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tstart\t\tUInt32 in value\n\tparam\t\tend\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoid in array [COMPSIZE(count/type)]\n\tcategory\tEXT_draw_range_elements\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\talias\t\tDrawRangeElements\n\n###############################################################################\n#\n# Extension #113\n# WIN_phong_shading commands\n#\n###############################################################################\n\n# (none)\nnewcategory: WIN_phong_shading\n\n###############################################################################\n#\n# Extension #114\n# WIN_specular_fog commands\n#\n###############################################################################\n\n# (none)\nnewcategory: WIN_specular_fog\n\n###############################################################################\n#\n# Extension #115 - skipped\n# Extension #116 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #117\n# EXT_light_texture commands\n#\n###############################################################################\n\n# Spec entries to be written\nApplyTextureEXT(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tLightTextureModeEXT in value\n\tcategory\tEXT_light_texture\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTextureLightEXT(pname)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tLightTexturePNameEXT in value\n\tcategory\tEXT_light_texture\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTextureMaterialEXT(face, mode)\n\treturn\t\tvoid\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tmode\t\tMaterialParameter in value\n\tcategory\tEXT_light_texture\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #118 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #119\n# SGIX_blend_alpha_minmax commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_blend_alpha_minmax\n\n###############################################################################\n#\n# Extension #120 - skipped\n# Extension #121 - skipped\n# Extension #122 - skipped\n# Extension #123 - skipped\n# Extension #124 - skipped\n# Extension #125 - skipped\n# Extension #126 - skipped\n# Extension #127 - skipped\n# Extension #128 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #129\n# EXT_bgra commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_bgra\n\n###############################################################################\n#\n# Extension #130 - skipped\n# Extension #131 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #132\n# SGIX_async commands\n#\n###############################################################################\n\nAsyncMarkerSGIX(marker)\n\treturn\t\tvoid\n\tparam\t\tmarker\t\tUInt32 in value\n\tcategory\tSGIX_async\n\tversion\t\t1.0\n\tglxflags\tignore\n\textension\n\toffset\t\t?\n\nFinishAsyncSGIX(markerp)\n\treturn\t\tInt32\n\tparam\t\tmarkerp\t\tUInt32 out array [1]\n\tcategory\tSGIX_async\n\tversion\t\t1.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\textension\n\toffset\t\t?\n\nPollAsyncSGIX(markerp)\n\treturn\t\tInt32\n\tparam\t\tmarkerp\t\tUInt32 out array [1]\n\tcategory\tSGIX_async\n\tversion\t\t1.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\textension\n\toffset\t\t?\n\nGenAsyncMarkersSGIX(range)\n\treturn\t\tUInt32\n\tparam\t\trange\t\tSizeI in value\n\tcategory\tSGIX_async\n\tversion\t\t1.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\textension\n\toffset\t\t?\n\nDeleteAsyncMarkersSGIX(marker, range)\n\treturn\t\tvoid\n\tparam\t\tmarker\t\tUInt32 in value\n\tparam\t\trange\t\tSizeI in value\n\tcategory\tSGIX_async\n\tversion\t\t1.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\textension\n\toffset\t\t?\n\nIsAsyncMarkerSGIX(marker)\n\treturn\t\tBoolean\n\tparam\t\tmarker\t\tUInt32 in value\n\tcategory\tSGIX_async\n\tversion\t\t1.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\textension\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #133\n# SGIX_async_pixel commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_async_pixel\n\n###############################################################################\n#\n# Extension #134\n# SGIX_async_histogram commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_async_histogram\n\n###############################################################################\n#\n# Extension #135 - skipped (INTEL_texture_scissor was never implemented)\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #136\n# INTEL_parallel_arrays commands\n#\n###############################################################################\n\nVertexPointervINTEL(size, type, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexPointerType in value\n\tparam\t\tpointer\t\tVoidPointer in array [4] retained\n\tcategory\tINTEL_parallel_arrays\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nNormalPointervINTEL(type, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tNormalPointerType in value\n\tparam\t\tpointer\t\tVoidPointer in array [4] retained\n\tcategory\tINTEL_parallel_arrays\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nColorPointervINTEL(size, type, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexPointerType in value\n\tparam\t\tpointer\t\tVoidPointer in array [4] retained\n\tcategory\tINTEL_parallel_arrays\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nTexCoordPointervINTEL(size, type, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexPointerType in value\n\tparam\t\tpointer\t\tVoidPointer in array [4] retained\n\tcategory\tINTEL_parallel_arrays\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.1\n\toffset\t\t?\n\n\n###############################################################################\n#\n# Extension #137\n# HP_occlusion_test commands\n#\n###############################################################################\n\n# (none)\nnewcategory: HP_occlusion_test\n\n###############################################################################\n#\n# Extension #138\n# EXT_pixel_transform commands\n#\n###############################################################################\n\nPixelTransformParameteriEXT(target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tPixelTransformTargetEXT in value\n\tparam\t\tpname\t\tPixelTransformPNameEXT in value\n\tparam\t\tparam\t\tInt32 in value\n\tcategory\tEXT_pixel_transform\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nPixelTransformParameterfEXT(target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tPixelTransformTargetEXT in value\n\tparam\t\tpname\t\tPixelTransformPNameEXT in value\n\tparam\t\tparam\t\tFloat32 in value\n\tcategory\tEXT_pixel_transform\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nPixelTransformParameterivEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tPixelTransformTargetEXT in value\n\tparam\t\tpname\t\tPixelTransformPNameEXT in value\n\tparam\t\tparams\t\tInt32 in array [1]\n\tcategory\tEXT_pixel_transform\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nPixelTransformParameterfvEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tPixelTransformTargetEXT in value\n\tparam\t\tpname\t\tPixelTransformPNameEXT in value\n\tparam\t\tparams\t\tFloat32 in array [1]\n\tcategory\tEXT_pixel_transform\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #139\n# EXT_pixel_transform_color_table commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_pixel_transform_color_table\n\n###############################################################################\n#\n# Extension #140 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #141\n# EXT_shared_texture_palette commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_shared_texture_palette\n\n###############################################################################\n#\n# Extension #142 - GLX_SGIS_blended_overlay\n# Extension #143 - GLX_SGIS_shared_multisample\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #144\n# EXT_separate_specular_color commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_separate_specular_color\n\n###############################################################################\n#\n# Extension #145\n# EXT_secondary_color commands\n#\n###############################################################################\n\nSecondaryColor3bEXT(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorB in value\n\tparam\t\tgreen\t\tColorB in value\n\tparam\t\tblue\t\tColorB in value\n\tcategory\tEXT_secondary_color\n\tvectorequiv\tSecondaryColor3bvEXT\n\tversion\t\t1.1\n\talias\t\tSecondaryColor3b\n\nSecondaryColor3bvEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorB in array [3]\n\tcategory\tEXT_secondary_color\n\tversion\t\t1.1\n\tglxropcode\t4126\n\talias\t\tSecondaryColor3bv\n\nSecondaryColor3dEXT(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorD in value\n\tparam\t\tgreen\t\tColorD in value\n\tparam\t\tblue\t\tColorD in value\n\tcategory\tEXT_secondary_color\n\tvectorequiv\tSecondaryColor3dvEXT\n\tversion\t\t1.1\n\talias\t\tSecondaryColor3d\n\nSecondaryColor3dvEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorD in array [3]\n\tcategory\tEXT_secondary_color\n\tversion\t\t1.1\n\tglxropcode\t4130\n\talias\t\tSecondaryColor3dv\n\nSecondaryColor3fEXT(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorF in value\n\tparam\t\tgreen\t\tColorF in value\n\tparam\t\tblue\t\tColorF in value\n\tcategory\tEXT_secondary_color\n\tvectorequiv\tSecondaryColor3fvEXT\n\tversion\t\t1.1\n\talias\t\tSecondaryColor3f\n\nSecondaryColor3fvEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorF in array [3]\n\tcategory\tEXT_secondary_color\n\tversion\t\t1.1\n\tglxropcode\t4129\n\talias\t\tSecondaryColor3fv\n\nSecondaryColor3iEXT(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorI in value\n\tparam\t\tgreen\t\tColorI in value\n\tparam\t\tblue\t\tColorI in value\n\tcategory\tEXT_secondary_color\n\tvectorequiv\tSecondaryColor3ivEXT\n\tversion\t\t1.1\n\talias\t\tSecondaryColor3i\n\nSecondaryColor3ivEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorI in array [3]\n\tcategory\tEXT_secondary_color\n\tversion\t\t1.1\n\tglxropcode\t4128\n\toffset\t\t568\n\talias\t\tSecondaryColor3iv\n\nSecondaryColor3sEXT(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorS in value\n\tparam\t\tgreen\t\tColorS in value\n\tparam\t\tblue\t\tColorS in value\n\tcategory\tEXT_secondary_color\n\tvectorequiv\tSecondaryColor3svEXT\n\tversion\t\t1.1\n\talias\t\tSecondaryColor3s\n\nSecondaryColor3svEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorS in array [3]\n\tcategory\tEXT_secondary_color\n\tversion\t\t1.1\n\tglxropcode\t4127\n\talias\t\tSecondaryColor3sv\n\nSecondaryColor3ubEXT(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUB in value\n\tparam\t\tgreen\t\tColorUB in value\n\tparam\t\tblue\t\tColorUB in value\n\tcategory\tEXT_secondary_color\n\tvectorequiv\tSecondaryColor3ubvEXT\n\tversion\t\t1.1\n\talias\t\tSecondaryColor3ub\n\nSecondaryColor3ubvEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUB in array [3]\n\tcategory\tEXT_secondary_color\n\tversion\t\t1.1\n\tglxropcode\t4131\n\talias\t\tSecondaryColor3ubv\n\nSecondaryColor3uiEXT(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUI in value\n\tparam\t\tgreen\t\tColorUI in value\n\tparam\t\tblue\t\tColorUI in value\n\tcategory\tEXT_secondary_color\n\tvectorequiv\tSecondaryColor3uivEXT\n\tversion\t\t1.1\n\talias\t\tSecondaryColor3ui\n\nSecondaryColor3uivEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUI in array [3]\n\tcategory\tEXT_secondary_color\n\tversion\t\t1.1\n\tglxropcode\t4133\n\talias\t\tSecondaryColor3uiv\n\nSecondaryColor3usEXT(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tColorUS in value\n\tparam\t\tgreen\t\tColorUS in value\n\tparam\t\tblue\t\tColorUS in value\n\tcategory\tEXT_secondary_color\n\tvectorequiv\tSecondaryColor3usvEXT\n\tversion\t\t1.1\n\talias\t\tSecondaryColor3us\n\nSecondaryColor3usvEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tColorUS in array [3]\n\tcategory\tEXT_secondary_color\n\tversion\t\t1.1\n\tglxropcode\t4132\n\talias\t\tSecondaryColor3usv\n\nSecondaryColorPointerEXT(size, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tColorPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride)] retained\n\tcategory\tEXT_secondary_color\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode EXT\n\tversion\t\t1.1\n\textension\n\talias\t\tSecondaryColorPointer\n\n###############################################################################\n#\n# Extension #146\n# EXT_texture_env commands\n#\n###############################################################################\n\n# Dead extension - never implemented (removed from registry!)\n# (none)\n# newcategory: EXT_texture_env\n\n###############################################################################\n#\n# Extension #147\n# EXT_texture_perturb_normal commands\n#\n###############################################################################\n\nTextureNormalEXT(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tTextureNormalModeEXT in value\n\tcategory\tEXT_texture_perturb_normal\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #148\n# EXT_multi_draw_arrays commands\n#\n###############################################################################\n\n# first and count are really 'in'\nMultiDrawArraysEXT(mode, first, count, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tfirst\t\tInt32 out array [COMPSIZE(primcount)]\n\tparam\t\tcount\t\tSizeI out array [COMPSIZE(primcount)]\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tEXT_multi_draw_arrays\n\tversion\t\t1.1\n\tglxropcode\t?\n\talias\t\tMultiDrawArrays\n\nMultiDrawElementsEXT(mode, count, type, indices, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tcount\t\tSizeI in array [COMPSIZE(primcount)]\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoidPointer in array [COMPSIZE(primcount)]\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tEXT_multi_draw_arrays\n\tversion\t\t1.1\n\tglxropcode\t?\n\talias\t\tMultiDrawElements\n\n###############################################################################\n#\n# Extension #149\n# EXT_fog_coord commands\n#\n###############################################################################\n\nFogCoordfEXT(coord)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tCoordF in value\n\tcategory\tEXT_fog_coord\n\tvectorequiv\tFogCoordfvEXT\n\tversion\t\t1.1\n\talias\t\tFogCoordf\n\nFogCoordfvEXT(coord)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tCoordF in array [1]\n\tcategory\tEXT_fog_coord\n\tversion\t\t1.1\n\tglxropcode\t4124\n\talias\t\tFogCoordfv\n\nFogCoorddEXT(coord)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tCoordD in value\n\tcategory\tEXT_fog_coord\n\tvectorequiv\tFogCoorddvEXT\n\tversion\t\t1.1\n\talias\t\tFogCoordd\n\nFogCoorddvEXT(coord)\n\treturn\t\tvoid\n\tparam\t\tcoord\t\tCoordD in array [1]\n\tcategory\tEXT_fog_coord\n\tversion\t\t1.1\n\tglxropcode\t4125\n\talias\t\tFogCoorddv\n\nFogCoordPointerEXT(type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tFogPointerTypeEXT in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type/stride)] retained\n\tcategory\tEXT_fog_coord\n\tdlflags\t\tnotlistable\n\tversion\t\t1.1\n\tglxflags\tclient-handcode server-handcode EXT\n\talias\t\tFogCoordPointer\n\n###############################################################################\n#\n# Extension #150 - skipped\n# Extension #151 - skipped\n# Extension #152 - skipped\n# Extension #153 - skipped\n# Extension #154 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #155\n# REND_screen_coordinates commands\n#\n###############################################################################\n\n# (none)\nnewcategory: REND_screen_coordinates\n\n###############################################################################\n#\n# Extension #156\n# EXT_coordinate_frame commands\n#\n###############################################################################\n\nTangent3bEXT(tx, ty, tz)\n\treturn\t\tvoid\n\tparam\t\ttx\t\tInt8 in value\n\tparam\t\tty\t\tInt8 in value\n\tparam\t\ttz\t\tInt8 in value\n\tcategory\tEXT_coordinate_frame\n\tvectorequiv\tTangent3bvEXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nTangent3bvEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tInt8 in array [3]\n\tcategory\tEXT_coordinate_frame\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTangent3dEXT(tx, ty, tz)\n\treturn\t\tvoid\n\tparam\t\ttx\t\tCoordD in value\n\tparam\t\tty\t\tCoordD in value\n\tparam\t\ttz\t\tCoordD in value\n\tcategory\tEXT_coordinate_frame\n\tvectorequiv\tTangent3dvEXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nTangent3dvEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [3]\n\tcategory\tEXT_coordinate_frame\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTangent3fEXT(tx, ty, tz)\n\treturn\t\tvoid\n\tparam\t\ttx\t\tCoordF in value\n\tparam\t\tty\t\tCoordF in value\n\tparam\t\ttz\t\tCoordF in value\n\tcategory\tEXT_coordinate_frame\n\tvectorequiv\tTangent3fvEXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nTangent3fvEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [3]\n\tcategory\tEXT_coordinate_frame\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTangent3iEXT(tx, ty, tz)\n\treturn\t\tvoid\n\tparam\t\ttx\t\tInt32 in value\n\tparam\t\tty\t\tInt32 in value\n\tparam\t\ttz\t\tInt32 in value\n\tcategory\tEXT_coordinate_frame\n\tvectorequiv\tTangent3ivEXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nTangent3ivEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tInt32 in array [3]\n\tcategory\tEXT_coordinate_frame\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTangent3sEXT(tx, ty, tz)\n\treturn\t\tvoid\n\tparam\t\ttx\t\tInt16 in value\n\tparam\t\tty\t\tInt16 in value\n\tparam\t\ttz\t\tInt16 in value\n\tcategory\tEXT_coordinate_frame\n\tvectorequiv\tTangent3svEXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nTangent3svEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tInt16 in array [3]\n\tcategory\tEXT_coordinate_frame\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nBinormal3bEXT(bx, by, bz)\n\treturn\t\tvoid\n\tparam\t\tbx\t\tInt8 in value\n\tparam\t\tby\t\tInt8 in value\n\tparam\t\tbz\t\tInt8 in value\n\tcategory\tEXT_coordinate_frame\n\tvectorequiv\tBinormal3bvEXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nBinormal3bvEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tInt8 in array [3]\n\tcategory\tEXT_coordinate_frame\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nBinormal3dEXT(bx, by, bz)\n\treturn\t\tvoid\n\tparam\t\tbx\t\tCoordD in value\n\tparam\t\tby\t\tCoordD in value\n\tparam\t\tbz\t\tCoordD in value\n\tcategory\tEXT_coordinate_frame\n\tvectorequiv\tBinormal3dvEXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nBinormal3dvEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [3]\n\tcategory\tEXT_coordinate_frame\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nBinormal3fEXT(bx, by, bz)\n\treturn\t\tvoid\n\tparam\t\tbx\t\tCoordF in value\n\tparam\t\tby\t\tCoordF in value\n\tparam\t\tbz\t\tCoordF in value\n\tcategory\tEXT_coordinate_frame\n\tvectorequiv\tBinormal3fvEXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nBinormal3fvEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [3]\n\tcategory\tEXT_coordinate_frame\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nBinormal3iEXT(bx, by, bz)\n\treturn\t\tvoid\n\tparam\t\tbx\t\tInt32 in value\n\tparam\t\tby\t\tInt32 in value\n\tparam\t\tbz\t\tInt32 in value\n\tcategory\tEXT_coordinate_frame\n\tvectorequiv\tBinormal3ivEXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nBinormal3ivEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tInt32 in array [3]\n\tcategory\tEXT_coordinate_frame\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nBinormal3sEXT(bx, by, bz)\n\treturn\t\tvoid\n\tparam\t\tbx\t\tInt16 in value\n\tparam\t\tby\t\tInt16 in value\n\tparam\t\tbz\t\tInt16 in value\n\tcategory\tEXT_coordinate_frame\n\tvectorequiv\tBinormal3svEXT\n\tversion\t\t1.1\n\toffset\t\t?\n\nBinormal3svEXT(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tInt16 in array [3]\n\tcategory\tEXT_coordinate_frame\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTangentPointerEXT(type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tTangentPointerTypeEXT in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type/stride)] retained\n\tcategory\tEXT_coordinate_frame\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\toffset\t\t?\n\nBinormalPointerEXT(type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tBinormalPointerTypeEXT in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type/stride)] retained\n\tcategory\tEXT_coordinate_frame\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #157 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #158\n# EXT_texture_env_combine commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_env_combine\n\n###############################################################################\n#\n# Extension #159\n# APPLE_specular_vector commands\n#\n###############################################################################\n\n# (none)\nnewcategory: APPLE_specular_vector\n\n###############################################################################\n#\n# Extension #160\n# APPLE_transform_hint commands\n#\n###############################################################################\n\n# (none)\nnewcategory: APPLE_transform_hint\n\n###############################################################################\n#\n# Extension #161\n# SGIX_fog_scale commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_fog_scale\n\n###############################################################################\n#\n# Extension #162 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #163\n# SUNX_constant_data commands\n#\n###############################################################################\n\nFinishTextureSUNX()\n\treturn\t\tvoid\n\tcategory\tSUNX_constant_data\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #164\n# SUN_global_alpha commands\n#\n###############################################################################\n\nGlobalAlphaFactorbSUN(factor)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tInt8 in value\n\tcategory\tSUN_global_alpha\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nGlobalAlphaFactorsSUN(factor)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tInt16 in value\n\tcategory\tSUN_global_alpha\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nGlobalAlphaFactoriSUN(factor)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tInt32 in value\n\tcategory\tSUN_global_alpha\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nGlobalAlphaFactorfSUN(factor)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tFloat32 in value\n\tcategory\tSUN_global_alpha\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nGlobalAlphaFactordSUN(factor)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tFloat64 in value\n\tcategory\tSUN_global_alpha\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nGlobalAlphaFactorubSUN(factor)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tUInt8 in value\n\tcategory\tSUN_global_alpha\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nGlobalAlphaFactorusSUN(factor)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tUInt16 in value\n\tcategory\tSUN_global_alpha\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nGlobalAlphaFactoruiSUN(factor)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tUInt32 in value\n\tcategory\tSUN_global_alpha\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #165\n# SUN_triangle_list commands\n#\n###############################################################################\n\nReplacementCodeuiSUN(code)\n\treturn\t\tvoid\n\tparam\t\tcode\t\tUInt32 in value\n\tcategory\tSUN_triangle_list\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeusSUN(code)\n\treturn\t\tvoid\n\tparam\t\tcode\t\tUInt16 in value\n\tcategory\tSUN_triangle_list\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeubSUN(code)\n\treturn\t\tvoid\n\tparam\t\tcode\t\tUInt8 in value\n\tcategory\tSUN_triangle_list\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuivSUN(code)\n\treturn\t\tvoid\n\tparam\t\tcode\t\tUInt32 in array [COMPSIZE()]\n\tcategory\tSUN_triangle_list\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeusvSUN(code)\n\treturn\t\tvoid\n\tparam\t\tcode\t\tUInt16 in array [COMPSIZE()]\n\tcategory\tSUN_triangle_list\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeubvSUN(code)\n\treturn\t\tvoid\n\tparam\t\tcode\t\tUInt8 in array [COMPSIZE()]\n\tcategory\tSUN_triangle_list\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodePointerSUN(type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tReplacementCodeTypeSUN in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoidPointer in array [COMPSIZE(type/stride)] retained\n\tcategory\tSUN_triangle_list\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #166\n# SUN_vertex commands\n#\n###############################################################################\n\nColor4ubVertex2fSUN(r, g, b, a, x, y)\n\treturn\t\tvoid\n\tparam\t\tr\t\tUInt8 in value\n\tparam\t\tg\t\tUInt8 in value\n\tparam\t\tb\t\tUInt8 in value\n\tparam\t\ta\t\tUInt8 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nColor4ubVertex2fvSUN(c, v)\n\treturn\t\tvoid\n\tparam\t\tc\t\tUInt8 in array [4]\n\tparam\t\tv\t\tFloat32 in array [2]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nColor4ubVertex3fSUN(r, g, b, a, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tr\t\tUInt8 in value\n\tparam\t\tg\t\tUInt8 in value\n\tparam\t\tb\t\tUInt8 in value\n\tparam\t\ta\t\tUInt8 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nColor4ubVertex3fvSUN(c, v)\n\treturn\t\tvoid\n\tparam\t\tc\t\tUInt8 in array [4]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nColor3fVertex3fSUN(r, g, b, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tr\t\tFloat32 in value\n\tparam\t\tg\t\tFloat32 in value\n\tparam\t\tb\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nColor3fVertex3fvSUN(c, v)\n\treturn\t\tvoid\n\tparam\t\tc\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nNormal3fVertex3fSUN(nx, ny, nz, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tnx\t\tFloat32 in value\n\tparam\t\tny\t\tFloat32 in value\n\tparam\t\tnz\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nNormal3fVertex3fvSUN(n, v)\n\treturn\t\tvoid\n\tparam\t\tn\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nColor4fNormal3fVertex3fSUN(r, g, b, a, nx, ny, nz, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tr\t\tFloat32 in value\n\tparam\t\tg\t\tFloat32 in value\n\tparam\t\tb\t\tFloat32 in value\n\tparam\t\ta\t\tFloat32 in value\n\tparam\t\tnx\t\tFloat32 in value\n\tparam\t\tny\t\tFloat32 in value\n\tparam\t\tnz\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nColor4fNormal3fVertex3fvSUN(c, n, v)\n\treturn\t\tvoid\n\tparam\t\tc\t\tFloat32 in array [4]\n\tparam\t\tn\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord2fVertex3fSUN(s, t, x, y, z)\n\treturn\t\tvoid\n\tparam\t\ts\t\tFloat32 in value\n\tparam\t\tt\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord2fVertex3fvSUN(tc, v)\n\treturn\t\tvoid\n\tparam\t\ttc\t\tFloat32 in array [2]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord4fVertex4fSUN(s, t, p, q, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ts\t\tFloat32 in value\n\tparam\t\tt\t\tFloat32 in value\n\tparam\t\tp\t\tFloat32 in value\n\tparam\t\tq\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tparam\t\tw\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord4fVertex4fvSUN(tc, v)\n\treturn\t\tvoid\n\tparam\t\ttc\t\tFloat32 in array [4]\n\tparam\t\tv\t\tFloat32 in array [4]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord2fColor4ubVertex3fSUN(s, t, r, g, b, a, x, y, z)\n\treturn\t\tvoid\n\tparam\t\ts\t\tFloat32 in value\n\tparam\t\tt\t\tFloat32 in value\n\tparam\t\tr\t\tUInt8 in value\n\tparam\t\tg\t\tUInt8 in value\n\tparam\t\tb\t\tUInt8 in value\n\tparam\t\ta\t\tUInt8 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord2fColor4ubVertex3fvSUN(tc, c, v)\n\treturn\t\tvoid\n\tparam\t\ttc\t\tFloat32 in array [2]\n\tparam\t\tc\t\tUInt8 in array [4]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord2fColor3fVertex3fSUN(s, t, r, g, b, x, y, z)\n\treturn\t\tvoid\n\tparam\t\ts\t\tFloat32 in value\n\tparam\t\tt\t\tFloat32 in value\n\tparam\t\tr\t\tFloat32 in value\n\tparam\t\tg\t\tFloat32 in value\n\tparam\t\tb\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord2fColor3fVertex3fvSUN(tc, c, v)\n\treturn\t\tvoid\n\tparam\t\ttc\t\tFloat32 in array [2]\n\tparam\t\tc\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord2fNormal3fVertex3fSUN(s, t, nx, ny, nz, x, y, z)\n\treturn\t\tvoid\n\tparam\t\ts\t\tFloat32 in value\n\tparam\t\tt\t\tFloat32 in value\n\tparam\t\tnx\t\tFloat32 in value\n\tparam\t\tny\t\tFloat32 in value\n\tparam\t\tnz\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord2fNormal3fVertex3fvSUN(tc, n, v)\n\treturn\t\tvoid\n\tparam\t\ttc\t\tFloat32 in array [2]\n\tparam\t\tn\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord2fColor4fNormal3fVertex3fSUN(s, t, r, g, b, a, nx, ny, nz, x, y, z)\n\treturn\t\tvoid\n\tparam\t\ts\t\tFloat32 in value\n\tparam\t\tt\t\tFloat32 in value\n\tparam\t\tr\t\tFloat32 in value\n\tparam\t\tg\t\tFloat32 in value\n\tparam\t\tb\t\tFloat32 in value\n\tparam\t\ta\t\tFloat32 in value\n\tparam\t\tnx\t\tFloat32 in value\n\tparam\t\tny\t\tFloat32 in value\n\tparam\t\tnz\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord2fColor4fNormal3fVertex3fvSUN(tc, c, n, v)\n\treturn\t\tvoid\n\tparam\t\ttc\t\tFloat32 in array [2]\n\tparam\t\tc\t\tFloat32 in array [4]\n\tparam\t\tn\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord4fColor4fNormal3fVertex4fSUN(s, t, p, q, r, g, b, a, nx, ny, nz, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ts\t\tFloat32 in value\n\tparam\t\tt\t\tFloat32 in value\n\tparam\t\tp\t\tFloat32 in value\n\tparam\t\tq\t\tFloat32 in value\n\tparam\t\tr\t\tFloat32 in value\n\tparam\t\tg\t\tFloat32 in value\n\tparam\t\tb\t\tFloat32 in value\n\tparam\t\ta\t\tFloat32 in value\n\tparam\t\tnx\t\tFloat32 in value\n\tparam\t\tny\t\tFloat32 in value\n\tparam\t\tnz\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tparam\t\tw\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoord4fColor4fNormal3fVertex4fvSUN(tc, c, n, v)\n\treturn\t\tvoid\n\tparam\t\ttc\t\tFloat32 in array [4]\n\tparam\t\tc\t\tFloat32 in array [4]\n\tparam\t\tn\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [4]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiVertex3fSUN(rc, x, y, z)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiVertex3fvSUN(rc, v)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in array [1]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiColor4ubVertex3fSUN(rc, r, g, b, a, x, y, z)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in value\n\tparam\t\tr\t\tUInt8 in value\n\tparam\t\tg\t\tUInt8 in value\n\tparam\t\tb\t\tUInt8 in value\n\tparam\t\ta\t\tUInt8 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiColor4ubVertex3fvSUN(rc, c, v)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in array [1]\n\tparam\t\tc\t\tUInt8 in array [4]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiColor3fVertex3fSUN(rc, r, g, b, x, y, z)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in value\n\tparam\t\tr\t\tFloat32 in value\n\tparam\t\tg\t\tFloat32 in value\n\tparam\t\tb\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiColor3fVertex3fvSUN(rc, c, v)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in array [1]\n\tparam\t\tc\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiNormal3fVertex3fSUN(rc, nx, ny, nz, x, y, z)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in value\n\tparam\t\tnx\t\tFloat32 in value\n\tparam\t\tny\t\tFloat32 in value\n\tparam\t\tnz\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiNormal3fVertex3fvSUN(rc, n, v)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in array [1]\n\tparam\t\tn\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiColor4fNormal3fVertex3fSUN(rc, r, g, b, a, nx, ny, nz, x, y, z)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in value\n\tparam\t\tr\t\tFloat32 in value\n\tparam\t\tg\t\tFloat32 in value\n\tparam\t\tb\t\tFloat32 in value\n\tparam\t\ta\t\tFloat32 in value\n\tparam\t\tnx\t\tFloat32 in value\n\tparam\t\tny\t\tFloat32 in value\n\tparam\t\tnz\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiColor4fNormal3fVertex3fvSUN(rc, c, n, v)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in array [1]\n\tparam\t\tc\t\tFloat32 in array [4]\n\tparam\t\tn\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiTexCoord2fVertex3fSUN(rc, s, t, x, y, z)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in value\n\tparam\t\ts\t\tFloat32 in value\n\tparam\t\tt\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiTexCoord2fVertex3fvSUN(rc, tc, v)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in array [1]\n\tparam\t\ttc\t\tFloat32 in array [2]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(rc, s, t, nx, ny, nz, x, y, z)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in value\n\tparam\t\ts\t\tFloat32 in value\n\tparam\t\tt\t\tFloat32 in value\n\tparam\t\tnx\t\tFloat32 in value\n\tparam\t\tny\t\tFloat32 in value\n\tparam\t\tnz\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(rc, tc, n, v)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in array [1]\n\tparam\t\ttc\t\tFloat32 in array [2]\n\tparam\t\tn\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(rc, s, t, r, g, b, a, nx, ny, nz, x, y, z)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in value\n\tparam\t\ts\t\tFloat32 in value\n\tparam\t\tt\t\tFloat32 in value\n\tparam\t\tr\t\tFloat32 in value\n\tparam\t\tg\t\tFloat32 in value\n\tparam\t\tb\t\tFloat32 in value\n\tparam\t\ta\t\tFloat32 in value\n\tparam\t\tnx\t\tFloat32 in value\n\tparam\t\tny\t\tFloat32 in value\n\tparam\t\tnz\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(rc, tc, c, n, v)\n\treturn\t\tvoid\n\tparam\t\trc\t\tReplacementCodeSUN in array [1]\n\tparam\t\ttc\t\tFloat32 in array [2]\n\tparam\t\tc\t\tFloat32 in array [4]\n\tparam\t\tn\t\tFloat32 in array [3]\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tSUN_vertex\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #167 - WGL_EXT_display_color_table\n# Extension #168 - WGL_EXT_extensions_string\n# Extension #169 - WGL_EXT_make_current_read\n# Extension #170 - WGL_EXT_pixel_format\n# Extension #171 - WGL_EXT_pbuffer\n# Extension #172 - WGL_EXT_swap_control\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #173\n# EXT_blend_func_separate commands (also INGR_blend_func_separate)\n#\n###############################################################################\n\nBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha)\n\treturn\t\tvoid\n\tparam\t\tsfactorRGB\tBlendFuncSeparateParameterEXT in value\n\tparam\t\tdfactorRGB\tBlendFuncSeparateParameterEXT in value\n\tparam\t\tsfactorAlpha\tBlendFuncSeparateParameterEXT in value\n\tparam\t\tdfactorAlpha\tBlendFuncSeparateParameterEXT in value\n\tcategory\tEXT_blend_func_separate\n\tglxropcode\t4134\n\tversion\t\t1.0\n\textension\n\talias\t\tBlendFuncSeparate\n\nBlendFuncSeparateINGR(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha)\n\treturn\t\tvoid\n\tparam\t\tsfactorRGB\tBlendFuncSeparateParameterEXT in value\n\tparam\t\tdfactorRGB\tBlendFuncSeparateParameterEXT in value\n\tparam\t\tsfactorAlpha\tBlendFuncSeparateParameterEXT in value\n\tparam\t\tdfactorAlpha\tBlendFuncSeparateParameterEXT in value\n\tcategory\tINGR_blend_func_separate\n\tglxropcode\t4134\n\tversion\t\t1.0\n\textension\n\talias\t\tBlendFuncSeparateEXT\n\n###############################################################################\n#\n# Extension #174\n# INGR_color_clamp commands\n#\n###############################################################################\n\n# (none)\nnewcategory: INGR_color_clamp\n\n###############################################################################\n#\n# Extension #175\n# INGR_interlace_read commands\n#\n###############################################################################\n\n# (none)\nnewcategory: INGR_interlace_read\n\n###############################################################################\n#\n# Extension #176\n# EXT_stencil_wrap commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_stencil_wrap\n\n###############################################################################\n#\n# Extension #177 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #178\n# EXT_422_pixels commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_422_pixels\n\n###############################################################################\n#\n# Extension #179\n# NV_texgen_reflection commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_texgen_reflection\n\n###############################################################################\n#\n# Extension #???\n# @   EXT_texture_cube_map commands\n#\n###############################################################################\n\n# (none)\n\n###############################################################################\n#\n# Extension #180 - skipped\n# Extension #181 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #182\n# SUN_convolution_border_modes commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SUN_convolution_border_modes\n\n###############################################################################\n#\n# Extension #183 - GLX_SUN_get_transparent_index\n# Extension #184 - skipped\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #185\n# EXT_texture_env_add commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_env_add\n\n###############################################################################\n#\n# Extension #186\n# EXT_texture_lod_bias commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_lod_bias\n\n###############################################################################\n#\n# Extension #187\n# EXT_texture_filter_anisotropic commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_filter_anisotropic\n\n###############################################################################\n#\n# Extension #188\n# EXT_vertex_weighting commands\n#\n###############################################################################\n\n# GLX stuff to be written\nVertexWeightfEXT(weight)\n\treturn\t\tvoid\n\tparam\t\tweight\t\tFloat32 in value\n\tcategory\tEXT_vertex_weighting\n\tvectorequiv\tVertexWeightfvEXT\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t494\n\nVertexWeightfvEXT(weight)\n\treturn\t\tvoid\n\tparam\t\tweight\t\tFloat32 in array [1]\n\tcategory\tEXT_vertex_weighting\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4135\n\tglxflags\tignore\n\toffset\t\t495\n\nVertexWeightPointerEXT(size, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tSizeI in value\n\tparam\t\ttype\t\tVertexWeightPointerTypeEXT in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type/stride)] retained\n\tcategory\tEXT_vertex_weighting\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\toffset\t\t496\n\n###############################################################################\n#\n# Extension #189\n# NV_light_max_exponent commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_light_max_exponent\n\n###############################################################################\n#\n# Extension #190\n# NV_vertex_array_range commands\n#\n###############################################################################\n\nFlushVertexArrayRangeNV()\n\treturn\t\tvoid\n\tcategory\tNV_vertex_array_range\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode ignore\n\toffset\t\t497\n\nVertexArrayRangeNV(length, pointer)\n\treturn\t\tvoid\n\tparam\t\tlength\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(length)] retained\n\tcategory\tNV_vertex_array_range\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode server-handcode ignore\n\toffset\t\t498\n\n###############################################################################\n#\n# Extension #191\n# NV_register_combiners commands\n#\n###############################################################################\n\nCombinerParameterfvNV(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4137\n\tglxflags\tignore\n\toffset\t\t499\n\nCombinerParameterfNV(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparam\t\tFloat32 in value\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4136\n\tglxflags\tignore\n\toffset\t\t500\n\nCombinerParameterivNV(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4139\n\tglxflags\tignore\n\toffset\t\t501\n\nCombinerParameteriNV(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparam\t\tInt32 in value\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4138\n\tglxflags\tignore\n\toffset\t\t502\n\nCombinerInputNV(stage, portion, variable, input, mapping, componentUsage)\n\treturn\t\tvoid\n\tparam\t\tstage\t\tCombinerStageNV in value\n\tparam\t\tportion\t\tCombinerPortionNV in value\n\tparam\t\tvariable\tCombinerVariableNV in value\n\tparam\t\tinput\t\tCombinerRegisterNV in value\n\tparam\t\tmapping\t\tCombinerMappingNV in value\n\tparam\t\tcomponentUsage\tCombinerComponentUsageNV in value\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4140\n\tglxflags\tignore\n\toffset\t\t503\n\nCombinerOutputNV(stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum)\n\treturn\t\tvoid\n\tparam\t\tstage\t\tCombinerStageNV in value\n\tparam\t\tportion\t\tCombinerPortionNV in value\n\tparam\t\tabOutput\tCombinerRegisterNV in value\n\tparam\t\tcdOutput\tCombinerRegisterNV in value\n\tparam\t\tsumOutput\tCombinerRegisterNV in value\n\tparam\t\tscale\t\tCombinerScaleNV in value\n\tparam\t\tbias\t\tCombinerBiasNV in value\n\tparam\t\tabDotProduct\tBoolean in value\n\tparam\t\tcdDotProduct\tBoolean in value\n\tparam\t\tmuxSum\t\tBoolean in value\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4141\n\tglxflags\tignore\n\toffset\t\t504\n\nFinalCombinerInputNV(variable, input, mapping, componentUsage)\n\treturn\t\tvoid\n\tparam\t\tvariable\tCombinerVariableNV in value\n\tparam\t\tinput\t\tCombinerRegisterNV in value\n\tparam\t\tmapping\t\tCombinerMappingNV in value\n\tparam\t\tcomponentUsage\tCombinerComponentUsageNV in value\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4142\n\tglxflags\tignore\n\toffset\t\t505\n\nGetCombinerInputParameterfvNV(stage, portion, variable, pname, params)\n\treturn\t\tvoid\n\tparam\t\tstage\t\tCombinerStageNV in value\n\tparam\t\tportion\t\tCombinerPortionNV in value\n\tparam\t\tvariable\tCombinerVariableNV in value\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1270\n\tglxflags\tignore\n\toffset\t\t506\n\nGetCombinerInputParameterivNV(stage, portion, variable, pname, params)\n\treturn\t\tvoid\n\tparam\t\tstage\t\tCombinerStageNV in value\n\tparam\t\tportion\t\tCombinerPortionNV in value\n\tparam\t\tvariable\tCombinerVariableNV in value\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1271\n\tglxflags\tignore\n\toffset\t\t507\n\nGetCombinerOutputParameterfvNV(stage, portion, pname, params)\n\treturn\t\tvoid\n\tparam\t\tstage\t\tCombinerStageNV in value\n\tparam\t\tportion\t\tCombinerPortionNV in value\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1272\n\tglxflags\tignore\n\toffset\t\t508\n\nGetCombinerOutputParameterivNV(stage, portion, pname, params)\n\treturn\t\tvoid\n\tparam\t\tstage\t\tCombinerStageNV in value\n\tparam\t\tportion\t\tCombinerPortionNV in value\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1273\n\tglxflags\tignore\n\toffset\t\t509\n\nGetFinalCombinerInputParameterfvNV(variable, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvariable\tCombinerVariableNV in value\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1274\n\tglxflags\tignore\n\toffset\t\t510\n\nGetFinalCombinerInputParameterivNV(variable, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvariable\tCombinerVariableNV in value\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_register_combiners\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1275\n\tglxflags\tignore\n\toffset\t\t511\n\n###############################################################################\n#\n# Extension #192\n# NV_fog_distance commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_fog_distance\n\n###############################################################################\n#\n# Extension #193\n# NV_texgen_emboss commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_texgen_emboss\n\n###############################################################################\n#\n# Extension #194\n# NV_blend_square commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_blend_square\n\n###############################################################################\n#\n# Extension #195\n# NV_texture_env_combine4 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_texture_env_combine4\n\n###############################################################################\n#\n# Extension #196\n# MESA_resize_buffers commands\n#\n###############################################################################\n\nResizeBuffersMESA()\n\treturn\t\tvoid\n\tcategory\tMESA_resize_buffers\n\tversion\t\t1.0\n\tglxropcode\t?\n\toffset\t\t512\n\n###############################################################################\n#\n# Extension #197\n# MESA_window_pos commands\n#\n# Note that the 2- and 3-component versions are now aliases of ARB\n# entry points.\n#\n###############################################################################\n\nWindowPos2dMESA(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tcategory\tMESA_window_pos\n\tvectorequiv\tWindowPos2dvMESA\n\tversion\t\t1.0\n\talias\t\tWindowPos2dARB\n\nWindowPos2dvMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [2]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\talias\t\tWindowPos2dvARB\n\nWindowPos2fMESA(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tcategory\tMESA_window_pos\n\tvectorequiv\tWindowPos2fvMESA\n\tversion\t\t1.0\n\talias\t\tWindowPos2fARB\n\nWindowPos2fvMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [2]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\talias\t\tWindowPos2fvARB\n\nWindowPos2iMESA(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tcategory\tMESA_window_pos\n\tvectorequiv\tWindowPos2ivMESA\n\tversion\t\t1.0\n\talias\t\tWindowPos2iARB\n\nWindowPos2ivMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [2]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\talias\t\tWindowPos2ivARB\n\nWindowPos2sMESA(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tcategory\tMESA_window_pos\n\tvectorequiv\tWindowPos2svMESA\n\tversion\t\t1.0\n\talias\t\tWindowPos2sARB\n\nWindowPos2svMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [2]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\talias\t\tWindowPos2svARB\n\nWindowPos3dMESA(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tparam\t\tz\t\tCoordD in value\n\tvectorequiv\tWindowPos3dvMESA\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\talias\t\tWindowPos3dARB\n\nWindowPos3dvMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [3]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\talias\t\tWindowPos3dvARB\n\nWindowPos3fMESA(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tparam\t\tz\t\tCoordF in value\n\tcategory\tMESA_window_pos\n\tvectorequiv\tWindowPos3fvMESA\n\tversion\t\t1.0\n\talias\t\tWindowPos3fARB\n\nWindowPos3fvMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [3]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\talias\t\tWindowPos3fvARB\n\nWindowPos3iMESA(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tparam\t\tz\t\tCoordI in value\n\tcategory\tMESA_window_pos\n\tvectorequiv\tWindowPos3ivMESA\n\tversion\t\t1.0\n\talias\t\tWindowPos3iARB\n\nWindowPos3ivMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [3]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\talias\t\tWindowPos3ivARB\n\nWindowPos3sMESA(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tparam\t\tz\t\tCoordS in value\n\tcategory\tMESA_window_pos\n\tvectorequiv\tWindowPos3svMESA\n\tversion\t\t1.0\n\talias\t\tWindowPos3sARB\n\nWindowPos3svMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [3]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\talias\t\tWindowPos3svARB\n\nWindowPos4dMESA(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordD in value\n\tparam\t\ty\t\tCoordD in value\n\tparam\t\tz\t\tCoordD in value\n\tparam\t\tw\t\tCoordD in value\n\tvectorequiv\tWindowPos4dvMESA\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\toffset\t\t529\n\nWindowPos4dvMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordD in array [4]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\toffset\t\t530\n\nWindowPos4fMESA(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordF in value\n\tparam\t\ty\t\tCoordF in value\n\tparam\t\tz\t\tCoordF in value\n\tparam\t\tw\t\tCoordF in value\n\tcategory\tMESA_window_pos\n\tvectorequiv\tWindowPos4fvMESA\n\tversion\t\t1.0\n\toffset\t\t531\n\nWindowPos4fvMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordF in array [4]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\toffset\t\t532\n\nWindowPos4iMESA(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordI in value\n\tparam\t\ty\t\tCoordI in value\n\tparam\t\tz\t\tCoordI in value\n\tparam\t\tw\t\tCoordI in value\n\tcategory\tMESA_window_pos\n\tvectorequiv\tWindowPos4ivMESA\n\tversion\t\t1.0\n\toffset\t\t533\n\nWindowPos4ivMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordI in array [4]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\toffset\t\t534\n\nWindowPos4sMESA(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tCoordS in value\n\tparam\t\ty\t\tCoordS in value\n\tparam\t\tz\t\tCoordS in value\n\tparam\t\tw\t\tCoordS in value\n\tcategory\tMESA_window_pos\n\tvectorequiv\tWindowPos4svMESA\n\tversion\t\t1.0\n\toffset\t\t535\n\nWindowPos4svMESA(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tCoordS in array [4]\n\tcategory\tMESA_window_pos\n\tversion\t\t1.0\n\tglxropcode\t?\n\toffset\t\t536\n\n###############################################################################\n#\n# Extension #198\n# EXT_texture_compression_s3tc commands\n#\n###############################################################################\n\n#@@ (none yet)\n\n###############################################################################\n#\n# Extension #199\n# IBM_cull_vertex commands\n#\n###############################################################################\n\n# (none)\nnewcategory: IBM_cull_vertex\n\n###############################################################################\n#\n# Extension #200\n# IBM_multimode_draw_arrays commands\n#\n###############################################################################\n\nMultiModeDrawArraysIBM(mode, first, count, primcount, modestride)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in array [COMPSIZE(primcount)]\n\tparam\t\tfirst\t\tInt32 in array [COMPSIZE(primcount)]\n\tparam\t\tcount\t\tSizeI in array [COMPSIZE(primcount)]\n\tparam\t\tprimcount\tSizeI in value\n\tparam\t\tmodestride\tInt32 in value\n\tcategory\tIBM_multimode_draw_arrays\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t708\n\n\nMultiModeDrawElementsIBM(mode, count, type, indices, primcount, modestride)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in array [COMPSIZE(primcount)]\n\tparam\t\tcount\t\tSizeI in array [COMPSIZE(primcount)]\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tConstVoidPointer in array [COMPSIZE(primcount)]\n\tparam\t\tprimcount\tSizeI in value\n\tparam\t\tmodestride\tInt32 in value\n\tcategory\tIBM_multimode_draw_arrays\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t709\n\n###############################################################################\n#\n# Extension #201\n# IBM_vertex_array_lists commands\n#\n###############################################################################\n\nColorPointerListIBM(size, type, stride, pointer, ptrstride)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tColorPointerType in value\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\tpointer\t\tVoidPointer in array [COMPSIZE(size/type/stride)] retained\n\tparam\t\tptrstride\tInt32 in value\n\tcategory\tIBM_vertex_array_lists\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nSecondaryColorPointerListIBM(size, type, stride, pointer, ptrstride)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tSecondaryColorPointerTypeIBM in value\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\tpointer\t\tVoidPointer in array [COMPSIZE(size/type/stride)] retained\n\tparam\t\tptrstride\tInt32 in value\n\tcategory\tIBM_vertex_array_lists\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nEdgeFlagPointerListIBM(stride, pointer, ptrstride)\n\treturn\t\tvoid\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\tpointer\t\tBooleanPointer in array [COMPSIZE(stride)] retained\n\tparam\t\tptrstride\tInt32 in value\n\tcategory\tIBM_vertex_array_lists\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nFogCoordPointerListIBM(type, stride, pointer, ptrstride)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tFogPointerTypeIBM in value\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\tpointer\t\tVoidPointer in array [COMPSIZE(type/stride)] retained\n\tparam\t\tptrstride\tInt32 in value\n\tcategory\tIBM_vertex_array_lists\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nIndexPointerListIBM(type, stride, pointer, ptrstride)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tIndexPointerType in value\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\tpointer\t\tVoidPointer in array [COMPSIZE(type/stride)] retained\n\tparam\t\tptrstride\tInt32 in value\n\tcategory\tIBM_vertex_array_lists\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nNormalPointerListIBM(type, stride, pointer, ptrstride)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tNormalPointerType in value\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\tpointer\t\tVoidPointer in array [COMPSIZE(type/stride)] retained\n\tparam\t\tptrstride\tInt32 in value\n\tcategory\tIBM_vertex_array_lists\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nTexCoordPointerListIBM(size, type, stride, pointer, ptrstride)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tTexCoordPointerType in value\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\tpointer\t\tVoidPointer in array [COMPSIZE(size/type/stride)] retained\n\tparam\t\tptrstride\tInt32 in value\n\tcategory\tIBM_vertex_array_lists\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\nVertexPointerListIBM(size, type, stride, pointer, ptrstride)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexPointerType in value\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\tpointer\t\tVoidPointer in array [COMPSIZE(size/type/stride)] retained\n\tparam\t\tptrstride\tInt32 in value\n\tcategory\tIBM_vertex_array_lists\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #202\n# SGIX_subsample commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_subsample\n\n###############################################################################\n#\n# Extension #203\n# SGIX_ycrcba commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_ycrcba\n\n###############################################################################\n#\n# Extension #204\n# SGIX_ycrcb_subsample commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_ycrcb_subsample\n\n###############################################################################\n#\n# Extension #205\n# SGIX_depth_pass_instrument commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_depth_pass_instrument\n\n###############################################################################\n#\n# Extension #206\n# 3DFX_texture_compression_FXT1 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: 3DFX_texture_compression_FXT1\n\n###############################################################################\n#\n# Extension #207\n# 3DFX_multisample commands\n#\n###############################################################################\n\n# (none)\nnewcategory: 3DFX_multisample\n\n###############################################################################\n#\n# Extension #208\n# 3DFX_tbuffer commands\n#\n###############################################################################\n\nTbufferMask3DFX(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tUInt32 in value\n\tcategory\t3DFX_tbuffer\n\tversion\t\t1.2\n\tglxropcode\t?\n\toffset\t\t553\n\n###############################################################################\n#\n# Extension #209\n# EXT_multisample commands\n#\n###############################################################################\n\nSampleMaskEXT(value, invert)\n\treturn\t\tvoid\n\tparam\t\tvalue\t\tClampedFloat32 in value\n\tparam\t\tinvert\t\tBoolean in value\n\tcategory\tEXT_multisample\n\tversion\t\t1.0\n\tglxropcode\t?\n\textension\n\toffset\t\t446\n\nSamplePatternEXT(pattern)\n\treturn\t\tvoid\n\tparam\t\tpattern\t\tSamplePatternEXT in value\n\tcategory\tEXT_multisample\n\tversion\t\t1.0\n\tglxropcode\t?\n\tglxflags\n\textension\n\toffset\t\t447\n\n###############################################################################\n#\n# Extension #210\n# SGIX_vertex_preclip commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_vertex_preclip\n\n###############################################################################\n#\n# Extension #211\n# SGIX_convolution_accuracy commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_convolution_accuracy\n\n###############################################################################\n#\n# Extension #212\n# SGIX_resample commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_resample\n\n###############################################################################\n#\n# Extension #213\n# SGIS_point_line_texgen commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIS_point_line_texgen\n\n###############################################################################\n#\n# Extension #214\n# SGIS_texture_color_mask commands\n#\n###############################################################################\n\nTextureColorMaskSGIS(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tBoolean in value\n\tparam\t\tgreen\t\tBoolean in value\n\tparam\t\tblue\t\tBoolean in value\n\tparam\t\talpha\t\tBoolean in value\n\tcategory\tSGIS_texture_color_mask\n\tversion\t\t1.1\n\tglxropcode\t2082\n\textension\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #215 - GLX_MESA_copy_sub_buffer\n# Extension #216 - GLX_MESA_pixmap_colormap\n# Extension #217 - GLX_MESA_release_buffers\n# Extension #218 - GLX_MESA_set_3dfx_mode\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #219\n# SGIX_igloo_interface commands\n#\n###############################################################################\n\nIglooInterfaceSGIX(pname, params)\n\treturn\t\tvoid\n\tdlflags\t\tnotlistable\n\tparam\t\tpname\t\tIglooFunctionSelectSGIX in value\n\tparam\t\tparams\t\tIglooParameterSGIX in array [COMPSIZE(pname)]\n\tcategory\tSGIX_igloo_interface\n\tversion\t\t1.0\n\tglxflags\tSGI ignore\n\textension\n\tglxropcode\t200\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #220\n# EXT_texture_env_dot3 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_env_dot3\n\n###############################################################################\n#\n# Extension #221\n# ATI_texture_mirror_once commands\n#\n###############################################################################\n# (none)\nnewcategory: ATI_texture_mirror_once\n\n###############################################################################\n#\n# Extension #222\n# NV_fence commands\n#\n###############################################################################\n\nDeleteFencesNV(n, fences)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tfences\t\tFenceNV in array [n]\n\tcategory\tNV_fence\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1276\n\tglxflags\tignore\n\toffset\t\t647\n\nGenFencesNV(n, fences)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tfences\t\tFenceNV out array [n]\n\tcategory\tNV_fence\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1277\n\tglxflags\tignore\n\toffset\t\t648\n\nIsFenceNV(fence)\n\treturn\t\tBoolean\n\tparam\t\tfence\t\tFenceNV in value\n\tcategory\tNV_fence\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1278\n\tglxflags\tignore\n\toffset\t\t649\n\nTestFenceNV(fence)\n\treturn\t\tBoolean\n\tparam\t\tfence\t\tFenceNV in value\n\tcategory\tNV_fence\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1279\n\tglxflags\tignore\n\toffset\t\t650\n\nGetFenceivNV(fence, pname, params)\n\treturn\t\tvoid\n\tparam\t\tfence\t\tFenceNV in value\n\tparam\t\tpname\t\tFenceParameterNameNV in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tNV_fence\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1280\n\tglxflags\tignore\n\toffset\t\t651\n\nFinishFenceNV(fence)\n\treturn\t\tvoid\n\tparam\t\tfence\t\tFenceNV in value\n\tcategory\tNV_fence\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1312\n\tglxflags\tignore\n\toffset\t\t652\n\nSetFenceNV(fence, condition)\n\treturn\t\tvoid\n\tparam\t\tfence\t\tFenceNV in value\n\tparam\t\tcondition\tFenceConditionNV in value\n\tcategory\tNV_fence\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t653\n\n###############################################################################\n#\n# Extension #225\n# NV_evaluators commands\n#\n###############################################################################\n\nMapControlPointsNV(target, index, type, ustride, vstride, uorder, vorder, packed, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tEvalTargetNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\ttype\t\tMapTypeNV in value\n\tparam\t\tustride\t\tSizeI in value\n\tparam\t\tvstride\t\tSizeI in value\n\tparam\t\tuorder\t\tCheckedInt32 in value\n\tparam\t\tvorder\t\tCheckedInt32 in value\n\tparam\t\tpacked\t\tBoolean in value\n\tparam\t\tpoints\t\tVoid in array [COMPSIZE(target/uorder/vorder)]\n\tcategory\tNV_evaluators\n\tdlflags\t\thandcode\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t?\n\nMapParameterivNV(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tEvalTargetNV in value\n\tparam\t\tpname\t\tMapParameterNV in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(target/pname)]\n\tcategory\tNV_evaluators\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t?\n\nMapParameterfvNV(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tEvalTargetNV in value\n\tparam\t\tpname\t\tMapParameterNV in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(target/pname)]\n\tcategory\tNV_evaluators\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t?\n\nGetMapControlPointsNV(target, index, type, ustride, vstride, packed, points)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tEvalTargetNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\ttype\t\tMapTypeNV in value\n\tparam\t\tustride\t\tSizeI in value\n\tparam\t\tvstride\t\tSizeI in value\n\tparam\t\tpacked\t\tBoolean in value\n\tparam\t\tpoints\t\tVoid out array [COMPSIZE(target)]\n\tcategory\tNV_evaluators\n\tdlflags\t\tnotlistable\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t?\n\nGetMapParameterivNV(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tEvalTargetNV in value\n\tparam\t\tpname\t\tMapParameterNV in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(target/pname)]\n\tcategory\tNV_evaluators\n\tdlflags\t\tnotlistable\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t?\n\nGetMapParameterfvNV(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tEvalTargetNV in value\n\tparam\t\tpname\t\tMapParameterNV in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(target/pname)]\n\tcategory\tNV_evaluators\n\tdlflags\t\tnotlistable\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t?\n\nGetMapAttribParameterivNV(target, index, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tEvalTargetNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tMapAttribParameterNV in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tNV_evaluators\n\tdlflags\t\tnotlistable\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t?\n\nGetMapAttribParameterfvNV(target, index, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tEvalTargetNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tMapAttribParameterNV in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tNV_evaluators\n\tdlflags\t\tnotlistable\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t?\n\nEvalMapsNV(target, mode)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tEvalTargetNV in value\n\tparam\t\tmode\t\tEvalMapsModeNV in value\n\tcategory\tNV_evaluators\n\tversion\t\t1.1\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #226\n# NV_packed_depth_stencil commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_packed_depth_stencil\n\n###############################################################################\n#\n# Extension #227\n# NV_register_combiners2 commands\n#\n###############################################################################\n\nCombinerStageParameterfvNV(stage, pname, params)\n\treturn\t\tvoid\n\tparam\t\tstage\t\tCombinerStageNV in value\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tNV_register_combiners2\n\tversion\t\t1.1\n\textension\n\tglxflags\tignore\n\toffset\t\t?\n\nGetCombinerStageParameterfvNV(stage, pname, params)\n\treturn\t\tvoid\n\tparam\t\tstage\t\tCombinerStageNV in value\n\tparam\t\tpname\t\tCombinerParameterNV in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_register_combiners2\n\tversion\t\t1.1\n\textension\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #228\n# NV_texture_compression_vtc commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_texture_compression_vtc\n\n###############################################################################\n#\n# Extension #229\n# NV_texture_rectangle commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_texture_rectangle\n\n###############################################################################\n#\n# Extension #230\n# NV_texture_shader commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_texture_shader\n\n###############################################################################\n#\n# Extension #231\n# NV_texture_shader2 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_texture_shader2\n\n###############################################################################\n#\n# Extension #232\n# NV_vertex_array_range2 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_vertex_array_range2\n\n###############################################################################\n#\n# Extension #233\n# NV_vertex_program commands\n#\n###############################################################################\n\nAreProgramsResidentNV(n, programs, residences)\n\treturn\t\tBoolean\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tprograms\tUInt32 in array [n]\n\tparam\t\tresidences\tBoolean out array [n]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\tglxvendorpriv\t1293\n\toffset\t\t578\n\nBindProgramNV(target, id)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4180\n\talias\t\tBindProgramARB\n\nDeleteProgramsNV(n, programs)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tprograms\tUInt32 in array [n]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1294\n\talias\t\tDeleteProgramsARB\n\nExecuteProgramNV(target, id, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat32 in array [4]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\tglxropcode\t4181\n\toffset\t\t581\n\nGenProgramsNV(n, programs)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tprograms\tUInt32 out array [n]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1295\n\talias\t\tGenProgramsARB\n\nGetProgramParameterdvNV(target, index, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnumNV in value\n\tparam\t\tparams\t\tFloat64 out array [4]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\tglxvendorpriv\t1297\n\toffset\t\t583\n\nGetProgramParameterfvNV(target, index, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnumNV in value\n\tparam\t\tparams\t\tFloat32 out array [4]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\tglxvendorpriv\t1296\n\toffset\t\t584\n\n# GetProgramParameterSigneddvNV(target, index, pname, params)\n#\t  return\t  void\n#\t  param\t\t  target\t  VertexAttribEnumNV in value\n#\t  param\t\t  index\t\t  Int32 in value\n#\t  param\t\t  pname\t\t  VertexAttribEnumNV in value\n#\t  param\t\t  params\t  Float64 out array [4]\n#\t  category\t  NV_vertex_program1_1_dcc\n#\t  dlflags\t  notlistable\n#\t  version\t  1.2\n#\t  extension\t  soft WINSOFT NV20\n#\t  glxflags\t  ignore\n#\t  offset\t  ?\n#\n# GetProgramParameterSignedfvNV(target, index, pname, params)\n#\t  return\t  void\n#\t  param\t\t  target\t  VertexAttribEnumNV in value\n#\t  param\t\t  index\t\t  Int32 in value\n#\t  param\t\t  pname\t\t  VertexAttribEnumNV in value\n#\t  param\t\t  params\t  Float32 out array [4]\n#\t  category\t  NV_vertex_program1_1_dcc\n#\t  dlflags\t  notlistable\n#\t  version\t  1.2\n#\t  extension\t  soft WINSOFT NV20\n#\t  glxflags\t  ignore\n#\t  offset\t  ?\n\nGetProgramivNV(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnumNV in value\n\tparam\t\tparams\t\tInt32 out array [4]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\tglxvendorpriv\t1298\n\toffset\t\t585\n\nGetProgramStringNV(id, pname, program)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnumNV in value\n\tparam\t\tprogram\t\tProgramCharacterNV out array [COMPSIZE(id/pname)]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\tglxvendorpriv\t1299\n\toffset\t\t586\n\nGetTrackMatrixivNV(target, address, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\taddress\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnumNV in value\n\tparam\t\tparams\t\tInt32 out array [1]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\tglxvendorpriv\t1300\n\toffset\t\t587\n\nGetVertexAttribdvNV(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnumNV in value\n\tparam\t\tparams\t\tFloat64 out array [1]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1301\n\talias\t\tGetVertexAttribdv\n\nGetVertexAttribfvNV(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnumNV in value\n\tparam\t\tparams\t\tFloat32 out array [1]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1302\n\talias\t\tGetVertexAttribfv\n\nGetVertexAttribivNV(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnumNV in value\n\tparam\t\tparams\t\tInt32 out array [1]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1303\n\talias\t\tGetVertexAttribiv\n\nGetVertexAttribPointervNV(index, pname, pointer)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnumNV in value\n\tparam\t\tpointer\t\tVoidPointer out array [1]\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\talias\t\tGetVertexAttribPointerv\n\nIsProgramNV(id)\n\treturn\t\tBoolean\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxvendorpriv\t1304\n\talias\t\tIsProgram\n\nLoadProgramNV(target, id, len, program)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tlen\t\tSizeI in value\n\tparam\t\tprogram\t\tUInt8 in array [len]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4183\n\toffset\t\t593\n\nProgramParameter4dNV(target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tparam\t\tw\t\tFloat64 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tProgramParameter4dvNV\n\textension\tsoft WINSOFT NV10\n\toffset\t\t594\n\nProgramParameter4dvNV(target, index, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [4]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4185\n\toffset\t\t595\n\nProgramParameter4fNV(target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tparam\t\tw\t\tFloat32 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tProgramParameter4fvNV\n\textension\tsoft WINSOFT NV10\n\toffset\t\t596\n\nProgramParameter4fvNV(target, index, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [4]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4184\n\toffset\t\t597\n\n#??? 'count' was SizeI in the latest NVIDIA gl.spec, but UInt32 in the\n#??? extension specification in the registry.\nProgramParameters4dvNV(target, index, count, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [count*4]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4187\n\toffset\t\t598\n\n#??? 'count' was SizeI in the latest NVIDIA gl.spec, but UInt32 in the\n#??? extension specification in the registry.\nProgramParameters4fvNV(target, index, count, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [count*4]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4186\n\toffset\t\t599\n\n# ProgramParameterSigned4dNV(target, index, x, y, z, w)\n#\t  return\t  void\n#\t  param\t\t  target\t  VertexAttribEnumNV in value\n#\t  param\t\t  index\t\t  Int32 in value\n#\t  param\t\t  x\t\t  Float64 in value\n#\t  param\t\t  y\t\t  Float64 in value\n#\t  param\t\t  z\t\t  Float64 in value\n#\t  param\t\t  w\t\t  Float64 in value\n#\t  category\t  NV_vertex_program1_1_dcc\n#\t  version\t  1.2\n#\t  vectorequiv\t  ProgramParameterSigned4dvNV\n#\t  extension\t  soft WINSOFT NV20\n#\t  offset\t  ?\n#\n# ProgramParameterSigned4dvNV(target, index, v)\n#\t  return\t  void\n#\t  param\t\t  target\t  VertexAttribEnumNV in value\n#\t  param\t\t  index\t\t  Int32 in value\n#\t  param\t\t  v\t\t  Float64 in array [4]\n#\t  category\t  NV_vertex_program1_1_dcc\n#\t  version\t  1.2\n#\t  extension\t  soft WINSOFT NV20\n#\t  glxflags\t  ignore\n#\t  offset\t  ?\n#\n# ProgramParameterSigned4fNV(target, index, x, y, z, w)\n#\t  return\t  void\n#\t  param\t\t  target\t  VertexAttribEnumNV in value\n#\t  param\t\t  index\t\t  Int32 in value\n#\t  param\t\t  x\t\t  Float32 in value\n#\t  param\t\t  y\t\t  Float32 in value\n#\t  param\t\t  z\t\t  Float32 in value\n#\t  param\t\t  w\t\t  Float32 in value\n#\t  category\t  NV_vertex_program1_1_dcc\n#\t  version\t  1.2\n#\t  vectorequiv\t  ProgramParameterSigned4fvNV\n#\t  extension\t  soft WINSOFT NV20\n#\t  offset\t  ?\n#\n# ProgramParameterSigned4fvNV(target, index, v)\n#\t  return\t  void\n#\t  param\t\t  target\t  VertexAttribEnumNV in value\n#\t  param\t\t  index\t\t  Int32 in value\n#\t  param\t\t  v\t\t  Float32 in array [4]\n#\t  category\t  NV_vertex_program1_1_dcc\n#\t  version\t  1.2\n#\t  extension\t  soft WINSOFT NV20\n#\t  glxflags\t  ignore\n#\t  offset\t  ?\n#\n# ProgramParametersSigned4dvNV(target, index, count, v)\n#\t  return\t  void\n#\t  param\t\t  target\t  VertexAttribEnumNV in value\n#\t  param\t\t  index\t\t  Int32 in value\n#\t  param\t\t  count\t\t  SizeI in value\n#\t  param\t\t  v\t\t  Float64 in array [count*4]\n#\t  category\t  NV_vertex_program1_1_dcc\n#\t  version\t  1.2\n#\t  extension\t  soft WINSOFT NV20\n#\t  glxflags\t  ignore\n#\t  offset\t  ?\n#\n# ProgramParametersSigned4fvNV(target, index, count, v)\n#\t  return\t  void\n#\t  param\t\t  target\t  VertexAttribEnumNV in value\n#\t  param\t\t  index\t\t  Int32 in value\n#\t  param\t\t  count\t\t  SizeI in value\n#\t  param\t\t  v\t\t  Float32 in array [count*4]\n#\t  category\t  NV_vertex_program1_1_dcc\n#\t  version\t  1.2\n#\t  extension\t  soft WINSOFT NV20\n#\t  glxflags\t  ignore\n#\t  offset\t  ?\n\nRequestResidentProgramsNV(n, programs)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tprograms\tUInt32 in array [n]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4182\n\toffset\t\t600\n\nTrackMatrixNV(target, address, matrix, transform)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tVertexAttribEnumNV in value\n\tparam\t\taddress\t\tUInt32 in value\n\tparam\t\tmatrix\t\tVertexAttribEnumNV in value\n\tparam\t\ttransform\tVertexAttribEnumNV in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4188\n\toffset\t\t601\n\nVertexAttribPointerNV(index, fsize, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tfsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexAttribEnumNV in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(fsize/type/stride)] retained\n\tcategory\tNV_vertex_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxflags\tignore\n\toffset\t\t602\n\nVertexAttrib1dNV(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib1dvNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib1d\n\nVertexAttrib1dvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [1]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4197\n\talias\t\tVertexAttrib1dv\n\nVertexAttrib1fNV(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib1fvNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib1f\n\nVertexAttrib1fvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [1]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4193\n\talias\t\tVertexAttrib1fv\n\nVertexAttrib1sNV(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib1svNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib1s\n\nVertexAttrib1svNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [1]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4189\n\talias\t\tVertexAttrib1sv\n\nVertexAttrib2dNV(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib2dvNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib2d\n\nVertexAttrib2dvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [2]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4198\n\talias\t\tVertexAttrib2dv\n\nVertexAttrib2fNV(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib2fvNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib2f\n\nVertexAttrib2fvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [2]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4194\n\talias\t\tVertexAttrib2fv\n\nVertexAttrib2sNV(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib2svNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib2s\n\nVertexAttrib2svNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [2]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4190\n\talias\t\tVertexAttrib2sv\n\nVertexAttrib3dNV(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib3dvNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib3d\n\nVertexAttrib3dvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [3]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4199\n\talias\t\tVertexAttrib3dv\n\nVertexAttrib3fNV(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib3fvNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib3f\n\nVertexAttrib3fvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [3]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4195\n\talias\t\tVertexAttrib3fv\n\nVertexAttrib3sNV(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tparam\t\tz\t\tInt16 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib3svNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib3s\n\nVertexAttrib3svNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [3]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4191\n\talias\t\tVertexAttrib3sv\n\nVertexAttrib4dNV(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tparam\t\tw\t\tFloat64 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib4dvNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4d\n\nVertexAttrib4dvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat64 in array [4]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4200\n\talias\t\tVertexAttrib4dv\n\nVertexAttrib4fNV(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tparam\t\tw\t\tFloat32 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib4fvNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4f\n\nVertexAttrib4fvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tFloat32 in array [4]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4196\n\talias\t\tVertexAttrib4fv\n\nVertexAttrib4sNV(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tparam\t\tz\t\tInt16 in value\n\tparam\t\tw\t\tInt16 in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\tvectorequiv\tVertexAttrib4svNV\n\textension\tsoft WINSOFT NV10\n\talias\t\tVertexAttrib4s\n\nVertexAttrib4svNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [4]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4192\n\talias\t\tVertexAttrib4sv\n\nVertexAttrib4ubNV(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tColorUB in value\n\tparam\t\ty\t\tColorUB in value\n\tparam\t\tz\t\tColorUB in value\n\tparam\t\tw\t\tColorUB in value\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tvectorequiv\tVertexAttrib4ubvNV\n\talias\t\tVertexAttrib4Nub\n\nVertexAttrib4ubvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tColorUB in array [4]\n\tcategory\tNV_vertex_program\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4201\n\talias\t\tVertexAttrib4Nubv\n\nVertexAttribs1dvNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tFloat64 in array [count]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4210\n\toffset\t\t629\n\nVertexAttribs1fvNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tFloat32 in array [count]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4206\n\toffset\t\t630\n\nVertexAttribs1svNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tInt16 in array [count]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4202\n\toffset\t\t631\n\nVertexAttribs2dvNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tFloat64 in array [count*2]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4211\n\toffset\t\t632\n\nVertexAttribs2fvNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tFloat32 in array [count*2]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4207\n\toffset\t\t633\n\nVertexAttribs2svNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tInt16 in array [count*2]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4203\n\toffset\t\t634\n\nVertexAttribs3dvNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tFloat64 in array [count*3]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4212\n\toffset\t\t635\n\nVertexAttribs3fvNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tFloat32 in array [count*3]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4208\n\toffset\t\t636\n\nVertexAttribs3svNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tInt16 in array [count*3]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4204\n\toffset\t\t637\n\nVertexAttribs4dvNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tFloat64 in array [count*4]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4213\n\toffset\t\t638\n\nVertexAttribs4fvNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tFloat32 in array [count*4]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4209\n\toffset\t\t639\n\nVertexAttribs4svNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tInt16 in array [count*4]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4205\n\toffset\t\t640\n\nVertexAttribs4ubvNV(index, count, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tv\t\tColorUB in array [count*4]\n\tcategory\tNV_vertex_program\n\tdlflags\t\thandcode\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV10\n\tglxropcode\t4214\n\toffset\t\t641\n\n\n###############################################################################\n#\n# Extension #234 - GLX_SGIX_visual_select_group\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #235\n# SGIX_texture_coordinate_clamp commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_texture_coordinate_clamp\n\n###############################################################################\n#\n# Extension #236\n# SGIX_scalebias_hint commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SGIX_scalebias_hint\n\n###############################################################################\n#\n# Extension #237 - GLX_OML_swap_method commands\n# Extension #238 - GLX_OML_sync_control commands\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #239\n# OML_interlace commands\n#\n###############################################################################\n\n# (none)\nnewcategory: OML_interlace\n\n###############################################################################\n#\n# Extension #240\n# OML_subsample commands\n#\n###############################################################################\n\n# (none)\nnewcategory: OML_subsample\n\n###############################################################################\n#\n# Extension #241\n# OML_resample commands\n#\n###############################################################################\n\n# (none)\nnewcategory: OML_resample\n\n###############################################################################\n#\n# Extension #242 - WGL_OML_sync_control commands\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #243\n# NV_copy_depth_to_color commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_copy_depth_to_color\n\n###############################################################################\n#\n# Extension #244\n# ATI_envmap_bumpmap commands\n#\n###############################################################################\n\nTexBumpParameterivATI(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tTexBumpParameterATI in value\n\tparam\t\tparam\t\tInt32 in array [COMPSIZE(pname)]\n\tcategory\tATI_envmap_bumpmap\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexBumpParameterfvATI(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tTexBumpParameterATI in value\n\tparam\t\tparam\t\tFloat32 in array [COMPSIZE(pname)]\n\tcategory\tATI_envmap_bumpmap\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetTexBumpParameterivATI(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGetTexBumpParameterATI in value\n\tparam\t\tparam\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tATI_envmap_bumpmap\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetTexBumpParameterfvATI(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGetTexBumpParameterATI in value\n\tparam\t\tparam\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tATI_envmap_bumpmap\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #245\n# ATI_fragment_shader commands\n#\n###############################################################################\n\nGenFragmentShadersATI(range)\n\treturn\t\tUInt32\n\tparam\t\trange\t\tUInt32 in value\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBindFragmentShaderATI(id)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteFragmentShaderATI(id)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBeginFragmentShaderATI()\n\treturn\t\tvoid\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nEndFragmentShaderATI()\n\treturn\t\tvoid\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nPassTexCoordATI(dst, coord, swizzle)\n\treturn\t\tvoid\n\tparam\t\tdst\t\tUInt32 in value\n\tparam\t\tcoord\t\tUInt32 in value\n\tparam\t\tswizzle\t\tSwizzleOpATI in value\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSampleMapATI(dst, interp, swizzle)\n\treturn\t\tvoid\n\tparam\t\tdst\t\tUInt32 in value\n\tparam\t\tinterp\t\tUInt32 in value\n\tparam\t\tswizzle\t\tSwizzleOpATI in value\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColorFragmentOp1ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod)\n\treturn\t\tvoid\n\tparam\t\top\t\tFragmentOpATI in value\n\tparam\t\tdst\t\tUInt32 in value\n\tparam\t\tdstMask\t\tUInt32 in value\n\tparam\t\tdstMod\t\tUInt32 in value\n\tparam\t\targ1\t\tUInt32 in value\n\tparam\t\targ1Rep\t\tUInt32 in value\n\tparam\t\targ1Mod\t\tUInt32 in value\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColorFragmentOp2ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod)\n\treturn\t\tvoid\n\tparam\t\top\t\tFragmentOpATI in value\n\tparam\t\tdst\t\tUInt32 in value\n\tparam\t\tdstMask\t\tUInt32 in value\n\tparam\t\tdstMod\t\tUInt32 in value\n\tparam\t\targ1\t\tUInt32 in value\n\tparam\t\targ1Rep\t\tUInt32 in value\n\tparam\t\targ1Mod\t\tUInt32 in value\n\tparam\t\targ2\t\tUInt32 in value\n\tparam\t\targ2Rep\t\tUInt32 in value\n\tparam\t\targ2Mod\t\tUInt32 in value\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColorFragmentOp3ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod)\n\treturn\t\tvoid\n\tparam\t\top\t\tFragmentOpATI in value\n\tparam\t\tdst\t\tUInt32 in value\n\tparam\t\tdstMask\t\tUInt32 in value\n\tparam\t\tdstMod\t\tUInt32 in value\n\tparam\t\targ1\t\tUInt32 in value\n\tparam\t\targ1Rep\t\tUInt32 in value\n\tparam\t\targ1Mod\t\tUInt32 in value\n\tparam\t\targ2\t\tUInt32 in value\n\tparam\t\targ2Rep\t\tUInt32 in value\n\tparam\t\targ2Mod\t\tUInt32 in value\n\tparam\t\targ3\t\tUInt32 in value\n\tparam\t\targ3Rep\t\tUInt32 in value\n\tparam\t\targ3Mod\t\tUInt32 in value\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nAlphaFragmentOp1ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod)\n\treturn\t\tvoid\n\tparam\t\top\t\tFragmentOpATI in value\n\tparam\t\tdst\t\tUInt32 in value\n\tparam\t\tdstMod\t\tUInt32 in value\n\tparam\t\targ1\t\tUInt32 in value\n\tparam\t\targ1Rep\t\tUInt32 in value\n\tparam\t\targ1Mod\t\tUInt32 in value\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nAlphaFragmentOp2ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod)\n\treturn\t\tvoid\n\tparam\t\top\t\tFragmentOpATI in value\n\tparam\t\tdst\t\tUInt32 in value\n\tparam\t\tdstMod\t\tUInt32 in value\n\tparam\t\targ1\t\tUInt32 in value\n\tparam\t\targ1Rep\t\tUInt32 in value\n\tparam\t\targ1Mod\t\tUInt32 in value\n\tparam\t\targ2\t\tUInt32 in value\n\tparam\t\targ2Rep\t\tUInt32 in value\n\tparam\t\targ2Mod\t\tUInt32 in value\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nAlphaFragmentOp3ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod)\n\treturn\t\tvoid\n\tparam\t\top\t\tFragmentOpATI in value\n\tparam\t\tdst\t\tUInt32 in value\n\tparam\t\tdstMod\t\tUInt32 in value\n\tparam\t\targ1\t\tUInt32 in value\n\tparam\t\targ1Rep\t\tUInt32 in value\n\tparam\t\targ1Mod\t\tUInt32 in value\n\tparam\t\targ2\t\tUInt32 in value\n\tparam\t\targ2Rep\t\tUInt32 in value\n\tparam\t\targ2Mod\t\tUInt32 in value\n\tparam\t\targ3\t\tUInt32 in value\n\tparam\t\targ3Rep\t\tUInt32 in value\n\tparam\t\targ3Mod\t\tUInt32 in value\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSetFragmentShaderConstantATI(dst, value)\n\treturn\t\tvoid\n\tparam\t\tdst\t\tUInt32 in value\n\tparam\t\tvalue\t\tConstFloat32 in array [4]\n\tcategory\tATI_fragment_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #246\n# ATI_pn_triangles commands\n#\n###############################################################################\n\nPNTrianglesiATI(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPNTrianglesPNameATI in value\n\tparam\t\tparam\t\tInt32 in value\n\tcategory\tATI_pn_triangles\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nPNTrianglesfATI(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPNTrianglesPNameATI in value\n\tparam\t\tparam\t\tFloat32 in value\n\tcategory\tATI_pn_triangles\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #247\n# ATI_vertex_array_object commands\n#\n###############################################################################\n\nNewObjectBufferATI(size, pointer, usage)\n\treturn\t\tUInt32\n\tparam\t\tsize\t\tSizeI in value\n\tparam\t\tpointer\t\tConstVoid in array [size]\n\tparam\t\tusage\t\tArrayObjectUsageATI in value\n\tcategory\tATI_vertex_array_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIsObjectBufferATI(buffer)\n\treturn\t\tBoolean\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tATI_vertex_array_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUpdateObjectBufferATI(buffer, offset, size, pointer, preserve)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\toffset\t\tUInt32 in value\n\tparam\t\tsize\t\tSizeI in value\n\tparam\t\tpointer\t\tConstVoid in array [size]\n\tparam\t\tpreserve\tPreserveModeATI in value\n\tcategory\tATI_vertex_array_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetObjectBufferfvATI(buffer, pname, params)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\tpname\t\tArrayObjectPNameATI in value\n\tparam\t\tparams\t\tFloat32 out array [1]\n\tcategory\tATI_vertex_array_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetObjectBufferivATI(buffer, pname, params)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\tpname\t\tArrayObjectPNameATI in value\n\tparam\t\tparams\t\tInt32 out array [1]\n\tcategory\tATI_vertex_array_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nFreeObjectBufferATI(buffer)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tATI_vertex_array_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nArrayObjectATI(array, size, type, stride, buffer, offset)\n\treturn\t\tvoid\n\tparam\t\tarray\t\tEnableCap in value\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tScalarType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\toffset\t\tUInt32 in value\n\tcategory\tATI_vertex_array_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetArrayObjectfvATI(array, pname, params)\n\treturn\t\tvoid\n\tparam\t\tarray\t\tEnableCap in value\n\tparam\t\tpname\t\tArrayObjectPNameATI in value\n\tparam\t\tparams\t\tFloat32 out array [1]\n\tcategory\tATI_vertex_array_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetArrayObjectivATI(array, pname, params)\n\treturn\t\tvoid\n\tparam\t\tarray\t\tEnableCap in value\n\tparam\t\tpname\t\tArrayObjectPNameATI in value\n\tparam\t\tparams\t\tInt32 out array [1]\n\tcategory\tATI_vertex_array_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVariantArrayObjectATI(id, type, stride, buffer, offset)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\ttype\t\tScalarType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\toffset\t\tUInt32 in value\n\tcategory\tATI_vertex_array_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVariantArrayObjectfvATI(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tArrayObjectPNameATI in value\n\tparam\t\tparams\t\tFloat32 out array [1]\n\tcategory\tATI_vertex_array_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVariantArrayObjectivATI(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tArrayObjectPNameATI in value\n\tparam\t\tparams\t\tInt32 out array [1]\n\tcategory\tATI_vertex_array_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #248\n# EXT_vertex_shader commands\n#\n###############################################################################\n\nBeginVertexShaderEXT()\n\treturn\t\tvoid\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nEndVertexShaderEXT()\n\treturn\t\tvoid\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBindVertexShaderEXT(id)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGenVertexShadersEXT(range)\n\treturn\t\tUInt32\n\tparam\t\trange\t\tUInt32 in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteVertexShaderEXT(id)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nShaderOp1EXT(op, res, arg1)\n\treturn\t\tvoid\n\tparam\t\top\t\tVertexShaderOpEXT in value\n\tparam\t\tres\t\tUInt32 in value\n\tparam\t\targ1\t\tUInt32 in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nShaderOp2EXT(op, res, arg1, arg2)\n\treturn\t\tvoid\n\tparam\t\top\t\tVertexShaderOpEXT in value\n\tparam\t\tres\t\tUInt32 in value\n\tparam\t\targ1\t\tUInt32 in value\n\tparam\t\targ2\t\tUInt32 in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nShaderOp3EXT(op, res, arg1, arg2, arg3)\n\treturn\t\tvoid\n\tparam\t\top\t\tVertexShaderOpEXT in value\n\tparam\t\tres\t\tUInt32 in value\n\tparam\t\targ1\t\tUInt32 in value\n\tparam\t\targ2\t\tUInt32 in value\n\tparam\t\targ3\t\tUInt32 in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSwizzleEXT(res, in, outX, outY, outZ, outW)\n\treturn\t\tvoid\n\tparam\t\tres\t\tUInt32 in value\n\tparam\t\tin\t\tUInt32 in value\n\tparam\t\toutX\t\tVertexShaderCoordOutEXT in value\n\tparam\t\toutY\t\tVertexShaderCoordOutEXT in value\n\tparam\t\toutZ\t\tVertexShaderCoordOutEXT in value\n\tparam\t\toutW\t\tVertexShaderCoordOutEXT in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nWriteMaskEXT(res, in, outX, outY, outZ, outW)\n\treturn\t\tvoid\n\tparam\t\tres\t\tUInt32 in value\n\tparam\t\tin\t\tUInt32 in value\n\tparam\t\toutX\t\tVertexShaderWriteMaskEXT in value\n\tparam\t\toutY\t\tVertexShaderWriteMaskEXT in value\n\tparam\t\toutZ\t\tVertexShaderWriteMaskEXT in value\n\tparam\t\toutW\t\tVertexShaderWriteMaskEXT in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nInsertComponentEXT(res, src, num)\n\treturn\t\tvoid\n\tparam\t\tres\t\tUInt32 in value\n\tparam\t\tsrc\t\tUInt32 in value\n\tparam\t\tnum\t\tUInt32 in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nExtractComponentEXT(res, src, num)\n\treturn\t\tvoid\n\tparam\t\tres\t\tUInt32 in value\n\tparam\t\tsrc\t\tUInt32 in value\n\tparam\t\tnum\t\tUInt32 in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGenSymbolsEXT(datatype, storagetype, range, components)\n\treturn\t\tUInt32\n\tparam\t\tdatatype\tDataTypeEXT in value\n\tparam\t\tstoragetype\tVertexShaderStorageTypeEXT in value\n\tparam\t\trange\t\tParameterRangeEXT in value\n\tparam\t\tcomponents\tUInt32 in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSetInvariantEXT(id, type, addr)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\ttype\t\tScalarType in value\n\tparam\t\taddr\t\tVoid in array [COMPSIZE(id/type)]\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSetLocalConstantEXT(id, type, addr)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\ttype\t\tScalarType in value\n\tparam\t\taddr\t\tVoid in array [COMPSIZE(id/type)]\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVariantbvEXT(id, addr)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\taddr\t\tInt8 in array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVariantsvEXT(id, addr)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\taddr\t\tInt16 in array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVariantivEXT(id, addr)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\taddr\t\tInt32 in array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVariantfvEXT(id, addr)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\taddr\t\tFloat32 in array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVariantdvEXT(id, addr)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\taddr\t\tFloat64 in array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVariantubvEXT(id, addr)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\taddr\t\tUInt8 in array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVariantusvEXT(id, addr)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\taddr\t\tUInt16 in array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVariantuivEXT(id, addr)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\taddr\t\tUInt32 in array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVariantPointerEXT(id, type, stride, addr)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\ttype\t\tScalarType in value\n\tparam\t\tstride\t\tUInt32 in value\n\tparam\t\taddr\t\tVoid in array [COMPSIZE(id/type/stride)]\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nEnableVariantClientStateEXT(id)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDisableVariantClientStateEXT(id)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBindLightParameterEXT(light, value)\n\treturn\t\tUInt32\n\tparam\t\tlight\t\tLightName in value\n\tparam\t\tvalue\t\tLightParameter in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBindMaterialParameterEXT(face, value)\n\treturn\t\tUInt32\n\tparam\t\tface\t\tMaterialFace in value\n\tparam\t\tvalue\t\tMaterialParameter in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBindTexGenParameterEXT(unit, coord, value)\n\treturn\t\tUInt32\n\tparam\t\tunit\t\tTextureUnit in value\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tvalue\t\tTextureGenParameter in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBindTextureUnitParameterEXT(unit, value)\n\treturn\t\tUInt32\n\tparam\t\tunit\t\tTextureUnit in value\n\tparam\t\tvalue\t\tVertexShaderTextureUnitParameter in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBindParameterEXT(value)\n\treturn\t\tUInt32\n\tparam\t\tvalue\t\tVertexShaderParameterEXT in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIsVariantEnabledEXT(id, cap)\n\treturn\t\tBoolean\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tcap\t\tVariantCapEXT in value\n\tcategory\tEXT_vertex_shader\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVariantBooleanvEXT(id, value, data)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tvalue\t\tGetVariantValueEXT in value\n\tparam\t\tdata\t\tBoolean out array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVariantIntegervEXT(id, value, data)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tvalue\t\tGetVariantValueEXT in value\n\tparam\t\tdata\t\tInt32 out array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVariantFloatvEXT(id, value, data)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tvalue\t\tGetVariantValueEXT in value\n\tparam\t\tdata\t\tFloat32 out array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVariantPointervEXT(id, value, data)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tvalue\t\tGetVariantValueEXT in value\n\tparam\t\tdata\t\tVoidPointer out array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetInvariantBooleanvEXT(id, value, data)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tvalue\t\tGetVariantValueEXT in value\n\tparam\t\tdata\t\tBoolean out array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetInvariantIntegervEXT(id, value, data)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tvalue\t\tGetVariantValueEXT in value\n\tparam\t\tdata\t\tInt32 out array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetInvariantFloatvEXT(id, value, data)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tvalue\t\tGetVariantValueEXT in value\n\tparam\t\tdata\t\tFloat32 out array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetLocalConstantBooleanvEXT(id, value, data)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tvalue\t\tGetVariantValueEXT in value\n\tparam\t\tdata\t\tBoolean out array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetLocalConstantIntegervEXT(id, value, data)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tvalue\t\tGetVariantValueEXT in value\n\tparam\t\tdata\t\tInt32 out array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetLocalConstantFloatvEXT(id, value, data)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tvalue\t\tGetVariantValueEXT in value\n\tparam\t\tdata\t\tFloat32 out array [COMPSIZE(id)]\n\tcategory\tEXT_vertex_shader\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #249\n# ATI_vertex_streams commands\n#\n###############################################################################\n\nVertexStream1sATI(stream, x)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tInt16 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream1svATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tInt16 in array [1]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream1iATI(stream, x)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tInt32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream1ivATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tInt32 in array [1]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream1fATI(stream, x)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tFloat32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream1fvATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tFloat32 in array [1]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream1dATI(stream, x)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tFloat64 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream1dvATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tFloat64 in array [1]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream2sATI(stream, x, y)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream2svATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tInt16 in array [2]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream2iATI(stream, x, y)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream2ivATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tInt32 in array [2]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream2fATI(stream, x, y)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream2fvATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tFloat32 in array [2]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream2dATI(stream, x, y)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream2dvATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tFloat64 in array [2]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream3sATI(stream, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tparam\t\tz\t\tInt16 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream3svATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tInt16 in array [3]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream3iATI(stream, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tparam\t\tz\t\tInt32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream3ivATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tInt32 in array [3]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream3fATI(stream, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream3fvATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tFloat32 in array [3]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream3dATI(stream, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream3dvATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tFloat64 in array [3]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream4sATI(stream, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tInt16 in value\n\tparam\t\ty\t\tInt16 in value\n\tparam\t\tz\t\tInt16 in value\n\tparam\t\tw\t\tInt16 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream4svATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tInt16 in array [4]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream4iATI(stream, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tparam\t\tz\t\tInt32 in value\n\tparam\t\tw\t\tInt32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream4ivATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tInt32 in array [4]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream4fATI(stream, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tparam\t\tw\t\tFloat32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream4fvATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tFloat32 in array [4]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream4dATI(stream, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tparam\t\tw\t\tFloat64 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexStream4dvATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tFloat64 in array [4]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalStream3bATI(stream, nx, ny, nz)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tnx\t\tInt8 in value\n\tparam\t\tny\t\tInt8 in value\n\tparam\t\tnz\t\tInt8 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalStream3bvATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tInt8 in array [3]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalStream3sATI(stream, nx, ny, nz)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tnx\t\tInt16 in value\n\tparam\t\tny\t\tInt16 in value\n\tparam\t\tnz\t\tInt16 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalStream3svATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tInt16 in array [3]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalStream3iATI(stream, nx, ny, nz)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tnx\t\tInt32 in value\n\tparam\t\tny\t\tInt32 in value\n\tparam\t\tnz\t\tInt32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalStream3ivATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tInt32 in array [3]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalStream3fATI(stream, nx, ny, nz)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tnx\t\tFloat32 in value\n\tparam\t\tny\t\tFloat32 in value\n\tparam\t\tnz\t\tFloat32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalStream3fvATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tFloat32 in array [3]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalStream3dATI(stream, nx, ny, nz)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tnx\t\tFloat64 in value\n\tparam\t\tny\t\tFloat64 in value\n\tparam\t\tnz\t\tFloat64 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalStream3dvATI(stream, coords)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tparam\t\tcoords\t\tFloat64 in array [3]\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nClientActiveVertexStreamATI(stream)\n\treturn\t\tvoid\n\tparam\t\tstream\t\tVertexStreamATI in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexBlendEnviATI(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tVertexStreamATI in value\n\tparam\t\tparam\t\tInt32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexBlendEnvfATI(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tVertexStreamATI in value\n\tparam\t\tparam\t\tFloat32 in value\n\tcategory\tATI_vertex_streams\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #250 - WGL_I3D_digital_video_control\n# Extension #251 - WGL_I3D_gamma\n# Extension #252 - WGL_I3D_genlock\n# Extension #253 - WGL_I3D_image_buffer\n# Extension #254 - WGL_I3D_swap_frame_lock\n# Extension #255 - WGL_I3D_swap_frame_usage\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #256\n# ATI_element_array commands\n#\n###############################################################################\n\nElementPointerATI(type, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tElementPointerTypeATI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(type)] retained\n\tcategory\tATI_element_array\n\tdlflags\t\tnotlistable\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.2\n\toffset\t\t?\n\nDrawElementArrayATI(mode, count)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tcount\t\tSizeI in value\n\tcategory\tATI_element_array\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.2\n\toffset\t\t?\n\nDrawRangeElementArrayATI(mode, start, end, count)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tstart\t\tUInt32 in value\n\tparam\t\tend\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tcategory\tATI_element_array\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.2\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #257\n# SUN_mesh_array commands\n#\n###############################################################################\n\nDrawMeshArraysSUN(mode, first, count, width)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tfirst\t\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\twidth\t\tSizeI in value\n\tcategory\tSUN_mesh_array\n\tdlflags\t\thandcode\n\tglxflags\tclient-handcode client-intercept server-handcode\n\tversion\t\t1.1\n\tglxropcode\t?\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #258\n# SUN_slice_accum commands\n#\n###############################################################################\n\n# (none)\nnewcategory: SUN_slice_accum\n\n###############################################################################\n#\n# Extension #259\n# NV_multisample_filter_hint commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_multisample_filter_hint\n\n###############################################################################\n#\n# Extension #260\n# NV_depth_clamp commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_depth_clamp\n\n###############################################################################\n#\n# Extension #261\n# NV_occlusion_query commands\n#\n###############################################################################\n\nGenOcclusionQueriesNV(n, ids)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tids\t\tUInt32 out array [n]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_occlusion_query\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV20\n\tglxflags\tignore\n\nDeleteOcclusionQueriesNV(n, ids)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tids\t\tUInt32 in array [n]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_occlusion_query\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV20\n\tglxflags\tignore\n\nIsOcclusionQueryNV(id)\n\treturn\t\tBoolean\n\tparam\t\tid\t\tUInt32 in value\n\tdlflags\t\tnotlistable\n\tcategory\tNV_occlusion_query\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV20\n\tglxflags\tignore\n\nBeginOcclusionQueryNV(id)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tNV_occlusion_query\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV20\n\tglxflags\tignore\n\nEndOcclusionQueryNV()\n\treturn\t\tvoid\n\tcategory\tNV_occlusion_query\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV20\n\tglxflags\tignore\n\nGetOcclusionQueryivNV(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tOcclusionQueryParameterNameNV in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_occlusion_query\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV20\n\tglxflags\tignore\n\nGetOcclusionQueryuivNV(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tOcclusionQueryParameterNameNV in value\n\tparam\t\tparams\t\tUInt32 out array [COMPSIZE(pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_occlusion_query\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV20\n\tglxflags\tignore\n\n###############################################################################\n#\n# Extension #262\n# NV_point_sprite commands\n#\n###############################################################################\n\nPointParameteriNV(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparam\t\tInt32 in value\n\tcategory\tNV_point_sprite\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV20\n\tglxropcode\t4221\n\talias\t\tPointParameteri\n\nPointParameterivNV(pname, params)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tPointParameterNameARB in value\n\tparam\t\tparams\t\tInt32 in array [COMPSIZE(pname)]\n\tcategory\tNV_point_sprite\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV20\n\tglxropcode\t4222\n\talias\t\tPointParameteriv\n\n###############################################################################\n#\n# Extension #263 - WGL_NV_render_depth_texture\n# Extension #264 - WGL_NV_render_texture_rectangle\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #265\n# NV_texture_shader3 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_texture_shader3\n\n###############################################################################\n#\n# Extension #266\n# NV_vertex_program1_1 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_vertex_program1_1\n\n###############################################################################\n#\n# Extension #267\n# EXT_shadow_funcs commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_shadow_funcs\n\n###############################################################################\n#\n# Extension #268\n# EXT_stencil_two_side commands\n#\n###############################################################################\n\nActiveStencilFaceEXT(face)\n\treturn\t\tvoid\n\tparam\t\tface\t\tStencilFaceDirection in value\n\tcategory\tEXT_stencil_two_side\n\tversion\t\t1.3\n\tglxropcode\t4220\n\toffset\t\t646\n\n###############################################################################\n#\n# Extension #269\n# ATI_text_fragment_shader commands\n#\n###############################################################################\n\n# Uses ARB_vertex_program entry points\nnewcategory: ATI_text_fragment_shader\n\n###############################################################################\n#\n# Extension #270\n# APPLE_client_storage commands\n#\n###############################################################################\n\n# (none)\nnewcategory: APPLE_client_storage\n\n###############################################################################\n#\n# Extension #271\n# APPLE_element_array commands\n#\n###############################################################################\n\n# @@ Need to verify/add GLX protocol\n\n# @@@ like #256 ATI_element_array\nElementPointerAPPLE(type, pointer)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tElementPointerTypeATI in value\n\tparam\t\tpointer\t\tVoid in array [type]\n\tcategory\tAPPLE_element_array\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDrawElementArrayAPPLE(mode, first, count)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tfirst\t\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tcategory\tAPPLE_element_array\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDrawRangeElementArrayAPPLE(mode, start, end, first, count)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tstart\t\tUInt32 in value\n\tparam\t\tend\t\tUInt32 in value\n\tparam\t\tfirst\t\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tcategory\tAPPLE_element_array\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiDrawElementArrayAPPLE(mode, first, count, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tfirst\t\tInt32 in array [primcount]\n\tparam\t\tcount\t\tSizeI in array [primcount]\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tAPPLE_element_array\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiDrawRangeElementArrayAPPLE(mode, start, end, first, count, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tstart\t\tUInt32 in value\n\tparam\t\tend\t\tUInt32 in value\n\tparam\t\tfirst\t\tInt32 in array [primcount]\n\tparam\t\tcount\t\tSizeI in array [primcount]\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tAPPLE_element_array\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #272\n# APPLE_fence commands\n#\n###############################################################################\n\n# @@ Need to verify/add GLX protocol\n\n# @@@ like #222 NV_fence\nGenFencesAPPLE(n, fences)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tfences\t\tFenceNV out array [n]\n\tcategory\tAPPLE_fence\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDeleteFencesAPPLE(n, fences)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tfences\t\tFenceNV in array [n]\n\tcategory\tAPPLE_fence\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSetFenceAPPLE(fence)\n\treturn\t\tvoid\n\tparam\t\tfence\t\tFenceNV in value\n\tcategory\tAPPLE_fence\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIsFenceAPPLE(fence)\n\treturn\t\tBoolean\n\tparam\t\tfence\t\tFenceNV in value\n\tcategory\tAPPLE_fence\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTestFenceAPPLE(fence)\n\treturn\t\tBoolean\n\tparam\t\tfence\t\tFenceNV in value\n\tcategory\tAPPLE_fence\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nFinishFenceAPPLE(fence)\n\treturn\t\tvoid\n\tparam\t\tfence\t\tFenceNV in value\n\tcategory\tAPPLE_fence\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTestObjectAPPLE(object, name)\n\treturn\t\tBoolean\n\tparam\t\tobject\t\tObjectTypeAPPLE in value\n\tparam\t\tname\t\tUInt32 in value\n\tcategory\tAPPLE_fence\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nFinishObjectAPPLE(object, name)\n\treturn\t\tvoid\n\tparam\t\tobject\t\tObjectTypeAPPLE in value\n\tparam\t\tname\t\tInt32 in value\n\tcategory\tAPPLE_fence\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #273\n# APPLE_vertex_array_object commands\n#\n###############################################################################\n\nBindVertexArrayAPPLE(array)\n\treturn\t\tvoid\n\tparam\t\tarray\t\tUInt32 in value\n\tcategory\tAPPLE_vertex_array_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tBindVertexArray\n\nDeleteVertexArraysAPPLE(n, arrays)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tarrays\t\tUInt32 in array [n]\n\tcategory\tAPPLE_vertex_array_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tDeleteVertexArrays\n\nGenVertexArraysAPPLE(n, arrays)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tarrays\t\tUInt32 out array [n]\n\tcategory\tAPPLE_vertex_array_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tGenVertexArray\n\nIsVertexArrayAPPLE(array)\n\treturn\t\tBoolean\n\tparam\t\tarray\t\tUInt32 in value\n\tcategory\tAPPLE_vertex_array_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tIsVertexArray\n\n###############################################################################\n#\n# Extension #274\n# APPLE_vertex_array_range commands\n#\n###############################################################################\n\n# @@ Need to verify/add GLX protocol\n\n# @@@ like #190 NV_vertex_array_range,\nVertexArrayRangeAPPLE(length, pointer)\n\treturn\t\tvoid\n\tparam\t\tlength\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid out array [length]\n\tcategory\tAPPLE_vertex_array_range\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nFlushVertexArrayRangeAPPLE(length, pointer)\n\treturn\t\tvoid\n\tparam\t\tlength\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid out array [length]\n\tcategory\tAPPLE_vertex_array_range\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexArrayParameteriAPPLE(pname, param)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tVertexArrayPNameAPPLE in value\n\tparam\t\tparam\t\tInt32 in value\n\tcategory\tAPPLE_vertex_array_range\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #275\n# APPLE_ycbcr_422 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: APPLE_ycbcr_422\n\n###############################################################################\n#\n# Extension #276\n# S3_s3tc commands\n#\n###############################################################################\n\n# (none)\nnewcategory: S3_s3tc\n\n###############################################################################\n#\n# Extension #277\n# ATI_draw_buffers commands\n#\n###############################################################################\n\nDrawBuffersATI(n, bufs)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tbufs\t\tDrawBufferModeATI in array [n]\n\tcategory\tATI_draw_buffers\n\tversion\t\t1.2\n\textension\n\tglxropcode\t233\n\talias\t\tDrawBuffers\n\n###############################################################################\n#\n# Extension #278 - WGL_ATI_pixel_format_float\n#\n###############################################################################\nnewcategory: ATI_pixel_format_float\npassthru: /* This is really a WGL extension, but defines some associated GL enums.\npassthru:  * ATI does not export \"GL_ATI_pixel_format_float\" in the GL_EXTENSIONS string.\npassthru:  */\n\n###############################################################################\n#\n# Extension #279\n# ATI_texture_env_combine3 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ATI_texture_env_combine3\n\n###############################################################################\n#\n# Extension #280\n# ATI_texture_float commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ATI_texture_float\n\n###############################################################################\n#\n# Extension #281 (also WGL_NV_float_buffer)\n# NV_float_buffer commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_float_buffer\n\n###############################################################################\n#\n# Extension #282\n# NV_fragment_program commands\n#\n###############################################################################\n\n# @@ Need to verify/add GLX protocol\n\n# Some NV_fragment_program entry points are shared with ARB_vertex_program,\n#   and are only included in that #define block, for now.\nnewcategory: NV_fragment_program\npassthru: /* Some NV_fragment_program entry points are shared with ARB_vertex_program. */\n\nProgramNamedParameter4fNV(id, len, name, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tlen\t\tSizeI in value\n\tparam\t\tname\t\tUInt8 in array [1]\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tparam\t\tw\t\tFloat32 in value\n\tcategory\tNV_fragment_program\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t682\n\nProgramNamedParameter4dNV(id, len, name, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tlen\t\tSizeI in value\n\tparam\t\tname\t\tUInt8 in array [1]\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tparam\t\tw\t\tFloat64 in value\n\tcategory\tNV_fragment_program\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t683\n\nProgramNamedParameter4fvNV(id, len, name, v)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tlen\t\tSizeI in value\n\tparam\t\tname\t\tUInt8 in array [1]\n\tparam\t\tv\t\tFloat32 in array [4]\n\tcategory\tNV_fragment_program\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t684\n\nProgramNamedParameter4dvNV(id, len, name, v)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tlen\t\tSizeI in value\n\tparam\t\tname\t\tUInt8 in array [1]\n\tparam\t\tv\t\tFloat64 in array [4]\n\tcategory\tNV_fragment_program\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t685\n\nGetProgramNamedParameterfvNV(id, len, name, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tlen\t\tSizeI in value\n\tparam\t\tname\t\tUInt8 in array [1]\n\tparam\t\tparams\t\tFloat32 out array [4]\n\tcategory\tNV_fragment_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t686\n\nGetProgramNamedParameterdvNV(id, len, name, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tlen\t\tSizeI in value\n\tparam\t\tname\t\tUInt8 in array [1]\n\tparam\t\tparams\t\tFloat64 out array [4]\n\tcategory\tNV_fragment_program\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t687\n\n###############################################################################\n#\n# Extension #283\n# NV_half_float commands\n#\n###############################################################################\n\n# @@ Need to verify/add GLX protocol\n\nVertex2hNV(x, y)\n\treturn\t\tvoid\n\tparam\t\tx\t\tHalf16NV in value\n\tparam\t\ty\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertex2hvNV(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tHalf16NV in array [2]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertex3hNV(x, y, z)\n\treturn\t\tvoid\n\tparam\t\tx\t\tHalf16NV in value\n\tparam\t\ty\t\tHalf16NV in value\n\tparam\t\tz\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertex3hvNV(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tHalf16NV in array [3]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertex4hNV(x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tx\t\tHalf16NV in value\n\tparam\t\ty\t\tHalf16NV in value\n\tparam\t\tz\t\tHalf16NV in value\n\tparam\t\tw\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertex4hvNV(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tHalf16NV in array [4]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormal3hNV(nx, ny, nz)\n\treturn\t\tvoid\n\tparam\t\tnx\t\tHalf16NV in value\n\tparam\t\tny\t\tHalf16NV in value\n\tparam\t\tnz\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormal3hvNV(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tHalf16NV in array [3]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColor3hNV(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tHalf16NV in value\n\tparam\t\tgreen\t\tHalf16NV in value\n\tparam\t\tblue\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColor3hvNV(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tHalf16NV in array [3]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColor4hNV(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tHalf16NV in value\n\tparam\t\tgreen\t\tHalf16NV in value\n\tparam\t\tblue\t\tHalf16NV in value\n\tparam\t\talpha\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColor4hvNV(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tHalf16NV in array [4]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoord1hNV(s)\n\treturn\t\tvoid\n\tparam\t\ts\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoord1hvNV(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tHalf16NV in array [1]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoord2hNV(s, t)\n\treturn\t\tvoid\n\tparam\t\ts\t\tHalf16NV in value\n\tparam\t\tt\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoord2hvNV(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tHalf16NV in array [2]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoord3hNV(s, t, r)\n\treturn\t\tvoid\n\tparam\t\ts\t\tHalf16NV in value\n\tparam\t\tt\t\tHalf16NV in value\n\tparam\t\tr\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoord3hvNV(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tHalf16NV in array [3]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoord4hNV(s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ts\t\tHalf16NV in value\n\tparam\t\tt\t\tHalf16NV in value\n\tparam\t\tr\t\tHalf16NV in value\n\tparam\t\tq\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoord4hvNV(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tHalf16NV in array [4]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoord1hNV(target, s)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoord1hvNV(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tHalf16NV in array [1]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoord2hNV(target, s, t)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tHalf16NV in value\n\tparam\t\tt\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoord2hvNV(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tHalf16NV in array [2]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoord3hNV(target, s, t, r)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tHalf16NV in value\n\tparam\t\tt\t\tHalf16NV in value\n\tparam\t\tr\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoord3hvNV(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tHalf16NV in array [3]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoord4hNV(target, s, t, r, q)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\ts\t\tHalf16NV in value\n\tparam\t\tt\t\tHalf16NV in value\n\tparam\t\tr\t\tHalf16NV in value\n\tparam\t\tq\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMultiTexCoord4hvNV(target, v)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureUnit in value\n\tparam\t\tv\t\tHalf16NV in array [4]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nFogCoordhNV(fog)\n\treturn\t\tvoid\n\tparam\t\tfog\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nFogCoordhvNV(fog)\n\treturn\t\tvoid\n\tparam\t\tfog\t\tHalf16NV in array [1]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSecondaryColor3hNV(red, green, blue)\n\treturn\t\tvoid\n\tparam\t\tred\t\tHalf16NV in value\n\tparam\t\tgreen\t\tHalf16NV in value\n\tparam\t\tblue\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSecondaryColor3hvNV(v)\n\treturn\t\tvoid\n\tparam\t\tv\t\tHalf16NV in array [3]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexWeighthNV(weight)\n\treturn\t\tvoid\n\tparam\t\tweight\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexWeighthvNV(weight)\n\treturn\t\tvoid\n\tparam\t\tweight\t\tHalf16NV in array [1]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttrib1hNV(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttrib1hvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tHalf16NV in array [1]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttrib2hNV(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tHalf16NV in value\n\tparam\t\ty\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttrib2hvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tHalf16NV in array [2]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttrib3hNV(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tHalf16NV in value\n\tparam\t\ty\t\tHalf16NV in value\n\tparam\t\tz\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttrib3hvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tHalf16NV in array [3]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttrib4hNV(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tHalf16NV in value\n\tparam\t\ty\t\tHalf16NV in value\n\tparam\t\tz\t\tHalf16NV in value\n\tparam\t\tw\t\tHalf16NV in value\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttrib4hvNV(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tHalf16NV in array [4]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribs1hvNV(index, n, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tv\t\tHalf16NV in array [n]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribs2hvNV(index, n, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tv\t\tHalf16NV in array [n]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribs3hvNV(index, n, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tv\t\tHalf16NV in array [n]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribs4hvNV(index, n, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tv\t\tHalf16NV in array [n]\n\tcategory\tNV_half_float\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #284\n# NV_pixel_data_range commands\n#\n###############################################################################\n\n# @@ Need to verify/add GLX protocol\n\nPixelDataRangeNV(target, length, pointer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tPixelDataRangeTargetNV in value\n\tparam\t\tlength\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid out array [length]\n\tcategory\tNV_pixel_data_range\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nFlushPixelDataRangeNV(target)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tPixelDataRangeTargetNV in value\n\tcategory\tNV_pixel_data_range\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #285\n# NV_primitive_restart commands\n#\n###############################################################################\n\n# @@ Need to verify/add GLX protocol\n\nPrimitiveRestartNV()\n\treturn\t\tvoid\n\tcategory\tNV_primitive_restart\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nPrimitiveRestartIndexNV(index)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tNV_primitive_restart\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n\n###############################################################################\n#\n# Extension #286\n# NV_texture_expand_normal commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_texture_expand_normal\n\n###############################################################################\n#\n# Extension #287\n# NV_vertex_program2 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_vertex_program2\n\n###############################################################################\n#\n# Extension #288\n# ATI_map_object_buffer commands\n#\n###############################################################################\n\n# @@ Need to verify/add GLX protocol\n\nMapObjectBufferATI(buffer)\n\treturn\t\tVoidPointer\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tATI_map_object_buffer\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUnmapObjectBufferATI(buffer)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tATI_map_object_buffer\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #289\n# ATI_separate_stencil commands\n#\n###############################################################################\n\n# @@ Need to verify/add GLX protocol\n\nStencilOpSeparateATI(face, sfail, dpfail, dppass)\n\treturn\t\tvoid\n\tparam\t\tface\t\tStencilFaceDirection in value\n\tparam\t\tsfail\t\tStencilOp in value\n\tparam\t\tdpfail\t\tStencilOp in value\n\tparam\t\tdppass\t\tStencilOp in value\n\tcategory\tATI_separate_stencil\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tStencilOpSeparate\n\nStencilFuncSeparateATI(frontfunc, backfunc, ref, mask)\n\treturn\t\tvoid\n\tparam\t\tfrontfunc\tStencilFunction in value\n\tparam\t\tbackfunc\tStencilFunction in value\n\tparam\t\tref\t\tClampedStencilValue in value\n\tparam\t\tmask\t\tMaskedStencilValue in value\n\tcategory\tATI_separate_stencil\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tStencilFuncSeparate\n\n###############################################################################\n#\n# Extension #290\n# ATI_vertex_attrib_array_object commands\n#\n###############################################################################\n\n# @@ Need to verify/add GLX protocol\n\nVertexAttribArrayObjectATI(index, size, type, normalized, stride, buffer, offset)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexAttribPointerTypeARB in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\toffset\t\tUInt32 in value\n\tcategory\tATI_vertex_attrib_array_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVertexAttribArrayObjectfvATI(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tArrayObjectPNameATI in value\n\tparam\t\tparams\t\tFloat32 out array [pname]\n\tcategory\tATI_vertex_attrib_array_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVertexAttribArrayObjectivATI(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tArrayObjectPNameATI in value\n\tparam\t\tparams\t\tInt32 out array [pname]\n\tcategory\tATI_vertex_attrib_array_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #291 - OpenGL ES only, not in glext.h\n# OES_byte_coordinates commands\n#\n###############################################################################\n\n# void Vertex{234}bOES(T coords)\n# void Vertex{234}bvOES(T *coords)\n# void TexCoord{1234}bOES(T coords)\n# void TexCoord{1234}bvOES(T *coords)\n# void MultiTexCoord{1234}bOES(enum texture, T coords)\n# void MultiTexCoord{1234}bvOES(enum texture, T *coords)\n# All are handcode - mapped to non-byte GLX protocol on client side\n\n# newcategory: OES_byte_coordinates\n\n###############################################################################\n#\n# Extension #292 - OpenGL ES only, not in glext.h\n# OES_fixed_point commands\n#\n###############################################################################\n\n# Too many to list in just a comment - see spec in the extension registry\n# All are handcode - mapped to non-byte GLX protocol on client side\n\n# newcategory: OES_fixed_point\n\n###############################################################################\n#\n# Extension #293 - OpenGL ES only, not in glext.h\n# OES_single_precision commands\n#\n###############################################################################\n\n# void DepthRangefOES(clampf n, clampf f)\n# void FrustumfOES(float l, float r, float b, float t, float n, float f)\n# void OrthofOES(float l, float r, float b, float t, float n, float f)\n# void ClipPlanefOES(enum plane, const float* equation)\n# void glClearDepthfOES(clampd depth)\n# GLX ropcodes 4308-4312 (not respectively, see extension spec)\n# void GetClipPlanefOES(enum plane, float* equation)\n# GLX vendor private 1421\n\n# newcategory: OES_single_precision\n\n###############################################################################\n#\n# Extension #294 - OpenGL ES only, not in glext.h\n# OES_compressed_paletted_texture commands\n#\n###############################################################################\n\n# (none)\n# newcategory: OES_compressed_paletted_texture\n\n###############################################################################\n#\n# Extension #295 - This is an OpenGL ES extension, but also implemented in Mesa\n# OES_read_format commands\n#\n###############################################################################\n\n# (none)\nnewcategory: OES_read_format\n\n###############################################################################\n#\n# Extension #296 - OpenGL ES only, not in glext.h\n# OES_query_matrix commands\n#\n###############################################################################\n\n# bitfield queryMatrixxOES(fixed mantissa[16], int exponent[16])\n# All are handcode - mapped to non-byte GLX protocol on client side\n\n# newcategory: OES_query_matrix\n\n###############################################################################\n#\n# Extension #297\n# EXT_depth_bounds_test commands\n#\n###############################################################################\n\nDepthBoundsEXT(zmin, zmax)\n\treturn\t\tvoid\n\tparam\t\tzmin\t\tClampedFloat64 in value\n\tparam\t\tzmax\t\tClampedFloat64 in value\n\tcategory\tEXT_depth_bounds_test\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4229\n\toffset\t\t699\n\n###############################################################################\n#\n# Extension #298\n# EXT_texture_mirror_clamp commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_mirror_clamp\n\n###############################################################################\n#\n# Extension #299\n# EXT_blend_equation_separate commands\n#\n###############################################################################\n\nBlendEquationSeparateEXT(modeRGB, modeAlpha)\n\treturn\t\tvoid\n\tparam\t\tmodeRGB\t\tBlendEquationModeEXT in value\n\tparam\t\tmodeAlpha\tBlendEquationModeEXT in value\n\tcategory\tEXT_blend_equation_separate\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4228\n\talias\t\tBlendEquationSeparate\n\n###############################################################################\n#\n# Extension #300\n# MESA_pack_invert commands\n#\n###############################################################################\n\n# (none)\nnewcategory: MESA_pack_invert\n\n###############################################################################\n#\n# Extension #301\n# MESA_ycbcr_texture commands\n#\n###############################################################################\n\n# (none)\nnewcategory: MESA_ycbcr_texture\n\n###############################################################################\n#\n# Extension #301\n# MESA_ycbcr_texture commands\n#\n###############################################################################\n\n# (none)\nnewcategory: MESA_ycbcr_texture\n\n###############################################################################\n#\n# Extension #302\n# EXT_pixel_buffer_object commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_pixel_buffer_object\n\n###############################################################################\n#\n# Extension #303\n# NV_fragment_program_option commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_fragment_program_option\n\n###############################################################################\n#\n# Extension #304\n# NV_fragment_program2 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_fragment_program2\n\n###############################################################################\n#\n# Extension #305\n# NV_vertex_program2_option commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_vertex_program2_option\n\n###############################################################################\n#\n# Extension #306\n# NV_vertex_program3 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_vertex_program3\n\n###############################################################################\n#\n# Extension #307 - GLX_SGIX_hyperpipe commands\n# Extension #308 - GLX_MESA_agp_offset commands\n# Extension #309 - GL_EXT_texture_compression_dxt1 (OpenGL ES only, subset of _st3c version)\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #310\n# EXT_framebuffer_object commands\n#\n###############################################################################\n\nIsRenderbufferEXT(renderbuffer)\n\treturn\t\tBoolean\n\tparam\t\trenderbuffer\tUInt32 in value\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxvendorpriv\t1422\n\tglxflags\tignore\n\talias\t\tIsRenderbuffer\n\nBindRenderbufferEXT(target, renderbuffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tRenderbufferTarget in value\n\tparam\t\trenderbuffer\tUInt32 in value\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4316\n\tglxflags\tignore\n\talias\t\tBindRenderbuffer\n\nDeleteRenderbuffersEXT(n, renderbuffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\trenderbuffers\tUInt32 in array [n]\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4317\n\tglxflags\tignore\n\talias\t\tDeleteRenderbuffers\n\nGenRenderbuffersEXT(n, renderbuffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\trenderbuffers\tUInt32 out array [n]\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxvendorpriv\t1423\n\tglxflags\tignore\n\talias\t\tGenRenderbuffers\n\nRenderbufferStorageEXT(target, internalformat, width, height)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tRenderbufferTarget in value\n\tparam\t\tinternalformat\tGLenum in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4318\n\tglxflags\tignore\n\talias\t\tRenderbufferStorage\n\nGetRenderbufferParameterivEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tRenderbufferTarget in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_framebuffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxvendorpriv\t1424\n\tglxflags\tignore\n\talias\t\tGetRenderbufferParameteriv\n\nIsFramebufferEXT(framebuffer)\n\treturn\t\tBoolean\n\tparam\t\tframebuffer\tUInt32 in value\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxvendorpriv\t1425\n\tglxflags\tignore\n\talias\t\tIsFramebuffer\n\nBindFramebufferEXT(target, framebuffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tframebuffer\tUInt32 in value\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4319\n\tglxflags\tignore\n\talias\t\tBindFramebuffer\n\nDeleteFramebuffersEXT(n, framebuffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tframebuffers\tUInt32 in array [n]\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4320\n\tglxflags\tignore\n\talias\t\tDeleteFramebuffers\n\nGenFramebuffersEXT(n, framebuffers)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tframebuffers\tUInt32 out array [n]\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxvendorpriv\t1426\n\tglxflags\tignore\n\talias\t\tGenFramebuffers\n\nCheckFramebufferStatusEXT(target)\n\treturn\t\tGLenum\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxvendorpriv\t1427\n\tglxflags\tignore\n\talias\t\tCheckFramebufferStatus\n\nFramebufferTexture1DEXT(target, attachment, textarget, texture, level)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttextarget\tGLenum in value\n\tparam\t\ttexture\t\tUInt32 in value\n\tparam\t\tlevel\t\tInt32 in value\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4321\n\tglxflags\tignore\n\talias\t\tFramebufferTexture1D\n\nFramebufferTexture2DEXT(target, attachment, textarget, texture, level)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttextarget\tGLenum in value\n\tparam\t\ttexture\t\tUInt32 in value\n\tparam\t\tlevel\t\tInt32 in value\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4322\n\tglxflags\tignore\n\talias\t\tFramebufferTexture2D\n\nFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttextarget\tGLenum in value\n\tparam\t\ttexture\t\tUInt32 in value\n\tparam\t\tlevel\t\tInt32 in value\n\tparam\t\tzoffset\t\tInt32 in value\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4323\n\tglxflags\tignore\n\talias\t\tFramebufferTexture3D\n\nFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\trenderbuffertarget\tRenderbufferTarget in value\n\tparam\t\trenderbuffer\tUInt32 in value\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4324\n\tglxflags\tignore\n\talias\t\tFramebufferRenderbuffer\n\nGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_framebuffer_object\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxvendorpriv\t1428\n\tglxflags\tignore\n\talias\t\tGetFramebufferAttachmentParameteriv\n\nGenerateMipmapEXT(target)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tcategory\tEXT_framebuffer_object\n\tversion\t\t1.2\n\textension\n\tglxropcode\t4325\n\tglxflags\tignore\n\talias\t\tGenerateMipmap\n\n\n###############################################################################\n#\n# Extension #311\n# GREMEDY_string_marker commands\n#\n###############################################################################\n\nStringMarkerGREMEDY(len, string)\n\treturn\t\tvoid\n\tparam\t\tlen\t\tSizeI in value\n\tparam\t\tstring\t\tVoid in array [len]\n\tcategory\tGREMEDY_string_marker\n\tversion\t\t1.0\n\textension\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #312\n# EXT_packed_depth_stencil commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_packed_depth_stencil\n\n###############################################################################\n#\n# Extension #313 - WGL_3DL_stereo_control\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #314\n# EXT_stencil_clear_tag commands\n#\n###############################################################################\n\nStencilClearTagEXT(stencilTagBits, stencilClearTag)\n\treturn\t\tvoid\n\tparam\t\tstencilTagBits\tSizeI in value\n\tparam\t\tstencilClearTag UInt32 in value\n\tcategory\tEXT_stencil_clear_tag\n\tversion\t\t1.5\n\textension\n\tglxropcode\t4223\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #315\n# EXT_texture_sRGB commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_sRGB\n\n###############################################################################\n#\n# Extension #316\n# EXT_framebuffer_blit commands\n#\n###############################################################################\n\nBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter)\n\treturn\t\tvoid\n\tparam\t\tsrcX0\t\tInt32 in value\n\tparam\t\tsrcY0\t\tInt32 in value\n\tparam\t\tsrcX1\t\tInt32 in value\n\tparam\t\tsrcY1\t\tInt32 in value\n\tparam\t\tdstX0\t\tInt32 in value\n\tparam\t\tdstY0\t\tInt32 in value\n\tparam\t\tdstX1\t\tInt32 in value\n\tparam\t\tdstY1\t\tInt32 in value\n\tparam\t\tmask\t\tClearBufferMask in value\n\tparam\t\tfilter\t\tGLenum in value\n\tcategory\tEXT_framebuffer_blit\n\tversion\t\t1.5\n\tglxropcode\t4330\n\talias\t\tBlitFramebuffer\n\n###############################################################################\n#\n# Extension #317\n# EXT_framebuffer_multisample commands\n#\n###############################################################################\n\nRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tsamples\t\tSizeI in value\n\tparam\t\tinternalformat\tGLenum in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_framebuffer_multisample\n\tversion\t\t1.5\n\tglxropcode\t4331\n\talias\t\tRenderbufferStorageMultisample\n\n###############################################################################\n#\n# Extension #318\n# MESAX_texture_stack commands\n#\n###############################################################################\n\n# (none)\nnewcategory: MESAX_texture_stack\n\n###############################################################################\n#\n# Extension #319\n# EXT_timer_query commands\n#\n###############################################################################\n\nGetQueryObjecti64vEXT(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt64EXT out array [pname]\n\tcategory\tEXT_timer_query\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\tglxvendorpriv\t1328\n\tglxflags\tignore\n\toffset\t\t?\n\nGetQueryObjectui64vEXT(id, pname, params)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tUInt64EXT out array [pname]\n\tcategory\tEXT_timer_query\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\tglxvendorpriv\t1329\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #320\n# EXT_gpu_program_parameters commands\n#\n###############################################################################\n\nProgramEnvParameters4fvEXT(target, index, count, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tFloat32 in array [count*4]\n\tcategory\tEXT_gpu_program_parameters\n\tversion\t\t1.2\n\tglxropcode\t4281\n\toffset\t\t?\n\nProgramLocalParameters4fvEXT(target, index, count, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTargetARB in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tFloat32 in array [count*4]\n\tcategory\tEXT_gpu_program_parameters\n\tversion\t\t1.2\n\tglxropcode\t4282\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #321\n# APPLE_flush_buffer_range commands\n#\n###############################################################################\n\nBufferParameteriAPPLE(target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparam\t\tInt32 in value\n\tcategory\tAPPLE_flush_buffer_range\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nFlushMappedBufferRangeAPPLE(target, offset, size)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\toffset\t\tBufferOffset in value\n\tparam\t\tsize\t\tBufferSize in value\n\tcategory\tAPPLE_flush_buffer_range\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\talias\t\tFlushMappedBufferRange\n\n###############################################################################\n#\n# Extension #322\n# NV_gpu_program4 commands\n#\n###############################################################################\n\nProgramLocalParameterI4iNV(target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tparam\t\tz\t\tInt32 in value\n\tparam\t\tw\t\tInt32 in value\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\tvectorequiv\tProgramLocalParameterI4ivNV\n\tglxvectorequiv\tProgramLocalParameterI4ivNV\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramLocalParameterI4ivNV(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tInt32 in array [4]\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramLocalParametersI4ivNV(target, index, count, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tInt32 in array [count*4]\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramLocalParameterI4uiNV(target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt32 in value\n\tparam\t\ty\t\tUInt32 in value\n\tparam\t\tz\t\tUInt32 in value\n\tparam\t\tw\t\tUInt32 in value\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\tvectorequiv\tProgramLocalParameterI4uivNV\n\tglxvectorequiv\tProgramLocalParameterI4uivNV\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramLocalParameterI4uivNV(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tUInt32 in array [4]\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramLocalParametersI4uivNV(target, index, count, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tUInt32 in array [count*4]\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramEnvParameterI4iNV(target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tparam\t\tz\t\tInt32 in value\n\tparam\t\tw\t\tInt32 in value\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\tvectorequiv\tProgramEnvParameterI4ivNV\n\tglxvectorequiv\tProgramEnvParameterI4ivNV\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramEnvParameterI4ivNV(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tInt32 in array [4]\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramEnvParametersI4ivNV(target, index, count, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tInt32 in array [count*4]\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramEnvParameterI4uiNV(target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt32 in value\n\tparam\t\ty\t\tUInt32 in value\n\tparam\t\tz\t\tUInt32 in value\n\tparam\t\tw\t\tUInt32 in value\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\tvectorequiv\tProgramEnvParameterI4uivNV\n\tglxvectorequiv\tProgramEnvParameterI4uivNV\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramEnvParameterI4uivNV(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tUInt32 in array [4]\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramEnvParametersI4uivNV(target, index, count, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tUInt32 in array [count*4]\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetProgramLocalParameterIivNV(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tInt32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetProgramLocalParameterIuivNV(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tUInt32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetProgramEnvParameterIivNV(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tInt32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetProgramEnvParameterIuivNV(target, index, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tUInt32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tNV_gpu_program4\n\tversion\t\t1.3\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\n###############################################################################\n#\n# Extension #323\n# NV_geometry_program4 commands\n#\n###############################################################################\n\nProgramVertexLimitNV(target, limit)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tlimit\t\tInt32 in value\n\tcategory\tNV_geometry_program4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\nFramebufferTextureEXT(target, attachment, texture, level)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tcategory\tNV_geometry_program4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tFramebufferTextureARB\n\nFramebufferTextureLayerEXT(target, attachment, texture, level, layer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tlayer\t\tCheckedInt32 in value\n\tcategory\tNV_geometry_program4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tFramebufferTextureLayer\n\nFramebufferTextureFaceEXT(target, attachment, texture, level, face)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tface\t\tTextureTarget in value\n\tcategory\tNV_geometry_program4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tFramebufferTextureFaceARB\n\n###############################################################################\n#\n# Extension #324\n# EXT_geometry_shader4 commands\n#\n###############################################################################\n\nProgramParameteriEXT(program, pname, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tpname\t\tProgramParameterPName in value\n\tparam\t\tvalue\t\tInt32 in value\n\tcategory\tEXT_geometry_shader4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tProgramParameteriARB\n\n###############################################################################\n#\n# Extension #325\n# NV_vertex_program4 commands\n#\n###############################################################################\n\nVertexAttribI1iEXT(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt32 in value\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI1ivEXT\n\tglxvectorequiv\tVertexAttribI1ivEXT\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI1i\n\nVertexAttribI2iEXT(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI2ivEXT\n\tglxvectorequiv\tVertexAttribI2ivEXT\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI2i\n\nVertexAttribI3iEXT(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tparam\t\tz\t\tInt32 in value\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI3ivEXT\n\tglxvectorequiv\tVertexAttribI3ivEXT\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI3i\n\nVertexAttribI4iEXT(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tparam\t\tz\t\tInt32 in value\n\tparam\t\tw\t\tInt32 in value\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI4ivEXT\n\tglxvectorequiv\tVertexAttribI4ivEXT\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI4i\n\nVertexAttribI1uiEXT(index, x)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt32 in value\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI1uivEXT\n\tglxvectorequiv\tVertexAttribI1uivEXT\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI1ui\n\nVertexAttribI2uiEXT(index, x, y)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt32 in value\n\tparam\t\ty\t\tUInt32 in value\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI2uivEXT\n\tglxvectorequiv\tVertexAttribI2uivEXT\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI2ui\n\nVertexAttribI3uiEXT(index, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt32 in value\n\tparam\t\ty\t\tUInt32 in value\n\tparam\t\tz\t\tUInt32 in value\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI3uivEXT\n\tglxvectorequiv\tVertexAttribI3uivEXT\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI3ui\n\nVertexAttribI4uiEXT(index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt32 in value\n\tparam\t\ty\t\tUInt32 in value\n\tparam\t\tz\t\tUInt32 in value\n\tparam\t\tw\t\tUInt32 in value\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\tvectorequiv\tVertexAttribI4uivEXT\n\tglxvectorequiv\tVertexAttribI4uivEXT\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI4ui\n\nVertexAttribI1ivEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [1]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI1iv\n\nVertexAttribI2ivEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [2]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI2iv\n\nVertexAttribI3ivEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [3]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI3iv\n\nVertexAttribI4ivEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt32 in array [4]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI4iv\n\nVertexAttribI1uivEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [1]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI1uiv\n\nVertexAttribI2uivEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [2]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI2uiv\n\nVertexAttribI3uivEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [3]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI3uiv\n\nVertexAttribI4uivEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt32 in array [4]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI4uiv\n\nVertexAttribI4bvEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt8 in array [4]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI4bv\n\nVertexAttribI4svEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tInt16 in array [4]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI4sv\n\nVertexAttribI4ubvEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt8 in array [4]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI4ubv\n\nVertexAttribI4usvEXT(index, v)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tv\t\tUInt16 in array [4]\n\tcategory\tNV_vertex_program4\n\tbeginend\tallow-inside\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribI4usv\n\nVertexAttribIPointerEXT(index, size, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tVertexAttribEnum in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride)] retained\n\tcategory\tNV_vertex_program4\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tVertexAttribIPointer\n\nGetVertexAttribIivEXT(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnum in value\n\tparam\t\tparams\t\tInt32 out array [1]\n\tcategory\tNV_vertex_program4\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tGetVertexAttribIiv\n\nGetVertexAttribIuivEXT(index, pname, params)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexAttribEnum in value\n\tparam\t\tparams\t\tUInt32 out array [1]\n\tcategory\tNV_vertex_program4\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tGetVertexAttribIuiv\n\n###############################################################################\n#\n# Extension #326\n# EXT_gpu_shader4 commands\n#\n###############################################################################\n\nGetUniformuivEXT(program, location, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tparams\t\tUInt32 out array [COMPSIZE(program/location)]\n\tcategory\tEXT_gpu_shader4\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tGetUniformuiv\n\nBindFragDataLocationEXT(program, color, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tcolor\t\tUInt32 in value\n\tparam\t\tname\t\tChar in array [COMPSIZE(name)]\n\tcategory\tEXT_gpu_shader4\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tBindFragDataLocation\n\nGetFragDataLocationEXT(program, name)\n\treturn\t\tInt32\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tname\t\tChar in array [COMPSIZE(name)]\n\tcategory\tEXT_gpu_shader4\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tGetFragDataLocation\n\nUniform1uiEXT(location, v0)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tcategory\tEXT_gpu_shader4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tUniform1ui\n\nUniform2uiEXT(location, v0, v1)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tparam\t\tv1\t\tUInt32 in value\n\tcategory\tEXT_gpu_shader4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tUniform2ui\n\nUniform3uiEXT(location, v0, v1, v2)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tparam\t\tv1\t\tUInt32 in value\n\tparam\t\tv2\t\tUInt32 in value\n\tcategory\tEXT_gpu_shader4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tUniform3ui\n\nUniform4uiEXT(location, v0, v1, v2, v3)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tparam\t\tv1\t\tUInt32 in value\n\tparam\t\tv2\t\tUInt32 in value\n\tparam\t\tv3\t\tUInt32 in value\n\tcategory\tEXT_gpu_shader4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tUniform4ui\n\nUniform1uivEXT(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count]\n\tcategory\tEXT_gpu_shader4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tUniform1uiv\n\nUniform2uivEXT(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count*2]\n\tcategory\tEXT_gpu_shader4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tUniform2uiv\n\nUniform3uivEXT(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count*3]\n\tcategory\tEXT_gpu_shader4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tUniform3uiv\n\nUniform4uivEXT(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count*4]\n\tcategory\tEXT_gpu_shader4\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tUniform4uiv\n\n###############################################################################\n#\n# Extension #327\n# EXT_draw_instanced commands\n#\n###############################################################################\n\nDrawArraysInstancedEXT(mode, start, count, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tstart\t\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tEXT_draw_instanced\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tvectorequiv\tArrayElement\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tDrawArraysInstancedARB\n\nDrawElementsInstancedEXT(mode, count, type, indices, primcount)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tBeginMode in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttype\t\tDrawElementsType in value\n\tparam\t\tindices\t\tVoid in array [COMPSIZE(count/type)]\n\tparam\t\tprimcount\tSizeI in value\n\tcategory\tEXT_draw_instanced\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tvectorequiv\tArrayElement\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tDrawElementsInstancedARB\n\n###############################################################################\n#\n# Extension #328\n# EXT_packed_float commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_packed_float\n\n###############################################################################\n#\n# Extension #329\n# EXT_texture_array commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_array\n\n###############################################################################\n#\n# Extension #330\n# EXT_texture_buffer_object commands\n#\n###############################################################################\n\nTexBufferEXT(target, internalformat, buffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tinternalformat\tGLenum in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tEXT_texture_buffer_object\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tTexBufferARB\n\n###############################################################################\n#\n# Extension #331\n# EXT_texture_compression_latc commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_compression_latc\n\n###############################################################################\n#\n# Extension #332\n# EXT_texture_compression_rgtc commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_compression_rgtc\n\n###############################################################################\n#\n# Extension #333\n# EXT_texture_shared_exponent commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_shared_exponent\n\n###############################################################################\n#\n# Extension #334\n# NV_depth_buffer_float commands\n#\n###############################################################################\n\nDepthRangedNV(zNear, zFar)\n\treturn\t\tvoid\n\tparam\t\tzNear\t\tFloat64 in value\n\tparam\t\tzFar\t\tFloat64 in value\n\tcategory\tNV_depth_buffer_float\n\textension\tsoft WINSOFT NV50\n\tversion\t\t2.0\n\tglfflags\tignore\n\tglxflags\tignore\n\nClearDepthdNV(depth)\n\treturn\t\tvoid\n\tparam\t\tdepth\t\tFloat64 in value\n\tcategory\tNV_depth_buffer_float\n\textension\tsoft WINSOFT NV50\n\tversion\t\t2.0\n\tglfflags\tignore\n\tglxflags\tignore\n\nDepthBoundsdNV(zmin, zmax)\n\treturn\t\tvoid\n\tparam\t\tzmin\t\tFloat64 in value\n\tparam\t\tzmax\t\tFloat64 in value\n\tcategory\tNV_depth_buffer_float\n\textension\tsoft WINSOFT NV50\n\tversion\t\t2.0\n\tglfflags\tignore\n\tglxflags\tignore\n\n###############################################################################\n#\n# Extension #335\n# NV_fragment_program4 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_fragment_program4\n\n###############################################################################\n#\n# Extension #336\n# NV_framebuffer_multisample_coverage commands\n#\n###############################################################################\n\nRenderbufferStorageMultisampleCoverageNV(target, coverageSamples, colorSamples, internalformat, width, height)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tRenderbufferTarget in value\n\tparam\t\tcoverageSamples SizeI in value\n\tparam\t\tcolorSamples\tSizeI in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tNV_framebuffer_multisample_coverage\n\tversion\t\t1.5\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\n###############################################################################\n#\n# Extension #337\n# EXT_framebuffer_sRGB commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_framebuffer_sRGB\n\n###############################################################################\n#\n# Extension #338\n# NV_geometry_shader4 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: NV_geometry_shader4\n\n###############################################################################\n#\n# Extension #339\n# NV_parameter_buffer_object commands\n#\n###############################################################################\n\nProgramBufferParametersfvNV(target, buffer, index, count, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tFloat32 in array [count]\n\tcategory\tNV_parameter_buffer_object\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramBufferParametersIivNV(target, buffer, index, count, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tInt32 in array [count]\n\tcategory\tNV_parameter_buffer_object\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nProgramBufferParametersIuivNV(target, buffer, index, count, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tUInt32 in array [count]\n\tcategory\tNV_parameter_buffer_object\n\tversion\t\t1.2\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\n###############################################################################\n#\n# Extension #340\n# EXT_draw_buffers2 commands\n#\n###############################################################################\n\nColorMaskIndexedEXT(index, r, g, b, a)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tr\t\tBoolean in value\n\tparam\t\tg\t\tBoolean in value\n\tparam\t\tb\t\tBoolean in value\n\tparam\t\ta\t\tBoolean in value\n\tcategory\tEXT_draw_buffers2\n\tversion\t\t2.0\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tColorMaski\n\nGetBooleanIndexedvEXT(target, index, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tdata\t\tBoolean out array [COMPSIZE(target)]\n\tcategory\tEXT_draw_buffers2\n\tversion\t\t2.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tGetBooleani_v\n\nGetIntegerIndexedvEXT(target, index, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tdata\t\tInt32 out array [COMPSIZE(target)]\n\tcategory\tEXT_draw_buffers2\n\tversion\t\t2.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tGetIntegeri_v\n\nEnableIndexedEXT(target, index)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tEXT_draw_buffers2\n\tversion\t\t2.0\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tEnablei\n\nDisableIndexedEXT(target, index)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tEXT_draw_buffers2\n\tversion\t\t2.0\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tDisablei\n\nIsEnabledIndexedEXT(target, index)\n\treturn\t\tBoolean\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tEXT_draw_buffers2\n\tversion\t\t2.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tIsEnabledi\n\n###############################################################################\n#\n# Extension #341\n# NV_transform_feedback commands\n#\n###############################################################################\n\nBeginTransformFeedbackNV(primitiveMode)\n\treturn\t\tvoid\n\tparam\t\tprimitiveMode\tGLenum in value\n\tcategory\tNV_transform_feedback\n\tversion\t\t1.5\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tBeginTransformFeedback\n\nEndTransformFeedbackNV()\n\treturn\t\tvoid\n\tcategory\tNV_transform_feedback\n\tversion\t\t1.5\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tEndTransformFeedback\n\nTransformFeedbackAttribsNV(count, attribs, bufferMode)\n\treturn\t\tvoid\n\tparam\t\tcount\t\tUInt32 in value\n\tparam\t\tattribs\t\tInt32 in array [COMPSIZE(count)]\n\tparam\t\tbufferMode\tGLenum in value\n\tcategory\tNV_transform_feedback\n\tversion\t\t1.5\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nBindBufferRangeNV(target, index, buffer, offset, size)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\toffset\t\tBufferOffset in value\n\tparam\t\tsize\t\tBufferSize in value\n\tcategory\tNV_transform_feedback\n\tversion\t\t1.5\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tBindBufferRange\n\nBindBufferOffsetNV(target, index, buffer, offset)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\toffset\t\tBufferOffset in value\n\tcategory\tNV_transform_feedback\n\tversion\t\t1.5\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tBindBufferOffsetEXT\n\nBindBufferBaseNV(target, index, buffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tNV_transform_feedback\n\tversion\t\t1.5\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tBindBufferBase\n\nTransformFeedbackVaryingsNV(program, count, varyings, bufferMode)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvaryings\tCharPointer in array [count]\n\tparam\t\tbufferMode\tGLenum in value\n\tcategory\tNV_transform_feedback\n\tversion\t\t1.5\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tTransformFeedbackVaryings\n\nActiveVaryingNV(program, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tname\t\tChar in array [COMPSIZE(name)]\n\tcategory\tNV_transform_feedback\n\tversion\t\t1.5\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nGetVaryingLocationNV(program, name)\n\treturn\t\tInt32\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tname\t\tChar in array [COMPSIZE(name)]\n\tcategory\tNV_transform_feedback\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\nGetActiveVaryingNV(program, index, bufSize, length, size, type, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tsize\t\tSizeI out array [1]\n\tparam\t\ttype\t\tGLenum out array [1]\n\tparam\t\tname\t\tChar out array [COMPSIZE(program/index/bufSize)]\n\tcategory\tNV_transform_feedback\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetTransformFeedbackVaryingNV(program, index, location)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 out array [1]\n\tcategory\tNV_transform_feedback\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tGetTransformFeedbackVarying\n\n###############################################################################\n#\n# Extension #342\n# EXT_bindable_uniform commands\n#\n###############################################################################\n\nUniformBufferEXT(program, location, buffer)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tEXT_bindable_uniform\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nGetUniformBufferSizeEXT(program, location)\n\treturn\t\tInt32\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tcategory\tEXT_bindable_uniform\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\nGetUniformOffsetEXT(program, location)\n\treturn\t\tBufferOffset\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tcategory\tEXT_bindable_uniform\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\n###############################################################################\n#\n# Extension #343\n# EXT_texture_integer extension commands\n#\n###############################################################################\n\nTexParameterIivEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tInt32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_texture_integer\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tTexParameterIiv\n\nTexParameterIuivEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tUInt32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_texture_integer\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tTexParameterIuiv\n\nGetTexParameterIivEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_texture_integer\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tGetTexParameterIiv\n\nGetTexParameterIuivEXT(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tUInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_texture_integer\n\tdlflags\t\tnotlistable\n\tversion\t\t1.0\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tGetTexParameterIuiv\n\nClearColorIiEXT(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tInt32 in value\n\tparam\t\tgreen\t\tInt32 in value\n\tparam\t\tblue\t\tInt32 in value\n\tparam\t\talpha\t\tInt32 in value\n\tcategory\tEXT_texture_integer\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\nClearColorIuiEXT(red, green, blue, alpha)\n\treturn\t\tvoid\n\tparam\t\tred\t\tUInt32 in value\n\tparam\t\tgreen\t\tUInt32 in value\n\tparam\t\tblue\t\tUInt32 in value\n\tparam\t\talpha\t\tUInt32 in value\n\tcategory\tEXT_texture_integer\n\tversion\t\t2.0\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\n###############################################################################\n#\n# Extension #344 - GLX_EXT_texture_from_pixmap\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #345\n# GREMEDY_frame_terminator commands\n#\n###############################################################################\n\nFrameTerminatorGREMEDY()\n\treturn\t\tvoid\n\tcategory\tGREMEDY_frame_terminator\n\tversion\t\t1.0\n\textension\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #346\n# NV_conditional_render commands\n#\n###############################################################################\n\nBeginConditionalRenderNV(id, mode)\n\treturn\t\tvoid\n\tparam\t\tid\t\tUInt32 in value\n\tparam\t\tmode\t\tTypeEnum in value\n\tcategory\tNV_conditional_render\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tBeginConditionalRender\n\nEndConditionalRenderNV()\n\treturn\t\tvoid\n\tcategory\tNV_conditional_render\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tEndConditionalRender\n\n###############################################################################\n#\n# Extension #347\n# NV_present_video commands\n#\n###############################################################################\n\n# TBD\n#    void PresentFrameKeyedNV(uint video_slot, uint64EXT minPresentTime,\n#\t\t\t      uint beginPresentTimeId, uint\n#\t\t\t      presentDurationId, enum type, enum target0,\n#\t\t\t      uint fill0, uint key0, enum target1, uint\n#\t\t\t      fill1, uint key1);\n#\n#    void PresentFrameDualFillNV(uint video_slot, uint64EXT\n#\t\t\t\t minPresentTime, uint beginPresentTimeId,\n#\t\t\t\t uint presentDurationId, enum type, enum\n#\t\t\t\t target0, uint fill0, enum target1, uint\n#\t\t\t\t fill1, enum target2, uint fill2, enum\n#\t\t\t\t target3, uint fill3);\n#\n#    void GetVideoivNV(uint video_slot, enum pname, int *params);\n#    void GetVideouivNV(uint video_slot, enum pname, uint *params);\n#    void GetVideoi64vNV(uint video_slot, enum pname, int64EXT *params);\n#    void GetVideoui64vNV(uint video_slot, enum pname, uint64EXT *params);\n#    void VideoParameterivNV(uint video_slot, enum pname, const int *params);\n\nPresentFrameKeyedNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, key0, target1, fill1, key1)\n\treturn\t\tvoid\n\tparam\t\tvideo_slot\tUInt32 in value\n\tparam\t\tminPresentTime\tUInt64EXT in value\n\tparam\t\tbeginPresentTimeId\tUInt32 in value\n\tparam\t\tpresentDurationId\tUInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\ttarget0\t\tGLenum in value\n\tparam\t\tfill0\t\tUInt32 in value\n\tparam\t\tkey0\t\tUInt32 in value\n\tparam\t\ttarget1\t\tGLenum in value\n\tparam\t\tfill1\t\tUInt32 in value\n\tparam\t\tkey1\t\tUInt32 in value\n\tcategory\tNV_present_video\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nPresentFrameDualFillNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, target1, fill1, target2, fill2, target3, fill3)\n\treturn\t\tvoid\n\tparam\t\tvideo_slot\tUInt32 in value\n\tparam\t\tminPresentTime\tUInt64EXT in value\n\tparam\t\tbeginPresentTimeId\tUInt32 in value\n\tparam\t\tpresentDurationId\tUInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\ttarget0\t\tGLenum in value\n\tparam\t\tfill0\t\tUInt32 in value\n\tparam\t\ttarget1\t\tGLenum in value\n\tparam\t\tfill1\t\tUInt32 in value\n\tparam\t\ttarget2\t\tGLenum in value\n\tparam\t\tfill2\t\tUInt32 in value\n\tparam\t\ttarget3\t\tGLenum in value\n\tparam\t\tfill3\t\tUInt32 in value\n\tcategory\tNV_present_video\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVideoivNV(video_slot, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvideo_slot\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tNV_present_video\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVideouivNV(video_slot, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvideo_slot\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tUInt32 out array [COMPSIZE(pname)]\n\tcategory\tNV_present_video\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVideoi64vNV(video_slot, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvideo_slot\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt64EXT out array [COMPSIZE(pname)]\n\tcategory\tNV_present_video\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVideoui64vNV(video_slot, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvideo_slot\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tUInt64EXT out array [COMPSIZE(pname)]\n\tcategory\tNV_present_video\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #348 - GLX_NV_video_out\n# Extension #349 - WGL_NV_video_out\n# Extension #350 - GLX_NV_swap_group\n# Extension #351 - WGL_NV_swap_group\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #352\n# EXT_transform_feedback commands\n#\n###############################################################################\n\n# From EXT_draw_buffers2:  GetBooleanIndexedvEXT / GetIntegerIndexedvEXT\n\nBeginTransformFeedbackEXT(primitiveMode)\n\treturn\t\tvoid\n\tparam\t\tprimitiveMode\tGLenum in value\n\tcategory\tEXT_transform_feedback\n\tversion\t\t2.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tBeginTransformFeedback\n\nEndTransformFeedbackEXT()\n\treturn\t\tvoid\n\tcategory\tEXT_transform_feedback\n\tversion\t\t2.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tEndTransformFeedback\n\nBindBufferRangeEXT(target, index, buffer, offset, size)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\toffset\t\tBufferOffset in value\n\tparam\t\tsize\t\tBufferSize in value\n\tcategory\tEXT_transform_feedback\n\tversion\t\t2.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tBindBufferRange\n\n# Not promoted to the OpenGL 3.0 core\nBindBufferOffsetEXT(target, index, buffer, offset)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\toffset\t\tBufferOffset in value\n\tcategory\tEXT_transform_feedback\n\tversion\t\t2.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nBindBufferBaseEXT(target, index, buffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tEXT_transform_feedback\n\tversion\t\t2.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tBindBufferBase\n\nTransformFeedbackVaryingsEXT(program, count, varyings, bufferMode)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvaryings\tCharPointer in array [count]\n\tparam\t\tbufferMode\tGLenum in value\n\tcategory\tEXT_transform_feedback\n\tversion\t\t2.0\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\talias\t\tTransformFeedbackVaryings\n\nGetTransformFeedbackVaryingEXT(program, index, bufSize, length, size, type, name)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tsize\t\tSizeI out array [1]\n\tparam\t\ttype\t\tGLenum out array [1]\n\tparam\t\tname\t\tChar out array [COMPSIZE(length)]\n\tcategory\tEXT_transform_feedback\n\tdlflags\t\tnotlistable\n\tversion\t\t2.0\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\talias\t\tGetTransformFeedbackVarying\n\n###############################################################################\n#\n# Extension #353\n# EXT_direct_state_access commands\n#\n###############################################################################\n\n# New 1.1 client commands\n\nClientAttribDefaultEXT(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tClientAttribMask in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglxflags\tignore ### client-handcode client-intercept server-handcode\n\nPushClientAttribDefaultEXT(mask)\n\treturn\t\tvoid\n\tparam\t\tmask\t\tClientAttribMask in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglxflags\tignore ### client-handcode client-intercept server-handcode\n\n# New 1.0 matrix commands\n\nMatrixLoadfEXT(mode, m)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tm\t\tFloat32 in array [16]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixLoaddEXT(mode, m)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tm\t\tFloat64 in array [16]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixMultfEXT(mode, m)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tm\t\tFloat32 in array [16]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixMultdEXT(mode, m)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tm\t\tFloat64 in array [16]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixLoadIdentityEXT(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixRotatefEXT(mode, angle, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tangle\t\tFloat32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixRotatedEXT(mode, angle, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tangle\t\tFloat64 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixScalefEXT(mode, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixScaledEXT(mode, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixTranslatefEXT(mode, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixTranslatedEXT(mode, x, y, z)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixFrustumEXT(mode, left, right, bottom, top, zNear, zFar)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tleft\t\tFloat64 in value\n\tparam\t\tright\t\tFloat64 in value\n\tparam\t\tbottom\t\tFloat64 in value\n\tparam\t\ttop\t\tFloat64 in value\n\tparam\t\tzNear\t\tFloat64 in value\n\tparam\t\tzFar\t\tFloat64 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixOrthoEXT(mode, left, right, bottom, top, zNear, zFar)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tleft\t\tFloat64 in value\n\tparam\t\tright\t\tFloat64 in value\n\tparam\t\tbottom\t\tFloat64 in value\n\tparam\t\ttop\t\tFloat64 in value\n\tparam\t\tzNear\t\tFloat64 in value\n\tparam\t\tzFar\t\tFloat64 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixPopEXT(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixPushEXT(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\n# New 1.3 matrix transpose commands\n\nMatrixLoadTransposefEXT(mode, m)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tm\t\tFloat32 in array [16]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixLoadTransposedEXT(mode, m)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tm\t\tFloat64 in array [16]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixMultTransposefEXT(mode, m)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tm\t\tFloat32 in array [16]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMatrixMultTransposedEXT(mode, m)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tMatrixMode in value\n\tparam\t\tm\t\tFloat64 in array [16]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\n# New 1.1 texture object commands\n\nTextureParameterfEXT(texture, target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\tvectorequiv\tTextureParameterfvEXT\n\nTextureParameterfvEXT(texture, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nTextureParameteriEXT(texture, target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\tvectorequiv\tTextureParameterivEXT\n\nTextureParameterivEXT(texture, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\textension\tsoft WINSOFT\n\tglfflags\tcapture-handcode decode-handcode pixel-unpack\n\nTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\textension\tsoft WINSOFT\n\tglfflags\tcapture-handcode decode-handcode pixel-unpack\n\nTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### EXT client-handcode server-handcode\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\nTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### EXT client-handcode server-handcode\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\nCopyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore ### EXT\n\nCopyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore ### EXT\n\nCopyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore ### EXT\n\nCopyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore ### EXT\n\n# New 1.1 texture object queries\n\nGetTextureImageEXT(texture, target, level, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid out array [COMPSIZE(target/level/format/type)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\tglxflags\tignore ### client-handcode server-handcode\n\textension\tsoft WINSOFT\n\tglfflags\tcapture-execute capture-handcode decode-handcode pixel-pack\n\nGetTextureParameterfvEXT(texture, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\nGetTextureParameterivEXT(texture, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\nGetTextureLevelParameterfvEXT(texture, target, level, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\nGetTextureLevelParameterivEXT(texture, target, level, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\n# New 1.2 3D texture object commands\n\nTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height/depth)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode EXT\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\nTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height/depth)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode EXT\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\nCopyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_direct_state_access\n\tglxflags\tignore ### EXT\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\n# New 1.1 multitexture commands\n\nMultiTexParameterfEXT(texunit, target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\tvectorequiv\tMultiTexParameterfvEXT\n\nMultiTexParameterfvEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMultiTexParameteriEXT(texunit, target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\tvectorequiv\tMultiTexParameterivEXT\n\nMultiTexParameterivEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\nMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\textension\tsoft WINSOFT\n\tglfflags\tcapture-handcode decode-handcode pixel-unpack\n\nMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\textension\tsoft WINSOFT\n\tglfflags\tcapture-handcode decode-handcode pixel-unpack\n\nMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### EXT client-handcode server-handcode\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\nMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### EXT client-handcode server-handcode\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\nCopyMultiTexImage1DEXT(texunit, target, level, internalformat, x, y, width, border)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore ### EXT\n\nCopyMultiTexImage2DEXT(texunit, target, level, internalformat, x, y, width, height, border)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore ### EXT\n\nCopyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore ### EXT\n\nCopyMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore ### EXT\n\n# New 1.1 multitexture queries\n\nGetMultiTexImageEXT(texunit, target, level, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid out array [COMPSIZE(target/level/format/type)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\tglxflags\tignore ### client-handcode server-handcode\n\textension\tsoft WINSOFT\n\tglfflags\tcapture-execute capture-handcode decode-handcode pixel-pack\n\nGetMultiTexParameterfvEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\nGetMultiTexParameterivEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\nGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\nGetMultiTexLevelParameterivEXT(texunit, target, level, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\n# New 1.2 3D multitexture commands\n\nMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height/depth)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode EXT\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\nMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\ttype\t\tPixelType in value\n\tparam\t\tpixels\t\tVoid in array [COMPSIZE(format/type/width/height/depth)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode EXT\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\nCopyMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\tx\t\tWinCoord in value\n\tparam\t\ty\t\tWinCoord in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_direct_state_access\n\tglxflags\tignore ### EXT\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\n# New 1.2.1 multitexture texture commands\n\nBindMultiTextureEXT(texunit, target, texture)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\ttexture\t\tTexture in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore ### EXT\n\nEnableClientStateIndexedEXT(array, index)\n\treturn\t\tvoid\n\tparam\t\tarray\t\tEnableCap in value\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\tglxflags\tignore ### client-handcode client-intercept server-handcode\n\textension\tsoft WINSOFT\n\nDisableClientStateIndexedEXT(array, index)\n\treturn\t\tvoid\n\tparam\t\tarray\t\tEnableCap in value\n\tparam\t\tindex\t\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglxflags\tignore ### client-handcode client-intercept server-handcode\n\nMultiTexCoordPointerEXT(texunit, size, type, stride, pointer)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tTexCoordPointerType in value\n\tparam\t\tstride\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [COMPSIZE(size/type/stride)] retained\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\tglxflags\tignore ### client-handcode client-intercept server-handcode\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\nMultiTexEnvfEXT(texunit, target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tvectorequiv\tMultiTexEnvfvEXT\n\tglxflags\tignore\n\tglfflags\tgl-enum\n\nMultiTexEnvfvEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tgl-enum\n\nMultiTexEnviEXT(texunit, target, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tvectorequiv\tMultiTexEnvivEXT\n\tglxflags\tignore\n\tglfflags\tgl-enum\n\nMultiTexEnvivEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tgl-enum\n\nMultiTexGendEXT(texunit, coord, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparam\t\tFloat64 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tvectorequiv\tMultiTexGendvEXT\n\tglxflags\tignore\n\tglfflags\tgl-enum\n\nMultiTexGendvEXT(texunit, coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tFloat64 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tgl-enum\n\nMultiTexGenfEXT(texunit, coord, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparam\t\tCheckedFloat32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tvectorequiv\tMultiTexGenfvEXT\n\tglxflags\tignore\n\tglfflags\tgl-enum\n\nMultiTexGenfvEXT(texunit, coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tCheckedFloat32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tgl-enum\n\nMultiTexGeniEXT(texunit, coord, pname, param)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparam\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tvectorequiv\tMultiTexGenivEXT\n\tglxflags\tignore\n\tglfflags\tgl-enum\n\nMultiTexGenivEXT(texunit, coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tgl-enum\n\n# New 1.2.1 multitexture texture queries\n\nGetMultiTexEnvfvEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\nGetMultiTexEnvivEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureEnvTarget in value\n\tparam\t\tpname\t\tTextureEnvParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\nGetMultiTexGendvEXT(texunit, coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tFloat64 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\nGetMultiTexGenfvEXT(texunit, coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\nGetMultiTexGenivEXT(texunit, coord, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\tcoord\t\tTextureCoordName in value\n\tparam\t\tpname\t\tTextureGenParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\n# From EXT_draw_buffers2\n# EnableIndexedEXT\n# DisableIndexedEXT\n# IsEnabledIndexedEXT\n\nGetFloatIndexedvEXT(target, index, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTypeEnum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tdata\t\tFloat32 out array [COMPSIZE(target)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nGetDoubleIndexedvEXT(target, index, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTypeEnum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tdata\t\tFloat64 out array [COMPSIZE(target)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nGetPointerIndexedvEXT(target, index, data)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTypeEnum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tdata\t\tVoidPointer out array [COMPSIZE(target)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\n# New compressed texture commands\n\nCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nCompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nCompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nCompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\n# New compressed texture query\n\nGetCompressedTextureImageEXT(texture, target, lod, img)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlod\t\tCheckedInt32 in value\n\tparam\t\timg\t\tVoid out array [COMPSIZE(target/lod)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\tglxflags\tignore ### server-handcode\n\textension\tsoft WINSOFT\n\n# New compressed multitexture commands\n\nCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tinternalformat\tTextureInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tborder\t\tCheckedInt32 in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\tyoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\nCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, bits)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\txoffset\t\tCheckedInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\tformat\t\tPixelFormat in value\n\tparam\t\timageSize\tSizeI in value\n\tparam\t\tbits\t\tVoid in array [imageSize]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\thandcode\n\tglxflags\tignore ### client-handcode server-handcode\n\tglfflags\tignore\n\textension\tsoft WINSOFT\n\n# New compressed multitexture query\n\nGetCompressedMultiTexImageEXT(texunit, target, lod, img)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tlod\t\tCheckedInt32 in value\n\tparam\t\timg\t\tVoid out array [COMPSIZE(target/lod)]\n\tcategory\tEXT_direct_state_access\n\tdlflags\t\tnotlistable\n\tglxflags\tignore ### server-handcode\n\textension\tsoft WINSOFT\n\n# New ARB assembly program named commands\n\nNamedProgramStringEXT(program, target, format, len, string)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tformat\t\tProgramFormat in value\n\tparam\t\tlen\t\tSizeI in value\n\tparam\t\tstring\t\tVoid in array [len]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tARB_vertex_program\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore ### client-handcode server-handcode EXT\n\tglextmask\tGL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program\n\nNamedProgramLocalParameter4dEXT(program, target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat64 in value\n\tparam\t\ty\t\tFloat64 in value\n\tparam\t\tz\t\tFloat64 in value\n\tparam\t\tw\t\tFloat64 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tARB_vertex_program\n\tvectorequiv\tNamedProgramLocalParameter4dvEXT\n\tglxvectorequiv\tNamedProgramLocalParameter4dvEXT\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore ### EXT\n\tglextmask\tGL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program\n\nNamedProgramLocalParameter4dvEXT(program, target, index, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat64 in array [4]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tARB_vertex_program\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore ### EXT\n\tglextmask\tGL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program\n\nNamedProgramLocalParameter4fEXT(program, target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tFloat32 in value\n\tparam\t\ty\t\tFloat32 in value\n\tparam\t\tz\t\tFloat32 in value\n\tparam\t\tw\t\tFloat32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tARB_vertex_program\n\tvectorequiv\tNamedProgramLocalParameter4fvEXT\n\tglxvectorequiv\tNamedProgramLocalParameter4fvEXT\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore ### EXT\n\tglextmask\tGL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program\n\nNamedProgramLocalParameter4fvEXT(program, target, index, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat32 in array [4]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tARB_vertex_program\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore ### EXT\n\tglextmask\tGL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program\n\n# New ARB assembly program named queries\n\nGetNamedProgramLocalParameterdvEXT(program, target, index, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat64 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tARB_vertex_program\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore ### client-handcode server-handcode EXT\n\tglextmask\tGL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program\n\nGetNamedProgramLocalParameterfvEXT(program, target, index, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tFloat32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tARB_vertex_program\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore ### client-handcode server-handcode EXT\n\tglextmask\tGL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program\n\nGetNamedProgramivEXT(program, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tpname\t\tProgramProperty in value\n\tparam\t\tparams\t\tInt32 out array [1]\n\tdlflags\t\tnotlistable\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tARB_vertex_program\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore ### client-handcode server-handcode EXT\n\tglextmask\tGL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program\n\nGetNamedProgramStringEXT(program, target, pname, string)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tpname\t\tProgramStringProperty in value\n\tparam\t\tstring\t\tVoid out array [COMPSIZE(program,pname)]\n\tdlflags\t\tnotlistable\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tARB_vertex_program\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore ### client-handcode server-handcode EXT\n\tglextmask\tGL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program\n\n# New EXT_gpu_program_parameters command\n\nNamedProgramLocalParameters4fvEXT(program, target, index, count, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tFloat32 in array [count*4]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_gpu_program_parameters\n\textension\tsoft WINSOFT NV10\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_gpu_program_parameters\n\n# New NV_gpu_program4 commands\n\nNamedProgramLocalParameterI4iEXT(program, target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tInt32 in value\n\tparam\t\ty\t\tInt32 in value\n\tparam\t\tz\t\tInt32 in value\n\tparam\t\tw\t\tInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_gpu_program4\n\tvectorequiv\tNamedProgramLocalParameterI4ivEXT\n\tglxvectorequiv\tNamedProgramLocalParameterI4ivEXT\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_gpu_program4\n\nNamedProgramLocalParameterI4ivEXT(program, target, index, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tInt32 in array [4]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_gpu_program4\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_gpu_program4\n\nNamedProgramLocalParametersI4ivEXT(program, target, index, count, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tInt32 in array [count*4]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_gpu_program4\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_gpu_program4\n\nNamedProgramLocalParameterI4uiEXT(program, target, index, x, y, z, w)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tx\t\tUInt32 in value\n\tparam\t\ty\t\tUInt32 in value\n\tparam\t\tz\t\tUInt32 in value\n\tparam\t\tw\t\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_gpu_program4\n\tvectorequiv\tNamedProgramLocalParameterI4uivEXT\n\tglxvectorequiv\tNamedProgramLocalParameterI4uivEXT\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_gpu_program4\n\nNamedProgramLocalParameterI4uivEXT(program, target, index, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tUInt32 in array [4]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_gpu_program4\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_gpu_program4\n\nNamedProgramLocalParametersI4uivEXT(program, target, index, count, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tparams\t\tUInt32 in array [count*4]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_gpu_program4\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_gpu_program4\n\nGetNamedProgramLocalParameterIivEXT(program, target, index, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tInt32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_gpu_program4\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_gpu_program4\n\nGetNamedProgramLocalParameterIuivEXT(program, target, index, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\ttarget\t\tProgramTarget in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tparams\t\tUInt32 out array [4]\n\tdlflags\t\tnotlistable\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_gpu_program4\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_gpu_program4\n\n# New EXT_texture_integer texture object commands\n\nTextureParameterIivEXT(texture, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_texture_integer\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\tglextmask\tGL_MASK_EXT_texture_integer\n\nTextureParameterIuivEXT(texture, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tUInt32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_texture_integer\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\tglextmask\tGL_MASK_EXT_texture_integer\n\n# New EXT_texture_integer texture object queries\n\nGetTextureParameterIivEXT(texture, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_texture_integer\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\tglextmask\tGL_MASK_EXT_texture_integer\n\nGetTextureParameterIuivEXT(texture, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tUInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_texture_integer\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\tglextmask\tGL_MASK_EXT_texture_integer\n\n# New EXT_texture_integer multitexture commands\n\nMultiTexParameterIivEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tCheckedInt32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_texture_integer\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\tglextmask\tGL_MASK_EXT_texture_integer\n\nMultiTexParameterIuivEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tTextureParameterName in value\n\tparam\t\tparams\t\tUInt32 in array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_texture_integer\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tignore\n\tglextmask\tGL_MASK_EXT_texture_integer\n\n# New EXT_texture_integer multitexture queries\n\nGetMultiTexParameterIivEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_texture_integer\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglfflags\tcapture-execute gl-enum\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_texture_integer\n\nGetMultiTexParameterIuivEXT(texunit, target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tpname\t\tGetTextureParameter in value\n\tparam\t\tparams\t\tUInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_texture_integer\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglfflags\tcapture-execute gl-enum\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_texture_integer\n\n# New GLSL 2.0 uniform commands\n\nProgramUniform1fEXT(program, location, v0)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform2fEXT(program, location, v0, v1)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tparam\t\tv1\t\tFloat32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform3fEXT(program, location, v0, v1, v2)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tparam\t\tv1\t\tFloat32 in value\n\tparam\t\tv2\t\tFloat32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform4fEXT(program, location, v0, v1, v2, v3)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tFloat32 in value\n\tparam\t\tv1\t\tFloat32 in value\n\tparam\t\tv2\t\tFloat32 in value\n\tparam\t\tv3\t\tFloat32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform1iEXT(program, location, v0)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform2iEXT(program, location, v0, v1)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tparam\t\tv1\t\tInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform3iEXT(program, location, v0, v1, v2)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tparam\t\tv1\t\tInt32 in value\n\tparam\t\tv2\t\tInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform4iEXT(program, location, v0, v1, v2, v3)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tInt32 in value\n\tparam\t\tv1\t\tInt32 in value\n\tparam\t\tv2\t\tInt32 in value\n\tparam\t\tv3\t\tInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform1fvEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform2fvEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count*2]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform3fvEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count*3]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform4fvEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tFloat32 in array [count*4]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform1ivEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform2ivEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count*2]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform3ivEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count*3]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform4ivEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tInt32 in array [count*4]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniformMatrix2fvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count*4]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniformMatrix3fvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count*9]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniformMatrix4fvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count*16]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_0\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\n# New GLSL 2.1 uniform commands\n\nProgramUniformMatrix2x3fvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count*6]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_1\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniformMatrix3x2fvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count*6]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_1\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniformMatrix2x4fvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count*8]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_1\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniformMatrix4x2fvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count*8]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_1\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniformMatrix3x4fvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count*12]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_1\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniformMatrix4x3fvEXT(program, location, count, transpose, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\ttranspose\tBoolean in value\n\tparam\t\tvalue\t\tFloat32 in array [count*12]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tVERSION_2_1\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\n# New EXT_gpu_shader4 commands\n\nProgramUniform1uiEXT(program, location, v0)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_gpu_shader4\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform2uiEXT(program, location, v0, v1)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tparam\t\tv1\t\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_gpu_shader4\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform3uiEXT(program, location, v0, v1, v2)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tparam\t\tv1\t\tUInt32 in value\n\tparam\t\tv2\t\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_gpu_shader4\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform4uiEXT(program, location, v0, v1, v2, v3)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tv0\t\tUInt32 in value\n\tparam\t\tv1\t\tUInt32 in value\n\tparam\t\tv2\t\tUInt32 in value\n\tparam\t\tv3\t\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_gpu_shader4\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform1uivEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_gpu_shader4\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform2uivEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count*2]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_gpu_shader4\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform3uivEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count*3]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_gpu_shader4\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\nProgramUniform4uivEXT(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt32 in array [count*4]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_gpu_shader4\n\tglfflags\tignore\n\tglxflags\tignore\n\textension\tsoft WINSOFT\n\tglextmask\tGL_MASK_OpenGL_2_0\n\n# New named buffer commands\n\nNamedBufferDataEXT(buffer, size, data, usage)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\tsize\t\tSizeiptr in value\n\tparam\t\tdata\t\tVoid in array [COMPSIZE(size)]\n\tparam\t\tusage\t\tVertexBufferObjectUsage in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nNamedBufferSubDataEXT(buffer, offset, size, data)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\toffset\t\tIntptr in value\n\tparam\t\tsize\t\tSizeiptr in value\n\tparam\t\tdata\t\tVoid in array [COMPSIZE(size)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nMapNamedBufferEXT(buffer, access)\n\treturn\t\tVoidPointer\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\taccess\t\tVertexBufferObjectAccess in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nUnmapNamedBufferEXT(buffer)\n\treturn\t\tBoolean\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\n# New named buffer queries\n\nGetNamedBufferParameterivEXT(buffer, pname, params)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexBufferObjectParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nGetNamedBufferPointervEXT(buffer, pname, params)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\tpname\t\tVertexBufferObjectParameter in value\n\tparam\t\tparams\t\tVoidPointer out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\nGetNamedBufferSubDataEXT(buffer, offset, size, data)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\toffset\t\tIntptr in value\n\tparam\t\tsize\t\tSizeiptr in value\n\tparam\t\tdata\t\tVoid out array [COMPSIZE(size)]\n\tcategory\tEXT_direct_state_access\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglxflags\tignore\n\tglfflags\tignore\n\n# New named texture buffer texture object command\n\nTextureBufferEXT(texture, target, internalformat, buffer)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tinternalformat\tTypeEnum in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_texture_buffer_object\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_texture_buffer_object\n\tdlflags\t\tnotlistable\n\n# New named texture buffer multitexture command\n\nMultiTexBufferEXT(texunit, target, internalformat, buffer)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\tinternalformat\tTypeEnum in value\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_texture_buffer_object\n\textension\tsoft WINSOFT NV50\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_texture_buffer_object\n\tdlflags\t\tnotlistable\n\n# New named frame buffer object commands\n\nNamedRenderbufferStorageEXT(renderbuffer, internalformat, width, height)\n\treturn\t\tvoid\n\tparam\t\trenderbuffer\tRenderbuffer in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nGetNamedRenderbufferParameterivEXT(renderbuffer, pname, params)\n\treturn\t\tvoid\n\tparam\t\trenderbuffer\tRenderbuffer in value\n\tparam\t\tpname\t\tRenderbufferParameterName in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nCheckNamedFramebufferStatusEXT(framebuffer, target)\n\treturn\t\tFramebufferStatus\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\ttarget\t\tFramebufferTarget in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttextarget\tTextureTarget in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nNamedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttextarget\tTextureTarget in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttextarget\tTextureTarget in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tzoffset\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\trenderbuffertarget RenderbufferTarget in value\n\tparam\t\trenderbuffer\tRenderbuffer in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, params)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\tpname\t\tFramebufferAttachmentParameterName in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nGenerateTextureMipmapEXT(texture, target)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nGenerateMultiTexMipmapEXT(texunit, target)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nFramebufferDrawBufferEXT(framebuffer, mode)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tmode\t\tDrawBufferMode in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nFramebufferDrawBuffersEXT(framebuffer, n, bufs)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tbufs\t\tDrawBufferMode in array [n]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nFramebufferReadBufferEXT(framebuffer, mode)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tmode\t\tReadBufferMode in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\textension\tsoft WINSOFT\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_object\n\nGetFramebufferParameterivEXT(framebuffer, pname, params)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tpname\t\tGetFramebufferParameter in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_object\n\tdlflags\t\tnotlistable\n\textension\tsoft WINSOFT\n\tglxflags\tignore\n\tglfflags\tcapture-execute gl-enum\n\n# New named framebuffer multisample object commands\n\nNamedRenderbufferStorageMultisampleEXT(renderbuffer, samples, internalformat, width, height)\n\treturn\t\tvoid\n\tparam\t\trenderbuffer\tRenderbuffer in value\n\tparam\t\tsamples\t\tSizeI in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tEXT_framebuffer_multisample\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_EXT_framebuffer_multisample\n\n# New named framebuffer multisample coverage object commands\n\nNamedRenderbufferStorageMultisampleCoverageEXT(renderbuffer, coverageSamples, colorSamples, internalformat, width, height)\n\treturn\t\tvoid\n\tparam\t\trenderbuffer\tRenderbuffer in value\n\tparam\t\tcoverageSamples SizeI in value\n\tparam\t\tcolorSamples\tSizeI in value\n\tparam\t\tinternalformat\tPixelInternalFormat in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_framebuffer_multisample_coverage\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_framebuffer_multisample_coverage\n\n# New named geometry program/shader frame buffer object commands\n\nNamedFramebufferTextureEXT(framebuffer, attachment, texture, level)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_gpu_program4\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_gpu_program4\n\nNamedFramebufferTextureLayerEXT(framebuffer, attachment, texture, level, layer)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tlayer\t\tCheckedInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_gpu_program4\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_gpu_program4\n\nNamedFramebufferTextureFaceEXT(framebuffer, attachment, texture, level, face)\n\treturn\t\tvoid\n\tparam\t\tframebuffer\tFramebuffer in value\n\tparam\t\tattachment\tFramebufferAttachment in value\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\tlevel\t\tCheckedInt32 in value\n\tparam\t\tface\t\tTextureTarget in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_gpu_program4\n\textension\tsoft WINSOFT\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_gpu_program4\n\n# New explicit multisample query and commands\n\nTextureRenderbufferEXT(texture, target, renderbuffer)\n\treturn\t\tvoid\n\tparam\t\ttexture\t\tTexture in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\trenderbuffer\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_explicit_multisample\n\textension\tsoft WINSOFT NV50\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_explicit_multisample\n\nMultiTexRenderbufferEXT(texunit, target, renderbuffer)\n\treturn\t\tvoid\n\tparam\t\ttexunit\t\tTextureUnit in value\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\trenderbuffer\tUInt32 in value\n\tcategory\tEXT_direct_state_access\n\tsubcategory\tNV_explicit_multisample\n\textension\tsoft WINSOFT NV50\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\tglextmask\tGL_MASK_NV_explicit_multisample\n\n###############################################################################\n#\n# Extension #354\n# EXT_vertex_array_bgra commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_vertex_array_bgra\n\n###############################################################################\n#\n# Extension #355 - WGL_NV_gpu_affinity\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #356\n# EXT_texture_swizzle commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_swizzle\n\n###############################################################################\n#\n# Extension #357\n# NV_explicit_multisample commands\n#\n###############################################################################\n\n# From EXT_draw_buffers2:  GetBooleanIndexedvEXT / GetIntegerIndexedvEXT\n\nGetMultisamplefvNV(pname, index, val)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGetMultisamplePNameNV in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tval\t\tFloat32 out array [2]\n\tcategory\tNV_explicit_multisample\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\nSampleMaskIndexedNV(index, mask)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tmask\t\tSampleMaskNV in value\n\tcategory\tNV_explicit_multisample\n\tglfflags\tignore\n\tglxflags\tignore\n\nTexRenderbufferNV(target, renderbuffer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tTextureTarget in value\n\tparam\t\trenderbuffer\tUInt32 in value\n\tcategory\tNV_explicit_multisample\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\n###############################################################################\n#\n# Extension #358\n# NV_transform_feedback2 commands\n#\n###############################################################################\n\nBindTransformFeedbackNV(target, id)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tBufferTargetARB in value\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tNV_transform_feedback2\n\tglfflags\tignore\n\tglxflags\tignore\n\nDeleteTransformFeedbacksNV(n, ids)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tids\t\tUInt32 in array [n]\n\tcategory\tNV_transform_feedback2\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\nGenTransformFeedbacksNV(n, ids)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tids\t\tUInt32 out array [n]\n\tcategory\tNV_transform_feedback2\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\nIsTransformFeedbackNV(id)\n\treturn\t\tBoolean\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tNV_transform_feedback2\n\tdlflags\t\tnotlistable\n\tglfflags\tignore\n\tglxflags\tignore\n\nPauseTransformFeedbackNV()\n\treturn\t\tvoid\n\tcategory\tNV_transform_feedback2\n\tglfflags\tignore\n\tglxflags\tignore\n\nResumeTransformFeedbackNV()\n\treturn\t\tvoid\n\tcategory\tNV_transform_feedback2\n\tglfflags\tignore\n\tglxflags\tignore\n\nDrawTransformFeedbackNV(mode, id)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tparam\t\tid\t\tUInt32 in value\n\tcategory\tNV_transform_feedback2\n\tglfflags\tignore\n\tglxflags\tignore\n\n###############################################################################\n#\n# Extension #359\n# ATI_meminfo commands\n#\n###############################################################################\n\n# (none)\nnewcategory: ATI_meminfo\n\n###############################################################################\n#\n# Extension #360\n# AMD_performance_monitor commands\n#\n###############################################################################\n\nGetPerfMonitorGroupsAMD(numGroups, groupsSize, groups)\n\treturn\t\tvoid\n\tparam\t\tnumGroups\tInt32 out array [1]\n\tparam\t\tgroupsSize\tSizeI in value\n\tparam\t\tgroups\t\tUInt32 out array [groupsSize]\n\tcategory\tAMD_performance_monitor\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetPerfMonitorCountersAMD(group, numCounters, maxActiveCounters, counterSize, counters)\n\treturn\t\tvoid\n\tparam\t\tgroup\t\tUInt32 in value\n\tparam\t\tnumCounters\tInt32 out array [1]\n\tparam\t\tmaxActiveCounters Int32 out array [1]\n\tparam\t\tcounterSize\tSizeI in value\n\tparam\t\tcounters\tUInt32 out array [counterSize]\n\tcategory\tAMD_performance_monitor\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetPerfMonitorGroupStringAMD(group, bufSize, length, groupString)\n\treturn\t\tvoid\n\tparam\t\tgroup\t\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tgroupString\tChar out array [bufSize]\n\tcategory\tAMD_performance_monitor\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetPerfMonitorCounterStringAMD(group, counter, bufSize, length, counterString)\n\treturn\t\tvoid\n\tparam\t\tgroup\t\tUInt32 in value\n\tparam\t\tcounter\t\tUInt32 in value\n\tparam\t\tbufSize\t\tSizeI in value\n\tparam\t\tlength\t\tSizeI out array [1]\n\tparam\t\tcounterString\tChar out array [bufSize]\n\tcategory\tAMD_performance_monitor\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetPerfMonitorCounterInfoAMD(group, counter, pname, data)\n\treturn\t\tvoid\n\tparam\t\tgroup\t\tUInt32 in value\n\tparam\t\tcounter\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tdata\t\tvoid out array [COMPSIZE(pname)]\n\tcategory\tAMD_performance_monitor\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGenPerfMonitorsAMD(n, monitors)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tmonitors\tUInt32 out array [n]\n\tcategory\tAMD_performance_monitor\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n# 'monitors' is actually in, not out, but extension spec doesn't use const\nDeletePerfMonitorsAMD(n, monitors)\n\treturn\t\tvoid\n\tparam\t\tn\t\tSizeI in value\n\tparam\t\tmonitors\tUInt32 out array [n]\n\tcategory\tAMD_performance_monitor\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n# 'counterList' is actually in, not out, but extension spec doesn't use const\nSelectPerfMonitorCountersAMD(monitor, enable, group, numCounters, counterList)\n\treturn\t\tvoid\n\tparam\t\tmonitor\t\tUInt32 in value\n\tparam\t\tenable\t\tBoolean in value\n\tparam\t\tgroup\t\tUInt32 in value\n\tparam\t\tnumCounters\tInt32 in value\n\tparam\t\tcounterList\tUInt32 out array [numCounters]\n\tcategory\tAMD_performance_monitor\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBeginPerfMonitorAMD(monitor)\n\treturn\t\tvoid\n\tparam\t\tmonitor\t\tUInt32 in value\n\tcategory\tAMD_performance_monitor\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nEndPerfMonitorAMD(monitor)\n\treturn\t\tvoid\n\tparam\t\tmonitor\t\tUInt32 in value\n\tcategory\tAMD_performance_monitor\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetPerfMonitorCounterDataAMD(monitor, pname, dataSize, data, bytesWritten)\n\treturn\t\tvoid\n\tparam\t\tmonitor\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tdataSize\tSizeI in value\n\tparam\t\tdata\t\tUInt32 out array [dataSize]\n\tparam\t\tbytesWritten\tInt32 out array [1]\n\tcategory\tAMD_performance_monitor\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #361 - WGL_AMD_gpu_association\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #362\n# AMD_texture_texture4 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: AMD_texture_texture4\n\n###############################################################################\n#\n# Extension #363\n# AMD_vertex_shader_tesselator commands\n#\n###############################################################################\n\nTessellationFactorAMD(factor)\n\treturn\t\tvoid\n\tparam\t\tfactor\t\tFloat32 in value\n\tcategory\tAMD_vertex_shader_tesselator\n\tversion\t\t2.0\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTessellationModeAMD(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tcategory\tAMD_vertex_shader_tesselator\n\tversion\t\t2.0\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #364\n# EXT_provoking_vertex commands\n#\n###############################################################################\n\nProvokingVertexEXT(mode)\n\treturn\t\tvoid\n\tparam\t\tmode\t\tGLenum in value\n\tcategory\tEXT_provoking_vertex\n\tversion\t\t2.1\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #365\n# EXT_texture_snorm commands\n#\n###############################################################################\n\n# (none)\nnewcategory: EXT_texture_snorm\n\n###############################################################################\n#\n# Extension #366\n# AMD_draw_buffers_blend commands\n#\n###############################################################################\n\n# void BlendFuncIndexedAMD(uint buf, enum src, enum dst)\n# void BlendFuncSeparateIndexedAMD(uint buf, enum srcRGB, enum dstRGB, enum srcAlpha, enum dstAlpha)\n# void BlendEquationIndexedAMD(uint buf, enum mode)\n# void BlendEquationSeparateIndexedAMD(uint buf, enum modeRGB, enum modeAlpha)\n\nBlendFuncIndexedAMD(buf, src, dst)\n\treturn\t\tvoid\n\tparam\t\tbuf\t\tUInt32 in value\n\tparam\t\tsrc\t\tGLenum in value\n\tparam\t\tdst\t\tGLenum in value\n\tcategory\tAMD_draw_buffers_blend\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBlendFuncSeparateIndexedAMD(buf, srcRGB, dstRGB, srcAlpha, dstAlpha)\n\treturn\t\tvoid\n\tparam\t\tbuf\t\tUInt32 in value\n\tparam\t\tsrcRGB\t\tGLenum in value\n\tparam\t\tdstRGB\t\tGLenum in value\n\tparam\t\tsrcAlpha\tGLenum in value\n\tparam\t\tdstAlpha\tGLenum in value\n\tcategory\tAMD_draw_buffers_blend\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBlendEquationIndexedAMD(buf, mode)\n\treturn\t\tvoid\n\tparam\t\tbuf\t\tUInt32 in value\n\tparam\t\tmode\t\tGLenum in value\n\tcategory\tAMD_draw_buffers_blend\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBlendEquationSeparateIndexedAMD(buf, modeRGB, modeAlpha)\n\treturn\t\tvoid\n\tparam\t\tbuf\t\tUInt32 in value\n\tparam\t\tmodeRGB\t\tGLenum in value\n\tparam\t\tmodeAlpha\tGLenum in value\n\tcategory\tAMD_draw_buffers_blend\n\tversion\t\t2.0\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #367\n# APPLE_texture_range commands\n#\n###############################################################################\n\nTextureRangeAPPLE(target, length, pointer)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tlength\t\tSizeI in value\n\tparam\t\tpointer\t\tVoid in array [length]\n\tcategory\tAPPLE_texture_range\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetTexParameterPointervAPPLE(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tVoidPointer out array [1]\n\tcategory\tAPPLE_texture_range\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #368\n# APPLE_float_pixels commands\n#\n###############################################################################\n\n# (none)\nnewcategory: APPLE_float_pixels\n\n###############################################################################\n#\n# Extension #369\n# APPLE_vertex_program_evaluators commands\n#\n###############################################################################\n\nEnableVertexAttribAPPLE(index, pname)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tcategory\tAPPLE_vertex_program_evaluators\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nDisableVertexAttribAPPLE(index, pname)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tcategory\tAPPLE_vertex_program_evaluators\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIsVertexAttribEnabledAPPLE(index, pname)\n\treturn\t\tBoolean\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tcategory\tAPPLE_vertex_program_evaluators\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMapVertexAttrib1dAPPLE(index, size, u1, u2, stride, order, points)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tsize\t\tUInt32 in value\n\tparam\t\tu1\t\tCoordD in value\n\tparam\t\tu2\t\tCoordD in value\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\torder\t\tCheckedInt32 in value\n\tparam\t\tpoints\t\tCoordD in array [COMPSIZE(size/stride/order)]\n\tcategory\tAPPLE_vertex_program_evaluators\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMapVertexAttrib1fAPPLE(index, size, u1, u2, stride, order, points)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tsize\t\tUInt32 in value\n\tparam\t\tu1\t\tCoordF in value\n\tparam\t\tu2\t\tCoordF in value\n\tparam\t\tstride\t\tInt32 in value\n\tparam\t\torder\t\tCheckedInt32 in value\n\tparam\t\tpoints\t\tCoordF in array [COMPSIZE(size/stride/order)]\n\tcategory\tAPPLE_vertex_program_evaluators\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMapVertexAttrib2dAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tsize\t\tUInt32 in value\n\tparam\t\tu1\t\tCoordD in value\n\tparam\t\tu2\t\tCoordD in value\n\tparam\t\tustride\t\tInt32 in value\n\tparam\t\tuorder\t\tCheckedInt32 in value\n\tparam\t\tv1\t\tCoordD in value\n\tparam\t\tv2\t\tCoordD in value\n\tparam\t\tvstride\t\tInt32 in value\n\tparam\t\tvorder\t\tCheckedInt32 in value\n\tparam\t\tpoints\t\tCoordD in array [COMPSIZE(size/ustride/uorder/vstride/vorder)]\n\tcategory\tAPPLE_vertex_program_evaluators\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMapVertexAttrib2fAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tsize\t\tUInt32 in value\n\tparam\t\tu1\t\tCoordF in value\n\tparam\t\tu2\t\tCoordF in value\n\tparam\t\tustride\t\tInt32 in value\n\tparam\t\tuorder\t\tCheckedInt32 in value\n\tparam\t\tv1\t\tCoordF in value\n\tparam\t\tv2\t\tCoordF in value\n\tparam\t\tvstride\t\tInt32 in value\n\tparam\t\tvorder\t\tCheckedInt32 in value\n\tparam\t\tpoints\t\tCoordF in array [COMPSIZE(size/ustride/uorder/vstride/vorder)]\n\tcategory\tAPPLE_vertex_program_evaluators\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #370\n# APPLE_aux_depth_stencil commands\n#\n###############################################################################\n\n# (none)\nnewcategory: APPLE_aux_depth_stencil\n\n###############################################################################\n#\n# Extension #371\n# APPLE_object_purgeable commands\n#\n###############################################################################\n\nObjectPurgeableAPPLE(objectType, name, option)\n\treturn\t\tGLenum\n\tparam\t\tobjectType\tGLenum in value\n\tparam\t\tname\t\tUInt32 in value\n\tparam\t\toption\t\tGLenum in value\n\tcategory\tAPPLE_object_purgeable\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nObjectUnpurgeableAPPLE(objectType, name, option)\n\treturn\t\tGLenum\n\tparam\t\tobjectType\tGLenum in value\n\tparam\t\tname\t\tUInt32 in value\n\tparam\t\toption\t\tGLenum in value\n\tcategory\tAPPLE_object_purgeable\n\tversion\t\t1.5\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetObjectParameterivAPPLE(objectType, name, pname, params)\n\treturn\t\tvoid\n\tparam\t\tobjectType\tGLenum in value\n\tparam\t\tname\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tAPPLE_object_purgeable\n\tdlflags\t\tnotlistable\n\tversion\t\t1.5\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #372\n# APPLE_row_bytes commands\n#\n###############################################################################\n\n# (none)\nnewcategory: APPLE_row_bytes\n\n###############################################################################\n#\n# Extension #373\n# APPLE_rgb_422 commands\n#\n###############################################################################\n\n# (none)\nnewcategory: APPLE_rgb_422\n\n###############################################################################\n#\n# Extension #374\n# NV_video_capture commands\n#\n###############################################################################\n\nBeginVideoCaptureNV(video_capture_slot)\n\treturn\t\tvoid\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tcategory\tNV_video_capture\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBindVideoCaptureStreamBufferNV(video_capture_slot, stream, frame_region, offset)\n\treturn\t\tvoid\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tparam\t\tstream\t\tUInt32 in value\n\tparam\t\tframe_region\tGLenum in value\n\tparam\t\toffset\t\tBufferOffsetARB in value\n\tcategory\tNV_video_capture\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nBindVideoCaptureStreamTextureNV(video_capture_slot, stream, frame_region, target, texture)\n\treturn\t\tvoid\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tparam\t\tstream\t\tUInt32 in value\n\tparam\t\tframe_region\tGLenum in value\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\ttexture\t\tUInt32 in value\n\tcategory\tNV_video_capture\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nEndVideoCaptureNV(video_capture_slot)\n\treturn\t\tvoid\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tcategory\tNV_video_capture\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVideoCaptureivNV(video_capture_slot, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tNV_video_capture\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVideoCaptureStreamivNV(video_capture_slot, stream, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tparam\t\tstream\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 out array [COMPSIZE(pname)]\n\tcategory\tNV_video_capture\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVideoCaptureStreamfvNV(video_capture_slot, stream, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tparam\t\tstream\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tFloat32 out array [COMPSIZE(pname)]\n\tcategory\tNV_video_capture\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetVideoCaptureStreamdvNV(video_capture_slot, stream, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tparam\t\tstream\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tFloat64 out array [COMPSIZE(pname)]\n\tcategory\tNV_video_capture\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVideoCaptureNV(video_capture_slot, sequence_num, capture_time)\n\treturn\t\tGLenum\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tparam\t\tsequence_num\tUInt32 out reference\n\tparam\t\tcapture_time\tUInt64EXT out reference\n\tcategory\tNV_video_capture\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVideoCaptureStreamParameterivNV(video_capture_slot, stream, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tparam\t\tstream\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tInt32 in array [COMPSIZE(pname)]\n\tcategory\tNV_video_capture\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVideoCaptureStreamParameterfvNV(video_capture_slot, stream, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tparam\t\tstream\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tFloat32 in array [COMPSIZE(pname)]\n\tcategory\tNV_video_capture\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVideoCaptureStreamParameterdvNV(video_capture_slot, stream, pname, params)\n\treturn\t\tvoid\n\tparam\t\tvideo_capture_slot\tUInt32 in value\n\tparam\t\tstream\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tFloat64 in array [COMPSIZE(pname)]\n\tcategory\tNV_video_capture\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #375 - GLX_EXT_swap_control\n#\n###############################################################################\n\n###############################################################################\n#\n# Extension #376 - also GLX_NV_copy_image, WGL_NV_copy_image\n# NV_copy_image commands\n#\n###############################################################################\n\nCopyImageSubDataNV(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, width, height, depth)\n\treturn\t\tvoid\n\tparam\t\tsrcName\t\tUInt32 in value\n\tparam\t\tsrcTarget\tGLenum in value\n\tparam\t\tsrcLevel\tInt32 in value\n\tparam\t\tsrcX\t\tInt32 in value\n\tparam\t\tsrcY\t\tInt32 in value\n\tparam\t\tsrcZ\t\tInt32 in value\n\tparam\t\tdstName\t\tUInt32 in value\n\tparam\t\tdstTarget\tGLenum in value\n\tparam\t\tdstLevel\tInt32 in value\n\tparam\t\tdstX\t\tInt32 in value\n\tparam\t\tdstY\t\tInt32 in value\n\tparam\t\tdstZ\t\tInt32 in value\n\tparam\t\twidth\t\tSizeI in value\n\tparam\t\theight\t\tSizeI in value\n\tparam\t\tdepth\t\tSizeI in value\n\tcategory\tNV_copy_image\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #377\n# EXT_separate_shader_objects commands\n#\n###############################################################################\n\nUseShaderProgramEXT(type, program)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tprogram\t\tUInt32 in value\n\tcategory\tEXT_separate_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nActiveProgramEXT(program)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tcategory\tEXT_separate_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nCreateShaderProgramEXT(type, string)\n\treturn\t\tUInt32\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tstring\t\tChar in array []\n\tcategory\tEXT_separate_shader_objects\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #378\n# NV_parameter_buffer_object2 commands\n#\n###############################################################################\n\nnewcategory: NV_parameter_buffer_object2\n\n###############################################################################\n#\n# Extension #379\n# NV_shader_buffer_load commands\n#\n###############################################################################\n\nMakeBufferResidentNV(target, access)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\taccess\t\tGLenum in value\n\tcategory\tNV_shader_buffer_load\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMakeBufferNonResidentNV(target)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tcategory\tNV_shader_buffer_load\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIsBufferResidentNV(target)\n\treturn\t\tBoolean\n\tparam\t\ttarget\t\tGLenum in value\n\tcategory\tNV_shader_buffer_load\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMakeNamedBufferResidentNV(buffer, access)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\taccess\t\tGLenum in value\n\tcategory\tNV_shader_buffer_load\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nMakeNamedBufferNonResidentNV(buffer)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tNV_shader_buffer_load\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIsNamedBufferResidentNV(buffer)\n\treturn\t\tBoolean\n\tparam\t\tbuffer\t\tUInt32 in value\n\tcategory\tNV_shader_buffer_load\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetBufferParameterui64vNV(target, pname, params)\n\treturn\t\tvoid\n\tparam\t\ttarget\t\tGLenum in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tUInt64EXT out array [COMPSIZE(pname)]\n\tcategory\tNV_shader_buffer_load\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetNamedBufferParameterui64vNV(buffer, pname, params)\n\treturn\t\tvoid\n\tparam\t\tbuffer\t\tUInt32 in value\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tparams\t\tUInt64EXT out array [COMPSIZE(pname)]\n\tcategory\tNV_shader_buffer_load\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetIntegerui64vNV(value, result)\n\treturn\t\tvoid\n\tparam\t\tvalue\t\tGLenum in value\n\tparam\t\tresult\t\tUInt64EXT out array [COMPSIZE(value)]\n\tcategory\tNV_shader_buffer_load\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformui64NV(location, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tvalue\t\tUInt64EXT in value\n\tcategory\tNV_shader_buffer_load\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nUniformui64vNV(location, count, value)\n\treturn\t\tvoid\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt64EXT in array [count]\n\tcategory\tNV_shader_buffer_load\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetUniformui64vNV(program, location, params)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tparams\t\tUInt64EXT out array [COMPSIZE(program/location)]\n\tcategory\tNV_shader_buffer_load\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniformui64NV(program, location, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tvalue\t\tUInt64EXT in value\n\tcategory\tNV_shader_buffer_load\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nProgramUniformui64vNV(program, location, count, value)\n\treturn\t\tvoid\n\tparam\t\tprogram\t\tUInt32 in value\n\tparam\t\tlocation\tInt32 in value\n\tparam\t\tcount\t\tSizeI in value\n\tparam\t\tvalue\t\tUInt64EXT in array [count]\n\tcategory\tNV_shader_buffer_load\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #380\n# NV_vertex_buffer_unified_memory commands\n#\n###############################################################################\n\nBufferAddressRangeNV(pname, index, address, length)\n\treturn\t\tvoid\n\tparam\t\tpname\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\taddress\t\tUInt64EXT in value\n\tparam\t\tlength\t\tBufferSize in value\n\tcategory\tNV_vertex_buffer_unified_memory\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexFormatNV(size, type, stride)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tstride\t\tSizeI in value\n\tcategory\tNV_vertex_buffer_unified_memory\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nNormalFormatNV(type, stride)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tstride\t\tSizeI in value\n\tcategory\tNV_vertex_buffer_unified_memory\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nColorFormatNV(size, type, stride)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tstride\t\tSizeI in value\n\tcategory\tNV_vertex_buffer_unified_memory\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nIndexFormatNV(type, stride)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tstride\t\tSizeI in value\n\tcategory\tNV_vertex_buffer_unified_memory\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nTexCoordFormatNV(size, type, stride)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tstride\t\tSizeI in value\n\tcategory\tNV_vertex_buffer_unified_memory\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nEdgeFlagFormatNV(stride)\n\treturn\t\tvoid\n\tparam\t\tstride\t\tSizeI in value\n\tcategory\tNV_vertex_buffer_unified_memory\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nSecondaryColorFormatNV(size, type, stride)\n\treturn\t\tvoid\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tstride\t\tSizeI in value\n\tcategory\tNV_vertex_buffer_unified_memory\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nFogCoordFormatNV(type, stride)\n\treturn\t\tvoid\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tstride\t\tSizeI in value\n\tcategory\tNV_vertex_buffer_unified_memory\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribFormatNV(index, size, type, normalized, stride)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tnormalized\tBoolean in value\n\tparam\t\tstride\t\tSizeI in value\n\tcategory\tNV_vertex_buffer_unified_memory\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nVertexAttribIFormatNV(index, size, type, stride)\n\treturn\t\tvoid\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tsize\t\tInt32 in value\n\tparam\t\ttype\t\tGLenum in value\n\tparam\t\tstride\t\tSizeI in value\n\tcategory\tNV_vertex_buffer_unified_memory\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\nGetIntegerui64i_vNV(value, index, result)\n\treturn\t\tvoid\n\tparam\t\tvalue\t\tGLenum in value\n\tparam\t\tindex\t\tUInt32 in value\n\tparam\t\tresult\t\tUInt64EXT out array [COMPSIZE(value)]\n\tcategory\tNV_vertex_buffer_unified_memory\n\tdlflags\t\tnotlistable\n\tversion\t\t1.2\n\textension\n\tglxsingle\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #381\n# NV_texture_barrier commands\n#\n###############################################################################\n\nTextureBarrierNV()\n\treturn\t\tvoid\n\tcategory\tNV_texture_barrier\n\tversion\t\t1.2\n\textension\n\tglxropcode\t?\n\tglxflags\tignore\n\toffset\t\t?\n\n###############################################################################\n#\n# Extension #382\n# AMD_shader_stencil_export commands\n#\n###############################################################################\n\nnewcategory: AMD_shader_stencil_export\n\n###############################################################################\n#\n# Extension #383\n# AMD_seamless_cubemap_per_texture commands\n#\n###############################################################################\n\nnewcategory: AMD_seamless_cubemap_per_texture\n\n###############################################################################\n#\n# Extension #384 - GLX_INTEL_swap_event\n#\n###############################################################################\n\n"
  },
  {
    "path": "k3dsdk/gl/gl.tm",
    "content": "AccumOp,*,*,\t\t\t    GLenum,*,*\nAlphaFunction,*,*,\t\t    GLenum,*,*\nAttribMask,*,*,\t\t\t    GLbitfield,*,*\nBeginMode,*,*,\t\t\t    GLenum,*,*\nBinormalPointerTypeEXT,*,*,\t    GLenum,*,*\nBlendEquationMode,*,*,\t\t    GLenum,*,*\nBlendEquationModeEXT,*,*,\t    GLenum,*,*\nBlendFuncSeparateParameterEXT,*,*,  GLenum,*,*\nBlendingFactorDest,*,*,\t\t    GLenum,*,*\nBlendingFactorSrc,*,*,\t\t    GLenum,*,*\nBoolean,*,*,\t\t\t    GLboolean,*,*\nBooleanPointer,*,*,\t\t    GLboolean*,*,*\nChar,*,*,\t\t\t    GLchar,*,*\nCharPointer,*,*,\t\t    GLchar*,*,*\nCheckedFloat32,*,*,\t\t    GLfloat,*,*\nCheckedInt32,*,*,\t\t    GLint,*,*\nClampColorTargetARB,*,*,\t    GLenum,*,*\nClampColorModeARB,*,*,\t\t    GLenum,*,*\nClampedColorF,*,*,\t\t    GLclampf,*,*\nClampedFloat32,*,*,\t\t    GLclampf,*,*\nClampedFloat64,*,*,\t\t    GLclampd,*,*\nClampedStencilValue,*,*,\t    GLint,*,*\nClearBufferMask,*,*,\t\t    GLbitfield,*,*\nClientAttribMask,*,*,\t\t    GLbitfield,*,*\nClipPlaneName,*,*,\t\t    GLenum,*,*\nColorB,*,*,\t\t\t    GLbyte,*,*\nColorD,*,*,\t\t\t    GLdouble,*,*\nColorF,*,*,\t\t\t    GLfloat,*,*\nColorI,*,*,\t\t\t    GLint,*,*\nColorIndexValueD,*,*,\t\t    GLdouble,*,*\nColorIndexValueF,*,*,\t\t    GLfloat,*,*\nColorIndexValueI,*,*,\t\t    GLint,*,*\nColorIndexValueS,*,*,\t\t    GLshort,*,*\nColorIndexValueUB,*,*,\t\t    GLubyte,*,*\nColorMaterialParameter,*,*,\t    GLenum,*,*\nColorPointerType,*,*,\t\t    GLenum,*,*\nColorS,*,*,\t\t\t    GLshort,*,*\nColorTableParameterPName,*,*,\t    GLenum,*,*\nColorTableParameterPNameSGI,*,*,    GLenum,*,*\nColorTableTarget,*,*,\t\t    GLenum,*,*\nColorTableTargetSGI,*,*,\t    GLenum,*,*\nColorUB,*,*,\t\t\t    GLubyte,*,*\nColorUI,*,*,\t\t\t    GLuint,*,*\nColorUS,*,*,\t\t\t    GLushort,*,*\nCombinerBiasNV,*,*,\t\t    GLenum,*,*\nCombinerComponentUsageNV,*,*,\t    GLenum,*,*\nCombinerMappingNV,*,*,\t\t    GLenum,*,*\nCombinerParameterNV,*,*,\t    GLenum,*,*\nCombinerPortionNV,*,*,\t\t    GLenum,*,*\nCombinerRegisterNV,*,*,\t\t    GLenum,*,*\nCombinerScaleNV,*,*,\t\t    GLenum,*,*\nCombinerStageNV,*,*,\t\t    GLenum,*,*\nCombinerVariableNV,*,*,\t\t    GLenum,*,*\nCompressedTextureARB,*,*,\t    GLvoid,*,*\nControlPointNV,*,*,\t\t    GLvoid,*,*\nControlPointTypeNV,*,*,\t\t    GLenum,*,*\nConvolutionParameter,*,*,\t    GLenum,*,*\nConvolutionParameterEXT,*,*,\t    GLenum,*,*\nConvolutionTarget,*,*,\t\t    GLenum,*,*\nConvolutionTargetEXT,*,*,\t    GLenum,*,*\nCoordD,*,*,\t\t\t    GLdouble,*,*\nCoordF,*,*,\t\t\t    GLfloat,*,*\nCoordI,*,*,\t\t\t    GLint,*,*\nCoordS,*,*,\t\t\t    GLshort,*,*\nCullFaceMode,*,*,\t\t    GLenum,*,*\nCullParameterEXT,*,*,\t\t    GLenum,*,*\nDepthFunction,*,*,\t\t    GLenum,*,*\nDrawBufferMode,*,*,\t\t    GLenum,*,*\nDrawBufferName,*,*,\t\t    GLint,*,*\nDrawElementsType,*,*,\t\t    GLenum,*,*\nElementPointerTypeATI,*,*,\t    GLenum,*,*\nEnableCap,*,*,\t\t\t    GLenum,*,*\nErrorCode,*,*,\t\t\t    GLenum,*,*\nEvalMapsModeNV,*,*,\t\t    GLenum,*,*\nEvalTargetNV,*,*,\t\t    GLenum,*,*\nFeedbackElement,*,*,\t\t    GLfloat,*,*\nFeedbackType,*,*,\t\t    GLenum,*,*\nFenceNV,*,*,\t\t\t    GLuint,*,*\nFenceConditionNV,*,*,\t\t    GLenum,*,*\nFenceParameterNameNV,*,*,\t    GLenum,*,*\nFfdMaskSGIX,*,*,\t\t    GLbitfield,*,*\nFfdTargetSGIX,*,*,\t\t    GLenum,*,*\nFloat32,*,*,\t\t\t    GLfloat,*,*\nFloat32Pointer,*,*,\t\t    GLfloat*,*,*\nFloat64,*,*,\t\t\t    GLdouble,*,*\nFloat64Pointer,*,*,\t\t    GLdouble*,*,*\nFogParameter,*,*,\t\t    GLenum,*,*\nFogPointerTypeEXT,*,*,\t\t    GLenum,*,*\nFogPointerTypeIBM,*,*,\t\t    GLenum,*,*\nFragmentLightModelParameterSGIX,*,*,GLenum,*,*\nFragmentLightNameSGIX,*,*,\t    GLenum,*,*\nFragmentLightParameterSGIX,*,*,     GLenum,*,*\nFramebufferAttachment,*,*,\t    GLenum,*,*\nFramebufferTarget,*,*,\t\t    GLenum,*,*\nFrontFaceDirection,*,*,\t\t    GLenum,*,*\nFunctionPointer,*,*,\t\t    _GLfuncptr,*,*\nGetColorTableParameterPName,*,*,    GLenum,*,*\nGetColorTableParameterPNameSGI,*,*, GLenum,*,*\nGetConvolutionParameterPName,*,*,   GLenum,*,*\nGetHistogramParameterPName,*,*,     GLenum,*,*\nGetHistogramParameterPNameEXT,*,*,  GLenum,*,*\nGetMapQuery,*,*,\t\t    GLenum,*,*\nGetMinmaxParameterPName,*,*,\t    GLenum,*,*\nGetMinmaxParameterPNameEXT,*,*,     GLenum,*,*\nGetPName,*,*,\t\t\t    GLenum,*,*\nGetPointervPName,*,*,\t\t    GLenum,*,*\nGetTextureParameter,*,*,\t    GLenum,*,*\nHintMode,*,*,\t\t\t    GLenum,*,*\nHintTarget,*,*,\t\t\t    GLenum,*,*\nHintTargetPGI,*,*,\t\t    GLenum,*,*\nHistogramTarget,*,*,\t\t    GLenum,*,*\nHistogramTargetEXT,*,*,\t\t    GLenum,*,*\nIglooFunctionSelectSGIX,*,*,\t    GLenum,*,*\nIglooParameterSGIX,*,*,\t\t    GLvoid,*,*\nImageTransformPNameHP,*,*,\t    GLenum,*,*\nImageTransformTargetHP,*,*,\t    GLenum,*,*\nIndexFunctionEXT,*,*,\t\t    GLenum,*,*\nIndexMaterialParameterEXT,*,*,\t    GLenum,*,*\nIndexPointerType,*,*,\t\t    GLenum,*,*\nInt16,*,*,\t\t\t    GLshort,*,*\nInt32,*,*,\t\t\t    GLint,*,*\nInt8,*,*,\t\t\t    GLbyte,*,*\nInterleavedArrayFormat,*,*,\t    GLenum,*,*\nLightEnvParameterSGIX,*,*,\t    GLenum,*,*\nLightModelParameter,*,*,\t    GLenum,*,*\nLightName,*,*,\t\t\t    GLenum,*,*\nLightParameter,*,*,\t\t    GLenum,*,*\nLightTextureModeEXT,*,*,\t    GLenum,*,*\nLightTexturePNameEXT,*,*,\t    GLenum,*,*\nLineStipple,*,*,\t\t    GLushort,*,*\nList,*,*,\t\t\t    GLuint,*,*\nListMode,*,*,\t\t\t    GLenum,*,*\nListNameType,*,*,\t\t    GLenum,*,*\nListParameterName,*,*,\t\t    GLenum,*,*\nLogicOp,*,*,\t\t\t    GLenum,*,*\nMapAttribParameterNV,*,*,\t    GLenum,*,*\nMapParameterNV,*,*,\t\t    GLenum,*,*\nMapTarget,*,*,\t\t\t    GLenum,*,*\nMapTargetNV,*,*,\t\t    GLenum,*,*\nMapTypeNV,*,*,\t\t\t    GLenum,*,*\nMaskedColorIndexValueF,*,*,\t    GLfloat,*,*\nMaskedColorIndexValueI,*,*,\t    GLuint,*,*\nMaskedStencilValue,*,*,\t\t    GLuint,*,*\nMaterialFace,*,*,\t\t    GLenum,*,*\nMaterialParameter,*,*,\t\t    GLenum,*,*\nMatrixIndexPointerTypeARB,*,*,\t    GLenum,*,*\nMatrixMode,*,*,\t\t\t    GLenum,*,*\nMatrixTransformNV,*,*,\t\t    GLenum,*,*\nMeshMode1,*,*,\t\t\t    GLenum,*,*\nMeshMode2,*,*,\t\t\t    GLenum,*,*\nMinmaxTarget,*,*,\t\t    GLenum,*,*\nMinmaxTargetEXT,*,*,\t\t    GLenum,*,*\nNormalPointerType,*,*,\t\t    GLenum,*,*\nNurbsCallback,*,*,\t\t    GLenum,*,*\nNurbsObj,*,*,\t\t\t    GLUnurbs*,*,*\nNurbsProperty,*,*,\t\t    GLenum,*,*\nNurbsTrim,*,*,\t\t\t    GLenum,*,*\nOcclusionQueryParameterNameNV,*,*,  GLenum,*,*\nPixelCopyType,*,*,\t\t    GLenum,*,*\nPixelFormat,*,*,\t\t    GLenum,*,*\nPixelInternalFormat,*,*,\t    GLenum,*,*\nPixelMap,*,*,\t\t\t    GLenum,*,*\nPixelStoreParameter,*,*,\t    GLenum,*,*\nPixelTexGenModeSGIX,*,*,\t    GLenum,*,*\nPixelTexGenParameterNameSGIS,*,*,   GLenum,*,*\nPixelTransferParameter,*,*,\t    GLenum,*,*\nPixelTransformPNameEXT,*,*,\t    GLenum,*,*\nPixelTransformTargetEXT,*,*,\t    GLenum,*,*\nPixelType,*,*,\t\t\t    GLenum,*,*\nPointParameterNameARB,*,*,\t    GLenum,*,*\nPolygonMode,*,*,\t\t    GLenum,*,*\nProgramNV,*,*,\t\t\t    GLuint,*,*\nProgramCharacterNV,*,*,\t\t    GLubyte,*,*\nProgramParameterNV,*,*,\t\t    GLenum,*,*\nProgramParameterPName,*,*,\t    GLenum,*,*\nQuadricCallback,*,*,\t\t    GLenum,*,*\nQuadricDrawStyle,*,*,\t\t    GLenum,*,*\nQuadricNormal,*,*,\t\t    GLenum,*,*\nQuadricObj,*,*,\t\t\t    GLUquadric*,*,*\nQuadricOrientation,*,*,\t\t    GLenum,*,*\nReadBufferMode,*,*,\t\t    GLenum,*,*\nRenderbufferTarget,*,*,\t\t    GLenum,*,*\nRenderingMode,*,*,\t\t    GLenum,*,*\nReplacementCodeSUN,*,*,\t\t    GLuint,*,*\nReplacementCodeTypeSUN,*,*,\t    GLenum,*,*\nSamplePassARB,*,*,\t\t    GLenum,*,*\nSamplePatternEXT,*,*,\t\t    GLenum,*,*\nSamplePatternSGIS,*,*,\t\t    GLenum,*,*\nSecondaryColorPointerTypeIBM,*,*,   GLenum,*,*\nSelectName,*,*,\t\t\t    GLuint,*,*\nSeparableTarget,*,*,\t\t    GLenum,*,*\nSeparableTargetEXT,*,*,\t\t    GLenum,*,*\nShadingModel,*,*,\t\t    GLenum,*,*\nSizeI,*,*,\t\t\t    GLsizei,*,*\nSpriteParameterNameSGIX,*,*,\t    GLenum,*,*\nStencilFunction,*,*,\t\t    GLenum,*,*\nStencilFaceDirection,*,*,\t    GLenum,*,*\nStencilOp,*,*,\t\t\t    GLenum,*,*\nStencilValue,*,*,\t\t    GLint,*,*\nString,*,*,\t\t\t    const GLubyte *,*,*\nStringName,*,*,\t\t\t    GLenum,*,*\nTangentPointerTypeEXT,*,*,\t    GLenum,*,*\nTessCallback,*,*,\t\t    GLenum,*,*\nTessContour,*,*,\t\t    GLenum,*,*\nTessProperty,*,*,\t\t    GLenum,*,*\nTesselatorObj,*,*,\t\t    GLUtesselator*,*,*\nTexCoordPointerType,*,*,\t    GLenum,*,*\nTexture,*,*,\t\t\t    GLuint,*,*\nTextureComponentCount,*,*,\t    GLint,*,*\nTextureCoordName,*,*,\t\t    GLenum,*,*\nTextureEnvParameter,*,*,\t    GLenum,*,*\nTextureEnvTarget,*,*,\t\t    GLenum,*,*\nTextureFilterSGIS,*,*,\t\t    GLenum,*,*\nTextureGenParameter,*,*,\t    GLenum,*,*\nTextureNormalModeEXT,*,*,\t    GLenum,*,*\nTextureParameterName,*,*,\t    GLenum,*,*\nTextureTarget,*,*,\t\t    GLenum,*,*\nTextureUnit,*,*,\t\t    GLenum,*,*\nUInt16,*,*,\t\t\t    GLushort,*,*\nUInt32,*,*,\t\t\t    GLuint,*,*\nUInt8,*,*,\t\t\t    GLubyte,*,*\nVertexAttribEnum,*,*,\t\t    GLenum,*,*\nVertexAttribEnumNV,*,*,\t\t    GLenum,*,*\nVertexAttribPointerTypeNV,*,*,\t    GLenum,*,*\nVertexPointerType,*,*,\t\t    GLenum,*,*\nVertexWeightPointerTypeEXT,*,*,     GLenum,*,*\nVoid,*,*,\t\t\t    GLvoid,*,*\nVoidPointer,*,*,\t\t    GLvoid*,*,*\nConstVoidPointer,*,*,\t\t    GLvoid* const,*,*\nWeightPointerTypeARB,*,*,\t    GLenum,*,*\nWinCoord,*,*,\t\t\t    GLint,*,*\nvoid,*,*,\t\t\t    *,*,*\nArrayObjectPNameATI,*,*,\t    GLenum,*,*\nArrayObjectUsageATI,*,*,\t    GLenum,*,*,\nConstFloat32,*,*,\t\t    GLfloat,*,*\nConstInt32,*,*,\t\t\t    GLint,*,*\nConstUInt32,*,*,\t\t    GLuint,*,*\nConstVoid,*,*,\t\t\t    GLvoid,*,*\nDataTypeEXT,*,*,\t\t    GLenum,*,*\nFragmentOpATI,*,*,\t\t    GLenum,*,*\nGetTexBumpParameterATI,*,*,\t    GLenum,*,*\nGetVariantValueEXT,*,*,\t\t    GLenum,*,*\nParameterRangeEXT,*,*,\t\t    GLenum,*,*\nPreserveModeATI,*,*,\t\t    GLenum,*,*\nProgramFormatARB,*,*,\t\t    GLenum,*,*\nProgramTargetARB,*,*,\t\t    GLenum,*,*\nProgramTarget,*,*,\t\t    GLenum,*,*\nProgramPropertyARB,*,*,\t\t    GLenum,*,*\nProgramStringPropertyARB,*,*,\t    GLenum,*,*\nScalarType,*,*,\t\t\t    GLenum,*,*\nSwizzleOpATI,*,*,\t\t    GLenum,*,*\nTexBumpParameterATI,*,*,\t    GLenum,*,*\nVariantCapEXT,*,*,\t\t    GLenum,*,*\nVertexAttribPointerPropertyARB,*,*, GLenum,*,*\nVertexAttribPointerTypeARB,*,*,     GLenum,*,*\nVertexAttribPropertyARB,*,*,\t    GLenum,*,*\nVertexShaderCoordOutEXT,*,*,\t    GLenum,*,*\nVertexShaderOpEXT,*,*,\t\t    GLenum,*,*\nVertexShaderParameterEXT,*,*,\t    GLenum,*,*\nVertexShaderStorageTypeEXT,*,*,     GLenum,*,*\nVertexShaderTextureUnitParameter,*,*,\tGLenum,*,*\nVertexShaderWriteMaskEXT,*,*,\t    GLenum,*,*\nVertexStreamATI,*,*,\t\t    GLenum,*,*\nPNTrianglesPNameATI,*,*,\t    GLenum,*,*\n# ARB_vertex_buffer_object types and core equivalents for new types\nBufferOffset,*,*,\t\t    GLintptr,*,*\nBufferSize,*,*,\t\t\t    GLsizeiptr,*,*\nBufferAccessARB,*,*,\t\t    GLenum,*,*\nBufferOffsetARB,*,*,\t\t    GLintptrARB,*,*\nBufferPNameARB,*,*,\t\t    GLenum,*,*\nBufferPointerNameARB,*,*,\t    GLenum,*,*\nBufferSizeARB,*,*,\t\t    GLsizeiptrARB,*,*\nBufferTargetARB,*,*,\t\t    GLenum,*,*\nBufferUsageARB,*,*,\t\t    GLenum,*,*\n# APPLE_fence\nObjectTypeAPPLE,*,*,\t\t    GLenum,*,*\n# APPLE_vertex_array_range\nVertexArrayPNameAPPLE,*,*,\t    GLenum,*,*\n# ATI_draw_buffers\nDrawBufferModeATI,*,*,\t\t    GLenum,*,*\n# NV_half\nHalf16NV,*,*,\t\t\t    GLhalfNV,*,*\n# NV_pixel_data_range\nPixelDataRangeTargetNV,*,*,\t    GLenum,*,*\n# Generic types for as-yet-unspecified enums\nTypeEnum,*,*,\t\t\t    GLenum,*,*\nGLbitfield,*,*,\t\t\t    GLbitfield,*,*\nGLenum,*,*,\t\t\t    GLenum,*,*\nInt64,*,*,\t\t\t    GLint64,*,*\nUInt64,*,*,\t\t\t    GLuint64,*,*\n# Object handle & data pointers\nhandleARB,*,*,\t\t\t    GLhandleARB,*,*\ncharARB,*,*,\t\t\t    GLcharARB,*,*\ncharPointerARB,*,*,\t\t    GLcharARB*,*,*\nsync,*,*,\t\t\t    GLsync,*,*,\n# EXT_timer_query\nInt64EXT,*,*,\t\t\t    GLint64EXT,*,*\nUInt64EXT,*,*,\t\t\t    GLuint64EXT,*,*\n# EXT_direct_state_access\nFramebufferAttachment,*,*,\t    GLenum,*,*\nFramebufferAttachmentParameterName,*,*, GLenum,*,*\nFramebuffer,*,*,\t\t    GLuint,*,*\nFramebufferStatus,*,*,\t\t    GLenum,*,*\nFramebufferTarget,*,*,\t\t    GLenum,*,*\nGetFramebufferParameter,*,*,\t    GLenum,*,*\nIntptr,*,*,\t\t\t    GLintptr,*,*\nProgramFormat,*,*,\t\t    GLenum,*,*\nProgramProperty,*,*,\t\t    GLenum,*,*\nProgramStringProperty,*,*,\t    GLenum,*,*\nProgramTarget,*,*,\t\t    GLenum,*,*\nRenderbuffer,*,*,\t\t    GLuint,*,*\nRenderbufferParameterName,*,*,\t    GLenum,*,*\nSizeiptr,*,*,\t\t\t    GLsizeiptr,*,*\nTextureInternalFormat,*,*,\t    GLenum,*,*\nVertexBufferObjectAccess,*,*,\t    GLenum,*,*\nVertexBufferObjectParameter,*,*,    GLenum,*,*\nVertexBufferObjectUsage,*,*,\t    GLenum,*,*\n# ARB_map_buffer_range\nBufferAccessMask,*,*,\t\t    GLbitfield,*,*\n# NV_explicit_multisample\nGetMultisamplePNameNV,*,*,\t    GLenum,*,*\nSampleMaskNV,*,*,\t\t    GLbitfield,*,*\n"
  },
  {
    "path": "k3dsdk/gl/offscreen_context.h",
    "content": "#ifndef K3DSDK_GL_OFFSCREEN_CONTEXT_H\n#define K3DSDK_GL_OFFSCREEN_CONTEXT_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/gl/context.h>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\nclass api;\n\n/// Abstract interface implemented by OpenGL context objects\nclass offscreen_context :\n\tpublic context\n{\npublic:\n\tvirtual ~offscreen_context() {}\n\n\t/// Returns a half-open range of bytes that store the offscreen buffer.\n\tvirtual const uint8_t* buffer_begin() = 0;\n\t/// Returns a half-open range of bytes that store the offscreen buffer.\n\tvirtual const uint8_t* buffer_end() = 0;\n\nprotected:\n\toffscreen_context() {}\n\toffscreen_context(const offscreen_context&) {}\n\toffscreen_context& operator=(const offscreen_context&) { return *this; }\n};\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_GL_OFFSCREEN_CONTEXT_H\n\n"
  },
  {
    "path": "k3dsdk/gl/offscreen_context_factory.h",
    "content": "#ifndef K3DSDK_GL_OFFSCREEN_CONTEXT_FACTORY_H\n#define K3DSDK_GL_OFFSCREEN_CONTEXT_FACTORY_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\nclass offscreen_context;\n\t\n/// Abstract interface implemented by objects that can create OpenGL render context objects,\nclass offscreen_context_factory :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~offscreen_context_factory() {}\n\n\t/// Creates a new offscreen OpenGL render context with the given width and height in pixels.\n\t/// The caller is responsible for the lifetime of the returned object.\n\tvirtual offscreen_context* create(const uint_t Width, const uint_t Height) = 0;\n\nprotected:\n\toffscreen_context_factory() {}\n\toffscreen_context_factory(const offscreen_context_factory&) {}\n\toffscreen_context_factory& operator=(const offscreen_context_factory&) { return *this; }\n};\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_GL_OFFSCREEN_CONTEXT_FACTORY_H\n\n"
  },
  {
    "path": "k3dsdk/gl.h",
    "content": "#ifndef K3DSDK_GL_H\n#define K3DSDK_GL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-platform-config.h>\n\n#if defined K3D_API_WIN32\n\t#include <k3dsdk/win32.h>\n#endif // !K3D_API_WIN32\n\n#define GLEW_MX // multiple-context glew as per http://glew.sourceforge.net/advanced.html\n#include <GL/glew.h> // Needed for cross-platform OpenGL > 1.1\n\n#endif // !K3DSDK_GL_H\n\n"
  },
  {
    "path": "k3dsdk/graph.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/graph.h>\n#include <k3dsdk/type_registry.h>\n\n#include <boost/graph/adjacency_list_io.hpp>\n\n#include <iterator>\n\nnamespace k3d\n{\n\nnamespace graph\n{\n\nnamespace detail\n{\n\nstatic void print(std::ostream& Stream, const pipeline_data<undirected::adjacency_list_t>& Topology)\n{\n\tif(!Topology)\n\t\treturn;\n\n\tStream << \"  vertices: (\" << boost::num_vertices(*Topology) << \")\\n\";\n\n\tStream << \"  edges: (\" << boost::num_edges(*Topology) << \")\\n\";\n\tfor(std::pair<undirected::edge_iterator_t, undirected::edge_iterator_t> edges = boost::edges(*Topology); edges.first != edges.second; ++edges.first)\n\t\tStream << \"    index: \" << (*Topology)[*edges.first].index << \" edge: \" << *edges.first << \"\\n\";\n}\n\ntemplate<typename array_t>\nstatic bool print(std::ostream& Stream, const array& Array)\n{\n\tif(const array_t* const concrete_array = dynamic_cast<const array_t*>(&Array))\n\t{\n\t\tstd::copy(concrete_array->begin(), concrete_array->end(), std::ostream_iterator<typename array_t::value_type>(Stream, \" \"));\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nstatic void print(std::ostream& Stream, const std::string& Name, const pipeline_data<array>& Array)\n{\n\tStream << \"  \" << Name << \": \";\n\tif(Array)\n\t{\n\t\tStream << \"(\" << Array->size() << \") \";\n\t\tif(print<graph::bools_t>(Stream, *Array))\n\t\t{\n\t\t}\n\t\telse if(print<graph::indices_t>(Stream, *Array))\n\t\t{\n\t\t}\n\t\telse if(print<graph::doubles_t>(Stream, *Array))\n\t\t{\n\t\t}\n\t\telse if(print<graph::integers_t>(Stream, *Array))\n\t\t{\n\t\t}\n\t\telse if(print<graph::strings_t>(Stream, *Array))\n\t\t{\n\t\t}\n\t\telse if(print<graph::points_2d_t>(Stream, *Array))\n\t\t{\n\t\t}\n\t\telse if(print<graph::vectors_2d_t>(Stream, *Array))\n\t\t{\n\t\t}\n\t\telse if(print<graph::nodes_t>(Stream, *Array))\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n            \t\tStream << \"unsupported type [\" << k3d::demangle(typeid(*Array)) << \"]\" << std::endl;\n\t\t}\n\t}\n\n\tStream << \"\\n\";\n}\n\nstatic void print(std::ostream& Stream, const k3d::graph::table_t& Arrays)\n{\n\tfor(k3d::graph::table_t::const_iterator array = Arrays.begin(); array != Arrays.end(); ++array)\n\t\tprint(Stream, array->first, array->second);\n}\n\n} // namespace detail\n\n////////////////////////////////////////////////////////////////////////////////////\n// undirected\n\nundirected::undirected()\n{\n}\n\n/** \\todo Print the topology */\nstd::ostream& operator<<(std::ostream& Stream, const undirected& RHS)\n{\n\tStream << \"topology:\" << \"\\n\";\n\tdetail::print(Stream, RHS.topology);\n\n\tStream << \"graph data:\" << \"\\n\";\n\tdetail::print(Stream, RHS.graph_data);\n\n\tStream << \"vertex data:\" << \"\\n\";\n\tdetail::print(Stream, RHS.vertex_data);\n\t\n\tStream << \"edge data:\" << \"\\n\";\n\tdetail::print(Stream, RHS.edge_data);\n\n\treturn Stream;\n}\n\n} // namespace graph\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/graph.h",
    "content": "#ifndef K3DSDK_GRAPH_H\n#define K3DSDK_GRAPH_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/table.h>\n#include <k3dsdk/named_array_types.h>\n#include <k3dsdk/typed_array.h>\n#include <k3dsdk/uint_t_array.h>\n\n#include <boost/graph/adjacency_list.hpp>\n\nnamespace k3d\n{\n\nclass inode;\n\nnamespace graph\n{\n\n/// Defines storage for a generic collection of boolean values\ntypedef typed_array<bool_t> bools_t;\n/// Defines storage for a generic collection of integer values\ntypedef typed_array<int32_t> integers_t;\n/// Defines storage for a generic collection of index values\ntypedef uint_t_array indices_t;\n/// Defines storage for a generic collection of floating-point values\ntypedef typed_array<double_t> doubles_t;\n/// Defines storage for a generic collection of string values\ntypedef typed_array<string_t> strings_t;\n/// Defines storage for a generic collection of two-dimensional points\ntypedef typed_array<point2> points_2d_t;\n/// Defines storage for a generic collection of two-dimensional vectors\ntypedef typed_array<vector2> vectors_2d_t;\n/// Defines storage for a generic collection of inode objects\ntypedef typed_array<inode*> nodes_t;\n/// Defines a heterogeneous collection of named, shared arrays\ntypedef k3d::table table_t;\n\n////////////////////////////////////////////////////////////////////////////////\n// undirected\n\n/// Encapsulates an undirected graph with arbitrary vertex and edge attributes\nclass undirected\n{\npublic:\n\tundirected();\n\n\tstruct vertex\n\t{\n\t};\n\n\tstruct edge\n\t{\n\t\tedge() : index(0) {}\n\t\tuint_t index;\n\t};\n\n\t/// Defines storage for a generic graph topology\n\ttypedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS, vertex, edge> adjacency_list_t;\n\ttypedef boost::graph_traits<adjacency_list_t>::vertex_descriptor vertex_descriptor_t;\n\ttypedef boost::graph_traits<adjacency_list_t>::edge_descriptor edge_descriptor_t;\n\ttypedef boost::graph_traits<adjacency_list_t>::vertex_iterator vertex_iterator_t;\n\ttypedef boost::graph_traits<adjacency_list_t>::edge_iterator edge_iterator_t;\n\ttypedef boost::graph_traits<adjacency_list_t>::out_edge_iterator out_edge_iterator_t;\n\ttypedef boost::graph_traits<adjacency_list_t>::in_edge_iterator in_edge_iterator_t;\n\n\t/// Stores the graph topology\n\tpipeline_data<adjacency_list_t> topology;\n\t/// Stores user-defined per-graph data\n\ttable_t graph_data;\n\t/// Stores user-defined per-vertex data\n\ttable_t vertex_data;\n\t/// Stores user-defined per-edge data\n\ttable_t edge_data;\n};\n\n/// Stream serialization\nstd::ostream& operator<<(std::ostream& Stream, const undirected& RHS);\n\n} // namespace graph\n\n} // namespace k3d\n\n#endif // !K3DSDK_GRAPH_H\n\n"
  },
  {
    "path": "k3dsdk/gzstream.cpp",
    "content": "// ============================================================================\n// gzstream, C++ iostream classes wrapping the zlib compression library.\n// Copyright (C) 2001  Deepak Bandyopadhyay, Lutz Kettner\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 2.1 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n// ============================================================================\n//\n// File          : gzstream.C\n// Revision      : $Revision: 1.3 $\n// Revision_date : $Date: 2007/02/17 01:35:57 $\n// Author(s)     : Deepak Bandyopadhyay, Lutz Kettner\n//\n// Standard streambuf implementation following Nicolai Josuttis, \"The\n// Standard C++ Library\".\n// ============================================================================\n\n#include <k3dsdk/gzstream.h>\n#include <k3dsdk/path.h>\n\n#include <zlib.h>\n#include <string.h>\n#include <cstdio> // for EOF\n\nnamespace k3d\n{\n\nnamespace filesystem\n{\n\n///////////////////////////////////////////////////////////////////////////////////\n// gzstreambuf\n\nclass gzstreambuf :\n\tpublic std::streambuf\n{\nprivate:\n\tstatic const int bufferSize = 47+256;    // size of data buff totals 512 bytes under g++ for igzstream at the end.\n\tgzFile           file;               // file handle for compressed file\n\tchar             buffer[bufferSize]; // data buffer\n\tchar             opened;             // open/close state of stream\n\tint              mode;               // I/O mode\n\n\tint flush_buffer();\n\npublic:\n\tgzstreambuf() :\n\t\topened(0)\n\t{\n\tsetp( buffer, buffer + (bufferSize-1));\n\tsetg( buffer + 4,     // beginning of putback area\n\t      buffer + 4,     // read position\n\t      buffer + 4);    // end position\n\t// ASSERT: both input & output capabilities will not be used together\n\t}\n\tint is_open() { return opened; }\n\tgzstreambuf* open(const filesystem::path& name, int open_mode);\n\tgzstreambuf* close();\n\t~gzstreambuf() { close(); }\n\n\tvirtual int     overflow( int c = EOF);\n\tvirtual int     underflow();\n\tvirtual int     sync();\n};\n\ngzstreambuf* gzstreambuf::open(const filesystem::path& name, int open_mode) {\n    if ( is_open())\n        return (gzstreambuf*)0;\n    mode = open_mode;\n    // no append nor read/write mode\n    if ((mode & std::ios::ate) || (mode & std::ios::app)\n        || ((mode & std::ios::in) && (mode & std::ios::out)))\n        return (gzstreambuf*)0;\n    char  fmode[10];\n    char* fmodeptr = fmode;\n    if ( mode & std::ios::in)\n        *fmodeptr++ = 'r';\n    else if ( mode & std::ios::out)\n        *fmodeptr++ = 'w';\n    *fmodeptr++ = 'b';\n    *fmodeptr = '\\0';\n    file = gzopen( name.native_filesystem_string().c_str(), fmode);\n    if (file == 0)\n        return (gzstreambuf*)0;\n    opened = 1;\n    return this;\n}\n\ngzstreambuf * gzstreambuf::close() {\n    if ( is_open()) {\n        sync();\n        opened = 0;\n        if ( gzclose( file) == Z_OK)\n            return this;\n    }\n    return (gzstreambuf*)0;\n}\n\nint gzstreambuf::underflow() { // used for input buffer only\n    if ( gptr() && ( gptr() < egptr()))\n        return * reinterpret_cast<unsigned char *>( gptr());\n\n    if ( ! (mode & std::ios::in) || ! opened)\n        return EOF;\n    // Josuttis' implementation of inbuf\n    int n_putback = gptr() - eback();\n    if ( n_putback > 4)\n        n_putback = 4;\n    memcpy( buffer + (4 - n_putback), gptr() - n_putback, n_putback);\n\n    int num = gzread( file, buffer+4, bufferSize-4);\n    if (num <= 0) // ERROR or EOF\n        return EOF;\n\n    // reset buffer pointers\n    setg( buffer + (4 - n_putback),   // beginning of putback area\n          buffer + 4,                 // read position\n          buffer + 4 + num);          // end of buffer\n\n    // return next character\n    return * reinterpret_cast<unsigned char *>( gptr());\n}\n\nint gzstreambuf::flush_buffer() {\n    // Separate the writing of the buffer from overflow() and\n    // sync() operation.\n    int w = pptr() - pbase();\n    if ( gzwrite( file, pbase(), w) != w)\n        return EOF;\n    pbump( -w);\n    return w;\n}\n\nint gzstreambuf::overflow( int c) { // used for output buffer only\n    if ( ! ( mode & std::ios::out) || ! opened)\n        return EOF;\n    if (c != EOF) {\n        *pptr() = c;\n        pbump(1);\n    }\n    if ( flush_buffer() == EOF)\n        return EOF;\n    return c;\n}\n\nint gzstreambuf::sync() {\n    // Changed to use flush_buffer() instead of overflow( EOF)\n    // which caused improper behavior with std::endl and flush(),\n    // bug reported by Vincent Ricard.\n    if ( pptr() && pptr() > pbase()) {\n        if ( flush_buffer() == EOF)\n            return -1;\n    }\n    return 0;\n}\n\n////////////////////////////////////////////////////////////////////\n// gzstreambase\n\ngzstreambase::gzstreambase() :\n\tbuf(new gzstreambuf())\n{\n\tinit(buf);\n}\n\ngzstreambase::gzstreambase(const filesystem::path& name, int mode) :\n\tbuf(new gzstreambuf())\n{\n\tinit(buf);\n\topen(name, mode);\n}\n\ngzstreambase::~gzstreambase()\n{\n\tbuf->close();\n\tdelete buf;\n}\n\nvoid gzstreambase::open(const filesystem::path& name, int open_mode)\n{\n\tif(!buf->open(name, open_mode))\n\t\tclear(rdstate() | std::ios::badbit);\n}\n\nvoid gzstreambase::close()\n{\n\tif(buf->is_open())\n\t{\n\t\tif(!buf->close())\n\t\t\tclear(rdstate() | std::ios::badbit);\n\t}\n}\n\nstd::streambuf* gzstreambase::rdbuf()\n{\n\treturn buf;\n}\n\n///////////////////////////////////////////////////////////////////\n// igzstream\n\nigzstream::igzstream() :\n\tgzstreambase(),\n\tstd::istream(buf)\n{\n}\n\nigzstream::igzstream(const filesystem::path& name) :\n\tgzstreambase(name, std::ios::in),\n\tstd::istream(buf)\n{\n}\n\nstd::streambuf* igzstream::rdbuf()\n{\n\treturn gzstreambase::rdbuf();\n}\n\nvoid igzstream::open(const filesystem::path& name)\n{\n\tgzstreambase::open(name, std::ios::in);\n}\n\n////////////////////////////////////////////////////////////////////\n// ogzstream\n\nogzstream::ogzstream() :\n\tgzstreambase(),\n\tstd::ostream(buf)\n{\n}\n\nogzstream::ogzstream(const filesystem::path& name) :\n\tgzstreambase(name, std::ios::out),\n\tstd::ostream(buf)\n{\n}\n\nstd::streambuf* ogzstream::rdbuf()\n{\n\treturn gzstreambase::rdbuf();\n}\n\nvoid ogzstream::open(const filesystem::path& name)\n{\n\tgzstreambase::open(name, std::ios::out);\n}\n\n} // namespace filesystem\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/gzstream.h",
    "content": "#ifndef K3DSDK_GZSTREAM_H\n#define K3DSDK_GZSTREAM_H\n\n// ============================================================================\n// gzstream, C++ iostream classes wrapping the zlib compression library.\n// Copyright (C) 2001  Deepak Bandyopadhyay, Lutz Kettner\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 2.1 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n// ============================================================================\n//\n// File          : gzstream.h\n// Revision      : $Revision: 1.3 $\n// Revision_date : $Date: 2007/02/17 01:35:57 $\n// Author(s)     : Deepak Bandyopadhyay, Lutz Kettner\n//\n// Standard streambuf implementation following Nicolai Josuttis, \"The\n// Standard C++ Library\".\n// ============================================================================\n\n// Integrated into the K-3D SDK by Tim Shead, April 2006\n\n#include <iostream>\n\nnamespace k3d\n{\n\nnamespace filesystem\n{\n\nclass gzstreambuf;\nclass path;\n\nclass gzstreambase :\n\tvirtual public std::ios\n{\nprotected:\n\tgzstreambuf* const buf;\n\npublic:\n\tgzstreambase();\n\tgzstreambase(const filesystem::path& name, int open_mode);\n\t~gzstreambase();\n\n\tvoid open(const filesystem::path& name, int open_mode);\n\tvoid close();\n\tstd::streambuf* rdbuf();\n};\n\n/// ifstream replacement that can read files with gzip compression\n/** \\todo Implement this using boost::iostreams */\nclass igzstream :\n\tpublic gzstreambase,\n\tpublic std::istream\n{\npublic:\n\tigzstream();\n\tigzstream(const filesystem::path& name);\n\n\tstd::streambuf* rdbuf();\n\tvoid open(const filesystem::path& name);\n};\n\n/// ofstream replacement that writes files with gzip compression\n/** \\todo Implement this using boost::iostreams */\nclass ogzstream :\n\tpublic gzstreambase,\n\tpublic std::ostream\n{\npublic:\n\togzstream();\n\togzstream(const filesystem::path& name);\n\n\tstd::streambuf* rdbuf();\n\tvoid open(const filesystem::path& name);\n};\n\n} // namespace filesystem\n\n} // namespace k3d\n\n#endif // !K3DSDK_GZSTREAM_H\n\n"
  },
  {
    "path": "k3dsdk/high_res_timer.h",
    "content": "#ifndef K3DSDK_HIGH_RES_TIMER_H\n#define K3DSDK_HIGH_RES_TIMER_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares timer classes for performance tuning\n\t\t\\author Ed Millard (emillard@direcway.com)\n*/\n\n#include <k3d-platform-config.h>\n\n#include <k3dsdk/result.h>\n\n#include <boost/utility.hpp>\n#include <iostream>\n#include <string>\n\n\n#ifdef K3D_API_WIN32\n\t#include <k3dsdk/win32.h>\n#else\n\t#include <sys/time.h>\n#endif // K3D_API_WIN32\n\nnamespace k3d\n{\n\n////////////////////////////////////////////////////////////////////////////////////////////////\n// nanotime\n\n/* Un-comment this if you require more accurate timing for profiling purposes\n\n/// Retrieves a timestamp using an x86-specific CPU counter.  Note that because we are dividing by a fixed number instead of the actual CPU frequency, the result doesn't represent real-world units, but it can still be used to obtain accurate relative timing for profiling.\ninline double nanotime()\n{\n#if defined K3D_HAVE_X86\n\n\tunsigned long long int val;\n\t__asm__ __volatile__(\"rdtsc\" : \"=A\" (val) : );\n\treturn static_cast<double>(val) / 1000000000.0;\n#endif\n}\n\n*/\n\n#ifdef K3D_API_WIN32\n\n/// Retrieves a timestamp in seconds using the Win32 high performance counters\ninline double nanotime()\n{\n\tLARGE_INTEGER timestamp;\n\tLARGE_INTEGER frequency;\n\treturn_val_if_fail(QueryPerformanceCounter(&timestamp) && QueryPerformanceFrequency(&frequency), 0.0);\n\n\treturn static_cast<double>(timestamp.QuadPart) / static_cast<double>(frequency.QuadPart);\n}\n\n#else // K3D_API_WIN32\n\n/// Retrieves a timestamp in seconds using gettimeofday() for portable timing\ninline double nanotime()\n{\n\ttimeval tv;\n\tgettimeofday(&tv, 0);\n\n\treturn tv.tv_sec + static_cast<double>(tv.tv_usec) / 1000000;\n}\n\n#endif // !K3D_API_WIN32\n\n////////////////////////////////////////////////////////////////////////////////////////////////\n// timer\n\n/// Measures elapsed time using a high-resolution timer.  Intentionally modelled on boost::timer\nclass timer\n{\npublic:\n\ttimer() :\n\t\tm_start(nanotime())\n\t{\n\t}\n\t\n\tvoid restart()\n\t{\n\t\tm_start = nanotime();\n\t}\n\t\n\tdouble elapsed() const\n\t{\n\t\treturn nanotime() - m_start;\n\t}\n\t\nprivate:\n\tdouble m_start;\n};\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n// progress_timer\n\n/// Measures elapsed time using a high-resolution timer, printing the results to a stream on destruction.  Intentionally modelled on boost::progress_timer\nclass progress_timer :\n\tpublic timer,\n\tpublic boost::noncopyable\n{\npublic:\n\tprogress_timer(std::ostream& Stream = log()) :\n\t\tm_stream(Stream)\n\t{\n\t}\n\t\n\t~progress_timer()\n\t{\n\t\tm_stream << elapsed() << \" s\\n\";\n\t}\n\nprivate:\n\tstd::ostream& m_stream;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_HIGH_RES_TIMER_H\n"
  },
  {
    "path": "k3dsdk/hints.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/hints.h>\n#include <k3dsdk/result.h>\n\n#include <ostream>\n\nnamespace k3d\n{\n\nnamespace hint\n{\n\n//////////////////////////////////////////////////////////////////////////////\n// bitmap_dimensions_changed\n\nihint* bitmap_dimensions_changed::clone()\n{\n\treturn new bitmap_dimensions_changed(*this);\n}\n\nvoid bitmap_dimensions_changed::print(std::ostream& Stream)\n{\n\tStream << \"bitmap_dimensions_changed\";\n}\n\nbitmap_dimensions_changed* bitmap_dimensions_changed::instance()\n{\n\tstatic bitmap_dimensions_changed hint;\n\treturn &hint;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// bitmap_pixels_changed\n\nihint* bitmap_pixels_changed::clone()\n{\n\treturn new bitmap_pixels_changed(*this);\n}\n\nvoid bitmap_pixels_changed::print(std::ostream& Stream)\n{\n\tStream << \"bitmap_pixels_changed\";\n}\n\nbitmap_pixels_changed* bitmap_pixels_changed::instance()\n{\n\tstatic bitmap_pixels_changed hint;\n\treturn &hint;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// selection_changed\n\nihint* selection_changed::clone()\n{\n\treturn new selection_changed(*this);\n}\n\nvoid selection_changed::print(std::ostream& Stream)\n{\n\tStream << \"selection_changed\";\n}\n\nselection_changed* selection_changed::instance()\n{\n\tstatic selection_changed hint;\n\treturn &hint;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// mesh_geometry_changed\n\nihint* mesh_geometry_changed::clone()\n{\n\treturn new mesh_geometry_changed(*this);\n}\n\nvoid mesh_geometry_changed::print(std::ostream& Stream)\n{\n\tStream << \"mesh_geometry_changed\";\n}\n\nmesh_geometry_changed* mesh_geometry_changed::instance()\n{\n\tstatic mesh_geometry_changed hint;\n\treturn &hint;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// mesh_topology_changed\n\nihint* mesh_topology_changed::clone()\n{\n\treturn new mesh_topology_changed(*this);\n}\n\nvoid mesh_topology_changed::print(std::ostream& Stream)\n{\n\tStream << \"mesh_topology_changed\";\n}\n\nmesh_topology_changed* mesh_topology_changed::instance()\n{\n\tstatic mesh_topology_changed hint;\n\treturn &hint;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// mesh_deleted\n\nihint* mesh_deleted::clone()\n{\n\treturn new mesh_deleted(*this);\n}\n\nvoid mesh_deleted::print(std::ostream& Stream)\n{\n\tStream << \"mesh_deleted\";\n}\n\nmesh_deleted* mesh_deleted::instance()\n{\n\tstatic mesh_deleted hint;\n\treturn &hint;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// file_changed\n\nihint* file_changed::clone()\n{\n\treturn new file_changed(*this);\n}\n\nvoid file_changed::print(std::ostream& Stream)\n{\n\tStream << \"file_changed\";\n}\n\nfile_changed* file_changed::instance()\n{\n\tstatic file_changed hint;\n\treturn &hint;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// graph_topology_changed\n\nihint* graph_topology_changed::clone()\n{\n\treturn new graph_topology_changed(*this);\n}\n\nvoid graph_topology_changed::print(std::ostream& Stream)\n{\n\tStream << \"graph_topology_changed\";\n}\n\ngraph_topology_changed* graph_topology_changed::instance()\n{\n\tstatic graph_topology_changed hint;\n\treturn &hint;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// graph_attributes_changed\n\nihint* graph_attributes_changed::clone()\n{\n\treturn new graph_attributes_changed(*this);\n}\n\nvoid graph_attributes_changed::print(std::ostream& Stream)\n{\n\tStream << \"graph_topology_changed\";\n}\n\ngraph_attributes_changed* graph_attributes_changed::instance()\n{\n\tstatic graph_attributes_changed hint;\n\treturn &hint;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// print\n\nprint::print(ihint* Hint) :\n\thint(Hint)\n{\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const print& RHS)\n{\n\tif(RHS.hint)\n\t\tRHS.hint->print(Stream);\n\telse\n\t\tStream << \"(none)\";\n\t\n\treturn Stream;\n}\n\n} // namespace hint\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/hints.h",
    "content": "#ifndef K3DSDK_HINTS_H\n#define K3DSDK_HINTS_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/ihint.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/signal_system.h>\n\n#include <boost/any.hpp>\n\n#include <iosfwd>\n\nnamespace k3d\n{\n\n/// Namespace reserved for \"hints\" that pass metadata about an upstream change to downstream nodes\nnamespace hint\n{\n\n//////////////////////////////////////////////////////////////////////////////\n// slot_t\n\n/// iostream-compatible manipulator object that serializes information about a hint object\nclass print\n{\npublic:\n\tprint(ihint* Hint);\n\n\tihint* const hint;\n};\n\n/// Stream serialization\nstd::ostream& operator<<(std::ostream& Stream, const print& RHS);\n\n//////////////////////////////////////////////////////////////////////////////\n// slot_t\n\n/// Defines a standard slot that receives a hint\ntypedef sigc::slot<void, ihint*> slot_t;\n\n//////////////////////////////////////////////////////////////////////////////\n// bitmap_dimensions_changed\n\n/// Hint passed to downstream nodes to indicate that the pixel dimensions of a bitmap have changed (and thus its internal memory).\nclass bitmap_dimensions_changed :\n\tpublic ihint\n{\npublic:\n\tihint* clone();\n\tvoid print(std::ostream& Stream);\n\n\tstatic bitmap_dimensions_changed* instance();\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// bitmap_pixels_changed\n\n/// Hint passed to downstream nodes to indicate that the pixel values of a bitmap have changed (i.e. one-or-more pixels have changed color).\nclass bitmap_pixels_changed :\n\tpublic ihint\n{\npublic:\n\tihint* clone();\n\tvoid print(std::ostream& Stream);\n\n\tstatic bitmap_pixels_changed* instance();\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// selection_changed\n\n/// Hint object that indicates that an object's selection state has changed\nclass selection_changed :\n\tpublic ihint\n{\npublic:\n\tihint* clone();\n\tvoid print(std::ostream& Stream);\n\n\tstatic selection_changed* instance();\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// mesh_geometry_changed\n\n/// Hint object that indicates that a mesh's geometry (the locations of its points) has changed\nclass mesh_geometry_changed :\n\tpublic ihint\n{\npublic:\n\tihint* clone();\n\tvoid print(std::ostream& Stream);\n\n\tstatic mesh_geometry_changed* instance();\n\n\t/// Indices of the points affected by the change\n\tk3d::mesh::indices_t changed_points;\n\t/// Transformation matrix used for the change\n\tk3d::matrix4 transformation_matrix;\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// mesh_topology_changed\n\n/// Hint object that indicates that a mesh's topology has changed\nclass mesh_topology_changed :\n\tpublic ihint\n{\npublic:\n\tihint* clone();\n\tvoid print(std::ostream& Stream);\n\n\tstatic mesh_topology_changed* instance();\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// mesh_deleted\n\n/// Hint object that indicates a mesh was deleted\nclass mesh_deleted :\n\tpublic ihint\n{\npublic:\n\tihint* clone();\n\tvoid print(std::ostream& Stream);\n\n\tstatic mesh_deleted* instance();\n};\n\t\n//////////////////////////////////////////////////////////////////////////////\n// file_changed\n\n/// Hint object that indicates a file was changed\nclass file_changed :\n\tpublic ihint\n{\npublic:\n\tihint* clone();\n\tvoid print(std::ostream& Stream);\n\n\tstatic file_changed* instance();\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// graph_topology_changed\n\n/// Hint object that indicates that a graph's topology has changed\nclass graph_topology_changed :\n\tpublic ihint\n{\npublic:\n\tihint* clone();\n\tvoid print(std::ostream& Stream);\n\n\tstatic graph_topology_changed* instance();\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// graph_attributes_changed\n\n/// Hint object that indicates that a graph's attributes have changed\nclass graph_attributes_changed :\n\tpublic ihint\n{\npublic:\n\tihint* clone();\n\tvoid print(std::ostream& Stream);\n\n\tstatic graph_attributes_changed* instance();\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// any\n\n/// Used when creating a hint-mapping that matches any incoming hint type.\nclass any\n{\npublic:\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// none\n\n/// Used when creating a hint-mapping that maps to a NULL (\"none\") hint.\nclass none\n{\npublic:\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// unchanged\n\n/// Used when creating a hint-mapping that does not convert hints.\nclass unchanged\n{\npublic:\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// hint_traits\n\n/// Hint traits template responsible for matching and converting hints.\ntemplate<typename HintT>\nclass hint_traits\n{\npublic:\n};\n\ntemplate<>\nclass hint_traits<bitmap_dimensions_changed>\n{\npublic:\n\tstatic bool_t match(ihint* Hint)\n\t{\n\t\treturn dynamic_cast<bitmap_dimensions_changed*>(Hint);\n\t}\n\n\tstatic ihint* convert(ihint*)\n\t{\n\t\tstatic bitmap_dimensions_changed hint;\n\t\treturn &hint;\n\t}\n};\n\ntemplate<>\nclass hint_traits<bitmap_pixels_changed>\n{\npublic:\n\tstatic bool_t match(ihint* Hint)\n\t{\n\t\treturn dynamic_cast<bitmap_pixels_changed*>(Hint);\n\t}\n\n\tstatic ihint* convert(ihint*)\n\t{\n\t\tstatic bitmap_pixels_changed hint;\n\t\treturn &hint;\n\t}\n};\n\ntemplate<>\nclass hint_traits<selection_changed>\n{\npublic:\n\tstatic bool_t match(ihint* Hint)\n\t{\n\t\treturn dynamic_cast<selection_changed*>(Hint);\n\t}\n\n\tstatic ihint* convert(ihint*)\n\t{\n\t\tstatic selection_changed hint;\n\t\treturn &hint;\n\t}\n};\n\ntemplate<>\nclass hint_traits<mesh_topology_changed>\n{\npublic:\n\tstatic bool_t match(ihint* Hint)\n\t{\n\t\treturn dynamic_cast<mesh_topology_changed*>(Hint);\n\t}\n\n\tstatic ihint* convert(ihint*)\n\t{\n\t\tstatic mesh_topology_changed hint;\n\t\treturn &hint;\n\t}\n};\n\ntemplate<>\nclass hint_traits<mesh_geometry_changed>\n{\npublic:\n\tstatic bool_t match(ihint* Hint)\n\t{\n\t\treturn dynamic_cast<mesh_geometry_changed*>(Hint);\n\t}\n\n\tstatic ihint* convert(ihint*)\n\t{\n\t\tstatic mesh_geometry_changed hint;\n\t\treturn &hint;\n\t}\n};\n\ntemplate<>\nclass hint_traits<graph_topology_changed>\n{\npublic:\n\tstatic bool_t match(ihint* Hint)\n\t{\n\t\treturn dynamic_cast<graph_topology_changed*>(Hint);\n\t}\n\n\tstatic ihint* convert(ihint*)\n\t{\n\t\tstatic graph_topology_changed hint;\n\t\treturn &hint;\n\t}\n};\n\ntemplate<>\nclass hint_traits<graph_attributes_changed>\n{\npublic:\n\tstatic bool_t match(ihint* Hint)\n\t{\n\t\treturn dynamic_cast<graph_attributes_changed*>(Hint);\n\t}\n\n\tstatic ihint* convert(ihint*)\n\t{\n\t\tstatic graph_attributes_changed hint;\n\t\treturn &hint;\n\t}\n};\n\ntemplate<>\nclass hint_traits<any>\n{\npublic:\n\tstatic bool_t match(ihint*)\n\t{\n\t\treturn true;\n\t}\n};\n\ntemplate<>\nclass hint_traits<none>\n{\npublic:\n\tstatic bool_t match(ihint*)\n\t{\n\t\treturn false;\n\t}\n\n\tstatic ihint* convert(ihint*)\n\t{\n\t\treturn 0;\n\t}\n};\n\ntemplate<>\nclass hint_traits<unchanged>\n{\npublic:\n\tstatic ihint* convert(ihint* Hint)\n\t{\n\t\treturn Hint;\n\t}\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// last_conversion\n\nclass last_conversion\n{\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// convert\n\ntemplate<typename SourceT, typename TargetT, typename NextT = last_conversion>\nstruct convert\n{\n\ttypedef SourceT Source;\n\ttypedef TargetT Target;\n\ttypedef NextT Next;\n};\n\nnamespace detail\n{\n\ntemplate<typename ListT>\nvoid execute(ihint* const Hint, const slot_t& Slot)\n{\n\tif(hint_traits<typename ListT::Source>::match(Hint))\n\t{\n\t\tSlot(hint_traits<typename ListT::Target>::convert(Hint));\n\t}\n\telse\n\t{\n\t\texecute<typename ListT::Next>(Hint, Slot);\n\t}\n}\n\ntemplate<>\ninline void execute<last_conversion>(ihint* const Hint, const slot_t&)\n{\n\tstd::cerr << \"unhandled hint: \" << print(Hint) << std::endl;\n}\n\ntemplate<typename ListT>\nclass converter\n{\npublic:\n\tconverter(const slot_t& Slot) :\n\t\tslot(Slot)\n\t{\n\t}\n\n\tvoid operator()(ihint* const Hint)\n\t{\n\t\texecute<ListT>(Hint, slot);\n\t}\n\nprivate:\n\tslot_t slot;\n};\n\n} // namespace detail\n\n//////////////////////////////////////////////////////////////////////////////\n// converter\n\n/// Factory function for creating hint-converter objects.  You can pass the\n/// result from converter() to the connect() method of a signal, to establish\n/// a hint-mapping.\ntemplate<typename ListT>\ndetail::converter<ListT> converter(const sigc::slot<void, ihint*>& Slot)\n{\n\treturn detail::converter<ListT>(Slot);\n}\n\n} // namespace hint\n\n} // namespace k3d\n\n#endif // !K3DSDK_HINTS_H\n\n"
  },
  {
    "path": "k3dsdk/hyperboloid.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-200 7, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/hyperboloid.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\nnamespace k3d\n{\n\nnamespace hyperboloid\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::matrices_t& Matrices,\n\tconst mesh::materials_t& Materials,\n\tconst mesh::points_t& StartPoints,\n\tconst mesh::points_t& EndPoints,\n\tconst mesh::doubles_t& SweepAngles,\n\tconst mesh::selection_t& Selections,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& SurfaceAttributes,\n\tconst mesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tstart_points(StartPoints),\n\tend_points(EndPoints),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::matrices_t& Matrices,\n\tmesh::materials_t& Materials,\n\tmesh::points_t& StartPoints,\n\tmesh::points_t& EndPoints,\n\tmesh::doubles_t& SweepAngles,\n\tmesh::selection_t& Selections,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& SurfaceAttributes,\n\tmesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tstart_points(StartPoints),\n\tend_points(EndPoints),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"hyperboloid\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::matrices_t >(\"matrices\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::materials_t >(\"materials\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::points_t >(\"start_points\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::points_t >(\"end_points\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"sweep_angles\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::selection_t>(\"selections\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"surface\"],\n\t\tgeneric_primitive.attributes[\"parameter\"]\n\t\t);\n\n\tresult->selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"hyperboloid\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tconst mesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tconst mesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tconst mesh::points_t& start_points = require_array<mesh::points_t >(Primitive, surface_structure, \"start_points\");\n\t\tconst mesh::points_t& end_points = require_array<mesh::points_t >(Primitive, surface_structure, \"end_points\");\n\t\tconst mesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tconst mesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new const_primitive(matrices, materials, start_points, end_points, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"hyperboloid\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tmesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tmesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tmesh::points_t& start_points = require_array<mesh::points_t >(Primitive, surface_structure, \"start_points\");\n\t\tmesh::points_t& end_points = require_array<mesh::points_t >(Primitive, surface_structure, \"end_points\");\n\t\tmesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tmesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new primitive(matrices, materials, start_points, end_points, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"hyperboloid\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace hyperboloid\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/hyperboloid.h",
    "content": "#ifndef K3DSDK_HYPERBOLOID_H\n#define K3DSDK_HYPERBOLOID_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace hyperboloid\n{\n\n/// Gathers the member arrays of a hyperboloid primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::matrices_t& Matrices,\n\t\tconst mesh::materials_t& Materials,\n\t\tconst mesh::points_t& StartPoints,\n\t\tconst mesh::points_t& EndPoints,\n\t\tconst mesh::doubles_t& SweepAngles,\n\t\tconst mesh::selection_t& Selections,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& SurfaceAttributes,\n\t\tconst mesh::table_t& ParameterAttributes);\n\n\tconst mesh::matrices_t& matrices;\n\tconst mesh::materials_t& materials;\n\tconst mesh::points_t& start_points;\n\tconst mesh::points_t& end_points;\n\tconst mesh::doubles_t& sweep_angles;\n\tconst mesh::selection_t& selections;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& surface_attributes;\n\tconst mesh::table_t& parameter_attributes;\n};\n\n/// Gathers the member arrays of a hyperboloid primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::matrices_t& Matrices,\n\t\tmesh::materials_t& Materials,\n\t\tmesh::points_t& StartPoints,\n\t\tmesh::points_t& EndPoints,\n\t\tmesh::doubles_t& SweepAngles,\n\t\tmesh::selection_t& Selections,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& SurfaceAttributes,\n\t\tmesh::table_t& ParameterAttributes);\n\n\tmesh::matrices_t& matrices;\n\tmesh::materials_t& materials;\n\tmesh::points_t& start_points;\n\tmesh::points_t& end_points;\n\tmesh::doubles_t& sweep_angles;\n\tmesh::selection_t& selections;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& surface_attributes;\n\tmesh::table_t& parameter_attributes;\n};\n\n/// Creates a new hyperboloid mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid hyperboloid primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid hyperboloid primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid hyperboloid primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace hyperboloid\n\n} // namespace k3d\n\n#endif // !K3DSDK_HYPERBOLOID_H\n\n"
  },
  {
    "path": "k3dsdk/i3d_2d_mapping.h",
    "content": "#ifndef K3DSDK_I3D_2D_MAPPING_H\n#define K3DSDK_I3D_2D_MAPPING_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/bounding_box3.h>\n#include <k3dsdk/point2.h>\n\nnamespace k3d\n{\n\nclass point3;\nclass bounding_box3;\n\nclass i3d_2d_mapping :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual const point2 map_3d_to_2d(const point3& Position, const bounding_box3& Bounds) = 0;\n\nprotected:\n\ti3d_2d_mapping() {}\n\ti3d_2d_mapping(const i3d_2d_mapping& Other) : iunknown(Other) {}\n\ti3d_2d_mapping& operator = (const i3d_2d_mapping&) { return *this; }\n\tvirtual ~i3d_2d_mapping() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_I3D_2D_MAPPING_H\n\n"
  },
  {
    "path": "k3dsdk/iapplication.h",
    "content": "#ifndef K3DSDK_IAPPLICATION_H\n#define K3DSDK_IAPPLICATION_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\nclass idocument;\n\n/// Abstract interface for the global K-3D Application object\nclass iapplication :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Exit K-3D if safe to do so\n\tvirtual bool exit() = 0;\n\n\t/// Creates a new K-3D document (could return NULL)\n\tvirtual idocument* create_document() = 0;\n\t/// Closes an open K-3D document\n\tvirtual void close_document(idocument& Document) = 0;\n\n\t/// A collection of idocument objects\n\ttypedef std::vector<idocument*> document_collection_t;\n\t/// Returns the collection of open documents\n\tvirtual const document_collection_t documents() = 0;\n\n\t// Signals\n\n\t/// Defines a signal emitted to display progress messages to the user during application startup\n\ttypedef sigc::signal<void, const std::string&> startup_message_signal_t;\n\tvirtual startup_message_signal_t& startup_message_signal() = 0;\n\n\t/// Connects a slot to a signal emitted when the application is closing\n\tvirtual sigc::connection connect_close_signal(const sigc::slot<void>& Slot) = 0;\n\n\t/// Connects a slot to a signal emitted when an existing document is closed\n\tvirtual sigc::connection connect_close_document_signal(const sigc::slot<void, idocument&>& Slot) = 0;\n\nprotected:\n\tiapplication() {}\n\tiapplication(const iapplication& Other) : iunknown(Other) {}\n\tiapplication& operator = (const iapplication&) { return *this; }\n\tvirtual ~iapplication() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IAPPLICATION_H\n\n"
  },
  {
    "path": "k3dsdk/iapplication_plugin_factory.h",
    "content": "#ifndef K3DSDK_IAPPLICATION_PLUGIN_FACTORY_H\n#define K3DSDK_IAPPLICATION_PLUGIN_FACTORY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares iapplication_plugin_factory, an abstract factory interface for application-context plugin objects\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n// Forward declarations\nclass iapplication;\n\n/// Abstract factory interface for plugin objects\nclass iapplication_plugin_factory :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Creates a new instance of a plugin object\n\tvirtual iunknown* create_plugin() = 0;\n\nprotected:\n\tiapplication_plugin_factory() {}\n\tiapplication_plugin_factory(const iapplication_plugin_factory& Other) : iunknown(Other) {}\n\tiapplication_plugin_factory& operator=(const iapplication_plugin_factory&) { return *this; }\n\tvirtual ~iapplication_plugin_factory() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IAPPLICATION_PLUGIN_FACTORY_H\n\n"
  },
  {
    "path": "k3dsdk/iattribute_property_ri.h",
    "content": "#ifndef K3DSDK_IATTRIBUTE_PROPERTY_RI_H\n#define K3DSDK_IATTRIBUTE_PROPERTY_RI_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\n/// Abstract interface for discovering information about a RenderMan attribute property\nclass iattribute_property :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual const string_t property_attribute_name() = 0;\n\nprotected:\n\tiattribute_property() {}\n\tiattribute_property(const iattribute_property& Other) : iunknown(Other) {}\n\tiattribute_property& operator = (const iattribute_property&) { return *this; }\n\tvirtual ~iattribute_property() {}\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_IATTRIBUTE_PROPERTY_RI_H\n\n"
  },
  {
    "path": "k3dsdk/ibitmap_exporter.h",
    "content": "#ifndef K3DSDK_IBITMAP_EXPORTER_H\n#define K3DSDK_IBITMAP_EXPORTER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\n\n/// Abstract interface for objects capable of exporting bitmap images\nclass ibitmap_exporter :\n\tpublic virtual k3d::iunknown\n{\npublic:\n\tvirtual ~ibitmap_exporter() {}\n\n\tvirtual bool write_file(const filesystem::path& File, const bitmap& Bitmap) = 0;\n\nprotected:\n\tibitmap_exporter() {}\n\tibitmap_exporter(const ibitmap_exporter&) {}\n\tibitmap_exporter& operator = (const ibitmap_exporter&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IBITMAP_EXPORTER_H\n\n"
  },
  {
    "path": "k3dsdk/ibitmap_importer.h",
    "content": "#ifndef K3DSDK_IBITMAP_IMPORTER_H\n#define K3DSDK_IBITMAP_IMPORTER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\n\n/// Abstract interface for objects capable of importing bitmaps from a filesystem\nclass ibitmap_importer :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~ibitmap_importer() {}\n\n\tvirtual bool read_file(const filesystem::path& File, bitmap& Bitmap) = 0;\n\nprotected:\n\tibitmap_importer() {}\n\tibitmap_importer(const ibitmap_importer&) {}\n\tibitmap_importer& operator=(const ibitmap_importer&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IBITMAP_IMPORTER_H\n\n"
  },
  {
    "path": "k3dsdk/ibitmap_sink.h",
    "content": "#ifndef K3DSDK_IBITMAP_SINK_H\n#define K3DSDK_IBITMAP_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares ibitmap_sink, an interface for objects that can consume bitmap data\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for objects that can consume bitmap data\nclass ibitmap_sink :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& bitmap_sink_input() = 0;\n\nprotected:\n\tibitmap_sink() {}\n\tibitmap_sink(const ibitmap_sink&) {}\n\tibitmap_sink& operator=(const ibitmap_sink&) { return *this; }\n\tvirtual ~ibitmap_sink() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IBITMAP_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/ibitmap_source.h",
    "content": "#ifndef K3DSDK_IBITMAP_SOURCE_H\n#define K3DSDK_IBITMAP_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares ibitmap_source, an interface for objects that can act as a source of bitmapes\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n// Forward declarations\nclass iproperty;\n\n/// Abstract interface for objects that can act as a source of bitmapes\nclass ibitmap_source :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& bitmap_source_output() = 0;\n\nprotected:\n\tibitmap_source() {}\n\tibitmap_source(const ibitmap_source&) {}\n\tibitmap_source& operator=(const ibitmap_source&) { return *this; }\n\tvirtual ~ibitmap_source() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IBITMAP_SOURCE_H\n\n\n"
  },
  {
    "path": "k3dsdk/ibounded.h",
    "content": "#ifndef K3DSDK_IBOUNDED_H\n#define K3DSDK_IBOUNDED_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/bounding_box3.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface for quickly determining the bounding box of objects that fill a 3D volume\nclass ibounded :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Returns the bounding box of an object (within its local coordinate system)\n\tvirtual const bounding_box3 extents() = 0;\n\nprotected:\n\tibounded() {}\n\tibounded(const ibounded&) {}\n\tibounded& operator=(const ibounded&) { return *this; }\n\tvirtual ~ibounded() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IBOUNDED_H\n"
  },
  {
    "path": "k3dsdk/icamera.h",
    "content": "#ifndef K3DSDK_ICAMERA_H\n#define K3DSDK_ICAMERA_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares k3d::icamera, an abstract interface for an object that can act as a camera (provide location and viewing frustum data)\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass icrop_window;\nclass iprojection;\nclass iproperty;\nclass imatrix_source;\n\n/// Abstract interface for objects that can host (provide position and projection information to) a viewport\nclass icamera :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Returns the required position data for this camera\n\tvirtual imatrix_source& transformation() = 0;\n\t/// Returns the required viewing projection for this camera\n\tvirtual iprojection& projection() = 0;\n\t/// Returns the required crop-window for this camera\n\tvirtual icrop_window& crop_window() = 0;\n\t/// Returns the transformable object that should be altered during interactive user navigation\n\tvirtual imatrix_source& navigation_target() = 0;\n\t/// Retuns the camera's world target, a point (in world coordinates) around which the viewport orbits\n\tvirtual iproperty& world_target() = 0;\n\nprotected:\n\ticamera() {}\n\ticamera(const icamera& Other) : iunknown(Other) {}\n\ticamera& operator=(const icamera&) { return *this; }\n\tvirtual ~icamera() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ICAMERA_H\n\n"
  },
  {
    "path": "k3dsdk/icolor_source.h",
    "content": "#ifndef K3DSDK_ICOLOR_SOURCE_H\n#define K3DSDK_ICOLOR_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares icolor_source, an interface for objects that can act as a source of color values\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for objects that can act as a source of color values\nclass icolor_source :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& color_source_output() = 0;\n\nprotected:\n\ticolor_source() {}\n\ticolor_source(const icolor_source&) {}\n\ticolor_source& operator=(const icolor_source&) { return *this; }\n\tvirtual ~icolor_source() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ICOLOR_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/icrop_window.h",
    "content": "#ifndef K3DSDK_ICROP_WINDOW_H\n#define K3DSDK_ICROP_WINDOW_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for an object whose output can be cropped (units are in projection-space)\nclass icrop_window :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& crop_left() = 0;\n\tvirtual iproperty& crop_right() = 0;\n\tvirtual iproperty& crop_top() = 0;\n\tvirtual iproperty& crop_bottom() = 0;\n\nprotected:\n\ticrop_window() {}\n\ticrop_window(const icrop_window&) {}\n\ticrop_window& operator=(const icrop_window&) { return *this; }\n\tvirtual ~icrop_window() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ICROP_WINDOW_H\n"
  },
  {
    "path": "k3dsdk/idependencies.h",
    "content": "#ifndef K3DSDK_IDEPENDENCIES_H\n#define K3DSDK_IDEPENDENCIES_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares k3d::idependencies, an abstract interface that allows objects to register inter-object dependencies for serialization\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n// Forward class references\nclass inode;\n\n/// Abstract interface that allows objects to register dependencies for serialization\n/** \\note Currently unused */\nclass idependencies :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void register_object_dependency(inode& Object, const bool CopyByReference) = 0;\n\nprotected:\n\tidependencies() {}\n\tidependencies(const idependencies& Other) : iunknown(Other) {}\n\tidependencies& operator=(const idependencies&) { return *this; }\n\tvirtual ~idependencies() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IDEPENDENCIES_H\n"
  },
  {
    "path": "k3dsdk/idisplacement_shader_ri.h",
    "content": "#ifndef K3DSDK_IDISPLACEMENT_SHADER_RI_H\n#define K3DSDK_IDISPLACEMENT_SHADER_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nclass render_state;\n\t\n/// Abstract interface implemented by objects that encapsulate a RenderMan displacement shader\nclass idisplacement_shader :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void setup_renderman_displacement_shader(const render_state& State) = 0;\n\nprotected:\n\tidisplacement_shader() {}\n\tidisplacement_shader(const idisplacement_shader&) {}\n\tidisplacement_shader& operator=(const idisplacement_shader&) { return *this; }\n\tvirtual ~idisplacement_shader() {}\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_IDISPLACEMENT_SHADER_RI_H\n\n"
  },
  {
    "path": "k3dsdk/idocument.h",
    "content": "#ifndef K3DSDK_IDOCUMENT_H\n#define K3DSDK_IDOCUMENT_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares idocument, an abstract interface for an open K-3D document\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_accumulators.h>\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/uuid.h>\n\n#include <map>\n#include <string>\n\nnamespace k3d\n{\n\nclass ipipeline;\nclass inode_collection;\nclass inode_name_map;\nclass ipipeline_profiler;\nclass iproperty;\nclass istate_recorder;\n\n/// Abstract interface for an open K-3D document\nclass idocument :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Returns the collection of K-3D objects within this document\n\tvirtual inode_collection& nodes() = 0;\n\t/// Returns the directed acyclic graph of dependencies between object properties within this document\n\tvirtual ipipeline& pipeline() = 0;\n\t/// Returns an object that can be used to collect and distribute profiling data for the visualization pipeline\n\tvirtual ipipeline_profiler& pipeline_profiler() = 0;\n\t/// Returns the istate_recorder interface for this document\n\tvirtual istate_recorder& state_recorder() = 0;\n\n\t/// Returns an interface that provides a mapping of nodes to unique names\n\tvirtual inode_name_map& unique_node_names() = 0;\n\t\n\t/// Returns a property that will store the document filepath (could be empty)\n\tvirtual iproperty& path() = 0;\n\t/// Returns a property that will store the document title (could be empty string)\n\tvirtual iproperty& title() = 0;\n\n\t/// Defines a signal emitted when the document closes\n\ttypedef sigc::signal<void> close_signal_t;\n\tvirtual close_signal_t& close_signal() = 0;\n\nprotected:\n\tidocument() {}\n\tidocument(const idocument& Other) : iunknown(Other) {}\n\tidocument& operator=(const idocument&) { return *this; }\n\tvirtual ~idocument() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IDOCUMENT_H\n\n"
  },
  {
    "path": "k3dsdk/idocument_exporter.h",
    "content": "#ifndef K3DSDK_IDOCUMENT_EXPORTER_H\n#define K3DSDK_IDOCUMENT_EXPORTER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass idocument;\nnamespace filesystem { class path; }\n\t\n/// Abstract interface implemented by objects that can export data from a K-3D document\nclass idocument_exporter :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~idocument_exporter() {}\n\n\tvirtual bool write_file(idocument& Document, const filesystem::path& File) = 0;\n\nprotected:\n\tidocument_exporter() {}\n\tidocument_exporter(const idocument_exporter&) {}\n\tidocument_exporter& operator = (const idocument_exporter&) { return *this; }\n};\n\n} //namespace k3d\n\n#endif // !K3DSDK_IDOCUMENT_EXPORTER_H\n\n"
  },
  {
    "path": "k3dsdk/idocument_importer.h",
    "content": "#ifndef K3DSDK_IDOCUMENT_IMPORTER_H\n#define K3DSDK_IDOCUMENT_IMPORTER_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/imetadata.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass idocument;\nnamespace filesystem { class path; }\n\n/// Abstract interface for objects that can import data into an existing K-3D document\nclass idocument_importer :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~idocument_importer() {}\n\n\t/// Return metadata extracted from the file.\n\tvirtual imetadata::metadata_t get_file_metadata(const filesystem::path& File) = 0;\n\t/// Read the file data into a document.\n\tvirtual bool_t read_file(const filesystem::path& File, idocument& Document) = 0;\n\nprotected:\n\tidocument_importer() {}\n\tidocument_importer(const idocument_importer&) {}\n\tidocument_importer& operator = (const idocument_importer&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IDOCUMENT_IMPORTER_H\n\n"
  },
  {
    "path": "k3dsdk/idocument_plugin_factory.h",
    "content": "#ifndef K3DSDK_IDOCUMENT_PLUGIN_FACTORY_H\n#define K3DSDK_IDOCUMENT_PLUGIN_FACTORY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares idocument_plugin_factory, an abstract factory interface for document-context plugin objects\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass idocument;\nclass inode;\nclass iplugin_factory;\n\n/// Abstract factory interface for plugin objects\nclass idocument_plugin_factory :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Creates a new instance of a plugin object\n\tvirtual inode* create_plugin(iplugin_factory& Factory, idocument& Document) = 0;\n\nprotected:\n\tidocument_plugin_factory() {}\n\tidocument_plugin_factory(const idocument_plugin_factory& Other) : iunknown(Other) {}\n\tidocument_plugin_factory& operator=(const idocument_plugin_factory&) { return *this; }\n\tvirtual ~idocument_plugin_factory() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IDOCUMENT_PLUGIN_FACTORY_H\n\n"
  },
  {
    "path": "k3dsdk/idocument_sink.h",
    "content": "#ifndef K3DSDK_IDOCUMENT_SINK_H\n#define K3DSDK_IDOCUMENT_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass idocument;\n\n/// Abstract interface for objects that can be optionally 'bound' to a specific document\nclass idocument_sink :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~idocument_sink() {}\n\n\tvirtual void set_document(idocument* Document) = 0;\n\nprotected:\n\tidocument_sink() {}\n\tidocument_sink(const idocument_sink&) {}\n\tidocument_sink& operator = (const idocument_sink&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IDOCUMENT_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/idouble_source.h",
    "content": "#ifndef K3DSDK_IDOUBLE_SOURCE_H\n#define K3DSDK_IDOUBLE_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for objects that can act as a source of k3d::double_t values\nclass idouble_source :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& double_source_output() = 0;\n\nprotected:\n\tidouble_source() {}\n\tidouble_source(const idouble_source&) {}\n\tidouble_source& operator=(const idouble_source&) { return *this; }\n\tvirtual ~idouble_source() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IDOUBLE_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/ienumeration_property.h",
    "content": "#ifndef K3DSDK_IENUMERATION_PROPERTY_H\n#define K3DSDK_IENUMERATION_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares ienumeration_property, an abstract interface for discovering information about an enumerated property\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n\n#include <vector>\n\nnamespace k3d\n{\n\n/// Abstract interface for discovering information about an enumerated property\nclass ienumeration_property :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Stores information about an individual enumeration value\n\tstruct enumeration_value_t\n\t{\n\t\tenumeration_value_t(const k3d::string_t& Label, const k3d::string_t& Value, const k3d::string_t& Description) :\n\t\t\tlabel(Label),\n\t\t\tvalue(Value),\n\t\t\tdescription(Description)\n\t\t{\n\t\t}\n\t\t\n\t\tk3d::string_t label;\n\t\tk3d::string_t value;\n\t\tk3d::string_t description;\n\t};\n\t\n\t/// Defines a collection of enumeration values\n\ttypedef std::vector<enumeration_value_t> enumeration_values_t;\n\t\n\t/// Returns the set of all valid values for this property\n\tvirtual enumeration_values_t enumeration_values() = 0;\n\t/// Connects a slot to a signal that will be emitted whenever the set of enumeration values changes\n\tvirtual sigc::connection connect_enumeration_values_changed(const sigc::slot<void>& Slot) = 0;\n\nprotected:\n\tienumeration_property() {}\n\tienumeration_property(const ienumeration_property& Other) : iunknown(Other) {}\n\tienumeration_property& operator = (const ienumeration_property&) { return *this; }\n\tvirtual ~ienumeration_property() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IENUMERATION_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/ievent_loop.h",
    "content": "#ifndef K3DSDK_IEVENT_LOOP_H\n#define K3DSDK_IEVENT_LOOP_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\n#include <boost/program_options/parsers.hpp>\n\n#include <string>\n#include <vector>\n\nnamespace boost { namespace filesystem { class path; } }\nnamespace boost { namespace program_options { class options_description; } }\n\nnamespace k3d\n{\n\n/// Abstract interface for event loop (user interface) plugins\nclass ievent_loop :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~ievent_loop() {}\n\n\t/// Called by the host application to retrieve descriptions of command-line arguments for this plugin\n\tvirtual void get_command_line_arguments(boost::program_options::options_description& Description) = 0;\n\t/// Defines storage for parsed command-line arguments\n\ttypedef std::vector<boost::program_options::basic_option<char> > arguments_t;\n\t/// Called by the host application so the plugin can handle command-line arguments during startup\n\tvirtual const arguments_t parse_startup_arguments(const arguments_t& Arguments, bool& Quit, bool& Error) = 0;\n\t/// Called by the host application to display informational messages during startup\n\tvirtual void startup_message_handler(const std::string& Message) = 0;\n\t/// Called by the host application to display the \"normal\" user interface (and hide any startup / splash screens, etc)\n\tvirtual void display_user_interface() = 0;\n\t/// Called by the host application so the plugin can handle command-line arguments after startup is complete\n\tvirtual const arguments_t parse_runtime_arguments(const arguments_t& Arguments, bool& Quit, bool& Error) = 0;\n\t/// Called by the host application to start the main event-loop (if any)\n\tvirtual void start_event_loop() = 0;\n\t/// Called by the host application to stop the main event-loop (if any)\n\tvirtual void stop_event_loop() = 0;\n\nprotected:\n\tievent_loop() {}\n\tievent_loop(const ievent_loop&) {}\n\tievent_loop& operator = (const ievent_loop&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IEVENT_LOOP_H\n\n"
  },
  {
    "path": "k3dsdk/ifile_change_notifier.h",
    "content": "#ifndef K3DSDK_IFILE_CHANGE_NOTIFIER_H\n#define K3DSDK_IFILE_CHANGE_NOTIFIER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file ifile_change_notifier.h\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n\t\\created Dec 17, 2008\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace filesystem\n{\n\nclass path;\n\n}\n\n/// Interface implemented by objects that can signal changes to files.\nclass ifile_change_notifier :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~ifile_change_notifier() {}\n\t\n\t/// Call a slot whenever given filesystem path is modified.\n\t/**\n\t* Note that we are watching the\n\t* path, not an inode, so it isn't an error to specify a path for a nonexistent file.\n\t* The slot will be called when a file is created / modified / renamed / deleted at that\n\t* location.  Returns a nonzero watch identifier that can be used to cancel the watch later-on,\n\t* or 0 if there is an error.\n\t*/\n\tvirtual uint_t watch_file(const filesystem::path& Path, const sigc::slot<void>& Slot) = 0;\n\n\t/// Stop watching the given path.\n\tvirtual void unwatch_file(const uint_t WatchID) = 0;\n\n\t/// Blocks indefinitely until there is at least one file change ready to be signalled.\n\tvirtual void wait_for_changes() = 0;\n\n\t/// Returns the number of file changes that are pending and ready to be signalled.  This method never blocks.\n\tvirtual const uint_t change_count() = 0;\n\n\t/// Handles signalling for the next file change that is pending, if any.  This method never blocks.\n\tvirtual void signal_change() = 0;\n  \nprotected:\n\tifile_change_notifier() {}\n\tifile_change_notifier(const ifile_change_notifier&) {}\n\tifile_change_notifier& operator=(const ifile_change_notifier&) {return *this;}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IFILE_CHANGE_NOTIFIER_H\n"
  },
  {
    "path": "k3dsdk/ihint.h",
    "content": "#ifndef K3DSDK_IHINT_H\n#define K3DSDK_IHINT_H\n\n#include <k3dsdk/iunknown.h>\n#include <iosfwd>\n\nnamespace k3d\n{\n\n/// Abstract interface implemented by objects that can act as \"hints\" for change events\nclass ihint :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~ihint() {}\n\tvirtual ihint* clone() = 0;\n\tvirtual void print(std::ostream& Stream) = 0;\n\nprotected:\n\tihint() {}\n\tihint(const ihint& Other) : iunknown(Other) {}\n\tihint& operator=(const ihint&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IHINT_H\n\n"
  },
  {
    "path": "k3dsdk/iimager_shader_ri.h",
    "content": "#ifndef K3DSDK_IIMAGER_SHADER_RI_H\n#define K3DSDK_IIMAGER_SHADER_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nclass render_state;\n\t\n/// Abstract interface implemented by objects that encapsulate a RenderMan imager shader\nclass iimager_shader :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void setup_renderman_imager_shader(const render_state& State) = 0;\n\nprotected:\n\tiimager_shader() {}\n\tiimager_shader(const iimager_shader&) {}\n\tiimager_shader& operator=(const iimager_shader&) { return *this; }\n\tvirtual ~iimager_shader() {}\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_IIMAGER_SHADER_RI_H\n\n"
  },
  {
    "path": "k3dsdk/iint32_source.h",
    "content": "#ifndef K3DSDK_IINT32_SOURCE_H\n#define K3DSDK_IINT32_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License aint32 with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for objects that can act as a source of k3d::int32_t values\nclass iint32_source :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& int32_source_output() = 0;\n\nprotected:\n\tiint32_source() {}\n\tiint32_source(const iint32_source&) {}\n\tiint32_source& operator=(const iint32_source&) { return *this; }\n\tvirtual ~iint32_source() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IINT32_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/ikeyframer.h",
    "content": "#ifndef K3DSDK_IKEYFRAMER_H\n#define K3DSDK_IKEYFRAMER_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Abstract interface for objects that set keyframes\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/iproperty.h>\n\nnamespace k3d\n{\n\n/// Abstract interface for objects that set keyframes.\nclass ikeyframer\n{\npublic:\n\t\n\t/// List of the available keys\n\ttypedef std::list<iproperty*> keys_t;\n\n\t/// Set a keyframe. Inputs are implementation-dependent, and may come from properties.\n\tvirtual void keyframe() = 0;\n\t\n\t/// Delete the keyframe placed at the given time property\n\tvirtual void delete_key(iproperty* TimeProperty) = 0;\n\t\n\t/// Get the property that inputs key values\n\tvirtual iproperty& input_property() = 0;\n\t\n\t/// List with all the properties containing keytimes\n\tvirtual keys_t get_keys() = 0;\n\t\n\ttypedef sigc::signal<void> keys_changed_signal_t;\n\t\n\t/// Emitted when the list of keys changed\n\tvirtual keys_changed_signal_t& keys_changed_signal() = 0; \n\t\n\tvirtual ~ikeyframer() {}\n};\n\n}\n\n#endif // !K3DSDK_IKEYFRAMER_H\n"
  },
  {
    "path": "k3dsdk/ilight_gl.h",
    "content": "#ifndef K3DSDK_ILIGHT_GL_H\n#define K3DSDK_ILIGHT_GL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\n/// Abstract interface for objects that act as a light source while drawing OpenGL graphics\nclass ilight :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void setup_gl_light(const unsigned long LightNumber) = 0;\n\nprotected:\n\tilight() {}\n\tilight(const ilight&) {}\n\tilight& operator=(const ilight&) { return *this; }\n\tvirtual ~ilight() {}\n};\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_ILIGHT_GL_H\n\n"
  },
  {
    "path": "k3dsdk/ilight_ri.h",
    "content": "#ifndef K3DSDK_ILIGHT_RI_H\n#define K3DSDK_ILIGHT_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nclass render_state;\n\t\n/// Abstract interface for objects that can act as light sources while drawing RenderMan graphics\nclass ilight :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void setup_renderman_light(const render_state& State) = 0;\n\nprotected:\n\tilight() {}\n\tilight(const ilight& ) {}\n\tilight& operator=(const ilight& ) { return *this; }\n\tvirtual ~ilight() {}\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_ILIGHT_RI_H\n\n"
  },
  {
    "path": "k3dsdk/ilight_shader_ri.h",
    "content": "#ifndef K3DSDK_ILIGHT_SHADER_RI_H\n#define K3DSDK_ILIGHT_SHADER_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nclass render_state;\n\t\n/// Abstract interface implemented by objects that encapsulate a RenderMan light shader\nclass ilight_shader :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void setup_renderman_light_shader(const render_state& State) = 0;\n\tvirtual void setup_renderman_area_light_shader(const render_state& State) = 0;\n\nprotected:\n\tilight_shader() {}\n\tilight_shader(const ilight_shader&) {}\n\tilight_shader& operator=(const ilight_shader&) { return *this; }\n\tvirtual ~ilight_shader() {}\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_ILIGHT_SHADER_RI_H\n\n"
  },
  {
    "path": "k3dsdk/ilight_yafray.h",
    "content": "#ifndef K3DSDK_ILIGHT_YAFRAY_H\n#define K3DSDK_ILIGHT_YAFRAY_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <iosfwd>\n\nnamespace k3d\n{\n\nnamespace yafray\n{\n\n/// Abstract interface for YafRay light sources\nclass ilight :\n\tpublic virtual k3d::iunknown\n{\npublic:\n\tvirtual void setup_light(const k3d::string_t& Name, std::ostream& Stream) = 0;\n\nprotected:\n\tilight() {}\n\tilight(const ilight& ) {}\n\tilight& operator=(const ilight& ) { return *this; }\n\tvirtual ~ilight() {}\n};\n\n} // namespace yafray\n\n} // namespace k3d\n\n#endif // !K3DSDK_ILIGHT_YAFRAY_H\n"
  },
  {
    "path": "k3dsdk/ilist_property.h",
    "content": "#ifndef K3DSDK_ILIST_PROPERTY_H\n#define K3DSDK_ILIST_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares ilist_property, an abstract interface for discovering information about an enumerated property\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Abstract interface for discovering information about a list property (a property for which there is a set of predefined values, but other values are allowed)\ntemplate<typename data_t>\nclass ilist_property :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Defines a collection of list values\n\ttypedef std::vector<data_t> values_t;\n\t/// Returns the (non-exclusive) set of predefined values for this property\n\tvirtual values_t property_values() = 0;\n\nprotected:\n\tilist_property() {}\n\tilist_property(const ilist_property&) {}\n\tilist_property& operator = (const ilist_property&) { return *this; }\n\tvirtual ~ilist_property() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ILIST_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/imaterial.h",
    "content": "#ifndef K3DSDK_IMATERIAL_H\n#define K3DSDK_IMATERIAL_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface implemented by objects that can act as geometric surface materials\nclass imaterial :\n\tpublic virtual iunknown\n{\nprotected:\n\timaterial() {}\n\timaterial(const imaterial& Other) : iunknown(Other) {}\n\timaterial& operator=(const imaterial&) { return *this; }\n\tvirtual ~imaterial() {}\n};\n\n/// Specialization of difference::test that tests imaterial pointers for equality\nnamespace difference\n{\n\ninline void test(imaterial* const A, imaterial* const B, accumulator& Result)\n{\n\tResult.exact(A == B);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMATERIAL_H\n\n"
  },
  {
    "path": "k3dsdk/imaterial_ri.h",
    "content": "#ifndef K3DSDK_IMATERIAL_RI_H\n#define K3DSDK_IMATERIAL_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nclass render_state;\n\t\n/// Abstract interface implemented by objects that can act as a surface material while drawing RenderMan graphics\nclass imaterial :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void setup_renderman_material(const render_state& State) = 0;\n\nprotected:\n\timaterial() {}\n\timaterial(const imaterial& ) {}\n\timaterial& operator=(const imaterial& ) { return *this; }\n\tvirtual ~imaterial() {}\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMATERIAL_RI_H\n\n"
  },
  {
    "path": "k3dsdk/imaterial_sink.h",
    "content": "#ifndef K3DSDK_IMATERIAL_SINK_H\n#define K3DSDK_IMATERIAL_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for objects that can \"consume\" an imaterial\nclass imaterial_sink :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& material_sink_input() = 0;\n\nprotected:\n\timaterial_sink() {}\n\timaterial_sink(const imaterial_sink&) {}\n\timaterial_sink& operator=(const imaterial_sink&) { return *this; }\n\tvirtual ~imaterial_sink() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMATERIAL_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/imaterial_yafray.h",
    "content": "#ifndef K3DSDK_IMATERIAL_YAFRAY_H\n#define K3DSDK_IMATERIAL_YAFRAY_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <iosfwd>\n\nnamespace k3d\n{\n\nnamespace yafray\n{\n\n/// Abstract interface for Yafray material objects\nclass imaterial :\n\tpublic virtual k3d::iunknown\n{\npublic:\n\tvirtual void setup_material(const k3d::string_t& Name, std::ostream& Stream) = 0;\n\nprotected:\n\timaterial() {}\n\timaterial(const imaterial&) {}\n\timaterial& operator=(const imaterial&) { return *this; }\n\tvirtual ~imaterial() {}\n};\n\n} // namespace yafray\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMATERIAL_YAFRAY_H\n\n"
  },
  {
    "path": "k3dsdk/imatrix_sink.h",
    "content": "#ifndef K3DSDK_IMATRIX_SINK_H\n#define K3DSDK_IMATRIX_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares imatrix_sink, an interface for objects that can act as consumers of transform data\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n// Forward declarations\nclass iproperty;\n\n/// Abstract interface for objects that can act as consumers of transformation data\nclass imatrix_sink :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& matrix_sink_input() = 0;\n\nprotected:\n\timatrix_sink() {}\n\timatrix_sink(const imatrix_sink& Other) : iunknown(Other) {}\n\timatrix_sink& operator=(const imatrix_sink&) { return *this; }\n\tvirtual ~imatrix_sink() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMATRIX_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/imatrix_source.h",
    "content": "#ifndef K3DSDK_IMATRIX_SOURCE_H\n#define K3DSDK_IMATRIX_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares imatrix_source, an interface for objects that can act as a source of transformation data\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n// Forward declarations\nclass iproperty;\n\n/// Abstract interface for objects that can act as a source of transformation data\nclass imatrix_source :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& matrix_source_output() = 0;\n\nprotected:\n\timatrix_source() {}\n\timatrix_source(const imatrix_source& Other) : iunknown(Other) {}\n\timatrix_source& operator=(const imatrix_source&) { return *this; }\n\tvirtual ~imatrix_source() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMATRIX_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/imeasurement_property.h",
    "content": "#ifndef K3DSDK_IMEASUREMENT_PROPERTY_H\n#define K3DSDK_IMEASUREMENT_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Declares imeasurement_property, an abstract interface for discovering information about a property that uses real-world units-of-measure\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n\n#include <boost/any.hpp>\n\n#include <string>\n\nnamespace k3d\n{\n\n/// Abstract interface for discovering information about a property that uses real-world units-of-measure\nclass imeasurement_property :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Returns the suggested step increment to use when modifying the property value\n\tvirtual double property_step_increment() = 0;\n\t/// Returns the real-world units-of-measure stored by the property\n\tvirtual const std::type_info& property_units() = 0;\n\nprotected:\n\timeasurement_property() {}\n\timeasurement_property(const imeasurement_property& Other) : iunknown(Other) {}\n\timeasurement_property& operator = (const imeasurement_property&) { return *this; }\n\tvirtual ~imeasurement_property() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMEASUREMENT_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/imesh_painter_gl.h",
    "content": "#ifndef K3DSDK_IMESH_PAINTER_GL_H\n#define K3DSDK_IMESH_PAINTER_GL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/iproperty.h>\n\nnamespace k3d\n{\n\nclass ihint;\nclass mesh;\n\nnamespace gl\n{\n\nclass painter_render_state;\nclass painter_selection_state;\n\t\n/// Abstract interface implemented by painter objects that can render a mesh using OpenGL\nclass imesh_painter :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Called to render a mesh for on-screen display\n\t/**\n\t * The ChangedSignal argument is a signal that is emitted when the supplied mesh changes. It could be used by painters caching data\n\t * to notify them when the cache needs updating\n\t */\n\tvirtual void paint_mesh(const mesh& Mesh, const painter_render_state& RenderState, iproperty::changed_signal_t& ChangedSignal) = 0;\n\t/// Called to render a mesh for interactive selection\n\tvirtual void select_mesh(const mesh& Mesh, const painter_render_state& RenderState, const painter_selection_state& SelectionState, iproperty::changed_signal_t& ChangedSignal) = 0;\n};\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMESH_PAINTER_GL_H\n\n"
  },
  {
    "path": "k3dsdk/imesh_painter_ri.h",
    "content": "#ifndef K3DSDK_IMESH_PAINTER_RI_H\n#define K3DSDK_IMESH_PAINTER_RI_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass mesh;\n\nnamespace ri\n{\n\nclass render_state;\n\t\n/// Abstract interface implemented by painter objects that can render a mesh using RenderMan\nclass imesh_painter :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Called to render a mesh using RenderMan\n\tvirtual void paint_mesh(const mesh& Mesh, const render_state& RenderState) = 0;\n\t/// Called once rendering is complete, so painters can release resources\n\tvirtual void paint_complete(const mesh& Mesh, const render_state& RenderState) = 0;\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMESH_PAINTER_RI_H\n\n"
  },
  {
    "path": "k3dsdk/imesh_selection_algorithm.h",
    "content": "#ifndef K3DSDK_IMESH_SELECTION_ALGORITHM_H\n#define K3DSDK_IMESH_SELECTION_ALGORITHM_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n  \\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/selection.h>\n\nnamespace k3d\n{\n\n/// Abstract interface for objects that can create mesh selections\nclass imesh_selection_algorithm :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual const selection::set create_mesh_selection(const mesh& Mesh) = 0;\n\nprotected:\n\timesh_selection_algorithm() {}\n\timesh_selection_algorithm(const imesh_selection_algorithm& Other) : iunknown(Other) {}\n\timesh_selection_algorithm& operator=(const imesh_selection_algorithm&) { return *this; }\n\tvirtual ~imesh_selection_algorithm() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMESH_SELECTION_ALGORITHM_H\n\n"
  },
  {
    "path": "k3dsdk/imesh_selection_sink.h",
    "content": "#ifndef K3DSDK_IMESH_SELECTION_SINK_H\n#define K3DSDK_IMESH_SELECTION_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares imesh_selection_sink, an interface for objects that can consume mesh data\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n// Forward declarations\nclass iproperty;\n\n/// Abstract interface for objects that can consume mesh data\nclass imesh_selection_sink :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& mesh_selection_sink_input() = 0;\n\nprotected:\n\timesh_selection_sink() {}\n\timesh_selection_sink(const imesh_selection_sink& Other) : iunknown(Other) {}\n\timesh_selection_sink& operator=(const imesh_selection_sink&) { return *this; }\n\tvirtual ~imesh_selection_sink() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMESH_SELECTION_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/imesh_sink.h",
    "content": "#ifndef K3DSDK_IMESH_SINK_H\n#define K3DSDK_IMESH_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares imesh_sink, an interface for objects that can consume mesh data\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n// Forward declarations\nclass iproperty;\n\n/// Abstract interface for objects that can consume mesh data\nclass imesh_sink :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& mesh_sink_input() = 0;\n\nprotected:\n\timesh_sink() {}\n\timesh_sink(const imesh_sink& Other) : iunknown(Other) {}\n\timesh_sink& operator=(const imesh_sink&) { return *this; }\n\tvirtual ~imesh_sink() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMESH_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/imesh_source.h",
    "content": "#ifndef K3DSDK_IMESH_SOURCE_H\n#define K3DSDK_IMESH_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares imesh_source, an interface for objects that can act as a source of meshes\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ihint.h>\n\nnamespace k3d\n{\n\n// Forward declarations\nclass iproperty;\n\n/// Abstract interface for objects that can act as a source of meshes\nclass imesh_source :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& mesh_source_output() = 0;\n\t\n\t/// Hint for the type of change the creation of this source entails\n\tvirtual ihint* hint() const { return 0; }\n\nprotected:\n\timesh_source() {}\n\timesh_source(const imesh_source& Other) : iunknown(Other) {}\n\timesh_source& operator=(const imesh_source&) { return *this; }\n\tvirtual ~imesh_source() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMESH_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/imesh_storage.h",
    "content": "#ifndef K3DSDK_IMESH_STORAGE_H\n#define K3DSDK_IMESH_STORAGE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares imesh_storage, an interface for objects that can provide persistent storage of meshes\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass mesh;\n\n/// Abstract interface for objects that can provide persistent storage of meshes (the FrozenMesh object being the canonical example)\nclass imesh_storage :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Replaces any existing stored mesh with the given object, assuming responsibility for its lifetime\n\tvirtual void reset_mesh(mesh* const Mesh) = 0;\n\nprotected:\n\timesh_storage() {}\n\timesh_storage(const imesh_storage& Other) : iunknown(Other) {}\n\timesh_storage& operator=(const imesh_storage&) { return *this; }\n\tvirtual ~imesh_storage() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMESH_STORAGE_H\n\n"
  },
  {
    "path": "k3dsdk/imeta_object.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/imeta_object.h>\n\nnamespace k3d\n{\n\nconst boost::any imeta_object::execute(const string_t& Method)\n{\n\tstd::vector<boost::any> arguments;\n\treturn execute(Method, arguments);\n}\n\nconst boost::any imeta_object::execute(const string_t& Method, const boost::any& Argument1)\n{\n\tstd::vector<boost::any> arguments;\n\targuments.push_back(Argument1);\n\treturn execute(Method, arguments);\n}\n\nconst boost::any imeta_object::execute(const string_t& Method, const boost::any& Argument1, const boost::any& Argument2)\n{\n\tstd::vector<boost::any> arguments;\n\targuments.push_back(Argument1);\n\targuments.push_back(Argument2);\n\treturn execute(Method, arguments);\n}\n\nconst boost::any imeta_object::execute(const string_t& Method, const boost::any& Argument1, const boost::any& Argument2, const boost::any& Argument3)\n{\n\tstd::vector<boost::any> arguments;\n\targuments.push_back(Argument1);\n\targuments.push_back(Argument2);\n\targuments.push_back(Argument3);\n\treturn execute(Method, arguments);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/imeta_object.h",
    "content": "#ifndef K3DSDK_IMETA_OBJECT_H\n#define K3DSDK_IMETA_OBJECT_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n#include <boost/any.hpp>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Abstract interface for objects that can accept commands from external entities\nclass imeta_object :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Executes an object method that takes zero arguments.\n\tconst boost::any execute(const string_t& Method);\n\t/// Executes an object method that takes one argument.\n\tconst boost::any execute(const string_t& Method, const boost::any& Argument1);\n\t/// Executes an object method that takes two arguments.\n\tconst boost::any execute(const string_t& Method, const boost::any& Argument1, const boost::any& Argument2);\n\t/// Executes an object method that takes three arguments.\n\tconst boost::any execute(const string_t& Method, const boost::any& Argument1, const boost::any& Argument2, const boost::any& Argument3);\n\t/// Executes an object method with an arbitrary number of arguments.\n\tvirtual const boost::any execute(const string_t& Method, const std::vector<boost::any>& Arguments) = 0;\n\nprotected:\n\timeta_object() {}\n\timeta_object(const imeta_object& Other) : iunknown(Other) {}\n\timeta_object& operator=(const imeta_object&) { return *this; }\n\tvirtual ~imeta_object() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMETA_OBJECT_H\n\n"
  },
  {
    "path": "k3dsdk/imetadata.h",
    "content": "#ifndef K3DSDK_IMETADATA_H\n#define K3DSDK_IMETADATA_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n#include <map>\n\nnamespace k3d\n{\n\n/// Abstract interface for objects that can store arbitrary metadata (name-value pairs).\nclass imetadata :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Defines storage for an arbitrary collection of name-value pairs\n\ttypedef std::map<string_t, string_t> metadata_t;\n\n\t/// Sets a new name-value pair, overwriting the value if the name already exists\n\tvirtual void set_metadata_value(const string_t& Name, const string_t& Value) = 0;\n\t/// Sets a collection of name-value pair, overwriting any existing values\n\tvirtual void set_metadata(const metadata_t& Values) = 0;\n\t/// Returns the set of existing name-value pairs\n\tvirtual metadata_t get_metadata() = 0;\n\t/// Returns a value by name, or empty-string if the name doesn't exist\n\tvirtual const string_t get_metadata_value(const string_t& Name) = 0;\n\t/// Erases an existing name-value pair\n\tvirtual void erase_metadata_value(const string_t& Name) = 0;\n\n\t/// Connects a slot to a signal that will be emitted whenever the metadata contents change\n\tvirtual sigc::connection connect_metadata_changed_signal(const sigc::slot<void>& Slot) = 0;\n\nprotected:\n\timetadata() {}\n\timetadata(const imetadata& Other) : iunknown(Other) {}\n\timetadata& operator = (const imetadata&) { return *this; }\n\tvirtual ~imetadata() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMETADATA_H\n\n"
  },
  {
    "path": "k3dsdk/imime_type_handler.h",
    "content": "#ifndef K3DSDK_IMIME_TYPE_HANDLER_H\n#define K3DSDK_IMIME_TYPE_HANDLER_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\n\n/// Abstract interface for objects that can identify the MIME Type of a file\nclass imime_type_handler :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Called to identify the MIME Type of a file.  Returns true iff the MIME Type was successfully identified.\n\tvirtual bool_t identify_mime_type(const filesystem::path& File, string_t& FileType) = 0;\n\t/// Called to identify the MIME Type of a data stream.  Returns true iff the MIME Type was successfully identified.\n\tvirtual bool_t identify_mime_type(const string_t& Data, string_t& DataType) = 0;\n\nprotected:\n\timime_type_handler() {}\n\timime_type_handler(const imime_type_handler&) {}\n\timime_type_handler& operator=(const imime_type_handler&) { return *this; }\n\tvirtual ~imime_type_handler() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMIME_TYPE_HANDLER_H\n\n"
  },
  {
    "path": "k3dsdk/imulti_mesh_sink.h",
    "content": "#ifndef K3DSDK_IMULTI_MESH_SINK_H\n#define K3DSDK_IMULTI_MESH_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares imulti_mesh_sink, an interface for objects that can consume multiple meshes\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface for objects that can consume multiple meshes\nclass imulti_mesh_sink :\n\tpublic virtual iunknown\n{\n\nprotected:\n\timulti_mesh_sink() {}\n\timulti_mesh_sink(const imulti_mesh_sink& Other) : iunknown(Other) {}\n\timulti_mesh_sink& operator=(const imulti_mesh_sink&) { return *this; }\n\tvirtual ~imulti_mesh_sink() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IMULTI_MESH_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/inetwork_render_farm.h",
    "content": "#ifndef K3DSDK_INETWORK_RENDER_FARM_H\n#define K3DSDK_INETWORK_RENDER_FARM_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nclass inetwork_render_job;\n\t\n/// Abstract interface that encapsulates a \"render farm\" capable of executing render jobs\nclass inetwork_render_farm :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Creates a new job, in a \"waiting\" state\n\tvirtual inetwork_render_job& create_job(const string_t& JobName) = 0;\n\t/// Tells the render farm to begin executing the given job\n\tvirtual void start_job(inetwork_render_job& Job) = 0;\n\nprotected:\n\tinetwork_render_farm() {}\n\tinetwork_render_farm(const inetwork_render_farm&) {}\n\tinetwork_render_farm& operator=(const inetwork_render_farm&) { return *this; }\n\tvirtual ~inetwork_render_farm() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_INETWORK_RENDER_FARM_H\n\n"
  },
  {
    "path": "k3dsdk/inetwork_render_frame.h",
    "content": "#ifndef K3DSDK_INETWORK_RENDER_FRAME_H\n#define K3DSDK_INETWORK_RENDER_FRAME_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\n\n/// Abstract interface that encapsulates all of the work required to render a \"frame\".\n/// All of the steps (\"commands\") required to render the frame will be executed in the\n/// order that they were added using add_exec_command(), add_copy_command(), and add_view_command().\nclass inetwork_render_frame :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Defines storage for an environment variable\n\tclass variable\n\t{\n\tpublic:\n\t\tvariable()\n\t\t{\n\t\t}\n\n\t\tvariable(const string_t& Name, const string_t& Value) :\n\t\t\tname(Name),\n\t\t\tvalue(Value)\n\t\t{\n\t\t}\n\n\t\tstring_t name;\n\t\tstring_t value;\n\t};\n\n\t/// Defines storage for a collection of environment variables\n\ttypedef std::vector<variable> environment;\n\n\t/// Defines storage for a command-line argument\n\tclass argument\n\t{\n\tpublic:\n\t\targument()\n\t\t{\n\t\t}\n\n\t\targument(const string_t& Value) :\n\t\t\tvalue(Value)\n\t\t{\n\t\t}\n\n\t\tstring_t value;\n\t};\n\n\t/// Defines storage for a collection of command-line arguments\n\ttypedef std::vector<argument> arguments;\n\n\t/// Returns a unique filepath that can be used as an input/output file for this frame\n\tvirtual const filesystem::path add_file(const string_t& Name) = 0;\n\t/// Sets-up an arbitrary command to be executed.  Supplied environment variables will supplement the application environment.\n\tvirtual void add_exec_command(const string_t& Binary, const environment& Environment, const arguments& Arguments) = 0;\n\t/// Sets-up a copy operation from one filesystem location to another\n\tvirtual void add_copy_command(const filesystem::path& Source, const filesystem::path& Target) = 0;\n\t/// Sets-up an view operation that will display a file to the user\n\tvirtual void add_view_command(const filesystem::path& File) = 0;\n\nprotected:\n\tinetwork_render_frame() {}\n\tinetwork_render_frame(const inetwork_render_frame&) {}\n\tinetwork_render_frame& operator=(const inetwork_render_frame&) { return *this; }\n\tvirtual ~inetwork_render_frame() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_INETWORK_RENDER_FRAME_H\n\n"
  },
  {
    "path": "k3dsdk/inetwork_render_job.h",
    "content": "#ifndef K3DSDK_INETWORK_RENDER_JOB_H\n#define K3DSDK_INETWORK_RENDER_JOB_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nclass inetwork_render_frame;\n\t\n/// Abstract interface encapsulating a render job containing zero-to-many frames to be rendered\nclass inetwork_render_job :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Adds a new \"frame\" to the job, to be rendered when the job is run\n\tvirtual inetwork_render_frame& create_frame(const string_t& FrameName) = 0;\n\nprotected:\n\tinetwork_render_job() {}\n\tinetwork_render_job(const inetwork_render_job&) {}\n\tinetwork_render_job& operator=(const inetwork_render_job&) { return *this; }\n\tvirtual ~inetwork_render_job() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_INETWORK_RENDER_JOB_H\n\n"
  },
  {
    "path": "k3dsdk/inode.h",
    "content": "#ifndef K3DSDK_INODE_H\n#define K3DSDK_INODE_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares inode, an abstract interface which MUST be implemented by ALL document nodes\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n\n#include <string>\n\nnamespace k3d\n{\n\nclass idocument;\nclass iplugin_factory;\n\n/////////////////////////////////////////////////////////////////////////////\n// inode\n\n/// Abstract interface which MUST be implemented by ALL document nodes\nclass inode :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~inode() {}\n\n\t/// Sets the node name (could fail or be overridden)\n\tvirtual void set_name(const std::string Name) = 0;\n\t/// Returns the node name\n\tvirtual const std::string name() = 0;\n\n\t/// Returns a reference to the factory that created this node\n\tvirtual iplugin_factory& factory() = 0;\n\t/// Returns a reference to the document that owns this node\n\tvirtual idocument& document() = 0;\n\n\t/// Defines a signal that will be emitted iff the node is deleted\n\ttypedef sigc::signal<void> deleted_signal_t;\n\tvirtual deleted_signal_t& deleted_signal() = 0;\n\n\t/// Defines a signal that will be emitted if the node name changes (including via undo / redo)\n\ttypedef sigc::signal<void> name_changed_signal_t;\n\tvirtual name_changed_signal_t& name_changed_signal() = 0;\n\nprotected:\n\tinode() {}\n\tinode(const inode& Other) : iunknown(Other) {}\n\tinode& operator=(const inode&) { return *this; }\n};\n\nnamespace difference\n{\n\n/// Specialization of difference::test that tests inode pointers for equality\ninline void test(inode* const A, inode* const B, accumulator& Result)\n{\n\tResult.exact(A == B);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_INODE_H\n\n"
  },
  {
    "path": "k3dsdk/inode_change_signal.h",
    "content": "#ifndef K3DSDK_INODE_CHANGE_SIGNAL_H\n#define K3DSDK_INODE_CHANGE_SIGNAL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ihint.h>\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nclass inode;\n\n/// Abstract interface for nodes that broadcast a change signal to observers when their state is modified\nclass inode_change_signal :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Connects a slot to a signal that will be emitted whenever the node state is modified, including an optional \"hint\" that describes the change.\n\tvirtual sigc::connection connect_node_changed_signal(const sigc::slot<void, ihint*>& Slot) = 0;\n\nprotected:\n\tinode_change_signal() {}\n\tinode_change_signal(const inode_change_signal& Other) : iunknown(Other) {}\n\tinode_change_signal& operator = (const inode_change_signal&) { return *this; }\n\tvirtual ~inode_change_signal() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_INODE_CHANGE_SIGNAL_H\n\n"
  },
  {
    "path": "k3dsdk/inode_collection.h",
    "content": "#ifndef K3DSDK_INODE_COLLECTION_H\n#define K3DSDK_INODE_COLLECTION_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares inode_collection, a container of inode instances\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n\n#include <vector>\n\nnamespace k3d\n{\n\nclass inode;\n\n/// Abstract interface for a collection of document nodes\nclass inode_collection :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Defines a collection of nodes\n\ttypedef std::vector<inode*> nodes_t;\n\n\t/// Adds new nodes to the collection\n\tvirtual void add_nodes(const nodes_t& Objects) = 0;\n\t/// Returns the set of all nodes in the collection\n\tvirtual const nodes_t& collection() = 0;\n\t/// Removes nodes from the collection\n\tvirtual void remove_nodes(const nodes_t& Objects) = 0;\n\n\t/// Defines a signal that will be emitted whenever nodes are added to the collection\n\ttypedef sigc::signal<void, const nodes_t&> add_nodes_signal_t;\n\tvirtual add_nodes_signal_t& add_nodes_signal() = 0;\n\t/// Defines a signal that will be emitted whenever nodes are removed from the collection\n\ttypedef sigc::signal<void, const nodes_t&> remove_nodes_signal_t;\n\tvirtual remove_nodes_signal_t& remove_nodes_signal() = 0;\n\t/// Defines a signal that will be emitted whenever an node is renamed\n\ttypedef sigc::signal<void, inode*> rename_node_signal_t;\n\tvirtual rename_node_signal_t& rename_node_signal() = 0;\n\nprotected:\n\tinode_collection() {}\n\tinode_collection(const inode_collection& Other) : iunknown(Other) {}\n\tinode_collection& operator = (const inode_collection&) { return *this; }\n\tvirtual ~inode_collection() {}\n};\n\n} // namespace\n\n#endif // !K3DSDK_INODE_COLLECTION_H\n\n\n"
  },
  {
    "path": "k3dsdk/inode_collection_property.h",
    "content": "#ifndef K3DSDK_INODE_COLLECTION_PROPERTY_H\n#define K3DSDK_INODE_COLLECTION_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <vector>\n\nnamespace k3d\n{\n\nclass inode;\n\n/// Provides domain-specific methods for a property that stores a collection of nodes as its value\nclass inode_collection_property :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual bool property_allow(inode& Object) = 0;\n\n\ttypedef std::vector<inode*> nodes_t;\n\nprotected:\n\tinode_collection_property() {}\n\tinode_collection_property(const inode_collection_property& Other) : iunknown(Other) {}\n\tinode_collection_property& operator = (const inode_collection_property&) { return *this; }\n\tvirtual ~inode_collection_property() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_INODE_COLLECTION_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/inode_collection_sink.h",
    "content": "#ifndef K3DSDK_INODE_COLLECTION_SINK_H\n#define K3DSDK_INODE_COLLECTION_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <vector>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for objects that have one-or-more inode_collection_property properties.\n///\n/// Typically, inode_collection_sink is implemented by \"render engine\" objects that maintain\n/// explicit lists of \"visible\" nodes, \"enabled\" lights, etc.\nclass inode_collection_sink :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Defines a collection of properties\n\ttypedef std::vector<iproperty*> properties_t;\n\n\t/// Returns a set of inode_collection_property properties\n\tvirtual const properties_t node_collection_properties() = 0;\n\nprotected:\n\tinode_collection_sink() {}\n\tinode_collection_sink(const inode_collection_sink&) {}\n\tinode_collection_sink& operator=(const inode_collection_sink&) { return *this; }\n\tvirtual ~inode_collection_sink() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_INODE_COLLECTION_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/inode_name_map.h",
    "content": "#ifndef K3DSDK_INODE_NAME_MAP_H\n#define K3DSDK_INODE_NAME_MAP_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\nclass inode;\n\n/// Abstract interface for a collection of document node names\nclass inode_name_map :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Returns the name for a given node (could return empty string)\n\tvirtual const std::string name(inode& Node) = 0;\n\t/// Returns the node for a given name (could return NULL)\n\tvirtual inode* node(const std::string& Name) = 0;\n\nprotected:\n\tinode_name_map() {}\n\tinode_name_map(const inode_name_map&) {}\n\tinode_name_map& operator = (const inode_name_map&) { return *this; }\n\tvirtual ~inode_name_map() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_INODE_NAME_MAP_H\n\n"
  },
  {
    "path": "k3dsdk/inode_property.h",
    "content": "#ifndef K3DSDK_INODE_PROPERTY_H\n#define K3DSDK_INODE_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares inode_property, an abstract interface for discovering information about a property that references a document node\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Abstract interface for discovering information about a property that references another node\nclass inode_property :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual bool property_allow_none() = 0;\n\tvirtual bool property_allow(k3d::iplugin_factory& Factory) = 0;\n\tvirtual bool property_allow(inode& Object) = 0;\n\nprotected:\n\tinode_property() {}\n\tinode_property(const inode_property& Other) : iunknown(Other) {}\n\tinode_property& operator = (const inode_property&) { return *this; }\n\tvirtual ~inode_property() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_INODE_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/inode_selection.h",
    "content": "#ifndef K3DSDK_INODE_SELECTION_H\n#define K3DSDK_INODE_SELECTION_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares inode_selection, an abstract interface for objects storing a list of selected nodes with their selection weight\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <list>\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nclass inode;\nclass ihint;\n\n/// Abstract interface for objects that store document node selections and their weights\nclass inode_selection :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Storage for a list of selected nodes\n\t/**\n\t * Note: we use a list for fast removal at any position. Fast random access is not needed\n\t */\n\ttypedef std::list<inode*> selected_nodes_t;\n\n\t/// Selects a node\n\t/**\n\t * \\param Node the node to select\n\t * \\param Weight The selection weight. Setting this to 0 removes the node from the selection\n\t */\n\tvirtual void select(inode& Node, const double_t Weight) = 0;\n\n\t/// Return the selection weight of the given node\n\tvirtual double_t selection_weight(inode& Node) = 0;\n\n\t/// List of selected nodes, in the order they were selected\n\tvirtual const selected_nodes_t selected_nodes() = 0;\n\t\n\t/// Deselect all nodes\n\tvirtual void deselect_all() = 0;\n\t\n\t/// Changed signal emitted when the selection changed\n\ttypedef sigc::signal<void, ihint*> changed_signal_t;\n\tvirtual changed_signal_t& selection_changed_signal() = 0;\n\nprotected:\n\tinode_selection() {}\n\tinode_selection(const inode_selection& Other) : iunknown(Other) {}\n\tinode_selection& operator=(const inode_selection&) { return *this; }\n\tvirtual ~inode_selection() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_INODE_SELECTION_H\n"
  },
  {
    "path": "k3dsdk/int32_source.h",
    "content": "#ifndef K3DSDK_INT32_SOURCE_H\n#define K3DSDK_INT32_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License aint32 with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/iint32_source.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace k3d\n{\n\ntemplate<typename derived_t>\nclass int32_source :\n\tpublic iint32_source\n{\npublic:\n\tiproperty& int32_source_output()\n\t{\n\t\treturn m_output_int32;\n\t}\n\n\tsigc::slot<void, k3d::ihint*> make_update_int32_slot()\n\t{\n\t\treturn m_output_int32.make_slot();\n\t}\n\nprotected:\n\tint32_source() :\n\t\tm_output_int32(\n\t\t\tinit_owner(*static_cast<derived_t*>(this))\n\t\t\t+ init_name(\"output_int32\")\n\t\t\t+ init_label(_(\"Output Int32\"))\n\t\t\t+ init_description(\"Output int32\")\n\t\t\t+ init_value(0))\n\t{\n\t\tm_output_int32.set_update_slot(sigc::mem_fun(*this, &int32_source<derived_t>::execute));\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, data::immutable_name, data::change_signal, data::no_undo, data::value_demand_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_output_int32;\n\n\t/// Called whenever the output has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, int32_t& Output)\n\t{\n\t\t// We can safely ignore any hints ...\n\t\ton_update_int32(Output);\n\t}\n\n\tvirtual void on_update_int32(int32_t& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_INT32_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/interface_list.h",
    "content": "#ifndef K3DSDK_INTERFACE_LIST_H\n#define K3DSDK_INTERFACE_LIST_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iapplication_plugin_factory.h>\n#include <k3dsdk/plugin_factory.h>\n\nnamespace k3d\n{\n\n/// Defines a null interface type for marking the ends of an interface list\nclass null_interface\n{\n};\n\n/// Used to create compile-time lists of interfaces (i.e. typelists - see Alexandrescu \"Modern C++ Design\")\ntemplate<typename head_t, typename tail_t = null_interface>\nstruct interface_list\n{\n\ttypedef head_t head;\n\ttypedef tail_t tail;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// implements_interface\n\n/// Generates code at compile-time that test whether an interface_list contains a specific interface type\ntemplate<class interface_type>\nstruct implements_interface;\n\n/// Generates code at compile-time that test whether an interface_list contains a specific interface type\ntemplate<>\nstruct implements_interface<null_interface>\n{\n\tbool operator()(const std::type_info& InterfaceType)\n\t{\n\t\treturn false;\n\t}\n};\n\n/// Generates code at compile-time that test whether an interface_list contains a specific interface type\ntemplate<typename head_t, typename tail_t>\nstruct implements_interface<interface_list<head_t, tail_t> >\n{\n\tbool operator()(const std::type_info& InterfaceType)\n\t{\n\t\tif(typeid(head_t) == InterfaceType)\n\t\t\treturn true;\n\n\t\treturn implements_interface<tail_t>()(InterfaceType);\n\t}\n};\n\n/// Generates code at compile-time that returns a list of interface types\ntemplate<class interface_type>\nstruct get_interfaces;\n\n/// Generates code at compile-time that returns a list of interface types\ntemplate<>\nstruct get_interfaces<null_interface>\n{\n\tvoid operator()(iplugin_factory::interfaces_t& Interfaces)\n\t{\n\t}\n};\n\n/// Generates code at compile-time that returns a list of interface types\ntemplate<typename head_t, typename tail_t>\nstruct get_interfaces<interface_list<head_t, tail_t> >\n{\n\tvoid operator()(iplugin_factory::interfaces_t& Interfaces)\n\t{\n\t\tInterfaces.push_back(&typeid(head_t));\n\t\tget_interfaces<tail_t>()(Interfaces);\n\t}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_INTERFACE_LIST_H\n\n"
  },
  {
    "path": "k3dsdk/iomanip.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/types.h>\n\n#include <iostream>\n\nnamespace k3d\n{\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// current_indent\n\nlong& current_indent(std::ios& Stream)\n{\n\tstatic const int index = std::ios::xalloc();\n\treturn Stream.iword(index);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// push_indent\n\nstd::ostream& push_indent(std::ostream& Stream)\n{\n\tcurrent_indent(Stream)++;\n\treturn Stream;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// pop_indent\n\nstd::ostream& pop_indent(std::ostream& Stream)\n{\n\tif(current_indent(Stream) != 0)\n\t\tcurrent_indent(Stream)--;\n\n\treturn Stream;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// standard_indent\n\nstd::ostream& standard_indent(std::ostream& Stream)\n{\n\tStream << std::string(2 * current_indent(Stream), ' '); \n\treturn Stream;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// block_size\n\nstatic long& block_size(std::ios& Stream)\n{\n\tstatic const int index = std::ios::xalloc();\n\treturn Stream.iword(index);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// block_index\n\nstatic long& block_index(std::ios& Stream)\n{\n\tstatic const int index = std::ios::xalloc();\n\treturn Stream.iword(index);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// start_block\n\nstart_block::start_block(const uint_t BlockSize) :\n\tblock_size(BlockSize)\n{\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const start_block& RHS)\n{\n\tblock_size(Stream) = RHS.block_size;\n\tblock_index(Stream) = 0;\n\treturn Stream;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// block_delimiter\n\nstd::ostream& block_delimiter(std::ostream& Stream)\n{\n\tif(block_size(Stream))\n\t{\n\t\tif(0 == (block_index(Stream) % block_size(Stream)))\n\t\t{\n\t\t\tif(block_index(Stream))\n\t\t\t\tStream << \"\\n\";\n\n\t\t\tStream << standard_indent;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStream << \" \";\n\t\t}\n\n\t\tblock_index(Stream) += 1;\n\t}\n\telse\n\t{\n\t\tStream << \" \";\n\t}\n\n\treturn Stream;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// finish_block\n\nstd::ostream& finish_block(std::ostream& Stream)\n{\n\tblock_size(Stream) = 0;\n\treturn Stream;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/iomanip.h",
    "content": "#ifndef K3DSDK_IOMANIP_H\n#define K3DSDK_IOMANIP_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n#include <iosfwd>\n\nnamespace k3d\n{\n\n/// Returns the current indentation for a stream\nlong& current_indent(std::ios& Stream);\n/// Increments a stream's indentation\nstd::ostream& push_indent(std::ostream& Stream);\n/// Decrements a stream's indentation\nstd::ostream& pop_indent(std::ostream& Stream);\n/// Inserts whitespace into a stream, proportional to its indentation level\nstd::ostream& standard_indent(std::ostream& Stream);\n\nstruct start_block\n{\n\tstart_block(const uint_t BlockSize = 8);\n\tuint_t block_size;\n};\n\nstd::ostream& operator<<(std::ostream& Stream, const start_block& RHS);\nstd::ostream& block_delimiter(std::ostream& Stream);\nstd::ostream& finish_block(std::ostream& Stream);\n\n} // namespace k3d\n\n#endif // !K3DSDK_IOMANIP_H\n\n"
  },
  {
    "path": "k3dsdk/ioption_property_ri.h",
    "content": "#ifndef K3DSDK_IOPTION_PROPERTY_RI_H\n#define K3DSDK_IOPTION_PROPERTY_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\n/// Abstract interface for discovering information about a RenderMan option property \nclass ioption_property :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual const string_t property_option_name() = 0;\n\nprotected:\n\tioption_property() {}\n\tioption_property(const ioption_property&) {}\n\tioption_property& operator = (const ioption_property&) { return *this; }\n\tvirtual ~ioption_property() {}\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_IOPTION_PROPERTY_RI_H\n\n"
  },
  {
    "path": "k3dsdk/iparentable.h",
    "content": "#ifndef K3DSDK_IPARENTABLE_H\n#define K3DSDK_IPARENTABLE_H\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for an object that can be \"parented\" to another.  Note: parenting implies, but does not require, that the child's transformations be related to the parent's\nclass iparentable :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Returns the object's parent, if any (could be NULL)\n\tvirtual iproperty& parent() = 0;\n\t\nprotected:\n\tiparentable() {}\n\tiparentable(const iparentable&) {}\n\tiparentable& operator=(const iparentable&) { return *this; }\n\tvirtual ~iparentable() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPARENTABLE_H\n\n"
  },
  {
    "path": "k3dsdk/ipath_property.h",
    "content": "#ifndef K3DSDK_IPATH_PROPERTY_H\n#define K3DSDK_IPATH_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares ipath_property, an abstract interface for discovering information about a property that stores filesystem paths\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Abstract interface for properties that represent external filesystem resources (typically used to alter presentation)\nclass ipath_property :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Enumerates the mode of the underlying file\n\ttypedef enum\n\t{\n\t\tREAD,\n\t\tWRITE,\n\t} mode_t;\n\n\t/// Enumerates how the external resource should be referenced - by absolute path, relative path, or inline\n\ttypedef enum\n\t{\n\t\tABSOLUTE_REFERENCE,\n\t\tRELATIVE_REFERENCE,\n\t\tINLINE_REFERENCE\n\t} reference_t;\n\n\t/// Defines a \"pattern filter\" that the UI layer can use to filter files using GLOB style syntax\n\tstruct pattern_filter\n\t{\n\t\tpattern_filter()\n\t\t{\n\t\t}\n\n\t\tpattern_filter(const std::string& Name, const std::string& Pattern) :\n\t\t\tname(Name),\n\t\t\tpattern(Pattern)\n\t\t{\n\t\t}\n\n\t\t/// Stores a human-readable name for the pattern\n\t\tstd::string name;\n\t\t/// Stores s pattern using GLOB syntax\n\t\tstd::string pattern;\n\t};\n\n\ttypedef std::vector<pattern_filter> pattern_filters_t;\n\t\n\t/// Returns the path \"mode\", which indicates whether the path will be used for an input or an output file\n\tvirtual mode_t property_path_mode() = 0;\n\t/// Returns the path \"type\", used to categorize the purpose of the path and store most-recent-used paths\n\tvirtual const std::string property_path_type() = 0;\n\n\t/// Returns the path \"reference\", which indicates how the external resource will be referenced - by absolute path, relative path, or inline\n\tvirtual reference_t property_path_reference() = 0;\n\tvirtual void set_property_path_reference(const reference_t) = 0;\n\t/// Defines a signal that will be emitted anytime the path reference is modified\n\ttypedef sigc::signal<void> path_reference_changed_signal_t;\n\tvirtual path_reference_changed_signal_t& property_path_reference_changed_signal() = 0;\n\n\t/// Returns a collection of pattern filters to be (optionally) used by the UI when prompting the user for a file\n\tvirtual const pattern_filters_t pattern_filters() = 0;\n\t\nprotected:\n\tipath_property() {}\n\tipath_property(const ipath_property& Other) : iunknown(Other) {}\n\tipath_property& operator=(const ipath_property&) { return *this; }\n\tvirtual ~ipath_property() {}\n};\n\nstd::ostream& operator<<(std::ostream&, const ipath_property::reference_t&);\nstd::istream& operator>>(std::istream&, ipath_property::reference_t&);\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPATH_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/ipersistent.h",
    "content": "#ifndef K3DSDK_IPERSISTENT_H\n#define K3DSDK_IPERSISTENT_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares ipersistent, an abstract interface implemented by all objects that can be serialized to/from a K-3D document\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/path.h>\n\n/**\n\nThe methods in ipersistent will be called in a specific order at various stages of an object's lifetime:\n\nWhen the object is saved as part of a document:\n\n1. save()\n\nWhen the object is reloaded from a document:\n\n1. load() - called only after all objects have been instantiated\n\nImportant note:\n\nAlthough all document objects exist before load() is called, their load() methods are not called in any\nparticular order.  Thus, you should not access any member methods of an external object in your load()\nimplementation.\n\n*/\n\nnamespace k3d\n{\n\nclass idependencies;\nclass ipersistent_lookup;\n\nnamespace xml { class element; }\n\n/// Abstract interface implemented by objects that can be serialized to/from a K-3D document\nclass ipersistent :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Placeholder for arguments passed at save time\n\tclass save_context\n\t{\n\tpublic:\n\t\tsave_context(const filesystem::path& RootPath, idependencies& Dependencies, ipersistent_lookup& Lookup) :\n\t\t\troot_path(RootPath),\n\t\t\tdependencies(Dependencies),\n\t\t\tlookup(Lookup)\n\t\t{\n\t\t}\n\n\t\tconst filesystem::path& root_path;\n\t\tidependencies& dependencies;\n\t\tipersistent_lookup& lookup;\n\t};\n\t/// Called once during document save\n\tvirtual void save(xml::element& Element, const save_context& Context) = 0;\n\n\t/// Placeholder for arguments passed at load time\n\tclass load_context\n\t{\n\tpublic:\n\t\tload_context(const filesystem::path& RootPath, ipersistent_lookup& Lookup) :\n\t\t\troot_path(RootPath),\n\t\t\tlookup(Lookup)\n\t\t{\n\t\t}\n\n\t\tconst filesystem::path& root_path;\n\t\tipersistent_lookup& lookup;\n\t};\n\t/// Called once during document loading\n\tvirtual void load(xml::element& Element, const load_context& Context) = 0;\n\nprotected:\n\tipersistent() {}\n\tipersistent(const ipersistent& Other) : iunknown(Other) {}\n\tipersistent& operator=(const ipersistent&) { return *this; }\n\tvirtual ~ipersistent() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPERSISTENT_H\n\n"
  },
  {
    "path": "k3dsdk/ipersistent_collection.h",
    "content": "#ifndef K3DSDK_IPERSISTENT_COLLECTION_H\n#define K3DSDK_IPERSISTENT_COLLECTION_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\n#include <vector>\n\nnamespace k3d\n{\n\nclass ipersistent;\n\n/// Encapsulates a collection of named, serializable objects.\nclass ipersistent_collection :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Add a serializable object to the collection, specifying its name.  Note that names are constrained to be unique within the collection.\n\tvirtual void enable_serialization(const string_t& Name, ipersistent& Object) = 0;\n\t/// Remove a serializable object from the collection.\n\tvirtual void disable_serialization(ipersistent& Object) = 0;\n\t/// Returns the set of serializable objects and their names, in the order they were added.\n\tvirtual const std::vector<std::pair<string_t, ipersistent*> > persistent_objects() = 0;\n\nprotected:\n\tipersistent_collection() {}\n\tipersistent_collection(const ipersistent_collection& Other) : iunknown(Other) {}\n\tipersistent_collection& operator=(const ipersistent_collection&) { return *this; }\n\tvirtual ~ipersistent_collection() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPERSISTENT_COLLECTION_H\n\n"
  },
  {
    "path": "k3dsdk/ipersistent_lookup.h",
    "content": "#ifndef K3DSDK_IPERSISTENT_LOOKUP_H\n#define K3DSDK_IPERSISTENT_LOOKUP_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares ipersistent_lookup lookup, an abstract interface to assign/lookup unique identifiers for object serialization\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface to assign / lookup unique identifiers for object serialization\nclass ipersistent_lookup :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Defines a unique identifier that can be serialized\n\ttypedef unsigned long id_type;\n\t/// Returns a unique identifier for the given object that can be used in serialization\n\tvirtual id_type lookup_id(iunknown* Object) = 0;\n\t/// Given a unique identifier, returns the corresponding object (could return NULL)\n\tvirtual iunknown* lookup_object(const id_type ID) = 0;\n\t\n\nprotected:\n\tipersistent_lookup() {}\n\tipersistent_lookup(const ipersistent_lookup& Other) : iunknown(Other) {}\n\tipersistent_lookup& operator=(const ipersistent_lookup&) { return *this; }\n\tvirtual ~ipersistent_lookup() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPERSISTENT_LOOKUP_H\n\n"
  },
  {
    "path": "k3dsdk/ipipeline.h",
    "content": "#ifndef K3DSDK_IPIPELINE_H\n#define K3DSDK_IPIPELINE_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ihint.h>\n#include <k3dsdk/signal_system.h>\n\n#include <map>\n#include <vector>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for maintaining a collection of dependencies among properties ... a \"pipeline\"\nclass ipipeline :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Defines a dependency between two properties\n\ttypedef std::pair<iproperty*, iproperty*> dependency_t;\n\t/// Defines a set of dependencies between properties - the map key is the dependent property and must not be NULL.  The map value is the property it depends upon, and may be NULL.\n\ttypedef std::map<iproperty*, iproperty*> dependencies_t;\n\n\t/// Updates dependencies between a set of properties\n\tvirtual void set_dependencies(dependencies_t& Dependencies, ihint* Hint = 0) = 0;\n\n\t/// Returns the dependency for a given property - may return NULL for no dependency\n\tvirtual iproperty* dependency(iproperty& Target) = 0;\n\n\t/// Returns the set of all dependencies between properties\n\tvirtual const dependencies_t& dependencies() = 0;\n\n\t/// Defines a signal that will be emitted whenever a set of dependencies are altered\n\ttypedef sigc::signal<void, const dependencies_t&> dependency_signal_t;\n\tvirtual dependency_signal_t& dependency_signal() = 0;\n\nprotected:\n\tipipeline() {}\n\tipipeline(const ipipeline& Other) : iunknown(Other) {}\n\tipipeline& operator=(const ipipeline&) { return *this; }\n\tvirtual ~ipipeline() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPIPELINE_H\n\n"
  },
  {
    "path": "k3dsdk/ipipeline_profiler.h",
    "content": "#ifndef K3DSDK_IPIPELINE_PROFILER_H\n#define K3DSDK_IPIPELINE_PROFILER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nclass inode;\n\t\n/// Abstract interface for an object that collects and distributes profiling data for the K-3D visualization pipeline\nclass ipipeline_profiler :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Called by a node to indicate that it has begun processing the given task.  Note: it is critical that every call to start_execution() is balanced with a call to finish_execution().\n\tvirtual void start_execution(inode& Node, const string_t& Task) = 0;\n\t/// Called by a node to indicate that it has finished processing the given task.  Note: it is critical that every call to finish_execution() matches a call to start_execution().\n\tvirtual void finish_execution(inode& Node, const string_t& Task) = 0;\n\n\t/// Called by a node to manually add a profiling entry.\n\tvirtual void add_timing_entry(inode& Node, const string_t& Task, const double TimingValue) = 0;\n\t\n\t/// Connects a slot that will be called to report the time in seconds that a node spent processing a given task\n\tvirtual sigc::connection connect_node_execution_signal(const sigc::slot<void, inode&, const string_t&, double>& Slot) = 0;\n\n\t/// RAII helper class that records profile information for the current scope with return- and exception-safety\n\tclass profile\n\t{\n\tpublic:\n\t\tprofile(ipipeline_profiler& Profiler, inode& Node, const string_t& Task) :\n\t\t\tprofiler(Profiler),\n\t\t\tnode(Node),\n\t\t\ttask(Task)\n\t\t{\n\t\t\tprofiler.start_execution(node, task);\n\t\t}\n\n\t\t~profile()\n\t\t{\n\t\t\tprofiler.finish_execution(node, task);\n\t\t}\n\t\t\n\tprivate:\n\t\tprofile(const profile&);\n\t\tprofile& operator=(const profile&);\n\t\t\n\t\tipipeline_profiler& profiler;\n\t\tinode& node;\n\t\tconst string_t task;\n\t};\n\nprotected:\n\tipipeline_profiler() {}\n\tipipeline_profiler(const ipipeline_profiler& Other) : iunknown(Other) {}\n\tipipeline_profiler& operator=(const ipipeline_profiler&) { return *this; }\n\tvirtual ~ipipeline_profiler() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPIPELINE_PROFILER_H\n\n"
  },
  {
    "path": "k3dsdk/iplugin_factory.h",
    "content": "#ifndef K3DSDK_IPLUGIN_FACTORY_H\n#define K3DSDK_IPLUGIN_FACTORY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Declares iplugin_factory, an abstract factory interface for plugin objects\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/uuid.h>\n\n#include <iosfwd>\n#include <map>\n#include <string>\n#include <typeinfo>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Abstract factory interface for plugin objects\nclass iplugin_factory :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Marks a plugin \"stable\", \"experimental\", or \"deprecated\", typically used to provide appropriate warnings in the UI\n\ttypedef enum\n\t{\n\t\tSTABLE,\n\t\tEXPERIMENTAL,\n\t\tDEPRECATED\n\t} quality_t;\n\n\t/// Defines a collection of \"categories\" used to group plugins within the UI\n\ttypedef std::vector<std::string> categories_t;\n\t/// Defines a collection of interfaces implemented by the underlying plugin instance\n\ttypedef std::vector<const std::type_info*> interfaces_t;\n\t/// Defines an arbitrary collection of name-value pair metadata describing the underlying plugin instance\n\ttypedef std::map<std::string, std::string> metadata_t;\n\n\t/// Returns a guaranteed-unique factory ID\n\tvirtual const k3d::uuid& factory_id() = 0;\n\t/// Returns the internal name for a plugin\n\tvirtual const std::string name() = 0;\n\t/// Returns a short, human-readable description of the plugin\n\tvirtual const std::string short_description() = 0;\n\t/// Returns a default category for ordering this plugin within the UI\n\tvirtual const categories_t& categories() = 0;\n\t/// Returns the plugin quality (stable or experimental)\n\tvirtual quality_t quality() = 0;\n\t/// Returns true iff a plugin implements the requested interface\n\tvirtual bool implements(const std::type_info& InterfaceType) = 0;\n\t/// Returns the set of interfaces implemented by the plugin \n\tvirtual const interfaces_t interfaces() = 0;\n\t/// Returns metadata describing the plugin\n\tvirtual metadata_t metadata() = 0;\n\nprotected:\n\tiplugin_factory() {}\n\tiplugin_factory(const iplugin_factory& Other) : iunknown(Other) {}\n\tiplugin_factory& operator = (const iplugin_factory&) { return *this; }\n\tvirtual ~iplugin_factory() {}\n};\n\nstd::ostream& operator<<(std::ostream&, const iplugin_factory::quality_t&);\nstd::istream& operator>>(std::istream&, iplugin_factory::quality_t&);\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPLUGIN_FACTORY_H\n\n"
  },
  {
    "path": "k3dsdk/iplugin_factory_collection.h",
    "content": "#ifndef K3DSDK_IPLUGIN_FACTORY_COLLECTION_H\n#define K3DSDK_IPLUGIN_FACTORY_COLLECTION_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\n#include <set>\n\nnamespace k3d\n{\n\nclass iplugin_factory;\n\n/// Abstract factory interface for plugin objects\nclass iplugin_factory_collection :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Defines a collection of plugin factories\n\ttypedef std::set<iplugin_factory*> factories_t;\n\t/// Returns the set of available plugin factories\n\tvirtual const factories_t& factories() = 0;\n\nprotected:\n\tiplugin_factory_collection() {}\n\tiplugin_factory_collection(const iplugin_factory_collection& Other) : iunknown(Other) {}\n\tiplugin_factory_collection& operator=(const iplugin_factory_collection&) { return *this; }\n\tvirtual ~iplugin_factory_collection() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPLUGIN_FACTORY_COLLECTION_H\n\n"
  },
  {
    "path": "k3dsdk/iplugin_registry.h",
    "content": "#ifndef K3DSDK_IPLUGIN_REGISTRY_H\n#define K3DSDK_IPLUGIN_REGISTRY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares iplugin_registry, an abstract interface passed to plugin module entry points so they may register their plugin factories\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n// Forward declarations ...\nclass iplugin_factory;\n\n/**\n\\brief Abstract interface passed to plugin module entry points so they may register their plugin factories\n\\note\nYour K-3D plugin module should export a function named \"register_k3d_plugins\" with the module_entry_point signature, which will\nbe called at program startup.  In the implementation of \"register_k3d_plugins\", call register_factory() once for every plugin type your module provides.\n*/\nclass iplugin_registry :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Called to register a new plugin factory object\n\tvirtual void register_factory(iplugin_factory& Factory) = 0;\n\nprotected:\n\tiplugin_registry() {}\n\tiplugin_registry(const iplugin_registry&) {}\n\tiplugin_registry& operator=(const iplugin_registry&) { return *this; }\n\tvirtual ~iplugin_registry() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPLUGIN_REGISTRY_H\n"
  },
  {
    "path": "k3dsdk/iprojection.h",
    "content": "#ifndef K3DSDK_IPROJECTION_H\n#define K3DSDK_IPROJECTION_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares abstract interfaces that encapsulate viewing projections\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-platform-config.h>\n\n#include <k3dsdk/iunknown.h>\n#ifdef\tK3D_API_WIN32\n#ifdef\tnear\n#undef\tnear\n#endif\t// near\n#ifdef\tfar\n#undef\tfar\n#endif\t// far\n#endif\t// K3D_API_WIN32\n\nnamespace k3d\n{\n\n// Forward declarations\nclass iproperty;\n\n/////////////////////////////////////////////////////////////////////////////\n// iprojection\n\n/// Abstract interface encapsulating a 3D-to-2D viewing projection\nclass iprojection :\n\tpublic virtual k3d::iunknown\n{\npublic:\n\nprotected:\n\tiprojection() {}\n\tiprojection(const iprojection& Other) : iunknown(Other) {}\n\tiprojection& operator=(const iprojection&) { return *this; }\n\tvirtual ~iprojection() {}\n};\n\n/// Abstract interface encapsulating a standard perspective (truncated pyramid, or frustum) transformation\nclass iperspective :\n\tpublic iprojection\n{\npublic:\n\tvirtual iproperty& left() = 0;\n\tvirtual iproperty& right() = 0;\n\tvirtual iproperty& top() = 0;\n\tvirtual iproperty& bottom() = 0;\n\tvirtual iproperty& near() = 0;\n\tvirtual iproperty& far() = 0;\n\nprotected:\n\tiperspective() {}\n\tiperspective(const iperspective& Other) : iunknown(Other) {}\n\tiperspective& operator=(const iperspective&) { return *this; }\n\tvirtual ~iperspective() {}\n};\n\n/// Abstract interface encapsulating a standard orthographic transformation\nclass iorthographic :\n\tpublic iprojection\n{\npublic:\n\tvirtual iproperty& left() = 0;\n\tvirtual iproperty& right() = 0;\n\tvirtual iproperty& top() = 0;\n\tvirtual iproperty& bottom() = 0;\n\tvirtual iproperty& near() = 0;\n\tvirtual iproperty& far() = 0;\n\nprotected:\n\tiorthographic() {}\n\tiorthographic(const iorthographic& Other) : iunknown(Other) {}\n\tiorthographic& operator=(const iorthographic&) { return *this; }\n\tvirtual ~iorthographic() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPROJECTION_H\n"
  },
  {
    "path": "k3dsdk/iproperty.h",
    "content": "#ifndef K3DSDK_IPROPERTY_H\n#define K3DSDK_IPROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ihint.h>\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n\n#include <boost/any.hpp>\n\nnamespace k3d\n{\n\nclass inode;\n\n/// Abstract interface for a name-value pair with fixed type (note - if you want to write to a property, query for iwritable_property and be prepared for it to fail for read-only properties)\nclass iproperty :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~iproperty() {}\n\n\t/// Returns the property name, which will be used as a unique identifier for programmatic access to the property (i.e. through scripting)\n\tvirtual const string_t property_name() = 0;\n\t/// Returns a human-readable lable for the property, which should be localized for display in UI code\n\tvirtual const string_t property_label() = 0;\n\t/// Returns a human-readable \"one-liner\" description of the property, which should be localized for display in the UI (e.g. as a tooltip)\n\tvirtual const string_t property_description() = 0;\n\t/// Returns the property type\n\tvirtual const std::type_info& property_type() = 0;\n\t/// Returns the value stored internally by the property.  Note that most code that uses properties should retrieve the pipeline value instead.\n\tvirtual const boost::any property_internal_value() = 0;\n\t/// Returns the property value, accounting for any connections in the pipeline.  The result may-or-may-not be the same as the internal value.\n\tvirtual const boost::any property_pipeline_value() = 0;\n\t/// Returns a reference to the object that owns the property (if any)\n\tvirtual inode* property_node() = 0;\n\t/// Defines a signal that will be emitted if the property value changes.  The signal includes a pointer to an optional \"hint\" object that may provide additional information about what changed.\n\ttypedef sigc::signal<void, ihint*> changed_signal_t;\n\tvirtual changed_signal_t& property_changed_signal() = 0;\n\t/// Defines a signal that will be emitted when the property is destroyed\n\ttypedef sigc::signal<void> deleted_signal_t;\n\tvirtual deleted_signal_t& property_deleted_signal() = 0;\n\n\t/// Returns this property's pipeline dependency, if any.  Note: there may be dependency cycles, don't use this to perform lookups directly, use k3d::property_lookup() instead\n\tvirtual iproperty* property_dependency() = 0;\n\t/// Sets this property's pipeline dependency.  Note: never call this directly, use a k3d::pipeline object to manage pipeline dependencies\n\tvirtual void property_set_dependency(iproperty*) = 0;\n\nprotected:\n\tiproperty() {}\n\tiproperty(const iproperty& Other) : iunknown(Other) {}\n\tiproperty& operator = (const iproperty&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/iproperty_collection.h",
    "content": "#ifndef K3DSDK_IPROPERTY_COLLECTION_H\n#define K3DSDK_IPROPERTY_COLLECTION_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares iproperty_collection, an abstract interface for wrapping a collection of iproperty objects\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ihint.h>\n#include <k3dsdk/signal_system.h>\n\n#include <vector>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for a collection of iproperty objects\nclass iproperty_collection :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Defines a collection of properties\n\ttypedef std::vector<iproperty*> properties_t;\n\n\t/// Registers a property with the collection - note: the collection will assume responsibility for the lifetime of user properties only\n\tvirtual void register_property(iproperty& Property) = 0;\n\t/// Registers a set of properties with the collection - note: the collection will assume responsibility for the lifetime of user properties only\n\tvirtual void register_properties(const properties_t& Properties) = 0;\n\t\n\t/// Removes a property from the collection\n\tvirtual void unregister_property(iproperty& Property) = 0;\n\t/// Removes a set of properties from the collection\n\tvirtual void unregister_properties(const properties_t& Properties) = 0;\n\n\t/// Returns the set of all properties in the collection\n\tvirtual const properties_t& properties() = 0;\n\t/// Connects a slot to a signal emitted whenever the collection changes - note: the signal is emitted when the collection changes (properties are registered and unregistered), not when individual property values are changed\n\tvirtual sigc::connection connect_properties_changed_signal(const sigc::slot<void, ihint*>& Slot) = 0;\n\nprotected:\n\tiproperty_collection() {}\n\tiproperty_collection(const iproperty_collection& Other) : iunknown(Other) {}\n\tiproperty_collection& operator=(const iproperty_collection&) { return *this; }\n\tvirtual ~iproperty_collection() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPROPERTY_COLLECTION_H\n\n"
  },
  {
    "path": "k3dsdk/iproperty_group_collection.h",
    "content": "#ifndef K3DSDK_IPROPERTY_GROUP_COLLECTION_H\n#define K3DSDK_IPROPERTY_GROUP_COLLECTION_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/types.h>\n\n#include <vector>\n\nnamespace k3d\n{\n\n/// Provides an abstract interface grouping a collection of iproperty objects (for UI purposes)\nclass iproperty_group_collection :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Defines a grouped collection of properties\n\tstruct group\n\t{\n\t\tgroup()\n\t\t{\n\t\t}\n\t\t\n\t\tgroup(const string_t& Name) :\n\t\t\tname(Name)\n\t\t{\n\t\t}\n\t\t\n\t\tgroup(const string_t& Name, const iproperty_collection::properties_t& Properties) :\n\t\t\tname(Name),\n\t\t\tproperties(Properties)\n\t\t{\n\t\t}\n\t\t\n\t\t/// Stores a human-readable name for the group\n\t\tstring_t name;\n\n\t\t/// Stores references to the properties within the group\n\t\tiproperty_collection::properties_t properties;\n\t};\n\t\n\t/// Defines a collection of property groups\n\ttypedef std::vector<group> groups_t;\n\t/// Returns the set of property groups within the object\n\tvirtual const groups_t property_groups() = 0;\n\nprotected:\n\tiproperty_group_collection() {}\n\tiproperty_group_collection(const iproperty_group_collection&) {}\n\tiproperty_group_collection& operator=(const iproperty_group_collection&) { return *this; }\n\tvirtual ~iproperty_group_collection() {}\n};\n\n} // namespace k3d\n\n\n#endif // !K3DSDK_IPROPERTY_GROUP_COLLECTION_H\n"
  },
  {
    "path": "k3dsdk/iproperty_sink.h",
    "content": "#ifndef K3DSDK_IPROPERTY_SINK_H\n#define K3DSDK_IPROPERTY_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for objects that can be optionally 'bound' to a specific property\nclass iproperty_sink :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~iproperty_sink() {}\n\n\tvirtual void set_property(iproperty* const Property) = 0;\n\nprotected:\n\tiproperty_sink() {}\n\tiproperty_sink(const iproperty_sink&) {}\n\tiproperty_sink& operator = (const iproperty_sink&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IPROPERTY_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/irender_animation.h",
    "content": "#ifndef K3DSDK_IRENDER_ANIMATION_H\n#define K3DSDK_IRENDER_ANIMATION_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/frames.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface implemented by objects that can render a sequence of still images\nclass irender_animation :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual bool render_animation(iproperty& Time, const frames& Frames, const bool ViewCompletedImages) = 0;\n\nprotected:\n\tirender_animation() {}\n\tirender_animation(const irender_animation&) {}\n\tirender_animation& operator = (const irender_animation&) { return *this; }\n\tvirtual ~irender_animation() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IRENDER_ANIMATION_H\n\n"
  },
  {
    "path": "k3dsdk/irender_camera_animation.h",
    "content": "#ifndef K3DSDK_IRENDER_CAMERA_ANIMATION_H\n#define K3DSDK_IRENDER_CAMERA_ANIMATION_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/frames.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass icamera;\nclass iproperty;\n\t\n/// Abstract interface implemented by objects that can render a sequence of still images using a camera\nclass irender_camera_animation :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual bool render_camera_animation(icamera& Camera, iproperty& Time, const frames& Frames, const bool ViewCompletedImages) = 0;\n\nprotected:\n\tirender_camera_animation() {}\n\tirender_camera_animation(const irender_camera_animation& Other) : iunknown(Other) {}\n\tirender_camera_animation& operator = (const irender_camera_animation&) { return *this; }\n\tvirtual ~irender_camera_animation() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IRENDER_CAMERA_ANIMATION_H\n\n"
  },
  {
    "path": "k3dsdk/irender_camera_frame.h",
    "content": "#ifndef K3DSDK_IRENDER_CAMERA_FRAME_H\n#define K3DSDK_IRENDER_CAMERA_FRAME_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass icamera;\nnamespace filesystem { class path; }\n\t\n/// Abstract interface implemented by objects that can render a still image using a camera\nclass irender_camera_frame :\n\tpublic virtual k3d::iunknown\n{\npublic:\n\tvirtual bool_t render_camera_frame(icamera& Camera, const filesystem::path& OutputImage, const bool_t ViewCompletedImage) = 0;\n\nprotected:\n\tirender_camera_frame() {}\n\tirender_camera_frame(const irender_camera_frame& Other) : iunknown(Other) {}\n\tirender_camera_frame& operator = (const irender_camera_frame&) { return *this; }\n\tvirtual ~irender_camera_frame() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IRENDER_CAMERA_FRAME_H\n\n"
  },
  {
    "path": "k3dsdk/irender_camera_preview.h",
    "content": "#ifndef K3DSDK_IRENDER_CAMERA_PREVIEW_H\n#define K3DSDK_IRENDER_CAMERA_PREVIEW_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass icamera;\n\t\n/// Abstract interface implemented by objects that can create a \"preview\" render of a scene using a camera\nclass irender_camera_preview :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual bool_t render_camera_preview(icamera& Camera) = 0;\n\nprotected:\n\tirender_camera_preview() {}\n\tirender_camera_preview(const irender_camera_preview& Other) : iunknown(Other) {}\n\tirender_camera_preview& operator = (const irender_camera_preview&) { return *this; }\n\tvirtual ~irender_camera_preview() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IRENDER_CAMERA_PREVIEW_H\n\n"
  },
  {
    "path": "k3dsdk/irender_engine_ri.h",
    "content": "#ifndef K3DSDK_IRENDER_ENGINE_RI_H\n#define K3DSDK_IRENDER_ENGINE_RI_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\nclass inetwork_render_frame;\n\nnamespace ri\n{\n\n/// Abstract interface for objects that provide an interface to specific RenderMan implementations\nclass irender_engine :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~irender_engine() {}\n\n\t/// Returns true iff the underlying RenderMan engine is installed and usable\n\tvirtual bool_t installed() = 0;\n\t/// Compiles the given shader source code, placing the results into the global shader cache\n\tvirtual bool_t compile_shader(const filesystem::path& Shader) = 0;\n\t/// Renders the given RIB file\n\tvirtual bool_t render(inetwork_render_frame& Frame, const filesystem::path& RIB) = 0;\n\nprotected:\n\tirender_engine() {}\n\tirender_engine(const irender_engine& Other) : iunknown(Other) {}\n\tirender_engine& operator=(const irender_engine& ) { return *this; }\n};\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_IRENDER_ENGINE_RI_H\n\n"
  },
  {
    "path": "k3dsdk/irender_frame.h",
    "content": "#ifndef K3DSDK_IRENDER_FRAME_H\n#define K3DSDK_IRENDER_FRAME_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\n\n/// Abstract interface implemented by objects that can render a still image\nclass irender_frame :\n\tpublic virtual k3d::iunknown\n{\npublic:\n\tvirtual bool render_frame(const filesystem::path& OutputImage, const bool ViewCompletedImage) = 0;\n\nprotected:\n\tirender_frame() {}\n\tirender_frame(const irender_frame&) {}\n\tirender_frame& operator = (const irender_frame&) { return *this; }\n\tvirtual ~irender_frame() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IRENDER_FRAME_H\n\n"
  },
  {
    "path": "k3dsdk/irender_preview.h",
    "content": "#ifndef K3DSDK_IRENDER_PREVIEW_H\n#define K3DSDK_IRENDER_PREVIEW_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface implemented by objects that can render a \"preview\" image\nclass irender_preview :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual bool render_preview() = 0;\n\nprotected:\n\tirender_preview() {}\n\tirender_preview(const irender_preview&) {}\n\tirender_preview& operator = (const irender_preview&) { return *this; }\n\tvirtual ~irender_preview() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IRENDER_PREVIEW_H\n\n"
  },
  {
    "path": "k3dsdk/irender_viewport_gl.h",
    "content": "#ifndef K3DSDK_IRENDER_VIEWPORT_GL_H\n#define K3DSDK_IRENDER_VIEWPORT_GL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/gl.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nclass icamera;\nclass rectangle;\n\nnamespace gl\n{\n\nclass selection_state;\n\n/// Abstract interface for objects that can render using OpenGL\nclass irender_viewport :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Returns the normalized device coordinates for the viewport, allowing for mismatches between the aspect ratio of the window and the camera\n\tvirtual bool get_ndc(icamera& Camera, const unsigned long PixelWidth, const unsigned long PixelHeight, rectangle& CameraRect, rectangle& WindowRect) = 0;\n\n\t/** \\brief Redraws the document\n\t    \\note The caller must setup an OpenGL render context before calling this method, and must call glFlush() after it returns */\n\tvirtual void render_viewport(icamera& Camera, const unsigned long PixelWidth, const unsigned long PixelHeight, GLdouble ViewMatrix[16], GLdouble ProjectionMatrix[16], GLint Viewport[4]) = 0;\n\n\t/**\n\t  \\brief Draws the document in OpenGL selection mode, so selection \"hits\" can be extracted\n\t  \\param SelectionState The geometry components to be drawn\n\t  \\param PixelWidth The width of the viewport in pixels\n\t  \\param PixelHeight The width of the viewport in pixels\n\t  \\param FontListBase\n\t  \\param Rectangle Defines the selection region as a rectangle in screen (pixel coordinates)\n\t  \\param ViewMatrix Returns the OpenGL view matrix used for drawing (the camera-to-world matrix)\n\t  \\param ProjectionMatrix Returns the OpenGL projection matrix used for drawing\n\t  \\param Viewport Returns the OpenGL viewport used for drawing\n\t  \\note The caller must setup the OpenGL render context, allocate the selection buffer, put OpenGL in selection mode, and call glFlush() when done\n\t*/\n\tvirtual void render_viewport_selection(const selection_state& SelectionState, icamera& Camera, const unsigned long PixelWidth, const unsigned long PixelHeight, const rectangle& Rectangle, GLdouble ViewMatrix[16], GLdouble ProjectionMatrix[16], GLint Viewport[4]) = 0;\n\n\t/// Enumerates redraw request types\n\ttypedef enum\n\t{\n\t\tSYNCHRONOUS,\n\t\tASYNCHRONOUS\n\t} redraw_type_t;\n\n\t/// Used to signal any connected user interface components that a redraw is requested\n\ttypedef sigc::signal<void, redraw_type_t> redraw_request_signal_t;\n\tvirtual redraw_request_signal_t& redraw_request_signal() = 0;\n\nprotected:\n\tirender_viewport() {}\n\tirender_viewport(const irender_viewport& Other) : iunknown(Other) {}\n\tirender_viewport& operator=(const irender_viewport&) { return *this; }\n\tvirtual ~irender_viewport() {}\n};\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_IRENDER_VIEWPORT_GL_H\n\n"
  },
  {
    "path": "k3dsdk/irenderable_gl.h",
    "content": "#ifndef K3DSDK_IRENDERABLE_GL_H\n#define K3DSDK_IRENDERABLE_GL_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\nclass render_state;\nclass selection_state;\n\t\n/// Abstract interface implemented by objects that can render themselves using the OpenGL API\nclass irenderable :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Returns the layer on which this renderable should be drawn.  Lower-numbered layers are rendered earlier than higher-numbered layers.\n\t/// The (arbitrary) default layer for most 3D objects is 1024.  Layer zero is reserved for the viewport background.\n\tvirtual uint_t gl_layer() = 0;\n\tvirtual void gl_draw(const render_state& State) = 0;\n\tvirtual void gl_select(const render_state& State, const selection_state& SelectState) = 0;\n\nprotected:\n\tirenderable() {}\n\tirenderable(const irenderable&) {}\n\tirenderable& operator=(const irenderable&) { return *this; }\n\tvirtual ~irenderable() {}\n};\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_IRENDERABLE_GL_H\n\n"
  },
  {
    "path": "k3dsdk/irenderable_ri.h",
    "content": "#ifndef K3DSDK_IRENDERABLE_RI_H\n#define K3DSDK_IRENDERABLE_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nclass render_state;\n\t\n/// Abstract interface for objects that can render themselves using the RenderMan API\nclass irenderable :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void renderman_render(const render_state& State) = 0;\n\tvirtual void renderman_render_complete(const render_state& State) = 0;\n\nprotected:\n\tirenderable() {}\n\tirenderable(const irenderable& ) {}\n\tirenderable& operator=(const irenderable& ) { return *this; }\n\tvirtual ~irenderable() {}\n};\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_IRENDERABLE_RI_H\n\n"
  },
  {
    "path": "k3dsdk/ireset_properties.h",
    "content": "#ifndef K3DSDK_IRESET_PROPERTIES_H\n#define K3DSDK_IRESET_PROPERTIES_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// All nodes must provide sensible default values for properties, but some\n/// nodes may be able to provide better default values depending on their inputs.\n///\n/// For example, a node that manipulates NURBS knot vectors may set an initial vector\n/// based on the order of an input curve.  A node that modifies mesh texture coordinates\n/// would pick a default coordinate array to modify, out of the arrays available in an\n/// input mesh, etc.\nclass ireset_properties :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Implementations should update property values using whatever logic is appropriate.\n\t/// Note that this is the only time (other than in a constructor) when a node is allowed\n\t/// to modify one of its own properties!\n\tvirtual void reset_properties() = 0;\n\nprotected:\n\tireset_properties() {}\n\tireset_properties(const ireset_properties&) {}\n\tireset_properties& operator=(const ireset_properties&) { return *this; }\n\tvirtual ~ireset_properties() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IRESET_PROPERTIES_H\n\n"
  },
  {
    "path": "k3dsdk/iscript_engine.h",
    "content": "#ifndef K3DSDK_ISCRIPT_ENGINE_H\n#define K3DSDK_ISCRIPT_ENGINE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n\n#include <boost/any.hpp>\n#include <iosfwd>\n#include <map>\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\nclass iplugin_factory;\n\n/// Abstract interface implemented by objects that can execute scripts written in a specific scripting language\n/** \\note: The Script arguments to execute() have bounced back-and-forth between\n * string and stream representations several times.  The original rationale for making them streams was\n * to avoid having to buffer the source code to a script in memory; the new rationale for making them strings\n * is that in practice you always end-up having to buffer the source code anyway, for one of two reasons:\n * first, very few script APIs are likely to support C++ streams\n * C++ streams, so we will likely have to buffer the source before using it anyway; second, determining\n * the MIME type of a script and calling execute() in sequence (the most common use-case) requires random access to the source stream,\n * which isn't available for compressed streams or socket-based streams.\n*/\n\nclass iscript_engine :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~iscript_engine() {}\n\n\t/// Returns a reference to the factory that created this object\n\tvirtual iplugin_factory& factory() = 0;\n\t/**\t\\brief Returns the human-readable name of the scripting language this engine implements\n\t*/\n\tvirtual const string_t language() = 0;\n\n\t/// Defines a collection of name-value pairs passed to a script that define its context (its execution environment) - how they are used is implementation-dependent (note that the names are merely suggestions, and may be changed or ignored at the whim of the implementation)\n\tclass context :\n\t\tpublic std::map<string_t, boost::any>\n\t{\n\t};\n\n\t/// Defines a slot that can be called to redirect script output.\n\ttypedef sigc::slot<void, const string_t&> output_t;\n\n\t/**\t\\brief Executes a script\n\t\t\\param ScriptName A human readable identifier for the script, which should be used in error messages, etc.\n\t\t\\param Script The complete source code of the script to be executed\n\t\t\\param Context Collection of objects that define the context/execution environment of the script -  how they are used is implementation-dependent.  Note that the script engine may alter context objects before returning.\n\t\t\\param Stdout Optional slot that will be called with script output.\n\t\t\\param Stderr Optional slot that will be called with script output.\n\t\t\\return true, iff the script was successfully executed without errors (either syntax or runtime)\n\t*/\n\tvirtual bool_t execute(const string_t& ScriptName, const string_t& Script, context& Context, output_t* Stdout = 0, output_t* Stderr = 0) = 0;\n\n\t/**\t\\brief Requests a cancellation of all running scripts.\n\t\t\\return true, iff script cancellation is supported by this engine.\n\t\t\\note Cancellation may be asynchronous, i.e. scripts may still be running when the call returns, and may continue to run for an indefinite period before shutting down, if at all.\n\t*/\n\tvirtual bool_t halt() = 0;\n\nprotected:\n\tiscript_engine() {}\n\tiscript_engine(const iscript_engine& Other) : iunknown(Other) {}\n\tiscript_engine& operator = (const iscript_engine&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISCRIPT_ENGINE_H\n\n"
  },
  {
    "path": "k3dsdk/iscript_property.h",
    "content": "#ifndef K3DSDK_ISCRIPT_PROPERTY_H\n#define K3DSDK_ISCRIPT_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares iscript_property, an abstract interface for discovering information about a property that uses real-world units-of-measure\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface for properties that represent scripts (typically used to alter presentation)\nclass iscript_property :\n\tpublic virtual iunknown\n{\npublic:\n\nprotected:\n\tiscript_property() {}\n\tiscript_property(const iscript_property& Other) : iunknown(Other) {}\n\tiscript_property& operator = (const iscript_property&) { return *this; }\n\tvirtual ~iscript_property() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISCRIPT_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/iscripted_action.h",
    "content": "#ifndef K3DSDK_ISCRIPTED_ACTION_H\n#define K3DSDK_ISCRIPTED_ACTION_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\n/// Abstract interface implemented by objects that can execute a script on-demand\nclass iscripted_action :\n\tpublic virtual iunknown\n{\npublic:\n\t/// When called, the underlying object will execute a script using the given context\n\tvirtual bool_t execute(iscript_engine::context& Context) = 0;\n\nprotected:\n\tiscripted_action() {}\n\tiscripted_action(const iscripted_action&) {}\n\tiscripted_action& operator = (const iscripted_action&) { return *this; }\n\tvirtual ~iscripted_action() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISCRIPTED_ACTION_H\n\n"
  },
  {
    "path": "k3dsdk/iselectable.h",
    "content": "#ifndef K3DSDK_ISELECTABLE_H\n#define K3DSDK_ISELECTABLE_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares iselectable, an abstract interface for selectable objects\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface for an object that supports the \"selection\" concept, affecting downstream editing operations\n/** \\deprecated Get rid of this once k3d::legacy::mesh is gone */\nclass iselectable :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Returns the selection weight of the object, 0 == not selected, non-zero == selected, modifiers may interpret the weight as a boolean, or use linear-interpolation.  Weights may be negative or greater than 1.\n\tvirtual double get_selection_weight() = 0;\n\t/// Sets the selection weight of the object\n\tvirtual void set_selection_weight(const double Weight) = 0;\n\nprotected:\n\tiselectable() {}\n\tiselectable(const iselectable& Other) : iunknown(Other) {}\n\tiselectable& operator=(const iselectable&) { return *this; }\n\tvirtual ~iselectable() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISELECTABLE_H\n\n"
  },
  {
    "path": "k3dsdk/ishader_collection_ri.h",
    "content": "#ifndef K3DSDK_ISHADER_COLLECTION_RI_H_H\n#define K3DSDK_ISHADER_COLLECTION_RI_H_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types_ri.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\n/// Abstract interface to a collection of RenderMan shaders stored by source path (used to keep track of shaders that need to be compiled)\nclass ishader_collection :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void use_shader(const path& Path) = 0;\n\nprotected:\n\tishader_collection() {}\n\tishader_collection(const ishader_collection& ) {}\n\tishader_collection& operator=(const ishader_collection& ) { return *this; }\n\tvirtual ~ishader_collection() {}\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISHADER_COLLECTION_RI_H\n\n"
  },
  {
    "path": "k3dsdk/isnap_source.h",
    "content": "#ifndef K3DSDK_ISNAP_SOURCE_H\n#define K3DSDK_ISNAP_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/types.h>\n\n#include <vector>\n\nnamespace k3d\n{\n\nclass vector3;\n\n/// Abstract interface for a \"source\" on a snappable object\nclass isnap_source :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~isnap_source() {}\n\n\t/// Defines a collection of \"snap groups\"\n\ttypedef std::vector<string_t> groups_t;\n\t\n\t/// Returns a human-readable label that describes this source\n\tvirtual const string_t label() = 0;\n\t/// Returns a collection of groups that this source is a member of\n\tvirtual const groups_t groups() = 0;\n\t/// Returns the position of this source in local coordinates\n\tvirtual const point3 source_position() = 0;\n\t/// Returns the (optional, could return false) orientation of this source in local coordinates\n\tvirtual bool source_orientation(vector3& SourceLook, vector3& SourceUp) = 0;\n\nprotected:\n\tisnap_source() {}\n\tisnap_source(const isnap_source&) {}\n\tisnap_source& operator=(const isnap_source&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISNAP_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/isnap_target.h",
    "content": "#ifndef K3DSDK_ISNAP_TARGET_H\n#define K3DSDK_ISNAP_TARGET_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\n#include <vector>\n\nnamespace k3d\n{\n\nclass vector3;\nclass point3;\n\t\n/// Abstract interface for a \"target\" on a snappable object\nclass isnap_target :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~isnap_target() {}\n\n\t/// Defines a collection of \"snap groups\"\n\ttypedef std::vector<string_t> groups_t;\n\t\n\t/// Returns a human-readable label that describes this target\n\tvirtual const string_t label() = 0;\n\t/// Returns a collection of groups that this target is a member of\n\tvirtual const groups_t groups() = 0;\n\t/// Given a set of local coordinates, returns the (optional, could return false) corresponding target position in local coordiantes\n\tvirtual bool target_position(const point3& Position, point3& TargetPosition) = 0;\n\t/// Given a set of local coordinates, returns the (optional, could return false) corresponding target orientation in local coordinates\n\tvirtual bool target_orientation(const point3& Position, vector3& TargetLook, vector3& TargetUp) = 0;\n\nprotected:\n\tisnap_target() {}\n\tisnap_target(const isnap_target&) {}\n\tisnap_target& operator=(const isnap_target&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISNAP_TARGET_H\n\n"
  },
  {
    "path": "k3dsdk/isnappable.h",
    "content": "#ifndef K3DSDK_ISNAPPABLE_H\n#define K3DSDK_ISNAPPABLE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares isnappable, an abstract interface implemented by objects to which other objects can be interactively \"snapped\"\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <vector>\n\nnamespace k3d\n{\n\nclass isnap_source;\nclass isnap_target;\n\t\n/// Abstract interface implemented by objects to which other objects can be interactively \"snapped\"\nclass isnappable :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~isnappable() {}\n\n\t/// Defines a collection of \"snap sources\" that describe what parts of this object can be snapped\n\ttypedef std::vector<isnap_source*> snap_sources_t;\n\tvirtual const snap_sources_t snap_sources() = 0;\n\t\n\t/// Defines a collection of \"snap targets\" that describe what parts of this object can be snapped-to\n\ttypedef std::vector<isnap_target*> snap_targets_t;\n\tvirtual const snap_targets_t snap_targets() = 0;\n\n\t/// Adds a new snap source to the object (which takes control of the lifetime of the new source)\n\tvirtual void add_snap_source(isnap_source* const SnapSource) = 0;\n\t/// Adds a new snap target to the object (which takes control of the lifetime of the new target)\n\tvirtual void add_snap_target(isnap_target* const SnapTarget) = 0;\n\t\nprotected:\n\tisnappable() {}\n\tisnappable(const isnappable&) {}\n\tisnappable& operator=(const isnappable&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISNAPPABLE_H\n\n"
  },
  {
    "path": "k3dsdk/istate_container.h",
    "content": "#ifndef K3DSDK_ISTATE_CONTAINER_H\n#define K3DSDK_ISTATE_CONTAINER_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\n/// Abstract interface for an object that stores state and can restore it on demand (memento design pattern)\nclass istate_container\n{\npublic:\n\tvirtual ~istate_container() { }\n\n\t/// When called, the implementation should restore whatever state it encapsulates\n\tvirtual void restore_state() = 0;\n\nprotected:\n\tistate_container() {}\n\tistate_container(const istate_container&) {}\n\tistate_container& operator = (const istate_container&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISTATE_CONTAINER_H\n\n"
  },
  {
    "path": "k3dsdk/istate_recorder.h",
    "content": "#ifndef K3DSDK_ISTATE_RECORDER_H\n#define K3DSDK_ISTATE_RECORDER_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n\n#include <memory>\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\nclass state_change_set;\n\t\n/// Abstract interface for an object that can store a hierarchical tree of state changes to the document\nclass istate_recorder :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Called by clients to register a change set for recording subsequent state changes (the recorder assumes responsibility for the lifetime of the changeset)\n\tvirtual void start_recording(std::unique_ptr<state_change_set> ChangeSet, const char* const DebugLabel) = 0;\n\t/// Returns the current change set being recorded (if any - could return NULL)\n\tvirtual state_change_set* current_change_set() = 0;\n\t/// Called by clients to stop recording a set of state changes (the recorder relinquishes responsibility for the lifetime of the returned changeset)\n\tvirtual std::unique_ptr<state_change_set> stop_recording(const char* const DebugLabel) = 0;\n\t/// Called by clients once a set of changes is complete, to make them a part of the undo/redo tree (the recorder assumes responsibility for the lifetime of the change set)\n\tvirtual void commit_change_set(std::unique_ptr<state_change_set> ChangeSet, const std::string& Label, const char* const DebugLabel) = 0;\n\n\t/// Defines a collection of \"nodes\" in the hierarchy of recorded state changes\n\tstruct node;\n\ttypedef std::vector<node*> nodes_t;\n\n\t/// Encapsulates a single \"node\" in the hierarchy of recorded state changes\n\tstruct node\n\t{\n\t\tnode(const std::string& Label, state_change_set* const ChangeSet, node* const Parent) : label(Label), change_set(ChangeSet), parent(Parent) { }\n\n\t\t/// Stores the human-readable label for this node\n\t\tconst std::string label;\n\t\t/// Points to the change set owned by this node\n\t\tstate_change_set* const change_set;\n\t\t/// Points to this node's parent (NULL for the root node)\n\t\tnode* const parent;\n\t\t/// Points to this node's children\n\t\tnodes_t children;\n\t};\n\n\t/// Returns the root node(s) in the hierarchy of recorded state changes (could return an empty collection if no recording has taken place)\n\tvirtual const nodes_t& root_nodes() = 0;\n\t/// Returns the current node - the node that will become the parent of any subsequently recorded nodes (could return NULL)\n\tvirtual const node* current_node() = 0;\n\t/// Returns the newest (most-recently-created) node, which is typically the node that should be the \"goal\" of redo operations (could return NULL if nothing's been recorded yet)\n\tvirtual const node* newest_node() = 0;\n\t/// Returns the most-recently-saved node in the hierarchy of recorded state changes (could return NULL if no save has taken place)\n\tvirtual const node* last_saved_node() = 0;\n\n\t/// Called to set the current node\n\tvirtual void set_current_node(const node* const Node) = 0;\n\t/// Called to mark the current node as saved\n\tvirtual void mark_saved() = 0;\n\n\t/// Connects a slot that will be called when recording finishes\n\tvirtual sigc::connection connect_recording_done_signal(const sigc::slot<void>& Slot) = 0;\n\t\n\t/// Connects a slot that will be called after a node is added to the hierarchy\n\tvirtual sigc::connection connect_node_added_signal(const sigc::slot<void, const node*>& Slot) = 0;\n\t/// Connects a slot that will be called when the current node has changed\n\tvirtual sigc::connection connect_current_node_changed_signal(const sigc::slot<void>& Slot) = 0;\n\t/// Connects a slot that will be called when the last saved node has changed\n\tvirtual sigc::connection connect_last_saved_node_changed_signal(const sigc::slot<void>& Slot) = 0;\n\nprotected:\n\tistate_recorder() {}\n\tistate_recorder(const istate_recorder& Other) : iunknown(Other) {}\n\tistate_recorder& operator = (const istate_recorder&) { return *this; }\n\tvirtual ~istate_recorder() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISTATE_RECORDER_H\n\n"
  },
  {
    "path": "k3dsdk/istate_recorder_sink.h",
    "content": "#ifndef K3DSDK_ISTATE_RECORDER_SINK_H\n#define K3DSDK_ISTATE_RECORDER_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass istate_recorder;\n\n/// Abstract interface for objects that can be optionally 'bound' to a specific state recorder\nclass istate_recorder_sink :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~istate_recorder_sink() {}\n\n\tvirtual void set_state_recorder(istate_recorder* StateRecorder) = 0;\n\nprotected:\n\tistate_recorder_sink() {}\n\tistate_recorder_sink(const istate_recorder_sink&) {}\n\tistate_recorder_sink& operator = (const istate_recorder_sink&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISTATE_RECORDER_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/istream_ri.h",
    "content": "#ifndef K3DSDK_ISTREAM_RI_H\n#define K3DSDK_ISTREAM_RI_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types_ri.h>\n\n#include <boost/array.hpp>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\n/// Abstract binding to the Pixar RenderMan interface\nclass istream :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual bool set_inline_types(const bool Inline) = 0;\n\n\tvirtual const light_handle RiAreaLightSourceV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiAtmosphereV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiAttributeBegin() = 0;\n\tvirtual void RiAttributeEnd() = 0;\n\tvirtual void RiAttributeV(const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiBasis(const matrix& UBasis, const unsigned_integer UStep, const matrix& VBasis, const unsigned_integer VStep) = 0;\n\tvirtual void RiBasis(const string& UBasis, const unsigned_integer UStep, const string& VBasis, const unsigned_integer VStep) = 0;\n\tvirtual void RiBlobbyV(const unsigned_integer NLeaf, const unsigned_integers& Codes, const reals& Floats, const strings& Strings, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiBound(const boost::array<real, 6>& Bound) = 0;\n\tvirtual void RiClipping(const real Hither, const real Yon) = 0;\n\tvirtual void RiColor(const color& Color) = 0;\n\tvirtual void RiColorSamples(const unsigned_integer ParameterCount, const reals& nRGB, const reals& RGBn) = 0;\n\tvirtual void RiComment(const string& Comment) = 0;\n\tvirtual void RiConcatTransform(const matrix& Transform) = 0;\n\tvirtual void RiConeV(const real Height, const real Radius, const real ThetaMax, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiCoordSysTransform(const string& Space) = 0;\n\tvirtual void RiCoordinateSystem(const string& Space) = 0;\n\tvirtual void RiCropWindow(const real XMin, const real XMax, const real YMin, const real YMax) = 0;\n\tvirtual void RiCurvesV(const string& Type, const unsigned_integers& VertexCounts, const string& Wrap, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiCylinderV(const real Radius, const real ZMin, const real ZMax, const real ThetaMax, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiDeclare(const string& Name, const string& Type) = 0;\n\tvirtual void RiDeformationV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiDepthOfField(const real FStop, const real FocalLength, const real FocalDistance) = 0;\n\tvirtual void RiDetail(const boost::array<real, 6>& Bound) = 0;\n\tvirtual void RiDetailRange(const real MinVis, const real LowTran, const real UpTran, const real MaxVis) = 0;\n\tvirtual void RiDiskV(real Height, real Radius, real ThetaMax, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiDisplacementV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiDisplayV(const string& Name, const string& Type, const string& Mode, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiErrorHandler(const string& Style) = 0;\n\tvirtual void RiExposure(const real Gain, const real Gamma) = 0;\n\tvirtual void RiExteriorV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiFormat(const unsigned_integer XResolution, const unsigned_integer YResolution, const real AspectRatio) = 0;\n\tvirtual void RiFrameAspectRatio(const real AspectRatio) = 0;\n\tvirtual void RiFrameBegin(const unsigned_integer FrameNumber) = 0;\n\tvirtual void RiFrameEnd() = 0;\n\tvirtual void RiGeneralPolygonV(const unsigned_integers& VertexCounts, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiGeometricApproximation(const string& Type, const real Value) = 0;\n\tvirtual void RiGeometricRepresentation(const string& Type) = 0;\n\tvirtual void RiGeometryV(const string& Type, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiHiderV(const string& Type, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiHyperboloidV(const point& Point1, const point& Point2, const real ThetaMax, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiIdentity() = 0;\n\tvirtual void RiIlluminate(const light_handle LightHandle, const bool OnOff) = 0;\n\tvirtual void RiImagerV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiInteriorV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual const light_handle RiLightSourceV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiMakeCubeFaceEnvironmentV(const string& px, const string& nx, const string& py, const string& ny, const string& pz, const string& nz, const string& texturename, const real fov, const string& swrap, const string& twrap, const string& filterfunc, const real swidth, const real twidth, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiMakeLatLongEnvironmentV(const string& picturename, const string& texturename, const string& filterfunc, const real swidth, const real twidth, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiMakeShadowV(const string& picturename, const string& texturename, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiMakeTextureV(const string& picturename, const string& texturename, const string& swrap, const string& twrap, const string& filterfunc, const real swidth, const real twidth, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiMatte(const bool OnOff) = 0;\n\tvirtual void RiMotionBeginV(const sample_times_t& Times) = 0;\n\tvirtual void RiMotionEnd() = 0;\n\tvirtual void RiNewline() = 0;\n\tvirtual void RiNuPatchV(const unsigned_integer UCount, const unsigned_integer UOrder, const reals& UKnot, const real UMin, const real UMax, const unsigned_integer VCount, const unsigned_integer VOrder, const reals& VKnot, const real VMin, const real VMax, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual const object_handle RiObjectBegin() = 0;\n\tvirtual void RiObjectEnd() = 0;\n\tvirtual void RiObjectInstance(const object_handle Object) = 0;\n\tvirtual void RiOpacity(const color& Opacity) = 0;\n\tvirtual void RiOptionV(const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiOrientation(const string& Orientation) = 0;\n\tvirtual void RiParaboloidV(const real RMax, const real ZMin, const real ZMax, const real ThetaMax, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiPatchMeshV(const string& Type, const unsigned_integer UCount, const string& UWrap, const unsigned_integer VCount, const string& VWrap, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiPatchV(const string& Type, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiPerspective(const real FieldOfView) = 0;\n\tvirtual void RiPixelFilter(const string& FilterName, const real XWidth, const real YWidth) = 0;\n\tvirtual void RiPixelSamples(const real XSamples, const real YSamples) = 0;\n\tvirtual void RiPixelVariance(const real Variation) = 0;\n\tvirtual void RiPointsGeneralPolygonsV(const unsigned_integers& LoopCounts, const unsigned_integers& VertexCounts, const unsigned_integers& VertexIDs, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiPointsPolygonsV(const unsigned_integers& VertexCounts, const unsigned_integers& VertexIDs, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual\tvoid RiPointsV(const unsigned_integer VertexCount, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiPolygonV(const unsigned_integer VertexCount, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiProcDelayedReadArchive(const path& Archive, const bound& BoundingBox) = 0;\n\tvirtual void RiProjectionV(const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiQuantize(const string& Type, const integer One, const integer QMin, const integer QMax, const real Amplitude) = 0;\n\tvirtual void RiReadArchive(const path& Archive) = 0;\n\tvirtual void RiRelativeDetail(const real RelativeDetail) = 0;\n\tvirtual void RiReverseOrientation() = 0;\n\tvirtual void RiRotate(const real angle, const real DX, const real DY, const real DZ) = 0;\n\tvirtual void RiScale(const real DX, const real DY, const real DZ) = 0;\n\tvirtual void RiScreenWindow(const real Left, const real Right, const real Bottom, const real Top) = 0;\n\tvirtual void RiShadingInterpolation(const string& Type) = 0;\n\tvirtual void RiShadingRate(const real Size) = 0;\n\tvirtual void RiShutter(const real SMin, const real SMax) = 0;\n\tvirtual void RiSides(const unsigned_integer Sides) = 0;\n\tvirtual void RiSkew(const real Angle, const real DX1, const real DY1, const real DZ1, const real DX2, const real DY2, const real DZ2) = 0;\n\tvirtual void RiSolidBegin(const string& Type) = 0;\n\tvirtual void RiSolidEnd() = 0;\n\tvirtual void RiSphereV(const real Radius, const real ZMin, const real ZMax, const real ThetaMax, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiStructure(const string& Structure) = 0;\n\tvirtual void RiSubdivisionMeshV(const string& Scheme, const unsigned_integers& VertexCounts, const unsigned_integers& VertexIDs, const strings& Tags, const unsigned_integers& ArgCounts, const integers& IntegerArgs, const reals& FloatArgs, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiSurfaceV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiTextureCoordinates(const real S1, const real T1, const real S2, const real T2, const real S3, const real T3, const real S4, const real T4) = 0;\n\tvirtual void RiTorusV(const real MajorRadius, const real MinorRadius, const real PhiMin, const real PhiMax, const real ThetaMax, const parameter_list& Parameters = parameter_list()) = 0;\n\tvirtual void RiTransform(const matrix& Transform) = 0;\n\tvirtual void RiTransformBegin() = 0;\n\tvirtual void RiTransformEnd() = 0;\n\tvirtual void RiTranslate(const real DX, const real DY, const real DZ) = 0;\n\tvirtual void RiTrimCurve(const unsigned_integers& CurveCounts, const unsigned_integers& Orders, const reals& Knots, const reals& Minimums, const reals& Maximums, const unsigned_integers& PointCounts, const reals& U, const reals& V, const reals& W) = 0;\n\tvirtual void RiWorldBegin() = 0;\n\tvirtual void RiWorldEnd() = 0;\n\n\t// New Aqsis-specific calls introduced to support layered shaders\n\t//\n\t/** \\todo Come up with a better way to handle non-standard calls */\n\tvirtual void RiShaderLayerV(const std::string& type, const path& Path, const std::string& name, const std::string& layername, const parameter_list& Parameters = parameter_list()) = 0;\n\t/** \\todo Come up with a better way to handle non-standard calls */\n\tvirtual void RiConnectShaderLayers(const std::string& type, const std::string& layer1, const std::string& variable1, const std::string& layer2, const std::string& variable2) = 0;\n\n\nprotected:\n\tistream() {}\n\tistream(const istream& ) {}\n\tistream& operator=(const istream& ) { return *this; }\n\tvirtual ~istream() {}\n};\n\n/// Provide definitions for the \"standard\" RenderMan tokens\ninline const std::string RI_A() { return \"a\"; }\ninline const std::string RI_ABORT() { return \"abort\"; }\ninline const std::string RI_AMBIENTLIGHT() { return \"ambientlight\"; }\ninline const std::string RI_AMPLITUDE() { return \"amplitude\"; }\ninline const std::string RI_AZ() { return \"az\"; }\ninline const std::string RI_BACKGROUND() { return \"background\"; }\ninline const std::string RI_BEAMDISTRIBUTION() { return \"beamdistribution\"; }\ninline const std::string RI_BICUBIC() { return \"bicubic\"; }\ninline const std::string RI_BILINEAR() { return \"bilinear\"; }\ninline const std::string RI_BLACK() { return \"black\"; }\ninline const std::string RI_BOX() { return \"box\"; }\ninline const std::string RI_BUMPY() { return \"bumpy\"; }\ninline const std::string RI_CAMERA() { return \"camera\"; }\ninline const std::string RI_CATMULL_ROM() { return \"catmull-rom\"; }\ninline const std::string RI_CLAMP() { return \"clamp\"; }\ninline const std::string RI_COMMENT() { return \"comment\"; }\ninline const std::string RI_CONEANGLE() { return \"coneangle\"; }\ninline const std::string RI_CONEDELTAANGLE() { return \"conedeltaangle\"; }\ninline const std::string RI_CONSTANT() { return \"constant\"; }\ninline const std::string RI_CONSTANTWIDTH() { return \"constantwidth\"; }\ninline const std::string RI_CS() { return \"Cs\"; }\ninline const std::string RI_CUBIC() { return \"cubic\"; }\ninline const std::string RI_DEPTHCUE() { return \"depthcue\"; }\ninline const std::string RI_DIFFERENCE() { return \"difference\"; }\ninline const std::string RI_DISTANCE() { return \"distance\"; }\ninline const std::string RI_DISTANTLIGHT() { return \"distantlight\"; }\ninline const std::string RI_FILE() { return \"file\"; }\ninline const std::string RI_FLATNESS() { return \"flatness\"; }\ninline const std::string RI_FOG() { return \"fog\"; }\ninline const std::string RI_FOV() { return \"fov\"; }\ninline const std::string RI_FRAMEBUFFER() { return \"framebuffer\"; }\ninline const std::string RI_FROM() { return \"from\"; }\ninline const std::string RI_GAUSSIAN() { return \"gaussian\"; }\ninline const std::string RI_HANDLER() { return \"handler\"; }\ninline const std::string RI_HIDDEN() { return \"hidden\"; }\ninline const std::string RI_IDENTIFIER() { return \"identifier\"; }\ninline const std::string RI_IGNORE() { return \"ignore\"; }\ninline const std::string RI_INSIDE() { return \"inside\"; }\ninline const std::string RI_INTENSITY() { return \"intensity\"; }\ninline const std::string RI_INTERSECTION() { return \"intersection\"; }\ninline const std::string RI_KA() { return \"Ka\"; }\ninline const std::string RI_KD() { return \"Kd\"; }\ninline const std::string RI_KR() { return \"Kr\"; }\ninline const std::string RI_KS() { return \"Ks\"; }\ninline const std::string RI_LH() { return \"lh\"; }\ninline const std::string RI_LIGHTCOLOR() { return \"lightcolor\"; }\ninline const std::string RI_LINEAR() { return \"linear\"; }\ninline const std::string RI_MATTE() { return \"matte\"; }\ninline const std::string RI_MAXDISTANCE() { return \"maxdistance\"; }\ninline const std::string RI_METAL() { return \"metal\"; }\ninline const std::string RI_MINDISTANCE() { return \"mindistance\"; }\ninline const std::string RI_N() { return \"N\"; }\ninline const std::string RI_NAME() { return \"name\"; }\ninline const std::string RI_NONPERIODIC() { return \"nonperiodic\"; }\ninline const std::string RI_NP() { return \"Np\"; }\ninline const std::string RI_OBJECT() { return \"object\"; }\ninline const std::string RI_ORIGIN() { return \"origin\"; }\ninline const std::string RI_ORTHOGRAPHIC() { return \"orthographic\"; }\ninline const std::string RI_OS() { return \"Os\"; }\ninline const std::string RI_OUTSIDE() { return \"outside\"; }\ninline const std::string RI_P() { return \"P\"; }\ninline const std::string RI_PAINT() { return \"paint\"; }\ninline const std::string RI_PAINTEDPLASTIC() { return \"paintedplastic\"; }\ninline const std::string RI_PERIODIC() { return \"periodic\"; }\ninline const std::string RI_PERSPECTIVE() { return \"perspective\"; }\ninline const std::string RI_PLASTIC() { return \"plastic\"; }\ninline const std::string RI_POINTLIGHT() { return \"pointlight\"; }\ninline const std::string RI_PRIMITIVE() { return \"primitive\"; }\ninline const std::string RI_PRINT() { return \"print\"; }\ninline const std::string RI_PW() { return \"Pw\"; }\ninline const std::string RI_PZ() { return \"Pz\"; }\ninline const std::string RI_RASTER() { return \"raster\"; }\ninline const std::string RI_RGB() { return \"rgb\"; }\ninline const std::string RI_RGBA() { return \"rgba\"; }\ninline const std::string RI_RGBAZ() { return \"rgbaz\"; }\ninline const std::string RI_RGBZ() { return \"rgbz\"; }\ninline const std::string RI_RH() { return \"rh\"; }\ninline const std::string RI_ROUGHNESS() { return \"roughness\"; }\ninline const std::string RI_S() { return \"s\"; }\ninline const std::string RI_SCREEN() { return \"screen\"; }\ninline const std::string RI_SHINYMETAL() { return \"shinymetal\"; }\ninline const std::string RI_SINC() { return \"sinc\"; }\ninline const std::string RI_SMOOTH() { return \"smooth\"; }\ninline const std::string RI_SPECULARCOLOR() { return \"specularcolor\"; }\ninline const std::string RI_SPOTLIGHT() { return \"spotlight\"; }\ninline const std::string RI_ST() { return \"st\"; }\ninline const std::string RI_STRUCTURE() { return \"structure\"; }\ninline const std::string RI_T() { return \"t\"; }\ninline const std::string RI_TEXTURENAME() { return \"texturename\"; }\ninline const std::string RI_TO() { return \"to\"; }\ninline const std::string RI_TRIANGLE() { return \"triangle\"; }\ninline const std::string RI_UNION() { return \"union\"; }\ninline const std::string RI_WIDTH() { return \"width\"; }\ninline const std::string RI_WORLD() { return \"world\"; }\ninline const std::string RI_Z() { return \"z\"; }\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISTREAM_RI_H\n\n"
  },
  {
    "path": "k3dsdk/istreaming_bitmap_source.h",
    "content": "#ifndef K3DSDK_ISTREAMING_BITMAP_SOURCE_H\n#define K3DSDK_ISTREAMING_BITMAP_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n\n#include <boost/version.hpp>\n#if BOOST_VERSION < 106900\n#include <boost/gil/gil_all.hpp>\n#else\n#include <boost/gil.hpp>\n#endif\n\nnamespace k3d\n{\n\nclass inode;\n\n/// Abstract interface for an object that collects and distributes profiling data for the K-3D visualization pipeline\nclass istreaming_bitmap_source :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Defines a standard pixel as floating-point RGBA\n\ttypedef boost::gil::pixel<boost::gil::bits32f, boost::gil::rgba_layout_t> pixel;\n\t/// Defines a standard bitmap as half-precision floating-point RGBA\n\ttypedef boost::gil::image<pixel, false> bitmap;\n\t/// Defines a standard bitmap as half-precision floating-point RGBA\n\ttypedef bitmap::const_view_t bucket;\n\t/// Define storage for a pixel coordinate\n\ttypedef bitmap::coord_t coordinate;\n\n\t/// Connects a slot that will be called when streaming begins\n\tvirtual sigc::connection connect_bitmap_start_signal(const sigc::slot<void, coordinate, coordinate>& Slot) = 0;\n\t/// Connects a slot that will be called when streaming begins\n\tvirtual sigc::connection connect_bitmap_bucket_signal(const sigc::slot<void, coordinate, coordinate, const bucket&>& Slot) = 0;\n\t/// Connects a slot that will be called when streaming finishes\n\tvirtual sigc::connection connect_bitmap_finish_signal(const sigc::slot<void>& Slot) = 0;\n\nprotected:\n\tistreaming_bitmap_source() {}\n\tistreaming_bitmap_source(const istreaming_bitmap_source& Other) : iunknown(Other) {}\n\tistreaming_bitmap_source& operator=(const istreaming_bitmap_source&) { return *this; }\n\tvirtual ~istreaming_bitmap_source() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISTREAMING_BITMAP_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/istring_source.h",
    "content": "#ifndef K3DSDK_ISTRING_SOURCE_H\n#define K3DSDK_ISTRING_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares istring_source, an interface for objects that can act as a source of string values\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for objects that can act as a source of string values\nclass istring_source :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& string_source_output() = 0;\n\nprotected:\n\tistring_source() {}\n\tistring_source(const istring_source&) {}\n\tistring_source& operator=(const istring_source&) { return *this; }\n\tvirtual ~istring_source() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISTRING_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/isurface_shader_ri.h",
    "content": "#ifndef K3DSDK_ISURFACE_SHADER_RI_H\n#define K3DSDK_ISURFACE_SHADER_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares interfaces for rendering within the Pixar RenderMan specification\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nclass render_state;\n\n/// Abstract interface implemented by objects that encapsulate a RenderMan surface shader\nclass isurface_shader :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void setup_renderman_surface_shader(const render_state& State) = 0;\n\nprotected:\n\tisurface_shader() {}\n\tisurface_shader(const isurface_shader&) {}\n\tisurface_shader& operator=(const isurface_shader&) { return *this; }\n\tvirtual ~isurface_shader() {}\n};\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_ISURFACE_SHADER_RI_H\n\n"
  },
  {
    "path": "k3dsdk/itexture.h",
    "content": "#ifndef K3DSDK_ITEXTURE_H\n#define K3DSDK_ITEXTURE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface implemented by objects that can act as geometric surface materials\nclass itexture :\n\tpublic virtual iunknown\n{\nprotected:\n\titexture() {}\n\titexture(const itexture& Other) : iunknown(Other) {}\n\titexture& operator=(const itexture&) { return *this; }\n\tvirtual ~itexture() {}\n};\n\n/// Specialization of difference::test that tests itexture pointers for equality\nnamespace difference\n{\n\ninline void test(itexture* const A, itexture* const B, accumulator& Result)\n{\n\tResult.exact(A == B);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_ITEXTURE_H\n\n"
  },
  {
    "path": "k3dsdk/itexture_ri.h",
    "content": "#ifndef K3DSDK_ITEXTURE_RI_H\n#define K3DSDK_ITEXTURE_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass inetwork_render_frame;\nnamespace filesystem { class path; }\n\t\nnamespace ri\n{\n\nclass istream;\nclass ishader_collection;\nclass render_state;\n\t\n/// Abstract interface implemented by objects that can act as texture sources while drawing RenderMan graphics\nclass itexture :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void setup_renderman_texture(inetwork_render_frame& Frame, istream& Stream, ishader_collection& Shaders) = 0;\n\tvirtual const filesystem::path renderman_texture_path(const render_state& State) = 0;\n\nprotected:\n\titexture() {}\n\titexture(const itexture& ) {}\n\titexture& operator=(const itexture& ) { return *this; }\n\tvirtual ~itexture() {}\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_ITEXTURE_RI_H\n\n"
  },
  {
    "path": "k3dsdk/itime_sink.h",
    "content": "#ifndef K3DSDK_ITIME_SINK_H\n#define K3DSDK_ITIME_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares itime_sink, an interface for objects that can consume time data\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n// Forward declarations\nclass iproperty;\n\n/// Abstract interface for objects that can consume time data\nclass itime_sink :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& time_sink_input() = 0;\n\nprotected:\n\titime_sink() {}\n\titime_sink(const itime_sink&) {}\n\titime_sink& operator=(const itime_sink&) { return *this; }\n\tvirtual ~itime_sink() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ITIME_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/itransform_array_1d.h",
    "content": "#ifndef K3DSDK_ITRANSFORM_ARRAY_1D_H\n#define K3DSDK_ITRANSFORM_ARRAY_1D_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface for a node that defines a 1-dimensional array of transformation matrices\nclass itransform_array_1d :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual const matrix4 get_element(unsigned long Index1, unsigned long Count1) = 0;\n\nprotected:\n\titransform_array_1d() {}\n\titransform_array_1d(const itransform_array_1d&) {}\n\titransform_array_1d& operator = (const itransform_array_1d&) { return *this; }\n\tvirtual ~itransform_array_1d() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ITRANSFORM_ARRAY_1D_H\n\n"
  },
  {
    "path": "k3dsdk/itransform_array_2d.h",
    "content": "#ifndef K3DSDK_ITRANSFORM_ARRAY_2D_H\n#define K3DSDK_ITRANSFORM_ARRAY_2D_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface for a node that defines a 2-dimensional array of transformation matrices\nclass itransform_array_2d :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual const matrix4 get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2) = 0;\n\nprotected:\n\titransform_array_2d() {}\n\titransform_array_2d(const itransform_array_2d&) {}\n\titransform_array_2d& operator = (const itransform_array_2d&) { return *this; }\n\tvirtual ~itransform_array_2d() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ITRANSFORM_ARRAY_2D_H\n\n"
  },
  {
    "path": "k3dsdk/itransform_array_3d.h",
    "content": "#ifndef K3DSDK_ITRANSFORM_ARRAY_3D_H\n#define K3DSDK_ITRANSFORM_ARRAY_3D_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface for a node that defines a 3-dimensional array of transformation matrices\nclass itransform_array_3d :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual const matrix4 get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2, unsigned long Index3, unsigned long Count3) = 0;\n\nprotected:\n\titransform_array_3d() {}\n\titransform_array_3d(const itransform_array_3d&) {}\n\titransform_array_3d& operator = (const itransform_array_3d&) { return *this; }\n\tvirtual ~itransform_array_3d() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_ITRANSFORM_ARRAY_3D_H\n\n"
  },
  {
    "path": "k3dsdk/iunknown.h",
    "content": "#ifndef K3DSDK_IUNKNOWN_H\n#define K3DSDK_IUNKNOWN_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares k3d::iunknown, the base for all other K-3D interface classes\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\n/// Interface from which all other K-3D interfaces derive\nclass iunknown\n{\npublic:\n\tvirtual ~iunknown() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IUNKNOWN_H\n\n"
  },
  {
    "path": "k3dsdk/iuri_handler.h",
    "content": "#ifndef K3DSDK_IURI_HANDLER_H\n#define K3DSDK_IURI_HANDLER_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\n/// Abstract interface for manipulating documents referenced by URI\nclass iuri_handler :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual ~iuri_handler() {}\n\n\t/// Called to display a document in an application (presumably controlled by MIME-TYPE)\n\tvirtual bool open_uri(const string_t& URI) = 0;\n\nprotected:\n\tiuri_handler() {}\n\tiuri_handler(const iuri_handler&) {}\n\tiuri_handler& operator=(const iuri_handler&) { return *this; }\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IURI_HANDLER_H\n\n"
  },
  {
    "path": "k3dsdk/iuser_interface.h",
    "content": "#ifndef K3DSDK_IUSER_INTERFACE_H\n#define K3DSDK_IUSER_INTERFACE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ipath_property.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/keyboard.h>\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/ustring.h>\n\n#include <vector>\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\n\n/// Abstract interface to common graphical-user-interface operations for use by objects\nclass iuser_interface :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Displays a URI in the user's preferred application.\n\tvirtual void open_uri(const string_t& URI) = 0;\n\t/// Displays an informational message.\n\tvirtual void message(const string_t& Message) = 0;\n\t/// Displays a warning message.\n\tvirtual void warning_message(const string_t& Message) = 0;\n\t/// Displays an error message.\n\tvirtual void error_message(const string_t& Message) = 0;\n\t/**\n\t\t \\brief Prompts the user to choose one of several options\n\t\t \\param Message text to be displayed\n\t\t \\param DefaultOption one-based index of the option that is selected by default.  If DefaultOption is 0, no option is selected by default.\n\t\t \\return one-based index of the option selected by the user, or \"0\" if a choice was not made (e.g. user clicked WM \"close\" button)\n\t*/\n\tvirtual uint_t query_message(const string_t& Message, const uint_t DefaultOption, const std::vector<string_t>& Options) = 0;\n\n\t/// Displays an informational \"nag\" message that users can choose to suppress.\n\tvirtual void nag_message(const string_t& Type, const ustring& Message, const ustring& SecondaryMessage = ustring()) = 0;\n\n\t/**\n\t\t\\brief Prompts the user for a filepath, checking for old choices, and storing the current choice for reuse\n\t\t\\param Prompt message to display in the file selection dialog\n\t\t\\param OldPath initial file path to display in the file selection dialog\n\t\t\\param Result returns the chosen file path\n\t\t\\return true iff the user confirms the file path choice, false if they wish to cancel the pending operation\n\t*/\n\tvirtual bool_t get_file_path(const ipath_property::mode_t Mode, const string_t& Type, const string_t& Prompt, const filesystem::path& OldPath, filesystem::path& Result) = 0;\n\n\t/// Displays the given object using a graphical user interface\n\tvirtual bool_t show(iunknown& Object) = 0;\n\n\t/// Runs the user interface loop (if any) until it is synchronized with the current document state\n\tvirtual void synchronize() = 0;\n\n\t/// Returns a connection to a signal that will be emitted at the requested frame rate (could return an empty connection, if the UI doesn't support timers)\n\tvirtual sigc::connection get_timer(const double_t FrameRate, sigc::slot<void> Slot) = 0;\n\t\n\t/// Call a slot whenever given filesystem path is modified.  Note that we are watching the\n\t/// path, not an inode, so it isn't an error to specify a path for a nonexistent file.\n\t/// The slot will be called when a file is created / modified / renamed / deleted at that\n\t/// location.  Returns a nonzero watch identifier that is used to cancel the watch later-on,\n\t/// or 0 if there is an error or the implementation does not support path-watching.\n\tvirtual uint_t watch_path(const filesystem::path& Path, const sigc::slot<void>& Slot) = 0;\n\n\t/// Stop watching the given path.\n\tvirtual void unwatch_path(const uint_t WatchID) = 0;\n\n\nprotected:\n\tiuser_interface() {}\n\tiuser_interface(const iuser_interface&) {}\n\tiuser_interface& operator = (const iuser_interface&) { return *this; }\n\tvirtual ~iuser_interface() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IUSER_INTERFACE_H\n\n"
  },
  {
    "path": "k3dsdk/iuser_property.h",
    "content": "#ifndef K3DSDK_IUSER_PROPERTY_H\n#define K3DSDK_IUSER_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n/// Abstract interface for properties that are custom (user) properties\nclass iuser_property :\n\tpublic virtual iunknown\n{\npublic:\n\nprotected:\n\tiuser_property() {}\n\tiuser_property(const iuser_property& Other) : iunknown(Other) {}\n\tiuser_property& operator=(const iuser_property&) { return *this; }\n\tvirtual ~iuser_property() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IUSER_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/ivector3_source.h",
    "content": "#ifndef K3DSDK_IVECTOR3_SOURCE_H\n#define K3DSDK_IVECTOR3_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares ivector3_source, an interface for objects that can act as a source of vector3 values\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass iproperty;\n\n/// Abstract interface for objects that can act as a source of vector3 values\nclass ivector3_source :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual iproperty& vector3_source_output() = 0;\n\nprotected:\n\tivector3_source() {}\n\tivector3_source(const ivector3_source&) {}\n\tivector3_source& operator=(const ivector3_source&) { return *this; }\n\tvirtual ~ivector3_source() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IVECTOR3_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/ivolume_shader_ri.h",
    "content": "#ifndef K3DSDK_IVOLUME_SHADER_RI_H\n#define K3DSDK_IVOLUME_SHADER_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nclass render_state;\n\n/// Abstract interface implemented by objects that encapsulate a RenderMan volume shader\nclass ivolume_shader :\n\tpublic virtual iunknown\n{\npublic:\n\tvirtual void setup_renderman_atmosphere_shader(const render_state& State) = 0;\n\tvirtual void setup_renderman_interior_shader(const render_state& State) = 0;\n\tvirtual void setup_renderman_exterior_shader(const render_state& State) = 0;\n\nprotected:\n\tivolume_shader() {}\n\tivolume_shader(const ivolume_shader&) {}\n\tivolume_shader& operator=(const ivolume_shader&) { return *this; }\n\tvirtual ~ivolume_shader() {}\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_IVOLUME_SHADER_RI_H\n\n"
  },
  {
    "path": "k3dsdk/iwatched_path_property.h",
    "content": "#ifndef K3DSDK_IWATCHED_PATH_PROPERTY_H\n#define K3DSDK_IWATCHED_PATH_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares iwatched_path_property, an abstract interface for discovering information about a property that stores filesystem paths\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Abstract interface for properties that represent external filesystem resources (typically used to alter presentation)\nclass iwatched_path_property :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Set if the associated path should be watched\n\tvirtual void watch(const bool_t Watch) = 0;\n\t\n\t/// Returns true if the associated path is being watched, false otherwise\n\tvirtual const bool_t is_watched() const = 0;\n\t\nprotected:\n\tiwatched_path_property() {}\n\tiwatched_path_property(const iwatched_path_property&) {}\n\tiwatched_path_property& operator=(const iwatched_path_property&) { return *this; }\n\tvirtual ~iwatched_path_property() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IWATCHED_PATH_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/iwritable_property.h",
    "content": "#ifndef K3DSDK_IWRITABLE_PROPERTY_H\n#define K3DSDK_IWRITABLE_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares iwritable_property, an abstract interface for a name-value pair with fixed type that can be written\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ihint.h>\n#include <boost/any.hpp>\n\nnamespace k3d\n{\n\n/// Abstract interface for a property that can be written (see iproperty if you need to read the value of a property)\nclass iwritable_property :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Sets the property value (note - could fail and return false if there's a type-mismatch or other problem with the input data).  The optional Hint will be passed to observers and can provide additional information about what changed.\n\tvirtual bool property_set_value(const boost::any Value, ihint* const Hint = 0) = 0;\n\nprotected:\n\tiwritable_property() {}\n\tiwritable_property(const iwritable_property& Other) : iunknown(Other) {}\n\tiwritable_property& operator = (const iwritable_property&) { return *this; }\n\tvirtual ~iwritable_property() {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_IWRITABLE_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/k3d-i18n-config.h.in",
    "content": "#ifndef K3DSDK_I18N_CONFIG_H\n#define K3DSDK_I18N_CONFIG_H\n\n// Generated file, do not edit!  Make changes to k3d-i18n-config.h.in instead.\n\n#cmakedefine K3D_ENABLE_NLS\n\n#ifdef K3D_ENABLE_NLS\n\n\t#include <libintl.h>\n\t#define _(String) gettext(String)\n\n#else // K3D_ENABLE_NLS\n\n\t#define _(String) (String)\n\n#endif // !K3D_ENABLE_NLS\n\n#endif // K3DSDK_I18N_CONFIG_H\n\n"
  },
  {
    "path": "k3dsdk/k3d-ngui-config.h.in",
    "content": "#ifndef K3DSDK_NGUI_CONFIG_H\n#define K3DSDK_NGUI_CONFIG_H\n\n// Generated file, do not edit!  Make changes to k3d-ngui-config.h.in instead.\n\n#cmakedefine K3D_BUILD_NGUI_MODULE\n\n#endif // !K3DSDK_NGUI_CONFIG_H\n\n"
  },
  {
    "path": "k3dsdk/k3d-parallel-config.h.in",
    "content": "#ifndef K3DSDK_PARALLEL_CONFIG_H\n#define K3DSDK_PARALLEL_CONFIG_H\n\n// Generated file, do not edit!  Make changes to k3d-parallel-config.h.in instead.\n\n#cmakedefine K3D_ENABLE_PARALLEL \n\n#endif // !K3DSDK_PARALLEL_CONFIG_H\n\n"
  },
  {
    "path": "k3dsdk/k3d-platform-config.h.in",
    "content": "#ifndef K3DSDK_PLATFORM_CONFIG_H\n#define K3DSDK_PLATFORM_CONFIG_H\n\n// Generated file, do not edit!  Make changes to k3d-platform-config.h.in instead.\n\n#cmakedefine K3D_COMPILER_GCC\n#cmakedefine K3D_COMPILER_MSVC\n\n#cmakedefine K3D_API_WIN32\n#cmakedefine K3D_API_DARWIN\n\n#cmakedefine K3D_ENABLE_SYMBOL_VISIBILITY\n\n#cmakedefine K3D_UINT_T_32_BITS\n#cmakedefine K3D_UINT_T_64_BITS\n\n#define K3D_GLEW_MAJOR_VERSION @K3D_GLEW_MAJOR_VERSION@\n\n#define K3D_OSX_MAJOR_VERSION @K3D_OSX_MAJOR_VERSION@\n#define K3D_OSX_MINOR_VERSION @K3D_OSX_MINOR_VERSION@\n\n#if defined K3D_COMPILER_GCC\n\t#define K3D_COMPILER_NAME __VERSION__\n#elif defined K3D_COMPILER_MSVC\n\t#define K3D_COMPILER_NAME \"Visual Studio \" #_MSC_VER\n#else\n\t#error(\"Unknown compiler\")\n#endif\n\n#endif // !K3DSDK_PLATFORM_CONFIG_H\n"
  },
  {
    "path": "k3dsdk/k3d-version-config.h.in",
    "content": "#ifndef K3DSDK_VERSION_CONFIG_H\n#define K3DSDK_VERSION_CONFIG_H\n\n// Generated file, do not edit!  Make changes to k3d-version-config.h.in instead.\n\n#define K3D_PACKAGE \"@K3D_PACKAGE@\"\n#define K3D_COPYRIGHT \"@K3D_COPYRIGHT@\"\n#define K3D_VERSION \"@K3D_VERSION@\"\n#define K3D_HOST \"@K3D_HOST@\"\n\n#endif // !K3DSDK_VERSION_CONFIG_H\n\n"
  },
  {
    "path": "k3dsdk/keyboard.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/keyboard.h>\n#include <iostream>\n\nnamespace k3d\n{\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n// key_modifiers\n\nkey_modifiers& key_modifiers::set() { m_storage.set(); return *this; }\nkey_modifiers& key_modifiers::set_shift(bool val) { m_storage.set(0, val); return *this; }\nkey_modifiers& key_modifiers::set_lock(bool val) { m_storage.set(1, val); return *this; }\nkey_modifiers& key_modifiers::set_control(bool val) { m_storage.set(2, val); return *this; }\nkey_modifiers& key_modifiers::set_mod1(bool val) { m_storage.set(3, val); return *this; }\nkey_modifiers& key_modifiers::set_mod2(bool val) { m_storage.set(4, val); return *this; }\nkey_modifiers& key_modifiers::set_mod3(bool val) { m_storage.set(5, val); return *this; }\nkey_modifiers& key_modifiers::set_mod4(bool val) { m_storage.set(6, val); return *this; }\nkey_modifiers& key_modifiers::set_mod5(bool val) { m_storage.set(7, val); return *this; }\nkey_modifiers& key_modifiers::set_button1(bool val) { m_storage.set(8, val); return *this; }\nkey_modifiers& key_modifiers::set_button2(bool val) { m_storage.set(9, val); return *this; }\nkey_modifiers& key_modifiers::set_button3(bool val) { m_storage.set(10, val); return *this; }\nkey_modifiers& key_modifiers::set_button4(bool val) { m_storage.set(11, val); return *this; }\nkey_modifiers& key_modifiers::set_button5(bool val) { m_storage.set(12, val); return *this; }\nkey_modifiers& key_modifiers::set_release(bool val) { m_storage.set(13, val); return *this; }\n\nkey_modifiers& key_modifiers::reset() { m_storage.reset(); return *this; }\nkey_modifiers& key_modifiers::reset_shift() { m_storage.reset(0); return *this; }\nkey_modifiers& key_modifiers::reset_lock() { m_storage.reset(1); return *this; }\nkey_modifiers& key_modifiers::reset_control() { m_storage.reset(2); return *this; }\nkey_modifiers& key_modifiers::reset_mod1() { m_storage.reset(3); return *this; }\nkey_modifiers& key_modifiers::reset_mod2() { m_storage.reset(4); return *this; }\nkey_modifiers& key_modifiers::reset_mod3() { m_storage.reset(5); return *this; }\nkey_modifiers& key_modifiers::reset_mod4() { m_storage.reset(6); return *this; }\nkey_modifiers& key_modifiers::reset_mod5() { m_storage.reset(7); return *this; }\nkey_modifiers& key_modifiers::reset_button1() { m_storage.reset(8); return *this; }\nkey_modifiers& key_modifiers::reset_button2() { m_storage.reset(9); return *this; }\nkey_modifiers& key_modifiers::reset_button3() { m_storage.reset(10); return *this; }\nkey_modifiers& key_modifiers::reset_button4() { m_storage.reset(11); return *this; }\nkey_modifiers& key_modifiers::reset_button5() { m_storage.reset(12); return *this; }\nkey_modifiers& key_modifiers::reset_release() { m_storage.reset(13); return *this; }\n\nkey_modifiers& key_modifiers::flip() { m_storage.flip(); return *this; }\nkey_modifiers& key_modifiers::flip_shift() { m_storage.set(0); return *this; }\nkey_modifiers& key_modifiers::flip_lock() { m_storage.set(1); return *this; }\nkey_modifiers& key_modifiers::flip_control() { m_storage.flip(2); return *this; }\nkey_modifiers& key_modifiers::flip_mod1() { m_storage.flip(3); return *this; }\nkey_modifiers& key_modifiers::flip_mod2() { m_storage.flip(4); return *this; }\nkey_modifiers& key_modifiers::flip_mod3() { m_storage.flip(5); return *this; }\nkey_modifiers& key_modifiers::flip_mod4() { m_storage.flip(6); return *this; }\nkey_modifiers& key_modifiers::flip_mod5() { m_storage.flip(7); return *this; }\nkey_modifiers& key_modifiers::flip_button1() { m_storage.flip(8); return *this; }\nkey_modifiers& key_modifiers::flip_button2() { m_storage.flip(9); return *this; }\nkey_modifiers& key_modifiers::flip_button3() { m_storage.flip(10); return *this; }\nkey_modifiers& key_modifiers::flip_button4() { m_storage.flip(11); return *this; }\nkey_modifiers& key_modifiers::flip_button5() { m_storage.flip(12); return *this; }\nkey_modifiers& key_modifiers::flip_release() { m_storage.flip(13); return *this; }\n\nbool key_modifiers::any() const { return m_storage.any(); }\nbool key_modifiers::none() const { return m_storage.none(); }\nbool key_modifiers::shift() const { return m_storage[0]; }\nbool key_modifiers::lock() const { return m_storage[1]; }\nbool key_modifiers::control() const { return m_storage[2]; }\nbool key_modifiers::mod1() const { return m_storage[3]; }\nbool key_modifiers::mod2() const { return m_storage[4]; }\nbool key_modifiers::mod3() const { return m_storage[5]; }\nbool key_modifiers::mod4() const { return m_storage[6]; }\nbool key_modifiers::mod5() const { return m_storage[7]; }\nbool key_modifiers::button1() const { return m_storage[8]; }\nbool key_modifiers::button2() const { return m_storage[9]; }\nbool key_modifiers::button3() const { return m_storage[10]; }\nbool key_modifiers::button4() const { return m_storage[11]; }\nbool key_modifiers::button5() const { return m_storage[12]; }\nbool key_modifiers::release() const { return m_storage[13]; }\n\nbool key_modifiers::operator==(const key_modifiers& RHS) const { return m_storage == RHS.m_storage; }\nbool key_modifiers::operator!=(const key_modifiers& RHS) const { return m_storage != RHS.m_storage; }\nbool key_modifiers::operator<(const key_modifiers& RHS) const { return m_storage.to_ulong() < RHS.m_storage.to_ulong(); }\n\nkey_modifiers& key_modifiers::operator&=(const key_modifiers& RHS) { m_storage &= RHS.m_storage; return *this; }\nkey_modifiers& key_modifiers::operator|=(const key_modifiers& RHS) { m_storage |= RHS.m_storage; return *this; }\n\nconst key_modifiers operator&(const key_modifiers& LHS, const key_modifiers& RHS) { key_modifiers temp(LHS); temp &= RHS; return temp; }\nconst key_modifiers operator|(const key_modifiers& LHS, const key_modifiers& RHS) { key_modifiers temp(LHS); temp |= RHS; return temp; }\n\nnamespace\n{\n\nvoid save_state(std::ostream& Stream, const std::string& Serialized, const bool State, bool& AnySoFar)\n{\n\tif(!State)\n\t\treturn;\n\t\t\n\tif(AnySoFar)\n\t\tStream << \"+\";\n\t\t\n\tStream << Serialized;\n\tAnySoFar = true;\n}\n\n} // namespace\n\nstd::ostream& operator<<(std::ostream& Stream, const k3d::key_modifiers& RHS)\n{\n\tbool any_so_far = false;\n\tsave_state(Stream, \"shift\", RHS.shift(), any_so_far);\n\tsave_state(Stream, \"lock\", RHS.lock(), any_so_far);\n\tsave_state(Stream, \"control\", RHS.control(), any_so_far);\n\tsave_state(Stream, \"mod1\", RHS.mod1(), any_so_far);\n\tsave_state(Stream, \"mod2\", RHS.mod2(), any_so_far);\n\tsave_state(Stream, \"mod3\", RHS.mod3(), any_so_far);\n\tsave_state(Stream, \"mod4\", RHS.mod4(), any_so_far);\n\tsave_state(Stream, \"mod5\", RHS.mod5(), any_so_far);\n\tsave_state(Stream, \"button1\", RHS.button1(), any_so_far);\n\tsave_state(Stream, \"button2\", RHS.button2(), any_so_far);\n\tsave_state(Stream, \"button3\", RHS.button3(), any_so_far);\n\tsave_state(Stream, \"button4\", RHS.button4(), any_so_far);\n\tsave_state(Stream, \"button5\", RHS.button5(), any_so_far);\n\tsave_state(Stream, \"release\", RHS.release(), any_so_far);\n\t\n\tif(!any_so_far)\n\t\tStream << \"none\";\n\t\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, k3d::key_modifiers& RHS)\n{\n\tRHS.reset();\n\n\tstd::string buffer;\n\tStream >> buffer;\n\t\n\tRHS.set_shift(buffer.find(\"shift\") != std::string::npos);\n\tRHS.set_lock(buffer.find(\"lock\") != std::string::npos);\n\tRHS.set_control(buffer.find(\"control\") != std::string::npos);\n\tRHS.set_mod1(buffer.find(\"mod1\") != std::string::npos);\n\tRHS.set_mod2(buffer.find(\"mod2\") != std::string::npos);\n\tRHS.set_mod3(buffer.find(\"mod3\") != std::string::npos);\n\tRHS.set_mod4(buffer.find(\"mod4\") != std::string::npos);\n\tRHS.set_mod5(buffer.find(\"mod5\") != std::string::npos);\n\tRHS.set_button1(buffer.find(\"button1\") != std::string::npos);\n\tRHS.set_button2(buffer.find(\"button2\") != std::string::npos);\n\tRHS.set_button3(buffer.find(\"button3\") != std::string::npos);\n\tRHS.set_button4(buffer.find(\"button4\") != std::string::npos);\n\tRHS.set_button5(buffer.find(\"button5\") != std::string::npos);\n\tRHS.set_release(buffer.find(\"release\") != std::string::npos);\n\t\n\treturn Stream;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/keyboard.h",
    "content": "#ifndef K3DSDK_KEYBOARD_H\n#define K3DSDK_KEYBOARD_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/signal_accumulators.h>\n#include <k3dsdk/signal_system.h>\n\n#include <bitset>\n#include <iosfwd>\n\nnamespace k3d\n{\n\nclass key_modifiers\n{\npublic:\n\tkey_modifiers& set();\n\tkey_modifiers& set_shift(bool val = true);\n\tkey_modifiers& set_lock(bool val = true);\n\tkey_modifiers& set_control(bool val = true);\n\tkey_modifiers& set_mod1(bool val = true);\n\tkey_modifiers& set_mod2(bool val = true);\n\tkey_modifiers& set_mod3(bool val = true);\n\tkey_modifiers& set_mod4(bool val = true);\n\tkey_modifiers& set_mod5(bool val = true);\n\tkey_modifiers& set_button1(bool val = true);\n\tkey_modifiers& set_button2(bool val = true);\n\tkey_modifiers& set_button3(bool val = true);\n\tkey_modifiers& set_button4(bool val = true);\n\tkey_modifiers& set_button5(bool val = true);\n\tkey_modifiers& set_release(bool val = true);\n\t\n\tkey_modifiers& reset();\n\tkey_modifiers& reset_shift();\n\tkey_modifiers& reset_lock();\n\tkey_modifiers& reset_control();\n\tkey_modifiers& reset_mod1();\n\tkey_modifiers& reset_mod2();\n\tkey_modifiers& reset_mod3();\n\tkey_modifiers& reset_mod4();\n\tkey_modifiers& reset_mod5();\n\tkey_modifiers& reset_button1();\n\tkey_modifiers& reset_button2();\n\tkey_modifiers& reset_button3();\n\tkey_modifiers& reset_button4();\n\tkey_modifiers& reset_button5();\n\tkey_modifiers& reset_release();\n\t\n\tkey_modifiers& flip();\n\tkey_modifiers& flip_shift();\n\tkey_modifiers& flip_lock();\n\tkey_modifiers& flip_control();\n\tkey_modifiers& flip_mod1();\n\tkey_modifiers& flip_mod2();\n\tkey_modifiers& flip_mod3();\n\tkey_modifiers& flip_mod4();\n\tkey_modifiers& flip_mod5();\n\tkey_modifiers& flip_button1();\n\tkey_modifiers& flip_button2();\n\tkey_modifiers& flip_button3();\n\tkey_modifiers& flip_button4();\n\tkey_modifiers& flip_button5();\n\tkey_modifiers& flip_release();\n\n\tbool any() const;\n\tbool none() const;\n\tbool shift() const;\n\tbool lock() const;\n\tbool control() const;\n\tbool mod1() const;\n\tbool mod2() const;\n\tbool mod3() const;\n\tbool mod4() const;\n\tbool mod5() const;\n\tbool button1() const;\n\tbool button2() const;\n\tbool button3() const;\n\tbool button4() const;\n\tbool button5() const;\n\tbool release() const;\n\n\tbool operator==(const key_modifiers& RHS) const;\n\tbool operator!=(const key_modifiers& RHS) const;\n\tbool operator<(const key_modifiers& RHS) const;\n\t\n\tkey_modifiers& operator&=(const key_modifiers& RHS);\n\tkey_modifiers& operator|=(const key_modifiers& RHS);\n\n\tfriend const key_modifiers operator&(const key_modifiers& LHS, const key_modifiers& RHS);\n\tfriend const key_modifiers operator|(const key_modifiers& LHS, const key_modifiers& RHS);\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const k3d::key_modifiers& RHS);\n\tfriend std::istream& operator>>(std::istream& Stream, k3d::key_modifiers& RHS);\n\nprivate:\n\tstd::bitset<14> m_storage;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_KEYBOARD_H\n"
  },
  {
    "path": "k3dsdk/line2.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/line2.h>\n#include <k3dsdk/vectors.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// line2\n\nline2::line2(const vector2& Direction, const point2& Point) :\n\tdirection(Direction),\n\tpoint(Point)\n{\n}\n\nline2::line2(const point2& Point1, const point2& Point2) :\n\tdirection(Point2 - Point1),\n\tpoint(Point1)\n{\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/line2.h",
    "content": "#ifndef K3DSDK_LINE2_H\n#define K3DSDK_LINE2_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/point2.h>\n#include <k3dsdk/vector2.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// line2\n\n/// Encapsulates a 2D line\nclass line2\n{\npublic:\n\t/// Constructs a line from its direction vector and a point on the line\n\tline2(const vector2& Direction, const point2& Point);\n\t/// Constructs a line from two points on the line\n\tline2(const point2& Point1, const point2& Point2);\n\n\t/// Stores the line's direction vector\n\tvector2 direction;\n\t/// Stores a point on the line\n\tpoint2 point;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_LINE2_H\n\n"
  },
  {
    "path": "k3dsdk/line3.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/line3.h>\n#include <k3dsdk/vectors.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// line3\n\nline3::line3(const vector3& Direction, const point3& Point) :\n\tdirection(Direction),\n\tpoint(Point)\n{\n}\n\nline3::line3(const point3& Point1, const point3& Point2) :\n\tdirection(Point2 - Point1),\n\tpoint(Point1)\n{\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/line3.h",
    "content": "#ifndef K3DSDK_LINE3_H\n#define K3DSDK_LINE3_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/point3.h>\n#include <k3dsdk/vector3.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// line3\n\n/// Encapsulates a 3D line\nclass line3\n{\npublic:\n\t/// Constructs a line from its direction vector and a point on the line\n\tline3(const vector3& Direction, const point3& Point);\n\t/// Constructs a line from two points on the line\n\tline3(const point3& Point1, const point3& Point2);\n\n\t/// Stores the line's direction vector\n\tvector3 direction;\n\t/// Stores a point on the line\n\tpoint3 point;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_LINE3_H\n\n"
  },
  {
    "path": "k3dsdk/linear_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\n#include <numeric>\n\nnamespace k3d\n{\n\nnamespace linear_curve\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::bools_t& Periodic,\n\tconst mesh::materials_t& Material,\n\tconst mesh::indices_t& CurveFirstPoints,\n\tconst mesh::counts_t& CurvePointCounts,\n\tconst mesh::selection_t& CurveSelections,\n\tconst mesh::indices_t& CurvePoints,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& CurveAttributes,\n\tconst mesh::table_t& ParameterAttributes,\n\tconst mesh::table_t& VertexAttributes\n\t\t) :\n\tperiodic(Periodic),\n\tmaterial(Material),\n\tcurve_first_points(CurveFirstPoints),\n\tcurve_point_counts(CurvePointCounts),\n\tcurve_selections(CurveSelections),\n\tcurve_points(CurvePoints),\n\tconstant_attributes(ConstantAttributes),\n\tcurve_attributes(CurveAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::bools_t& Periodic,\n\tmesh::materials_t& Material,\n\tmesh::indices_t& CurveFirstPoints,\n\tmesh::counts_t& CurvePointCounts,\n\tmesh::selection_t& CurveSelections,\n\tmesh::indices_t& CurvePoints,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& CurveAttributes,\n\tmesh::table_t& ParameterAttributes,\n\tmesh::table_t& VertexAttributes\n\t\t) :\n\tperiodic(Periodic),\n\tmaterial(Material),\n\tcurve_first_points(CurveFirstPoints),\n\tcurve_point_counts(CurvePointCounts),\n\tcurve_selections(CurveSelections),\n\tcurve_points(CurvePoints),\n\tconstant_attributes(ConstantAttributes),\n\tcurve_attributes(CurveAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"linear_curve\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"constant\"].create<mesh::bools_t>(\"periodic\"),\n\t\tgeneric_primitive.structure[\"constant\"].create<mesh::materials_t>(\"material\"),\n\t\tgeneric_primitive.structure[\"curve\"].create<mesh::indices_t >(\"curve_first_points\"),\n\t\tgeneric_primitive.structure[\"curve\"].create<mesh::counts_t >(\"curve_point_counts\"),\n\t\tgeneric_primitive.structure[\"curve\"].create<mesh::selection_t>(\"curve_selections\"),\n\t\tgeneric_primitive.structure[\"vertex\"].create<mesh::indices_t >(\"curve_points\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"curve\"],\n\t\tgeneric_primitive.attributes[\"parameter\"],\n\t\tgeneric_primitive.attributes[\"vertex\"]\n\t\t);\n\n\tresult->curve_selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\tresult->curve_points.set_metadata_value(metadata::key::domain(), metadata::value::point_indices_domain());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"linear_curve\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& constant_structure = require_structure(Primitive, \"constant\");\n\t\tconst mesh::table_t& curve_structure = require_structure(Primitive, \"curve\");\n\t\tconst mesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& curve_attributes = require_attributes(Primitive, \"curve\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tconst mesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tconst mesh::bools_t& periodic = require_array<mesh::bools_t>(Primitive, constant_structure, \"periodic\");\n\t\tconst mesh::materials_t& material = require_array<mesh::materials_t>(Primitive, constant_structure, \"material\");\n\t\tconst mesh::indices_t& curve_first_points = require_array<mesh::indices_t>(Primitive, curve_structure, \"curve_first_points\");\n\t\tconst mesh::counts_t& curve_point_counts = require_array<mesh::counts_t>(Primitive, curve_structure, \"curve_point_counts\");\n\t\tconst mesh::selection_t& curve_selections = require_array<mesh::selection_t>(Primitive, curve_structure, \"curve_selections\");\n\t\tconst mesh::indices_t& curve_points = require_array<mesh::indices_t>(Primitive, vertex_structure, \"curve_points\");\n\n\t\trequire_metadata(Primitive, curve_selections, \"curve_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, curve_points, \"curve_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", std::accumulate(curve_point_counts.begin(), curve_point_counts.end(), 0));\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", curve_structure.row_count() * 2);\n\n\t\treturn new const_primitive(periodic, material, curve_first_points, curve_point_counts, curve_selections, curve_points, constant_attributes, curve_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"linear_curve\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& constant_structure = require_structure(Primitive, \"constant\");\n\t\tmesh::table_t& curve_structure = require_structure(Primitive, \"curve\");\n\t\tmesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& curve_attributes = require_attributes(Primitive, \"curve\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tmesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tmesh::bools_t& periodic = require_array<mesh::bools_t>(Primitive, constant_structure, \"periodic\");\n\t\tmesh::materials_t& material = require_array<mesh::materials_t>(Primitive, constant_structure, \"material\");\n\t\tmesh::indices_t& curve_first_points = require_array<mesh::indices_t>(Primitive, curve_structure, \"curve_first_points\");\n\t\tmesh::counts_t& curve_point_counts = require_array<mesh::counts_t>(Primitive, curve_structure, \"curve_point_counts\");\n\t\tmesh::selection_t& curve_selections = require_array<mesh::selection_t>(Primitive, curve_structure, \"curve_selections\");\n\t\tmesh::indices_t& curve_points = require_array<mesh::indices_t>(Primitive, vertex_structure, \"curve_points\");\n\n\t\trequire_metadata(Primitive, curve_selections, \"curve_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, curve_points, \"curve_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", std::accumulate(curve_point_counts.begin(), curve_point_counts.end(), 0));\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", curve_structure.row_count() * 2);\n\n\t\treturn new primitive(periodic, material, curve_first_points, curve_point_counts, curve_selections, curve_points, constant_attributes, curve_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"linear_curve\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace linear_curve\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/linear_curve.h",
    "content": "#ifndef K3DSDK_LINEAR_CURVE_H\n#define K3DSDK_LINEAR_CURVE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace linear_curve\n{\n\n/// Gathers the member arrays of a linear_curve primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::bools_t& Periodic,\n\t\tconst mesh::materials_t& Material,\n\t\tconst mesh::indices_t& CurveFirstPoints,\n\t\tconst mesh::counts_t& CurvePointCounts,\n\t\tconst mesh::selection_t& CurveSelections,\n\t\tconst mesh::indices_t& CurvePoints,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& CurveAttributes,\n\t\tconst mesh::table_t& ParameterAttributes,\n\t\tconst mesh::table_t& VertexAttributes\n\t\t);\n\n\tconst mesh::bools_t& periodic;\n\tconst mesh::materials_t& material;\n\tconst mesh::indices_t& curve_first_points;\n\tconst mesh::counts_t& curve_point_counts;\n\tconst mesh::selection_t& curve_selections;\n\tconst mesh::indices_t& curve_points;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& curve_attributes;\n\tconst mesh::table_t& parameter_attributes;\n\tconst mesh::table_t& vertex_attributes;\n};\n\n/// Gathers the member arrays of a linear_curve primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::bools_t& Periodic,\n\t\tmesh::materials_t& Material,\n\t\tmesh::indices_t& CurveFirstPoints,\n\t\tmesh::counts_t& CurvePointCounts,\n\t\tmesh::selection_t& CurveSelections,\n\t\tmesh::indices_t& CurvePoints,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& CurveAttributes,\n\t\tmesh::table_t& ParameterAttributes,\n\t\tmesh::table_t& VertexAttributes\n\t\t);\n\n\tmesh::bools_t& periodic;\n\tmesh::materials_t& material;\n\tmesh::indices_t& curve_first_points;\n\tmesh::counts_t& curve_point_counts;\n\tmesh::selection_t& curve_selections;\n\tmesh::indices_t& curve_points;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& curve_attributes;\n\tmesh::table_t& parameter_attributes;\n\tmesh::table_t& vertex_attributes;\n};\n\n/// Creates a new linear_curve mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid linear_curve primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid linear_curve primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid linear_curve primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace linear_curve\n\n} // namespace k3d\n\n#endif // !K3DSDK_LINEAR_CURVE_H\n\n"
  },
  {
    "path": "k3dsdk/log.cpp",
    "content": "// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/log_control.h>\n#include <k3d-platform-config.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/system.h>\n\n#include <cstdlib>\n#include <fstream>\n#include <iostream>\n#include <sstream>\n#include <vector>\n\n#ifdef K3D_API_WIN32\n\n\t#include <time.h>\n\t#include <k3dsdk/win32.h>\n\n#elif defined K3D_API_DARWIN\n\n\t#include <syslog.h>\n\n#else\n\n\t#include <syslog.h>\n\t#include <execinfo.h>\n\n#endif\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\n///////////////////////////////////////////////////////////\n// log_level_index\n\nint log_level_index()\n{\n\tstatic int index = std::ios::xalloc();\n\treturn index;\n}\n\n///////////////////////////////////////////////////////////\n// log_level\n\nlong& log_level(std::ostream& Stream)\n{\n\treturn Stream.iword(log_level_index());\n}\n\nbool g_log_show_timestamp = false;\nstd::string g_log_tag;\nbool g_log_color_level = false;\nbool g_log_show_level = false;\nbool g_log_syslog = false;\nint g_log_minimum_level = K3D_LOG_LEVEL_WARNING;\n\nstd::vector<time_t> g_log_timestamp_cache;\nstd::vector<log_level_t> g_log_level_cache;\nstd::vector<std::string> g_log_message_cache;\n\n///////////////////////////////////////////////////////////\n// log_cerr\n\nvoid log_cerr(const time_t Timestamp, const log_level_t Level, const std::string& Message)\n{\n\tif(Level > g_log_minimum_level)\n\t\treturn;\n\n\tif(g_log_show_timestamp)\n\t{\n\t\tstd::string buffer(256, '\\0');\n\t\tbuffer.resize(strftime(&buffer[0], buffer.size(), \"%m/%d/%Y %H:%M:%S \", localtime(&Timestamp)));\n\t\tstd::cerr << buffer;\n\t}\n\n\tif(!g_log_tag.empty())\n\t{\n\t\tstd::cerr << g_log_tag;\n\t}\n\n\tif(g_log_color_level)\n\t{\n\t\tswitch(Level)\n\t\t{\n\t\t\tcase K3D_LOG_LEVEL_CRITICAL:\n\t\t\t\tstd::cerr << \"\\e[1;31m\";\n\t\t\t\tbreak;\n\t\t\tcase K3D_LOG_LEVEL_ERROR:\n\t\t\t\tstd::cerr << \"\\e[1;31m\";\n\t\t\t\tbreak;\n\t\t\tcase K3D_LOG_LEVEL_WARNING:\n\t\t\t\tstd::cerr << \"\\e[1;33m\";\n\t\t\t\tbreak;\n\t\t\tcase K3D_LOG_LEVEL_INFO:\n\t\t\t\tstd::cerr << \"\\e[0m\";\n\t\t\t\tbreak;\n\t\t\tcase K3D_LOG_LEVEL_DEBUG:\n\t\t\t\tstd::cerr << \"\\e[1;32m\";\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif(g_log_show_level)\n\t{\n\t\tswitch(Level)\n\t\t{\n\t\t\tcase K3D_LOG_LEVEL_CRITICAL:\n\t\t\t\tstd::cerr << \"CRITICAL: \";\n\t\t\t\tbreak;\n\t\t\tcase K3D_LOG_LEVEL_ERROR:\n\t\t\t\tstd::cerr << \"ERROR: \";\n\t\t\t\tbreak;\n\t\t\tcase K3D_LOG_LEVEL_WARNING:\n\t\t\t\tstd::cerr << \"WARNING: \";\n\t\t\t\tbreak;\n\t\t\tcase K3D_LOG_LEVEL_INFO:\n\t\t\t\tstd::cerr << \"INFO: \";\n\t\t\t\tbreak;\n\t\t\tcase K3D_LOG_LEVEL_DEBUG:\n\t\t\t\tstd::cerr << \"DEBUG: \";\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tstd::cerr << Message;\n\n\tif(g_log_color_level)\n\t{\n\t\tstd::cerr << \"\\e[0m\";\n\t}\n\n\tstd::cerr << std::flush;\n}\n\n///////////////////////////////////////////////////////////\n// log_file\n\nvoid log_file(const time_t Timestamp, const log_level_t Level, const std::string& Message)\n{\n  static std::ofstream logfile((system::get_home_directory() / k3d::filesystem::generic_path(\".k3d\") / k3d::filesystem::generic_path(\"k3d.log\")).native_filesystem_string().c_str());\n  if(Level > g_log_minimum_level)\n    return;\n\n  if(g_log_show_timestamp)\n  {\n    std::string buffer(256, '\\0');\n    buffer.resize(strftime(&buffer[0], buffer.size(), \"%m/%d/%Y %H:%M:%S \", localtime(&Timestamp)));\n    logfile << buffer;\n  }\n\n  if(!g_log_tag.empty())\n  {\n    logfile << g_log_tag;\n  }\n\n  if(g_log_show_level)\n  {\n    switch(Level)\n    {\n      case K3D_LOG_LEVEL_CRITICAL:\n        logfile << \"CRITICAL: \";\n        break;\n      case K3D_LOG_LEVEL_ERROR:\n        logfile << \"ERROR: \";\n        break;\n      case K3D_LOG_LEVEL_WARNING:\n        logfile << \"WARNING: \";\n        break;\n      case K3D_LOG_LEVEL_INFO:\n        logfile << \"INFO: \";\n        break;\n      case K3D_LOG_LEVEL_DEBUG:\n        logfile << \"DEBUG: \";\n        break;\n    }\n  }\n\n  logfile << Message;\n\n  logfile << std::flush;\n}\n\n///////////////////////////////////////////////////////////\n// log_cache\n\nvoid log_cache(const time_t Timestamp, const log_level_t Level, const std::string& Message)\n{\n\tg_log_timestamp_cache.push_back(Timestamp);\n\tg_log_level_cache.push_back(Level);\n\tg_log_message_cache.push_back(Message);\n}\n\n///////////////////////////////////////////////////////////\n// log_syslog\n\n#ifndef K3D_API_WIN32\n\nvoid log_syslog(const time_t, const log_level_t Level, const std::string& Message)\n{\n\tif(!g_log_syslog)\n\t\treturn;\n\n\tint priority = LOG_INFO;\n\n\tswitch(Level)\n\t{\n\t\tcase K3D_LOG_LEVEL_CRITICAL:\n\t\t\tpriority = LOG_CRIT;\n\t\t\tbreak;\n\t\tcase K3D_LOG_LEVEL_ERROR:\n\t\t\tpriority = LOG_ERR;\n\t\t\tbreak;\n\t\tcase K3D_LOG_LEVEL_WARNING:\n\t\t\tpriority = LOG_WARNING;\n\t\t\tbreak;\n\t\tcase K3D_LOG_LEVEL_INFO:\n\t\t\tpriority = LOG_INFO;\n\t\t\tbreak;\n\t\tcase K3D_LOG_LEVEL_DEBUG:\n\t\t\tpriority = LOG_DEBUG;\n\t\t\tbreak;\n\t}\n\n\tsyslog(LOG_USER | priority, \"%s\", Message.c_str());\n}\n\n#endif // !K3D_API_WIN32\n\n///////////////////////////////////////////////////////////\n// log_output_debug_string\n\n#ifdef K3D_API_WIN32\n\nvoid log_output_debug_string(const time_t Timestamp, const log_level_t Level, const std::string& Message)\n{\n\tOutputDebugString((Message).c_str());\n}\n\n#endif // !K3D_API_WIN32\n\n///////////////////////////////////////////////////////////\n// signal_buf\n\n/// When attached to an output stream, emits a signal containing each line of output\nclass signal_buf :\n\tpublic std::streambuf\n{\npublic:\n\tsignal_buf() :\n\t\tm_stream(0)\n\t{\n\t\tconnect(sigc::ptr_fun(log_cerr));\n\t\tconnect(sigc::ptr_fun(log_cache));\n    connect(sigc::ptr_fun(log_file));\n\n#ifdef K3D_API_WIN32\n\t\tconnect(sigc::ptr_fun(log_output_debug_string));\n#else // K3D_API_WIN32\n\t\tconnect(sigc::ptr_fun(log_syslog));\n#endif // !K3D_API_WIN32\n\t}\n\n\tvoid init(std::ostream& Stream)\n\t{\n\t\tm_stream = &Stream;\n\t}\n\n\tsigc::connection connect(const sigc::slot<void, const time_t, const log_level_t, const std::string&>& Slot)\n\t{\n\t\treturn m_signal.connect(Slot);\n\t}\n\nprotected:\n\tint overflow(int c)\n\t{\n\t\tif(traits_type::eq_int_type(c, traits_type::eof()))\n\t\t\treturn traits_type::eof();\n\n\t\tm_buffer.push_back(c);\n\n\t\tif(c == '\\n')\n\t\t{\n\t\t\tconst time_t current_time = time(0);\n\t\t\tconst log_level_t current_log_level = static_cast<log_level_t>(log_level(*m_stream));\n\n\t\t\tm_signal.emit(current_time, current_log_level, m_buffer);\n\t\t\tm_buffer.clear();\n\n\t\t\tlog_level(*m_stream) = 0;\n\t\t}\n\n\t\treturn traits_type::not_eof(c);\n\t}\n\nprivate:\n\tstd::ostream* m_stream;\n\tstd::string m_buffer;\n\tsigc::signal<void, const time_t, const log_level_t, const std::string&> m_signal;\n};\n\n///////////////////////////////////////////////////////////\n// log_stream_init\n\nclass log_stream_init\n{\npublic:\n\tsignal_buf* buf()\n\t{\n\t\treturn &m_signal_buffer;\n\t}\n\nprivate:\n\tsignal_buf m_signal_buffer;\n};\n\n///////////////////////////////////////////////////////////\n// log_stream\n\nclass log_stream :\n\tprivate virtual log_stream_init,\n\tpublic std::ostream\n{\npublic:\n\tstatic log_stream& instance()\n\t{\n\t\tstatic log_stream m_instance;\n\t\treturn m_instance;\n\t}\n\n\tsigc::connection connect(const sigc::slot<void, const time_t, const log_level_t, const std::string&>& Slot)\n\t{\n\t\treturn log_stream_init::buf()->connect(Slot);\n\t}\n\nprivate:\n\tlog_stream() :\n\t\tlog_stream_init(),\n\t\tstd::ostream(log_stream_init::buf())\n\t{\n\t\tlog_stream_init::buf()->init(*this);\n\t}\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// log\n\nstd::ostream& log()\n{\n\treturn detail::log_stream::instance();\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// critical\n\nstd::ostream& critical(std::ostream& Stream)\n{\n\tdetail::log_level(Stream) = K3D_LOG_LEVEL_CRITICAL;\n\treturn Stream;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// error\n\nstd::ostream& error(std::ostream& Stream)\n{\n\tdetail::log_level(Stream) = K3D_LOG_LEVEL_ERROR;\n\treturn Stream;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// warning\n\nstd::ostream& warning(std::ostream& Stream)\n{\n\tdetail::log_level(Stream) = K3D_LOG_LEVEL_WARNING;\n\treturn Stream;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// info\n\nstd::ostream& info(std::ostream& Stream)\n{\n\tdetail::log_level(Stream) = K3D_LOG_LEVEL_INFO;\n\treturn Stream;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// debug\n\nstd::ostream& debug(std::ostream& Stream)\n{\n\tdetail::log_level(Stream) = K3D_LOG_LEVEL_DEBUG;\n\treturn Stream;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// print_debug\n\nvoid print_debug(const std::string& Message)\n{\n\tlog() << debug << Message << std::endl;\n}\n\nvoid log_show_timestamps(bool Enable)\n{\n\tdetail::g_log_show_timestamp = Enable;\n}\n\nvoid log_set_tag(const std::string& Tag)\n{\n\tdetail::g_log_tag = Tag + \" \";\n}\n\nvoid log_color_level(bool Enable)\n{\n\tdetail::g_log_color_level = Enable;\n}\n\nvoid log_show_level(bool Enable)\n{\n\tdetail::g_log_show_level = Enable;\n}\n\nvoid log_syslog(bool Enable)\n{\n\tdetail::g_log_syslog = Enable;\n}\n\nvoid log_minimum_level(const log_level_t Level)\n{\n\tdetail::g_log_minimum_level = Level;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// connect_log_message\n\nsigc::connection connect_log_message(const sigc::slot<void, const time_t, const log_level_t, const std::string&>& Slot)\n{\n\treturn detail::log_stream::instance().connect(Slot);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// get_log_cache\n\nvoid get_log_cache(const sigc::slot<void, const time_t, const log_level_t, const std::string&>& Slot)\n{\n\tfor(size_t i = 0; i != detail::g_log_timestamp_cache.size(); ++i)\n\t\tSlot(detail::g_log_timestamp_cache[i], detail::g_log_level_cache[i], detail::g_log_message_cache[i]);\n}\n\n} // namespace k3d\n"
  },
  {
    "path": "k3dsdk/log.h",
    "content": "#ifndef K3DSDK_LOG_H\n#define K3DSDK_LOG_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <iosfwd>\n#include <string>\n\nnamespace k3d\n{\n\n/// Returns an output stream to be used for logging\nstd::ostream& log();\n\n/// iostream manipulator that indicates a critical error has occurred, from which the application cannot recover\nstd::ostream& critical(std::ostream&);\n/// iostream manipulator that indicates definite invalid input or unexpected behavior - the current operation will not succeed\nstd::ostream& error(std::ostream&);\n/// iostream manipulator that indicates possible invalid input or incorrect behavior - the current operation may not succeed\nstd::ostream& warning(std::ostream&);\n/// iostream manipulator that indicates an optional, informational message\nstd::ostream& info(std::ostream&);\n/// iostream manipulator that indicates messages used for internal debugging by developers\nstd::ostream& debug(std::ostream&);\n\n/// Convenience function that prints a debug message to the log stream ... intended mainly for use with signals\nvoid print_debug(const std::string& Message);\n\t\n} // namespace k3d\n\nusing k3d::critical;\nusing k3d::error;\nusing k3d::warning;\nusing k3d::info;\nusing k3d::debug;\n\n#define k3d_file_reference __FILE__ << \" line \" << __LINE__ \n\n#endif // !K3DSDK_LOG_H\n\n"
  },
  {
    "path": "k3dsdk/log_control.h",
    "content": "#ifndef K3DSDK_LOG_CONTROL_H\n#define K3DSDK_LOG_CONTROL_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\n/// Enumerates available log levels\ntypedef enum\n{\n\tK3D_LOG_LEVEL_CRITICAL = 1,\n\tK3D_LOG_LEVEL_ERROR = 2,\n\tK3D_LOG_LEVEL_WARNING = 3,\n\tK3D_LOG_LEVEL_INFO = 4,\n\tK3D_LOG_LEVEL_DEBUG = 5\n} log_level_t;\n\n/// Enables logging of timestamps (default: off)\nvoid log_show_timestamps(bool_t Enable);\n/// Sets a \"tag\" that will be prepended to log messages (default: empty)\nvoid log_set_tag(const string_t& Tag);\n/// Enables color output based on log level (default: off)\nvoid log_color_level(bool_t Enable);\n/// Prepends the log level to messages (default: off)\nvoid log_show_level(bool_t Enable);\n/// Enables logging to the syslog on systems that support it (default: off)\nvoid log_syslog(bool_t Enable);\n/// Sets the minimum level of message to be logged (default: K3D_LOG_LEVEL_WARNING)\nvoid log_minimum_level(const log_level_t Level);\n\n\n/// Connects a slot to a signal that will be emitted whenever messages are added to the log \nsigc::connection connect_log_message(const sigc::slot<void, const time_t, const log_level_t, const string_t&>& Slot);\n/// Retrieves the current contents of the log cache by repeatedly calling the given slot\nvoid get_log_cache(const sigc::slot<void, const time_t, const log_level_t, const string_t&>& Slot);\n\n} // namespace k3d\n\n#endif // !K3DSDK_LOG_CONTROL_H\n\n"
  },
  {
    "path": "k3dsdk/material.h",
    "content": "#ifndef K3DSDK_MATERIAL_H\n#define K3DSDK_MATERIAL_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/classes.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/property.h>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace material\n{\n\n/// Given a generic material object, return a specific material type (could return NULL).\ntemplate<typename InterfaceT>\nInterfaceT* lookup(iunknown* const Material)\n{\n\tif(InterfaceT* const interface = dynamic_cast<InterfaceT*>(Material))\n\t\treturn interface;\n\n\tif(inode* const node = dynamic_cast<inode*>(Material))\n\t{\n\t\tif(node->factory().factory_id() == classes::MultiMaterial())\n\t\t{\n\t\t\tif(iproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(Material))\n\t\t\t{\n\t\t\t\tconst iproperty_collection::properties_t& properties = property_collection->properties();\n\t\t\t\tfor(iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t\t\t{\n\t\t\t\t\tif((**property).property_type() == typeid(inode*))\n\t\t\t\t\t{\n\t\t\t\t\t\tif(InterfaceT* const interface = dynamic_cast<InterfaceT*>(k3d::property::pipeline_value<inode*>(**property)))\n\t\t\t\t\t\t\treturn interface;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n} // namespace material\n\n} // namespace k3d\n\n#endif // !K3DSDK_MATERIAL_H\n\n"
  },
  {
    "path": "k3dsdk/material_sink.h",
    "content": "#ifndef K3DSDK_MATERIAL_SINK_H\n#define K3DSDK_MATERIAL_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imaterial_sink.h>\n\nnamespace k3d\n{\n\nclass idocument;\n\n/// Adds a boilerplate implementation of k3d::imaterial_sink to a base class, using the parameterized-inheritance idiom\ntemplate<typename base_t>\nclass material_sink :\n\tpublic base_t,\n\tpublic imaterial_sink\n{\npublic:\n\tmaterial_sink(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_material(init_owner(*this) + init_name(\"material\") + init_label(_(\"Surface Material\")) + init_description(_(\"Surface material\")) + init_value(static_cast<imaterial*>(0)))\n\t{\n\t}\n\n\tiproperty& material_sink_input()\n\t{\n\t\treturn m_material;\n\t}\n\nprotected:\n\tk3d_data(imaterial*, data::immutable_name, data::change_signal, data::with_undo, data::node_storage, data::no_constraint, data::node_property, data::node_serialization) m_material;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_MATERIAL_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/matrix_source.h",
    "content": "#ifndef K3DSDK_MATRIX_SOURCE_H\n#define K3DSDK_MATRIX_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace k3d\n{\n\ntemplate<typename base_t>\nclass matrix_source :\n\tpublic base_t,\n\tpublic imatrix_source\n{\npublic:\n\tmatrix_source(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_output_matrix(init_owner(*this) + init_name(\"output_matrix\") + init_label(_(\"Output Matrix\")) + init_description(\"Output Matrix\") + init_value(identity3()))\n\t{\n\t\tm_output_matrix.set_update_slot(sigc::mem_fun(*this, &matrix_source<base_t>::execute));\n\t}\n\n\tiproperty& matrix_source_output()\n\t{\n\t\treturn m_output_matrix;\n\t}\n\n\t/// Returns a slot that should be connected to input properties to signal that the output has changed\n\tsigc::slot<void, ihint*> make_update_matrix_slot()\n\t{\n\t\treturn m_output_matrix.make_slot();\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, data::immutable_name, data::change_signal, data::no_undo, data::value_demand_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_output_matrix;\n\n\t/// Called whenever the output has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, matrix4& Output)\n\t{\n\t\t// We can safely ignore any hints ...\n\t\ton_update_matrix(Output);\n\t}\n\n\t/// Override this in derived classes, to return a new transformation matrix.\n\tvirtual void on_update_matrix(matrix4& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_MATRIX_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/measurement.cpp",
    "content": "// K3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements a framework for doing real-world unit-of-measure conversion\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/expression_grammar.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/result.h>\n\n#include <stdexcept>\n\nnamespace k3d\n{\n\nnamespace measurement\n{\n\nusing namespace boost::spirit;\n\nbool parse(std::istream& Stream, double&Value, std::string& Units)\n{\n\tstd::string buffer;\n\tstd::copy(std::istreambuf_iterator<char>(Stream), std::istreambuf_iterator<char>(), std::back_inserter(buffer));\n\n\treturn parse(buffer, Value, Units);\n}\n\nbool parse(const std::string& Buffer, double& Value, std::string& Units)\n{\n\tstd::stack<double> stack;\n\tstd::string units;\n\n\tif(!parse(Buffer.c_str(), k3d::expression::expression_grammar(stack) >>!(alpha_p >> *graph_p)[assign(units)], space_p).full)\n\t\treturn false;\n\n\tassert(!stack.empty());\n\tValue = stack.top();\n\tUnits = units;\n\n\treturn true;\n}\n\nbool parse(const std::string& Buffer, double&Value, const std::type_info* const Units)\n{\n\t// Parse the input expression into value and unit-of-measure (it can do mathematical expressions, too, for fun)\n\tdouble value;\n\tstd::string units;\n\tif(!parse(Buffer, value, units))\n\t\treturn false;\n\n\t// If the caller didn't specify the type of units, they're scalar (no unit of measurement) ...\n\tif(!Units)\n\t{\n\t\t// In this case, if the user entered units, it's an error ...\n\t\tif(!units.empty())\n\t\t\treturn false;\n\n\t\t// Just return the value ...\n\t\tValue = value;\n\t\treturn true;\n\t}\n\n\t// As a special-case, if the user didn't enter units, and the unit type is \"angle\", we assume the input is in degrees, not radians\n\tif(units.empty() && *Units == typeid(angle))\n\t\tunits = \"deg\";\n\n\t// No units specified, so we can assume that input is already in the internal (SI) units\n\tif(units.empty())\n\t{\n\t\tValue = value;\n\t\treturn true;\n\t}\n\n\t// Attempt converting the value to its internal (SI) units ...\n\ttry\n\t{\n\t\tif(*Units == typeid(angle))\n\t\t\tValue = convert(quantity<angle>(value, angle_units(units)), angle_units(\"rad\"));\n\t\telse if(*Units == typeid(area))\n\t\t\tValue = convert(quantity<area>(value, area_units(units)), area_units(\"m^2\"));\n\t\telse if(*Units == typeid(distance))\n\t\t\tValue = convert(quantity<distance>(value, distance_units(units)), distance_units(\"m\"));\n\t\telse if(*Units == typeid(force))\n\t\t\tValue = convert(quantity<force>(value, force_units(units)), force_units(\"N\"));\n\t\telse if(*Units == typeid(mass))\n\t\t\tValue = convert(quantity<mass>(value, mass_units(units)), mass_units(\"Kg\"));\n\t\telse if(*Units == typeid(pressure))\n\t\t\tValue = convert(quantity<pressure>(value, pressure_units(units)), pressure_units(\"Pa\"));\n\t\telse if(*Units == typeid(k3d::measurement::time))\n\t\t\tValue = convert(quantity<k3d::measurement::time>(value, time_units(units)), time_units(\"s\"));\n\t\telse if(*Units == typeid(volume))\n\t\t\tValue = convert(quantity<volume>(value, volume_units(units)), volume_units(\"m^3\"));\n\n\t\treturn true;\n\t}\n\tcatch(...)\n\t{\n\t}\n\n\treturn false;\n}\n\nconst angle_units_t& angle_units()\n{\n\tstatic angle_units_t units;\n\tif(units.empty())\n\t{\n\t\tunits.insert(std::make_pair(\"d\", angle(\"Degree\", \"degrees\", 0.01745329252)));\n\t\tunits.insert(std::make_pair(\"deg\", angle(\"Degree\", \"degrees\", 0.01745329252)));\n\t\tunits.insert(std::make_pair(\"degree\", angle(\"Degree\", \"degrees\", 0.01745329252)));\n\t\tunits.insert(std::make_pair(\"arcmin\", angle(\"Minute of arc\", \"Minutes of arc\", 0.00290888209)));\n\t\tunits.insert(std::make_pair(\"arcs\", angle(\"Second of arc\", \"Seconds of arc\", 0.00000484814)));\n\t\tunits.insert(std::make_pair(\"g\", angle(\"Grade\", \"Grades\", 0.01570796327)));\n\t\tunits.insert(std::make_pair(\"grad\", angle(\"Grade\", \"Grades\", 0.01570796327)));\n\t\tunits.insert(std::make_pair(\"r\", angle(\"Radian\", \"radians\", 1.0)));\n\t\tunits.insert(std::make_pair(\"rad\", angle(\"Radian\", \"radians\", 1.0)));\n\t\tunits.insert(std::make_pair(\"radian\", angle(\"Radian\", \"radians\", 1.0)));\n\t}\n\n\treturn units;\n}\n\nconst area_units_t& area_units()\n{\n\tstatic area_units_t units;\n\tif(units.empty())\n\t{\n\t\tunits.insert(std::make_pair(\"m^2\", area(\"Square Meter\", \"Square Meters\", 1.0)));\n\t\tunits.insert(std::make_pair(\"a\", area(\"Are\", \"Ares\", 100.0)));\n\t\tunits.insert(std::make_pair(\"acre\", area(\"Acre\", \"Acres\", 4046.87260987)));\n\t\tunits.insert(std::make_pair(\"b\", area(\"Barn\", \"Barns\", 1e-28)));\n\t}\n\n\treturn units;\n}\n\nconst distance_units_t& distance_units()\n{\n\tstatic distance_units_t units;\n\tif(units.empty())\n\t{\n\t\tunits.insert(std::make_pair(\"m\", distance(\"Meter\", \"Meters\", 1.0)));\n\t\tunits.insert(std::make_pair(\"au\", distance(\"Astronomical Unit\", \"Astronomical Units\", 1.495979e11)));\n\t\tunits.insert(std::make_pair(\"A\", distance(\"Angstrom\", \"Angstroms\", 0.0000000001)));\n\t\tunits.insert(std::make_pair(\"angstrom\", distance(\"Angstrom\", \"Angstroms\", 0.0000000001)));\n\t\tunits.insert(std::make_pair(\"chain\", distance(\"Chain\", \"Chains\", 20.1168402337)));\n\t\tunits.insert(std::make_pair(\"fath\", distance(\"Fathom\", \"Fathoms\", 1.82880365761)));\n\t\tunits.insert(std::make_pair(\"fathom\", distance(\"Fathom\", \"Fathoms\", 1.82880365761)));\n\t\tunits.insert(std::make_pair(\"fermi\", distance(\"Fermi\", \"Fermis\", 1e-15)));\n\t\tunits.insert(std::make_pair(\"ftintl\", distance(\"International Foot\", \"International Feet\", 0.3048)));\n\t\tunits.insert(std::make_pair(\"ft\", distance(\"Survey Foot\", \"Survey Feet\", 0.304800609601)));\n\t\tunits.insert(std::make_pair(\"foot\", distance(\"Survey Foot\", \"Survey Feet\", 0.304800609601)));\n\t\tunits.insert(std::make_pair(\"ftUS\", distance(\"Survey Foot\", \"Survey Feet\", 0.304800609601)));\n\t\tunits.insert(std::make_pair(\"in\", distance(\"Inch\", \"Inches\", 0.0254)));\n\t\tunits.insert(std::make_pair(\"inch\", distance(\"Inch\", \"Inches\", 0.0254)));\n\t\tunits.insert(std::make_pair(\"ly\", distance(\"Light Year\", \"Light Years\", 9.46052840488e15)));\n\t\tunits.insert(std::make_pair(\"lyr\", distance(\"Light Year\", \"Light Years\", 9.46052840488e15)));\n\t\tunits.insert(std::make_pair(\"lightyear\", distance(\"Light Year\", \"Light Years\", 9.46052840488e15)));\n\t\tunits.insert(std::make_pair(\"Em\", distance(\"Exameter\", \"Exameters\", 1e18)));\n\t\tunits.insert(std::make_pair(\"Pm\", distance(\"Petemeter\", \"Petemeters\", 1e15)));\n\t\tunits.insert(std::make_pair(\"Tm\", distance(\"Terameter\", \"Terameters\", 1e12)));\n\t\tunits.insert(std::make_pair(\"Gm\", distance(\"Gigameter\", \"Gigameters\", 1e9)));\n\t\tunits.insert(std::make_pair(\"Mm\", distance(\"Megameter\", \"Megameters\", 1e6)));\n\t\tunits.insert(std::make_pair(\"Km\", distance(\"Kilometer\", \"Kilometers\", 1e3)));\n\t\tunits.insert(std::make_pair(\"km\", distance(\"Kilometer\", \"Kilometers\", 1e3)));\n\t\tunits.insert(std::make_pair(\"Hm\", distance(\"Hectometer\", \"Hectometers\", 1e2)));\n\t\tunits.insert(std::make_pair(\"hm\", distance(\"Hectometer\", \"Hectometers\", 1e2)));\n\t\tunits.insert(std::make_pair(\"Dm\", distance(\"Dekameter\", \"Dekameters\", 1e1)));\n\t\tunits.insert(std::make_pair(\"meter\", distance(\"Meter\", \"Meters\", 1.0)));\n\t\tunits.insert(std::make_pair(\"dm\", distance(\"Decimeter\", \"Decimeters\", 1e-1)));\n\t\tunits.insert(std::make_pair(\"cm\", distance(\"Centimeter\", \"Centimeters\", 1e-2)));\n\t\tunits.insert(std::make_pair(\"mm\", distance(\"Millimeter\", \"Millimeters\", 1e-3)));\n\t\tunits.insert(std::make_pair(\"um\", distance(\"Micrometer\", \"Micrometers\", 1e-6)));\n\t\tunits.insert(std::make_pair(\"nm\", distance(\"Nanometer\", \"Nanometers\", 1e-9)));\n\t\tunits.insert(std::make_pair(\"pm\", distance(\"Picometer\", \"Picometers\", 1e-12)));\n\t\tunits.insert(std::make_pair(\"fm\", distance(\"Femtometer\", \"Femtometers\", 1e-15)));\n\t\tunits.insert(std::make_pair(\"am\", distance(\"Attometer\", \"Attometers\", 1e-18)));\n\t\tunits.insert(std::make_pair(\"miIntl\", distance(\"International Mile\", \"International Miles\", 1609.344)));\n\t\tunits.insert(std::make_pair(\"mil\", distance(\"Mil\", \"Mils\", 0.0000254)));\n\t\tunits.insert(std::make_pair(\"mi\", distance(\"US Statute Mile\", \"US Statute Miles\", 1609.34721869)));\n\t\tunits.insert(std::make_pair(\"mile\", distance(\"US Statute Mile\", \"US Statute Miles\", 1609.34721869)));\n\t\tunits.insert(std::make_pair(\"mileUS\", distance(\"US Statute Mile\", \"US Statute Miles\", 1609.34721869)));\n\t\tunits.insert(std::make_pair(\"nmi\", distance(\"Nautical Mile\", \"Nautical Miles\", 1852.0)));\n\t\tunits.insert(std::make_pair(\"pc\", distance(\"Parsec\", \"Parsecs\", 3.08567818585e16)));\n\t\tunits.insert(std::make_pair(\"parsec\", distance(\"Parsec\", \"Parsecs\", 3.08567818585e16)));\n\t\tunits.insert(std::make_pair(\"rd\", distance(\"Rod\", \"Rods\", 5.02921005842)));\n\t\tunits.insert(std::make_pair(\"rod\", distance(\"Rod\", \"Rods\", 5.02921005842)));\n\t\tunits.insert(std::make_pair(\"yd\", distance(\"Yard\", \"Yards\", 0.9144)));\n\t\tunits.insert(std::make_pair(\"yard\", distance(\"Yard\", \"Yards\", 0.9144)));\n\t}\n\n\treturn units;\n}\n\nconst force_units_t& force_units()\n{\n\tstatic force_units_t units;\n\tif(units.empty())\n\t{\n\t\tunits.insert(std::make_pair(\"N\", force(\"Newton\", \"Newtons\", 1.0)));\n\t\tunits.insert(std::make_pair(\"dyn\", force(\"Dyne\", \"Dynes\", 0.00001)));\n\t\tunits.insert(std::make_pair(\"dyne\", force(\"Dyne\", \"Dynes\", 0.00001)));\n\t\tunits.insert(std::make_pair(\"gf\", force(\"Gram-Force\", \"Grams-Force\", 0.00980665)));\n\t\tunits.insert(std::make_pair(\"kip\", force(\"Kilopound-Force\", \"Kilopounds-Force\", 4448.22161526)));\n\t\tunits.insert(std::make_pair(\"lbf\", force(\"Point-Force\", \"Points-Force\", 4.44822161526)));\n\t\tunits.insert(std::make_pair(\"Newton\", force(\"Newton\", \"Newtons\", 1.0)));\n\t\tunits.insert(std::make_pair(\"pdl\", force(\"Poundal\", \"Poundals\", 0.138254954376)));\n\t}\n\n\treturn units;\n}\n\nconst mass_units_t& mass_units()\n{\n\tstatic mass_units_t units;\n\tif(units.empty())\n\t{\n\t\tunits.insert(std::make_pair(\"Kg\", mass(\"Kilogram\", \"Kilograms\", 1.0)));\n\t\tunits.insert(std::make_pair(\"ct\", mass(\"Carat\", \"Carats\", 0.0002)));\n\t\tunits.insert(std::make_pair(\"g\", mass(\"Gram\", \"Grams\", 0.001)));\n\t\tunits.insert(std::make_pair(\"gram\", mass(\"Gram\", \"Grams\", 0.001)));\n\t\tunits.insert(std::make_pair(\"grain\", mass(\"Grain\", \"Grains\", 0.00006479891)));\n\t\tunits.insert(std::make_pair(\"lb\", mass(\"Avoirdupois Pound\", \"Avoirdupois Pounds\", 0.45359237)));\n\t\tunits.insert(std::make_pair(\"lbt\", mass(\"Troy Pound\", \"Troy Pounds\", 0.3732417)));\n\t\tunits.insert(std::make_pair(\"oz\", mass(\"Ounce\", \"Ounces\", 0.028349523125)));\n\t\tunits.insert(std::make_pair(\"ounce\", mass(\"Ounce\", \"Ounces\", 0.028349523125)));\n\t\tunits.insert(std::make_pair(\"ozt\", mass(\"Troy Ounce\", \"Troy Ounces\", 0.031103475)));\n\t\tunits.insert(std::make_pair(\"slug\", mass(\"Slug\", \"Slugs\", 14.5939029372)));\n\t\tunits.insert(std::make_pair(\"t\", mass(\"Metric Ton\", \"Metric Tons\", 1000.0)));\n\t\tunits.insert(std::make_pair(\"ton\", mass(\"Short Ton\", \"Short Tons\", 907.18474)));\n\t\tunits.insert(std::make_pair(\"tonUK\", mass(\"Long Ton\", \"Long Tons\", 1016.0469088)));\n\t\tunits.insert(std::make_pair(\"u\", mass(\"Unified Atomic Mass\", \"Unified Atomic Masses\", 1.66057e-27)));\n\t}\n\n\treturn units;\n}\n\nconst pressure_units_t& pressure_units()\n{\n\tstatic pressure_units_t units;\n\tif(units.empty())\n\t{\n\t\tunits.insert(std::make_pair(\"Pa\", pressure(\"Pascal\", \"Pascal\", 1.0)));\n\t\tunits.insert(std::make_pair(\"atm\", pressure(\"Atmosphere\", \"Atmospheres\", 101325.0)));\n\t\tunits.insert(std::make_pair(\"bar\", pressure(\"Bar\", \"Bars\", 100000.0)));\n\t\tunits.insert(std::make_pair(\"inHG\", pressure(\"Inch of Mercury\", \"Inches of Mercury\", 3386.38815789)));\n\t\tunits.insert(std::make_pair(\"inH2O\", pressure(\"Inch of Water\", \"Inches of Water\", 248.84)));\n\t\tunits.insert(std::make_pair(\"mmHG\", pressure(\"Millimeter of Mercury\", \"Millimeters of Mercury\", 133.322368421)));\n\t\tunits.insert(std::make_pair(\"Pascal\", pressure(\"Pascal\", \"Pascals\", 1.0)));\n\t\tunits.insert(std::make_pair(\"psi\", pressure(\"Pound per Square Inch\", \"Pounds per Square Inch\", 6894.75729317)));\n\t\tunits.insert(std::make_pair(\"torr\", pressure(\"Torr\", \"Torrs\", 133.322368421)));\n\t}\n\n\treturn units;\n}\n\nconst time_units_t& time_units()\n{\n\tstatic time_units_t units;\n\tif(units.empty())\n\t{\n\t\tunits.insert(std::make_pair(\"s\", time(\"Second\", \"Seconds\", 1.0)));\n\t\tunits.insert(std::make_pair(\"d\", time(\"Day\", \"Days\", 86400.0)));\n\t\tunits.insert(std::make_pair(\"day\", time(\"Day\", \"Days\", 86400.0)));\n\t\tunits.insert(std::make_pair(\"h\", time(\"Hour\", \"Hours\", 3600.0)));\n\t\tunits.insert(std::make_pair(\"hour\", time(\"Hour\", \"Hours\", 3600.0)));\n\t\tunits.insert(std::make_pair(\"ms\", time(\"Millisecond\", \"Milliseconds\", 0.001)));\n\t\tunits.insert(std::make_pair(\"msec\", time(\"Millisecond\", \"Milliseconds\", 0.001)));\n\t\tunits.insert(std::make_pair(\"min\", time(\"Minute\", \"Minutes\", 60.0)));\n\t\tunits.insert(std::make_pair(\"minute\", time(\"Minute\", \"Minutes\", 60.0)));\n\t\tunits.insert(std::make_pair(\"second\", time(\"Second\", \"Seconds\", 1.0)));\n\t\tunits.insert(std::make_pair(\"yr\", time(\"Year\", \"Years\", 31556925.9747)));\n\t\tunits.insert(std::make_pair(\"year\", time(\"Year\", \"Years\", 31556925.9747)));\n\t}\n\n\treturn units;\n}\n\nconst volume_units_t& volume_units()\n{\n\tstatic volume_units_t units;\n\tif(units.empty())\n\t{\n\t\tunits.insert(std::make_pair(\"m^3\", volume(\"Cubic Meter\", \"Cubic Meters\", 1.0)));\n\t\tunits.insert(std::make_pair(\"bbl\", volume(\"Barrel (Oil)\", \"Barrels (Oil)\", 0.158987294928)));\n\t\tunits.insert(std::make_pair(\"bu\", volume(\"Bushel\", \"Bushels\", 0.03523907)));\n\t\tunits.insert(std::make_pair(\"cu\", volume(\"US Cup\", \"US Cups\", 2.365882365e-4)));\n\t\tunits.insert(std::make_pair(\"fbm\", volume(\"Board Foot\", \"Board Feet\", 0.002359737216)));\n\t\tunits.insert(std::make_pair(\"gal\", volume(\"US Gallon\", \"US Gallons\", 0.003785411784)));\n\t\tunits.insert(std::make_pair(\"galUS\", volume(\"US Gallon\", \"US Gallons\", 0.003785411784)));\n\t\tunits.insert(std::make_pair(\"galC\", volume(\"Canadian Gallon\", \"Canadian Gallons\", 0.00454609)));\n\t\tunits.insert(std::make_pair(\"galUK\", volume(\"UK Gallon\", \"UK Gallons\", 0.004546092)));\n\t\tunits.insert(std::make_pair(\"l\", volume(\"Liter\", \"Liters\", 0.001)));\n\t\tunits.insert(std::make_pair(\"ozfl\", volume(\"US Fluid Ounce\", \"US Fluid Ounce\", 2.95735295625e-5)));\n\t\tunits.insert(std::make_pair(\"ozUK\", volume(\"UK Fluid Ounce\", \"UK Fluid Ounce\", 0.000028413075)));\n\t\tunits.insert(std::make_pair(\"pk\", volume(\"Peck\", \"Pecks\", 0.0088097675)));\n\t\tunits.insert(std::make_pair(\"pt\", volume(\"Pint\", \"Pints\", 0.000473176473)));\n\t\tunits.insert(std::make_pair(\"pint\", volume(\"Pint\", \"Pints\", 0.000473176473)));\n\t\tunits.insert(std::make_pair(\"qt\", volume(\"Quart\", \"Quarts\", 0.000946352946)));\n\t\tunits.insert(std::make_pair(\"quart\", volume(\"Quart\", \"Quarts\", 0.000946352946)));\n\t\tunits.insert(std::make_pair(\"st\", volume(\"Stere\", \"Steres\", 1.0)));\n\t\tunits.insert(std::make_pair(\"stere\", volume(\"Stere\", \"Steres\", 1.0)));\n\t\tunits.insert(std::make_pair(\"tbsp\", volume(\"Tablespoon\", \"Tablespoons\", 1.47867647813e-5)));\n\t\tunits.insert(std::make_pair(\"tsp\", volume(\"Teaspoon\", \"Teaspoons\", 4.92892159375e-6)));\n\t}\n\n\treturn units;\n}\n\nconst angle& angle_units(const std::string& Symbol)\n{\n\tangle_units_t::const_iterator unit = angle_units().find(Symbol);\n\n\tif(unit == angle_units().end())\n\t\tthrow std::domain_error(\"unknown unit of measure\");\n\n\treturn unit->second;\n}\n\nconst area& area_units(const std::string& Symbol)\n{\n\tarea_units_t::const_iterator unit = area_units().find(Symbol);\n\n\tif(unit == area_units().end())\n\t\tthrow std::domain_error(\"unknown unit of measure\");\n\n\treturn unit->second;\n}\n\nconst distance& distance_units(const std::string& Symbol)\n{\n\tdistance_units_t::const_iterator unit = distance_units().find(Symbol);\n\n\tif(unit == distance_units().end())\n\t\tthrow std::domain_error(\"unknown unit of measure\");\n\n\treturn unit->second;\n}\n\nconst force& force_units(const std::string& Symbol)\n{\n\tforce_units_t::const_iterator unit = force_units().find(Symbol);\n\n\tif(unit == force_units().end())\n\t\tthrow std::domain_error(\"unknown unit of measure\");\n\n\treturn unit->second;\n}\n\nconst mass& mass_units(const std::string& Symbol)\n{\n\tmass_units_t::const_iterator unit = mass_units().find(Symbol);\n\n\tif(unit == mass_units().end())\n\t\tthrow std::domain_error(\"unknown unit of measure\");\n\n\treturn unit->second;\n}\n\nconst pressure& pressure_units(const std::string& Symbol)\n{\n\tpressure_units_t::const_iterator unit = pressure_units().find(Symbol);\n\n\tif(unit == pressure_units().end())\n\t\tthrow std::domain_error(\"unknown unit of measure\");\n\n\treturn unit->second;\n}\n\nconst time& time_units(const std::string& Symbol)\n{\n\ttime_units_t::const_iterator unit = time_units().find(Symbol);\n\n\tif(unit == time_units().end())\n\t\tthrow std::domain_error(\"unknown unit of measure\");\n\n\treturn unit->second;\n}\n\nconst volume& volume_units(const std::string& Symbol)\n{\n\tvolume_units_t::const_iterator unit = volume_units().find(Symbol);\n\n\tif(unit == volume_units().end())\n\t\tthrow std::domain_error(\"unknown unit of measure\");\n\n\treturn unit->second;\n}\n\n} // namespace measurement\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/measurement.h",
    "content": "#ifndef K3DSDK_MEASUREMENT_H\n#define K3DSDK_MEASUREMENT_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Provides a type-safe framework for doing real-world unit-of-measure conversion and I/O\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <cassert>\n#include <iosfwd>\n#include <ostream>\n#include <map>\n#include <string>\n#include <typeinfo>\n\nnamespace k3d\n{\n\nnamespace measurement\n{\n\nnamespace conversion\n{\n\n/// Conversion policy for real world units that can be converted solely through multiplication\nclass multiplicative\n{\npublic:\n\tdouble to_si(const double RHS) const\n\t{\n\t\treturn RHS * m_constant;\n\t}\n\n\tdouble from_si(const double RHS) const\n\t{\n\t\treturn RHS / m_constant;\n\t}\n\nprotected:\n\texplicit multiplicative(const double Constant) :\n\t\tm_constant(Constant)\n\t{\n\t\tassert(m_constant);\n\t}\n\nprivate:\n\tdouble m_constant;\n};\n\n} // namespace conversion\n\n/// Defines a real-world unit of measure, including singular written name, plural written name, and functions to_si() and from_si() for converting quantities to-and-from their corresponding SI standard units\ntemplate<typename conversion_policy>\nclass unit :\n\tpublic conversion_policy\n{\npublic:\n\ttypedef unit<conversion_policy> this_t;\n\n\tconst std::string name() const\n\t{\n\t\treturn m_name;\n\t}\n\n\tconst std::string plural_name() const\n\t{\n\t\treturn m_plural_name;\n\t}\n\n\tfriend bool operator==(const this_t& LHS, const this_t& RHS)\n\t{\n\t\treturn LHS.m_name == RHS.m_name;\n\t}\n\n\tfriend bool operator<(const this_t& LHS, const this_t& RHS)\n\t{\n\t\treturn LHS.m_name < RHS.m_name;\n\t}\n\nprotected:\n/*\n\texplicit unit(const std::string Name, const std::string PluralName) :\n\t\tconversion_policy(),\n\t\tm_name(Name),\n\t\tm_plural_name(Name)\n\t{\n\t\tassert(m_name.size());\n\t\tassert(m_plural_name.size());\n\t}\n*/\n\n\texplicit unit(const std::string Name, const std::string PluralName, const double MultiplicativeConstant) :\n\t\tconversion_policy(MultiplicativeConstant),\n\t\tm_name(Name),\n\t\tm_plural_name(PluralName)\n\t{\n\t\tassert(m_name.size());\n\t\tassert(m_plural_name.size());\n\t}\n\nprivate:\n\tstd::string m_name;\n\tstd::string m_plural_name;\n};\n\n/// Defines a proxy object so we can do conversion-by-assignment\ntemplate<typename quantity_t>\nclass conversion_proxy\n{\npublic:\n\texplicit conversion_proxy(const quantity_t Quantity) :\n\t\tm_quantity(Quantity)\n\t{\n\t}\n\n\tdouble to_si() const\n\t{\n\t\treturn m_quantity.to_si();\n\t}\n\nprivate:\n\tconst quantity_t m_quantity;\n};\n\n/// Convenience function for creating conversion_proxy objects\ntemplate<typename quantity_t>\nconversion_proxy<quantity_t> convert(const quantity_t Quantity)\n{\n\treturn conversion_proxy<quantity_t>(Quantity);\n}\n\n/// Convenience function for converting a quantity to another unit-of-measure\ntemplate<typename quantity_t>\nconst quantity_t convert(const quantity_t Quantity, const typename quantity_t::unit_type Units)\n{\n\treturn quantity_t(Units.from_si(Quantity.to_si()), Units);\n}\n\n/// Defines a real-world quantity (a combination of value and unit)\ntemplate<typename unit_t>\nclass quantity\n{\npublic:\n\ttypedef unit_t unit_type;\n\ttypedef quantity<unit_t> this_t;\n\n\texplicit quantity(const unit_t Units) :\n\t\tm_units(Units)\n\t{\n\t}\n\n\texplicit quantity(const double Value, const unit_t Units) :\n\t\tm_value(Value),\n\t\tm_units(Units)\n\t{\n\t}\n\n\toperator double() const\n\t{\n\t\treturn m_value;\n\t}\n\n\tdouble value() const\n\t{\n\t\treturn m_value;\n\t}\n\n\tconst unit_t& units() const\n\t{\n\t\treturn m_units;\n\t}\n\n\tdouble to_si() const\n\t{\n\t\treturn m_units.to_si(m_value);\n\t}\n\n\tthis_t& operator=(const conversion_proxy<this_t>& RHS)\n\t{\n\t\tm_value = m_units.from_si(RHS.to_si());\n\t\treturn *this;\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const this_t& RHS)\n\t{\n\t\tStream << RHS.m_value << \" \";\n\t\tStream << (1 == RHS.m_value ? RHS.m_units.name() : RHS.m_units.plural_name());\n\t\treturn Stream;\n\t}\n\nprivate:\n\tdouble m_value;\n\tunit_t m_units;\n};\n\n/// Defines a \"scalar\" quantity (no unit-of-measure)\ntypedef void scalar;\n\n/// Defines an angular unit-of-measure\nclass angle :\n\tpublic unit<conversion::multiplicative>\n{\npublic:\n\texplicit angle(const std::string Name, const std::string PluralName, const double Constant) :\n\t\tunit<conversion::multiplicative>(Name, PluralName, Constant)\n\t{\n\t}\n};\n\n/// Defines a unit-of-measure for area\nclass area :\n\tpublic unit<conversion::multiplicative>\n{\npublic:\n\texplicit area(const std::string Name, const std::string PluralName, const double Constant) :\n\t\tunit<conversion::multiplicative>(Name, PluralName, Constant)\n\t{\n\t}\n};\n\n/// Defines a unit-of-measure for distance\nclass distance :\n\tpublic unit<conversion::multiplicative>\n{\npublic:\n\texplicit distance(const std::string Name, const std::string PluralName, const double Constant) :\n\t\tunit<conversion::multiplicative>(Name, PluralName, Constant)\n\t{\n\t}\n};\n\n/// Defines a unit-of-measure for force\nclass force :\n\tpublic unit<conversion::multiplicative>\n{\npublic:\n\texplicit force(const std::string Name, const std::string PluralName, const double Constant) :\n\t\tunit<conversion::multiplicative>(Name, PluralName, Constant)\n\t{\n\t}\n};\n\n/// Defines a unit-of-measure for mass\nclass mass :\n\tpublic unit<conversion::multiplicative>\n{\npublic:\n\texplicit mass(const std::string Name, const std::string PluralName, const double Constant) :\n\t\tunit<conversion::multiplicative>(Name, PluralName, Constant)\n\t{\n\t}\n};\n\n/// Defines a unit-of-measure for pressure\nclass pressure :\n\tpublic unit<conversion::multiplicative>\n{\npublic:\n\texplicit pressure(const std::string Name, const std::string PluralName, const double Constant) :\n\t\tunit<conversion::multiplicative>(Name, PluralName, Constant)\n\t{\n\t}\n};\n\n/// Defines a unit-of-measure for time\nclass time :\n\tpublic unit<conversion::multiplicative>\n{\npublic:\n\texplicit time(const std::string Name, const std::string PluralName, const double Constant) :\n\t\tunit<conversion::multiplicative>(Name, PluralName, Constant)\n\t{\n\t}\n};\n\n/// Defines a unit-of-measure for volume\nclass volume :\n\tpublic unit<conversion::multiplicative>\n{\npublic:\n\texplicit volume(const std::string Name, const std::string PluralName, const double Constant) :\n\t\tunit<conversion::multiplicative>(Name, PluralName, Constant)\n\t{\n\t}\n};\n\n/**\n\n\\brief Parses a mathematical expression with optional real-world units-of-measure\n\\param Stream Input stream containing the expression to be parsed\n\\param Value Iff the input expression is completely parsed, contains the expression value; otherwise unchanged\n\\param Units Iff the input expression is completely parsed, contains the (optional) unit-of-measure symbol; otherwise unchanged\n\\return true, iff the input expression is completely parsed, false otherwise\n\n*/\nbool parse(std::istream& Stream, double&Value, std::string& Units);\n\n/**\n\n\\brief Parses a mathematical expression with optional real-world units-of-measure\n\\param Buffer Input buffer containing the expression to be parsed\n\\param Value Iff the input expression is completely parsed, contains the expression value; otherwise unchanged\n\\param Units Iff the input expression is completely parsed, contains the (optional) unit-of-measure symbol; otherwise unchanged\n\\return true, iff the input expression is completely parsed, false otherwise\n\n*/\nbool parse(const std::string& Buffer, double&Value, std::string& Units);\n\n/**\n\n\\brief Parses a mathematical expression with optional real-world units-of-measure, automatically converting it to the appropriate SI units\n\\param Buffer Input buffer containing the expression to be parsed\n\\param Value Iff the input expression is completely parsed, contains the expression value in SI units\n\\param Units Defines the type of measurement (e.g. angle, distance, time, volume, etc) to be formatted\n\\return true, iff the input expression is completely parsed, false otherwise\n\n*/\nbool parse(const std::string& Buffer, double&Value, const std::type_info* const Units);\n\n/// Defines a collection of units of angular measure, keyed by string (typically name or symbol)\ntypedef std::map<std::string, angle> angle_units_t;\n/// Defines a collection of units of area, keyed by string (typically name or symbol)\ntypedef std::map<std::string, area> area_units_t;\n/// Defines a collection of units of distance, keyed by string (typically name or symbol)\ntypedef std::map<std::string, distance> distance_units_t;\n/// Defines a collection of units of force, keyed by string (typically name or symbol)\ntypedef std::map<std::string, force> force_units_t;\n/// Defines a collection of units of mass, keyed by string (typically name or symbol)\ntypedef std::map<std::string, mass> mass_units_t;\n/// Defines a collection of units of pressure, keyed by string (typically name or symbol)\ntypedef std::map<std::string, pressure> pressure_units_t;\n/// Defines a collection of units of time, keyed by string (typically name or symbol)\ntypedef std::map<std::string, time> time_units_t;\n/// Defines a collection of units of volume, keyed by string (typically name or symbol)\ntypedef std::map<std::string, volume> volume_units_t;\n\n/// Returns a singleton collection of common units of angular measure, keyed by symbol\nconst angle_units_t& angle_units();\n/// Returns a singleton collection of common units of area, keyed by symbol\nconst area_units_t& area_units();\n/// Returns a singleton collection of common units of distance, keyed by symbol\nconst distance_units_t& distance_units();\n/// Returns a singleton collection of common units of force, keyed by symbol\nconst force_units_t& force_units();\n/// Returns a singleton collection of common units of mass, keyed by symbol\nconst mass_units_t& mass_units();\n/// Returns a singleton collection of common units of pressure, keyed by symbol\nconst pressure_units_t& pressure_units();\n/// Returns a singleton collection of common units of time, keyed by symbol\nconst time_units_t& time_units();\n/// Returns a singleton collection of common units of volume, keyed by symbol\nconst volume_units_t& volume_units();\n\n/// Returns a reference to a common unit of angular measure keyed by symbol.  Throws std::exception if the symbol is unknown.\nconst angle& angle_units(const std::string& Symbol);\n/// Returns a reference to a common unit of area keyed by symbol.  Throws std::exception if the symbol is unknown.\nconst area& area_units(const std::string& Symbol);\n/// Returns a reference to a common unit of distance keyed by symbol.  Throws std::exception if the symbol is unknown.\nconst distance& distance_units(const std::string& Symbol);\n/// Returns a reference to a common unit of force keyed by symbol.  Throws std::exception if the symbol is unknown.\nconst force& force_units(const std::string& Symbol);\n/// Returns a reference to a common unit of mass keyed by symbol.  Throws std::exception if the symbol is unknown.\nconst mass& mass_units(const std::string& Symbol);\n/// Returns a reference to a common unit of pressure keyed by symbol.  Throws std::exception if the symbol is unknown.\nconst pressure& pressure_units(const std::string& Symbol);\n/// Returns a reference to a common unit of time keyed by symbol.  Throws std::exception if the symbol is unknown.\nconst time& time_units(const std::string& Symbol);\n/// Returns a reference to a common unit of volume keyed by symbol.  Throws std::exception if the symbol is unknown.\nconst volume& volume_units(const std::string& Symbol);\n\n} // namespace measurement\n\n} // namespace k3d\n\n#endif // !K3DSDK_MEASUREMENT_H\n\n"
  },
  {
    "path": "k3dsdk/mesh.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/type_registry.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iterator>\n#include <map>\n\nnamespace k3d\n{\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// difference::test\n\n/// Return the difference between two shared arrays (handles \"fuzzy\" floating-point comparisons).\nnamespace difference\n{\n\ntemplate<typename T>\nvoid test(const pipeline_data<typed_array<T> >& A, const pipeline_data<typed_array<T> >& B, accumulator& Result)\n{\n\tif(A && B)\n\t\tA->difference(*B, Result);\n\telse if(!A && !B)\n\t\tResult.exact(true);\n\telse\n\t\tResult.exact(false);\n}\n\n/// Return the difference between two shared arrays (handles \"fuzzy\" floating-point comparisons).\nvoid test(const pipeline_data<uint_t_array>& A, const pipeline_data<uint_t_array>& B, accumulator& Result)\n{\n\tif(A && B)\n\t\tA->difference(*B, Result);\n\telse if(!A && !B)\n\t\tResult.exact(true);\n\telse\n\t\tResult.exact(false);\n}\n\n/// Return the difference between two shared objects (handles \"fuzzy\" floating-point comparisons).\ntemplate<typename T>\nvoid test(const pipeline_data<T>& A, const pipeline_data<T>& B, accumulator& Result)\n{\n\tif(A && B)\n\t\tk3d::difference::test(*A, *B, Result);\n\telse if(!A && !B)\n\t\tResult.exact(true);\n\telse\n\t\tResult.exact(false);\n}\n\n/// Return the difference between two sets of primitives.\nvoid test(const mesh::primitives_t& A, const mesh::primitives_t& B, accumulator& Result)\n{\n\t// If they have differing numbers of primitives, they definitely aren't equal\n\tResult.exact(A.size() == B.size());\n\n\tfor(mesh::primitives_t::const_iterator a = A.begin(), b = B.begin(); a != A.end() && b != B.end(); ++a, ++b)\n\t{\n\t\tif(a->get() && b->get())\n\t\t\t(**a).difference((**b), Result);\n\t\telse if(!a->get() && !b->get())\n\t\t\tResult.exact(true);\n\t\telse\n\t\t\tResult.exact(false);\n\t}\n}\n\n} // namespace difference\n\n////////////////////////////////////////////////////////////////////////////////////\n// mesh\n\nmesh::mesh()\n{\n}\n\nvoid mesh::difference(const mesh& Other, difference::accumulator& Result) const\n{\n\tk3d::difference::test(points, Other.points, Result);\n\tk3d::difference::test(point_selection, Other.point_selection, Result);\n\tk3d::difference::test(point_attributes, Other.point_attributes, Result);\n\tk3d::difference::test(primitives, Other.primitives, Result);\n}\n\nnamespace detail\n{\n\n/// Helper function used by lookup_unused_points()\nvoid mark_used_points(const mesh::indices_t& PrimitivePoints, mesh::bools_t& UnusedPoints)\n{\n\tconst uint_t begin = 0;\n\tconst uint_t end = PrimitivePoints.size();\n\tfor(uint_t i = begin; i != end; ++i)\n\t\tUnusedPoints[PrimitivePoints[i]] = false;\n}\n\n/// Helper object used by lookup_unused_points()\nstruct mark_used_primitive_points\n{\n\tmark_used_primitive_points(mesh::bools_t& UnusedPoints) :\n\t\tunused_points(UnusedPoints)\n\t{\n\t}\n\n\tvoid operator()(const string_t&, const table&, const string_t&, const pipeline_data<array>& Array)\n\t{\n\t\tif(Array->get_metadata_value(metadata::key::domain()) != metadata::value::point_indices_domain())\n\t\t\treturn;\n\n\t\tif(const mesh::indices_t* const array = dynamic_cast<const mesh::indices_t*>(Array.get()))\n\t\t\tmark_used_points(*array, unused_points);\n\t}\n\n\tmesh::bools_t& unused_points;\n};\n\n} // namespace detail\n\nconst bounding_box3 mesh::bounds(const mesh& Mesh)\n{\n\treturn Mesh.points ? bounds(*Mesh.points) : bounding_box3();\n}\n\nconst bounding_box3 mesh::bounds(const points_t& Points)\n{\n\tbounding_box3 results;\n\n\tconst uint_t point_begin = 0;\n\tconst uint_t point_end = point_begin + Points.size();\n\tfor(uint_t point = point_begin; point != point_end; ++point)\n\t\tresults.insert(Points[point]);\n\n\treturn results;\n}\n\nvoid mesh::deep_copy(const mesh& From, mesh& To)\n{\n\tTo = From;\n\tassert_not_implemented(); // Need to ensure that all storage is unique\n}\n\nvoid mesh::lookup_unused_points(const mesh& Mesh, mesh::bools_t& UnusedPoints)\n{\n\tUnusedPoints.assign(Mesh.points ? Mesh.points->size() : 0, true);\n\tvisit_arrays(Mesh, detail::mark_used_primitive_points(UnusedPoints));\n}\n\nvoid mesh::create_index_removal_map(const mesh::bools_t& KeepIndices, mesh::indices_t& IndexMap)\n{\n\tIndexMap.resize(KeepIndices.size());\n\n\tconst uint_t begin = 0;\n\tconst uint_t end = KeepIndices.size();\n\tfor(uint_t current_index = begin, new_index = begin; current_index != end; ++current_index)\n\t{\n\t\tIndexMap[current_index] = new_index;\n\t\tif(!KeepIndices[current_index])\n\t\t\t++new_index;\n\t}\n}\n\nvoid mesh::create_index_list(const mesh::bools_t& SelectedIndices, mesh::indices_t& IndexSet)\n{\n\tIndexSet.resize(0);\n\n\tconst uint_t begin = 0;\n\tconst uint_t end = SelectedIndices.size();\n\tfor(uint_t index = begin; index != end; ++index)\n\t{\n\t\tif(SelectedIndices[index])\n\t\t\tIndexSet.push_back(index);\n\t}\n}\n\nnamespace detail\n{\n\n/// Helper function used by delete_points()\nvoid remap_points(mesh::indices_t& PrimitivePoints, const mesh::indices_t& PointMap)\n{\n\tconst uint_t begin = 0;\n\tconst uint_t end = PrimitivePoints.size();\n\tfor(uint_t i = begin; i != end; ++i)\n\t\tPrimitivePoints[i] = PointMap[PrimitivePoints[i]];\n}\n\n/// Helper object used by delete_points()\nstruct remap_primitive_points\n{\n\tremap_primitive_points(const mesh::indices_t& PointMap) :\n\t\tpoint_map(PointMap)\n\t{\n\t}\n\n\tvoid operator()(const string_t&, const table&, const string_t&, pipeline_data<array>& Array)\n\t{\n\t\tif(Array->get_metadata_value(metadata::key::domain()) != metadata::value::point_indices_domain())\n\t\t\treturn;\n\n\t\tif(mesh::indices_t* const array = dynamic_cast<mesh::indices_t*>(&Array.writable()))\n\t\t\tremap_points(*array, point_map);\n\t}\n\n\tconst mesh::indices_t& point_map;\n};\n\n} // namespace detail\n\nvoid mesh::remap_points(mesh& Mesh, const mesh::indices_t& PointMap)\n{\n\tvisit_arrays(Mesh, detail::remap_primitive_points(PointMap));\n}\n\nvoid mesh::delete_points(mesh& Mesh, const mesh::bools_t& Points)\n{\n\tmesh::indices_t point_map;\n\tdelete_points(Mesh, Points, point_map);\n}\n\nvoid mesh::delete_points(mesh& Mesh, const mesh::bools_t& Points, mesh::indices_t& PointMap)\n{\n\t// Enforce preconditions ...\n\treturn_if_fail(Mesh.points);\n\treturn_if_fail(Mesh.point_selection);\n\treturn_if_fail(Mesh.points->size() == Mesh.point_selection->size());\n\treturn_if_fail(Mesh.points->size() == Mesh.point_attributes.row_count() || 0 == Mesh.point_attributes.column_count());\n\n\t// Count how many points will be left when we're done ...\n\tconst uint_t points_remaining = std::count(Points.begin(), Points.end(), false);\n\n\t// Create a mapping from current point indices to indices after we've removed points ...\n\tcreate_index_removal_map(Points, PointMap);\n\n\t// Move leftover points, point selections, and attributes into their final positions ...\n\tmesh::points_t& points = Mesh.points.writable();\n\tmesh::selection_t& point_selection = Mesh.point_selection.writable();\n\ttable_copier point_attributes(Mesh.point_attributes);\n\n\tconst uint_t point_begin = 0;\n\tconst uint_t point_end = point_begin + Points.size();\n\tfor(uint_t point = point_begin; point != point_end; ++point)\n\t{\n\t\tif(Points[point])\n\t\t\tcontinue;\n\t\t\n\t\tpoints[PointMap[point]] = points[point];\n\t\tpoint_selection[PointMap[point]] = point_selection[point];\n\t\tpoint_attributes.copy(point, PointMap[point]);\n\t}\n\n\t// Update generic mesh primitives so they use the correct indices ...\n\tvisit_arrays(Mesh, detail::remap_primitive_points(PointMap));\n\n\t// Free leftover memory ...\n\tpoints.resize(points_remaining);\n\tpoint_selection.resize(points_remaining);\n\tMesh.point_attributes.set_row_count(points_remaining);\n}\n\nnamespace detail\n{\n\nclass offset_point_indices\n{\npublic:\n\toffset_point_indices(const uint_t Offset) :\n\t\toffset(Offset)\n\t{\n\t}\n\n\tvoid operator()(const string_t&, const table&, const string_t& ArrayName, pipeline_data<array>& Array)\n\t{\n\t\tif(Array->get_metadata_value(metadata::key::domain()) != metadata::value::point_indices_domain())\n\t\t\treturn;\n\n\t\tuint_t_array* const array = dynamic_cast<uint_t_array*>(&Array.writable());\n\t\tif(!array)\n\t\t{\n\t\t\tlog() << error << \"array [\" << ArrayName << \"] must be a k3d::uint_t_array.\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tstd::transform(array->begin(), array->end(), array->begin(), std::bind2nd(std::plus<uint_t>(), offset));\n\t}\n\nprivate:\n\tconst uint_t offset;\t\n};\n\n} // namespace detail\n\nvoid mesh::append(const mesh& Source, mesh& Target, uint_t* const PointBegin, uint_t* const PointEnd, uint_t* const PrimitiveBegin, uint_t* const PrimitiveEnd)\n{\n\tconst uint_t point_begin = Target.points ? Target.points->size() : 0;\n\tif(PointBegin)\n\t\t*PointBegin = point_begin;\n\n\tif(PrimitiveBegin)\n\t\t*PrimitiveBegin = Target.primitives.size();\n\n\t// Append source points to the target ...\n\tif(Source.points)\n\t{\n\t\tmesh::points_t& target_points = Target.points ? Target.points.writable() : Target.points.create();\n\t\ttarget_points.insert(target_points.end(), Source.points->begin(), Source.points->end());\n\t}\n\n\tif(Source.point_selection)\n\t{\n\t\tmesh::selection_t& target_point_selection = Target.point_selection ? Target.point_selection.writable() : Target.point_selection.create();\n\t\ttarget_point_selection.insert(target_point_selection.end(), Source.point_selection->begin(), Source.point_selection->end());\n\t}\n\n\t// Append source primitives to the target ...\n\tfor(mesh::primitives_t::const_iterator primitive = Source.primitives.begin(); primitive != Source.primitives.end(); ++primitive)\n\t{\n\t\tTarget.primitives.push_back(*primitive);\n\t\tmesh::primitive& new_primitive = Target.primitives.back().writable();\n\n\t\tif(point_begin)\n\t\t\tmesh::visit_arrays(new_primitive, detail::offset_point_indices(point_begin));\n\t}\n\n\tif(PointEnd)\n\t\t*PointEnd = Target.points ? Target.points->size() : 0;\n\n\tif(PrimitiveEnd)\n\t\t*PrimitiveEnd = Target.primitives.size();\n}\n\n////////////////////////////////////////////////////////////////////////////////////\n// mesh::primitive\n\nmesh::primitive::primitive()\n{\n}\n\nmesh::primitive::primitive(const string_t& Type) :\n\ttype(Type)\n{\n}\n\nvoid mesh::primitive::difference(const primitive& Other, difference::accumulator& Result) const\n{\n\tk3d::difference::test(type, Other.type, Result);\n\tk3d::difference::test(structure, Other.structure, Result);\n\tk3d::difference::test(attributes, Other.attributes, Result);\n}\n\n////////////////////////////////////////////////////////////////////////////////////\n// mesh::primitives_t\n\nmesh::primitive& mesh::primitives_t::create(const string_t& Type)\n{\n\tpush_back(pipeline_data<mesh::primitive>());\n\treturn back().create(new mesh::primitive(Type));\n}\n\n////////////////////////////////////////////////////////////////////////////////////\n// operator<<\n\nstd::ostream& operator<<(std::ostream& Stream, const mesh& RHS)\n{\n\tif(RHS.points)\n\t{\n\t\tStream << standard_indent << \"points (\" << RHS.points->size() << \"):\\n\";\n\t\tStream << push_indent << start_block() << *RHS.points << finish_block << pop_indent << \"\\n\";\n\t}\n\n\tif(RHS.point_selection)\n\t{\n\t\tStream << standard_indent << \"point_selection (\" << RHS.point_selection->size() << \"):\\n\";\n\t\tStream << push_indent << start_block() << *RHS.point_selection << finish_block << pop_indent << \"\\n\";\n\t}\n\n\tStream << standard_indent << \"point_attributes (\" << RHS.point_attributes.row_count() << \"):\\n\";\n\tStream << push_indent << RHS.point_attributes << pop_indent;\n\n\tStream << standard_indent << \"primitives (\" << RHS.primitives.size() << \"):\\n\" << push_indent;\n\tfor(mesh::primitives_t::const_iterator primitive = RHS.primitives.begin(); primitive != RHS.primitives.end(); ++primitive)\n\t\tStream << **primitive;\n\tStream << pop_indent;\n\n\treturn Stream;\n}\n\n////////////////////////////////////////////////////////////////////////////////////\n// operator<<\n\nstd::ostream& operator<<(std::ostream& Stream, const mesh::primitive& RHS)\n{\n\tStream << standard_indent << \"primitive \\\"\" << RHS.type << \"\\\"\\n\" << push_indent;\n\tStream << standard_indent << \"structure (\" << RHS.structure.size() << \"):\\n\";\n\tStream << push_indent << RHS.structure << pop_indent;\n\tStream << standard_indent << \"attributes (\" << RHS.attributes.size() << \"):\\n\";\n\tStream << push_indent << RHS.attributes << pop_indent;\n\tStream << pop_indent;\n\n\treturn Stream;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/mesh.h",
    "content": "#ifndef K3DSDK_MESH_H\n#define K3DSDK_MESH_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/bounding_box3.h>\n#include <k3dsdk/named_arrays.h>\n#include <k3dsdk/named_array_types.h>\n#include <k3dsdk/named_tables.h>\n#include <k3dsdk/pipeline_data.h>\n#include <k3dsdk/table.h>\n#include <k3dsdk/typed_array.h>\n#include <k3dsdk/uint_t_array.h>\n\nnamespace k3d\n{\n\nclass imaterial;\nclass mesh_selection;\n\n////////////////////////////////////////////////////////////////////////////////\n// mesh\n\n/// Encapsulates a hetereogenous collection of geometric primitives.\nclass mesh\n{\npublic:\n\tmesh();\n\n\t/// Defines storage for a collection of indices.\n\ttypedef uint_t_array indices_t;\n\t/// Defines storage for a collection of counts.\n\ttypedef uint_t_array counts_t;\n\t/// Defines storage for a collection of orders.\n\ttypedef uint_t_array orders_t;\n\t/// Defines storage for a collection of weights.\n\ttypedef typed_array<double_t> weights_t;\n\t/// Defines storage for a collection of knot vectors.\n\ttypedef typed_array<double_t> knots_t;\n\t/// Defines storage for gprim selection state.\n\ttypedef typed_array<double_t> selection_t;\n\t/// Defines storage for gprim materials.\n\ttypedef typed_array<imaterial*> materials_t;\n\t/// Defines storage for a generic collection of boolean values.\n\ttypedef typed_array<bool_t> bools_t;\n\t/// Defines storage for a generic collection of colors.\n\ttypedef typed_array<color> colors_t;\n\t/// Defines storage for a generic collection of floating-point values.\n\ttypedef typed_array<double_t> doubles_t;\n\t/// Defines storage for a generic collection of 4x4 matrices.\n\ttypedef typed_array<matrix4> matrices_t;\n\t/// Defines storage for a generic collection of 3D normals.\n\ttypedef typed_array<normal3> normals_t;\n\t/// Defines storage for a generic collection of 2D points.\n\ttypedef typed_array<point2> points_2d_t;\n\t/// Defines storage for a generic collection of 3D points.\n\ttypedef typed_array<point3> points_t;\n\t/// Defines storage for a generic collection of strings.\n\ttypedef typed_array<string_t> strings_t;\n\t/// Defines storage for a generic collection of 3D texture coordinates.\n\ttypedef typed_array<texture3> texture_coordinates_t;\n\t/// Defines storage for a generic collection of 3D vectors.\n\ttypedef typed_array<vector3> vectors_t;\n\t/// Defines a heterogeneous collection of named, shared arrays with varying lengths.\n\ttypedef k3d::named_arrays named_arrays_t;\n\t/// Defines a heterogeneous collection of named, shared arrays with identical length.\n\ttypedef k3d::table table_t;\n\t/// Defines a named collection of attribute arrays.\n\ttypedef k3d::named_tables named_tables_t;\n\n\t/// Defines storage for a generic mesh primitive.\n\tclass primitive\n\t{\n\tpublic:\n\t\tprimitive();\n\t\tprimitive(const string_t& Type);\n\n\t\t/// Stores the primitive type (\"point_groups\", \"polyhedra\", \"teapot\", etc).\n\t\tstring_t type;\n\t\t/// Stores array data that defines the primitive's structure (topology and geometry).\n\t\tnamed_tables_t structure;\n\t\t/// Stores array data that defines the primitive's attributes.\n\t\tnamed_tables_t attributes;\n\n\t\t/// Returns the difference between two primitives using the fuzzy semantics of difference::test().\n\t\tvoid difference(const primitive& Other, difference::accumulator& Result) const;\n\t};\n\n\t/// Defines storage for a collection of primitives.\n\tclass primitives_t :\n\t\tpublic std::vector<pipeline_data<primitive> >\n\t{\n\tpublic:\n\t\t/// Create a new primitive, appending it to the collection.\n\t\tprimitive& create(const string_t& Type);\n\t};\n\n\t/// Stores the set of mesh points.\n\tpipeline_data<points_t> points;\n\t/// Stores per-point selection state.\n\tpipeline_data<selection_t> point_selection;\n\t/// Stores user-defined per-point data (maps to RenderMan vertex data).\n\ttable_t point_attributes;\n\t/// Stores mesh primitives.\n\tprimitives_t primitives;\n\n\t/// Returns the difference between two meshes using the fuzzy semantics of difference::test().\n\tvoid difference(const mesh& Other, difference::accumulator& Result) const;\n\n\t/// Returns a bounding-box containing every point in the given mesh.\n\tstatic const bounding_box3 bounds(const mesh& Mesh);\n\t/// Returns a bounding-box containing every point in the given array.\n\tstatic const bounding_box3 bounds(const points_t& Points);\n\n\t/// Converts a bitmap marking indices to be removed from a contiguous set into a map.\n\tstatic void create_index_removal_map(const mesh::bools_t& KeepIndices, mesh::indices_t& IndexMap);\n\t/// Converts a bitmap marking indices in a range to a set of selected indices.\n\tstatic void create_index_list(const mesh::bools_t& SelectedIndices, mesh::indices_t& IndexSet);\n\t/// Initialize an array to mark unused mesh points (points not used by any primitive).\n\tstatic void lookup_unused_points(const mesh& Mesh, mesh::bools_t& UnusedPoints);\n\t/// Remaps point indices in every primitive in a mesh.\n\tstatic void remap_points(mesh& Mesh, const mesh::indices_t& PointMap);\n\t/// Remove points from a mesh, adjusting point indices in all remaining primitives.\n\tstatic void delete_points(mesh& Mesh, const mesh::bools_t& Points);\n\t/// Remove points from a mesh, adjusting point indices in all remaining primitives, returning an array that maps original point indices to new point indices.\n\tstatic void delete_points(mesh& Mesh, const mesh::bools_t& Points, mesh::indices_t& PointMap);\n\t/// Performs a deep-copy from one mesh to another (the new mesh doesn't share any memory with the old).\n\tstatic void deep_copy(const mesh& From, mesh& To);\n\n\t/// Iterates over every array in a generic mesh primitive, passing the array name and array to a functor.\n\ttemplate<typename FunctorT>\n\tstatic void visit_arrays(const mesh::primitive& Primitive, FunctorT Functor)\n\t{\n\t\tfor(mesh::named_tables_t::const_iterator structure = Primitive.structure.begin(); structure != Primitive.structure.end(); ++structure)\n\t\t{\n\t\t\tfor(mesh::table_t::const_iterator array = structure->second.begin(); array != structure->second.end(); ++array)\n\t\t\t\tFunctor(structure->first, structure->second, array->first, array->second);\n\t\t}\n\n\t\tfor(mesh::named_tables_t::const_iterator attributes = Primitive.attributes.begin(); attributes != Primitive.attributes.end(); ++attributes)\n\t\t{\n\t\t\tfor(mesh::table_t::const_iterator array = attributes->second.begin(); array != attributes->second.end(); ++array)\n\t\t\t\tFunctor(attributes->first, attributes->second, array->first, array->second);\n\t\t}\n\t}\n\n\t/// Iterates over every array in a generic mesh primitive, passing the array name and array to a functor.\n\ttemplate<typename FunctorT>\n\tstatic void visit_arrays(mesh::primitive& Primitive, FunctorT Functor)\n\t{\n\t\tfor(mesh::named_tables_t::iterator structure = Primitive.structure.begin(); structure != Primitive.structure.end(); ++structure)\n\t\t{\n\t\t\tfor(mesh::named_arrays_t::iterator array = structure->second.begin(); array != structure->second.end(); ++array)\n\t\t\t\tFunctor(structure->first, structure->second, array->first, array->second);\n\t\t}\n\n\t\tfor(mesh::named_tables_t::iterator attributes = Primitive.attributes.begin(); attributes != Primitive.attributes.end(); ++attributes)\n\t\t{\n\t\t\tfor(mesh::table_t::iterator array = attributes->second.begin(); array != attributes->second.end(); ++array)\n\t\t\t\tFunctor(attributes->first, attributes->second, array->first, array->second);\n\t\t}\n\t}\n\n\t/// Iterates over every array in every generic primitive in the given mesh, passing the array name and array to a functor.\n\ttemplate<typename FunctorT>\n\tstatic void visit_arrays(const mesh& Mesh, FunctorT Functor)\n\t{\n\t\tfor(mesh::primitives_t::const_iterator p = Mesh.primitives.begin(); p != Mesh.primitives.end(); ++p)\n\t\t\tvisit_arrays(**p, Functor);\n\t}\n\n\t/// Iterates over every array in every generic primitive in the given mesh, passing the array name and array to a functor.\n\ttemplate<typename FunctorT>\n\tstatic void visit_arrays(mesh& Mesh, FunctorT Functor)\n\t{\n\t\tfor(mesh::primitives_t::iterator p = Mesh.primitives.begin(); p != Mesh.primitives.end(); ++p)\n\t\t\tvisit_arrays(p->writable(), Functor);\n\t}\n\n\t/// Combines two meshes by appending every point / primitive from one to the other.  Primitive point indices are automatically\n\t/// offset to reflect the new position(s) of points in the combined mesh.  Returns the range of point and primitive indices that were appended.\n\tstatic void append(const mesh& Source, mesh& Target, uint_t* const PointBegin = 0, uint_t* const PointEnd = 0, uint_t* const PrimitiveBegin = 0, uint_t* const PrimitiveEnd = 0);\n};\n\n/// Stream serialization\nstd::ostream& operator<<(std::ostream& Stream, const mesh& RHS);\nstd::ostream& operator<<(std::ostream& Stream, const mesh::primitive& RHS);\n\n/// Specialization of difference::test for k3d::mesh\nnamespace difference\n{\n\ninline void test(const k3d::mesh& A, const k3d::mesh& B, accumulator& Result)\n{\n\tA.difference(B, Result);\n}\n\n/// Specialization of difference::test for k3d::mesh::primitive\ninline void test(const k3d::mesh::primitive& A, const k3d::mesh::primitive& B, accumulator& Result)\n{\n\tA.difference(B, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_MESH_H\n\n"
  },
  {
    "path": "k3dsdk/mesh_deformation_modifier.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/mesh_deformation_modifier.h>\n\nnamespace k3d\n{\n\nmesh_deformation_modifier::mesh_deformation_modifier(iplugin_factory& Factory, idocument& Document) :\n\tbase(Factory, Document)\n{\n}\n\nvoid mesh_deformation_modifier::on_create_mesh(const mesh& Input, mesh& Output)\n{\n\tOutput = Input;\n}\n\nvoid mesh_deformation_modifier::on_update_mesh(const mesh& Input, mesh& Output)\n{\n\tif(!Input.points)\n\t\treturn;\n\tif(!Output.points)\n\t\treturn;\n\treturn_if_fail(Input.points->size() == Output.points->size());\n\n\tgeometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\treturn_if_fail(Output.point_selection);\n\treturn_if_fail(Output.point_selection->size() == Output.points->size());\n\n\tconst mesh::points_t& input_points = *Input.points;\n\tconst mesh::selection_t& selection = *Output.point_selection;\n\tmesh::points_t& output_points = Output.points.writable();\n\n\ton_deform_mesh(Input, input_points, selection, output_points);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/mesh_deformation_modifier.h",
    "content": "#ifndef K3DSDK_MESH_DEFORMATION_MODIFIER_H\n#define K3DSDK_MESH_DEFORMATION_MODIFIER_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n\nnamespace k3d\n{\n\n/// Mesh modifier implementation for use in plugins that deform a mesh (modify its points) without altering topology.  To create a plugin, derive from mesh_deformation_modifier and implement the on_deform_mesh() method.\nclass mesh_deformation_modifier :\n\tpublic mesh_selection_sink<mesh_modifier<node > >\n{\n\ttypedef mesh_selection_sink<mesh_modifier<node > > base;\n\npublic:\n\tmesh_deformation_modifier(iplugin_factory& Factory, idocument& Document);\n\nprivate:\n\tvoid on_create_mesh(const mesh& Input, mesh& Output);\n\tvoid on_update_mesh(const mesh& Input, mesh& Output);\n\n\t/// Implement this method in derived classes and deform the output points as-desired.\n\tvirtual void on_deform_mesh(const mesh& Input, const mesh::points_t& InputPoints, const mesh::selection_t& PointSelection, mesh::points_t& OutputPoints) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_MESH_DEFORMATION_MODIFIER_H\n\n"
  },
  {
    "path": "k3dsdk/mesh_modifier.h",
    "content": "#ifndef K3DSDK_MESH_MODIFIER_H\n#define K3DSDK_MESH_MODIFIER_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\ntemplate<typename base_t>\nclass mesh_modifier :\n\tpublic base_t,\n\tpublic imesh_sink,\n\tpublic imesh_source\n{\npublic:\n\tmesh_modifier(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_input_mesh(init_owner(*this) + init_name(\"input_mesh\") + init_label(_(\"Input Mesh\")) + init_description(_(\"Input mesh\")) + init_value<mesh*>(0)),\n\t\tm_output_mesh(init_owner(*this) + init_name(\"output_mesh\") + init_label(_(\"Output Mesh\")) + init_description(_(\"Output mesh\")))\n\t{\n\t\tm_input_mesh.changed_signal().connect(make_reset_mesh_slot());\n\n\t\tm_output_mesh.set_initialize_slot(sigc::mem_fun(*this, &mesh_modifier<base_t>::initialize_mesh));\n\t\tm_output_mesh.set_update_slot(sigc::mem_fun(*this, &mesh_modifier<base_t>::update_mesh));\n\t}\n\n\tiproperty& mesh_source_output()\n\t{\n\t\treturn m_output_mesh;\n\t}\n\n\tiproperty& mesh_sink_input()\n\t{\n\t\treturn m_input_mesh;\n\t}\n\n\tsigc::slot<void, ihint*> make_reset_mesh_slot()\n\t{\n\t\treturn m_output_mesh.make_reset_slot();\n\t}\n\n\tsigc::slot<void, ihint*> make_update_mesh_slot()\n\t{\n\t\treturn m_output_mesh.make_update_slot();\n\t}\n\nprotected:\n\tk3d_data(mesh*, data::immutable_name, data::change_signal, data::no_undo, data::local_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_input_mesh;\n\tk3d_data(mesh*, data::immutable_name, data::change_signal, data::no_undo, data::pointer_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_output_mesh;\n\nprivate:\n\tvoid initialize_mesh(mesh& Output)\n\t{\n\t\tif(const mesh* const input = m_input_mesh.pipeline_value())\n\t\t{\n\t\t\tbase_t::document().pipeline_profiler().start_execution(*this, \"Create Mesh\");\n\t\t\ton_create_mesh(*input, Output);\n\t\t\tbase_t::document().pipeline_profiler().finish_execution(*this, \"Create Mesh\");\n\n\t\t\tbase_t::document().pipeline_profiler().start_execution(*this, \"Update Mesh\");\n\t\t\ton_update_mesh(*input, Output);\n\t\t\tbase_t::document().pipeline_profiler().finish_execution(*this, \"Update Mesh\");\n\t\t}\n\t}\n\n\tvoid update_mesh(mesh& Output)\n\t{\n\t\tif(const mesh* const input = m_input_mesh.pipeline_value())\n\t\t{\n\t\t\tbase_t::document().pipeline_profiler().start_execution(*this, \"Update Mesh\");\n\t\t\ton_update_mesh(*input, Output);\n\t\t\tbase_t::document().pipeline_profiler().finish_execution(*this, \"Update Mesh\");\n\t\t}\n\t}\n\n\tvirtual void on_create_mesh(const mesh& Input, mesh& Output) = 0;\n\tvirtual void on_update_mesh(const mesh& Input, mesh& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_MESH_MODIFIER_H\n\n"
  },
  {
    "path": "k3dsdk/mesh_painter_gl.h",
    "content": "#ifndef K3DSDK_MESH_PAINTER_GL_H\n#define K3DSDK_MESH_PAINTER_GL_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/utility_gl.h>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\n/// Provides a boilerplate implementation of k3d::gl::imesh_painter\nclass mesh_painter :\n\tpublic node,\n\tpublic imesh_painter\n{\n\ttypedef node base;\n\npublic:\n\tmesh_painter(iplugin_factory& Factory, idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_enabled(init_owner(*this) + init_name(\"enabled\") + init_label(_(\"Enabled\")) + init_description(_(\"Enable / disable drawing for this painter.\")) + init_value(true))\n\t{\n\t\tm_enabled.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid paint_mesh(const mesh& Mesh, const painter_render_state& RenderState, iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(m_enabled.pipeline_value())\n\t\t\ton_paint_mesh(Mesh, RenderState, ChangedSignal);\n\t}\n\n\tvoid select_mesh(const mesh& Mesh, const painter_render_state& RenderState, const painter_selection_state& SelectionState, iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(m_enabled.pipeline_value())\n\t\t\ton_select_mesh(Mesh, RenderState, SelectionState, ChangedSignal);\n\t}\n\nprotected:\n\t/// Returns a slot that will schedule an asynchronous screen update when called\n\tsigc::slot<void, ihint*> make_async_redraw_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &mesh_painter::async_redraw);\n\t}\n\n\t/// Schedules an asynchronous screen update\n\tvoid async_redraw(ihint*)\n\t{\n\t\tredraw_all(document(), irender_viewport::ASYNCHRONOUS);\n\t}\n\n\t/// Implement this in derived classes to draw mesh components\n\tvirtual void on_paint_mesh(const mesh& Mesh, const painter_render_state& RenderState, iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t}\n\n\t/// Implement this in derived classes to draw mesh components for selection\n\tvirtual void on_select_mesh(const mesh& Mesh, const painter_render_state& RenderState, const painter_selection_state& SelectionState, iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t}\n\n\t/// Used to enable/disable the painter\n\tk3d_data(bool, data::immutable_name, data::change_signal, data::with_undo, data::local_storage, data::no_constraint, data::writable_property, data::with_serialization) m_enabled;\n};\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_MESH_PAINTER_GL_H\n\n"
  },
  {
    "path": "k3dsdk/mesh_reader.h",
    "content": "#ifndef K3DSDK_MESH_READER_H\n#define K3DSDK_MESH_READER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/imesh_storage.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/pointer_demand_storage.h>\n#include <k3dsdk/user_interface.h>\n#include <k3dsdk/watched_path_property.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_reader\n\ntemplate<typename base_t>\nclass mesh_reader :\n\tpublic base_t,\n\tpublic imesh_source,\n\tpublic imesh_storage\n{\npublic:\n\tiproperty& mesh_source_output()\n\t{\n\t\treturn m_output_mesh;\n\t}\n\n\tvoid reset_mesh(mesh* const Mesh)\n\t{\n\t\tm_output_mesh.reset(Mesh);\n\t}\n\n\t/// Returns a slot that should be connected to input properties to signal that the output mesh has changed\n\tsigc::slot<void, ihint*> make_reload_mesh_slot()\n\t{\n\t\treturn m_output_mesh.make_slot();\n\t}\n\nprotected:\n\tmesh_reader(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Input file path.\")) + init_value(filesystem::path()) + init_path_mode(ipath_property::READ) + init_path_type(\"\")),\n\t\tm_center(init_owner(*this) + init_name(\"center\") + init_label(_(\"Center on Origin\")) + init_description(_(\"Center the output mesh around the origin.\")) + init_value(true)),\n\t\tm_scale_to_size(init_owner(*this) + init_name(\"scale_to_size\") + init_label(_(\"Scale to Size\")) + init_description(_(\"Scale the output mesh to fit within a fixed-size bounding-box.\")) + init_value(true)),\n\t\tm_size(init_owner(*this) + init_name(\"size\") + init_label(_(\"Size\")) + init_description(_(\"Output mesh size when \\\"Scale to Size\\\" is enabled.\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(measurement::distance))),\n\t\tm_output_mesh(init_owner(*this) + init_name(\"output_mesh\") + init_label(_(\"Output Mesh\")) + init_description(\"Output mesh\"))\n\t{\n\t\tm_file.changed_signal().connect(hint::converter<\n\t\t\thint::convert<hint::any, hint::none> >(make_reload_mesh_slot()));\n\t\tm_center.changed_signal().connect(hint::converter<\n\t\t\thint::convert<hint::any, hint::none> >(make_reload_mesh_slot()));\n\t\tm_scale_to_size.changed_signal().connect(hint::converter<\n\t\t\thint::convert<hint::any, hint::none> >(make_reload_mesh_slot()));\n\t\tm_size.changed_signal().connect(hint::converter<\n\t\t\thint::convert<hint::any, hint::none> >(make_reload_mesh_slot()));\n\n\t\tm_output_mesh.set_update_slot(sigc::mem_fun(*this, &mesh_reader<base_t>::execute));\n\t}\n\n\t/// Stores the input file path.\n\tk3d_data(filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, watched_path_property, watched_path_serialization) m_file;\n\t/// Center the output mesh on the origin.\n\tk3d_data(bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_center;\n\t/// Scale the output mesh to fit within a fixed-size bounding-box.\n\tk3d_data(bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_scale_to_size;\n\t/// Stores the size of the bounding-box used with m_scale_to_size.\n\tk3d_data(double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_size;\n\t/// Stores the output mesh, which is created / updated on-demand.\n\tk3d_data(mesh*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_output_mesh;\n\nprivate:\n\t/// Called whenever the output mesh has been modified and needs to be updated.\n\t/// Note that execution is unaffected by the types of hints we've received.\n\tvoid execute(const std::vector<ihint*>& Hints, mesh& Mesh)\n\t{\n\t\t// Start with an empty mesh ...\n\t\tMesh = mesh();\n\n\t\tconst filesystem::path path = m_file.pipeline_value();\n\t\tif(path.empty())\n\t\t\treturn;\n\t\n\t\tlog() << info << \"Loading \" << path.native_console_string() << \" using \" << base_t::factory().name() << std::endl;\n\n\t\tif(!filesystem::exists(path))\n\t\t{\n\t\t\tlog() << error << \"filesystem path \" << path.native_console_string() << \" doesn't exist\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tbase_t::document().pipeline_profiler().start_execution(*this, \"Load Mesh\");\n\t\ton_load_mesh(path, Mesh);\n\t\tbase_t::document().pipeline_profiler().finish_execution(*this, \"Load Mesh\");\n\n\t\tbase_t::document().pipeline_profiler().start_execution(*this, \"Transform Mesh\");\n\n\t\tif(Mesh.points)\n\t\t{\n\t\t\tconst bool_t center = m_center.pipeline_value();\n\t\t\tconst bool_t scale_to_size = m_scale_to_size.pipeline_value();\n\n\t\t\tbounding_box3 bounding_box;\n\t\t\tmatrix4 transformation = identity3();\n\n\t\t\tmesh::points_t& output_points = Mesh.points.writable();\n\t\t\tif(center || scale_to_size)\n\t\t\t\tbounding_box = mesh::bounds(output_points);\n\n\t\t\tif(center)\n\t\t\t{\n\t\t\t\ttransformation = transformation * translate3(vector3(\n\t\t\t\t\t-0.5 * (bounding_box.px + bounding_box.nx),\n\t\t\t\t\t-0.5 * (bounding_box.py + bounding_box.ny),\n\t\t\t\t\t-0.5 * (bounding_box.pz + bounding_box.nz)));\n\t\t\t}\n\n\t\t\tif(scale_to_size)\n\t\t\t{\n\t\t\t\tconst double_t current_size = std::max(bounding_box.width(), std::max(bounding_box.height(), bounding_box.depth()));\n\t\t\t\tif(current_size)\n\t\t\t\t\ttransformation = scale3(m_size.pipeline_value() / current_size) * transformation;\n\t\t\t}\n\n\t\t\tconst uint_t point_begin = 0;\n\t\t\tconst uint_t point_end = output_points.size();\n\t\t\tfor(uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\toutput_points[point] = transformation * output_points[point];\n\t\t}\n\n\t\tbase_t::document().pipeline_profiler().finish_execution(*this, \"Transform Mesh\");\n\t}\n\n\n\t/// Implement this in derived classes to read the input file and produce an output mesh.  Note that the\n\t/// output mesh will be empty every time this method is called.\n\tvirtual void on_load_mesh(const filesystem::path& Path, mesh& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_MESH_READER_H\n\n"
  },
  {
    "path": "k3dsdk/mesh_selection_modifier.h",
    "content": "#ifndef K3DSDK_MESH_SELECTION_MODIFIER_H\n#define K3DSDK_MESH_SELECTION_MODIFIER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/pointer_demand_storage.h>\n\nnamespace k3d\n{\n\n/// Mesh modifier implementation for use in plugins that alter the selection state of a mesh without altering its topology or geometry.  To create a plugin, derive from mesh_selection_modifier and implement the on_select_mesh() method.\ntemplate<typename base_t>\nclass mesh_selection_modifier :\n\tpublic base_t,\n\tpublic imesh_sink,\n\tpublic imesh_source\n{\npublic:\n\tiproperty& mesh_source_output()\n\t{\n\t\treturn m_output_mesh;\n\t}\n\n\tiproperty& mesh_sink_input()\n\t{\n\t\treturn m_input_mesh;\n\t}\n\n\t/// Returns a slot that should be connected to input properties to signal that the output mesh has changed\n\tsigc::slot<void, ihint*> make_update_mesh_slot()\n\t{\n\t\treturn m_output_mesh.make_slot();\n\t}\n\nprotected:\n\tmesh_selection_modifier(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_input_mesh(init_owner(*this) + init_name(\"input_mesh\") + init_label(_(\"Input Mesh\")) + init_description(_(\"Input mesh\")) + init_value<mesh*>(0)),\n\t\tm_output_mesh(init_owner(*this) + init_name(\"output_mesh\") + init_label(_(\"Output Mesh\")) + init_description(_(\"Output mesh\")))\n\t{\n\t\tm_input_mesh.changed_signal().connect(hint::converter<\n\t\t\thint::convert<hint::any, hint::none> >(make_update_mesh_slot()));\n\n\t\tm_output_mesh.set_update_slot(sigc::mem_fun(*this, &mesh_selection_modifier<base_t>::execute));\n\t}\n\n\t/// Called whenever the output mesh has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, mesh& Mesh)\n\t{\n\t\t// In our case, we don't have to worry about any hints, we just execute.\n\t\tif(const mesh* const input = m_input_mesh.pipeline_value())\n\t\t{\n\t\t\tMesh = *input;\n\t\t\t\n\t\t\tbase_t::document().pipeline_profiler().start_execution(*this, \"Update Selection\");\n\t\t\ton_update_selection(*input, Mesh);\n\t\t\tbase_t::document().pipeline_profiler().finish_execution(*this, \"Update Selection\");\n\t\t}\n\t}\n\n\tk3d_data(mesh*, immutable_name, change_signal, no_undo, local_storage, no_constraint, read_only_property, no_serialization) m_input_mesh;\n\tk3d_data(mesh*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_output_mesh;\n\nprivate:\n\t/// Implement this method in derived classes and alter the output selection(s) as-desired.\n\tvirtual void on_update_selection(const mesh& Input, mesh& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_MESH_SELECTION_MODIFIER_H\n\n"
  },
  {
    "path": "k3dsdk/mesh_selection_sink.h",
    "content": "#ifndef K3DSDK_MESH_SELECTION_SINK_H\n#define K3DSDK_MESH_SELECTION_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/imesh_selection_sink.h>\n#include <k3dsdk/selection.h>\n\nnamespace k3d\n{\n\ntemplate<typename base_t>\nclass mesh_selection_sink :\n\tpublic base_t,\n\tpublic imesh_selection_sink\n{\npublic:\n\tmesh_selection_sink(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_mesh_selection(init_owner(*this) + init_name(\"mesh_selection\") + init_label(_(\"Mesh Selection\")) + init_description(_(\"Input Mesh Selection\")) + init_value(selection::set()))\n\t{\n\t}\n\n\tiproperty& mesh_selection_sink_input()\n\t{\n\t\treturn m_mesh_selection;\n\t}\n\nprotected:\n\tk3d_data(selection::set, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, selection_set_serialization) m_mesh_selection;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_MESH_SELECTION_SINK_H\n\n\n"
  },
  {
    "path": "k3dsdk/mesh_simple_deformation_modifier.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n */\n\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n\nnamespace k3d\n{\n\nmesh_simple_deformation_modifier::mesh_simple_deformation_modifier(iplugin_factory& Factory, idocument& Document) :\n\tbase(Factory, Document)\n{\n\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n}\n\nvoid mesh_simple_deformation_modifier::on_create_mesh(const mesh& Input, mesh& Output)\n{\n\tOutput = Input;\n\tgeometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n}\n\nvoid mesh_simple_deformation_modifier::on_update_mesh(const mesh& Input, mesh& Output)\n{\n\tif(!Input.points)\n\t\treturn;\n\tif(!Output.points)\n\t\treturn;\n\treturn_if_fail(Input.points->size() == Output.points->size());\n\n\treturn_if_fail(Output.point_selection);\n\treturn_if_fail(Output.point_selection->size() == Output.points->size());\n\n\tconst mesh::points_t& input_points = *Input.points;\n\tconst mesh::selection_t& selection = *Output.point_selection;\n\n\tdocument().pipeline_profiler().start_execution(*this, \"Copy points\");\n\tmesh::points_t& output_points = Output.points.writable();\n\tdocument().pipeline_profiler().finish_execution(*this, \"Copy points\");\n\n\ton_deform_mesh(input_points, selection, output_points);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/mesh_simple_deformation_modifier.h",
    "content": "#ifndef K3DSDK_MESH_SIMPLE_DEFORMATION_MODIFIER_H\n#define K3DSDK_MESH_SIMPLE_DEFORMATION_MODIFIER_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n */\n\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n\nnamespace k3d\n{\n\n/// Mesh modifier implementation for use in plugins that deform a mesh (modify its points) without altering topology, and based solely on the input point positions and selection.  To create a plugin, derive from mesh_simple_deformation_modifier and implement the on_deform_mesh() method.  If you are only modifying points but need more information about the input mesh, consider using mesh_deformation_modifier instead. \nclass mesh_simple_deformation_modifier :\n\tpublic mesh_selection_sink<mesh_modifier<node > >\n{\n\ttypedef mesh_selection_sink<mesh_modifier<node > > base;\n\npublic:\n\tmesh_simple_deformation_modifier(iplugin_factory& Factory, idocument& Document);\n\nprivate:\n\tvoid on_create_mesh(const mesh& Input, mesh& Output);\n\tvoid on_update_mesh(const mesh& Input, mesh& Output);\n\n\t/// Implement this method in derived classes and deform the output mesh using its input points and selection.\n\tvirtual void on_deform_mesh(const mesh::points_t& InputPoints, const mesh::selection_t& PointSelection, mesh::points_t& OutputPoints) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_MESH_SIMPLE_DEFORMATION_MODIFIER_H\n\n"
  },
  {
    "path": "k3dsdk/mesh_sink.h",
    "content": "#ifndef K3DSDK_MESH_SINK_H\n#define K3DSDK_MESH_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\ntemplate<typename base_t>\nclass mesh_sink :\n\tpublic base_t,\n\tpublic imesh_sink\n{\npublic:\n\tmesh_sink(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_input_mesh(init_owner(*this) + init_name(\"input_mesh\") + init_label(_(\"Input Mesh\")) + init_description(_(\"Input mesh\")) + init_value<mesh*>(0))\n\t{\n\t}\n\n\tiproperty& mesh_sink_input()\n\t{\n\t\treturn m_input_mesh;\n\t}\n\nprotected:\n\tk3d_data(mesh*, data::immutable_name, data::change_signal, data::no_undo, data::local_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_input_mesh;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_MESH_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/mesh_source.h",
    "content": "#ifndef K3DSDK_MESH_SOURCE_H\n#define K3DSDK_MESH_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/pointer_demand_storage.h>\n\nnamespace k3d\n{\n\ntemplate<typename base_t>\nclass mesh_source :\n\tpublic base_t,\n\tpublic imesh_source\n{\npublic:\n\tiproperty& mesh_source_output()\n\t{\n\t\treturn m_output_mesh;\n\t}\n\n\t/// Returns a slot that should be connected to input properties to signal that the output has changed\n\tsigc::slot<void, ihint*> make_update_mesh_slot()\n\t{\n\t\treturn m_output_mesh.make_slot();\n\t}\n\nprotected:\n\tmesh_source(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_output_mesh(init_owner(*this) + init_name(\"output_mesh\") + init_label(_(\"Output Mesh\")) + init_description(\"Output mesh\"))\n\t{\n\t\tm_output_mesh.set_update_slot(sigc::mem_fun(*this, &mesh_source<base_t>::execute));\n\t}\n\n\t/// Stores the output mesh, which is created / updated on-demand.\n\tk3d_data(mesh*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_output_mesh;\n\nprivate:\n\t/// Called whenever the output has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, mesh& Mesh)\n\t{\n\t\tbool_t update_topology = false;\n\t\tbool_t update_geometry = false;\n\n\t\tfor(uint_t i = 0; i != Hints.size(); ++i)\n\t\t{\n\t\t\t// Update our geometry ...\n\t\t\tif(dynamic_cast<hint::mesh_geometry_changed*>(Hints[i]))\n\t\t\t{\n\t\t\t\tupdate_geometry = true;\n\t\t\t}\n\t\t\t// In all other cases (mesh_topology_changed, unknown hint, or no hint),\n\t\t\t// we must assume the worst and recreate everything from scratch ...\n\t\t\telse\n\t\t\t{\n\t\t\t\tupdate_topology = true;\n\t\t\t\tupdate_geometry = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(update_topology)\n\t\t{\n\t\t\tbase_t::document().pipeline_profiler().start_execution(*this, \"Update Topology\");\n\t\t\ton_update_mesh_topology(Mesh);\n\t\t\tbase_t::document().pipeline_profiler().finish_execution(*this, \"Update Topology\");\n\t\t}\n\n\t\tif(update_geometry)\n\t\t{\n\t\t\tbase_t::document().pipeline_profiler().start_execution(*this, \"Update Geometry\");\n\t\t\ton_update_mesh_geometry(Mesh);\n\t\t\tbase_t::document().pipeline_profiler().finish_execution(*this, \"Update Geometry\");\n\t\t}\n\t}\n\n\t/// Implement this in derived classes to setup the topology of the output mesh.  Note that the \n\t/// output mesh is empty the first time this method is called, but will retain its state thereafter,\n\t/// so implementations must be written to ensure that they don't simply append to the existing state.\n\tvirtual void on_update_mesh_topology(mesh& Output) = 0;\n\n\t/// Implement this in derived classes to setup the geometry of the output mesh.\n\tvirtual void on_update_mesh_geometry(mesh& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_MESH_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/mesh_triangulate_detail.h",
    "content": "#ifndef K3DSDK_MESH_TRIANGULATE_DETAIL_H\n#define K3DSDK_MESH_TRIANGULATE_DETAIL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/sgi_tesselator.h>\n\nnamespace detail\n{\n\ntemplate<typename OutputFaceIterator, typename OutputPointIterator>\nclass glu_triangulator_t\n{\npublic:\n\tglu_triangulator_t(OutputFaceIterator OutputFaces, OutputPointIterator OutputPoints) :\n\t\ttessellator(sgiNewTess()),\n\t\toutput_faces(OutputFaces),\n\t\toutput_points(OutputPoints),\n\t\tcurrent_face(0)\n\t{\n\t\tsgiTessCallback(tessellator, GLU_TESS_BEGIN_DATA, reinterpret_cast<callback_t>(&raw_begin));\n\t\tsgiTessCallback(tessellator, GLU_TESS_VERTEX_DATA, reinterpret_cast<callback_t>(&raw_vertex));\n\t\tsgiTessCallback(tessellator, GLU_TESS_COMBINE_DATA, reinterpret_cast<callback_t>(&raw_combine));\n\t\tsgiTessCallback(tessellator, GLU_TESS_END_DATA, reinterpret_cast<callback_t>(&raw_end));\n\t\tsgiTessCallback(tessellator, GLU_TESS_ERROR_DATA, reinterpret_cast<callback_t>(&raw_error));\n\t}\n\n\t~glu_triangulator_t()\n\t{\n\t\tsgiDeleteTess(tessellator);\n\t}\n\n\tvoid operator()(face& Face)\n\t{\n\t\tcurrent_face = &Face;\n\n\t\tsgiTessBeginPolygon(tessellator, this);\n\n\t\t// Handle the main contour for the face ...\n\t\tsgiTessBeginContour(tessellator);\n\t\tfor(split_edge* edge = Face.first_edge; edge && edge->face_clockwise; edge = edge->face_clockwise)\n\t\t{\n\t\t\tsgiTessVertex(tessellator, edge->vertex->position.n, edge->vertex);\n\t\t\tif(edge->face_clockwise == Face.first_edge)\n\t\t\t\tbreak;\n\t\t}\n\t\tsgiTessEndContour(tessellator);\n\n\t\t// Handle holes ...\n\t\tfor(face::holes_t::const_iterator hole = Face.holes.begin(); hole != Face.holes.end(); ++hole)\n\t\t{\n\t\t\tsgiTessBeginContour(tessellator);\n\t\t\tfor(split_edge* edge = *hole; edge && edge->face_clockwise; edge = edge->face_clockwise)\n\t\t\t{\n\t\t\t\tsgiTessVertex(tessellator, edge->vertex->position.n, edge->vertex);\n\t\t\t\tif(edge->face_clockwise == *hole)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tsgiTessEndContour(tessellator);\n\t\t}\n\n\t\tsgiTessEndPolygon(tessellator);\n\t}\n\nprivate:\n\tvoid begin(GLenum Mode)\n\t{\n\t\tmode = Mode;\n\t\tv0 = v1 = v2 = 0;\n\t\tflip_strip = false;\n\t}\n\n\tvoid vertex(void* VertexData)\n\t{\n\t\tif(!v0)\n\t\t{\n\t\t\tv0 = v1;\n\t\t\tv1 = v2;\n\t\t}\n\t\tv2 = reinterpret_cast<point*>(VertexData);\n\n\t\tif(!v0)\n\t\t\treturn;\n\n\t\tstd::vector<split_edge*> new_edges;\n\t\tswitch(mode)\n\t\t{\n\t\t\tcase GL_TRIANGLE_FAN:\n\t\t\t\tnew_edges.push_back(new split_edge(v0));\n\t\t\t\tnew_edges.push_back(new split_edge(v1));\n\t\t\t\tnew_edges.push_back(new split_edge(v2));\n\t\t\t\tbreak;\n\t\t\tcase GL_TRIANGLE_STRIP:\n\t\t\t\tnew_edges.push_back(new split_edge(v0));\n\t\t\t\tnew_edges.push_back(new split_edge(v1));\n\t\t\t\tnew_edges.push_back(new split_edge(v2));\n\t\t\t\tif(flip_strip)\n\t\t\t\t\tstd::reverse(new_edges.begin(), new_edges.end());\n\t\t\t\tbreak;\n\t\t\tcase GL_TRIANGLES:\n\t\t\t\tnew_edges.push_back(new split_edge(v0));\n\t\t\t\tnew_edges.push_back(new split_edge(v1));\n\t\t\t\tnew_edges.push_back(new split_edge(v2));\n\t\t\t\tbreak;\n\t\t}\n\t\tloop_edges(new_edges.begin(), new_edges.end());\n\n\t\tface* const new_face = new face(*current_face);\n\t\tnew_face->holes.clear();\n\t\tnew_face->first_edge = new_edges.front();\n\t\t*output_faces++ = new_face;\n\n\t\tswitch(mode)\n\t\t{\n\t\t\tcase GL_TRIANGLE_FAN:\n\t\t\t\tv1 = v2;\n\t\t\t\tbreak;\n\t\t\tcase GL_TRIANGLE_STRIP:\n\t\t\t\tv0 = v1;\n\t\t\t\tv1 = v2;\n\t\t\t\tflip_strip = !flip_strip;\n\t\t\t\tbreak;\n\t\t\tcase GL_TRIANGLES:\n\t\t\t\tv0 = v1 = v2 = 0;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid combine(GLdouble Coords[3], void* [4], GLfloat [4], void** OutputData)\n\t{\n\t\tpoint* const new_point = new point(point3(Coords[0], Coords[1], Coords[2]));\n\t\t*OutputData = new_point;\n\t\t*output_points++ = new_point;\n\t}\n\n\tvoid end()\n\t{\n\t}\n\n\tvoid error(GLenum ErrorNumber)\n\t{\n\t\tlog() << k3d::error << k3d_file_reference << \" \" << gluErrorString(ErrorNumber) << std::endl;\n\t}\n\n\tstatic glu_triangulator_t* instance(void* UserData)\n\t{\n\t\treturn reinterpret_cast<glu_triangulator_t*>(UserData);\n\t}\n\n\tstatic void raw_begin(GLenum Mode, void* UserData)\n\t{\n\t\tinstance(UserData)->begin(Mode);\n\t}\n\n\tstatic void raw_vertex(void* VertexData, void* UserData)\n\t{\n\t\tinstance(UserData)->vertex(VertexData);\n\t}\n\n\tstatic void raw_combine(GLdouble Coords[3], void* VertexData[4], GLfloat Weight[4], void** OutputData, void* UserData)\n\t{\n\t\tinstance(UserData)->combine(Coords, VertexData, Weight, OutputData);\n\t}\n\n\tstatic void raw_end(void* UserData)\n\t{\n\t\tinstance(UserData)->end();\n\t}\n\n\tstatic void raw_error(GLenum ErrorNumber, void* UserData)\n\t{\n\t\tinstance(UserData)->error(ErrorNumber);\n\t}\n\n\tSGItesselator* const tessellator;\n\tOutputFaceIterator output_faces;\n\tOutputPointIterator output_points;\n\n\tGLenum mode;\n\tpoint* v0;\n\tpoint* v1;\n\tpoint* v2;\n\tbool flip_strip;\n\n\t/// Stores a reference to the \"current\" face so data can be copied to child triangles\n\tface* current_face;\n};\n\n} // namespace detail\n\n#endif // !K3DSDK_MESH_TRIANGULATE_DETAIL_H\n\n"
  },
  {
    "path": "k3dsdk/mesh_writer.h",
    "content": "#ifndef K3DSDK_MESH_WRITER_H\n#define K3DSDK_MESH_WRITER_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/ipipeline_profiler.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_writer\n\ntemplate<typename base_t>\nclass mesh_writer :\n\tpublic base_t,\n\tpublic imesh_sink\n{\npublic:\n\tiproperty& mesh_sink_input()\n\t{\n\t\treturn m_input_mesh;\n\t}\n\t\nprotected:\n\tmesh_writer(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_input_mesh(init_owner(*this) + init_name(\"input_mesh\") + init_label(_(\"Input Mesh\")) + init_description(_(\"Input mesh\")) + init_value<mesh*>(0)),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Output file path.\")) + init_value(filesystem::path()) + init_path_mode(ipath_property::WRITE) + init_path_type(\"\"))\n\t{\n\t\tm_input_mesh.changed_signal().connect(hint::converter<\n\t\t\thint::convert<hint::any, hint::none> >(make_write_file_slot()));\n\t\tm_file.changed_signal().connect(hint::converter<\n\t\t\thint::convert<hint::any, hint::none> >(make_write_file_slot()));\n\t}\n\t\n\t/// Slot to call when the file needs to be written\n\tsigc::slot<void, ihint*> make_write_file_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &mesh_writer::write_file);\n\t}\n\n\t/// Stores the input mesh.\n\tk3d_data(mesh*, data::immutable_name, data::change_signal, data::no_undo, data::local_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_input_mesh;\n\t/// Stores the output file path.\n\tk3d_data(filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n\nprivate:\n\t/// Called whenever our inputs have changed and it's time to write to disk.\n\t/// Note that execution is unaffected by the types of hints we've received.\n\tvoid write_file(ihint*)\n\t{\n\t\tconst k3d::filesystem::path path = m_file.pipeline_value();\n\t\tconst k3d::mesh* const mesh = m_input_mesh.pipeline_value();\n\n\t\tif(!mesh || path.empty())\n\t\t\treturn;\n\t\n\t\tlog() << info << \"Writing \" << path.native_console_string() << \" using \" << base_t::factory().name() << std::endl;\n\n\t\tk3d::filesystem::ofstream stream(path);\n\t\tif(!stream)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << path.native_console_string() << \"] for writing.\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tbase_t::document().pipeline_profiler().start_execution(*this, \"Write Mesh\");\n\t\ton_write_mesh(*mesh, path, stream);\n\t\tbase_t::document().pipeline_profiler().finish_execution(*this, \"Write Mesh\");\n\t}\n\n\n\t/// Implement this in derived classes to write the given mesh to an output stream.  Note that the output\n\t/// path is provided for reference only, all data must be written to the provided stream.\n\tvirtual void on_write_mesh(const mesh& Input, const filesystem::path& OutputPath, std::ostream& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_MESH_WRITER_H\n\n"
  },
  {
    "path": "k3dsdk/metadata.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/metadata.h>\n\nnamespace k3d\n{\n\nnamespace metadata\n{\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// storage\n\nvoid storage::set_metadata_value(const string_t& Name, const string_t& Value)\n{\n\tm_storage[Name] = Value;\n\tm_changed_signal.emit();\n}\n\nvoid storage::set_metadata(const metadata_t& Values)\n{\n\t// Note ... we don't use insert() here because we want to overwrite any existing values\n\tfor(metadata_t::const_iterator pair = Values.begin(); pair != Values.end(); ++pair)\n\t\tm_storage[pair->first] = pair->second;\n\tm_changed_signal.emit();\n}\n\nstorage::metadata_t storage::get_metadata()\n{\n\treturn m_storage;\n}\n\nconst string_t storage::get_metadata_value(const string_t& Name)\n{\n\tmetadata_t::const_iterator pair = m_storage.find(Name);\n\treturn pair != m_storage.end() ? pair->second : string_t();\n}\n\nvoid storage::erase_metadata_value(const string_t& Name)\n{\n\tm_storage.erase(Name);\n\tm_changed_signal.emit();\n}\n\nsigc::connection storage::connect_metadata_changed_signal(const sigc::slot<void>& Slot)\n{\n\treturn m_changed_signal.connect(Slot);\n}\n\n} // namespace metadata\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/metadata.h",
    "content": "#ifndef K3DSDK_METADATA_H\n#define K3DSDK_METADATA_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/imetadata.h>\n\nnamespace k3d\n{\n\nnamespace metadata\n{\n\n/// Provides a boilerplate implementation of imetadata\nclass storage :\n\tpublic imetadata \n{\npublic:\n\tvoid set_metadata_value(const string_t& Name, const string_t& Value);\n\tvoid set_metadata(const metadata_t& Values);\n\tmetadata_t get_metadata();\n\tconst string_t get_metadata_value(const string_t& Name);\n\tvoid erase_metadata_value(const string_t& Name);\n\tsigc::connection connect_metadata_changed_signal(const sigc::slot<void>& Slot);\n\nprivate:\n\tmetadata_t m_storage;\n\tsigc::signal<void> m_changed_signal;\n};\n\n//////////////////////////////////////////////////////////////////////////////////////////\n// property\n\n/// Wraps a k3d_data object to add metadata\ntemplate<typename property_t>\nclass property :\n\tpublic property_t,\n\tpublic storage\n{\npublic:\n\ttemplate<typename init_t>\n\tproperty(const init_t& Init) :\n\t\tproperty_t(Init)\n\t{\n\t}\n};\n\n} // namespace metadata\n\n} // namespace k3d\n\n#endif // !K3DSDK_METADATA_H\n\n"
  },
  {
    "path": "k3dsdk/metadata_keys.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/metadata_keys.h>\n\nnamespace k3d\n{\n\nnamespace metadata\n{\n\nnamespace key\n{\n\nconst string_t authors()\n{\n\treturn \"k3d:authors\";\n}\n\nconst string_t copyright()\n{\n\treturn \"k3d:copyright\";\n}\n\nconst string_t domain()\n{\n\treturn \"k3d:domain\";\n}\n\nconst string_t role()\n{\n\treturn \"k3d:role\";\n}\n\nconst string_t version()\n{\n\treturn \"k3d:version\";\n}\n\n} // namespace key\n\nnamespace value\n{\n\nconst string_t point_indices_domain()\n{\n\treturn \"k3d:point-indices\";\n}\n\nconst string_t multi_line_text_role()\n{\n\treturn \"k3d:multi-line-text\";\n}\n\nconst string_t selection_role()\n{\n\treturn \"k3d:selection\";\n}\n\nconst string_t nurbs_knot_vector_role()\n{\n\treturn \"k3d:nurbs-knot-vector\";\n}\n\n} // namespace value\n\n} // namespace metadata\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/metadata_keys.h",
    "content": "#ifndef K3DSDK_METADATA_KEYS_H\n#define K3DSDK_METADATA_KEYS_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace metadata\n{\n\nnamespace key\n{\n\n/// Storage for a collection of authors\nconst string_t authors();\n/// Storage for a copyright notice\nconst string_t copyright();\n\n/// Metadata key \"k3d:domain\" is used to define the domain over which a value / collection of values is defined.\n/// It is commonly used with geometric primitives to specify that one array contains indices into another.\nconst string_t domain();\n\n/// Metadata key \"k3d:role\" is used to identify the purpose of an object beyond what can be inferred from its type.\n/// A common key value will be k3d::metadata::value::selection(), to identify arrays that hold selection state.\nconst string_t role();\n\n/// Metadata key \"k3d:version\" is used to store an arbitrary version string.  It is typically associated with\n/// serialized K-3D documents in native XML format.\nconst string_t version();\n\n} // namespace key\n\nnamespace value\n{\n\n/// Metadata value for use with \"k3d:domain\" that specifies the mesh point array.\nconst string_t point_indices_domain();\n\n/// Metadata value for use with \"k3d:role\" that specifies that a string can contain multiple lines of text.\nconst string_t multi_line_text_role();\n/// Metadata value for use with \"k3d:role\" that specifies that an array of floating-point values is a selection state.\nconst string_t selection_role();\n/// Metadata value for use with \"k3d:role\" that specifies that an array of floating-point values is a NURBS knot vector.\nconst string_t nurbs_knot_vector_role();\n\n} // namespace value\n\n} // namespace metadata\n\n} // namespace k3d\n\n#endif // !K3DSDK_METADATA_KEYS_H\n\n"
  },
  {
    "path": "k3dsdk/mime_types.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/imime_type_handler.h>\n#include <k3dsdk/mime_types.h>\n#include <k3dsdk/plugin.h>\n\n#include <boost/optional.hpp>\n#include <map>\n\nnamespace k3d\n{\n\nnamespace mime\n{\n\n//////////////////////////////////////////////////////////////////////////\n// handler_iterator\n\nclass handler_iterator\n{\npublic:\n\tstatic handler_iterator begin()\n\t{\n\t\tstatic bool_t initialized = false;\n\t\tif(!initialized)\n\t\t{\n\t\t\tinitialized = true;\n\n\t\t\t// Get the set of MIME-type handler factories ...\n\t\t\tfactories = plugin::factory::lookup<imime_type_handler>();\n\n\t\t\t// Remove any factories that are missing load-order information ...\n\t\t\tfor(plugin::factory::collection_t::iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t\t\t{\n\t\t\t\tif(!(**factory).metadata().count(\"k3d:load-order\"))\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"MIME Type Handler [\" << (**factory).name() << \"] without k3d:load-order metadata will not be used\" << std::endl;\n\t\t\t\t\t*factory = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfactories.erase(std::remove(factories.begin(), factories.end(), static_cast<iplugin_factory*>(0)), factories.end());\n\t\t\thandlers.assign(factories.size(), static_cast<imime_type_handler*>(0));\n\n\t\t\t// Sort factories by load-order ...\n\t\t\tstd::sort(factories.begin(), factories.end(), load_order);\n\t\t}\n\n\t\t// Return a new iterator ...\n\t\thandler_iterator result;\n\t\tresult.index = get_index(0);\n\t\treturn result;\n\t}\n\n\tstatic handler_iterator end()\n\t{\n\t\thandler_iterator result;\n\t\treturn result;\n\t}\n\n\tbool_t operator!=(const handler_iterator& other) const\n\t{\n\t\treturn index != other.index;\n\t}\n\n\thandler_iterator& operator++()\n\t{\n\t\tif(!index)\n\t\t\treturn *this;\n\n\t\tindex = get_index(*index + 1);\n\t\treturn *this;\n\t}\n\n\timime_type_handler* operator->() const\n\t{\n\t\treturn handlers[*index];\n\t}\n\nprivate:\n\tboost::optional<uint_t> index;\n\n\tstatic bool_t load_order(iplugin_factory* a, iplugin_factory* b)\n\t{\n\t\treturn from_string<uint32_t>(a->metadata()[\"k3d:load-order\"], 255)\n\t\t\t< from_string<uint32_t>(b->metadata()[\"k3d:load-order\"], 255);\n\t}\n\n\tstatic boost::optional<uint_t> get_index(const uint_t Index)\n\t{\n\t\twhile(factories.size() > Index)\n\t\t{\n\t\t\tif(!handlers[Index])\n\t\t\t\thandlers[Index] = plugin::create<imime_type_handler>(*factories[Index]);\n\n\t\t\tif(handlers[Index])\n\t\t\t\treturn boost::optional<uint_t>(Index);\n\n\t\t\tfactories.erase(factories.begin() + Index);\n\t\t\thandlers.erase(handlers.begin() + Index);\n\t\t}\n\n\t\treturn boost::optional<uint_t>();\n\t}\n\n\tstatic std::vector<iplugin_factory*> factories;\n\tstatic std::vector<imime_type_handler*> handlers;\n};\n\nstd::vector<iplugin_factory*> handler_iterator::factories;\nstd::vector<imime_type_handler*> handler_iterator::handlers;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////\n// type\n\ntype::type()\n{\n}\n\nconst type type::lookup(const filesystem::path& File)\n{\n\ttype return_type;\n\n\thandler_iterator end = handler_iterator::end();\n\tfor(handler_iterator handler = handler_iterator::begin(); handler != end; ++handler)\n\t{\n\t\tif(handler->identify_mime_type(File, return_type.value))\n\t\t\tbreak;\n\t}\n\treturn return_type;\n}\n\nconst type type::lookup(const string_t& Data)\n{\n\ttype return_type;\n\n\thandler_iterator end = handler_iterator::end();\n\tfor(handler_iterator handler = handler_iterator::begin(); handler != end; ++handler)\n\t{\n\t\tif(handler->identify_mime_type(Data, return_type.value))\n\t\t\tbreak;\n\t}\n\treturn return_type;\n}\n\nbool_t type::operator==(const string_t& RHS) const\n{\n\treturn value == RHS;\n}\n\nbool_t type::operator==(const type& RHS) const\n{\n\treturn value == RHS.value;\n}\n\nbool_t type::operator!=(const type& RHS) const\n{\n\treturn value != RHS.value;\n}\n\nconst string_t type::str() const\n{\n\treturn value;\n}\n\nbool_t type::empty() const\n{\n\treturn value.empty();\n}\n\ntype::operator bool_t() const\n{\n\treturn value.empty();\n}\n\nbool_t operator==(const string_t& LHS, const type& RHS)\n{\n\treturn RHS == LHS;\n}\n\n} // namespace mime\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/mime_types.h",
    "content": "#ifndef K3DSDK_MIME_TYPES_H\n#define K3DSDK_MIME_TYPES_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\n\nnamespace mime\n{\n\n/// Defines storage for a MIME type (RFC 2046)\nclass type\n{\npublic:\n\ttype();\n\n\t/// Returns the MIME type of a file (could return an empty value if the file cannot be identified)\n\tstatic const type lookup(const filesystem::path& File);\n\t/// Returns the MIME type of a data stream (could return an empty value if the data cannot be identified)\n\tstatic const type lookup(const string_t& Data);\n\n\tbool_t operator==(const string_t&) const;\n\tbool_t operator==(const type&) const;\n\tbool_t operator!=(const type&) const;\n\n\tconst string_t str() const;\n\n\tbool_t empty() const;\n\toperator bool_t() const;\n\nprivate:\n\tstring_t value;\n};\n\nbool_t operator==(const string_t&, const type&);\n\n} // namespace mime\n\n} // namespace k3d\n\n#endif // !K3DSDK_MIME_TYPES_H\n\n"
  },
  {
    "path": "k3dsdk/module.h",
    "content": "#ifndef K3DSDK_MODULE_H\n#define K3DSDK_MODULE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-platform-config.h>\n\n#include <k3dsdk/iplugin_registry.h>\n#include <k3dsdk/uuid.h>\n\n/////////////////////////////////////////////////////////////////////////////\n// K3D_MODULE_EXPORT\n\n#if defined K3D_ENABLE_SYMBOL_VISIBILITY\n\t#if defined K3D_COMPILER_GCC\n\t\t#define K3D_MODULE_EXPORT __attribute__ ((visibility(\"default\")))\n\t#elif defined K3D_COMPILER_MSVC\n\t\t#define K3D_MODULE_EXPORT __declspec(dllexport)\n\t#else\n\t\t#define K3D_MODULE_EXPORT\n\t#endif\n#else\n\t#define K3D_MODULE_EXPORT\n#endif\n\n/////////////////////////////////////////////////////////////////////////////\n// K3D_MODULE_START\n\n/// Provides boilerplate for the required entry-point into all K-3D plugin modules\n#define K3D_MODULE_START(Registry) \\\nextern \"C\" { K3D_MODULE_EXPORT void register_k3d_plugins(k3d::iplugin_registry& Registry) {\n\n/////////////////////////////////////////////////////////////////////////////\n// K3D_MODULE_END\n\n/// Provides boilerplate for the required entry-point into all K-3D plugin modules\n#define K3D_MODULE_END } }\n\nnamespace k3d\n{\n\n/// Defines the signature for the register_k3d_plugins function that must be exported by all plugin modules\ntypedef void (*register_plugins_entry_point)(iplugin_registry&);\n\n} // namespace k3d\n\n#endif // !K3DSDK_MODULE_H\n\n"
  },
  {
    "path": "k3dsdk/named_array_types.h",
    "content": "#ifndef K3DSDK_NAMED_ARRAY_TYPES_H\n#define K3DSDK_NAMED_ARRAY_TYPES_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/normal3.h>\n#include <k3dsdk/point2.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/point4.h>\n#include <k3dsdk/texture3.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/vector2.h>\n#include <k3dsdk/vector3.h>\n\n#include <boost/mpl/vector/vector30.hpp>\n\nnamespace k3d\n{\n\n/// Enumerates all of the data types that can be stored using k3d::named_arrays.\n/// If you create a named array that stores a type not in this list, some operations will fail with runtime errors.\ntypedef boost::mpl::vector22<\n\tbool_t,\n\tcolor,\n\tdouble_t,\n\timaterial*,\n\tinode*,\n\tint16_t,\n\tint32_t,\n\tint64_t,\n\tint8_t,\n\tmatrix4,\n\tnormal3,\n\tpoint2,\n\tpoint3,\n\tpoint4,\n\tstring_t,\n\ttexture3,\n\tuint16_t,\n\tuint32_t,\n\tuint64_t,\n\tuint8_t,\n\tvector2,\n\tvector3\n\t> named_array_types;\n\n} // namespace k3d\n\n#endif // !K3DSDK_NAMED_ARRAY_TYPES_H\n\n"
  },
  {
    "path": "k3dsdk/named_arrays.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/array.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/named_arrays.h>\n#include <k3dsdk/type_registry.h>\n\nnamespace k3d\n{\n\n///////////////////////////////////////////////////////////////////////////\n// named_arrays\n\nconst array* named_arrays::lookup(const string_t& Name) const\n{\n\tconst_iterator result = find(Name);\n\treturn result == end() ? static_cast<const array*>(0) : result->second.get();\n}\n\narray* named_arrays::writable(const string_t& Name)\n{\n\titerator result = find(Name);\n\treturn result == end() ? static_cast<array*>(0) : &result->second.writable();\n}\n\nnamed_arrays named_arrays::clone_types() const\n{\n\tnamed_arrays result;\n\n\tfor(const_iterator array = begin(); array != end(); ++array)\n\t\tresult.insert(std::make_pair(array->first, array->second->clone_type()));\n\n\treturn result;\n}\n\nnamed_arrays named_arrays::clone() const\n{\n\tnamed_arrays result;\n\n\tfor(const_iterator array = begin(); array != end(); ++array)\n\t\tresult.insert(std::make_pair(array->first, array->second->clone()));\n\n\treturn result;\n}\n\nvoid named_arrays::difference(const named_arrays& Other, difference::accumulator& Result) const\n{\n\t// If we have differing numbers of arrays, we definitely aren't equal\n\tResult.exact(size() == Other.size());\n\n\tfor(named_arrays::const_iterator a = begin(), b = Other.begin(); a != end() && b != Other.end(); ++a, ++b)\n\t{\n\t\t// Each pair of arrays must have equal names\n\t\tResult.exact(a->first == b->first);\n\n\t\t// Perform element-wise comparisons of the arrays \n\t\ta->second->difference(*b->second, Result);\n\t}\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////\n// operator<<\n\nstd::ostream& operator<<(std::ostream& Stream, const named_arrays& RHS)\n{\n\tfor(named_arrays::const_iterator array_iterator = RHS.begin(); array_iterator != RHS.end(); ++array_iterator)\n\t{\n\t\tStream << standard_indent << \"\\\"\" << array_iterator->first << \"\\\" [\" << array_iterator->second->type_string() << \"] (\" << array_iterator->second->size() << \"):\\n\";\n\t\tif(array_iterator->second->size())\n\t\t\tStream << push_indent << start_block() << *array_iterator->second << finish_block << pop_indent << \"\\n\";\n\t}\n\t\n\treturn Stream;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/named_arrays.h",
    "content": "#ifndef K3DSDK_NAMED_ARRAYS_H\n#define K3DSDK_NAMED_ARRAYS_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/pipeline_data.h>\n#include <k3dsdk/types.h>\n\n#include <map>\n\nnamespace k3d\n{\n\nclass array;\n\n/// Defines a heterogeneous collection of named, shared arrays.  Arrays in the collection are not length-constrained.\n/// For a collection of arrays that all have the same length, see table.  For a concrete list of the\n/// datatypes that can be stored using named_arrays, see k3d::named_array_types.\nclass named_arrays :\n\tpublic std::map<string_t, pipeline_data<array> >\n{\npublic:\n\t/// Creates a new array with given name and type, inserting it into the collection and returning a reference to the result.\n\t/** \\note: An existing array with the same name will be replaced by the new array. */\n\ttemplate<typename ArrayT>\n\tArrayT& create(const string_t& Name)\n\t{\n\t\tArrayT* const array = new ArrayT();\n\t\t(*this)[Name].create(array);\n\t\treturn *array;\n\t}\n\t/// Inserts a new array into the collection with the given name, returning a reference to the result.\n\t/** \\note: An existing array with the same name will be replaced by the new array. */\n\ttemplate<typename ArrayT>\n\tArrayT& create(const string_t& Name, ArrayT* Array)\n\t{\n\t\t(*this)[Name].create(Array);\n\t\treturn *Array;\n\t}\n\t/// Returns an existing array with the given name, or NULL if no matching array exists.\n\tconst array* lookup(const string_t& Name) const;\n\t/// Returns an existing array with the given name and type, or NULL if no matching array exists.\n\ttemplate<typename ArrayT>\n\tconst ArrayT* lookup(const string_t& Name) const\n\t{\n\t\treturn dynamic_cast<const ArrayT*>(lookup(Name));\n\t}\n\t/// Returns an existing array with the given name, or NULL if no matching array exists.\n\tarray* writable(const string_t& Name);\n\t/// Returns an existing array with the given name and type, or NULL if no matching array exists.\n\ttemplate<typename ArrayT>\n\tArrayT* writable(const string_t& Name)\n\t{\n\t\treturn dynamic_cast<ArrayT*>(writable(Name));\n\t}\n\t/// Returns an object containing empty arrays with the same name and type as the originals.\n\tnamed_arrays clone_types() const;\n\t/// Returns an object containing deep copies of all the original arrays.\n\tnamed_arrays clone() const;\n\t/// Compares two collections using the imprecise semantics of difference::test().\n\tvoid difference(const named_arrays& Other, difference::accumulator& Result) const;\n};\n\n/// Serialization\nstd::ostream& operator<<(std::ostream& Stream, const named_arrays& RHS);\n\n/// Specialization of difference::test for named_arrays\nnamespace difference\n{\n\ninline void test(const named_arrays& A, const named_arrays& B, accumulator& Result)\n{\n\tA.difference(B, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_NAMED_ARRAYS_H\n\n"
  },
  {
    "path": "k3dsdk/named_tables.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/named_tables.h>\n\nnamespace k3d\n{\n\n///////////////////////////////////////////////////////////////////////////\n// named_tables\n\nconst table* named_tables::lookup(const string_t& Name) const\n{\n\tconst_iterator result = find(Name);\n\treturn result == end() ? static_cast<table*>(0) : &result->second;\n}\n\ntable* named_tables::writable(const string_t& Name)\n{\n\titerator result = find(Name);\n\treturn result == end() ? static_cast<table*>(0) : &result->second;\n}\n\nvoid named_tables::difference(const named_tables& Other, difference::accumulator& Result) const\n{\n\t// If we have differing numbers of tables, we definitely aren't equal\n\tResult.exact(size() == Other.size());\n\n\tfor(named_tables::const_iterator a = begin(), b = Other.begin(); a != end() && b != Other.end(); ++a, ++b)\n\t{\n\t\t// Each pair of tables must have equal names\n\t\tResult.exact(a->first == b->first);\n\n\t\t// Perform element-wise comparisons of the tables \n\t\ta->second.difference(b->second, Result);\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////\n// operator<<\n\nstd::ostream& operator<<(std::ostream& Stream, const named_tables& RHS)\n{\n\tfor(named_tables::const_iterator attributes = RHS.begin(); attributes != RHS.end(); ++attributes)\n\t\tStream << standard_indent << \"table \\\"\" << attributes->first << \"\\\"\\n\" << push_indent << attributes->second << pop_indent << \"\\n\";\n\n\treturn Stream;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/named_tables.h",
    "content": "#ifndef K3DSDK_NAMED_TABLES_H\n#define K3DSDK_NAMED_TABLES_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/table.h>\n\nnamespace k3d\n{\n\n/// Defines a collection of named table objects.  The length of the individual\n/// table objects may vary.\nclass named_tables :\n\tpublic std::map<string_t, table>\n{\npublic:\n\t/// Return an attribute_array by name, or NULL\n\tconst table* lookup(const string_t& Name) const;\n\t/// Return an attribute_array by name, or NULL\n\ttable* writable(const string_t& Name);\n\t/// Returns the difference between two collections, using the imprecise semantics of difference::test().\n\tvoid difference(const named_tables& Other, difference::accumulator& Result) const;\n};\n\n/// Serialization\nstd::ostream& operator<<(std::ostream& Stream, const named_tables& RHS);\n\n/// Specialization of difference::test for k3d::named_tables\nnamespace difference\n{\n\ninline void test(const named_tables& A, const named_tables& B, accumulator& Result)\n{\n\tA.difference(B, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_NAMED_TABLES_H\n\n"
  },
  {
    "path": "k3dsdk/namespace_documentation.h",
    "content": "#ifndef K3DSDK_NAMESPACE_DOCUMENTATION_H\n#define K3DSDK_NAMESPACE_DOCUMENTATION_H\n\n/** \\file\n\t\\brief This do-nothing file is used to provide a central point for documenting the K-3D library namespaces for use with Doxygen\n\t\\author Timothy M. Shead <tshead@k-3d.com>\n*/\n\n/// Namespace reserved for the boost library, see http://www.boost.org\nnamespace boost\n{\n\t/// Namespace reserved for the boost filesystem library, see http://www.boost.org/libs/filesystem\n\tnamespace filesystem {}\n\t/// Namespace reserved for the spirit parser framework, see http://spirit.sourceforge.net\n\tnamespace spirit {}\n}\n\n/// Namespace reserved for the gdkmm C++ wrappers for GTK, see http://gtkmm.sourceforge.net\nnamespace Gdk {}\n\n/// Namespace reserved for the glibmm C++ wrappers for glib, see http://gtkmm.sourceforge.net\nnamespace Glib {}\n\n/// Namespace reserved for the gtkmm C++ wrappers for GTK, see http://gtkmm.sourceforge.net\nnamespace Gtk {}\n\n/// Namespace reserved for K-3D plugin modules\nnamespace module {}\n\n/// Namespace reserved for all public symbols in the K-3D SDK\nnamespace k3d\n{\n\n/// Contains commonly-used plugin object class identifiers, so specific plugin objects can be instantiated\nnamespace classes {}\n\n/// Contains constraint objects used with k3d::data and related objects\nnamespace constraint {}\n\n/// Contains private implementation details for the k3d API\nnamespace detail {}\n\n/// Contains a boost::spirit grammar and related objects for parsing numeric expressions\nnamespace expression {}\n\n/// Contains functions and objects to simplify working with the OpenGL API, sese http://www.opengl.org\nnamespace gl\n{\n\t/// Contains private implementation details of the k3d::gl API\n\tnamespace detail {}\n}\n\n/// Contains private implementation details for the k3d API (deprecated, use k3d::detail for new code instead)\nnamespace implementation_private {}\n\n/// Contains objects for use with libsigc++ signals\nnamespace signal {}\n\n/// Contains objects for storing and converting real-world units-of-measure\nnamespace measurement\n{\n\t/// Contains policy objects for converting between real-world units-of-measure\n\tnamespace conversion {}\n} // namespace measurement\n\n/// Contains functions and classes used to make object serialization & persistence easier\nnamespace persistence {}\n\n/// Contains functions and classes used to export easily-modifiable \"properties\" from objects\nnamespace property {}\n\n/// Contains functions and classes used to generate RenderMan compatible descriptions of a document\nnamespace ri\n{\n\t/// Contains private implementation details of the k3d::ri API\n\tnamespace detail {}\n}\n\n/// Contains functions and classes for working with RenderMan Shading Language data\nnamespace sl {}\n\n/// Contains functions and classes used to abstract away differences in operating systems / platforms\nnamespace system {}\n\n/// Contains functions and classes for working with XML data\nnamespace xml\n{\n\t/// Contains private implementation details of the k3d::xml API\n\tnamespace detail {}\n}\n\n} // namespace k3d\n\n/// Namespace reserved for the libsigc++ signal library, see http://libsigc.sourceforge.net\nnamespace sigc {}\n\n/// Namespace reserved for the libsigc++ signal library (compatibility layer), see http://libsigc.sourceforge.net\nnamespace SigC {}\n\n/// Namespace reserved for the C++ Standard Library\nnamespace std {}\n\n/// Namespace reserved for the ImageMagick C++ binding, see http://studio.imagemagick.org/Magick++\nnamespace Magick {}\n\n#endif // !K3DSDK_NAMESPACE_DOCUMENTATION_H\n\n"
  },
  {
    "path": "k3dsdk/network_render_farm.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/inetwork_render_job.h>\n#include <k3dsdk/network_render_farm.h>\n#include <k3dsdk/network_render_farm_detail.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/xml.h>\nusing namespace k3d::xml;\n\n#include <list>\n#include <iostream>\n#include <vector>\n\n//#include <errno.h>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\n/// Stores a reference to the global render farm instance\ninetwork_render_farm* g_render_farm = 0;\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// network_render_frame\n\nclass network_render_frame :\n\tpublic inetwork_render_frame\n{\npublic:\n\tnetwork_render_frame(const filesystem::path& JobPath, const string_t& Name) :\n\t\tm_Path(JobPath / filesystem::native_path(ustring::from_utf8(Name)))\n\t{\n\t\tif(!filesystem::create_directory(m_Path))\n\t\t\tlog() << error << \"Error creating frame directory [\" << m_Path.native_console_string() << \"]\" << std::endl;\n\t}\n\n\t~network_render_frame()\n\t{\n\t\tfor(commands_t::const_iterator command = m_commands.begin(); command != m_commands.end(); ++command)\n\t\t\tdelete *command;\n\t}\n\n\tconst filesystem::path add_file(const string_t& Name)\n\t{\n\t\t// Sanity checks ...\n\t\tassert_warning(Name.size());\n\n\t\t// Make sure the filepath is unique ...\n\t\tunsigned long index = 0;\n\t\tstring_t name = Name;\n\t\twhile(std::count(m_files.begin(), m_files.end(), name))\n\t\t\tname = Name + '-' + string_cast(++index);\n\n\t\tm_files.push_back(name);\n\n\t\treturn m_Path / filesystem::generic_path(name);\n\t}\n\n\tvoid add_exec_command(const string_t& Binary, const environment& Environment, const arguments& Arguments)\n\t{\n\t\t// Sanity checks ...\n\t\tassert_warning(!Binary.empty());\n\n\t\tm_commands.push_back(new exec_command(Binary, Environment, Arguments));\n\t}\n\n\tvoid add_copy_command(const filesystem::path& Source, const filesystem::path& Target)\n\t{\n\t\t// Sanity checks ...\n\t\tassert_warning(!Source.empty());\n\t\tassert_warning(!Target.empty());\n\n\t\tm_commands.push_back(new copy_command(Source, Target));\n\t}\n\n\tvoid add_view_command(const filesystem::path& File)\n\t{\n\t\tm_commands.push_back(new view_command(File));\n\t}\n\n\tvoid write_control_file()\n\t{\n\t\t// Create the empty control file ...\n\t\tfilesystem::ofstream file(m_Path / filesystem::generic_path(\"control.k3d\"));\n\n\t\t// Create the XML document ...\n\t\telement xml_document(\"k3dml\");\n\t\telement& xml_frame = xml_document.append(element(\"frame\"));\n\n\t\tfor(commands_t::const_iterator command = m_commands.begin(); command != m_commands.end(); ++command)\n\t\t{\n\t\t\tif(exec_command* const exec = dynamic_cast<exec_command*>(*command))\n\t\t\t{\n\t\t\t\telement& xml_command = xml_frame.append(element(\"command\"));\n\t\t\t\telement& xml_exec = xml_command.append(element(\"exec\",\n\t\t\t\t\tattribute(\"binary\", exec->m_binary)));\n\n\t\t\t\telement& xml_environment = xml_exec.append(element(\"environment\"));\n\t\t\t\tfor(environment::const_iterator variable = exec->m_environment.begin(); variable != exec->m_environment.end(); ++variable)\n\t\t\t\t{\n\t\t\t\t\txml_environment.append(element(\"variable\",\n\t\t\t\t\t\tattribute(\"name\", variable->name),\n\t\t\t\t\t\tattribute(\"value\", variable->value)));\n\t\t\t\t}\n\n\t\t\t\telement& xml_arguments = xml_exec.append(element(\"arguments\"));\n\t\t\t\tfor(arguments::const_iterator argument = exec->m_arguments.begin(); argument != exec->m_arguments.end(); ++argument)\n\t\t\t\t{\n\t\t\t\t\txml_arguments.append(element(\"argument\",\n\t\t\t\t\t\tattribute(\"value\", argument->value)));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(copy_command* const copy = dynamic_cast<copy_command*>(*command))\n\t\t\t{\n\t\t\t\txml_frame.append(element(\"command\",\n\t\t\t\t\telement(\"copy\",\n\t\t\t\t\t\tattribute(\"source\", copy->m_source.native_utf8_string().raw()),\n\t\t\t\t\t\tattribute(\"target\", copy->m_target.native_utf8_string().raw()))));\n\t\t\t}\n\t\t\telse if(view_command* const view = dynamic_cast<view_command*>(*command))\n\t\t\t{\n\t\t\t\txml_frame.append(element(\"command\",\n\t\t\t\t\telement(\"view\",\n\t\t\t\t\t\tattribute(\"file\", view->m_file.native_utf8_string().raw()))));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tassert_not_reached();\n\t\t\t}\n\t\t}\n\n\t\t// Write the document ...\n\t\tfile << xml_document << std::endl;\n\t}\n\n\tvoid mark_ready()\n\t{\n\t\t// Create the empty \"ready\" status file ...\n\t\tfilesystem::ofstream file(m_Path / filesystem::generic_path(\"ready\"));\n\n\t\t// Boost::filesystem does not rename empty files\n\t\tfile << \"K-3D renderfarm status file\";\n\t}\n\nprivate:\n\t/// Stores the filesystem path for this job\n\tconst filesystem::path m_Path;\n\t/// Stores the set of input files used during rendering\n\ttypedef std::vector<string_t> files_t;\n\tfiles_t m_files;\n\n\t/// Defines a command to be executed\n\tclass command\n\t{\n\tpublic:\n\t\tvirtual ~command() {}\n\n\tprotected:\n\t\tcommand() {}\n\t\tcommand(const command&) {}\n\t\tcommand& operator=(const command&) { return *this; }\n\t};\n\n\tclass exec_command :\n\t\tpublic command\n\t{\n\tpublic:\n\t\texec_command(const string_t& Binary, const environment& Environment, const arguments& Arguments) :\n\t\t\tm_binary(Binary),\n\t\t\tm_environment(Environment),\n\t\t\tm_arguments(Arguments)\n\t\t{\n\t\t}\n\n\t\tconst string_t m_binary;\n\t\tconst environment m_environment;\n\t\tconst arguments m_arguments;\n\t};\n\t\n\tclass copy_command :\n\t\tpublic command\n\t{\n\tpublic:\n\t\tcopy_command(const filesystem::path& Source, const filesystem::path& Target) :\n\t\t\tm_source(Source),\n\t\t\tm_target(Target)\n\t\t{\n\t\t}\n\n\t\tconst filesystem::path m_source;\n\t\tconst filesystem::path m_target;\n\t};\n\n\tclass view_command :\n\t\tpublic command\n\t{\n\tpublic:\n\t\tview_command(const filesystem::path& File) :\n\t\t\tm_file(File)\n\t\t{\n\t\t}\n\n\t\tconst filesystem::path m_file;\n\t};\n\n\ttypedef std::vector<command*> commands_t;\n\tcommands_t m_commands;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// network_render_job\n\nclass network_render_job :\n\tpublic inetwork_render_job\n{\npublic:\n\tnetwork_render_job(const filesystem::path Path, const string_t JobName) :\n\t\tm_Path(Path / filesystem::generic_path(JobName))\n\t{\n\t\ttry\n\t\t{\n\t\t\tcreate_directory(m_Path);\n\t\t}\n\t\tcatch(const std::exception& ex)\n\t\t{\n\t\t\tlog() << error << k3d_file_reference << \": Error creating job directory [\" << m_Path.native_console_string() << \"]\" << std::endl;\n\t\t}\n\t}\n\n\tinetwork_render_frame& create_frame(const string_t& FrameName)\n\t{\n\t\tm_frames.push_back(network_render_frame(m_Path, FrameName));\n\t\treturn m_frames.back();\n\t}\n\n\tbool write_control_files()\n\t{\n\t\t// Create a control file for each frame ...\n\t\tstd::for_each(m_frames.begin(), m_frames.end(), std::mem_fun_ref(&network_render_frame::write_control_file));\n\n\t\t// Create the control file ...\n\t\tfilesystem::ofstream file(m_Path / filesystem::generic_path(\"control.k3d\"));\n\n\t\t// Create the XML document ...\n\t\telement document(\"k3dml\");\n\n\t\t// Write the document ...\n\t\tfile << xml::declaration() << document << std::endl;\n\n\t\treturn true;\n\t}\n\n\tbool mark_ready()\n\t{\n\t\t// Mark each frame as \"ready\" ...\n\t\tstd::for_each(m_frames.begin(), m_frames.end(), std::mem_fun_ref(&network_render_frame::mark_ready));\n\n\t\t// Create the \"ready\" status file ...\n\t\tfilesystem::ofstream file(m_Path / filesystem::generic_path(\"ready\"));\n\n\t\t// Boost::filesystem does not rename empty files\n\t\tfile << \"Status file.\" << std::ends;\n\n\t\treturn true;\n\t}\n\n\tconst string_t path()\n\t{\n\t\treturn m_Path.native_utf8_string().raw();\n\t}\n\nprivate:\n\tconst filesystem::path m_Path;\n\n\ttypedef std::list<network_render_frame> frames_t;\n\tframes_t m_frames;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// network_render_farm::implementation\n\nclass network_render_farm::implementation\n{\npublic:\n\timplementation(const filesystem::path& OptionsPath) :\n\t\tm_options_path(OptionsPath)\n\t{\n\t}\n\n\tinetwork_render_job& create_job(const string_t& JobName)\n\t{\n\t\t// Sanity checks ...\n\t\tassert_warning(JobName.size());\n\n\t\t// Render farm path ...\n\t\tconst filesystem::path job_path = options::get_path(options::path::render_farm());\n\n\t\t// Ensure that the job gets a unique name ...\n\t\tunsigned long index = 0;\n\t\tstring_t job_name(JobName);\n\t\twhile(filesystem::exists(job_path / filesystem::generic_path(job_name)))\n\t\t\tjob_name = JobName + '-' + string_cast(index++);\n\n\t\tm_jobs.push_back(network_render_job(job_path, job_name));\n\t\treturn m_jobs.back();\n\t}\n\n\tvoid start_job(inetwork_render_job& Job)\n\t{\n\t\t// Make sure it's one of ours ...\n\t\tnetwork_render_job* const job = dynamic_cast<network_render_job*>(&Job);\n\t\treturn_if_fail(job);\n\n\t\t// Update control files for the job and all its frames ...\n\t\tif(!job->write_control_files())\n\t\t{\n\t\t\tlog() << error << \"Error writing render job control files\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\t// Mark the job ready-to-run ...\n\t\tif(!job->mark_ready())\n\t\t{\n\t\t\tlog() << error << \"Error marking render job ready\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\t// Start the local rendering process ...\n\t\tstring_t commandline = \"k3d-renderjob \\\"\";\n\t\tcommandline += job->path();\n\t\tcommandline += \"\\\"\";\n\n\t\tif(!system::spawn_async(commandline))\n\t\t{\n\t\t\tlog() << error << \"Error starting render job \" << commandline << std::endl;\n\t\t\treturn;\n\t\t}\n\t}\n\nprivate:\n\tconst filesystem::path m_options_path;\n\ttypedef std::list<network_render_job> jobs_t;\n\tjobs_t m_jobs;\n};\n\n\n/////////////////////////////////////////////////////////////////////////////\n// network_render_farm\n\nnetwork_render_farm::network_render_farm(const filesystem::path& OptionsPath) :\n\tm_implementation(new implementation(OptionsPath))\n{\n}\n\nnetwork_render_farm::~network_render_farm()\n{\n\tdelete m_implementation;\n}\n\ninetwork_render_job& network_render_farm::create_job(const string_t& JobName)\n{\n\treturn m_implementation->create_job(JobName);\n}\n\nvoid network_render_farm::start_job(inetwork_render_job& Job)\n{\n\tm_implementation->start_job(Job);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// set_network_render_farm\n\nvoid set_network_render_farm(inetwork_render_farm& RenderFarm)\n{\n\treturn_if_fail(!detail::g_render_farm);\n\tdetail::g_render_farm = &RenderFarm;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// render_farm\n\ninetwork_render_farm& get_network_render_farm()\n{\n\tassert_critical(detail::g_render_farm);\n\treturn *detail::g_render_farm;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/network_render_farm.h",
    "content": "#ifndef K3DSDK_NETWORK_RENDER_FARM_H\n#define K3DSDK_NETWORK_RENDER_FARM_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nclass inetwork_render_farm;\n\n/// Returns a reference to the global singleton render farm object\ninetwork_render_farm& get_network_render_farm();\n\n} // namespace k3d\n\n#endif // !K3DSDK_NETWORK_RENDER_FARM_H\n\n"
  },
  {
    "path": "k3dsdk/network_render_farm_detail.h",
    "content": "#ifndef K3DSDK_NETWORK_RENDER_FARM_DETAIL_H\n#define K3DSDK_NETWORK_RENDER_FARM_DETAIL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/inetwork_render_farm.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// network_render_farm\n\nclass network_render_farm :\n\tpublic inetwork_render_farm\n{\npublic:\n\tnetwork_render_farm(const filesystem::path& OptionsPath);\n\t~network_render_farm();\n\n\tinetwork_render_job& create_job(const string_t& JobName);\n\tvoid start_job(inetwork_render_job& Job);\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n/// Call this once at startup to register the global singleton render farm implementation - note: does not take control of the given object's lifetime.\nvoid set_network_render_farm(inetwork_render_farm& RenderFarm);\n\n} // namespace k3d\n\n#endif // !K3DSDK_NETWORK_RENDER_FARM_DETAIL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/CMakeLists.txt",
    "content": "PROJECT(k3dsdk-ngui)\n\nFILE(GLOB HEADERS *.h)\nFILE(GLOB SOURCES *.cpp)\n\nLIST(SORT HEADERS)\nLIST(SORT SOURCES)\n\nINCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GLIBMM_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GTKGLEXT_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GTKMM_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_SIGC_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${K3D_GTKGLEXT_LIB_DIRS})\nLINK_DIRECTORIES(${K3D_GTKMM_LIB_DIRS})\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nK3D_ADD_LIBRARY(k3dsdk-ngui SHARED ${HEADERS} ${SOURCES})\nK3D_GENERATE_DEF_FILE(k3dsdk-ngui)\n\nTARGET_LINK_LIBRARIES(k3dsdk-ngui k3dsdk)\nTARGET_LINK_LIBRARIES(k3dsdk-ngui k3dsdk-opengl)\nTARGET_LINK_LIBRARIES(k3dsdk-ngui ${K3D_GLIBMM_LIBS})\nTARGET_LINK_LIBRARIES(k3dsdk-ngui ${K3D_GTKGLEXT_LIBS})\nTARGET_LINK_LIBRARIES(k3dsdk-ngui ${K3D_GTKMM_LIBS})\n\nIF(K3D_ENABLE_NLS)\n\tINCLUDE_DIRECTORIES(${K3D_INTL_INCLUDE_DIRS})\n\tTARGET_LINK_LIBRARIES(k3dsdk-ngui ${K3D_INTL_LIBS})\nENDIF(K3D_ENABLE_NLS)\n\nINSTALL(TARGETS k3dsdk-ngui\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\n"
  },
  {
    "path": "k3dsdk/ngui/angle_axis.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/angle_axis.h>\n#include <k3dsdk/ngui/spin_button.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <gtkmm/button.h>\n#include <gtkmm/label.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace angle_axis\n{\n\nnamespace detail\n{\n\n/// Adapts a k3d::iproperty object for use with angle_axis::control\nclass data_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tdata_proxy(k3d::iproperty& Property, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_property(Property)\n\t{\n\t\tassert(Property.property_type() == typeid(k3d::angle_axis));\n\t}\n\n\tconst k3d::angle_axis value()\n\t{\n\t\treturn boost::any_cast<k3d::angle_axis>(m_property.property_internal_value());\n\t}\n\n\tvoid set_value(const k3d::angle_axis& Value)\n\t{\n\t\tk3d::iwritable_property* const writable_property = dynamic_cast<k3d::iwritable_property*>(&m_property);\n\t\treturn_if_fail(writable_property);\n\n\t\twritable_property->property_set_value(boost::any(Value));\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_property.property_changed_signal();\n\t}\n\nprivate:\n\tk3d::iproperty& m_property;\n};\n\n} // namespace detail\n\n/// Adapts a spin button to control a single angle_axis coordinate (indentified by index)\nclass spin_button_model :\n\tpublic spin_button::imodel\n{\npublic:\n\tspin_button_model(angle_axis::idata_proxy& Data, const unsigned int Index) :\n\t\tm_data(Data),\n\t\tm_index(Index)\n\t{\n\t\tassert_warning(m_index < 3);\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn \"\";\n\t}\n\n\tk3d::bool_t writable()\n\t{\n\t\treturn true;\n\t}\n\n\tk3d::double_t value()\n\t{\n\t\tk3d::quaternion quat(m_data.value());\n\t\treturn k3d::euler_angles(quat, k3d::euler_angles::XYZstatic)[m_index];\n\t}\n\n\tvoid set_value(const double Value)\n\t{\n\t\tk3d::quaternion quaternion(m_data.value());\n\t\tk3d::euler_angles eulerangles(quaternion, k3d::euler_angles::XYZstatic);\n\t\teulerangles[m_index] = Value;\n\t\tm_data.set_value(k3d::angle_axis(k3d::quaternion(eulerangles)));\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_data.changed_signal().connect(sigc::hide(Slot));\n\t}\n\n\tk3d::double_t step_increment()\n\t{\n\t\treturn k3d::radians(1.0);\n\t}\n\n\tconst std::type_info& units()\n\t{\n\t\treturn typeid(k3d::measurement::angle);\n\t}\n\nprivate:\n\tangle_axis::idata_proxy& m_data;\n\tconst unsigned int m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<idata_proxy> Data) :\n\tbase(3, 3, false),\n\tm_data(std::move(Data)),\n\tm_reset_button(new Gtk::Button(_(\"Reset\")))\n{\n\tspin_button::control* const x = new spin_button::control(new spin_button_model(*m_data, 0), m_data->state_recorder);\n\tspin_button::control* const y = new spin_button::control(new spin_button_model(*m_data, 1), m_data->state_recorder);\n\tspin_button::control* const z = new spin_button::control(new spin_button_model(*m_data, 2), m_data->state_recorder);\n\n\tattach(*Gtk::manage(new Gtk::Label(_(\"X\"))), 0, 1, 0, 1);\n\tattach(*Gtk::manage(x), 1, 2, 0, 1);\n\n\tattach(*Gtk::manage(new Gtk::Label(_(\"Y\"))), 0, 1, 1, 2);\n\tattach(*Gtk::manage(y), 1, 2, 1, 2);\n\n\tattach(*Gtk::manage(new Gtk::Label(_(\"Z\"))), 0, 1, 2, 3);\n\tattach(*Gtk::manage(z), 1, 2, 2, 3);\n\n\tattach(*Gtk::manage(m_reset_button << connect_button(sigc::mem_fun(*this, &control::on_reset))), 2, 3, 1, 2);\n}\n\nvoid control::on_reset()\n{\n\treturn_if_fail(m_data.get());\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\tm_data->set_value(k3d::angle_axis(0, k3d::point3(1, 0, 0)));\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->commit_change_set(m_data->state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), m_data->change_message + \" reset\", K3D_CHANGE_SET_CONTEXT);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// proxy\n\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Property, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage)\n{\n\treturn std::unique_ptr<idata_proxy>(new detail::data_proxy(Property, StateRecorder, ChangeMessage));\n}\n\n} // namespace angle_axis\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/angle_axis.h",
    "content": "#ifndef K3DSDK_NGUI_ANGLE_AXIS_H\n#define K3DSDK_NGUI_ANGLE_AXIS_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/signal_system.h>\n\n#include <gtkmm/table.h>\n\n#include <memory>\n\nnamespace Gtk { class Button; }\nnamespace k3d { class ihint; }\nnamespace k3d { class iproperty; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace angle_axis\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// idata_proxy\n\n/// Abstract interface for an object that proxies a data source for a orientation control (i.e. the \"model\" in model-view-controller)\nclass idata_proxy\n{\npublic:\n\tvirtual ~idata_proxy() {}\n\n\t/// Called to return the underlying data value\n\tvirtual const k3d::angle_axis value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const k3d::angle_axis& Value) = 0;\n\t/// Signal emitted if the underlying data changes\n\ttypedef sigc::signal<void, k3d::ihint*> changed_signal_t;\n\t/// Signal emitted if the underlying data changes\n\tvirtual changed_signal_t& changed_signal() = 0;\n\n\t/// Stores an optional state recorder for recording undo/redo data\n\tk3d::istate_recorder* const state_recorder;\n\t/// Stores an optional message for labelling undo/redo state changes\n\tconst Glib::ustring change_message;\n\nprotected:\n\tidata_proxy(k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tstate_recorder(StateRecorder),\n\t\tchange_message(ChangeMessage)\n\t{\n\t}\n\nprivate:\n\tidata_proxy(const idata_proxy& RHS);\n\tidata_proxy& operator=(const idata_proxy& RHS);\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for modifying the orientation of an object\nclass control :\n\tpublic Gtk::Table\n{\n\ttypedef Gtk::Table base;\n\npublic:\n\tcontrol(std::unique_ptr<idata_proxy> Data);\n\nprivate:\n\t/// Called to reset the object orientation to the origin\n\tvoid on_reset();\n\n\t/// Stores a reference to the underlying data object\n\tstd::unique_ptr<idata_proxy> m_data;\n\t/// Stores the reset button\n\tGtk::Button* const m_reset_button;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// proxy\n\n/// Convenience factory function for creating k3d::spin_button::idata_proxy objects, specialized for k3d::iproperty\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = Glib::ustring());\n\n} // namespace angle_axis\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_ANGLE_AXIS_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/application_state.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/application_state.h>\n#include <k3dsdk/ngui/safe_close_dialog.h>\n#include <k3dsdk/ngui/unsaved_document.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application.h>\n#include <k3dsdk/batch_mode.h>\n#include <k3dsdk/iapplication.h>\n\n#include <gtkmm/dialog.h>\n\n#include <set>\n\nusing namespace k3d::ngui;\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// application_state::implementation\n\nclass application_state::implementation :\n\tpublic sigc::trackable\n{\npublic:\n\timplementation() :\n\t\tm_custom_layouts(true),\n\t\tm_assign_hotkeys(false)\n\t{\n\t}\n\n\t/// Used to keep documents sorted in the \"safe to close\" dialog\n\tstruct sort_by_title\n\t{\n\t\tbool operator()(const safe_close_dialog::entry& LHS, const safe_close_dialog::entry& RHS)\n\t\t{\n\t\t\treturn LHS.document->unsaved_document_title() < RHS.document->unsaved_document_title();\n\t\t}\n\t};\n\n\ttypedef sigc::signal<unsaved_document*> safe_close_signal_t;\n\t/// Signal that will be emitted prior to safe shutdown to \"gather\" unsaved documents\n\tsafe_close_signal_t m_safe_close_signal;\n\t/// Stores the user-customizable UI layouts state\n\tbool m_custom_layouts;\n\t/// Stores the current global assign hotkeys state\n\tbool m_assign_hotkeys;\n};\n\n////////////////////////////////////////////////////////////////////////////\n// application_state\n\napplication_state& application_state::instance()\n{\n\tstatic application_state* g_instance = 0;\n\tif(!g_instance)\n\t\tg_instance = new application_state();\n\n\treturn *g_instance;\n}\n\napplication_state::application_state() :\n\tm_implementation(new implementation())\n{\n}\n\napplication_state::~application_state()\n{\n\tdelete m_implementation;\n}\n\nsigc::connection application_state::connect_safe_close_signal(const sigc::slot<unsaved_document*>& Slot)\n{\n\treturn m_implementation->m_safe_close_signal.connect(Slot);\n}\n\nbool application_state::safe_close(Gtk::Window& Parent)\n{\n\tif(k3d::batch_mode())\n\t\treturn k3d::application().exit();\n\t\n\tsafe_close_dialog::entries_t entries;\n\n\timplementation::safe_close_signal_t::slot_list_type slots = m_implementation->m_safe_close_signal.slots();\n\tfor(implementation::safe_close_signal_t::slot_list_type::iterator slot = slots.begin(); slot != slots.end(); ++slot)\n\t{\n\t\tunsaved_document* doc = (*slot)();\n\t\tif(doc && doc->unsaved_changes())\n\t\t\tentries.push_back(safe_close_dialog::entry(doc));\n\t}\n\n\tif(!entries.empty())\n\t{\n\t\tstd::sort(entries.begin(), entries.end(), implementation::sort_by_title());\n\n\t\tswitch(safe_close_dialog::run(Parent, entries))\n\t\t{\n\t\t\tcase Gtk::RESPONSE_NONE:\n\t\t\tcase Gtk::RESPONSE_CANCEL:\n\t\t\tcase Gtk::RESPONSE_DELETE_EVENT:\n\t\t\t\treturn false;\n\t\t\tcase Gtk::RESPONSE_CLOSE:\n\t\t\t\treturn k3d::application().exit();\n\t\t\tcase Gtk::RESPONSE_OK:\n\t\t\t\tfor(safe_close_dialog::entries_t::const_iterator entry = entries.begin(); entry != entries.end(); ++entry)\n\t\t\t\t{\n\t\t\t\t\tif(entry->save)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!entry->document->save_unsaved_changes())\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn k3d::application().exit();\n\t\t}\n\t}\n\t\n\treturn k3d::application().exit();\n}\n\nvoid application_state::enable_custom_layouts(const bool Enabled)\n{\n\tm_implementation->m_custom_layouts = Enabled;\n}\n\nconst bool application_state::custom_layouts()\n{\n\treturn m_implementation->m_custom_layouts;\n}\n\nvoid application_state::enable_hotkey_assignment(const bool Enabled)\n{\n\tm_implementation->m_assign_hotkeys = Enabled;\n}\n\nconst bool application_state::assign_hotkeys()\n{\n\treturn m_implementation->m_assign_hotkeys;\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/application_state.h",
    "content": "#ifndef K3DSDK_NGUI_APPLICATION_STATE_H\n#define K3DSDK_NGUI_APPLICATION_STATE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/data.h>\n#include <set>\n\nnamespace Gtk { class Window; }\n\nnamespace k3d { namespace ngui { class unsaved_document; } }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/// This ugly little fellow stores global (application-wide) user interface state in one place to minimize coupling between UI components\nclass application_state\n{\npublic:\n\t/// Singleton access to the global application_state object\n\tstatic application_state& instance();\n\n\t/// Connects a slot to a signal that will be called prior to safe shutdown.\n\tsigc::connection connect_safe_close_signal(const sigc::slot<k3d::ngui::unsaved_document*>& Slot);\n\t/// Attempts to safely close the application, saving unsaved documents and giving the user a chance to cancel.  Returns true iff the application will close.\n\tbool safe_close(Gtk::Window& Parent);\n\n\t/// Enables / disables use of user-customized UI layouts\n\tvoid enable_custom_layouts(const bool Enabled = true);\n\t/// Returns true if user-customized UI layouts are enabled\n\tconst bool custom_layouts();\n\n\t/// Enables / disables interactive hotkey assignment\n\tvoid enable_hotkey_assignment(const bool Enabled = true);\n\t/// Returns true if dynamic hotkey assignment is enabled\n\tconst bool assign_hotkeys();\n\nprivate:\n\tapplication_state();\n\tapplication_state(const application_state&);\n\tapplication_state& operator=(const application_state&);\n\t~application_state();\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_APPLICATION_STATE_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/application_window.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/application_state.h>\n#include <k3dsdk/ngui/application_window.h>\n\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/application.h>\n\n#include <gdk/gdkkeysyms.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// application_window\n\napplication_window::application_window() :\n\tbase(Gtk::WINDOW_TOPLEVEL)\n{\n\tk3d::application().connect_close_signal(sigc::mem_fun(*this, &application_window::close));\n}\n\nbool application_window::on_key_press_event(GdkEventKey* event)\n{\n\tif(event->keyval == GDK_Escape)\n\t{\n\t\tclose();\n\t\treturn true;\n\t}\n\n\treturn base::on_key_press_event(event);\n}\n\nbool application_window::on_delete_event(GdkEventAny* event)\n{\n\tclose();\n\treturn true;\n}\n\nvoid application_window::close()\n{\n\ton_close();\n\tdelete this;\n}\n\nvoid application_window::on_close()\n{\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/application_window.h",
    "content": "#ifndef K3DSDK_NGUI_APPLICATION_WINDOW_H\n#define K3DSDK_NGUI_APPLICATION_WINDOW_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/window.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// application_window\n\n/// Provides a standard top-level window that will be closed automatically if the application is closed\nclass application_window :\n        public Gtk::Window\n{\n\ttypedef Gtk::Window base;\n\npublic:\n\tapplication_window();\n\tvirtual ~application_window() {}\n\n\tbool on_key_press_event(GdkEventKey* event);\n\tbool on_delete_event(GdkEventAny* event);\n\n\t/// Closes the window\n\tvoid close();\n\nprivate:\n\t/// Override in derived classes to handle cleanup when the window is closed\n\tvirtual void on_close();\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_APPLICATION_WINDOW_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/asynchronous_update.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/ngui/asynchronous_update.h>\n#include <k3dsdk/ngui/utility.h>\n\n#include <glibmm/main.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// asynchronous_update\n\nasynchronous_update::asynchronous_update() :\n\tm_block_updates(false)\n{\n}\n\t\nasynchronous_update::~asynchronous_update()\n{\n}\n\nvoid asynchronous_update::schedule_update()\n{\n\tif(!m_idle_connection.connected())\n\t\tm_idle_connection = Glib::signal_idle().connect(sigc::mem_fun(*this, &asynchronous_update::on_idle));\n}\n\nvoid asynchronous_update::block_updates()\n{\n\tm_block_updates = true;\n}\n\nvoid asynchronous_update::unblock_updates()\n{\n\tm_block_updates = false;\n}\n\nbool asynchronous_update::on_idle()\n{\n\tif(!m_block_updates)\n\t\ton_update();\n\n\tm_idle_connection.disconnect();\n\n\treturn false;\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/asynchronous_update.h",
    "content": "#ifndef K3DSDK_NGUI_ASYNCHRONOUS_UPDATE_H\n#define K3DSDK_NGUI_ASYNCHRONOUS_UPDATE_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// asynchronous_update\n\n/// Mixin class that can be used to schedule updates that will only occur when the UI is idle\nclass asynchronous_update :\n\tpublic virtual sigc::trackable\n{\npublic:\n\tasynchronous_update();\n\tvirtual ~asynchronous_update();\n\n\t/// Call this to schedule an update that will occur when the UI is idle ... multiple calls will result in only one update.\n\tvoid schedule_update();\n\t/// Call this to block any pending updates so that on_update() won't be called\n\tvoid block_updates();\n\t/// Call this to unblock updates so that on_update() will be called normally once again.  note: any updates that were pending when block_updates() was called are lost\n\tvoid unblock_updates();\n\n\t\n\t/// Implement this in your derived class to handle updates when the UI is idle.\n\tvirtual void on_update() = 0;\n\nprivate:\n\t/// Called by the signal system when the UI is idle\n\tbool on_idle();\n\t/// Used to track pending idle events\n\tsigc::connection m_idle_connection;\n\t/// If true, calls to on_update() are disabled\n\tbool m_block_updates;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_ASYNCHRONOUS_UPDATE_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/auto_property_page.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/angle_axis.h>\n#include <k3dsdk/ngui/auto_property_page.h>\n#include <k3dsdk/ngui/bitmap_preview.h>\n#include <k3dsdk/ngui/bounding_box.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/check_button.h>\n#include <k3dsdk/ngui/collapsible_frame.h>\n#include <k3dsdk/ngui/color_chooser.h>\n#include <k3dsdk/ngui/combo_box.h>\n#include <k3dsdk/ngui/custom_property_control.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/entry.h>\n#include <k3dsdk/ngui/enumeration_chooser.h>\n#include <k3dsdk/ngui/node_chooser.h>\n#include <k3dsdk/ngui/node_collection_chooser.h>\n#include <k3dsdk/ngui/path_chooser.h>\n#include <k3dsdk/ngui/point3.h>\n#include <k3dsdk/ngui/property_button.h>\n#include <k3dsdk/ngui/property_label.h>\n#include <k3dsdk/ngui/script_button.h>\n#include <k3dsdk/ngui/spin_button.h>\n#include <k3dsdk/ngui/text.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/imetadata.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/user_property.h>\n#include <k3dsdk/utility.h>\n\n// Not strictly required to compile, but this #include ensures that we have a std::typeinfo for k3d::mesh that matches the SDK (i.e. we don't break the ODR)\n#include <k3dsdk/mesh.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/image.h>\n#include <gtkmm/stock.h>\n#include <gtkmm/table.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace auto_property_page\n{\n\n///////////////////////////////////////////////////////////////////////////\n// control::implementation\n\nclass control::implementation\n{\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState)\n\t{\n\t}\n\n\tvoid set_properties(const objects_t& Objects)\n\t{\n\t\tiproperty_group_collection::groups_t final_groups;\n\n\t\tif(Objects.size() == 1) // As a special case when displaying a single object ...\n\t\t{\n\t\t\t// Get the node properties, grouped together ...\n\t\t\tif(iproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(Objects[0]))\n\t\t\t{\n\t\t\t\tiproperty_group_collection::group builtin_properties(_(\"Builtin Properties\"));\n\t\t\t\tiproperty_group_collection::group user_properties(_(\"User Properties\"));\n\n\t\t\t\tconst iproperty_collection::properties_t properties = property_collection->properties();\n\t\t\t\tfor(iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t\t\t{\n\t\t\t\t\tif(dynamic_cast<iuser_property*>(*property))\n\t\t\t\t\t\tuser_properties.properties.push_back(*property);\n\t\t\t\t\telse\n\t\t\t\t\t\tbuiltin_properties.properties.push_back(*property);\n\t\t\t\t}\n\n\t\t\t\tif(iproperty_group_collection* const property_group_collection = dynamic_cast<iproperty_group_collection*>(Objects[0]))\n\t\t\t\t{\n\t\t\t\t\tconst iproperty_group_collection::groups_t groups = property_group_collection->property_groups();\n\t\t\t\t\tfor(iproperty_group_collection::groups_t::const_iterator group = groups.begin(); group != groups.end(); ++group)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(iproperty_collection::properties_t::const_iterator property = group->properties.begin(); property != group->properties.end(); ++property)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbuiltin_properties.properties.erase(\n\t\t\t\t\t\t\t\tstd::remove(builtin_properties.properties.begin(), builtin_properties.properties.end(), *property),\n\t\t\t\t\t\t\t\tbuiltin_properties.properties.end());\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(!group->properties.empty())\n\t\t\t\t\t\t\tfinal_groups.push_back(*group);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(!builtin_properties.properties.empty())\n\t\t\t\t\tfinal_groups.insert(final_groups.begin(), builtin_properties);\n\t\t\t\tif(!user_properties.properties.empty())\n\t\t\t\t\tfinal_groups.push_back(user_properties);\n\t\t\t}\n\t\t}\n\t\telse // Display multiple objects ...\n\t\t{\n\t\t\t// For each object ...\n\t\t\tfor(objects_t::const_iterator object = Objects.begin(); object != Objects.end(); ++object)\n\t\t\t{\n\t\t\t\t// Create a property group ...\n\t\t\t\tiproperty_group_collection::group group(_(\"Unknown object type\"));\n\n\t\t\t\t// Assign the group a name based on the node name or the factory name ...\n\t\t\t\tif(inode* const node = dynamic_cast<inode*>(*object))\n\t\t\t\t{\n\t\t\t\t\tgroup.name = node->name();\n\n\t\t\t\t\tif(group.name.empty())\n\t\t\t\t\t\tgroup.name = node->factory().name();\n\t\t\t\t}\n\n\t\t\t\tif(iproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(*object))\n\t\t\t\t\tgroup.properties = property_collection->properties();\n\n\t\t\t\tfinal_groups.push_back(group);\n\t\t\t}\n\t\t}\n\n\t\tset_properties(final_groups);\n\t}\n\n\tvoid set_properties(const iproperty_group_collection::groups_t& PropertyGroups)\n\t{\n\t\t// Delete existing controls ...\n\t\tGlib::ListHandle<Gtk::Widget*> children = m_vbox.get_children();\n\t\tstd::for_each(children.begin(), children.end(), delete_object());\n\n\t\tistate_recorder* const state_recorder = &m_document_state.document().state_recorder();\n\n\t\tfor(iproperty_group_collection::groups_t::const_iterator group = PropertyGroups.begin(); group != PropertyGroups.end(); ++group)\n\t\t{\n\t\t\tcollapsible_frame::control* const frame = new collapsible_frame::control(group->name, m_collapsible_frame_group);\n\t\t\tframe->get_accessible()->set_name(group->name);\n\t\t\tm_vbox.pack_start(*manage(frame), Gtk::PACK_SHRINK);\n\n\t\t\tGtk::Table* const table = new Gtk::Table(group->properties.size(), 5, false);\n\t\t\tframe->add(*manage(table));\n\n\t\t\t// Store entries for focus chain within table\n\t\t\tstd::list<Gtk::Widget*> entry_list;\n\n\t\t\tconst unsigned long prop_delete_begin = 0;\n\t\t\tconst unsigned long prop_delete_end = 1;\n\t\t\tconst unsigned long prop_button_begin = 1;\n\t\t\tconst unsigned long prop_button_end = 2;\n\t\t\tconst unsigned long prop_label_begin = 2;\n\t\t\tconst unsigned long prop_label_end = 3;\n\t\t\tconst unsigned long prop_control_begin = 3;\n\t\t\tconst unsigned long prop_control_end = 4;\n\n\t\t\t// For each property within the group ...\n\t\t\tunsigned int row = 0;\n\t\t\tfor(unsigned int i = 0; i != group->properties.size(); ++i, ++row)\n\t\t\t{\n\t\t\t\tiproperty& property = *group->properties[i];\n\n\t\t\t\tconst string_t property_name = property.property_name();\n\t\t\t\tconst std::type_info& property_type = property.property_type();\n\t\t\t\t\n\t\t\t\t// Provide a property button for the property ...\n\t\t\t\ttable->attach(*Gtk::manage(\n\t\t\t\t\tnew property_button::control(property_widget::proxy(m_document_state,property))),\n\t\t\t\t\tprop_button_begin, prop_button_end, row, row + 1, Gtk::SHRINK, Gtk::SHRINK);\n\n\t\t\t\t// Provide a label for the property ...\n\t\t\t\ttable->attach(*Gtk::manage(\n\t\t\t\t\tnew property_label::control(property_widget::proxy(m_document_state, property))),\n\t\t\t\t\tprop_label_begin, prop_label_end, row, row + 1, Gtk::FILL | Gtk::SHRINK, Gtk::FILL | Gtk::SHRINK);\n\n\t\t\t\t// Keep track of the control that's created (if any) ...\n\t\t\t\tGtk::Widget* control = 0;\n\n\t\t\t\t// Look for custom property controls that match our property role ...\n\t\t\t\tif(!control)\n\t\t\t\t{\n\t\t\t\t\t// Look for an explicit property role ...\n\t\t\t\t\tif(imetadata* const property_metadata = dynamic_cast<imetadata*>(&property))\n\t\t\t\t\t{\n\t\t\t\t\t\tconst string_t property_control_role = property_metadata->get_metadata()[k3d::metadata::key::role()];\n\t\t\t\t\t\tif(property_control_role.size())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Now see if we can find a custom property control that matches the role ...\n\t\t\t\t\t\t\tstatic plugin::factory::collection_t control_factories = plugin::factory::lookup(\"ngui:component-type\", \"property-control\");\n\t\t\t\t\t\t\tfor(plugin::factory::collection_t::const_iterator factory = control_factories.begin(); factory != control_factories.end(); ++factory)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif((**factory).metadata()[\"ngui:property-role\"] != property_control_role)\n\t\t\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t\t\tif(custom_property::control* const custom_control = plugin::create<custom_property::control>(**factory))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif(control = dynamic_cast<Gtk::Widget*>(custom_control))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tcustom_control->initialize(m_document_state, property);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tk3d::log() << error << \"custom property control must derive from Gtk::Widget\" << std::endl;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tk3d::log() << error << \"error creating custom property control\" << std::endl;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Look for custom property controls that match our property type ...\n\t\t\t\tif(!control)\n\t\t\t\t{\n\t\t\t\t\t// Get the C++ property type ...\n\t\t\t\t\tconst string_t property_control_type = k3d::type_string(property_type);\n\t\t\t\t\tif(property_control_type.size())\n\t\t\t\t\t{\n\t\t\t\t\t\t// Now see if we can find a custom property control that matches the type ...\n\t\t\t\t\t\tstatic plugin::factory::collection_t control_factories = plugin::factory::lookup(\"ngui:component-type\", \"property-control\");\n\t\t\t\t\t\tfor(plugin::factory::collection_t::const_iterator factory = control_factories.begin(); factory != control_factories.end(); ++factory)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif((**factory).metadata()[\"ngui:property-type\"] != property_control_type)\n\t\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t\tif(custom_property::control* const custom_control = plugin::create<custom_property::control>(**factory))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif(control = dynamic_cast<Gtk::Widget*>(custom_control))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcustom_control->initialize(m_document_state, property);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tk3d::log() << error << \"custom property control must derive from Gtk::Widget\" << std::endl;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::log() << error << \"error creating custom property control\" << std::endl;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Otherwise, provide our own hard-wired controls based on property type ...\n\t\t\t\tif(!control)\n\t\t\t\t{\n\t\t\t\t\t// Boolean properties ...\n\t\t\t\t\tif(property_type == typeid(bool_t))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = new check_button::control(check_button::proxy(property, state_recorder, property_name));\n\t\t\t\t\t}\n\t\t\t\t\t// Scalar properties ...\n\t\t\t\t\telse if(property_type == typeid(int32_t) || property_type == typeid(uint32_t) || property_type == typeid(float_t) || property_type == typeid(double_t))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = new spin_button::control(spin_button::model(property), state_recorder);\n\t\t\t\t\t}\n\t\t\t\t\t// Color properties ...\n\t\t\t\t\telse if(property_type == typeid(color))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = new color_chooser::control(color_chooser::proxy(property, state_recorder, property_name));\n\t\t\t\t\t}\n\t\t\t\t\t// String properties ...\n\t\t\t\t\telse if(property_type == typeid(string_t))\n\t\t\t\t\t{\n\t\t\t\t\t\tif(dynamic_cast<ienumeration_property*>(&property))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontrol = new enumeration_chooser::control(enumeration_chooser::model(property), state_recorder);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(dynamic_cast<iscript_property*>(&property))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontrol = new script_button::control(script_button::model(property), state_recorder, property_name);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(ilist_property<string_t>* const list_property = dynamic_cast<ilist_property<string_t>*>(&property))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcombo_box::control* const combo_box = new combo_box::control(combo_box::proxy(property, state_recorder, property_name));\n\t\t\t\t\t\t\tcombo_box->set_values(list_property->property_values());\n\t\t\t\t\t\t\tcontrol = combo_box;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(imetadata* const metadata = dynamic_cast<imetadata*>(&property))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\timetadata::metadata_t property_metadata = metadata->get_metadata();\n\t\t\t\t\t\t\t\tif(property_metadata[\"k3d:property-type\"] == \"k3d:multi-line-text\")\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcontrol = new text::control(text::model(property), state_recorder);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif(!control)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcontrol = new entry::control(entry::model(property), state_recorder);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// inode* properties ...\n\t\t\t\t\telse if(property_type == typeid(inode*))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = new node_chooser::control(node_chooser::proxy(m_document_state, property, state_recorder, property_name), node_chooser::filter(property));\n\t\t\t\t\t}\n\t\t\t\t\telse if(property_type == typeid(inode_collection_property::nodes_t))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = new node_collection_chooser::control(node_collection_chooser::model(property), state_recorder);\n\t\t\t\t\t}\n\t\t\t\t\t// Bitmap properties ...\n\t\t\t\t\telse if(property_type == type_id_k3d_bitmap_ptr())\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = new bitmap_preview::control(bitmap_preview::proxy(property));\n\t\t\t\t\t}\n\t\t\t\t\t// Filesystem-path properties ...\n\t\t\t\t\telse if(property_type == typeid(filesystem::path))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = new path_chooser::control(path_chooser::proxy(property, state_recorder, property_name));\n\t\t\t\t\t}\n\t\t\t\t\t// bounding_box3 properties ...\n\t\t\t\t\telse if(property_type == typeid(bounding_box3))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = new bounding_box::control(bounding_box::proxy(property));\n\t\t\t\t\t}\n\t\t\t\t\t// point3 properties ...\n\t\t\t\t\telse if(property_type == typeid(point3) || property_type == typeid(vector3) || property_type == typeid(normal3))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = new point::control(point::proxy(property));\n\t\t\t\t\t}\n\t\t\t\t\t// angle_axis properties ...\n\t\t\t\t\telse if(property_type == typeid(k3d::angle_axis))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = new k3d::ngui::angle_axis::control(k3d::ngui::angle_axis::proxy(property, state_recorder, property_name));\n\t\t\t\t\t}\n\t\t\t\t\t// Transformation properties ...\n\t\t\t\t\telse if(property_type == typeid(matrix4))\n\t\t\t\t\t{\n\t\t\t\t\t}\n\t\t\t\t\t// Mesh properties ...\n\t\t\t\t\telse if(property_type == typeid(mesh*))\n\t\t\t\t\t{\n\t\t\t\t\t}\n\t\t\t\t\t// HPoint properties ...\n\t\t\t\t\telse if(property_type == typeid(point4))\n\t\t\t\t\t{\n\t\t\t\t\t}\n\t\t\t\t\t// Pipeline-profiler records ...\n\t\t\t\t\telse if(property_type == typeid(std::map<inode*, std::map<string_t, double_t> >))\n\t\t\t\t\t{\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tlog() << warning << k3d_file_reference << \"unknown property type: \" << property_type.name() << \" name: \" << property_name << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Pack the new control into the rest of the UI\n\t\t\t\tif(control)\n\t\t\t\t{\n\t\t\t\t\tcontrol->get_accessible()->set_name(property_name + \"_control\");\n\t\t\t\t\ttable->attach(*manage(control), prop_control_begin, prop_control_end, row, row + 1, Gtk::FILL | Gtk::SHRINK, Gtk::FILL | Gtk::SHRINK);\n\t\t\t\t\tentry_list.push_back(control);\n\t\t\t\t}\n\n\t\t\t\t// Provide a \"delete\" button for user properties ...\n\t\t\t\tif(dynamic_cast<iuser_property*>(&property))\n\t\t\t\t{\n\t\t\t\t\tiproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(property.property_node());\n\n\t\t\t\t\tGtk::Button* const control =\n\t\t\t\t\t\tbutton::create(*Gtk::manage(new Gtk::Image(Gtk::Stock::DELETE, Gtk::ICON_SIZE_BUTTON)))\n\t\t\t\t\t\t<< connect_button(sigc::bind(sigc::bind(sigc::mem_fun(*this, &implementation::on_delete_user_property), &property), property_collection))\n\t\t\t\t\t\t<< set_tooltip(_(\"Delete user property (no undo)\"));\n\n\t\t\t\t\ttable->attach(*manage(control), prop_delete_begin, prop_delete_end, row, row + 1, Gtk::SHRINK, Gtk::SHRINK);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set focus chain ...\n\t\t\ttable->set_focus_chain(entry_list);\n\t\t}\n\n\t\t// Display everything ...\n\t\tm_vbox.show_all();\n\t}\n\n\tvoid on_delete_user_property(iproperty_collection* Collection, iproperty* Property)\n\t{\n\t\treturn_if_fail(Collection);\n\t\treturn_if_fail(Property);\n\t\treturn_if_fail(dynamic_cast<iuser_property*>(Property));\n\n\t\trecord_state_change_set change_set(m_document_state.document(), \"Delete user property\", K3D_CHANGE_SET_CONTEXT);\n\n\t\tif(m_document_state.document().state_recorder().current_change_set())\n\t\t\tm_document_state.document().state_recorder().current_change_set()->record_old_state(new user::property_container(*Collection));\n\n\t\tCollection->unregister_property(*Property);\n\t\tif(ipersistent* const persistent = dynamic_cast<ipersistent*>(Property))\n\t\t{\n\t\t\tif(ipersistent_collection* const persistent_collection = dynamic_cast<ipersistent_collection*>(Collection))\n\t\t\t\tpersistent_collection->disable_serialization(*persistent);\n\t\t}\n\n\t\tundoable_delete(Property, m_document_state.document());\n\n\t\tif(m_document_state.document().state_recorder().current_change_set())\n\t\t\tm_document_state.document().state_recorder().current_change_set()->record_new_state(new user::property_container(*Collection));\n\t}\n\n\tdocument_state& m_document_state;\n\t/// Stores the collection of property controls\n\tGtk::VBox m_vbox;\n\t/// Groups collapsible frames together\n\tcollapsible_frame::group m_collapsible_frame_group;\n};\n\n///////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(document_state& DocumentState) :\n\tm_implementation(new implementation(DocumentState))\n{\n}\n\ncontrol::~control()\n{\n\tdelete m_implementation;\n}\n\nvoid control::set_properties(iunknown* Object)\n{\n\tm_implementation->set_properties(objects_t(1, Object));\n}\n\nvoid control::set_properties(const objects_t& Objects)\n{\n\tm_implementation->set_properties(Objects);\n}\n\nvoid control::set_properties(const iproperty_group_collection::groups_t& PropertyGroups)\n{\n\tm_implementation->set_properties(PropertyGroups);\n}\n\nGtk::Widget& control::get_widget()\n{\n\treturn m_implementation->m_vbox;\n}\n\n} // namespace auto_property_page\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/auto_property_page.h",
    "content": "#ifndef K3DSDK_NGUI_AUTO_PROPERTY_PAGE_H\n#define K3DSDK_NGUI_AUTO_PROPERTY_PAGE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty_group_collection.h>\n#include <k3dsdk/types.h>\n#include <vector>\n\nnamespace Gtk { class Widget; }\n\nnamespace k3d\n{\n\nclass iproperty;\nclass iunknown;\n\nnamespace ngui\n{\n\nclass document_state;\n\nnamespace auto_property_page\n{\n\n/// Provides a widget that auto-generates controls for a collection of properties\nclass control\n{\npublic:\n\tcontrol(document_state& DocumentState);\n\t~control();\n\n\t/// Auto-generate controls for a single object of arbitrary type.\n\tvoid set_properties(iunknown* Object);\n\t/// Auto-generate controls for a collection of objects of arbitrary type.\n\ttemplate<typename iterator_t>\n\tvoid set_properties(const iterator_t& Begin, const iterator_t& End)\n\t{\n\t\tset_properties(objects_t(Begin, End));\n\t}\n\t/// Auto-generate controls for a collection of properties organized into arbitrary groups.\n\tvoid set_properties(const iproperty_group_collection::groups_t& PropertyGroups);\n\n\t/// Called to get the toolbar widget for display\n\tGtk::Widget& get_widget();\n\nprivate:\n\ttypedef std::vector<iunknown*> objects_t;\n\tvoid set_properties(const objects_t& Objects);\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace auto_property_page\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_AUTO_PROPERTY_PAGE_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/auto_property_toolbar.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/auto_property_toolbar.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/property.h>\n#include <k3dsdk/ngui/render.h>\n#include <k3dsdk/ngui/toggle_button.h>\n#include <k3dsdk/ngui/toolbar.h>\n#include <k3dsdk/ngui/uri.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/imesh_storage.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/irender_animation.h>\n#include <k3dsdk/irender_camera_animation.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/irender_camera_preview.h>\n#include <k3dsdk/irender_frame.h>\n#include <k3dsdk/irender_preview.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/mesh.h> // for typeinfo crash on Win32\n#include <k3dsdk/utility.h>\n\n#include <gtkmm/image.h>\n#include <gtkmm/stock.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace auto_property_toolbar\n{\n\n/// toggle_button model that turns a property-bypass into a togglable action\nclass bypass_property_proxy :\n\tpublic toggle_button::imodel\n{\npublic:\n\tbypass_property_proxy(document_state& DocumentState, iproperty& InputProperty, iproperty& OutputProperty) :\n\t\tm_document_state(DocumentState),\n\t\tm_input_property(InputProperty),\n\t\tm_output_property(OutputProperty)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn _(\"Bypass modifier\");\n\t}\n\n\tconst bool_t value()\n\t{\n\t\t// true == bypassed, false == normal\n\t\treturn m_document_state.document().pipeline().dependency(m_output_property) == &m_input_property;\n\t}\n\n\tvoid set_value(const bool_t Value)\n\t{\n\t\t// true == bypassed, false == normal\n\t\tipipeline::dependencies_t dependencies;\n\t\tdependencies.insert(std::make_pair(&m_output_property, Value ? &m_input_property : static_cast<iproperty*>(0)));\n\t\tm_document_state.document().pipeline().set_dependencies(dependencies);\n\n\t\tm_changed_signal.emit();\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_changed_signal.connect(Slot);\n\t}\n\nprivate:\n\tbypass_property_proxy(const bypass_property_proxy&);\n\tbypass_property_proxy& operator=(const bypass_property_proxy&);\n\n\tdocument_state& m_document_state;\n\tiproperty& m_input_property;\n\tiproperty& m_output_property;\n\n\tsigc::signal<void> m_changed_signal;\n};\n\n///////////////////////////////////////////////////////////////////////////\n// control::implementation\n\nclass control::implementation\n{\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState),\n\t\tm_toolbar()\n\t{\n\t}\n\n\tvoid set_object(iunknown* Object)\n\t{\n\t\t// Delete existing icons ...\n\t\tGlib::ListHandle<Gtk::Widget*> children = m_toolbar.get_children();\n\t\tstd::for_each(children.begin(), children.end(), delete_object());\n\n\t\t// Add a help button ...\n\t\tif(inode* const node = dynamic_cast<inode*>(Object))\n\t\t{\n\t\t\tconst string_t uri = \"http://www.k-3d.org/wiki/\" + node->factory().name();\n\n\t\t\tGtk::Button* const control =\n\t\t\t\tnew Gtk::Button(Gtk::Stock::HELP)\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::ptr_fun(&k3d::ngui::uri::open), uri))\n\t\t\t\t\t<< set_tooltip(_(\"Display online help.\"));\n\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\t// Add controls for managing user properties ...\n\t\tif(inode* const node = dynamic_cast<inode*>(Object))\n\t\t{\n\t\t\tGtk::Button* const control =\n\t\t\t\tbutton::create(*Gtk::manage(new Gtk::Image(Gtk::Stock::ADD, Gtk::ICON_SIZE_BUTTON)))\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_add_user_property), node))\n\t\t\t\t\t<< set_tooltip(_(\"Add a user property.\"));\n\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\t// Add controls for cameras\n\t\tif(icamera* const camera = dynamic_cast<icamera*>(Object))\n\t\t{\n\t\t\tGtk::Button* const camera_preview =\n\t\t\t\tbutton::create(*Gtk::manage(new Gtk::Image(load_icon(\"render_preview\", Gtk::ICON_SIZE_BUTTON))))\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_render_camera_camera_preview), camera))\n\t\t\t\t\t<< set_tooltip(_(\"Render Preview\"));\n\n\t\t\tGtk::Button* const camera_frame =\n\t\t\t\tbutton::create(*Gtk::manage(new Gtk::Image(load_icon(\"render_frame\", Gtk::ICON_SIZE_BUTTON))))\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_render_camera_camera_frame), camera))\n\t\t\t\t\t<< set_tooltip(_(\"Render Frame\"));\n\n\t\t\tGtk::Button* const camera_animation =\n\t\t\t\tbutton::create(*Gtk::manage(new Gtk::Image(load_icon(\"render_animation\", Gtk::ICON_SIZE_BUTTON))))\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_render_camera_camera_animation), camera))\n\t\t\t\t\t<< set_tooltip(_(\"Render Animation\"));\n\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(camera_preview), Gtk::PACK_SHRINK);\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(camera_frame), Gtk::PACK_SHRINK);\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(camera_animation), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\t// Add controls for camera render engines ...\n\t\tif(irender_camera_preview* const render_camera_preview = dynamic_cast<irender_camera_preview*>(Object))\n\t\t{\n\t\t\tGtk::Button* const control =\n\t\t\t\tbutton::create(*Gtk::manage(new Gtk::Image(load_icon(\"render_preview\", Gtk::ICON_SIZE_BUTTON))))\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_render_camera_preview), render_camera_preview))\n\t\t\t\t\t<< set_tooltip(_(\"Render Preview\"));\n\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\tif(irender_camera_frame* const render_camera_frame = dynamic_cast<irender_camera_frame*>(Object))\n\t\t{\n\t\t\tGtk::Button* const control =\n\t\t\t\tbutton::create(*Gtk::manage(new Gtk::Image(load_icon(\"render_frame\", Gtk::ICON_SIZE_BUTTON))))\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_render_camera_frame), render_camera_frame))\n\t\t\t\t\t<< set_tooltip(_(\"Render Frame\"));\n\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\tif(irender_camera_animation* const render_camera_animation = dynamic_cast<irender_camera_animation*>(Object))\n\t\t{\n\t\t\tGtk::Button* const control =\n\t\t\t\tbutton::create(*Gtk::manage(new Gtk::Image(load_icon(\"render_animation\", Gtk::ICON_SIZE_BUTTON))))\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_render_camera_animation), render_camera_animation))\n\t\t\t\t\t<< set_tooltip(_(\"Render Animation\"));\n\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\t// Add controls for render engines\n\t\tif(irender_preview* const render_preview = dynamic_cast<irender_preview*>(Object))\n\t\t{\n\t\t\tGtk::Button* const control =\n\t\t\t\tbutton::create(*Gtk::manage(new Gtk::Image(load_icon(\"render_preview\", Gtk::ICON_SIZE_BUTTON))))\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_render_preview), render_preview))\n\t\t\t\t\t<< set_tooltip(_(\"Render Preview\"));\n\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\tif(irender_frame* const render_frame = dynamic_cast<irender_frame*>(Object))\n\t\t{\n\t\t\tGtk::Button* const control =\n\t\t\t\tbutton::create(*Gtk::manage(new Gtk::Image(load_icon(\"render_frame\", Gtk::ICON_SIZE_BUTTON))))\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_render_frame), render_frame))\n\t\t\t\t\t<< set_tooltip(_(\"Render Frame\"));\n\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\tif(irender_animation* const render_animation = dynamic_cast<irender_animation*>(Object))\n\t\t{\n\t\t\tGtk::Button* const control =\n\t\t\t\tbutton::create(*Gtk::manage(new Gtk::Image(load_icon(\"render_animation\", Gtk::ICON_SIZE_BUTTON))))\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_render_animation), render_animation))\n\t\t\t\t\t<< set_tooltip(_(\"Render Animation\"));\n\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\t// Add a \"reset\" button for nodes that implement imesh_storage (FrozenMesh, external file readers, etc) ...\n\t\tif(imesh_storage* const mesh_storage = dynamic_cast<imesh_storage*>(Object))\n\t\t{\n\t\t\tGtk::Button* const control =\n\t\t\t\tnew Gtk::Button(_(\"Reset Mesh\"))\n\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_reset_mesh), mesh_storage))\n\t\t\t\t\t<< set_tooltip(_(\"Reset / Reload Mesh\"));\n\n\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\t// Add a \"disable\" button for mesh modifiers ...\n\t\tif(imesh_source* const mesh_source = dynamic_cast<imesh_source*>(Object))\n\t\t{\n\t\t\t// Modifiers that take a single mesh input ...\n\t\t\tif(imesh_sink* const mesh_sink = dynamic_cast<imesh_sink*>(Object))\n\t\t\t{\n\t\t\t\tiproperty& bypass_input = mesh_sink->mesh_sink_input();\n\t\t\t\tiproperty& bypass_output = mesh_source->mesh_source_output();\n\n\t\t\t\ttoggle_button::control* const control =\n\t\t\t\t\tnew toggle_button::control(\n\t\t\t\t\t\tnew bypass_property_proxy(m_document_state, bypass_input, bypass_output),\n\t\t\t\t\t\t&m_document_state.document().state_recorder(),\n\t\t\t\t\t\t_(\"Disable\"))\n\t\t\t\t\t\t<< set_tooltip(_(\"Disable / bypass mesh modifier\"));\n\n\t\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t\t}\n\t\t\t// Modifiers that take multiple mesh inputs ...\n\t\t\telse if(imulti_mesh_sink* const mesh_sink = dynamic_cast<imulti_mesh_sink*>(Object))\n\t\t\t{\n\t\t\t\tiproperty* bypass_input = 0;\n\t\t\t\tif(iproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(Object))\n\t\t\t\t{\n\t\t\t\t\tconst iproperty_collection::properties_t properties = property_collection->properties();\n\t\t\t\t\tfor(iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!dynamic_cast<iuser_property*>(*property))\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tif((**property).property_type() != typeid(mesh*))\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tbypass_input = *property;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tiproperty& bypass_output = mesh_source->mesh_source_output();\n\n\t\t\t\tif(bypass_input)\n\t\t\t\t{\n\t\t\t\t\ttoggle_button::control* const control =\n\t\t\t\t\t\tnew toggle_button::control(\n\t\t\t\t\t\t\tnew bypass_property_proxy(m_document_state, *bypass_input, bypass_output),\n\t\t\t\t\t\t\t&m_document_state.document().state_recorder(),\n\t\t\t\t\t\t\t_(\"Disable\"))\n\t\t\t\t\t\t\t<< set_tooltip(_(\"Disable / bypass mesh modifier\"));\n\n\t\t\t\t\tm_toolbar.row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tm_toolbar.show_all();\n\t}\n\n\tvoid on_add_user_property(inode* Node)\n\t{\n\t\tk3d::ngui::property::create(*Node);\n\t}\n\t\n\tvoid on_render_camera_camera_preview(icamera* Camera)\n\t{\n\t       irender_camera_preview* const render_camera_preview = pick_camera_preview_render_engine(m_document_state);\n\t       if(!render_camera_preview)\n\t\t       return;\n\n\t       render(*Camera, *render_camera_preview);\n\t}\n\n\tvoid on_render_camera_camera_frame(icamera* Camera)\n\t{\n\t       irender_camera_frame* const render_camera_frame = pick_camera_still_render_engine(m_document_state);\n\t       if(!render_camera_frame)\n\t\t       return;\n\n\t       render(*Camera, *render_camera_frame);\n\t}\n\n\tvoid on_render_camera_camera_animation(icamera* Camera)\n\t{\n\t       irender_camera_animation* const render_camera_animation = pick_camera_animation_render_engine(m_document_state);\n\t       if(!render_camera_animation)\n\t\t       return;\n\n\t       render(m_document_state, *Camera, *render_camera_animation);\n\t}\n\n\tvoid on_render_camera_preview(irender_camera_preview* RenderCameraPreview)\n\t{\n\t       icamera* const camera = pick_camera(m_document_state);\n\t       if(!camera)\n\t\t       return;\n\n\t       render(*camera, *RenderCameraPreview);\n\t}\n\n\tvoid on_render_camera_frame(irender_camera_frame* RenderCameraFrame)\n\t{\n\t       icamera* const camera = pick_camera(m_document_state);\n\t       if(!camera)\n\t\t       return;\n\n\t       render(*camera, *RenderCameraFrame);\n\t}\n\n\tvoid on_render_camera_animation(irender_camera_animation* RenderCameraAnimation)\n\t{\n\t       icamera* const camera = pick_camera(m_document_state);\n\t       if(!camera)\n\t\t       return;\n\n\t       render(m_document_state, *camera, *RenderCameraAnimation);\n\t}\n\n\tvoid on_render_preview(irender_preview* RenderPreview)\n\t{\n\t\trender(*RenderPreview);\n\t}\n\n\tvoid on_render_frame(irender_frame* RenderFrame)\n\t{\n\t\trender(*RenderFrame);\n\t}\n\n\tvoid on_render_animation(irender_animation* RenderAnimation)\n\t{\n\t\trender(m_document_state, *RenderAnimation);\n\t}\n\n\tvoid on_reset_mesh(imesh_storage* MeshStorage)\n\t{\n\t\tMeshStorage->reset_mesh(0);\n\t}\n\n\tdocument_state& m_document_state;\n\ttoolbar::control m_toolbar;\n};\n\n///////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(document_state& DocumentState) :\n\tm_implementation(new implementation(DocumentState))\n{\n}\n\ncontrol::~control()\n{\n\tdelete m_implementation;\n}\n\nvoid control::set_object(iunknown* Object)\n{\n\tm_implementation->set_object(Object);\n}\n\nGtk::Widget& control::get_widget()\n{\n\treturn m_implementation->m_toolbar;\n}\n\n} // namespace auto_property_toolbar\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/auto_property_toolbar.h",
    "content": "#ifndef K3DSDK_NGUI_AUTO_PROPERTY_TOOLBAR_H\n#define K3DSDK_NGUI_AUTO_PROPERTY_TOOLBAR_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\nnamespace Gtk { class Widget; }\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace ngui\n{\n\nclass document_state;\n\nnamespace auto_property_toolbar\n{\n\n/// Provides a toolbar with an auto-generated collection of icons based on an object's capabilities / type.\nclass control\n{\npublic:\n\tcontrol(document_state& DocumentState);\n\t~control();\n\n\t/// Called to set the toolbar contents based on the given object\n\tvoid set_object(iunknown* Object);\n\n\t/// Called to get the toolbar widget for display\n\tGtk::Widget& get_widget();\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace auto_property_toolbar\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_AUTO_PROPERTY_TOOLBAR_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/basic_input_model.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/basic_input_model.h>\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/vectors.h>\n\n#include <map>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_input_model::implementation\n\nstruct basic_input_model::implementation\n{\n\timplementation() :\n\t\tdouble_click(false),\n\t\ttriple_click(false),\n\t\tdragging(0)\n\t{\n\t}\n\n\tconst bool button(const unsigned long Button) const\n\t{\n\t\tbutton_state_t::const_iterator button = button_state.find(Button);\n\t\tif(button == button_state.end())\n\t\t\treturn false;\n\n\t\treturn button->second;\n\t}\n\n\ttypedef std::map<unsigned long, bool> button_state_t;\n\tbutton_state_t button_state;\n\n\tbool double_click;\n\tbool triple_click;\n\tunsigned long dragging;\n\tk3d::point2 start_mouse;\n\n\tsigc::signal<void, const GdkEventMotion&> mouse_move;\n\n\tsigc::signal<void, const GdkEventButton&> lbutton_down;\n\tsigc::signal<void, const GdkEventButton&> lbutton_up;\n\tsigc::signal<void, const GdkEventButton&> lbutton_click;\n\tsigc::signal<void, const GdkEventButton&> lbutton_double_click;\n\tsigc::signal<void, const GdkEventButton&> lbutton_triple_click;\n\tsigc::signal<void, const GdkEventMotion&> lbutton_start_drag;\n\tsigc::signal<void, const GdkEventMotion&> lbutton_drag;\n\tsigc::signal<void, const GdkEventButton&> lbutton_end_drag;\n\n\tsigc::signal<void, const GdkEventButton&> mbutton_down;\n\tsigc::signal<void, const GdkEventButton&> mbutton_up;\n\tsigc::signal<void, const GdkEventButton&> mbutton_click;\n\tsigc::signal<void, const GdkEventButton&> mbutton_double_click;\n\tsigc::signal<void, const GdkEventButton&> mbutton_triple_click;\n\tsigc::signal<void, const GdkEventMotion&> mbutton_start_drag;\n\tsigc::signal<void, const GdkEventMotion&> mbutton_drag;\n\tsigc::signal<void, const GdkEventButton&> mbutton_end_drag;\n\n\tsigc::signal<void, const GdkEventButton&> rbutton_down;\n\tsigc::signal<void, const GdkEventButton&> rbutton_up;\n\tsigc::signal<void, const GdkEventButton&> rbutton_click;\n\tsigc::signal<void, const GdkEventButton&> rbutton_double_click;\n\tsigc::signal<void, const GdkEventButton&> rbutton_triple_click;\n\tsigc::signal<void, const GdkEventMotion&> rbutton_start_drag;\n\tsigc::signal<void, const GdkEventMotion&> rbutton_drag;\n\tsigc::signal<void, const GdkEventButton&> rbutton_end_drag;\n\n\tsigc::signal<void, const GdkEventScroll&> scroll;\n\tsigc::signal<void, const GdkEventKey&> key_press;\n\tsigc::signal<void, const GdkEventKey&> key_release;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_input_model\n\nbasic_input_model::basic_input_model() :\n\tm_implementation(new implementation())\n{\n}\n\nbasic_input_model::~basic_input_model()\n{\n\tdelete m_implementation;\n}\n\nvoid basic_input_model::button_press_event(GdkEventButton* Event)\n{\n\t// Maintain button state ...\n\tm_implementation->button_state[Event->button] = true;\n\n\t// Keep track of where the mouse pointer was, so we can detect drag operations ...\n\tm_implementation->start_mouse = k3d::point2(Event->x, Event->y);\n\n\t// Triple-click ...\n\tif(Event->type == GDK_3BUTTON_PRESS)\n\t{\n\t\tm_implementation->triple_click = true;\n\t\tswitch(Event->button)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tm_implementation->lbutton_triple_click.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tm_implementation->mbutton_triple_click.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tm_implementation->rbutton_triple_click.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn;\n\t}\n\n\t// Double-click ...\n\tif(Event->type == GDK_2BUTTON_PRESS)\n\t{\n\t\tm_implementation->double_click = true;\n\t\tswitch(Event->button)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tm_implementation->lbutton_double_click.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tm_implementation->mbutton_double_click.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tm_implementation->rbutton_double_click.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn;\n\t}\n\n\t// Send the low-level button-down event ...\n\tswitch(Event->button)\n\t{\n\t\tcase 1:\n\t\t\tm_implementation->lbutton_down.emit(*Event);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tm_implementation->mbutton_down.emit(*Event);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tm_implementation->rbutton_down.emit(*Event);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nvoid basic_input_model::button_release_event(GdkEventButton* Event)\n{\n\t// Maintain button state ...\n\tm_implementation->button_state[Event->button] = false;\n\n\t// Send the low-level button-up event ...\n\tswitch(Event->button)\n\t{\n\t\tcase 1:\n\t\t\tm_implementation->lbutton_up.emit(*Event);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tm_implementation->mbutton_up.emit(*Event);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tm_implementation->rbutton_up.emit(*Event);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\t// If we were dragging, handle the drag-end event ...\n\tif(m_implementation->dragging == Event->button)\n\t{\n\t\tswitch(m_implementation->dragging)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tm_implementation->lbutton_end_drag.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tm_implementation->mbutton_end_drag.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tm_implementation->rbutton_end_drag.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tm_implementation->dragging = 0;\n\t\treturn;\n\t}\n\n\t// Send the click event only if this isn't a double-click or a triple-click ...\n\tif(!m_implementation->double_click && !m_implementation->triple_click)\n\t{\n\t\tswitch(Event->button)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tm_implementation->lbutton_click.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tm_implementation->mbutton_click.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tm_implementation->rbutton_click.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tm_implementation->double_click = false;\n\tm_implementation->triple_click = false;\n}\n\nvoid basic_input_model::motion_notify_event(GdkEventMotion* Event)\n{\n\t// Always send mouse movement events ...\n\tm_implementation->mouse_move.emit(*Event);\n\n\t// If we're already dragging, send drag events ...\n\tif(m_implementation->dragging)\n\t{\n\t\tswitch(m_implementation->dragging)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tm_implementation->lbutton_drag.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tm_implementation->mbutton_drag.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tm_implementation->rbutton_drag.emit(*Event);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn;\n\t}\n\n\t// If the mouse pointer hasn't moved much lately, we're done ...\n\tconst k3d::point2 mouse = k3d::point2(Event->x, Event->y);\n\tconst k3d::vector2 delta = mouse - m_implementation->start_mouse;\n\n\tif(delta.length2() < 9)\n\t\treturn;\n\n\t// Adjust the event structure so it reflects the original start point\n\tEvent->x -= delta[0];\n\tEvent->y -= delta[1];\n\tEvent->x_root -= delta[0];\n\tEvent->y_root -= delta[1];\n\n\t// Start dragging ...\n\tif(m_implementation->button(1))\n\t{\n\t\tm_implementation->dragging = 1;\n\t\tm_implementation->lbutton_start_drag.emit(*Event);\n\t}\n\telse if(m_implementation->button(2))\n\t{\n\t\tm_implementation->dragging = 2;\n\t\tm_implementation->mbutton_start_drag.emit(*Event);\n\t}\n\telse if(m_implementation->button(3))\n\t{\n\t\tm_implementation->dragging = 3;\n\t\tm_implementation->rbutton_start_drag.emit(*Event);\n\t}\n}\n\nvoid basic_input_model::scroll_event(GdkEventScroll* Event)\n{\n\tm_implementation->scroll.emit(*Event);\n}\n\nvoid basic_input_model::key_press_event(GdkEventKey* Event)\n{\n\tm_implementation->key_press.emit(*Event);\n}\n\nvoid basic_input_model::key_release_event(GdkEventKey* Event)\n{\n\tm_implementation->key_release.emit(*Event);\n}\n\nsigc::connection basic_input_model::connect_mouse_move(const sigc::slot<void, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->mouse_move.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_lbutton_down(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_down.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_lbutton_up(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_up.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_lbutton_click(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_click.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_lbutton_double_click(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_double_click.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_lbutton_triple_click(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_triple_click.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_lbutton_start_drag(const sigc::slot<void, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->lbutton_start_drag.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_lbutton_drag(const sigc::slot<void, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->lbutton_drag.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_lbutton_end_drag(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_end_drag.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_mbutton_down(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_down.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_mbutton_up(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_up.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_mbutton_click(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_click.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_mbutton_double_click(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_double_click.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_mbutton_triple_click(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_triple_click.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_mbutton_start_drag(const sigc::slot<void, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->mbutton_start_drag.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_mbutton_drag(const sigc::slot<void, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->mbutton_drag.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_mbutton_end_drag(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_end_drag.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_rbutton_down(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_down.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_rbutton_up(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_up.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_rbutton_click(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_click.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_rbutton_double_click(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_double_click.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_rbutton_triple_click(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_triple_click.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_rbutton_start_drag(const sigc::slot<void, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->rbutton_start_drag.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_rbutton_drag(const sigc::slot<void, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->rbutton_drag.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_rbutton_end_drag(const sigc::slot<void, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_end_drag.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_scroll(const sigc::slot<void, const GdkEventScroll&>& Slot)\n{\n\treturn m_implementation->scroll.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_key_press(const sigc::slot<void, const GdkEventKey&>& Slot)\n{\n\treturn m_implementation->key_press.connect(Slot);\n}\n\nsigc::connection basic_input_model::connect_key_release(const sigc::slot<void, const GdkEventKey&>& Slot)\n{\n\treturn m_implementation->key_release.connect(Slot);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/basic_input_model.h",
    "content": "#ifndef K3DSDK_NGUI_BASIC_INPUT_MODEL_H\n#define K3DSDK_NGUI_BASIC_INPUT_MODEL_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/input_model.h>\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_input_model\n\n/// Implementation of input_model that synthesizes a more useful collection of input events\nclass basic_input_model :\n\tpublic input_model\n{\npublic:\n\tbasic_input_model();\n\tvirtual ~basic_input_model();\n\n\tvirtual void button_press_event(GdkEventButton* Event);\n\tvirtual void button_release_event(GdkEventButton* Event);\n\tvirtual void motion_notify_event(GdkEventMotion* Event);\n\tvirtual void scroll_event(GdkEventScroll* Event);\n\tvirtual void key_press_event(GdkEventKey* Event);\n\tvirtual void key_release_event(GdkEventKey* Event);\n\n\tsigc::connection connect_mouse_move(const sigc::slot<void, const GdkEventMotion&>& Slot);\n\t\n\tsigc::connection connect_lbutton_down(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_lbutton_up(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_lbutton_click(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_lbutton_double_click(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_lbutton_triple_click(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_lbutton_start_drag(const sigc::slot<void, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_lbutton_drag(const sigc::slot<void, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_lbutton_end_drag(const sigc::slot<void, const GdkEventButton&>& Slot);\n\n\tsigc::connection connect_mbutton_down(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_mbutton_up(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_mbutton_click(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_mbutton_double_click(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_mbutton_triple_click(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_mbutton_start_drag(const sigc::slot<void, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_mbutton_drag(const sigc::slot<void, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_mbutton_end_drag(const sigc::slot<void, const GdkEventButton&>& Slot);\n\n\tsigc::connection connect_rbutton_down(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_rbutton_up(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_rbutton_click(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_rbutton_double_click(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_rbutton_triple_click(const sigc::slot<void, const GdkEventButton&>& Slot);\n\tsigc::connection connect_rbutton_start_drag(const sigc::slot<void, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_rbutton_drag(const sigc::slot<void, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_rbutton_end_drag(const sigc::slot<void, const GdkEventButton&>& Slot);\n\n\tsigc::connection connect_scroll(const sigc::slot<void, const GdkEventScroll&>& Slot);\n\tsigc::connection connect_key_press(const sigc::slot<void, const GdkEventKey&>& Slot);\n\tsigc::connection connect_key_release(const sigc::slot<void, const GdkEventKey&>& Slot);\n\nprivate:\n\tstruct implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_BASIC_INPUT_MODEL_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/basic_viewport_input_model.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/basic_viewport_input_model.h>\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/vectors.h>\n\n#include <map>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_viewport_input_model::implementation\n\nstruct basic_viewport_input_model::implementation\n{\n\timplementation() :\n\t\tdouble_click(false),\n\t\ttriple_click(false),\n\t\tdragging(0)\n\t{\n\t}\n\n\tconst bool button(const unsigned long Button) const\n\t{\n\t\tbutton_state_t::const_iterator button = button_state.find(Button);\n\t\tif(button == button_state.end())\n\t\t\treturn false;\n\n\t\treturn button->second;\n\t}\n\n\ttypedef std::map<unsigned long, bool> button_state_t;\n\tbutton_state_t button_state;\n\n\tbool double_click;\n\tbool triple_click;\n\tunsigned long dragging;\n\tk3d::point2 start_mouse;\n\n\tsigc::signal<void, viewport::control&, const GdkEventMotion&> mouse_move;\n\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> lbutton_down;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> lbutton_up;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> lbutton_click;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> lbutton_double_click;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> lbutton_triple_click;\n\tsigc::signal<void, viewport::control&, const GdkEventMotion&> lbutton_start_drag;\n\tsigc::signal<void, viewport::control&, const GdkEventMotion&> lbutton_drag;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> lbutton_end_drag;\n\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> mbutton_down;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> mbutton_up;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> mbutton_click;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> mbutton_double_click;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> mbutton_triple_click;\n\tsigc::signal<void, viewport::control&, const GdkEventMotion&> mbutton_start_drag;\n\tsigc::signal<void, viewport::control&, const GdkEventMotion&> mbutton_drag;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> mbutton_end_drag;\n\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> rbutton_down;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> rbutton_up;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> rbutton_click;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> rbutton_double_click;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> rbutton_triple_click;\n\tsigc::signal<void, viewport::control&, const GdkEventMotion&> rbutton_start_drag;\n\tsigc::signal<void, viewport::control&, const GdkEventMotion&> rbutton_drag;\n\tsigc::signal<void, viewport::control&, const GdkEventButton&> rbutton_end_drag;\n\n\tsigc::signal<void, viewport::control&, const GdkEventScroll&> scroll;\n\tsigc::signal<void, viewport::control&, const GdkEventKey&> key_press;\n\tsigc::signal<void, viewport::control&, const GdkEventKey&> key_release;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_viewport_input_model\n\nbasic_viewport_input_model::basic_viewport_input_model() :\n\tm_implementation(new implementation())\n{\n}\n\nbasic_viewport_input_model::~basic_viewport_input_model()\n{\n\tdelete m_implementation;\n}\n\nvoid basic_viewport_input_model::button_press_event(viewport::control& Viewport, GdkEventButton* Event)\n{\n\t// Maintain button state ...\n\tm_implementation->button_state[Event->button] = true;\n\n\t// Keep track of where the mouse pointer was, so we can detect drag operations ...\n\tm_implementation->start_mouse = k3d::point2(Event->x, Event->y);\n\n\t// Triple-click ...\n\tif(Event->type == GDK_3BUTTON_PRESS)\n\t{\n\t\tm_implementation->triple_click = true;\n\t\tswitch(Event->button)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tm_implementation->lbutton_triple_click.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tm_implementation->mbutton_triple_click.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tm_implementation->rbutton_triple_click.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn;\n\t}\n\n\t// Double-click ...\n\tif(Event->type == GDK_2BUTTON_PRESS)\n\t{\n\t\tm_implementation->double_click = true;\n\t\tswitch(Event->button)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tm_implementation->lbutton_double_click.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tm_implementation->mbutton_double_click.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tm_implementation->rbutton_double_click.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn;\n\t}\n\n\t// Send the low-level button-down event ...\n\tswitch(Event->button)\n\t{\n\t\tcase 1:\n\t\t\tm_implementation->lbutton_down.emit(Viewport, *Event);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tm_implementation->mbutton_down.emit(Viewport, *Event);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tm_implementation->rbutton_down.emit(Viewport, *Event);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nvoid basic_viewport_input_model::button_release_event(viewport::control& Viewport, GdkEventButton* Event)\n{\n\t// Maintain button state ...\n\tm_implementation->button_state[Event->button] = false;\n\n\t// Send the low-level button-up event ...\n\tswitch(Event->button)\n\t{\n\t\tcase 1:\n\t\t\tm_implementation->lbutton_up.emit(Viewport, *Event);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tm_implementation->mbutton_up.emit(Viewport, *Event);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tm_implementation->rbutton_up.emit(Viewport, *Event);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\t// If we were dragging, handle the drag-end event ...\n\tif(m_implementation->dragging == Event->button)\n\t{\n\t\tswitch(m_implementation->dragging)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tm_implementation->lbutton_end_drag.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tm_implementation->mbutton_end_drag.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tm_implementation->rbutton_end_drag.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tm_implementation->dragging = 0;\n\t\treturn;\n\t}\n\n\t// Send the click event only if this isn't a double-click or a triple-click ...\n\tif(!m_implementation->double_click && !m_implementation->triple_click)\n\t{\n\t\tswitch(Event->button)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tm_implementation->lbutton_click.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tm_implementation->mbutton_click.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tm_implementation->rbutton_click.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tm_implementation->double_click = false;\n\tm_implementation->triple_click = false;\n}\n\nvoid basic_viewport_input_model::motion_notify_event(viewport::control& Viewport, GdkEventMotion* Event)\n{\n\t// Always send mouse movement events ...\n\tm_implementation->mouse_move.emit(Viewport, *Event);\n\n\t// If we're already dragging, send drag events ...\n\tif(m_implementation->dragging)\n\t{\n\t\tswitch(m_implementation->dragging)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tm_implementation->lbutton_drag.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tm_implementation->mbutton_drag.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tm_implementation->rbutton_drag.emit(Viewport, *Event);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn;\n\t}\n\n\t// If the mouse pointer hasn't moved much lately, we're done ...\n\tconst k3d::point2 mouse = k3d::point2(Event->x, Event->y);\n\tconst k3d::vector2 delta = mouse - m_implementation->start_mouse;\n\n\tif(delta.length2() < 9)\n\t\treturn;\n\n\t// Adjust the event structure so it reflects the original start point\n\tEvent->x -= delta[0];\n\tEvent->y -= delta[1];\n\tEvent->x_root -= delta[0];\n\tEvent->y_root -= delta[1];\n\n\t// Start dragging ...\n\tif(m_implementation->button(1))\n\t{\n\t\tm_implementation->dragging = 1;\n\t\tm_implementation->lbutton_start_drag.emit(Viewport, *Event);\n\t}\n\telse if(m_implementation->button(2))\n\t{\n\t\tm_implementation->dragging = 2;\n\t\tm_implementation->mbutton_start_drag.emit(Viewport, *Event);\n\t}\n\telse if(m_implementation->button(3))\n\t{\n\t\tm_implementation->dragging = 3;\n\t\tm_implementation->rbutton_start_drag.emit(Viewport, *Event);\n\t}\n}\n\nvoid basic_viewport_input_model::scroll_event(viewport::control& Viewport, GdkEventScroll* Event)\n{\n\tm_implementation->scroll.emit(Viewport, *Event);\n}\n\nvoid basic_viewport_input_model::key_press_event(viewport::control& Viewport, GdkEventKey* Event)\n{\n\tm_implementation->key_press.emit(Viewport, *Event);\n}\n\nvoid basic_viewport_input_model::key_release_event(viewport::control& Viewport, GdkEventKey* Event)\n{\n\tm_implementation->key_release.emit(Viewport, *Event);\n}\n\nsigc::connection basic_viewport_input_model::connect_mouse_move(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->mouse_move.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_lbutton_down(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_down.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_lbutton_up(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_up.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_lbutton_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_click.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_lbutton_double_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_double_click.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_lbutton_triple_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_triple_click.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_lbutton_start_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->lbutton_start_drag.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_lbutton_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->lbutton_drag.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_lbutton_end_drag(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->lbutton_end_drag.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_mbutton_down(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_down.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_mbutton_up(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_up.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_mbutton_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_click.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_mbutton_double_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_double_click.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_mbutton_triple_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_triple_click.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_mbutton_start_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->mbutton_start_drag.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_mbutton_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->mbutton_drag.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_mbutton_end_drag(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->mbutton_end_drag.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_rbutton_down(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_down.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_rbutton_up(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_up.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_rbutton_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_click.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_rbutton_double_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_double_click.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_rbutton_triple_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_triple_click.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_rbutton_start_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->rbutton_start_drag.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_rbutton_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot)\n{\n\treturn m_implementation->rbutton_drag.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_rbutton_end_drag(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot)\n{\n\treturn m_implementation->rbutton_end_drag.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_scroll(const sigc::slot<void, viewport::control&, const GdkEventScroll&>& Slot)\n{\n\treturn m_implementation->scroll.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_key_press(const sigc::slot<void, viewport::control&, const GdkEventKey&>& Slot)\n{\n\treturn m_implementation->key_press.connect(Slot);\n}\n\nsigc::connection basic_viewport_input_model::connect_key_release(const sigc::slot<void, viewport::control&, const GdkEventKey&>& Slot)\n{\n\treturn m_implementation->key_release.connect(Slot);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/basic_viewport_input_model.h",
    "content": "#ifndef K3DSDK_NGUI_BASIC_VIEWPORT_INPUT_MODEL_H\n#define K3DSDK_NGUI_BASIC_VIEWPORT_INPUT_MODEL_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/viewport_input_model.h>\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// basic_viewport_input_model\n\n/// Implementation of viewport_input_model that synthesizes a more useful collection of input events\nclass basic_viewport_input_model :\n\tpublic viewport_input_model\n{\npublic:\n\tbasic_viewport_input_model();\n\tvirtual ~basic_viewport_input_model();\n\n\tvirtual void button_press_event(viewport::control& Viewport, GdkEventButton* Event);\n\tvirtual void button_release_event(viewport::control& Viewport, GdkEventButton* Event);\n\tvirtual void motion_notify_event(viewport::control& Viewport, GdkEventMotion* Event);\n\tvirtual void scroll_event(viewport::control& Viewport, GdkEventScroll* Event);\n\tvirtual void key_press_event(viewport::control& Viewport, GdkEventKey* Event);\n\tvirtual void key_release_event(viewport::control& Viewport, GdkEventKey* Event);\n\n\tsigc::connection connect_mouse_move(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot);\n\t\n\tsigc::connection connect_lbutton_down(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_lbutton_up(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_lbutton_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_lbutton_double_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_lbutton_triple_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_lbutton_start_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_lbutton_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_lbutton_end_drag(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\n\tsigc::connection connect_mbutton_down(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_mbutton_up(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_mbutton_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_mbutton_double_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_mbutton_triple_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_mbutton_start_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_mbutton_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_mbutton_end_drag(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\n\tsigc::connection connect_rbutton_down(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_rbutton_up(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_rbutton_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_rbutton_double_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_rbutton_triple_click(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\tsigc::connection connect_rbutton_start_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_rbutton_drag(const sigc::slot<void, viewport::control&, const GdkEventMotion&>& Slot);\n\tsigc::connection connect_rbutton_end_drag(const sigc::slot<void, viewport::control&, const GdkEventButton&>& Slot);\n\n\tsigc::connection connect_scroll(const sigc::slot<void, viewport::control&, const GdkEventScroll&>& Slot);\n\tsigc::connection connect_key_press(const sigc::slot<void, viewport::control&, const GdkEventKey&>& Slot);\n\tsigc::connection connect_key_release(const sigc::slot<void, viewport::control&, const GdkEventKey&>& Slot);\n\nprivate:\n\tstruct implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_BASIC_VIEWPORT_INPUT_MODEL_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/bitmap_preview.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/bitmap_preview.h>\n\n#include <k3dsdk/property.h>\n\n#include <gdkmm/pixbuf.h>\n#include <gtkmm/image.h>\n\n#include <boost/gil/extension/numeric/resample.hpp>\n#include <boost/gil/extension/numeric/sampler.hpp>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace bitmap_preview\n{\n\n/// Specialization of bitmap_preview::data_proxy for use with iproperty objects\nclass property_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tproperty_proxy(k3d::iproperty& Data) :\n\t\tm_readable_data(Data)\n\t{\n\t}\n\n\tk3d::bitmap* value()\n\t{\n\t\t// As a special-case, if the internal property value is NULL, return the connected property (if any)\n\t\tk3d::bitmap* result = boost::any_cast<k3d::bitmap*>(m_readable_data.property_internal_value());\n\t\tif(!result)\n\t\t\tresult = k3d::property::pipeline_value<k3d::bitmap*>(m_readable_data);\n\n\t\treturn result;\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_readable_data.property_changed_signal();\n\t}\n\nprivate:\n\tproperty_proxy(const property_proxy& RHS);\n\tproperty_proxy& operator=(const property_proxy& RHS);\n\n\tk3d::iproperty& m_readable_data;\n};\n\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data)\n{\n\treturn std::unique_ptr<idata_proxy>(new property_proxy(Data));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<idata_proxy> Data) :\n\tbase(Gtk::BUTTONBOX_START, 2),\n\tm_image_buffer(64, 64),\n\tm_alpha_buffer(64, 64),\n\tm_image(new Gtk::Image()),\n\tm_alpha(new Gtk::Image()),\n\tm_data(std::move(Data))\n{\n\tpack_start(*manage(m_image), Gtk::PACK_SHRINK);\n\tpack_start(*manage(m_alpha), Gtk::PACK_SHRINK);\n\n\tdata_changed(0);\n\n\tif(m_data.get())\n\t\tm_data->changed_signal().connect(sigc::mem_fun(*this, &control::data_changed));\n}\n\nstruct extract_rgb\n{\n\ttemplate<typename P1, typename P2>\n\tvoid operator()(const P1& src, P2& dst) const\n\t{\n\t\tget_color(dst, boost::gil::red_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::red_t()));\n\t\tget_color(dst, boost::gil::green_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::green_t()));\n\t\tget_color(dst, boost::gil::blue_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::blue_t()));\n\t}\n};\n\nstruct extract_alpha\n{\n\ttemplate<typename P1, typename P2>\n\tvoid operator()(const P1& src, P2& dst) const\n\t{\n\t\tget_color(dst, boost::gil::red_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::alpha_t()));\n\t\tget_color(dst, boost::gil::green_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::alpha_t()));\n\t\tget_color(dst, boost::gil::blue_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::alpha_t()));\n\t}\n};\n\nvoid control::data_changed(k3d::ihint*)\n{\n\treturn_if_fail(m_data.get());\n\n\tconst boost::gil::rgb8_image_t::view_t& image = boost::gil::view(m_image_buffer);\n\tconst boost::gil::rgb8_image_t::view_t& alpha = boost::gil::view(m_alpha_buffer);\n\n\tk3d::bitmap* const data = m_data->value();\n\tif(data && data->width() && data->height())\n\t{\n#ifdef K3D_API_DARWIN\n    assert_not_implemented();\n#else\n\t\tboost::gil::resize_view(\n\t\t\tboost::gil::color_converted_view<boost::gil::rgb8_pixel_t>(boost::gil::const_view(*data), extract_rgb()),\n\t\t\timage,\n\t\t\tboost::gil::bilinear_sampler());\n\n\t\tboost::gil::resize_view(\n\t\t\tboost::gil::color_converted_view<boost::gil::rgb8_pixel_t>(boost::gil::const_view(*data), extract_alpha()),\n\t\t\talpha,\n\t\t\tboost::gil::bilinear_sampler());\n#endif\n\t}\n\telse\n\t{\n\t\tk3d::checkerboard_fill(\n\t\t\timage,\n\t\t\t8,\n\t\t\t8,\n\t\t\tboost::gil::rgb8_pixel_t(32, 32, 32),\n\t\t\tboost::gil::rgb8_pixel_t(210, 210, 210));\n\n\t\tstd::fill(alpha.begin(), alpha.end(), boost::gil::rgb8_pixel_t(255, 255, 255));\n\t}\n\n\tm_image->set(Gdk::Pixbuf::create_from_data(reinterpret_cast<guint8*>(&image[0]),\n\t\tGdk::COLORSPACE_RGB,\n\t\tfalse,\n\t\t8,\n\t\timage.width(),\n\t\timage.height(),\n\t\timage.width() * 3));\n\n\tm_alpha->set(Gdk::Pixbuf::create_from_data(reinterpret_cast<guint8*>(&alpha[0]),\n\t\tGdk::COLORSPACE_RGB,\n\t\tfalse,\n\t\t8,\n\t\talpha.width(),\n\t\talpha.height(),\n\t\talpha.width() * 3));\n}\n\n} // namespace bitmap_preview\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/bitmap_preview.h",
    "content": "#ifndef K3DSDK_NGUI_BITMAP_PREVIEW_H\n#define K3DSDK_NGUI_BITMAP_PREVIEW_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/bitmap.h>\n\n#include <gtkmm/buttonbox.h>\n\nnamespace Gtk { class Image; }\nnamespace k3d { class ihint; }\nnamespace k3d { class iproperty; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace bitmap_preview\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// idata_proxy\n\n/// Abstract interface for an object that proxies a data source for a bitmap_preview control (i.e. the \"model\" in model-view-controller)\nclass idata_proxy\n{\npublic:\n\tvirtual ~idata_proxy() {}\n\n\t/// Called to return the underlying data value\n\tvirtual k3d::bitmap* value() = 0;\n\t/// Signal emitted if the underlying data changes\n\ttypedef sigc::signal<void, k3d::ihint*> changed_signal_t;\n\t/// Signal emitted if the underlying data changes\n\tvirtual changed_signal_t& changed_signal() = 0;\n\nprotected:\n\tidata_proxy() {}\n\tidata_proxy(const idata_proxy& RHS) {}\n\tidata_proxy& operator=(const idata_proxy& RHS) { return *this; }\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for previewing bitmap images (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::HButtonBox\n{\n\ttypedef Gtk::HButtonBox base;\n\npublic:\n\tcontrol(std::unique_ptr<idata_proxy> Data);\n\nprivate:\n\t/// Called whenever the underlying data changes\n\tvoid data_changed(k3d::ihint*);\n\n\tboost::gil::rgb8_image_t m_image_buffer;\n\tboost::gil::rgb8_image_t m_alpha_buffer;\n\n\t/// Displays the image\n\tGtk::Image* const m_image;\n\t/// Displays the alpha channel\n\tGtk::Image* const m_alpha;\n\t/// Storeas a reference to the underlying data object\n\tstd::unique_ptr<idata_proxy> m_data;\n};\n\n/// Provides an implementation of bitmap_preview::idata_proxy that supports any data source that supports the value(), set_value(), and changed_signal() concepts\ntemplate<typename data_t>\nclass data_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tdata_proxy(data_t& Data) :\n\t\tm_data(Data)\n\t{\n\t}\n\n\tk3d::bitmap* value()\n\t{\n\t\treturn m_data.value();\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_data.changed_signal();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_data;\n};\n\n/// Convenience factory function for creating bitmap_preview::idata_proxy objects\ntemplate<typename data_t>\nstd::unique_ptr<idata_proxy> proxy(data_t& Data)\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<data_t>(Data));\n}\n\n/// Specialization of proxy() for use with properties\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data);\n\n} // namespace bitmap_preview\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_BITMAP_PREVIEW_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/bounding_box.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/bounding_box.h>\n#include <k3dsdk/ngui/spin_button.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <gtkmm/label.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace bounding_box\n{\n\nnamespace detail\n{\n\n/// Adapts a k3d::iproperty object for use with bounding_box::control\nclass data_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tdata_proxy(k3d::iproperty& Property, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_property(Property)\n\t{\n\t\tassert(Property.property_type() == typeid(k3d::bounding_box3));\n\t}\n\n\tconst k3d::bounding_box3 value()\n\t{\n\t\treturn boost::any_cast<k3d::bounding_box3>(m_property.property_internal_value());\n\t}\n\n\tvoid set_value(const k3d::bounding_box3& Value)\n\t{\n\t\tk3d::iwritable_property* const writable_property = dynamic_cast<k3d::iwritable_property*>(&m_property);\n\t\treturn_if_fail(writable_property);\n\n\t\twritable_property->property_set_value(boost::any(Value));\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_property.property_changed_signal();\n\t}\n\nprivate:\n\tk3d::iproperty& m_property;\n};\n\n} // namespace detail\n\n/// Adapts a spin button to control a single bounding_box coordinate\nclass spin_button_model :\n\tpublic spin_button::imodel\n{\npublic:\n\tspin_button_model(bounding_box::idata_proxy& Data, double k3d::bounding_box3::* Value) :\n\t\tm_data(Data),\n\t\tm_value(Value)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn \"\";\n\t}\n\n\tk3d::bool_t writable()\n\t{\n\t\treturn true;\n\t}\n\n\tk3d::double_t value()\n\t{\n\t\treturn m_data.value().*m_value;\n\t}\n\n\tvoid set_value(const double Value)\n\t{\n\t\tk3d::bounding_box3 box = m_data.value();\n\t\tbox.*m_value = Value;\n\t\tm_data.set_value(box);\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_data.changed_signal().connect(sigc::hide(Slot));\n\t}\n\n\tk3d::double_t step_increment()\n\t{\n\t\treturn 0.1;\n\t}\n\n\tconst std::type_info& units()\n\t{\n\t\treturn typeid(k3d::measurement::distance);\n\t}\n\nprivate:\n\tbounding_box::idata_proxy& m_data;\n\tdouble k3d::bounding_box3::* m_value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<idata_proxy> Data) :\n\tbase(3, 3, false),\n\tm_data(std::move(Data))\n{\n\tspin_button::control* const nx = new spin_button::control(new spin_button_model(*m_data, &k3d::bounding_box3::nx), m_data->state_recorder);\n\tspin_button::control* const px = new spin_button::control(new spin_button_model(*m_data, &k3d::bounding_box3::px), m_data->state_recorder);\n\tspin_button::control* const ny = new spin_button::control(new spin_button_model(*m_data, &k3d::bounding_box3::ny), m_data->state_recorder);\n\tspin_button::control* const py = new spin_button::control(new spin_button_model(*m_data, &k3d::bounding_box3::py), m_data->state_recorder);\n\tspin_button::control* const nz = new spin_button::control(new spin_button_model(*m_data, &k3d::bounding_box3::nz), m_data->state_recorder);\n\tspin_button::control* const pz = new spin_button::control(new spin_button_model(*m_data, &k3d::bounding_box3::pz), m_data->state_recorder);\n\n\tattach(*Gtk::manage(new Gtk::Label(_(\"X\"))), 0, 1, 0, 1);\n\tattach(*Gtk::manage(nx), 0, 1, 1, 2);\n\tattach(*Gtk::manage(px), 0, 1, 2, 3);\n\n\tattach(*Gtk::manage(new Gtk::Label(_(\"Y\"))), 1, 2, 0, 1);\n\tattach(*Gtk::manage(ny), 1, 2, 1, 2);\n\tattach(*Gtk::manage(py), 1, 2, 2, 3);\n\n\tattach(*Gtk::manage(new Gtk::Label(_(\"Z\"))), 2, 3, 0, 1);\n\tattach(*Gtk::manage(nz), 2, 3, 1, 2);\n\tattach(*Gtk::manage(pz), 2, 3, 2, 3);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// proxy\n\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Property, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage)\n{\n\treturn std::unique_ptr<idata_proxy>(new detail::data_proxy(Property, StateRecorder, ChangeMessage));\n}\n\n} // namespace bounding_box\n\n} // namespace ngui\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/bounding_box.h",
    "content": "#ifndef K3DSDK_NGUI_BOUNDING_BOX_H\n#define K3DSDK_NGUI_BOUNDING_BOX_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/bounding_box3.h>\n\n#include <gtkmm/table.h>\n\n#include <memory>\n\n// Forward declarations\nnamespace Gtk { class Button; }\nnamespace k3d { class ihint; }\nnamespace k3d { class iproperty; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace bounding_box\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// idata_proxy\n\n/// Abstract interface for an object that proxies a data source for a bounding_box control (i.e. the \"model\" in model-view-controller)\nclass idata_proxy\n{\npublic:\n\tvirtual ~idata_proxy() {}\n\n\t/// Called to return the underlying data value\n\tvirtual const k3d::bounding_box3 value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const k3d::bounding_box3& Value) = 0;\n\t/// Signal emitted if the underlying data changes\n\ttypedef sigc::signal<void, k3d::ihint*> changed_signal_t;\n\t/// Signal emitted if the underlying data changes\n\tvirtual changed_signal_t& changed_signal() = 0;\n\n\t/// Stores an optional state recorder for recording undo/redo data\n\tk3d::istate_recorder* const state_recorder;\n\t/// Stores an optional message for labelling undo/redo state changes\n\tconst Glib::ustring change_message;\n\nprotected:\n\tidata_proxy(k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tstate_recorder(StateRecorder),\n\t\tchange_message(ChangeMessage)\n\t{\n\t}\n\nprivate:\n\tidata_proxy(const idata_proxy& RHS);\n\tidata_proxy& operator=(const idata_proxy& RHS);\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for modifying the bounding_box of an object\nclass control :\n\tpublic Gtk::Table\n{\n\ttypedef Gtk::Table base;\n\npublic:\n\tcontrol(std::unique_ptr<idata_proxy> Data);\n\nprivate:\n\t/// Stores a reference to the underlying data object\n\tstd::unique_ptr<idata_proxy> m_data;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// proxy\n\n/// Convenience factory function for creating k3d::spin_button::idata_proxy objects, specialized for k3d::iproperty\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = Glib::ustring());\n\n} // namespace bounding_box\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_BOUNDING_BOX_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/button.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/utility.h>\n\n#include <k3dsdk/log.h>\n\n#include <gtkmm/alignment.h>\n#include <gtkmm/box.h>\n#include <gtkmm/image.h>\n#include <gtkmm/label.h>\n#include <gtkmm/stock.h>\n\n#include <iostream>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace button\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// create\n\nGtk::Button* create(const Glib::ustring& label_text, const Gtk::StockID& stock_id)\n{\n\tGtk::Label* const label = new Gtk::Label(label_text, true);\n\n\tGtk::Image* const image = new Gtk::Image();\n\tGtk::Stock::lookup(stock_id, Gtk::ICON_SIZE_BUTTON, *image);\n\n\tGtk::HBox* const hbox = new Gtk::HBox(false, 2);\n\thbox->pack_start(*manage(image), false, false, 0);\n\thbox->pack_start(*manage(label), false, false, 0);\n\n\tGtk::Alignment* const alignment = new Gtk::Alignment(0.5, 0.5, 0.0, 0.0);\n\talignment->add(*manage(hbox));\n\n  Gtk::Button* const button = new Gtk::Button();\n\tbutton->add(*manage(alignment));\n\n\talignment->show_all();\n\n  return button;\n}\n\nGtk::Button* create(Gtk::Widget& widget)\n{\n  Gtk::Button* const button = new Gtk::Button();\n\tbutton->add(widget);\n\n  return button;\n}\n\n} // namespace button\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/button.h",
    "content": "#ifndef K3DSDK_NGUI_BUTTON_H\n#define K3DSDK_NGUI_BUTTON_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/button.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace button\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// create\n\n/// Factory function for creating a button with a stock icon but a custom label.\nGtk::Button* create(const Glib::ustring& label, const Gtk::StockID& stock_id);\n/// Factory function for creating a button containing some other widget, typically used with Gtk::Image.\nGtk::Button* create(Gtk::Widget& widget);\n\n} // namespace button\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_BUTTON_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/check_button.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/check_button.h>\n#include <k3dsdk/ngui/utility.h>\n\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <gtkmm/tooltips.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace check_button\n{\n\n/// Specialization of k3d::check_button::data_proxy for use with k3d::iproperty objects\ntemplate<>\nclass data_proxy<k3d::iproperty> :\n\tpublic idata_proxy\n{\npublic:\n\ttypedef k3d::iproperty data_t;\n\n\tdata_proxy(data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data))\n\t{\n\t}\n\n\tconst bool writable()\n\t{\n\t\treturn m_writable_data ? true : false;\n\t}\n\n\tbool value()\n\t{\n\t\treturn boost::any_cast<bool>(m_readable_data.property_internal_value());\n\t}\n\n\tvoid set_value(const bool Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\t\tm_writable_data->property_set_value(Value);\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_readable_data.property_changed_signal();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n};\n\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage)\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<k3d::iproperty>(Data, StateRecorder, ChangeMessage));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<idata_proxy> Data) :\n\tm_data(std::move(Data))\n{\n\tset_name(\"k3d-check-button\");\n\tattach();\n\n\tset_sensitive(m_data.get() && m_data->writable());\n}\n\ncontrol::control(std::unique_ptr<idata_proxy> Data, const Glib::ustring& label, bool mnemonic) :\n\tbase(label, mnemonic),\n\tm_data(std::move(Data))\n{\n\tset_name(\"k3d-check-button\");\n\tattach();\n\n\tset_sensitive(m_data.get() && m_data->writable());\n}\n\nvoid control::update(k3d::ihint*)\n{\n\tif(!m_data.get())\n\t\treturn;\n\n\tconst bool new_value = m_data->value();\n\tif(new_value != get_active())\n\t\tset_active(new_value);\n}\n\nvoid control::attach()\n{\n\t// Update the display ...\n\tupdate(0);\n\n\t// We want to be notified if the data source changes ...\n\tif(m_data.get())\n\t\tm_data->changed_signal().connect(sigc::mem_fun(*this, &control::update));\n}\n\nvoid control::on_toggled()\n{\n\tif(m_data.get())\n\t{\n\t\t// If the value hasn't changed, we're done ...\n\t\tconst bool new_value = get_active();\n\t\tif(new_value != m_data->value())\n\t\t{\n\t\t\t// Turn this into an undo/redo -able event ...\n\t\t\tif(m_data->state_recorder)\n\t\t\t\tm_data->state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t\t\t// Update everything with the new value ...\n\t\t\tm_data->set_value(new_value);\n\n\t\t\t// Turn this into an undo/redo -able event ...\n\t\t\tif(m_data->state_recorder)\n\t\t\t\tm_data->state_recorder->commit_change_set(m_data->state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), new_value ? m_data->change_message + \" \\\"On\\\"\" : m_data->change_message + \" \\\"Off\\\"\", K3D_CHANGE_SET_CONTEXT);\n\t\t}\n\t}\n\n\tbase::on_toggled();\n}\n\n} // namespace check_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/check_button.h",
    "content": "#ifndef K3DSDK_NGUI_CHECK_BUTTON_H\n#define K3DSDK_NGUI_CHECK_BUTTON_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iwritable_property.h>\n\n#include <gtkmm/checkbutton.h>\n\n#include <memory>\n\n// Forward declarations\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace check_button\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// idata_proxy\n\n/// Abstract interface for an object that proxies a data source for a check button control (i.e. the \"model\" in model-view-controller)\nclass idata_proxy\n{\npublic:\n\tvirtual ~idata_proxy() {}\n\n\t/// Returns true iff the underlying data is writable\n\tvirtual const bool writable() = 0;\n\t/// Called to return the underlying data value\n\tvirtual bool value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const bool Value) = 0;\n\t/// Signal emitted if the underlying data changes\n\ttypedef sigc::signal<void, k3d::ihint*> changed_signal_t;\n\t/// Signal emitted if the underlying data changes\n\tvirtual changed_signal_t& changed_signal() = 0;\n\n\t/// Stores an optional state recorder for recording undo/redo data\n\tk3d::istate_recorder* const state_recorder;\n\t/// Stores an optional message for labelling undo/redo state changes\n\tconst Glib::ustring change_message;\n\nprotected:\n\tidata_proxy(k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tstate_recorder(StateRecorder),\n\t\tchange_message(ChangeMessage)\n\t{\n\t}\n\nprivate:\n\tidata_proxy(const idata_proxy& RHS);\n\tidata_proxy& operator=(const idata_proxy& RHS);\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for manipulating boolean quantities (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::CheckButton\n{\n\ttypedef Gtk::CheckButton base;\n\npublic:\n\tcontrol(std::unique_ptr<idata_proxy> Data);\n\tcontrol(std::unique_ptr<idata_proxy> Data, const Glib::ustring& label, bool mnemonic = false);\n\n\tvoid on_toggled();\n\nprivate:\n\t/// Common construction code\n\tvoid attach();\n\t/// Called to update the state of the widget when the underlying data source changes\n\tvoid update(k3d::ihint*);\n\t/// Storeas a reference to the underlying data object\n\tconst std::unique_ptr<idata_proxy> m_data;\n};\n\n/// Provides an implementation of k3d::check_button::idata_proxy that supports any data source that supports the value(), set_value(), and changed_signal() concepts\ntemplate<typename data_t>\nclass data_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tdata_proxy(data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_data(Data)\n\t{\n\t}\n\n\tconst bool writable()\n\t{\n\t\treturn true;\n\t}\n\n\tbool value()\n\t{\n\t\treturn m_data.internal_value();\n\t}\n\n\tvoid set_value(const bool Value)\n\t{\n\t\tm_data.set_value(Value);\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_data.changed_signal();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_data;\n};\n\n/// Convenience factory function for creating check_button::idata_proxy objects\ntemplate<typename data_t>\nstd::unique_ptr<idata_proxy> proxy(data_t& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = Glib::ustring())\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<data_t>(Data, StateRecorder, ChangeMessage));\n}\n\n/// Convenience factory function for creating check_button::idata_proxy objects specialized for use with k3d::iproperty\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = Glib::ustring());\n\n/// Convenience factory function for creating empty check_button::idata_proxy objects\ninline std::unique_ptr<idata_proxy> proxy()\n{\n\treturn std::unique_ptr<idata_proxy>(nullptr);\n}\n\n} // namespace check_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_CHECK_BUTTON_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/check_menu_item.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/check_menu_item.h>\n#include <k3dsdk/ngui/utility.h>\n\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <gtkmm/menu.h>\n#include <gtkmm/tooltips.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace check_menu_item\n{\n\n/// Specialization of k3d::check_menu_item::data_proxy for use with k3d::iproperty objects\ntemplate<>\nclass data_proxy<k3d::iproperty> :\n\tpublic idata_proxy\n{\npublic:\n\ttypedef k3d::iproperty data_t;\n\n\tdata_proxy(data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data))\n\t{\n\t}\n\n\tbool value()\n\t{\n\t\treturn boost::any_cast<bool>(m_readable_data.property_internal_value());\n\t}\n\n\tvoid set_value(const bool Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\t\tm_writable_data->property_set_value(Value);\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_readable_data.property_changed_signal();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n};\n\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage)\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<k3d::iproperty>(Data, StateRecorder, ChangeMessage));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<idata_proxy> Data) :\n\tm_data(std::move(Data))\n{\n\tset_name(\"k3d-check-menu-item\");\n\tattach();\n}\n\ncontrol::control(std::unique_ptr<idata_proxy> Data, const Glib::ustring& label, bool mnemonic) :\n\tbase(label, mnemonic),\n\tm_data(std::move(Data))\n{\n\tset_name(\"k3d-check-menu-item\");\n\tattach();\n}\n\nvoid control::attach()\n{\n\t// Update the display ...\n\tupdate(0);\n\n\t// We want to be notified if the data source changes ...\n\tif(m_data.get())\n\t\tm_data->changed_signal().connect(sigc::mem_fun(*this, &control::update));\n}\n\n\nvoid control::update(k3d::ihint*)\n{\n\tif(!m_data.get())\n\t\treturn;\n\n\tconst bool new_value = m_data->value();\n\tif(new_value != get_active())\n\t\tset_active(new_value);\n}\n\nvoid control::on_toggled()\n{\n\tif(m_data.get())\n\t{\n\t\t// Get the control value ...\n\t\tconst bool new_value = get_active();\n\n\t\t// If the value hasn't changed, we're done ...\n\t\tif(new_value != m_data->value())\n\t\t{\n\t\t\t// Turn this into an undo/redo -able event ...\n\t\t\tif(m_data->state_recorder)\n\t\t\t\tm_data->state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t\t\t// Update everything with the new value ...\n\t\t\tm_data->set_value(new_value);\n\n\t\t\t// Turn this into an undo/redo -able event ...\n\t\t\tif(m_data->state_recorder)\n\t\t\t\tm_data->state_recorder->commit_change_set(m_data->state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), new_value ? m_data->change_message + \" \\\"On\\\"\" : m_data->change_message + \" \\\"Off\\\"\", K3D_CHANGE_SET_CONTEXT);\n\t\t}\n\t}\n\n\tbase::on_toggled();\n}\n\n} // namespace check_menu_item\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/check_menu_item.h",
    "content": "#ifndef K3DSDK_NGUI_CHECK_MENU_ITEM_H\n#define K3DSDK_NGUI_CHECK_MENU_ITEM_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iwritable_property.h>\n\n#include <gtkmm/checkmenuitem.h>\n\n#include <memory>\n\nnamespace k3d { class ihint; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace check_menu_item\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// idata_proxy\n\n/// Abstract interface for an object that proxies a data source for a toggle button control (i.e. the \"model\" in model-view-controller)\nclass idata_proxy\n{\npublic:\n\tvirtual ~idata_proxy() {}\n\n\t/// Called to return the underlying data value\n\tvirtual bool value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const bool Value) = 0;\n\t/// Signal emitted if the underlying data changes\n\ttypedef sigc::signal<void, k3d::ihint*> changed_signal_t;\n\t/// Signal emitted if the underlying data changes\n\tvirtual changed_signal_t& changed_signal() = 0;\n\n\t/// Stores an optional state recorder for recording undo/redo data\n\tk3d::istate_recorder* const state_recorder;\n\t/// Stores an optional message for labelling undo/redo state changes\n\tconst Glib::ustring change_message;\n\nprotected:\n\tidata_proxy(k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tstate_recorder(StateRecorder),\n\t\tchange_message(ChangeMessage)\n\t{\n\t}\n\nprivate:\n\tidata_proxy(const idata_proxy& RHS);\n\tidata_proxy& operator=(const idata_proxy& RHS);\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for manipulating boolean quantities (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::CheckMenuItem\n{\n\ttypedef Gtk::CheckMenuItem base;\n\npublic:\n\tcontrol(std::unique_ptr<idata_proxy> Data);\n\tcontrol(std::unique_ptr<idata_proxy> Data, const Glib::ustring& label, bool mnemonic = false);\n\n\tvoid on_toggled();\n\nprivate:\n\t/// Common construction code\n\tvoid attach();\n\t/// Called to update the widget state whenever the underlying data changes\n\tvoid update(k3d::ihint*);\n\n\t/// Stores a reference to the underlying data object\n\tconst std::unique_ptr<idata_proxy> m_data;\n};\n\n/// Provides an implementation of k3d::check_menu_item::idata_proxy that supports any data source that supports the value(), set_value(), and changed_signal() concepts\ntemplate<typename data_t>\nclass data_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tdata_proxy(data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_data(Data)\n\t{\n\t}\n\n\tbool value()\n\t{\n\t\treturn m_data.internal_value();\n\t}\n\n\tvoid set_value(const bool Value)\n\t{\n\t\tm_data.set_value(Value);\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_data.changed_signal();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_data;\n};\n\n/// Convenience factory function for creating check_menu_item::idata_proxy objects\ntemplate<typename data_t>\nstd::unique_ptr<idata_proxy> proxy(data_t& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = Glib::ustring())\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<data_t>(Data, StateRecorder, ChangeMessage));\n}\n\n/// Convenience factory function for creating check_menu_item::idata_proxy objects specialized for use with k3d::iproperty objects\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = Glib::ustring());\n\n/// Convenience factory function for creating empty check_menu_item::idata_proxy objects\ninline std::unique_ptr<idata_proxy> proxy()\n{\n\treturn std::unique_ptr<idata_proxy>();\n}\n\n} // namespace check_menu_item\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_CHECK_MENU_ITEM_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/collapsible_frame.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/ngui/collapsible_frame.h>\n#include <k3dsdk/ngui/event_button.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/signal_system.h>\n\n#include <gtkmm/arrow.h>\n#include <gtkmm/box.h>\n#include <gtkmm/label.h>\n#include <gtkmm/main.h>\n#include <gtkmm/menu.h>\n#include <gtkmm/menuitem.h>\n#include <gtkmm/tooltips.h>\n\n#include <iostream>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace collapsible_frame\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// group::implementation\n\nclass group::implementation\n{\npublic:\n\tsigc::signal<void> expand_all_signal;\n\tsigc::signal<void> collapse_all_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// group\n\ngroup::group() :\n\tm_implementation(new implementation())\n{\n}\n\ngroup::~group()\n{\n\tdelete m_implementation;\n}\n\nvoid group::expand_all()\n{\n\tm_implementation->expand_all_signal.emit();\n}\n\nvoid group::collapse_all()\n{\n\tm_implementation->collapse_all_signal.emit();\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control::implementation\n\nclass control::implementation :\n\tpublic sigc::trackable\n{\npublic:\n\timplementation(const Glib::ustring& Name, Gtk::Frame& Frame) :\n\t\tframe(Frame),\n\t\tarrow(Gtk::ARROW_DOWN, Gtk::SHADOW_NONE)\n\t{\n\t\tGtk::HBox* const hbox = new Gtk::HBox(false);\n\t\thbox->pack_start(arrow, Gtk::PACK_SHRINK);\n\t\thbox->pack_start(*Gtk::manage(new Gtk::Label(Name)), Gtk::PACK_EXPAND_WIDGET);\n\n\t\tbutton.add(*Gtk::manage(hbox));\n\t\tbutton.set_relief(Gtk::RELIEF_NONE);\n\t\tbutton.signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_toggle));\n\t\tbutton.signal_button_press_event().connect(sigc::mem_fun(*this, &implementation::on_button_press_event));\n\t\tbutton.set_tooltip_text(_(\"LMB-Click to expand/collapse.  RMB-Click for other options.\"));\n\n\t\tframe.set_label_widget(button);\n\t\tframe.set_shadow_type(Gtk::SHADOW_NONE);\n\n\t\tcontext_menu.items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Expand\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &implementation::expand))));\n\n\t\tcontext_menu.items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Collapse\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &implementation::collapse))));\n\n\t\tcontext_menu.items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Expand All\")) <<\n\t\t\tconnect_menu_item(expand_all_signal.make_slot())));\n\n\t\tcontext_menu.items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Collapse All\")) <<\n\t\t\tconnect_menu_item(collapse_all_signal.make_slot())));\n\t}\n\n\tvoid expand()\n\t{\n\t\tarrow.property_arrow_type().set_value(Gtk::ARROW_DOWN);\n\n\t\tif(frame.get_child())\n\t\t\tframe.get_child()->show();\n\t}\n\n\tvoid collapse()\n\t{\n\t\tarrow.property_arrow_type().set_value(Gtk::ARROW_RIGHT);\n\n\t\tif(frame.get_child())\n\t\t\tframe.get_child()->hide();\n\t}\n\n\tbool is_collapsed()\n\t{\n\t\treturn arrow.property_arrow_type().get_value() != Gtk::ARROW_DOWN;\n\t}\n\n\tvoid on_toggle()\n\t{\n\t\tif(is_collapsed())\n\t\t\texpand();\n\t\telse\n\t\t\tcollapse();\n\t}\n\n\tbool on_button_press_event(GdkEventButton* Event)\n\t{\n\t\tif(Event->button != 3)\n\t\t\treturn false;\n\n\t\tcontext_menu.show_all();\n\t\tcontext_menu.popup(3, gtk_get_current_event_time());\n\n\t\treturn true;\n\t}\n\n\tGtk::Frame& frame;\n\tGtk::Arrow arrow;\n\tevent_button button;\n\n\tGtk::Menu context_menu;\n\n\tsigc::signal<void> expand_all_signal;\n\tsigc::signal<void> collapse_all_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(const Glib::ustring& Name) :\n\tm_implementation(new implementation(Name, *this))\n{\n}\n\ncontrol::control(const Glib::ustring& Name, group& Group) :\n\tm_implementation(new implementation(Name, *this))\n{\n\tGroup.m_implementation->expand_all_signal.connect(sigc::mem_fun(*this, &control::expand));\n\tGroup.m_implementation->collapse_all_signal.connect(sigc::mem_fun(*this, &control::collapse));\n\n\tm_implementation->expand_all_signal.connect(Group.m_implementation->expand_all_signal.make_slot());\n\tm_implementation->collapse_all_signal.connect(Group.m_implementation->collapse_all_signal.make_slot());\n}\n\ncontrol::~control()\n{\n\tdelete m_implementation;\n}\n\nvoid control::expand()\n{\n\tm_implementation->expand();\n}\n\nvoid control::collapse()\n{\n\tm_implementation->collapse();\n}\n\nbool control::is_collapsed()\n{\n\treturn m_implementation->is_collapsed();\n}\n\nGtk::Button& control::toggle_button()\n{\n\treturn m_implementation->button;\n}\n\n} // namespace collapsible_frame\n\n} // namespace ngui\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/collapsible_frame.h",
    "content": "#ifndef K3DSDK_NGUI_COLLAPSIBLE_FRAME_H\n#define K3DSDK_NGUI_COLLAPSIBLE_FRAME_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <gtkmm/frame.h>\n\n// Forward declarations\nnamespace Gtk { class Button; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace collapsible_frame\n{\n\n/// Groups a collection of control objects together so they can be expanded / collapsed as a set\nclass group\n{\npublic:\n\tgroup();\n\t~group();\n\n\t/// Expands every control in the group\n\tvoid expand_all();\n\t/// Collapses every control in the group\n\tvoid collapse_all();\n\t\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n\t\n\tfriend class control;\n};\n\n/// Provides a container that can be manually collapsed / expanded by users to reduce clutter\nclass control :\n\tpublic Gtk::Frame\n{\npublic:\n\tcontrol(const Glib::ustring& Name);\n\tcontrol(const Glib::ustring& Name, group& Group);\n\t~control();\n\n\t/// Programmatically expands the control\n\tvoid expand();\n\t/// Programmatically collapses the control\n\tvoid collapse();\n\t/// Returns true iff the control is currently collapsed\n\tbool is_collapsed();\n\t/// Low-level access to the button that toggles the collapsed / expanded state\n\tGtk::Button& toggle_button();\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace collapsible_frame\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_COLLAPSIBLE_FRAME_H\n"
  },
  {
    "path": "k3dsdk/ngui/color_chooser.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/ngui/color_chooser.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/types_ri.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/string_cast.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/colorselection.h>\n#include <gtkmm/drawingarea.h>\n#include <gtkmm/label.h>\n#include <gtkmm/stock.h>\n\n#include <iomanip>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace color_chooser\n{\n\nnamespace detail\n{\n\n/// Tutorial-enabled implementation of a standard color selection dialog\nclass color_selection_dialog:\n\tpublic application_window\n{\n\ttypedef application_window base;\n\npublic:\n\tcolor_selection_dialog(std::unique_ptr<idata_proxy> Data) :\n\t\tm_data(std::move(Data))\n\t{\n\t\tGtk::VBox* const vbox = new Gtk::VBox(false);\n\t\tadd(*manage(vbox));\n\n\t\tm_color_selection.set_has_opacity_control(false);\n\t\tm_color_selection.set_has_palette(true);\n\t\tm_color_changed_connection = m_color_selection.signal_color_changed().connect(sigc::mem_fun(*this, &color_selection_dialog::on_color_changed));\n\t\tvbox->pack_start(m_color_selection, Gtk::PACK_EXPAND_WIDGET);\n\n\t\tGtk::HButtonBox* const bbox = new Gtk::HButtonBox(Gtk::BUTTONBOX_END);\n\t\tvbox->pack_start(*Gtk::manage(bbox));\n\n\t\tbbox->pack_start(*Gtk::manage(\n\t\t\tnew Gtk::Button(Gtk::Stock::CLOSE) <<\n\t\t\tconnect_button(sigc::mem_fun(*this, &color_selection_dialog::close))));\n\n\t\ton_data_changed(0);\n\n\t\tif(m_data.get())\n\t\t\tm_data->changed_signal().connect(sigc::mem_fun(*this, &color_selection_dialog::on_data_changed));\n\n\t\tshow_all();\n\t}\n\nprivate:\n\tvoid on_color_changed()\n\t{\n\t\treturn_if_fail(m_data.get());\n\n\t\tconst k3d::color color = convert(m_color_selection.get_current_color());\n\t\tif(color == m_data->value())\n\t\t\treturn;\n\n\t\tif(m_data->state_recorder)\n\t\t\tm_data->state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t\tm_data->set_value(color);\n\n\t\tif(m_data->state_recorder)\n\t\t\tm_data->state_recorder->commit_change_set(m_data->state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), m_data->change_message + \" \" + k3d::string_cast(color), K3D_CHANGE_SET_CONTEXT);\n\t}\n\n\tvoid on_data_changed(k3d::ihint*)\n\t{\n\t\treturn_if_fail(m_data.get());\n\n\t\tconst Gdk::Color color(convert(m_data->value()));\n\t\tif(color != m_color_selection.get_current_color())\n\t\t{\n\t\t\tm_color_changed_connection.block();\n\t\t\tm_color_selection.set_current_color(color);\n\t\t\tm_color_changed_connection.unblock();\n\t\t}\n\t}\n\n\tGtk::ColorSelection m_color_selection;\n\tsigc::connection m_color_changed_connection;\n\tstd::unique_ptr<idata_proxy> m_data;\n};\n\n} // namespace detail\n\n/// Specialization of k3d::color_chooser::data_proxy for use with k3d::iproperty objects\ntemplate<>\nclass data_proxy<k3d::iproperty> :\n\tpublic idata_proxy\n{\npublic:\n\ttypedef k3d::iproperty data_t;\n\n\tdata_proxy(data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data))\n\t{\n\t}\n\n\tk3d::color value()\n\t{\n\t\tconst std::type_info& type = m_readable_data.property_type();\n\t\tif(type == typeid(k3d::color))\n\t\t\treturn boost::any_cast<k3d::color>(m_readable_data.property_internal_value());\n\t\telse if(type == typeid(k3d::ri::color))\n\t\t\treturn boost::any_cast<k3d::ri::color>(m_readable_data.property_internal_value());\n\t\telse\n\t\t\tk3d::log() << error << \"unknown property type: \" << type.name() << std::endl;\n\n\t\treturn k3d::color(0, 0, 0);\n\t}\n\n\tvoid set_value(const k3d::color Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\n\t\tconst std::type_info& type = m_readable_data.property_type();\n\t\tif(type == typeid(k3d::color))\n\t\t\tm_writable_data->property_set_value(Value);\n\t\telse if(type == typeid(k3d::ri::color))\n\t\t\tm_writable_data->property_set_value(k3d::ri::color(Value));\n\t\telse\n\t\t\tk3d::log() << error << \"unknown property type: \" << type.name() << std::endl;\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_readable_data.property_changed_signal();\n\t}\n\n\tstd::unique_ptr<idata_proxy> clone()\n\t{\n\t\treturn std::unique_ptr<idata_proxy>(new data_proxy<data_t>(m_readable_data, state_recorder, change_message));\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n};\n\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage)\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<k3d::iproperty>(Data, StateRecorder, ChangeMessage));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<idata_proxy> Data) :\n\tm_area(new Gtk::DrawingArea()),\n\tm_data(std::move(Data))\n{\n\tm_area->signal_expose_event().connect(sigc::hide(sigc::mem_fun(*this, &control::on_redraw)));\n\tadd(*manage(m_area));\n\n\tdata_changed(0);\n\n\tif(m_data.get())\n\t\tm_data->changed_signal().connect(sigc::mem_fun(*this, &control::data_changed));\n}\n\ncontrol::~control()\n{\n\tm_deleted_signal.emit();\n}\n\nbool control::on_redraw()\n{\n\treturn_val_if_fail(m_data.get(), false);\n\n\tGlib::RefPtr<Gdk::GC> gc = Gdk::GC::create(m_area->get_window());\n\tGdk::Color color = convert(m_data->value());\n\tm_area->get_default_colormap()->alloc_color(color);\n\tgc->set_foreground(color);\n\n\tm_area->get_window()->draw_rectangle(gc, true, 0, 0, m_area->get_width(), m_area->get_height());\n\n\treturn true;\n}\n\nvoid control::on_clicked()\n{\n\treturn_if_fail(m_data.get());\n\n\tdetail::color_selection_dialog* const color_selection = new detail::color_selection_dialog(m_data->clone());\n\tm_deleted_signal.connect(sigc::mem_fun(*color_selection, &detail::color_selection_dialog::close));\n\tcolor_selection->show();\n\n\tbase::on_clicked();\n}\n\nvoid control::data_changed(k3d::ihint*)\n{\n\tm_area->queue_draw();\n}\n\n} // namespace color_chooser\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/color_chooser.h",
    "content": "#ifndef K3DSDK_NGUI_COLOR_CHOOSER_H\n#define K3DSDK_NGUI_COLOR_CHOOSER_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iwritable_property.h>\n\n#include <gtkmm/button.h>\n\n#include <memory>\n\nnamespace Gtk { class DrawingArea; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace color_chooser\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// idata_proxy\n\n/// Abstract interface for an object that proxies a data source for a color chooser control (i.e. the \"model\" in model-view-controller)\nclass idata_proxy\n{\npublic:\n\tvirtual ~idata_proxy() {}\n\n\t/// Called to return the underlying data value\n\tvirtual k3d::color value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const k3d::color Value) = 0;\n\t/// Signal emitted if the underlying data changes\n\ttypedef sigc::signal<void, k3d::ihint*> changed_signal_t;\n\t/// Signal emitted if the underlying data changes\n\tvirtual changed_signal_t& changed_signal() = 0;\n\n\t/// Stores an optional state recorder for recording undo/redo data\n\tk3d::istate_recorder* const state_recorder;\n\t/// Stores an optional message for labelling undo/redo state changes\n\tconst Glib::ustring change_message;\n\n\t/// Virtual copy constructor idiom\n\tvirtual std::unique_ptr<idata_proxy> clone() = 0;\n\nprotected:\n\tidata_proxy(k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tstate_recorder(StateRecorder),\n\t\tchange_message(ChangeMessage)\n\t{\n\t}\n\nprivate:\n\tidata_proxy(const idata_proxy&);\n\tidata_proxy& operator=(const idata_proxy&);\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for manipulating colors (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::Button\n{\n\ttypedef Gtk::Button base;\n\npublic:\n\tcontrol(std::unique_ptr<idata_proxy> Data);\n\t~control();\n\nprivate:\n\t/// Called to refresh the drawing area that displays the current color\n\tbool on_redraw();\n\t/// Called when the user clicks on the control\n\tvoid on_clicked();\n\t/// Called whenever the underlying data changes\n\tvoid data_changed(k3d::ihint*);\n\n\t/// Displays the currently color\n\tGtk::DrawingArea* const m_area;\n\t/// Stores a reference to the underlying data object\n\tstd::unique_ptr<idata_proxy> m_data;\n\t/// Stores a signal that will be emitted when the control is destroyed\n\tsigc::signal<void> m_deleted_signal;\n};\n\n/// Provides an implementation of k3d::color_chooser::idata_proxy that supports any data source that supports the value(), set_value(), and changed_signal() concepts\ntemplate<typename data_t>\nclass data_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tdata_proxy(data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_data(Data)\n\t{\n\t}\n\n\tk3d::color value()\n\t{\n\t\treturn m_data.value();\n\t}\n\n\tvoid set_value(const k3d::color Value)\n\t{\n\t\tm_data.set_value(Value);\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_data.changed_signal();\n\t}\n\n\tstd::unique_ptr<idata_proxy> clone()\n\t{\n\t\treturn std::unique_ptr<idata_proxy>(new data_proxy<data_t>(m_data, state_recorder, change_message));\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_data;\n};\n\n/// Convenience factory function for creating color_chooser::idata_proxy objects\ntemplate<typename data_t>\nstd::unique_ptr<idata_proxy> proxy(data_t& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = \"\")\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<data_t>(Data, StateRecorder, ChangeMessage));\n}\n\n/// Convenience factory function for creating color_chooser::idata_proxy objects, specialized for k3d::iproperty\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = \"\");\n\n} // namespace color_chooser\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_COLOR_CHOOSER_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/combo_box.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the k3d::combo_box classes, which provide a model-view-controller UI for enumerated (fixed set of choices) types\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/combo_box.h>\n#include <k3dsdk/ngui/utility.h>\n\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <gtkmm/entry.h>\n#include <gtkmm/window.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace combo_box\n{\n\n/// Specialization of k3d::combo_box::data_proxy for use with k3d::iproperty objects\ntemplate<>\nclass data_proxy<k3d::iproperty> :\n\tpublic idata_proxy\n{\npublic:\n\ttypedef k3d::iproperty data_t;\n\n\tdata_proxy(data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data))\n\t{\n\t}\n\n\tconst std::string value()\n\t{\n\t\treturn boost::any_cast<std::string>(m_readable_data.property_internal_value());\n\t}\n\n\tvoid set_value(const std::string& Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\t\treturn_if_fail(m_writable_data->property_set_value(Value));\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_readable_data.property_changed_signal();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n};\n\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage)\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<k3d::iproperty>(Data, StateRecorder, ChangeMessage));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<idata_proxy> Data) :\n\tm_data(std::move(Data))\n{\n\tif(m_data.get())\n\t\tm_data->changed_signal().connect(sigc::mem_fun(*this, &control::data_changed));\n\n\tm_model = Gtk::ListStore::create(m_columns);\n\tset_model(m_model);\n\tset_text_column(m_columns.value);\n\n\tGtk::Entry* const entry = dynamic_cast<Gtk::Entry*>(get_child());\n\n\tsignal_changed().connect(sigc::mem_fun(*this, &control::on_list_changed));\n\tentry->signal_focus_in_event().connect(sigc::mem_fun(*this, &control::on_entry_focus_in_event));\n\tentry->signal_focus_out_event().connect(sigc::mem_fun(*this, &control::on_entry_focus_out_event));\n\tentry->signal_activate().connect(sigc::mem_fun(*this, &control::on_entry_activate));\n}\n\nvoid control::set_values(const values_t& Values)\n{\n\tm_model->clear();\n\tfor(values_t::const_iterator value = Values.begin(); value != Values.end(); ++value)\n\t{\n\t\tGtk::TreeRow row = *m_model->append();\n\t\trow[m_columns.value] = *value;\n\t}\n\n\tdata_changed(0);\n}\n\nvoid control::data_changed(k3d::ihint*)\n{\n\treturn_if_fail(m_data.get());\n\n\tconst std::string value = m_data->value();\n\tadd_impromptu_value(value);\n\n\tGtk::Entry* const entry = dynamic_cast<Gtk::Entry*>(get_child());\n\tentry->set_text(value);\n}\n\nvoid control::on_list_changed()\n{\n\tset_new_value();\n}\n\nbool control::on_entry_focus_in_event(GdkEventFocus* Event)\n{\n\t// Disable accelerators for this window\n\tGtk::Window* const window = dynamic_cast<Gtk::Window*>(get_toplevel());\n\tif(window)\n\t{\n\t\tm_disabled_accel_group = window->get_accel_group();\n\t\twindow->remove_accel_group(window->get_accel_group());\n\t}\n\treturn false;\n}\n\nbool control::on_entry_focus_out_event(GdkEventFocus* Event)\n{\n\t// Enable accelerators for this window\n\tGtk::Window* const window = dynamic_cast<Gtk::Window*>(get_toplevel());\n\tif(window)\n\t{\n\t\twindow->add_accel_group(m_disabled_accel_group);\n\t\tm_disabled_accel_group.clear();\n\t}\n\tset_new_value();\n\treturn false;\n}\n\nvoid control::on_entry_activate()\n{\n\tchild_focus(Gtk::DIR_TAB_FORWARD);\n}\n\nvoid control::add_impromptu_value(const std::string& Value)\n{\n\t// Never add empty string to the list ...\n\tif(Value.empty())\n\t\treturn;\n\n\t// Never add duplicates to the list ...\n\tconst Gtk::TreeNodeChildren children = m_model->children();\n\tfor(Gtk::TreeNodeChildren::const_iterator child = children.begin(); child != children.end(); ++child)\n\t{\n\t\tif(Value == (*child)[m_columns.value])\n\t\t\treturn;\n\t}\n\n\tGtk::TreeRow row = *m_model->append();\n\trow[m_columns.value] = Value;\n}\n\nvoid control::set_new_value()\n{\n\tGtk::Entry* const entry = dynamic_cast<Gtk::Entry*>(get_child());\n\tconst std::string value = entry->get_text();\n\n\treturn_if_fail(m_data.get());\n\n\tadd_impromptu_value(value);\n\tif(value == m_data->value())\n\t\treturn;\n\n\tk3d::istate_recorder* const state_recorder = m_data->state_recorder;\n\tconst Glib::ustring change_message = m_data->change_message;\n\n\tif(state_recorder)\n\t\tstate_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\tm_data->set_value(value);\n\n\tif(state_recorder)\n\t\tstate_recorder->commit_change_set(state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), change_message + \" \" + value, K3D_CHANGE_SET_CONTEXT);\n}\n\n} // namespace combo_box\n\n} // namespace ngui\n\n} // namespace k3d\n"
  },
  {
    "path": "k3dsdk/ngui/combo_box.h",
    "content": "#ifndef K3DSDK_NGUI_COMBO_BOX_H\n#define K3DSDK_NGUI_COMBO_BOX_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares k3d::combo_box classes, which provide a model-view-controller UI for text data that includes a finite set of default values\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iwritable_property.h>\n\n#include <gtkmm/comboboxentry.h>\n#include <gtkmm/liststore.h>\n\n#include <memory>\n\n// Forward declarations\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace combo_box\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// idata_proxy\n\n/// Abstract interface for an object that proxies a data source for a combo_box control (i.e. the \"model\" in model-view-controller)\nclass idata_proxy\n{\npublic:\n\tvirtual ~idata_proxy() {}\n\n\t/// Called to return the underlying data value\n\tvirtual const std::string value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const std::string& Value) = 0;\n\t/// Signal emitted if the underlying data changes\n\ttypedef sigc::signal<void, k3d::ihint*> changed_signal_t;\n\t/// Signal emitted if the underlying data changes\n\tvirtual changed_signal_t& changed_signal() = 0;\n\n\t/// Stores an optional state recorder for recording undo/redo data\n\tk3d::istate_recorder* const state_recorder;\n\t/// Stores an optional message for labelling undo/redo state changes\n\tconst Glib::ustring change_message;\n\nprotected:\n\tidata_proxy(k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tstate_recorder(StateRecorder),\n\t\tchange_message(ChangeMessage)\n\t{\n\t}\n\nprivate:\n\tidata_proxy(const idata_proxy& RHS);\n\tidata_proxy& operator=(const idata_proxy& RHS);\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for manipulating enumerated quantities (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::ComboBoxEntry\n{\n\ttypedef Gtk::ComboBoxEntry base;\n\npublic:\n\tcontrol(std::unique_ptr<idata_proxy> Data);\n\n\t/// Defines a predefined (but not exclusive) list of values that should be available to the user\n\ttypedef std::vector<std::string> values_t;\n\t/// Specifies a predefined (but not exclusive) list of values that should be available to the user\n\tvoid set_values(const values_t& Values);\n\nprivate:\n\t/// Called whenever the underlying data changes\n\tvoid data_changed(k3d::ihint*);\n\t/// Called when the user picks an existing value using the dropdown list\n\tvoid on_list_changed();\n\t/// Called when the edit control receives the focus\n\tbool on_entry_focus_in_event(GdkEventFocus* Event);\n\t/// Called when the user tabs off the edit control\n\tbool on_entry_focus_out_event(GdkEventFocus* Event);\n\t/// Called when the user activates the edit control\n\tvoid on_entry_activate();\n\t/// Called to add new values to the list that aren't already part of the default set\n\tvoid add_impromptu_value(const std::string& Value);\n\t/// Called to update the underlying data when the control is modified by the user\n\tvoid set_new_value();\n\n\t/// Stores a proxy for the underlying data source\n\tstd::unique_ptr<idata_proxy> m_data;\n\n\t/// Defines a data model for the underlying combo box widget\n\tclass columns :\n\t\tpublic Gtk::TreeModelColumnRecord\n\t{\n\tpublic:\n\t\tcolumns()\n\t\t{\n\t\t\tadd(value);\n\t\t}\n\n\t\tGtk::TreeModelColumn<Glib::ustring> value;\n\t};\n\n\t/// Defines a data model for the underlying combo box widget\n\tcolumns m_columns;\n\t/// Stores data for the underlying combo box widget\n\tGlib::RefPtr<Gtk::ListStore> m_model;\n\t/// Stores the global accel group while the control has the keyboard focus\n\tGlib::RefPtr<Gtk::AccelGroup> m_disabled_accel_group;\n};\n\n/// Provides an implementation of k3d::combo_box::idata_proxy that supports any data source that supports the value(), set_value(), and changed_signal() concepts\ntemplate<typename data_t>\nclass data_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tdata_proxy(data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_data(Data)\n\t{\n\t}\n\n\tconst std::string value()\n\t{\n\t\treturn m_data.value();\n\t}\n\n\tvoid set_value(const std::string& Value)\n\t{\n\t\tm_data.set_value(Value);\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_data.changed_signal();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_data;\n};\n\n/// Convenience factory function for creating combo_box::idata_proxy objects\ntemplate<typename data_t>\nstd::unique_ptr<idata_proxy> proxy(data_t& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = Glib::ustring())\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<data_t>(Data, StateRecorder, ChangeMessage));\n}\n\n/// Convenience factory function for creating combo_box::idata_proxy objects for use with k3d::iproperty\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = Glib::ustring());\n\n} // namespace combo_box\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_COMBO_BOX_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/console.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/console.h>\n\n#include <k3dsdk/log.h>\n\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/textview.h>\n\n#include <boost/algorithm/string.hpp>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace console\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control::implementation\n\nclass control::implementation\n{\npublic:\n\timplementation() :\n\t\tcommand_index(0), completion_key(GDK_VoidSymbol)\n\t{\n\t\tbuffer = Gtk::TextBuffer::create();\n\n\t\tread_only = Gtk::TextTag::create(\"read-only\");\n\t\tread_only->property_editable() = false;\n\t\tbuffer->get_tag_table()->add(read_only);\n\n\t\tbegin_input = Gtk::TextMark::create(\"begin-input\");\n\t\tbuffer->add_mark(begin_input, buffer->end());\n\n\t\tview.set_buffer(buffer);\n\t\tview.set_editable(false);\n\t\tview.set_cursor_visible(false);\n\t\tview.set_wrap_mode(Gtk::WRAP_WORD);\n\t\tview.signal_key_press_event().connect(sigc::mem_fun(*this, &implementation::on_key_press_event), false);\n\n\t\tscrolled_window.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);\n\t\tscrolled_window.add(view);\n\t}\n\n\tbool on_key_press_event(GdkEventKey* event)\n\t{\n\t\tif(event->keyval == GDK_Return)\n\t\t{\n\t\t\tconst k3d::string_t input = buffer->get_text(buffer->get_iter_at_mark(begin_input), buffer->end()).raw();\n\n\t\t\tbuffer->insert(buffer->end(), \"\\n\");\n\t\t\tbuffer->apply_tag(read_only, buffer->get_iter_at_mark(begin_input), buffer->end());\n\t\t\tbuffer->move_mark(begin_input, buffer->end());\n\n\t\t\tif(!input.empty() && (command_history.empty() || input != command_history.back()))\n\t\t\t\tcommand_history.push_back(input);\n\t\t\tcommand_index = command_history.size();\n\t\t\tcommand_signal.emit(input);\n\t\t\tview.scroll_to(buffer->get_insert());\n\n\t\t\treturn true;\n\t\t}\n\t\telse if(event->keyval == completion_key)\n\t\t{\n\t\t\tconst k3d::string_t input = buffer->get_text(buffer->get_iter_at_mark(begin_input), buffer->end()).raw();\n\t\t\tcomplete_key_pressed_signal.emit(input);\n\n\t\t\treturn true;\n\t\t}\n\t\telse if(event->keyval == GDK_Left)\n\t\t{\n\t\t\treturn buffer->get_iter_at_mark(buffer->get_insert()) <= buffer->get_iter_at_mark(begin_input);\n\t\t}\n\t\telse if(event->keyval == GDK_Up)\n\t\t{\n\t\t\tif(command_index)\n\t\t\t{\n\t\t\t\tif(command_index == command_history.size())\n\t\t\t\t\tcommand_buffer = buffer->get_text(buffer->get_iter_at_mark(begin_input), buffer->end()).raw();\n\n\t\t\t\tcommand_index -= 1;\n\t\t\t\tbuffer->erase(buffer->get_iter_at_mark(begin_input), buffer->end());\n\t\t\t\tbuffer->insert(buffer->end(), command_history[command_index]);\n\t\t\t}\n\n\t\t\tbuffer->place_cursor(buffer->end());\n\t\t\treturn true;\n\t\t}\n\t\telse if(event->keyval == GDK_Down)\n\t\t{\n\t\t\tif(command_index < command_history.size())\n\t\t\t{\n\t\t\t\tcommand_index += 1;\n\t\t\t\tbuffer->erase(buffer->get_iter_at_mark(begin_input), buffer->end());\n\t\t\t\tbuffer->insert(buffer->end(),\n\t\t\t\t\tcommand_index < command_history.size()\n\t\t\t\t\t? command_history[command_index]\n\t\t\t\t\t: command_buffer);\n\t\t\t}\n\n\t\t\tbuffer->place_cursor(buffer->end());\n\t\t\treturn true;\n\t\t}\n\t\telse if(event->keyval == GDK_Home)\n\t\t{\n\t\t\tbuffer->place_cursor(buffer->get_iter_at_mark(begin_input));\n\t\t\treturn true;\n\t\t}\n\t\telse if(event->keyval == GDK_v && (event->state & GDK_CONTROL_MASK))\n\t\t{\n\t\t\tconst k3d::string_t input = Gtk::Clipboard::get()->wait_for_text();\n\t\t\t\n\t\t\tstd::vector<k3d::string_t> lines;\n\t\t\tboost::split(lines, input, boost::is_any_of(\"\\n\"));\n\n\t\t\tfor(k3d::uint_t i = 0; i != lines.size(); ++i)\n\t\t\t{\n\t\t\t\tbuffer->insert(buffer->end(), lines[i]);\n\t\t\t\t\n\t\t\t\tif(i+1 < lines.size())\n\t\t\t\t{\n\t\t\t\t\tbuffer->insert(buffer->end(), \"\\n\");\n\t\t\t\t\tbuffer->apply_tag(read_only, buffer->get_iter_at_mark(begin_input), buffer->end());\n\t\t\t\t\tbuffer->move_mark(begin_input, buffer->end());\n\n\t\t\t\t\tif(!lines[i].empty() && (command_history.empty() || lines[i] != command_history.back()))\n\t\t\t\t\t\tcommand_history.push_back(lines[i]);\n\t\t\t\t\tcommand_index = command_history.size();\n\t\t\t\t\tcommand_signal.emit(lines[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\telse if(event->keyval != GDK_Control_L && event->keyval != GDK_Control_R)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tvoid print_string(const string_t& String, const bool_t Editable)\n\t{\n\t\tif(current_format)\n\t\t{\n\t\t\tif(!buffer->get_tag_table()->lookup(current_format->property_name().get_value()))\n\t\t\t\tbuffer->get_tag_table()->add(current_format);\n\n\t\t\tbuffer->insert_with_tag(buffer->end(), String, current_format);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbuffer->insert(buffer->end(), String);\n\t\t}\n\n\t\tif(!Editable)\n\t\t\tbuffer->apply_tag(read_only, buffer->begin(), buffer->end());\n\t\tview.scroll_to(buffer->get_insert());\n\t}\n\n\tstd::vector<string_t> command_history;\n\tstd::vector<string_t>::size_type command_index;\n\tstring_t command_buffer;\n\tsigc::signal<void, const string_t&> command_signal;\n\tsigc::signal<void, const string_t&> complete_key_pressed_signal;\n\n\tGlib::RefPtr<Gtk::TextBuffer> buffer;\n\tGlib::RefPtr<Gtk::TextTag> current_format;\n\tGlib::RefPtr<Gtk::TextTag> read_only;\n\tGlib::RefPtr<Gtk::TextMark> begin_input;\n\n\tGtk::TextView view;\n\tGtk::ScrolledWindow scrolled_window;\n\tguint completion_key;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control() :\n\tbase(),\n\tm_implementation(new implementation())\n{\n\tset_name(\"k3d-console\");\n\tset_shadow_type(Gtk::SHADOW_NONE);\n\tadd(m_implementation->scrolled_window);\n}\n\ncontrol::~control()\n{\n\tdelete m_implementation;\n}\n\nvoid control::clear()\n{\n\tm_implementation->buffer->erase(m_implementation->buffer->begin(), m_implementation->buffer->end());\n}\n\nvoid control::set_current_format(Glib::RefPtr<Gtk::TextTag>& Tag)\n{\n\tm_implementation->current_format = Tag;\n}\n\nvoid control::print_string(const string_t& String, const bool_t Editable)\n{\n\tm_implementation->print_string(String, Editable);\n\tif(!Editable)\n\t{\n\t\tm_implementation->view.set_editable(false);\n\t\tm_implementation->view.set_cursor_visible(false);\n\t}\n}\n\nvoid control::prompt_string(const string_t& String)\n{\n\tm_implementation->print_string(String, false);\n\tm_implementation->buffer->move_mark(m_implementation->begin_input, m_implementation->buffer->end());\n\tm_implementation->buffer->place_cursor(m_implementation->buffer->end());\n\tm_implementation->view.set_editable(true);\n\tm_implementation->view.set_cursor_visible(true);\n}\n\nvoid control::set_completion_key(const uint_t KeySym)\n{\n\tm_implementation->completion_key = KeySym;\n}\n\nsigc::connection control::connect_command_signal(const sigc::slot<void, const string_t&>& Slot)\n{\n\treturn m_implementation->command_signal.connect(Slot);\n}\n\nsigc::connection control::connect_complete_key_pressed_signal(const sigc::slot<void, const string_t&>& Slot)\n{\n\treturn m_implementation->complete_key_pressed_signal.connect(Slot);\n}\n\n} // namespace console\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/console.h",
    "content": "#ifndef K3DSDK_NGUI_CONSOLE_H\n#define K3DSDK_NGUI_CONSOLE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n\n#include <gtkmm/frame.h>\n\nnamespace Gtk { class TextTag; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace console\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a \"console\" control that can be used for line-oriented output\nclass control :\n        public Gtk::Frame\n{\n\ttypedef Gtk::Frame base;\n\npublic:\n\tcontrol();\n\t~control();\n\n\t/// Clears the contents of the console.\n\tvoid clear();\n\t/// Sets the text formatting tag that will be applied to text passed to print_string() and prompt_string().\n\tvoid set_current_format(Glib::RefPtr<Gtk::TextTag>& Tag);\n\t/// Writes the supplied text to the console. If Editable is true, the text can be edited on the commad line\n\tvoid print_string(const string_t& String, const bool_t Editable=false);\n\t/// Writes the supplied user prompt text to the console.\n\tvoid prompt_string(const string_t& String);\n\t/// Set the completion key\n\t/**\n\t * Note: By default, comletion is disabled (KeySym == GDK_VoidSymbol), so\n\t * you need to call this with i.e. GDK_Tab to enable it\n\t */\n\tvoid set_completion_key(const uint_t KeySym);\n\n\t/// Connects a slot to a signal that will be emitted whenever the user enters a command.\n\tsigc::connection connect_command_signal(const sigc::slot<void, const string_t&>& Slot);\n\n\t/// Connects a slot to a signal that will be emitted when the \"completion request\" key (see set_completion_key) is pressed\n\tsigc::connection connect_complete_key_pressed_signal(const sigc::slot<void, const string_t&>& Slot);\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace console\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_CONSOLE_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/context_menu.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <gtkmm/image.h>\n#include <gtkmm/imagemenuitem.h>\n#include <gtkmm/menu.h>\n#include <gtkmm/menuitem.h>\n#include <gtkmm/stock.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/dependencies.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/ikeyframer.h>\n#include <k3dsdk/imesh_selection_sink.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/imesh_storage.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/ngui/check_menu_item.h>\n#include <k3dsdk/ngui/context_menu.h>\n#include <k3dsdk/ngui/pipeline.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/menus.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/node.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/ngui/render.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/ngui/widget_manip.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/persistent_lookup.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/time_source.h>\n#include <k3dsdk/utility_gl.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\n/// Provides a standardized context menu for nodes\nclass node_context_menu :\n\tpublic Gtk::Menu\n{\npublic:\n\tnode_context_menu(document_state& DocumentState) :\n\t\tm_document_state(DocumentState)\n\t{\n\t\t// Create viewport-specific functionality ...\n\t\tm_viewport1 = new Gtk::MenuItem(*Gtk::manage(\n\t\t\tnew Gtk::Label() <<\n\t\t\talignment(0, 0.5) <<\n\t\t\tset_markup(_(\"<b><i>Viewport:</i></b>\"))));\n\t\tappend(*Gtk::manage(m_viewport1));\n\n\t\t// Render-related functionality ...\n\t\tGtk::Menu* const render_submenu = new Gtk::Menu();\n\n\t\trender_submenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t*Gtk::manage(new Gtk::Image(load_icon(\"render_preview\", Gtk::ICON_SIZE_MENU))),\n\t\t\t_(\"Render Preview\")) <<\n\t\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_render_preview))));\n\n\t\trender_submenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t*Gtk::manage(new Gtk::Image(load_icon(\"render_frame\", Gtk::ICON_SIZE_MENU))),\n\t\t\t_(\"Render Image\")) <<\n\t\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_render_frame))));\n\n\t\trender_submenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t*Gtk::manage(new Gtk::Image(load_icon(\"render_animation\", Gtk::ICON_SIZE_MENU))),\n\t\t\t_(\"Render Animation\")) <<\n\t\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_render_animation))));\n\n\t\titems().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Render\"), *Gtk::manage(render_submenu)));\n\n\t\titems().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Set Camera ...\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_set_viewport_camera))));\n\n\t\t// Set render engines\n\t\tGtk::Menu* const engines_submenu = new Gtk::Menu();\n\n\t\tengines_submenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Set Preview Engine ...\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_set_viewport_preview_engine))));\n\n\t\tengines_submenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Set Still Engine ...\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_set_viewport_still_engine))));\n\n\t\tengines_submenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Set Animation Engine ...\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_set_viewport_animation_engine))));\n\n\t\tengines_submenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Set OpenGL Engine ...\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_set_viewport_gl_engine))));\n\n\t\titems().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Render Engine\"), *Gtk::manage(engines_submenu)));\n\n\t\t// Viewport section end\n\t\titems().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\t// Functionality common to all nodes ...\n\t\tm_delete_nodes = new Gtk::MenuItem(_(\"Delete\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_delete));\n\t\titems().push_back(*Gtk::manage(m_delete_nodes));\n\n\t\t// Persistence-related functionality ...\n/*\t\tif(dynamic_cast<k3d::ipersistent*>(&Object))\n\t\t{\n\t\t\titems().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\t\t\titems().push_back(*Gtk::manage(\n\t\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::SAVE, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t\t_(\"Save Object\")) <<\n\t\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_save_node))));\n\t\t\titems().push_back(*Gtk::manage(\n\t\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::OPEN, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t\t_(\"Load Object\")) <<\n\t\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_load_node))));\n\t\t}\n*/\n\n\t\t// Mesh-specific functionality ...\n\t\tm_instantiate_meshes = new Gtk::MenuItem(_(\"Instantiate\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_instantiate));\n\t\titems().push_back(*Gtk::manage(m_instantiate_meshes));\n\n\t\tm_duplicate_meshes = new Gtk::MenuItem(_(\"Duplicate\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_duplicate));\n\t\titems().push_back(*Gtk::manage(m_duplicate_meshes));\n\t\t\n\t\tm_animate_transformation = new Gtk::MenuItem(_(\"Animate Transformation\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_animate_transformation));\n\t\titems().push_back(*Gtk::manage(m_animate_transformation));\n\n\t\t// Mesh modifiers menu\n\t\tconst factories_t& mesh_modifier_factories = mesh_modifiers();\n\t\tif(!mesh_modifier_factories.empty())\n\t\t{\n\t\t\tm_mesh_modifiers = new Gtk::Menu();\n\n\t\t\tfor(factories_t::const_iterator modifier = mesh_modifier_factories.begin(); modifier != mesh_modifier_factories.end(); ++modifier)\n\t\t\t{\n\t\t\t\tk3d::iplugin_factory& factory = **modifier;\n\n\t\t\t\tm_mesh_modifiers->items().push_back(*Gtk::manage(\n\t\t\t\t\tcreate_menu_item(factory) <<\n\t\t\t\t\tconnect_menu_item(sigc::bind(sigc::mem_fun(*this, &node_context_menu::on_modify_meshes), &factory))));\n\t\t\t}\n\t\t\titems().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Mesh Modifier\"), *manage(m_mesh_modifiers)));\n\t\t}\n\n\t\t// Transform-specific functionality ...\n\t\tconst factories_t& transform_modifier_factories = transform_modifiers();\n\t\tif(!transform_modifier_factories.empty())\n\t\t{\n\t\t\tm_transform_modifiers = new Gtk::Menu();\n\n\t\t\tfor(factories_t::const_iterator modifier = transform_modifier_factories.begin(); modifier != transform_modifier_factories.end(); ++modifier)\n\t\t\t{\n\t\t\t\tk3d::iplugin_factory& factory = **modifier;\n\n\t\t\t\tm_transform_modifiers->items().push_back(*Gtk::manage(\n\t\t\t\t\tcreate_menu_item(factory) <<\n\t\t\t\t\tconnect_menu_item(sigc::bind(sigc::mem_fun(*this, &node_context_menu::on_modifier_transform), &factory))));\n\t\t\t}\n\t\t\titems().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Transform Modifier\"), *manage(m_transform_modifiers)));\n\t\t}\n\n\t\t// Mesh sinks menu\n\t\tconst factories_t& mesh_sink_factories = mesh_sinks();\n\t\tif(!mesh_sink_factories.empty())\n\t\t{\n\t\t\tm_mesh_sinks = new Gtk::Menu();\n\n\t\t\tfor(factories_t::const_iterator sink = mesh_sink_factories.begin(); sink != mesh_sink_factories.end(); ++sink)\n\t\t\t{\n\t\t\t\tk3d::iplugin_factory& factory = **sink;\n\n\t\t\t\tm_mesh_sinks->items().push_back(*Gtk::manage(\n\t\t\t\t\tcreate_menu_item(factory) <<\n\t\t\t\t\tconnect_menu_item(sigc::bind(sigc::mem_fun(*this, &node_context_menu::on_modify_meshes), &factory)))); // the modify mesh code also applies to sinks, after only very minor modification\n\t\t\t}\n\t\t\titems().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Mesh Sink\"), *manage(m_mesh_sinks)));\n\t\t}\n\n\t\t// Viewport visibility ...\n\t\titems().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\titems().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Hide Selection\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_hide_selection))));\n\n\t\titems().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Show Selection\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_show_selection))));\n\n\t\titems().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Hide Unselected\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_hide_unselected))));\n\n\t\titems().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Show All\")) <<\n\t\t\tconnect_menu_item(sigc::mem_fun(*this, &node_context_menu::on_show_all))));\n\n\t\tshow_all();\n\t}\n\n\tvoid update_menu()\n\t{\n\t\t// Display viewport-specific functionality ...\n\t\tm_viewport = m_document_state.get_focus_viewport();\n\t\tconst bool display_viewport = (m_viewport && m_viewport->gl_engine());\n\t\tm_viewport1->set_sensitive(display_viewport);\n\n\t\t// Mesh specific functionality\n\t\tunsigned long selected_node_counter = 0;\n\t\tunsigned long selected_mesh_counter = 0;\n\t\tunsigned long selected_transform_counter = 0;\n\t\tconst k3d::nodes_t selected_nodes = selection::state(m_document_state.document()).selected_nodes();\n\t\tfor(k3d::nodes_t::const_iterator node = selected_nodes.begin(); node != selected_nodes.end(); ++node)\n\t\t{\n\t\t\t++selected_node_counter;\n\n\t\t\tif(dynamic_cast<k3d::imesh_sink*>(*node))\n\t\t\t\t++selected_mesh_counter;\n\t\t\tif(dynamic_cast<k3d::imatrix_sink*>(*node))\n\t\t\t\t++selected_transform_counter;\n\t\t}\n\n\t\tconst bool non_empty_selection = (selected_node_counter > 0);\n\t\tm_delete_nodes->set_sensitive(non_empty_selection);\n\t\tm_instantiate_meshes->set_sensitive(non_empty_selection);\n\t\tm_duplicate_meshes->set_sensitive(non_empty_selection);\n\n\t\tconst bool display_mesh_modifiers = (selected_mesh_counter > 0);\n\t\tm_mesh_modifiers->set_sensitive(display_mesh_modifiers);\n\t\tm_mesh_sinks->set_sensitive(display_mesh_modifiers);\n\n\t\tconst bool display_transform_modifiers = (selected_transform_counter > 0);\n\t\tm_transform_modifiers->set_sensitive(display_transform_modifiers);\n\t}\n\n\tvoid on_show()\n\t{\n\t\tupdate_menu();\n\t\tGtk::Widget::on_show();\n\t}\n\nprivate:\n\tvoid on_set_viewport_camera()\n\t{\n\t\treturn_if_fail(m_viewport);\n\n\t\tk3d::icamera* const camera = pick_camera(m_document_state, m_viewport->camera());\n\t\tif(!camera)\n\t\t\treturn;\n\n\t\tm_viewport->set_camera(camera);\n\t}\n\n\tvoid on_set_viewport_preview_engine()\n\t{\n\t\treturn_if_fail(m_viewport);\n\n\t\tk3d::irender_camera_preview* const engine = pick_camera_preview_render_engine(m_document_state);\n\t\tif(!engine)\n\t\t\treturn;\n\n\t\tm_viewport->set_camera_preview_engine(engine);\n\t}\n\n\tvoid on_set_viewport_still_engine()\n\t{\n\t\treturn_if_fail(m_viewport);\n\n\t\tk3d::irender_camera_frame* const engine = pick_camera_still_render_engine(m_document_state);\n\t\tif(!engine)\n\t\t\treturn;\n\n\t\tm_viewport->set_camera_still_engine(engine);\n\t}\n\n\tvoid on_set_viewport_animation_engine()\n\t{\n\t\treturn_if_fail(m_viewport);\n\n\t\tk3d::irender_camera_animation* const engine = pick_camera_animation_render_engine(m_document_state);\n\t\tif(!engine)\n\t\t\treturn;\n\n\t\tm_viewport->set_camera_animation_engine(engine);\n\t}\n\n\tvoid on_set_viewport_gl_engine()\n\t{\n\t\treturn_if_fail(m_viewport);\n\n\t\tk3d::gl::irender_viewport* const engine = pick_gl_render_engine(m_document_state);\n\t\tif(!engine)\n\t\t\treturn;\n\n\t\tm_viewport->set_gl_engine(engine);\n\t}\n\n\tvoid on_render_preview()\n\t{\n\t\treturn_if_fail(m_viewport);\n\n\t\tk3d::icamera* camera = m_viewport->camera();\n\t\tif(!camera)\n\t\t\tcamera = pick_camera(m_document_state);\n\t\tif(!camera)\n\t\t\treturn;\n\n\t\tk3d::irender_camera_preview* render_engine = m_viewport->camera_preview_engine();\n\t\tif(!render_engine)\n\t\t\trender_engine = pick_camera_preview_render_engine(m_document_state);\n\t\tif(!render_engine)\n\t\t\treturn;\n\n\t\tm_viewport->set_camera(camera);\n\t\tm_viewport->set_camera_preview_engine(render_engine);\n\n\t\trender(*camera, *render_engine);\n\t}\n\n\tvoid on_render_frame()\n\t{\n\t\tk3d::icamera* camera = m_viewport ? m_viewport->camera() : 0;\n\t\tif(!camera)\n\t\t\tcamera = pick_camera(m_document_state);\n\t\tif(!camera)\n\t\t\treturn;\n\n\t\tk3d::irender_camera_frame* render_engine = m_viewport ? m_viewport->camera_still_engine() : 0;\n\t\tif(!render_engine)\n\t\t\trender_engine = pick_camera_still_render_engine(m_document_state);\n\t\tif(!render_engine)\n\t\t\treturn;\n\n\t\tif(m_viewport)\n\t\t{\n\t\t\tm_viewport->set_camera(camera);\n\t\t\tm_viewport->set_camera_still_engine(render_engine);\n\t\t}\n\n\t\trender(*camera, *render_engine);\n\t}\n\n\tvoid on_render_animation()\n\t{\n\t\tk3d::icamera* camera = m_viewport ? m_viewport->camera() : 0;\n\t\tif(!camera)\n\t\t\tcamera = pick_camera(m_document_state);\n\t\tif(!camera)\n\t\t\treturn;\n\n\t\tk3d::irender_camera_animation* render_engine = m_viewport ? m_viewport->camera_animation_engine() : 0;\n\t\tif(!render_engine)\n\t\t\trender_engine = pick_camera_animation_render_engine(m_document_state);\n\t\tif(!render_engine)\n\t\t\treturn;\n\n\t\tif(m_viewport)\n\t\t{\n\t\t\tm_viewport->set_camera(camera);\n\t\t\tm_viewport->set_camera_animation_engine(render_engine);\n\t\t}\n\n\t\trender(m_document_state, *camera, *render_engine);\n\t}\n\n/*\n\tvoid on_save_node()\n\t{\n\t\tk3d::ipersistent* const persistent = dynamic_cast<k3d::ipersistent*>(&m_node);\n\t\treturn_if_fail(persistent);\n\n\t\tk3d::filesystem::path path;\n\t\tif(!get_file_path(k3d::ipath_property::WRITE, m_node.factory().name(), _(\"Save Object Properties:\"), k3d::filesystem::path(), path))\n\t\t\treturn;\n\n\t\tk3d::log() << info << \"Writing .k3d file: \" << path.native_string() << std::endl;\n\t\tk3d::filesystem::ofstream file(path);\n\t\tif(!file)\n\t\t\t{\n\t\t\t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << path.native_string() << \"]\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\tconst k3d::filesystem::path root_path = path.branch_path();\n\t\tk3d::dependencies dependencies;\n\t\tk3d::persistent_lookup lookup;\n\t\tk3d::ipersistent::save_context context(root_path, dependencies, lookup);\n\n\t\tk3d::xml::element xml(\"k3dml\");\n\t\tk3d::save_node(*persistent, xml, context);\n\n\t\tfile << k3d::xml::declaration() << xml;\n\t}\n\n\tvoid on_load_node()\n\t{\n\t\tk3d::ipersistent* const persistent = dynamic_cast<k3d::ipersistent*>(&m_node);\n\t\treturn_if_fail(persistent);\n\n\t\tk3d::filesystem::path path;\n\t\tif(!get_file_path(k3d::ipath_property::READ, m_node.factory().name(), _(\"Load Object Properties:\"), k3d::filesystem::path(), path))\n\t\t\treturn;\n\n\t\tk3d::log() << info << \"Reading .k3d file: \" << path.native_string() << std::endl;\n\t\tk3d::filesystem::ifstream file(path);\n\t\tif(!file)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << path.native_string() << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::xml::element xml(\"k3dml\");\n\t\ttry\n\t\t{\n\t\t\tk3d::xml::hide_progress progress;\n\t\t\tk3d::xml::parse(xml, file, path.native_string(), progress);\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\treturn_if_fail(xml.name == \"k3dml\");\n\n\t\tk3d::xml::element* const xml_node = k3d::xml::find_element(xml, \"node\");\n\t\treturn_if_fail(xml_node);\n\n\t\tconst k3d::uuid class_id = k3d::xml::attribute_value<k3d::uuid>(*xml_node, \"class\", k3d::uuid::null());\n\t\tif(class_id != m_node.factory().class_id())\n\t\t{\n\t\t\terror_message(_(\"Wrong node type\"), _(\"Load Object Properties:\"));\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::record_state_change_set changeset(m_document_state.document(), k3d::string_cast(boost::format(_(\"Load %1%\")) % path.native_string()));\n\n\t\tconst k3d::filesystem::path root_path = path.branch_path();\n\t\tk3d::persistent_lookup lookup;\n\t\tk3d::ipersistent::load_context context(root_path, lookup);\n\n\t\tpersistent->load(*xml_node, context);\n\t}\n*/\n\n\tvoid on_delete()\n\t{\n\t\tk3d::record_state_change_set changeset(m_document_state.document(), _(\"Delete nodes\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\tk3d::nodes_t nodes = selection::state(m_document_state.document()).selected_nodes();\n\n\t\tk3d::delete_nodes(m_document_state.document(), nodes);\n\t\tk3d::gl::redraw_all(m_document_state.document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\t/// Instantiates selected meshes\n\tvoid on_instantiate()\n\t{\n\t\tpipeline::instantiate_selected_nodes(m_document_state.document());\n\t}\n\n\t/// Duplicates selected meshes\n\tvoid on_duplicate()\n\t{\n\t\tpipeline::duplicate_selected_nodes(m_document_state.document());\n\t}\n\t\n\t/// Easy animation of transformation matrix\n\tvoid on_animate_transformation()\n\t{\n\t\tconst k3d::nodes_t selected_nodes = selection::state(m_document_state.document()).selected_nodes();\n\t\tfor(k3d::nodes_t::const_iterator node = selected_nodes.begin(); node != selected_nodes.end(); ++node)\n\t\t{\n\t\t\tk3d::inode* upstream_node = 0;\n\t\t\t\n\t\t\t// Check if the selected node can be transformed\n\t\t\tk3d::imatrix_sink* const downstream_sink = dynamic_cast<k3d::imatrix_sink*>(*node);\n\t\t\tif (!downstream_sink)\n\t\t\t\tcontinue;\n\t\t\tk3d::iproperty& downstream_input = downstream_sink->matrix_sink_input();\n\t\t\tk3d::iproperty* upstream_output = (*node)->document().pipeline().dependency(downstream_input);\n\t\n\t\t\t// Check upstream object\n\t\t\tif(upstream_output)\n\t\t\t\tupstream_node = upstream_output->property_node();\n\t\t\t\n\t\t\t// Skip nodes that are animated already\n\t\t\tif (dynamic_cast<k3d::ikeyframer*>(upstream_node))\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\t// Create the new track\n\t\t\tif (k3d::inode* const track = k3d::plugin::create<k3d::inode>(\"AnimationTrackDoubleMatrix4\", m_document_state.document(), (*node)->name() + \" Track\"))\n\t\t\t{\n\t\t\t\t// Create a default interpolator, if it didn't exist already\n\t\t\t\tk3d::inode* interpolator = 0;\n\t\t\t\tconst std::vector<k3d::inode*> nodes = k3d::node::lookup(m_document_state.document(), \"Linear Transformation Interpolator\");\n\t\t\t\tif(1 == nodes.size())\n\t\t\t\t{\n\t\t\t\t\tinterpolator = nodes[0];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tinterpolator = k3d::plugin::create<k3d::inode>(\"InterpolatorDoubleMatrix4Linear\", m_document_state.document(), \"Linear Transformation Interpolator\");\n\t\t\t\t}\n\t\t\t\t \n\t\t\t\t// Set the interpolator\n\t\t\t\tk3d::property::set_internal_value(*track, \"interpolator\", interpolator);\n\t\t\t\t\n\t\t\t\tk3d::ipipeline::dependencies_t dependencies;\n\t\t\t\t\n\t\t\t\tk3d::iproperty* from = k3d::property::get(**node, \"input_matrix\");\n\t\t\t\tk3d::iproperty* to = k3d::property::get(*track, \"output_value\");\n\t\t\t\tif (from && to) // Connect the transformation matrix of the selected node to the output of the track\n\t\t\t\t\tdependencies.insert(std::make_pair(from, to));\n\t\t\t\t\n\t\t\t\tk3d::iproperty* track_time = k3d::property::get(*track, \"time_input\");\n\t\t\t\tk3d::iproperty* time = k3d::get_time(m_document_state.document());\n\t\t\t\tif (track_time && time) // Connect the time property\n\t\t\t\t\tdependencies.insert(std::make_pair(track_time, time));\n\t\t\t\t\n\t\t\t\t// We must save the dependencies before the nextstep\n\t\t\t\tm_document_state.document().pipeline().set_dependencies(dependencies);\n\t\t\t\t\n\t\t\t\t// Create a keyframe at the first and last frame\n\t\t\t\tk3d::iproperty* start_time = k3d::get_start_time(m_document_state.document());\n\t\t\t\tk3d::iproperty* end_time = k3d::get_end_time(m_document_state.document());\n\t\t\t\tif (time && start_time && end_time)\n\t\t\t\t{\n\t\t\t\t\tk3d::ikeyframer* keyframer = dynamic_cast<k3d::ikeyframer*>(track);\n\t\t\t\t\tboost::any original_time = k3d::property::pipeline_value(*time);\n\t\t\t\t\tk3d::property::set_internal_value(*time, k3d::property::pipeline_value(*start_time));\n\t\t\t\t\tkeyframer->keyframe();\n\t\t\t\t\tk3d::property::set_internal_value(*time, k3d::property::pipeline_value(*end_time));\n\t\t\t\t\tkeyframer->keyframe();\n\t\t\t\t\tk3d::property::set_internal_value(*time, original_time);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/// Modify selected meshes\n\tvoid on_modify_meshes(k3d::iplugin_factory* Modifier)\n\t{\n\t\tif(cancel_plugin(*Modifier))\n\t\t\treturn;\n\n\t\tmodify_selected_meshes(m_document_state, Modifier);\n\t\tk3d::gl::redraw_all(m_document_state.document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\t/// Modify selected transforms\n\tvoid on_modifier_transform(k3d::iplugin_factory* Modifier)\n\t{\n\t\tif(cancel_plugin(*Modifier))\n\t\t\treturn;\n\n\t\tk3d::nodes_t selected_nodes = selection::state(m_document_state.document()).selected_nodes();\n\n\t\tk3d::inode* new_modifier;\n\t\tfor(k3d::nodes_t::iterator node = selected_nodes.begin(); node != selected_nodes.end(); ++node)\n\t\t{\n\t\t\tnew_modifier = modify_transformation(m_document_state.document(), **node, Modifier);\n\t\t\tassert_warning(new_modifier);\n\t\t}\n\n\t\t// Show the new modifier properties if only one was processed\n\t\tif(selected_nodes.size() == 1)\n\t\t\tpanel::mediator(m_document_state.document()).set_focus(*new_modifier);\n\n\t\tk3d::gl::redraw_all(m_document_state.document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_hide_selection()\n\t{\n\t\trecord_state_change_set change_set(m_document_state.document(), _(\"Hide selection\"), K3D_CHANGE_SET_CONTEXT);\n\t\tconst nodes_t selected_nodes = selection::state(m_document_state.document()).selected_nodes();\n\t\tfor(nodes_t::const_iterator node = selected_nodes.begin(); node != selected_nodes.end(); ++node)\n\t\t\tnode::hide(**node);\n\t}\n\n\tvoid on_show_selection()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Show selection\"), K3D_CHANGE_SET_CONTEXT);\n\t\tconst nodes_t selected_nodes = selection::state(m_document_state.document()).selected_nodes();\n\t\tfor(nodes_t::const_iterator node = selected_nodes.begin(); node != selected_nodes.end(); ++node)\n\t\t\tnode::show(**node);\n\t}\n\n\tvoid on_hide_unselected()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Hide unselected\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\tconst nodes_t& nodes = m_document_state.document().nodes().collection();\n\t\tfor(nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\tif(!selection::state(m_document_state.document()).is_selected(**node))\n\t\t\t\tnode::hide(**node);\n\t\t}\n\t}\n\n\tvoid on_show_all()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Show all\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\tconst nodes_t& nodes = m_document_state.document().nodes().collection();\n\t\tfor(nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t\tnode::show(**node);\n\t}\n\n\t// Viewport items\n\tGtk::MenuItem* m_viewport1;\n\n\t// Mesh functionality\n\tGtk::MenuItem* m_delete_nodes;\n\tGtk::MenuItem* m_instantiate_meshes;\n\tGtk::MenuItem* m_duplicate_meshes;\n\tGtk::MenuItem* m_animate_transformation;\n\tGtk::Menu* m_mesh_modifiers;\n\tGtk::Menu* m_transform_modifiers;\n\tGtk::Menu* m_mesh_sinks;\n\n\tdocument_state& m_document_state;\n\tviewport::control* m_viewport;\n};\n\n} // namespace detail\n\nGtk::Menu* create_context_menu(document_state& DocumentState)\n{\n\treturn new detail::node_context_menu(DocumentState);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/context_menu.h",
    "content": "#ifndef K3DSDK_NGUI_CONTEXT_MENU_H\n#define K3DSDK_NGUI_CONTEXT_MENU_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/**\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace Gtk { class Menu; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\n/// Returns a menu suitable for use as a context-sensitive menu for the given object\nGtk::Menu* create_context_menu(document_state& DocumentState);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_CONTEXT_MENU_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/custom_property_control.h",
    "content": "#ifndef K3DSDK_NGUI_CUSTOM_PROPERTY_CONTROL_H\n#define K3DSDK_NGUI_CUSTOM_PROPERTY_CONTROL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace Gtk { class Widget; }\n\nnamespace k3d\n{\n\nclass iproperty;\n\nnamespace ngui\n{\n\nclass document_state;\n\nnamespace custom_property\n{\n\n/// Abstract interface for a \"custom property control\", a UI component that can be displayed in-place-of the normal \"auto-generated\" control for a specific property.\n/// Note: implementations must publicly derived from Gtk::Widget.\nclass control\n{\npublic:\n\tvirtual ~control() {}\n\n\t/// Called once at startup to initialize the control (this is necessary because plugins can't take constructor arguments).\n\tvirtual void initialize(document_state& DocumentState, iproperty& Property) = 0;\n\nprotected:\n\tcontrol() {}\n\tcontrol(const control&) {}\n\tcontrol& operator=(const control&) { return *this; }\n};\n\n} // namespace custom_property\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_CUSTOM_PROPERTY_CONTROL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/custom_property_page.h",
    "content": "#ifndef K3DSDK_NGUI_CUSTOM_PROPERTY_PAGE_H\n#define K3DSDK_NGUI_CUSTOM_PROPERTY_PAGE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace Gtk { class Widget; }\n\nnamespace k3d\n{\n\nclass inode;\n\nnamespace ngui\n{\n\nclass document_state;\n\nnamespace custom_property_page\n{\n\n/// Abstract interface for a custom \"property page\", a UI component that can be displayed in-place-of the normal \"auto-generated\" property page for a specific plugin.\nclass control\n{\npublic:\n\tvirtual ~control() {}\n\n\tvirtual Gtk::Widget& get_widget(document_state& DocumentState, inode& Node) = 0;\n\nprotected:\n\tcontrol() {}\n\tcontrol(const control&) {}\n\tcontrol& operator=(const control&) { return *this; }\n};\n\n} // namespace custom_property_page\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_CUSTOM_PROPERTY_PAGE_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/document.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/imetadata.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/ngui/document.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/main_document_window.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/user_property.h>\n#include <k3dsdk/gl/context.h>\n\n#include <boost/format.hpp>\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// next_document_number\n\n/// Returns unique document numbers for the duration of the current session\nunsigned long next_document_number()\n{\n\tstatic unsigned long document_number = 0;\n\treturn ++document_number;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup_camera_document\n\nvoid setup_camera_document(k3d::idocument& Document)\n{\n\treturn_if_fail(k3d::plugin::factory::lookup(\"Camera\"));\n\n\tk3d::inode* const camera = k3d::plugin::create<k3d::inode>(\"Camera\", Document, \"Camera\");\n\treturn_if_fail(camera);\n\n\tconst k3d::point3 origin = k3d::point3(0, 0, 0);\n\tconst k3d::vector3 world_up = k3d::vector3(0, 0, 1);\n\n\tconst k3d::point3 position = k3d::point3(-15, 20, 10);\n\tconst k3d::vector3 look_vector = origin - position;\n\tconst k3d::vector3 right_vector = look_vector ^ world_up;\n\tconst k3d::vector3 up_vector = right_vector ^ look_vector;\n\n\tk3d::inode* const camera_transformation = k3d::set_matrix(*camera, k3d::view_matrix(look_vector, up_vector, position));\n\treturn_if_fail(camera_transformation);\n\n\tcamera_transformation->set_name(\"Camera Transformation\");\n\tk3d::property::set_internal_value(*camera, \"world_target\", k3d::point3(0, 0, 0));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup_renderman_document\n\nvoid setup_renderman_document(k3d::idocument& Document)\n{\n\treturn_if_fail(k3d::plugin::factory::lookup(\"MultiMaterial\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManBicubicPatchPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManBilinearPatchPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManBlobbyPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManCubicCurvePainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManEngine\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManLight\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManLightShader\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManLinearCurvePainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManMaterial\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManMultiPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManNURBSPatchPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManParticlePainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManPolyhedronPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManSubdivisionSurfacePainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"RenderManSurfaceShader\"));\n\n\t// Setup RenderMan painters ...\n\tk3d::inode* const multi_painter = k3d::plugin::create<k3d::inode>(\"RenderManMultiPainter\", Document, \"RenderMan Default Painter\");\n\treturn_if_fail(multi_painter);\n\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"particles\", \"Particles\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManParticlePainter\", Document, \"RenderMan Particle Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"polyhedra\", \"Polyhedra\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManPolyhedronPainter\", Document, \"RenderMan Polyhedron Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"subdivision_surfaces\", \"Subdivision Surfaces\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManSubdivisionSurfacePainter\", Document, \"RenderMan Subdivision Surface Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"linear_curves\", \"Linear Curves\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManLinearCurvePainter\", Document, \"RenderMan Linear Curve Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"cubic_curves\", \"Cubic Curves\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManCubicCurvePainter\", Document, \"RenderMan Cubic Curve Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"bilinear_patches\", \"Bilinear Patches\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManBilinearPatchPainter\", Document, \"RenderMan Bilinear Patch Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"bicubic_patches\", \"Bicubic Patches\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManBicubicPatchPainter\", Document, \"RenderMan Bicubic Patch Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"nurbs_patches\", \"NURBS Patches\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManNURBSPatchPainter\", Document, \"RenderMan NURBS Patch Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"blobbies\", \"Blobbies\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManBlobbyPainter\", Document, \"RenderMan Blobby Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"cones\", \"Cones\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManConePainter\", Document, \"RenderMan Cone Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"cylinders\", \"Cylinders\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManCylinderPainter\", Document, \"RenderMan Cylinder Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"disks\", \"Disks\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManDiskPainter\", Document, \"RenderMan Disk Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"hyperboloids\", \"Hyperboloids\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManHyperboloidPainter\", Document, \"RenderMan Hyperboloid Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"paraboloids\", \"Paraboloids\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManParaboloidPainter\", Document, \"RenderMan Paraboloid Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"spheres\", \"Spheres\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManSpherePainter\", Document, \"RenderMan Sphere Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"teapots\", \"Teapots\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManTeapotPainter\", Document, \"RenderMan Teapot Painter\"));\n\tk3d::property::create<k3d::ri::imesh_painter*>(*multi_painter, \"tori\", \"Tori\", \"\", k3d::plugin::create<k3d::ri::imesh_painter>(\"RenderManTorusPainter\", Document, \"RenderMan Torus Painter\"));\n\n\t// Setup a default RenderMan shading model ...\n\tk3d::inode* const surface_shader = k3d::plugin::create<k3d::inode>(\"RenderManSurfaceShader\", Document, \"Surface Shader\");\n\treturn_if_fail(surface_shader);\n\tk3d::property::set_internal_value(*surface_shader, \"shader_path\", k3d::share_path() / k3d::filesystem::generic_path(\"shaders/surface/k3d_plastic.sl\"));\n\n\tk3d::imaterial* const renderman_material = k3d::plugin::create<k3d::imaterial>(\"RenderManMaterial\", Document, \"RenderManMaterial\");\n\treturn_if_fail(renderman_material);\n\tk3d::property::set_internal_value(*renderman_material, \"surface_shader\", surface_shader);\n\n\tk3d::inode* const light_shader = k3d::plugin::create<k3d::inode>(\"RenderManLightShader\", Document, \"Light Shader\");\n\treturn_if_fail(light_shader);\n\tk3d::property::set_internal_value(*light_shader, \"shader_path\", k3d::share_path() / k3d::filesystem::generic_path(\"shaders/light/k3d_pointlight.sl\"));\n\n\tk3d::inode* const light = k3d::plugin::create<k3d::inode>(\"RenderManLight\", Document, \"Light\");\n\treturn_if_fail(light);\n\tk3d::property::set_internal_value(*light, \"shader\", light_shader);\n\n\tk3d::inode* light_transformation = k3d::set_matrix(*light, k3d::translate3(-20, 20, 30));\n\treturn_if_fail(light_transformation);\n\tlight_transformation->set_name(\"Light Transformation\");\n\n\tk3d::inode* const default_material = k3d::plugin::create<k3d::inode>(k3d::classes::MultiMaterial(), Document, \"Material\");\n\treturn_if_fail(default_material);\n\n\tk3d::property::create<k3d::imaterial*>(*default_material, \"renderman_material\", \"RenderMan Material\", \"\", renderman_material);\n\n\t// Setup a default choice of external render engine ...\n\tk3d::ri::irender_engine* const bundled_aqsis = k3d::plugin::factory::lookup(\"BundledAqsisRenderManEngine\") ? k3d::plugin::create<k3d::ri::irender_engine>(\"BundledAqsisRenderManEngine\", Document, \"BundledAqsis\") : 0;\n\tk3d::ri::irender_engine* const aqsis = k3d::plugin::create<k3d::ri::irender_engine>(\"AqsisRenderManEngine\", Document, \"Aqsis\");\n\tk3d::ri::irender_engine* const pixie = k3d::plugin::create<k3d::ri::irender_engine>(\"PixieRenderManEngine\", Document, \"Pixie\");\n\n\tk3d::ri::irender_engine* default_render_engine = 0;\n\tif(!default_render_engine && bundled_aqsis && bundled_aqsis->installed())\n\t\tdefault_render_engine = bundled_aqsis;\n\tif(!default_render_engine && aqsis && aqsis->installed())\n\t\tdefault_render_engine = aqsis;\n\tif(!default_render_engine && pixie && pixie->installed())\n\t\tdefault_render_engine = pixie;\n\n\t// Setup a render engine ...\n\tk3d::iunknown* const render_engine = k3d::plugin::create(\"RenderManEngine\", Document, \"RenderMan Engine\");\n\tk3d::property::set_internal_value(*render_engine, \"enabled_lights\", k3d::inode_collection_property::nodes_t(1, light));\n\tk3d::property::set_internal_value(*render_engine, \"render_engine\", dynamic_cast<k3d::inode*>(default_render_engine));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup_selection_document\n\n/// Adds a node to store the document node selection\nk3d::iunknown* setup_selection_document(k3d::idocument& Document)\n{\n\tk3d::imetadata* const node_selection = k3d::plugin::create<k3d::imetadata>(\"NodeSelection\", Document, \"Node Selection\");\n\treturn_val_if_fail(node_selection, 0);\n\n\tnode_selection->set_metadata_value(\"ngui:unique_node\", \"node_selection\"); // metadata to ensure this node is found by the UI layer\n\treturn node_selection;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup_document\n\n/// Adds nodes to a newly-created document to give the user a better out-of-box experience\nvoid setup_document(k3d::idocument& Document)\n{\n\tk3d::plugin::create(k3d::classes::Axes(), Document, \"Axes\");\n\tk3d::iunknown* gl_engine = k3d::plugin::create(k3d::classes::OpenGLEngine(), Document, \"GL Engine\");\n\tk3d::plugin::create(k3d::classes::TimeSource(), Document, \"TimeSource\");\n\t\n\tsetup_camera_document(Document);\n\tsetup_renderman_document(Document);\n\t\n\tk3d::property::set_internal_value(*gl_engine, \"node_selection\", dynamic_cast<k3d::inode*>(setup_selection_document(Document)));\n}\n\n/// Add document nodes that need an opengl context for extension checking\nvoid setup_opengl_document(k3d::idocument& Document)\n{\n\treturn_if_fail(k3d::plugin::factory::lookup(\"OpenGLBicubicPatchPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"OpenGLBilinearPatchPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"OpenGLBlobbyPointPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"OpenGLCubicCurvePainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"OpenGLFaceNormalPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"OpenGLFaceOrientationPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"OpenGLLinearCurvePainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"OpenGLMultiPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"OpenGLNURBSCurvePainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"OpenGLNURBSPatchPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"OpenGLBezierTrianglePatchPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"VirtualOpenGLEdgePainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"VirtualOpenGLFacePainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"VirtualOpenGLPointPainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"VirtualOpenGLSDSEdgePainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"VirtualOpenGLSDSFacePainter\"));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"VirtualOpenGLSDSPointPainter\"));\n\n\tk3d::inode* const multi_painter = k3d::plugin::create<k3d::inode>(\"OpenGLMultiPainter\", Document, \"GL Default Painter\");\n\treturn_if_fail(multi_painter);\n\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"points\", \"Points\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLPointPainter\", Document, \"GL Point Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"edges\", \"Edges\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLEdgePainter\", Document, \"GL Edge Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"faces\", \"Faces\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLFacePainter\", Document, \"GL Face Painter\"));\n\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"sds_points\", \"SDS Points\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLSDSPointPainter\", Document, \"SDS Point Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"sds_edges\", \"SDS Edges\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLSDSEdgePainter\", Document, \"SDS Edge Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"sds_faces\", \"SDS Faces\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLSDSFacePainter\", Document, \"SDS Face Painter\"));\n\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"linear_curves\", \"Linear Curves\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLLinearCurvePainter\", Document, \"GL Linear Curve Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"cubic_curves\", \"Cubic Curves\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLCubicCurvePainter\", Document, \"GL Cubic Curve Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"nurbs_curves\", \"NURBS Curves\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLNURBSCurvePainter\", Document, \"GL NURBS Curve Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"bilinear_patches\", \"Bilinear Patches\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLBilinearPatchPainter\", Document, \"GL Bilinear Patch Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"bicubic_patches\", \"Bicubic Patches\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLBicubicPatchPainter\", Document, \"GL Bicubic Patch Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"nurbs_patches\", \"NURBS Patches\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLNURBSPatchPainter\", Document, \"GL NURBS Patch Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"bezier_triangle_patches\", \"Bezier Triangle Patches\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLBezierTrianglePatchPainter\", Document, \"GL Bezier Triangle Patch Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"blobbies\", \"Blobbies\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLBlobbyPointPainter\", Document, \"GL Blobby Point Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"face_normals\", \"Face Normals\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLFaceNormalPainter\", Document, \"GL Face Normal Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"face_orientation\", \"Face Orientation\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLFaceOrientationPainter\", Document, \"GL Face Orientation Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"cones\", \"Cones\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLConePainter\", Document, \"GL Cone Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"cylinders\", \"Cylinders\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLCylinderPainter\", Document, \"GL Cylinder Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"disks\", \"Disks\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLDiskPainter\", Document, \"GL Disk Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"hyperboloids\", \"Hyperboloids\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLHyperboloidPainter\", Document, \"GL Hyperboloid Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"paraboloids\", \"Paraboloids\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLParaboloidPainter\", Document, \"GL Paraboloid Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"spheres\", \"Spheres\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLSpherePainter\", Document, \"GL Sphere Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"teapots\", \"Teapots\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLTeapotPainter\", Document, \"GL Teapot Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"tori\", \"Tori\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLTorusPainter\", Document, \"GL Torus Painter\"));\n}\n\n} // namespace detail\n\nvoid create_document()\n{\n\tk3d::idocument* const document = k3d::application().create_document();\n\treturn_if_fail(document);\n\n\tconst k3d::ustring new_title = k3d::ustring::from_utf8(k3d::string_cast(boost::format(_(\"Untitled Document %1%\")) % detail::next_document_number()));\n\tk3d::property::set_internal_value(document->title(), new_title);\n\n\tdetail::setup_document(*document);\n\n\tdocument_state* const state = new document_state(*document);\n\tcreate_main_document_window(*state);\n\tk3d::ngui::viewport::control* const focus_viewport = state->get_focus_viewport();\n\tif(focus_viewport)\n\t{\n\t\tfocus_viewport->gl_context().begin();\n\t\tdetail::setup_opengl_document(*document);\n\t\tfocus_viewport->gl_context().end();\n\t}\n\telse\n\t{\n\t\tk3d::log() << debug << \"Failed to initialize OpenGL plugins: no active viewport found\" << std::endl;\n\t}\n}\n\nvoid open_document(const k3d::filesystem::path& Path)\n{\n\tboost::scoped_ptr<k3d::idocument_importer> importer(k3d::plugin::create<k3d::idocument_importer>(k3d::classes::DocumentImporter()));\n\tif(!importer)\n\t{\n\t\terror_message(_(\"Document importer plugin not installed.\"));\n\t\treturn;\n\t}\n\n\tk3d::idocument* const document = k3d::application().create_document();\n\treturn_if_fail(document);\n\n\t// Nag users about the file version ...\n\tk3d::imetadata::metadata_t file_metadata = importer->get_file_metadata(Path);\n\tstd::stringstream version(file_metadata[k3d::metadata::key::version()]);\n\tk3d::uint32_t major_version = 0;\n\tk3d::uint32_t minor_version = 0;\n\tk3d::uint32_t revision = 0;\n\tk3d::uint32_t build = 0;\n\tchar point;\n\tversion >> major_version >> point >> minor_version >> point >> revision >> point >> build;\n\n\tif(major_version == 0 && minor_version < 8)\n\t{\n\t\twarning_message(\n\t\t\t_(\"Documents prior to K-3D 0.8 are unsupported.\"),\n\t\t\t_(\"Due to significant changes to K-3D internals, documents from versions prior to 0.8 are unsupported and may not function correctly.\"));\n\t}\n\n\tif(!importer->read_file(Path, *document))\n\t{\n\t\terror_message(k3d::string_cast(boost::format(_(\"Error reading document %1%\")) % Path.native_filesystem_string()));\n\t\treturn;\n\t}\n\n\tdocument_state* const state = new document_state(*document);\n\tcreate_main_document_window(*state);\n\n\tk3d::property::set_internal_value(document->path(), Path);\n\tk3d::property::set_internal_value(document->title(), Path.leaf());\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/document.h",
    "content": "#ifndef K3DSDK_NGUI_DOCUMENT_H\n#define K3DSDK_NGUI_DOCUMENT_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d { namespace filesystem { class path; } }\nnamespace k3d { class idocument; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\n/// Creates a new document\nvoid create_document();\n/// Opens an existing document\nvoid open_document(const k3d::filesystem::path& Path);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_DOCUMENT_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/document_state.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/**\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <gdkmm/screen.h>\n#include <gtkmm/dialog.h>\n#include <gtkmm/menu.h>\n#include <gtkmm/window.h>\n\n#include <gtk/gtkgl.h>\n#include <gtk/gtkmain.h>\n\n#include <k3d-i18n-config.h>\n#include <k3d-platform-config.h>\n#include <k3dsdk/application.h>\n#include <k3dsdk/batch_mode.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imaterial_sink.h>\n#include <k3dsdk/imesh_selection_sink.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iscripted_action.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/itime_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/ngui/application_state.h>\n#include <k3dsdk/ngui/context_menu.h>\n#include <k3dsdk/ngui/pipeline.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/move_tool.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/ngui/rotate_tool.h>\n#include <k3dsdk/ngui/safe_close_dialog.h>\n#include <k3dsdk/ngui/scale_tool.h>\n#include <k3dsdk/ngui/selection_tool.h>\n#include <k3dsdk/ngui/unsaved_document.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/time_source.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/user_property.h>\n\n#include <iterator>\n#include <functional>\n#include <set>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\n/// Provides human-readable labels for the selection::mode enumeration\nconst k3d::ienumeration_property::enumeration_values_t& selection_mode_values()\n{\n\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Nodes\"), \"nodes\", _(\"Select Nodes\")));\n\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Points\"), \"points\", _(\"Select Points\")));\n\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Lines\"), \"lines\", _(\"Select Lines\")));\n\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Faces\"), \"faces\", _(\"Select Faces\")));\n\t}\n\n\treturn values;\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// document_state::implementation\n\nclass document_state::implementation :\n\tpublic sigc::trackable/*,\n\tpublic k3d::ipersistent*/\n{\npublic:\n\timplementation(k3d::idocument& Document) :\n\t\tm_document(Document),\n\t\tm_gdkgl_share_list(0),\n\t\tm_last_selection_mode(selection::NODE),\n\t\tm_active_tool(0),\n\t\tm_selection_tool(0),\n\t\tm_move_tool(0),\n\t\tm_rotate_tool(0),\n\t\tm_scale_tool(0),\n\t\tm_context_menu(0),\n\t\tm_node_selection(0)\n\t{\n\t\t// Process remove_nodes_signal\n\t\tm_document.nodes().remove_nodes_signal().connect(sigc::mem_fun(*this, &implementation::on_nodes_removed));\n\t}\n\n\t~implementation()\n\t{\n\t\twhile(!m_tools.empty())\n\t\t{\n\t\t\tdelete m_tools.begin()->second;\n\t\t\tm_tools.erase(m_tools.begin());\n\t\t}\n\n\t\tdelete m_context_menu;\n\t\tdelete m_scale_tool;\n\t\tdelete m_rotate_tool;\n\t\tdelete m_move_tool;\n\t\tdelete m_selection_tool;\n\t\t\n\t\tm_node_selection_metadata_connection.disconnect();\n\t\tm_node_selection_deleted_connection.disconnect();\n\t}\n\n\t/// Returns the document\n\tk3d::idocument& document()\n\t{\n\t\treturn m_document;\n\t}\n\n#if defined K3D_API_DARWIN || defined K3D_API_WIN32\n\t/// Returns a \"global\" (to the document) gdkgl context that can be used to share display lists\n  GdkGLContext* gdkgl_share_list()\n  {\n    if(!m_gdkgl_share_list)\n    {\n      GdkGLConfig* const config = gdk_gl_config_new_by_mode(\n        static_cast<GdkGLConfigMode>(GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE | GDK_GL_MODE_DEPTH));\n      return_val_if_fail(config, 0);\n\n      Gtk::Window* const window = new Gtk::Window();\n      gtk_widget_set_gl_capability(GTK_WIDGET(window->gobj()), config, 0, true, GDK_GL_RGBA_TYPE);\n      window->show();\n      window->hide();\n\n      GdkGLContext* const context = gtk_widget_get_gl_context(GTK_WIDGET(window->gobj()));\n      return_val_if_fail(context, 0);\n\n      m_gdkgl_share_list = context;\n    }\n\n    return m_gdkgl_share_list;\n  }\n\n#else // K3D_API_WIN32\n\n\t/// Returns a \"global\" (to the document) gdkgl context that can be used to share display lists\n\tGdkGLContext* gdkgl_share_list()\n\t{\n\t\tif(!m_gdkgl_share_list)\n\t\t{\n\t\t\tGdkGLConfig* const config = gdk_gl_config_new_by_mode(\n\t\t\t\tstatic_cast<GdkGLConfigMode>(GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE | GDK_GL_MODE_DEPTH));\n\t\t\treturn_val_if_fail(config, 0);\n\n      GdkPixmap* const pixmap = gdk_pixmap_new(0, 8, 8, gdk_gl_config_get_depth(config));\n\t\t\treturn_val_if_fail(pixmap, 0);\n\n\t\t\tGdkGLPixmap* const glpixmap = gdk_pixmap_set_gl_capability(pixmap, config, 0);\n\t\t\treturn_val_if_fail(glpixmap, 0);\n\n\t\t\tGdkGLContext* const context = gdk_gl_context_new(\n\t\t\t\tgdk_pixmap_get_gl_drawable(pixmap), 0, true, GDK_GL_RGBA_TYPE);\n\t\t\treturn_val_if_fail(context, 0);\n\n\t\t\tm_gdkgl_share_list = context;\n\t\t}\n\n\t\treturn m_gdkgl_share_list;\n\t}\n\n#endif\n\n\t/// Returns a signal that can be emitted to acknowledge of a document selection change\n\tdocument_selection_change_signal_t& document_selection_change_signal()\n\t{\n\t\treturn m_document_selection_change_signal;\n\t}\n\n\t/// Returns the active tool for the document\n\ttool& active_tool()\n\t{\n\t\treturn *m_active_tool;\n\t}\n\n\t/// Sets the active tool for the document\n\tvoid set_active_tool(tool& ActiveTool)\n\t{\n\t\tm_active_tool->deactivate();\n\t\tm_active_tool = &ActiveTool;\n\t\tm_active_tool->activate();\n\t\tm_active_tool_changed_signal.emit();\n\t}\n\n\t/// Called by the signal system anytime nodes are removed from the document\n\tvoid on_nodes_removed(const k3d::inode_collection::nodes_t& Nodes)\n\t{\nassert_not_implemented();\n/*\n\t\tselection_changed();\n*/\n\t}\n\n/*\n\ttypedef std::set<k3d::legacy::mesh*> meshes_t;\n\ttypedef std::set<k3d::inode*> node_selection_t;\n\n\tvoid on_node_selection_node_changed()\n\t{\n\t\tm_node_selection_metadata_connection.disconnect();\n\t\tm_node_selection_deleted_connection.disconnect();\n\t\tm_node_selection = 0;\n\t}\n\t\n\tk3d::inode_selection* node_selection()\n\t{\n\t\tif(!m_node_selection)\n\t\t{\n\t\t\tk3d::inode_collection::nodes_t nodes = k3d::find_nodes<k3d::inode_selection>(m_document.nodes(), \"ngui:unique_node\", \"node_selection\");\n\t\t\tif(nodes.size() != 1)\n\t\t\t\treturn 0;\n\t\t\tm_node_selection = dynamic_cast<k3d::inode_selection*>(nodes.back());\n\t\t\t// Make sure the node gets updated whenever the metadata is changed or the node is deleted\n\t\t\tk3d::imetadata* metadata = dynamic_cast<k3d::imetadata*>(m_node_selection);\n\t\t\tm_node_selection_metadata_connection = metadata->connect_metadata_changed_signal(sigc::mem_fun(*this, &implementation::on_node_selection_node_changed));\n\t\t\tm_node_selection_deleted_connection = nodes.back()->deleted_signal().connect(sigc::mem_fun(*this, &implementation::on_node_selection_node_changed));\n\t\t}\n\t\treturn m_node_selection;\n\t}\n*/\n\n\tdocument_state::set_cursor_signal_t& set_cursor_signal()\n\t{\n\t\treturn m_set_cursor_signal;\n\t}\n\n\tdocument_state::clear_cursor_signal_t& clear_cursor_signal()\n\t{\n\t\treturn m_clear_cursor_signal;\n\t}\n\n\tvoid popup_context_menu(const bool UserAction)\n\t{\n\t\tif(UserAction)\n\t\t\tm_context_menu->popup(1, gtk_get_current_event_time());\n\t\telse\n\t\t\tm_context_menu->popup(0, GDK_CURRENT_TIME);\n\t}\n\n\t/// Stores a reference to the owning document\n\tk3d::idocument& m_document;\n\tsigc::signal<bool, k3d::signal::cancelable> m_safe_to_close_signal;\n\t/// Stores an unused off-screen pixmap so we can create a global gdkgl context for sharing display lists\n\tGlib::RefPtr<Gdk::Pixmap> m_gdkgl_share_pixmap;\n\t/// Stores a gdkgl context that can be used to share display lists for the entire document\n\tGdkGLContext* m_gdkgl_share_list;\n\t/// A signal that can be emitted to acknowledge of a document selection change\n\tdocument_selection_change_signal_t m_document_selection_change_signal;\n\t/// A signal that will be emitted whenever the active tool changes\n\tsigc::signal<void> m_active_tool_changed_signal;\n\t/// Stores the last document-wide selection mode\n\tselection::mode m_last_selection_mode;\n\n\tdocument_state::set_cursor_signal_t m_set_cursor_signal;\n\tdocument_state::clear_cursor_signal_t m_clear_cursor_signal;\n\n\t/// Store a reference to the current active tool\n\ttool* m_active_tool;\n\n\t/// Store builtin tools (deprecated)\n\tk3d::ngui::selection_tool* m_selection_tool;\n\ttool* m_move_tool;\n\ttool* m_rotate_tool;\n\ttool* m_scale_tool;\n\n\t/// Store plugin tools\n\tstd::map<k3d::string_t, tool*> m_tools;\n\n\t/// Document wide context menu\n\tGtk::Menu* m_context_menu;\n\n\t/// Used to keep documents sorted in the \"safe to close\" dialog\n\tstruct sort_by_title\n\t{\n\t\tbool operator()(const safe_close_dialog::entry& LHS, const safe_close_dialog::entry& RHS)\n\t\t{\n\t\t\treturn LHS.document->unsaved_document_title() < RHS.document->unsaved_document_title();\n\t\t}\n\t};\n\n\ttypedef sigc::signal<unsaved_document*> safe_close_signal_t;\n\t/// Signal that will be emitted prior to safe shutdown to \"gather\" unsaved documents\n\tsafe_close_signal_t m_safe_close_signal;\n\n\t/// Stores auto-start plugins\n\ttypedef std::vector<k3d::iunknown*> auto_start_plugins_t;\n\t/// Stores auto-start plugins\n\tauto_start_plugins_t m_auto_start_plugins;\n\t\n\t/// Cached pointer to the document node selection node\n\tk3d::inode_selection* m_node_selection;\n\tsigc::connection m_node_selection_metadata_connection;\n\tsigc::connection m_node_selection_deleted_connection;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// document_state\n\ndocument_state::document_state(k3d::idocument& Document) :\n\tm_implementation(new implementation(Document)),\n\tm_focus_viewport(0)\n{\n\t// Create auto-start plugins for this document ...\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup();\n\tfor(k3d::plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t{\n\t\tk3d::iplugin_factory::metadata_t metadata = (**factory).metadata();\n\n\t\tif(!metadata.count(\"ngui:document-start\"))\n\t\t\tcontinue;\n\n\t\tk3d::log() << info << \"Creating plugin [\" << (**factory).name() << \"] via ngui:document-start\" << std::endl;\n\n\t\tk3d::iunknown* const plugin = k3d::plugin::create(**factory);\n\t\tif(!plugin)\n\t\t{\n\t\t\tk3d::log() << error << \"Error creating plugin [\" << (**factory).name() << \"] via ngui:document-start\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\t\tm_implementation->m_auto_start_plugins.push_back(plugin);\n\n\t\tif(k3d::iscripted_action* const scripted_action = dynamic_cast<k3d::iscripted_action*>(plugin))\n\t\t{\n\t\t\tk3d::iscript_engine::context context;\n\t\t\tcontext[\"command\"] = k3d::string_t(\"startup\");\n\t\t\tcontext[\"document\"] = &Document;\n\t\t\tscripted_action->execute(context);\n\t\t}\n\t}\n\n\tDocument.close_signal().connect(sigc::mem_fun(*this, &document_state::on_document_close));\n\n\tm_implementation->m_selection_tool = new k3d::ngui::selection_tool(*this, \"selection_tool\");\n\tm_implementation->m_move_tool = new k3d::ngui::move_tool(*this, \"move_tool\");\n\tm_implementation->m_rotate_tool = new k3d::ngui::rotate_tool(*this, \"rotate_tool\");\n\tm_implementation->m_scale_tool = new k3d::ngui::scale_tool(*this, \"scale_tool\");\n\n\tm_implementation->m_active_tool = m_implementation->m_selection_tool;\n\tm_implementation->m_active_tool->activate();\n\n\tm_implementation->m_context_menu =\n\t\tcreate_context_menu(*this);\n}\n\ndocument_state::~document_state()\n{\n\t// Shut-down any auto-start plugins associated with this document ...\n\tfor(implementation::auto_start_plugins_t::iterator plugin = m_implementation->m_auto_start_plugins.begin(); plugin != m_implementation->m_auto_start_plugins.end(); ++plugin)\n\t{\n\t\tif(k3d::iscripted_action* const scripted_action = dynamic_cast<k3d::iscripted_action*>(*plugin))\n\t\t{\n\t\t\tk3d::iscript_engine::context context;\n\t\t\tcontext[\"command\"] = k3d::string_t(\"shutdown\");\n\t\t\tcontext[\"document\"] = &document();\n\t\t\tscripted_action->execute(context);\n\t\t}\n\t}\n\n\tdelete m_implementation;\n}\n\nvoid document_state::on_document_close()\n{\n\tdelete this;\n}\n\nk3d::idocument& document_state::document()\n{\n\treturn m_implementation->document();\n}\n\nsigc::connection document_state::connect_safe_close_signal(const sigc::slot<unsaved_document*>& Slot)\n{\n\treturn m_implementation->m_safe_close_signal.connect(Slot);\n}\n\nbool document_state::safe_close(Gtk::Window& Parent)\n{\n\tif(k3d::batch_mode())\n\t{\n\t\tk3d::application().close_document(document());\n\t\treturn true;\n\t}\n\n\tsafe_close_dialog::entries_t entries;\n\n\timplementation::safe_close_signal_t::slot_list_type slots = m_implementation->m_safe_close_signal.slots();\n\tfor(implementation::safe_close_signal_t::slot_list_type::iterator slot = slots.begin(); slot != slots.end(); ++slot)\n\t{\n\t\tunsaved_document* doc = (*slot)();\n\t\tif(doc && doc->unsaved_changes())\n\t\t\tentries.push_back(safe_close_dialog::entry(doc));\n\t}\n\n\tif(!entries.empty())\n\t{\n\t\tswitch(safe_close_dialog::run(Parent, entries))\n\t\t{\n\t\t\tcase Gtk::RESPONSE_NONE:\n\t\t\tcase Gtk::RESPONSE_CANCEL:\n\t\t\tcase Gtk::RESPONSE_DELETE_EVENT:\n\t\t\t\treturn false;\n\t\t\tcase Gtk::RESPONSE_CLOSE:\n\t\t\t\tk3d::application().close_document(document());\n\t\t\t\treturn true;\n\t\t\tcase Gtk::RESPONSE_OK:\n\t\t\t\tfor(safe_close_dialog::entries_t::const_iterator entry = entries.begin(); entry != entries.end(); ++entry)\n\t\t\t\t{\n\t\t\t\t\tif(entry->save)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!entry->document->save_unsaved_changes())\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tk3d::application().close_document(document());\n\t\t\t\treturn true;\n\t\t}\n\t}\n\n\tk3d::application().close_document(document());\n\treturn true;\n}\n\nGdkGLContext* document_state::gdkgl_share_list()\n{\n\treturn m_implementation->gdkgl_share_list();\n}\n\ndocument_state::document_selection_change_signal_t& document_state::document_selection_change_signal()\n{\n\treturn m_implementation->document_selection_change_signal();\n}\n\ntool& document_state::active_tool()\n{\n\treturn m_implementation->active_tool();\n}\n\nvoid document_state::set_active_tool(tool& ActiveTool)\n{\n\tm_implementation->set_active_tool(ActiveTool);\n}\n\nsigc::connection document_state::connect_active_tool_changed_signal(const sigc::slot<void>& Slot)\n{\n\treturn m_implementation->m_active_tool_changed_signal.connect(Slot);\n}\n\ntool* document_state::get_tool(const k3d::string_t& Name)\n{\n\tif(!m_implementation->m_tools.count(Name))\n\t{\n\t\ttool* const new_tool = k3d::plugin::create<tool>(Name);\n\t\treturn_val_if_fail(new_tool, new_tool);\n\n\t\tnew_tool->initialize(*this);\n\n\t\tm_implementation->m_tools.insert(std::make_pair(Name, new_tool));\n\n\t\treturn new_tool;\n\t}\n\n\treturn m_implementation->m_tools[Name];\n}\n\ntool& document_state::selection_tool()\n{\n\treturn *m_implementation->m_selection_tool;\n}\n\ntool& document_state::move_tool()\n{\n\treturn *m_implementation->m_move_tool;\n}\n\ntool& document_state::rotate_tool()\n{\n\treturn *m_implementation->m_rotate_tool;\n}\n\ntool& document_state::scale_tool()\n{\n\treturn *m_implementation->m_scale_tool;\n}\n\nbool document_state::pick_backfacing()\n{\n\treturn m_implementation->m_selection_tool->pick_backfacing();\n}\n\nbool document_state::paint_backfacing()\n{\n\treturn m_implementation->m_selection_tool->paint_backfacing();\n}\n\nbool document_state::rubber_band_backfacing()\n{\n\treturn m_implementation->m_selection_tool->rubber_band_backfacing();\n}\n\ndocument_state::set_cursor_signal_t& document_state::set_cursor_signal()\n{\n\treturn m_implementation->set_cursor_signal();\n}\n\ndocument_state::clear_cursor_signal_t& document_state::clear_cursor_signal()\n{\n\treturn m_implementation->clear_cursor_signal();\n}\n\nvoid document_state::popup_context_menu(const bool UserAction)\n{\n\tm_implementation->popup_context_menu(UserAction);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/document_state.h",
    "content": "#ifndef K3DSDK_NGUI_DOCUMENT_STATE_H\n#define K3DSDK_NGUI_DOCUMENT_STATE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/selection.h>\n\n#include <glibmm/refptr.h>\n#include <glibmm/ustring.h>\n\n#include <gdk/gdkglcontext.h>\n\nnamespace Gdk { class Pixbuf; }\nnamespace Gtk { class Window; }\nnamespace k3d { class ianimation_render_engine; }\nnamespace k3d { class idocument; }\nnamespace k3d { class inode; }\nnamespace k3d { class ipreview_render_engine; }\nnamespace k3d { class istill_render_engine; }\nnamespace k3d { namespace ngui { class unsaved_document; } }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass tool;\nnamespace viewport { class control; }\n\n/// This ugly little fellow stores document-wide user interface state in one place to minimize coupling between the various per-document UI components\nclass document_state :\n\tpublic sigc::trackable\n{\npublic:\n\tdocument_state(k3d::idocument& Document);\n\t~document_state();\n\n\t/// Stores a reference to the owning document\n\tk3d::idocument& document();\n\n\t/// Connects a slot to a signal that will be called prior to safe shutdown.\n\tsigc::connection connect_safe_close_signal(const sigc::slot<unsaved_document*>& Slot);\n\t/// Attempts to safely close the application, saving unsaved documents and giving the user a chance to cancel.  Returns true iff the application will close.\n\tbool safe_close(Gtk::Window& Parent);\n\n\t/// Returns a gdkgl context node that can be used to share display lists between viewports\n\tGdkGLContext* gdkgl_share_list();\n\n\t/// Defines a signal that can be emitted to acknowledge of a document selection change\n\ttypedef sigc::signal<void> document_selection_change_signal_t;\n\t/// Returns a signal that can be emitted to acknowledge of a document selection change\n\tdocument_selection_change_signal_t& document_selection_change_signal();\n\n\t/// Returns the active tool for the document\n\ttool& active_tool();\n\t/// Sets the active tool for the document\n\tvoid set_active_tool(tool& ActiveTool);\n\t/// Connects a slot to a signal that will be emitted when the active tool changes\n\tsigc::connection connect_active_tool_changed_signal(const sigc::slot<void>& Slot);\n\n\t/// Returns an instance of a tool plugin by name (could return NULL).\n\ttool* get_tool(const k3d::string_t& Name);\n\n\t/// Returns a reference to the builtin Selection Tool that can be passed to set_active_tool()\n\ttool& selection_tool();\n\t/// Returns a reference to the builtin Move Tool that can be passed to set_active_tool()\n\ttool& move_tool();\n\t/// Returns a reference to the builtin Rotate Tool that can be passed to set_active_tool()\n\ttool& rotate_tool();\n\t/// Returns a reference to the builtin Scale Tool that can be passed to set_active_tool()\n\ttool& scale_tool();\n\n\t/// True if backfacing components are to be picked\n\tbool pick_backfacing();\n\t\n\t/// True if backfacing components are to be paint-selected\n\tbool paint_backfacing();\n\t\n\t/// True if backfacing components are to be rubber-band selected\n\tbool rubber_band_backfacing();\n\n\t/// Defines a signal to set the document-wide cursor\n\ttypedef sigc::signal<void, const Glib::RefPtr<Gdk::Pixbuf> > set_cursor_signal_t;\n\t/// Returns a signal for setting the document-wide cursor\n\tset_cursor_signal_t& set_cursor_signal();\n\t/// Defines a signal to reset the document-wide cursor\n\ttypedef sigc::signal<void> clear_cursor_signal_t;\n\t/// Returns a signal for setting the document-wide cursor\n\tclear_cursor_signal_t& clear_cursor_signal();\n\n\t/// Returns focused viewport\n\tviewport::control* get_focus_viewport() { return m_focus_viewport; }\n\t/// Sets focused viewport\n\tvoid set_focus_viewport(viewport::control* Viewport) { m_focus_viewport = Viewport; }\n\n\t/// Shows context menu, pass false in interactive mode\n\tvoid popup_context_menu(const bool UserAction = true);\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n\n\tvoid on_document_close();\n\n\t/// Stores focused viewport\n\tviewport::control* m_focus_viewport;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_DOCUMENT_STATE_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/document_window.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/document_window.h>\n#include <k3dsdk/ngui/document_state.h>\n\n#include <gdk/gdkkeysyms.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// document_window\n\ndocument_window::document_window(document_state& Document) :\n\tbase(Gtk::WINDOW_TOPLEVEL),\n\tm_document(Document)\n{\n\tDocument.document().close_signal().connect(sigc::mem_fun(*this, &document_window::close));\n}\n\nk3d::idocument& document_window::document()\n{\n\treturn m_document.document();\n}\n\nbool document_window::on_key_press_event(GdkEventKey* event)\n{\n\tif(event->keyval == GDK_Escape)\n\t{\n\t\tclose();\n\t\treturn true;\n\t}\n\n\treturn base::on_key_press_event(event);\n}\n\nbool document_window::on_delete_event(GdkEventAny* event)\n{\n\tclose();\n\treturn true;\n}\n\nvoid document_window::close()\n{\n\ton_close();\n\tdelete this;\n}\n\nvoid document_window::on_close()\n{\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/document_window.h",
    "content": "#ifndef K3DSDK_NGUI_DOCUMENT_WINDOW_H\n#define K3DSDK_NGUI_DOCUMENT_WINDOW_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/window.h>\n\nnamespace k3d { class idocument; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\t\n///////////////////////////////////////////////////////////////////////////////\n// document_window\n\n/// Provides a standard document-level window\nclass document_window :\n        public Gtk::Window\n{\n\ttypedef Gtk::Window base;\n\npublic:\n\tdocument_window(document_state& Document);\n\t~document_window() {}\n\n\tk3d::idocument& document();\n\n\tbool on_key_press_event(GdkEventKey* event);\n\tbool on_delete_event(GdkEventAny* event);\n\n\t/// Closes the window\n\tvoid close();\n\nprivate:\n\t/// Override in derived classes to handle cleanup when the window is closed\n\tvirtual void on_close();\n\t/// Stores the owning document\n\tdocument_state& m_document;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_DOCUMENT_WINDOW_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/entry.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/entry.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/string_cast.h>\n\n#include <gtkmm/window.h>\n\n#include <boost/format.hpp>\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace entry\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// property_model\n\n/// Implementation of entry::imodel for use with k3d::iproperty objects\nclass property_model :\n\tpublic imodel\n{\npublic:\n\tproperty_model(k3d::iproperty& Data) :\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data))\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\tGlib::ustring result = m_readable_data.property_label();\n\n\t\tif(m_readable_data.property_node())\n\t\t\tresult = m_readable_data.property_node()->name() + \" \" + result;\n\n\t\treturn result;\n\t}\n\n\tconst k3d::string_t value()\n\t{\n\t\tconst std::type_info& type = m_readable_data.property_type();\n\n\t\tif(type == typeid(k3d::string_t))\n\t\t\treturn boost::any_cast<k3d::string_t>(m_readable_data.property_internal_value());\n\t\tk3d::log() << error << k3d_file_reference << \": unknown property type: \" << type.name() << std::endl;\n\t\treturn k3d::string_t();\n\t}\n\n\tvoid set_value(const k3d::string_t& Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\n\t\tconst std::type_info& type = m_readable_data.property_type();\n\n\t\tif(type == typeid(k3d::string_t))\n\t\t\tm_writable_data->property_set_value(Value);\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown property type: \" << type.name() << std::endl;\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_readable_data.property_changed_signal().connect(sigc::hide(Slot));\n\t}\n\nprivate:\n\tproperty_model(const property_model& RHS);\n\tproperty_model& operator=(const property_model& RHS);\n\n\tk3d::iproperty& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// model\n\nimodel* const model(k3d::iproperty& Property)\n{\n\treturn new property_model(Property);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control::implementation\n\nclass control::implementation\n{\npublic:\n\timplementation(imodel* const Model, k3d::istate_recorder* const StateRecorder) :\n\t\tm_model(Model),\n\t\tm_state_recorder(StateRecorder)\n\t{\n\t\tassert(m_model.get());\n\t}\n\n\t/// Stores a reference to the underlying data object\n\tconst boost::scoped_ptr<imodel> m_model;\n\t/// Stores a reference to the (optional) object for recording undo/redo data\n\tk3d::istate_recorder* const m_state_recorder;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(imodel* const Model, k3d::istate_recorder* const StateRecorder) :\n\tm_implementation(new implementation(Model, StateRecorder))\n{\n\tset_name(\"k3d-entry\");\n\n\t// Synchronize the view with the data source ...\n\ton_data_changed();\n\n\t// We want to be notified if the data source changes ...\n\tm_implementation->m_model->connect_changed_signal(sigc::mem_fun(*this, &control::on_data_changed));\n}\n\ncontrol::~control()\n{\n\tdelete m_implementation;\n}\n\nbool control::on_focus_out_event(GdkEventFocus* Event)\n{\n\ton_set_value();\n\treturn base::on_focus_out_event(Event);\n}\n\nvoid control::on_activate()\n{\n\ton_set_value();\n\tbase::on_activate();\n}\n\nvoid control::on_set_value()\n{\n\t// If the value didn't change, we're done ...\n\tconst k3d::string_t new_value = get_text();\n\tif(new_value == m_implementation->m_model->value())\n\t\treturn;\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_implementation->m_state_recorder)\n\t\tm_implementation->m_state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t// Update everything with the new value ...\n\tm_implementation->m_model->set_value(new_value);\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_implementation->m_state_recorder)\n\t\tm_implementation->m_state_recorder->commit_change_set(m_implementation->m_state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), change_message(m_implementation->m_model->value()), K3D_CHANGE_SET_CONTEXT);\n}\n\nvoid control::on_data_changed()\n{\n\tset_text(m_implementation->m_model->value());\n}\n\nconst k3d::string_t control::change_message(const k3d::string_t& Value)\n{\n\treturn k3d::string_cast(boost::format(_(\"Change %1% to %2%\")) % m_implementation->m_model->label().raw() % Value);\n}\n\n} // namespace entry\n\n} // namespace ngui\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/entry.h",
    "content": "#ifndef K3DSDK_NGUI_ENTRY_H\n#define K3DSDK_NGUI_ENTRY_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/hotkey_entry.h>\n\n#include <k3dsdk/types.h>\n\nnamespace k3d { class iproperty; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace entry\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// imodel\n\n/// Abstract data model for an entry::control\nclass imodel\n{\npublic:\n\tvirtual ~imodel() {}\n\n\t/// Returns a human-readable label for the underlying data\n\tvirtual const Glib::ustring label() = 0;\n\t/// Called to return the underlying data value\n\tvirtual const k3d::string_t value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const k3d::string_t& Value) = 0;\n\t/// Connects a slot to a signal that will be emitted if the underlying data changes\n\tvirtual sigc::connection connect_changed_signal(const sigc::slot<void>& Slot) = 0;\n\nprotected:\n\timodel() {}\n\nprivate:\n\timodel(const imodel&);\n\timodel& operator=(const imodel&);\n};\n\n/// Factory method for creating an imodel object given a suitably-typed property\nimodel* const model(k3d::iproperty& Property);\n\n/// Provides an implementation of entry::imodel that can \"wrap\" any data source that supports the internal_value(), set_value(), and changed_signal() concepts\ntemplate<typename data_t>\nclass generic_model_t :\n\tpublic imodel\n{\npublic:\n\tgeneric_model_t(data_t& Data, const Glib::ustring& Label) :\n\t\tm_data(Data),\n\t\tm_label(Label)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst k3d::string_t value()\n\t{\n\t\treturn m_data.internal_value();\n\t}\n\n\tvoid set_value(const k3d::string_t& Value)\n\t{\n\t\tm_data.set_value(Value);\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_data.changed_signal().connect(sigc::hide(Slot));\n\t}\n\nprivate:\n\tdata_t& m_data;\n\tconst Glib::ustring m_label;\n};\n\n/// Convenience factory function for creating generic_model_t objects\ntemplate<typename data_t>\nimodel* model(data_t& Data, const Glib::ustring& Label = \"\")\n{\n\treturn new generic_model_t<data_t>(Data, Label);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a standard UI control for manipulating text fields (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic hotkey_entry\n{\n\ttypedef hotkey_entry base;\n\npublic:\n\tcontrol(imodel* const Model, k3d::istate_recorder* const StateRecorder);\n\t~control();\n\nprivate:\n\t/// Called when the control loses the keyboard focus\n\tbool on_focus_out_event(GdkEventFocus* Event);\n\t/// Called when the control is activated\n\tvoid on_activate();\n\t/// Called when the user finishes editing data\n\tvoid on_set_value();\n\t/// Called whenever the underlying data changes\n\tvoid on_data_changed();\n\n\tconst k3d::string_t change_message(const k3d::string_t& Value);\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace entry\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_ENTRY_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/enumeration_chooser.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the k3d::enumeration_chooser classes, which provide a model-view-controller UI for enumerated (fixed set of choices) types\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/enumeration_chooser.h>\n#include <k3dsdk/ngui/options.h>\n#include <k3dsdk/ngui/utility.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <gtkmm/entry.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace enumeration_chooser\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// property_model\n\n/// Implementation of enumeration_chooser::imodel for use with k3d::iproperty objects\nclass property_model :\n\tpublic imodel\n{\npublic:\n\tproperty_model(k3d::iproperty& Data) :\n\t\tm_readable_data(Data),\n\t\tm_enumeration_data(dynamic_cast<k3d::ienumeration_property*>(&Data)),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data))\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\tGlib::ustring result = m_readable_data.property_label();\n\n\t\tif(m_readable_data.property_node())\n\t\t\tresult = m_readable_data.property_node()->name() + \" \" + result;\n\n\t\treturn result;\n\t}\n\n\tconst k3d::ienumeration_property::enumeration_values_t enumeration_values()\n\t{\n\t\treturn_val_if_fail(m_enumeration_data, k3d::ienumeration_property::enumeration_values_t());\n\t\treturn m_enumeration_data->enumeration_values();\n\t}\n\n\tconst k3d::string_t value()\n\t{\n\t\treturn boost::any_cast<k3d::string_t>(m_readable_data.property_internal_value());\n\t}\n\n\tvoid set_value(const k3d::string_t& Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\t\treturn_if_fail(m_writable_data->property_set_value(Value));\n\t}\n\n\tsigc::connection connect_changed(const sigc::slot<void, k3d::iunknown*>& Slot)\n\t{\n\t\treturn m_readable_data.property_changed_signal().connect(Slot);\n\t}\n\n\tsigc::connection connect_enumeration_values_changed(const sigc::slot<void>& Slot)\n\t{\n\t\treturn_val_if_fail(m_enumeration_data, sigc::connection());\n\t\treturn m_enumeration_data->connect_enumeration_values_changed(Slot);\n\t}\n\nprivate:\n\tproperty_model(const property_model&);\n\tproperty_model& operator=(const property_model&);\n\n\tk3d::iproperty& m_readable_data;\n\tk3d::ienumeration_property* const m_enumeration_data;\n\tk3d::iwritable_property* const m_writable_data;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// model\n\nimodel* const model(k3d::iproperty& Property)\n{\n\treturn new property_model(Property);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control::implementation\n\nclass control::implementation\n{\npublic:\n\timplementation(imodel* const Model, k3d::istate_recorder* const StateRecorder) :\n\t\tm_model(Model),\n\t\tm_state_recorder(StateRecorder)\n\t{\n\t\tassert(m_model.get());\n\n\t\tm_list_model = Gtk::ListStore::create(m_columns);\n\t}\n\n\t/// Stores the underlying data object\n\tboost::scoped_ptr<imodel> m_model;\n\t/// Stores a referenence to the (optional) object for recording undo/redo data\n\tk3d::istate_recorder* const m_state_recorder;\n\n\t/// Defines a data model for the underlying combo box widget\n\tclass columns :\n\t\tpublic Gtk::TreeModelColumnRecord\n\t{\n\tpublic:\n\t\tcolumns()\n\t\t{\n\t\t\tadd(label);\n\t\t\tadd(value);\n\t\t\tadd(description);\n\t\t}\n\n\t\tGtk::TreeModelColumn<Glib::ustring> label;\n\t\tGtk::TreeModelColumn<k3d::string_t> value;\n\t\tGtk::TreeModelColumn<Glib::ustring> description;\n\t};\n\n\t/// Defines a data model for the underlying combo box widget\n\tcolumns m_columns;\n\t/// Stores data for the underlying combo box widget\n\tGlib::RefPtr<Gtk::ListStore> m_list_model;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(imodel* const Model, k3d::istate_recorder* const StateRecorder) :\n\tm_implementation(new implementation(Model, StateRecorder))\n{\n\tif(Model)\n\t{\n\t\tModel->connect_changed(sigc::mem_fun(*this, &control::on_data_changed));\n\t\tModel->connect_enumeration_values_changed(sigc::mem_fun(*this, &control::on_enumeration_values_changed));\n\t}\n\n\tset_model(m_implementation->m_list_model);\n\n\tGtk::CellRendererText* const cell_renderer = new Gtk::CellRendererText();\n\tpack_start(*manage(cell_renderer), true);\n\tadd_attribute(cell_renderer->property_text(), m_implementation->m_columns.label);\n\n\ton_enumeration_values_changed();\n\ton_data_changed(0);\n\n\tsignal_changed().connect(sigc::mem_fun(*this, &control::on_list_changed));\n}\n\ncontrol::~control()\n{\n\tdelete m_implementation;\n}\n\nvoid control::on_data_changed(k3d::iunknown*)\n{\n\treturn_if_fail(m_implementation->m_model.get());\n\n\tconst k3d::string_t value = m_implementation->m_model->value();\n\n\tconst Gtk::TreeNodeChildren children = m_implementation->m_list_model->children();\n\tfor(Gtk::TreeNodeChildren::const_iterator child = children.begin(); child != children.end(); ++child)\n\t{\n\t\tconst k3d::string_t child_value = (*child)[m_implementation->m_columns.value];\n\n\t\tif(value == child_value)\n\t\t{\n\t\t\tset_active(child);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tk3d::log() << error << \"Current enumeration value [\" << value << \"] does not match any allowed values\" << std::endl;\n}\n\nvoid control::on_enumeration_values_changed()\n{\n\treturn_if_fail(m_implementation->m_model.get());\n\n\tm_implementation->m_list_model->clear();\n\n\tconst k3d::ienumeration_property::enumeration_values_t values = m_implementation->m_model->enumeration_values();\n\tfor(k3d::ienumeration_property::enumeration_values_t::const_iterator choice = values.begin(); choice != values.end(); ++choice)\n\t{\n\t\tGtk::TreeRow row = *m_implementation->m_list_model->append();\n\t\trow[m_implementation->m_columns.label] = choice->label;\n\t\trow[m_implementation->m_columns.value] = choice->value;\n\t\trow[m_implementation->m_columns.description] = choice->description;\n\t}\n\n\tset_active(0);\n}\n\nvoid control::on_list_changed()\n{\n\tGtk::TreeIter active = get_active();\n\treturn_if_fail(active != m_implementation->m_list_model->children().end());\n\n\tGtk::TreeRow row = *active;\n\tconst k3d::string_t value = row[m_implementation->m_columns.value];\n\n\treturn_if_fail(m_implementation->m_model.get());\n\n\tif(value == m_implementation->m_model->value())\n\t\treturn;\n\n\tif(m_implementation->m_state_recorder)\n\t\tm_implementation->m_state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\tm_implementation->m_model->set_value(value);\n\n\tif(m_implementation->m_state_recorder)\n\t{\n\t\tconst k3d::string_t change_message = k3d::string_cast(boost::format(_(\"Change %1% to %2%\")) % m_implementation->m_model->label().raw() % value);\n\t\tm_implementation->m_state_recorder->commit_change_set(m_implementation->m_state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), change_message, K3D_CHANGE_SET_CONTEXT);\n\t}\n}\n\n} // namespace enumeration_chooser\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/enumeration_chooser.h",
    "content": "#ifndef K3DSDK_NGUI_ENUMERATION_CHOOSER_H\n#define K3DSDK_NGUI_ENUMERATION_CHOOSER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ienumeration_property.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/string_cast.h>\n\n#include <gtkmm/combobox.h>\n#include <gtkmm/liststore.h>\n\nnamespace k3d { class iproperty; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace enumeration_chooser\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// imodel\n\n/// Abstract data model for an enumeration_chooser::control\nclass imodel\n{\npublic:\n\tvirtual ~imodel() {}\n\n\t/// Returns a human-readible label for the underlying data\n\tvirtual const Glib::ustring label() = 0;\n\t/// Returns the set of allowed values\n\tvirtual const k3d::ienumeration_property::enumeration_values_t enumeration_values() = 0;\n\t/// Called to return the underlying data value\n\tvirtual const k3d::string_t value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const k3d::string_t& Value) = 0;\n\t/// Makes a connection to a signal that will be emitted if the underlying data changes\n\tvirtual sigc::connection connect_changed(const sigc::slot<void, k3d::iunknown*>& Slot) = 0;\n\t/// Makes a connection to a signal that will be emitted if the set of allowed values changes\n\tvirtual sigc::connection connect_enumeration_values_changed(const sigc::slot<void>& Slot) = 0;\n\nprotected:\n\timodel() {}\n\nprivate:\n\timodel(const imodel&);\n\timodel& operator=(const imodel&);\n};\n\n/// Factory method for creating an imodel instance given a suitably-typed property (could return NULL)\nimodel* const model(k3d::iproperty& Property);\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for manipulating enumerated quantities (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::ComboBox\n{\n\ttypedef Gtk::ComboBox base;\n\npublic:\n\tcontrol(imodel* const Model, k3d::istate_recorder* const StateRecorder = 0);\n\t~control();\n\nprivate:\n\t/// Called whenever the underlying data changes\n\tvoid on_data_changed(k3d::iunknown*);\n\t/// Called whenever the set of allowable values changes\n\tvoid on_enumeration_values_changed();\n\t/// Called when the user picks an existing value using the dropdown list\n\tvoid on_list_changed();\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace enumeration_chooser\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_ENUMERATION_CHOOSER_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/event_button.h",
    "content": "#ifndef K3DSDK_NGUI_EVENT_BUTTON_H\n#define K3DSDK_NGUI_EVENT_BUTTON_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <gtkmm/button.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/// Defines a push-button that can handle any button event, not just LMB-click\nclass event_button :\n\tpublic Gtk::Button\n{\n\ttypedef Gtk::Button base;\n\npublic:\n\tevent_button()\n\t{\n\t}\n\nprivate:\n\tbool on_button_press_event(GdkEventButton* Event)\n\t{\n\t\tbase::on_button_press_event(Event);\n\t\treturn false;\n\t}\n\n\tbool on_button_release_event(GdkEventButton* Event)\n\t{\n\t\tbase::on_button_release_event(Event);\n\t\treturn false;\n\t}\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_EVENT_BUTTON_H\n"
  },
  {
    "path": "k3dsdk/ngui/file_chooser_dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/ngui/messages.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/system.h>\n\n#include <boost/format.hpp>\n\n#include <gtkmm/checkbutton.h>\n#include <gtkmm/filechooserdialog.h>\n#include <gtkmm/image.h>\n#include <gtkmm/messagedialog.h>\n#include <gtkmm/stock.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// file_chooser_dialog\n\nfile_chooser_dialog::file_chooser_dialog(const Glib::ustring& Title, const std::string& PathType, Gtk::FileChooserAction Action, const k3d::filesystem::path& InitialPath) :\n\tbase(Title, Action),\n\tpath_type(PathType),\n\tinitial_path(InitialPath),\n\tcompression(false),\n\textra_widget_container(new Gtk::VBox(false, 0))\n{\n\tbase::set_extra_widget(*extra_widget_container);\n\n\tset_select_multiple(false);\n\tset_local_only();\n}\n\nfile_chooser_dialog::file_chooser_dialog(const Glib::ustring& Title, const std::string& PathType, k3d::ipath_property::mode_t Action, const k3d::filesystem::path& InitialPath) :\n\tbase(Title),\n\tpath_type(PathType),\n\tinitial_path(InitialPath),\n\tcompression(false),\n\textra_widget_container(new Gtk::VBox(false, 0))\n{\n\tbase::set_extra_widget(*extra_widget_container);\n\n\tset_select_multiple(false);\n\tset_local_only();\n\n\tswitch(Action)\n\t{\n\t\tcase k3d::ipath_property::READ:\n\t\t\tset_action(Gtk::FILE_CHOOSER_ACTION_OPEN);\n\t\t\tbreak;\n\t\tcase k3d::ipath_property::WRITE:\n\t\t\tset_action(Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\t\tbreak;\n\t}\n}\n\nfile_chooser_dialog::file_chooser_dialog(Gtk::Window& Parent, const Glib::ustring& Title, const std::string& PathType, Gtk::FileChooserAction Action, const k3d::filesystem::path& InitialPath) :\n\tbase(Parent, Title, Action),\n\tpath_type(PathType),\n\tinitial_path(InitialPath),\n\tcompression(false),\n\textra_widget_container(new Gtk::VBox(false, 0))\n{\n\tbase::set_extra_widget(*extra_widget_container);\n\n\tset_select_multiple(false);\n\tset_local_only();\n}\n\nfile_chooser_dialog::file_chooser_dialog(Gtk::Window& Parent, const Glib::ustring& Title, const std::string& PathType, k3d::ipath_property::mode_t Action, const k3d::filesystem::path& InitialPath) :\n\tbase(Parent, Title),\n\tpath_type(PathType),\n\tinitial_path(InitialPath),\n\tcompression(false),\n\textra_widget_container(new Gtk::VBox(false, 0))\n{\n\tbase::set_extra_widget(*extra_widget_container);\n\n\tset_select_multiple(false);\n\tset_local_only();\n\n\tswitch(Action)\n\t{\n\t\tcase k3d::ipath_property::READ:\n\t\t\tset_action(Gtk::FILE_CHOOSER_ACTION_OPEN);\n\t\t\tbreak;\n\t\tcase k3d::ipath_property::WRITE:\n\t\t\tset_action(Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\t\tbreak;\n\t}\n}\n\nfile_chooser_dialog::~file_chooser_dialog()\n{\n\tdelete extra_widget_container;\n}\n\nvoid file_chooser_dialog::add_pattern_filter(const Glib::ustring& Name, const Glib::ustring& Pattern)\n{\n\tGtk::FileFilter filter;\n\tfilter.set_name(Name);\n\tfilter.add_pattern(Pattern);\n\tadd_filter(filter);\n}\n\nvoid file_chooser_dialog::add_mime_type_filter(const Glib::ustring& Name, const Glib::ustring& MimeType)\n{\n\tGtk::FileFilter filter;\n\tfilter.set_name(Name);\n\tfilter.add_mime_type(MimeType);\n\tadd_filter(filter);\n}\n\nvoid file_chooser_dialog::add_all_files_filter()\n{\n\tGtk::FileFilter filter;\n\tfilter.set_name(_(\"All Files\"));\n\tfilter.add_pattern(\"*\");\n\tadd_filter(filter);\n}\n\nvoid file_chooser_dialog::enable_compression(const bool Compression)\n{\n\tcompression = Compression;\n}\n\nvoid file_chooser_dialog::append_extension(const std::string& Extension)\n{\n\textension = Extension;\n}\n\nvoid file_chooser_dialog::add_extra_widget(Gtk::Widget& ExtraWidget)\n{\n\textra_widget_container->pack_start(ExtraWidget, Gtk::PACK_SHRINK, 0);\n}\n\nbool file_chooser_dialog::get_file_path(k3d::filesystem::path& Result)\n{\n\tbool compressed = false;\n\treturn get_file_path(Result, compressed);\n}\n\nbool file_chooser_dialog::get_file_path(k3d::filesystem::path& Result, bool& Compressed)\n{\n\t// Create buttons that will be (optionally) added to the dialog.  We do this on the stack\n\t// so the same buttons don't get added to the widget multiple times if get_file_path() is\n\t// called more-than-once.\n\n\tGtk::CheckButton compression_widget(_(\"Compress output file\"));\n\tcompression_widget.set_active(Compressed);\n\n\tGtk::CheckButton append_extension_widget(_(\"Append filename extension automatically\"));\n\tappend_extension_widget.set_active(true);\n\n\tGtk::Button cancel_widget(Gtk::Stock::CANCEL);\n\tcancel_widget.set_flags(cancel_widget.get_flags() | Gtk::CAN_DEFAULT);\n\tcancel_widget.show();\n\n\tGtk::Button open_widget(Gtk::Stock::OPEN);\n\topen_widget.set_flags(open_widget.get_flags() | Gtk::CAN_DEFAULT);\n\topen_widget.show();\n\n\tGtk::Button save_widget(Gtk::Stock::SAVE);\n\tsave_widget.set_flags(save_widget.get_flags() | Gtk::CAN_DEFAULT);\n\tsave_widget.show();\n\n\t// Add the K-3D share path as a shortcut ...\n\tadd_shortcut_folder(k3d::share_path().native_utf8_string().raw());\n\n\tadd_action_widget(cancel_widget, Gtk::RESPONSE_CANCEL);\n\tswitch(Gtk::FileChooser::get_action())\n\t{\n\t\tcase Gtk::FILE_CHOOSER_ACTION_OPEN:\n\t\tcase Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER:\n\t\t\tadd_action_widget(open_widget, Gtk::RESPONSE_OK);\n\t\t\tset_default_response(Gtk::RESPONSE_OK);\n\t\t\tbreak;\n\t\tcase Gtk::FILE_CHOOSER_ACTION_SAVE:\n\t\t\t// Setup the (optional) automatic extension control ...\n\t\t\tif(!extension.empty())\n\t\t\t\textra_widget_container->pack_end(append_extension_widget, Gtk::PACK_SHRINK, 0);\n\n\t\t\t// Setup the (optional) compression control ...\n\t\t\tif(compression)\n\t\t\t\textra_widget_container->pack_end(compression_widget, Gtk::PACK_SHRINK, 0);\n\n\t\t\tadd_action_widget(save_widget, Gtk::RESPONSE_OK);\n\t\t\tset_default_response(Gtk::RESPONSE_OK);\n\t\t\tbreak;\n\t\tcase Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER:\n\t\t\tadd_action_widget(save_widget, Gtk::RESPONSE_OK);\n\t\t\tset_default_response(Gtk::RESPONSE_OK);\n\t\t\tbreak;\n\t}\n\n\t// Setup the initial path to display ...\n\tk3d::filesystem::path start_path = initial_path;\n\tif(start_path.empty())\n\t\tstart_path = k3d::options::get_path(path_type);\n\n\tif(start_path.empty())\n\t\tstart_path = k3d::system::get_home_directory();\n\n\tif(k3d::filesystem::exists(start_path) && k3d::filesystem::is_directory(start_path))\n\t\tset_current_folder(start_path.native_filesystem_string());\n\telse\n\t\tset_filename(start_path.native_filesystem_string());\n\n\t// Run the dialog ...\n\tset_position(Gtk::WIN_POS_CENTER);\n\textra_widget_container->show_all();\n\tif(Gtk::RESPONSE_OK != run())\n\t\treturn false;\n\n\t// Optionally add an extension if the user didn't ...\n\tResult = k3d::filesystem::native_path(k3d::ustring::from_utf8(Glib::filename_to_utf8(get_filename()).raw()));\n\tif(!extension.empty() && append_extension_widget.get_active() && (k3d::filesystem::extension(Result).lowercase().raw() != extension))\n\t\tResult = Result + extension;\n\n\t// Prompt the user if they're about to overwrite an existing file ...\n\tif(!prompt_file_overwrite(Result))\n\t\treturn false;\n\n\t// Record the path for posterity ...\n\tk3d::options::set_path(path_type, Result);\n\n\tswitch(Gtk::FileChooser::get_action())\n\t{\n\t\tcase Gtk::FILE_CHOOSER_ACTION_OPEN:\n\t\tcase Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER:\n\t\t\tbreak;\n\t\tcase Gtk::FILE_CHOOSER_ACTION_SAVE:\n\t\t\tif(compression)\n\t\t\t\tCompressed = compression_widget.get_active();\n\t\t\tbreak;\n\t\tcase Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER:\n\t\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nbool file_chooser_dialog::prompt_file_overwrite(const k3d::filesystem::path& File)\n{\n\tswitch(Gtk::FileChooser::get_action())\n\t{\n\t\tcase Gtk::FILE_CHOOSER_ACTION_OPEN:\n\t\tcase Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER:\n\t\t\treturn true;\n\t\tcase Gtk::FILE_CHOOSER_ACTION_SAVE:\n\t\tcase Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER:\n\t\t\tbreak;\n\t}\n\n\tif(!k3d::filesystem::exists(File))\n\t\treturn true;\n\n\tGtk::MessageDialog dialog(*this, \"\", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE);\n\n\tdialog.set_message(k3d::string_cast(boost::format(_(\"A file named \\\"%1%\\\" already exists.\")) % File.native_utf8_string().raw()));\n\tdialog.set_secondary_text(_(\"Do you want to replace it with the one you are saving?\"));\n\n\tGtk::Image replace_icon(Gtk::Stock::REFRESH, Gtk::ICON_SIZE_BUTTON);\n\n\tGtk::Button replace_button(_(\"Replace\"));\n\treplace_button.set_image(replace_icon);\n\treplace_button.set_flags(replace_button.get_flags() | Gtk::CAN_DEFAULT);\n\treplace_button.show();\n\n\tdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);\n\tdialog.add_action_widget(replace_button, Gtk::RESPONSE_OK);\n\n\tdialog.set_default_response(Gtk::RESPONSE_CANCEL);\n\n\treturn dialog.run() == Gtk::RESPONSE_OK;\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/file_chooser_dialog.h",
    "content": "#ifndef K3DSDK_NGUI_FILE_CHOOSER_DIALOG_H\n#define K3DSDK_NGUI_FILE_CHOOSER_DIALOG_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ipath_property.h>\n#include <k3dsdk/path.h>\n\n#include <gtkmm/filechooserdialog.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/// Wraps the standard file dialog widget, adding K-3D-specific functionality\nclass file_chooser_dialog :\n\tpublic Gtk::FileChooserDialog\n{\n\ttypedef Gtk::FileChooserDialog base;\n\npublic:\n\tfile_chooser_dialog(const Glib::ustring& Title, const std::string& PathType, Gtk::FileChooserAction Action = Gtk::FILE_CHOOSER_ACTION_OPEN, const k3d::filesystem::path& InitialPath = k3d::filesystem::path());\n\tfile_chooser_dialog(const Glib::ustring& Title, const std::string& PathType, k3d::ipath_property::mode_t Action, const k3d::filesystem::path& InitialPath = k3d::filesystem::path());\n \tfile_chooser_dialog(Gtk::Window& Parent, const Glib::ustring& Title, const std::string& PathType, Gtk::FileChooserAction Action = Gtk::FILE_CHOOSER_ACTION_OPEN, const k3d::filesystem::path& InitialPath = k3d::filesystem::path());\n\tfile_chooser_dialog(Gtk::Window& Parent, const Glib::ustring& Title, const std::string& PathType, k3d::ipath_property::mode_t Action, const k3d::filesystem::path& InitialPath = k3d::filesystem::path());\n\n\t~file_chooser_dialog();\n\n\t/// Adds a GLOB style pattern filter to the list of available files\n\tvoid add_pattern_filter(const Glib::ustring& Name, const Glib::ustring& Pattern);\n\t/// Adds a Mime-type filter to the list of available files\n\tvoid add_mime_type_filter(const Glib::ustring& Name, const Glib::ustring& MimeType);\n\t/// Adds an \"all files\" filter to the list of available files\n\tvoid add_all_files_filter();\n\n\t/// Adds an option to compress output files.\n\tvoid enable_compression(const bool Compression = true);\n\n\t/// Adds an option to force the user's choice of file to end in the given extension.  Pass the extension (including dot) to be added.  Pass an empty string to disable.  Disabled by default.\n\tvoid append_extension(const std::string& Extension);\n\n\t/// Adds an extra widget (for previewing, special options, etc) to the dialog\n\tvoid add_extra_widget(Gtk::Widget& ExtraWidget);\n\n\t/// Displays a modal dialog and prompts the user to choose a file, returning false if the user cancels\n\tbool get_file_path(k3d::filesystem::path& Result);\n\t/// Displays a modal dialog and prompts the user to choose a file, returning false if the user cancels\n\tbool get_file_path(k3d::filesystem::path& Result, bool& Compressed);\n\nprivate:\n\t// Force callers to use add_extra_widget() instead\n\tvoid set_extra_widget(Gtk::Widget&);\n\n\tbool prompt_file_overwrite(const k3d::filesystem::path& Path);\n\n\tconst std::string path_type;\n\tconst k3d::filesystem::path initial_path;\n\tbool compression;\n\tstd::string extension;\n\tGtk::VBox* const extra_widget_container;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_FILE_CHOOSER_DIALOG_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/hotkey_cell_renderer_text.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/hotkey_cell_renderer_text.h>\n#include <gtkmm/window.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// hotkey_cell_renderer_text\n\nhotkey_cell_renderer_text::hotkey_cell_renderer_text() :\n\tm_window(0)\n{\n}\n\t\nGtk::CellEditable* hotkey_cell_renderer_text::start_editing_vfunc(GdkEvent* event, Gtk::Widget& widget, const Glib::ustring& path, const Gdk::Rectangle& background_area, const Gdk::Rectangle& cell_area, Gtk::CellRendererState flags)\n{\n\tm_window = dynamic_cast<Gtk::Window*>(widget.get_toplevel());\n\tif(m_window)\n\t{\n\t\tm_disabled_accel_group = m_window->get_accel_group();\n\t\tm_window->remove_accel_group(m_window->get_accel_group());\n\t}\n\t\n\treturn base::start_editing_vfunc(event, widget, path, background_area, cell_area, flags);\n}\n\nvoid hotkey_cell_renderer_text::on_editing_canceled()\n{\n\tif(m_window)\n\t{\n\t\tm_window->add_accel_group(m_disabled_accel_group);\n\t\tm_disabled_accel_group.clear();\n\t}\n\n\tbase::on_editing_canceled();\n}\n\nvoid hotkey_cell_renderer_text::on_edited(const Glib::ustring& path, const Glib::ustring& new_text)\n{\n\tif(m_window)\n\t{\n\t\tm_window->add_accel_group(m_disabled_accel_group);\n\t\tm_disabled_accel_group.clear();\n\t}\n\n\tbase::on_edited(path, new_text);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/hotkey_cell_renderer_text.h",
    "content": "#ifndef K3DSDK_NGUI_HOTKEY_CELL_RENDERER_TEXT_H\n#define K3DSDK_NGUI_HOTKEY_CELL_RENDERER_TEXT_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/accelgroup.h>\n#include <gtkmm/cellrenderertext.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// hotkey_cell_renderer_text\n\n/// Gtk::CellRendererText derivative that automatically disables accelerators during editing\nclass hotkey_cell_renderer_text :\n\tpublic Gtk::CellRendererText\n{\n\ttypedef Gtk::CellRendererText base;\n\npublic:\n\thotkey_cell_renderer_text();\n\n\tGtk::CellEditable* start_editing_vfunc(GdkEvent* event, Gtk::Widget& widget, const Glib::ustring& path, const Gdk::Rectangle& background_area, const Gdk::Rectangle& cell_area, Gtk::CellRendererState flags);\n\tvoid on_editing_canceled();\n\tvoid on_edited (const Glib::ustring& path, const Glib::ustring& new_text);\n\nprivate:\n\t/// Stores the parent window while the control has the keyboard focus\n\tGtk::Window* m_window;\n\t/// Stores the global accel group while the control has the keyboard focus\n\tGlib::RefPtr<Gtk::AccelGroup> m_disabled_accel_group;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_HOTKEY_CELL_RENDERER_TEXT_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/hotkey_entry.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/hotkey_entry.h>\n#include <gtkmm/window.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// hotkey_entry\n\nbool hotkey_entry::on_focus_in_event(GdkEventFocus* Event)\n{\n\t// Disable accelerators for this window\n\tif(Gtk::Window* const window = dynamic_cast<Gtk::Window*>(get_toplevel()))\n\t{\n\t\tm_disabled_accel_group = window->get_accel_group();\n\t\twindow->remove_accel_group(window->get_accel_group());\n\t}\n\n\treturn base::on_focus_in_event(Event);\n}\n\nbool hotkey_entry::on_focus_out_event(GdkEventFocus* Event)\n{\n\t// Enable accelerators for this window\n\tif(Gtk::Window* const window = dynamic_cast<Gtk::Window*>(get_toplevel()))\n\t{\n\t\twindow->add_accel_group(m_disabled_accel_group);\n\t\tm_disabled_accel_group.clear();\n\t}\n\n\treturn base::on_focus_out_event(Event);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/hotkey_entry.h",
    "content": "#ifndef K3DSDK_NGUI_HOTKEY_ENTRY_H\n#define K3DSDK_NGUI_HOTKEY_ENTRY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/entry.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// hotkey_entry\n\n/// Gtk::Entry derivative that automatically disables accelerators while it has the focus\nclass hotkey_entry :\n\tpublic Gtk::Entry\n{\n\ttypedef Gtk::Entry base;\n\npublic:\n\t/// Called when the control gets the keyboard focus\n\tbool on_focus_in_event(GdkEventFocus* Event);\n\t/// Called when the control loses the keyboard focus\n\tbool on_focus_out_event(GdkEventFocus* Event);\n\nprivate:\n\t/// Stores the global accel group while the control has the keyboard focus\n\tGlib::RefPtr<Gtk::AccelGroup> m_disabled_accel_group;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_HOTKEY_ENTRY_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/icons.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/**\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/icons.h>\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/share.h>\n\n#include <gdkmm/display.h>\n#include <gtkmm/enums.h>\n#include <gtkmm/icontheme.h>\n\n#include <iostream>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\nconst k3d::filesystem::path scalable_path()\n{\n\treturn k3d::share_path() / k3d::filesystem::generic_path(\"ngui/scalable\");\n}\n\nconst k3d::filesystem::path rasterized_path()\n{\n\treturn k3d::share_path() / k3d::filesystem::generic_path(\"ngui/rasterized\");\n}\n\nconst k3d::filesystem::path pixmap_path()\n{\n\treturn k3d::share_path() / k3d::filesystem::generic_path(\"ngui/pixmap\");\n}\n\n#include <k3dsdk/ngui/unknown.xpm>\n\n} // namespace detail\n\nGlib::RefPtr<Gdk::Pixbuf> load_icon(const std::string& Name, const Gtk::IconSize& Size)\n{\n\tstatic Glib::RefPtr<Gtk::IconTheme> theme;\n\tif(!theme)\n\t{\n\t\ttheme = Gtk::IconTheme::create();\n\n#ifdef K3D_HAVE_SVG_ICONS\n\t\ttheme->append_search_path(detail::scalable_path().native_utf8_string().raw());\n\t\tk3d::log() << info << \"Loading icons from \" << detail::scalable_path().native_console_string() << std::endl;\n#endif // K3D_HAVE_SVG_ICONS\n\n\t\ttheme->append_search_path(detail::rasterized_path().native_utf8_string().raw());\n\t\tk3d::log() << info << \"Loading icons from \" << detail::rasterized_path().native_console_string() << std::endl;\n\n\t\ttheme->append_search_path(detail::pixmap_path().native_utf8_string().raw());\n\t\tk3d::log() << info << \"Loading icons from \" << detail::pixmap_path().native_console_string() << std::endl;\n\t}\n\n\tint width = 0;\n\tint height = 0;\n\treturn_val_if_fail(Gtk::IconSize::lookup(Size, width, height), Glib::RefPtr<Gdk::Pixbuf>());\n\n\ttry\n\t{\n\t\treturn theme->load_icon(Name, width, Gtk::ICON_LOOKUP_USE_BUILTIN);\n\t}\n\tcatch(Glib::Exception& e)\n\t{\n\t\tk3d::log() << error << e.what() << std::endl;\n\t}\n\n\tstatic Glib::RefPtr<Gdk::Pixbuf> unknown_icon;\n\tif(!unknown_icon)\n\t{\n\t\ttry\n\t\t{\n\t\t\tunknown_icon = Gdk::Pixbuf::create_from_xpm_data(detail::unknown_xpm);\n\t\t}\n\t\tcatch(Glib::Exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t}\n\t}\n\n\treturn unknown_icon;\n}\n\nGlib::RefPtr<Gdk::Pixbuf> quiet_load_icon(const std::string& Name, const Gtk::IconSize& Size)\n{\n#ifdef K3D_HAVE_SVG_ICONS\n\tif(k3d::filesystem::exists(detail::scalable_path() / k3d::filesystem::native_path(k3d::ustring::from_utf8(Name + \".svg\"))))\n\t\treturn load_icon(Name, Size);\n#endif // !K3D_HAVE_SVG_ICONS\n\n\tif(k3d::filesystem::exists(detail::rasterized_path() / k3d::filesystem::native_path(k3d::ustring::from_utf8(Name + \".png\"))))\n\t\treturn load_icon(Name, Size);\n\n\tif(k3d::filesystem::exists(detail::pixmap_path() / k3d::filesystem::native_path(k3d::ustring::from_utf8(Name + \".xpm\"))))\n\t\treturn load_icon(Name, Size);\n\n\n\tstatic Glib::RefPtr<Gdk::Pixbuf> unknown_icon;\n\tif(!unknown_icon)\n\t{\n\t\ttry\n\t\t{\n\t\t\tunknown_icon = Gdk::Pixbuf::create_from_xpm_data(detail::unknown_xpm);\n\t\t}\n\t\tcatch(Glib::Exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t}\n\t}\n\treturn unknown_icon;\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/icons.h",
    "content": "#ifndef K3DSDK_NGUI_ICONS_H\n#define K3DSDK_NGUI_ICONS_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <glibmm/refptr.h>\n#include <string>\n\n// Forward declarations\nnamespace Gdk { class Pixbuf; }\nnamespace Gtk { class IconSize; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n// Loads an (optionally themed) application icon\nGlib::RefPtr<Gdk::Pixbuf> load_icon(const std::string& Name, const Gtk::IconSize& Size);\n// Loads an (optionally themed) application icon, without generating an error messages if the icon cannot be located\nGlib::RefPtr<Gdk::Pixbuf> quiet_load_icon(const std::string& Name, const Gtk::IconSize& Size);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_ICONS_H\n"
  },
  {
    "path": "k3dsdk/ngui/image_toggle_button.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/image_toggle_button.h>\n\n#include <gtkmm/image.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace image_toggle_button\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(imodel* const Model, k3d::istate_recorder* const StateRecorder, Glib::RefPtr<Gdk::Pixbuf> Image) :\n\tbase(Model, StateRecorder),\n\tm_image(new Gtk::Image()),\n\tm_active_image(Image),\n\tm_inactive_image(Image)\n{\n\tget_accessible()->set_name(Model->label());\n\tadd(*manage(m_image));\n\ton_update();\n}\n\ncontrol::control(imodel* const Model, k3d::istate_recorder* const StateRecorder, Glib::RefPtr<Gdk::Pixbuf> ActiveImage, Glib::RefPtr<Gdk::Pixbuf> InactiveImage) :\n\tbase(Model, StateRecorder),\n\tm_image(new Gtk::Image()),\n\tm_active_image(ActiveImage),\n\tm_inactive_image(InactiveImage)\n{\n\tadd(*manage(m_image));\n\ton_update();\n}\n\nvoid control::on_update()\n{\n\tm_image->set(get_active() ? m_active_image : m_inactive_image);\n}\n\n} // namespace image_toggle_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/image_toggle_button.h",
    "content": "#ifndef K3DSDK_NGUI_IMAGE_TOGGLE_BUTTON_H\n#define K3DSDK_NGUI_IMAGE_TOGGLE_BUTTON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/toggle_button.h>\n\nnamespace Gtk { class Image; }\nnamespace Gdk { class Pixbuf; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace image_toggle_button\n{\n\nusing toggle_button::imodel;\nusing toggle_button::model;\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Specialization of toggle_button::control that displays different images dependent on the button state\nclass control :\n\tpublic toggle_button::control\n{\n\ttypedef toggle_button::control base;\n\npublic:\n\tcontrol(imodel* const Model, k3d::istate_recorder* const StateRecorder, Glib::RefPtr<Gdk::Pixbuf> Image);\n\tcontrol(imodel* const Model, k3d::istate_recorder* const StateRecorder, Glib::RefPtr<Gdk::Pixbuf> ActiveImage, Glib::RefPtr<Gdk::Pixbuf> InactiveImage);\n\nprivate:\n\tvoid on_update();\n\n\tGtk::Image* const m_image;\n\tGlib::RefPtr<Gdk::Pixbuf> m_active_image;\n\tGlib::RefPtr<Gdk::Pixbuf> m_inactive_image;\n};\n\n} // namespace image_toggle_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_IMAGE_TOGGLE_BUTTON_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/input_model.h",
    "content": "#ifndef K3DSDK_NGUI_INPUT_MODEL_H\n#define K3DSDK_NGUI_INPUT_MODEL_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gdk/gdkevents.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// input_model\n\n/// Abstract interface for objects that can process user input\nclass input_model\n{\npublic:\n\t/// Called when a mouse button is pressed\n\tvirtual void button_press_event(GdkEventButton* Event) = 0;\n\t/// Called when a mouse button is released\n\tvirtual void button_release_event(GdkEventButton* Event) = 0;\n\t/// Called during mouse movement\n\tvirtual void motion_notify_event(GdkEventMotion* Event) = 0;\n\t/// Called when the mouse wheel is scrolled\n\tvirtual void scroll_event(GdkEventScroll* Event) = 0;\n\t/// Called when a key is pressed\n\tvirtual void key_press_event(GdkEventKey* Event) = 0;\n\t/// Called when a key is released\n\tvirtual void key_release_event(GdkEventKey* Event) = 0;\n\nprotected:\n\tinput_model() {}\n\tinput_model(const input_model&) {}\n\tinput_model& operator=(const input_model&) { return *this; }\n\tvirtual ~input_model() {}\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_INPUT_MODEL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/interactive.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/collapsible_frame.h>\n#include <k3dsdk/ngui/interactive.h>\n#include <k3dsdk/ngui/options.h>\n#include <k3dsdk/ngui/screen_overlay.h>\n#include <k3dsdk/ngui/utility.h>\n\n#include <k3d-platform-config.h>\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/bezier.h>\n#include <k3dsdk/high_res_timer.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/vectors.h>\n\n#include <gtkmm/widget.h>\n#include <gtkmm/window.h>\n\n#include <gtk/gtk.h>\n\n#if defined K3D_API_WIN32\n\n\t//#include <gdkwin32.h>\n\t#undef min\n\t#undef max\n#elif defined K3D_API_DARWIN\n\n#else // K3D_API_WIN32\n\n\t#include <gdk/gdkx.h>\n\n#endif // !K3D_API_WIN32\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace interactive\n{\n\nnamespace detail\n{\n\nvoid warp_pointer(const k3d::point2& Offset)\n{\n#ifdef K3D_API_WIN32\n\n\t// Make that pointer jump!\n\tSetCursorPos(static_cast<int>(Offset[0]), static_cast<int>(Offset[1]));\n\n#elif defined K3D_API_DARWIN\n\n#else // K3D_API_WIN32\n\n\t// Get the X display ...\n\tDisplay* xdisplay = GDK_WINDOW_XDISPLAY(Gdk::Display::get_default()->get_default_screen()->get_root_window()->gobj());\n\treturn_if_fail(xdisplay);\n\n\t// Get our X window ...\n\tWindow xwindow = GDK_WINDOW_XWINDOW(Gdk::Display::get_default()->get_default_screen()->get_root_window()->gobj());\n\treturn_if_fail(xwindow);\n\n\t// Move that pointer!\n\tXWarpPointer(xdisplay, None, xwindow, 0, 0, 0, 0, static_cast<int>(Offset[0]), static_cast<int>(Offset[1]));\n\tXFlush(xdisplay);\n\n#endif // !K3D_API_WIN32\n}\n\nvoid warp_pointer(Glib::RefPtr<Gdk::Window> Window, const k3d::point2& Offset)\n{\n\treturn_if_fail(Window);\n\n\tint left = 0;\n\tint top = 0;\n\tWindow->get_origin(left, top);\n\n\twarp_pointer(k3d::point2(left, top) + Offset);\n}\n\nconst k3d::point2 screen_coordinates(Gtk::Widget& Widget)\n{\n\t// Sanity check\n\treturn_val_if_fail(Widget.get_window(), k3d::point2(0, 0));\n\n\tint left = 0;\n\tint top = 0;\n\tWidget.get_window()->get_origin(left, top);\n\n\tif(Widget.has_no_window())\n\t{\n\t\tleft += Widget.get_allocation().get_x();\n\t\ttop += Widget.get_allocation().get_y();\n\t}\n\n\treturn k3d::point2(left, top);\n}\n\n} // namespace detail\n\nconst k3d::point2 get_pointer()\n{\n\tint x = 0;\n\tint y = 0;\n\tGdk::ModifierType modifiers;\n\tGdk::Display::get_default()->get_pointer(x, y, modifiers);\n\n\treturn k3d::point2(x, y);\n}\n\nvoid warp_pointer(const k3d::point2& Coords)\n{\n\tdetail::warp_pointer(Coords);\n}\n\nvoid warp_pointer(Gtk::Widget& Widget, const k3d::point2& Coords)\n{\n\tdetail::warp_pointer(detail::screen_coordinates(Widget) + Coords);\n}\n\nvoid warp_pointer(Gtk::Widget& Widget)\n{\n\tdetail::warp_pointer(detail::screen_coordinates(Widget) + k3d::point2(Widget.get_width() / 2, Widget.get_height() / 2));\n}\n\n} // namespace interactive\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/interactive.h",
    "content": "#ifndef K3DSDK_NGUI_INTERACTIVE_H\n#define K3DSDK_NGUI_INTERACTIVE_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/vectors.h>\n\nnamespace Gtk { class Widget; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace interactive\n{\n\n/// Returns the current pointer screen coordinates\nconst k3d::point2 get_pointer();\n\t\n/// Instantaneously warps the pointer from its current location to the given screen coordinates\nvoid warp_pointer(const k3d::point2& Coords);\n/// Instantaneously warps the pointer from its current location to the given widget coordinates\nvoid warp_pointer(Gtk::Widget& Widget, const k3d::point2& Coords);\n/// Instantaneously warps the pointer from its current location to the center of a widget\nvoid warp_pointer(Gtk::Widget& Widget);\n\n} // namespace interactive\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_INTERACTIVE_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/keyboard.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/keyboard.h>\n#include <gdk/gdk.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nconst k3d::key_modifiers convert(const unsigned int Modifiers)\n{\n\tk3d::key_modifiers result;\n\n\tresult.set_shift(Modifiers & GDK_SHIFT_MASK ? true : false);\n\tresult.set_lock(Modifiers & GDK_LOCK_MASK ? true : false);\n\tresult.set_control(Modifiers & GDK_CONTROL_MASK ? true : false);\n\tresult.set_mod1(Modifiers & GDK_MOD1_MASK ? true : false);\n\tresult.set_mod2(Modifiers & GDK_MOD2_MASK ? true : false);\n\tresult.set_mod3(Modifiers & GDK_MOD3_MASK ? true : false);\n\tresult.set_mod4(Modifiers & GDK_MOD4_MASK ? true : false);\n\tresult.set_mod5(Modifiers & GDK_MOD5_MASK ? true : false);\n\tresult.set_button1(Modifiers & GDK_BUTTON1_MASK ? true : false);\n\tresult.set_button2(Modifiers & GDK_BUTTON2_MASK ? true : false);\n\tresult.set_button3(Modifiers & GDK_BUTTON3_MASK ? true : false);\n\tresult.set_button4(Modifiers & GDK_BUTTON4_MASK ? true : false);\n\tresult.set_button5(Modifiers & GDK_BUTTON5_MASK ? true : false);\n\tresult.set_release(Modifiers & GDK_RELEASE_MASK ? true : false);\n\n\treturn result;\n}\n\nconst unsigned int convert(const k3d::key_modifiers Modifiers)\n{\n\tint result = 0;\n\t\n\tif(Modifiers.shift()) result |= GDK_SHIFT_MASK;\n\tif(Modifiers.lock()) result |= GDK_LOCK_MASK;\n\tif(Modifiers.control()) result |= GDK_CONTROL_MASK;\n\tif(Modifiers.mod1()) result |= GDK_MOD1_MASK;\n\tif(Modifiers.mod2()) result |= GDK_MOD2_MASK;\n\tif(Modifiers.mod3()) result |= GDK_MOD3_MASK;\n\tif(Modifiers.mod4()) result |= GDK_MOD4_MASK;\n\tif(Modifiers.mod5()) result |= GDK_MOD5_MASK;\n\tif(Modifiers.button1()) result |= GDK_BUTTON1_MASK;\n\tif(Modifiers.button2()) result |= GDK_BUTTON2_MASK;\n\tif(Modifiers.button3()) result |= GDK_BUTTON3_MASK;\n\tif(Modifiers.button4()) result |= GDK_BUTTON4_MASK;\n\tif(Modifiers.button5()) result |= GDK_BUTTON5_MASK;\n\tif(Modifiers.release()) result |= GDK_RELEASE_MASK;\n\t\n\treturn result;\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/keyboard.h",
    "content": "#ifndef K3DSDK_NGUI_KEYBOARD_H\n#define K3DSDK_NGUI_KEYBOARD_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/keyboard.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/// Converts GDK keyboard modifiers to our native keyboard modifier type\nconst k3d::key_modifiers convert(const unsigned int Modifiers);\n/// Converts our native keyboard modifier type to GDK keyboard modifiers\nconst unsigned int convert(const k3d::key_modifiers Modifiers);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_KEYBOARD_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/main_document_window.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/application.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/batch_mode.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gzstream.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/idocument_exporter.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/idocument_sink.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/iparentable.h>\n#include <k3dsdk/iplugin_factory_collection.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iscripted_action.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/itime_sink.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/mime_types.h>\n#include <k3dsdk/ngui/application_state.h>\n#include <k3dsdk/ngui/check_menu_item.h>\n#include <k3dsdk/ngui/pipeline.h>\n#include <k3dsdk/ngui/document.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/image_toggle_button.h>\n#include <k3dsdk/ngui/main_document_window.h>\n#include <k3dsdk/ngui/menus.h>\n#include <k3dsdk/ngui/merge_nodes.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/node.h>\n#include <k3dsdk/ngui/panel_frame.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/ngui/render.h>\n#include <k3dsdk/ngui/savable_document_window.h>\n#include <k3dsdk/ngui/scripting.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/target.h>\n#include <k3dsdk/ngui/toolbar.h>\n#include <k3dsdk/ngui/transform.h>\n#include <k3dsdk/ngui/undo_utility.h>\n#include <k3dsdk/ngui/uri.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/ngui/widget_manip.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/persistent_lookup.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/user_property.h>\n#include <k3dsdk/utility_gl.h>\n#include <k3dsdk/xml.h>\n#include <k3d-version-config.h>\n\n#include <gdkmm/cursor.h>\n#include <gtkmm/accelmap.h>\n#include <gtkmm/box.h>\n#include <gtkmm/eventbox.h>\n#include <gtkmm/filechooserdialog.h>\n#include <gtkmm/frame.h>\n#include <gtkmm/imagemenuitem.h>\n#include <gtkmm/handlebox.h>\n#include <gtkmm/menu.h>\n#include <gtkmm/menuitem.h>\n#include <gtkmm/menubar.h>\n#include <gtkmm/notebook.h>\n#include <gtkmm/paned.h>\n#include <gtkmm/separatortoolitem.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/stock.h>\n#include <gtkmm/textview.h>\n#include <gtkmm/treeview.h>\n\n#include <sigc++/retype_return.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <sstream>\n\n#include <gtk/gtkbutton.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select: selecting nodes using std::for_each\n\nstruct select\n{\n\tselect(idocument& Document) : document(Document)\n\t{\n\t}\n\n\tvoid operator()(k3d::inode* Node)\n\t{\n\t\tif(Node)\n\t\t\tselection::state(document).select(*Node);\n\t}\nprivate:\n\tidocument& document;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// get_panel_frames\n\nvoid get_panel_frames(Gtk::Widget& Parent, panel_frame::controls& Results)\n{\n\tpanel_frame::control* const panel = dynamic_cast<panel_frame::control*>(&Parent);\n\tif(panel)\n\t{\n\t\tResults.push_back(panel);\n\t\treturn;\n\t}\n\n\tGtk::Container* const container = dynamic_cast<Gtk::Container*>(&Parent);\n\tif(container)\n\t{\n\t\tstd::vector<Gtk::Widget*> children = container->get_children();\n\t\tfor(std::vector<Gtk::Widget*>::iterator child = children.begin(); child != children.end(); ++child)\n\t\t\tget_panel_frames(**child, Results);\n\t}\n}\n\npanel_frame::controls get_panel_frames(Gtk::Widget& Parent)\n{\n\tpanel_frame::controls results;\n\tget_panel_frames(Parent, results);\n\n\treturn results;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// ui_layout_path\n\nconst k3d::filesystem::path ui_layout_path()\n{\n\treturn k3d::system::get_home_directory() / k3d::filesystem::generic_path(\".k3d/ui_layout\");\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// main_document_window\n\nclass main_document_window :\n\tpublic savable_document_window,\n\tpublic k3d::property_collection,\n\tpublic k3d::ipersistent\n{\n\ttypedef savable_document_window base;\n\npublic:\n\tmain_document_window(document_state& DocumentState) :\n\t\tk3d::property_collection(),\n\t\tm_maximize_panel(init_name(\"maximize_panel\") + init_label(_(\"Maximize active panel\")) + init_description(_(\"Maximize active panel (make it the only visible one)\")) + init_value(false)),\n\t\tm_hide_unpinned_panels(init_name(\"hide_unpinned_panels\") + init_label(_(\"Hide unpinned panels\")) + init_description(_(\"Hide/show unpinned panels in main document window\")) + init_value(false)),\n\t\tm_fullscreen(init_name(\"fullscreen\") + init_label(_(\"Fullscreen\")) + init_description(_(\"Fullscreen mode for main document window\")) + init_value(false)),\n\t\tm_focus_panel(0),\n\t\tm_focus_viewport_panel(0),\n\t\tm_layout_maximize_panel(0),\n\t\tm_layout_hide_unpinned(0),\n\t\tm_layout_pin_all(0),\n\t\tm_layout_unpin_all(0),\n\t\tm_layout_decorate_panel(0),\n\t\tm_layout_undecorate_panel(0),\n\t\tm_layout_split_horizontal(0),\n\t\tm_layout_split_vertical(0),\n\t\tm_layout_kill_panel(0),\n\t\tm_document_state(DocumentState)\n\t{\n\t\tbase::initialize(DocumentState);\n\n\t\t++m_count;\n\n\t\tdocument().title().property_changed_signal().connect(sigc::mem_fun(*this, &main_document_window::on_document_title_changed));\n\t\tm_fullscreen.changed_signal().connect(sigc::mem_fun(*this, &main_document_window::on_window_fullscreen));\n\t\tm_panel_focus_signal.connect(sigc::mem_fun(*this, &main_document_window::on_panel_focus_changed));\n\n\t\tdocument().state_recorder().connect_current_node_changed_signal(sigc::mem_fun(*this, &main_document_window::update_undo_redo_controls));\n\n\t\tm_document_state.set_cursor_signal().connect(sigc::mem_fun(*this, &main_document_window::on_set_cursor));\n\t\tm_document_state.clear_cursor_signal().connect(sigc::mem_fun(*this, &main_document_window::on_clear_cursor));\n\n\t\tGtk::MenuBar* const menubar = new Gtk::MenuBar();\n\t\tmenubar->get_accessible()->set_name(\"main\");\n\t\tmenubar->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"_File\"), *manage(create_file_menu())));\n\t\tmenubar->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"_Edit\"), *manage(create_edit_menu())));\n\t\tmenubar->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"_Select\"), *manage(create_select_menu())));\n\t\tmenubar->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"_Layout\"), *manage(create_layout_menu())));\n\t\tmenubar->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"_View\"), *manage(create_view_menu())));\n\t\tmenubar->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Create\"), *manage(create_create_menu())));\n\t\tmenubar->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Modify\"), *manage(create_modifier_menu())));\n\t\tmenubar->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"_Render\"), *manage(create_render_menu())));\n\t\tmenubar->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"S_cripting\"), *manage(create_scripting_menu())));\n\t\tmenubar->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"_Advanced\"), *manage(create_advanced_menu())));\n\t\tmenubar->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"_Help\"), *manage(create_help_menu())));\n\t\tmenubar->show_all();\n\n\t\tm_panel_frame.get_accessible()->set_name(\"main\");\n\t\tm_panel_frame.show_all();\n\n\t\t// Setup main box with menubar, panel frame and status bar\n\t\tGtk::VBox* const vbox1 = new Gtk::VBox(false);\n\t\tvbox1->get_accessible()->set_name(\"vbox\");\n\t\tvbox1->pack_start(*Gtk::manage(menubar), Gtk::PACK_SHRINK);\n\t\tvbox1->pack_start(m_panel_frame, Gtk::PACK_EXPAND_WIDGET);\n//\t\tvbox1->pack_start(*Gtk::manage(hbox1), Gtk::PACK_SHRINK);\n\t\tvbox1->show();\n\n\t\tadd(*manage(vbox1));\n\n\t\t// Load layout\n\t\tif(!load_ui_layout())\n\t\t{\n\t\t\tset_default_layout();\n\t\t\tmaximize();\n\t\t}\n\n\t\tupdate_panel_controls(0);\n\n\t\t// Update variables\n\t\ton_document_title_changed(0);\n\t\ton_window_fullscreen(0);\n\n\t\tshow();\n\n\t\t// Give the event-loop a chance to catch-up (otherwise, we get breakage in test cases)\n\t\thandle_pending_events();\n\t}\n\n\tvoid delete_children(Gtk::Widget& Widget)\n\t{\n\t\tif(panel_frame::control* const control = dynamic_cast<panel_frame::control*>(&Widget))\n\t\t{\n\t\t\tdelete control;\n\t\t\treturn;\n\t\t}\n\n\t\tif(Gtk::Container* const container = dynamic_cast<Gtk::Container*>(&Widget))\n\t\t{\n\t\t\tstd::vector<Gtk::Widget*> children = container->get_children();\n\t\t\tfor(size_t i = 0; i != children.size(); ++i)\n\t\t\t\tdelete_children(*children[i]);\n\n\t\t\tdelete container;\n\t\t}\n\t}\n\n\t~main_document_window()\n\t{\n\t\tif(Gtk::Widget* frame_child = m_panel_frame.get_child())\n\t\t\tdelete_children(*frame_child);\n\n\t\t--m_count;\n\t}\n\n\tvoid save(k3d::xml::element& Element, const k3d::ipersistent::save_context& Context)\n\t{\n\t\tGtk::Widget* frame_child = m_panel_frame.get_child();\n\t\tif(!frame_child)\n\t\t\treturn;\n\n\t\tsave_ui_container(frame_child, Element);\n\t}\n\n\tvoid load(k3d::xml::element& Element, const k3d::ipersistent::load_context& Context)\n\t{\n\t\tif(!load_ui_container(Element))\n\t\t{\n\t\t\tk3d::log() << warning << \"Using default UI layout\" << std::endl;\n\t\t\tset_default_layout();\n\t\t}\n\t}\n\n\tvoid set_default_layout()\n\t{\n\t\tif(Gtk::Widget* frame_child = m_panel_frame.get_child())\n\t\t{\n\t\t\tm_panel_frame.remove();\n\t\t\tdelete frame_child;\n\t\t}\n\n\t\t// Create first panel frame\n\t\tpanel_frame::control* const panel_frame1 = create_panel_frame();\n\t\tm_panel_frame.set_shadow_type(Gtk::SHADOW_NONE);\n\t\tm_panel_frame.add(*Gtk::manage(panel_frame1));\n\n\t\t// First panel is the toolbar\n\t\tpanel_frame1->mount_panel(\"NGUIToolbarPanel\");\n\t\tpanel_frame1->decorations.set_value(false);\n\n\t\t// Node list in the middle\n\t\tpanel_frame::control* const panel_frame2 = split_panel(*panel_frame1, *Gtk::manage(new Gtk::VPaned), -1);\n\t\tpanel_frame2->mount_panel(\"NGUINodeListPanel\");\n\n\t\t// Timeline at the bottom\n\t\tpanel_frame::control* const panel_frame3 = split_panel(*panel_frame2, *Gtk::manage(new Gtk::VPaned), -1, Gtk::SHRINK);\n\t\tpanel_frame3->mount_panel(\"NGUITimelinePanel\");\n\t\tpanel_frame3->decorations.set_value(false);\n\n\t\t// Viewport on node list's right\n\t\tpanel_frame::control* const panel_frame4 = split_panel(*panel_frame2, *Gtk::manage(new Gtk::HPaned), 200);\n\n\t\tconst std::vector<k3d::gl::irender_viewport*> gl_engines = k3d::node::lookup<k3d::gl::irender_viewport>(document());\n\t\tk3d::gl::irender_viewport* const glengine1 = gl_engines.size() ? gl_engines[0] : 0;\n\n\t\tconst std::vector<k3d::icamera*> cameras = k3d::node::lookup<k3d::icamera>(document());\n\t\tk3d::icamera* const camera1 = cameras.size() ? cameras[0] : 0;\n\n\t\tif(glengine1 && camera1)\n\t\t{\n\t\t\tviewport::control* const control = new viewport::control(m_document_state);\n\t\t\tcontrol->get_accessible()->set_name(\"viewport\");\n\t\t\tcontrol->set_camera(camera1);\n\t\t\tcontrol->set_gl_engine(glengine1);\n\t\t\tpanel_frame4->mount_panel(*Gtk::manage(control), \"NGUIViewportPanel\");\n\t\t}\n\n\t\t// Node history below node list\n\t\tpanel_frame::control* const panel_frame5 = split_panel(*panel_frame2, *Gtk::manage(new Gtk::VPaned), -1);\n\t\tpanel_frame5->mount_panel(\"NGUIPipelinePanel\");\n\t\t// Node properties below node history\n\t\tpanel_frame::control* const panel_frame6 = split_panel(*panel_frame5, *Gtk::manage(new Gtk::VPaned), -1);\n\t\tpanel_frame6->mount_panel(\"NGUINodePropertiesPanel\");\n\t\t\n\t\tset_focus_viewport_panel(panel_frame4);\n\t}\n\nprivate:\n\tvoid on_set_cursor(const Glib::RefPtr<Gdk::Pixbuf> Cursor)\n\t{\n\t\tif(Cursor)\n\t\t\tget_window()->set_cursor(Gdk::Cursor(get_display(), Cursor, 0, 0));\n\t\telse\n\t\t\tget_window()->set_cursor();\n\t}\n\n\tvoid on_clear_cursor()\n\t{\n\t\tget_window()->set_cursor();\n\t}\n\n\tpanel_frame::control* create_panel_frame(/*const std::string& Name*/)\n\t{\n\t\tpanel_frame::control* const control = new panel_frame::control(m_document_state, m_panel_focus_signal);\n\t\tcontrol->pinned.changed_signal().connect(sigc::mem_fun(*this, &main_document_window::update_panel_controls));\n\t\tcontrol->automagic.changed_signal().connect(sigc::mem_fun(*this, &main_document_window::update_panel_controls));\n\t\tcontrol->grab_panel_focus();\n\n\t\treturn control;\n\t}\n\n\tGtk::Menu* create_file_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::NEW, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"_New\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_file_new))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/file/new\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::OPEN, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"_Open...\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_file_open))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/file/open\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::OPEN, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"_Merge Nodes...\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_file_merge_nodes))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/file/merge_nodes\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::SAVE, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"_Save\"), true)\n\t\t\t<< connect_menu_item(sigc::hide_return(sigc::mem_fun(*this, &main_document_window::on_file_save)))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/file/save\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::SAVE_AS, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"Save _As...\"), true)\n\t\t\t<< connect_menu_item(sigc::hide_return(sigc::mem_fun(*this, &main_document_window::on_file_save_as)))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/file/save_as\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::REVERT_TO_SAVED, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"_Revert\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_file_revert))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/file/revert\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Import ...\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_file_import))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/file/import\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Export ...\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_file_export))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/file/export\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::CLOSE, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"_Close\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_file_close))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/file/close\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::QUIT, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"_Quit\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_file_quit))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/file/quit\", get_accel_group())));\n\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_tools_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Select\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_selection_tool))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/tools/select_tool\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Move\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_move_tool))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/tools/move_tool\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Rotate\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_rotate_tool))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/tools/rotate_tool\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Scale\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_scale_tool))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/tools/scale_tool\", get_accel_group())));\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUIParentTool\"))\n\t\t{\n\t\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\t\tnew Gtk::MenuItem(_(\"_Parent\"), true)\n\t\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_parent_tool))\n\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/tools/NGUIParentTool\", get_accel_group())));\n\t\t}\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Unparent\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_unparent))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/tools/unparent\", get_accel_group())));\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUIRenderRegionTool\"))\n\t\t{\n\t\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\t\tnew Gtk::MenuItem( _(\"Render R_egion\"), true)\n\t\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_render_region_tool))\n\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/tools/NGUIRenderRegionTool\", get_accel_group())));\n\t\t}\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUISnapTool\"))\n\t\t{\n\t\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\t\tnew Gtk::MenuItem(_(\"S_nap Tool\"), true)\n\t\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_snap_tool))\n\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/tools/NGUISnapTool\", get_accel_group())));\n\t\t}\n\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_edit_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\tm_undo_menu_item.reset(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::UNDO, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"_Undo\"), true)\n\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_edit_undo), false))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/undo\", get_accel_group()));\n\n\t\tm_undo_all_menu_item.reset(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::UNDO, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"Undo All\"))\n\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_edit_undo), true))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/undo_all\", get_accel_group()));\n\n\t\tm_redo_menu_item.reset(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::REDO, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"_Redo\"), true)\n\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_edit_redo), false))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/redo\", get_accel_group()));\n\n\t\tm_redo_all_menu_item.reset(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::REDO, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"Redo All\"))\n\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_edit_redo), true))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/redo_all\", get_accel_group()));\n\n\t\tmenu->items().push_back(*m_undo_menu_item);\n\t\tmenu->items().push_back(*m_undo_all_menu_item);\n\t\tmenu->items().push_back(*m_redo_menu_item);\n\t\tmenu->items().push_back(*m_redo_all_menu_item);\n\t\tupdate_undo_redo_controls();\n\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"_Tools\"), *Gtk::manage(create_tools_menu())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Instantiate\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_instantiate))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/instantiate\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"D_uplicate\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_duplicate))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/duplicate\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Delete\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_delete))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/edit/delete\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUIAssignHotkeysDialog\"))\n\t\t{\n\t\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\t\tnew Gtk::MenuItem(_(\"Assign _Hotkeys\"), true)\n\t\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_assign_hotkeys))\n\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/assign_hotkeys\", get_accel_group())));\n\t\t}\n\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_select_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_All\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_all))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_all\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_None\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_none))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_none\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Invert\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_invert))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_invert\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Parent\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_parent))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_parent\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Child\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_child))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_child\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Sibling\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_sibling))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_sibling\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"N_odes\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_nodes))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_nodes\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Poin_ts\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_vertices))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_points\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Edges\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_split_edges))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_split_edges\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Faces\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_faces))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_faces\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Curves\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_curves))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_curves\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Patches\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_patches))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_patches\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Uniform\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_select_uniform))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/select/select_uniform\", get_accel_group())));\n\t\t\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\t\t\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_layout_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\tm_layout_maximize_panel = new check_menu_item::control(check_menu_item::proxy(m_maximize_panel), _(\"_Maximize Panel\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_layout_maximize_panel))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/maximize_panel\", get_accel_group());\n\n\t\tm_layout_hide_unpinned = new check_menu_item::control(check_menu_item::proxy(m_hide_unpinned_panels), _(\"H_ide Unpinned Panels\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_layout_hide_show_unpinned))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/hide_unpinned\", get_accel_group());\n\n\t\tm_layout_pin_all = new Gtk::MenuItem(_(\"_Pin All Panels\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_layout_pin_all))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/pin_all_panels\", get_accel_group());\n\n\t\tm_layout_unpin_all = new Gtk::MenuItem(_(\"_Unpin All Panels\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_layout_unpin_all))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/unpin_all\", get_accel_group());\n\n\t\tm_layout_decorate_panel = new Gtk::MenuItem(_(\"_Decorate Selected Panel\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_layout_decorate_panel))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/decorate_panel\", get_accel_group());\n\n\t\tm_layout_undecorate_panel = new Gtk::MenuItem(_(\"U_ndecorate Selected Panel\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_layout_undecorate_panel))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/undecorate_panel\", get_accel_group());\n\n\t\tm_layout_split_horizontal = new Gtk::MenuItem(_(\"Split Panel _Horizontally\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_layout_split_horizontal))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/split_horizontal\", get_accel_group());\n\n\t\tm_layout_split_vertical = new Gtk::MenuItem(_(\"Split Panel _Vertically\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_layout_split_vertical))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/split_vertical\", get_accel_group());\n\n\t\tm_layout_kill_panel = new Gtk::MenuItem(_(\"_Kill Panel\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_layout_kill_panel))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/kill_panel\", get_accel_group());\n\n\t\tmenu->items().push_back(*Gtk::manage(m_layout_maximize_panel));\n\n\t\tmenu->items().push_back(*Gtk::manage(m_layout_hide_unpinned));\n\t\tmenu->items().push_back(*Gtk::manage(m_layout_pin_all));\n\t\tmenu->items().push_back(*Gtk::manage(m_layout_unpin_all));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(m_layout_decorate_panel));\n\t\tmenu->items().push_back(*Gtk::manage(m_layout_undecorate_panel));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(m_layout_split_horizontal));\n\t\tmenu->items().push_back(*Gtk::manage(m_layout_split_vertical));\n\t\tmenu->items().push_back(*Gtk::manage(m_layout_kill_panel));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew check_menu_item::control(check_menu_item::proxy(m_fullscreen), _(\"_Fullscreen\"), true)\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/fullscreen\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Save layout\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_layout_save))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/save_layout\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Reset layout\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_layout_reset))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/layout/reset_layout\", get_accel_group())));\n\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_set_view_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"+_X view\"), true)\n\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_view_set_view), k3d::PX))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/set_view/px_view\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"-X view\"))\n\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_view_set_view), k3d::NX))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/set_view/nx_view\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"+_Y view\"), true)\n\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_view_set_view), k3d::PY))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/set_view/py_view\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"-Y view\"))\n\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_view_set_view), k3d::NY))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/set_view/ny_view\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"+_Z view\"), true)\n\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_view_set_view), k3d::PZ))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/set_view/pz_view\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"-Z view\"))\n\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_view_set_view), k3d::NZ))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/set_view/nz_view\", get_accel_group())));\n\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_view_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Hide Selection\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_view_hide_selection))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/hide_selection\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Show Selection\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_view_show_selection))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/show_selection\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Hide _Unselected\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_view_hide_unselected))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/hide_unselected\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Show _All\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_view_show_all))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/show_all\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Aim Selection\"))\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_view_aim_selection))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/aim_selection\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Frame Selection\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_view_frame_selection))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/frame_selection\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Set _Camera ...\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_view_set_camera))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/set_camera\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Orthographic toggle\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_view_toggle_projection))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/view/toggle_projection\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Set view\"), *Gtk::manage(create_set_view_menu())));\n\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_create_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\t// Group plugin types by their categories ...\n\t\ttypedef std::set<k3d::iplugin_factory*, k3d::sort_by_name> sorted_factories_t;\n\t\ttypedef std::map<std::string, sorted_factories_t> grouped_factories_t;\n\t\tgrouped_factories_t grouped_factories;\n\n\t\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup();\n\t\tfor(k3d::plugin::factory::collection_t::const_iterator f = factories.begin(); f != factories.end(); ++f)\n\t\t{\n\t\t\t// If it isn't a document plugin factory, skip it ...\n\t\t\tif(!dynamic_cast<k3d::idocument_plugin_factory*>(*f))\n\t\t\t\tcontinue;\n\n\t\t\tk3d::iplugin_factory& factory = **f;\n\n\t\t\tfor(k3d::iplugin_factory::categories_t::const_iterator category = factory.categories().begin(); category != factory.categories().end(); ++category)\n\t\t\t\tgrouped_factories[*category].insert(&factory);\n\n\t\t\tif(factory.categories().empty())\n\t\t\t\tgrouped_factories[\"<Uncategorized>\"].insert(&factory);\n\t\t}\n\n\t\tfor(grouped_factories_t::const_iterator group = grouped_factories.begin(); group != grouped_factories.end(); ++group)\n\t\t{\n\t\t\tGtk::Menu* const submenu = new Gtk::Menu();\n\t\t\tsubmenu->set_accel_group(get_accel_group());\n\n\t\t\tmenu->items().push_back(Gtk::Menu_Helpers::MenuElem(group->first, *manage(submenu)));\n\n\t\t\tconst sorted_factories_t& sorted_factories = group->second;\n\t\t\tfor(sorted_factories_t::const_iterator f = sorted_factories.begin(); f != sorted_factories.end(); ++f)\n\t\t\t{\n\t\t\t\tk3d::iplugin_factory& factory = **f;\n\n\t\t\t\tsubmenu->items().push_back(*Gtk::manage(\n\t\t\t\t\tcreate_menu_item(factory)\n\t\t\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_create_node), &factory))\n\t\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/create/\" + factory.name(), get_accel_group())));\n\t\t\t}\n\t\t}\n\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_modifier_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\t// Mesh modifiers\n\t\tconst factories_t& mesh_modifiers = k3d::ngui::mesh_modifiers();\n\t\tif(!mesh_modifiers.empty())\n\t\t{\n\t\t\tGtk::Menu* const submenu = new Gtk::Menu();\n\t\t\tsubmenu->set_accel_group(get_accel_group());\n\n\t\t\tmenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Mesh\"), *manage(submenu)));\n\n\t\t\tfor(factories_t::const_iterator modifier = mesh_modifiers.begin(); modifier != mesh_modifiers.end(); ++modifier)\n\t\t\t{\n\t\t\t\tk3d::iplugin_factory& factory = **modifier;\n\n\t\t\t\tsubmenu->items().push_back(*Gtk::manage(\n\t\t\t\t\tcreate_menu_item(factory)\n\t\t\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_modify_meshes), &factory))\n\t\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/modifier/\" + factory.name(), get_accel_group())));\n\t\t\t}\n\t\t}\n\n\t\t// Transform modifiers\n\t\tconst factories_t& transform_modifiers = k3d::ngui::transform_modifiers();\n\t\tif(!transform_modifiers.empty())\n\t\t{\n\t\t\tGtk::Menu* const submenu = new Gtk::Menu();\n\t\t\tsubmenu->set_accel_group(get_accel_group());\n\n\t\t\tmenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Transform\"), *manage(submenu)));\n\n\t\t\tfor(factories_t::const_iterator modifier = transform_modifiers.begin(); modifier != transform_modifiers.end(); ++modifier)\n\t\t\t{\n\t\t\t\tk3d::iplugin_factory& factory = **modifier;\n\n\t\t\t\tsubmenu->items().push_back(*Gtk::manage(\n\t\t\t\t\tcreate_menu_item(factory)\n\t\t\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_modify_transformations), &factory))\n\t\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/modifier/\" + factory.name(), get_accel_group())));\n\t\t\t}\n\t\t}\n\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_render_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUIRenderRegionTool\"))\n\t\t{\n\t\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t\t*Gtk::manage(new Gtk::Image(load_icon(\"NGUIRenderRegionTool\", Gtk::ICON_SIZE_MENU))), _(\"_Region\"), true)\n\t\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_render_region_tool))\n\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/render/render_region\", get_accel_group())));\n\t\t}\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(load_icon(\"render_preview\", Gtk::ICON_SIZE_MENU))), _(\"_Preview\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_render_preview))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/render/render_preview\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(load_icon(\"render_frame\", Gtk::ICON_SIZE_MENU))), _(\"_Frame\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_render_frame))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/render/render_frame\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(load_icon(\"render_animation\", Gtk::ICON_SIZE_MENU))), _(\"_Animation\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_render_animation))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/render/render_animation\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(load_icon(\"render_frame\", Gtk::ICON_SIZE_MENU))), _(\"_Viewport Frame\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_render_viewport_frame))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/render/render_viewport_frame\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(load_icon(\"render_animation\", Gtk::ICON_SIZE_MENU))), _(\"Viewport A_nimation\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_render_viewport_animation))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/render/render_viewport_animation\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Set Preview Engine ...\"))\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_render_set_viewport_preview_engine))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/render/set_preview_engine\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Set Still Engine ...\"))\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_render_set_viewport_still_engine))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/render/set_still_engine\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"Set Animation Engine ...\"))\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_render_set_viewport_animation_engine))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/render/set_animation_engine\", get_accel_group())));\n\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_scripting_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Play ...\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_scripting_play))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/scripting/play_script\", get_accel_group())));\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUITextEditorDialog\"))\n\t\t{\n\t\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\t\tnew Gtk::MenuItem(_(\"_Editor ...\"), true)\n\t\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_scripting_script_editor))\n\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/scripting/script_editor\", get_accel_group())));\n\t\t}\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUIPythonShellDialog\"))\n\t\t{\n\t\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\t\tnew Gtk::MenuItem(_(\"Python _Shell ...\"), true)\n\t\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_scripting_python_shell))\n\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/scripting/python_shell\", get_accel_group())));\n\t\t}\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\t// Create menu items for (optional) scripted actions ...\n\t\tGtk::Menu* actions_menu = 0;\n\n\t\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup();\n\t\tfor(k3d::plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t\t{\n\t\t\tk3d::iplugin_factory::metadata_t metadata = (**factory).metadata();\n\n\t\t\tif(!metadata.count(\"ngui:action\"))\n\t\t\t\tcontinue;\n\n\t\t\tif(!actions_menu)\n\t\t\t{\n\t\t\t\tactions_menu = new Gtk::Menu();\n\t\t\t\tactions_menu->set_accel_group(get_accel_group());\n\t\t\t\tmenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Actions\"), *manage(actions_menu)));\n\t\t\t}\n\n\t\t\tactions_menu->items().push_back(*Gtk::manage(\n\t\t\t\tcreate_menu_item(**factory)\n\t\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_scripting_action), *factory))\n\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/scripting/action/\" + (**factory).name(), get_accel_group())));\n\t\t}\n\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_advanced_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\tconst k3d::plugin::factory::collection_t dialogs = k3d::plugin::factory::lookup(\"ngui:component-type\", \"dialog\");\n\t\tif(!dialogs.empty())\n\t\t{\n\t\t\tstd::vector<k3d::iplugin_factory*> sorted_dialogs(dialogs.begin(), dialogs.end());\n\t\t\tstd::sort(sorted_dialogs.begin(), sorted_dialogs.end(), k3d::sort_by_name());\n\n\t\t\tGtk::Menu* const dialogs_menu = new Gtk::Menu();\n\t\t\tmenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Dialogs\"), *manage(dialogs_menu)));\n\n\t\t\tfor(std::vector<k3d::iplugin_factory*>::iterator dialog = sorted_dialogs.begin(); dialog != sorted_dialogs.end(); ++dialog)\n\t\t\t{\n\t\t\t\tdialogs_menu->items().push_back(*Gtk::manage(\n\t\t\t\t\tcreate_menu_item(**dialog)\n\t\t\t\t\t<< connect_menu_item(sigc::bind(sigc::mem_fun(*this, &main_document_window::on_advanced_create_dialog), *dialog))\n\t\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/advanced/create_dialog/\" + (**dialog).name(), get_accel_group())));\n\t\t\t}\n\t\t}\n\n\t\treturn menu;\n\t}\n\n\tGtk::Menu* create_help_menu()\n\t{\n\t\tGtk::Menu* const menu = new Gtk::Menu();\n\t\tmenu->set_accel_group(get_accel_group());\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUILearningDialog\"))\n\t\t{\n\t\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\t\tnew Gtk::MenuItem(_(\"Example documents ...\"), true)\n\t\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_help_learning_menu))\n\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/help/learning_menu\", get_accel_group())));\n\t\t}\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"File _Bug Report ...\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_help_file_bug_report))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/help/file_bug_report\", get_accel_group())));\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUILogDialog\"))\n\t\t{\n\t\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\t    new Gtk::MenuItem(_(\"Open _Log Window ...\"), true)\n\t\t\t    << connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_help_open_log_window))\n\t\t\t    << set_accelerator_path(\"<k3d-document>/actions/help/open_log_window\", get_accel_group())));\n\t\t}\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::ImageMenuItem(\n\t\t\t\t*Gtk::manage(new Gtk::Image(Gtk::Stock::HELP, Gtk::ICON_SIZE_MENU)),\n\t\t\t\t_(\"_K-3D Guide\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_help_guide))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/help/guide\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"_Release Notes\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_help_release_notes))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/help/release_notes\", get_accel_group())));\n\n\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\tnew Gtk::MenuItem(_(\"K-3D _Online\"), true)\n\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_help_online))\n\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/help/online\", get_accel_group())));\n\n\t\tmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem());\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUIAboutDialog\"))\n\t\t{\n\t\t\tmenu->items().push_back(*Gtk::manage(\n\t\t\t\tnew Gtk::MenuItem(_(\"_About K-3D ...\"), true)\n\t\t\t\t<< connect_menu_item(sigc::mem_fun(*this, &main_document_window::on_help_about))\n\t\t\t\t<< set_accelerator_path(\"<k3d-document>/actions/help/about\", get_accel_group())));\n\t\t}\n\n\t\treturn menu;\n\t}\n\n\tbool on_delete_event(GdkEventAny*)\n\t{\n\t\ton_file_close();\n\t\treturn true;\n\t}\n\n\tvoid on_assign_hotkeys()\n\t{\n\t\t// Note: the plugin will only open one dialog at-a-time, so it isn't an error if we don't get one back ...\n\t\tif(Gtk::Window* const window = k3d::plugin::create<Gtk::Window>(\"NGUIAssignHotkeysDialog\"))\n\t\t\twindow->set_transient_for(*this);\n\t}\n\n\tvoid on_file_new()\n\t{\n\t\tcreate_document();\n\t}\n\n\tvoid on_file_open()\n\t{\n\t\tk3d::filesystem::path document_path;\n\t\t{\n\t\t\tfile_chooser_dialog dialog(_(\"Open K-3D Document:\"), k3d::options::path::documents(), Gtk::FILE_CHOOSER_ACTION_OPEN);\n\t\t\tdialog.add_pattern_filter(_(\"K-3D Document (*.k3d)\"), \"*.k3d\");\n\t\t\tdialog.add_all_files_filter();\n\t\t\tif(!dialog.get_file_path(document_path))\n\t\t\t\treturn;\n\t\t}\n\n\t\topen_document(document_path);\n\t}\n\n\tvoid on_file_merge_nodes()\n\t{\n\t\tmerge_nodes::merge_nodes(document());\n\t}\n\n\tbool on_file_save()\n\t{\n\t\tconst k3d::filesystem::path document_path = boost::any_cast<k3d::filesystem::path>(document().path().property_internal_value());\n\n\t\tif(document_path.empty())\n\t\t\treturn on_file_save_as();\n\n\t\tboost::scoped_ptr<k3d::idocument_exporter> exporter(k3d::plugin::create<k3d::idocument_exporter>(k3d::classes::DocumentExporter()));\n\t\treturn_val_if_fail(exporter, false);\n\n\t\tif(!exporter->write_file(document(), document_path))\n\t\t{\n\t\t\terror_message(_(\"File could not be saved\"));\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tbool on_file_save_as()\n\t{\n\t\tk3d::filesystem::path document_path;\n\n\t\t{\n\t\t\tfile_chooser_dialog dialog(_(\"Save K-3D Document As:\"), k3d::options::path::documents(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\t\tdialog.add_pattern_filter(_(\"K-3D Document (*.k3d)\"), \"*.k3d\");\n\t\t\tdialog.add_all_files_filter();\n\t\t\tdialog.append_extension(\".k3d\");\n\n\t\t\tif(!dialog.get_file_path(document_path))\n\t\t\t\treturn false;\n\t\t}\n\n\t\tboost::scoped_ptr<k3d::idocument_exporter> exporter(k3d::plugin::create<k3d::idocument_exporter>(k3d::classes::DocumentExporter()));\n\t\treturn_val_if_fail(exporter.get(), false);\n\n\t\tif(!exporter->write_file(document(), document_path))\n\t\t{\n\t\t\terror_message(_(\"File could not be saved\"));\n\t\t\treturn false;\n\t\t}\n\n\t\t// Record the new path & title ...\n\t\t//k3d::property::set_internal_value(document().path(), document_path);\n\t\t//k3d::property::set_internal_value(document().title(), document_path.leaf());\n\n\t\treturn true;\n\t}\n\n\tclass import_export_columns :\n\t\tpublic Gtk::TreeModelColumnRecord\n\t{\n\tpublic:\n\t\timport_export_columns()\n\t\t{\n\t\t\tadd(factory);\n\t\t\tadd(label);\n\t\t\tadd(icon);\n\t\t}\n\n\t\tGtk::TreeModelColumn<k3d::iplugin_factory*> factory;\n\t\tGtk::TreeModelColumn<Glib::ustring> label;\n\t\tGtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon;\n\t};\n\n\tvoid file_revert()\n\t{\n\t\tboost::scoped_ptr<k3d::idocument_importer> importer(k3d::plugin::create<k3d::idocument_importer>(k3d::classes::DocumentImporter()));\n\t\tif(!importer)\n\t\t{\n\t\t\terror_message(_(\"Document reader plugin not installed.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::filesystem::path document_path = boost::any_cast<k3d::filesystem::path>(document().path().property_internal_value());\n\n\t\tk3d::idocument* const reverted_document = k3d::application().create_document();\n\t\treturn_if_fail(reverted_document);\n\n\t\tif(!importer->read_file(document_path, *reverted_document))\n\t\t{\n\t\t\terror_message(_(\"Error reading document.  The document could not be reverted.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tdocument_state* const state = new document_state(*reverted_document);\n\t\tcreate_main_document_window(*state);\n\n\t\tk3d::property::set_internal_value(reverted_document->path(), document_path);\n\t\tk3d::property::set_internal_value(reverted_document->title(), document_path.leaf());\n\n\t\tk3d::application().close_document(document());\n\t}\n\n\tvoid on_file_revert()\n\t{\n\t\tconst k3d::ustring document_title = boost::any_cast<k3d::ustring>(document().title().property_internal_value());\n\n\t\tstd::vector<std::string> buttons;\n\t\tbuttons.push_back(_(\"Revert\"));\n\t\tbuttons.push_back(_(\"Cancel\"));\n\t\tstd::string message = k3d::string_cast(boost::format(_(\"Revert %1% to last-saved version? Unsaved changes will be lost (No Undo)\")) % document_title.raw());\n\n\t\tconst int choice = query_message(message, 1, buttons);\n\t\tswitch(choice)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\treturn;\n\t\t\tcase 1:\n\t\t\t\tfile_revert();\n\t\t\t\treturn;\n\t\t\tcase 2:\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tvoid on_file_import()\n\t{\n\t\t// Make sure we have some file formats to choose from ...\n\t\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::idocument_importer>();\n\t\tif(factories.empty())\n\t\t{\n\t\t\terror_message(_(\"No import file filters available\"));\n\t\t\treturn;\n\t\t}\n\n\t\timport_export_columns columns;\n\t\tGlib::RefPtr<Gtk::ListStore> model = Gtk::ListStore::create(columns);\n\n\t\tGtk::TreeRow row = *model->append();\n\t\trow[columns.factory] = 0;\n\t\trow[columns.label] = _(\"Automatic file detection\");\n\n\t\tfor(k3d::plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t\t{\n\t\t\tGtk::TreeRow row = *model->append();\n\t\t\trow[columns.factory] = *factory;\n\t\t\trow[columns.icon] = quiet_load_icon((*factory)->name(), Gtk::ICON_SIZE_MENU);\n\t\t\trow[columns.label] = (*factory)->short_description();\n\t\t}\n\n\t\t// Prompt the user for a file to import ...\n\t\tk3d::filesystem::path filepath;\n\t\tboost::scoped_ptr<k3d::idocument_importer> importer;\n\n\t\t{\n\t\t\tfile_chooser_dialog dialog(_(\"Import Document:\"), k3d::options::path::documents(), Gtk::FILE_CHOOSER_ACTION_OPEN);\n\n\t\t\tGtk::HBox import_box(false, 5);\n\t\t\tGtk::Label import_label(_(\"Choose import plugin:\"));\n\n\t\t\tGtk::ComboBox import_combo(Glib::RefPtr<Gtk::TreeModel>::cast_dynamic(model));\n\t\t\timport_combo.pack_start(columns.icon, false);\n\t\t\timport_combo.pack_start(columns.label);\n\t\t\timport_combo.set_active(0);\n\n\t\t\timport_box.pack_start(import_label, Gtk::PACK_SHRINK);\n\t\t\timport_box.pack_start(import_combo, Gtk::PACK_EXPAND_WIDGET);\n\t\t\timport_box.show_all();\n\n\t\t\tdialog.add_extra_widget(import_box);\n\n\t\t\tif(!dialog.get_file_path(filepath))\n\t\t\t\treturn;\n\n\t\t\treturn_if_fail(import_combo.get_active() != model->children().end());\n\n\t\t\tif(k3d::iplugin_factory* factory = import_combo.get_active()->get_value(columns.factory))\n\t\t\t{\n\t\t\t\timporter.reset(k3d::plugin::create<k3d::idocument_importer>(*factory));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst k3d::mime::type mime_type = k3d::mime::type::lookup(filepath);\n\t\t\t\tif(mime_type.empty())\n\t\t\t\t{\n\t\t\t\t\terror_message(\n\t\t\t\t\t\t_(\"Could not detect filetype automatically.\\n\"\n\t\t\t\t\t\t\"Try choosing a specific filter that matches the file to be imported\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::idocument_importer>(mime_type);\n\t\t\t\tif(factories.size() != 1)\n\t\t\t\t{\n\t\t\t\t\terror_message(k3d::string_cast(boost::format(_(\"No plugin installed that can import documents of type %1%.\")) % mime_type));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\timporter.reset(k3d::plugin::create<k3d::idocument_importer>(**factories.begin()));\n\t\t\t}\n\n\t\t\tif(!importer)\n\t\t\t{\n\t\t\t\terror_message(_(\"Error creating a plugin to load the document.\"));\n\t\t\t}\n\t\t}\n\n\t\t// Make this an undoable operation ...\n\t\tk3d::record_state_change_set change_set(document(), k3d::string_cast(boost::format(_(\"Import %1%\")) % filepath.native_utf8_string().raw()), K3D_CHANGE_SET_CONTEXT);\n\t\tif(!importer->read_file(filepath, document()))\n\t\t{\n\t\t\terror_message(\n\t\t\t\t\"Error importing file.  If you chose \\\"Automatic\\\" as the filter type,\\n\"\n\t\t\t\t\"try choosing a specific filter that matches the filetype you're importing.\");\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_file_export()\n\t{\n\t\t// Make sure we have some file formats to choose from ...\n\t\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::idocument_exporter>();\n\t\tif(factories.empty())\n\t\t{\n\t\t\terror_message(_(\"No export file filters available\"));\n\t\t\treturn;\n\t\t}\n\n\t\timport_export_columns columns;\n\t\tGlib::RefPtr<Gtk::ListStore> model = Gtk::ListStore::create(columns);\n\t\tfor(k3d::plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t\t{\n\t\t\tGtk::TreeRow row = *model->append();\n\t\t\trow[columns.factory] = *factory;\n\t\t\trow[columns.icon] = quiet_load_icon((*factory)->name(), Gtk::ICON_SIZE_MENU);\n\t\t\trow[columns.label] = (*factory)->short_description();\n\t\t}\n\n\t\t// Prompt the user for a file to export ...\n\t\tk3d::filesystem::path filepath;\n\t\tboost::scoped_ptr<k3d::idocument_exporter> exporter;\n\n\t\t{\n\t\t\tfile_chooser_dialog dialog(_(\"Export Document:\"), k3d::options::path::documents(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\n\t\t\tGtk::HBox export_box(false, 5);\n\t\t\tGtk::Label export_label(_(\"Choose export plugin:\"));\n\n\t\t\tGtk::ComboBox export_combo(Glib::RefPtr<Gtk::TreeModel>::cast_dynamic(model));\n\t\t\texport_combo.pack_start(columns.icon, false);\n\t\t\texport_combo.pack_start(columns.label);\n\t\t\texport_combo.set_active(0);\n\n\t\t\texport_box.pack_start(export_label, Gtk::PACK_SHRINK);\n\t\t\texport_box.pack_start(export_combo, Gtk::PACK_EXPAND_WIDGET);\n\t\t\texport_box.show_all();\n\n\t\t\tdialog.add_extra_widget(export_box);\n\n\t\t\tif(!dialog.get_file_path(filepath))\n\t\t\t\treturn;\n\n\t\t\treturn_if_fail(export_combo.get_active() != model->children().end());\n\t\t\tif(k3d::iplugin_factory* factory = export_combo.get_active()->get_value(columns.factory))\n\t\t\t{\n\t\t\t\texporter.reset(k3d::plugin::create<k3d::idocument_exporter>(*factory));\n\t\t\t}\n\n\t\t\treturn_if_fail(exporter.get());\n\t\t}\n\n\t\tif(!exporter->write_file(document(), filepath))\n\t\t\terror_message(_(\"Error exporting document\"));\n\t}\n\n\tvoid on_file_close()\n\t{\n\t\tif(m_count == 1)\n\t\t{\n\t\t\tapplication_state::instance().safe_close(*this);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_document_state.safe_close(*this);\n\t\t}\n\t}\n\n\tvoid on_file_quit()\n\t{\n\t\tapplication_state::instance().safe_close(*this);\n\t}\n\n\tvoid on_edit_undo(const bool All)\n\t{\n\t\tconst k3d::istate_recorder::node* const current_node = document().state_recorder().current_node();\n\t\treturn_if_fail(current_node);\n\n\t\tcurrent_node->change_set->undo();\n\t\tdocument().state_recorder().set_current_node(current_node->parent);\n\n\t\tconst std::string top_node_name = current_node->label;\n\t\twhile(All)\n\t\t{\n\t\t\tconst k3d::istate_recorder::node* const previous_node = document().state_recorder().current_node();\n\t\t\tif(!previous_node)\n\t\t\t\tbreak;\n\n\t\t\tif(top_node_name != previous_node->label)\n\t\t\t\tbreak;\n\n\t\t\tprevious_node->change_set->undo();\n\t\t\tdocument().state_recorder().set_current_node(previous_node->parent);\n\t\t}\n\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_edit_redo(const bool All)\n\t{\n\t\tconst k3d::istate_recorder::node* const redo_node = next_redo(document().state_recorder());\n\t\treturn_if_fail(redo_node);\n\n\t\tredo_node->change_set->redo();\n\t\tdocument().state_recorder().set_current_node(redo_node);\n\n\t\tconst std::string initial_node_name = redo_node->label;\n\t\twhile(All)\n\t\t{\n\t\t\tconst k3d::istate_recorder::node* const next_node = next_redo(document().state_recorder());\n\t\t\tif(!next_node)\n\t\t\t\tbreak;\n\n\t\t\tif(initial_node_name != next_node->label)\n\t\t\t\tbreak;\n\n\t\t\tnext_node->change_set->redo();\n\t\t\tdocument().state_recorder().set_current_node(next_node);\n\t\t}\n\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_selection_tool()\n\t{\n\t\tm_document_state.set_active_tool(m_document_state.selection_tool());\n\t}\n\n\tvoid on_move_tool()\n\t{\n\t\tm_document_state.set_active_tool(m_document_state.move_tool());\n\t}\n\n\tvoid on_rotate_tool()\n\t{\n\t\tm_document_state.set_active_tool(m_document_state.rotate_tool());\n\t}\n\n\tvoid on_scale_tool()\n\t{\n\t\tm_document_state.set_active_tool(m_document_state.scale_tool());\n\t}\n\n\tvoid on_parent_tool()\n\t{\n\t\ttool* const parent_tool = m_document_state.get_tool(\"NGUIParentTool\");\n\t\treturn_if_fail(parent_tool);\n\n\t\tm_document_state.set_active_tool(*parent_tool);\n\t}\n\n\tvoid on_snap_tool()\n\t{\n\t\ttool* const snap_tool = m_document_state.get_tool(\"NGUISnapTool\");\n\t\treturn_if_fail(snap_tool);\n\n\t\tm_document_state.set_active_tool(*snap_tool);\n\t}\n\n\tvoid on_instantiate()\n\t{\n\t\tpipeline::instantiate_selected_nodes(m_document_state.document());\n\t}\n\n\tvoid on_duplicate()\n\t{\n\t\tpipeline::duplicate_selected_nodes(m_document_state.document());\n\t}\n\n\tvoid on_delete()\n\t{\n\t\tk3d::record_state_change_set changeset(m_document_state.document(), _(\"Delete nodes\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\tk3d::nodes_t nodes = selection::state(m_document_state.document()).selected_nodes();\n\t\tk3d::delete_nodes(m_document_state.document(), nodes);\n\n\t\tk3d::gl::redraw_all(m_document_state.document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_render_region_tool()\n\t{\n\t\ttool* const render_region_tool = m_document_state.get_tool(\"NGUIRenderRegionTool\");\n\t\treturn_if_fail(render_region_tool);\n\n\t\tm_document_state.set_active_tool(*render_region_tool);\n\t}\n\n\tvoid on_select_all()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select All\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).select_all();\n\t}\n\n\tvoid on_select_none()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select None\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).deselect_all();\n\t}\n\n\tvoid on_select_invert()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select Invert\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).invert_selection();\n\t}\n\n\tvoid on_select_parent()\n\t{\n\t\t// Keep track of the set of parent nodes to be selected\n\t\tstd::set<k3d::inode*> parents;\n\n\t\tconst k3d::inode_collection::nodes_t& nodes = m_document_state.document().nodes().collection();\n\t\tfor(k3d::inode_collection::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\t// Skip unselected nodes\n\t\t\tif(!selection::state(m_document_state.document()).is_selected(**node))\n\t\t\t\tcontinue;\n\n\t\t\t// Skip non-parentable nodes\n\t\t\tif(k3d::iparentable* const parentable = dynamic_cast<k3d::iparentable*>(*node))\n\t\t\t\tparents.insert(boost::any_cast<k3d::inode*>(parentable->parent().property_internal_value()));\n\t\t}\n\n\t\t// Don't let NULL creep in ...\n\t\tparents.erase(static_cast<k3d::inode*>(0));\n\n\t\tif(parents.empty())\n\t\t\treturn;\n\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select parent\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).deselect_all();\n\t\tstd::for_each(parents.begin(), parents.end(), detail::select(m_document_state.document()));\n\t}\n\n\tvoid on_select_child()\n\t{\n\t\tstd::set<k3d::inode*> children;\n\n\t\tconst k3d::inode_collection::nodes_t& nodes = m_document_state.document().nodes().collection();\n\t\tfor(k3d::inode_collection::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\t// Skip non-parentable nodes\n\t\t\tk3d::iparentable* const parentable = dynamic_cast<k3d::iparentable*>(*node);\n\t\t\tif(!parentable)\n\t\t\t\tcontinue;\n\n\t\t\t// Get parent\n\t\t\tk3d::inode* const parent = boost::any_cast<k3d::inode*>(parentable->parent().property_internal_value());\n\t\t\tif(!parent)\n\t\t\t\tcontinue;\n\n\t\t\tif(selection::state(m_document_state.document()).is_selected(*parent))\n\t\t\t\tchildren.insert(*node);\n\t\t}\n\n\t\tif(children.empty())\n\t\t\treturn;\n\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select child\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).deselect_all();\n\t\tstd::for_each(children.begin(), children.end(), detail::select(m_document_state.document()));\n\t}\n\n\tvoid on_select_sibling()\n\t{\n\t\tstd::set<k3d::inode*> parents;\n\n\t\tconst k3d::inode_collection::nodes_t& nodes = m_document_state.document().nodes().collection();\n\t\tfor(k3d::inode_collection::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\t// Skip unselected nodes\n\t\t\tif(!selection::state(m_document_state.document()).is_selected(**node))\n\t\t\t\tcontinue;\n\n\t\t\t// Skip non-parentable nodes\n\t\t\tk3d::iparentable* const parentable = dynamic_cast<k3d::iparentable*>(*node);\n\t\t\tif(!parentable)\n\t\t\t\tcontinue;\n\n\t\t\t// Get parent\n\t\t\tk3d::inode* const parent = boost::any_cast<k3d::inode*>(parentable->parent().property_internal_value());\n\t\t\tif(!parent)\n\t\t\t\tcontinue;\n\n\t\t\tparents.insert(parent);\n\t\t}\n\n\t\tstd::set<k3d::inode*> siblings;\n\n\t\tfor(k3d::inode_collection::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\t// Skip selected nodes\n\t\t\tif(selection::state(m_document_state.document()).is_selected(**node))\n\t\t\t\tcontinue;\n\n\t\t\t// Skip non-parentable nodes\n\t\t\tk3d::iparentable* const parentable = dynamic_cast<k3d::iparentable*>(*node);\n\t\t\tif(!parentable)\n\t\t\t\tcontinue;\n\n\t\t\t// Get parent\n\t\t\tk3d::inode* const parent = boost::any_cast<k3d::inode*>(parentable->parent().property_internal_value());\n\t\t\tif(!parent)\n\t\t\t\tcontinue;\n\n\t\t\tif(parents.count(parent))\n\t\t\t\tsiblings.insert(*node);\n\t\t}\n\n\t\tif(siblings.empty())\n\t\t\treturn;\n\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select sibling\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).deselect_all();\n\t\tstd::for_each(siblings.begin(), siblings.end(), detail::select(m_document_state.document()));\n\t}\n\n\tvoid on_select_curves()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select Curves\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).set_current_mode(selection::CURVE);\n\t}\n\n\tvoid on_select_patches()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select Patches\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).set_current_mode(selection::PATCH);\n\t}\n\n\tvoid on_select_faces()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select Polygon Faces\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).set_current_mode(selection::FACE);\n\t}\n\n\tvoid on_select_nodes()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select Nodes\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).set_current_mode(selection::NODE);\n\t}\n\n\tvoid on_select_vertices()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select Points\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).set_current_mode(selection::POINT);\n\t}\n\n\tvoid on_select_split_edges()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select Polygon Edges\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).set_current_mode(selection::EDGE);\n\t}\n\n\tvoid on_select_uniform()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select Surface\"), K3D_CHANGE_SET_CONTEXT);\n\t\tselection::state(m_document_state.document()).set_current_mode(selection::SURFACE);\n\t}\n\n\tvoid on_layout_maximize_panel()\n\t{\n\t\treturn_if_fail(m_focus_panel);\n\n\t\tif(m_maximize_panel.internal_value())\n\t\t{\n\t\t\tconst panel_frame::controls panel_frames = detail::get_panel_frames(m_panel_frame);\n\t\t\tfor(panel_frame::controls::const_iterator panel_frame = panel_frames.begin(); panel_frame != panel_frames.end(); ++panel_frame)\n\t\t\t\tif(*panel_frame != m_focus_panel)\n\t\t\t\t\t(*panel_frame)->hide();\n\n\t\t\t// Hide panes containing hidden panels (or panes) only\n\t\t\treturn_if_fail(m_panel_frame.get_children().size() == 1);\n\n\t\t\tGtk::Widget* frame_child = *m_panel_frame.get_children().begin();\n\t\t\thide_panes(frame_child);\n\n\t\t\t// Update menu entry\n\t\t\t//->set_label(\"Show All Panels\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tshow_all_panels();\n\n\t\t\tif(m_hide_unpinned_panels.internal_value())\n\t\t\t\thide_unpinned_panels();\n\n\t\t\t// Update menu entry\n\t\t\t//->set_label(\"Hide Unpinned Panels\");\n\t\t}\n\n\t\tupdate_panel_controls(0);\n\t}\n\n\tvoid on_layout_hide_show_unpinned()\n\t{\n\t\tif(m_hide_unpinned_panels.internal_value())\n\t\t{\n\t\t\thide_unpinned_panels();\n\n\t\t\t// Update menu entry\n\t\t\t//->set_label(\"Show All Panels\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tshow_all_panels();\n\n\t\t\t// Update menu entry\n\t\t\t//->set_label(\"Hide Unpinned Panels\");\n\t\t}\n\n\t\tupdate_panel_controls(0);\n\t}\n\n\tvoid hide_unpinned_panels()\n\t{\n\t\tconst panel_frame::controls panel_frames = detail::get_panel_frames(m_panel_frame);\n\t\tfor(panel_frame::controls::const_iterator panel_frame = panel_frames.begin(); panel_frame != panel_frames.end(); ++panel_frame)\n\t\t\tif(!(*panel_frame)->pinned.internal_value())\n\t\t\t\t(*panel_frame)->hide();\n\n\t\t// Hide panes containing hidden panels (or panes) only\n\t\treturn_if_fail(m_panel_frame.get_children().size() == 1);\n\n\t\tGtk::Widget* frame_child = *m_panel_frame.get_children().begin();\n\t\thide_panes(frame_child);\n\t}\n\n\t/// Recursively hides panes containing only hidden panels (or panes)\n\tbool hide_panes(Gtk::Widget* Widget)\n\t{\n\t\tGtk::Paned* gtk_paned = dynamic_cast<Gtk::Paned*>(Widget);\n\t\tif(gtk_paned)\n\t\t{\n\t\t\tif(!hide_panes(gtk_paned->get_child1()) && !hide_panes(gtk_paned->get_child2()))\n\t\t\t{\n\t\t\t\t// Pane contains only hidden children: hide it\n\t\t\t\tgtk_paned->hide();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tpanel_frame::control* k3d_panel = dynamic_cast<panel_frame::control*>(Widget);\n\t\tif(k3d_panel)\n\t\t\treturn k3d_panel->is_visible();\n\n\t\tassert_not_reached();\n\n\t\treturn false;\n\t}\n\n\tvoid show_all_panels()\n\t{\n\t\treturn_if_fail(m_panel_frame.get_children().size() == 1);\n\n\t\tGtk::Widget* frame_child = *m_panel_frame.get_children().begin();\n\t\tshow_all_panels(frame_child);\n\t}\n\n\t/// Recursively shows all panels and panes\n\tvoid show_all_panels(Gtk::Widget* Widget)\n\t{\n\t\treturn_if_fail(Widget);\n\n\t\tGtk::Paned* gtk_paned = dynamic_cast<Gtk::Paned*>(Widget);\n\t\tif(gtk_paned)\n\t\t{\n\t\t\tshow_all_panels(gtk_paned->get_child1());\n\t\t\tshow_all_panels(gtk_paned->get_child2());\n\t\t}\n\n\t\tWidget->show();\n\t}\n\n\tvoid on_layout_pin_all()\n\t{\n\t\tconst panel_frame::controls panel_frames = detail::get_panel_frames(m_panel_frame);\n\t\tfor(panel_frame::controls::const_iterator panel_frame = panel_frames.begin(); panel_frame != panel_frames.end(); ++panel_frame)\n\t\t\t(*panel_frame)->pinned.set_value(true);\n\t}\n\n\tvoid on_layout_unpin_all()\n\t{\n\t\tconst panel_frame::controls panel_frames = detail::get_panel_frames(m_panel_frame);\n\t\tfor(panel_frame::controls::const_iterator panel_frame = panel_frames.begin(); panel_frame != panel_frames.end(); ++panel_frame)\n\t\t\t(*panel_frame)->pinned.set_value(false);\n\t}\n\n\tvoid on_layout_decorate_panel()\n\t{\n\t\tif(!m_focus_panel)\n\t\t\treturn;\n\n\t\tm_focus_panel->decorations.set_value(true);\n\n\t\tm_layout_decorate_panel->set_sensitive(false);\n\t\tm_layout_undecorate_panel->set_sensitive(true);\n\t}\n\n\tvoid on_layout_undecorate_panel()\n\t{\n\t\tif(!m_focus_panel)\n\t\t\treturn;\n\n\t\tm_focus_panel->decorations.set_value(false);\n\n\t\tm_layout_decorate_panel->set_sensitive(true);\n\t\tm_layout_undecorate_panel->set_sensitive(false);\n\t}\n\n\t/// Moves Panel inside NewPaned, creates, inserts and returns new panel_frame::control\n\tpanel_frame::control* split_panel(panel_frame::control& Panel, Gtk::Paned& NewPaned, const int NewPosition, Gtk::AttachOptions AttachOptions = Gtk::EXPAND)\n\t{\n\t\tif(Panel.get_parent() == &m_panel_frame)\n\t\t{\n\t\t\tNewPaned.get_accessible()->set_name(Panel.get_parent()->get_accessible()->get_name());\n\t\t\t// Move Panel inside NewPaned\n\t\t\tPanel.reparent(NewPaned);\n\t\t\t// Replace Panel with NewPaned\n\t\t\tm_panel_frame.add(NewPaned);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Make sure parent is a Gtk::Paned widget\n\t\t\tGtk::Paned* const parent_paned = dynamic_cast<Gtk::Paned*>(Panel.get_parent());\n\t\t\treturn_val_if_fail(parent_paned, 0);\n\n\t\t\tconst k3d::bool_t horizontal = dynamic_cast<Gtk::HPaned*>(parent_paned) ? true : false;\n\n\t\t\t// Move Panel inside NewPaned, and put NewPaned instead\n\t\t\tif(parent_paned->get_child1() == &Panel)\n\t\t\t{\n\t\t\t\t// Panel is parent_paned's child 1\n\t\t\t\tPanel.reparent(NewPaned);\n\t\t\t\tparent_paned->pack1(NewPaned, Gtk::EXPAND);\n\t\t\t\tif(horizontal)\n\t\t\t\t\tNewPaned.get_accessible()->set_name(\"left\");\n\t\t\t\telse\n\t\t\t\t\tNewPaned.get_accessible()->set_name(\"top\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Panel is parent_paned's child 2\n\t\t\t\tPanel.reparent(NewPaned);\n\t\t\t\tparent_paned->pack2(NewPaned, Gtk::EXPAND);\n\t\t\t\tif(horizontal)\n\t\t\t\t\tNewPaned.get_accessible()->set_name(\"right\");\n\t\t\t\telse\n\t\t\t\t\tNewPaned.get_accessible()->set_name(\"bottom\");\n\t\t\t}\n\t\t}\n\n\t\t// Create new panel and insert it as child 2 (Panel is child 1)\n\t\tpanel_frame::control* const new_panel_frame = create_panel_frame();\n\n\t\tNewPaned.pack2(*manage(new_panel_frame), AttachOptions);\n\t\tNewPaned.set_position(NewPosition);\n\n\t\tNewPaned.show();\n\n\t\tupdate_panel_controls(0);\n\n\t\treturn new_panel_frame;\n\t}\n\n\tvoid on_layout_split_horizontal()\n\t{\n\t\treturn_if_fail(m_focus_panel && m_focus_panel->mounted_panel());\n\n\t\tconst std::string panel_type = m_focus_panel->mounted_panel()->panel_type();\n\t\tpanel_frame::control* new_panel = split_panel(*m_focus_panel, *manage(new Gtk::VPaned), m_focus_panel->get_height() / 2);\n\n\t\tnew_panel->mount_panel(panel_type, true);\n\t\tset_focus_viewport_panel(new_panel);\n\t}\n\n\tvoid on_layout_split_vertical()\n\t{\n\t\treturn_if_fail(m_focus_panel && m_focus_panel->mounted_panel());\n\n\t\tconst std::string panel_type = m_focus_panel->mounted_panel()->panel_type();\n\t\tpanel_frame::control* new_panel = split_panel(*m_focus_panel, *manage(new Gtk::HPaned), m_focus_panel->get_width() / 2);\n\n\t\tnew_panel->mount_panel(panel_type, true);\n\t\tset_focus_viewport_panel(new_panel);\n\t}\n\n\tvoid on_layout_kill_panel()\n\t{\n\t\treturn_if_fail(m_focus_panel);\n\n\t\tif(m_focus_viewport_panel == m_focus_panel)\n\t\t\tunset_focus_viewport_panel();\n\n\t\tGtk::Paned* const old_paned = dynamic_cast<Gtk::Paned*>(m_focus_panel->get_parent());\n\t\treturn_if_fail(old_paned);\n\n\t\tGtk::Container* const old_paned_parent = dynamic_cast<Gtk::Container*>(old_paned->get_parent());\n\t\treturn_if_fail(old_paned_parent);\n\n\t\tGtk::Frame temp_storage;\n\t\told_paned->reparent(temp_storage);\n\n\t\tif(old_paned->get_child1() == m_focus_panel)\n\t\t{\n\t\t\told_paned->get_child2()->reparent(*old_paned_parent);\n\t\t}\n\t\telse\n\t\t{\n\t\t\told_paned->get_child1()->reparent(*old_paned_parent);\n\t\t}\n\n\t\tdelete m_focus_panel;\n\t\tdelete old_paned;\n\n\t\tupdate_panel_controls(0);\n\t}\n\n\tvoid on_layout_save()\n\t{\n\t\tsave_ui_layout();\n\t\tmessage(_(\"Window layout saved.  Your custom layout will be used whenever you open a document.\"));\n\t}\n\n\tvoid on_layout_reset()\n\t{\n\t\tk3d::filesystem::remove(detail::ui_layout_path());\n\t\tmessage(_(\"Window layout reset.  The default layout will be used the next time you open a document.\"));\n\t}\n\n\tvoid on_view_hide_selection()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Hide selection\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\tconst k3d::nodes_t selected_nodes = selection::state(m_document_state.document()).selected_nodes();\n\t\tfor(k3d::nodes_t::const_iterator node = selected_nodes.begin(); node != selected_nodes.end(); ++node)\n\t\t\tnode::hide(**node);\n\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_view_show_selection()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Show selection\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\tconst k3d::nodes_t selected_nodes = selection::state(m_document_state.document()).selected_nodes();\n\t\tfor(k3d::nodes_t::const_iterator node = selected_nodes.begin(); node != selected_nodes.end(); ++node)\n\t\t\tnode::show(**node);\n\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_view_hide_unselected()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Hide unselected\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\tconst k3d::nodes_t& nodes = m_document_state.document().nodes().collection();\n\t\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\tif(!selection::state(m_document_state.document()).is_selected(**node))\n\t\t\t\tnode::hide(**node);\n\t\t}\n\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_view_show_all()\n\t{\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Show all\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\tconst k3d::nodes_t& nodes = m_document_state.document().nodes().collection();\n\t\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t\tnode::show(**node);\n\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_view_aim_selection()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Aim selection\"), K3D_CHANGE_SET_CONTEXT);\n\t\taim_selection(m_document_state, *viewport_control);\n\t}\n\n\tvoid on_view_frame_selection()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Frame selection\"), K3D_CHANGE_SET_CONTEXT);\n\t\tframe_selection(m_document_state, *viewport_control);\n\t}\n\n\tvoid on_view_set_camera()\n\t{\n\t\tviewport::control* const viewport = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport);\n\n\t\tk3d::icamera* const camera = pick_camera(m_document_state, viewport->camera());\n\t\tif(!camera)\n\t\t\treturn;\n\n\t\tviewport->set_camera(camera);\n\t}\n\n\tvoid on_view_toggle_projection()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::icamera* camera = viewport_control->camera();\n\t\tassert_warning(k3d::property::set_internal_value(*camera, \"orthographic\", !boost::any_cast<bool>(k3d::property::pipeline_value(*camera, \"orthographic\"))));\n\t}\n\n\tvoid on_view_set_view(const k3d::signed_axis Axis)\n\t{\n\t\t// Get camera/target distance\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\t\tk3d::icamera* camera = viewport_control->camera();\n\n\t\tconst k3d::matrix4 transform_matrix = boost::any_cast<k3d::matrix4>(k3d::property::pipeline_value(camera->transformation().matrix_source_output()));\n\t\tconst k3d::point3 world_position = transform_matrix * k3d::point3(0, 0, 0);\n\t\tconst k3d::point3 world_target = boost::any_cast<k3d::point3>(camera->world_target().property_internal_value());\n\t\tconst double distance = k3d::distance(world_position, world_target);\n\n\t\tk3d::point3 position;\n\t\tk3d::vector3 look_vector;\n\t\tk3d::vector3 up_vector;\n\t\tk3d::vector3 right_vector;\n\t\tswitch(Axis)\n\t\t{\n\t\t\tcase k3d::PX:\n\t\t\t\tposition = k3d::point3(distance, 0, 0);\n\t\t\t\tlook_vector = k3d::vector3(-1, 0, 0);\n\t\t\t\tup_vector = k3d::vector3(0, 0, 1);\n\t\t\t\tright_vector = k3d::vector3(0, -1, 0);\n\t\t\tbreak;\n\t\t\tcase k3d::NX:\n\t\t\t\tposition = k3d::point3(-distance, 0, 0);\n\t\t\t\tlook_vector = k3d::vector3(1, 0, 0);\n\t\t\t\tup_vector = k3d::vector3(0, 0, 1);\n\t\t\t\tright_vector = k3d::vector3(0, 1, 0);\n\t\t\tbreak;\n\t\t\tcase k3d::PY:\n\t\t\t\tposition = k3d::point3(0, distance, 0);\n\t\t\t\tlook_vector = k3d::vector3(0, -1, 0);\n\t\t\t\tup_vector = k3d::vector3(0, 0, 1);\n\t\t\t\tright_vector = k3d::vector3(1, 0, 0);\n\t\t\tbreak;\n\t\t\tcase k3d::NY:\n\t\t\t\tposition = k3d::point3(0, -distance, 0);\n\t\t\t\tlook_vector = k3d::vector3(0, 1, 0);\n\t\t\t\tup_vector = k3d::vector3(0, 0, 1);\n\t\t\t\tright_vector = k3d::vector3(-1, 0, 0);\n\t\t\tbreak;\n\t\t\tcase k3d::PZ:\n\t\t\t\tposition = k3d::point3(0, 0, distance);\n\t\t\t\tlook_vector = k3d::vector3(0, 0, -1);\n\t\t\t\tup_vector = k3d::vector3(0, -1, 0);\n\t\t\t\tright_vector = k3d::vector3(1, 0, 0);\n\t\t\tbreak;\n\t\t\tcase k3d::NZ:\n\t\t\t\tposition = k3d::point3(0, 0, -distance);\n\t\t\t\tlook_vector = k3d::vector3(0, 0, 1);\n\t\t\t\tup_vector = k3d::vector3(0, 1, 0);\n\t\t\t\tright_vector = k3d::vector3(1, 0, 0);\n\t\t\tbreak;\n\t\t}\n\n\t\tconst k3d::matrix4 view_matrix = k3d::view_matrix(look_vector, up_vector, world_target + position);\n\t\tviewport_control->set_view_matrix(view_matrix);\n\t}\n\n\tvoid on_create_node(k3d::iplugin_factory* const Factory)\n\t{\n\t\tif(cancel_plugin(*Factory))\n\t\t\treturn;\n\n\t\tpipeline::create_node(m_document_state.document(), *Factory);\n\t}\n\n\tvoid on_modify_meshes(k3d::iplugin_factory* Modifier)\n\t{\n\t\tif(cancel_plugin(*Modifier))\n\t\t\treturn;\n\n\t\tmodify_selected_meshes(m_document_state, Modifier);\n\t\tk3d::gl::redraw_all(m_document_state.document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_modify_transformations(k3d::iplugin_factory* Modifier)\n\t{\n\t\tif(cancel_plugin(*Modifier))\n\t\t\treturn;\n\n\t\tk3d::nodes_t selected_nodes = selection::state(m_document_state.document()).selected_nodes();\n\n\t\tk3d::inode* new_modifier;\n\t\tfor(k3d::nodes_t::iterator selected_node = selected_nodes.begin(); selected_node != selected_nodes.end(); ++selected_node)\n\t\t{\n\t\t\tnew_modifier = modify_transformation(m_document_state.document(), **selected_node, Modifier);\n\t\t\tassert_warning(new_modifier);\n\t\t}\n\n\t\t// Show the new modifier properties if only one was processed\n\t\tif(selected_nodes.size() == 1)\n\t\t\tpanel::mediator(m_document_state.document()).set_focus(*new_modifier);\n\n\t\tk3d::gl::redraw_all(m_document_state.document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_scripting_play()\n\t{\n\t\tk3d::filesystem::path filepath;\n\n\t\t// Close file chooser dialog before executing script\n\t\t{\n\t\t\tfile_chooser_dialog dialog(_(\"Play Script:\"), k3d::options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_OPEN);\n\n\t\t\tif(!dialog.get_file_path(filepath))\n\t\t\t\treturn;\n\t\t}\n\n\t\tk3d::filesystem::igzstream file(filepath);\n\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\n\t\texecute_script(file, filepath.native_utf8_string().raw(), context);\n\t}\n\n\tvoid on_scripting_script_editor()\n\t{\n\t\tif(Gtk::Window* const window = k3d::plugin::create<Gtk::Window>(\"NGUITextEditorDialog\"))\n\t\t{\n\t\t\tif(k3d::idocument_sink* const document_sink = dynamic_cast<k3d::idocument_sink*>(window))\n\t\t\t\tdocument_sink->set_document(&document());\n\n\t\t\twindow->set_transient_for(*this);\n\t\t}\n\t}\n\n\tvoid on_scripting_python_shell()\n\t{\n\t\tif(Gtk::Window* const window = k3d::plugin::create<Gtk::Window>(\"NGUIPythonShellDialog\"))\n\t\t{\n\t\t\tif(k3d::idocument_sink* const document_sink = dynamic_cast<k3d::idocument_sink*>(window))\n\t\t\t\tdocument_sink->set_document(&document());\n\n\t\t\twindow->set_transient_for(*this);\n\t\t}\n\t}\n\n\tvoid on_scripting_action(k3d::iplugin_factory* Factory)\n\t{\n\t\tboost::scoped_ptr<k3d::iunknown> plugin(k3d::plugin::create(*Factory));\n\t\tif(!plugin)\n\t\t{\n\t\t\tk3d::log() << error << \"Error creating plugin [\" << (*Factory).name() << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tif(k3d::iscripted_action* const scripted_action = dynamic_cast<k3d::iscripted_action*>(plugin.get()))\n\t\t{\n\t\t\tk3d::iscript_engine::context context;\n\t\t\tcontext[\"command\"] = k3d::string_t(\"action\");\n\t\t\tcontext[\"document\"] = &document();\n\t\t\tscripted_action->execute(context);\n\t\t}\n\t}\n\n\tvoid on_window_fullscreen(k3d::iunknown*)\n\t{\n\t\tif(m_fullscreen.internal_value())\n\t\t\tfullscreen();\n\t\telse\n\t\t\tunfullscreen();\n\t}\n\n\tvoid on_advanced_create_dialog(k3d::iplugin_factory* Factory)\n\t{\n\t\tGtk::Window* const window = k3d::plugin::create<Gtk::Window>(*Factory);\n\t\treturn_if_fail(window);\n\n\t\twindow->set_transient_for(*this);\n\t}\n\n\tvoid on_help_learning_menu()\n\t{\n\t\tGtk::Window* const window = k3d::plugin::create<Gtk::Window>(\"NGUILearningDialog\");\n\t\treturn_if_fail(window);\n\n\t\twindow->set_transient_for(*this);\n\t}\n\n\tvoid on_help_file_bug_report()\n\t{\n\t\tk3d::ngui::uri::open(\"http://www.k-3d.org/wiki/Reporting_Bugs\");\n\t}\n\n\tvoid on_help_open_log_window()\n\t{\n\t\tGtk::Window* const window = k3d::plugin::create<Gtk::Window>(\"NGUILogDialog\");\n\t\treturn_if_fail(window);\n\n\t\twindow->set_transient_for(*this);\n\t}\n\n\tvoid on_help_guide()\n\t{\n\t\tk3d::ngui::uri::open(\"file://\" + (k3d::share_path() / k3d::filesystem::generic_path(\"/guide/html/index.html\")).native_filesystem_string());\n\t}\n\n\tvoid on_help_online()\n\t{\n\t\tk3d::ngui::uri::open(\"http://www.k-3d.org\");\n\t}\n\n\tvoid on_help_release_notes()\n\t{\n\t\tk3d::ngui::uri::open(\"http://www.k-3d.org/wiki/K-3D_\" K3D_VERSION \"_Release_Notes\");\n\t}\n\n\tvoid on_help_about()\n\t{\n\t\tGtk::Window* const window = k3d::plugin::create<Gtk::Window>(\"NGUIAboutDialog\");\n\t\treturn_if_fail(window);\n\n\t\twindow->set_transient_for(*this);\n\t}\n\n\t/// Unparents all selected nodes\n\tvoid on_unparent()\n\t{\n\t\tconst k3d::nodes_t nodes = selection::state(m_document_state.document()).selected_nodes();\n\t\tif(nodes.empty())\n\t\t\treturn;\n\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Unparent selected\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t\tk3d::ngui::unparent(**node);\n\n\t\tselection::state(m_document_state.document()).deselect_all();\n\t\tk3d::gl::redraw_all(m_document_state.document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_render_preview()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::icamera* camera = viewport_control->camera();\n\t\treturn_if_fail(camera);\n\n\t\tk3d::irender_camera_preview* render_engine = viewport_control->camera_preview_engine();\n\t\tif(!render_engine)\n\t\t\trender_engine = pick_camera_preview_render_engine(m_document_state);\n\t\tif(!render_engine)\n\t\t\treturn;\n\n\t\tviewport_control->set_camera(camera);\n\t\tviewport_control->set_camera_preview_engine(render_engine);\n\n\t\trender(*camera, *render_engine);\n\t}\n\n\tvoid on_render_frame()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::icamera* const camera = viewport_control->camera();\n\t\treturn_if_fail(camera);\n\n\t\tk3d::irender_camera_frame* render_engine = viewport_control->camera_still_engine();\n\t\tif(!render_engine)\n\t\t\trender_engine = pick_camera_still_render_engine(m_document_state);\n\t\tif(!render_engine)\n\t\t\treturn;\n\n\t\tviewport_control->set_camera(camera);\n\t\tviewport_control->set_camera_still_engine(render_engine);\n\n\t\trender(*camera, *render_engine);\n\t}\n\n\tvoid on_render_animation()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::icamera* const camera = viewport_control->camera();\n\t\treturn_if_fail(camera);\n\n\t\tk3d::irender_camera_animation* render_engine = viewport_control->camera_animation_engine();\n\t\tif(!render_engine)\n\t\t\trender_engine = pick_camera_animation_render_engine(m_document_state);\n\t\tif(!render_engine)\n\t\t\treturn;\n\n\t\tviewport_control->set_camera(camera);\n\t\tviewport_control->set_camera_animation_engine(render_engine);\n\n\t\trender(m_document_state, *camera, *render_engine);\n\t}\n\n\tvoid on_render_viewport_frame()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::irender_camera_frame* render_engine = dynamic_cast<k3d::irender_camera_frame*>(viewport_control);\n\t\treturn_if_fail(render_engine);\n\n\t\tk3d::icamera* camera = viewport_control->camera();\n\t\tif(!camera)\n\t\t\tcamera = pick_camera(m_document_state);\n\t\tif(!camera)\n\t\t\treturn;\n\n\t\tviewport_control->set_camera(camera);\n\t\trender(*camera, *render_engine);\n\t}\n\n\tvoid on_render_viewport_animation()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::irender_camera_animation* render_engine = dynamic_cast<k3d::irender_camera_animation*>(viewport_control);\n\t\treturn_if_fail(render_engine);\n\n\t\tk3d::icamera* camera = viewport_control->camera();\n\t\tif(!camera)\n\t\t\tcamera = pick_camera(m_document_state);\n\t\tif(!camera)\n\t\t\treturn;\n\n\t\tviewport_control->set_camera(camera);\n\t\trender(m_document_state, *camera, *render_engine);\n\t}\n\n\tvoid on_render_set_viewport_preview_engine()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::irender_camera_preview* const engine = pick_camera_preview_render_engine(m_document_state);\n\t\tif(!engine)\n\t\t\treturn;\n\n\t\tviewport_control->set_camera_preview_engine(engine);\n\t}\n\n\tvoid on_render_set_viewport_still_engine()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::irender_camera_frame* const engine = pick_camera_still_render_engine(m_document_state);\n\t\tif(!engine)\n\t\t\treturn;\n\n\t\tviewport_control->set_camera_still_engine(engine);\n\t}\n\n\tvoid on_render_set_viewport_animation_engine()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::irender_camera_animation* const engine = pick_camera_animation_render_engine(m_document_state);\n\t\tif(!engine)\n\t\t\treturn;\n\n\t\tviewport_control->set_camera_animation_engine(engine);\n\t}\n\n\tvoid on_document_title_changed(k3d::iunknown*)\n\t{\n\t\tk3d::ustring doctitle = boost::any_cast<k3d::ustring>(document().title().property_internal_value());\n\t\tset_title(doctitle.raw() + \" - K-3D\");\n\t\tget_accessible()->set_name(doctitle.raw());\n\t}\n\n\tvoid on_panel_focus_changed(panel_frame::control* Panel)\n\t{\n\t\tif(m_focus_panel == Panel)\n\t\t\treturn;\n\n\t\tm_focus_panel = Panel;\n\n\t\tif(Panel)\n\t\t{\n\t\t\tset_focus_viewport_panel(Panel);\n\n\t\t\tconst bool decorated = Panel->decorations.internal_value();\n\t\t\tm_layout_decorate_panel->set_sensitive(!decorated);\n\t\t\tm_layout_undecorate_panel->set_sensitive(decorated);\n\t\t}\n\n\t\tupdate_panel_controls(0);\n\t}\n\n\tvoid update_panel_controls(k3d::iunknown*)\n\t{\n\t\tunsigned long panel_count = 0;\n\t\tunsigned long pinned_count = 0;\n\t\tunsigned long visible_count = 0;\n\n\t\tconst panel_frame::controls panel_frames = detail::get_panel_frames(m_panel_frame);\n\t\tfor(panel_frame::controls::const_iterator panel_frame = panel_frames.begin(); panel_frame != panel_frames.end(); ++panel_frame)\n\t\t{\n\t\t\t// Ensure that the focus viewport defaults to any available viewport ...\n\t\t\tif(!m_focus_viewport_panel)\n\t\t\t\tset_focus_viewport_panel(*panel_frame);\n\n\t\t\t++panel_count;\n\n\t\t\tif((*panel_frame)->pinned.internal_value())\n\t\t\t\t++pinned_count;\n\n\t\t\tif((*panel_frame)->is_visible())\n\t\t\t\t++visible_count;\n\t\t}\n\n\t\tm_layout_pin_all->set_sensitive(panel_count != pinned_count);\n\t\tm_layout_unpin_all->set_sensitive(pinned_count);\n\t\tm_layout_split_horizontal->set_sensitive(m_focus_panel);\n\t\tm_layout_split_vertical->set_sensitive(m_focus_panel);\n\t\tm_layout_kill_panel->set_sensitive((panel_count > 1) && m_focus_panel);\n\t}\n\n\tvoid save_ui_layout()\n\t{\n\t\tk3d::xml::element xml_document(\"ui_layout\");\n\n\t\t// Save window's parameters\n\t\txml_document.append(k3d::xml::attribute(\"fullscreen\", m_fullscreen.internal_value()));\n\t\tint width;\n\t\tint height;\n\t\tget_size(width, height);\n\t\txml_document.append(k3d::xml::attribute(\"window_width\", width));\n\t\txml_document.append(k3d::xml::attribute(\"window_height\", height));\n\t\tint root_x;\n\t\tint root_y;\n\t\tget_position(root_x, root_y);\n\t\txml_document.append(k3d::xml::attribute(\"position_x\", root_x));\n\t\txml_document.append(k3d::xml::attribute(\"position_y\", root_y));\n\n\t\treturn_if_fail(m_panel_frame.get_children().size() == 1);\n\t\tGtk::Widget* frame_child = *m_panel_frame.get_children().begin();\n\n\t\t// Save panel frame\n\t\tk3d::xml::element& xml_panel_frame = xml_document.append(k3d::xml::element(\"panel_frame\"));\n\t\tsave_ui_container(frame_child, xml_panel_frame);\n\n\t\tk3d::filesystem::ofstream stream(detail::ui_layout_path());\n\t\tstream << xml_document;\n\t}\n\n\tbool load_ui_layout()\n\t{\n\t\tif(!application_state::instance().custom_layouts())\n\t\t\treturn false;\n\n\t\tconst k3d::filesystem::path layout_path = detail::ui_layout_path();\n\t\tif(!k3d::filesystem::exists(layout_path))\n\t\t\treturn false;\n\n\t\tk3d::xml::element xml_layout;\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Loading UI layout from \" << layout_path.native_console_string() << std::endl;\n\n\t\t\t// Find layout\n\t\t\tk3d::filesystem::ifstream layout_stream(layout_path);\n\t\t\tlayout_stream >> xml_layout;\n\t\t\tassert_warning(xml_layout.name == \"ui_layout\");\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << \"Error loading UI layout from \" << layout_path.native_console_string() << std::endl;\n\t\t\treturn false;\n\t\t}\n\n\t\t// Set window's values\n\t\tconst bool fullscreen = k3d::xml::attribute_value<bool>(xml_layout, \"fullscreen\", false);\n\t\tm_fullscreen.set_value(fullscreen);\n\t\tconst int window_width = k3d::xml::attribute_value<int>(xml_layout, \"window_width\", 0);\n\t\tconst int window_height = k3d::xml::attribute_value<int>(xml_layout, \"window_height\", 0);\n\t\tif(window_width && window_height)\n\t\t\tset_default_size(window_width, window_height);\n\t\tconst int root_x = k3d::xml::attribute_value<int>(xml_layout, \"position_x\", 0);\n\t\tconst int root_y = k3d::xml::attribute_value<int>(xml_layout, \"position_y\", 0);\n\t\tmove(root_x, root_y);\n\n\t\t// Load panel frame\n\t\tk3d::xml::element* xml_panel = find_element(xml_layout, \"panel_frame\");\n\t\treturn_val_if_fail(xml_panel, false);\n\n\t\treturn load_ui_container(*xml_panel);\n\t}\n\n\tvoid save_ui_container(Gtk::Widget* Widget, k3d::xml::element& Document)\n\t{\n\t\tGtk::Paned* gtk_paned = dynamic_cast<Gtk::Paned*>(Widget);\n\t\tif(gtk_paned)\n\t\t{\n\t\t\tk3d::xml::element& xml_paned = Document.append(k3d::xml::element(\"paned\"));\n\t\t\tstd::string paned_type = \"\";\n\n\t\t\tif(dynamic_cast<Gtk::HPaned*>(gtk_paned))\n\t\t\t\tpaned_type = \"hpaned\";\n\t\t\telse if(dynamic_cast<Gtk::VPaned*>(gtk_paned))\n\t\t\t\tpaned_type = \"vpaned\";\n\t\t\telse\n\t\t\t\tassert_not_reached();\n\n\t\t\txml_paned.append(k3d::xml::attribute(\"type\", paned_type));\n\t\t\txml_paned.append(k3d::xml::attribute(\"position\", gtk_paned->get_position()));\n\n\t\t\tsave_ui_container(gtk_paned->get_child1(), xml_paned);\n\t\t\tsave_ui_container(gtk_paned->get_child2(), xml_paned);\n\n\t\t\treturn;\n\t\t}\n\n\t\tpanel_frame::control* k3d_panel = dynamic_cast<panel_frame::control*>(Widget);\n\t\tif(k3d_panel)\n\t\t{\n\t\t\tk3d_panel->save(Document);\n\n\t\t\treturn;\n\t\t}\n\n\t\tassert_not_reached();\n\t}\n\n\t// Loads UI, returns false iff main panel could load\n\tbool load_ui_container(k3d::xml::element& Element)\n\t{\n\t\tk3d::xml::element* xml_panel = find_element(Element, \"paned\");\n\t\tif(!xml_panel)\n\t\t\txml_panel = find_element(Element, \"panel\");\n\n\t\treturn_val_if_fail(xml_panel, false);\n\n\t\t// Load main panel\n\t\tGtk::Widget* main_panel = load_panel(*xml_panel);\n\t\tif(main_panel)\n\t\t{\n\t\t\tif(Gtk::Widget* frame_child = m_panel_frame.get_child())\n\t\t\t{\n\t\t\t\tm_panel_frame.remove();\n\t\t\t\tdelete frame_child;\n\t\t\t}\n\n\t\t\tm_panel_frame.set_shadow_type(Gtk::SHADOW_NONE);\n\t\t\tm_panel_frame.add(*Gtk::manage(main_panel));\n\n\t\t\tupdate_panel_controls(0);\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tGtk::Widget* load_panel(k3d::xml::element& Paned)\n\t{\n\t\t// Load panel ...\n\t\tif(\"panel\" == Paned.name)\n\t\t{\n\t\t\tpanel_frame::control* const new_panel_frame = create_panel_frame();\n\t\t\tnew_panel_frame->load(Paned);\n\n\t\t\tif(new_panel_frame->is_visible())\n\t\t\t\tnew_panel_frame->show();\n\n\t\t\treturn new_panel_frame;\n\t\t}\n\n\t\t// ... else load paned\n\t\treturn_val_if_fail(\"paned\" == Paned.name, 0);\n\t\treturn_val_if_fail(Paned.children.size(), 0);\n\n\t\tstd::string type = attribute_text(Paned, \"type\");\n\t\tGtk::Paned* new_paned = 0;\n\t\tif(\"hpaned\" == type)\n\t\t\tnew_paned = Gtk::manage(new Gtk::HPaned);\n\t\telse if(\"vpaned\" == type)\n\t\t\tnew_paned = Gtk::manage(new Gtk::VPaned);\n\t\telse\n\t\t{\n\t\t\tassert_not_reached();\n\t\t\tk3d::log() << error << \"Unknowned Gtk::Paned type : \" << type << std::endl;\n\t\t\treturn 0;\n\t\t}\n\t\tnew_paned->set_position(k3d::xml::attribute_value<int>(Paned, \"position\", 0));\n\n\t\t// Load paned children\n\t\tk3d::xml::element& child1 = *Paned.children.begin();\n\t\tnew_paned->pack1(*load_panel(child1), Gtk::EXPAND);\n\t\tif(new_paned->get_child1()->is_visible())\n\t\t\tnew_paned->show();\n\n\t\tif(Paned.children.size() > 1)\n\t\t{\n\t\t\tk3d::xml::element& child2 = *(Paned.children.begin() + 1);\n\t\t\tnew_paned->pack2(*load_panel(child2), Gtk::EXPAND);\n\t\t\tif(new_paned->get_child2()->is_visible())\n\t\t\t\tnew_paned->show();\n\t\t}\n\n\t\treturn new_paned;\n\t}\n\n\tbool on_key_press_event(GdkEventKey* event)\n\t{\n\t\tif(event->keyval == GDK_Escape)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn base::on_key_press_event(event);\n\t}\n\n\tbool on_button_press_event(GdkEventButton* event)\n\t{\n\t\treturn base::on_button_press_event(event);\n\t}\n\n\tvoid update_undo_redo_controls()\n\t{\n\t\tk3d::istate_recorder& state_recorder = document().state_recorder();\n\t\tconst k3d::istate_recorder::node* const current_node = state_recorder.current_node();\n\t\tconst k3d::istate_recorder::node* const redo_node = next_redo(state_recorder);\n\n\t\t// Setup the undo menu item ...\n\t\tif(current_node)\n\t\t{\n\t\t\tget_label(*m_undo_menu_item)->set_text(k3d::string_cast(boost::format(_(\"Undo %1%\")) % current_node->label));\n\t\t\tm_undo_menu_item->set_sensitive(true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tget_label(*m_undo_menu_item)->set_text(_(\"Can't undo\"));\n\t\t\tm_undo_menu_item->set_sensitive(false);\n\t\t}\n\n\t\t// Setup the undo-all menu item\n\t\tif(current_node && current_node->parent && (current_node->label == current_node->parent->label))\n\t\t{\n\t\t\tget_label(*m_undo_all_menu_item)->set_text(k3d::string_cast(boost::format(_(\"Undo all %1%\")) % current_node->label));\n\t\t\tm_undo_all_menu_item->set_sensitive(true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tget_label(*m_undo_all_menu_item)->set_text(_(\"Can't undo all\"));\n\t\t\tm_undo_all_menu_item->set_sensitive(false);\n\t\t}\n\n\t\t// Setup the redo menu items ...\n\t\tif(redo_node)\n\t\t{\n\t\t\tget_label(*m_redo_menu_item)->set_text(k3d::string_cast(boost::format(_(\"Redo %1%\")) % redo_node->label));\n\t\t\tm_redo_menu_item->set_sensitive(true);\n\t\t\tget_label(*m_redo_all_menu_item)->set_text(k3d::string_cast(boost::format(_(\"Redo all %1%\")) % redo_node->label));\n\t\t\tm_redo_all_menu_item->set_sensitive(true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tget_label(*m_redo_menu_item)->set_text(_(\"Can't redo\"));\n\t\t\tm_redo_menu_item->set_sensitive(false);\n\t\t\tget_label(*m_redo_all_menu_item)->set_text(_(\"Can't redo all\"));\n\t\t\tm_redo_all_menu_item->set_sensitive(false);\n\t\t}\n\t}\n\n\tconst bool unsaved_changes()\n\t{\n\t\treturn document().state_recorder().last_saved_node() != document().state_recorder().current_node();\n\t}\n\n\tconst std::string unsaved_document_title()\n\t{\n\t\treturn boost::any_cast<k3d::ustring>(document().title().property_internal_value()).raw();\n\t}\n\n\tconst bool save_unsaved_changes()\n\t{\n\t\treturn on_file_save();\n\t}\n\n\t// Saves focus viewport and updates document_state\n\tvoid set_focus_viewport_panel(panel_frame::control* Panel)\n\t{\n\t\tviewport::control* const viewport_control = dynamic_cast<viewport::control*>(Panel->mounted_panel());\n\t\tif(!viewport_control)\n\t\t\treturn;\n\n\t\tm_focus_viewport_panel = Panel;\n\t\tm_document_state.set_focus_viewport(viewport_control);\n\n\t\t// Highlight focused viewport\n\t\tconst panel_frame::controls panel_frames = detail::get_panel_frames(m_panel_frame);\n\t\tfor(panel_frame::controls::const_iterator panel_frame = panel_frames.begin(); panel_frame != panel_frames.end(); ++panel_frame)\n\t\t{\n\t\t\tif(!dynamic_cast<viewport::control*>((*panel_frame)->mounted_panel()))\n\t\t\t\tcontinue;\n\n\t\t\tif(*panel_frame == Panel)\n\t\t\t\t(*panel_frame)->set_bg_color(Gdk::Color(\"blue\"));\n\t\t\telse\n\t\t\t\t(*panel_frame)->unset_bg_color();\n\t\t}\n\t}\n\n\tvoid unset_focus_viewport_panel()\n\t{\n\t\tm_focus_viewport_panel = 0;\n\t\tm_document_state.set_focus_viewport(0);\n\t}\n\n\t/// Keeps track of the count of open document windows\n\tstatic unsigned long m_count;\n\n\t/// Stores the Edit > Undo menu item\n\tstd::unique_ptr<Gtk::ImageMenuItem> m_undo_menu_item;\n\t/// Stores the Edit > Undo All menu item\n\tstd::unique_ptr<Gtk::ImageMenuItem> m_undo_all_menu_item;\n\t/// Stores the Edit > Redo menu item\n\tstd::unique_ptr<Gtk::ImageMenuItem> m_redo_menu_item;\n\t/// Stores the Edit > Redo All menu item\n\tstd::unique_ptr<Gtk::ImageMenuItem> m_redo_all_menu_item;\n\t/// Set to true iff current panel was maximized\n\tk3d_data(bool, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_maximize_panel;\n\t/// Set to true iff unpinned panels are hidden\n\tk3d_data(bool, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_hide_unpinned_panels;\n\t/// Set to true iff the window is displayed fullscreen\n\tk3d_data(bool, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_fullscreen;\n\t/// Stores a signal for notifying observers when the panel focus changes\n\tpanel_frame::control::panel_focus_signal_t m_panel_focus_signal;\n\t/// Keeps track of the currently focused panel\n\tpanel_frame::control* m_focus_panel;\n\t/// Keeps track of the last-focused viewport panel\n\tpanel_frame::control* m_focus_viewport_panel;\n\t/// Stores the root container for panels\n\tGtk::Frame m_panel_frame;\n\n\tcheck_menu_item::control* m_layout_maximize_panel;\n\tcheck_menu_item::control* m_layout_hide_unpinned;\n\tGtk::MenuItem* m_layout_pin_all;\n\tGtk::MenuItem* m_layout_unpin_all;\n\tGtk::MenuItem* m_layout_decorate_panel;\n\tGtk::MenuItem* m_layout_undecorate_panel;\n\tGtk::MenuItem* m_layout_split_horizontal;\n\tGtk::MenuItem* m_layout_split_vertical;\n\tGtk::MenuItem* m_layout_kill_panel;\n\n\t/// Stores document-wide state to be shared with the rest of the UI\n\tdocument_state& m_document_state;\n};\n\nunsigned long main_document_window::m_count = 0;\n\n/////////////////////////////////////////////////////////////////////////////\n// create_main_document_window\n\nvoid create_main_document_window(document_state& DocumentState)\n{\n\tnew main_document_window(DocumentState);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/main_document_window.h",
    "content": "#ifndef K3DSDK_NGUI_MAIN_DOCUMENT_WINDOW_H\n#define K3DSDK_NGUI_MAIN_DOCUMENT_WINDOW_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\n/// Create a new main document window, attaching it to the given document\nvoid create_main_document_window(document_state& DocumentState);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_MAIN_DOCUMENT_WINDOW_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/menus.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/menus.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/string_cast.h>\n\n#include <gtkmm/accellabel.h>\n#include <gtkmm/box.h>\n#include <gtkmm/image.h>\n#include <gtkmm/imagemenuitem.h>\n\n#include <boost/format.hpp>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\nconst std::string plugin_factory_markup(k3d::iplugin_factory& Factory)\n{\n\tstd::string markup;\n\n\tif(k3d::iplugin_factory::EXPERIMENTAL == Factory.quality())\n\t{\n\t\tmarkup = k3d::string_cast(boost::format(_(\"<span color=\\\"blue\\\">%1% (Experimental)</span>\")) % Factory.name());\n\t}\n\telse if(k3d::iplugin_factory::DEPRECATED == Factory.quality())\n\t{\n\t\tmarkup = k3d::string_cast(boost::format(_(\"<span color=\\\"red\\\" strikethrough=\\\"true\\\">%1%</span><span color=\\\"red\\\"> (Deprecated)</span>\")) % Factory.name());\n\t}\n\telse\n\t{\n\t\tmarkup = Factory.name();\n\t}\n\n\treturn markup;\n}\n\n} // namespace detail\n\nGtk::ImageMenuItem* create_menu_item(k3d::iplugin_factory& Factory)\n{\n\tGtk::Image* const image = new Gtk::Image(quiet_load_icon(Factory.name(), Gtk::ICON_SIZE_MENU));\n\n\tGtk::ImageMenuItem* const menu_item =\n\t\tnew Gtk::ImageMenuItem(\n\t\t\t*Gtk::manage(image),\n\t\t\t\"\",\n\t\t\ttrue)\n\t\t<< set_tooltip(Factory.short_description());\n\n\tget_label(*menu_item)->set_markup(detail::plugin_factory_markup(Factory));\n\n\treturn menu_item;\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/menus.h",
    "content": "#ifndef K3DSDK_NGUI_MENUS_H\n#define K3DSDK_NGUI_MENUS_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <string>\n\nnamespace k3d { class iplugin_factory; }\nnamespace Gtk { class ImageMenuItem; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/// Creates a menu item based on a plugin type\nGtk::ImageMenuItem* create_menu_item(k3d::iplugin_factory& Factory);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_MENUS_H\n"
  },
  {
    "path": "k3dsdk/ngui/merge_nodes.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/persistent_lookup.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/serialization_xml.h>\n#include <k3dsdk/xml.h>\n\n#include <gtkmm/dialog.h>\n#include <gtkmm/entry.h>\n#include <gtkmm/label.h>\n#include <gtkmm/liststore.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/stock.h>\n#include <gtkmm/table.h>\n#include <gtkmm/treeview.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace merge_nodes\n{\n\nnamespace detail\n{\n\n// Merge nodes UI\nstruct node_check_t\n{\n\tnode_check_t(const std::string& Name) :\n\t\tname(Name)\n\t{\n\t}\n\n\tstd::string name;\n\tbool check;\n};\n\ntypedef std::vector<node_check_t> document_nodes_t;\n\nclass merge_nodes_dialog :\n\tpublic Gtk::Dialog\n{\n\ttypedef Gtk::Dialog base;\n\npublic:\n\tmerge_nodes_dialog(document_nodes_t& DocumentNodes, std::string& NodePrefix) :\n\t\tbase(\"Choose Nodes to Merge:\", true),\n\t\tm_document_nodes(DocumentNodes),\n\t\tm_node_prefix(NodePrefix),\n\t\tm_property_table(1, 4, false),\n\t\tm_check_all_button(_(\"Check All\")),\n\t\tm_clear_selection_button(_(\"Clear Selection\")),\n\t\tm_prefix_label(_(\"Node prefix :\"))\n\t{\n\t\tm_model = Gtk::ListStore::create(m_nodes);\n\t\tfor(document_nodes_t::const_iterator node = DocumentNodes.begin(); node != DocumentNodes.end(); ++node)\n\t\t{\n\t\t\tGtk::TreeRow row = *(m_model->append());\n\t\t\treturn_if_fail(row);\n\n\t\t\trow[m_nodes.name] = node->name;\n\t\t\trow[m_nodes.check] = false;\n\t\t}\n\n\t\tm_treeview.set_model(m_model);\n\t\tm_treeview.append_column_editable(_(\"Merge?\"), m_nodes.check);\n\t\tm_treeview.append_column_editable(_(\"Node\"), m_nodes.name);\n\n\t\tm_scrolled_window.add(m_treeview);\n\t\tm_scrolled_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\n\t\t// Setup dialog\n\t\tset_default_size(500, 350);\n\t\tset_border_width(5);\n\n\t\tget_vbox()->pack_start(m_scrolled_window, Gtk::PACK_EXPAND_WIDGET);\n\n\t\tm_property_table.attach(m_check_all_button, 0, 1, 0, 1, Gtk::EXPAND, Gtk::SHRINK);\n\t\tm_property_table.attach(m_clear_selection_button, 1, 2, 0, 1, Gtk::EXPAND, Gtk::SHRINK);\n\t\tm_property_table.attach(m_prefix_label, 2, 3, 0, 1, Gtk::EXPAND, Gtk::SHRINK);\n\t\tm_property_table.attach(m_prefix_entry, 3, 4, 0, 1, Gtk::EXPAND, Gtk::SHRINK);\n\n\t\tget_vbox()->pack_start(m_property_table, Gtk::PACK_SHRINK);\n\n\t\tadd_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);\n\t\tadd_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);\n\n\t\tset_position(Gtk::WIN_POS_CENTER);\n\t\tshow_all();\n\n\t\tm_check_all_button.signal_clicked().connect(sigc::mem_fun(*this, &merge_nodes_dialog::on_check_all));\n\t\tm_clear_selection_button.signal_clicked().connect(sigc::mem_fun(*this, &merge_nodes_dialog::on_clear_selection));\n\t\tm_prefix_entry.signal_key_release_event().connect(sigc::mem_fun(*this, &merge_nodes_dialog::on_update_prefix));\n\t}\n\nprivate:\n\tvoid on_response(int ID)\n\t{\n\t\tif(Gtk::RESPONSE_OK == ID)\n\t\t{\n\t\t\tGtk::TreeNodeChildren rows = m_model->children();\n\t\t\tdocument_nodes_t::iterator node = m_document_nodes.begin();\n\t\t\tfor(Gtk::TreeNodeChildren::const_iterator row = rows.begin(); row != rows.end(); ++row)\n\t\t\t{\n\t\t\t\treturn_if_fail(node != m_document_nodes.end());\n\n\t\t\t\tnode->check = (*row)[m_nodes.check];\n\t\t\t\t++node;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_check_all()\n\t{\n\t\tGtk::TreeNodeChildren rows = m_model->children();\n\t\tfor(Gtk::TreeNodeChildren::const_iterator row = rows.begin(); row != rows.end(); ++row)\n\t\t\t(*row)[m_nodes.check] = true;\n\t}\n\n\tvoid on_clear_selection()\n\t{\n\t\tGtk::TreeNodeChildren rows = m_model->children();\n\t\tfor(Gtk::TreeNodeChildren::const_iterator row = rows.begin(); row != rows.end(); ++row)\n\t\t\t(*row)[m_nodes.check] = false;\n\t}\n\n\tbool on_update_prefix(GdkEventKey* Event)\n\t{\n\t\tm_node_prefix = m_prefix_entry.get_text();\n\n\t\treturn true;\n\t}\n\n\tdocument_nodes_t& m_document_nodes;\n\tstd::string& m_node_prefix;\n\n\tGlib::RefPtr<Gtk::ListStore> m_model;\n\tGtk::TreeView m_treeview;\n\tGtk::ScrolledWindow m_scrolled_window;\n\n\tGtk::Table m_property_table;\n\tGtk::Button m_check_all_button;\n\tGtk::Button m_clear_selection_button;\n\tGtk::Label m_prefix_label;\n\tGtk::Entry m_prefix_entry;\n\n\tclass columns_t :\n\t\tpublic Gtk::TreeModelColumnRecord\n\t{\n\tpublic:\n\t\tcolumns_t()\n\t\t{\n\t\t\tadd(name);\n\t\t\tadd(check);\n\t\t}\n\n\t\tGtk::TreeModelColumn<Glib::ustring> name;\n\t\tGtk::TreeModelColumn<bool> check;\n\t};\n\tcolumns_t m_nodes;\n};\n\n} // namespace detail\n\nvoid merge_nodes(k3d::idocument& Document)\n{\n\tk3d::filesystem::path document_path;\n\n\t{\n\t\tfile_chooser_dialog dialog(_(\"Merge K-3D Document:\"), k3d::options::path::documents(), Gtk::FILE_CHOOSER_ACTION_OPEN);\n\t\tdialog.add_pattern_filter(_(\"K-3D Document (*.k3d)\"), \"*.k3d\");\n\t\tdialog.add_all_files_filter();\n\n\t\tif(!dialog.get_file_path(document_path))\n\t\t\treturn;\n\t}\n\n\t// Check for a K-3D document\n\tk3d::xml::element xml(\"k3dml\");\n\ttry\n\t{\n\t\tk3d::filesystem::ifstream stream(document_path);\n\t\tk3d::xml::hide_progress progress;\n\t\tparse(xml, stream, document_path.native_utf8_string().raw(), progress);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tk3d::log() << error << e.what() << std::endl;\n\t\treturn;\n\t}\n\n\treturn_if_fail(xml.name == \"k3dml\");\n\n\t// Synchronize older documents\n\tk3d::xml::upgrade_document(xml);\n\n\t// Setup context\n\tconst k3d::filesystem::path root_path = document_path.branch_path();\n\tk3d::persistent_lookup persistent_lookup;\n\tk3d::ipersistent::load_context context(root_path, persistent_lookup);\n\n\t// Get document node list\n\tk3d::xml::element* const xml_document = k3d::xml::find_element(xml, \"document\");\n\treturn_if_fail(xml_document);\n\n\tk3d::xml::element* xml_nodes = k3d::xml::find_element(*xml_document, \"nodes\");\n\tif(!xml_nodes)\n\t\txml_nodes = k3d::xml::find_element(*xml_document, \"objects\");\n\n\treturn_if_fail(xml_nodes);\n\n\tif(xml_nodes->name != \"nodes\")\n\t\tk3d::log() << warning << \"Loading data from obsolete <\" << xml_nodes->name << \"> tag ... re-save document to eliminate this warning\" << std::endl;\n\n\tdetail::document_nodes_t document_nodes;\n\tfor(k3d::xml::element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\" && xml_node->name != \"object\")\n\t\t\tcontinue;\n\n\t\tif(k3d::xml::attribute_value<bool>(*xml_node, \"do_not_load\", false))\n\t\t\tcontinue;\n\n\t\tconst std::string name = k3d::xml::attribute_text(*xml_node, \"name\");\n\t\tdocument_nodes.push_back(detail::node_check_t(name));\n\t}\n\n\t// Run node list UI\n\tstd::string node_prefix = \"\";\n\t{\n\t\tdetail::merge_nodes_dialog dialog(document_nodes, node_prefix);\n\t\tif(Gtk::RESPONSE_OK != dialog.run())\n\t\t\treturn;\n\t}\n\n\t// Load checked nodes\n\tk3d::inode_collection::nodes_t nodes;\n\tstd::vector<k3d::ipersistent*> persistent_nodes;\n\tstd::vector<k3d::xml::element*> node_storage;\n\n\tdetail::document_nodes_t::const_iterator user_node = document_nodes.begin();\n\tfor(k3d::xml::element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node, ++user_node)\n\t{\n\t\treturn_if_fail(user_node != document_nodes.end());\n\n\t\tif(xml_node->name != \"node\" && xml_node->name != \"object\")\n\t\t\tcontinue;\n\n\t\tif(k3d::xml::attribute_value<bool>(*xml_node, \"do_not_load\", false))\n\t\t\tcontinue;\n\n\t\tif(xml_node->name != \"node\")\n\t\t\tk3d::log() << warning << \"Loading data from obsolete <\" << xml_node->name << \"> tag ... re-save document to eliminate this warning\" << std::endl;\n\n\t\tconst std::string name = attribute_text(*xml_node, \"name\");\n\t\treturn_if_fail(name == user_node->name);\n\n\t\t// Skip unchecked nodes\n\t\tif(!user_node->check)\n\t\t\tcontinue;\n\n\t\tconst k3d::uuid factory_id = k3d::xml::attribute_value<k3d::uuid>(*xml_node, \"factory\", k3d::uuid::null());\n\t\tif(factory_id == k3d::uuid::null())\n\t\t{\n\t\t\tk3d::log() << error << \"node [\" << name << \"] with unspecified factory ID will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst k3d::ipersistent_lookup::id_type node_id = k3d::xml::attribute_value<k3d::ipersistent_lookup::id_type>(*xml_node, \"id\", 0);\n\t\tif(node_id == 0)\n\t\t{\n\t\t\tk3d::log() << error << \"node [\" << name << \"] with unspecified ID will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tk3d::iplugin_factory* const plugin_factory = k3d::plugin::factory::lookup(factory_id);\n\t\tif(!plugin_factory)\n\t\t{\n\t\t\tk3d::log() << error << \"node [\" << name << \"] with unknown factory ID [\" << factory_id << \"] will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tk3d::idocument_plugin_factory* const document_plugin_factory = dynamic_cast<k3d::idocument_plugin_factory*>(plugin_factory);\n\t\tif(!document_plugin_factory)\n\t\t{\n\t\t\tk3d::log() << error << \"Non-document plugin [\" << name << \"] will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tk3d::inode* const node = document_plugin_factory->create_plugin(*plugin_factory, Document);\n\t\tif(!node)\n\t\t{\n\t\t\tk3d::log() << error << \"Error creating node [\" << name << \"] instance\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tk3d::ipersistent* const persistent = dynamic_cast<k3d::ipersistent*>(node);\n\t\tif(!persistent)\n\t\t{\n\t\t\tk3d::log() << error << \"node [\" << name << \"] does not support persistence\" << std::endl;\n\n\t\t\tdelete node;\n\t\t\tcontinue;\n\t\t}\n\n\t\tk3d::undoable_new(node, Document);\n\n\t\tnodes.push_back(node);\n\t\tpersistent_nodes.push_back(persistent);\n\t\tnode_storage.push_back(&(*xml_node));\n\n\t\tpersistent_lookup.insert_lookup(node_id, node);\n\t}\n\n\tDocument.nodes().add_nodes(nodes);\n\n\tfor(unsigned long i = 0; i != persistent_nodes.size(); ++i)\n\t{\n\t\tpersistent_nodes[i]->load(*node_storage[i], context);\n\t\tif(node_prefix.size())\n\t\t{\n\t\t\tk3d::inode* node = dynamic_cast<k3d::inode*>(persistent_nodes[i]);\n\t\t\tif(node)\n\t\t\t\tnode->set_name(node_prefix + node->name());\n\t\t}\n\t}\n\n\tk3d::xml::load_pipeline(Document, *xml_document, context);\n}\n\n} // namespace merge_nodes\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/merge_nodes.h",
    "content": "#ifndef K3DSDK_NGUI_MERGE_NODES_H\n#define K3DSDK_NGUI_MERGE_NODES_H\n\n// K-3D\n// Copyright (c) 2005, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n// Forward declarations\nnamespace k3d { class idocument; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace merge_nodes\n{\n\nvoid merge_nodes(k3d::idocument& Document);\n\n} // namespace merge_nodes\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_MERGE_NODES_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/messages.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n\n#include <k3dsdk/ngui/application_state.h>\n#include <k3dsdk/ngui/options.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3dsdk/batch_mode.h>\n\n#include <gtkmm/alignment.h>\n#include <gtkmm/checkbutton.h>\n#include <gtkmm/label.h>\n#include <gtkmm/messagedialog.h>\n#include <gtkmm/stock.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nvoid message(const std::string& Message, const std::string& SecondaryMessage)\n{\n\tif(batch_mode())\n\t\treturn;\n\n\tGtk::MessageDialog dialog(Message, false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK, true);\n\tif(!SecondaryMessage.empty())\n\t\tdialog.set_secondary_text(SecondaryMessage);\n\tdialog.run();\n}\n\nvoid warning_message(const std::string& Message, const std::string& SecondaryMessage)\n{\n\tif(batch_mode())\n\t\treturn;\n\n\tGtk::MessageDialog dialog(Message, false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, true);\n\tif(!SecondaryMessage.empty())\n\t\tdialog.set_secondary_text(SecondaryMessage);\n\tdialog.run();\n}\n\nvoid error_message(const std::string& Message, const std::string& SecondaryMessage)\n{\n\tif(batch_mode())\n\t\treturn;\n\n\tGtk::MessageDialog dialog(Message, false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);\n\tif(!SecondaryMessage.empty())\n\t\tdialog.set_secondary_text(SecondaryMessage);\n\tdialog.run();\n}\n\nunsigned int query_message(const std::string& Message, const unsigned int DefaultOption, const std::vector<std::string>& Options)\n{\n\treturn_val_if_fail(!batch_mode(), 0);\n\n\tGtk::MessageDialog dialog(Message, false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE, true);\n\n\tfor(unsigned long i = 0; i != Options.size(); ++i)\n\t\tdialog.add_button(Options[i], i+1);\n\n\tif(DefaultOption)\n\t\tdialog.set_default_response(DefaultOption-1);\n\telse\n\t\tdialog.set_default_response(Options.size());\n\n\tdialog.set_position(Gtk::WIN_POS_CENTER);\n\n\tdialog.show_all();\n\tint result = dialog.run();\n\tif(Gtk::RESPONSE_DELETE_EVENT == result)\n\t\tresult = 0;\n\n\treturn result;\n}\n\nvoid nag_message(const std::string& Type, const k3d::ustring& Message, const k3d::ustring& SecondaryMessage)\n{\n\tif(batch_mode())\n\t\treturn;\n\n\tif(!options::nag(Type))\n\t\treturn;\n\n\tGtk::MessageDialog dialog(Message.raw(), false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK, true);\n\tif(!SecondaryMessage.empty())\n\t\tdialog.set_secondary_text(SecondaryMessage.raw());\n\n\tGtk::CheckButton show_message(_(\"Display this message again in the future\"));\n\tshow_message.set_active(true);\n\tshow_message.show();\n\n\tGtk::Alignment alignment(0.5, 0.5, 0, 0);\n\talignment.add(show_message);\n\talignment.show();\n\n\tdialog.get_vbox()->pack_start(alignment);\n\n\tdialog.run();\n\n\toptions::enable_nag(Type, show_message.get_active());\n}\n\nbool_t cancel_plugin(iplugin_factory& Factory)\n{\n\tif(batch_mode())\n\t\treturn false;\n\n\tswitch(Factory.quality())\n\t{\n\t\tcase iplugin_factory::EXPERIMENTAL:\n\t\t{\n\t\t\tif(!options::nag(\"warn_experimental\"))\n\t\t\t\treturn false;\n\n\t\t\tGtk::MessageDialog dialog(_(\"Use Experimental Plugin?\"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL, true);\n\t\t\tdialog.set_secondary_text(_(\"Experimental plugins are still under development and may be modified or removed at any time.  If this happens, documents that include them may become unusable.\"));\n\n\t\t\tGtk::CheckButton show_message(_(\"Display this message again in the future\"));\n\t\t\tshow_message.set_active(true);\n\t\t\tshow_message.show();\n\n\t\t\tGtk::Alignment alignment(0.5, 0.5, 0, 0);\n\t\t\talignment.add(show_message);\n\t\t\talignment.show();\n\n\t\t\tdialog.get_vbox()->pack_start(alignment);\n\n\t\t\tdialog.set_default_response(Gtk::RESPONSE_CANCEL);\n\n\t\t\tconst int response = dialog.run();\n\n\t\t\toptions::enable_nag(\"warn_experimental\", show_message.get_active());\n\n\t\t\treturn response != Gtk::RESPONSE_OK;\n\t\t}\n\t\tcase iplugin_factory::STABLE:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tcase iplugin_factory::DEPRECATED:\n\t\t{\n\t\t\tif(!options::nag(\"warn_deprecated\"))\n\t\t\t\treturn false;\n\n\t\t\tGtk::MessageDialog dialog(_(\"Use Deprecated Plugin?\"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL, true);\n\t\t\tdialog.set_secondary_text(_(\"Deprecated plugins are scheduled for removal in future versions of K-3D.  When this happens, documents that include them may become unusable.  We strongly recommend against using deprecated plugins, unless you plan to keep a specific version of K-3D on-hand to maintain them.\"));\n\n\t\t\tGtk::CheckButton show_message(_(\"Display this message again in the future\"));\n\t\t\tshow_message.set_active(true);\n\t\t\tshow_message.show();\n\n\t\t\tGtk::Alignment alignment(0.5, 0.5, 0, 0);\n\t\t\talignment.add(show_message);\n\t\t\talignment.show();\n\n\t\t\tdialog.get_vbox()->pack_start(alignment);\n\n\t\t\tdialog.set_default_response(Gtk::RESPONSE_CANCEL);\n\n\t\t\tconst int response = dialog.run();\n\n\t\t\toptions::enable_nag(\"warn_deprecated\", show_message.get_active());\n\n\t\t\treturn response != Gtk::RESPONSE_OK;\n\t\t}\n\t}\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/messages.h",
    "content": "#ifndef K3DSDK_NGUI_MESSAGES_H\n#define K3DSDK_NGUI_MESSAGES_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n#include <k3dsdk/ustring.h>\n\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\nclass iplugin_factory;\n\nnamespace ngui\n{\n\n/// Displays an informational message in a modal dialog box\nvoid message(const std::string& Message, const std::string& SecondaryMessage = \"\");\n/// Displays a warning message in a modal dialog box\nvoid warning_message(const std::string& Message, const std::string& SecondaryMessage = \"\");\n/// Displays an error message in a modal dialog box\nvoid error_message(const std::string& Message, const std::string& SecondaryMessage = \"\");\n/**\n\t \\brief Prompts the user to choose an option from a modal dialog box\n\t \\param Message text displayed by the message box.\n\t \\param DefaultOption one-based index of the option that is selected by default.  If DefaultOption is 0, then no option is selected by default.\n\t \\return one-based index of the option selected by the user, or \"0\" if a choice was not made (e.g. user clicked WM \"close\" button)\n*/\nunsigned int query_message(const std::string& Message, const unsigned int DefaultOption, const std::vector<std::string>& Options);\n/// Displays an information \"nag\" message in a modal dialog box\nvoid nag_message(const std::string& Type, const k3d::ustring& Message, const k3d::ustring& SecondaryMessage = k3d::ustring());\n\n/// Warns the user before creating an experimental or deprecated plugin, and gives them a chance to cancel.  Returns true iff the user decided to cancel.\nbool_t cancel_plugin(iplugin_factory& Factory);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_MESSAGES_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/modifiers.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/imesh_selection_sink.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/ireset_properties.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/ngui/pipeline.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/string_cast.h>\n\n#include <sstream>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nconst factories_t& mesh_modifiers()\n{\n\tstatic factories_t modifiers;\n\tif(modifiers.empty())\n\t{\n\t\tconst plugin::factory::collection_t data_source_modifiers = plugin::factory::lookup<imesh_source>();\n\t\tconst plugin::factory::collection_t data_sink_modifiers = plugin::factory::lookup<imesh_sink>();\n\t\tconst plugin::factory::collection_t multi_sink_modifiers = plugin::factory::lookup<imulti_mesh_sink>();\n\t\tconst plugin::factory::collection_t scripted_modifiers = plugin::factory::lookup(\"k3d:plugin-type\", \"MeshModifierScript\");\n\t\tstd::set_intersection(data_source_modifiers.begin(), data_source_modifiers.end(), data_sink_modifiers.begin(), data_sink_modifiers.end(), std::inserter(modifiers, modifiers.end()));\n\t\tmodifiers.insert(modifiers.end(), multi_sink_modifiers.begin(), multi_sink_modifiers.end());\n\t\tmodifiers.insert(modifiers.end(), scripted_modifiers.begin(), scripted_modifiers.end());\n\t\tstd::sort(modifiers.begin(), modifiers.end(), k3d::sort_by_name());\n\t}\n\n\treturn modifiers;\n}\n\nconst factories_t& mesh_sinks()\n{\n\tstatic factories_t sinks;\n\tif(sinks.empty())\n\t{\n\t\tconst plugin::factory::collection_t data_source_modifiers = plugin::factory::lookup<imesh_source>();\n\t\tconst plugin::factory::collection_t data_sink_modifiers = plugin::factory::lookup<imesh_sink>();\n\t\tstd::set_difference(data_sink_modifiers.begin(), data_sink_modifiers.end(), data_source_modifiers.begin(), data_source_modifiers.end(), std::inserter(sinks, sinks.end()));\n\t\tstd::sort(sinks.begin(), sinks.end(), k3d::sort_by_name());\n\t}\n\n\treturn sinks;\n}\n\nconst factories_t& transform_modifiers()\n{\n\tstatic factories_t modifiers;\n\tif(modifiers.empty())\n\t{\n\t\tconst plugin::factory::collection_t data_source_modifiers = plugin::factory::lookup<imatrix_source>();\n\t\tconst plugin::factory::collection_t data_sink_modifiers = plugin::factory::lookup<imatrix_sink>();\n\t\tstd::set_intersection(data_source_modifiers.begin(), data_source_modifiers.end(), data_sink_modifiers.begin(), data_sink_modifiers.end(), std::inserter(modifiers, modifiers.end()));\n\t\tstd::sort(modifiers.begin(), modifiers.end(), k3d::sort_by_name());\n\t}\n\n\treturn modifiers;\n}\n\n/// Modify transformation\ninode* modify_transformation(idocument& Document, inode& Object, iplugin_factory* Modifier)\n{\n\treturn_val_if_fail(Modifier, 0);\n\n\t// Get the upstream and downstream properties ...\n\timatrix_sink* const downstream_sink = dynamic_cast<imatrix_sink*>(&Object);\n\treturn_val_if_fail(downstream_sink, 0);\n\n\tiproperty& downstream_input = downstream_sink->matrix_sink_input();\n\n\tiproperty* const upstream_output = Document.pipeline().dependency(downstream_input);\n\n\tinode* modifier = 0;\n\n\t// This block is recorded for undo purposes ...\n\t{\n\t\trecord_state_change_set changeset(Document, string_cast(boost::format(_(\"Add Modifier %1%\")) % Modifier->name()), K3D_CHANGE_SET_CONTEXT);\n\n\t\t// Create our modifier object ...\n\t\tmodifier = plugin::create<inode>(*Modifier, Document, unique_name(Document.nodes(), Modifier->name()));\n\t\treturn_val_if_fail(modifier, 0);\n\n\t\t// Get its input and output properties ...\n\t\timatrix_sink* const modifier_sink = dynamic_cast<imatrix_sink*>(modifier);\n\t\treturn_val_if_fail(modifier_sink, 0);\n\t\timatrix_source* const modifier_source = dynamic_cast<imatrix_source*>(modifier);\n\t\treturn_val_if_fail(modifier_source, 0);\n\n\t\t// Insert the modifier into the DAG ...\n\t\tipipeline::dependencies_t dependencies;\n\t\tif(upstream_output)\n\t\t\tdependencies.insert(std::make_pair(&modifier_sink->matrix_sink_input(), upstream_output));\n\t\tdependencies.insert(std::make_pair(&downstream_input, &modifier_source->matrix_source_output()));\n\t\tDocument.pipeline().set_dependencies(dependencies);\n\t}\n\n\treturn modifier;\n}\n\n/// Modify mesh\ninode* modify_mesh(document_state& DocumentState, inode& Node, iplugin_factory* Modifier)\n{\n\treturn_val_if_fail(Modifier, 0);\n\n\tidocument& document = DocumentState.document();\n\t\n\t// Get the upstream and downstream properties ...\n\timesh_sink* const downstream_sink = dynamic_cast<imesh_sink*>(&Node);\n\treturn_val_if_fail(downstream_sink, 0);\n\n\tiproperty& downstream_input = downstream_sink->mesh_sink_input();\n\n\tiproperty* const upstream_output = document.pipeline().dependency(downstream_input);\n\treturn_val_if_fail(upstream_output, 0);\n\n\tinode* modifier = 0;\n\n\t// This block is recorded for undo purposes ...\n\t{\n\t\trecord_state_change_set changeset(document, string_cast(boost::format(_(\"Add Modifier %1%\")) % Modifier->name()), K3D_CHANGE_SET_CONTEXT);\n\n\t\t// Create our modifier object ...\n\t\tmodifier = plugin::create<inode>(*Modifier, document, unique_name(document.nodes(), Modifier->name()));\n\t\treturn_val_if_fail(modifier, 0);\n\n\t\t// Get its input and output properties ...\n\t\timesh_sink* const modifier_sink = dynamic_cast<imesh_sink*>(modifier);\n\t\treturn_val_if_fail(modifier_sink, 0);\n\t\timesh_source* const modifier_source = dynamic_cast<imesh_source*>(modifier);\n\n\t\t// Insert the modifier into the pipeline ...\n\t\tipipeline::dependencies_t dependencies;\n\t\tdependencies.insert(std::make_pair(&modifier_sink->mesh_sink_input(), upstream_output));\n\t\tif(modifier_source)\n\t\t\tdependencies.insert(std::make_pair(&downstream_input, &modifier_source->mesh_source_output()));\n\t\tdocument.pipeline().set_dependencies(dependencies);\n\n\t\t// If the modifier is a mesh selection sink, set its selection state ...\n\t\timesh_selection_sink* const modifier_mesh_selection_sink = dynamic_cast<imesh_selection_sink*>(modifier);\n\t\timesh_selection_sink* const downstream_mesh_selection_sink = dynamic_cast<imesh_selection_sink*>(&Node);\n\t\tif(modifier_mesh_selection_sink && downstream_mesh_selection_sink)\n\t\t{\n\t\t\tif(selection::NODE == selection::state(DocumentState.document()).current_mode())\n\t\t\t{\n\t\t\t\tproperty::set_internal_value(\n\t\t\t\t\tmodifier_mesh_selection_sink->mesh_selection_sink_input(),\n\t\t\t\t\tgeometry::selection::create(1));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tproperty::set_internal_value(\n\t\t\t\t\tmodifier_mesh_selection_sink->mesh_selection_sink_input(),\n\t\t\t\t\tdownstream_mesh_selection_sink->mesh_selection_sink_input().property_internal_value());\n\t\t\t}\n\t\n\t\t\tproperty::set_internal_value(\n\t\t\t\tdownstream_mesh_selection_sink->mesh_selection_sink_input(),\n\t\t\t\tk3d::selection::set());\n\t\t}\n\t}\n\t\n\t// Give nodes a chance to initialize their property values based on their inputs, if any ...\n\tif(ireset_properties* const reset_properties = dynamic_cast<ireset_properties*>(modifier))\n\t\treset_properties->reset_properties();\n\n\treturn modifier;\n}\n\nvoid modify_selected_meshes(document_state& DocumentState, iplugin_factory* Modifier)\n{\n\treturn_if_fail(Modifier);\n\tidocument& document = DocumentState.document();\n\tif (Modifier->implements(typeid(imulti_mesh_sink)))\n\t{ // Mesh modifier taking multiple inputs\n\t\tuint_t count = 0;\n\t\tipipeline::dependencies_t dependencies;\n\t\tconst nodes_t selected_nodes = selection::state(DocumentState.document()).selected_nodes();\n\t\t// Create the node\n\t\tinode* multi_sink = pipeline::create_node(document, *Modifier);\n\t\trecord_state_change_set changeset(document, string_cast(boost::format(_(\"Add Modifier %1%\")) % Modifier->name()), K3D_CHANGE_SET_CONTEXT);\n\t\tnodes_t nodes_to_delete;\n\t\tfor(nodes_t::const_iterator node = selected_nodes.begin(); node != selected_nodes.end(); ++node)\n\t\t{\n\t\t\timesh_sink* const mesh_sink = dynamic_cast<imesh_sink*>(*node);\n\t\t\tif(!mesh_sink)\n\t\t\t\tcontinue;\n\t\t\timatrix_sink* const matrix_sink = dynamic_cast<imatrix_sink*>(*node);\n\n\t\t\tiproperty* source_mesh = document.pipeline().dependency(mesh_sink->mesh_sink_input());\n\t\t\tif (!source_mesh)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tif (matrix_sink) // Insert a transform node\n\t\t\t{\n\t\t\t\tiproperty* const source_transformation = document.pipeline().dependency(matrix_sink->matrix_sink_input());\n\t\t\t\tif (source_transformation)\n\t\t\t\t{\n\t\t\t\t\tinode* transform_points = plugin::create<inode>(\"TransformPoints\", document, unique_name(document.nodes(), \"TransformPoints\"));\n\t\t\t\t\treturn_if_fail(transform_points);\n\t\t\t\t\timatrix_sink* transform_points_matrix_sink = dynamic_cast<imatrix_sink*>(transform_points);\n\t\t\t\t\treturn_if_fail(transform_points_matrix_sink);\n\t\t\t\t\timesh_sink* transform_points_mesh_sink = dynamic_cast<imesh_sink*>(transform_points);\n\t\t\t\t\treturn_if_fail(transform_points_mesh_sink);\n\t\t\t\t\tdependencies.insert(std::make_pair(&transform_points_matrix_sink->matrix_sink_input(), source_transformation));\n\t\t\t\t\tdependencies.insert(std::make_pair(&transform_points_mesh_sink->mesh_sink_input(), source_mesh));\n\t\t\t\t\timesh_source* transform_points_mesh_source = dynamic_cast<imesh_source*>(transform_points);\n\t\t\t\t\treturn_if_fail(transform_points_mesh_source);\n\t\t\t\t\tsource_mesh = &transform_points_mesh_source->mesh_source_output();\n\t\t\t\t\timesh_selection_sink* selection_sink = dynamic_cast<imesh_selection_sink*>(transform_points);\n\t\t\t\t\treturn_if_fail(selection_sink);\n\t\t\t\t\tproperty::set_internal_value(selection_sink->mesh_selection_sink_input(), k3d::geometry::selection::create(1.0));\n\t\t\t\t}\n\t\t\t}\n\t\t\t++count;\n\t\t\t// Create a new user property\n\t\t\tstd::stringstream name, label;\n\t\t\tname << \"input_mesh\" << count;\n\t\t\tlabel << \"Input Mesh \" << count;\n\t\t\tiproperty* sink = property::get(*multi_sink, name.str());\n\t\t\tif (!sink)\n\t\t\t\tsink = property::create<mesh*>(*multi_sink, name.str(), label.str(), \"\", static_cast<mesh*>(0));\n\t\t\t// Store the connection\n\t\t\tdependencies.insert(std::make_pair(sink, source_mesh));\n\t\t\t// Delete the input node\n\t\t\tnodes_to_delete.push_back(*node);\n\t\t}\n\t\tdocument.pipeline().set_dependencies(dependencies);\n\t\tdelete_nodes(document, nodes_to_delete);\n\t\t// Give nodes a chance to initialize their property values based on their inputs, if any ...\n\t\tif(ireset_properties* const reset_properties = dynamic_cast<ireset_properties*>(multi_sink))\n\t\t\treset_properties->reset_properties();\n\n\t\tpanel::mediator(DocumentState.document()).set_focus(*multi_sink);\n\t}\n\telse\n\t{ // Normal mesh modifier\n\t\tnodes_t new_modifiers;\n\t\n\t\tconst nodes_t selected_nodes = selection::state(DocumentState.document()).selected_nodes();\n\t\tfor(nodes_t::const_iterator node = selected_nodes.begin(); node != selected_nodes.end(); ++node)\n\t\t{\n\t\t\tnew_modifiers.push_back(modify_mesh(DocumentState, **node, Modifier));\n\t\t\tassert_warning(new_modifiers.back());\n\t\t}\n\t\n\t\t// Show the new modifier properties if only one was processed\n\t\tif(selected_nodes.size() == 1)\n\t\t{\n\t\t\tpanel::mediator(DocumentState.document()).set_focus(*new_modifiers.front());\n\t\t}\n\t\telse // otherwise connect all parameter properties to the first node and show that one\n\t\t{\n\t\t\tiproperty_collection* first_property_collection = dynamic_cast<iproperty_collection*>(new_modifiers.front());\n\t\t\tif (first_property_collection)\n\t\t\t{\n\t\t\t\t// Get the in-and output property names, to exclude them from the connections\n\t\t\t\timesh_sink* const modifier_sink = dynamic_cast<imesh_sink*>(new_modifiers.front());\n\t\t\t\treturn_if_fail(modifier_sink);\n\t\t\t\timesh_source* const modifier_source = dynamic_cast<imesh_source*>(new_modifiers.front());\n\t\t\t\treturn_if_fail(modifier_source);\n\t\t\t\tconst std::string sink_name = modifier_sink->mesh_sink_input().property_name();\n\t\t\t\tconst std::string source_name = modifier_source->mesh_source_output().property_name();\n\t\t\t\t\n\t\t\t\tipipeline::dependencies_t dependencies;\n\t\t\t\tconst iproperty_collection::properties_t& first_properties = first_property_collection->properties();\n\t\t\t\tnodes_t::iterator modifier = new_modifiers.begin();\n\t\t\t\t++modifier;\n\t\t\t\tfor (modifier; modifier != new_modifiers.end(); ++modifier)\n\t\t\t\t{\n\t\t\t\t\tiproperty_collection* property_collection = dynamic_cast<iproperty_collection*>(*modifier);\n\t\t\t\t\treturn_if_fail(property_collection);\n\t\t\t\t\tconst iproperty_collection::properties_t& properties = property_collection->properties();\n\t\t\t\t\tiproperty_collection::properties_t::const_iterator property = properties.begin();\n\t\t\t\t\tfor (iproperty_collection::properties_t::const_iterator first_property = first_properties.begin(); first_property != first_properties.end(); ++first_property)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn_if_fail(property != properties.end());\n\t\t\t\t\t\treturn_if_fail((*property)->property_name() == (*first_property)->property_name());\n\t\t\t\t\t\tif ((*property)->property_name() == sink_name || (*property)->property_name() == source_name || (*property)->property_name() == \"name\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t++property;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdependencies.insert(std::make_pair(*property, *first_property));\n\t\t\t\t\t\t++property;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdocument.pipeline().set_dependencies(dependencies);\n\t\t\t\tpanel::mediator(DocumentState.document()).set_focus(*new_modifiers.front());\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst transform_modifier create_transform_modifier(idocument& Document, const uuid& ModifierType, const std::string& ModifierName)\n{\n\tinode* const object = plugin::create<inode>(ModifierType, Document, ModifierName);\n\treturn_val_if_fail(object, transform_modifier());\n\timatrix_sink* const sink = dynamic_cast<imatrix_sink*>(object);\n\treturn_val_if_fail(sink, transform_modifier());\n\timatrix_source* const source = dynamic_cast<imatrix_source*>(object);\n\treturn_val_if_fail(source, transform_modifier());\n\n\treturn transform_modifier(*object, *sink, *source);\n}\n\ninode* insert_transform_modifier(inode& Object, const uuid& ModifierType, const std::string& ModifierName)\n{\n\timatrix_sink* const downstream_sink = dynamic_cast<imatrix_sink*>(&Object);\n\treturn_val_if_fail(downstream_sink, 0);\n\n\tiproperty& downstream_input = downstream_sink->matrix_sink_input();\n\tiproperty* const upstream_output = Object.document().pipeline().dependency(downstream_input);\n\n\tconst transform_modifier modifier = create_transform_modifier(Object.document(), ModifierType, ModifierName);\n\treturn_val_if_fail(!modifier.empty(), 0);\n\n\tipipeline::dependencies_t dependencies;\n\tdependencies.insert(std::make_pair(&modifier.sink->matrix_sink_input(), upstream_output));\n\tdependencies.insert(std::make_pair(&downstream_input, &modifier.source->matrix_source_output()));\n\tObject.document().pipeline().set_dependencies(dependencies);\n\n\treturn modifier.node;\n}\n\ninode* upstream_transform_modifier(inode& Object)\n{\n\timatrix_sink* const downstream_sink = dynamic_cast<imatrix_sink*>(&Object);\n\treturn_val_if_fail(downstream_sink, 0);\n\n\tiproperty& downstream_input = downstream_sink->matrix_sink_input();\n\tiproperty* const upstream_output = Object.document().pipeline().dependency(downstream_input);\n\n\t// Check upstream object\n\tif(upstream_output)\n\t\treturn upstream_output->property_node();\n\n\treturn 0;\n}\n\nconst mesh_modifier create_mesh_modifier(idocument& Document, const uuid& ModifierType, const std::string& ModifierName)\n{\n\tinode* const object = plugin::create<inode>(ModifierType, Document, ModifierName);\n\treturn_val_if_fail(object, mesh_modifier());\n\timesh_sink* const sink = dynamic_cast<imesh_sink*>(object);\n\treturn_val_if_fail(sink, mesh_modifier());\n\timesh_source* const source = dynamic_cast<imesh_source*>(object);\n\treturn_val_if_fail(source, mesh_modifier());\n\n\treturn mesh_modifier(*object, *sink, *source);\n}\n\ninode* insert_mesh_modifier(inode& Object, const uuid& ModifierType, const std::string& ModifierName)\n{\n\timesh_sink* const downstream_sink = dynamic_cast<imesh_sink*>(&Object);\n\treturn_val_if_fail(downstream_sink, 0);\n\n\tiproperty& downstream_input = downstream_sink->mesh_sink_input();\n\tiproperty* const upstream_output = Object.document().pipeline().dependency(downstream_input);\n\n\tconst mesh_modifier modifier = create_mesh_modifier(Object.document(), ModifierType, ModifierName);\n\treturn_val_if_fail(!modifier.empty(), 0);\n\n\tipipeline::dependencies_t dependencies;\n\tdependencies.insert(std::make_pair(&modifier.sink->mesh_sink_input(), upstream_output));\n\tdependencies.insert(std::make_pair(&downstream_input, &modifier.source->mesh_source_output()));\n\tObject.document().pipeline().set_dependencies(dependencies, modifier.source->hint());\n\n\treturn modifier.node;\n}\n\ninode* upstream_mesh_modifier(inode& Object)\n{\n\timesh_sink* const downstream_sink = dynamic_cast<imesh_sink*>(&Object);\n\treturn_val_if_fail(downstream_sink, 0);\n\n\tiproperty& downstream_input = downstream_sink->mesh_sink_input();\n\tiproperty* const upstream_output = Object.document().pipeline().dependency(downstream_input);\n\n\t// Check upstream object\n\tif(upstream_output)\n\t\treturn upstream_output->property_node();\n\n\treturn 0;\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/modifiers.h",
    "content": "#ifndef K3DSDK_NGUI_MODIFIERS_H\n#define K3DSDK_NGUI_MODIFIERS_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/plugin.h>\n#include <string>\n#include <vector>\n\nnamespace k3d { class idocument; }\nnamespace k3d { class inode; }\nnamespace k3d { class imesh_sink; }\nnamespace k3d { class imesh_source; }\nnamespace k3d { class iplugin_factory; }\nnamespace k3d { class imatrix_sink; }\nnamespace k3d { class imatrix_source; }\nnamespace k3d { class uuid; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\t\n/// Returns upstream transform modifier (0 if none)\nk3d::inode* upstream_transform_modifier(k3d::inode& Object);\n/// Returns upstream mesh modifier (0 if none)\nk3d::inode* upstream_mesh_modifier(k3d::inode& Object);\n\ntypedef std::vector<k3d::iplugin_factory*> factories_t;\n/// Returns a collection of transform modifier plugin factories, sorted by name\nconst factories_t& transform_modifiers();\n/// Returns a collection of mesh modifier plugin factories, sorted by name\nconst factories_t& mesh_modifiers();\n/// Returns a collection of mesh sink plugin factories that are NOT mesh sources. Sorted by name\nconst factories_t& mesh_sinks();\n\n/// Modify transformation \nk3d::inode* modify_transformation(k3d::idocument& Document, k3d::inode& Object, k3d::iplugin_factory* Modifier);\n/// Modify mesh object\nk3d::inode* modify_mesh(document_state& DocumentState, k3d::inode& Object, k3d::iplugin_factory* Modifier);\n/// Modify all selected meshes\nvoid modify_selected_meshes(document_state& DocumentState, k3d::iplugin_factory* Modifier);\n\nstruct transform_modifier;\nconst transform_modifier create_transform_modifier(k3d::idocument& Document, const k3d::uuid& ModifierType, const std::string& ModifierName);\nk3d::inode* insert_transform_modifier(k3d::inode& Object, const k3d::uuid& ModifierType, const std::string& ModifierName);\n\nstruct mesh_modifier;\nconst mesh_modifier create_mesh_modifier(k3d::idocument& Document, const k3d::uuid& ModifierType, const std::string& ModifierName);\nk3d::inode* insert_mesh_modifier(k3d::inode& Object, const k3d::uuid& ModifierType, const std::string& ModifierName);\n\nstruct transform_modifier\n{\n\ttransform_modifier() :\n\t\tnode(0),\n\t\tsink(0),\n\t\tsource(0)\n\t{\n\t}\n\n\ttransform_modifier(k3d::inode& Object, k3d::imatrix_sink& Sink, k3d::imatrix_source& Source) :\n\t\tnode(&Object),\n\t\tsink(&Sink),\n\t\tsource(&Source)\n\t{\n\t}\n\n\toperator bool() const\n\t{\n\t\treturn node && sink && source;\n\t}\n\n\tbool empty() const\n\t{\n\t\treturn !(node && sink && source);\n\t}\n\n\tk3d::inode* node;\n\tk3d::imatrix_sink* sink;\n\tk3d::imatrix_source* source;\n};\n\nstruct mesh_modifier\n{\n\tmesh_modifier() :\n\t\tnode(0),\n\t\tsink(0),\n\t\tsource(0)\n\t{\n\t}\n\n\tmesh_modifier(k3d::inode& Object, k3d::imesh_sink& Sink, k3d::imesh_source& Source) :\n\t\tnode(&Object),\n\t\tsink(&Sink),\n\t\tsource(&Source)\n\t{\n\t}\n\n\toperator bool() const\n\t{\n\t\treturn node && sink && source;\n\t}\n\n\tbool empty() const\n\t{\n\t\treturn !(node && sink && source);\n\t}\n\n\tk3d::inode* node;\n\tk3d::imesh_sink* sink;\n\tk3d::imesh_source* source;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_MODIFIERS_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/move_tool.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <gdkmm/cursor.h>\n#include <gtkmm/widget.h>\n\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/move_tool.h>\n#include <k3dsdk/ngui/transform_tool.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n\n#include <k3d-i18n-config.h>\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/geometric_operations.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/line2.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/plane.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/selectable.h>\n#include <k3dsdk/xml.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\nclass move_manipulators :\n\tpublic imanipulators<k3d::vector3>\n{\nprivate:\n\tstruct constraint :\n\t\tpublic k3d::selectable\n\t{\n\t\tconstraint(const std::string& Label, Glib::RefPtr<Gdk::Pixbuf> Cursor, const k3d::selection::token& SelectionToken) :\n\t\t\tm_selection_token(SelectionToken),\n\t\t\tm_label(Label),\n\t\t\tm_cursor(Cursor),\n\t\t\tm_plane(k3d::vector3(0, 0, 1), 0),\n\t\t\tm_x_sensitivity(0),\n\t\t\tm_y_sensitivity(0),\n\t\t\tm_z_sensitivity(0)\n\t\t{\n\t\t\tassert_warning(!m_label.empty());\n\t\t}\n\n\t\tconst std::string label()\n\t\t{\n\t\t\treturn m_label;\n\t\t}\n\n\t\tGlib::RefPtr<Gdk::Pixbuf> cursor()\n\t\t{\n\t\t\treturn m_cursor;\n\t\t}\n\n\t\tvoid set_plane(const k3d::plane& Plane, const double XSensitivity, const double YSensitivity, const double ZSensitivity)\n\t\t{\n\t\t\tm_plane = Plane;\n\t\t\tm_x_sensitivity = XSensitivity;\n\t\t\tm_y_sensitivity = YSensitivity;\n\t\t\tm_z_sensitivity = ZSensitivity;\n\t\t}\n\n\t\tvoid begin_mouse_move(const k3d::point2& Mouse, const k3d::point3& Origin)\n\t\t{\n\t\t\tm_last_mouse = Mouse;\n\t\t}\n\n\t\tk3d::vector3 mouse_move(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t\t{\n\t\t\tconst k3d::point2 current_mouse(Coordinates);\n\n\t\t\t// Turn mouse coordinates into lines in world coordinates ...\n\t\t\tk3d::line3 last_line = mouse_to_world(Viewport, m_last_mouse);\n\t\t\tk3d::line3 current_line = mouse_to_world(Viewport, current_mouse);\n\t\t\tm_last_mouse = current_mouse;\n\n\t\t\t// Calculate intersections with our plane in world coordinates ...\n\t\t\tk3d::point3 last_intersection;\n\t\t\treturn_val_if_fail(k3d::intersect(m_plane, last_line, last_intersection), k3d::vector3(0, 0, 0));\n\n\t\t\tk3d::point3 current_intersection;\n\t\t\treturn_val_if_fail(k3d::intersect(m_plane, current_line, current_intersection), k3d::vector3(0, 0, 0));\n\n\t\t\t// Convert the change into world axis coordinates and constrain them (with sensitivity)\n\t\t\tconst k3d::vector3 delta = k3d::inverse(Orientation) * (current_intersection - last_intersection);\n\n\t\t\treturn k3d::vector3(delta[0] * m_x_sensitivity, delta[1] * m_y_sensitivity, delta[2] * m_z_sensitivity);\n\t\t}\n\n\t\tconst k3d::selection::token m_selection_token;\n\t\tconst std::string m_label;\n\t\tconst Glib::RefPtr<Gdk::Pixbuf> m_cursor;\n\n\t\t/// Stores the constraint plane in world coordinates\n\t\tk3d::plane m_plane;\n\n\t\tdouble m_x_sensitivity;\n\t\tdouble m_y_sensitivity;\n\t\tdouble m_z_sensitivity;\n\t\tk3d::point2 m_last_mouse;\n\t};\n\npublic:\n\tmove_manipulators() :\n    m_quadric(0),\n\t\tm_current_constraint(&m_screen_xy_constraint),\n\t\tm_screen_xy_constraint(_(\"Move Screen XY\"), load_icon(\"move_cursor_screen_xy\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 0)),\n\t\tm_x_constraint(_(\"Move X\"), load_icon(\"move_cursor_x\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 1)),\n\t\tm_y_constraint(_(\"Move Y\"), load_icon(\"move_cursor_y\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 2)),\n\t\tm_z_constraint(_(\"Move Z\"), load_icon(\"move_cursor_z\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 3)),\n\t\tm_xy_constraint(_(\"Move XY\"), load_icon(\"move_cursor_xy\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 4)),\n\t\tm_xz_constraint(_(\"Move XZ\"), load_icon(\"move_cursor_xz\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 5)),\n\t\tm_yz_constraint(_(\"Move YZ\"), load_icon(\"move_cursor_yz\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 6))\n\t{\n\t}\n\n\t~move_manipulators()\n\t{\n    gluDeleteQuadric(m_quadric);\n\t}\n\n\tvoid activate()\n\t{\n\t\t// Load parameters from configuration file\n\t\ttry\n\t\t{\n\t\t\tk3d::filesystem::ifstream layout_stream(k3d::share_path() / k3d::filesystem::generic_path(\"ngui/tool_layout.k3d\"));\n\t\t\tk3d::xml::element layout_xml;\n\t\t\tlayout_stream >> layout_xml;\n\t\t\tk3d::xml::element& xml_move = layout_xml.safe_element(\"application\").safe_element(\"user_interface\").safe_element(\"tools\").safe_element(\"move\");\n\n\t\t\tm_manipulators_size = k3d::xml::attribute_value<double>(xml_move, \"size\", 10);\n\t\t\tm_current_color = k3d::xml::attribute_value<k3d::color>(xml_move, \"current_color\", k3d::color(1, 1, 0));\n\t\t\tm_x_color = k3d::xml::attribute_value<k3d::color>(xml_move, \"x_color\", k3d::color(1, 0, 0));\n\t\t\tm_y_color = k3d::xml::attribute_value<k3d::color>(xml_move, \"y_color\", k3d::color(0, 1, 0));\n\t\t\tm_z_color = k3d::xml::attribute_value<k3d::color>(xml_move, \"z_color\", k3d::color(0, 0, 1));\n\t\t\tm_screen_xy_color = k3d::xml::attribute_value<k3d::color>(xml_move, \"screen_xy_color\", k3d::color(0.9, 0.9, 0.9));\n\t\t\tm_plane_offset = k3d::xml::attribute_value<double>(xml_move, \"plane_offset\", 5);\n\t\t\tm_plane_size = k3d::xml::attribute_value<double>(xml_move, \"plane_size\", 4.8);\n\t\t\tm_screen_xy_radius = k3d::xml::attribute_value<double>(xml_move, \"screen_xy_radius\", 0.5);\n\t\t\tm_screen_xy_slices = k3d::xml::attribute_value<unsigned long>(xml_move, \"screen_xy_slices\", 8);\n\t\t\tm_screen_xy_stacks = k3d::xml::attribute_value<unsigned long>(xml_move, \"screen_xy_stacks\", 8);\n\t\t\tm_axis_start = k3d::xml::attribute_value<double>(xml_move, \"axis_start\", 5);\n\t\t\tm_axis_end = k3d::xml::attribute_value<double>(xml_move, \"axis_end\", 10);\n\t\t\tm_axis_line_width = k3d::xml::attribute_value<double>(xml_move, \"axis_line_width\", 1);\n\t\t\tm_axis_arrow_radius = k3d::xml::attribute_value<double>(xml_move, \"axis_arrow_radius\", 0.5);\n\t\t\tm_axis_arrow_length = k3d::xml::attribute_value<double>(xml_move, \"axis_arrow_length\", 2.0);\n\t\t\tm_axis_arrow_slices = k3d::xml::attribute_value<unsigned long>(xml_move, \"axis_arrow_slices\", 8);\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t}\n\n\t\tset_constraint(\"screen_xy\");\n\t}\n\n\tvoid redraw(viewport::control& Viewport, const bool Visible, const k3d::point3& Position, const k3d::matrix4& Orientation, tool_selection::motion_t Motion, const k3d::point3& Scaling)\n\t{\n\t\t// Sanity checks\n\t\treturn_if_fail(Viewport.gl_engine());\n\t\treturn_if_fail(Viewport.camera());\n\n\t\t// Update constraints\n\t\tconst k3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*Viewport.camera());\n\t\tconst k3d::vector3 screen_normal = screen_matrix * k3d::vector3(0, 0, 1);\n\n\t\t// Update the screen xy constraint so it always aligns with the camera direction vector in world coordinates\n\t\tm_screen_xy_constraint.set_plane(k3d::plane(screen_normal, Position), 1, 1, 1);\n\n\t\t// Update axis constraints so their planes are always as perpendicular to the screen as-possible\n\t\tm_x_constraint.set_plane(k3d::plane((Orientation * k3d::vector3(1, 0, 0)) ^ ((Orientation * k3d::vector3(1, 0, 0)) ^ screen_normal), Position), 1, 0, 0);\n\t\tm_y_constraint.set_plane(k3d::plane((Orientation * k3d::vector3(0, 1, 0)) ^ ((Orientation * k3d::vector3(0, 1, 0)) ^ screen_normal), Position), 0, 1, 0);\n\t\tm_z_constraint.set_plane(k3d::plane((Orientation * k3d::vector3(0, 0, 1)) ^ ((Orientation * k3d::vector3(0, 0, 1)) ^ screen_normal), Position), 0, 0, 1);\n\n\t\t// Update plane constraints so they have the correct positions in world coordinates\n\t\tm_xy_constraint.set_plane(k3d::plane(Orientation * k3d::vector3(0, 0, 1), Position), 1, 1, 0);\n\t\tm_xz_constraint.set_plane(k3d::plane(Orientation * k3d::vector3(0, 1, 0), Position), 1, 0, 1);\n\t\tm_yz_constraint.set_plane(k3d::plane(Orientation * k3d::vector3(1, 0, 0), Position), 0, 1, 1);\n\n\t\t// Draw manipulators\n\t\tif(!Visible)\n\t\t\treturn;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(k3d::to_vector(Position)));\n\t\tk3d::gl::push_matrix(Orientation);\n\n\t\tglClear(GL_DEPTH_BUFFER_BIT);\n\n\t\t// Scale manipulators to show them at constant size (except on mouse drag)\n\t\tif(tool_selection::MOTION_NONE == Motion)\n\t\t\tm_scale = detail::manipulators_scale(Viewport, Position, m_manipulators_size);\n\n\t\tglScaled(m_scale, m_scale, m_scale);\n\n\t\t// Draw manipulators\n\t\tk3d::vector3 px;\n\t\tk3d::vector3 py;\n\t\tk3d::vector3 pz;\n\n\t\tconst bool motion = (tool_selection::MOTION_DRAG == Motion) || (tool_selection::MOTION_CLICK_DRAG == Motion);\n\n\t\tif(!motion || &m_x_constraint == m_current_constraint || &m_xy_constraint == m_current_constraint || &m_xz_constraint == m_current_constraint)\n\t\t{\n\t\t\tif(is_front_facing(Viewport, k3d::vector3(1, 0, 0), Position, Orientation))\n\t\t\t{\n\t\t\t\tpx = k3d::vector3(1, 0, 0);\n\t\t\t\tdraw_axis(m_x_color, m_current_constraint == &m_x_constraint ? m_current_color : m_x_color, k3d::rotate3(k3d::radians(90.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpx = k3d::vector3(-1, 0, 0);\n\t\t\t\tdraw_axis(m_x_color, m_current_constraint == &m_x_constraint ? m_current_color : m_x_color, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t}\n\n\t\tif(!motion || &m_y_constraint == m_current_constraint || &m_xy_constraint == m_current_constraint || &m_yz_constraint == m_current_constraint)\n\t\t{\n\t\t\tif(is_front_facing(Viewport, k3d::vector3(0, -1, 0), Position, Orientation))\n\t\t\t{\n\t\t\t\tpy = k3d::vector3(0, -1, 0);\n\t\t\t\tdraw_axis(m_y_color, m_current_constraint == &m_y_constraint ? m_current_color : m_y_color, k3d::rotate3(k3d::radians(90.0), k3d::vector3(1, 0, 0)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpy = k3d::vector3(0, 1, 0);\n\t\t\t\tdraw_axis(m_y_color, m_current_constraint == &m_y_constraint ? m_current_color : m_y_color, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(1, 0, 0)));\n\t\t\t}\n\t\t}\n\n\t\tif(!motion || &m_z_constraint == m_current_constraint || &m_xz_constraint == m_current_constraint || &m_yz_constraint == m_current_constraint)\n\t\t{\n\t\t\tif(is_front_facing(Viewport, k3d::vector3(0, 0, 1), Position, Orientation))\n\t\t\t{\n\t\t\t\tpz = k3d::vector3(0, 0, 1);\n\t\t\t\tdraw_axis(m_z_color, m_current_constraint == &m_z_constraint ? m_current_color : m_z_color, k3d::rotate3(k3d::radians(0.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpz = k3d::vector3(0, 0, -1);\n\t\t\t\tdraw_axis(m_z_color, m_current_constraint == &m_z_constraint ? m_current_color : m_z_color, k3d::rotate3(k3d::radians(180.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t}\n\n\t\tif(!motion || &m_yz_constraint == m_current_constraint)\n\t\t\tdraw_plane(m_current_constraint == &m_yz_constraint ? m_current_color : m_x_color, py, py + pz, pz);\n\t\tif(!motion || &m_xz_constraint == m_current_constraint)\n\t\t\tdraw_plane(m_current_constraint == &m_xz_constraint ? m_current_color : m_y_color, px, px + pz, pz);\n\t\tif(!motion || &m_xy_constraint == m_current_constraint)\n\t\t\tdraw_plane(m_current_constraint == &m_xy_constraint ? m_current_color : m_z_color, px, px + py, py);\n\n\t\tif(!motion || &m_screen_xy_constraint == m_current_constraint)\n\t\t\tdraw_screen_xy(Viewport, m_current_constraint == &m_screen_xy_constraint ? m_current_color : m_screen_xy_color);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\t}\n\n\tvoid select(viewport::control& Viewport, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(k3d::to_vector(Position)));\n\t\tk3d::gl::push_matrix(Orientation);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglClear(GL_DEPTH_BUFFER_BIT);\n\n\t\t// Scale manipulators\n\t\tglScaled(m_scale, m_scale, m_scale);\n\n\t\t// Draw manipulators\n\t\tk3d::vector3 px;\n\t\tk3d::vector3 py;\n\t\tk3d::vector3 pz;\n\n\t\tif(is_front_facing(Viewport, k3d::vector3(1, 0, 0), Position, Orientation))\n\t\t{\n\t\t\tpx = k3d::vector3(1, 0, 0);\n\t\t\tselect_axis(m_x_constraint, k3d::rotate3(k3d::radians(90.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpx = k3d::vector3(-1, 0, 0);\n\t\t\tselect_axis(m_x_constraint, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\n\t\tif(is_front_facing(Viewport, k3d::vector3(0, -1, 0), Position, Orientation))\n\t\t{\n\t\t\tpy = k3d::vector3(0, -1, 0);\n\t\t\tselect_axis(m_y_constraint, k3d::rotate3(k3d::radians(90.0), k3d::vector3(1, 0, 0)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpy = k3d::vector3(0, 1, 0);\n\t\t\tselect_axis(m_y_constraint, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(1, 0, 0)));\n\t\t}\n\n\t\tif(is_front_facing(Viewport, k3d::vector3(0, 0, 1), Position, Orientation))\n\t\t{\n\t\t\tpz = k3d::vector3(0, 0, 1);\n\t\t\tselect_axis(m_z_constraint, k3d::rotate3(k3d::radians(0.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpz = k3d::vector3(0, 0, -1);\n\t\t\tselect_axis(m_z_constraint, k3d::rotate3(k3d::radians(180.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\n\t\tselect_plane(m_yz_constraint, py, py + pz, pz);\n\t\tselect_plane(m_xz_constraint, px, px + pz, pz);\n\t\tselect_plane(m_xy_constraint, px, px + py, py);\n\n\t\tselect_screen_xy(m_screen_xy_constraint);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\t}\n\n\tstd::string get_constraint_name()\n\t{\n\t\treturn_val_if_fail(m_current_constraint, \"\");\n\n\t\treturn m_current_constraint->label();\n\t}\n\n\t// Set manipulator constraint\n\tGlib::RefPtr<Gdk::Pixbuf> set_constraint(const std::string& Name)\n\t{\n\t\tif(Name == \"screen_xy\")\n\t\t\tm_current_constraint = &m_screen_xy_constraint;\n\t\telse if(Name == \"x_axis\")\n\t\t\tm_current_constraint = &m_x_constraint;\n\t\telse if(Name == \"y_axis\")\n\t\t\tm_current_constraint = &m_y_constraint;\n\t\telse if(Name == \"z_axis\")\n\t\t\tm_current_constraint = &m_z_constraint;\n\t\telse if(Name == \"xy_plane\")\n\t\t\tm_current_constraint = &m_xy_constraint;\n\t\telse if(Name == \"xz_plane\")\n\t\t\tm_current_constraint = &m_xz_constraint;\n\t\telse if(Name == \"yz_plane\")\n\t\t\tm_current_constraint = &m_yz_constraint;\n\t\telse\n\t\t\tassert_not_reached();\n\n\t\treturn m_current_constraint->cursor();\n\t}\n\n\tstd::string constraint_name(const k3d::selection::id ID)\n\t{\n\t\tif(ID == m_screen_xy_constraint.m_selection_token.id)\n\t\t\treturn \"screen_xy\";\n\t\telse if(ID == m_x_constraint.m_selection_token.id)\n\t\t\treturn \"x_axis\";\n\t\telse if(ID == m_y_constraint.m_selection_token.id)\n\t\t\treturn \"y_axis\";\n\t\telse if(ID == m_z_constraint.m_selection_token.id)\n\t\t\treturn \"z_axis\";\n\t\telse if(ID == m_xy_constraint.m_selection_token.id)\n\t\t\treturn \"xy_plane\";\n\t\telse if(ID == m_xz_constraint.m_selection_token.id)\n\t\t\treturn \"xz_plane\";\n\t\telse if(ID == m_yz_constraint.m_selection_token.id)\n\t\t\treturn \"yz_plane\";\n\n\t\treturn \"\";\n\t}\n\n\tstd::string cycle_constraint(constraint* Constraint)\n\t{\n\t\tif(Constraint == &m_x_constraint)\n\t\t\treturn \"y_axis\";\n\n\t\tif(Constraint == &m_y_constraint)\n\t\t\treturn \"z_axis\";\n\n\t\tif(Constraint == &m_z_constraint)\n\t\t\treturn \"x_axis\";\n\n\t\treturn \"\";\n\t}\n\n\tvoid update_constraint(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t{\n\t\t// Cycle through X - Screen - Y - Screen - Z - Screen - X - etc\n\t\tif(m_current_constraint == &m_x_constraint || m_current_constraint == &m_y_constraint || m_current_constraint == &m_z_constraint)\n\t\t{\n\t\t\t// Save current constraint\n\t\t\tm_previous_constraint = m_current_constraint;\n\n\t\t\t// Go back to screeen mode\n\t\t\tset_constraint(\"screen_xy\");\n\t\t}\n\t\telse if(m_previous_constraint)\n\t\t{\n\t\t\t// An axis was previously chosen, cycle to next one\n\t\t\tset_constraint(cycle_constraint(m_previous_constraint));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Constrain movement to the \"nearest\" axis\n\t\t\tconst k3d::point2 mouse(Coordinates);\n\t\t\tconst k3d::point2 coords = Viewport.project(Position);\n\n\t\t\tstd::map<double, std::string> constraints;\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(Position + (Orientation * k3d::vector3(1, 0, 0))))), \"x_axis\"));\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(Position + (Orientation * k3d::vector3(0, 1, 0))))), \"y_axis\"));\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(Position + (Orientation * k3d::vector3(0, 0, 1))))), \"z_axis\"));\n\n\t\t\tset_constraint(constraints.begin()->second);\n\t\t}\n\n\t\tbegin_mouse_move(Coordinates, Position);\n\t}\n\n\tvoid begin_mouse_move(const k3d::point2& Coordinates, const k3d::point3& Origin)\n\t{\n\t\tm_current_constraint->begin_mouse_move(Coordinates, Origin);\n\t}\n\n\tk3d::vector3 mouse_move(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t{\n\t\treturn m_current_constraint->mouse_move(Viewport, Coordinates, Position, Orientation);\n\t}\n\nprivate:\n\t// Manipulator drawing/selection functions\n\tvoid draw_screen_xy(viewport::control& Viewport, const k3d::color& Color)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::color3d(Color);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, Color);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\n\t\tglEnable(GL_LIGHTING);\n    gluQuadricDrawStyle(quadric(), GLU_FILL);\n    gluQuadricNormals(quadric(), GLU_SMOOTH);\n    gluSphere(quadric(), m_screen_xy_radius, m_screen_xy_slices, m_screen_xy_stacks);\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid select_screen_xy(constraint& Constraint)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\n\t\tk3d::gl::push_selection_token(Constraint.m_selection_token);\n\n\t\tglDisable(GL_LIGHTING);\n    gluQuadricDrawStyle(quadric(), GLU_FILL);\n    gluQuadricNormals(quadric(), GLU_NONE);\n    gluSphere(quadric(), m_screen_xy_radius, m_screen_xy_slices, m_screen_xy_stacks);\n\n\t\tk3d::gl::pop_selection_token();\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid draw_axis(const k3d::color& ArrowColor, const k3d::color& AxisColor, const k3d::matrix4& Matrix)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(Matrix);\n\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(0, 0, m_axis_end - (0.5 * m_axis_arrow_length)));\n\t\tglEnable(GL_LIGHTING);\n\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, AxisColor);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n    gluQuadricDrawStyle(quadric(), GLU_FILL);\n    gluQuadricNormals(quadric(), GLU_SMOOTH);\n    gluCylinder(quadric(), m_axis_arrow_radius, m_axis_arrow_radius * 0.001, m_axis_arrow_length, m_axis_arrow_slices, 1);\n\t\tglPopMatrix();\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglHint(GL_LINE_SMOOTH_HINT, GL_NICEST);\n\t\tglEnable(GL_LINE_SMOOTH);\n\t\tglLineWidth(m_axis_line_width);\n\t\tk3d::gl::color3d(AxisColor);\n\t\tglBegin(GL_LINES);\n\t\t\tglVertex3d(0, 0, m_axis_start);\n\t\t\tglVertex3d(0, 0, m_axis_end);\n\t\tglEnd();\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid select_axis(constraint& Constraint, const k3d::matrix4& Matrix)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(Matrix);\n\n\t\tk3d::gl::push_selection_token(Constraint.m_selection_token);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(0, 0, m_axis_end - (0.5 * m_axis_arrow_length)));\n    gluQuadricDrawStyle(quadric(), GLU_FILL);\n    gluQuadricNormals(quadric(), GLU_NONE);\n    gluCylinder(quadric(), m_axis_arrow_radius, m_axis_arrow_radius * 0.001, m_axis_arrow_length, m_axis_arrow_slices, 1);\n\t\tglPopMatrix();\n\n\t\tglBegin(GL_LINES);\n\t\t\tglVertex3d(0, 0, m_axis_start);\n\t\t\tglVertex3d(0, 0, m_axis_end);\n\t\tglEnd();\n\t\tk3d::gl::pop_selection_token();\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid draw_plane(const k3d::color& Color, const k3d::vector3& P1, const k3d::vector3& P2, const k3d::vector3& P3)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tk3d::gl::color3d(Color);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglLineWidth(m_axis_line_width);\n\n\t\tglBegin(GL_LINE_STRIP);\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P1 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P2 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P3 * m_plane_size));\n\t\tglEnd();\n\t}\n\n\tvoid select_plane(constraint& Constraint, const k3d::vector3& P1, const k3d::vector3& P2, const k3d::vector3& P3)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tk3d::gl::push_selection_token(Constraint.m_selection_token);\n\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglBegin(GL_QUADS);\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P1 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P2 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P3 * m_plane_size));\n\t\tglEnd();\n\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\t/// Stores a GLU quadric object for drawing the manipulators\n  GLUquadricObj* m_quadric;\n  /// Get the quadric object, creating it as needed\n  GLUquadricObj* quadric()\n  {\n    if(!m_quadric)\n      m_quadric = gluNewQuadric();\n    return m_quadric;\n  }\n\n\t/// Stores the constraint that was in effect when movement began (if any)\n\tconstraint* m_current_constraint;\n\t/// Stores the constraint that was in effect before m_current_constraint\n\tconstraint* m_previous_constraint;\n\n\t// These are placeholders, used to identify hotspots in the manipulators\n\tconstraint m_screen_xy_constraint;\n\tconstraint m_x_constraint;\n\tconstraint m_y_constraint;\n\tconstraint m_z_constraint;\n\tconstraint m_xy_constraint;\n\tconstraint m_xz_constraint;\n\tconstraint m_yz_constraint;\n\n\t// Parameters that control the on-screen appearance of the tool\n\tdouble m_manipulators_size;\n\tdouble m_scale;\n\tk3d::color m_current_color;\n\tk3d::color m_x_color;\n\tk3d::color m_y_color;\n\tk3d::color m_z_color;\n\tk3d::color m_screen_xy_color;\n\tdouble m_plane_offset;\n\tdouble m_plane_size;\n\tdouble m_screen_xy_radius;\n\tunsigned long m_screen_xy_slices;\n\tunsigned long m_screen_xy_stacks;\n\tdouble m_axis_start;\n\tdouble m_axis_end;\n\tdouble m_axis_line_width;\n\tdouble m_axis_arrow_radius;\n\tdouble m_axis_arrow_length;\n\tunsigned long m_axis_arrow_slices;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// move_tool\n\nmove_tool::move_tool(document_state& DocumentState, const std::string& Name) :\n\ttransform_tool_base(DocumentState.document(), DocumentState, Name),\n\tm_mutex(false),\n\tm_move(init_owner(*this) + init_name(\"move\") + init_label(_(\"Move\")) + init_description(_(\"Move\")) + init_value(k3d::point3(0, 0, 0))),\n\tm_world_position(init_owner(*this) + init_name(\"world_position\") + init_label(_(\"World position\")) + init_description(_(\"Manipulators' world position\")) + init_value(k3d::point3(0, 0, 0)))\n{\n\tm_world_position.set_update_slot(sigc::mem_fun(*this, &move_tool::get_world_position));\n\n\tm_move.connect_explicit_change_signal(sigc::mem_fun(*this, &move_tool::on_move));\n\n\tm_input_model.connect_lbutton_down(sigc::mem_fun(*this, &move_tool::on_lbutton_down));\n\tm_input_model.connect_lbutton_click(sigc::mem_fun(*this, &move_tool::on_lbutton_click));\n\tm_input_model.connect_lbutton_start_drag(sigc::mem_fun(*this, &move_tool::on_lbutton_start_drag));\n\tm_input_model.connect_lbutton_drag(sigc::mem_fun(*this, &move_tool::on_lbutton_drag));\n\tm_input_model.connect_lbutton_end_drag(sigc::mem_fun(*this, &move_tool::on_lbutton_end_drag));\n\tm_input_model.connect_mbutton_click(sigc::mem_fun(*this, &move_tool::on_mbutton_click));\n\tm_input_model.connect_rbutton_click(sigc::mem_fun(*this, &move_tool::on_rbutton_click));\n\tm_input_model.connect_mouse_move(sigc::mem_fun(*this, &move_tool::on_mouse_move));\n\n\tm_manipulators = new detail::move_manipulators();\n}\n\nmove_tool::~move_tool()\n{\n\tdelete m_manipulators;\n}\n\nvoid move_tool::on_activate()\n{\n\tm_manipulators->activate();\n\n\tm_visible_manipulators.set_value(true);\n\n\ton_document_selection_changed();\n\n\ttool_selection::redraw_all();\n}\n\nvoid move_tool::on_deactivate()\n{\n\tif(MOTION_NONE != m_current_motion)\n\t\tcancel_mouse_move();\n\n\tclear_targets();\n\n\tm_document_state.clear_cursor_signal().emit();\n\ttool_selection::redraw_all();\n}\n\nvoid move_tool::on_document_selection_changed()\n{\n\ttarget_list_changed();\n\tupdate_targets();\n\treset();\n\n\t// Update world position\n\tm_world_position.update();\n}\n\nvoid move_tool::on_redraw(viewport::control& Viewport)\n{\n\t// Update target list\n\tupdate_targets();\n\n\t// Redraw manipulators\n\tm_manipulators->redraw(Viewport, (m_visible_manipulators.internal_value() && target_number()), world_position(), world_orientation(), m_current_motion, k3d::point3(1.0, 1.0, 1.0));\n}\n\nvoid move_tool::on_select(viewport::control& Viewport)\n{\n\tif(m_visible_manipulators.internal_value() && target_number())\n\t\tm_manipulators->select(Viewport, world_position(), world_orientation());\n}\n\nk3d::iproperty_collection* move_tool::get_property_collection()\n{\n\treturn dynamic_cast<k3d::iproperty_collection*>(this);\n}\n\nviewport_input_model& move_tool::get_input_model()\n{\n\treturn input_model();\n}\n\n// LMB drag actions\nk3d::vector3 move_tool::mouse_move_to_3d(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\t// Transform mouse move to a world move\n\tconst k3d::point3 origin = world_position();\n\tconst k3d::matrix4 orientation = world_orientation();\n\tconst k3d::vector3 delta = m_manipulators->mouse_move(Viewport, Coordinates, origin, orientation);\n\n\treturn delta;\n}\n\nk3d::vector3 move_tool::lbutton_drag(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_DRAG == m_current_motion)\n\t{\n\t\tconst k3d::vector3 delta = mouse_move_to_3d(Viewport, Coordinates);\n\t\tmove_selection(delta);\n\n\t\treturn delta;\n\t}\n\n\tif(MOTION_BOX_SELECT == m_current_motion)\n\t\tlmb_drag_box_select(Viewport, Coordinates);\n\n\treturn k3d::vector3(0, 0, 0);\n}\n\nk3d::vector3 move_tool::mouse_move_action(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_CLICK_DRAG == m_current_motion)\n\t{\n\t\tconst k3d::vector3 delta = mouse_move_to_3d(Viewport, Coordinates);\n\t\tmove_selection(delta);\n\n\t\treturn delta;\n\t}\n\n\treturn k3d::vector3(0, 0, 0);\n}\n\nvoid move_tool::move_selection(const k3d::vector3& Delta)\n{\n\tif(Delta == k3d::vector3(0, 0, 0))\n\t\treturn;\n\n\tconst k3d::point3 new_position = m_move.internal_value() + Delta;\n\tm_move.set_value(new_position);\n}\n\nvoid move_tool::on_move(k3d::iunknown*)\n{\n\tif(m_mutex)\n\t\treturn;\n\n\tmove_targets(k3d::to_vector(m_move.internal_value()));\n\n\t// Update world position\n\tm_world_position.update();\n}\n\nvoid move_tool::get_world_position(const std::vector<k3d::ihint*>& Hints, k3d::point3& Output)\n{\n\tOutput = world_position();\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/move_tool.h",
    "content": "#ifndef K3DSDK_NGUI_MOVE_TOOL_H\n#define K3DSDK_NGUI_MOVE_TOOL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/ngui/transform_tool.h>\n\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// move_tool\n\n/// Implementation of tool that implements standard geometry move behavior\nclass move_tool :\n\tpublic transform_tool\n{\n\ttypedef transform_tool transform_tool_base;\n\npublic:\n\tmove_tool(document_state& DocumentState, const std::string& Name);\n\t~move_tool();\n\n\tconst k3d::string_t tool_type() { return \"move_tool\"; }\n\nprivate:\n\tvoid on_activate();\n\tvoid on_deactivate();\n\tvoid on_document_selection_changed();\n\tvoid on_redraw(viewport::control& Viewport);\n\tvoid on_select(viewport::control& Viewport);\n\n\tk3d::iproperty_collection* get_property_collection();\n\tviewport_input_model& get_input_model();\n\n\tvoid on_lbutton_down(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\t\tconst k3d::key_modifiers modifiers = convert(Event.state);\n\n\t\tlbutton_down(Viewport, coordinates, modifiers);\n\t}\n\n\tvoid on_lbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_click(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_start_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_start_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tk3d::point2 coordinates(Event.x, Event.y);\n\n\t\t// Off-screen wrap\n\t\toff_screen_warp(Viewport, coordinates);\n\n\t\tconst k3d::vector3 move = lbutton_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_end_drag(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_end_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_mbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\t\tconst k3d::key_modifiers modifiers = convert(Event.state);\n\n\t\tmbutton_click(Viewport, coordinates, modifiers);\n\t}\n\n\tvoid on_rbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\trbutton_click(Viewport, coordinates);\n\t}\n\n\tvoid on_mouse_move(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tif(MOTION_CLICK_DRAG != m_current_motion)\n\t\t\treturn;\n\n\t\tk3d::point2 coordinates(Event.x, Event.y);\n\n\t\t// Off-screen wrap\n\t\toff_screen_warp(Viewport, coordinates);\n\n\t\tconst k3d::vector3 move = mouse_move_action(Viewport, coordinates);\n\t}\n\n\t// Manipulator functions\n\tvirtual std::string manipulator_name(const k3d::selection::id ID)\n\t{\n\t\treturn m_manipulators->constraint_name(ID);\n\t}\n\n\tvirtual std::string get_manipulator(const manipulators_t& Manipulators)\n\t{\n\t\tif(!Manipulators.size())\n\t\t\treturn std::string(\"\");\n\n\t\t// Give priority to the middle sphere since the invisible planes intersect it\n\t\tif(std::find(Manipulators.begin(), Manipulators.end(), std::string(\"screen_xy\"))\n\t\t\t!= Manipulators.end())\n\t\t\treturn std::string(\"screen_xy\");\n\n\t\treturn *Manipulators.begin();\n\t}\n\n\tvirtual void set_manipulator(const std::string ManipulatorName)\n\t{\n\t\tm_document_state.set_cursor_signal().emit(m_manipulators->set_constraint(ManipulatorName));\n\t}\n\n\tvirtual std::string get_constraint_name()\n\t{\n\t\treturn m_manipulators->get_constraint_name();\n\t}\n\n\tvirtual void begin_mouse_move(const k3d::point2& Coordinates)\n\t{\n\t\tstart_move();\n\t\treset();\n\n\t\tm_manipulators->begin_mouse_move(Coordinates, world_position());\n\t}\n\n\tvirtual void update_constraint(viewport::control& Viewport, const k3d::point2& Coordinates)\n\t{\n\t\tm_manipulators->update_constraint(Viewport, Coordinates, world_position(), world_orientation());\n\n\t\tbegin_mouse_move(Coordinates);\n\t}\n\n\tvirtual void reset()\n\t{\n\t\tm_mutex = true;\n\t\tm_move.set_value(k3d::point3(0, 0, 0));\n\t\tm_mutex = false;\n\t}\n\n\t// LMB drag actions\n\tk3d::vector3 mouse_move_to_3d(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tk3d::vector3 lbutton_drag(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tk3d::vector3 mouse_move_action(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid move_selection(const k3d::vector3& Delta);\n\tvoid on_move(k3d::iunknown*);\n\n\tvoid get_world_position(const std::vector<k3d::ihint*>& Hints, k3d::point3& Output);\n\n\t/// Stores manipulators\n\tdetail::imanipulators<k3d::vector3>* m_manipulators;\n\n\t// Move value\n\tbool m_mutex;\n\tk3d_data(k3d::point3, immutable_name, explicit_change_signal, with_undo, local_storage, no_constraint, writable_property, no_serialization) m_move;\n\tk3d_data(k3d::point3, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_world_position;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_MOVE_TOOL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/navigation_input_model.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gdkmm/display.h>\n\n#include <k3dsdk/ngui/context_menu.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/interactive.h>\n#include <k3dsdk/ngui/navigation_input_model.h>\n#include <k3dsdk/ngui/target.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n\n#include <k3dsdk/high_res_timer.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/utility_gl.h>\n#include <k3dsdk/xml.h>\n\n#include <gtkmm/menu.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\n/// Returns the angle of this vector with respect to the positive X axis in radians [-pi, pi]\ndouble angle(const k3d::vector2& Vector)\n{\n\treturn atan2(Vector[1], Vector[0]);\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// navigation_input_model::implementation\n\nstruct navigation_input_model::implementation\n{\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState)\n\t{\n\t}\n\n\tvoid on_button1_start_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\treturn_if_fail(interactive_target(Viewport));\n\t\treturn_if_fail(Viewport.camera());\n\n\t\tif(Event.state & GDK_CONTROL_MASK)\n\t\t{\n\t\t\tmotion_state = MOTION_ZOOM;\n\t\t}\n\t\telse if(Event.state & GDK_SHIFT_MASK)\n\t\t{\n\t\t\tmotion_state = MOTION_PAN_TILT;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmotion_state = MOTION_TRACK;\n\t\t}\n\n\t\tk3d::start_state_change_set(m_document_state.document(), K3D_CHANGE_SET_CONTEXT);\n\t\tm_last_mouse = screen_pointer_coordinates(Viewport);\n\t\tm_timer.restart();\n\n\t\tswitch(motion_state)\n\t\t{\n\t\t\tcase MOTION_ZOOM:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MOTION_PAN_TILT:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MOTION_TRACK:\n\t\t\t{\n\t\t\t\tm_track_sensitivity = k3d::distance(k3d::position(Viewport.get_view_matrix()), Viewport.get_target());\n\n\t\t\t\t// Adapt sensitivity to FOV\n\t\t\t\tdouble top = 0;\n\t\t\t\tdouble bottom = 0;\n\t\t\t\tdouble near = 0;\n\t\t\t\tif(k3d::iperspective* const perspective = dynamic_cast<k3d::iperspective*>(&Viewport.camera()->projection()))\n\t\t\t\t{\n\t\t\t\t\ttop = k3d::property::pipeline_value<double>(perspective->top());\n\t\t\t\t\tbottom = k3d::property::pipeline_value<double>(perspective->bottom());\n\t\t\t\t\tnear = k3d::property::pipeline_value<double>(perspective->near());\n\n\t\t\t\t}\n\t\t\t\telse if(k3d::iorthographic* const orthographic = dynamic_cast<k3d::iorthographic*>(&Viewport.camera()->projection()))\n\t\t\t\t{\n\t\t\t\t\ttop = k3d::property::pipeline_value<double>(orthographic->top());\n\t\t\t\t\tbottom = k3d::property::pipeline_value<double>(orthographic->bottom());\n\t\t\t\t\tnear = k3d::property::pipeline_value<double>(orthographic->near());\n\t\t\t\t}\n\n\t\t\t\tif(near > 0)\n\t\t\t\t{\n\t\t\t\t\tconst double height = top - bottom;\n\t\t\t\t\tconst double tan_fov = height / near;\n\t\t\t\t\tm_track_sensitivity *= tan_fov;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tassert_not_reached();\n\t\t}\n\t}\n\n\tvoid on_button2_start_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\treturn_if_fail(interactive_target(Viewport));\n\t\treturn_if_fail(Viewport.camera());\n\n\t\tif(Event.state & GDK_CONTROL_MASK)\n\t\t{\n\t\t\tmotion_state = MOTION_DOLLY;\n\t\t}\n\t\telse if(Event.state & GDK_SHIFT_MASK)\n\t\t{\n\t\t\tmotion_state = MOTION_ROLL;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmotion_state = MOTION_ORBIT;\n\t\t}\n\n\t\tk3d::start_state_change_set(m_document_state.document(), K3D_CHANGE_SET_CONTEXT);\n\t\tm_last_mouse = screen_pointer_coordinates(Viewport);\n\t\tm_timer.restart();\n\n\t\tswitch(motion_state)\n\t\t{\n\t\t\tcase MOTION_DOLLY:\n\t\t\t{\n\t\t\t\tconst double target_distance = k3d::distance(k3d::position(Viewport.get_view_matrix()), Viewport.get_target());\n\t\t\t\tm_dolly_sensitivity = target_distance ? target_distance : 0.001;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MOTION_ROLL:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MOTION_ORBIT:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tassert_not_reached();\n\t\t}\n\t}\n\n\tvoid on_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\treturn_if_fail(Viewport.camera());\n\n\t\tswitch(motion_state)\n\t\t{\n\t\t\tcase MOTION_TRACK:\n\t\t\t\ton_track_motion(Viewport, Event);\n\t\t\t\tbreak;\n\t\t\tcase MOTION_DOLLY:\n\t\t\t\ton_dolly_motion(Viewport, Event);\n\t\t\t\tbreak;\n\t\t\tcase MOTION_ZOOM:\n\t\t\t\ton_zoom_motion(Viewport, Event);\n\t\t\t\tbreak;\n\t\t\tcase MOTION_PAN_TILT:\n\t\t\t\ton_pan_tilt_motion(Viewport, Event);\n\t\t\t\tbreak;\n\t\t\tcase MOTION_ORBIT:\n\t\t\t\ton_orbit_motion(Viewport, Event);\n\t\t\t\tbreak;\n\t\t\tcase MOTION_ROLL:\n\t\t\t\ton_roll_motion(Viewport, Event);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid on_end_drag(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\treturn_if_fail(Viewport.camera());\n\n\t\tViewport.get_window()->set_cursor();\n\n\t\tswitch(motion_state)\n\t\t{\n\t\t\tcase MOTION_TRACK:\n\t\t\t\tk3d::finish_state_change_set(m_document_state.document(), _(\"Track Viewport\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tbreak;\n\t\t\tcase MOTION_DOLLY:\n\t\t\t\tk3d::finish_state_change_set(m_document_state.document(), _(\"Dolly Viewport\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tbreak;\n\t\t\tcase MOTION_ZOOM:\n\t\t\t\tk3d::finish_state_change_set(m_document_state.document(), _(\"Zoom Viewport\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tbreak;\n\t\t\tcase MOTION_PAN_TILT:\n\t\t\t\tk3d::finish_state_change_set(m_document_state.document(), _(\"Pan & Tilt Viewport\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tbreak;\n\t\t\tcase MOTION_ORBIT:\n\t\t\t\tk3d::finish_state_change_set(m_document_state.document(), _(\"Orbit Viewport\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tbreak;\n\t\t\tcase MOTION_ROLL:\n\t\t\t\tk3d::finish_state_change_set(m_document_state.document(), _(\"Roll Viewport\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/// Called to track the viewport (move left/right/up/down in screen space) in response to mouse motion\n\tvoid on_track_motion(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::matrix4 view_matrix = Viewport.get_view_matrix();\n\t\tconst k3d::vector3 look_vector = k3d::look_vector(view_matrix);\n\t\tconst k3d::vector3 up_vector = k3d::up_vector(view_matrix);\n\t\tconst k3d::vector3 right_vector = k3d::right_vector(view_matrix);\n\t\tconst k3d::point3 position = k3d::position(view_matrix);\n\n\t\tconst k3d::point2 current_mouse = screen_pointer_coordinates(Viewport);\n\t\tconst k3d::point2 current_ndc = ndc(Viewport, current_mouse);\n\t\tconst k3d::point2 last_ndc = ndc(Viewport, m_last_mouse);\n\n\t\tconst double direction = 1.0; // Change the sign to set the One True Tracking Behavior\n\t\tconst double deltax = last_ndc[0] - current_ndc[0];\n\t\tconst double deltay = last_ndc[1] - current_ndc[1];\n\n\t\tconst k3d::vector3 offset =\n\t\t\t(m_track_sensitivity * direction * deltax * right_vector) +\n\t\t\t(m_track_sensitivity * direction * deltay * up_vector);\n\n\t\tconst k3d::point3 new_position = position + offset;\n\t\tconst k3d::point3 new_target = Viewport.get_target() + offset;\n\t\tconst k3d::matrix4 new_view_matrix = k3d::view_matrix(look_vector, up_vector, new_position);\n\n\t\tViewport.set_view_matrix(new_view_matrix);\n\t\tViewport.set_target(new_target);\n\n\t\tm_last_mouse = current_mouse;\n\t\twrap_mouse_pointer(Viewport);\n\t}\n\n\t/// Called to dolly the viewport (move forward/backward in screen space) in response to mouse motion\n\tvoid on_dolly_motion(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::point2 current_mouse = screen_pointer_coordinates(Viewport);\n\t\tconst double deltay = ndc(Viewport, current_mouse)[1] - ndc(Viewport, m_last_mouse)[1];\n\n\t\tconst k3d::matrix4 view_matrix = Viewport.get_view_matrix();\n\t\tconst k3d::vector3 look_vector = k3d::look_vector(view_matrix);\n\t\tconst k3d::vector3 up_vector = k3d::up_vector(view_matrix);\n\t\tconst k3d::vector3 right_vector = k3d::right_vector(view_matrix);\n\t\tconst k3d::point3 position = k3d::position(view_matrix);\n\t\tconst k3d::point3 new_position = position + (deltay * m_dolly_sensitivity * look_vector);\n\t\tconst k3d::matrix4 new_view_matrix = k3d::view_matrix(look_vector, up_vector, new_position);\n\n\t\tViewport.set_view_matrix(new_view_matrix);\n\n\t\tm_last_mouse = current_mouse;\n\t\twrap_mouse_pointer(Viewport);\n\t}\n\n\t/// Called to zoom the viewport (change focal length) in response to mouse motion\n\tvoid on_zoom_motion(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::point2 current_mouse = screen_pointer_coordinates(Viewport);\n\t\tconst k3d::point2 current_ndc = ndc(Viewport, current_mouse);\n\t\tconst k3d::point2 last_ndc = ndc(Viewport, m_last_mouse);\n\n\t\tconst double sensitivity = 4.0;\n\t\tconst double zoom_factor = (current_ndc[1] < last_ndc[1]) ? std::pow(sensitivity, last_ndc[1] - current_ndc[1]) : std::pow(1 / sensitivity, current_ndc[1] - last_ndc[1]);\n\n\t\tk3d::iprojection* const projection = Viewport.camera() ? &Viewport.camera()->projection() : 0;\n\t\treturn_if_fail(projection);\n\n\t\tif(k3d::iperspective* const perspective = dynamic_cast<k3d::iperspective*>(projection))\n\t\t{\n\t\t\tconst double left = boost::any_cast<double>(perspective->left().property_internal_value()) * zoom_factor;\n\t\t\tconst double right = boost::any_cast<double>(perspective->right().property_internal_value()) * zoom_factor;\n\t\t\tconst double top = boost::any_cast<double>(perspective->top().property_internal_value()) * zoom_factor;\n\t\t\tconst double bottom = boost::any_cast<double>(perspective->bottom().property_internal_value()) * zoom_factor;\n\n\t\t\tk3d::property::set_internal_value(perspective->left(), left);\n\t\t\tk3d::property::set_internal_value(perspective->right(), right);\n\t\t\tk3d::property::set_internal_value(perspective->top(), top);\n\t\t\tk3d::property::set_internal_value(perspective->bottom(), bottom);\n\n\t\t\tm_last_mouse = current_mouse;\n\t\t\twrap_mouse_pointer(Viewport);\n\t\t\treturn;\n\t\t}\n\n\t\tif(k3d::iorthographic* const orthographic = dynamic_cast<k3d::iorthographic*>(projection))\n\t\t{\n\t\t\tconst double left = boost::any_cast<double>(orthographic->left().property_internal_value()) * zoom_factor;\n\t\t\tconst double right = boost::any_cast<double>(orthographic->right().property_internal_value()) * zoom_factor;\n\t\t\tconst double top = boost::any_cast<double>(orthographic->top().property_internal_value()) * zoom_factor;\n\t\t\tconst double bottom = boost::any_cast<double>(orthographic->bottom().property_internal_value()) * zoom_factor;\n\n\t\t\tk3d::property::set_internal_value(orthographic->left(), left);\n\t\t\tk3d::property::set_internal_value(orthographic->right(), right);\n\t\t\tk3d::property::set_internal_value(orthographic->top(), top);\n\t\t\tk3d::property::set_internal_value(orthographic->bottom(), bottom);\n\n\t\t\tm_last_mouse = current_mouse;\n\t\t\twrap_mouse_pointer(Viewport);\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::log() << error << \"Unknown projection type\" << std::endl;\n\t}\n\n\t/// Called to orbit the viewport (rotate it around an arbitrary origin) in response to mouse motion\n\tvoid on_orbit_motion(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::matrix4 view_matrix = Viewport.get_view_matrix();\n\t\tconst k3d::vector3 look_vector = k3d::look_vector(view_matrix);\n\t\tconst k3d::vector3 up_vector = k3d::up_vector(view_matrix);\n\t\tconst k3d::vector3 right_vector = k3d::right_vector(view_matrix);\n\t\tconst k3d::point3 position = k3d::position(view_matrix);\n\t\tconst k3d::point3 target = Viewport.get_target();\n\n\t\tconst k3d::point2 current_mouse = screen_pointer_coordinates(Viewport);\n\t\tconst k3d::point2 current_ndc = ndc(Viewport, current_mouse);\n\t\tconst k3d::point2 last_ndc = ndc(Viewport, m_last_mouse);\n\n/* This snippet orbits the camera within the view plane.\n   Pros: works intuitively regardless of camera orientation, completely axis-independent.\n   Cons: weak for modeling, the camera quickly becomes \"tilted\" WRT the ground plane.\n\n\t\tconst k3d::point3 target = Viewport.get_target();\n\t\tconst double target_distance = k3d::length(position - target);\n\n\t\tconst double direction = 1.0;\n\t\tconst double sensitivity = k3d::pi() * target_distance;\n\t\tconst double deltax = last_ndc[0] - current_ndc[0];\n\t\tconst double deltay = last_ndc[1] - current_ndc[1];\n\n\t\tconst k3d::vector3 offset =\n\t\t\t(sensitivity * direction * deltax * right_vector) +\n\t\t\t(sensitivity * direction * deltay * up_vector);\n\n\t\tk3d::point3 new_position = position + offset;\n\t\tnew_position *= (target_distance / k3d::length(target - new_position));\n\t\tconst k3d::vector3 new_look_vector = k3d::to_vector(target - new_position);\n\n\t\tViewport.set_view_matrix(k3d::view_matrix(new_look_vector, up_vector, right_vector, new_position));\n*/\n\n\t\tconst double direction = -1.0;\n\t\tconst double sensitivity = k3d::pi();\n\t\tconst double ysensitivity = -1.0;\n\t\tconst double deltax = last_ndc[0] - current_ndc[0];\n\t\tconst double deltay = last_ndc[1] - current_ndc[1];\n\n\t\tconst k3d::matrix4 matrix =\n\t\t\tk3d::rotate3(k3d::angle_axis(sensitivity * direction * deltax, Viewport.get_up_axis())) *\n\t\t\tk3d::rotate3(k3d::angle_axis(ysensitivity * sensitivity * direction * deltay, right_vector));\n\n\t\tconst k3d::vector3 new_look_vector = matrix * look_vector;\n\t\tconst k3d::vector3 new_up_vector = matrix * up_vector;\n\t\tconst k3d::vector3 new_right_vector = matrix * right_vector;\n\t\tconst k3d::point3 new_position = target + (matrix * (position - target));\n\n\t\tconst k3d::matrix4 new_view_matrix = k3d::view_matrix(new_look_vector, new_up_vector, new_position);\n\n\t\tViewport.set_view_matrix(new_view_matrix);\n\n\t\tm_last_mouse = current_mouse;\n\t\twrap_mouse_pointer(Viewport);\n\t}\n\n\t/// Called to aim the viewport (pan and tilt) in response to mouse motion\n\tvoid on_pan_tilt_motion(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::matrix4 view_matrix = Viewport.get_view_matrix();\n\t\tconst k3d::vector3 look_vector = k3d::look_vector(view_matrix);\n\t\tconst k3d::vector3 up_vector = k3d::up_vector(view_matrix);\n\t\tconst k3d::vector3 right_vector = k3d::right_vector(view_matrix);\n\t\tconst k3d::point3 position = k3d::position(view_matrix);\n\t\tconst double target_distance = k3d::distance(k3d::position(Viewport.get_view_matrix()), Viewport.get_target());\n\n\t\tconst k3d::point2 current_mouse = screen_pointer_coordinates(Viewport);\n\t\tconst k3d::point2 current_ndc = ndc(Viewport, current_mouse);\n\t\tconst k3d::point2 last_ndc = ndc(Viewport, m_last_mouse);\n\n\t\tconst double theta = current_ndc[0] - last_ndc[0];\n\t\tconst double phi = -(current_ndc[1] - last_ndc[1]);\n\n\t\tconst k3d::matrix4 matrix = k3d::rotate3(k3d::angle_axis(theta, up_vector)) * k3d::rotate3(k3d::angle_axis(phi, right_vector));\n\n\t\tconst k3d::vector3 new_look_vector = matrix * look_vector;\n\t\tconst k3d::vector3 new_up_vector = matrix * up_vector;\n\t\tconst k3d::vector3 new_right_vector = matrix * right_vector;\n\n\t\tconst k3d::matrix4 new_view_matrix = k3d::view_matrix(new_look_vector, new_up_vector, position);\n\t\tconst k3d::point3 new_target = position + (target_distance * k3d::normalize(new_look_vector));\n\n\t\tViewport.set_view_matrix(new_view_matrix);\n\t\tViewport.set_target(new_target);\n\n\t\tm_last_mouse = current_mouse;\n\t\twrap_mouse_pointer(Viewport);\n\t}\n\n\t/// Called to roll the viewport (dutch tilt) in response to mouse motion\n\tvoid on_roll_motion(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::matrix4 view_matrix = Viewport.get_view_matrix();\n\t\tconst k3d::vector3 look_vector = k3d::look_vector(view_matrix);\n\t\tconst k3d::vector3 up_vector = k3d::up_vector(view_matrix);\n\t\tconst k3d::vector3 right_vector = k3d::right_vector(view_matrix);\n\t\tconst k3d::point3 position = k3d::position(view_matrix);\n\n\t\tconst k3d::point2 current_mouse = screen_pointer_coordinates(Viewport);\n\t\tconst k3d::point2 current_ndc = ndc(Viewport, current_mouse);\n\t\tconst k3d::point2 last_ndc = ndc(Viewport, m_last_mouse);\n\t\tconst double theta = detail::angle(k3d::to_vector(current_ndc)) - detail::angle(k3d::to_vector(last_ndc));\n\n\t\tconst k3d::matrix4 roll_matrix = k3d::rotate3(k3d::angle_axis(-theta, look_vector));\n\t\tconst k3d::vector3 new_up_vector = roll_matrix * up_vector;\n\t\tconst k3d::vector3 new_right_vector = roll_matrix * right_vector;\n\n\t\tconst k3d::matrix4 new_view_matrix = k3d::view_matrix(look_vector, new_up_vector, position);\n\n\t\tViewport.set_view_matrix(new_view_matrix);\n\n\t\tm_last_mouse = current_mouse;\n\t}\n\n\t/// Called to dolly the viewport (move forward / backward in screen space) in response to mouse-wheel motion\n\tvoid on_scroll(viewport::control& Viewport, const GdkEventScroll& Event)\n\t{\n\t\treturn_if_fail(Viewport.camera());\n\n\t\tconst k3d::matrix4 view_matrix = Viewport.get_view_matrix();\n\t\tconst k3d::vector3 look = k3d::look_vector(view_matrix);\n\t\tconst k3d::vector3 up = k3d::up_vector(view_matrix);\n\t\tconst k3d::vector3 right = k3d::right_vector(view_matrix);\n\t\tconst k3d::point3 position = k3d::position(view_matrix);\n\n\t\tconst double target_distance = k3d::distance(position, Viewport.get_target());\n\t\tif(!target_distance)\n\t\t\tm_dolly_sensitivity = 0.001;\n\t\telse\n\t\t\tm_dolly_sensitivity = target_distance * 0.1;\n\n\t\tdouble direction = 0;\n\t\tstd::string direction_label;\n\t\tstd::string change_set_label;\n\t\tswitch(Event.direction)\n\t\t{\n\t\t\tcase GDK_SCROLL_UP:\n\t\t\t\tdirection = 1;\n\t\t\t\tdirection_label = \"forward\";\n\t\t\t\tchange_set_label = _(\"Dolly Forward\");\n\t\t\t\tbreak;\n\t\t\tcase GDK_SCROLL_DOWN:\n\t\t\t\tdirection = -1;\n\t\t\t\tdirection_label = \"backward\";\n\t\t\t\tchange_set_label = _(\"Dolly Backward\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tconst k3d::matrix4 new_view_matrix = k3d::view_matrix(look, up, position + (m_dolly_sensitivity * direction * look));\n\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), change_set_label, K3D_CHANGE_SET_CONTEXT);\n\t\tViewport.set_view_matrix(new_view_matrix);\n\t}\n\n\tvoid on_button1_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\treturn_if_fail(Viewport.camera());\n\n\t\tconst k3d::selection::record selection = Viewport.pick_node(k3d::point2(Event.x, Event.y));\n\t\tif(!selection.empty())\n\t\t{\n\t\t\t// Get the new target position in world coordinates ...\n\t\t\tk3d::inode* const node = k3d::selection::get_node(selection);\n\t\t\tconst k3d::point3 new_target = node ? k3d::world_position(*node) : k3d::point3(0, 0, 0);\n\n\t\t\tconst k3d::matrix4 view_matrix = Viewport.get_view_matrix();\n\t\t\tconst k3d::vector3 look_vector = k3d::look_vector(view_matrix);\n\t\t\tconst k3d::vector3 up_vector = k3d::up_vector(view_matrix);\n\t\t\tconst k3d::vector3 right_vector = k3d::right_vector(view_matrix);\n\t\t\tconst k3d::point3 position = k3d::position(view_matrix);\n\n\t\t\tconst k3d::vector3 new_look_vector = new_target - position;\n\t\t\tconst k3d::vector3 new_right_vector = new_look_vector ^ Viewport.get_up_axis();\n\t\t\tconst k3d::vector3 new_up_vector = new_right_vector ^ new_look_vector;\n\n\t\t\tconst k3d::matrix4 new_view_matrix = k3d::view_matrix(new_look_vector, new_up_vector, position);\n\n\t\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Pick Target\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\tViewport.set_view_matrix(new_view_matrix);\n\t\t\tViewport.set_target(new_target);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Aim Selection\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\taim_selection(m_document_state, Viewport);\n\t\t}\n\t}\n\n\tvoid on_context_menu(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tm_document_state.popup_context_menu();\n\t}\n\n\tvoid wrap_mouse_pointer(viewport::control& Viewport)\n\t{\n\t\tint x, y;\n\t\tGdk::ModifierType modifiers;\n\t\tGdk::Display::get_default()->get_pointer(x, y, modifiers);\n\n\t\tconst int border = 5;\n\t\tconst int width = Viewport.get_screen()->get_width();\n\t\tconst int height = Viewport.get_screen()->get_height();\n\n\t\tif(x < border)\n\t\t{\n\t\t\tm_last_mouse = k3d::point2(width - (border + 1), y);\n\t\t\tinteractive::warp_pointer(k3d::point2(width - (border + 1), y));\n\t\t}\n\t\telse if(width - x < border)\n\t\t{\n\t\t\tm_last_mouse = k3d::point2((border + 1), y);\n\t\t\tinteractive::warp_pointer(k3d::point2((border + 1), y));\n\t\t}\n\n\t\tif(y < border)\n\t\t{\n\t\t\tm_last_mouse = k3d::point2(x, height - (border + 1));\n\t\t\tinteractive::warp_pointer(k3d::point2(x, height - (border + 1)));\n\t\t}\n\t\telse if(height - y < border)\n\t\t{\n\t\t\tm_last_mouse = k3d::point2(x, (border + 1));\n\t\t\tinteractive::warp_pointer(k3d::point2(x, (border + 1)));\n\t\t}\n\t}\n\n\tk3d::iunknown* interactive_target(viewport::control& Viewport)\n\t{\n\t\treturn Viewport.camera() ? &Viewport.camera()->navigation_target() : 0;\n\t}\n\n\tk3d::iunknown* interactive_target(k3d::iunknown& Unknown)\n\t{\n\t\tviewport::control* const control = dynamic_cast<viewport::control*>(&Unknown);\n\t\treturn_val_if_fail(control, 0);\n\n\t\treturn control->camera() ? &control->camera()->navigation_target() : 0;\n\t}\n\n\t/// Converts screen coordinates into normalized device coordinates in the range [-0.5, 0.5]\n\tconst k3d::point2 ndc(viewport::control& Viewport, const k3d::point2 ScreenCoords)\n\t{\n\t\tint x, y;\n\t\tViewport.get_window()->get_origin(x, y);\n\n\t\tconst double width = Viewport.get_width();\n\t\tconst double height = Viewport.get_height();\n\t\treturn_val_if_fail(width && height, k3d::point2());\n\n\t\treturn k3d::point2(\n\t\t\t((ScreenCoords[0] - x) / width) - 0.5,\n\t\t\t0.5 - ((ScreenCoords[1] - y) / height));\n\t}\n\n\t/// Returns the current mouse position in screen coordinates\n\tconst k3d::point2 screen_pointer_coordinates(viewport::control& Viewport)\n\t{\n\t\tint x, y;\n\t\tGdk::ModifierType modifiers;\n\t\tViewport.get_display()->get_pointer(x, y, modifiers);\n\n\t\treturn k3d::point2(x, y);\n\t}\n\n\t/// Enumerates mouse motion types\n\ttypedef enum\n\t{\n\t\tMOTION_TRACK,\n\t\tMOTION_DOLLY,\n\t\tMOTION_ZOOM,\n\t\tMOTION_PAN_TILT,\n\t\tMOTION_ORBIT,\n\t\tMOTION_ROLL,\n\t} motion_state_t;\n\n\t/// Stores a reference to the owning document\n\tdocument_state& m_document_state;\n\t/// Stores the current mouse motion type\n\tmotion_state_t motion_state;\n\t/// Stores the most recent mouse pointer coordinates\n\tk3d::point2 m_last_mouse;\n\t/// Controls the sensitivity of tracking movement while dragging\n\tdouble m_track_sensitivity;\n\t/// Controls the sensitivity of dollying movement while dragging\n\tdouble m_dolly_sensitivity;\n\n\t/// Context menu\n\tstd::unique_ptr<Gtk::Menu> m_context_menu;\n\n\tk3d::timer m_timer;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// navigation_input_model\n\nnavigation_input_model::navigation_input_model(document_state& DocumentState) :\n\tm_implementation(new implementation(DocumentState))\n{\n}\n\nnavigation_input_model::~navigation_input_model()\n{\n\tdelete m_implementation;\n}\n\nvoid navigation_input_model::on_button1_click(viewport::control& Viewport, const GdkEventButton& Event)\n{\n\tm_implementation->on_button1_click(Viewport, Event);\n}\n\nvoid navigation_input_model::on_button1_start_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n{\n\tm_implementation->on_button1_start_drag(Viewport, Event);\n}\n\nvoid navigation_input_model::on_button1_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n{\n\tm_implementation->on_drag(Viewport, Event);\n}\n\nvoid navigation_input_model::on_button1_end_drag(viewport::control& Viewport, const GdkEventButton& Event)\n{\n\tm_implementation->on_end_drag(Viewport, Event);\n}\n\nvoid navigation_input_model::on_button2_click(viewport::control& Viewport, const GdkEventButton& Event)\n{\n\tm_implementation->on_context_menu(Viewport, Event);\n}\n\nvoid navigation_input_model::on_button2_start_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n{\n\tm_implementation->on_button2_start_drag(Viewport, Event);\n}\n\nvoid navigation_input_model::on_button2_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n{\n\tm_implementation->on_drag(Viewport, Event);\n}\n\nvoid navigation_input_model::on_button2_end_drag(viewport::control& Viewport, const GdkEventButton& Event)\n{\n\tm_implementation->on_end_drag(Viewport, Event);\n}\n\nvoid navigation_input_model::on_scroll(viewport::control& Viewport, const GdkEventScroll& Event)\n{\n\tm_implementation->on_scroll(Viewport, Event);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/navigation_input_model.h",
    "content": "#ifndef K3DSDK_NGUI_NAVIGATION_INPUT_MODEL_H\n#define K3DSDK_NGUI_NAVIGATION_INPUT_MODEL_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\t\n/////////////////////////////////////////////////////////////////////////////\n// navigation_input_model\n\n/// Input model implementation that handles standard viewport navigation and context menus\nclass navigation_input_model\n{\npublic:\n\tnavigation_input_model(document_state& DocumentState);\n\t~navigation_input_model();\n\n\tvoid on_button1_click(viewport::control& Viewport, const GdkEventButton& Event);\n\tvoid on_button1_start_drag(viewport::control& Viewport, const GdkEventMotion& Event);\n\tvoid on_button1_drag(viewport::control& Viewport, const GdkEventMotion& Event);\n\tvoid on_button1_end_drag(viewport::control& Viewport, const GdkEventButton& Event);\n\n\tvoid on_button2_click(viewport::control& Viewport, const GdkEventButton& Event);\n\tvoid on_button2_start_drag(viewport::control& Viewport, const GdkEventMotion& Event);\n\tvoid on_button2_drag(viewport::control& Viewport, const GdkEventMotion& Event);\n\tvoid on_button2_end_drag(viewport::control& Viewport, const GdkEventButton& Event);\n\n\tvoid on_scroll(viewport::control& Viewport, const GdkEventScroll& Event);\n\nprivate:\n\tstruct implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_NAVIGATION_INPUT_MODEL_H\n"
  },
  {
    "path": "k3dsdk/ngui/node.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/inode.h>\n#include <k3dsdk/ngui/node.h>\n#include <k3dsdk/property.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace node\n{\n\nvoid show(inode& Node)\n{\n\t// Note: in the future, visibility should be handled using painter links, not properties.\n\t// See http://www.k-3d.org/wiki/Node_Visibility\n\tif(iproperty* const prop = property::get(Node, \"viewport_visible\"))\n\t\tproperty::set_internal_value(*prop, true);\n\tif(iproperty* const prop = property::get(Node, \"render_final\"))\n\t\tproperty::set_internal_value(*prop, true);\n}\n\nvoid hide(inode& Node)\n{\n\t// Note: in the future, visibility should be handled using painter links, not properties.\n\t// See http://www.k-3d.org/wiki/Node_Visibility\n\tif(iproperty* const prop = property::get(Node, \"viewport_visible\"))\n\t\tproperty::set_internal_value(*prop, false);\n\tif(iproperty* const prop = property::get(Node, \"render_final\"))\n\t\tproperty::set_internal_value(*prop, false);\n}\n\n} // namespace node\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/node.h",
    "content": "#ifndef K3DSDK_NGUI_NODE_H\n#define K3DSDK_NGUI_NODE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nclass inode;\n\nnamespace ngui\n{\n\nnamespace node\n{\n\n/// Make the given node visible.\nvoid show(inode& Node);\n/// Make the given node invisible.\nvoid hide(inode& Node);\n\n} // namespace node\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_NODE_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/node_chooser.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements k3d::node_chooser, which provides a user interface for either creating new, or choosing existing, K-3D nodes\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/arrow.h>\n#include <gtkmm/button.h>\n#include <gtkmm/label.h>\n#include <gtkmm/menu.h>\n#include <gtkmm/menuitem.h>\n\n#include <gtk/gtkmain.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_property.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/node_chooser.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/string_cast.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace node_chooser\n{\n\nnamespace detail\n{\n\n/// Provides an implementation of k3d::node_chooser::iselection_filter that filters based on a k3d::iproperty node\nclass property_filter :\n\tpublic iselection_filter\n{\npublic:\n\tproperty_filter(k3d::iproperty& Property) :\n\t\tm_node_property(dynamic_cast<k3d::inode_property*>(&Property))\n\t{\n\t}\n\n\tbool allow_none()\n\t{\n\t\treturn m_node_property && m_node_property->property_allow_none();\n\t}\n\n\tbool allow(k3d::iplugin_factory& Factory)\n\t{\n\t\treturn m_node_property && m_node_property->property_allow(Factory);\n\t}\n\n\tbool allow(k3d::inode& Object)\n\t{\n\t\treturn m_node_property && m_node_property->property_allow(Object);\n\t}\n\nprivate:\n\tk3d::inode_property* const m_node_property;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<idata_proxy> Data, std::unique_ptr<iselection_filter> Filter) :\n\tbase(false, 0),\n\tm_data(std::move(Data)),\n\tm_filter(std::move(Filter)),\n\tm_label(new Gtk::Label()),\n\tm_menu_button(new Gtk::Button()),\n\tm_edit_button(new Gtk::Button())\n{\n\tm_menu_button->add(*Gtk::manage(m_label));\n\tm_menu_button->signal_clicked().connect(sigc::mem_fun(*this, &control::on_choose));\n\tpack_start(*manage(m_menu_button), Gtk::PACK_EXPAND_WIDGET);\n\n\tm_edit_button->add(*Gtk::manage(new Gtk::Arrow(Gtk::ARROW_RIGHT, Gtk::SHADOW_NONE)));\n\tm_edit_button->signal_clicked().connect(sigc::mem_fun(*this, &control::on_edit));\n\tpack_start(*manage(m_edit_button), Gtk::PACK_SHRINK);\n\n\tdata_changed(0);\n\n\tif(m_data.get())\n\t{\n\t\tm_data->document().document().nodes().add_nodes_signal().connect(sigc::mem_fun(*this, &control::on_nodes_added));\n\t\tm_data->document().document().nodes().remove_nodes_signal().connect(sigc::mem_fun(*this, &control::on_nodes_removed));\n\t\tm_data->changed_signal().connect(sigc::mem_fun(*this, &control::data_changed));\n\t}\n}\n\nvoid control::on_nodes_added(const k3d::inode_collection::nodes_t&)\n{\n\treset_menu();\n}\n\nvoid control::on_nodes_removed(const k3d::inode_collection::nodes_t&)\n{\n\treset_menu();\n}\n\nvoid control::data_changed(k3d::ihint*)\n{\n\treturn_if_fail(m_data.get());\n\n\tm_label->set_text(m_data->node() ? m_data->node()->name() : _(\"--None--\"));\n\treset_menu();\n}\n\nvoid control::reset_menu()\n{\n\tm_menu.reset();\n\tm_menu_item_create.clear();\n\tm_menu_item_select.clear();\n}\n\nvoid control::on_choose()\n{\n\treturn_if_fail(m_data.get());\n\treturn_if_fail(m_filter.get());\n\n\t// Build the menu on-demand ...\n\tif(!m_menu.get())\n\t{\n\t\tm_menu.reset(new Gtk::Menu());\n\n\t\t// Insert a \"none\" choice ...\n\t\tif(m_filter->allow_none())\n\t\t{\n\t\t\tGtk::MenuItem* const menu_item = new Gtk::MenuItem(_(\"--None--\"));\n\t\t\tm_menu_item_select[std::string()] = menu_item;\n\t\t\tmenu_item->signal_activate().connect(sigc::mem_fun(*this, &control::on_select_none));\n\t\t\tm_menu->items().push_back(*manage(menu_item));\n\t\t}\n\n\t\t// Insert choices for creating new nodes ...\n\t\tconst k3d::plugin::factory::collection_t unsorted_factories = k3d::plugin::factory::lookup();\n\t\tstd::vector<k3d::iplugin_factory*> sorted_factories(unsorted_factories.begin(), unsorted_factories.end());\n\t\tstd::sort(sorted_factories.begin(), sorted_factories.end(), k3d::sort_by_name());\n\t\tfor(std::vector<k3d::iplugin_factory*>::const_iterator factory = sorted_factories.begin(); factory != sorted_factories.end(); ++factory)\n\t\t{\n\t\t\t// Filter choices ...\n\t\t\tif(!m_filter->allow(**factory))\n\t\t\t\tcontinue;\n\n\t\t\t// Create a \"new\" menu item for each factory ...\n\t\t\tconst std::string label = k3d::string_cast(boost::format(_(\"--New %1%\")) % (*factory)->name());\n\t\t\tGtk::MenuItem* const menu_item = new Gtk::MenuItem(label);\n\t\t\tm_menu_item_create[(*factory)->name()] = menu_item;\n\t\t\tmenu_item->signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &control::on_create_node), *factory));\n\t\t\tm_menu->items().push_back(*manage(menu_item));\n\t\t}\n\n\t\t// Insert choices for selecting existing nodes ...\n\t\tk3d::inode_collection::nodes_t sorted_nodes = m_data->document().document().nodes().collection();\n\t\tstd::sort(sorted_nodes.begin(), sorted_nodes.end(), k3d::sort_by_name());\n\t\tfor(k3d::inode_collection::nodes_t::const_iterator handle = sorted_nodes.begin(); handle != sorted_nodes.end(); ++handle)\n\t\t{\n\t\t\tk3d::inode* const node = *handle;\n\n\t\t\t// Filter choices ...\n\t\t\tif(!m_filter->allow(*node))\n\t\t\t\tcontinue;\n\n\t\t\t// Create a menu item for each node ...\n\t\t\tGtk::MenuItem* const menu_item = new Gtk::MenuItem(node->name());\n\t\t\tm_menu_item_select[node->name()] = menu_item;\n\t\t\tmenu_item->signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &control::on_select_node), node));\n\t\t\tm_menu->items().push_back(*manage(menu_item));\n\t\t}\n\t}\n\n\tm_menu->show_all();\n\tm_menu->popup(1, gtk_get_current_event_time());\n}\n\nvoid control::on_select_none()\n{\n\treturn_if_fail(m_data.get());\n\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\tm_data->set_node(0);\n\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->commit_change_set(m_data->state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), _(\"Select None\"), K3D_CHANGE_SET_CONTEXT);\n}\n\nvoid control::on_create_node(k3d::iplugin_factory* const Factory)\n{\n\treturn_if_fail(Factory);\n\n\treturn_if_fail(m_data.get());\n\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\tk3d::inode* const node = k3d::plugin::create<k3d::inode>(*Factory, m_data->document().document(), k3d::unique_name(m_data->document().document().nodes(), Factory->name()));\n\tassert_warning(node);\n\n\tm_data->set_node(node);\n\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->commit_change_set(m_data->state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), k3d::string_cast(boost::format(_(\"Create %1%\")) % Factory->name()), K3D_CHANGE_SET_CONTEXT);\n\n\tif(node)\n\t\tpanel::mediator(m_data->document().document()).set_focus(*node);\n}\n\nvoid control::on_select_node(k3d::inode* const Object)\n{\n\treturn_if_fail(Object);\n\n\treturn_if_fail(m_data.get());\n\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\tm_data->set_node(Object);\n\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->commit_change_set(m_data->state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), k3d::string_cast(boost::format(_(\"Select %1%\")) % Object->name()), K3D_CHANGE_SET_CONTEXT);\n}\n\nvoid control::on_edit()\n{\n\treturn_if_fail(m_data.get());\n\n\tif(!m_data->node())\n\t\treturn;\n\n\tpanel::mediator(m_data->document().document()).set_focus(*m_data->node());\n}\n\nstd::unique_ptr<iselection_filter> filter(k3d::iproperty& Data)\n{\n\treturn std::unique_ptr<iselection_filter>(new detail::property_filter(Data));\n}\n\n} // namespace node_chooser\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/node_chooser.h",
    "content": "#ifndef K3DSDK_NGUI_NODE_CHOOSER_H\n#define K3DSDK_NGUI_NODE_CHOOSER_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/result.h>\n\n#include <gtkmm/box.h>\n\nnamespace Gtk { class Button; }\nnamespace Gtk { class Label; }\nnamespace Gtk { class Menu; }\nnamespace Gtk { class MenuItem; }\nnamespace k3d { class idocument; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\nnamespace node_chooser\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// idata_proxy\n\n/// Abstract interface for an node that proxies a data source for an node_chooser::control (i.e. the \"model\" in model-view-controller)\nclass idata_proxy\n{\npublic:\n\tvirtual ~idata_proxy() {}\n\n\t/// Called to return the underlying data value\n\tvirtual k3d::inode* node() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_node(k3d::inode* Object) = 0;\n\t/// Called to return the owning document\n\tvirtual document_state& document() = 0;\n\t/// Signal emitted if the underlying data changes\n\ttypedef sigc::signal<void, k3d::ihint*> changed_signal_t;\n\t/// Signal emitted if the underlying data changes\n\tvirtual changed_signal_t& changed_signal() = 0;\n\n\t/// Stores an optional state recorder for recording undo/redo data\n\tk3d::istate_recorder* const state_recorder;\n\t/// Stores an optional message for labelling undo/redo state changes\n\tconst Glib::ustring change_message;\n\nprotected:\n\tidata_proxy(k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tstate_recorder(StateRecorder),\n\t\tchange_message(ChangeMessage)\n\t{\n\t}\n\nprivate:\n\tidata_proxy(const idata_proxy& RHS);\n\tidata_proxy& operator=(const idata_proxy& RHS);\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// iselection_filter\n\n/// Abstract interface for an node that will be queried to filter the set of available choices\nclass iselection_filter\n{\npublic:\n\tvirtual ~iselection_filter() {}\n\n\t/// Return true iff \"None\" should be available to the user as a selection\n\tvirtual bool allow_none() = 0;\n\t/// Return true iff the specified plugin type should be available to the user as a \"Create XXX\" selection\n\tvirtual bool allow(k3d::iplugin_factory& Factory) = 0;\n\t/// Return true iff the specified inode should be available to the user for selection\n\tvirtual bool allow(k3d::inode& Object) = 0;\n\nprotected:\n\tiselection_filter() {}\n\tiselection_filter(const idata_proxy& RHS) {}\n\tiselection_filter& operator=(const idata_proxy& RHS) { return *this; }\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for choosing nodes (either existing, or newly-created) (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::HBox\n{\n\ttypedef Gtk::HBox base;\n\npublic:\n\tcontrol(std::unique_ptr<idata_proxy> Data, std::unique_ptr<iselection_filter> Filter);\n\nprivate:\n\t/// Called when new nodes are added to the document\n\tvoid on_nodes_added(const k3d::inode_collection::nodes_t&);\n\t/// Called when nodes are removed from the document\n\tvoid on_nodes_removed(const k3d::inode_collection::nodes_t&);\n\t/// Called whenever the underlying data source changes\n\tvoid data_changed(k3d::ihint*);\n\t/// Called to display the set of available choices\n\tvoid on_choose();\n\t/// Called when the user decides to select no node\n\tvoid on_select_none();\n\t/// Called when the user wants to create a new node\n\tvoid on_create_node(k3d::iplugin_factory* const Factory);\n\t/// Called when the user selects an existing node\n\tvoid on_select_node(k3d::inode* const Object);\n\t/// Called when the user wants to edit the current choice\n\tvoid on_edit();\n\n\t/// Resets the contents of the popup menu so it can be recreated the next time it's needed\n\tvoid reset_menu();\n\n\t/// Stores a reference to the underlying data node\n\tstd::unique_ptr<idata_proxy> m_data;\n\t/// Stores a filter node for controlling the set of available choices\n\tstd::unique_ptr<iselection_filter> m_filter;\n\n\tGtk::Label* const m_label;\n\tGtk::Button* const m_menu_button;\n\tGtk::Button* const m_edit_button;\n\n\tstd::unique_ptr<Gtk::Menu> m_menu;\n\tstd::map<std::string, Gtk::MenuItem*> m_menu_item_create;\n\tstd::map<std::string, Gtk::MenuItem*> m_menu_item_select;\n};\n\n/// Provides an implementation of k3d::node_chooser::idata_proxy that supports any data source that supports the node(), set_node(), node_collection(), and changed_signal() concepts\ntemplate<typename data_t>\nclass data_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tdata_proxy(document_state& DocumentState, data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_data(Data),\n\t\tm_document_state(DocumentState)\n\t{\n\t}\n\n\tk3d::inode* node()\n\t{\n\t\treturn m_data.node();\n\t}\n\n\tvoid set_node(k3d::inode* Object)\n\t{\n\t\tm_data.set_node(Object);\n\t}\n\n\tdocument_state& document()\n\t{\n\t\treturn m_document_state;\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_data.changed_signal();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_data;\n\tdocument_state& m_document_state;\n};\n\n/// Specialization of k3d::node_chooser::data_proxy for use with k3d::iproperty objects\ntemplate<>\nclass data_proxy<k3d::iproperty> :\n\tpublic idata_proxy\n{\npublic:\n\ttypedef k3d::iproperty data_t;\n\n\tdata_proxy(document_state& DocumentState, data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data)),\n\t\tm_document_state(DocumentState)\n\t{\n\t}\n\n\tk3d::inode* node()\n\t{\n\t\treturn boost::any_cast<k3d::inode*>(m_readable_data.property_internal_value());\n\t}\n\n\tvoid set_node(k3d::inode* Object)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\t\tm_writable_data->property_set_value(Object);\n\t}\n\n\tdocument_state& document()\n\t{\n\t\treturn m_document_state;\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_readable_data.property_changed_signal();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n\tdocument_state& m_document_state;\n};\n\n/// Convenience factory function for creating node_chooser::idata_proxy objects\ntemplate<typename data_t>\nstd::unique_ptr<idata_proxy> proxy(document_state& DocumentState, data_t& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = \"\")\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<data_t>(DocumentState, Data, StateRecorder, ChangeMessage));\n}\n\n/// Provides an implementation of k3d::node_chooser::iselection_filter that filters based on a specific interface type\ntemplate<typename interface_t>\nclass selection_filter :\n\tpublic iselection_filter\n{\npublic:\n\tselection_filter(const bool AllowNone) :\n\t\tm_allow_none(AllowNone)\n\t{\n\t}\n\n\tbool allow_none()\n\t{\n\t\treturn m_allow_none;\n\t}\n\n\tbool allow(k3d::iplugin_factory& Factory)\n\t{\n\t\treturn Factory.implements(typeid(interface_t));\n\t}\n\n\tbool allow(k3d::inode& Object)\n\t{\n\t\treturn dynamic_cast<interface_t*>(&Object) ? true : false;\n\t}\n\nprivate:\n\tbool m_allow_none;\n};\n\n/// Convenience factory function for creating k3d::node_chooser::iselection_filter nodes\ntemplate<typename interface_t>\nstd::unique_ptr<iselection_filter> filter(const bool AllowNone)\n{\n\treturn std::unique_ptr<iselection_filter>(new selection_filter<interface_t>(AllowNone));\n}\n\n/// Convenience factory function for creating k3d::node_chooser::iselection_filter nodes for use with k3d::iproperty nodes\nstd::unique_ptr<iselection_filter> filter(k3d::iproperty& Data);\n\n} // namespace node_chooser\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_NODE_CHOOSER_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/node_collection_chooser.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/button.h>\n#include <gtkmm/buttonbox.h>\n#include <gtkmm/label.h>\n#include <gtkmm/liststore.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/treeview.h>\n\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/ngui/asynchronous_update.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/node_collection_chooser.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/inode_collection_property.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/string_cast.h>\n\n#include <boost/shared_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace node_collection_chooser\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// list_window\n\nclass list_window :\n\tpublic application_window,\n\tpublic asynchronous_update\n{\npublic:\n\tlist_window(const boost::shared_ptr<imodel>& Model, k3d::istate_recorder* StateRecorder) :\n\t\tm_model(Model),\n\t\tm_state_recorder(StateRecorder),\n\t\tm_block_update(false),\n\t\tm_block_toggle(false)\n\t{\n\t\tset_title(m_model->label());\n\t\tset_role(\"node_collection_chooser\");\n\t\tresize(400, 400);\n\t\tset_position(Gtk::WIN_POS_CENTER);\n\n\t\tm_model->connect_changed_signal(sigc::mem_fun(*this, &list_window::on_model_changed));\n\n\t\tGtk::ScrolledWindow* const scrolled_window = new Gtk::ScrolledWindow();\n\t\tscrolled_window->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\t\tscrolled_window->add(m_view);\n\n\t\tm_view_model = Gtk::ListStore::create(m_columns);\n\t\tm_view_model->signal_row_changed().connect(sigc::mem_fun(*this, &list_window::on_selection_toggled));\n\n\t\tm_view.set_model(m_view_model);\n\t\tm_view.set_headers_visible(true);\n\t\tm_view.set_reorderable(false);\n\t\tm_view.get_selection()->set_mode(Gtk::SELECTION_EXTENDED);\n\n\t\tm_view.append_column(\"\", m_columns.icon);\n\t\tm_view.append_column(_(\"Name\"), m_columns.name);\n\t\tm_view.append_column_editable(_(\"Selected\"), m_columns.selected);\n\n\t\tGtk::HButtonBox* const hbox = new Gtk::HButtonBox(Gtk::BUTTONBOX_END);\n\t\thbox->pack_start(*Gtk::manage(\n\t\t\tnew Gtk::Button(_(\"Select All\"))\n\t\t\t\t<< connect_button(sigc::mem_fun(*this, &list_window::on_select_all))\n\t\t\t\t), Gtk::PACK_SHRINK);\n\t\thbox->pack_start(*Gtk::manage(\n\t\t\tnew Gtk::Button(_(\"Deselect All\"))\n\t\t\t\t<< connect_button(sigc::mem_fun(*this, &list_window::on_deselect_all))\n\t\t\t\t), Gtk::PACK_SHRINK);\n\t\thbox->pack_start(*Gtk::manage(\n\t\t\tnew Gtk::Button(_(\"Toggle Selected\"))\n\t\t\t\t<< connect_button(sigc::mem_fun(*this, &list_window::on_toggle_selected))\n\t\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tGtk::VBox* const vbox = new Gtk::VBox();\n\t\tvbox->pack_start(*Gtk::manage(hbox), Gtk::PACK_SHRINK);\n\t\tvbox->pack_start(*Gtk::manage(scrolled_window), Gtk::PACK_EXPAND_WIDGET);\n\n\t\tadd(*Gtk::manage(vbox));\n\n\t\tschedule_update();\n\t}\n\nprivate:\n\t/// Called to refresh the contents of the list view ...\n\tvoid on_update()\n\t{\n\t\tconst k3d::inode_collection_property::nodes_t available_nodes = m_model->available_nodes();\n\t\tconst k3d::inode_collection_property::nodes_t selected_nodes = m_model->selected_nodes();\n\n\t\tm_block_toggle = true;\n\n\t\tm_view_model->clear();\n\n\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = available_nodes.begin(); node != available_nodes.end(); ++node)\n\t\t{\n\t\t\tGtk::TreeRow row = *m_view_model->append();\n\t\t\trow[m_columns.node] = (*node);\n\t\t\trow[m_columns.icon] = quiet_load_icon((**node).factory().name(), Gtk::ICON_SIZE_MENU);\n\t\t\trow[m_columns.name] = (**node).name();\n\t\t\trow[m_columns.selected] = std::count(selected_nodes.begin(), selected_nodes.end(), *node);\n\t\t}\n\n\t\tm_block_toggle = false;\n\t}\n\n\t/// Called whenever a checkbox changes state ...\n\tvoid on_selection_toggled(const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iterator)\n\t{\n\t\tif(m_block_toggle)\n\t\t\treturn;\n\n\t\tif(m_state_recorder)\n\t\t\tm_state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t\tm_block_update = true;\n\n\t\tGtk::TreeRow row = *iterator;\n\t\tk3d::inode* const node = row[m_columns.node];\n\t\tconst k3d::bool_t selected = row[m_columns.selected];\n\n\t\tk3d::inode_collection_property::nodes_t selected_nodes = m_model->selected_nodes();\n\t\tif(selected)\n\t\t{\n\t\t\tselected_nodes.push_back(node);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tselected_nodes.erase(std::remove(selected_nodes.begin(), selected_nodes.end(), node), selected_nodes.end());\n\t\t}\n\t\tm_model->set_selected_nodes(selected_nodes);\n\n\t\tm_block_update = false;\n\n\t\tif(m_state_recorder)\n\t\t\tm_state_recorder->commit_change_set(m_state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), k3d::string_cast(boost::format(_(\"Change %1%\")) % m_model->label()), K3D_CHANGE_SET_CONTEXT);\n\t}\n\n\t/// Called when the user presses the \"toggle selected\" button\n\tvoid on_toggle_selected()\n\t{\n\t\tif(m_state_recorder)\n\t\t\tm_state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t\tk3d::inode_collection_property::nodes_t selected_nodes = m_model->selected_nodes();\n\t\tconst std::vector<Gtk::TreePath> selected_rows = m_view.get_selection()->get_selected_rows();\n\t\tfor(int i = 0; i != selected_rows.size(); ++i)\n\t\t{\n\t\t\tGtk::TreeRow row = *m_view_model->get_iter(selected_rows[i]);\n\t\t\tk3d::inode* const node = row[m_columns.node];\n\t\t\tconst k3d::bool_t selected = !row[m_columns.selected];\n\n\t\t\tif(selected)\n\t\t\t{\n\t\t\t\tselected_nodes.push_back(node);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tselected_nodes.erase(std::remove(selected_nodes.begin(), selected_nodes.end(), node), selected_nodes.end());\n\t\t\t}\n\t\t}\n\t\tm_model->set_selected_nodes(selected_nodes);\n\n\t\tif(m_state_recorder)\n\t\t\tm_state_recorder->commit_change_set(m_state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), k3d::string_cast(boost::format(_(\"Toggle Selected %1%\")) % m_model->label()), K3D_CHANGE_SET_CONTEXT);\n\t}\n\n\t/// Called whenever the underlying data model changes ...\n\tvoid on_model_changed()\n\t{\n\t\tif(m_block_update)\n\t\t\treturn;\n\n\t\tschedule_update();\n\t}\n\n\tvoid on_select_all()\n\t{\n\t\tm_view.get_selection()->select_all();\n\t}\n\n\tvoid on_deselect_all()\n\t{\n\t\tm_view.get_selection()->unselect_all();\n\t}\n\n\tclass columns :\n\t\tpublic Gtk::TreeModelColumnRecord\n\t{\n\tpublic:\n\t\tcolumns()\n\t\t{\n\t\t\tadd(node);\n\t\t\tadd(icon);\n\t\t\tadd(name);\n\t\t\tadd(selected);\n\t\t}\n\n\t\tGtk::TreeModelColumn<k3d::inode*> node;\n\t\tGtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon;\n\t\tGtk::TreeModelColumn<Glib::ustring> name;\n\t\tGtk::TreeModelColumn<k3d::bool_t> selected;\n\t};\n\n\tconst boost::shared_ptr<imodel> m_model;\n\tk3d::istate_recorder* const m_state_recorder;\n\tcolumns m_columns;\n\tGlib::RefPtr<Gtk::ListStore> m_view_model;\n\tGtk::TreeView m_view;\n\tbool m_block_update;\n\tbool m_block_toggle;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// property_model\n\nclass property_model :\n\tpublic imodel\n{\npublic:\n\tproperty_model(k3d::iproperty& Property) :\n\t\tm_property(Property)\n\t{\n\t\tif(m_property.property_node())\n\t\t{\n\t\t\tm_property.property_node()->document().nodes().add_nodes_signal().connect(sigc::hide(m_changed_signal.make_slot()));\n\t\t\tm_property.property_node()->document().nodes().remove_nodes_signal().connect(sigc::hide(m_changed_signal.make_slot()));\n\t\t\tm_property.property_node()->document().nodes().rename_node_signal().connect(sigc::hide(m_changed_signal.make_slot()));\n\t\t}\n\n\t\tm_property.property_changed_signal().connect(sigc::hide(m_changed_signal.make_slot()));\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\tGlib::ustring result = m_property.property_label();\n\n\t\tif(m_property.property_node())\n\t\t\tresult = m_property.property_node()->name() + \" \" + result;\n\n\t\treturn result;\n\t}\n\n\tconst k3d::inode_collection_property::nodes_t available_nodes()\n\t{\n\t\tif(m_property.property_node())\n\t\t{\n\t\t\tconst k3d::inode_collection_property::nodes_t all_nodes = m_property.property_node()->document().nodes().collection();\n\t\t\tif(k3d::inode_collection_property* const node_collection_property = dynamic_cast<k3d::inode_collection_property*>(&m_property))\n\t\t\t{\n\t\t\t\tk3d::inode_collection_property::nodes_t filtered_nodes;\n\t\t\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = all_nodes.begin(); node != all_nodes.end(); ++node)\n\t\t\t\t{\n\t\t\t\t\tif(node_collection_property->property_allow(**node))\n\t\t\t\t\t\tfiltered_nodes.push_back(*node);\n\t\t\t\t}\n\n\t\t\t\treturn filtered_nodes;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn all_nodes;\n\t\t\t}\n\t\t}\n\n\t\treturn k3d::inode_collection_property::nodes_t();\n\t}\n\n\tconst k3d::inode_collection_property::nodes_t selected_nodes()\n\t{\n\t\treturn k3d::property::internal_value<k3d::inode_collection_property::nodes_t>(m_property);\n\t}\n\n\tvoid set_selected_nodes(const k3d::inode_collection_property::nodes_t& Value)\n\t{\n\t\treturn_if_fail(k3d::property::set_internal_value(m_property, Value));\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_changed_signal.connect(Slot);\n\t}\n\nprivate:\n\tk3d::iproperty& m_property;\n\tsigc::signal<void> m_changed_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// model\n\nimodel* const model(k3d::iproperty& Property)\n{\n\treturn new property_model(Property);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control::implementation\n\nclass control::implementation\n{\npublic:\n\timplementation(imodel* const Model, k3d::istate_recorder* StateRecorder) :\n\t\tm_model(Model),\n\t\tm_state_recorder(StateRecorder)\n\t{\n\t\tm_delete_signal.emit();\n\t}\n\n\tconst boost::shared_ptr<imodel> m_model;\n\tk3d::istate_recorder* const m_state_recorder;\n\tsigc::signal<void> m_delete_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(imodel* const Model, k3d::istate_recorder* StateRecorder) :\n\tbase(false, 0),\n\tm_implementation(new implementation(Model, StateRecorder))\n{\n\tGtk::Button* const edit_button = new Gtk::Button(_(\"Edit\"));\n\tedit_button->signal_clicked().connect(sigc::mem_fun(*this, &control::on_edit));\n\tpack_start(*manage(edit_button), Gtk::PACK_SHRINK);\n}\n\ncontrol::~control()\n{\n\tdelete m_implementation;\n}\n\nvoid control::on_edit()\n{\n\treturn_if_fail(m_implementation->m_model.get());\n\n\tlist_window* const window = new list_window(m_implementation->m_model, m_implementation->m_state_recorder);\n\tm_implementation->m_delete_signal.connect(sigc::mem_fun(*window, &list_window::close));\n\twindow->show_all();\n}\n\n} // namespace node_collection_chooser\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/node_collection_chooser.h",
    "content": "#ifndef K3DSDK_NGUI_NODE_COLLECTION_CHOOSER_H\n#define K3DSDK_NGUI_NODE_COLLECTION_CHOOSER_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/inode_collection_property.h>\n#include <gtkmm/box.h>\n\nnamespace k3d { class iproperty; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace node_collection_chooser\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// imodel\n\n/// Abstract data model for a node_collection_chooser::control\nclass imodel\n{\npublic:\n\tvirtual ~imodel() {}\n\n\t/// Returns a human-readable label for the underlying data\n\tvirtual const Glib::ustring label() = 0;\n\t/// Called to return the set of all available nodes\n\tvirtual const k3d::inode_collection_property::nodes_t available_nodes() = 0;\n\t/// Called to return the underlying data value\n\tvirtual const k3d::inode_collection_property::nodes_t selected_nodes() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_selected_nodes(const k3d::inode_collection_property::nodes_t& Value) = 0;\n\t/// Connects a slot to a signal that will be emitted if the underlying data changes\n\tvirtual sigc::connection connect_changed_signal(const sigc::slot<void>& Slot) = 0;\n\nprotected:\n\timodel() {}\n\nprivate:\n\timodel(const imodel&);\n\timodel& operator=(const imodel&);\n};\n\n/// Factory method for creating an imodel object given a node collection property\nimodel* const model(k3d::iproperty& Property);\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for selecting a set of nodes\nclass control :\n\tpublic Gtk::HBox\n{\n\ttypedef Gtk::HBox base;\n\npublic:\n\tcontrol(imodel* const Model, k3d::istate_recorder* StateRecorder);\n\t~control();\n\nprivate:\n\t/// Called to modify the current set of nodes\n\tvoid on_edit();\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace node_collection_chooser\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_NODE_COLLECTION_CHOOSER_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/node_window.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/asynchronous_update.h>\n#include <k3dsdk/ngui/node_window.h>\n\n#include <k3dsdk/inode.h>\n\n#include <gdk/gdkkeysyms.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// node_window::implementation\n\nclass node_window::implementation\n{\npublic:\n\timplementation(k3d::inode& Node) :\n\t\tm_node(Node)\n\t{\n\t}\n\n\t/// Stores the owning node\n\tk3d::inode& m_node;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// node_window\n\nnode_window::node_window(k3d::inode& Node) :\n\tbase(Gtk::WINDOW_TOPLEVEL),\n\tm_implementation(new implementation(Node))\n{\n\tNode.deleted_signal().connect(sigc::mem_fun(*this, &node_window::close));\n}\n\nnode_window::~node_window()\n{\n\tdelete m_implementation;\n}\n\nk3d::inode& node_window::node()\n{\n\treturn m_implementation->m_node;\n}\n\nk3d::bool_t node_window::on_key_press_event(GdkEventKey* event)\n{\n\tif(event->keyval == GDK_Escape)\n\t{\n\t\tsafe_close();\n\t\treturn true;\n\t}\n\n\treturn base::on_key_press_event(event);\n}\n\nk3d::bool_t node_window::on_delete_event(GdkEventAny* event)\n{\n\tsafe_close();\n\treturn true;\n}\n\nk3d::bool_t node_window::safe_to_close()\n{\n\treturn on_safe_to_close();\n}\n\nvoid node_window::safe_close()\n{\n\tif(safe_to_close())\n\t\tclose();\n}\n\nvoid node_window::close()\n{\n\ton_close();\n\n\t/** \\note: This prevents any entry widgets from receiving a focus-out event after going out-of-scope (causing a segfault).\n\t * See http://sourceforge.net/tracker/index.php?func=detail&aid=1714540&group_id=11113&atid=111113 for details. */\n\thide_all();\n\t\n\tdelete this;\n}\n\nk3d::bool_t node_window::on_safe_to_close()\n{\n\treturn true;\n}\n\nvoid node_window::on_close()\n{\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/node_window.h",
    "content": "#ifndef K3DSDK_NGUI_NODE_WINDOW_H\n#define K3DSDK_NGUI_NODE_WINDOW_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\n#include <gtkmm/window.h>\n\nnamespace k3d { class inode; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n///////////////////////////////////////////////////////////////////////////////\n// node_window\n\n/// Provides a standard node-level window\nclass node_window :\n        public Gtk::Window\n{\n\ttypedef Gtk::Window base;\n\npublic:\n\tnode_window(k3d::inode& Node);\n\tvirtual ~node_window();\n\n\tk3d::inode& node();\n\n\tk3d::bool_t on_key_press_event(GdkEventKey* event);\n\tk3d::bool_t on_delete_event(GdkEventAny* event);\n\n\t/// Call to determine whether it is safe to close the window\n\tk3d::bool_t safe_to_close();\n\t/// Closes the window safely, giving derived classes a chance to cancel\n\tvoid safe_close();\n\t/// Closes the window\n\tvoid close();\n\nprivate:\n\t/// Override in derived classes to determine whether it is safe to close the window\n\tvirtual k3d::bool_t on_safe_to_close();\n\t/// Override in derived classes to handle cleanup when the window is closed\n\tvirtual void on_close();\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_NODE_WINDOW_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/null_viewport_input_model.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/null_viewport_input_model.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// null_viewport_input_model\n\nvoid null_viewport_input_model::button_press_event(viewport::control& Viewport, GdkEventButton* Event)\n{\n}\n\nvoid null_viewport_input_model::button_release_event(viewport::control& Viewport, GdkEventButton* Event)\n{\n}\n\nvoid null_viewport_input_model::motion_notify_event(viewport::control& Viewport, GdkEventMotion* Event)\n{\n}\n\nvoid null_viewport_input_model::scroll_event(viewport::control& Viewport, GdkEventScroll* Event)\n{\n}\n\nvoid null_viewport_input_model::key_press_event(viewport::control& Viewport, GdkEventKey* Event)\n{\n}\n\nvoid null_viewport_input_model::key_release_event(viewport::control& Viewport, GdkEventKey* Event)\n{\n\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/null_viewport_input_model.h",
    "content": "#ifndef K3DSDK_NGUI_NULL_VIEWPORT_INPUT_MODEL_H\n#define K3DSDK_NGUI_NULL_VIEWPORT_INPUT_MODEL_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/viewport_input_model.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// null_viewport_input_model\n\n/// Do-nothing implementation of viewport_input_model\nclass null_viewport_input_model :\n\tpublic viewport_input_model\n{\npublic:\n\tvirtual void button_press_event(viewport::control& Viewport, GdkEventButton* Event);\n\tvirtual void button_release_event(viewport::control& Viewport, GdkEventButton* Event);\n\tvirtual void motion_notify_event(viewport::control& Viewport, GdkEventMotion* Event);\n\tvirtual void scroll_event(viewport::control& Viewport, GdkEventScroll* Event);\n\tvirtual void key_press_event(viewport::control& Viewport, GdkEventKey* Event);\n\tvirtual void key_release_event(viewport::control& Viewport, GdkEventKey* Event);\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_NULL_VIEWPORT_INPUT_MODEL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/options.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares k3d::ioptions, an abstract interface for global user options\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/options.h>\n\n#include <k3dsdk/options.h>\n#include <k3dsdk/xml.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace options\n{\n\nnamespace detail\n{\n\nk3d::xml::element& ngui_element()\n{\n\treturn k3d::options::tree().safe_element(\"ngui\");\n}\n\nk3d::xml::element& nags_element()\n{\n\treturn ngui_element().safe_element(\"nags\");\n}\n\nk3d::xml::element& nag_element(const std::string& Type)\n{\n\tconst k3d::xml::element match(\"nag\", k3d::xml::attribute(\"message\", Type));\n\tconst k3d::xml::element prototype(\"nag\", k3d::string_cast(true), k3d::xml::attribute(\"message\", Type));\n\treturn nags_element().safe_element(match, prototype);\n}\n\n} // namespace detail\n\nconst bool nag(const std::string& Type)\n{\n\treturn k3d::from_string<bool>(detail::nag_element(Type).text, true);\n}\n\nvoid enable_nag(const std::string& Type, const bool Enabled)\n{\n\tdetail::nag_element(Type).text = k3d::string_cast(Enabled);\n}\n\n} // namespace options\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/options.h",
    "content": "#ifndef K3DSDK_NGUI_OPTIONS_H\n#define K3DSDK_NGUI_OPTIONS_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <string>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace options\n{\n\n/// Returns true iff the given nag message is enabled\nconst bool nag(const std::string& Type);\n/// Enables / disables the given nag message\nvoid enable_nag(const std::string& Type, const bool Enabled);\n\n} // namespace options\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_OPTIONS_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/panel.h",
    "content": "#ifndef K3DSDK_NGUI_PANEL_H\n#define K3DSDK_NGUI_PANEL_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\nnamespace panel\n{\n\n/// Abstract interface for a \"panel\", a UI component that can be \"mounted\" in a panel_container\nclass control :\n  public virtual iunknown\n{\npublic:\n\t/// Set the document and parent command node for this panel - this is ugly, but application plugins don't take ctor arguments\n\tvirtual void initialize(document_state& DocumentState) = 0;\n\t/// Returns a unique string identifying the panel type - panel frames use this to coordinate layout serialization\n\tvirtual const k3d::string_t panel_type() = 0;\n\t/// Connects a slot to a signel that should be emitted whenever the panel receives the keyboard focus\n\tvirtual sigc::connection connect_focus_signal(const sigc::slot<void>& Slot) = 0;\n\nprotected:\n\tcontrol() {}\n\tcontrol(const control&) {}\n\tcontrol& operator=(const control&) { return *this; }\n\tvirtual ~control() {}\n};\n\n} // namespace panel\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_PANEL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/panel_frame.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/iplugin_factory_collection.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/document_window.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/image_toggle_button.h>\n#include <k3dsdk/ngui/panel_frame.h>\n#include <k3dsdk/ngui/panel.h>\n#include <k3dsdk/ngui/render.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/ngui/widget_manip.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/string_cast.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/eventbox.h>\n#include <gtkmm/stock.h>\n\n#include <boost/format.hpp>\n\n#include <iostream>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace panel_frame\n{\n\nnamespace detail\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// window\n\nclass floating_window :\n\tpublic document_window\n{\n\ttypedef document_window base;\n\npublic:\n\tfloating_window(document_state& Document) :\n\t\tbase(Document)\n\t{\n\t}\n};\n\n} // namespace detail\n\ncontrol::control(document_state& DocumentState, panel_focus_signal_t& PanelFocusSignal) :\n\tbase(),\n\tk3d::property_collection(),\n\tpinned(init_name(\"pinned\") + init_label(_(\"Pinned Panel\")) + init_description(_(\"Works with 'Hide Unpinned Panels' action\")) + init_value(false)),\n\tautomagic(init_name(\"automagic\") + init_label(_(\"Automagic\")) + init_description(_(\"Allows panel to change depending on active tool\")) + init_value(false)),\n\tdecorations(init_name(\"decorations\") + init_label(_(\"Decorations\")) + init_description(_(\"Hides/shows decorations\")) + init_value(true)),\n\tm_decorations(false, 0),\n\tm_document_state(DocumentState),\n\tm_panel_focus_signal(PanelFocusSignal),\n\tm_panel_focus(false)\n{\n\tm_panel_focus_changed_connection = m_panel_focus_signal.connect(sigc::mem_fun(*this, &control::on_panel_focus_changed));\n\n\t// Don't set it to NORMAL else the focus color won't show\n\tset_shadow_type(Gtk::SHADOW_ETCHED_IN);\n\n\timage_toggle_button::control* const pinned_control =\n\t\tnew image_toggle_button::control(\n\t\t\timage_toggle_button::model(pinned, pinned.name()), 0, load_icon(\"pinned\", Gtk::ICON_SIZE_BUTTON),\n\t\t\tload_icon(\"unpinned\", Gtk::ICON_SIZE_BUTTON)) <<\n\t\tset_tooltip(_(\"Pin Panel\"));\n\n\tpinned_control->signal_clicked().connect(sigc::mem_fun(*this, &control::grab_panel_focus));\n\n\tdecorations.changed_signal().connect(sigc::mem_fun(*this, &control::on_decorations_changed));\n\n\tGtk::EventBox* const title_event_box = new Gtk::EventBox();\n\ttitle_event_box->add(m_title);\n\ttitle_event_box->add_events(Gdk::BUTTON_PRESS_MASK);\n\ttitle_event_box->signal_button_press_event().connect(sigc::bind_return(sigc::hide(sigc::mem_fun(*this, &control::on_grab_focus)), false));\n\n\tm_model = Gtk::ListStore::create(m_columns);\n\tm_panel_type.set_model(m_model);\n\tm_panel_type.pack_start(m_columns.icon, false);\n\tm_panel_type.pack_start(m_columns.label);\n\tm_panel_type.get_accessible()->set_name(\"panel_type\");\n\n\tm_panel_type_connection = m_panel_type.signal_changed().connect(sigc::mem_fun(*this, &control::on_panel_type_changed));\n\n\tm_decorations.pack_start(*Gtk::manage(pinned_control), Gtk::PACK_SHRINK);\n\tm_decorations.pack_start(m_panel_type, Gtk::PACK_SHRINK);\n\tm_decorations.pack_start(*Gtk::manage(title_event_box), Gtk::PACK_EXPAND_WIDGET);\n\n\tm_frame.set_shadow_type(Gtk::SHADOW_NONE);\n\n\tm_decorations.get_accessible()->set_name(\"decorations\");\n\tm_frame.get_accessible()->set_name(\"content\");\n\n\tGtk::VBox* const vbox1 = new Gtk::VBox(false);\n\tvbox1->get_accessible()->set_name(\"vbox\");\n\tvbox1->pack_start(m_decorations, Gtk::PACK_SHRINK);\n\tvbox1->pack_start(m_frame, Gtk::PACK_EXPAND_WIDGET);\n\n\tbase::add(*manage(vbox1));\n\n\tset_choices();\n\tshow_all();\n}\n\ncontrol::~control()\n{\n\t// Prevent a crash caused by self-updating after we're gone ...\n\tm_panel_focus_changed_connection.disconnect();\n\n\t// If we have the panel focus, give it up ...\n\tif(m_panel_focus)\n\t{\n\t\tm_panel_focus = false;\n\t\tm_panel_focus_signal.emit(0);\n\t}\n}\n\nvoid control::add(Widget& widget)\n{\n\tbase::add(widget);\n}\n\nvoid control::remove()\n{\n\tbase::remove();\n}\n\nvoid control::grab_panel_focus()\n{\n\tm_panel_focus_signal.emit(this);\n}\n\nvoid control::mount_panel(panel::control& Panel, const k3d::string_t& Type)\n{\n\tget_accessible()->set_name(Type);\n\tunmount();\n\n\tm_grab_focus_connection = Panel.connect_focus_signal(sigc::mem_fun(*this, &control::on_grab_focus));\n\tm_frame.add(dynamic_cast<Gtk::Widget&>(Panel));\n\n\tm_panel_type_connection.block();\n\tm_panel_type.set_active(index(Type));\n\tm_panel_type_connection.unblock();\n}\n\nvoid control::mount_panel(const k3d::string_t& Type, bool RequestCamera)\n{\n\tget_accessible()->set_name(Type);\n\tif(\"NGUIViewportPanel\" == Type)\n\t{\n\t\tconst std::vector<k3d::gl::irender_viewport*> gl_engines = k3d::node::lookup<k3d::gl::irender_viewport>(m_document_state.document());\n\t\tk3d::gl::irender_viewport* const glengine1 = gl_engines.size() ? gl_engines[0] : 0;\n\n\t\tk3d::icamera* camera = 0;\n\t\tif (RequestCamera)\n\t\t{\n\t\t\tcamera = pick_camera(m_document_state);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst std::vector<k3d::icamera*> cameras = k3d::node::lookup<k3d::icamera>(m_document_state.document());\n\t\t\tcamera = cameras.size() ? cameras[0] : 0;\n\t\t}\n\n\t\tif(glengine1 && camera)\n\t\t{\n\t\t\tviewport::control* const control = new viewport::control(m_document_state);\n\t\t\tcontrol->set_camera(camera);\n\t\t\tcontrol->set_gl_engine(glengine1);\n\n\t\t\tmount_panel(*Gtk::manage(control), Type);\n\t\t\tm_document_state.set_focus_viewport(control);\n\t\t}\n\t\treturn;\n\t}\n\n\tif(m_type_plugin_map.count(Type))\n\t{\n\t\tk3d::iplugin_factory* const plugin = m_type_plugin_map[Type];\n\t\treturn_if_fail(plugin);\n\n\t\tpanel::control* const panel = k3d::plugin::create<panel::control>(*plugin);\n\t\treturn_if_fail(panel);\n\n\t\tpanel->initialize(m_document_state);\n\n\t\tGtk::manage(dynamic_cast<Gtk::Widget*>(panel));\n\t\tmount_panel(*panel, Type);\n\t\treturn;\n\t}\n\n\tk3d::log() << error << \"Couldn't mount panel of type : \" << Type << std::endl;\n}\n\nvoid control::on_mount_panel(const k3d::string_t& Type)\n{\n\tmount_panel(Type);\n}\n\nvoid control::unmount()\n{\n\tunset_bg_color();\n\n\tm_grab_focus_connection.disconnect();\n\t\n\tviewport::control* control = dynamic_cast<viewport::control*>(m_frame.get_child());\n\tif (control == m_document_state.get_focus_viewport())\n\t\tm_document_state.set_focus_viewport(0);\n\n\tdelete m_frame.get_child();\n}\n\nvoid control::float_panel()\n{\n\tif(!m_frame.get_child())\n\t\treturn;\n\n\tm_grab_focus_connection.disconnect();\n\n\tdetail::floating_window* const window = new detail::floating_window(m_document_state);\n\tm_frame.get_child()->reparent(*window);\n\twindow->show();\n}\n\nvoid control::set_bg_color(const Gdk::Color& color)\n{\n\tmodify_bg(Gtk::STATE_NORMAL, color);\n}\n\nvoid control::unset_bg_color()\n{\n\tunset_bg(Gtk::STATE_NORMAL);\n}\n\npanel::control* const control::mounted_panel()\n{\n\treturn dynamic_cast<panel::control*>(m_frame.get_child());\n}\n\nvoid control::save(k3d::xml::element& Document)\n{\n\tk3d::xml::element& panel = Document.append(k3d::xml::element(\"panel\"));\n\n\tif(mounted_panel())\n\t\tpanel.append(k3d::xml::attribute(\"type\", mounted_panel()->panel_type()));\n\tpanel.append(k3d::xml::attribute(\"pinned\", pinned.internal_value()));\n\tpanel.append(k3d::xml::attribute(\"visible\", is_visible()));\n\tpanel.append(k3d::xml::attribute(\"automagic\", automagic.internal_value()));\n\tpanel.append(k3d::xml::attribute(\"decorations\", decorations.internal_value()));\n}\n\nvoid control::load(k3d::xml::element& Element)\n{\n\treturn_if_fail(\"panel\" == Element.name);\n\n\tconst k3d::string_t type = attribute_text(Element, \"type\");\n\tconst k3d::string_t is_pinned = attribute_text(Element, \"pinned\");\n\tconst k3d::string_t is_visible = attribute_text(Element, \"visible\");\n\tconst k3d::string_t is_automagic = attribute_text(Element, \"automagic\");\n\tconst k3d::string_t is_decorated = attribute_text(Element, \"decorations\");\n\n\tmount_panel(type);\n\n\tpinned.set_value(\"true\" == is_pinned);\n\tautomagic.set_value(\"true\" == is_automagic);\n\tdecorations.set_value(\"true\" == is_decorated);\n\n\tif(\"true\" == is_visible)\n\t\tshow();\n\telse\n\t\thide();\n}\n\nvoid control::on_panel_focus_changed(control* Container)\n{\n\tm_panel_focus = Container == this;\n\tm_frame.set_shadow_type(m_panel_focus ? Gtk::SHADOW_IN : Gtk::SHADOW_NONE);\n}\n\nvoid control::on_grab_focus()\n{\n\tgrab_panel_focus();\n}\n\nvoid control::set_choices()\n{\n\tm_model->clear();\n\n\tadd_choice(\"NGUIViewportPanel\", quiet_load_icon(\"viewport_panel\", Gtk::ICON_SIZE_SMALL_TOOLBAR), _(\"Viewport\"), sigc::bind(sigc::mem_fun(*this, &control::on_mount_panel), \"NGUIViewportPanel\"));\n\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup();\n\tfor(k3d::plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t{\n\t\tk3d::iplugin_factory::metadata_t metadata = (**factory).metadata();\n\n\t\tif(metadata[\"ngui:component-type\"] != \"panel\")\n\t\t\tcontinue;\n\n\t\tconst k3d::string_t panel_type = (**factory).name();\n\n\t\tconst k3d::string_t panel_label = metadata[\"ngui:panel-label\"];\n\t\tif(panel_label.empty())\n\t\t{\n\t\t\tk3d::log() << error << \"Panel plugin [\" << panel_type << \"] without ngui:panel-label metadata will be ignored\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tm_type_plugin_map[panel_type] = *factory;\n\n\t\tadd_choice(panel_type, quiet_load_icon(panel_type + \"_panel\", Gtk::ICON_SIZE_SMALL_TOOLBAR), panel_label, sigc::bind(sigc::mem_fun(*this, &control::on_mount_panel), panel_type));\n\t}\n\n\tm_model->set_sort_column(m_columns.label, Gtk::SORT_ASCENDING);\n}\n\nvoid control::add_choice(const k3d::string_t& PanelType, const Glib::RefPtr<Gdk::Pixbuf> Icon, const Glib::ustring& Label, sigc::slot<void> Slot)\n{\n\tGtk::TreeRow row = *m_model->append();\n\n\trow[m_columns.type] = PanelType;\n\trow[m_columns.label] = Label;\n\trow[m_columns.slot] = Slot;\n\trow[m_columns.icon] = Icon;\n}\n\nvoid control::on_panel_type_changed()\n{\n\treturn_if_fail(m_panel_type.get_active() != m_model->children().end());\n\n\tGtk::TreeRow row = *m_panel_type.get_active();\n\tsigc::slot<void> slot = row.get_value(m_columns.slot);\n\tslot();\n}\n\nvoid control::on_decorations_changed(k3d::iunknown*)\n{\n\tif(decorations.internal_value())\n\t\tm_decorations.show();\n\telse\n\t\tm_decorations.hide();\n}\n\nconst unsigned long control::index(const k3d::string_t& PanelType)\n{\n\tconst Gtk::TreeModel::Children children = m_model->children();\n\tfor(unsigned long i = 0; i != children.size(); ++i)\n\t{\n\t\tif(children[i][m_columns.type] == PanelType)\n\t\t\treturn i;\n\t}\n\n\tk3d::log() << error << k3d_file_reference << \": error looking-up panel [\" << PanelType << \"]\" << std::endl;\n\treturn 0;\n}\n\n} // namespace panel_frame\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/panel_frame.h",
    "content": "#ifndef K3DSDK_NGUI_PANEL_FRAME_H\n#define K3DSDK_NGUI_PANEL_FRAME_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/signal_system.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/comboboxtext.h>\n#include <gtkmm/frame.h>\n#include <gtkmm/label.h>\n#include <gtkmm/liststore.h>\n\nnamespace k3d { class icamera; }\nnamespace k3d { class iplugin_factory; }\nnamespace k3d { namespace xml { class element; } }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\nnamespace image_toggle_button { class control; }\nnamespace panel { class control; }\n\nnamespace panel_frame\n{\n\n/// Provides a \"panel frame\" control that can \"mount\" a panel control\nclass control :\n        public Gtk::Frame,\n  public k3d::property_collection\n{\n\ttypedef Gtk::Frame base;\n\npublic:\n\ttypedef sigc::signal<void, control*> panel_focus_signal_t;\n\n\tcontrol(document_state& Document, panel_focus_signal_t& PanelFocusSignal);\n\t~control();\n\n\t/// Assigns the frame the panel focus\n\tvoid grab_panel_focus();\n\n\t/// Mounts a panel to the frame (note: mainly for hacking purposes, prefer mount_panel(const k3d::string_t& Type) instead)\n\tvoid mount_panel(panel::control& Panel, const k3d::string_t& Type);\n\t/// Mounts a panel based on type\n\tvoid mount_panel(const k3d::string_t& Type, bool RequestCamera = false);\n\t/// Unmounts a mounted panel\n\tvoid unmount();\n\t/// Unmounts a mounted panel, placing it in a floating window\n\tvoid float_panel();\n\n\t/// Highlights panel\n\tvoid set_bg_color(const Gdk::Color& color);\n\t/// Restores normal background\n\tvoid unset_bg_color();\n\n\t/// Returns the mounted panel, if any (could return NULL)\n\tpanel::control* const mounted_panel();\n\n\t/// Serializes panel state\n\tvoid save(k3d::xml::element& Document);\n\t/// Deserializes panel state\n\tvoid load(k3d::xml::element& Element);\n\n\t/// Stores the pinned state of the frame\n\tk3d_data(bool, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) pinned;\n\t/// Stores the automagic state of the frame\n\tk3d_data(bool, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) automagic;\n\t/// Stores the state of the frame decorations (standard buttons, chooser, etc)\n\tk3d_data(bool, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) decorations;\n\nprivate:\n\tvoid add(Widget&);\n\tvoid remove();\n\n\tvoid on_mount_panel(const k3d::string_t& Type);\n\n\tvoid on_panel_focus_changed(control* Container);\n\tvoid on_grab_focus();\n\tvoid on_panel_type_changed();\n\tvoid on_decorations_changed(k3d::iunknown*);\n\n\tconst unsigned long index(const k3d::string_t& Type);\n\n\t/// Called to update the contents of the combo-box for choosing panels\n\tvoid set_choices();\n\t/// Called to add a choice to the combo-box for choosing panels\n\tvoid add_choice(const k3d::string_t& PanelType, const Glib::RefPtr<Gdk::Pixbuf> Icon, const Glib::ustring& Label, sigc::slot<void> Slot);\n\n\tclass columns :\n\t\tpublic Gtk::TreeModelColumnRecord\n\t{\n\tpublic:\n\t\tcolumns()\n\t\t{\n\t\t\tadd(type);\n\t\t\tadd(label);\n\t\t\tadd(slot);\n\t\t\tadd(icon);\n\t\t}\n\n\t\tGtk::TreeModelColumn<Glib::ustring> type;\n\t\tGtk::TreeModelColumn<Glib::ustring> label;\n\t\tGtk::TreeModelColumn<sigc::slot<void> > slot;\n\t\tGtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon;\n\t};\n\tcolumns m_columns;\n\tGlib::RefPtr<Gtk::ListStore> m_model;\n\n\t/// Stores a mapping from panel type to external plugin factory\n\tstd::map<k3d::string_t, k3d::iplugin_factory*> m_type_plugin_map;\n\n\tGtk::HBox m_decorations;\n\t/// Provides a combo-box for choosing from available panel types\n\tGtk::ComboBox m_panel_type;\n\t/// Displays the title of mounted panels\n\tGtk::Label m_title;\n\n\t/// Stores a reference to the owning document\n\tdocument_state& m_document_state;\n\t/// Stores a frame that will contain the mounted panel\n\tGtk::Frame m_frame;\n\t/// Stores a connection to the mounted panel's focus signal\n\tsigc::connection m_grab_focus_connection;\n\t/// Stores a connection to the frame's panel type combo box\n\tsigc::connection m_panel_type_connection;\n\n\t/// Stores a reference to a signal for notifying observers when we get the panel focus\n\tpanel_focus_signal_t& m_panel_focus_signal;\n\t/// Stores the connection between m_panel_focus_signal and on_panel_focus_changed()\n\tsigc::connection m_panel_focus_changed_connection;\n\t/// Set to true iff this panel has the focus\n\tbool m_panel_focus;\n};\n\n/// Defines a collection of panel frames\ntypedef std::vector<control*> controls;\n\n} // namespace panel_frame\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_PANEL_FRAME_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/panel_mediator.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/signal_accumulators.h>\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace panel\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mediator::implementation\n\nclass mediator::implementation\n{\npublic:\n\tstatic implementation& instance(idocument& Document)\n\t{\n\t\ttypedef std::map<idocument*, implementation*> cache_t;\n\t\tstatic cache_t cache;\n\t\tcache_t::iterator result = cache.find(&Document);\n\t\tif(result == cache.end())\n\t\t\tresult = cache.insert(std::make_pair(&Document, new implementation(Document))).first;\n\n\t\treturn *result->second;\n\t}\n\n\tidocument& document;\n\n\tsigc::signal<void, inode*, iunknown*> node_focus_signal;\n\nprivate:\n\timplementation(idocument& Document) :\n\t\tdocument(Document)\n\t{\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mediator\n\nmediator::mediator(idocument& Document) :\n\tinternal(implementation::instance(Document))\n{\n}\n\nvoid mediator::set_focus(inode& Node)\n{\n\tinternal.node_focus_signal.emit(&Node, 0);\n}\n\nvoid mediator::set_focus(inode& Node, iunknown& Sender)\n{\n\tinternal.node_focus_signal.emit(&Node, &Sender);\n}\n\nsigc::connection mediator::connect_focus_node_signal(const sigc::slot<void, inode*, iunknown*>& Slot)\n{\n\treturn internal.node_focus_signal.connect(Slot);\n}\n\n} // namespace panel\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/panel_mediator.h",
    "content": "#ifndef K3DSDK_NGUI_PANEL_MEDIATOR_H\n#define K3DSDK_NGUI_PANEL_MEDIATOR_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/selection.h>\n\n#include <iosfwd>\n#include <vector>\n\nnamespace k3d\n{\n\nclass idocument;\nclass inode;\nclass iunknown;\n\nnamespace ngui\n{\n\nnamespace panel\n{\n\nclass control;\n\n/// Mediates interaction between panels on a per-document basis.\nclass mediator\n{\npublic:\n\tmediator(idocument& Document);\n\n\t/// Called to \"focus\" the given node.  Typically, this means that the node will be displayed\n\t/// in one-or-more panels.\n\tvoid set_focus(inode& Node);\n\n\t/// Called to \"focus\" the given node.  Typically, this means that the node will be displayed\n\t/// in one-or-more panels.\n\tvoid set_focus(inode& Node, iunknown& Sender);\n\n\t/// Connects a slot to a signal that will be emitted whenever a node receives the \"focus\".\n\tsigc::connection connect_focus_node_signal(const sigc::slot<void, inode*, iunknown*>& Slot);\n\nprivate:\n\tclass implementation;\n\timplementation& internal;\n};\n\n} // namespace panel\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_PANEL_MEDIATOR_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/path_chooser.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/ngui/hotkey_entry.h>\n#include <k3dsdk/ngui/path_chooser.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwatched_path_property.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/string_cast.h>\n\n#include <gtkmm/combobox.h>\n#include <gtkmm/entry.h>\n#include <gtkmm/liststore.h>\n#include <gtkmm/togglebutton.h>\n#include <gtkmm/tooltips.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace path_chooser\n{\n\n/// Specialization of k3d::path_chooser::data_proxy for use with k3d::iproperty objects\ntemplate<>\nclass data_proxy<k3d::iproperty> :\n\tpublic idata_proxy\n{\npublic:\n\ttypedef k3d::iproperty data_t;\n\n\tdata_proxy(data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data)),\n\t\tm_path_data(dynamic_cast<k3d::ipath_property*>(&Data)),\n\t\tm_watched_data(dynamic_cast<k3d::iwatched_path_property*>(&Data))\n\t{\n\t}\n\n\tconst k3d::ipath_property::mode_t mode()\n\t{\n\t\treturn m_path_data ? m_path_data->property_path_mode() : k3d::ipath_property::READ;\n\t}\n\n\tconst std::string type()\n\t{\n\t\treturn m_path_data ? m_path_data->property_path_type() : \"unknown\";\n\t}\n\n\tconst k3d::ipath_property::reference_t reference()\n\t{\n\t\treturn m_path_data ? m_path_data->property_path_reference() : k3d::ipath_property::RELATIVE_REFERENCE;\n\t}\n\n\tvoid set_reference(const k3d::ipath_property::reference_t Reference)\n\t{\n\t\treturn_if_fail(m_path_data);\n\t\tm_path_data->set_property_path_reference(Reference);\n\t}\n\n\tconst k3d::ipath_property::pattern_filters_t pattern_filters()\n\t{\n\t\treturn m_path_data ? m_path_data->pattern_filters() : k3d::ipath_property::pattern_filters_t();\n\t}\n\n\tconst k3d::filesystem::path value()\n\t{\n\t\treturn boost::any_cast<k3d::filesystem::path>(m_readable_data.property_internal_value());\n\t}\n\n\tvoid set_value(const k3d::filesystem::path& Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\t\tm_writable_data->property_set_value(Value);\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_readable_data.property_changed_signal();\n\t}\n\t\n\t/// True if the underlying path can be watched for changes\n\tconst k3d::bool_t is_watchable() const\n\t{\n\t\treturn m_watched_data;\n\t}\n\t\n\t/// True if the path is watchable and is actually being watched \n\tconst k3d::bool_t is_watched() const\n\t{\n\t\treturn m_watched_data ? m_watched_data->is_watched() : false;\n\t}\n\t\n\tvoid watch(const k3d::bool_t Watched)\n\t{\n\t\treturn_if_fail(m_watched_data);\n\t\tm_watched_data->watch(Watched);\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n\tk3d::ipath_property* const m_path_data;\n\tk3d::iwatched_path_property* const m_watched_data;\n};\n\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage)\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<k3d::iproperty>(Data, StateRecorder, ChangeMessage));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<idata_proxy> Data) :\n\tbase(false, 0),\n\tm_entry(new hotkey_entry),\n\tm_button(new Gtk::Button(\"...\")),\n\tm_combo(new Gtk::ComboBox()),\n\tm_toggle_button(0),\n\tm_data(std::move(Data)),\n\tm_disable_set_value(false)\n{\n\tm_entry->signal_focus_out_event().connect(sigc::mem_fun(*this, &control::on_focus_out_event));\n\tm_entry->signal_activate().connect(sigc::mem_fun(*this, &control::on_activate));\n\n\tm_button->set_tooltip_text(_(\"Browse for a file ...\"));\n\tm_button->signal_clicked().connect(sigc::mem_fun(*this, &control::on_browse));\n\n\tGlib::RefPtr<Gtk::ListStore> model = Gtk::ListStore::create(m_columns);\n\tGtk::TreeRow row;\n\trow = *model->append();\n\t\trow[m_columns.reference] = k3d::ipath_property::ABSOLUTE_REFERENCE;\n\t\trow[m_columns.label] = _(\"Absolute\");\n\trow = *model->append();\n\t\trow[m_columns.reference] = k3d::ipath_property::RELATIVE_REFERENCE;\n\t\trow[m_columns.label] = _(\"Relative\");\n\trow = *model->append();\n\t\trow[m_columns.reference] = k3d::ipath_property::INLINE_REFERENCE;\n\t\trow[m_columns.label] = _(\"Inline\");\n\n\tm_combo->set_model(model);\n\tm_combo->pack_start(m_columns.label);\n\tm_combo->set_tooltip_text(_(\"Choose whether to store absolute or relative filepaths\"));\n\n\tm_combo->signal_changed().connect(sigc::mem_fun(*this, &control::on_pick_reference_type));\n\n\tpack_start(*manage(m_entry), Gtk::PACK_EXPAND_WIDGET);\n\tpack_start(*manage(m_button), Gtk::PACK_SHRINK);\n\tpack_start(*manage(m_combo), Gtk::PACK_SHRINK);\n\t\n\tif(m_data.get() && m_data->is_watchable())\n\t{\n\t\tm_toggle_button = new Gtk::ToggleButton(_(\"Watch\"), true);\n\t\tm_toggle_button->set_active(true);\n\t\tm_toggle_button->signal_toggled().connect(sigc::mem_fun(*this, &control::on_watch_toggle));\n\t\tm_toggle_button->set_tooltip_text(_(\"Watch/unwatch file for changes\"));\n\t\tpack_start(*manage(m_toggle_button), Gtk::PACK_SHRINK);\n\t}\n\n\tdata_changed(0);\n\n\tif(m_data.get())\n\t\tm_data->changed_signal().connect(sigc::mem_fun(*this, &control::data_changed));\n\n\tshow_all();\n}\n\nbool control::on_focus_out_event(GdkEventFocus* Event)\n{\n\tset_value();\n\treturn false;\n}\n\nvoid control::on_activate()\n{\n\tset_value();\n}\n\nvoid control::on_browse()\n{\n\treturn_if_fail(m_data.get());\n\n\tk3d::filesystem::path new_value;\n\t{\n\t\tfile_chooser_dialog dialog(\"\", m_data->type(), m_data->mode(), m_data->value());\n\n\t\tconst k3d::ipath_property::pattern_filters_t filters = m_data->pattern_filters();\n\t\tfor(k3d::ipath_property::pattern_filters_t::const_iterator filter = filters.begin(); filter != filters.end(); ++filter)\n\t\t\tdialog.add_pattern_filter(filter->name, filter->pattern);\n\t\tif(!filters.empty())\n\t\t\tdialog.add_all_files_filter();\n\n\t\tif(!dialog.get_file_path(new_value))\n\t\t\treturn;\n\t}\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t// Update everything with the new value ...\n\tm_data->set_value(new_value);\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->commit_change_set(m_data->state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), m_data->change_message + \" \" + new_value.native_utf8_string().raw(), K3D_CHANGE_SET_CONTEXT);\n}\n\nvoid control::on_pick_reference_type()\n{\n\treturn_if_fail(m_data.get());\n\treturn_if_fail(m_combo->get_active() != m_combo->get_model()->children().end());\n\n\tm_data->set_reference(m_combo->get_active()->get_value(m_columns.reference));\n}\n\nvoid control::on_watch_toggle()\n{\n\tif(m_disable_set_value)\n\t\treturn;\n\treturn_if_fail(m_data.get());\n\tm_data->watch(!m_data->is_watched());\n}\n\nvoid control::set_value()\n{\n\tif(m_disable_set_value)\n\t\treturn;\n\n\treturn_if_fail(m_data.get());\n\n\tm_disable_set_value = true;\n\n\tk3d::filesystem::path new_value;\n\ttry\n\t{\n\t\tnew_value = k3d::filesystem::native_path(k3d::ustring::from_utf8(m_entry->get_text()));\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tk3d::log() << error << e.what() << std::endl;\n\t\tm_disable_set_value = false;\n\t\treturn;\n\t}\n\n\t// If the value didn't change, we're done ...\n\tif(m_data->value().generic_utf8_string() == new_value.generic_utf8_string())\n\t{\n\t\tm_disable_set_value = false;\n\t\treturn;\n\t}\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t// Update everything with the new value ...\n\tm_data->set_value(new_value);\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->commit_change_set(m_data->state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), m_data->change_message + \" \" + new_value.native_utf8_string().raw(), K3D_CHANGE_SET_CONTEXT);\n\n\tm_disable_set_value = false;\n}\n\nvoid control::data_changed(k3d::ihint* Hint)\n{\n\treturn_if_fail(m_data.get());\n\n\tm_entry->set_text(m_data->value().leaf().raw());\n\tm_entry->set_tooltip_text(m_data->value().native_utf8_string().raw());\n\n\tm_combo->set_active(m_data->reference());\n\tif(m_toggle_button)\n\t{\n\t\tm_disable_set_value = true;\n\t\tm_toggle_button->set_active(m_data->is_watched());\n\t\tm_disable_set_value = false;\n\t}\n}\n\nvoid control::on_reference_type_changed()\n{\n\tm_combo->set_active(m_data->reference());\n}\n\n} // namespace path_chooser\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/path_chooser.h",
    "content": "#ifndef K3DSDK_NGUI_PATH_CHOOSER_H\n#define K3DSDK_NGUI_PATH_CHOOSER_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ipath_property.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iwritable_property.h>\n\n#include <gtkmm/box.h>\n\n#include <memory>\n\nnamespace Gtk { class Button; }\nnamespace Gtk { class ComboBox; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass hotkey_entry;\n\nnamespace path_chooser\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// idata_proxy\n\n/// Abstract interface for an object that proxies a data source for an path control (i.e. the \"model\" in model-view-controller)\nclass idata_proxy\n{\npublic:\n\tvirtual ~idata_proxy() {}\n\n\t/// Returns the path \"mode\" (input or output)\n\tvirtual const k3d::ipath_property::mode_t mode() = 0;\n\t/// Returns the path \"type\" (category)\n\tvirtual const std::string type() = 0;\n\tvirtual const k3d::ipath_property::reference_t reference() = 0;\n\tvirtual void set_reference(const k3d::ipath_property::reference_t Reference) = 0;\n\tvirtual const k3d::ipath_property::pattern_filters_t pattern_filters() = 0;\n\t/// Called to return the underlying data value\n\tvirtual const k3d::filesystem::path value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const k3d::filesystem::path& Value) = 0;\n\t/// Signal emitted if the underlying data changes\n\ttypedef sigc::signal<void, k3d::ihint*> changed_signal_t;\n\t/// Signal emitted if the underlying data changes\n\tvirtual changed_signal_t& changed_signal() = 0;\n\t\n\t/// True if the underlying path can be watched for changes\n\tvirtual const k3d::bool_t is_watchable() const = 0;\n\t/// True if the path is watchable and is actually being watched \n\tvirtual const k3d::bool_t is_watched() const = 0;\n\t/// Watch the path\n\tvirtual void watch(const k3d::bool_t Watched) = 0;\n\n\t/// Stores an optional state recorder for recording undo/redo data\n\tk3d::istate_recorder* const state_recorder;\n\t/// Stores an optional message for labelling undo/redo state changes\n\tconst Glib::ustring change_message;\n\nprotected:\n\tidata_proxy(k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tstate_recorder(StateRecorder),\n\t\tchange_message(ChangeMessage)\n\t{\n\t}\n\nprivate:\n\tidata_proxy(const idata_proxy& RHS);\n\tidata_proxy& operator=(const idata_proxy& RHS);\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a standard UI control for manipulating filepath data (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::HBox\n{\n\ttypedef Gtk::HBox base;\n\npublic:\n\tcontrol(std::unique_ptr<idata_proxy> Data);\n\nprivate:\n\t/// Called when the control loses the keyboard focus\n\tbool on_focus_out_event(GdkEventFocus* Event);\n\t/// Called when the control is activated\n\tvoid on_activate();\n\t/// Called when the user clicks the \"browse\" button\n\tvoid on_browse();\n\t/// Called when the user changes the reference type\n\tvoid on_pick_reference_type();\n\t/// Called when the user finishes editing data\n\tvoid set_value();\n\t/// Called whenever the underlying data changes\n\tvoid data_changed(k3d::ihint*);\n\t/// Called whenever the underlying data reference changes\n\tvoid on_reference_type_changed();\n\t/// Called whenever the watch change toggle button is toggled\n\tvoid on_watch_toggle();\n\n\t/// Stores an entry widget for displaying the current value\n\thotkey_entry* const m_entry;\n\t/// Stores a button widget for browsing the filesystem\n\tGtk::Button* const m_button;\n\t/// Stores a combo-box for picking absolute, relative, or inline path behavior\n\tGtk::ComboBox* const m_combo;\n\t/// Stores a toggle button to set if the file should be watched, if the path property is watchable\n\tGtk::ToggleButton* m_toggle_button;\n\t/// Stores a reference to the underlying data object\n\tstd::unique_ptr<idata_proxy> m_data;\n\t/// Prevent set_value() and on_watch_toggle from being called recursively (a hack)\n\tbool m_disable_set_value;\n\n\tclass reference_columns :\n\t\tpublic Gtk::TreeModelColumnRecord\n\t{\n\tpublic:\n\t\treference_columns()\n\t\t{\n\t\t\tadd(reference);\n\t\t\tadd(label);\n\t\t}\n\n\t\tGtk::TreeModelColumn<k3d::ipath_property::reference_t> reference;\n\t\tGtk::TreeModelColumn<Glib::ustring> label;\n\t};\n\n\treference_columns m_columns;\n};\n\n/// Provides an implementation of k3d::path_chooser::idata_proxy that supports any data source that supports the value(), set_value(), and changed_signal() concepts\ntemplate<typename data_t>\nclass data_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tdata_proxy(data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_data(Data)\n\t{\n\t}\n\n\tconst k3d::filesystem::path value()\n\t{\n\t\treturn m_data.value();\n\t}\n\n\tvoid set_value(const k3d::filesystem::path& Value)\n\t{\n\t\tm_data.set_value(Value);\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_data.changed_signal();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_data;\n};\n\n/// Convenience factory function for creating idata_proxy objects\ntemplate<typename data_t>\nstd::unique_ptr<idata_proxy> proxy(data_t& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = Glib::ustring())\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<data_t>(Data, StateRecorder, ChangeMessage));\n}\n\n/// Convenience factory function for creating idata_proxy objects\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = Glib::ustring());\n\n} // namespace path_chooser\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_PATH_CHOOSER_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/pipeline.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/dependencies.h>\n#include <k3dsdk/imaterial_sink.h>\n#include <k3dsdk/imesh_selection_sink.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/imesh_storage.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/iparentable.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/ireset_properties.h>\n#include <k3dsdk/itime_sink.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/ngui/pipeline.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/transform.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/time_source.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/utility_gl.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace pipeline\n{\n\nnamespace detail\n{\n\n/// Duplicates mesh source into a FrozenMesh and instantiate the new object\nk3d::inode* duplicate_mesh(k3d::idocument& Document, k3d::inode& Node)\n{\n\t// Get the upstream property\n\tk3d::iproperty_collection* property_collection = dynamic_cast<k3d::iproperty_collection*>(&Node);\n\treturn_val_if_fail(property_collection, 0);\n\n\tk3d::imesh_sink* const downstream_sink = dynamic_cast<k3d::imesh_sink*>(&Node);\n\treturn_val_if_fail(downstream_sink, 0);\n\n\tk3d::iproperty& downstream_input = downstream_sink->mesh_sink_input();\n\n\tk3d::iproperty* const upstream_output = Document.pipeline().dependency(downstream_input);\n\treturn_val_if_fail(upstream_output, 0);\n\n\tk3d::imesh_source* const upstream_mesh_source = dynamic_cast<k3d::imesh_source*>(upstream_output->property_node());\n\treturn_val_if_fail(upstream_mesh_source, 0);\n\n\t// Create a new FrozenMesh and a copy of upstream mesh instance ...\n\tk3d::inode* frozen_mesh = k3d::plugin::create<k3d::inode>(k3d::classes::FrozenMesh(), Document);\n\treturn_val_if_fail(frozen_mesh, 0);\n\n\tconst std::string frozen_mesh_name = k3d::unique_name(Document.nodes(), upstream_output->property_node()->name());\n\tfrozen_mesh->set_name(frozen_mesh_name);\n\n\tk3d::inode* mesh_instance = k3d::plugin::create<k3d::inode>(k3d::classes::MeshInstance(), Document);\n\treturn_val_if_fail(mesh_instance, 0);\n\n\tmesh_instance->set_name(k3d::unique_name(Document.nodes(), frozen_mesh_name + \" Instance\"));\n\n\t// Set DAG dependencies\n\tk3d::imesh_sink* const mesh_instance_sink = dynamic_cast<k3d::imesh_sink*>(mesh_instance);\n\treturn_val_if_fail(mesh_instance_sink, 0);\n\n\tk3d::imesh_source* const frozen_mesh_source = dynamic_cast<k3d::imesh_source*>(frozen_mesh);\n\treturn_val_if_fail(frozen_mesh_source, 0);\n\n\tk3d::ipipeline::dependencies_t dependencies;\n\tdependencies.insert(std::make_pair(&mesh_instance_sink->mesh_sink_input(), &frozen_mesh_source->mesh_source_output()));\n\tDocument.pipeline().set_dependencies(dependencies);\n\n\t// Duplicate transformation, if any\n\tfreeze_transformation(Node, *mesh_instance, Document);\n\n\t// Copy property values\n\tconst k3d::iproperty_collection::properties_t properties = property_collection->properties();\n\tfor(k3d::iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t{\n\t\tconst std::string name = (*property)->property_name();\n\t\tif(name != \"output_matrix\"\t// Property not writable\n\t\t\t&& name != \"name\"\n\t\t\t&& name != \"input_mesh\"\n\t\t\t&& name != \"output_mesh\")\n\t\t{\n\t\t\tk3d::property::set_internal_value(*mesh_instance, name, (*property)->property_internal_value());\n\t\t}\n\t}\n\n\t// Copy upstream mesh to our new FrozenMesh ...\n\tif(k3d::mesh* const upstream_mesh = boost::any_cast<k3d::mesh*>(k3d::property::pipeline_value(upstream_mesh_source->mesh_source_output())))\n\t{\n\t\tif(k3d::imesh_storage* const frozen_mesh_storage = dynamic_cast<k3d::imesh_storage*>(frozen_mesh))\n\t\t{\n\t\t\tk3d::mesh* const new_mesh = new k3d::mesh();\n\t\t\tk3d::mesh::deep_copy(*upstream_mesh, *new_mesh);\n\t\t\tfrozen_mesh_storage->reset_mesh(new_mesh);\n\t\t}\n\t}\n\n\treturn mesh_instance;\n}\n\nk3d::inode* duplicate_node(k3d::idocument& Document, k3d::inode& Node)\n{\n\t// Get node's properties\n\tk3d::iproperty_collection* property_collection = dynamic_cast<k3d::iproperty_collection*>(&Node);\n\treturn_val_if_fail(property_collection, 0);\n\n\t// Clone the node\n\tk3d::inode* clone = k3d::plugin::create<k3d::inode>(Node.factory(), Document);\n\treturn_val_if_fail(clone, 0);\n\n\tclone->set_name(k3d::unique_name(Document.nodes(), Node.name()));\n\n\t// Duplicate transformation, if any\n\tfreeze_transformation(Node, *clone, Document);\n\n\t// Copy property values\n\tconst k3d::iproperty_collection::properties_t properties = property_collection->properties();\n\tfor(k3d::iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t{\n\t\tconst std::string name = (*property)->property_name();\n\t\tif(name != \"output_matrix\"\t// Property not writable\n\t\t\t&& name != \"name\"\n\t\t\t&& name != \"input_mesh\"\n\t\t\t&& name != \"output_mesh\"\n\t\t\t&& !(Node.factory().factory_id() == k3d::classes::Camera() && name == \"navigation_target\")) // Skip Camera's navigation target property\n\t\t{\n\t\t\tk3d::property::set_internal_value(*clone, name, (*property)->property_internal_value());\n\t\t}\n\t}\n\n\treturn clone;\n}\n\n} // namespace detail\n\ninode* default_gl_painter(idocument& Document)\n{\n\tconst std::vector<k3d::inode*> nodes = k3d::node::lookup(Document, \"GL Default Painter\");\n\treturn (1 == nodes.size()) ? nodes[0] : 0;\n}\n\ninode* default_ri_painter(idocument& Document)\n{\n\tconst std::vector<k3d::inode*> nodes = k3d::node::lookup(Document, \"RenderMan Default Painter\");\n\treturn (1 == nodes.size()) ? nodes[0] : 0;\n}\n\t\ninode* create_node(idocument& Document, iplugin_factory& Factory)\n{\n\t// Switch to node selection mode\n\tif(selection::NODE != selection::state(Document).current_mode())\n\t\tselection::state(Document).set_current_mode(selection::NODE);\n\n\t// Create the requested node ...\n\tk3d::record_state_change_set changeset(Document, k3d::string_cast(boost::format(_(\"Create %1%\")) % Factory.name()), K3D_CHANGE_SET_CONTEXT);\n\tconst std::string node_name = k3d::unique_name(Document.nodes(), Factory.name());\n\tk3d::inode* const node = k3d::plugin::create<k3d::inode>(Factory, Document, node_name);\n\treturn_val_if_fail(node, 0);\n\n\t// Keep track of the node to be selected ...\n\tk3d::inode* to_be_selected = node;\n\n\t// Keep track of every new node created ...\n\tstd::vector<k3d::inode*> new_nodes;\n\tnew_nodes.push_back(node);\n\n\t// Prepare to make connections to other nodes ...\n\tk3d::ipipeline::dependencies_t dependencies;\n\n\t// If the new node is a mesh source (but not a MeshInstance!), create a MeshInstance node and attach it so it's immediately visible ...\n\tk3d::imesh_source* const mesh_source = dynamic_cast<k3d::imesh_source*>(node);\n\tif(mesh_source && k3d::classes::MeshInstance() != Factory.factory_id())\n\t{\n\t\t// Create a mesh instance ...\n\t\tk3d::inode* const mesh_instance = pipeline::instantiate_mesh(Document, *node);\n\t\treturn_val_if_fail(mesh_instance, 0);\n\t\tnew_nodes.push_back(mesh_instance);\n\n\t\t// In this case, we want to select the mesh instance instead of the mesh source ...\n\t\tto_be_selected = mesh_instance;\n\t}\n\n\t// If the new node is a material sink, assign a default material ...\n\tif(k3d::imaterial_sink* const material_sink = dynamic_cast<k3d::imaterial_sink*>(node))\n\t{\n\t\tconst std::vector<k3d::imaterial*> materials = k3d::node::lookup<k3d::imaterial>(Document);\n\t\tif(materials.size())\n\t\t\tk3d::property::set_internal_value(material_sink->material_sink_input(), dynamic_cast<k3d::inode*>(*materials.rbegin()));\n\t}\n\n\t// If the new node is a time sink, connect it to the document time source ...\n\tif(k3d::itime_sink* const time_sink = dynamic_cast<k3d::itime_sink*>(node))\n\t\tdependencies.insert(std::make_pair(&time_sink->time_sink_input(), k3d::get_time(Document)));\n\n\tif(!dependencies.empty())\n\t\tDocument.pipeline().set_dependencies(dependencies);\n\n\t// If the new node is a camera, orient it horizontally\n\tif(k3d::classes::Camera() == Factory.factory_id())\n\t\tk3d::set_matrix(*node, k3d::rotate3(k3d::radians(90.0), k3d::vector3(1, 0, 0)));\n\t\n\t// If the new node is a multiple mesh sink, add two mesh inputs\n\tif(Factory.implements(typeid(k3d::imulti_mesh_sink)))\n\t{\n\t\tk3d::property::create<k3d::mesh*>(*node, \"input_mesh1\", \"Input Mesh 1\", \"\", static_cast<k3d::mesh*>(0));\n\t\tk3d::property::create<k3d::mesh*>(*node, \"input_mesh2\", \"Input Mesh 2\", \"\", static_cast<k3d::mesh*>(0));\n\t}\n\n\t// If the new node is a render-engine, default to making every node in the document visible ...\n\tif(k3d::inode_collection_sink* const node_collection_sink = dynamic_cast<k3d::inode_collection_sink*>(node))\n\t{\n\t\tconst k3d::inode_collection_sink::properties_t properties = node_collection_sink->node_collection_properties();\n\t\tfor(k3d::inode_collection_sink::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t\tk3d::property::set_internal_value(**property, Document.nodes().collection());\n\t}\n\n\t// By default, make the new node visible in any node collection sinks that already exist ...\n\tk3d::node::show(Document, new_nodes);\n\n\t// Give nodes a chance to initialize their property values based on their inputs, if any ...\n\tif(k3d::ireset_properties* const reset_properties = dynamic_cast<k3d::ireset_properties*>(node))\n\t\treset_properties->reset_properties();\n\n\t// Replace the current selection\n\tselection::state(Document).deselect_all();\n\tselection::state(Document).select(*to_be_selected);\n\n\t// Make the newly-created node properties visible ...\n\tpanel::mediator(Document).set_focus(*node);\n\n\tk3d::gl::redraw_all(Document, k3d::gl::irender_viewport::ASYNCHRONOUS);\n\n\treturn node;\n}\n\n/// Duplicates first node's transformation into a FrozenMatrixa and connects it to second node\nvoid freeze_transformation(k3d::inode& FromNode, k3d::inode& ToNode, k3d::idocument& Document)\n{\n\t// Check for \"input_matrix\" property\n\tk3d::iproperty* const transformation_property = k3d::property::get<k3d::matrix4>(FromNode, \"input_matrix\");\n\tif(!transformation_property)\n\t\treturn;\n\n\t// Check whether it's connected\n\tif(!Document.pipeline().dependency(*transformation_property))\n\t\treturn;\n\n\t// Duplicate input matrix into a new FrozenMatrix\n\tk3d::inode* frozen_transformation = k3d::plugin::create<k3d::inode>(k3d::classes::FrozenMatrix(), Document);\n\treturn_if_fail(frozen_transformation);\n\n\tfrozen_transformation->set_name(k3d::unique_name(Document.nodes(), ToNode.name() + \" Transformation\"));\n\n\t// Connect new FrozenMatrix and ToNode\n\tk3d::imatrix_sink* const transformation_sink = dynamic_cast<k3d::imatrix_sink*>(&ToNode);\n\treturn_if_fail(transformation_sink);\n\tk3d::imatrix_source* const transformation_source = dynamic_cast<k3d::imatrix_source*>(frozen_transformation);\n\treturn_if_fail(transformation_source);\n\n\tk3d::ipipeline::dependencies_t dependencies;\n\tdependencies.insert(std::make_pair(&transformation_sink->matrix_sink_input(), &transformation_source->matrix_source_output()));\n\tDocument.pipeline().set_dependencies(dependencies);\n\n\t// Copy transformation value\n\tconst k3d::matrix4 transformation = k3d::node_to_world_matrix(FromNode);\n\tk3d::property::set_internal_value(*frozen_transformation, \"matrix\", transformation);\n}\n\ninode* instantiate_mesh(idocument& Document, inode& Node)\n{\n\tinode* mesh_instance = 0;\n\tiproperty* mesh_source_property = 0;\n\tif(classes::MeshInstance() == Node.factory().factory_id()) // Instantiate the input in case of a mesh instance\n\t{\n\t\timesh_sink* sink = dynamic_cast<imesh_sink*>(&Node);\n\t\tmesh_source_property = Document.pipeline().dependency(sink->mesh_sink_input());\n\t\tif(mesh_source_property)\n\t\t\tmesh_instance = k3d::plugin::create<k3d::inode>(k3d::classes::MeshInstance(), Document, k3d::unique_name(Document.nodes(), Node.name() + \" Instance\"));\n\t}\n\telse\n\t{\n\t\tk3d::ipipeline& pipeline = Document.pipeline();\n\t\tconst k3d::ipipeline::dependencies_t& dependencies = pipeline.dependencies();\n\t\tk3d::imesh_source* mesh_source = dynamic_cast<k3d::imesh_source*>(&Node);\n\t\tif(!mesh_source)\n\t\t\treturn 0;\n\t\tmesh_source_property = &(mesh_source->mesh_source_output());\n\t\tif(mesh_source_property)\n\t\t\tmesh_instance = k3d::plugin::create<k3d::inode>(k3d::classes::MeshInstance(), Document, k3d::unique_name(Document.nodes(), Node.name() + \" Instance\"));\n\t\t\t\n\t\tk3d::iproperty* instance_mesh_source_property = &dynamic_cast<k3d::imesh_source*>(mesh_instance)->mesh_source_output();\n\t\tk3d::iproperty* instance_matrix_source_property = &dynamic_cast<k3d::imatrix_source*>(mesh_instance)->matrix_source_output();\n\t\t\n\t\tk3d::imatrix_source* matrix_source = dynamic_cast<k3d::imatrix_source*>(&Node);\n\t\tk3d::iproperty* matrix_source_property = 0;\n\t\tif(matrix_source)\n\t\t\tmatrix_source_property = &(matrix_source->matrix_source_output());\n\t\t\n\t\t// Connect the MeshInstance outputs to the inputs of the downstream node, if any\n\t\tk3d::ipipeline::dependencies_t new_dependencies;\n\t\tfor(k3d::ipipeline::dependencies_t::const_iterator dependency = dependencies.begin(); dependency != dependencies.end(); ++dependency)\n\t\t{\n\t\t\tif(dependency->second == mesh_source_property)\n\t\t\t{\n\t\t\t\tdependency->first->property_set_dependency(0);\n\t\t\t\tnew_dependencies.insert(std::make_pair(dependency->first, instance_mesh_source_property));\n\t\t\t}\n\t\t\tif(matrix_source_property && dependency->second == matrix_source_property)\n\t\t\t{\n\t\t\t\tdependency->first->property_set_dependency(0);\n\t\t\t\tnew_dependencies.insert(std::make_pair(dependency->first, instance_matrix_source_property));\n\t\t\t}\n\t\t}\n\t\tpipeline.set_dependencies(new_dependencies);\n\t\t\n\t}\n\t \n\tif(!mesh_source_property)\n\t\treturn 0;\n\t\n\t// Assign a default painter ...\n\tk3d::property::set_internal_value(*mesh_instance, \"gl_painter\", default_gl_painter(Document));\n\tk3d::property::set_internal_value(*mesh_instance, \"ri_painter\", default_ri_painter(Document));\n\n\t// Connect the mesh instance to the source ...\n\tk3d::ipipeline::dependencies_t dependencies;\n\tk3d::imesh_sink* const mesh_sink = dynamic_cast<k3d::imesh_sink*>(mesh_instance);\n\tif(mesh_sink)\n\t\tdependencies.insert(std::make_pair(&mesh_sink->mesh_sink_input(), mesh_source_property));\n\tDocument.pipeline().set_dependencies(dependencies);\n\t\n\tfreeze_transformation(Node, *mesh_instance, Document);\n\t\n\treturn mesh_instance;\n}\n\nvoid instantiate_selected_nodes(idocument& Document)\n{\n\t// Save selection\n\tconst k3d::nodes_t nodes = selection::state(Document).selected_nodes();\n\tif(!nodes.size())\n\t\treturn;\n\n\t// Record action\n\tstd::string action = \"Instantiate Nodes\";\n\tif(nodes.size() == 1)\n\t\taction = k3d::string_cast(boost::format(_(\"Instantiate %1%\")) % (*nodes.begin())->name());\n\tk3d::record_state_change_set changeset(Document, action, K3D_CHANGE_SET_CONTEXT);\n\n\t// Deselect all\n\tselection::state(Document).deselect_all();\n\n\t// Instantiate nodes and select new ones\n\tk3d::nodes_t new_nodes;\n\tfor(k3d::nodes_t::const_iterator selected_node = nodes.begin(); selected_node != nodes.end(); ++selected_node)\n\t{\n\t\tif(k3d::inode* new_node = instantiate_mesh(Document, **selected_node))\n\t\t{\n\t\t\tselection::state(Document).select(*new_node);\n\t\t\tnew_nodes.push_back(new_node);\n\t\t}\n\t}\n\n\tk3d::node::show(Document, new_nodes);\n\n\t// Show the new instance properties if only one was processed\n\tif(new_nodes.size() == 1)\n\t\tpanel::mediator(Document).set_focus(**new_nodes.begin());\n}\n\nvoid duplicate_selected_nodes(idocument& Document)\n{\n\t// Save selection\n\tconst k3d::nodes_t nodes = selection::state(Document).selected_nodes();\n\tif(!nodes.size())\n\t\treturn;\n\n\t// Record action\n\tstd::string action = \"Duplicate Nodes\";\n\tif(nodes.size() == 1)\n\t\taction = k3d::string_cast(boost::format(_(\"Duplicate %1%\")) % (*nodes.begin())->name());\n\tk3d::record_state_change_set changeset(Document, action, K3D_CHANGE_SET_CONTEXT);\n\n\t// Deselect all\n\tselection::state(Document).deselect_all();\n\n\t// Instantiate nodes and select new ones\n\tk3d::nodes_t new_nodes;\n\tfor(k3d::nodes_t::const_iterator selected_node = nodes.begin(); selected_node != nodes.end(); ++selected_node)\n\t{\n\t\tk3d::inode* new_node = 0;\n\t\tif(k3d::classes::MeshInstance() == (*selected_node)->factory().factory_id())\n\t\t\tnew_node = detail::duplicate_mesh(Document, **selected_node);\n\t\telse\n\t\t\tnew_node = detail::duplicate_node(Document, **selected_node);\n\n\t\tif(new_node)\n\t\t{\n\t\t\tselection::state(Document).select(*new_node);\n\t\t\tnew_nodes.push_back(new_node);\n\t\t}\n\t}\n\n\tk3d::node::show(Document, new_nodes);\n\n\t// Show duplicated node properties if only one was processed\n\tif(new_nodes.size() == 1)\n\t\tpanel::mediator(Document).set_focus(**new_nodes.begin());\n}\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/pipeline.h",
    "content": "#ifndef K3DSDK_NGUI_PIPELINE_H\n#define K3DSDK_NGUI_PIPELINE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <vector>\n\nnamespace k3d\n{\n\nclass idocument;\nclass inode;\nclass iplugin_factory;\n\nnamespace ngui\n{\n\nnamespace pipeline\n{\n\n/// Creates a new node, performing many standard initialization operations.\ninode* create_node(idocument& Document, iplugin_factory& Factory);\n\n/// Duplicates first node's transformation into a FrozenMatrixa and connects it to second node\nvoid freeze_transformation(inode& FromNode, inode& ToNode, idocument& Document);\n/// Instantiates the given node, returning the mesh instance if it was a mesh or null otherwise\ninode* instantiate_mesh(idocument& Document, inode& Node);\n/// Instantiates (creates MeshInstance outputs for) nodes - note, only mesh sources are instantiable.\nvoid instantiate_selected_nodes(idocument& Document);\n/// Duplicates nodes with their input transformation, if any\nvoid duplicate_selected_nodes(idocument& Document);\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_PIPELINE_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/point3.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/point3.h>\n#include <k3dsdk/ngui/spin_button.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/types_ri.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/vectors.h>\n\n#include <gtkmm/button.h>\n#include <gtkmm/label.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace point\n{\n\nnamespace detail\n{\n\n/// Adapts a k3d::iproperty object for use with point::control\nclass data_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tdata_proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data))\n\t{\n\t}\n\n\tbool writable()\n\t{\n\t\treturn m_writable_data ? true : false;\n\t}\n\t\n\tconst k3d::point3 value()\n\t{\n\t\tconst std::type_info& type = m_readable_data.property_type();\n\t\tif(type == typeid(k3d::point3))\n\t\t\treturn boost::any_cast<k3d::point3>(m_readable_data.property_internal_value());\n\t\telse if(type == typeid(k3d::vector3))\n\t\t\treturn k3d::to_point(boost::any_cast<k3d::vector3>(m_readable_data.property_internal_value()));\n\t\telse if(type == typeid(k3d::normal3))\n\t\t\treturn k3d::to_point(boost::any_cast<k3d::normal3>(m_readable_data.property_internal_value()));\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \"unknown property type: \" << type.name() << std::endl;\n\n\t\treturn k3d::point3(0, 0, 0);\n\t}\n\n\tvoid set_value(const k3d::point3& Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\n\t\tconst std::type_info& type = m_readable_data.property_type();\n\t\tif(type == typeid(k3d::point3))\n\t\t\tm_writable_data->property_set_value(Value);\n\t\telse if(type == typeid(k3d::vector3))\n\t\t\tm_writable_data->property_set_value(k3d::to_vector(Value));\n\t\telse if(type == typeid(k3d::normal3))\n\t\t\tm_writable_data->property_set_value(k3d::to_normal(Value));\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \"unknown property type: \" << type.name() << std::endl;\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_readable_data.property_changed_signal();\n\t}\n\nprivate:\n\tk3d::iproperty& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n};\n\n} // namespace detail\n\n/// Adapts a spin button to control a single point coordinate (indentified by index)\nclass spin_button_model :\n\tpublic spin_button::imodel\n{\npublic:\n\tspin_button_model(point::idata_proxy& Data, const unsigned int Index) :\n\t\tm_data(Data),\n\t\tm_index(Index)\n\t{\n\t\tassert_warning(m_index < 3);\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn \"\";\n\t}\n\n\tk3d::bool_t writable()\n\t{\n\t\treturn m_data.writable();\n\t}\n\n\tk3d::double_t value()\n\t{\n\t\treturn m_data.value()[m_index];\n\t}\n\n\tvoid set_value(const double Value)\n\t{\n\t\tk3d::point3 coords = m_data.value();\n\t\tcoords[m_index] = Value;\n\t\tm_data.set_value(coords);\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_data.changed_signal().connect(sigc::hide(Slot));\n\t}\n\n\tk3d::double_t step_increment()\n\t{\n\t\treturn 0.1;\n\t}\n\n\tconst std::type_info& units()\n\t{\n\t\treturn typeid(k3d::measurement::distance);\n\t}\n\nprivate:\n\tpoint::idata_proxy& m_data;\n\tconst int m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<idata_proxy> Data) :\n\tbase(3, 3, false),\n\tm_data(std::move(Data)),\n\tm_reset_button(0)\n{\n\tspin_button::control* const x = new spin_button::control(new spin_button_model(*m_data, 0), m_data->state_recorder);\n\tspin_button::control* const y = new spin_button::control(new spin_button_model(*m_data, 1), m_data->state_recorder);\n\tspin_button::control* const z = new spin_button::control(new spin_button_model(*m_data, 2), m_data->state_recorder);\n\n\tattach(*Gtk::manage(new Gtk::Label(_(\"X\"))), 0, 1, 0, 1);\n\tattach(*Gtk::manage(x), 1, 2, 0, 1);\n\n\tattach(*Gtk::manage(new Gtk::Label(_(\"Y\"))), 0, 1, 1, 2);\n\tattach(*Gtk::manage(y), 1, 2, 1, 2);\n\n\tattach(*Gtk::manage(new Gtk::Label(_(\"Z\"))), 0, 1, 2, 3);\n\tattach(*Gtk::manage(z), 1, 2, 2, 3);\n\n\tif(m_data.get() && m_data->writable())\n\t{\n\t\tm_reset_button = new Gtk::Button(_(\"Reset\"));\n\t\tattach(*Gtk::manage(m_reset_button << connect_button(sigc::mem_fun(*this, &control::on_reset))), 2, 3, 1, 2);\n\t}\n}\n\nvoid control::on_reset()\n{\n\treturn_if_fail(m_data.get());\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\tm_data->set_value(k3d::point3(0, 0, 0));\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_data->state_recorder)\n\t\tm_data->state_recorder->commit_change_set(m_data->state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), m_data->change_message + \" reset\", K3D_CHANGE_SET_CONTEXT);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// proxy\n\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Property, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage)\n{\n\treturn std::unique_ptr<idata_proxy>(new detail::data_proxy(Property, StateRecorder, ChangeMessage));\n}\n\n} // namespace point\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/point3.h",
    "content": "#ifndef K3DSDK_NGUI_POINT3_H\n#define K3DSDK_NGUI_POINT3_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/point3.h>\n#include <k3dsdk/signal_system.h>\n\n#include <gtkmm/table.h>\n\n#include <memory>\n\nnamespace Gtk { class Button; }\nnamespace k3d { class ihint; }\nnamespace k3d { class iproperty; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace point\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// idata_proxy\n\n/// Abstract interface for an object that proxies a data source for a point control (i.e. the \"model\" in model-view-controller)\nclass idata_proxy\n{\npublic:\n\tvirtual ~idata_proxy() {}\n\n\t/// Returns true iff the underlying data source is writable\n\tvirtual bool writable() = 0;\n\t/// Called to return the underlying data value\n\tvirtual const k3d::point3 value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const k3d::point3& Value) = 0;\n\t/// Signal emitted if the underlying data changes\n\ttypedef sigc::signal<void, k3d::ihint*> changed_signal_t;\n\t/// Signal emitted if the underlying data changes\n\tvirtual changed_signal_t& changed_signal() = 0;\n\n\t/// Stores an optional state recorder for recording undo/redo data\n\tk3d::istate_recorder* const state_recorder;\n\t/// Stores an optional message for labelling undo/redo state changes\n\tconst Glib::ustring change_message;\n\nprotected:\n\tidata_proxy(k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tstate_recorder(StateRecorder),\n\t\tchange_message(ChangeMessage)\n\t{\n\t}\n\nprivate:\n\tidata_proxy(const idata_proxy& RHS);\n\tidata_proxy& operator=(const idata_proxy& RHS);\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for modifying the point of an object\nclass control :\n\tpublic Gtk::Table\n{\n\ttypedef Gtk::Table base;\n\npublic:\n\tcontrol(std::unique_ptr<idata_proxy> Data);\n\nprivate:\n\t/// Called to reset the object point to the origin\n\tvoid on_reset();\n\n\t/// Stores a reference to the underlying data object\n\tstd::unique_ptr<idata_proxy> m_data;\n\t/// Stores the reset button\n\tGtk::Button* m_reset_button;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// proxy\n\n/// Convenience factory function for creating k3d::spin_button::idata_proxy objects, specialized for k3d::iproperty\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = Glib::ustring());\n\n} // namespace point\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_POINT3_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/property.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/entry.h>\n#include <k3dsdk/ngui/enumeration_chooser.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/node_window.h>\n#include <k3dsdk/ngui/property.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/ipersistent_collection.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/property_types.h>\n#include <k3dsdk/property_types_ri.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/tokens.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/user_property.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/buttonbox.h>\n#include <gtkmm/label.h>\n#include <gtkmm/stock.h>\n#include <gtkmm/table.h>\n\n#include <boost/format.hpp>\n#include <boost/mpl/for_each.hpp>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace property\n{\n\n///////////////////////////////////////////////////////////////////////////////\n// create_dialog\n\n/// Implements a dialog for adding custom user properties to a node\nclass create_dialog :\n\tpublic node_window,\n\tpublic k3d::property_collection // needed for enumeration properties\n{\n\ttypedef node_window base;\n\npublic:\n\tcreate_dialog(k3d::inode& Node) :\n\t\tbase(Node),\n\t\tm_property_type(init_owner(*this) + init_name(\"property_type\") + init_label(\"\") + init_description(\"\") + init_value(string_t(\"generic_property\")) + init_enumeration(property_type_values())),\n\t\tm_name(init_value(string_t(\"\"))),\n\t\tm_label(init_value(string_t(\"\"))),\n\t\tm_description(init_value(string_t(\"\"))),\n\n\t\tm_generic_type(init_owner(*this) + init_name(\"user_type\") + init_label(\"\") + init_description(\"\") + init_value(string_t(\"k3d::bool_t\")) + init_enumeration(generic_type_values())),\n\t\tm_renderman_type(init_owner(*this) + init_name(\"renderman_type\") + init_label(\"\") + init_description(\"\") + init_value(string_t(\"k3d::int32_t\")) + init_enumeration(renderman_type_values())),\n\t\tm_renderman_name(init_value(string_t(\"\"))),\n\n\t\tm_ignore_name_change(false),\n\t\tm_ignore_label_change(false),\n\t\tm_label_tracks_name(true),\n\n\t\tm_generic_type_label(0),\n\t\tm_renderman_type_label(0),\n\t\tm_renderman_name_label(0),\n\t\n\t\tm_generic_type_control(0),\n\t\tm_renderman_type_control(0),\n\t\tm_name_control(0),\n\t\tm_renderman_name_control(0)\n\t{\n\t\tset_title(_(\"Add User Property:\"));\n\t\tset_role(\"add_user_property\");\n\t\tset_position(Gtk::WIN_POS_CENTER);\n\n\t\tGtk::Table* const table = new Gtk::Table(6, 2, false);\n\t\ttable->set_col_spacings(4);\n\t\t\n\t\ttable->attach(*Gtk::manage(new Gtk::Label(_(\"Property Type\"))), 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK);\n\t\ttable->attach(*Gtk::manage(new enumeration_chooser::control(enumeration_chooser::model(m_property_type))), 1, 2, 0, 1);\n\n\t\tm_generic_type_label = new Gtk::Label(_(\"Data Type\"));\n\t\tm_generic_type_control = new enumeration_chooser::control(enumeration_chooser::model(m_generic_type));\n\t\ttable->attach(*Gtk::manage(m_generic_type_label), 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK);\n\t\ttable->attach(*Gtk::manage(m_generic_type_control), 1, 2, 1, 2);\n\t\n\t\tm_renderman_type_label = new Gtk::Label(_(\"Data Type\"));\n\t\tm_renderman_type_control = new enumeration_chooser::control(enumeration_chooser::model(m_renderman_type));\n\t\ttable->attach(*Gtk::manage(m_renderman_type_label), 0, 1, 2, 3, Gtk::SHRINK, Gtk::SHRINK);\n\t\ttable->attach(*Gtk::manage(m_renderman_type_control), 1, 2, 2, 3);\n\n\t\tm_renderman_name_label = new Gtk::Label(_(\"Attribute Name\"));\n\t\tm_renderman_name_control = new entry::control(entry::model(m_renderman_name), 0);\n\t\ttable->attach(*Gtk::manage(m_renderman_name_label), 0, 1, 4, 5, Gtk::SHRINK, Gtk::SHRINK);\n\t\ttable->attach(*Gtk::manage(m_renderman_name_control), 1, 2, 4, 5);\n\n\t\tm_name_control = new entry::control(entry::model(m_name), 0)\n\t\t\t<< connect_signal_changed(sigc::mem_fun(*this, &create_dialog::on_name_changed));\n\n\t\ttable->attach(*Gtk::manage(new Gtk::Label(_(\"Name\"))), 0, 1, 5, 6, Gtk::SHRINK, Gtk::SHRINK);\n\t\ttable->attach(*Gtk::manage(m_name_control), 1, 2, 5, 6);\n\n\t\ttable->attach(*Gtk::manage(new Gtk::Label(_(\"Label\"))), 0, 1, 6, 7, Gtk::SHRINK, Gtk::SHRINK);\n\t\ttable->attach(*Gtk::manage(new entry::control(entry::model(m_label), 0)\n\t\t\t<< connect_signal_changed(sigc::mem_fun(*this, &create_dialog::on_label_changed))), 1, 2, 6, 7);\n\n\t\ttable->attach(*Gtk::manage(new Gtk::Label(_(\"Description\"))), 0, 1, 7, 8, Gtk::SHRINK, Gtk::SHRINK);\n\t\ttable->attach(*Gtk::manage(new entry::control(entry::model(m_description), 0)), 1, 2, 7, 8);\n\n\t\tGtk::HButtonBox* const button_box = new Gtk::HButtonBox(Gtk::BUTTONBOX_END);\n\t\tbutton_box->pack_start(*Gtk::manage(button::create(_(\"Cancel\"), Gtk::Stock::CANCEL)\n\t\t\t<< connect_button(sigc::mem_fun(*this, &create_dialog::close))));\n\t\tbutton_box->pack_start(*Gtk::manage(button::create(_(\"Add\"), Gtk::Stock::ADD)\n\t\t\t<< connect_button(sigc::mem_fun(*this, &create_dialog::on_add))));\n\n\t\tGtk::VBox* const vbox = Gtk::manage(new Gtk::VBox(false, 10));\n\t\tvbox->set_border_width(10);\n\t\tvbox->pack_start(*Gtk::manage(new Gtk::Label(k3d::string_cast(boost::format(_(\"Add a user property to %1%:\")) % node().name()))), Gtk::PACK_SHRINK);\n\t\tvbox->pack_start(*Gtk::manage(table), Gtk::PACK_SHRINK);\n\t\tvbox->pack_start(*Gtk::manage(button_box), Gtk::PACK_SHRINK);\n\n\t\tadd(*vbox);\n\n\t\tshow_all();\n\n\t\tm_property_type.changed_signal().connect(sigc::hide(sigc::mem_fun(*this, &create_dialog::on_property_type_changed)));\n\t\ton_property_type_changed();\n\t}\n\nprivate:\n\tvoid on_property_type_changed()\n\t{\n\t\tconst string_t property_type = m_property_type.internal_value();\n\n\t\tm_generic_type_label->property_visible().set_value(property_type == \"generic_property\");\n\t\tm_generic_type_control->property_visible().set_value(property_type == \"generic_property\");\n\n\t\tm_renderman_type_label->property_visible().set_value(property_type == \"renderman_attribute\" || property_type == \"renderman_option\");\n\t\tm_renderman_type_control->property_visible().set_value(property_type == \"renderman_attribute\" || property_type == \"renderman_option\");\n\n\t\tm_renderman_name_label->set_label(property_type == \"renderman_attribute\" ? _(\"Attribute Name\") : _(\"Option Name\"));\n\t\tm_renderman_name_label->property_visible().set_value(property_type == \"renderman_attribute\" || property_type == \"renderman_option\");\n\t\tm_renderman_name_control->property_visible().set_value(property_type == \"renderman_attribute\" || property_type == \"renderman_option\");\n\t}\n\n\n\tvoid on_name_changed()\n\t{\n\t\tif(m_ignore_name_change)\n\t\t\treturn;\n\n\t\tm_ignore_name_change = true;\n\n\t\tstring_t name_text = m_name_control->get_text();\n\t\tstd::replace(name_text.begin(), name_text.end(), ' ', '_');\n\t\tm_name.set_value(name_text);\n\n\t\tm_ignore_name_change = false;\n\n\t\tif(m_label_tracks_name)\n\t\t{\n\t\t\tm_ignore_label_change = true;\n\n\t\t\tstring_t label_text = name_text;\n\n\t\t\tbool capitalize = true;\n\t\t\tfor(k3d::uint_t i = 0; i != label_text.size(); ++i)\n\t\t\t{\n\t\t\t\tif(capitalize)\n\t\t\t\t{\n\t\t\t\t\tlabel_text[i] = std::toupper(label_text[i]);\n\t\t\t\t\tcapitalize = false;\n\t\t\t\t}\n\n\t\t\t\tif(label_text[i] == '_')\n\t\t\t\t{\n\t\t\t\t\tlabel_text[i] = ' ';\n\t\t\t\t\tcapitalize = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tm_label.set_value(label_text);\n\n\t\t\tm_ignore_label_change = false;\n\t\t}\n\t}\n\n\tvoid on_label_changed()\n\t{\n\t\tif(m_ignore_label_change)\n\t\t\treturn;\n\n\t\tm_label_tracks_name = false;\n\t}\n\n\tvoid on_add()\n\t{\n\t\tk3d::iproperty_collection* const property_collection = dynamic_cast<k3d::iproperty_collection*>(&node());\n\t\treturn_if_fail(property_collection);\n\n\t\tk3d::ipersistent_collection* const persistent_collection = dynamic_cast<k3d::ipersistent_collection*>(&node());\n\t\treturn_if_fail(persistent_collection);\n\n\t\tconst string_t property_type = m_property_type.internal_value();\n\n\t\tconst string_t name = m_name.internal_value();\n\t\tconst string_t label = m_label.internal_value();\n\t\tconst string_t description = m_description.internal_value();\n\n\t\tconst string_t generic_type = m_generic_type.internal_value();\n\n\t\tconst string_t renderman_type = m_renderman_type.internal_value();\n\t\tconst string_t renderman_name = m_renderman_name.internal_value();\n\n\t\tif(name.empty())\n\t\t{\n\t\t\terror_message(_(\"You must provide a Name to create a property.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tif(label.empty())\n\t\t{\n\t\t\terror_message(_(\"You must provide a Label to create a property.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tif(property_type == \"renderman_attribute\" && renderman_name.empty())\n\t\t{\n\t\t\terror_message(_(\"You must provide an Attribute Name to create a RenderMan Attribute.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tif(property_type == \"renderman_option\" && renderman_name.empty())\n\t\t{\n\t\t\terror_message(_(\"You must provide an Option Name to create a RenderMan Option.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::record_state_change_set change_set(node().document(), \"Add user property \" + name, K3D_CHANGE_SET_CONTEXT);\n\t\t\n\t\tif(node().document().state_recorder().current_change_set())\n\t\t\tnode().document().state_recorder().current_change_set()->record_old_state(new k3d::user::property_container(node()));\n\n\t\tiproperty* new_property = 0;\n\t\tif(property_type == \"generic_property\")\n\t\t\tnew_property = k3d::property::create(node(), generic_type, name, label, description);\n\t\telse if(property_type == \"renderman_attribute\")\n\t\t\tnew_property = k3d::property::ri::create_attribute(node(), renderman_type, renderman_name, name, label, description);\n\t\telse if(property_type == \"renderman_option\")\n\t\t\tnew_property = k3d::property::ri::create_option(node(), renderman_type, renderman_name, name, label, description);\n\n\t\tif(new_property)\n\t\t\tundoable_new(new_property, node().document());\n\n\t\tif(node().document().state_recorder().current_change_set())\n\t\t\tnode().document().state_recorder().current_change_set()->record_new_state(new k3d::user::property_container(node()));\n\n\t\tif(!new_property)\n\t\t{\n\t\t\terror_message(_(\"Internal error creating user property.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tclose();\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& property_type_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Generic Property\", \"generic_property\",\"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"RenderMan Attribute\", \"renderman_attribute\",\"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"RenderMan Option\", \"renderman_option\", \"\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& generic_type_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Boolean\", \"k3d::bool_t\",\"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Integer\", \"k3d::int32_t\",\"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Scalar\", \"k3d::double_t\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"String\", \"k3d::string_t\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"3D Point\", \"k3d::point3\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"3D Vector\", \"k3d::vector3\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"3D Normal\", \"k3d::normal3\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"4D Point\", \"k3d::point4\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"4x4 Matrix\", \"k3d::matrix4\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Color\", \"k3d::color\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Mesh\", \"k3d::mesh*\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"OpenGL Mesh Painter\", \"k3d::gl::imesh_painter*\", \"\")); \n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"RenderMan Mesh Painter\", \"k3d::ri::imesh_painter*\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Material\", \"k3d::imaterial*\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Filesystem Path\", \"k3d::filesystem::path\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Generic Node\", \"k3d::inode*\", \"\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& renderman_type_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Integer\", \"k3d::int32_t\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Real\", \"k3d::double_t\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"String\", \"k3d::string_t\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Point\", \"k3d::point3\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Vector\", \"k3d::vector3\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Normal\", \"k3d::normal3\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"HPoint\", \"k3d::point4\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Matrix\", \"k3d::matrix4\", \"\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Color\", \"k3d::color\" ,\"\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tk3d_data(string_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, enumeration_property, no_serialization) m_property_type;\n\n\tk3d_data(string_t, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_name;\n\tk3d_data(string_t, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_label;\n\tk3d_data(string_t, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_description;\n\n\tk3d_data(string_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, enumeration_property, no_serialization) m_generic_type;\n\n\tk3d_data(string_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, enumeration_property, no_serialization) m_renderman_type;\n\tk3d_data(string_t, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_renderman_name;\n\t\n\n\tk3d::bool_t m_ignore_name_change;\n\tk3d::bool_t m_ignore_label_change;\n\tk3d::bool_t m_label_tracks_name;\n\n\tGtk::Label* m_generic_type_label;\n\tGtk::Label* m_renderman_type_label;\n\tGtk::Label* m_renderman_name_label;\n\n\tenumeration_chooser::control* m_generic_type_control;\n\tenumeration_chooser::control* m_renderman_type_control;\n\tentry::control* m_name_control;\n\tentry::control* m_renderman_name_control;\n};\n\n////////////////////////////////////////////////////////////////////////////////////\n// create\n\nvoid create(inode& Node)\n{\n\tnew create_dialog(Node);\n}\n\n} // namespace property\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/property.h",
    "content": "#ifndef K3DSDK_NGUI_PROPERTY_H\n#define K3DSDK_NGUI_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nclass inode;\n\nnamespace ngui\n{\n\nnamespace property\n{\n\n/// Displays a dialog for adding new properties to a node\nvoid create(inode& Node);\n\n} // namespace property\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/property_button.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the property_button::control, which provides a MVC UI for connecting properties in the DAG\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <gtkmm/image.h>\n#include <gtkmm/menu.h>\n#include <gtkmm/targetlist.h>\n#include <gtk/gtkmain.h>\n\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/property_button.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/state_change_set.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace property_button\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<property_widget::idata_proxy> Data) :\n\tbase(std::move(Data)),\n\tm_image(new Gtk::Image())\n{\n\tset_name(\"k3d-property-button\");\n\tset_tooltip_text(_(\"LMB-Click to make connections with other properties. RMB-Click for context menu.\"));\n\n\tadd(*manage(m_image));\n\n\tdata_changed();\n\tm_data->document().document().pipeline().dependency_signal().connect(sigc::mem_fun(*this, &control::on_dependencies_changed));\n\n\tsignal_button_press_event().connect(sigc::mem_fun(*this, &base::button_press_event));\n\tsignal_button_release_event().connect(sigc::mem_fun(*this, &base::button_release_event));\n}\n\nvoid control::data_changed()\n{\n\tstatic const Glib::RefPtr<Gdk::Pixbuf> connected = load_icon(\"connected_plug\", Gtk::ICON_SIZE_BUTTON);\n\tstatic const Glib::RefPtr<Gdk::Pixbuf> disconnected = load_icon(\"plug_tool\", Gtk::ICON_SIZE_BUTTON);\n\n\tif(m_data->document().document().pipeline().dependency(m_data->property()))\n\t\tm_image->set(connected);\n\telse\n\t\tm_image->set(disconnected);\n}\n\nvoid control::on_dependencies_changed(const k3d::ipipeline::dependencies_t& Dependencies)\n{\n\tif(Dependencies.count(&m_data->property()))\n\t\tdata_changed();\n}\n\n} // namespace property_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/property_button.h",
    "content": "#ifndef K3DSDK_NGUI_PROPERTY_BUTTON_H\n#define K3DSDK_NGUI_PROPERTY_BUTTON_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares property_button, which provides a standard MVC UI for linking properties to channels\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/ngui/event_button.h>\n#include <k3dsdk/ngui/property_widget.h>\n\nnamespace Gtk { class Image; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace property_button\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for manipulating properties (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic event_button,\n\tpublic property_widget::control\n{\n\ttypedef property_widget::control base;\n\npublic:\n\tcontrol(std::unique_ptr<property_widget::idata_proxy> Data);\n\nprivate:\n\t/// Called whenever the state of the underlying data has changed\n\tvoid data_changed();\n\t/// Called by the signal system whenever property dependencies change\n\tvoid on_dependencies_changed(const k3d::ipipeline::dependencies_t& Dependencies);\n\n\t/// Displays an image indicating the state of the property (connected / unconnected)\n\tGtk::Image* const m_image;\n};\n\n} // namespace property_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_PROPERTY_BUTTON_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/property_label.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the property_label::control, which provides a MVC UI for connecting properties in the DAG\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/image.h>\n#include <gtkmm/label.h>\n#include <gtkmm/menu.h>\n#include <gtkmm/targetlist.h>\n#include <gtk/gtkmain.h>\n\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/property_label.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/state_change_set.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace property_label\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<property_widget::idata_proxy> Data) :\n\tbase(std::move(Data))\n{\n\tset_name(\"k3d-property-label\");\n\n\tconst std::string label = m_data->property().property_label().empty() ? m_data->property().property_name() : m_data->property().property_label();\n\tconst std::string description = m_data->property().property_description();\n\n\tGtk::Label* gtk_label = new Gtk::Label(\" \" + label + \" \");\n\tgtk_label->set_alignment(Gtk::ALIGN_LEFT);\n\tadd(*Gtk::manage(gtk_label));\n\n\tif(!description.empty())\n\t\tset_tooltip_text(description);\n\n\tdata_changed();\n\tm_data->document().document().pipeline().dependency_signal().connect(sigc::mem_fun(*this, &control::on_dependencies_changed));\n\n\tsignal_button_press_event().connect(sigc::mem_fun(*this, &control::button_press_event));\n\tsignal_button_release_event().connect(sigc::mem_fun(*this, &control::button_release_event));\n}\n\nvoid control::data_changed()\n{\n}\n\nvoid control::on_dependencies_changed(const k3d::ipipeline::dependencies_t& Dependencies)\n{\n\tif(Dependencies.count(&m_data->property()))\n\t\tdata_changed();\n}\n\n} // namespace property_label\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/property_label.h",
    "content": "#ifndef K3DSDK_NGUI_PROPERTY_LABEL_H\n#define K3DSDK_NGUI_PROPERTY_LABEL_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares property_label, which provides a standard MVC UI for linking properties to channels\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/ngui/property_widget.h>\n\n#include <gtkmm/eventbox.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace property_label\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for manipulating properties (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::EventBox,\n\tpublic property_widget::control\n{\n\ttypedef property_widget::control base;\n\npublic:\n\tcontrol(std::unique_ptr<property_widget::idata_proxy> Data);\n\nprivate:\n\t/// Called whenever the state of the underlying data has changed\n\tvoid data_changed();\n\t/// Called by the signal system whenever property dependencies change\n\tvoid on_dependencies_changed(const k3d::ipipeline::dependencies_t& Dependencies);\n};\n\n} // namespace property_label\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_PROPERTY_LABEL_H\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/property_widget.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the property_widget::control, which provides a MVC UI for connecting properties in the DAG\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <gtkmm/image.h>\n#include <gtkmm/menu.h>\n#include <gtkmm/menuitem.h>\n#include <gtkmm/targetlist.h>\n#include <gtk/gtkmain.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/ngui/property_widget.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/widget_manip.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/state_change_set.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace property_widget\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(std::unique_ptr<idata_proxy> Data) :\n\tm_data(std::move(Data)),\n\tm_show_connected(0),\n\tm_disconnect(0)\n{\n\tassert_warning(m_data.get());\n}\n\ncontrol::~control()\n{\n}\n\nbool control::button_press_event(GdkEventButton* Event)\n{\n\t// Open context menu with left or right mouse\n\tif(Event->button != 1 && Event->button != 3)\n\t\treturn false;\n\n\tshow_menu(true);\n\n\treturn true;\n}\n\nvoid control::show_menu(const bool UserAction)\n{\n\t// Reset menu\n\tm_disconnect = 0;\n\tm_menu_items.clear();\n\tm_show_connected = 0;\n\tm_menu.reset(new Gtk::Menu());\n\n\t// If the property's connected ...\n\tk3d::iproperty* const dependency = m_data->document().document().pipeline().dependency(m_data->property());\n\tif(dependency)\n\t{\n\t\tk3d::inode* const node = k3d::find_node(m_data->document().document().nodes(), *dependency);\n\n\t\tm_show_connected = new Gtk::MenuItem(_(\"Show Connected\"));\n\t\tm_show_connected << connect_menu_item(sigc::bind(sigc::mem_fun(*this, &control::on_show_connected), node));\n\t\tm_menu->items().push_back(*Gtk::manage(m_show_connected));\n\n\t\tm_disconnect = new Gtk::MenuItem(_(\"Disconnect\"));\n\t\tm_disconnect << connect_menu_item(sigc::bind(sigc::mem_fun(*this, &control::on_disconnect), node));\n\t\tm_menu->items().push_back(*Gtk::manage(m_disconnect));\n\t}\n\n\t// Get the list of compatible properties\n\tGtk::Menu* const connect_submenu = new Gtk::Menu();\n\tm_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_(\"Connect to ...\"), *manage(connect_submenu)));\n\n\ttypedef std::map<std::string, Gtk::Menu*> node_menu_items_t;\n\tnode_menu_items_t items_map;\n\n\tfor(k3d::inode_collection::nodes_t::const_iterator node = m_data->document().document().nodes().collection().begin(); node != m_data->document().document().nodes().collection().end(); ++node)\n\t{\n\t\tk3d::iproperty_collection* const property_collection = dynamic_cast<k3d::iproperty_collection*>(*node);\n\t\tif(!property_collection)\n\t\t\tcontinue;\n\n\t\ttypedef std::map<std::string, k3d::iproperty*> properties_t;\n\t\tproperties_t properties_map;\n\n\t\tk3d::iproperty_collection::properties_t all_properties = property_collection->properties();\n\t\tfor(k3d::iproperty_collection::properties_t::iterator p = all_properties.begin(); p != all_properties.end(); ++p)\n\t\t{\n\t\t\tif(m_data->property().property_type() != (*p)->property_type())\n\t\t\t\tcontinue;\n\n\t\t\tconst std::string label = (*p)->property_label();\n\t\t\tproperties_map.insert(std::make_pair(label, *p));\n\t\t}\n\n\t\tif(!properties_map.size())\n\t\t\tcontinue;\n\n\t\t// Add compatible properties for this node to the 'connect' submenu\n\t\tGtk::Menu* const node_submenu = new Gtk::Menu();\n\t\titems_map.insert(std::make_pair((*node)->name(), node_submenu));\n\n\t\tfor(properties_t::const_iterator property = properties_map.begin(); property != properties_map.end(); ++property)\n\t\t{\n\t\t\tGtk::MenuItem* const menu_item = new Gtk::MenuItem(property->first);\n\t\t\tmenu_item << connect_menu_item(sigc::bind(sigc::mem_fun(*this, &control::on_connect_to), property->second));\n\t\t\tm_menu_items.insert(std::make_pair(property->second, menu_item));\n\n\t\t\tnode_submenu->items().push_back(*Gtk::manage(menu_item));\n\t\t}\n\t}\n\n\t// Sort nodes by name\n\tfor(node_menu_items_t::const_iterator item = items_map.begin(); item != items_map.end(); ++item)\n\t{\n\t\tconnect_submenu->items().push_back(Gtk::Menu_Helpers::MenuElem(item->first, *manage(item->second)));\n\t}\n\t\n\tm_menu->show_all();\n\n\tif(UserAction)\n\t\tm_menu->popup(1, gtk_get_current_event_time());\n\telse\n\t\tm_menu->popup(0, GDK_CURRENT_TIME);\n}\n\nbool control::button_release_event(GdkEventButton* Event)\n{\n\tif(Event->button != 1)\n\t\treturn false;\n\n\treturn true;\n}\n\nvoid control::on_show_connected(k3d::inode* Node)\n{\n\tshow_connected(Node);\n}\n\nvoid control::show_connected(k3d::inode* Node)\n{\n\treturn_if_fail(Node);\n\tpanel::mediator(m_data->document().document()).set_focus(*Node);\n}\n\nvoid control::on_connect_to(k3d::iproperty* Property)\n{\n\tk3d::record_state_change_set changeset(m_data->document().document(), _(\"Connect Properties\"), K3D_CHANGE_SET_CONTEXT);\n\tconnect_to(Property);\n}\n\nvoid control::connect_to(k3d::iproperty* Property)\n{\n\treturn_if_fail(Property);\n\n\t// If the property's already connected, disconnect it first\n\tif(m_data->document().document().pipeline().dependency(m_data->property()))\n\t{\n\t\tk3d::ipipeline::dependencies_t dependencies;\n\t\tdependencies.insert(std::make_pair(&m_data->property(), static_cast<k3d::iproperty*>(0)));\n\t\tm_data->document().document().pipeline().set_dependencies(dependencies);\n\t}\n\n\t// Make connection\n\tk3d::ipipeline::dependencies_t dependencies;\n\tdependencies.insert(std::make_pair(&m_data->property(), Property));\n\tm_data->document().document().pipeline().set_dependencies(dependencies);\n}\n\nvoid control::on_disconnect(k3d::inode* Node)\n{\n\tk3d::record_state_change_set changeset(m_data->document().document(), m_data->change_message + \" Disconnect\", K3D_CHANGE_SET_CONTEXT);\n\tdisconnect(Node);\n}\n\nvoid control::disconnect(k3d::inode* Node)\n{\n\treturn_if_fail(Node);\n\n\tk3d::ipipeline::dependencies_t dependencies;\n\tdependencies.insert(std::make_pair(&m_data->property(), static_cast<k3d::iproperty*>(0)));\n\tm_data->document().document().pipeline().set_dependencies(dependencies);\n}\n\n} // namespace property_widget\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/property_widget.h",
    "content": "#ifndef K3DSDK_NGUI_PROPERTY_WIDGET_H\n#define K3DSDK_NGUI_PROPERTY_WIDGET_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares property_widget, which provides a standard MVC UI for linking properties to channels\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/ipipeline.h>\n\nnamespace Gtk { class Menu; }\nnamespace Gtk { class MenuItem; }\nnamespace k3d { class inode; }\nnamespace k3d { class iproperty; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\nnamespace property_widget\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// idata_proxy\n\n/// Abstract interface for an object that proxies a data source for a property_widget (i.e. the \"model\" in model-view-controller)\nclass idata_proxy\n{\npublic:\n\tvirtual ~idata_proxy() {}\n\n\t/// Called to return the document containing the underlying data property\n\tvirtual document_state& document() = 0;\n\t/// Called to return the underlying data property\n\tvirtual k3d::iproperty& property() = 0;\n\n\t/// Stores an optional state recorder for recording undo/redo data\n\tk3d::istate_recorder* const state_recorder;\n\t/// Stores an optional message for labelling undo/redo state changes\n\tconst Glib::ustring change_message;\n\nprotected:\n\tidata_proxy(k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tstate_recorder(StateRecorder),\n\t\tchange_message(ChangeMessage)\n\t{\n\t}\n\nprivate:\n\tidata_proxy(const idata_proxy& RHS);\n\tidata_proxy& operator=(const idata_proxy& RHS);\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for manipulating properties (i.e. the view and the controller from model-view-controller)\nclass control\n{\npublic:\n\tcontrol(std::unique_ptr<idata_proxy> Data);\n\tvirtual ~control();\n\n\tbool button_press_event(GdkEventButton* Event);\n\tbool button_release_event(GdkEventButton* Event);\n\nprotected:\n\tvoid show_menu(const bool UserAction);\n\t\n\tvoid on_show_connected(k3d::inode* Object);\n\tvoid show_connected(k3d::inode* Object);\n\n\tvoid on_connect_to(k3d::iproperty* Property);\n\tvoid connect_to(k3d::iproperty* Property);\n\n\tvoid on_disconnect(k3d::inode* Object);\n\tvoid disconnect(k3d::inode* Object);\n\n\t/// Stores a reference to the underlying data object\n\tstd::unique_ptr<idata_proxy> m_data;\n\t/// Context menu displayed when the user clicks on the widget\n\tstd::unique_ptr<Gtk::Menu> m_menu;\n\t/// Caches the \"show connected\" widget for tutorial playback\n\tGtk::MenuItem* m_show_connected;\n\t/// Maps properties to widgets for tutorial playback\n\tstd::map<k3d::iproperty*, Gtk::MenuItem*> m_menu_items;\n\t/// Caches the \"disconnect\" widget for tutorial playback\n\tGtk::MenuItem* m_disconnect;\n};\n\n/// Provides an implementation of property_widget::idata_proxy that supports any data source that supports the property() concept\ntemplate<typename data_t>\nclass data_proxy :\n\tpublic idata_proxy\n{\npublic:\n\tdata_proxy(document_state& DocumentState, data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_document_state(DocumentState),\n\t\tm_data(Data)\n\t{\n\t}\n\n\tdocument_state& document()\n\t{\n\t\treturn m_document_state;\n\t}\n\n\tk3d::iproperty& property()\n\t{\n\t\treturn m_data.property();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdocument_state& m_document_state;\n\tdata_t& m_data;\n};\n\n/// Specialization of property_widget::data_proxy for use directly with iproperty objects\ntemplate<>\nclass data_proxy<k3d::iproperty> :\n\tpublic idata_proxy\n{\npublic:\n\ttypedef k3d::iproperty data_t;\n\n\tdata_proxy(document_state& DocumentState, data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_document_state(DocumentState),\n\t\tm_data(Data)\n\t{\n\t}\n\n\tdocument_state& document()\n\t{\n\t\treturn m_document_state;\n\t}\n\n\tk3d::iproperty& property()\n\t{\n\t\treturn m_data;\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdocument_state& m_document_state;\n\tdata_t& m_data;\n};\n\n/// Convenience factory function for creating property_widget::idata_proxy objects\ntemplate<typename data_t>\nstd::unique_ptr<idata_proxy> proxy(document_state& DocumentState, data_t& Data, k3d::istate_recorder* const StateRecorder = 0, const Glib::ustring& ChangeMessage = \"\")\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<data_t>(DocumentState, Data, StateRecorder, ChangeMessage));\n}\n\n} // namespace property_widget\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_PROPERTY_WIDGET_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/render.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/file_range.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/irender_animation.h>\n#include <k3dsdk/irender_camera_animation.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/irender_camera_preview.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/irender_frame.h>\n#include <k3dsdk/irender_preview.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/menus.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/ngui/pipeline.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/time_source.h>\n\n#include <gtkmm/cellrenderertext.h>\n#include <gtkmm/combobox.h>\n#include <gtkmm/dialog.h>\n#include <gtkmm/entry.h>\n#include <gtkmm/label.h>\n#include <gtkmm/liststore.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/stock.h>\n\n#include <boost/format.hpp>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\nclass camera_columns :\n\tpublic Gtk::TreeModelColumnRecord\n{\npublic:\n\tcamera_columns()\n\t{\n\t\tadd(node);\n\t\tadd(factory);\n\t\tadd(label);\n\t\tadd(icon);\n\t\tadd(separator);\n\t}\n\n\tGtk::TreeModelColumn<k3d::inode*> node;\n\tGtk::TreeModelColumn<k3d::iplugin_factory*> factory;\n\tGtk::TreeModelColumn<Glib::ustring> label;\n\tGtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon;\n\tGtk::TreeModelColumn<bool> separator;\n};\n\nclass camera_separators :\n\tpublic sigc::trackable\n{\npublic:\n\tcamera_separators(camera_columns& Columns) :\n\t\tcolumns(Columns)\n\t{\n\t}\n\n\tbool is_separator(const Glib::RefPtr<Gtk::TreeModel>& Model, const Gtk::TreeModel::iterator& Row)\n\t{\n\t\treturn (*Row)[columns.separator];\n\t}\n\nprivate:\n\tcamera_columns& columns;\n};\n\n/// Prompt the user to choose an existing camera from within a document, or create a new one\nk3d::icamera* pick_camera(document_state& DocumentState, const std::vector<k3d::icamera*>& Cameras, const k3d::plugin::factory::collection_t& Factories, const k3d::icamera* CurrentCamera, const k3d::string_t& Title, const k3d::string_t& Message)\n{\n\tcamera_columns columns;\n\tGlib::RefPtr<Gtk::ListStore> model = Gtk::ListStore::create(columns);\n\n\tint index = 0;\n\tint active_row = 0;\n\tfor(std::vector<k3d::icamera*>::const_iterator camera = Cameras.begin(); camera != Cameras.end(); ++camera)\n\t{\n\t\tk3d::inode* const node = dynamic_cast<k3d::inode*>(*camera);\n\n\t\tGtk::TreeRow row = *model->append();\n\t\trow[columns.node] = node;\n\t\trow[columns.factory] = 0;\n\t\trow[columns.label] = node->name();\n\t\trow[columns.icon] = quiet_load_icon(node->factory().name(), Gtk::ICON_SIZE_MENU);\n\t\trow[columns.separator] = false;\n\n\t\tif(CurrentCamera == (*camera))\n\t\t\tactive_row = index;\n\n\t\t++index;\n\t}\n\n\tif(Cameras.size() && Factories.size())\n\t{\n\t\tGtk::TreeRow row = *model->append();\n\t\trow[columns.node] = 0;\n\t\trow[columns.factory] = 0;\n\t\trow[columns.separator] = true;\n\t}\n\n\tfor(k3d::plugin::factory::collection_t::const_iterator factory = Factories.begin(); factory != Factories.end(); ++factory)\n\t{\n\t\tk3d::string_t markup;\n\t\tif(k3d::iplugin_factory::EXPERIMENTAL == (*factory)->quality())\n\t\t{\n\t\t\tmarkup = k3d::string_cast(boost::format(_(\"<span color=\\\"blue\\\">Create %1% (Experimental)</span>\")) % (*factory)->name());\n\t\t}\n\t\telse if(k3d::iplugin_factory::DEPRECATED == (*factory)->quality())\n\t\t{\n\t\t\tmarkup = k3d::string_cast(boost::format(_(\"<span color=\\\"red\\\" strikethrough=\\\"true\\\">Create %1%</span><span color=\\\"red\\\"> (Deprecated)</span>\")) % (*factory)->name());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmarkup = k3d::string_cast(boost::format(_(\"Create %1%\")) % (*factory)->name());\n\t\t}\n\n\t\tGtk::TreeRow row = *model->append();\n\t\trow[columns.node] = 0;\n\t\trow[columns.factory] = *factory;\n\t\trow[columns.label] = markup;\n\t\trow[columns.icon] = quiet_load_icon((*factory)->name(), Gtk::ICON_SIZE_MENU);\n\t\trow[columns.separator] = false;\n\t}\n\n\tGtk::ComboBox combo(Glib::RefPtr<Gtk::TreeModel>::cast_dynamic(model));\n\n\tcombo.pack_start(columns.icon, false);\n\n\tGtk::CellRendererText* const label_renderer = new Gtk::CellRendererText();\n\tcombo.pack_start(*manage(label_renderer));\n\tcombo.add_attribute(label_renderer->property_markup(), columns.label);\n\n\tcamera_separators separators(columns);\n\tcombo.set_row_separator_func(sigc::mem_fun(separators, &camera_separators::is_separator));\n\n\tcombo.set_active(active_row);\n\n\tGtk::Dialog dialog(Title, true);\n\tdialog.set_border_width(5);\n\tdialog.get_vbox()->pack_start(*Gtk::manage(new Gtk::Label(Message)), Gtk::PACK_SHRINK, 5);\n\tdialog.get_vbox()->pack_start(combo, Gtk::PACK_SHRINK, 5);\n\tdialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);\n\tdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);\n\n\tdialog.set_position(Gtk::WIN_POS_CENTER);\n\tdialog.show_all();\n\n\tif(Gtk::RESPONSE_OK == dialog.run())\n\t{\n\t\treturn_val_if_fail(combo.get_active() != model->children().end(), 0);\n\n\t\tif(k3d::inode* const node = combo.get_active()->get_value(columns.node))\n\t\t\treturn dynamic_cast<k3d::icamera*>(node);\n\n\t\tif(k3d::iplugin_factory* const factory = combo.get_active()->get_value(columns.factory))\n\t\t\treturn dynamic_cast<k3d::icamera*>(pipeline::create_node(DocumentState.document(), *factory));\n\t}\n\n\treturn 0;\n}\n\nclass render_engine_columns :\n\tpublic Gtk::TreeModelColumnRecord\n{\npublic:\n\trender_engine_columns()\n\t{\n\t\tadd(object);\n\t\tadd(factory);\n\t\tadd(label);\n\t\tadd(icon);\n\t\tadd(separator);\n\t}\n\n\tGtk::TreeModelColumn<k3d::inode*> object;\n\tGtk::TreeModelColumn<k3d::iplugin_factory*> factory;\n\tGtk::TreeModelColumn<Glib::ustring> label;\n\tGtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon;\n\tGtk::TreeModelColumn<bool> separator;\n};\n\nclass render_engine_separators :\n\tpublic sigc::trackable\n{\npublic:\n\trender_engine_separators(render_engine_columns& Columns) :\n\t\tcolumns(Columns)\n\t{\n\t}\n\n\tbool is_separator(const Glib::RefPtr<Gtk::TreeModel>& Model, const Gtk::TreeModel::iterator& Row)\n\t{\n\t\treturn (*Row)[columns.separator];\n\t}\n\nprivate:\n\trender_engine_columns& columns;\n};\n\n/// Prompt the user to choose an existing render engine from within a document, or create a new one\ntemplate<typename interface_t>\ninterface_t* pick_render_engine(document_state& DocumentState, const std::vector<interface_t*>& RenderEngines, const k3d::plugin::factory::collection_t& Factories, const k3d::string_t& Title, const k3d::string_t& Message)\n{\n\trender_engine_columns columns;\n\tGlib::RefPtr<Gtk::ListStore> model = Gtk::ListStore::create(columns);\n\n\tfor(typename std::vector<interface_t*>::const_iterator object = RenderEngines.begin(); object != RenderEngines.end(); ++object)\n\t{\n\t\tk3d::inode* const node = dynamic_cast<k3d::inode*>(*object);\n\n\t\tGtk::TreeRow row = *model->append();\n\t\trow[columns.object] = node;\n\t\trow[columns.factory] = 0;\n\t\trow[columns.label] = node->name();\n\t\trow[columns.icon] = quiet_load_icon(node->factory().name(), Gtk::ICON_SIZE_MENU);\n\t\trow[columns.separator] = false;\n\t}\n\n\tif(RenderEngines.size() && Factories.size())\n\t{\n\t\tGtk::TreeRow row = *model->append();\n\t\trow[columns.object] = 0;\n\t\trow[columns.factory] = 0;\n\t\trow[columns.separator] = true;\n\t}\n\n\tfor(k3d::plugin::factory::collection_t::const_iterator factory = Factories.begin(); factory != Factories.end(); ++factory)\n\t{\n\t\tk3d::string_t markup;\n\t\tif(k3d::iplugin_factory::EXPERIMENTAL == (*factory)->quality())\n\t\t{\n\t\t\tmarkup = k3d::string_cast(boost::format(_(\"<span color=\\\"blue\\\">Create %1% (Experimental)</span>\")) % (*factory)->name());\n\t\t}\n\t\telse if(k3d::iplugin_factory::DEPRECATED == (*factory)->quality())\n\t\t{\n\t\t\tmarkup = k3d::string_cast(boost::format(_(\"<span color=\\\"red\\\" strikethrough=\\\"true\\\">Create %1%</span><span color=\\\"red\\\"> (Deprecated)</span>\")) % (*factory)->name());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmarkup = k3d::string_cast(boost::format(_(\"Create %1%\")) % (*factory)->name());\n\t\t}\n\n\t\tGtk::TreeRow row = *model->append();\n\t\trow[columns.object] = 0;\n\t\trow[columns.factory] = *factory;\n\t\trow[columns.label] = markup;\n\t\trow[columns.icon] = quiet_load_icon((*factory)->name(), Gtk::ICON_SIZE_MENU);\n\t\trow[columns.separator] = false;\n\t}\n\n\tGtk::ComboBox combo(Glib::RefPtr<Gtk::TreeModel>::cast_dynamic(model));\n\n\tcombo.pack_start(columns.icon, false);\n\n\tGtk::CellRendererText* const label_renderer = new Gtk::CellRendererText();\n\tcombo.pack_start(*manage(label_renderer));\n\tcombo.add_attribute(label_renderer->property_markup(), columns.label);\n\n\trender_engine_separators separators(columns);\n\tcombo.set_row_separator_func(sigc::mem_fun(separators, &render_engine_separators::is_separator));\n\n\tcombo.set_active(0);\n\n\tGtk::Dialog dialog(Title, true);\n\tdialog.set_border_width(5);\n\tdialog.get_vbox()->pack_start(*Gtk::manage(new Gtk::Label(Message)), Gtk::PACK_SHRINK, 5);\n\tdialog.get_vbox()->pack_start(combo, Gtk::PACK_SHRINK, 5);\n\tdialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK)->grab_focus();\n\tdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);\n\n\tdialog.set_position(Gtk::WIN_POS_CENTER);\n\tdialog.show_all();\n\n\tif(Gtk::RESPONSE_OK == dialog.run())\n\t{\n\n\t\treturn_val_if_fail(combo.get_active() != model->children().end(), 0);\n\n\t\tif(k3d::inode* const object = combo.get_active()->get_value(columns.object))\n\t\t\treturn dynamic_cast<interface_t*>(object);\n\n\t\tif(k3d::iplugin_factory* const factory = combo.get_active()->get_value(columns.factory))\n\t\t{\n\t\t\tk3d::inode* const node = k3d::plugin::create<k3d::inode>(*factory, DocumentState.document(), k3d::unique_name(DocumentState.document().nodes(), factory->name()));\n\t\t\tif(node)\n\t\t\t\tpanel::mediator(DocumentState.document()).set_focus(*node);\n\t\t\treturn dynamic_cast<interface_t*>(node);\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/// Performs sanity checks to see if a RenderMan render engine is installed and usable\nvoid test_renderman_render_engine(k3d::iunknown& Engine)\n{\n\tk3d::inode* const node = dynamic_cast<k3d::inode*>(&Engine);\n\tif(!node)\n\t\treturn;\n\n\tif(node->factory().factory_id() != k3d::classes::RenderManEngine())\n\t\treturn;\n\n\ttry\n\t{\n\t\tk3d::ri::irender_engine* const render_engine = dynamic_cast<k3d::ri::irender_engine*>(boost::any_cast<k3d::inode*>(k3d::property::pipeline_value(Engine, \"render_engine\")));\n\t\tif(!render_engine)\n\t\t{\n\t\t\terror_message(\n\t\t\t\t_(\"Choose RenderMan Implementation\"),\n\t\t\t\t_(\"You must choose the specific RenderMan implementation to use with this render engine.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tif(!render_engine->installed())\n\t\t{\n\t\t\terror_message(\n\t\t\t\t_(\"RenderMan Implementation Unavailable\"),\n\t\t\t\t_(\"The requested RenderMan implementation could not be found.  Check to ensure that you have it installed and your PATH is up-to-date.\"));\n\t\t\treturn;\n\t\t}\n\t}\n\tcatch(...)\n\t{\n\t\tk3d::log() << error << \"uncaught exception\" << std::endl;\n\t}\n}\n\n/// Performs sanity checks to see if Yafray is installed and usable\nvoid test_yafray_render_engine(k3d::iunknown& Engine)\n{\n\tstatic bool test_performed = false;\n\tif(test_performed)\n\t\treturn;\n\n\tk3d::inode* const node = dynamic_cast<k3d::inode*>(&Engine);\n\tif(!node)\n\t\treturn;\n\n\tif(node->factory().factory_id() != k3d::uuid(0xef38bf93, 0x66654f9f, 0x992ca91b, 0x62bae139))\n\t\treturn;\n\n\ttest_performed = true;\n\n\tif(k3d::system::find_executable(\"yafray\").empty())\n\t{\n\t\terror_message(\n\t\t\t_(\"Could not locate the yafray executable.\"),\n\t\t\t_(\"Check to ensure that you have Yafray installed, and that the PATH environment variable points to the Yafray installation directory.\"));\n\t\treturn;\n\t}\n}\n\nclass animation_sample_columns :\n\tpublic Gtk::TreeModelColumnRecord\n{\npublic:\n\tanimation_sample_columns()\n\t{\n\t\tadd(file);\n\t}\n\n\tGtk::TreeModelColumn<Glib::ustring> file;\n};\n\n/// Prompt the user to choose a range of files for saving an animation\nclass animation_chooser_dialog :\n\tpublic Gtk::FileChooserDialog\n{\n\ttypedef Gtk::FileChooserDialog base;\n\npublic:\n\tanimation_chooser_dialog() :\n\t\tbase(_(\"Choose animation output files:\"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER),\n\t\tmodel(Gtk::ListStore::create(columns))\n\t{\n\t}\n\n\tbool get_files(k3d::file_range& Files)\n\t{\n\t\tfiles = &Files;\n\n\t\t// Create widgets that will be added to the dialog.  We do this on the stack\n\t\t// so the same buttons don't get added to the widget multiple times if get_files() is\n\t\t// called more-than-once.\n\n\t\tGtk::Label file_label(_(\"Choose the format for output files:\"));\n\t\tfile_label.set_alignment(0.0, 0.5);\n\n\t\tbefore.set_text(Files.before.raw());\n\t\tbefore.signal_changed().connect(sigc::mem_fun(*this, &animation_chooser_dialog::before_changed));\n\n\t\tGtk::Entry digits;\n\t\tdigits.set_editable(false);\n\t\tdigits.set_text(Glib::ustring(Files.digits, '0'));\n\t\tdigits.set_max_length(Files.digits);\n\n\t\tafter.set_text(Files.after.raw());\n\t\tafter.signal_changed().connect(sigc::mem_fun(*this, &animation_chooser_dialog::after_changed));\n\n\t\tGtk::HBox file(false, 0);\n\t\tfile.pack_start(before);\n\t\tfile.pack_start(digits);\n\t\tfile.pack_start(after);\n\n\t\tGtk::Label samples_label(_(\"Generated filenames:\"));\n\t\tsamples_label.set_alignment(0.0, 0.5);\n\n\t\tgenerate_samples();\n\n\t\tGtk::TreeView samples(model);\n\t\tsamples.set_headers_visible(false);\n\t\tsamples.set_reorderable(false);\n\t\tsamples.append_column(\"\", columns.file);\n\n\t\tGtk::ScrolledWindow samples_window;\n\t\tsamples_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\t\tsamples_window.add(samples);\n\n\t\tGtk::VBox extra_widget(false, 5);\n\t\textra_widget.pack_start(file_label);\n\t\textra_widget.pack_start(file);\n\t\textra_widget.pack_start(samples_label);\n\t\textra_widget.pack_start(samples_window, Gtk::PACK_EXPAND_WIDGET);\n\n\t\tset_extra_widget(extra_widget);\n\n\t\tGtk::Button cancel_widget(Gtk::Stock::CANCEL);\n\t\tcancel_widget.set_flags(cancel_widget.get_flags() | Gtk::CAN_DEFAULT);\n\t\tcancel_widget.show();\n\n\t\tGtk::Button save_widget(Gtk::Stock::SAVE);\n\t\tsave_widget.set_flags(save_widget.get_flags() | Gtk::CAN_DEFAULT);\n\t\tsave_widget.show();\n\n\t\t// Add the K-3D share path as a shortcut ...\n\t\tadd_shortcut_folder(k3d::share_path().native_utf8_string().raw());\n\n\t\tadd_action_widget(cancel_widget, Gtk::RESPONSE_CANCEL);\n\n\t\tadd_action_widget(save_widget, Gtk::RESPONSE_OK);\n\t\tset_default_response(Gtk::RESPONSE_OK);\n\n\t\t// Setup the initial path to display ...\n\t\tk3d::filesystem::path start_path = Files.directory;\n\t\tif(start_path.empty())\n\t\t\tstart_path = k3d::options::get_path(k3d::options::path::render_animation());\n\n\t\tif(start_path.empty())\n\t\t\tstart_path = k3d::system::get_home_directory();\n\n\t\tif(k3d::filesystem::exists(start_path) && k3d::filesystem::is_directory(start_path))\n\t\t\tset_current_folder(start_path.native_filesystem_string());\n\n\t\t// Run the dialog ...\n\t\tset_position(Gtk::WIN_POS_CENTER);\n\t\textra_widget.show_all();\n\t\tif(Gtk::RESPONSE_OK != run())\n\t\t\treturn false;\n\n\t\tFiles.directory = k3d::filesystem::native_path(k3d::ustring::from_utf8(Glib::filename_to_utf8(get_filename()).raw()));\n\n/*\n\t\t// Prompt the user if they're about to overwrite an existing file ...\n\t\tif(!prompt_file_overwrite(Result))\n\t\t\treturn false;\n*/\n\n\t\t// Record the path for posterity ...\n\t\tk3d::options::set_path(k3d::options::path::render_animation(), Files.directory);\n\n\t\treturn true;\n\t}\n\nprivate:\n\tvoid before_changed()\n\t{\n\t\tfiles->before = k3d::ustring::from_utf8(before.get_text());\n\t\tgenerate_samples();\n\t}\n\n\tvoid after_changed()\n\t{\n\t\tfiles->after = k3d::ustring::from_utf8(after.get_text());\n\t\tgenerate_samples();\n\t}\n\n\tvoid generate_samples()\n\t{\n\t\tmodel->clear();\n\n\t\tfor(size_t file = files->begin; file != files->end; ++file)\n\t\t{\n\t\t\tGtk::TreeRow row = *model->append();\n\t\t\trow[columns.file] = files->file(file).native_utf8_string().raw();\n\t\t}\n\t}\n\n\tk3d::file_range* files;\n\tGtk::Entry before;\n\tGtk::Entry after;\n\n\tanimation_sample_columns columns;\n\tconst Glib::RefPtr<Gtk::ListStore> model;\n};\n\nconst bool generate_frames(document_state& DocumentState, k3d::frames& Frames)\n{\n\t// Ensure that the document has animation capabilities, first ...\n\tk3d::iproperty* const start_time_property = k3d::get_start_time(DocumentState.document());\n\tk3d::iproperty* const end_time_property = k3d::get_end_time(DocumentState.document());\n\tk3d::iproperty* const frame_rate_property = k3d::get_frame_rate(DocumentState.document());\n\tif(!(start_time_property && end_time_property && frame_rate_property))\n\t{\n\t\terror_message(_(\"Document does not contain a TimeSource, cannot render animation.\"));\n\t\treturn false;\n\t}\n\n\t// Generate a uniform sampling of \"frames\" within time-range of the animation ...\n\tconst double start_time = boost::any_cast<double>(k3d::property::pipeline_value(*start_time_property));\n\tconst double end_time = boost::any_cast<double>(k3d::property::pipeline_value(*end_time_property));\n\tconst double frame_rate = boost::any_cast<double>(k3d::property::pipeline_value(*frame_rate_property));\n\n\tif(start_time > end_time)\n\t{\n\t\terror_message(_(\"Animation start time must be less-than end time.\"));\n\t\treturn false;\n\t}\n\n\tif(0 == frame_rate)\n\t{\n\t\terror_message(_(\"Cannot render animation with zero frame rate.\"));\n\t\treturn false;\n\t}\n\n\tconst double frame_delta = 1.0 / frame_rate;\n\n\tfor(k3d::uint_t frame = 0, next_frame = 1; start_time + (next_frame * frame_delta) < end_time; ++frame, ++next_frame)\n\t\tFrames.push_back(k3d::frame(start_time + (frame * frame_delta), start_time + (next_frame * frame_delta)));\n\n\treturn true;\n}\n\nconst bool assign_destinations(k3d::iunknown& Engine, k3d::frames& Frames)\n{\n\tk3d::file_range files;\n\tfiles.before = k3d::ustring::from_utf8(\"output\");\n\tfiles.begin = 0;\n\tfiles.end = Frames.size();\n\n\t// Try to infer the correct file extension behavior ...\n\tif(dynamic_cast<viewport::control*>(&Engine))\n\t{\n\t\tfiles.after = k3d::ustring::from_utf8(\".pnm\");\n\t}\n\telse if(k3d::inode* const node = dynamic_cast<k3d::inode*>(&Engine))\n\t{\n\t\tif(node->factory().factory_id() == k3d::classes::RenderManEngine())\n\t\t{\n\t\t\tfiles.after = k3d::ustring::from_utf8(\".tiff\");\n\t\t}\n\t\telse if(node->factory().factory_id() == k3d::uuid(0xef38bf93, 0x66654f9f, 0x992ca91b, 0x62bae139))\n\t\t{\n\t\t\tfiles.after = k3d::ustring::from_utf8(\".tga\");\n\t\t}\n\t}\n\n\t// Make sure the supplied filepath has enough digits to render the entire animation ...\n\twhile(files.max_file_count() < Frames.size())\n\t\tfiles.digits += 1;\n\n\t// Prompt the user for destination details ...\n\tdetail::animation_chooser_dialog dialog;\n\tif(!dialog.get_files(files))\n\t\treturn false;\n\n\tk3d::uint_t frame_index = 0;\n\tfor(k3d::frames::iterator frame = Frames.begin(); frame != Frames.end(); ++frame, ++frame_index)\n\t\tframe->destination = files.file(frame_index);\n\n\treturn true;\n}\n\n} // namespace detail\n\nk3d::icamera* default_camera(document_state& DocumentState)\n{\n\tconst std::vector<k3d::icamera*> cameras = k3d::node::lookup<k3d::icamera>(DocumentState.document());\n\treturn cameras.size() == 1 ? cameras[0] : 0;\n}\n\nk3d::irender_preview* default_preview_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_preview*> render_engines = k3d::node::lookup<k3d::irender_preview>(DocumentState.document());\n\treturn render_engines.size() == 1 ? render_engines[0] : 0;\n}\n\nk3d::irender_frame* default_still_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_frame*> render_engines = k3d::node::lookup<k3d::irender_frame>(DocumentState.document());\n\treturn render_engines.size() == 1 ? render_engines[0] : 0;\n}\n\nk3d::irender_animation* default_animation_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_animation*> render_engines = k3d::node::lookup<k3d::irender_animation>(DocumentState.document());\n\treturn render_engines.size() == 1 ? render_engines[0] : 0;\n}\n\nk3d::irender_camera_preview* default_camera_preview_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_camera_preview*> render_engines = k3d::node::lookup<k3d::irender_camera_preview>(DocumentState.document());\n\treturn render_engines.size() == 1 ? render_engines[0] : 0;\n}\n\nk3d::irender_camera_frame* default_camera_still_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_camera_frame*> render_engines = k3d::node::lookup<k3d::irender_camera_frame>(DocumentState.document());\n\treturn render_engines.size() == 1 ? render_engines[0] : 0;\n}\n\nk3d::irender_camera_animation* default_camera_animation_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_camera_animation*> render_engines = k3d::node::lookup<k3d::irender_camera_animation>(DocumentState.document());\n\treturn render_engines.size() == 1 ? render_engines[0] : 0;\n}\n\nk3d::gl::irender_viewport* default_gl_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::gl::irender_viewport*> render_engines = k3d::node::lookup<k3d::gl::irender_viewport>(DocumentState.document());\n\treturn render_engines.size() == 1 ? render_engines[0] : 0;\n}\n\nk3d::icamera* pick_camera(document_state& DocumentState, const k3d::icamera* CurrentCamera)\n{\n\tconst std::vector<k3d::icamera*> cameras = k3d::node::lookup<k3d::icamera>(DocumentState.document());\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::icamera>();\n\n\treturn detail::pick_camera(DocumentState, cameras, factories, CurrentCamera, _(\"Pick Camera:\"), _(\"Choose a camera\"));\n}\n\nk3d::irender_preview* pick_preview_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_preview*> render_engines = k3d::node::lookup<k3d::irender_preview>(DocumentState.document());\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::irender_preview>();\n\n\treturn detail::pick_render_engine<k3d::irender_preview>(DocumentState, render_engines, factories, _(\"Pick Preview Render Engine:\"), _(\"Choose a render engine to be used for preview image rendering\"));\n}\n\nk3d::irender_frame* pick_still_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_frame*> render_engines = k3d::node::lookup<k3d::irender_frame>(DocumentState.document());\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::irender_frame>();\n\n\treturn detail::pick_render_engine<k3d::irender_frame>(DocumentState, render_engines, factories, _(\"Pick Still Render Engine:\"), _(\"Choose a render engine to be used for still image rendering\"));\n}\n\nk3d::irender_animation* pick_animation_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_animation*> render_engines = k3d::node::lookup<k3d::irender_animation>(DocumentState.document());\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::irender_animation>();\n\n\treturn detail::pick_render_engine<k3d::irender_animation>(DocumentState, render_engines, factories, _(\"Pick Animation Render Engine:\"), _(\"Choose a render engine to be used for animation rendering\"));\n}\n\nk3d::irender_camera_preview* pick_camera_preview_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_camera_preview*> render_engines = k3d::node::lookup<k3d::irender_camera_preview>(DocumentState.document());\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::irender_camera_preview>();\n\n\treturn detail::pick_render_engine<k3d::irender_camera_preview>(DocumentState, render_engines, factories, _(\"Pick Preview Render Engine:\"), _(\"Choose a render engine to be used for preview image rendering\"));\n}\n\nk3d::irender_camera_frame* pick_camera_still_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_camera_frame*> render_engines = k3d::node::lookup<k3d::irender_camera_frame>(DocumentState.document());\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::irender_camera_frame>();\n\n\treturn detail::pick_render_engine<k3d::irender_camera_frame>(DocumentState, render_engines, factories, _(\"Pick Still Render Engine:\"), _(\"Choose a render engine to be used for still image rendering\"));\n}\n\nk3d::irender_camera_animation* pick_camera_animation_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::irender_camera_animation*> render_engines = k3d::node::lookup<k3d::irender_camera_animation>(DocumentState.document());\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::irender_camera_animation>();\n\n\treturn detail::pick_render_engine<k3d::irender_camera_animation>(DocumentState, render_engines, factories, _(\"Pick Animation Render Engine:\"), _(\"Choose a render engine to be used for animation rendering\"));\n}\n\nk3d::gl::irender_viewport* pick_gl_render_engine(document_state& DocumentState)\n{\n\tconst std::vector<k3d::gl::irender_viewport*> render_engines = k3d::node::lookup<k3d::gl::irender_viewport>(DocumentState.document());\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::gl::irender_viewport>();\n\n\treturn detail::pick_render_engine<k3d::gl::irender_viewport>(DocumentState, render_engines, factories, _(\"Pick OpenGL Render Engine:\"), _(\"Choose an OpenGL render engine to be used for drawing\"));\n}\n\nvoid test_render_engine(k3d::iunknown& Engine)\n{\n\tdetail::test_renderman_render_engine(Engine);\n\tdetail::test_yafray_render_engine(Engine);\n}\n\nvoid render(k3d::irender_preview& Engine)\n{\n\ttest_render_engine(Engine);\n\tassert_warning(Engine.render_preview());\n}\n\nvoid render(k3d::irender_frame& Engine)\n{\n\tk3d::filesystem::path file;\n\t{\n\t\tfile_chooser_dialog dialog(_(\"Render Frame:\"), k3d::options::path::render_frame(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\tif(!dialog.get_file_path(file))\n\t\t\treturn;\n\t}\n\n\ttest_render_engine(Engine);\n\tassert_warning(Engine.render_frame(file, true));\n}\n\nvoid render(document_state& DocumentState, k3d::irender_animation& Engine)\n{\n\ttest_render_engine(Engine);\n\n\tk3d::frames frames;\n\tif(!detail::generate_frames(DocumentState, frames))\n\t\treturn;\n\n\tif(!detail::assign_destinations(Engine, frames))\n\t\treturn;\n\n\t// See if the user wants to view frames as they're completed ...\n\tstd::vector<k3d::string_t> buttons;\n\tbuttons.push_back(\"Yes\");\n\tbuttons.push_back(\"No\");\n\tbuttons.push_back(\"Cancel\");\n\n\tconst unsigned long result = query_message(\"Do you want to see rendered frames as they're completed?\", 1, buttons);\n\tif(0 == result || 3 == result)\n\t\treturn;\n\n\tconst bool viewcompleted = (1 == result);\n\n\tassert_warning(Engine.render_animation(*k3d::get_time(DocumentState.document()), frames, viewcompleted));\n}\n\nvoid render(k3d::icamera& Camera, k3d::irender_camera_preview& Engine)\n{\n\ttest_render_engine(Engine);\n\tassert_warning(Engine.render_camera_preview(Camera));\n}\n\nvoid render(k3d::icamera& Camera, k3d::irender_camera_frame& Engine)\n{\n\tk3d::filesystem::path file;\n\t{\n\t\tfile_chooser_dialog dialog(_(\"Render Frame:\"), k3d::options::path::render_frame(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\n\t\t// Try to infer the correct file extension behavior ...\n\t\tif(dynamic_cast<viewport::control*>(&Engine))\n\t\t{\n\t\t\tdialog.add_pattern_filter(_(\"PNM Image (*.pnm)\"), \"*.pnm\");\n\t\t\tdialog.add_all_files_filter();\n\t\t\tdialog.append_extension(\".pnm\");\n\t\t}\n\t\telse if(k3d::inode* const node = dynamic_cast<k3d::inode*>(&Engine))\n\t\t{\n\t\t\tif(node->factory().factory_id() == k3d::classes::RenderManEngine())\n\t\t\t{\n\t\t\t\tdialog.add_pattern_filter(_(\"TIFF Image (*.tiff)\"), \"*.tiff\");\n\t\t\t\tdialog.add_all_files_filter();\n\t\t\t\tdialog.append_extension(\".tiff\");\n\t\t\t}\n\t\t\telse if(node->factory().factory_id() == k3d::uuid(0xef38bf93, 0x66654f9f, 0x992ca91b, 0x62bae139))\n\t\t\t{\n\t\t\t\tdialog.add_pattern_filter(_(\"Targa Image (*.tga)\"), \"*.tga\");\n\t\t\t\tdialog.add_all_files_filter();\n\t\t\t\tdialog.append_extension(\".tga\");\n\t\t\t}\n\t\t}\n\n\t\tif(!dialog.get_file_path(file))\n\t\t\treturn;\n\t}\n\n\ttest_render_engine(Engine);\n\tassert_warning(Engine.render_camera_frame(Camera, file, true));\n}\n\nvoid render(document_state& DocumentState, k3d::icamera& Camera, k3d::irender_camera_animation& Engine)\n{\n\ttest_render_engine(Engine);\n\n\tk3d::frames frames;\n\tif(!detail::generate_frames(DocumentState, frames))\n\t\treturn;\n\n\tif(!detail::assign_destinations(Engine, frames))\n\t\treturn;\n\n\t// See if the user wants to view frames as they're completed ...\n\tstd::vector<k3d::string_t> buttons;\n\tbuttons.push_back(\"Yes\");\n\tbuttons.push_back(\"No\");\n\tbuttons.push_back(\"Cancel\");\n\n\tconst unsigned long result = query_message(\"Do you want to see rendered frames as they're completed?\", 1, buttons);\n\tif(0 == result || 3 == result)\n\t\treturn;\n\n\tconst bool viewcompleted = (1 == result);\n\n\tassert_warning(Engine.render_camera_animation(Camera, *k3d::get_time(DocumentState.document()),  frames, viewcompleted));\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/render.h",
    "content": "#ifndef K3DSDK_NGUI_RENDER_H\n#define K3DSDK_NGUI_RENDER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d { class icamera; }\nnamespace k3d { class irender_preview; }\nnamespace k3d { class irender_frame; }\nnamespace k3d { class irender_animation; }\nnamespace k3d { class irender_camera_preview; }\nnamespace k3d { class irender_camera_frame; }\nnamespace k3d { class irender_camera_animation; }\nnamespace k3d { namespace gl { class irender_viewport; } }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\n/// Returns a default camera, or 0\nk3d::icamera* default_camera(document_state& DocumentState);\n/// Returns a default preview render engine, or 0\nk3d::irender_preview* default_preview_render_engine(document_state& DocumentState);\n/// Returns a default still render engine, or 0\nk3d::irender_frame* default_still_render_engine(document_state& DocumentState);\n/// Returns a default animation render engine, or 0\nk3d::irender_animation* default_animation_render_engine(document_state& DocumentState);\n/// Returns a default preview render engine, or 0\nk3d::irender_camera_preview* default_camera_preview_render_engine(document_state& DocumentState);\n/// Returns a default still render engine, or 0\nk3d::irender_camera_frame* default_camera_still_render_engine(document_state& DocumentState);\n/// Returns a default animation render engine, or 0\nk3d::irender_camera_animation* default_camera_animation_render_engine(document_state& DocumentState);\n/// Returns a default OpenGL render engine, or 0\nk3d::gl::irender_viewport* default_gl_render_engine(document_state& DocumentState);\n\n/// Prompts the user to choose a camera, returns 0 on cancellation\nk3d::icamera* pick_camera(document_state& DocumentState, const k3d::icamera* CurrentCamera = 0);\n/// Prompts the user to choose a preview render engine, returns 0 on cancellation\nk3d::irender_preview* pick_preview_render_engine(document_state& DocumentState);\n/// Prompts the user to choose a still render engine, returns 0 on cancellation\nk3d::irender_frame* pick_still_render_engine(document_state& DocumentState);\n/// Prompts the user to choose an animation render engine, returns 0 on cancellation\nk3d::irender_animation* pick_animation_render_engine(document_state& DocumentState);\n/// Prompts the user to choose a preview render engine, returns 0 on cancellation\nk3d::irender_camera_preview* pick_camera_preview_render_engine(document_state& DocumentState);\n/// Prompts the user to choose a still render engine, returns 0 on cancellation\nk3d::irender_camera_frame* pick_camera_still_render_engine(document_state& DocumentState);\n/// Prompts the user to choose an animation render engine, returns 0 on cancellation\nk3d::irender_camera_animation* pick_camera_animation_render_engine(document_state& DocumentState);\n/// Prompts the user to choose an OpenGL render engine, returns 0 on cancellation\nk3d::gl::irender_viewport* pick_gl_render_engine(document_state& DocumentState);\n\nvoid test_render_engine(k3d::iunknown& Engine);\n\nvoid render(k3d::irender_preview& Engine);\nvoid render(k3d::irender_frame& Engine);\nvoid render(document_state& DocumentState, k3d::irender_animation& Engine);\nvoid render(k3d::icamera& Camera, k3d::irender_camera_preview& Engine);\nvoid render(k3d::icamera& Camera, k3d::irender_camera_frame& Engine);\nvoid render(document_state& DocumentState, k3d::icamera& Camera, k3d::irender_camera_animation& Engine);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_RENDER_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/rotate_tool.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <gdkmm/cursor.h>\n#include <gtkmm/widget.h>\n\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/rotate_tool.h>\n#include <k3dsdk/ngui/transform_tool.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/geometric_operations.h>\n#include <k3dsdk/line2.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/plane.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/selectable.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/xml.h>\n\n#include <k3dsdk/fstream.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\nclass rotate_manipulators :\n\tpublic imanipulators<k3d::angle_axis>\n{\nprivate:\n\tstruct constraint :\n\t\tpublic k3d::selectable\n\t{\n\t\tconstraint(const std::string& Label, Glib::RefPtr<Gdk::Pixbuf> Cursor, const k3d::selection::token& SelectionToken) :\n\t\t\tm_selection_token(SelectionToken),\n\t\t\tm_label(Label),\n\t\t\tm_cursor(Cursor),\n\t\t\tm_plane(k3d::vector3(0, 0, 1), 0),\n\t\t\tm_axis(0, 0, 0)\n\t\t{\n\t\t\tassert_warning(!m_label.empty());\n\t\t}\n\n\t\tconst std::string label()\n\t\t{\n\t\t\treturn m_label;\n\t\t}\n\n\t\tGlib::RefPtr<Gdk::Pixbuf> cursor()\n\t\t{\n\t\t\treturn m_cursor;\n\t\t}\n\n\t\tvoid set_plane(const k3d::plane& Plane, const k3d::vector3& Axis)\n\t\t{\n\t\t\tm_plane = Plane;\n\t\t\tm_axis = Axis;\n\t\t}\n\n\t\tvoid begin_mouse_move(const k3d::point2& Mouse, const k3d::point3& Origin)\n\t\t{\n\t\t\tm_first_mouse = Mouse;\n\t\t\tm_rotation_origin = Origin;\n\t\t}\n\n\t\tk3d::angle_axis mouse_move(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t\t{\n\t\t\tconst k3d::point2 current_mouse(Coordinates);\n\t\t\tconst k3d::point2 origin = Viewport.project(m_rotation_origin);\n\n\t\t\tconst k3d::vector2 v1 = m_first_mouse - origin;\n\t\t\tconst k3d::vector2 v2 = current_mouse - origin;\n\n\t\t\t// First or current mouse is on the origin\n\t\t\tif(!v1.length2() || !v2.length2())\n\t\t\t\treturn k3d::angle_axis(0, m_axis);\n\n\t\t\t// Angle between v1 and v2\n\t\t\tconst double dot_product = v1 * v2;\n\t\t\tdouble angle = acos(dot_product / v1.length() / v2.length());\n\n\t\t\t// Check for rotation manipulator direction\n\t\t\tconst k3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*Viewport.camera());\n\t\t\t// Forward camera vector is +Z\n\t\t\tconst k3d::vector3 camera_forward = screen_matrix * k3d::vector3(0, 0, 1);\n\t\t\tif(camera_forward * m_axis < 0)\n\t\t\t\tangle = -angle;\n\n\t\t\t// Test whether current_mouse point is below line defined by (m_first_mouse, origin) :\n\t\t\tif(m_first_mouse[0] == origin[0])\n\t\t\t{\n\t\t\t\t// Vertical line, test left or right instead\n\t\t\t\tif(current_mouse[0] > origin[0])\n\t\t\t\t\tangle = -angle;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Check whether m_first_mouse was in the left or right quadrants\n\t\t\t\tif(m_first_mouse[0] > origin[0])\n\t\t\t\t\tangle = -angle;\n\n\t\t\t\t// Project current_mouse vertically on line defined by (m_first_mouse, origin)\n\t\t\t\tconst double a = (current_mouse[0] - m_first_mouse[0]) / (origin[0] - m_first_mouse[0]);\n\t\t\t\tconst double y = m_first_mouse[1] + a * (origin[1] - m_first_mouse[1]);\n\t\t\t\tif(y > current_mouse[1])\n\t\t\t\t\tangle = -angle;\n\t\t\t}\n\n\t\t\treturn k3d::angle_axis(angle, m_axis);\n\t\t}\n\n\t\tconst k3d::vector3 axis()\n\t\t{\n\t\t\treturn m_axis;\n\t\t}\n\n\t\tconst k3d::selection::token m_selection_token;\n\t\tconst std::string m_label;\n\t\tconst Glib::RefPtr<Gdk::Pixbuf> m_cursor;\n\n\t\t/// Stores the constraint plane in world coordinates\n\t\tk3d::plane m_plane;\n\t\t/// Stores the rotation axis in world coordinates\n\t\tk3d::vector3 m_axis;\n\n\t\tk3d::point2 m_first_mouse;\n\t\tk3d::point3 m_rotation_origin;\n\t};\n\npublic:\n\trotate_manipulators() :\n\t\tm_current_constraint(&m_screen_z_constraint),\n\t\tm_screen_z_constraint(_(\"Rotate Screen Z\"), load_icon(\"move_cursor_screen_xy\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 0)),\n\t\tm_x_constraint(_(\"Rotate X\"), load_icon(\"move_cursor_x\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 1)),\n\t\tm_y_constraint(_(\"Rotate Y\"), load_icon(\"move_cursor_y\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 2)),\n\t\tm_z_constraint(_(\"Rotate Z\"), load_icon(\"move_cursor_z\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 3))\n\t{\n\t}\n\n\tvoid activate()\n\t{\n\t\ttry\n\t\t{\n\t\t\tk3d::filesystem::ifstream layout_stream(k3d::share_path() / k3d::filesystem::generic_path(\"ngui/tool_layout.k3d\"));\n\t\t\tk3d::xml::element layout_xml;\n\t\t\tlayout_stream >> layout_xml;\n\t\t\tk3d::xml::element& xml_rotate = layout_xml.safe_element(\"application\").safe_element(\"user_interface\").safe_element(\"tools\").safe_element(\"rotate\");\n\n\t\t\tm_manipulators_size = k3d::xml::attribute_value<double>(xml_rotate, \"size\", 10);\n\t\t\tm_current_color = k3d::xml::attribute_value<k3d::color>(xml_rotate, \"current_color\", k3d::color(1, 1, 0));\n\t\t\tm_x_color = k3d::xml::attribute_value<k3d::color>(xml_rotate, \"x_color\", k3d::color(1, 0, 0));\n\t\t\tm_y_color = k3d::xml::attribute_value<k3d::color>(xml_rotate, \"y_color\", k3d::color(0, 1, 0));\n\t\t\tm_z_color = k3d::xml::attribute_value<k3d::color>(xml_rotate, \"z_color\", k3d::color(0, 0, 1));\n\t\t\tm_screen_z_color = k3d::xml::attribute_value<k3d::color>(xml_rotate, \"screen_z_color\", k3d::color(0.9, 0.9, 0.9));\n\t\t\tm_handle_size = k3d::xml::attribute_value<double>(xml_rotate, \"handle_size\", 5);\n\t\t\tm_handle_major_radius = k3d::xml::attribute_value<double>(xml_rotate, \"handle_major_radius\", 1.0);\n\t\t\tm_handle_minor_radius = k3d::xml::attribute_value<double>(xml_rotate, \"handle_minor_radius\", 0.03);\n\t\t\tm_handle_u_segments = k3d::xml::attribute_value<unsigned long>(xml_rotate, \"handle_u_segments\", 16);\n\t\t\tm_handle_v_segments = k3d::xml::attribute_value<unsigned long>(xml_rotate, \"handle_v_segments\", 4);\n\t\t\tm_screen_z_handle_size = k3d::xml::attribute_value<double>(xml_rotate, \"screen_z_size\", 8);\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t}\n\n\t\tset_constraint(\"screen_z\");\n\t}\n\n\tvoid redraw(viewport::control& Viewport, const bool Visible, const k3d::point3& Position, const k3d::matrix4& Orientation, tool_selection::motion_t Motion, const k3d::point3& Scaling)\n\t{\n\t\t// Sanity checks\n\t\treturn_if_fail(Viewport.gl_engine());\n\t\treturn_if_fail(Viewport.camera());\n\n\t\t// Update constraints\n\t\tconst k3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*Viewport.camera());\n\t\tconst k3d::vector3 screen_normal = screen_matrix * k3d::vector3(0, 0, 1);\n\n\t\t// Update the screen xy constraint so it always aligns with the camera direction vector in world coordinates\n\t\tm_screen_z_constraint.set_plane(k3d::plane(screen_normal, Position), screen_normal);\n\n\t\t// Update axis constraints so their planes are always as perpendicular to the screen as-possible\n\t\tm_x_constraint.set_plane(k3d::plane((Orientation * k3d::vector3(1, 0, 0)) ^ ((Orientation * k3d::vector3(1, 0, 0)) ^ screen_normal), Position), k3d::vector3(1, 0, 0));\n\t\tm_y_constraint.set_plane(k3d::plane((Orientation * k3d::vector3(0, 1, 0)) ^ ((Orientation * k3d::vector3(0, 1, 0)) ^ screen_normal), Position), k3d::vector3(0, 1, 0));\n\t\tm_z_constraint.set_plane(k3d::plane((Orientation * k3d::vector3(0, 0, 1)) ^ ((Orientation * k3d::vector3(0, 0, 1)) ^ screen_normal), Position), k3d::vector3(0, 0, 1));\n\n\t\t// Draw manipulators\n\t\tif(!Visible)\n\t\t\treturn;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(k3d::to_vector(Position)));\n\n\t\tglClear(GL_DEPTH_BUFFER_BIT);\n\n\t\t// Scale manipulators to show them at constant size (except on mouse drag)\n\t\tif(tool_selection::MOTION_NONE == Motion)\n\t\t\tm_scale = detail::manipulators_scale(Viewport, Position, m_manipulators_size);\n\n\t\tglScaled(m_scale, m_scale, m_scale);\n\n\t\t// Draw manipulators\n\t\tconst bool motion = (tool_selection::MOTION_DRAG == Motion) || (tool_selection::MOTION_CLICK_DRAG == Motion);\n\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(Orientation);\n\t\tif(!motion || &m_x_constraint == m_current_constraint)\n\t\t\tdraw_handle(m_current_constraint == &m_x_constraint ? m_current_color : m_x_color, k3d::rotate3(k3d::radians(90.0), k3d::vector3(0, 1, 0)), m_handle_size);\n\t\tif(!motion || &m_y_constraint == m_current_constraint)\n\t\t\tdraw_handle(m_current_constraint == &m_y_constraint ? m_current_color : m_y_color, k3d::rotate3(k3d::radians(90.0), k3d::vector3(1, 0, 0)), m_handle_size);\n\t\tif(!motion || &m_z_constraint == m_current_constraint)\n\t\t\tdraw_handle(m_current_constraint == &m_z_constraint ? m_current_color : m_z_color, k3d::rotate3(k3d::radians(0.0), k3d::vector3(1, 0, 0)), m_handle_size);\n\t\tglPopMatrix();\n\n\t\tif(!motion || &m_screen_z_constraint == m_current_constraint)\n\t\t{\n\t\t\tk3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*Viewport.camera());\n\t\t\t// Zero translation\n\t\t\tscreen_matrix[0][3] = screen_matrix[1][3] = screen_matrix[2][3] = 0;\n\n\t\t\tdraw_handle(m_current_constraint == &m_screen_z_constraint ? m_current_color : m_screen_z_color, screen_matrix, m_screen_z_handle_size);\n\t\t}\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\t}\n\n\tvoid select(viewport::control& Viewport, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(k3d::to_vector(Position)));\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglClear(GL_DEPTH_BUFFER_BIT);\n\n\t\t// Scale manipulators\n\t\tglScaled(m_scale, m_scale, m_scale);\n\n\t\t// Draw manipulators\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(Orientation);\n\t\tselect_handle(m_x_constraint, k3d::rotate3(k3d::radians(90.0), k3d::vector3(0, 1, 0)), m_handle_size);\n\t\tselect_handle(m_y_constraint, k3d::rotate3(k3d::radians(90.0), k3d::vector3(1, 0, 0)), m_handle_size);\n\t\tselect_handle(m_z_constraint, k3d::rotate3(k3d::radians(0.0), k3d::vector3(1, 0, 0)), m_handle_size);\n\t\tglPopMatrix();\n\n\t\tk3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*Viewport.camera());\n\t\tscreen_matrix[0][3] = screen_matrix[1][3] = screen_matrix[2][3] = 0;\n\t\tselect_handle(m_screen_z_constraint, screen_matrix, m_screen_z_handle_size);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\t}\n\n\tstd::string get_constraint_name()\n\t{\n\t\treturn_val_if_fail(m_current_constraint, \"\");\n\n\t\treturn m_current_constraint->label();\n\t}\n\n\t// Set manipulator constraint\n\tGlib::RefPtr<Gdk::Pixbuf> set_constraint(const std::string& Name)\n\t{\n\t\tif(Name == \"screen_z\")\n\t\t\tm_current_constraint = &m_screen_z_constraint;\n\t\telse if(Name == \"x_axis\")\n\t\t\tm_current_constraint = &m_x_constraint;\n\t\telse if(Name == \"y_axis\")\n\t\t\tm_current_constraint = &m_y_constraint;\n\t\telse if(Name == \"z_axis\")\n\t\t\tm_current_constraint = &m_z_constraint;\n\t\telse\n\t\t{\n\t\t\tk3d::log() << error << \"Unknown constraint : '\" << Name << \"'\" << std::endl;\n\t\t\tassert_not_reached();\n\t\t}\n\n\t\treturn m_current_constraint->cursor();\n\t}\n\n\tstd::string constraint_name(const k3d::selection::id ID)\n\t{\n\t\tif(ID == m_screen_z_constraint.m_selection_token.id)\n\t\t\treturn \"screen_z\";\n\t\telse if(ID == m_x_constraint.m_selection_token.id)\n\t\t\treturn \"x_axis\";\n\t\telse if(ID == m_y_constraint.m_selection_token.id)\n\t\t\treturn \"y_axis\";\n\t\telse if(ID == m_z_constraint.m_selection_token.id)\n\t\t\treturn \"z_axis\";\n\n\t\treturn \"\";\n\t}\n\n\tstd::string cycle_constraint(constraint* Constraint)\n\t{\n\t\tif(Constraint == &m_x_constraint)\n\t\t\treturn \"y_axis\";\n\n\t\tif(Constraint == &m_y_constraint)\n\t\t\treturn \"z_axis\";\n\n\t\tif(Constraint == &m_z_constraint)\n\t\t\treturn \"x_axis\";\n\n\t\treturn \"\";\n\t}\n\n\tvoid update_constraint(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t{\n\t\t// Cycle through X - Screen - Y - Screen - Z - Screen - X - etc\n\t\tif(m_current_constraint == &m_x_constraint || m_current_constraint == &m_y_constraint || m_current_constraint == &m_z_constraint)\n\t\t{\n\t\t\t// Save current constraint\n\t\t\tm_previous_constraint = m_current_constraint;\n\n\t\t\t// Go back to screeen mode\n\t\t\tset_constraint(\"screen_z\");\n\t\t}\n\t\telse if(m_previous_constraint)\n\t\t{\n\t\t\t// An axis was previously chosen, cycle to next one\n\t\t\tset_constraint(cycle_constraint(m_previous_constraint));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Constrain movement to the \"nearest\" axis\n\t\t\tconst k3d::point2 mouse(Coordinates);\n\t\t\tconst k3d::point2 coords = Viewport.project(Position);\n\n\t\t\tstd::map<double, std::string> constraints;\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(Position + (Orientation * k3d::vector3(1, 0, 0))))), \"x_axis\"));\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(Position + (Orientation * k3d::vector3(0, 1, 0))))), \"y_axis\"));\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(Position + (Orientation * k3d::vector3(0, 0, 1))))), \"z_axis\"));\n\n\t\t\tset_constraint(constraints.begin()->second);\n\t\t}\n\n\t\tbegin_mouse_move(Coordinates, Position);\n\t}\n\n\tvoid begin_mouse_move(const k3d::point2& Coords, const k3d::point3& Origin)\n\t{\n\t\tm_current_constraint->begin_mouse_move(Coords, Origin);\n\t}\n\n\tk3d::angle_axis mouse_move(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t{\n\t\treturn m_current_constraint->mouse_move(Viewport, Coordinates, Position, Orientation);\n\t}\n\nprivate:\n\t// Manipulator drawing/selection functions\n\tvoid draw_handle(const k3d::color& Color, const k3d::matrix4& Matrix, const double Size)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tk3d::gl::color3d(Color);\n\n\t\tglEnable(GL_LIGHTING);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, Color);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n\t\tdraw_gl_handle(Matrix, Size);\n\t}\n\n\tvoid select_handle(constraint& Constraint, const k3d::matrix4& Matrix, const double Size)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tk3d::gl::push_selection_token(Constraint.m_selection_token);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tdraw_gl_handle(Matrix, Size);\n\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid draw_gl_handle(const k3d::matrix4& Matrix, const double Size)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(Matrix);\n\n\t\tdouble major_step = k3d::pi_times_2() / static_cast<double>(m_handle_u_segments);\n\t\tdouble minor_step = k3d::pi_times_2() / static_cast<double>(m_handle_v_segments);\n\n\t\tfor(unsigned long i = 0; i < m_handle_u_segments; ++i)\n\t\t{\n\t\t\tdouble phi = static_cast<double>(i) * major_step;\n\t\t\tdouble phi2 = phi + major_step;\n\t\t\tdouble x0 = cos(phi) * Size;\n\t\t\tdouble y0 = sin(phi) * Size;\n\t\t\tdouble x1 = cos(phi2) * Size;\n\t\t\tdouble y1 = sin(phi2) * Size;\n\n\t\t\tglBegin(GL_TRIANGLE_STRIP);\n\t\t\tfor(unsigned long j = 0; j <= m_handle_v_segments; ++j)\n\t\t\t{\n\t\t\t\tdouble b = static_cast<double>(j) * minor_step;\n\t\t\t\tdouble c = cos(b);\n\t\t\t\tdouble r = m_handle_minor_radius * c + m_handle_major_radius;\n\t\t\t\tdouble z = sin(b) * Size;\n\n\t\t\t\tglNormal3d(x0*c, y0*c, z);\n\t\t\t\tglVertex3d(x0*r, y0*r, z * m_handle_minor_radius);\n\n\t\t\t\tglNormal3d(x1*c, y1*c, z);\n\t\t\t\tglVertex3d(x1*r, y1*r, z * m_handle_minor_radius);\n\t\t\t}\n\t\t\tglEnd();\n\t\t}\n\n\t\tglPopMatrix();\n\t}\n\n\t/// Stores the constraint that was in effect when rotation began (if any)\n\tconstraint* m_current_constraint;\n\t/// Stores the constraint that was in effect before m_current_constraint\n\tconstraint* m_previous_constraint;\n\n\t// These are placeholders, used to identify hotspots in the manipulators\n\tconstraint m_screen_z_constraint;\n\tconstraint m_x_constraint;\n\tconstraint m_y_constraint;\n\tconstraint m_z_constraint;\n\n\t// Parameters that control the on-screen appearance of the tool\n\tdouble m_manipulators_size;\n\tdouble m_scale;\n\tk3d::color m_current_color;\n\tk3d::color m_x_color;\n\tk3d::color m_y_color;\n\tk3d::color m_z_color;\n\tk3d::color m_screen_z_color;\n\tdouble m_handle_size;\n\tdouble m_handle_major_radius;\n\tdouble m_handle_minor_radius;\n\tunsigned long m_handle_u_segments;\n\tunsigned long m_handle_v_segments;\n\tdouble m_screen_z_handle_size;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// rotate_tool\n\nrotate_tool::rotate_tool(document_state& DocumentState, const std::string& Name) :\n\ttransform_tool_base(DocumentState.document(), DocumentState, Name),\n\tm_mutex(false),\n\tm_rotation(init_owner(*this) + init_name(\"rotation\") + init_label(_(\"Rotation\")) + init_description(_(\"Rotation\")) + init_value(k3d::angle_axis(0, 1, 0, 0))),\n\tm_center(init_owner(*this) + init_name(\"center\") + init_label(_(\"Center\")) + init_description(_(\"Center\")) + init_value(k3d::point3(0, 0, 0))),\n\tm_auto_center(init_owner(*this) + init_name(\"auto_center\") + init_label(_(\"Auto Center\")) + init_description(_(\"Center\")) + init_value(true))\n{\n\tm_rotation.connect_explicit_change_signal(sigc::mem_fun(*this, &rotate_tool::on_rotate));\n\tm_center.connect_explicit_change_signal(sigc::mem_fun(*this, &rotate_tool::on_rotate));\n\tm_auto_center.connect_explicit_change_signal(sigc::mem_fun(*this, &rotate_tool::on_rotate));\n\n\tm_input_model.connect_lbutton_down(sigc::mem_fun(*this, &rotate_tool::on_lbutton_down));\n\tm_input_model.connect_lbutton_click(sigc::mem_fun(*this, &rotate_tool::on_lbutton_click));\n\tm_input_model.connect_lbutton_start_drag(sigc::mem_fun(*this, &rotate_tool::on_lbutton_start_drag));\n\tm_input_model.connect_lbutton_drag(sigc::mem_fun(*this, &rotate_tool::on_lbutton_drag));\n\tm_input_model.connect_lbutton_end_drag(sigc::mem_fun(*this, &rotate_tool::on_lbutton_end_drag));\n\tm_input_model.connect_mbutton_click(sigc::mem_fun(*this, &rotate_tool::on_mbutton_click));\n\tm_input_model.connect_rbutton_click(sigc::mem_fun(*this, &rotate_tool::on_rbutton_click));\n\tm_input_model.connect_mouse_move(sigc::mem_fun(*this, &rotate_tool::on_mouse_move));\n\n\tm_manipulators = new detail::rotate_manipulators();\n}\n\nrotate_tool::~rotate_tool()\n{\n\tdelete m_manipulators;\n}\n\nvoid rotate_tool::on_activate()\n{\n\tm_manipulators->activate();\n\n\tm_visible_manipulators.set_value(true);\n\n\ton_document_selection_changed();\n\n\ttool_selection::redraw_all();\n}\n\nvoid rotate_tool::on_deactivate()\n{\n\tif(MOTION_NONE != m_current_motion)\n\t\tcancel_mouse_move();\n\n\tclear_targets();\n\n\tm_document_state.clear_cursor_signal().emit();\n\ttool_selection::redraw_all();\n}\n\nvoid rotate_tool::on_document_selection_changed()\n{\n\ttarget_list_changed();\n\tupdate_targets();\n\treset();\n\n\t//set_center(world_position());\n}\n\nvoid rotate_tool::on_redraw(viewport::control& Viewport)\n{\n\t// Update target list\n\tupdate_targets();\n\n\t// Redraw manipulators\n\tm_manipulators->redraw(Viewport, (m_visible_manipulators.internal_value() && target_number()), world_position(), world_orientation(), m_current_motion, k3d::point3(1.0, 1.0, 1.0));\n}\n\nvoid rotate_tool::on_select(viewport::control& Viewport)\n{\n\tif(m_visible_manipulators.internal_value() && target_number())\n\t\tm_manipulators->select(Viewport, world_position(), world_orientation());\n}\n\nk3d::iproperty_collection* rotate_tool::get_property_collection()\n{\n\treturn dynamic_cast<k3d::iproperty_collection*>(this);\n}\n\nviewport_input_model& rotate_tool::get_input_model()\n{\n\treturn input_model();\n}\n\n// LMB drag actions\nk3d::angle_axis rotate_tool::mouse_move_to_3d(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\t// Transform mouse move to a world rotation\n\tconst k3d::point3 origin = world_position();\n\tconst k3d::matrix4 orientation = world_orientation();\n\tconst k3d::angle_axis rotation = m_manipulators->mouse_move(Viewport, Coordinates, origin, orientation);\n\n\treturn rotation;\n}\n\nk3d::angle_axis rotate_tool::lbutton_drag(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_DRAG == m_current_motion)\n\t{\n\t\tconst k3d::angle_axis rotation = mouse_move_to_3d(Viewport, Coordinates);\n\t\trotate_selection(rotation);\n\n\t\treturn rotation;\n\t}\n\n\tif(MOTION_BOX_SELECT == m_current_motion)\n\t\tlmb_drag_box_select(Viewport, Coordinates);\n\n\treturn k3d::angle_axis(0, 1, 0, 0);\n}\n\nk3d::angle_axis rotate_tool::mouse_move_action(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_CLICK_DRAG == m_current_motion)\n\t{\n\t\tconst k3d::angle_axis rotation = mouse_move_to_3d(Viewport, Coordinates);\n\t\trotate_selection(rotation);\n\n\t\treturn rotation;\n\t}\n\n\treturn k3d::angle_axis(0, 1, 0, 0);\n}\n\nvoid rotate_tool::rotate_selection(const k3d::angle_axis& Rotation)\n{\n\tif(!Rotation.angle)\n\t\treturn;\n\n\tm_rotation.set_value(Rotation);\n}\n\nk3d::point3 rotate_tool::world_position()\n{\n\tif (m_auto_center.pipeline_value())\n\t\treturn transform_tool_base::world_position();\n\telse\n\t\treturn m_center.pipeline_value();\n}\n\nvoid rotate_tool::on_rotate(k3d::iunknown*)\n{\n\tif(m_mutex)\n\t\treturn;\n\n\trotate_targets(k3d::rotate3(m_rotation.internal_value()));\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/rotate_tool.h",
    "content": "#ifndef K3DSDK_NGUI_ROTATE_TOOL_H\n#define K3DSDK_NGUI_ROTATE_TOOL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/ngui/transform_tool.h>\n\n#include <k3dsdk/property_collection.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// rotate_tool\n\n/// Tool implementation that provides object/mesh rotation behavior\nclass rotate_tool :\n\tpublic transform_tool\n{\n\ttypedef transform_tool transform_tool_base;\n\npublic:\n\trotate_tool(document_state& DocumentState, const std::string& Name);\n\t~rotate_tool();\n\n\tconst k3d::string_t tool_type() { return \"rotate_tool\"; }\n\nprotected:\n\tk3d::point3 world_position();\n\nprivate:\n\tvirtual void on_activate();\n\tvirtual void on_deactivate();\n\tvirtual void on_document_selection_changed();\n\tvirtual void on_redraw(viewport::control& Viewport);\n\tvirtual void on_select(viewport::control& Viewport);\n\n\tk3d::iproperty_collection* get_property_collection();\n\tviewport_input_model& get_input_model();\n\n\tvoid on_lbutton_down(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\t\tconst k3d::key_modifiers modifiers = convert(Event.state);\n\n\t\tlbutton_down(Viewport, coordinates, modifiers);\n\t}\n\n\tvoid on_lbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_click(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_start_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_start_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tk3d::point2 coordinates(Event.x, Event.y);\n\n\t\t// Off-screen wrap\n\t\toff_screen_warp(Viewport, coordinates);\n\n\t\tconst k3d::angle_axis rotation = lbutton_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_end_drag(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_end_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_mbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\t\tconst k3d::key_modifiers modifiers = convert(Event.state);\n\n\t\tmbutton_click(Viewport, coordinates, modifiers);\n\t}\n\n\tvoid on_rbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\trbutton_click(Viewport, coordinates);\n\t}\n\n\tvoid on_mouse_move(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tif(MOTION_CLICK_DRAG != m_current_motion)\n\t\t\treturn;\n\n\t\tk3d::point2 coordinates(Event.x, Event.y);\n\n\t\t// Off-screen wrap\n\t\toff_screen_warp(Viewport, coordinates);\n\n\t\tconst k3d::angle_axis rotation = mouse_move_action(Viewport, coordinates);\n\t}\n\n\t// Manipulator functions\n\tvirtual std::string manipulator_name(const k3d::selection::id ID)\n\t{\n\t\treturn m_manipulators->constraint_name(ID);\n\t}\n\n\tvirtual std::string get_manipulator(const manipulators_t& Manipulators)\n\t{\n\t\tif(!Manipulators.size())\n\t\t\treturn std::string(\"\");\n\n\t\treturn *Manipulators.begin();\n\t}\n\n\tvirtual void set_manipulator(const std::string ManipulatorName)\n\t{\n\t\tm_document_state.set_cursor_signal().emit(m_manipulators->set_constraint(ManipulatorName));\n\t}\n\n\tvirtual std::string get_constraint_name()\n\t{\n\t\treturn m_manipulators->get_constraint_name();\n\t}\n\n\tvirtual void begin_mouse_move(const k3d::point2& Coordinates)\n\t{\n\t\tstart_rotation();\n\t\treset();\n\n\t\tm_manipulators->begin_mouse_move(Coordinates, world_position());\n\t}\n\n\tvirtual void update_constraint(viewport::control& Viewport, const k3d::point2& Coordinates)\n\t{\n\t\tm_manipulators->update_constraint(Viewport, Coordinates, world_position(), world_orientation());\n\n\t\tbegin_mouse_move(Coordinates);\n\t}\n\n\tvirtual void reset()\n\t{\n\t\tm_mutex = true;\n\t\tm_rotation.set_value(k3d::angle_axis(0, 1, 0, 0));\n\t\tm_mutex = false;\n\t}\n\n\t// LMB drag actions\n\tk3d::angle_axis mouse_move_to_3d(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tk3d::angle_axis lbutton_drag(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tk3d::angle_axis mouse_move_action(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid rotate_selection(const k3d::angle_axis& Rotation);\n\tvoid on_rotate(k3d::iunknown*);\n\n\t/// Stores manipulators\n\tdetail::imanipulators<k3d::angle_axis>* m_manipulators;\n\n\t// Rotation value\n\tbool m_mutex;\n\tk3d_data(k3d::angle_axis, immutable_name, explicit_change_signal, with_undo, local_storage, no_constraint, writable_property, no_serialization) m_rotation;\n\t// Rotation center\n\tk3d_data(k3d::point3, immutable_name, explicit_change_signal, with_undo, local_storage, no_constraint, writable_property, no_serialization) m_center;\n\tk3d_data(bool, immutable_name, explicit_change_signal, with_undo, local_storage, no_constraint, writable_property, no_serialization) m_auto_center;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_ROTATE_TOOL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/safe_close_dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/safe_close_dialog.h>\n#include <k3dsdk/ngui/unsaved_document.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/string_cast.h>\n\n#include <gtkmm/frame.h>\n#include <gtkmm/label.h>\n#include <gtkmm/liststore.h>\n#include <gtkmm/messagedialog.h>\n#include <gtkmm/stock.h>\n#include <gtkmm/treeview.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace safe_close_dialog\n{\n\nnamespace detail\n{\n\nclass unsaved_document_columns :\n\tpublic Gtk::TreeModelColumnRecord\n{\npublic:\n\tunsaved_document_columns()\n\t{\n\t\tadd(label);\n\t\tadd(save);\n\t}\n\n\tGtk::TreeModelColumn<Glib::ustring> label;\n\tGtk::TreeModelColumn<bool_t> save;\n};\n\n} // namespace detail\n\nint run(Gtk::Window& Parent, const std::string& Title)\n{\n\tGtk::MessageDialog dialog(Parent, \"\", false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);\n\n\tdialog.set_message(string_cast(boost::format(_(\"Save the changes to document \\\"%1%\\\" before closing?\")) % Title));\n\tdialog.set_secondary_text( _(\"If you don't save, changes will be permanently lost (no undo).\"));\n\n\tGtk::Button* const close_button = new Gtk::Button(_(\"Cl_ose without Saving\"), true);\n\tclose_button->show();\n\n\tdialog.add_action_widget(*Gtk::manage(close_button), Gtk::RESPONSE_CLOSE);\n\tdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);\n\tdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK);\n\n\tdialog.set_default_response(Gtk::RESPONSE_OK);\n\n\tconst int result = dialog.run();\n\n\treturn result;\n}\n\nint run(Gtk::Window& Parent, entries_t& UnsavedDocuments)\n{\n\treturn_val_if_fail(UnsavedDocuments.size(), Gtk::RESPONSE_NONE);\n\n\tif(1 == UnsavedDocuments.size())\n\t\treturn run(Parent, UnsavedDocuments.front().document->unsaved_document_title());\n\n\tGtk::MessageDialog dialog(Parent, \"\", false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);\n\n\tdialog.set_message(string_cast(boost::format(_(\"There are %1% documents with unsaved changes. Save changes before closing?\")) % UnsavedDocuments.size()));\n\tdialog.set_secondary_text(_(\"Select the documents you want to save:\"));\n\n\tdetail::unsaved_document_columns columns;\n\tGlib::RefPtr<Gtk::ListStore> model = Gtk::ListStore::create(columns);\n\tfor(entries_t::iterator unsaved_document = UnsavedDocuments.begin(); unsaved_document != UnsavedDocuments.end(); ++unsaved_document)\n\t{\n\t\tGtk::TreeRow row = *model->append();\n\t\trow[columns.label] = unsaved_document->document->unsaved_document_title();\n\t\trow[columns.save] = true;\n\t}\n\n\tGtk::TreeView view(model);\n\tview.set_headers_visible(false);\n\tview.append_column_editable(\"Save\", columns.save);\n\tview.append_column(\"Document\", columns.label);\n\n\tGtk::Frame frame;\n\tframe.set_shadow_type(Gtk::SHADOW_IN);\n\tframe.add(view);\n\n\tGtk::Label label3(_(\"If you don't save, all your changes will be permanently lost (no undo).\"), Gtk::ALIGN_LEFT);\n\tlabel3.set_selectable(true);\n\n\tstd::vector<Gtk::Widget*> vbox_children = dialog.get_vbox()->get_children();\n\treturn_val_if_fail(vbox_children.size(), Gtk::RESPONSE_NONE);\n\n\tGtk::HBox* const hbox = dynamic_cast<Gtk::HBox*>(vbox_children.front());\n\treturn_val_if_fail(hbox, Gtk::RESPONSE_NONE);\n\n\tstd::vector<Gtk::Widget*> hbox_children = hbox->get_children();\n\treturn_val_if_fail(hbox_children.size(), Gtk::RESPONSE_NONE);\n\n\tGtk::VBox* const vbox = dynamic_cast<Gtk::VBox*>(hbox_children[1]);\n\treturn_val_if_fail(vbox, Gtk::RESPONSE_NONE);\n\n\tvbox->pack_start(frame, Gtk::PACK_EXPAND_WIDGET);\n\tvbox->pack_start(label3, Gtk::PACK_SHRINK);\n\n\tdialog.get_vbox()->show_all();\n\n\tGtk::Button* const close_button = new Gtk::Button(_(\"Cl_ose without Saving\"), true);\n\tclose_button->show();\n\n\tdialog.add_action_widget(*Gtk::manage(close_button), Gtk::RESPONSE_CLOSE);\n\tdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);\n\tdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK);\n\n\tdialog.set_default_response(Gtk::RESPONSE_OK);\n\n\tconst int result = dialog.run();\n\n\treturn result;\n}\n\n} // namespace safe_close_dialog\n\n} // namespace ngui\n\n} // namespace k3d\n"
  },
  {
    "path": "k3dsdk/ngui/safe_close_dialog.h",
    "content": "#ifndef K3DSDK_NGUI_SAFE_CLOSE_DIALOG_H\n#define K3DSDK_NGUI_SAFE_CLOSE_DIALOG_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\n#include <string>\n#include <vector>\n\nnamespace Gtk { class Window; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass unsaved_document;\n\t\n/// Provides a standard \"safe close\" dialog for closing windows with unsaved data.\nnamespace safe_close_dialog\n{\n\n/// Encapsulates an entry in the safe close dialog\nclass entry\n{\npublic:\n\tentry() :\n\t\tdocument(0),\n\t\tsave(true)\n\t{\n\t}\n\t\n\tentry(unsaved_document* Document) :\n\t\tdocument(Document),\n\t\tsave(true)\n\t{\n\t}\n\n\tunsaved_document* document;\n\tbool_t save;\n};\n\n/// Defines a collection of entries in the safe close dialog\ntypedef std::vector<entry> entries_t;\n\t\n/** Prompts the user with a modal dialog and returns returns Gtk::RESPONSE_NONE (cancel closing),\n * Gtk::RESPONSE_CLOSE (close without saving), Gtk::RESPONSE_CANCEL (cancel closing), or\n * Gtk::RESPONSE_OK (save before closing)\n */\n\t\nint run(Gtk::Window& Parent, const string_t& Title);\n\n/** Prompts the user with a modal dialog and returns returns Gtk::RESPONSE_NONE (cancel closing),\n * Gtk::RESPONSE_CLOSE (close without saving), Gtk::RESPONSE_CANCEL (cancel closing), or\n * Gtk::RESPONSE_OK (save before closing)\n */\n\t\nint run(Gtk::Window& Parent, entries_t& UnsavedDocuments);\n\n} // namespace safe_close_dialog\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_SAFE_CLOSE_DIALOG_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/savable_application_window.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/application_state.h>\n#include <k3dsdk/ngui/safe_close_dialog.h>\n#include <k3dsdk/ngui/savable_application_window.h>\n\n#include <k3dsdk/application.h>\n#include <k3dsdk/batch_mode.h>\n#include <k3dsdk/iapplication.h>\n\n#include <gtkmm/dialog.h>\n#include <gdk/gdkkeysyms.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// savable_application_window\n\nsavable_application_window::savable_application_window() :\n\tbase(Gtk::WINDOW_TOPLEVEL)\n{\n\tapplication_state::instance().connect_safe_close_signal(sigc::mem_fun(*this, &savable_application_window::on_safe_close));\n\tk3d::application().connect_close_signal(sigc::mem_fun(*this, &savable_application_window::close));\n}\n\nsavable_application_window::~savable_application_window()\n{\n}\n\nk3d::bool_t savable_application_window::on_key_press_event(GdkEventKey* event)\n{\n\tif(event->keyval == GDK_Escape)\n\t{\n\t\tsafe_close();\n\t\treturn true;\n\t}\n\n\treturn base::on_key_press_event(event);\n}\n\nk3d::bool_t savable_application_window::on_delete_event(GdkEventAny* event)\n{\n\tsafe_close();\n\treturn true;\n}\n\nunsaved_document* savable_application_window::on_safe_close()\n{\n\treturn this;\n}\n\nconst k3d::bool_t savable_application_window::save_changes()\n{\n\tif(k3d::batch_mode() || !unsaved_changes())\n\t\treturn true;\n\n\tswitch(safe_close_dialog::run(*this, unsaved_document_title()))\n\t{\n\t\tcase Gtk::RESPONSE_NONE:\n\t\tcase Gtk::RESPONSE_CANCEL:\n\t\tcase Gtk::RESPONSE_DELETE_EVENT:\n\t\t\treturn false;\n\t\tcase Gtk::RESPONSE_CLOSE:\n\t\t\treturn true;\n\t\tcase Gtk::RESPONSE_OK:\n\t\t\treturn save_unsaved_changes();\n\t}\n\n\tassert_not_reached();\n\treturn false;\n}\n\nvoid savable_application_window::safe_close()\n{\n\tif(k3d::batch_mode() || !unsaved_changes())\n\t{\n\t\tclose();\n\t\treturn;\n\t}\n\n\tswitch(safe_close_dialog::run(*this, unsaved_document_title()))\n\t{\n\t\tcase Gtk::RESPONSE_NONE:\n\t\tcase Gtk::RESPONSE_CANCEL:\n\t\tcase Gtk::RESPONSE_DELETE_EVENT:\n\t\t\treturn;\n\t\tcase Gtk::RESPONSE_CLOSE:\n\t\t\tclose();\n\t\t\treturn;\n\t\tcase Gtk::RESPONSE_OK:\n\t\t\tif(save_unsaved_changes())\n\t\t\t\tclose();\n\t}\n}\n\nvoid savable_application_window::close()\n{\n\ton_close();\n\tdelete this;\n}\n\nvoid savable_application_window::on_close()\n{\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/savable_application_window.h",
    "content": "#ifndef K3DSDK_NGUI_SAVABLE_APPLICATION_WINDOW_H\n#define K3DSDK_NGUI_SAVABLE_APPLICATION_WINDOW_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/unsaved_document.h>\n\n#include <gtkmm/window.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// savable_application_window\n\n/// Provides a standard top-level window for application-level documents that can be saved\nclass savable_application_window :\n        public Gtk::Window,\n\tpublic k3d::ngui::unsaved_document\n{\n\ttypedef Gtk::Window base;\n\npublic:\n\tsavable_application_window();\n\tvirtual ~savable_application_window();\n\n\tk3d::bool_t on_key_press_event(GdkEventKey* event);\n\tk3d::bool_t on_delete_event(GdkEventAny* event);\n\n\t/// Gives the user a chance to save changes, returns true iff all changes have been saved.\n\tconst k3d::bool_t save_changes();\n\t/// Closes the window safely, giving the user a chance to save changes or cancel.\n\tvoid safe_close();\n\t/// Closes the window.\n\tvoid close();\n\nprivate:\n\tk3d::ngui::unsaved_document* on_safe_close();\n\n\t/// Override in derived classes to handle cleanup when the window is closed\n\tvirtual void on_close();\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_SAVABLE_APPLICATION_WINDOW_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/savable_document_window.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/application_state.h>\n#include <k3dsdk/ngui/safe_close_dialog.h>\n#include <k3dsdk/ngui/savable_document_window.h>\n#include <k3dsdk/ngui/document_state.h>\n\n#include <k3dsdk/batch_mode.h>\n\n#include <gtkmm/dialog.h>\n#include <gdk/gdkkeysyms.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// savable_document_window\n\nsavable_document_window::savable_document_window() :\n\tbase(Gtk::WINDOW_TOPLEVEL),\n\tm_document(0)\n{\n\tapplication_state::instance().connect_safe_close_signal(sigc::mem_fun(*this, &savable_document_window::on_safe_close));\n}\n\nsavable_document_window::~savable_document_window()\n{\n}\n\nvoid savable_document_window::initialize(document_state& Document)\n{\n\tassert(!m_document);\n\n\tm_document = &Document;\n\n\tm_document->connect_safe_close_signal(sigc::mem_fun(*this, &savable_document_window::on_safe_close));\n\tm_document->document().close_signal().connect(sigc::mem_fun(*this, &savable_document_window::close));\n}\n\nk3d::idocument& savable_document_window::document()\n{\n\tassert(m_document);\n\treturn m_document->document();\n}\n\nk3d::bool_t savable_document_window::on_key_press_event(GdkEventKey* event)\n{\n\tif(event->keyval == GDK_Escape)\n\t{\n\t\tsafe_close();\n\t\treturn true;\n\t}\n\n\treturn base::on_key_press_event(event);\n}\n\nk3d::bool_t savable_document_window::on_delete_event(GdkEventAny* event)\n{\n\tsafe_close();\n\treturn true;\n}\n\nunsaved_document* savable_document_window::on_safe_close()\n{\n\treturn this;\n}\n\nconst k3d::bool_t savable_document_window::save_changes()\n{\n\tif(k3d::batch_mode() || !unsaved_changes())\n\t\treturn true;\n\n\tswitch(safe_close_dialog::run(*this, unsaved_document_title()))\n\t{\n\t\tcase Gtk::RESPONSE_NONE:\n\t\tcase Gtk::RESPONSE_CANCEL:\n\t\tcase Gtk::RESPONSE_DELETE_EVENT:\n\t\t\treturn false;\n\t\tcase Gtk::RESPONSE_CLOSE:\n\t\t\treturn true;\n\t\tcase Gtk::RESPONSE_OK:\n\t\t\treturn save_unsaved_changes();\n\t}\n\n\tassert_not_reached();\n\treturn false;\n}\n\nvoid savable_document_window::safe_close()\n{\n\tif(k3d::batch_mode() || !unsaved_changes())\n\t{\n\t\tclose();\n\t\treturn;\n\t}\n\n\tswitch(safe_close_dialog::run(*this, unsaved_document_title()))\n\t{\n\t\tcase Gtk::RESPONSE_NONE:\n\t\tcase Gtk::RESPONSE_CANCEL:\n\t\tcase Gtk::RESPONSE_DELETE_EVENT:\n\t\t\treturn;\n\t\tcase Gtk::RESPONSE_CLOSE:\n\t\t\tclose();\n\t\t\treturn;\n\t\tcase Gtk::RESPONSE_OK:\n\t\t\tif(save_unsaved_changes())\n\t\t\t\tclose();\n\t}\n}\n\nvoid savable_document_window::close()\n{\n\ton_close();\n\tdelete this;\n}\n\nvoid savable_document_window::on_close()\n{\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/savable_document_window.h",
    "content": "#ifndef K3DSDK_NGUI_SAVABLE_DOCUMENT_WINDOW_H\n#define K3DSDK_NGUI_SAVABLE_DOCUMENT_WINDOW_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/unsaved_document.h>\n\n#include <gtkmm/window.h>\n\nnamespace k3d { class idocument; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\t\n///////////////////////////////////////////////////////////////////////////////\n// savable_document_window\n\n/// Provides a standard document-level window\nclass savable_document_window :\n        public Gtk::Window,\n\tpublic k3d::ngui::unsaved_document\n{\n\ttypedef Gtk::Window base;\n\npublic:\n\tsavable_document_window();\n\tvirtual ~savable_document_window();\n\n\t/// Called once after startup to complete initialization (we do this in a separate method for plugins that can't take constructor arguments).\n\tvoid initialize(document_state& Document);\n\n\tk3d::idocument& document();\n\n\tk3d::bool_t on_key_press_event(GdkEventKey* event);\n\tk3d::bool_t on_delete_event(GdkEventAny* event);\n\n\t/// Gives the user a chance to save changes, returns true iff all changes have been saved.\n\tconst k3d::bool_t save_changes();\n\t/// Closes the window safely, giving the user a chance to save changes or cancel.\n\tvoid safe_close();\n\t/// Closes the window.\n\tvoid close();\n\nprivate:\n\tk3d::ngui::unsaved_document* on_safe_close();\n\n\t/// Override in derived classes to handle cleanup when the window is closed\n\tvirtual void on_close();\n\n\tk3d::ngui::document_state* m_document;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_SAVABLE_DOCUMENT_WINDOW_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/scale_tool.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <gdkmm/cursor.h>\n#include <gtkmm/widget.h>\n\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/scale_tool.h>\n#include <k3dsdk/ngui/transform_tool.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/geometric_operations.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/line2.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/plane.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/selectable.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/xml.h>\n\n#include <k3dsdk/fstream.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\nclass scale_manipulators :\n\tpublic imanipulators<k3d::point3>\n{\nprivate:\n\tstruct constraint :\n\t\tpublic k3d::selectable\n\t{\n\t\tconstraint(const std::string& Label, Glib::RefPtr<Gdk::Pixbuf> Cursor, const k3d::selection::token& SelectionToken, const bool RelativeMove = false) :\n\t\t\tm_selection_token(SelectionToken),\n\t\t\tm_label(Label),\n\t\t\tm_cursor(Cursor),\n\t\t\tm_relative_move(RelativeMove),\n\t\t\tm_plane(k3d::vector3(0, 0, 1), 0),\n\t\t\tm_x_sensitivity(0),\n\t\t\tm_y_sensitivity(0),\n\t\t\tm_z_sensitivity(0)\n\t\t{\n\t\t\tassert_warning(!m_label.empty());\n\t\t}\n\n\t\tconst std::string label()\n\t\t{\n\t\t\treturn m_label;\n\t\t}\n\n\t\tGlib::RefPtr<Gdk::Pixbuf> cursor()\n\t\t{\n\t\t\treturn m_cursor;\n\t\t}\n\n\t\tvoid set_plane(const k3d::plane& Plane, const double XSensitivity, const double YSensitivity, const double ZSensitivity)\n\t\t{\n\t\t\tm_plane = Plane;\n\t\t\tm_x_sensitivity = XSensitivity;\n\t\t\tm_y_sensitivity = YSensitivity;\n\t\t\tm_z_sensitivity = ZSensitivity;\n\t\t}\n\n\t\tvoid begin_mouse_move(const k3d::point2& Mouse, const k3d::point3& Origin)\n\t\t{\n\t\t\tm_first_mouse = Mouse;\n\t\t\tm_scaling_origin = Origin;\n\n\t\t\tm_last_mouse = Mouse;\n\t\t\tm_current_scale = 1;\n\t\t}\n\n\t\tk3d::point3 mouse_move(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t\t{\n\t\t\tconst k3d::point2 current_mouse(Coordinates);\n\t\t\tconst k3d::point2 origin = Viewport.project(m_scaling_origin);\n\t\t\tconst double sign = k3d::sign((m_first_mouse - origin) * (current_mouse - origin));\n\n\t\t\tif(m_relative_move)\n\t\t\t{\n\t\t\t\t// Relative move\n\t\t\t\tconst k3d::vector2 difference = current_mouse - m_last_mouse;\n\t\t\t\tm_last_mouse = current_mouse;\n\t\t\t\tdouble delta = 0;\n\n\t\t\t\tconst double horizontal_length = difference[0];\n\t\t\t\tconst double vertical_length = difference[1];\n\t\t\t\tif(std::abs(horizontal_length) > std::abs(vertical_length))\n\t\t\t\t{\n\t\t\t\t\t// Dragging mostly horizontally : 1/10th unit increase\n\t\t\t\t\tdelta = 0.1 * horizontal_length;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Dragging mostly vertically : one unit increase\n\t\t\t\t\tdelta = - vertical_length;\n\t\t\t\t}\n\n\t\t\t\tdelta = 1 + 0.02 * delta;\n\t\t\t\tm_current_scale *= delta;\n\n\t\t\t\treturn k3d::point3(m_x_sensitivity ? m_current_scale * m_x_sensitivity : 1.0, m_y_sensitivity ? m_current_scale * m_y_sensitivity : 1.0, m_z_sensitivity ? m_current_scale * m_z_sensitivity : 1.0);\n\t\t\t}\n\n\t\t\t// Absolute move\n\n\t\t\t// Turn mouse coordinates into lines in world coordinates ...\n\t\t\tk3d::line3 first_line = mouse_to_world(Viewport, m_first_mouse);\n\t\t\tk3d::line3 current_line = mouse_to_world(Viewport, current_mouse);\n\n\t\t\t// Calculate intersections with our plane in world coordinates ...\n\t\t\tk3d::point3 first_intersection;\n\t\t\treturn_val_if_fail(k3d::intersect(m_plane, first_line, first_intersection), k3d::point3(1, 1, 1));\n\n\t\t\tdouble factor = k3d::distance(first_intersection, Position);\n\t\t\tif(!factor)\n\t\t\t\tfactor = 1.0;\n\n\t\t\tk3d::point3 current_intersection;\n\t\t\treturn_val_if_fail(k3d::intersect(m_plane, current_line, current_intersection), k3d::point3(1, 1, 1));\n\n\t\t\t// Calculate scaling from distance to origin\n\t\t\tconst double delta = sign * k3d::distance(current_intersection, Position) / factor;\n\n\t\t\treturn k3d::point3(m_x_sensitivity ? delta * m_x_sensitivity : 1.0, m_y_sensitivity ? delta * m_y_sensitivity : 1.0, m_z_sensitivity ? delta * m_z_sensitivity : 1.0);\n\t\t}\n\n\t\tconst k3d::selection::token m_selection_token;\n\t\tconst std::string m_label;\n\t\tconst Glib::RefPtr<Gdk::Pixbuf> m_cursor;\n\t\tconst bool m_relative_move;\n\n\t\t/// Stores the constraint plane in world coordinates\n\t\tk3d::plane m_plane;\n\n\t\tdouble m_x_sensitivity;\n\t\tdouble m_y_sensitivity;\n\t\tdouble m_z_sensitivity;\n\t\tk3d::point2 m_last_mouse;\n\n\t\tk3d::point2 m_first_mouse;\n\t\tk3d::point3 m_scaling_origin;\n\t\tdouble m_current_scale;\n\t};\n\npublic:\n\tscale_manipulators() :\n\t\tm_current_constraint(&m_xyz_constraint),\n\t\tm_xyz_constraint(_(\"Scale XYZ\"), load_icon(\"move_cursor_screen_xy\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 0), true),\n\t\tm_x_constraint(_(\"Scale X\"), load_icon(\"move_cursor_x\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 1)),\n\t\tm_y_constraint(_(\"Scale Y\"), load_icon(\"move_cursor_y\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 2)),\n\t\tm_z_constraint(_(\"Scale Z\"), load_icon(\"move_cursor_z\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 3)),\n\t\tm_xy_constraint(_(\"Scale XY\"), load_icon(\"move_cursor_xy\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 4)),\n\t\tm_xz_constraint(_(\"Scale XZ\"), load_icon(\"move_cursor_xz\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 5)),\n\t\tm_yz_constraint(_(\"Scale YZ\"), load_icon(\"move_cursor_yz\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 6))\n\t{\n\t}\n\n\tvoid activate()\n\t{\n\t\t// Load parameters from configuration file\n\t\ttry\n\t\t{\n\t\t\tk3d::filesystem::ifstream layout_stream(k3d::share_path() / k3d::filesystem::generic_path(\"ngui/tool_layout.k3d\"));\n\t\t\tk3d::xml::element layout_xml;\n\t\t\tlayout_stream >> layout_xml;\n\t\t\tk3d::xml::element& xml_scale = layout_xml.safe_element(\"application\").safe_element(\"user_interface\").safe_element(\"tools\").safe_element(\"scale\");\n\n\t\t\tm_manipulators_size = k3d::xml::attribute_value<double>(xml_scale, \"size\", 10);\n\t\t\tm_current_color = k3d::xml::attribute_value<k3d::color>(xml_scale, \"current_color\", k3d::color(1, 1, 0));\n\t\t\tm_x_color = k3d::xml::attribute_value<k3d::color>(xml_scale, \"x_color\", k3d::color(1, 0, 0));\n\t\t\tm_y_color = k3d::xml::attribute_value<k3d::color>(xml_scale, \"y_color\", k3d::color(0, 1, 0));\n\t\t\tm_z_color = k3d::xml::attribute_value<k3d::color>(xml_scale, \"z_color\", k3d::color(0, 0, 1));\n\t\t\tm_screen_xy_color = k3d::xml::attribute_value<k3d::color>(xml_scale, \"screen_xy_color\", k3d::color(0.9, 0.9, 0.9));\n\t\t\tm_plane_offset = k3d::xml::attribute_value<double>(xml_scale, \"plane_offset\", 5);\n\t\t\tm_plane_size = k3d::xml::attribute_value<double>(xml_scale, \"plane_size\", 4.8);\n\t\t\tm_axis_start = k3d::xml::attribute_value<double>(xml_scale, \"axis_start\", 0);\n\t\t\tm_axis_end = k3d::xml::attribute_value<double>(xml_scale, \"axis_end\", 10);\n\t\t\tm_axis_line_width = k3d::xml::attribute_value<double>(xml_scale, \"axis_line_width\", 1);\n\t\t\tm_axis_box_size = k3d::xml::attribute_value<double>(xml_scale, \"axis_box_size\", 0.5);\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t}\n\n\t\tset_constraint(\"xyz_constraint\");\n\t}\n\n\tvoid redraw(viewport::control& Viewport, const bool Visible, const k3d::point3& Position, const k3d::matrix4& Orientation, tool_selection::motion_t Motion, const k3d::point3& Scaling)\n\t{\n\t\t// Sanity checks\n\t\treturn_if_fail(Viewport.gl_engine());\n\t\treturn_if_fail(Viewport.camera());\n\n\t\t// Update constraints\n\t\tconst k3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*Viewport.camera());\n\t\tconst k3d::vector3 screen_normal = screen_matrix * k3d::vector3(0, 0, 1);\n\n\t\t// Update the screen xy constraint so it always aligns with the camera direction vector in world coordinates\n\t\tm_xyz_constraint.set_plane(k3d::plane(screen_normal, Position), 1, 1, 1);\n\n\t\t// Update axis constraints so their planes are always as perpendicular to the screen as-possible\n\t\tm_x_constraint.set_plane(k3d::plane((Orientation * k3d::vector3(1, 0, 0)) ^ ((Orientation * k3d::vector3(1, 0, 0)) ^ screen_normal), Position), 1, 0, 0);\n\t\tm_y_constraint.set_plane(k3d::plane((Orientation * k3d::vector3(0, 1, 0)) ^ ((Orientation * k3d::vector3(0, 1, 0)) ^ screen_normal), Position), 0, 1, 0);\n\t\tm_z_constraint.set_plane(k3d::plane((Orientation * k3d::vector3(0, 0, 1)) ^ ((Orientation * k3d::vector3(0, 0, 1)) ^ screen_normal), Position), 0, 0, 1);\n\n\t\t// Update plane constraints so they have the correct positions in world coordinates\n\t\tm_xy_constraint.set_plane(k3d::plane(Orientation * k3d::vector3(0, 0, 1), Position), 1, 1, 0);\n\t\tm_xz_constraint.set_plane(k3d::plane(Orientation * k3d::vector3(0, 1, 0), Position), 1, 0, 1);\n\t\tm_yz_constraint.set_plane(k3d::plane(Orientation * k3d::vector3(1, 0, 0), Position), 0, 1, 1);\n\n\t\t// Draw manipulators\n\t\tif(!Visible)\n\t\t\treturn;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\n\t\tconst bool motion = (tool_selection::MOTION_DRAG == Motion) || (tool_selection::MOTION_CLICK_DRAG == Motion);\n\t\tif(motion)\n\t\t\tk3d::gl::push_matrix(k3d::translate3(k3d::to_vector(Position)) * Orientation * k3d::scale3(Scaling[0], Scaling[1], Scaling[2]));\n\t\telse\n\t\t\tk3d::gl::push_matrix(k3d::translate3(k3d::to_vector(Position)) * Orientation);\n\n\t\tglClear(GL_DEPTH_BUFFER_BIT);\n\n\t\t// Scale manipulators to show them at constant size (except on mouse drag)\n\t\tif(tool_selection::MOTION_NONE == Motion)\n\t\t\tm_scale = detail::manipulators_scale(Viewport, Position, m_manipulators_size);\n\n\t\tglScaled(m_scale, m_scale, m_scale);\n\n\t\t// Draw manipulators\n\t\tk3d::vector3 px;\n\t\tk3d::vector3 py;\n\t\tk3d::vector3 pz;\n\n\t\tif(!motion || &m_x_constraint == m_current_constraint || &m_xy_constraint == m_current_constraint || &m_xz_constraint == m_current_constraint)\n\t\t{\n\t\t\tif(is_front_facing(Viewport, k3d::vector3(1, 0, 0), Position, Orientation))\n\t\t\t{\n\t\t\t\tpx = k3d::vector3(1, 0, 0);\n\t\t\t\tdraw_axis(m_x_color, m_current_constraint == &m_x_constraint ? m_current_color : m_x_color, k3d::rotate3(k3d::radians(90.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpx = k3d::vector3(-1, 0, 0);\n\t\t\t\tdraw_axis(m_x_color, m_current_constraint == &m_x_constraint ? m_current_color : m_x_color, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t}\n\n\t\tif(!motion || &m_y_constraint == m_current_constraint || &m_xy_constraint == m_current_constraint || &m_yz_constraint == m_current_constraint)\n\t\t{\n\t\t\tif(is_front_facing(Viewport, k3d::vector3(0, -1, 0), Position, Orientation))\n\t\t\t{\n\t\t\t\tpy = k3d::vector3(0, -1, 0);\n\t\t\t\tdraw_axis(m_y_color, m_current_constraint == &m_y_constraint ? m_current_color : m_y_color, k3d::rotate3(k3d::radians(90.0), k3d::vector3(1, 0, 0)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpy = k3d::vector3(0, 1, 0);\n\t\t\t\tdraw_axis(m_y_color, m_current_constraint == &m_y_constraint ? m_current_color : m_y_color, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(1, 0, 0)));\n\t\t\t}\n\t\t}\n\n\t\tif(!motion || &m_z_constraint == m_current_constraint || &m_xz_constraint == m_current_constraint || &m_yz_constraint == m_current_constraint)\n\t\t{\n\t\t\tif(is_front_facing(Viewport, k3d::vector3(0, 0, 1), Position, Orientation))\n\t\t\t{\n\t\t\t\tpz = k3d::vector3(0, 0, 1);\n\t\t\t\tdraw_axis(m_z_color, m_current_constraint == &m_z_constraint ? m_current_color : m_z_color, k3d::rotate3(k3d::radians(0.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpz = k3d::vector3(0, 0, -1);\n\t\t\t\tdraw_axis(m_z_color, m_current_constraint == &m_z_constraint ? m_current_color : m_z_color, k3d::rotate3(k3d::radians(180.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t}\n\n\t\tif(!motion || &m_yz_constraint == m_current_constraint)\n\t\t\tdraw_plane(m_current_constraint == &m_yz_constraint ? m_current_color : m_x_color, py, py + pz, pz);\n\t\tif(!motion || &m_xz_constraint == m_current_constraint)\n\t\t\tdraw_plane(m_current_constraint == &m_xz_constraint ? m_current_color : m_y_color, px, px + pz, pz);\n\t\tif(!motion || &m_xy_constraint == m_current_constraint)\n\t\t\tdraw_plane(m_current_constraint == &m_xy_constraint ? m_current_color : m_z_color, px, px + py, py);\n\n\t\tif(!motion || &m_xyz_constraint == m_current_constraint)\n\t\t\tdraw_xyz(Viewport, m_current_constraint == &m_xyz_constraint ? m_current_color : m_screen_xy_color);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\t}\n\n\tvoid select(viewport::control& Viewport, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(k3d::to_vector(Position)) * Orientation);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglClear(GL_DEPTH_BUFFER_BIT);\n\n\t\t// Scale manipulators\n\t\tglScaled(m_scale, m_scale, m_scale);\n\n\t\t// Draw manipulators\n\t\tk3d::vector3 px;\n\t\tk3d::vector3 py;\n\t\tk3d::vector3 pz;\n\n\t\tif(is_front_facing(Viewport, k3d::vector3(1, 0, 0), Position, Orientation))\n\t\t{\n\t\t\tpx = k3d::vector3(1, 0, 0);\n\t\t\tselect_axis(m_x_constraint, k3d::rotate3(k3d::radians(90.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpx = k3d::vector3(-1, 0, 0);\n\t\t\tselect_axis(m_x_constraint, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\n\t\tif(is_front_facing(Viewport, k3d::vector3(0, -1, 0), Position, Orientation))\n\t\t{\n\t\t\tpy = k3d::vector3(0, -1, 0);\n\t\t\tselect_axis(m_y_constraint, k3d::rotate3(k3d::radians(90.0), k3d::vector3(1, 0, 0)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpy = k3d::vector3(0, 1, 0);\n\t\t\tselect_axis(m_y_constraint, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(1, 0, 0)));\n\t\t}\n\n\t\tif(is_front_facing(Viewport, k3d::vector3(0, 0, 1), Position, Orientation))\n\t\t{\n\t\t\tpz = k3d::vector3(0, 0, 1);\n\t\t\tselect_axis(m_z_constraint, k3d::rotate3(k3d::radians(0.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpz = k3d::vector3(0, 0, -1);\n\t\t\tselect_axis(m_z_constraint, k3d::rotate3(k3d::radians(180.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\n\t\tselect_plane(m_yz_constraint, py, py + pz, pz);\n\t\tselect_plane(m_xz_constraint, px, px + pz, pz);\n\t\tselect_plane(m_xy_constraint, px, px + py, py);\n\n\t\tselect_xyz(m_xyz_constraint);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\t}\n\n\tstd::string get_constraint_name()\n\t{\n\t\treturn_val_if_fail(m_current_constraint, \"\");\n\n\t\treturn m_current_constraint->label();\n\t}\n\n\t// Set manipulator constraint\n\tGlib::RefPtr<Gdk::Pixbuf> set_constraint(const std::string& Name)\n\t{\n\t\tif(Name == \"xyz_constraint\")\n\t\t\tm_current_constraint = &m_xyz_constraint;\n\t\telse if(Name == \"x_axis\")\n\t\t\tm_current_constraint = &m_x_constraint;\n\t\telse if(Name == \"y_axis\")\n\t\t\tm_current_constraint = &m_y_constraint;\n\t\telse if(Name == \"z_axis\")\n\t\t\tm_current_constraint = &m_z_constraint;\n\t\telse if(Name == \"xy_plane\")\n\t\t\tm_current_constraint = &m_xy_constraint;\n\t\telse if(Name == \"xz_plane\")\n\t\t\tm_current_constraint = &m_xz_constraint;\n\t\telse if(Name == \"yz_plane\")\n\t\t\tm_current_constraint = &m_yz_constraint;\n\t\telse\n\t\t\tassert_not_reached();\n\n\t\treturn m_current_constraint->cursor();\n\t}\n\n\tstd::string constraint_name(const k3d::selection::id ID)\n\t{\n\t\tif(ID == m_xyz_constraint.m_selection_token.id)\n\t\t\treturn \"xyz_constraint\";\n\t\telse if(ID == m_x_constraint.m_selection_token.id)\n\t\t\treturn \"x_axis\";\n\t\telse if(ID == m_y_constraint.m_selection_token.id)\n\t\t\treturn \"y_axis\";\n\t\telse if(ID == m_z_constraint.m_selection_token.id)\n\t\t\treturn \"z_axis\";\n\t\telse if(ID == m_xy_constraint.m_selection_token.id)\n\t\t\treturn \"xy_plane\";\n\t\telse if(ID == m_xz_constraint.m_selection_token.id)\n\t\t\treturn \"xz_plane\";\n\t\telse if(ID == m_yz_constraint.m_selection_token.id)\n\t\t\treturn \"yz_plane\";\n\n\t\treturn \"\";\n\t}\n\n\tstd::string cycle_constraint(constraint* Constraint)\n\t{\n\t\tif(Constraint == &m_x_constraint)\n\t\t\treturn \"y_axis\";\n\n\t\tif(Constraint == &m_y_constraint)\n\t\t\treturn \"z_axis\";\n\n\t\tif(Constraint == &m_z_constraint)\n\t\t\treturn \"x_axis\";\n\n\t\treturn \"\";\n\t}\n\n\tvoid update_constraint(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t{\n\t\t// Cycle through X - Screen - Y - Screen - Z - Screen - X - etc\n\t\tif(m_current_constraint == &m_x_constraint || m_current_constraint == &m_y_constraint || m_current_constraint == &m_z_constraint)\n\t\t{\n\t\t\t// Save current constraint\n\t\t\tm_previous_constraint = m_current_constraint;\n\n\t\t\t// Go back to screeen mode\n\t\t\tset_constraint(\"xyz_constraint\");\n\t\t}\n\t\telse if(m_previous_constraint)\n\t\t{\n\t\t\t// An axis was previously chosen, cycle to next one\n\t\t\tset_constraint(cycle_constraint(m_previous_constraint));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Constrain movement to the \"nearest\" axis\n\t\t\tconst k3d::point2 mouse(Coordinates);\n\t\t\tconst k3d::point2 coords = Viewport.project(Position);\n\n\t\t\tstd::map<double, std::string> constraints;\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(Position + (Orientation * k3d::vector3(1, 0, 0))))), \"x_axis\"));\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(Position + (Orientation * k3d::vector3(0, 1, 0))))), \"y_axis\"));\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(Position + (Orientation * k3d::vector3(0, 0, 1))))), \"z_axis\"));\n\n\t\t\tset_constraint(constraints.begin()->second);\n\t\t}\n\n\t\tbegin_mouse_move(Coordinates, Position);\n\t}\n\n\tvoid begin_mouse_move(const k3d::point2& Coordinates, const k3d::point3& Position)\n\t{\n\t\tm_current_constraint->begin_mouse_move(Coordinates, Position);\n\t}\n\n\tk3d::point3 mouse_move(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::point3& Position, const k3d::matrix4& Orientation)\n\t{\n\t\treturn m_current_constraint->mouse_move(Viewport, Coordinates, Position, Orientation);\n\t}\n\nprivate:\n\t// Manipulator drawing/selection functions\n\tvoid draw_xyz(viewport::control& Viewport, const k3d::color& Color)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::color3d(Color);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, Color);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, Color * 0.2);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\n\t\tglEnable(GL_LIGHTING);\n\n\t\tk3d::gl::draw(k3d::bounding_box3(m_axis_box_size, -m_axis_box_size, m_axis_box_size, -m_axis_box_size, m_axis_box_size, -m_axis_box_size));\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid select_xyz(constraint& Constraint)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::push_selection_token(Constraint.m_selection_token);\n\t\tk3d::gl::draw(k3d::bounding_box3(m_axis_box_size, -m_axis_box_size, m_axis_box_size, -m_axis_box_size, m_axis_box_size, -m_axis_box_size));\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid draw_axis(const k3d::color& ArrowColor, const k3d::color& AxisColor, const k3d::matrix4& Matrix)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(Matrix);\n\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(0, 0, m_axis_end));\n\t\tglEnable(GL_LIGHTING);\n\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, AxisColor);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, AxisColor * 0.2);\n\t\tk3d::gl::draw(k3d::bounding_box3(m_axis_box_size, -m_axis_box_size, m_axis_box_size, -m_axis_box_size, m_axis_box_size, -m_axis_box_size));\n\t\tglPopMatrix();\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglHint(GL_LINE_SMOOTH_HINT, GL_NICEST);\n\t\tglEnable(GL_LINE_SMOOTH);\n\t\tglLineWidth(m_axis_line_width);\n\t\tk3d::gl::color3d(AxisColor);\n\t\tglBegin(GL_LINES);\n\t\t\tglVertex3d(0, 0, m_axis_start);\n\t\t\tglVertex3d(0, 0, m_axis_end);\n\t\tglEnd();\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid select_axis(constraint& Constraint, const k3d::matrix4& Matrix)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(Matrix);\n\n\t\tk3d::gl::push_selection_token(Constraint.m_selection_token);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(0, 0, m_axis_end));\n\t\tk3d::gl::draw(k3d::bounding_box3(m_axis_box_size, -m_axis_box_size, m_axis_box_size, -m_axis_box_size, m_axis_box_size, -m_axis_box_size));\n\t\tglPopMatrix();\n\n\t\tglBegin(GL_LINES);\n\t\t\tglVertex3d(0, 0, m_axis_start);\n\t\t\tglVertex3d(0, 0, m_axis_end);\n\t\tglEnd();\n\t\tk3d::gl::pop_selection_token();\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid draw_plane(const k3d::color& Color, const k3d::vector3& P1, const k3d::vector3& P2, const k3d::vector3& P3)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tk3d::gl::color3d(Color);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglLineWidth(m_axis_line_width);\n\n\t\tglBegin(GL_LINE_STRIP);\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P1 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P2 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P3 * m_plane_size));\n\t\tglEnd();\n\t}\n\n\tvoid select_plane(constraint& Constraint, const k3d::vector3& P1, const k3d::vector3& P2, const k3d::vector3& P3)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tk3d::gl::push_selection_token(Constraint.m_selection_token);\n\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglBegin(GL_QUADS);\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P1 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P2 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P3 * m_plane_size));\n\t\tglEnd();\n\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\t/// Stores the constraint that was in effect when scaling began (if any)\n\tconstraint* m_current_constraint;\n\t/// Stores the constraint that was in effect before m_current_constraint\n\tconstraint* m_previous_constraint;\n\n\t// These are placeholders, used to identify hotspots in the manipulators\n\tconstraint m_xyz_constraint;\n\tconstraint m_x_constraint;\n\tconstraint m_y_constraint;\n\tconstraint m_z_constraint;\n\tconstraint m_xy_constraint;\n\tconstraint m_xz_constraint;\n\tconstraint m_yz_constraint;\n\n\t// Parameters that control the on-screen appearance of the tool\n\tdouble m_manipulators_size;\n\tdouble m_scale;\n\tk3d::color m_current_color;\n\tk3d::color m_x_color;\n\tk3d::color m_y_color;\n\tk3d::color m_z_color;\n\tk3d::color m_screen_xy_color;\n\tdouble m_plane_offset;\n\tdouble m_plane_size;\n\tdouble m_axis_start;\n\tdouble m_axis_end;\n\tdouble m_axis_line_width;\n\tdouble m_axis_box_size;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// scale_tool\n\nscale_tool::scale_tool(document_state& DocumentState, const std::string& Name) :\n\ttransform_tool_base(DocumentState.document(), DocumentState, Name),\n\tm_scaling(init_owner(*this) + init_name(\"scaling\") + init_label(_(\"Scaling\")) + init_description(_(\"Scaling\")) + init_value(k3d::point3(1, 1, 1))),\n\tm_center(init_owner(*this) + init_name(\"center\") + init_label(_(\"Center\")) + init_description(_(\"Center\")) + init_value(k3d::point3(0, 0, 0))),\n\tm_auto_center(init_owner(*this) + init_name(\"auto_center\") + init_label(_(\"Auto Center\")) + init_description(_(\"Center\")) + init_value(true))\n{\n\tm_scaling.connect_explicit_change_signal(sigc::mem_fun(*this, &scale_tool::on_scale));\n\tm_center.connect_explicit_change_signal(sigc::mem_fun(*this, &scale_tool::on_scale));\n\tm_auto_center.connect_explicit_change_signal(sigc::mem_fun(*this, &scale_tool::on_scale));\n\n\tm_input_model.connect_lbutton_down(sigc::mem_fun(*this, &scale_tool::on_lbutton_down));\n\tm_input_model.connect_lbutton_click(sigc::mem_fun(*this, &scale_tool::on_lbutton_click));\n\tm_input_model.connect_lbutton_start_drag(sigc::mem_fun(*this, &scale_tool::on_lbutton_start_drag));\n\tm_input_model.connect_lbutton_drag(sigc::mem_fun(*this, &scale_tool::on_lbutton_drag));\n\tm_input_model.connect_lbutton_end_drag(sigc::mem_fun(*this, &scale_tool::on_lbutton_end_drag));\n\tm_input_model.connect_mbutton_click(sigc::mem_fun(*this, &scale_tool::on_mbutton_click));\n\tm_input_model.connect_rbutton_click(sigc::mem_fun(*this, &scale_tool::on_rbutton_click));\n\tm_input_model.connect_mouse_move(sigc::mem_fun(*this, &scale_tool::on_mouse_move));\n\n\tm_manipulators = new detail::scale_manipulators();\n}\n\nscale_tool::~scale_tool()\n{\n\tdelete m_manipulators;\n}\n\nvoid scale_tool::on_activate()\n{\n\tm_manipulators->activate();\n\n\tm_visible_manipulators.set_value(true);\n\n\ton_document_selection_changed();\n\n\ttool_selection::redraw_all();\n}\n\nvoid scale_tool::on_deactivate()\n{\n\tif(MOTION_NONE != m_current_motion)\n\t\tcancel_mouse_move();\n\n\tclear_targets();\n\n\tm_document_state.clear_cursor_signal().emit();\n\ttool_selection::redraw_all();\n}\n\nvoid scale_tool::on_document_selection_changed()\n{\n\ttarget_list_changed();\n\tupdate_targets();\n\tm_scaling.set_value(k3d::point3(1, 1, 1));\n\t//set_center(world_position());\n\n\tm_original_scaling = k3d::point3(1, 1, 1);\n}\n\nvoid scale_tool::on_redraw(viewport::control& Viewport)\n{\n\t// Update target list\n\tupdate_targets();\n\n\t// Redraw manipulators\n\tm_manipulators->redraw(Viewport, (m_visible_manipulators.internal_value() && target_number()), world_position(), world_orientation(), m_current_motion, get_scaling());\n}\n\nvoid scale_tool::on_select(viewport::control& Viewport)\n{\n\tif(m_visible_manipulators.internal_value() && target_number())\n\t\tm_manipulators->select(Viewport, world_position(), world_orientation());\n}\n\nk3d::iproperty_collection* scale_tool::get_property_collection()\n{\n\treturn dynamic_cast<k3d::iproperty_collection*>(this);\n}\n\nviewport_input_model& scale_tool::get_input_model()\n{\n\treturn input_model();\n}\n\n// LMB drag/move actions\nk3d::point3 scale_tool::mouse_move_to_3d(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\t// Transform mouse move to a scaling\n\tconst k3d::point3 origin = world_position();\n\tconst k3d::matrix4 orientation = world_orientation();\n\tconst k3d::point3 scaling = m_manipulators->mouse_move(Viewport, Coordinates, origin, orientation);\n\n\treturn scaling;\n}\n\nk3d::point3 scale_tool::lbutton_drag(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_DRAG == m_current_motion)\n\t{\n\t\tconst k3d::point3 scaling = mouse_move_to_3d(Viewport, Coordinates);\n\t\tscale_selection(scaling);\n\n\t\treturn scaling;\n\t}\n\n\tif(MOTION_BOX_SELECT == m_current_motion)\n\t\tlmb_drag_box_select(Viewport, Coordinates);\n\n\treturn k3d::point3(1, 1, 1);\n}\n\nk3d::point3 scale_tool::mouse_move_action(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_CLICK_DRAG == m_current_motion)\n\t{\n\t\tconst k3d::point3 scaling = mouse_move_to_3d(Viewport, Coordinates);\n\t\tscale_selection(scaling);\n\n\t\treturn scaling;\n\t}\n\n\treturn k3d::point3(1, 1, 1);\n}\n\nvoid scale_tool::scale_selection(const k3d::point3& Scaling)\n{\n\tif(Scaling == k3d::point3(1, 1, 1))\n\t\treturn;\n\n\tm_scaling.set_value(Scaling);\n}\n\nk3d::point3 scale_tool::world_position()\n{\n\tif (m_auto_center.pipeline_value())\n\t\treturn transform_tool_base::world_position();\n\telse\n\t\treturn m_center.pipeline_value();\n}\n\nk3d::point3 scale_tool::get_scaling()\n{\n\treturn m_scaling.internal_value();\n}\n\nvoid scale_tool::on_scale(k3d::iunknown*)\n{\n\tscale_targets(m_scaling.internal_value());\n}\n\nk3d::point3 scale_tool::get_center()\n{\n\treturn world_position();\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/scale_tool.h",
    "content": "#ifndef K3DSDK_NGUI_SCALE_TOOL_H\n#define K3DSDK_NGUI_SCALE_TOOL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/ngui/transform_tool.h>\n\n#include <k3dsdk/property_collection.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// scale_tool\n\n/// Tool implementation that provides standard node/mesh scaling\nclass scale_tool :\n\tpublic transform_tool\n{\n\ttypedef transform_tool transform_tool_base;\n\npublic:\n\tscale_tool(document_state& DocumentState, const std::string& Name);\n\t~scale_tool();\n\n\tconst k3d::string_t tool_type() { return \"scale_tool\"; }\n\nprotected:\n\tk3d::point3 world_position();\n\nprivate:\n\tvoid on_activate();\n\tvoid on_deactivate();\n\tvoid on_document_selection_changed();\n\tvoid on_redraw(viewport::control& Viewport);\n\tvoid on_select(viewport::control& Viewport);\n\n\tk3d::iproperty_collection* get_property_collection();\n\tviewport_input_model& get_input_model();\n\n\tvoid on_lbutton_down(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\t\tconst k3d::key_modifiers modifiers = convert(Event.state);\n\n\t\tlbutton_down(Viewport, coordinates, modifiers);\n\t}\n\n\tvoid on_lbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_click(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_start_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_start_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tk3d::point2 coordinates(Event.x, Event.y);\n\n\t\t// Off-screen wrap\n\t\toff_screen_warp(Viewport, coordinates);\n\n\t\tconst k3d::point3 scaling = lbutton_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_end_drag(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_end_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_mbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\t\tconst k3d::key_modifiers modifiers = convert(Event.state);\n\n\t\tmbutton_click(Viewport, coordinates, modifiers);\n\t}\n\n\tvoid on_rbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\trbutton_click(Viewport, coordinates);\n\t}\n\n\tvoid on_mouse_move(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tif(MOTION_CLICK_DRAG != m_current_motion)\n\t\t\treturn;\n\n\t\tk3d::point2 coordinates(Event.x, Event.y);\n\n\t\t// Off-screen wrap\n\t\toff_screen_warp(Viewport, coordinates);\n\n\t\tconst k3d::point3 scaling = mouse_move_action(Viewport, coordinates);\n\t}\n\n\t// Manipulator functions\n\tvirtual std::string manipulator_name(const k3d::selection::id ID)\n\t{\n\t\treturn m_manipulators->constraint_name(ID);\n\t}\n\n\tvirtual std::string get_manipulator(const manipulators_t& Manipulators)\n\t{\n\t\tif(!Manipulators.size())\n\t\t\treturn std::string(\"\");\n\n\t\t// Give priority to the middle cube\n\t\tif(std::find(Manipulators.begin(), Manipulators.end(), std::string(\"xyz_constraint\"))\n\t\t\t!= Manipulators.end())\n\t\t\treturn std::string(\"xyz_constraint\");\n\n\t\treturn *Manipulators.begin();\n\t}\n\n\tvirtual void set_manipulator(const std::string ManipulatorName)\n\t{\n\t\tm_document_state.set_cursor_signal().emit(m_manipulators->set_constraint(ManipulatorName));\n\t}\n\n\tvirtual std::string get_constraint_name()\n\t{\n\t\treturn m_manipulators->get_constraint_name();\n\t}\n\n\tvirtual void begin_mouse_move(const k3d::point2& Coordinates)\n\t{\n\t\tstart_scaling();\n\t\tm_original_scaling = get_scaling();\n\n\t\tm_manipulators->begin_mouse_move(Coordinates, world_position());\n\t}\n\n\tvirtual void update_constraint(viewport::control& Viewport, const k3d::point2& Coordinates)\n\t{\n\t\tm_manipulators->update_constraint(Viewport, Coordinates, world_position(), world_orientation());\n\n\t\tbegin_mouse_move(Coordinates);\n\t}\n\n\tvirtual void reset()\n\t{\n\t}\n\n\t// LMB drag/move actions\n\tk3d::point3 mouse_move_to_3d(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tk3d::point3 lbutton_drag(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tk3d::point3 mouse_move_action(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid scale_selection(const k3d::point3& Scaling);\n\tk3d::point3 get_scaling();\n\tvoid on_scale(k3d::iunknown*);\n\tk3d::point3 get_center();\n\n\t/// Stores manipulators\n\tdetail::imanipulators<k3d::point3>* m_manipulators;\n\n\t// Scaling value\n\tk3d::point3 m_original_scaling;\n\tk3d_data(k3d::point3, immutable_name, explicit_change_signal, with_undo, local_storage, no_constraint, writable_property, no_serialization) m_scaling;\n\t// Scaling center\n\tk3d_data(k3d::point3, immutable_name, explicit_change_signal, with_undo, local_storage, no_constraint, writable_property, no_serialization) m_center;\n\tk3d_data(bool, immutable_name, explicit_change_signal, with_undo, local_storage, no_constraint, writable_property, no_serialization) m_auto_center;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_SCALE_TOOL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/screen_overlay.cpp",
    "content": "// SDPGTK\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the screen_overlay class\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/screen_overlay.h>\n#include <k3dsdk/ngui/utility.h>\n\n#include <gdkmm/bitmap.h>\n#include <gtkmm/window.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// screen_overlay\n\nscreen_overlay::screen_overlay(const Gdk::Rectangle& Geometry, const k3d::color& Color) :\n\tbase(Gtk::WINDOW_POPUP)\n{\n//\tconst unsigned long width = get_screen()->get_width();\n//\tconst unsigned long height = get_screen()->get_height();\n//\tresize(width, height);\n\n\tmove(Geometry.get_x(), Geometry.get_y());\n\tresize(Geometry.get_width(), Geometry.get_height());\n\n\tset_color(Color);\n\t\n\tGdk::Color white;\n\twhite.set_rgb(0xffff, 0xffff, 0xffff);\n\n\tGdk::Color black;\n\tblack.set_rgb(0x0000, 0x0000, 0x0000);\n\n\trealize();\n\n\tstd::vector<char> buffer(Geometry.get_width() * Geometry.get_height(), 0x00);\n\tm_mask = Gdk::Bitmap::create(&buffer[0], Geometry.get_width(), Geometry.get_height());\n\t\n\tm_mask_gc = Gdk::GC::create(m_mask);\n\tm_mask_gc->set_function(Gdk::SET);\n\tm_mask_gc->set_foreground(white);\n\tm_mask_gc->set_background(black);\n\t\n//m_mask->draw_rectangle(m_mask_gc, true, 100, 100, 100, 100);\n\n\tshape_combine_mask(m_mask, 0, 0);\n}\n\nscreen_overlay::~screen_overlay()\n{\n\thide();\n}\n\nvoid screen_overlay::set_color(const k3d::color& Color)\n{\n\n\tGdk::Color color;\n\tcolor.set_rgb_p(Color.red, Color.green, Color.blue);\n\n\tmodify_bg(Gtk::STATE_NORMAL, color);\n\tmodify_bg(Gtk::STATE_ACTIVE, color);\n\tmodify_bg(Gtk::STATE_PRELIGHT, color);\n\tmodify_bg(Gtk::STATE_SELECTED, color);\n\tmodify_bg(Gtk::STATE_INSENSITIVE, color);\n\t\n\tqueue_draw();\n\thandle_pending_events();\n}\n\nconst Glib::RefPtr<Gdk::Bitmap>& screen_overlay::mask() const\n{\n\treturn m_mask;\n}\n\nconst Glib::RefPtr<Gdk::GC>& screen_overlay::mask_gc() const\n{\n\treturn m_mask_gc;\n}\n\nvoid screen_overlay::update()\n{\n\tget_window()->shape_combine_mask(m_mask, 0, 0);\n\tqueue_draw();\n\thandle_pending_events();\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/screen_overlay.h",
    "content": "#ifndef K3DSDK_NGUI_SCREEN_OVERLAY_H\n#define K3DSDK_NGUI_SCREEN_OVERLAY_H\n\n// SDPGTK\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Provides an interface for drawing transparent displays over the top of the user's screen\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/color.h>\n#include <gtkmm/window.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n//////////////////////////////////////////////////////////////////////////\n// screen_overlay\n\n/// Provides an interface for drawing transparent displays over the top of the user's screen\nclass screen_overlay :\n\tpublic Gtk::Window\n{\n\ttypedef Gtk::Window base;\n\npublic:\n\tscreen_overlay(const Gdk::Rectangle& Geometry, const k3d::color& Color);\n\t~screen_overlay();\n\n\t/// Updates the overlay color\n\tvoid set_color(const k3d::color& Color);\n\t/// Returns a mask that you can draw on to determine the shape of the overlay\n\tconst Glib::RefPtr<Gdk::Bitmap>& mask() const;\n\t/// Returns a gc that you can use to draw on the overlay mask\n\tconst Glib::RefPtr<Gdk::GC>& mask_gc() const;\n\t/// Called to update the overlay after changes have been using mask() and mask_gc()\n\tvoid update();\n\nprivate:\n\t/// Stores the mask that controls the shape of the overlay\n\tGlib::RefPtr<Gdk::Bitmap> m_mask;\n\t/// Stores the gc for drawing on the overlay mask\n\tGlib::RefPtr<Gdk::GC> m_mask_gc;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_SCREEN_OVERLAY_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/script_button.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/ngui/script_button.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iproperty_sink.h>\n#include <k3dsdk/istate_recorder_sink.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/scripting.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/system.h>\n\n#include <gtkmm/tooltips.h>\n\n#include <boost/format.hpp>\n\n#include <sstream>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace script_button\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// property_model\n\n/// Implementation of script_button::imodel for use with iproperty objects\nclass property_model :\n\tpublic imodel\n{\npublic:\n\tproperty_model(iproperty& Data) :\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<iwritable_property*>(&Data))\n\t{\n\t}\n\n\tiproperty* property()\n\t{\n\t\treturn &m_readable_data;\n\t}\n\n\tconst string_t value()\n\t{\n\t\treturn boost::any_cast<string_t>(m_readable_data.property_internal_value());\n\t}\n\n\tvoid set_value(const string_t& Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\t\tm_writable_data->property_set_value(Value);\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_readable_data.property_changed_signal();\n\t}\n\nprivate:\n\tiproperty& m_readable_data;\n\tiwritable_property* const m_writable_data;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// model\n\nimodel* const model(iproperty& Property)\n{\n\treturn new property_model(Property);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(imodel* const Model, istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\tbase(false, 0),\n\tm_load(_(\"Load\")),\n\tm_save(_(\"Save\")),\n\tm_edit(_(\"Edit Script\")),\n\tm_model(Model),\n\tm_state_recorder(StateRecorder),\n\tm_change_message(ChangeMessage)\n{\n\tm_load.signal_clicked().connect(sigc::mem_fun(*this, &control::on_load));\n\tm_save.signal_clicked().connect(sigc::mem_fun(*this, &control::on_save));\n\tm_edit.signal_clicked().connect(sigc::mem_fun(*this, &control::on_edit));\n\n\tpack_start(m_load, Gtk::PACK_SHRINK);\n\tpack_start(m_save, Gtk::PACK_SHRINK);\n\tpack_start(m_edit, Gtk::PACK_EXPAND_WIDGET);\n\n\tm_load.set_tooltip_text(_(\"Load a script from disk, replacing the current script\"));\n\tm_save.set_tooltip_text(_(\"Save the current script to disk\"));\n\tm_edit.set_tooltip_text(_(\"Open the current script for editing\"));\n\n\tset_name(\"k3d-script-button\");\n\n\t// Update the display and ensure we get a notification anytime the data source changes ...\n\treturn_if_fail(m_model);\n\n\tupdate(0);\n\tm_model->changed_signal().connect(sigc::mem_fun(*this, &control::update));\n}\n\ncontrol::~control()\n{\n\tdelete m_model;\n}\n\nvoid control::update(ihint*)\n{\n\treturn_if_fail(m_model);\n}\n\nvoid control::on_load()\n{\n\treturn_if_fail(m_model);\n\n\tfilesystem::path input_path;\n\n\t{\n\t\tfile_chooser_dialog dialog(_(\"Load Script:\"), options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_OPEN);\n\t\tif(!dialog.get_file_path(input_path))\n\t\t\treturn;\n\t}\n\n\tstd::stringstream buffer;\n\tfilesystem::ifstream input_stream(input_path);\n\tinput_stream >> buffer.rdbuf();\n\tinput_stream.close();\n\n\tif(buffer.str() != m_model->value())\n\t{\n\t\tif(m_state_recorder)\n\t\t\tm_state_recorder->start_recording(create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t\tm_model->set_value(buffer.str());\n\n\t\tif(m_state_recorder)\n\t\t\tm_state_recorder->commit_change_set(m_state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), m_change_message, K3D_CHANGE_SET_CONTEXT);\n\t}\n}\n\nvoid control::on_save()\n{\n\treturn_if_fail(m_model);\n\n\tfilesystem::path output_path;\n\n\t{\n\t\tfile_chooser_dialog dialog(_(\"Save Script:\"), options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\tif(!dialog.get_file_path(output_path))\n\t\t\treturn;\n\t}\n\n\tfilesystem::ofstream output_stream(output_path);\n\toutput_stream << m_model->value();\n}\n\nvoid control::on_edit()\n{\n\treturn_if_fail(m_model);\n\n\tif(Gtk::Window* const window = plugin::create<Gtk::Window>(\"NGUITextEditorDialog\"))\n\t{\n\t\tif(m_model->property())\n\t\t{\n\t\t\tif(iproperty_sink* const property_sink = dynamic_cast<iproperty_sink*>(window))\n\t\t\t\tproperty_sink->set_property(m_model->property());\n\t\t}\n\n\t\tif(istate_recorder_sink* const state_recorder_sink = dynamic_cast<istate_recorder_sink*>(window))\n\t\t\tstate_recorder_sink->set_state_recorder(m_state_recorder);\n\n\t\tif(Gtk::Window* const top_level = dynamic_cast<Gtk::Window*>(get_toplevel()))\n\t\t\twindow->set_transient_for(*top_level);\n\t}\n}\n\n} // namespace script_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/script_button.h",
    "content": "#ifndef K3DSDK_NGUI_SCRIPT_BUTTON_H\n#define K3DSDK_NGUI_SCRIPT_BUTTON_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iwritable_property.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/button.h>\n\n#include <memory>\n\nnamespace k3d\n{\n\nclass ihint;\nclass iproperty;\nclass istate_recorder;\n\nnamespace ngui\n{\n\nnamespace script_button\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// imodel\n\n/// Abstract interface for an object that proxies a data source for a script button control (i.e. the \"model\" in model-view-controller)\nclass imodel\n{\npublic:\n\tvirtual ~imodel() {}\n\n\t/// Called to return the underlying data property (if any, could return NULL)\n\tvirtual iproperty* property() = 0;\n\t/// Called to return the underlying data value\n\tvirtual const string_t value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const string_t& Value) = 0;\n\t/// Signal emitted if the underlying data changes\n\ttypedef sigc::signal<void, ihint*> changed_signal_t;\n\t/// Signal emitted if the underlying data changes\n\tvirtual changed_signal_t& changed_signal() = 0;\n\nprotected:\n\timodel() {}\n\nprivate:\n\timodel(const imodel&);\n\timodel& operator=(const imodel&);\n};\n\n/// Factory method for creating an imodel object given a suitably-typed property\nimodel* const model(iproperty& Property);\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for manipulating script data (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::HBox\n{\n\ttypedef Gtk::HBox base;\n\npublic:\n\tcontrol(imodel* const Model, istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage);\n\t~control();\n\nprivate:\n\tGtk::Button m_load;\n\tGtk::Button m_save;\n\tGtk::Button m_edit;\n\n\t/// Called to update the state of the widget when the underlying data source changes\n\tvoid update(ihint*);\n\t/// Called to replace the current data with a script from disk\n\tvoid on_load();\n\t/// Called to store the current data to disk\n\tvoid on_save();\n\t/// Called to edit the current data\n\tvoid on_edit();\n\n\t/// Storeas a reference to the underlying data object\n\timodel* const m_model;\n\t/// Stores an optional state recorder for recording undo/redo data\n\tistate_recorder* const m_state_recorder;\n\t/// Stores an optional message for labelling undo/redo state changes\n\tconst Glib::ustring m_change_message;\n};\n\n} // namespace script_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_SCRIPT_BUTTON_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/scripting.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/scripting.h>\n\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/fstream.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/string_cast.h>\n\n#include <boost/format.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <gtkmm/main.h>\n#include <gdk/gdkkeysyms.h>\n\n#include <stack>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\n/// Keeps track of running script engines, so they can be halted if the user hits \"escape\"\nstd::stack<k3d::iscript_engine*> script_engine_stack;\n\n/// Halts any running scripts if the user hits \"escape\"\nint script_escape_handler(Gtk::Widget* Widget, GdkEventKey* Event)\n{\n\tif(Event->type != GDK_KEY_RELEASE)\n\t\treturn false;\n\n\tif(Event->keyval != GDK_Escape)\n\t\treturn false;\n\n\treturn_val_if_fail(script_engine_stack.size(), false);\n\n\tstd::vector<std::string> buttons;\n\tbuttons.push_back(_(\"Yes\"));\n\tbuttons.push_back(_(\"No\"));\n\tif(1 == query_message(_(\"Halt running script?\"), 2, buttons))\n\t\tscript_engine_stack.top()->halt();\n\n\treturn true;\n}\n\n/// Executes a script using the given plugin factory to create the script engine\nbool execute_script(const k3d::script::code& Script, const std::string& ScriptName, k3d::iscript_engine::context& Context, const k3d::script::language& Language)\n{\n\t// Sanity checks ...\n\treturn_val_if_fail(ScriptName.size(), false);\n\n\tif(!Language.factory())\n\t{\n\t\terror_message(\n\t\t\t_(\"Could not determine scripting language.  K-3D supports multiple scripting languages, but the language for this script was \"\n\t\t\t\"not recognized. Most K-3D script engines use some type of \\\"magic token\\\" at the beginning of a script to recognize it, e.g. \\\"#python\\\" \"\n\t\t\t\"in the first 7 characters of a script for K-3D's Python engine.  If you are writing a K-3D script, check the documentation \"\n\t\t\t\"for the scripting language you're writing in to see how to make it recognizable.\"));\n\t\treturn false;\n\t}\n\n\t// Get the requested scripting engine ...\n\tboost::scoped_ptr<k3d::iscript_engine> engine(k3d::plugin::create<k3d::iscript_engine>(*Language.factory()));\n\tif(!engine)\n\t{\n\t\terror_message(\n\t\t\t_(\"Error creating the scripting engine to run this script.  Usually this means that your system is missing appropriate libraries \"\n\t\t\t\"or that there was an error in installation.\"));\n\t\treturn false;\n\t}\n\n\t// Intercept global key events ...\n\tscript_engine_stack.push(engine.get());\n\tsigc::connection script_escape_handler_connection = Gtk::Main::signal_key_snooper().connect(sigc::ptr_fun(script_escape_handler));\n\n\t// Run that bad-boy ...\n\tconst bool result = engine->execute(ScriptName, Script.source(), Context);\n\n\tscript_escape_handler_connection.disconnect();\n\tscript_engine_stack.pop();\n\n\tif(!result)\n\t{\n\t\terror_message(\n\t\t\t_(\"Error executing script\"));\n\t}\n\n\treturn result;\n}\n\n} // namespace detail\n\nbool execute_script(const k3d::script::code& Script, const std::string& ScriptName, k3d::iscript_engine::context& Context, const k3d::script::language& Language)\n{\n\treturn detail::execute_script(Script, ScriptName, Context, Language);\n}\n\nbool execute_script(const k3d::script::code& Script, const std::string& ScriptName, k3d::iscript_engine::context& Context)\n{\n\treturn detail::execute_script(Script, ScriptName, Context, k3d::script::language(Script));\n}\n\nbool execute_script(const k3d::filesystem::path& Script, k3d::iscript_engine::context& Context)\n{\n\tif(!k3d::filesystem::exists(Script))\n\t{\n\t\terror_message(\n\t\t\tk3d::string_cast(boost::format(_(\"Requested script file %1% doesn't exist.\")) % Script.native_utf8_string().raw()));\n\t\treturn false;\n\t}\n\n\tk3d::filesystem::ifstream file(Script);\n\tconst k3d::script::code script(file);\n\tconst k3d::script::language language(script);\n\n\treturn detail::execute_script(script, Script.native_utf8_string().raw(), Context, language);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/scripting.h",
    "content": "#ifndef K3DSDK_NGUI_SCRIPTING_H\n#define K3DSDK_NGUI_SCRIPTING_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares convenience functions for working with scripts\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/scripting.h>\n\nnamespace k3d { namespace filesystem { class path; } }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/// Executes a script using a specific language and providing user feedback for errors\nbool execute_script(const k3d::script::code& Script, const std::string& ScriptName, k3d::iscript_engine::context& Context, const k3d::script::language& Language);\n/// Executes a script, attempting to automatically recognize the language and providing user feedback for errors\nbool execute_script(const k3d::script::code& Script, const std::string& ScriptName, k3d::iscript_engine::context& Context);\n/// Executes a script, attempting to automatically recognize the language and providing user feedback for errors\nbool execute_script(const k3d::filesystem::path& Script, k3d::iscript_engine::context& Context);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_SCRIPTING_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/selection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/cubic_curve.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/ienumeration_property.h>\n#include <k3dsdk/imesh_selection_algorithm.h>\n#include <k3dsdk/imesh_selection_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/imetadata.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/inode_selection.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/selection_tool.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <map>\n#include <set>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace selection\n{\n\nnamespace detail\n{\n\n/// Uses an update policy to replace each selection in a set of MeshInstance nodes.\n/// Each update policy must generate a k3d::selection::set based on the current state of the MeshInstance output mesh.\n/// Use replace_selection() to apply selection algorithms to an existing mesh.\ntemplate<typename UpdatePolicyT>\nvoid replace_selection(const nodes_t& Nodes, const UpdatePolicyT& UpdatePolicy, const bool_t VisibleSelection)\n{\n\tfor(nodes_t::const_iterator node = Nodes.begin(); node != Nodes.end(); ++node)\n\t{\n\t\tif(classes::MeshInstance() != (*node)->factory().factory_id())\n\t\t\tcontinue;\n\n\t\timesh_selection_sink* const mesh_selection_sink = dynamic_cast<imesh_selection_sink*>(*node);\n\t\tif(!mesh_selection_sink)\n\t\t\tcontinue;\n\n\t\timesh_source* const mesh_source = dynamic_cast<imesh_source*>(*node);\n\t\tif(!mesh_source)\n\t\t\tcontinue;\n\n\t\tconst k3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(mesh_source->mesh_source_output().property_internal_value());\n\t\tif(!mesh)\n\t\t\tcontinue;\n\n\t\tconst k3d::selection::set current_selection =\n\t\t\tboost::any_cast<k3d::selection::set>(mesh_selection_sink->mesh_selection_sink_input().property_internal_value());\n\n\t\tproperty::set_internal_value(mesh_selection_sink->mesh_selection_sink_input(), UpdatePolicy(*mesh, current_selection));\n\t\tproperty::set_internal_value(**node, \"show_component_selection\", VisibleSelection);\n\t}\n}\n\n/// Update policy for use with replace_selection() that selects all points in a mesh.\nstruct select_all_points\n{\n\tconst k3d::selection::set operator()(const mesh& Mesh, const k3d::selection::set& CurrentSelection) const\n\t{\n\t\tk3d::selection::set results;\n\n\t\tboost::scoped_ptr<geometry::point_selection::storage> point_selection(geometry::point_selection::create(results));\n\t\tgeometry::point_selection::append(*point_selection, 1.0);\n\n\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection(geometry::primitive_selection::create(results));\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CONSTANT, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CURVE, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::EDGE, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::FACE, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PARAMETER, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PATCH, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::SURFACE, 0.0);\n\n\t\treturn results;\n\t}\n};\n\n/// Update policy for use with replace_selection() that selects all components of a given type in a mesh.\nstruct select_all_components\n{\n\tselect_all_components(const k3d::selection::type Component) :\n\t\tcomponent(Component)\n\t{\n\t}\n\n\tconst k3d::selection::set operator()(const mesh& Mesh, const k3d::selection::set& CurrentSelection) const\n\t{\n\t\tk3d::selection::set results;\n\n\t\tboost::scoped_ptr<geometry::point_selection::storage> point_selection(geometry::point_selection::create(results));\n\t\tgeometry::point_selection::append(*point_selection, 0.0);\n\n\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection(geometry::primitive_selection::create(results));\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CONSTANT, component == k3d::selection::CONSTANT ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CURVE, component == k3d::selection::CURVE ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::FACE, component == k3d::selection::FACE ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PARAMETER, component == k3d::selection::PARAMETER ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PATCH, component == k3d::selection::PATCH ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::EDGE, component == k3d::selection::EDGE ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::SURFACE, component == k3d::selection::SURFACE ? 1.0 : 0.0);\n\n\t\treturn results;\n\t}\n\n\tconst k3d::selection::type component;\n};\n\n/// Update policy for use with replace_selection() that inverts the selection of all points in a mesh.\nstruct invert_points\n{\n\tconst k3d::selection::set operator()(const k3d::mesh& Mesh, const k3d::selection::set& CurrentSelection) const\n\t{\n\t\tconst k3d::mesh::selection_t* current_point_selection = Mesh.point_selection.get();\n\t\tif(!current_point_selection)\n\t\t\treturn CurrentSelection;\n\n\t\tk3d::selection::set results = CurrentSelection;\n\n\t\tboost::scoped_ptr<geometry::point_selection::storage> point_selection(geometry::point_selection::create(results));\n\t\tfor(k3d::uint_t i = 0; i != current_point_selection->size(); ++i)\n\t\t{\n\t\t\tpoint_selection->index_begin.push_back(i);\n\t\t\tpoint_selection->index_end.push_back(i + 1);\n\t\t\tpoint_selection->weight.push_back((*current_point_selection)[i] ? 0.0 : 1.0);\n\t\t}\n\n\t\treturn results;\n\t}\n};\n\n/// Update policy for use with replace_selection() that inverts the selection of a specific component type in a mesh.\nstruct invert_components\n{\n\tinvert_components(const k3d::selection::type Component) :\n\t\tcomponent(Component)\n\t{\n\t}\n\n\tstruct generate_selection\n\t{\n\t\tgenerate_selection(const uint_t Primitive, const k3d::selection::type Component, k3d::selection::set& Results) :\n\t\t\tprimitive(Primitive),\n\t\t\tcomponent(Component),\n\t\t\tcomponent_string(string_cast(Component)),\n\t\t\tresults(Results)\n\t\t{\n\t\t}\n\n\t\tvoid operator()(const string_t& StructureName, const table& Structure, const string_t& ArrayName, const pipeline_data<array>& Array)\n\t\t{\n\t\t\tif(StructureName != component_string)\n\t\t\t\treturn;\n\n\t\t\tif(Array->get_metadata_value(metadata::key::role()) != metadata::value::selection_role())\n\t\t\t\treturn;\n\n\t\t\tconst mesh::selection_t* const array = dynamic_cast<const mesh::selection_t*>(Array.get());\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\tlog() << error << \"unexpected type for array [\" << ArrayName << \"]\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection(geometry::primitive_selection::create(results));\n\t\t\tprimitive_selection->primitive_begin.push_back(primitive);\n\t\t\tprimitive_selection->primitive_end.push_back(primitive + 1);\n\t\t\tprimitive_selection->primitive_selection_type.push_back(component);\n\t\t\tprimitive_selection->primitive_first_range.push_back(0);\n\t\t\tprimitive_selection->primitive_range_count.push_back(array->size());\n\n\t\t\tfor(uint_t i = 0; i != array->size(); ++i)\n\t\t\t{\n\t\t\t\tprimitive_selection->index_begin.push_back(i);\n\t\t\t\tprimitive_selection->index_end.push_back(i+1);\n\t\t\t\tprimitive_selection->weight.push_back((*array)[i] ? 0.0 : 1.0);\n\t\t\t}\n\t\t}\n\n\t\tconst uint_t primitive;\n\t\tconst k3d::selection::type component;\n\t\tconst string_t component_string;\n\t\tk3d::selection::set& results;\n\t};\n\t\n\tconst k3d::selection::set operator()(const k3d::mesh& Mesh, const k3d::selection::set& CurrentSelection) const\n\t{\n\t\tk3d::selection::set results = CurrentSelection;\n\n\t\tfor(k3d::uint_t primitive = 0; primitive != Mesh.primitives.size(); ++primitive)\n\t\t{\n\t\t\tk3d::mesh::visit_arrays(*Mesh.primitives[primitive], generate_selection(primitive, component, results));\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tconst k3d::selection::type component;\n};\n\n/// Update policy for use with replace_selection() that deselects all points and primitives in a mesh.\nstruct deselect_all\n{\n\tconst k3d::selection::set operator()(const mesh& Mesh, const k3d::selection::set& CurrentSelection) const\n\t{\n\t\treturn geometry::selection::create(0);\n\t}\n};\n\n/// Uses an update policy to convert the supplied selection into updates to MeshInstance mesh selections\ntemplate<typename UpdatePolicyT>\nvoid merge_interactive_selection(const nodes_t& Nodes, const UpdatePolicyT& UpdatePolicy, const k3d::selection::records& InteractiveSelection)\n{\n\tfor(nodes_t::const_iterator node = Nodes.begin(); node != Nodes.end(); ++node)\n\t{\n\t\tif(classes::MeshInstance() != (*node)->factory().factory_id())\n\t\t\tcontinue;\n\n\t\timesh_selection_sink* const mesh_selection_sink = dynamic_cast<imesh_selection_sink*>(*node);\n\t\tif(!mesh_selection_sink)\n\t\t\tcontinue;\n\n\t\timesh_source* const mesh_source = dynamic_cast<imesh_source*>(*node);\n\t\tif(!mesh_source)\n\t\t\tcontinue;\n\n\t\tconst k3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(mesh_source->mesh_source_output().property_internal_value());\n\t\tif(!mesh)\n\t\t\tcontinue;\n\n\t\tconst k3d::selection::set current_selection =\n\t\t\tboost::any_cast<k3d::selection::set>(mesh_selection_sink->mesh_selection_sink_input().property_internal_value());\n\n\t\tproperty::set_internal_value(mesh_selection_sink->mesh_selection_sink_input(), UpdatePolicy(*node, *mesh, current_selection, InteractiveSelection));\n\t\tproperty::set_internal_value(**node, \"show_component_selection\", true);\n\t}\n}\n\n/// Policy class that updates a mesh_selection to select the given points\nstruct select_points\n{\n\tselect_points(const double_t Weight) :\n\t\tweight(Weight)\n\t{\n\t}\n\n\tconst k3d::selection::set operator()(k3d::inode* const Node, const k3d::mesh& Mesh, const k3d::selection::set& CurrentSelection, const k3d::selection::records& InteractiveSelection) const\n\t{\n\t\tk3d::selection::set results = CurrentSelection;\n\n\t\tboost::scoped_ptr<geometry::point_selection::storage> point_selection;\n\t\tfor(k3d::selection::records::const_iterator record = InteractiveSelection.begin(); record != InteractiveSelection.end(); ++record)\n\t\t{\n\t\t\tif(k3d::selection::get_node(*record) != Node)\n\t\t\t\tcontinue;\n\n\t\t\tif(!point_selection)\n\t\t\t\tpoint_selection.reset(geometry::point_selection::create(results));\t\t\t\t\n\n\t\t\tfor(k3d::selection::record::tokens_t::const_iterator token = record->tokens.begin(); token != record->tokens.end(); ++token)\n\t\t\t{\n\t\t\t\tswitch(token->type)\n\t\t\t\t{\n\t\t\t\t\tcase k3d::selection::POINT:\n\t\t\t\t\t\tpoint_selection->index_begin.push_back(token->id);\n\t\t\t\t\t\tpoint_selection->index_end.push_back(token->id + 1);\n\t\t\t\t\t\tpoint_selection->weight.push_back(weight);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tconst double_t weight;\n};\n\n/// Policy class that updates a mesh_selection to select the given components\nstruct select_component\n{\n\tselect_component(const k3d::selection::type& Component, const double_t Weight) :\n\t\tcomponent(Component),\n\t\tweight(Weight)\n\t{\n\t}\n\n\tconst k3d::selection::set operator()(k3d::inode* const Node, const k3d::mesh& Mesh, const k3d::selection::set& CurrentSelection, const k3d::selection::records& InteractiveSelection) const\n\t{\n\t\tk3d::selection::set results = CurrentSelection;\n\n\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection;\n\t\tfor(k3d::selection::records::const_iterator record = InteractiveSelection.begin(); record != InteractiveSelection.end(); ++record)\n\t\t{\n\t\t\tif(k3d::selection::get_node(*record) != Node)\n\t\t\t\tcontinue;\n\n\t\t\tif(!primitive_selection)\n\t\t\t\tprimitive_selection.reset(geometry::primitive_selection::create(results));\t\t\t\t\n\n\t\t\tbool_t found_primitive = false;\n\t\t\tfor(k3d::selection::record::tokens_t::const_iterator token = record->tokens.begin(); token != record->tokens.end(); ++token)\n\t\t\t{\n\t\t\t\tif(token->type == k3d::selection::PRIMITIVE)\n\t\t\t\t{\n\t\t\t\t\tfound_primitive = true;\n\t\t\t\t\tif(primitive_selection->primitive_begin.empty() || primitive_selection->primitive_begin.back() != token->id)\n\t\t\t\t\t{\n\t\t\t\t\t\tprimitive_selection->primitive_begin.push_back(token->id);\n\t\t\t\t\t\tprimitive_selection->primitive_end.push_back(token->id + 1);\n\t\t\t\t\t\tprimitive_selection->primitive_selection_type.push_back(component);\n\t\t\t\t\t\tprimitive_selection->primitive_first_range.push_back(primitive_selection->index_begin.size());\n\t\t\t\t\t\tprimitive_selection->primitive_range_count.push_back(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(token->type == component)\n\t\t\t\t{\n\t\t\t\t\tif(!found_primitive)\n\t\t\t\t\t{\n\t\t\t\t\t\tlog() << error << \"Selection records missing primitive token\" << std::endl;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tprimitive_selection->primitive_range_count.back() += 1;\n\t\t\t\t\tprimitive_selection->index_begin.push_back(token->id);\n\t\t\t\t\tprimitive_selection->index_end.push_back(token->id + 1);\n\t\t\t\t\tprimitive_selection->weight.push_back(weight);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tconst k3d::selection::type component;\n\tconst double_t weight;\n};\n\n/// Policy class that updates a mesh_selection to select the given edges\nstruct select_edges\n{\n\tselect_edges(const bool_t SelectAdjacent, const double_t Weight) :\n\t\tselect_adjacent(SelectAdjacent),\n\t\tweight(Weight)\n\t{\n\t}\n\n\tconst k3d::selection::set operator()(k3d::inode* const Node, const k3d::mesh& Mesh, const k3d::selection::set& CurrentSelection, const k3d::selection::records& InteractiveSelection) const\n\t{\n\t\tk3d::selection::set results = CurrentSelection;\n\n\t\t// Extract the set of edges to be selected ...\n\t\tmesh::indices_t edges;\n\t\tmesh::indices_t edge_primitives;\n\t\tfor(k3d::selection::records::const_iterator record = InteractiveSelection.begin(); record != InteractiveSelection.end(); ++record)\n\t\t{\n\t\t\tif(k3d::selection::get_node(*record) != Node)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::selection::record::tokens_t::const_iterator primitive_token = record->tokens.begin(); primitive_token != record->tokens.end(); ++primitive_token)\n\t\t\t{\n\t\t\t\tif(primitive_token->type != k3d::selection::PRIMITIVE)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tfor(k3d::selection::record::tokens_t::const_iterator edge_token = primitive_token + 1; edge_token != record->tokens.end(); ++edge_token)\n\t\t\t\t{\n\t\t\t\t\tif(edge_token->type != k3d::selection::EDGE)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tedges.push_back(edge_token->id);\n\t\t\t\t\tedge_primitives.push_back(primitive_token->id);\n\n\t\t\t\t\tbreak;\t\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Get the set of unique primitives ...\n\t\tstd::set<uint_t> primitives(edge_primitives.begin(), edge_primitives.end());\n\n\t\t// Optionally select adjacent edges ...\n\t\tif(select_adjacent)\n\t\t{\n\t\t\tconst uint_t edge_begin = 0;\n\t\t\tconst uint_t edge_end = edge_begin + edges.size();\n\n\t\t\tfor(std::set<uint_t>::const_iterator primitive = primitives.begin(); primitive != primitives.end(); ++primitive)\n\t\t\t{\n\t\t\t\tif(Mesh.primitives.size() <= *primitive)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tboost::scoped_ptr<polyhedron::const_primitive> polyhedron(polyhedron::validate(Mesh, *Mesh.primitives[*primitive]));\n\t\t\t\tif(!polyhedron)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tmesh::bools_t boundary_edges;\n\t\t\t\tmesh::indices_t adjacent_edges;\n\t\t\t\tpolyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\n\t\t\t\tstd::set<uint_t> primitive_edges;\n\t\t\t\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(edge_primitives[edge] != *primitive)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tprimitive_edges.insert(edges[edge]);\n\t\t\t\t}\n\n\t\t\t\tfor(std::set<uint_t>::const_iterator edge = primitive_edges.begin(); edge != primitive_edges.end(); ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(boundary_edges[*edge])\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif(primitive_edges.count(adjacent_edges[*edge]))\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tedges.push_back(adjacent_edges[*edge]);\n\t\t\t\t\tedge_primitives.push_back(*primitive);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add all our edges to the output selection ...\n\t\tif(edges.size())\n\t\t{\n\t\t\tconst uint_t edge_begin = 0;\n\t\t\tconst uint_t edge_end = edge_begin + edges.size();\n\n\t\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection(geometry::primitive_selection::create(results));\n\n\t\t\tfor(std::set<uint_t>::const_iterator primitive = primitives.begin(); primitive != primitives.end(); ++primitive)\n\t\t\t{\n\t\t\t\tprimitive_selection->primitive_begin.push_back(*primitive);\n\t\t\t\tprimitive_selection->primitive_end.push_back(*primitive + 1);\n\t\t\t\tprimitive_selection->primitive_selection_type.push_back(k3d::selection::EDGE);\n\t\t\t\tprimitive_selection->primitive_first_range.push_back(primitive_selection->index_begin.size());\n\t\t\t\tprimitive_selection->primitive_range_count.push_back(0);\n\t\t\t\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(edge_primitives[edge] != *primitive)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tprimitive_selection->primitive_range_count.back() += 1;\n\t\t\t\t\tprimitive_selection->index_begin.push_back(edges[edge]);\n\t\t\t\t\tprimitive_selection->index_end.push_back(edges[edge] + 1);\n\t\t\t\t\tprimitive_selection->weight.push_back(weight);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tconst bool_t select_adjacent;\n\tconst double_t weight;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// mode\n\nstd::ostream& operator<<(std::ostream& Stream, const mode& RHS)\n{\n\tswitch(RHS)\n\t{\n\t\tcase CURVE:\n\t\t\tStream << \"curve\";\n\t\t\tbreak;\n\t\tcase FACE:\n\t\t\tStream << \"face\";\n\t\t\tbreak;\n\t\tcase NODE:\n\t\t\tStream << \"node\";\n\t\t\tbreak;\n\t\tcase PATCH:\n\t\t\tStream << \"patch\";\n\t\t\tbreak;\n\t\tcase POINT:\n\t\t\tStream << \"point\";\n\t\t\tbreak;\n\t\tcase EDGE:\n\t\t\tStream << \"edge\";\n\t\t\tbreak;\n\t\tcase SURFACE:\n\t\t\tStream << \"surface\";\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, mode& RHS)\n{\n\tstd::string text;\n\tStream >> text;\n\n\tif(text == \"curve\")\n\t\tRHS = CURVE;\n\telse if(text == \"face\")\n\t\tRHS = FACE;\n\telse if(text == \"node\")\n\t\tRHS = NODE;\n\telse if(text == \"patch\")\n\t\tRHS = PATCH;\n\telse if(text == \"point\")\n\t\tRHS = POINT;\n\telse if(text == \"edge\")\n\t\tRHS = EDGE;\n\telse if(text == \"surface\")\n\t\tRHS = SURFACE;\n\telse\n\t\tlog() << error << \"Unknown enumeration [\" << text << \"]\"<< std::endl;\n\n\treturn Stream;\n}\n\n/// Provides human-readable labels for the selection::mode enumeration\nstatic const ienumeration_property::enumeration_values_t& mode_values()\n{\n\tstatic ienumeration_property::enumeration_values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Curves\"), \"curve\", _(\"Select Curves\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Faces\"), \"face\", _(\"Select Faces\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Nodes\"), \"node\", _(\"Select Nodes\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Patches\"), \"patch\", _(\"Select Patches\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Points\"), \"point\", _(\"Select Points\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Split Edges\"), \"split_edge\", _(\"Select Split Edges\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Uniform\"), \"uniform\", _(\"Select Uniform\")));\n\t}\n\n\treturn values;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// state::implementation\n\nclass state::implementation\n{\npublic:\n\tstatic implementation& instance(idocument& Document)\n\t{\n\t\ttypedef std::map<idocument*, implementation*> cache_t;\n\t\tstatic cache_t cache;\n\t\tcache_t::iterator result = cache.find(&Document);\n\t\tif(result == cache.end())\n\t\t\tresult = cache.insert(std::make_pair(&Document, new implementation(Document))).first;\n\n\t\treturn *result->second;\n\t}\n\n\tinode_selection* node_selection()\n\t{\n\t\tif(!m_node_selection)\n\t\t{\n\t\t\tconst std::vector<inode_selection*> nodes = node::lookup<inode_selection>(document, \"ngui:unique_node\", \"node_selection\");\n\t\t\tif(nodes.size() != 1)\n\t\t\t\treturn 0;\n\t\t\tm_node_selection = nodes[0];\n\t\t\t// Make sure the node gets updated whenever the metadata is changed or the node is deleted\n\t\t\timetadata* metadata = dynamic_cast<imetadata*>(nodes[0]);\n\t\t\tm_node_selection_metadata_connection = metadata->connect_metadata_changed_signal(sigc::mem_fun(*this, &implementation::on_node_selection_node_changed));\n\t\t\tm_node_selection_deleted_connection = dynamic_cast<inode*>(m_node_selection)->deleted_signal().connect(sigc::mem_fun(*this, &implementation::on_node_selection_node_changed));\n\t\t}\n\t\treturn m_node_selection;\n\t}\n\n\tconst nodes_t selected_nodes()\n\t{\n\t\tnodes_t result;\n\t\treturn_val_if_fail(node_selection(), result);\n\t\t\n\t\tconst inode_selection::selected_nodes_t nodes = node_selection()->selected_nodes();\n\t\tresult.assign(nodes.begin(), nodes.end());\n\t\tresult.erase(std::remove(result.begin(), result.end(), static_cast<inode*>(0)), result.end());\n\n\t\treturn result;\n\t}\n\n\tinode* rubber_band()\n\t{\n\t\tif(!m_rubber_band)\n\t\t{\n\t\t\tstd::vector<inode*> nodes = node::lookup(document, uuid(0x72d36e00, 0x0a4621f4, 0xfdc8e69d, 0x621eadc8));\n\t\t\tif(nodes.empty())\n\t\t\t{\n\t\t\t\tnodes.push_back(plugin::create<inode>(uuid(0x72d36e00, 0x0a4621f4, 0xfdc8e69d, 0x621eadc8), document, \"RubberBand\"));\n\t\t\t}\n\n\t\t\tnodes.erase(std::remove(nodes.begin(), nodes.end(), static_cast<inode*>(0)), nodes.end());\n\t\t\tif(nodes.empty())\n\t\t\t\treturn 0;\n\n\t\t\tm_rubber_band = nodes[0];\n\t\t}\n\n\t\treturn m_rubber_band;\n\t}\n\n\tidocument& document;\n\n\t/// Defines storage for the current document-wide selection mode\n\t/** \\todo Restore undo/redo capability */\n//\tk3d_data(selection::mode, immutable_name, explicit_change_signal, with_undo, local_storage, no_constraint, no_property, no_serialization) current_mode;\n\tk3d_data(selection::mode, immutable_name, explicit_change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) current_mode;\n\n\t/// Defines storage for the document-wide keep-selection mode\n\tk3d_data(bool_t, immutable_name, explicit_change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) keep_selection;\n\n\t/// Defines storage for the document-wide convert-selection mode\n\tk3d_data(bool_t, immutable_name, explicit_change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) convert_selection;\n\n\t/// Defines storage for the document-wide select-adjacent-edges state\n\tk3d_data(bool_t, immutable_name, explicit_change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) select_adjacent_edges;\n\nprivate:\n\timplementation(idocument& Document) :\n\t\tdocument(Document),\n\t\tcurrent_mode(init_name(\"selection_mode\") + init_label(_(\"Selection Type\")) + init_description(_(\"Sets selection mode (nodes, faces, edges, points, etc)\")) + init_value(selection::NODE) + init_values(mode_values())),\n\t\tkeep_selection(init_name(\"keep_selection\") + init_label(_(\"Keep Selection\")) + init_description(_(\"Keep the current selection when changing the selection mode.\")) + init_value(false)),\n\t\tconvert_selection(init_name(\"convert_selection\") + init_label(_(\"Convert Selection\")) + init_description(_(\"Convert the current selection when changing the selection mode.\")) + init_value(true)),\n\t\tselect_adjacent_edges(init_name(\"select_adjacent_edges\") + init_label(_(\"Select Adjacent Edges\")) + init_description(_(\"When selecting edges, automatically expand the selection to include adjacent edges.\")) + init_value(true)),\n\t\tm_node_selection(0),\n\t\tm_rubber_band(0)\n\t{\n\t\tcurrent_mode.connect_explicit_change_signal(sigc::mem_fun(*this, &implementation::on_selection_mode_changed));\n\t}\n\n\t/// Called by the signal system when the selection mode changes\n\tvoid on_selection_mode_changed(k3d::iunknown*)\n\t{\n\t\tconst nodes_t nodes = selected_nodes();\n\t\tfor(nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\tif(classes::MeshInstance() != (*node)->factory().factory_id())\n\t\t\t\tcontinue;\n\n\t\t\timesh_selection_sink* const mesh_selection_sink = dynamic_cast<imesh_selection_sink*>(*node);\n\t\t\tif(!mesh_selection_sink)\n\t\t\t\tcontinue;\n\n\t\t\timesh_source* const mesh_source = dynamic_cast<imesh_source*>(*node);\n\t\t\tif(!mesh_source)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(mesh_source->mesh_source_output().property_internal_value());\n\t\t\tif(!mesh)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::selection::set new_selection;\n\n\t\t\tif(keep_selection.internal_value())\n\t\t\t{\n\t\t\t\tnew_selection = boost::any_cast<k3d::selection::set>(mesh_selection_sink->mesh_selection_sink_input().property_internal_value());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<geometry::point_selection::storage> point_selection(geometry::point_selection::create(new_selection));\n\t\t\t\tgeometry::point_selection::append(*point_selection, 0.0);\n\n\t\t\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection(geometry::primitive_selection::create(new_selection));\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CONSTANT, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CURVE, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::EDGE, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::FACE, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PARAMETER, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PATCH, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::SURFACE, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::VERTEX, 0.0);\n\t\t\t}\n\n\t\t\tif(convert_selection.internal_value())\n\t\t\t{\n\t\t\t\tswitch(current_mode.internal_value())\n\t\t\t\t{\n\t\t\t\t\tcase CURVE:\n\t\t\t\t\t{\n\t\t\t\t\t\tstatic imesh_selection_algorithm* conversion = plugin::create<imesh_selection_algorithm>(\"MakeCurveSelection\");\n\t\t\t\t\t\treturn_if_fail(conversion);\n\t\t\t\t\t\tk3d::selection::set::append(conversion->create_mesh_selection(*mesh), new_selection);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase EDGE:\n\t\t\t\t\t{\n\t\t\t\t\t\tstatic imesh_selection_algorithm* conversion = plugin::create<imesh_selection_algorithm>(\"MakeEdgeSelection\");\n\t\t\t\t\t\treturn_if_fail(conversion);\n\t\t\t\t\t\tk3d::selection::set::append(conversion->create_mesh_selection(*mesh), new_selection);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase FACE:\n\t\t\t\t\t{\n\t\t\t\t\t\tstatic imesh_selection_algorithm* conversion = plugin::create<imesh_selection_algorithm>(\"MakeFaceSelection\");\n\t\t\t\t\t\treturn_if_fail(conversion);\n\t\t\t\t\t\tk3d::selection::set::append(conversion->create_mesh_selection(*mesh), new_selection);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase NODE:\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase PATCH:\n\t\t\t\t\t{\n\t\t\t\t\t\tstatic imesh_selection_algorithm* conversion = plugin::create<imesh_selection_algorithm>(\"MakePatchSelection\");\n\t\t\t\t\t\treturn_if_fail(conversion);\n\t\t\t\t\t\tk3d::selection::set::append(conversion->create_mesh_selection(*mesh), new_selection);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase POINT:\n\t\t\t\t\t{\n\t\t\t\t\t\tstatic imesh_selection_algorithm* conversion = plugin::create<imesh_selection_algorithm>(\"MakePointSelection\");\n\t\t\t\t\t\treturn_if_fail(conversion);\n\t\t\t\t\t\tk3d::selection::set::append(conversion->create_mesh_selection(*mesh), new_selection);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SURFACE:\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tproperty::set_internal_value(mesh_selection_sink->mesh_selection_sink_input(), new_selection);\n\t\t\tproperty::set_internal_value(**node, \"show_component_selection\", true);\n\t\t}\n\t}\n\n\tvoid on_node_selection_node_changed()\n\t{\n\t\tm_node_selection_metadata_connection.disconnect();\n\t\tm_node_selection_deleted_connection.disconnect();\n\t\tm_node_selection = 0;\n\t}\n\t\n\t/// Cached pointer to the document node selection node\n\tinode_selection* m_node_selection;\n\tsigc::connection m_node_selection_metadata_connection;\n\tsigc::connection m_node_selection_deleted_connection;\n\n\t/// Cached pointer to the rubber band highlighting node\n\tinode* m_rubber_band;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// state\n\nstate::state(idocument& Document) :\n\tinternal(implementation::instance(Document))\n{\n}\n\nconst mode state::current_mode()\n{\n\treturn internal.current_mode.internal_value();\n}\n\nvoid state::set_current_mode(const mode Mode)\n{\n\tinternal.current_mode.set_value(Mode);\n}\n\nsigc::connection state::connect_current_mode_changed_signal(const sigc::slot<void, ihint*>& Slot)\n{\n\treturn internal.current_mode.changed_signal().connect(Slot);\n}\n\nbool_t state::keep_selection()\n{\n\treturn internal.keep_selection.internal_value();\n}\n\nvoid state::set_keep_selection(const bool_t Keep)\n{\n\tinternal.keep_selection.set_value(Keep);\n}\n\nsigc::connection state::connect_keep_selection_changed_signal(const sigc::slot<void, ihint*>& Slot)\n{\n\treturn internal.keep_selection.changed_signal().connect(Slot);\n}\n\nbool_t state::convert_selection()\n{\n\treturn internal.convert_selection.internal_value();\n}\n\nvoid state::set_convert_selection(const bool_t Convert)\n{\n\tinternal.convert_selection.set_value(Convert);\n}\n\nsigc::connection state::connect_convert_selection_changed_signal(const sigc::slot<void, ihint*>& Slot)\n{\n\treturn internal.convert_selection.changed_signal().connect(Slot);\n}\n\nbool_t state::select_adjacent_edges()\n{\n\treturn internal.select_adjacent_edges.internal_value();\n}\n\nvoid state::set_select_adjacent_edges(const bool_t Expand)\n{\n\tinternal.select_adjacent_edges.set_value(Expand);\n}\n\nsigc::connection state::connect_select_adjacent_edges_changed_signal(const sigc::slot<void, ihint*>& Slot)\n{\n\treturn internal.select_adjacent_edges.changed_signal().connect(Slot);\n}\n\nconst nodes_t state::selected_nodes()\n{\n\treturn internal.selected_nodes();\n}\n\nvoid state::select(inode& Node)\n{\n\treturn_if_fail(internal.node_selection());\n\tinternal.node_selection()->select(Node, 1.0);\t\n}\n\nvoid state::select(const k3d::selection::record& Selection)\n{\n\tselect(k3d::selection::records(1, Selection));\n}\n\nvoid state::select(const k3d::selection::records& Selection)\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase CURVE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::CURVE, 1.0), Selection);\n\t\t\tbreak;\n\t\tcase FACE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::FACE, 1.0), Selection);\n\t\t\tbreak;\n\t\tcase NODE:\n\t\t\tselect_nodes(Selection);\n\t\t\tbreak;\n\t\tcase PATCH:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::PATCH, 1.0), Selection);\n\t\t\tbreak;\n\t\tcase POINT:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_points(1.0), Selection);\n\t\t\tbreak;\n\t\tcase EDGE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_edges(internal.select_adjacent_edges.internal_value(), 1.0), Selection);\n\t\t\tbreak;\n\t\tcase SURFACE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::SURFACE, 1.0), Selection);\n\t\t\tbreak;\n\t}\n}\n\nvoid state::select_nodes(const k3d::selection::records& Selection)\n{\n\tfor(k3d::selection::records::const_iterator record = Selection.begin(); record != Selection.end(); ++record)\n\t{\n\t\tif(inode* const node = k3d::selection::get_node(*record))\n\t\t{\n\t\t\tselect(*node);\n\t\t}\n\t}\n}\n\nvoid state::select_nodes(const nodes_t& Selection)\n{\n\tfor(nodes_t::const_iterator node = Selection.begin(); node != Selection.end(); ++node)\n\t\tselect(**node);\n}\n\nvoid state::select_all()\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase CURVE:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_components(k3d::selection::CURVE), true);\n\t\t\tbreak;\n\t\tcase FACE:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_components(k3d::selection::FACE), true);\n\t\t\tbreak;\n\t\tcase NODE:\n\t\t\tselect_all_nodes();\n\t\t\tbreak;\n\t\tcase PATCH:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_components(k3d::selection::PATCH), true);\n\t\t\tbreak;\n\t\tcase POINT:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_points(), true);\n\t\t\tbreak;\n\t\tcase EDGE:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_components(k3d::selection::EDGE), true);\n\t\t\tbreak;\n\t\tcase SURFACE:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_components(k3d::selection::SURFACE), true);\n\t\t\tbreak;\n\t}\n}\n\nvoid state::select_all_nodes()\n{\n\tconst nodes_t& nodes = internal.document.nodes().collection();\n\tfor(nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\tselect(**node);\n}\n\nvoid state::invert_selection()\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase CURVE:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_components(k3d::selection::CURVE), true);\n\t\t\tbreak;\n\t\tcase FACE:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_components(k3d::selection::FACE), true);\n\t\t\tbreak;\n\t\tcase NODE:\n\t\t\tinvert_all_nodes();\n\t\t\tbreak;\n\t\tcase PATCH:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_components(k3d::selection::PATCH), true);\n\t\t\tbreak;\n\t\tcase POINT:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_points(), true);\n\t\t\tbreak;\n\t\tcase EDGE:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_components(k3d::selection::EDGE), true);\n\t\t\tbreak;\n\t\tcase SURFACE:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_components(k3d::selection::SURFACE), true);\n\t\t\tbreak;\n\t}\n}\n\nvoid state::invert_all_nodes()\n{\n\tfor(k3d::inode_collection::nodes_t::const_iterator node = internal.document.nodes().collection().begin(); node != internal.document.nodes().collection().end(); ++node)\n\t{\n\t\tif(is_selected(**node))\n\t\t\tdeselect(**node);\n\t\telse\n\t\t\tselect(**node);\n\t}\n}\n\nconst bool_t state::is_selected(inode& Node)\n{\n\tif(internal.node_selection())\n\t\treturn internal.node_selection()->selection_weight(Node);\n}\n\nstatic const bool_t is_curve_selected(const k3d::selection::record& Record)\n{\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\tk3d::selection::id primitive_id = k3d::selection::null_id();\n\tconst k3d::mesh::primitive* primitive = 0;\n\n\tfor(k3d::selection::record::tokens_t::const_iterator token = Record.tokens.begin(); token != Record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(Record);\n\t\t\t\treturn_val_if_fail(node, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PRIMITIVE:\n\t\t\t{\n\t\t\t\tprimitive_id = token->id;\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive_id < mesh->primitives.size(), false);\n\t\t\t\tprimitive = mesh->primitives[primitive_id].get();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::CURVE:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive, false);\n\n\t\t\t\tconst k3d::selection::id curve = token->id;\n\n\t\t\t\tboost::scoped_ptr<k3d::linear_curve::const_primitive> linear_curve(k3d::linear_curve::validate(*mesh, *primitive));\n\t\t\t\tif(linear_curve)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(curve < linear_curve->curve_selections.size(), false);\n\t\t\t\t\treturn linear_curve->curve_selections[curve];\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::cubic_curve::const_primitive> cubic_curve(k3d::cubic_curve::validate(*mesh, *primitive));\n\t\t\t\tif(cubic_curve)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(curve < cubic_curve->curve_selections.size(), false);\n\t\t\t\t\treturn cubic_curve->curve_selections[curve];\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> nurbs_curve(k3d::nurbs_curve::validate(*mesh, *primitive));\n\t\t\t\tif(nurbs_curve)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(curve < nurbs_curve->curve_selections.size(), false);\n\t\t\t\t\treturn nurbs_curve->curve_selections[curve];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nstatic const bool_t is_edge_selected(const k3d::selection::record& Record)\n{\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\tk3d::selection::id primitive_id = k3d::selection::null_id();\n\tconst k3d::mesh::primitive* primitive = 0;\n\n\tfor(k3d::selection::record::tokens_t::const_iterator token = Record.tokens.begin(); token != Record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(Record);\n\t\t\t\treturn_val_if_fail(node, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PRIMITIVE:\n\t\t\t{\n\t\t\t\tprimitive_id = token->id;\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive_id < mesh->primitives.size(), false);\n\t\t\t\tprimitive = mesh->primitives[primitive_id].get();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::EDGE:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive, false);\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, *primitive));\n\t\t\t\treturn_val_if_fail(polyhedron, false);\n\n\t\t\t\tconst k3d::selection::id edge = token->id;\n\t\t\t\treturn_val_if_fail(edge < polyhedron->clockwise_edges.size(), false);\n\t\t\t\treturn polyhedron->edge_selections[edge];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nstatic const bool_t is_face_selected(const k3d::selection::record& Record)\n{\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\tk3d::selection::id primitive_id = k3d::selection::null_id();\n\tconst k3d::mesh::primitive* primitive = 0;\n\n\tfor(k3d::selection::record::tokens_t::const_iterator token = Record.tokens.begin(); token != Record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(Record);\n\t\t\t\treturn_val_if_fail(node, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PRIMITIVE:\n\t\t\t{\n\t\t\t\tprimitive_id = token->id;\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive_id < mesh->primitives.size(), false);\n\t\t\t\tprimitive = mesh->primitives[primitive_id].get();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::FACE:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive, false);\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, *primitive));\n\t\t\t\treturn_val_if_fail(polyhedron, false);\n\n\t\t\t\tconst k3d::selection::id face = token->id;\n\t\t\t\treturn_val_if_fail(face < polyhedron->face_first_loops.size(), false);\n\t\t\t\treturn polyhedron->face_selections[face];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nstatic const bool_t is_patch_selected(const k3d::selection::record& Record)\n{\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\tk3d::selection::id primitive_id = k3d::selection::null_id();\n\tconst k3d::mesh::primitive* primitive = 0;\n\n\tfor(k3d::selection::record::tokens_t::const_iterator token = Record.tokens.begin(); token != Record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(Record);\n\t\t\t\treturn_val_if_fail(node, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PRIMITIVE:\n\t\t\t{\n\t\t\t\tprimitive_id = token->id;\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive_id < mesh->primitives.size(), false);\n\t\t\t\tprimitive = mesh->primitives[primitive_id].get();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PATCH:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive, false);\n\n\t\t\t\tconst k3d::selection::id patch = token->id;\n\n\t\t\t\tboost::scoped_ptr<k3d::bilinear_patch::const_primitive> bilinear_patch(k3d::bilinear_patch::validate(*mesh, *primitive));\n\t\t\t\tif(bilinear_patch)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(patch < bilinear_patch->patch_selections.size(), false);\n\t\t\t\t\treturn bilinear_patch->patch_selections[patch];\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::bicubic_patch::const_primitive> bicubic_patch(k3d::bicubic_patch::validate(*mesh, *primitive));\n\t\t\t\tif(bicubic_patch)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(patch < bicubic_patch->patch_selections.size(), false);\n\t\t\t\t\treturn bicubic_patch->patch_selections[patch];\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs_patch(k3d::nurbs_patch::validate(*mesh, *primitive));\n\t\t\t\tif(nurbs_patch)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(patch < nurbs_patch->patch_selections.size(), false);\n\t\t\t\t\treturn nurbs_patch->patch_selections[patch];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nstatic const bool_t is_point_selected(const k3d::selection::record& Record)\n{\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\n\tfor(k3d::selection::record::tokens_t::const_iterator token = Record.tokens.begin(); token != Record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(Record);\n\t\t\t\treturn_val_if_fail(node, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(mesh->point_selection, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::POINT:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, false);\n\n\t\t\t\tconst k3d::selection::id point = token->id;\n\t\t\t\treturn_val_if_fail(point < mesh->point_selection->size(), false);\n\t\t\t\treturn (*mesh->point_selection)[point];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nconst bool_t state::is_selected(const k3d::selection::record& Record)\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase CURVE:\n\t\t\treturn is_curve_selected(Record);\n\t\tcase EDGE:\n\t\t\treturn is_edge_selected(Record);\n\t\tcase FACE:\n\t\t\treturn is_face_selected(Record);\n\t\tcase NODE:\n\t\t{\n\t\t\tk3d::inode* const node = k3d::selection::get_node(Record);\n\t\t\treturn node ? is_selected(*node) : false;\n\t\t}\n\t\tcase PATCH:\n\t\t\treturn is_patch_selected(Record);\n\t\tcase POINT:\n\t\t\treturn is_point_selected(Record);\n\t\tcase SURFACE:\n\t\t\tassert_not_implemented();\n\t\t\treturn false;\n\t}\n\n\treturn false;\n}\n\nvoid state::deselect(inode& Node)\n{\n\tif(internal.node_selection())\n\t\tinternal.node_selection()->select(Node, 0.0);\t\n}\n\nvoid state::deselect(const k3d::selection::record& Selection)\n{\n\tdeselect(k3d::selection::records(1, Selection));\n}\n\nvoid state::deselect(const k3d::selection::records& Selection)\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase CURVE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::CURVE, 0.0), Selection);\n\t\t\tbreak;\n\t\tcase FACE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::FACE, 0.0), Selection);\n\t\t\tbreak;\n\t\tcase NODE:\n\t\t\tdeselect_nodes(Selection);\n\t\t\tbreak;\n\t\tcase PATCH:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::PATCH, 0.0), Selection);\n\t\t\tbreak;\n\t\tcase POINT:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_points(0.0), Selection);\n\t\t\tbreak;\n\t\tcase EDGE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_edges(internal.select_adjacent_edges.internal_value(), 0.0), Selection);\n\t\t\tbreak;\n\t\tcase SURFACE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::SURFACE, 0.0), Selection);\n\t\t\tbreak;\n\t}\n}\n\nvoid state::deselect_nodes(const k3d::selection::records& Selection)\n{\n\tfor(k3d::selection::records::const_iterator record = Selection.begin(); record != Selection.end(); ++record)\n\t{\n\t\tif(k3d::inode* const node = k3d::selection::get_node(*record))\n\t\t\tdeselect(*node);\n\t}\n}\n\nvoid state::deselect_nodes(const nodes_t& Selection)\n{\n\tfor(nodes_t::const_iterator node = Selection.begin(); node != Selection.end(); ++node)\n\t\tdeselect(**node);\n}\n\nvoid state::deselect_all()\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase NODE:\n\t\t\tdeselect_all_nodes();\n\t\t\tbreak;\n\t\tcase CURVE:\n\t\tcase FACE:\n\t\tcase PATCH:\n\t\tcase POINT:\n\t\tcase EDGE:\n\t\tcase SURFACE:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::deselect_all(), false);\n\t\t\tbreak;\n\t}\n}\n\nvoid state::deselect_all_nodes()\n{\n\tif(internal.node_selection())\n\t\tinternal.node_selection()->deselect_all();\n}\n\ninode* state::rubber_band()\n{\n\treturn internal.rubber_band();\n}\n\nmesh* get_mesh(inode* Node, const k3d::selection::id& MeshID)\n{\n\treturn_val_if_fail(Node, 0);\n\treturn_val_if_fail(MeshID == 0, 0); // Should never get a node with more than one mesh!\n\n\timesh_source* const mesh_source = dynamic_cast<imesh_source*>(Node);\n\treturn_val_if_fail(mesh_source, 0);\n\n\treturn boost::any_cast<k3d::mesh*>(mesh_source->mesh_source_output().property_internal_value());\n}\n\n} // namespace selection\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/selection.h",
    "content": "#ifndef K3DSDK_NGUI_SELECTION_H\n#define K3DSDK_NGUI_SELECTION_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/selection.h>\n\n#include <iosfwd>\n#include <vector>\n\nnamespace k3d\n{\n\nclass idocument;\nclass inode;\n\nnamespace ngui\n{\n\nnamespace selection\n{\n\n/// Enumerates available interactive selection modes\nenum mode\n{\n\t/// Select curve components\n\tCURVE,\n\t/// Select face components\n\tFACE,\n\t/// Select individual nodes\n\tNODE,\n\t/// Select patches\n\tPATCH,\n\t/// Select points\n\tPOINT,\n\t/// Select polyhedron split-edges\n\tEDGE,\n\t/// Select surface components\n\tSURFACE,\n};\n\nstd::ostream& operator<<(std::ostream& Stream, const mode& Value);\nstd::istream& operator>>(std::istream& Stream, mode& Value);\n\n/// Provides convenience methods for manipulating the selection state of a document.\nclass state\n{\npublic:\n\tstate(idocument& Document);\n\n\t/// Returns the current selection mode.\n\tconst mode current_mode();\n\t/// Sets the current selection mode.\n\tvoid set_current_mode(const mode Mode);\n\t/// Connect a slot to a signal that will be emitted whenever the selection mode changes.\n\tsigc::connection connect_current_mode_changed_signal(const sigc::slot<void, ihint*>& Slot);\n\n\t/// Returns whether the current selection should be retained when switching the selection mode\n\tbool_t keep_selection();\n\t/// Sets whether the current selection should be retained when switching the selection mode\n\tvoid set_keep_selection(const bool_t Keep);\n\t/// Connect a slot to a signal that will be emitted whenever the keep selection mode changes.\n\tsigc::connection connect_keep_selection_changed_signal(const sigc::slot<void, ihint*>& Slot);\n\n\t/// Returns whether the current selection should be converted when switching the selection mode\n\tbool_t convert_selection();\n\t/// Sets whether the current selection should be converted when switching the selection mode\n\tvoid set_convert_selection(const bool_t Convert);\n\t/// Connect a slot to a signal that will be emitted whenever the convert selection mode changes.\n\tsigc::connection connect_convert_selection_changed_signal(const sigc::slot<void, ihint*>& Slot);\n\n\t/// Returns whether edge selections should be automatically expanded to include adjacent edges.\n\tbool_t select_adjacent_edges();\n\t/// Sets whether edge selections should be automatically expanded to include adjacent edges.\n\tvoid set_select_adjacent_edges(const bool_t Expand);\n\t/// Connect a slot to a signal that will be emitted whenever the adjacent edge selection state changes.\n\tsigc::connection connect_select_adjacent_edges_changed_signal(const sigc::slot<void, ihint*>& Slot);\n\n\t/// Returns the current set of selected nodes.\n\tconst nodes_t selected_nodes();\n\n\t/// Selects one node.\n\tvoid select(inode& Node);\n\t/// Selects a collection of components.\n\tvoid select(const k3d::selection::record& Selection);\n\t/// Selects a collection of components.\n\tvoid select(const k3d::selection::records& Selection);\n\t/// Selects a collection of nodes.\n\tvoid select_nodes(const k3d::selection::records& Selection);\n\t/// Selects a collection of nodes.\n\tvoid select_nodes(const nodes_t& Selection);\n\t/// Selects all nodes or components (depending on current selection mode).\n\tvoid select_all();\n\t/// Selects all nodes.\n\tvoid select_all_nodes();\n\n\t/// Inverts current selection.\n\tvoid invert_selection();\n\t/// Inverts all nodes.\n\tvoid invert_all_nodes();\n\n\t/// Returns true iff the given node is selected.\n\tconst bool_t is_selected(inode& Node);\n\t/// Returns true iff the given component is already selected.\n\tconst bool_t is_selected(const k3d::selection::record& Record);\n\n\t/// Deselects one node.\n\tvoid deselect(inode& Node);\n\t/// Deselects a collection of components.\n\tvoid deselect(const k3d::selection::record& Selection);\n\t/// Deselects a collection of components.\n\tvoid deselect(const k3d::selection::records& Selection);\n\t/// Deselects a collection of nodes.\n\tvoid deselect_nodes(const k3d::selection::records& Selection);\n\t/// Deselects a collection of nodes.\n\tvoid deselect_nodes(const nodes_t& Selection);\n\t/// Deselects all nodes or components (depending on current selection mode).\n\tvoid deselect_all();\n\t/// Deselects all nodes.\n\tvoid deselect_all_nodes();\n\n\t/// Returns a node suitable for interactive rubber-band operations\n\tinode* rubber_band();\n\nprivate:\n\tclass implementation;\n\timplementation& internal;\n};\n\nmesh* get_mesh(inode* Node, const k3d::selection::id& MeshID);\n\n} // namespace selection\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_SELECTION_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/selection_input_model.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <gdkmm/cursor.h>\n#include <gtkmm/widget.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/high_res_timer.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/selection_input_model.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/system.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// selection_input_model::implementation\n\nstruct selection_input_model::implementation :\n\tpublic k3d::property_collection\n{\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState),\n\t\tm_start_selection(k3d::selection::record::empty_record()),\n\t\tm_motion_type(MOTION_NONE),\n\t\tm_extended_mode(true),\n\t\tm_extended_component_mode(true),\n\t\tm_paint_mode(true),\n\t\tm_double_click_mode(true),\n\t\tm_pick_backfacing(false),\n\t\tm_paint_backfacing(false),\n\t\tm_rubber_band_backfacing(true)\n\t{\n\t}\n\n\tk3d::idocument& document()\n\t{\n\t\treturn m_document_state.document();\n\t}\n\n\tvoid on_button_down(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tm_start_selection = Viewport.pick_object(k3d::point2(Event.x, Event.y), m_pick_backfacing);\n\t\tm_motion_type = MOTION_NONE;\n\t}\n\n\tvoid on_button_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::key_modifiers modifiers = convert(Event.state);\n\n\t\tenum\n\t\t{\n\t\t\tNONE,\n\t\t\tSELECT,\n\t\t\tDESELECT,\n\t\t\tREPLACE\n\t\t} operation = NONE;\n\n\t\tif(modifiers.shift())\n\t\t{\n\t\t\toperation = SELECT;\n\t\t}\n\t\telse if(modifiers.control())\n\t\t{\n\t\t\toperation = DESELECT;\n\t\t}\n\t\telse\n\t\t{\n\t\t\toperation = REPLACE;\n\n\t\t\t// If something's under the mouse cursor\n\t\t\tif(k3d::selection::get_node(m_start_selection))\n\t\t\t{\n\t\t\t\tbool extended_mode;\n\t\t\t\tswitch(selection::state(m_document_state.document()).current_mode())\n\t\t\t\t{\n\t\t\t\t\tcase selection::NODE:\n\t\t\t\t\t\t// Extended selection\n\t\t\t\t\t\textended_mode = m_extended_mode;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// Extended component selection\n\t\t\t\t\t\textended_mode = m_extended_component_mode;\n\t\t\t\t}\n\n\t\t\t\tif(extended_mode)\n\t\t\t\t\toperation = selection::state(m_document_state.document()).is_selected(m_start_selection) ? DESELECT : SELECT;\n\t\t\t}\n\t\t}\n\n\t\tswitch(operation)\n\t\t{\n\t\t\tcase NONE:\n\t\t\t\tbreak;\n\n\t\t\tcase SELECT:\n\t\t\t{\n\t\t\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Select\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tselection::state(m_document_state.document()).select(m_start_selection);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase DESELECT:\n\t\t\t{\n\t\t\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Deselect\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tselection::state(m_document_state.document()).deselect(m_start_selection);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase REPLACE:\n\t\t\t{\n\t\t\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Replace\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tselection::state(m_document_state.document()).deselect_all();\n\t\t\t\tselection::state(m_document_state.document()).select(m_start_selection);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n    switch(operation)\n    {\n      case SELECT:\n      case REPLACE:\n      {\n        if(selection::NODE == selection::state(m_document_state.document()).current_mode())\n        {\n          if(k3d::inode* const node = k3d::selection::get_node(m_start_selection))\n          {\n            panel::mediator(m_document_state.document()).set_focus(*node, *this);\n          }\n        }\n\n        break;\n      }\n    }\n\t}\n\n\tvoid on_button_double_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tif(!m_double_click_mode)\n\t\t\treturn;\n\n\t\tswitch(selection::state(m_document_state.document()).current_mode())\n\t\t{\n\t\t\tcase selection::NODE:\n\t\t\t{\n\t\t\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Deselect All\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tselection::state(m_document_state.document()).deselect_all();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Node Selection\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tselection::state(m_document_state.document()).set_current_mode(selection::NODE);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_button_start_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tm_timer.restart();\n\n\t\tconst k3d::key_modifiers modifiers = convert(Event.state);\n\n\t\tif(modifiers.shift())\n\t\t{\n\t\t\t//m_motion_type = (m_paint_mode && !m_start_selection.empty()) ? MOTION_PAINT_SELECT : MOTION_RUBBER_BAND_SELECT;\n\t\t\tm_motion_type = MOTION_RUBBER_BAND_SELECT;\n\t\t}\n\t\telse if(modifiers.control())\n\t\t{\n\t\t\t//m_motion_type = (m_paint_mode && !m_start_selection.empty()) ? MOTION_PAINT_DESELECT : MOTION_RUBBER_BAND_DESELECT;\n\t\t\tm_motion_type = MOTION_RUBBER_BAND_DESELECT;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(m_start_selection.empty())\n\t\t\t{\n\t\t\t\tm_motion_type = MOTION_RUBBER_BAND_REPLACE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(m_paint_mode)\n\t\t\t\t{\n\t\t\t\t\tm_motion_type = selection::state(m_document_state.document()).is_selected(m_start_selection) ? MOTION_PAINT_DESELECT : MOTION_PAINT_SELECT;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tm_motion_type = selection::state(m_document_state.document()).is_selected(m_start_selection) ? MOTION_RUBBER_BAND_DESELECT : MOTION_RUBBER_BAND_SELECT;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tswitch(m_motion_type)\n\t\t{\n\t\t\tcase MOTION_NONE:\n\t\t\t\tbreak;\n\n\t\t\tcase MOTION_PAINT_SELECT:\n\t\t\t{\n\t\t\t\tk3d::start_state_change_set(m_document_state.document(), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tselection::state(m_document_state.document()).select(m_start_selection);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MOTION_PAINT_DESELECT:\n\t\t\t{\n\t\t\t\tk3d::start_state_change_set(m_document_state.document(), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tselection::state(m_document_state.document()).deselect(m_start_selection);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MOTION_RUBBER_BAND_REPLACE:\n\t\t\tcase MOTION_RUBBER_BAND_SELECT:\n\t\t\tcase MOTION_RUBBER_BAND_DESELECT:\n\t\t\t{\n\t\t\t\tif(inode* const rubber_band = selection::state(m_document_state.document()).rubber_band())\n\t\t\t\t{\n\t\t\t\t\tproperty::set_internal_value(*rubber_band, \"camera\", dynamic_cast<inode*>(Viewport.camera()));\n\t\t\t\t\tproperty::set_internal_value(*rubber_band, \"color\", color(1, 0, 0));\n\t\t\t\t\tproperty::set_internal_value(*rubber_band, \"opacity\", 0.1);\n\t\t\t\t\tproperty::set_internal_value(*rubber_band, \"border_color\", color(1, 0, 0));\n\t\t\t\t\tproperty::set_internal_value(*rubber_band, \"border_opacity\", 0.5);\n\t\t\t\t\tproperty::set_internal_value(*rubber_band, \"rectangle\", rectangle(Event.x, Event.x, Viewport.get_height() - Event.y, Viewport.get_height() - Event.y));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_button_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tswitch(m_motion_type)\n\t\t{\n\t\t\tcase MOTION_NONE:\n\t\t\t\tbreak;\n\n\t\t\tcase MOTION_PAINT_SELECT:\n\t\t\t{\n\t\t\t\tconst k3d::selection::record selection = Viewport.pick_object(k3d::point2(Event.x, Event.y), m_paint_backfacing);\n\t\t\t\tif(!selection::state(m_document_state.document()).is_selected(selection))\n\t\t\t\t{\n\t\t\t\t\tselection::state(m_document_state.document()).select(selection);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MOTION_PAINT_DESELECT:\n\t\t\t{\n\t\t\t\tconst k3d::selection::record selection = Viewport.pick_object(k3d::point2(Event.x, Event.y), m_paint_backfacing);\n\t\t\t\tif(selection::state(m_document_state.document()).is_selected(selection))\n\t\t\t\t{\n\t\t\t\t\tselection::state(m_document_state.document()).deselect(selection);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MOTION_RUBBER_BAND_REPLACE:\n\t\t\tcase MOTION_RUBBER_BAND_SELECT:\n\t\t\tcase MOTION_RUBBER_BAND_DESELECT:\n\t\t\t{\n\t\t\t\tif(inode* const rubber_band = selection::state(m_document_state.document()).rubber_band())\n\t\t\t\t{\n\t\t\t\t\trectangle new_rectangle = property::pipeline_value<rectangle>(*rubber_band, \"rectangle\");\n\t\t\t\t\tnew_rectangle.x2 = Event.x;\n\t\t\t\t\tnew_rectangle.y2 = Viewport.get_height() - Event.y;\n\t\t\t\t\tproperty::set_internal_value(*rubber_band, \"rectangle\", new_rectangle);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_button_end_drag(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tswitch(m_motion_type)\n\t\t{\n\t\t\tcase MOTION_NONE:\n\t\t\t\tbreak;\n\n\t\t\tcase MOTION_PAINT_SELECT:\n\t\t\t{\n\t\t\t\tk3d::finish_state_change_set(m_document_state.document(), _(\"Paint Select\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MOTION_PAINT_DESELECT:\n\t\t\t{\n\t\t\t\tk3d::finish_state_change_set(m_document_state.document(), _(\"Paint Deselect\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MOTION_RUBBER_BAND_REPLACE:\n\t\t\t{\n\t\t\t\trectangle selection_rectangle;\n\t\t\t\tif(inode* const rubber_band = selection::state(m_document_state.document()).rubber_band())\n\t\t\t\t{\n\t\t\t\t\tselection_rectangle = property::pipeline_value<rectangle>(*rubber_band, \"rectangle\");\n\t\t\t\t\tselection_rectangle.y1 = Viewport.get_height() - selection_rectangle.y1;\n\t\t\t\t\tselection_rectangle.y2 = Viewport.get_height() - selection_rectangle.y2;\n\t\t\t\t\tproperty::set_internal_value(*rubber_band, \"camera\", static_cast<inode*>(0));\n\t\t\t\t}\n\n\t\t\t\tconst k3d::selection::records selection = Viewport.get_object_selectables(selection_rectangle, m_rubber_band_backfacing);\n\n\t\t\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Rubber Band Replace\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tselection::state(m_document_state.document()).deselect_all();\n\t\t\t\tselection::state(m_document_state.document()).select(selection);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MOTION_RUBBER_BAND_SELECT:\n\t\t\t{\n\t\t\t\trectangle selection_rectangle;\n\t\t\t\tif(inode* const rubber_band = selection::state(m_document_state.document()).rubber_band())\n\t\t\t\t{\n\t\t\t\t\tselection_rectangle = property::pipeline_value<rectangle>(*rubber_band, \"rectangle\");\n\t\t\t\t\tselection_rectangle.y1 = Viewport.get_height() - selection_rectangle.y1;\n\t\t\t\t\tselection_rectangle.y2 = Viewport.get_height() - selection_rectangle.y2;\n\t\t\t\t\tproperty::set_internal_value(*rubber_band, \"camera\", static_cast<inode*>(0));\n\t\t\t\t}\n\n\t\t\t\tconst k3d::selection::records selection = Viewport.get_object_selectables(selection_rectangle, m_rubber_band_backfacing);\n\n\t\t\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Rubber Band Select\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tselection::state(m_document_state.document()).select(selection);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MOTION_RUBBER_BAND_DESELECT:\n\t\t\t{\n\t\t\t\trectangle selection_rectangle;\n\t\t\t\tif(inode* const rubber_band = selection::state(m_document_state.document()).rubber_band())\n\t\t\t\t{\n\t\t\t\t\tselection_rectangle = property::pipeline_value<rectangle>(*rubber_band, \"rectangle\");\n\t\t\t\t\tselection_rectangle.y1 = Viewport.get_height() - selection_rectangle.y1;\n\t\t\t\t\tselection_rectangle.y2 = Viewport.get_height() - selection_rectangle.y2;\n\t\t\t\t\tproperty::set_internal_value(*rubber_band, \"camera\", static_cast<inode*>(0));\n\t\t\t\t}\n\n\t\t\t\tconst k3d::selection::records selection = Viewport.get_object_selectables(selection_rectangle, m_rubber_band_backfacing);\n\n\t\t\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Rubber Band Deselect\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tselection::state(m_document_state.document()).deselect(selection);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tm_motion_type = MOTION_NONE;\n\t}\n\n\t/// Stores a reference to the owning document\n\tdocument_state& m_document_state;\n\n\tk3d::selection::record m_start_selection;\n\tenum\n\t{\n\t\tMOTION_NONE,\n\t\tMOTION_PAINT_SELECT,\n\t\tMOTION_PAINT_DESELECT,\n\t\tMOTION_RUBBER_BAND_REPLACE,\n\t\tMOTION_RUBBER_BAND_SELECT,\n\t\tMOTION_RUBBER_BAND_DESELECT,\n\t} m_motion_type;\n\n\tbool m_extended_mode;\n\tbool m_extended_component_mode;\n\tbool m_paint_mode;\n\tbool m_double_click_mode;\n\tbool m_pick_backfacing;\n\tbool m_paint_backfacing;\n\tbool m_rubber_band_backfacing;\n\n\tk3d::timer m_timer;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// selection_input_model\n\nselection_input_model::selection_input_model(document_state& DocumentState) :\n\tm_implementation(new implementation(DocumentState))\n{\n}\n\nselection_input_model::~selection_input_model()\n{\n\tdelete m_implementation;\n}\n\nvoid selection_input_model::set_extended_mode(const bool Enabled)\n{\n\tm_implementation->m_extended_mode = Enabled;\n}\n\nvoid selection_input_model::set_extended_component_mode(const bool Enabled)\n{\n\tm_implementation->m_extended_component_mode = Enabled;\n}\n\nvoid selection_input_model::set_paint_mode(const bool Enabled)\n{\n\tm_implementation->m_paint_mode = Enabled;\n}\n\nvoid selection_input_model::set_double_click_mode(const bool Enabled)\n{\n\tm_implementation->m_double_click_mode = Enabled;\n}\n\nvoid selection_input_model::set_pick_backfacing(const bool Enabled)\n{\n\tm_implementation->m_pick_backfacing = Enabled;\n}\n\nvoid selection_input_model::set_paint_backfacing(const bool Enabled)\n{\n\tm_implementation->m_paint_backfacing = Enabled;\n}\n\nvoid selection_input_model::set_rubber_band_backfacing(const bool Enabled)\n{\n\tm_implementation->m_rubber_band_backfacing = Enabled;\n}\n\nvoid selection_input_model::on_button_down(viewport::control& Viewport, const GdkEventButton& Event)\n{\n\tm_implementation->on_button_down(Viewport, Event);\n}\n\nvoid selection_input_model::on_button_click(viewport::control& Viewport, const GdkEventButton& Event)\n{\n\tm_implementation->on_button_click(Viewport, Event);\n}\n\nvoid selection_input_model::on_button_double_click(viewport::control& Viewport, const GdkEventButton& Event)\n{\n\tm_implementation->on_button_double_click(Viewport, Event);\n}\n\nvoid selection_input_model::on_button_start_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n{\n\tm_implementation->on_button_start_drag(Viewport, Event);\n}\n\nvoid selection_input_model::on_button_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n{\n\tm_implementation->on_button_drag(Viewport, Event);\n}\n\nvoid selection_input_model::on_button_end_drag(viewport::control& Viewport, const GdkEventButton& Event)\n{\n\tm_implementation->on_button_end_drag(Viewport, Event);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/selection_input_model.h",
    "content": "#ifndef K3DSDK_NGUI_SELECTION_INPUT_MODEL_H\n#define K3DSDK_NGUI_SELECTION_INPUT_MODEL_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// selection_input_model\n\n/// Input model implementation that handles interactive selection\nclass selection_input_model\n{\npublic:\n\tselection_input_model(document_state& DocumentState);\n\t~selection_input_model();\n\n\tvoid set_extended_mode(const bool Enabled);\n\tvoid set_extended_component_mode(const bool Enabled);\n\tvoid set_paint_mode(const bool Enabled);\n\tvoid set_double_click_mode(const bool Enabled);\n\tvoid set_pick_backfacing(const bool Enabled);\n\tvoid set_paint_backfacing(const bool Enabled);\n\tvoid set_rubber_band_backfacing(const bool Enabled);\n\n\tvoid on_button_down(viewport::control& Viewport, const GdkEventButton& Event);\n\tvoid on_button_click(viewport::control& Viewport, const GdkEventButton& Event);\n\tvoid on_button_double_click(viewport::control& Viewport, const GdkEventButton& Event);\n\tvoid on_button_start_drag(viewport::control& Viewport, const GdkEventMotion& Event);\n\tvoid on_button_drag(viewport::control& Viewport, const GdkEventMotion& Event);\n\tvoid on_button_end_drag(viewport::control& Viewport, const GdkEventButton& Event);\n\nprivate:\n\tstruct implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_SELECTION_INPUT_MODEL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/selection_tool.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/ngui/basic_viewport_input_model.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/navigation_input_model.h>\n#include <k3dsdk/ngui/selection_input_model.h>\n#include <k3dsdk/ngui/selection_tool.h>\n\n#include <k3dsdk/data.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/property_collection.h>\n\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\ntypedef k3d_data(bool, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) bool_property_t;\n\nnamespace detail\n{\n\n/// Toggles the value of the given boolean property\nvoid toggle_property(bool_property_t& Property)\n{\n\tif (Property.internal_value())\n\t\tProperty.set_value(false);\n\telse\n\t\tProperty.set_value(true);\n}\n\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// selection_tool::implementation\n\nclass selection_tool::implementation :\n\tpublic k3d::property_collection\n{\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState),\n\t\tm_navigation_model(DocumentState),\n\t\tm_selection_model(DocumentState),\n\t\tm_extended_mode(init_owner(*this) + init_name(\"extended_mode\") + init_label(_(\"Extended Selection Mode\")) + init_description(_(\"Extended mode adds newly clicked geometry instead of replacing selection\")) + init_value(false)),\n\t\tm_extended_component_mode(init_owner(*this) + init_name(\"extended_component_mode\") + init_label(_(\"Extended Component Selection Mode\")) + init_description(_(\"Extended mode adds newly clicked components instead of replacing selection\")) + init_value(false)),\n\t\tm_paint_mode(init_owner(*this) + init_name(\"component_paint_mode\") + init_label(_(\"Component Paint Mode\")) + init_description(_(\"Use mouse pointer to paint-select geometry components\")) + init_value(true)),\n\t\tm_double_click_mode(init_owner(*this) + init_name(\"double_click_mode\") + init_label(_(\"Double Click Mode\")) + init_description(_(\"Double click switches back to object selection mode when clicking on nothing\")) + init_value(true)),\n\t\tm_pick_backfacing(init_owner(*this) + init_name(\"pick_backfacing\") + init_label(_(\"Pick Backfacing\")) + init_description(_(\"Select backfacing components when picking (clicking)\")) + init_value(false)),\n\t\tm_paint_backfacing(init_owner(*this) + init_name(\"paint_backfacing\") + init_label(_(\"Paint Backfacing\")) + init_description(_(\"Select backfacing components when painting a selection\")) + init_value(false)),\n\t\tm_rubber_band_backfacing(init_owner(*this) + init_name(\"rubber_band_backfacing\") + init_label(_(\"Rubber Band Backfacing\")) + init_description(_(\"Select backfacing components when rubber band selecting\")) + init_value(true))\n\t{\n\t\tm_input_model.connect_lbutton_down(sigc::mem_fun(m_selection_model, &selection_input_model::on_button_down));\n\t\tm_input_model.connect_lbutton_click(sigc::mem_fun(m_selection_model, &selection_input_model::on_button_click));\n\t\tm_input_model.connect_lbutton_double_click(sigc::mem_fun(m_selection_model, &selection_input_model::on_button_double_click));\n\t\tm_input_model.connect_lbutton_start_drag(sigc::mem_fun(m_selection_model, &selection_input_model::on_button_start_drag));\n\t\tm_input_model.connect_lbutton_drag(sigc::mem_fun(m_selection_model, &selection_input_model::on_button_drag));\n\t\tm_input_model.connect_lbutton_end_drag(sigc::mem_fun(m_selection_model, &selection_input_model::on_button_end_drag));\n\n\t\tm_input_model.connect_mbutton_click(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_click));\n\t\tm_input_model.connect_mbutton_start_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_start_drag));\n\t\tm_input_model.connect_mbutton_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_drag));\n\t\tm_input_model.connect_mbutton_end_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_end_drag));\n\t\tm_input_model.connect_rbutton_click(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_click));\n\t\tm_input_model.connect_rbutton_start_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_start_drag));\n\t\tm_input_model.connect_rbutton_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_drag));\n\t\tm_input_model.connect_rbutton_end_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_end_drag));\n\t\tm_input_model.connect_scroll(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_scroll));\n\t\t\n\t\tm_selection_model.set_extended_mode(m_extended_mode.internal_value());\n\t\tm_selection_model.set_extended_component_mode(m_extended_component_mode.internal_value());\n\t\tm_selection_model.set_paint_mode(m_paint_mode.internal_value());\n\t\tm_selection_model.set_double_click_mode(m_double_click_mode.internal_value());\n\n\t\tm_extended_mode.changed_signal().connect(sigc::mem_fun(*this, &implementation::on_extended_mode_changed));\n\t\tm_extended_component_mode.changed_signal().connect(sigc::mem_fun(*this, &implementation::on_extended_component_mode_changed));\n\t\tm_paint_mode.changed_signal().connect(sigc::mem_fun(*this, &implementation::on_paint_mode_changed));\n\t\tm_double_click_mode.changed_signal().connect(sigc::mem_fun(*this, &implementation::on_double_click_mode_changed));\n\t\tm_pick_backfacing.changed_signal().connect(sigc::mem_fun(*this, &implementation::on_pick_backfacing_changed));\n\t\tm_paint_backfacing.changed_signal().connect(sigc::mem_fun(*this, &implementation::on_paint_backfacing_changed));\n\t\tm_rubber_band_backfacing.changed_signal().connect(sigc::mem_fun(*this, &implementation::on_rubber_band_backfacing_changed));\n\t}\n\n\tk3d::idocument& document()\n\t{\n\t\treturn m_document_state.document();\n\t}\n\n\tvoid on_extended_mode_changed(k3d::iunknown*)\n\t{\n\t\tm_selection_model.set_extended_mode(m_extended_mode.internal_value());\n\t}\n\n\tvoid on_extended_component_mode_changed(k3d::iunknown*)\n\t{\n\t\tm_selection_model.set_extended_component_mode(m_extended_component_mode.internal_value());\n\t}\n\n\tvoid on_paint_mode_changed(k3d::iunknown*)\n\t{\n\t\tm_selection_model.set_paint_mode(m_paint_mode.internal_value());\n\t}\n\n\tvoid on_double_click_mode_changed(k3d::iunknown*)\n\t{\n\t\tm_selection_model.set_double_click_mode(m_double_click_mode.internal_value());\n\t}\n\t\n\tvoid on_pick_backfacing_changed(k3d::iunknown*)\n\t{\n\t\tm_selection_model.set_pick_backfacing(m_pick_backfacing.internal_value());\n\t}\n\t\n\tvoid on_paint_backfacing_changed(k3d::iunknown*)\n\t{\n\t\tm_selection_model.set_paint_backfacing(m_paint_backfacing.internal_value());\n\t}\n\t\n\tvoid on_rubber_band_backfacing_changed(k3d::iunknown*)\n\t{\n\t\tm_selection_model.set_rubber_band_backfacing(m_rubber_band_backfacing.internal_value());\n\t}\n\n\tdocument_state& m_document_state;\n\t/// Provides interactive navigation behavior\n\tnavigation_input_model m_navigation_model;\n\t/// Provides interactive selection behavior\n\tselection_input_model m_selection_model;\n\t/// Dispatches incoming user input events\n\tbasic_viewport_input_model m_input_model;\n\n\t/// Stores extended selection toggle\n\tbool_property_t m_extended_mode;\n\t/// Stores extended component selection toggle\n\tbool_property_t m_extended_component_mode;\n\t/// Store box selection / paint mode toggle\n\tbool_property_t m_paint_mode;\n\t/// Enables double-click actions\n\tbool_property_t m_double_click_mode;\n\t/// Pick backfacing elements\n\tbool_property_t m_pick_backfacing;\n\t/// Paint-select backfacing elements\n\tbool_property_t m_paint_backfacing;\n\t/// Rubber-band select backfacing elements\n\tbool_property_t m_rubber_band_backfacing;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// selection_tool\n\nselection_tool::selection_tool(document_state& DocumentState, const std::string& Name) :\n\tbase(DocumentState, Name),\n\tm_implementation(new implementation(DocumentState))\n{\n}\n\nselection_tool::~selection_tool()\n{\n\tdelete m_implementation;\n}\n\nbool selection_tool::pick_backfacing()\n{\n\treturn m_implementation->m_pick_backfacing.internal_value();\n}\n\nbool selection_tool::paint_backfacing()\n{\n\treturn m_implementation->m_paint_backfacing.internal_value();\n}\n\nbool selection_tool::rubber_band_backfacing()\n{\n\treturn m_implementation->m_rubber_band_backfacing.internal_value();\n}\n\nk3d::iproperty_collection* selection_tool::get_property_collection()\n{\n\treturn m_implementation;\n}\n\nviewport_input_model& selection_tool::get_input_model()\n{\n\treturn m_implementation->m_input_model;\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/selection_tool.h",
    "content": "#ifndef K3DSDK_NGUI_SELECTION_TOOL_H\n#define K3DSDK_NGUI_SELECTION_TOOL_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/ngui/tool.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\t\n/////////////////////////////////////////////////////////////////////////////\n// selection_tool\n\n/// tool implementation that provides geometry selection and viewport navigation\nclass selection_tool :\n\tpublic tool\n{\n\ttypedef tool base;\n\npublic:\n\tselection_tool(document_state& DocumentState, const std::string& Name);\n\t~selection_tool();\n\n\tconst k3d::string_t tool_type() { return \"selection_tool\"; }\n\n\t/// True if backfacing components are to be picked\n\tbool pick_backfacing();\n\t\n\t/// True if backfacing components are to be paint-selected\n\tbool paint_backfacing();\n\t\n\t/// True if backfacing components are to be rubber-band selected\n\tbool rubber_band_backfacing();\n\nprotected:\n\tvirtual k3d::iproperty_collection* get_property_collection();\n\tvirtual viewport_input_model& get_input_model();\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_SELECTION_TOOL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/spin_button.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n\t\\author Dan Erikson <derikson@montana.com>\n\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include <gtkmm/arrow.h>\n#include <gtkmm/button.h>\n#include <gtkmm/entry.h>\n#include <gtkmm/tooltips.h>\n#include <gtkmm/window.h>\n\n#include <k3dsdk/ngui/hotkey_entry.h>\n#include <k3dsdk/ngui/interactive.h>\n#include <k3dsdk/ngui/spin_button.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/high_res_timer.h>\n#include <k3dsdk/imeasurement_property.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/point2.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/string_cast.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iomanip>\n#include <sstream>\n\nusing namespace k3d::measurement;\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace spin_button\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// property_model\n\n/// Implementation of spin_button::imodel for use with k3d::iproperty objects\nclass property_model :\n\tpublic imodel\n{\npublic:\n\tproperty_model(k3d::iproperty& Data) :\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data))\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\tGlib::ustring result = m_readable_data.property_label();\n\n\t\tif(m_readable_data.property_node())\n\t\t\tresult = m_readable_data.property_node()->name() + \" \" + result;\n\n\t\treturn result;\n\t}\n\n\tk3d::bool_t writable()\n\t{\n\t\treturn m_writable_data ? true : false;\n\t}\n\n\tk3d::double_t value()\n\t{\n\t\tconst std::type_info& type = m_readable_data.property_type();\n\n\t\tif(type == typeid(k3d::int32_t))\n\t\t\treturn boost::any_cast<k3d::int32_t>(m_readable_data.property_internal_value());\n\t\telse if(type == typeid(k3d::uint32_t))\n\t\t\treturn boost::any_cast<k3d::uint32_t>(m_readable_data.property_internal_value());\n\t\telse if(type == typeid(k3d::float_t))\n\t\t\treturn boost::any_cast<k3d::float_t>(m_readable_data.property_internal_value());\n\t\telse if(type == typeid(k3d::double_t))\n\t\t\treturn boost::any_cast<k3d::double_t>(m_readable_data.property_internal_value());\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown property type: \" << type.name() << std::endl;\n\n\t\treturn 0;\n\t}\n\n\tvoid set_value(const double Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\n\t\tconst std::type_info& type = m_readable_data.property_type();\n\n\t\tif(type == typeid(k3d::int32_t))\n\t\t\tm_writable_data->property_set_value(static_cast<k3d::int32_t>(k3d::round(Value)));\n\t\telse if(type == typeid(k3d::uint32_t))\n\t\t\tm_writable_data->property_set_value(static_cast<k3d::uint32_t>(k3d::round(Value)));\n\t\telse if(type == typeid(k3d::float_t))\n\t\t\tm_writable_data->property_set_value(static_cast<k3d::float_t>(Value));\n\t\telse if(type == typeid(k3d::double_t))\n\t\t\tm_writable_data->property_set_value(static_cast<k3d::double_t>(Value));\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown property type: \" << type.name() << std::endl;\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_readable_data.property_changed_signal().connect(sigc::hide(Slot));\n\t}\n\n\tk3d::double_t step_increment()\n\t{\n\t\tif(k3d::imeasurement_property* const measurement_property = dynamic_cast<k3d::imeasurement_property*>(&m_readable_data))\n\t\t\treturn measurement_property->property_step_increment();\n\n\t\treturn 1.0;\n\t}\n\n\tconst std::type_info& units()\n\t{\n\t\tif(k3d::imeasurement_property* const measurement_property = dynamic_cast<k3d::imeasurement_property*>(&m_readable_data))\n\t\t\treturn measurement_property->property_units();\n\n\t\treturn typeid(k3d::measurement::scalar);\n\t}\n\nprivate:\n\tproperty_model(const property_model& RHS);\n\tproperty_model& operator=(const property_model& RHS);\n\t~property_model() {}\n\n\tk3d::iproperty& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// model\n\nimodel* const model(k3d::iproperty& Property)\n{\n\treturn new property_model(Property);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control::implementation\n\nclass control::implementation\n{\npublic:\n\timplementation(imodel* const Model, k3d::istate_recorder* const StateRecorder) :\n\t\tm_model(Model),\n\t\tm_state_recorder(StateRecorder),\n\t\tm_step_increment(Model->step_increment()),\n\t\tm_units(&Model->units()),\n\t\tm_entry(new hotkey_entry()),\n\t\tm_up_button(new Gtk::Button()),\n\t\tm_down_button(new Gtk::Button()),\n\t\tm_dragging(false),\n\t\tm_up_button_pressed(false),\n\t\tm_drag_increment(0),\n\t\tm_drag_first_timeout(false),\n\t\tm_tap_started(false)\n\t{\n\t\tassert(m_model.get());\n\t\tm_up_button->get_accessible()->set_name(\"up\");\n\t\tm_down_button->get_accessible()->set_name(\"down\");\n\t}\n\n\t/// Stores a reference to the underlying data object\n\tconst boost::scoped_ptr<imodel> m_model;\n\t/// Stores a reference to the (optional) object for recording undo/redo data\n\tk3d::istate_recorder* const m_state_recorder;\n\n\t/// Stores the increment used to modify the button's value using the spin controls\n\tdouble m_step_increment;\n\t/// Stores the type of type of real-world-units to use for formatting & parsing\n\tconst std::type_info* m_units;\n\n\t/// Entry control for display and manual input\n\thotkey_entry* const m_entry;\n\t/// Button control for incremental input\n\tGtk::Button* const m_up_button;\n\t/// Button control for incremental input\n\tGtk::Button* const m_down_button;\n\n\t/// Set to true during dragging\n\tbool m_dragging;\n\t/// Stores whether the 'up' button was pressed\n\tbool m_up_button_pressed;\n\t/// Stores the increment used to modify data during dragging\n\tdouble m_drag_increment;\n\t\n\t/// Stores the most recent mouse position in screen coordinates during dragging\n\tk3d::point2 m_last_mouse;\n\t/// Stores the drag timeout connection\n\tsigc::connection m_drag_timeout;\n\t/// Stores whether this is the first drag timeout\n\tbool m_drag_first_timeout;\n\t/// Prevents keyboard auto-repeat from sending drag-sensitivity through the roof\n\tbool m_tap_started;\n\tk3d::timer m_timer;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(imodel* const Model, k3d::istate_recorder* const StateRecorder) :\n\tbase(2, 8, true),\n\tm_implementation(new implementation(Model, StateRecorder))\n{\n\tset_name(\"k3d-spin-button\");\n\n\tm_implementation->m_entry->set_name(\"entry\");\n\tm_implementation->m_entry->set_width_chars(8);\n\tm_implementation->m_entry->signal_focus_out_event().connect(sigc::mem_fun(*this, &control::on_entry_focus_out_event));\n\tm_implementation->m_entry->signal_activate().connect(sigc::mem_fun(*this, &control::on_entry_activated));\n\tattach(*manage(m_implementation->m_entry), 0, 6, 0, 2);\n\n\tif(m_implementation->m_model->writable())\n\t{\n\t\t// Setup up and down buttons\n\t\tsetup_arrow_button(m_implementation->m_up_button, Gtk::ARROW_UP, true);\n\t\tsetup_arrow_button(m_implementation->m_down_button, Gtk::ARROW_DOWN, false);\n\n\t\t// Setup VBox containing arrows\n\t\tattach(*manage(m_implementation->m_up_button), 6, 7, 0, 1);\n\t\tattach(*manage(m_implementation->m_down_button), 6, 7, 1, 2);\n\n\t\tm_implementation->m_entry->set_tooltip_text(_(\"Enter a new value.  Real-world units and simple math expressions are allowed.\"));\n\t\tm_implementation->m_up_button->set_tooltip_text(_(\"LMB-Drag to modify, LMB-Click to step, Tap Shift and Control while dragging to change sensitivity.\"));\n\t\tm_implementation->m_down_button->set_tooltip_text(_(\"LMB-Drag to modify, LMB-Click to step, Tap Shift and Control while dragging to change sensitivity.\"));\n\n\t\t// Make sure buttons can't get the focus (makes tabbing difficult)\n\t\tm_implementation->m_up_button->unset_flags(Gtk::CAN_FOCUS);\n\t\tm_implementation->m_down_button->unset_flags(Gtk::CAN_FOCUS);\n\t}\n\telse\n\t{\n\t\tm_implementation->m_entry->set_editable(false);\n\t}\n\n\t// Synchronize the view with the data source ...\n\ton_data_changed();\n\n\t// We want to be notified if the data source changes ...\n\tm_implementation->m_model->connect_changed_signal(sigc::mem_fun(*this, &control::on_data_changed));\n}\n\ncontrol::~control()\n{\n\tdelete m_implementation;\n}\n\nvoid control::set_step_increment(const double StepIncrement)\n{\n\tm_implementation->m_step_increment = StepIncrement;\n\ton_data_changed();\n}\n\nvoid control::set_units(const std::type_info& Units)\n{\n\tm_implementation->m_units = &Units;\n\ton_data_changed();\n}\n\nvoid control::setup_arrow_button(Gtk::Button* Button, const Gtk::ArrowType ArrowType, const bool Up)\n{\n\tGtk::Arrow* const arrow = Gtk::manage(new Gtk::Arrow(ArrowType, Gtk::SHADOW_NONE));\n\tarrow->set_size_request(0, 0);\n\n\tButton->set_size_request(0, 0);\n\tButton->add(*arrow);\n\n\tButton->signal_pressed().connect(sigc::bind(sigc::mem_fun(*this, &control::on_drag_pressed), Up));\n\tButton->signal_released().connect(sigc::mem_fun(*this, &control::on_drag_released));\n\n\tif(Up)\n\t\tButton->signal_clicked().connect(sigc::mem_fun(*this, &control::increment));\n\telse\n\t\tButton->signal_clicked().connect(sigc::mem_fun(*this, &control::decrement));\n\n\tButton->add_events(Gdk::BUTTON_MOTION_MASK | Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK);\n\tButton->signal_motion_notify_event().connect(sigc::mem_fun(*this, &control::on_drag_motion_notify_event));\n\tButton->signal_key_press_event().connect(sigc::mem_fun(*this, &control::on_drag_key_press_event));\n\tButton->signal_key_release_event().connect(sigc::mem_fun(*this, &control::on_drag_key_release_event));\n}\n\nvoid control::on_data_changed()\n{\n\tdisplay_value(m_implementation->m_model->value());\n}\n\nvoid control::display_value(const double Value)\n{\n\tstd::ostringstream buffer;\n\n\tif(*m_implementation->m_units == typeid(k3d::measurement::angle)) // Display angles in degrees, even though the internal unit is radians\n\t\tbuffer << k3d::string_cast(boost::format(\"%g\") % k3d::measurement::convert(k3d::measurement::quantity<k3d::measurement::angle>(Value, k3d::measurement::angle_units(\"rad\")), k3d::measurement::angle_units(\"deg\")).value()) << \" deg\";\n\telse if(*m_implementation->m_units == typeid(k3d::measurement::area))\n\t\tbuffer << k3d::string_cast(boost::format(\"%g\") % Value) << \" m^2\";\n\telse if(*m_implementation->m_units == typeid(k3d::measurement::distance))\n\t\tbuffer << k3d::string_cast(boost::format(\"%g\") % Value) << \" m\";\n\telse if(*m_implementation->m_units == typeid(k3d::measurement::force))\n\t\tbuffer << k3d::string_cast(boost::format(\"%g\") % Value) << \" N\";\n\telse if(*m_implementation->m_units == typeid(k3d::measurement::mass))\n\t\tbuffer << k3d::string_cast(boost::format(\"%g\") % Value) << \" Kg\";\n\telse if(*m_implementation->m_units == typeid(k3d::measurement::pressure))\n\t\tbuffer << k3d::string_cast(boost::format(\"%g\") % Value) << \" Pa\";\n\telse if(*m_implementation->m_units == typeid(k3d::measurement::time))\n\t\tbuffer << k3d::string_cast(boost::format(\"%g\") % Value) << \" s\";\n\telse if(*m_implementation->m_units == typeid(k3d::measurement::volume))\n\t\tbuffer << k3d::string_cast(boost::format(\"%g\") % Value) << \" m^3\";\n\telse if(*m_implementation->m_units == typeid(scalar))\n\t\tbuffer << k3d::string_cast(boost::format(\"%g\") % Value);\n\telse\n\t\tk3d::log() << error << \"Unknown physical unit - \" << m_implementation->m_units->name() << std::endl;\n\n\tm_implementation->m_entry->set_text(buffer.str());\n}\n\nbool control::on_entry_focus_out_event(GdkEventFocus* Event)\n{\n\ton_manual_value();\n\treturn false;\n}\n\nvoid control::on_entry_activated()\n{\n\ton_manual_value();\n\n\t/** \\todo What the heck is this? */\n\t// Set focus to the arrows such as hotkeys work again\n\tm_implementation->m_down_button->set_flags(Gtk::CAN_FOCUS);\n\tm_implementation->m_down_button->grab_focus();\n\tm_implementation->m_down_button->unset_flags(Gtk::CAN_FOCUS);\n}\n\nvoid control::on_manual_value()\n{\n\tm_implementation->m_entry->select_region(0, 0);\n\tconst k3d::string_t new_text = m_implementation->m_entry->get_text();\n\n\t// Default our results to the current value, in case it doesn't parse ...\n\tconst double original_value = m_implementation->m_model->value();\n\tdouble new_value = original_value;\n\n\t// Parse the input expression into value converting it to SI units automatically (it can do mathematical expressions, too, for fun)\n\tif(!k3d::measurement::parse(new_text, new_value, m_implementation->m_units))\n\t{\n\t\tk3d::log() << error << \"Couldn't parse expression: \" << new_text << \" restoring original value\" << std::endl;\n\t\tdisplay_value(original_value);\n\t\treturn;\n\t}\n\n\t// If the value has changed, record it ...\n\tif(new_value != original_value)\n\t{\n\t\t// Turn this into an undo/redo -able event ...\n\t\tif(m_implementation->m_state_recorder)\n\t\t\tm_implementation->m_state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t\tm_implementation->m_model->set_value(new_value);\n\n\t\t// Turn this into an undo/redo -able event ...\n\t\tif(m_implementation->m_state_recorder)\n\t\t\tm_implementation->m_state_recorder->commit_change_set(m_implementation->m_state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), change_message(m_implementation->m_model->value()), K3D_CHANGE_SET_CONTEXT);\n\t}\n\telse\n\t{\n\t\tdisplay_value(new_value);\n\t}\n}\n\nvoid control::on_drag_pressed(const bool Up)\n{\n\t// Save which button was pressed\n\tm_implementation->m_up_button_pressed = Up;\n\n\tm_implementation->m_up_button->set_flags(Gtk::CAN_FOCUS);\n\tm_implementation->m_down_button->set_flags(Gtk::CAN_FOCUS);\n\tm_implementation->m_up_button->grab_focus();\n\tm_implementation->m_down_button->grab_focus();\n\n\t// Get the current mouse coordinates ...\n\tm_implementation->m_last_mouse = interactive::get_pointer();\n\n\t// Calculate the increment we should use while dragging ...\n\tm_implementation->m_drag_increment = std::abs(m_implementation->m_step_increment) * 0.2;\n\tif(!m_implementation->m_drag_increment)\n\t\tm_implementation->m_drag_increment = 0.002;\n\n\t// Connect idle timeout handler, called every 200ms\n\tm_implementation->m_drag_timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this, &control::on_drag_timeout), 200);\n\tm_implementation->m_drag_first_timeout = true;\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_implementation->m_state_recorder)\n\t\tm_implementation->m_state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n}\n\nbool control::on_drag_motion_notify_event(GdkEventMotion* Event)\n{\n\t// Get new mouse coordinates\n\tconst k3d::point2 mouse = interactive::get_pointer();\n\n\t// Don't switch to drag mode until the mouse really moved\n\tif(!m_implementation->m_dragging)\n\t{\n\t\tif(k3d::distance(mouse, m_implementation->m_last_mouse) < 10)\n\t\t\treturn false;\n\n\t\tm_implementation->m_dragging = true;\n\t\tm_implementation->m_timer.restart();\n\t}\n\n\t// Update everything ...\n\tconst double horizontal_length = m_implementation->m_last_mouse[0] - mouse[0];\n\tconst double vertical_length = m_implementation->m_last_mouse[1] - mouse[1];\n\tdouble new_value = m_implementation->m_model->value();\n\tif(std::abs(horizontal_length) > std::abs(vertical_length))\n\t{\n\t\t// Dragging mostly horizontally : 1/10th unit increase\n\t\tnew_value += m_implementation->m_drag_increment * 0.1 * (mouse[0] - m_implementation->m_last_mouse[0]);\n\t}\n\telse\n\t{\n\t\t// Dragging mostly vertically : one unit increase\n\t\tnew_value += m_implementation->m_drag_increment * (m_implementation->m_last_mouse[1] - mouse[1]);\n\t}\n\n\tm_implementation->m_model->set_value(new_value);\n\tm_implementation->m_last_mouse = mouse;\n\n\t// Wrap the mouse if it goes off the top-or-bottom of the screen ...\n\tconst int screen_height = Gdk::Display::get_default()->get_default_screen()->get_height();\n\tconst int border = 5;\n\tif(mouse[1] < border)\n\t{\n\t\tm_implementation->m_last_mouse = k3d::point2(mouse[0], screen_height - (border + 1));\n\t\tinteractive::warp_pointer(m_implementation->m_last_mouse);\n\t}\n\telse if(screen_height - mouse[1] < border)\n\t{\n\t\tm_implementation->m_last_mouse = k3d::point2(mouse[0], (border + 1));\n\t\tinteractive::warp_pointer(m_implementation->m_last_mouse);\n\t}\n\n\t// Wrap the mouse if it goes off the left-or-right of the screen ...\n\tconst int screen_width = Gdk::Display::get_default()->get_default_screen()->get_width();\n\tif(mouse[0] < border)\n\t{\n\t\tm_implementation->m_last_mouse = k3d::point2(screen_width - (border + 1), mouse[1]);\n\t\tinteractive::warp_pointer(m_implementation->m_last_mouse);\n\t}\n\telse if(screen_width - mouse[0] < border)\n\t{\n\t\tm_implementation->m_last_mouse = k3d::point2((border + 1), mouse[1]);\n\t\tinteractive::warp_pointer(m_implementation->m_last_mouse);\n\t}\n\n\treturn false;\n}\n\nbool control::on_drag_key_press_event(GdkEventKey* Event)\n{\n\tif(!m_implementation->m_tap_started && Event->keyval == GDK_Shift_L || Event->keyval == GDK_Shift_R)\n\t{\n\t\tm_implementation->m_tap_started = true;\n\t\tm_implementation->m_drag_increment *= 10.0;\n\t\treturn true;\n\t}\n\telse if(!m_implementation->m_tap_started && Event->keyval == GDK_Control_L || Event->keyval == GDK_Control_R)\n\t{\n\t\tm_implementation->m_tap_started = true;\n\t\tm_implementation->m_drag_increment *= 0.1;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool control::on_drag_key_release_event(GdkEventKey* Event)\n{\n\tm_implementation->m_tap_started = false;\n\treturn false;\n}\n\nbool control::on_drag_timeout()\n{\n\t// Step increment if the user doesn't move\n\tif(!m_implementation->m_dragging)\n\t{\n\t\tif(m_implementation->m_drag_first_timeout)\n\t\t{\n\t\t\t// Don't change value on first timeout\n\t\t\tm_implementation->m_drag_first_timeout = false;\n\t\t\treturn true;\n\t\t}\n\n\t\tif(m_implementation->m_up_button_pressed)\n\t\t{\n\t\t\tincrement();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdecrement();\n\t\t}\n\t}\n\n\treturn true;\n}\n\nvoid control::on_drag_released()\n{\n\t// Disconnect idle timeout\n\tm_implementation->m_drag_timeout.disconnect();\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_implementation->m_state_recorder)\n\t\tm_implementation->m_state_recorder->commit_change_set(m_implementation->m_state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), change_message(m_implementation->m_model->value()), K3D_CHANGE_SET_CONTEXT);\n\n\tm_implementation->m_up_button->unset_flags(Gtk::CAN_FOCUS);\n\tm_implementation->m_down_button->unset_flags(Gtk::CAN_FOCUS);\n\tm_implementation->m_dragging = false;\n}\n\nvoid control::increment()\n{\n\tm_implementation->m_model->set_value(m_implementation->m_model->value() + m_implementation->m_step_increment);\n}\n\nvoid control::decrement()\n{\n\tm_implementation->m_model->set_value(m_implementation->m_model->value() - m_implementation->m_step_increment);\n}\n\nconst k3d::string_t control::change_message(const double Value)\n{\n\tstd::stringstream value_buffer;\n\tvalue_buffer << std::setprecision(3) << Value;\n\n\treturn k3d::string_cast(boost::format(_(\"Change %1% to %2%\")) % m_implementation->m_model->label().raw() % value_buffer.str());\n}\n\n} // namespace spin_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/spin_button.h",
    "content": "#ifndef K3DSDK_NGUI_SPIN_BUTTON_H\n#define K3DSDK_NGUI_SPIN_BUTTON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares the spin_button control, which provides a standard MVC UI for scalar values\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Dan Erikson <derikson@montana.com>\n*/\n\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/types.h>\n\n#include <gtkmm/table.h>\n\nnamespace Gtk { class Button; }\n\nnamespace k3d\n{\n\nclass iproperty;\nclass istate_recorder;\n\nnamespace ngui\n{\n\nnamespace spin_button\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// imodel\n\n/// Abstract data model for a spin_button::control\nclass imodel\n{\npublic:\n\tvirtual ~imodel() {}\n\n\t/// Returns a human-readable label for the underlying data\n\tvirtual const Glib::ustring label() = 0;\n\t/// Returns true iff the underlying data source is writable\n\tvirtual k3d::bool_t writable() = 0;\n\t/// Called to return the underlying data value\n\tvirtual k3d::double_t value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const k3d::double_t Value) = 0;\n\t/// Connects a slot to a signal that will be emitted if the underlying data changes\n\tvirtual sigc::connection connect_changed_signal(const sigc::slot<void>& Slot) = 0;\n\tvirtual k3d::double_t step_increment() = 0;\n\tvirtual const std::type_info& units() = 0;\n\nprotected:\n\timodel() {}\n\nprivate:\n\timodel(const imodel&);\n\timodel& operator=(const imodel&);\n};\n\n/// Factory method for creating an imodel object given a suitably-typed property\nimodel* const model(k3d::iproperty& Property);\n\n/// Provides an implementation of spin_button::imodel that can \"wrap\" any data source that supports the internal_value(), set_value(), and changed_signal() concepts\ntemplate<typename value_t, typename data_t>\nclass generic_model_t :\n\tpublic imodel\n{\npublic:\n\tgeneric_model_t(data_t& Data, const Glib::ustring& Label, const value_t StepIncrement, const std::type_info& Units) :\n\t\tm_data(Data),\n\t\tm_label(Label),\n\t\tm_step_increment(StepIncrement),\n\t\tm_units(Units)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tk3d::bool_t writable()\n\t{\n\t\treturn true;\n\t}\n\n\tk3d::double_t value()\n\t{\n\t\treturn m_data.internal_value();\n\t}\n\n\tvoid set_value(const k3d::double_t Value)\n\t{\n\t\tm_data.set_value(static_cast<value_t>(Value));\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_data.changed_signal().connect(sigc::hide(Slot));\n\t}\n\n\tk3d::double_t step_increment()\n\t{\n\t\treturn m_step_increment;\n\t}\n\n\tconst std::type_info& units()\n\t{\n\t\treturn m_units;\n\t}\n\nprivate:\n\tdata_t& m_data;\n\tconst Glib::ustring m_label;\n\tconst value_t m_step_increment;\n\tconst std::type_info& m_units;\n};\n\n/// Convenience factory function for creating generic_model_t objects\ntemplate<typename value_t, typename data_t>\nimodel* model(data_t& Data, const Glib::ustring& Label = \"\", const value_t StepIncrement = 1, const std::type_info& Units = typeid(k3d::measurement::scalar))\n{\n\treturn new generic_model_t<value_t, data_t>(Data, Label, StepIncrement, Units);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for manipulating scalar quantities (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::Table\n{\n\ttypedef Gtk::Table base;\n\npublic:\n\tcontrol(imodel* const Model, k3d::istate_recorder* const StateRecorder);\n\t~control();\n\n\t/// Sets the step increment between values when the user clicks on the up or down arrows\n\tvoid set_step_increment(const double StepIncrement);\n\t/// Sets the physical unit-of-measure that should be used to display values\n\tvoid set_units(const std::type_info& Units);\n\nprivate:\n\t/// Creates up or down button\n\tvoid setup_arrow_button(Gtk::Button* Button, const Gtk::ArrowType ArrowType, const bool Up);\n\n\t/// Called whenever the underlying data changes\n\tvoid on_data_changed();\n\t/// Formats a value and displays it in the entry\n\tvoid display_value(const double Value);\n\n\t/// Called when the entry control loses the keyboard focus\n\tbool on_entry_focus_out_event(GdkEventFocus* Event);\n\t/// Called when the entry control is activated\n\tvoid on_entry_activated();\n\t/// Sets the proxied value from the entry widget\n\tvoid on_manual_value();\n\n\t/// Called when the user pressed the \"drag\" button\n\tvoid on_drag_pressed(const bool Up);\n\t/// Called when the user drags the mouse over the \"drag\" button\n\tbool on_drag_motion_notify_event(GdkEventMotion*);\n\t/// Called when a key is pressed during dragging\n\tbool on_drag_key_press_event(GdkEventKey* Event);\n\t/// Called when a key is released during dragging\n\tbool on_drag_key_release_event(GdkEventKey* Event);\n\t/// Called by the idle timeout during dragging\n\tbool on_drag_timeout();\n\t/// Called when the user releases the \"drag\" button\n\tvoid on_drag_released();\n\n\t/// Called to increment the current value\n\tvoid increment();\n\t/// Called to decrement the current value\n\tvoid decrement();\n\n\tconst k3d::string_t change_message(const double Value);\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace spin_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_SPIN_BUTTON_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/target.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <gtkmm/widget.h>\n\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/target.h>\n#include <k3dsdk/ngui/viewport.h>\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/ibounded.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/irenderable_gl.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/transform.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <set>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\n/// Expands a bounding box around the visited points\nclass point_visitor\n{\npublic:\n\tpoint_visitor(k3d::bounding_box3& BBox, k3d::mesh::points_t& Points, const k3d::matrix4& Matrix) : m_bbox(BBox), m_points(Points), m_matrix(Matrix) {}\n\tvoid operator()(k3d::uint_t PointIndex, const k3d::point3& Point)\n\t{\n\t\tconst k3d::point3 transformed_point = m_matrix * Point;\n\t\tm_bbox.insert(transformed_point);\n\t\tif (m_inserted_points.insert(PointIndex).second)\n\t\t{\n\t\t\tm_points.push_back(transformed_point);\n\t\t}\n\t}\nprivate:\n\tk3d::bounding_box3& m_bbox;\n\tk3d::mesh::points_t& m_points;\n\tconst k3d::matrix4& m_matrix;\n\tstd::set<k3d::uint_t> m_inserted_points;\n};\n\n/// Traverse selected mesh points\ntemplate<typename visitor_t>\nvoid traverse_selected_points(const k3d::mesh& Mesh, visitor_t& Visitor)\n{\n\tfor (k3d::uint_t point = 0; point != Mesh.points->size(); ++point)\n\t{\n\t\tif (Mesh.point_selection->at(point))\n\t\t{\n\t\t\tVisitor(point, Mesh.points->at(point));\n\t\t}\n\t}\n}\n\n/// For each selected edge, visit the start and end point (multiple visits per point possible!)\ntemplate<typename visitor_t>\nvoid traverse_selected_edge_points(const k3d::mesh& Mesh, visitor_t& Visitor)\n{\n/*\n\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh));\n\treturn_if_fail(polyhedron);\n\tconst k3d::mesh::points_t& points = *Mesh.points;\n\tconst k3d::mesh::indices_t& edge_points = *Mesh.polyhedra->edge_points;\n\tconst k3d::mesh::indices_t& clockwise_edges = *Mesh.polyhedra->clockwise_edges;\n\tconst k3d::mesh::selection_t& edge_selection = *Mesh.polyhedra->edge_selection;\n\tfor (k3d::uint_t edge = 0; edge != edge_points.size(); ++edge)\n\t{\n\t\tif (edge_selection[edge])\n\t\t{\n\t\t\tVisitor(edge_points[edge], points[edge_points[edge]]);\n\t\t\tVisitor(edge_points[clockwise_edges[edge]], points[edge_points[clockwise_edges[edge]]]);\n\t\t}\n\t}\n*/\n}\n\n// For each selected face, visit all of its points (multiple visits per point possible!)\ntemplate<typename visitor_t>\nvoid traverse_selected_face_points(const k3d::mesh& Mesh, visitor_t& Visitor)\n{\n/*\n\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh));\n\treturn_if_fail(polyhedron);\n\tconst k3d::mesh::points_t& points = *Mesh.points;\n\tconst k3d::mesh::indices_t& face_first_loops = *Mesh.polyhedra->face_first_loops;\n\tconst k3d::mesh::counts_t& face_loop_counts = *Mesh.polyhedra->face_loop_counts;\n\tconst k3d::mesh::indices_t& loop_first_edges = *Mesh.polyhedra->loop_first_edges;\n\tconst k3d::mesh::indices_t& edge_points = *Mesh.polyhedra->edge_points;\n\tconst k3d::mesh::indices_t& clockwise_edges = *Mesh.polyhedra->clockwise_edges;\n\tconst k3d::mesh::selection_t& face_selection = *Mesh.polyhedra->face_selection;\n\tfor(k3d::uint_t face = 0; face != face_first_loops.size(); ++face)\n\t{\n\t\tif (!face_selection[face])\n\t\t\tcontinue;\n\t\t\n\t\tconst k3d::uint_t loop_begin = face_first_loops[face];\n\t\tconst k3d::uint_t loop_end = loop_begin + face_loop_counts[face];\n\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst k3d::uint_t first_edge = loop_first_edges[loop];\n\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t{\n\t\t\t\tVisitor(edge_points[edge], points[edge_points[edge]]);\n\n\t\t\t\tedge = clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n*/\n}\n\n/// Computes the average position of selected nodes, returns false when no selected node was found.\nbool selection_position(const selection::mode& SelectionMode, const k3d::nodes_t& Selection, k3d::bounding_box3& BoundingBox, k3d::mesh::points_t& Points)\n{\n\t// Expand the bounding box around the selection\n\tfor(k3d::nodes_t::const_iterator node = Selection.begin(); node != Selection.end(); ++node)\n\t{\n\t\tif(!dynamic_cast<k3d::gl::irenderable*>(*node))\n\t\t\tcontinue;\n\t\t\n\t\tconst k3d::matrix4 transformation = k3d::node_to_world_matrix(**node);\n\t\tpoint_visitor visitor(BoundingBox, Points, transformation);\n\n\t\tif(SelectionMode == selection::NODE)\n\t\t{\n\t\t\tif(k3d::ibounded* bounded = dynamic_cast<k3d::ibounded*>(*node))\n\t\t\t{\n\t\t\t\tBoundingBox.insert(transformation * bounded->extents());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tBoundingBox.insert(k3d::world_position(**node));\n\t\t\t}\n\t\t}\n\t\tif(!(*node)->factory().implements(typeid(k3d::imesh_source)))\n\t\t\tcontinue;\n\t\tconst k3d::mesh* mesh = k3d::property::pipeline_value<k3d::mesh*>(dynamic_cast<k3d::imesh_source*>(*node)->mesh_source_output());\n\t\tif(!mesh)\n\t\t\tcontinue;\n\t\tif(!mesh->points)\n\t\t\tcontinue;\n\t\tif(SelectionMode == selection::NODE)\n\t\t{\n\t\t\tconst k3d::mesh::points_t& points = *mesh->points;\n\t\t\tfor (k3d::uint_t point = 0; point != points.size(); ++point)\n\t\t\t\tPoints.push_back(transformation * points[point]);\n\t\t}\n\t\tif(SelectionMode == selection::POINT)\n\t\t{\n\t\t\ttraverse_selected_points(*mesh, visitor);\n\t\t}\n\t\tif(SelectionMode == selection::EDGE)\n\t\t{\n\t\t\ttraverse_selected_edge_points(*mesh, visitor);\n\t\t}\n\t\tif(SelectionMode == selection::FACE)\n\t\t{\n\t\t\ttraverse_selected_face_points(*mesh, visitor);\n\t\t}\n\t}\n\t\n\t// Nothing was selected...\n\tif (BoundingBox.empty())\n\t{\n\t\treturn false;\n\t}\n\t\n\tif (Points.empty())\n\t{\n\t\tPoints.push_back(k3d::point3(BoundingBox.nx, BoundingBox.ny, BoundingBox.nz));\n\t\tPoints.push_back(k3d::point3(BoundingBox.px, BoundingBox.ny, BoundingBox.nz));\n\t\tPoints.push_back(k3d::point3(BoundingBox.px, BoundingBox.py, BoundingBox.nz));\n\t\tPoints.push_back(k3d::point3(BoundingBox.nx, BoundingBox.py, BoundingBox.nz));\n\t\tPoints.push_back(k3d::point3(BoundingBox.nx, BoundingBox.ny, BoundingBox.pz));\n\t\tPoints.push_back(k3d::point3(BoundingBox.px, BoundingBox.ny, BoundingBox.pz));\n\t\tPoints.push_back(k3d::point3(BoundingBox.nx, BoundingBox.py, BoundingBox.pz));\n\t\tPoints.push_back(k3d::point3(BoundingBox.px, BoundingBox.py, BoundingBox.pz));\n\t}\n\n\treturn true;\n}\n\n} // namespace detail\n\nvoid aim_selection(document_state& DocumentState, viewport::control& Viewport)\n{\n\t// Get the bounding box of the current selection\n\tk3d::bounding_box3 bbox;\n\tk3d::mesh::points_t points;\n\tif(!detail::selection_position(selection::state(DocumentState.document()).current_mode(), selection::state(DocumentState.document()).selected_nodes(), bbox, points))\n\t\treturn;\n\t\n\tk3d::point3 target = bbox.center();\n\n\tconst k3d::matrix4 view_matrix = Viewport.get_view_matrix();\n\tconst k3d::vector3 look_vector = k3d::look_vector(view_matrix);\n\tconst k3d::vector3 right_vector = k3d::right_vector(view_matrix);\n\tconst k3d::point3 position = k3d::position(view_matrix);\n\n\tconst k3d::vector3 new_look_vector = target - position;\n\tconst k3d::vector3 new_right_vector = new_look_vector ^ Viewport.get_up_axis();\n\tconst k3d::vector3 new_up_vector = new_right_vector ^ new_look_vector;\n\n\tViewport.set_view_matrix(k3d::view_matrix(new_look_vector, new_up_vector, position));\n\tViewport.set_target(bbox.center());\n}\n\nvoid frame_selection(document_state& DocumentState, viewport::control& Viewport)\n{\n\t// Get the bounding box of the current selection\n\tk3d::bounding_box3 bbox;\n\tk3d::mesh::points_t points;\n\tif(!detail::selection_position(selection::state(DocumentState.document()).current_mode(), selection::state(DocumentState.document()).selected_nodes(), bbox, points))\n\t\treturn;\n\t\n\tk3d::point3 target = bbox.center();\n\n\tconst k3d::matrix4 view_matrix = Viewport.get_view_matrix();\n\tconst k3d::vector3 look_vector = k3d::look_vector(view_matrix);\n\tconst k3d::vector3 up_vector = k3d::up_vector(view_matrix);\n\tconst k3d::vector3 right_vector = k3d::right_vector(view_matrix);\n\tconst k3d::point3 position = k3d::position(view_matrix);\n\n\tk3d::point3 old_target = Viewport.get_target();\n\t\n\t// translation to center\n\tconst k3d::vector3 pan_translation = target - old_target;\n\t\n\t// Get the zoom factor by comparing view area and bounding box\n\treturn_if_fail(Viewport.camera());\n\tk3d::iprojection* camera_projection = &(Viewport.camera()->projection());\n\tdouble near = 1;\n\tdouble left = 0;\n\tdouble right = 0;\n\tdouble top = 0;\n\tdouble bottom = 0;\n\tif (k3d::iorthographic* projection = dynamic_cast<k3d::iorthographic*>(camera_projection))\n\t{\n\t\tleft = k3d::property::pipeline_value<double>(projection->left());\n\t\tright = k3d::property::pipeline_value<double>(projection->right());\n\t\ttop = k3d::property::pipeline_value<double>(projection->top());\n\t\tbottom = k3d::property::pipeline_value<double>(projection->bottom());\n\t}\n\telse if (k3d::iperspective* projection = dynamic_cast<k3d::iperspective*>(camera_projection))\n\t{\n\t\tnear = k3d::property::pipeline_value<double>(projection->near());\n\t\tleft = k3d::property::pipeline_value<double>(projection->left());\n\t\tright = k3d::property::pipeline_value<double>(projection->right());\n\t\ttop = k3d::property::pipeline_value<double>(projection->top());\n\t\tbottom = k3d::property::pipeline_value<double>(projection->bottom());\n\t}\n\telse\n\t{\n\t\tassert_not_reached();\n\t}\n\t\n\t// Transformation to camera coordinates (x = right, y = look, z = up)\n\tk3d::matrix4 view_transformation(\n\t\t\tk3d::vector4(right_vector[0], right_vector[1], right_vector[2], -right_vector*k3d::to_vector(pan_translation + position)),\n\t\t\tk3d::vector4(look_vector[0], look_vector[1], look_vector[2], -look_vector*k3d::to_vector(pan_translation + position)),\n\t\t\tk3d::vector4(up_vector[0], up_vector[1], up_vector[2], -up_vector*k3d::to_vector(pan_translation + position)),\n\t\t\tk3d::vector4(0,0,0,1));\n\t\n\t// Find the point with the largest viewing angle\n\tdouble factor = std::numeric_limits<double>::max();\n\tfor (k3d::uint_t point = 0; point != points.size(); ++point)\n\t{\n\t\tk3d::point3 p = view_transformation * points[point];\n\t\tpoints[point] = p;\n\t\tdouble x = p[0];\n\t\tdouble y = p[1];\n\t\tdouble z = p[2];\n\t\tdouble testfactor = x < 0 ? y - (x * near / left) : y - (x * near / right);\n\t\tfactor = testfactor < factor ? testfactor : factor;\n\t\ttestfactor = z < 0 ? y - (z * near / bottom) : y - (z * near / top);\n\t\tfactor = testfactor < factor ? testfactor : factor;\n\t}\n\t\n\t// Check and correct if the zoom factor found makes the selection intersect the near plane\n\tfor (k3d::uint_t point = 0; point != points.size(); ++point)\n\t{\n\t\tdouble y = points[point][1];\n\t\tif ((y - factor) < near)\n\t\t{\n\t\t\tfactor = y - near;\n\t\t}\n\t}\n\t\n\tconst k3d::vector3 dolly_translation = factor * look_vector; \n\n\tViewport.set_view_matrix(k3d::view_matrix(look_vector, up_vector, position + pan_translation + dolly_translation));\n\tViewport.set_target(target);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/target.h",
    "content": "#ifndef K3DSDK_NGUI_TARGET_H\n#define K3DSDK_NGUI_TARGET_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\nnamespace viewport { class control; }\n\n/// Centers the current selection in the given viewport by changing the viewport orientation\nvoid aim_selection(document_state& DocumentState, viewport::control& Viewport);\n/// Frames the current selection in the given viewport by changing the viewport position\nvoid frame_selection(document_state& DocumentState, viewport::control& Viewport);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_TARGET_H\n"
  },
  {
    "path": "k3dsdk/ngui/text.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/text.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/string_cast.h>\n\n#include <gtkmm/buttonbox.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/textview.h>\n#include <gtkmm/window.h>\n\n#include <boost/format.hpp>\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace text\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// property_model\n\n/// Implementation of text::imodel for use with k3d::iproperty objects\nclass property_model :\n\tpublic imodel\n{\npublic:\n\tproperty_model(k3d::iproperty& Data) :\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data))\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\tGlib::ustring result = m_readable_data.property_label();\n\n\t\tif(m_readable_data.property_node())\n\t\t\tresult = m_readable_data.property_node()->name() + \" \" + result;\n\n\t\treturn result;\n\t}\n\n\tconst k3d::bool_t writable()\n\t{\n\t\treturn m_writable_data ? true : false;\n\t}\n\n\tconst k3d::string_t value()\n\t{\n\t\tconst std::type_info& type = m_readable_data.property_type();\n\n\t\tif(type == typeid(k3d::string_t))\n\t\t\treturn boost::any_cast<k3d::string_t>(m_readable_data.property_internal_value());\n\t\tk3d::log() << error << k3d_file_reference << \": unknown property type: \" << type.name() << std::endl;\n\t\treturn k3d::string_t();\n\t}\n\n\tvoid set_value(const k3d::string_t& Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\n\t\tconst std::type_info& type = m_readable_data.property_type();\n\n\t\tif(type == typeid(k3d::string_t))\n\t\t\tm_writable_data->property_set_value(Value);\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown property type: \" << type.name() << std::endl;\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_readable_data.property_changed_signal().connect(sigc::hide(Slot));\n\t}\n\nprivate:\n\tproperty_model(const property_model& RHS);\n\tproperty_model& operator=(const property_model& RHS);\n\n\tk3d::iproperty& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// model\n\nimodel* const model(k3d::iproperty& Property)\n{\n\treturn new property_model(Property);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control::implementation\n\nclass control::implementation\n{\npublic:\n\timplementation(imodel* const Model, k3d::istate_recorder* const StateRecorder) :\n\t\tm_model(Model),\n\t\tm_state_recorder(StateRecorder)\n\t{\n\t\tassert(m_model.get());\n\t}\n\n\t/// Stores a reference to the underlying data object\n\tconst boost::scoped_ptr<imodel> m_model;\n\t/// Stores a reference to the (optional) object for recording undo/redo data\n\tk3d::istate_recorder* const m_state_recorder;\n\t/// Stores the global accel group while the control has the keyboard focus\n\tGlib::RefPtr<Gtk::AccelGroup> m_disabled_accel_group;\n\t/// Provides the main view widget\n\tGtk::TextView m_text_view;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(imodel* const Model, k3d::istate_recorder* const StateRecorder) :\n\tm_implementation(new implementation(Model, StateRecorder))\n{\n\tset_name(\"k3d-text\");\n\n\tGtk::ScrolledWindow* const scrolled_window = new Gtk::ScrolledWindow();\n\tscrolled_window->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\tscrolled_window->add(m_implementation->m_text_view);\n\tpack_start(*Gtk::manage(scrolled_window), Gtk::PACK_EXPAND_WIDGET);\n\n\tif(m_implementation->m_model->writable())\n\t{\n\t\tm_implementation->m_text_view.set_editable(true);\n\n\t\tGtk::Button* const apply_button =\n\t\t\tnew Gtk::Button(_(\"Apply\"))\n\t\t\t\t<< connect_button(sigc::mem_fun(*this, &control::on_apply))\n\t\t\t\t<< set_tooltip(_(\"Apply modifications.\"));\n\n\t\tGtk::Button* const reset_button =\n\t\t\tnew Gtk::Button(_(\"Reset\"))\n\t\t\t\t<< connect_button(sigc::mem_fun(*this, &control::on_reset))\n\t\t\t\t<< set_tooltip(_(\"Reset modifications.\"));\n\n\t\tGtk::HButtonBox* const bbox = new Gtk::HButtonBox(Gtk::BUTTONBOX_END);\n\t\tbbox->pack_start(*Gtk::manage(apply_button));\n\t\tbbox->pack_start(*Gtk::manage(reset_button));\n\n\t\tpack_start(*Gtk::manage(bbox));\n\t}\n\telse\n\t{\n\t\tm_implementation->m_text_view.set_editable(false);\n\t}\n\n\t// Keep track of when the TextView control receives/loses the keyboard focus, so we can disable/enable hotkeys ...\n\tm_implementation->m_text_view.signal_focus_in_event().connect(sigc::mem_fun(*this, &control::on_focus_in_event));\n\tm_implementation->m_text_view.signal_focus_out_event().connect(sigc::mem_fun(*this, &control::on_focus_out_event));\n\n\t// We want to be notified if the data source changes ...\n\tm_implementation->m_model->connect_changed_signal(sigc::mem_fun(*this, &control::on_reset));\n\n\t// Synchronize the view with the data source ...\n\ton_reset();\n}\n\ncontrol::~control()\n{\n\tdelete m_implementation;\n}\n\nbool control::on_focus_in_event(GdkEventFocus* Event)\n{\n\t// Disable accelerators for this window\n\tif(Gtk::Window* const window = dynamic_cast<Gtk::Window*>(get_toplevel()))\n\t{\n\t\tm_implementation->m_disabled_accel_group = window->get_accel_group();\n\t\twindow->remove_accel_group(window->get_accel_group());\n\t}\n\n\treturn base::on_focus_in_event(Event);\n}\n\nbool control::on_focus_out_event(GdkEventFocus* Event)\n{\n\t// Enable accelerators for this window\n\tif(Gtk::Window* const window = dynamic_cast<Gtk::Window*>(get_toplevel()))\n\t{\n\t\twindow->add_accel_group(m_implementation->m_disabled_accel_group);\n\t\tm_implementation->m_disabled_accel_group.clear();\n\t}\n\n\treturn base::on_focus_out_event(Event);\n}\n\nvoid control::on_apply()\n{\n\t// If the value didn't change, we're done ...\n\tconst k3d::string_t new_value = m_implementation->m_text_view.get_buffer()->get_text();\n\tif(new_value == m_implementation->m_model->value())\n\t\treturn;\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_implementation->m_state_recorder)\n\t\tm_implementation->m_state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t// Update everything with the new value ...\n\tm_implementation->m_model->set_value(new_value);\n\n\t// Turn this into an undo/redo -able event ...\n\tif(m_implementation->m_state_recorder)\n\t\tm_implementation->m_state_recorder->commit_change_set(m_implementation->m_state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), change_message(m_implementation->m_model->value()), K3D_CHANGE_SET_CONTEXT);\n}\n\nvoid control::on_reset()\n{\n\tm_implementation->m_text_view.get_buffer()->set_text(m_implementation->m_model->value());\n}\n\nconst k3d::string_t control::change_message(const k3d::string_t& Value)\n{\n\treturn k3d::string_cast(boost::format(_(\"Change %1%\")) % m_implementation->m_model->label().raw());\n}\n\n} // namespace text\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/text.h",
    "content": "#ifndef K3DSDK_NGUI_TEXT_H\n#define K3DSDK_NGUI_TEXT_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\n#include <gtkmm/box.h>\n\nnamespace k3d { class iproperty; }\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace text\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// imodel\n\n/// Abstract data model for an text::control\nclass imodel\n{\npublic:\n\tvirtual ~imodel() {}\n\n\t/// Returns a human-readable label for the underlying data\n\tvirtual const Glib::ustring label() = 0;\n\t/// Returns true iff the underlying data source is writable\n\tvirtual const k3d::bool_t writable() = 0;\n\t/// Called to return the underlying data value\n\tvirtual const k3d::string_t value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const k3d::string_t& Value) = 0;\n\t/// Connects a slot to a signal that will be emitted if the underlying data changes\n\tvirtual sigc::connection connect_changed_signal(const sigc::slot<void>& Slot) = 0;\n\nprotected:\n\timodel() {}\n\nprivate:\n\timodel(const imodel&);\n\timodel& operator=(const imodel&);\n};\n\n/// Factory method for creating an imodel object given a suitably-typed property\nimodel* const model(k3d::iproperty& Property);\n\n/// Provides an implementation of text::imodel that can \"wrap\" any data source that supports the internal_value(), set_value(), and changed_signal() concepts\ntemplate<typename data_t>\nclass generic_model_t :\n\tpublic imodel\n{\npublic:\n\tgeneric_model_t(data_t& Data, const Glib::ustring& Label) :\n\t\tm_data(Data),\n\t\tm_label(Label)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst k3d::bool_t writable()\n\t{\n\t\treturn true;\n\t}\n\n\tconst k3d::string_t value()\n\t{\n\t\treturn m_data.internal_value();\n\t}\n\n\tvoid set_value(const k3d::string_t& Value)\n\t{\n\t\tm_data.set_value(Value);\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_data.changed_signal().connect(sigc::hide(Slot));\n\t}\n\nprivate:\n\tdata_t& m_data;\n\tconst Glib::ustring m_label;\n};\n\n/// Convenience factory function for creating generic_model_t objects\ntemplate<typename data_t>\nimodel* model(data_t& Data, const Glib::ustring& Label = \"\")\n{\n\treturn new generic_model_t<data_t>(Data, Label);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a standard UI control for manipulating text fields (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::VBox\n{\n\ttypedef Gtk::VBox base;\n\npublic:\n\tcontrol(imodel* const Model, k3d::istate_recorder* const StateRecorder);\n\t~control();\n\nprivate:\n\t/// Called when the control gains the keyboard focus\n\tbool on_focus_in_event(GdkEventFocus* Event);\n\t/// Called when the control loses the keyboard focus\n\tbool on_focus_out_event(GdkEventFocus* Event);\n\t/// Called when the user finishes editing data\n\tvoid on_apply();\n\t/// Called to synchronize the control with the current model value\n\tvoid on_reset();\n\n\tconst k3d::string_t change_message(const k3d::string_t& Value);\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace text\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_TEXT_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/toggle_button.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/toggle_button.h>\n#include <k3dsdk/ngui/utility.h>\n\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <gtkmm/tooltips.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace toggle_button\n{\n\n/*\n/// Specialization of k3d::toggle_button::data_proxy for use with k3d::iproperty objects\ntemplate<>\nclass data_proxy<k3d::iproperty> :\n\tpublic idata_proxy\n{\npublic:\n\ttypedef k3d::iproperty data_t;\n\n\tdata_proxy(data_t& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage) :\n\t\tidata_proxy(StateRecorder, ChangeMessage),\n\t\tm_readable_data(Data),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data))\n\t{\n\t}\n\n\tbool value()\n\t{\n\t\treturn boost::any_cast<bool>(m_readable_data.property_internal_value());\n\t}\n\n\tvoid set_value(const bool Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\t\tm_writable_data->property_set_value(Value);\n\t}\n\n\tchanged_signal_t& changed_signal()\n\t{\n\t\treturn m_readable_data.property_changed_signal();\n\t}\n\nprivate:\n\tdata_proxy(const data_proxy& RHS);\n\tdata_proxy& operator=(const data_proxy& RHS);\n\n\tdata_t& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n};\n\nstd::unique_ptr<idata_proxy> proxy(k3d::iproperty& Data, k3d::istate_recorder* const StateRecorder, const Glib::ustring& ChangeMessage)\n{\n\treturn std::unique_ptr<idata_proxy>(new data_proxy<k3d::iproperty>(Data, StateRecorder, ChangeMessage));\n}\n*/\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(imodel* const Model, k3d::istate_recorder* const StateRecorder) :\n\tm_model(Model),\n\tm_state_recorder(StateRecorder)\n{\n\tset_name(\"k3d-toggle-button\");\n\tattach();\n}\n\ncontrol::control(imodel* const Model, k3d::istate_recorder* const StateRecorder, const Glib::ustring& label, bool mnemonic) :\n\tbase(label, mnemonic),\n\tm_model(Model),\n\tm_state_recorder(StateRecorder)\n{\n\tset_name(\"k3d-toggle-button\");\n\tattach();\n}\n\nvoid control::attach()\n{\n\t// Update the display ...\n\tupdate();\n\n\t// We want to be notified if the data source changes ...\n\tif(m_model)\n\t\tm_model->connect_changed_signal(sigc::mem_fun(*this, &control::update));\n}\n\nvoid control::on_update()\n{\n}\n\nvoid control::update()\n{\n\tif(m_model)\n\t{\n\t\tconst k3d::bool_t new_value = m_model->value();\n\t\tif(new_value != get_active())\n\t\t\tset_active(new_value);\n\t}\n\n\ton_update();\n}\n\nvoid control::on_toggled()\n{\n\tif(m_model)\n\t{\n\t\t// Get the control value ...\n\t\tconst bool new_value = get_active();\n\n\t\t// If the value hasn't changed, we're done ...\n\t\tif(new_value != m_model->value())\n\t\t{\n\t\t\t// Turn this into an undo/redo -able event ...\n\t\t\tif(m_state_recorder)\n\t\t\t\tm_state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t\t\t// Update everything with the new value ...\n\t\t\tm_model->set_value(new_value);\n\n\t\t\t// Turn this into an undo/redo -able event ...\n\t\t\tif(m_state_recorder)\n\t\t\t\tm_state_recorder->commit_change_set(m_state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), new_value ? m_model->label() + \" \\\"On\\\"\" : m_model->label() + \" \\\"Off\\\"\", K3D_CHANGE_SET_CONTEXT);\n\t\t}\n\t}\n\telse\n\t{\n\t\tupdate();\n\t}\n\n\tbase::on_toggled();\n\n\tupdate();\n}\n\n} // namespace toggle_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/toggle_button.h",
    "content": "#ifndef K3DSDK_NGUI_TOGGLE_BUTTON_H\n#define K3DSDK_NGUI_TOGGLE_BUTTON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\n#include <gtkmm/togglebutton.h>\n\nnamespace k3d { class istate_recorder; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace toggle_button\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// imodel\n\n/// Abstract data model for toggle_button::control objects\nclass imodel\n{\npublic:\n\tvirtual ~imodel() {}\n\n\t/// Returns a human-readable label for the underlying data\n\tvirtual const Glib::ustring label() = 0;\n\t/// Called to return the underlying data value\n\tvirtual const k3d::bool_t value() = 0;\n\t/// Called to set a new data value\n\tvirtual void set_value(const k3d::bool_t Value) = 0;\n\t/// Connects a slot to a signal that will be emitted if the underlying data changes\n\tvirtual sigc::connection connect_changed_signal(const sigc::slot<void>& Slot) = 0;\n\nprotected:\n\timodel() {}\n\nprivate:\n\timodel(const imodel&);\n\timodel& operator=(const imodel&);\n};\n\n/// Provides an implementation of k3d::toggle_button::imodel that can \"wrap\" any data source that supports the value(), set_value(), and changed_signal() concepts\ntemplate<typename data_t>\nclass generic_model_t :\n\tpublic imodel\n{\npublic:\n\tgeneric_model_t(data_t& Data, const Glib::ustring& Label) :\n\t\tm_data(Data),\n\t\tm_label(Label)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst k3d::bool_t value()\n\t{\n\t\treturn m_data.internal_value();\n\t}\n\n\tvoid set_value(const k3d::bool_t Value)\n\t{\n\t\tm_data.set_value(Value);\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_data.changed_signal().connect(sigc::hide(Slot));\n\t}\n\nprivate:\n\tdata_t& m_data;\n\tconst Glib::ustring m_label;\n};\n\n/// Convenience factory function for creating generic_model_t objects\ntemplate<typename data_t>\nimodel* model(data_t& Data, const Glib::ustring& Label = \"\")\n{\n\treturn new generic_model_t<data_t>(Data, Label);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a UI for manipulating boolean quantities (i.e. the view and the controller from model-view-controller)\nclass control :\n\tpublic Gtk::ToggleButton\n{\n\ttypedef Gtk::ToggleButton base;\n\npublic:\n\tcontrol(imodel* const Model, k3d::istate_recorder* const StateRecorder);\n\tcontrol(imodel* const Model, k3d::istate_recorder* const StateRecorder, const Glib::ustring& label, bool mnemonic = false);\n\n\tvoid on_toggled();\n\nprivate:\n\t/// Called to update the state of the widget when the underlying data source changes\n\tvirtual void on_update();\n\n\t/// Common construction code\n\tvoid attach();\n\t/// Called when the underlying data source changes\n\tvoid update();\n\t/// Storeas a reference to the underlying data object\n\timodel* const m_model;\n\tk3d::istate_recorder* const m_state_recorder;\n};\n\n} // namespace toggle_button\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_TOGGLE_BUTTON_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/tool.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/widget.h>\n\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/tool.h>\n#include <k3dsdk/ngui/viewport.h>\n\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/utility_gl.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// tool\n\ntool::tool() :\n\tm_document_state(0)\n{\n}\n\ntool::tool(document_state& DocumentState, const k3d::string_t& Name) :\n\tm_document_state(&DocumentState)\n{\n}\n\ntool::~tool()\n{\n}\n\nvoid tool::initialize(document_state& DocumentState)\n{\n\t// This should never be called more-than-once ...\n\tassert(!m_document_state);\n\n\tm_document_state = &DocumentState;\n\ton_initialize(DocumentState);\n}\n\nvoid tool::activate()\n{\n\ton_activate();\n}\n\nvoid tool::deactivate()\n{\n\ton_deactivate();\n}\n\nvoid tool::document_selection_changed()\n{\n\ton_document_selection_changed();\n}\n\nvoid tool::redraw(viewport::control& Viewport)\n{\n\ton_redraw(Viewport);\n}\n\nvoid tool::select(viewport::control& Viewport)\n{\n\ton_select(Viewport);\n}\n\nk3d::iproperty_collection* tool::properties()\n{\n\treturn get_property_collection();\n}\n\nviewport_input_model& tool::input_model()\n{\n\treturn get_input_model();\n}\n\nvoid tool::redraw_all()\n{\n\tk3d::gl::redraw_all(m_document_state->document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n}\n\nvoid tool::on_initialize(document_state&)\n{\n}\n\nvoid tool::on_activate()\n{\n}\n\nvoid tool::on_deactivate()\n{\n}\n\nvoid tool::on_document_selection_changed()\n{\n}\n\nvoid tool::on_redraw(viewport::control& Viewport)\n{\n}\n\nvoid tool::on_select(viewport::control& Viewport)\n{\n}\n\nk3d::iproperty_collection* tool::get_property_collection()\n{\n\treturn 0;\n}\n\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/tool.h",
    "content": "#ifndef K3DSDK_NGUI_TOOL_H\n#define K3DSDK_NGUI_TOOL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/vectors.h>\n\n#include <gdk/gdkevents.h>\n\nnamespace k3d { class inode; }\nnamespace k3d { class iproperty_collection; }\nnamespace k3d { class iviewport; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\nclass viewport_input_model;\nnamespace viewport { class control; }\n\n/////////////////////////////////////////////////////////////////////////////\n// tool\n\n/// Abstract base class for Tools - objects that generate state changes based on user interaction with viewports\nclass tool\n{\npublic:\n\tvirtual ~tool();\n\n\t/// Set the document for this tool - this is ugly, but application plugins don't take ctor arguments\n\tvoid initialize(document_state& DocumentState);\n\t/// Returns a unique string identifying the tool type\n\tvirtual const k3d::string_t tool_type() = 0;\n\t/// Called to activate the tool\n\tvoid activate();\n\t/// Called to deactivate the tool\n\tvoid deactivate();\n\t/// Called when document selection changed\n\tvoid document_selection_changed();\n\t/// Called to give the tool a chance to draw in the viewport\n\tvoid redraw(viewport::control& Viewport);\n\t/// Called to give the tool a chance to draw in the viewport\n\tvoid select(viewport::control& Viewport);\n\t/// Returns tool's property collection\n\tk3d::iproperty_collection* properties();\n\t/// Returns the tool's user input model\n\tviewport_input_model& input_model();\n\n\t/// Convenience function that schedules a screen update for all viewports\n\tvoid redraw_all();\n\nprotected:\n\ttool();\n\ttool(document_state& DocumentState, const k3d::string_t& Name);\n\nprivate:\n\t/// Called when the tool is initialized\n\tvirtual void on_initialize(document_state& DocumentState);\n\n\t/// Called when the tool is activated - override in derived classes to implement custom behavior\n\tvirtual void on_activate();\n\t/// Called when the tool is deactivated - override in derived classes to implement custom behavior\n\tvirtual void on_deactivate();\n\t/// Called when the document selection changed - override in derived classes to implement custom behavior\n\tvirtual void on_document_selection_changed();\n\t/// Called to give the tool a chance to draw in the viewport\n\tvirtual void on_redraw(viewport::control& Viewport);\n\t/// Called to give the tool a chance to draw in the viewport\n\tvirtual void on_select(viewport::control& Viewport);\n\t/// Asks for tool's property collection\n\tvirtual k3d::iproperty_collection* get_property_collection();\n\t/// Returns the tool's user input model\n\tvirtual viewport_input_model& get_input_model() = 0;\n\n\t/// Stores a reference to the owning document\n\tdocument_state* m_document_state;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_TOOL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/tool_selection.h",
    "content": "#ifndef K3DSDK_NGUI_TOOL_SELECTION_H\n#define K3DSDK_NGUI_TOOL_SELECTION_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n\n#include <k3d-i18n-config.h>\n\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/utility_gl.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// tool_selection\n\nclass tool_selection\n{\npublic:\n\ttool_selection(k3d::idocument& Document, document_state& DocumentState) :\n\t\tm_document(Document),\n\t\tm_document_state(DocumentState),\n\t\tm_current_motion(MOTION_NONE),\n\t\tm_box_selection(0, 0, 0, 0)\n\t{\n\t}\n\n\tk3d::idocument& document()\n\t{\n\t\treturn m_document;\n\t}\n\n\tvoid redraw_all(k3d::iunknown* const Hint = 0)\n\t{\n\t\tk3d::gl::redraw_all(m_document, k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\t/// Enumerates motions\n\ttypedef enum\n\t{\n\t\tMOTION_NONE,\n\t\tMOTION_CLICK_DRAG,\t// LMB click + drag\n\t\tMOTION_DRAG,\t\t// LMB down + drag\n\t\tMOTION_BOX_SELECT,\t// LMB down + drag draws selection window\n\t\tMOTION_PAINT_SELECT\n\t} motion_t;\n\nprotected:\n\t/// Enumerates selection types\n\ttypedef enum\n\t{\n\t\tSELECTION_ADD,\n\t\tSELECTION_SUBTRACT,\n\t\tSELECTED_OBJECT,\n\t\tDESELECTED_OBJECT,\n\t\tNOTHING\n\t} mouse_down_content_t;\n\n\t/// Stores the owning document\n\tk3d::idocument& m_document;\n\tdocument_state& m_document_state;\n\n\t/// Saves current selection motion\n\tmotion_t m_current_motion;\n\t/// Saves mouse down action\n\tmouse_down_content_t m_mouse_down_content;\n\t/// Stores the current selection window\n\tk3d::rectangle m_box_selection;\n\t/// Saves clicked selection\n\tk3d::selection::record m_mouse_down_selection;\n\n\tvoid pick_selectables(k3d::selection::records& PickedSelectables, viewport::control& Viewport, const k3d::point2& Coordinates)\n\t{\n\t\t// Check if we need to pick backfacing items\n\t\tbool pick_backfacing = m_document_state.pick_backfacing();\n\t\t\n\t\t// Find what's under the mouse pointer\n\t\tm_mouse_down_selection = Viewport.pick_object(Coordinates, PickedSelectables, pick_backfacing);\n\n\t\t// Nullify selection in component mode if the parent node isn't selected\n\t\tif(k3d::inode* node = k3d::selection::get_node(m_mouse_down_selection))\n\t\t{\n\t\t\tswitch(selection::state(m_document_state.document()).current_mode())\n\t\t\t{\n\t\t\t\tcase selection::CURVE:\n\t\t\t\tcase selection::FACE:\n\t\t\t\tcase selection::POINT:\n\t\t\t\tcase selection::EDGE:\n\t\t\t\tcase selection::SURFACE:\n\t\t\t\t\tif(!selection::state(m_document_state.document()).is_selected(*node))\n\t\t\t\t\t\tm_mouse_down_selection = k3d::selection::record::empty_record();;\n\t\t\t\t\tbreak;\n\t\t\t\tcase selection::NODE:\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tassert_not_reached();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst k3d::rectangle normalize(const k3d::rectangle& Rectangle)\n\t{\n\t\treturn k3d::rectangle::normalize(Rectangle);\n\t}\n\n\t/// Stores a GC for drawing selections\n\tGlib::RefPtr<Gdk::GC> m_selection_gc;\n\n\t/// Returns a GC for drawing selections\n\tGlib::RefPtr<Gdk::GC> selection_gc(viewport::control& Viewport)\n\t{\n\t\tif(!m_selection_gc)\n\t\t{\n\t\t\tGdk::Color selection_color = convert(k3d::color(0.2, 1.0, 1.0));\n\t\t\tViewport.get_default_colormap()->alloc_color(selection_color);\n\t\t\tm_selection_gc = Gdk::GC::create(Viewport.get_window());\n\t\t\tm_selection_gc->set_foreground(selection_color);\n\t\t\tm_selection_gc->set_function(Gdk::XOR);\n\t\t\tm_selection_gc->set_line_attributes(1, Gdk::LINE_ON_OFF_DASH, Gdk::CAP_BUTT, Gdk::JOIN_MITER);\n\t\t}\n\n\t\treturn m_selection_gc;\n\t}\n\n\t/// Draws selection window\n\tvoid draw_rubber_band(viewport::control& Viewport)\n\t{\n\t\tGlib::RefPtr<Gdk::Drawable> Drawable = Viewport.get_window();\n\t\tGlib::RefPtr<Gdk::GC> GC = selection_gc(Viewport);\n\n\t\tconst k3d::rectangle rectangle = normalize(m_box_selection);\n\t\tDrawable->draw_rectangle(GC, false, static_cast<int>(rectangle.x1), static_cast<int>(rectangle.y1), static_cast<int>(rectangle.width()), static_cast<int>(rectangle.height()));\n\t}\n\n\tvoid on_box_select_motion(viewport::control& Viewport, const k3d::point2& Coordinates)\n\t{\n\t\tdraw_rubber_band(Viewport);\n\t\tm_box_selection.x2 = Coordinates[0];\n\t\tm_box_selection.y2 = Coordinates[1];\n\t\tdraw_rubber_band(Viewport);\n\t}\n\n\tvoid on_box_select_objects(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::rectangle& SelectionRegion)\n\t{\n\t\tbool rubber_band_backfacing = m_document_state.rubber_band_backfacing();\n\t\tconst k3d::selection::records selection = Viewport.get_object_selectables(normalize(SelectionRegion), rubber_band_backfacing);\n\n\t\tswitch(m_mouse_down_content)\n\t\t{\n\t\t\t//case MOTION_RUBBER_BAND_SELECT:\n\t\t\tcase SELECTION_ADD:\n\t\t\t\tselection::state(m_document_state.document()).select(selection);\n\t\t\t\tbreak;\n\n\t\t\t//case MOTION_RUBBER_BAND_DESELECT:\n\t\t\tcase SELECTION_SUBTRACT:\n\t\t\t\tselection::state(m_document_state.document()).deselect(selection);\n\t\t\t\tbreak;\n\n\t\t\tcase SELECTED_OBJECT:\n\t\t\tcase DESELECTED_OBJECT:\n\t\t\tcase NOTHING:\n\t\t\t\tselection::state(m_document_state.document()).deselect_all();\n\t\t\t\tselection::state(m_document_state.document()).select(selection);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tassert_not_reached();\n\t\t}\n\t}\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_TOOL_SELECTION_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/toolbar.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/toolbar.h>\n\n#include <k3dsdk/result.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace toolbar\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control() :\n\tbase(false, 0)\n{\n\tset_name(\"k3d-toolbar\");\n}\n\nGtk::HBox& control::row(const unsigned int Row)\n{\n\twhile(get_children().size() < Row + 1)\n\t{\n\t\tGtk::HBox* hbox = new Gtk::HBox(false, 0);\n\t\tstd::stringstream atk_name;\n\t\tatk_name << \"row\" << get_children().size();\n\t\thbox->get_accessible()->set_name(atk_name.str());\n\t\tbase::pack_start(*Gtk::manage(hbox));\n\t}\n\n\tstd::vector<Gtk::Widget*> rows = get_children();\n\tGtk::HBox* const row = dynamic_cast<Gtk::HBox*>(rows[Row]);\n\tassert_critical(row);\n\treturn *row;\n}\n\n} // namespace toolbar\n\n} // namespace ngui\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/toolbar.h",
    "content": "#ifndef K3DSDK_NGUI_TOOLBAR_H\n#define K3DSDK_NGUI_TOOLBAR_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/box.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace toolbar\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a standard toolbar control\nclass control :\n        public Gtk::VBox\n{\n\ttypedef Gtk::VBox base;\n\npublic:\n\tcontrol();\n\n\tGtk::HBox& row(const unsigned int Row);\n\nprivate:\n\tvoid pack_start();\n\tvoid pack_end();\n//\tvoid pack_start(Gtk::Widget& child, bool expand, bool fill, guint padding);\n//\tvoid pack_start(Gtk::Widget& child, Gtk::PackOptions options, guint padding);\n//\tvoid pack_end(Gtk::Widget& child, bool expand, bool fill, guint padding);\n//\tvoid pack_end(Gtk::Widget& child, Gtk::PackOptions options, guint padding);\n};\n\n} // namespace toolbar\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_TOOLBAR_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/transform.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/transform.h>\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iparentable.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/transform.h>\n\n#include <algorithm>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nconst transform_history_t parent_to_node_history(k3d::inode& Object)\n{\n\tk3d::iparentable* const parentable = dynamic_cast<k3d::iparentable*>(&Object);\n\tk3d::inode* const parent = parentable ? boost::any_cast<k3d::inode*>(parentable->parent().property_internal_value()) : 0;\n\n\ttransform_history_t results;\n\tfor(k3d::inode* object = &Object; object; )\n\t{\n\t\tresults.push_back(object);\n\n\t\tk3d::imatrix_sink* const matrix_sink = dynamic_cast<k3d::imatrix_sink*>(object);\n\t\tif(!matrix_sink)\n\t\t\tbreak;\n\n\t\tk3d::iproperty* const dependency = Object.document().pipeline().dependency(matrix_sink->matrix_sink_input());\n\t\tif(!dependency)\n\t\t\tbreak;\n\n\t\tobject = dependency->property_node();\n\n\t\tif(object == parent)\n\t\t\tbreak;\n\t}\n\n\tstd::reverse(results.begin(), results.end());\n\n\treturn results;\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const show_history& RHS)\n{\n\tfor(transform_history_t::const_iterator object = RHS.history.begin(); object != RHS.history.end(); ++object)\n\t{\n\t\tif(object != RHS.history.begin())\n\t\t\tk3d::log() << \" -> \";\n\t\tStream << (*object)->name();\n\t}\n\treturn Stream;\n}\n\nvoid unparent(k3d::inode& Node)\n{\n\tk3d::iparentable* const parentable = dynamic_cast<k3d::iparentable*>(&Node);\n\treturn_if_fail(parentable);\n\n\tk3d::inode* const parent = boost::any_cast<k3d::inode*>(parentable->parent().property_internal_value());\n\tif(!parent)\n\t\treturn;\n\n\tconst k3d::matrix4 unparent_compensation = k3d::node_to_world_matrix(*parent);\n\n\tconst transform_history_t history = parent_to_node_history(Node);\n\tif(!history.empty())\n\t{\n\t\tif(k3d::imatrix_sink* const matrix_sink = dynamic_cast<k3d::imatrix_sink*>(history.front()))\n\t\t{\n\t\t\tconst transform_modifier modifier = create_transform_modifier(Node.document(), k3d::classes::FrozenMatrix(), \"Unparent Compensation\");\n\t\t\tif(modifier)\n\t\t\t{\n\t\t\t\tk3d::property::set_internal_value(*modifier.node, \"matrix\", unparent_compensation);\n\n\t\t\t\tk3d::ipipeline::dependencies_t dependencies;\n\t\t\t\tdependencies.insert(std::make_pair(&matrix_sink->matrix_sink_input(), &modifier.source->matrix_source_output()));\n\t\t\t\tNode.document().pipeline().set_dependencies(dependencies);\n\t\t\t}\n\t\t}\n\t}\n\n\tif(k3d::iwritable_property* const writable_parent = dynamic_cast<k3d::iwritable_property*>(&parentable->parent()))\n\t\twritable_parent->property_set_value(static_cast<k3d::inode*>(0));\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/transform.h",
    "content": "#ifndef K3DSDK_NGUI_TRANSFORM_H\n#define K3DSDK_NGUI_TRANSFORM_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <vector>\n\nnamespace k3d { class inode; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/// Defines an ordered collection of objects whose transformation properties are chained together\ntypedef std::vector<k3d::inode*> transform_history_t;\n\n/// Returns the set of objects that makeup the transformation history from an object's parent up-to-and-including the object itself\nconst transform_history_t parent_to_node_history(k3d::inode& Object);\n\n/// Helper class for dumping history to a stream for debugging\nstruct show_history\n{\n\tshow_history(const transform_history_t& History) : history(History) {}\n\tconst transform_history_t history;\n};\n\nstd::ostream& operator<<(std::ostream&, const show_history&);\n\n/// Unparents a node\nvoid unparent(k3d::inode& Node);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_TRANSFORM_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/transform_tool.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <gdkmm/cursor.h>\n#include <gtkmm/widget.h>\n\n#include <k3d-i18n-config.h>\n\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/interactive.h>\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/transform_tool.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n\n#include <k3dsdk/classes.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/irenderable_gl.h>\n#include <k3dsdk/ikeyframer.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/xml.h>\n\n#include <boost/lexical_cast.hpp>\n#include <boost/scoped_ptr.hpp>\n\n//#include <set>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\ndouble manipulators_scale(viewport::control& Viewport, const k3d::point3& Origin, const double Size)\n{\n\tk3d::icamera* camera = Viewport.camera();\n\treturn_val_if_fail(camera, 0);\n\n\t// Project unit axis on screen space\n\tconst k3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*Viewport.camera());\n\tconst k3d::vector3 screen_parallel = screen_matrix * k3d::vector3(1, 0, 0);\n\tconst k3d::point2 position = Viewport.project(Origin);\n\tconst k3d::point2 x_axis = Viewport.project(Origin + screen_parallel);\n\tconst double length = k3d::distance(position, x_axis);\n\n\treturn_val_if_fail(length, 0);\n\n\treturn Size / length;\n}\n\nbool is_front_facing(viewport::control& Viewport, const k3d::vector3& Normal, const k3d::point3& Origin, const k3d::matrix4& Orientation)\n{\n\treturn_val_if_fail(Viewport.gl_engine(), false);\n\treturn_val_if_fail(Viewport.camera(), false);\n\n\tconst k3d::matrix4 matrix = k3d::inverse(k3d::node_to_world_matrix(*Viewport.camera()));\n\tconst k3d::point3 a = Origin + (Orientation * Normal);\n\tconst k3d::point3 b = Origin + (Orientation * -Normal);\n\treturn k3d::to_vector(matrix * a).length2() < k3d::to_vector(matrix * b).length2();\n}\n\nk3d::point3 get_selected_points(selection::mode SelectionMode, const k3d::mesh& Mesh, component_points_t& PointList)\n{\n\tPointList.clear();\n\tk3d::point3 component_center(0, 0, 0);\n\t\n\treturn_val_if_fail(Mesh.points, component_center);\n\treturn_val_if_fail(Mesh.point_selection, component_center);\n\t\n\tconst k3d::mesh::points_t& points = *Mesh.points;\n\tconst k3d::mesh::selection_t& point_selection = *Mesh.point_selection;\n\n\t// Flag points that are explicitly selected by the user ...\n\tk3d::mesh::bools_t selected_point(point_selection.begin(), point_selection.end());\n\n\t// Flag points that are implicitly selected by edges or faces ...\n\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t{\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\tif(!polyhedron)\n\t\t\tcontinue;\n\n\t\tconst k3d::uint_t face_begin = 0;\n\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t{\n\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\tconst k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t{\n\t\t\t\t\tif(polyhedron->face_selections[face])\n\t\t\t\t\t{\n\t\t\t\t\t\tselected_point[polyhedron->vertex_points[edge]] = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if(polyhedron->edge_selections[edge])\n\t\t\t\t\t{\n\t\t\t\t\t\tselected_point[polyhedron->vertex_points[edge]] = true;\n\t\t\t\t\t\tselected_point[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]] = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if(polyhedron->vertex_selections[edge])\n\t\t\t\t\t{\n\t\t\t\t\t\tselected_point[polyhedron->vertex_points[edge]] = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n/*\n\tif(Mesh.polyhedra)\n\t{\n\t\t// Get selected lines\n\t\tconst k3d::mesh::polyhedra_t& polyhedra = *Mesh.polyhedra;\n\t\treturn_val_if_fail(polyhedra.clockwise_edges, component_center);\n\t\treturn_val_if_fail(polyhedra.edge_points, component_center);\n\t\treturn_val_if_fail(polyhedra.edge_selection, component_center);\n\t\tconst k3d::mesh::indices_t& clockwise_edges = *polyhedra.clockwise_edges;\n\t\tconst k3d::mesh::indices_t& edge_points = *polyhedra.edge_points;\n\t\tconst k3d::mesh::selection_t& edge_selection = *polyhedra.edge_selection;\n\t\t\n\t\tconst k3d::uint_t edge_count = edge_points.size();\n\t\tstd::set<k3d::uint_t> pointset; //ensure each point gets added only once\n\t\tfor (k3d::uint_t edge = 0; edge < edge_count; ++edge)\n\t\t{\n\t\t\tif (edge_selection[edge])\n\t\t\t{\n\t\t\t\tpointset.insert(edge_points[edge]);\n\t\t\t\tpointset.insert(edge_points[clockwise_edges[edge]]);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Selected faces ..\n\t\treturn_val_if_fail(Mesh.polyhedra, component_center);\n\t\treturn_val_if_fail(polyhedra.face_first_loops, component_center);\n\t\treturn_val_if_fail(polyhedra.loop_first_edges, component_center);\n\t\treturn_val_if_fail(polyhedra.face_selection, component_center);\n\t\tconst k3d::mesh::indices_t& face_first_loops = *polyhedra.face_first_loops;\n\t\tconst k3d::mesh::indices_t& loop_first_edges = *polyhedra.loop_first_edges;\n\t\tconst k3d::mesh::selection_t& face_selection = *polyhedra.face_selection;\n\t\n\t\tconst k3d::uint_t face_count = face_first_loops.size();\n\t\tfor(k3d::uint_t face = 0; face != face_count; ++face)\n\t\t{\n\t\t\tif (face_selection[face])\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_edge = loop_first_edges[face_first_loops[face]];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tpointset.insert(edge_points[edge]);\n\t\t\t\t\tedge = clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (std::set<k3d::uint_t>::const_iterator point = pointset.begin(); point != pointset.end(); ++ point)\n\t\t{\n\t\t\tPointList.push_back(*point);\n\t\t\tcomponent_center += to_vector(points[*point]);\n\t\t}\n\t}\n*/\n\n\t// Create the list of selected point indices ...\n\tconst k3d::uint_t point_begin = 0;\n\tconst k3d::uint_t point_end = point_begin + points.size();\n\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t{\n\t\tif(selected_point[point])\n\t\t\tPointList.push_back(point);\n\t}\n\n\t// Return the average position of the selected points ...\n\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t{\n\t\tif(selected_point[point])\n\t\t\tcomponent_center += k3d::to_vector(points[point]);\n\t}\n\n\tconst k3d::double_t point_count = static_cast<double>(PointList.size());\n\tif(point_count)\n\t\tcomponent_center /= point_count;\n\n\treturn component_center;\n}\n\n} // namespace detail\n\n\ttransform_tool::itarget::~itarget()\n\t{\n\t\tfor(connections_t::iterator connection = m_connections.begin(); connection != m_connections.end(); ++connection)\n\t\t{\n\t\t\tconnection->disconnect();\n\t\t}\n\t}\n\n\tk3d::matrix4 transform_tool::itarget::world_orientation()\n\t{\n\t\tif(LOCAL == current_system_type)\n\t\t\treturn k3d::extract_rotation(k3d::node_to_world_matrix(*node));\n\n\t\tif(PARENT == current_system_type)\n\t\t\treturn k3d::extract_rotation(k3d::parent_to_world_matrix(*node));\n\n\t\treturn k3d::identity3();\n\t}\n\n\tvoid transform_tool::itarget::set_transform_modifier(k3d::inode* Modifier)\n\t{\n\t\tmodifier = Modifier;\n\t\tm_connections.push_back(Modifier->deleted_signal().connect(sigc::mem_fun(*this, &itarget::reset_transform_modifier)));\n\t}\n\n\tvoid transform_tool::itarget::reset_transform_modifier()\n\t{\n\t\tmodifier = 0;\n\t}\n\n\tvoid transform_tool::itarget::set_coordinate_system_change_matrices()\n\t{\n\t\tswitch(current_system_type)\n\t\t{\n\t\t\tcase GLOBAL:\n\t\t\t\tm_system_matrix = k3d::inverse(k3d::node_to_world_matrix(*node));\n\t\t\t\tm_system_matrix_inverse = k3d::node_to_world_matrix(*node);\n\t\t\t\t// Zero translation components\n\t\t\t\tm_system_matrix[0][3] = m_system_matrix[1][3] = m_system_matrix[2][3] = 0;\n\t\t\t\tm_system_matrix_inverse[0][3] = m_system_matrix_inverse[1][3] = m_system_matrix_inverse[2][3] = 0;\n\t\t\t\tbreak;\n\t\t\tcase LOCAL:\n\t\t\t\tm_system_matrix = k3d::identity3();\n\t\t\t\tm_system_matrix_inverse = k3d::identity3();\n\t\t\t\tbreak;\n\t\t\tcase PARENT:\n\t\t\t\tm_system_matrix = k3d::inverse(k3d::node_to_world_matrix(*node)) * k3d::parent_to_world_matrix(*node);\n\t\t\t\tm_system_matrix_inverse = k3d::inverse(m_system_matrix);\n\t\t\t\t// Zero translation components\n\t\t\t\tm_system_matrix[0][3] = m_system_matrix[1][3] = m_system_matrix[2][3] = 0;\n\t\t\t\tm_system_matrix_inverse[0][3] = m_system_matrix_inverse[1][3] = m_system_matrix_inverse[2][3] = 0;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tassert_not_reached();\n\t\t}\n\t}\n\n\t// transform_target implementation\n\ttransform_tool::transform_target::transform_target(k3d::inode* Node)\n\t{\n\t\tnode = Node;\n\n\t\t// Sanity check\n\t\treturn_if_fail(node);\n\t}\n\n\tk3d::point3 transform_tool::transform_target::world_position()\n\t{\n\t\treturn k3d::world_position(*node);\n\t}\n\n\tunsigned long transform_tool::transform_target::target_number()\n\t{\n\t\t// There's always one object to move\n\t\treturn 1;\n\t}\n\n\tvoid transform_tool::transform_target::reset()\n\t{\n\t}\n\n\tvoid transform_tool::transform_target::start_move()\n\t{\n\t\tif(create_transform_modifier(k3d::classes::FrozenMatrix(), \"Move \"))\n\t\t\tassert_warning(k3d::property::set_internal_value(*modifier, \"matrix\", k3d::identity3()));\n\n\t\t// Setup matrices\n\t\tset_original_matrix();\n\n\t\tset_coordinate_system_change_matrices();\n\t}\n\n\tvoid transform_tool::transform_target::move(const k3d::vector3& Move)\n\t{\n\t\tif(!modifier)\n\t\t\tstart_move();\n\n\t\tconst k3d::matrix4 translation = k3d::translate3(m_system_matrix * Move);\n\t\tassert_warning(k3d::property::set_internal_value(*modifier, \"matrix\", m_original_matrix * translation));\n\t}\n\n\tvoid transform_tool::transform_target::start_rotation()\n\t{\n\t\tif(create_transform_modifier(k3d::classes::FrozenMatrix(), \"Rotate \"))\n\t\t\tassert_warning(k3d::property::set_internal_value(*modifier, \"matrix\", k3d::identity3()));\n\n\t\t// Setup matrices\n\t\tset_original_matrix();\n\n\t\tset_coordinate_system_change_matrices();\n\t}\n\n\tvoid transform_tool::transform_target::rotate(const k3d::matrix4& RotationMatrix, const k3d::point3& WorldCenter)\n\t{\n\t\tif(!modifier)\n\t\t\tstart_rotation();\n\t\t\n\t\tk3d::vector3 translation = WorldCenter - m_original_matrix * k3d::point3(0,0,0);\n\t\t\n\t\tconst k3d::matrix4 current_coordinate_system_rotation = m_system_matrix * k3d::translate3(translation) * RotationMatrix * k3d::translate3(-translation) * m_system_matrix_inverse;\n\t\tassert_warning(k3d::property::set_internal_value(*modifier, \"matrix\", m_original_matrix * current_coordinate_system_rotation));\n\t}\n\n\tvoid transform_tool::transform_target::start_scaling()\n\t{\n\t\tif(create_transform_modifier(k3d::classes::FrozenMatrix(), \"Scale \"))\n\t\t\tassert_warning(k3d::property::set_internal_value(*modifier, \"matrix\", k3d::identity3()));\n\n\t\t// Setup matrices\n\t\tset_original_matrix();\n\n\t\tset_coordinate_system_change_matrices();\n\t}\n\n\tvoid transform_tool::transform_target::scale(const k3d::point3& Scaling, const k3d::point3& WorldCenter)\n\t{\n\t\tif(!modifier)\n\t\t\tstart_scaling();\n\t\t\n\t\tk3d::vector3 translation = WorldCenter - m_original_matrix * k3d::point3(0,0,0);\n\n\t\tconst k3d::matrix4 current_coordinate_system_scaling = m_system_matrix * k3d::translate3(translation) * k3d::scale3(Scaling[0], Scaling[1], Scaling[2]) * k3d::translate3(-translation) * m_system_matrix_inverse;\n\t\tassert_warning(k3d::property::set_internal_value(*modifier, \"matrix\", m_original_matrix * current_coordinate_system_scaling));\n\t}\n\n\tvoid transform_tool::transform_target::end_drag_motion()\n\t{\n\t}\n\n\tbool transform_tool::transform_target::create_transform_modifier(const k3d::uuid& Class, const std::string& Name)\n\t{\n\t\tif(modifier)\n\t\t\treturn false;\n\n\t\treturn_val_if_fail(node, false);\n\n\t\t// Check for an existing transform modifier\n\t\tk3d::inode* upstream_node = 0;\n\t\t\n\t\tk3d::imatrix_sink* const downstream_sink = dynamic_cast<k3d::imatrix_sink*>(node);\n\t\treturn_val_if_fail(downstream_sink, false);\n\t\tk3d::iproperty& downstream_input = downstream_sink->matrix_sink_input();\n\t\tk3d::iproperty* upstream_output = node->document().pipeline().dependency(downstream_input);\n\n\t\t// Check upstream object\n\t\tif(upstream_output)\n\t\t\tupstream_node = upstream_output->property_node();\n\t\t\n\t\t/** \\todo check for same name too */\n\t\tif(upstream_node && (Class == upstream_node->factory().factory_id()))\n\t\t{\n\t\t\tset_transform_modifier(upstream_node);\n\t\t\treturn false;\n\t\t}\n\t\telse if (upstream_node && dynamic_cast<k3d::ikeyframer*>(upstream_node))\n\t\t{\n\t\t\tk3d::ikeyframer* keyframer = dynamic_cast<k3d::ikeyframer*>(upstream_node);\n\t\t\tk3d::iproperty& downstream_input2 = keyframer->input_property();\n\t\t\tupstream_output = node->document().pipeline().dependency(downstream_input2);\n\t\t\tif(upstream_output)\n\t\t\t\tupstream_node = upstream_output->property_node();\n\t\t\tif(upstream_node && (Class == upstream_node->factory().factory_id()))\n\t\t\t{\n\t\t\t\tset_transform_modifier(upstream_node);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst std::string modifier_name = Name + node->name();\n\t\t\t\tmodifier = k3d::plugin::create<k3d::inode>(Class, node->document(), modifier_name);\n\t\t\t\treturn_val_if_fail(modifier, false);\n\t\t\t\n\t\t\t\tk3d::ipipeline::dependencies_t dependencies;\n\t\t\t\tdependencies.insert(std::make_pair(&dynamic_cast<k3d::imatrix_sink*>(modifier)->matrix_sink_input(), upstream_output));\n\t\t\t\tdependencies.insert(std::make_pair(&downstream_input2, &dynamic_cast<k3d::imatrix_source*>(modifier)->matrix_source_output()));\n\t\t\t\tnode->document().pipeline().set_dependencies(dependencies);\n\t\t\t\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\t\n\n\t\tconst std::string modifier_name = Name + node->name();\n\t\tset_transform_modifier(insert_transform_modifier(*node, Class, modifier_name));\n\n\t\treturn true;\n\t}\n\t\n\tvoid transform_tool::transform_target::set_original_matrix()\n\t{\n\t\treturn_if_fail(node && modifier);\n\t\tk3d::matrix4 node_input_matrix = boost::any_cast<k3d::matrix4>(k3d::property::pipeline_value(*node, \"input_matrix\"));\n\t\tk3d::matrix4 modifier_input_matrix = boost::any_cast<k3d::matrix4>(k3d::property::pipeline_value(*modifier, \"input_matrix\"));\n\t\t// Calculate the original matrix back from the current node matrix, in case it got changed by i.e. an animation track\n\t\tm_original_matrix = inverse(modifier_input_matrix) * node_input_matrix;\n\t}\n\n\t// mesh_target implementation\n\ttransform_tool::mesh_target::mesh_target(document_state& DocumentState, k3d::inode* Node, k3d::iproperty& MeshSourceProperty) :\n\t\tm_document_state(DocumentState),\n\t\tmesh_source_property(MeshSourceProperty),\n\t\tcomponent_center(k3d::point3(0, 0, 0)),\n\t\tm_mesh_changed(true),\n\t\tm_drag_mutex(false)\n\t{\n\t\tnode = Node;\n\n\t\t// Sanity checks\n\t\treturn_if_fail(node);\n\n\t\t// Connect to mesh_source change_signal to be acknowledged of changes\n\t\tm_mesh_change_signal = mesh_source_property.property_changed_signal().connect(sigc::mem_fun(*this, &transform_tool::mesh_target::mesh_changed));\n\n\t\treset_selection();\n\t}\n\n\tk3d::point3 transform_tool::mesh_target::world_position()\n\t{\n\t\tif(!m_drag_mutex && m_mesh_changed)\n\t\t\treset_selection();\n\n\t\treturn k3d::node_to_world_matrix(*node) * component_center;\n\t}\n\n\tunsigned long transform_tool::mesh_target::target_number()\n\t{\n\t\treturn selected_points.size();\n\t}\n\n\tvoid transform_tool::mesh_target::reset_selection()\n\t{\n\t\tif(m_drag_mutex)\n\t\t\treturn;\n\t\t\n\t\tconst k3d::mesh* const mesh = k3d::property::pipeline_value<k3d::mesh*>(mesh_source_property);\n\t\treturn_if_fail(mesh);\n\n\t\t// Get selection\n\t\tcomponent_center = detail::get_selected_points(selection::state(m_document_state.document()).current_mode(), *mesh, selected_points);\n\t\t// Set initial positions (needs to be a copy, since the given property is the output mesh)\n\t\tinitial_positions = *mesh->points;\n\n\t\tm_mesh_changed = false;\n\t}\n\n\tvoid transform_tool::mesh_target::reset()\n\t{\n\t\tif(m_drag_mutex)\n\t\t\treturn;\n\n\t\t// Reset position\n\t\treset_selection();\n\n\t\tmodifier = 0;\n\t}\n\n\tvoid transform_tool::mesh_target::init_transformation()\n\t{\n\t\tset_coordinate_system_change_matrices();\n\t}\n\n\tvoid transform_tool::mesh_target::start_move()\n\t{\n\t\tcreate_mesh_modifier(\"Move \");\n\t\tinit_transformation();\n\t\tm_origin = component_center;\n\t}\n\n\tvoid transform_tool::mesh_target::move(const k3d::vector3& Move)\n\t{\n\t\tif(!modifier)\n\t\t\tstart_move();\n\n\t\tm_drag_mutex = true;\n\t\t\n\t\tfor(k3d::uint_t i = 0; i != selected_points.size(); ++i)\n\t\t\tpoint_positions.push_back(m_system_matrix * Move + initial_positions[selected_points[i]]);\n\n\t\t// Update manipulators position\n\t\tcomponent_center = m_system_matrix * Move + m_origin;\n\n\t\tupdate_mesh_modifier();\n\t}\n\n\tvoid transform_tool::mesh_target::start_rotation()\n\t{\n\t\tcreate_mesh_modifier(\"Rotate \");\n\t\tinit_transformation();\n\t}\n\n\tvoid transform_tool::mesh_target::rotate(const k3d::matrix4& RotationMatrix, const k3d::point3& WorldCenter)\n\t{\n\t\tif(!modifier)\n\t\t\tstart_rotation();\n\n\t\tm_drag_mutex = true;\n\t\t\n\t\tconst k3d::matrix4 current_coordinate_system_rotation = m_system_matrix * RotationMatrix * m_system_matrix_inverse;\n\t\tconst k3d::point3 center = k3d::inverse(k3d::node_to_world_matrix(*node)) * WorldCenter;\n\n\t\tfor(k3d::uint_t i = 0; i != selected_points.size(); ++i)\n\t\t\tpoint_positions.push_back(current_coordinate_system_rotation * (initial_positions[selected_points[i]] - center) + center);\n\n\t\tupdate_mesh_modifier();\n\t}\n\n\tvoid transform_tool::mesh_target::start_scaling()\n\t{\n\t\tcreate_mesh_modifier(\"Scale \");\n\t\tinit_transformation();\n\t}\n\n\tvoid transform_tool::mesh_target::scale(const k3d::point3& Scaling, const k3d::point3& WorldCenter)\n\t{\n\t\tif(!modifier)\n\t\t\tstart_scaling();\n\n\t\tm_drag_mutex = true;\n\n\t\tconst k3d::matrix4 current_coordinate_system_scaling = m_system_matrix * k3d::scale3(Scaling[0], Scaling[1], Scaling[2]) * m_system_matrix_inverse;\n\t\tconst k3d::point3 center = k3d::inverse(k3d::node_to_world_matrix(*node)) * WorldCenter;\n\n\t\tfor(k3d::uint_t i = 0; i != selected_points.size(); ++i)\n\t\t\tpoint_positions.push_back(current_coordinate_system_scaling * (initial_positions[selected_points[i]] - center) + center);\n\n\t\tupdate_mesh_modifier();\n\t}\n\n\tvoid transform_tool::mesh_target::end_drag_motion()\n\t{\n\t\tm_drag_mutex = false;\n\t}\n\n\tvoid transform_tool::mesh_target::create_mesh_modifier(const std::string& Name)\n\t{\n\t\tif (!modifier)\n\t\t{\n\t\t\treturn_if_fail(node);\n\n\t\t\t// Modify with TweakPoints\n\t\t\tconst k3d::uuid tweak_points(0xed302b87, 0x49bf4fe6, 0x99064963, 0x17ec12d9);\n\n\t\t\t// Check for an existing mesh modifier\n\t\t\tk3d::inode* upstream_node = upstream_mesh_modifier(*node);\n\t\t\tif(upstream_node && (tweak_points == upstream_node->factory().factory_id()))\n\t\t\t{\n\t\t\t\tset_transform_modifier(upstream_node);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst std::string modifier_name = Name + node->name() + \" components\";\n\t\t\t\tset_transform_modifier(insert_mesh_modifier(*node, tweak_points, modifier_name));\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid transform_tool::mesh_target::update_mesh_modifier()\n\t{\n\t\tassert_warning(k3d::property::set_internal_value(*modifier, \"tweaks\", std::make_pair(selected_points, point_positions)));\n\t\tpoint_positions.clear();\n\t}\n\n\n// transform_tool implementation\n\ntransform_tool::~transform_tool()\n{\n\tfor(connections_t::iterator connection = m_connections.begin(); connection != m_connections.end(); ++connection)\n\t{\n\t\tconnection->disconnect();\n\t}\n\tclear_targets();\n}\n\t\nvoid transform_tool::lbutton_down(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::key_modifiers& Modifiers)\n{\n\t// Return if an action is in progress\n\tif(MOTION_CLICK_DRAG == m_current_motion)\n\t\treturn;\n\n\tassert_warning(MOTION_NONE == m_current_motion);\n\n\t// Init action\n\tm_mouse_down_content = NOTHING;\n\n\t// Find what's under the mouse pointer\n\tk3d::selection::records picked_selectables;\n\tpick_selectables(picked_selectables, Viewport, Coordinates);\n\n\t// Shift modifier starts ADD action\n\tif(Modifiers.shift())\n\t{\n\t\tlmb_down_add();\n\t\treturn;\n\t}\n\n\t// Control modifier starts SUBTRACT action\n\tif(Modifiers.control())\n\t{\n\t\tlmb_down_subtract();\n\t\treturn;\n\t}\n\n\t// Manipulator selection starts move\n\tdetail::manipulators_t manipulators;\n\tfor(k3d::selection::records::iterator record = picked_selectables.begin(); record != picked_selectables.end(); ++record)\n\t{\n\t\tfor(k3d::selection::record::tokens_t::const_iterator token = record->tokens.begin(); token != record->tokens.end(); ++token)\n\t\t{\n\t\t\tif(token->type == k3d::selection::USER1)\n\t\t\t\tmanipulators.push_back(manipulator_name(token->id));\n\t\t}\n\t}\n\n\tconst std::string manipulator = get_manipulator(manipulators);\n\tif(manipulator != \"\")\n\t{\n\t\tlmb_down_manipulator(manipulator);\n\t\treturn;\n\t}\n\n\t// If a node was hit ...\n\tif(k3d::selection::get_node(m_mouse_down_selection))\n\t{\n\t\tif(selection::state(m_document_state.document()).is_selected(m_mouse_down_selection))\n\t\t\tlmb_down_selected();\n\t\telse\n\t\t\tlmb_down_deselected();\n\n\t\treturn;\n\t}\n\n\tlmb_down_nothing();\n}\n\n// LMB down actions\nvoid transform_tool::lmb_down_add()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\tm_mouse_down_content = SELECTION_ADD;\n}\n\nvoid transform_tool::lmb_down_subtract()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\tm_mouse_down_content = SELECTION_SUBTRACT;\n}\n\nvoid transform_tool::lmb_down_manipulator(const std::string& ManipulatorName)\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\n\tset_manipulator(ManipulatorName);\n\tset_motion(MOTION_DRAG);\n\n\tm_mouse_down_content = SELECTED_OBJECT;\n}\n\nvoid transform_tool::lmb_down_selected()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\tm_mouse_down_content = SELECTED_OBJECT;\n}\n\nvoid transform_tool::lmb_down_deselected()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\tm_mouse_down_content = DESELECTED_OBJECT;\n\n\t// Deselect all\n\tselection::state(m_document_state.document()).deselect_all();\n\t// Select clicked object\n\tselection::state(m_document_state.document()).select(m_mouse_down_selection);\n}\n\nvoid transform_tool::lmb_down_nothing()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\tm_mouse_down_content = NOTHING;\n}\n\nvoid transform_tool::lbutton_click(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_CLICK_DRAG == m_current_motion)\n\t{\n\t\t// Stop click-drag\n\t\tlmb_click_stop_motion();\n\t\treturn;\n\t}\n\n\tswitch(m_mouse_down_content)\n\t{\n\t\tcase SELECTION_ADD:\n\t\t\tlmb_click_add(Viewport, Coordinates);\n\t\tbreak;\n\t\tcase SELECTION_SUBTRACT:\n\t\t\tlmb_click_subtract(Viewport, Coordinates);\n\t\tbreak;\n\t\tcase SELECTED_OBJECT:\n\t\t\tlmb_click_start_motion(Coordinates);\n\t\tbreak;\n\t\tcase DESELECTED_OBJECT:\n\t\t\tlmb_click_replace(Viewport, Coordinates);\n\t\tbreak;\n\t\tcase NOTHING:\n\t\t\tlmb_click_deselect_all();\n\t\tbreak;\n\t\tdefault:\n\t\t\tassert_not_reached();\n\t}\n}\n\n// LMB click actions\nvoid transform_tool::lmb_click_add(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\t// Shift key modifier always adds to the selection\n//\tinteractive::move_pointer(Viewport, Coordinates);\n\tselection::state(m_document_state.document()).select(Viewport.pick_object(Coordinates, m_document_state.pick_backfacing()));\n\n\tk3d::finish_state_change_set(m_document, \"Selection add\", K3D_CHANGE_SET_CONTEXT);\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::lmb_click_subtract(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\t// Control key modifier always adds to the selection\n//\tinteractive::move_pointer(Viewport, Coordinates);\n\tselection::state(m_document_state.document()).deselect(Viewport.pick_object(Coordinates, m_document_state.pick_backfacing()));\n\n\tk3d::finish_state_change_set(m_document, \"Selection subtract\", K3D_CHANGE_SET_CONTEXT);\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::lmb_click_replace(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n//\tinteractive::move_pointer(Viewport, Coordinates);\n\tselection::state(m_document_state.document()).select(Viewport.pick_object(Coordinates, m_document_state.pick_backfacing()));\n\n\tk3d::finish_state_change_set(m_document, \"Selection replace\", K3D_CHANGE_SET_CONTEXT);\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::lmb_click_start_motion(const k3d::point2& Coordinates)\n{\n\tdisconnect_navigation_input_model();\n\n\tset_motion(MOTION_CLICK_DRAG);\n\tbegin_mouse_move(Coordinates);\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::lmb_click_stop_motion()\n{\n\tend_drag_motion();\n\t\n\tconst std::string label = complete_mouse_move();\n\tk3d::finish_state_change_set(m_document, label, K3D_CHANGE_SET_CONTEXT);\n\n\tconnect_navigation_input_model();\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::lmb_click_deselect_all()\n{\n\t// Deselect all\n\tselection::state(m_document_state.document()).deselect_all();\n\n\tk3d::finish_state_change_set(m_document, \"Deselect all\", K3D_CHANGE_SET_CONTEXT);\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::lbutton_start_drag(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tdisconnect_navigation_input_model();\n\n\tswitch(m_mouse_down_content)\n\t{\n\t\tcase SELECTED_OBJECT:\n\t\tcase DESELECTED_OBJECT:\n\t\t\tlmb_start_drag_start_motion(Coordinates);\n\t\tbreak;\n\t\tcase SELECTION_ADD:\n\t\tcase SELECTION_SUBTRACT:\n\t\tcase NOTHING:\n\t\t\tlmb_start_drag_box_select(Viewport, Coordinates);\n\t\tbreak;\n\t\tdefault:\n\t\t\tassert_not_reached();\n\t}\n}\n\n// LMB start drag actions\nvoid transform_tool::lmb_start_drag_start_motion(const k3d::point2& Coordinates)\n{\n\tm_off_screen_offset = k3d::point2(0, 0);\n\n\tset_motion(MOTION_DRAG);\n\tbegin_mouse_move(Coordinates);\n}\n\nvoid transform_tool::lmb_start_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tset_motion(MOTION_BOX_SELECT);\n\tm_box_selection = k3d::rectangle(Coordinates[0], Coordinates[0], Coordinates[1], Coordinates[1]);\n\tdraw_rubber_band(Viewport);\n}\n\nvoid transform_tool::lmb_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\ton_box_select_motion(Viewport, Coordinates);\n}\n\nvoid transform_tool::lbutton_end_drag(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_DRAG == m_current_motion)\n\t\tlmb_end_drag_stop_motion();\n\telse if(MOTION_BOX_SELECT == m_current_motion)\n\t\tlmb_end_drag_box_select(Viewport, Coordinates);\n\n\tconnect_navigation_input_model();\n}\n\n// LMB end drag actions\nvoid transform_tool::lmb_end_drag_stop_motion()\n{\n\tend_drag_motion();\n\t\n\tconst std::string label = complete_mouse_move();\n\tk3d::finish_state_change_set(m_document, label, K3D_CHANGE_SET_CONTEXT);\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::lmb_end_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tdraw_rubber_band(Viewport);\n\n\ton_box_select_objects(Viewport, Coordinates, m_box_selection);\n\n\t// Stop motion\n\tset_motion(MOTION_NONE);\n\n\tk3d::finish_state_change_set(m_document, \"Box selection\", K3D_CHANGE_SET_CONTEXT);\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::mbutton_click(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::key_modifiers& Modifiers)\n{\n\t// Motion mode\n\tif(MOTION_NONE != m_current_motion)\n\t{\n\t\tmmb_click_next_constraint(Viewport, Coordinates);\n\t\treturn;\n\t}\n\n\t// We aren't moving\n\tif(Modifiers.control())\n\t{\n\t\tmmb_click_switch_coordinate_system();\n\t}\n\telse if(Modifiers.shift())\n\t{\n\t\tmmb_click_manipulators_next_selection();\n\t}\n\telse\n\t{\n\t\tmmb_click_toggle_manipulators_visibility();\n\t}\n}\n\nvoid transform_tool::mmb_click_toggle_manipulators_visibility()\n{\n\t// Toggle the visible state of the manipulators\n\tm_visible_manipulators.set_value(!m_visible_manipulators.internal_value());\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::mmb_click_manipulators_next_selection()\n{\n\t// Show manipulators on the next selection\n\tm_current_target = m_targets.size() ? (m_current_target + 1) % m_targets.size() : 0;\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::mmb_click_switch_coordinate_system()\n{\n\t// Switch coordinate system between global and local modes\n\tswitch(m_coordinate_system.internal_value())\n\t{\n\t\tcase GLOBAL:\n\t\t\tset_coordinate_system(LOCAL);\n\t\t\tbreak;\n\t\tcase LOCAL:\n\t\t\tset_coordinate_system(GLOBAL);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::mmb_click_next_constraint(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\t// Set next constraint\n\tupdate_constraint(Viewport, Coordinates);\n\n/*\n\t// Mouse warp\n\tconst k3d::point2 coords = Viewport.project(world_position());\n\n\tint root_x = 0;\n\tint root_y = 0;\n\tViewport.get_window()->get_origin(root_x, root_y);\n\n\tconst k3d::point2 screen_coords = k3d::point2(coords[0] + root_x, coords[1] + root_y);\n\n\t// We temporarily disable motion, so warping the pointer doesn't cause unintended side effects\n\tconst motion_t current_motion = m_current_motion;\n\tm_current_motion = MOTION_NONE;\n\tinteractive::warp_pointer(screen_coords);\n\thandle_pending_events();\n\n\t// Acknowledge new mouse position\n\tm_current_constraint->begin_mouse_move(coords);\n\n\tm_current_motion = current_motion;\n*/\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::rbutton_click(const viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_NONE == m_current_motion)\n\t\trmb_click_selection_tool();\n\telse\n\t\trmb_click_cancel_move();\n}\n\n// RMB click actions\nvoid transform_tool::rmb_click_selection_tool()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\n\tm_document_state.set_active_tool(m_document_state.selection_tool());\n\n\tk3d::finish_state_change_set(m_document, \"Selection tool\", K3D_CHANGE_SET_CONTEXT);\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::rmb_click_cancel_move()\n{\n\tcancel_mouse_move();\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::cancel_mouse_move()\n{\n\t// Stop motion\n\tset_motion(MOTION_NONE);\n\n\tend_drag_motion();\n\t\n\t// Undo changes\n\tk3d::cancel_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\n\t// Reset targets\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t(*target)->reset();\n\n\treset();\n\n\ttool_selection::redraw_all();\n}\n\nstd::string transform_tool::complete_mouse_move()\n{\n\tset_motion(MOTION_NONE);\n\n\treturn get_constraint_name();\n}\n\nvoid transform_tool::set_motion(const motion_t Motion)\n{\n\tm_current_motion = Motion;\n}\n\n/// Returns current target's world position\nk3d::point3 transform_tool::world_position()\n{\n\tif(target_number())\n\t{\n\t\tif(selection::NODE == selection::state(m_document_state.document()).current_mode())\n\t\t{\n\t\t\tm_current_target = m_current_target % m_targets.size();\n\t\t\titarget* t = m_targets[m_current_target];\n\t\t\treturn t->world_position();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tk3d::point3 position(0, 0, 0);\n\t\t\tunsigned long count = 0;\n\t\t\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t\t{\n\t\t\t\tif((*target)->target_number())\n\t\t\t\t{\n\t\t\t\t\tposition += to_vector((*target)->world_position());\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tposition /= static_cast<double>(count);\n\n\t\t\treturn position;\n\t\t}\n\t}\n\n\treturn k3d::point3(0, 0, 0);\n}\n\n/// Returns current target's world orientation\nk3d::matrix4 transform_tool::world_orientation()\n{\n\tif(target_number())\n\t{\n\t\tm_current_target = m_current_target % m_targets.size();\n\t\titarget* t = m_targets[m_current_target];\n\n\t\treturn t->world_orientation();\n\t}\n\n\treturn k3d::identity3();\n}\n\nvoid transform_tool::update_manipulators_scale(viewport::control& Viewport, const k3d::point3& Origin)\n{\n\tk3d::icamera* camera = Viewport.camera();\n\treturn_if_fail(camera);\n\n\t// Project unit axis on screen space\n\tconst k3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*Viewport.camera());\n\tconst k3d::vector3 screen_parallel = screen_matrix * k3d::vector3(1, 0, 0);\n\tconst k3d::point2 position = Viewport.project(Origin);\n\tconst k3d::point2 x_axis = Viewport.project(Origin + screen_parallel);\n\tconst double length = k3d::distance(position, x_axis);\n\n\treturn_if_fail(length);\n\tm_manipulators_scale = m_manipulators_size / length;\n}\n\nbool transform_tool::front_facing(viewport::control& Viewport, const k3d::vector3& Normal, const k3d::point3& Origin)\n{\n\treturn_val_if_fail(Viewport.gl_engine(), false);\n\treturn_val_if_fail(Viewport.camera(), false);\n\n\tconst k3d::matrix4 matrix = k3d::inverse(k3d::node_to_world_matrix(*Viewport.camera()));\n\tconst k3d::matrix4 orientation = world_orientation();\n\tconst k3d::point3 a = Origin + (orientation * Normal);\n\tconst k3d::point3 b = Origin + (orientation * -Normal);\n\treturn k3d::to_vector(matrix * a).length2() < k3d::to_vector(matrix * b).length2();\n}\n\nvoid transform_tool::off_screen_warp(viewport::control& Viewport, k3d::point2& NewCoordinates)\n{\n\t// Get mouse coordinates\n\tint x, y;\n\tGdk::ModifierType modifiers;\n\tGdk::Display::get_default()->get_pointer(x, y, modifiers);\n\tk3d::point2 mouse(x, y);\n\n\t// Check for screen warp\n\tbool screen_warp = false;\n\tconst k3d::point2 previous_offset = m_off_screen_offset;\n\n\t// Wrap the mouse if it goes off the top-or-bottom of the screen ...\n\tconst int screen_height = Gdk::Display::get_default()->get_default_screen()->get_height();\n\tif(y == 0)\n\t{\n\t\tmouse = k3d::point2(mouse[0], screen_height - 2);\n\t\tscreen_warp = true;\n\n\t\tm_off_screen_offset[1] -= screen_height;\n\t}\n\telse if(screen_height - 1 == y)\n\t{\n\t\tmouse = k3d::point2(mouse[0], 1);\n\t\tscreen_warp = true;\n\n\t\tm_off_screen_offset[1] += screen_height;\n\t}\n\n\t// Wrap the mouse if it goes off the left-or-right of the screen ...\n\tconst int screen_width = Gdk::Display::get_default()->get_default_screen()->get_width();\n\tif(x == 0)\n\t{\n\t\tmouse = k3d::point2(screen_width - 2, mouse[1]);\n\t\tscreen_warp = true;\n\n\t\tm_off_screen_offset[0] -= screen_width;\n\t}\n\telse if(screen_width - 1 == x)\n\t{\n\t\tmouse = k3d::point2(1, mouse[1]);\n\t\tscreen_warp = true;\n\n\t\tm_off_screen_offset[0] += screen_width;\n\t}\n\n\tif(!screen_warp)\n\t{\n\t\t// No warp\n\t\tNewCoordinates += k3d::to_vector(m_off_screen_offset);\n\t}\n\telse\n\t{\n\t\t// Warp mouse pointer\n\t\tinteractive::warp_pointer(mouse);\n\n\t\t// Set new position\n\t\tNewCoordinates += k3d::to_vector(previous_offset);\n\t}\n}\n\nvoid transform_tool::clear_targets()\n{\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t{\n\t\tdelete *target;\n\t}\n\n\tm_targets.clear();\n}\n\n/// Retrieves the current document selection, refreshing the target list\nvoid transform_tool::get_current_selection()\n{\n\t// Convert the current document selection into the set of targets to be moved interactively\n\tclear_targets();\n\n\tconst k3d::nodes_t nodes = selection::state(m_document_state.document()).selected_nodes();\n\n\tif(selection::NODE == selection::state(m_document_state.document()).current_mode())\n\t{\n\t\t// Save transformable nodes as targets\n\t\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\tif(!dynamic_cast<k3d::gl::irenderable*>(*node))\n\t\t\t\tcontinue;\n\t\t\tif(!dynamic_cast<k3d::imatrix_sink*>(*node))\n\t\t\t\tcontinue;\n\n\t\t\tm_targets.push_back(new transform_target(*node));\n\t\t\tm_connections.push_back((*node)->deleted_signal().connect(sigc::mem_fun(*this, &transform_tool::target_list_changed)));\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Component mode : save mesh nodes as targets\n\t\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\tif(!dynamic_cast<k3d::gl::irenderable*>(*node))\n\t\t\t\tcontinue;\n\n\t\t\t// Get node's mesh\n\t\t\tk3d::imesh_source* const mesh_source = dynamic_cast<k3d::imesh_source*>(*node);\n\t\t\tif(!mesh_source)\n\t\t\t\tcontinue;\n\n\t\t\t// Get non-transformed mesh output\n\t\t\tk3d::iproperty& property = mesh_source->mesh_source_output();\n\t\t\tm_targets.push_back(new mesh_target(m_document_state, *node, property));\n\n\t\t\tm_connections.push_back((*node)->deleted_signal().connect(sigc::mem_fun(*this, &transform_tool::target_list_changed)));\n\t\t}\n\t}\n\n\tupdate_coordinate_system(0);\n}\n\nunsigned long transform_tool::target_number()\n{\n\tunsigned long target_count = 0;\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\ttarget_count += (*target)->target_number();\n\n\treturn target_count;\n}\n\nvoid transform_tool::update_targets()\n{\n\t// Update selection on new or deleted node(s)\n\tif(m_node_selection_changed)\n\t{\n\t\tget_current_selection();\n\t\tm_node_selection_changed = false;\n\t}\n}\n\nvoid transform_tool::start_move()\n{\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t(*target)->start_move();\n}\n\nvoid transform_tool::move_targets(const k3d::vector3& Move)\n{\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t(*target)->move(Move);\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::start_rotation()\n{\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t(*target)->start_rotation();\n}\n\nvoid transform_tool::rotate_targets(const k3d::matrix4& Rotation)\n{\n\tif(!m_targets.size())\n\t\treturn;\n\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t(*target)->rotate(Rotation, world_position());\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::start_scaling()\n{\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t(*target)->start_scaling();\n}\n\nvoid transform_tool::scale_targets(const k3d::point3& Scaling)\n{\n\tif(!m_targets.size())\n\t\treturn;\n\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t(*target)->scale(Scaling, world_position());\n\n\ttool_selection::redraw_all();\n}\n\nvoid transform_tool::end_drag_motion()\n{\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t(*target)->end_drag_motion();\n}\n\nvoid transform_tool::set_coordinate_system(const coordinate_system_t CoordinateSystem)\n{\n\tm_coordinate_system.set_value(CoordinateSystem);\n}\n\n/// Updates all targets : tells them what's the new coordinate system\nvoid transform_tool::update_coordinate_system(k3d::iunknown*)\n{\n\tswitch(m_coordinate_system.internal_value())\n\t{\n\t\tcase GLOBAL:\n\t\t\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t\t\t(*target)->set_global();\n\t\t\tbreak;\n\t\tcase LOCAL:\n\t\t\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t\t\t(*target)->set_local();\n\t\t\tbreak;\n\t\tcase PARENT:\n\t\t\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t\t\t(*target)->set_parent();\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tassert_not_reached();\n\t}\n\n\ttool_selection::redraw_all();\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/transform_tool.h",
    "content": "#ifndef K3DSDK_NGUI_TRANSFORM_TOOL_H\n#define K3DSDK_NGUI_TRANSFORM_TOOL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/ngui/basic_viewport_input_model.h>\n#include <k3dsdk/ngui/navigation_input_model.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/tool.h>\n#include <k3dsdk/ngui/tool_selection.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n\n#include <k3dsdk/gl.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/keyboard.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/transform.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\ntypedef std::vector<std::string> manipulators_t;\n\n// typedef struct\n// {\n// \tunsigned long index;\n// \tk3d::point3 initial_position;\n// \tk3d::point3 tweak_value;\n// } component_point_t;\n\ntypedef k3d::mesh::indices_t component_points_t;\n\n/// Lists selected points in a mesh and returns average component position\nk3d::point3 get_selected_points(selection::mode SelectionMode, const k3d::mesh& Mesh, component_points_t& PointList);\n\ntemplate<typename Type>\nclass imanipulators\n{\npublic:\n\tvirtual ~imanipulators() {}\n\n\tvirtual void activate() = 0;\n\tvirtual void redraw(viewport::control& Viewport, const bool Visible, const k3d::point3& Position, const k3d::matrix4& Orientation, tool_selection::motion_t Motion, const k3d::point3& Scaling) = 0;\n\tvirtual void select(viewport::control& Viewport, const k3d::point3& Position, const k3d::matrix4& Orientation) = 0;\n\tvirtual std::string get_constraint_name() = 0;\n\tvirtual Glib::RefPtr<Gdk::Pixbuf> set_constraint(const std::string& Name) = 0;\n\tvirtual std::string constraint_name(const k3d::selection::id ID) = 0;\n\tvirtual void update_constraint(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::point3& Position, const k3d::matrix4& Orientation) = 0;\n\tvirtual void begin_mouse_move(const k3d::point2& Coordinates, const k3d::point3& Origin) = 0;\n\tvirtual Type mouse_move(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::point3& Position, const k3d::matrix4& Orientation) = 0;\n};\ndouble manipulators_scale(viewport::control& Viewport, const k3d::point3& Origin, const double Size);\n\n/// Returns whether given direction faces the screen\nbool is_front_facing(viewport::control& Viewport, const k3d::vector3& Normal, const k3d::point3& Origin, const k3d::matrix4& Orientation);\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// transform_tool\n\nclass transform_tool :\n\tpublic tool,\n\tpublic tool_selection,\n\tpublic k3d::property_collection\n{\n\ttypedef tool tool_base;\n\ttypedef tool_selection tool_selection_base;\n\npublic:\n\ttransform_tool(k3d::idocument& Document, document_state& DocumentState, const std::string& Name) :\n\t\ttool_base(DocumentState, Name),\n\t\ttool_selection_base(Document, DocumentState),\n\t\tk3d::property_collection(),\n\t\tm_document(Document),\n\t\tm_document_state(DocumentState),\n\t\tm_navigation_model(DocumentState),\n\t\tm_current_target(0),\n\t\tm_node_selection_changed(false),\n\t\tm_coordinate_system(init_owner(*this) + init_name(\"coordinate_system\") + init_label(_(\"Coordinate system\")) + init_description(_(\"Coordinate system in which the transformation occurs\")) + init_value(GLOBAL) + init_enumeration(coordinate_system_values())),\n\t\tm_visible_manipulators(init_owner(*this) + init_name(\"visible_manipulators\") + init_label(_(\"Visible manipulators\")) + init_description(_(\"Shows/hides manipulators\")) + init_value(true))\n\t{\n\t\tm_coordinate_system.changed_signal().connect(sigc::mem_fun(*this, &transform_tool::update_coordinate_system));\n\t\tm_visible_manipulators.changed_signal().connect(sigc::mem_fun(*this, &tool_selection::redraw_all));\n\n\t\tconnect_navigation_input_model();\n\t}\n\n\tvirtual ~transform_tool();\n\n\t// Interface required for data containers\n\tk3d::idocument& document()\n\t{\n\t\treturn m_document;\n\t}\n\n\tnavigation_input_model& navigation_model()\n\t{\n\t\treturn m_navigation_model;\n\t}\n\n\tbasic_viewport_input_model& input_model()\n\t{\n\t\treturn m_input_model;\n\t}\n\n\t// Functions executed by transform_tool that rely on transform_tool's derived classes functions\n\tvirtual std::string manipulator_name(const k3d::selection::id ID) = 0;\n\ttypedef std::vector<std::string> manipulators_t;\n\tvirtual std::string get_manipulator(const manipulators_t& Manipulators) = 0;\n\tvirtual void set_manipulator(const std::string ManipulatorName) = 0;\n\tvirtual std::string get_constraint_name() = 0;\n\n\tvirtual void begin_mouse_move(const k3d::point2& Coordinates) = 0;\n\n\tvirtual void update_constraint(viewport::control& Viewport, const k3d::point2& Coordinates) = 0;\n\tvirtual void reset() = 0;\n\nprotected:\n\t\n\ttypedef std::vector<sigc::connection> connections_t;\n\t\n\tsigc::connection m_mbutton_start_drag_signal;\n\tsigc::connection m_mbutton_drag_signal;\n\tsigc::connection m_mbutton_end_drag_signal;\n\tsigc::connection m_rbutton_start_drag_signal;\n\tsigc::connection m_rbutton_drag_signal;\n\tsigc::connection m_rbutton_end_drag_signal;\n\tsigc::connection m_scroll_signal;\n\n\tvoid connect_navigation_input_model()\n\t{\n\t\tm_mbutton_start_drag_signal = m_input_model.connect_mbutton_start_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_start_drag));\n\t\tm_mbutton_drag_signal = m_input_model.connect_mbutton_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_drag));\n\t\tm_mbutton_end_drag_signal = m_input_model.connect_mbutton_end_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_end_drag));\n\t\tm_rbutton_start_drag_signal = m_input_model.connect_rbutton_start_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_start_drag));\n\t\tm_rbutton_drag_signal = m_input_model.connect_rbutton_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_drag));\n\t\tm_rbutton_end_drag_signal = m_input_model.connect_rbutton_end_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_end_drag));\n\t\tm_scroll_signal = m_input_model.connect_scroll(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_scroll));\n\t}\n\n\tvoid disconnect_navigation_input_model()\n\t{\n\t\tm_mbutton_start_drag_signal.disconnect();\n\t\tm_mbutton_drag_signal.disconnect();\n\t\tm_mbutton_end_drag_signal.disconnect();\n\t\tm_rbutton_start_drag_signal.disconnect();\n\t\tm_rbutton_drag_signal.disconnect();\n\t\tm_rbutton_end_drag_signal.disconnect();\n\t\tm_scroll_signal.disconnect();\n\t}\n\n\t/// Mouse handling functions\n\tvoid lbutton_down(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::key_modifiers& Modifiers);\n\tvoid lmb_down_add();\n\tvoid lmb_down_subtract();\n\tvoid lmb_down_manipulator(const std::string& ManipulatorName);\n\tvoid lmb_down_selected();\n\tvoid lmb_down_deselected();\n\tvoid lmb_down_nothing();\n\tvoid lbutton_click(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lmb_click_add(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lmb_click_subtract(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lmb_click_replace(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lmb_click_start_motion(const k3d::point2& Coordinates);\n\tvoid lmb_click_stop_motion();\n\tvoid lmb_click_deselect_all();\n\tvoid lbutton_start_drag(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lmb_start_drag_start_motion(const k3d::point2& Coordinates);\n\tvoid lmb_start_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lmb_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lbutton_end_drag(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lmb_end_drag_stop_motion();\n\tvoid lmb_end_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid mbutton_click(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::key_modifiers& Modifiers);\n\tvoid mmb_click_toggle_manipulators_visibility();\n\tvoid mmb_click_manipulators_next_selection();\n\tvoid mmb_click_switch_coordinate_system();\n\tvoid mmb_click_next_constraint(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid rbutton_click(const viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid rmb_click_selection_tool();\n\tvoid rmb_click_cancel_move();\n\n\tvoid cancel_mouse_move();\n\tstd::string complete_mouse_move();\n\n\t// Common functions\n/** \\todo standardize set_motion in selection tool and transform tools */\n\tvoid set_motion(const motion_t Motion);\n\n\tvirtual k3d::point3 world_position();\n\tk3d::matrix4 world_orientation();\n\n\t/// Manipulators scale to adjust to viewport size\n\tdouble m_manipulators_scale;\n\t/// Updates manipulators scale to show at constant size after camera update\n\tvoid update_manipulators_scale(viewport::control& Viewport, const k3d::point3& Origin);\n\t/// Returns whether given direction faces the screen\n\tbool front_facing(viewport::control& Viewport, const k3d::vector3& Normal, const k3d::point3& Origin);\n\n\t/// Handles off-screen pointer warping during mouse drag\n\tvoid off_screen_warp(viewport::control& Viewport, k3d::point2& NewCoordinates);\n\t/// Keep an offset to compute mouse coordinates in an infinite virtual screen\n\tk3d::point2 m_off_screen_offset;\n\n\t/// Deletes all targets\n\tvoid clear_targets();\n\t/// Stores whether target list was updated\n\tvoid target_list_changed() { m_node_selection_changed = true; }\n\n\t/// Retrieves the current document selection, refreshing the target list\n\tvoid get_current_selection();\n\t/// Returns the number of selected targets (nodes or components depending on selection mode)\n\tunsigned long target_number();\n\t/// Updates target list whenever necessary (e.g. : one of them was deleted)\n\tvoid update_targets();\n\t/// Transform targets\n\tvoid start_move();\n\tvoid start_rotation();\n\tvoid start_scaling();\n\tvoid move_targets(const k3d::vector3& Delta);\n\tvoid rotate_targets(const k3d::matrix4& Rotation);\n\tvoid scale_targets(const k3d::point3& Scaling);\n\tvoid end_drag_motion();\n\nprivate:\n\t/// Stores an object to be moved interactively\n\tclass itarget\n\t{\n\tpublic:\n\t\titarget() :\n\t\t\tcurrent_system_type(GLOBAL),\n\t\t\tmodifier(0)\n\t\t{\n\t\t}\n\n\t\tvirtual ~itarget();\n\n\t\t// Returns selected target number\n\t\tvirtual unsigned long target_number() = 0;\n\n\t\t// Resets move\n\t\tvirtual void reset() = 0;\n\n\t\t// Update coordinate system\n\t\tvoid set_local() { current_system_type = LOCAL; reset(); }\n\t\tvoid set_global() { current_system_type = GLOBAL; reset(); }\n\t\tvoid set_parent() { current_system_type = PARENT; reset(); }\n\n\t\t// World parameters\n\t\tvirtual k3d::point3 world_position() = 0;\n\n\t\tk3d::matrix4 world_orientation();\n\n\t\t// Modifier\n\t\tvoid set_transform_modifier(k3d::inode* Modifier);\n\t\tvoid reset_transform_modifier();\n\n\t\t// Actions\n\t\tvirtual void start_move() = 0;\n\t\tvirtual void start_rotation() = 0;\n\t\tvirtual void start_scaling() = 0;\n\t\tvirtual void move(const k3d::vector3& Delta) = 0;\n\t\tvirtual void rotate(const k3d::matrix4& RotationMatrix, const k3d::point3& WorldCenter) = 0;\n\t\tvirtual void scale(const k3d::point3& Delta, const k3d::point3& WorldCenter) = 0;\n\t\tvirtual void end_drag_motion() = 0;\n\n\tprotected:\n\t\tvoid set_coordinate_system_change_matrices();\n\n\t\ttypedef enum\n\t\t{\n\t\t\tGLOBAL,\n\t\t\tLOCAL,\n\t\t\tPARENT\n\t\t} system_t;\n\n\t\t/// Stores the transformation type\n\t\tsystem_t current_system_type;\n\t\t/// Stores the target node\n\t\tk3d::inode* node;\n\t\t/// Stores the transformation to be applied\n\t\tk3d::inode* modifier;\n\n\t\t/// Stores initial position\n\t\tk3d::point3 m_origin;\n\t\t/// Stores manipulators matrix\n\t\tk3d::matrix4 m_manipulator_orientation;\n\t\t/// Stores coordinate system change matrices\n\t\tk3d::matrix4 m_system_matrix;\n\t\tk3d::matrix4 m_system_matrix_inverse;\n\t\t\n\t\t/// Connections made that need cleaning up\n\t\tconnections_t m_connections;\n\t};\n\n\tclass transform_target :\n\t\tpublic itarget\n\t{\n\tpublic:\n\t\ttransform_target(k3d::inode* Node);\n\n\t\tvirtual k3d::point3 world_position();\n\t\tvirtual unsigned long target_number();\n\t\tvirtual void reset();\n\n\t\tvirtual void start_move();\n\t\tvirtual void start_rotation();\n\t\tvirtual void start_scaling();\n\n\t\tvirtual void move(const k3d::vector3& Delta);\n\t\tvirtual void rotate(const k3d::matrix4& RotationMatrix, const k3d::point3& WorldCenter);\n\t\tvirtual void scale(const k3d::point3& Delta, const k3d::point3& WorldCenter);\n\n\t\tvirtual void end_drag_motion();\n\n\t\t/// Inserts a transform modifier\n\t\tbool create_transform_modifier(const k3d::uuid& Class, const std::string& Name);\n\n\tprivate:\n\t\t/// Stores modifier's original matrix\n\t\tk3d::matrix4 m_original_matrix;\n\t\t/// Sets the original matrix, using the current state of the pipeline\n\t\tvoid set_original_matrix();\n\t};\n\n\tclass mesh_target :\n\t\tpublic itarget\n\t{\n\tpublic:\n\t\tmesh_target(document_state& DocumentState, k3d::inode* Node, k3d::iproperty& MeshSourceProperty);\n\t\t~mesh_target()\n\t\t{\n\t\t\tm_mesh_change_signal.disconnect();\n\t\t}\n\n\t\tvirtual k3d::point3 world_position();\n\t\tvirtual unsigned long target_number();\n\t\tvirtual void reset();\n\n\t\tvirtual void start_move();\n\t\tvirtual void start_rotation();\n\t\tvirtual void start_scaling();\n\n\t\tvirtual void move(const k3d::vector3& Delta);\n\t\tvirtual void rotate(const k3d::matrix4& RotationMatrix, const k3d::point3& WorldCenter);\n\t\tvirtual void scale(const k3d::point3& Delta, const k3d::point3& WorldCenter);\n\n\t\tvirtual void end_drag_motion();\n\n\tprivate:\n\t\tvoid reset_selection();\n\n\t\t/// Inserts a tweak modifier\n\t\tvoid create_mesh_modifier(const std::string& Name);\n\n\t\t/// Updates the mesh modifier with the new tweaks\n\t\tvoid update_mesh_modifier();\n\n\t\t/// Initialize the transformation\n\t\tvoid init_transformation();\n\n\t\t/// Stores the owning document_state\n\t\tdocument_state& m_document_state;\n\t\t/// Stores the mesh_source property instead of the mesh itself because the k3d::mesh pointer can change\n\t\tk3d::iproperty& mesh_source_property;\n\n\t\t/// Stores the average component position\n\t\tk3d::point3 component_center;\n\t\t/// Stores the list of selected points with their index\n\t\tdetail::component_points_t selected_points;\n\t\t/// Stores the new point positions, for each selected point\n\t\tk3d::mesh::points_t point_positions;\n\t\t/// Initial positions\n\t\tk3d::mesh::points_t initial_positions;\n\n\t\t/// Mesh change signal\n\t\tsigc::connection m_mesh_change_signal;\n\t\t/// Stores whether the mesh changed\n\t\tbool m_mesh_changed;\n\t\t/// Called by m_mesh_change_signal\n\t\tvoid mesh_changed(k3d::iunknown*) { m_mesh_changed = true; }\n\n\t\t/// Mutex to prevent unnecessary updates during drag action\n\t\tbool m_drag_mutex;\n\t\t/// Stores modifier's original matrix\n\t\tk3d::matrix4 m_original_matrix;\n\t};\n\n\t/// Defines a collection of objects to be manipulated interactively\n\ttypedef std::vector<itarget*> targets_t;\n\t/// Stores the current set of objects to be manipulated interactively\n\ttargets_t m_targets;\n\n\t/// Enumerates coordinate-system behaviors\n\ttypedef enum\n\t{\n\t\tLOCAL,\n\t\tGLOBAL,\n\t\tPARENT\n\t} coordinate_system_t;\n\n\tvoid set_coordinate_system(const coordinate_system_t CoordinateSystem);\n\tvoid update_coordinate_system(k3d::iunknown*);\n\nprotected:\n\t/// Stores the owning document\n\tk3d::idocument& m_document;\n\tdocument_state& m_document_state;\n\t/// Provides interactive navigation behavior\n\tnavigation_input_model m_navigation_model;\n\t/// Dispatches incoming user input events\n\tbasic_viewport_input_model m_input_model;\n\n\t/// Stores manipulators size\n\tdouble m_manipulators_size;\n\n\t/// Stores the target number used to provide local coordinates\n\tunsigned long m_current_target;\n\t/// Set to true when target list changes\n\tbool m_node_selection_changed;\n\n\t/// Defines coordinate system enumeration property\n\tfriend std::ostream& operator << (std::ostream& Stream, const coordinate_system_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase LOCAL:\n\t\t\t\tStream << \"local\";\n\t\t\t\tbreak;\n\t\t\tcase GLOBAL:\n\t\t\t\tStream << \"global\";\n\t\t\t\tbreak;\n\t\t\tcase PARENT:\n\t\t\t\tStream << \"parent\";\n\t\t\t\tbreak;\n\t\t}\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator >> (std::istream& Stream, coordinate_system_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"local\")\n\t\t\tValue = LOCAL;\n\t\telse if(text == \"global\")\n\t\t\tValue = GLOBAL;\n\t\telse if(text == \"parent\")\n\t\t\tValue = PARENT;\n\t\telse\n\t\t\tk3d::log() << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& coordinate_system_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Local\", \"local\", \"Moves objects in local coordinate system\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Global\", \"global\", \"Moves objects in global coordinate system\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Parent\", \"parent\", \"Moves objects in parent's coordinate system\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\t/// Stores the current coordinate system behavior\n\tk3d_data(coordinate_system_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, no_serialization) m_coordinate_system;\n\n\t/// Stores the enabled/disabled state for the manipulators\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, no_serialization) m_visible_manipulators;\n\t\n\tconnections_t m_connections;\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_TRANSFORM_TOOL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/undo_utility.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\author Timothy M. Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/ngui/undo_utility.h>\n#include <algorithm>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nconst parent_nodes_t parent_nodes(const k3d::istate_recorder::node* const Node)\n{\n\tparent_nodes_t results;\n\tfor(const k3d::istate_recorder::node* node = Node; node; node = node->parent)\n\t\tresults.push_back(node);\n\n\tstd::reverse(results.begin(), results.end());\n\treturn results;\n}\n\nconst k3d::istate_recorder::node* next_redo(k3d::istate_recorder& StateRecorder)\n{\n\tconst k3d::istate_recorder::node* const current_node = StateRecorder.current_node();\n\n\t// First, see if the current node is located anywhere within the ancestry of the\n\t// most-recently-created node.  If it is, head in that direction ...\n\tconst parent_nodes_t recent_nodes = parent_nodes(StateRecorder.newest_node());\n\tparent_nodes_t::const_iterator i = std::find(recent_nodes.begin(), recent_nodes.end(), current_node);\n\tif(i != recent_nodes.end() && ++i != recent_nodes.end())\n\t\treturn *i;\n\n\t// ... otherwise, if we're no longer on the path to the most-recently-created node,\n\t// \"follow the local terrain\" by following the most recent branches ...\n\tif(current_node)\n\t\t{\n\t\t\tif(current_node->children.size())\n\t\t\t\treturn current_node->children.back();\n\t\t}\n\telse\n\t\t{\n\t\t\tif(StateRecorder.root_nodes().size())\n\t\t\t\treturn StateRecorder.root_nodes().back();\n\t\t}\n\n\treturn 0;\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/undo_utility.h",
    "content": "#ifndef K3DSDK_NGUI_UNDO_UTILITY_H\n#define K3DSDK_NGUI_UNDO_UTILITY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\author Timothy M. Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/istate_recorder.h>\n#include <vector>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/// Defines an ordered collection of undo/redo hierarchy nodes\ntypedef std::vector<const k3d::istate_recorder::node*> parent_nodes_t;\n\n/// Returns the set of nodes that are parents of the given node, ordered from parent -> child (could return empty collection)\nconst parent_nodes_t parent_nodes(const k3d::istate_recorder::node* const Node);\n/// Given the state recorder for a document, returns the child that should be used by default for the next redo (if any, could return NULL)\nconst k3d::istate_recorder::node* next_redo(k3d::istate_recorder& StateRecorder);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_UNDO_UTILITY_H\n"
  },
  {
    "path": "k3dsdk/ngui/unknown.xpm",
    "content": "/* XPM */\nstatic const char* unknown_xpm[] = {\n\"16 16 1 1\",\n\" \tc None\",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \",\n\"                \"};\n"
  },
  {
    "path": "k3dsdk/ngui/unsaved_document.h",
    "content": "#ifndef K3DSDK_NGUI_UNSAVED_DOCUMENT_H\n#define K3DSDK_NGUI_UNSAVED_DOCUMENT_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n//////////////////////////////////////////////////////////////////////////////////////////\n// unsaved_document\n\n/// Abstract interface class for UI components that may encapsulate an unsaved document\nclass unsaved_document\n{\npublic:\n\t/// Returns true iff there are unsaved changes to the underlying document.\n\tvirtual const bool_t unsaved_changes() = 0;\n\t/// Return a human-readable title for the underlying document.\n\tvirtual const string_t unsaved_document_title() = 0;\n\t/// Save the underlying document, returning true if it was saved successfully.  Implementations may need to the prompt the user for a filename, and should return false if the user cancels file selection.\n\tvirtual const bool_t save_unsaved_changes() = 0;\n\nprotected:\n\tunsaved_document() {}\n\tunsaved_document(const unsaved_document&) {}\n\tunsaved_document& operator=(const unsaved_document&) { return *this; }\n\tvirtual ~unsaved_document() {}\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_UNSAVED_DOCUMENT_H\t\n\n"
  },
  {
    "path": "k3dsdk/ngui/uri.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/messages.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/iuri_handler.h>\n#include <k3dsdk/string_cast.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace uri\n{\n\nvoid open(const std::string& URI)\n{\n\t// Look for any plugins that could be used ...\n\tconst plugin::factory::collection_t factories = plugin::factory::lookup<iuri_handler>();\n\tif(factories.empty())\n\t{\n\t\tk3d::ngui::error_message(k3d::string_cast(boost::format(_(\"Couldn't display %1%\")) % URI), _(\"No plugin is available to open URIs.\"));\n\t\treturn;\n\t}\n\n\tfor(plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t{\n\t\tboost::scoped_ptr<iuri_handler> handler(k3d::plugin::create<iuri_handler>(**factory));\n\t\tif(handler)\n\t\t{\n\t\t\tif(handler->open_uri(URI))\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tk3d::ngui::error_message(k3d::string_cast(boost::format(_(\"Couldn't display %1%\")) % URI), _(\"No application is configured to handle the given URI.\"));\n}\n\n} // namespace uri\n\n} // namespace ngui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ngui/uri.h",
    "content": "#ifndef K3DSDK_NGUI_URI_H\n#define K3DSDK_NGUI_URI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <string>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace uri\n{\n\n/// Asynchronously displays a URI in the user's choice of application, displays an error message otherwise\nvoid open(const std::string& URI);\n\n} // namespace uri\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_URI_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/utility.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/utility.h>\n\n#include <k3dsdk/share.h>\n#include <k3dsdk/signal_system.h>\n\n#include <gdkmm/pixbuf.h>\n#include <gtkmm/main.h>\n\n#include <glibmm/main.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\nbool sleep_callback(bool* Done)\n{\n\t*Done = true;\n\treturn false;\n}\n\nconst k3d::filesystem::path share_path()\n{\n\treturn k3d::share_path() / k3d::filesystem::generic_path(\"ngui/pixmap\");\n}\n\n} // namespace detail\n\nvoid handle_pending_events()\n{\n\twhile(Gtk::Main::events_pending())\n\t\tGtk::Main::iteration();\n}\n\nvoid non_blocking_sleep(const double Seconds)\n{\n\tbool done = false;\n\n\tGlib::signal_timeout().connect(\n\t\tsigc::bind(sigc::ptr_fun(detail::sleep_callback), &done), static_cast<unsigned long>(1000 * Seconds));\n\n\twhile(!done)\n\t\thandle_pending_events();\n}\n\nGlib::RefPtr<Gdk::Pixbuf> load_pixbuf(const k3d::filesystem::path& Path)\n{\n\treturn load_pixbuf(detail::share_path(), Path);\n}\n\nGlib::RefPtr<Gdk::Pixbuf> load_pixbuf(const k3d::filesystem::path& SharePath, const k3d::filesystem::path& Path)\n{\n\tGlib::RefPtr<Gdk::Pixbuf> result;\n\tconst k3d::filesystem::path path = SharePath / Path;\n\ttry\n\t{\n\t\tresult = Gdk::Pixbuf::create_from_file(path.native_filesystem_string());\n\t}\n\tcatch(Glib::Exception& e)\n\t{\n\t\tk3d::log() << error << e.what() << std::endl;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tk3d::log() << error << e.what() << std::endl;\n\t}\n\tcatch(...)\n\t{\n\t\tk3d::log() << error << \"Unknown exception loading [\" << path.native_console_string() << \"]\" << std::endl;\n\t}\n\n\treturn result;\n}\n\n/// Converts a k3d::color to a Gdk::Color\nconst Gdk::Color convert(const k3d::color& RHS)\n{\n\tGdk::Color result;\n\tresult.set_rgb_p(RHS.red, RHS.green, RHS.blue);\n\n\treturn result;\n}\n\n/// Converts a Gdk::Color to a k3d::color\nconst k3d::color convert(const Gdk::Color& RHS)\n{\n\treturn k3d::color(RHS.get_red_p(), RHS.get_green_p(), RHS.get_blue_p());\n}\n\n} // namespace ngui\n\n} // namespace k3d\n"
  },
  {
    "path": "k3dsdk/ngui/utility.h",
    "content": "#ifndef K3DSDK_NGUI_UTILITY_H\n#define K3DSDK_NGUI_UTILITY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/color.h>\n#include <glibmm/refptr.h>\n#include <gdkmm/color.h>\n\nnamespace Gdk { class Pixbuf; }\nnamespace k3d { namespace filesystem { class path; } }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/// Processes any pending user interface events\nvoid handle_pending_events();\n/// Provides a portable sleep() that doesn't block processing of UI events\nvoid non_blocking_sleep(const double Seconds);\n/// Loads a pixbuf from disk, with error-handling\nGlib::RefPtr<Gdk::Pixbuf> load_pixbuf(const k3d::filesystem::path& Path);\n/// Loads a pixbuf from disk, with error-handling\nGlib::RefPtr<Gdk::Pixbuf> load_pixbuf(const k3d::filesystem::path& SharePath, const k3d::filesystem::path& Path);\n/// Converts a k3d::color to a Gdk::Color\nconst Gdk::Color convert(const k3d::color& RHS);\n/// Converts a Gdk::Color to a k3d::color\nconst k3d::color convert(const Gdk::Color& RHS);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_UTILITY_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/viewport.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/cubic_curve.h>\n#include <k3dsdk/file_range.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/gl/context.h>\n#include <k3dsdk/high_res_timer.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/iscripted_action.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/tool.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/ngui/viewport_input_model.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/selection_state_gl.h>\n#include <k3dsdk/time_source.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <gtkmm/widget.h>\n#include <gtk/gtkgl.h>\n#include <gtk/gtkmain.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <cassert>\n#include <iomanip>\n#include <sstream>\n\nusing namespace k3d::selection;\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace viewport\n{\n\nnamespace detail\n{\n\n/// Defines storage for a collection of OpenGL hit records\ntypedef std::vector<GLuint> gl_selection_buffer_t;\n\nconst k3d::gl::selection_state select_nodes()\n{\n\tk3d::gl::selection_state result;\n\n\tresult.select_backfacing = true;\n\tresult.select_component.insert(k3d::selection::CURVE);\n\tresult.select_component.insert(k3d::selection::FACE);\n\tresult.select_component.insert(k3d::selection::PATCH);\n\tresult.select_component.insert(k3d::selection::POINT);\n\tresult.select_component.insert(k3d::selection::EDGE);\n\tresult.select_component.insert(k3d::selection::SURFACE);\n\n\treturn result;\n}\n\nstruct sort_by_zmin\n{\n\tbool operator()(const k3d::selection::record& LHS, const k3d::selection::record& RHS)\n\t{\n\t\treturn LHS.zmin < RHS.zmin;\n\t}\n};\n\n/// Wrapper class for OpenGL hit records - designed to resemble an STL container\nclass hit_record\n{\npublic:\n\texplicit hit_record(GLuint* const Storage) :\n\t\tm_storage(Storage)\n\t{\n\t\tassert(m_storage);\n\t}\n\n\t/// Returns the minimum Z depth of the hit\n\tGLuint zmin() const\n\t{\n\t\treturn *(m_storage+1);\n\t}\n\n\t/// Returns the maximum Z depth of the hit\n\tGLuint zmax() const\n\t{\n\t\treturn *(m_storage+2);\n\t}\n\n\t/// Returns true iff the hit was empty (i.e. doesn't contain any names)\n\tbool empty() const\n\t{\n\t\treturn 0 == size();\n\t}\n\n\t/// Returns the number of names contained in the hit\n\tunsigned int size() const\n\t{\n\t\treturn *m_storage;\n\t}\n\n\t/// Defines an iterator type for accessing hit names\n\ttypedef GLuint* const_name_iterator;\n\n\t/// Returns an iterator designating the beginning of the range of hit names\n\tconst_name_iterator name_begin() const\n\t{\n\t\treturn m_storage+3;\n\t}\n\n\t/// Returns an iterator designating one-past-the-end of the range of hit names\n\tconst_name_iterator name_end() const\n\t{\n\t\treturn m_storage+3+size();\n\t}\n\n\t/// Defines a strict ordering for non-empty hit records based on minimum Z depth, since we typically want to find the \"closest\" hit\n\tfriend bool operator<(const hit_record& LHS, const hit_record& RHS)\n\t{\n\t\tif(LHS.empty())\n\t\t\treturn false;\n\n\t\treturn LHS.zmin() < RHS.zmin();\n\t}\n\nprivate:\n\tGLuint* const m_storage;\n};\n\n/// Input iterator that extracts objects of type hit_record from a flat buffer\nclass hit_iterator\n{\npublic:\n\thit_iterator() :\n\t\tm_current(0),\n\t\tm_remaining(0)\n\t{\n\t}\n\n\thit_iterator(gl_selection_buffer_t& Buffer, const unsigned int HitCount) :\n\t\tm_current(HitCount ? &Buffer[0] : 0),\n\t\tm_remaining(HitCount)\n\t{\n\t}\n\n\thit_record operator*() const\n\t{\n\t\treturn hit_record(m_current);\n\t}\n\n\thit_record operator->() const\n\t{\n\t\treturn hit_record(m_current);\n\t}\n\n\thit_iterator& operator++()\n\t{\n\t\tif(m_remaining)\n\t\t{\n\t\t\tif(0 == --m_remaining)\n\t\t\t\tm_current = 0;\n\t\t\telse\n\t\t\t\tm_current += (3 + hit_record(m_current).size());\n\t\t}\n\n\t\treturn *this;\n\t}\n\n\thit_iterator operator++(int)\n\t{\n\t\thit_iterator temp(*this);\n\t\tthis->operator++();\n\n\t\treturn temp;\n\t}\n\n\tfriend bool operator == (const hit_iterator& LHS, const hit_iterator& RHS)\n\t{\n\t\treturn LHS.m_current == RHS.m_current;\n\t}\n\n\tfriend bool operator != (const hit_iterator& LHS, const hit_iterator& RHS)\n\t{\n\t\treturn !(LHS == RHS);\n\t}\n\nprivate:\n\tGLuint* m_current;\n\tunsigned int m_remaining;\n};\n\n/// Convenience function used to choose whichever point is closest to the given window coordinates\nvoid select_nearest_point(const k3d::mesh::points_t& Points, const k3d::selection::id Point, const k3d::point2& Coordinates, const k3d::double_t ScreenHeight, const GLdouble ModelViewMatrix[16], const GLdouble ProjectionMatrix[16], const GLint Viewport[4], k3d::selection::id& OutputPoint, k3d::double_t& OutputDistance)\n{\n\tk3d::point2 coords;\n\tk3d::double_t unused;\n\tgluProject(\n\t\tPoints[Point][0],\n\t\tPoints[Point][1],\n\t\tPoints[Point][2],\n\t\tModelViewMatrix,\n\t\tProjectionMatrix,\n\t\tViewport,\n\t\t&coords[0],\n\t\t&coords[1],\n\t\t&unused);\n\tcoords[1] = ScreenHeight - coords[1];\n\n\tconst k3d::double_t distance = (coords - Coordinates).length2();\n\tif(distance < OutputDistance)\n\t{\n\t\tOutputPoint = Point;\n\t\tOutputDistance = distance;\n\t}\n}\n\n/// Convenience function used to choose whichever edge is closest to the given window coordinates\nvoid select_nearest_edge(const k3d::mesh::indices_t& EdgePoints, const k3d::mesh::indices_t& ClockwiseEdges, const k3d::mesh::points_t& Points, const k3d::selection::id Edge, const k3d::point2& Coordinates, const k3d::double_t ScreenHeight, const GLdouble ModelViewMatrix[16], const GLdouble ProjectionMatrix[16], const GLint Viewport[4], k3d::selection::id& OutputEdge, k3d::double_t& OutputDistance)\n{\n\tk3d::double_t x1, y1, x2, y2;\n\tk3d::double_t unused;\n\n\t// First edge end : S1\n\tgluProject(\n\t\tPoints[EdgePoints[Edge]][0],\n\t\tPoints[EdgePoints[Edge]][1],\n\t\tPoints[EdgePoints[Edge]][2],\n\t\tModelViewMatrix,\n\t\tProjectionMatrix,\n\t\tViewport,\n\t\t&x1,\n\t\t&y1,\n\t\t&unused);\n\n\tconst k3d::point2 S1(x1, ScreenHeight - y1);\n\n\t// Second edge end : S2\n\tgluProject(\n\t\tPoints[EdgePoints[ClockwiseEdges[Edge]]][0],\n\t\tPoints[EdgePoints[ClockwiseEdges[Edge]]][1],\n\t\tPoints[EdgePoints[ClockwiseEdges[Edge]]][2],\n\t\tModelViewMatrix,\n\t\tProjectionMatrix,\n\t\tViewport,\n\t\t&x2,\n\t\t&y2,\n\t\t&unused);\n\n\tconst k3d::point2 S2(x2, ScreenHeight - y2);\n\n\t// Coordinates to segment distance\n\tk3d::double_t distance = 0;\n\n\tconst k3d::vector2 edge = S2 - S1;\n\tconst k3d::vector2 w = Coordinates - S1;\n\n\tconst k3d::double_t c1 = w * edge;\n\tif(c1 <= 0)\n\t\tdistance = k3d::distance(Coordinates, S1);\n\telse\n\t{\n\t\tconst k3d::double_t c2 = edge * edge;\n\t\tif(c2 <= c1)\n\t\t\tdistance = k3d::distance(Coordinates, S2);\n\t\telse\n\t\t{\n\t\t\tconst k3d::double_t b = c1 / c2;\n\t\t\tconst k3d::point2 middlepoint = S1 + b * edge;\n\t\t\tdistance = k3d::distance(Coordinates, middlepoint);\n\t\t}\n\t}\n\n\tif(distance < OutputDistance)\n\t{\n\t\tOutputEdge = Edge;\n\t\tOutputDistance = distance;\n\t}\n}\n\n/// OpenGL context for use with a GDK viewport\nclass context :\n\tpublic k3d::gl::context\n{\npublic:\n\tcontext(GtkWidget* Widget) :\n\t\tm_drawable(gtk_widget_get_gl_drawable(Widget)),\n\t\tm_context(gtk_widget_get_gl_context(Widget))\n\t{\n\t\tassert(m_drawable);\n\t\tassert(m_context);\n\t}\n\n\tvoid on_begin()\n\t{\n\t\tif(!gdk_gl_drawable_gl_begin(m_drawable, m_context))\n\t\t\tk3d::log() << error << \"Failed to call gl_begin\" << std::endl;\n\t}\n\n\tvoid on_end()\n\t{\n\t\tif(gdk_gl_drawable_is_double_buffered(m_drawable))\n\t\t\tgdk_gl_drawable_swap_buffers(m_drawable);\n\t\tgdk_gl_drawable_gl_end(m_drawable);\n\t}\n\n\tGdkGLDrawable* const m_drawable;\n\tGdkGLContext* const m_context;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// control::implementation\n\nclass control::implementation\n{\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState),\n\t\tm_camera(init_value<k3d::icamera*>(0)),\n\t\tm_gl_engine(init_value<k3d::gl::irender_viewport*>(0)),\n\t\tm_preview_engine(init_value<k3d::irender_camera_preview*>(0)),\n\t\tm_still_engine(init_value<k3d::irender_camera_frame*>(0)),\n\t\tm_animation_engine(init_value<k3d::irender_camera_animation*>(0)),\n\t\tm_font_begin(0),\n\t\tm_font_end(0)\n\t{\n\t}\n\n\t/// Stores a reference to the owning document\n\tdocument_state& m_document_state;\n\t/// Stores a reference to the current camera\n\tk3d_data(k3d::icamera*, no_name, change_signal, no_undo, node_storage, no_constraint, no_property, no_serialization) m_camera;\n\t/// Stores a reference to the current OpenGL render engine\n\tk3d_data(k3d::gl::irender_viewport*, no_name, change_signal, no_undo, node_storage, no_constraint, no_property, no_serialization) m_gl_engine;\n\t/// Stores a reference to the current preview render engine\n\tk3d_data(k3d::irender_camera_preview*, no_name, change_signal, no_undo, node_storage, no_constraint, no_property, no_serialization) m_preview_engine;\n\t/// Stores a reference to the current still render engine\n\tk3d_data(k3d::irender_camera_frame*, no_name, change_signal, no_undo, node_storage, no_constraint, no_property, no_serialization) m_still_engine;\n\t/// Stores a reference to the current animation render engine\n\tk3d_data(k3d::irender_camera_animation*, no_name, change_signal, no_undo, node_storage, no_constraint, no_property, no_serialization) m_animation_engine;\n\n\t/// Stores the current set of OpenGL font glyphs (generated from Pango by gtkglext)\n\tunsigned long m_font_begin;\n\t/// Stores the current set of OpenGL font glyphs (generated from Pango by gtkglext)\n\tunsigned long m_font_end;\n\n\t/// Stores a connection to the attached OpenGL render engine redraw request signal\n\tsigc::connection m_gl_engine_redraw_request_connection;\n\n\t/// Buffers OpenGL hit records\n\ttypedef std::vector<GLuint> gl_selection_buffer_t;\n\tgl_selection_buffer_t m_selection_buffer;\n\n\t// Buffers parameters from the most-recent render\n\tGLdouble m_gl_view_matrix[16];\n\tGLdouble m_gl_projection_matrix[16];\n\tGLint m_gl_viewport[4];\n\n\t/// Signal that will be emitted whenever this control should grab the panel focus\n\tsigc::signal<void> m_panel_grab_signal;\n\n\t/// Keep track of gl context\n\tboost::scoped_ptr<detail::context> m_gl_context;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\ncontrol::control(document_state& DocumentState) :\n\tm_implementation(new implementation(DocumentState))\n{\n\tm_implementation->m_camera.changed_signal().connect(sigc::mem_fun(*this, &control::on_camera_changed));\n\tm_implementation->m_gl_engine.changed_signal().connect(sigc::mem_fun(*this, &control::on_gl_engine_changed));\n\n\tset_flags(Gtk::CAN_FOCUS);\n\tadd_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::KEY_PRESS_MASK | Gdk::POINTER_MOTION_MASK | Gdk::SCROLL_MASK);\n\n\tsignal_button_press_event().connect(sigc::bind_return(sigc::hide(m_implementation->m_panel_grab_signal.make_slot()), false), false);\n\n\tsignal_expose_event().connect(sigc::hide(sigc::mem_fun(*this, &control::on_redraw)));\n\tset_double_buffered(false);\n\n\tGdkGLConfig* const config = gdk_gl_config_new_by_mode(static_cast<GdkGLConfigMode>(GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE | GDK_GL_MODE_DEPTH));\n\tassert(config);\n\n  if(!gtk_widget_set_gl_capability(GTK_WIDGET(gobj()), config, m_implementation->m_document_state.gdkgl_share_list(), true, GDK_GL_RGBA_TYPE))\n  {\n    k3d::log() << warning << \"Disabling OpenGL context sharing, since it appears to be unsupported\" << std::endl;\n\t\tgtk_widget_set_gl_capability(GTK_WIDGET(gobj()), config, NULL, true, GDK_GL_RGBA_TYPE);\n  }\n\n\tshow_all();\n}\n\nvoid control::initialize(document_state& DocumentState)\n{\n\tassert_not_implemented();\n}\n\nconst k3d::string_t control::panel_type()\n{\n\treturn \"NGUIViewportPanel\";\n}\n\nsigc::connection control::connect_focus_signal(const sigc::slot<void>& Slot)\n{\n\treturn m_implementation->m_panel_grab_signal.connect(Slot);\n}\n\nk3d::idocument& control::document()\n{\n\treturn m_implementation->m_document_state.document();\n}\n\nk3d::icamera* const control::camera()\n{\n\treturn m_implementation->m_camera.internal_value();\n}\n\nk3d::gl::irender_viewport* const control::gl_engine()\n{\n\treturn m_implementation->m_gl_engine.internal_value();\n}\n\nk3d::irender_camera_preview* const control::camera_preview_engine()\n{\n\treturn m_implementation->m_preview_engine.internal_value();\n}\n\nk3d::irender_camera_frame* const control::camera_still_engine()\n{\n\treturn m_implementation->m_still_engine.internal_value();\n}\n\nk3d::irender_camera_animation* const control::camera_animation_engine()\n{\n\treturn m_implementation->m_animation_engine.internal_value();\n}\n\nvoid control::set_camera(k3d::icamera* const Camera)\n{\n\tm_implementation->m_camera.set_value(Camera);\n}\n\nvoid control::set_gl_engine(k3d::gl::irender_viewport* const Engine)\n{\n\tm_implementation->m_gl_engine_redraw_request_connection.disconnect();\n\tif(Engine)\n\t\tm_implementation->m_gl_engine_redraw_request_connection = Engine->redraw_request_signal().connect(sigc::mem_fun(*this, &control::on_redraw_request));\n\n\tm_implementation->m_gl_engine.set_value(Engine);\n\n\ton_redraw_request(k3d::gl::irender_viewport::SYNCHRONOUS);\n}\n\nvoid control::set_camera_preview_engine(k3d::irender_camera_preview* const Engine)\n{\n\tm_implementation->m_preview_engine.set_value(Engine);\n}\n\nvoid control::set_camera_still_engine(k3d::irender_camera_frame* const Engine)\n{\n\tm_implementation->m_still_engine.set_value(Engine);\n}\n\nvoid control::set_camera_animation_engine(k3d::irender_camera_animation* const Engine)\n{\n\tm_implementation->m_animation_engine.set_value(Engine);\n}\n\nconst k3d::matrix4 control::get_view_matrix()\n{\n\treturn_val_if_fail(camera(), k3d::identity3());\n\treturn k3d::node_to_world_matrix(camera()->navigation_target());\n}\n\nvoid control::set_view_matrix(const k3d::matrix4& Matrix)\n{\n\treturn_if_fail(camera());\n\tk3d::set_matrix(camera()->navigation_target(), Matrix);\n}\n\nconst k3d::point3 control::get_target()\n{\n\treturn boost::any_cast<k3d::point3>(camera()->world_target().property_internal_value());\n}\n\nvoid control::set_target(const k3d::point3& Target)\n{\n\tk3d::property::set_internal_value(*camera(), \"world_target\", Target);\n}\n\nconst k3d::vector3 control::get_up_axis()\n{\n\treturn k3d::vector3(0, 0, 1);\n}\n\nvoid control::get_gl_viewport(GLdouble ViewMatrix[16], GLdouble ProjectionMatrix[16], GLint Viewport[4])\n{\n\tstd::copy(m_implementation->m_gl_view_matrix, m_implementation->m_gl_view_matrix + 16, ViewMatrix);\n\tstd::copy(m_implementation->m_gl_projection_matrix, m_implementation->m_gl_projection_matrix + 16, ProjectionMatrix);\n\tstd::copy(m_implementation->m_gl_viewport, m_implementation->m_gl_viewport + 4, Viewport);\n}\n\ngl::context& control::gl_context()\n{\n\treturn *m_implementation->m_gl_context;\n}\n\nconst k3d::point2 control::project(const k3d::point3& WorldCoords)\n{\n\tk3d::point2 coords;\n\tdouble unused;\n\n\tgluProject(\n\t\tWorldCoords[0],\n\t\tWorldCoords[1],\n\t\tWorldCoords[2],\n\t\tm_implementation->m_gl_view_matrix,\n\t\tm_implementation->m_gl_projection_matrix,\n\t\tm_implementation->m_gl_viewport,\n\t\t&coords[0],\n\t\t&coords[1],\n\t\t&unused);\n\tcoords[1] = get_height() - coords[1];\n\n\treturn coords;\n}\n\nbool control::render_camera_frame(k3d::icamera& Camera, const k3d::filesystem::path& OutputImage, const bool ViewCompletedImage)\n{\n\treturn save_frame(Camera, OutputImage, ViewCompletedImage);\n}\n\nbool control::render_camera_animation(k3d::icamera& Camera, k3d::iproperty& Time, const k3d::frames& Frames, const bool ViewCompletedImages)\n{\n\t// For each frame to be rendered ...\n\tfor(k3d::frames::const_iterator frame = Frames.begin(); frame != Frames.end(); ++frame)\n\t{\n\t\t// Set the frame time ...\n\t\tk3d::property::set_internal_value(Time, frame->begin_time);\n\n\t\t// Save that baby ...\n\t\treturn_val_if_fail(save_frame(Camera, frame->destination, ViewCompletedImages), false);\n\t}\n\n\treturn true;\n}\n\nbool control::save_frame(k3d::icamera& Camera, const k3d::filesystem::path& OutputImage, const bool ViewCompletedImage)\n{\n\t// Draw the image as we normally would ...\n\tconst unsigned long width = get_width();\n\tconst unsigned long height = get_height();\n\treturn_val_if_fail(width && height, false);\n\n\tm_implementation->m_gl_context->begin();\n\n\tcreate_font();\n\tglViewport(0, 0, width, height);\n\tif(m_implementation->m_gl_engine.internal_value())\n\t{\n\t\tm_implementation->m_gl_engine.internal_value()->render_viewport(Camera, width, height, m_implementation->m_gl_view_matrix, m_implementation->m_gl_projection_matrix, m_implementation->m_gl_viewport);\n\t}\n\telse\n\t{\n\t\tglClearColor(0.6f, 0.6f, 0.6f, 0.0f);\n\t\tglClear(GL_COLOR_BUFFER_BIT);\n\t}\n\n\tglFlush();\n\n\t// Get the rendered image ...\n\tstd::vector<unsigned char> image_buffer(width * height * 3, 0);\n\tglReadBuffer(GL_BACK);\n\tglPixelStorei(GL_PACK_SWAP_BYTES, GL_FALSE);\n\tglPixelStorei(GL_PACK_LSB_FIRST, GL_FALSE);\n\tglPixelStorei(GL_PACK_ROW_LENGTH, 0);\n\tglPixelStorei(GL_PACK_SKIP_ROWS, 0);\n\tglPixelStorei(GL_PACK_SKIP_PIXELS, 0);\n\tglPixelStorei(GL_PACK_ALIGNMENT, 1);\n//\tglPixelStorei(GL_PACK_IMAGE_HEIGHT, 0);\n\tglPixelZoom(1.0, -1.0);\n\tglReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, &image_buffer[0]);\n\n\tm_implementation->m_gl_context->end();\n\n\t// Save that bad-boy ...\n\tk3d::filesystem::ofstream stream(OutputImage);\n\n\tstream << \"P6\" << std::endl;\n\tstream << width << \" \" << height << std::endl;\n\tstream << \"255\" << std::endl;\n\n\t// Write data ...\n\tfor(unsigned long y = 0; y != height; ++y)\n\t\tstd::copy(&image_buffer[(height - 1 - y) * width * 3], &image_buffer[(height - y) * width * 3], std::ostreambuf_iterator<char>(stream));\n\n\treturn true;\n}\n\nvoid control::on_camera_changed(k3d::iunknown*)\n{\n\ton_redraw_request(k3d::gl::irender_viewport::SYNCHRONOUS);\n}\n\nvoid control::on_gl_engine_changed(k3d::iunknown*)\n{\n\ton_redraw_request(k3d::gl::irender_viewport::SYNCHRONOUS);\n}\n\nvoid control::on_redraw_request(k3d::gl::irender_viewport::redraw_type_t RedrawType)\n{\n\tif(k3d::gl::irender_viewport::ASYNCHRONOUS == RedrawType)\n\t{\n\t\tqueue_draw();\n\t\treturn;\n\t}\n\n\ton_redraw();\n}\n\nvoid control::on_style_changed(const Glib::RefPtr<Gtk::Style>& previous_style)\n{\n\tbase::on_style_changed(previous_style);\n\tif (m_implementation->m_font_begin != m_implementation->m_font_end)\n\t\tglDeleteLists(m_implementation->m_font_begin, m_implementation->m_font_end - m_implementation->m_font_begin);\n}\n\nvoid control::create_font()\n{\n\tif(m_implementation->m_font_begin != m_implementation->m_font_end)\n\t\treturn;\n\n\tconst unsigned long begin_glyph = 0;\n\tconst unsigned long end_glyph = 256;\n\tm_implementation->m_font_begin = glGenLists(end_glyph - begin_glyph);\n\treturn_if_fail(m_implementation->m_font_begin);\n\tm_implementation->m_font_end = m_implementation->m_font_begin + end_glyph - begin_glyph;\n\n\t// Initialize font\n\treturn_if_fail(get_pango_context());\n\tconst Pango::FontDescription& font_description = get_pango_context()->get_font_description();\n\tk3d::log() << debug << \"attempting to use font family \" << pango_font_description_get_family(font_description.gobj()) << std::endl;\n\treturn_if_fail(get_pango_context()->get_font_description().gobj());\n  //Glib::RefPtr<Pango::Font> font = Glib::wrap(gdk_gl_font_use_pango_font(font_description.gobj(), begin_glyph, end_glyph, m_implementation->m_font_begin));\n\n//\tif(font)\n//\t\tfont->reference();\n}\n\nbool control::on_button_press_event(GdkEventButton* Event)\n{\n\tm_implementation->m_document_state.set_focus_viewport(this);\n\tm_implementation->m_document_state.active_tool().input_model().button_press_event(*this, Event);\n\treturn true;\n}\n\nbool control::on_button_release_event(GdkEventButton* Event)\n{\n\tm_implementation->m_document_state.active_tool().input_model().button_release_event(*this, Event);\n\treturn true;\n}\n\nbool control::on_motion_notify_event(GdkEventMotion* Event)\n{\n\tm_implementation->m_document_state.active_tool().input_model().motion_notify_event(*this, Event);\n\treturn true;\n}\n\nbool control::on_scroll_event(GdkEventScroll* Event)\n{\n\tm_implementation->m_document_state.active_tool().input_model().scroll_event(*this, Event);\n\treturn true;\n}\n\nbool control::on_key_press_event(GdkEventKey* Event)\n{\n\tm_implementation->m_document_state.active_tool().input_model().key_press_event(*this, Event);\n\treturn true;\n}\n\nbool control::on_key_release_event(GdkEventKey* Event)\n{\n\tm_implementation->m_document_state.active_tool().input_model().key_release_event(*this, Event);\n\treturn true;\n}\n\nvoid control::on_realize()\n{\n\tm_implementation->m_gl_context.reset(NULL);\n\tGtk::DrawingArea::on_realize();\n}\n\nk3d::selection::records control::get_node_selectables(const k3d::rectangle& SelectionRegion)\n{\n\treturn get_selection(detail::select_nodes(), SelectionRegion);\n}\n\nk3d::selection::records control::get_component_selectables(const k3d::selection::type Component, const k3d::rectangle& SelectionRegion, bool Backfacing)\n{\n\tk3d::gl::selection_state selection_state;\n\tselection_state.exclude_unselected_nodes = true;\n\tselection_state.select_backfacing = Backfacing;\n\tselection_state.select_component.insert(Component);\n\n\treturn get_selection(selection_state, SelectionRegion);\n}\n\nk3d::selection::records control::get_object_selectables(const k3d::rectangle& SelectionRegion, bool Backfacing)\n{\n\tswitch(selection::state(m_implementation->m_document_state.document()).current_mode())\n\t{\n\t\tcase selection::CURVE:\n\t\t\treturn get_component_selectables(k3d::selection::CURVE, SelectionRegion, Backfacing);\n\t\t\tbreak;\n\t\tcase selection::FACE:\n\t\t\treturn get_component_selectables(k3d::selection::FACE, SelectionRegion, Backfacing);\n\t\t\tbreak;\n\t\tcase selection::NODE:\n\t\t\treturn get_node_selectables(SelectionRegion);\n\t\t\tbreak;\n\t\tcase selection::PATCH:\n\t\t\treturn get_component_selectables(k3d::selection::PATCH, SelectionRegion, Backfacing);\n\t\t\tbreak;\n\t\tcase selection::POINT:\n\t\t\treturn get_component_selectables(k3d::selection::POINT, SelectionRegion, Backfacing);\n\t\t\tbreak;\n\t\tcase selection::EDGE:\n\t\t\treturn get_component_selectables(k3d::selection::EDGE, SelectionRegion, Backfacing);\n\t\t\tbreak;\n\t\tcase selection::SURFACE:\n\t\t\treturn get_component_selectables(k3d::selection::SURFACE, SelectionRegion, Backfacing);\n\t\t\tbreak;\n\t}\n\n\tassert_not_reached();\n\treturn k3d::selection::records();\n}\n\nk3d::selection::record control::pick_node(const k3d::point2& Coordinates)\n{\n\tk3d::selection::records records;\n\treturn pick_node(Coordinates, records);\n}\n\nk3d::selection::record control::pick_point(const k3d::point2& Coordinates, bool Backfacing)\n{\n\tk3d::selection::records records;\n\treturn pick_point(Coordinates, records, Backfacing);\n}\n\nk3d::selection::record control::pick_edge(const k3d::point2& Coordinates, bool Backfacing)\n{\n\tk3d::selection::records records;\n\treturn pick_edge(Coordinates, records, Backfacing);\n}\n\nk3d::selection::record control::pick_component(const k3d::selection::type Component, const k3d::point2& Coordinates, bool Backfacing)\n{\n\tk3d::selection::records records;\n\treturn pick_component(Component, Coordinates, records, Backfacing);\n}\n\nk3d::selection::record control::pick_object(const k3d::point2& Coordinates, bool Backfacing)\n{\n\tk3d::selection::records records;\n\treturn pick_object(Coordinates, records, Backfacing);\n}\n\nk3d::selection::record control::pick_node(const k3d::point2& Coordinates, k3d::selection::records& Records)\n{\n\tconst double sensitivity = 3;\n\n\tconst k3d::rectangle selection_region(\n\t\tCoordinates[0] - sensitivity,\n\t\tCoordinates[0] + sensitivity,\n\t\tCoordinates[1] - sensitivity,\n\t\tCoordinates[1] + sensitivity);\n\n\tRecords = get_selection(detail::select_nodes(), selection_region);\n\tstd::sort(Records.begin(), Records.end(), detail::sort_by_zmin());\n\n\tfor(k3d::selection::records::iterator record = Records.begin(); record != Records.end(); ++record)\n\t{\n\t\tif(record->tokens.size() && record->tokens[0].type == k3d::selection::NODE)\n\t\t\treturn *record;\n\t}\n\n\treturn k3d::selection::record::empty_record();\n}\n\nk3d::selection::record control::pick_point(const k3d::point2& Coordinates, k3d::selection::records& Records, k3d::bool_t Backfacing)\n{\n\t// Draw everything (will find nearest point if some other component is picked)\n\tk3d::gl::selection_state selection_state;\n\tselection_state.exclude_unselected_nodes = true;\n\tselection_state.select_backfacing = Backfacing;\n\tselection_state.select_component.insert(k3d::selection::POINT);\n\tselection_state.select_component.insert(k3d::selection::EDGE);\n\tselection_state.select_component.insert(k3d::selection::FACE);\n\tselection_state.select_component.insert(k3d::selection::PATCH);\n\tselection_state.select_component.insert(k3d::selection::CURVE);\n\n\tconst k3d::double_t sensitivity = 5;\n\tconst k3d::rectangle selection_region(\n\t\tCoordinates[0] - sensitivity,\n\t\tCoordinates[0] + sensitivity,\n\t\tCoordinates[1] - sensitivity,\n\t\tCoordinates[1] + sensitivity);\n\n\tGLdouble view_matrix[16];\n\tGLdouble projection_matrix[16];\n\tGLint viewport[4];\n\n\tRecords = get_selection(selection_state, selection_region, view_matrix, projection_matrix, viewport);\n\tstd::sort(Records.begin(), Records.end(), detail::sort_by_zmin());\n\n\tif(Records.empty())\n\t\treturn k3d::selection::record::empty_record();\n\n\tconst k3d::selection::record& record = Records.front();\n\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tGLdouble model_view_matrix[16];\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\tk3d::selection::id primitive_id = k3d::selection::null_id();\n\tconst k3d::mesh::primitive* primitive = 0;\n\tk3d::selection::id point_id = k3d::selection::null_id();\n\tk3d::double_t point_distance = std::numeric_limits<k3d::double_t>::max();\n\tfor(k3d::selection::record::tokens_t::const_iterator token = record.tokens.begin(); token != record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(record);\n\t\t\t\treturn_val_if_fail(node, k3d::selection::record::empty_record());\n\n\t\t\t\tk3d::transpose(k3d::gl::matrix(view_matrix) * k3d::node_to_world_matrix(*node)).CopyArray(model_view_matrix);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, k3d::selection::record::empty_record());\n\t\t\t\treturn_val_if_fail(mesh->points, k3d::selection::record::empty_record());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::POINT:\n\t\t\t{\n\t\t\t\treturn record;\n\t\t\t}\n\t\t\tcase k3d::selection::PRIMITIVE:\n\t\t\t{\n\t\t\t\tprimitive_id = token->id;\n\t\t\t\treturn_val_if_fail(mesh, k3d::selection::record::empty_record());\n\t\t\t\treturn_val_if_fail(primitive_id < mesh->primitives.size(), k3d::selection::record::empty_record());\n\t\t\t\tprimitive = mesh->primitives[primitive_id].get();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::EDGE:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, k3d::selection::record::empty_record());\n\t\t\t\treturn_val_if_fail(primitive, k3d::selection::record::empty_record());\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, *primitive));\n\t\t\t\treturn_val_if_fail(polyhedron, k3d::selection::record::empty_record());\n\n\t\t\t\tconst k3d::selection::id edge = token->id;\n\n\t\t\t\tdetail::select_nearest_point(\n\t\t\t\t\t*mesh->points,\n\t\t\t\t\tpolyhedron->vertex_points[edge],\n\t\t\t\t\tCoordinates,\n\t\t\t\t\tget_height(),\n\t\t\t\t\tmodel_view_matrix,\n\t\t\t\t\tprojection_matrix,\n\t\t\t\t\tviewport,\n\t\t\t\t\tpoint_id,\n\t\t\t\t\tpoint_distance);\n\n\t\t\t\tdetail::select_nearest_point(\n\t\t\t\t\t*mesh->points,\n\t\t\t\t\tpolyhedron->vertex_points[polyhedron->clockwise_edges[edge]],\n\t\t\t\t\tCoordinates,\n\t\t\t\t\tget_height(),\n\t\t\t\t\tmodel_view_matrix,\n\t\t\t\t\tprojection_matrix,\n\t\t\t\t\tviewport,\n\t\t\t\t\tpoint_id,\n\t\t\t\t\tpoint_distance);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::FACE:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, k3d::selection::record::empty_record());\n\t\t\t\treturn_val_if_fail(primitive, k3d::selection::record::empty_record());\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, *primitive));\n\t\t\t\treturn_val_if_fail(polyhedron, k3d::selection::record::empty_record());\n\n\t\t\t\tconst k3d::selection::id face = token->id;\n\t\t\t\tconst k3d::uint_t face_loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\tconst k3d::uint_t face_loop_end = face_loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\tfor(k3d::uint_t face_loop = face_loop_begin; face_loop != face_loop_end; ++face_loop)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[face_loop];\n\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t{\n\t\t\t\t\t\tdetail::select_nearest_point(\n\t\t\t\t\t\t\t*mesh->points,\n\t\t\t\t\t\t\tpolyhedron->vertex_points[edge],\n\t\t\t\t\t\t\tCoordinates,\n\t\t\t\t\t\t\tget_height(),\n\t\t\t\t\t\t\tmodel_view_matrix,\n\t\t\t\t\t\t\tprojection_matrix,\n\t\t\t\t\t\t\tviewport,\n\t\t\t\t\t\t\tpoint_id,\n\t\t\t\t\t\t\tpoint_distance);\n\n\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PATCH:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, k3d::selection::record::empty_record());\n\t\t\t\treturn_val_if_fail(primitive, k3d::selection::record::empty_record());\n\n\t\t\t\tconst k3d::selection::id patch = token->id;\n\n\t\t\t\tboost::scoped_ptr<k3d::bilinear_patch::const_primitive> bilinear_patch(k3d::bilinear_patch::validate(*mesh, *primitive));\n\t\t\t\tif(bilinear_patch)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t point_begin = patch * 4;\n\t\t\t\t\tconst k3d::uint_t point_end = point_begin + 4;\n\t\t\t\t\tfor(k3d::uint_t patch_point = point_begin; patch_point != point_end; ++patch_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tdetail::select_nearest_point(\n\t\t\t\t\t\t\t*mesh->points,\n\t\t\t\t\t\t\tbilinear_patch->patch_points[patch_point],\n\t\t\t\t\t\t\tCoordinates,\n\t\t\t\t\t\t\tget_height(),\n\t\t\t\t\t\t\tmodel_view_matrix,\n\t\t\t\t\t\t\tprojection_matrix,\n\t\t\t\t\t\t\tviewport,\n\t\t\t\t\t\t\tpoint_id,\n\t\t\t\t\t\t\tpoint_distance);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::bicubic_patch::const_primitive> bicubic_patch(k3d::bicubic_patch::validate(*mesh, *primitive));\n\t\t\t\tif(bicubic_patch)\n\t\t\t\t{\n\t\t\t\t\tk3d::uint_t point_begin = patch * 16;\n\t\t\t\t\tk3d::uint_t point_end = point_begin + 16;\n\t\t\t\t\tfor(k3d::uint_t patch_point = point_begin; patch_point != point_end; ++patch_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tdetail::select_nearest_point(\n\t\t\t\t\t\t\t*mesh->points,\n\t\t\t\t\t\t\tbicubic_patch->patch_points[patch_point],\n\t\t\t\t\t\t\tCoordinates,\n\t\t\t\t\t\t\tget_height(),\n\t\t\t\t\t\t\tmodel_view_matrix,\n\t\t\t\t\t\t\tprojection_matrix,\n\t\t\t\t\t\t\tviewport,\n\t\t\t\t\t\t\tpoint_id,\n\t\t\t\t\t\t\tpoint_distance);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs_patch(k3d::nurbs_patch::validate(*mesh, *primitive));\n\t\t\t\tif(nurbs_patch)\n\t\t\t\t{\n\t\t\t\t\tk3d::uint_t point_begin = nurbs_patch->patch_first_points.at(patch);\n\t\t\t\t\tk3d::uint_t point_end = point_begin + (nurbs_patch->patch_u_point_counts[patch] * nurbs_patch->patch_v_point_counts[patch]);\n\t\t\t\t\tfor(k3d::uint_t patch_point = point_begin; patch_point != point_end; ++patch_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tdetail::select_nearest_point(\n\t\t\t\t\t\t\t*mesh->points,\n\t\t\t\t\t\t\tnurbs_patch->patch_points[patch_point],\n\t\t\t\t\t\t\tCoordinates,\n\t\t\t\t\t\t\tget_height(),\n\t\t\t\t\t\t\tmodel_view_matrix,\n\t\t\t\t\t\t\tprojection_matrix,\n\t\t\t\t\t\t\tviewport,\n\t\t\t\t\t\t\tpoint_id,\n\t\t\t\t\t\t\tpoint_distance);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase k3d::selection::CURVE:\n\t\t\t{\n\t\t\t\tconst k3d::selection::id curve = token->id;\n\n\t\t\t\tboost::scoped_ptr<k3d::linear_curve::const_primitive> linear_curve(k3d::linear_curve::validate(*mesh, *primitive));\n\t\t\t\tif(linear_curve)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t curve_points_begin = linear_curve->curve_first_points[curve];\n\t\t\t\t\tconst k3d::uint_t curve_points_end = curve_points_begin + linear_curve->curve_point_counts[curve];\n\t\t\t\t\tfor(k3d::uint_t curve_point = curve_points_begin; curve_point != curve_points_end; ++curve_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tdetail::select_nearest_point(\n\t\t\t\t\t\t\t*mesh->points,\n\t\t\t\t\t\t\tlinear_curve->curve_points[curve_point],\n\t\t\t\t\t\t\tCoordinates,\n\t\t\t\t\t\t\tget_height(),\n\t\t\t\t\t\t\tmodel_view_matrix,\n\t\t\t\t\t\t\tprojection_matrix,\n\t\t\t\t\t\t\tviewport,\n\t\t\t\t\t\t\tpoint_id,\n\t\t\t\t\t\t\tpoint_distance);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::cubic_curve::const_primitive> cubic_curve(k3d::cubic_curve::validate(*mesh, *primitive));\n\t\t\t\tif(cubic_curve)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t curve_points_begin = cubic_curve->curve_first_points[curve];\n\t\t\t\t\tconst k3d::uint_t curve_points_end = curve_points_begin + cubic_curve->curve_point_counts[curve];\n\t\t\t\t\tfor(k3d::uint_t curve_point = curve_points_begin; curve_point != curve_points_end; ++curve_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tdetail::select_nearest_point(\n\t\t\t\t\t\t\t*mesh->points,\n\t\t\t\t\t\t\tcubic_curve->curve_points[curve_point],\n\t\t\t\t\t\t\tCoordinates,\n\t\t\t\t\t\t\tget_height(),\n\t\t\t\t\t\t\tmodel_view_matrix,\n\t\t\t\t\t\t\tprojection_matrix,\n\t\t\t\t\t\t\tviewport,\n\t\t\t\t\t\t\tpoint_id,\n\t\t\t\t\t\t\tpoint_distance);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> nurbs_curve(k3d::nurbs_curve::validate(*mesh, *primitive));\n\t\t\t\tif(nurbs_curve)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t curve_points_begin = nurbs_curve->curve_first_points[curve];\n\t\t\t\t\tconst k3d::uint_t curve_points_end = curve_points_begin + nurbs_curve->curve_point_counts[curve];\n\t\t\t\t\tfor(k3d::uint_t curve_point = curve_points_begin; curve_point != curve_points_end; ++curve_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tdetail::select_nearest_point(\n\t\t\t\t\t\t\t*mesh->points,\n\t\t\t\t\t\t\tnurbs_curve->curve_points[curve_point],\n\t\t\t\t\t\t\tCoordinates,\n\t\t\t\t\t\t\tget_height(),\n\t\t\t\t\t\t\tmodel_view_matrix,\n\t\t\t\t\t\t\tprojection_matrix,\n\t\t\t\t\t\t\tviewport,\n\t\t\t\t\t\t\tpoint_id,\n\t\t\t\t\t\t\tpoint_distance);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif(point_distance < std::numeric_limits<double>::max())\n\t{\n\t\tk3d::selection::record record = k3d::selection::record::empty_record();\n\t\trecord.tokens.push_back(k3d::selection::token(NODE, node_id));\n\t\trecord.tokens.push_back(k3d::selection::token(MESH, mesh_id));\n\t\trecord.tokens.push_back(k3d::selection::token(k3d::selection::POINT, point_id));\n\t\treturn record;\n\t}\n\n\treturn k3d::selection::record::empty_record();\n}\n\nk3d::selection::record control::pick_edge(const k3d::point2& Coordinates, k3d::selection::records& Records, bool Backfacing)\n{\n\t// Draw everything (will find nearest line if some other component type is picked)\n\tk3d::gl::selection_state selection_state;\n\tselection_state.exclude_unselected_nodes = true;\n\tselection_state.select_backfacing = Backfacing;\n\tselection_state.select_component.insert(k3d::selection::EDGE);\n\tselection_state.select_component.insert(k3d::selection::FACE);\n\n\tconst k3d::double_t sensitivity = 5;\n\tconst k3d::rectangle selection_region(\n\t\tCoordinates[0] - sensitivity,\n\t\tCoordinates[0] + sensitivity,\n\t\tCoordinates[1] - sensitivity,\n\t\tCoordinates[1] + sensitivity);\n\n\tGLdouble view_matrix[16];\n\tGLdouble projection_matrix[16];\n\tGLint viewport[4];\n\n\tRecords = get_selection(selection_state, selection_region, view_matrix, projection_matrix, viewport);\n\tstd::sort(Records.begin(), Records.end(), detail::sort_by_zmin());\n\n\tif(Records.empty())\n\t\treturn k3d::selection::record::empty_record();\n\n\tconst k3d::selection::record& record = Records.front();\n\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tGLdouble model_view_matrix[16];\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\tk3d::selection::id primitive_id = k3d::selection::null_id();\n\tconst k3d::mesh::primitive* primitive = 0;\n\tk3d::selection::id edge_id = k3d::selection::null_id();\n\tk3d::double_t edge_distance = std::numeric_limits<k3d::double_t>::max();\n\n\tfor(k3d::selection::record::tokens_t::const_iterator token = record.tokens.begin(); token != record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(record);\n\t\t\t\treturn_val_if_fail(node, k3d::selection::record::empty_record());\n\n\t\t\t\tk3d::transpose(k3d::gl::matrix(view_matrix) * k3d::node_to_world_matrix(*node)).CopyArray(model_view_matrix);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, k3d::selection::record::empty_record());\n\t\t\t\treturn_val_if_fail(mesh->points, k3d::selection::record::empty_record());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PRIMITIVE:\n\t\t\t{\n\t\t\t\tprimitive_id = token->id;\n\t\t\t\treturn_val_if_fail(mesh, k3d::selection::record::empty_record());\n\t\t\t\treturn_val_if_fail(primitive_id < mesh->primitives.size(), k3d::selection::record::empty_record());\n\t\t\t\tprimitive = mesh->primitives[primitive_id].get();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::EDGE:\n\t\t\t{\n\t\t\t\treturn record;\n\t\t\t}\n\t\t\tcase k3d::selection::FACE:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, k3d::selection::record::empty_record());\n\t\t\t\treturn_val_if_fail(primitive, k3d::selection::record::empty_record());\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, *primitive));\n\t\t\t\treturn_val_if_fail(polyhedron, k3d::selection::record::empty_record());\n\n\t\t\t\tconst k3d::selection::id face = token->id;\n\n\t\t\t\tconst k3d::uint_t face_loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\tconst k3d::uint_t face_loop_end = face_loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\tfor(k3d::uint_t face_loop = face_loop_begin; face_loop != face_loop_end; ++face_loop)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[face_loop];\n\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t{\n\t\t\t\t\t\tdetail::select_nearest_edge(\n\t\t\t\t\t\t\tpolyhedron->vertex_points,\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges,\n\t\t\t\t\t\t\t*mesh->points,\n\t\t\t\t\t\t\tedge,\n\t\t\t\t\t\t\tCoordinates,\n\t\t\t\t\t\t\tget_height(),\n\t\t\t\t\t\t\tmodel_view_matrix,\n\t\t\t\t\t\t\tprojection_matrix,\n\t\t\t\t\t\t\tviewport,\n\t\t\t\t\t\t\tedge_id,\n\t\t\t\t\t\t\tedge_distance);\n\n\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif(edge_distance < std::numeric_limits<double>::max())\n\t{\n\t\tk3d::selection::record record = k3d::selection::record::empty_record();\n\t\trecord.tokens.push_back(k3d::selection::token(k3d::selection::NODE, node_id));\n\t\trecord.tokens.push_back(k3d::selection::token(k3d::selection::MESH, mesh_id));\n\t\trecord.tokens.push_back(k3d::selection::token(k3d::selection::PRIMITIVE, primitive_id));\n\t\trecord.tokens.push_back(k3d::selection::token(k3d::selection::EDGE, edge_id));\n\n\t\treturn record;\n\t}\n\n\treturn k3d::selection::record::empty_record();\n}\n\nk3d::selection::record control::pick_component(const k3d::selection::type Component, const k3d::point2& Coordinates, k3d::selection::records& Records, bool Backfacing)\n{\n\tconst double sensitivity = 3;\n\tconst k3d::rectangle selection_region(\n\t\tCoordinates[0] - sensitivity,\n\t\tCoordinates[0] + sensitivity,\n\t\tCoordinates[1] - sensitivity,\n\t\tCoordinates[1] + sensitivity);\n\n\tk3d::gl::selection_state selection_state;\n\tselection_state.exclude_unselected_nodes = true;\n\tselection_state.select_backfacing = Backfacing;\n\tselection_state.select_component.insert(Component);\n\n\tRecords = get_selection(selection_state, selection_region);\n\tstd::sort(Records.begin(), Records.end(), detail::sort_by_zmin());\n\n\tfor(k3d::selection::records::const_iterator record = Records.begin(); record != Records.end(); ++record)\n\t{\n\t\tfor(k3d::selection::record::tokens_t::const_iterator token = record->tokens.begin(); token != record->tokens.end(); ++token)\n\t\t{\n\t\t\tif(token->type == Component)\n\t\t\t\treturn *record;\n\t\t}\n\t}\n\n\treturn k3d::selection::record::empty_record();\n}\n\nk3d::selection::record control::pick_object(const k3d::point2& Coordinates, k3d::selection::records& Records, bool Backfacing)\n{\n\tswitch(selection::state(m_implementation->m_document_state.document()).current_mode())\n\t{\n\t\tcase selection::CURVE:\n\t\t\treturn pick_component(k3d::selection::CURVE, Coordinates, Records, Backfacing);\n\t\t\tbreak;\n\t\tcase selection::FACE:\n\t\t\treturn pick_component(k3d::selection::FACE, Coordinates, Records, Backfacing);\n\t\t\tbreak;\n\t\tcase selection::NODE:\n\t\t\treturn pick_node(Coordinates, Records);\n\t\t\tbreak;\n\t\tcase selection::PATCH:\n\t\t\treturn pick_component(k3d::selection::PATCH, Coordinates, Records, Backfacing);\n\t\t\tbreak;\n\t\tcase selection::POINT:\n\t\t\treturn pick_point(Coordinates, Records, Backfacing);\n\t\t\tbreak;\n\t\tcase selection::EDGE:\n\t\t\treturn pick_edge(Coordinates, Records, Backfacing);\n\t\t\tbreak;\n\t\tcase selection::SURFACE:\n\t\t\treturn pick_component(k3d::selection::SURFACE, Coordinates, Records, Backfacing);\n\t\t\tbreak;\n\t}\n\n\treturn k3d::selection::record::empty_record();\n}\n\nconst k3d::selection::records control::get_selection(const k3d::gl::selection_state& SelectionState, const k3d::rectangle& SelectionRegion)\n{\n\tGLdouble view_matrix[16];\n\tGLdouble projection_matrix[16];\n\tGLint viewport[4];\n\n\treturn get_selection(SelectionState, SelectionRegion, view_matrix, projection_matrix, viewport);\n}\n\nconst k3d::selection::records control::get_selection(const k3d::gl::selection_state& SelectionState, const k3d::rectangle& SelectionRegion, GLdouble ViewMatrix[16], GLdouble ProjectionMatrix[16], GLint Viewport[4])\n{\n\tk3d::selection::records selection;\n\n\tconst unsigned int hit_count = select(SelectionState, SelectionRegion, ViewMatrix, ProjectionMatrix, Viewport);\n\n\tfor(detail::hit_iterator hit(m_implementation->m_selection_buffer, hit_count); hit != detail::hit_iterator(); ++hit)\n\t{\n\t\tk3d::selection::record record;\n\t\trecord.zmin = (*hit).zmin();\n\t\trecord.zmax = (*hit).zmax();\n\n\t\tfor(detail::hit_record::const_name_iterator name = (*hit).name_begin(); name != (*hit).name_end(); )\n\t\t{\n\t\t\tk3d::selection::type type = k3d::selection::type(*name++);\n\t\t\tk3d::selection::id id = k3d::selection::id(*name++);\n\n\t\t\trecord.tokens.push_back(k3d::selection::token(type, id));\n\t\t}\n\n\t\tselection.push_back(record);\n\t}\n\n\treturn selection;\n}\n\nbool control::on_redraw()\n{\n\t// If we're minimized, we're done ...\n\tconst unsigned long width = get_width();\n  const unsigned long height = get_height();\n\n\tif(!width || !height)\n\t\treturn true;\n\n\tif(!is_realized())\n\t\treturn true;\n\n\tif(!m_implementation->m_gl_context)\n\t{\n\t\tm_implementation->m_gl_context.reset(new detail::context(GTK_WIDGET(gobj())));\n\n\t\tm_implementation->m_gl_context->begin();\n\n\t\t// Create opengl-start plugins ...\n\t\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup();\n\t\tfor(k3d::plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t\t{\n\t\t\tk3d::iplugin_factory::metadata_t metadata = (**factory).metadata();\n\n\t\t\tif(!metadata.count(\"ngui:opengl-start\"))\n\t\t\t\tcontinue;\n\n\t\t\tk3d::log() << info << \"Creating plugin [\" << (**factory).name() << \"] via ngui:opengl-start\" << std::endl;\n\n\t\t\tboost::scoped_ptr<k3d::iunknown> plugin(k3d::plugin::create(**factory));\n\t\t\tif(!plugin)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Error creating plugin [\" << (**factory).name() << \"] via ngui:opengl-start\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(k3d::iscripted_action* const scripted_action = dynamic_cast<k3d::iscripted_action*>(plugin.get()))\n\t\t\t{\n\t\t\t\tk3d::iscript_engine::context context;\n\t\t\t\tcontext[\"command\"] = k3d::string_t(\"ngui:opengl-start\");\n\t\t\t\tscripted_action->execute(context);\n\t\t\t}\n\t\t}\n\n\t\tm_implementation->m_gl_context->end();\n\t}\n\n\tm_implementation->m_gl_context->begin();\n\n\tcreate_font();\n\tglViewport(0, 0, width, height);\n\tif(m_implementation->m_gl_engine.internal_value() && m_implementation->m_camera.internal_value())\n\t{\n\t\tk3d::timer timer;\n\n\t\tm_implementation->m_gl_engine.internal_value()->render_viewport(*m_implementation->m_camera.internal_value(), width, height, m_implementation->m_gl_view_matrix, m_implementation->m_gl_projection_matrix, m_implementation->m_gl_viewport);\n\t\tm_implementation->m_document_state.active_tool().redraw(*this);\n\n\t\tconst double elapsed = timer.elapsed();\n\t\tif(elapsed)\n\t\t{\n\t\t\tstd::stringstream buffer;\n\t\t\tbuffer << std::fixed << std::setprecision(1) << 1.0 / elapsed << \"fps\";\n\n\t\t\tglMatrixMode(GL_PROJECTION);\n\t\t\tglLoadIdentity();\n\t\t\tglOrtho(-1, 1, -1, 1, -1, 1);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tglLoadIdentity();\n\n\t\t\tglDisable(GL_LIGHTING);\n\t\t\tglDisable(GL_TEXTURE_1D);\n\t\t\tglDisable(GL_TEXTURE_2D);\n\t\t\tglDisable(GL_BLEND);\n\n\t\t\tglColor3d(0, 0, 0);\n\n\t\t\tglRasterPos3d(-0.95, -0.95, 0);\n\t\t\tglListBase(m_implementation->m_font_begin);\n\t\t\tglCallLists(buffer.str().size(), GL_UNSIGNED_BYTE, buffer.str().data());\n\t\t}\n\t}\n\telse\n\t{\n\t\tglClearColor(0.6f, 0.6f, 0.6f, 0.0f);\n\t\tglClear(GL_COLOR_BUFFER_BIT);\n\n\t\tglMatrixMode(GL_PROJECTION);\n\t\tglLoadIdentity();\n\t\tglOrtho(-1, 1, -1, 1, -1, 1);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglLoadIdentity();\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\t\tglDisable(GL_BLEND);\n\n\t\tglColor3d(0, 0, 0);\n\n\t\tglRasterPos3d(-0.95, -0.95, 0);\n\t\tconst std::string buffer(_(\"Unattached\"));\n\t\tglListBase(m_implementation->m_font_begin);\n\t\tglCallLists(buffer.size(), GL_UNSIGNED_BYTE, buffer.data());\n\t}\n\tglFlush();\n\n\tm_implementation->m_gl_context->end();\n\n\treturn true;\n}\n\nconst GLint control::select(const k3d::gl::selection_state& SelectState, const k3d::rectangle& SelectionRegion)\n{\n\tGLdouble view_matrix[16];\n\tGLdouble projection_matrix[16];\n\tGLint viewport[4];\n\n\treturn select(SelectState, SelectionRegion, view_matrix, projection_matrix, viewport);\n}\n\nconst GLint control::select(const k3d::gl::selection_state& SelectState, const k3d::rectangle& SelectionRegion, GLdouble ViewMatrix[16], GLdouble ProjectionMatrix[16], GLint Viewport[4])\n{\n\t// If we don't have a camera, we're done ...\n\tif(!m_implementation->m_camera.internal_value())\n\t\treturn 0;\n\n\tif(!is_realized())\n\t\treturn 0;\n\n\t// If we're minimized, we're done ...\n\tconst unsigned long width = get_width();\n\tconst unsigned long height = get_height();\n\tif(!width || !height)\n\t\treturn 0;\n\n\t// Set our selection buffer to a sensible minimum size ...\n\tif(m_implementation->m_selection_buffer.size() < 8096)\n\t\tm_implementation->m_selection_buffer.resize(8096);\n\n\t// Set an (arbitrary) upper-limit on how large we let the buffer grow ...\n\twhile(m_implementation->m_selection_buffer.size() < 10000000)\n\t{\n\t\tm_implementation->m_gl_context->begin();\n\n\t\tcreate_font();\n\t\tglViewport(0, 0, width, height);\n\n\t\tglSelectBuffer(m_implementation->m_selection_buffer.size(), &m_implementation->m_selection_buffer[0]);\n\t\tglRenderMode(GL_SELECT);\n\t\tglInitNames();\n\n\t\tGLdouble projection_matrix[16];\n\t\tm_implementation->m_gl_engine.internal_value()->render_viewport_selection(SelectState, *m_implementation->m_camera.internal_value(), width, height, k3d::rectangle::normalize(SelectionRegion), m_implementation->m_gl_view_matrix, projection_matrix, m_implementation->m_gl_viewport);\n\t\tstd::copy(m_implementation->m_gl_view_matrix, m_implementation->m_gl_view_matrix + 16, ViewMatrix);\n\t\tstd::copy(projection_matrix, projection_matrix + 16, ProjectionMatrix);\n\t\tstd::copy(m_implementation->m_gl_viewport, m_implementation->m_gl_viewport + 4, Viewport);\n\n\t\tm_implementation->m_document_state.active_tool().select(*this);\n\t\tconst GLint hits = glRenderMode(GL_RENDER);\n\t\tglFlush();\n\n\t\tm_implementation->m_gl_context->end();\n\n\t\t// If we got a positive number of hits, we're done ...\n\t\tif(hits >= 0)\n\t\t\treturn hits;\n\n\t\t// A negative number means there was buffer overflow, so try again ...\n\t\tm_implementation->m_selection_buffer.resize(m_implementation->m_selection_buffer.size() * 2);\n\t}\n\n\t// Ran out of buffer space!\n\tk3d::log() << error << \"Ran out of selection-buffer space\" << std::endl;\n\n\treturn 0;\n}\n\n} // namespace viewport\n\n/////////////////////////////////////////////////////////////////////////////\n// widget_to_ndc\n\nconst k3d::point2 widget_to_ndc(viewport::control& Viewport, const k3d::point2& WidgetCoords)\n{\n\treturn_val_if_fail(Viewport.gl_engine(), k3d::point2());\n\treturn_val_if_fail(Viewport.camera(), k3d::point2());\n\n\tconst unsigned long width = Viewport.get_width();\n\tconst unsigned long height = Viewport.get_height();\n\tk3d::rectangle host_rect(0, 0, 0, 0);\n\tk3d::rectangle window_rect(0, 0, 0, 0);\n\tViewport.gl_engine()->get_ndc(*Viewport.camera(), width, height, host_rect, window_rect);\n\n\tconst double window_x = k3d::mix(window_rect.x1, window_rect.x2, WidgetCoords[0] / width);\n\tconst double window_y = k3d::mix(window_rect.y1, window_rect.y2, WidgetCoords[1] / height);\n\n\tconst double x = (window_x - host_rect.x1) / (host_rect.x2 - host_rect.x1);\n\tconst double y = (window_y - host_rect.y1) / (host_rect.y2 - host_rect.y1);\n\n\treturn k3d::point2(x, y);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// ndc_to_widget\n\nconst k3d::point2 ndc_to_widget(viewport::control& Viewport, const k3d::point2& NDC)\n{\n\treturn_val_if_fail(Viewport.gl_engine(), k3d::point2());\n\treturn_val_if_fail(Viewport.camera(), k3d::point2());\n\n\tconst unsigned long width = Viewport.get_width();\n\tconst unsigned long height = Viewport.get_height();\n\tk3d::rectangle host_rect(0, 0, 0, 0);\n\tk3d::rectangle window_rect(0, 0, 0, 0);\n\tViewport.gl_engine()->get_ndc(*Viewport.camera(), width, height, host_rect, window_rect);\n\n\tconst double host_x = k3d::mix(host_rect.x1, host_rect.x2, NDC[0]);\n\tconst double host_y = k3d::mix(host_rect.y1, host_rect.y2, NDC[1]);\n\n\tconst double x = (host_x - window_rect.x1) / (window_rect.x2 - window_rect.x1);\n\tconst double y = (host_y - window_rect.y1) / (window_rect.y2 - window_rect.y1);\n\n\treturn k3d::point2(width * x, height * y);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// mouse_to_world\n\nconst k3d::line3 mouse_to_world(viewport::control& Viewport, const k3d::point2& WidgetCoords)\n{\n\treturn_val_if_fail(Viewport.gl_engine(), k3d::line3(k3d::vector3(), k3d::point3()));\n\n\tGLdouble gl_view_matrix[16];\n\tGLdouble gl_projection_matrix[16];\n\tGLint gl_viewport[4];\n\tViewport.get_gl_viewport(gl_view_matrix, gl_projection_matrix, gl_viewport);\n\n\tk3d::point3 near_plane;\n\tgluUnProject(WidgetCoords[0], Viewport.get_height() - WidgetCoords[1], 0.0, gl_view_matrix, gl_projection_matrix, gl_viewport, &near_plane[0], &near_plane[1], &near_plane[2]);\n\n\tk3d::point3 far_plane;\n\tgluUnProject(WidgetCoords[0], Viewport.get_height() - WidgetCoords[1], 1.0, gl_view_matrix, gl_projection_matrix, gl_viewport, &far_plane[0], &far_plane[1], &far_plane[2]);\n\n\treturn k3d::line3(far_plane - near_plane, near_plane);\n}\n\n} // namespace ngui\n\n} // namespace k3d\n"
  },
  {
    "path": "k3dsdk/ngui/viewport.h",
    "content": "#ifndef K3DSDK_NGUI_VIEWPORT_H\n#define K3DSDK_NGUI_VIEWPORT_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/drawingarea.h>\n\n#include <k3dsdk/ngui/panel.h>\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/irender_camera_animation.h>\n#include <k3dsdk/irender_camera_preview.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/irender_viewport_gl.h>\n#include <k3dsdk/line3.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d { namespace gl { class selection_state;\nclass context;\n} }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nclass document_state;\n\nnamespace viewport\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\nclass control :\n        public Gtk::DrawingArea,\n\tpublic k3d::property_collection,\n\tpublic k3d::irender_camera_frame,\n\tpublic k3d::irender_camera_animation,\n\tpublic panel::control\n{\n\ttypedef Gtk::DrawingArea base;\n\npublic:\n\tcontrol(document_state& DocumentState);\n\n\tvoid initialize(document_state& DocumentState);\n\tconst k3d::string_t panel_type();\n\tsigc::connection connect_focus_signal(const sigc::slot<void>& Slot);\n\n\t/// Returns the owning document\n\tk3d::idocument& document();\n\t/// Returns the camera for this viewport\n\tk3d::icamera* const camera();\n\t/// Returns the OpenGL render engine for this viewport\n\tk3d::gl::irender_viewport* const gl_engine();\n\t/// Returns the preview render engine for this viewport\n\tk3d::irender_camera_preview* const camera_preview_engine();\n\t/// Returns the still render engine for this viewport\n\tk3d::irender_camera_frame* const camera_still_engine();\n\t/// Returns the animation render engine for this viewport\n\tk3d::irender_camera_animation* const camera_animation_engine();\n\n\t/// Sets the camera for this viewport\n\tvoid set_camera(k3d::icamera* const Camera);\n\t/// Sets the OpenGL render engine for this viewport\n\tvoid set_gl_engine(k3d::gl::irender_viewport* const Engine);\n\t/// Sets the current preview render engine for this viewport\n\tvoid set_camera_preview_engine(k3d::irender_camera_preview* const Engine);\n\t/// Sets the current still render engine for this viewport\n\tvoid set_camera_still_engine(k3d::irender_camera_frame* const Engine);\n\t/// Sets the current animation render engine for this viewport\n\tvoid set_camera_animation_engine(k3d::irender_camera_animation* const Engine);\n\n\t/// Returns the viewport view matrix\n\tconst k3d::matrix4 get_view_matrix();\n\t/// Sets the viewport view matrix\n\tvoid set_view_matrix(const k3d::matrix4& Matrix);\n\t/// Returns the viewport \"target\", the point (in world coordinates) around which the viewport orbits\n\tconst k3d::point3 get_target();\n\t/// Sets the viewport \"target\", the point (in world coordinates) around which the viewport orbits\n\tvoid set_target(const k3d::point3& Target);\n\t/// Returns the viewport \"up\" axis, the axis (in world coordinates) that defines \"up\" for modeling purposes\n\tconst k3d::vector3 get_up_axis();\n\n\t/// Returns the most recent OpenGL viewport parameters\n\tvoid get_gl_viewport(GLdouble ViewMatrix[16], GLdouble ProjectionMatrix[16], GLint Viewport[4]);\n\t/// The OpenGL context for this viewport\n\tk3d::gl::context& gl_context();\n\t/// Projects a point in world coordinates into screen space, returning the 2D widget coordinates\n\tconst k3d::point2 project(const k3d::point3& WorldCoords);\n\n\tk3d::bool_t render_camera_frame(k3d::icamera& Camera, const k3d::filesystem::path& OutputImage, const k3d::bool_t ViewCompletedImage);\n\tk3d::bool_t render_camera_animation(k3d::icamera& Camera, k3d::iproperty& Time, const k3d::frames& Frames, const k3d::bool_t ViewCompletedImages);\n\n\t/// Returns all nodes that intersect the given rectangle in widget coordinates\n\tk3d::selection::records get_node_selectables(const k3d::rectangle& SelectionRegion);\n\t/// Returns all points contained in the given rectangle in widget coordinates\n\tk3d::selection::records get_point_selectables(const k3d::rectangle& SelectionRegion, k3d::bool_t Backfacing);\n\t/// Returns all components that intersect the given rectangle in widget coordinates\n\tk3d::selection::records get_component_selectables(const k3d::selection::type Component, const k3d::rectangle& SelectionRegion, k3d::bool_t Backfacing);\n\t/// Returns all objects (point, split-edge, uniform components, or nodes, depending on selection mode) that intersect the given rectangle in widget coordinates\n\tk3d::selection::records get_object_selectables(const k3d::rectangle& SelectionRegion, k3d::bool_t Backfacing);\n\n\t/// Returns the closest node at the given widget coordinates (may return an empty record)\n\tk3d::selection::record pick_node(const k3d::point2& Coordinates);\n\t/// Returns the closest point at the given widget coordinates (may return an empty record)\n\tk3d::selection::record pick_point(const k3d::point2& Coordinates, k3d::bool_t Backfacing);\n\t/// Returns the closest polyhedron edge at the given widget coordinates (may return an empty record)\n\tk3d::selection::record pick_edge(const k3d::point2& Coordinates, k3d::bool_t Backfacing);\n\t/// Returns the closest component at the given widget coordinates (may return an empty record)\n\tk3d::selection::record pick_component(const k3d::selection::type Component, const k3d::point2& Coordinates, k3d::bool_t Backfacing);\n\t/// Returns the closest object (point, split-edge, uniform component, or node, depending on selection mode) at the given coordinates (may return an empty record)\n\tk3d::selection::record pick_object(const k3d::point2& Coordinates, k3d::bool_t Backfacing);\n\n\t/// Returns the closest node at the given widget coordinates (may return an empty record)\n\tk3d::selection::record pick_node(const k3d::point2& Coordinates, k3d::selection::records& Records);\n\t/// Returns the closest point at the given widget coordinates (may return an empty record)\n\tk3d::selection::record pick_point(const k3d::point2& Coordinates, k3d::selection::records& Records, k3d::bool_t Backfacing);\n\t/// Returns the closest polyhedron edge at the given widget coordinates (may return an empty record)\n\tk3d::selection::record pick_edge(const k3d::point2& Coordinates, k3d::selection::records& Records, k3d::bool_t Backfacing);\n\t/// Returns the closest uniform component at the given widget coordinates (may return an empty record)\n\tk3d::selection::record pick_component(const k3d::selection::type Component, const k3d::point2& Coordinates, k3d::selection::records& Records, k3d::bool_t Backfacing);\n\t/// Returns the closest object (point, split-edge, uniform component, or node, depending on selection mode) at the given coordinates (may return an empty record)\n\tk3d::selection::record pick_object(const k3d::point2& Coordinates, k3d::selection::records& Records, k3d::bool_t Backfacing);\n\nprivate:\n\tvoid on_camera_changed(k3d::iunknown*);\n\tvoid on_gl_engine_changed(k3d::iunknown*);\n\n\tvoid on_redraw_request(k3d::gl::irender_viewport::redraw_type_t RedrawType);\n\tvoid on_style_changed(const Glib::RefPtr<Gtk::Style>& previous_style);\n\tk3d::bool_t on_redraw();\n\tconst GLint select(const k3d::gl::selection_state& SelectState, const k3d::rectangle& SelectionRegion);\n\tconst GLint select(const k3d::gl::selection_state& SelectState, const k3d::rectangle& SelectionRegion, GLdouble ViewMatrix[16], GLdouble ProjectionMatrix[16], GLint Viewport[4]);\n\n\t/// Returns an OpenGL selection as a collection of records\n\tconst k3d::selection::records get_selection(const k3d::gl::selection_state& SelectionState, const k3d::rectangle& SelectionRegion);\n\t/// Returns an OpenGL selection as a collection of records\n\tconst k3d::selection::records get_selection(const k3d::gl::selection_state& SelectionState, const k3d::rectangle& SelectionRegion, GLdouble ViewMatrix[16], GLdouble ProjectionMatrix[16], GLint Viewport[4]);\n\n\t/// Renders the current view to disk\n\tk3d::bool_t save_frame(k3d::icamera& Camera, const k3d::filesystem::path& OutputImage, const k3d::bool_t ViewCompletedImage);\n\t/// Caches the current font as an OpenGL display list\n\tvoid create_font();\n\n\t/// Called when a mouse button is pressed\n\tk3d::bool_t on_button_press_event(GdkEventButton* Event);\n\t/// Called when a mouse button is released\n\tk3d::bool_t on_button_release_event(GdkEventButton* Event);\n\t/// Called when the mouse wheel is scrolled\n\tk3d::bool_t on_scroll_event(GdkEventScroll* Event);\n\t/// Called when the mouse is moved\n\tk3d::bool_t on_motion_notify_event(GdkEventMotion* Event);\n\t/// Called when a key is pressed\n\tk3d::bool_t on_key_press_event(GdkEventKey* Event);\n\t/// Called when a key is released\n\tk3d::bool_t on_key_release_event(GdkEventKey* Event);\n\n\tvoid on_realize();\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace viewport\n\n/////////////////////////////////////////////////////////////////////////////\n// widget_to_ndc\n\n/// Converts widget coordinates to normalized camera coordinates - note: results may be outside the range [0, 1] because the viewport and camera aspect ratios may not match\nconst k3d::point2 widget_to_ndc(viewport::control& Viewport, const k3d::point2& WidgetCoords);\n\n/////////////////////////////////////////////////////////////////////////////\n// ndc_to_widget\n\n/// Converts normalized camera coordinates to widget coordinates\nconst k3d::point2 ndc_to_widget(viewport::control& Viewport, const k3d::point2& NDC);\n\n/////////////////////////////////////////////////////////////////////////////\n// mouse_to_world\n\n/// Converts widget coordinates to a line in world coordinates\nconst k3d::line3 mouse_to_world(viewport::control& Viewport, const k3d::point2& WidgetCoords);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_VIEWPORT_H\n"
  },
  {
    "path": "k3dsdk/ngui/viewport_input_model.h",
    "content": "#ifndef K3DSDK_NGUI_VIEWPORT_INPUT_MODEL_H\n#define K3DSDK_NGUI_VIEWPORT_INPUT_MODEL_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gdk/gdkevents.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace viewport { class control; }\n\n/////////////////////////////////////////////////////////////////////////////\n// viewport_input_model\n\n/// Abstract interface for objects that can process user input\nclass viewport_input_model\n{\npublic:\n\t/// Called when a mouse button is pressed\n\tvirtual void button_press_event(viewport::control& Viewport, GdkEventButton* Event) = 0;\n\t/// Called when a mouse button is released\n\tvirtual void button_release_event(viewport::control& Viewport, GdkEventButton* Event) = 0;\n\t/// Called during mouse movement\n\tvirtual void motion_notify_event(viewport::control& Viewport, GdkEventMotion* Event) = 0;\n\t/// Called when the mouse wheel is scrolled\n\tvirtual void scroll_event(viewport::control& Viewport, GdkEventScroll* Event) = 0;\n\t/// Called when a key is pressed\n\tvirtual void key_press_event(viewport::control& Viewport, GdkEventKey* Event) = 0;\n\t/// Called when a key is released\n\tvirtual void key_release_event(viewport::control& Viewport, GdkEventKey* Event) = 0;\n\nprotected:\n\tviewport_input_model() {}\n\tviewport_input_model(const viewport_input_model&) {}\n\tviewport_input_model& operator=(const viewport_input_model&) { return *this; }\n\tvirtual ~viewport_input_model() {}\n};\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_VIEWPORT_INPUT_MODEL_H\n\n"
  },
  {
    "path": "k3dsdk/ngui/widget_manip.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ngui/application_state.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <gtkmm/accelmap.h>\n#include <gtkmm/imagemenuitem.h>\n#include <gtkmm/menuitem.h>\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\n/// Duplicated from GTK sources because there's no gtk_widget_get_accel_path()\ntypedef struct\n{\n  GQuark         path_quark;\n  GtkWidget     *widget;\n  GtkAccelGroup *accel_group;\n  GClosure      *closure;\n} AccelPath;\n\nconst std::string get_accel_path(Gtk::Widget* Widget)\n{\n\treturn_val_if_fail(Widget, std::string());\n\n\tstatic GQuark quark_accel_path = g_quark_from_static_string(\"gtk-accel-path\");\n\tAccelPath* const apath = reinterpret_cast<AccelPath*>(g_object_get_qdata(G_OBJECT(Widget->gobj()), quark_accel_path));\n\treturn apath ? g_quark_to_string(apath->path_quark) : \"\";\n}\n\nbool dynamic_accelerator_on_enter_notify_event(GdkEventCrossing*, Gtk::Widget* Widget)\n{\n\treturn_val_if_fail(Widget, false);\n\n\t// Unless assign hotkeys mode is enabled, we're done ...\n\tif(!application_state::instance().assign_hotkeys())\n\t\treturn false;\n\n\t// If the widget doesn't have an accelerator path, we're done ...\n\tif(get_accel_path(Widget).empty())\n\t\treturn false;\n\n\tWidget->grab_focus();\n\treturn false;\n}\n\nbool dynamic_accelerator_on_key_press_event(GdkEventKey*, Gtk::Widget* Widget)\n{\n\treturn_val_if_fail(Widget, false);\n\n\t// Unless assign hotkeys mode is enabled, we're done ...\n\tif(!application_state::instance().assign_hotkeys())\n\t\treturn false;\n\n\t// If the widget doesn't have an accelerator path, we're done ...\n\tconst std::string accel_path = get_accel_path(Widget);\n\tif(accel_path.empty())\n\t\treturn false;\n\n\tGtk::AccelMap::add_entry(accel_path, Gtk::AccelKey(\"q\").get_key(), Gdk::ModifierType(0));\n\n\treturn false;\n}\n\n} // namespace detail\n\nvoid enable_dynamic_accelerators_impl(Gtk::Widget* const Widget)\n{\n\treturn_if_fail(Widget);\n\n\t// Menu items already support dynamic hotkey assignment, so we're done ...\n\tGtk::MenuItem* const menu_item = dynamic_cast<Gtk::MenuItem*>(Widget);\n\tif(menu_item)\n\t\treturn;\n\n\tWidget->signal_enter_notify_event().connect(sigc::bind(sigc::ptr_fun(detail::dynamic_accelerator_on_enter_notify_event), Widget));\n\tWidget->signal_key_press_event().connect(sigc::bind(sigc::ptr_fun(detail::dynamic_accelerator_on_key_press_event), Widget));\n}\n\nGtk::Label* get_label(Gtk::ImageMenuItem& widget)\n{\n\treturn dynamic_cast<Gtk::Label*>(widget.get_child());\n}\n\n} // namespace ngui\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/ngui/widget_manip.h",
    "content": "#ifndef K3DSDK_NGUI_WIDGET_MANIP_H\n#define K3DSDK_NGUI_WIDGET_MANIP_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/result.h>\n#include <k3dsdk/signal_system.h>\n\n#include <gtkmm/accelgroup.h>\n#include <gtkmm/label.h>\n#include <gtkmm/tooltips.h>\n#include <glibmm/ustring.h>\n\nnamespace Gtk { class ImageMenuItem; }\n\nnamespace k3d\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// set_tooltip\n\n/// Convenience object for setting the tooltip on a component inline\nstruct set_tooltip\n{\n\tset_tooltip(const Glib::ustring& Tooltip) : tooltip(Tooltip) { }\n\tconst Glib::ustring tooltip;\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const set_tooltip& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tLHS->set_tooltip_text(RHS.tooltip);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// set_insensitive\n\n/// Convenience object for disabling a widget inline\nstruct set_insensitive\n{\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const set_insensitive& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tLHS->set_sensitive(false);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// connect_button\n\n/// Convenience object for connecting a button to a slot inline\nstruct connect_button\n{\n\ttypedef sigc::slot<void> slot_t;\n\tconnect_button(const slot_t& Slot) : slot(Slot) { }\n\tslot_t slot;\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const connect_button& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tLHS->signal_clicked().connect(RHS.slot);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// connect_menu_item\n\n/// Convenience object for connecting a menu item to a slot inline\nstruct connect_menu_item\n{\n\ttypedef sigc::slot<void> slot_t;\n\tconnect_menu_item(const slot_t& Slot) : slot(Slot) { }\n\tslot_t slot;\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const connect_menu_item& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tLHS->signal_activate().connect(RHS.slot);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// connect_signal_changed\n\n/// Convenience object for connecting a menu item to a slot inline\nstruct connect_signal_changed\n{\n\ttypedef sigc::slot<void> slot_t;\n\tconnect_signal_changed(const slot_t& Slot) : slot(Slot) { }\n\tslot_t slot;\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const connect_signal_changed& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tLHS->signal_changed().connect(RHS.slot);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// line_wrap\n\nstruct line_wrap\n{\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const line_wrap& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tLHS->set_line_wrap(true);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// center_justify\n\nstruct center_justify\n{\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const center_justify& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tLHS->set_justify(Gtk::JUSTIFY_CENTER);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// right_justify\n\nstruct right_justify\n{\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const right_justify& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tLHS->set_justify(Gtk::JUSTIFY_RIGHT);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// alignment\n\nstruct alignment\n{\n\talignment(const float XAlign, const float YAlign) : xalign(XAlign), yalign (YAlign) { }\n\tconst float xalign;\n\tconst float yalign;\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const alignment& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tLHS->set_alignment(RHS.xalign, RHS.yalign);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// set_markup\n\nstruct set_markup\n{\n\tset_markup(const Glib::ustring& Markup) : markup(Markup) { }\n\tconst Glib::ustring markup;\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const set_markup& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tLHS->set_markup(RHS.markup);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// make_toolbar_button\n\nstruct make_toolbar_button\n{\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const make_toolbar_button& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\n\tLHS->set_name(\"k3d-toolbar-button\");\n\tLHS->set_relief(Gtk::RELIEF_NONE);\n\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// set_accelerator_path\n\nstruct set_accelerator_path\n{\n\tset_accelerator_path(const Glib::ustring& Path, const Glib::RefPtr<Gtk::AccelGroup>& Group) :\n\t\tpath(Path),\n\t\tgroup(Group)\n\t{\n\t}\n\n\tconst Glib::ustring path;\n\tconst Glib::RefPtr<Gtk::AccelGroup> group;\n};\n\ntemplate<typename T>\nT* operator<<(T* LHS, const set_accelerator_path& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tstatic_cast<Gtk::Widget*>(LHS)->set_accel_path(RHS.path, RHS.group);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// enable_dynamic_accelerators\n\nstruct enable_dynamic_accelerators\n{\n};\n\nvoid enable_dynamic_accelerators_impl(Gtk::Widget*);\n\ntemplate<typename T>\nT* operator<<(T* LHS, const enable_dynamic_accelerators& RHS)\n{\n\treturn_val_if_fail(LHS, LHS);\n\tenable_dynamic_accelerators_impl(LHS);\n\treturn LHS;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// get_label\n\n/// Returns the text label associated with an image label widget\nGtk::Label* get_label(Gtk::ImageMenuItem& widget);\n\n} // namespace ngui\n\n} // namespace k3d\n\n#endif // !K3DSDK_NGUI_WIDGET_MANIP_H\n\n"
  },
  {
    "path": "k3dsdk/node.cpp",
    "content": " // K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n\n#include <algorithm>\n#include <iostream>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// node\n\nnode::node(iplugin_factory& Factory, idocument& Document) :\n\tproperty_collection(),\n\tm_factory(Factory),\n\tm_document(Document),\n\tm_name(init_owner(*this) + init_name(\"name\") + init_label(_(\"Name\")) + init_description(_(\"Assign a human-readable name to identify this node.\")) + init_value<std::string>(\"\"))\n{\n\tm_deleted_signal.connect(sigc::mem_fun(*this, &node::on_deleted));\n\tm_name.changed_signal().connect(sigc::hide(m_name_changed_signal.make_slot()));\n}\n\nnode::~node()\n{\n}\n\nvoid node::set_name(const std::string Name)\n{\n\tm_name.set_value(Name);\n}\n\nconst std::string node::name()\n{\n\treturn m_name.internal_value();\n}\n\nvoid node::on_deleted()\n{\n\t// Signal that our properties are going away ...\n\tconst property_collection::properties_t props = properties();\n\tfor(property_collection::properties_t::const_iterator property = props.begin(); property != props.end(); ++property)\n\t\t(**property).property_deleted_signal().emit();\n}\n\niplugin_factory& node::factory()\n{\n\treturn m_factory;\n}\n\nidocument& node::document()\n{\n\treturn m_document;\n}\n\ninode::deleted_signal_t& node::deleted_signal()\n{\n\treturn m_deleted_signal;\n}\n\ninode::name_changed_signal_t& node::name_changed_signal()\n{\n\treturn m_name_changed_signal;\n}\n\nvoid node::save(xml::element& Element, const ipersistent::save_context& Context)\n{\n\tpersistent_property_collection::save(Element, Context);\n}\n\nvoid node::load(xml::element& Element, const ipersistent::load_context& Context)\n{\n\t// Load object name ...\n\tset_name(xml::attribute_text(Element, \"name\"));\n\n\t// Load Variables\n\tpersistent_property_collection::load(Element, Context);\n}\n\nconst std::vector<inode*> node::lookup(idocument& Document)\n{\n\treturn Document.nodes().collection();\n}\n\nconst std::vector<inode*> node::lookup(idocument& Document, const uuid FactoryID)\n{\n\tstd::vector<inode*> result;\n\n\tconst std::vector<inode*>::const_iterator end = Document.nodes().collection().end();\n\tfor(std::vector<inode*>::const_iterator node = Document.nodes().collection().begin(); node != end; ++node)\n\t{\n\t\tif((**node).factory().factory_id() == FactoryID)\n\t\t\tresult.push_back(*node);\n\t}\n\n\treturn result;\n}\n\nconst std::vector<inode*> node::lookup(idocument& Document, const string_t& NodeName)\n{\n\tstd::vector<inode*> result;\n\n\tconst std::vector<inode*>::const_iterator end = Document.nodes().collection().end();\n\tfor(std::vector<inode*>::const_iterator node = Document.nodes().collection().begin(); node != end; ++node)\n\t{\n\t\tif((**node).name() == NodeName)\n\t\t\tresult.push_back(*node);\n\t}\n\n\treturn result;\n}\n\nconst std::vector<inode*> node::lookup(idocument& Document, const string_t& MetaName, const string_t& MetaValue)\n{\n\tstd::vector<inode*> result;\n\n\tconst std::vector<inode*>::const_iterator end = Document.nodes().collection().end();\n\tfor(std::vector<inode*>::const_iterator node = Document.nodes().collection().begin(); node != end; ++node)\n\t{\n\t\tif(imetadata* const metadata = dynamic_cast<imetadata*>(*node))\n\t\t{\n\t\t\timetadata::metadata_t pairs = metadata->get_metadata();\n\t\t\timetadata::metadata_t::iterator pair = pairs.find(MetaName);\n\t\t\tif(pair != pairs.end() && pair->second == MetaValue)\n\t\t\t\tresult.push_back(*node);\n\t\t}\n\t}\n\t\n\treturn result;\n}\n\ninode* node::lookup_one(idocument& Document, const string_t& NodeName)\n{\n\tstd::vector<inode*> nodes = lookup(Document, NodeName);\n\treturn nodes.size() == 1 ? nodes[0] : 0;\n}\n\nvoid node::show(idocument& Document, inode& Node)\n{\n\tshow(Document, std::vector<inode*>(1, &Node));\n}\n\nvoid node::show(idocument& Document, const std::vector<inode*>& Nodes)\n{\n\tconst std::vector<inode_collection_sink*> sinks = lookup<inode_collection_sink>(Document);\n\tfor(uint_t i = 0; i != sinks.size(); ++i)\n\t{\n\t\tconst inode_collection_sink::properties_t properties = sinks[i]->node_collection_properties();\n\t\tfor(inode_collection_sink::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t{\n\t\t\tif(inode_collection_property* const node_collection_property = dynamic_cast<inode_collection_property*>(*property))\n\t\t\t{\n\t\t\t\tinode_collection_property::nodes_t nodes = property::internal_value<inode_collection_property::nodes_t>(**property);\n\t\t\t\tfor(uint_t i = 0; i != Nodes.size(); ++i)\n\t\t\t\t{\n\t\t\t\t\tif(node_collection_property->property_allow(*Nodes[i]))\n\t\t\t\t\t{\n\t\t\t\t\t\tnodes.erase(std::remove(nodes.begin(), nodes.end(), Nodes[i]), nodes.end());\n\t\t\t\t\t\tnodes.push_back(Nodes[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tproperty::set_internal_value(**property, nodes);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid node::hide(idocument& Document, inode& Node)\n{\n\thide(Document, std::vector<inode*>(1, &Node));\n}\n\nvoid node::hide(idocument& Document, const std::vector<inode*>& Nodes)\n{\n\tconst std::vector<inode_collection_sink*> sinks = lookup<inode_collection_sink>(Document);\n\tfor(uint_t i = 0; i != sinks.size(); ++i)\n\t{\n\t\tconst inode_collection_sink::properties_t properties = sinks[i]->node_collection_properties();\n\t\tfor(inode_collection_sink::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t{\n\t\t\tif(inode_collection_property* const node_collection_property = dynamic_cast<inode_collection_property*>(*property))\n\t\t\t{\n\t\t\t\tinode_collection_property::nodes_t nodes = property::internal_value<inode_collection_property::nodes_t>(**property);\n\t\t\t\tfor(uint_t i = 0; i != Nodes.size(); ++i)\n\t\t\t\t{\n\t\t\t\t\tnodes.erase(std::remove(nodes.begin(), nodes.end(), Nodes[i]), nodes.end());\n\t\t\t\t}\n\t\t\t\tproperty::set_internal_value(**property, nodes);\n\t\t\t}\n\t\t}\n\t}\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/node.h",
    "content": "#ifndef K3DSDK_NODE_H\n#define K3DSDK_NODE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/ipersistent.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/persistent_property_collection.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/result.h>\n\nnamespace k3d\n{\n\nclass iplugin_factory;\n\n/// Implements the minimum functionality required of any K-3D node.  You should derive document plugins from node and override\n/// the default method implementations and/or implement additional interfaces as-needed.\nclass node :\n\tpublic inode,\n\tpublic ipersistent,\n\tpublic property_collection,\n\tpublic persistent_property_collection,\n\tpublic metadata::storage,\n\tpublic sigc::trackable\n{\npublic:\n\tnode(iplugin_factory& Factory, idocument& Document);\n\tvirtual ~node();\n\n\tvoid set_name(const std::string Name);\n\tconst std::string name();\n\tidocument& document();\n\tiplugin_factory& factory();\n\tdeleted_signal_t& deleted_signal();\n\tname_changed_signal_t& name_changed_signal();\n\n\tvoid save(xml::element& Element, const ipersistent::save_context& Context);\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context);\n\n\t/// Returns the set of all nodes for the given document\n\tstatic const std::vector<inode*> lookup(idocument& Document);\n\n\t/// Returns the set of nodes that match a specific factory ID (could return empty set!)\n\tstatic const std::vector<inode*> lookup(idocument& Document, const uuid FactoryID);\n\n\t/// Returns the set of nodes that match the given name (be prepared to handle zero, one, or many results)\n\tstatic const std::vector<inode*> lookup(idocument& Document, const string_t& NodeName);\n\n\t/// Returns the set of nodes that match the given metadata name and value\n\tstatic const std::vector<inode*> lookup(idocument& Document, const string_t& MetaName, const string_t& MetaValue);\n\n\t/// Returns the set of nodes that implement the requested interface type (could return an empty set).\n\ttemplate<typename interface_t>\n\tstatic const std::vector<interface_t*> lookup(idocument& Document)\n\t{\n\t\tstd::vector<interface_t*> result;\n\t\tconst std::vector<inode*> nodes = lookup(Document);\n\t\tconst std::vector<inode*>::const_iterator end(nodes.end());\n\t\tfor(std::vector<inode*>::const_iterator node = nodes.begin(); node != end; ++node)\n\t\t{\n\t\t\tif(interface_t* const requested = dynamic_cast<interface_t*>(*node))\n\t\t\t\tresult.push_back(requested);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/// Returns the set of nodes that implement the requested interface type and match the given factory ID.\n\ttemplate<typename interface_t>\n\tstatic const std::vector<interface_t*> lookup(idocument& Document, const uuid FactoryID)\n\t{\n\t\tstd::vector<interface_t*> result;\n\t\tconst std::vector<inode*> nodes = lookup(Document, FactoryID);\n\t\tconst std::vector<inode*>::const_iterator end(nodes.end());\n\t\tfor(std::vector<inode*>::const_iterator node = nodes.begin(); node != end; ++node)\n\t\t{\n\t\t\tif(interface_t* const requested = dynamic_cast<interface_t*>(*node))\n\t\t\t\tresult.push_back(requested);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/// Returns the set of nodes that implement the requested interface type and match the given metadata name and value.\t\n\ttemplate<typename interface_t>\n\tstatic const std::vector<interface_t*> lookup(idocument& Document, const string_t& MetaName, const string_t& MetaValue)\n\t{\n\t\tstd::vector<interface_t*> result;\n\t\tconst std::vector<inode*> nodes = lookup(Document, MetaName, MetaValue);\n\t\tconst std::vector<inode*>::const_iterator end(nodes.end());\n\t\tfor(std::vector<inode*>::const_iterator node = nodes.begin(); node != end; ++node)\n\t\t{\n\t\t\tif(interface_t* const requested = dynamic_cast<interface_t*>(*node))\n\t\t\t\tresult.push_back(requested);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/// Returns the one node that matches the given name, or NULL.\n\tstatic inode* lookup_one(idocument& Document, const string_t& NodeName);\n\n\t/// Makes a node visible (adds it to visibility properties for all node collection sinks)\n\tstatic void show(idocument& Document, inode& Node);\n\t/// Makes a collection of nodes visible (adds them to visibility properties for all node collection sinks)\n\tstatic void show(idocument& Document, const std::vector<inode*>& Node);\n\t/// Makes a node invisible (removes it from visibility properties for all node collection sinks)\n\tstatic void hide(idocument& Document, inode& Node);\n\t/// Makes a collection of nodes invisible (removes them from visibility properties for all node collection sinks)\n\tstatic void hide(idocument& Document, const std::vector<inode*>& Node);\n\nprivate:\n\tvoid on_deleted();\n\n\t/// Stores the factory that created this node\n\tiplugin_factory& m_factory;\n\t/// Stores the Document that owns this node\n\tidocument& m_document;\n\t/// Stores the name for this node\n\tk3d_data(std::string, data::immutable_name, data::change_signal, data::with_undo, data::local_storage, data::no_constraint, data::writable_property, data::no_serialization) m_name;\n\t/// Used to signal observers when this node is deleted\n\tdeleted_signal_t m_deleted_signal;\n\t/// Used to signal observers when this node's name changes\n\tname_changed_signal_t m_name_changed_signal;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_NODE_H\n\n"
  },
  {
    "path": "k3dsdk/node_change_signal.h",
    "content": "#ifndef K3DSDK_NODE_CHANGE_SIGNAL_H\n#define K3DSDK_NODE_CHANGE_SIGNAL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/inode_change_signal.h>\n#include <k3dsdk/signal_slots.h>\n\nnamespace k3d\n{\n\n/// Provides a mixin-class implementation of k3d::inode_change_signal\ntemplate<typename derived_t>\nclass node_change_signal :\n\tpublic inode_change_signal\n{\npublic:\n\tsigc::connection connect_node_changed_signal(const sigc::slot<void, ihint*>& Slot)\n\t{\n\t\treturn m_node_changed_signal.connect(Slot);\n\t}\n\nprotected:\n\tsignal::loop_safe_slot<sigc::signal<void, ihint*> > make_node_change_slot()\n\t{\n\t\treturn signal::make_loop_safe_slot(m_node_changed_signal);\n\t}\n\nprivate:\n\tsigc::signal<void, ihint*> m_node_changed_signal;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_NODE_CHANGE_SIGNAL_H\n\n"
  },
  {
    "path": "k3dsdk/node_name_map.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/node_name_map.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/uuid.h>\n\nnamespace k3d\n{\n\n///////////////////////////////////////////////////////////////////////////////////\n// node_name_map::implementation\n\nclass node_name_map::implementation\n{\npublic:\n\ttypedef std::vector<inode*> nodes_t;\n\tnodes_t m_nodes;\n};\n\n///////////////////////////////////////////////////////////////////////////////////\n// node_name_map\n\t\nnode_name_map::node_name_map() :\n\tm_implementation(new implementation())\n{\n}\n\nnode_name_map::~node_name_map()\n{\n\tdelete m_implementation;\n}\n\nvoid node_name_map::add_nodes(const inode_collection::nodes_t& Nodes)\n{\n\tm_implementation->m_nodes.insert(m_implementation->m_nodes.end(), Nodes.begin(), Nodes.end());\n}\n\nconst std::string node_name_map::name(inode& Node)\n{\n\tconst uuid node_factory_id = Node.factory().factory_id();\n\tsize_t node_number = 1;\n\n\tconst size_t begin = 0;\n\tconst size_t end = begin + m_implementation->m_nodes.size();\n\tfor(size_t i = begin; i != end; ++i)\n\t{\n\t\tif(m_implementation->m_nodes[i] == &Node)\n\t\t{\n\t\t\tstd::ostringstream buffer;\n\t\t\tbuffer << node_factory_id << \" \" << node_number;\n\t\t\treturn buffer.str();\n\t\t}\n\n\t\tif(m_implementation->m_nodes[i]->factory().factory_id() != node_factory_id)\n\t\t\tcontinue;\n\n\t\t++node_number;\n\t}\n\n\tlog() << error << k3d_file_reference << \"internal error: can't find node [\" << Node.name() << \"]\" << std::endl;\n\treturn std::string();\n}\n\ninode* node_name_map::node(const std::string& Name)\n{\n\tuuid lookup_node_factory_id = uuid::null();\n\tsize_t lookup_node_number = 0;\n\n\tstd::istringstream buffer(Name);\n\tbuffer >> lookup_node_factory_id >> lookup_node_number;\n\treturn_val_if_fail(lookup_node_factory_id != uuid::null(), 0);\n\treturn_val_if_fail(lookup_node_number != 0, 0);\n\n\tsize_t node_number = 1;\n\tconst size_t begin = 0;\n\tconst size_t end = begin + m_implementation->m_nodes.size();\n\tfor(size_t i = begin; i != end; ++i)\n\t{\n\t\tif(m_implementation->m_nodes[i]->factory().factory_id() != lookup_node_factory_id)\n\t\t\tcontinue;\n\n\t\tif(node_number == lookup_node_number)\n\t\t\treturn m_implementation->m_nodes[i];\n\n\t\t++node_number;\n\t}\n\n\tlog() << error << k3d_file_reference << \"can't find node [\" << lookup_node_factory_id << \"] number [\" << lookup_node_number << \"]\" << std::endl;\n\treturn 0;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/node_name_map.h",
    "content": "#ifndef K3DSDK_NODE_NAME_MAP_H\n#define K3DSDK_NODE_NAME_MAP_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/inode_name_map.h>\n\nnamespace k3d\n{\n\n/// Concrete implementation of inode_name_map that generates repeatable unique node names for use by e.g: tutorial recording and playback\nclass node_name_map :\n\tpublic inode_name_map\n{\npublic:\n\tnode_name_map();\n\t~node_name_map();\n\n\t/// Adds nodes to the collection\n\tvoid add_nodes(const inode_collection::nodes_t& Nodes);\n\t\n\tvirtual const std::string name(inode& Node);\n\tvirtual inode* node(const std::string& Name);\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_NODE_NAME_MAP_H\n\n"
  },
  {
    "path": "k3dsdk/nodes.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/string_modifiers.h>\n#include <k3dsdk/utility.h>\n\n// The following includes are needed to compare typeinfo of properties in skip_nodes\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\ntemplate<typename functor_t>\nstruct factory_id_filter_t\n{\n\texplicit factory_id_filter_t(const uuid FactoryID, functor_t Functor) : factory_id(FactoryID), functor(Functor) {}\n\n\tvoid operator()(k3d::inode* Object) { if(Object->factory().factory_id() == factory_id) functor(Object); }\n\n\tconst uuid factory_id;\n\tfunctor_t functor;\n};\n\ntemplate<typename functor_t>\nfactory_id_filter_t<functor_t> factory_id_filter(const uuid ID, functor_t Functor)\n{\n\treturn factory_id_filter_t<functor_t>(ID, Functor);\n}\n\nvoid skip_node(inode& Node, ipipeline::dependencies_t& NewDependencies)\n{\n\tidocument& document = Node.document();\n\tipipeline& pipeline = document.pipeline();\n\ttry\n\t{\n\t\tiproperty_collection& property_collection = dynamic_cast<iproperty_collection&>(Node);\n\t\tiproperty_collection::properties_t properties = property_collection.properties();\n\t\tfor(iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t{\n\t\t\tiproperty* connected_property = pipeline.dependency(**property);\n\t\t\tif(!connected_property)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tfor(ipipeline::dependencies_t::const_iterator dependency = pipeline.dependencies().begin(); dependency != pipeline.dependencies().end(); ++dependency)\n\t\t\t{\n\t\t\t\tiproperty* output_property = dependency->second;\n\t\t\t\tif(output_property && output_property->property_node() == &Node && \n\t\t\t\t\t\toutput_property->property_name() == connected_property->property_name() && output_property->property_type() == connected_property->property_type())\n\t\t\t\t{\n\t\t\t\t\tNewDependencies[dependency->first] = connected_property;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tcatch(std::bad_cast& E) // Catch the exception when the dynamic cast to ioperty_collection fails\n\t{\n\t\treturn;\n\t}\n}\n\nvoid skip_nodes(nodes_t Nodes, ipipeline::dependencies_t& NewDependencies)\n{\n\tfor(nodes_t::iterator node = Nodes.begin(); node != Nodes.end(); ++node)\n\t\tskip_node(**node, NewDependencies);\n}\n\n} // namespace detail\n\ninode* find_node(inode_collection& Nodes, iproperty& Property)\n{\n\tconst nodes_t::const_iterator end = Nodes.collection().end();\n\tfor(nodes_t::const_iterator node = Nodes.collection().begin(); node != end; ++node)\n\t{\n\t\tiproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(*node);\n\t\tif(!property_collection)\n\t\t\tcontinue;\n\n\t\tconst iproperty_collection::properties_t& properties = property_collection->properties();\n\t\tif(std::find(properties.begin(), properties.end(), &Property) != properties.end())\n\t\t\treturn *node;\n\t}\n\n\treturn 0;\n}\n\nconst std::string unique_name(inode_collection& Nodes, const std::string& Name)\n{\n\t// For each node in the collection ...\n\tfor(k3d::inode_collection::nodes_t::const_iterator handle = Nodes.collection().begin(); handle != Nodes.collection().end(); ++handle)\n\t{\n\t\tinode* const node = *handle;\n\n\t\t// Name doesn't match, so keep going ...\n\t\tif(Name != node->name())\n\t\t\tcontinue;\n\n\t\t// Got a duplicate name, so recursively try something else ...\n\t\tstd::string base(k3d::trim(Name));\n\t\tunsigned int copy = 1;\n\n\t\t//parse(Name.c_str(), lexeme_d[*(anychar_p - space_p)][assign(base)] >> !(int_p[assign(copy)]), space_p);\n\n\t\t// Find trailing space followed by a number and increment ('k3d 5' -> 'k3d 6', 'k3d3' -> 'k3d3 2')\n\t\tstd::string::iterator c = base.end();\n\t\twhile(--c != base.begin() && *c >= '0' && *c <= '9')\n\t\t{\n\t\t}\n\n\t\tif(*c == ' ')\n\t\t{\n\t\t\t// Get trailing number\n\t\t\tstd::string number(c + 1, base.end());\n\t\t\tcopy = k3d::from_string<unsigned long>(number, 1);\n\n\t\t\t// Cut trailing space + number\n\t\t\tbase = std::string(base.begin(), c);\n\t\t}\n\n\t\treturn unique_name(Nodes, base + ' ' + k3d::string_cast(copy+1));\n\t}\n\n\treturn Name;\n}\n\nvoid delete_nodes(idocument& Document, const nodes_t& Nodes)\n{\n\tipipeline::dependencies_t skip_dependencies;\n\t// Get the dependencies needed to skip the deleted node\n\tdetail::skip_nodes(Nodes, skip_dependencies);\n\t// Let the nodes know that they're about to be deleted ...\n\tfor(nodes_t::const_iterator node = Nodes.begin(); node != Nodes.end(); ++node)\n\t\t(*node)->deleted_signal().emit();\n\n\t// Remove them from the document node collection ...\n\tDocument.nodes().remove_nodes(Nodes);\n\t\n\t// Remove them from node collection sinks\n\tconst k3d::inode_collection::nodes_t::const_iterator doc_node_end = Document.nodes().collection().end();\n\tfor(k3d::inode_collection::nodes_t::const_iterator doc_node = Document.nodes().collection().begin(); doc_node != doc_node_end; ++doc_node)\n\t{\n\t\tif(k3d::inode_collection_sink* const node_collection_sink = dynamic_cast<k3d::inode_collection_sink*>(*doc_node))\n\t\t{\n\t\t\tconst k3d::inode_collection_sink::properties_t properties = node_collection_sink->node_collection_properties();\n\t\t\tfor(k3d::inode_collection_sink::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t\t{\n\t\t\t\tif(k3d::inode_collection_property* const node_collection_property = dynamic_cast<k3d::inode_collection_property*>(*property))\n\t\t\t\t{\n\t\t\t\t\tk3d::inode_collection_property::nodes_t nodes = k3d::property::internal_value<k3d::inode_collection_property::nodes_t>(**property);\n\t\t\t\t\tfor(nodes_t::const_iterator node = Nodes.begin(); node != Nodes.end(); ++node)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (k3d::inode_collection_property::nodes_t::iterator visible_node = nodes.begin(); visible_node != nodes.end(); )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (*visible_node == *node)\n\t\t\t\t\t\t\t\tvisible_node = nodes.erase(visible_node);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t++visible_node;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tk3d::property::set_internal_value(**property, nodes);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Make sure the node gets cleaned-up properly after a redo ...\n\tfor(nodes_t::const_iterator node = Nodes.begin(); node != Nodes.end(); ++node)\n\t\tk3d::undoable_delete(*node, Document);\n\t\n\tDocument.pipeline().set_dependencies(skip_dependencies);\n}\n\nvoid make_visible(const nodes_t& Nodes, inode_collection_sink& NodeCollectionSink)\n{\n\tconst k3d::inode_collection_sink::properties_t properties = NodeCollectionSink.node_collection_properties();\n\tfor(k3d::inode_collection_sink::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t{\n\t\tif(k3d::inode_collection_property* const node_collection_property = dynamic_cast<k3d::inode_collection_property*>(*property))\n\t\t{\n\t\t\tk3d::inode_collection_property::nodes_t nodes = k3d::property::internal_value<k3d::inode_collection_property::nodes_t>(**property);\n\t\t\tnodes.insert(nodes.end(), Nodes.begin(), Nodes.end());\n\t\t}\n\t}\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/nodes.h",
    "content": "#ifndef K3DSDK_NODES_H\n#define K3DSDK_NODES_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/uuid.h>\n#include <k3dsdk/imetadata.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/inode.h>\n\n#include <k3dsdk/utility.h>\n\n#include <vector>\n\n#ifdef interface\n#undef interface\n#endif // interface\n\nnamespace k3d\n{\n\n// Forward declarations\nclass idocument;\nclass iproperty;\nclass inode_collection_sink;\n\n/// Defines a collection of nodes\ntypedef inode_collection::nodes_t nodes_t;\n\n/// Returns the node that owns the given property (could return NULL)\n/** \\deprecated Use methods in k3d::node instead */\ninode* find_node(inode_collection& Nodes, iproperty& Property);\n\n/// Returns a unique node name based on the one supplied\nconst std::string unique_name(inode_collection& Nodes, const std::string& Name);\n\n/// Deletes a collection of nodes, cleaning-up all references and resources (this operation is undo-able, if state change recording is in effect)\nvoid delete_nodes(idocument& Document, const nodes_t& Nodes);\n\n/// Marks the given nodes as visible in the given node collection sink\nvoid make_visible(const nodes_t& Nodes, inode_collection_sink& NodeCollectionSink);\n\n} // namespace k3d\n\n#endif // !K3DSDK_NODES_H\n\n"
  },
  {
    "path": "k3dsdk/noise.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/noise.h>\n\nnamespace k3d\n{\n\nnamespace noise\n{\n\n//////////////////////////////////////////////////////////////////////////////\n// classic3\n\ninline int32_t fastfloor(double_t x)\n{\n\treturn x > 0 ? static_cast<int32_t>(x) : static_cast<int32_t>(x - 1);\n}\n\ninline double_t dot(int32_t g[], double_t x, double_t y, double_t z)\n{\n\treturn g[0]*x + g[1]*y + g[2]*z;\n}\n\ninline double_t mix(double_t a, double_t b, double_t t)\n{\n\treturn (1-t)*a + t*b;\n}\n\ninline double_t fade(double_t t)\n{\n\treturn t*t*t*(t*(t*6-15)+10);\n}\n\nint32_t classic3::grad3[][3] = {\n\t\t{1,1,0}, {-1,1,0}, {1,-1,0}, {-1,-1,0},\n\t\t{1,0,1}, {-1,0,1}, {1,0,-1}, {-1,0,-1},\n\t\t{0,1,1}, {0,-1,1}, {0,1,-1}, {0,-1,-1}\n\t\t};\n\nint32_t classic3::p[] = {\n\t151,160,137,91,90,15,\n\t131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\n\t190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\n\t88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,\n\t77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\n\t102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,\n\t135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,\n\t5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\n\t223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,\n\t129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,\n\t251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\n\t49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,\n\t138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180\n\t};\n\nint32_t classic3::perm[512];\n\nclassic3::classic3()\n{\n\tstatic bool_t initialized = false;\n\tif(!initialized)\n\t{\n\t\tinitialized = true;\n\t\tfor(int32_t i = 0; i < 512; ++i)\n\t\t\tperm[i] = p[i & 255];\n\t}\n}\n\ndouble_t classic3::operator()(double_t x, double_t y, double_t z) const\n{\n\t// Find unit grid cell containing point\n\tint32_t X = fastfloor(x);\n\tint32_t Y = fastfloor(y);\n\tint32_t Z = fastfloor(z);\n\n\t// Get relative xyz coordinates of point within that cell\n\tx = x - X;\n\ty = y - Y;\n\tz = z - Z;\n\n\t// Wrap the integer cells at 255 (smaller integer period can be introduced here)\n\tX = X & 255;\n\tY = Y & 255;\n\tZ = Z & 255;\n\n\t// Calculate a set of eight hashed gradient indices\n\tint32_t gi000 = perm[X+perm[Y+perm[Z]]] % 12;\n\tint32_t gi001 = perm[X+perm[Y+perm[Z+1]]] % 12;\n\tint32_t gi010 = perm[X+perm[Y+1+perm[Z]]] % 12;\n\tint32_t gi011 = perm[X+perm[Y+1+perm[Z+1]]] % 12;\n\tint32_t gi100 = perm[X+1+perm[Y+perm[Z]]] % 12;\n\tint32_t gi101 = perm[X+1+perm[Y+perm[Z+1]]] % 12;\n\tint32_t gi110 = perm[X+1+perm[Y+1+perm[Z]]] % 12;\n\tint32_t gi111 = perm[X+1+perm[Y+1+perm[Z+1]]] % 12;\n\t// The gradients of each corner are now:\n\t// g000 = grad3[gi000];\n\t// g001 = grad3[gi001];\n\t// g010 = grad3[gi010];\n\t// g011 = grad3[gi011];\n\t// g100 = grad3[gi100];\n\t// g101 = grad3[gi101];\n\t// g110 = grad3[gi110];\n\t// g111 = grad3[gi111];\n\t// Calculate noise contributions from each of the eight corners\n\tdouble_t n000= dot(grad3[gi000], x, y, z);\n\tdouble_t n100= dot(grad3[gi100], x-1, y, z);\n\tdouble_t n010= dot(grad3[gi010], x, y-1, z);\n\tdouble_t n110= dot(grad3[gi110], x-1, y-1, z);\n\tdouble_t n001= dot(grad3[gi001], x, y, z-1);\n\tdouble_t n101= dot(grad3[gi101], x-1, y, z-1);\n\tdouble_t n011= dot(grad3[gi011], x, y-1, z-1);\n\tdouble_t n111= dot(grad3[gi111], x-1, y-1, z-1);\n\t// Compute the fade curve value for each of x, y, z\n\tdouble_t u = fade(x);\n\tdouble_t v = fade(y);\n\tdouble_t w = fade(z);\n\t// Interpolate along x the contributions from each of the corners\n\tdouble_t nx00 = mix(n000, n100, u);\n\tdouble_t nx01 = mix(n001, n101, u);\n\tdouble_t nx10 = mix(n010, n110, u);\n\tdouble_t nx11 = mix(n011, n111, u);\n\t// Interpolate the four results along y\n\tdouble_t nxy0 = mix(nx00, nx10, v);\n\tdouble_t nxy1 = mix(nx01, nx11, v);\n\t// Interpolate the two last results along z\n\tdouble_t nxyz = mix(nxy0, nxy1, w);\n\n\treturn nxyz;\n}\n\n} // namespace noise\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/noise.h",
    "content": "#ifndef K3DSDK_NOISE_H\n#define K3DSDK_NOISE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Functions by Ken Perlin, from \"Texturing and Modeling - A Procedural Approach\"\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/point3.h>\n#include <k3dsdk/types.h>\n#include <boost/static_assert.hpp>\n\nnamespace k3d\n{\n\nnamespace noise\n{\n\n/// Noise generator that returns \"classic\" Perlin 3D noise in the range (-1, 1).\nclass classic3\n{\npublic:\n\tclassic3();\n\n\t/// Returns a noise value in the range (-1, 1) for the given point in 3-space.\n\tdouble_t operator()(double_t X, double_t Y, double_t Z) const;\n\nprivate:\n\tstatic int32_t grad3[][3];\n\tstatic int32_t p[];\n\tstatic int32_t perm[512];\n};\n\n/// Helper function that maps 3D noise to 3D objects including point3, vector3, normal3, and texture3.\ntemplate<typename ValueT, typename GeneratorT>\nconst ValueT map3(const GeneratorT& Generator, double_t X, double_t Y, double_t Z)\n{\n\treturn ValueT(\n\t\tGenerator(X + 0.34, Y + 0.66, Z + 0.237),\n\t\tGenerator(X + 0.011, Y + 0.845, Z + 0.037),\n\t\tGenerator(X + 0.34, Y + 0.12, Z + 0.9)\n\t\t);\n}\n\n} // namespace noise\n\n} // namespace k3d\n\n#endif // !K3DSDK_NOISE_H\n\n"
  },
  {
    "path": "k3dsdk/normal3.h",
    "content": "#ifndef K3DSDK_NORMAL3_H\n#define K3DSDK_NORMAL3_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Vector (points, vectors and normals) routines\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n/****************************************************************\n*\n* C++ Vector and Matrix Algebra routines\n* Author: Jean-Francois DOUE\n* Version 3.1 --- October 1993\n*\n****************************************************************/\n\n//\n//\tFrom \"Graphics Gems IV / Edited by Paul S. Heckbert\n//\tAcademic Press, 1994, ISBN 0-12-336156-9\n//\t\"You are free to use and modify this code in any way\n//\tyou like.\" (p. xv)\n//\n//\tModified by J. Nagle, March 1997\n//\t-\tAll functions are inline.\n//\t-\tAll functions are const-correct.\n//\t-\tAll checking is via the standard \"assert\" macro.\n//\n\n// Modified by Tim Shead for use with K-3D, January 1998\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/result.h>\n\n#include <boost/io/ios_state.hpp>\n\n#include <cmath>\n#include <iomanip>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// normal3\n\n/// Encapsulates a 3D surface normal\nclass normal3\n{\npublic:\n\t/// Stores the normal values\n\tdouble n[3];\n\n\tnormal3()\n\t{\n\t\tn[0] = n[1] = n[2] = 0.0;\n\t}\n\n\tnormal3(const double x, const double y, const double z)\n\t{\n\t\tn[0] = x;\n\t\tn[1] = y;\n\t\tn[2] = z;\n\t}\n\n\tnormal3& operator+=(const normal3& v)\n\t{\n\t\tn[0] += v.n[0];\n\t\tn[1] += v.n[1];\n\t\tn[2] += v.n[2];\n\t\treturn *this;\n\t}\n\n\tnormal3& operator-=(const normal3& v)\n\t{\n\t\tn[0] += v.n[0];\n\t\tn[1] += v.n[1];\n\t\tn[2] += v.n[2];\n\t\treturn *this;\n\t}\n\n\tnormal3& operator*=(const double d)\n\t{\n\t\tn[0] *= d;\n\t\tn[1] *= d;\n\t\tn[2] *= d;\n\t\treturn *this;\n\t}\n\n\tnormal3& operator/=(const double d)\n\t{\n\t\treturn_val_if_fail(d, *this);\n\n\t\tconst double d_inv = 1./d;\n\t\tn[0] *= d_inv;\n\t\tn[1] *= d_inv;\n\t\tn[2] *= d_inv;\n\t\treturn *this;\n\t}\n\n\tdouble& operator[](const unsigned int i)\n\t{\n\t\treturn n[i];\n\t}\n\n\tdouble operator[](const unsigned int i) const\n\t{\n\t\treturn n[i];\n\t}\n\n\t/// Returns the normal length\n\tdouble length() const\n\t{\n\t\treturn std::sqrt(length2());\n\t}\n\n\t/// Returns the squared normal length\n\tdouble length2() const\n\t{\n\t\treturn n[0] * n[0] + n[1] * n[1] + n[2] * n[2];\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const normal3& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.n[0] << \" \" << RHS.n[1] << \" \" << RHS.n[2];\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, normal3& RHS)\n\t{\n\t\tStream >> RHS.n[0] >> RHS.n[1] >> RHS.n[2];\n\t\treturn Stream;\n\t}\n};\n\n/// Multiplication by a constant\ninline const normal3 operator*(const normal3& a, const double d)\n{\n\treturn normal3(a.n[0] * d, a.n[1] * d, a.n[2] * d);\n}\n\n/// Multiplication by a constant\ninline const normal3 operator*(const double d, const normal3& a)\n{\n\treturn normal3(a.n[0] * d, a.n[1] * d, a.n[2] * d);\n}\n\n/// Division by a constant\ninline const normal3 operator/(const normal3& a, const double d)\n{\n\treturn_val_if_fail(d, normal3());\n\treturn normal3(a.n[0] / d, a.n[1] / d, a.n[2] / d);\n}\n\n/// Returns the dot product of two normals\ninline double operator*(const normal3& a, const normal3& b)\n{\n\treturn a.n[0] * b.n[0] + a.n[1] * b.n[1] + a.n[2] * b.n[2];\n}\n\n/// Returns the cross product of two normals\ninline const normal3 operator^(const normal3& a, const normal3& b)\n{\n\treturn normal3(a.n[1] * b.n[2] - a.n[2] * b.n[1], a.n[2] * b.n[0] - a.n[0] * b.n[2], a.n[0] * b.n[1] - a.n[1] * b.n[0]);\n}\n\n/// Equality\ninline bool operator==(const normal3& a, const normal3& b)\n{\n\treturn a.n[0] == b.n[0] && a.n[1] == b.n[1] && a.n[2] == b.n[2];\n}\n\n/// Inequality\ninline bool operator!=(const normal3& a, const normal3& b)\n{\n\treturn a.n[0] != b.n[0] || a.n[1] != b.n[1] || a.n[2] != b.n[2];\n}\n\n/// Returns the length of a normal\ninline double length(const normal3& Normal)\n{\n\treturn Normal.length();\n}\n\n/// Returns the normalized form of a normal\ninline const normal3 normalize(const normal3& Normal)\n{\n\tconst double length = Normal.length();\n\treturn_val_if_fail(length, Normal);\n\treturn Normal / length;\n}\n\nnamespace difference\n{\n\n/// Specialization of difference::test for normal3\ninline void test(const normal3& A, const normal3& B, accumulator& Result)\n{\n\trange_test(A.n, A.n + 3, B.n, B.n + 3, Result);\n}\n\n} // difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_NORMAL3_H\n\n"
  },
  {
    "path": "k3dsdk/nurbs_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/geometric_operations.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\n#include <numeric>\n\nnamespace k3d\n{\n\nnamespace nurbs_curve\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::materials_t& Material,\n\tconst mesh::indices_t& CurveFirstPoints,\n\tconst mesh::counts_t& CurvePointCounts,\n\tconst mesh::orders_t& CurveOrders,\n\tconst mesh::indices_t& CurveFirstKnots,\n\tconst mesh::selection_t& CurveSelections,\n\tconst mesh::indices_t& CurvePoints,\n\tconst mesh::weights_t& CurvePointWeights,\n\tconst mesh::knots_t& CurveKnots,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& CurveAttributes,\n\tconst mesh::table_t& ParameterAttributes,\n\tconst mesh::table_t& VertexAttributes\n\t\t) :\n\tmaterial(Material),\n\tcurve_first_points(CurveFirstPoints),\n\tcurve_point_counts(CurvePointCounts),\n\tcurve_orders(CurveOrders),\n\tcurve_first_knots(CurveFirstKnots),\n\tcurve_selections(CurveSelections),\n\tcurve_points(CurvePoints),\n\tcurve_point_weights(CurvePointWeights),\n\tcurve_knots(CurveKnots),\n\tconstant_attributes(ConstantAttributes),\n\tcurve_attributes(CurveAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\nconst_primitive::const_primitive(const primitive& Primitive) :\n\tmaterial(Primitive.material),\n\tcurve_first_points(Primitive.curve_first_points),\n\tcurve_point_counts(Primitive.curve_point_counts),\n\tcurve_orders(Primitive.curve_orders),\n\tcurve_first_knots(Primitive.curve_first_knots),\n\tcurve_selections(Primitive.curve_selections),\n\tcurve_points(Primitive.curve_points),\n\tcurve_point_weights(Primitive.curve_point_weights),\n\tcurve_knots(Primitive.curve_knots),\n\tconstant_attributes(Primitive.constant_attributes),\n\tcurve_attributes(Primitive.curve_attributes),\n\tparameter_attributes(Primitive.parameter_attributes),\n\tvertex_attributes(Primitive.vertex_attributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::materials_t& Material,\n\tmesh::indices_t& CurveFirstPoints,\n\tmesh::counts_t& CurvePointCounts,\n\tmesh::orders_t& CurveOrders,\n\tmesh::indices_t& CurveFirstKnots,\n\tmesh::selection_t& CurveSelections,\n\tmesh::indices_t& CurvePoints,\n\tmesh::weights_t& CurvePointWeights,\n\tmesh::knots_t& CurveKnots,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& CurveAttributes,\n\tmesh::table_t& ParameterAttributes,\n\tmesh::table_t& VertexAttributes\n\t\t) :\n\tmaterial(Material),\n\tcurve_first_points(CurveFirstPoints),\n\tcurve_point_counts(CurvePointCounts),\n\tcurve_orders(CurveOrders),\n\tcurve_first_knots(CurveFirstKnots),\n\tcurve_selections(CurveSelections),\n\tcurve_points(CurvePoints),\n\tcurve_point_weights(CurvePointWeights),\n\tcurve_knots(CurveKnots),\n\tconstant_attributes(ConstantAttributes),\n\tcurve_attributes(CurveAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\treturn create(Mesh.primitives.create(\"nurbs_curve\"));\n}\n\nprimitive* create(mesh::primitive& Primitive)\n{\n\treturn_val_if_fail(Primitive.type == \"nurbs_curve\", 0);\n\tprimitive* const result = new primitive(\n\t\tPrimitive.structure[\"constant\"].create<mesh::materials_t>(\"material\"),\n\t\tPrimitive.structure[\"curve\"].create<mesh::indices_t>(\"curve_first_points\"),\n\t\tPrimitive.structure[\"curve\"].create<mesh::counts_t>(\"curve_point_counts\"),\n\t\tPrimitive.structure[\"curve\"].create<mesh::orders_t>(\"curve_orders\"),\n\t\tPrimitive.structure[\"curve\"].create<mesh::indices_t>(\"curve_first_knots\"),\n\t\tPrimitive.structure[\"curve\"].create<mesh::selection_t>(\"curve_selections\"),\n\t\tPrimitive.structure[\"vertex\"].create<mesh::indices_t>(\"curve_points\"),\n\t\tPrimitive.structure[\"vertex\"].create<mesh::weights_t>(\"curve_point_weights\"),\n\t\tPrimitive.structure[\"knot\"].create<mesh::knots_t>(\"curve_knots\"),\n\t\tPrimitive.attributes[\"constant\"],\n\t\tPrimitive.attributes[\"curve\"],\n\t\tPrimitive.attributes[\"parameter\"],\n\t\tPrimitive.attributes[\"vertex\"]\n\t\t);\n\n\tresult->curve_selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\tresult->curve_points.set_metadata_value(metadata::key::domain(), metadata::value::point_indices_domain());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"nurbs_curve\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& constant_structure = require_structure(Primitive, \"constant\");\n\t\tconst mesh::table_t& curve_structure = require_structure(Primitive, \"curve\");\n\t\tconst mesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\t\tconst mesh::table_t& knot_structure = require_structure(Primitive, \"knot\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& curve_attributes = require_attributes(Primitive, \"curve\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tconst mesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tconst mesh::materials_t& material = require_array<mesh::materials_t>(Primitive, constant_structure, \"material\");\n\t\tconst mesh::indices_t& curve_first_points = require_array<mesh::indices_t>(Primitive, curve_structure, \"curve_first_points\");\n\t\tconst mesh::counts_t& curve_point_counts = require_array<mesh::counts_t>(Primitive, curve_structure, \"curve_point_counts\");\n\t\tconst mesh::orders_t& curve_orders = require_array<mesh::orders_t>(Primitive, curve_structure, \"curve_orders\");\n\t\tconst mesh::indices_t& curve_first_knots = require_array<mesh::indices_t>(Primitive, curve_structure, \"curve_first_knots\");\n\t\tconst mesh::selection_t& curve_selections = require_array<mesh::selection_t>(Primitive, curve_structure, \"curve_selections\");\n\t\tconst mesh::indices_t& curve_points = require_array<mesh::indices_t>(Primitive, vertex_structure, \"curve_points\");\n\t\tconst mesh::weights_t& curve_point_weights = require_array<mesh::weights_t>(Primitive, vertex_structure, \"curve_point_weights\");\n\t\tconst mesh::knots_t& curve_knots = require_array<mesh::knots_t>(Primitive, knot_structure, \"curve_knots\");\n\n\t\trequire_metadata(Primitive, curve_selections, \"curve_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, curve_points, \"curve_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", std::accumulate(curve_point_counts.begin(), curve_point_counts.end(), 0));\n\t\trequire_table_row_count(Primitive, knot_structure, \"knots\",\n\t\t\tstd::accumulate(curve_point_counts.begin(), curve_point_counts.end(), 0)\n\t\t\t+ std::accumulate(curve_orders.begin(), curve_orders.end(), 0));\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", curve_structure.row_count() * 2);\n\n\t\treturn new const_primitive(material, curve_first_points, curve_point_counts, curve_orders, curve_first_knots, curve_selections, curve_points,curve_point_weights, curve_knots, constant_attributes, curve_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"nurbs_curve\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& constant_structure = require_structure(Primitive, \"constant\");\n\t\tmesh::table_t& curve_structure = require_structure(Primitive, \"curve\");\n\t\tmesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\t\tmesh::table_t& knot_structure = require_structure(Primitive, \"knot\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& curve_attributes = require_attributes(Primitive, \"curve\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tmesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tmesh::materials_t& material = require_array<mesh::materials_t>(Primitive, constant_structure, \"material\");\n\t\tmesh::indices_t& curve_first_points = require_array<mesh::indices_t>(Primitive, curve_structure, \"curve_first_points\");\n\t\tmesh::counts_t& curve_point_counts = require_array<mesh::counts_t>(Primitive, curve_structure, \"curve_point_counts\");\n\t\tmesh::orders_t& curve_orders = require_array<mesh::orders_t>(Primitive, curve_structure, \"curve_orders\");\n\t\tmesh::indices_t& curve_first_knots = require_array<mesh::indices_t>(Primitive, curve_structure, \"curve_first_knots\");\n\t\tmesh::selection_t& curve_selections = require_array<mesh::selection_t>(Primitive, curve_structure, \"curve_selections\");\n\t\tmesh::indices_t& curve_points = require_array<mesh::indices_t>(Primitive, vertex_structure, \"curve_points\");\n\t\tmesh::weights_t& curve_point_weights = require_array<mesh::weights_t>(Primitive, vertex_structure, \"curve_point_weights\");\n\t\tmesh::knots_t& curve_knots = require_array<mesh::knots_t>(Primitive, knot_structure, \"curve_knots\");\n\n\t\trequire_metadata(Primitive, curve_selections, \"curve_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, curve_points, \"curve_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", std::accumulate(curve_point_counts.begin(), curve_point_counts.end(), 0));\n\t\trequire_table_row_count(Primitive, knot_structure, \"knots\",\n\t\t\tstd::accumulate(curve_point_counts.begin(), curve_point_counts.end(), 0)\n\t\t\t+ std::accumulate(curve_orders.begin(), curve_orders.end(), 0));\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", curve_structure.row_count() * 2);\n\n\t\treturn new primitive(material, curve_first_points, curve_point_counts, curve_orders, curve_first_knots, curve_selections, curve_points,curve_point_weights, curve_knots, constant_attributes, curve_attributes, parameter_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"nurbs_curve\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\nvoid add_curve(mesh& Mesh, primitive& Primitive, const uint_t Order, const mesh::points_t& ControlPoints, const uint_t RepeatPoints)\n{\n\tadd_curve(Mesh, Primitive, Order, ControlPoints, mesh::weights_t(ControlPoints.size(), 1), RepeatPoints);\n}\n\nvoid add_curve(mesh& Mesh, primitive& Primitive, const uint_t Order, const mesh::points_t& ControlPoints, const mesh::weights_t& Weights, const uint_t RepeatPoints)\n{\n\tmesh::knots_t knots;\n\tadd_open_uniform_knots(Order, ControlPoints.size() + RepeatPoints, knots);\n\tadd_curve(Mesh, Primitive, Order, ControlPoints, Weights, knots, RepeatPoints);\n}\n\nvoid add_curve(mesh& Mesh, primitive& Primitive, const uint_t Order, const mesh::points_t& ControlPoints, const mesh::weights_t& Weights, const mesh::knots_t& Knots, const uint_t RepeatPoints)\n{\n\treturn_if_fail(Mesh.points);\n\treturn_if_fail(Mesh.point_selection);\n\n\treturn_if_fail(Order >= 2);\n\treturn_if_fail(ControlPoints.size() + RepeatPoints >= Order);\n\treturn_if_fail(ControlPoints.size() == Weights.size());\n\treturn_if_fail(Knots.size() == ControlPoints.size() + RepeatPoints + Order);\n\n\tmesh::points_t& points = Mesh.points.writable();\n\tmesh::selection_t& point_selection = Mesh.point_selection.writable();\n\n        Primitive.curve_first_points.push_back(Primitive.curve_points.size());\n        Primitive.curve_point_counts.push_back(ControlPoints.size() + RepeatPoints);\n        Primitive.curve_orders.push_back(Order);\n        Primitive.curve_first_knots.push_back(Primitive.curve_knots.size());\n        Primitive.curve_selections.push_back(0);\n\n\tconst uint_t start_index = Primitive.curve_points.size();\n        for(uint_t i = 0; i != ControlPoints.size(); ++i)\n        {\n                Primitive.curve_points.push_back(points.size());\n                Primitive.curve_point_weights.push_back(Weights[i]);\n                points.push_back(ControlPoints[i]);\n                point_selection.push_back(0);\n        }\n\n\tfor(uint_t i = 0; i != RepeatPoints; ++i)\n\t{\n\t\tconst uint_t repeat_index = start_index + (i % ControlPoints.size());\n\t\tPrimitive.curve_points.push_back(Primitive.curve_points[repeat_index]);\n\t\tPrimitive.curve_point_weights.push_back(Primitive.curve_point_weights[repeat_index]);\n\t}\n\n        Primitive.curve_knots.insert(Primitive.curve_knots.end(), Knots.begin(), Knots.end());\n}\n\nvoid add_curves(mesh& Mesh, primitive& Primitive, const mesh::points_t& Points, const mesh::orders_t& Orders, const mesh::counts_t& ControlPointCounts, const mesh::indices_t& ControlPoints)\n{\n\tadd_curves(Mesh, Primitive, Points, Orders, ControlPointCounts, ControlPoints, mesh::weights_t(ControlPoints.size(), 1));\n}\n\nvoid add_curves(mesh& Mesh, primitive& Primitive, const mesh::points_t& Points, const mesh::orders_t& Orders, const mesh::counts_t& ControlPointCounts, const mesh::indices_t& ControlPoints, const mesh::weights_t& ControlPointWeights)\n{\n\treturn_if_fail(Orders.size() == ControlPointCounts.size());\n\n\tmesh::knots_t knots;\n\tfor(uint_t i = 0; i != Orders.size(); ++i)\n\t\tadd_open_uniform_knots(Orders[i], ControlPointCounts[i], knots);\n\n\tadd_curves(Mesh, Primitive, Points, Orders, ControlPointCounts, ControlPoints, ControlPointWeights, knots);\n}\n\nvoid add_curves(mesh& Mesh, primitive& Primitive, const mesh::points_t& Points, const mesh::orders_t& Orders, const mesh::counts_t& ControlPointCounts, const mesh::indices_t& ControlPoints, const mesh::weights_t& ControlPointWeights, const mesh::knots_t& Knots)\n{\n\t// Sanity checking ...\n\treturn_if_fail(Mesh.points);\n\treturn_if_fail(Mesh.point_selection);\n\n\treturn_if_fail(Orders.size() == ControlPointCounts.size());\n\n\tfor(uint_t i = 0; i != Orders.size(); ++i)\n\t{\n\t\treturn_if_fail(Orders[i] >= 2);\n\t\treturn_if_fail(ControlPointCounts[i] >= Orders[i]);\n\t}\n\n\treturn_if_fail(ControlPoints.size() == std::accumulate(ControlPointCounts.begin(), ControlPointCounts.end(), 0));\n\tfor(uint_t i = 0; i != ControlPoints.size(); ++i)\n\t\treturn_if_fail(ControlPoints[i] < Points.size());\n\n\treturn_if_fail(ControlPointWeights.size() == ControlPoints.size());\n\treturn_if_fail(Knots.size() == std::accumulate(Orders.begin(), Orders.end(), 0) + ControlPoints.size());\n\n\t// Update the primitive ...\n\tmesh::points_t& points = Mesh.points.writable();\n\tmesh::selection_t& point_selection = Mesh.point_selection.writable();\n\n\tconst uint_t point_offset = points.size();\n\tpoints.insert(points.end(), Points.begin(), Points.end());\n\tpoint_selection.insert(point_selection.end(), Points.size(), 0);\n\n\tuint_t first_point_offset = Primitive.curve_points.size();\n\tfor(uint_t i = 0; i != ControlPoints.size(); ++i)\n\t{\n\t\tPrimitive.curve_points.push_back(ControlPoints[i] + point_offset);\n\t}\n\tPrimitive.curve_point_weights.insert(Primitive.curve_point_weights.end(), ControlPointWeights.begin(), ControlPointWeights.end());\n\n\tuint_t first_knot_offset = Primitive.curve_knots.size();\n        Primitive.curve_knots.insert(Primitive.curve_knots.end(), Knots.begin(), Knots.end());\n\n\tfor(uint_t i = 0; i != Orders.size(); ++i)\n\t{\n\t\tPrimitive.curve_first_points.push_back(first_point_offset);\n\t\tPrimitive.curve_point_counts.push_back(ControlPointCounts[i]);\n\t\tPrimitive.curve_orders.push_back(Orders[i]);\n\t\tPrimitive.curve_first_knots.push_back(first_knot_offset);\n\t\tPrimitive.curve_selections.push_back(0);\n\n\t\tfirst_point_offset += ControlPointCounts[i];\n\t\tfirst_knot_offset += Orders[i] + ControlPointCounts[i];\n\t}\n}\n\nvoid add_open_uniform_knots(const uint_t Order, const uint_t ControlPointCount, mesh::knots_t& Knots)\n{\n        Knots.insert(Knots.end(), Order, 0);\n\tfor(uint_t i = 1; i <= ControlPointCount - Order; ++i)\n\t\tKnots.insert(Knots.end(), 1, i);\n\tKnots.insert(Knots.end(), Order, ControlPointCount - Order + 1);\n}\n\nvoid circular_arc(const vector3& X, const vector3& Y, const double_t StartAngle, const double_t EndAngle, const uint_t Segments, mesh::knots_t& Knots, mesh::weights_t& Weights, mesh::points_t& ControlPoints)\n{\n\treturn_if_fail(Segments);\n\n\tconst double_t theta = (EndAngle - StartAngle) / static_cast<double_t>(Segments);\n\tconst double_t weight = std::cos(std::fabs(theta) * 0.5);\n\n\tKnots.clear();\n\tKnots.insert(Knots.end(), 3, 0);\n\tfor(uint_t i = 1; i != Segments; ++i)\n\t\tKnots.insert(Knots.end(), 2, i);\n\tKnots.insert(Knots.end(), 3, Segments);\n\n\tWeights.clear();\n\tWeights.push_back(1.0);\n\tfor(uint_t i = 0; i != Segments; ++i)\n\t{\n\t\tWeights.push_back(weight);\n\t\tWeights.push_back(1);\n\t}\n\n\tControlPoints.clear();\n\tControlPoints.push_back(k3d::to_point(std::cos(StartAngle) * X + std::sin(StartAngle) * Y));\n\tfor(uint_t i = 0; i != Segments; ++i)\n\t{\n\t\tconst double_t a0 = mix(StartAngle, EndAngle, static_cast<double_t>(i) / static_cast<double_t>(Segments));\n\t\tconst double_t a2 = mix(StartAngle, EndAngle, static_cast<double_t>(i+1) / static_cast<double_t>(Segments));\n\n\t\tconst point3 p0(k3d::to_point(std::cos(a0) * X + std::sin(a0) * Y));\n\t\tconst point3 p2(k3d::to_point(std::cos(a2) * X + std::sin(a2) * Y));\n\n\t\tconst point3 t0(k3d::to_point(-std::sin(a0) * X + std::cos(a0) * Y));\n\t\tconst point3 t2(k3d::to_point(-std::sin(a2) * X + std::cos(a2) * Y));\n\n\t\tpoint3 p1;\n\t\tintersect_lines(p0, to_vector(t0), p2, to_vector(t2), p1);\n\n\t\tControlPoints.push_back(p1);\n\t\tControlPoints.push_back(p2);\n\t}\n}\n\n} // namespace nurbs_curve\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/nurbs_curve.h",
    "content": "#ifndef K3DSDK_NURBS_CURVE_H\n#define K3DSDK_NURBS_CURVE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace nurbs_curve\n{\n\nclass primitive;\n\n/// Gathers the member arrays of a nurbs_curve primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::materials_t& Material,\n\t\tconst mesh::indices_t& CurveFirstPoints,\n\t\tconst mesh::counts_t& CurvePointCounts,\n\t\tconst mesh::orders_t& CurveOrders,\n\t\tconst mesh::indices_t& CurveFirstKnots,\n\t\tconst mesh::selection_t& CurveSelections,\n\t\tconst mesh::indices_t& CurvePoints,\n\t\tconst mesh::weights_t& CurvePointWeights,\n\t\tconst mesh::knots_t& CurveKnots,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& CurveAttributes,\n\t\tconst mesh::table_t& ParameterAttributes,\n\t\tconst mesh::table_t& VertexAttributes\n\t\t);\n\n\tconst_primitive(const primitive& Primitive);\n\n\tconst mesh::materials_t& material;\n\tconst mesh::indices_t& curve_first_points;\n\tconst mesh::counts_t& curve_point_counts;\n\tconst mesh::orders_t& curve_orders;\n\tconst mesh::indices_t& curve_first_knots;\n\tconst mesh::selection_t& curve_selections;\n\tconst mesh::indices_t& curve_points;\n\tconst mesh::weights_t& curve_point_weights;\n\tconst mesh::knots_t& curve_knots;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& curve_attributes;\n\tconst mesh::table_t& parameter_attributes;\n\tconst mesh::table_t& vertex_attributes;\n};\n\n/// Gathers the member arrays of a nurbs_curve primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::materials_t& Material,\n\t\tmesh::indices_t& CurveFirstPoints,\n\t\tmesh::counts_t& CurvePointCounts,\n\t\tmesh::orders_t& CurveOrders,\n\t\tmesh::indices_t& CurveFirstKnots,\n\t\tmesh::selection_t& CurveSelections,\n\t\tmesh::indices_t& CurvePoints,\n\t\tmesh::weights_t& CurvePointWeights,\n\t\tmesh::knots_t& CurveKnots,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& CurveAttributes,\n\t\tmesh::table_t& ParameterAttributes,\n\t\tmesh::table_t& VertexAttributes\n\t\t);\n\n\n\tmesh::materials_t& material;\n\tmesh::indices_t& curve_first_points;\n\tmesh::counts_t& curve_point_counts;\n\tmesh::orders_t& curve_orders;\n\tmesh::indices_t& curve_first_knots;\n\tmesh::selection_t& curve_selections;\n\tmesh::indices_t& curve_points;\n\tmesh::weights_t& curve_point_weights;\n\tmesh::knots_t& curve_knots;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& curve_attributes;\n\tmesh::table_t& parameter_attributes;\n\tmesh::table_t& vertex_attributes;\n};\n\n/// Creates a new nurbs_curve mesh primitive inside the given mesh, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Creates a new nurbs_curve mesh primitive inside the given primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh::primitive& Primitive);\n\n/// Tests the given mesh primitive to see if it is a valid nurbs_curve primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid nurbs_curve primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid nurbs_curve primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n/// Adds a curve to an existing primitive, specified using the order of the curve and a set of control points.\n/// Control points will be assigned unity weights and an open uniform knot vector is automatically supplied.\nvoid add_curve(mesh& Mesh, primitive& Primitive, const uint_t Order, const mesh::points_t& ControlPoints, const uint_t RepeatPoints = 0);\n/// Adds a curve to an existing primitive, specified using the order of the curve and a set of control points and control point weights.\n/// An open uniform knot vector is automatically supplied.\nvoid add_curve(mesh& Mesh, primitive& Primitive, const uint_t Order, const mesh::points_t& ControlPoints, const mesh::weights_t& Weights, const uint_t RepeatPoints = 0);\n/// Adds a curve to an existing primitive, specified using the order of the curve and a set of control points, control point weights, and knot vector.\nvoid add_curve(mesh& Mesh, primitive& Primitive, const uint_t Order, const mesh::points_t& ControlPoints, const mesh::weights_t& Weights, const mesh::knots_t& Knots, const uint_t RepeatPoints = 0);\n/// Adds multiple curves to an existing primitive, specified by a set of points, curve orders, control point counts, and control point indices.\n/// Control points will be assigned unity weights, and curves will be assigned open uniform knot vectors.\nvoid add_curves(mesh& Mesh, primitive& Primitive, const mesh::points_t& Points, const mesh::orders_t& Orders, const mesh::counts_t& ControlPointCounts, const mesh::indices_t& ControlPoints);\n/// Adds multiple curves to an existing primitive, specified by a set of points, curve orders, control point counts, control point indices, and control point weights.\n/// Curves will be assigned open uniform knot vectors.\nvoid add_curves(mesh& Mesh, primitive& Primitive, const mesh::points_t& Points, const mesh::orders_t& Orders, const mesh::counts_t& ControlPointCounts, const mesh::indices_t& ControlPoints, const mesh::weights_t& ControlPointWeights);\n/// Adds multiple curves to an existing primitive, specified by a set of points, curve orders, control point counts, control point indices, control point weights, and knots.\nvoid add_curves(mesh& Mesh, primitive& Primitive, const mesh::points_t& Points, const mesh::orders_t& Orders, const mesh::counts_t& ControlPointCounts, const mesh::indices_t& ControlPoints, const mesh::weights_t& ControlPointWeights, const mesh::knots_t& Knots);\n\n/// Appends an open uniform knot vector to the given collection of knots.\nvoid add_open_uniform_knots(const uint_t Order, const uint_t ControlPointCount, mesh::knots_t& Knots);\n\n/** Computes a set of control points, weights, and knots that define an order-3 circular arc centered at the origin\n\t\\param X Defines the X axis of the plane containing the arc\n\t\\param Y Defines the Y axis of the plane containing the arc\n\t\\param StartAngle Start angle of the arc in radians\n\t\\param EndAngle End angle of the arc in radians\n\t\\param Segments The number of NURBS segments in the resulting arc\n\t\\param Knots Output container for the resulting arc knot vector\n\t\\param Weights Output container for the resulting arc control point weights\n\t\\param ControlPoints Output container for the resulting arc control point positions\n*/\nvoid circular_arc(const vector3& X, const vector3& Y, const double_t StartAngle, const double_t EndAngle, const uint_t Segments, mesh::knots_t& Knots, mesh::weights_t& Weights, mesh::points_t& ControlPoints);\n\n} // namespace nurbs_curve\n\n} // namespace k3d\n\n#endif // !K3DSDK_NURBS_CURVE_H\n\n"
  },
  {
    "path": "k3dsdk/nurbs_patch.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\n#include <numeric>\n\nnamespace k3d\n{\n\nnamespace nurbs_patch\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::indices_t& PatchFirstPoints,\n\tconst mesh::counts_t& PatchUPointCounts,\n\tconst mesh::counts_t& PatchVPointCounts,\n\tconst mesh::orders_t& PatchUOrders,\n\tconst mesh::orders_t& PatchVOrders,\n\tconst mesh::indices_t& PatchUFirstKnots,\n\tconst mesh::indices_t& PatchVFirstKnots,\n\tconst mesh::selection_t& PatchSelections,\n\tconst mesh::materials_t& PatchMaterials,\n\tconst mesh::indices_t& PatchPoints,\n\tconst mesh::weights_t& PatchPointWeights,\n\tconst mesh::knots_t& PatchUKnots,\n\tconst mesh::knots_t& PatchVKnots,\n\tconst mesh::indices_t& PatchFirstTrimLoops,\n\tconst mesh::counts_t& PatchTrimLoopCounts,\n\tconst mesh::indices_t& TrimLoopFirstCurves,\n\tconst mesh::counts_t& TrimLoopCurveCounts,\n\tconst mesh::selection_t& TrimLoopSelections,\n\tconst mesh::indices_t& CurveFirstPoints,\n\tconst mesh::counts_t& CurvePointCounts,\n\tconst mesh::orders_t& CurveOrders,\n\tconst mesh::indices_t& CurveFirstKnots,\n\tconst mesh::selection_t& CurveSelections,\n\tconst mesh::indices_t& CurvePoints,\n\tconst mesh::weights_t& CurvePointWeights,\n\tconst mesh::knots_t& CurveKnots,\n\tconst mesh::points_2d_t& Points,\n\tconst mesh::selection_t& PointSelections,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& PatchAttributes,\n\tconst mesh::table_t& ParameterAttributes,\n\tconst mesh::table_t& VertexAttributes\n\t\t) :\n\tpatch_first_points(PatchFirstPoints),\n\tpatch_u_point_counts(PatchUPointCounts),\n\tpatch_v_point_counts(PatchVPointCounts),\n\tpatch_u_orders(PatchUOrders),\n\tpatch_v_orders(PatchVOrders),\n\tpatch_u_first_knots(PatchUFirstKnots),\n\tpatch_v_first_knots(PatchVFirstKnots),\n\tpatch_selections(PatchSelections),\n\tpatch_materials(PatchMaterials),\n\tpatch_points(PatchPoints),\n\tpatch_point_weights(PatchPointWeights),\n\tpatch_u_knots(PatchUKnots),\n\tpatch_v_knots(PatchVKnots),\n\tpatch_first_trim_loops(PatchFirstTrimLoops),\n\tpatch_trim_loop_counts(PatchTrimLoopCounts),\n\ttrim_loop_first_curves(TrimLoopFirstCurves),\n\ttrim_loop_curve_counts(TrimLoopCurveCounts),\n\ttrim_loop_selections(TrimLoopSelections),\n\tcurve_first_points(CurveFirstPoints),\n\tcurve_point_counts(CurvePointCounts),\n\tcurve_orders(CurveOrders),\n\tcurve_first_knots(CurveFirstKnots),\n\tcurve_selections(CurveSelections),\n\tcurve_points(CurvePoints),\n\tcurve_point_weights(CurvePointWeights),\n\tcurve_knots(CurveKnots),\n\tpoints(Points),\n\tpoint_selections(PointSelections),\n\tconstant_attributes(ConstantAttributes),\n\tpatch_attributes(PatchAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\nconst_primitive::const_primitive(primitive& Primitive) :\n\t\tpatch_first_points(Primitive.patch_first_points),\n\t\tpatch_u_point_counts(Primitive.patch_u_point_counts),\n\t\tpatch_v_point_counts(Primitive.patch_v_point_counts),\n\t\tpatch_u_orders(Primitive.patch_u_orders),\n\t\tpatch_v_orders(Primitive.patch_v_orders),\n\t\tpatch_u_first_knots(Primitive.patch_u_first_knots),\n\t\tpatch_v_first_knots(Primitive.patch_v_first_knots),\n\t\tpatch_selections(Primitive.patch_selections),\n\t\tpatch_materials(Primitive.patch_materials),\n\t\tpatch_points(Primitive.patch_points),\n\t\tpatch_point_weights(Primitive.patch_point_weights),\n\t\tpatch_u_knots(Primitive.patch_u_knots),\n\t\tpatch_v_knots(Primitive.patch_v_knots),\n\t\tpatch_first_trim_loops(Primitive.patch_first_trim_loops),\n\t\tpatch_trim_loop_counts(Primitive.patch_trim_loop_counts),\n\t\ttrim_loop_first_curves(Primitive.trim_loop_first_curves),\n\t\ttrim_loop_curve_counts(Primitive.trim_loop_curve_counts),\n\t\ttrim_loop_selections(Primitive.trim_loop_selections),\n\t\tcurve_first_points(Primitive.curve_first_points),\n\t\tcurve_point_counts(Primitive.curve_point_counts),\n\t\tcurve_orders(Primitive.curve_orders),\n\t\tcurve_first_knots(Primitive.curve_first_knots),\n\t\tcurve_selections(Primitive.curve_selections),\n\t\tcurve_points(Primitive.curve_points),\n\t\tcurve_point_weights(Primitive.curve_point_weights),\n\t\tcurve_knots(Primitive.curve_knots),\n\t\tpoints(Primitive.points),\n\t\tpoint_selections(Primitive.point_selections),\n\t\tconstant_attributes(Primitive.constant_attributes),\n\t\tpatch_attributes(Primitive.patch_attributes),\n\t\tparameter_attributes(Primitive.parameter_attributes),\n\t\tvertex_attributes(Primitive.vertex_attributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::indices_t& PatchFirstPoints,\n\tmesh::counts_t& PatchUPointCounts,\n\tmesh::counts_t& PatchVPointCounts,\n\tmesh::orders_t& PatchUOrders,\n\tmesh::orders_t& PatchVOrders,\n\tmesh::indices_t& PatchUFirstKnots,\n\tmesh::indices_t& PatchVFirstKnots,\n\tmesh::selection_t& PatchSelections,\n\tmesh::materials_t& PatchMaterials,\n\tmesh::indices_t& PatchPoints,\n\tmesh::weights_t& PatchPointWeights,\n\tmesh::knots_t& PatchUKnots,\n\tmesh::knots_t& PatchVKnots,\n\tmesh::indices_t& PatchFirstTrimLoops,\n\tmesh::counts_t& PatchTrimLoopCounts,\n\tmesh::indices_t& TrimLoopFirstCurves,\n\tmesh::counts_t& TrimLoopCurveCounts,\n\tmesh::selection_t& TrimLoopSelections,\n\tmesh::indices_t& CurveFirstPoints,\n\tmesh::counts_t& CurvePointCounts,\n\tmesh::orders_t& CurveOrders,\n\tmesh::indices_t& CurveFirstKnots,\n\tmesh::selection_t& CurveSelections,\n\tmesh::indices_t& CurvePoints,\n\tmesh::weights_t& CurvePointWeights,\n\tmesh::knots_t& CurveKnots,\n\tmesh::points_2d_t& Points,\n\tmesh::selection_t& PointSelections,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& PatchAttributes,\n\tmesh::table_t& ParameterAttributes,\n\tmesh::table_t& VertexAttributes\n\t\t) :\n\tpatch_first_points(PatchFirstPoints),\n\tpatch_u_point_counts(PatchUPointCounts),\n\tpatch_v_point_counts(PatchVPointCounts),\n\tpatch_u_orders(PatchUOrders),\n\tpatch_v_orders(PatchVOrders),\n\tpatch_u_first_knots(PatchUFirstKnots),\n\tpatch_v_first_knots(PatchVFirstKnots),\n\tpatch_selections(PatchSelections),\n\tpatch_materials(PatchMaterials),\n\tpatch_points(PatchPoints),\n\tpatch_point_weights(PatchPointWeights),\n\tpatch_u_knots(PatchUKnots),\n\tpatch_v_knots(PatchVKnots),\n\tpatch_first_trim_loops(PatchFirstTrimLoops),\n\tpatch_trim_loop_counts(PatchTrimLoopCounts),\n\ttrim_loop_first_curves(TrimLoopFirstCurves),\n\ttrim_loop_curve_counts(TrimLoopCurveCounts),\n\ttrim_loop_selections(TrimLoopSelections),\n\tcurve_first_points(CurveFirstPoints),\n\tcurve_point_counts(CurvePointCounts),\n\tcurve_orders(CurveOrders),\n\tcurve_first_knots(CurveFirstKnots),\n\tcurve_selections(CurveSelections),\n\tcurve_points(CurvePoints),\n\tcurve_point_weights(CurvePointWeights),\n\tcurve_knots(CurveKnots),\n\tpoints(Points),\n\tpoint_selections(PointSelections),\n\tconstant_attributes(ConstantAttributes),\n\tpatch_attributes(PatchAttributes),\n\tparameter_attributes(ParameterAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"nurbs_patch\");\n\treturn create(generic_primitive);\n}\n\nprimitive* create(mesh::primitive& Primitive)\n{\n\treturn_val_if_fail(Primitive.type == \"nurbs_patch\", 0);\n\n\tprimitive* const result = new primitive(\n\t\tPrimitive.structure[\"patch\"].create<mesh::indices_t>(\"patch_first_points\"),\n\t\tPrimitive.structure[\"patch\"].create<mesh::counts_t>(\"patch_u_point_counts\"),\n\t\tPrimitive.structure[\"patch\"].create<mesh::counts_t>(\"patch_v_point_counts\"),\n\t\tPrimitive.structure[\"patch\"].create<mesh::orders_t>(\"patch_u_orders\"),\n\t\tPrimitive.structure[\"patch\"].create<mesh::orders_t>(\"patch_v_orders\"),\n\t\tPrimitive.structure[\"patch\"].create<mesh::indices_t>(\"patch_u_first_knots\"),\n\t\tPrimitive.structure[\"patch\"].create<mesh::indices_t>(\"patch_v_first_knots\"),\n\t\tPrimitive.structure[\"patch\"].create<mesh::selection_t>(\"patch_selections\"),\n\t\tPrimitive.structure[\"patch\"].create<mesh::materials_t>(\"patch_materials\"),\n\t\tPrimitive.structure[\"vertex\"].create<mesh::indices_t>(\"patch_points\"),\n\t\tPrimitive.structure[\"vertex\"].create<mesh::weights_t>(\"patch_point_weights\"),\n\t\tPrimitive.structure[\"u_knot\"].create<mesh::knots_t>(\"patch_u_knots\"),\n\t\tPrimitive.structure[\"v_knot\"].create<mesh::knots_t>(\"patch_v_knots\"),\n\t\tPrimitive.structure[\"patch\"].create<mesh::indices_t>(\"patch_first_trim_loops\"),\n\t\tPrimitive.structure[\"patch\"].create<mesh::counts_t>(\"patch_trim_loop_counts\"),\n\t\tPrimitive.structure[\"trim_loop\"].create<mesh::indices_t>(\"trim_loop_first_curves\"),\n\t\tPrimitive.structure[\"trim_loop\"].create<mesh::counts_t>(\"trim_loop_curve_counts\"),\n\t\tPrimitive.structure[\"trim_loop\"].create<mesh::selection_t>(\"trim_loop_selections\"),\n\t\tPrimitive.structure[\"trim_uniform\"].create<mesh::indices_t>(\"curve_first_points\"),\n\t\tPrimitive.structure[\"trim_uniform\"].create<mesh::counts_t>(\"curve_point_counts\"),\n\t\tPrimitive.structure[\"trim_uniform\"].create<mesh::orders_t>(\"curve_orders\"),\n\t\tPrimitive.structure[\"trim_uniform\"].create<mesh::indices_t>(\"curve_first_knots\"),\n\t\tPrimitive.structure[\"trim_uniform\"].create<mesh::selection_t>(\"curve_selections\"),\n\t\tPrimitive.structure[\"trim_vertex\"].create<mesh::indices_t>(\"curve_points\"),\n\t\tPrimitive.structure[\"trim_vertex\"].create<mesh::weights_t>(\"curve_point_weights\"),\n\t\tPrimitive.structure[\"trim_knot\"].create<mesh::knots_t>(\"curve_knots\"),\n\t\tPrimitive.structure[\"trim_point\"].create<mesh::points_2d_t>(\"points\"),\n\t\tPrimitive.structure[\"trim_point\"].create<mesh::selection_t>(\"point_selections\"),\n\t\tPrimitive.attributes[\"constant\"],\n\t\tPrimitive.attributes[\"patch\"],\n\t\tPrimitive.attributes[\"parameter\"],\n\t\tPrimitive.attributes[\"vertex\"]\n\t\t);\n\n\tresult->patch_selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\tresult->patch_points.set_metadata_value(metadata::key::domain(), metadata::value::point_indices_domain());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"nurbs_patch\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& patch_structure = require_structure(Primitive, \"patch\");\n\t\tconst mesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\t\tconst mesh::table_t& u_knot_structure = require_structure(Primitive, \"u_knot\");\n\t\tconst mesh::table_t& v_knot_structure = require_structure(Primitive, \"v_knot\");\n\t\tconst mesh::table_t& trim_loop_structure = require_structure(Primitive, \"trim_loop\");\n\t\tconst mesh::table_t& trim_uniform_structure = require_structure(Primitive, \"trim_uniform\");\n\t\tconst mesh::table_t& trim_vertex_structure = require_structure(Primitive, \"trim_vertex\");\n\t\tconst mesh::table_t& trim_knot_structure = require_structure(Primitive, \"trim_knot\");\n\t\tconst mesh::table_t& trim_point_structure = require_structure(Primitive, \"trim_point\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& patch_attributes = require_attributes(Primitive, \"patch\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tconst mesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tconst mesh::indices_t& patch_first_points = require_array<mesh::indices_t>(Primitive, patch_structure, \"patch_first_points\");\n\t\tconst mesh::counts_t& patch_u_point_counts = require_array<mesh::counts_t>(Primitive, patch_structure, \"patch_u_point_counts\");\n\t\tconst mesh::counts_t& patch_v_point_counts = require_array<mesh::counts_t>(Primitive, patch_structure, \"patch_v_point_counts\");\n\t\tconst mesh::orders_t& patch_u_orders = require_array<mesh::orders_t>(Primitive, patch_structure, \"patch_u_orders\");\n\t\tconst mesh::orders_t& patch_v_orders = require_array<mesh::orders_t>(Primitive, patch_structure, \"patch_v_orders\");\n\t\tconst mesh::indices_t& patch_u_first_knots = require_array<mesh::indices_t>(Primitive, patch_structure, \"patch_u_first_knots\");\n\t\tconst mesh::indices_t& patch_v_first_knots = require_array<mesh::indices_t>(Primitive, patch_structure, \"patch_v_first_knots\");\n\t\tconst mesh::selection_t& patch_selections = require_array<mesh::selection_t>(Primitive, patch_structure, \"patch_selections\");\n\t\tconst mesh::materials_t& patch_materials = require_array<mesh::materials_t>(Primitive, patch_structure, \"patch_materials\");\n\t\tconst mesh::indices_t& patch_points = require_array<mesh::indices_t>(Primitive, vertex_structure, \"patch_points\");\n\t\tconst mesh::weights_t& patch_point_weights = require_array<mesh::weights_t>(Primitive, vertex_structure, \"patch_point_weights\");\n\t\tconst mesh::knots_t& patch_u_knots = require_array<mesh::knots_t>(Primitive, u_knot_structure, \"patch_u_knots\");\n\t\tconst mesh::knots_t& patch_v_knots = require_array<mesh::knots_t>(Primitive, v_knot_structure, \"patch_v_knots\");\n\t\tconst mesh::indices_t& patch_first_trim_loops = require_array<mesh::indices_t>(Primitive, patch_structure, \"patch_first_trim_loops\");\n\t\tconst mesh::counts_t& patch_trim_loop_counts = require_array<mesh::counts_t>(Primitive, patch_structure, \"patch_trim_loop_counts\");\n\t\tconst mesh::indices_t& trim_loop_first_curves = require_array<mesh::indices_t>(Primitive, trim_loop_structure, \"trim_loop_first_curves\");\n\t\tconst mesh::counts_t& trim_loop_curve_counts = require_array<mesh::counts_t>(Primitive, trim_loop_structure, \"trim_loop_curve_counts\");\n\t\tconst mesh::selection_t& trim_loop_selections = require_array<mesh::selection_t>(Primitive, trim_loop_structure, \"trim_loop_selections\");\n\t\tconst mesh::indices_t& curve_first_points = require_array<mesh::indices_t>(Primitive, trim_uniform_structure, \"curve_first_points\");\n\t\tconst mesh::counts_t& curve_point_counts = require_array<mesh::counts_t>(Primitive, trim_uniform_structure, \"curve_point_counts\");\n\t\tconst mesh::orders_t& curve_orders = require_array<mesh::orders_t>(Primitive, trim_uniform_structure, \"curve_orders\");\n\t\tconst mesh::indices_t& curve_first_knots = require_array<mesh::indices_t>(Primitive, trim_uniform_structure, \"curve_first_knots\");\n\t\tconst mesh::selection_t& curve_selections = require_array<mesh::selection_t>(Primitive, trim_uniform_structure, \"curve_selections\");\n\t\tconst mesh::indices_t& curve_points = require_array<mesh::indices_t>(Primitive, trim_vertex_structure, \"curve_points\");\n\t\tconst mesh::weights_t& curve_point_weights = require_array<mesh::weights_t>(Primitive, trim_vertex_structure, \"curve_point_weights\");\n\t\tconst mesh::knots_t& curve_knots = require_array<mesh::knots_t>(Primitive, trim_knot_structure, \"curve_knots\");\n\t\tconst mesh::points_2d_t& points = require_array<mesh::points_2d_t>(Primitive, trim_point_structure, \"points\");\n\t\tconst mesh::selection_t& point_selections = require_array<mesh::selection_t>(Primitive, trim_point_structure, \"point_selections\");\n\n\t\trequire_metadata(Primitive, patch_selections, \"patch_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, patch_points, \"patch_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, u_knot_structure, \"u_knot\",\n\t\t\tstd::accumulate(patch_u_point_counts.begin(), patch_u_point_counts.end(), 0)\n\t\t\t+ std::accumulate(patch_u_orders.begin(), patch_u_orders.end(), 0));\n\t\trequire_table_row_count(Primitive, v_knot_structure, \"v_knot\",\n\t\t\tstd::accumulate(patch_v_point_counts.begin(), patch_v_point_counts.end(), 0)\n\t\t\t+ std::accumulate(patch_v_orders.begin(), patch_v_orders.end(), 0));\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", patch_structure.row_count() * 4);\n\n\treturn new const_primitive(\n\t\tpatch_first_points,\n\t\tpatch_u_point_counts,\n\t\tpatch_v_point_counts,\n\t\tpatch_u_orders,\n\t\tpatch_v_orders,\n\t\tpatch_u_first_knots,\n\t\tpatch_v_first_knots,\n\t\tpatch_selections,\n\t\tpatch_materials,\n\t\tpatch_points,\n\t\tpatch_point_weights,\n\t\tpatch_u_knots,\n\t\tpatch_v_knots,\n\t\tpatch_first_trim_loops,\n\t\tpatch_trim_loop_counts,\n\t\ttrim_loop_first_curves,\n\t\ttrim_loop_curve_counts,\n\t\ttrim_loop_selections,\n\t\tcurve_first_points,\n\t\tcurve_point_counts,\n\t\tcurve_orders,\n\t\tcurve_first_knots,\n\t\tcurve_selections,\n\t\tcurve_points,\n\t\tcurve_point_weights,\n\t\tcurve_knots,\n\t\tpoints,\n\t\tpoint_selections,\n\t\tconstant_attributes,\n\t\tpatch_attributes,\n\t\tparameter_attributes,\n\t\tvertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"nurbs_patch\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& patch_structure = require_structure(Primitive, \"patch\");\n\t\tmesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\t\tmesh::table_t& u_knot_structure = require_structure(Primitive, \"u_knot\");\n\t\tmesh::table_t& v_knot_structure = require_structure(Primitive, \"v_knot\");\n\t\tmesh::table_t& trim_loop_structure = require_structure(Primitive, \"trim_loop\");\n\t\tmesh::table_t& trim_uniform_structure = require_structure(Primitive, \"trim_uniform\");\n\t\tmesh::table_t& trim_vertex_structure = require_structure(Primitive, \"trim_vertex\");\n\t\tmesh::table_t& trim_knot_structure = require_structure(Primitive, \"trim_knot\");\n\t\tmesh::table_t& trim_point_structure = require_structure(Primitive, \"trim_point\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& patch_attributes = require_attributes(Primitive, \"patch\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\t\tmesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tmesh::indices_t& patch_first_points = require_array<mesh::indices_t>(Primitive, patch_structure, \"patch_first_points\");\n\t\tmesh::counts_t& patch_u_point_counts = require_array<mesh::counts_t>(Primitive, patch_structure, \"patch_u_point_counts\");\n\t\tmesh::counts_t& patch_v_point_counts = require_array<mesh::counts_t>(Primitive, patch_structure, \"patch_v_point_counts\");\n\t\tmesh::orders_t& patch_u_orders = require_array<mesh::orders_t>(Primitive, patch_structure, \"patch_u_orders\");\n\t\tmesh::orders_t& patch_v_orders = require_array<mesh::orders_t>(Primitive, patch_structure, \"patch_v_orders\");\n\t\tmesh::indices_t& patch_u_first_knots = require_array<mesh::indices_t>(Primitive, patch_structure, \"patch_u_first_knots\");\n\t\tmesh::indices_t& patch_v_first_knots = require_array<mesh::indices_t>(Primitive, patch_structure, \"patch_v_first_knots\");\n\t\tmesh::selection_t& patch_selections = require_array<mesh::selection_t>(Primitive, patch_structure, \"patch_selections\");\n\t\tmesh::materials_t& patch_materials = require_array<mesh::materials_t>(Primitive, patch_structure, \"patch_materials\");\n\t\tmesh::indices_t& patch_points = require_array<mesh::indices_t>(Primitive, vertex_structure, \"patch_points\");\n\t\tmesh::weights_t& patch_point_weights = require_array<mesh::weights_t>(Primitive, vertex_structure, \"patch_point_weights\");\n\t\tmesh::knots_t& patch_u_knots = require_array<mesh::knots_t>(Primitive, u_knot_structure, \"patch_u_knots\");\n\t\tmesh::knots_t& patch_v_knots = require_array<mesh::knots_t>(Primitive, v_knot_structure, \"patch_v_knots\");\n\t\tmesh::indices_t& patch_first_trim_loops = require_array<mesh::indices_t>(Primitive, patch_structure, \"patch_first_trim_loops\");\n\t\tmesh::counts_t& patch_trim_loop_counts = require_array<mesh::counts_t>(Primitive, patch_structure, \"patch_trim_loop_counts\");\n\t\tmesh::indices_t& trim_loop_first_curves = require_array<mesh::indices_t>(Primitive, trim_loop_structure, \"trim_loop_first_curves\");\n\t\tmesh::counts_t& trim_loop_curve_counts = require_array<mesh::counts_t>(Primitive, trim_loop_structure, \"trim_loop_curve_counts\");\n\t\tmesh::selection_t& trim_loop_selections = require_array<mesh::selection_t>(Primitive, trim_loop_structure, \"trim_loop_selections\");\n\t\tmesh::indices_t& curve_first_points = require_array<mesh::indices_t>(Primitive, trim_uniform_structure, \"curve_first_points\");\n\t\tmesh::counts_t& curve_point_counts = require_array<mesh::counts_t>(Primitive, trim_uniform_structure, \"curve_point_counts\");\n\t\tmesh::orders_t& curve_orders = require_array<mesh::orders_t>(Primitive, trim_uniform_structure, \"curve_orders\");\n\t\tmesh::indices_t& curve_first_knots = require_array<mesh::indices_t>(Primitive, trim_uniform_structure, \"curve_first_knots\");\n\t\tmesh::selection_t& curve_selections = require_array<mesh::selection_t>(Primitive, trim_uniform_structure, \"curve_selections\");\n\t\tmesh::indices_t& curve_points = require_array<mesh::indices_t>(Primitive, trim_vertex_structure, \"curve_points\");\n\t\tmesh::weights_t& curve_point_weights = require_array<mesh::weights_t>(Primitive, trim_vertex_structure, \"curve_point_weights\");\n\t\tmesh::knots_t& curve_knots = require_array<mesh::knots_t>(Primitive, trim_knot_structure, \"curve_knots\");\n\t\tmesh::points_2d_t& points = require_array<mesh::points_2d_t>(Primitive, trim_point_structure, \"points\");\n\t\tmesh::selection_t& point_selections = require_array<mesh::selection_t>(Primitive, trim_point_structure, \"point_selections\");\n\n\t\trequire_metadata(Primitive, patch_selections, \"patch_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, patch_points, \"patch_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, u_knot_structure, \"u_knot\",\n\t\t\tstd::accumulate(patch_u_point_counts.begin(), patch_u_point_counts.end(), 0)\n\t\t\t+ std::accumulate(patch_u_orders.begin(), patch_u_orders.end(), 0));\n\t\trequire_table_row_count(Primitive, v_knot_structure, \"v_knot\",\n\t\t\tstd::accumulate(patch_v_point_counts.begin(), patch_v_point_counts.end(), 0)\n\t\t\t+ std::accumulate(patch_v_orders.begin(), patch_v_orders.end(), 0));\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", patch_structure.row_count() * 4);\n\n\treturn new primitive(\n\t\tpatch_first_points,\n\t\tpatch_u_point_counts,\n\t\tpatch_v_point_counts,\n\t\tpatch_u_orders,\n\t\tpatch_v_orders,\n\t\tpatch_u_first_knots,\n\t\tpatch_v_first_knots,\n\t\tpatch_selections,\n\t\tpatch_materials,\n\t\tpatch_points,\n\t\tpatch_point_weights,\n\t\tpatch_u_knots,\n\t\tpatch_v_knots,\n\t\tpatch_first_trim_loops,\n\t\tpatch_trim_loop_counts,\n\t\ttrim_loop_first_curves,\n\t\ttrim_loop_curve_counts,\n\t\ttrim_loop_selections,\n\t\tcurve_first_points,\n\t\tcurve_point_counts,\n\t\tcurve_orders,\n\t\tcurve_first_knots,\n\t\tcurve_selections,\n\t\tcurve_points,\n\t\tcurve_point_weights,\n\t\tcurve_knots,\n\t\tpoints,\n\t\tpoint_selections,\n\t\tconstant_attributes,\n\t\tpatch_attributes,\n\t\tparameter_attributes,\n\t\tvertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"nurbs_patch\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace nurbs_patch\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/nurbs_patch.h",
    "content": "#ifndef K3DSDK_NURBS_PATCH_H\n#define K3DSDK_NURBS_PATCH_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace nurbs_patch\n{\n\n/// Gathers the member arrays of a nurbs_patch primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::indices_t& PatchFirstPoints,\n\t\tmesh::counts_t& PatchUPointCounts,\n\t\tmesh::counts_t& PatchVPointCounts,\n\t\tmesh::orders_t& PatchUOrders,\n\t\tmesh::orders_t& PatchVOrders,\n\t\tmesh::indices_t& PatchUFirstKnots,\n\t\tmesh::indices_t& PatchVFirstKnots,\n\t\tmesh::selection_t& PatchSelections,\n\t\tmesh::materials_t& PatchMaterials,\n\t\tmesh::indices_t& PatchPoints,\n\t\tmesh::weights_t& PatchPointWeights,\n\t\tmesh::knots_t& PatchUKnots,\n\t\tmesh::knots_t& PatchVKnots,\n\t\tmesh::indices_t& PatchFirstTrimLoops,\n\t\tmesh::counts_t& PatchTrimLoopCounts,\n\t\tmesh::indices_t& TrimLoopFirstCurves,\n\t\tmesh::counts_t& TrimLoopCurveCounts,\n\t\tmesh::selection_t& TrimLoopSelections,\n\t\tmesh::indices_t& CurveFirstPoints,\n\t\tmesh::counts_t& CurvePointCounts,\n\t\tmesh::orders_t& CurveOrders,\n\t\tmesh::indices_t& CurveFirstKnots,\n\t\tmesh::selection_t& CurveSelections,\n\t\tmesh::indices_t& CurvePoints,\n\t\tmesh::weights_t& CurvePointWeights,\n\t\tmesh::knots_t& CurveKnots,\n\t\tmesh::points_2d_t& Points,\n\t\tmesh::selection_t& PointSelections,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& PatchAttributes,\n\t\tmesh::table_t& ParameterAttributes,\n\t\tmesh::table_t& VertexAttributes\n\t\t);\n\n\tmesh::indices_t& patch_first_points;\n\tmesh::counts_t& patch_u_point_counts;\n\tmesh::counts_t& patch_v_point_counts;\n\tmesh::orders_t& patch_u_orders;\n\tmesh::orders_t& patch_v_orders;\n\tmesh::indices_t& patch_u_first_knots;\n\tmesh::indices_t& patch_v_first_knots;\n\tmesh::selection_t& patch_selections;\n\tmesh::materials_t& patch_materials;\n\tmesh::indices_t& patch_points;\n\tmesh::weights_t& patch_point_weights;\n\tmesh::knots_t& patch_u_knots;\n\tmesh::knots_t& patch_v_knots;\n\tmesh::indices_t& patch_first_trim_loops;\n\tmesh::counts_t& patch_trim_loop_counts;\n\tmesh::indices_t& trim_loop_first_curves;\n\tmesh::counts_t& trim_loop_curve_counts;\n\tmesh::selection_t& trim_loop_selections;\n\tmesh::indices_t& curve_first_points;\n\tmesh::counts_t& curve_point_counts;\n\tmesh::orders_t& curve_orders;\n\tmesh::indices_t& curve_first_knots;\n\tmesh::selection_t& curve_selections;\n\tmesh::indices_t& curve_points;\n\tmesh::weights_t& curve_point_weights;\n\tmesh::knots_t& curve_knots;\n\tmesh::points_2d_t& points;\n\tmesh::selection_t& point_selections;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& patch_attributes;\n\tmesh::table_t& parameter_attributes;\n\tmesh::table_t& vertex_attributes;\n};\n\n/// Gathers the member arrays of a nurbs_patch primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::indices_t& PatchFirstPoints,\n\t\tconst mesh::counts_t& PatchUPointCounts,\n\t\tconst mesh::counts_t& PatchVPointCounts,\n\t\tconst mesh::orders_t& PatchUOrders,\n\t\tconst mesh::orders_t& PatchVOrders,\n\t\tconst mesh::indices_t& PatchUFirstKnots,\n\t\tconst mesh::indices_t& PatchVFirstKnots,\n\t\tconst mesh::selection_t& PatchSelections,\n\t\tconst mesh::materials_t& PatchMaterials,\n\t\tconst mesh::indices_t& PatchPoints,\n\t\tconst mesh::weights_t& PatchPointWeights,\n\t\tconst mesh::knots_t& PatchUKnots,\n\t\tconst mesh::knots_t& PatchVKnots,\n\t\tconst mesh::indices_t& PatchFirstTrimLoops,\n\t\tconst mesh::counts_t& PatchTrimLoopCounts,\n\t\tconst mesh::indices_t& TrimLoopFirstCurves,\n\t\tconst mesh::counts_t& TrimLoopCurveCounts,\n\t\tconst mesh::selection_t& TrimLoopSelections,\n\t\tconst mesh::indices_t& CurveFirstPoints,\n\t\tconst mesh::counts_t& CurvePointCounts,\n\t\tconst mesh::orders_t& CurveOrders,\n\t\tconst mesh::indices_t& CurveFirstKnots,\n\t\tconst mesh::selection_t& CurveSelections,\n\t\tconst mesh::indices_t& CurvePoints,\n\t\tconst mesh::weights_t& CurvePointWeights,\n\t\tconst mesh::knots_t& CurveKnots,\n\t\tconst mesh::points_2d_t& Points,\n\t\tconst mesh::selection_t& PointSelections,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& PatchAttributes,\n\t\tconst mesh::table_t& ParameterAttributes,\n\t\tconst mesh::table_t& VertexAttributes\n\t\t);\n\n\tconst_primitive(primitive& Primitive);\n\n\tconst mesh::indices_t& patch_first_points;\n\tconst mesh::counts_t& patch_u_point_counts;\n\tconst mesh::counts_t& patch_v_point_counts;\n\tconst mesh::orders_t& patch_u_orders;\n\tconst mesh::orders_t& patch_v_orders;\n\tconst mesh::indices_t& patch_u_first_knots;\n\tconst mesh::indices_t& patch_v_first_knots;\n\tconst mesh::selection_t& patch_selections;\n\tconst mesh::materials_t& patch_materials;\n\tconst mesh::indices_t& patch_points;\n\tconst mesh::weights_t& patch_point_weights;\n\tconst mesh::knots_t& patch_u_knots;\n\tconst mesh::knots_t& patch_v_knots;\n\tconst mesh::indices_t& patch_first_trim_loops;\n\tconst mesh::counts_t& patch_trim_loop_counts;\n\tconst mesh::indices_t& trim_loop_first_curves;\n\tconst mesh::counts_t& trim_loop_curve_counts;\n\tconst mesh::selection_t& trim_loop_selections;\n\tconst mesh::indices_t& curve_first_points;\n\tconst mesh::counts_t& curve_point_counts;\n\tconst mesh::orders_t& curve_orders;\n\tconst mesh::indices_t& curve_first_knots;\n\tconst mesh::selection_t& curve_selections;\n\tconst mesh::indices_t& curve_points;\n\tconst mesh::weights_t& curve_point_weights;\n\tconst mesh::knots_t& curve_knots;\n\tconst mesh::points_2d_t& points;\n\tconst mesh::selection_t& point_selections;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& patch_attributes;\n\tconst mesh::table_t& parameter_attributes;\n\tconst mesh::table_t& vertex_attributes;\n};\n\n/// Creates a new nurbs_patch mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Creates a new nurbs_patch mesh primitive using the given primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh::primitive& Primitive);\n\n/// Tests the given mesh primitive to see if it is a valid nurbs_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid nurbs_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid nurbs_patch primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace nurbs_patch\n\n} // namespace k3d\n\n#endif // !K3DSDK_NURBS_PATCH_H\n\n"
  },
  {
    "path": "k3dsdk/options.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/fstream.h>\n#include <k3d-platform-config.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/options_policy.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/xml.h>\n\n#include <boost/lexical_cast.hpp>\n\n#include <iostream>\n\n#ifdef K3D_API_WIN32\n\n\t#define DEFAULT_BITMAP_VIEWER \"mspaint \\\"%1%\\\"\"\n\n#else // K3D_API_WIN32\n\n\t#define DEFAULT_BITMAP_VIEWER \"display \\\"%1%\\\"\"\n\n#endif // !K3D_API_WIN32\n\nnamespace k3d\n{\n\nnamespace options\n{\n\nnamespace detail\n{\n\nxml::element& version_element()\n{\n\treturn tree().safe_element(\"version\");\n}\n\nxml::element& paths_element()\n{\n\treturn tree().safe_element(\"paths\");\n}\n\nxml::element& path_element(const string_t PathType)\n{\n\tconst xml::element match(\"path\", xml::attribute(\"type\", PathType));\n\tconst xml::element prototype(\"path\", xml::attribute(\"type\", PathType));\n\treturn paths_element().safe_element(match, prototype);\n}\n\nxml::element& commands_element()\n{\n\treturn tree().safe_element(\"commands\");\n}\n\nxml::element& command_element(const string_t CommandType)\n{\n\tconst xml::element match(\"command\", xml::attribute(\"type\", CommandType));\n\tconst xml::element prototype(\"command\", xml::attribute(\"type\", CommandType));\n\treturn commands_element().safe_element(match, prototype);\n}\n\n} // namespace detail\n\n//////////////////////////////////////////////////////////////////////////////////////////\n// file_storage::implementation\n\nclass file_storage::implementation\n{\npublic:\n\timplementation(const filesystem::path& File) :\n\t\tm_file(File)\n\t{\n\t\ttry\n\t\t{\n\t\t\tlog() << info << \"Loading options from \" << m_file.native_console_string() << std::endl;\n\t\t\tfilesystem::ifstream stream(m_file);\n\t\t\tstream >> m_tree;\n\t\t\treturn;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tlog() << error << \"Exception loading options: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tlog() << error << \"Unknown exception loading options\" << std::endl;\n\t\t}\n\n\t\t// Create a new, empty tree ...\n\t\tm_tree = xml::element(\"k3dml\");\n\t}\n\n\t~implementation()\n\t{\n\t\tcommit();\n\t}\n\n\txml::element& tree()\n\t{\n\t\treturn m_tree;\n\t}\n\n\tvoid commit()\n\t{\n\t\ttry\n\t\t{\n\t\t\tlog() << info << \"Saving options to \" << m_file.native_console_string() << std::endl;\n\t\t\tfilesystem::ofstream stream(m_file);\n\t\t\tstream << xml::declaration() << m_tree;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tlog() << error << \"Exception saving options: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tlog() << error << \"Unknown exception saving options\" << std::endl;\n\t\t}\n\t}\n\nprivate:\n\tfilesystem::path m_file;\n\txml::element m_tree;\n};\n\n//////////////////////////////////////////////////////////////////////////////////////////\n// file_storage\n\nfile_storage::file_storage(const filesystem::path& File) :\n\tm_implementation(new implementation(File))\n{\n}\n\nfile_storage::~file_storage()\n{\n\tdelete m_implementation;\n}\n\nxml::element& file_storage::tree()\n{\n\treturn m_implementation->tree();\n}\n\nvoid file_storage::commit()\n{\n\tm_implementation->commit();\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////\n// set_storage\n\n/// Storage for global user options\nistorage* g_option_storage = 0;\n\nvoid set_storage(istorage& Storage)\n{\n\tg_option_storage = &Storage;\n\n\t// Defines the version of the data stored in the options tree ... incrementing it will force user options to be reset\n\tconst unsigned long current_version = 4;\n\tif(detail::version_element().text.empty() || (boost::lexical_cast<unsigned long>(detail::version_element().text) < current_version))\n\t{\n\t\tlog() << warning << \"Resetting options data to version \" << current_version << std::endl;\n\n\t\ttree().children.clear();\n\t\tdetail::version_element().text = k3d::string_cast(current_version);\n\t}\n\n\t// Default external paths\n\tif(detail::path_element(path::render_farm()).text.empty())\n\t\tdetail::path_element(path::render_farm()).text = system::get_temp_directory().native_utf8_string().raw();\n\tif(detail::path_element(path::scripts()).text.empty())\n\t\tdetail::path_element(path::scripts()).text = (share_path() / filesystem::generic_path(\"scripts\")).native_utf8_string().raw();\n\tif(detail::path_element(path::documents()).text.empty())\n\t\tdetail::path_element(path::documents()).text = system::get_home_directory().native_utf8_string().raw();\n\tif(detail::path_element(path::bitmaps()).text.empty())\n\t\tdetail::path_element(path::bitmaps()).text = system::get_home_directory().native_utf8_string().raw();\n\tif(detail::path_element(path::tutorials()).text.empty())\n\t\tdetail::path_element(path::tutorials()).text = system::get_home_directory().native_utf8_string().raw();\n\tif(detail::path_element(path::render_frame()).text.empty())\n\t\tdetail::path_element(path::render_frame()).text = system::get_home_directory().native_utf8_string().raw();\n\tif(detail::path_element(path::render_animation()).text.empty())\n\t\tdetail::path_element(path::render_animation()).text = system::get_home_directory().native_utf8_string().raw();\n\tif(detail::path_element(path::displacement_shaders()).text.empty())\n\t\tdetail::path_element(path::displacement_shaders()).text = (share_path() / filesystem::generic_path(\"shaders/displacement\")).native_utf8_string().raw();\n\tif(detail::path_element(path::imager_shaders()).text.empty())\n\t\tdetail::path_element(path::imager_shaders()).text = (share_path() / filesystem::generic_path(\"shaders/imager\")).native_utf8_string().raw();\n\tif(detail::path_element(path::light_shaders()).text.empty())\n\t\tdetail::path_element(path::light_shaders()).text = (share_path() / filesystem::generic_path(\"shaders/light\")).native_utf8_string().raw();\n\tif(detail::path_element(path::surface_shaders()).text.empty())\n\t\tdetail::path_element(path::surface_shaders()).text = (share_path() / filesystem::generic_path(\"shaders/surface\")).native_utf8_string().raw();\n\tif(detail::path_element(path::transformation_shaders()).text.empty())\n\t\tdetail::path_element(path::transformation_shaders()).text = (share_path() / filesystem::generic_path(\"shaders/transformation\")).native_utf8_string().raw();\n\tif(detail::path_element(path::volume_shaders()).text.empty())\n\t\tdetail::path_element(path::volume_shaders()).text = (share_path() / filesystem::generic_path(\"shaders/volume\")).native_utf8_string().raw();\n\n\t// Default external commands\n\tif(get_command(command::bitmap_viewer()).empty())\n\t\tset_command(command::bitmap_viewer(), DEFAULT_BITMAP_VIEWER);\n}\n\nconst filesystem::path get_path(const string_t& PathType)\n{\n\treturn filesystem::native_path(ustring::from_utf8(detail::path_element(PathType).text));\n}\n\nvoid set_path(const string_t& PathType, const filesystem::path& Path)\n{\n\tdetail::path_element(PathType).text = Path.native_utf8_string().raw();\n}\n\nconst string_t get_command(const string_t& CommandType)\n{\n\treturn detail::command_element(CommandType).text;\n}\n\nvoid set_command(const string_t& CommandType, const string_t& Command)\n{\n\tdetail::command_element(CommandType).text = Command;\n}\n\nxml::element& tree()\n{\n\t// If this fires, you forgot to call set_storage() at program startup!!!\n\tassert(g_option_storage);\n\treturn g_option_storage->tree();\n}\n\nvoid commit()\n{\n\t// If this fires, you forgot to call set_storage() at program startup!!!\n\tassert(g_option_storage);\n\tg_option_storage->commit();\n}\n\n} // namespace options\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/options.h",
    "content": "#ifndef K3DSDK_OPTIONS_H\n#define K3DSDK_OPTIONS_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\nnamespace xml { class element; }\n\nnamespace options\n{\n\n/// Returns the default file path for the given data type (e.g. bitmap, document, script, etc)\nconst filesystem::path get_path(const string_t& PathType);\n/// Sets the default file path for the given data type (e.g. bitmap, document, script, etc)\nvoid set_path(const string_t& PathType, const filesystem::path& Path);\n\n/// Predefined path types for use with get_path() and set_path()\nnamespace path\n{\n\ninline const string_t render_farm() { return \"render_farm\"; }\ninline const string_t scripts() { return \"scripts\"; }\ninline const string_t documents() { return \"documents\"; }\ninline const string_t bitmaps() { return \"bitmaps\"; }\ninline const string_t tutorials() { return \"tutorials\"; }\ninline const string_t test_cases() { return \"test_cases\"; }\ninline const string_t render_frame() { return \"render_frame\"; }\ninline const string_t render_animation() { return \"render_animation\"; }\ninline const string_t fonts() { return \"fonts\"; }\ninline const string_t displacement_shaders() { return \"displacement_shaders\"; }\ninline const string_t imager_shaders() { return \"imager_shaders\"; }\ninline const string_t light_shaders() { return \"light_shaders\"; }\ninline const string_t surface_shaders() { return \"surface_shaders\"; }\ninline const string_t transformation_shaders() { return \"transformation_shaders\"; }\ninline const string_t volume_shaders() { return \"volume_shaders\"; }\n\n} // namespace path\n\n/// Returns the external command-line for the given action (e.g. bitmap, document, script, etc)\nconst string_t get_command(const string_t& CommandType);\n/// Sets the default file path for the given data type (e.g. bitmap, document, script, etc)\nvoid set_command(const string_t& CommandType, const string_t& Command);\n\n/// Predefined command types for use with get_command() and set_command()\nnamespace command\n{\n\ninline const string_t bitmap_viewer() { return \"bitmap_viewer\"; }\n\n} // namespace command\n\n/// Returns the hierarchical tree of user options (so you can store your own data)\nxml::element& tree();\n/// Stores any modifications to the tree to persistent storage\nvoid commit();\n\n} // namespace options\n\n} // namespace k3d\n\n#endif // !K3DSDK_OPTIONS_H\n\n"
  },
  {
    "path": "k3dsdk/options_policy.h",
    "content": "#ifndef K3DSDK_OPTIONS_POLICY_H\n#define K3DSDK_OPTIONS_POLICY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares k3d::istorage, an abstract interface for global user option storage (could be a file, could be gconf, could be the Windoze registry, etc)\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\n// Forward declarations\nnamespace xml { class element; }\n\nnamespace options\n{\n\n/// Abstract interface for global user option storage\nclass istorage :\n\tpublic virtual iunknown\n{\npublic:\n\t/// Returns the stored user option data\n\tvirtual xml::element& tree() = 0;\n\t/// Commits any modifications to the stored user option data to persistent storage\n\tvirtual void commit() = 0;\n\nprotected:\n\tistorage() {}\n\tistorage(const istorage&) {}\n\tistorage& operator = (const istorage&) { return *this; }\n\tvirtual ~istorage() {}\n};\n\n/// Trivial implementation of k3d::istorage that serializes data to an XML file\nclass file_storage :\n\tpublic istorage\n{\npublic:\n\tfile_storage(const filesystem::path& File);\n\t~file_storage();\n\n\txml::element& tree();\n\tvoid commit();\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n/// Sets the istorage implementation to be used for storing user options ... this must be called once at startup before any other sdk calls are made\nvoid set_storage(istorage& OptionStorage);\n\n} // namespace options\n\n} // namespace k3d\n\n#endif // !K3DSDK_OPTIONS_POLICY_H\n\n"
  },
  {
    "path": "k3dsdk/os_load_module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/os_load_module.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n\nnamespace k3d\n{\n\n//////////////////////////////////////////////////////////////////////////////\n// os_load_module\n\n#if defined K3D_API_WIN32\n\n\t#include <k3dsdk/win32.h>\n\n\tvoid os_load_module(const filesystem::path& FilePath, register_plugins_entry_point& RegisterPlugins)\n\t{\n\t\tconst UINT old_error_mode = SetErrorMode(SetErrorMode(SEM_FAILCRITICALERRORS)); // Disable error dialogs when loading DLLs\n\t\tHINSTANCE module = LoadLibrary(FilePath.native_filesystem_string().c_str());\n\t\tSetErrorMode(old_error_mode);\n\n\t\tif(!module)\n\t\t{\n\t\t\tlog() << error << \"Module [\" << FilePath.native_console_string() << \"] could not be loaded: error \" << GetLastError() << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tRegisterPlugins = register_plugins_entry_point(GetProcAddress(module, \"register_k3d_plugins\"));\n\t\tif(!RegisterPlugins)\n\t\t\tRegisterPlugins = register_plugins_entry_point(GetProcAddress(module, \"_register_k3d_plugins\"));\n\t\tif(!RegisterPlugins)\n\t\t{\n\t\t\tlog() << error << \"Module \" << FilePath.leaf().raw() << \" does not contain required register_k3d_plugins() entry point\" << std::endl;\n\t\t\treturn;\n\t\t}\n\t}\n\n#else // !K3D_API_WIN32\n\n\t#include <dlfcn.h>\n\n\tvoid os_load_module(const filesystem::path& FilePath, register_plugins_entry_point& RegisterPlugins)\n\t{\n\t\tvoid* module = dlopen(FilePath.native_filesystem_string().c_str(), RTLD_GLOBAL | RTLD_LAZY);\n\t\tif(!module)\n\t\t{\n\t\t\tlog() << error << \"Module \" << FilePath.leaf().raw() << \": \" << dlerror() << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tRegisterPlugins = register_plugins_entry_point(dlsym(module, \"register_k3d_plugins\"));\n\t\tif(!RegisterPlugins)\n\t\t{\n\t\t\tlog() << error << \"Module \" << FilePath.leaf().raw() << \" does not contain required register_k3d_plugins() entry point\" << std::endl;\n\t\t\treturn;\n\t\t}\n\t}\n\n#endif // !K3D_API_WIN32\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/os_load_module.h",
    "content": "#ifndef K3DSDK_OS_LOAD_MODULE_H\n#define K3DSDK_OS_LOAD_MODULE_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\n\n//////////////////////////////////////////////////////////////////////////////\n// os_load_module\n\n/// Handles the platform-specific details of loading a module\nvoid os_load_module(const filesystem::path& FilePath, register_plugins_entry_point& RegisterPlugins);\n\n} // namespace k3d\n\n#endif // !K3DSDK_OS_LOAD_MODULE_H\n\n"
  },
  {
    "path": "k3dsdk/painter_render_state_gl.h",
    "content": "#ifndef K3DSDK_PAINTER_RENDER_STATE_GL_H\n#define K3DSDK_PAINTER_RENDER_STATE_GL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/render_state_gl.h>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\n/// Used to pass rendering state from a node to a mesh painter\nclass painter_render_state :\n\tpublic render_state\n{\npublic:\n\tpainter_render_state(const render_state& State, const matrix4& Matrix, const bool ShowComponentSelection) :\n\t\trender_state(State),\n\t\tmatrix(Matrix),\n\t\tinside_out(k3d::inside_out(Matrix)),\n\t\tshow_component_selection(ShowComponentSelection)\n\t{\n\t}\n\n\t/// Stores the complete world-to-object transform matrix for the mesh to be rendered\n\tmatrix4 matrix;\n\t/// Set to true if the mesh transform matrix will turn it inside-out\n\tbool inside_out;\n\t/// Set to true if painters should highlight selected gprims\n\tbool show_component_selection;\n};\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_PAINTER_RENDER_STATE_GL_H\n\n"
  },
  {
    "path": "k3dsdk/painter_selection_state_gl.h",
    "content": "#ifndef K3DSDK_PAINTER_SELECTION_STATE_GL_H\n#define K3DSDK_PAINTER_SELECTION_STATE_GL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/selection_state_gl.h>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\n/// Used to pass selection state from a node to a mesh painter\nclass painter_selection_state :\n\tpublic selection_state\n{\npublic:\n\tpainter_selection_state(const selection_state& State) :\n\t\tselection_state(State)\n\t{\n\t}\n};\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_PAINTER_SELECTION_STATE_GL_H\n\n"
  },
  {
    "path": "k3dsdk/paraboloid.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/paraboloid.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n\nnamespace k3d\n{\n\nnamespace paraboloid\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::matrices_t& Matrices,\n\tconst mesh::materials_t& Materials,\n\tconst mesh::doubles_t& Radii,\n\tconst mesh::doubles_t& ZMin,\n\tconst mesh::doubles_t& ZMax,\n\tconst mesh::doubles_t& SweepAngles,\n\tconst mesh::selection_t& Selections,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& SurfaceAttributes,\n\tconst mesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tradii(Radii),\n\tz_min(ZMin),\n\tz_max(ZMax),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::matrices_t& Matrices,\n\tmesh::materials_t& Materials,\n\tmesh::doubles_t& Radii,\n\tmesh::doubles_t& ZMin,\n\tmesh::doubles_t& ZMax,\n\tmesh::doubles_t& SweepAngles,\n\tmesh::selection_t& Selections,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& SurfaceAttributes,\n\tmesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tradii(Radii),\n\tz_min(ZMin),\n\tz_max(ZMax),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"paraboloid\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::matrices_t >(\"matrices\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::materials_t >(\"materials\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"radii\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"z_min\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"z_max\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"sweep_angles\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::selection_t>(\"selections\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"surface\"],\n\t\tgeneric_primitive.attributes[\"parameter\"]\n\t\t);\n\n\tresult->selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"paraboloid\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tconst mesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tconst mesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tconst mesh::doubles_t& radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"radii\");\n\t\tconst mesh::doubles_t& z_min = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_min\");\n\t\tconst mesh::doubles_t& z_max = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_max\");\n\t\tconst mesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tconst mesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new const_primitive(matrices, materials, radii, z_min, z_max, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\t\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"paraboloid\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tmesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tmesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tmesh::doubles_t& radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"radii\");\n\t\tmesh::doubles_t& z_min = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_min\");\n\t\tmesh::doubles_t& z_max = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_max\");\n\t\tmesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tmesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new primitive(matrices, materials, radii, z_min, z_max, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\t\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"paraboloid\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace paraboloid\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/paraboloid.h",
    "content": "#ifndef K3DSDK_PARABOLOID_H\n#define K3DSDK_PARABOLOID_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace paraboloid\n{\n\n/// Gathers the member arrays of a paraboloid primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::matrices_t& Matrices,\n\t\tconst mesh::materials_t& Materials,\n\t\tconst mesh::doubles_t& Radii,\n\t\tconst mesh::doubles_t& ZMin,\n\t\tconst mesh::doubles_t& ZMax,\n\t\tconst mesh::doubles_t& SweepAngles,\n\t\tconst mesh::selection_t& Selections,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& SurfaceAttributes,\n\t\tconst mesh::table_t& ParameterAttributes);\n\n\tconst mesh::matrices_t& matrices;\n\tconst mesh::materials_t& materials;\n\tconst mesh::doubles_t& radii;\n\tconst mesh::doubles_t& z_min;\n\tconst mesh::doubles_t& z_max;\n\tconst mesh::doubles_t& sweep_angles;\n\tconst mesh::selection_t& selections;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& surface_attributes;\n\tconst mesh::table_t& parameter_attributes;\n};\n\n/// Gathers the member arrays of a paraboloid primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::matrices_t& Matrices,\n\t\tmesh::materials_t& Materials,\n\t\tmesh::doubles_t& Radii,\n\t\tmesh::doubles_t& ZMin,\n\t\tmesh::doubles_t& ZMax,\n\t\tmesh::doubles_t& SweepAngles,\n\t\tmesh::selection_t& Selections,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& SurfaceAttributes,\n\t\tmesh::table_t& ParameterAttributes);\n\n\tmesh::matrices_t& matrices;\n\tmesh::materials_t& materials;\n\tmesh::doubles_t& radii;\n\tmesh::doubles_t& z_min;\n\tmesh::doubles_t& z_max;\n\tmesh::doubles_t& sweep_angles;\n\tmesh::selection_t& selections;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& surface_attributes;\n\tmesh::table_t& parameter_attributes;\n};\n\n/// Creates a new paraboloid mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid paraboloid primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid paraboloid primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid paraboloid primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace paraboloid\n\n} // namespace k3d\n\n#endif // !K3DSDK_PARABOLOID_H\n\n"
  },
  {
    "path": "k3dsdk/parallel/CMakeLists.txt",
    "content": "PROJECT(k3dsdk-parallel)\n\nFILE(GLOB HEADERS *.h)\nFILE(GLOB SOURCES *.cpp)\n\nLIST(SORT HEADERS)\nLIST(SORT SOURCES)\n\nK3D_ADD_LIBRARY(k3dsdk-parallel SHARED ${HEADERS} ${SOURCES})\nK3D_GENERATE_DEF_FILE(k3dsdk-parallel)\n\nIF(K3D_ENABLE_PARALLEL)\n\tINCLUDE_DIRECTORIES(${K3D_TBB_INCLUDE_DIR})\n\tTARGET_LINK_LIBRARIES(k3dsdk-parallel ${K3D_TBB_LIBRARY})\nENDIF(K3D_ENABLE_PARALLEL)\n\nINSTALL(TARGETS k3dsdk-parallel\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\nINSTALL(FILES ${HEADERS} DESTINATION include/k3d/k3dsdk/parallel)\n\n"
  },
  {
    "path": "k3dsdk/parallel/blocked_range.h",
    "content": "#ifndef K3DSDK_PARALLEL_BLOCKED_RANGE_H\n#define K3DSDK_PARALLEL_BLOCKED_RANGE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-parallel-config.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace parallel\n{\n\ntemplate<typename ValueT>\nclass blocked_range\n{\npublic:\n\t//! Type of a value\n\t/** Called a const_iterator for sake of algorithms that need to treat a blocked_range\n\tas an STL container. */\n\ttypedef ValueT const_iterator;\n\n\t//! Type for size of a range\n\ttypedef uint_t size_type;\n\n\t//! Construct range with default-constructed values for begin and end.\n\t/** Requires that Value have a default constructor. */\n\tblocked_range() :\n\t\tm_begin(),\n\t\tm_end()\n\t{\n\t}\n\n\t//! Construct range over half-open interval [begin,end), with the given grainsize.\n\tblocked_range(ValueT Begin, ValueT End, size_type Grainsize = 1) : \n\t\tm_end(End),\n\t\tm_begin(Begin),\n\t\tm_grainsize(Grainsize) \n\t{\n//\t\t__TBB_ASSERT( m_grainsize>0, \"grainsize must be positive\" );\n\t}\n\n\t//! Beginning of range.\n\tconst_iterator begin() const\n\t{\n\t\treturn m_begin;\n\t}\n\n\t//! One past last value in range.\n\tconst_iterator end() const\n\t{\n\t\treturn m_end;\n\t}\n\n\t//! Size of the range\n\t/** Unspecified if end()<begin(). */\n\tsize_type size() const\n\t{\n//\t\t__TBB_ASSERT( !(end() < begin()), \"size() unspecified if end()<begin()\" );\n\t\treturn size_type(m_end - m_begin);\n\t}\n\n\t//! The grain size for this range.\n\tsize_type grainsize() const\n\t{\n\t\treturn m_grainsize;\n\t}\n\n\t//------------------------------------------------------------------------\n\t// Methods that implement Range concept\n\t//------------------------------------------------------------------------\n\n\t//! True if range is empty.\n\tbool empty() const\n\t{\n\t\treturn !(m_begin < m_end);\n\t}\n\n\t//! True if range is divisible.\n\t/** Unspecified if end()<begin(). */\n\tbool is_divisible() const\n\t{\n\t\treturn m_grainsize < size();\n\t}\n\n\t//! Split range.  \n\t/** The new Range *this has the second half, the old range r has the first half. \n\tUnspecified if end()<begin() or !is_divisible(). */\n\ttemplate<typename SplitT>\n\tblocked_range(blocked_range& r, SplitT split) : \n\t\tm_end(r.m_end),\n\t\tm_begin(do_split(r)),\n\t\tm_grainsize(r.m_grainsize)\n\t{\n\t}\n\nprivate:\n\t/** NOTE: m_end MUST be declared before m_begin, otherwise the forking constructor will break. */\n\tValueT m_end;\n\tValueT m_begin;\n\tsize_type m_grainsize;\n\n\t//! Auxilary function used by forking constructor.\n\t/** Using this function lets us not require that Value support assignment or default construction. */\n\tstatic ValueT do_split(blocked_range& r)\n\t{\n//\t\t__TBB_ASSERT( r.is_divisible(), \"cannot split blocked_range that is not divisible\" );\n\t\tValueT middle = r.m_begin + (r.m_end - r.m_begin) / 2u;\n\t\tr.m_end = middle;\n\t\treturn middle;\n\t}\n};\n\n} // namespace parallel\n\n} // namespace k3d\n\n#endif // !K3DSDK_PARALLEL_BLOCKED_RANGE_H\n\n"
  },
  {
    "path": "k3dsdk/parallel/parallel_for.h",
    "content": "#ifndef K3DSDK_PARALLEL_PARALLEL_FOR_H\n#define K3DSDK_PARALLEL_PARALLEL_FOR_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-parallel-config.h>\n\n#ifdef K3D_ENABLE_PARALLEL\n#include <tbb/parallel_for.h>\n#endif // K3D_ENABLE_PARALLEL\n\nnamespace k3d\n{\n\nnamespace parallel\n{\n\ntemplate<typename RangeT, typename BodyT>\nvoid parallel_for(const RangeT& Range, const BodyT& Body);\n\n#ifdef K3D_ENABLE_PARALLEL\n\ntemplate<typename RangeT, typename BodyT>\nvoid parallel_for(const RangeT& Range, const BodyT& Body)\n{\n\t::tbb::parallel_for(Range, Body);\n}\n\n#else // K3D_ENABLE_PARALLEL\n\ntemplate<typename RangeT, typename BodyT>\nvoid parallel_for(const RangeT& Range, const BodyT& Body)\n{\n\tBody(Range);\n}\n\n#endif // !K3D_ENABLE_PARALLEL\n\n} // namespace parallel\n\n} // namespace k3d\n\n#endif // !K3DSDK_PARALLEL_PARALLEL_FOR_H\n\n"
  },
  {
    "path": "k3dsdk/parallel/threads.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-parallel-config.h>\n#include <k3dsdk/parallel/threads.h>\n\n#ifdef K3D_ENABLE_PARALLEL\n#include <tbb/task_scheduler_init.h>\n#endif // K3D_ENABLE_PARALLEL\n\nnamespace k3d\n{\n\nnamespace parallel\n{\n\nstatic uint_t g_grain_size = 10000; \n\n#ifdef K3D_ENABLE_PARALLEL\n\nvoid set_thread_count(const int32_t Count)\n{\n\tstatic ::tbb::task_scheduler_init scheduler(::tbb::task_scheduler_init::automatic);\n\n\tscheduler.terminate();\n\tif(Count == automatic)\n\t\tscheduler.initialize(::tbb::task_scheduler_init::automatic);\n\telse\n\t\tscheduler.initialize(Count);\n}\n\n#else // K3D_ENABLE_PARALLEL\n\nvoid set_thread_count(const int32_t)\n{\n}\n\n#endif // !K3D_ENABLE_PARALLEL\n\nvoid set_grain_size(const uint_t GrainSize)\n{\n\tg_grain_size = GrainSize;\n}\n\nuint_t grain_size()\n{\n\treturn g_grain_size;\n}\n\n} // namespace parallel\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/parallel/threads.h",
    "content": "#ifndef K3DSDK_PARALLEL_THREADS_H\n#define K3DSDK_PARALLEL_THREADS_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace parallel\n{\n\nenum\n{\n\t/// Set the number of threads to be used for parallel operations automatically (e.g: based on the number of hardware threads)\n\tautomatic = -1\n};\n\n/// Set the number of threads to be used for parallel operations\nvoid set_thread_count(const int32_t Count);\n/// Set the preferred grainsize to be used for parallel operations\nvoid set_grain_size(const uint_t GrainSize);\n/// Get the preferred grainsize to be used for parallel operations\nuint_t grain_size();\n\n} // namespace parallel\n\n} // namespace k3d\n\n#endif // !K3DSDK_PARALLEL_THREADS_H\n\n"
  },
  {
    "path": "k3dsdk/parentable.h",
    "content": "#ifndef K3DSDK_PARENTABLE_H\n#define K3DSDK_PARENTABLE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/iparentable.h>\n\nnamespace k3d\n{\n\nclass idocument;\nclass iplugin_factory;\n\t\n/// Provides a boilerplate implementation of an object that can be parented to another\ntemplate<typename base_t>\nclass parentable :\n\tpublic base_t,\n\tpublic iparentable\n{\npublic:\n\tparentable(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_parent(init_owner(*this) + init_name(\"parent\") + init_label(_(\"Parent\")) + init_description(_(\"Parent\")) + init_value<inode*>(0))\n\t{\n\t}\n\n\tiproperty& parent()\n\t{\n\t\treturn m_parent;\n\t}\n\nprivate:\n\tk3d_data(inode*, data::immutable_name, data::change_signal, data::with_undo, data::node_storage, data::no_constraint, data::node_property, data::node_serialization) m_parent;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_PARENTABLE_H\n\n"
  },
  {
    "path": "k3dsdk/particle.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/particle.h>\n#include <k3dsdk/primitive_validation.h>\n\n#include <numeric>\n\nnamespace k3d\n{\n\nnamespace particle\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst typed_array<imaterial*>& Material,\n\tconst uint_t_array& Points,\n\tconst table& ConstantAttributes,\n\tconst table& VertexAttributes\n\t\t) :\n\tmaterial(Material),\n\tpoints(Points),\n\tconstant_attributes(ConstantAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\ttyped_array<imaterial*>& Material,\n\tuint_t_array& Points,\n\ttable& ConstantAttributes,\n\ttable& VertexAttributes\n\t\t) :\n\tmaterial(Material),\n\tpoints(Points),\n\tconstant_attributes(ConstantAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"particle\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"constant\"].create<typed_array<imaterial*> >(\"material\"),\n\t\tgeneric_primitive.structure[\"vertex\"].create<uint_t_array >(\"points\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"vertex\"]\n\t\t);\n\n\tresult->points.set_metadata_value(metadata::key::domain(), metadata::value::point_indices_domain());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"particle\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst table& constant_structure = require_structure(Primitive, \"constant\");\n\t\tconst table& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\tconst typed_array<imaterial*>& material = require_array<typed_array<imaterial*> >(Primitive, constant_structure, \"material\");\n\t\tconst uint_t_array& points = require_array<uint_t_array >(Primitive, vertex_structure, \"points\");\n\n\t\tconst table& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst table& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\trequire_metadata(Primitive, points, \"points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_attributes, \"vertex\", vertex_structure.row_count());\n\n\t\treturn new const_primitive(material, points, constant_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"particle\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\ttable& constant_structure = require_structure(Primitive, \"constant\");\n\t\ttable& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\ttyped_array<imaterial*>& material = require_array<typed_array<imaterial*> >(Primitive, constant_structure, \"material\");\n\t\tuint_t_array& points = require_array<uint_t_array >(Primitive, vertex_structure, \"points\");\n\n\t\ttable& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\ttable& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\trequire_metadata(Primitive, points, \"points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\n\t\trequire_table_row_count(Primitive, vertex_attributes, \"vertex\", vertex_structure.row_count());\n\n\t\treturn new primitive(material, points, constant_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"particle\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace particle\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/particle.h",
    "content": "#ifndef K3DSDK_PARTICLE_H\n#define K3DSDK_PARTICLE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace particle\n{\n\n/// Gathers the member arrays of a particle primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst typed_array<imaterial*>& Material,\n\t\tconst uint_t_array& Points,\n\t\tconst table& ConstantAttributes,\n\t\tconst table& VertexAttributes\n\t\t);\n\n\tconst typed_array<imaterial*>& material;\n\tconst uint_t_array& points;\n\tconst table& constant_attributes;\n\tconst table& vertex_attributes;\n};\n\n/// Gathers the member arrays of a particle primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\ttyped_array<imaterial*>& Material,\n\t\tuint_t_array& Points,\n\t\ttable& ConstantAttributes,\n\t\ttable& VertexAttributes\n\t\t);\n\n\ttyped_array<imaterial*>& material;\n\tuint_t_array& points;\n\ttable& constant_attributes;\n\ttable& vertex_attributes;\n};\n\n/// Creates a new particle mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid particle primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid particle primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid particle primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace particle\n\n} // namespace k3d\n\n#endif // !K3DSDK_PARTICLE_H\n\n"
  },
  {
    "path": "k3dsdk/path.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n// This code leans heavily on boost::filesystem::path, most changes are to support ustring UTF-8 storage\n\n#include <k3dsdk/path.h>\n#include <k3d-platform-config.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/system.h>\n\n#include <cstdio>\n\n#include <glibmm/convert.h>\n\n#ifdef K3D_API_WIN32\n\n\t#include <k3dsdk/win32.h>\n\n#else // K3D_API_WIN32\n\n\t#include <sys/stat.h>\n\t#include <sys/types.h>\n\t#include <dirent.h>\n\t#include <fcntl.h>\n\t#include <unistd.h>\n\n#endif // !K3D_API_WIN32\n\n#include <boost/scoped_array.hpp>\n\nnamespace k3d\n{\n\nnamespace filesystem\n{\n\nnamespace detail\n{\n\n// Define some platform-specific odds-and-ends\n#ifdef K3D_API_WIN32\n\nconst char NATIVE_SEARCHPATH_SEPARATOR = ';';\nconst char NATIVE_PATH_SEPARATOR = '\\\\';\n\n#else // K3D_API_WIN32\n\nconst char NATIVE_SEARCHPATH_SEPARATOR = ':';\nconst char NATIVE_PATH_SEPARATOR = '/';\n\n#endif // !K3D_API_WIN32\n\nconst char GENERIC_PATH_SEPARATOR = '/';\n\n// end_pos is past-the-end position\n// return 0 if str itself is leaf (or empty)\nustring::size_type leaf_pos( const ustring& str, ustring::size_type end_pos )\n{\n\tif ( end_pos && str[end_pos-1] == '/' ) return end_pos-1;\n\n\tustring::size_type pos( str.find_last_of( '/', end_pos-1 ) );\n\tif ( pos == ustring::npos ) pos = str.find_last_of( ':', end_pos-2 );\n\n\treturn ( pos == ustring::npos // path itself must be a leaf (or empty)\n\t         || (pos == 1 && str[0] == '/') // or share\n\t       ) ? 0 // so leaf is entire string\n\t       : pos + 1; // or starts after delimiter\n}\n\nbool_t is_absolute_root(const ustring& s, ustring::size_type len)\n{\n\treturn\n\t    len && s[len-1] == '/'\n\t    &&\n\t    (\n\t        len == 1 // \"/\"\n\t        || ( len > 1\n\t             && ( s[len-2] == ':' // drive or device\n\t                  || ( s[0] == '/'   // share\n\t                       && s[1] == '/'\n\t                       && s.find( '/', 2 ) == len-1\n\t                     )\n\t                )\n\t           )\n\t    );\n}\n\n} // namespace detail\n\n//////////////////////////////////////////////////////////////////////////////////\n// path::iterator::implementation\n\nclass path::iterator::implementation\n{\npublic:\n\timplementation() :\n\t\tstorage(0),\n\t\tindex(0)\n\t{\n\t}\n\n\timplementation(const ustring& Storage) :\n\t\tstorage(&Storage),\n\t\tindex(0)\n\t{\n\t\tif(Storage.size() > 2 && Storage[0] == '/' && Storage[1] == '/') // \"//foo\"\n\t\t{\n\t\t\tbegin.push_back(0);\n\t\t\tend.push_back(std::min(Storage.size(), Storage.find('/', 2)));\n\n\t\t\tif(end.back() < Storage.size()) // \"//foo/\"\n\t\t\t{\n\t\t\t\tbegin.push_back(end.back());\n\t\t\t\tend.push_back(end.back() + 1);\n\n\t\t\t\tif(end.back() < Storage.size()) // \"//foo/bar\"\n\t\t\t\t{\n\t\t\t\t\tbegin.push_back(end.back());\n\t\t\t\t\tend.push_back(std::min(Storage.size(), Storage.find('/', end.back())));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(Storage.size() > 1 && Storage[1] == ':') // \"c:\"\n\t\t{\n\t\t\tbegin.push_back(0);\n\t\t\tend.push_back(2);\n\n\t\t\tif(Storage.size() > 2)\n\t\t\t{\n\t\t\t\tif(Storage[2] == '/') // \"c:/foo/bar\"\n\t\t\t\t{\n\t\t\t\t\tbegin.push_back(2);\n\t\t\t\t\tend.push_back(3);\n\n\t\t\t\t\tif(Storage.size() > 3)\n\t\t\t\t\t{\n\t\t\t\t\t\tbegin.push_back(3);\n\t\t\t\t\t\tend.push_back(std::min(Storage.size(), Storage.find('/', 3)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse // \"c:foo\"\n\t\t\t\t{\n\t\t\t\t\tbegin.push_back(2);\n\t\t\t\t\tend.push_back(std::min(Storage.size(), Storage.find('/', 2)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(Storage.size() && Storage[0] == '/') // \"/foo/bar\"\n\t\t{\n\t\t\tbegin.push_back(0);\n\t\t\tend.push_back(1);\n\n\t\t\tif(Storage.size() > 1)\n\t\t\t{\n\t\t\t\tbegin.push_back(1);\n\t\t\t\tend.push_back(std::min(Storage.size(), Storage.find('/', 1)));\n\t\t\t}\n\t\t}\n\t\telse // \"foo/bar\"\n\t\t{\n\t\t\tbegin.push_back(0);\n\t\t\tend.push_back(std::min(Storage.size(), Storage.find('/')));\n\t\t}\n\n\t\twhile(end.size() && end.back() < Storage.size())\n\t\t{\n\t\t\tbegin.push_back(end.back() + 1);\n\t\t\tend.push_back(std::min(Storage.size(), Storage.find('/', end.back() + 1)));\n\t\t}\n\t}\n\n\tustring dereference() const\n\t{\n\t\treturn storage->substr(begin[index], end[index] - begin[index]);\n\t}\n\n\tbool_t equal(const implementation& rhs) const\n\t{\n\t\treturn storage == rhs.storage && index == rhs.index;\n\t}\n\n\tvoid increment()\n\t{\n\t\t++index;\n\t\tif(index >= begin.size())\n\t\t{\n\t\t\tstorage = 0;\n\t\t\tbegin.clear();\n\t\t\tend.clear();\n\t\t\tindex = 0;\n\t\t}\n\t}\n\n\tconst ustring* storage;\n\tstd::vector<ustring::size_type> begin;\n\tstd::vector<ustring::size_type> end;\n\tsize_t index;\n};\n\n//////////////////////////////////////////////////////////////////////////////////\n// path::iterator\n\npath::iterator::iterator() :\n\tm_implementation(new implementation())\n{\n}\n\npath::iterator::iterator(const ustring& Storage) :\n\tm_implementation(new implementation(Storage))\n{\n}\n\npath::iterator::~iterator()\n{\n\tdelete m_implementation;\n}\n\nustring path::iterator::operator*()\n{\n\treturn m_implementation->dereference();\n}\n\nbool_t path::iterator::operator==(const iterator& rhs)\n{\n\treturn m_implementation->equal(*rhs.m_implementation);\n}\n\nbool_t path::iterator::operator!=(const iterator& rhs)\n{\n\treturn !m_implementation->equal(*rhs.m_implementation);\n}\n\npath::iterator& path::iterator::operator++()\n{\n\tm_implementation->increment();\n\treturn *this;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// path\n\npath::path()\n{\n}\n\npath::path(const ustring& GenericPath) :\n\t\tstorage(GenericPath)\n{\n}\n\npath generic_path(const ustring& GenericPath)\n{\n\treturn path(GenericPath);\n}\n\npath generic_path(const string_t& GenericPath)\n{\n\treturn path(ustring::from_utf8(GenericPath));\n}\n\npath native_path(const ustring& NativePath)\n{\n\tustring generic_path(NativePath);\n\tfor(ustring::size_type i = generic_path.find('\\\\'); i != ustring::npos; i = generic_path.find('\\\\'))\n\t\tgeneric_path.replace(i, 1, 1, detail::GENERIC_PATH_SEPARATOR);\n\n\treturn path(generic_path);\n}\n\npath& path::operator/=(const path& rhs)\n{\n\tif(storage.empty())\n\t{\n\t\tstorage = rhs.storage;\n\t}\n\telse\n\t{\n\t\tif((storage[storage.size()-1] == '/') || (rhs.storage.size() && rhs.storage[0] == '/'))\n\t\t{\n\t\t\tstorage += rhs.storage;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstorage += detail::GENERIC_PATH_SEPARATOR;\n\t\t\tstorage += rhs.storage;\n\t\t}\n\t}\n\n\treturn *this;\n}\n\npath path::operator/(const path& rhs) const\n{\n\tpath result(*this);\n\tresult /= rhs;\n\treturn result;\n}\n\npath path::operator+(const ustring& rhs) const\n{\n\treturn path(storage + rhs);\n}\n\npath path::operator+(const string_t& rhs) const\n{\n\treturn path(storage + ustring::from_utf8(rhs));\n}\n\nustring path::generic_utf8_string() const\n{\n\treturn storage;\n}\n\nustring path::native_utf8_string() const\n{\n\tustring native_string(storage);\n\tfor(ustring::size_type i = native_string.find(detail::GENERIC_PATH_SEPARATOR); i != ustring::npos; i = native_string.find(detail::GENERIC_PATH_SEPARATOR, i+1))\n\t\tnative_string.replace(i, 1, 1, detail::NATIVE_PATH_SEPARATOR);\n\n\treturn native_string;\n}\n\nstring_t path::native_console_string() const\n{\n\treturn native_utf8_string().raw();\n}\n\nstring_t path::native_filesystem_string() const\n{\n#ifdef K3D_API_WIN32\n\n\treturn Glib::locale_from_utf8(native_utf8_string().raw());\n\n#else // K3D_API_WIN32\n\n\treturn Glib::filename_from_utf8(native_utf8_string().raw());\n\n#endif // !K3D_API_WIN32\n}\n\npath path::root_path() const\n{\n\treturn generic_path(root_name()) / generic_path(root_directory());\n}\n\nustring path::root_name() const\n{\n\t// Win32 cases ...\n\tustring::size_type pos = storage.find(':');\n\tif(pos != ustring::npos)\n\t\treturn storage.substr(0, pos + 1);\n\n\tif(storage.size() > 2 && storage[0] == '/' && storage[1] == '/')\n\t{\n\t\tpos = storage.find('/', 2);\n\t\treturn storage.substr(0, pos);\n\t}\n\n\t// Posix case ...\n\treturn ustring();\n}\n\nustring path::root_directory() const\n{\n\tif(storage.size() > 2 && storage[1] == ':' && storage[2] == '/')\n\t\treturn ustring::from_utf8(\"/\");\n\n\tif(storage.size() > 2 && storage[0] == '/' && storage[1] == '/')\n\t\treturn ustring::from_utf8(storage.find('/', 2) != ustring::npos ? \"/\" : \"\");\n\n\tif(storage.size() && storage[0] == '/')\n\t\treturn ustring::from_utf8(\"/\");\n\n\treturn ustring::from_utf8(\"\");\n}\n\nustring path::leaf() const\n{\n\treturn storage.substr(detail::leaf_pos(storage, storage.size()));\n}\n\npath path::branch_path() const\n{\n\tustring::size_type end_pos = detail::leaf_pos(storage, storage.size());\n\n\t// skip a '/' unless it is a root directory\n\tif(end_pos && storage[end_pos - 1] == '/' && !detail::is_absolute_root(storage, end_pos))\n\t\t--end_pos;\n\n\treturn path(storage.substr(0, end_pos));\n}\n\nbool_t path::empty() const\n{\n\treturn storage.empty();\n}\n\nbool_t path::is_complete() const\n{\n\t// Win32 cases ...\n\tif(storage.size() > 2 && storage[1] == ':' && storage[2] == '/') // \"c:/\"\n\t\treturn true;\n\tif(storage.size() > 2 && storage[0] == '/' && storage[1] == '/') // \"//share\"\n\t\treturn true;\n\tif(storage.size() > 2 && storage[storage.size()-1] == ':') // \"prn:\"\n\t\treturn true;\n\n\t// Posix cases ...\n\tif(storage.size() && storage[0] == '/') // \"/foo\"\n\t\treturn true;\n\n\treturn false;\n}\n\npath::iterator path::begin() const\n{\n\treturn iterator(storage);\n}\n\npath::iterator path::end() const\n{\n\treturn iterator();\n}\n\nbool_t path::operator==(const path& that) const\n{\n\treturn !(*this < that) && !(that < *this);\n}\n\nbool_t path::operator!=(const path& that) const\n{\n\treturn !(*this == that);\n}\n\nbool_t path::operator<(const path& that) const\n{\n\treturn storage < that.storage;\n}\n\nbool_t path::operator<=(const path& that) const\n{\n\treturn !(that < *this);\n}\n\nbool_t path::operator>(const path& that) const\n{\n\treturn that < *this;\n}\n\nbool_t path::operator>=(const path& that) const\n{\n\treturn !(*this < that);\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// exists\n\nbool_t exists(const path& Path)\n{\n#ifdef K3D_API_WIN32\n\n\treturn ::GetFileAttributesA(Path.native_filesystem_string().c_str()) != 0xFFFFFFFF;\n\n#else // K3D_API_WIN32\n\n\tstruct stat path_stat;\n\treturn ::stat(Path.native_filesystem_string().c_str(), &path_stat) == 0;\n\n#endif // !K3D_API_WIN32\n}\n\nconst ustring extension(const path& Path);\nbool_t create_directory(const path& Path);\nbool_t create_directories(const path& Path);\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// make_relative_path\n\nconst filesystem::path make_relative_path(const filesystem::path& AbsolutePath, const filesystem::path& ReferencePath)\n{\n\t// The AbsolutePath must actually *be* an absolute path!\n\treturn_val_if_fail(AbsolutePath.is_complete(), filesystem::path());\n\n\t// As a special-case, if the AbsolutePath and ReferencePath don't share the same root name, return the AbsolutePath (which is the best we can do)\n\tif(AbsolutePath.root_name() != ReferencePath.root_name())\n\t\treturn AbsolutePath;\n\n\tfilesystem::path relative_path;\n\n\tconst filesystem::path root_path = ReferencePath;\n\tconst filesystem::path absolute_path(AbsolutePath);\n\n\tfilesystem::path::iterator a = root_path.begin();\n\tfilesystem::path::iterator b = absolute_path.begin();\n\twhile(a != root_path.end() && b != absolute_path.end() && *a == *b)\n\t{\n\t\t++a;\n\t\t++b;\n\t}\n\n\tfor(; a != root_path.end(); ++a)\n\t\trelative_path /= filesystem::generic_path(\"..\");\n\tfor(; b != absolute_path.end(); ++b)\n\t\trelative_path /= filesystem::generic_path(*b);\n\n\treturn relative_path;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// extension\n\nconst ustring extension(const path& Path)\n{\n\tustring leaf = Path.leaf();\n\n\tustring::size_type n = leaf.rfind('.');\n\tif (n != ustring::npos)\n\t\treturn leaf.substr(n);\n\telse\n\t\treturn ustring();\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// replace_extension\n\nconst path replace_extension(const path& Path, const string_t& NewExtension)\n{\n\tustring temp = Path.generic_utf8_string(); \n\n\treturn generic_path(temp.substr(0, temp.rfind('.')) + ustring::from_utf8(NewExtension));\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// create_directory\n\nbool_t create_directory(const path& Path)\n{\n\treturn_val_if_fail(!Path.empty(), false);\n\n\tif(exists(Path))\n\t{\n\t\tif(is_directory(Path))\n\t\t\treturn true;\n\n\t\tk3d::log() << error << \"Path [\" << Path.native_console_string() << \"] exists and is not a directory\" << std::endl;\n\t\treturn false;\n\t}\n\n#ifdef K3D_API_WIN32\n\tif ( ::CreateDirectoryA( Path.native_filesystem_string().c_str(), 0 ) )\n\t\treturn true;\n#else // K3D_API_WIN32\n\tif ( ::mkdir( Path.native_filesystem_string().c_str(), S_IRWXU|S_IRWXG|S_IRWXO ) == 0 )\n\t\treturn true;\n#endif // !K3D_API_WIN32\n\n\tk3d::log() << error << \"Error creating directory [\" << Path.native_console_string() << \"]\" << std::endl;\n\treturn false;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// create_directories\n\nbool_t create_directories(const path& Path)\n{\n\treturn_val_if_fail(!Path.empty(), false);\n\n\tif(exists(Path))\n\t{\n\t\tif(is_directory(Path))\n\t\t\treturn true;\n\n\t\tk3d::log() << error << \"Path [\" << Path.native_console_string() << \"] exists and is not a directory\" << std::endl;\n\t\treturn false;\n\t}\n\n\t// First create branch, by calling ourself recursively\n\tif(!create_directories(Path.branch_path()))\n\t\treturn false;\n\n\t// Now that parent's path exists, create the directory\n\treturn create_directory(Path);\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// is_directory\n\nbool_t is_directory(const path& Path)\n{\n#ifdef K3D_API_WIN32\n\n\tconst DWORD attributes = ::GetFileAttributesA(Path.native_filesystem_string().c_str());\n\treturn attributes & FILE_ATTRIBUTE_DIRECTORY;\n\n#else // K3D_API_WIN32\n\n\tstruct stat path_stat;\n\tif(::stat(Path.native_filesystem_string().c_str(), &path_stat) != 0)\n\t\treturn false;\n\n\treturn S_ISDIR(path_stat.st_mode);\n\n#endif // !K3D_API_WIN32\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// remove\n\nbool_t remove(const path& Path)\n{\n#ifdef K3D_API_WIN32\n\n\tif(is_directory(Path))\n\t\treturn ::RemoveDirectory(Path.native_filesystem_string().c_str());\n\n\treturn ::DeleteFile(Path.native_filesystem_string().c_str());\n\n#else // K3D_API_WIN32\n\n\tif(is_directory(Path))\n\t\treturn 0 == ::rmdir(Path.native_filesystem_string().c_str());\n\n\treturn 0 == ::unlink(Path.native_filesystem_string().c_str());\n\n#endif // !K3D_API_WIN32\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// rename\n\nbool_t rename(const path& Source, const path& Target)\n{\n#ifdef K3D_API_WIN32\n\n\treturn ::MoveFile(Source.native_filesystem_string().c_str(), Target.native_filesystem_string().c_str());\n\n#else // K3D_API_WIN32\n\n\treturn 0 == ::rename(Source.native_filesystem_string().c_str(), Target.native_filesystem_string().c_str());\n\n#endif // !K3D_API_WIN32\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// copy_file\n\nbool_t copy_file(const path& Source, const path& Target)\n{\n#ifdef K3D_API_WIN32\n\n\treturn ::CopyFile(Source.native_filesystem_string().c_str(), Target.native_filesystem_string().c_str(), false);\n\n#else // K3D_API_WIN32\n\n\tstruct stat source_stat;\n\tif(0 != ::stat(Source.native_filesystem_string().c_str(), &source_stat))\n\t\treturn false;\n\n\tconst int source_file = ::open(Source.native_filesystem_string().c_str(), O_RDONLY);\n\tif(source_file < 1)\n\t\treturn false;\n\n\tconst int target_file = ::open(Target.native_filesystem_string().c_str(), O_WRONLY | O_CREAT | O_EXCL, source_stat.st_mode);\n\tif(target_file < 1)\n\t{\n\t\t::close(source_file);\n\t\treturn false;\n\t}\n\n\tbool_t result = true;\n\n\tconst std::size_t buffer_size = 32768;\n\tboost::scoped_array<char> buffer(new char[buffer_size]);\n\n\tfor(ssize_t bytes_read = ::read(source_file, buffer.get(), buffer_size); bytes_read > 0; bytes_read = ::read(source_file, buffer.get(), buffer_size))\n\t{\n\t\tif(::write(target_file, buffer.get(), bytes_read) < 0)\n\t\t{\n\t\t\tresult = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif(::close(source_file) < 0 )\n\t\tresult = false;\n\n\tif(::close(target_file) < 0 )\n\t\tresult = false;\n\n\treturn result;\n\n#endif // !K3D_API_WIN32\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// up_to_date\n\nbool_t up_to_date(const path& Source, const path& Target)\n{\n\t// Get the last modification time of the source ...\n\ttime_t source_modified = 0;\n\treturn_val_if_fail(system::file_modification_time(Source, source_modified), false);\n\n\t// Get the last modification time of the target (if it exists) ...\n\ttime_t target_modified = 0;\n\tsystem::file_modification_time(Target, target_modified);\n\n\treturn source_modified <= target_modified;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// split_native_paths\n\nconst path_list split_native_paths(const ustring& Paths)\n{\n\tpath_list results;\n\n\tustring::size_type begin = 0;\n\tconst ustring::size_type end = Paths.size();\n\tfor(ustring::size_type separator = Paths.find(detail::NATIVE_SEARCHPATH_SEPARATOR, begin); separator != ustring::npos; separator = Paths.find(detail::NATIVE_SEARCHPATH_SEPARATOR, begin))\n\t{\n\t\tresults.push_back(native_path(Paths.substr(begin, separator - begin)));\n\t\tbegin = separator + 1;\n\t}\n\tif(begin < end)\n\t\tresults.push_back(native_path(Paths.substr(begin, end - begin)));\n\n\treturn results;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// directory_iterator::implementation\n\n#ifdef K3D_API_WIN32\n\nclass directory_iterator::implementation\n{\npublic:\n\timplementation(const path& Path) :\n\t\t\thandle(INVALID_HANDLE_VALUE),\n\t\t\tbranch_path(Path)\n\t{\n\t\tpath temp = Path + \"\\\\*\";\n\n\t\thandle = ::FindFirstFile(temp.native_filesystem_string().c_str(), &data);\n\t\tskip_dots();\n\n\t\tif(handle != INVALID_HANDLE_VALUE)\n\t\t\tfull_path = branch_path / generic_path(ustring::from_utf8(data.cFileName));\n\t}\n\n\timplementation() :\n\t\t\thandle(INVALID_HANDLE_VALUE)\n\t{\n\t}\n\n\t~implementation()\n\t{\n\t\tif(handle != INVALID_HANDLE_VALUE)\n\t\t\t::FindClose(handle);\n\t}\n\n\tdirectory_iterator::reference dereference() const\n\t{\n\t\treturn full_path;\n\t}\n\n\tvoid increment()\n\t{\n\t\tinternal_increment();\n\t\tskip_dots();\n\n\t\tif(handle != INVALID_HANDLE_VALUE)\n\t\t\tfull_path = branch_path / generic_path(ustring::from_utf8(data.cFileName));\n\t}\n\n\tbool_t equal(const implementation& rhs) const\n\t{\n\t\treturn handle == rhs.handle;\n\t}\n\nprivate:\n\tvoid internal_increment()\n\t{\n\t\tif(0 == ::FindNextFile(handle, &data))\n\t\t{\n\t\t\t::FindClose(handle);\n\t\t\thandle = INVALID_HANDLE_VALUE;\n\t\t}\n\t}\n\n\tvoid skip_dots()\n\t{\n\t\twhile(handle != INVALID_HANDLE_VALUE && data.cFileName[0]=='.' && (data.cFileName[1]=='\\0' || (data.cFileName[1]=='.' && data.cFileName[2]=='\\0')))\n\t\t\tinternal_increment();\n\t}\n\n\tHANDLE handle;\n\tWIN32_FIND_DATA data;\n\tconst path branch_path;\n\tpath full_path;\n};\n\n#else // K3D_API_WIN32\n\nclass directory_iterator::implementation\n{\npublic:\n\timplementation(const path& Path) :\n\t\thandle(0),\n\t\tcurrent(0),\n\t\tbranch_path(Path)\n\t{\n\t\thandle = ::opendir(Path.native_filesystem_string().c_str());\n\n\t\tinternal_increment();\n\t\tskip_dots();\n\n\t\tif(current)\n\t\t\tfull_path = branch_path / generic_path(current->d_name);\n\t}\n\n\timplementation() :\n\t\thandle(0),\n\t\tcurrent(0)\n\t{\n\t}\n\n\t~implementation()\n\t{\n\t\tif(handle)\n\t\t\t::closedir(handle);\n\t}\n\n\tdirectory_iterator::reference dereference() const\n\t{\n\t\treturn full_path;\n\t}\n\n\tvoid increment()\n\t{\n\t\tinternal_increment();\n\t\tskip_dots();\n\n\t\tif(current)\n\t\t\tfull_path = branch_path / generic_path(current->d_name);\n\t}\n\n\tbool_t equal(const implementation& rhs)\n\t{\n\t\treturn current == rhs.current;\n\t}\n\nprivate:\n\tvoid internal_increment()\n\t{\n\t\tif(handle)\n\t\t{\n\t\t\tcurrent = ::readdir(handle);\n\t\t\tif(!current)\n\t\t\t{\n\t\t\t\t::closedir(handle);\n\t\t\t\thandle = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid skip_dots()\n\t{\n\t\twhile(current && current->d_name[0]=='.' && (current->d_name[1]=='\\0' || (current->d_name[1]=='.' && current->d_name[2]=='\\0')))\n\t\t\tinternal_increment();\n\t}\n\n\tDIR* handle;\n\tdirent* current;\n\tconst path branch_path;\n\tpath full_path;\n};\n\n#endif // !K3D_API_WIN32\n\n//////////////////////////////////////////////////////////////////////////////////\n// directory_iterator\n\ndirectory_iterator::directory_iterator(const path& Path) :\n\t\tm_implementation(new implementation(Path))\n{\n}\n\ndirectory_iterator::directory_iterator() :\n\t\tm_implementation(new implementation())\n{\n}\n\ndirectory_iterator::~directory_iterator()\n{\n\tdelete m_implementation;\n}\n\ndirectory_iterator::reference directory_iterator::dereference() const\n{\n\treturn m_implementation->dereference();\n}\n\nvoid directory_iterator::increment()\n{\n\tm_implementation->increment();\n}\n\nbool_t directory_iterator::equal(const directory_iterator& rhs) const\n{\n\treturn m_implementation->equal(*rhs.m_implementation);\n}\n\n} // namespace filesystem\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/path.h",
    "content": "#ifndef K3DSDK_PATH_H\n#define K3DSDK_PATH_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n#include <k3dsdk/ustring.h>\n#include <boost/iterator/iterator_facade.hpp>\n#include <vector>\n\nnamespace k3d\n{\n\nnamespace filesystem\n{\n\n/// Portable filesystem path that closely follows the boost::filesystem::path interface, with some important exceptions\n/** \\note Never throws an exception */\n/** \\note Stores paths in UTF-8 encoding.  All input and output is in UTF-8 encoding. */\nclass path\n{\npublic:\n\t/// Constructs an empty path\n\tpath();\n\t/// Constructs a path from a string containing the generic grammar\n\tfriend path generic_path(const ustring& GenericPath);\n\t/// Constructs a path from a string containing the generic grammar (the string is assumed to contain UTF-8 data, no character set conversion is applied)\n\tfriend path generic_path(const string_t& GenericPath);\n\t/// Constructs a path from a native file string, i.e. any valid Posix or Win32 path (doesn't matter which platform we were compiled on)\n\tfriend path native_path(const ustring& NativePath);\n\n\t/// Path concatenation\n\tpath& operator/=(const path& rhs);\n\t/// Path concatenation\n\tpath operator/(const path& rhs) const;\n\n\t/// Appending text (useful for file extensions)\n\tpath operator+(const ustring& rhs) const;\n\t/// Appending text (useful for file extensions)\n\tpath operator+(const string_t& rhs) const;\n\n\t/// Returns the generic form of the path as a UTF-8 encoded string\n\tustring generic_utf8_string() const;\n\t/// Returns the native form of the path as a UTF-8 encoded string\n\tustring native_utf8_string() const;\n\t/// Returns the native form of the path as a string suitable for console output\n\tstring_t native_console_string() const;\n\t/// Returns the native form of the path as a string suitable for use with the underlying OS filesystem\n\tstring_t native_filesystem_string() const;\n\n\t// modification functions:\n//\tpath& normalize();\n\n\t// decomposition functions:\n\tpath root_path() const;\n\tustring root_name() const;\n\tustring root_directory() const;\n//\tpath relative_path() const;\n\tustring leaf() const;\n\tpath branch_path() const;\n\n\t// query functions:\n\tbool_t empty() const;\n\tbool_t is_complete() const;\n/*\n\tbool_t has_root_path() const;\n\tbool_t has_root_name() const;\n\tbool_t has_root_directory() const;\n\tbool_t has_relative_path() const;\n\tbool_t has_leaf() const;\n\tbool_t has_branch_path() const;\n*/\n\n\t// iteration:\n\tclass iterator\n\t{\n\tpublic:\n\t\ttypedef std::forward_iterator_tag iterator_category;\n\t\ttypedef ustring value_type;\n\t\ttypedef ustring& reference;\n\t\ttypedef ustring* pointer;\n\t\ttypedef ptrdiff_t difference_type;\n\n\t\titerator();\n\t\titerator(const ustring& Storage);\n\t\t~iterator();\n\n\t\tvalue_type operator*();\n\n\t\tbool_t operator==(const iterator& RHS);\n\t\tbool_t operator!=(const iterator& RHS);\n\t\titerator& operator++();\n\n\tprivate:\n\t\tclass implementation;\n\t\timplementation* const m_implementation;\n\t};\n\n\titerator begin() const;\n\titerator end() const;\n\n\t// relational operators:\n\tbool_t operator==(const path& that) const;\n\tbool_t operator!=(const path& that) const;\n\tbool_t operator<(const path& that) const;\n\tbool_t operator<=(const path& that) const;\n\tbool_t operator>(const path& that) const;\n\tbool_t operator>=(const path& that) const;\n\nprivate:\n\tpath(const ustring& GenericPath);\n\tustring storage;\n};\n\n/// Constructs a path from a string containing the generic grammar\npath generic_path(const ustring& GenericPath);\n/// Constructs a path from a string containing the generic grammar (the string is assumed to contain UTF-8 data, no character set conversion is applied)\npath generic_path(const string_t& GenericPath);\n/// Constructs a path from a native file string, i.e. any valid Posix or Win32 path (doesn't matter which platform we were compiled on)\npath native_path(const ustring& NativePath);\n\n/// Defines a collection of paths\ntypedef std::vector<path> path_list;\n\n/// Returns true if the operating system reports that the given file exists\nbool_t exists(const path& Path);\n/// Converts the given absolute path into a relative path, relative to the given reference path\nconst path make_relative_path(const path& AbsolutePath, const path& ReferencePath);\n/// If Path.leaf() contains a dot, returns the substring of Path.leaf() starting from the last dot.  Otherwise, returns empty string\nconst ustring extension(const path& Path);\n/// If Path.leaf() contains a dot, replaces the substring of Path.leaf() starting from the last dot with the given text.  Otherwise, returns empty string.\nconst path replace_extension(const path& Path, const string_t& NewExtension);\n/// Creates the given directory\nbool_t create_directory(const path& Path);\n/// Creates the given directory, including any missing parent directories\nbool_t create_directories(const path& Path);\n/// Returns true if the given path is a directory\nbool_t is_directory(const path& Path);\n/// Removes a file\nbool_t remove(const path& Path);\n/// Renames a file\nbool_t rename(const path& Source, const path& Target);\n/// Copies a file\nbool_t copy_file(const path& Source, const path& Target);\n\n/// Returns true iff the Target exists and is newer than the Source\nbool_t up_to_date(const path& Source, const path& Target);\n\n/// Splits a string containing delimited paths (such as the PATH environment variable) into a collection of individual paths\n/** \\note: Splits the string using the filesystem delimiter for the native system (the system we were compiled on). */\nconst path_list split_native_paths(const ustring& Paths);\n\n/// Provides iteration over the contents of a directory\nclass directory_iterator :\n\tpublic boost::iterator_facade<directory_iterator, const path, boost::single_pass_traversal_tag>\n{\npublic:\n\t/// Creates the \"begin\" iterator for the contents of the given directory\n\texplicit directory_iterator(const path& Path);\n\t/// Creates an \"end\" iterator\n\tdirectory_iterator();\n\t~directory_iterator();\n\nprivate:\n\tclass implementation;\n\timplementation* m_implementation;\n\n\tfriend class boost::iterator_core_access;\n\treference dereference() const;\n\tvoid increment();\n\tbool_t equal(const directory_iterator& rhs) const;\n};\n\n} // namespace filesystem\n\n} // namespace k3d\n\n#endif // !K3DSDK_PATH_H\n\n"
  },
  {
    "path": "k3dsdk/persistent_lookup.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/persistent_lookup.h>\n\nnamespace k3d\n{\n\n////////////////////////////////////////////////////////////////////////////////\n// persistent_lookup\n\npersistent_lookup::persistent_lookup()\n{\n\tm_id_map[0] = 0;\n\tm_object_map[0] = 0;\n}\n\t\nipersistent_lookup::id_type persistent_lookup::lookup_id(iunknown* Object)\n{\n\tif(!m_id_map.count(Object))\n\t{\n\t\tconst id_type new_id = m_id_map.size() + 1;\n\t\tm_id_map[Object] = new_id;\n\t\tm_object_map[new_id] = Object;\n\t}\n\t\n\treturn m_id_map[Object];\n}\n\niunknown* persistent_lookup::lookup_object(const id_type ID)\n{\n\tif(!m_object_map.count(ID))\n\t\treturn 0;\n\n\treturn m_object_map[ID];\n}\n\nvoid persistent_lookup::insert_lookup(const id_type ID, iunknown* Object)\n{\n\tm_id_map[Object] = ID;\n\tm_object_map[ID] = Object;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/persistent_lookup.h",
    "content": "#ifndef K3DSDK_PERSISTENT_LOOKUP_H\n#define K3DSDK_PERSISTENT_LOOKUP_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ipersistent_lookup.h>\n#include <map>\n\nnamespace k3d\n{\n\n/// Concrete implementation of ipersistent_lookup\nclass persistent_lookup :\n\tpublic ipersistent_lookup\n{\npublic:\n\tpersistent_lookup();\n\n\tid_type lookup_id(iunknown* Object);\n\tiunknown* lookup_object(const id_type ID);\n\n\tvoid insert_lookup(const id_type ID, iunknown* Object);\n\t\nprivate:\n\tstd::map<iunknown*, id_type> m_id_map;\n\tstd::map<id_type, iunknown*> m_object_map;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_PERSISTENT_LOOKUP_H\n\n"
  },
  {
    "path": "k3dsdk/persistent_property_collection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/imetadata.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/persistent_property_collection.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/tokens.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/xml.h>\n\n#include <iostream>\n#include <set>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// persistent_property_collection\n\npersistent_property_collection::persistent_property_collection()\n{\n}\n\npersistent_property_collection::~persistent_property_collection()\n{\n}\n\nvoid persistent_property_collection::enable_serialization(const string_t& Name, ipersistent& Property)\n{\n\tif(std::count(m_names.begin(), m_names.end(), Name))\n\t{\n\t\tlog() << error << \"cannot enable serialization for property with duplicate name [\" << Name << \"]\" << std::endl;\n\t\treturn;\n\t}\n\n\tif(std::count(m_properties.begin(), m_properties.end(), &Property))\n\t{\n\t\tlog() << error << \"serialization is already enabled for property [\" << Name << \"]\" << std::endl;\n\t\treturn;\n\t}\n\n\tm_names.push_back(Name);\n\tm_properties.push_back(&Property);\n}\n\nvoid persistent_property_collection::disable_serialization(ipersistent& Property)\n{\n\tfor(uint_t i = 0; i != m_names.size(); ++i)\n\t{\n\t\tif(m_properties[i] == &Property)\n\t\t{\n\t\t\tm_names.erase(m_names.begin() + i);\n\t\t\tm_properties.erase(m_properties.begin() + i);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nconst std::vector<std::pair<string_t, ipersistent*> > persistent_property_collection::persistent_objects()\n{\n\tstd::vector<std::pair<string_t, ipersistent*> > results;\n\n\tfor(uint_t i = 0; i != m_names.size(); ++i)\n\t\tresults.push_back(std::make_pair(m_names[i], m_properties[i]));\n\n\treturn results;\n}\n\nvoid persistent_property_collection::save(xml::element& Element, const ipersistent::save_context& Context)\n{\n\t// If we don't have anything to save, we're done ...\n\tif(m_properties.empty())\n\t\treturn;\n\n\t// Save property values ...\n\txml::element& xml_properties = Element.append(xml::element(\"properties\"));\n\tfor(uint_t i = 0; i != m_names.size(); ++i)\n\t\t(*m_properties[i]).save(xml_properties, Context);\n\t\n\t// Save property metadata ...\n\t/** \\todo Next time we break backwards compatibility on documents, merge properties and their metadata */\n\tfor(uint_t i = 0; i != m_names.size(); ++i)\n\t{\n\t\tif(imetadata* const metadata = dynamic_cast<imetadata*>(m_properties[i]))\n\t\t{\n\t\t\tconst imetadata::metadata_t pairs = metadata->get_metadata();\n\t\t\tif(pairs.size())\n\t\t\t{\n\t\t\t\txml::element& xml_metadata = xml_properties.append(xml::element(\"metadata\", xml::attribute(\"name\", m_names[i])));\n\t\t\t\tfor(imetadata::metadata_t::const_iterator pair = pairs.begin(); pair != pairs.end(); ++pair)\n\t\t\t\t\txml_metadata.append(xml::element(\"pair\", xml::attribute(\"name\", pair->first), pair->second));\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid persistent_property_collection::load(xml::element& Element, const ipersistent::load_context& Context)\n{\n\txml::element* const xml_properties = xml::find_element(Element, \"properties\");\n\tif(!xml_properties)\n\t\treturn;\n\n\t// Keep-track of whether this object is a document node (required for user-properties) ...\n\tk3d::inode* const node = dynamic_cast<k3d::inode*>(this);\n\n\t// Keep-track of xml property names as we go, for error-detection ...\n\tstd::set<string_t> xml_property_names;\n\n\t// Load <property> tags ...\n\tfor(xml::element::elements_t::iterator xml_property = xml_properties->children.begin(); xml_property != xml_properties->children.end(); ++xml_property)\n\t{\n\t\tif(xml_property->name != \"property\")\n\t\t\tcontinue;\n\n\t\tconst string_t xml_property_name = xml::attribute_text(*xml_property, \"name\");\n\t\tif(xml_property_name.empty())\n\t\t{\n\t\t\tlog() << error << \"property with missing name attribute will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(xml_property_names.count(xml_property_name))\n\t\t{\n\t\t\tlog() << error << \"property with duplicate name [\" << xml_property_name << \"] will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\txml_property_names.insert(xml_property_name);\n\n\t\tbool xml_property_used = false;\n\n\t\t// Try matching the XML property to a builtin property ...\n\t\tif(!xml_property_used)\n\t\t{\n\t\t\tfor(uint_t i = 0; i != m_names.size(); ++i)\n\t\t\t{\n\t\t\t\tif(xml_property_name == m_names[i])\n\t\t\t\t{\n\t\t\t\t\tm_properties[i]->load(*xml_property, Context);\n\t\t\t\t\txml_property_used = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// See if the XML property is a user-property to be instantiated ...\n\t\tif(!xml_property_used && node)\n\t\t{\n\t\t\tconst string_t xml_user_property = xml::attribute_text(*xml_property, \"user_property\");\n\t\t\tif(xml_user_property == \"generic\" || xml_user_property == \"vanilla\" /* for backwards compatibility */)\n\t\t\t{\n\t\t\t\txml_property_used = true;\n\n\t\t\t\tconst string_t type = xml::attribute_text(*xml_property, \"type\");\n\t\t\t\tconst string_t name = xml::attribute_text(*xml_property, \"name\");\n\t\t\t\tconst string_t label = xml::attribute_text(*xml_property, \"label\");\n\t\t\t\tconst string_t description = xml::attribute_text(*xml_property, \"description\");\n\n\t\t\t\tk3d::iproperty* const new_property = property::create(*node, type, name, label, description);\n\n\t\t\t\tif(new_property)\n\t\t\t\t{\n\t\t\t\t\tif(k3d::ipersistent* const persistent = dynamic_cast<k3d::ipersistent*>(new_property))\n\t\t\t\t\t\tpersistent->load(*xml_property, Context);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlog() << error << k3d_file_reference << \": error creating property [\" << name << \"] with type [\" << type << \"]\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(xml_user_property == \"renderman\")\n\t\t\t{\n\t\t\t\txml_property_used = true;\n\n\t\t\t\tconst string_t type = xml::attribute_text(*xml_property, \"type\");\n\t\t\t\tconst string_t parameter_type = xml::attribute_text(*xml_property, \"parameter_type\");\n\t\t\t\tconst string_t parameter_name = xml::attribute_text(*xml_property, \"parameter_name\");\n\t\t\t\tconst string_t name = xml::attribute_text(*xml_property, \"name\");\n\t\t\t\tconst string_t label = xml::attribute_text(*xml_property, \"label\");\n\t\t\t\tconst string_t description = xml::attribute_text(*xml_property, \"description\");\n\n\t\t\t\tk3d::iproperty* new_property = 0;\n\t\t\t\tif(parameter_type == \"attribute\")\n\t\t\t\t\tnew_property = property::ri::create_attribute(*node, type, parameter_name, name, label, description);\n\t\t\t\telse if(parameter_type == \"option\")\n\t\t\t\t\tnew_property = property::ri::create_option(*node, type, parameter_name, name, label, description);\n\t\t\t\n\t\t\t\tif(new_property)\n\t\t\t\t{\n\t\t\t\t\tif(k3d::ipersistent* const persistent = dynamic_cast<k3d::ipersistent*>(new_property))\n\t\t\t\t\t\tpersistent->load(*xml_property, Context);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlog() << error << k3d_file_reference << \": error creating property [\" << name << \"] with type [\" << type << \"]\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(xml_user_property.size())\n\t\t\t{\n\t\t\t\tlog() << error << \"unknown user property type: \" << xml_user_property << std::endl;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Load <metadata> tags ...\n\tfor(xml::element::elements_t::iterator xml_metadata = xml_properties->children.begin(); xml_metadata != xml_properties->children.end(); ++xml_metadata)\n\t{\n\t\tif(xml_metadata->name != \"metadata\")\n\t\t\tcontinue;\n\n\t\tconst string_t xml_metadata_name = xml::attribute_text(*xml_metadata, \"name\");\n\t\tif(xml_metadata_name.empty())\n\t\t{\n\t\t\tlog() << error << \"property metadata with missing name attribute will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(!xml_property_names.count(xml_metadata_name))\n\t\t{\n\t\t\tlog() << error << \"property metadata with unknown name [\" << xml_metadata_name << \"] will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Try matching the XML metadata to a property ...\n\t\tfor(uint_t i = 0; i != m_names.size(); ++i)\n\t\t{\n\t\t\tif(xml_metadata_name != m_names[i])\n\t\t\t\tcontinue;\n\n\t\t\timetadata::metadata_t pairs;\n\t\t\tfor(xml::element::elements_t::const_iterator xml_pair = xml_metadata->children.begin(); xml_pair != xml_metadata->children.end(); ++xml_pair)\n\t\t\t{\n\t\t\t\tif(xml_pair->name != \"pair\")\n\t\t\t\t\tcontinue;\n\n\t\t\t\tpairs.insert(std::make_pair(xml::attribute_text(*xml_pair, \"name\"), xml_pair->text));\n\t\t\t}\n\n\t\t\tif(imetadata* const metadata = dynamic_cast<imetadata*>(m_properties[i]))\n\t\t\t\tmetadata->set_metadata(pairs);\n\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/persistent_property_collection.h",
    "content": "#ifndef K3DSDK_PERSISTENT_PROPERTY_COLLECTION_H\n#define K3DSDK_PERSISTENT_PROPERTY_COLLECTION_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ipersistent.h>\n#include <k3dsdk/ipersistent_collection.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// persistent_property_collection\n\n/// Automates serialization of properties\nclass persistent_property_collection :\n\tpublic ipersistent_collection\n{\npublic:\n\tvoid enable_serialization(const string_t& Name, ipersistent& Property);\n\tvoid disable_serialization(ipersistent& Property);\n\tconst std::vector<std::pair<string_t, ipersistent*> > persistent_objects();\n\nprotected:\n\tpersistent_property_collection();\n\tvirtual ~persistent_property_collection();\n\n\tvoid save(xml::element& Element, const ipersistent::save_context& Context);\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context);\n\nprivate:\n\tpersistent_property_collection(const persistent_property_collection&);\n\tpersistent_property_collection& operator=(const persistent_property_collection&);\n\n\ttypedef std::vector<string_t> names_t;\n\ttypedef std::vector<ipersistent*> properties_t;\n\n\tnames_t m_names;\n\tproperties_t m_properties;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_PERSISTENT_PROPERTY_COLLECTION_H\n\n"
  },
  {
    "path": "k3dsdk/pipeline.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/istate_container.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/pipeline.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/signal_slots.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <cassert>\n#include <iostream>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// pipeline::implementation\n\nclass pipeline::implementation\n{\npublic:\n\timplementation(istate_recorder* StateRecorder) :\n\t\tstate_recorder(StateRecorder)\n\t{\n\t}\n\n\t~implementation()\n\t{\n\t\tclear();\n\t}\n\n\tvoid set_dependencies(dependencies_t& Dependencies, ihint* Hint = 0)\n\t{\n\t\t// Don't let any NULLs creep in ...\n\t\tif(Dependencies.erase(static_cast<iproperty*>(0)))\n\t\t\tlog() << warning << \"Cannot assign a dependency to a NULL property\" << std::endl;\n\n\t\t// If we're recording undo/redo data, record the new state ...\n\t\tif(state_recorder && state_recorder->current_change_set())\n\t\t\tstate_recorder->current_change_set()->record_new_state(new set_dependencies_container(*this, Dependencies));\n\n\t\t// Update our internal graph, keep track of the original state as we go ...\n\t\tdependencies_t old_dependencies;\n\t\tfor(dependencies_t::iterator dependency = Dependencies.begin(); dependency != Dependencies.end(); ++dependency)\n\t\t{\n\t\t\tdependencies_t::iterator old_dependency = get_dependency(dependency->first);\n\t\t\told_dependencies.insert(*old_dependency);\n\n\t\t\told_dependency->second = dependency->second;\n\n\t\t\tm_change_connections[dependency->first].disconnect();\n\t\t\tm_delete_connections[dependency->second].disconnect();\n\t\t\tif(dependency->second)\n\t\t\t{\n\t\t\t\tm_change_connections[dependency->first] =\n\t\t\t\t\tdependency->second->property_changed_signal().connect(\n\t\t\t\t\t\tsignal::make_loop_safe_slot(\n\t\t\t\t\t\t\tdependency->first->property_changed_signal()));\n\t\t\t\tm_delete_connections[dependency->second] = dependency->second->property_deleted_signal().connect(sigc::bind(sigc::mem_fun(*this, &implementation::on_property_deleted), dependency->second));\n\t\t\t}\n\n\t\t\tdependency->first->property_set_dependency(dependency->second);\n\t\t}\n\n\t\t// If we're recording undo/redo data, keep track of the original state ...\n\t\tif(state_recorder && state_recorder->current_change_set())\n\t\t\tstate_recorder->current_change_set()->record_old_state(new set_dependencies_container(*this, old_dependencies));\n\n\t\t// Notify observers that the pipeline has changed ...\n\t\tchanged_signal.emit(Dependencies);\n\n\t\t// Synthesize change notifications for every property whose parent was set ...\n\t\tfor(dependencies_t::iterator dependency = Dependencies.begin(); dependency != Dependencies.end(); ++dependency)\n\t\t\tdependency->first->property_changed_signal().emit(Hint);\n\t}\n\n\tvoid clear()\n\t{\n\t\tfor(connections_t::iterator connection = m_change_connections.begin(); connection != m_change_connections.end(); ++connection)\n\t\t\tconnection->second.disconnect();\n\t\tm_change_connections.clear();\n\n\t\tfor(connections_t::iterator connection = m_delete_connections.begin(); connection != m_delete_connections.end(); ++connection)\n\t\t\tconnection->second.disconnect();\n\t\tm_delete_connections.clear();\n\n\t\tdependencies.clear();\n\t}\n\n\tvoid on_property_deleted(iproperty* Property)\n\t{\n\t\tdependencies_t::iterator dependency = dependencies.find(Property);\n\t\tif(dependency != dependencies.end())\n\t\t{\n\t\t\tif(state_recorder && state_recorder->current_change_set())\n\t\t\t{\n\t\t\t\tdependencies_t old_dependencies;\n\t\t\t\told_dependencies.insert(*dependency);\n\t\t\t\tstate_recorder->current_change_set()->record_old_state(new set_dependencies_container(*this, old_dependencies));\n\t\t\t\tstate_recorder->current_change_set()->record_new_state(new delete_property_container(*this, Property));\n\t\t\t}\n\t\n\t\t\tdependencies.erase(dependency);\n\t\t}\n\t\t\n\t\tm_delete_connections[Property].disconnect();\n\t\tm_delete_connections.erase(Property);\n\n\t\tdependencies_t new_dependencies;\n\t\tfor(dependencies_t::iterator dependency = dependencies.begin(); dependency != dependencies.end(); ++dependency)\n\t\t{\n\t\t\tif(dependency->second == Property)\n\t\t\t{\n\t\t\t\tdependency->first->property_set_dependency(0);\n\t\t\t\tnew_dependencies.insert(std::make_pair(dependency->first, static_cast<iproperty*>(0)));\n\t\t\t}\n\t\t}\n\n\t\tnew_dependencies[Property] = 0;\n\t\tset_dependencies(new_dependencies);\n\t}\n\n\tdependencies_t::iterator get_dependency(iproperty* Property)\n\t{\n\t\tassert(Property);\n\n\t\tdependencies_t::iterator result = dependencies.find(Property);\n\t\tif(result == dependencies.end())\n\t\t{\n\t\t\tresult = dependencies.insert(std::make_pair(Property, static_cast<iproperty*>(0))).first;\n\t\t\tm_delete_connections[Property].disconnect();\n\t\t\tm_delete_connections[Property] = Property->property_deleted_signal().connect(sigc::bind(sigc::mem_fun(*this, &implementation::on_property_deleted), Property));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/// Used to implement undo/redo state changes when pipeline connections are modified\n\tclass set_dependencies_container :\n\t\tpublic istate_container\n\t{\n\tpublic:\n\t\tset_dependencies_container(pipeline::implementation& Pipeline, const ipipeline::dependencies_t& Dependencies) :\n\t\t\tm_pipeline(Pipeline),\n\t\t\tm_dependencies(Dependencies)\n\t\t{\n\t\t}\n\n\t\t~set_dependencies_container()\n\t\t{\n\t\t}\n\n\t\tvoid restore_state()\n\t\t{\n\t\t\tm_pipeline.set_dependencies(m_dependencies);\n\t\t}\n\n\tprivate:\n\t\tpipeline::implementation& m_pipeline;\n\t\tipipeline::dependencies_t m_dependencies;\n\t};\n\n\t/// Used to implement undo/redo state changes when a pipeline property has been deleted\n\tclass delete_property_container :\n\t\tpublic istate_container\n\t{\n\tpublic:\n\t\tdelete_property_container(pipeline::implementation& Pipeline, iproperty* const Property) :\n\t\t\tm_pipeline(Pipeline),\n\t\t\tm_property(Property)\n\t\t{\n\t\t}\n\n\t\t~delete_property_container()\n\t\t{\n\t\t}\n\n\t\tvoid restore_state()\n\t\t{\n\t\t\tm_pipeline.on_property_deleted(m_property);\n\t\t}\n\n\tprivate:\n\t\tpipeline::implementation& m_pipeline;\n\t\tiproperty* const m_property;\n\t};\n\n\t/// Optionally records changes to the pipeline for undo/redo\n\tistate_recorder* const state_recorder;\n\t/// Stores the set of all property dependencies\n\tipipeline::dependencies_t dependencies;\n\t/// Defines storage for per-property signal connections\n\ttypedef std::map<iproperty*, sigc::connection> connections_t;\n\t/// Stores connections between property change signals (so a change to a source property is automatically passed-along to its dependent properties)\n\tconnections_t m_change_connections;\n\t/// Stores connections to property delete signals (so we can clean-up when a property goes away)\n\tconnections_t m_delete_connections;\n\t/// Signal that is emitted whenever the pipeline is modified\n\tipipeline::dependency_signal_t changed_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// pipeline\n\npipeline::pipeline(istate_recorder* StateRecorder) :\n\tm_implementation(new implementation(StateRecorder))\n{\n}\n\npipeline::~pipeline()\n{\n\tdelete m_implementation;\n}\n\nvoid pipeline::set_dependencies(dependencies_t& Dependencies, ihint* Hint)\n{\n\tm_implementation->set_dependencies(Dependencies, Hint);\n}\n\niproperty* pipeline::dependency(iproperty& Property)\n{\n\treturn Property.property_dependency();\n}\n\nconst ipipeline::dependencies_t& pipeline::dependencies()\n{\n\treturn m_implementation->dependencies;\n}\n\nipipeline::dependency_signal_t& pipeline::dependency_signal()\n{\n\treturn m_implementation->changed_signal;\n}\n\nvoid pipeline::clear()\n{\n\tm_implementation->clear();\n}\n\nvoid pipeline::connect(iproperty& From, iproperty& To)\n{\n\tdependencies_t dependencies;\n\tdependencies.insert(std::make_pair(&To, &From));\n\tset_dependencies(dependencies);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/pipeline.h",
    "content": "#ifndef K3DSDK_PIPELINE_H\n#define K3DSDK_PIPELINE_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ipipeline.h>\n\nnamespace k3d\n{\n\nclass istate_recorder;\n\n/////////////////////////////////////////////////////////////////////////////\n// pipeline\n\n/// Provides a concrete implementation of ipipeline that can be used to manage arbitrary connections between properties\nclass pipeline :\n\tpublic ipipeline,\n\tpublic sigc::trackable\n{\npublic:\n\t/// Initialize the pipeline with (optional) undo/redo suppport\n\tpipeline(istate_recorder* StateRecorder = 0);\n\t~pipeline();\n\n\t// ipipeline methods\n\tvoid set_dependencies(dependencies_t& Dependencies, ihint* Hint = 0);\n\tiproperty* dependency(iproperty& Property);\n\tconst dependencies_t& dependencies();\n\tdependency_signal_t& dependency_signal();\n\n\t/// Remove all pipeline connections (not undoable)\n\tvoid clear();\n\t/// Makes a connection between two properties\n\tvoid connect(iproperty& From, iproperty& To);\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_PIPELINE_H\n\n"
  },
  {
    "path": "k3dsdk/pipeline_data.h",
    "content": "#ifndef K3DSDK_PIPELINE_DATA_H\n#define K3DSDK_PIPELINE_DATA_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/types.h>\n\n#include <boost/shared_ptr.hpp>\n\nnamespace k3d\n{\n\ntemplate<typename T>\nclass pipeline_data_traits\n{\npublic:\n\tstatic T* create()\n\t{\n\t\treturn new T();\n\t}\n\n\tstatic T* clone(const T& Other)\n\t{\n\t\treturn new T(Other);\n\t}\n};\n\ntemplate<typename T>\nclass pipeline_data\n{\npublic:\n\ttypedef T value_type;\n\ttypedef T element_type;\n\n\tpipeline_data() :\n\t\toriginator(false)\n\t{\n\t}\n\n\tpipeline_data(const pipeline_data<T>& Other) :\n\t\tstorage(Other.storage),\n\t\toriginator(false)\n\t{\n\t}\n\n\tpipeline_data(T* Other) :\n\t\tstorage(Other),\n\t\toriginator(true)\n\t{\n\t}\n\n\tT& create()\n\t{\n\t\tstorage.reset(pipeline_data_traits<T>::create());\n\t\toriginator = storage.get() ? true : false;\n\t\treturn *storage;\n\t}\n\n\tT& create(T* Instance)\n\t{\n\t\tassert_critical(Instance);\n\t\tstorage.reset(Instance);\n\t\toriginator = storage.get() ? true : false;\n\t\treturn *storage;\n\t}\n\n\ttemplate<typename Y>\n\tT& create(Y* Instance)\n\t{\n\t\tstorage.reset(Instance);\n\t\toriginator = storage.get() ? true : false;\n\t\treturn *storage;\n\t}\n\n\tvoid reset()\n\t{\n\t\tstorage.reset();\n\t\toriginator = false;\n\t}\n\n\tconst T& operator*() const\n\t{\n\t\treturn *storage;\n\t}\n\n\tconst T* operator->() const\n\t{\n\t\treturn storage.operator->();\n\t}\n\n\tconst T* get() const\n\t{\n\t\treturn storage.get();\n\t}\n\n\tT& writable()\n\t{\n\t\tif(originator)\n\t\t\treturn *storage;\n\n\t\tstorage.reset(pipeline_data_traits<T>::clone(*storage));\n\t\toriginator = true;\n\t\treturn *storage;\n\t}\n\n\tlong use_count() const\n\t{\n\t\treturn storage.use_count();\n\t}\n\n\tpipeline_data& operator=(const pipeline_data& Other)\n\t{\n\t\tstorage = Other.storage;\n\t\toriginator = false;\n\t\treturn *this;\n\t}\n\n\toperator bool() const\n\t{\n\t\treturn static_cast<bool>(storage);\n\t}\n\n\tbool operator!() const\n\t{\n\t\treturn !storage;\n\t}\n\n\tbool_t operator==(const pipeline_data<T>& Other) const\n\t{\n\t\treturn storage.get() == Other.storage.get();\n\t}\n\n\tbool_t operator!=(const pipeline_data<T>& Other) const\n\t{\n\t\treturn storage.get() != Other.storage.get();\n\t}\n\nprivate:\n\ttypedef boost::shared_ptr<T> storage_type;\n\n\tstorage_type storage;\n\tbool_t originator;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_PIPELINE_DATA_H\n"
  },
  {
    "path": "k3dsdk/pipeline_profiler.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/high_res_timer.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/pipeline_profiler.h>\n\n#include <iomanip>\n#include <stack>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////\n// pipeline_profiler::implementation\n\nclass pipeline_profiler::implementation\n{\npublic:\n\tsigc::signal<void, inode&, const string_t&, double> node_execution_signal;\n\tstd::stack<timer> timers;\n\tstd::stack<double> adjustments;\n};\n\n/////////////////////////////////////////////////////////////////////\n// pipeline_profile\n\npipeline_profiler::pipeline_profiler() :\n\tm_implementation(new implementation())\n{\n}\n\npipeline_profiler::~pipeline_profiler()\n{\n\tdelete m_implementation;\n}\n\nvoid pipeline_profiler::start_execution(inode& Node, const string_t& Task)\n{\n\tm_implementation->timers.push(timer());\n\tm_implementation->adjustments.push(0.0);\n}\n\n/**\n * Start a pipeline profiler entry with an adjustment.\n * The adjustment value effectively moves the start forward in time.\n */\nvoid pipeline_profiler::start_execution(inode& Node, const string_t& Task, const double Adjustment)\n{\n\tm_implementation->timers.push(timer());\n\tm_implementation->adjustments.push(Adjustment);\n}\n\nvoid pipeline_profiler::finish_execution(inode& Node, const string_t& Task)\n{\n\treturn_if_fail(m_implementation->timers.size());\n\n\tconst double elapsed = m_implementation->timers.top().elapsed();\n\tconst double adjustment = m_implementation->adjustments.top();\n\tm_implementation->node_execution_signal.emit(Node, Task, elapsed - adjustment);\n\n\tm_implementation->timers.pop();\n\tm_implementation->adjustments.pop();\n\n\tif(m_implementation->adjustments.size())\n\t\tm_implementation->adjustments.top() += elapsed;\n}\n\n/**\n * Manually add a timing entry\n */\nvoid pipeline_profiler::add_timing_entry(inode& Node, const string_t& Task, const double TimingValue)\n{\n\tm_implementation->node_execution_signal.emit(Node, Task, TimingValue);\n}\n\nsigc::connection pipeline_profiler::connect_node_execution_signal(const sigc::slot<void, inode&, const string_t&, double>& Slot)\n{\n\treturn m_implementation->node_execution_signal.connect(Slot);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/pipeline_profiler.h",
    "content": "#ifndef K3DSDK_PIPELINE_PROFILER_H\n#define K3DSDK_PIPELINE_PROFILER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ipipeline_profiler.h>\n\nnamespace k3d\n{\n\n/// Concrete implementation of ipipeline_profiler that collects and distributes profiling data for the K-3D visualization pipeline\nclass pipeline_profiler :\n\tpublic ipipeline_profiler\n{\npublic:\n\tpipeline_profiler();\n\t~pipeline_profiler();\n\t\n\tvoid start_execution(inode& Node, const string_t& Task);\n\tvoid start_execution(inode& Node, const string_t& Task, const double Adjustment);\n\tvoid finish_execution(inode& Node, const string_t& Task);\n\tvoid add_timing_entry(inode& Node, const string_t& Task, const double TimingValue);\n\t\n\tsigc::connection connect_node_execution_signal(const sigc::slot<void, inode&, const string_t&, double>& Slot);\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_PIPELINE_PROFILER_H\n\n"
  },
  {
    "path": "k3dsdk/plane.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/plane.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// plane\n\nplane::plane(const vector3& Normal, const double Distance) :\n\tnormal(normalize(Normal)),\n\tdistance(Distance)\n{\n}\n\nplane::plane(const vector3& Normal, const point3& Point) :\n\tnormal(normalize(Normal)),\n\tdistance(-to_vector(Point) * normal)\n{\n}\n\nplane::plane(const point3& PointA, const point3& PointB, const point3& PointC) :\n\tnormal(normalize((PointA - PointB) ^ (PointC - PointB))),\n\tdistance(-to_vector(PointA) * normal)\n{\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const plane& RHS)\n{\n\tStream << RHS.normal << \" \" << RHS.distance;\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, plane& RHS)\n{\n\tStream >> RHS.normal >> RHS.distance;\n\treturn Stream;\n}\n\nconst plane operator*(const matrix4& Matrix, const plane& Plane)\n{\n\treturn plane(Matrix * Plane.normal, Matrix * to_point(Plane.distance * Plane.normal));\n}\n\nconst plane operator*(const plane& Plane, const matrix4& Matrix)\n{\n\treturn Matrix * Plane;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/plane.h",
    "content": "#ifndef K3DSDK_PLANE_H\n#define K3DSDK_PLANE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/vector3.h>\n\nnamespace k3d\n{\n\nclass matrix4;\nclass point3;\n\n/// Encapsulates a 3D plane surface\nclass plane\n{\npublic:\n\t/// Constructs a plane from its normal and distance from the origin\n\tplane(const vector3& Normal, const double Distance);\n\t/// Constructs a plane from its normal and one point located within the plane\n\tplane(const vector3& Normal, const point3& Point);\n\t/// Constructs a plane from three points contained within the plane\n\tplane(const point3& PointA, const point3& PointB, const point3& PointC);\n\n\t/// Stores the plane's normal vector\n\tvector3 normal;\n\t/// Stores the plane's distance from the origin\n\tdouble distance;\n};\n\nstd::ostream& operator<<(std::ostream& Stream, const plane& RHS);\nstd::istream& operator>>(std::istream& Stream, plane& RHS);\n\n/// Linear transformation if a plane by a transformation matrix\nconst plane operator*(const matrix4& Matrix, const plane& Plane);\n/// Linear transformation if a plane by a transformation matrix\nconst plane operator*(const plane& Plane, const matrix4& Matrix);\n\n} // namespace k3d\n\n#endif // !K3DSDK_PLANE_H\n\n"
  },
  {
    "path": "k3dsdk/plugin.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iapplication_plugin_factory.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iplugin_factory_collection.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/mime_types.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/register_plugin_factories.h>\n#include <k3dsdk/utility.h>\n\n#include <boost/tokenizer.hpp>\n\nnamespace k3d\n{\n\n///////////////////////////////////////////////////////////////////////////////////\n// sort_by_name\n\nbool_t sort_by_name::operator()(iplugin_factory* LHS, iplugin_factory* RHS)\n{\n\treturn LHS->name() < RHS->name();\n}\n\nbool_t sort_by_name::operator()(inode* LHS, inode* RHS)\n{\n\treturn LHS->name() < RHS->name();\n}\n\nnamespace plugin\n{\n\nnamespace detail\n{\n\niunknown* create_application_plugin(const k3d::string_t& Plugin)\n{\n\tiplugin_factory* const plugin_factory = plugin::factory::lookup(Plugin);\n\tif(!plugin_factory)\n\t{\n\t\tlog() << error << \"No plugin factory [\" << Plugin << \"]\" << std::endl;\n\t}\n\telse\n\t{\n\t\treturn detail::create_application_plugin(*plugin_factory);\n\t}\n\n\treturn 0;\n}\n\niunknown* create_application_plugin(iplugin_factory& Factory)\n{\n\tif(iapplication_plugin_factory* const application_plugin_factory = dynamic_cast<iapplication_plugin_factory*>(&Factory))\n\t{\n\t\tif(iunknown* const unknown = application_plugin_factory->create_plugin())\n\t\t{\n\t\t\treturn unknown;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog() << error << \"Couldn't create application plugin [\" << Factory.name() << \"]\" << std::endl;\n\t\t}\n\t}\n\telse\n\t{\n\t\tlog() << error << \"Not an application plugin factory [\" << Factory.name() << \"]\" << std::endl;\n\t}\n\n\treturn 0;\n}\n\niunknown* create_application_plugin(const uuid& ClassID)\n{\n\tif(iplugin_factory* const plugin_factory = plugin::factory::lookup(ClassID))\n\t{\n\t\treturn create_application_plugin(*plugin_factory);\n\t}\n\telse\n\t{\n\t\tlog() << error << \"No plugin factory [\" << ClassID << \"]\" << std::endl;\n\t}\n\n\treturn 0;\n}\n\ninode* create_document_plugin(const k3d::string_t& Plugin, idocument& Document, const k3d::string_t& Name)\n{\n\tk3d::iplugin_factory* const plugin_factory = plugin::factory::lookup(Plugin);\n\tif(!plugin_factory)\n\t{\n\t\tlog() << error << \"No plugin factory [\" << Plugin << \"]\" << std::endl;\n\t}\n\telse\n\t{\n\t\treturn create_document_plugin(*plugin_factory, Document, Name);\n\t}\n\n\treturn 0;\n}\n\ninode* create_document_plugin(iplugin_factory& Factory, idocument& Document, const k3d::string_t& Name)\n{\n\tif(idocument_plugin_factory* const document_plugin_factory = dynamic_cast<idocument_plugin_factory*>(&Factory))\n\t{\n\t\tif(inode* const object = document_plugin_factory->create_plugin(Factory, Document))\n\t\t{\n\t\t\treturn object;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog() << error << \"Couldn't create document plugin [\" << Factory.name() << \"]\" << std::endl;\n\t\t}\n\t}\n\telse\n\t{\n\t\tlog() << error << \"Not a document plugin factory [\" << Factory.name() << \"]\" << std::endl;\n\t}\n\n\treturn 0;\n}\n\ninode* create_document_plugin(const uuid& ClassID, idocument& Document, const k3d::string_t& Name)\n{\n\tif(iplugin_factory* const plugin_factory = plugin::factory::lookup(ClassID))\n\t{\n\t\treturn create_document_plugin(*plugin_factory, Document, Name);\n\t}\n\telse\n\t{\n\t\tlog() << error << \"No plugin factory [\" << ClassID << \"]\" << std::endl;\n\t}\n\n\treturn 0;\n}\n\n} // namespace detail\n\nnamespace factory\n{\n\nstatic collection_t g_factories;\n\nconst collection_t lookup()\n{\n\treturn g_factories;\n}\n\niplugin_factory* lookup(const uuid& ID)\n{\n\tfor(collection_t::const_iterator factory = g_factories.begin(); factory != g_factories.end(); ++factory)\n\t{\n\t\tif((*factory)->factory_id() == ID)\n\t\t\treturn *factory;\n\t}\n\n\treturn 0;\n}\n\niplugin_factory* lookup(const k3d::string_t& Name)\n{\n\tcollection_t results;\n\tfor(collection_t::const_iterator factory = g_factories.begin(); factory != g_factories.end(); ++factory)\n\t{\n\t\tif((*factory)->name() == Name)\n\t\t\tresults.push_back(*factory);\n\t}\n\n\tswitch(results.size())\n\t{\n\t\tcase 0:\n\t\t\treturn 0;\n\t\tcase 1:\n\t\t\treturn *results.begin();\n\t\tdefault:\n\t\t\tk3d::log() << error << \"Multiple plugin factories with name [\" << Name << \"]\" << std::endl;\n\t\t\treturn 0;\n\t}\n}\n\nconst collection_t lookup(const string_t& MetadataName, const string_t& MetadataValue)\n{\n\tcollection_t results;\n\n\tfor(collection_t::const_iterator factory = g_factories.begin(); factory != g_factories.end(); ++factory)\n\t{\n\t\tconst iplugin_factory::metadata_t metadata = (**factory).metadata();\n\n\t\tiplugin_factory::metadata_t::const_iterator pair = metadata.find(MetadataName);\n\t\tif(pair == metadata.end())\n\t\t\tcontinue;\n\n\t\tif(pair->second != MetadataValue)\n\t\t\tcontinue;\n\n\t\tresults.push_back(*factory);\n\t}\n\n\treturn results;\n}\n\nconst collection_t lookup(const std::type_info& Interface)\n{\n\tcollection_t results;\n\tfor(collection_t::const_iterator factory = g_factories.begin(); factory != g_factories.end(); ++factory)\n\t{\n\t\tif((*factory)->implements(Interface) == false)\n\t\t\tcontinue;\n\n\t\tresults.push_back(*factory);\n\t}\n\n\treturn results;\n}\n\nconst collection_t lookup(const mime::type& Type)\n{\n\tcollection_t results;\n\tfor(collection_t::const_iterator factory = g_factories.begin(); factory != g_factories.end(); ++factory)\n\t{\n\t\tk3d::iplugin_factory::metadata_t metadata = (**factory).metadata();\n\t\tconst string_t mime_types = metadata[\"k3d:mime-types\"];\n\n\t\ttypedef boost::char_separator<char> separator_t;\n\t\tseparator_t separator(\" \");\n\n\t\ttypedef boost::tokenizer<separator_t> tokenizer_t; \n\t\ttokenizer_t tokenizer(mime_types, separator);\n\n\t\tfor(tokenizer_t::const_iterator mime_type = tokenizer.begin(); mime_type != tokenizer.end(); ++mime_type)\n\t\t{\n\t\t\tif(Type == *mime_type)\n\t\t\t{\n\t\t\t\tresults.push_back(*factory);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n}\n\nconst collection_t lookup(const std::type_info& Interface, const mime::type& Type)\n{\n\tcollection_t results;\n\tfor(collection_t::const_iterator factory = g_factories.begin(); factory != g_factories.end(); ++factory)\n\t{\n\t\tif((*factory)->implements(Interface) == false)\n\t\t\tcontinue;\n\n\t\tk3d::iplugin_factory::metadata_t metadata = (**factory).metadata();\n\t\tconst string_t mime_types = metadata[\"k3d:mime-types\"];\n\n\t\ttypedef boost::char_separator<char> separator_t;\n\t\tseparator_t separator(\" \");\n\n\t\ttypedef boost::tokenizer<separator_t> tokenizer_t; \n\t\ttokenizer_t tokenizer(mime_types, separator);\n\n\t\tfor(tokenizer_t::const_iterator mime_type = tokenizer.begin(); mime_type != tokenizer.end(); ++mime_type)\n\t\t{\n\t\t\tif(Type == *mime_type)\n\t\t\t{\n\t\t\t\tresults.push_back(*factory);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n}\n\n} // namespace factory\n\n} // namespace plugin\n\nvoid register_plugin_factories(iplugin_factory_collection& Collection)\n{\n\tplugin::factory::g_factories.insert(plugin::factory::g_factories.end(), Collection.factories().begin(), Collection.factories().end());\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/plugin.h",
    "content": "#ifndef K3DSDK_PLUGIN_H\n#define K3DSDK_PLUGIN_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/plugins_detail.h>\n#include <k3dsdk/types.h>\n\n#include <vector>\n#include <typeinfo>\n\n\nnamespace k3d\n{\n\nclass inode;\nclass iplugin_factory;\nclass uuid;\n\nnamespace mime { class type; }\n\n/// Convenience functor for sorting factory collections and nodes alphabetically by name.\nstruct sort_by_name\n{\n\tbool_t operator()(iplugin_factory* LHS, iplugin_factory* RHS);\n\tbool_t operator()(inode* LHS, inode* RHS);\n};\n\nnamespace plugin\n{\n\nnamespace factory\n{\n\n/// Defines storage for a collection of plugin factories\ntypedef std::vector<iplugin_factory*> collection_t;\n\n/// Returns the set of all available plugin factories.\nconst collection_t lookup();\n/// Returns the plugin factory that implements a specific factory ID, or NULL.\niplugin_factory* lookup(const uuid& ID);\n/// Returns the plugin factory that matches the given name, or NULL.  Note: returns NULL if more than one factory matches Name.\niplugin_factory* lookup(const string_t& Name);\n/// Returns the set of plugin factories that match the given metadata name-value pair.\nconst collection_t lookup(const string_t& MetadataName, const string_t& MetadataValue);\n/// Returns the set of plugin factories that implement a specific interface.\nconst collection_t lookup(const std::type_info& Interface);\n/// Returns the set of plugin factories that implement a specific interface.\ntemplate<typename interface_t>\nconst collection_t lookup()\n{\n\treturn lookup(typeid(interface_t));\n}\n/// Returns the set of plugin factories that match a MIME type.\nconst collection_t lookup(const mime::type& Type);\n/// Returns the set of plugin factories that implement a specific interface and match a MIME type.\nconst collection_t lookup(const std::type_info& Interface, const mime::type& Type);\n/// Returns the set of plugin factories that implement a specific interface and match a MIME type.\ntemplate<typename interface_t>\nconst collection_t lookup(const mime::type& Type)\n{\n\treturn lookup(typeid(interface_t), Type);\n}\n\n} // namespace factory\n\n/// Creates an application plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ntemplate<typename interface_t> interface_t* create(const string_t& FactoryName)\n{\n\tif(iunknown* const unknown = detail::create_application_plugin(FactoryName))\n\t{\n\t\tif(interface_t* const result = dynamic_cast<interface_t*>(unknown))\n\t\t{\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog() << error << \"Plugin doesn't implement interface: \" << FactoryName << std::endl;\n\t\t}\n\n\t\tdelete unknown;\n\t}\n\n\treturn 0;\n}\n\n/// Creates an application plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ntemplate<typename interface_t> interface_t* create(iplugin_factory& Factory)\n{\n\tif(iunknown* const unknown = detail::create_application_plugin(Factory))\n\t{\n\t\tif(interface_t* const result = dynamic_cast<interface_t*>(unknown))\n\t\t{\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog() << error << \"Plugin doesn't implement interface: \" << Factory.name() << std::endl;\n\t\t}\n\n\t\tdelete unknown;\n\t}\n\n\treturn 0;\n}\n\n/// Creates an application plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ntemplate<typename interface_t> interface_t* create(const uuid& FactoryID)\n{\n\tif(iunknown* const unknown = detail::create_application_plugin(FactoryID))\n\t{\n\t\tif(interface_t* const result = dynamic_cast<interface_t*>(unknown))\n\t\t{\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog() << error << \"Plugin doesn't implement interface: \" << FactoryID << std::endl;\n\t\t}\n\n\t\tdelete unknown;\n\t}\n\n\treturn 0;\n}\n\n/// Creates an application plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ninline iunknown* create(const string_t& FactoryName)\n{\n\treturn detail::create_application_plugin(FactoryName);\n}\n\n/// Creates an application plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ninline iunknown* create(iplugin_factory& Factory)\n{\n\treturn detail::create_application_plugin(Factory);\n}\n\n/// Creates an application plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ninline iunknown* create(const uuid& FactoryID)\n{\n\treturn detail::create_application_plugin(FactoryID);\n}\n\n/// Creates a document plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ntemplate<typename interface_t> interface_t* create(const string_t& FactoryName, idocument& Document, const string_t& Name = string_t())\n{\n\tif(inode* const node = detail::create_document_plugin(FactoryName, Document, Name))\n\t{\n\t\tif(interface_t* const result = dynamic_cast<interface_t*>(node))\n\t\t{\n\t\t\tnode->set_name(Name);\n\t\t\tundoable_new(node, Document);\n\t\t\tDocument.nodes().add_nodes(make_collection<inode_collection::nodes_t>(node));\n\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog() << error << \"Plugin doesn't implement interface: \" << FactoryName << std::endl;\n\t\t}\n\n\t\tdelete node;\n\t}\n\n\treturn 0;\n}\n\n/// Creates a document plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ntemplate<typename interface_t> interface_t* create(iplugin_factory& Factory, idocument& Document, const string_t& Name = string_t())\n{\n\tif(inode* const node = detail::create_document_plugin(Factory, Document, Name))\n\t{\n\t\tif(interface_t* const result = dynamic_cast<interface_t*>(node))\n\t\t{\n\t\t\tnode->set_name(Name);\n\t\t\tundoable_new(node, Document);\n\t\t\tDocument.nodes().add_nodes(make_collection<inode_collection::nodes_t>(node));\n\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog() << error << \"Plugin doesn't implement interface: \" << Factory.name() << std::endl;\n\t\t}\n\n\t\tdelete node;\n\t}\n\n\treturn 0;\n}\n\n/// Creates a document plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ntemplate<typename interface_t> interface_t* create(const uuid& FactoryID, idocument& Document, const string_t& Name = string_t())\n{\n\tif(inode* const node = detail::create_document_plugin(FactoryID, Document, Name))\n\t{\n\t\tif(interface_t* const result = dynamic_cast<interface_t*>(node))\n\t\t{\n\t\t\tnode->set_name(Name);\n\t\t\tundoable_new(node, Document);\n\t\t\tDocument.nodes().add_nodes(make_collection<inode_collection::nodes_t>(node));\n\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog() << error << \"Plugin doesn't implement interface: \" << FactoryID << std::endl;\n\t\t}\n\n\t\tdelete node;\n\t}\n\n\treturn 0;\n}\n\n/// Creates a document plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ninline iunknown* create(const string_t& FactoryName, idocument& Document, const string_t& Name = string_t())\n{\n\tif(inode* const node = detail::create_document_plugin(FactoryName, Document, Name))\n\t{\n\t\tnode->set_name(Name);\n\t\tundoable_new(node, Document);\n\t\tDocument.nodes().add_nodes(make_collection<inode_collection::nodes_t>(node));\n\n\t\treturn node;\n\t}\n\n\treturn 0;\n}\n\n/// Creates a document plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ninline iunknown* create(iplugin_factory& Factory, idocument& Document, const string_t& Name = string_t())\n{\n\tif(inode* const node = detail::create_document_plugin(Factory, Document, Name))\n\t{\n\t\tnode->set_name(Name);\n\t\tundoable_new(node, Document);\n\t\tDocument.nodes().add_nodes(make_collection<inode_collection::nodes_t>(node));\n\n\t\treturn node;\n\t}\n\n\treturn 0;\n}\n\n/// Creates a document plugin, returning the requested interface if implemented, otherwise NULL (cleans-up on failure)\ninline iunknown* create(const uuid& FactoryID, idocument& Document, const string_t& Name = string_t())\n{\n\tif(inode* const node = detail::create_document_plugin(FactoryID, Document, Name))\n\t{\n\t\tnode->set_name(Name);\n\t\tundoable_new(node, Document);\n\t\tDocument.nodes().add_nodes(make_collection<inode_collection::nodes_t>(node));\n\n\t\treturn node;\n\t}\n\n\treturn 0;\n}\n\n} // namespace plugin\n\n} // namespace k3d\n\n#endif // !K3DSDK_PLUGIN_H\n\n"
  },
  {
    "path": "k3dsdk/plugin_factory.cpp",
    "content": "// K3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/plugin_factory.h>\n#include <k3dsdk/result.h>\n\n#include <boost/tokenizer.hpp>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// plugin_factory\n\nplugin_factory::plugin_factory(const uuid& FactoryID, const std::string& Name, const std::string& ShortDescription, const std::string& Categories, const quality_t Quality, const metadata_t& Metadata) :\n\tm_factory_id(FactoryID),\n\tm_name(Name),\n\tm_short_description(ShortDescription),\n\tm_quality(Quality),\n\tm_metadata(Metadata)\n{\n\tassert(m_factory_id != k3d::uuid::null());\n\n\ttypedef boost::tokenizer<boost::char_separator<char> > tokenizer_t;\n\tboost::char_separator<char> separator;\n\ttokenizer_t tokenizer(Categories, separator);\n\tstd::copy(tokenizer.begin(), tokenizer.end(), std::back_inserter(m_categories));\n}\n\nconst uuid& plugin_factory::factory_id()\n{\n\treturn m_factory_id;\n}\n\nconst std::string plugin_factory::name()\n{\n\treturn m_name;\n}\n\nconst std::string plugin_factory::short_description()\n{\n\treturn m_short_description;\n}\n\nconst iplugin_factory::categories_t& plugin_factory::categories()\n{\n\treturn m_categories;\n}\n\nk3d::iplugin_factory::quality_t plugin_factory::quality()\n{\n\treturn m_quality;\n}\n\nk3d::iplugin_factory::metadata_t plugin_factory::metadata()\n{\n\treturn m_metadata;\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const iplugin_factory::quality_t& RHS)\n{\n\tswitch(RHS)\n\t{\n\t\tcase iplugin_factory::STABLE:\n\t\t\tStream << \"stable\";\n\t\t\tbreak;\n\t\tcase iplugin_factory::EXPERIMENTAL:\n\t\t\tStream << \"experimental\";\n\t\t\tbreak;\n\t\tcase iplugin_factory::DEPRECATED:\n\t\t\tStream << \"deprecated\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tassert_not_reached();\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, iplugin_factory::quality_t& RHS)\n{\n\tstd::string c;\n\tStream >> c;\n\n\tif(\"stable\" == c)\n\t\tRHS = iplugin_factory::STABLE;\n\telse if(\"experimental\" == c)\n\t\tRHS = iplugin_factory::EXPERIMENTAL;\n\telse if(\"deprecated\" == c)\n\t\tRHS = iplugin_factory::DEPRECATED;\n\telse\n\t\tlog() << error << error << \"Could not extract value [\" << c << \"]\" << std::endl;\n\t\t\n\treturn Stream;\n}\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/plugin_factory.h",
    "content": "#ifndef K3DSDK_PLUGIN_FACTORY_H\n#define K3DSDK_PLUGIN_FACTORY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/uuid.h>\n\n#include <string>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// plugin_factory\n\n/// Provides a boilerplate implementation of iplugin_factory\nclass plugin_factory :\n\tpublic iplugin_factory\n{\npublic:\n\tplugin_factory(const uuid& FactoryID, const std::string& Name, const std::string& ShortDescription, const std::string& Categories, const quality_t Quality, const metadata_t& Metadata = metadata_t());\n\n\tconst uuid& factory_id();\n\tconst std::string name();\n\tconst std::string short_description();\n\tconst categories_t& categories();\n\tquality_t quality();\n\tmetadata_t metadata();\n\nprivate:\n\tconst uuid m_factory_id;\n\tconst std::string m_name;\n\tconst std::string m_short_description;\n\tcategories_t m_categories;\n\tconst quality_t m_quality;\n\tconst metadata_t m_metadata;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_PLUGIN_FACTORY_H\n\n"
  },
  {
    "path": "k3dsdk/plugin_factory_collection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/iapplication_plugin_factory.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iplugin_registry.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/os_load_module.h>\n#include <k3dsdk/plugin_factory_collection.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/string_modifiers.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/xml.h>\n\n#include <iostream>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// same_factory_id\n\nclass same_factory_id\n{\npublic:\n\tsame_factory_id(const uuid& FactoryID) :\n\t\tm_factory_id(FactoryID)\n\t{\n\t}\n\n\tbool operator()(iplugin_factory* Factory) const\n\t{\n\t\treturn Factory->factory_id() == m_factory_id;\n\t}\n\nprivate:\n\tconst uuid m_factory_id;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// same_name\n\nclass same_name\n{\npublic:\n\tsame_name(const std::string& Name) :\n\t\tm_name(Name)\n\t{\n\t}\n\n\tbool operator()(iplugin_factory* Factory) const\n\t{\n\t\treturn Factory->name() == m_name;\n\t}\n\nprivate:\n\tconst std::string m_name;\n};\n\ntypedef sigc::signal<void, const std::string&> message_signal_t;\n\n/////////////////////////////////////////////////////////////////////////////\n// plugin_registry\n\n/// Implements iplugin_registry, allowing modules to register new plugin factories, which are pushed into two collections - a set of all plugin factories, and a set of factories for the given module\nclass plugin_registry :\n\tpublic iplugin_registry\n{\npublic:\n\tplugin_registry(message_signal_t& MessageSignal, iplugin_factory_collection::factories_t& Factories) :\n\t\tm_message_signal(MessageSignal),\n\t\tm_factories(Factories)\n\t{\n\t}\n\n\tvoid register_factory(iplugin_factory& Factory)\n\t{\n\t\tm_message_signal.emit(string_cast(boost::format(_(\"Loading plugin %1%\")) % Factory.name()));\n\n\t\t// Ensure we don't have any duplicate class IDs ...\n\t\tif(std::count_if(m_factories.begin(), m_factories.end(), same_factory_id(Factory.factory_id())))\n\t\t{\n\t\t\tlog() << error << \"Plugin factory [\" << Factory.name() << \"] with duplicate factory ID [\" << Factory.factory_id() << \"] will not be registered.\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\t// Warn if we have duplicate names ...\n\t\tif(std::count_if(m_factories.begin(), m_factories.end(), same_name(Factory.name())))\n\t\t{\n\t\t\tlog() << error << \"Plugin factory [\" << Factory.factory_id() << \"] with duplicate name [\" << Factory.name() << \"] will not be registered.\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\t// Stash that baby!\n\t\tm_factories.insert(&Factory);\n\t}\n\nprivate:\n\tmessage_signal_t& m_message_signal;\n\tiplugin_factory_collection::factories_t& m_factories;\n};\n\n/// Stores a mapping of plugin class id to plugin factory, so we can lookup recently-loaded factories quickly\nstd::map<uuid, iplugin_factory*> proxied_factories;\n/// Stores a mapping of plugin class id to plugin module path, so we can load modules that were proxied\nstd::map<uuid, filesystem::path> proxied_modules;\n\niplugin_factory* load_proxied_factory(const uuid& FactoryID)\n{\n\t// See if this factory has been loaded ...\n\tif(proxied_factories.count(FactoryID) && proxied_factories[FactoryID])\n\t\treturn proxied_factories[FactoryID];\n\n\t// OK, just load the module already!\n\tregister_plugins_entry_point register_plugins = 0;\n\tos_load_module(proxied_modules[FactoryID], register_plugins);\n\n\tif(!register_plugins)\n\t\treturn 0;\n\n\t// It's a K-3D module, all-right - give it a chance to register its plugins\n\tlog() << info << \"Loading plugin module \" << proxied_modules[FactoryID].native_console_string() << std::endl;\n\n\tmessage_signal_t message_signal;\n\tiplugin_factory_collection::factories_t factories;\n\tplugin_registry registry(message_signal, factories);\n\tregister_plugins(registry);\n\tfor(iplugin_factory_collection::factories_t::iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t\tproxied_factories[(*factory)->factory_id()] = (*factory);\n\n\treturn proxied_factories[FactoryID];\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// application_plugin_factory_proxy\n\n/// Proxies plugin factories so we can delay loading shared libraries at runtime until they're needed\nclass application_plugin_factory_proxy :\n\tpublic iplugin_factory,\n\tpublic iapplication_plugin_factory\n{\npublic:\n\tapplication_plugin_factory_proxy(const uuid& FactoryID, const std::string& Name, const std::string& ShortDescription, const iplugin_factory::categories_t& Categories, const iplugin_factory::quality_t Quality, const iplugin_factory::interfaces_t& Interfaces, const iplugin_factory::metadata_t& Metadata) :\n\t\tm_factory(0),\n\t\tm_application_factory(0),\n\t\tm_factory_id(FactoryID),\n\t\tm_name(Name),\n\t\tm_short_description(ShortDescription),\n\t\tm_categories(Categories),\n\t\tm_quality(Quality),\n\t\tm_interfaces(Interfaces),\n\t\tm_metadata(Metadata)\n\t{\n\t}\n\n\tconst uuid& factory_id()\n\t{\n\t\treturn m_factory_id;\n\t}\n\n\tconst std::string name()\n\t{\n\t\treturn m_name;\n\t}\n\n\tconst std::string short_description()\n\t{\n\t\treturn m_short_description;\n\t}\n\n\tconst categories_t& categories()\n\t{\n\t\treturn m_categories;\n\t}\n\n\tquality_t quality()\n\t{\n\t\treturn m_quality;\n\t}\n\n\tbool implements(const std::type_info& InterfaceType)\n\t{\n\t\tfor(iplugin_factory::interfaces_t::const_iterator iface = m_interfaces.begin(); iface != m_interfaces.end(); ++iface)\n\t\t{\n\t\t\tif((**iface) == InterfaceType)\n\t\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tconst interfaces_t interfaces()\n\t{\n\t\treturn m_interfaces;\n\t}\n\n\tmetadata_t metadata()\n\t{\n\t\treturn m_metadata;\n\t}\n\n\tiunknown* create_plugin()\n\t{\n\t\tif(!m_factory)\n\t\t{\n\t\t\tm_factory = load_proxied_factory(m_factory_id);\n\t\t\tif(!m_factory)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Couldn't load proxied factory for plugin: \" << name() << std::endl;\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\tif(!m_application_factory)\n\t\t{\n\t\t\tm_application_factory = dynamic_cast<iapplication_plugin_factory*>(m_factory);\n\t\t\tif(!m_application_factory)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Not an application plugin factory: \" << name() << std::endl;\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\treturn m_application_factory->create_plugin();\n\t}\n\nprivate:\n\tiplugin_factory* m_factory;\n\tiapplication_plugin_factory* m_application_factory;\n\n\tconst uuid m_factory_id;\n\tconst std::string m_name;\n\tconst std::string m_short_description;\n\tconst iplugin_factory::categories_t m_categories;\n\tconst iplugin_factory::quality_t m_quality;\n\tconst iplugin_factory::interfaces_t m_interfaces;\n\tconst iplugin_factory::metadata_t m_metadata;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// document_plugin_factory_proxy\n\n/// Proxies plugin factories so we can delay loading shared libraries at runtime until they're needed\nclass document_plugin_factory_proxy :\n\tpublic iplugin_factory,\n\tpublic idocument_plugin_factory\n{\npublic:\n\tdocument_plugin_factory_proxy(const uuid& FactoryID, const std::string& Name, const std::string& ShortDescription, const iplugin_factory::categories_t& Categories, const iplugin_factory::quality_t Quality, const iplugin_factory::interfaces_t& Interfaces, const iplugin_factory::metadata_t& Metadata) :\n\t\tm_factory(0),\n\t\tm_document_factory(0),\n\t\tm_factory_id(FactoryID),\n\t\tm_name(Name),\n\t\tm_short_description(ShortDescription),\n\t\tm_categories(Categories),\n\t\tm_quality(Quality),\n\t\tm_interfaces(Interfaces),\n\t\tm_metadata(Metadata)\n\t{\n\t}\n\n\tconst uuid& factory_id()\n\t{\n\t\treturn m_factory_id;\n\t}\n\n\tconst std::string name()\n\t{\n\t\treturn m_name;\n\t}\n\n\tconst std::string short_description()\n\t{\n\t\treturn m_short_description;\n\t}\n\n\tconst categories_t& categories()\n\t{\n\t\treturn m_categories;\n\t}\n\n\tquality_t quality()\n\t{\n\t\treturn m_quality;\n\t}\n\n\tbool implements(const std::type_info& InterfaceType)\n\t{\n\t\tfor(iplugin_factory::interfaces_t::const_iterator iface = m_interfaces.begin(); iface != m_interfaces.end(); ++iface)\n\t\t{\n\t\t\tif((**iface) == InterfaceType)\n\t\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tconst interfaces_t interfaces()\n\t{\n\t\treturn m_interfaces;\n\t}\n\n\tmetadata_t metadata()\n\t{\n\t\treturn m_metadata;\n\t}\n\n\tinode* create_plugin(iplugin_factory& Factory, idocument& Document)\n\t{\n\t\tif(!m_factory)\n\t\t{\n\t\t\tm_factory = load_proxied_factory(m_factory_id);\n\t\t\tif(!m_factory)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Couldn't load proxied factory for plugin: \" << name() << std::endl;\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\tif(!m_document_factory)\n\t\t{\n\t\t\tm_document_factory = dynamic_cast<idocument_plugin_factory*>(m_factory);\n\t\t\tif(!m_document_factory)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Not a document plugin factory: \" << name() << std::endl;\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\treturn m_document_factory->create_plugin(Factory, Document);\n\t}\n\nprivate:\n\tiplugin_factory* m_factory;\n\tidocument_plugin_factory* m_document_factory;\n\n\tconst uuid m_factory_id;\n\tconst std::string m_name;\n\tconst std::string m_short_description;\n\tconst iplugin_factory::categories_t m_categories;\n\tconst iplugin_factory::quality_t m_quality;\n\tconst iplugin_factory::interfaces_t m_interfaces;\n\tconst iplugin_factory::metadata_t m_metadata;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// plugin_factory_collection::implementation\n\nstruct plugin_factory_collection::implementation\n{\n\tbool proxy_module(const filesystem::path& Path, const filesystem::path& ProxyPath)\n\t{\n\t\tm_message_signal.emit(string_cast(boost::format(_(\"Proxying plugin module %1%\")) % Path.native_utf8_string().raw()));\n\n\t\ttry\n\t\t{\n\t\t\tfilesystem::ifstream proxy_stream(ProxyPath);\n\t\t\txml::element xml_document;\n\t\t\tproxy_stream >> xml_document;\n\n\t\t\tif(xml_document.name != \"k3dml\")\n\t\t\t\tthrow std::runtime_error(\"Not a k3dml document\");\n\n\t\t\txml::element* const xml_module = xml::find_element(xml_document, \"module\");\n\t\t\tif(!xml_module)\n\t\t\t\tthrow std::runtime_error(\"Missing <module> tag\");\n\n\t\t\txml::element* const xml_plugins = xml::find_element(*xml_module, \"plugins\");\n\t\t\tif(!xml_plugins)\n\t\t\t\tthrow std::runtime_error(\"Missing <plugins> tag\");\n\n\t\t\tfor(xml::element::elements_t::iterator xml_plugin = xml_plugins->children.begin(); xml_plugin != xml_plugins->children.end(); ++xml_plugin)\n\t\t\t{\n\t\t\t\tif(xml_plugin->name != \"plugin\")\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst std::string factory_name = xml::attribute_text(*xml_plugin, \"name\");\n\t\t\t\tm_message_signal.emit(string_cast(boost::format(_(\"Proxying plugin %1%\")) % factory_name));\n\n\t\t\t\tconst uuid plugin_factory_id = xml::attribute_value<uuid>(*xml_plugin, \"factory_id\", uuid::null());\n\t\t\t\tif(plugin_factory_id == uuid::null())\n\t\t\t\t{\n\t\t\t\t\tlog() << error << \"Plugin \" << factory_name << \" with missing factory ID will not be loaded\" << std::endl;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Ensure we don't have any duplicate factory IDs ...\n\t\t\t\tif(std::count_if(m_factories.begin(), m_factories.end(), detail::same_factory_id(plugin_factory_id)))\n\t\t\t\t{\n\t\t\t\t\tlog() << error << \"Plugin \" << factory_name << \" with duplicate factory ID \" << plugin_factory_id << \" will not be loaded\" << std::endl;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Warn if we have duplicate names ...\n\t\t\t\tif(std::count_if(m_factories.begin(), m_factories.end(), detail::same_name(factory_name)))\n\t\t\t\t{\n\t\t\t\t\tlog() << error << \"Plugin factory [\" << plugin_factory_id << \"] with duplicate name [\" << factory_name << \"] will not be loaded.\" << std::endl;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst std::string plugin_short_description = xml::element_text(*xml_plugin, \"short_description\");\n\t\t\t\tconst iplugin_factory::quality_t plugin_quality = xml::attribute_value<iplugin_factory::quality_t>(*xml_plugin, \"quality\", iplugin_factory::EXPERIMENTAL);\n\t\t\t\tconst std::string plugin_type = xml::attribute_text(*xml_plugin, \"type\");\n\n\t\t\t\tiplugin_factory::categories_t plugin_categories;\n\t\t\t\tif(xml::element* const xml_categories = xml::find_element(*xml_plugin, \"categories\"))\n\t\t\t\t{\n\t\t\t\t\tfor(xml::element::elements_t::iterator xml_category = xml_categories->children.begin(); xml_category != xml_categories->children.end(); ++xml_category)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(xml_category->name != \"category\")\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tplugin_categories.push_back(xml_category->text);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tiplugin_factory::interfaces_t plugin_interfaces;\n\t\t\t\tif(xml::element* const xml_interfaces = xml::find_element(*xml_plugin, \"interfaces\"))\n\t\t\t\t{\n\t\t\t\t\tfor(xml::element::elements_t::iterator xml_interface = xml_interfaces->children.begin(); xml_interface != xml_interfaces->children.end(); ++xml_interface)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(xml_interface->name != \"interface\")\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tplugin_interfaces.push_back(type_id(xml_interface->text));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tplugin_interfaces.erase(std::find(plugin_interfaces.begin(), plugin_interfaces.end(), static_cast<std::type_info*>(0)), plugin_interfaces.end());\n\n\t\t\t\tiplugin_factory::metadata_t metadata;\n\t\t\t\tif(xml::element* const xml_metadata = xml::find_element(*xml_plugin, \"metadata\"))\n\t\t\t\t{\n\t\t\t\t\tfor(xml::element::elements_t::iterator xml_pair = xml_metadata->children.begin(); xml_pair != xml_metadata->children.end(); ++xml_pair)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(xml_pair->name != \"pair\")\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tmetadata.insert(std::make_pair(xml::attribute_text(*xml_pair, \"name\"), xml::attribute_text(*xml_pair, \"value\")));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(plugin_type == \"application\")\n\t\t\t\t{\n\t\t\t\t\tm_factories.insert(new detail::application_plugin_factory_proxy(plugin_factory_id, factory_name, plugin_short_description, plugin_categories, plugin_quality, plugin_interfaces, metadata));\n\t\t\t\t}\n\t\t\t\telse if(plugin_type == \"document\")\n\t\t\t\t{\n\t\t\t\t\tm_factories.insert(new detail::document_plugin_factory_proxy(plugin_factory_id, factory_name, plugin_short_description, plugin_categories, plugin_quality, plugin_interfaces, metadata));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlog() << error << \"Unknown plugin factory type \" << plugin_type << \" will be ignored\" << std::endl;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tdetail::proxied_modules[plugin_factory_id] = Path;\n\t\t\t\tdetail::proxied_factories[plugin_factory_id] = 0;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tlog() << error << \"Error proxying plugin module \" << ProxyPath.native_console_string() << std::endl;\n\t\t\treturn false;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/// Stores a signal that will be emitted to display loading progress\n\tdetail::message_signal_t m_message_signal;\n\t/// Stores the set of available plugin factories\n\tfactories_t m_factories;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// plugin_factory_collection\n\nplugin_factory_collection::plugin_factory_collection() :\n\tm_implementation(new implementation())\n{\n}\n\nplugin_factory_collection::~plugin_factory_collection()\n{\n\tdelete m_implementation;\n}\n\nsigc::connection plugin_factory_collection::connect_message_signal(const sigc::slot<void, const std::string&>& Slot)\n{\n\treturn m_implementation->m_message_signal.connect(Slot);\n}\n\nvoid plugin_factory_collection::bind_module(const std::string& ModuleName, register_plugins_entry_point RegisterPlugins)\n{\n\treturn_if_fail(RegisterPlugins);\n\n\tm_implementation->m_message_signal.emit(string_cast(boost::format(_(\"Binding plugin module %1%\")) % ModuleName));\n\n\tdetail::plugin_registry registry(m_implementation->m_message_signal, m_implementation->m_factories);\n\tRegisterPlugins(registry);\n}\n\nvoid plugin_factory_collection::load_module(const filesystem::path& Path, const load_proxy_t LoadProxies)\n{\n\t// K-3D modules now have the same extension on all platforms ...\n\tif(filesystem::extension(Path).lowercase().raw() != \".module\")\n\t\treturn;\n\n\t// If the module can be proxied for fast startup, do that and return ...\n\tif(LoadProxies == LOAD_PROXIES)\n\t{\n\t\tfilesystem::path proxy_path = Path + \".proxy\";\n\t\tif(filesystem::exists(proxy_path) && m_implementation->proxy_module(Path, proxy_path))\n\t\t\treturn;\n\t}\n\n\t// OK, just load the module ...\n\tm_implementation->m_message_signal.emit(string_cast(boost::format(_(\"Loading plugin module %1%\")) % Path.native_utf8_string().raw()));\n\n\tregister_plugins_entry_point register_plugins = 0;\n\tos_load_module(Path, register_plugins);\n\tif(!register_plugins)\n\t\treturn;\n\n\t// It's a K-3D module, all-right - give it a chance to register its plugins\n\tdetail::plugin_registry registry(m_implementation->m_message_signal, m_implementation->m_factories);\n\tregister_plugins(registry);\n}\n\nvoid plugin_factory_collection::load_modules(const filesystem::path& Path, const bool Recursive, const load_proxy_t LoadProxies)\n{\n\tm_implementation->m_message_signal.emit(string_cast(boost::format(_(\"Searching for plugins in %1%\")) % Path.native_utf8_string().raw()));\n\n\t// Create a sorted list of files in this directory ...\n\tstd::vector<filesystem::path> files;\n\tfor(k3d::filesystem::directory_iterator path(Path); path != k3d::filesystem::directory_iterator(); ++path)\n\t\tfiles.push_back(*path);\n\tstd::sort(files.begin(), files.end());\n\n\t// Load modules\n\tfor(std::vector<filesystem::path>::const_iterator file = files.begin(); file != files.end(); ++file)\n\t{\n\t\tif(!filesystem::is_directory(*file))\n\t\t\tload_module(*file, LoadProxies);\n\t}\n\n\t// Optionally descend recursively into subdirectories ...\n\tif(Recursive)\n\t{\n\t\tfor(std::vector<filesystem::path>::const_iterator file = files.begin(); file != files.end(); ++file)\n\t\t{\n\t\t\tif(filesystem::is_directory(*file))\n\t\t\t\tload_modules(*file, Recursive, LoadProxies);\n\t\t}\n\t}\n}\n\nvoid plugin_factory_collection::load_modules(const std::string& Paths, const bool Recursive, const load_proxy_t LoadProxies)\n{\n\tconst system::paths_t paths = system::decompose_path_list(Paths);\n\tfor(system::paths_t::const_iterator path = paths.begin(); path != paths.end(); ++path)\n\t\tload_modules(*path, Recursive, LoadProxies);\n}\n\nconst iplugin_factory_collection::factories_t& plugin_factory_collection::factories()\n{\n\treturn m_implementation->m_factories;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/plugin_factory_collection.h",
    "content": "#ifndef K3DSDK_PLUGIN_FACTORY_COLLECTION_H\n#define K3DSDK_PLUGIN_FACTORY_COLLECTION_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Declares plugin_factory_collection, an implementation of iplugin_factory_collection that can load plugin factories from shared libraries\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iplugin_factory_collection.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/signal_system.h>\n\n#include <string>\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\n\n/////////////////////////////////////////////////////////////////////////////\n// plugin_factory_collection\n\n/// Provides an implementation of iplugin_factory_collection that can load plugin factories from shared libraries\nclass plugin_factory_collection :\n\tpublic iplugin_factory_collection\n{\npublic:\n\tplugin_factory_collection();\n\t~plugin_factory_collection();\n\n\tenum load_proxy_t\n\t{\n\t\tLOAD_PROXIES,\n\t\tIGNORE_PROXIES\n\t};\n\n\t/// Connects a signal emitted to display human-readable progress messages while loading plugin modules\n\tsigc::connection connect_message_signal(const sigc::slot<void, const std::string&>& Slot);\n\n\t/// Binds a statically-linked plugin module\n\tvoid bind_module(const std::string& ModuleName, register_plugins_entry_point RegisterPlugins);\n\t/// Loads a single plugin module\n\tvoid load_module(const filesystem::path& Path, const load_proxy_t LoadProxies);\n\t/// Loads plugin modules from a directory, optionally descending recursively into subdirectories\n\tvoid load_modules(const filesystem::path& Path, const bool Recursive, const load_proxy_t LoadProxies);\n\t/// Loads plugin modules from zero-to-many directories, optionally descending recursively into each directory\n\tvoid load_modules(const std::string& Paths, const bool Recursive, const load_proxy_t LoadProxies);\n\n\t// iplugin_factory_collection implementation\n\tconst factories_t& factories();\n\nprivate:\n\tplugin_factory_collection(const plugin_factory_collection&);\n\tplugin_factory_collection& operator=(const plugin_factory_collection&);\n\n\tstruct implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_PLUGIN_FACTORY_COLLECTION_H\n\n"
  },
  {
    "path": "k3dsdk/plugins_detail.h",
    "content": "#ifndef K3DSDK_PLUGINS_DETAIL_H\n#define K3DSDK_PLUGINS_DETAIL_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/iplugin_factory.h>\n\nnamespace k3d\n{\n\nnamespace plugin\n{\n\nnamespace detail\n{\n\niunknown* create_application_plugin(const k3d::string_t& FactoryName);\niunknown* create_application_plugin(iplugin_factory& Factory);\niunknown* create_application_plugin(const uuid& FactoryID);\ninode* create_document_plugin(const k3d::string_t& FactoryName, idocument& Document, const k3d::string_t& Name);\ninode* create_document_plugin(iplugin_factory& Factory, idocument& Document, const k3d::string_t& Name);\ninode* create_document_plugin(const uuid& FactoryID, idocument& Document, const k3d::string_t& Name);\n\n} // namespace detail\n\n} // namespace plugin\n\n} // namespace k3d\n\n#endif // !K3DSDK_PLUGINS_DETAIL_H\n\n"
  },
  {
    "path": "k3dsdk/point2.h",
    "content": "#ifndef K3DSDK_POINT2_H\n#define K3DSDK_POINT2_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/****************************************************************\n*\n* C++ Vector and Matrix Algebra routines\n* Author: Jean-Francois DOUE\n* Version 3.1 --- October 1993\n*\n****************************************************************/\n\n//\n//\tFrom \"Graphics Gems IV / Edited by Paul S. Heckbert\n//\tAcademic Press, 1994, ISBN 0-12-336156-9\n//\t\"You are free to use and modify this code in any way\n//\tyou like.\" (p. xv)\n//\n//\tModified by J. Nagle, March 1997\n//\t-\tAll functions are inline.\n//\t-\tAll functions are const-correct.\n//\t-\tAll checking is via the standard \"assert\" macro.\n//\n\n// Modified by Tim Shead for use with K-3D, January 1998\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/result.h>\n\n#include <boost/io/ios_state.hpp>\n#include <iomanip>\n\nnamespace k3d\n{\n\nclass vector2;\n\n/////////////////////////////////////////////////////////////////////////////\n// point2\n\n/// Encapsulates a location in two-dimensional space\nclass point2\n{\npublic:\n\t/// Stores the point values\n\tdouble n[2];\n\n\tpoint2()\n\t{\n\t\tn[0] = n[1] = 0.0;\n\t}\n\t\n\tpoint2(const double x, const double y)\n\t{\n\t\tn[0] = x;\n\t\tn[1] = y;\n\t}\n\n\tpoint2(const point2& v)\n\t{\n\t\tn[0] = v.n[0];\n\t\tn[1] = v.n[1];\n\t}\n\n\t/// Addition of a vector\n\tpoint2& operator+=(const vector2& v);\n\n\t/// Subtraction of a vector\n\tpoint2& operator-=(const vector2& v);\n\n\t/// Multiplication by a constant\n\tpoint2& operator*=(const double d)\n\t{\n\t\tn[0] *= d;\n\t\tn[1] *= d;\n\t\treturn *this;\n\t}\n\t\n\t/// Division by a constant\n\tpoint2& operator/=(const double d)\n\t{\n\t\treturn_val_if_fail(d, *this);\n\n\t\tdouble d_inv = 1./d;\n\t\tn[0] *= d_inv;\n\t\tn[1] *= d_inv;\n\n\t\treturn *this;\n\t}\n\n\t/// Returns an indexed dimension by reference\n\tdouble& operator[](int i)\n\t{\n\t\treturn n[i];\n\t}\n\n\t/// Returns an indexed dimension by value\n\tdouble operator[](int i) const\n\t{\n\t\treturn n[i];\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const point2& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.n[0] << \" \" << RHS.n[1];\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, point2& RHS)\n\t{\n\t\tStream >> RHS.n[0] >> RHS.n[1];\n\t\treturn Stream;\n\t}\n};\n\n/// Negation\ninline const point2 operator-(const point2& a)\n{\n\treturn point2(-a.n[0], -a.n[1]);\n}\n\n/// Addition\n/** \\note We implement this as a convenience for the benefit of linear interpolation - adding two points has no geometric meaning */\ninline const point2 operator+(const point2& a, const point2& b)\n{\n\treturn point2(a.n[0] + b.n[0], a.n[1] + b.n[1]);\n}\n\n/// Multiplication by a constant\ninline const point2 operator*(const point2& a, const double d)\n{\n\treturn point2(d * a.n[0], d * a.n[1]);\n}\n\n/// Multiplication by a constant\ninline const point2 operator*(const double d, const point2& a)\n{\n\treturn a * d;\n}\n\n/// Division by a constant\ninline const point2 operator/(const point2& a, const double d)\n{\n\treturn_val_if_fail(d, point2());\n\n\tdouble d_inv = 1./d;\n\treturn point2(a.n[0]*d_inv, a.n[1]*d_inv);\n}\n\n/// Equality\ninline bool operator==(const point2& a, const point2& b)\n{\n\treturn a.n[0] == b.n[0] && a.n[1] == b.n[1];\n}\n\n/// Non-equality\ninline bool operator!=(const point2& a, const point2& b)\n{\n\treturn !(a == b);\n}\n\nnamespace difference\n{\n\n/// Specialization of difference::test for point2\ninline void test(const point2& A, const point2& B, accumulator& Result)\n{\n\trange_test(A.n, A.n + 2, B.n, B.n + 2, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_POINT2_H\n\n"
  },
  {
    "path": "k3dsdk/point3.h",
    "content": "#ifndef K3DSDK_POINT3_H\n#define K3DSDK_POINT3_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Vector (points, vectors and normals) routines\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n/****************************************************************\n*\n* C++ Vector and Matrix Algebra routines\n* Author: Jean-Francois DOUE\n* Version 3.1 --- October 1993\n*\n****************************************************************/\n\n//\n//\tFrom \"Graphics Gems IV / Edited by Paul S. Heckbert\n//\tAcademic Press, 1994, ISBN 0-12-336156-9\n//\t\"You are free to use and modify this code in any way\n//\tyou like.\" (p. xv)\n//\n//\tModified by J. Nagle, March 1997\n//\t-\tAll functions are inline.\n//\t-\tAll functions are const-correct.\n//\t-\tAll checking is via the standard \"assert\" macro.\n//\n\n// Modified by Tim Shead for use with K-3D, January 1998\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/result.h>\n\n#include <boost/io/ios_state.hpp>\n#include <iomanip>\n\nnamespace k3d\n{\n\nclass vector3;\n\n/////////////////////////////////////////////////////////////////////////////\n// point3\n\n/// Encapsulates a location in three-dimensional space\nclass point3\n{\npublic:\n\t/// Stores the point values\n\tdouble n[3];\n\n\tpoint3()\n\t{\n\t\tn[0] = n[1] = n[2] = 0.0;\n\t}\n\n\tpoint3(const double x, const double y, const double z)\n\t{\n\t\tn[0] = x;\n\t\tn[1] = y;\n\t\tn[2] = z;\n\t}\n\n\tpoint3(const double d[3])\n\t{\n\t\tn[0] = d[0];\n\t\tn[1] = d[1];\n\t\tn[2] = d[2];\n\t}\n\n\t/// Addition of a vector\n\tpoint3& operator+=(const vector3& v);\n\n\t/// Subtraction of a vector\n\tpoint3& operator-=(const vector3& v);\n\n\t/// Multiplication by a constant\n\tpoint3& operator*=(const double d)\n\t{\n\t\tn[0] *= d;\n\t\tn[1] *= d;\n\t\tn[2] *= d;\n\t\treturn *this; \n\t}\n\n\t/// Division by a constant\n\tpoint3& operator/=(const double d)\n\t{\n\t\treturn_val_if_fail(d, *this);\n\n\t\tdouble d_inv = 1./d;\n\t\tn[0] *= d_inv;\n\t\tn[1] *= d_inv;\n\t\tn[2] *= d_inv;\n\n\t\treturn *this;\n\t}\n\n\t/// Returns an indexed dimension by reference\n\tdouble& operator[](int i)\n\t{\n\t\treturn n[i];\n\t}\n\n\t/// Returns an indexed dimension by value\n\tdouble operator[](int i) const\n\t{\n\t\treturn n[i];\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const point3& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.n[0] << \" \" << RHS.n[1] << \" \" << RHS.n[2];\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, point3& RHS)\n\t{\n\t\tStream >> RHS.n[0] >> RHS.n[1] >> RHS.n[2];\n\t\treturn Stream;\n\t}\n};\n\n/// Negation\ninline const point3 operator-(const point3& a)\n{\n\treturn point3(-a.n[0], -a.n[1], -a.n[2]);\n}\n\n/// Addition\n/** \\note We implement this as a convenience for the benefit of linear interpolation - adding two points has no geometric meaning */\ninline const point3 operator+(const point3& a, const point3& b)\n{\n\treturn point3(a.n[0]+ b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2]);\n}\n\n/// Multiplication by a constant\ninline const point3 operator*(const point3& a, const double d)\n{\n\treturn point3(d*a.n[0], d*a.n[1], d*a.n[2]);\n}\n\n/// Multiplication by a constant\ninline const point3 operator*(const double d, const point3& a)\n{\n\treturn a*d;\n}\n\n/// Division by a constant\ninline const point3 operator/(const point3& a, const double d)\n{\n\treturn_val_if_fail(d, point3());\n\n\tdouble d_inv = 1./d;\n\treturn point3(a.n[0]*d_inv, a.n[1]*d_inv, a.n[2]*d_inv);\n}\n\n/// Equality\ninline bool operator==(const point3& a, const point3& b)\n{\n\treturn (a.n[0] == b.n[0]) && (a.n[1] == b.n[1]) && (a.n[2] == b.n[2]);\n}\n\n/// Inequality\ninline bool operator!=(const point3& a, const point3& b)\n{\n\treturn !(a == b);\n}\n\nnamespace difference\n{\n\n/// Specialization of difference::test for point3\ninline void test(const point3& A, const point3& B, accumulator& Result)\n{\n\trange_test(A.n, A.n + 3, B.n, B.n + 3, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_POINT3_H\n\n"
  },
  {
    "path": "k3dsdk/point4.h",
    "content": "#ifndef K3DSDK_POINT4_H\n#define K3DSDK_POINT4_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Vector (points, vectors and normals) routines\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n/****************************************************************\n*\n* C++ Vector and Matrix Algebra routines\n* Author: Jean-Francois DOUE\n* Version 3.1 --- October 1993\n*\n****************************************************************/\n\n//\n//\tFrom \"Graphics Gems IV / Edited by Paul S. Heckbert\n//\tAcademic Press, 1994, ISBN 0-12-336156-9\n//\t\"You are free to use and modify this code in any way\n//\tyou like.\" (p. xv)\n//\n//\tModified by J. Nagle, March 1997\n//\t-\tAll functions are inline.\n//\t-\tAll functions are const-correct.\n//\t-\tAll checking is via the standard \"assert\" macro.\n//\n\n// Modified by Tim Shead for use with K-3D, January 1998\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/result.h>\n\n#include <boost/io/ios_state.hpp>\n#include <iomanip>\n\nnamespace k3d\n{\n\nclass vector4;\n\n/////////////////////////////////////////////////////////////////////////////\n// point4\n\n/// Encapsulates a four-dimensional location\nclass point4\n{\npublic:\n\t/// Stores the point values\n\tdouble n[4];\n\n\tpoint4()\n\t{\n\t\tn[0] = n[1] = n[2] = n[3] = 0.0;\n\t}\n\n\tpoint4(const double x, const double y, const double z, const double w)\n\t{\n\t\tn[0] = x;\n\t\tn[1] = y;\n\t\tn[2] = z;\n\t\tn[3] = w;\n\t}\n\n\t/// Addition of a vector\n\tpoint4& operator+=(const vector4& v);\n\n\t/// Subtraction of a vector\n\tpoint4& operator-=(const vector4& v);\n\n\t/// Multiplication by a constant\n\tpoint4& operator*=(const double d)\n\t{\n\t\tn[0] *= d;\n\t\tn[1] *= d;\n\t\tn[2] *= d;\n\t\tn[3] *= d;\n\t\treturn *this;\n\t}\n\n\t/// Division by a constant\n\tpoint4& operator/=(const double d)\n\t{\n\t\treturn_val_if_fail(d, *this);\n\n\t\tdouble d_inv = 1./d;\n\t\tn[0] *= d_inv;\n\t\tn[1] *= d_inv;\n\t\tn[2] *= d_inv;\n\t\tn[3] *= d_inv;\n\t\treturn *this;\n\t}\n\n\t/// Returns an indexed dimension by reference\n\tdouble& operator[](int i)\n\t{\n\t\treturn n[i];\n\t}\n\n\t/// Returns an indexed dimension by value\n\tdouble operator[](int i) const\n\t{\n\t\treturn n[i];\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const point4& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.n[0] << \" \" << RHS.n[1] << \" \" << RHS.n[2] << \" \" << RHS.n[3];\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, point4& RHS)\n\t{\n\t\tStream >> RHS.n[0] >> RHS.n[1] >> RHS.n[2] >> RHS.n[3];\n\t\treturn Stream;\n\t}\n};\n\n/// Negation\ninline const point4 operator-(const point4& a)\n{\n\treturn point4(-a.n[0],-a.n[1],-a.n[2],-a.n[3]);\n}\n\n/// Addition\n/** \\note We implement this as a convenience for the benefit of linear interpolation - adding two points has no geometric meaning */\ninline const point4 operator+(const point4& a, const point4& b)\n{\n\treturn point4(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2], a.n[3] + b.n[3]);\n}\n\n/// Multiplication by a constant\ninline const point4 operator*(const point4& a, const double d)\n{\n\treturn point4(d*a.n[0], d*a.n[1], d*a.n[2], d*a.n[3] );\n}\n\n/// Multiplication by a constant\ninline const point4 operator*(const double d, const point4& a)\n{\n\treturn a*d;\n}\n\n/// Division by a constant\ninline const point4 operator/(const point4& a, const double d)\n{\n\treturn_val_if_fail(d, point4());\n\n\tdouble d_inv = 1./d;\n\treturn point4(a.n[0]*d_inv, a.n[1]*d_inv, a.n[2]*d_inv, a.n[3]*d_inv);\n}\n\n/// Equality\ninline bool operator==(const point4& a, const point4& b)\n{\n\treturn (a.n[0] == b.n[0]) && (a.n[1] == b.n[1]) && (a.n[2] == b.n[2]) && (a.n[3] == b.n[3]);\n}\n\n/// Inequality\ninline bool operator!=(const point4& a, const point4& b)\n{\n\treturn !(a == b);\n}\n\nnamespace difference\n{\n\n/// Specialization of difference::test for point4\ninline void test(const point4& A, const point4& B, accumulator& Result)\n{\n\trange_test(A.n, A.n + 4, B.n, B.n + 4, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_POINT4_H\n\n"
  },
  {
    "path": "k3dsdk/pointer_demand_storage.h",
    "content": "#ifndef K3DSDK_POINTER_DEMAND_STORAGE_H\n#define K3DSDK_POINTER_DEMAND_STORAGE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/ihint.h>\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/utility.h>\n\n#include <boost/scoped_ptr.hpp>\n#include <boost/static_assert.hpp>\n#include <boost/type_traits.hpp>\n\n#include <algorithm>\n#include <vector>\n\nnamespace k3d\n{\n\nnamespace data\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// pointer_demand_storage\n\n/// Read-only storage policy that stores a value by pointer, created on-demand\ntemplate<typename pointer_t, typename signal_policy_t>\nclass pointer_demand_storage :\n\tpublic signal_policy_t\n{\n\t// This policy only works for data stored by-pointer\n\tBOOST_STATIC_ASSERT((boost::is_pointer<pointer_t>::value));\n\npublic:\n\ttypedef typename boost::remove_pointer<pointer_t>::type non_pointer_t;\n\ttypedef pointer_demand_storage<pointer_t, signal_policy_t> this_t;\n\ttypedef std::vector<ihint*> pending_hints_t;\n\n\t/// Set the slot that will be called to bring the underlying data up-to-date\n\tvoid set_update_slot(const sigc::slot<void, const pending_hints_t&, non_pointer_t&>& Slot)\n\t{\n\t\tm_update_slot = Slot;\n\t\tupdate();\n\t}\n\n\t/// Returns a slot that will invoke the update() method\n\tsigc::slot<void, ihint*> make_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &this_t::update);\n\t}\n\n\t/// Store an object as the new value, taking control of its lifetime\n\tvoid reset(pointer_t NewValue = 0, ihint* const Hint = 0)\n\t{\n\t\t// Prevent updates while we're executing ...\n\t\tif(m_executing)\n\t\t\treturn;\n\n\t\tif(NewValue)\n\t\t{\n\t\t\t// If the new value is non-NULL, cancel any pending updates ...\n\t\t\tstd::for_each(m_pending_hints.begin(), m_pending_hints.end(), delete_object());\n\t\t\tm_pending_hints.clear();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Otherwise, ensure that we execute next time we're called ...\n\t\t\tm_pending_hints.push_back(Hint ? Hint->clone() : static_cast<ihint*>(0));\n\t\t}\n\n\t\tm_value.reset(NewValue);\n\t\tsignal_policy_t::set_value(Hint);\n\t}\n\n\t/// Schedule an update for the value the next time it's read\n\tvoid update(ihint* const Hint = 0)\n\t{\n\t\t// Prevent updates while we're executing ...\n\t\tif(m_executing)\n\t\t\treturn;\n\n\t\tm_pending_hints.push_back(Hint ? Hint->clone() : static_cast<ihint*>(0));\n\t\tsignal_policy_t::set_value(Hint);\n\t}\n\n\t/// Accesses the underlying value, creating it if it doesn't already exist\n\tpointer_t internal_value()\n\t{\n\t\tif(!m_value.get())\n\t\t\tm_value.reset(new non_pointer_t());\n\n\t\tif(!m_pending_hints.empty())\n\t\t{\n\t\t\tm_executing = true;\n\n\t\t\t// Create a temporary copy of pending hints in-case we are updated while executing ...\n\t\t\tconst pending_hints_t pending_hints(m_pending_hints);\n\t\t\tm_update_slot(pending_hints, *m_value);\n\t\t\t\n\t\t\tstd::for_each(m_pending_hints.begin(), m_pending_hints.end(), delete_object());\n\t\t\tm_pending_hints.clear();\n\n\t\t\tm_executing = false;\n\t\t}\n\n\t\treturn m_value.get();\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tpointer_demand_storage(const init_t& Init) :\n\t\tsignal_policy_t(Init),\n\t\tm_executing(false)\n\t{\n\t}\n\n\t~pointer_demand_storage()\n\t{\n\t\tstd::for_each(m_pending_hints.begin(), m_pending_hints.end(), delete_object());\n\t}\n\nprivate:\n\t/// Storage for this policy's value\n\tboost::scoped_ptr<non_pointer_t> m_value;\n\t/// Stores a slot that will be called to bring this policy's value up-to-date\n\tsigc::slot<void, const pending_hints_t&, non_pointer_t&> m_update_slot;\n\t/// Stores a collection of pending hints to be updated\n\tpending_hints_t m_pending_hints;\n\t/// Used to prevent problems with recursion while executing\n\tbool_t m_executing;\n};\n\n} // namespace data\n\n} // namespace k3d\n\n#endif // !K3DSDK_POINTER_DEMAND_STORAGE_H\n\n"
  },
  {
    "path": "k3dsdk/polyhedron.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/parallel/blocked_range.h>\n#include <k3dsdk/parallel/parallel_for.h>\n#include <k3dsdk/parallel/threads.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/triangulator.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <functional>\n#include <iterator>\n#include <numeric>\n#include <sstream>\n#include <stdexcept>\n\nnamespace k3d\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst typed_array<int32_t>& ShellTypes,\n\tconst mesh::indices_t& FaceShells,\n\tconst mesh::indices_t& FaceFirstLoops,\n\tconst mesh::counts_t& FaceLoopCounts,\n\tconst mesh::selection_t& FaceSelections,\n\tconst mesh::materials_t& FaceMaterials,\n\tconst mesh::indices_t& LoopFirstEdges,\n\tconst mesh::indices_t& ClockwiseEdges,\n\tconst mesh::selection_t& EdgeSelections,\n\tconst mesh::indices_t& VertexPoints,\n\tconst mesh::selection_t& VertexSelections,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& FaceAttributes,\n\tconst mesh::table_t& EdgeAttributes,\n\tconst mesh::table_t& VertexAttributes\n\t\t) :\n\tshell_types(ShellTypes),\n\tface_shells(FaceShells),\n\tface_first_loops(FaceFirstLoops),\n\tface_loop_counts(FaceLoopCounts),\n\tface_selections(FaceSelections),\n\tface_materials(FaceMaterials),\n\tloop_first_edges(LoopFirstEdges),\n\tclockwise_edges(ClockwiseEdges),\n\tedge_selections(EdgeSelections),\n\tvertex_points(VertexPoints),\n\tvertex_selections(VertexSelections),\n\tconstant_attributes(ConstantAttributes),\n\tface_attributes(FaceAttributes),\n\tedge_attributes(EdgeAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\nconst_primitive::const_primitive(const primitive& Primitive) :\n\tshell_types(Primitive.shell_types),\n\tface_shells(Primitive.face_shells),\n\tface_first_loops(Primitive.face_first_loops),\n\tface_loop_counts(Primitive.face_loop_counts),\n\tface_selections(Primitive.face_selections),\n\tface_materials(Primitive.face_materials),\n\tloop_first_edges(Primitive.loop_first_edges),\n\tclockwise_edges(Primitive.clockwise_edges),\n\tedge_selections(Primitive.edge_selections),\n\tvertex_points(Primitive.vertex_points),\n\tvertex_selections(Primitive.vertex_selections),\n\tconstant_attributes(Primitive.constant_attributes),\n\tface_attributes(Primitive.face_attributes),\n\tedge_attributes(Primitive.edge_attributes),\n\tvertex_attributes(Primitive.vertex_attributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\ttyped_array<int32_t>& ShellTypes,\n\tmesh::indices_t& FaceShells,\n\tmesh::indices_t& FaceFirstLoops,\n\tmesh::counts_t& FaceLoopCounts,\n\tmesh::selection_t& FaceSelections,\n\tmesh::materials_t& FaceMaterials,\n\tmesh::indices_t& LoopFirstEdges,\n\tmesh::indices_t& ClockwiseEdges,\n\tmesh::selection_t& EdgeSelections,\n\tmesh::indices_t& VertexPoints,\n\tmesh::selection_t& VertexSelections,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& FaceAttributes,\n\tmesh::table_t& EdgeAttributes,\n\tmesh::table_t& VertexAttributes\n\t\t) :\n\tshell_types(ShellTypes),\n\tface_shells(FaceShells),\n\tface_first_loops(FaceFirstLoops),\n\tface_loop_counts(FaceLoopCounts),\n\tface_selections(FaceSelections),\n\tface_materials(FaceMaterials),\n\tloop_first_edges(LoopFirstEdges),\n\tclockwise_edges(ClockwiseEdges),\n\tedge_selections(EdgeSelections),\n\tvertex_points(VertexPoints),\n\tvertex_selections(VertexSelections),\n\tconstant_attributes(ConstantAttributes),\n\tface_attributes(FaceAttributes),\n\tedge_attributes(EdgeAttributes),\n\tvertex_attributes(VertexAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh::primitive& GenericPrimitive)\n{\n\tGenericPrimitive.type = \"polyhedron\";\n\tGenericPrimitive.structure.clear();\n\tGenericPrimitive.attributes.clear();\n\n\tprimitive* const result = new primitive(\n\t\tGenericPrimitive.structure[\"shell\"].create<typed_array<int32_t> >(\"shell_types\"),\n\t\tGenericPrimitive.structure[\"face\"].create<mesh::indices_t>(\"face_shells\"),\n\t\tGenericPrimitive.structure[\"face\"].create<mesh::indices_t>(\"face_first_loops\"),\n\t\tGenericPrimitive.structure[\"face\"].create<mesh::counts_t>(\"face_loop_counts\"),\n\t\tGenericPrimitive.structure[\"face\"].create<mesh::selection_t>(\"face_selections\"),\n\t\tGenericPrimitive.structure[\"face\"].create<mesh::materials_t>(\"face_materials\"),\n\t\tGenericPrimitive.structure[\"loop\"].create<mesh::indices_t>(\"loop_first_edges\"),\n\t\tGenericPrimitive.structure[\"edge\"].create<mesh::indices_t>(\"clockwise_edges\"),\n\t\tGenericPrimitive.structure[\"edge\"].create<mesh::selection_t>(\"edge_selections\"),\n\t\tGenericPrimitive.structure[\"vertex\"].create<mesh::indices_t>(\"vertex_points\"),\n\t\tGenericPrimitive.structure[\"vertex\"].create<mesh::selection_t>(\"vertex_selections\"),\n\t\tGenericPrimitive.attributes[\"constant\"],\n\t\tGenericPrimitive.attributes[\"face\"],\n\t\tGenericPrimitive.attributes[\"edge\"],\n\t\tGenericPrimitive.attributes[\"vertex\"]\n\t\t);\n\n\tresult->face_selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\tresult->edge_selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\tresult->vertex_points.set_metadata_value(metadata::key::domain(), metadata::value::point_indices_domain());\n\tresult->vertex_selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\n\treturn result;\n}\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"polyhedron\");\n\treturn create(generic_primitive);\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh, const mesh::points_t& Vertices, const mesh::counts_t& VertexCounts, const mesh::indices_t& VertexIndices, imaterial* const Material)\n{\n\ttry\n\t{\n\t\tif(std::count_if(VertexCounts.begin(), VertexCounts.end(), std::bind2nd(std::less<uint_t>(), 3)))\n\t\t{\n\t\t\tthrow std::runtime_error(\"each face must have three-or-more vertices.\");\n\t\t}\n\n\t\tconst uint_t expected_indices = std::accumulate(VertexCounts.begin(), VertexCounts.end(), 0);\n\t\tif(VertexIndices.size() != expected_indices)\n\t\t{\n\t\t\tstd::ostringstream buffer;\n\t\t\tbuffer << \"expected [\" << expected_indices << \"] vertex indices, received [\" << VertexIndices.size() << \"]\";\n\t\t\tthrow std::runtime_error(buffer.str());\n\t\t}\n\n\t\tif(std::count_if(VertexIndices.begin(), VertexIndices.end(), std::bind2nd(std::greater_equal<uint_t>(), Vertices.size())))\n\t\t{\n\t\t\tthrow std::runtime_error(\"vertex indices out-of-bounds\");\n\t\t}\n\n\t\t// Append points to the mesh (create the arrays if they don't already exist) ...\n\t\tmesh::points_t& points = Mesh.points ? Mesh.points.writable() : Mesh.points.create();\n\t\tmesh::selection_t& point_selection = Mesh.point_selection ? Mesh.point_selection.writable() : Mesh.point_selection.create();\n\n\t\tconst uint_t point_offset = points.size();\n\t\tpoints.insert(points.end(), Vertices.begin(), Vertices.end());\n\t\tpoint_selection.insert(point_selection.end(), Vertices.size(), 0.0);\n\t\tMesh.point_attributes.set_row_count(points.size());\n\n\t\t// Append a new polyhedron to the mesh ...\n\t\tprimitive* const polyhedron = create(Mesh);\n\t\tpolyhedron->shell_types.push_back(POLYGONS);\n\n\t\tuint_t face_vertex = 0;\n\t\tconst uint_t face_begin = 0;\n\t\tconst uint_t face_end = face_begin + VertexCounts.size();\n\t\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t\t{\n\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\tpolyhedron->face_selections.push_back(0.0);\n\t\t\tpolyhedron->face_materials.push_back(Material);\n\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\tconst uint_t vertex_begin = 0;\n\t\t\tconst uint_t vertex_end = vertex_begin + VertexCounts[face];\n\t\t\tconst uint_t loop_begin = polyhedron->clockwise_edges.size();\n\t\t\tfor(uint_t vertex = vertex_begin; vertex != vertex_end; ++vertex, ++face_vertex)\n\t\t\t{\n\t\t\t\tpolyhedron->vertex_points.push_back(point_offset + VertexIndices[face_vertex]);\n\t\t\t\tpolyhedron->vertex_selections.push_back(0.0);\n\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\tpolyhedron->edge_selections.push_back(0.0);\n\t\t\t}\n\t\t\tpolyhedron->clockwise_edges.back() = loop_begin;\n\t\t}\n\n\t\treturn polyhedron;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"polyhedron\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& shell_structure = require_structure(Primitive, \"shell\");\n\t\tconst mesh::table_t& face_structure = require_structure(Primitive, \"face\");\n\t\tconst mesh::table_t& loop_structure = require_structure(Primitive, \"loop\");\n\t\tconst mesh::table_t& edge_structure = require_structure(Primitive, \"edge\");\n\t\tconst mesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& face_attributes = require_attributes(Primitive, \"face\");\n\t\tconst mesh::table_t& edge_attributes = require_attributes(Primitive, \"edge\");\n\t\tconst mesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\tconst typed_array<int32_t>& shell_types = require_array<typed_array<int32_t> >(Primitive, shell_structure, \"shell_types\");\n\t\tconst mesh::indices_t& face_shells = require_array<mesh::indices_t>(Primitive, face_structure, \"face_shells\");\n\t\tconst mesh::indices_t& face_first_loops = require_array<mesh::indices_t>(Primitive, face_structure, \"face_first_loops\");\n\t\tconst mesh::counts_t& face_loop_counts = require_array<mesh::counts_t>(Primitive, face_structure, \"face_loop_counts\");\n\t\tconst mesh::selection_t& face_selections = require_array<mesh::selection_t>(Primitive, face_structure, \"face_selections\");\n\t\tconst mesh::materials_t& face_materials = require_array<mesh::materials_t>(Primitive, face_structure, \"face_materials\");\n\t\tconst mesh::indices_t& loop_first_edges = require_array<mesh::indices_t>(Primitive, loop_structure, \"loop_first_edges\");\n\t\tconst mesh::indices_t& clockwise_edges = require_array<mesh::indices_t>(Primitive, edge_structure, \"clockwise_edges\");\n\t\tconst mesh::selection_t& edge_selections = require_array<mesh::selection_t>(Primitive, edge_structure, \"edge_selections\");\n\t\tconst mesh::indices_t& vertex_points = require_array<mesh::indices_t>(Primitive, vertex_structure, \"vertex_points\");\n\t\tconst mesh::selection_t& vertex_selections = require_array<mesh::selection_t>(Primitive, vertex_structure, \"vertex_selections\");\n\n\t\trequire_metadata(Primitive, face_selections, \"face_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, edge_selections, \"edge_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, vertex_points, \"vertex_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\t\trequire_metadata(Primitive, vertex_selections, \"vertex_selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, loop_structure, \"loop\", std::accumulate(face_loop_counts.begin(), face_loop_counts.end(), 0));\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", edge_structure.row_count());\n\n\t\t// Check for out-of-bound shell indices ...\n\t\tconst uint_t face_begin = 0;\n\t\tconst uint_t face_end = face_begin + face_shells.size();\n\t\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t\t{\n\t\t\tif(face_shells[face] >= shell_types.size())\n\t\t\t{\n\t\t\t\tlog() << error << \"face shell out-of-bounds for face \" << face << \": \" << face_shells[face] << \" >= \" << shell_types.size() << std::endl;\n\t\t\t\treturn 0;\n\t\t\t}\t\n\t\t}\n\n\t\t// Check for out-of-bound indices and infinite loops in our edge lists ...\n\t\tconst uint_t loop_begin = 0;\n\t\tconst uint_t loop_end = loop_begin + loop_first_edges.size();\n\n\t\tconst uint_t edge_begin = 0;\n\t\tconst uint_t edge_end = edge_begin + clockwise_edges.size();\n\n\t\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst uint_t first_edge = loop_first_edges[loop];\n\t\t\tif(first_edge >= edge_end)\n\t\t\t{\n\t\t\t\tlog() << error << \"loop first edge index out-of-bounds for loop \" << loop << std::endl;\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tuint_t edge_slow = first_edge;\n\t\t\tuint_t edge_fast = first_edge;\n\t\t\tuint_t cycle_count = 0;\n\t\t\twhile(true)\n\t\t\t{\n\t\t\t\tedge_slow = clockwise_edges[edge_slow];\n\t\t\t\tif(edge_slow >= edge_end)\n\t\t\t\t{\n\t\t\t\t\tlog() << error << \"clockwise edge index out-of-bounds for edge \" << edge_slow << std::endl;\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\tedge_fast = clockwise_edges[clockwise_edges[edge_fast]];\n\t\t\t\tif(edge_fast >= edge_end)\n\t\t\t\t{\n\t\t\t\t\tlog() << error << \"clockwise edge index out-of-bounds for edge \" << edge_fast << std::endl;\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\tif(edge_slow == edge_fast)\n\t\t\t\t\t++cycle_count;\n\n\t\t\t\tif(cycle_count > 2)\n\t\t\t\t{\n\t\t\t\t\tlog() << error << \"infinite loop at loop index \" << loop << std::endl;\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\tif(edge_slow == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn new const_primitive(shell_types, face_shells, face_first_loops, face_loop_counts, face_selections, face_materials, loop_first_edges, clockwise_edges, edge_selections, vertex_points, vertex_selections, constant_attributes, face_attributes, edge_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"polyhedron\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& shell_structure = require_structure(Primitive, \"shell\");\n\t\tmesh::table_t& face_structure = require_structure(Primitive, \"face\");\n\t\tmesh::table_t& loop_structure = require_structure(Primitive, \"loop\");\n\t\tmesh::table_t& edge_structure = require_structure(Primitive, \"edge\");\n\t\tmesh::table_t& vertex_structure = require_structure(Primitive, \"vertex\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& face_attributes = require_attributes(Primitive, \"face\");\n\t\tmesh::table_t& edge_attributes = require_attributes(Primitive, \"edge\");\n\t\tmesh::table_t& vertex_attributes = require_attributes(Primitive, \"vertex\");\n\n\t\ttyped_array<int32_t>& shell_types = require_array<typed_array<int32_t> >(Primitive, shell_structure, \"shell_types\");\n\t\tmesh::indices_t& face_shells = require_array<mesh::indices_t>(Primitive, face_structure, \"face_shells\");\n\t\tmesh::indices_t& face_first_loops = require_array<mesh::indices_t>(Primitive, face_structure, \"face_first_loops\");\n\t\tmesh::counts_t& face_loop_counts = require_array<mesh::counts_t>(Primitive, face_structure, \"face_loop_counts\");\n\t\tmesh::selection_t& face_selections = require_array<mesh::selection_t>(Primitive, face_structure, \"face_selections\");\n\t\tmesh::materials_t& face_materials = require_array<mesh::materials_t>(Primitive, face_structure, \"face_materials\");\n\t\tmesh::indices_t& loop_first_edges = require_array<mesh::indices_t>(Primitive, loop_structure, \"loop_first_edges\");\n\t\tmesh::indices_t& clockwise_edges = require_array<mesh::indices_t>(Primitive, edge_structure, \"clockwise_edges\");\n\t\tmesh::selection_t& edge_selections = require_array<mesh::selection_t>(Primitive, edge_structure, \"edge_selections\");\n\t\tmesh::indices_t& vertex_points = require_array<mesh::indices_t>(Primitive, vertex_structure, \"vertex_points\");\n\t\tmesh::selection_t& vertex_selections = require_array<mesh::selection_t>(Primitive, vertex_structure, \"vertex_selections\");\n\n\t\trequire_metadata(Primitive, face_selections, \"face_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, edge_selections, \"edge_selections\", metadata::key::role(), metadata::value::selection_role());\n\t\trequire_metadata(Primitive, vertex_points, \"vertex_points\", metadata::key::domain(), metadata::value::point_indices_domain());\n\t\trequire_metadata(Primitive, vertex_selections, \"vertex_selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, loop_structure, \"loop\", std::accumulate(face_loop_counts.begin(), face_loop_counts.end(), 0));\n\t\trequire_table_row_count(Primitive, vertex_structure, \"vertex\", edge_structure.row_count());\n\n\t\t// Check for out-of-bound shell indices ...\n\t\tconst uint_t face_begin = 0;\n\t\tconst uint_t face_end = face_begin + face_shells.size();\n\t\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t\t{\n\t\t\tif(face_shells[face] >= shell_types.size())\n\t\t\t{\n\t\t\t\tlog() << error << \"face shell out-of-bounds for face \" << face << \": \" << face_shells[face] << \" >= \" << shell_types.size() << std::endl;\n\t\t\t\treturn 0;\n\t\t\t}\t\n\t\t}\n\n\t\t// Check for out-of-bound indices and infinite loops in our edge lists ...\n\t\tconst uint_t loop_begin = 0;\n\t\tconst uint_t loop_end = loop_begin + loop_first_edges.size();\n\n\t\tconst uint_t edge_begin = 0;\n\t\tconst uint_t edge_end = edge_begin + clockwise_edges.size();\n\n\t\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst uint_t first_edge = loop_first_edges[loop];\n\t\t\tif(first_edge >= edge_end)\n\t\t\t{\n\t\t\t\tlog() << error << \"loop first edge index out-of-bounds for loop \" << loop << std::endl;\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tuint_t edge_slow = first_edge;\n\t\t\tuint_t edge_fast = first_edge;\n\t\t\tuint_t cycle_count = 0;\n\t\t\twhile(true)\n\t\t\t{\n\t\t\t\tedge_slow = clockwise_edges[edge_slow];\n\t\t\t\tif(edge_slow >= edge_end)\n\t\t\t\t{\n\t\t\t\t\tlog() << error << \"clockwise edge index out-of-bounds for edge \" << edge_slow << std::endl;\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\tedge_fast = clockwise_edges[clockwise_edges[edge_fast]];\n\t\t\t\tif(edge_fast >= edge_end)\n\t\t\t\t{\n\t\t\t\t\tlog() << error << \"clockwise edge index out-of-bounds for edge \" << edge_fast << std::endl;\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\tif(edge_slow == edge_fast)\n\t\t\t\t\t++cycle_count;\n\n\t\t\t\tif(cycle_count > 2)\n\t\t\t\t{\n\t\t\t\t\tlog() << error << \"infinite loop at loop index \" << loop << std::endl;\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\tif(edge_slow == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn new primitive(shell_types, face_shells, face_first_loops, face_loop_counts, face_selections, face_materials, loop_first_edges, clockwise_edges, edge_selections, vertex_points, vertex_selections, constant_attributes, face_attributes, edge_attributes, vertex_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n  if(Primitive->type != \"polyhedron\")\n    return 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// add_triangle\n\nvoid add_triangle(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const uint_t V1, const uint_t V2, const uint_t V3, imaterial* const Material)\n{\n\treturn_if_fail(Shell < Polyhedron.shell_types.size());\n\n\tPolyhedron.face_shells.push_back(Shell);\n\tPolyhedron.face_first_loops.push_back(Polyhedron.loop_first_edges.size());\n\tPolyhedron.face_loop_counts.push_back(1);\n\tPolyhedron.face_selections.push_back(0);\n\tPolyhedron.face_materials.push_back(Material);\n\n\tPolyhedron.loop_first_edges.push_back(Polyhedron.clockwise_edges.size());\n\n\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() - 2);\n\n\tPolyhedron.edge_selections.push_back(0);\n\tPolyhedron.edge_selections.push_back(0);\n\tPolyhedron.edge_selections.push_back(0);\n\n\tPolyhedron.vertex_points.push_back(V1);\n\tPolyhedron.vertex_points.push_back(V2);\n\tPolyhedron.vertex_points.push_back(V3);\n\n\tPolyhedron.vertex_selections.push_back(0);\n\tPolyhedron.vertex_selections.push_back(0);\n\tPolyhedron.vertex_selections.push_back(0);\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// add_quadrilateral\n\nvoid add_quadrilateral(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const uint_t V1, const uint_t V2, const uint_t V3, const uint_t V4, imaterial* const Material)\n{\n\treturn_if_fail(Shell < Polyhedron.shell_types.size());\n\n\tPolyhedron.face_shells.push_back(Shell);\n\tPolyhedron.face_first_loops.push_back(Polyhedron.loop_first_edges.size());\n\tPolyhedron.face_loop_counts.push_back(1);\n\tPolyhedron.face_selections.push_back(0);\n\tPolyhedron.face_materials.push_back(Material);\n\n\tPolyhedron.loop_first_edges.push_back(Polyhedron.clockwise_edges.size());\n\n\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() - 3);\n\n\tPolyhedron.edge_selections.push_back(0);\n\tPolyhedron.edge_selections.push_back(0);\n\tPolyhedron.edge_selections.push_back(0);\n\tPolyhedron.edge_selections.push_back(0);\n\n\tPolyhedron.vertex_points.push_back(V1);\n\tPolyhedron.vertex_points.push_back(V2);\n\tPolyhedron.vertex_points.push_back(V3);\n\tPolyhedron.vertex_points.push_back(V4);\n\n\tPolyhedron.vertex_selections.push_back(0);\n\tPolyhedron.vertex_selections.push_back(0);\n\tPolyhedron.vertex_selections.push_back(0);\n\tPolyhedron.vertex_selections.push_back(0);\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// add_face\n\nvoid add_face(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const mesh::points_t& Vertices, imaterial* const Material)\n{\n\tadd_face(Mesh, Polyhedron, Shell, Vertices, std::vector<mesh::points_t>(), Material);\n}\n\nvoid add_face(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const mesh::points_t& Vertices, const std::vector<mesh::points_t>& Holes, imaterial* const Material)\n{\n\treturn_if_fail(Mesh.points);\n\treturn_if_fail(Mesh.point_selection);\n\n\treturn_if_fail(Shell < Polyhedron.shell_types.size());\n\n\treturn_if_fail(Vertices.size() > 1);\n\tfor(uint_t hole = 0; hole != Holes.size(); ++hole)\n\t\treturn_if_fail(Holes[hole].size() > 1);\n\n\tmesh::points_t& points = Mesh.points.writable();\n\tmesh::selection_t& point_selection = Mesh.point_selection.writable();\n\n\tPolyhedron.face_shells.push_back(Shell);\n\tPolyhedron.face_first_loops.push_back(Polyhedron.loop_first_edges.size());\n\tPolyhedron.face_loop_counts.push_back(Holes.size() + 1);\n\tPolyhedron.face_selections.push_back(0);\n\tPolyhedron.face_materials.push_back(Material);\n\n\tPolyhedron.loop_first_edges.push_back(Polyhedron.clockwise_edges.size());\n\tfor(mesh::points_t::const_iterator point = Vertices.begin(); point != Vertices.end(); ++point)\n\t{\n\t\tPolyhedron.vertex_points.push_back(points.size());\n\t\tPolyhedron.vertex_selections.push_back(0);\n\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\t\tPolyhedron.edge_selections.push_back(0);\n\t\t\n\t\tpoints.push_back(*point);\n\t\tpoint_selection.push_back(0);\n\t}\n\tPolyhedron.clockwise_edges.back() = Polyhedron.loop_first_edges.back();\n\n\tfor(uint_t hole = 0; hole != Holes.size(); ++hole)\n\t{\n\t\tPolyhedron.loop_first_edges.push_back(Polyhedron.clockwise_edges.size());\n\t\tfor(mesh::points_t::const_iterator point = Holes[hole].begin(); point != Holes[hole].end(); ++point)\n\t\t{\n\t\t\tPolyhedron.vertex_points.push_back(points.size());\n\t\t\tPolyhedron.vertex_selections.push_back(0);\n\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\t\t\tPolyhedron.edge_selections.push_back(0);\n\t\t\t\n\t\t\tpoints.push_back(*point);\n\t\t\tpoint_selection.push_back(0);\n\t\t}\n\t\tPolyhedron.clockwise_edges.back() = Polyhedron.loop_first_edges.back();\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// add_grid\n\nvoid add_grid(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const uint_t Rows, const uint_t Columns, imaterial* const Material)\n{\n\ttry\n\t{\n\t\tif(!Rows)\n\t\t\tthrow std::runtime_error(\"Cannot create grid with zero rows.\");\n\n\t\tif(!Columns)\n\t\t\tthrow std::runtime_error(\"Cannot create grid with zero columns.\");\n\n\t\tif(Shell >= Polyhedron.shell_types.size())\n\t\t\tthrow std::runtime_error(\"Invalid shell.\");\n\n\t\tconst uint_t rows = Rows;\n\t\tconst uint_t columns = Columns;\n\t\tconst uint_t point_rows = rows + 1;\n\t\tconst uint_t point_columns = columns + 1;\n\n\t\t// Append points to the mesh (create the arrays if they don't already exist) ...\n\t\tmesh::points_t& points = Mesh.points ? Mesh.points.writable() : Mesh.points.create();\n\t\tmesh::selection_t& point_selection = Mesh.point_selection ? Mesh.point_selection.writable() : Mesh.point_selection.create();\n\n\t\tconst uint_t point_offset = points.size();\n\t\tpoints.insert(points.end(), point_rows * point_columns, point3());\n\t\tpoint_selection.insert(point_selection.end(), point_rows * point_columns, 0);\n\t\tMesh.point_attributes.set_row_count(points.size());\n\n\t\t// Append faces to the polyhedron ...\n\t\tfor(uint_t row = 0; row != rows; ++row)\n\t\t{\n\t\t\tfor(uint_t column = 0; column != columns; ++column)\n\t\t\t{\n\t\t\t\tPolyhedron.face_shells.push_back(Shell);\n\t\t\t\tPolyhedron.face_first_loops.push_back(Polyhedron.loop_first_edges.size());\n\t\t\t\tPolyhedron.face_loop_counts.push_back(1);\n\t\t\t\tPolyhedron.face_selections.push_back(0);\n\t\t\t\tPolyhedron.face_materials.push_back(Material);\n\n\t\t\t\tPolyhedron.loop_first_edges.push_back(Polyhedron.clockwise_edges.size());\n\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() - 3);\n\n\t\t\t\tPolyhedron.edge_selections.insert(Polyhedron.edge_selections.end(), 4, 0);\n\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + ((row + 0) * point_columns) + column + 0);\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + ((row + 0) * point_columns) + column + 1);\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + ((row + 1) * point_columns) + column + 1);\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + ((row + 1) * point_columns) + column + 0);\n\n\t\t\t\tPolyhedron.vertex_selections.insert(Polyhedron.vertex_selections.end(), 4, 0);\n\t\t\t}\n\t\t}\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// add_cylinder\n\nvoid add_cylinder(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const uint_t Rows, const uint_t Columns, imaterial* const Material)\n{\n\ttry\n\t{\n\t\tif(!Rows)\n\t\t\tthrow std::runtime_error(\"Cannot create cylinder with zero rows.\");\n\n\t\tif(Columns < 2)\n\t\t\tthrow std::runtime_error(\"Cannot create cylinder with <2 columns.\");\n\n\t\tif(Shell >= Polyhedron.shell_types.size())\n\t\t\tthrow std::runtime_error(\"Invalid shell.\");\n\n\t\tconst uint_t rows = Rows;\n\t\tconst uint_t columns = Columns;\n\t\tconst uint_t point_rows = rows + 1;\n\t\tconst uint_t point_columns = columns;\n\n\t\t// Append points to the mesh (create the arrays if they don't already exist) ...\n\t\tmesh::points_t& points = Mesh.points ? Mesh.points.writable() : Mesh.points.create();\n\t\tmesh::selection_t& point_selection = Mesh.point_selection ? Mesh.point_selection.writable() : Mesh.point_selection.create();\n\n\t\tconst uint_t point_offset = points.size();\n\t\tpoints.insert(points.end(), point_rows * point_columns, point3());\n\t\tpoint_selection.insert(point_selection.end(), point_rows * point_columns, 0);\n\t\tMesh.point_attributes.set_row_count(points.size());\n\n\t\t// Append faces to the polyhedron ...\n\t\tfor(uint_t row = 0; row != rows; ++row)\n\t\t{\n\t\t\tfor(uint_t column = 0; column != columns; ++column)\n\t\t\t{\n\t\t\t\tPolyhedron.face_shells.push_back(Shell);\n\t\t\t\tPolyhedron.face_first_loops.push_back(Polyhedron.loop_first_edges.size());\n\t\t\t\tPolyhedron.face_loop_counts.push_back(1);\n\t\t\t\tPolyhedron.face_selections.push_back(0);\n\t\t\t\tPolyhedron.face_materials.push_back(Material);\n\n\t\t\t\tPolyhedron.loop_first_edges.push_back(Polyhedron.clockwise_edges.size());\n\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() - 3);\n\n\t\t\t\tPolyhedron.edge_selections.insert(Polyhedron.edge_selections.end(), 4, 0);\n\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + ((row + 0) * point_columns) + (column + 0) % point_columns);\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + ((row + 0) * point_columns) + (column + 1) % point_columns);\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + ((row + 1) * point_columns) + (column + 1) % point_columns);\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + ((row + 1) * point_columns) + (column + 0) % point_columns);\n\n\t\t\t\tPolyhedron.vertex_selections.insert(Polyhedron.vertex_selections.end(), 4, 0);\n\t\t\t}\n\t\t}\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// add_torus\n\nvoid add_torus(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const uint_t Rows, const uint_t Columns, imaterial* const Material)\n{\n\ttry\n\t{\n\t\tif(Rows < 2)\n\t\t\tthrow std::runtime_error(\"Cannot create torus with <2 rows.\");\n\n\t\tif(Columns < 2)\n\t\t\tthrow std::runtime_error(\"Cannot create torus with <2 columns.\");\n\n\t\tif(Shell >= Polyhedron.shell_types.size())\n\t\t\tthrow std::runtime_error(\"Invalid shell.\");\n\n\t\tconst uint_t rows = Rows;\n\t\tconst uint_t columns = Columns;\n\t\tconst uint_t point_rows = rows;\n\t\tconst uint_t point_columns = columns;\n\n\t\t// Append points to the mesh (create the arrays if they don't already exist) ...\n\t\tmesh::points_t& points = Mesh.points ? Mesh.points.writable() : Mesh.points.create();\n\t\tmesh::selection_t& point_selection = Mesh.point_selection ? Mesh.point_selection.writable() : Mesh.point_selection.create();\n\n\t\tconst uint_t point_offset = points.size();\n\t\tpoints.insert(points.end(), point_rows * point_columns, point3());\n\t\tpoint_selection.insert(point_selection.end(), point_rows * point_columns, 0);\n\t\tMesh.point_attributes.set_row_count(points.size());\n\n\t\t// Append faces to the polyhedron ...\n\t\tfor(uint_t row = 0; row != rows; ++row)\n\t\t{\n\t\t\tfor(uint_t column = 0; column != columns; ++column)\n\t\t\t{\n\t\t\t\tPolyhedron.face_shells.push_back(Shell);\n\t\t\t\tPolyhedron.face_first_loops.push_back(Polyhedron.loop_first_edges.size());\n\t\t\t\tPolyhedron.face_loop_counts.push_back(1);\n\t\t\t\tPolyhedron.face_selections.push_back(0);\n\t\t\t\tPolyhedron.face_materials.push_back(Material);\n\n\t\t\t\tPolyhedron.loop_first_edges.push_back(Polyhedron.clockwise_edges.size());\n\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tPolyhedron.clockwise_edges.push_back(Polyhedron.clockwise_edges.size() - 3);\n\n\t\t\t\tPolyhedron.edge_selections.insert(Polyhedron.edge_selections.end(), 4, 0);\n\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + (((row + 0) % point_rows) * point_columns) + (column + 0) % point_columns);\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + (((row + 0) % point_rows) * point_columns) + (column + 1) % point_columns);\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + (((row + 1) % point_rows) * point_columns) + (column + 1) % point_columns);\n\t\t\t\tPolyhedron.vertex_points.push_back(point_offset + (((row + 1) % point_rows) * point_columns) + (column + 0) % point_columns);\n\n\t\t\t\tPolyhedron.vertex_selections.insert(Polyhedron.vertex_selections.end(), 4, 0);\n\t\t\t}\n\t\t}\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// is_triangles\n\nbool_t is_triangles(const const_primitive& Polyhedron)\n{\n\tconst uint_t face_begin = 0;\n\tconst uint_t face_end = face_begin + Polyhedron.face_first_loops.size();\n\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tuint_t edge_count = 0;\n\t\tconst uint_t first_edge = Polyhedron.loop_first_edges[Polyhedron.face_first_loops[face]];\n\t\tfor(uint_t edge = first_edge; ; )\n\t\t{\n\t\t\t++edge_count;\n\n\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\tif(edge == first_edge)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(edge_count != 3)\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// is_solid\n\nbool_t is_solid(const const_primitive& Polyhedron)\n{\n\t// K-3D uses a split-edge data structure to represent polyhedra.\n\t// We test for solidity by counting the number of edges that\n\t// connect each pair of points in the polyhedron.  A polyhedron is \n\t// solid if-and-only-if each pair of points is used by two edges.\n\n\tmesh::bools_t boundary_edges;\n\tmesh::indices_t adjacent_edges;\n\tcreate_edge_adjacency_lookup(Polyhedron.vertex_points, Polyhedron.clockwise_edges, boundary_edges, adjacent_edges);\n\treturn std::find(boundary_edges.begin(), boundary_edges.end(), true) == boundary_edges.end();\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// is_sds\n\nbool_t is_sds(const const_primitive& Polyhedron)\n{\n\treturn Polyhedron.shell_types.size() && (Polyhedron.shell_types[0] == CATMULL_CLARK);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// create_counterclockwise_edge_lookup\n\nvoid create_counterclockwise_edge_lookup(const const_primitive& Polyhedron, mesh::indices_t& CounterclockwiseEdges)\n{\n\tCounterclockwiseEdges.resize(Polyhedron.clockwise_edges.size());\n\n\tconst uint_t edge_begin = 0;\n\tconst uint_t edge_end = edge_begin + Polyhedron.clockwise_edges.size();\n\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\tCounterclockwiseEdges[Polyhedron.clockwise_edges[edge]] = edge;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// center\n\nconst point3 center(const mesh::indices_t& VertexPoints, const mesh::indices_t& ClockwiseEdges, const mesh::points_t& Points, const uint_t EdgeIndex)\n{\n\tpoint3 result(0, 0, 0);\n\n\tuint_t count = 0;\n\tfor(uint_t edge = EdgeIndex; ; )\n\t{\n\t\tresult += to_vector(Points[VertexPoints[edge]]);\n\t\t++count;\n\n\t\tedge = ClockwiseEdges[edge];\n\t\tif(edge == EdgeIndex)\n\t\t\tbreak;\n\t}\n\n\tif(count)\n\t\tresult /= static_cast<double>(count);\n\n\treturn result;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// normal\n\nconst normal3 normal(const mesh::indices_t& VertexPoints, const mesh::indices_t& ClockwiseEdges, const mesh::points_t& Points, const uint_t EdgeIndex)\n{\n\t// Calculates the normal for an edge loop using the summation method, which is more robust than the three-point methods (handles zero-length edges)\n\tnormal3 result(0, 0, 0);\n\n\tfor(uint_t edge = EdgeIndex; ; )\n\t{\n\t\tconst point3& i = Points[VertexPoints[edge]];\n\t\tconst point3& j = Points[VertexPoints[ClockwiseEdges[edge]]];\n\n\t\tresult[0] += (i[1] + j[1]) * (j[2] - i[2]);\n\t\tresult[1] += (i[2] + j[2]) * (j[0] - i[0]);\n\t\tresult[2] += (i[0] + j[0]) * (j[1] - i[1]);\n\n\t\tedge = ClockwiseEdges[edge];\n\t\tif(edge == EdgeIndex)\n\t\t\tbreak;\n\t}\n\n\treturn 0.5 * result;\n}\n\nconst normal3 normal(const point3& i, const point3& j, const point3& k)\n{\n\tnormal3 result(0, 0, 0);\n\n\tresult[0] += (i[1] + j[1]) * (j[2] - i[2]);\n\tresult[1] += (i[2] + j[2]) * (j[0] - i[0]);\n\tresult[2] += (i[0] + j[0]) * (j[1] - i[1]);\n\n\tresult[0] += (j[1] + k[1]) * (k[2] - j[2]);\n\tresult[1] += (j[2] + k[2]) * (k[0] - j[0]);\n\tresult[2] += (j[0] + k[0]) * (k[1] - j[1]);\n\n\tresult[0] += (k[1] + i[1]) * (i[2] - k[2]);\n\tresult[1] += (k[2] + i[2]) * (i[0] - k[0]);\n\tresult[2] += (k[0] + i[0]) * (i[1] - k[1]);\n\n\treturn 0.5 * result;\n}\n\nvoid create_face_normal_lookup(const mesh& Mesh, const const_primitive& Polyhedron, mesh::normals_t& Normals)\n{\n\tNormals.resize(Polyhedron.face_first_loops.size(), normal3(0, 0, 0));\n\n\treturn_if_fail(Mesh.points);\n\tconst mesh::points_t& points = *Mesh.points;\n\n\tconst uint_t face_begin = 0;\n\tconst uint_t face_end = face_begin + Polyhedron.face_first_loops.size();\n        for(uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tfor(uint_t edge = Polyhedron.loop_first_edges[Polyhedron.face_first_loops[face]]; ; )\n\t\t{\n\t\t\tconst point3& i = points[Polyhedron.vertex_points[edge]];\n\t\t\tconst point3& j = points[Polyhedron.vertex_points[Polyhedron.clockwise_edges[edge]]];\n\n\t\t\tNormals[face][0] += 0.5 * (i[1] + j[1]) * (j[2] - i[2]);\n\t\t\tNormals[face][1] += 0.5 * (i[2] + j[2]) * (j[0] - i[0]);\n\t\t\tNormals[face][2] += 0.5 * (i[0] + j[0]) * (j[1] - i[1]);\n\n\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\tif(edge == Polyhedron.loop_first_edges[Polyhedron.face_first_loops[face]])\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nnamespace detail\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// find_companion_worker\n\nclass find_companion_worker\n{\npublic:\n\tfind_companion_worker(\n\t\tconst mesh::indices_t& VertexPoints,\n\t\tconst mesh::indices_t& ClockwiseEdges,\n\t\tconst std::vector<mesh::indices_t>& PointEdges,\n\t\tmesh::bools_t& BoundaryEdges,\n\t\tmesh::indices_t& AdjacentEdges) :\n\t\t\tm_edge_points(VertexPoints),\n\t\t\tm_clockwise_edges(ClockwiseEdges),\n\t\t\tm_point_edges(PointEdges),\n\t\t\tm_boundary_edges(BoundaryEdges),\n\t\t\tm_adjacent_edges(AdjacentEdges)\n\t\t{\n\t\t}\n\t\n\tvoid operator()(const k3d::parallel::blocked_range<uint_t>& range) const\n\t{\n\t\tconst uint_t edge_begin = range.begin();\n\t\tconst uint_t edge_end = range.end();\n\t\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t{\n\t\t\tconst uint_t vertex1 = m_edge_points[edge];\n\t\t\tconst uint_t vertex2 = m_edge_points[m_clockwise_edges[edge]];\n\n\t\t\tconst mesh::indices_t& point_edges = m_point_edges[vertex2];\n\t\t\tconst uint_t first_index = 0;\n\t\t\tconst uint_t last_index = point_edges.size();\n\t\t\tm_adjacent_edges[edge] = edge;\n\t\t\tfor(uint_t i = first_index; i != last_index; ++i)\n\t\t\t{\n\t\t\t\tconst uint_t companion = point_edges[i];\n\t\t\t\tif(m_edge_points[m_clockwise_edges[companion]] == vertex1)\n\t\t\t\t{\n\t\t\t\t\tm_boundary_edges[edge] = false;\n\t\t\t\t\tm_adjacent_edges[edge] = companion;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\nprivate:\n\tconst mesh::indices_t& m_edge_points;\n\tconst mesh::indices_t& m_clockwise_edges;\n\tconst std::vector<mesh::indices_t>& m_point_edges;\n\tmesh::bools_t& m_boundary_edges;\n\tmesh::indices_t& m_adjacent_edges;\n};\n\n/// Returns true if a and b are collinear, up to the give threshold\n/**\n * The surfaces of the parallelogram formed by the projections of a and b in the\n * XY, XZ and YZ plane all need to be < Threshold for the points to be collinear\n */\nconst bool_t is_collinear(const vector3& a, const vector3& b, const double_t Threshold)\n{\n\tif(std::abs(a[0]*b[1] - a[1]*b[0]) > Threshold)\n\t\treturn false;\n\tif(std::abs(a[0]*b[2] - a[2]*b[0]) > Threshold)\n\t\treturn false;\n\tif(std::abs(a[1]*b[2] - a[2]*b[1]) > Threshold)\n\t\treturn false;\n\treturn true;\n}\n\n///////////////////////////////////////////////////\n// create_triangles (taken from the triangulate_faces plugin, put here for sharing with CGAL module.\n\nclass create_triangles :\n\tpublic triangulator\n{\n\ttypedef triangulator base;\n\npublic:\n\tmesh::primitive* process(const mesh& Input, const const_primitive& Polyhedron, mesh& Output)\n\t{\n\t\t// Allocate new data structures for our output ...\n\t\tinput_polyhedron = &Polyhedron;\n\n\t\tmesh::primitive* const result = new mesh::primitive();\n\t\toutput_polyhedron.reset(create(*result));\n\n\t\toutput_points = &Output.points.create(new mesh::points_t(*Input.points));\n\t\toutput_point_selection = &Output.point_selection.create(new mesh::selection_t(Input.points->size(), 0.0));\n\n\t\t// Setup copying of attribute arrays ...\n\t\toutput_polyhedron->constant_attributes = input_polyhedron->constant_attributes;\n\n\t\toutput_polyhedron->face_attributes = input_polyhedron->face_attributes.clone_types();\n\t\tface_attributes_copier.reset(new table_copier(input_polyhedron->face_attributes, output_polyhedron->face_attributes));\n\n\t\toutput_polyhedron->edge_attributes = input_polyhedron->edge_attributes.clone_types();\n\t\tedge_attributes_copier.reset(new table_copier(input_polyhedron->edge_attributes, output_polyhedron->edge_attributes));\n\n\t\toutput_polyhedron->vertex_attributes = input_polyhedron->vertex_attributes.clone_types();\n\t\tvertex_attributes_copier.reset(new table_copier(input_polyhedron->vertex_attributes, output_polyhedron->vertex_attributes));\n\n\t\tOutput.point_attributes = Input.point_attributes.clone();\n\t\tpoint_attributes_copier.reset(new table_copier(Input.point_attributes, Output.point_attributes));\n\n\t\t// Create the output polyhedron ...\n\t\tconst uint_t face_begin = 0;\n\t\tconst uint_t face_end = face_begin + Polyhedron.face_first_loops.size();\n\t\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t\t{\n\t\t\tif(Polyhedron.face_selections[face])\n\t\t\t{\n\t\t\t\tbase::process(\n\t\t\t\t\t*Input.points,\n\t\t\t\t\tPolyhedron.face_first_loops,\n\t\t\t\t\tPolyhedron.face_loop_counts,\n\t\t\t\t\tPolyhedron.loop_first_edges,\n\t\t\t\t\tPolyhedron.vertex_points,\n\t\t\t\t\tPolyhedron.clockwise_edges,\n\t\t\t\t\tface);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadd_existing_face(face);\n\t\t\t}\n\t\t}\n\n\t\toutput_polyhedron->shell_types.assign(input_polyhedron->shell_types.size(), POLYGONS);\n\n\t\treturn result;\n\t}\n\t\nprivate:\n\tvoid start_face(const uint_t Face)\n\t{\n\t\tcurrent_face = Face;\n\t}\n\n\tvoid add_vertex(const point3& Coordinates, uint_t Vertices[4], uint_t Edges[4], double Weights[4], uint_t& NewVertex)\n\t{\n\t\tNewVertex = output_points->size();\n\n\t\toutput_points->push_back(Coordinates);\n\t\toutput_point_selection->push_back(0.0);\n\n\t\tpoint_attributes_copier->push_back(4, Vertices, Weights);\n\n\t\tnew_edge_attributes[NewVertex] = new_edge_record(Edges, Weights);\n\t}\n\n\tvoid add_triangle(uint_t Vertices[3], uint_t Edges[3])\n\t{\n\t\toutput_polyhedron->face_shells.push_back(input_polyhedron->face_shells[current_face]);\n\t\toutput_polyhedron->face_first_loops.push_back(output_polyhedron->loop_first_edges.size());\n\t\toutput_polyhedron->face_loop_counts.push_back(1);\n\t\toutput_polyhedron->face_selections.push_back(1.0);\n\t\toutput_polyhedron->face_materials.push_back(input_polyhedron->face_materials[current_face]);\n\n\t\tface_attributes_copier->push_back(current_face);\n\n\t\toutput_polyhedron->loop_first_edges.push_back(output_polyhedron->clockwise_edges.size());\n\t\toutput_polyhedron->vertex_points.push_back(Vertices[0]);\n\t\toutput_polyhedron->vertex_points.push_back(Vertices[1]);\n\t\toutput_polyhedron->vertex_points.push_back(Vertices[2]);\n\t\toutput_polyhedron->vertex_selections.push_back(0.0);\n\t\toutput_polyhedron->vertex_selections.push_back(0.0);\n\t\toutput_polyhedron->vertex_selections.push_back(0.0);\n\t\toutput_polyhedron->clockwise_edges.push_back(output_polyhedron->vertex_points.size() - 2);\n\t\toutput_polyhedron->clockwise_edges.push_back(output_polyhedron->vertex_points.size() - 1);\n\t\toutput_polyhedron->clockwise_edges.push_back(output_polyhedron->vertex_points.size() - 3);\n\t\toutput_polyhedron->edge_selections.push_back(0.0);\n\t\toutput_polyhedron->edge_selections.push_back(0.0);\n\t\toutput_polyhedron->edge_selections.push_back(0.0);\n\n\t\tfor(uint_t i = 0; i != 3; ++i)\n\t\t{\n\t\t\tif(new_edge_attributes.count(Vertices[i]))\n\t\t\t{\n\t\t\t\tedge_attributes_copier->push_back(4, new_edge_attributes[Vertices[i]].edges, new_edge_attributes[Vertices[i]].weights);\n\t\t\t\tvertex_attributes_copier->push_back(4, new_edge_attributes[Vertices[i]].edges, new_edge_attributes[Vertices[i]].weights);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tedge_attributes_copier->push_back(Edges[i]);\n\t\t\t\tvertex_attributes_copier->push_back(Edges[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid add_existing_face(const uint_t Face)\n\t{\n\t\toutput_polyhedron->face_shells.push_back(input_polyhedron->face_shells[Face]);\n\t\toutput_polyhedron->face_first_loops.push_back(output_polyhedron->loop_first_edges.size());\n\t\toutput_polyhedron->face_loop_counts.push_back(input_polyhedron->face_loop_counts[Face]);\n\t\toutput_polyhedron->face_selections.push_back(0.0);\n\t\toutput_polyhedron->face_materials.push_back(input_polyhedron->face_materials[Face]);\n\n\t\tface_attributes_copier->push_back(Face);\n\n\t\tconst uint_t loop_begin = input_polyhedron->face_first_loops[Face];\n\t\tconst uint_t loop_end = loop_begin + input_polyhedron->face_loop_counts[Face];\n\t\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\toutput_polyhedron->loop_first_edges.push_back(output_polyhedron->vertex_points.size());\n\n\t\t\tconst uint_t first_edge = input_polyhedron->loop_first_edges[loop];\n\t\t\tconst uint_t edge_offset = output_polyhedron->vertex_points.size() - first_edge;\n\t\t\tfor(uint_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\toutput_polyhedron->vertex_points.push_back(input_polyhedron->vertex_points[edge]);\n\t\t\t\toutput_polyhedron->vertex_selections.push_back(0.0);\n\t\t\t\toutput_polyhedron->clockwise_edges.push_back(input_polyhedron->clockwise_edges[edge] + edge_offset);\n\t\t\t\toutput_polyhedron->edge_selections.push_back(0.0);\n\t\t\t\tedge_attributes_copier->push_back(edge);\n\t\t\t\tvertex_attributes_copier->push_back(edge);\n\n\t\t\t\tedge = input_polyhedron->clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst const_primitive* input_polyhedron;\n\n\tmesh::points_t* output_points;\n\tmesh::selection_t* output_point_selection;\n\tboost::scoped_ptr<primitive> output_polyhedron;\n\n\tboost::shared_ptr<table_copier> face_attributes_copier;\n\tboost::shared_ptr<table_copier> edge_attributes_copier;\n\tboost::shared_ptr<table_copier> vertex_attributes_copier;\n\tboost::shared_ptr<table_copier> point_attributes_copier;\n\n\tuint_t current_face;\n\n\tstruct new_edge_record\n\t{\n\t\tnew_edge_record()\n\t\t{\n\t\t}\n\n\t\tnew_edge_record(uint_t Edges[4], double_t Weights[4])\n\t\t{\n\t\t\tstd::copy(Edges, Edges + 4, edges);\n\t\t\tstd::copy(Weights, Weights + 4, weights);\n\t\t}\n\n\t\tuint_t edges[4];\n\t\tdouble_t weights[4];\n\t};\n\n\tstd::map<uint_t, new_edge_record> new_edge_attributes;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create_edge_adjacency_lookup\n\nvoid create_point_out_edge_lookup(const mesh::indices_t& VertexPoints, const mesh::indices_t& ClockwiseEdges, std::vector<mesh::indices_t>& AdjacencyList)\n{\n\tconst uint_t edge_begin = 0;\n\tconst uint_t edge_end = edge_begin + ClockwiseEdges.size();\n\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t{\n\t\tAdjacencyList[VertexPoints[edge]].push_back(edge);\n\t}\n}\n\nvoid create_edge_adjacency_lookup(const mesh::indices_t& VertexPoints, const mesh::indices_t& ClockwiseEdges, mesh::bools_t& BoundaryEdges, mesh::indices_t& AdjacentEdges)\n{\n\tconst k3d::uint_t count = VertexPoints.empty() ? 0 : *std::max_element(VertexPoints.begin(), VertexPoints.end()) + 1;\n\tif(!count)\n\t\treturn;\n\tstd::vector<mesh::indices_t> point_edges(count);\n\tcreate_point_out_edge_lookup(VertexPoints, ClockwiseEdges, point_edges);\n\n\tBoundaryEdges.assign(VertexPoints.size(), true);\n\tAdjacentEdges.assign(VertexPoints.size(), 0);\n\n\tconst uint_t edge_begin = 0;\n\tconst uint_t edge_end = edge_begin + VertexPoints.size();\n\t\n\t// Making this parallel decreases running time by 20 % on a Pentium D. \n\tk3d::parallel::parallel_for(\n\t\t\t\tk3d::parallel::blocked_range<uint_t>(edge_begin, edge_end, k3d::parallel::grain_size()),\n\t\t\t\tdetail::find_companion_worker(VertexPoints, ClockwiseEdges, point_edges, BoundaryEdges, AdjacentEdges));\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create_edge_face_lookup\n\nvoid create_edge_face_lookup(const const_primitive& Polyhedron, mesh::indices_t& EdgeFaces)\n{\n\tEdgeFaces.assign(Polyhedron.clockwise_edges.size(), 0);\n\n\tconst uint_t face_begin = 0;\n\tconst uint_t face_end = face_begin + Polyhedron.face_first_loops.size();\n\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tconst uint_t loop_begin = Polyhedron.face_first_loops[face];\n\t\tconst uint_t loop_end = loop_begin + Polyhedron.face_loop_counts[face];\n\t\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst uint_t first_edge = Polyhedron.loop_first_edges[loop];\n\t\t\tfor(uint_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\tEdgeFaces[edge] = face;\n\n\t\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid create_loop_edge_count_lookup(const const_primitive& Polyhedron, mesh::counts_t& LoopEdgeCounts)\n{\n\tLoopEdgeCounts.assign(Polyhedron.loop_first_edges.size(), 0);\n\n\tconst uint_t loop_begin = 0;\n\tconst uint_t loop_end = loop_begin + Polyhedron.loop_first_edges.size();\n\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t{\n\t\tconst uint_t first_edge = Polyhedron.loop_first_edges[loop];\n\t\tfor(uint_t edge = first_edge; ;)\n\t\t{\n\t\t\t++LoopEdgeCounts[loop];\n\n\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\tif(edge == first_edge)\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create_point_face_lookup\n\nvoid create_point_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& VertexPoints, const mesh::indices_t& ClockwiseEdges, const mesh::points_t& Points, mesh::indices_t& PointFirstFaces, mesh::counts_t& PointFaceCounts, mesh::indices_t& PointFaces)\n{\n\tlog() << warning << k3d_file_reference << \" is deprecated\" << std::endl;\n\n\tstd::vector<std::vector<uint_t> > adjacency_list(Points.size());\n\n\tconst uint_t face_begin = 0;\n\tconst uint_t face_end = face_begin + FaceFirstLoops.size();\n\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tconst uint_t loop_begin = FaceFirstLoops[face];\n\t\tconst uint_t loop_end = loop_begin + FaceLoopCounts[face];\n\t\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst uint_t first_edge = LoopFirstEdges[loop];\n\t\t\tfor(uint_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\tadjacency_list[VertexPoints[edge]].push_back(face);\n\n\t\t\t\tedge = ClockwiseEdges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tPointFirstFaces.assign(Points.size(), 0);\n\tPointFaceCounts.assign(Points.size(), 0);\n\tPointFaces.clear();\n\n\tconst uint_t point_begin = 0;\n\tconst uint_t point_end = point_begin + Points.size();\n\tfor(uint_t point = point_begin; point != point_end; ++point)\n\t{\n\t\tPointFirstFaces[point] = PointFaces.size();\n\t\tPointFaceCounts[point] = adjacency_list[point].size();\n\t\tPointFaces.insert(PointFaces.end(), adjacency_list[point].begin(), adjacency_list[point].end());\n\t}\n}\n\nvoid create_point_face_lookup(const mesh& Mesh, const const_primitive& Polyhedron, std::vector<mesh::indices_t>& AdjacencyList)\n{\n\tAdjacencyList.resize(Mesh.points->size());\n\n\tconst uint_t face_begin = 0;\n\tconst uint_t face_end = face_begin + Polyhedron.face_shells.size();\n\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tconst uint_t loop_begin = Polyhedron.face_first_loops[face];\n\t\tconst uint_t loop_end = loop_begin + Polyhedron.face_loop_counts[face];\n\t\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst uint_t first_edge = Polyhedron.loop_first_edges[loop];\n\t\t\tfor(uint_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\tAdjacencyList[Polyhedron.vertex_points[edge]].push_back(face);\n\n\t\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create_point_out_edge_lookup\n\nvoid create_point_out_edge_lookup(const mesh& Mesh, const const_primitive& Polyhedron, std::vector<mesh::indices_t>& AdjacencyList)\n{\n\tAdjacencyList.resize(Mesh.points->size());\n\tcreate_point_out_edge_lookup(Polyhedron.vertex_points, Polyhedron.clockwise_edges, AdjacencyList);\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create_point_in_edge_lookup\n\nvoid create_point_in_edge_lookup(const mesh& Mesh, const const_primitive& Polyhedron, std::vector<mesh::indices_t>& AdjacencyList)\n{\n\tAdjacencyList.resize(Mesh.points->size());\n\n\tconst uint_t edge_begin = 0;\n\tconst uint_t edge_end = edge_begin + Polyhedron.clockwise_edges.size();\n\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t{\n\t\tAdjacencyList[Polyhedron.vertex_points[Polyhedron.clockwise_edges[edge]]].push_back(edge);\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create_point_edge_lookup\n\nvoid create_point_edge_lookup(const mesh& Mesh, const const_primitive& Polyhedron, std::vector<mesh::indices_t>& AdjacencyList)\n{\n\tAdjacencyList.resize(Mesh.points->size());\n\n\tconst uint_t edge_begin = 0;\n\tconst uint_t edge_end = edge_begin + Polyhedron.clockwise_edges.size();\n\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t{\n\t\tAdjacencyList[Polyhedron.vertex_points[edge]].push_back(edge);\n\t\tAdjacencyList[Polyhedron.vertex_points[Polyhedron.clockwise_edges[edge]]].push_back(edge);\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create_point_edge_lookup\n\nvoid create_point_edge_lookup(const mesh::indices_t& VertexPoints, mesh::indices_t& PointEdges, mesh::indices_t& PointFirstEdges, mesh::counts_t& PointEdgeCounts)\n{\n\tlog() << warning << k3d_file_reference << \" is deprecated\" << std::endl;\n\n\tif(PointEdgeCounts.empty())\n\t\tcreate_point_valence_lookup(0, VertexPoints, PointEdgeCounts);\n\tconst uint_t point_count = PointEdgeCounts.size();\n\tmesh::counts_t found_edges(point_count, 0);\n\tPointFirstEdges.assign(point_count, 0); // first edge in point_edges for each point\n\tPointEdges.assign(VertexPoints.size(), 0);\n\tuint_t count = 0;\n\tfor(uint_t point = 0; point != point_count; ++point)\n\t{\n\t\tPointFirstEdges[point] = count;\n\t\tcount += PointEdgeCounts[point];\n\t}\n\n\tconst uint_t edge_begin = 0;\n\tconst uint_t edge_end = edge_begin + VertexPoints.size();\n\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t{\n\t\tconst uint_t point = VertexPoints[edge];\n\t\tPointEdges[PointFirstEdges[point] + found_edges[point]] = edge;\n\t\t++found_edges[point];\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create_point_valence_lookup\n\nvoid create_point_valence_lookup(const uint_t PointCount, const mesh::indices_t& VertexPoints, mesh::counts_t& Valences)\n{\n\tlog() << warning << k3d_file_reference << \" is deprecated\" << std::endl;\n\n\tValences.assign(PointCount, 0);\n\t\n\t// Add 1 for each edge that starts at a point\n\tuint_t edge_count = VertexPoints.size();\n\tfor (uint_t edge = 0; edge != edge_count; ++edge)\n\t{\n\t\tconst uint_t edge_point = VertexPoints[edge];\n\t\tif(edge_point >= Valences.size()) // In case PointCount was not known to the caller\n\t\t\tValences.resize(edge_point + 1, 0);\n\t\t++Valences[edge_point];\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create_boundary_face_lookup\n\nvoid create_boundary_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& ClockwiseEdges, const mesh::bools_t& BoundaryEdges, const mesh::indices_t& AdjacentEdges, mesh::bools_t& BoundaryFaces)\n{\n\tBoundaryFaces.clear();\n\tBoundaryFaces.resize(FaceFirstLoops.size());\n\t\n\tconst uint_t face_begin = 0;\n\tconst uint_t face_end = face_begin + FaceFirstLoops.size();\n\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tconst uint_t loop_begin = FaceFirstLoops[face];\n\t\tconst uint_t loop_end = loop_begin + FaceLoopCounts[face];\n\t\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst uint_t first_edge = LoopFirstEdges[loop];\n\t\t\tfor(uint_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\tif (BoundaryEdges[edge])\n\t\t\t\t{\n\t\t\t\t\tBoundaryFaces[face] = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tedge = ClockwiseEdges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// mark_collinear_edges\n\nvoid mark_collinear_edges(mesh::indices_t& RedundantEdges, const mesh::selection_t& EdgeSelection, const mesh::points_t& Points, const mesh::indices_t& VertexPoints, const mesh::indices_t& ClockwiseEdges, const mesh::counts_t& VertexValences, const mesh::bools_t& BoundaryEdges, const mesh::indices_t& AdjacentEdges, const double_t Threshold)\n{\n\tfor(uint_t edge = 0; edge != VertexPoints.size(); ++edge)\n\t{\n\t\tif(!EdgeSelection[edge])\n\t\t\tcontinue;\n\t\tconst uint_t clockwise = ClockwiseEdges[edge];\n\t\tconst uint_t p1_index = VertexPoints[edge];\n\t\tconst uint_t p2_index = VertexPoints[clockwise];\n\t\tconst uint_t p3_index = VertexPoints[ClockwiseEdges[clockwise]];\n\t\t// valence must be 2 for internal edges or 1 for boundary edges\n\t\tif(!((!BoundaryEdges[clockwise] && VertexValences[p2_index] == 2) || (BoundaryEdges[clockwise] && VertexValences[p2_index] == 1)))\n\t\t\tcontinue;\n\t\t\n\t\tconst point3& p1 = Points[p1_index];\n\t\tconst point3& p2 = Points[p2_index];\n\t\tconst point3& p3 = Points[p3_index];\n\t\t\n\t\tif(detail::is_collinear(p1-p2, p1-p3, Threshold))\n\t\t{\n\t\t\tRedundantEdges.push_back(clockwise);\n\t\t}\n\t}\n}\n\nvoid mark_coplanar_edges(const mesh::indices_t& Companions,\n\t\tconst mesh::bools_t& BoundaryEdges,\n\t\tconst mesh::normals_t& Normals,\n\t\tconst mesh::indices_t& EdgeFaces,\n\t\tconst mesh::selection_t& FaceSelection,\n\t\tmesh::indices_t& RedundantEdges,\n\t\tconst double_t Threshold)\n{\n\tfor(uint_t edge = 0; edge != Companions.size(); ++edge)\n\t{\n\t\tif(BoundaryEdges[edge])\n\t\t\tcontinue;\n\t\t\n\t\tconst uint_t face = EdgeFaces[edge];\n\t\tif(!FaceSelection[face])\n\t\t\tcontinue;\n\t\t\n\t\tconst uint_t companion = Companions[edge];\n\t\tconst uint_t companion_face = EdgeFaces[companion];\n\t\tif(!FaceSelection[companion_face])\n\t\t\tcontinue;\n\t\t\n\t\tif((!Normals[face].length()) || (std::abs((Normals[face] * Normals[companion_face]) - 1) < Threshold))\n\t\t\tRedundantEdges.push_back(edge);\n\t}\n}\n\n////////////////////////////////////////////\n// triangulate\n\nmesh::primitive* triangulate(const mesh& Input, const const_primitive& Polyhedron, mesh& Output)\n{\n\treturn detail::create_triangles().process(Input, Polyhedron, Output);\n}\n\n////////////////////////////////////////////\n// delete_components\n\nvoid delete_components(const mesh& Mesh, primitive& Polyhedron, const mesh::bools_t& RemovePoints, mesh::bools_t& RemoveEdges, mesh::bools_t& RemoveLoops, mesh::bools_t& RemoveFaces)\n{\n\t// Sanity checks ...\n\treturn_if_fail(RemovePoints.size() == Mesh.points->size());\n\treturn_if_fail(RemoveEdges.size() == Polyhedron.clockwise_edges.size());\n\treturn_if_fail(RemoveLoops.size() == Polyhedron.loop_first_edges.size());\n\treturn_if_fail(RemoveFaces.size() == Polyhedron.face_shells.size());\n\n\t// Cache some useful stuff up-front ...\n\tconst uint_t face_begin = 0;\n\tconst uint_t face_end = face_begin + Polyhedron.face_shells.size();\n\n\tconst uint_t edge_begin = 0;\n\tconst uint_t edge_end = edge_begin + Polyhedron.clockwise_edges.size();\n\n\tconst uint_t loop_begin = 0;\n\tconst uint_t loop_end = loop_begin + Polyhedron.loop_first_edges.size();\n\n\t// Mark edges to be implicitly removed because their points are going away ...\n\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t{\n\t\tif(!RemovePoints[Polyhedron.vertex_points[edge]])\n\t\t\tcontinue;\n\n\t\tRemoveEdges[edge] = true;\n\t}\n\n\t// Mark loops to be implicitly removed because they have fewer than three edges remaining ...\n\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t{\n\t\tconst uint_t first_edge = Polyhedron.loop_first_edges[loop];\n\n\t\tuint_t remaining_edge_count = 0;\n\t\tfor(uint_t edge = first_edge; ;)\n\t\t{\n\t\t\tif(!RemoveEdges[edge])\n\t\t\t\t++remaining_edge_count;\n\n\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\tif(edge == first_edge)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(remaining_edge_count < 3)\n\t\t\tRemoveLoops[loop] = true;\n\t}\n\n\t// Mark faces to be implicitly removed because their first loop is going away ...\n\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tif(RemoveFaces[face])\n\t\t\tcontinue;\n\n\t\tif(RemoveLoops[Polyhedron.face_first_loops[face]])\n\t\t\tRemoveFaces[face] = true;\n\t}\n\n\t// Mark loops and edges to be implicitly removed because their face is going away ...\n\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tif(!RemoveFaces[face])\n\t\t\tcontinue;\n\n\t\tconst uint_t loop_begin = Polyhedron.face_first_loops[face];\n\t\tconst uint_t loop_end = loop_begin + Polyhedron.face_loop_counts[face];\n\t\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tRemoveLoops[loop] = true;\n\n\t\t\tconst uint_t first_edge = Polyhedron.loop_first_edges[loop];\n\t\t\tfor(uint_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\tRemoveEdges[edge] = true;\n\n\t\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compute new first edges for loops ...\n\tmesh::indices_t new_first_edge(Polyhedron.loop_first_edges.size());\n\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t{\n\t\tif(RemoveLoops[loop])\n\t\t\tcontinue;\n\n\t\tconst uint_t first_edge = Polyhedron.loop_first_edges[loop];\n\t\tfor(uint_t edge = first_edge; ;)\n\t\t{\n\t\t\tif(!RemoveEdges[edge])\n\t\t\t{\n\t\t\t\tnew_first_edge[loop] = edge;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\tif(edge == first_edge)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Compute new clockwise_edges ...\n\tmesh::indices_t new_clockwise_edge(Polyhedron.clockwise_edges.size());\n\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t{\n\t\tif(RemoveLoops[loop])\n\t\t\tcontinue;\n\n\t\tconst uint_t first_edge = Polyhedron.loop_first_edges[loop];\n\n\t\tmesh::indices_t remaining_edges;\n\t\tfor(uint_t edge = first_edge; ;)\n\t\t{\n\t\t\tif(!RemoveEdges[edge])\n\t\t\t\tremaining_edges.push_back(edge);\n\n\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\tif(edge == first_edge)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tfor(uint_t e = 0; e != remaining_edges.size(); ++e)\n\t\t{\n\t\t\tnew_clockwise_edge[remaining_edges[e]] = remaining_edges[(e+1)%remaining_edges.size()];\n\t\t}\n\t}\n\n\t// Compute maps and remaining component counts ...\n\tmesh::indices_t face_map;\n\tmesh::create_index_removal_map(RemoveFaces, face_map);\n\tconst uint_t remaining_faces = std::count(RemoveFaces.begin(), RemoveFaces.end(), false);\n\n\tmesh::indices_t loop_map;\n\tmesh::create_index_removal_map(RemoveLoops, loop_map);\n\tconst uint_t remaining_loops = std::count(RemoveLoops.begin(), RemoveLoops.end(), false);\n\n\tmesh::indices_t edge_map;\n\tmesh::create_index_removal_map(RemoveEdges, edge_map);\n\tconst uint_t remaining_edges = std::count(RemoveEdges.begin(), RemoveEdges.end(), false);\n\n\t// Delete faces, updating loop indices as we go ...\n\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tif(RemoveFaces[face])\n\t\t\tcontinue;\n\n\t\tPolyhedron.face_shells[face_map[face]] = Polyhedron.face_shells[face];\n\t\tPolyhedron.face_first_loops[face_map[face]] = loop_map[Polyhedron.face_first_loops[face]];\n\t\tPolyhedron.face_loop_counts[face_map[face]] = Polyhedron.face_loop_counts[face];\n\t\tPolyhedron.face_selections[face_map[face]] = Polyhedron.face_selections[face];\n\t\tPolyhedron.face_materials[face_map[face]] = Polyhedron.face_materials[face];\n\t}\n\tPolyhedron.face_shells.resize(remaining_faces);\n\tPolyhedron.face_first_loops.resize(remaining_faces);\n\tPolyhedron.face_loop_counts.resize(remaining_faces);\n\tPolyhedron.face_selections.resize(remaining_faces);\n\tPolyhedron.face_materials.resize(remaining_faces);\n\n\t// Delete face attributes ...\n\ttable_copier face_attribute_copier(Polyhedron.face_attributes);\n\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tif(RemoveFaces[face])\n\t\t\tcontinue;\n\n\t\tface_attribute_copier.copy(face, face_map[face]);\n\t}\n\tPolyhedron.face_attributes.set_row_count(remaining_faces);\n\n\t// Delete loops, updating edge indices as we go ...\n\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t{\n\t\tif(RemoveLoops[loop])\n\t\t\tcontinue;\n\n\t\tPolyhedron.loop_first_edges[loop_map[loop]] = edge_map[new_first_edge[loop]];\n\t}\n\tPolyhedron.loop_first_edges.resize(remaining_loops);\n\n\t// Delete edges, updating edge indices as we go ...\n\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t{\n\t\tif(RemoveEdges[edge])\n\t\t\tcontinue;\n\n\t\tPolyhedron.clockwise_edges[edge_map[edge]] = edge_map[new_clockwise_edge[edge]];\n\t\tPolyhedron.edge_selections[edge_map[edge]] = Polyhedron.edge_selections[edge];\n\t\tPolyhedron.vertex_points[edge_map[edge]] = Polyhedron.vertex_points[edge];\n\t\tPolyhedron.vertex_selections[edge_map[edge]] = Polyhedron.vertex_selections[edge];\n\t}\n\tPolyhedron.clockwise_edges.resize(remaining_edges);\n\tPolyhedron.edge_selections.resize(remaining_edges);\n\tPolyhedron.vertex_points.resize(remaining_edges);\n\tPolyhedron.vertex_selections.resize(remaining_edges);\n\n\t// Delete edge attributes ...\n\ttable_copier edge_attribute_copier(Polyhedron.edge_attributes);\n\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t{\n\t\tif(RemoveEdges[edge])\n\t\t\tcontinue;\n\n\t\tedge_attribute_copier.copy(edge, edge_map[edge]);\n\t}\n\tPolyhedron.edge_attributes.set_row_count(remaining_edges);\n\n\t// Delete vertex attributes ...\n\ttable_copier vertex_attribute_copier(Polyhedron.vertex_attributes);\n\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t{\n\t\tif(RemoveEdges[edge])\n\t\t\tcontinue;\n\n\t\tvertex_attribute_copier.copy(edge, edge_map[edge]);\n\t}\n\tPolyhedron.vertex_attributes.set_row_count(remaining_edges);\n}\n\n} // namespace polyhedron\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/polyhedron.h",
    "content": "#ifndef K3DSDK_POLYHEDRON_H\n#define K3DSDK_POLYHEDRON_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace polyhedron\n{\n\n/// Defines allowable polyhedron types\nenum polyhedron_type\n{\n\tPOLYGONS = 0,\n\tCATMULL_CLARK = 1,\n};\n\nclass primitive;\n\n/// Gathers the member arrays of a polyhedron primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst typed_array<int32_t>& ShellTypes,\n\t\tconst mesh::indices_t& FaceShells,\n\t\tconst mesh::indices_t& FaceFirstLoops,\n\t\tconst mesh::counts_t& FaceLoopCounts,\n\t\tconst mesh::selection_t& FaceSelections,\n\t\tconst mesh::materials_t& FaceMaterials,\n\t\tconst mesh::indices_t& LoopFirstEdges,\n\t\tconst mesh::indices_t& ClockwiseEdges,\n\t\tconst mesh::selection_t& EdgeSelections,\n\t\tconst mesh::indices_t& VertexPoints,\n\t\tconst mesh::selection_t& VertexSelections,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& FaceAttributes,\n\t\tconst mesh::table_t& EdgeAttributes,\n\t\tconst mesh::table_t& VertexAttributes\n\t\t);\n\n\t/// Implicit conversion\n\tconst_primitive(const primitive& Primitive);\n\n\tconst typed_array<int32_t>& shell_types;\n\tconst mesh::indices_t& face_shells;\n\tconst mesh::indices_t& face_first_loops;\n\tconst mesh::counts_t& face_loop_counts;\n\tconst mesh::selection_t& face_selections;\n\tconst mesh::materials_t& face_materials;\n\tconst mesh::indices_t& loop_first_edges;\n\tconst mesh::indices_t& clockwise_edges;\n\tconst mesh::selection_t& edge_selections;\n\tconst mesh::indices_t& vertex_points;\n\tconst mesh::selection_t& vertex_selections;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& face_attributes;\n\tconst mesh::table_t& edge_attributes;\n\tconst mesh::table_t& vertex_attributes;\n};\n\n/// Gathers the member arrays of a polyhedron primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\ttyped_array<int32_t>& ShellTypes,\n\t\tmesh::indices_t& FaceShells,\n\t\tmesh::indices_t& FaceFirstLoops,\n\t\tmesh::counts_t& FaceLoopCounts,\n\t\tmesh::selection_t& FaceSelections,\n\t\tmesh::materials_t& FaceMaterials,\n\t\tmesh::indices_t& LoopFirstEdges,\n\t\tmesh::indices_t& ClockwiseEdges,\n\t\tmesh::selection_t& EdgeSelections,\n\t\tmesh::indices_t& VertexPoints,\n\t\tmesh::selection_t& VertexSelections,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& FaceAttributes,\n\t\tmesh::table_t& EdgeAttributes,\n\t\tmesh::table_t& VertexAttributes\n\t\t);\n\n\ttyped_array<int32_t>& shell_types;\n\tmesh::indices_t& face_shells;\n\tmesh::indices_t& face_first_loops;\n\tmesh::counts_t& face_loop_counts;\n\tmesh::selection_t& face_selections;\n\tmesh::materials_t& face_materials;\n\tmesh::indices_t& loop_first_edges;\n\tmesh::indices_t& clockwise_edges;\n\tmesh::selection_t& edge_selections;\n\tmesh::indices_t& vertex_points;\n\tmesh::selection_t& vertex_selections;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& face_attributes;\n\tmesh::table_t& edge_attributes;\n\tmesh::table_t& vertex_attributes;\n};\n\n/// Creates a new polyhedron mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh::primitive& GenericPrimitive);\n\n/// Creates a new polyhedron mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Creates a new polyhedron mesh primitive from a list of vertices and face indices, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh, const mesh::points_t& Vertices, const mesh::counts_t& VertexCounts, const mesh::indices_t& VertexIndices, imaterial* const Material);\n\n/// Creates a new polyhedron mesh primitive from a list of vertices, texture coordinates, and face indices, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh, const mesh::points_t& Vertices, const mesh::counts_t& VertexCounts, const mesh::indices_t& VertexIndices, const mesh::texture_coordinates_t& TextureCoordinates, imaterial* const Material);\n\n/// Tests the given mesh primitive to see if it is a valid polyhedron, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid polyhedron, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid polyhedron, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n/// Adds a triangle to an existing polyhedron shell.  Preconditions: the polyhedron must already contain at least one shell.\nvoid add_triangle(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const uint_t V1, const uint_t V2, const uint_t V3, imaterial* const Material);\n/// Adds a quadrilateral to an existing polyhedron shell.  Preconditions: the polyhedron must already contain at least one shell.\nvoid add_quadrilateral(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const uint_t V1, const uint_t V2, const uint_t V3, const uint_t V4, imaterial* const Material);\n/// Adds a face to an existing polyhedron shell.  Preconditions: the polyhedron must already contain at least one shell.\nvoid add_face(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const mesh::points_t& Vertices, imaterial* const Material);\n/// Adds a face with holes to an existing polyhedron shell.  Preconditions: the polyhedron must already contain at least one shell.\nvoid add_face(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const mesh::points_t& Vertices, const std::vector<mesh::points_t>& Holes, imaterial* const Material);\n/// Adds a set of points and faces that form a topological \"grid\" with the given number of rows and columns to an existing polyhedron.\n/// The geometry (vertex coordinates) of the grid is undefined, and must be set by the caller after add_grid() returns.\n/// Preconditions: the polyhedron must contain at last one shell.  Postconditions: the polyhedron contains Rows x Columns new faces and\n/// Rows x Columns x 4 new half edges, and the mesh contains (Rows + 1) x (Columns + 1) new points.\nvoid add_grid(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const uint_t Rows, const uint_t Columns, imaterial* const Material);\n/// Adds a set of points and faces that form a topological \"cylinder\" with the given number of rows and columns to an existing polyhedron.\n/// The geometry (vertex coordinates) of the cylinder is undefined, and must be set by the caller after add_cylinder() returns.\n/// Note that many surfaces-of-revolution can be represented as topological cylinders, including disks, cones, cylinders,\n/// hyperboloids, paraboloids, and spheres.\n/// Preconditions: the polyhedron must contain at least one shell.  Postconditions: the polyhedron contains Rows x Columns new faces and\n/// Rows x Columns x 4 new half edges, and the mesh contains (Rows + 1) x Columns new points.\nvoid add_cylinder(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const uint_t Rows, const uint_t Columns, imaterial* const Material);\n/// Adds a set of points and faces that form a topological \"torus\" with the given number of rows and columns to an existing polyhedron.\n/// The geometry (vertex coordinates) of the torus is undefined, and must be set by the caller after add_torus() returns.\n/// Preconditions: the polyhedron must contain at least one shell.  Postconditions: the polyhedron contains Rows x Columns new faces and\n/// Rows x Columns x 4 new half edges, and the mesh contains Rows x Columns new points.\nvoid add_torus(mesh& Mesh, primitive& Polyhedron, const uint_t Shell, const uint_t Rows, const uint_t Columns, imaterial* const Material);\n\n/// Returns true iff every face in the given polyhedron is a triangle.\nbool_t is_triangles(const const_primitive& Polyhedron);\n/// Returns true iff the given polyhedron is a solid (i.e. it has no topological holes).\nbool_t is_solid(const const_primitive& Polyhedron);\n/// Returns true iff the given polyhedron should be rendered as a Subdivision surface\n/** \\note The implementation looks at the flags set on the first (outer) shell.  We\nshould consider whether SDS should be set on a per-shell basis? */\nbool_t is_sds(const const_primitive& Polyhedron);\n\n/// Initializes arrays for constant-time lookup of counterclockwise edges.\nvoid create_counterclockwise_edge_lookup(const const_primitive& Polyhedron, mesh::indices_t& CounterclockwiseEdges);\n\n/// Calculates the center (average) for an edge loop (returns the origin for degenerate cases).\nconst point3 center(const mesh::indices_t& VertexPoints, const mesh::indices_t& ClockwiseEdges, const mesh::points_t& Points, const uint_t EdgeIndex);\n/// Calculates the normal for an edge loop (returns a zero-length normal for degenerate cases).\nconst normal3 normal(const mesh::indices_t& VertexPoints, const mesh::indices_t& ClockwiseEdges, const mesh::points_t& Points, const uint_t EdgeIndex);\n/// Calculates the normal for a triangle (returns a zero-length normal for degenerate cases).\nconst normal3 normal(const point3& A, const point3& B, const point3& C);\n/// Initializes arrays for constant-time lookup from faces to normal vectors.\nvoid create_face_normal_lookup(const mesh& Mesh, const const_primitive& Polyhedron, mesh::normals_t& Normals);\n\n/// Initializes arrays for constant-time lookup from an edge to the adjacent edge (if any)\nvoid create_edge_adjacency_lookup(const mesh::indices_t& VertexPoints, const mesh::indices_t& ClockwiseEdges, mesh::bools_t& BoundaryEdges, mesh::indices_t& AdjacentEdges);\n\n/// Initializes an array for constant-time lookup from an edge to the face that owns it\nvoid create_edge_face_lookup(const const_primitive& Polyhedron, mesh::indices_t& EdgeFaces);\n\n/// Initializes an array for constant-time lookup from loops to edge counts\nvoid create_loop_edge_count_lookup(const const_primitive& Polyhedron, mesh::counts_t& LoopEdgeCounts);\n\n/// Initialize arrays for fast lookup from a vertex to its adjacent faces\n/** \\deprecated Use the adjacency-list version of create_point_face_lookup() instead */\nvoid create_point_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& VertexPoints, const mesh::indices_t& ClockwiseEdges, const mesh::points_t& Points, mesh::indices_t& PointFirstFaces, mesh::counts_t& PointFaceCounts, mesh::indices_t& PointFaces);\n/// Creates an adjacency list for fast lookup from a vertex to its adjacent faces.\nvoid create_point_face_lookup(const mesh& Mesh, const const_primitive& Polyhedron, std::vector<mesh::indices_t>& AdjacencyList);\n\n/// Creates an adjacency list for fast lookup from a vertex to its out-edges.\nvoid create_point_out_edge_lookup(const mesh& Mesh, const const_primitive& Polyhedron, std::vector<mesh::indices_t>& AdjacencyList);\n/// Creates an adjacency list for fast lookup from a vertex to its in-edges.\nvoid create_point_in_edge_lookup(const mesh& Mesh, const const_primitive& Polyhedron, std::vector<mesh::indices_t>& AdjacencyList);\n/// Creates an adjacency list for fast lookup from a vertex to its incident (in- or out-) edges.\nvoid create_point_edge_lookup(const mesh& Mesh, const const_primitive& Polyhedron, std::vector<mesh::indices_t>& AdjacencyList);\n\n/// Initialize arrays for fast lookup from a point index to all edges that start from it. If PointEdgeCounts is filled (by create_vertex_valence_lookup) it is used, otherwise it is created\n/** \\deprecated Use create_point_out_edge_lookup() instead */\nvoid create_point_edge_lookup(const mesh::indices_t& VertexPoints, mesh::indices_t& PointEdges, mesh::indices_t& PointFirstEdges, mesh::counts_t& PointEdgeCounts);\n\n/// Initialize Valences array for constant time lookup of vertex valence (number of incoming edges)\n/**\n * \\param PointCount Initial guess for the number of points. Valences will be expanded to the correct size if this is too small\n * \\param VertexPoints The indices of the edge points\n * \\param Valences will store the number of edges for each point\n */\n/** \\deprecated Use create_point_in_edge_lookup() instead */\nvoid create_point_valence_lookup(const uint_t PointCount, const mesh::indices_t& VertexPoints, mesh::counts_t& Valences);\n\n/// Initialise boundary_faces array for constant time lookup of faces that are on the mesh boundary. BoundaryEdges and AdjacentEdges can be created using create_edge_adjacency_lookup\nvoid create_boundary_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& ClockwiseEdges, const mesh::bools_t& BoundaryEdges, const mesh::indices_t& AdjacentEdges, mesh::bools_t& BoundaryFaces);\n\n/// Adds edges that are collinear and with points of valence 1 for boundary edges or valence 2 otherwise to EdgeList\nvoid mark_collinear_edges(mesh::indices_t& RedundantEdges, const mesh::selection_t& EdgeSelection, const mesh::points_t& Points, const mesh::indices_t& VertexPoints, const mesh::indices_t& ClockwiseEdges, const mesh::counts_t& VertexValences, const mesh::bools_t& BoundaryEdges, const mesh::indices_t& AdjacentEdges, const double_t Threshold = 1e-8);\n\n/// Marks edges that are shared by coplanar faces among the selected faces\nvoid mark_coplanar_edges(const mesh::indices_t& Companions,\n\t\tconst mesh::bools_t& BoundaryEdges,\n\t\tconst mesh::normals_t& Normals,\n\t\tconst mesh::indices_t& EdgeFaces,\n\t\tconst mesh::selection_t& FaceSelection,\n\t\tmesh::indices_t& RedundantEdges,\n\t\tconst double_t Threshold = 1e-8);\n\n/// Triangulates the input polyhedron, storing the resulting primitive and storing point data in Output\nmesh::primitive* triangulate(const mesh& Input, const const_primitive& Polyhedron, mesh& Output);\n\n/// Removes edges, loops, and faces from a polyhedron, cleaning-up references and attributes.\nvoid delete_components(const mesh& Mesh, primitive& Polyhedron, const mesh::bools_t& RemovePoints, mesh::bools_t& RemoveEdges, mesh::bools_t& RemoveLoops, mesh::bools_t& RemoveFaces);\n\n} // namespace polyhedron\n\n} // namespace k3d\n\n#endif // !K3DSDK_POLYHEDRON_H\n"
  },
  {
    "path": "k3dsdk/primitive_validation.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/array.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n\nnamespace k3d\n{\n\nvoid require_valid_points(const mesh& Mesh)\n{\n\tconst uint_t point_count = Mesh.points ? Mesh.points->size() : 0;\n\tconst uint_t point_selection_count = Mesh.point_selection ? Mesh.point_selection->size() : 0;\n\n\tif(point_count != point_selection_count)\n\t\tthrow std::runtime_error(\"Mismatched point and point_selection array lengths.\");\n\n\tif(0 == Mesh.point_attributes.column_count())\n\t\treturn;\n\n\tconst uint_t point_attribute_count = Mesh.point_attributes.row_count();\n\n\tif(point_count != point_attribute_count)\n\t{\n\t\tstd::ostringstream buffer;\n\t\tbuffer << \"Point attribute table incorrect length [\" << point_attribute_count << \"], expected [\" << point_count << \"]\";\n\t\tthrow std::runtime_error(buffer.str());\n\t}\n\n\tfor(mesh::table_t::const_iterator array_iterator = Mesh.point_attributes.begin(); array_iterator != Mesh.point_attributes.end(); ++array_iterator)\n\t{\n\t\tconst array* const current_array = array_iterator->second.get();\n\t\tif(!current_array)\n\t\t\tthrow std::runtime_error(\"NULL mesh point attributes array.\");\n\n\t\tif(current_array->size() != point_count)\n\t\t\tthrow std::runtime_error(\"Array length mismatch for mesh point attributes\");\n\t}\n}\n\nstatic void require_valid_table(const mesh& Mesh, const string_t& Name, const table& Table)\n{\n\tif(Name == \"constant\" && Table.column_count() && Table.row_count() != 1)\n\t\tthrow std::runtime_error(\"'constant' table must have length 1.\");\n\n\tfor(mesh::table_t::const_iterator array_iterator = Table.begin(); array_iterator != Table.end(); ++array_iterator)\n\t{\n\t\tconst array* const current_array = array_iterator->second.get();\n\t\tif(!current_array)\n\t\t\tthrow std::runtime_error(\"NULL table array.\");\n\n\t\tconst array* const first_array = Table.begin()->second.get();\n\t\tif(current_array->size() != first_array->size())\n\t\t\tthrow std::runtime_error(\"Array length mismatch for table [\" + Name + \"]\");\n\n\t\tif(current_array->get_metadata_value(metadata::key::domain()) == metadata::value::point_indices_domain())\n\t\t{\n\t\t\tif(!Mesh.points)\n\t\t\t\tthrow std::runtime_error(\"Mesh missing points array.\");\n\t\t\t\n\t\t\tif(!Mesh.point_selection)\n\t\t\t\tthrow std::runtime_error(\"Mesh missing point selections array.\");\n\n\t\t\trequire_valid_points(Mesh);\n\n\t\t\tconst mesh::indices_t* const indices = dynamic_cast<const mesh::indices_t*>(current_array);\n\t\t\tif(!indices)\n\t\t\t\tthrow std::runtime_error(\"Point indices array must be an index type.\");\n\n\t\t\tconst mesh::indices_t::const_iterator max = std::max_element(indices->begin(), indices->end());\n\t\t\tif(max != indices->end() && *max >= Mesh.points->size())\n\t\t\t\tthrow std::runtime_error(\"Point indices array out-of-bounds.\");\n\t\t}\n\t}\n}\n\nvoid require_valid_primitive(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tfor(mesh::named_tables_t::const_iterator structure = Primitive.structure.begin(); structure != Primitive.structure.end(); ++structure)\n\t\trequire_valid_table(Mesh, structure->first, structure->second);\n\n\tfor(mesh::named_tables_t::const_iterator attributes = Primitive.attributes.begin(); attributes != Primitive.attributes.end(); ++attributes)\n\t\trequire_valid_table(Mesh, attributes->first, attributes->second);\n\n\tfor(mesh::named_tables_t::const_iterator attributes = Primitive.attributes.begin(); attributes != Primitive.attributes.end(); ++attributes)\n\t{\n\t\tif(0 == attributes->second.column_count())\n\t\t\tcontinue;\n\n\t\tconst mesh::named_tables_t::const_iterator structure = Primitive.structure.find(attributes->first);\n\t\tif(structure != Primitive.structure.end())\n\t\t{\n\t\t\tif(structure->second.row_count() != attributes->second.row_count())\n\t\t\t{\n\t\t\t\tstd::ostringstream buffer;\n\t\t\t\tbuffer << \"[\" << Primitive.type << \"] attribute table [\" << structure->first << \"] incorrect length [\" << attributes->second.row_count() << \"], expected [\" << structure->second.row_count() << \"]\";\n\t\t\t\tthrow std::runtime_error(buffer.str());\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst mesh::table_t& require_structure(const mesh::primitive& Primitive, const string_t& Name)\n{\n\tconst table* const structure = Primitive.structure.lookup(Name);\n\n\tif(!structure)\n\t\tthrow std::runtime_error(\"[\" + Primitive.type + \"] primitive missing structure [\" + Name + \"]\");\n\n\treturn *structure;\n}\n\nmesh::table_t& require_structure(mesh::primitive& Primitive, const string_t& Name)\n{\n\ttable* const structure = Primitive.structure.writable(Name);\n\n\tif(!structure)\n\t\tthrow std::runtime_error(\"[\" + Primitive.type + \"] primitive missing structure [\" + Name + \"]\");\n\n\treturn *structure;\n}\n\nconst mesh::table_t& require_attributes(const mesh::primitive& Primitive, const string_t& Name)\n{\n\tconst table* const attributes = Primitive.attributes.lookup(Name);\n\n\tif(!attributes)\n\t\tthrow std::runtime_error(\"[\" + Primitive.type + \"] primitive missing attributes [\" + Name + \"]\");\n\n\treturn *attributes;\n}\n\nmesh::table_t& require_attributes(mesh::primitive& Primitive, const string_t& Name)\n{\n\ttable* const attributes = Primitive.attributes.writable(Name);\n\n\tif(!attributes)\n\t\tthrow std::runtime_error(\"[\" + Primitive.type + \"] primitive missing attributes [\" + Name + \"]\");\n\n\treturn *attributes;\n}\n\nvoid require_table_row_count(const mesh::primitive& Primitive, const table& Table, const string_t& TableName, const uint_t RowCount)\n{\n\tif(TableName == \"constant\")\n\t\tthrow std::runtime_error(\"'constant' tables are automatically tested, and must have length 1.\");\n\n\tif(0 == Table.column_count())\n\t\treturn;\n\n\tif(Table.row_count() != RowCount)\n\t{\n\t\tstd::ostringstream buffer;\n\t\tbuffer << \"[\" << Primitive.type << \"] table [\" << TableName << \"] incorrect length [\" << Table.row_count() << \"], expected [\" << RowCount << \"]\";\n\t\tthrow std::runtime_error(buffer.str());\n\t}\n}\n\nvoid require_metadata(const mesh::primitive& Primitive, const array& Array, const string_t& ArrayName, const string_t& MetadataName, const string_t& MetadataValue)\n{\n\tif(Array.get_metadata_value(MetadataName) != MetadataValue)\n\t{\n\t\tstd::ostringstream buffer;\n\t\tbuffer << \"[\" << Primitive.type << \"] primitive [\" << ArrayName << \"] array missing [\" << MetadataName << \"] metadata value [\" << MetadataValue << \"]\";\n\t\tthrow std::runtime_error(buffer.str());\n\t}\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/primitive_validation.h",
    "content": "#ifndef K3DSDK_PRIMITIVE_VALIDATION_H\n#define K3DSDK_PRIMITIVE_VALIDATION_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\n#include <sstream>\n#include <stdexcept>\n\nnamespace k3d\n{\n\n//@{\n\n/// Helper methods for use with in mesh primitive validate() functions only!\n\n/// Performs automated validation of mesh point data:\n///\n/// * Validates that the number of points, point selections, and point attributes match.\n/// * Validates that every array in the point attributes table is the same length.\n///\n/// Note: this is called implicitly by require_valid_primitive() if your primitive\n/// uses points, you don't need to call it yourself in most circumstances.\nvoid require_valid_points(const mesh& Mesh);\n\n/// Performs automated validation of the structure of a mesh primitive:\n///\n/// * Validates that \"constant\" tables have length 1.\n/// * Validates that the mesh has point data if the primitive contains point indices.\n/// * Validates that primitive point indices are within bounds.\n/// * Validates that every array in a given table is the same length.\n/// * Validates that matching structure and attribute tables contain the same number of rows.\nvoid require_valid_primitive(const mesh& Mesh, const mesh::primitive& Primitive);\n\n/// Tests a primitive to verify that it contains the named structure table, throws an exception otherwise.\nconst mesh::table_t& require_structure(const mesh::primitive& Primitive, const string_t& Name);\n/// Tests a primitive to verify that it contains the named structure table, throws an exception otherwise.\nmesh::table_t& require_structure(mesh::primitive& Primitive, const string_t& Name);\n/// Tests a primitive to verify that it contains the named attribute table, throws an exception otherwise.\nconst mesh::table_t& require_attributes(const mesh::primitive& Primitive, const string_t& Name);\n/// Tests a primitive to verify that it contains the named attribute table, throws an exception otherwise.\nmesh::table_t& require_attributes(mesh::primitive& Primitive, const string_t& Name);\n\n/// Tests a table to verify that it matches the given row count, throws an exception otherwise.\nvoid require_table_row_count(const mesh::primitive& Primitive, const table& Table, const string_t& TableName, const uint_t RowCount);\n\n/// Tests a table to verify that it contains an array with given name and type, throws an exception otherwise.\ntemplate<typename ArrayT>\nconst ArrayT& require_array(const mesh::primitive& Primitive, const mesh::table_t& Table, const string_t& Name)\n{\n\tconst ArrayT* const array = Table.lookup<ArrayT>(Name);\n\n\tif(!array)\n\t\tthrow std::runtime_error(\"[\" + Primitive.type + \"] primitive missing array [\" + Name + \"]\");\n\n\treturn *array;\n}\n\n/// Tests a table to verify that it contains an array with given name and type, throws an exception otherwise.\ntemplate<typename ArrayT>\nArrayT& require_array(mesh::primitive& Primitive, mesh::table_t& Table, const string_t& Name)\n{\n\tArrayT* const array = Table.writable<ArrayT>(Name);\n\n\tif(!array)\n\t\tthrow std::runtime_error(\"[\" + Primitive.type + \"] primitive missing array [\" + Name + \"]\");\n\n\treturn *array;\n}\n\n/// Tests an array to verify that it has metadata with the given name and value, throws an exception otherwise.\nvoid require_metadata(const mesh::primitive& Primitive, const array& Array, const string_t& ArrayName, const string_t& MetadataName, const string_t& MetadataValue);\n\n//@}\n\n} // namespace k3d\n\n#endif // !K3DSDK_PRIMITIVE_VALIDATION_H\n\n"
  },
  {
    "path": "k3dsdk/property.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/iattribute_property_ri.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/ioption_property_ri.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/property_types.h>\n#include <k3dsdk/property_types_ri.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/tokens.h>\n#include <k3dsdk/type_registry.h>\n\n#include <boost/mpl/for_each.hpp>\n\n\nnamespace k3d\n{\n\nnamespace property\n{\n\nnamespace detail\n{\n\n//////////////////////////////////////////////////////////////////////////////////////////\n// user_property\n\n/// Wraps a k3d_data object to mark it as a user property\ntemplate<typename property_t>\nclass user_property :\n\tpublic property_t,\n\tpublic iuser_property,\n\tpublic metadata::storage\n{\npublic:\n\ttemplate<typename init_t>\n\tuser_property(const init_t& Init) :\n\t\tproperty_t(Init)\n\t{\n\t}\n};\n\n///////////////////////////////////////////////////////////////////////////////////////////\n// null_property_collection\n\n/// This is an ugly hack, but it allows user properties to be fully constructed before they're added to their property collection\nstruct null_property_collection :\n\tpublic iproperty_collection\n{\n\tvoid register_property(iproperty&)\n\t{\n\t}\n\n\tvoid register_properties(const properties_t&)\n\t{\n\t}\n\n\tvoid unregister_property(iproperty&)\n\t{\n\t}\n\n\tvoid unregister_properties(const properties_t&)\n\t{\n\t}\n\n\tconst properties_t& properties()\n\t{\n\t\tstatic properties_t properties;\n\t\treturn properties;\n\t}\n\n\tsigc::connection connect_properties_changed_signal(const sigc::slot<void, ihint*>&)\n\t{\n\t\treturn sigc::connection();\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// user_serialization\n\n/// Serialization policy for generic user properties\ntemplate<typename value_t, class property_policy_t>\nclass user_serialization :\n\tpublic property_policy_t,\n\tpublic ipersistent\n{\n\t// This policy only works for data stored by-value\n\tBOOST_STATIC_ASSERT((!boost::is_pointer<value_t>::value));\n\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context&)\n\t{\n\t\txml::element xml_storage(\n\t\t\t\"property\",\n\t\t\tstring_cast(property_policy_t::internal_value()),\n\t\t\txml::attribute(\"name\", property_policy_t::name()),\n\t\t\txml::attribute(\"label\", static_cast<iproperty&>(*this).property_label()),\n\t\t\txml::attribute(\"description\", static_cast<iproperty&>(*this).property_description()),\n\t\t\txml::attribute(\"type\", type_string<value_t>()),\n\t\t\txml::attribute(\"user_property\", \"generic\"));\n\n\t\tElement.append(xml_storage);\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context&)\n\t{\n\t\tstring_t value = Element.text;\n\t\tproperty_policy_t::set_value(from_string(value, property_policy_t::internal_value()), 0);\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tuser_serialization(const init_t& Init) :\n\t\tproperty_policy_t(Init)\n\t{\n\t\tInit.persistent_collection().enable_serialization(Init.name(), *this);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_serialization\n\n/// Serialization policy for generic user properties that store k3d::mesh\ntemplate<typename value_t, class property_policy_t>\nclass user_mesh_serialization :\n\tpublic property_policy_t,\n\tpublic ipersistent\n{\n\t// This policy only works for data stored by-pointer\n\tBOOST_STATIC_ASSERT((boost::is_pointer<value_t>::value));\n\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context&)\n\t{\n\t\t// User mesh properties should always be empty ...\n\t\tassert_error(0 == property_policy_t::internal_value());\n\n\t\txml::element xml_storage(\n\t\t\t\"property\",\n\t\t\tstring_cast(property_policy_t::internal_value()),\n\t\t\txml::attribute(\"name\", property_policy_t::name()),\n\t\t\txml::attribute(\"label\", static_cast<iproperty&>(*this).property_label()),\n\t\t\txml::attribute(\"description\", static_cast<iproperty&>(*this).property_description()),\n\t\t\txml::attribute(\"type\", type_string<value_t>()),\n\t\t\txml::attribute(\"user_property\", \"generic\"));\n\n\t\tElement.append(xml_storage);\n\t}\n\n\tvoid load(xml::element&, const ipersistent::load_context&)\n\t{\n\t\t// User mesh properties should always be empty ...\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tuser_mesh_serialization(const init_t& Init) :\n\t\tproperty_policy_t(Init)\n\t{\n\t\tInit.persistent_collection().enable_serialization(Init.name(), *this);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// user_node_serialization\n\n/// Serialization policy for data containers that store a document node and can be serialized as XML\ntemplate<typename value_t, class property_policy_t>\nclass user_node_serialization :\n\tpublic property_policy_t,\n\tpublic ipersistent\n{\n\t// If this assertion fires, it means that you're trying to use node_serialization with a non-node data type\n\tBOOST_STATIC_ASSERT((boost::is_base_and_derived<iunknown, typename boost::remove_pointer<value_t>::type>::value));\n\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context& Context)\n\t{\n\t\tif(property_policy_t::internal_node())\n\t\t{\n\t\t\tElement.append(\n\t\t\t\txml::element(\n\t\t\t\t\t\"property\",\n\t\t\t\t\tstring_cast(Context.lookup.lookup_id(property_policy_t::internal_node())),\n\t\t\t\t\txml::attribute(\"name\", property_policy_t::name()),\n\t\t\t\t\txml::attribute(\"label\", static_cast<iproperty&>(*this).property_label()),\n\t\t\t\t\txml::attribute(\"description\", static_cast<iproperty&>(*this).property_description()),\n\t\t\t\t\txml::attribute(\"type\", type_string<value_t>()),\n\t\t\t\t\txml::attribute(\"user_property\", \"generic\")));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tElement.append(\n\t\t\t\txml::element(\n\t\t\t\t\t\"property\",\n\t\t\t\t\t\"0\",\n\t\t\t\t\txml::attribute(\"name\", property_policy_t::name()),\n\t\t\t\t\txml::attribute(\"label\", static_cast<iproperty&>(*this).property_label()),\n\t\t\t\t\txml::attribute(\"description\", static_cast<iproperty&>(*this).property_description()),\n\t\t\t\t\txml::attribute(\"type\", type_string<value_t>()),\n\t\t\t\t\txml::attribute(\"user_property\", \"generic\")));\n\t\t}\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context)\n\t{\n\t\tstring_t value = Element.text;\n\t\tproperty_policy_t::set_value(dynamic_cast<value_t>(Context.lookup.lookup_object(from_string(value, static_cast<ipersistent_lookup::id_type>(0)))), 0);\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tuser_node_serialization(const init_t& Init) :\n\t\tproperty_policy_t(Init)\n\t{\n\t\tInit.persistent_collection().enable_serialization(Init.name(), *this);\n\t}\n\nprivate:\n\tipersistent_lookup::id_type m_node_id;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// property_factory\n\n/// Helper class for instantiating user property instances\nclass property_factory\n{\npublic:\n\tproperty_factory(inode& Owner, iproperty_collection& PropertyCollection, ipersistent_collection& PersistentCollection, const std::type_info& Type, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value, iproperty*& Result) :\n\t\towner(Owner),\n\t\tproperty_collection(PropertyCollection),\n\t\tpersistent_collection(PersistentCollection),\n\t\ttype(Type),\n\t\tname(Name),\n\t\tlabel(Label),\n\t\tdescription(Description),\n\t\tvalue(Value),\n\t\tresult(Result)\n\t{\n\t}\n\n\ttemplate<typename T, typename PropertyT>\n\tvoid create_property(const T& DefaultValue) const\n\t{\n\t\tif(result)\n\t\t\treturn;\n\n\t\tif(typeid(T) != type)\n\t\t\treturn;\n\n\t\tT initial_value = DefaultValue;\n\t\tif(!value.empty())\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tinitial_value = boost::any_cast<T>(value);\n\t\t\t}\n\t\t\tcatch(...)\n\t\t\t{\n\t\t\t\tlog() << error << \"error extracting default value for user property [\" << name << \"] with type [\" << demangle(type) << \"]\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tnull_property_collection temp_property_collection;\n\n\t\tresult = new PropertyT(\n\t\t\tinit_owner(owner.document(), temp_property_collection, persistent_collection, &owner)\n\t\t\t+ init_name(make_token(name.c_str()))\n\t\t\t+ init_label(make_token(label.c_str()))\n\t\t\t+ init_description(make_token(description.c_str()))\n\t\t\t+ init_value(initial_value)\n\t\t\t);\n\n\t\tproperty_collection.register_property(*result);\n\t}\n\n\ttemplate<typename T, typename PropertyT>\n\tvoid create_path_property(const T& DefaultValue) const\n\t{\n\t\tif(result)\n\t\t\treturn;\n\n\t\tif(typeid(T) != type)\n\t\t\treturn;\n\n\t\tT initial_value = DefaultValue;\n\t\tif(!value.empty())\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tinitial_value = boost::any_cast<T>(value);\n\t\t\t}\n\t\t\tcatch(...)\n\t\t\t{\n\t\t\t\tlog() << error << \"error extracting default value for user property [\" << name << \"] with type [\" << demangle(type) << \"]\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tnull_property_collection temp_property_collection;\n\n\t\tresult = new PropertyT(\n\t\t\tinit_owner(owner.document(), temp_property_collection, persistent_collection, &owner)\n\t\t\t+ init_name(make_token(name.c_str()))\n\t\t\t+ init_label(make_token(label.c_str()))\n\t\t\t+ init_description(make_token(description.c_str()))\n\t\t\t+ init_value(initial_value)\n\t\t\t+ init_path_mode(k3d::ipath_property::WRITE)\n\t\t\t+ init_path_type(\"any\")\n\t\t\t);\n\n\t\tproperty_collection.register_property(*result);\n\t}\n\n\ttemplate<typename T>\n\tvoid operator()(T DefaultValue) const\n\t{\n\t\tcreate_property<T, user_property<k3d_data(T, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, user_serialization)> >(DefaultValue);\n\t}\n\n\tvoid operator()(filesystem::path DefaultValue) const\n\t{\n\t\tcreate_path_property<filesystem::path, user_property<k3d_data(filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization)> >(DefaultValue);\n\t}\n\n\tvoid operator()(mesh* DefaultValue) const\n\t{\n\t\tcreate_property<mesh*, user_property<k3d_data(mesh*, immutable_name, change_signal, with_undo, local_storage, no_constraint, read_only_property, user_mesh_serialization)> >(DefaultValue);\n\t}\n\n\tvoid operator()(imaterial* DefaultValue) const\n\t{\n\t\tcreate_property<imaterial*, user_property<k3d_data(imaterial*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, user_node_serialization)> >(DefaultValue);\n\t}\n\n\tvoid operator()(gl::imesh_painter* DefaultValue) const\n\t{\n\t\tcreate_property<gl::imesh_painter*, user_property<k3d_data(gl::imesh_painter*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, user_node_serialization)> >(DefaultValue);\n\t}\n\n\tvoid operator()(k3d::ri::imesh_painter* DefaultValue) const\n\t{\n\t\tcreate_property<k3d::ri::imesh_painter*, user_property<k3d_data(k3d::ri::imesh_painter*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, user_node_serialization)> >(DefaultValue);\n\t}\n\n\tvoid operator()(k3d::ri::itexture* DefaultValue) const\n\t{\n\t\tcreate_property<k3d::ri::itexture*, user_property<k3d_data(k3d::ri::itexture*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, user_node_serialization)> >(DefaultValue);\n\t}\n\n\tvoid operator()(k3d::inode* DefaultValue) const\n\t{\n\t\tcreate_property<k3d::inode*, user_property<k3d_data(k3d::inode*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, user_node_serialization)> >(DefaultValue);\n\t}\n\nprivate:\n\tinode& owner;\n\tiproperty_collection& property_collection;\n\tipersistent_collection& persistent_collection;\n\tconst std::type_info& type;\n\tconst string_t& name;\n\tconst string_t& label;\n\tconst string_t& description;\n\tconst boost::any& value;\n\tiproperty*& result;\n};\n\n//////////////////////////////////////////////////////////////////////////////////////////\n// renderman_parameter_list_name_t\n\n/// Helper class used to set a renderman property's parameter list name\nclass renderman_parameter_list_name_t\n{\npublic:\n\texplicit renderman_parameter_list_name_t(const char* const Name) :\n\t\tm_name(Name)\n\t{\n\t}\n\n\tconst char* parameter_list_name() const\n\t{\n\t\treturn m_name;\n\t}\n\nprivate:\n\tconst char* const m_name;\n};\n\ninline const initializer_t<renderman_parameter_list_name_t> init_parameter_list_name(const char* const Name)\n{\n\treturn initializer_t<renderman_parameter_list_name_t>(renderman_parameter_list_name_t(Name));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// renderman_attribute_property\n\n/// Property policy that exposes a data container as a K-3D renderman property\ntemplate<typename value_t, class name_policy_t>\nclass renderman_attribute_property :\n\tpublic name_policy_t,\n\tpublic iproperty,\n\tpublic iwritable_property,\n\tpublic k3d::ri::iattribute_property\n{\npublic:\n\tconst value_t pipeline_value()\n\t{\n\t\tiproperty* const source = property_lookup(this);\n\t\tif(source != this)\n\t\t\treturn boost::any_cast<value_t>(source->property_internal_value());\n\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst string_t property_name()\n\t{\n\t\treturn name_policy_t::name();\n\t}\n\n\tconst string_t property_label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst string_t property_description()\n\t{\n\t\treturn m_description;\n\t}\n\n\tconst std::type_info& property_type()\n\t{\n\t\treturn typeid(value_t);\n\t}\n\n\tconst boost::any property_internal_value()\n\t{\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst boost::any property_pipeline_value()\n\t{\n\t\treturn pipeline_value();\n\t}\n\n\tconst string_t property_attribute_name()\n\t{\n\t\treturn m_attribute_name;\n\t}\n\n\tinode* property_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\ttypename name_policy_t::changed_signal_t& property_changed_signal()\n\t{\n\t\treturn name_policy_t::changed_signal();\n\t}\n\n\tdeleted_signal_t& property_deleted_signal()\n\t{\n\t\treturn m_deleted_signal;\n\t}\n\n\tiproperty* property_dependency()\n\t{\n\t\treturn m_dependency;\n\t}\n\n\tvoid property_set_dependency(iproperty* Dependency)\n\t{\n\t\tm_dependency = Dependency;\n\t}\n\n\tbool property_set_value(const boost::any Value, ihint* const Hint)\n\t{\n\t\tconst value_t* const new_value = boost::any_cast<value_t>(&Value);\n\t\tif(!new_value)\n\t\t\treturn false;\n\n\t\tname_policy_t::set_value(*new_value, Hint);\n\t\treturn true;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\trenderman_attribute_property(const init_t& Init) :\n\t\tname_policy_t(Init),\n\t\tm_node(Init.node()),\n\t\tm_label(Init.label()),\n\t\tm_description(Init.description()),\n\t\tm_attribute_name(Init.parameter_list_name()),\n\t\tm_dependency(0)\n\t{\n\t\tInit.property_collection().register_property(*this);\n\t}\n\n\t~renderman_attribute_property()\n\t{\n\t\tm_deleted_signal.emit();\n\t}\n\nprivate:\n\tinode* const m_node;\n\tconst char* const m_label;\n\tconst char* const m_description;\n\tconst char* const m_attribute_name;\n\tdeleted_signal_t m_deleted_signal;\n\tiproperty* m_dependency;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// renderman_option_property\n\n/// Property policy that exposes a data container as a K-3D renderman property\ntemplate<typename value_t, class name_policy_t>\nclass renderman_option_property :\n\tpublic name_policy_t,\n\tpublic iproperty,\n\tpublic iwritable_property,\n\tpublic k3d::ri::ioption_property\n{\npublic:\n\tconst value_t pipeline_value()\n\t{\n\t\tiproperty* const source = property_lookup(this);\n\t\tif(source != this)\n\t\t\treturn boost::any_cast<value_t>(source->property_internal_value());\n\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst string_t property_name()\n\t{\n\t\treturn name_policy_t::name();\n\t}\n\n\tconst string_t property_label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst string_t property_description()\n\t{\n\t\treturn m_description;\n\t}\n\n\tconst std::type_info& property_type()\n\t{\n\t\treturn typeid(value_t);\n\t}\n\n\tconst boost::any property_internal_value()\n\t{\n\t\treturn name_policy_t::internal_value();\n\t}\n\n\tconst boost::any property_pipeline_value()\n\t{\n\t\treturn pipeline_value();\n\t}\n\n\tconst string_t property_option_name()\n\t{\n\t\treturn m_option_name;\n\t}\n\n\tinode* property_node()\n\t{\n\t\treturn m_node;\n\t}\n\n\ttypename name_policy_t::changed_signal_t& property_changed_signal()\n\t{\n\t\treturn name_policy_t::changed_signal();\n\t}\n\n\tdeleted_signal_t& property_deleted_signal()\n\t{\n\t\treturn m_deleted_signal;\n\t}\n\n\tiproperty* property_dependency()\n\t{\n\t\treturn m_dependency;\n\t}\n\n\tvoid property_set_dependency(iproperty* Dependency)\n\t{\n\t\tm_dependency = Dependency;\n\t}\n\n\tbool property_set_value(const boost::any Value, ihint* const Hint)\n\t{\n\t\tconst value_t* const new_value = boost::any_cast<value_t>(&Value);\n\t\tif(!new_value)\n\t\t\treturn false;\n\n\t\tname_policy_t::set_value(*new_value, Hint);\n\t\treturn true;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\trenderman_option_property(const init_t& Init) :\n\t\tname_policy_t(Init),\n\t\tm_node(Init.node()),\n\t\tm_label(Init.label()),\n\t\tm_description(Init.description()),\n\t\tm_option_name(Init.parameter_list_name()),\n\t\tm_dependency(0)\n\t{\n\t\tInit.property_collection().register_property(*this);\n\t}\n\n\t~renderman_option_property()\n\t{\n\t\tm_deleted_signal.emit();\n\t}\n\nprivate:\n\tinode* const m_node;\n\tconst char* const m_label;\n\tconst char* const m_description;\n\tconst char* const m_option_name;\n\tdeleted_signal_t m_deleted_signal;\n\tiproperty* m_dependency;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// renderman_attribute_serialization\n\n/// Serialization policy for data containers that can be serialized as XML\ntemplate<typename value_t, class property_policy_t>\nclass renderman_attribute_serialization :\n\tpublic property_policy_t,\n\tpublic ipersistent\n{\n\t// This policy only works for data stored by-value\n\tBOOST_STATIC_ASSERT((!boost::is_pointer<value_t>::value));\n\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context&)\n\t{\n\t\txml::element xml_storage(\n\t\t\t\"property\",\n\t\t\tstring_cast(property_policy_t::internal_value()),\n\t\t\txml::attribute(\"name\", property_policy_t::name()),\n\t\t\txml::attribute(\"label\", static_cast<iproperty&>(*this).property_label()),\n\t\t\txml::attribute(\"description\", static_cast<iproperty&>(*this).property_description()),\n\t\t\txml::attribute(\"type\", type_string<value_t>()),\n\t\t\txml::attribute(\"parameter_type\", \"attribute\"),\n\t\t\txml::attribute(\"parameter_name\", property_policy_t::property_attribute_name()),\n\t\t\txml::attribute(\"user_property\", \"renderman\"));\n\n\t\tElement.append(xml_storage);\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context&)\n\t{\n\t\tstring_t value = Element.text;\n\t\tproperty_policy_t::set_value(from_string(value, property_policy_t::internal_value()));\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\trenderman_attribute_serialization(const init_t& Init) :\n\t\tproperty_policy_t(Init)\n\t{\n\t\tInit.persistent_collection().enable_serialization(Init.name(), *this);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// renderman_option_serialization\n\n/// Serialization policy for data containers that can be serialized as XML\ntemplate<typename value_t, class property_policy_t>\nclass renderman_option_serialization :\n\tpublic property_policy_t,\n\tpublic ipersistent\n{\n\t// This policy only works for data stored by-value\n\tBOOST_STATIC_ASSERT((!boost::is_pointer<value_t>::value));\n\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context&)\n\t{\n\t\txml::element xml_storage(\n\t\t\t\"property\",\n\t\t\tstring_cast(property_policy_t::internal_value()),\n\t\t\txml::attribute(\"name\", property_policy_t::name()),\n\t\t\txml::attribute(\"label\", static_cast<iproperty&>(*this).property_label()),\n\t\t\txml::attribute(\"description\", static_cast<iproperty&>(*this).property_description()),\n\t\t\txml::attribute(\"type\", type_string<value_t>()),\n\t\t\txml::attribute(\"parameter_type\", \"option\"),\n\t\t\txml::attribute(\"parameter_name\", property_policy_t::property_option_name()),\n\t\t\txml::attribute(\"user_property\", \"renderman\"));\n\n\t\tElement.append(xml_storage);\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context&)\n\t{\n\t\tstring_t value = Element.text;\n\t\tproperty_policy_t::set_value(from_string(value, property_policy_t::internal_value()));\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\trenderman_option_serialization(const init_t& Init) :\n\t\tproperty_policy_t(Init)\n\t{\n\t\tInit.persistent_collection().enable_serialization(Init.name(), *this);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// renderman_attribute_factory\n\n/// Helper class for instantiating user property instances\nclass renderman_attribute_factory\n{\npublic:\n\trenderman_attribute_factory(inode& Owner, iproperty_collection& PropertyCollection, ipersistent_collection& PersistentCollection, const std::type_info& Type, const string_t& AttributeName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value, iproperty*& Result) :\n\t\towner(Owner),\n\t\tproperty_collection(PropertyCollection),\n\t\tpersistent_collection(PersistentCollection),\n\t\ttype(Type),\n\t\tattribute_name(AttributeName),\n\t\tname(Name),\n\t\tlabel(Label),\n\t\tdescription(Description),\n\t\tvalue(Value),\n\t\tresult(Result)\n\t{\n\t}\n\n\ttemplate<typename T, typename PropertyT>\n\tvoid create_property() const\n\t{\n\t\tif(result)\n\t\t\treturn;\n\n\t\tif(typeid(T) != type)\n\t\t\treturn;\n\n\t\tT initial_value;\n\t\tif(!value.empty())\n\t\ttry\n\t\t{\n\t\t\tinitial_value = boost::any_cast<T>(value);\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tlog() << error << \"error extracting default value for attribute [\" << name << \"] with type [\" << demangle(type) << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tnull_property_collection temp_property_collection;\n\n\t\tresult = new PropertyT(\n\t\t\tinit_owner(owner.document(), temp_property_collection, persistent_collection, &owner)\n\t\t\t+ init_parameter_list_name(make_token(attribute_name.c_str()))\n\t\t\t+ init_name(make_token(name.c_str()))\n\t\t\t+ init_label(make_token(label.c_str()))\n\t\t\t+ init_description(make_token(description.c_str()))\n\t\t\t+ init_value(initial_value)\n\t\t\t);\n\n\t\tproperty_collection.register_property(*result);\n\t}\n\n\ttemplate<typename T>\n\tvoid operator()(T) const\n\t{\n\t\tcreate_property<T, k3d::property::detail::user_property<k3d_data(T, immutable_name, change_signal, with_undo, local_storage, no_constraint, renderman_attribute_property, renderman_attribute_serialization)> >();\n\t}\n\nprivate:\n\tinode& owner;\n\tiproperty_collection& property_collection;\n\tipersistent_collection& persistent_collection;\n\tconst std::type_info& type;\n\tconst string_t& attribute_name;\n\tconst string_t& name;\n\tconst string_t& label;\n\tconst string_t& description;\n\tconst boost::any& value;\n\tiproperty*& result;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// renderman_option_factory\n\n/// Helper class for instantiating user property instances\nclass renderman_option_factory\n{\npublic:\n\trenderman_option_factory(inode& Owner, iproperty_collection& PropertyCollection, ipersistent_collection& PersistentCollection, const std::type_info& Type, const string_t& OptionName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value, iproperty*& Result) :\n\t\towner(Owner),\n\t\tproperty_collection(PropertyCollection),\n\t\tpersistent_collection(PersistentCollection),\n\t\ttype(Type),\n\t\toption_name(OptionName),\n\t\tname(Name),\n\t\tlabel(Label),\n\t\tdescription(Description),\n\t\tvalue(Value),\n\t\tresult(Result)\n\t{\n\t}\n\n\ttemplate<typename T, typename PropertyT>\n\tvoid create_property() const\n\t{\n\t\tif(result)\n\t\t\treturn;\n\n\t\tif(typeid(T) != type)\n\t\t\treturn;\n\n\t\tT initial_value;\n\t\tif(!value.empty())\n\t\ttry\n\t\t{\n\t\t\tinitial_value = boost::any_cast<T>(value);\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tlog() << error << \"error extracting default value for option [\" << name << \"] with type [\" << demangle(type) << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tnull_property_collection temp_property_collection;\n\n\t\tresult = new PropertyT(\n\t\t\tinit_owner(owner.document(), temp_property_collection, persistent_collection, &owner)\n\t\t\t+ init_parameter_list_name(make_token(option_name.c_str()))\n\t\t\t+ init_name(make_token(name.c_str()))\n\t\t\t+ init_label(make_token(label.c_str()))\n\t\t\t+ init_description(make_token(description.c_str()))\n\t\t\t+ init_value(initial_value)\n\t\t\t);\n\n\t\tproperty_collection.register_property(*result);\n\t}\n\n\ttemplate<typename T>\n\tvoid operator()(T) const\n\t{\n\t\tcreate_property<T, k3d::property::detail::user_property<k3d_data(T, immutable_name, change_signal, with_undo, local_storage, no_constraint, renderman_option_property, renderman_option_serialization)> >();\n\t}\n\nprivate:\n\tinode& owner;\n\tiproperty_collection& property_collection;\n\tipersistent_collection& persistent_collection;\n\tconst std::type_info& type;\n\tconst string_t& option_name;\n\tconst string_t& name;\n\tconst string_t& label;\n\tconst string_t& description;\n\tconst boost::any& value;\n\tiproperty*& result;\n};\n\n} // namespace detail\n\nvoid connect(idocument& Document, iproperty& From, iproperty& To)\n{\n\tipipeline::dependencies_t dependencies;\n\tdependencies.insert(std::make_pair(&To, &From));\n\tDocument.pipeline().set_dependencies(dependencies);\n}\n\niproperty* connection(idocument& Document, iproperty& Property)\n{\n\treturn Document.pipeline().dependency(Property);\n}\n\nvoid disconnect(idocument& Document, iproperty& Property)\n{\n\tipipeline::dependencies_t dependencies;\n\tdependencies.insert(std::make_pair(&Property, static_cast<iproperty*>(0)));\n\tDocument.pipeline().set_dependencies(dependencies);\n}\n\niproperty* get(iunknown& Object, const string_t& Name)\n{\n\t// If the object doesn't have properties, we're done ...\n\tiproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(&Object);\n\tif(!property_collection)\n\t\treturn 0;\n\n\t// Get the object's properties ...\n\tconst iproperty_collection::properties_t properties(property_collection->properties());\n\n\t// Look for a property with a matching name ...\n\tfor(iproperty_collection::properties_t::const_iterator property_iterator = properties.begin(); property_iterator != properties.end(); ++property_iterator)\n\t{\n\t\t// if the name matches, we're done ...\n\t\tif((*property_iterator)->property_name() == Name)\n\t\t\treturn *property_iterator;\n\t}\n\n\t// No property by that name!\n\treturn 0;\n}\n\nconst boost::any internal_value(iproperty& Property)\n{\n\treturn Property.property_internal_value();\n}\n\nconst boost::any internal_value(iunknown& Object, const string_t& Name)\n{\n\t// Look for the property by name ...\n\tif(iproperty* const property = get(Object, Name))\n\t\treturn internal_value(*property);\n\n\treturn boost::any();\n}\n\nconst boost::any pipeline_value(iproperty& Property)\n{\n\treturn Property.property_pipeline_value();\n}\n\nconst boost::any pipeline_value(iunknown& Object, const string_t& Name)\n{\n\tif(iproperty* const property = get(Object, Name))\n\t\treturn pipeline_value(*property);\n\n\treturn boost::any();\n}\n\nbool set_internal_value(iunknown& Object, const string_t Name, const boost::any& Value)\n{\n\t// If the object isn't a property collection, we're done ...\n\tiproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(&Object);\n\tif(!property_collection)\n\t{\n\t\tlog() << error << k3d_file_reference << \" : object has no property collection!\" << std::endl;\n\t\treturn false;\n\t}\n\n\t// Look for a property with a matching name ...\n\tconst iproperty_collection::properties_t properties(property_collection->properties());\n\tfor(iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t{\n\t\t// Name doesn't match, so keep going ...\n\t\tif((*property)->property_name() != Name)\n\t\t\tcontinue;\n\n\t\t// Success ...\n\t\treturn set_internal_value(**property, Value);\n\t}\n\n\t// Couldn't find a property by that name!\n\tlog() << error << k3d_file_reference << \" : could not find property [\" << Name << \"]\" << std::endl;\n\treturn false;\n}\n\nbool set_internal_value(iproperty& Property, const boost::any& Value)\n{\n\t// If the property type doesn't match, we're done ...\n\tif(Value.type() != Property.property_type())\n\t{\n\t\tlog() << error << \"Value type [\" << demangle(Value.type()) << \"] doesn't match property [\" << Property.property_name() << \"] type [\" << demangle(Property.property_type()) << \"]\" << std::endl;\n\t\treturn false;\n\t}\n\n\t// If the property is read-only, we're done ...\n\tiwritable_property* const writable_property = dynamic_cast<iwritable_property*>(&Property);\n\tif(!writable_property)\n\t{\n\t\tlog() << error << \"Property [\" << Property.property_name() << \"] is not writable!\" << std::endl;\n\t\treturn false;\n\t}\n\n\treturn writable_property->property_set_value(Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// user_properties\n\nconst std::vector<iproperty*> user_properties(iunknown& Object)\n{\n\tstd::vector<iproperty*> results;\n\n\tif(iproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(&Object))\n\t{\n\t\tconst iproperty_collection::properties_t& properties = property_collection->properties();\n\t\tfor(iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t{\n\t\t\tif(dynamic_cast<iuser_property*>(*property))\n\t\t\t\tresults.push_back(*property);\n\t\t}\n\t}\n\n\treturn results;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// create\n\niproperty* create(inode& Owner, const std::type_info& Type, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value)\n{\n\tiproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(&Owner);\n\treturn_val_if_fail(property_collection, 0);\n\n\tipersistent_collection* const persistent_collection = dynamic_cast<ipersistent_collection*>(&Owner);\n\treturn_val_if_fail(persistent_collection, 0);\n\n\tiproperty* result = 0;\n\tboost::mpl::for_each<k3d::property::types>(detail::property_factory(Owner, *property_collection, *persistent_collection, Type, Name, Label, Description, Value, result));\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// create\n\niproperty* create(inode& Owner, const string_t& Type, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value)\n{\n\tconst std::type_info* const type_info = type_id(Type);\n\treturn_val_if_fail(type_info, 0);\n\n\treturn create(Owner, *type_info, Name, Label, Description, Value);\n}\n\nnamespace ri\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// create_attribute\n\niproperty* create_attribute(inode& Owner, const std::type_info& Type, const string_t& AttributeName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value)\n{\n\tiproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(&Owner);\n\treturn_val_if_fail(property_collection, 0);\n\n\tipersistent_collection* const persistent_collection = dynamic_cast<ipersistent_collection*>(&Owner);\n\treturn_val_if_fail(persistent_collection, 0);\n\n\tiproperty* result = 0;\n\tboost::mpl::for_each<k3d::property::ri::attribute_types>(k3d::property::detail::renderman_attribute_factory(Owner, *property_collection, *persistent_collection, Type, AttributeName, Name, Label, Description, Value, result));\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// create_attribute\n\niproperty* create_attribute(inode& Owner, const string_t& Type, const string_t& AttributeName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value)\n{\n\tconst std::type_info* const type_info = type_id(Type);\n\treturn_val_if_fail(type_info, 0);\n\n\treturn create_attribute(Owner, *type_info, AttributeName, Name, Label, Description, Value);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// create_option\n\niproperty* create_option(inode& Owner, const std::type_info& Type, const string_t& OptionName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value)\n{\n\tiproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(&Owner);\n\treturn_val_if_fail(property_collection, 0);\n\n\tipersistent_collection* const persistent_collection = dynamic_cast<ipersistent_collection*>(&Owner);\n\treturn_val_if_fail(persistent_collection, 0);\n\n\tiproperty* result = 0;\n\tboost::mpl::for_each<k3d::property::ri::option_types>(k3d::property::detail::renderman_option_factory(Owner, *property_collection, *persistent_collection, Type, OptionName, Name, Label, Description, Value, result));\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// create_option\n\niproperty* create_option(inode& Owner, const string_t& Type, const string_t& OptionName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value)\n{\n\tconst std::type_info* const type_info = type_id(Type);\n\treturn_val_if_fail(type_info, 0);\n\n\treturn create_option(Owner, *type_info, OptionName, Name, Label, Description, Value);\n}\n\n} // namespace ri\n\n} // namespace property\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/property.h",
    "content": "#ifndef K3DSDK_PROPERTY_H\n#define K3DSDK_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty.h>\n#include <vector>\n\nnamespace k3d\n{\n\nclass idocument;\nclass inode;\nclass iunknown;\n\nnamespace property\n{\n\n/// Makes a connection from one property to another.\nvoid connect(idocument& Document, iproperty& From, iproperty& To);\n/// Returns the connection to a property (if any), or NULL.\niproperty* connection(idocument& Document, iproperty& Property);\n/// Disconnects a property from its dependency (if any).\nvoid disconnect(idocument& Document, iproperty& Property);\n\n/// Returns a matching property by name, or NULL\niproperty* get(iunknown& Object, const string_t& Name);\n\n/// Returns a matching property by name and type, or NULL\ntemplate<typename value_t>\niproperty* get(iunknown& Object, const string_t& Name)\n{\n\tiproperty* const property = get(Object, Name);\n\treturn property && (property->property_type() == typeid(value_t)) ? property : 0;\n}\n\n/// Returns the \"internal\" value of a property - the value of the property itself, regardless of any pipeline dependencies\nconst boost::any internal_value(iunknown& Object, const string_t& Name);\n/// Returns the \"internal\" value of a property - the value of the property itself, regardless of any pipeline dependencies\ntemplate<typename value_t>\nconst value_t internal_value(iunknown& Object, const string_t& Name)\n{\n\treturn boost::any_cast<value_t>(internal_value(Object, Name));\n}\n\n/// Returns the \"internal\" value of a property - the value of the property itself, regardless of any pipeline dependencies\nconst boost::any internal_value(iproperty& Property);\n/// Returns the \"internal\" value of a property - the value of the property itself, regardless of any pipeline dependencies\ntemplate<typename value_t>\nconst value_t internal_value(iproperty& Property)\n{\n\treturn boost::any_cast<value_t>(internal_value(Property));\n}\n\n/// Returns the \"pipeline\" value of a property - the value of the property, possibly overridden by pipeline dependencies\nconst boost::any pipeline_value(iunknown& Object, const string_t& Name);\n/// Returns the \"pipeline\" value of a property - the value of the property, possibly overridden by pipeline dependencies\ntemplate<typename value_t>\nconst value_t pipeline_value(iunknown& Object, const string_t& Name)\n{\n\treturn boost::any_cast<value_t>(pipeline_value(Object, Name));\n}\n/// Returns the \"pipeline\" value of a property - the value of the property, possibly overridden by pipeline dependencies\nconst boost::any pipeline_value(iproperty& Property);\n/// Returns the \"pipeline\" value of a property - the value of the property, possibly overridden by pipeline dependencies\ntemplate<typename value_t>\nconst value_t pipeline_value(iproperty& Property)\n{\n\treturn boost::any_cast<value_t>(pipeline_value(Property));\n}\n\n/** \\brief Sets the value of a named property\n    \\return true, iff the value was set successfully, false otherwise (couldn't find a property with a matching name, it wasn't writable, or the type didn't match)\n*/\nbool set_internal_value(iunknown& Object, const string_t Name, const boost::any& Value);\n\n/** \\brief Sets the value of a property\n\t\\return true, iff the value was set successfully, false otherwise (the property wasn't writable or the type didn't match)\n*/\nbool set_internal_value(iproperty& Property, const boost::any& Value);\n\n/// Returns the set of user properties (if any) owned by an object\nconst std::vector<iproperty*> user_properties(iunknown& Object);\n\n/// Creates a new user property with the given type and initial value.\niproperty* create(inode& Owner, const std::type_info& Type, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value = boost::any());\n/// Creates a new user property with the given type and initial value.\niproperty* create(inode& Owner, const string_t& Type, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value = boost::any());\n/// Creates a new user property with the given type and initial value.\ntemplate<typename T>\niproperty* create(inode& Owner, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value = boost::any())\n{\n\treturn create(Owner, typeid(T), Name, Label, Description, Value);\n}\n\nnamespace ri\n{\n\n/// Creates a new RenderMan attribute with the given type, name, and value\niproperty* create_attribute(inode& Owner, const std::type_info& Type, const string_t& AttributeName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value = boost::any());\n/// Creates a new RenderMan attribute with the given type, name, and value\niproperty* create_attribute(inode& Owner, const string_t& Type, const string_t& AttributeName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value = boost::any());\n/// Creates a new RenderMan attribute with the given type, name, and value\ntemplate<typename T>\niproperty* create_attribute(inode& Owner, const string_t& AttributeName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value = boost::any())\n{\n\treturn create_attribute(Owner, typeid(T), AttributeName, Name, Label, Description, Value);\n}\n\n/// Creates a new RenderMan option with the given type, name, and value\niproperty* create_option(inode& Owner, const std::type_info& Type, const string_t& OptionName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value = boost::any());\n/// Creates a new RenderMan option with the given type, name, and value\niproperty* create_option(inode& Owner, const string_t& Type, const string_t& OptionName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value = boost::any());\n/// Creates a new RenderMan option with the given type, name, and value\ntemplate<typename T>\niproperty* create_option(inode& Owner, const string_t& OptionName, const string_t& Name, const string_t& Label, const string_t& Description, const boost::any& Value = boost::any())\n{\n\treturn create_option(Owner, typeid(T), OptionName, Name, Label, Description, Value);\n}\n\n} // namespace ri\n\n} // namespace property\n\n} // namespace k3d\n\n#endif // !K3DSDK_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/property_collection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/result.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// property_collection\n\nproperty_collection::property_collection()\n{\n}\n\nproperty_collection::~property_collection()\n{\n\tfor(properties_t::iterator property = m_properties.begin(); property != m_properties.end(); ++property)\n\t{\n\t\tif(dynamic_cast<iuser_property*>(*property))\n\t\t\tdelete *property;\n\t}\n}\n\nvoid property_collection::register_property(iproperty& Property)\n{\n\tm_properties.erase(std::remove(m_properties.begin(), m_properties.end(), &Property), m_properties.end());\n\tm_properties.push_back(&Property);\n\tm_changed_signal.emit(0);\n}\n\nvoid property_collection::register_properties(const properties_t& Properties)\n{\n\tfor(properties_t::const_iterator property = Properties.begin(); property != Properties.end(); ++property)\n\t{\n\t\tm_properties.erase(std::remove(m_properties.begin(), m_properties.end(), *property), m_properties.end());\n\t\tm_properties.push_back(*property);\n\t}\n\tm_properties.erase(std::remove(m_properties.begin(), m_properties.end(), static_cast<iproperty*>(0)), m_properties.end());\n\n\tm_changed_signal.emit(0);\n}\n\nvoid property_collection::unregister_property(iproperty& Property)\n{\n\tm_properties.erase(std::remove(m_properties.begin(), m_properties.end(), &Property), m_properties.end());\n\tm_changed_signal.emit(0);\n}\n\nvoid property_collection::unregister_properties(const properties_t& Properties)\n{\n\tfor(properties_t::const_iterator property = Properties.begin(); property != Properties.end(); ++property)\n\t\tm_properties.erase(std::remove(m_properties.begin(), m_properties.end(), *property), m_properties.end());\n\n\tm_changed_signal.emit(0);\n}\n\nconst iproperty_collection::properties_t& property_collection::properties()\n{\n\treturn m_properties;\n}\n\nsigc::connection property_collection::connect_properties_changed_signal(const sigc::slot<void, ihint*>& Slot)\n{\n\treturn m_changed_signal.connect(Slot);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/property_collection.h",
    "content": "#ifndef K3DSDK_PROPERTY_COLLECTION_H\n#define K3DSDK_PROPERTY_COLLECTION_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty_collection.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// property_collection\n\n/// Provides a default implementation of iproperty_collection\nclass property_collection :\n\tpublic iproperty_collection\n{\npublic:\n\tproperty_collection();\n\tvirtual ~property_collection();\n\n\tvoid register_property(iproperty& Property);\n\tvoid register_properties(const properties_t& Properties);\n\tvoid unregister_property(iproperty& Property);\n\tvoid unregister_properties(const properties_t& Properties);\n\tconst properties_t& properties();\n\tsigc::connection connect_properties_changed_signal(const sigc::slot<void, ihint*>& Slot);\n\nprivate:\n\t/// Contains the collection of all properties\n\tproperties_t m_properties;\n\t/// Change-notification signal for the collection\n\tsigc::signal<void, ihint*> m_changed_signal;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_PROPERTY_COLLECTION_H\n\n"
  },
  {
    "path": "k3dsdk/property_group_collection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/property_group_collection.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// property_group_collection\n\nproperty_group_collection::property_group_collection()\n{\n}\n\nproperty_group_collection::~property_group_collection()\n{\n}\n\nconst iproperty_group_collection::groups_t property_group_collection::property_groups()\n{\n\treturn m_groups;\n}\n\nvoid property_group_collection::register_property_group(const group& Group)\n{\n\tm_groups.push_back(Group);\n}\n\nvoid property_group_collection::unregister_property_group(const std::string& Name)\n{\n\tgroups_t::iterator group = m_groups.begin();\n\twhile (group != m_groups.end())\n\t{\n\t\tif (group->name == Name)\n\t\t{\n\t\t\tgroup = m_groups.erase(group);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t++group;\n\t\t}\n\t}\n}\n\nvoid property_group_collection::clear()\n{\n\tm_groups.clear();\n}\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/property_group_collection.h",
    "content": "#ifndef K3DSDK_PROPERTY_GROUP_COLLECTION_H\n#define K3DSDK_PROPERTY_GROUP_COLLECTION_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty_group_collection.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// property_group_collection\n\n/// Provides a default implementation of iproperty_group_collection\nclass property_group_collection :\n\tpublic iproperty_group_collection\n{\npublic:\n\tproperty_group_collection();\n\tvirtual ~property_group_collection();\n\n\tconst groups_t property_groups();\n\nprotected:\n\t/// Clears the collection, removing all groups\n\tvoid clear();\n\t/// Stores a new group\n\tvoid register_property_group(const group& Group);\n\t/// Removes the group(s) named Name\n\tvoid unregister_property_group(const string_t& Name);\n\nprivate:\n\t/// Contains the collection of property groups\n\tgroups_t m_groups;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_PROPERTY_GROUP_COLLECTION_H\n\n"
  },
  {
    "path": "k3dsdk/property_types.h",
    "content": "#ifndef K3DSDK_PROPERTY_TYPES_H\n#define K3DSDK_PROPERTY_TYPES_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/itexture_ri.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/types.h>\n\n#include <boost/mpl/vector/vector20.hpp>\n\nnamespace k3d\n{\n\nnamespace property\n{\n\n/// Enumerates all of the types that can be stored using user properties.\ntypedef boost::mpl::vector17<\n\tk3d::bool_t,\n\tk3d::color,\n\tk3d::double_t,\n\tk3d::filesystem::path,\n\tk3d::gl::imesh_painter*,\n\tk3d::imaterial*,\n\tk3d::inode*,\n\tk3d::int32_t,\n\tk3d::matrix4,\n\tk3d::mesh*,\n\tk3d::normal3,\n\tk3d::point3,\n\tk3d::point4,\n\tk3d::ri::imesh_painter*,\n\tk3d::ri::itexture*,\n\tk3d::string_t,\n\tk3d::vector3\n\t> types;\n\n} // namespace property\n\n} // namespace k3d\n\n#endif // !K3DSDK_PROPERTY_TYPES_H\n\n"
  },
  {
    "path": "k3dsdk/property_types_ri.h",
    "content": "#ifndef K3DSDK_PROPERTY_TYPES_RI_H\n#define K3DSDK_PROPERTY_TYPES_RI_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types_ri.h>\n\n#include <boost/mpl/vector.hpp>\n\nnamespace k3d\n{\n\nnamespace property\n{\n\nnamespace ri\n{\n\n/// Enumerates all of the types that can be stored using RenderMan attributes.\ntypedef boost::mpl::vector<\n\tk3d::ri::color,\n\tk3d::ri::hpoint,\n\tk3d::ri::integer,\n\tk3d::ri::matrix,\n\tk3d::ri::normal,\n\tk3d::ri::point,\n\tk3d::ri::real,\n\tk3d::ri::string,\n\tk3d::ri::vector\n\t> attribute_types;\n\n/// Enumerates all of the types that can be stored using RenderMan options.\ntypedef boost::mpl::vector<\n\tk3d::ri::color,\n\tk3d::ri::hpoint,\n\tk3d::ri::integer,\n\tk3d::ri::matrix,\n\tk3d::ri::normal,\n\tk3d::ri::point,\n\tk3d::ri::real,\n\tk3d::ri::string,\n\tk3d::ri::vector\n\t> option_types;\n\n} // namespace ri\n\n} // namespace property\n\n} // namespace k3d\n\n#endif // !K3DSDK_PROPERTY_TYPES_RI_H\n\n"
  },
  {
    "path": "k3dsdk/python/CMakeLists.txt",
    "content": "PROJECT(k3dsdk-python)\n\nINCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GLIBMM_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_SIGC_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_PYTHON_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nK3D_ADD_LIBRARY(k3dsdk-python-arrays SHARED\n\ttyped_array_python.cpp\n\ttyped_array_python.h\n\t)\nK3D_GENERATE_DEF_FILE(k3dsdk-python-arrays)\nTARGET_LINK_LIBRARIES(k3dsdk-python-arrays\n\tk3dsdk\n\t${K3D_PYTHON_LIBS}\n\t${Boost_PYTHON_LIBRARY}\n\t)\n\nK3D_ADD_LIBRARY(k3dsdk-python-const-arrays SHARED\n\tconst_typed_array_python.cpp\n\tconst_typed_array_python.h\n\t)\nK3D_GENERATE_DEF_FILE(k3dsdk-python-const-arrays)\nTARGET_LINK_LIBRARIES(k3dsdk-python-const-arrays\n\tk3dsdk\n\t${K3D_PYTHON_LIBS}\n\t${Boost_PYTHON_LIBRARY}\n\t)\n\nK3D_ADD_LIBRARY(k3dsdk-python-values SHARED\n\tangle_axis_python.cpp\n\tangle_axis_python.h\n\tbitmap_python.cpp\n\tbitmap_python.h\n\tbounding_box3_python.cpp\n\tbounding_box3_python.h\n\tcolor_python.cpp\n\tcolor_python.h\n\tconst_bitmap_python.cpp\n\tconst_bitmap_python.h\n\teuler_angles_python.cpp\n\teuler_angles_python.h\n\tfilesystem_python.cpp\n\tfilesystem_python.h\n\tmatrix4_python.cpp\n\tmatrix4_python.h\n\tnormal3_python.cpp\n\tnormal3_python.h\n\tpoint2_python.cpp\n\tpoint2_python.h\n\tpoint3_python.cpp\n\tpoint3_python.h\n\tpoint4_python.cpp\n\tpoint4_python.h\n\ttexture3_python.cpp\n\ttexture3_python.h\n\tuuid_python.cpp\n\tuuid_python.h\n\tvector2_python.cpp\n\tvector2_python.h\n\tvector3_python.cpp\n\tvector3_python.h\n\tvector4_python.cpp\n\tvector4_python.h\n\t)\nK3D_GENERATE_DEF_FILE(k3dsdk-python-values)\nTARGET_LINK_LIBRARIES(k3dsdk-python-values\n\tk3dsdk\n\t${Boost_PYTHON_LIBRARY}\n\t${K3D_PYTHON_LIBS}\n\t)\n\nK3D_ADD_LIBRARY(k3dsdk-python-mesh SHARED\n\tmesh_python.cpp\n\tmesh_python.h\n\t)\nK3D_GENERATE_DEF_FILE(k3dsdk-python-mesh)\nTARGET_LINK_LIBRARIES(k3dsdk-python-mesh k3dsdk-python-arrays)\nTARGET_LINK_LIBRARIES(k3dsdk-python-mesh k3dsdk-python-const-arrays)\n\nK3D_ADD_LIBRARY(k3dsdk-python-interfaces SHARED\n\tany_python.cpp\n\tany_python.h\n\toffscreen_context_factory_gl_python.cpp\n\toffscreen_context_factory_gl_python.h\n\tidocument_exporter_python.cpp\n\tidocument_exporter_python.h\n\tidocument_importer_python.cpp\n\tidocument_importer_python.h\n\tidocument_python.cpp\n\tidocument_python.h\n\tifile_change_notifier_python.cpp\n\tifile_change_notifier_python.h\n\tikeyframer_python.cpp\n\tikeyframer_python.h\n\timesh_storage_python.cpp\n\timesh_storage_python.h\n\timeta_object_python.cpp\n\timeta_object_python.h\n\timetadata_python.cpp\n\timetadata_python.h\n\tinode_python.cpp\n\tinode_python.h\n\tinode_selection_python.cpp\n\tinode_selection_python.h\n\tiplugin_factory_python.cpp\n\tiplugin_factory_python.h\n\tiproperty_collection_python.cpp\n\tiproperty_collection_python.h\n\tiproperty_python.cpp\n\tiproperty_python.h\n\tirender_camera_frame_python.cpp\n\tirender_camera_frame_python.h\n\tirender_camera_preview_python.cpp\n\tirender_camera_preview_python.h\n\tisnappable_python.cpp\n\tisnappable_python.h\n\tiunknown_python.cpp\n\tiunknown_python.h\n\tiuser_interface_python.cpp\n\tiuser_interface_python.h\n\t)\nK3D_GENERATE_DEF_FILE(k3dsdk-python-interfaces)\nTARGET_LINK_LIBRARIES(k3dsdk-python-interfaces k3dsdk-python-mesh)\nTARGET_LINK_LIBRARIES(k3dsdk-python-interfaces k3dsdk-python-values)\n\nK3D_ADD_LIBRARY(k3dsdk-python-b SHARED\n\ttable_python.cpp\n\ttable_python.h\n\tconst_table_python.cpp\n\tconst_table_python.h\n\tconst_named_arrays_python.cpp\n\tconst_named_arrays_python.h\n\tconst_named_tables_python.cpp\n\tconst_named_tables_python.h\n\teuler_python.cpp\n\teuler_python.h\n\tgeometry_python.cpp\n\tgeometry_python.h\n\tlog_python.cpp\n\tlog_python.h\n\tmime_python.cpp\n\tmime_python.h\n\tnamed_arrays_python.cpp\n\tnamed_arrays_python.h\n\tnamed_tables_python.cpp\n\tnamed_tables_python.h\n\tnode_python.cpp\n\tnode_python.h\n\tparallel_python.cpp\n\tplugin_python.cpp\n\tplugin_python.h\n\tproperty_python.cpp\n\tproperty_python.h\n\tresource_python.cpp\n\tresource_python.h\n\tri_python.cpp\n\tri_python.h\n\tselection_python.cpp\n\tselection_python.h\n\t)\nK3D_GENERATE_DEF_FILE(k3dsdk-python-b)\nTARGET_LINK_LIBRARIES(k3dsdk-python-b k3dsdk-python-arrays)\nTARGET_LINK_LIBRARIES(k3dsdk-python-b k3dsdk-python-const-arrays)\nTARGET_LINK_LIBRARIES(k3dsdk-python-b k3dsdk-python-interfaces)\nTARGET_LINK_LIBRARIES(k3dsdk-python-b k3dsdk-resource)\n\nK3D_ADD_LIBRARY(k3dsdk-python-primitives SHARED\n\tbezier_triangle_patch_python.cpp\n\tbezier_triangle_patch_python.h\n\tbicubic_patch_python.cpp\n\tbicubic_patch_python.h\n\tbilinear_patch_python.cpp\n\tbilinear_patch_python.h\n\tblobby_python.cpp\n\tblobby_python.h\n\tcone_python.cpp\n\tcone_python.h\n\tcubic_curve_python.cpp\n\tcubic_curve_python.h\n\tcylinder_python.cpp\n\tcylinder_python.h\n\tdisk_python.cpp\n\tdisk_python.h\n\thyperboloid_python.cpp\n\thyperboloid_python.h\n\tlinear_curve_python.cpp\n\tlinear_curve_python.h\n\tnurbs_curve_python.cpp\n\tnurbs_curve_python.h\n\tnurbs_patch_python.cpp\n\tnurbs_patch_python.h\n\tparaboloid_python.cpp\n\tparaboloid_python.h\n\tparticle_python.cpp\n\tparticle_python.h\n\tpolyhedron_python.cpp\n\tpolyhedron_python.h\n\tsphere_python.cpp\n\tsphere_python.h\n\tteapot_python.cpp\n\tteapot_python.h\n\ttorus_python.cpp\n\ttorus_python.h\n\t)\nK3D_GENERATE_DEF_FILE(k3dsdk-python-primitives)\nTARGET_LINK_LIBRARIES(k3dsdk-python-primitives k3dsdk-python-b)\n\nK3D_ADD_LIBRARY(k3dsdk-python SHARED\n\tdifference_python.cpp\n\tdifference_python.h\n\tinstance_wrapper_python.h\n\tfile_signal_python.cpp\n\tfile_signal_python.h\n\tobject_model_python.cpp\n\tobject_model_python.h\n\tscript_python.cpp\n\tscript_python.h\n\t)\nK3D_GENERATE_DEF_FILE(k3dsdk-python)\nTARGET_LINK_LIBRARIES(k3dsdk-python\n\tk3dsdk-python-primitives\n\t${Boost_PYTHON_LIBRARY}\n\t)\n\nINSTALL(TARGETS k3dsdk-python-arrays\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\nINSTALL(TARGETS k3dsdk-python-const-arrays\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\nINSTALL(TARGETS k3dsdk-python-values\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\nINSTALL(TARGETS k3dsdk-python-mesh\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\nINSTALL(TARGETS k3dsdk-python-interfaces\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\nINSTALL(TARGETS k3dsdk-python-b\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\nINSTALL(TARGETS k3dsdk-python-primitives\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\nINSTALL(TARGETS k3dsdk-python\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\nIF(K3D_BUILD_NGUI_MODULE)\n\tINCLUDE_DIRECTORIES(${K3D_GTKMM_INCLUDE_DIRS})\n\n\tK3D_ADD_LIBRARY(k3dsdk-python-atk SHARED\n\t\tatk_python.cpp\n\t\tatk_python.h\n\t\t)\n\tK3D_GENERATE_DEF_FILE(k3dsdk-python-atk)\n\tTARGET_LINK_LIBRARIES(k3dsdk-python-atk\n\t\tk3dsdk\n\t\t${Boost_PYTHON_LIBRARY}\n\t\t${K3D_PYTHON_LIBS}\n\t\t${K3D_GTKMM_LIBS}\n\t\t)\n\n\tTARGET_LINK_LIBRARIES(k3dsdk-python k3dsdk-python-atk)\n\n\tINSTALL(TARGETS k3dsdk-python-atk\n\t\tRUNTIME DESTINATION bin \n\t\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\t\tARCHIVE DESTINATION ${K3D_LIBDIR})\nENDIF()\n\n"
  },
  {
    "path": "k3dsdk/python/angle_axis_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/angle_axis_python.h>\n\n#include <k3dsdk/algebra.h>\n\nusing namespace boost::python;\n\n#include <sstream>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_angle_axis()\n{\n\tclass_<k3d::angle_axis>(\"angle_axis\",\n\t\t\"Encodes a change in orientation as a rotation around an arbitrary axis.\\n\"\n\t\t\"@note: This is the preferred datatype for storing orientation \"\n\t\t\"in K-3D because it does not suffer from gimbal-lock.\", no_init)\n\t\t.def(init<double, const k3d::vector3&>())\n\t\t.def(init<double, double, double, double>())\n\t\t.def_readwrite(\"angle\", &k3d::angle_axis::angle,\n\t\t\t\"Stores the rotation angle in radians.\")\n\t\t.def_readwrite(\"axis\", &k3d::angle_axis::axis,\n\t\t\t\"Stores the axis of rotation as a L{vector3}.\")\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self_ns::str(self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/angle_axis_python.h",
    "content": "#ifndef K3DSDK_PYTHON_ANGLE_AXIS_PYTHON_H\n#define K3DSDK_PYTHON_ANGLE_AXIS_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_angle_axis();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_ANGLE_AXIS_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/any_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/any_python.h>\n#include <k3dsdk/python/bitmap_python.h>\n#include <k3dsdk/python/const_bitmap_python.h>\n#include <k3dsdk/python/idocument_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/ri_python.h>\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/render_state_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/texture3.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/vectors.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nconst object any_to_python(const boost::any& Value)\n{\n\tconst std::type_info& type = Value.type();\n\n\tif(Value.empty())\n\t\treturn object();\n\n\tif(type == typeid(k3d::bool_t))\n\t\treturn object(boost::any_cast<k3d::bool_t>(Value));\n\n\tif(type == typeid(k3d::int8_t))\n\t\treturn object(boost::any_cast<k3d::int8_t>(Value));\n\n\tif(type == typeid(k3d::int16_t))\n\t\treturn object(boost::any_cast<k3d::int16_t>(Value));\n\n\tif(type == typeid(k3d::int32_t))\n\t\treturn object(boost::any_cast<k3d::int32_t>(Value));\n\n\tif(type == typeid(k3d::int64_t))\n\t\treturn object(boost::any_cast<k3d::int64_t>(Value));\n\n\tif(type == typeid(k3d::uint8_t))\n\t\treturn object(boost::any_cast<k3d::uint8_t>(Value));\n\n\tif(type == typeid(k3d::uint16_t))\n\t\treturn object(boost::any_cast<k3d::uint16_t>(Value));\n\n\tif(type == typeid(k3d::uint32_t))\n\t\treturn object(boost::any_cast<k3d::uint32_t>(Value));\n\n\tif(type == typeid(k3d::uint64_t))\n\t\treturn object(boost::any_cast<k3d::uint64_t>(Value));\n\n\tif(type == typeid(k3d::double_t))\n\t\treturn object(boost::any_cast<k3d::double_t>(Value));\n\n\tif(type == typeid(k3d::string_t))\n\t\treturn object(boost::any_cast<k3d::string_t>(Value));\n\n\tif(type == typeid(k3d::ustring))\n\t\treturn object(boost::any_cast<k3d::ustring>(Value).raw());\n\n\tif(type == typeid(filesystem::path))\n\t\treturn object(boost::any_cast<filesystem::path>(Value));\n\n\tif(type == typeid(k3d::angle_axis))\n\t\treturn object(boost::any_cast<k3d::angle_axis>(Value));\n\n\tif(type == typeid(k3d::color))\n\t\treturn object(boost::any_cast<k3d::color>(Value));\n\n\tif(type == typeid(k3d::point2))\n\t\treturn object(boost::any_cast<k3d::point2>(Value));\n\n\tif(type == typeid(k3d::point3))\n\t\treturn object(boost::any_cast<k3d::point3>(Value));\n\n\tif(type == typeid(k3d::normal3))\n\t\treturn object(boost::any_cast<k3d::normal3>(Value));\n\n\tif(type == typeid(k3d::texture3))\n\t\treturn object(boost::any_cast<k3d::texture3>(Value));\n\n\tif(type == typeid(k3d::vector3))\n\t\treturn object(boost::any_cast<k3d::vector3>(Value));\n\n\tif(type == typeid(k3d::point4))\n\t\treturn object(boost::any_cast<k3d::point4>(Value));\n\n\tif(type == typeid(k3d::matrix4))\n\t\treturn object(boost::any_cast<k3d::matrix4>(Value));\n\n\tif(type == typeid(k3d::euler_angles))\n\t\treturn object(boost::any_cast<k3d::euler_angles>(Value));\n\n\tif(type == typeid(k3d::selection::set))\n\t\treturn object(boost::any_cast<k3d::selection::set>(Value));\n\n\tif(type == typeid(k3d::bounding_box3))\n\t\treturn object(boost::any_cast<k3d::bounding_box3>(Value));\n\n\tif(type == typeid(k3d::mesh*))\n\t\treturn wrap(boost::any_cast<k3d::mesh*>(Value));\n\n\tif(type == typeid(const k3d::mesh*))\n\t\treturn wrap(boost::any_cast<const k3d::mesh*>(Value));\n\n\tif(type == typeid(k3d::bitmap*))\n\t\treturn wrap(boost::any_cast<k3d::bitmap*>(Value));\n\n\tif(type == typeid(const k3d::bitmap*))\n\t\treturn wrap(boost::any_cast<const k3d::bitmap*>(Value));\n\n\tif(type == typeid(k3d::inode*))\n\t\treturn wrap_unknown(boost::any_cast<k3d::inode*>(Value));\n\n\tif(type == typeid(k3d::idocument*))\n\t{\n\t\tk3d::idocument* const value = boost::any_cast<k3d::idocument*>(Value);\n\t\treturn value ? object(wrap(value)) : object();\n\t}\n\n\tif(type == typeid(const k3d::ri::render_state*))\n\t{\n\t\treturn wrap(boost::any_cast<const k3d::ri::render_state*>(Value));\n\t}\n\n\tif(type == typeid(std::vector<k3d::inode*>))\n\t{\n\t\tstd::vector<k3d::inode*> nodes = boost::any_cast<std::vector<k3d::inode*> >(Value);\n\n\t\tboost::python::list results;\n\t\tfor(k3d::uint_t i = 0; i != nodes.size(); ++i)\n\t\t\tresults.append(wrap_unknown(nodes[i]));\n\n\t\treturn results;\n\t}\n\n\tif(type == typeid(std::vector<boost::any>))\n\t{\n\t\tstd::vector<boost::any> value = boost::any_cast<std::vector<boost::any> >(Value);\n\t\tboost::python::list results;\n\t\tfor(k3d::uint_t i = 0; i != value.size(); ++i)\n\t\t\tresults.append(any_to_python(value[i]));\n\n\t\treturn results;\n\t}\n\n\tif(type == typeid(k3d::typed_array<k3d::double_t>))\n\t{\n\t\tk3d::typed_array<k3d::double_t> nodes = boost::any_cast<k3d::typed_array<k3d::double_t> >(Value);\n\n\t\tboost::python::list results;\n\t\tfor(k3d::uint_t i = 0; i != nodes.size(); ++i)\n\t\t\tresults.append(nodes[i]);\n\n\t\treturn results;\n\t}\n\n\ttypedef std::map<k3d::string_t, k3d::double_t> profiler_task_records_t;\n\ttypedef std::map<k3d::inode*, profiler_task_records_t> profiler_node_records_t;\n\tif(type == typeid(profiler_node_records_t))\n\t{\n\t\tboost::python::dict python_node_records;\n\n\t\tprofiler_node_records_t node_records = boost::any_cast<profiler_node_records_t>(Value);\n\t\tfor(profiler_node_records_t::const_iterator node_record = node_records.begin(); node_record != node_records.end(); ++node_record)\n\t\t{\n\t\t\tboost::python::dict python_task_records;\n\n\t\t\tk3d::inode* const node = node_record->first;\n\t\t\tprofiler_task_records_t task_records = node_record->second;\n\t\t\tfor(profiler_task_records_t::const_iterator task_record = task_records.begin(); task_record != task_records.end(); ++task_record)\n\t\t\t\tpython_task_records[task_record->first] = task_record->second;\n\n\t\t\tpython_node_records[wrap_unknown(node)] = python_task_records;\n\t\t}\n\n\t\treturn python_node_records;\n\t}\n\n\tthrow std::invalid_argument(\"can't convert unrecognized type [\" + demangle(type) + \"] to boost::python::object\");\n}\n\n#define safe_extract(type, value) { extract<type> extractor(value); if(extractor.check()) return extractor(); }\n\nconst boost::any python_to_any(const object& Value)\n{\n\tPyObject* const value = Value.ptr();\n\n\tif(PyBool_Check(value))\n\t\treturn extract<bool_t>(Value)();\n\n\tif(PyInt_Check(value))\n\t\treturn extract<int32_t>(Value)();\n\n\tif(PyFloat_Check(value))\n\t\treturn extract<double_t>(Value)();\n\n\tif(PyString_Check(value))\n\t\treturn extract<string_t>(Value)();\n\n\tsafe_extract(k3d::filesystem::path, Value);\n\tsafe_extract(k3d::angle_axis, Value);\n\tsafe_extract(k3d::color, Value);\n\tsafe_extract(k3d::point2, Value);\n\tsafe_extract(k3d::point3, Value);\n\tsafe_extract(k3d::normal3, Value);\n\tsafe_extract(k3d::texture3, Value);\n\tsafe_extract(k3d::vector3, Value);\n\tsafe_extract(k3d::point4, Value);\n\tsafe_extract(k3d::matrix4, Value);\n\tsafe_extract(k3d::euler_angles, Value);\n\tsafe_extract(k3d::selection::set, Value);\n\tsafe_extract(k3d::bounding_box3, Value);\n\n\t{\n\t\textract<idocument_wrapper> value(Value);\n\t\tif(value.check())\n\t\t\treturn boost::any(value().wrapped_ptr());\n\t}\n\n\t{\n\t\textract<iunknown_wrapper> value(Value);\n\t\tif(value.check())\n\t\t\treturn boost::any(value().wrapped_ptr());\n\t}\n\n\t{\n\t\textract<boost::python::list> value(Value);\n\t\tif(value.check())\n\t\t{\n\t\t\tstd::vector<boost::any> results;\n\t\t\tboost::python::list list = value();\n\t\t\tfor(int i = 0; i != boost::python::len(list); ++i)\n\t\t\t\tresults.push_back(python_to_any(list[i]));\n\t\t\treturn results;\n\t\t}\n\t}\n\n\tthrow std::invalid_argument(\"can't convert unrecognized python value\");\n}\n\ntemplate<typename DestinationT, typename ValueT, int Size>\nstatic DestinationT from_sequence(const object& Value)\n{\n\tconst k3d::uint_t size = boost::python::len(Value);\n\tif(size != Size)\n\t\tthrow std::invalid_argument(\"Sequence must be of length \" + k3d::string_cast(Size));\n\n\tDestinationT destination;\n\tfor(k3d::uint_t i = 0; i != size; ++i)\n\t\tdestination[i] = boost::python::extract<ValueT>(Value[i]);\n\treturn destination;\n}\n\nconst boost::any python_to_any(const object& Value, const std::type_info& TargetType)\n{\n\tPyObject* const value = Value.ptr();\n\n\tif(TargetType == typeid(bool))\n\t\treturn boost::any(PyObject_IsTrue(value) ? true : false);\n\n\tif(TargetType == typeid(int))\n\t{\n\t\treturn_val_if_fail(PyInt_Check(value), boost::any());\n\t\treturn boost::any(static_cast<int>(PyInt_AsLong(value)));\n\t}\n\n\tif(TargetType == typeid(long))\n\t{\n\t\tif(PyInt_Check(value))\n\t\t\treturn boost::any(static_cast<long>(PyInt_AsLong(value)));\n\n\t\tif(PyLong_Check(value))\n\t\t\treturn boost::any(static_cast<long>(PyLong_AsLong(value)));\n\n\t\tthrow std::invalid_argument(\"can't convert Python value to long\");\n\t}\n\n\tif(TargetType == typeid(unsigned long))\n\t\treturn boost::any(extract<unsigned long>(Value)());\n\n\tif(TargetType == typeid(double))\n\t{\n\t\tif(PyFloat_Check(value))\n\t\t\treturn boost::any(PyFloat_AsDouble(value));\n\n\t\tif(PyInt_Check(value))\n\t\t\treturn boost::any(static_cast<double>(PyInt_AsLong(value)));\n\n\t\tif(PyLong_Check(value))\n\t\t\treturn boost::any(static_cast<double>(PyLong_AsLong(value)));\n\n\t\tthrow std::invalid_argument(\"can't convert Python value to double\");\n\t}\n\n\tif(TargetType == typeid(std::string))\n\t{\n\t\treturn_val_if_fail(PyString_Check(value), boost::any());\n\t\treturn boost::any(std::string(PyString_AsString(value)));\n\t}\n\n\tif(TargetType == typeid(filesystem::path))\n\t\treturn boost::any(extract<k3d::filesystem::path>(Value)());\n\n\tif(TargetType == typeid(k3d::angle_axis))\n\t\treturn boost::any(extract<k3d::angle_axis>(Value)());\n\n\tif(TargetType == typeid(k3d::color))\n\t\treturn boost::any(extract<k3d::color>(Value)());\n\n\tif(TargetType == typeid(k3d::point3))\n\t\treturn boost::any(from_sequence<k3d::point3, k3d::double_t, 3>(Value));\n\n\tif(TargetType == typeid(k3d::point4))\n\t\treturn boost::any(from_sequence<k3d::point4, k3d::double_t, 4>(Value));\n\n\tif(TargetType == typeid(k3d::normal3))\n\t\treturn boost::any(from_sequence<k3d::normal3, k3d::double_t, 3>(Value));\n\n\tif(TargetType == typeid(k3d::vector3))\n\t\treturn boost::any(from_sequence<k3d::vector3, k3d::double_t, 3>(Value));\n\t\n\tif(TargetType == typeid(k3d::texture3))\n\t\treturn boost::any(from_sequence<k3d::texture3, k3d::double_t, 3>(Value));\n\n\tif(TargetType == typeid(k3d::matrix4))\n\t\treturn boost::any(extract<k3d::matrix4>(Value)());\n\n\tif(TargetType == typeid(k3d::selection::set))\n\t\treturn boost::any(extract<k3d::selection::set>(Value)());\n\n\tif(TargetType == typeid(k3d::bounding_box3))\n\t\treturn boost::any(extract<k3d::bounding_box3>(Value)());\n\n\tif(TargetType == typeid(k3d::inode*))\n\t{\n\t\tif(Value == boost::python::object())\n\t\t\treturn boost::any(static_cast<k3d::inode*>(0));\n\n\t\textract<iunknown_wrapper> node(Value);\n\t\tif(node.check())\n\t\t\treturn boost::any(node().wrapped_ptr<k3d::inode>());\n\n\t\treturn boost::any(static_cast<k3d::inode*>(0));\n\t}\n\n\tif(TargetType == typeid(const k3d::bitmap*))\n\t\treturn boost::any(extract<const_bitmap_wrapper>(Value)().wrapped_ptr());\n\n\tif(TargetType == typeid(k3d::bitmap*))\n\t\treturn boost::any(extract<bitmap_wrapper>(Value)().wrapped_ptr());\n\n\tif(TargetType == typeid(std::vector<k3d::inode*>))\n\t{\n\t\tstd::vector<k3d::inode*> results;\n\n\t\tboost::python::list nodes = extract<boost::python::list>(Value);\n\t\tconst k3d::uint_t count = boost::python::len(nodes);\n\t\tresults.resize(count);\n\t\tfor(k3d::uint_t i = 0; i != count; ++i)\n\t\t\tresults[i] = &dynamic_cast<k3d::inode&>(extract<iunknown_wrapper>(nodes[i])().wrapped());\n\n\t\treturn boost::any(results);\n\t}\n\n\tif(TargetType == typeid(k3d::typed_array<k3d::double_t>))\n\t{\n\t\tk3d::typed_array<k3d::double_t> results;\n\n\t\tboost::python::list values = extract<boost::python::list>(Value);\n\t\tconst k3d::uint_t count = boost::python::len(values);\n\t\tresults.resize(count);\n\t\tfor(k3d::uint_t i = 0; i != count; ++i)\n\t\t{\n\t\t    results[i] = extract<k3d::double_t>(values[i])();\n\t\t}\n\n\t\treturn boost::any(results);\n\t}\n\n\tthrow std::invalid_argument(\"Can't convert Python value to unrecognized type [\" + demangle(TargetType) + \"]\");\n}\n\nconst ustring python_to_ustring(const boost::python::object& Value)\n{\n\tif(PyString_Check(Value.ptr()))\n\t{\n\t\treturn ustring::from_utf8(PyString_AsString(Value.ptr()));\n\t}\n\telse if(PyUnicode_Check(Value.ptr()))\n\t{\n\t\treturn ustring::from_utf8(PyString_AsString(Value.attr(\"encode\")(\"UTF-8\").ptr()));\n\t}\n\n\tthrow std::invalid_argument(\"Can't convert Python value to a Unicode string.\");\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/any_python.h",
    "content": "#ifndef K3DSDK_PYTHON_ANY_PYTHON_H\n#define K3DSDK_PYTHON_ANY_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ustring.h>\n\n#include <boost/any.hpp>\n#include <boost/python/object.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n/// Converts a boost::any object to a Python object\nconst boost::python::object any_to_python(const boost::any& Value);\n/// Converts a Python value to a boost::any object\nconst boost::any python_to_any(const boost::python::object& Value);\n/// Converts a Python value to a boost::any object, with the target type explicitly specified\nconst boost::any python_to_any(const boost::python::object& Value, const std::type_info& TargetType);\n/// Converts a Python value to a Unicode string\nconst ustring python_to_ustring(const boost::python::object& Value);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_ANY_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/atk_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/atk_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/user_interface.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/mpl/for_each.hpp>\n#include <boost/mpl/range_c.hpp>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nnamespace detail\n{\n\nboost::python::object wrap(AtkObject* Object);\n\n/// Converts the given string to a name suitable as Python function name\n/**\n * TODO: Move this to the SDK, so the conversion is always consistent?\n */\nconst k3d::string_t script_name(const k3d::string_t& Name)\n{\n\treturn boost::replace_all_copy(Name, \" \", \"_\");\n}\n\nconst k3d::int32_t action_index(AtkAction* Action, const k3d::string_t& ActionName)\n{\n\treturn_val_if_fail(Action, -1);\n\tfor(k3d::uint_t i = 0; i != atk_action_get_n_actions(Action); ++i)\n\t{\n\t\tif(std::string(atk_action_get_name(Action, i)) == ActionName)\n\t\t\treturn i;\n\t}\n\treturn -1;\n}\n\n/// Performs the action with the given name. Requires Self to be an AtkAction and the action must exist (caller needs to check this)\nk3d::bool_t do_named_action(atk_object_wrapper& Self, const k3d::string_t& ActionName)\n{\n\tAtkObject* atk_object = Self.wrapped_ptr();\n\treturn_val_if_fail(ATK_IS_ACTION(atk_object), false);\n\tAtkAction* action = ATK_ACTION(atk_object);\n\tk3d::int32_t action_idx = action_index(action, ActionName);\n\treturn_val_if_fail(action_idx > -1, false);\n\tk3d::bool_t result = atk_action_do_action(action, action_idx);\n\tk3d::user_interface().synchronize();\n\treturn result;\n}\n\n/// Proxy for click action\nstatic void click(atk_object_wrapper& Self)\n{\n\tdo_named_action(Self, \"click\");\n}\n\nk3d::bool_t has_action(AtkObject* Object, const k3d::string_t& ActionName)\n{\n\tif(!ATK_IS_ACTION(Object))\n\t\treturn false;\n\treturn action_index(ATK_ACTION(Object), ActionName) > -1;\n}\n\nvoid define_action_methods(AtkObject* Object, boost::python::object& Instance)\n{\n\tif(ATK_IS_ACTION(Object))\n\t{\n\t\tif(has_action(Object, \"click\"))\n\t\t{\n\t\t\tutility::add_method(utility::make_function(&click, \"\"), \"click\", Instance);\n\t\t}\n\t}\n}\n\n/// Get the item with role Role and name Key\nstatic object get_item_name(atk_object_wrapper& Self, const string_t& Key, const AtkRole Role)\n{\n\tAtkObject* atk_obj = Self.wrapped_ptr();\n\tAtkObject* found = 0;\n\tfor(k3d::uint_t i = 0; i != atk_object_get_n_accessible_children(atk_obj); ++i)\n\t{\n\t\tAtkObject* child = atk_object_ref_accessible_child(atk_obj, i);\n\t\tconst gchar* name_ptr = atk_object_get_name(child);\n\t\tconst k3d::string_t name_str(name_ptr ? name_ptr : \"\");\n\t\tif(name_str == Key && atk_object_get_role(child) == Role)\n\t\t{\n\t\t\tif(found)\n\t\t\t\tthrow std::runtime_error(\"Duplicate value for key: \" + Key);\n\t\t\tfound = child;\n\t\t}\n\t}\n\n\tif(!found)\n\t\tthrow std::runtime_error(\"unknown key: \" + Key);\n\n\treturn wrap(found);\n}\n\n/// Get the item with index Key and role Role, with indices counted within children of the same type\nstatic object get_item_idx(atk_object_wrapper& Self, const k3d::uint_t Key, const AtkRole Role)\n{\n\tAtkObject* atk_obj = Self.wrapped_ptr();\n\tconst k3d::uint_t child_count = atk_object_get_n_accessible_children(atk_obj);\n\tif(Key >= child_count)\n\t\tthrow std::runtime_error(\"index out of range: \" + Key);\n\tk3d::uint_t idx = 0;\n\tfor(k3d::uint_t i = 0; i != child_count; ++i)\n\t{\n\t\tAtkObject* child = atk_object_ref_accessible_child(atk_obj, i);\n\t\tif(atk_object_get_role(child) == Role)\n\t\t{\n\t\t\tif(idx == Key)\n\t\t\t\treturn wrap(child);\n\t\t\t++idx;\n\t\t}\n\t}\n\tstd::stringstream error;\n\terror << \"No child with role \" << atk_role_get_name(Role) << \" at index \" << Key;\n\tthrow std::runtime_error(error.str());\n}\n\ntemplate<typename Role>\nstatic object get_item(atk_object_wrapper& Self, object Key)\n{\n\tif(PyString_Check(Key.ptr()))\n\t\treturn get_item_name(Self, boost::python::extract<string_t>(Key), static_cast<AtkRole>(Role::value));\n\telse if(PyInt_Check(Key.ptr()))\n\t\treturn get_item_idx(Self, boost::python::extract<int32_t>(Key), static_cast<AtkRole>(Role::value));\n\telse\n\t\tthrow std::runtime_error(\"Item lookup key must be a string or an integer\");\n}\n\nclass role_method_creator\n{\npublic:\n\trole_method_creator(boost::python::object& Instance) : m_instance(Instance)\n\t{\n\t}\n\n\ttemplate<typename T> void operator()(T RoleIdx)\n\t{\n\t\tconst string_t role_name(atk_role_get_name(static_cast<AtkRole>(RoleIdx.value)));\n\t\tconst string_t function_name(script_name(role_name));\n\t\tconst string_t doc1 = \"Get a \" + role_name + \" by name.\";\n\t\tconst string_t doc2 = \"Get a \" + role_name + \" by index.\";\n\t\tutility::add_method(utility::make_function(&get_item<T>, doc1.c_str()), function_name, m_instance);\n\t}\nprivate:\n\tboost::python::object& m_instance;\n};\n\n/// Wrap an AtkObject, adding additional dynamic methods for any actions it may have\nboost::python::object wrap(AtkObject* Object)\n{\n\tboost::python::object wrapped = k3d::python::wrap(Object);\n\n\trole_method_creator creator(wrapped);\n\tboost::mpl::for_each<boost::mpl::range_c<int32_t,0,ATK_ROLE_LAST_DEFINED> >(creator);\n\n\tdefine_action_methods(Object, wrapped);\n\treturn wrapped;\n}\n\n} // namespace detail\n\nstatic k3d::string_t name(atk_object_wrapper& Self)\n{\n\tconst gchar* the_name = atk_object_get_name(Self.wrapped_ptr());\n\tif(!the_name)\n\t\treturn \"\";\n\treturn k3d::string_t(the_name);\n}\n\nclass atk\n{\npublic:\n\tstatic object root()\n\t{\n\t\treturn detail::wrap(atk_get_root());\n\t}\n};\n\nvoid define_class_atk_object()\n{\n\n\tscope outer = class_<atk>(\"atk\", no_init)\n\t\t.def(\"root\", &atk::root, \"Returns the root ATK object for the K-3D application\")\n\t\t.staticmethod(\"root\");\n\n\tclass_<atk_object_wrapper>(\"object\",\n\t\t\"Wraps an ATK object\", no_init)\n\t\t.def(\"name\", &name, \"Get the name of the ATK object\");\n}\n\n} // namespace python\n\n} // namespace k3d\n"
  },
  {
    "path": "k3dsdk/python/atk_python.h",
    "content": "#ifndef K3DSDK_PYTHON_ATK_PYTHON_H\n#define K3DSDK_PYTHON_ATK_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens\n*/\n\n#include <k3dsdk/types.h>\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <atk/atk.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n/// We use ATK and  not ATKMM, since the latter only gets a Glib::RefPtr to AtkObject, which causes problems with Python wrapping\ntypedef instance_wrapper<AtkObject> atk_object_wrapper;\n\nvoid define_class_atk_object();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_ATK_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/bezier_triangle_patch_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/bezier_triangle_patch_python.h>\n\n#include <k3dsdk/bezier_triangle_patch.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass bezier_triangle_patch\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::bezier_triangle_patch::const_primitive> wrapper;\n\n\t\tstatic object patch_first_points(wrapper& Self) { return wrap(Self.wrapped().patch_first_points); }\n\t\tstatic object patch_orders(wrapper& Self) { return wrap(Self.wrapped().patch_orders); }\n\t\tstatic object patch_selections(wrapper& Self) { return wrap(Self.wrapped().patch_selections); }\n\t\tstatic object patch_materials(wrapper& Self) { return wrap(Self.wrapped().patch_materials); }\n\t\tstatic object patch_points(wrapper& Self) { return wrap(Self.wrapped().patch_points); }\n\t\tstatic object patch_point_weights(wrapper& Self) { return wrap(Self.wrapped().patch_point_weights); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object patch_attributes(wrapper& Self) { return wrap(Self.wrapped().patch_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::bezier_triangle_patch::primitive> wrapper;\n\n\t\tstatic object patch_first_points(wrapper& Self) { return wrap(Self.wrapped().patch_first_points); }\n\t\tstatic object patch_orders(wrapper& Self) { return wrap(Self.wrapped().patch_orders); }\n\t\tstatic object patch_selections(wrapper& Self) { return wrap(Self.wrapped().patch_selections); }\n\t\tstatic object patch_materials(wrapper& Self) { return wrap(Self.wrapped().patch_materials); }\n\t\tstatic object patch_points(wrapper& Self) { return wrap(Self.wrapped().patch_points); }\n\t\tstatic object patch_point_weights(wrapper& Self) { return wrap(Self.wrapped().patch_point_weights); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object patch_attributes(wrapper& Self) { return wrap(Self.wrapped().patch_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::bezier_triangle_patch::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::bezier_triangle_patch::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::bezier_triangle_patch::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_bezier_triangle_patch()\n{\n\tscope outer = class_<bezier_triangle_patch>(\"bezier_triangle_patch\", no_init)\n\t\t.def(\"create\", &bezier_triangle_patch::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &bezier_triangle_patch::validate)\n\t\t.def(\"validate\", &bezier_triangle_patch::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<bezier_triangle_patch::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"patch_first_points\", &bezier_triangle_patch::const_primitive::patch_first_points)\n\t\t.def(\"patch_orders\", &bezier_triangle_patch::const_primitive::patch_orders)\n\t\t.def(\"patch_selections\", &bezier_triangle_patch::const_primitive::patch_selections)\n\t\t.def(\"patch_materials\", &bezier_triangle_patch::const_primitive::patch_materials)\n\t\t.def(\"patch_points\", &bezier_triangle_patch::const_primitive::patch_points)\n\t\t.def(\"patch_point_weights\", &bezier_triangle_patch::const_primitive::patch_point_weights)\n\t\t.def(\"constant_attributes\", &bezier_triangle_patch::const_primitive::constant_attributes)\n\t\t.def(\"patch_attributes\", &bezier_triangle_patch::const_primitive::patch_attributes)\n\t\t.def(\"parameter_attributes\", &bezier_triangle_patch::const_primitive::parameter_attributes)\n\t\t.def(\"vertex_attributes\", &bezier_triangle_patch::const_primitive::vertex_attributes)\n\t\t;\n\n\tclass_<bezier_triangle_patch::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"patch_first_points\", &bezier_triangle_patch::primitive::patch_first_points)\n\t\t.def(\"patch_orders\", &bezier_triangle_patch::primitive::patch_orders)\n\t\t.def(\"patch_selections\", &bezier_triangle_patch::primitive::patch_selections)\n\t\t.def(\"patch_materials\", &bezier_triangle_patch::primitive::patch_materials)\n\t\t.def(\"patch_points\", &bezier_triangle_patch::primitive::patch_points)\n\t\t.def(\"patch_point_weights\", &bezier_triangle_patch::primitive::patch_point_weights)\n\t\t.def(\"constant_attributes\", &bezier_triangle_patch::primitive::constant_attributes)\n\t\t.def(\"patch_attributes\", &bezier_triangle_patch::primitive::patch_attributes)\n\t\t.def(\"parameter_attributes\", &bezier_triangle_patch::primitive::parameter_attributes)\n\t\t.def(\"vertex_attributes\", &bezier_triangle_patch::primitive::vertex_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/bezier_triangle_patch_python.h",
    "content": "#ifndef K3DSDK_PYTHON_BEZIER_TRIANGLE_PATCH_PYTHON_H\n#define K3DSDK_PYTHON_BEZIER_TRIANGLE_PATCH_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_bezier_triangle_patch();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_BEZIER_TRIANGLE_PATCH_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/bicubic_patch_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/bicubic_patch_python.h>\n\n#include <k3dsdk/bicubic_patch.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass bicubic_patch\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::bicubic_patch::const_primitive> wrapper;\n\n\t\tstatic object patch_selections(wrapper& Self) { return wrap(Self.wrapped().patch_selections); }\n\t\tstatic object patch_materials(wrapper& Self) { return wrap(Self.wrapped().patch_materials); }\n\t\tstatic object patch_points(wrapper& Self) { return wrap(Self.wrapped().patch_points); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object patch_attributes(wrapper& Self) { return wrap(Self.wrapped().patch_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::bicubic_patch::primitive> wrapper;\n\n\t\tstatic object patch_selections(wrapper& Self) { return wrap(Self.wrapped().patch_selections); }\n\t\tstatic object patch_materials(wrapper& Self) { return wrap(Self.wrapped().patch_materials); }\n\t\tstatic object patch_points(wrapper& Self) { return wrap(Self.wrapped().patch_points); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object patch_attributes(wrapper& Self) { return wrap(Self.wrapped().patch_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::bicubic_patch::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::bicubic_patch::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::bicubic_patch::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_bicubic_patch()\n{\n\tscope outer = class_<bicubic_patch>(\"bicubic_patch\", no_init)\n\t\t.def(\"create\", &bicubic_patch::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &bicubic_patch::validate)\n\t\t.def(\"validate\", &bicubic_patch::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<bicubic_patch::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"patch_selections\", &bicubic_patch::const_primitive::patch_selections)\n\t\t.def(\"patch_materials\", &bicubic_patch::const_primitive::patch_materials)\n\t\t.def(\"patch_points\", &bicubic_patch::const_primitive::patch_points)\n\t\t.def(\"constant_attributes\", &bicubic_patch::const_primitive::constant_attributes)\n\t\t.def(\"patch_attributes\", &bicubic_patch::const_primitive::patch_attributes)\n\t\t.def(\"parameter_attributes\", &bicubic_patch::const_primitive::parameter_attributes)\n\t\t;\n\n\tclass_<bicubic_patch::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"patch_selections\", &bicubic_patch::primitive::patch_selections)\n\t\t.def(\"patch_materials\", &bicubic_patch::primitive::patch_materials)\n\t\t.def(\"patch_points\", &bicubic_patch::primitive::patch_points)\n\t\t.def(\"constant_attributes\", &bicubic_patch::primitive::constant_attributes)\n\t\t.def(\"patch_attributes\", &bicubic_patch::primitive::patch_attributes)\n\t\t.def(\"parameter_attributes\", &bicubic_patch::primitive::parameter_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/bicubic_patch_python.h",
    "content": "#ifndef K3DSDK_PYTHON_BICUBIC_PATCH_PYTHON_H\n#define K3DSDK_PYTHON_BICUBIC_PATCH_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_bicubic_patch();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_BICUBIC_PATCH_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/bilinear_patch_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/bilinear_patch_python.h>\n\n#include <k3dsdk/bilinear_patch.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass bilinear_patch\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::bilinear_patch::const_primitive> wrapper;\n\n\t\tstatic object patch_selections(wrapper& Self) { return wrap(Self.wrapped().patch_selections); }\n\t\tstatic object patch_materials(wrapper& Self) { return wrap(Self.wrapped().patch_materials); }\n\t\tstatic object patch_points(wrapper& Self) { return wrap(Self.wrapped().patch_points); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object patch_attributes(wrapper& Self) { return wrap(Self.wrapped().patch_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::bilinear_patch::primitive> wrapper;\n\n\t\tstatic object patch_selections(wrapper& Self) { return wrap(Self.wrapped().patch_selections); }\n\t\tstatic object patch_materials(wrapper& Self) { return wrap(Self.wrapped().patch_materials); }\n\t\tstatic object patch_points(wrapper& Self) { return wrap(Self.wrapped().patch_points); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object patch_attributes(wrapper& Self) { return wrap(Self.wrapped().patch_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::bilinear_patch::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::bilinear_patch::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::bilinear_patch::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_bilinear_patch()\n{\n\tscope outer = class_<bilinear_patch>(\"bilinear_patch\", no_init)\n\t\t.def(\"create\", &bilinear_patch::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &bilinear_patch::validate)\n\t\t.def(\"validate\", &bilinear_patch::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<bilinear_patch::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"patch_selections\", &bilinear_patch::const_primitive::patch_selections)\n\t\t.def(\"patch_materials\", &bilinear_patch::const_primitive::patch_materials)\n\t\t.def(\"patch_points\", &bilinear_patch::const_primitive::patch_points)\n\t\t.def(\"constant_attributes\", &bilinear_patch::const_primitive::constant_attributes)\n\t\t.def(\"patch_attributes\", &bilinear_patch::const_primitive::patch_attributes)\n\t\t.def(\"parameter_attributes\", &bilinear_patch::const_primitive::parameter_attributes)\n\t\t;\n\n\tclass_<bilinear_patch::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"patch_selections\", &bilinear_patch::primitive::patch_selections)\n\t\t.def(\"patch_materials\", &bilinear_patch::primitive::patch_materials)\n\t\t.def(\"patch_points\", &bilinear_patch::primitive::patch_points)\n\t\t.def(\"constant_attributes\", &bilinear_patch::primitive::constant_attributes)\n\t\t.def(\"patch_attributes\", &bilinear_patch::primitive::patch_attributes)\n\t\t.def(\"parameter_attributes\", &bilinear_patch::primitive::parameter_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/bilinear_patch_python.h",
    "content": "#ifndef K3DSDK_PYTHON_BILINEAR_PATCH_PYTHON_H\n#define K3DSDK_PYTHON_BILINEAR_PATCH_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_bilinear_patch();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_BILINEAR_PATCH_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/bitmap_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/bitmap_python.h>\n#include <k3dsdk/python/const_bitmap_python.h>\n\n#include <boost/python/tuple.hpp>\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic void assign(bitmap_wrapper& Self, bitmap_wrapper& RHS)\n{\n\tSelf.wrapped() = RHS.wrapped();\n}\n\nstatic void assign_const(bitmap_wrapper& Self, const_bitmap_wrapper& RHS)\n{\n\tSelf.wrapped() = RHS.wrapped();\n}\n\nstatic void reset(bitmap_wrapper& Self, const unsigned long Width, const unsigned long Height)\n{\n\tk3d::bitmap temp(Width, Height);\n\tSelf.wrapped().swap(temp);\n}\n\nstatic tuple get_pixel(bitmap_wrapper& Self, const unsigned long X, const unsigned long Y)\n{\n\tif(X >= Self.wrapped().width())\n\t\tthrow std::invalid_argument(\"X value out-of-range\");\n\tif(Y >= Self.wrapped().height())\n\t\tthrow std::invalid_argument(\"Y value out-of-range\");\n\n\tconst k3d::bitmap::view_t& bitmap = boost::gil::view(Self.wrapped());\n\tk3d::pixel& pixel = bitmap(X, Y);\n\n\treturn boost::python::make_tuple(\n\t\tboost::gil::get_color(pixel, boost::gil::red_t()),\n\t\tboost::gil::get_color(pixel, boost::gil::green_t()),\n\t\tboost::gil::get_color(pixel, boost::gil::blue_t()),\n\t\tboost::gil::get_color(pixel, boost::gil::alpha_t()));\n}\n\nstatic void set_pixel(bitmap_wrapper& Self, const unsigned long X, const unsigned long Y, const tuple& Pixel)\n{\n\tif(X >= Self.wrapped().width())\n\t\tthrow std::invalid_argument(\"X value out-of-range\");\n\tif(Y >= Self.wrapped().height())\n\t\tthrow std::invalid_argument(\"Y value out-of-range\");\n\tif(len(Pixel) != 4)\n\t\tthrow std::invalid_argument(\"Pixel argument must be a 4-tuple\");\n\n\tconst k3d::bitmap::view_t& bitmap = boost::gil::view(Self.wrapped());\n\tk3d::pixel& pixel = bitmap(X, Y);\n\n\tpixel = k3d::pixel(\n\t\tboost::python::extract<double>(Pixel[0])(),\n\t\tboost::python::extract<double>(Pixel[1])(),\n\t\tboost::python::extract<double>(Pixel[2])(),\n\t\tboost::python::extract<double>(Pixel[3])());\n}\n\nstatic const unsigned long width(bitmap_wrapper& Self)\n{\n\treturn Self.wrapped().width();\n}\n\nstatic const unsigned long height(bitmap_wrapper& Self)\n{\n\treturn Self.wrapped().height();\n}\n\nvoid define_class_bitmap()\n{\n\tclass_<bitmap_wrapper>(\"bitmap\",\n\t\t\t\"Stores a two-dimensional half-precision floating-point RGBA bitmap image.\")\n\t\t.def(\"assign\", &assign,\n\t\t\t\"Replaces the current contents with a copy of the given bitmap.\\n\\n\"\n\t\t\t\">>> mycopy.assign(myoriginal)\\n\\n\")\n\t\t.def(\"assign\", &assign_const,\n\t\t\t\"Replaces the current contents with a copy of the given bitmap.\\n\\n\"\n\t\t\t\">>> mycopy.assign(myoriginal)\\n\\n\")\n\t\t.def(\"reset\", &reset,\n\t\t\t\"Replaces the current contents with an uninitialized bitmap with the given dimensions.\\n\\n\"\n\t\t\t\">>> mybitmap.reset(640, 480)\\n\\n\")\n\t\t.def(\"width\", &width,\n\t\t\t\"Returns the width of the image in pixels.\")\n\t\t.def(\"height\", &height,\n\t\t\t\"Returns the height of the image in pixels.\")\n\t\t.def(\"get_pixel\", &get_pixel)\n\t\t.def(\"set_pixel\", &set_pixel)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/bitmap_python.h",
    "content": "#ifndef K3DSDK_PYTHON_BITMAP_PYTHON_H\n#define K3DSDK_PYTHON_BITMAP_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/bitmap.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<k3d::bitmap> bitmap_wrapper;\n\nvoid define_class_bitmap();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_BITMAP_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/blobby_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/blobby_python.h>\n\n#include <k3dsdk/blobby.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass blobby\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::blobby::const_primitive> wrapper;\n\n\t\tstatic object first_primitives(wrapper& Self) { return wrap(Self.wrapped().first_primitives); }\n\t\tstatic object primitive_counts(wrapper& Self) { return wrap(Self.wrapped().primitive_counts); }\n\t\tstatic object first_operators(wrapper& Self) { return wrap(Self.wrapped().first_operators); }\n\t\tstatic object operator_counts(wrapper& Self) { return wrap(Self.wrapped().operator_counts); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object primitives(wrapper& Self) { return wrap(Self.wrapped().primitives); }\n\t\tstatic object primitive_first_floats(wrapper& Self) { return wrap(Self.wrapped().primitive_first_floats); }\n\t\tstatic object primitive_float_counts(wrapper& Self) { return wrap(Self.wrapped().primitive_float_counts); }\n\t\tstatic object operators(wrapper& Self) { return wrap(Self.wrapped().operators); }\n\t\tstatic object operator_first_operands(wrapper& Self) { return wrap(Self.wrapped().operator_first_operands); }\n\t\tstatic object operator_operand_counts(wrapper& Self) { return wrap(Self.wrapped().operator_operand_counts); }\n\t\tstatic object floats(wrapper& Self) { return wrap(Self.wrapped().floats); }\n\t\tstatic object operands(wrapper& Self) { return wrap(Self.wrapped().operands); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::blobby::primitive> wrapper;\n\n\t\tstatic object first_primitives(wrapper& Self) { return wrap(Self.wrapped().first_primitives); }\n\t\tstatic object primitive_counts(wrapper& Self) { return wrap(Self.wrapped().primitive_counts); }\n\t\tstatic object first_operators(wrapper& Self) { return wrap(Self.wrapped().first_operators); }\n\t\tstatic object operator_counts(wrapper& Self) { return wrap(Self.wrapped().operator_counts); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object primitives(wrapper& Self) { return wrap(Self.wrapped().primitives); }\n\t\tstatic object primitive_first_floats(wrapper& Self) { return wrap(Self.wrapped().primitive_first_floats); }\n\t\tstatic object primitive_float_counts(wrapper& Self) { return wrap(Self.wrapped().primitive_float_counts); }\n\t\tstatic object operators(wrapper& Self) { return wrap(Self.wrapped().operators); }\n\t\tstatic object operator_first_operands(wrapper& Self) { return wrap(Self.wrapped().operator_first_operands); }\n\t\tstatic object operator_operand_counts(wrapper& Self) { return wrap(Self.wrapped().operator_operand_counts); }\n\t\tstatic object floats(wrapper& Self) { return wrap(Self.wrapped().floats); }\n\t\tstatic object operands(wrapper& Self) { return wrap(Self.wrapped().operands); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::blobby::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::blobby::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::blobby::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_blobby()\n{\n\tscope outer = class_<blobby>(\"blobby\", no_init)\n\t\t.def(\"create\", &blobby::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &blobby::validate)\n\t\t.def(\"validate\", &blobby::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tenum_<k3d::blobby::primitive_type>(\"primitive_type\")\n\t\t.value(\"CONSTANT\", k3d::blobby::CONSTANT)\n\t\t.value(\"ELLIPSOID\", k3d::blobby::ELLIPSOID)\n\t\t.value(\"SEGMENT\", k3d::blobby::SEGMENT)\n\t\t.attr(\"__module__\") = \"k3d\";\n\n\tenum_<k3d::blobby::operator_type>(\"operator_type\")\n\t\t.value(\"ADD\", k3d::blobby::ADD)\n\t\t.value(\"MULTIPLY\", k3d::blobby::MULTIPLY)\n\t\t.value(\"MAXIMUM\", k3d::blobby::MAXIMUM)\n\t\t.value(\"MINIMUM\", k3d::blobby::MINIMUM)\n\t\t.value(\"SUBTRACT\", k3d::blobby::SUBTRACT)\n\t\t.value(\"DIVIDE\", k3d::blobby::DIVIDE)\n\t\t.value(\"NEGATE\", k3d::blobby::NEGATE)\n\t\t.value(\"IDENTITY\", k3d::blobby::IDENTITY)\n\t\t.attr(\"__module__\") = \"k3d\";\n\n\tclass_<blobby::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"first_primitives\", &blobby::const_primitive::first_primitives)\n\t\t.def(\"primitive_counts\", &blobby::const_primitive::primitive_counts)\n\t\t.def(\"first_operators\", &blobby::const_primitive::first_operators)\n\t\t.def(\"operator_counts\", &blobby::const_primitive::operator_counts)\n\t\t.def(\"materials\", &blobby::const_primitive::materials)\n\t\t.def(\"primitives\", &blobby::const_primitive::primitives)\n\t\t.def(\"primitive_first_floats\", &blobby::const_primitive::primitive_first_floats)\n\t\t.def(\"primitive_float_counts\", &blobby::const_primitive::primitive_float_counts)\n\t\t.def(\"operators\", &blobby::const_primitive::operators)\n\t\t.def(\"operator_first_operands\", &blobby::const_primitive::operator_first_operands)\n\t\t.def(\"operator_operand_counts\", &blobby::const_primitive::operator_operand_counts)\n\t\t.def(\"floats\", &blobby::const_primitive::floats)\n\t\t.def(\"operands\", &blobby::const_primitive::operands)\n\t\t.def(\"constant_attributes\", &blobby::const_primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &blobby::const_primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &blobby::const_primitive::parameter_attributes)\n\t\t.def(\"vertex_attributes\", &blobby::const_primitive::vertex_attributes)\n\t\t;\n\n\tclass_<blobby::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"first_primitives\", &blobby::primitive::first_primitives)\n\t\t.def(\"primitive_counts\", &blobby::primitive::primitive_counts)\n\t\t.def(\"first_operators\", &blobby::primitive::first_operators)\n\t\t.def(\"operator_counts\", &blobby::primitive::operator_counts)\n\t\t.def(\"materials\", &blobby::primitive::materials)\n\t\t.def(\"primitives\", &blobby::primitive::primitives)\n\t\t.def(\"primitive_first_floats\", &blobby::primitive::primitive_first_floats)\n\t\t.def(\"primitive_float_counts\", &blobby::primitive::primitive_float_counts)\n\t\t.def(\"operators\", &blobby::primitive::operators)\n\t\t.def(\"operator_first_operands\", &blobby::primitive::operator_first_operands)\n\t\t.def(\"operator_operand_counts\", &blobby::primitive::operator_operand_counts)\n\t\t.def(\"floats\", &blobby::primitive::floats)\n\t\t.def(\"operands\", &blobby::primitive::operands)\n\t\t.def(\"constant_attributes\", &blobby::primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &blobby::primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &blobby::primitive::parameter_attributes)\n\t\t.def(\"vertex_attributes\", &blobby::primitive::vertex_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/blobby_python.h",
    "content": "#ifndef K3DSDK_PYTHON_BLOBBY_PYTHON_H\n#define K3DSDK_PYTHON_BLOBBY_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_blobby();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_BLOBBY_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/bounding_box3_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/bounding_box3_python.h>\n\n#include <k3dsdk/bounding_box3.h>\n\nusing namespace boost::python;\n\n#include <sstream>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_bounding_box3()\n{\n\tclass_<k3d::bounding_box3>(\"bounding_box3\",\n\t\t\"Stores a three-dimensional bounding box.\")\n\t\t.def(init<double, double, double, double, double, double>())\n\t\t.def(\"empty\", &k3d::bounding_box3::empty,\n\t\t\t\"Returns True if the bounding box is empty.\\n\\n\"\n\t\t\t\"@note: An empty bounding box has a non-existent volume, \"\n\t\t\t\"whereas a bounding box that contains a single point will have zero volume.\")\n\t\t.def(\"width\", &k3d::bounding_box3::width,\n\t\t\t\"Returns the width of the bounding box (its dimension along X).\")\n\t\t.def(\"height\", &k3d::bounding_box3::height,\n\t\t\t\"Returns the height of the bounding box (its dimension along Y).\")\n\t\t.def(\"depth\", &k3d::bounding_box3::depth,\n\t\t\t\"Returns the depth of the bounding box (its dimension along Z).\")\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self_ns::str(self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/bounding_box3_python.h",
    "content": "#ifndef K3DSDK_PYTHON_BOUNDING_BOX3_PYTHON_H\n#define K3DSDK_PYTHON_BOUNDING_BOX3_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_bounding_box3();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_BOUNDING_BOX3_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/color_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/color_python.h>\n\n#include <k3dsdk/color.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_color()\n{\n\tclass_<k3d::color>(\"color\",\n\t\t\"Stores a color using half-precision floating-point RGB values.\\n\\n\"\n\t\t\"@note: The values [0, 1] are mapped to the values [0, 255] in integer color types. \"\n\t\t\"Values outside the range [0, 1] are explicitly allowed.\")\n\t\t.def(init<double, double, double>())\n\t\t.def_readwrite(\"red\", &k3d::color::red,\n\t\t\t\"Stores red component of the color.\")\n\t\t.def_readwrite(\"green\", &k3d::color::green,\n\t\t\t\"Stores green component of the color.\")\n\t\t.def_readwrite(\"blue\", &k3d::color::blue,\n\t\t\t\"Stores blue component of the color.\")\n\t\t.def(self + self)\n\t\t.def(self - self)\n\t\t.def(self * double())\n\t\t.def(double() * self)\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self_ns::str(self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/color_python.h",
    "content": "#ifndef K3DSDK_PYTHON_COLOR_PYTHON_H\n#define K3DSDK_PYTHON_COLOR_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_color();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_COLOR_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/cone_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/cone_python.h>\n\n#include <k3dsdk/cone.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass cone\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::cone::const_primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object heights(wrapper& Self) { return wrap(Self.wrapped().heights); }\n\t\tstatic object radii(wrapper& Self) { return wrap(Self.wrapped().radii); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::cone::primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object heights(wrapper& Self) { return wrap(Self.wrapped().heights); }\n\t\tstatic object radii(wrapper& Self) { return wrap(Self.wrapped().radii); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::cone::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::cone::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::cone::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_cone()\n{\n\tscope outer = class_<cone>(\"cone\", no_init)\n\t\t.def(\"create\", &cone::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &cone::validate)\n\t\t.def(\"validate\", &cone::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<cone::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"matrices\", &cone::const_primitive::matrices)\n\t\t.def(\"materials\", &cone::const_primitive::materials)\n\t\t.def(\"heights\", &cone::const_primitive::heights)\n\t\t.def(\"radii\", &cone::const_primitive::radii)\n\t\t.def(\"sweep_angles\", &cone::const_primitive::sweep_angles)\n\t\t.def(\"selections\", &cone::const_primitive::selections)\n\t\t.def(\"constant_attributes\", &cone::const_primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &cone::const_primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &cone::const_primitive::parameter_attributes)\n\t\t;\n\n\tclass_<cone::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"matrices\", &cone::primitive::matrices)\n\t\t.def(\"materials\", &cone::primitive::materials)\n\t\t.def(\"heights\", &cone::primitive::heights)\n\t\t.def(\"radii\", &cone::primitive::radii)\n\t\t.def(\"sweep_angles\", &cone::primitive::sweep_angles)\n\t\t.def(\"selections\", &cone::primitive::selections)\n\t\t.def(\"constant_attributes\", &cone::primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &cone::primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &cone::primitive::parameter_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/cone_python.h",
    "content": "#ifndef K3DSDK_PYTHON_CONE_PYTHON_H\n#define K3DSDK_PYTHON_CONE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_cone();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_CONE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/const_bitmap_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/const_bitmap_python.h>\n\n#include <boost/python/tuple.hpp>\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic tuple get_pixel(const_bitmap_wrapper& Self, const unsigned long X, const unsigned long Y)\n{\n\tif(X >= Self.wrapped().width())\n\t\tthrow std::invalid_argument(\"X value out-of-range\");\n\tif(Y >= Self.wrapped().height())\n\t\tthrow std::invalid_argument(\"Y value out-of-range\");\n\n\tconst k3d::bitmap::const_view_t& bitmap = boost::gil::const_view(Self.wrapped());\n\tconst k3d::pixel& pixel = bitmap(X, Y);\n\n\treturn boost::python::make_tuple(\n\t\tboost::gil::get_color(pixel, boost::gil::red_t()),\n\t\tboost::gil::get_color(pixel, boost::gil::green_t()),\n\t\tboost::gil::get_color(pixel, boost::gil::blue_t()),\n\t\tboost::gil::get_color(pixel, boost::gil::alpha_t()));\n}\n\nstatic const unsigned long width(const_bitmap_wrapper& Self)\n{\n\treturn Self.wrapped().width();\n}\n\nstatic const unsigned long height(const_bitmap_wrapper& Self)\n{\n\treturn Self.wrapped().height();\n}\n\nvoid define_class_const_bitmap()\n{\n\tclass_<const_bitmap_wrapper>(\"const_bitmap\",\n\t\t\t\"Stores a two-dimensional half-precision floating-point RGBA bitmap image.\", no_init)\n\t\t.def(\"width\", &width,\n\t\t\t\"Returns the width of the image in pixels.\")\n\t\t.def(\"height\", &height,\n\t\t\t\"Returns the height of the image in pixels.\")\n\t\t.def(\"get_pixel\", &get_pixel)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/const_bitmap_python.h",
    "content": "#ifndef K3DSDK_PYTHON_CONST_BITMAP_PYTHON_H\n#define K3DSDK_PYTHON_CONST_BITMAP_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/bitmap.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<const k3d::bitmap> const_bitmap_wrapper;\n\nvoid define_class_const_bitmap();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_CONST_BITMAP_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/const_named_arrays_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/const_named_arrays_python.h>\n#include <k3dsdk/python/const_typed_array_python.h>\n#include <k3dsdk/python/utility_python.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic list keys(const_named_arrays_wrapper& Self)\n{\n\tlist results;\n\n\tfor(k3d::named_arrays::const_iterator array = Self.wrapped().begin(); array != Self.wrapped().end(); ++array)\n\t\tresults.append(array->first);\n\n\treturn results;\n}\n\nstatic object get_item(const_named_arrays_wrapper& Self, const string_t& Key)\n{\n\tk3d::named_arrays::const_iterator iterator = Self.wrapped().find(Key);\n\tif(iterator == Self.wrapped().end())\n\t\tthrow std::runtime_error(\"unknown key: \" + Key);\n\n\treturn wrap_array(iterator->second.get());\n}\n\nvoid define_class_const_named_arrays()\n{\n\tclass_<const_named_arrays_wrapper>(\"const_named_arrays\", \n\t\t\"Stores an immutable (read-only) collection of named arrays (with unrelated lengths).\", no_init)\n\t\t.def(\"keys\", &keys,\n\t\t\t\"Returns a list containing names for all the arrays in the collection.\")\n\t\t.def(\"__len__\", &utility::wrapped_len<const_named_arrays_wrapper>)\n\t\t.def(\"__getitem__\", &get_item);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/const_named_arrays_python.h",
    "content": "#ifndef K3DSDK_PYTHON_CONST_NAMED_ARRAYS_PYTHON_H\n#define K3DSDK_PYTHON_CONST_NAMED_ARRAYS_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/named_arrays.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<const k3d::named_arrays> const_named_arrays_wrapper;\n\nvoid define_class_const_named_arrays();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_CONST_NAMED_ARRAYS_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/const_named_tables_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/const_named_tables_python.h>\n#include <k3dsdk/python/utility_python.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic object const_named_tables_get_item(const_named_tables_wrapper& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\tk3d::named_tables::const_iterator item(Self.wrapped().begin());\n\tstd::advance(item, Item);\n\n\treturn wrap(item->second);\n}\n\nstatic list keys(const_named_tables_wrapper& Self)\n{\n\tlist results;\n\n\tfor(k3d::named_tables::const_iterator table = Self.wrapped().begin(); table != Self.wrapped().end(); ++table)\n\t\tresults.append(table->first);\n\n\treturn results;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// define_class_const_named_tables \n\nvoid define_class_const_named_tables()\n{\n\tclass_<const_named_tables_wrapper>(\"const_named_tables\", no_init)\n\t\t.def(\"__len__\", &utility::wrapped_len<const_named_tables_wrapper>)\n\t\t.def(\"__getitem__\", &utility::wrapped_get_wrapped_item_by_key<const_named_tables_wrapper>)\n\t\t.def(\"__getitem__\", &const_named_tables_get_item)\n\t\t.def(\"keys\", &keys, \"Returns a list containing names for all the tables in the collection.\")\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/const_named_tables_python.h",
    "content": "#ifndef K3DSDK_PYTHON_CONST_NAMED_TABLES_PYTHON_H\n#define K3DSDK_PYTHON_CONST_NAMED_TABLES_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/named_tables.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<const k3d::named_tables> const_named_tables_wrapper;\n\nvoid define_class_const_named_tables();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_CONST_NAMED_TABLES_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/const_table_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/const_table_python.h>\n#include <k3dsdk/python/const_typed_array_python.h>\n#include <k3dsdk/python/utility_python.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic list keys(const_table_wrapper& Self)\n{\n\tlist results;\n\n\tfor(k3d::table::const_iterator array = Self.wrapped().begin(); array != Self.wrapped().end(); ++array)\n\t\tresults.append(array->first);\n\n\treturn results;\n}\n\nstatic object get_item1(const_table_wrapper& Self, const string_t& Key)\n{\n\tk3d::table::const_iterator iterator = Self.wrapped().find(Key);\n\tif(iterator == Self.wrapped().end())\n\t\tthrow std::runtime_error(\"unknown key: \" + Key);\n\n\treturn wrap_array(iterator->second.get());\n}\n\nstatic object get_item2(const_table_wrapper& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.wrapped().column_count())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\tk3d::table::const_iterator iterator = Self.wrapped().begin();\n\tstd::advance(iterator, Item);\n\n\treturn wrap_array(iterator->second.get());\n}\n\nstatic uint_t row_count(const_table_wrapper& Self)\n{\n\treturn Self.wrapped().row_count();\n}\n\nvoid define_class_const_table()\n{\n\tclass_<const_table_wrapper>(\"const_table\", \n\t\t\"Stores an immutable (read-only) collection of attribute arrays (named arrays with identical lengths).\", no_init)\n\t\t.def(\"keys\", &keys,\n\t\t\t\"Returns a list containing names for all the arrays in the collection.\")\n\t\t.def(\"__len__\", &row_count)\n\t\t.def(\"__getitem__\", &get_item1)\n\t\t.def(\"__getitem__\", &get_item2)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/const_table_python.h",
    "content": "#ifndef K3DSDK_PYTHON_CONST_TABLE_PYTHON_H\n#define K3DSDK_PYTHON_CONST_TABLE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/table.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<const k3d::table> const_table_wrapper;\n\nvoid define_class_const_table();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_CONST_TABLE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/const_typed_array_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/const_typed_array_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/named_array_types.h>\n#include <k3dsdk/typed_array.h>\n#include <k3dsdk/uint_t_array.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic boost::python::object get_item_imaterial(instance_wrapper<const k3d::typed_array<k3d::imaterial*> >& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\treturn wrap(Self.wrapped().at(Item));\n}\n\nstatic boost::python::object get_item_inode(instance_wrapper<const k3d::typed_array<k3d::inode*> >& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\treturn wrap(Self.wrapped().at(Item));\n}\n\ntemplate<typename self_t>\nstatic string_t get_metadata_value(const self_t& Self, const string_t& Name)\n{\n\treturn Self.wrapped().get_metadata_value(Name);\n}\n\ntemplate<typename self_t>\nstatic const string_t array_str(const self_t& Self)\n{\n\tstd::ostringstream buffer;\n\tbuffer << Self.wrapped();\n\treturn buffer.str();\n}\n\ntemplate<typename self_t>\nstatic boost::python::dict get_metadata(const self_t& Self)\n{\n\tboost::python::dict result;\n\n\tconst array::metadata_t metadata = Self.wrapped().get_metadata();\n\tfor(array::metadata_t::const_iterator pair = metadata.begin(); pair != metadata.end(); ++pair)\n\t\tresult[pair->first] = pair->second;\n\n\treturn result;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n// define_class_const_typed_array\n\ntemplate<typename array_type>\nstatic void define_class_const_typed_array(const char* const ClassName, const char* const DocString)\n{\n\ttypedef instance_wrapper<array_type> wrapper_type;\n\n\tboost::python::class_<wrapper_type>(ClassName, DocString, boost::python::no_init)\n\t\t.def(\"__len__\", &utility::wrapped_len<wrapper_type>)\n\t\t.def(\"__getitem__\", &utility::wrapped_get_item<wrapper_type, typename array_type::value_type>)\n\t\t.def(\"__str__\", &array_str<wrapper_type>)\n\t\t.def(\"get_metadata_value\", &get_metadata_value<wrapper_type>)\n\t\t.def(\"get_metadata\", &get_metadata<wrapper_type>)\n\t\t;\n}\n\ntemplate<>\nvoid define_class_const_typed_array<const k3d::typed_array<k3d::imaterial*> >(const char* const ClassName, const char* const DocString)\n{\n\ttypedef const k3d::typed_array<k3d::imaterial*> array_type;\n\ttypedef instance_wrapper<array_type> wrapper_type;\n\n\tboost::python::class_<wrapper_type>(ClassName, DocString, boost::python::no_init)\n\t\t.def(\"__len__\", &utility::wrapped_len<wrapper_type>)\n\t\t.def(\"__getitem__\", &get_item_imaterial)\n\t\t.def(\"get_metadata_value\", &get_metadata_value<wrapper_type>)\n\t\t.def(\"get_metadata\", &get_metadata<wrapper_type>)\n\t\t;\n}\n\ntemplate<>\nvoid define_class_const_typed_array<const k3d::typed_array<k3d::inode*> >(const char* const ClassName, const char* const DocString)\n{\n\ttypedef const k3d::typed_array<k3d::inode*> array_type;\n\ttypedef instance_wrapper<array_type> wrapper_type;\n\n\tboost::python::class_<wrapper_type>(ClassName, DocString, boost::python::no_init)\n\t\t.def(\"__len__\", &utility::wrapped_len<wrapper_type>)\n\t\t.def(\"__getitem__\", &get_item_inode)\n\t\t.def(\"get_metadata_value\", &get_metadata_value<wrapper_type>)\n\t\t.def(\"get_metadata\", &get_metadata<wrapper_type>)\n\t\t;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n// const_typed_array_array_factory\n\nclass const_typed_array_array_factory\n{\npublic:\n\tconst_typed_array_array_factory(const k3d::array& Input, boost::python::object& Output) :\n\t\tinput(Input),\n\t\toutput(Output)\n\t{\n\t\toutput = boost::python::object();\n\n\t\tif(const k3d::uint_t_array* const array = dynamic_cast<const k3d::uint_t_array*>(&input))\n\t\t\toutput = wrap(array);\n\t}\n\n\ttemplate<typename T>\n\tvoid operator()(T) const\n\t{\n\t\tif(output != boost::python::object())\n\t\t\treturn;\n\n\t\ttypedef const k3d::typed_array<T> array_type;\n\n\t\tif(array_type* const array = dynamic_cast<array_type*>(&input))\n\t\t\toutput = wrap(array);\n\t}\n\nprivate:\n\tconst k3d::array& input;\n\tboost::python::object& output;\n};\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n// wrap_array\n\nboost::python::object wrap_array(const k3d::array* Wrapped)\n{\n\tif(Wrapped)\n\t\treturn wrap_array(*Wrapped);\n\n\treturn boost::python::object();\n}\n\nboost::python::object wrap_array(const k3d::array& Wrapped)\n{\n\tboost::python::object result;\n\tboost::mpl::for_each<k3d::named_array_types>(const_typed_array_array_factory(Wrapped, result));\n\treturn result;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n// define_const_typed_array_classes\n\nvoid define_const_typed_array_classes()\n{\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::bool_t> >(\"const_typed_array_bool_t\",\n\t\t\"Stores an immutable (read-only) collection of boolean values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::double_t> >(\"const_typed_array_double_t\",\n\t\t\"Stores an immutable (read-only) collection of floating-point values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::int8_t> >(\"const_typed_array_int8_t\",\n\t\t\"Stores an immutable (read-only) collection of 8-bit integer values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::int16_t> >(\"const_typed_array_int16_t\",\n\t\t\"Stores an immutable (read-only) collection of 16-bit integer values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::int32_t> >(\"const_typed_array_int32_t\",\n\t\t\"Stores an immutable (read-only) collection of 32-bit integer values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::int64_t> >(\"const_typed_array_int64_t\",\n\t\t\"Stores an immutable (read-only) collection of 64-bit integer values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::imaterial*> >(\"const_typed_array_imaterial\",\n\t\t\"Stores an immutable (read-only) collection of L{imaterial} objects.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::inode*> >(\"const_typed_array_inode\",\n\t\t\"Stores an immutable (read-only) collection of L{inode} objects.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::color> >(\"const_typed_array_color\",\n\t\t\"Stores an immutable (read-only) collection of L{color} values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::matrix4> >(\"const_typed_array_matrix4\",\n\t\t\"Stores an immutable (read-only) collection of L{matrix4} values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::normal3> >(\"const_typed_array_normal3\",\n\t\t\"Stores an immutable (read-only) collection of L{normal3} values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::point2> >(\"const_typed_array_point2\",\n\t\t\"Stores an immutable (read-only) collection of L{point2} values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::point3> >(\"const_typed_array_point3\",\n\t\t\"Stores an immutable (read-only) collection of L{point3} values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::point4> >(\"const_typed_array_point4\",\n\t\t\"Stores an immutable (read-only) collection of L{point4} values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::string_t> >(\"const_typed_array_string_t\",\n\t\t\"Stores an immutable (read-only) collection of string values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::texture3> >(\"const_typed_array_texture3\",\n\t\t\"Stores an immutable (read-only) collection of L{texture3} values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::uint8_t> >(\"const_typed_array_uint8_t\",\n\t\t\"Stores an immutable (read-only) collection of unsigned 8-bit integer values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::uint16_t> >(\"const_typed_array_uint16_t\",\n\t\t\"Stores an immutable (read-only) collection of unsigned 16-bit integer values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::uint32_t> >(\"const_typed_array_uint32_t\",\n\t\t\"Stores an immutable (read-only) collection of unsigned 32-bit integer values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::uint64_t> >(\"const_typed_array_uint64_t\",\n\t\t\"Stores an immutable (read-only) collection of unsigned 64-bit integer values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::vector2> >(\"const_typed_array_vector2\",\n\t\t\"Stores an immutable (read-only) collection of L{vector2} values.\");\n\tdefine_class_const_typed_array<const k3d::typed_array<k3d::vector3> >(\"const_typed_array_vector3\",\n\t\t\"Stores an immutable (read-only) collection of L{vector3} values.\");\n\n\tdefine_class_const_typed_array<const k3d::uint_t_array>(\"const_uint_t_array\",\n\t\t\"Stores an immutable (read-only) collection of 32- or 64-bit values (depending on platform).\");\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/const_typed_array_python.h",
    "content": "#ifndef K3DSDK_PYTHON_CONST_TYPED_ARRAY_PYTHON_H\n#define K3DSDK_PYTHON_CONST_TYPED_ARRAY_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/array.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nboost::python::object wrap_array(const k3d::array* Wrapped);\nboost::python::object wrap_array(const k3d::array& Wrapped);\n\nvoid define_const_typed_array_classes();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_CONST_TYPED_ARRAY_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/cubic_curve_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/cubic_curve_python.h>\n\n#include <k3dsdk/cubic_curve.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass cubic_curve\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::cubic_curve::const_primitive> wrapper;\n\n\t\tstatic object periodic(wrapper& Self) { return wrap(Self.wrapped().periodic); }\n\t\tstatic object material(wrapper& Self) { return wrap(Self.wrapped().material); }\n\t\tstatic object curve_first_points(wrapper& Self) { return wrap(Self.wrapped().curve_first_points); }\n\t\tstatic object curve_point_counts(wrapper& Self) { return wrap(Self.wrapped().curve_point_counts); }\n\t\tstatic object curve_selections(wrapper& Self) { return wrap(Self.wrapped().curve_selections); }\n\t\tstatic object curve_points(wrapper& Self) { return wrap(Self.wrapped().curve_points); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object curve_attributes(wrapper& Self) { return wrap(Self.wrapped().curve_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::cubic_curve::primitive> wrapper;\n\n\t\tstatic object periodic(wrapper& Self) { return wrap(Self.wrapped().periodic); }\n\t\tstatic object material(wrapper& Self) { return wrap(Self.wrapped().material); }\n\t\tstatic object curve_first_points(wrapper& Self) { return wrap(Self.wrapped().curve_first_points); }\n\t\tstatic object curve_point_counts(wrapper& Self) { return wrap(Self.wrapped().curve_point_counts); }\n\t\tstatic object curve_selections(wrapper& Self) { return wrap(Self.wrapped().curve_selections); }\n\t\tstatic object curve_points(wrapper& Self) { return wrap(Self.wrapped().curve_points); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object curve_attributes(wrapper& Self) { return wrap(Self.wrapped().curve_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::cubic_curve::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::cubic_curve::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::cubic_curve::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_cubic_curve()\n{\n\tscope outer = class_<cubic_curve>(\"cubic_curve\", no_init)\n\t\t.def(\"create\", &cubic_curve::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &cubic_curve::validate)\n\t\t.def(\"validate\", &cubic_curve::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<cubic_curve::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"periodic\", &cubic_curve::const_primitive::periodic)\n\t\t.def(\"material\", &cubic_curve::const_primitive::material)\n\t\t.def(\"curve_first_points\", &cubic_curve::const_primitive::curve_first_points)\n\t\t.def(\"curve_point_counts\", &cubic_curve::const_primitive::curve_point_counts)\n\t\t.def(\"curve_selections\", &cubic_curve::const_primitive::curve_selections)\n\t\t.def(\"curve_points\", &cubic_curve::const_primitive::curve_points)\n\t\t.def(\"constant_attributes\", &cubic_curve::const_primitive::constant_attributes)\n\t\t.def(\"curve_attributes\", &cubic_curve::const_primitive::curve_attributes)\n\t\t.def(\"parameter_attributes\", &cubic_curve::const_primitive::parameter_attributes)\n\t\t.def(\"vertex_attributes\", &cubic_curve::const_primitive::vertex_attributes)\n\t\t;\n\n\tclass_<cubic_curve::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"periodic\", &cubic_curve::primitive::periodic)\n\t\t.def(\"material\", &cubic_curve::primitive::material)\n\t\t.def(\"curve_first_points\", &cubic_curve::primitive::curve_first_points)\n\t\t.def(\"curve_point_counts\", &cubic_curve::primitive::curve_point_counts)\n\t\t.def(\"curve_selections\", &cubic_curve::primitive::curve_selections)\n\t\t.def(\"curve_points\", &cubic_curve::primitive::curve_points)\n\t\t.def(\"constant_attributes\", &cubic_curve::primitive::constant_attributes)\n\t\t.def(\"curve_attributes\", &cubic_curve::primitive::curve_attributes)\n\t\t.def(\"parameter_attributes\", &cubic_curve::primitive::parameter_attributes)\n\t\t.def(\"vertex_attributes\", &cubic_curve::primitive::vertex_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/cubic_curve_python.h",
    "content": "#ifndef K3DSDK_PYTHON_CUBIC_CURVE_PYTHON_H\n#define K3DSDK_PYTHON_CUBIC_CURVE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_cubic_curve();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_CUBIC_CURVE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/cylinder_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/cylinder_python.h>\n\n#include <k3dsdk/cylinder.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass cylinder\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::cylinder::const_primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object radii(wrapper& Self) { return wrap(Self.wrapped().radii); }\n\t\tstatic object z_min(wrapper& Self) { return wrap(Self.wrapped().z_min); }\n\t\tstatic object z_max(wrapper& Self) { return wrap(Self.wrapped().z_max); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::cylinder::primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object radii(wrapper& Self) { return wrap(Self.wrapped().radii); }\n\t\tstatic object z_min(wrapper& Self) { return wrap(Self.wrapped().z_min); }\n\t\tstatic object z_max(wrapper& Self) { return wrap(Self.wrapped().z_max); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::cylinder::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::cylinder::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::cylinder::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_cylinder()\n{\n\tscope outer = class_<cylinder>(\"cylinder\", no_init)\n\t\t.def(\"create\", &cylinder::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &cylinder::validate)\n\t\t.def(\"validate\", &cylinder::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<cylinder::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"matrices\", &cylinder::const_primitive::matrices)\n\t\t.def(\"materials\", &cylinder::const_primitive::materials)\n\t\t.def(\"radii\", &cylinder::const_primitive::radii)\n\t\t.def(\"z_min\", &cylinder::const_primitive::z_min)\n\t\t.def(\"z_max\", &cylinder::const_primitive::z_max)\n\t\t.def(\"sweep_angles\", &cylinder::const_primitive::sweep_angles)\n\t\t.def(\"selections\", &cylinder::const_primitive::selections)\n\t\t.def(\"constant_attributes\", &cylinder::const_primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &cylinder::const_primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &cylinder::const_primitive::parameter_attributes)\n\t\t;\n\n\tclass_<cylinder::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"matrices\", &cylinder::primitive::matrices)\n\t\t.def(\"materials\", &cylinder::primitive::materials)\n\t\t.def(\"radii\", &cylinder::primitive::radii)\n\t\t.def(\"z_min\", &cylinder::primitive::z_min)\n\t\t.def(\"z_max\", &cylinder::primitive::z_max)\n\t\t.def(\"sweep_angles\", &cylinder::primitive::sweep_angles)\n\t\t.def(\"selections\", &cylinder::primitive::selections)\n\t\t.def(\"constant_attributes\", &cylinder::primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &cylinder::primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &cylinder::primitive::parameter_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/cylinder_python.h",
    "content": "#ifndef K3DSDK_PYTHON_CYLINDER_PYTHON_H\n#define K3DSDK_PYTHON_CYLINDER_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_cylinder();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_CYLINDER_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/difference_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/difference.h>\n#include <k3dsdk/python/difference_python.h>\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/typed_array_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass difference\n{\npublic:\n\tstatic void const_mesh(const_mesh_wrapper& A, const_mesh_wrapper& B, k3d::difference::accumulator& Result)\n\t{\n\t\tk3d::difference::test(A.wrapped(), B.wrapped(), Result);\n\t}\n\n\tstatic void mesh(mesh_wrapper& A, mesh_wrapper& B, k3d::difference::accumulator& Result)\n\t{\n\t\tk3d::difference::test(A.wrapped(), B.wrapped(), Result);\n\t}\n\n\tstatic void matrix4(k3d::matrix4& A, k3d::matrix4& B, k3d::difference::accumulator& Result)\n\t{\n\t\tk3d::difference::test(A, B, Result);\n\t}\n\n\tstatic void const_points(instance_wrapper<const k3d::mesh::points_t>& A, instance_wrapper<const k3d::mesh::points_t>& B, k3d::difference::accumulator& Result)\n\t{\n\t\tA.wrapped().difference(B.wrapped(), Result);\n\t}\n\n\tstatic void points(instance_wrapper<k3d::mesh::points_t>& A, instance_wrapper<k3d::mesh::points_t>& B, k3d::difference::accumulator& Result)\n\t{\n\t\tA.wrapped().difference(B.wrapped(), Result);\n\t}\n\n\tstatic void points_list(instance_wrapper<k3d::mesh::points_t>& A, list B, k3d::difference::accumulator& Result)\n\t{\n\t\tk3d::mesh::points_t b;\n\t\tutility::copy(B, b);\n\t\tA.wrapped().difference(b, Result);\n\t}\n\n\tstatic void const_points_list(instance_wrapper<const k3d::mesh::points_t>& A, list B, k3d::difference::accumulator& Result)\n\t{\n\t\tk3d::mesh::points_t b;\n\t\tutility::copy(B, b);\n\t\tA.wrapped().difference(b, Result);\n\t}\n};\n\nstatic std::size_t exact_count(k3d::difference::accumulator& Self) { return boost::accumulators::count(Self.exact); }\nstatic k3d::bool_t exact_min(k3d::difference::accumulator& Self) { return boost::accumulators::min(Self.exact); }\nstatic k3d::bool_t exact_max(k3d::difference::accumulator& Self) { return boost::accumulators::max(Self.exact); }\nstatic std::size_t ulps_count(k3d::difference::accumulator& Self) { return boost::accumulators::count(Self.ulps); }\nstatic k3d::double_t ulps_min(k3d::difference::accumulator& Self) { return boost::accumulators::min(Self.ulps); }\nstatic k3d::double_t ulps_max(k3d::difference::accumulator& Self) { return boost::accumulators::max(Self.ulps); }\nstatic k3d::double_t ulps_mean(k3d::difference::accumulator& Self) { return boost::accumulators::mean(Self.ulps); }\nstatic k3d::double_t ulps_median(k3d::difference::accumulator& Self) { return boost::accumulators::median(Self.ulps); }\n//static k3d::double_t ulps_variance(k3d::difference::accumulator& Self) { return boost::accumulators::variance(Self.ulps); }\n//static k3d::double_t ulps_standard_deviation(k3d::difference::accumulator& Self) { return std::sqrt(boost::accumulators::variance(Self.ulps)); }\n\nvoid define_namespace_difference()\n{\n\tboost::python::scope outer = boost::python::class_<difference>(\"difference\", boost::python::no_init)\n\t\t.def(\"test\", &difference::const_mesh,\n\t\t\t\"Computes the difference between two meshes using fuzzy-comparisons for floating-point types.\")\n\t\t.def(\"test\", &difference::mesh,\n\t\t\t\"Computes the difference between two meshes using fuzzy-comparisons for floating-point types.\")\n\t\t.def(\"test\", &difference::matrix4,\n\t\t\t\"Computes the difference between two matrices using fuzzy-comparisons for floating-point types.\")\n\t\t.def(\"test\", &difference::points,\n\t\t\t\"Computes the difference between two point arrays using fuzzy-comparisons for floating-point types.\")\n\t\t.def(\"test\", &difference::const_points,\n\t\t\t\"Computes the difference between two point arrays using fuzzy-comparisons for floating-point types.\")\n\t\t.def(\"test\", &difference::points_list,\n\t\t\t\"Computes the difference between a point array and a list using fuzzy-comparisons for floating-point types.\")\n\t\t.def(\"test\", &difference::const_points_list,\n\t\t\t\"Computes the difference between a point array and a list using fuzzy-comparisons for floating-point types.\")\n\t\t.staticmethod(\"test\")\n\t\t;\n\n\tboost::python::class_<k3d::difference::accumulator>(\"accumulator\")\n\t\t.def(\"exact_count\", &exact_count)\n\t\t.def(\"exact_min\", &exact_min)\n\t\t.def(\"exact_max\", &exact_max)\n\n\t\t.def(\"ulps_count\", &ulps_count)\n\t\t.def(\"ulps_min\", &ulps_min)\n\t\t.def(\"ulps_max\", &ulps_max)\n\t\t.def(\"ulps_mean\", &ulps_mean)\n\t\t.def(\"ulps_median\", &ulps_median)\n\t\t//.def(\"ulps_variance\", &ulps_variance)\n\t\t//.def(\"ulps_standard_deviation\", &ulps_standard_deviation)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/difference_python.h",
    "content": "#ifndef K3DSDK_PYTHON_DIFFERENCE_PYTHON_H\n#define K3DSDK_PYTHON_DIFFERENCE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_difference();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_DIFFERENCE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/disk_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/disk_python.h>\n\n#include <k3dsdk/disk.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass disk\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::disk::const_primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object heights(wrapper& Self) { return wrap(Self.wrapped().heights); }\n\t\tstatic object radii(wrapper& Self) { return wrap(Self.wrapped().radii); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::disk::primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object heights(wrapper& Self) { return wrap(Self.wrapped().heights); }\n\t\tstatic object radii(wrapper& Self) { return wrap(Self.wrapped().radii); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::disk::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::disk::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::disk::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_disk()\n{\n\tscope outer = class_<disk>(\"disk\", no_init)\n\t\t.def(\"create\", &disk::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &disk::validate)\n\t\t.def(\"validate\", &disk::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<disk::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"matrices\", &disk::const_primitive::matrices)\n\t\t.def(\"materials\", &disk::const_primitive::materials)\n\t\t.def(\"heights\", &disk::const_primitive::heights)\n\t\t.def(\"radii\", &disk::const_primitive::radii)\n\t\t.def(\"sweep_angles\", &disk::const_primitive::sweep_angles)\n\t\t.def(\"selections\", &disk::const_primitive::selections)\n\t\t.def(\"constant_attributes\", &disk::const_primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &disk::const_primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &disk::const_primitive::parameter_attributes)\n\t\t;\n\n\tclass_<disk::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"matrices\", &disk::primitive::matrices)\n\t\t.def(\"materials\", &disk::primitive::materials)\n\t\t.def(\"heights\", &disk::primitive::heights)\n\t\t.def(\"radii\", &disk::primitive::radii)\n\t\t.def(\"sweep_angles\", &disk::primitive::sweep_angles)\n\t\t.def(\"selections\", &disk::primitive::selections)\n\t\t.def(\"constant_attributes\", &disk::primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &disk::primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &disk::primitive::parameter_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/disk_python.h",
    "content": "#ifndef K3DSDK_PYTHON_DISK_PYTHON_H\n#define K3DSDK_PYTHON_DISK_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_disk();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_DISK_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/euler_angles_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/euler_angles_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/algebra.h>\n\nusing namespace boost::python;\n\n#include <sstream>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n/*\neuler_angles::euler_angles(const k3d::euler_angles& EulerAngles) :\n\tbase(EulerAngles)\n{\n}\n\neuler_angles::euler_angles(const euler_angles::AngleOrder Order, const double A, const double B, const double C) :\n\tbase(radians(A), radians(B), radians(C), Order)\n{\n}\n\nconst double euler_angles::getitem(const int Item) const\n{\n\tif(Item < 0 || Item > 2)\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\treturn degrees((*this)[Item]);\n}\n\nvoid euler_angles::setitem(const int Item, const double Value)\n{\n\tif(Item < 0 || Item > 2)\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\t(*this)[Item] = radians(Value);\n}\n\nconst std::string euler_angles::str() const\n{\n\tstd::stringstream buffer;\n\tbuffer << \"(\\\"\";\n\n\tswitch(order)\n\t{\n\t\tcase euler_angles::XYZstatic:\n\t\t\tbuffer << \"xyz\";\n\t\t\tbreak;\n\t\tcase euler_angles::XYXstatic:\n\t\t\tbuffer << \"xyx\";\n\t\t\tbreak;\n\t\tcase euler_angles::XZYstatic:\n\t\t\tbuffer << \"xzy\";\n\t\t\tbreak;\n\t\tcase euler_angles::XZXstatic:\n\t\t\tbuffer << \"xzx\";\n\t\t\tbreak;\n\t\tcase euler_angles::YZXstatic:\n\t\t\tbuffer << \"yzx\";\n\t\t\tbreak;\n\t\tcase euler_angles::YZYstatic:\n\t\t\tbuffer << \"yzy\";\n\t\t\tbreak;\n\t\tcase euler_angles::YXZstatic:\n\t\t\tbuffer << \"yxz\";\n\t\t\tbreak;\n\t\tcase euler_angles::YXYstatic:\n\t\t\tbuffer << \"yxy\";\n\t\t\tbreak;\n\t\tcase euler_angles::ZXYstatic:\n\t\t\tbuffer << \"zxy\";\n\t\t\tbreak;\n\t\tcase euler_angles::ZXZstatic:\n\t\t\tbuffer << \"zxz\";\n\t\t\tbreak;\n\t\tcase euler_angles::ZYXstatic:\n\t\t\tbuffer << \"zyx\";\n\t\t\tbreak;\n\t\tcase euler_angles::ZYZstatic:\n\t\t\tbuffer << \"zyz\";\n\t\t\tbreak;\n\t\tcase euler_angles::ZYXrotating:\n\t\t\tbuffer << \"zyx_rotating\";\n\t\t\tbreak;\n\t\tcase euler_angles::XYXrotating :\n\t\t\tbuffer << \"xyx_rotating\";\n\t\t\tbreak;\n\t\tcase euler_angles::YZXrotating:\n\t\t\tbuffer << \"yzx_rotating\";\n\t\t\tbreak;\n\t\tcase euler_angles::XZXrotating :\n\t\t\tbuffer << \"xzx_rotating\";\n\t\t\tbreak;\n\t\tcase euler_angles::XZYrotating:\n\t\t\tbuffer << \"xzy_rotating\";\n\t\t\tbreak;\n\t\tcase euler_angles::YZYrotating :\n\t\t\tbuffer << \"yzy_rotating\";\n\t\t\tbreak;\n\t\tcase euler_angles::ZXYrotating:\n\t\t\tbuffer << \"zxy_rotating\";\n\t\t\tbreak;\n\t\tcase euler_angles::YXYrotating :\n\t\t\tbuffer << \"yxy_rotating\";\n\t\t\tbreak;\n\t\tcase euler_angles::YXZrotating:\n\t\t\tbuffer << \"yxz_rotating\";\n\t\t\tbreak;\n\t\tcase euler_angles::ZXZrotating :\n\t\t\tbuffer << \"zxz_rotating\";\n\t\t\tbreak;\n\t\tcase euler_angles::XYZrotating:\n\t\t\tbuffer << \"xyz_rotating\";\n\t\t\tbreak;\n\t\tcase euler_angles::ZYZrotating:\n\t\t\tbuffer << \"zyz_rotating\";\n\t\t\tbreak;\n\t}\n\n\tbuffer << \"\\\", \" << degrees((*this)[0]) << \", \" << degrees((*this)[1]) << \", \" << degrees((*this)[2]);\n\tbuffer << \")\";\n\n\treturn buffer.str();\n}\n*/\n\nconst euler_angles euler_angles_add(const euler_angles& LHS, const euler_angles& RHS)\n{\n\tif(LHS.order != RHS.order)\n\t\tthrow std::invalid_argument(\"argument order must match\");\n\n\n\treturn k3d::euler_angles(LHS[0] + RHS[0], LHS[1] + RHS[1], LHS[2] + RHS[2], LHS.order);\n}\n\nconst euler_angles euler_angles_mul(const euler_angles& LHS, const double_t RHS)\n{\n\treturn k3d::euler_angles(LHS[0] * RHS, LHS[1] * RHS, LHS[2] * RHS, LHS.order);\n}\n\nconst euler_angles euler_angles_rmul(const double_t LHS, const euler_angles& RHS)\n{\n\treturn euler_angles_mul(RHS, LHS);\n}\n\nvoid define_class_euler_angles()\n{\n\tscope outer = class_<k3d::euler_angles>(\"euler_angles\",\n\t\t\"Encodes a change in orientation as three rotations around mutally-perpendicular axes.\", no_init)\n\t\t.def(init<k3d::double_t, k3d::double_t, k3d::double_t, k3d::euler_angles::AngleOrder>())\n\t\t.def_readwrite(\"order\", &k3d::euler_angles::order)\n\t\t.def(\"__len__\", &utility::constant_len_len<k3d::euler_angles, 3>)\n\t\t.def(\"__getitem__\", &utility::constant_len_get_item<k3d::euler_angles, 3, k3d::double_t>)\n\t\t.def(\"__setitem__\", &utility::constant_len_set_item<k3d::euler_angles, 3, k3d::double_t>)\n\t\t.def(\"__add__\", &euler_angles_add)\n\t\t.def(\"__mul__\", &euler_angles_mul)\n\t\t.def(\"__rmul__\", &euler_angles_rmul)\n\t\t.def(self_ns::str(self))\n\t\t;\n\n\tenum_<k3d::euler_angles::AngleOrder>(\"angle_order\")\n\t\t.value(\"xyz\", k3d::euler_angles::XYZstatic)\n\t\t.value(\"xyz\", k3d::euler_angles::XYZstatic)\n\t\t.value(\"xyx\", k3d::euler_angles::XYXstatic)\n\t\t.value(\"xzy\", k3d::euler_angles::XZYstatic)\n\t\t.value(\"xzx\", k3d::euler_angles::XZXstatic)\n\t\t.value(\"yzx\", k3d::euler_angles::YZXstatic)\n\t\t.value(\"yzy\", k3d::euler_angles::YZYstatic)\n\t\t.value(\"yxz\", k3d::euler_angles::YXZstatic)\n\t\t.value(\"yxy\", k3d::euler_angles::YXYstatic)\n\t\t.value(\"zxy\", k3d::euler_angles::ZXYstatic)\n\t\t.value(\"zxz\", k3d::euler_angles::ZXZstatic)\n\t\t.value(\"zyx\", k3d::euler_angles::ZYXstatic)\n\t\t.value(\"zyz\", k3d::euler_angles::ZYZstatic)\n\t\t.value(\"zyx_rotating\", k3d::euler_angles::ZYXrotating)\n\t\t.value(\"xyx_rotating\", k3d::euler_angles::XYXrotating)\n\t\t.value(\"yzx_rotating\", k3d::euler_angles::YZXrotating)\n\t\t.value(\"xzx_rotating\", k3d::euler_angles::XZXrotating)\n\t\t.value(\"xzy_rotating\", k3d::euler_angles::XZYrotating)\n\t\t.value(\"yzy_rotating\", k3d::euler_angles::YZYrotating)\n\t\t.value(\"zxy_rotating\", k3d::euler_angles::ZXYrotating)\n\t\t.value(\"yxy_rotating\", k3d::euler_angles::YXYrotating)\n\t\t.value(\"yxz_rotating\", k3d::euler_angles::YXZrotating)\n\t\t.value(\"zxz_rotating\", k3d::euler_angles::ZXZrotating)\n\t\t.value(\"xyz_rotating\", k3d::euler_angles::XYZrotating)\n\t\t.value(\"zyz_rotating\", k3d::euler_angles::ZYZrotating)\n\t\t.attr(\"__module__\") = \"k3d\"\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/euler_angles_python.h",
    "content": "#ifndef K3DSDK_PYTHON_EULER_ANGLES_PYTHON_H\n#define K3DSDK_PYTHON_EULER_ANGLES_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_euler_angles();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_EULER_ANGLES_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/euler_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/euler_python.h>\n#include <k3dsdk/python/mesh_python.h>\n\n#include <k3dsdk/euler_operations.h>\n#include <k3dsdk/types.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass euler\n{\npublic:\n};\n\nvoid define_namespace_euler()\n{\n\tscope outer = class_<euler>(\"euler\", no_init);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/euler_python.h",
    "content": "#ifndef K3DSDK_PYTHON_EULER_PYTHON_H\n#define K3DSDK_PYTHON_EULER_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_euler();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_EULER_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/file_signal_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/file_signal_python.h>\n\n#include <k3dsdk/log.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n//////////////////////////////////////////////////////////////////////////////\n// file_signal\n\nsigc::connection file_signal::connect_output_signal(const sigc::slot<void, const string_t&>& Slot)\n{\n\treturn signal.connect(Slot);\n}\n\nvoid write(file_signal& Self, const string_t& Output)\n{\n\tSelf.signal.emit(Output);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// define_class_file_signal\n\nvoid define_class_file_signal()\n{\n\tclass_<file_signal>(\"file_signal\", \"Converts file output to a C++ signal.\", no_init)\n\t\t.def(\"write\", &write)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/file_signal_python.h",
    "content": "#ifndef K3DSDK_PYTHON_FILE_SIGNAL_PYTHON_H\n#define K3DSDK_PYTHON_FILE_SIGNAL_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n/// Helper class that converts Python output to a signal.  Mainly useful when\n/// redirecting Python stdout and stderr to interactive dialogs.\nclass file_signal\n{\npublic:\n\t/// Connects a slot to a signal that will be called with Python output\n\tsigc::connection connect_output_signal(const sigc::slot<void, const string_t&>& Slot);\n\nprivate:\n\tfriend void write(file_signal&, const string_t&);\n\tsigc::signal<void, const string_t&> signal;\n};\n\nvoid define_class_file_signal();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_FILE_SIGNAL_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/filesystem_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/filesystem_python.h>\n\n#include <k3dsdk/path.h>\n#include <k3dsdk/types.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nconst k3d::string_t root_name(const k3d::filesystem::path& Self)\n{\n\treturn Self.root_name().raw();\n}\n\nconst k3d::string_t root_directory(const k3d::filesystem::path& Self)\n{\n\treturn Self.root_directory().raw();\n}\n\nconst k3d::string_t leaf(const k3d::filesystem::path& Self)\n{\n\treturn Self.leaf().raw();\n}\n\nconst k3d::string_t path_string(const k3d::filesystem::path& Self)\n{\n\treturn Self.native_filesystem_string();\n}\n\nclass filesystem\n{\npublic:\n\tstatic const k3d::filesystem::path generic_path(const k3d::string_t& GenericPath)\n\t{\n\t\treturn k3d::filesystem::generic_path(GenericPath);\n\t}\n\n\tstatic const k3d::filesystem::path native_path(const k3d::string_t& NativePath)\n\t{\n\t\treturn k3d::filesystem::native_path(k3d::ustring::from_utf8(NativePath));\n\t}\n};\n\nvoid define_namespace_filesystem()\n{\n\tscope outer = class_<filesystem>(\"filesystem\", no_init)\n\t\t.def(\"generic_path\", filesystem::generic_path)\n\t\t.staticmethod(\"generic_path\")\n\t\t.def(\"native_path\", filesystem::native_path)\n\t\t.staticmethod(\"native_path\")\n\t\t;\n\n\tclass_<k3d::filesystem::path>(\"path\",\n\t\t\"Stores a filesystem path\")\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self / self)\n\t\t.def(\"root_path\", &k3d::filesystem::path::root_path)\n\t\t.def(\"root_name\", root_name)\n\t\t.def(\"root_directory\", root_directory)\n\t\t.def(\"leaf\", leaf)\n\t\t.def(\"branch_path\", &k3d::filesystem::path::branch_path)\n\t\t.def(\"empty\", &k3d::filesystem::path::empty)\n\t\t.def(\"is_complete\", &k3d::filesystem::path::is_complete)\n\t\t.def(\"__str__\", path_string)\n\t\t;\n\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/filesystem_python.h",
    "content": "#ifndef K3DSDK_PYTHON_FILESYSTEM_PYTHON_H\n#define K3DSDK_PYTHON_FILESYSTEM_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_filesystem();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_FILESYSTEM_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/geometry_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/python/geometry_python.h>\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/selection_python.h>\n\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/geometry.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// geometry \n\nclass geometry\n{\npublic:\n\tclass point_selection\n\t{\n\tpublic:\n\t\tclass const_storage\n\t\t{\n\t\tpublic:\n\t\t\ttypedef owned_instance_wrapper<k3d::geometry::point_selection::const_storage> wrapper;\n\n\t\t\tstatic object index_begin(wrapper& Self) { return wrap(Self.wrapped().index_begin); }\n\t\t\tstatic object index_end(wrapper& Self) { return wrap(Self.wrapped().index_end); }\n\t\t\tstatic object weight(wrapper& Self) { return wrap(Self.wrapped().weight); }\n\t\t};\n\n\t\tclass storage\n\t\t{\n\t\tpublic:\n\t\t\ttypedef owned_instance_wrapper<k3d::geometry::point_selection::storage> wrapper;\n\n\t\t\tstatic object index_begin(wrapper& Self) { return wrap(Self.wrapped().index_begin); }\n\t\t\tstatic object index_end(wrapper& Self) { return wrap(Self.wrapped().index_end); }\n\t\t\tstatic object weight(wrapper& Self) { return wrap(Self.wrapped().weight); }\n\t\t};\n\n\t\tstatic object create1(k3d::selection::set& Set)\n\t\t{\n\t\t\treturn wrap_owned(k3d::geometry::point_selection::create(Set));\n\t\t}\n\n\t\tstatic object create2(k3d::selection::set& Set, const double_t Weight)\n\t\t{\n\t\t\treturn wrap_owned(k3d::geometry::point_selection::create(Set, Weight));\n\t\t}\n\n\t\tstatic object validate(selection_storage_wrapper& Storage)\n\t\t{\n\t\t\treturn wrap_owned(k3d::geometry::point_selection::validate(Storage.wrapped()));\n\t\t}\n\n\t\tstatic void append1(storage::wrapper& Storage, const double_t Weight)\n\t\t{\n\t\t\tk3d::geometry::point_selection::append(Storage.wrapped(), Weight);\n\t\t}\n\n\t\tstatic void append2(storage::wrapper& Storage, const uint_t Begin, const uint_t End, const double_t Weight)\n\t\t{\n\t\t\tk3d::geometry::point_selection::append(Storage.wrapped(), Begin, End, Weight);\n\t\t}\n\n\t\tstatic void merge(const_storage::wrapper& Storage, mesh_wrapper& Mesh)\n\t\t{\n\t\t\tk3d::geometry::point_selection::merge(Storage.wrapped(), Mesh.wrapped());\n\t\t}\n\t};\n\n\tclass primitive_selection\n\t{\n\tpublic:\n\t\tclass const_storage\n\t\t{\n\t\tpublic:\n\t\t\ttypedef owned_instance_wrapper<k3d::geometry::primitive_selection::const_storage> wrapper;\n\n\t\t\tstatic object primitive_begin(wrapper& Self) { return wrap(Self.wrapped().primitive_begin); }\n\t\t\tstatic object primitive_end(wrapper& Self) { return wrap(Self.wrapped().primitive_end); }\n\t\t\tstatic object primitive_selection_type(wrapper& Self) { return wrap(Self.wrapped().primitive_selection_type); }\n\t\t\tstatic object primitive_first_range(wrapper& Self) { return wrap(Self.wrapped().primitive_first_range); }\n\t\t\tstatic object primitive_range_count(wrapper& Self) { return wrap(Self.wrapped().primitive_range_count); }\n\t\t\tstatic object index_begin(wrapper& Self) { return wrap(Self.wrapped().index_begin); }\n\t\t\tstatic object index_end(wrapper& Self) { return wrap(Self.wrapped().index_end); }\n\t\t\tstatic object weight(wrapper& Self) { return wrap(Self.wrapped().weight); }\n\t\t};\n\n\t\tclass storage\n\t\t{\n\t\tpublic:\n\t\t\ttypedef owned_instance_wrapper<k3d::geometry::primitive_selection::storage> wrapper;\n\n\t\t\tstatic object primitive_begin(wrapper& Self) { return wrap(Self.wrapped().primitive_begin); }\n\t\t\tstatic object primitive_end(wrapper& Self) { return wrap(Self.wrapped().primitive_end); }\n\t\t\tstatic object primitive_selection_type(wrapper& Self) { return wrap(Self.wrapped().primitive_selection_type); }\n\t\t\tstatic object primitive_first_range(wrapper& Self) { return wrap(Self.wrapped().primitive_first_range); }\n\t\t\tstatic object primitive_range_count(wrapper& Self) { return wrap(Self.wrapped().primitive_range_count); }\n\t\t\tstatic object index_begin(wrapper& Self) { return wrap(Self.wrapped().index_begin); }\n\t\t\tstatic object index_end(wrapper& Self) { return wrap(Self.wrapped().index_end); }\n\t\t\tstatic object weight(wrapper& Self) { return wrap(Self.wrapped().weight); }\n\t\t};\n\n\t\tstatic object create1(k3d::selection::set& Set)\n\t\t{\n\t\t\treturn wrap_owned(k3d::geometry::primitive_selection::create(Set));\n\t\t}\n\n\t\tstatic object create2(k3d::selection::set& Set, const k3d::selection::type SelectionType)\n\t\t{\n\t\t\treturn wrap_owned(k3d::geometry::primitive_selection::create(Set, SelectionType));\n\t\t}\n\n\t\tstatic object create3(k3d::selection::set& Set, const uint_t PrimitiveBegin, const uint_t PrimitiveEnd, const k3d::selection::type SelectionType)\n\t\t{\n\t\t\treturn wrap_owned(k3d::geometry::primitive_selection::create(Set, PrimitiveBegin, PrimitiveEnd, SelectionType));\n\t\t}\n\n\t\tstatic object validate(selection_storage_wrapper& Storage)\n\t\t{\n\t\t\treturn wrap_owned(k3d::geometry::primitive_selection::validate(Storage.wrapped()));\n\t\t}\n\n\t\tstatic void append1(storage::wrapper& Storage, const uint_t PrimitiveBegin, const uint_t PrimitiveEnd, const k3d::selection::type SelectionType, const uint_t Begin, const uint_t End, const double_t Weight)\n\t\t{\n\t\t\tk3d::geometry::primitive_selection::append(Storage.wrapped(), PrimitiveBegin, PrimitiveEnd, SelectionType, Begin, End, Weight);\n\t\t}\n\n\t\tstatic void append2(storage::wrapper& Storage, const k3d::selection::type SelectionType, const uint_t Begin, const uint_t End, const double_t Weight)\n\t\t{\n\t\t\tk3d::geometry::primitive_selection::append(Storage.wrapped(), SelectionType, Begin, End, Weight);\n\t\t}\n\n\t\tstatic void append3(storage::wrapper& Storage, const k3d::selection::type SelectionType, const double_t Weight)\n\t\t{\n\t\t\tk3d::geometry::primitive_selection::append(Storage.wrapped(), SelectionType, Weight);\n\t\t}\n\n\t\tstatic void append4(storage::wrapper& Storage, const uint_t Begin, const uint_t End, const double_t Weight)\n\t\t{\n\t\t\tk3d::geometry::primitive_selection::append(Storage.wrapped(), Begin, End, Weight);\n\t\t}\n\n\t\tstatic void append5(storage::wrapper& Storage, const double_t Weight)\n\t\t{\n\t\t\tk3d::geometry::primitive_selection::append(Storage.wrapped(), Weight);\n\t\t}\n\n\t\tstatic void merge(const_storage::wrapper& Storage, mesh_wrapper& Mesh)\n\t\t{\n\t\t\tk3d::geometry::primitive_selection::merge(Storage.wrapped(), Mesh.wrapped());\n\t\t}\n\t};\n\n\tclass selection\n\t{\n\tpublic:\n\t};\n};\n\nvoid define_namespace_geometry()\n{\n\tscope outer = class_<geometry>(\"geometry\", no_init)\n\t\t;\n\n\t{\n\t\tscope inner = class_<geometry::point_selection>(\"point_selection\", no_init)\n\t\t\t.def(\"create\", &geometry::point_selection::create1)\n\t\t\t.def(\"create\", &geometry::point_selection::create2)\n\t\t\t.staticmethod(\"create\")\n\t\t\t.def(\"validate\", &geometry::point_selection::validate)\n\t\t\t.staticmethod(\"validate\")\n\t\t\t.def(\"append\", &geometry::point_selection::append1)\n\t\t\t.def(\"append\", &geometry::point_selection::append2)\n\t\t\t.staticmethod(\"append\")\n\t\t\t.def(\"merge\", &geometry::point_selection::merge)\n\t\t\t.staticmethod(\"merge\")\n\t\t\t;\n\n\t\tclass_<geometry::point_selection::const_storage::wrapper>(\"const_storage\", no_init)\n\t\t\t.def(\"index_begin\", &geometry::point_selection::const_storage::index_begin)\n\t\t\t.def(\"index_end\", &geometry::point_selection::const_storage::index_end)\n\t\t\t.def(\"weight\", &geometry::point_selection::const_storage::weight)\n\t\t\t;\n\n\t\tclass_<geometry::point_selection::storage::wrapper>(\"storage\", no_init)\n\t\t\t.def(\"index_begin\", &geometry::point_selection::storage::index_begin)\n\t\t\t.def(\"index_end\", &geometry::point_selection::storage::index_end)\n\t\t\t.def(\"weight\", &geometry::point_selection::storage::weight)\n\t\t\t;\n\t}\n\n\t{\n\t\tscope inner = class_<geometry::primitive_selection>(\"primitive_selection\", no_init)\n\t\t\t.def(\"create\", &geometry::primitive_selection::create1)\n\t\t\t.def(\"create\", &geometry::primitive_selection::create2)\n\t\t\t.staticmethod(\"create\")\n\t\t\t.def(\"validate\", &geometry::primitive_selection::validate)\n\t\t\t.staticmethod(\"validate\")\n\t\t\t.def(\"append\", &geometry::primitive_selection::append1)\n\t\t\t.def(\"append\", &geometry::primitive_selection::append2)\n\t\t\t.def(\"append\", &geometry::primitive_selection::append3)\n\t\t\t.def(\"append\", &geometry::primitive_selection::append4)\n\t\t\t.def(\"append\", &geometry::primitive_selection::append5)\n\t\t\t.staticmethod(\"append\")\n\t\t\t.def(\"merge\", &geometry::primitive_selection::merge)\n\t\t\t.staticmethod(\"merge\")\n\t\t\t;\n\n\t\tclass_<geometry::primitive_selection::const_storage::wrapper>(\"const_storage\", no_init)\n\t\t\t.def(\"primitive_begin\", &geometry::primitive_selection::const_storage::primitive_begin)\n\t\t\t.def(\"primitive_end\", &geometry::primitive_selection::const_storage::primitive_end)\n\t\t\t.def(\"primitive_selection_type\", &geometry::primitive_selection::const_storage::primitive_selection_type)\n\t\t\t.def(\"primitive_first_range\", &geometry::primitive_selection::const_storage::primitive_first_range)\n\t\t\t.def(\"primitive_range_count\", &geometry::primitive_selection::const_storage::primitive_range_count)\n\t\t\t.def(\"index_begin\", &geometry::primitive_selection::const_storage::index_begin)\n\t\t\t.def(\"index_end\", &geometry::primitive_selection::const_storage::index_end)\n\t\t\t.def(\"weight\", &geometry::primitive_selection::const_storage::weight)\n\t\t\t;\n\n\t\tclass_<geometry::primitive_selection::storage::wrapper>(\"storage\", no_init)\n\t\t\t.def(\"primitive_begin\", &geometry::primitive_selection::storage::primitive_begin)\n\t\t\t.def(\"primitive_end\", &geometry::primitive_selection::storage::primitive_end)\n\t\t\t.def(\"primitive_selection_type\", &geometry::primitive_selection::storage::primitive_selection_type)\n\t\t\t.def(\"primitive_first_range\", &geometry::primitive_selection::storage::primitive_first_range)\n\t\t\t.def(\"primitive_range_count\", &geometry::primitive_selection::storage::primitive_range_count)\n\t\t\t.def(\"index_begin\", &geometry::primitive_selection::storage::index_begin)\n\t\t\t.def(\"index_end\", &geometry::primitive_selection::storage::index_end)\n\t\t\t.def(\"weight\", &geometry::primitive_selection::storage::weight)\n\t\t\t;\n\t}\n\n\t{\n\t\tscope inner = class_<geometry::selection>(\"selection\", no_init)\n\t\t\t.def(\"create\", &k3d::geometry::selection::create)\n\t\t\t.staticmethod(\"create\")\n\t\t\t;\n\t}\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/geometry_python.h",
    "content": "#ifndef K3DSDK_PYTHON_GEOMETRY_PYTHON_H\n#define K3DSDK_PYTHON_GEOMETRY_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_geometry();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_GEOMETRY_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/hyperboloid_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/hyperboloid_python.h>\n\n#include <k3dsdk/hyperboloid.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass hyperboloid\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::hyperboloid::const_primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object start_points(wrapper& Self) { return wrap(Self.wrapped().start_points); }\n\t\tstatic object end_points(wrapper& Self) { return wrap(Self.wrapped().end_points); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::hyperboloid::primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object start_points(wrapper& Self) { return wrap(Self.wrapped().start_points); }\n\t\tstatic object end_points(wrapper& Self) { return wrap(Self.wrapped().end_points); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::hyperboloid::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::hyperboloid::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::hyperboloid::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_hyperboloid()\n{\n\tscope outer = class_<hyperboloid>(\"hyperboloid\", no_init)\n\t\t.def(\"create\", &hyperboloid::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &hyperboloid::validate)\n\t\t.def(\"validate\", &hyperboloid::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<hyperboloid::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"matrices\", &hyperboloid::const_primitive::matrices)\n\t\t.def(\"materials\", &hyperboloid::const_primitive::materials)\n\t\t.def(\"start_points\", &hyperboloid::const_primitive::start_points)\n\t\t.def(\"end_points\", &hyperboloid::const_primitive::end_points)\n\t\t.def(\"sweep_angles\", &hyperboloid::const_primitive::sweep_angles)\n\t\t.def(\"selections\", &hyperboloid::const_primitive::selections)\n\t\t.def(\"constant_attributes\", &hyperboloid::const_primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &hyperboloid::const_primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &hyperboloid::const_primitive::parameter_attributes)\n\t\t;\n\n\tclass_<hyperboloid::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"matrices\", &hyperboloid::primitive::matrices)\n\t\t.def(\"materials\", &hyperboloid::primitive::materials)\n\t\t.def(\"start_points\", &hyperboloid::primitive::start_points)\n\t\t.def(\"end_points\", &hyperboloid::primitive::end_points)\n\t\t.def(\"sweep_angles\", &hyperboloid::primitive::sweep_angles)\n\t\t.def(\"selections\", &hyperboloid::primitive::selections)\n\t\t.def(\"constant_attributes\", &hyperboloid::primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &hyperboloid::primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &hyperboloid::primitive::parameter_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/hyperboloid_python.h",
    "content": "#ifndef K3DSDK_PYTHON_HYPERBOLOID_PYTHON_H\n#define K3DSDK_PYTHON_HYPERBOLOID_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_hyperboloid();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_HYPERBOLOID_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/idocument_exporter_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/idocument_exporter_python.h>\n#include <k3dsdk/python/idocument_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/idocument_exporter.h>\n#include <k3dsdk/path.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n// idocument_exporter\n\nstatic bool_t write_file(iunknown_wrapper& Self, idocument_wrapper& Document, const filesystem::path& Path)\n{\n\treturn Self.wrapped<k3d::idocument_exporter>().write_file(Document.wrapped(), Path);\n}\n\nvoid define_methods_idocument_exporter(iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::idocument_exporter*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(make_function(write_file), \"write_file\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/idocument_exporter_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IDOCUMENT_EXPORTER_PYTHON_H\n#define K3DSDK_PYTHON_IDOCUMENT_EXPORTER_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_idocument_exporter(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IDOCUMENT_EXPORTER_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/idocument_importer_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/idocument_importer_python.h>\n#include <k3dsdk/python/idocument_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/path.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n// idocument_importer\n\nstatic void get_file_metadata(iunknown_wrapper& Self, const filesystem::path& Path)\n{\n\tSelf.wrapped<k3d::idocument_importer>().get_file_metadata(Path);\n}\n\nstatic bool_t read_file(iunknown_wrapper& Self, const filesystem::path& Path, idocument_wrapper& Document)\n{\n\treturn Self.wrapped<k3d::idocument_importer>().read_file(Path, Document.wrapped());\n}\n\nvoid define_methods_idocument_importer(iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::idocument_importer*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(make_function(read_file), \"read_file\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/idocument_importer_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IDOCUMENT_IMPORTER_PYTHON_H\n#define K3DSDK_PYTHON_IDOCUMENT_IMPORTER_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_idocument_importer(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IDOCUMENT_IMPORTER_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/idocument_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/idocument_python.h>\n#include <k3dsdk/python/iproperty_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n\n#include <k3dsdk/classes.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/idocument_exporter.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iplugin_factory_collection.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/utility_gl.h>\n\nusing namespace boost::python;\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic const bool save(idocument_wrapper& Self, const string_t& Path)\n{\n\tboost::scoped_ptr<k3d::idocument_exporter> exporter(k3d::plugin::create<k3d::idocument_exporter>(k3d::classes::DocumentExporter()));\n\tif(!exporter)\n\t\tthrow std::runtime_error(\"no exporter plugin available\");\n\n\treturn exporter->write_file(Self.wrapped(), filesystem::native_path(ustring::from_utf8(Path)));\n}\n\nstatic void start_change_set(idocument_wrapper& Self)\n{\n\tk3d::start_state_change_set(Self.wrapped(), K3D_CHANGE_SET_CONTEXT);\n}\n\nstatic void cancel_change_set(idocument_wrapper& Self)\n{\n\tk3d::cancel_state_change_set(Self.wrapped(), K3D_CHANGE_SET_CONTEXT);\n}\n\nstatic void finish_change_set(idocument_wrapper& Self, const string_t& Label)\n{\n\tk3d::finish_state_change_set(Self.wrapped(), Label, K3D_CHANGE_SET_CONTEXT);\n}\n\nstatic void redraw_all(idocument_wrapper& Self)\n{\n\tk3d::gl::redraw_all(Self.wrapped(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n}\n\nstatic void delete_node(idocument_wrapper& Self, object& Node)\n{\n\textract<iunknown_wrapper> node(Node);\n\tif(!node.check())\n\t\tthrow std::invalid_argument(\"argument isn't a node\");\n\n\tk3d::delete_nodes(Self.wrapped(), k3d::make_collection<k3d::nodes_t>(node().wrapped_ptr<k3d::inode>()));\n}\n\nvoid define_class_idocument()\n{\n\tclass_<idocument_wrapper>(\"idocument\")\n\t\t.def(\"save\", &save)\n\t\t.def(\"start_change_set\", &start_change_set)\n\t\t.def(\"cancel_change_set\", &cancel_change_set)\n\t\t.def(\"finish_change_set\", &finish_change_set)\n\t\t.def(\"redraw_all\", &redraw_all)\n\t\t.def(\"delete_node\", &delete_node)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/idocument_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IDOCUMENT_PYTHON_H\n#define K3DSDK_PYTHON_IDOCUMENT_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/idocument.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<k3d::idocument> idocument_wrapper;\n\nvoid define_class_idocument();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IDOCUMENT_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/ifile_change_notifier_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/ifile_change_notifier_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/ifile_change_notifier.h>\n#include <k3dsdk/path.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n// file_change_receiver\n\nclass file_change_receiver\n{\npublic:\n\tvoid file_changed(const filesystem::path& Path)\n\t{\n\t\tchanged_files.push_back(Path);\n\t}\n\n\tboost::python::list changed()\n\t{\n\t\tboost::python::list result;\n\t\tfor(k3d::uint_t i = 0; i != changed_files.size(); ++i)\n\t\t\tresult.append(changed_files[i]);\n\t\treturn result;\n\t}\n\n\tvoid clear()\n\t{\n\t\tchanged_files.clear();\n\t}\n\nprivate:\n\tstd::vector<filesystem::path> changed_files;\n};\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n// ifile_change_notifier\n\nstatic uint_t watch_file(iunknown_wrapper& Self, const filesystem::path& Path, file_change_receiver& Receiver)\n{\n\treturn Self.wrapped<k3d::ifile_change_notifier>().watch_file(Path, sigc::bind(sigc::mem_fun(Receiver, &file_change_receiver::file_changed), Path));\n}\n\nstatic void unwatch_file(iunknown_wrapper& Self, const uint_t WatchID)\n{\n\tSelf.wrapped<k3d::ifile_change_notifier>().unwatch_file(WatchID);\n}\n\nstatic void wait_for_changes(iunknown_wrapper& Self)\n{\n\tSelf.wrapped<k3d::ifile_change_notifier>().wait_for_changes();\n}\n\nstatic uint_t change_count(iunknown_wrapper& Self)\n{\n\treturn Self.wrapped<k3d::ifile_change_notifier>().change_count();\n}\n\nstatic void signal_change(iunknown_wrapper& Self)\n{\n\tSelf.wrapped<k3d::ifile_change_notifier>().signal_change();\n}\n\nvoid define_class_file_change_receiver()\n{\n\tclass_<file_change_receiver>(\"file_change_receiver\",\n\t\t\"Helper class that caches file-change notifications for later retrieval.\")\n\t\t.def(\"changed\", &file_change_receiver::changed,\n\t\t\t\"Retrieves the list of files that have changed.\")\n\t\t.def(\"clear\", &file_change_receiver::clear,\n\t\t\t\"Clears the list of files that have changed.\")\n\t\t;\n}\n\nvoid define_methods_ifile_change_notifier(k3d::iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::ifile_change_notifier*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&watch_file, \"Watch a file for changes.\\n\\n\" \"@rtype: integer watch identifier\\n\"), \"watch_file\", Instance);\n\tutility::add_method(utility::make_function(&unwatch_file, \"Stops watching a file for changes.\"), \"unwatch_file\", Instance);\n\tutility::add_method(utility::make_function(&wait_for_changes, \"Blocks indefinitely until at least one file change has been received.\"), \"wait_for_changes\", Instance);\n\tutility::add_method(utility::make_function(&change_count, \"Returns the number of file changes that are pending, ready to be signalled.  This method never blocks.\"), \"change_count\", Instance);\n\tutility::add_method(utility::make_function(&signal_change, \"Signals the next file change that is pending, if any.  This method never blocks.\"), \"signal_change\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/ifile_change_notifier_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IFILE_CHANGE_NOTIFIER_PYTHON_H\n#define K3DSDK_PYTHON_IFILE_CHANGE_NOTIFIER_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_class_file_change_receiver();\nvoid define_methods_ifile_change_notifier(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IFILE_CHANGE_NOTIFIER_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/ikeyframer_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/any_python.h>\n#include <k3dsdk/python/iproperty_collection_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/ikeyframer.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic void keyframe(iunknown_wrapper& Self)\n{\n\tSelf.wrapped<k3d::ikeyframer>().keyframe();\n}\n\nstatic void delete_key(iunknown_wrapper& Self, iunknown_wrapper& TimeProperty)\n{\n\tk3d::iproperty* property = TimeProperty.wrapped_ptr<iproperty>();\n\tSelf.wrapped<k3d::ikeyframer>().delete_key(property);\n}\n\nstatic object input_property(iunknown_wrapper& Self)\n{\n\treturn wrap_unknown(Self.wrapped<k3d::ikeyframer>().input_property());\n}\n\nstatic list get_keys(iunknown_wrapper& Self)\n{\n\tlist results;\n\tconst k3d::ikeyframer::keys_t keys = Self.wrapped<k3d::ikeyframer>().get_keys();\n\tfor(k3d::ikeyframer::keys_t::const_iterator key = keys.begin(); key != keys.end(); ++key)\n\t\tresults.append(wrap_unknown(*key));\n\treturn results;\n}\n\nvoid define_methods_ikeyframer(iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::ikeyframer*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&keyframe,\n\t\t\"Set a keyframe. Inputs are implementation-dependent, and may come from properties.\"), \"keyframe\", Instance);\n\tutility::add_method(utility::make_function(&delete_key,\n\t\t\"Delete the keyframe referenced by the given time property.\"), \"delete_key\", Instance);\n\tutility::add_method(utility::make_function(&input_property,\n\t\t\"Get the property used to input the key values.\\n\\n\"\n\t\t\"@rtype: L{iproperty}\\n\"\n\t\t\"@return: The input property.\\n\\n\"), \"input_property\", Instance);\n\tutility::add_method(utility::make_function(&get_keys,\n\t\t\"Returns a list with all the time properties for the keyframes.\"), \"get_keys\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/ikeyframer_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IKEYFRAMER_PYTHON_H\n#define K3DSDK_PYTHON_IKEYFRAMER_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_ikeyframer(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IKEYFRAMER_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/imesh_storage_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/imesh_storage_python.h>\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/imesh_storage.h>\n#include <k3dsdk/mesh.h>\n\nusing namespace boost::python;\n\nnamespace k3d \n{\n\nnamespace python\n{\n\nstatic object create_mesh(iunknown_wrapper& Self)\n{\n\tk3d::mesh* const mesh = new k3d::mesh();\n\tSelf.wrapped<k3d::imesh_storage>().reset_mesh(mesh);\n\n\treturn wrap(mesh);\n}\n\nstatic object set_mesh(iunknown_wrapper& Self, mesh_wrapper& Mesh)\n{\n\tk3d::mesh* const mesh = new k3d::mesh(Mesh.wrapped());\n\tSelf.wrapped<k3d::imesh_storage>().reset_mesh(mesh);\n\n\treturn wrap(mesh);\n}\n\nstatic void clear_mesh(iunknown_wrapper& Self)\n{\n\tSelf.wrapped<k3d::imesh_storage>().reset_mesh(0);\n}\n\nvoid define_methods_imesh_storage(iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::imesh_storage*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&create_mesh,\n\t\t\"Creates a new L{mesh} object whose lifetime will be managed by the imesh_storage object.\\n\\n\"\n\t\t\"@return: Returns a new L{mesh} object.\"), \"create_mesh\", Instance);\n\tutility::add_method(utility::make_function(&set_mesh,\n\t\t\"Assigns a shallow-copy of an existing L{mesh} object whose lifetime will be managed by the imesh_storage object.\\n\\n\"\n\t\t\"@return: Returns the copied L{mesh} object.\"), \"set_mesh\", Instance);\n\tutility::add_method(utility::make_function(&clear_mesh,\n\t\t\"Deletes the stored mesh and resets the storage to a null mesh.\"), \"clear_mesh\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/imesh_storage_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IMESH_STORAGE_PYTHON_H\n#define K3DSDK_PYTHON_IMESH_STORAGE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_imesh_storage(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IMESH_STORAGE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/imeta_object_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/imeta_object.h>\n#include <k3dsdk/python/any_python.h>\n#include <k3dsdk/python/imeta_object_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic boost::python::object execute(iunknown_wrapper& Self, const string_t& Command)\n{\n\treturn any_to_python(Self.wrapped<k3d::imeta_object>().execute(Command));\n}\n\n/*\nstatic boost::python::object execute1(iunknown_wrapper& Self, const string_t& Command, const boost::python::object& Argument1)\n{\n\treturn any_to_python(Self.wrapped<k3d::imeta_object>().execute(Command, python_to_any(Argument1)));\n}\n\nstatic boost::python::object execute2(iunknown_wrapper& Self, const string_t& Command, const boost::python::object& Argument1, const boost::python::object& Argument2)\n{\n\treturn any_to_python(Self.wrapped<k3d::imeta_object>().execute(Command, python_to_any(Argument1), python_to_any(Argument2)));\n}\n\nstatic boost::python::object execute3(iunknown_wrapper& Self, const string_t& Command, const boost::python::object& Argument1, const boost::python::object& Argument2, const boost::python::object& Argument3)\n{\n\treturn any_to_python(Self.wrapped<k3d::imeta_object>().execute(Command, python_to_any(Argument1), python_to_any(Argument2), python_to_any(Argument3)));\n}\n*/\n\nvoid define_methods_imeta_object(k3d::iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::imeta_object*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&execute, \"Executes an object method.\"), \"execute\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/imeta_object_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IMETA_OBJECT_PYTHON_H\n#define K3DSDK_PYTHON_IMETA_OBJECT_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_imeta_object(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IMETA_OBJECT_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/imetadata_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/imetadata_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/imetadata.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic void set_metadata_value(iunknown_wrapper& Self, const string_t& Name, const string_t& Value)\n{\n\tSelf.wrapped<k3d::imetadata>().set_metadata_value(Name, Value);\n}\n\nstatic boost::python::dict get_metadata(iunknown_wrapper& Self)\n{\n\tboost::python::dict result;\n\n\tconst imetadata::metadata_t metadata = Self.wrapped<k3d::imetadata>().get_metadata();\n\tfor(imetadata::metadata_t::const_iterator pair = metadata.begin(); pair != metadata.end(); ++pair)\n\t\tresult[pair->first] = pair->second;\n\n\treturn result;\n}\n\nstatic string_t get_metadata_value(iunknown_wrapper& Self, const string_t& Name)\n{\n\treturn Self.wrapped<k3d::imetadata>().get_metadata_value(Name);\n}\n\nstatic void erase_metadata_value(iunknown_wrapper& Self, const string_t& Name)\n{\n\tSelf.wrapped<k3d::imetadata>().erase_metadata_value(Name);\n}\n\nvoid define_methods_imetadata(iunknown& Interface, boost::python::object& Instance)\n{\n\tutility::add_method(utility::make_function(&set_metadata_value), \"set_metadata_value\", Instance);\n\tutility::add_method(utility::make_function(&get_metadata), \"get_metadata\", Instance);\n\tutility::add_method(utility::make_function(&get_metadata_value), \"get_metadata_value\", Instance);\n\tutility::add_method(utility::make_function(&erase_metadata_value), \"erase_metadata_value\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/imetadata_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IMETADATA_PYTHON_H\n#define K3DSDK_PYTHON_IMETADATA_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_imetadata(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IMETADATA_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/inode_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/idocument_python.h>\n#include <k3dsdk/python/inode_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iplugin_factory.h>\n\nusing namespace boost::python;\n\nnamespace k3d \n{\n\nnamespace python\n{\n\nstatic object document(iunknown_wrapper& Self)\n{\n\treturn wrap(Self.wrapped<k3d::inode>().document());\n}\n\nstatic object factory(iunknown_wrapper& Self)\n{\n\treturn wrap_unknown(Self.wrapped<k3d::inode>().factory());\n}\n\nstatic boost::uint64_t hash(iunknown_wrapper& Self)\n{\n\treturn reinterpret_cast<boost::uint64_t>(Self.wrapped_ptr());\n}\n\nvoid define_methods_inode(iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::inode*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&document, \"Returns the L{idocument} that owns this node.\"), \"document\", Instance);\n\tutility::add_method(utility::make_function(&factory, \"Returns the plugin factory used to create this node type.\"), \"factory\", Instance);\n\tutility::add_method(utility::make_function(&hash, \"Returns a hash value that can be used as a key when storing inode objects in a map.\"), \"__hash__\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/inode_python.h",
    "content": "#ifndef K3DSDK_PYTHON_INODE_PYTHON_H\n#define K3DSDK_PYTHON_INODE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_inode(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_INODE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/inode_selection_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/any_python.h>\n#include <k3dsdk/python/inode_selection_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_selection.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic void select(iunknown_wrapper& Self, iunknown_wrapper& Node, const k3d::double_t Weight)\n{\n\tSelf.wrapped<k3d::inode_selection>().select(Node.wrapped<k3d::inode>(), Weight);\n}\n\nstatic double selection_weight(iunknown_wrapper& Self, iunknown_wrapper& Node)\n{\n\treturn Self.wrapped<k3d::inode_selection>().selection_weight(Node.wrapped<k3d::inode>());\n}\n\nstatic list selected_nodes(iunknown_wrapper& Self)\n{\n\tlist results;\n\t\n\tconst k3d::inode_selection::selected_nodes_t selected_nodes = Self.wrapped<k3d::inode_selection>().selected_nodes();\n\tfor(k3d::inode_selection::selected_nodes_t::const_iterator n = selected_nodes.begin(); n != selected_nodes.end(); ++n)\n\t\tresults.append(wrap_unknown(*n));\n\t\n\treturn results;\n}\n\nstatic void deselect_all(iunknown_wrapper& Self)\n{\n\tSelf.wrapped<k3d::inode_selection>().deselect_all();\n}\n\nvoid define_methods_inode_selection(iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::inode_selection*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&select,\n\t\t\"Select the supplied node with the given selection weight\\n\\n\"), \"select\", Instance);\n\tutility::add_method(utility::make_function(&selection_weight,\n\t\t\"Returns the selection weight of the supplied node.\\n\\n\"\n\t\t\"@rtype: double\\n\"), \"selection_weight\", Instance);\n\tutility::add_method(utility::make_function(&selected_nodes,\n\t\t\"Returns a list of selected nodes\\n\\n\"\n\t\t\"@return: A list of L{inode} objects.\\n\\n\"), \"selected_nodes\", Instance);\n\tutility::add_method(utility::make_function(&deselect_all,\n\t\t\"Clears the stored selection.\"), \"deselect_all\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n"
  },
  {
    "path": "k3dsdk/python/inode_selection_python.h",
    "content": "#ifndef K3DSDK_PYTHON_INODE_SELECTION_PYTHON_H\n#define K3DSDK_PYTHON_INODE_SELECTION_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_inode_selection(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_INODE_SELECTION_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/instance_wrapper_python.h",
    "content": "#ifndef K3DSDK_PYTHON_INSTANCE_WRAPPER_PYTHON_H\n#define K3DSDK_PYTHON_INSTANCE_WRAPPER_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\n#include <boost/python/object.hpp>\n#include <stdexcept>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n////////////////////////////////////////////////////////////////////////////////////\n// instance_wrapper\n\ntemplate<typename T>\nclass instance_wrapper\n{\npublic:\n\ttypedef T wrapped_type;\n\n\tinstance_wrapper() :\n\t\tm_wrapped(0)\n\t{\n\t}\n\n\tinstance_wrapper(T* Wrapped) :\n\t\tm_wrapped(Wrapped)\n\t{\n\t}\n\n\tinstance_wrapper(T& Wrapped) :\n\t\tm_wrapped(&Wrapped)\n\t{\n\t}\n\n\tfriend const bool operator==(const instance_wrapper& lhs, const instance_wrapper& rhs)\n\t{\n\t\treturn lhs.m_wrapped == rhs.m_wrapped;\n\t}\n\n\tT& wrapped() const\n\t{\n\t\tif(!m_wrapped)\n\t\t\tthrow std::runtime_error(\"wrapped interface is null\");\n\n\t\treturn *m_wrapped;\n\t}\n\n\ttemplate<typename Y>\n\tY& wrapped() const\n\t{\n\t\treturn dynamic_cast<Y&>(wrapped());\n\t}\n\n\tT* wrapped_ptr() const\n\t{\n\t\treturn m_wrapped;\n\t}\n\n\ttemplate<typename Y>\n\tY* wrapped_ptr() const\n\t{\n\t\treturn dynamic_cast<Y*>(wrapped_ptr());\n\t}\n\nprivate:\n\tT* m_wrapped;\n};\n\ntemplate<typename T>\nboost::python::object wrap(T* Wrapped)\n{\n\treturn Wrapped ? boost::python::object(instance_wrapper<T>(Wrapped)) : boost::python::object();\n}\n\ntemplate<typename T>\nboost::python::object wrap(T& Wrapped)\n{\n\treturn boost::python::object(instance_wrapper<T>(Wrapped));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_INSTANCE_WRAPPER_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/iplugin_factory_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/iplugin_factory_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/iapplication_plugin_factory.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/types.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic const k3d::uuid factory_id(iunknown_wrapper& Self)\n{\n\treturn Self.wrapped<k3d::iplugin_factory>().factory_id();\n}\n\nstatic const string_t name(iunknown_wrapper& Self)\n{\n\treturn Self.wrapped<k3d::iplugin_factory>().name();\n}\n\nstatic const string_t short_description(iunknown_wrapper& Self)\n{\n\treturn Self.wrapped<k3d::iplugin_factory>().short_description();\n}\n\nstatic const bool_t is_application_plugin(iunknown_wrapper& Self)\n{\n\treturn Self.wrapped_ptr<k3d::iapplication_plugin_factory>() ? true : false;\n}\n\nstatic const bool_t is_document_plugin(iunknown_wrapper& Self)\n{\n\treturn Self.wrapped_ptr<k3d::idocument_plugin_factory>() ? true : false;\n}\n\nstatic const list categories(iunknown_wrapper& Self)\n{\n\tlist results;\n\t\n\tconst k3d::iplugin_factory::categories_t& categories = Self.wrapped<k3d::iplugin_factory>().categories();\n\tfor(k3d::iplugin_factory::categories_t::const_iterator category = categories.begin(); category != categories.end(); ++category)\n\t\tresults.append(*category);\n\n\treturn results;\n}\n\nstatic const string_t quality(iunknown_wrapper& Self)\n{\n\tswitch(Self.wrapped<k3d::iplugin_factory>().quality())\n\t{\n\t\tcase k3d::iplugin_factory::STABLE:\n\t\t\treturn \"stable\";\n\t\tcase k3d::iplugin_factory::EXPERIMENTAL:\n\t\t\treturn \"experimental\";\n\t\tcase k3d::iplugin_factory::DEPRECATED:\n\t\t\treturn \"deprecated\";\n\t}\n\n\tk3d::log() << warning << \"Unknown plugin factory quality enumeration\" << std::endl;\n\treturn \"unknown\";\n}\n\nstatic boost::python::dict metadata(iunknown_wrapper& Self)\n{\n\tboost::python::dict result;\n\n\tconst iplugin_factory::metadata_t metadata = Self.wrapped<k3d::iplugin_factory>().metadata();\n\tfor(iplugin_factory::metadata_t::const_iterator pair = metadata.begin(); pair != metadata.end(); ++pair)\n\t\tresult[pair->first] = pair->second;\n\n\treturn result;\n}\n\nvoid define_methods_iplugin_factory(iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::iplugin_factory*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&factory_id, \"Returns a universally-unique identifier for this factory.\"), \"factory_id\", Instance);\n\tutility::add_method(utility::make_function(&name, \"Returns the human-readable plugin name, which is displayed in the user interface and can be used to instantiate plugins.\"), \"name\", Instance);\n\tutility::add_method(utility::make_function(&short_description, \"Returns a short human-readable description of the plugin's purpose.\"), \"short_description\", Instance);\n\tutility::add_method(utility::make_function(&is_application_plugin, \"Returns true if the plugin is an application plugin.\"), \"is_application_plugin\", Instance);\n\tutility::add_method(utility::make_function(&is_document_plugin, \"Returns true if the plugin is a document plugin.\"), \"is_document_plugin\", Instance);\n\tutility::add_method(utility::make_function(&categories, \"Returns an arbitrary collection of human-readable categories used to organize the list of plugins in the user interface.\"), \"categories\", Instance);\n\tutility::add_method(utility::make_function(&quality, \"Returns the string \\\"stable\\\", \\\"experimental\\\", or \\\"deprecated\\\".\"), \"quality\", Instance);\n\tutility::add_method(utility::make_function(&metadata, \"Returns plugin metadata as a dict containing name-value pairs.\"), \"metadata\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/iplugin_factory_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IPLUGIN_FACTORY_PYTHON_H\n#define K3DSDK_PYTHON_IPLUGIN_FACTORY_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_iplugin_factory(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IPLUGIN_FACTORY_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/iproperty_collection_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/any_python.h>\n#include <k3dsdk/python/iproperty_collection_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/property_types.h>\n#include <k3dsdk/property_types_ri.h>\n#include <k3dsdk/type_registry.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic list properties(iunknown_wrapper& Self)\n{\n\tlist results;\n\tconst k3d::iproperty_collection::properties_t& properties = Self.wrapped<k3d::iproperty_collection>().properties();\n\tfor(k3d::iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\tresults.append(wrap_unknown(*property));\n\treturn results;\n}\n\nstatic object get_property(iunknown_wrapper& Self, const string_t& Name)\n{\n\treturn wrap_unknown(k3d::property::get(Self.wrapped<k3d::iproperty_collection>(), Name));\n}\n\nstatic bool has_property(iunknown_wrapper& Self, const string_t& Name)\n{\n\treturn k3d::property::get(Self.wrapped<k3d::iproperty_collection>(), Name) ? true : false;\n}\n\nvoid define_methods_iproperty_collection(iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::iproperty_collection*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&properties,\n\t\t\"Returns the set of all property.held within this collection.\\n\\n\"\n\t\t\"@return: A list of L{iproperty} objects.\"), \"properties\", Instance);\n\tutility::add_method(utility::make_function(&get_property,\n\t\t\"Returns a single property by name.\\n\\n\"\n\t\t\"@rtype: L{iproperty}\\n\"\n\t\t\"@return: The property object if it exists, or None.\"), \"get_property\", Instance);\n\tutility::add_method(utility::make_function(&has_property,\n\t\t\"True if the named property is registered\"), \"has_property\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/iproperty_collection_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IPROPERTY_COLLECTION_PYTHON_H\n#define K3DSDK_PYTHON_IPROPERTY_COLLECTION_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_iproperty_collection(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IPROPERTY_COLLECTION_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/iproperty_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/any_python.h>\n#include <k3dsdk/python/iproperty_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/ienumeration_property.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/imeasurement_property.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/type_registry.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic const string_t name(iunknown_wrapper& Self)\n{\n\treturn Self.wrapped<k3d::iproperty>().property_name();\n}\n\nstatic const string_t label(iunknown_wrapper& Self)\n{\n\treturn Self.wrapped<k3d::iproperty>().property_label();\n}\n\nstatic const string_t description(iunknown_wrapper& Self)\n{\n\treturn Self.wrapped<k3d::iproperty>().property_description();\n}\n\nstatic const string_t type(iunknown_wrapper& Self)\n{\n\treturn k3d::type_string(Self.wrapped<k3d::iproperty>().property_type());\n}\n\nstatic object internal_value(iunknown_wrapper& Self)\n{\n\treturn any_to_python(k3d::property::internal_value(Self.wrapped<k3d::iproperty>()));\n}\n\nstatic object pipeline_value(iunknown_wrapper& Self)\n{\n\treturn any_to_python(k3d::property::pipeline_value(Self.wrapped<k3d::iproperty>()));\n}\n\nstatic object node(iunknown_wrapper& Self)\n{\n\treturn any_to_python(Self.wrapped<k3d::iproperty>().property_node());\n}\n\nstatic const bool is_writable(iunknown_wrapper& Self)\n{\n\treturn Self.wrapped_ptr<k3d::iwritable_property>() ? true : false;\n}\n\nstatic void set_value(iunknown_wrapper& Self, const boost::python::object& Value)\n{\n\tif(k3d::iwritable_property* const writable = Self.wrapped_ptr<k3d::iwritable_property>())\n\t{\n\t\twritable->property_set_value(python_to_any(Value, Self.wrapped<k3d::iproperty>().property_type()));\n\t\treturn;\n\t}\n\n\tthrow std::runtime_error(\"property \" + Self.wrapped<k3d::iproperty>().property_name() + \" is a read-only property\");\n}\n\nstatic const bool is_enumeration(iunknown_wrapper& Self)\n{\n\treturn Self.wrapped_ptr<k3d::ienumeration_property>() ? true : false;\n}\n\nstatic list enumeration_values(iunknown_wrapper& Self)\n{\n\tlist results;\n\tif(k3d::ienumeration_property* const enumeration = Self.wrapped_ptr<k3d::ienumeration_property>())\n\t{\n\t\tconst k3d::ienumeration_property::enumeration_values_t values = enumeration->enumeration_values();\n\t\tfor(k3d::ienumeration_property::enumeration_values_t::const_iterator value = values.begin(); value != values.end(); ++value)\n\t\t\tresults.append(value->value);\n\t}\n\n\treturn results;\n}\n\nstatic const string_t units(iunknown_wrapper& Self)\n{\n\tif(k3d::imeasurement_property* const measurement = Self.wrapped_ptr<k3d::imeasurement_property>())\n\t{\n\t\tconst std::type_info& units = measurement->property_units();\n\n\t\tif(units == typeid(void))\n\t\t\treturn \"scalar\";\n\n\t\tif(units == typeid(k3d::measurement::angle))\n\t\t\treturn \"angle\";\n\n\t\tif(units == typeid(k3d::measurement::area))\n\t\t\treturn \"area\";\n\n\t\tif(units == typeid(k3d::measurement::distance))\n\t\t\treturn \"distance\";\n\n\t\tif(units == typeid(k3d::measurement::force))\n\t\t\treturn \"force\";\n\n\t\tif(units == typeid(k3d::measurement::mass))\n\t\t\treturn \"mass\";\n\n\t\tif(units == typeid(k3d::measurement::pressure))\n\t\t\treturn \"pressure\";\n\n\t\tif(units == typeid(k3d::measurement::time))\n\t\t\treturn \"time\";\n\n\t\tif(units == typeid(k3d::measurement::volume))\n\t\t\treturn \"volume\";\n\n\t\treturn \"unknown\";\n\t}\n\n\treturn \"\";\n}\n\nvoid define_methods_iproperty(iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<iproperty*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&name, \"Unique identifier, used for serialization and scripting.\"), \"name\", Instance);\n\tutility::add_method(utility::make_function(&label, \"Localized, human-readable text that labels the property in the user interface.\"), \"label\", Instance);\n\tutility::add_method(utility::make_function(&description, \"Localized, human-readable description of the property.\"), \"description\", Instance);\n\tutility::add_method(utility::make_function(&type, \"Returns the type of data the property stores as a string.\"), \"type\", Instance);\n\tutility::add_method(utility::make_function(&internal_value, \"Returns the value stored by the property.\"), \"internal_value\", Instance);\n\tutility::add_method(utility::make_function(&pipeline_value, \"Returns the property's 'pipeline' value, which will differ from its internal value if it's connected to another property by the Visualization Pipeline.\"), \"pipeline_value\", Instance);\n\tutility::add_method(utility::make_function(&node, \"Returns the node (if any) that owns the property, or None.\"), \"node\", Instance);\n\tutility::add_method(utility::make_function(&is_writable, \"Returns true if the property's internal value can be modified.\"), \"is_writable\", Instance);\n\tutility::add_method(utility::make_function(&set_value, \"Sets the property's internal value.\"), \"set_value\", Instance);\n\tutility::add_method(utility::make_function(&is_enumeration, \"Returns true if the property datatype is an enumeration.\"), \"is_enumeration\", Instance);\n\tutility::add_method(utility::make_function(&enumeration_values, \"Returns a list containing the set of allowable property values, if the property is an enumeration.\"), \"enumeration_value\", Instance);\n\tutility::add_method(utility::make_function(&units, \"Returns a string describing the real-world unit-of-measure stored by the property, if any.\"), \"units\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/iproperty_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IPROPERTY_PYTHON_H\n#define K3DSDK_PYTHON_IPROPERTY_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_iproperty(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IPROPERTY_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/irender_camera_frame_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/idocument_python.h>\n#include <k3dsdk/python/irender_camera_frame_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/path.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/iplugin_factory.h>\n\nusing namespace boost::python;\n\nnamespace k3d \n{\n\nnamespace python\n{\n\nstatic bool_t render_camera_frame(iunknown_wrapper& Self, iunknown_wrapper& Camera, const filesystem::path& OutputImage, const bool_t ViewCompletedImage)\n{\n\treturn Self.wrapped<k3d::irender_camera_frame>().render_camera_frame(Camera.wrapped<k3d::icamera>(), OutputImage, ViewCompletedImage);\n}\n\nvoid define_methods_irender_camera_frame(iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::irender_camera_frame*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&render_camera_frame, \"Renders an output image using the given camera and output path.\"), \"render_camera_frame\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/irender_camera_frame_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IRENDER_CAMERA_FRAME_PYTHON_H\n#define K3DSDK_PYTHON_IRENDER_CAMERA_FRAME_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_irender_camera_frame(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IRENDER_CAMERA_FRAME_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/irender_camera_preview_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/idocument_python.h>\n#include <k3dsdk/python/irender_camera_preview_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/path.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/irender_camera_preview.h>\n#include <k3dsdk/iplugin_factory.h>\n\nusing namespace boost::python;\n\nnamespace k3d \n{\n\nnamespace python\n{\n\nstatic bool_t render_camera_preview(iunknown_wrapper& Self, iunknown_wrapper& Camera)\n{\n\treturn Self.wrapped<k3d::irender_camera_preview>().render_camera_preview(Camera.wrapped<k3d::icamera>());\n}\n\nvoid define_methods_irender_camera_preview(iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::irender_camera_preview*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&render_camera_preview, \"Renders a preview image using the given camera.\"), \"render_camera_preview\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/irender_camera_preview_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IRENDER_CAMERA_PREVIEW_PYTHON_H\n#define K3DSDK_PYTHON_IRENDER_CAMERA_PREVIEW_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_irender_camera_preview(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IRENDER_CAMERA_PREVIEW_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/isnappable_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/isnappable_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/explicit_snap_source.h>\n#include <k3dsdk/explicit_snap_target.h>\n#include <k3dsdk/isnappable.h>\n#include <k3dsdk/result.h>\n\nusing namespace boost::python;\n\nnamespace k3d \n{\n\nnamespace python\n{\n\nstatic void add_snap_source(iunknown_wrapper& Self, const string_t& Label, const point3& Position)\n{\n\tSelf.wrapped<k3d::isnappable>().add_snap_source(new k3d::explicit_snap_source(Label, Position));\n}\n\nstatic void add_snap_target(iunknown_wrapper& Self, const string_t& Label, const point3& Position)\n{\n\tSelf.wrapped<k3d::isnappable>().add_snap_target(new k3d::explicit_snap_target(Label, Position));\n}\n\nvoid define_methods_isnappable(iunknown& Interface, boost::python::object& Instance)\n{\n\tutility::add_method(utility::make_function(&add_snap_source, \"Adds a new snap source to the object.\"), \"add_snap_source\", Instance);\n\tutility::add_method(utility::make_function(&add_snap_target, \"Adds a new snap target to the object.\"), \"add_snap_target\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/isnappable_python.h",
    "content": "#ifndef K3DSDK_PYTHON_ISNAPPABLE_PYTHON_H\n#define K3DSDK_PYTHON_ISNAPPABLE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_isnappable(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_ISNAPPABLE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/iunknown_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/any_python.h>\n#include <k3dsdk/python/offscreen_context_factory_gl_python.h>\n#include <k3dsdk/python/idocument_exporter_python.h>\n#include <k3dsdk/python/idocument_importer_python.h>\n#include <k3dsdk/python/ifile_change_notifier_python.h>\n#include <k3dsdk/python/ikeyframer_python.h>\n#include <k3dsdk/python/imesh_storage_python.h>\n#include <k3dsdk/python/imeta_object_python.h>\n#include <k3dsdk/python/imetadata_python.h>\n#include <k3dsdk/python/inode_python.h>\n#include <k3dsdk/python/inode_selection_python.h>\n#include <k3dsdk/python/iplugin_factory_python.h>\n#include <k3dsdk/python/iproperty_collection_python.h>\n#include <k3dsdk/python/iproperty_python.h>\n#include <k3dsdk/python/irender_camera_frame_python.h>\n#include <k3dsdk/python/irender_camera_preview_python.h>\n#include <k3dsdk/python/isnappable_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/iuser_interface_python.h>\n\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/types.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nobject wrap_unknown(iunknown* Unknown)\n{\n\treturn Unknown ? wrap_unknown(*Unknown) : object();\n}\n\nobject wrap_unknown(iunknown& Unknown)\n{\n\tobject result = object(iunknown_wrapper(Unknown));\n\n\tdefine_methods_imeta_object(Unknown, result);\n\tdefine_methods_offscreen_context_factory_gl(Unknown, result);\n\tdefine_methods_idocument_exporter(Unknown, result);\n\tdefine_methods_idocument_importer(Unknown, result);\n\tdefine_methods_ifile_change_notifier(Unknown, result);\n\tdefine_methods_ikeyframer(Unknown, result);\n\tdefine_methods_imesh_storage(Unknown, result);\n\tdefine_methods_imetadata(Unknown, result);\n\tdefine_methods_inode(Unknown, result);\n\tdefine_methods_inode_selection(Unknown, result);\n\tdefine_methods_iplugin_factory(Unknown, result);\n\tdefine_methods_iproperty(Unknown, result);\n\tdefine_methods_iproperty_collection(Unknown, result);\n\tdefine_methods_irender_camera_frame(Unknown, result);\n\tdefine_methods_irender_camera_preview(Unknown, result);\n\tdefine_methods_isnappable(Unknown, result);\n\tdefine_methods_iuser_interface(Unknown, result);\n\t\n\treturn result;\n}\n\n// This rightfully belongs with the rest of the iproperty_collection code, but for some reason __getattr__\n// doesn't seem to work with our dynamically-added instance methods.\nstatic object getattr(iunknown_wrapper& Self, const string_t& Name)\n{\n\t// Return K-3D properties as attributes whenever they're available ...\n\tif(k3d::iproperty_collection* const property_collection = Self.wrapped_ptr<k3d::iproperty_collection>())\n\t{\n\t\tif(k3d::iproperty* property = k3d::property::get(*property_collection, Name))\n\t\t\treturn any_to_python(k3d::property::pipeline_value(*property));\n\n\t\tthrow std::invalid_argument(\"unknown property: \" + Name);\n\t}\n\n\treturn object();\n}\n\n// This rightfully belongs with the rest of the iproperty_collection code, but for some reason __getattr__\n// doesn't seem to work with our dynamically-added instance methods.\nstatic void setattr(object& Self, const string_t& Name, const object& Value)\n{\n\t// If this is a K-3D property, set its internal value ...\n\textract<iunknown_wrapper> unknown(Self);\n\tif(unknown.check())\n\t{\n\t\tif(k3d::iproperty_collection* const property_collection = unknown().wrapped_ptr<k3d::iproperty_collection>())\n\t\t{\n\t\t\tif(k3d::iproperty* const property = k3d::property::get(*property_collection, Name))\n\t\t\t{\n\t\t\t\tif(k3d::iwritable_property* const writable = dynamic_cast<k3d::iwritable_property*>(property))\n\t\t\t\t{\n\t\t\t\t\twritable->property_set_value(python_to_any(Value, property->property_type()));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthrow std::invalid_argument(\"read-only property: \" + Name);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Otherwise, fallback on default behavior ...\n\tSelf.attr(\"__dict__\")[Name] = Value;\n}\n\nstatic bool eq(const object& Self, const object& Other)\n{\n\tif(Other == boost::python::object())\n\t\treturn false;\n\n\textract<iunknown_wrapper> self(Self);\n\textract<iunknown_wrapper> other(Other);\n\n\treturn self == other;\n}\n\nstatic bool ne(const object& Self, const object& Other)\n{\n\tif(Other == boost::python::object())\n\t\treturn false;\n\n\textract<iunknown_wrapper> self(Self);\n\textract<iunknown_wrapper> other(Other);\n\n\treturn !(self == other);\n}\n\nvoid define_class_iunknown()\n{\n\tclass_<iunknown_wrapper>(\"iunknown\", \n\t\t\"Abstract interface that represents an object with unknown capabilities.\\n\\n\"\n\t\t\"Methods for other implemented interfaces are added dynamically at runtime.\",\n\t\tno_init)\n\t\t.def(\"__getattr__\", getattr)\n\t\t.def(\"__setattr__\", setattr)\n\t\t.def(\"__eq__\", eq)\n\t\t.def(\"__ne__\", ne)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/iunknown_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IUNKNOWN_PYTHON_H\n#define K3DSDK_PYTHON_IUNKNOWN_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<k3d::iunknown> iunknown_wrapper;\n\nvoid define_class_iunknown();\n\nboost::python::object wrap_unknown(k3d::iunknown* Wrapped);\nboost::python::object wrap_unknown(k3d::iunknown& Wrapped);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IUNKNOWN_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/iuser_interface_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/any_python.h>\n#include <k3dsdk/python/iuser_interface_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/path.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic void open_uri(iunknown_wrapper& Self, const string_t& URI)\n{\n\tSelf.wrapped<k3d::iuser_interface>().open_uri(URI);\n}\n\nstatic void message(iunknown_wrapper& Self, const string_t& Message)\n{\n\tSelf.wrapped<k3d::iuser_interface>().message(Message);\n}\n\nstatic void warning_message(iunknown_wrapper& Self, const string_t& Message)\n{\n\tSelf.wrapped<k3d::iuser_interface>().warning_message(Message);\n}\n\nstatic void error_message(iunknown_wrapper& Self, const string_t& Message)\n{\n\tSelf.wrapped<k3d::iuser_interface>().error_message(Message);\n}\n\nstatic unsigned long query_message(iunknown_wrapper& Self, const string_t& Message, const list& Buttons)\n{\n\tstd::vector<string_t> buttons;\n\tfor(long i = 0; i != len(Buttons); ++i)\n\t\tbuttons.push_back(extract<string_t>(Buttons[i]));\n\treturn Self.wrapped<k3d::iuser_interface>().query_message(Message, 0, buttons);\n}\n\nstatic void nag_message(iunknown_wrapper& Self, const string_t& Type, const boost::python::object& Message, const boost::python::object& SecondaryMessage)\n{\n\tSelf.wrapped<k3d::iuser_interface>().nag_message(Type, python_to_ustring(Message), python_to_ustring(SecondaryMessage));\n}\n\nstatic const filesystem::path get_file_path(iunknown_wrapper& Self, const string_t& Direction, const string_t& Type, const string_t& Message, const string_t& StartPath)\n{\n\tconst filesystem::path old_path = filesystem::native_path(ustring::from_utf8(StartPath));\n\tfilesystem::path new_path;\n\tif(Direction == \"r\" || Direction == \"read\")\n\t\tSelf.wrapped<k3d::iuser_interface>().get_file_path(k3d::ipath_property::READ, Type, Message, old_path, new_path);\n\telse if(Direction == \"w\" || Direction == \"write\")\n\t\tSelf.wrapped<k3d::iuser_interface>().get_file_path(k3d::ipath_property::WRITE, Type, Message, old_path, new_path);\n\telse\n\t\tthrow std::invalid_argument(\"unknown file path operation, should be \\\"read\\\" or \\\"write\\\"\");\n\n\treturn new_path;\n}\n\nstatic void synchronize(iunknown_wrapper& Self)\n{\n\tSelf.wrapped<k3d::iuser_interface>().synchronize();\n}\n\nvoid define_methods_iuser_interface(k3d::iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::iuser_interface*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&open_uri,\n\t\t\"Opens a Uniform Resource Identifier (URI) in the user's preferred application.\\n\"\n\t\t\"@param URI: The URI string to be opened.\\n\"\n\t\t\"@note: Depending on the user interface plugin, this might open an application, \"\n\t\t\"print a message to the console, display a dialog box, or do nothing.\"), \"open_uri\", Instance);\n\tutility::add_method(utility::make_function(&message,\n\t\t\"Displays an information message to the user.\\n\"\n\t\t\"@param message: The message string to be displayed.\\n\" \n\t\t\"@note: Depending on the user interface plugin, this might print a message \"\n\t\t\"to the console, display a dialog box, or do nothing.\"), \"message\", Instance);\n\tutility::add_method(utility::make_function(&warning_message,\n\t\t\"Displays a warning message to the user.\\n\"\n\t\t\"@param message: The warning message string to be displayed.\\n\" \n\t\t\"@note: Depending on the user interface plugin, this might print a message \"\n\t\t\"to the console, display a dialog box, or do nothing.\"), \"warning_message\", Instance);\n\tutility::add_method(utility::make_function(&error_message,\n\t\t\"Displays a warning message to the user.\\n\"\n\t\t\"@param message: The error message string to be displayed.\\n\" \n\t\t\"@note: Depending on the user interface plugin, this might print a message \"\n\t\t\"to the console, display a dialog box, or do nothing.\"), \"error_message\", Instance);\n\tutility::add_method(utility::make_function(&query_message,\n\t\t\"Query the user to choose from among a set of fixed options.\\n\"\n\t\t\"@param message: The error message string to be displayed.\\n\" \n\t\t\"@param options: A list of strings where each string is an option to be displayed.\\n\" \n\t\t\"@return: Returns the one-based index of the option chosen by the user, or zero if \"\n\t\t\"the user cancelled the query.\\n\" \n\t\t\"@note: Depending on the user interface plugin, this might print a message \"\n\t\t\"to the console, display a dialog box, or do nothing.\"), \"query_message\", Instance);\n\tutility::add_method(utility::make_function(&nag_message,\n\t\t\"Display a message to the user that can be suppressed.\\n\"\n\t\t\"@note: Depending on the user interface plugin, this might print a message \"\n\t\t\"to the console, display a dialog box, or do nothing.\"), \"nag_message\", Instance);\n\tutility::add_method(utility::make_function(&get_file_path,\n\t\t\"Query the user to choose a filesystem path.\\n\"\n\t\t\"@param direction: Either \\\"read\\\" or \\\"write\\\".\\n\"\n\t\t\"@param type: The type of path to be accessed (used to group most-recently-used paths.\\n\"\n\t\t\"@param message: Message string displayed to the user.\\n\" \n\t\t\"@param start: The initial path to be displayed to the user.\\n\"\n\t\t\"@return: Returns the path chosen by the as a string, empty string if the user cancels.\\n\"\n\t\t\"@note: Depending on the user interface plugin, this might print a message \"\n\t\t\"to the console, display a dialog box, or do nothing.\"), \"get_file_path\", Instance);\n\tutility::add_method(utility::make_function(&synchronize,\n\t\t\"Gives the user interface a chance to synchronize itself with the current application state.\"), \"synchronize\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/iuser_interface_python.h",
    "content": "#ifndef K3DSDK_PYTHON_IUSER_INTERFACE_PYTHON_H\n#define K3DSDK_PYTHON_IUSER_INTERFACE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_iuser_interface(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_IUSER_INTERFACE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/linear_curve_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/linear_curve_python.h>\n\n#include <k3dsdk/linear_curve.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass linear_curve\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::linear_curve::const_primitive> wrapper;\n\n\t\tstatic object periodic(wrapper& Self) { return wrap(Self.wrapped().periodic); }\n\t\tstatic object material(wrapper& Self) { return wrap(Self.wrapped().material); }\n\t\tstatic object curve_first_points(wrapper& Self) { return wrap(Self.wrapped().curve_first_points); }\n\t\tstatic object curve_point_counts(wrapper& Self) { return wrap(Self.wrapped().curve_point_counts); }\n\t\tstatic object curve_selections(wrapper& Self) { return wrap(Self.wrapped().curve_selections); }\n\t\tstatic object curve_points(wrapper& Self) { return wrap(Self.wrapped().curve_points); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object curve_attributes(wrapper& Self) { return wrap(Self.wrapped().curve_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::linear_curve::primitive> wrapper;\n\n\t\tstatic object periodic(wrapper& Self) { return wrap(Self.wrapped().periodic); }\n\t\tstatic object material(wrapper& Self) { return wrap(Self.wrapped().material); }\n\t\tstatic object curve_first_points(wrapper& Self) { return wrap(Self.wrapped().curve_first_points); }\n\t\tstatic object curve_point_counts(wrapper& Self) { return wrap(Self.wrapped().curve_point_counts); }\n\t\tstatic object curve_selections(wrapper& Self) { return wrap(Self.wrapped().curve_selections); }\n\t\tstatic object curve_points(wrapper& Self) { return wrap(Self.wrapped().curve_points); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object curve_attributes(wrapper& Self) { return wrap(Self.wrapped().curve_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::linear_curve::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::linear_curve::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::linear_curve::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_linear_curve()\n{\n\tscope outer = class_<linear_curve>(\"linear_curve\", no_init)\n\t\t.def(\"create\", &linear_curve::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &linear_curve::validate)\n\t\t.def(\"validate\", &linear_curve::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<linear_curve::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"periodic\", &linear_curve::const_primitive::periodic)\n\t\t.def(\"material\", &linear_curve::const_primitive::material)\n\t\t.def(\"curve_first_points\", &linear_curve::const_primitive::curve_first_points)\n\t\t.def(\"curve_point_counts\", &linear_curve::const_primitive::curve_point_counts)\n\t\t.def(\"curve_selections\", &linear_curve::const_primitive::curve_selections)\n\t\t.def(\"curve_points\", &linear_curve::const_primitive::curve_points)\n\t\t.def(\"constant_attributes\", &linear_curve::const_primitive::constant_attributes)\n\t\t.def(\"curve_attributes\", &linear_curve::const_primitive::curve_attributes)\n\t\t.def(\"parameter_attributes\", &linear_curve::const_primitive::parameter_attributes)\n\t\t.def(\"vertex_attributes\", &linear_curve::const_primitive::vertex_attributes)\n\t\t;\n\n\tclass_<linear_curve::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"periodic\", &linear_curve::primitive::periodic)\n\t\t.def(\"material\", &linear_curve::primitive::material)\n\t\t.def(\"curve_first_points\", &linear_curve::primitive::curve_first_points)\n\t\t.def(\"curve_point_counts\", &linear_curve::primitive::curve_point_counts)\n\t\t.def(\"curve_selections\", &linear_curve::primitive::curve_selections)\n\t\t.def(\"curve_points\", &linear_curve::primitive::curve_points)\n\t\t.def(\"constant_attributes\", &linear_curve::primitive::constant_attributes)\n\t\t.def(\"curve_attributes\", &linear_curve::primitive::curve_attributes)\n\t\t.def(\"parameter_attributes\", &linear_curve::primitive::parameter_attributes)\n\t\t.def(\"vertex_attributes\", &linear_curve::primitive::vertex_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/linear_curve_python.h",
    "content": "#ifndef K3DSDK_PYTHON_LINEAR_CURVE_PYTHON_H\n#define K3DSDK_PYTHON_LINEAR_CURVE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_linear_curve();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_LINEAR_CURVE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/log_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/log_python.h>\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/types.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass log\n{\npublic:\n\tstatic void critical(const string_t& Message)\n\t{\n\t\tk3d::log() << k3d::critical << Message << std::endl;\n\t}\n\n\tstatic void debug(const string_t& Message)\n\t{\n\t\tk3d::log() << k3d::debug << Message << std::endl;\n\t}\n\n\tstatic void error(const string_t& Message)\n\t{\n\t\tk3d::log() << k3d::error << Message << std::endl;\n\t}\n\n\tstatic void info(const string_t& Message)\n\t{\n\t\tk3d::log() << k3d::info << Message << std::endl;\n\t}\n\n\tstatic void warning(const string_t& Message)\n\t{\n\t\tk3d::log() << k3d::warning << Message << std::endl;\n\t}\n};\n\nvoid define_namespace_log()\n{\n\tscope outer = class_<log>(\"log\", no_init)\n\t\t.def(\"critical\", &log::critical,\n\t\t\t\"Sends a critical message to the K-3D log.\")\n\t\t.def(\"debug\", &log::debug,\n\t\t\t\"Sends a debug message to the K-3D log.\")\n\t\t.def(\"error\", &log::error,\n\t\t\t\"Sends an error message to the K-3D log.\")\n\t\t.def(\"info\", &log::info,\n\t\t\t\"Sends an informational message to the K-3D log.\")\n\t\t.def(\"warning\", &log::warning,\n\t\t\t\"Sends a warning message to the K-3D log.\")\n\t\t.staticmethod(\"critical\")\n\t\t.staticmethod(\"debug\")\n\t\t.staticmethod(\"error\")\n\t\t.staticmethod(\"info\")\n\t\t.staticmethod(\"warning\");\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/log_python.h",
    "content": "#ifndef K3DSDK_PYTHON_LOG_PYTHON_H\n#define K3DSDK_PYTHON_LOG_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_log();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_LOG_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/matrix4_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/python/matrix4_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n\n#include <vector>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic k3d::matrix4 row_major_factory(boost::python::object values)\n{\n\tstd::vector<double_t> temp;\n\tif(len(values) == 4)\n\t{\n\t\tfor(uint_t i = 0; i != 4; ++i)\n\t\t{\n\t\t\tfor(uint_t j = 0; j != 4; ++j)\n\t\t\t\ttemp.push_back(boost::python::extract<double_t>(values[i][j])());\n\t\t}\n\t}\n\telse if(len(values) == 16)\n\t{\n\t\tfor(uint_t i = 0; i != 16; ++i)\n\t\t\ttemp.push_back(boost::python::extract<double_t>(values[i])());\n\t}\n\telse\n\t{\n\t\tthrow std::runtime_error(\"row_major() requires a sequence of 16 values, or four sequences of four values.\");\n\t}\n\n\treturn k3d::matrix4::row_major(temp.begin(), temp.end());\n}\n\nstatic boost::python::list row_major_values(const k3d::matrix4& Self)\n{\n\tboost::python::list results;\n\tfor(uint_t i = 0; i != 4; ++i)\n\t{\n\t\tfor(uint_t j = 0; j != 4; ++j)\n\t\t{\n\t\t\tresults.append(Self[i][j]);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nstatic boost::python::list column_major_values(const k3d::matrix4& Self)\n{\n\tboost::python::list results;\n\tfor(uint_t i = 0; i != 4; ++i)\n\t{\n\t\tfor(uint_t j = 0; j != 4; ++j)\n\t\t{\n\t\t\tresults.append(Self[j][i]);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nvoid define_class_matrix4()\n{\n\tboost::python::class_<k3d::matrix4>(\"matrix4\",\n\t\t\"Stores a 4x4 transformation matrix.\")\n\t\t.def(boost::python::init<const k3d::matrix4&>())\n\t\t.def(boost::python::init<const k3d::vector4&, const k3d::vector4&, const k3d::vector4&, const k3d::vector4&>())\n\t\t.def(\"row_major\", row_major_factory,\n\t\t\t\"Constructs a matrix4 from a sequence of values in row-major order.\")\n\t\t.staticmethod(\"row_major\")\n\t\t.def(\"__len__\", &utility::constant_len_len<k3d::matrix4, 4>)\n\t\t.def(\"__getitem__\", &utility::constant_len_get_item<k3d::matrix4, 4, k3d::vector4>)\n\t\t.def(\"__setitem__\", &utility::constant_len_set_item<k3d::matrix4, 4, k3d::vector4>)\n\t\t.def(\"row_major_values\", row_major_values,\n\t\t\t\"Returns the contents of the matrix as a list of floating-point values in row-major order.\")\n\t\t.def(\"column_major_values\", column_major_values,\n\t\t\t\"Returns the contents of the matrix as a list of floating-point values in column-major order.\")\n\t\t.def(boost::python::self * k3d::normal3())\n\t\t.def(boost::python::self * k3d::point3())\n\t\t.def(boost::python::self * k3d::vector3())\n\t\t.def(boost::python::self * boost::python::self)\n\t\t.def(boost::python::self == boost::python::self)\n\t\t.def(boost::python::self != boost::python::self)\n\t\t.def(boost::python::self - boost::python::self)\n\t\t.def(boost::python::self + boost::python::self)\n\t\t.def(boost::python::self * double())\n\t\t.def(double() * boost::python::self)\n\t\t.def(boost::python::self_ns::str(boost::python::self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/matrix4_python.h",
    "content": "#ifndef K3DSDK_PYTHON_MATRIX4_PYTHON_H\n#define K3DSDK_PYTHON_MATRIX4_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_matrix4();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_MATRIX4_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/mesh_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/table_python.h>\n#include <k3dsdk/python/const_table_python.h>\n#include <k3dsdk/python/const_typed_array_python.h>\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/typed_array_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/type_registry.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nnamespace detail\n{\n\n///////////////////////////////////////////////////////////////////////////////////////\n// wrap_const_object\n\ntemplate<typename return_type, typename value_type>\nobject wrap_const_object(const pipeline_data<value_type>& Data)\n{\n\tif(!Data)\n\t\treturn object();\n\n\treturn object(return_type(*Data));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////\n// wrap_non_const_object\n\ntemplate<typename value_type>\nobject wrap_non_const_object(pipeline_data<value_type>& Data)\n{\n\tif(!Data)\n\t\treturn object();\n\n\treturn object(wrap(Data.writable()));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////\n// create_object\n\ntemplate<typename return_type, typename value_type>\nobject create_object(pipeline_data<value_type>& Data)\n{\n\treturn object(return_type(Data.create()));\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n// wrap_const_array\n\ntemplate<typename array_type>\nobject wrap_const_array(const pipeline_data<array_type>& Data)\n{\n\tif(!Data)\n\t\treturn object();\n\n\treturn object(instance_wrapper<const array_type>(*Data));\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n// wrap_non_const_array\n\ntemplate<typename array_type>\nobject wrap_non_const_array(pipeline_data<array_type>& Data)\n{\n\tif(!Data)\n\t\treturn object();\n\n\treturn object(instance_wrapper<array_type>(Data.writable()));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////\n// create_array\n\ntemplate<typename array_type>\nobject create_array(pipeline_data<array_type>& Data)\n{\n\treturn object(instance_wrapper<array_type>(Data.create()));\n}\n\n} // namespace detail\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// mesh\n\nstatic void mesh_copy_const(mesh_wrapper& Self, const_mesh_wrapper& RHS)\n{\n\tSelf.wrapped() = RHS.wrapped();\n}\n\nstatic void mesh_copy_non_const(mesh_wrapper& Self, mesh_wrapper& RHS)\n{\n\tSelf.wrapped() = RHS.wrapped();\n}\n\nstatic object mesh_create_point_selection(mesh_wrapper& Self) { return detail::create_array(Self.wrapped().point_selection); }\nstatic object mesh_create_points(mesh_wrapper& Self) { return detail::create_array(Self.wrapped().points); }\nstatic object mesh_point_selection(mesh_wrapper& Self) { return detail::wrap_non_const_array(Self.wrapped().point_selection); }\nstatic object mesh_points(mesh_wrapper& Self) { return detail::wrap_non_const_array(Self.wrapped().points); }\nstatic object mesh_point_attributes(mesh_wrapper& Self) { return wrap(Self.wrapped().point_attributes); }\nstatic object mesh_primitives(mesh_wrapper& Self) { return wrap(Self.wrapped().primitives); }\n\nstatic const string_t mesh_str(mesh_wrapper& Self)\n{\n\tstd::ostringstream buffer;\n\tbuffer << Self.wrapped();\n\treturn buffer.str();\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// const_mesh\n\nstatic object const_mesh_point_selection(const_mesh_wrapper& Self) { return detail::wrap_const_array(Self.wrapped().point_selection); }\nstatic object const_mesh_points(const_mesh_wrapper& Self) { return detail::wrap_const_array(Self.wrapped().points); }\nstatic object const_mesh_point_attributes(const_mesh_wrapper& Self) { return wrap(Self.wrapped().point_attributes); }\nstatic object const_mesh_primitives(const_mesh_wrapper& Self) { return wrap(Self.wrapped().primitives); }\n\nstatic const string_t const_mesh_str(const_mesh_wrapper& Self)\n{\n\tstd::ostringstream buffer;\n\tbuffer << Self.wrapped();\n\treturn buffer.str();\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// const_mesh_primitive \n\nstatic const string_t const_mesh_primitive_get_type(const_mesh_primitive_wrapper& Self)\n{\n\treturn Self.wrapped().type;\n}\n\nstatic object const_mesh_primitive_get_structure(const_mesh_primitive_wrapper& Self)\n{\n\treturn wrap(Self.wrapped().structure);\n}\n\nstatic object const_mesh_primitive_get_attributes(const_mesh_primitive_wrapper& Self)\n{\n\treturn wrap(Self.wrapped().attributes);\n}\n\nstatic const string_t const_mesh_primitive_str(const_mesh_primitive_wrapper& Self)\n{\n\tstd::ostringstream buffer;\n\tbuffer << Self.wrapped();\n\treturn buffer.str();\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// mesh_primitive \n\nstatic const string_t mesh_primitive_get_type(mesh_primitive_wrapper& Self)\n{\n\treturn Self.wrapped().type;\n}\n\nstatic void mesh_primitive_set_type(mesh_primitive_wrapper& Self, const string_t& Type)\n{\n\tSelf.wrapped().type = Type;\n}\n\nstatic object mesh_primitive_get_structure(mesh_primitive_wrapper& Self)\n{\n\treturn wrap(Self.wrapped().structure);\n}\n\nstatic object mesh_primitive_get_attributes(mesh_primitive_wrapper& Self)\n{\n\treturn wrap(Self.wrapped().attributes);\n}\n\nstatic const string_t mesh_primitive_str(mesh_primitive_wrapper& Self)\n{\n\tstd::ostringstream buffer;\n\tbuffer << Self.wrapped();\n\treturn buffer.str();\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// const_mesh_primitives_t\n\ntypedef instance_wrapper<const k3d::mesh::primitives_t> const_mesh_primitives_t_wrapper;\n\nstatic object const_mesh_primitives_t_get_item(const_mesh_primitives_t_wrapper& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\treturn wrap(Self.wrapped().at(Item).get());\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// mesh_primitives_t\n\ntypedef instance_wrapper<k3d::mesh::primitives_t> mesh_primitives_t_wrapper;\n\nstatic object mesh_primitives_t_get_item(mesh_primitives_t_wrapper& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\treturn detail::wrap_non_const_object(Self.wrapped().at(Item));\n}\n\nstatic object mesh_primitives_t_create(mesh_primitives_t_wrapper& Self, const string_t& Type)\n{\n\treturn wrap(Self.wrapped().create(Type));\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// define_class_mesh \n\nvoid define_class_mesh()\n{\n\tscope outer = class_<mesh_wrapper>(\"mesh\", \n\t\t\"Stores a heterogeneous collection of geometric mesh primitives.\", no_init)\n\t\t.def(\"point_attributes\", &mesh_point_attributes,\n\t\t\t\"Returns a L{table} object containing a collection of mutable per-vertex data, or None.\")\n\t\t.def(\"point_selection\", &mesh_point_selection,\n\t\t\t\"Returns an mutable L{double_array} object containing the selection state of every vertex in the mesh, or None.\")\n\t\t.def(\"points\", &mesh_points,\n\t\t\t\"Returns an mutable L{const_point3_array} object containing the geometric coordinates of every vertex in the mesh, or None.\")\n\t\t.def(\"copy\", &mesh_copy_non_const,\n\t\t\t\"Store a shallow copy of the given L{mesh}.\")\n\t\t.def(\"copy\", &mesh_copy_const,\n\t\t\t\"Store a shallow copy of the given L{const_mesh}.\")\n\t\t.def(\"create_point_selection\", &mesh_create_point_selection,\n\t\t\t\"Creates and returns a new L{double_array} object used to store the selection state of every vertex in the mesh.\")\n\t\t.def(\"create_points\", &mesh_create_points,\n\t\t\t\"Creates and returns a new L{point3_array} object used to store the geometric coordinates of every vertex in the mesh.\")\n\t\t.def(\"primitives\", &mesh_primitives,\n\t\t\t\"Returns the set of L{primitive} objects in the mesh.\")\n\t\t.def(\"__str__\", &mesh_str);\n\n\tclass_<mesh_primitive_wrapper>(\"primitive\", no_init)\n\t\t.def(\"type\", &mesh_primitive_get_type)\n\t\t.def(\"structure\", &mesh_primitive_get_structure)\n\t\t.def(\"attributes\", &mesh_primitive_get_attributes)\n\t\t.def(\"__str__\", &mesh_primitive_str)\n\t\t;\n\n\tclass_<mesh_primitives_t_wrapper>(\"primitives_t\", no_init)\n\t\t.def(\"__len__\", &utility::wrapped_len<mesh_primitives_t_wrapper>)\n\t\t.def(\"__getitem__\", &mesh_primitives_t_get_item)\n\t\t.def(\"create\", &mesh_primitives_t_create)\n\t\t;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// define_class_mesh\n\nvoid define_class_const_mesh()\n{\n\tscope outer = class_<const_mesh_wrapper>(\"const_mesh\",\n\t\t\"Stores a heterogeneous, immutable collection of geometric mesh primitives.\", no_init)\n\t\t.def(\"point_attributes\", &const_mesh_point_attributes,\n\t\t\t\"Returns a L{const_named_arrays} object containing a collection of immutable (read-only) per-vertex data, or None.\")\n\t\t.def(\"point_selection\", &const_mesh_point_selection,\n\t\t\t\"Returns an immutable (read-only) L{const_double_array} object containing the selection state of every vertex in the mesh, or None.\")\n\t\t.def(\"points\", &const_mesh_points,\n\t\t\t\"Returns an immutable (read-only) L{const_point3_array} object containing the geometric coordinates of every vertex in the mesh, or None.\")\n\t\t.def(\"primitives\", &const_mesh_primitives,\n\t\t\t\"Returns the set of L{const_primitive} objects in the mesh.\")\n\t\t.def(\"__str__\", &const_mesh_str);\n\n\tclass_<const_mesh_primitive_wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"type\", &const_mesh_primitive_get_type)\n\t\t.def(\"structure\", &const_mesh_primitive_get_structure)\n\t\t.def(\"attributes\", &const_mesh_primitive_get_attributes)\n\t\t.def(\"__str__\", &const_mesh_primitive_str)\n\t\t;\n\n\tclass_<const_mesh_primitives_t_wrapper>(\"const_primitives_t\", no_init)\n\t\t.def(\"__len__\", &utility::wrapped_len<const_mesh_primitives_t_wrapper>)\n\t\t.def(\"__getitem__\", &const_mesh_primitives_t_get_item)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/mesh_python.h",
    "content": "#ifndef K3DSDK_PYTHON_MESH_PYTHON_H\n#define K3DSDK_PYTHON_MESH_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n\n#include <k3dsdk/mesh.h>\n#include <boost/python/object.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<k3d::mesh> mesh_wrapper;\ntypedef instance_wrapper<const k3d::mesh> const_mesh_wrapper;\ntypedef instance_wrapper<k3d::mesh::primitive> mesh_primitive_wrapper;\ntypedef instance_wrapper<const k3d::mesh::primitive> const_mesh_primitive_wrapper;\n\nvoid define_class_mesh();\nvoid define_class_const_mesh();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_MESH_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/mime_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mime_python.h>\n\n#include <k3dsdk/path.h>\n#include <k3dsdk/mime_types.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass mime\n{\npublic:\n\n\tclass type\n\t{\n\tpublic:\n\t\tstatic const k3d::mime::type lookup_file(const filesystem::path& File)\n\t\t{\n\t\t\treturn k3d::mime::type::lookup(File);\n\t\t}\n\n\t\tstatic const k3d::mime::type lookup_data(const string_t& Data)\n\t\t{\n\t\t\treturn k3d::mime::type::lookup(Data);\n\t\t}\n\n\t\tstatic const string_t str(k3d::mime::type& lhs)\n\t\t{\n\t\t\treturn lhs.str();\n\t\t}\n\t};\n};\n\nvoid define_namespace_mime()\n{\n\tscope outer = class_<mime>(\"mime\", no_init);\n\n\tclass_<k3d::mime::type>(\"type\")\n\t\t.def(\"empty\", &k3d::mime::type::empty,\n\t\t\t\"Returns true if the MIME type is empty (unknown).\")\n\t\t.def(\"lookup\", mime::type::lookup_file,\n\t\t\t\"Returns the MIME type of a file (could return an empty type if the file cannot be identified).\")\n\t\t.def(\"lookup\", mime::type::lookup_data,\n\t\t\t\"Returns the MIME type of a data buffer (could return an empty type if the data cannot be identified).\")\n\t\t.def(\"str\", &k3d::mime::type::str,\n\t\t\t\"Returns the MIME type as a string.\")\n\t\t.def(\"__str__\", mime::type::str,\n\t\t\t\"\")\n\t\t.def(self == self)\n\t\t.staticmethod(\"lookup\");\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/mime_python.h",
    "content": "#ifndef K3DSDK_PYTHON_MIME_PYTHON_H\n#define K3DSDK_PYTHON_MIME_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_mime();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_MIME_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/named_arrays_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/named_arrays_python.h>\n#include <k3dsdk/python/typed_array_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/named_array_types.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/typed_array.h>\n#include <k3dsdk/uint_t_array.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass named_arrays_array_factory\n{\npublic:\n\tnamed_arrays_array_factory(const string_t& Name, const string_t& Type, boost::python::object& Array, k3d::named_arrays& Arrays) :\n\t\tname(Name),\n\t\ttype(Type),\n\t\tarray(Array),\n\t\tarrays(Arrays)\n\t{\n\t\t// Handle arrays of uint_t as a special-case ...\n\t\tif(Type == \"k3d::uint_t\")\n\t\t\tarray = wrap(arrays.create<k3d::uint_t_array>(name));\n\t}\n\n\ttemplate<typename T>\n\tvoid operator()(T) const\n\t{\n\t\tif(array != boost::python::object())\n\t\t\treturn;\n\n\t\tif(type != k3d::type_string<T>())\n\t\t\treturn;\n\n\t\tarray = wrap(arrays.create<k3d::typed_array<T> >(name));\n\t}\n\nprivate:\n\tstring_t name;\n\tstring_t type;\n\tboost::python::object& array;\n\tk3d::named_arrays& arrays;\n};\n\nstatic list keys(named_arrays_wrapper& Self)\n{\n\tlist results;\n\n\tfor(k3d::named_arrays::const_iterator array = Self.wrapped().begin(); array != Self.wrapped().end(); ++array)\n\t\tresults.append(array->first);\n\n\treturn results;\n}\n\nstatic object create(named_arrays_wrapper& Self, const string_t& Name, const string_t& Type)\n{\n\tif(Name.empty())\n\t\tthrow std::runtime_error(\"Empty array name\");\n\n\tboost::python::object result;\n\tboost::mpl::for_each<k3d::named_array_types>(named_arrays_array_factory(Name, Type, result, Self.wrapped()));\n\tif(result == boost::python::object())\n\t\tthrow std::runtime_error(\"Cannot create array [\" + Name + \"] with unknown type [\" + Type + \"]\");\n\n\treturn result;\n}\n\nstatic object create_array(named_arrays_wrapper& Self, const string_t& Name, const string_t& Type)\n{\n\tk3d::log() << warning << \"create_array() is deprecated, use create() instead.\" << std::endl;\n\treturn create(Self, Name, Type);\n}\n\nstatic void delete_1(named_arrays_wrapper& Self, const string_t& Name)\n{\n\tSelf.wrapped().erase(Name);\t\n}\n\nstatic object get_item(named_arrays_wrapper& Self, const string_t& Key)\n{\n\tk3d::named_arrays::iterator iterator = Self.wrapped().find(Key);\n\tif(iterator == Self.wrapped().end())\n\t\tthrow std::runtime_error(\"unknown key: \" + Key);\n\n\treturn wrap_array(iterator->second.writable());\n}\n\nvoid define_class_named_arrays()\n{\n\tclass_<named_arrays_wrapper>(\"named_arrays\", \n\t\t\"Stores a mutable (read-write) collection of named arrays (named arrays of varying length).\", no_init)\n\t\t.def(\"keys\", &keys,\n\t\t\t\"Returns a list containing names for all the arrays in the collection.\")\n\t\t.def(\"create\", &create,\n\t\t\t\"Creates an array with given name and type.\")\n\t\t.def(\"create_array\", &create_array,\n\t\t\t\"Creates an array with given name and type.\")\n\t\t.def(\"delete\", &delete_1,\n\t\t\t\"Deletes an array with given name, if any.\")\n\t\t.def(\"__len__\", &utility::wrapped_len<named_arrays_wrapper>)\n\t\t.def(\"__getitem__\", &get_item);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/named_arrays_python.h",
    "content": "#ifndef K3DSDK_PYTHON_NAMED_ARRAYS_PYTHON_H\n#define K3DSDK_PYTHON_NAMED_ARRAYS_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/named_arrays.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<k3d::named_arrays> named_arrays_wrapper;\n\nvoid define_class_named_arrays();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_NAMED_ARRAYS_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/named_tables_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/named_tables_python.h>\n#include <k3dsdk/python/utility_python.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// named_tables\n\nstatic object named_tables_get_item(named_tables_wrapper& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\tk3d::named_tables::iterator item(Self.wrapped().begin());\n\tstd::advance(item, Item);\n\n\treturn wrap(item->second);\n}\n\nstatic object named_tables_create(named_tables_wrapper& Self, const string_t& Name)\n{\n\tif(Name.empty())\n\t\tthrow std::runtime_error(\"empty attribute name\");\n\n\tif(Self.wrapped().count(Name))\n\t\tthrow std::runtime_error(\"name already exists\");\n\n\tSelf.wrapped().insert(std::make_pair(Name, k3d::table()));\n\treturn wrap(Self.wrapped()[Name]);\n}\n\nstatic void delete_1(named_tables_wrapper& Self, const string_t& Name)\n{\n\tSelf.wrapped().erase(Name);\t\n}\n\nstatic list keys(named_tables_wrapper& Self)\n{\n\tlist results;\n\n\tfor(k3d::named_tables::const_iterator table = Self.wrapped().begin(); table != Self.wrapped().end(); ++table)\n\t\tresults.append(table->first);\n\n\treturn results;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// define_class_named_tables \n\nvoid define_class_named_tables()\n{\n\tclass_<named_tables_wrapper>(\"named_tables\", no_init)\n\t\t.def(\"__len__\", &utility::wrapped_len<named_tables_wrapper>)\n\t\t.def(\"__getitem__\", &utility::wrapped_get_wrapped_item_by_key<named_tables_wrapper>)\n\t\t.def(\"__getitem__\", &named_tables_get_item)\n\t\t.def(\"create\", &named_tables_create)\n\t\t.def(\"delete\", &delete_1, \"Deletes a set of attribute arrays with the given name, if any.\")\n\t\t.def(\"keys\", &keys, \"Returns a list containing names for all the tables in the collection.\")\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/named_tables_python.h",
    "content": "#ifndef K3DSDK_PYTHON_NAMED_TABLES_PYTHON_H\n#define K3DSDK_PYTHON_NAMED_TABLES_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/named_tables.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<k3d::named_tables> named_tables_wrapper;\n\nvoid define_class_named_tables();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_NAMED_TABLES_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/node_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/idocument_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/node_python.h>\n\n#include <k3dsdk/node.h>\n\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass node\n{\npublic:\n\tstatic boost::python::list wrap_nodes(const std::vector<inode*>& Nodes)\n\t{\n\t\tboost::python::list python_nodes;\n\n\t\tfor(uint_t i = 0; i != Nodes.size(); ++i)\n\t\t\tpython_nodes.append(wrap_unknown(*Nodes[i]));\n\n\t\treturn python_nodes;\n\t}\n\n\tstatic boost::python::list lookup_all(idocument_wrapper& Document)\n\t{\n\t\treturn wrap_nodes(k3d::node::lookup(Document.wrapped()));\n\t}\n\n\tstatic boost::python::list lookup_by_uuid(idocument_wrapper& Document, const uuid& ID)\n\t{\n\t\treturn wrap_nodes(k3d::node::lookup(Document.wrapped(), ID));\n\t}\n\n\tstatic boost::python::list lookup_by_name(idocument_wrapper& Document, const string_t& Name)\n\t{\n\t\treturn wrap_nodes(k3d::node::lookup(Document.wrapped(), Name));\n\t}\n\n\tstatic boost::python::list lookup_by_metadata(idocument_wrapper& Document, const string_t& MetadataName, const string_t& MetadataValue)\n\t{\n\t\treturn wrap_nodes(k3d::node::lookup(Document.wrapped(), MetadataName, MetadataValue));\n\t}\n\n\tstatic boost::python::object lookup_one_by_name(idocument_wrapper& Document, const string_t& Name)\n\t{\n\t\treturn wrap_unknown(k3d::node::lookup_one(Document.wrapped(), Name));\n\t}\n\n\tstatic void show_one(idocument_wrapper& Document, iunknown_wrapper& Node)\n\t{\n\t\tk3d::node::show(Document.wrapped(), Node.wrapped<inode>());\n\t}\n\n\tstatic void hide_one(idocument_wrapper& Document, iunknown_wrapper& Node)\n\t{\n\t\tk3d::node::hide(Document.wrapped(), Node.wrapped<inode>());\n\t}\n};\n\nvoid define_namespace_node()\n{\n\tboost::python::scope outer = boost::python::class_<node>(\"node\", boost::python::no_init)\n\t\t.def(\"lookup\", node::lookup_all,\n\t\t\t\"Returns the set of all nodes in the given document.\")\n\t\t.def(\"lookup\", node::lookup_by_uuid,\n\t\t\t\"Returns the set of nodes in a document that match a specific factory ID.\")\n\t\t.def(\"lookup\", node::lookup_by_name,\n\t\t\t\"Returns the set of nodes in a document that match the given node name.\")\n\t\t.def(\"lookup\", node::lookup_by_metadata,\n\t\t\t\"Returns the set of nodes in a document that match the given metadata name and value.\")\n\t\t.staticmethod(\"lookup\")\n\n\t\t.def(\"lookup_one\", node::lookup_one_by_name,\n\t\t\t\"Returns the one-and-only-one node in a document that matches the given node name, or None.\")\n\t\t.staticmethod(\"lookup_one\")\n\n\t\t.def(\"show\", node::show_one,\n\t\t\t\"Makes a node visible by adding it to every render engine in the document.\")\n\t\t.staticmethod(\"show\")\n\n\t\t.def(\"hide\", node::hide_one,\n\t\t\t\"Hides a node by removing it from every render engine in the document.\")\n\t\t.staticmethod(\"hide\")\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/node_python.h",
    "content": "#ifndef K3DSDK_PYTHON_NODE_PYTHON_H\n#define K3DSDK_PYTHON_NODE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_node();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_NODE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/normal3_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/normal3_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/normal3.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_normal3()\n{\n\tclass_<k3d::normal3>(\"normal3\",\n\t\t\"Stores a normal vector in three-dimensional space\", no_init)\n\t\t.def(init<double, double, double>())\n\t\t.def(init<const k3d::normal3&>())\n\t\t.def(\"__len__\", &utility::constant_len_len<k3d::normal3, 3>)\n\t\t.def(\"__getitem__\", &utility::constant_len_get_item<k3d::normal3, 3, k3d::double_t>)\n\t\t.def(\"__setitem__\", &utility::constant_len_set_item<k3d::normal3, 3, k3d::double_t>)\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self * double())\n\t\t.def(double() * self)\n\t\t.def(self += self)\n\t\t.def(self -= self)\n\t\t.def(self *= double())\n\t\t.def(self /= double())\n\t\t.def(self_ns::str(self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/normal3_python.h",
    "content": "#ifndef K3DSDK_PYTHON_NORMAL3_PYTHON_H\n#define K3DSDK_PYTHON_NORMAL3_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_normal3();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_NORMAL3_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/nurbs_curve_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/nurbs_curve_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/nurbs_curve.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass nurbs_curve\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::nurbs_curve::const_primitive> wrapper;\n\n\t\tstatic object material(wrapper& Self) { return wrap(Self.wrapped().material); }\n\t\tstatic object curve_first_points(wrapper& Self) { return wrap(Self.wrapped().curve_first_points); }\n\t\tstatic object curve_point_counts(wrapper& Self) { return wrap(Self.wrapped().curve_point_counts); }\n\t\tstatic object curve_orders(wrapper& Self) { return wrap(Self.wrapped().curve_orders); }\n\t\tstatic object curve_first_knots(wrapper& Self) { return wrap(Self.wrapped().curve_first_knots); }\n\t\tstatic object curve_selections(wrapper& Self) { return wrap(Self.wrapped().curve_selections); }\n\t\tstatic object curve_points(wrapper& Self) { return wrap(Self.wrapped().curve_points); }\n\t\tstatic object curve_point_weights(wrapper& Self) { return wrap(Self.wrapped().curve_point_weights); }\n\t\tstatic object curve_knots(wrapper& Self) { return wrap(Self.wrapped().curve_knots); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object curve_attributes(wrapper& Self) { return wrap(Self.wrapped().curve_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::nurbs_curve::primitive> wrapper;\n\n\t\tstatic object material(wrapper& Self) { return wrap(Self.wrapped().material); }\n\t\tstatic object curve_first_points(wrapper& Self) { return wrap(Self.wrapped().curve_first_points); }\n\t\tstatic object curve_point_counts(wrapper& Self) { return wrap(Self.wrapped().curve_point_counts); }\n\t\tstatic object curve_orders(wrapper& Self) { return wrap(Self.wrapped().curve_orders); }\n\t\tstatic object curve_first_knots(wrapper& Self) { return wrap(Self.wrapped().curve_first_knots); }\n\t\tstatic object curve_selections(wrapper& Self) { return wrap(Self.wrapped().curve_selections); }\n\t\tstatic object curve_points(wrapper& Self) { return wrap(Self.wrapped().curve_points); }\n\t\tstatic object curve_point_weights(wrapper& Self) { return wrap(Self.wrapped().curve_point_weights); }\n\t\tstatic object curve_knots(wrapper& Self) { return wrap(Self.wrapped().curve_knots); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object curve_attributes(wrapper& Self) { return wrap(Self.wrapped().curve_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::nurbs_curve::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::nurbs_curve::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::nurbs_curve::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_nurbs_curve()\n{\n\tscope outer = class_<nurbs_curve>(\"nurbs_curve\", no_init)\n\t\t.def(\"create\", &nurbs_curve::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &nurbs_curve::validate)\n\t\t.def(\"validate\", &nurbs_curve::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<nurbs_curve::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"material\", &nurbs_curve::const_primitive::material)\n\t\t.def(\"curve_first_points\", &nurbs_curve::const_primitive::curve_first_points)\n\t\t.def(\"curve_point_counts\", &nurbs_curve::const_primitive::curve_point_counts)\n\t\t.def(\"curve_orders\", &nurbs_curve::const_primitive::curve_orders)\n\t\t.def(\"curve_first_knots\", &nurbs_curve::const_primitive::curve_first_knots)\n\t\t.def(\"curve_selections\", &nurbs_curve::const_primitive::curve_selections)\n\t\t.def(\"curve_points\", &nurbs_curve::const_primitive::curve_points)\n\t\t.def(\"curve_point_weights\", &nurbs_curve::const_primitive::curve_point_weights)\n\t\t.def(\"curve_knots\", &nurbs_curve::const_primitive::curve_knots)\n\t\t.def(\"constant_attributes\", &nurbs_curve::const_primitive::constant_attributes)\n\t\t.def(\"curve_attributes\", &nurbs_curve::const_primitive::curve_attributes)\n\t\t.def(\"parameter_attributes\", &nurbs_curve::const_primitive::parameter_attributes)\n\t\t;\n\n\tclass_<nurbs_curve::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"material\", &nurbs_curve::primitive::material)\n\t\t.def(\"curve_first_points\", &nurbs_curve::primitive::curve_first_points)\n\t\t.def(\"curve_point_counts\", &nurbs_curve::primitive::curve_point_counts)\n\t\t.def(\"curve_orders\", &nurbs_curve::primitive::curve_orders)\n\t\t.def(\"curve_first_knots\", &nurbs_curve::primitive::curve_first_knots)\n\t\t.def(\"curve_selections\", &nurbs_curve::primitive::curve_selections)\n\t\t.def(\"curve_points\", &nurbs_curve::primitive::curve_points)\n\t\t.def(\"curve_point_weights\", &nurbs_curve::primitive::curve_point_weights)\n\t\t.def(\"curve_knots\", &nurbs_curve::primitive::curve_knots)\n\t\t.def(\"constant_attributes\", &nurbs_curve::primitive::constant_attributes)\n\t\t.def(\"curve_attributes\", &nurbs_curve::primitive::curve_attributes)\n\t\t.def(\"parameter_attributes\", &nurbs_curve::primitive::parameter_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/nurbs_curve_python.h",
    "content": "#ifndef K3DSDK_PYTHON_NURBS_CURVE_PYTHON_H\n#define K3DSDK_PYTHON_NURBS_CURVE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_nurbs_curve();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_NURBS_CURVE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/nurbs_patch_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/nurbs_patch_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass nurbs_patch\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::nurbs_patch::const_primitive> wrapper;\n\n\t\tstatic object patch_first_points(wrapper& Self) { return wrap(Self.wrapped().patch_first_points); }\n\t\tstatic object patch_u_point_counts(wrapper& Self) { return wrap(Self.wrapped().patch_u_point_counts); }\n\t\tstatic object patch_v_point_counts(wrapper& Self) { return wrap(Self.wrapped().patch_v_point_counts); }\n\t\tstatic object patch_u_orders(wrapper& Self) { return wrap(Self.wrapped().patch_u_orders); }\n\t\tstatic object patch_v_orders(wrapper& Self) { return wrap(Self.wrapped().patch_v_orders); }\n\t\tstatic object patch_u_first_knots(wrapper& Self) { return wrap(Self.wrapped().patch_u_first_knots); }\n\t\tstatic object patch_v_first_knots(wrapper& Self) { return wrap(Self.wrapped().patch_v_first_knots); }\n\t\tstatic object patch_selections(wrapper& Self) { return wrap(Self.wrapped().patch_selections); }\n\t\tstatic object patch_materials(wrapper& Self) { return wrap(Self.wrapped().patch_materials); }\n\t\tstatic object patch_points(wrapper& Self) { return wrap(Self.wrapped().patch_points); }\n\t\tstatic object patch_point_weights(wrapper& Self) { return wrap(Self.wrapped().patch_point_weights); }\n\t\tstatic object patch_u_knots(wrapper& Self) { return wrap(Self.wrapped().patch_u_knots); }\n\t\tstatic object patch_v_knots(wrapper& Self) { return wrap(Self.wrapped().patch_v_knots); }\n\t\tstatic object patch_trim_loop_counts(wrapper& Self) { return wrap(Self.wrapped().patch_trim_loop_counts); }\n\t\tstatic object patch_first_trim_loops(wrapper& Self) { return wrap(Self.wrapped().patch_first_trim_loops); }\n\t\tstatic object trim_loop_first_curves(wrapper& Self) { return wrap(Self.wrapped().trim_loop_first_curves); }\n\t\tstatic object trim_loop_curve_counts(wrapper& Self) { return wrap(Self.wrapped().trim_loop_curve_counts); }\n\t\tstatic object trim_loop_selections(wrapper& Self) { return wrap(Self.wrapped().trim_loop_selections); }\n\t\tstatic object curve_first_points(wrapper& Self) { return wrap(Self.wrapped().curve_first_points); }\n\t\tstatic object curve_point_counts(wrapper& Self) { return wrap(Self.wrapped().curve_point_counts); }\n\t\tstatic object curve_orders(wrapper& Self) { return wrap(Self.wrapped().curve_orders); }\n\t\tstatic object curve_first_knots(wrapper& Self) { return wrap(Self.wrapped().curve_first_knots); }\n\t\tstatic object curve_selections(wrapper& Self) { return wrap(Self.wrapped().curve_selections); }\n\t\tstatic object curve_points(wrapper& Self) { return wrap(Self.wrapped().curve_points); }\n\t\tstatic object curve_point_weights(wrapper& Self) { return wrap(Self.wrapped().curve_point_weights); }\n\t\tstatic object curve_knots(wrapper& Self) { return wrap(Self.wrapped().curve_knots); }\n\t\tstatic object points(wrapper& Self) { return wrap(Self.wrapped().points); }\n\t\tstatic object point_selections(wrapper& Self) { return wrap(Self.wrapped().point_selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object patch_attributes(wrapper& Self) { return wrap(Self.wrapped().patch_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::nurbs_patch::primitive> wrapper;\n\n\t\tstatic object patch_first_points(wrapper& Self) { return wrap(Self.wrapped().patch_first_points); }\n\t\tstatic object patch_u_point_counts(wrapper& Self) { return wrap(Self.wrapped().patch_u_point_counts); }\n\t\tstatic object patch_v_point_counts(wrapper& Self) { return wrap(Self.wrapped().patch_v_point_counts); }\n\t\tstatic object patch_u_orders(wrapper& Self) { return wrap(Self.wrapped().patch_u_orders); }\n\t\tstatic object patch_v_orders(wrapper& Self) { return wrap(Self.wrapped().patch_v_orders); }\n\t\tstatic object patch_u_first_knots(wrapper& Self) { return wrap(Self.wrapped().patch_u_first_knots); }\n\t\tstatic object patch_v_first_knots(wrapper& Self) { return wrap(Self.wrapped().patch_v_first_knots); }\n\t\tstatic object patch_selections(wrapper& Self) { return wrap(Self.wrapped().patch_selections); }\n\t\tstatic object patch_materials(wrapper& Self) { return wrap(Self.wrapped().patch_materials); }\n\t\tstatic object patch_points(wrapper& Self) { return wrap(Self.wrapped().patch_points); }\n\t\tstatic object patch_point_weights(wrapper& Self) { return wrap(Self.wrapped().patch_point_weights); }\n\t\tstatic object patch_u_knots(wrapper& Self) { return wrap(Self.wrapped().patch_u_knots); }\n\t\tstatic object patch_v_knots(wrapper& Self) { return wrap(Self.wrapped().patch_v_knots); }\n\t\tstatic object patch_trim_loop_counts(wrapper& Self) { return wrap(Self.wrapped().patch_trim_loop_counts); }\n\t\tstatic object patch_first_trim_loops(wrapper& Self) { return wrap(Self.wrapped().patch_first_trim_loops); }\n\t\tstatic object trim_loop_first_curves(wrapper& Self) { return wrap(Self.wrapped().trim_loop_first_curves); }\n\t\tstatic object trim_loop_curve_counts(wrapper& Self) { return wrap(Self.wrapped().trim_loop_curve_counts); }\n\t\tstatic object trim_loop_selections(wrapper& Self) { return wrap(Self.wrapped().trim_loop_selections); }\n\t\tstatic object curve_first_points(wrapper& Self) { return wrap(Self.wrapped().curve_first_points); }\n\t\tstatic object curve_point_counts(wrapper& Self) { return wrap(Self.wrapped().curve_point_counts); }\n\t\tstatic object curve_orders(wrapper& Self) { return wrap(Self.wrapped().curve_orders); }\n\t\tstatic object curve_first_knots(wrapper& Self) { return wrap(Self.wrapped().curve_first_knots); }\n\t\tstatic object curve_selections(wrapper& Self) { return wrap(Self.wrapped().curve_selections); }\n\t\tstatic object curve_points(wrapper& Self) { return wrap(Self.wrapped().curve_points); }\n\t\tstatic object curve_point_weights(wrapper& Self) { return wrap(Self.wrapped().curve_point_weights); }\n\t\tstatic object curve_knots(wrapper& Self) { return wrap(Self.wrapped().curve_knots); }\n\t\tstatic object points(wrapper& Self) { return wrap(Self.wrapped().points); }\n\t\tstatic object point_selections(wrapper& Self) { return wrap(Self.wrapped().point_selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object patch_attributes(wrapper& Self) { return wrap(Self.wrapped().patch_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::nurbs_patch::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::nurbs_patch::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::nurbs_patch::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_nurbs_patch()\n{\n\tscope outer = class_<nurbs_patch>(\"nurbs_patch\", no_init)\n\t\t.def(\"create\", &nurbs_patch::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &nurbs_patch::validate)\n\t\t.def(\"validate\", &nurbs_patch::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<nurbs_patch::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"patch_first_points\", &nurbs_patch::const_primitive::patch_first_points)\n\t\t.def(\"patch_u_point_counts\", &nurbs_patch::const_primitive::patch_u_point_counts)\n\t\t.def(\"patch_v_point_counts\", &nurbs_patch::const_primitive::patch_v_point_counts)\n\t\t.def(\"patch_u_orders\", &nurbs_patch::const_primitive::patch_u_orders)\n\t\t.def(\"patch_v_orders\", &nurbs_patch::const_primitive::patch_v_orders)\n\t\t.def(\"patch_u_first_knots\", &nurbs_patch::const_primitive::patch_u_first_knots)\n\t\t.def(\"patch_v_first_knots\", &nurbs_patch::const_primitive::patch_v_first_knots)\n\t\t.def(\"patch_selections\", &nurbs_patch::const_primitive::patch_selections)\n\t\t.def(\"patch_materials\", &nurbs_patch::const_primitive::patch_materials)\n\t\t.def(\"patch_points\", &nurbs_patch::const_primitive::patch_points)\n\t\t.def(\"patch_point_weights\", &nurbs_patch::const_primitive::patch_point_weights)\n\t\t.def(\"patch_u_knots\", &nurbs_patch::const_primitive::patch_u_knots)\n\t\t.def(\"patch_v_knots\", &nurbs_patch::const_primitive::patch_v_knots)\n\t\t.def(\"patch_trim_loop_counts\", &nurbs_patch::const_primitive::patch_trim_loop_counts)\n\t\t.def(\"patch_first_trim_loops\", &nurbs_patch::const_primitive::patch_first_trim_loops)\n\t\t.def(\"trim_loop_first_curves\", &nurbs_patch::const_primitive::trim_loop_first_curves)\n\t\t.def(\"trim_loop_curve_counts\", &nurbs_patch::const_primitive::trim_loop_curve_counts)\n\t\t.def(\"trim_loop_selections\", &nurbs_patch::const_primitive::trim_loop_selections)\n\t\t.def(\"curve_first_points\", &nurbs_patch::const_primitive::curve_first_points)\n\t\t.def(\"curve_point_counts\", &nurbs_patch::const_primitive::curve_point_counts)\n\t\t.def(\"curve_orders\", &nurbs_patch::const_primitive::curve_orders)\n\t\t.def(\"curve_first_knots\", &nurbs_patch::const_primitive::curve_first_knots)\n\t\t.def(\"curve_selections\", &nurbs_patch::const_primitive::curve_selections)\n\t\t.def(\"curve_points\", &nurbs_patch::const_primitive::curve_points)\n\t\t.def(\"curve_point_weights\", &nurbs_patch::const_primitive::curve_point_weights)\n\t\t.def(\"curve_knots\", &nurbs_patch::const_primitive::curve_knots)\n\t\t.def(\"points\", &nurbs_patch::const_primitive::points)\n\t\t.def(\"point_selections\", &nurbs_patch::const_primitive::point_selections)\n\t\t.def(\"constant_attributes\", &nurbs_patch::const_primitive::constant_attributes)\n\t\t.def(\"patch_attributes\", &nurbs_patch::const_primitive::patch_attributes)\n\t\t.def(\"parameter_attributes\", &nurbs_patch::const_primitive::parameter_attributes)\n\t\t;\n\n\tclass_<nurbs_patch::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"patch_first_points\", &nurbs_patch::primitive::patch_first_points)\n\t\t.def(\"patch_u_point_counts\", &nurbs_patch::primitive::patch_u_point_counts)\n\t\t.def(\"patch_v_point_counts\", &nurbs_patch::primitive::patch_v_point_counts)\n\t\t.def(\"patch_u_orders\", &nurbs_patch::primitive::patch_u_orders)\n\t\t.def(\"patch_v_orders\", &nurbs_patch::primitive::patch_v_orders)\n\t\t.def(\"patch_u_first_knots\", &nurbs_patch::primitive::patch_u_first_knots)\n\t\t.def(\"patch_v_first_knots\", &nurbs_patch::primitive::patch_v_first_knots)\n\t\t.def(\"patch_selections\", &nurbs_patch::primitive::patch_selections)\n\t\t.def(\"patch_materials\", &nurbs_patch::primitive::patch_materials)\n\t\t.def(\"patch_points\", &nurbs_patch::primitive::patch_points)\n\t\t.def(\"patch_point_weights\", &nurbs_patch::primitive::patch_point_weights)\n\t\t.def(\"patch_u_knots\", &nurbs_patch::primitive::patch_u_knots)\n\t\t.def(\"patch_v_knots\", &nurbs_patch::primitive::patch_v_knots)\n\t\t.def(\"patch_trim_loop_counts\", &nurbs_patch::primitive::patch_trim_loop_counts)\n\t\t.def(\"patch_first_trim_loops\", &nurbs_patch::primitive::patch_first_trim_loops)\n\t\t.def(\"trim_loop_first_curves\", &nurbs_patch::primitive::trim_loop_first_curves)\n\t\t.def(\"trim_loop_curve_counts\", &nurbs_patch::primitive::trim_loop_curve_counts)\n\t\t.def(\"trim_loop_selections\", &nurbs_patch::primitive::trim_loop_selections)\n\t\t.def(\"curve_first_points\", &nurbs_patch::primitive::curve_first_points)\n\t\t.def(\"curve_point_counts\", &nurbs_patch::primitive::curve_point_counts)\n\t\t.def(\"curve_orders\", &nurbs_patch::primitive::curve_orders)\n\t\t.def(\"curve_first_knots\", &nurbs_patch::primitive::curve_first_knots)\n\t\t.def(\"curve_selections\", &nurbs_patch::primitive::curve_selections)\n\t\t.def(\"curve_points\", &nurbs_patch::primitive::curve_points)\n\t\t.def(\"curve_point_weights\", &nurbs_patch::primitive::curve_point_weights)\n\t\t.def(\"curve_knots\", &nurbs_patch::primitive::curve_knots)\n\t\t.def(\"points\", &nurbs_patch::primitive::points)\n\t\t.def(\"point_selections\", &nurbs_patch::primitive::point_selections)\n\t\t.def(\"constant_attributes\", &nurbs_patch::primitive::constant_attributes)\n\t\t.def(\"patch_attributes\", &nurbs_patch::primitive::patch_attributes)\n\t\t.def(\"parameter_attributes\", &nurbs_patch::primitive::parameter_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/nurbs_patch_python.h",
    "content": "#ifndef K3DSDK_PYTHON_NURBS_PATCH_PYTHON_H\n#define K3DSDK_PYTHON_NURBS_PATCH_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_nurbs_patch();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_NURBS_PATCH_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/object_model_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3d-ngui-config.h>\n\n#ifdef K3D_BUILD_NGUI_MODULE\n#include <k3dsdk/python/atk_python.h>\n#endif // K3D_BUILD_NGUI_MODULE\n\n#include <k3dsdk/python/angle_axis_python.h>\n#include <k3dsdk/python/any_python.h>\n#include <k3dsdk/python/table_python.h>\n#include <k3dsdk/python/bezier_triangle_patch_python.h>\n#include <k3dsdk/python/bicubic_patch_python.h>\n#include <k3dsdk/python/bilinear_patch_python.h>\n#include <k3dsdk/python/bitmap_python.h>\n#include <k3dsdk/python/blobby_python.h>\n#include <k3dsdk/python/bounding_box3_python.h>\n#include <k3dsdk/python/color_python.h>\n#include <k3dsdk/python/cone_python.h>\n#include <k3dsdk/python/const_table_python.h>\n#include <k3dsdk/python/const_bitmap_python.h>\n#include <k3dsdk/python/const_named_arrays_python.h>\n#include <k3dsdk/python/const_named_tables_python.h>\n#include <k3dsdk/python/const_typed_array_python.h>\n#include <k3dsdk/python/cubic_curve_python.h>\n#include <k3dsdk/python/cylinder_python.h>\n#include <k3dsdk/python/difference_python.h>\n#include <k3dsdk/python/disk_python.h>\n#include <k3dsdk/python/euler_angles_python.h>\n#include <k3dsdk/python/euler_python.h>\n#include <k3dsdk/python/filesystem_python.h>\n#include <k3dsdk/python/file_signal_python.h>\n#include <k3dsdk/python/geometry_python.h>\n#include <k3dsdk/python/hyperboloid_python.h>\n#include <k3dsdk/python/idocument_python.h>\n#include <k3dsdk/python/ifile_change_notifier_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/linear_curve_python.h>\n#include <k3dsdk/python/log_python.h>\n#include <k3dsdk/python/matrix4_python.h>\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/mime_python.h>\n#include <k3dsdk/python/named_arrays_python.h>\n#include <k3dsdk/python/named_tables_python.h>\n#include <k3dsdk/python/node_python.h>\n#include <k3dsdk/python/normal3_python.h>\n#include <k3dsdk/python/nurbs_curve_python.h>\n#include <k3dsdk/python/nurbs_patch_python.h>\n#include <k3dsdk/python/object_model_python.h>\n#include <k3dsdk/python/paraboloid_python.h>\n#include <k3dsdk/python/parallel_python.h>\n#include <k3dsdk/python/plugin_python.h>\n#include <k3dsdk/python/point2_python.h>\n#include <k3dsdk/python/point3_python.h>\n#include <k3dsdk/python/point4_python.h>\n#include <k3dsdk/python/particle_python.h>\n#include <k3dsdk/python/polyhedron_python.h>\n#include <k3dsdk/python/property_python.h>\n#include <k3dsdk/python/resource_python.h>\n#include <k3dsdk/python/ri_python.h>\n#include <k3dsdk/python/script_python.h>\n#include <k3dsdk/python/selection_python.h>\n#include <k3dsdk/python/sphere_python.h>\n#include <k3dsdk/python/teapot_python.h>\n#include <k3dsdk/python/texture3_python.h>\n#include <k3dsdk/python/torus_python.h>\n#include <k3dsdk/python/typed_array_python.h>\n#include <k3dsdk/python/uuid_python.h>\n#include <k3dsdk/python/vector2_python.h>\n#include <k3dsdk/python/vector3_python.h>\n#include <k3dsdk/python/vector4_python.h>\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/application.h>\n#include <k3dsdk/batch_mode.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/geometric_operations.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iplugin_factory_collection.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/render_state_ri.h> // MinGW needs typeinfo\n#include <k3dsdk/scripting.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/time_source.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/user_interface.h>\n\n#include <boost/algorithm/string.hpp>\n\nusing namespace boost::python;\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n////////////////////////////////////////////////////////////////////////////////////\n// k3d module helpers\n\nobject module_create_plugin(const string_t& Type)\n{\n\tthrow std::runtime_error(\"k3d.create_plugin() has been removed, use k3d.plugin.create() instead.\");\n}\n\nvoid module_check_node_environment(const k3d::iscript_engine::context& Context, const string_t& PluginType)\n{\n\tk3d::iscript_engine::context::const_iterator n = Context.find(\"node\");\n\tif(n != Context.end())\n\t{\n\t\tif(k3d::inode* const node = boost::any_cast<k3d::inode*>(n->second))\n\t\t{\n\t\t\tif(node->factory().name() == PluginType)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tk3d::user_interface().error_message(k3d::string_cast(boost::format(\"This script can only be used from within a %1% plugin.\") % PluginType));\n\tthrow std::runtime_error(\"script can only be run from \" + PluginType);\n}\n\nconst double module_length(const object& Value)\n{\n\textract<k3d::vector3> vector3(Value);\n\tif(vector3.check())\n\t\treturn k3d::length(vector3());\n\n\tthrow std::invalid_argument(\"can't calculate length for this type\");\n}\n\nvoid module_log_critical(const string_t& Message)\n{\n\tthrow std::runtime_error(\"k3d.log_critical() has been removed, use k3d.log.critical() instead.\");\n}\n\nvoid module_log_debug(const string_t& Message)\n{\n\tthrow std::runtime_error(\"k3d.log_debug() has been removed, use k3d.log.debug() instead.\");\n}\n\nvoid module_log_error(const string_t& Message)\n{\n\tthrow std::runtime_error(\"k3d.log_error() has been removed, use k3d.log.error() instead.\");\n}\n\nvoid module_log_info(const string_t& Message)\n{\n\tthrow std::runtime_error(\"k3d.log_info() has been removed, use k3d.log.info() instead.\");\n}\n\nvoid module_log_warning(const string_t& Message)\n{\n\tthrow std::runtime_error(\"k3d.log_warning() has been removed, use k3d.log.warning() instead.\");\n}\n\nconst list module_plugins()\n{\n\tthrow std::runtime_error(\"k3d.plugins() has been removed, use k3d.plugin.factory.lookup() instead.\");\n}\n\nstatic const k3d::matrix4 rotate3_a(const k3d::angle_axis& Value)\n{\n\treturn k3d::rotate3(Value);\n}\n\nstatic const k3d::matrix4 rotate3_b(const k3d::euler_angles& Value)\n{\n\treturn k3d::rotate3(k3d::quaternion(Value));\n}\n\nstatic const k3d::matrix4 scale3_a(const double_t X, const double_t Y, const double_t Z)\n{\n\treturn k3d::scale3(X, Y, Z);\n}\n\nstatic const k3d::matrix4 scale3_b(const double_t S)\n{\n\treturn k3d::scale3(S);\n}\n\nstatic const k3d::matrix4 translate3_a(const k3d::vector3& Offset)\n{\n\treturn k3d::translate3(Offset);\n}\n\nstatic const k3d::matrix4 translate3_b(const double_t X, const double_t Y, const double_t Z)\n{\n\treturn k3d::translate3(X, Y, Z);\n}\n\nstatic const k3d::matrix4 translate3_c(const boost::python::tuple& Tuple)\n{\n\tif(len(Tuple) != 3)\n\t\tthrow std::invalid_argument(\"3-tuple required.\");\n\n\treturn k3d::translate3(extract<double>(Tuple[0]), extract<double>(Tuple[1]), extract<double>(Tuple[2]));\n}\n\nobject module_ui()\n{\n\treturn wrap_unknown(k3d::user_interface());\n}\n\nvoid module_exit()\n{\n\tk3d::application().exit();\n}\n\nobject module_new_document()\n{\n\treturn wrap(k3d::application().create_document());\n}\n\nlist module_documents()\n{\n\tlist results;\n\n\tconst k3d::iapplication::document_collection_t documents = k3d::application().documents();\n\tfor(k3d::iapplication::document_collection_t::const_iterator document = documents.begin(); document != documents.end(); ++document)\n\t\tresults.append(wrap(*document));\n\n\treturn results;\n}\n\nvoid module_close_document(idocument_wrapper& Document)\n{\n\tk3d::application().close_document(Document.wrapped());\n}\n\nobject module_open_document(const k3d::filesystem::path& Path)\n{\n\tboost::scoped_ptr<k3d::idocument_importer> importer(k3d::plugin::create<k3d::idocument_importer>(k3d::classes::DocumentImporter()));\n\tif(!importer)\n\t\tthrow std::runtime_error(\"no importer plugin available\");\n\n\tk3d::idocument* const document = k3d::application().create_document();\n\tif(!document)\n\t\tthrow std::runtime_error(\"couldn't create empty document\");\n\n\tif(!importer->read_file(Path, *document))\n\t\tthrow std::runtime_error(\"error loading document\");\n\n\treturn wrap(document);\n}\n\nconst k3d::vector3 module_to_vector3(const k3d::point3& v)\n{\n\treturn k3d::to_vector(v);\n}\n\nconst k3d::point3 module_world_position(iunknown_wrapper& Node)\n{\n\treturn k3d::world_position(Node.wrapped());\n}\n\nobject module_get_time(idocument_wrapper& Document)\n{\n\treturn wrap_unknown(k3d::get_time(Document.wrapped()));\n}\n\n////////////////////////////////////////////////////////////////////////////////////\n// k3d module\n\nBOOST_PYTHON_MODULE(k3d)\n{\n\tdefine_typed_array_classes();\n\tdefine_const_typed_array_classes();\n\n\tdefine_class_angle_axis();\n#ifdef K3D_BUILD_NGUI_MODULE\n\tdefine_class_atk_object();\n#endif // K3D_BUILD_NGUI_MODULE\n\tdefine_class_table();\n\tdefine_class_bitmap();\n\tdefine_class_bounding_box3();\n\tdefine_class_color();\n\tdefine_class_const_table();\n\tdefine_class_const_bitmap();\n\tdefine_class_const_named_arrays();\n\tdefine_class_const_named_tables();\n\tdefine_class_euler_angles();\n\tdefine_class_file_change_receiver();\n\tdefine_class_file_signal();\n\tdefine_class_idocument();\n\tdefine_class_iunknown();\n\tdefine_class_matrix4();\n\tdefine_class_mesh();\n\tdefine_class_const_mesh();\n\tdefine_class_named_arrays();\n\tdefine_class_named_tables();\n\tdefine_class_normal3();\n\tdefine_class_point2();\n\tdefine_class_point3();\n\tdefine_class_point4();\n\tdefine_class_texture3();\n\tdefine_class_uuid();\n\tdefine_class_vector2();\n\tdefine_class_vector3();\n\tdefine_class_vector4();\n\tdefine_namespace_bezier_triangle_patch();\n\tdefine_namespace_bicubic_patch();\n\tdefine_namespace_bilinear_patch();\n\tdefine_namespace_blobby();\n\tdefine_namespace_cone();\n\tdefine_namespace_cubic_curve();\n\tdefine_namespace_cylinder();\n\tdefine_namespace_difference();\n\tdefine_namespace_disk();\n\tdefine_namespace_euler();\n\tdefine_namespace_filesystem();\n\tdefine_namespace_geometry();\n\tdefine_namespace_hyperboloid();\n\tdefine_namespace_linear_curve();\n\tdefine_namespace_log();\n\tdefine_namespace_mime();\n\tdefine_namespace_node();\n\tdefine_namespace_nurbs_curve();\n\tdefine_namespace_nurbs_patch();\n\tdefine_namespace_paraboloid();\n\tdefine_namespace_parallel();\n\tdefine_namespace_plugin();\n\tdefine_namespace_particle();\n\tdefine_namespace_polyhedron();\n\tdefine_namespace_property();\n\tdefine_namespace_resource();\n\tdefine_namespace_ri();\n\tdefine_namespace_script();\n\tdefine_namespace_selection();\n\tdefine_namespace_sphere();\n\tdefine_namespace_teapot();\n\tdefine_namespace_torus();\n\n\tdef(\"batch_mode\", k3d::batch_mode,\n\t\t\"Returns True if batch (no user intervention) mode is enabled for the user interface.\\n\"\n\t\t\"@note: Well-behaved scripts should not prompt the user for input if batch mode is enabled.\");\n\tdef(\"check_node_environment\", module_check_node_environment,\n\t\t\"Checks to see whether the current script is running from within the given node type.\");\n\tdef(\"close_document\", module_close_document,\n\t\t\"Closes an open document.\");\n\tdef(\"create_plugin\", module_create_plugin,\n\t\t\"Creates an application plugin instance by name (fails if there is no application plugin factory with the given name).\");\n\tdef(\"documents\", module_documents,\n\t\t\"Returns a list containing all open documents.\");\n\tdef(\"exit\", module_exit,\n\t\t\"Request program exit (may be overridden by user input).\");\n\tdef(\"identity3\", k3d::identity3,\n\t\t\"Returns a L{matrix4} containing a three-dimensional identity matrix.\");\n\tdef(\"intersect_lines\", k3d::intersect_lines,\n\t\t\"Find the point at which two infinite lines intersect.\");\n\tdef(\"inverse\", k3d::inverse,\n\t\t\"Computes the inverse of a matrix.\");\n\tdef(\"length\", module_length,\n\t\t\"Returns the length of a L{vector3}.\");\n\tdef(\"log_critical\", module_log_critical,\n\t\t\"Sends a critical message to the K-3D log.\");\n\tdef(\"log_debug\", module_log_debug,\n\t\t\"Sends a debug message to the K-3D log.\");\n\tdef(\"log_error\", module_log_error,\n\t\t\"Sends an error message to the K-3D log.\");\n\tdef(\"log_info\", module_log_info,\n\t\t\"Sends an informational message to the K-3D log.\");\n\tdef(\"log_warning\", module_log_warning,\n\t\t\"Sends a warning message to the K-3D log.\");\n\tdef(\"new_document\", module_new_document,\n\t\t\"Returns a new (completely empty) document.\");\n\tdef(\"open_document\", module_open_document,\n\t\t\"Opens an existing document stored on disk.\");\n\tdef(\"plugins\", module_plugins,\n\t\t\"Returns a list containing the set of all plugin factories.\");\n\tdef(\"rotate3\", rotate3_a,\n\t\t\"Returns a L{matrix4} containing a three-dimensional rotation matrix.\");\n\tdef(\"rotate3\", rotate3_b,\n\t\t\"Returns a L{matrix4} containing a three-dimensional rotation matrix.\");\n\tdef(\"scale3\", scale3_a,\n\t\t\"Returns a L{matrix4} containing a three-dimensional scaling matrix.\");\n\tdef(\"scale3\", scale3_b,\n\t\t\"Returns a L{matrix4} containing a three-dimensional scaling matrix.\");\n\tdef(\"share_path\", k3d::share_path,\n\t\t\"Returns the runtime path to shared data.\");\n\tdef(\"to_vector3\", module_to_vector3,\n\t\t\"Explicit conversion from point3 to vector3\");\n\tdef(\"translate3\", translate3_a,\n\t\t\"Returns a L{matrix4} containing a three-dimensional translation matrix.\");\n\tdef(\"translate3\", translate3_b,\n\t\t\"Returns a L{matrix4} containing a three-dimensional translation matrix.\");\n\tdef(\"translate3\", translate3_c,\n\t\t\"Returns a L{matrix4} containing a three-dimensional translation matrix.\");\n\tdef(\"ui\", module_ui,\n\t\t\"Returns the singleton runtime user interface plugin instance.\");\n\tdef(\"world_position\", module_world_position,\n\t\t\"Returns a node's position in world coordinates (returns the origin for non-transformable nodes)\");\n\tdef(\"get_time\", module_get_time,\n\t\t\"Returns the time property for a document (could return NULL)\");\n\n\tscope().attr(\"__doc__\") = \"Provides access to the K-3D API\";\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/object_model_python.h",
    "content": "#ifndef K3DSDK_PYTHON_OBJECT_MODEL_PYTHON_H\n#define K3DSDK_PYTHON_OBJECT_MODEL_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nextern \"C\" { void initk3d(); }\n\n#endif // !K3DSDK_PYTHON_OBJECT_MODEL_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/offscreen_context_factory_gl_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/gl/offscreen_context_factory.h>\n#include <k3dsdk/gl/offscreen_context.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/offscreen_context_factory_gl_python.h>\n#include <k3dsdk/python/utility_python.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic void create(iunknown_wrapper& Self, const uint_t Width, const uint_t Height)\n{\n\tdelete Self.wrapped<k3d::gl::offscreen_context_factory>().create(Width, Height);\n}\n\nvoid define_methods_offscreen_context_factory_gl(k3d::iunknown& Interface, boost::python::object& Instance)\n{\n\tif(!dynamic_cast<k3d::gl::offscreen_context_factory*>(&Interface))\n\t\treturn;\n\n\tutility::add_method(utility::make_function(&create, \"Creates an OpenGL context.\"), \"create\", Instance);\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/offscreen_context_factory_gl_python.h",
    "content": "#ifndef K3DSDK_PYTHON_OFFSCREEN_CONTEXT_FACTORY_GL_PYTHON_H\n#define K3DSDK_PYTHON_OFFSCREEN_CONTEXT_FACTORY_GL_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object_fwd.hpp>\n\nnamespace k3d\n{\n\nclass iunknown;\n\nnamespace python\n{\n\nvoid define_methods_offscreen_context_factory_gl(iunknown& Interface, boost::python::object& Instance);\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_OFFSCREEN_CONTEXT_FACTORY_GL_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/owned_instance_wrapper_python.h",
    "content": "#ifndef K3DSDK_PYTHON_OWNED_INSTANCE_WRAPPER_PYTHON_H\n#define K3DSDK_PYTHON_OWNED_INSTANCE_WRAPPER_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python/object.hpp>\n#include <boost/shared_ptr.hpp>\n#include <stdexcept>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n////////////////////////////////////////////////////////////////////////////////////\n// owned_instance_wrapper\n\ntemplate<typename T>\nclass owned_instance_wrapper\n{\npublic:\n\ttypedef T wrapped_type;\n\n\towned_instance_wrapper() :\n\t\tm_wrapped(0)\n\t{\n\t}\n\n\towned_instance_wrapper(T* Wrapped) :\n\t\tm_wrapped(Wrapped)\n\t{\n\t}\n\n\towned_instance_wrapper(T& Wrapped) :\n\t\tm_wrapped(&Wrapped)\n\t{\n\t}\n\n\tfriend const bool operator==(const owned_instance_wrapper& lhs, const owned_instance_wrapper& rhs)\n\t{\n\t\treturn lhs.m_wrapped == rhs.m_wrapped;\n\t}\n\n\tT& wrapped() const\n\t{\n\t\tif(!m_wrapped)\n\t\t\tthrow std::runtime_error(\"wrapped interface is null\");\n\n\t\treturn *m_wrapped;\n\t}\n\n\tT* wrapped_ptr() const\n\t{\n\t\treturn m_wrapped;\n\t}\n\t\nprivate:\n\tboost::shared_ptr<T> m_wrapped;\n};\n\ntemplate<typename T>\nboost::python::object wrap_owned(T* Wrapped)\n{\n\treturn Wrapped ? boost::python::object(owned_instance_wrapper<T>(*Wrapped)) : boost::python::object();\n}\n\ntemplate<typename T>\nboost::python::object wrap_owned(T& Wrapped)\n{\n\treturn boost::python::object(owned_instance_wrapper<T>(Wrapped));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_OWNED_INSTANCE_WRAPPER_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/paraboloid_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/paraboloid_python.h>\n\n#include <k3dsdk/paraboloid.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass paraboloid\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::paraboloid::const_primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object radii(wrapper& Self) { return wrap(Self.wrapped().radii); }\n\t\tstatic object z_min(wrapper& Self) { return wrap(Self.wrapped().z_min); }\n\t\tstatic object z_max(wrapper& Self) { return wrap(Self.wrapped().z_max); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::paraboloid::primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object radii(wrapper& Self) { return wrap(Self.wrapped().radii); }\n\t\tstatic object z_min(wrapper& Self) { return wrap(Self.wrapped().z_min); }\n\t\tstatic object z_max(wrapper& Self) { return wrap(Self.wrapped().z_max); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::paraboloid::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::paraboloid::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::paraboloid::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_paraboloid()\n{\n\tscope outer = class_<paraboloid>(\"paraboloid\", no_init)\n\t\t.def(\"create\", &paraboloid::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &paraboloid::validate)\n\t\t.def(\"validate\", &paraboloid::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<paraboloid::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"matrices\", &paraboloid::const_primitive::matrices)\n\t\t.def(\"materials\", &paraboloid::const_primitive::materials)\n\t\t.def(\"radii\", &paraboloid::const_primitive::radii)\n\t\t.def(\"z_min\", &paraboloid::const_primitive::z_min)\n\t\t.def(\"z_max\", &paraboloid::const_primitive::z_max)\n\t\t.def(\"sweep_angles\", &paraboloid::const_primitive::sweep_angles)\n\t\t.def(\"selections\", &paraboloid::const_primitive::selections)\n\t\t.def(\"constant_attributes\", &paraboloid::const_primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &paraboloid::const_primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &paraboloid::const_primitive::parameter_attributes)\n\t\t;\n\n\tclass_<paraboloid::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"matrices\", &paraboloid::primitive::matrices)\n\t\t.def(\"materials\", &paraboloid::primitive::materials)\n\t\t.def(\"radii\", &paraboloid::primitive::radii)\n\t\t.def(\"z_min\", &paraboloid::primitive::z_min)\n\t\t.def(\"z_max\", &paraboloid::primitive::z_max)\n\t\t.def(\"sweep_angles\", &paraboloid::primitive::sweep_angles)\n\t\t.def(\"selections\", &paraboloid::primitive::selections)\n\t\t.def(\"constant_attributes\", &paraboloid::primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &paraboloid::primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &paraboloid::primitive::parameter_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/paraboloid_python.h",
    "content": "#ifndef K3DSDK_PYTHON_PARABOLOID_PYTHON_H\n#define K3DSDK_PYTHON_PARABOLOID_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_paraboloid();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_PARABOLOID_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/parallel_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/parallel_python.h>\n\n#include <k3dsdk/parallel/threads.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass parallel\n{\npublic:\n};\n\n\nvoid define_namespace_parallel()\n{\n\tclass_<parallel>(\"parallel\", no_init)\n\t\t.def(\"grain_size\", k3d::parallel::grain_size,\n\t\t\t\"Returns the global grain size to be used for parallel computation.\")\n\t\t.def(\"set_grain_size\", k3d::parallel::set_grain_size,\n\t\t\t\"Sets the global grain size to be used for parallel computation.\")\n\t\t.def(\"set_thread_count\", k3d::parallel::set_thread_count,\n\t\t\t\"Sets the number of threads to be used for parallel computation (quietly ignored if parallel computation wasn't enabled in the build.\")\n\t\t.staticmethod(\"grain_size\")\n\t\t.staticmethod(\"set_grain_size\")\n\t\t.staticmethod(\"set_thread_count\");\n\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/parallel_python.h",
    "content": "#ifndef K3DSDK_PYTHON_PARALLEL_PYTHON_H\n#define K3DSDK_PYTHON_PARALLEL_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_parallel();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_PARALLEL_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/particle_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/particle_python.h>\n\n#include <k3dsdk/particle.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass particle\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::particle::const_primitive> wrapper;\n\n\t\tstatic object material(wrapper& Self) { return wrap(Self.wrapped().material); }\n\t\tstatic object points(wrapper& Self) { return wrap(Self.wrapped().points); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::particle::primitive> wrapper;\n\n\t\tstatic object material(wrapper& Self) { return wrap(Self.wrapped().material); }\n\t\tstatic object points(wrapper& Self) { return wrap(Self.wrapped().points); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::particle::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::particle::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::particle::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_particle()\n{\n\tscope outer = class_<particle>(\"particle\", no_init)\n\t\t.def(\"create\", &particle::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &particle::validate)\n\t\t.def(\"validate\", &particle::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<particle::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"material\", &particle::const_primitive::material)\n\t\t.def(\"points\", &particle::const_primitive::points)\n\t\t.def(\"constant_attributes\", &particle::const_primitive::constant_attributes)\n\t\t.def(\"vertex_attributes\", &particle::const_primitive::vertex_attributes)\n\t\t;\n\n\tclass_<particle::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"material\", &particle::primitive::material)\n\t\t.def(\"points\", &particle::primitive::points)\n\t\t.def(\"constant_attributes\", &particle::primitive::constant_attributes)\n\t\t.def(\"vertex_attributes\", &particle::primitive::vertex_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/particle_python.h",
    "content": "#ifndef K3DSDK_PYTHON_PARTICLE_PYTHON_H\n#define K3DSDK_PYTHON_PARTICLE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_particle();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_PARTICLE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/plugin_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/mime_types.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/python/idocument_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/plugin_python.h>\n\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass plugin\n{\npublic:\n\tstatic boost::python::list wrap_factories(const k3d::plugin::factory::collection_t& Factories)\n\t{\n\t\tboost::python::list python_factories;\n\n\t\tfor(k3d::plugin::factory::collection_t::const_iterator factory = Factories.begin(); factory != Factories.end(); ++factory)\n\t\t\tpython_factories.append(wrap_unknown(*factory));\n\n\t\treturn python_factories;\n\t}\n\n\tstatic boost::python::object create_by_uuid(const uuid& ID)\n\t{\n\t\treturn wrap_unknown(k3d::plugin::create(ID));\n\t}\n\n\tstatic boost::python::object create_by_name(const string_t& Type)\n\t{\n\t\treturn wrap_unknown(k3d::plugin::create(Type));\n\t}\n\n\tstatic boost::python::object create_by_factory(const iunknown_wrapper& Factory)\n\t{\n\t\treturn wrap_unknown(k3d::plugin::create(dynamic_cast<k3d::iplugin_factory&>(Factory.wrapped())));\n\t}\n\n\tstatic boost::python::object document_create_by_uuid(const uuid& ID, const idocument_wrapper& Document)\n\t{\n\t\treturn wrap_unknown(k3d::plugin::create(ID, Document.wrapped()));\n\t}\n\n\tstatic boost::python::object document_create_by_name(const string_t& Type, const idocument_wrapper& Document)\n\t{\n\t\treturn wrap_unknown(k3d::plugin::create(Type, Document.wrapped()));\n\t}\n\n\tstatic boost::python::object document_create_by_factory(const iunknown_wrapper& Factory, const idocument_wrapper& Document)\n\t{\n\t\treturn wrap_unknown(k3d::plugin::create(dynamic_cast<k3d::iplugin_factory&>(Factory.wrapped()), Document.wrapped()));\n\t}\n\n\tclass factory\n\t{\n\tpublic:\n\t\tstatic boost::python::list lookup()\n\t\t{\n\t\t\treturn wrap_factories(k3d::plugin::factory::lookup());\n\t\t}\n\n\t\tstatic boost::python::object lookup_by_uuid(const uuid& ID)\n\t\t{\n\t\t\treturn wrap_unknown(k3d::plugin::factory::lookup(ID));\n\t\t}\n\n\t\tstatic boost::python::object lookup_by_name(const string_t& Name)\n\t\t{\n\t\t\treturn wrap_unknown(k3d::plugin::factory::lookup(Name));\n\t\t}\n\n\t\tstatic boost::python::list lookup_by_metadata(const string_t& MetadataName, const string_t& MetadataValue)\n\t\t{\n\t\t\treturn wrap_factories(k3d::plugin::factory::lookup(MetadataName, MetadataValue));\n\t\t}\n\n\t\tstatic boost::python::list lookup_by_mime_type(const k3d::mime::type& Type)\n\t\t{\n\t\t\treturn wrap_factories(k3d::plugin::factory::lookup(Type));\n\t\t}\n\t};\n};\n\nvoid define_namespace_plugin()\n{\n\tboost::python::scope outer = boost::python::class_<plugin>(\"plugin\", boost::python::no_init)\n\t\t.def(\"create\", plugin::create_by_name,\n\t\t\t\"Returns a new application plugin instance, or None.\")\n\t\t.def(\"create\", plugin::create_by_uuid,\n\t\t\t\"Returns a new application plugin instance, or None.\")\n\t\t.def(\"create\", plugin::create_by_factory,\n\t\t\t\"Returns a new application plugin instance, or None.\")\n\t\t.def(\"create\", plugin::document_create_by_name,\n\t\t\t\"Returns a new document plugin instance, or None.\")\n\t\t.def(\"create\", plugin::document_create_by_uuid,\n\t\t\t\"Returns a new document plugin instance, or None.\")\n\t\t.def(\"create\", plugin::document_create_by_factory,\n\t\t\t\"Returns a new document plugin instance, or None.\")\n\t\t.staticmethod(\"create\");\n\n\tboost::python::class_<plugin::factory>(\"factory\", boost::python::no_init)\n\t\t.def(\"lookup\", plugin::factory::lookup,\n\t\t\t\"Returns a list containing all available plugin factories.\")\n\t\t.def(\"lookup\", plugin::factory::lookup_by_uuid,\n\t\t\t\"Returns the plugin factory that matches the given id, or None.\")\n\t\t.def(\"lookup\", plugin::factory::lookup_by_name,\n\t\t\t\"Returns the plugin factory that matches the given name, or None.\")\n\t\t.def(\"lookup\", plugin::factory::lookup_by_metadata,\n\t\t\t\"Returns a list containing all plugin factories that match the given metadata name and value.\")\n\t\t.def(\"lookup\", plugin::factory::lookup_by_mime_type,\n\t\t\t\"Returns a list containing all plugin factories that match the given MIME type.\")\n\t\t.staticmethod(\"lookup\");\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/plugin_python.h",
    "content": "#ifndef K3DSDK_PYTHON_PLUGIN_PYTHON_H\n#define K3DSDK_PYTHON_PLUGIN_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_plugin();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_PLUGIN_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/point2_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/point2_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/vectors.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_point2()\n{\n\tclass_<k3d::point2>(\"point2\",\n\t\t\"Stores a position in two-dimensional space\", no_init)\n\t\t.def(init<double, double>())\n\t\t.def(init<const k3d::point2&>())\n\t\t.def(\"__len__\", &utility::constant_len_len<k3d::point2, 2>)\n\t\t.def(\"__getitem__\", &utility::constant_len_get_item<k3d::point2, 2, k3d::double_t>)\n\t\t.def(\"__setitem__\", &utility::constant_len_set_item<k3d::point2, 2, k3d::double_t>)\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self + self)\n\t\t.def(self - self)\n\t\t.def(self * double())\n\t\t.def(double() * self)\n\t\t.def(self *= double())\n\t\t.def(self /= double())\n\t\t.def(self += k3d::vector2())\n\t\t.def(self -= k3d::vector2())\n\t\t.def(self_ns::str(self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/point2_python.h",
    "content": "#ifndef K3DSDK_PYTHON_POINT2_PYTHON_H\n#define K3DSDK_PYTHON_POINT2_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_point2();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_POINT2_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/point3_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/point3_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/vectors.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_point3()\n{\n\tclass_<k3d::point3>(\"point3\",\n\t\t\"Stores a position in three-dimensional space\", no_init)\n\t\t.def(init<double_t, double_t, double_t>())\n\t\t.def(init<const k3d::point3&>())\n\t\t.def(\"__len__\", &utility::constant_len_len<k3d::point3, 3>)\n\t\t.def(\"__getitem__\", &utility::constant_len_get_item<k3d::point3, 3, k3d::double_t>)\n\t\t.def(\"__setitem__\", &utility::constant_len_set_item<k3d::point3, 3, k3d::double_t>)\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self + self)\n\t\t.def(self - self)\n\t\t.def(self * double_t())\n\t\t.def(double_t() * self)\n\t\t.def(self *= double_t())\n\t\t.def(self /= double_t())\n\t\t.def(self += k3d::vector3())\n\t\t.def(self -= k3d::vector3())\n\t\t.def(self_ns::str(self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/point3_python.h",
    "content": "#ifndef K3DSDK_PYTHON_POINT3_PYTHON_H\n#define K3DSDK_PYTHON_POINT3_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_point3();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_POINT3_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/point4_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/point4_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/vectors.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_point4()\n{\n\tclass_<k3d::point4>(\"point4\",\n\t\t\"Stores a position in four-dimensional space\", no_init)\n\t\t.def(init<double_t, double_t, double_t, double_t>())\n\t\t.def(init<const k3d::point4&>())\n\t\t.def(\"__len__\", &utility::constant_len_len<k3d::point4, 4>)\n\t\t.def(\"__getitem__\", &utility::constant_len_get_item<k3d::point4, 4, k3d::double_t>)\n\t\t.def(\"__setitem__\", &utility::constant_len_set_item<k3d::point4, 4, k3d::double_t>)\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self + self)\n\t\t.def(self - self)\n\t\t.def(self * double_t())\n\t\t.def(double_t() * self)\n\t\t.def(self += k3d::vector4())\n\t\t.def(self -= k3d::vector4())\n\t\t.def(self *= double_t())\n\t\t.def(self /= double_t())\n\t\t.def(self_ns::str(self));\n\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/point4_python.h",
    "content": "#ifndef K3DSDK_PYTHON_POINT4_PYTHON_H\n#define K3DSDK_PYTHON_POINT4_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_point4();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_POINT4_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/polyhedron_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/polyhedron_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass polyhedron\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::polyhedron::const_primitive> wrapper;\n\n\t\tstatic object shell_types(wrapper& Self) { return wrap(Self.wrapped().shell_types); }\n\t\tstatic object face_shells(wrapper& Self) { return wrap(Self.wrapped().face_shells); }\n\t\tstatic object face_first_loops(wrapper& Self) { return wrap(Self.wrapped().face_first_loops); }\n\t\tstatic object face_loop_counts(wrapper& Self) { return wrap(Self.wrapped().face_loop_counts); }\n\t\tstatic object face_selections(wrapper& Self) { return wrap(Self.wrapped().face_selections); }\n\t\tstatic object face_materials(wrapper& Self) { return wrap(Self.wrapped().face_materials); }\n\t\tstatic object loop_first_edges(wrapper& Self) { return wrap(Self.wrapped().loop_first_edges); }\n\t\tstatic object clockwise_edges(wrapper& Self) { return wrap(Self.wrapped().clockwise_edges); }\n\t\tstatic object edge_selections(wrapper& Self) { return wrap(Self.wrapped().edge_selections); }\n\t\tstatic object vertex_points(wrapper& Self) { return wrap(Self.wrapped().vertex_points); }\n\t\tstatic object vertex_selections(wrapper& Self) { return wrap(Self.wrapped().vertex_selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object face_attributes(wrapper& Self) { return wrap(Self.wrapped().face_attributes); }\n\t\tstatic object edge_attributes(wrapper& Self) { return wrap(Self.wrapped().edge_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::polyhedron::primitive> wrapper;\n\n\t\tstatic object shell_types(wrapper& Self) { return wrap(Self.wrapped().shell_types); }\n\t\tstatic object face_shells(wrapper& Self) { return wrap(Self.wrapped().face_shells); }\n\t\tstatic object face_first_loops(wrapper& Self) { return wrap(Self.wrapped().face_first_loops); }\n\t\tstatic object face_loop_counts(wrapper& Self) { return wrap(Self.wrapped().face_loop_counts); }\n\t\tstatic object face_selections(wrapper& Self) { return wrap(Self.wrapped().face_selections); }\n\t\tstatic object face_materials(wrapper& Self) { return wrap(Self.wrapped().face_materials); }\n\t\tstatic object loop_first_edges(wrapper& Self) { return wrap(Self.wrapped().loop_first_edges); }\n\t\tstatic object clockwise_edges(wrapper& Self) { return wrap(Self.wrapped().clockwise_edges); }\n\t\tstatic object edge_selections(wrapper& Self) { return wrap(Self.wrapped().edge_selections); }\n\t\tstatic object vertex_points(wrapper& Self) { return wrap(Self.wrapped().vertex_points); }\n\t\tstatic object vertex_selections(wrapper& Self) { return wrap(Self.wrapped().vertex_selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object face_attributes(wrapper& Self) { return wrap(Self.wrapped().face_attributes); }\n\t\tstatic object edge_attributes(wrapper& Self) { return wrap(Self.wrapped().edge_attributes); }\n\t\tstatic object vertex_attributes(wrapper& Self) { return wrap(Self.wrapped().vertex_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::polyhedron::create(Mesh.wrapped()));\n\t}\n\n\tstatic object create2(mesh_wrapper& Mesh, list Vertices, list VertexCounts, list VertexIndices, object Material)\n\t{\n\t\tk3d::mesh::points_t vertices;\n\t\tk3d::mesh::counts_t vertex_counts;\n\t\tk3d::mesh::indices_t vertex_indices;\n\t\tk3d::imaterial* const material = Material ? &dynamic_cast<k3d::imaterial&>(boost::python::extract<iunknown_wrapper>(Material)().wrapped())  : 0;\n\n\t\tutility::copy(Vertices, vertices);\n\t\tutility::copy(VertexCounts, vertex_counts);\n\t\tutility::copy(VertexIndices, vertex_indices);\n\n\t\treturn wrap_owned(k3d::polyhedron::create(Mesh.wrapped(), vertices, vertex_counts, vertex_indices, material));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::polyhedron::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::polyhedron::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic bool_t is_triangles(polyhedron::const_primitive::wrapper& Polyhedron)\n\t{\n\t\treturn k3d::polyhedron::is_triangles(Polyhedron.wrapped());\n\t}\n\n\tstatic bool_t is_triangles2(polyhedron::primitive::wrapper& Polyhedron)\n\t{\n\t\treturn k3d::polyhedron::is_triangles(Polyhedron.wrapped());\n\t}\n\n\tstatic bool_t is_solid(polyhedron::const_primitive::wrapper& Polyhedron)\n\t{\n\t\treturn k3d::polyhedron::is_solid(Polyhedron.wrapped());\n\t}\n\n\tstatic bool_t is_solid2(polyhedron::primitive::wrapper& Polyhedron)\n\t{\n\t\treturn k3d::polyhedron::is_solid(Polyhedron.wrapped());\n\t}\n};\n\nvoid define_namespace_polyhedron()\n{\n\tscope outer = class_<polyhedron>(\"polyhedron\",\n\t\t\"Provides functionality to create and manipulate polyhedron mesh primitives.\", no_init)\n\t\t.def(\"create\", &polyhedron::create,\n\t\t\t\"Creates an empty polyhedron, returning an object that can be used to access all of its arrays.\")\n\t\t.def(\"create\", &polyhedron::create2,\n\t\t\t\"Creates a polyhedron, populating it from a list of vertices, a list of per-face vertex counts, a list of per-face vertices, and an optional material node.\")\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &polyhedron::validate)\n\t\t.def(\"validate\", &polyhedron::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t.def(\"is_triangles\", &polyhedron::is_triangles)\n\t\t.def(\"is_triangles\", &polyhedron::is_triangles2)\n\t\t.staticmethod(\"is_triangles\")\n\t\t.def(\"is_solid\", &polyhedron::is_solid)\n\t\t.def(\"is_solid\", &polyhedron::is_solid2)\n\t\t.staticmethod(\"is_solid\")\n\t\t;\n\n\tenum_<k3d::polyhedron::polyhedron_type>(\"shell_type\")\n\t\t.value(\"POLYGONS\", k3d::polyhedron::POLYGONS)\n\t\t.value(\"CATMULL_CLARK\", k3d::polyhedron::CATMULL_CLARK)\n\t\t.attr(\"__module__\") = \"k3d\";\n\n\tclass_<polyhedron::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"shell_types\", &polyhedron::const_primitive::shell_types)\n\t\t.def(\"face_shells\", &polyhedron::const_primitive::face_shells)\n\t\t.def(\"face_first_loops\", &polyhedron::const_primitive::face_first_loops)\n\t\t.def(\"face_loop_counts\", &polyhedron::const_primitive::face_loop_counts)\n\t\t.def(\"face_selections\", &polyhedron::const_primitive::face_selections)\n\t\t.def(\"face_materials\", &polyhedron::const_primitive::face_materials)\n\t\t.def(\"loop_first_edges\", &polyhedron::const_primitive::loop_first_edges)\n\t\t.def(\"clockwise_edges\", &polyhedron::const_primitive::clockwise_edges)\n\t\t.def(\"edge_selections\", &polyhedron::const_primitive::edge_selections)\n\t\t.def(\"vertex_points\", &polyhedron::const_primitive::vertex_points)\n\t\t.def(\"vertex_selections\", &polyhedron::const_primitive::vertex_selections)\n\t\t.def(\"constant_attributes\", &polyhedron::const_primitive::constant_attributes)\n\t\t.def(\"face_attributes\", &polyhedron::const_primitive::face_attributes)\n\t\t.def(\"edge_attributes\", &polyhedron::const_primitive::edge_attributes)\n\t\t.def(\"vertex_attributes\", &polyhedron::const_primitive::vertex_attributes)\n\t\t;\n\n\tclass_<polyhedron::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"shell_types\", &polyhedron::primitive::shell_types)\n\t\t.def(\"face_shells\", &polyhedron::primitive::face_shells)\n\t\t.def(\"face_first_loops\", &polyhedron::primitive::face_first_loops)\n\t\t.def(\"face_loop_counts\", &polyhedron::primitive::face_loop_counts)\n\t\t.def(\"face_selections\", &polyhedron::primitive::face_selections)\n\t\t.def(\"face_materials\", &polyhedron::primitive::face_materials)\n\t\t.def(\"loop_first_edges\", &polyhedron::primitive::loop_first_edges)\n\t\t.def(\"clockwise_edges\", &polyhedron::primitive::clockwise_edges)\n\t\t.def(\"edge_selections\", &polyhedron::primitive::edge_selections)\n\t\t.def(\"vertex_points\", &polyhedron::primitive::vertex_points)\n\t\t.def(\"vertex_selections\", &polyhedron::primitive::vertex_selections)\n\t\t.def(\"constant_attributes\", &polyhedron::primitive::constant_attributes)\n\t\t.def(\"face_attributes\", &polyhedron::primitive::face_attributes)\n\t\t.def(\"edge_attributes\", &polyhedron::primitive::edge_attributes)\n\t\t.def(\"vertex_attributes\", &polyhedron::primitive::vertex_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/polyhedron_python.h",
    "content": "#ifndef K3DSDK_PYTHON_POLYHEDRON_PYTHON_H\n#define K3DSDK_PYTHON_POLYHEDRON_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_polyhedron();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_POLYHEDRON_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/property_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/inode.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/python/idocument_python.h>\n#include <k3dsdk/python/iunknown_python.h>\n\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass property\n{\npublic:\n\tstatic void connect(idocument_wrapper& Document, iunknown_wrapper& From, iunknown_wrapper& To)\n\t{\n\t\tk3d::iproperty* const from = From.wrapped_ptr<k3d::iproperty>();\n\t\tif(!from)\n\t\t\tthrow std::invalid_argument(\"From argument must be a valid property object.\");\n\n\t\tk3d::iproperty* const to = To.wrapped_ptr<k3d::iproperty>();\n\t\tif(!to)\n\t\t\tthrow std::invalid_argument(\"To argument must be a valid property object.\");\n\n\t\tk3d::property::connect(Document.wrapped(), *from, *to);\n\t}\n\n\tstatic boost::python::object connection(idocument_wrapper& Document, iunknown_wrapper& Property)\n\t{\n\t\tk3d::iproperty* const property = Property.wrapped_ptr<k3d::iproperty>();\n\t\tif(!property)\n\t\t\tthrow std::invalid_argument(\"Argument must be a valid property.\");\n\n\t\treturn wrap_unknown(k3d::property::connection(Document.wrapped(), *property));\n\t}\n\n\tstatic void disconnect(idocument_wrapper& Document, iunknown_wrapper& Property)\n\t{\n\t\tk3d::iproperty* const property = Property.wrapped_ptr<k3d::iproperty>();\n\t\tif(!property)\n\t\t\tthrow std::invalid_argument(\"Argument must be a valid property.\");\n\n\t\tk3d::property::disconnect(Document.wrapped(), *property);\n\t}\n\n\tstatic boost::python::object create(iunknown_wrapper& Self, const string_t& Type, const string_t& Name, const string_t& Label, const string_t& Description)\n\t{\n\t\tk3d::inode* const node = Self.wrapped_ptr<k3d::inode>();\n\t\tif(!node)\n\t\t\tthrow std::runtime_error(\"missing node\");\n\n\t\tk3d::iproperty* const result = k3d::property::create(*node, Type, Name, Label, Description);\n\t\tif(!result)\n\t\t\tthrow std::invalid_argument(\"unknown user property type: \" + Type);\n\n\t\treturn wrap_unknown(result);\n\t}\n\n\tclass ri\n\t{\n\tpublic:\n\t\tstatic boost::python::object create_attribute(iunknown_wrapper& Self, const string_t& Type, const string_t& AttributeName, const string_t& Name, const string_t& Label, const string_t& Description)\n\t\t{\n\t\t\tk3d::inode* const node = Self.wrapped_ptr<k3d::inode>();\n\t\t\tif(!node)\n\t\t\t\tthrow std::runtime_error(\"missing node\");\n\n\t\t\tk3d::iproperty* const result = k3d::property::ri::create_attribute(*node, Type, AttributeName, Name, Label, Description);\n\t\t\tif(!result)\n\t\t\t\tthrow std::invalid_argument(\"unknown attribute type: \" + Type);\n\n\t\t\treturn wrap_unknown(result);\n\t\t}\n\n\t\tstatic boost::python::object create_option(iunknown_wrapper& Self, const string_t& Type, const string_t& OptionName, const string_t& Name, const string_t& Label, const string_t& Description)\n\t\t{\n\t\t\tk3d::inode* const node = Self.wrapped_ptr<k3d::inode>();\n\t\t\tif(!node)\n\t\t\t\tthrow std::runtime_error(\"missing node\");\n\n\t\t\tk3d::iproperty* const result = k3d::property::ri::create_option(*node, Type, OptionName, Name, Label, Description);\n\t\t\tif(!result)\n\t\t\t\tthrow std::invalid_argument(\"unknown option type: \" + Type);\n\n\t\t\treturn wrap_unknown(result);\n\t\t}\n\t};\n};\n\nvoid define_namespace_property()\n{\n\tboost::python::scope outer = boost::python::class_<property>(\"property\", boost::python::no_init)\n\t\t.def(\"connect\", property::connect,\n\t\t\t\"Makes a pipeline connection between two properties.\")\n\t\t.staticmethod(\"connect\")\n\n\t\t.def(\"connection\", property::connection,\n\t\t\t\"Returns the connection (if any) coming into the given property.\")\n\t\t.staticmethod(\"connection\")\n\n\t\t.def(\"disconnect\", property::disconnect,\n\t\t\t\"Breaks the pipeline connection (if any) to the given property.\")\n\t\t.staticmethod(\"disconnect\")\n\n\t\t.def(\"create\", property::create,\n\t\t\t\"Adds a new property to an existing node.\")\n\t\t.staticmethod(\"create\")\n\t\t;\n\n\tboost::python::class_<property::ri>(\"ri\", boost::python::no_init)\n\t\t.def(\"create_attribute\", property::ri::create_attribute,\n\t\t\t\"Adds a new RenderMan attribute property to an existing node.\")\n\t\t.staticmethod(\"create_attribute\")\n\n\t\t.def(\"create_option\", property::ri::create_option,\n\t\t\t\"Adds a new RenderMan option property to an existing node.\")\n\t\t.staticmethod(\"create_option\")\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/property_python.h",
    "content": "#ifndef K3DSDK_PYTHON_PROPERTY_PYTHON_H\n#define K3DSDK_PYTHON_PROPERTY_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_property();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_PROPERTY_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/resource_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/resource_python.h>\n\n#include <k3dsdk/resource/resource.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass resource\n{\npublic:\n\tstatic const list keys()\n\t{\n\t\tlist python_keys;\n\n\t\tconst k3d::resource::keys_t& keys = k3d::resource::keys();\n\t\tfor(k3d::resource::keys_t::const_iterator key = keys.begin(); key != keys.end(); ++key)\n\t\t\tpython_keys.append(*key);\n\n\t\treturn python_keys;\n\t}\n};\n\n\nvoid define_namespace_resource()\n{\n\tclass_<resource>(\"resource\", no_init)\n\t\t.def(\"keys\", resource::keys,\n\t\t\t\"Returns a list containing the set of all resources.\")\n\t\t.def(\"get_string\", k3d::resource::get_string,\n\t\t\t\"Returns a resource as a string, or empty string if the resource does not exist.\")\n\t\t.staticmethod(\"keys\")\n\t\t.staticmethod(\"get_string\");\n\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/resource_python.h",
    "content": "#ifndef K3DSDK_PYTHON_RESOURCE_PYTHON_H\n#define K3DSDK_PYTHON_RESOURCE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_resource();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_RESOURCE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/ri_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/ri_python.h>\n\n#include <k3dsdk/ishader_collection_ri.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass ri\n{\n};\n\nstatic void use_shader(ri_render_state_wrapper& Self, const filesystem::path& Shader)\n{\n\tSelf.wrapped().shaders.use_shader(Shader);\n}\n\nvoid define_namespace_ri()\n{\n\tscope outer = class_<ri>(\"ri\", no_init);\n\n\tclass_<ri_render_state_wrapper>(\"render_state\", \n\t\t\"Used to pass RenderMan state from the render engine to an object being rendered.\", no_init)\n\t\t.def(\"use_shader\", &use_shader,\n\t\t\t\"Inform the render engine that an object will be using the given shader (so the render system can compile the shader on-demand).\");\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/ri_python.h",
    "content": "#ifndef K3DSDK_PYTHON_RI_PYTHON_H\n#define K3DSDK_PYTHON_RI_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/render_state_ri.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<const k3d::ri::render_state> ri_render_state_wrapper;\n\nvoid define_namespace_ri();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_RI_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/script_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/python/any_python.h>\n#include <k3dsdk/scripting.h>\n\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass script\n{\npublic:\n\tstatic void execute_with_context(const string_t& Script, const boost::python::dict& PythonContext)\n\t{\n\t\tk3d::iscript_engine::context context;\n\n\t\tboost::python::dict python_context = PythonContext;\n\t\twhile(len(python_context))\n\t\t{\n\t\t\tboost::python::tuple python_item = python_context.popitem();\n\t\t\tboost::python::object python_key = python_item[0];\n\t\t\tboost::python::object python_value = python_item[1];\n\n\t\t\tconst string_t key = PyString_AsString(python_key.ptr());\n\t\t\tboost::any value = python_to_any(python_value);\n\n\t\t\tcontext.insert(std::make_pair(key, value));\n\t\t}\n\n\t\tbool recognized = false;\n\t\tbool executed = false;\n\t\tk3d::script::execute(k3d::script::code(Script), \"Python Text\", context, recognized, executed);\n\t\tif(!recognized)\n\t\t\tthrow std::invalid_argument(\"Unrecognized scripting language\");\n\t\tif(!executed)\n\t\t\tthrow std::runtime_error(\"Error executing script\");\n\t}\n\n\tstatic void execute(const string_t& Script)\n\t{\n\t\texecute_with_context(Script, boost::python::dict());\n\t}\n\n};\n\nstatic int context_len(const k3d::iscript_engine::context& Self)\n{\n\treturn Self.size();\n}\n\nstatic boost::python::object context_get_item(const k3d::iscript_engine::context& Self, const k3d::string_t& Key)\n{\n\tk3d::iscript_engine::context::const_iterator item = Self.find(Key);\n\tif(item == Self.end())\n\t\tthrow std::out_of_range(\"unknown key\");\n\n\treturn any_to_python(item->second);\n}\n\nstatic void context_set_item(k3d::iscript_engine::context& Self, const k3d::string_t& Key, const boost::python::object& Value)\n{\n\tSelf[Key] = python_to_any(Value);\n}\n\nstatic void context_del_item(k3d::iscript_engine::context& Self, const k3d::string_t& Key)\n{\n\tk3d::iscript_engine::context::iterator item = Self.find(Key);\n\tif(item == Self.end())\n\t\tthrow std::out_of_range(\"unknown key\");\n\n\tSelf.erase(item);\n}\n\nstatic bool_t context_has_key(const k3d::iscript_engine::context& Self, const k3d::string_t& Key)\n{\n\treturn Self.count(Key);\n}\n\nstatic boost::python::list context_keys(const k3d::iscript_engine::context& Self)\n{\n\tboost::python::list results;\n\tfor(k3d::iscript_engine::context::const_iterator pair = Self.begin(); pair != Self.end(); ++pair)\n\t\tresults.append(pair->first);\n\treturn results;\n}\n\nstatic boost::python::list context_values(const k3d::iscript_engine::context& Self)\n{\n\tboost::python::list results;\n\tfor(k3d::iscript_engine::context::const_iterator pair = Self.begin(); pair != Self.end(); ++pair)\n\t\tresults.append(any_to_python(pair->second));\n\treturn results;\n}\n\nvoid define_namespace_script()\n{\n\tboost::python::scope outer = boost::python::class_<script>(\"script\", boost::python::no_init)\n\t\t.def(\"execute\", script::execute,\n\t\t\t\"Executes a script (which does not have to be written in Python).\")\n\t\t.def(\"execute\", script::execute_with_context,\n\t\t\t\"Executes a script (which does not have to be written in Python).\")\n\t\t.staticmethod(\"execute\")\n\t\t;\n\n\tboost::python::class_<k3d::iscript_engine::context>(\"context\", \"\")\n\t\t.def(\"__len__\", &context_len)\n\t\t.def(\"__getattr__\", &context_get_item)\n\t\t.def(\"__setattr__\", &context_set_item)\n\t\t.def(\"__delattr__\", &context_del_item)\n\t\t.def(\"__getitem__\", &context_get_item)\n\t\t.def(\"__setitem__\", &context_set_item)\n\t\t.def(\"__delitem__\", &context_del_item)\n\t\t.def(\"has_key\", &context_has_key)\n\t\t.def(\"keys\", &context_keys)\n\t\t.def(\"values\", &context_values)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/script_python.h",
    "content": "#ifndef K3DSDK_PYTHON_SCRIPT_PYTHON_H\n#define K3DSDK_PYTHON_SCRIPT_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_script();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_SCRIPT_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/selection_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/selection_python.h>\n\n#include <k3dsdk/iomanip.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// selection \n\nclass selection\n{\npublic:\n};\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// storage \n\ntypedef instance_wrapper<k3d::selection::storage> selection_storage_wrapper;\n\nstatic const string_t selection_storage_get_type(selection_storage_wrapper& Self)\n{\n\treturn Self.wrapped().type;\n}\n\nstatic object selection_storage_get_structure(selection_storage_wrapper& Self)\n{\n\treturn wrap(Self.wrapped().structure);\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// set\n\nstatic int selection_set_len(k3d::selection::set& Self)\n{\n\treturn Self.size();\n}\n\nstatic object selection_set_get_item(k3d::selection::set& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\treturn wrap(Self[Item]);\n}\n\nstatic string_t selection_set_str(k3d::selection::set& Self)\n{\n\tstd::ostringstream buffer;\n\tbuffer << \"set: (\" << Self.size() << \")\\n\";\n\tbuffer << push_indent << Self << pop_indent;\n\n\treturn buffer.str();\n}\n\nstatic object selection_set_create(k3d::selection::set& Self, const string_t& Type)\n{\n\treturn wrap(Self.create(Type));\n}\n\nvoid define_namespace_selection()\n{\n\tscope outer = class_<selection>(\"selection\", no_init)\n\t\t;\n\n\tenum_<k3d::selection::type>(\"type\")\n\t\t.value(\"NONE\", k3d::selection::NONE)\n\t\t.value(\"NODE\", k3d::selection::NODE)\n\t\t.value(\"MESH\", k3d::selection::MESH)\n\t\t.value(\"PRIMITIVE\", k3d::selection::PRIMITIVE)\n\t\t.value(\"CONSTANT\", k3d::selection::CONSTANT)\n\t\t.value(\"SURFACE\", k3d::selection::SURFACE)\n\t\t.value(\"PARAMETER\", k3d::selection::PARAMETER)\n\t\t.value(\"EDGE\", k3d::selection::EDGE)\n\t\t.value(\"POINT\", k3d::selection::POINT)\n\t\t.value(\"CURVE\", k3d::selection::CURVE)\n\t\t.value(\"FACE\", k3d::selection::FACE)\n\t\t.value(\"PATCH\", k3d::selection::PATCH)\n\t\t.attr(\"__module__\") = \"k3d\";\n\n\tclass_<selection_storage_wrapper>(\"storage\", no_init)\n\t\t.def(\"type\", &selection_storage_get_type)\n\t\t.def(\"structure\", &selection_storage_get_structure)\n\t\t;\n\n\tclass_<k3d::selection::set>(\"set\")\n\t\t.def(\"__len__\", &selection_set_len)\n\t\t.def(\"__getitem__\", &selection_set_get_item)\n\t\t.def(\"__str__\", &selection_set_str)\n\t\t.def(\"create\", &selection_set_create)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/selection_python.h",
    "content": "#ifndef K3DSDK_PYTHON_SELECTION_PYTHON_H\n#define K3DSDK_PYTHON_SELECTION_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/selection.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<k3d::selection::storage> selection_storage_wrapper;\n\nvoid define_namespace_selection();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_SELECTION_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/sphere_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/sphere_python.h>\n\n#include <k3dsdk/sphere.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass sphere\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::sphere::const_primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object radii(wrapper& Self) { return wrap(Self.wrapped().radii); }\n\t\tstatic object z_min(wrapper& Self) { return wrap(Self.wrapped().z_min); }\n\t\tstatic object z_max(wrapper& Self) { return wrap(Self.wrapped().z_max); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::sphere::primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object radii(wrapper& Self) { return wrap(Self.wrapped().radii); }\n\t\tstatic object z_min(wrapper& Self) { return wrap(Self.wrapped().z_min); }\n\t\tstatic object z_max(wrapper& Self) { return wrap(Self.wrapped().z_max); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::sphere::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::sphere::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::sphere::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_sphere()\n{\n\tscope outer = class_<sphere>(\"sphere\", no_init)\n\t\t.def(\"create\", &sphere::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &sphere::validate)\n\t\t.def(\"validate\", &sphere::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<sphere::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"matrices\", &sphere::const_primitive::matrices)\n\t\t.def(\"materials\", &sphere::const_primitive::materials)\n\t\t.def(\"radii\", &sphere::const_primitive::radii)\n\t\t.def(\"z_min\", &sphere::const_primitive::z_min)\n\t\t.def(\"z_max\", &sphere::const_primitive::z_max)\n\t\t.def(\"sweep_angles\", &sphere::const_primitive::sweep_angles)\n\t\t.def(\"selections\", &sphere::const_primitive::selections)\n\t\t.def(\"constant_attributes\", &sphere::const_primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &sphere::const_primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &sphere::const_primitive::parameter_attributes)\n\t\t;\n\n\tclass_<sphere::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"matrices\", &sphere::primitive::matrices)\n\t\t.def(\"materials\", &sphere::primitive::materials)\n\t\t.def(\"radii\", &sphere::primitive::radii)\n\t\t.def(\"z_min\", &sphere::primitive::z_min)\n\t\t.def(\"z_max\", &sphere::primitive::z_max)\n\t\t.def(\"sweep_angles\", &sphere::primitive::sweep_angles)\n\t\t.def(\"selections\", &sphere::primitive::selections)\n\t\t.def(\"constant_attributes\", &sphere::primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &sphere::primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &sphere::primitive::parameter_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/sphere_python.h",
    "content": "#ifndef K3DSDK_PYTHON_SPHERE_PYTHON_H\n#define K3DSDK_PYTHON_SPHERE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_sphere();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_SPHERE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/table_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/table_python.h>\n#include <k3dsdk/python/typed_array_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/named_array_types.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/typed_array.h>\n#include <k3dsdk/uint_t_array.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass table_array_factory\n{\npublic:\n\ttable_array_factory(const string_t& Name, const string_t& Type, boost::python::object& Array, k3d::table& Arrays) :\n\t\tname(Name),\n\t\ttype(Type),\n\t\tarray(Array),\n\t\tarrays(Arrays)\n\t{\n\t\t// Handle arrays of uint_t as a special-case ...\n\t\tif(Type == \"k3d::uint_t\")\n\t\t\tarray = wrap(arrays.create<k3d::uint_t_array>(name));\n\t}\n\n\ttemplate<typename T>\n\tvoid operator()(T) const\n\t{\n\t\tif(array != boost::python::object())\n\t\t\treturn;\n\n\t\tif(type != k3d::type_string<T>())\n\t\t\treturn;\n\n\t\tarray = wrap(arrays.create<k3d::typed_array<T> >(name));\n\t}\n\nprivate:\n\tstring_t name;\n\tstring_t type;\n\tboost::python::object& array;\n\tk3d::table& arrays;\n};\n\nstatic list keys(table_wrapper& Self)\n{\n\tlist results;\n\n\tfor(k3d::table::const_iterator array = Self.wrapped().begin(); array != Self.wrapped().end(); ++array)\n\t\tresults.append(array->first);\n\n\treturn results;\n}\n\nstatic object create(table_wrapper& Self, const string_t& Name, const string_t& Type)\n{\n\tif(Name.empty())\n\t\tthrow std::runtime_error(\"Empty array name\");\n\n\tboost::python::object result;\n\tboost::mpl::for_each<k3d::named_array_types>(table_array_factory(Name, Type, result, Self.wrapped()));\n\tif(result == boost::python::object())\n\t\tthrow std::runtime_error(\"Cannot create array [\" + Name + \"] with unknown type [\" + Type + \"]\");\n\n\treturn result;\n}\n\nstatic object create_array(table_wrapper& Self, const string_t& Name, const string_t& Type)\n{\n\tk3d::log() << warning << \"create_array() is deprecated, use create() instead.\" << std::endl;\n\treturn create(Self, Name, Type);\n}\n\nstatic void delete_1(table_wrapper& Self, const string_t& Name)\n{\n\tSelf.wrapped().erase(Name);\t\n}\n\nstatic uint_t row_count(const table_wrapper& Self)\n{\n\treturn Self.wrapped().row_count();\n}\n\nstatic void set_row_count(table_wrapper& Self, const uint_t NewSize)\n{\n\tSelf.wrapped().set_row_count(NewSize);\n}\n\nstatic object get_item1(table_wrapper& Self, const string_t& Key)\n{\n\tk3d::table::iterator iterator = Self.wrapped().find(Key);\n\tif(iterator == Self.wrapped().end())\n\t\tthrow std::runtime_error(\"unknown key: \" + Key);\n\n\treturn wrap_array(iterator->second.writable());\n}\n\nstatic object get_item2(table_wrapper& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.wrapped().column_count())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\tk3d::table::iterator iterator = Self.wrapped().begin();\n\tstd::advance(iterator, Item);\n\n\treturn wrap_array(iterator->second.writable());\n}\n\nvoid define_class_table()\n{\n\tclass_<table_wrapper>(\"table\", \n\t\t\"Stores a mutable (read-write) collection of attribute arrays (named arrays of equal length).\", no_init)\n\t\t.def(\"keys\", &keys,\n\t\t\t\"Returns a list containing names for all the arrays in the collection.\")\n\t\t.def(\"create\", &create,\n\t\t\t\"Creates an array with given name and type.\")\n\t\t.def(\"create_array\", &create_array,\n\t\t\t\"Creates an array with given name and type.\")\n\t\t.def(\"delete\", &delete_1,\n\t\t\t\"Deletes an array with given name, if any.\")\n\t\t.def(\"set_row_count\", &set_row_count,\n\t\t\t\"Sets the size of every array in the collection.\")\n\t\t.def(\"__len__\", &row_count)\n\t\t.def(\"__getitem__\", &get_item1)\n\t\t.def(\"__getitem__\", &get_item2)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/table_python.h",
    "content": "#ifndef K3DSDK_PYTHON_TABLE_PYTHON_H\n#define K3DSDK_PYTHON_TABLE_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/table.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\ntypedef instance_wrapper<k3d::table> table_wrapper;\n\nvoid define_class_table();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_TABLE_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/teapot_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/teapot_python.h>\n\n#include <k3dsdk/teapot.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass teapot\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::teapot::const_primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::teapot::primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::teapot::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::teapot::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::teapot::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_teapot()\n{\n\tscope outer = class_<teapot>(\"teapot\", no_init)\n\t\t.def(\"create\", &teapot::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &teapot::validate)\n\t\t.def(\"validate\", &teapot::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<teapot::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"matrices\", &teapot::const_primitive::matrices)\n\t\t.def(\"materials\", &teapot::const_primitive::materials)\n\t\t.def(\"selections\", &teapot::const_primitive::selections)\n\t\t.def(\"constant_attributes\", &teapot::const_primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &teapot::const_primitive::surface_attributes)\n\t\t;\n\n\tclass_<teapot::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"matrices\", &teapot::primitive::matrices)\n\t\t.def(\"materials\", &teapot::primitive::materials)\n\t\t.def(\"selections\", &teapot::primitive::selections)\n\t\t.def(\"constant_attributes\", &teapot::primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &teapot::primitive::surface_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/teapot_python.h",
    "content": "#ifndef K3DSDK_PYTHON_TEAPOT_PYTHON_H\n#define K3DSDK_PYTHON_TEAPOT_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_teapot();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_TEAPOT_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/texture3_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/texture3_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/texture3.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_texture3()\n{\n\tclass_<k3d::texture3>(\"texture3\",\n\t\t\"Stores a set of three-dimensional texture coordinates\", no_init)\n\t\t.def(init<double, double, double>())\n\t\t.def(init<double, double>())\n\t\t.def(init<const k3d::texture3&>())\n\t\t.def(self += self)\n\t\t.def(self *= double())\n\t\t.def(self /= double())\n\t\t.def(\"__len__\", &utility::constant_len_len<k3d::texture3, 3>)\n\t\t.def(\"__getitem__\", &utility::constant_len_get_item<k3d::texture3, 3, k3d::double_t>)\n\t\t.def(\"__setitem__\", &utility::constant_len_set_item<k3d::texture3, 3, k3d::double_t>)\n\t\t.def(self + self)\n\t\t.def(self * double())\n\t\t.def(double() * self)\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self_ns::str(self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/texture3_python.h",
    "content": "#ifndef K3DSDK_PYTHON_TEXTURE3_PYTHON_H\n#define K3DSDK_PYTHON_TEXTURE3_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_texture3();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_TEXTURE3_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/torus_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/mesh_python.h>\n#include <k3dsdk/python/owned_instance_wrapper_python.h>\n#include <k3dsdk/python/torus_python.h>\n\n#include <k3dsdk/torus.h>\n\n#include <boost/python/detail/api_placeholder.hpp>\nusing namespace boost::python;\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nclass torus\n{\npublic:\n\tclass const_primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::torus::const_primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object major_radii(wrapper& Self) { return wrap(Self.wrapped().major_radii); }\n\t\tstatic object minor_radii(wrapper& Self) { return wrap(Self.wrapped().minor_radii); }\n\t\tstatic object phi_min(wrapper& Self) { return wrap(Self.wrapped().phi_min); }\n\t\tstatic object phi_max(wrapper& Self) { return wrap(Self.wrapped().phi_max); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\tclass primitive\n\t{\n\tpublic:\n\t\ttypedef owned_instance_wrapper<k3d::torus::primitive> wrapper;\n\n\t\tstatic object matrices(wrapper& Self) { return wrap(Self.wrapped().matrices); }\n\t\tstatic object materials(wrapper& Self) { return wrap(Self.wrapped().materials); }\n\t\tstatic object major_radii(wrapper& Self) { return wrap(Self.wrapped().major_radii); }\n\t\tstatic object minor_radii(wrapper& Self) { return wrap(Self.wrapped().minor_radii); }\n\t\tstatic object phi_min(wrapper& Self) { return wrap(Self.wrapped().phi_min); }\n\t\tstatic object phi_max(wrapper& Self) { return wrap(Self.wrapped().phi_max); }\n\t\tstatic object sweep_angles(wrapper& Self) { return wrap(Self.wrapped().sweep_angles); }\n\t\tstatic object selections(wrapper& Self) { return wrap(Self.wrapped().selections); }\n\t\tstatic object constant_attributes(wrapper& Self) { return wrap(Self.wrapped().constant_attributes); }\n\t\tstatic object surface_attributes(wrapper& Self) { return wrap(Self.wrapped().surface_attributes); }\n\t\tstatic object parameter_attributes(wrapper& Self) { return wrap(Self.wrapped().parameter_attributes); }\n\t};\n\n\n\tstatic object create(mesh_wrapper& Mesh)\n\t{\n\t\treturn wrap_owned(k3d::torus::create(Mesh.wrapped()));\n\t}\n\n\tstatic object validate(mesh_wrapper& Mesh, mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::torus::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n\n\tstatic object validate_const(const_mesh_wrapper& Mesh, const_mesh_primitive_wrapper& Primitive)\n\t{\n\t\treturn wrap_owned(k3d::torus::validate(Mesh.wrapped(), Primitive.wrapped()));\n\t}\n};\n\nvoid define_namespace_torus()\n{\n\tscope outer = class_<torus>(\"torus\", no_init)\n\t\t.def(\"create\", &torus::create)\n\t\t.staticmethod(\"create\")\n\t\t.def(\"validate\", &torus::validate)\n\t\t.def(\"validate\", &torus::validate_const)\n\t\t.staticmethod(\"validate\")\n\t\t;\n\n\tclass_<torus::const_primitive::wrapper>(\"const_primitive\", no_init)\n\t\t.def(\"matrices\", &torus::const_primitive::matrices)\n\t\t.def(\"materials\", &torus::const_primitive::materials)\n\t\t.def(\"major_radii\", &torus::const_primitive::major_radii)\n\t\t.def(\"minor_radii\", &torus::const_primitive::minor_radii)\n\t\t.def(\"phi_min\", &torus::const_primitive::phi_min)\n\t\t.def(\"phi_max\", &torus::const_primitive::phi_max)\n\t\t.def(\"sweep_angles\", &torus::const_primitive::sweep_angles)\n\t\t.def(\"selections\", &torus::const_primitive::selections)\n\t\t.def(\"constant_attributes\", &torus::const_primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &torus::const_primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &torus::const_primitive::parameter_attributes)\n\t\t;\n\n\tclass_<torus::primitive::wrapper>(\"primitive\", no_init)\n\t\t.def(\"matrices\", &torus::primitive::matrices)\n\t\t.def(\"materials\", &torus::primitive::materials)\n\t\t.def(\"major_radii\", &torus::primitive::major_radii)\n\t\t.def(\"minor_radii\", &torus::primitive::minor_radii)\n\t\t.def(\"phi_min\", &torus::primitive::phi_min)\n\t\t.def(\"phi_max\", &torus::primitive::phi_max)\n\t\t.def(\"sweep_angles\", &torus::primitive::sweep_angles)\n\t\t.def(\"selections\", &torus::primitive::selections)\n\t\t.def(\"constant_attributes\", &torus::primitive::constant_attributes)\n\t\t.def(\"surface_attributes\", &torus::primitive::surface_attributes)\n\t\t.def(\"parameter_attributes\", &torus::primitive::parameter_attributes)\n\t\t;\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/torus_python.h",
    "content": "#ifndef K3DSDK_PYTHON_TORUS_PYTHON_H\n#define K3DSDK_PYTHON_TORUS_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_namespace_torus();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_TORUS_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/typed_array_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/iunknown_python.h>\n#include <k3dsdk/python/typed_array_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/named_array_types.h>\n#include <k3dsdk/typed_array.h>\n#include <k3dsdk/uint_t_array.h>\n\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nstatic boost::python::object get_item_imaterial(instance_wrapper<k3d::typed_array<k3d::imaterial*> >& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\treturn wrap(Self.wrapped().at(Item));\n}\n\nstatic boost::python::object get_item_inode(instance_wrapper<k3d::typed_array<k3d::inode*> >& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\treturn wrap(Self.wrapped().at(Item));\n}\n\ntemplate<typename array_type>\nstatic void set_item(instance_wrapper<array_type>& Self, int Item, const typename array_type::value_type& Value)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\tSelf.wrapped()[Item] = Value;\n}\n\nstatic void set_item_imaterial(instance_wrapper<k3d::typed_array<k3d::imaterial*> >& Self, int Item, const boost::python::object& Value)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\tif(Value)\n\t{\n\t\tSelf.wrapped()[Item] = &dynamic_cast<k3d::imaterial&>(boost::python::extract<iunknown_wrapper>(Value)().wrapped());\n\t}\n\telse\n\t{\n\t\tSelf.wrapped()[Item] = static_cast<k3d::imaterial*>(0);\n\t}\n}\n\nstatic void set_item_inode(instance_wrapper<k3d::typed_array<k3d::inode*> >& Self, int Item, const boost::python::object& Value)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\tif(Value)\n\t{\n\t\tSelf.wrapped()[Item] = &dynamic_cast<k3d::inode&>(boost::python::extract<iunknown_wrapper>(Value)().wrapped());\n\t}\n\telse\n\t{\n\t\tSelf.wrapped()[Item] = static_cast<k3d::inode*>(0);\n\t}\n}\n\ntemplate<typename array_type>\nstatic const string_t array_str(instance_wrapper<array_type>& Self)\n{\n\tstd::ostringstream buffer;\n\tbuffer << Self.wrapped();\n\treturn buffer.str();\n}\n\ntemplate<typename array_type>\nstatic void append(instance_wrapper<array_type>& Self, const typename array_type::value_type& Value)\n{\n\tSelf.wrapped().push_back(Value);\n}\n\nstatic void append_imaterial(instance_wrapper<k3d::typed_array<k3d::imaterial*> >& Self, const boost::python::object& Value)\n{\n\tif(Value)\n\t{\n\t\tSelf.wrapped().push_back(&dynamic_cast<k3d::imaterial&>(boost::python::extract<iunknown_wrapper>(Value)().wrapped()));\n\t}\n\telse\n\t{\n\t\tSelf.wrapped().push_back(static_cast<k3d::imaterial*>(0));\n\t}\n}\n\nstatic void append_inode(instance_wrapper<k3d::typed_array<k3d::inode*> >& Self, const boost::python::object& Value)\n{\n\tif(Value)\n\t{\n\t\tSelf.wrapped().push_back(&dynamic_cast<k3d::inode&>(boost::python::extract<iunknown_wrapper>(Value)().wrapped()));\n\t}\n\telse\n\t{\n\t\tSelf.wrapped().push_back(static_cast<k3d::inode*>(0));\n\t}\n}\n\ntemplate<typename array_type>\nstatic void assign(instance_wrapper<array_type>& Self, const boost::python::list& Value)\n{\n\tarray_type& storage = Self.wrapped();\n\n\tconst uint_t count = boost::python::len(Value);\n\tstorage.resize(count);\n\tfor(uint_t i = 0; i != count; ++i)\n\t\tstorage[i] = boost::python::extract<typename array_type::value_type>(Value[i]);\n}\n\nstatic void assign_imaterial(instance_wrapper<k3d::typed_array<k3d::imaterial*> >& Self, const boost::python::list& Value)\n{\n\tk3d::typed_array<k3d::imaterial*>& storage = Self.wrapped();\n\n\tconst uint_t count = boost::python::len(Value);\n\tstorage.resize(count);\n\tfor(uint_t i = 0; i != count; ++i)\n\t{\n\t\tif(Value[i])\n\t\t{\n\t\t\tstorage[i] = &dynamic_cast<k3d::imaterial&>(boost::python::extract<iunknown_wrapper>(Value[i])().wrapped());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstorage[i] = static_cast<k3d::imaterial*>(0);\n\t\t}\n\t}\n}\n\nstatic void assign_inode(instance_wrapper<k3d::typed_array<k3d::inode*> >& Self, const boost::python::list& Value)\n{\n\tk3d::typed_array<k3d::inode*>& storage = Self.wrapped();\n\n\tconst uint_t count = boost::python::len(Value);\n\tstorage.resize(count);\n\tfor(uint_t i = 0; i != count; ++i)\n\t{\n\t\tif(Value[i])\n\t\t{\n\t\t\tstorage[i] = &dynamic_cast<k3d::inode&>(boost::python::extract<iunknown_wrapper>(Value[i])().wrapped());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstorage[i] = static_cast<k3d::inode*>(0);\n\t\t}\n\t}\n}\n\ntemplate<typename self_t>\nstatic void set_metadata_value(self_t& Self, const string_t& Name, const string_t& Value)\n{\n\tSelf.wrapped().set_metadata_value(Name, Value);\n}\n\ntemplate<typename self_t>\nstatic string_t get_metadata_value(const self_t& Self, const string_t& Name)\n{\n\treturn Self.wrapped().get_metadata_value(Name);\n}\n\ntemplate<typename self_t>\nstatic boost::python::dict get_metadata(const self_t& Self)\n{\n\tboost::python::dict result;\n\n\tconst array::metadata_t metadata = Self.wrapped().get_metadata();\n\tfor(array::metadata_t::const_iterator pair = metadata.begin(); pair != metadata.end(); ++pair)\n\t\tresult[pair->first] = pair->second;\n\n\treturn result;\n}\n\ntemplate<typename self_t>\nstatic void erase_metadata_value(self_t& Self, const string_t& Name)\n{\n\tSelf.wrapped().erase_metadata_value(Name);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////\n// define_class_typed_array\n\ntemplate<typename array_type>\nstatic void define_class_typed_array(const char* const ClassName, const char* const DocString)\n{\n\ttypedef instance_wrapper<array_type> wrapper_type;\n\n\tboost::python::class_<wrapper_type>(ClassName, DocString, boost::python::no_init)\n\t\t.def(\"__len__\", &utility::wrapped_len<wrapper_type>)\n\t\t.def(\"__getitem__\", &utility::wrapped_get_item<wrapper_type, typename array_type::value_type>)\n\t\t.def(\"__setitem__\", &set_item<array_type>)\n\t\t.def(\"__str__\", &array_str<array_type>)\n\t\t.def(\"append\", &append<array_type>,\n\t\t\t\"Append a value to the end of the array, growing its size by one.\")\n\t\t.def(\"assign\", &assign<array_type>,\n\t\t\t\"Replace the contents of the array with a list of values.\")\n\t\t.def(\"set_metadata_value\", &set_metadata_value<wrapper_type>)\n\t\t.def(\"get_metadata_value\", &get_metadata_value<wrapper_type>)\n\t\t.def(\"get_metadata\", &get_metadata<wrapper_type>)\n\t\t.def(\"erase_metadata_value\", &erase_metadata_value<wrapper_type>)\n\t\t;\n}\n\ntemplate<>\nvoid define_class_typed_array<k3d::typed_array<k3d::imaterial*> >(const char* const ClassName, const char* const DocString)\n{\n\ttypedef k3d::typed_array<k3d::imaterial*> array_type;\n\ttypedef instance_wrapper<array_type> wrapper_type;\n\n\tboost::python::class_<wrapper_type>(ClassName, DocString, boost::python::no_init)\n\t\t.def(\"__len__\", &utility::wrapped_len<wrapper_type>)\n\t\t.def(\"__getitem__\", &get_item_imaterial)\n\t\t.def(\"__setitem__\", &set_item_imaterial)\n\t\t.def(\"append\", &append_imaterial,\n\t\t\t\"Append a value to the end of the array, growing its size by one.\")\n\t\t.def(\"assign\", &assign_imaterial,\n\t\t\t\"Replace the contents of the array with a list of values.\")\n\t\t.def(\"set_metadata_value\", &set_metadata_value<wrapper_type>)\n\t\t.def(\"get_metadata_value\", &get_metadata_value<wrapper_type>)\n\t\t.def(\"get_metadata\", &get_metadata<wrapper_type>)\n\t\t.def(\"erase_metadata_value\", &erase_metadata_value<wrapper_type>)\n\t\t;\n}\n\ntemplate<>\nvoid define_class_typed_array<k3d::typed_array<k3d::inode*> >(const char* const ClassName, const char* const DocString)\n{\n\ttypedef k3d::typed_array<k3d::inode*> array_type;\n\ttypedef instance_wrapper<array_type> wrapper_type;\n\n\tboost::python::class_<wrapper_type>(ClassName, DocString, boost::python::no_init)\n\t\t.def(\"__len__\", &utility::wrapped_len<wrapper_type>)\n\t\t.def(\"__getitem__\", &get_item_inode)\n\t\t.def(\"__setitem__\", &set_item_inode)\n\t\t.def(\"append\", &append_inode,\n\t\t\t\"Append a value to the end of the array, growing its size by one.\")\n\t\t.def(\"assign\", &assign_inode,\n\t\t\t\"Replace the contents of the array with a list of values.\")\n\t\t.def(\"set_metadata_value\", &set_metadata_value<wrapper_type>)\n\t\t.def(\"get_metadata_value\", &get_metadata_value<wrapper_type>)\n\t\t.def(\"get_metadata\", &get_metadata<wrapper_type>)\n\t\t.def(\"erase_metadata_value\", &erase_metadata_value<wrapper_type>)\n\t\t;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n// typed_array_array_factory\n\nclass typed_array_array_factory\n{\npublic:\n\ttyped_array_array_factory(k3d::array& Input, boost::python::object& Output) :\n\t\tinput(Input),\n\t\toutput(Output)\n\t{\n\t\toutput = boost::python::object();\n\n\t\tif(k3d::uint_t_array* const array = dynamic_cast<k3d::uint_t_array*>(&input))\n\t\t\toutput = wrap(array);\n\t}\n\n\ttemplate<typename T>\n\tvoid operator()(T) const\n\t{\n\t\tif(output != boost::python::object())\n\t\t\treturn;\n\n\t\ttypedef k3d::typed_array<T> array_type;\n\n\t\tif(array_type* const array = dynamic_cast<array_type*>(&input))\n\t\t\toutput = wrap(array);\n\t}\n\nprivate:\n\tk3d::array& input;\n\tboost::python::object& output;\n};\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n// wrap_array\n\nboost::python::object wrap_array(k3d::array* Wrapped)\n{\n\tif(Wrapped)\n\t\treturn wrap_array(*Wrapped);\n\n\treturn boost::python::object();\n}\n\nboost::python::object wrap_array(k3d::array& Wrapped)\n{\n\tboost::python::object result;\n\tboost::mpl::for_each<k3d::named_array_types>(typed_array_array_factory(Wrapped, result));\n\treturn result;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////\n// define_typed_array_classes\n\nvoid define_typed_array_classes()\n{\n\tdefine_class_typed_array<k3d::typed_array<k3d::bool_t> >(\"typed_array_bool_t\",\n\t\t\"Stores a mutable (read-write) collection of boolean values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::double_t> >(\"typed_array_double_t\",\n\t\t\"Stores a mutable (read-write) collection of floating-point values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::int8_t> >(\"typed_array_int8_t\",\n\t\t\"Stores a mutable (read-write) collection of 8-bit integer values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::int16_t> >(\"typed_array_int16_t\",\n\t\t\"Stores a mutable (read-write) collection of 16-bit integer values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::int32_t> >(\"typed_array_int32_t\",\n\t\t\"Stores a mutable (read-write) collection of 32-bit integer values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::int64_t> >(\"typed_array_int64_t\",\n\t\t\"Stores a mutable (read-write) collection of 64-bit integer values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::imaterial*> >(\"typed_array_imaterial\",\n\t\t\"Stores a mutable (read-write) collection of L{imaterial} objects.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::inode*> >(\"typed_array_inode\",\n\t\t\"Stores a mutable (read-write) collection of L{inode} objects.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::color> >(\"typed_array_color\",\n\t\t\"Stores a mutable (read-write) collection of L{color} values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::matrix4> >(\"typed_array_matrix4\",\n\t\t\"Stores a mutable (read-write) collection of L{matrix4} values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::normal3> >(\"typed_array_normal3\",\n\t\t\"Stores a mutable (read-write) collection of L{normal3} values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::point2> >(\"typed_array_point2\",\n\t\t\"Stores a mutable (read-write) collection of L{point2} values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::point3> >(\"typed_array_point3\",\n\t\t\"Stores a mutable (read-write) collection of L{point3} values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::point4> >(\"typed_array_point4\",\n\t\t\"Stores a mutable (read-write) collection of L{point4} values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::string_t> >(\"typed_array_string_t\",\n\t\t\"Stores a mutable (read-write) collection of string values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::texture3> >(\"typed_array_texture3\",\n\t\t\"Stores a mutable (read-write) collection of L{texture} values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::uint8_t> >(\"typed_array_uint8_t\",\n\t\t\"Stores a mutable (read-write) collection of unsigned 8-bit integer values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::uint16_t> >(\"typed_array_uint16_t\",\n\t\t\"Stores a mutable (read-write) collection of unsigned 16-bit integer values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::uint32_t> >(\"typed_array_uint32_t\",\n\t\t\"Stores a mutable (read-write) collection of unsigned 32-bit integer values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::uint64_t> >(\"typed_array_uint64_t\",\n\t\t\"Stores a mutable (read-write) collection of unsigned 64-bit integer values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::vector2> >(\"typed_array_vector2\",\n\t\t\"Stores a mutable (read-write) collection of L{vector2} values.\");\n\tdefine_class_typed_array<k3d::typed_array<k3d::vector3> >(\"typed_array_vector3\",\n\t\t\"Stores a mutable (read-write) collection of L{vector3} values.\");\n\n\tdefine_class_typed_array<k3d::uint_t_array>(\"uint_t_array\",\n\t\t\"Stores a mutable (read-write) collection of 32- or 64-bit values (depending on platform).\");\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/typed_array_python.h",
    "content": "#ifndef K3DSDK_PYTHON_TYPED_ARRAY_PYTHON_H\n#define K3DSDK_PYTHON_TYPED_ARRAY_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/python/instance_wrapper_python.h>\n#include <k3dsdk/array.h>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nboost::python::object wrap_array(k3d::array* Wrapped);\nboost::python::object wrap_array(k3d::array& Wrapped);\n\nvoid define_typed_array_classes();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_TYPED_ARRAY_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/utility_python.h",
    "content": "#ifndef K3DSDK_PYTHON_UTILITY_PYTHON_H\n#define K3DSDK_PYTHON_UTILITY_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\n#include <boost/python/import.hpp>\n#include <boost/python/list.hpp>\n#include <boost/python/make_function.hpp>\n#include <boost/python/object.hpp>\n\n#include <stdexcept>\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nnamespace utility\n{\n\n/// Provides a boilerplate implementation of __len__ for objects with constant length (e.g: k3d::point2, k3d::vector3, k3d::matrix4)\ntemplate<typename self_t, int size>\nstatic int constant_len_len(const self_t& Self)\n{\n\treturn size;\n}\n\n/// Provides a boilerplate implementation of __getitem__ for objects with constant length and operator[] (e.g: k3d::point2, k3d::vector3, k3d::matrix4)\ntemplate<typename self_t, int size, typename value_t>\nstatic value_t constant_len_get_item(const self_t& Self, int Item)\n{\n\tif(Item < 0 || Item >= size)\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\treturn Self[Item];\n}\n\n/// Provides a boilerplate implementation of __setitem__ for objects with constant length and operator[] (e.g: k3d::point2, k3d::vector3, k3d::matrix4)\ntemplate<typename self_t, int size, typename value_t>\nstatic void constant_len_set_item(self_t& Self, int Item, const value_t& Value)\n{\n\tif(Item < 0 || Item >= size)\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\tSelf[Item] = Value;\n}\n\n/// Provides a boilerplate implementation of __len__ for objects that are wrapped by-reference (e.g: k3d::typed_array)\ntemplate<typename self_t>\nstatic int wrapped_len(const self_t& Self)\n{\n\treturn Self.wrapped().size();\n}\n\n/// Provides a boilerplate implementation of __getitem__ for objects with at() that are wrapped by-reference (e.g: k3d::typed_array)\ntemplate<typename self_t, typename value_t>\nstatic value_t wrapped_get_item(self_t& Self, int Item)\n{\n\tif(Item < 0 || Item >= Self.wrapped().size())\n\t\tthrow std::out_of_range(\"index out-of-range\");\n\n\treturn Self.wrapped().at(Item);\n}\n\n/// Provides a boilerplate implementation of __getitem__ for objects with find(k3d::string_t) that are wrapped by-reference (e.g: k3d::named_array, k3d::mesh::attributes_t)\ntemplate<typename self_t>\nstatic boost::python::object wrapped_get_wrapped_item_by_key(self_t& Self, const string_t& Key)\n{\n\ttypename self_t::wrapped_type::const_iterator iterator = Self.wrapped().find(Key);\n\tif(iterator == Self.wrapped().end())\n\t\tthrow std::runtime_error(\"unknown key: \" + Key);\n\n\treturn wrap(iterator->second);\n}\n\n/// Copies a Python list to an STL vector\ntemplate<typename target_t>\nvoid copy(const boost::python::list& Source, target_t& Target)\n{\n\tconst k3d::uint_t count = boost::python::len(Source);\n\tTarget.resize(count);\n\tfor(k3d::uint_t i = 0; i != count; ++i)\n\t\tTarget[i] = boost::python::extract<typename target_t::value_type>(Source[i]);\n}\n\n/// Creates a function with documentation\ntemplate<typename FunctionT>\ninline boost::python::object make_function(FunctionT Function, const char* const Docstring = \"\")\n{\n\tboost::python::object result = boost::python::make_function(Function);\n\tsetattr(result, \"__doc__\", Docstring);\n\treturn result;\n}\n\n/// Adds a method to an existing Python class instance\ninline void add_method(const boost::python::object& Function, const string_t& Name, boost::python::object& Result)\n{\n\tsetattr(Result, Name, boost::python::import(\"types\").attr(\"MethodType\")(Function, Result));\n}\n\n} // namespace utility\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_UTILITY_PYTHON_H\n\n"
  },
  {
    "path": "k3dsdk/python/uuid_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/utility_python.h>\n#include <k3dsdk/python/uuid_python.h>\n\n#include <k3dsdk/uuid.h>\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nunsigned long uuid_getitem(const k3d::uuid& LHS, const int Item)\n{\n\tif(Item < 0 || Item > 15)\n\t\tthrow std::out_of_range(\"index out of range\");\n\n\treturn LHS.data[Item];\n}\n\nvoid uuid_setitem(k3d::uuid& LHS, const int Item, unsigned long Value)\n{\n\tif(Item < 0 || Item > 15)\n\t\tthrow std::out_of_range(\"index out of range\");\n\n\tLHS.data[Item] = Value;\n}\n\nvoid define_class_uuid()\n{\n\tclass_<k3d::uuid>(\"uuid\",\n\t\t\"Stores a 128-bit universally unique identifier.\")\n\t\t.def(init<unsigned long, unsigned long, unsigned long, unsigned long>())\n\t\t.def(\"null\", &k3d::uuid::null,\n\t\t\t\"Returns a null (all zeros) identifier.\").staticmethod(\"null\")\n\t\t.def(\"random\", &k3d::uuid::random,\n\t\t\t\"Returns a randomly-generated identifier.\").staticmethod(\"random\")\n\t\t.def(\"__len__\", &utility::constant_len_len<k3d::uuid, 16>)\n\t\t.def(\"__getitem__\", uuid_getitem)\n\t\t.def(\"__setitem__\", uuid_setitem)\n\t\t.def(self < self)\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self_ns::str(self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/uuid_python.h",
    "content": "#ifndef K3DSDK_PYTHON_UUID_PYTHON_H\n#define K3DSDK_PYTHON_UUID_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_uuid();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_UUID_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/vector2_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/vector2_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/vector2.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_vector2()\n{\n\tclass_<k3d::vector2>(\"vector2\",\n\t\t\"Stores a direction vector in two-dimensional space\", no_init)\n\t\t.def(init<double, double>())\n\t\t.def(init<const k3d::vector2&>())\n\t\t.def(\"__len__\", &utility::constant_len_len<k3d::vector2, 2>)\n\t\t.def(\"__getitem__\", &utility::constant_len_get_item<k3d::vector2, 2, k3d::double_t>)\n\t\t.def(\"__setitem__\", &utility::constant_len_set_item<k3d::vector2, 2, k3d::double_t>)\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self + self)\n\t\t.def(self - self)\n\t\t.def(self * double())\n\t\t.def(double() * self)\n\t\t.def(self += self)\n\t\t.def(self -= self)\n\t\t.def(self *= double())\n\t\t.def(self /= double())\n\t\t.def(self_ns::str(self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/vector2_python.h",
    "content": "#ifndef K3DSDK_PYTHON_VECTOR2_PYTHON_H\n#define K3DSDK_PYTHON_VECTOR2_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_vector2();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_VECTOR2_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/vector3_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/vector3_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/vector3.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_vector3()\n{\n\tclass_<k3d::vector3>(\"vector3\",\n\t\t\"Stores a direction vector in three-dimensional space\", no_init)\n\t\t.def(init<double, double, double>())\n\t\t.def(init<const k3d::vector3&>())\n\t\t.def(\"__len__\", &utility::constant_len_len<k3d::vector3, 3>)\n\t\t.def(\"__getitem__\", &utility::constant_len_get_item<k3d::vector3, 3, k3d::double_t>)\n\t\t.def(\"__setitem__\", &utility::constant_len_set_item<k3d::vector3, 3, k3d::double_t>)\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self + self)\n\t\t.def(self - self)\n\t\t.def(self * double())\n\t\t.def(double() * self)\n\t\t.def(self += self)\n\t\t.def(self -= self)\n\t\t.def(self *= double())\n\t\t.def(self /= double())\n\t\t.def(self_ns::str(self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/vector3_python.h",
    "content": "#ifndef K3DSDK_PYTHON_VECTOR3_PYTHON_H\n#define K3DSDK_PYTHON_VECTOR3_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_vector3();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_VECTOR3_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/python/vector4_python.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3dsdk/python/vector4_python.h>\n#include <k3dsdk/python/utility_python.h>\n\n#include <k3dsdk/vector4.h>\n\nusing namespace boost::python;\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_vector4()\n{\n\tclass_<k3d::vector4>(\"vector4\",\n\t\t\"Stores a direction vector in four-dimensional space\", no_init)\n\t\t.def(init<double_t, double_t, double_t, double_t>())\n\t\t.def(init<const k3d::vector4&>())\n\t\t.def(\"__len__\", &utility::constant_len_len<k3d::vector4, 4>)\n\t\t.def(\"__getitem__\", &utility::constant_len_get_item<k3d::vector4, 4, k3d::double_t>)\n\t\t.def(\"__setitem__\", &utility::constant_len_set_item<k3d::vector4, 4, k3d::double_t>)\n\t\t.def(self == self)\n\t\t.def(self != self)\n\t\t.def(self + self)\n\t\t.def(self - self)\n\t\t.def(self * double())\n\t\t.def(double() * self)\n\t\t.def(self += self)\n\t\t.def(self -= self)\n\t\t.def(self *= double())\n\t\t.def(self /= double())\n\t\t.def(self_ns::str(self));\n}\n\n} // namespace python\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/python/vector4_python.h",
    "content": "#ifndef K3DSDK_PYTHON_VECTOR4_PYTHON_H\n#define K3DSDK_PYTHON_VECTOR4_PYTHON_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace python\n{\n\nvoid define_class_vector4();\n\n} // namespace python\n\n} // namespace k3d\n\n#endif // !K3DSDK_PYTHON_VECTOR4_PYTHON_H\n"
  },
  {
    "path": "k3dsdk/qtui/CMakeLists.txt",
    "content": "PROJECT(k3dsdk-qtui)\n\nFILE(GLOB HEADERS *.h)\nFILE(GLOB SOURCES *.cpp)\n\nLIST(SORT HEADERS)\nLIST(SORT SOURCES)\n\nQT4_WRAP_CPP(MOC_BUILT_SOURCES\n\taction.h\n\tapplication.h\n\tapplication_widget.h\n\tconsole.h\n\tdocument_widget.h\n\tmode.h\n\tnag_message_dialog.h\n\tnode_list_model.h\n  property_widget_factory.h\n\t)\n\nQT4_WRAP_UI(UI_BUILT_SOURCES\n\tnag_message_dialog.ui\n\t)\n\nADD_DEFINITIONS(-DQT_NO_KEYWORDS)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\nINCLUDE_DIRECTORIES(${QT_INCLUDES})\n\nK3D_ADD_LIBRARY(k3dsdk-qtui SHARED ${HEADERS} ${SOURCES} ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_GENERATE_DEF_FILE(k3dsdk-qtui)\n\nTARGET_LINK_LIBRARIES(k3dsdk-qtui k3dsdk)\nTARGET_LINK_LIBRARIES(k3dsdk-qtui ${QT_QTCORE_LIBRARY})\nTARGET_LINK_LIBRARIES(k3dsdk-qtui ${QT_QTGUI_LIBRARY})\nTARGET_LINK_LIBRARIES(k3dsdk-qtui ${QT_QTOPENGL_LIBRARY})\nTARGET_LINK_LIBRARIES(k3dsdk-qtui ${QT_QTSCRIPT_LIBRARY})\n\nINSTALL(TARGETS k3dsdk-qtui\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR}\n\t)\n\nADD_SUBDIRECTORY(script)\n\nINCLUDE(ExternalProject)\nFIND_PROGRAM(GIT_COMMAND git)\n\nExternalProject_Add(qtscriptgenerator\n\tDOWNLOAD_COMMAND git clone git://gitorious.org/qt-labs/qtscriptgenerator.git\n\tUPDATE_COMMAND \"\"\n\tCONFIGURE_COMMAND ${CMAKE_COMMAND} -E chdir <SOURCE_DIR>/generator ${QT_QMAKE_EXECUTABLE}\n\tBUILD_COMMAND ${CMAKE_COMMAND} -E chdir <SOURCE_DIR>/generator make -j4\n\tBUILD_IN_SOURCE 1\n\tINSTALL_COMMAND \"\"\n\t)\n\nSTRING(REPLACE \";\" \":\" GENERATOR_INCLUDE_PATHS \"${QT_INCLUDES}\")\n\nExternalProject_Add_Step(qtscriptgenerator generate-bindings\n\tDEPENDEES build\n\tWORKING_DIRECTORY \"<SOURCE_DIR>/generator\"\n\tCOMMAND <SOURCE_DIR>/generator/generator --include-paths=${GENERATOR_INCLUDE_PATHS}\n\t)\n\nExternalProject_Add_Step(qtscriptgenerator configure-bindings\n\tDEPENDEES generate-bindings\n\tWORKING_DIRECTORY \"<SOURCE_DIR>/qtbindings\"\n\tCOMMAND ${QT_QMAKE_EXECUTABLE} -after \"SUBDIRS-=qtscript_sql qtscript_phonon qtscript_webkit\"\n\t)\n\nExternalProject_Add_Step(qtscriptgenerator build-bindings\n\tDEPENDEES configure-bindings\n\tWORKING_DIRECTORY \"<SOURCE_DIR>/qtbindings\"\n\tCOMMAND make -j4\n\tDEPENDERS install\n\t)\n\nExternalProject_Get_Property(qtscriptgenerator SOURCE_DIR)\nSET(K3D_EXTRA_QT_PLUGINS \"${SOURCE_DIR}/plugins\" CACHE PATH \"List of semicolon-delimited Qt plugin directories.\")\n\n"
  },
  {
    "path": "k3dsdk/qtui/action.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/qtui/action.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/icon_factory.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// action\n\naction::action(QObject* Parent, const sigc::slot<void>& Slot) :\n\tbase(Parent)\n{\n\tinitialize(Slot);\n}\n\naction::action(const QString& Text, QObject* Parent, const sigc::slot<void>& Slot) :\n\tbase(Text, Parent)\n{\n\tinitialize(Slot);\n}\n\naction::action(const QIcon& Icon, const QString& Text, QObject* Parent, const sigc::slot<void>& Slot) :\n\tbase(Icon, Text, Parent)\n{\n\tinitialize(Slot);\n}\n\naction* action::create(iplugin_factory& Factory, QObject* Parent, const sigc::slot<void>& Slot)\n{\n\taction* const result = new action(Parent, Slot);\n\n\tswitch(Factory.quality())\n\t{\n\tcase k3d::iplugin_factory::EXPERIMENTAL:\n\t\tresult->setText(QString(\"%1 (Experimental)\").arg(k3d::convert<QString>(Factory.name())));\n\t\tbreak;\n\tcase k3d::iplugin_factory::DEPRECATED:\n\t\tresult->setText(QString(\"%1 (Deprecated)\").arg(k3d::convert<QString>(Factory.name())));\n\t\tbreak;\n\tcase k3d::iplugin_factory::STABLE:\n\t\tresult->setText(k3d::convert<QString>(Factory.name()));\n\t\tbreak;\n\t}\n\tresult->setToolTip(k3d::convert<QString>(Factory.short_description()));\n\tresult->setIcon(icon_factory::create(Factory));\n\tresult->setIconVisibleInMenu(true);\n\n\treturn result;\n}\n\nvoid action::initialize(const sigc::slot<void>& Slot)\n{\n\tconnect(this, SIGNAL(triggered(bool)), this, SLOT(on_triggered(bool)));\n\ttriggered_signal.connect(sigc::hide(Slot));\n}\n\nvoid action::on_triggered(bool checked)\n{\n\ttriggered_signal.emit(checked);\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/action.h",
    "content": "#ifndef K3DSDK_QTUI_ACTION_H\n#define K3DSDK_QTUI_ACTION_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/signal_system.h>\n#include <QAction>\n\nnamespace k3d\n{\n\nclass iplugin_factory;\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// action\n\nclass action :\n\tpublic QAction\n{\n\tQ_OBJECT;\n\n\ttypedef QAction base;\n\npublic:\n\taction(QObject* Parent, const sigc::slot<void>& Slot);\n\taction(const QString& Text, QObject* Parent, const sigc::slot<void>& Slot);\n\taction(const QIcon& Icon, const QString& Text, QObject* Parent, const sigc::slot<void>& Slot);\n\n\t/// Creates a standarized action based on a K-3D plugin type\n\tstatic action* create(iplugin_factory& Factory, QObject* Parent, const sigc::slot<void>& Slot);\n\nprivate Q_SLOTS:\n\tvoid initialize(const sigc::slot<void>& Slot);\n\tvoid on_triggered(bool);\n\nprivate:\n\tsigc::signal<void, bool> triggered_signal;\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_ACTION_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/application.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/application.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/qtui/application.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// application\n\napplication& application::instance()\n{\n\tstatic application g_application;\n\treturn g_application;\n}\n\napplication::application()\n{\n}\n\napplication::~application()\n{\n}\n\nvoid application::close()\n{\n\tQ_EMIT closing();\n\tk3d::application().exit();\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/application.h",
    "content": "#ifndef K3DSDK_QTUI_APPLICATION_H\n#define K3DSDK_QTUI_APPLICATION_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <QObject>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// application\n\n/// Provides a singleton for managing the running K-3D application.\nclass application :\n\tpublic QObject\n{\n\tQ_OBJECT;\npublic:\n\tstatic application& instance();\n\npublic Q_SLOTS:\n\tvoid close();\n\nQ_SIGNALS:\n\tvoid closing();\n\nprivate:\n\tapplication();\n\t~application();\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_APPLICATION_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/application_widget.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/qtui/application.h>\n#include <k3dsdk/qtui/application_widget.h>\n\n#include <QWidget>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// application_widget\n\napplication_widget::application_widget(QWidget& Owner) :\n\towner(Owner)\n{\n\tconnect(&application::instance(), SIGNAL(closing()), this, SLOT(application_closing()));\n}\n\nvoid application_widget::application_closing()\n{\n\towner.close();\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/application_widget.h",
    "content": "#ifndef K3DSDK_QTUI_APPLICATION_WIDGET_H\n#define K3DSDK_QTUI_APPLICATION_WIDGET_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <QObject>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// application_widget\n\n/// Provides a mixin-class for widgets that should be closed automatically if the application is closed.\nclass application_widget :\n\tpublic QObject\n{\n\tQ_OBJECT;\n\n\ttypedef QObject base;\n\npublic:\n\tapplication_widget(QWidget& Owner);\n\nprivate Q_SLOTS:\n\t/// Called when the application is about to close.\n\tvoid application_closing();\n\nprivate:\n\tQWidget& owner;\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_APPLICATION_WIDGET_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/console.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/qtui/console.h>\n\n#include <boost/algorithm/string.hpp>\n\n#include <QScrollBar>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace console\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget::implementation\n\nclass widget::implementation\n{\npublic:\n\tstd::vector<QString> history;\n\tsize_t history_index;\n\tQString command;\n\tint edit_begin;\n\tint edit_end;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\nwidget::widget(QWidget* Parent) :\n\tbase(Parent),\n\tinternal(new implementation())\n{\n\tinternal->history_index = 0;\n\tinternal->edit_begin = 0;\n\tinternal->edit_end = 0;\n\n\tQObject::connect(this, SIGNAL(textChanged()), this, SLOT(on_text_changed()));\n}\n\nwidget::~widget()\n{\n\tdelete internal;\n}\n\nvoid widget::print_text(const QString& String)\n{\n\tappendPlainText(String);\n\tprint();\n}\n\nvoid widget::print_html(const QString& HTML)\n{\n\tappendHtml(HTML);\n\tprint();\n}\n\nvoid widget::scroll_to_end()\n{\n\thorizontalScrollBar()->setValue(horizontalScrollBar()->minimum());\n\tverticalScrollBar()->setValue(verticalScrollBar()->maximum());\n}\n\nvoid widget::on_text_changed()\n{\n\tQTextCursor cursor(document());\n\tcursor.movePosition(QTextCursor::End);\n\n\tinternal->edit_end = cursor.position();\n\tinternal->edit_begin = std::min(internal->edit_begin, internal->edit_end);\n}\n\nvoid widget::print()\n{\n\tQTextCursor cursor(document());\n\tcursor.movePosition(QTextCursor::End);\n\n\tinternal->edit_end = cursor.position();\n\tinternal->edit_begin = cursor.position();\n\n\tscroll_to_end();\n}\n\nvoid widget::showEvent(QShowEvent* Event)\n{\n\tscroll_to_end();\n}\n\nvoid widget::keyPressEvent(QKeyEvent* Event)\n{\n\tQTextCursor cursor = textCursor();\n\tif(cursor.anchor() < internal->edit_begin || cursor.position() < internal->edit_begin)\n\t{\n\t\tcursor.movePosition(QTextCursor::End);\n\t\tsetTextCursor(cursor);\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tswitch(Event->key())\n\t\t{\n\t\t\tcase Qt::Key_Enter:\n\t\t\tcase Qt::Key_Return:\n\t\t\t{\n\t\t\t\tconst QString command = toPlainText().mid(internal->edit_begin, internal->edit_end - internal->edit_begin);\n\n\t\t\t\tif(!command.isEmpty() && (internal->history.empty() || command != internal->history.back()))\n\t\t\t\t\tinternal->history.push_back(command);\n\t\t\t\tinternal->history_index = internal->history.size();\n\n\t\t\t\tQ_EMIT execute(command);\n\n\t\t\t\tcursor.movePosition(QTextCursor::End);\n\t\t\t\tsetTextCursor(cursor);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase Qt::Key_Backspace:\n\t\t\tcase Qt::Key_Left:\n\t\t\t{\n\t\t\t\tif(cursor.position() > internal->edit_begin)\n\t\t\t\t\tbase::keyPressEvent(Event);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase Qt::Key_Up:\n\t\t\t{\n\t\t\t\tif(internal->history_index)\n\t\t\t\t{\n\t\t\t\t\tif(internal->history_index == internal->history.size())\n\t\t\t\t\t\tinternal->command = toPlainText().mid(internal->edit_begin, internal->edit_end - internal->edit_begin);\n\n\t\t\t\t\tinternal->history_index -= 1;\n\n\t\t\t\t\tcursor.setPosition(internal->edit_begin);\n\t\t\t\t\tcursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, internal->edit_end - internal->edit_begin);\n\t\t\t\t\tcursor.insertText(internal->history[internal->history_index]);\n\n\t\t\t\t\tcursor.movePosition(QTextCursor::End);\n\t\t\t\t\tsetTextCursor(cursor);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase Qt::Key_Down:\n\t\t\t{\n\t\t\t\tif(internal->history_index < internal->history.size())\n\t\t\t\t{\n\t\t\t\t\tinternal->history_index += 1;\n\n\t\t\t\t\tcursor.setPosition(internal->edit_begin);\n\t\t\t\t\tcursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, internal->edit_end - internal->edit_begin);\n\t\t\t\t\tcursor.insertText(internal->history_index < internal->history.size()\n\t\t\t\t\t\t? internal->history[internal->history_index]\n\t\t\t\t\t\t: internal->command);\n\n\t\t\t\t\tcursor.movePosition(QTextCursor::End);\n\t\t\t\t\tsetTextCursor(cursor);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase Qt::Key_Home:\n\t\t\t{\n\t\t\t\tcursor.setPosition(internal->edit_begin);\n\t\t\t\tsetTextCursor(cursor);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase Qt::Key_End:\n\t\t\t{\n\t\t\t\tcursor.setPosition(internal->edit_end);\n\t\t\t\tsetTextCursor(cursor);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tbase::keyPressEvent(Event);\n}\n\n} // namespace console\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/console.h",
    "content": "#ifndef K3DSDK_QTUI_CONSOLE_H\n#define K3DSDK_QTUI_CONSOLE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <QPlainTextEdit>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace console\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\n/// Provides a \"console\" widget that can be used for line-oriented output\nclass widget :\n        public QPlainTextEdit\n{\n\ttypedef QPlainTextEdit base;\n\n\tQ_OBJECT;\n\npublic:\n\twidget(QWidget* Parent = 0);\n\t~widget();\n\nQ_SIGNALS:\n\t/// Signal that will be emitted whenever the user enters a command to be executed.\n\tvoid execute(const QString& Command);\n\npublic Q_SLOTS:\n\t/// Writes the supplied text to the console.\n\tvoid print_text(const QString& String);\n\t/// Writes the supplied HTML to the console.\n\tvoid print_html(const QString& HTML);\n\t/// Scrolls the console to the end of its output.\n\tvoid scroll_to_end();\n\n/*\n\t/// Set the completion key\n\tvoid set_completion_key(const uint_t KeySym);\n\n\t/// Connects a slot to a signal that will be emitted when the \"completion request\" key (see set_completion_key) is pressed\n\tsigc::connection connect_complete_key_pressed_signal(const sigc::slot<void, const string_t&>& Slot);\n*/\n\nprivate Q_SLOTS:\n\tvoid on_text_changed();\n\nprivate:\n\tvoid print();\n\tvoid showEvent(QShowEvent* Event);\n\tvoid keyPressEvent(QKeyEvent* Event);\n\n\tclass implementation;\n\timplementation* const internal;\n};\n\n} // namespace console\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_CONSOLE_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/convert.h",
    "content": "#ifndef K3DSDK_QTUI_CONVERT_H\n#define K3DSDK_QTUI_CONVERT_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/convert.h>\n#include <k3dsdk/ustring.h>\n#include <k3dsdk/types.h>\n\n#include <QColor>\n#include <QString>\n\nnamespace k3d\n{\n\n/// Specialization of k3d::convert that converts k3d::string_t to QString.\ntemplate<>\ninline QString convert(const string_t& From)\n{\n\treturn QString(From.c_str());\n}\n\n/// Specialization of k3d::convert that converts k3d::ustring to QString.\ntemplate<>\ninline QString convert(const ustring& From)\n{\n\treturn QString::fromUtf8(From.utf8_str().c_str());\n}\n\n/// Specialization of k3d::convert that converts k3d::color to QColor.\ntemplate<>\ninline QColor convert(const color& From)\n{\n\treturn QColor::fromRgbF(From.red, From.green, From.blue, 1.0);\n}\n\n/// Specialization of k3d::convert that converts QColor to k3d::color.\ntemplate<>\ninline color convert(const QColor& From)\n{\n\treturn color(From.redF(), From.greenF(), From.blueF());\n}\n\n/// Specialization of k3d::convert that converts QString to k3d::string_t.\n/** \\deprecated This is a potentially lossy conversion, since we're going from Unicode to ASCII. */\ntemplate<>\ninline string_t convert(const QString& From)\n{\n\treturn From.toAscii().data();\n}\n\n/// Specialization of k3d::convert that converts QString to k3d::ustring.\ntemplate<>\ninline ustring convert(const QString& From)\n{\n\treturn ustring::from_utf8(From.toUtf8().data());\n}\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_CONVERT_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/document.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/transform.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nvoid populate_new_document(idocument& Document)\n{\n\tstatic unsigned long document_number = 0;\n\n\tconst k3d::ustring new_title = k3d::ustring::from_utf8(k3d::string_cast(boost::format(_(\"Untitled Document %1%\")) % ++document_number));\n\tk3d::property::set_internal_value(Document.title(), new_title);\n\n\tk3d::imetadata* const node_selection = k3d::plugin::create<k3d::imetadata>(\"NodeSelection\", Document, \"Node Selection\");\n\treturn_if_fail(node_selection);\n\tnode_selection->set_metadata_value(\"ngui:unique_node\", \"node_selection\"); // metadata to ensure this node is found by the UI layer\n\n\tk3d::plugin::create(k3d::classes::Axes(), Document, \"Axes\");\n\tk3d::iunknown* gl_engine = k3d::plugin::create(k3d::classes::OpenGLEngine(), Document, \"GL Engine\");\n\tk3d::plugin::create(k3d::classes::TimeSource(), Document, \"TimeSource\");\n\t\n\tk3d::inode* const multi_painter = k3d::plugin::create<k3d::inode>(\"OpenGLMultiPainter\", Document, \"GL Default Painter\");\n\treturn_if_fail(multi_painter);\n\n/*\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"points\", \"Points\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLPointPainter\", Document, \"GL Point Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"edges\", \"Edges\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLEdgePainter\", Document, \"GL Edge Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"faces\", \"Faces\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLFacePainter\", Document, \"GL Face Painter\"));\n\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"sds_points\", \"SDS Points\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLSDSPointPainter\", Document, \"SDS Point Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"sds_edges\", \"SDS Edges\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLSDSEdgePainter\", Document, \"SDS Edge Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"sds_faces\", \"SDS Faces\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"VirtualOpenGLSDSFacePainter\", Document, \"SDS Face Painter\"));\n\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"linear_curves\", \"Linear Curves\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLLinearCurvePainter\", Document, \"GL Linear Curve Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"cubic_curves\", \"Cubic Curves\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLCubicCurvePainter\", Document, \"GL Cubic Curve Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"nurbs_curves\", \"NURBS Curves\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLNURBSCurvePainter\", Document, \"GL NURBS Curve Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"bilinear_patches\", \"Bilinear Patches\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLBilinearPatchPainter\", Document, \"GL Bilinear Patch Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"bicubic_patches\", \"Bicubic Patches\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLBicubicPatchPainter\", Document, \"GL Bicubic Patch Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"nurbs_patches\", \"NURBS Patches\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLNURBSPatchPainter\", Document, \"GL NURBS Patch Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"bezier_triangle_patches\", \"Bezier Triangle Patches\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLBezierTrianglePatchPainter\", Document, \"GL Bezier Triangle Patch Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"blobbies\", \"Blobbies\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLBlobbyPointPainter\", Document, \"GL Blobby Point Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"face_normals\", \"Face Normals\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLFaceNormalPainter\", Document, \"GL Face Normal Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"face_orientation\", \"Face Orientation\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLFaceOrientationPainter\", Document, \"GL Face Orientation Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"cones\", \"Cones\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLConePainter\", Document, \"GL Cone Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"cylinders\", \"Cylinders\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLCylinderPainter\", Document, \"GL Cylinder Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"disks\", \"Disks\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLDiskPainter\", Document, \"GL Disk Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"hyperboloids\", \"Hyperboloids\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLHyperboloidPainter\", Document, \"GL Hyperboloid Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"paraboloids\", \"Paraboloids\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLParaboloidPainter\", Document, \"GL Paraboloid Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"spheres\", \"Spheres\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLSpherePainter\", Document, \"GL Sphere Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"teapots\", \"Teapots\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLTeapotPainter\", Document, \"GL Teapot Painter\"));\n\tk3d::property::create<k3d::gl::imesh_painter*>(*multi_painter, \"tori\", \"Tori\", \"\", k3d::plugin::create<k3d::gl::imesh_painter>(\"OpenGLTorusPainter\", Document, \"GL Torus Painter\"));\n*/\n\n\tk3d::property::set_internal_value(*gl_engine, \"node_selection\", dynamic_cast<k3d::inode*>(node_selection));\n\treturn_if_fail(k3d::plugin::factory::lookup(\"Camera\"));\n\n\tk3d::inode* const camera = k3d::plugin::create<k3d::inode>(\"Camera\", Document, \"Camera\");\n\treturn_if_fail(camera);\n\n\tconst k3d::point3 origin = k3d::point3(0, 0, 0);\n\tconst k3d::vector3 world_up = k3d::vector3(0, 0, 1);\n\n\tconst k3d::point3 position = k3d::point3(-15, 20, 10);\n\tconst k3d::vector3 look_vector = origin - position;\n\tconst k3d::vector3 right_vector = look_vector ^ world_up;\n\tconst k3d::vector3 up_vector = right_vector ^ look_vector;\n\n\tk3d::inode* const camera_transformation = k3d::set_matrix(*camera, k3d::view_matrix(look_vector, up_vector, position));\n\treturn_if_fail(camera_transformation);\n\n\tcamera_transformation->set_name(\"Camera Transformation\");\n\tk3d::property::set_internal_value(*camera, \"world_target\", k3d::point3(0, 0, 0));\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/document.h",
    "content": "#ifndef K3DSDK_QTUI_DOCUMENT_H\n#define K3DSDK_QTUI_DOCUMENT_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nclass idocument;\n\nnamespace qtui\n{\n\n/// Populates a newly-created document to provide users with a good out-of-box experience.\nvoid populate_new_document(idocument& Document);\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_DOCUMENT_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/document_widget.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/qtui/application.h>\n#include <k3dsdk/qtui/document_widget.h>\n\n#include <QWidget>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// document_widget\n\ndocument_widget::document_widget(QWidget& Owner, idocument& Document) :\n\towner(Owner),\n\towning_document(Document)\n{\n\tconnect(&application::instance(), SIGNAL(closing()), this, SLOT(application_closing()));\n}\n\nidocument& document_widget::document()\n{\n\treturn owning_document;\n}\n\nvoid document_widget::application_closing()\n{\n\towner.close();\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/document_widget.h",
    "content": "#ifndef K3DSDK_QTUI_DOCUMENT_WIDGET_H\n#define K3DSDK_QTUI_DOCUMENT_WIDGET_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <QObject>\n\nnamespace k3d\n{\n\nclass idocument;\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// document_widget\n\n/// Provides a mixin-class for widgets that should be closed automatically if a document is closed.\nclass document_widget :\n\tpublic QObject\n{\n\tQ_OBJECT;\n\n\ttypedef QObject base;\n\npublic:\n\tdocument_widget(QWidget& Owner, idocument& Document);\n\n\tidocument& document();\n\nprivate Q_SLOTS:\n\t/// Called when the application is about to close.\n\tvoid application_closing();\n\nprivate:\n\tQWidget& owner;\n\tidocument& owning_document;\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_DOCUMENT_WIDGET_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/file_dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/options.h>\n#include <k3dsdk/qtui/file_dialog.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// file_dialog\n\nconst k3d::filesystem::path file_dialog::get_open_filename(QWidget* parent, const QString& caption, const k3d::string_t& type, const QString& filter, QString* selectedFilter, QFileDialog::Options options)\n{\n\tconst k3d::filesystem::path default_path = k3d::options::get_path(type);\n\tconst k3d::filesystem::path result = k3d::filesystem::native_path(k3d::ustring::from_utf8(QFileDialog::getOpenFileName(parent, caption, default_path.native_filesystem_string().c_str(), filter, selectedFilter, options).toStdString()));\n\tif(!result.empty())\n\t\tk3d::options::set_path(type, result);\n\n\treturn result;\n}\n\nconst k3d::filesystem::path file_dialog::get_save_filename(QWidget* parent, const QString& caption, const k3d::string_t& type, const QString& filter, QString* selectedFilter, QFileDialog::Options options)\n{\n\tconst k3d::filesystem::path default_path = k3d::options::get_path(type);\n\tconst k3d::filesystem::path result = k3d::filesystem::native_path(k3d::ustring::from_utf8(QFileDialog::getSaveFileName(parent, caption, default_path.native_filesystem_string().c_str(), filter, selectedFilter, options).toStdString()));\n\tif(!result.empty())\n\t\tk3d::options::set_path(type, result);\n\n\treturn result;\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/file_dialog.h",
    "content": "#ifndef K3DSDK_QTUI_FILE_DIALOG_H\n#define K3DSDK_QTUI_FILE_DIALOG_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <QFileDialog>\n#include <k3dsdk/path.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// file_dialog\n\nclass file_dialog\n{\npublic:\n\tstatic const filesystem::path get_open_filename(QWidget* parent = 0, const QString& caption = QString(), const k3d::string_t& type = k3d::string_t(), const QString& filter = QString(), QString* selectedFilter = 0, QFileDialog::Options options = 0);\n\tstatic const filesystem::path get_save_filename(QWidget* parent = 0, const QString& caption = QString(), const k3d::string_t& type = k3d::string_t(), const QString& filter = QString(), QString* selectedFilter = 0, QFileDialog::Options options = 0);\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_FILE_DIALOG_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/focus.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/qtui/focus.h>\n#include <k3dsdk/signal_accumulators.h>\n\n#include <map>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace focus\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mediator::implementation\n\nclass mediator::implementation\n{\npublic:\n\tstatic implementation& instance(idocument& Document)\n\t{\n\t\ttypedef std::map<idocument*, implementation*> cache_t;\n\t\tstatic cache_t cache;\n\t\tcache_t::iterator result = cache.find(&Document);\n\t\tif(result == cache.end())\n\t\t\tresult = cache.insert(std::make_pair(&Document, new implementation(Document))).first;\n\n\t\treturn *result->second;\n\t}\n\n\tidocument& document;\n\n\tsigc::signal<void, inode*, iunknown*> node_focus_signal;\n\nprivate:\n\timplementation(idocument& Document) :\n\t\tdocument(Document)\n\t{\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mediator\n\nmediator::mediator(idocument& Document) :\n\tinternal(implementation::instance(Document))\n{\n}\n\nvoid mediator::set_focus(inode& Node)\n{\n\tinternal.node_focus_signal.emit(&Node, 0);\n}\n\nvoid mediator::set_focus(inode& Node, iunknown& Sender)\n{\n\tinternal.node_focus_signal.emit(&Node, &Sender);\n}\n\nsigc::connection mediator::connect_focus_node_signal(const sigc::slot<void, inode*, iunknown*>& Slot)\n{\n\treturn internal.node_focus_signal.connect(Slot);\n}\n\n} // namespace focus\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/focus.h",
    "content": "#ifndef K3DSDK_QTUI_FOCUS_H\n#define K3DSDK_QTUI_FOCUS_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nclass idocument;\nclass inode;\nclass iunknown;\n\nnamespace qtui\n{\n\nnamespace focus\n{\n\n/// Mediates access to a per-document \"focus\" object\nclass mediator\n{\npublic:\n\tmediator(idocument& Document);\n\n\t/// Called to \"focus\" the given node.\n\tvoid set_focus(inode& Node);\n\n\t/// Called to \"focus\" the given node.\n\tvoid set_focus(inode& Node, iunknown& Sender);\n\n\t/// Connects a slot to a signal that will be emitted whenever a node receives the \"focus\".\n\tsigc::connection connect_focus_node_signal(const sigc::slot<void, inode*, iunknown*>& Slot);\n\nprivate:\n\tclass implementation;\n\timplementation& internal;\n};\n\n} // namespace focus\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_FOCUS_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/icon_factory.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/icon_factory.h>\n#include <k3dsdk/share.h>\n#include <QIcon>\n#include <map>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/// Caches icons that have already been loaded into memory\nstatic std::map<iplugin_factory*, QIcon> plugin_icons;\n\nQIcon icon_factory::create(inode& Node)\n{\n\treturn create(Node.factory());\n}\n\nQIcon icon_factory::create(iplugin_factory& Plugin)\n{\n\tif(!plugin_icons.count(&Plugin))\n\t{\n\t\tplugin_icons.insert(std::make_pair(&Plugin,\n\t\t\tQIcon(convert<QString>((share_path() / filesystem::generic_path(\"qtui/icons/\" + Plugin.name() + \".svg\")).native_filesystem_string()))));\n\t}\n\n\treturn plugin_icons[&Plugin];\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/icon_factory.h",
    "content": "#ifndef K3DSDK_QTUI_ICON_FACTORY_H\n#define K3DSDK_QTUI_ICON_FACTORY_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <QObject>\n\nclass QIcon;\n\nnamespace k3d\n{\n\nclass inode;\nclass iplugin_factory;\n\nnamespace qtui\n{\n\n/// Generates icons\nclass icon_factory :\n\tpublic QObject\n{\n\tQ_OBJECT;\npublic:\n\tstatic QIcon create(inode& Node);\n\tstatic QIcon create(iplugin_factory& Plugin);\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_ICON_FACTORY_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/message.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/batch_mode.h>\n#include <k3dsdk/qtui/options.h>\n#include <k3dsdk/result.h>\n\n#include <QMessageBox>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nvoid message(const QString& Message, const QString& SecondaryMessage)\n{\n\tif(batch_mode())\n\t\treturn;\n\n\tQMessageBox dialog(QMessageBox::Information, QObject::tr(\"Information\"), Message, QMessageBox::Ok);\n\tdialog.setInformativeText(SecondaryMessage);\n\tdialog.exec();\n}\n\nvoid warning_message(const QString& Message, const QString& SecondaryMessage)\n{\n\tif(batch_mode())\n\t\treturn;\n\n\tQMessageBox dialog(QMessageBox::Warning, QObject::tr(\"Warning\"), Message, QMessageBox::Ok);\n\tdialog.setInformativeText(SecondaryMessage);\n\tdialog.exec();\n}\n\nvoid error_message(const QString& Message, const QString& SecondaryMessage)\n{\n\tif(batch_mode())\n\t\treturn;\n\n\tQMessageBox dialog(QMessageBox::Critical, QObject::tr(\"Error\"), Message, QMessageBox::Ok);\n\tdialog.setInformativeText(SecondaryMessage);\n\tdialog.exec();\n}\n\n/*\nbool_t cancel_plugin(iplugin_factory& Factory)\n{\n\tif(batch_mode())\n\t\treturn false;\n\n\tswitch(Factory.quality())\n\t{\n\t\tcase iplugin_factory::EXPERIMENTAL:\n\t\t{\n\t\t\tif(!options::nag(\"warn_experimental\"))\n\t\t\t\treturn false;\n\n\t\t\tGtk::MessageDialog dialog(_(\"Use Experimental Plugin?\"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL, true);\n\t\t\tdialog.set_secondary_text(_(\"Experimental plugins are still under development and may be modified or removed at any time.  If this happens, documents that include them may become unusable.\"));\n\n\t\t\tGtk::CheckButton show_message(_(\"Display this message again in the future\"));\n\t\t\tshow_message.set_active(true);\n\t\t\tshow_message.show();\n\n\t\t\tGtk::Alignment alignment(0.5, 0.5, 0, 0);\n\t\t\talignment.add(show_message);\n\t\t\talignment.show();\n\n\t\t\tdialog.get_vbox()->pack_start(alignment);\n\n\t\t\tdialog.set_default_response(Gtk::RESPONSE_CANCEL);\n\n\t\t\tconst int response = dialog.run();\n\n\t\t\toptions::enable_nag(\"warn_experimental\", show_message.get_active());\n\n\t\t\treturn response != Gtk::RESPONSE_OK;\n\t\t}\n\t\tcase iplugin_factory::STABLE:\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tcase iplugin_factory::DEPRECATED:\n\t\t{\n\t\t\tif(!options::nag(\"warn_deprecated\"))\n\t\t\t\treturn false;\n\n\t\t\tGtk::MessageDialog dialog(_(\"Use Deprecated Plugin?\"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL, true);\n\t\t\tdialog.set_secondary_text(_(\"Deprecated plugins are scheduled for removal in future versions of K-3D.  When this happens, documents that include them may become unusable.  We strongly recommend against using deprecated plugins, unless you plan to keep a specific version of K-3D on-hand to maintain them.\"));\n\n\t\t\tGtk::CheckButton show_message(_(\"Display this message again in the future\"));\n\t\t\tshow_message.set_active(true);\n\t\t\tshow_message.show();\n\n\t\t\tGtk::Alignment alignment(0.5, 0.5, 0, 0);\n\t\t\talignment.add(show_message);\n\t\t\talignment.show();\n\n\t\t\tdialog.get_vbox()->pack_start(alignment);\n\n\t\t\tdialog.set_default_response(Gtk::RESPONSE_CANCEL);\n\n\t\t\tconst int response = dialog.run();\n\n\t\t\toptions::enable_nag(\"warn_deprecated\", show_message.get_active());\n\n\t\t\treturn response != Gtk::RESPONSE_OK;\n\t\t}\n\t}\n}\n*/\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/message.h",
    "content": "#ifndef K3DSDK_QTUI_MESSAGE_H\n#define K3DSDK_QTUI_MESSAGE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nclass QString;\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/// Displays an informational message in a modal dialog box\nvoid message(const QString& Message, const QString& SecondaryMessage);\n/// Displays a warning message in a modal dialog box\nvoid warning_message(const QString& Message, const QString& SecondaryMessage);\n/// Displays an error message in a modal dialog box\nvoid error_message(const QString& Message, const QString& SecondaryMessage);\n\n/*\n/// Warns the user before creating an experimental or deprecated plugin, and gives them a chance to cancel.  Returns true iff the user decided to cancel.\nbool_t cancel_plugin(iplugin_factory& Factory);\n*/\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_MESSAGE_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/modal_text_editor.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/qtui/modal_text_editor.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// modal_text_editor\n\nmodal_text_editor::modal_text_editor()\n{\n}\n\nmodal_text_editor::~modal_text_editor()\n{\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/modal_text_editor.h",
    "content": "#ifndef K3DSDK_QTUI_MODAL_TEXT_EDITOR_H\n#define K3DSDK_QTUI_MODAL_TEXT_EDITOR_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\nclass QString;\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// modal_text_editor\n\nclass modal_text_editor\n{\npublic:\n\tvirtual ~modal_text_editor();\n\n\tvirtual bool_t modal_edit(const QString& Label, QString& Text) = 0;\n\nprotected:\n\tmodal_text_editor();\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_MODAL_TEXT_EDITOR_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/mode.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/qtui/mode.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mode\n\nmode::mode()\n{\n}\n\nmode::~mode()\n{\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/mode.h",
    "content": "#ifndef K3DSDK_QTUI_MODE_H\n#define K3DSDK_QTUI_MODE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <QObject>\n\nclass QGraphicsScene;\n\nnamespace k3d\n{\n\nclass idocument;\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mode\n\n/// Abstract base class for Modes - objects that control user-interaction by\n/// combining rendering, interaction, and business logic in one place.\nclass mode :\n\tpublic QObject\n{\n\tQ_OBJECT;\npublic:\n\tvirtual ~mode();\n\n\tvirtual void enable(idocument& Document, QGraphicsScene& Scene) = 0;\n\nprotected:\n\tmode();\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_MODE_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/nag_message_dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/batch_mode.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/nag_message_dialog.h>\n#include <k3dsdk/qtui/options.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// nag_message_dialog\n\nnag_message_dialog::nag_message_dialog(const QString& Message, const QString& SecondaryMessage)\n{\n\tui.setupUi(this);\n\tui.icon->setPixmap(QIcon::fromTheme(\"dialog-information\").pixmap(48));\n\tui.message->setText(Message);\n\tui.secondaryMessage->setText(SecondaryMessage);\n}\n\nconst bool_t nag_message_dialog::show_message() const\n{\n\treturn ui.showMessage->isChecked();\n}\n\nvoid nag_message_dialog::nag(const string_t& Type, const ustring& Message, const ustring& SecondaryMessage)\n{\n\tif(batch_mode())\n\t\treturn;\n\n\tif(!options::nag(Type))\n\t\treturn;\n\n\tnag_message_dialog dialog(convert<QString>(Message), convert<QString>(SecondaryMessage));\n\tdialog.exec();\n\toptions::enable_nag(Type, dialog.show_message());\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/nag_message_dialog.h",
    "content": "#ifndef K3DSDK_QTUI_NAG_MESSAGE_DIALOG_H\n#define K3DSDK_QTUI_NAG_MESSAGE_DIALOG_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <ui_nag_message_dialog.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nclass ustring;\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// nag_message_dialog\n\n/// Provides a mixin-class for widgets that should be closed automatically if a document is closed.\nclass nag_message_dialog :\n\tpublic QDialog\n{\n\tQ_OBJECT;\n\n\ttypedef QDialog base;\n\npublic:\n\tnag_message_dialog(const QString& Message, const QString& SecondaryMessage = \"\");\n\n\tconst bool_t show_message() const;\n\n\tstatic void nag(const string_t& Type, const ustring& Message, const ustring& SecondaryMessage);\n\nprivate:\n\tUi::nag_message_dialog ui;\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_NAG_MESSAGE_DIALOG_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/nag_message_dialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>nag_message_dialog</class>\n <widget class=\"QDialog\" name=\"nag_message_dialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>409</width>\n    <height>131</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n    <horstretch>0</horstretch>\n    <verstretch>0</verstretch>\n   </sizepolicy>\n  </property>\n  <property name=\"windowTitle\">\n   <string>K-3D</string>\n  </property>\n  <layout class=\"QGridLayout\" name=\"gridLayout\">\n   <property name=\"spacing\">\n    <number>10</number>\n   </property>\n   <item row=\"0\" column=\"1\">\n    <widget class=\"QLabel\" name=\"message\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Minimum\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"font\">\n      <font>\n       <pointsize>12</pointsize>\n       <weight>75</weight>\n       <bold>true</bold>\n      </font>\n     </property>\n     <property name=\"text\">\n      <string>TextLabel</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>false</bool>\n     </property>\n    </widget>\n   </item>\n   <item row=\"1\" column=\"1\">\n    <widget class=\"QLabel\" name=\"secondaryMessage\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Minimum\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"text\">\n      <string>TextLabel</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item row=\"2\" column=\"1\">\n    <widget class=\"QCheckBox\" name=\"showMessage\">\n     <property name=\"text\">\n      <string>Display this message again in the future</string>\n     </property>\n     <property name=\"checked\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item row=\"3\" column=\"1\">\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n   <item row=\"0\" column=\"0\" rowspan=\"2\">\n    <widget class=\"QLabel\" name=\"icon\">\n     <property name=\"text\">\n      <string>TextLabel</string>\n     </property>\n     <property name=\"alignment\">\n      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>nag_message_dialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>nag_message_dialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "k3dsdk/qtui/node_list_model.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/icon_factory.h>\n#include <k3dsdk/qtui/node_list_model.h>\n#include <k3dsdk/result.h>\n\n#include <QIcon>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// node_list_model\n\nnode_list_model::node_list_model(QObject* Parent) :\n\tbase(Parent)\n{\n}\n\nnode_list_model::~node_list_model()\n{\n}\n\nvoid node_list_model::add_nodes(const std::vector<inode*>& Nodes)\n{\n\tbeginResetModel();\n\n\tfor(uint_t i = 0; i != Nodes.size(); ++i)\n\t\tnodes.erase(std::remove(nodes.begin(), nodes.end(), Nodes[i]), nodes.end());\n\tnodes.insert(nodes.end(), Nodes.begin(), Nodes.end());\n\tnodes.erase(std::remove(nodes.begin(), nodes.end(), static_cast<inode*>(0)), nodes.end());\n\n\tendResetModel();\n}\n\nvoid node_list_model::remove_nodes(const std::vector<inode*>& Nodes)\n{\n\tbeginResetModel();\n\n\tfor(uint_t i = 0; i != Nodes.size(); ++i)\n\t\tnodes.erase(std::remove(nodes.begin(), nodes.end(), Nodes[i]), nodes.end());\n\n\tendResetModel();\n}\n\ninode* node_list_model::node(const QModelIndex& Index)\n{\n\tif(Index.isValid() && Index.row() < nodes.size())\n\t\treturn nodes[Index.row()];\n\n  assert_not_reached();\n  return 0;\n}\n\nint node_list_model::rowCount(const QModelIndex& Parent) const\n{\n\treturn nodes.size();\n}\n\nQVariant node_list_model::data(const QModelIndex& Index, int Role) const\n{\n\tif(Index.isValid() && Index.row() < nodes.size())\n\t{\n\t\tinode& node = *nodes[Index.row()];\n\t\tswitch(Role)\n\t\t{\n\t\t\tcase Qt::DisplayRole:\n\t\t\t{\n\t\t\t\treturn convert<QString>(node.name());\n\t\t\t}\n\t\t\tcase Qt::DecorationRole:\n\t\t\t{\n\t\t\t\treturn icon_factory::create(node);\n\t\t\t}\n\t\t\tcase Qt::ToolTipRole:\n\t\t\t{\n\t\t\t\treturn QString(tr(\"%1 node \\\"%2\\\"\")).arg(convert<QString>(node.factory().name())).arg(convert<QString>(node.name()));\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn QVariant();\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/node_list_model.h",
    "content": "#ifndef K3DSDK_QTUI_NODE_LIST_MODEL_H\n#define K3DSDK_QTUI_NODE_LIST_MODEL_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/signal_system.h>\n#include <QAbstractListModel>\n#include <vector>\n\nnamespace k3d\n{\n\nclass inode;\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// node_list_model\n\n/// Exposes a list of K-3D nodes as a flat list suitable for use with Qt views.\nclass node_list_model :\n        public QAbstractListModel,\n\tpublic sigc::trackable\n{\n\ttypedef QAbstractListModel base;\n\n\tQ_OBJECT;\npublic:\n\tnode_list_model(QObject* Parent = 0);\n\tvirtual ~node_list_model();\n\n\t/// Adds new nodes to the model\n\tvoid add_nodes(const std::vector<inode*>& Nodes);\n\t/// Removes nodes from the model\n\tvoid remove_nodes(const std::vector<inode*>& Nodes);\n  /// Maps from an index to a node (could return NULL)\n  inode* node(const QModelIndex& Index);\n\n\tvirtual int rowCount(const QModelIndex& Parent = QModelIndex()) const;\n\tvirtual QVariant data(const QModelIndex& Index, int role = Qt::DisplayRole) const;\n\nprivate:\n\tstd::vector<inode*> nodes;\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_NODE_LIST_MODEL_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/options.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares k3d::ioptions, an abstract interface for global user options\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/qtui/options.h>\n\n#include <k3dsdk/options.h>\n#include <k3dsdk/xml.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace options\n{\n\nstatic xml::element& qtui_element()\n{\n\treturn k3d::options::tree().safe_element(\"qtui\");\n}\n\nstatic xml::element& nags_element()\n{\n\treturn qtui_element().safe_element(\"nags\");\n}\n\nstatic xml::element& nag_element(const std::string& Type)\n{\n\tconst xml::element match(\"nag\", xml::attribute(\"message\", Type));\n\tconst xml::element prototype(\"nag\", string_cast(true), xml::attribute(\"message\", Type));\n\treturn nags_element().safe_element(match, prototype);\n}\n\nconst bool_t nag(const string_t& Type)\n{\n\treturn from_string<bool_t>(nag_element(Type).text, true);\n}\n\nvoid enable_nag(const string_t& Type, const bool_t Enabled)\n{\n\tnag_element(Type).text = string_cast(Enabled);\n}\n\n} // namespace options\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/options.h",
    "content": "#ifndef K3DSDK_QTUI_OPTIONS_H\n#define K3DSDK_QTUI_OPTIONS_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace options\n{\n\n/// Returns true iff the given nag message is enabled\nconst bool_t nag(const string_t& Type);\n/// Enables / disables the given nag message\nvoid enable_nag(const string_t& Type, const bool_t Enabled);\n\n} // namespace options\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_OPTIONS_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/panel.h",
    "content": "#ifndef K3DSDK_QTUI_PANEL_H\n#define K3DSDK_QTUI_PANEL_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass idocument;\nclass iproperty;\n\nnamespace qtui\n{\n\n/// Abstract interface for a \"panel\", a UI component that can be displayed in a dock widget\n/// or embedded in the viewport directly.\n/// Note: implementations must publicly derive from QWidget.\nclass panel\n{\npublic:\n\tvirtual ~panel() {}\n\n\t/// Called once at startup to initialize the panel (this is necessary because plugins can't take constructor arguments).\n\tvirtual void initialize(idocument& Document) = 0;\n\nprotected:\n\tpanel() {}\n\tpanel(const panel&) {}\n\tpanel& operator=(const panel&) { return *this; }\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_PANEL_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/property_widget.h",
    "content": "#ifndef K3DSDK_QTUI_PROPERTY_WIDGET_H\n#define K3DSDK_QTUI_PROPERTY_WIDGET_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n\nnamespace k3d\n{\n\nclass idocument;\nclass iproperty;\nclass istate_recorder;\n\nnamespace qtui\n{\n\n/// Abstract interface for a \"property widget\", a UI component used to control a K-3D property.\n/// Note: implementations must publicly derive from QWidget.\nclass property_widget\n{\npublic:\n\tvirtual ~property_widget() {}\n\n\t/// Called once at startup to initialize the widget (this is necessary because plugins can't take constructor arguments).\n\tvirtual void initialize(idocument& Document, iproperty& Property, istate_recorder* StateRecorder) = 0;\n\nprotected:\n\tproperty_widget() {}\n\tproperty_widget(const property_widget&) {}\n\tproperty_widget& operator=(const property_widget&) { return *this; }\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_PROPERTY_WIDGET_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/property_widget_factory.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/imetadata.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/qtui/property_widget.h>\n#include <k3dsdk/qtui/property_widget_factory.h>\n#include <k3dsdk/type_registry.h>\n\n#include <QWidget>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\n/*\nclass control::implementation\n{\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState)\n\t{\n\t}\n\n\tvoid set_properties(const objects_t& Objects)\n\t{\n\t\tiproperty_group_collection::groups_t final_groups;\n\n\t\tif(Objects.size() == 1) // As a special case when displaying a single object ...\n\t\t{\n\t\t\t// Get the node properties, grouped together ...\n\t\t\tif(iproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(Objects[0]))\n\t\t\t{\n\t\t\t\tiproperty_group_collection::group builtin_properties(_(\"Builtin Properties\"));\n\t\t\t\tiproperty_group_collection::group user_properties(_(\"User Properties\"));\n\n\t\t\t\tconst iproperty_collection::properties_t properties = property_collection->properties();\n\t\t\t\tfor(iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t\t\t{\n\t\t\t\t\tif(dynamic_cast<iuser_property*>(*property))\n\t\t\t\t\t\tuser_properties.properties.push_back(*property);\n\t\t\t\t\telse\n\t\t\t\t\t\tbuiltin_properties.properties.push_back(*property);\n\t\t\t\t}\n\n\t\t\t\tif(iproperty_group_collection* const property_group_collection = dynamic_cast<iproperty_group_collection*>(Objects[0]))\n\t\t\t\t{\n\t\t\t\t\tconst iproperty_group_collection::groups_t groups = property_group_collection->property_groups();\n\t\t\t\t\tfor(iproperty_group_collection::groups_t::const_iterator group = groups.begin(); group != groups.end(); ++group)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(iproperty_collection::properties_t::const_iterator property = group->properties.begin(); property != group->properties.end(); ++property)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbuiltin_properties.properties.erase(\n\t\t\t\t\t\t\t\tstd::remove(builtin_properties.properties.begin(), builtin_properties.properties.end(), *property),\n\t\t\t\t\t\t\t\tbuiltin_properties.properties.end());\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(!group->properties.empty())\n\t\t\t\t\t\t\tfinal_groups.push_back(*group);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(!builtin_properties.properties.empty())\n\t\t\t\t\tfinal_groups.insert(final_groups.begin(), builtin_properties);\n\t\t\t\tif(!user_properties.properties.empty())\n\t\t\t\t\tfinal_groups.push_back(user_properties);\n\t\t\t}\n\t\t}\n\t\telse // Display multiple objects ...\n\t\t{\n\t\t\t// For each object ...\n\t\t\tfor(objects_t::const_iterator object = Objects.begin(); object != Objects.end(); ++object)\n\t\t\t{\n\t\t\t\t// Create a property group ...\n\t\t\t\tiproperty_group_collection::group group(_(\"Unknown object type\"));\n\n\t\t\t\t// Assign the group a name based on the node name or the factory name ...\n\t\t\t\tif(inode* const node = dynamic_cast<inode*>(*object))\n\t\t\t\t{\n\t\t\t\t\tgroup.name = node->name();\n\n\t\t\t\t\tif(group.name.empty())\n\t\t\t\t\t\tgroup.name = node->factory().name();\n\t\t\t\t}\n\n\t\t\t\tif(iproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(*object))\n\t\t\t\t\tgroup.properties = property_collection->properties();\n\n\t\t\t\tfinal_groups.push_back(group);\n\t\t\t}\n\t\t}\n\n\t\tset_properties(final_groups);\n\t}\n\n\tvoid set_properties(const iproperty_group_collection::groups_t& PropertyGroups)\n\t{\n\t\t// Delete existing controls ...\n\t\tGlib::ListHandle<Gtk::Widget*> children = m_vbox.get_children();\n\t\tstd::for_each(children.begin(), children.end(), delete_object());\n\n\n\t\t// Display everything ...\n\t\tm_vbox.show_all();\n\t}\n\n\tdocument_state& m_document_state;\n};\n*/\n\nQWidget* property_widget_factory::create(idocument& Document, iproperty& Property)\n{\n\tstatic const plugin::factory::collection_t widget_factories = plugin::factory::lookup(\"qtui:component-type\", \"property-widget\");\n\n\tistate_recorder* const state_recorder = &Document.state_recorder();\n\tconst string_t property_name = Property.property_name();\n\tconst std::type_info& property_type = Property.property_type();\n\t\n\t// Keep track of the control that's created (if any) ...\n\tQWidget* result = 0;\n\n\t// Look for custom property controls that match our property role ...\n\tif(!result)\n\t{\n\t\t// Look for an explicit property role ...\n\t\tif(imetadata* const property_metadata = dynamic_cast<imetadata*>(&Property))\n\t\t{\n\t\t\tconst string_t property_widget_role = property_metadata->get_metadata()[k3d::metadata::key::role()];\n\t\t\tif(property_widget_role.size())\n\t\t\t{\n\t\t\t\t// Now see if we can find a custom property widget that matches the role ...\n\t\t\t\tfor(plugin::factory::collection_t::const_iterator factory = widget_factories.begin(); factory != widget_factories.end(); ++factory)\n\t\t\t\t{\n\t\t\t\t\tif((**factory).metadata()[\"qtui:property-role\"] != property_widget_role)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tif(property_widget* const widget = plugin::create<property_widget>(**factory))\n\t\t\t\t\t{\n\t\t\t\t\t\tif(result = dynamic_cast<QWidget*>(widget))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twidget->initialize(Document, Property, &Document.state_recorder());\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::log() << error << \"property widget must derive from QWidget\" << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"error creating property widget\" << std::endl;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Look for custom property controls that match our property type ...\n\tif(!result)\n\t{\n\t\t// Get the C++ property type ...\n\t\tconst string_t property_widget_type = k3d::type_string(property_type);\n\t\tif(property_widget_type.size())\n\t\t{\n\t\t\t// Now see if we can find a custom property control that matches the type ...\n\t\t\tfor(plugin::factory::collection_t::const_iterator factory = widget_factories.begin(); factory != widget_factories.end(); ++factory)\n\t\t\t{\n\t\t\t\tif((**factory).metadata()[\"qtui:property-type\"] != property_widget_type)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif(property_widget* const widget = plugin::create<property_widget>(**factory))\n\t\t\t\t{\n\t\t\t\t\tif(result = dynamic_cast<QWidget*>(widget))\n\t\t\t\t\t{\n\t\t\t\t\t\twidget->initialize(Document, Property, &Document.state_recorder());\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"property widget must derive from QWidget\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"error creating property widget\" << std::endl;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n/*\n\t// Otherwise, provide our own hard-wired controls based on property type ...\n\tif(!result)\n\t{\n\t\t// Boolean properties ...\n\t\tif(property_type == typeid(bool_t))\n\t\t{\n\t\t\tcontrol = new check_button::control(check_button::proxy(property, state_recorder, property_name));\n\t\t}\n\t\t// Scalar properties ...\n\t\telse if(property_type == typeid(int32_t) || property_type == typeid(uint32_t) || property_type == typeid(float_t) || property_type == typeid(double_t))\n\t\t{\n\t\t\tcontrol = new spin_button::control(spin_button::model(property), state_recorder);\n\t\t}\n\t\t// Color properties ...\n\t\telse if(property_type == typeid(color))\n\t\t{\n\t\t\tcontrol = new color_chooser::control(color_chooser::proxy(property, state_recorder, property_name));\n\t\t}\n\t\t// String properties ...\n\t\telse if(property_type == typeid(string_t))\n\t\t{\n\t\t\tif(dynamic_cast<ienumeration_property*>(&property))\n\t\t\t{\n\t\t\t\tcontrol = new enumeration_chooser::control(enumeration_chooser::model(property), state_recorder);\n\t\t\t}\n\t\t\telse if(dynamic_cast<iscript_property*>(&property))\n\t\t\t{\n\t\t\t\tcontrol = new script_button::control(script_button::model(property), state_recorder, property_name);\n\t\t\t}\n\t\t\telse if(ilist_property<string_t>* const list_property = dynamic_cast<ilist_property<string_t>*>(&property))\n\t\t\t{\n\t\t\t\tcombo_box::control* const combo_box = new combo_box::control(combo_box::proxy(property, state_recorder, property_name));\n\t\t\t\tcombo_box->set_values(list_property->property_values());\n\t\t\t\tcontrol = combo_box;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(imetadata* const metadata = dynamic_cast<imetadata*>(&property))\n\t\t\t\t{\n\t\t\t\t\timetadata::metadata_t property_metadata = metadata->get_metadata();\n\t\t\t\t\tif(property_metadata[\"k3d:property-type\"] == \"k3d:multi-line-text\")\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = new text::control(text::model(property), state_recorder);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(!control)\n\t\t\t\t{\n\t\t\t\t\tcontrol = new entry::control(entry::model(property), state_recorder);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// inode* properties ...\n\t\telse if(property_type == typeid(inode*))\n\t\t{\n\t\t\tcontrol = new node_chooser::control(node_chooser::proxy(m_document_state, property, state_recorder, property_name), node_chooser::filter(property));\n\t\t}\n\t\telse if(property_type == typeid(inode_collection_property::nodes_t))\n\t\t{\n\t\t\tcontrol = new node_collection_chooser::control(node_collection_chooser::model(property), state_recorder);\n\t\t}\n\t\t// Bitmap properties ...\n\t\telse if(property_type == type_id_k3d_bitmap_ptr())\n\t\t{\n\t\t\tcontrol = new bitmap_preview::control(bitmap_preview::proxy(property));\n\t\t}\n\t\t// Filesystem-path properties ...\n\t\telse if(property_type == typeid(filesystem::path))\n\t\t{\n\t\t\tcontrol = new path_chooser::control(path_chooser::proxy(property, state_recorder, property_name));\n\t\t}\n\t\t// bounding_box3 properties ...\n\t\telse if(property_type == typeid(bounding_box3))\n\t\t{\n\t\t\tcontrol = new bounding_box::control(bounding_box::proxy(property));\n\t\t}\n\t\t// point3 properties ...\n\t\telse if(property_type == typeid(point3) || property_type == typeid(vector3) || property_type == typeid(normal3))\n\t\t{\n\t\t\tcontrol = new point::control(point::proxy(property));\n\t\t}\n\t\t// angle_axis properties ...\n\t\telse if(property_type == typeid(k3d::angle_axis))\n\t\t{\n\t\t\tcontrol = new k3d::ngui::angle_axis::control(k3d::ngui::angle_axis::proxy(property, state_recorder, property_name));\n\t\t}\n\t\t// Transformation properties ...\n\t\telse if(property_type == typeid(matrix4))\n\t\t{\n\t\t}\n\t\t// Mesh properties ...\n\t\telse if(property_type == typeid(mesh*))\n\t\t{\n\t\t}\n\t\t// HPoint properties ...\n\t\telse if(property_type == typeid(point4))\n\t\t{\n\t\t}\n\t\t// Pipeline-profiler records ...\n\t\telse if(property_type == typeid(std::map<inode*, std::map<string_t, double_t> >))\n\t\t{\n\t\t}\n*/\n\tif(!result)\n\t{\n    result = new QWidget();\n\t\tlog() << warning << \"Couldn't create widget for property [\" << property_name << \"] with type [\" << k3d::type_string(property_type) << \"]\" << std::endl;\n\t}\n\n\treturn result;\n}\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/property_widget_factory.h",
    "content": "#ifndef K3DSDK_QTUI_PROPERTY_WIDGET_FACTORY_H\n#define K3DSDK_QTUI_PROPERTY_WIDGET_FACTORY_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <QObject>\n\nclass QWidget;\n\nnamespace k3d\n{\n\nclass idocument;\nclass iproperty;\n\nnamespace qtui\n{\n\n/// Generates widgets that can act as proxies for k3d::iproperty objects\nclass property_widget_factory :\n\tpublic QObject\n{\n\tQ_OBJECT;\n\npublic:\n\tQWidget* create(idocument& Document, iproperty& Property);\n};\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_PROPERTY_WIDGET_FACTORY_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/CMakeLists.txt",
    "content": "PROJECT(k3dsdk-qtui-script)\n\nFILE(GLOB HEADERS *.h)\nFILE(GLOB SOURCES *.cpp)\n\nLIST(SORT HEADERS)\nLIST(SORT SOURCES)\n\nSET(MOC_BUILT_SOURCES )\nQT4_WRAP_CPP(MOC_BUILT_SOURCES\n\t)\n\nADD_DEFINITIONS(-DQT_NO_KEYWORDS)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\nINCLUDE_DIRECTORIES(${QT_INCLUDES})\n\nK3D_ADD_LIBRARY(k3dsdk-qtui-script SHARED ${HEADERS} ${SOURCES} ${MOC_BUILT_SOURCES})\nK3D_GENERATE_DEF_FILE(k3dsdk-qtui-script)\n\nTARGET_LINK_LIBRARIES(k3dsdk-qtui-script k3dsdk-qtui)\n\nINSTALL(TARGETS k3dsdk-qtui-script\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR}\n\t)\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/color.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/color.h>\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/script/color.h>\n\n#include <QMetaType>\n#include <QScriptEngine>\n#include <QScriptValue>\n\nclass QScriptContext;\n\nQ_DECLARE_METATYPE(k3d::color);\nQ_DECLARE_METATYPE(k3d::color*);\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace color\n{\n\nstatic QScriptValue red(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tswitch(Context->argumentCount())\n\t{\n\t\tcase 0:\n\t\t\treturn qscriptvalue_cast<k3d::color*>(Context->thisObject())->red;\n\t\tcase 1:\n\t\t\tqscriptvalue_cast<k3d::color*>(Context->thisObject())->red = Context->argument(0).toNumber();\n\t}\n\treturn QScriptValue();\n}\n\nstatic QScriptValue green(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tswitch(Context->argumentCount())\n\t{\n\t\tcase 0:\n\t\t\treturn qscriptvalue_cast<k3d::color*>(Context->thisObject())->green;\n\t\tcase 1:\n\t\t\tqscriptvalue_cast<k3d::color*>(Context->thisObject())->green = Context->argument(0).toNumber();\n\t}\n\treturn QScriptValue();\n}\n\nstatic QScriptValue blue(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tswitch(Context->argumentCount())\n\t{\n\t\tcase 0:\n\t\t\treturn qscriptvalue_cast<k3d::color*>(Context->thisObject())->blue;\n\t\tcase 1:\n\t\t\tqscriptvalue_cast<k3d::color*>(Context->thisObject())->blue = Context->argument(0).toNumber();\n\t}\n\treturn QScriptValue();\n}\n\nstatic QScriptValue toString(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tconst k3d::color value = qscriptvalue_cast<k3d::color>(Context->thisObject());\n\treturn QString(\"{%1,%2,%3}\").arg(value.red).arg(value.green).arg(value.blue);\n}\n\nstatic QScriptValue constructor(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tQScriptValue result;\n\tswitch(Context->argumentCount())\n\t{\n\t\tcase 0:\n\t\t\tresult = Engine->toScriptValue(k3d::color(0, 0, 0));\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tresult = Engine->toScriptValue(k3d::color(Context->argument(0).toNumber(), Context->argument(0).toNumber(), Context->argument(0).toNumber()));\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tresult = Engine->toScriptValue(k3d::color(Context->argument(0).toNumber(), Context->argument(1).toNumber(), Context->argument(2).toNumber()));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn Context->throwError(QScriptContext::TypeError, \"0, 1, or 3 numeric arguments required.\");\n\t}\n\n\tresult.setPrototype(Context->callee().property(\"prototype\"));\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace)\n{\n\tQScriptValue prototype = Engine->newObject();\n\tprototype.setProperty(\"red\", Engine->newFunction(red), QScriptValue::PropertyGetter | QScriptValue::PropertySetter);\n\tprototype.setProperty(\"green\", Engine->newFunction(green), QScriptValue::PropertyGetter | QScriptValue::PropertySetter);\n\tprototype.setProperty(\"blue\", Engine->newFunction(blue), QScriptValue::PropertyGetter | QScriptValue::PropertySetter);\n\tprototype.setProperty(\"toString\", Engine->newFunction(toString));\n\t\n\tEngine->setDefaultPrototype(qMetaTypeId<k3d::color>(), prototype);\n\n\tQScriptValue constructor = Engine->newFunction(color::constructor, prototype);\n\tconstructor.setProperty(\"black\", Engine->toScriptValue(k3d::color(0, 0, 0)));\n\tconstructor.setProperty(\"white\", Engine->toScriptValue(k3d::color(1, 1, 1)));\n\tconstructor.setProperty(\"red\", Engine->toScriptValue(k3d::color(1, 0, 0)));\n\tconstructor.setProperty(\"yellow\", Engine->toScriptValue(k3d::color(1, 1, 0)));\n\tconstructor.setProperty(\"green\", Engine->toScriptValue(k3d::color(0, 1, 0)));\n\tconstructor.setProperty(\"cyan\", Engine->toScriptValue(k3d::color(0, 1, 1)));\n\tconstructor.setProperty(\"blue\", Engine->toScriptValue(k3d::color(0, 0, 1)));\n\tconstructor.setProperty(\"purple\", Engine->toScriptValue(k3d::color(1, 0, 1)));\n\n\tNamespace.setProperty(\"color\", constructor);\n}\n\n} // namespace color\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/color.h",
    "content": "#ifndef K3DSDK_QTUI_SCRIPT_COLOR_H\n#define K3DSDK_QTUI_SCRIPT_COLOR_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nclass QScriptEngine;\nclass QScriptValue;\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace color\n{\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace);\n\n} // namespace color\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n\n#endif // !K3DSDK_QTUI_SCRIPT_COLOR_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/console.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/qtui/console.h>\n#include <k3dsdk/qtui/script/console.h>\n\n#include <QScriptEngine>\n#include <QScriptValue>\n\nclass QScriptContext;\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace console\n{\n\nstatic QScriptValue constructor(QScriptContext* Context, QScriptEngine* Engine)\n{\n\treturn Engine->newQObject(new k3d::qtui::console::widget(), QScriptEngine::ScriptOwnership);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace)\n{\n\tNamespace.setProperty(\"console\", Engine->newFunction(console::constructor));\n}\n\n} // namespace console\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/console.h",
    "content": "#ifndef K3DSDK_QTUI_SCRIPT_CONSOLE_H\n#define K3DSDK_QTUI_SCRIPT_CONSOLE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nclass QScriptEngine;\nclass QScriptValue;\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace console\n{\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace);\n\n} // namespace console\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n\n#endif // !K3DSDK_QTUI_SCRIPT_CONSOLE_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/engine.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/qtui/script/engine.h>\n#include <k3dsdk/qtui/script/model.h>\n\n#include <QScriptEngine>\n#include <QStringList>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// engine\n\nQScriptEngine* engine()\n{\n\tQScriptEngine* const script_engine = new QScriptEngine();\n\n\tscript_engine->importExtension(\"qt\");\n\tscript_engine->importExtension(\"qt.core\");\n\tscript_engine->importExtension(\"qt.gui\");\n\tscript_engine->importExtension(\"qt.network\");\n\tscript_engine->importExtension(\"qt.opengl\");\n\tscript_engine->importExtension(\"qt.phonon\");\n\tscript_engine->importExtension(\"qt.sql\");\n\tscript_engine->importExtension(\"qt.svg\");\n\tscript_engine->importExtension(\"qt.webkit\");\n\tscript_engine->importExtension(\"qt.xml\");\n\tscript_engine->importExtension(\"qt.xmlpatterns\");\n\n\tmodel::setup(script_engine, script_engine->globalObject());\n\n\treturn script_engine;\n}\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/engine.h",
    "content": "#ifndef K3DSDK_QTUI_SCRIPT_ENGINE_H\n#define K3DSDK_QTUI_SCRIPT_ENGINE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nclass QScriptEngine;\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// engine\n\n/// Returns a QScriptEngine object, configured for use with the K-3D API.\n/// The caller is responsible for the lifetime of the returned object.\nQScriptEngine* engine();\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_SCRIPT_ENGINE_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/iunknown.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/script/iunknown.h>\n\n#include <QMetaType>\n#include <QScriptEngine>\n#include <QScriptValue>\n\n#include <cassert>\n\nclass QScriptContext;\n\ntypedef k3d::iunknown* piunknown;\nQ_DECLARE_METATYPE(k3d::iunknown*);\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace iunknown\n{\n\nstatic QScriptValue plugin_factory_name(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tk3d::iplugin_factory* const factory = dynamic_cast<k3d::iplugin_factory*>(qscriptvalue_cast<k3d::iunknown*>(Context->thisObject()));\n\treturn k3d::convert<QString>(factory->name());\n}\n\nstatic QScriptValue toScriptValue(QScriptEngine* Engine, const piunknown& Value)\n{\n\tQScriptValue result = Engine->newVariant(QVariant::fromValue(Value));\n\n\tif(k3d::iplugin_factory* const factory = dynamic_cast<k3d::iplugin_factory*>(Value))\n\t{\n\t\tresult.setProperty(\"name\", Engine->newFunction(plugin_factory_name), QScriptValue::PropertyGetter);\n\t}\n\n\treturn result;\n}\n\nstatic void fromScriptValue(const QScriptValue& Object, piunknown& Value)\n{\n\tValue = qvariant_cast<k3d::iunknown*>(Object.toVariant());\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace)\n{\n\tqScriptRegisterMetaType(Engine, toScriptValue, fromScriptValue);\n}\n\n} // namespace iunknown\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/iunknown.h",
    "content": "#ifndef K3DSDK_QTUI_SCRIPT_IUNKNOWN_H\n#define K3DSDK_QTUI_SCRIPT_IUNKNOWN_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nclass QScriptEngine;\nclass QScriptValue;\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace iunknown\n{\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace);\n\n} // namespace iunknown\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n\n#endif // !K3DSDK_QTUI_SCRIPT_IUNKNOWN_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/log.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/script/log.h>\n\n#include <QScriptContext>\n#include <QScriptEngine>\n#include <QScriptValue>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace log\n{\n\nstatic QScriptValue critical(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tk3d::log() << k3d::critical << Context->argument(0).toString().toAscii().data() << std::endl;\n\treturn QScriptValue();\n}\n\nstatic QScriptValue debug(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tk3d::log() << k3d::debug << Context->argument(0).toString().toAscii().data() << std::endl;\n\treturn QScriptValue();\n}\n\nstatic QScriptValue error(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tk3d::log() << k3d::error << Context->argument(0).toString().toAscii().data() << std::endl;\n\treturn QScriptValue();\n}\n\nstatic QScriptValue info(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tk3d::log() << k3d::info << Context->argument(0).toString().toAscii().data() << std::endl;\n\treturn QScriptValue();\n}\n\nstatic QScriptValue warning(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tk3d::log() << k3d::warning << Context->argument(0).toString().toAscii().data() << std::endl;\n\treturn QScriptValue();\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace)\n{\n\tQScriptValue proxy = Engine->newObject();\n\tproxy.setProperty(\"critical\", Engine->newFunction(critical));\n\tproxy.setProperty(\"debug\", Engine->newFunction(debug));\n\tproxy.setProperty(\"error\", Engine->newFunction(error));\n\tproxy.setProperty(\"info\", Engine->newFunction(info));\n\tproxy.setProperty(\"warning\", Engine->newFunction(warning));\n\n\tNamespace.setProperty(\"log\", proxy);\n}\n\n} // namespace log\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/log.h",
    "content": "#ifndef K3DSDK_QTUI_SCRIPT_LOG_H\n#define K3DSDK_QTUI_SCRIPT_LOG_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nclass QScriptEngine;\nclass QScriptValue;\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace log\n{\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace);\n\n} // namespace log\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_SCRIPT_LOG_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/matrix4.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/script/matrix4.h>\n\n#include <QMetaType>\n#include <QScriptEngine>\n#include <QScriptValue>\n\nclass QScriptContext;\n\nQ_DECLARE_METATYPE(k3d::matrix4);\nQ_DECLARE_METATYPE(k3d::matrix4*);\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace matrix4\n{\n\nstatic QScriptValue row_major(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tconst k3d::matrix4 value = qscriptvalue_cast<k3d::matrix4>(Context->thisObject());\n\tQVariantList result;\n\tfor(k3d::uint_t i = 0; i != 4; ++i)\n\t{\n\t\tfor(k3d::uint_t j = 0; j != 4; ++j)\n\t\t{\n\t\t\tresult << value[i][j];\n\t\t}\n\t}\n\treturn Engine->toScriptValue(result);\n}\n\nstatic QScriptValue column_major(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tconst k3d::matrix4 value = qscriptvalue_cast<k3d::matrix4>(Context->thisObject());\n\tQVariantList result;\n\tfor(k3d::uint_t j = 0; j != 4; ++j)\n\t{\n\t\tfor(k3d::uint_t i = 0; i != 4; ++i)\n\t\t{\n\t\t\tresult << value[i][j];\n\t\t}\n\t}\n\treturn Engine->toScriptValue(result);\n}\n\nstatic QScriptValue toString(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tconst k3d::matrix4 value = qscriptvalue_cast<k3d::matrix4>(Context->thisObject());\n\tstd::ostringstream buffer;\n\tbuffer << \"matrix4(\" << value << \")\";\n\treturn QString(buffer.str().c_str());\n}\n\nstatic QScriptValue constructor(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tQScriptValue result;\n\tswitch(Context->argumentCount())\n\t{\n\t\tcase 0:\n\t\t\tresult = Engine->toScriptValue(k3d::matrix4());\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tresult = Engine->toScriptValue(k3d::identity3() * Context->argument(0).toNumber());\n\t\t\tbreak;\n/*\n\t\tcase 3:\n\t\t\tresult = Engine->toScriptValue(k3d::matrix4(Context->argument(0).toNumber(), Context->argument(1).toNumber(), Context->argument(2).toNumber()));\n*/\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn Context->throwError(QScriptContext::TypeError, \"0, 1, or 3 numeric arguments required.\");\n\t}\n\n\tresult.setPrototype(Context->callee().property(\"prototype\"));\n\treturn result;\n}\n\nstatic QScriptValue scale(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tswitch(Context->argumentCount())\n\t{\n\t\tcase 1:\n\t\t\treturn Engine->toScriptValue(k3d::scale3(Context->argument(0).toNumber()));\n\t\tcase 3:\n\t\t\treturn Engine->toScriptValue(k3d::scale3(Context->argument(0).toNumber(), Context->argument(1).toNumber(), Context->argument(2).toNumber()));\n\t\tdefault:\n\t\t\treturn Context->throwError(QScriptContext::TypeError, \"1 or 3 numeric arguments required.\");\n\t}\n}\n\nstatic QScriptValue translate(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tswitch(Context->argumentCount())\n\t{\n\t\tcase 3:\n\t\t\treturn Engine->toScriptValue(k3d::translate3(Context->argument(0).toNumber(), Context->argument(1).toNumber(), Context->argument(2).toNumber()));\n\t\tdefault:\n\t\t\treturn Context->throwError(QScriptContext::TypeError, \"3 numeric arguments required.\");\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace)\n{\n\tQScriptValue prototype = Engine->newObject();\n\tprototype.setProperty(\"column_major\", Engine->newFunction(column_major), QScriptValue::PropertyGetter);\n\tprototype.setProperty(\"row_major\", Engine->newFunction(row_major), QScriptValue::PropertyGetter);\n/*\n\tprototype.setProperty(\"blue\", Engine->newFunction(blue), QScriptValue::PropertyGetter | QScriptValue::PropertySetter);\n*/\n\tprototype.setProperty(\"toString\", Engine->newFunction(toString));\n\t\n\tEngine->setDefaultPrototype(qMetaTypeId<k3d::matrix4>(), prototype);\n\n\tQScriptValue constructor = Engine->newFunction(matrix4::constructor, prototype);\n\tconstructor.setProperty(\"scale\", Engine->newFunction(scale));\n\tconstructor.setProperty(\"translate\", Engine->newFunction(translate));\n\n\tNamespace.setProperty(\"matrix4\", constructor);\n}\n\n} // namespace matrix4\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/matrix4.h",
    "content": "#ifndef K3DSDK_QTUI_SCRIPT_MATRIX4_H\n#define K3DSDK_QTUI_SCRIPT_MATRIX4_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nclass QScriptEngine;\nclass QScriptValue;\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace matrix4\n{\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace);\n\n} // namespace matrix4\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n\n#endif // !K3DSDK_QTUI_SCRIPT_MATRIX4_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/model.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/script/color.h>\n#include <k3dsdk/qtui/script/console.h>\n#include <k3dsdk/qtui/script/iunknown.h>\n#include <k3dsdk/qtui/script/log.h>\n#include <k3dsdk/qtui/script/matrix4.h>\n#include <k3dsdk/qtui/script/model.h>\n#include <k3dsdk/qtui/script/plugin.h>\n#include <k3dsdk/share.h>\n\n#include <QScriptEngine>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace model\n{\n\nstatic QScriptValue share_path(QScriptContext* Context, QScriptEngine* Engine)\n{\n\treturn Engine->toScriptValue(k3d::convert<QString>(k3d::share_path().native_utf8_string()));\n}\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace)\n{\n\tQScriptValue proxy = Engine->newObject();\n\tproxy.setProperty(\"share_path\", Engine->newFunction(share_path), QScriptValue::PropertyGetter);\n\n\tcolor::setup(Engine, proxy);\n\tconsole::setup(Engine, proxy);\n\tiunknown::setup(Engine, proxy);\n\tlog::setup(Engine, proxy);\n\tmatrix4::setup(Engine, proxy);\n\tplugin::setup(Engine, proxy);\n\n\tNamespace.setProperty(\"k3d\", proxy);\n}\n\n} // namespace model\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/model.h",
    "content": "#ifndef K3DSDK_QTUI_SCRIPT_MODEL_H\n#define K3DSDK_QTUI_SCRIPT_MODEL_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nclass QScriptEngine;\nclass QScriptValue;\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace model\n{\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace);\n\n} // namespace model\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_SCRIPT_MODEL_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/plugin.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/script/plugin.h>\n\n#include <QMetaType>\n#include <QScriptContext>\n#include <QScriptEngine>\n#include <QScriptValue>\n#include <QStringList>\n\nQ_DECLARE_METATYPE(k3d::iunknown*);\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace plugin\n{\n\nnamespace factory\n{\n\nstatic QScriptValue convert(QScriptEngine* Engine, const k3d::plugin::factory::collection_t& Factories)\n{\n\tQScriptValue result = Engine->newArray();\n\n\tfor(k3d::uint_t i = 0; i != Factories.size(); ++i)\n\t\tresult.setProperty(i, Engine->toScriptValue(static_cast<k3d::iunknown*>(Factories[i])));\n\n\treturn result;\n}\n\nstatic QScriptValue lookup(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tswitch(Context->argumentCount())\n\t{\n\t\tcase 0:\n\t\t\treturn convert(Engine, k3d::plugin::factory::lookup());\n\t\tcase 2:\n\t\t\treturn convert(Engine, k3d::plugin::factory::lookup(Context->argument(0).toString().toAscii().data(), Context->argument(1).toString().toAscii().data()));\n\t}\n}\n\n} // namespace factory\n\nstatic QScriptValue create(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tswitch(Context->argumentCount())\n\t{\n\t\tcase 1:\n\t\t{\n\t\t\treturn Engine->toScriptValue(k3d::plugin::create(Context->argument(0).toString().toAscii().data()));\n\t\t}\n\t\tcase 2:\n\t\t{\n\t\t\tconst k3d::string_t plugin_name = k3d::convert<k3d::string_t>(Context->argument(0).toString());\n\n\t\t\tk3d::idocument* const document = dynamic_cast<k3d::idocument*>(qscriptvalue_cast<k3d::iunknown*>(Context->argument(1)));\n\t\t\tif(!document)\n\t\t\t\treturn Context->throwError(QScriptContext::TypeError, \"Second argument must be a K-3D document.\");\n\n\t\t\treturn Engine->toScriptValue(k3d::plugin::create(plugin_name, *document, \"\"));\n\t\t}\n\t\tcase 3:\n\t\t{\n\t\t\tconst k3d::string_t plugin_name = k3d::convert<k3d::string_t>(Context->argument(0).toString());\n\n\t\t\tk3d::idocument* const document = dynamic_cast<k3d::idocument*>(qscriptvalue_cast<k3d::iunknown*>(Context->argument(1)));\n\t\t\tif(!document)\n\t\t\t\treturn Context->throwError(QScriptContext::TypeError, \"Second argument must be a K-3D document.\");\n\n\t\t\tconst k3d::string_t node_name = k3d::convert<k3d::string_t>(Context->argument(2).toString());\n\n\t\t\treturn Engine->toScriptValue(k3d::plugin::create(plugin_name, *document, node_name));\n\t\t}\n\t}\n\n\treturn QScriptValue();\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace)\n{\n\tQScriptValue factory = Engine->newObject();\n\tfactory.setProperty(\"lookup\", Engine->newFunction(factory::lookup));\n\n\tQScriptValue plugin = Engine->newObject();\n\tplugin.setProperty(\"factory\", factory);\n\tplugin.setProperty(\"create\", Engine->newFunction(create));\n\n\tNamespace.setProperty(\"plugin\", plugin);\n}\n\n} // namespace plugin\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/script/plugin.h",
    "content": "#ifndef K3DSDK_QTUI_SCRIPT_PLUGIN_H\n#define K3DSDK_QTUI_SCRIPT_PLUGIN_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nclass QScriptEngine;\nclass QScriptValue;\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace plugin\n{\n\nvoid setup(QScriptEngine* Engine, QScriptValue Namespace);\n\n} // namespace plugin\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_SCRIPT_PLUGIN_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/message.h>\n#include <k3dsdk/qtui/script.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/scripting.h>\n#include <k3dsdk/string_cast.h>\n\n#include <boost/format.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <stack>\n\n#include <QObject>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\nnamespace detail\n{\n\n/*\n/// Keeps track of running script engines, so they can be halted if the user hits \"escape\"\nstd::stack<k3d::iscript_engine*> script_engine_stack;\n\n/// Halts any running scripts if the user hits \"escape\"\nint script_escape_handler(Gtk::Widget* Widget, GdkEventKey* Event)\n{\n\tif(Event->type != GDK_KEY_RELEASE)\n\t\treturn false;\n\n\tif(Event->keyval != GDK_Escape)\n\t\treturn false;\n\n\treturn_val_if_fail(script_engine_stack.size(), false);\n\n\tstd::vector<string_t> buttons;\n\tbuttons.push_back(_(\"Yes\"));\n\tbuttons.push_back(_(\"No\"));\n\tif(1 == query_message(_(\"Halt running script?\"), 2, buttons))\n\t\tscript_engine_stack.top()->halt();\n\n\treturn true;\n}\n*/\n\n/// Executes a script using the given plugin factory to create the script engine\nbool_t execute(const k3d::script::code& Script, const string_t& ScriptName, k3d::iscript_engine::context& Context, const k3d::script::language& Language)\n{\n\t// Sanity checks ...\n\treturn_val_if_fail(ScriptName.size(), false);\n\n\tif(!Language.factory())\n\t{\n\t\terror_message(\n\t\t\tQObject::tr(\"Could not determine scripting language.  K-3D supports multiple scripting languages, but the language for this script was \"\n\t\t\t\"not recognized. Most K-3D script engines use some type of \\\"magic token\\\" at the beginning of a script to recognize it, e.g. \\\"#python\\\" \"\n\t\t\t\"in the first 7 characters of a script for K-3D's Python engine.  If you are writing a K-3D script, check the documentation \"\n\t\t\t\"for the scripting language you're writing in to see how to make it recognizable.\"), \"\");\n\t\treturn false;\n\t}\n\n\t// Get the requested scripting engine ...\n\tboost::scoped_ptr<k3d::iscript_engine> engine(k3d::plugin::create<k3d::iscript_engine>(*Language.factory()));\n\tif(!engine)\n\t{\n\t\terror_message(\n\t\t\tQObject::tr(\"Error creating the scripting engine to run this script.  Usually this means that your system is missing appropriate libraries \"\n\t\t\t\"or that there was an error in installation.\"), \"\");\n\t\treturn false;\n\t}\n\n/*\n\t// Intercept global key events ...\n\tscript_engine_stack.push(engine.get());\n\tsigc::connection script_escape_handler_connection = Gtk::Main::signal_key_snooper().connect(sigc::ptr_fun(script_escape_handler));\n*/\n\n\t// Run that bad-boy ...\n\tconst bool_t result = engine->execute(ScriptName, Script.source(), Context);\n\n/*\n\tscript_escape_handler_connection.disconnect();\n\tscript_engine_stack.pop();\n*/\n\n\tif(!result)\n\t{\n\t\terror_message(\n\t\t\tQObject::tr(\"Error executing script\"), \"\");\n\t}\n\n\treturn result;\n}\n\n} // namespace detail\n\nbool_t execute(const k3d::script::code& Script, const string_t& ScriptName, k3d::iscript_engine::context& Context, const k3d::script::language& Language)\n{\n\treturn detail::execute(Script, ScriptName, Context, Language);\n}\n\nbool_t execute(const k3d::script::code& Script, const string_t& ScriptName, k3d::iscript_engine::context& Context)\n{\n\treturn detail::execute(Script, ScriptName, Context, k3d::script::language(Script));\n}\n\nbool_t execute(const k3d::filesystem::path& Script, k3d::iscript_engine::context& Context)\n{\n\tif(!k3d::filesystem::exists(Script))\n\t{\n\t\terror_message(\n\t\t\tQObject::tr(\"Requested script file %1 doesn't exist.\").arg(k3d::convert<QString>(Script.native_utf8_string())), \"\");\n\t\treturn false;\n\t}\n\n\tk3d::filesystem::ifstream file(Script);\n\tconst k3d::script::code script(file);\n\tconst k3d::script::language language(script);\n\n\treturn detail::execute(script, Script.native_utf8_string().raw(), Context, language);\n}\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/script.h",
    "content": "#ifndef K3DSDK_QTUI_SCRIPT_H\n#define K3DSDK_QTUI_SCRIPT_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/scripting.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace script\n{\n\n/// Executes a script using a specific language and providing user feedback for errors\nbool_t execute(const k3d::script::code& Script, const string_t& ScriptName, k3d::iscript_engine::context& Context, const k3d::script::language& Language);\n/// Executes a script, attempting to automatically recognize the language and providing user feedback for errors\nbool_t execute(const k3d::script::code& Script, const string_t& ScriptName, k3d::iscript_engine::context& Context);\n/// Executes a script, attempting to automatically recognize the language and providing user feedback for errors\nbool_t execute(const k3d::filesystem::path& Script, k3d::iscript_engine::context& Context);\n\n} // namespace script\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_SCRIPT_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/selection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/cubic_curve.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/ienumeration_property.h>\n#include <k3dsdk/imesh_selection_algorithm.h>\n#include <k3dsdk/imesh_selection_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/imetadata.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/inode_selection.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/qtui/selection.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <map>\n#include <set>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace selection\n{\n\nnamespace detail\n{\n\n/// Uses an update policy to replace each selection in a set of MeshInstance nodes.\n/// Each update policy must generate a k3d::selection::set based on the current state of the MeshInstance output mesh.\n/// Use replace_selection() to apply selection algorithms to an existing mesh.\ntemplate<typename UpdatePolicyT>\nvoid replace_selection(const nodes_t& Nodes, const UpdatePolicyT& UpdatePolicy, const bool_t VisibleSelection)\n{\n\tfor(nodes_t::const_iterator node = Nodes.begin(); node != Nodes.end(); ++node)\n\t{\n\t\tif(classes::MeshInstance() != (*node)->factory().factory_id())\n\t\t\tcontinue;\n\n\t\timesh_selection_sink* const mesh_selection_sink = dynamic_cast<imesh_selection_sink*>(*node);\n\t\tif(!mesh_selection_sink)\n\t\t\tcontinue;\n\n\t\timesh_source* const mesh_source = dynamic_cast<imesh_source*>(*node);\n\t\tif(!mesh_source)\n\t\t\tcontinue;\n\n\t\tconst k3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(mesh_source->mesh_source_output().property_internal_value());\n\t\tif(!mesh)\n\t\t\tcontinue;\n\n\t\tconst k3d::selection::set current_selection =\n\t\t\tboost::any_cast<k3d::selection::set>(mesh_selection_sink->mesh_selection_sink_input().property_internal_value());\n\n\t\tproperty::set_internal_value(mesh_selection_sink->mesh_selection_sink_input(), UpdatePolicy(*mesh, current_selection));\n\t\tproperty::set_internal_value(**node, \"show_component_selection\", VisibleSelection);\n\t}\n}\n\n/// Update policy for use with replace_selection() that selects all points in a mesh.\nstruct select_all_points\n{\n\tconst k3d::selection::set operator()(const mesh& Mesh, const k3d::selection::set& CurrentSelection) const\n\t{\n\t\tk3d::selection::set results;\n\n\t\tboost::scoped_ptr<geometry::point_selection::storage> point_selection(geometry::point_selection::create(results));\n\t\tgeometry::point_selection::append(*point_selection, 1.0);\n\n\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection(geometry::primitive_selection::create(results));\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CONSTANT, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CURVE, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::EDGE, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::FACE, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PARAMETER, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PATCH, 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::SURFACE, 0.0);\n\n\t\treturn results;\n\t}\n};\n\n/// Update policy for use with replace_selection() that selects all components of a given type in a mesh.\nstruct select_all_components\n{\n\tselect_all_components(const k3d::selection::type Component) :\n\t\tcomponent(Component)\n\t{\n\t}\n\n\tconst k3d::selection::set operator()(const mesh& Mesh, const k3d::selection::set& CurrentSelection) const\n\t{\n\t\tk3d::selection::set results;\n\n\t\tboost::scoped_ptr<geometry::point_selection::storage> point_selection(geometry::point_selection::create(results));\n\t\tgeometry::point_selection::append(*point_selection, 0.0);\n\n\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection(geometry::primitive_selection::create(results));\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CONSTANT, component == k3d::selection::CONSTANT ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CURVE, component == k3d::selection::CURVE ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::FACE, component == k3d::selection::FACE ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PARAMETER, component == k3d::selection::PARAMETER ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PATCH, component == k3d::selection::PATCH ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::EDGE, component == k3d::selection::EDGE ? 1.0 : 0.0);\n\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::SURFACE, component == k3d::selection::SURFACE ? 1.0 : 0.0);\n\n\t\treturn results;\n\t}\n\n\tconst k3d::selection::type component;\n};\n\n/// Update policy for use with replace_selection() that inverts the selection of all points in a mesh.\nstruct invert_points\n{\n\tconst k3d::selection::set operator()(const k3d::mesh& Mesh, const k3d::selection::set& CurrentSelection) const\n\t{\n\t\tconst k3d::mesh::selection_t* current_point_selection = Mesh.point_selection.get();\n\t\tif(!current_point_selection)\n\t\t\treturn CurrentSelection;\n\n\t\tk3d::selection::set results = CurrentSelection;\n\n\t\tboost::scoped_ptr<geometry::point_selection::storage> point_selection(geometry::point_selection::create(results));\n\t\tfor(k3d::uint_t i = 0; i != current_point_selection->size(); ++i)\n\t\t{\n\t\t\tpoint_selection->index_begin.push_back(i);\n\t\t\tpoint_selection->index_end.push_back(i + 1);\n\t\t\tpoint_selection->weight.push_back((*current_point_selection)[i] ? 0.0 : 1.0);\n\t\t}\n\n\t\treturn results;\n\t}\n};\n\n/// Update policy for use with replace_selection() that inverts the selection of a specific component type in a mesh.\nstruct invert_components\n{\n\tinvert_components(const k3d::selection::type Component) :\n\t\tcomponent(Component)\n\t{\n\t}\n\n\tstruct generate_selection\n\t{\n\t\tgenerate_selection(const uint_t Primitive, const k3d::selection::type Component, k3d::selection::set& Results) :\n\t\t\tprimitive(Primitive),\n\t\t\tcomponent(Component),\n\t\t\tcomponent_string(string_cast(Component)),\n\t\t\tresults(Results)\n\t\t{\n\t\t}\n\n\t\tvoid operator()(const string_t& StructureName, const table& Structure, const string_t& ArrayName, const pipeline_data<array>& Array)\n\t\t{\n\t\t\tif(StructureName != component_string)\n\t\t\t\treturn;\n\n\t\t\tif(Array->get_metadata_value(metadata::key::role()) != metadata::value::selection_role())\n\t\t\t\treturn;\n\n\t\t\tconst mesh::selection_t* const array = dynamic_cast<const mesh::selection_t*>(Array.get());\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\tlog() << error << \"unexpected type for array [\" << ArrayName << \"]\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection(geometry::primitive_selection::create(results));\n\t\t\tprimitive_selection->primitive_begin.push_back(primitive);\n\t\t\tprimitive_selection->primitive_end.push_back(primitive + 1);\n\t\t\tprimitive_selection->primitive_selection_type.push_back(component);\n\t\t\tprimitive_selection->primitive_first_range.push_back(0);\n\t\t\tprimitive_selection->primitive_range_count.push_back(array->size());\n\n\t\t\tfor(uint_t i = 0; i != array->size(); ++i)\n\t\t\t{\n\t\t\t\tprimitive_selection->index_begin.push_back(i);\n\t\t\t\tprimitive_selection->index_end.push_back(i+1);\n\t\t\t\tprimitive_selection->weight.push_back((*array)[i] ? 0.0 : 1.0);\n\t\t\t}\n\t\t}\n\n\t\tconst uint_t primitive;\n\t\tconst k3d::selection::type component;\n\t\tconst string_t component_string;\n\t\tk3d::selection::set& results;\n\t};\n\t\n\tconst k3d::selection::set operator()(const k3d::mesh& Mesh, const k3d::selection::set& CurrentSelection) const\n\t{\n\t\tk3d::selection::set results = CurrentSelection;\n\n\t\tfor(k3d::uint_t primitive = 0; primitive != Mesh.primitives.size(); ++primitive)\n\t\t{\n\t\t\tk3d::mesh::visit_arrays(*Mesh.primitives[primitive], generate_selection(primitive, component, results));\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tconst k3d::selection::type component;\n};\n\n/// Update policy for use with replace_selection() that deselects all points and primitives in a mesh.\nstruct deselect_all\n{\n\tconst k3d::selection::set operator()(const mesh& Mesh, const k3d::selection::set& CurrentSelection) const\n\t{\n\t\treturn geometry::selection::create(0);\n\t}\n};\n\n/// Uses an update policy to convert the supplied selection into updates to MeshInstance mesh selections\ntemplate<typename UpdatePolicyT>\nvoid merge_interactive_selection(const nodes_t& Nodes, const UpdatePolicyT& UpdatePolicy, const k3d::selection::records& InteractiveSelection)\n{\n\tfor(nodes_t::const_iterator node = Nodes.begin(); node != Nodes.end(); ++node)\n\t{\n\t\tif(classes::MeshInstance() != (*node)->factory().factory_id())\n\t\t\tcontinue;\n\n\t\timesh_selection_sink* const mesh_selection_sink = dynamic_cast<imesh_selection_sink*>(*node);\n\t\tif(!mesh_selection_sink)\n\t\t\tcontinue;\n\n\t\timesh_source* const mesh_source = dynamic_cast<imesh_source*>(*node);\n\t\tif(!mesh_source)\n\t\t\tcontinue;\n\n\t\tconst k3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(mesh_source->mesh_source_output().property_internal_value());\n\t\tif(!mesh)\n\t\t\tcontinue;\n\n\t\tconst k3d::selection::set current_selection =\n\t\t\tboost::any_cast<k3d::selection::set>(mesh_selection_sink->mesh_selection_sink_input().property_internal_value());\n\n\t\tproperty::set_internal_value(mesh_selection_sink->mesh_selection_sink_input(), UpdatePolicy(*node, *mesh, current_selection, InteractiveSelection));\n\t\tproperty::set_internal_value(**node, \"show_component_selection\", true);\n\t}\n}\n\n/// Policy class that updates a mesh_selection to select the given points\nstruct select_points\n{\n\tselect_points(const double_t Weight) :\n\t\tweight(Weight)\n\t{\n\t}\n\n\tconst k3d::selection::set operator()(k3d::inode* const Node, const k3d::mesh& Mesh, const k3d::selection::set& CurrentSelection, const k3d::selection::records& InteractiveSelection) const\n\t{\n\t\tk3d::selection::set results = CurrentSelection;\n\n\t\tboost::scoped_ptr<geometry::point_selection::storage> point_selection;\n\t\tfor(k3d::selection::records::const_iterator record = InteractiveSelection.begin(); record != InteractiveSelection.end(); ++record)\n\t\t{\n\t\t\tif(k3d::selection::get_node(*record) != Node)\n\t\t\t\tcontinue;\n\n\t\t\tif(!point_selection)\n\t\t\t\tpoint_selection.reset(geometry::point_selection::create(results));\t\t\t\t\n\n\t\t\tfor(k3d::selection::record::tokens_t::const_iterator token = record->tokens.begin(); token != record->tokens.end(); ++token)\n\t\t\t{\n\t\t\t\tswitch(token->type)\n\t\t\t\t{\n\t\t\t\t\tcase k3d::selection::POINT:\n\t\t\t\t\t\tpoint_selection->index_begin.push_back(token->id);\n\t\t\t\t\t\tpoint_selection->index_end.push_back(token->id + 1);\n\t\t\t\t\t\tpoint_selection->weight.push_back(weight);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tconst double_t weight;\n};\n\n/// Policy class that updates a mesh_selection to select the given components\nstruct select_component\n{\n\tselect_component(const k3d::selection::type& Component, const double_t Weight) :\n\t\tcomponent(Component),\n\t\tweight(Weight)\n\t{\n\t}\n\n\tconst k3d::selection::set operator()(k3d::inode* const Node, const k3d::mesh& Mesh, const k3d::selection::set& CurrentSelection, const k3d::selection::records& InteractiveSelection) const\n\t{\n\t\tk3d::selection::set results = CurrentSelection;\n\n\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection;\n\t\tfor(k3d::selection::records::const_iterator record = InteractiveSelection.begin(); record != InteractiveSelection.end(); ++record)\n\t\t{\n\t\t\tif(k3d::selection::get_node(*record) != Node)\n\t\t\t\tcontinue;\n\n\t\t\tif(!primitive_selection)\n\t\t\t\tprimitive_selection.reset(geometry::primitive_selection::create(results));\t\t\t\t\n\n\t\t\tbool_t found_primitive = false;\n\t\t\tfor(k3d::selection::record::tokens_t::const_iterator token = record->tokens.begin(); token != record->tokens.end(); ++token)\n\t\t\t{\n\t\t\t\tif(token->type == k3d::selection::PRIMITIVE)\n\t\t\t\t{\n\t\t\t\t\tfound_primitive = true;\n\t\t\t\t\tif(primitive_selection->primitive_begin.empty() || primitive_selection->primitive_begin.back() != token->id)\n\t\t\t\t\t{\n\t\t\t\t\t\tprimitive_selection->primitive_begin.push_back(token->id);\n\t\t\t\t\t\tprimitive_selection->primitive_end.push_back(token->id + 1);\n\t\t\t\t\t\tprimitive_selection->primitive_selection_type.push_back(component);\n\t\t\t\t\t\tprimitive_selection->primitive_first_range.push_back(primitive_selection->index_begin.size());\n\t\t\t\t\t\tprimitive_selection->primitive_range_count.push_back(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(token->type == component)\n\t\t\t\t{\n\t\t\t\t\tif(!found_primitive)\n\t\t\t\t\t{\n\t\t\t\t\t\tlog() << error << \"Selection records missing primitive token\" << std::endl;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tprimitive_selection->primitive_range_count.back() += 1;\n\t\t\t\t\tprimitive_selection->index_begin.push_back(token->id);\n\t\t\t\t\tprimitive_selection->index_end.push_back(token->id + 1);\n\t\t\t\t\tprimitive_selection->weight.push_back(weight);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tconst k3d::selection::type component;\n\tconst double_t weight;\n};\n\n/// Policy class that updates a mesh_selection to select the given edges\nstruct select_edges\n{\n\tselect_edges(const bool_t SelectAdjacent, const double_t Weight) :\n\t\tselect_adjacent(SelectAdjacent),\n\t\tweight(Weight)\n\t{\n\t}\n\n\tconst k3d::selection::set operator()(k3d::inode* const Node, const k3d::mesh& Mesh, const k3d::selection::set& CurrentSelection, const k3d::selection::records& InteractiveSelection) const\n\t{\n\t\tk3d::selection::set results = CurrentSelection;\n\n\t\t// Extract the set of edges to be selected ...\n\t\tmesh::indices_t edges;\n\t\tmesh::indices_t edge_primitives;\n\t\tfor(k3d::selection::records::const_iterator record = InteractiveSelection.begin(); record != InteractiveSelection.end(); ++record)\n\t\t{\n\t\t\tif(k3d::selection::get_node(*record) != Node)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::selection::record::tokens_t::const_iterator primitive_token = record->tokens.begin(); primitive_token != record->tokens.end(); ++primitive_token)\n\t\t\t{\n\t\t\t\tif(primitive_token->type != k3d::selection::PRIMITIVE)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tfor(k3d::selection::record::tokens_t::const_iterator edge_token = primitive_token + 1; edge_token != record->tokens.end(); ++edge_token)\n\t\t\t\t{\n\t\t\t\t\tif(edge_token->type != k3d::selection::EDGE)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tedges.push_back(edge_token->id);\n\t\t\t\t\tedge_primitives.push_back(primitive_token->id);\n\n\t\t\t\t\tbreak;\t\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Get the set of unique primitives ...\n\t\tstd::set<uint_t> primitives(edge_primitives.begin(), edge_primitives.end());\n\n\t\t// Optionally select adjacent edges ...\n\t\tif(select_adjacent)\n\t\t{\n\t\t\tconst uint_t edge_begin = 0;\n\t\t\tconst uint_t edge_end = edge_begin + edges.size();\n\n\t\t\tfor(std::set<uint_t>::const_iterator primitive = primitives.begin(); primitive != primitives.end(); ++primitive)\n\t\t\t{\n\t\t\t\tif(Mesh.primitives.size() <= *primitive)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tboost::scoped_ptr<polyhedron::const_primitive> polyhedron(polyhedron::validate(Mesh, *Mesh.primitives[*primitive]));\n\t\t\t\tif(!polyhedron)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tmesh::bools_t boundary_edges;\n\t\t\t\tmesh::indices_t adjacent_edges;\n\t\t\t\tpolyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\n\t\t\t\tstd::set<uint_t> primitive_edges;\n\t\t\t\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(edge_primitives[edge] != *primitive)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tprimitive_edges.insert(edges[edge]);\n\t\t\t\t}\n\n\t\t\t\tfor(std::set<uint_t>::const_iterator edge = primitive_edges.begin(); edge != primitive_edges.end(); ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(boundary_edges[*edge])\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif(primitive_edges.count(adjacent_edges[*edge]))\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tedges.push_back(adjacent_edges[*edge]);\n\t\t\t\t\tedge_primitives.push_back(*primitive);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add all our edges to the output selection ...\n\t\tif(edges.size())\n\t\t{\n\t\t\tconst uint_t edge_begin = 0;\n\t\t\tconst uint_t edge_end = edge_begin + edges.size();\n\n\t\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection(geometry::primitive_selection::create(results));\n\n\t\t\tfor(std::set<uint_t>::const_iterator primitive = primitives.begin(); primitive != primitives.end(); ++primitive)\n\t\t\t{\n\t\t\t\tprimitive_selection->primitive_begin.push_back(*primitive);\n\t\t\t\tprimitive_selection->primitive_end.push_back(*primitive + 1);\n\t\t\t\tprimitive_selection->primitive_selection_type.push_back(k3d::selection::EDGE);\n\t\t\t\tprimitive_selection->primitive_first_range.push_back(primitive_selection->index_begin.size());\n\t\t\t\tprimitive_selection->primitive_range_count.push_back(0);\n\t\t\t\tfor(uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(edge_primitives[edge] != *primitive)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tprimitive_selection->primitive_range_count.back() += 1;\n\t\t\t\t\tprimitive_selection->index_begin.push_back(edges[edge]);\n\t\t\t\t\tprimitive_selection->index_end.push_back(edges[edge] + 1);\n\t\t\t\t\tprimitive_selection->weight.push_back(weight);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tconst bool_t select_adjacent;\n\tconst double_t weight;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// mode\n\nstd::ostream& operator<<(std::ostream& Stream, const mode& RHS)\n{\n\tswitch(RHS)\n\t{\n\t\tcase CURVE:\n\t\t\tStream << \"curve\";\n\t\t\tbreak;\n\t\tcase FACE:\n\t\t\tStream << \"face\";\n\t\t\tbreak;\n\t\tcase NODE:\n\t\t\tStream << \"node\";\n\t\t\tbreak;\n\t\tcase PATCH:\n\t\t\tStream << \"patch\";\n\t\t\tbreak;\n\t\tcase POINT:\n\t\t\tStream << \"point\";\n\t\t\tbreak;\n\t\tcase EDGE:\n\t\t\tStream << \"edge\";\n\t\t\tbreak;\n\t\tcase SURFACE:\n\t\t\tStream << \"surface\";\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, mode& RHS)\n{\n\tstd::string text;\n\tStream >> text;\n\n\tif(text == \"curve\")\n\t\tRHS = CURVE;\n\telse if(text == \"face\")\n\t\tRHS = FACE;\n\telse if(text == \"node\")\n\t\tRHS = NODE;\n\telse if(text == \"patch\")\n\t\tRHS = PATCH;\n\telse if(text == \"point\")\n\t\tRHS = POINT;\n\telse if(text == \"edge\")\n\t\tRHS = EDGE;\n\telse if(text == \"surface\")\n\t\tRHS = SURFACE;\n\telse\n\t\tlog() << error << \"Unknown enumeration [\" << text << \"]\"<< std::endl;\n\n\treturn Stream;\n}\n\n/// Provides human-readable labels for the selection::mode enumeration\nstatic const ienumeration_property::enumeration_values_t& mode_values()\n{\n\tstatic ienumeration_property::enumeration_values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Curves\"), \"curve\", _(\"Select Curves\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Faces\"), \"face\", _(\"Select Faces\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Nodes\"), \"node\", _(\"Select Nodes\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Patches\"), \"patch\", _(\"Select Patches\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Points\"), \"point\", _(\"Select Points\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Split Edges\"), \"split_edge\", _(\"Select Split Edges\")));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(_(\"Uniform\"), \"uniform\", _(\"Select Uniform\")));\n\t}\n\n\treturn values;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// state::implementation\n\nclass state::implementation\n{\npublic:\n\tstatic implementation& instance(idocument& Document)\n\t{\n\t\ttypedef std::map<idocument*, implementation*> cache_t;\n\t\tstatic cache_t cache;\n\t\tcache_t::iterator result = cache.find(&Document);\n\t\tif(result == cache.end())\n\t\t\tresult = cache.insert(std::make_pair(&Document, new implementation(Document))).first;\n\n\t\treturn *result->second;\n\t}\n\n\tinode_selection* node_selection()\n\t{\n\t\tif(!m_node_selection)\n\t\t{\n\t\t\tconst std::vector<inode_selection*> nodes = node::lookup<inode_selection>(document, \"ngui:unique_node\", \"node_selection\");\n\t\t\tif(nodes.size() != 1)\n\t\t\t\treturn 0;\n\t\t\tm_node_selection = nodes[0];\n\t\t\t// Make sure the node gets updated whenever the metadata is changed or the node is deleted\n\t\t\timetadata* metadata = dynamic_cast<imetadata*>(nodes[0]);\n\t\t\tm_node_selection_metadata_connection = metadata->connect_metadata_changed_signal(sigc::mem_fun(*this, &implementation::on_node_selection_node_changed));\n\t\t\tm_node_selection_deleted_connection = dynamic_cast<inode*>(m_node_selection)->deleted_signal().connect(sigc::mem_fun(*this, &implementation::on_node_selection_node_changed));\n\t\t}\n\t\treturn m_node_selection;\n\t}\n\n\tconst nodes_t selected_nodes()\n\t{\n\t\tnodes_t result;\n\t\treturn_val_if_fail(node_selection(), result);\n\t\t\n\t\tconst inode_selection::selected_nodes_t nodes = node_selection()->selected_nodes();\n\t\tresult.assign(nodes.begin(), nodes.end());\n\t\tresult.erase(std::remove(result.begin(), result.end(), static_cast<inode*>(0)), result.end());\n\n\t\treturn result;\n\t}\n\n\tidocument& document;\n\n\t/// Defines storage for the current document-wide selection mode\n\t/** \\todo Restore undo/redo capability */\n//\tk3d_data(selection::mode, immutable_name, explicit_change_signal, with_undo, local_storage, no_constraint, no_property, no_serialization) current_mode;\n\tk3d_data(selection::mode, immutable_name, explicit_change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) current_mode;\n\n\t/// Defines storage for the document-wide keep-selection mode\n\tk3d_data(bool_t, immutable_name, explicit_change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) keep_selection;\n\n\t/// Defines storage for the document-wide convert-selection mode\n\tk3d_data(bool_t, immutable_name, explicit_change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) convert_selection;\n\n\t/// Defines storage for the document-wide select-adjacent-edges state\n\tk3d_data(bool_t, immutable_name, explicit_change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) select_adjacent_edges;\n\nprivate:\n\timplementation(idocument& Document) :\n\t\tdocument(Document),\n\t\tcurrent_mode(init_name(\"selection_mode\") + init_label(_(\"Selection Type\")) + init_description(_(\"Sets selection mode (nodes, faces, edges, points, etc)\")) + init_value(selection::NODE) + init_values(mode_values())),\n\t\tkeep_selection(init_name(\"keep_selection\") + init_label(_(\"Keep Selection\")) + init_description(_(\"Keep the current selection when changing the selection mode.\")) + init_value(false)),\n\t\tconvert_selection(init_name(\"convert_selection\") + init_label(_(\"Convert Selection\")) + init_description(_(\"Convert the current selection when changing the selection mode.\")) + init_value(true)),\n\t\tselect_adjacent_edges(init_name(\"select_adjacent_edges\") + init_label(_(\"Select Adjacent Edges\")) + init_description(_(\"When selecting edges, automatically expand the selection to include adjacent edges.\")) + init_value(true)),\n\t\tm_node_selection(0)\n\t{\n\t\tcurrent_mode.connect_explicit_change_signal(sigc::mem_fun(*this, &implementation::on_selection_mode_changed));\n\t}\n\n\t/// Called by the signal system when the selection mode changes\n\tvoid on_selection_mode_changed(k3d::iunknown*)\n\t{\n\t\tconst nodes_t nodes = selected_nodes();\n\t\tfor(nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\tif(classes::MeshInstance() != (*node)->factory().factory_id())\n\t\t\t\tcontinue;\n\n\t\t\timesh_selection_sink* const mesh_selection_sink = dynamic_cast<imesh_selection_sink*>(*node);\n\t\t\tif(!mesh_selection_sink)\n\t\t\t\tcontinue;\n\n\t\t\timesh_source* const mesh_source = dynamic_cast<imesh_source*>(*node);\n\t\t\tif(!mesh_source)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(mesh_source->mesh_source_output().property_internal_value());\n\t\t\tif(!mesh)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::selection::set new_selection;\n\n\t\t\tif(keep_selection.internal_value())\n\t\t\t{\n\t\t\t\tnew_selection = boost::any_cast<k3d::selection::set>(mesh_selection_sink->mesh_selection_sink_input().property_internal_value());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<geometry::point_selection::storage> point_selection(geometry::point_selection::create(new_selection));\n\t\t\t\tgeometry::point_selection::append(*point_selection, 0.0);\n\n\t\t\t\tboost::scoped_ptr<geometry::primitive_selection::storage> primitive_selection(geometry::primitive_selection::create(new_selection));\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CONSTANT, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::CURVE, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::EDGE, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::FACE, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PARAMETER, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::PATCH, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::SURFACE, 0.0);\n\t\t\t\tgeometry::primitive_selection::append(*primitive_selection, k3d::selection::VERTEX, 0.0);\n\t\t\t}\n\n\t\t\tif(convert_selection.internal_value())\n\t\t\t{\n\t\t\t\tswitch(current_mode.internal_value())\n\t\t\t\t{\n\t\t\t\t\tcase CURVE:\n\t\t\t\t\t{\n\t\t\t\t\t\tstatic imesh_selection_algorithm* conversion = plugin::create<imesh_selection_algorithm>(\"MakeCurveSelection\");\n\t\t\t\t\t\treturn_if_fail(conversion);\n\t\t\t\t\t\tk3d::selection::set::append(conversion->create_mesh_selection(*mesh), new_selection);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase EDGE:\n\t\t\t\t\t{\n\t\t\t\t\t\tstatic imesh_selection_algorithm* conversion = plugin::create<imesh_selection_algorithm>(\"MakeEdgeSelection\");\n\t\t\t\t\t\treturn_if_fail(conversion);\n\t\t\t\t\t\tk3d::selection::set::append(conversion->create_mesh_selection(*mesh), new_selection);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase FACE:\n\t\t\t\t\t{\n\t\t\t\t\t\tstatic imesh_selection_algorithm* conversion = plugin::create<imesh_selection_algorithm>(\"MakeFaceSelection\");\n\t\t\t\t\t\treturn_if_fail(conversion);\n\t\t\t\t\t\tk3d::selection::set::append(conversion->create_mesh_selection(*mesh), new_selection);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase NODE:\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase PATCH:\n\t\t\t\t\t{\n\t\t\t\t\t\tstatic imesh_selection_algorithm* conversion = plugin::create<imesh_selection_algorithm>(\"MakePatchSelection\");\n\t\t\t\t\t\treturn_if_fail(conversion);\n\t\t\t\t\t\tk3d::selection::set::append(conversion->create_mesh_selection(*mesh), new_selection);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase POINT:\n\t\t\t\t\t{\n\t\t\t\t\t\tstatic imesh_selection_algorithm* conversion = plugin::create<imesh_selection_algorithm>(\"MakePointSelection\");\n\t\t\t\t\t\treturn_if_fail(conversion);\n\t\t\t\t\t\tk3d::selection::set::append(conversion->create_mesh_selection(*mesh), new_selection);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SURFACE:\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tproperty::set_internal_value(mesh_selection_sink->mesh_selection_sink_input(), new_selection);\n\t\t\tproperty::set_internal_value(**node, \"show_component_selection\", true);\n\t\t}\n\t}\n\n\tvoid on_node_selection_node_changed()\n\t{\n\t\tm_node_selection_metadata_connection.disconnect();\n\t\tm_node_selection_deleted_connection.disconnect();\n\t\tm_node_selection = 0;\n\t}\n\t\n\t/// Cached pointer to the document node selection node\n\tinode_selection* m_node_selection;\n\tsigc::connection m_node_selection_metadata_connection;\n\tsigc::connection m_node_selection_deleted_connection;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// state\n\nstate::state(idocument& Document) :\n\tinternal(implementation::instance(Document))\n{\n}\n\nconst mode state::current_mode()\n{\n\treturn internal.current_mode.internal_value();\n}\n\nvoid state::set_current_mode(const mode Mode)\n{\n\tinternal.current_mode.set_value(Mode);\n}\n\nsigc::connection state::connect_current_mode_changed_signal(const sigc::slot<void, ihint*>& Slot)\n{\n\treturn internal.current_mode.changed_signal().connect(Slot);\n}\n\nbool_t state::keep_selection()\n{\n\treturn internal.keep_selection.internal_value();\n}\n\nvoid state::set_keep_selection(const bool_t Keep)\n{\n\tinternal.keep_selection.set_value(Keep);\n}\n\nsigc::connection state::connect_keep_selection_changed_signal(const sigc::slot<void, ihint*>& Slot)\n{\n\treturn internal.keep_selection.changed_signal().connect(Slot);\n}\n\nbool_t state::convert_selection()\n{\n\treturn internal.convert_selection.internal_value();\n}\n\nvoid state::set_convert_selection(const bool_t Convert)\n{\n\tinternal.convert_selection.set_value(Convert);\n}\n\nsigc::connection state::connect_convert_selection_changed_signal(const sigc::slot<void, ihint*>& Slot)\n{\n\treturn internal.convert_selection.changed_signal().connect(Slot);\n}\n\nbool_t state::select_adjacent_edges()\n{\n\treturn internal.select_adjacent_edges.internal_value();\n}\n\nvoid state::set_select_adjacent_edges(const bool_t Expand)\n{\n\tinternal.select_adjacent_edges.set_value(Expand);\n}\n\nsigc::connection state::connect_select_adjacent_edges_changed_signal(const sigc::slot<void, ihint*>& Slot)\n{\n\treturn internal.select_adjacent_edges.changed_signal().connect(Slot);\n}\n\nconst nodes_t state::selected_nodes()\n{\n\treturn internal.selected_nodes();\n}\n\nvoid state::select(inode& Node)\n{\n\treturn_if_fail(internal.node_selection());\n\tinternal.node_selection()->select(Node, 1.0);\t\n}\n\nvoid state::select(const k3d::selection::record& Selection)\n{\n\tselect(k3d::selection::records(1, Selection));\n}\n\nvoid state::select(const k3d::selection::records& Selection)\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase CURVE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::CURVE, 1.0), Selection);\n\t\t\tbreak;\n\t\tcase FACE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::FACE, 1.0), Selection);\n\t\t\tbreak;\n\t\tcase NODE:\n\t\t\tselect_nodes(Selection);\n\t\t\tbreak;\n\t\tcase PATCH:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::PATCH, 1.0), Selection);\n\t\t\tbreak;\n\t\tcase POINT:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_points(1.0), Selection);\n\t\t\tbreak;\n\t\tcase EDGE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_edges(internal.select_adjacent_edges.internal_value(), 1.0), Selection);\n\t\t\tbreak;\n\t\tcase SURFACE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::SURFACE, 1.0), Selection);\n\t\t\tbreak;\n\t}\n}\n\nvoid state::select_nodes(const k3d::selection::records& Selection)\n{\n\tfor(k3d::selection::records::const_iterator record = Selection.begin(); record != Selection.end(); ++record)\n\t{\n\t\tif(inode* const node = k3d::selection::get_node(*record))\n\t\t{\n\t\t\tselect(*node);\n\t\t}\n\t}\n}\n\nvoid state::select_nodes(const nodes_t& Selection)\n{\n\tfor(nodes_t::const_iterator node = Selection.begin(); node != Selection.end(); ++node)\n\t\tselect(**node);\n}\n\nvoid state::select_all()\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase CURVE:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_components(k3d::selection::CURVE), true);\n\t\t\tbreak;\n\t\tcase FACE:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_components(k3d::selection::FACE), true);\n\t\t\tbreak;\n\t\tcase NODE:\n\t\t\tselect_all_nodes();\n\t\t\tbreak;\n\t\tcase PATCH:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_components(k3d::selection::PATCH), true);\n\t\t\tbreak;\n\t\tcase POINT:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_points(), true);\n\t\t\tbreak;\n\t\tcase EDGE:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_components(k3d::selection::EDGE), true);\n\t\t\tbreak;\n\t\tcase SURFACE:\n\t\t\tdetail::replace_selection(selected_nodes(), detail::select_all_components(k3d::selection::SURFACE), true);\n\t\t\tbreak;\n\t}\n}\n\nvoid state::select_all_nodes()\n{\n\tconst nodes_t& nodes = internal.document.nodes().collection();\n\tfor(nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\tselect(**node);\n}\n\nvoid state::invert_selection()\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase CURVE:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_components(k3d::selection::CURVE), true);\n\t\t\tbreak;\n\t\tcase FACE:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_components(k3d::selection::FACE), true);\n\t\t\tbreak;\n\t\tcase NODE:\n\t\t\tinvert_all_nodes();\n\t\t\tbreak;\n\t\tcase PATCH:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_components(k3d::selection::PATCH), true);\n\t\t\tbreak;\n\t\tcase POINT:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_points(), true);\n\t\t\tbreak;\n\t\tcase EDGE:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_components(k3d::selection::EDGE), true);\n\t\t\tbreak;\n\t\tcase SURFACE:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::invert_components(k3d::selection::SURFACE), true);\n\t\t\tbreak;\n\t}\n}\n\nvoid state::invert_all_nodes()\n{\n\tfor(k3d::inode_collection::nodes_t::const_iterator node = internal.document.nodes().collection().begin(); node != internal.document.nodes().collection().end(); ++node)\n\t{\n\t\tif(is_selected(**node))\n\t\t\tdeselect(**node);\n\t\telse\n\t\t\tselect(**node);\n\t}\n}\n\nconst bool_t state::is_selected(inode& Node)\n{\n\tif(internal.node_selection())\n\t\treturn internal.node_selection()->selection_weight(Node);\n}\n\nstatic const bool_t is_curve_selected(const k3d::selection::record& Record)\n{\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\tk3d::selection::id primitive_id = k3d::selection::null_id();\n\tconst k3d::mesh::primitive* primitive = 0;\n\n\tfor(k3d::selection::record::tokens_t::const_iterator token = Record.tokens.begin(); token != Record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(Record);\n\t\t\t\treturn_val_if_fail(node, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PRIMITIVE:\n\t\t\t{\n\t\t\t\tprimitive_id = token->id;\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive_id < mesh->primitives.size(), false);\n\t\t\t\tprimitive = mesh->primitives[primitive_id].get();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::CURVE:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive, false);\n\n\t\t\t\tconst k3d::selection::id curve = token->id;\n\n\t\t\t\tboost::scoped_ptr<k3d::linear_curve::const_primitive> linear_curve(k3d::linear_curve::validate(*mesh, *primitive));\n\t\t\t\tif(linear_curve)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(curve < linear_curve->curve_selections.size(), false);\n\t\t\t\t\treturn linear_curve->curve_selections[curve];\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::cubic_curve::const_primitive> cubic_curve(k3d::cubic_curve::validate(*mesh, *primitive));\n\t\t\t\tif(cubic_curve)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(curve < cubic_curve->curve_selections.size(), false);\n\t\t\t\t\treturn cubic_curve->curve_selections[curve];\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> nurbs_curve(k3d::nurbs_curve::validate(*mesh, *primitive));\n\t\t\t\tif(nurbs_curve)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(curve < nurbs_curve->curve_selections.size(), false);\n\t\t\t\t\treturn nurbs_curve->curve_selections[curve];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nstatic const bool_t is_edge_selected(const k3d::selection::record& Record)\n{\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\tk3d::selection::id primitive_id = k3d::selection::null_id();\n\tconst k3d::mesh::primitive* primitive = 0;\n\n\tfor(k3d::selection::record::tokens_t::const_iterator token = Record.tokens.begin(); token != Record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(Record);\n\t\t\t\treturn_val_if_fail(node, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PRIMITIVE:\n\t\t\t{\n\t\t\t\tprimitive_id = token->id;\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive_id < mesh->primitives.size(), false);\n\t\t\t\tprimitive = mesh->primitives[primitive_id].get();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::EDGE:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive, false);\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, *primitive));\n\t\t\t\treturn_val_if_fail(polyhedron, false);\n\n\t\t\t\tconst k3d::selection::id edge = token->id;\n\t\t\t\treturn_val_if_fail(edge < polyhedron->clockwise_edges.size(), false);\n\t\t\t\treturn polyhedron->edge_selections[edge];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nstatic const bool_t is_face_selected(const k3d::selection::record& Record)\n{\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\tk3d::selection::id primitive_id = k3d::selection::null_id();\n\tconst k3d::mesh::primitive* primitive = 0;\n\n\tfor(k3d::selection::record::tokens_t::const_iterator token = Record.tokens.begin(); token != Record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(Record);\n\t\t\t\treturn_val_if_fail(node, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PRIMITIVE:\n\t\t\t{\n\t\t\t\tprimitive_id = token->id;\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive_id < mesh->primitives.size(), false);\n\t\t\t\tprimitive = mesh->primitives[primitive_id].get();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::FACE:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive, false);\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, *primitive));\n\t\t\t\treturn_val_if_fail(polyhedron, false);\n\n\t\t\t\tconst k3d::selection::id face = token->id;\n\t\t\t\treturn_val_if_fail(face < polyhedron->face_first_loops.size(), false);\n\t\t\t\treturn polyhedron->face_selections[face];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nstatic const bool_t is_patch_selected(const k3d::selection::record& Record)\n{\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\tk3d::selection::id primitive_id = k3d::selection::null_id();\n\tconst k3d::mesh::primitive* primitive = 0;\n\n\tfor(k3d::selection::record::tokens_t::const_iterator token = Record.tokens.begin(); token != Record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(Record);\n\t\t\t\treturn_val_if_fail(node, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PRIMITIVE:\n\t\t\t{\n\t\t\t\tprimitive_id = token->id;\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive_id < mesh->primitives.size(), false);\n\t\t\t\tprimitive = mesh->primitives[primitive_id].get();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::PATCH:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(primitive, false);\n\n\t\t\t\tconst k3d::selection::id patch = token->id;\n\n\t\t\t\tboost::scoped_ptr<k3d::bilinear_patch::const_primitive> bilinear_patch(k3d::bilinear_patch::validate(*mesh, *primitive));\n\t\t\t\tif(bilinear_patch)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(patch < bilinear_patch->patch_selections.size(), false);\n\t\t\t\t\treturn bilinear_patch->patch_selections[patch];\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::bicubic_patch::const_primitive> bicubic_patch(k3d::bicubic_patch::validate(*mesh, *primitive));\n\t\t\t\tif(bicubic_patch)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(patch < bicubic_patch->patch_selections.size(), false);\n\t\t\t\t\treturn bicubic_patch->patch_selections[patch];\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs_patch(k3d::nurbs_patch::validate(*mesh, *primitive));\n\t\t\t\tif(nurbs_patch)\n\t\t\t\t{\n\t\t\t\t\treturn_val_if_fail(patch < nurbs_patch->patch_selections.size(), false);\n\t\t\t\t\treturn nurbs_patch->patch_selections[patch];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nstatic const bool_t is_point_selected(const k3d::selection::record& Record)\n{\n\tk3d::selection::id node_id = k3d::selection::null_id();\n\tk3d::inode* node = 0;\n\tk3d::selection::id mesh_id = k3d::selection::null_id();\n\tk3d::mesh* mesh = 0;\n\n\tfor(k3d::selection::record::tokens_t::const_iterator token = Record.tokens.begin(); token != Record.tokens.end(); ++token)\n\t{\n\t\tswitch(token->type)\n\t\t{\n\t\t\tcase k3d::selection::NODE:\n\t\t\t{\n\t\t\t\tnode_id = token->id;\n\t\t\t\tnode = k3d::selection::get_node(Record);\n\t\t\t\treturn_val_if_fail(node, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::MESH:\n\t\t\t{\n\t\t\t\tmesh_id = token->id;\n\t\t\t\tmesh = selection::get_mesh(node, mesh_id);\n\t\t\t\treturn_val_if_fail(mesh, false);\n\t\t\t\treturn_val_if_fail(mesh->point_selection, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase k3d::selection::POINT:\n\t\t\t{\n\t\t\t\treturn_val_if_fail(mesh, false);\n\n\t\t\t\tconst k3d::selection::id point = token->id;\n\t\t\t\treturn_val_if_fail(point < mesh->point_selection->size(), false);\n\t\t\t\treturn (*mesh->point_selection)[point];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nconst bool_t state::is_selected(const k3d::selection::record& Record)\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase CURVE:\n\t\t\treturn is_curve_selected(Record);\n\t\tcase EDGE:\n\t\t\treturn is_edge_selected(Record);\n\t\tcase FACE:\n\t\t\treturn is_face_selected(Record);\n\t\tcase NODE:\n\t\t{\n\t\t\tk3d::inode* const node = k3d::selection::get_node(Record);\n\t\t\treturn node ? is_selected(*node) : false;\n\t\t}\n\t\tcase PATCH:\n\t\t\treturn is_patch_selected(Record);\n\t\tcase POINT:\n\t\t\treturn is_point_selected(Record);\n\t\tcase SURFACE:\n\t\t\tassert_not_implemented();\n\t\t\treturn false;\n\t}\n\n\treturn false;\n}\n\nvoid state::deselect(inode& Node)\n{\n\tif(internal.node_selection())\n\t\tinternal.node_selection()->select(Node, 0.0);\t\n}\n\nvoid state::deselect(const k3d::selection::record& Selection)\n{\n\tdeselect(k3d::selection::records(1, Selection));\n}\n\nvoid state::deselect(const k3d::selection::records& Selection)\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase CURVE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::CURVE, 0.0), Selection);\n\t\t\tbreak;\n\t\tcase FACE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::FACE, 0.0), Selection);\n\t\t\tbreak;\n\t\tcase NODE:\n\t\t\tdeselect_nodes(Selection);\n\t\t\tbreak;\n\t\tcase PATCH:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::PATCH, 0.0), Selection);\n\t\t\tbreak;\n\t\tcase POINT:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_points(0.0), Selection);\n\t\t\tbreak;\n\t\tcase EDGE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_edges(internal.select_adjacent_edges.internal_value(), 0.0), Selection);\n\t\t\tbreak;\n\t\tcase SURFACE:\n\t\t\tdetail::merge_interactive_selection(selected_nodes(), detail::select_component(k3d::selection::SURFACE, 0.0), Selection);\n\t\t\tbreak;\n\t}\n}\n\nvoid state::deselect_nodes(const k3d::selection::records& Selection)\n{\n\tfor(k3d::selection::records::const_iterator record = Selection.begin(); record != Selection.end(); ++record)\n\t{\n\t\tif(k3d::inode* const node = k3d::selection::get_node(*record))\n\t\t\tdeselect(*node);\n\t}\n}\n\nvoid state::deselect_nodes(const nodes_t& Selection)\n{\n\tfor(nodes_t::const_iterator node = Selection.begin(); node != Selection.end(); ++node)\n\t\tdeselect(**node);\n}\n\nvoid state::deselect_all()\n{\n\tswitch(internal.current_mode.internal_value())\n\t{\n\t\tcase NODE:\n\t\t\tdeselect_all_nodes();\n\t\t\tbreak;\n\t\tcase CURVE:\n\t\tcase FACE:\n\t\tcase PATCH:\n\t\tcase POINT:\n\t\tcase EDGE:\n\t\tcase SURFACE:\n\t\t\tdetail::replace_selection(internal.document.nodes().collection(), detail::deselect_all(), false);\n\t\t\tbreak;\n\t}\n}\n\nvoid state::deselect_all_nodes()\n{\n\tif(internal.node_selection())\n\t\tinternal.node_selection()->deselect_all();\n}\n\nmesh* get_mesh(inode* Node, const k3d::selection::id& MeshID)\n{\n\treturn_val_if_fail(Node, 0);\n\treturn_val_if_fail(MeshID == 0, 0); // Should never get a node with more than one mesh!\n\n\timesh_source* const mesh_source = dynamic_cast<imesh_source*>(Node);\n\treturn_val_if_fail(mesh_source, 0);\n\n\treturn boost::any_cast<k3d::mesh*>(mesh_source->mesh_source_output().property_internal_value());\n}\n\n} // namespace selection\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/selection.h",
    "content": "#ifndef K3DSDK_QTUI_SELECTION_H\n#define K3DSDK_QTUI_SELECTION_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/selection.h>\n\n#include <iosfwd>\n#include <vector>\n\nnamespace k3d\n{\n\nclass idocument;\nclass inode;\n\nnamespace qtui\n{\n\nnamespace selection\n{\n\n/// Enumerates available interactive selection modes\nenum mode\n{\n\t/// Select curve components\n\tCURVE,\n\t/// Select face components\n\tFACE,\n\t/// Select individual nodes\n\tNODE,\n\t/// Select patches\n\tPATCH,\n\t/// Select points\n\tPOINT,\n\t/// Select polyhedron split-edges\n\tEDGE,\n\t/// Select surface components\n\tSURFACE,\n};\n\nstd::ostream& operator<<(std::ostream& Stream, const mode& Value);\nstd::istream& operator>>(std::istream& Stream, mode& Value);\n\n/// Provides convenience methods for manipulating the selection state of a document.\nclass state\n{\npublic:\n\tstate(idocument& Document);\n\n\t/// Returns the current selection mode.\n\tconst mode current_mode();\n\t/// Sets the current selection mode.\n\tvoid set_current_mode(const mode Mode);\n\t/// Connect a slot to a signal that will be emitted whenever the selection mode changes.\n\tsigc::connection connect_current_mode_changed_signal(const sigc::slot<void, ihint*>& Slot);\n\n\t/// Returns whether the current selection should be retained when switching the selection mode\n\tbool_t keep_selection();\n\t/// Sets whether the current selection should be retained when switching the selection mode\n\tvoid set_keep_selection(const bool_t Keep);\n\t/// Connect a slot to a signal that will be emitted whenever the keep selection mode changes.\n\tsigc::connection connect_keep_selection_changed_signal(const sigc::slot<void, ihint*>& Slot);\n\n\t/// Returns whether the current selection should be converted when switching the selection mode\n\tbool_t convert_selection();\n\t/// Sets whether the current selection should be converted when switching the selection mode\n\tvoid set_convert_selection(const bool_t Convert);\n\t/// Connect a slot to a signal that will be emitted whenever the convert selection mode changes.\n\tsigc::connection connect_convert_selection_changed_signal(const sigc::slot<void, ihint*>& Slot);\n\n\t/// Returns whether edge selections should be automatically expanded to include adjacent edges.\n\tbool_t select_adjacent_edges();\n\t/// Sets whether edge selections should be automatically expanded to include adjacent edges.\n\tvoid set_select_adjacent_edges(const bool_t Expand);\n\t/// Connect a slot to a signal that will be emitted whenever the adjacent edge selection state changes.\n\tsigc::connection connect_select_adjacent_edges_changed_signal(const sigc::slot<void, ihint*>& Slot);\n\n\t/// Returns the current set of selected nodes.\n\tconst nodes_t selected_nodes();\n\n\t/// Selects one node.\n\tvoid select(inode& Node);\n\t/// Selects a collection of components.\n\tvoid select(const k3d::selection::record& Selection);\n\t/// Selects a collection of components.\n\tvoid select(const k3d::selection::records& Selection);\n\t/// Selects a collection of nodes.\n\tvoid select_nodes(const k3d::selection::records& Selection);\n\t/// Selects a collection of nodes.\n\tvoid select_nodes(const nodes_t& Selection);\n\t/// Selects all nodes or components (depending on current selection mode).\n\tvoid select_all();\n\t/// Selects all nodes.\n\tvoid select_all_nodes();\n\n\t/// Inverts current selection.\n\tvoid invert_selection();\n\t/// Inverts all nodes.\n\tvoid invert_all_nodes();\n\n\t/// Returns true iff the given node is selected.\n\tconst bool_t is_selected(inode& Node);\n\t/// Returns true iff the given component is already selected.\n\tconst bool_t is_selected(const k3d::selection::record& Record);\n\n\t/// Deselects one node.\n\tvoid deselect(inode& Node);\n\t/// Deselects a collection of components.\n\tvoid deselect(const k3d::selection::record& Selection);\n\t/// Deselects a collection of components.\n\tvoid deselect(const k3d::selection::records& Selection);\n\t/// Deselects a collection of nodes.\n\tvoid deselect_nodes(const k3d::selection::records& Selection);\n\t/// Deselects a collection of nodes.\n\tvoid deselect_nodes(const nodes_t& Selection);\n\t/// Deselects all nodes or components (depending on current selection mode).\n\tvoid deselect_all();\n\t/// Deselects all nodes.\n\tvoid deselect_all_nodes();\n\nprivate:\n\tclass implementation;\n\timplementation& internal;\n};\n\nmesh* get_mesh(inode* Node, const k3d::selection::id& MeshID);\n\n} // namespace selection\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_SELECTION_H\n\n"
  },
  {
    "path": "k3dsdk/qtui/uri.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/iuri_handler.h>\n#include <k3dsdk/string_cast.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace uri\n{\n\nvoid open(const string_t& URI)\n{\n\t// Look URI-handler plugins ...\n\tconst plugin::factory::collection_t factories = plugin::factory::lookup<iuri_handler>();\n\tif(factories.empty())\n\t{\n//\t\tk3d::qtui::error_message(k3d::string_cast(boost::format(_(\"Couldn't display %1%\")) % URI), _(\"No plugin is available to open URIs.\"));\n\t\treturn;\n\t}\n\n\tfor(plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t{\n\t\tboost::scoped_ptr<iuri_handler> handler(k3d::plugin::create<iuri_handler>(**factory));\n\t\tif(handler)\n\t\t{\n\t\t\tif(handler->open_uri(URI))\n\t\t\t\treturn;\n\t\t}\n\t}\n\n//\tk3d::qtui::error_message(k3d::string_cast(boost::format(_(\"Couldn't display %1%\")) % URI), _(\"No application is configured to handle the given URI.\"));\n}\n\n} // namespace uri\n\n} // namespace qtui\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/qtui/uri.h",
    "content": "#ifndef K3DSDK_QTUI_URI_H\n#define K3DSDK_QTUI_URI_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nnamespace qtui\n{\n\nnamespace uri\n{\n\n/// Asynchronously displays a URI in the user's choice of application, displays an error message otherwise\nvoid open(const string_t& URI);\n\n} // namespace uri\n\n} // namespace qtui\n\n} // namespace k3d\n\n#endif // !K3DSDK_QTUI_URI_H\n\n"
  },
  {
    "path": "k3dsdk/rectangle.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/rectangle.h>\n\n#include <cmath>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// rectangle\n\nrectangle::rectangle() :\n\tx1(0),\n\tx2(0),\n\ty1(0),\n\ty2(0)\n{\n}\n\nrectangle::rectangle(const double_t X1, const double_t X2, const double_t Y1, const double_t Y2) :\n\tx1(X1),\n\tx2(X2),\n\ty1(Y1),\n\ty2(Y2)\n{\n}\n\nrectangle::rectangle(const point2& Center, const double_t Width, const double_t Height) :\n       x1(Center[0] - (Width / 2)),\n       x2(Center[0] + (Width / 2)),\n       y1(Center[1] - (Height / 2)),\n       y2(Center[1] + (Height / 2))\n{\n}\n\ndouble_t rectangle::width() const\n{\n\treturn std::fabs(x2 - x1);\n}\n\ndouble_t rectangle::height() const\n{\n\treturn std::fabs(y2 - y1);\n}\n\nconst point2 rectangle::center() const\n{\n\treturn point2(x1 + x2, y1 + y2) * 0.5;\n}\n\nbool_t rectangle::contains(const point2& Point) const\n{\n       return std::min(x1, x2) <= Point[0] && Point[0] <= std::max(x1, x2) && std::min(y1, y2) <= Point[1] && Point[1] <= std::max(y1, y2);\n}\n\nbool_t rectangle::operator==(const rectangle& Other) const\n{\n\treturn x1 == Other.x1 && x2 == Other.x2 && y1 == Other.y1 && y2 == Other.y2;\n}\n\nbool_t rectangle::operator!=(const rectangle& Other) const\n{\n\treturn !(*this == Other);\n}\n\nconst rectangle rectangle::normalize(const rectangle& Rectangle)\n{\n\treturn rectangle(\n\t\tstd::min(Rectangle.x1, Rectangle.x2),\n\t\tstd::max(Rectangle.x1, Rectangle.x2),\n\t\tstd::min(Rectangle.y1, Rectangle.y2),\n\t\tstd::max(Rectangle.y1, Rectangle.y2));\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const rectangle& Arg)\n{\n\tStream << Arg.x1 << \" \" << Arg.x2 << \" \" << Arg.y1 << \" \" << Arg.y2;\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, rectangle& Arg)\n{\n\tStream >> Arg.x1 >> Arg.x2 >> Arg.y1 >> Arg.y2;\n\treturn Stream;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/rectangle.h",
    "content": "#ifndef K3DSDK_RECTANGLE_H\n#define K3DSDK_RECTANGLE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/point2.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// rectangle\n\n/// Provides storage for a two-dimensional rectangle.\nclass rectangle\n{\npublic:\n\trectangle();\n\trectangle(const double_t X1, const double_t X2, const double_t Y1, const double_t Y2);\n\trectangle(const point2& Center, const double_t Width, const double_t Height);\n\n\t/// Returns the rectangle width, which will always be >= 0.\n\tdouble_t width() const;\n\t/// Returns the rectangle height, which will always be >= 0.\n\tdouble_t height() const;\n\t/// Returns the center of the rectangle.\n\tconst point2 center() const;\n\t/// Tests a point to see if it is contained within the rectangle\n\tbool_t contains(const point2& Point) const;\n\t/// Stores the rectangle's first vertical edge.\n\tdouble_t x1;\n\t/// Stores the rectangle's second vertical edge.\n\tdouble_t x2;\n\t/// Stores the rectangle's first horizontal edge.\n\tdouble_t y1;\n\t/// Stores the rectangle's second horizontal edge.\n\tdouble_t y2;\n\n\tbool_t operator==(const rectangle& Other) const;\n\tbool_t operator!=(const rectangle& Other) const;\n\n\t/// Returns a rectangle where x1 <= x2 and y1 <= y2.\n\tstatic const rectangle normalize(const rectangle& Rectangle);\n};\n\n/// Serialization\nstd::ostream& operator<<(std::ostream& Stream, const rectangle& Value);\n/// Serialization\nstd::istream& operator>>(std::istream& Stream, rectangle& Value);\n\n\n} // namespace k3d\n\n#endif // !K3DSDK_RECTANGLE_H\n\n"
  },
  {
    "path": "k3dsdk/register_application.h",
    "content": "#ifndef K3DSDK_REGISTER_APPLICATION_H\n#define K3DSDK_REGISTER_APPLICATION_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Provides singleton access to the global K-3D application object\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iapplication.h>\n\nnamespace k3d\n{\n\n/// Registers the global application object with the library - will throw if called more than once!\nvoid register_application(k3d::iapplication& Application);\n\n} // namespace k3d\n\n#endif // !K3DSDK_REGISTER_APPLICATION_H\n\n"
  },
  {
    "path": "k3dsdk/register_plugin_factories.h",
    "content": "#ifndef K3DSDK_REGISTER_PLUGIN_FACTORIES_H\n#define K3DSDK_REGISTER_PLUGIN_FACTORIES_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iapplication.h>\n\nnamespace k3d\n{\n\n/// Registers the global plugin factory collection with the library.\nvoid register_plugin_factories(iplugin_factory_collection& Collection);\n\n} // namespace k3d\n\n#endif // !K3DSDK_REGISTER_PLUGIN_FACTORIES_H\n\n"
  },
  {
    "path": "k3dsdk/render_state_gl.h",
    "content": "#ifndef K3DSDK_RENDER_STATE_GL_H\n#define K3DSDK_RENDER_STATE_GL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nclass icamera;\n\nnamespace gl\n{\n\n/// Used to pass (potentially) useful rendering state from the engine to the object being rendered\nclass render_state\n{\npublic:\n\trender_state(icamera& Camera) :\n\t\tcamera(Camera),\n\t\torthographic(false),\n\t\tdraw_two_sided(true)\n\t{\n\t}\n\n\t/// Stores the camera used for drawing\n\ticamera& camera;\n\n\t/// Set to true iff the OpenGL viewing frustum used for drawing is orthographic\n\tbool_t orthographic;\n\t\n\tbool_t draw_two_sided;\n\t\n\t//@{\n\t/** Stores the OpenGL viewing frustum used for drawing (perspective or orthographic).\n\t * Note: these are the actual values passed to glFrustum() or glOrtho() to fill the\n\t * render window, in general they will be different from the viewing frustum defined\n\t * by the camera for rendering. */\n\tdouble_t gl_window_frustum_left;\n\tdouble_t gl_window_frustum_right;\n\tdouble_t gl_window_frustum_top;\n\tdouble_t gl_window_frustum_bottom;\n\tdouble_t gl_window_frustum_near;\n\tdouble_t gl_window_frustum_far;\n\t//@}\n\t\n\t//@{\n\t/** Stores an imaginary OpenGL viewing frustum that represents the viewing frustum\n\t * defined by the camera for rendering.  Note that the values may not be the same\n\t * as those returned by the camera object.  */\n\tdouble_t gl_camera_frustum_left;\n\tdouble_t gl_camera_frustum_right;\n\tdouble_t gl_camera_frustum_top;\n\tdouble_t gl_camera_frustum_bottom;\n\tdouble_t gl_camera_frustum_near;\n\tdouble_t gl_camera_frustum_far;\n\t//@}\n\n\t/// Stores the current OpenGL projection matrix\n\tGLfloat gl_projection_matrix[16];\n\t\n\t/// Stores the current OpenGL viewport\n\tGLint gl_viewport[4];\n\t\n\t/// Stores the selection state of the calling node\n\tdouble_t node_selection;\n\t/// Stores the selection state of the parent of the calling node\n\tdouble_t parent_selection;\n};\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_RENDER_STATE_GL_H\n\n"
  },
  {
    "path": "k3dsdk/render_state_ri.h",
    "content": "#ifndef K3DSDK_RENDER_STATE_RI_H\n#define K3DSDK_RENDER_STATE_RI_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/types_ri.h>\n\nnamespace k3d\n{\n\nclass iprojection;\nclass inetwork_render_frame;\nclass matrix4;\n\t\nnamespace ri\n{\n\nclass istream;\nclass ishader_collection;\n\t\n/// Used to pass (potentially) useful rendering state from the renderer to the object being rendered\nclass render_state\n{\npublic:\n\trender_state(inetwork_render_frame& Frame, istream& Stream, ishader_collection& Shaders, iprojection& Projection, const render_context_t RenderContext, const sample_times_t& SampleTimes, const unsigned_integer SampleIndex, const matrix4& CameraMatrix) :\n\t\tframe(Frame),\n\t\tstream(Stream),\n\t\tshaders(Shaders),\n\t\tprojection(Projection),\n\t\trender_context(RenderContext),\n\t\tsample_times(SampleTimes),\n\t\tsample_index(SampleIndex),\n\t\tcamera_matrix(CameraMatrix)\n\t{\n\t}\n\n\tinetwork_render_frame& frame;\n\tistream& stream;\n\tishader_collection& shaders;\n\tiprojection& projection;\n\trender_context_t render_context;\n\tsample_times_t sample_times;\n\tunsigned_integer sample_index;\n\tmatrix4 camera_matrix;\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_RENDER_STATE_RI_H\n\n"
  },
  {
    "path": "k3dsdk/renderable_gl.h",
    "content": "#ifndef K3DSDK_RENDERABLE_GL_H\n#define K3DSDK_RENDERABLE_GL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/irender_viewport_gl.h>\n#include <k3dsdk/irenderable_gl.h>\n#include <k3dsdk/render_state_gl.h>\n#include <k3dsdk/utility_gl.h>\n\nnamespace k3d\n{\n\nclass bounding_box3;\nclass idocument;\nclass plane;\n\nnamespace gl\n{\n\nclass selection_state;\n\t\n/**\t\\brief Provides a boilerplate implementation of k3d::gl::irenderable\n\t\\param base_t Must derive from k3d::transformable\n*/\ntemplate<typename base_t>\nclass renderable :\n\tpublic base_t,\n\tpublic irenderable\n{\npublic:\n\trenderable(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_visible(init_owner(*this) + init_name(\"viewport_visible\") + init_label(_(\"Viewport Visible\")) + init_description(_(\"Controls whether this node will be visibile in the viewport.\")) + init_value(true)),\n\t\tm_nurbs_renderer(0)\n\t{\n\t\tm_visible.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\t~renderable()\n\t{\n\t\tif(m_nurbs_renderer)\n\t\t\tgluDeleteNurbsRenderer(m_nurbs_renderer);\n\t}\n\n\tuint_t gl_layer()\n\t{\n\t\treturn 1024;\n\t}\n\n\tvoid gl_draw(const render_state& State)\n\t{\n\t\tif(!m_visible.pipeline_value())\n\t\t\treturn;\n\n\t\tstore_attributes attributes;\n\n\t\tpush_draw();\n\t\ton_gl_draw(State);\n\t\tpop_draw();\n\t}\n\n\tvoid gl_select(const render_state& State, const selection_state& SelectState)\n\t{\n\t\tif(!m_visible.pipeline_value())\n\t\t\treturn;\n\n\t\tstore_attributes attributes;\n\n\t\tpush_draw();\n\t\ton_gl_select(State, SelectState);\n\t\tpop_draw();\n\t}\n\nprotected:\n\tsigc::slot<void, ihint*> make_async_redraw_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &renderable<base_t>::async_redraw);\n\t}\n\n\tvoid async_redraw(ihint*)\n\t{\n\t\tredraw_all(base_t::document(), irender_viewport::ASYNCHRONOUS);\n\t}\n\n\ttypedef GLUnurbsObj* nurbs_renderer_t;\n\tnurbs_renderer_t nurbs_renderer(const render_state& State)\n\t{\n\t\tif(!m_nurbs_renderer)\n\t\t{\n\t\t\tm_nurbs_renderer = gluNewNurbsRenderer();\n\n\t\t\t// Important!  We load our own matrices for efficiency (saves round-trips to the server) and to prevent problems with selection\n\t\t\tgluNurbsProperty(m_nurbs_renderer, GLU_AUTO_LOAD_MATRIX, GL_FALSE);\n\t\t\tgluNurbsProperty(m_nurbs_renderer, GLU_CULLING, GL_TRUE);\n\t\t}\n\n\t\tGLfloat gl_modelview_matrix[16];\n\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\tgluLoadSamplingMatrices(m_nurbs_renderer, gl_modelview_matrix, State.gl_projection_matrix, State.gl_viewport);\n\n\t\treturn m_nurbs_renderer;\n\t}\n\nprotected:\n\t/// Set to true iff the object should be visible in OpenGL viewports\n\tk3d_data(bool, data::immutable_name, data::change_signal, data::with_undo, data::local_storage, data::no_constraint, data::writable_property, data::with_serialization) m_visible;\n\nprivate:\n\tvoid push_draw()\n\t{\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tpush_matrix(base_t::matrix());\n\t}\n\n\tvoid pop_draw()\n\t{\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\t}\n\n\tvirtual void on_gl_draw(const render_state& State) = 0;\n\tvirtual void on_gl_select(const render_state& State, const selection_state& SelectState) = 0;\n\n\t/// OpenGL NURBS renderer\n\tnurbs_renderer_t m_nurbs_renderer;\n};\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_RENDERABLE_GL_H\n\n"
  },
  {
    "path": "k3dsdk/renderable_ri.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/iattribute_property_ri.h>\n#include <k3dsdk/imaterial_ri.h>\n#include <k3dsdk/ioption_property_ri.h>\n#include <k3dsdk/material.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/render_state_ri.h>\n#include <k3dsdk/vectors.h>\n\n#include <boost/array.hpp>\n\n#include <iostream>\n#include <numeric>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// motion_begin\n\nvoid motion_begin(const render_state& State)\n{\n\tif(motion_blur(State))\n\t\tState.stream.RiMotionBeginV(State.sample_times);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// motion_end\n\nvoid motion_end(const render_state& State)\n{\n\tif(motion_blur(State))\n\t\tState.stream.RiMotionEnd();\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// motion_blur\n\nbool motion_blur(const render_state& State)\n{\n\treturn State.sample_times.size() > 1;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// first_sample\n\nbool first_sample(const render_state& State)\n{\n\treturn 0 == State.sample_index;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// last_sample\n\nbool last_sample(const render_state& State)\n{\n\treturn State.sample_index == State.sample_times.size() - 1;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// convert\n\nconst matrix convert(const k3d::matrix4& Matrix)\n{\n\treturn Matrix;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup_material\n\nvoid setup_material(iunknown* const Material, const render_state& State)\n{\n\t// If we can find a RenderMan material, let it do the work ...\n\tif(k3d::ri::imaterial* const ri_material = k3d::material::lookup<k3d::ri::imaterial>(Material))\n\t{\n\t\tri_material->setup_renderman_material(State);\n\t\treturn;\n\t}\n\n\t// Otherwise, we generate a default \"null\" material ...\n\n\t// We only generate RIB on the final sample ...\n\tif(!last_sample(State))\n\t\treturn;\n\n\tState.stream.RiColor(k3d::color(1, 1, 1));\n\tState.stream.RiOpacity(k3d::color(1, 1, 1));\n\tState.stream.RiSurfaceV(path(), \"null\");\n\tState.stream.RiDisplacementV(path(), \"null\");\n\tState.stream.RiAtmosphereV(path(), \"null\");\n\tState.stream.RiInteriorV(path(), \"null\");\n\tState.stream.RiExteriorV(path(), \"null\");\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// set_attributes\n\nvoid set_attributes(iproperty_collection& Properties, istream& Stream)\n{\n\tconst iproperty_collection::properties_t& properties = Properties.properties();\n\n\ttypedef std::map<string_t, parameter_list> parameter_lists_t;\n\tparameter_lists_t parameter_lists;\n\n\tfor(iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t{\n\t\tif(ri::iattribute_property* const attribute_property = dynamic_cast<ri::iattribute_property*>(*property))\n\t\t{\n\t\t\tconst string_t attribute_name = attribute_property->property_attribute_name();\n\t\t\tconst string_t parameter_name = (*property)->property_name();\n\n\t\t\tparameter_lists[attribute_name].push_back(parameter(parameter_name, UNIFORM, 1, (*property)->property_pipeline_value()));\n\t\t}\n\t}\n\n\tfor(parameter_lists_t::iterator parameter_list = parameter_lists.begin(); parameter_list != parameter_lists.end(); ++parameter_list)\n\t\tStream.RiAttributeV(parameter_list->first, parameter_list->second);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// set_options\n\n/// Extracts RenderMan data from a property collection, generating corresponding calls to RiOption()\nvoid set_options(iproperty_collection& Properties, istream& Stream)\n{\n\tconst iproperty_collection::properties_t& properties = Properties.properties();\n\n\ttypedef std::map<string_t, parameter_list> parameter_lists_t;\n\tparameter_lists_t parameter_lists;\n\n\tfor(iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t{\n\t\tif(ri::ioption_property* const option_property = dynamic_cast<ri::ioption_property*>(*property))\n\t\t{\n\t\t\tconst string_t option_name = option_property->property_option_name();\n\t\t\tconst string_t parameter_name = (*property)->property_name();\n\n\t\t\tparameter_lists[option_name].push_back(parameter(parameter_name, UNIFORM, 1, (*property)->property_pipeline_value()));\n\t\t}\n\t}\n\n\tfor(parameter_lists_t::iterator parameter_list = parameter_lists.begin(); parameter_list != parameter_lists.end(); ++parameter_list)\n\t\tStream.RiOptionV(parameter_list->first, parameter_list->second);\n}\n\n} // namespace ri\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/renderable_ri.h",
    "content": "#ifndef K3DSDK_RENDERABLE_RI_H\n#define K3DSDK_RENDERABLE_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/istream_ri.h>\n#include <k3dsdk/irenderable_ri.h>\n#include <k3dsdk/render_state_ri.h>\n\nnamespace k3d\n{\n\nclass idocument;\nclass iproperty_collection;\n\t\nnamespace ri\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// motion_begin\n\n/// Convenience function that opens a RIB motion block iff motion-blur is enabled\nvoid motion_begin(const render_state& State);\n\n/////////////////////////////////////////////////////////////////////////////\n// motion_end\n\n/// Convenience function that closes a RIB motion block iff motion-blur is enabled\nvoid motion_end(const render_state& State);\n\n/////////////////////////////////////////////////////////////////////////////\n// motion_blur\n\n/// Convenience function that returns true iff motion-blurred rendering is enabled\nbool motion_blur(const render_state& State);\n\n/////////////////////////////////////////////////////////////////////////////\n// first_sample\n\n/// Convenience function that returns true iff rendering the first sample in an image\nbool first_sample(const render_state& State);\n\n/////////////////////////////////////////////////////////////////////////////\n// last_sample\n\n/// Convenience function that returns true iff rendering the last sample in an image\nbool last_sample(const render_state& State);\n\n/////////////////////////////////////////////////////////////////////////////\n// convert\n\n/// Converts a k3d::matrix4 into a form usable with RenderMan\nconst matrix convert(const k3d::matrix4& Matrix);\n\n/////////////////////////////////////////////////////////////////////////////\n// setup_material\n\nvoid setup_material(iunknown* const Material, const render_state& State);\n\n/////////////////////////////////////////////////////////////////////////////\n// set_attributes\n\n/// Extracts RenderMan data from a property collection, generating corresponding calls to RiAttribute()\nvoid set_attributes(iproperty_collection& Properties, istream& Engine);\n\n/////////////////////////////////////////////////////////////////////////////\n// set_options\n\n/// Extracts RenderMan data from a property collection, generating corresponding calls to RiOption()\nvoid set_options(iproperty_collection& Properties, istream& Engine);\n\n/////////////////////////////////////////////////////////////////////////////\n// renderable\n\n/// Adds a boilerplate implementation of k3d::ri::irender to a transformable base class, using the parameterized inheritance idiom\ntemplate<typename base_t>\nclass renderable :\n\tpublic base_t,\n\tpublic irenderable\n{\npublic:\n\trenderable(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_render_final(init_owner(*this) + init_name(\"render_final\") + init_label(_(\"Render\")) + init_description(_(\"Controls whether this node will be visible in the final rendered image.\")) + init_value(true)),\n\t\tm_render_shadows(init_owner(*this) + init_name(\"render_shadows\") + init_label(_(\"Render Shadows\")) + init_description(_(\"Controls whether this node will be visible during shadow-map render passes.\")) + init_value(true)),\n\t\tm_motion_blur(init_owner(*this) + init_name(\"motion_blur\") + init_label(_(\"Motion Blur\")) + init_description(\"If enabled, this node will be rendered with motion-blur.\") + init_value(false))\n\t{\n\t}\n\n\tvoid renderman_render(const render_state& State)\n\t{\n\t\t// If this is a normal pass and we're hidden, we're done ...\n\t\tif(State.render_context == FINAL_FRAME && !m_render_final.pipeline_value())\n\t\t\treturn;\n\t\t// If this is a shadow pass and we don't cast shadows, we're done ...\n\t\tif(State.render_context == SHADOW_MAP && !m_render_shadows.pipeline_value())\n\t\t\treturn;\n\n\t\t// If this is the first sample in the frame, reset the sample list ...\n\t\tif(first_sample(State))\n\t\t\tm_motion_blur_samples.clear();\n\n\t\t// Push our current state onto the sample list ...\n\t\tm_motion_blur_samples.push_back(base_t::matrix());\n\n\t\t// Only generate RIB on the last sample ...\n\t\tif(last_sample(State))\n\t\t{\n\t\t\tState.stream.RiAttributeBegin();\n\n\t\t\tif(motion_blur(State) && m_motion_blur.pipeline_value())\n\t\t\t{\n\t\t\t\tState.stream.RiMotionBeginV(State.sample_times);\n\n\t\t\t\tfor(unsigned int i = 0; i < m_motion_blur_samples.size(); ++i)\n\t\t\t\t\tState.stream.RiConcatTransform(convert(m_motion_blur_samples[i]));\n\n\t\t\t\tState.stream.RiMotionEnd();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tState.stream.RiConcatTransform(convert(m_motion_blur_samples.front()));\n\t\t\t}\n\n\t\t\tset_attributes(*this, State.stream);\n\t\t\ton_renderman_render(State);\n\n\t\t\tState.stream.RiAttributeEnd();\n\t\t}\n\t}\n\n\tvoid renderman_render_complete(const render_state& State)\n\t{\n\t\ton_renderman_render_complete(State);\n\t}\n\nprivate:\n\tvirtual void on_renderman_render(const render_state& State) = 0;\n\n\tvirtual void on_renderman_render_complete(const render_state& State)\n\t{\n\t}\n\n\tk3d_data(bool, data::immutable_name, data::change_signal, data::with_undo, data::local_storage, data::no_constraint, data::writable_property, data::with_serialization) m_render_final;\n\tk3d_data(bool, data::immutable_name, data::change_signal, data::with_undo, data::local_storage, data::no_constraint, data::writable_property, data::with_serialization) m_render_shadows;\n\tk3d_data(bool, data::immutable_name, data::change_signal, data::with_undo, data::local_storage, data::no_constraint, data::writable_property, data::with_serialization) m_motion_blur;\n\tstd::vector<k3d::matrix4> m_motion_blur_samples;\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_RENDERABLE_RI_H\n\n"
  },
  {
    "path": "k3dsdk/resolutions.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/resolutions.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/xml.h>\n\nnamespace k3d\n{\n\nconst resolutions_t& resolutions()\n{\n\tstatic resolutions_t results;\n\tif(results.empty())\n\t{\n\t\ttry\n\t\t{\n\t\t\tconst filesystem::path path = share_path() / filesystem::generic_path(\"resolutions.k3d\");\n\t\t\tfilesystem::ifstream stream(path);\n\n\t\t\tk3d::xml::element xml(\"k3dml\");\n\t\t\tstream >> xml;\n\n\t\t\tk3d::xml::element& xml_resolutions = xml.safe_element(\"application\").safe_element(\"resolutions\");\n\n\t\t\tfor(k3d::xml::element::elements_t::iterator xml_resolution = xml_resolutions.children.begin(); xml_resolution != xml_resolutions.children.end(); ++xml_resolution)\n\t\t\t{\n\t\t\t\tif(xml_resolution->name != \"resolution\")\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst std::string name = k3d::xml::attribute_text(*xml_resolution, \"name\");\n\t\t\t\tconst std::string description = k3d::xml::attribute_text(*xml_resolution, \"description\");\n\t\t\t\tconst unsigned long width = k3d::xml::attribute_value<unsigned long>(*xml_resolution, \"width\", 320);\n\t\t\t\tconst unsigned long height = k3d::xml::attribute_value<unsigned long>(*xml_resolution, \"height\", 240);\n\t\t\t\tresults.push_back(resolution(name, description, width, height));\n\t\t\t}\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tlog() << error << k3d_file_reference << \": \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tlog() << error << k3d_file_reference << \": Unknown exception\" << std::endl;\n\t\t}\n\t}\n\n\treturn results;\n}\n\nconst ienumeration_property::enumeration_values_t& resolution_values()\n{\n\tstatic ienumeration_property::enumeration_values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"<Custom>\", \"\", \"Custom resolution\"));\n\t\tconst resolutions_t& resolutions = k3d::resolutions();\n\t\tfor(resolutions_t::const_iterator resolution = resolutions.begin(); resolution != resolutions.end(); ++resolution)\n\t\t{\n\t\t\tconst double ratio = static_cast<double>(resolution->width) / static_cast<double>(resolution->height);\n\t\t\tconst std::string label = string_cast(boost::format(\"%1% (%2%:1)\") % resolution->name % ratio);\n\t\t\tconst std::string value = resolution->name;\n\t\t\tconst std::string description = resolution->description;\n\t\t\tvalues.push_back(ienumeration_property::enumeration_value_t(label, value, description));\n\t\t}\n\t}\n\n\treturn values;\n}\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/resolutions.h",
    "content": "#ifndef K3DSDK_RESOLUTIONS_H\n#define K3DSDK_RESOLUTIONS_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ienumeration_property.h>\n\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Encapsulates a named image resolution\nstruct resolution\n{\n\tresolution(const std::string& Name, const std::string& Description, const unsigned long Width, const unsigned long Height) : name(Name), description(Description), width(Width), height(Height) { }\n\n\tstd::string name;\n\tstd::string description;\n\tunsigned long width;\n\tunsigned long height;\n};\n\n/// Defines a collection of named image resolutions\ntypedef std::vector<resolution> resolutions_t;\n\n/// Returns a list of useful image resolutions\nconst resolutions_t& resolutions();\n/// Returns descriptions of the available resolutions for use with enumeration properties\nconst ienumeration_property::enumeration_values_t& resolution_values();\n\n} // namespace k3d\n\n#endif // !K3DSDK_RESOLUTIONS_H\n\n\n"
  },
  {
    "path": "k3dsdk/resource/CMakeLists.txt",
    "content": "PROJECT(k3dsdk-resource)\n\nFILE(GLOB HEADERS *.h)\nFILE(GLOB SOURCES *.cpp)\n\nLIST(SORT HEADERS)\nLIST(SORT SOURCES)\n\nK3D_ADD_LIBRARY(k3dsdk-resource SHARED ${HEADERS} ${SOURCES})\nK3D_GENERATE_DEF_FILE(k3dsdk-resource)\n\nTARGET_LINK_LIBRARIES(k3dsdk-resource k3dsdk)\n\nINSTALL(TARGETS k3dsdk-resource\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\nINSTALL(FILES ${HEADERS} DESTINATION include/k3d/k3dsdk/resource)\n\n"
  },
  {
    "path": "k3dsdk/resource/resource.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/result.h>\n\n#include <map>\n\nnamespace k3d\n{\n\nnamespace resource\n{\n\n/// Storage for a single resource\nclass record\n{\npublic:\n\trecord(unsigned char* Data, const uint64_t ByteCount) :\n\t\tdata(Data),\n\t\tbyte_count(ByteCount)\n\t{\n\t}\n\n\tunsigned char* const data;\n\tconst uint64_t byte_count;\n};\n\n/// Declares storage for a collection of named resources\ntypedef std::map<string_t, record> records_t;\n\n/// Stores the global collection of named resources\nstatic records_t records;\n\nconst bool_t initialize(const string_t& Path, unsigned char* Data, const uint64_t ByteCount)\n{\n\tif(Path.empty())\n\t{\n\t\tk3d::log() << error << \"cannot initialize resource with empty path\" << std::endl;\n\t\treturn false;\n\t}\n\n\tif(records.count(Path))\n\t{\n\t\tk3d::log() << error << \"cannot initialize resource with duplicate path [\" << Path << \"]\" << std::endl;\n\t\treturn false;\n\t}\n\n\tif(!Data)\n\t{\n\t\tk3d::log() << error << \"cannot initialize resource with NULL data\" << std::endl;\n\t\treturn false;\n\t}\n\n\trecords.insert(std::make_pair(Path, record(Data, ByteCount)));\n\n\treturn true;\n}\n\nconst keys_t keys()\n{\n\tkeys_t result;\n\n\tfor(records_t::const_iterator record = records.begin(); record != records.end(); ++record)\n\t\tresult.push_back(record->first);\n\t\n\treturn result;\n}\n\nconst string_t get_string(const string_t& Path)\n{\n\tif(!records.count(Path))\n\t{\n\t\tk3d::log() << error << \"unknown resource [\" << Path << \"]\" << std::endl;\n\t\treturn string_t();\n\t}\n\tconst record& result = records.find(Path)->second;\n\n\treturn string_t(reinterpret_cast<char*>(result.data), result.byte_count);\n}\n\n} // namespace resource\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/resource/resource.h",
    "content": "#ifndef K3DSDK_RESOURCE_RESOURCE_H\n#define K3DSDK_RESOURCE_RESOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Provides functionality for working with \"resources\" - binary data\n/// that is compiled into executables for easy access.\nnamespace resource\n{\n\n/// Initializes a resource, associating a string key (the Path) with the given data.\nconst bool_t initialize(const string_t& Path, unsigned char* Data, const uint64_t ByteCount);\n\n/// Defines storage for a list of resource keys\ntypedef std::vector<string_t> keys_t;\n/// Returns the current list of resource keys\nconst keys_t keys();\n\n/// Returns a resource as a string (note: it is up to the caller to decide whether this is safe).\n/// Returns empty string if the resource does not exist.\nconst string_t get_string(const string_t& Path);\n\n} // namespace resource\n\n} // namespace k3d\n\n#endif // !K3DSDK_RESOURCE_RESOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/result.h",
    "content": "#ifndef K3DSDK_RESULT_H\n#define K3DSDK_RESULT_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares void and Glib-like assert/return functions\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <iostream>\n\n#define assert_not_reached() \\\n\tdo \\\n\t\t{ \\\n\t\t\tk3d::log() << k3d::error << k3d_file_reference << \": should not be reached\" << std::endl; \\\n\t\t} \\\n\twhile(0)\n\n#define assert_not_implemented() \\\n\tdo \\\n\t\t{ \\\n\t\t\tk3d::log() << k3d::error << k3d_file_reference << \": is not implemented\" << std::endl; \\\n\t\t} \\\n\twhile(0)\n\n#define assert_deprecated() \\\n\tdo \\\n\t\t{ \\\n\t\t\tk3d::log() << k3d::warning << k3d_file_reference << \": is deprecated\" << std::endl; \\\n\t\t} \\\n\twhile(0)\n\n#define assert_critical(expr) \\\n\tdo \\\n\t\t{ \\\n\t\t\tif(!(expr)) \\\n\t\t\t\t{ \\\n\t\t\t\t\tk3d::log() << k3d::critical << k3d_file_reference << \": assertion `\" << #expr << \"' failed\" << std::endl; \\\n\t\t\t\t} \\\n\t\t} \\\n\twhile(0)\n\n#define assert_error(expr) \\\n\tdo \\\n\t\t{ \\\n\t\t\tif(!(expr)) \\\n\t\t\t\t{ \\\n\t\t\t\t\tk3d::log() << k3d::error << k3d_file_reference << \": assertion `\" << #expr << \"' failed\" << std::endl; \\\n\t\t\t\t} \\\n\t\t} \\\n\twhile(0)\n\n#define assert_warning(expr) \\\n\tdo \\\n\t\t{ \\\n\t\t\tif(!(expr)) \\\n\t\t\t\t{ \\\n\t\t\t\t\tk3d::log() << k3d::warning << k3d_file_reference << \": assertion `\" << #expr << \"' failed\" << std::endl; \\\n\t\t\t\t} \\\n\t\t} \\\n\twhile(0)\n\n#define return_if_fail(expr) \\\n\tdo \\\n\t\t{ \\\n\t\t\tif(!(expr)) \\\n\t\t\t\t{ \\\n\t\t\t\t\tk3d::log() << k3d::error << k3d_file_reference << \": assertion `\" << #expr << \"' failed\" << std::endl; \\\n\t\t\t\t\treturn; \\\n\t\t\t\t} \\\n\t\t} \\\n\twhile(0)\n\n#define return_val_if_fail(expr, val) \\\n\tdo \\\n\t\t{ \\\n\t\t\tif(!(expr)) \\\n\t\t\t\t{ \\\n\t\t\t\t\tk3d::log() << k3d::error << k3d_file_reference << \": assertion `\" << #expr << \"' failed\" << std::endl; \\\n\t\t\t\t\treturn val; \\\n\t\t\t\t} \\\n\t\t} \\\n\twhile(0)\n\n#endif // !K3DSDK_RESULT_H\n\n\n"
  },
  {
    "path": "k3dsdk/scalar_source.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/scalar_source.h>\n\nnamespace k3d\n{\n\nscalar_source::scalar_source(iplugin_factory& Factory, idocument& Document, const char* const OutputDescription) :\n\tbase(Factory, Document),\n\tm_output(init_owner(*this) + init_name(\"output\") + init_label(_(\"Output\")) + init_description(OutputDescription) + init_value(0.0))\n{\n\tm_output.set_update_slot(sigc::mem_fun(*this, &scalar_source::execute));\n}\n\nsigc::slot<void, ihint*> scalar_source::make_update_value_slot()\n{\n\treturn m_output.make_slot();\n}\n\nvoid scalar_source::execute(const std::vector<ihint*>& Hints, double_t& Output)\n{\n\ton_update_value(Output);\n}\n\nvoid scalar_source::on_update_value(double_t& Output)\n{\n\tOutput = 0.0;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/scalar_source.h",
    "content": "#ifndef K3DSDK_SCALAR_SOURCE_H\n#define K3DSDK_SCALAR_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/hints.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace k3d\n{\n\n/// Convenience base-class for sources / filters that produce a scalar output value\nclass scalar_source :\n\tpublic node\n{\n\ttypedef node base;\npublic:\n\tscalar_source(iplugin_factory& Factory, idocument& Document, const char* const OutputDescription);\n\n\t/// Returns a slot that should be connected to input properties to signal that the output value has changed.\n\tsigc::slot<void, ihint*> make_update_value_slot();\n\nprivate:\n\t/// Stores the output value\n\tk3d_data(double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_output;\n\n\t/// Called whenever the output value has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, double_t& Output);\n\t/// Override this in derived classes, to return a new / modified value\n\tvirtual void on_update_value(double_t& Output);\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_SCALAR_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/scripted_node.h",
    "content": "#ifndef K3DSDK_SCRIPTED_NODE_H\n#define K3DSDK_SCRIPTED_NODE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/scripting.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\n/// Uses parameterized inheritance to provide a boilerplate implementation for nodes that are controlled by scripts\ntemplate<typename base_t>\nclass scripted_node :\n\tpublic base_t\n{\npublic:\n\tscripted_node(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_script(init_owner(*this) + init_name(\"script\") + init_label(_(\"Script\")) + init_description(_(\"Script source code\")) + init_value<string_t>(\"\")),\n\t\tm_user_property_changed_signal(*this),\n\t\tm_executing(false)\n\t{\n\t\tm_script.changed_signal().connect(sigc::mem_fun(*this, &scripted_node::on_script_changed));\n\t}\n\nprotected:\n\tvoid set_script(const string_t& Script)\n\t{\n\t\tm_script.set_value(Script);\n\t}\n\n\tvoid connect_script_changed_signal(const sigc::slot<void, ihint*>& Slot)\n\t{\n\t\tm_script.changed_signal().connect(Slot);\n\t\tm_user_property_changed_signal.connect(Slot);\n\t}\n\n\tbool execute_script(iscript_engine::context& Context)\n\t{\n\t\tif(m_executing) // prevent recursion when writing properties in the script (infinite loop!)\n\t\t\treturn true;\n\n\t\texecute_lock lock(m_executing);\n\n\t\tconst script::code code(m_script.pipeline_value());\n\t\tif(!m_script_engine)\n\t\t{\n\t\t\tconst script::language language(code);\n\t\t\treturn_val_if_fail(language.factory(), false);\n\n\t\t\tm_script_engine.reset(plugin::create<iscript_engine>(language.factory()->factory_id()));\n\t\t\treturn_val_if_fail(m_script_engine, false);\n\t\t}\n\n\t\treturn m_script_engine->execute(base_t::name() + \"Script\", code.source(), Context);\n\t}\n\nprivate:\n\t/// RAII helper class that keeps track of whether we're executing, so we can avoid recursive loops.\n\tclass execute_lock\n\t{\n\tpublic:\n\t\texecute_lock(bool_t& Executing) :\n\t\t\texecuting(Executing)\n\t\t{\n\t\t\texecuting = true;\n\t\t}\n\n\t\t~execute_lock()\n\t\t{\n\t\t\texecuting = false;\n\t\t}\n\n\tprivate:\n\t\tbool_t& executing;\n\t};\n\n\tvoid on_script_changed(ihint* hint)\n\t{\n\t\tm_script_engine.reset();\n\t}\n\n\tk3d_data(string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, script_property, with_serialization) m_script;\n\tboost::scoped_ptr<iscript_engine> m_script_engine;\n\tuser_property_changed_signal m_user_property_changed_signal;\n\tbool m_executing;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_SCRIPTED_NODE_H\n\n"
  },
  {
    "path": "k3dsdk/scripted_plugin.h",
    "content": "#ifndef K3DSDK_SCRIPTED_PLUGIN_H\n#define K3DSDK_SCRIPTED_PLUGIN_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/scripting.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\n/// Convenience class for application plugins that need to call scripts\ntemplate<typename base_t>\nclass scripted_plugin :\n\tpublic base_t\n{\npublic:\n\tscripted_plugin() :\n\t\tm_script(init_owner(*this) + init_name(\"script\") + init_label(_(\"Script\")) + init_description(_(\"Script source code\")) + init_value<string_t>(\"\"))\n\t{\n\t\tm_script.changed_signal().connect(sigc::mem_fun(*this, &scripted_plugin::on_script_changed));\n\t}\n\nprotected:\n\tvoid set_script(const string_t& Script)\n\t{\n\t\tm_script.set_value(Script);\n\t}\n\n\tbool execute_script(iscript_engine::context& Context)\n\t{\n\t\tconst script::code code(m_script.pipeline_value());\n\n\t\tif(!m_script_engine)\n\t\t{\n\t\t\t// Examine the script to determine the correct language ...\n\t\t\tconst script::language language(code);\n\n\t\t\treturn_val_if_fail(language.factory(), false);\n\n\t\t\t// Create our script engine as-needed ...\n\t\t\tm_script_engine.reset(plugin::create<iscript_engine>(language.factory()->factory_id()));\n\n\t\t\t// No script engine?  We're outta here ...\n\t\t\treturn_val_if_fail(m_script_engine, false);\n\t\t}\n\n\t\t// Execute that bad-boy!\n\t\treturn m_script_engine->execute(\"Script\", code.source(), Context);\n\t}\n\nprivate:\n\tvoid on_script_changed(iunknown* hint)\n\t{\n\t\tm_script_engine.reset();\n\t}\n\n\tk3d_data(string_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, script_property, no_serialization) m_script;\n\tboost::scoped_ptr<iscript_engine> m_script_engine;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_SCRIPTED_PLUGIN_H\n\n"
  },
  {
    "path": "k3dsdk/scripting.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iapplication_plugin_factory.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/mime_types.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/scripting.h>\n#include <k3dsdk/uuid.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <sstream>\n#include <typeinfo>\n\nnamespace k3d\n{\n\nnamespace script\n{\n\nnamespace detail\n{\n\n/// Executes a script using the given plugin factory to create the script engine\nbool execute_script(const code& Script, const string_t& ScriptName, iscript_engine::context& Context, const language& Language)\n{\n\treturn_val_if_fail(ScriptName.size(), false);\n\treturn_val_if_fail(Language.factory(), false);\n\n\t// Get the requested scripting engine ...\n\tboost::scoped_ptr<iscript_engine> engine(plugin::create<iscript_engine>(*Language.factory()));\n\treturn_val_if_fail(engine, false);\n\n\t// Run that bad-boy ...\n\tconst bool result = engine->execute(ScriptName, Script.source(), Context);\n\n\treturn result;\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////////\n// code\n\ncode::code(const string_t& Source) :\n\tm_buffer(Source)\n{\n}\n\ncode::code(std::istream& Source)\n{\n\tstd::stringstream temp;\n\ttemp << Source.rdbuf();\n\n\tm_buffer = temp.str();\n}\n\ncode::code(std::istringstream& Source) :\n\tm_buffer(Source.str())\n{\n}\n\ncode::code(std::stringstream& Source) :\n\tm_buffer(Source.str())\n{\n}\n\nconst string_t& code::source() const\n{\n\treturn m_buffer;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// language\n\nlanguage::language(const filesystem::path& Script) :\n\tm_factory(0)\n{\n\t// Get the MIME type of the code ...\n\tconst mime::type mime_type = mime::type::lookup(Script);\n\tif(mime_type.empty())\n\t\treturn;\n\n\t// Get the set of script engine factories that handle this MIME type ...\n\tconst plugin::factory::collection_t factories = plugin::factory::lookup<iscript_engine>(mime_type);\n\tif(factories.size() != 1)\n\t\treturn;\n\n\tm_factory = *factories.begin();\n}\n\nlanguage::language(const code& Script) :\n\tm_factory(0)\n{\n\t// Get the MIME type of the code ...\n\tconst mime::type mime_type = mime::type::lookup(Script.source());\n\tif(mime_type.empty())\n\t\treturn;\n\n\t// Get the set of script engine factories that handle this MIME type ...\n\tconst plugin::factory::collection_t factories = plugin::factory::lookup<iscript_engine>(mime_type);\n\tif(factories.size() != 1)\n\t\treturn;\n\n\tm_factory = *factories.begin();\n}\n\nlanguage::language(const mime::type& Type)\n{\n\t// Get the set of script engine factories that handle this MIME type ...\n\tconst plugin::factory::collection_t factories = plugin::factory::lookup<iscript_engine>(Type);\n\tif(factories.size() != 1)\n\t\treturn;\n\n\tm_factory = *factories.begin();\n}\n\nlanguage::language(const uuid& Language) :\n\tm_factory(plugin::factory::lookup(Language))\n{\n}\n\nlanguage::language(iplugin_factory& Language) :\n\tm_factory(&Language)\n{\n}\n\niplugin_factory* language::factory() const\n{\n\treturn m_factory;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// execute\n\nbool execute(const code& Script, const string_t& ScriptName, iscript_engine::context& Context, const language& Language)\n{\n\treturn detail::execute_script(Script, ScriptName, Context, Language);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// execute\n\nvoid execute(const code& Script, const string_t& ScriptName, iscript_engine::context& Context, bool& Recognized, bool& Executed)\n{\n\t// Starting state ...\n\tRecognized = false;\n\tExecuted = false;\n\n\t// See which language it's written in ...\n\tlanguage detected_language(Script);\n\n\t// If the language wasn't recognized, we're done ...\n\tRecognized = detected_language.factory() ? true : false;\n\tif(!Recognized)\n\t\treturn;\n\n\t// Execute that puppy ...\n\tExecuted = detail::execute_script(Script, ScriptName, Context, detected_language);\n}\n\n} // namespace script\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/scripting.h",
    "content": "#ifndef K3DSDK_SCRIPTING_H\n#define K3DSDK_SCRIPTING_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/types.h>\n\n#include <iosfwd>\n\nnamespace k3d\n{\n\nclass iplugin_factory;\nclass uuid;\n\nnamespace filesystem { class path; }\nnamespace mime { class type; }\n\nnamespace script\n{\n\n/// Helper class that converts various forms of input into script code that can be executed\nclass code\n{\npublic:\n\t/// Script code is stored as a string\n\tcode(const string_t& Source);\n\t/// Script code is stored as an input stream\n\tcode(std::istream& Source);\n\t/// Script code is stored in a string stream\n\tcode(std::istringstream& Source);\n\t/// Script code is stored in a string stream\n\tcode(std::stringstream& Source);\n\n\t/// Returns the stored script source code\n\tconst string_t& source() const;\n\nprivate:\n\tstring_t m_buffer;\n};\n\n/// Helper class that converts various forms of input into an identifiable script language\nclass language\n{\npublic:\n\t/// Determine scripting language from a filesystem path\n\tlanguage(const filesystem::path& Script);\n\t/// Determine the scripting language from the script sources\n\tlanguage(const code& Script);\n\t/// Determine the scripting language from a MIME type\n\tlanguage(const mime::type& Type);\n\t/// Specify the scripting language directly\n\tlanguage(const uuid& Language);\n\t/// Specify the scripting language directly\n\tlanguage(iplugin_factory& Language);\n\n\t/// Returns the plugin factory that corresponds with the given scripting language\n\tiplugin_factory* factory() const;\n\nprivate:\n\tiplugin_factory* m_factory;\n};\n\n/// Executes a script using an explicitly-specified language\nbool execute(const code& Script, const string_t& ScriptName, iscript_engine::context& Context, const language& Language);\n/// Executes a script, attempting to automatically recognize the language\nvoid execute(const code& Script, const string_t& ScriptName, iscript_engine::context& Context, bool& Recognized, bool& Executed);\n\n} // namespace script\n\n} // namespace k3d\n\n#endif // !K3DSDK_SCRIPTING_H\n\n"
  },
  {
    "path": "k3dsdk/selectable.h",
    "content": "#ifndef K3DSDK_SELECTABLE_H\n#define K3DSDK_SELECTABLE_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/iselectable.h>\n\nnamespace k3d\n{\n\n/// Provides a boilerplate implementation of k3d::iselectable\n/** \\deprecated Get rid of this once k3d::legacy::mesh is gone */\nclass selectable :\n\tpublic iselectable\n{\npublic:\n\tselectable() :\n\t\tselection_weight(0.0)\n\t{\n\t}\n\n\tdouble get_selection_weight()\n\t{\n\t\treturn selection_weight;\n\t}\n\n\tvoid set_selection_weight(const double Weight)\n\t{\n\t\tselection_weight = Weight;\n\t}\n\n\tdouble selection_weight;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_SELECTABLE_H\n\n\n"
  },
  {
    "path": "k3dsdk/selection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/persistent_lookup.h>\n#include <k3dsdk/selection.h>\n\nnamespace k3d\n{\n\nnamespace selection\n{\n\nnamespace detail\n{\n\npersistent_lookup node_lookup;\n\n} // namespace detail\n\nstd::ostream& operator<<(std::ostream& Stream, const type& RHS)\n{\n\tswitch(RHS)\n\t{\n\t\tcase NONE:\n\t\t\tStream << \"none\";\n\t\t\tbreak;\n\t\tcase NODE:\n\t\t\tStream << \"node\";\n\t\t\tbreak;\n\t\tcase MESH:\n\t\t\tStream << \"mesh\";\n\t\t\tbreak;\n\t\tcase USER1:\n\t\t\tStream << \"user1\";\n\t\t\tbreak;\n\t\tcase PRIMITIVE:\n\t\t\tStream << \"primitive\";\n\t\t\tbreak;\n\t\tcase CONSTANT:\n\t\t\tStream << \"constant\";\n\t\t\tbreak;\n\t\tcase SURFACE:\n\t\t\tStream << \"surface\";\n\t\t\tbreak;\n\t\tcase PARAMETER:\n\t\t\tStream << \"parameter\";\n\t\t\tbreak;\n\t\tcase EDGE:\n\t\t\tStream << \"edge\";\n\t\t\tbreak;\n\t\tcase POINT:\n\t\t\tStream << \"point\";\n\t\t\tbreak;\n\t\tcase CURVE:\n\t\t\tStream << \"curve\";\n\t\t\tbreak;\n\t\tcase FACE:\n\t\t\tStream << \"face\";\n\t\t\tbreak;\n\t\tcase PATCH:\n\t\t\tStream << \"patch\";\n\t\t\tbreak;\n\t\tcase VERTEX:\n\t\t\tStream << \"vertex\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t// Note: we coerce the type here to prevent an infinite loop!\n\t\t\tlog() << error << k3d_file_reference << \": unknown selection type: \" << int(RHS) << std::endl;\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, type& RHS)\n{\n\tstd::string buffer;\n\tStream >> buffer;\n\n\tif(buffer == \"none\")\n\t\tRHS = NONE;\n\telse if(buffer == \"node\")\n\t\tRHS = NODE;\n\telse if(buffer == \"mesh\")\n\t\tRHS = MESH;\n\telse if(buffer == \"user1\")\n\t\tRHS = USER1;\n\telse if(buffer == \"primitive\")\n\t\tRHS = PRIMITIVE;\n\telse if(buffer == \"constant\")\n\t\tRHS = CONSTANT;\n\telse if(buffer == \"surface\")\n\t\tRHS = SURFACE;\n\telse if(buffer == \"parameter\")\n\t\tRHS = PARAMETER;\n\telse if(buffer == \"edge\")\n\t\tRHS = EDGE;\n\telse if(buffer == \"point\")\n\t\tRHS = POINT;\n\telse if(buffer == \"curve\")\n\t\tRHS = CURVE;\n\telse if(buffer == \"face\")\n\t\tRHS = FACE;\n\telse if(buffer == \"patch\")\n\t\tRHS = PATCH;\n\telse if(buffer == \"vertex\")\n\t\tRHS = VERTEX;\n\telse\n\t\tlog() << error << k3d_file_reference << \": could not extract value [\" << buffer << \"]\" << std::endl;\n\n\treturn Stream;\n}\n\nid null_id()\n{\n\treturn static_cast<id>(-1);\n}\n\ntoken::token() :\n\ttype(NONE),\n\tid(null_id())\n{\n}\n\n/////////////////////////////////////////////////////////////////\n// token\n\ntoken::token(const selection::type Type, const selection::id ID) :\n\ttype(Type),\n\tid(ID)\n{\n}\n\nbool operator==(const token& LHS, const token& RHS)\n{\n\treturn LHS.type == RHS.type && LHS.id == RHS.id;\n}\n\nbool operator!=(const token& LHS, const token& RHS)\n{\n\treturn !(LHS == RHS);\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const token& RHS)\n{\n\tStream << RHS.type << \" \" << RHS.id;\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, token& RHS)\n{\n\tStream >> RHS.type >> RHS.id;\n\treturn Stream;\n}\n\n/////////////////////////////////////////////////////////////////\n// record\n\nrecord::record() :\n\tzmin(0),\n\tzmax(0)\n{\n}\n\nconst record record::empty_record()\n{\n\treturn record();\n}\n\nbool record::empty() const\n{\n\treturn tokens.empty();\n}\n\nid record::get_id(const type Type) const\n{\n\tfor(tokens_t::const_iterator token = tokens.begin(); token != tokens.end(); ++token)\n\t{\n\t\tif(token->type == Type)\n\t\t\treturn token->id;\n\t}\n\n\treturn null_id();\n}\n\nconst token record::get_token(const type Type) const\n{\n\tfor(tokens_t::const_iterator token = tokens.begin(); token != tokens.end(); ++token)\n\t{\n\t\tif(token->type == Type)\n\t\t\treturn *token;\n\t}\n\n\treturn token();\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const record& RHS)\n{\n\tStream << \"zmin: \" << RHS.zmin << \" zmax: \" << RHS.zmax << \" \";\n\tstd::copy(RHS.tokens.begin(), RHS.tokens.end(), std::ostream_iterator<token>(Stream, \" \"));\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, record& RHS)\n{\n\tsize_t count = 0;\n\n\tStream >> RHS.zmin >> RHS.zmax >> count;\n\n\tselection::token token;\n\twhile(Stream && count)\n\t{\n\t\tStream >> token;\n\t\tRHS.tokens.push_back(token);\n\t\t--count;\n\t}\n\n\treturn Stream;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n// make_record\n\nconst record make_record(inode* Node)\n{\n\trecord result;\n\tresult.zmin = 0;\n\tresult.zmax = 0;\n\n\tresult.tokens.push_back(token(NODE, detail::node_lookup.lookup_id(Node)));\n\n\treturn result;\n}\n\n///////////////////////////////////////////////////////////////////////////////////\n// get_node\n\ninode* get_node(const record& Record)\n{\n\tconst selection::id id = Record.get_id(NODE);\n\tif(id != null_id())\n\t\treturn dynamic_cast<inode*>(k3d::selection::detail::node_lookup.lookup_object(id));\n\n\treturn 0;\n}\n\n/*\n///////////////////////////////////////////////////////////////////////////////////\n// get_mesh\n\nmesh* get_mesh(const record& Record)\n{\n\tinode* const node = get_node(Record);\n\tif(!node)\n\t\treturn 0;\n\n\tconst selection::id id = Record.get_id(MESH);\n\treturn_val_if_fail(id == 0, 0); // Should never get a node with more than one mesh!\n\n\timesh_source* const mesh_source = dynamic_cast<imesh_source*>(node);\n\treturn_val_if_fail(mesh_source, 0);\n\n\treturn boost::any_cast<k3d::mesh*>(mesh_source->mesh_source_output().property_internal_value());\n}\n\n///////////////////////////////////////////////////////////////////////////////////\n// get_mesh\n\nconst mesh::primitive* get_primitive(const record& Record)\n{\n\tconst mesh* const m = get_mesh(Record);\n\tif(!mesh)\n\t\treturn 0;\n\n\tconst selection::id primitive_id = Record.get_id(PRIMITIVE);\n\tif(primitive_id == null_id())\n\t\treturn 0;\n\n\tprimitive_id = token->id;\n\treturn_val_if_fail(mesh, 0);\n\treturn_val_if_fail(primitive_id < mesh->primitives.size(), 0);\n\treturn mesh->primitives[primitive_id].get();\n}\n*/\n\n} // namespace selection\n\nnamespace gl\n{\n\n///////////////////////////////////////////////////////////////////////////////////\n// push_selection_token\n\nvoid push_selection_token(inode* Node)\n{\n\t::glPushName(selection::NODE);\n\t::glPushName(k3d::selection::detail::node_lookup.lookup_id(Node));\n}\n\n///////////////////////////////////////////////////////////////////////////////////\n// push_selection_token\n\nvoid push_selection_token(const selection::token& Token)\n{\n\t::glPushName(Token.type);\n\t::glPushName(Token.id);\n}\n\n///////////////////////////////////////////////////////////////////////////////////\n// push_selection_token\n\nvoid push_selection_token(const selection::type Type, const selection::id ID)\n{\n\t::glPushName(Type);\n\t::glPushName(ID);\n}\n\n///////////////////////////////////////////////////////////////////////////////////\n// pop_selection_token\n\nvoid pop_selection_token()\n{\n\t::glPopName();\n\t::glPopName();\n}\n\n} // namespace gl\n\nnamespace selection\n{\n\n////////////////////////////////////////////////////////////////////////////////////\n// storage\n\nstorage::storage()\n{\n}\n\nstorage::storage(const string_t& Type) :\n\ttype(Type)\n{\n}\n\nvoid storage::difference(const storage& Other, difference::accumulator& Result) const\n{\n\tk3d::difference::test(type, Other.type, Result);\n\tk3d::difference::test(structure, Other.structure, Result);\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const storage& RHS)\n{\n\tStream << standard_indent << \"type: \\\"\" << RHS.type << \"\\\"\\n\";\n\tStream << standard_indent << \"structure (\" << RHS.structure.size() << \"):\\n\";\n\tStream << push_indent << RHS.structure << pop_indent;\n\n\treturn Stream;\n}\n\n////////////////////////////////////////////////////////////////////////////////////\n// set\n\nstorage& set::create(const string_t& Type)\n{\n\tpush_back(pipeline_data<storage>());\n\treturn back().create(new storage(Type));\n}\n\nvoid set::difference(const set& Other, difference::accumulator& Result) const\n{\n\tconst set& self = *this;\n\n\tResult.exact(self.size() == Other.size());\n\n\tfor(uint_t i = 0; i != self.size() && i != Other.size(); ++i)\n\t\tk3d::difference::test(*self[i], *Other[i], Result);\n}\n\nvoid set::append(const set& Source, set& Target)\n{\n\tTarget.insert(Target.end(), Source.begin(), Source.end());\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const set& RHS)\n{\n\tfor(set::const_iterator storage = RHS.begin(); storage != RHS.end(); ++storage)\n\t{\n\t\tStream << standard_indent << \"storage:\\n\";\n\t\tStream << push_indent << **storage << pop_indent;\n\t}\n\n\treturn Stream;\n}\n\n} // namespace selection\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/selection.h",
    "content": "#ifndef K3DSDK_SELECTION_H\n#define K3DSDK_SELECTION_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/gl.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/inode_selection.h>\n#include <k3dsdk/ipersistent.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/named_arrays.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/serialization_xml.h>\n#include <k3dsdk/xml.h>\n\n#include <vector>\n\nnamespace k3d\n{\n\nclass inode;\n\n/// Functor object for deciding whether an object is selected (i.e. has a non-zero selection weight)\nstruct is_selected\n{\n\ttemplate<typename T>\n\tbool operator()(T* Object)\n\t{\n\t\treturn Object->selection_weight != 0 ? true : false;\n\t}\n\n\ttemplate<typename T>\n\tbool operator()(T& Object)\n\t{\n\t\treturn Object.selection_weight != 0 ? true : false;\n\t}\n};\n\nnamespace selection\n{\n\nenum type\n{\n\n/** \\note Never alter the values of these enumerations, they may be used for efficient serialization */\n\n/// Used to mark \"NULL\" tokens\nNONE = 0,\n/// Storage for a zero-based node index (relative to the document node collection)\nNODE = 1,\n/// Storage for a zero-based mesh index (relative to a node)\nMESH = 2,\n/// Storage for a user-defined index\nUSER1 = 24,\n/// Storage for a zero-based primitive index (relative to a mesh)\nPRIMITIVE = 25,\n/// Storage for a zero-based constant index (relative to a primitive)\nCONSTANT = 26,\n/// Storage for a zero-based surface index (relative to a primitive)\nSURFACE = 27,\n/// Storage for a zero-based parameter corner index (relative to a primitive)\nPARAMETER = 28,\n/// Storage for a zero-based split-edge index (relative to a primitive)\nEDGE = 30,\n/// Storage for a zero-based point index (relative to a mesh)\nPOINT = 31,\n/// Storage for a zero-based curve index (relative to a primitive)\nCURVE = 32,\n/// Storage for a zero-based face index (relative to a primitive)\nFACE = 33,\n/// Storage for a zero-based patch index (relative to a primitive)\nPATCH = 34,\n/// Storage for a zero-based vertex index (relative to a primitive)\nVERTEX = 35,\n\n};\n\nstd::ostream& operator<<(std::ostream& Stream, const type& RHS);\nstd::istream& operator>>(std::istream& Stream, type& RHS);\n\ntypedef GLuint id;\nid null_id();\n\nstruct token\n{\n\ttoken();\n\ttoken(const selection::type Type, const selection::id ID);\n\n\tselection::type type;\n\tselection::id id;\n};\n\nbool operator==(const token& LHS, const token& RHS);\nbool operator!=(const token& LHS, const token& RHS);\nstd::ostream& operator<<(std::ostream& Stream, const token& RHS);\nstd::istream& operator>>(std::istream& Stream, token& RHS);\n\nstruct record\n{\n\trecord();\n\tstatic const record empty_record();\n\n\tbool empty() const;\n\tid get_id(const selection::type Type) const;\n\tconst token get_token(const selection::type Type) const;\n\n\tGLuint zmin;\n\tGLuint zmax;\n\n\ttypedef std::vector<token> tokens_t;\n\ttokens_t tokens;\n};\nstd::ostream& operator<<(std::ostream& Stream, const record& RHS);\nstd::istream& operator>>(std::istream& Stream, record& RHS);\n\ntypedef std::vector<record> records;\n\nconst record make_record(inode*);\n\ninode* get_node(const record& Record);\n\ntemplate<typename T>\nbool is_selected(T* Object)\n{\n\tiselectable* const selectable = dynamic_cast<iselectable*>(Object);\n\treturn selectable && selectable->get_selection_weight();\n}\n\n/// Functor object for setting selection weight on a collection of objects - good with k3d::for_each_component\nstruct set_weight\n{\n\tset_weight(const double SelectionWeight) :\n\t\tselection_weight(SelectionWeight)\n\t{\n\t}\n\n\ttemplate<typename T>\n\tvoid operator()(T& Object) const\n\t{\n\t\tObject.selection_weight = selection_weight;\n\t}\n\n\ttemplate<typename T>\n\tvoid operator()(T* Object) const\n\t{\n\t\tObject->selection_weight = selection_weight;\n\t}\n\n\tdouble selection_weight;\n};\n\n} // namespace selection\n\nnamespace gl\n{\n\nvoid push_selection_token(inode*);\nvoid push_selection_token(const selection::token&);\nvoid push_selection_token(const selection::type, const selection::id);\n\nvoid pop_selection_token();\n\n} // namespace gl\n\nnamespace selection\n{\n\n/// Defines storage for a generic selection.\nclass storage\n{\npublic:\n\tstorage();\n\tstorage(const string_t& Type);\n\n\t/// Stores the selection type (\"point\", \"component\", \"parameter\", etc).\n\tstring_t type;\n\t/// Stores array data that defines the selection.\n\tnamed_arrays structure;\n\n\t/// Returns the difference between two selections using the fuzzy semantics of k3d::difference::test().\n\tvoid difference(const storage& Other, difference::accumulator& Result) const;\n};\n\n/// Stream serialization\nstd::ostream& operator<<(std::ostream& Stream, const storage& RHS);\n\n/// Defines a container of selection::storage objects\nclass set :\n\tpublic std::vector<pipeline_data<storage> >\n{\npublic:\n\t/// Create a new selection, appending it to the collection.\n\tstorage& create(const string_t& Type);\n\n\t/// Returns the difference between two selection sets using the fuzzy semantics of k3d::difference::test().\n\tvoid difference(const set& Other, difference::accumulator& Result) const;\n\n\t/// Combines two selection sets by appending one to another.\n\tstatic void append(const set& Source, set& Target);\n};\n\n/// Stream serialization\nstd::ostream& operator<<(std::ostream& Stream, const set& RHS);\n\n} // namespace selection\n\nnamespace difference\n{\n\n/// Specialization of difference::test for k3d::selection::storage\ninline void test(const k3d::selection::storage& A, const k3d::selection::storage& B, accumulator& Result)\n{\n\tA.difference(B, Result);\n}\n\n/// Specialization of difference::test for k3d::selection::set\ninline void test(const k3d::selection::set& A, const k3d::selection::set& B, accumulator& Result)\n{\n\tA.difference(B, Result);\n}\n\n} // namespace difference\n\n/////////////////////////////////////////////////////////////////////////////\n// selection_set_serialization\n\n/// k3d::data serialization policy for use with k3d::selection.\ntemplate<typename value_t, class property_policy_t>\nclass selection_set_serialization :\n\tpublic property_policy_t,\n\tpublic ipersistent\n{\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context& Context)\n\t{\n\t\txml::element& xml_property = Element.append(xml::element(\"property\", xml::attribute(\"name\", property_policy_t::name())));\n\t\txml::save(property_policy_t::internal_value(), xml_property, Context);\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context)\n\t{\n\t\txml::load(property_policy_t::internal_value(), Element, Context);\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tselection_set_serialization(const init_t& Init) :\n\t\tproperty_policy_t(Init)\n\t{\n\t\tInit.owner().enable_serialization(Init.name(), *this);\n\t}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_SELECTION_H\n\n"
  },
  {
    "path": "k3dsdk/selection_state_gl.h",
    "content": "#ifndef K3DSDK_SELECTION_STATE_GL_H\n#define K3DSDK_SELECTION_STATE_GL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/selection.h>\n#include <set>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\n/// Used to pass selection-related state to OpenGL painters.\nclass selection_state\n{\npublic:\n\tselection_state() :\n\t\texclude_unselected_nodes(false),\n\t\tselect_backfacing(false)\n\t{\n\t}\n\n\tbool_t exclude_unselected_nodes;\n\tbool_t select_backfacing;\n\tstd::set<selection::type> select_component;\n};\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_SELECTION_STATE_GL_H\n\n"
  },
  {
    "path": "k3dsdk/selection_validation.h",
    "content": "#ifndef K3DSDK_SELECTION_VALIDATION_H\n#define K3DSDK_SELECTION_VALIDATION_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/selection.h>\n\n#include <sstream>\n#include <stdexcept>\n\nnamespace k3d\n{\n\n//@{\n\n/// Helper methods for use with in selection storage validate() functions only!\n\n/// Tests storage to verify that it contains an array with given name and type, throws an exception otherwise.\ntemplate<typename ArrayT>\nconst ArrayT& require_array(const selection::storage& Storage, const string_t& Name)\n{\n\tconst ArrayT* const array = Storage.structure.lookup<ArrayT>(Name);\n\n\tif(!array)\n\t\tthrow std::runtime_error(\"[\" + Storage.type + \"] primitive missing array [\" + Name + \"]\");\n\n\treturn *array;\n}\n\n/// Tests storage to verify that it contains an array with given name and type, throws an exception otherwise.\ntemplate<typename ArrayT>\nArrayT& require_array(selection::storage& Storage, const string_t& Name)\n{\n\tArrayT* const array = Storage.structure.writable<ArrayT>(Name);\n\n\tif(!array)\n\t\tthrow std::runtime_error(\"[\" + Storage.type + \"] selection missing array [\" + Name + \"]\");\n\n\treturn *array;\n}\n\n/// Tests storage to verify that it matches the given length, throws an exception otherwise.\ntemplate<typename ArrayT>\nvoid require_array_size(const selection::storage& Storage, const ArrayT& Array, const string_t& ArrayName, const uint_t Reference)\n{\n\tif(Array.size() != Reference)\n\t{\n\t\tstd::ostringstream buffer;\n\t\tbuffer << \"[\" << Storage.type << \"] selection [\" << ArrayName << \"] incorrect array length [\" << Array.size() << \"], expected [\" << Reference << \"]\";\n\t\tthrow std::runtime_error(buffer.str());\n\t}\n}\n\n//@}\n\n} // namespace k3d\n\n#endif // !K3DSDK_SELECTION_VALIDATION_H\n\n"
  },
  {
    "path": "k3dsdk/serialization_xml.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/array.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/imetadata.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/inode_selection.h>\n#include <k3dsdk/ipersistent_lookup.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/named_array_types.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/serialization_xml.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/types_ri.h>\n#include <k3dsdk/xml.h>\n#include <k3dsdk/xpath.h>\n\n#include <boost/lexical_cast.hpp>\n#include <boost/mpl/for_each.hpp>\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace xml\n{\n\nnamespace detail\n{\n\n////////////////////////////////////////////////////////////////////////////////////\n// save_dependencies\n\nclass save_dependencies\n{\npublic:\n\ttypedef std::map<iproperty*, inode*> map_t;\n\n\tsave_dependencies(map_t& Map, element& Element, const ipersistent::save_context& Context) :\n\t\tm_map(Map),\n\t\tm_element(Element),\n\t\tm_context(Context)\n\t{\n\t}\n\n\tvoid operator()(const ipipeline::dependency_t& Dependency)\n\t{\n\t\t// Sanity checks ...\n\t\tiproperty* const from_property = Dependency.second;\n\t\tif(!from_property)\n\t\t\treturn;\n\t\tinode* const from_node = m_map[from_property];\n\t\treturn_if_fail(from_node);\n\n\t\tiproperty* const to_property = Dependency.first;\n\t\treturn_if_fail(to_property);\n\t\tinode* const to_node = m_map[to_property];\n\t\treturn_if_fail(to_node);\n\n\t\tm_element.append(\n\t\t\telement(\"dependency\",\n\t\t\t\tattribute(\"from_node\", m_context.lookup.lookup_id(from_node)),\n\t\t\t\tattribute(\"from_property\", from_property->property_name()),\n\t\t\t\tattribute(\"to_node\", m_context.lookup.lookup_id(to_node)),\n\t\t\t\tattribute(\"to_property\", to_property->property_name())));\n\t}\n\nprivate:\n\tmap_t& m_map;\n\telement& m_element;\n\tconst ipersistent::save_context& m_context;\n};\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n// load_dependencies\n\nclass load_dependencies\n{\npublic:\n\tload_dependencies(ipipeline::dependencies_t& Dependencies, const ipersistent::load_context& Context) :\n\t\tm_dependencies(Dependencies),\n\t\tm_context(Context)\n\t{\n\t}\n\n\tvoid operator()(const element& Dependency)\n\t{\n\t\tif(\"dependency\" != Dependency.name)\n\t\t\treturn;\n\n\t\tipersistent_lookup::id_type from_node_id = attribute_value<ipersistent_lookup::id_type>(Dependency, \"from_node\", 0);\n\t\tif(!from_node_id)\n\t\t\tfrom_node_id = attribute_value<ipersistent_lookup::id_type>(Dependency, \"from_object\", 0);\n\t\treturn_if_fail(from_node_id);\n\n\t\tinode* const from_node = dynamic_cast<inode*>(m_context.lookup.lookup_object(from_node_id));\n\t\tif(!from_node)\n\t\t{\n\t\t\tlog() << error << \"Missing dependency source node [\" << from_node_id << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tconst string_t from_property_name = attribute_text(Dependency, \"from_property\");\n\t\treturn_if_fail(from_property_name.size());\n\t\tiproperty* const from_property = property::get(*from_node, from_property_name);\n\t\tif(!from_property)\n\t\t{\n\t\t\tlog() << error << \"Missing dependency source property [\" << from_node->name() << \".\" << from_property_name << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tipersistent_lookup::id_type to_node_id = attribute_value<ipersistent_lookup::id_type>(Dependency, \"to_node\", 0);\n\t\tif(!to_node_id)\n\t\t\tto_node_id = attribute_value<ipersistent_lookup::id_type>(Dependency, \"to_object\", 0);\n\t\treturn_if_fail(to_node_id);\n\n\t\tinode* const to_node = dynamic_cast<inode*>(m_context.lookup.lookup_object(to_node_id));\n\t\tif(!to_node)\n\t\t{\n\t\t\tlog() << error << \"Missing dependency target node [\" << to_node_id << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tconst string_t to_property_name = attribute_text(Dependency, \"to_property\");\n\t\treturn_if_fail(to_property_name.size());\n\t\tiproperty* const to_property = property::get(*to_node, to_property_name);\n\t\tif(!to_property)\n\t\t{\n\t\t\tlog() << error << \"Missing dependency target property [\" << to_node->name() << \".\" << to_property_name << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tif(from_property->property_type() != to_property->property_type())\n\t\t{\n\t\t\tlog() << error << \"Property type mismatch between [\" << from_node->name() << \".\" << from_property_name << \"] and [\" << to_node->name() << \".\" << to_property_name << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tm_dependencies[to_property] = from_property;\n\t}\n\nprivate:\n\tipipeline::dependencies_t& m_dependencies;\n\tconst ipersistent::load_context& m_context;\n};\n\n/// Converts <objects> tags to <nodes> tags.\nvoid upgrade_objects_element(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/objects\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete <objects> tags to <nodes> tags.\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\t(**result).name = \"nodes\";\n}\n\n/// Converts <object> tags to <node> tags.\nvoid upgrade_object_elements(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/nodes/object\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete <object> tags to <node> tags.\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\t(**result).name = \"node\";\n}\n\n/// Converts \"class\" attributes to \"factory\" attributes.\nvoid upgrade_class_properties(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/nodes/node[@class]\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete \\\"class\\\" attributes to \\\"factory\\\" attributes.\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\tfind_attribute(**result, \"class\")->name = \"factory\";\n}\n\n/// Converts <variables> tags to <properties> tags.\nvoid upgrade_variables_elements(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/nodes/node/variables\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete <variables> tags to <properties> tags.\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\t(**result).name = \"properties\";\n}\n\n/// Converts <object> tags to <property> tags.\nvoid upgrade_property_object_elements(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/nodes/node/properties/object\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete <object> tags to <property> tags.\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\t(**result).name = \"property\";\n}\n\n/// Converts <shader> tags to <property> tags.\nvoid upgrade_property_shader_elements(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/nodes/node/properties/shader\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete <shader> tags to <property> tags.\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\t(**result).name = \"property\";\n}\n\n/// Converts <variable> tags to <property> tags.\nvoid upgrade_property_variable_elements(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/nodes/node/properties/variable\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete <variable> tags to <property> tags.\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\t(**result).name = \"property\";\n}\n\nvoid upgrade_property_values(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/nodes/node/properties/property[@value]\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete \\\"value\\\" attributes to element text.\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\t(**result).text = remove_attribute(**result, \"value\");\n}\n\nvoid upgrade_user_property_types(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/nodes/node/properties/property[@user_property][@type='double']\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete \\\"double\\\" types to \\\"k3d::double_t\\\".\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\tset_attribute(**result, attribute(\"type\", \"k3d::double_t\"));\n}\n\n/// Converts <pipeline> tags to <dependencies> tags.\nvoid upgrade_pipeline_element(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/pipeline\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete <pipeline> tags to <dependencies> tags.\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\t(**result).name = \"dependencies\";\n}\n\n/// Converts \"from_object\" attributes to \"from_node\" attributes.\nvoid upgrade_from_object_attributes(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/dependencies/dependency[@from_object]\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete \\\"from_object\\\" attributes to \\\"from_node\\\" attributes.\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\tfind_attribute(**result, \"from_object\")->name = \"from_node\";\n}\n\n/// Converts \"to_object\" attributes to \"to_node\" attributes.\nvoid upgrade_to_object_attributes(element& XMLDocument)\n{\n\tconst xpath::result_set results = xpath::match(XMLDocument, \"/k3d/dependencies/dependency[@to_object]\");\n\tif(results.empty())\n\t\treturn;\n\n\tlog() << warning << \"Converting obsolete \\\"to_object\\\" attributes to \\\"to_node\\\" attributes.\" << std::endl;\n\tfor(xpath::result_set::const_iterator result = results.begin(); result != results.end(); ++result)\n\t\tfind_attribute(**result, \"to_object\")->name = \"to_node\";\n}\n\n/// Upgrades LSystemParser nodes so their \"orientation\" property is set correctly\nvoid upgrade_l_system_parser_nodes(element& XMLDocument)\n{\n\telement* const xml_nodes = find_element(XMLDocument, \"nodes\");\n\tif(!xml_nodes)\n\t\treturn;\n\n\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\")\n\t\t\tcontinue;\n\n\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\tif(node_factory_id != uuid(0xa637e99d, 0x707c4342, 0x8c6d4d15, 0x78c9054a))\n\t\t\tcontinue;\n\n\t\telement* const xml_properties = find_element(*xml_node, \"properties\");\n\t\tif(!xml_properties)\n\t\t\tcontinue;\n\n\t\telement* xml_type = 0;\n\t\tfor(element::elements_t::iterator xml_property = xml_properties->children.begin(); xml_property != xml_properties->children.end(); ++xml_property)\n\t\t{\n\t\t\tif(xml_property->name != \"property\")\n\t\t\t\tcontinue;\n\n\t\t\tif(attribute_text(*xml_property, \"name\") == \"orientation\")\n\t\t\t{\n\t\t\t\txml_type = &*xml_property;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(!xml_type)\n\t\t{\n\t\t\tlog() << warning << \"Upgrading LSystemParser node\" << std::endl;\n\t\t\t// Add new property, defaults to old behaviour\n\t\t\txml_properties->append(element(\"property\", \"+y\", attribute(\"name\", \"orientation\")));\n\t\t\txml_properties->append(element(\"property\", \"true\", attribute(\"name\", \"flip_normals\")));\n\t\t}\n\t}\n}\n\n/// Upgrades PolyGrid nodes so their \"orientation\" property is set correctly\nvoid upgrade_poly_grid_nodes(element& XMLDocument)\n{\n\telement* const xml_nodes = find_element(XMLDocument, \"nodes\");\n\tif(!xml_nodes)\n\t\treturn;\n\n\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\")\n\t\t\tcontinue;\n\n\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\tif(node_factory_id != uuid(0xacb3b4f8, 0x5cd6471c, 0xaed72686, 0xc576987c))\n\t\t\tcontinue;\n\n\t\telement* const xml_properties = find_element(*xml_node, \"properties\");\n\t\tif(!xml_properties)\n\t\t\tcontinue;\n\n\t\telement* xml_type = 0;\n\t\tfor(element::elements_t::iterator xml_property = xml_properties->children.begin(); xml_property != xml_properties->children.end(); ++xml_property)\n\t\t{\n\t\t\tif(xml_property->name != \"property\")\n\t\t\t\tcontinue;\n\n\t\t\tif(attribute_text(*xml_property, \"name\") == \"orientation\")\n\t\t\t{\n\t\t\t\txml_type = &*xml_property;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(!xml_type)\n\t\t{\n\t\t\tlog() << warning << \"Upgrading PolyGrid node\" << std::endl;\n\t\t\t// Add new property, defaults to old behaviour\n\t\t\txml_properties->append(element(\"property\", \"-z\", attribute(\"name\", \"orientation\")));\n\t\t}\n\t}\n}\n\n/// Upgrades PolyTerrainFFT nodes so their \"orientation\" property is set correctly\nvoid upgrade_poly_terrain_fft_nodes(element& XMLDocument)\n{\n\telement* const xml_nodes = find_element(XMLDocument, \"nodes\");\n\tif(!xml_nodes)\n\t\treturn;\n\n\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\")\n\t\t\tcontinue;\n\n\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\tif(node_factory_id != uuid(0x7646f5a1, 0x3f3640d6, 0x8d4c70af, 0x91bcb418))\n\t\t\tcontinue;\n\n\t\telement* const xml_properties = find_element(*xml_node, \"properties\");\n\t\tif(!xml_properties)\n\t\t\tcontinue;\n\n\t\telement* xml_type = 0;\n\t\tfor(element::elements_t::iterator xml_property = xml_properties->children.begin(); xml_property != xml_properties->children.end(); ++xml_property)\n\t\t{\n\t\t\tif(xml_property->name != \"property\")\n\t\t\t\tcontinue;\n\n\t\t\tif(attribute_text(*xml_property, \"name\") == \"orientation\")\n\t\t\t{\n\t\t\t\txml_type = &*xml_property;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(!xml_type)\n\t\t{\n\t\t\tlog() << warning << \"Upgrading PolyTerrainFFT node\" << std::endl;\n\t\t\t// Add new property, defaults to old behaviour\n\t\t\txml_properties->append(element(\"property\", \"+y\", attribute(\"name\", \"orientation\")));\n\t\t}\n\t}\n}\n\n/// Upgrades PolyTerrainHfBm nodes so their \"orientation\" property is set correctly\nvoid upgrade_poly_terrain_hfbm_nodes(element& XMLDocument)\n{\n\telement* const xml_nodes = find_element(XMLDocument, \"nodes\");\n\tif(!xml_nodes)\n\t\treturn;\n\n\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\")\n\t\t\tcontinue;\n\n\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\tif(node_factory_id != uuid(0xff22f8f8, 0xa8b540f6, 0xb612a012, 0x8d4e9adb))\n\t\t\tcontinue;\n\n\t\telement* const xml_properties = find_element(*xml_node, \"properties\");\n\t\tif(!xml_properties)\n\t\t\tcontinue;\n\n\t\telement* xml_type = 0;\n\t\tfor(element::elements_t::iterator xml_property = xml_properties->children.begin(); xml_property != xml_properties->children.end(); ++xml_property)\n\t\t{\n\t\t\tif(xml_property->name != \"property\")\n\t\t\t\tcontinue;\n\n\t\t\tif(attribute_text(*xml_property, \"name\") == \"orientation\")\n\t\t\t{\n\t\t\t\txml_type = &*xml_property;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(!xml_type)\n\t\t{\n\t\t\tlog() << warning << \"Upgrading PolyTerrainHfBm node\" << std::endl;\n\t\t\t// Add new property, defaults to old behaviour\n\t\t\txml_properties->append(element(\"property\", \"+y\", attribute(\"name\", \"orientation\")));\n\t\t}\n\t}\n}\n\n/// Upgrades PolyText nodes so their \"orientation\" property is set correctly\nvoid upgrade_poly_text_nodes(element& XMLDocument)\n{\n\telement* const xml_nodes = find_element(XMLDocument, \"nodes\");\n\tif(!xml_nodes)\n\t\treturn;\n\n\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\")\n\t\t\tcontinue;\n\n\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\tif(node_factory_id != uuid(0xd0691ef7, 0x0d6c41c0, 0xa607bea2, 0x09d386f5))\n\t\t\tcontinue;\n\n\t\telement* const xml_properties = find_element(*xml_node, \"properties\");\n\t\tif(!xml_properties)\n\t\t\tcontinue;\n\n\t\telement* xml_type = 0;\n\t\tfor(element::elements_t::iterator xml_property = xml_properties->children.begin(); xml_property != xml_properties->children.end(); ++xml_property)\n\t\t{\n\t\t\tif(xml_property->name != \"property\")\n\t\t\t\tcontinue;\n\n\t\t\tif(attribute_text(*xml_property, \"name\") == \"orientation\")\n\t\t\t{\n\t\t\t\txml_type = &*xml_property;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(!xml_type)\n\t\t{\n\t\t\tlog() << warning << \"Upgrading PolyText node\" << std::endl;\n\t\t\t// Add new property, defaults to old behaviour\n\t\t\txml_properties->append(element(\"property\", \"-z\", attribute(\"name\", \"orientation\")));\n\t\t}\n\t}\n}\n\n/// Upgrades PolySphere nodes so their \"type\" property is set correctly\nvoid upgrade_poly_sphere_nodes(element& XMLDocument)\n{\n\telement* const xml_nodes = find_element(XMLDocument, \"nodes\");\n\tif(!xml_nodes)\n\t\treturn;\n\n\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\")\n\t\t\tcontinue;\n\n\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\tif(node_factory_id != uuid(0x919c3786, 0x619e4e84, 0xb4ad868f, 0x1e77e67c))\n\t\t\tcontinue;\n\n\t\telement* const xml_properties = find_element(*xml_node, \"properties\");\n\t\tif(!xml_properties)\n\t\t\tcontinue;\n\n\t\telement* xml_type = 0;\n\t\tfor(element::elements_t::iterator xml_property = xml_properties->children.begin(); xml_property != xml_properties->children.end(); ++xml_property)\n\t\t{\n\t\t\tif(xml_property->name != \"property\")\n\t\t\t\tcontinue;\n\n\t\t\tif(attribute_text(*xml_property, \"name\") == \"type\")\n\t\t\t{\n\t\t\t\txml_type = &*xml_property;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(!xml_type)\n\t\t{\n\t\t\tlog() << warning << \"Upgrading PolySphere node\" << std::endl;\n\t\t\t// Add new type, defaults to old behaviour\n\t\t\txml_properties->append(element(\"property\", \"sphereized_cylinder\", attribute(\"name\", \"type\")));\n\t\t}\n\t}\n}\n\n/// Returns the largest node id in use in the given document\nconst ipersistent_lookup::id_type max_node_id(element& XMLDocument)\n{\n\tipersistent_lookup::id_type result = 0;\n\tif(element* const xml_nodes = find_element(XMLDocument, \"nodes\"))\n\t{\n\t\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t\t{\n\t\t\tif(xml_node->name != \"node\")\n\t\t\t\tcontinue;\n\n\t\t\tresult = std::max(result, attribute_value<ipersistent_lookup::id_type>(*xml_node, \"id\", 0));\n\t\t}\n\t}\n\n\treturn result;\n}\n\nvoid adjust_dependencies(element& XMLDocument, const ipersistent_lookup::id_type FromID, const string_t& FromProperty, const ipersistent_lookup::id_type ToID, const string_t& ToProperty)\n{\n\tif(element* const xml_dependencies = find_element(XMLDocument, \"dependencies\"))\n\t{\n\t\tfor(element::elements_t::iterator xml_dependency = xml_dependencies->children.begin(); xml_dependency != xml_dependencies->children.end(); ++xml_dependency)\n\t\t{\n\t\t\tif(xml_dependency->name != \"dependency\")\n\t\t\t\tcontinue;\n\n\t\t\tattribute* const to_node = find_attribute(*xml_dependency, \"to_node\");\n\t\t\tif(!to_node)\n\t\t\t\tcontinue;\n\n\t\t\tif(from_string<ipersistent_lookup::id_type>(to_node->value, 0) != ToID)\n\t\t\t\tcontinue;\n\n\t\t\tattribute* const to_property = find_attribute(*xml_dependency, \"to_property\");\n\t\t\tif(!to_property)\n\t\t\t\tcontinue;\n\n\t\t\tif(to_property->value != ToProperty)\n\t\t\t\tcontinue;\n\n\t\t\tto_node->value = string_cast(FromID);\n\t\t\tto_property->value = FromProperty;\n\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/// Upgrades transformable nodes so that their position/orientation/scale properties are replaced with a Transform node\nvoid upgrade_transformable_nodes(element& XMLDocument)\n{\n\telement* const xml_nodes = find_element(XMLDocument, \"nodes\");\n\tif(!xml_nodes)\n\t\treturn;\n\n\tipersistent_lookup::id_type next_node_id = max_node_id(XMLDocument) + 1;\n\n\telement::elements_t new_dependencies;\n\telement::elements_t new_nodes;\n\n\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\")\n\t\t\tcontinue;\n\n\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\tiplugin_factory* const node_factory = plugin::factory::lookup(node_factory_id);\n\t\tif(!node_factory)\n\t\t\tcontinue;\n\n\t\tconst ipersistent_lookup::id_type node_id = attribute_value<ipersistent_lookup::id_type>(*xml_node, \"id\", 0);\n\t\tif(!node_id)\n\t\t\tcontinue;\n\n\t\tif(!node_factory->implements(typeid(imatrix_source)))\n\t\t\tcontinue;\n\n\t\tif(!node_factory->implements(typeid(imatrix_sink)))\n\t\t\tcontinue;\n\n\t\telement* const xml_properties = find_element(*xml_node, \"properties\");\n\t\tif(!xml_properties)\n\t\t\tcontinue;\n\n\t\telement* xml_position = 0;\n\t\telement* xml_orientation = 0;\n\t\telement* xml_scale = 0;\n\n\t\tfor(element::elements_t::iterator xml_property = xml_properties->children.begin(); xml_property != xml_properties->children.end(); ++xml_property)\n\t\t{\n\t\t\tif(xml_property->name != \"property\")\n\t\t\t\tcontinue;\n\n\t\t\tconst string_t property_name = attribute_text(*xml_property, \"name\");\n\t\t\tif(property_name == \"position\")\n\t\t\t\txml_position = &(*xml_property);\n\t\t\telse if(property_name == \"orientation\")\n\t\t\t\txml_orientation = &(*xml_property);\n\t\t\telse if(property_name == \"scale\")\n\t\t\t\txml_scale = &(*xml_property);\n\t\t}\n\n\t\tif(!(xml_position && xml_orientation && xml_scale))\n\t\t\tcontinue;\n\n\t\tif(xml_position->text == \"0 0 0\" && xml_orientation->text == \"0 0 0 1\" && xml_scale->text == \"1 1 1\")\n\t\t\tcontinue;\n\n\t\tconst string_t node_name = attribute_text(*xml_node, \"name\");\n\t\tlog() << warning << \"Upgrading old transformable node \" << node_name << std::endl;\n\n\t\tconst vector3 position = from_string<vector3>(xml_position->text, vector3(0, 0, 0));\n\t\tconst angle_axis orientation = from_string<angle_axis>(xml_orientation->text, angle_axis(0, point3(0, 0, 1)));\n\t\tconst point3 scale = from_string<point3>(xml_scale->text, point3(1, 1, 1));\n\t\tconst matrix4 matrix = translate3(position) * rotate3(orientation) * scale3(scale[0], scale[1], scale[2]);\n\n\t\tadjust_dependencies(XMLDocument, next_node_id, \"input_matrix\", node_id, \"input_matrix\");\n\n\t\tnew_dependencies.push_back(\n\t\t\telement(\"dependency\",\n\t\t\t\tattribute(\"from_node\", next_node_id),\n\t\t\t\tattribute(\"from_property\", \"output_matrix\"),\n\t\t\t\tattribute(\"to_node\", node_id),\n\t\t\t\tattribute(\"to_property\", \"input_matrix\")));\n\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"Transformation\"),\n\t\t\t\tattribute(\"factory\", classes::FrozenMatrix()),\n\t\t\t\tattribute(\"id\", next_node_id),\n\t\t\t\telement(\"properties\",\n\t\t\t\t\telement(\"property\", string_cast(identity3()),\n\t\t\t\t\t\tattribute(\"name\", \"input_matrix\")),\n\t\t\t\t\telement(\"property\", string_cast(matrix),\n\t\t\t\t\t\tattribute(\"name\", \"matrix\")))));\n\n\t\t++next_node_id;\n\t}\n\n\txml_nodes->children.insert(xml_nodes->children.end(), new_nodes.begin(), new_nodes.end());\n\n\telement& xml_dependencies = XMLDocument.safe_element(\"dependencies\");\n\txml_dependencies.children.insert(xml_dependencies.children.end(), new_dependencies.begin(), new_dependencies.end());\n}\n\n/// Add default painters if no painters are present\nvoid upgrade_painters(element& XMLDocument)\n{\n\telement* const xml_nodes = find_element(XMLDocument, \"nodes\");\n\tif(!xml_nodes)\n\t\treturn;\n\n\tipersistent_lookup::id_type next_node_id = max_node_id(XMLDocument) + 1;\n\n\telement::elements_t new_dependencies;\n\telement::elements_t new_nodes;\n\t\n\tbool has_gl_painter = false;\n\tbool has_ri_painter = false;\n\t// Check if the document contains painters\n\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\")\n\t\t\tcontinue;\n\n\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\tiplugin_factory* const node_factory = plugin::factory::lookup(node_factory_id);\n\t\tif(!node_factory)\n\t\t\tcontinue;\n\n\t\tconst ipersistent_lookup::id_type node_id = attribute_value<ipersistent_lookup::id_type>(*xml_node, \"id\", 0);\n\t\tif(!node_id)\n\t\t\tcontinue;\n\n\t\tif(node_factory->implements(typeid(gl::imesh_painter)))\n\t\t\thas_gl_painter = true;\n\n\t\tif(node_factory->implements(typeid(ri::imesh_painter)))\n\t\t\thas_ri_painter = true;\n\t\t\t\n\t\tif (has_gl_painter && has_ri_painter)\n\t\t\tbreak;\n\t}\n\t\n\t// if ri or gl painters are not found, a default version is constructed:\n\tif (!has_gl_painter)\n\t{\n\t\treturn_if_fail(plugin::factory::lookup(\"OpenGLMultiPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"VirtualOpenGLPointPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"VirtualOpenGLEdgePainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"VirtualOpenGLFacePainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"VirtualOpenGLSDSPointPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"VirtualOpenGLSDSEdgePainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"VirtualOpenGLSDSFacePainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"OpenGLLinearCurvePainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"OpenGLCubicCurvePainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"OpenGLNURBSCurvePainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"OpenGLBilinearPatchPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"OpenGLBicubicPatchPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"OpenGLNURBSPatchPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"OpenGLBlobbyPointPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"OpenGLFaceNormalPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"OpenGLFaceOrientationPainter\"));\n\n\t\tipersistent_lookup::id_type gl_painter_id = next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL Default Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"OpenGLMultiPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id),\n\t\t\t\telement(\"properties\",\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 1),\n\t\t\t\t\t\tattribute(\"name\", \"points\"),\n\t\t\t\t\t\tattribute(\"label\", \"Points\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 2),\n\t\t\t\t\t\tattribute(\"name\", \"edges\"),\n\t\t\t\t\t\tattribute(\"label\", \"Edges\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 3),\n\t\t\t\t\t\tattribute(\"name\", \"faces\"),\n\t\t\t\t\t\tattribute(\"label\", \"Faces\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 4),\n\t\t\t\t\t\tattribute(\"name\", \"sds_points\"),\n\t\t\t\t\t\tattribute(\"label\", \"SDS Points\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 5),\n\t\t\t\t\t\tattribute(\"name\", \"sds_edges\"),\n\t\t\t\t\t\tattribute(\"label\", \"SDS Edges\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 6),\n\t\t\t\t\t\tattribute(\"name\", \"sds_faces\"),\n\t\t\t\t\t\tattribute(\"label\", \"SDS Faces\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 7),\n\t\t\t\t\t\tattribute(\"name\", \"linear_curves\"),\n\t\t\t\t\t\tattribute(\"label\", \"Linear Curves\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 8),\n\t\t\t\t\t\tattribute(\"name\", \"cubic_curves\"),\n\t\t\t\t\t\tattribute(\"label\", \"Cubic Curves\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 9),\n\t\t\t\t\t\tattribute(\"name\", \"nurbs_curves\"),\n\t\t\t\t\t\tattribute(\"label\", \"NURBS Curves\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 10),\n\t\t\t\t\t\tattribute(\"name\", \"bilinear_patches\"),\n\t\t\t\t\t\tattribute(\"label\", \"Bilinear Patches\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 11),\n\t\t\t\t\t\tattribute(\"name\", \"bicubic_patches\"),\n\t\t\t\t\t\tattribute(\"label\", \"Bicubic Patches\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 12),\n\t\t\t\t\t\tattribute(\"name\", \"nurbs_patches\"),\n\t\t\t\t\t\tattribute(\"label\", \"NURBS Patches\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 13),\n\t\t\t\t\t\tattribute(\"name\", \"blobbies\"),\n\t\t\t\t\t\tattribute(\"label\", \"Blobbies\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 14),\n\t\t\t\t\t\tattribute(\"name\", \"face_normals\"),\n\t\t\t\t\t\tattribute(\"label\", \"Face Normals\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 15),\n\t\t\t\t\t\tattribute(\"name\", \"face_orientation\"),\n\t\t\t\t\t\tattribute(\"label\", \"Face Orientation\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::gl::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")))));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL Point Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"OpenGLPointPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL Edge Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"VirtualOpenGLEdgePainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL Face Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"VirtualOpenGLFacePainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"SDS Point Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"VirtualOpenGLSDSPointPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"SDS Edge Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"VirtualOpenGLSDSEdgePainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"SDS Face Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"VirtualOpenGLSDSFacePainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL Linear Curve Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"OpenGLLinearCurvePainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL Cubic Curve Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"OpenGLCubicCurvePainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL NURBS Curve Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"OpenGLNURBSCurvePainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL Bilinear Patch Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"OpenGLBilinearPatchPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL Bicubic Patch Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"OpenGLBicubicPatchPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL NURBS Patch Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"OpenGLNURBSPatchPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL Blobby Point Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"OpenGLBlobbyPointPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL Face Normal Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"OpenGLFaceNormalPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"GL Face Orientation Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"OpenGLFaceOrientationPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t\t\t\n\t\t// Now add painter properties to the MeshInstance nodes\n\t\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t\t{\n\t\t\tif(xml_node->name != \"node\")\n\t\t\t\tcontinue;\n\t\n\t\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\t\tif(node_factory_id != classes::MeshInstance())\n\t\t\t\tcontinue;\n\t\n\t\t\telement* const xml_properties = find_element(*xml_node, \"properties\");\n\t\t\tif(!xml_properties)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\txml_properties->push_back(element(\"property\", string_cast(gl_painter_id), attribute(\"name\", \"gl_painter\")));\n\t\t}\n\t}\n\tif (!has_ri_painter)\n\t{\n\t\treturn_if_fail(plugin::factory::lookup(\"RenderManMultiPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"RenderManParticlePainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"RenderManPolyhedronPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"RenderManSubdivisionSurfacePainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"RenderManLinearCurvePainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"RenderManCubicCurvePainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"RenderManBilinearPatchPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"RenderManBicubicPatchPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"RenderManNURBSPatchPainter\"));\n\t\treturn_if_fail(plugin::factory::lookup(\"RenderManBlobbyPainter\"));\n\n\t\t++next_node_id;\n\t\tipersistent_lookup::id_type ri_painter_id = next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"Renderman Default Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"RenderManMultiPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id),\n\t\t\t\telement(\"properties\",\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 1),\n\t\t\t\t\t\tattribute(\"name\", \"point_groups\"),\n\t\t\t\t\t\tattribute(\"label\", \"Point Groups\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::ri::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 2),\n\t\t\t\t\t\tattribute(\"name\", \"polyhedra\"),\n\t\t\t\t\t\tattribute(\"label\", \"Polyhedra\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::ri::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 3),\n\t\t\t\t\t\tattribute(\"name\", \"subdivision_surfaces\"),\n\t\t\t\t\t\tattribute(\"label\", \"Subdivision Surfaces\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::ri::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 4),\n\t\t\t\t\t\tattribute(\"name\", \"linear_curves\"),\n\t\t\t\t\t\tattribute(\"label\", \"Linear Curves\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::ri::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 5),\n\t\t\t\t\t\tattribute(\"name\", \"cubic_curves\"),\n\t\t\t\t\t\tattribute(\"label\", \"Cubic Curves\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::ri::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 6),\n\t\t\t\t\t\tattribute(\"name\", \"bilinear_patches\"),\n\t\t\t\t\t\tattribute(\"label\", \"Bilinear Patches\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::ri::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 7),\n\t\t\t\t\t\tattribute(\"name\", \"bicubic_patches\"),\n\t\t\t\t\t\tattribute(\"label\", \"Bicubic Patches\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::ri::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 8),\n\t\t\t\t\t\tattribute(\"name\", \"nurbs_patches\"),\n\t\t\t\t\t\tattribute(\"label\", \"NURBS Patches\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::ri::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")),\n\t\t\t\t\telement(\"property\", string_cast(next_node_id + 9),\n\t\t\t\t\t\tattribute(\"name\", \"blobbies\"),\n\t\t\t\t\t\tattribute(\"label\", \"Blobbies\"),\n\t\t\t\t\t\tattribute(\"description\", \"\"),\n\t\t\t\t\t\tattribute(\"type\", \"k3d::ri::imesh_painter*\"),\n\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\")))));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"RenderMan Point Group Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"RenderManParticlePainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"RenderMan Polyhedron Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"RenderManPolyhedronPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"RenderMan Subdivision Surface Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"RenderManSubdivisionSurfacePainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"RenderMan Linear Curve Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"RenderManLinearCurvePainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"RenderMan Cubic Curve Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"RenderManCubicCurvePainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"RenderMan Bilinear Patch Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"RenderManBilinearPatchPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"RenderMan Bicubic Patch Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"RenderManBicubicPatchPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"RenderMan NURBS Patch Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"RenderManNURBSPatchPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t++next_node_id;\n\t\tnew_nodes.push_back(\n\t\t\telement(\"node\",\n\t\t\t\tattribute(\"name\", \"RenderMan Blobby Painter\"),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"RenderManBlobbyPainter\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_node_id)));\n\t\t\t\t\n\t\t// Now add painter properties to the MeshInstance nodes\n\t\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t\t{\n\t\t\tif(xml_node->name != \"node\")\n\t\t\t\tcontinue;\n\t\n\t\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\t\tif(node_factory_id != classes::MeshInstance())\n\t\t\t\tcontinue;\n\t\n\t\t\telement* const xml_properties = find_element(*xml_node, \"properties\");\n\t\t\tif(!xml_properties)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\txml_properties->push_back(element(\"property\", string_cast(ri_painter_id), attribute(\"name\", \"ri_painter\")));\n\t\t}\n\t}\n\t\n\txml_nodes->children.insert(xml_nodes->children.end(), new_nodes.begin(), new_nodes.end());\n}\n\nvoid upgrade_node_selection(element& XMLDocument)\n{\n\treturn_if_fail(plugin::factory::lookup(\"NodeSelection\"));\n\n\telement* const xml_nodes = find_element(XMLDocument, \"nodes\");\n\tif(!xml_nodes)\n\t\treturn;\n\n\tipersistent_lookup::id_type node_selection_id = max_node_id(XMLDocument) + 1;\n\t\n\t// Check if the document contains an inode_selection node\n\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\")\n\t\t\tcontinue;\n\n\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\tiplugin_factory* const node_factory = plugin::factory::lookup(node_factory_id);\n\t\tif(!node_factory)\n\t\t\tcontinue;\n\n\t\tconst ipersistent_lookup::id_type node_id = attribute_value<ipersistent_lookup::id_type>(*xml_node, \"id\", 0);\n\t\tif(!node_id)\n\t\t\tcontinue;\n\n\t\tif(node_factory->implements(typeid(inode_selection)))\n\t\t\treturn;\n\t}\n\t\n\telement node_selection(\"node\",\n\t\t\tattribute(\"name\", \"Node Selection\"),\n\t\t\tattribute(\"factory\", plugin::factory::lookup(\"NodeSelection\")->factory_id()),\n\t\t\tattribute(\"id\", node_selection_id),\n\t\t\telement(\"metadata\",\n\t\t\t\t\telement(\"pair\", \"node_selection\", attribute(\"name\", \"ngui:unique_node\"))));\n\t\n\txml_nodes->children.push_back(node_selection);\n\t\n\t// Now add the node_selection node to the GL Engine node(s)\n\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\")\n\t\t\tcontinue;\n\n\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\tif(node_factory_id != plugin::factory::lookup(\"OpenGLEngine\")->factory_id())\n\t\t\tcontinue;\n\n\t\telement* const xml_properties = find_element(*xml_node, \"properties\");\n\t\tif(!xml_properties)\n\t\t\tcontinue;\n\t\t\n\t\txml_properties->push_back(element(\"property\", string_cast(node_selection_id), attribute(\"name\", \"node_selection\")));\n\t}\n}\n\n/// Inserts a SelectCompanion modifier before old Delete nodes\nvoid upgrade_delete_components_nodes(element& XMLDocument)\n{\n\telement* const xml_nodes = find_element(XMLDocument, \"nodes\");\n\tif(!xml_nodes)\n\t\treturn;\n\t\n\telement* const xml_dependencies = find_element(XMLDocument, \"dependencies\");\n\tif(!xml_dependencies)\n\t\treturn;\n\t\n\tipersistent_lookup::id_type next_id = max_node_id(XMLDocument) + 1;\n\tk3d::uint_t sequence = 1;\n\t\n\telement::elements_t new_nodes;\n\tfor(element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t{\n\t\tif(xml_node->name != \"node\")\n\t\t\tcontinue;\n\n\t\tconst uuid node_factory_id = attribute_value<uuid>(*xml_node, \"factory\", uuid::null());\n\t\tif(node_factory_id != uuid(0xc98c37d5, 0xa50c43c7, 0xb88c3687, 0x73cd3c4d)) // Old Delete ID\n\t\t\tcontinue;\n\n\t\tconst ipersistent_lookup::id_type node_id = attribute_value<ipersistent_lookup::id_type>(*xml_node, \"id\", 0);\n\t\tif(!node_id)\n\t\t\tcontinue;\n\t\t\n\t\t// Upgrade the factory attribute\n\t\tset_attribute(*xml_node, attribute(\"factory\", string_cast(plugin::factory::lookup(\"Delete\")->factory_id())));\n\t\t\n\t\telement select_companion(\"node\",\n\t\t\t\tattribute(\"name\", \"Select Companion \" + string_cast(sequence)),\n\t\t\t\tattribute(\"factory\", plugin::factory::lookup(\"SelectCompanion\")->factory_id()),\n\t\t\t\tattribute(\"id\", next_id),\n\t\t\t\telement(\"properties\",\n\t\t\t\t\t\telement(\"property\", \"true\", attribute(\"name\", \"keep_original_selection\"))));\n\t\tnew_nodes.push_back(select_companion);\n\t\t\n\t\telement::elements_t new_dependencies;\n\t\tfor(element::elements_t::iterator xml_dependency = xml_dependencies->children.begin(); xml_dependency != xml_dependencies->children.end(); ++xml_dependency)\n\t\t{\n\t\t\tif(attribute_value<ipersistent_lookup::id_type>(*xml_dependency, \"to_node\", 0) == node_id\n\t\t\t\t\t&& attribute_value<string_t>(*xml_dependency, \"to_property\", \"\") == \"input_mesh\")\n\t\t\t{\n\t\t\t\tipersistent_lookup::id_type from_node = attribute_value<ipersistent_lookup::id_type>(*xml_dependency, \"from_node\", 0);\n\t\t\t\telement new_dependency(\"dependency\",\n\t\t\t\t\t\tattribute(\"from_node\", string_cast(from_node)),\n\t\t\t\t\t\tattribute(\"from_property\", \"output_mesh\"),\n\t\t\t\t\t\tattribute(\"to_node\", string_cast(next_id)),\n\t\t\t\t\t\tattribute(\"to_property\", \"input_mesh\"));\n\t\t\t\tnew_dependencies.push_back(new_dependency);\n\t\t\t\tset_attribute(*xml_dependency, attribute(\"from_node\", string_cast(next_id)));\n\t\t\t}\n\t\t}\n\t\txml_dependencies->children.insert(xml_dependencies->children.end(), new_dependencies.begin(), new_dependencies.end());\n\t\t\n\t\t++sequence;\n\t\t++next_id;\n\t}\n\txml_nodes->children.insert(xml_nodes->children.end(), new_nodes.begin(), new_nodes.end());\n}\n\n/// Helper functor for searching for shaders by name\nstruct same_name\n{\n\tsame_name(const string_t& Name) :\n\t\tname(Name)\n\t{\n\t}\n\n\ttemplate<typename T>\n\tbool operator()(const T& LHS)\n\t{\n\t\treturn LHS.name == name;\n\t}\n\n\tconst string_t name;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// upgrade_document\n\nvoid upgrade_document(element& XMLDocument)\n{\n\t// Note ... the order that these are called-in matters!\n\tdetail::upgrade_objects_element(XMLDocument);\n\tdetail::upgrade_object_elements(XMLDocument);\n\tdetail::upgrade_class_properties(XMLDocument);\n\tdetail::upgrade_variables_elements(XMLDocument);\n\tdetail::upgrade_property_object_elements(XMLDocument);\n\tdetail::upgrade_property_shader_elements(XMLDocument);\n\tdetail::upgrade_property_variable_elements(XMLDocument);\n\tdetail::upgrade_property_values(XMLDocument);\n\tdetail::upgrade_user_property_types(XMLDocument);\n\tdetail::upgrade_pipeline_element(XMLDocument);\n\tdetail::upgrade_from_object_attributes(XMLDocument);\n\tdetail::upgrade_to_object_attributes(XMLDocument);\n\tdetail::upgrade_l_system_parser_nodes(XMLDocument);\n\tdetail::upgrade_poly_grid_nodes(XMLDocument);\n\tdetail::upgrade_poly_sphere_nodes(XMLDocument);\n\tdetail::upgrade_poly_terrain_fft_nodes(XMLDocument);\n\tdetail::upgrade_poly_terrain_hfbm_nodes(XMLDocument);\n\tdetail::upgrade_poly_text_nodes(XMLDocument);\n\tdetail::upgrade_transformable_nodes(XMLDocument);\n\tdetail::upgrade_painters(XMLDocument);\n\tdetail::upgrade_node_selection(XMLDocument);\n\tdetail::upgrade_delete_components_nodes(XMLDocument);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// save\n\nvoid save(inode& Node, element& XML, const ipersistent::save_context& Context)\n{\n\t// Save the basic node information ...\n\telement& xml_node = XML.append(element(\"node\",\n\t\tattribute(\"name\", Node.name()),\n\t\tattribute(\"factory\", Node.factory().factory_id()),\n\t\tattribute(\"id\", Context.lookup.lookup_id(&Node))));\n\n\t// Save node metadata (if any) ...\n\tif(imetadata* const metadata = dynamic_cast<imetadata*>(&Node))\n\t{\n\t\tconst imetadata::metadata_t pairs = metadata->get_metadata();\n\t\tif(pairs.size())\n\t\t{\n\t\t\txml::element& xml_metadata = xml_node.append(xml::element(\"metadata\"));\n\n\t\t\tfor(imetadata::metadata_t::const_iterator pair = pairs.begin(); pair != pairs.end(); ++pair)\n\t\t\t\txml_metadata.append(xml::element(\"pair\", xml::attribute(\"name\", pair->first), pair->second));\n\t\t}\n\t}\n\n\t// Allow the node to save the rest of its internal state ...\n\tif(ipersistent* const persistent = dynamic_cast<ipersistent*>(&Node))\n\t\tpersistent->save(xml_node, Context);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// load\n\nvoid load(inode& Node, element& XML, const ipersistent::load_context& Context)\n{\n\t// Load (optional) node metadata ...\n\tif(xml::element* const xml_metadata = xml::find_element(XML, \"metadata\"))\n\t{\n\t\timetadata::metadata_t pairs;\n\t\tfor(xml::element::elements_t::const_iterator xml_pair = xml_metadata->children.begin(); xml_pair != xml_metadata->children.end(); ++xml_pair)\n\t\t{\n\t\t\tif(xml_pair->name != \"pair\")\n\t\t\t\tcontinue;\n\n\t\t\tpairs.insert(std::make_pair(xml::attribute_text(*xml_pair, \"name\"), xml_pair->text));\n\t\t}\n\n\t\tif(imetadata* const metadata = dynamic_cast<imetadata*>(&Node))\n\t\t\tmetadata->set_metadata(pairs);\n\t}\n\n\t// Allow the node to load the rest of its internal state ...\n\tif(ipersistent* const persistent = dynamic_cast<ipersistent*>(&Node))\n\t\tpersistent->load(XML, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// save_pipeline\n\nvoid save_pipeline(idocument& Document, element& XML, const ipersistent::save_context& Context)\n{\n\t// Create a mapping of properties to objects ...\n\tdetail::save_dependencies::map_t object_map;\n\tconst inode_collection::nodes_t& objects = Document.nodes().collection();\n\tfor(inode_collection::nodes_t::const_iterator object = objects.begin(); object != objects.end(); ++object)\n\t{\n\t\tiproperty_collection* const property_collection = dynamic_cast<iproperty_collection*>(*object);\n\t\tif(!property_collection)\n\t\t\tcontinue;\n\n\t\tconst iproperty_collection::properties_t properties(property_collection->properties());\n\t\tfor(iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t\tobject_map[*property] = *object;\n\t}\n\n\t// Save all dependencies\n\telement& xml_dependencies = XML.append(element(\"dependencies\"));\n\tstd::for_each(Document.pipeline().dependencies().begin(), Document.pipeline().dependencies().end(), detail::save_dependencies(object_map, xml_dependencies, Context));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_pipeline\n\nvoid load_pipeline(idocument& Document, element& XML, const ipersistent::load_context& Context)\n{\n\t// If we don't have any DAG information, we're done ...\n\telement* xml_dependencies = find_element(XML, \"dependencies\");\n\n\tif(!xml_dependencies)\n\t\treturn;\n\n\t// Load data and update the DAG ...\n\tipipeline::dependencies_t dependencies;\n\tstd::for_each(xml_dependencies->children.begin(), xml_dependencies->children.end(), detail::load_dependencies(dependencies, Context));\n\tDocument.pipeline().set_dependencies(dependencies);\n}\n\nnamespace detail\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// save_array_metadata\n\nvoid save_array_metadata(element& Storage, const array& Array, const ipersistent::save_context& Context)\n{\n\tconst array::metadata_t metadata = Array.get_metadata();\n\tif(metadata.empty())\n\t\treturn;\n\n\telement& xml_metadata = Storage.append(element(\"metadata\"));\n\n\tfor(array::metadata_t::const_iterator pair = metadata.begin(); pair != metadata.end(); ++pair)\n\t\txml_metadata.append(element(\"pair\", attribute(\"name\", pair->first), pair->second));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// save_array\n\ntemplate<typename array_type>\nvoid save_array(element& Container, element Storage, const array_type& Array, const ipersistent::save_context& Context)\n{\n\ttypename array_type::const_iterator item = Array.begin();\n\tconst typename array_type::const_iterator end = Array.end();\n\n\tstd::ostringstream buffer;\n\n\tif(item != end)\n\t\tbuffer << *item++;\n\tfor(; item != end; ++item)\n\t\tbuffer << \" \" << *item;\n\n\tStorage.text = buffer.str();\n\tsave_array_metadata(Storage, Array, Context);\n\n\tContainer.append(Storage);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// save_array\n\n/// Specialization of save_array to ensure that 8-bit integers don't get serialized as characters\nvoid save_array(element& Container, element Storage, const typed_array<int8_t>& Array, const ipersistent::save_context& Context)\n{\n\ttypedef typed_array<int8_t> array_type;\n\n\tarray_type::const_iterator item = Array.begin();\n\tconst array_type::const_iterator end = Array.end();\n\n\tstd::ostringstream buffer;\n\n\tif(item != end)\n\t\tbuffer << static_cast<int16_t>(*item++);\n\tfor(; item != end; ++item)\n\t\tbuffer << \" \" << static_cast<int16_t>(*item);\n\n\tStorage.text = buffer.str();\n\tsave_array_metadata(Storage, Array, Context);\n\n\tContainer.append(Storage);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// save_array\n\n/// Specialization of save_array to ensure that 8-bit unsigned integers don't get serialized as characters\nvoid save_array(element& Container, element Storage, const typed_array<uint8_t>& Array, const ipersistent::save_context& Context)\n{\n\ttypedef typed_array<uint8_t> array_type;\n\n\tarray_type::const_iterator item = Array.begin();\n\tconst array_type::const_iterator end = Array.end();\n\n\tstd::ostringstream buffer;\n\n\tif(item != end)\n\t\tbuffer << static_cast<uint16_t>(*item++);\n\tfor(; item != end; ++item)\n\t\tbuffer << \" \" << static_cast<uint16_t>(*item);\n\n\tStorage.text = buffer.str();\n\tsave_array_metadata(Storage, Array, Context);\n\n\tContainer.append(Storage);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// save_array\n\n/// Specialization of save_array to handle whitespace in strings\nvoid save_array(element& Container, element Storage, const typed_array<string_t>& Array, const ipersistent::save_context& Context)\n{\n\ttypedef typed_array<string_t> array_type;\n\n\tconst array_type::const_iterator end = Array.end();\n\tfor(array_type::const_iterator item = Array.begin(); item != end; ++item)\n\t\tStorage.append(element(\"value\", *item));\n\n\tsave_array_metadata(Storage, Array, Context);\n\n\tContainer.append(Storage);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// save_array\n\n/// Specialization of save_array to ensure we don't lose precision when writing arrays of double\nvoid save_array(element& Container, element Storage, const typed_array<double_t>& Array, const ipersistent::save_context& Context)\n{\n\ttypedef typed_array<double_t> array_type;\n\n\tarray_type::const_iterator item = Array.begin();\n\tconst array_type::const_iterator end = Array.end();\n\n\tstd::ostringstream buffer;\n\tbuffer << std::setprecision(17);\n\n\tif(item != end)\n\t\tbuffer << *item++;\n\tfor(; item != end; ++item)\n\t\tbuffer << \" \" << *item;\n\n\tStorage.text = buffer.str();\n\tsave_array_metadata(Storage, Array, Context);\n\n\tContainer.append(Storage);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// save_array\n\nvoid save_array(element& Container, element Storage, const typed_array<imaterial*>& Array, const ipersistent::save_context& Context)\n{\n\ttypedef typed_array<imaterial*> array_type;\n\n\tarray_type::const_iterator item = Array.begin();\n\tconst array_type::const_iterator end = Array.end();\n\n\tstd::ostringstream buffer;\n\n\tif(item != end)\n\t\tbuffer << Context.lookup.lookup_id(*item++);\n\tfor(; item != end; ++item)\n\t\tbuffer << \" \" << Context.lookup.lookup_id(*item);\n\n\tStorage.text = buffer.str();\n\tsave_array_metadata(Storage, Array, Context);\n\n\tContainer.append(Storage);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// save_array\n\ntemplate<typename array_type>\nvoid save_array(element& Container, element Storage, const pipeline_data<array_type>& Array, const ipersistent::save_context& Context)\n{\n\tif(!Array)\n\t\treturn;\n\n\tsave_array(Container, Storage, *Array, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// save_typed_array\n\nclass save_typed_array\n{\npublic:\n\tsave_typed_array(element& Container, const string_t& Name, const array& AbstractArray, const ipersistent::save_context& Context, bool_t& Saved) :\n\t\tcontainer(Container),\n\t\tname(Name),\n\t\tabstract_array(AbstractArray),\n\t\tcontext(Context),\n\t\tsaved(Saved)\n\t{\n\t\tif(const uint_t_array* const concrete_array = dynamic_cast<const uint_t_array*>(&abstract_array))\n\t\t{\n\t\t\tsaved = true;\n\t\t\tsave_array(container, element(\"array\", attribute(\"name\", name), attribute(\"type\", \"k3d::uint_t\")), *concrete_array, context);\n\t\t}\n\t}\n\n\ttemplate<typename T>\n\tvoid operator()(T) const\n\t{\n\t\tif(saved)\n\t\t\treturn;\n\n\t\tif(const typed_array<T>* const concrete_array = dynamic_cast<const typed_array<T>*>(&abstract_array))\n\t\t{\n\t\t\tsaved = true;\n\t\t\tsave_array(container, element(\"array\", attribute(\"name\", name), attribute(\"type\", type_string<T>())), *concrete_array, context);\n\t\t}\n\t}\n\nprivate:\n\telement& container;\n\tconst string_t& name;\n\tconst array& abstract_array;\n\tconst ipersistent::save_context& context;\n\tk3d::bool_t& saved;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// save_arrays\n\nvoid save_arrays(element& Container, element Storage, const mesh::named_arrays_t& Arrays, const ipersistent::save_context& Context)\n{\n\telement& container = Container.append(Storage);\n\tfor(mesh::named_arrays_t::const_iterator array_iterator = Arrays.begin(); array_iterator != Arrays.end(); ++array_iterator)\n\t{\n\t\tconst string_t name = array_iterator->first;\n\t\tconst array* const abstract_array = array_iterator->second.get();\n\n\t\tif(name.empty())\n\t\t{\n\t\t\tlog() << error << \"will not serialize unnamed array\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(!abstract_array)\n\t\t{\n\t\t\tlog() << error << \"will not serialize null array [\" << name << \"]\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tbool_t saved = false;\n\t\tboost::mpl::for_each<named_array_types>(save_typed_array(container, name, *abstract_array, Context, saved));\n\t\tif(!saved)\n\t\t\tlog() << error << k3d_file_reference << \": array [\" << name << \"] with unknown type [\" << demangle(typeid(*abstract_array)) << \"] will not be serialized\" << std::endl;\n\t}\n}\n\nvoid save_arrays(element& Container, element Storage, const mesh::table_t& Arrays, const ipersistent::save_context& Context)\n{\n\telement& container = Container.append(Storage);\n\tfor(mesh::table_t::const_iterator array_iterator = Arrays.begin(); array_iterator != Arrays.end(); ++array_iterator)\n\t{\n\t\tconst string_t name = array_iterator->first;\n\t\tconst array* const abstract_array = array_iterator->second.get();\n\n\t\tif(name.empty())\n\t\t{\n\t\t\tlog() << error << \"will not serialize unnamed array\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(!abstract_array)\n\t\t{\n\t\t\tlog() << error << \"will not serialize null array [\" << name << \"]\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tbool_t saved = false;\n\t\tboost::mpl::for_each<named_array_types>(save_typed_array(container, name, *abstract_array, Context, saved));\n\t\tif(!saved)\n\t\t\tlog() << error << k3d_file_reference << \": array [\" << name << \"] with unknown type [\" << demangle(typeid(*abstract_array)) << \"] will not be serialized\" << std::endl;\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_array_metadata\n\nvoid load_array_metadata(const element& Storage, array& Array, const ipersistent::load_context& Context)\n{\n\tif(const xml::element* const xml_metadata = xml::find_element(Storage, \"metadata\"))\n\t{\n\t\tfor(xml::element::elements_t::const_iterator xml_pair = xml_metadata->children.begin(); xml_pair != xml_metadata->children.end(); ++xml_pair)\n\t\t{\n\t\t\tif(xml_pair->name != \"pair\")\n\t\t\t\tcontinue;\n\n\t\t\tArray.set_metadata_value(xml::attribute_text(*xml_pair, \"name\"), xml_pair->text);\n\t\t}\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_array\n\ntemplate<typename array_type>\nvoid load_array(const element& Storage, array_type& Array, const ipersistent::load_context& Context)\n{\n\ttypename array_type::value_type value;\n\n\tstd::istringstream buffer(Storage.text);\n\twhile(true)\n\t{\n\t\tbuffer >> value;\n\n\t\tif(!buffer)\n\t\t\tbreak;\n\n\t\tArray.push_back(value);\n\t}\n\n\tload_array_metadata(Storage, Array, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_array\n\nvoid load_array(const element& Storage, typed_array<int8_t>& Array, const ipersistent::load_context& Context)\n{\n\tint16_t value;\n\n\tstd::istringstream buffer(Storage.text);\n\twhile(true)\n\t{\n\t\tbuffer >> value;\n\n\t\tif(!buffer)\n\t\t\tbreak;\n\n\t\tArray.push_back(static_cast<int8_t>(value));\n\t}\n\n\tload_array_metadata(Storage, Array, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_array\n\nvoid load_array(const element& Storage, typed_array<uint8_t>& Array, const ipersistent::load_context& Context)\n{\n\tuint16_t value;\n\n\tstd::istringstream buffer(Storage.text);\n\twhile(true)\n\t{\n\t\tbuffer >> value;\n\n\t\tif(!buffer)\n\t\t\tbreak;\n\n\t\tArray.push_back(static_cast<uint8_t>(value));\n\t}\n\n\tload_array_metadata(Storage, Array, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_array\n\nvoid load_array(const element& Storage, uint_t_array& Array, const ipersistent::load_context& Context)\n{\n\tuint64_t value;\n\n\tstd::istringstream buffer(Storage.text);\n\twhile(true)\n\t{\n\t\tbuffer >> value;\n\n\t\tif(!buffer)\n\t\t\tbreak;\n\n\t\t/** \\note We clamp 64-bit values on 32-bit platforms.  This makes selections work. */\n\t\t#if defined K3D_UINT_T_32_BITS\n\t\t\tvalue = std::min(uint64_t(uint_t(-1)), value);\n\t\t#endif \n\n\t\tArray.push_back(value);\n\t}\n\n\tload_array_metadata(Storage, Array, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_array\n\nvoid load_array(const element& Storage, typed_array<string_t>& Array, const ipersistent::load_context& Context)\n{\n\tfor(element::elements_t::const_iterator xml_value = Storage.children.begin(); xml_value != Storage.children.end(); ++xml_value)\n\t{\n\t\tif(xml_value->name != \"value\")\n\t\t\tcontinue;\n\n\t\tArray.push_back(xml_value->text);\n\t}\n\n\tload_array_metadata(Storage, Array, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_array\n\nvoid load_array(const element& Storage, typed_array<imaterial*>& Array, const ipersistent::load_context& Context)\n{\n\tstd::istringstream buffer(Storage.text);\n\twhile(true)\n\t{\n\t\tipersistent_lookup::id_type id = 0;\n\t\tbuffer >> id;\n\n\t\tif(!buffer)\n\t\t\tbreak;\n\n\t\tArray.push_back(dynamic_cast<imaterial*>(Context.lookup.lookup_object(id)));\n\t}\n\n\tload_array_metadata(Storage, Array, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_array\n\nvoid load_array(const element& Storage, typed_array<inode*>& Array, const ipersistent::load_context& Context)\n{\n\tstd::istringstream buffer(Storage.text);\n\twhile(true)\n\t{\n\t\tipersistent_lookup::id_type id = 0;\n\t\tbuffer >> id;\n\n\t\tif(!buffer)\n\t\t\tbreak;\n\n\t\tArray.push_back(dynamic_cast<inode*>(Context.lookup.lookup_object(id)));\n\t}\n\n\tload_array_metadata(Storage, Array, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_array\n\ntemplate<typename array_type>\nvoid load_array(const element& Container, const string_t& Storage, pipeline_data<array_type>& Array, const ipersistent::load_context& Context)\n{\n\tconst element* const storage = find_element(Container, Storage);\n\tif(!storage)\n\t\treturn;\n\n\tarray_type* const array = Array ? &Array.writable() : &Array.create();\n\tload_array(*storage, *array, Context);\n}\n\ntemplate<typename array_type>\nvoid load_array(const element& Container, const string_t& Storage, array_type& Array, const ipersistent::load_context& Context)\n{\n\tconst element* const storage = find_element(Container, Storage);\n\tif(!storage)\n\t\treturn;\n\n\tload_array(*storage, Array, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_typed_array\n\ntemplate<typename arrays_t>\nclass load_typed_array\n{\npublic:\n\tload_typed_array(const element& Storage, const string_t& Name, const string_t& Type, arrays_t& Arrays, const ipersistent::load_context& Context, k3d::bool_t& Loaded) :\n\t\tstorage(Storage),\n\t\tname(Name),\n\t\ttype(Type),\n\t\tarrays(Arrays),\n\t\tcontext(Context),\n\t\tloaded(Loaded)\n\t{\n\t\tif(type == \"k3d::uint_t\")\n\t\t{\n\t\t\tloaded = true;\n\t\t\tuint_t_array* const array = new uint_t_array();\n\t\t\tload_array(storage, *array, context);\n\t\t\tarrays.insert(std::make_pair(name, array));\n\t\t}\n\t}\n\n\ttemplate<typename T>\n\tvoid operator()(T) const\n\t{\n\t\tif(loaded)\n\t\t\treturn;\n\n\t\tif(type_string<T>() == type)\n\t\t{\n\t\t\tloaded = true;\n\t\t\ttyped_array<T>* const array = new typed_array<T>();\n\t\t\tload_array(storage, *array, context);\n\t\t\tarrays.insert(std::make_pair(name, array));\n\t\t}\n\t}\n\nprivate:\n\tconst element& storage;\n\tconst string_t& name;\n\tconst string_t& type;\n\tarrays_t& arrays;\n\tconst ipersistent::load_context& context;\n\tk3d::bool_t& loaded;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// load_arrays\n\ntemplate<typename arrays_t>\nvoid load_arrays(const element& Container, arrays_t& Arrays, const ipersistent::load_context& Context)\n{\n\tfor(size_t i = 0; i != Container.children.size(); ++i)\n\t{\n\t\tconst element& storage = Container.children[i];\n\n\t\tif(storage.name != \"array\")\n\t\t\tcontinue;\n\n\t\tconst string_t name = attribute_text(storage, \"name\");\n\t\tif(name.empty())\n\t\t{\n\t\t\tlog() << error << \"unnamed array will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(Arrays.count(name))\n\t\t{\n\t\t\tlog() << error << \"duplicate array [\" << name << \"] will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst string_t type = attribute_text(storage, \"type\");\n\t\tif(type.empty())\n\t\t{\n\t\t\tlog() << error << \"untyped array [\" << name << \"] will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tbool loaded = false;\n\t\tboost::mpl::for_each<named_array_types>(load_typed_array<arrays_t>(storage, name, type, Arrays, Context, loaded));\n\t\tif(!loaded)\n\t\t\tlog() << error << \"array [\" << name << \"] with unknown type [\" << type << \"] will not be loaded\" << std::endl;\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_arrays\n\nvoid load_arrays(const element& Container, const string_t& Storage, mesh::named_arrays_t& Arrays, const ipersistent::load_context& Context)\n{\n\tconst element* const container = find_element(Container, Storage);\n\tif(!container)\n\t\treturn;\n\n\tload_arrays<mesh::named_arrays_t>(*container, Arrays, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load_arrays\n\nvoid load_arrays(const element& Container, const string_t& Storage, mesh::table_t& Table, const ipersistent::load_context& Context)\n{\n\tconst element* const container = find_element(Container, Storage);\n\tif(!container)\n\t\treturn;\n\n\tload_arrays<mesh::table_t>(*container, Table, Context);\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// save\n\nvoid save(const mesh& Mesh, element& Container, const ipersistent::save_context& Context)\n{\n\t// Save points ...\n\tdetail::save_array(Container, element(\"points\"), Mesh.points, Context);\n\tdetail::save_array(Container, element(\"point_selection\"), Mesh.point_selection, Context);\n\tdetail::save_arrays(Container, element(\"point_attributes\"), Mesh.point_attributes, Context);\n\n\t// Save primitives ...\n\tif(Mesh.primitives.size())\n\t{\n\t\telement& xml_primitives = Container.append(element(\"primitives\"));\n\t\tfor(mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tif(!primitive->get())\n\t\t\t\tcontinue;\n\n\t\t\telement& xml_primitive = xml_primitives.append(element(\"primitive\", attribute(\"type\", (*primitive)->type)));\n\n\t\t\tif((*primitive)->structure.size())\n\t\t\t{\n\t\t\t\telement& xml_structure = xml_primitive.append(element(\"structure\"));\n\t\t\t\tfor(mesh::named_tables_t::const_iterator structure = (*primitive)->structure.begin(); structure != (*primitive)->structure.end(); ++structure)\n\t\t\t\t{\n\t\t\t\t\tdetail::save_arrays(xml_structure, element(\"table\", xml::attribute(\"type\", structure->first)), structure->second, Context);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif((*primitive)->attributes.size())\n\t\t\t{\n\t\t\t\telement& xml_attributes = xml_primitive.append(element(\"attributes\"));\n\t\t\t\tfor(mesh::named_tables_t::const_iterator attribute = (*primitive)->attributes.begin(); attribute != (*primitive)->attributes.end(); ++attribute)\n\t\t\t\t{\n\t\t\t\t\tdetail::save_arrays(xml_attributes, element(\"table\", xml::attribute(\"type\", attribute->first)), attribute->second, Context);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load\n\nvoid load(mesh& Mesh, element& Container, const ipersistent::load_context& Context)\n{\n\tdetail::load_array(Container, \"points\", Mesh.points, Context);\n\tdetail::load_array(Container, \"point_selection\", Mesh.point_selection, Context);\n\tdetail::load_arrays(Container, \"point_attributes\", Mesh.point_attributes, Context);\n\n\tif(const element* const xml_primitives = find_element(Container, \"primitives\"))\n\t{\n\t\tfor(element::elements_t::const_iterator xml_primitive = xml_primitives->children.begin(); xml_primitive != xml_primitives->children.end(); ++xml_primitive)\n\t\t{\n\t\t\tif(xml_primitive->name != \"primitive\")\n\t\t\t\tcontinue;\n\n\t\t\tmesh::primitive& primitive = Mesh.primitives.create(attribute_text(*xml_primitive, \"type\"));\n\n\t\t\tif(const element* const xml_structure = find_element(*xml_primitive, \"structure\"))\n\t\t\t{\n\t\t\t\tfor(element::elements_t::const_iterator xml_table = xml_structure->children.begin(); xml_table != xml_structure->children.end(); ++xml_table)\n\t\t\t\t{\n\t\t\t\t\tif(xml_table->name != \"table\")\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tmesh::table_t arrays;\n\t\t\t\t\tdetail::load_arrays(*xml_table, arrays, Context);\n\n\t\t\t\t\tprimitive.structure.insert(std::make_pair(attribute_text(*xml_table, \"type\"), arrays));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(const element* const xml_attributes = find_element(*xml_primitive, \"attributes\"))\n\t\t\t{\n\t\t\t\tfor(element::elements_t::const_iterator xml_table = xml_attributes->children.begin(); xml_table != xml_attributes->children.end(); ++xml_table)\n\t\t\t\t{\n\t\t\t\t\tif(xml_table->name != \"table\")\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tmesh::table_t arrays;\n\t\t\t\t\tdetail::load_arrays(*xml_table, arrays, Context);\n\n\t\t\t\t\tprimitive.attributes.insert(std::make_pair(attribute_text(*xml_table, \"type\"), arrays));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n/** \\todo Remove this block of code no later than version 1.0\n\nThis code has been left in-place in-case we ever need to load a K-3D file that contains pre-generic-primitive data.\nAssuming that that never happens, it should be safe to remove this code entirely for version 1.0.\n\n\tif(element* const container = find_element(Container, \"point_groups\"))\n\t{\n\t\tmesh::point_groups_t* const point_groups = &Mesh.point_groups.create();\n\t\tdetail::load_array(*container, \"first_points\", point_groups->first_points, Context);\n\t\tdetail::load_array(*container, \"point_counts\", point_groups->point_counts, Context);\n\t\tdetail::load_array(*container, \"materials\", point_groups->materials, Context);\n\t\tdetail::load_arrays(*container, \"constant_data\", point_groups->constant_data, Context);\n\t\tdetail::load_array(*container, \"points\", point_groups->points, Context);\n\t\tdetail::load_arrays(*container, \"varying_data\", point_groups->varying_data, Context);\n\t}\n\n\tif(element* const container = find_element(Container, \"linear_curve_groups\"))\n\t{\n\t\tmesh::linear_curve_groups_t* const linear_curve_groups = &Mesh.linear_curve_groups.create();\n\t\tdetail::load_array(*container, \"first_curves\", linear_curve_groups->first_curves, Context);\n\t\tdetail::load_array(*container, \"curve_counts\", linear_curve_groups->curve_counts, Context);\n\t\tdetail::load_array(*container, \"periodic_curves\", linear_curve_groups->periodic_curves, Context);\n\t\tdetail::load_array(*container, \"materials\", linear_curve_groups->materials, Context);\n\t\tdetail::load_arrays(*container, \"constant_data\", linear_curve_groups->constant_data, Context);\n\t\tdetail::load_array(*container, \"curve_first_points\", linear_curve_groups->curve_first_points, Context);\n\t\tdetail::load_array(*container, \"curve_point_counts\", linear_curve_groups->curve_point_counts, Context);\n\t\tdetail::load_array(*container, \"curve_selection\", linear_curve_groups->curve_selection, Context);\n\t\tdetail::load_arrays(*container, \"uniform_data\", linear_curve_groups->uniform_data, Context);\n\t\tdetail::load_array(*container, \"curve_points\", linear_curve_groups->curve_points, Context);\n\t}\n\n\tif(element* const container = find_element(Container, \"cubic_curve_groups\"))\n\t{\n\t\tmesh::cubic_curve_groups_t* const cubic_curve_groups = &Mesh.cubic_curve_groups.create();\n\t\tdetail::load_array(*container, \"first_curves\", cubic_curve_groups->first_curves, Context);\n\t\tdetail::load_array(*container, \"curve_counts\", cubic_curve_groups->curve_counts, Context);\n\t\tdetail::load_array(*container, \"periodic_curves\", cubic_curve_groups->periodic_curves, Context);\n\t\tdetail::load_array(*container, \"materials\", cubic_curve_groups->materials, Context);\n\t\tdetail::load_arrays(*container, \"constant_data\", cubic_curve_groups->constant_data, Context);\n\t\tdetail::load_array(*container, \"curve_first_points\", cubic_curve_groups->curve_first_points, Context);\n\t\tdetail::load_array(*container, \"curve_point_counts\", cubic_curve_groups->curve_point_counts, Context);\n\t\tdetail::load_array(*container, \"curve_selection\", cubic_curve_groups->curve_selection, Context);\n\t\tdetail::load_arrays(*container, \"uniform_data\", cubic_curve_groups->uniform_data, Context);\n\t\tdetail::load_array(*container, \"curve_points\", cubic_curve_groups->curve_points, Context);\n\t}\n\n\tif(element* const container = find_element(Container, \"nurbs_curve_groups\"))\n\t{\n\t\tboost::scoped_ptr<nurbs_curve::primitive> nurbs_curves(nurbs_curve::create(Mesh));\n\n\t\tdetail::load_array(*container, \"materials\", nurbs_curves->material, Context);\n\t\tdetail::load_arrays(*container, \"constant_data\", nurbs_curves->constant_data, Context);\n\t\tdetail::load_array(*container, \"curve_first_points\", nurbs_curves->curve_first_points, Context);\n\t\tdetail::load_array(*container, \"curve_point_counts\", nurbs_curves->curve_point_counts, Context);\n\t\tdetail::load_array(*container, \"curve_orders\", nurbs_curves->curve_orders, Context);\n\t\tdetail::load_array(*container, \"curve_first_knots\", nurbs_curves->curve_first_knots, Context);\n\t\tdetail::load_array(*container, \"curve_selection\", nurbs_curves->curve_selections, Context);\n\t\tdetail::load_arrays(*container, \"uniform_data\", nurbs_curves->uniform_data, Context);\n\t\tdetail::load_array(*container, \"curve_points\", nurbs_curves->curve_points, Context);\n\t\tdetail::load_array(*container, \"curve_point_weights\", nurbs_curves->curve_point_weights, Context);\n\t\tdetail::load_array(*container, \"curve_knots\", nurbs_curves->curve_knots, Context);\n\t}\n\n\tif(element* const container = find_element(Container, \"bilinear_patches\"))\n\t{\n\t\tmesh::bilinear_patches_t* const bilinear_patches = &Mesh.bilinear_patches.create();\n\t\tdetail::load_array(*container, \"patch_selection\", bilinear_patches->patch_selection, Context);\n\t\tdetail::load_array(*container, \"patch_materials\", bilinear_patches->patch_materials, Context);\n\t\tdetail::load_arrays(*container, \"constant_data\", bilinear_patches->constant_data, Context);\n\t\tdetail::load_arrays(*container, \"uniform_data\", bilinear_patches->uniform_data, Context);\n\t\tdetail::load_array(*container, \"patch_points\", bilinear_patches->patch_points, Context);\n\t\tdetail::load_arrays(*container, \"varying_data\", bilinear_patches->varying_data, Context);\n\t}\n\n\tif(element* const container = find_element(Container, \"bicubic_patches\"))\n\t{\n\t\tmesh::bicubic_patches_t* const bicubic_patches = &Mesh.bicubic_patches.create();\n\t\tdetail::load_array(*container, \"patch_selection\", bicubic_patches->patch_selection, Context);\n\t\tdetail::load_array(*container, \"patch_materials\", bicubic_patches->patch_materials, Context);\n\t\tdetail::load_arrays(*container, \"constant_data\", bicubic_patches->constant_data, Context);\n\t\tdetail::load_arrays(*container, \"uniform_data\", bicubic_patches->uniform_data, Context);\n\t\tdetail::load_array(*container, \"patch_points\", bicubic_patches->patch_points, Context);\n\t\tdetail::load_arrays(*container, \"varying_data\", bicubic_patches->varying_data, Context);\n\t}\n\n\tif(element* const container = find_element(Container, \"nurbs_patches\"))\n\t{\n\t\tboost::scoped_ptr<nurbs_patch::primitive> nurbs_patches(nurbs_patch::create(Mesh));\n\t\t\n\t\tdetail::load_array(*container, \"patch_first_points\", nurbs_patches->patch_first_points, Context);\n\t\tdetail::load_array(*container, \"patch_u_point_counts\", nurbs_patches->patch_u_point_counts, Context);\n\t\tdetail::load_array(*container, \"patch_v_point_counts\", nurbs_patches->patch_v_point_counts, Context);\n\t\tdetail::load_array(*container, \"patch_u_orders\", nurbs_patches->patch_u_orders, Context);\n\t\tdetail::load_array(*container, \"patch_v_orders\", nurbs_patches->patch_v_orders, Context);\n\t\tdetail::load_array(*container, \"patch_u_first_knots\", nurbs_patches->patch_u_first_knots, Context);\n\t\tdetail::load_array(*container, \"patch_v_first_knots\", nurbs_patches->patch_v_first_knots, Context);\n\t\tdetail::load_array(*container, \"patch_selection\", nurbs_patches->patch_selections, Context);\n\t\tdetail::load_array(*container, \"patch_materials\", nurbs_patches->patch_materials, Context);\n\t\tdetail::load_arrays(*container, \"constant_data\", nurbs_patches->constant_data, Context);\n\t\tdetail::load_arrays(*container, \"uniform_data\", nurbs_patches->uniform_data, Context);\n\t\tdetail::load_array(*container, \"patch_points\", nurbs_patches->patch_points, Context);\n\t\tdetail::load_array(*container, \"patch_point_weights\", nurbs_patches->patch_point_weights, Context);\n\t\tdetail::load_array(*container, \"patch_u_knots\", nurbs_patches->patch_u_knots, Context);\n\t\tdetail::load_array(*container, \"patch_v_knots\", nurbs_patches->patch_v_knots, Context);\n\t\tdetail::load_arrays(*container, \"varying_data\", nurbs_patches->varying_data, Context);\n\t\tdetail::load_array(*container, \"patch_trim_curve_loop_counts\", nurbs_patches->patch_trim_loop_counts, Context);\n\t\tdetail::load_array(*container, \"patch_first_trim_curve_loops\", nurbs_patches->patch_first_trim_loops, Context);\n\t\tdetail::load_array(*container, \"trim_points\", nurbs_patches->points, Context);\n\t\tdetail::load_array(*container, \"trim_point_selection\", nurbs_patches->point_selections, Context);\n\t\tdetail::load_array(*container, \"first_trim_curves\", nurbs_patches->trim_loop_first_curves, Context);\n\t\tdetail::load_array(*container, \"trim_curve_counts\", nurbs_patches->trim_loop_curve_counts, Context);\n\t\tdetail::load_array(*container, \"trim_curve_loop_selection\", nurbs_patches->trim_loop_selections, Context);\n\t\tdetail::load_array(*container, \"trim_curve_first_points\", nurbs_patches->curve_first_points, Context);\n\t\tdetail::load_array(*container, \"trim_curve_point_counts\", nurbs_patches->curve_point_counts, Context);\n\t\tdetail::load_array(*container, \"trim_curve_orders\", nurbs_patches->curve_orders, Context);\n\t\tdetail::load_array(*container, \"trim_curve_first_knots\", nurbs_patches->curve_first_knots, Context);\n\t\tdetail::load_array(*container, \"trim_curve_selection\", nurbs_patches->curve_selections, Context);\n\t\tdetail::load_array(*container, \"trim_curve_points\", nurbs_patches->curve_points, Context);\n\t\tdetail::load_array(*container, \"trim_curve_point_weights\", nurbs_patches->curve_point_weights, Context);\n\t\tdetail::load_array(*container, \"trim_curve_knots\", nurbs_patches->curve_knots, Context);\n\t}\n\n\tif(element* const container = find_element(Container, \"polyhedra\"))\n\t{\n\t\tmesh::polyhedra_t* const polyhedra = &Mesh.polyhedra.create();\n\t\tdetail::load_array(*container, \"first_faces\", polyhedra->first_faces, Context);\n\t\tdetail::load_array(*container, \"face_counts\", polyhedra->face_counts, Context);\n\t\tdetail::load_array(*container, \"types\", polyhedra->types, Context);\n\t\tdetail::load_arrays(*container, \"constant_data\", polyhedra->constant_data, Context);\n\t\tdetail::load_array(*container, \"face_first_loops\", polyhedra->face_first_loops, Context);\n\t\tdetail::load_array(*container, \"face_loop_counts\", polyhedra->face_loop_counts, Context);\n\t\tdetail::load_array(*container, \"face_selection\", polyhedra->face_selection, Context);\n\t\tdetail::load_array(*container, \"face_materials\", polyhedra->face_materials, Context);\n\t\tdetail::load_arrays(*container, \"uniform_data\", polyhedra->uniform_data, Context);\n\t\tdetail::load_array(*container, \"loop_first_edges\", polyhedra->loop_first_edges, Context);\n\t\tdetail::load_array(*container, \"edge_points\", polyhedra->edge_points, Context);\n\t\tdetail::load_array(*container, \"clockwise_edges\", polyhedra->clockwise_edges, Context);\n\t\tdetail::load_array(*container, \"edge_selection\", polyhedra->edge_selection, Context);\n\t\tdetail::load_arrays(*container, \"face_varying_data\", polyhedra->face_varying_data, Context);\n\t}\n\n\tif(element* const container = find_element(Container, \"blobbies\"))\n\t{\n\t\tmesh::blobbies_t* const blobbies = &Mesh.blobbies.create();\n\t\tdetail::load_array(*container, \"first_primitives\", blobbies->first_primitives, Context);\n\t\tdetail::load_array(*container, \"primitive_counts\", blobbies->primitive_counts, Context);\n\t\tdetail::load_array(*container, \"first_operators\", blobbies->first_operators, Context);\n\t\tdetail::load_array(*container, \"operator_counts\", blobbies->operator_counts, Context);\n\t\tdetail::load_array(*container, \"materials\", blobbies->materials, Context);\n\t\tdetail::load_arrays(*container, \"constant_data\", blobbies->constant_data, Context);\n\t\tdetail::load_arrays(*container, \"uniform_data\", blobbies->uniform_data, Context);\n\t\tdetail::load_array(*container, \"primitives\", blobbies->primitives, Context);\n\t\tdetail::load_array(*container, \"primitive_first_floats\", blobbies->primitive_first_floats, Context);\n\t\tdetail::load_array(*container, \"primitive_float_counts\", blobbies->primitive_float_counts, Context);\n\t\tdetail::load_arrays(*container, \"varying_data\", blobbies->varying_data, Context);\n\t\tdetail::load_arrays(*container, \"point_attributes\", blobbies->point_attributes, Context);\n\t\tdetail::load_array(*container, \"operators\", blobbies->operators, Context);\n\t\tdetail::load_array(*container, \"operator_first_operands\", blobbies->operator_first_operands, Context);\n\t\tdetail::load_array(*container, \"operator_operand_counts\", blobbies->operator_operand_counts, Context);\n\t\tdetail::load_array(*container, \"floats\", blobbies->floats, Context);\n\t\tdetail::load_array(*container, \"operands\", blobbies->operands, Context);\n\t}\n*/\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// save\n\nvoid save(const selection::set& Selection, element& Container, const ipersistent::save_context& Context)\n{\n\telement& xml_set = Container.append(element(\"set\"));\n\tfor(selection::set::const_iterator storage = Selection.begin(); storage != Selection.end(); ++storage)\n\t{\n\t\tif(!storage->get())\n\t\t\tcontinue;\n\n\t\telement& xml_storage = xml_set.append(element(\"storage\", attribute(\"type\", (*storage)->type)));\n\n\t\tif((*storage)->structure.size())\n\t\t{\n\t\t\tdetail::save_arrays(xml_storage, element(\"structure\"), (*storage)->structure, Context);\n\t\t}\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// load\n\nvoid load(selection::set& Selection, element& Container, const ipersistent::load_context& Context)\n{\n\tif(const element* const xml_set = find_element(Container, \"set\"))\n\t{\n\t\tfor(element::elements_t::const_iterator xml_storage = xml_set->children.begin(); xml_storage != xml_set->children.end(); ++xml_storage)\n\t\t{\n\t\t\tif(xml_storage->name != \"storage\")\n\t\t\t\tcontinue;\n\n\t\t\tselection::storage& storage = Selection.create(attribute_text(*xml_storage, \"type\"));\n\t\t\tif(const element* const xml_structure = find_element(*xml_storage, \"structure\"))\n\t\t\t\tdetail::load_arrays(*xml_structure, storage.structure, Context);\n\t\t}\n\t}\n}\n\n/** \\todo Remove this block of code no later than version 1.0\n\nThis code has been left in-place in-case we ever need to load a K-3D file that contains pre-array data\ninto a legacy mesh.  Assuming that that never happens, it should be safe to remove this code entirely for version 1.0.\n\nnamespace detail\n{\n\ntemplate<typename data_t>\nbool load_parameter(const string_t& XMLType, const string_t& Name, const string_t& Type, const string_t& Value, legacy::parameters_t& Parameters)\n{\n\tif(XMLType != Type)\n\t\treturn false;\n\n\tParameters[Name] = from_string<data_t>(Value, data_t());\n\treturn true;\n}\n\nvoid load_parameters(const element& Element, legacy::parameters_t& Parameters)\n{\n\tfor(element::elements_t::const_iterator xml_parameter = Element.children.begin(); xml_parameter != Element.children.end(); ++xml_parameter)\n\t{\n\t\tif(xml_parameter->name != \"parameter\")\n\t\t\tcontinue;\n\n\t\tconst string_t name = attribute_text(*xml_parameter, \"name\");\n\t\tif(name.empty())\n\t\t{\n\t\t\tlog() << error << k3d_file_reference << \" unnamed parameter will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst string_t type = attribute_text(*xml_parameter, \"type\");\n\t\tif(type.empty())\n\t\t{\n\t\t\tlog() << error << k3d_file_reference << \" parameter [\" << name << \"] with unknown type will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst string_t value = attribute_text(*xml_parameter, \"value\");\n\n\t\tif(load_parameter<ri::integer>(\"integer\", name, type, value, Parameters)) continue;\n\t\tif(load_parameter<ri::real>(\"real\", name, type, value, Parameters)) continue;\n\t\tif(load_parameter<ri::string>(\"string\", name, type, value, Parameters)) continue;\n\t\tif(load_parameter<ri::point>(\"point\", name, type, value, Parameters)) continue;\n\t\tif(load_parameter<ri::vector>(\"vector\", name, type, value, Parameters)) continue;\n//\t\tif(load_parameter<ri::normal>(\"normal\", name, type, value, Parameters)) continue;\n\t\tif(load_parameter<ri::color>(\"color\", name, type, value, Parameters)) continue;\n\t\tif(load_parameter<ri::hpoint>(\"hpoint\", name, type, value, Parameters)) continue;\n\t\tif(load_parameter<bool>(\"bool\", name, type, value, Parameters)) continue;\n//\t\tif(load_parameter<ri::matrix>(\"matrix\", name, type, value, Parameters)) continue;\n\n\t\tlog() << error << k3d_file_reference << \" parameter [\" << name << \"] with unknown type [\" << type << \"] will not be loaded\" << std::endl;\n\t}\n}\n\nvoid load_parameters(const element& Element, const string_t& StorageClass, legacy::parameters_t& Parameters)\n{\n\tfor(element::elements_t::const_iterator xml_parameters = Element.children.begin(); xml_parameters != Element.children.end(); ++xml_parameters)\n\t{\n\t\tif(xml_parameters->name != \"parameters\")\n\t\t\tcontinue;\n\n\t\tstring_t storage_class = attribute_text(*xml_parameters, \"storageclass\");\n\t\tif(storage_class.empty())\n\t\t\tstorage_class = attribute_text(*xml_parameters, \"type\");\n\t\tif(storage_class != StorageClass)\n\t\t\tcontinue;\n\n\t\tload_parameters(*xml_parameters, Parameters);\n\t}\n}\n\nvoid load_parameters(const element& Element, const ri::storage_class_t StorageClass, legacy::parameters_t& Parameters)\n{\n\tload_parameters(Element, string_cast(StorageClass), Parameters);\n}\n\nvoid load_varying_parameters(const element& Element, boost::array<legacy::parameters_t, 4>& Parameters)\n{\n\tfor(element::elements_t::const_iterator xml_parameters = Element.children.begin(); xml_parameters != Element.children.end(); ++xml_parameters)\n\t{\n\t\tif(xml_parameters->name != \"parameters\")\n\t\t\tcontinue;\n\n\t\tstring_t storage_class = attribute_text(*xml_parameters, \"storageclass\");\n\t\tif(storage_class.empty())\n\t\t\tstorage_class = attribute_text(*xml_parameters, \"type\");\n\t\tstring_t keyword(\"varying\");\n\t\tif(storage_class != string_cast(keyword))\n\t\t\tcontinue;\n\n\t\tif(xml_parameters->children.size() != 4)\n\t\t{\n\t\t\tlog() << error << k3d_file_reference << \" varying parameters with incorrect child count will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tload_parameters(xml_parameters->children[0], Parameters[0]);\n\t\tload_parameters(xml_parameters->children[1], Parameters[1]);\n\t\tload_parameters(xml_parameters->children[2], Parameters[2]);\n\t\tload_parameters(xml_parameters->children[3], Parameters[3]);\n\t}\n}\n\ntemplate<typename ContainerT>\nvoid load_varying_parameters(const element& Element, ContainerT& Parameters, const unsigned long VaryingCount)\n{\n\tfor(element::elements_t::const_iterator xml_parameters = Element.children.begin(); xml_parameters != Element.children.end(); ++xml_parameters)\n\t{\n\t\tif(xml_parameters->name != \"parameters\")\n\t\t\tcontinue;\n\n\t\tstring_t storage_class = attribute_text(*xml_parameters, \"storageclass\");\n\t\tif(storage_class.empty())\n\t\t\tstorage_class = attribute_text(*xml_parameters, \"type\");\n\t\tstring_t keyword(\"varying\");\n\t\tif(storage_class != string_cast(keyword))\n\t\t\tcontinue;\n\n\t\tif(xml_parameters->children.size() != VaryingCount)\n\t\t{\n\t\t\tlog() << error << k3d_file_reference << \" varying parameters require \" << VaryingCount << \" values, found \" << xml_parameters->children.size() << \", will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor(element::elements_t::const_iterator xml_parameters2 = xml_parameters->children.begin(); xml_parameters2 != xml_parameters->children.end(); ++xml_parameters2)\n\t\t{\n\t\t\tParameters.push_back(legacy::parameters_t());\n\t\t\tload_parameters(*xml_parameters2, Parameters.back());\n\t\t}\n\t}\n}\n\n} // namespace detail\n\nvoid load_tags(const element& Element, legacy::parameters_t& Parameters)\n{\n\tload_parameters(Element, \"tag\", Parameters);\n}\n\nvoid load(legacy::mesh& Mesh, element& XML, const ipersistent::load_context& Context)\n{\n\t// Load points ...\n\tif(element* const xml_points = find_element(XML, \"points\"))\n\t{\n\t\tfor(element::elements_t::const_iterator xml_point = xml_points->children.begin(); xml_point != xml_points->children.end(); ++xml_point)\n\t\t{\n\t\t\tif(xml_point->name != \"point\")\n\t\t\t\tcontinue;\n\n\t\t\tMesh.points.push_back(new legacy::point(attribute_value<point3>(*xml_point, \"position\", point3(0, 0, 0))));\n\t\t\tdetail::load_parameters(*xml_point, ri::VERTEX, Mesh.points.back()->point_attributes);\n\t\t\tdetail::load_tags(*xml_point, Mesh.points.back()->tags);\n\t\t}\n\t}\n\n\t// Load point groups ...\n\tif(element* const xml_point_groups = find_element(XML, \"pointgroups\"))\n\t{\n\t\tfor(element::elements_t::iterator xml_group = xml_point_groups->children.begin(); xml_group != xml_point_groups->children.end(); ++xml_group)\n\t\t{\n\t\t\tif(xml_group->name != \"group\")\n\t\t\t\tcontinue;\n\n\t\t\tlegacy::point_group* const group = new legacy::point_group();\n\t\t\tgroup->material = dynamic_cast<imaterial*>(Context.lookup.lookup_object(attribute_value<ipersistent_lookup::id_type>(*xml_group, \"material\", 0)));\n\t\t\tMesh.point_groups.push_back(group);\n\n\t\t\telement* const xml_points = find_element(*xml_group, \"points\");\n\t\t\tif(xml_points)\n\t\t\t{\n\t\t\t\tstd::istringstream points_buffer(xml_points->text);\n\t\t\t\tfor(std::istream_iterator<unsigned long> point(points_buffer); point != std::istream_iterator<unsigned long>(); ++point)\n\t\t\t\t{\n\t\t\t\t\tconst unsigned long point_index = *point - 1;\n\t\t\t\t\treturn_if_fail(point_index < Mesh.points.size());\n\t\t\t\t\tgroup->points.push_back(Mesh.points[point_index]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdetail::load_parameters(*xml_group, ri::CONSTANT, group->constant_data);\n\t\t}\n\t}\n\n\t// Load polyhedra ...\n\tif(element* const xml_polyhedra = find_element(XML, \"polyhedra\"))\n\t{\n\t\tfor(element::elements_t::iterator xml_polyhedron = xml_polyhedra->children.begin(); xml_polyhedron != xml_polyhedra->children.end(); ++xml_polyhedron)\n\t\t{\n\t\t\tif(xml_polyhedron->name != \"polyhedron\")\n\t\t\t\tcontinue;\n\n\t\t\tk3d::legacy::polyhedron* const polyhedron = new k3d::legacy::polyhedron();\n\n\t\t\tpolyhedron->type = attribute_value(*xml_polyhedron, \"type\", legacy::polyhedron::POLYGONS);\n\t\t\tMesh.polyhedra.push_back(polyhedron);\n\n\t\t\tdetail::load_tags(*xml_polyhedron, polyhedron->tags);\n\n\t\t\t// Load edges ...\n\t\t\ttypedef std::vector<legacy::split_edge*> edges_t;\n\t\t\tedges_t edges;\n\t\t\tif(element* const xml_edges = find_element(*xml_polyhedron, \"edges\"))\n\t\t\t{\n\t\t\t\t//const unsigned long edge_count = std::count_if(xml_edges->children.begin(), xml_edges->children.end(), same_name(\"edge\"));\n\t\t\t\t// Above statement often crashes, count eges the old fashioned way\n\t\t\t\tunsigned long edge_count = 0;\n\t\t\t\tfor(element::elements_t::const_iterator xe = xml_edges->children.begin(); xe != xml_edges->children.end(); ++xe)\n\t\t\t\t{\n\t\t\t\t\tif((*xe).name == \"edge\")\n\t\t\t\t\t\t++edge_count;\n\t\t\t\t}\n\n\t\t\t\tedges.resize(edge_count);\n\t\t\t\tfor(edges_t::iterator edge = edges.begin(); edge != edges.end(); ++edge)\n\t\t\t\t\t*edge = new legacy::split_edge(0, 0, 0);\n\n\t\t\t\tedges_t::iterator edge = edges.begin();\n\t\t\t\tfor(element::elements_t::iterator xml_edge = xml_edges->children.begin(); xml_edge != xml_edges->children.end(); ++xml_edge)\n\t\t\t\t{\n\t\t\t\t\tif(xml_edge->name != \"edge\")\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tunsigned long vertex_index = attribute_value<unsigned long>(*xml_edge, \"vertex\", 0);\n\t\t\t\t\treturn_if_fail(vertex_index <= Mesh.points.size());\n\n\t\t\t\t\tunsigned long face_clockwise_index = attribute_value<unsigned long>(*xml_edge, \"faceclockwise\", 0);\n\t\t\t\t\treturn_if_fail(face_clockwise_index <= edges.size());\n\n\t\t\t\t\tunsigned long companion_index = attribute_value<unsigned long>(*xml_edge, \"companion\", 0);\n\t\t\t\t\treturn_if_fail(companion_index <= edges.size());\n\n\t\t\t\t\tif(vertex_index)\n\t\t\t\t\t\t(*edge)->vertex = Mesh.points[vertex_index-1];\n\n\t\t\t\t\tif(face_clockwise_index)\n\t\t\t\t\t\t(*edge)->face_clockwise = edges[face_clockwise_index-1];\n\n\t\t\t\t\tif(companion_index)\n\t\t\t\t\t\t(*edge)->companion = edges[companion_index-1];\n\n\t\t\t\t\tdetail::load_parameters(*xml_edge, ri::FACEVARYING, (*edge)->facevarying_data);\n\t\t\t\t\tdetail::load_tags(*xml_edge, (*edge)->tags);\n\n\t\t\t\t\t++edge;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Load faces ...\n\t\t\tif(element* const xml_faces = find_element(*xml_polyhedron, \"faces\"))\n\t\t\t{\n\t\t\t\tfor(element::elements_t::iterator xml_face = xml_faces->children.begin(); xml_face != xml_faces->children.end(); ++xml_face)\n\t\t\t\t{\n\t\t\t\t\tif(xml_face->name != \"face\")\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tunsigned long first_edge_index = attribute_value<unsigned long>(*xml_face, \"firstedge\", 0);\n\t\t\t\t\treturn_if_fail(first_edge_index);\n\t\t\t\t\treturn_if_fail(first_edge_index <= edges.size());\n\n\t\t\t\t\tk3d::legacy::face* const face = new k3d::legacy::face(\n\t\t\t\t\t\tfirst_edge_index ? edges[first_edge_index-1] : 0,\n\t\t\t\t\t\tdynamic_cast<imaterial*>(Context.lookup.lookup_object(attribute_value<ipersistent_lookup::id_type>(*xml_face, \"material\", 0))));\n\t\t\t\t\tpolyhedron->faces.push_back(face);\n\n\t\t\t\t\tdetail::load_parameters(*xml_face, ri::UNIFORM, face->uniform_data);\n\t\t\t\t\tdetail::load_tags(*xml_face, face->tags);\n\n\t\t\t\t\tif(element* const xml_holes = find_element(*xml_face, \"holes\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(element::elements_t::iterator xml_hole = xml_holes->children.begin(); xml_hole != xml_holes->children.end(); ++xml_hole)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(xml_hole->name != \"hole\")\n\t\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t\tunsigned long first_edge_index = attribute_value<unsigned long>(*xml_hole, \"firstedge\", 0);\n\t\t\t\t\t\t\treturn_if_fail(first_edge_index);\n\t\t\t\t\t\t\treturn_if_fail(first_edge_index <= edges.size());\n\n\t\t\t\t\t\t\tface->holes.push_back(first_edge_index ? edges[first_edge_index-1] : 0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Load linear curve groups ...\n\tif(element* const xml_linear_curve_groups = find_element(XML, \"linearcurvegroups\"))\n\t{\n\t\tfor(element::elements_t::iterator xml_group = xml_linear_curve_groups->children.begin(); xml_group != xml_linear_curve_groups->children.end(); ++xml_group)\n\t\t{\n\t\t\tif(xml_group->name != \"group\")\n\t\t\t\tcontinue;\n\n\t\t\tlegacy::linear_curve_group* const group = new legacy::linear_curve_group();\n\t\t\tgroup->wrap = attribute_value<bool>(*xml_group, \"wrap\", false);\n\t\t\tgroup->material = dynamic_cast<imaterial*>(Context.lookup.lookup_object(attribute_value<ipersistent_lookup::id_type>(*xml_group, \"material\", 0)));\n\t\t\tdetail::load_parameters(*xml_group, ri::CONSTANT, group->constant_data);\n\t\t\tMesh.linear_curve_groups.push_back(group);\n\n\t\t\telement* const xml_curves = find_element(*xml_group, \"curves\");\n\t\t\tif(!xml_curves)\n\t\t\t\tcontinue;\n\n\t\t\tfor(element::elements_t::iterator xml_curve = xml_curves->children.begin(); xml_curve != xml_curves->children.end(); ++xml_curve)\n\t\t\t{\n\t\t\t\tif(xml_curve->name != \"curve\")\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlegacy::linear_curve* const curve = new legacy::linear_curve();\n\t\t\t\tdetail::load_parameters(*xml_curve, ri::UNIFORM, curve->uniform_data);\n\t\t\t\tgroup->curves.push_back(curve);\n\n\t\t\t\telement* const xml_control_points = find_element(*xml_curve, \"controlpoints\");\n\t\t\t\tif(!xml_control_points)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tstd::istringstream points_buffer(xml_control_points->text);\n\t\t\t\tfor(std::istream_iterator<unsigned long> control_point(points_buffer); control_point != std::istream_iterator<unsigned long>(); ++control_point)\n\t\t\t\t{\n\t\t\t\t\tconst unsigned long control_point_index = *control_point - 1;\n\t\t\t\t\treturn_if_fail(control_point_index < Mesh.points.size());\n\t\t\t\t\tcurve->control_points.push_back(Mesh.points[control_point_index]);\n\t\t\t\t}\n\t\t\t\tdetail::load_varying_parameters(*xml_curve, curve->varying_data, varying_count(*curve, group->wrap));\n\t\t\t}\n\t\t}\n\t}\n\n\t// Load cubic curve groups ...\n\tif(element* const xml_cubic_curve_groups = find_element(XML, \"cubiccurvegroups\"))\n\t{\n\t\tfor(element::elements_t::iterator xml_group = xml_cubic_curve_groups->children.begin(); xml_group != xml_cubic_curve_groups->children.end(); ++xml_group)\n\t\t{\n\t\t\tif(xml_group->name != \"group\")\n\t\t\t\tcontinue;\n\n\t\t\tlegacy::cubic_curve_group* const group = new legacy::cubic_curve_group();\n\t\t\tgroup->wrap = attribute_value<bool>(*xml_group, \"wrap\", false);\n\t\t\tgroup->material = dynamic_cast<imaterial*>(Context.lookup.lookup_object(attribute_value<ipersistent_lookup::id_type>(*xml_group, \"material\", 0)));\n\t\t\tdetail::load_parameters(*xml_group, ri::CONSTANT, group->constant_data);\n\t\t\tMesh.cubic_curve_groups.push_back(group);\n\n\t\t\telement* const xml_curves = find_element(*xml_group, \"curves\");\n\t\t\tif(!xml_curves)\n\t\t\t\tcontinue;\n\n\t\t\tfor(element::elements_t::iterator xml_curve = xml_curves->children.begin(); xml_curve != xml_curves->children.end(); ++xml_curve)\n\t\t\t{\n\t\t\t\tif(xml_curve->name != \"curve\")\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlegacy::cubic_curve* const curve = new legacy::cubic_curve();\n\t\t\t\tdetail::load_parameters(*xml_curve, ri::UNIFORM, curve->uniform_data);\n\t\t\t\tgroup->curves.push_back(curve);\n\n\t\t\t\telement* const xml_control_points = find_element(*xml_curve, \"controlpoints\");\n\t\t\t\tif(!xml_control_points)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tstd::istringstream points_buffer(xml_control_points->text);\n\t\t\t\tfor(std::istream_iterator<unsigned long> control_point(points_buffer); control_point != std::istream_iterator<unsigned long>(); ++control_point)\n\t\t\t\t{\n\t\t\t\t\tconst unsigned long control_point_index = *control_point - 1;\n\t\t\t\t\treturn_if_fail(control_point_index < Mesh.points.size());\n\t\t\t\t\tcurve->control_points.push_back(Mesh.points[control_point_index]);\n\t\t\t\t}\n\n\t\t\t\tdetail::load_varying_parameters(*xml_curve, curve->varying_data, varying_count(*curve, group->wrap));\n\t\t\t}\n\t\t}\n\t}\n\n\t// Load NURBS curve groups ...\n\tif(element* const xml_nucurve_groups = find_element(XML, \"nucurvegroups\"))\n\t{\n\t\tfor(element::elements_t::iterator xml_group = xml_nucurve_groups->children.begin(); xml_group != xml_nucurve_groups->children.end(); ++xml_group)\n\t\t{\n\t\t\tif(xml_group->name != \"group\")\n\t\t\t\tcontinue;\n\n\t\t\tlegacy::nucurve_group* const group = new legacy::nucurve_group();\n\t\t\tgroup->material = dynamic_cast<imaterial*>(Context.lookup.lookup_object(attribute_value<ipersistent_lookup::id_type>(*xml_group, \"material\", 0)));\n\t\t\tMesh.nucurve_groups.push_back(group);\n\n\t\t\telement* const xml_curves = find_element(*xml_group, \"curves\");\n\t\t\tif(!xml_curves)\n\t\t\t\tcontinue;\n\n\t\t\tfor(element::elements_t::iterator xml_curve = xml_curves->children.begin(); xml_curve != xml_curves->children.end(); ++xml_curve)\n\t\t\t{\n\t\t\t\tif(xml_curve->name != \"curve\")\n\t\t\t\t\tcontinue;\n\n\t\t\t\telement* const xml_knot_vector = find_element(*xml_curve, \"knotvector\");\n\t\t\t\telement* const xml_control_points = find_element(*xml_curve, \"controlpoints\");\n\t\t\t\telement* const xml_weights = find_element(*xml_curve, \"weights\");\n\n\t\t\t\tif(xml_knot_vector && xml_control_points && xml_weights)\n\t\t\t\t{\n\t\t\t\t\tlegacy::nucurve* const curve = new legacy::nucurve();\n\t\t\t\t\tcurve->order = attribute_value<unsigned long>(*xml_curve, \"order\", 0);\n\t\t\t\t\tgroup->curves.push_back(curve);\n\n\t\t\t\t\tstd::istringstream knots_buffer(xml_knot_vector->text);\n\t\t\t\t\tstd::copy(std::istream_iterator<double>(knots_buffer), std::istream_iterator<double>(), std::back_inserter(curve->knots));\n\n\t\t\t\t\tstd::istringstream points_buffer(xml_control_points->text);\n\t\t\t\t\tstd::istringstream weights_buffer(xml_weights->text);\n\n\t\t\t\t\tstd::istream_iterator<unsigned long> control_point(points_buffer);\n\t\t\t\t\tstd::istream_iterator<double> weight(weights_buffer);\n\t\t\t\t\tfor(; control_point != std::istream_iterator<unsigned long>() && weight != std::istream_iterator<double>(); ++control_point, ++weight)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst unsigned long control_point_index = *control_point - 1;\n\t\t\t\t\t\treturn_if_fail(control_point_index < Mesh.points.size());\n\t\t\t\t\t\tcurve->control_points.push_back(legacy::nucurve::control_point(Mesh.points[control_point_index], *weight));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Load bilinear patches ...\n\tif(element* const xml_bilinear_patches = find_element(XML, \"bilinearpatches\"))\n\t{\n\t\tfor(element::elements_t::iterator xml_patch = xml_bilinear_patches->children.begin(); xml_patch != xml_bilinear_patches->children.end(); ++xml_patch)\n\t\t{\n\t\t\tif(xml_patch->name != \"patch\")\n\t\t\t\tcontinue;\n\n\t\t\tlegacy::bilinear_patch* const patch = new legacy::bilinear_patch();\n\t\t\tpatch->material = dynamic_cast<imaterial*>(Context.lookup.lookup_object(attribute_value<ipersistent_lookup::id_type>(*xml_patch, \"material\", 0)));\n\t\t\tMesh.bilinear_patches.push_back(patch);\n\n\t\t\telement* const xml_control_points = find_element(*xml_patch, \"controlpoints\");\n\t\t\tif(!xml_control_points)\n\t\t\t\tcontinue;\n\n\t\t\tunsigned long storage_index = 0;\n\t\t\tstd::istringstream points_buffer(xml_control_points->text);\n\t\t\tfor(std::istream_iterator<unsigned long> control_point(points_buffer); control_point != std::istream_iterator<unsigned long>(); ++control_point)\n\t\t\t{\n\t\t\t\treturn_if_fail(storage_index < 4);\n\n\t\t\t\tconst unsigned long control_point_index = *control_point - 1;\n\t\t\t\treturn_if_fail(control_point_index < Mesh.points.size());\n\t\t\t\tpatch->control_points[storage_index++] = Mesh.points[control_point_index];\n\t\t\t}\n\n\t\t\tdetail::load_parameters(*xml_patch, ri::UNIFORM, patch->uniform_data);\n\t\t\tdetail::load_varying_parameters(*xml_patch, patch->varying_data);\n\t\t}\n\t}\n\n\t// Load bicubic patches ...\n\tif(element* const xml_bicubic_patches = find_element(XML, \"bicubicpatches\"))\n\t{\n\t\tfor(element::elements_t::iterator xml_patch = xml_bicubic_patches->children.begin(); xml_patch != xml_bicubic_patches->children.end(); ++xml_patch)\n\t\t{\n\t\t\tif(xml_patch->name != \"patch\")\n\t\t\t\tcontinue;\n\n\t\t\tlegacy::bicubic_patch* const patch = new legacy::bicubic_patch();\n\t\t\tpatch->material = dynamic_cast<imaterial*>(Context.lookup.lookup_object(attribute_value<ipersistent_lookup::id_type>(*xml_patch, \"material\", 0)));\n\t\t\tMesh.bicubic_patches.push_back(patch);\n\n\t\t\telement* const xml_control_points = find_element(*xml_patch, \"controlpoints\");\n\t\t\tif(!xml_control_points)\n\t\t\t\tcontinue;\n\n\t\t\tunsigned long storage_index = 0;\n\t\t\tstd::istringstream points_buffer(xml_control_points->text);\n\t\t\tfor(std::istream_iterator<unsigned long> control_point(points_buffer); control_point != std::istream_iterator<unsigned long>(); ++control_point)\n\t\t\t{\n\t\t\t\treturn_if_fail(storage_index < 16);\n\n\t\t\t\tconst unsigned long control_point_index = *control_point - 1;\n\t\t\t\treturn_if_fail(control_point_index < Mesh.points.size());\n\t\t\t\tpatch->control_points[storage_index++] = Mesh.points[control_point_index];\n\t\t\t}\n\n\t\t\tdetail::load_parameters(*xml_patch, ri::UNIFORM, patch->uniform_data);\n\t\t\tdetail::load_varying_parameters(*xml_patch, patch->varying_data);\n\t\t}\n\t}\n\n\t// Load NURBS patches ...\n\tif(element* const xml_nupatches = find_element(XML, \"nupatches\"))\n\t{\n\t\tfor(element::elements_t::iterator xml_patch = xml_nupatches->children.begin(); xml_patch != xml_nupatches->children.end(); ++xml_patch)\n\t\t{\n\t\t\tif(xml_patch->name != \"patch\")\n\t\t\t\tcontinue;\n\n\t\t\telement* const xml_u_knot_vector = find_element(*xml_patch, \"uknotvector\");\n\t\t\telement* const xml_v_knot_vector = find_element(*xml_patch, \"vknotvector\");\n\t\t\telement* const xml_control_points = find_element(*xml_patch, \"controlpoints\");\n\t\t\telement* const xml_weights = find_element(*xml_patch, \"weights\");\n\n\t\t\tif(xml_u_knot_vector && xml_v_knot_vector && xml_control_points && xml_weights)\n\t\t\t{\n\t\t\t\tlegacy::nupatch* const patch = new legacy::nupatch();\n\t\t\t\tpatch->u_order = attribute_value<unsigned long>(*xml_patch, \"uorder\", 0);\n\t\t\t\tpatch->v_order = attribute_value<unsigned long>(*xml_patch, \"vorder\", 0);\n\t\t\t\tpatch->material = dynamic_cast<imaterial*>(Context.lookup.lookup_object(attribute_value<ipersistent_lookup::id_type>(*xml_patch, \"material\", 0)));\n\t\t\t\tMesh.nupatches.push_back(patch);\n\n\t\t\t\tstd::istringstream u_knots_buffer(xml_u_knot_vector->text);\n\t\t\t\tstd::copy(std::istream_iterator<double>(u_knots_buffer), std::istream_iterator<double>(), std::back_inserter(patch->u_knots));\n\n\t\t\t\tstd::istringstream v_knots_buffer(xml_v_knot_vector->text);\n\t\t\t\tstd::copy(std::istream_iterator<double>(v_knots_buffer), std::istream_iterator<double>(), std::back_inserter(patch->v_knots));\n\n\t\t\t\tstd::istringstream points_buffer(xml_control_points->text);\n\t\t\t\tstd::istringstream weights_buffer(xml_weights->text);\n\n\t\t\t\tstd::istream_iterator<unsigned long> control_point(points_buffer);\n\t\t\t\tstd::istream_iterator<double> weight(weights_buffer);\n\t\t\t\tfor(; control_point != std::istream_iterator<unsigned long>() && weight != std::istream_iterator<double>(); ++control_point, ++weight)\n\t\t\t\t{\n\t\t\t\t\tconst unsigned long control_point_index = *control_point - 1;\n\t\t\t\t\treturn_if_fail(control_point_index < Mesh.points.size());\n\t\t\t\t\tpatch->control_points.push_back(legacy::nupatch::control_point(Mesh.points[control_point_index], *weight));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n*/\n\n} // namespace xml\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/serialization_xml.h",
    "content": "#ifndef K3DSDK_SERIALIZATION_XML_H\n#define K3DSDK_SERIALIZATION_XML_H\n\n#include <k3dsdk/ipersistent.h>\n\nnamespace k3d\n{\n\nclass idocument;\nclass inode;\nclass mesh;\n\nnamespace selection { class set; }\n\nnamespace xml\n{\n\nclass element;\n\n/// Modifies an XML document as-needed so that both legacy and recent documents can be loaded with the same code\nvoid upgrade_document(element& XML);\n\n/// Serializes a document node to XML\nvoid save(inode& Node, element& XML, const ipersistent::save_context& Context);\n/// Loads a document node from XML\nvoid load(inode& Node, element& XML, const ipersistent::load_context& Context);\n\n/// Serializes a document pipeline to XML\nvoid save_pipeline(idocument& Document, element& XML, const ipersistent::save_context& Context);\n/// Loads a document pipeline from XML\nvoid load_pipeline(idocument& Document, element& XML, const ipersistent::load_context& Context);\n\n/// Serializes a mesh to XML \nvoid save(const mesh& Mesh, element& Container, const ipersistent::save_context& Context);\n/// Loads a mesh from XML \nvoid load(mesh& Mesh, element& Container, const ipersistent::load_context& Context);\n\n/// Serializes a selection to XML \nvoid save(const selection::set& Selection, element& Container, const ipersistent::save_context& Context);\n/// Loads a selection from XML \nvoid load(selection::set& Selection, element& Container, const ipersistent::load_context& Context);\n\n} // namespace xml\n\n} // namespace k3d\n\n#endif // !K3DSDK_SERIALIZATION_XML_H\n\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/CMakeLists.txt",
    "content": "PROJECT(k3dsdk-sgi-tesselator)\n\nFILE(GLOB HEADERS *.h)\nSET(SOURCES\n\tdict.c\n\tdict.h\n\tdict-list.h\n\tgeom.c\n\tgeom.h\n\tgluos.h\n\tmemalloc.c\n\tmemalloc.h\n\tmesh.c\n\tmesh.h\n\tnormal.c\n\tnormal.h\n\tpriorityq.c\n\tpriorityq-heap.h\n\tpriorityq-sort.h\n\trender.c\n\trender.h\n\tsweep.c\n\tsweep.h\n\ttess.c\n\ttess.h\n\ttessmono.c\n\ttessmono.h\n\t)\n\nSET_SOURCE_FILES_PROPERTIES(\n\tdict.c\n\tgeom.c\n\tmemalloc.c\n\tpriorityq.c\n\trender.c\n\ttess.c\n\tPROPERTIES COMPILE_FLAGS -w\n\t)\n\nK3D_ADD_LIBRARY(k3dsdk-sgi-tesselator SHARED ${SOURCES})\nK3D_GENERATE_DEF_FILE(k3dsdk-sgi-tesselator)\n\nINSTALL(TARGETS k3dsdk-sgi-tesselator\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/README",
    "content": "/*\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/README,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\nGeneral Polygon Tesselation\n---------------------------\n\n  This note describes a tesselator for polygons consisting of one or\n  more closed contours.  It is backward-compatible with the current\n  OpenGL Utilities tesselator, and is intended to replace it.  Here is\n  a summary of the major differences:\n\n   - input contours can be intersecting, self-intersecting, or degenerate.\n  \n   - supports a choice of several winding rules for determining which parts\n     of the polygon are on the \"interior\".  This makes it possible to do\n     CSG operations on polygons.\n  \n   - boundary extraction: instead of tesselating the polygon, returns a\n     set of closed contours which separate the interior from the exterior.\n  \n   - returns the output as a small number of triangle fans and strips,\n     rather than a list of independent triangles (when possible).\n  \n   - output is available as an explicit mesh (a quad-edge structure),\n     in addition to the normal callback interface.\n  \n   - the algorithm used is extremely robust.\n\n\nThe interface\n-------------\n\n  The tesselator state is maintained in a \"tesselator object\".\n  These are allocated and destroyed using\n\n     GLUtesselator *gluNewTess( void );\n     void gluDeleteTess( GLUtesselator *tess );\n\n  Several tesselator objects may be used simultaneously.\n\n  Inputs\n  ------\n  \n  The input contours are specified with the following routines:\n\n     void gluTessBeginPolygon( GLUtesselator *tess );\n     void gluTessBeginContour( GLUtesselator *tess );\n     void gluTessVertex( GLUtesselator *tess, GLUcoord coords[3], void *data );\n     void gluTessEndContour( GLUtesselator *tess );\n     void gluTessEndPolygon( GLUtesselator *tess );\n\n  Within each BeginPolygon/EndPolygon pair, there can be zero or more\n  calls to BeginContour/EndContour.  Within each contour, there are zero\n  or more calls to gluTessVertex().  The vertices specify a closed\n  contour (the last vertex of each contour is automatically linked to\n  the first).\n\n  \"coords\" give the coordinates of the vertex in 3-space.  For useful\n  results, all vertices should lie in some plane, since the vertices\n  are projected onto a plane before tesselation.  \"data\" is a pointer\n  to a user-defined vertex structure, which typically contains other\n  information such as color, texture coordinates, normal, etc.  It is\n  used to refer to the vertex during rendering.\n\n  The library can be compiled in single- or double-precision; the type\n  GLUcoord represents either \"float\" or \"double\" accordingly.  The GLU\n  version will be available in double-precision only.  Compile with\n  GLU_TESS_API_FLOAT defined to get the single-precision version.\n\n  When EndPolygon is called, the tesselation algorithm determines\n  which regions are interior to the given contours, according to one\n  of several \"winding rules\" described below.  The interior regions\n  are then tesselated, and the output is provided as callbacks.\n\n\n  Rendering Callbacks\n  -------------------\n\n  Callbacks are specified by the client using\n\n     void gluTessCallback( GLUtesselator *tess, GLenum which, void (*fn)());\n\n  If \"fn\" is NULL, any previously defined callback is discarded.\n  \n  The callbacks used to provide output are:\t/* which == */\n\n     void begin( GLenum type );\t\t\t/* GLU_TESS_BEGIN */\n     void edgeFlag( GLboolean flag );\t\t/* GLU_TESS_EDGE_FLAG */\n     void vertex( void *data );\t\t\t/* GLU_TESS_VERTEX */\n     void end( void );\t\t\t\t/* GLU_TESS_END */\n\n  Any of the callbacks may be left undefined; if so, the corresponding\n  information will not be supplied during rendering.\n\n  The \"begin\" callback indicates the start of a primitive; type is one\n  of GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, or GL_TRIANGLES (but see the\n  notes on \"boundary extraction\" below).\n  \n  It is followed by any number of \"vertex\" callbacks, which supply the\n  vertices in the same order as expected by the corresponding glBegin()\n  call.  After the last vertex of a given primitive, there is a callback\n  to \"end\".\n\n  If the \"edgeFlag\" callback is provided, no triangle fans or strips\n  will be used.  When edgeFlag is called, if \"flag\" is GL_TRUE then each\n  vertex which follows begins an edge which lies on the polygon boundary\n  (ie. an edge which separates an interior region from an exterior one).\n  If \"flag\" is GL_FALSE, each vertex which follows begins an edge which lies\n  in the polygon interior.  \"edgeFlag\" will be called before the first\n  call to \"vertex\".\n\n  Other Callbacks\n  ---------------\n\n   void mesh( GLUmesh *mesh );\t\t\t/* GLU_TESS_MESH */\n\n   - Returns an explicit mesh, represented using the quad-edge structure\n     (Guibas/Stolfi '85).  Other implementations of this interface might\n     use a different mesh structure, so this is available only only as an\n     SGI extension.  When the mesh is no longer needed, it should be freed\n     using\n\n\tvoid gluDeleteMesh( GLUmesh *mesh );\n\n     There is a brief description of this data structure in the include\n     file \"mesh.h\".  For the full details, see L. Guibas and J. Stolfi,\n     Primitives for the manipulation of general subdivisions and the\n     computation of Voronoi diagrams, ACM Transactions on Graphics,\n     4(2):74-123, April 1985.  For an introduction, see the course notes\n     for CS348a, \"Mathematical Foundations of Computer Graphics\",\n     available at the Stanford bookstore (and taught during the fall\n     quarter).\n\n   void error( GLenum errno );\t\t\t/* GLU_TESS_ERROR */\n\n   - errno is one of\tGLU_TESS_MISSING_BEGIN_POLYGON,\n\t\t\tGLU_TESS_MISSING_END_POLYGON,\n\t\t\tGLU_TESS_MISSING_BEGIN_CONTOUR,\n\t\t\tGLU_TESS_MISSING_END_CONTOUR,\n\t\t\tGLU_TESS_COORD_TOO_LARGE,\n\t\t\tGLU_TESS_NEED_COMBINE_CALLBACK\n\n     The first four are obvious.  The interface recovers from these\n     errors by inserting the missing call(s).\n  \n     GLU_TESS_COORD_TOO_LARGE says that some vertex coordinate exceeded\n     the predefined constant GLU_TESS_MAX_COORD in absolute value, and\n     that the value has been clamped.  (Coordinate values must be small\n     enough so that two can be multiplied together without overflow.)\n\n     GLU_TESS_NEED_COMBINE_CALLBACK says that the algorithm detected an\n     intersection between two edges in the input data, and the \"combine\"\n     callback (below) was not provided.  No output will be generated.\n\n\n   void combine( GLUcoord coords[3], void *data[4],\t/* GLU_TESS_COMBINE */\n\t\t GLUcoord weight[4], void **outData );\n\n   - When the algorithm detects an intersection, or wishes to merge\n     features, it needs to create a new vertex.  The vertex is defined\n     as a linear combination of up to 4 existing vertices, referenced\n     by data[0..3].  The coefficients of the linear combination are\n     given by weight[0..3]; these weights always sum to 1.0.  All vertex\n     pointers are valid even when some of the weights are zero.\n     \"coords\" gives the location of the new vertex.\n\n     The user must allocate another vertex, interpolate parameters\n     using \"data\" and \"weights\", and return the new vertex pointer in\n     \"outData\".  This handle is supplied during rendering callbacks.\n     For example, if the polygon lies in an arbitrary plane in 3-space,\n     and we associate a color with each vertex, the combine callback might\n     look like this:\n    \n     void myCombine( GLUcoord coords[3], VERTEX *d[4],\n                     GLUcoord w[4], VERTEX **dataOut )\n     {\n        VERTEX *new = new_vertex();\n       \n        new->x = coords[0];\n        new->y = coords[1];\n        new->z = coords[2];\n        new->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + w[3]*d[3]->r;\n        new->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + w[3]*d[3]->g;\n        new->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + w[3]*d[3]->b;\n        new->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + w[3]*d[3]->a;\n        *dataOut = new;\n     }\n\n     If the algorithm detects an intersection, then the \"combine\" callback\n     must be defined, and must write a non-NULL pointer into \"dataOut\".\n     Otherwise the GLU_TESS_NEED_COMBINE_CALLBACK error occurs, and no\n     output is generated.  This is the only error that can occur during\n     tesselation and rendering.\n\n\n  Control over Tesselation\n  ------------------------\n  \n   void gluTessProperty( GLUtesselator *tess, GLenum which, GLUcoord value );\n\n   Properties defined:\n\n    - GLU_TESS_WINDING_RULE.  Possible values:\n\n\t  GLU_TESS_WINDING_ODD\n\t  GLU_TESS_WINDING_NONZERO\n\t  GLU_TESS_WINDING_POSITIVE\n\t  GLU_TESS_WINDING_NEGATIVE\n\t  GLU_TESS_WINDING_ABS_GEQ_TWO\n\n      The input contours parition the plane into regions.  A winding\n      rule determines which of these regions are inside the polygon.\n      \n      For a single contour C, the winding number of a point x is simply\n      the signed number of revolutions we make around x as we travel\n      once around C (where CCW is positive).  When there are several\n      contours, the individual winding numbers are summed.  This\n      procedure associates a signed integer value with each point x in\n      the plane.  Note that the winding number is the same for all\n      points in a single region.\n\n      The winding rule classifies a region as \"inside\" if its winding\n      number belongs to the chosen category (odd, nonzero, positive,\n      negative, or absolute value of at least two).  The current GLU\n      tesselator implements the \"odd\" rule.  The \"nonzero\" rule is another\n      common way to define the interior.  The other three rules are\n      useful for polygon CSG operations (see below).\n\n    - GLU_TESS_BOUNDARY_ONLY.  Values: TRUE (non-zero) or FALSE (zero).\n\n      If TRUE, returns a set of closed contours which separate the\n      polygon interior and exterior (rather than a tesselation).\n      Exterior contours are oriented CCW with respect to the normal,\n      interior contours are oriented CW.  The GLU_TESS_BEGIN callback\n      uses the type GL_LINE_LOOP for each contour.\n      \n    - GLU_TESS_TOLERANCE.  Value: a real number between 0.0 and 1.0.\n\n      This specifies a tolerance for merging features to reduce the size\n      of the output.  For example, two vertices which are very close to\n      each other might be replaced by a single vertex.  The tolerance\n      is multiplied by the largest coordinate magnitude of any input vertex;\n      this specifies the maximum distance that any feature can move as the\n      result of a single merge operation.  If a single feature takes part\n      in several merge operations, the total distance moved could be larger.\n\n      Feature merging is completely optional; the tolerance is only a hint.\n      The implementation is free to merge in some cases and not in others,\n      or to never merge features at all.  The default tolerance is zero.\n      \n      The current implementation merges vertices only if they are exactly\n      coincident, regardless of the current tolerance.  A vertex is\n      spliced into an edge only if the implementation is unable to\n      distinguish which side of the edge the vertex lies on.\n      Two edges are merged only when both endpoints are identical.\n\n\n   void gluTessNormal( GLUtesselator *tess,\n\t\t      GLUcoord x, GLUcoord y, GLUcoord z )\n\n    - Lets the user supply the polygon normal, if known.  All input data\n      is projected into a plane perpendicular to the normal before\n      tesselation.  All output triangles are oriented CCW with\n      respect to the normal (CW orientation can be obtained by\n      reversing the sign of the supplied normal).  For example, if\n      you know that all polygons lie in the x-y plane, call\n      \"gluTessNormal(tess, 0.0, 0.0, 1.0)\" before rendering any polygons.\n      \n    - If the supplied normal is (0,0,0) (the default value), the\n      normal is determined as follows.  The direction of the normal,\n      up to its sign, is found by fitting a plane to the vertices,\n      without regard to how the vertices are connected.  It is\n      expected that the input data lies approximately in plane;\n      otherwise projection perpendicular to the computed normal may\n      substantially change the geometry.  The sign of the normal is\n      chosen so that the sum of the signed areas of all input contours\n      is non-negative (where a CCW contour has positive area).\n    \n    - The supplied normal persists until it is changed by another\n      call to gluTessNormal.\n\n\n  Backward compatibility with the GLU tesselator\n  ----------------------------------------------\n\n  The preferred interface is the one described above.  The following\n  routines are obsolete, and are provided only for backward compatibility:\n\n    typedef GLUtesselator GLUtriangulatorObj;\t/* obsolete name */\n\n    void gluBeginPolygon( GLUtesselator *tess );\n    void gluNextContour( GLUtesselator *tess, GLenum type );\n    void gluEndPolygon( GLUtesselator *tess );\n  \n  \"type\" is one of GLU_EXTERIOR, GLU_INTERIOR, GLU_CCW, GLU_CW, or\n  GLU_UNKNOWN.  It is ignored by the current GLU tesselator.\n  \n  GLU_BEGIN, GLU_VERTEX, GLU_END, GLU_ERROR, and GLU_EDGE_FLAG are defined\n  as synonyms for GLU_TESS_BEGIN, GLU_TESS_VERTEX, GLU_TESS_END,\n  GLU_TESS_ERROR, and GLU_TESS_EDGE_FLAG.\n\n\nPolygon CSG operations\n----------------------\n\n  The features of the tesselator make it easy to find the union, difference,\n  or intersection of several polygons.\n\n  First, assume that each polygon is defined so that the winding number\n  is 0 for each exterior region, and 1 for each interior region.  Under\n  this model, CCW contours define the outer boundary of the polygon, and\n  CW contours define holes.  Contours may be nested, but a nested\n  contour must be oriented oppositely from the contour that contains it.\n\n  If the original polygons do not satisfy this description, they can be\n  converted to this form by first running the tesselator with the\n  GLU_TESS_BOUNDARY_ONLY property turned on.  This returns a list of\n  contours satisfying the restriction above.  By allocating two\n  tesselator objects, the callbacks from one tesselator can be fed\n  directly to the input of another.\n\n  Given two or more polygons of the form above, CSG operations can be\n  implemented as follows:\n\n  Union\n     Draw all the input contours as a single polygon.  The winding number\n     of each resulting region is the number of original polygons\n     which cover it.  The union can be extracted using the\n     GLU_TESS_WINDING_NONZERO or GLU_TESS_WINDING_POSITIVE winding rules.\n     Note that with the nonzero rule, we would get the same result if\n     all contour orientations were reversed.\n\n  Intersection (two polygons at a time only)\n     Draw a single polygon using the contours from both input polygons.\n     Extract the result using GLU_TESS_WINDING_ABS_GEQ_TWO.  (Since this\n     winding rule looks at the absolute value, reversing all contour\n     orientations does not change the result.)\n\n  Difference\n  \n     Suppose we want to compute A \\ (B union C union D).  Draw a single\n     polygon consisting of the unmodified contours from A, followed by\n     the contours of B,C,D with the vertex order reversed (this changes\n     the winding number of the interior regions to -1).  To extract the\n     result, use the GLU_TESS_WINDING_POSITIVE rule.\n   \n     If B,C,D are the result of a GLU_TESS_BOUNDARY_ONLY call, an\n     alternative to reversing the vertex order is to reverse the sign of\n     the supplied normal.  For example in the x-y plane, call\n     gluTessNormal( tess, 0.0, 0.0, -1.0 ).\n \n\nPerformance\n-----------\n\n  The tesselator is not intended for immediate-mode rendering; when\n  possible the output should be cached in a user structure or display\n  list.  General polygon tesselation is an inherently difficult problem,\n  especially given the goal of extreme robustness.\n\n  The implementation makes an effort to output a small number of fans\n  and strips; this should improve the rendering performance when the\n  output is used in a display list.\n\n  Single-contour input polygons are first tested to see whether they can\n  be rendered as a triangle fan with respect to the first vertex (to\n  avoid running the full decomposition algorithm on convex polygons).\n  Non-convex polygons may be rendered by this \"fast path\" as well, if\n  the algorithm gets lucky in its choice of a starting vertex.\n\n  For best performance follow these guidelines:\n\n   - supply the polygon normal, if available, using gluTessNormal().\n     This represents about 10% of the computation time.  For example,\n     if all polygons lie in the x-y plane, use gluTessNormal(tess,0,0,1).\n\n   - render many polygons using the same tesselator object, rather than\n     allocating a new tesselator for each one.  (In a multi-threaded,\n     multi-processor environment you may get better performance using\n     several tesselators.)\n\n\nComparison with the GLU tesselator\n----------------------------------\n\n  On polygons which make it through the \"fast path\", the tesselator is\n  3 to 5 times faster than the GLU tesselator.\n\n  On polygons which don't make it through the fast path (but which don't\n  have self-intersections or degeneracies), it is about 2 times slower.\n\n  On polygons with self-intersections or degeneraces, there is nothing\n  to compare against.\n\n  The new tesselator generates many more fans and strips, reducing the\n  number of vertices that need to be sent to the hardware.\n\n  Key to the statistics:\n\n\tvert\t\tnumber of input vertices on all contours\n\tcntr\t\tnumber of input contours\n\ttri\t\tnumber of triangles in all output primitives\n\tstrip\t\tnumber of triangle strips\n\tfan\t\tnumber of triangle fans\n\tind\t\tnumber of independent triangles\n\tms\t\tnumber of milliseconds for tesselation\n\t\t\t(on a 150MHz R4400 Indy)\n\n  Convex polygon examples:\n\nNew:     3 vert,   1 cntr,     1 tri,   0 strip,   0 fan,     1 ind,  0.0459 ms\nOld:     3 vert,   1 cntr,     1 tri,   0 strip,   0 fan,     1 ind,   0.149 ms\nNew:     4 vert,   1 cntr,     2 tri,   0 strip,   1 fan,     0 ind,  0.0459 ms\nOld:     4 vert,   1 cntr,     2 tri,   0 strip,   0 fan,     2 ind,   0.161 ms\nNew:    36 vert,   1 cntr,    34 tri,   0 strip,   1 fan,     0 ind,   0.153 ms\nOld:    36 vert,   1 cntr,    34 tri,   0 strip,   0 fan,    34 ind,   0.621 ms\n\n  Concave single-contour polygons:\n\nNew:     5 vert,   1 cntr,     3 tri,   0 strip,   1 fan,     0 ind,   0.052 ms\nOld:     5 vert,   1 cntr,     3 tri,   0 strip,   0 fan,     3 ind,   0.252 ms\nNew:    19 vert,   1 cntr,    17 tri,   2 strip,   2 fan,     1 ind,   0.911 ms\nOld:    19 vert,   1 cntr,    17 tri,   0 strip,   0 fan,    17 ind,   0.529 ms\nNew:   151 vert,   1 cntr,   149 tri,  13 strip,  18 fan,     3 ind,    6.82 ms\nOld:   151 vert,   1 cntr,   149 tri,   0 strip,   3 fan,   143 ind,     2.7 ms\nNew:   574 vert,   1 cntr,   572 tri,  59 strip,  54 fan,    11 ind,    26.6 ms\nOld:   574 vert,   1 cntr,   572 tri,   0 strip,  31 fan,   499 ind,    12.4 ms\n\n  Multiple contours, but no intersections:\n\nNew:     7 vert,   2 cntr,     7 tri,   1 strip,   0 fan,     0 ind,   0.527 ms\nOld:     7 vert,   2 cntr,     7 tri,   0 strip,   0 fan,     7 ind,   0.274 ms\nNew:    81 vert,   6 cntr,    89 tri,   9 strip,   7 fan,     6 ind,    3.88 ms\nOld:    81 vert,   6 cntr,    89 tri,   0 strip,  13 fan,    61 ind,     2.2 ms\nNew:   391 vert,  19 cntr,   413 tri,  37 strip,  32 fan,    26 ind,    20.2 ms\nOld:   391 vert,  19 cntr,   413 tri,   0 strip,  25 fan,   363 ind,    8.68 ms\n\n  Self-intersecting and degenerate examples:\n\nBowtie:  4 vert,   1 cntr,     2 tri,   0 strip,   0 fan,     2 ind,   0.483 ms\nStar:    5 vert,   1 cntr,     5 tri,   0 strip,   0 fan,     5 ind,    0.91 ms\nRandom: 24 vert,   7 cntr,    46 tri,   2 strip,  12 fan,     7 ind,    5.32 ms\nFont:  333 vert,   2 cntr,   331 tri,  32 strip,  16 fan,     3 ind,    14.1 ms\n:      167 vert,  35 cntr,   254 tri,   8 strip,  56 fan,    52 ind,    46.3 ms\n:       78 vert,   1 cntr,  2675 tri, 148 strip, 207 fan,   180 ind,     243 ms\n:    12480 vert,   2 cntr, 12478 tri, 736 strip,1275 fan,     5 ind,    1010 ms\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/alg-outline",
    "content": "/*\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/alg-outline,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\nThis is only a very brief overview.  There is quite a bit of\nadditional documentation in the source code itself.\n\n\nGoals of robust tesselation\n---------------------------\n\nThe tesselation algorithm is fundamentally a 2D algorithm.  We\ninitially project all data into a plane; our goal is to robustly\ntesselate the projected data.  The same topological tesselation is\nthen applied to the input data.\n\nTopologically, the output should always be a tesselation.  If the\ninput is even slightly non-planar, then some triangles will\nnecessarily be back-facing when viewed from some angles, but the goal\nis to minimize this effect.\n\nThe algorithm needs some capability of cleaning up the input data as\nwell as the numerical errors in its own calculations.  One way to do\nthis is to specify a tolerance as defined above, and clean up the\ninput and output during the line sweep process.  At the very least,\nthe algorithm must handle coincident vertices, vertices incident to an\nedge, and coincident edges.\n\n\nPhases of the algorithm\n-----------------------\n\n1. Find the polygon normal N.\n2. Project the vertex data onto a plane.  It does not need to be\n   perpendicular to the normal, eg. we can project onto the plane\n   perpendicular to the coordinate axis whose dot product with N\n   is largest.\n3. Using a line-sweep algorithm, partition the plane into x-monotone\n   regions.  Any vertical line intersects an x-monotone region in\n   at most one interval.\n4. Triangulate the x-monotone regions.\n5. Group the triangles into strips and fans.\n\n\nFinding the normal vector\n-------------------------\n\nA common way to find a polygon normal is to compute the signed area\nwhen the polygon is projected along the three coordinate axes.  We\ncan't do this, since contours can have zero area without being\ndegenerate (eg. a bowtie).\n\nWe fit a plane to the vertex data, ignoring how they are connected\ninto contours.  Ideally this would be a least-squares fit; however for\nour purpose the accuracy of the normal is not important.  Instead we\nfind three vertices which are widely separated, and compute the normal\nto the triangle they form.  The vertices are chosen so that the\ntriangle has an area at least 1/sqrt(3) times the largest area of any\ntriangle formed using the input vertices.  \n\nThe contours do affect the orientation of the normal; after computing\nthe normal, we check that the sum of the signed contour areas is\nnon-negative, and reverse the normal if necessary.\n\n\nProjecting the vertices\n-----------------------\n\nWe project the vertices onto a plane perpendicular to one of the three\ncoordinate axes.  This helps numerical accuracy by removing a\ntransformation step between the original input data and the data\nprocessed by the algorithm.  The projection also compresses the input\ndata; the 2D distance between vertices after projection may be smaller\nthan the original 2D distance.  However by choosing the coordinate\naxis whose dot product with the normal is greatest, the compression\nfactor is at most 1/sqrt(3).\n\nEven though the *accuracy* of the normal is not that important (since\nwe are projecting perpendicular to a coordinate axis anyway), the\n*robustness* of the computation is important.  For example, if there\nare many vertices which lie almost along a line, and one vertex V\nwhich is well-separated from the line, then our normal computation\nshould involve V otherwise the results will be garbage.\n\nThe advantage of projecting perpendicular to the polygon normal is\nthat computed intersection points will be as close as possible to\ntheir ideal locations.  To get this behavior, define TRUE_PROJECT.\n\n\nThe Line Sweep\n--------------\n\nThere are three data structures: the mesh, the event queue, and the\nedge dictionary.\n\nThe mesh is a \"quad-edge\" data structure which records the topology of\nthe current decomposition; for details see the include file \"mesh.h\".\n\nThe event queue simply holds all vertices (both original and computed\nones), organized so that we can quickly extract the vertex with the\nminimum x-coord (and among those, the one with the minimum y-coord).\n\nThe edge dictionary describes the current intersection of the sweep\nline with the regions of the polygon.  This is just an ordering of the\nedges which intersect the sweep line, sorted by their current order of\nintersection.  For each pair of edges, we store some information about\nthe monotone region between them -- these are call \"active regions\"\n(since they are crossed by the current sweep line).\n\nThe basic algorithm is to sweep from left to right, processing each\nvertex.  The processed portion of the mesh (left of the sweep line) is\na planar decomposition.  As we cross each vertex, we update the mesh\nand the edge dictionary, then we check any newly adjacent pairs of\nedges to see if they intersect.\n\nA vertex can have any number of edges.  Vertices with many edges can\nbe created as vertices are merged and intersection points are\ncomputed.  For unprocessed vertices (right of the sweep line), these\nedges are in no particular order around the vertex; for processed\nvertices, the topological ordering should match the geometric ordering.\n\nThe vertex processing happens in two phases: first we process are the\nleft-going edges (all these edges are currently in the edge\ndictionary).  This involves:\n\n - deleting the left-going edges from the dictionary;\n - relinking the mesh if necessary, so that the order of these edges around\n   the event vertex matches the order in the dictionary;\n - marking any terminated regions (regions which lie between two left-going\n   edges) as either \"inside\" or \"outside\" according to their winding number.\n\nWhen there are no left-going edges, and the event vertex is in an\n\"interior\" region, we need to add an edge (to split the region into\nmonotone pieces).  To do this we simply join the event vertex to the\nrightmost left endpoint of the upper or lower edge of the containing\nregion.\n\nThen we process the right-going edges.  This involves:\n\n - inserting the edges in the edge dictionary;\n - computing the winding number of any newly created active regions.\n   We can compute this incrementally using the winding of each edge\n   that we cross as we walk through the dictionary.\n - relinking the mesh if necessary, so that the order of these edges around\n   the event vertex matches the order in the dictionary;\n - checking any newly adjacent edges for intersection and/or merging.\n\nIf there are no right-going edges, again we need to add one to split\nthe containing region into monotone pieces.  In our case it is most\nconvenient to add an edge to the leftmost right endpoint of either\ncontaining edge; however we may need to change this later (see the\ncode for details).\n\n\nInvariants\n----------\n\nThese are the most important invariants maintained during the sweep.\nWe define a function VertLeq(v1,v2) which defines the order in which\nvertices cross the sweep line, and a function EdgeLeq(e1,e2; loc)\nwhich says whether e1 is below e2 at the sweep event location \"loc\".\nThis function is defined only at sweep event locations which lie\nbetween the rightmost left endpoint of {e1,e2}, and the leftmost right\nendpoint of {e1,e2}.\n\nInvariants for the Edge Dictionary.\n\n - Each pair of adjacent edges e2=Succ(e1) satisfies EdgeLeq(e1,e2)\n   at any valid location of the sweep event.\n - If EdgeLeq(e2,e1) as well (at any valid sweep event), then e1 and e2\n   share a common endpoint.\n - For each e in the dictionary, e->Dst has been processed but not e->Org.\n - Each edge e satisfies VertLeq(e->Dst,event) && VertLeq(event,e->Org)\n   where \"event\" is the current sweep line event.\n - No edge e has zero length.\n - No two edges have identical left and right endpoints.\n \nInvariants for the Mesh (the processed portion).\n\n - The portion of the mesh left of the sweep line is a planar graph,\n   ie. there is *some* way to embed it in the plane.\n - No processed edge has zero length.\n - No two processed vertices have identical coordinates.\n - Each \"inside\" region is monotone, ie. can be broken into two chains\n   of monotonically increasing vertices according to VertLeq(v1,v2)\n   - a non-invariant: these chains may intersect (slightly) due to\n     numerical errors, but this does not affect the algorithm's operation.\n\nInvariants for the Sweep.\n\n - If a vertex has any left-going edges, then these must be in the edge\n   dictionary at the time the vertex is processed.\n - If an edge is marked \"fixUpperEdge\" (it is a temporary edge introduced\n   by ConnectRightVertex), then it is the only right-going edge from\n   its associated vertex.  (This says that these edges exist only\n   when it is necessary.)\n\n\nRobustness\n----------\n\nThe key to the robustness of the algorithm is maintaining the\ninvariants above, especially the correct ordering of the edge\ndictionary.  We achieve this by:\n\n  1. Writing the numerical computations for maximum precision rather\n     than maximum speed.\n     \n  2. Making no assumptions at all about the results of the edge\n     intersection calculations -- for sufficiently degenerate inputs,\n     the computed location is not much better than a random number.\n     \n  3. When numerical errors violate the invariants, restore them\n     by making *topological* changes when necessary (ie. relinking\n     the mesh structure).\n     \n     \nTriangulation and Grouping\n--------------------------\n\nWe finish the line sweep before doing any triangulation.  This is\nbecause even after a monotone region is complete, there can be further\nchanges to its vertex data because of further vertex merging.\n\nAfter triangulating all monotone regions, we want to group the\ntriangles into fans and strips.  We do this using a greedy approach.\nThe triangulation itself is not optimized to reduce the number of\nprimitives; we just try to get a reasonable decomposition of the\ncomputed triangulation.\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/dict-list.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/dict-list.h,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#ifndef __dict_list_h_\n#define __dict_list_h_\n\n/* Use #define's so that another heap implementation can use this one */\n\n#define DictKey\t\tDictListKey\n#define Dict\t\tDictList\n#define DictNode\tDictListNode\n\n#define dictNewDict(frame,leq)\t\t__gl_dictListNewDict(frame,leq)\n#define dictDeleteDict(dict)\t\t__gl_dictListDeleteDict(dict)\n\n#define dictSearch(dict,key)\t\t__gl_dictListSearch(dict,key)\n#define dictInsert(dict,key)\t\t__gl_dictListInsert(dict,key)\n#define dictInsertBefore(dict,node,key)\t__gl_dictListInsertBefore(dict,node,key)\n#define dictDelete(dict,node)\t\t__gl_dictListDelete(dict,node)\n\n#define dictKey(n)\t\t\t__gl_dictListKey(n)\n#define dictSucc(n)\t\t\t__gl_dictListSucc(n)\n#define dictPred(n)\t\t\t__gl_dictListPred(n)\n#define dictMin(d)\t\t\t__gl_dictListMin(d)\n#define dictMax(d)\t\t\t__gl_dictListMax(d)\n\n\n\ntypedef void *DictKey;\ntypedef struct Dict Dict;\ntypedef struct DictNode DictNode;\n\nDict\t\t*dictNewDict(\n\t\t\tvoid *frame,\n\t\t\tint (*leq)(void *frame, DictKey key1, DictKey key2) );\n\t\t\t\nvoid\t\tdictDeleteDict( Dict *dict );\n\n/* Search returns the node with the smallest key greater than or equal\n * to the given key.  If there is no such key, returns a node whose\n * key is NULL.  Similarly, Succ(Max(d)) has a NULL key, etc.\n */\nDictNode\t*dictSearch( Dict *dict, DictKey key );\nDictNode\t*dictInsertBefore( Dict *dict, DictNode *node, DictKey key );\nvoid\t\tdictDelete( Dict *dict, DictNode *node );\n\n#define\t\t__gl_dictListKey(n)\t((n)->key)\n#define\t\t__gl_dictListSucc(n)\t((n)->next)\n#define\t\t__gl_dictListPred(n)\t((n)->prev)\n#define\t\t__gl_dictListMin(d)\t((d)->head.next)\n#define\t\t__gl_dictListMax(d)\t((d)->head.prev)\n#define\t       __gl_dictListInsert(d,k) (dictInsertBefore((d),&(d)->head,(k)))\n\n\n/*** Private data structures ***/\n\nstruct DictNode {\n  DictKey\tkey;\n  DictNode\t*next;\n  DictNode\t*prev;\n};\n\nstruct Dict {\n  DictNode\thead;\n  void\t\t*frame;\n  int\t\t(*leq)(void *frame, DictKey key1, DictKey key2);\n};\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/dict.c",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/dict.c,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#include <stddef.h>\n#include \"dict-list.h\"\n#include \"memalloc.h\"\n\n/* really __gl_dictListNewDict */\nDict *dictNewDict( void *frame,\n\t\t   int (*leq)(void *frame, DictKey key1, DictKey key2) )\n{\n  Dict *dict = (Dict *) memAlloc( sizeof( Dict ));\n  DictNode *head;\n\n  if (dict == NULL) return NULL;\n\n  head = &dict->head;\n\n  head->key = NULL;\n  head->next = head;\n  head->prev = head;\n\n  dict->frame = frame;\n  dict->leq = leq;\n\n  return dict;\n}\n\n/* really __gl_dictListDeleteDict */\nvoid dictDeleteDict( Dict *dict )\n{\n  DictNode *node;\n\n  for( node = dict->head.next; node != &dict->head; node = node->next ) {\n    memFree( node );\n  }\n  memFree( dict );\n}\n\n/* really __gl_dictListInsertBefore */\nDictNode *dictInsertBefore( Dict *dict, DictNode *node, DictKey key )\n{\n  DictNode *newNode;\n\n  do {\n    node = node->prev;\n  } while( node->key != NULL && ! (*dict->leq)(dict->frame, node->key, key));\n\n  newNode = (DictNode *) memAlloc( sizeof( DictNode ));\n  if (newNode == NULL) return NULL;\n\n  newNode->key = key;\n  newNode->next = node->next;\n  node->next->prev = newNode;\n  newNode->prev = node;\n  node->next = newNode;\n\n  return newNode;\n}\n\n/* really __gl_dictListDelete */\nvoid dictDelete( Dict *dict, DictNode *node ) /*ARGSUSED*/\n{\n  node->next->prev = node->prev;\n  node->prev->next = node->next;\n  memFree( node );\n}\n\n/* really __gl_dictListSearch */\nDictNode *dictSearch( Dict *dict, DictKey key )\n{\n  DictNode *node = &dict->head;\n\n  do {\n    node = node->next;\n  } while( node->key != NULL && ! (*dict->leq)(dict->frame, key, node->key));\n\n  return node;\n}\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/dict.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/dict.h,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#ifndef __dict_list_h_\n#define __dict_list_h_\n\n/* Use #define's so that another heap implementation can use this one */\n\n#define DictKey\t\tDictListKey\n#define Dict\t\tDictList\n#define DictNode\tDictListNode\n\n#define dictNewDict(frame,leq)\t\t__gl_dictListNewDict(frame,leq)\n#define dictDeleteDict(dict)\t\t__gl_dictListDeleteDict(dict)\n\n#define dictSearch(dict,key)\t\t__gl_dictListSearch(dict,key)\n#define dictInsert(dict,key)\t\t__gl_dictListInsert(dict,key)\n#define dictInsertBefore(dict,node,key)\t__gl_dictListInsertBefore(dict,node,key)\n#define dictDelete(dict,node)\t\t__gl_dictListDelete(dict,node)\n\n#define dictKey(n)\t\t\t__gl_dictListKey(n)\n#define dictSucc(n)\t\t\t__gl_dictListSucc(n)\n#define dictPred(n)\t\t\t__gl_dictListPred(n)\n#define dictMin(d)\t\t\t__gl_dictListMin(d)\n#define dictMax(d)\t\t\t__gl_dictListMax(d)\n\n\n\ntypedef void *DictKey;\ntypedef struct Dict Dict;\ntypedef struct DictNode DictNode;\n\nDict\t\t*dictNewDict(\n\t\t\tvoid *frame,\n\t\t\tint (*leq)(void *frame, DictKey key1, DictKey key2) );\n\t\t\t\nvoid\t\tdictDeleteDict( Dict *dict );\n\n/* Search returns the node with the smallest key greater than or equal\n * to the given key.  If there is no such key, returns a node whose\n * key is NULL.  Similarly, Succ(Max(d)) has a NULL key, etc.\n */\nDictNode\t*dictSearch( Dict *dict, DictKey key );\nDictNode\t*dictInsertBefore( Dict *dict, DictNode *node, DictKey key );\nvoid\t\tdictDelete( Dict *dict, DictNode *node );\n\n#define\t\t__gl_dictListKey(n)\t((n)->key)\n#define\t\t__gl_dictListSucc(n)\t((n)->next)\n#define\t\t__gl_dictListPred(n)\t((n)->prev)\n#define\t\t__gl_dictListMin(d)\t((d)->head.next)\n#define\t\t__gl_dictListMax(d)\t((d)->head.prev)\n#define\t       __gl_dictListInsert(d,k) (dictInsertBefore((d),&(d)->head,(k)))\n\n\n/*** Private data structures ***/\n\nstruct DictNode {\n  DictKey\tkey;\n  DictNode\t*next;\n  DictNode\t*prev;\n};\n\nstruct Dict {\n  DictNode\thead;\n  void\t\t*frame;\n  int\t\t(*leq)(void *frame, DictKey key1, DictKey key2);\n};\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/geom.c",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/geom.c,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#include \"gluos.h\"\n#include <assert.h>\n#include \"mesh.h\"\n#include \"geom.h\"\n\nint __gl_vertLeq( GLUvertex *u, GLUvertex *v )\n{\n  /* Returns TRUE if u is lexicographically <= v. */\n\n  return VertLeq( u, v );\n}\n\nGLdouble __gl_edgeEval( GLUvertex *u, GLUvertex *v, GLUvertex *w )\n{\n  /* Given three vertices u,v,w such that VertLeq(u,v) && VertLeq(v,w),\n   * evaluates the t-coord of the edge uw at the s-coord of the vertex v.\n   * Returns v->t - (uw)(v->s), ie. the signed distance from uw to v.\n   * If uw is vertical (and thus passes thru v), the result is zero.\n   *\n   * The calculation is extremely accurate and stable, even when v\n   * is very close to u or w.  In particular if we set v->t = 0 and\n   * let r be the negated result (this evaluates (uw)(v->s)), then\n   * r is guaranteed to satisfy MIN(u->t,w->t) <= r <= MAX(u->t,w->t).\n   */\n  GLdouble gapL, gapR;\n\n  assert( VertLeq( u, v ) && VertLeq( v, w ));\n  \n  gapL = v->s - u->s;\n  gapR = w->s - v->s;\n\n  if( gapL + gapR > 0 ) {\n    if( gapL < gapR ) {\n      return (v->t - u->t) + (u->t - w->t) * (gapL / (gapL + gapR));\n    } else {\n      return (v->t - w->t) + (w->t - u->t) * (gapR / (gapL + gapR));\n    }\n  }\n  /* vertical line */\n  return 0;\n}\n\nGLdouble __gl_edgeSign( GLUvertex *u, GLUvertex *v, GLUvertex *w )\n{\n  /* Returns a number whose sign matches EdgeEval(u,v,w) but which\n   * is cheaper to evaluate.  Returns > 0, == 0 , or < 0\n   * as v is above, on, or below the edge uw.\n   */\n  GLdouble gapL, gapR;\n\n  assert( VertLeq( u, v ) && VertLeq( v, w ));\n  \n  gapL = v->s - u->s;\n  gapR = w->s - v->s;\n\n  if( gapL + gapR > 0 ) {\n    return (v->t - w->t) * gapL + (v->t - u->t) * gapR;\n  }\n  /* vertical line */\n  return 0;\n}\n\n\n/***********************************************************************\n * Define versions of EdgeSign, EdgeEval with s and t transposed.\n */\n\nGLdouble __gl_transEval( GLUvertex *u, GLUvertex *v, GLUvertex *w )\n{\n  /* Given three vertices u,v,w such that TransLeq(u,v) && TransLeq(v,w),\n   * evaluates the t-coord of the edge uw at the s-coord of the vertex v.\n   * Returns v->s - (uw)(v->t), ie. the signed distance from uw to v.\n   * If uw is vertical (and thus passes thru v), the result is zero.\n   *\n   * The calculation is extremely accurate and stable, even when v\n   * is very close to u or w.  In particular if we set v->s = 0 and\n   * let r be the negated result (this evaluates (uw)(v->t)), then\n   * r is guaranteed to satisfy MIN(u->s,w->s) <= r <= MAX(u->s,w->s).\n   */\n  GLdouble gapL, gapR;\n\n  assert( TransLeq( u, v ) && TransLeq( v, w ));\n  \n  gapL = v->t - u->t;\n  gapR = w->t - v->t;\n\n  if( gapL + gapR > 0 ) {\n    if( gapL < gapR ) {\n      return (v->s - u->s) + (u->s - w->s) * (gapL / (gapL + gapR));\n    } else {\n      return (v->s - w->s) + (w->s - u->s) * (gapR / (gapL + gapR));\n    }\n  }\n  /* vertical line */\n  return 0;\n}\n\nGLdouble __gl_transSign( GLUvertex *u, GLUvertex *v, GLUvertex *w )\n{\n  /* Returns a number whose sign matches TransEval(u,v,w) but which\n   * is cheaper to evaluate.  Returns > 0, == 0 , or < 0\n   * as v is above, on, or below the edge uw.\n   */\n  GLdouble gapL, gapR;\n\n  assert( TransLeq( u, v ) && TransLeq( v, w ));\n  \n  gapL = v->t - u->t;\n  gapR = w->t - v->t;\n\n  if( gapL + gapR > 0 ) {\n    return (v->s - w->s) * gapL + (v->s - u->s) * gapR;\n  }\n  /* vertical line */\n  return 0;\n}\n\n\nint __gl_vertCCW( GLUvertex *u, GLUvertex *v, GLUvertex *w )\n{\n  /* For almost-degenerate situations, the results are not reliable.\n   * Unless the floating-point arithmetic can be performed without\n   * rounding errors, *any* implementation will give incorrect results\n   * on some degenerate inputs, so the client must have some way to\n   * handle this situation.\n   */\n  return (u->s*(v->t - w->t) + v->s*(w->t - u->t) + w->s*(u->t - v->t)) >= 0;\n}\n\n/* Given parameters a,x,b,y returns the value (b*x+a*y)/(a+b),\n * or (x+y)/2 if a==b==0.  It requires that a,b >= 0, and enforces\n * this in the rare case that one argument is slightly negative.\n * The implementation is extremely stable numerically.\n * In particular it guarantees that the result r satisfies\n * MIN(x,y) <= r <= MAX(x,y), and the results are very accurate\n * even when a and b differ greatly in magnitude.\n */\n#define RealInterpolate(a,x,b,y)\t\t\t\\\n  (a = (a < 0) ? 0 : a, b = (b < 0) ? 0 : b,\t\t\\\n  ((a <= b) ? ((b == 0) ? ((x+y) / 2)\t\t\t\\\n                        : (x + (y-x) * (a/(a+b))))\t\\\n            : (y + (x-y) * (b/(a+b)))))\n\n#ifndef FOR_TRITE_TEST_PROGRAM\n#define Interpolate(a,x,b,y)\tRealInterpolate(a,x,b,y)\n#else\n\n/* Claim: the ONLY property the sweep algorithm relies on is that\n * MIN(x,y) <= r <= MAX(x,y).  This is a nasty way to test that.\n */\n#include <stdlib.h>\nextern int RandomInterpolate;\n\nGLdouble Interpolate( GLdouble a, GLdouble x, GLdouble b, GLdouble y)\n{\nprintf(\"*********************%d\\n\",RandomInterpolate);\n  if( RandomInterpolate ) {\n    a = 1.2 * drand48() - 0.1;\n    a = (a < 0) ? 0 : ((a > 1) ? 1 : a);\n    b = 1.0 - a;\n  }\n  return RealInterpolate(a,x,b,y);\n}\n\n#endif\n\n#define Swap(a,b)\tif (1) { GLUvertex *t = a; a = b; b = t; } else\n\nvoid __gl_edgeIntersect( GLUvertex *o1, GLUvertex *d1,\n\t\t\t GLUvertex *o2, GLUvertex *d2,\n\t\t\t GLUvertex *v )\n/* Given edges (o1,d1) and (o2,d2), compute their point of intersection.\n * The computed point is guaranteed to lie in the intersection of the\n * bounding rectangles defined by each edge.\n */\n{\n  GLdouble z1, z2;\n\n  /* This is certainly not the most efficient way to find the intersection\n   * of two line segments, but it is very numerically stable.\n   *\n   * Strategy: find the two middle vertices in the VertLeq ordering,\n   * and interpolate the intersection s-value from these.  Then repeat\n   * using the TransLeq ordering to find the intersection t-value.\n   */\n\n  if( ! VertLeq( o1, d1 )) { Swap( o1, d1 ); }\n  if( ! VertLeq( o2, d2 )) { Swap( o2, d2 ); }\n  if( ! VertLeq( o1, o2 )) { Swap( o1, o2 ); Swap( d1, d2 ); }\n\n  if( ! VertLeq( o2, d1 )) {\n    /* Technically, no intersection -- do our best */\n    v->s = (o2->s + d1->s) / 2;\n  } else if( VertLeq( d1, d2 )) {\n    /* Interpolate between o2 and d1 */\n    z1 = EdgeEval( o1, o2, d1 );\n    z2 = EdgeEval( o2, d1, d2 );\n    if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }\n    v->s = Interpolate( z1, o2->s, z2, d1->s );\n  } else {\n    /* Interpolate between o2 and d2 */\n    z1 = EdgeSign( o1, o2, d1 );\n    z2 = -EdgeSign( o1, d2, d1 );\n    if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }\n    v->s = Interpolate( z1, o2->s, z2, d2->s );\n  }\n\n  /* Now repeat the process for t */\n\n  if( ! TransLeq( o1, d1 )) { Swap( o1, d1 ); }\n  if( ! TransLeq( o2, d2 )) { Swap( o2, d2 ); }\n  if( ! TransLeq( o1, o2 )) { Swap( o1, o2 ); Swap( d1, d2 ); }\n\n  if( ! TransLeq( o2, d1 )) {\n    /* Technically, no intersection -- do our best */\n    v->t = (o2->t + d1->t) / 2;\n  } else if( TransLeq( d1, d2 )) {\n    /* Interpolate between o2 and d1 */\n    z1 = TransEval( o1, o2, d1 );\n    z2 = TransEval( o2, d1, d2 );\n    if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }\n    v->t = Interpolate( z1, o2->t, z2, d1->t );\n  } else {\n    /* Interpolate between o2 and d2 */\n    z1 = TransSign( o1, o2, d1 );\n    z2 = -TransSign( o1, d2, d1 );\n    if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }\n    v->t = Interpolate( z1, o2->t, z2, d2->t );\n  }\n}\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/geom.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n**\n** http://oss.sgi.com/projects/FreeB\n**\n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n**\n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n**\n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n*/\n\n#ifndef __geom_h_\n#define __geom_h_\n\n#include \"mesh.h\"\n\n#ifdef NO_BRANCH_CONDITIONS\n/* MIPS architecture has special instructions to evaluate boolean\n * conditions -- more efficient than branching, IF you can get the\n * compiler to generate the right instructions (SGI compiler doesn't)\n */\n#define VertEq(u,v)\t(((u)->s == (v)->s) & ((u)->t == (v)->t))\n#define VertLeq(u,v)\t(((u)->s < (v)->s) | \\\n                         ((u)->s == (v)->s & (u)->t <= (v)->t))\n#else\n#define VertEq(u,v)\t((u)->s == (v)->s && (u)->t == (v)->t)\n#define VertLeq(u,v)\t(((u)->s < (v)->s) || \\\n                         ((u)->s == (v)->s && (u)->t <= (v)->t))\n#endif\n\n#define EdgeEval(u,v,w) __gl_edgeEval(u,v,w)\n#define EdgeSign(u,v,w) __gl_edgeSign(u,v,w)\n\n/* Versions of VertLeq, EdgeSign, EdgeEval with s and t transposed. */\n\n#define TransLeq(u,v)\t(((u)->t < (v)->t) || \\\n                         ((u)->t == (v)->t && (u)->s <= (v)->s))\n#define TransEval(u,v,w)\t__gl_transEval(u,v,w)\n#define TransSign(u,v,w)\t__gl_transSign(u,v,w)\n\n\n#define EdgeGoesLeft(e) \tVertLeq( (e)->Dst, (e)->Org )\n#define EdgeGoesRight(e)\tVertLeq( (e)->Org, (e)->Dst )\n\n#undef\tABS\n#define ABS(x)\t((x) < 0 ? -(x) : (x))\n#define VertL1dist(u,v) (ABS(u->s - v->s) + ABS(u->t - v->t))\n\n#define VertCCW(u,v,w)\t__gl_vertCCW(u,v,w)\n\nint\t\t__gl_vertLeq( GLUvertex *u, GLUvertex *v );\nGLdouble\t__gl_edgeEval( GLUvertex *u, GLUvertex *v, GLUvertex *w );\nGLdouble\t__gl_edgeSign( GLUvertex *u, GLUvertex *v, GLUvertex *w );\nGLdouble\t__gl_transEval( GLUvertex *u, GLUvertex *v, GLUvertex *w );\nGLdouble\t__gl_transSign( GLUvertex *u, GLUvertex *v, GLUvertex *w );\nint\t\t__gl_vertCCW( GLUvertex *u, GLUvertex *v, GLUvertex *w );\nvoid\t\t__gl_edgeIntersect( GLUvertex *o1, GLUvertex *d1,\n\t\t\t\t    GLUvertex *o2, GLUvertex *d2,\n\t\t\t\t    GLUvertex *v );\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/gluos.h",
    "content": "/*\n** gluos.h - operating system dependencies for GLU\n**\n*/\n#ifdef __VMS\n#ifdef __cplusplus\n#pragma message disable nocordel\n#pragma message disable codeunreachable\n#pragma message disable codcauunr\n#endif\n#endif\n\n#ifdef __WATCOMC__\n/* Disable *lots* of warnings to get a clean build. I can't be bothered fixing the\n * code at the moment, as it is pretty ugly.\n */\n#pragma warning 7   10\n#pragma warning 13  10\n#pragma warning 14  10\n#pragma warning 367 10\n#pragma warning 379 10\n#pragma warning 726 10\n#pragma warning 836 10\n#endif\n\n#ifdef BUILD_FOR_SNAP\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <malloc.h>\n\n#elif defined(_WIN32)\n\n#include <stdlib.h>\t    /* For _MAX_PATH definition */\n#include <stdio.h>\n#include <malloc.h>\n\n#define WIN32_LEAN_AND_MEAN\n#define NOGDI\n#define NOIME\n#define NOMINMAX\n\n#define _WIN32_WINNT 0x0400\n#ifndef STRICT\n  #define STRICT 1\n#endif\n\n#include <windows.h>\n\n#define GLAPIENTRY\n\n/* Disable warnings */\n#pragma warning(disable : 4101)\n#pragma warning(disable : 4244)\n#pragma warning(disable : 4761)\n\n#if defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1300\n#pragma comment(linker, \"/OPT:NOWIN98\")\n#endif\n\n#elif defined(__OS2__)\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <malloc.h>\n#define WINGDIAPI\n\n#else\n\n/* Disable Microsoft-specific keywords */\n#define GLAPIENTRY\n#define WINGDIAPI\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/memalloc.c",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/memalloc.c,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#include \"memalloc.h\"\n#include \"string.h\"\n\nint __gl_memInit( size_t maxFast )\n{\n#ifndef NO_MALLOPT\n/*  mallopt( M_MXFAST, maxFast );*/\n#ifdef MEMORY_DEBUG\n  mallopt( M_DEBUG, 1 );\n#endif\n#endif\n   return 1;\n}\n\n#ifdef MEMORY_DEBUG\nvoid *__gl_memAlloc( size_t n )\n{\n  return memset( malloc( n ), 0xa5, n );\n}\n#endif\n\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/memalloc.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/memalloc.h,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#ifndef __memalloc_simple_h_\n#define __memalloc_simple_h_\n\n#include <stdlib.h>\n\n#define memRealloc\trealloc\n#define memFree\t\tfree\n\n#define memInit\t\t__gl_memInit\n/*extern void\t\t__gl_memInit( size_t );*/\nextern int\t\t__gl_memInit( size_t );\n\n#ifndef MEMORY_DEBUG\n#define memAlloc\tmalloc\n#else\n#define memAlloc\t__gl_memAlloc\nextern void *\t\t__gl_memAlloc( size_t );\n#endif\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/mesh.c",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/mesh.c,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#include \"gluos.h\"\n#include <stddef.h>\n#include <assert.h>\n#include \"mesh.h\"\n#include \"memalloc.h\"\n\n#define TRUE 1\n#define FALSE 0\n\nstatic GLUvertex *allocVertex()\n{\n   return (GLUvertex *)memAlloc( sizeof( GLUvertex ));\n}\n\nstatic GLUface *allocFace()\n{\n   return (GLUface *)memAlloc( sizeof( GLUface ));\n}\n\n/************************ Utility Routines ************************/\n\n/* Allocate and free half-edges in pairs for efficiency.\n * The *only* place that should use this fact is allocation/free.\n */\ntypedef struct { GLUhalfEdge e, eSym; } EdgePair;\n\n/* MakeEdge creates a new pair of half-edges which form their own loop.\n * No vertex or face structures are allocated, but these must be assigned\n * before the current edge operation is completed.\n */\nstatic GLUhalfEdge *MakeEdge( GLUhalfEdge *eNext )\n{\n  GLUhalfEdge *e;\n  GLUhalfEdge *eSym;\n  GLUhalfEdge *ePrev;\n  EdgePair *pair = (EdgePair *)memAlloc( sizeof( EdgePair ));\n  if (pair == NULL) return NULL;\n\n  e = &pair->e;\n  eSym = &pair->eSym;\n\n  /* Make sure eNext points to the first edge of the edge pair */\n  if( eNext->Sym < eNext ) { eNext = eNext->Sym; }\n\n  /* Insert in circular doubly-linked list before eNext.\n   * Note that the prev pointer is stored in Sym->next.\n   */\n  ePrev = eNext->Sym->next;\n  eSym->next = ePrev;\n  ePrev->Sym->next = e;\n  e->next = eNext;\n  eNext->Sym->next = eSym;\n\n  e->Sym = eSym;\n  e->Onext = e;\n  e->Lnext = eSym;\n  e->Org = NULL;\n  e->Lface = NULL;\n  e->winding = 0;\n  e->activeRegion = NULL;\n\n  eSym->Sym = e;\n  eSym->Onext = eSym;\n  eSym->Lnext = e;\n  eSym->Org = NULL;\n  eSym->Lface = NULL;\n  eSym->winding = 0;\n  eSym->activeRegion = NULL;\n\n  return e;\n}\n\n/* Splice( a, b ) is best described by the Guibas/Stolfi paper or the\n * CS348a notes (see mesh.h).  Basically it modifies the mesh so that\n * a->Onext and b->Onext are exchanged.  This can have various effects\n * depending on whether a and b belong to different face or vertex rings.\n * For more explanation see __gl_meshSplice() below.\n */\nstatic void Splice( GLUhalfEdge *a, GLUhalfEdge *b )\n{\n  GLUhalfEdge *aOnext = a->Onext;\n  GLUhalfEdge *bOnext = b->Onext;\n\n  aOnext->Sym->Lnext = b;\n  bOnext->Sym->Lnext = a;\n  a->Onext = bOnext;\n  b->Onext = aOnext;\n}\n\n/* MakeVertex( newVertex, eOrig, vNext ) attaches a new vertex and makes it the\n * origin of all edges in the vertex loop to which eOrig belongs. \"vNext\" gives\n * a place to insert the new vertex in the global vertex list.  We insert\n * the new vertex *before* vNext so that algorithms which walk the vertex\n * list will not see the newly created vertices.\n */\nstatic void MakeVertex( GLUvertex *newVertex, \n\t\t\tGLUhalfEdge *eOrig, GLUvertex *vNext )\n{\n  GLUhalfEdge *e;\n  GLUvertex *vPrev;\n  GLUvertex *vNew = newVertex;\n\n  assert(vNew != NULL);\n\n  /* insert in circular doubly-linked list before vNext */\n  vPrev = vNext->prev;\n  vNew->prev = vPrev;\n  vPrev->next = vNew;\n  vNew->next = vNext;\n  vNext->prev = vNew;\n\n  vNew->anEdge = eOrig;\n  vNew->data = NULL;\n  /* leave coords, s, t undefined */\n\n  /* fix other edges on this vertex loop */\n  e = eOrig;\n  do {\n    e->Org = vNew;\n    e = e->Onext;\n  } while( e != eOrig );\n}\n\n/* MakeFace( newFace, eOrig, fNext ) attaches a new face and makes it the left\n * face of all edges in the face loop to which eOrig belongs.  \"fNext\" gives\n * a place to insert the new face in the global face list.  We insert\n * the new face *before* fNext so that algorithms which walk the face\n * list will not see the newly created faces.\n */\nstatic void MakeFace( GLUface *newFace, GLUhalfEdge *eOrig, GLUface *fNext )\n{\n  GLUhalfEdge *e;\n  GLUface *fPrev;\n  GLUface *fNew = newFace;\n\n  assert(fNew != NULL); \n\n  /* insert in circular doubly-linked list before fNext */\n  fPrev = fNext->prev;\n  fNew->prev = fPrev;\n  fPrev->next = fNew;\n  fNew->next = fNext;\n  fNext->prev = fNew;\n\n  fNew->anEdge = eOrig;\n  fNew->data = NULL;\n  fNew->trail = NULL;\n  fNew->marked = FALSE;\n\n  /* The new face is marked \"inside\" if the old one was.  This is a\n   * convenience for the common case where a face has been split in two.\n   */\n  fNew->inside = fNext->inside;\n\n  /* fix other edges on this face loop */\n  e = eOrig;\n  do {\n    e->Lface = fNew;\n    e = e->Lnext;\n  } while( e != eOrig );\n}\n\n/* KillEdge( eDel ) destroys an edge (the half-edges eDel and eDel->Sym),\n * and removes from the global edge list.\n */\nstatic void KillEdge( GLUhalfEdge *eDel )\n{\n  GLUhalfEdge *ePrev, *eNext;\n\n  /* Half-edges are allocated in pairs, see EdgePair above */\n  if( eDel->Sym < eDel ) { eDel = eDel->Sym; }\n\n  /* delete from circular doubly-linked list */\n  eNext = eDel->next;\n  ePrev = eDel->Sym->next;\n  eNext->Sym->next = ePrev;\n  ePrev->Sym->next = eNext;\n\n  memFree( eDel );\n}\n\n\n/* KillVertex( vDel ) destroys a vertex and removes it from the global\n * vertex list.  It updates the vertex loop to point to a given new vertex.\n */\nstatic void KillVertex( GLUvertex *vDel, GLUvertex *newOrg )\n{\n  GLUhalfEdge *e, *eStart = vDel->anEdge;\n  GLUvertex *vPrev, *vNext;\n\n  /* change the origin of all affected edges */\n  e = eStart;\n  do {\n    e->Org = newOrg;\n    e = e->Onext;\n  } while( e != eStart );\n\n  /* delete from circular doubly-linked list */\n  vPrev = vDel->prev;\n  vNext = vDel->next;\n  vNext->prev = vPrev;\n  vPrev->next = vNext;\n\n  memFree( vDel );\n}\n\n/* KillFace( fDel ) destroys a face and removes it from the global face\n * list.  It updates the face loop to point to a given new face.\n */\nstatic void KillFace( GLUface *fDel, GLUface *newLface )\n{\n  GLUhalfEdge *e, *eStart = fDel->anEdge;\n  GLUface *fPrev, *fNext;\n\n  /* change the left face of all affected edges */\n  e = eStart;\n  do {\n    e->Lface = newLface;\n    e = e->Lnext;\n  } while( e != eStart );\n\n  /* delete from circular doubly-linked list */\n  fPrev = fDel->prev;\n  fNext = fDel->next;\n  fNext->prev = fPrev;\n  fPrev->next = fNext;\n\n  memFree( fDel );\n}\n\n\n/****************** Basic Edge Operations **********************/\n\n/* __gl_meshMakeEdge creates one edge, two vertices, and a loop (face).\n * The loop consists of the two new half-edges.\n */\nGLUhalfEdge *__gl_meshMakeEdge( GLUmesh *mesh )\n{\n  GLUvertex *newVertex1= allocVertex();\n  GLUvertex *newVertex2= allocVertex();\n  GLUface *newFace= allocFace();\n  GLUhalfEdge *e;\n\n  /* if any one is null then all get freed */\n  if (newVertex1 == NULL || newVertex2 == NULL || newFace == NULL) {\n     if (newVertex1 != NULL) memFree(newVertex1);\n     if (newVertex2 != NULL) memFree(newVertex2);\n     if (newFace != NULL) memFree(newFace);     \n     return NULL;\n  } \n\n  e = MakeEdge( &mesh->eHead );\n  if (e == NULL) return NULL;\n\n  MakeVertex( newVertex1, e, &mesh->vHead );\n  MakeVertex( newVertex2, e->Sym, &mesh->vHead );\n  MakeFace( newFace, e, &mesh->fHead );\n  return e;\n}\n  \n\n/* __gl_meshSplice( eOrg, eDst ) is the basic operation for changing the\n * mesh connectivity and topology.  It changes the mesh so that\n *\teOrg->Onext <- OLD( eDst->Onext )\n *\teDst->Onext <- OLD( eOrg->Onext )\n * where OLD(...) means the value before the meshSplice operation.\n *\n * This can have two effects on the vertex structure:\n *  - if eOrg->Org != eDst->Org, the two vertices are merged together\n *  - if eOrg->Org == eDst->Org, the origin is split into two vertices\n * In both cases, eDst->Org is changed and eOrg->Org is untouched.\n *\n * Similarly (and independently) for the face structure,\n *  - if eOrg->Lface == eDst->Lface, one loop is split into two\n *  - if eOrg->Lface != eDst->Lface, two distinct loops are joined into one\n * In both cases, eDst->Lface is changed and eOrg->Lface is unaffected.\n *\n * Some special cases:\n * If eDst == eOrg, the operation has no effect.\n * If eDst == eOrg->Lnext, the new face will have a single edge.\n * If eDst == eOrg->Lprev, the old face will have a single edge.\n * If eDst == eOrg->Onext, the new vertex will have a single edge.\n * If eDst == eOrg->Oprev, the old vertex will have a single edge.\n */\nint __gl_meshSplice( GLUhalfEdge *eOrg, GLUhalfEdge *eDst )\n{\n  int joiningLoops = FALSE;\n  int joiningVertices = FALSE;\n\n  if( eOrg == eDst ) return 1;\n\n  if( eDst->Org != eOrg->Org ) {\n    /* We are merging two disjoint vertices -- destroy eDst->Org */\n    joiningVertices = TRUE;\n    KillVertex( eDst->Org, eOrg->Org );\n  }\n  if( eDst->Lface != eOrg->Lface ) {\n    /* We are connecting two disjoint loops -- destroy eDst->Lface */\n    joiningLoops = TRUE;\n    KillFace( eDst->Lface, eOrg->Lface );\n  }\n\n  /* Change the edge structure */\n  Splice( eDst, eOrg );\n\n  if( ! joiningVertices ) {\n    GLUvertex *newVertex= allocVertex();\n    if (newVertex == NULL) return 0;\n\n    /* We split one vertex into two -- the new vertex is eDst->Org.\n     * Make sure the old vertex points to a valid half-edge.\n     */\n    MakeVertex( newVertex, eDst, eOrg->Org );\n    eOrg->Org->anEdge = eOrg;\n  }\n  if( ! joiningLoops ) {\n    GLUface *newFace= allocFace();  \n    if (newFace == NULL) return 0;\n\n    /* We split one loop into two -- the new loop is eDst->Lface.\n     * Make sure the old face points to a valid half-edge.\n     */\n    MakeFace( newFace, eDst, eOrg->Lface );\n    eOrg->Lface->anEdge = eOrg;\n  }\n\n  return 1;\n}\n\n\n/* __gl_meshDelete( eDel ) removes the edge eDel.  There are several cases:\n * if (eDel->Lface != eDel->Rface), we join two loops into one; the loop\n * eDel->Lface is deleted.  Otherwise, we are splitting one loop into two;\n * the newly created loop will contain eDel->Dst.  If the deletion of eDel\n * would create isolated vertices, those are deleted as well.\n *\n * This function could be implemented as two calls to __gl_meshSplice\n * plus a few calls to memFree, but this would allocate and delete\n * unnecessary vertices and faces.\n */\nint __gl_meshDelete( GLUhalfEdge *eDel )\n{\n  GLUhalfEdge *eDelSym = eDel->Sym;\n  int joiningLoops = FALSE;\n\n  /* First step: disconnect the origin vertex eDel->Org.  We make all\n   * changes to get a consistent mesh in this \"intermediate\" state.\n   */\n  if( eDel->Lface != eDel->Rface ) {\n    /* We are joining two loops into one -- remove the left face */\n    joiningLoops = TRUE;\n    KillFace( eDel->Lface, eDel->Rface );\n  }\n\n  if( eDel->Onext == eDel ) {\n    KillVertex( eDel->Org, NULL );\n  } else {\n    /* Make sure that eDel->Org and eDel->Rface point to valid half-edges */\n    eDel->Rface->anEdge = eDel->Oprev;\n    eDel->Org->anEdge = eDel->Onext;\n\n    Splice( eDel, eDel->Oprev );\n    if( ! joiningLoops ) {\n      GLUface *newFace= allocFace();\n      if (newFace == NULL) return 0; \n\n      /* We are splitting one loop into two -- create a new loop for eDel. */\n      MakeFace( newFace, eDel, eDel->Lface );\n    }\n  }\n\n  /* Claim: the mesh is now in a consistent state, except that eDel->Org\n   * may have been deleted.  Now we disconnect eDel->Dst.\n   */\n  if( eDelSym->Onext == eDelSym ) {\n    KillVertex( eDelSym->Org, NULL );\n    KillFace( eDelSym->Lface, NULL );\n  } else {\n    /* Make sure that eDel->Dst and eDel->Lface point to valid half-edges */\n    eDel->Lface->anEdge = eDelSym->Oprev;\n    eDelSym->Org->anEdge = eDelSym->Onext;\n    Splice( eDelSym, eDelSym->Oprev );\n  }\n\n  /* Any isolated vertices or faces have already been freed. */\n  KillEdge( eDel );\n\n  return 1;\n}\n\n\n/******************** Other Edge Operations **********************/\n\n/* All these routines can be implemented with the basic edge\n * operations above.  They are provided for convenience and efficiency.\n */\n\n\n/* __gl_meshAddEdgeVertex( eOrg ) creates a new edge eNew such that\n * eNew == eOrg->Lnext, and eNew->Dst is a newly created vertex.\n * eOrg and eNew will have the same left face.\n */\nGLUhalfEdge *__gl_meshAddEdgeVertex( GLUhalfEdge *eOrg )\n{\n  GLUhalfEdge *eNewSym;\n  GLUhalfEdge *eNew = MakeEdge( eOrg );\n  if (eNew == NULL) return NULL;\n\n  eNewSym = eNew->Sym;\n\n  /* Connect the new edge appropriately */\n  Splice( eNew, eOrg->Lnext );\n\n  /* Set the vertex and face information */\n  eNew->Org = eOrg->Dst;\n  {\n    GLUvertex *newVertex= allocVertex();\n    if (newVertex == NULL) return NULL;\n\n    MakeVertex( newVertex, eNewSym, eNew->Org );\n  }\n  eNew->Lface = eNewSym->Lface = eOrg->Lface;\n\n  return eNew;\n}\n\n\n/* __gl_meshSplitEdge( eOrg ) splits eOrg into two edges eOrg and eNew,\n * such that eNew == eOrg->Lnext.  The new vertex is eOrg->Dst == eNew->Org.\n * eOrg and eNew will have the same left face.\n */\nGLUhalfEdge *__gl_meshSplitEdge( GLUhalfEdge *eOrg )\n{\n  GLUhalfEdge *eNew;\n  GLUhalfEdge *tempHalfEdge= __gl_meshAddEdgeVertex( eOrg );\n  if (tempHalfEdge == NULL) return NULL;\n\n  eNew = tempHalfEdge->Sym;\n\n  /* Disconnect eOrg from eOrg->Dst and connect it to eNew->Org */\n  Splice( eOrg->Sym, eOrg->Sym->Oprev );\n  Splice( eOrg->Sym, eNew );\n\n  /* Set the vertex and face information */\n  eOrg->Dst = eNew->Org;\n  eNew->Dst->anEdge = eNew->Sym;\t/* may have pointed to eOrg->Sym */\n  eNew->Rface = eOrg->Rface;\n  eNew->winding = eOrg->winding;\t/* copy old winding information */\n  eNew->Sym->winding = eOrg->Sym->winding;\n\n  return eNew;\n}\n\n\n/* __gl_meshConnect( eOrg, eDst ) creates a new edge from eOrg->Dst\n * to eDst->Org, and returns the corresponding half-edge eNew.\n * If eOrg->Lface == eDst->Lface, this splits one loop into two,\n * and the newly created loop is eNew->Lface.  Otherwise, two disjoint\n * loops are merged into one, and the loop eDst->Lface is destroyed.\n *\n * If (eOrg == eDst), the new face will have only two edges.\n * If (eOrg->Lnext == eDst), the old face is reduced to a single edge.\n * If (eOrg->Lnext->Lnext == eDst), the old face is reduced to two edges.\n */\nGLUhalfEdge *__gl_meshConnect( GLUhalfEdge *eOrg, GLUhalfEdge *eDst )\n{\n  GLUhalfEdge *eNewSym;\n  int joiningLoops = FALSE;  \n  GLUhalfEdge *eNew = MakeEdge( eOrg );\n  if (eNew == NULL) return NULL;\n\n  eNewSym = eNew->Sym;\n\n  if( eDst->Lface != eOrg->Lface ) {\n    /* We are connecting two disjoint loops -- destroy eDst->Lface */\n    joiningLoops = TRUE;\n    KillFace( eDst->Lface, eOrg->Lface );\n  }\n\n  /* Connect the new edge appropriately */\n  Splice( eNew, eOrg->Lnext );\n  Splice( eNewSym, eDst );\n\n  /* Set the vertex and face information */\n  eNew->Org = eOrg->Dst;\n  eNewSym->Org = eDst->Org;\n  eNew->Lface = eNewSym->Lface = eOrg->Lface;\n\n  /* Make sure the old face points to a valid half-edge */\n  eOrg->Lface->anEdge = eNewSym;\n\n  if( ! joiningLoops ) {\n    GLUface *newFace= allocFace();\n    if (newFace == NULL) return NULL;\n\n    /* We split one loop into two -- the new loop is eNew->Lface */\n    MakeFace( newFace, eNew, eOrg->Lface );\n  }\n  return eNew;\n}\n\n\n/******************** Other Operations **********************/\n\n/* __gl_meshZapFace( fZap ) destroys a face and removes it from the\n * global face list.  All edges of fZap will have a NULL pointer as their\n * left face.  Any edges which also have a NULL pointer as their right face\n * are deleted entirely (along with any isolated vertices this produces).\n * An entire mesh can be deleted by zapping its faces, one at a time,\n * in any order.  Zapped faces cannot be used in further mesh operations!\n */\nvoid __gl_meshZapFace( GLUface *fZap )\n{\n  GLUhalfEdge *eStart = fZap->anEdge;\n  GLUhalfEdge *e, *eNext, *eSym;\n  GLUface *fPrev, *fNext;\n\n  /* walk around face, deleting edges whose right face is also NULL */\n  eNext = eStart->Lnext;\n  do {\n    e = eNext;\n    eNext = e->Lnext;\n\n    e->Lface = NULL;\n    if( e->Rface == NULL ) {\n      /* delete the edge -- see __gl_MeshDelete above */\n\n      if( e->Onext == e ) {\n\tKillVertex( e->Org, NULL );\n      } else {\n\t/* Make sure that e->Org points to a valid half-edge */\n\te->Org->anEdge = e->Onext;\n\tSplice( e, e->Oprev );\n      }\n      eSym = e->Sym;\n      if( eSym->Onext == eSym ) {\n\tKillVertex( eSym->Org, NULL );\n      } else {\n\t/* Make sure that eSym->Org points to a valid half-edge */\n\teSym->Org->anEdge = eSym->Onext;\n\tSplice( eSym, eSym->Oprev );\n      }\n      KillEdge( e );\n    }\n  } while( e != eStart );\n\n  /* delete from circular doubly-linked list */\n  fPrev = fZap->prev;\n  fNext = fZap->next;\n  fNext->prev = fPrev;\n  fPrev->next = fNext;\n\n  memFree( fZap );\n}\n\n\n/* __gl_meshNewMesh() creates a new mesh with no edges, no vertices,\n * and no loops (what we usually call a \"face\").\n */\nGLUmesh *__gl_meshNewMesh( void )\n{\n  GLUvertex *v;\n  GLUface *f;\n  GLUhalfEdge *e;\n  GLUhalfEdge *eSym;\n  GLUmesh *mesh = (GLUmesh *)memAlloc( sizeof( GLUmesh ));\n  if (mesh == NULL) {\n     return NULL;\n  }\n  \n  v = &mesh->vHead;\n  f = &mesh->fHead;\n  e = &mesh->eHead;\n  eSym = &mesh->eHeadSym;\n\n  v->next = v->prev = v;\n  v->anEdge = NULL;\n  v->data = NULL;\n\n  f->next = f->prev = f;\n  f->anEdge = NULL;\n  f->data = NULL;\n  f->trail = NULL;\n  f->marked = FALSE;\n  f->inside = FALSE;\n\n  e->next = e;\n  e->Sym = eSym;\n  e->Onext = NULL;\n  e->Lnext = NULL;\n  e->Org = NULL;\n  e->Lface = NULL;\n  e->winding = 0;\n  e->activeRegion = NULL;\n\n  eSym->next = eSym;\n  eSym->Sym = e;\n  eSym->Onext = NULL;\n  eSym->Lnext = NULL;\n  eSym->Org = NULL;\n  eSym->Lface = NULL;\n  eSym->winding = 0;\n  eSym->activeRegion = NULL;\n\n  return mesh;\n}\n\n\n/* __gl_meshUnion( mesh1, mesh2 ) forms the union of all structures in\n * both meshes, and returns the new mesh (the old meshes are destroyed).\n */\nGLUmesh *__gl_meshUnion( GLUmesh *mesh1, GLUmesh *mesh2 )\n{\n  GLUface *f1 = &mesh1->fHead;\n  GLUvertex *v1 = &mesh1->vHead;\n  GLUhalfEdge *e1 = &mesh1->eHead;\n  GLUface *f2 = &mesh2->fHead;\n  GLUvertex *v2 = &mesh2->vHead;\n  GLUhalfEdge *e2 = &mesh2->eHead;\n\n  /* Add the faces, vertices, and edges of mesh2 to those of mesh1 */\n  if( f2->next != f2 ) {\n    f1->prev->next = f2->next;\n    f2->next->prev = f1->prev;\n    f2->prev->next = f1;\n    f1->prev = f2->prev;\n  }\n\n  if( v2->next != v2 ) {\n    v1->prev->next = v2->next;\n    v2->next->prev = v1->prev;\n    v2->prev->next = v1;\n    v1->prev = v2->prev;\n  }\n\n  if( e2->next != e2 ) {\n    e1->Sym->next->Sym->next = e2->next;\n    e2->next->Sym->next = e1->Sym->next;\n    e2->Sym->next->Sym->next = e1;\n    e1->Sym->next = e2->Sym->next;\n  }\n\n  memFree( mesh2 );\n  return mesh1;\n}\n\n\n#ifdef DELETE_BY_ZAPPING\n\n/* __gl_meshDeleteMesh( mesh ) will free all storage for any valid mesh.\n */\nvoid __gl_meshDeleteMesh( GLUmesh *mesh )\n{\n  GLUface *fHead = &mesh->fHead;\n\n  while( fHead->next != fHead ) {\n    __gl_meshZapFace( fHead->next );\n  }\n  assert( mesh->vHead.next == &mesh->vHead );\n\n  memFree( mesh );\n}\n\n#else\n\n/* __gl_meshDeleteMesh( mesh ) will free all storage for any valid mesh.\n */\nvoid __gl_meshDeleteMesh( GLUmesh *mesh )\n{\n  GLUface *f, *fNext;\n  GLUvertex *v, *vNext;\n  GLUhalfEdge *e, *eNext;\n\n  for( f = mesh->fHead.next; f != &mesh->fHead; f = fNext ) {\n    fNext = f->next;\n    memFree( f );\n  }\n\n  for( v = mesh->vHead.next; v != &mesh->vHead; v = vNext ) {\n    vNext = v->next;\n    memFree( v );\n  }\n\n  for( e = mesh->eHead.next; e != &mesh->eHead; e = eNext ) {\n    /* One call frees both e and e->Sym (see EdgePair above) */\n    eNext = e->next;\n    memFree( e );\n  }\n\n  memFree( mesh );\n}\n\n#endif\n\n#ifndef NDEBUG\n\n/* __gl_meshCheckMesh( mesh ) checks a mesh for self-consistency.\n */\nvoid __gl_meshCheckMesh( GLUmesh *mesh )\n{\n  GLUface *fHead = &mesh->fHead;\n  GLUvertex *vHead = &mesh->vHead;\n  GLUhalfEdge *eHead = &mesh->eHead;\n  GLUface *f, *fPrev;\n  GLUvertex *v, *vPrev;\n  GLUhalfEdge *e, *ePrev;\n\n  fPrev = fHead;\n  for( fPrev = fHead ; (f = fPrev->next) != fHead; fPrev = f) {\n    assert( f->prev == fPrev );\n    e = f->anEdge;\n    do {\n      assert( e->Sym != e );\n      assert( e->Sym->Sym == e );\n      assert( e->Lnext->Onext->Sym == e );\n      assert( e->Onext->Sym->Lnext == e );\n      assert( e->Lface == f );\n      e = e->Lnext;\n    } while( e != f->anEdge );\n  }\n  assert( f->prev == fPrev && f->anEdge == NULL && f->data == NULL );\n\n  vPrev = vHead;\n  for( vPrev = vHead ; (v = vPrev->next) != vHead; vPrev = v) {\n    assert( v->prev == vPrev );\n    e = v->anEdge;\n    do {\n      assert( e->Sym != e );\n      assert( e->Sym->Sym == e );\n      assert( e->Lnext->Onext->Sym == e );\n      assert( e->Onext->Sym->Lnext == e );\n      assert( e->Org == v );\n      e = e->Onext;\n    } while( e != v->anEdge );\n  }\n  assert( v->prev == vPrev && v->anEdge == NULL && v->data == NULL );\n\n  ePrev = eHead;\n  for( ePrev = eHead ; (e = ePrev->next) != eHead; ePrev = e) {\n    assert( e->Sym->next == ePrev->Sym );\n    assert( e->Sym != e );\n    assert( e->Sym->Sym == e );\n    assert( e->Org != NULL );\n    assert( e->Dst != NULL );\n    assert( e->Lnext->Onext->Sym == e );\n    assert( e->Onext->Sym->Lnext == e );\n  }\n  assert( e->Sym->next == ePrev->Sym\n       && e->Sym == &mesh->eHeadSym\n       && e->Sym->Sym == e\n       && e->Org == NULL && e->Dst == NULL\n       && e->Lface == NULL && e->Rface == NULL );\n}\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/mesh.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/mesh.h,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#ifndef __mesh_h_\n#define __mesh_h_\n\n#include <k3d-platform-config.h>\n#ifdef K3D_API_DARWIN\n#include <OpenGL/glu.h>\n#else // K3D_API_DARWIN\n#include <GL/glu.h>\n#endif // !K3D_API_DARWIN\n\ntypedef struct GLUmesh GLUmesh; \n\ntypedef struct GLUvertex GLUvertex;\ntypedef struct GLUface GLUface;\ntypedef struct GLUhalfEdge GLUhalfEdge;\n\ntypedef struct ActiveRegion ActiveRegion;\t/* Internal data */\n\n/* The mesh structure is similar in spirit, notation, and operations\n * to the \"quad-edge\" structure (see L. Guibas and J. Stolfi, Primitives\n * for the manipulation of general subdivisions and the computation of\n * Voronoi diagrams, ACM Transactions on Graphics, 4(2):74-123, April 1985).\n * For a simplified description, see the course notes for CS348a,\n * \"Mathematical Foundations of Computer Graphics\", available at the\n * Stanford bookstore (and taught during the fall quarter).\n * The implementation also borrows a tiny subset of the graph-based approach\n * use in Mantyla's Geometric Work Bench (see M. Mantyla, An Introduction\n * to Sold Modeling, Computer Science Press, Rockville, Maryland, 1988).\n *\n * The fundamental data structure is the \"half-edge\".  Two half-edges\n * go together to make an edge, but they point in opposite directions.\n * Each half-edge has a pointer to its mate (the \"symmetric\" half-edge Sym),\n * its origin vertex (Org), the face on its left side (Lface), and the\n * adjacent half-edges in the CCW direction around the origin vertex\n * (Onext) and around the left face (Lnext).  There is also a \"next\"\n * pointer for the global edge list (see below).\n *\n * The notation used for mesh navigation:\n *\tSym   = the mate of a half-edge (same edge, but opposite direction)\n *\tOnext = edge CCW around origin vertex (keep same origin)\n *\tDnext = edge CCW around destination vertex (keep same dest)\n *\tLnext = edge CCW around left face (dest becomes new origin)\n *\tRnext = edge CCW around right face (origin becomes new dest)\n *\n * \"prev\" means to substitute CW for CCW in the definitions above.\n *\n * The mesh keeps global lists of all vertices, faces, and edges,\n * stored as doubly-linked circular lists with a dummy header node.\n * The mesh stores pointers to these dummy headers (vHead, fHead, eHead).\n *\n * The circular edge list is special; since half-edges always occur\n * in pairs (e and e->Sym), each half-edge stores a pointer in only\n * one direction.  Starting at eHead and following the e->next pointers\n * will visit each *edge* once (ie. e or e->Sym, but not both).\n * e->Sym stores a pointer in the opposite direction, thus it is\n * always true that e->Sym->next->Sym->next == e.\n *\n * Each vertex has a pointer to next and previous vertices in the\n * circular list, and a pointer to a half-edge with this vertex as\n * the origin (NULL if this is the dummy header).  There is also a\n * field \"data\" for client data.\n *\n * Each face has a pointer to the next and previous faces in the\n * circular list, and a pointer to a half-edge with this face as\n * the left face (NULL if this is the dummy header).  There is also\n * a field \"data\" for client data.\n *\n * Note that what we call a \"face\" is really a loop; faces may consist\n * of more than one loop (ie. not simply connected), but there is no\n * record of this in the data structure.  The mesh may consist of\n * several disconnected regions, so it may not be possible to visit\n * the entire mesh by starting at a half-edge and traversing the edge\n * structure.\n *\n * The mesh does NOT support isolated vertices; a vertex is deleted along\n * with its last edge.  Similarly when two faces are merged, one of the\n * faces is deleted (see __gl_meshDelete below).  For mesh operations,\n * all face (loop) and vertex pointers must not be NULL.  However, once\n * mesh manipulation is finished, __gl_MeshZapFace can be used to delete\n * faces of the mesh, one at a time.  All external faces can be \"zapped\"\n * before the mesh is returned to the client; then a NULL face indicates\n * a region which is not part of the output polygon.\n */\n\nstruct GLUvertex {\n  GLUvertex\t*next;\t\t/* next vertex (never NULL) */\n  GLUvertex\t*prev;\t\t/* previous vertex (never NULL) */\n  GLUhalfEdge\t*anEdge;\t/* a half-edge with this origin */\n  void\t\t*data;\t\t/* client's data */\n\n  /* Internal data (keep hidden) */\n  GLdouble\tcoords[3];\t/* vertex location in 3D */\n  GLdouble\ts, t;\t\t/* projection onto the sweep plane */\n  long\t\tpqHandle;\t/* to allow deletion from priority queue */\n};\n\nstruct GLUface {\n  GLUface\t*next;\t\t/* next face (never NULL) */\n  GLUface\t*prev;\t\t/* previous face (never NULL) */\n  GLUhalfEdge\t*anEdge;\t/* a half edge with this left face */\n  void\t\t*data;\t\t/* room for client's data */\n\n  /* Internal data (keep hidden) */\n  GLUface\t*trail;\t\t/* \"stack\" for conversion to strips */\n  GLboolean\tmarked;\t\t/* flag for conversion to strips */\n  GLboolean\tinside;\t\t/* this face is in the polygon interior */\n};\n\nstruct GLUhalfEdge {\n  GLUhalfEdge\t*next;\t\t/* doubly-linked list (prev==Sym->next) */\n  GLUhalfEdge\t*Sym;\t\t/* same edge, opposite direction */\n  GLUhalfEdge\t*Onext;\t\t/* next edge CCW around origin */\n  GLUhalfEdge\t*Lnext;\t\t/* next edge CCW around left face */\n  GLUvertex\t*Org;\t\t/* origin vertex (Overtex too long) */\n  GLUface\t*Lface;\t\t/* left face */\n\n  /* Internal data (keep hidden) */\n  ActiveRegion\t*activeRegion;\t/* a region with this upper edge (sweep.c) */\n  int\t\twinding;\t/* change in winding number when crossing\n                                   from the right face to the left face */\n};\n\n#define\tRface\tSym->Lface\n#define Dst\tSym->Org\n\n#define Oprev\tSym->Lnext\n#define Lprev   Onext->Sym\n#define Dprev\tLnext->Sym\n#define Rprev\tSym->Onext\n#define Dnext\tRprev->Sym\t/* 3 pointers */\n#define Rnext\tOprev->Sym\t/* 3 pointers */\n\n\nstruct GLUmesh {\n  GLUvertex\tvHead;\t\t/* dummy header for vertex list */\n  GLUface\tfHead;\t\t/* dummy header for face list */\n  GLUhalfEdge\teHead;\t\t/* dummy header for edge list */\n  GLUhalfEdge\teHeadSym;\t/* and its symmetric counterpart */\n};\n\n/* The mesh operations below have three motivations: completeness,\n * convenience, and efficiency.  The basic mesh operations are MakeEdge,\n * Splice, and Delete.  All the other edge operations can be implemented\n * in terms of these.  The other operations are provided for convenience\n * and/or efficiency.\n *\n * When a face is split or a vertex is added, they are inserted into the\n * global list *before* the existing vertex or face (ie. e->Org or e->Lface).\n * This makes it easier to process all vertices or faces in the global lists\n * without worrying about processing the same data twice.  As a convenience,\n * when a face is split, the \"inside\" flag is copied from the old face.\n * Other internal data (v->data, v->activeRegion, f->data, f->marked,\n * f->trail, e->winding) is set to zero.\n *\n * ********************** Basic Edge Operations **************************\n *\n * __gl_meshMakeEdge( mesh ) creates one edge, two vertices, and a loop.\n * The loop (face) consists of the two new half-edges.\n *\n * __gl_meshSplice( eOrg, eDst ) is the basic operation for changing the\n * mesh connectivity and topology.  It changes the mesh so that\n *\teOrg->Onext <- OLD( eDst->Onext )\n *\teDst->Onext <- OLD( eOrg->Onext )\n * where OLD(...) means the value before the meshSplice operation.\n *\n * This can have two effects on the vertex structure:\n *  - if eOrg->Org != eDst->Org, the two vertices are merged together\n *  - if eOrg->Org == eDst->Org, the origin is split into two vertices\n * In both cases, eDst->Org is changed and eOrg->Org is untouched.\n *\n * Similarly (and independently) for the face structure,\n *  - if eOrg->Lface == eDst->Lface, one loop is split into two\n *  - if eOrg->Lface != eDst->Lface, two distinct loops are joined into one\n * In both cases, eDst->Lface is changed and eOrg->Lface is unaffected.\n *\n * __gl_meshDelete( eDel ) removes the edge eDel.  There are several cases:\n * if (eDel->Lface != eDel->Rface), we join two loops into one; the loop\n * eDel->Lface is deleted.  Otherwise, we are splitting one loop into two;\n * the newly created loop will contain eDel->Dst.  If the deletion of eDel\n * would create isolated vertices, those are deleted as well.\n *\n * ********************** Other Edge Operations **************************\n *\n * __gl_meshAddEdgeVertex( eOrg ) creates a new edge eNew such that\n * eNew == eOrg->Lnext, and eNew->Dst is a newly created vertex.\n * eOrg and eNew will have the same left face.\n *\n * __gl_meshSplitEdge( eOrg ) splits eOrg into two edges eOrg and eNew,\n * such that eNew == eOrg->Lnext.  The new vertex is eOrg->Dst == eNew->Org.\n * eOrg and eNew will have the same left face.\n *\n * __gl_meshConnect( eOrg, eDst ) creates a new edge from eOrg->Dst\n * to eDst->Org, and returns the corresponding half-edge eNew.\n * If eOrg->Lface == eDst->Lface, this splits one loop into two,\n * and the newly created loop is eNew->Lface.  Otherwise, two disjoint\n * loops are merged into one, and the loop eDst->Lface is destroyed.\n *\n * ************************ Other Operations *****************************\n *\n * __gl_meshNewMesh() creates a new mesh with no edges, no vertices,\n * and no loops (what we usually call a \"face\").\n *\n * __gl_meshUnion( mesh1, mesh2 ) forms the union of all structures in\n * both meshes, and returns the new mesh (the old meshes are destroyed).\n *\n * __gl_meshDeleteMesh( mesh ) will free all storage for any valid mesh.\n *\n * __gl_meshZapFace( fZap ) destroys a face and removes it from the\n * global face list.  All edges of fZap will have a NULL pointer as their\n * left face.  Any edges which also have a NULL pointer as their right face\n * are deleted entirely (along with any isolated vertices this produces).\n * An entire mesh can be deleted by zapping its faces, one at a time,\n * in any order.  Zapped faces cannot be used in further mesh operations!\n *\n * __gl_meshCheckMesh( mesh ) checks a mesh for self-consistency.\n */\n\nGLUhalfEdge\t*__gl_meshMakeEdge( GLUmesh *mesh );\nint\t\t__gl_meshSplice( GLUhalfEdge *eOrg, GLUhalfEdge *eDst );\nint\t\t__gl_meshDelete( GLUhalfEdge *eDel );\n\nGLUhalfEdge\t*__gl_meshAddEdgeVertex( GLUhalfEdge *eOrg );\nGLUhalfEdge\t*__gl_meshSplitEdge( GLUhalfEdge *eOrg );\nGLUhalfEdge\t*__gl_meshConnect( GLUhalfEdge *eOrg, GLUhalfEdge *eDst );\n\nGLUmesh\t\t*__gl_meshNewMesh( void );\nGLUmesh\t\t*__gl_meshUnion( GLUmesh *mesh1, GLUmesh *mesh2 );\nvoid\t\t__gl_meshDeleteMesh( GLUmesh *mesh );\nvoid\t\t__gl_meshZapFace( GLUface *fZap );\n\n#ifdef NDEBUG\n#define\t\t__gl_meshCheckMesh( mesh )\n#else\nvoid\t\t__gl_meshCheckMesh( GLUmesh *mesh );\n#endif\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/normal.c",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n**\n** http://oss.sgi.com/projects/FreeB\n**\n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n**\n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n**\n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n*/\n\n#include \"gluos.h\"\n#include \"mesh.h\"\n#include \"tess.h\"\n#include \"normal.h\"\n#include <math.h>\n#include <assert.h>\n\n#define TRUE 1\n#define FALSE 0\n\n#define Dot(u,v)\t(u[0]*v[0] + u[1]*v[1] + u[2]*v[2])\n\n#if 0\nstatic void Normalize( GLdouble v[3] )\n{\n  GLdouble len = v[0]*v[0] + v[1]*v[1] + v[2]*v[2];\n\n  assert( len > 0 );\n  len = sqrt( len );\n  v[0] /= len;\n  v[1] /= len;\n  v[2] /= len;\n}\n#endif\n\n#undef\tABS\n#define ABS(x)\t((x) < 0 ? -(x) : (x))\n\nstatic int LongAxis( GLdouble v[3] )\n{\n  int i = 0;\n\n  if( ABS(v[1]) > ABS(v[0]) ) { i = 1; }\n  if( ABS(v[2]) > ABS(v[i]) ) { i = 2; }\n  return i;\n}\n\nstatic void ComputeNormal( SGItesselator *tess, GLdouble norm[3] )\n{\n  GLUvertex *v, *v1, *v2;\n  GLdouble c, tLen2, maxLen2;\n  GLdouble maxVal[3], minVal[3], d1[3], d2[3], tNorm[3];\n  GLUvertex *maxVert[3], *minVert[3];\n  GLUvertex *vHead = &tess->mesh->vHead;\n  int i;\n\n  maxVal[0] = maxVal[1] = maxVal[2] = -2 * GLU_TESS_MAX_COORD;\n  minVal[0] = minVal[1] = minVal[2] = 2 * GLU_TESS_MAX_COORD;\n\n  for( v = vHead->next; v != vHead; v = v->next ) {\n    for( i = 0; i < 3; ++i ) {\n      c = v->coords[i];\n      if( c < minVal[i] ) { minVal[i] = c; minVert[i] = v; }\n      if( c > maxVal[i] ) { maxVal[i] = c; maxVert[i] = v; }\n    }\n  }\n\n  /* Find two vertices separated by at least 1/sqrt(3) of the maximum\n   * distance between any two vertices\n   */\n  i = 0;\n  if( maxVal[1] - minVal[1] > maxVal[0] - minVal[0] ) { i = 1; }\n  if( maxVal[2] - minVal[2] > maxVal[i] - minVal[i] ) { i = 2; }\n  if( minVal[i] >= maxVal[i] ) {\n    /* All vertices are the same -- normal doesn't matter */\n    norm[0] = 0; norm[1] = 0; norm[2] = 1;\n    return;\n  }\n\n  /* Look for a third vertex which forms the triangle with maximum area\n   * (Length of normal == twice the triangle area)\n   */\n  maxLen2 = 0;\n  v1 = minVert[i];\n  v2 = maxVert[i];\n  d1[0] = v1->coords[0] - v2->coords[0];\n  d1[1] = v1->coords[1] - v2->coords[1];\n  d1[2] = v1->coords[2] - v2->coords[2];\n  for( v = vHead->next; v != vHead; v = v->next ) {\n    d2[0] = v->coords[0] - v2->coords[0];\n    d2[1] = v->coords[1] - v2->coords[1];\n    d2[2] = v->coords[2] - v2->coords[2];\n    tNorm[0] = d1[1]*d2[2] - d1[2]*d2[1];\n    tNorm[1] = d1[2]*d2[0] - d1[0]*d2[2];\n    tNorm[2] = d1[0]*d2[1] - d1[1]*d2[0];\n    tLen2 = tNorm[0]*tNorm[0] + tNorm[1]*tNorm[1] + tNorm[2]*tNorm[2];\n    if( tLen2 > maxLen2 ) {\n      maxLen2 = tLen2;\n      norm[0] = tNorm[0];\n      norm[1] = tNorm[1];\n      norm[2] = tNorm[2];\n    }\n  }\n\n  if( maxLen2 <= 0 ) {\n    /* All points lie on a single line -- any decent normal will do */\n    norm[0] = norm[1] = norm[2] = 0;\n    norm[LongAxis(d1)] = 1;\n  }\n}\n\n\nstatic void CheckOrientation( SGItesselator *tess )\n{\n  GLdouble area;\n  GLUface *f, *fHead = &tess->mesh->fHead;\n  GLUvertex *v, *vHead = &tess->mesh->vHead;\n  GLUhalfEdge *e;\n\n  /* When we compute the normal automatically, we choose the orientation\n   * so that the the sum of the signed areas of all contours is non-negative.\n   */\n  area = 0;\n  for( f = fHead->next; f != fHead; f = f->next ) {\n    e = f->anEdge;\n    if( e->winding <= 0 ) continue;\n    do {\n      area += (e->Org->s - e->Dst->s) * (e->Org->t + e->Dst->t);\n      e = e->Lnext;\n    } while( e != f->anEdge );\n  }\n  if( area < 0 ) {\n    /* Reverse the orientation by flipping all the t-coordinates */\n    for( v = vHead->next; v != vHead; v = v->next ) {\n      v->t = - v->t;\n    }\n    tess->tUnit[0] = - tess->tUnit[0];\n    tess->tUnit[1] = - tess->tUnit[1];\n    tess->tUnit[2] = - tess->tUnit[2];\n  }\n}\n\n#ifdef FOR_TRITE_TEST_PROGRAM\n#include <stdlib.h>\nextern int RandomSweep;\n#define S_UNIT_X\t(RandomSweep ? (2*drand48()-1) : 1.0)\n#define S_UNIT_Y\t(RandomSweep ? (2*drand48()-1) : 0.0)\n#else\n#if defined(SLANTED_SWEEP)\n/* The \"feature merging\" is not intended to be complete.  There are\n * special cases where edges are nearly parallel to the sweep line\n * which are not implemented.  The algorithm should still behave\n * robustly (ie. produce a reasonable tesselation) in the presence\n * of such edges, however it may miss features which could have been\n * merged.  We could minimize this effect by choosing the sweep line\n * direction to be something unusual (ie. not parallel to one of the\n * coordinate axes).\n */\n#define S_UNIT_X\t0.50941539564955385\t/* Pre-normalized */\n#define S_UNIT_Y\t0.86052074622010633\n#else\n#define S_UNIT_X\t1.0\n#define S_UNIT_Y\t0.0\n#endif\n#endif\n\n/* Determine the polygon normal and project vertices onto the plane\n * of the polygon.\n */\nvoid __gl_projectPolygon( SGItesselator *tess )\n{\n  GLUvertex *v, *vHead = &tess->mesh->vHead;\n  GLdouble norm[3];\n  GLdouble *sUnit, *tUnit;\n  int i, computedNormal = FALSE;\n\n  norm[0] = tess->normal[0];\n  norm[1] = tess->normal[1];\n  norm[2] = tess->normal[2];\n  if( norm[0] == 0 && norm[1] == 0 && norm[2] == 0 ) {\n    ComputeNormal( tess, norm );\n    computedNormal = TRUE;\n  }\n  sUnit = tess->sUnit;\n  tUnit = tess->tUnit;\n  i = LongAxis( norm );\n\n#if defined(FOR_TRITE_TEST_PROGRAM) || defined(TRUE_PROJECT)\n  /* Choose the initial sUnit vector to be approximately perpendicular\n   * to the normal.\n   */\n  Normalize( norm );\n\n  sUnit[i] = 0;\n  sUnit[(i+1)%3] = S_UNIT_X;\n  sUnit[(i+2)%3] = S_UNIT_Y;\n\n  /* Now make it exactly perpendicular */\n  w = Dot( sUnit, norm );\n  sUnit[0] -= w * norm[0];\n  sUnit[1] -= w * norm[1];\n  sUnit[2] -= w * norm[2];\n  Normalize( sUnit );\n\n  /* Choose tUnit so that (sUnit,tUnit,norm) form a right-handed frame */\n  tUnit[0] = norm[1]*sUnit[2] - norm[2]*sUnit[1];\n  tUnit[1] = norm[2]*sUnit[0] - norm[0]*sUnit[2];\n  tUnit[2] = norm[0]*sUnit[1] - norm[1]*sUnit[0];\n  Normalize( tUnit );\n#else\n  /* Project perpendicular to a coordinate axis -- better numerically */\n  sUnit[i] = 0;\n  sUnit[(i+1)%3] = S_UNIT_X;\n  sUnit[(i+2)%3] = S_UNIT_Y;\n\n  tUnit[i] = 0;\n  tUnit[(i+1)%3] = (norm[i] > 0) ? -S_UNIT_Y : S_UNIT_Y;\n  tUnit[(i+2)%3] = (norm[i] > 0) ? S_UNIT_X : -S_UNIT_X;\n#endif\n\n  /* Project the vertices onto the sweep plane */\n  for( v = vHead->next; v != vHead; v = v->next ) {\n    v->s = Dot( v->coords, sUnit );\n    v->t = Dot( v->coords, tUnit );\n  }\n  if( computedNormal ) {\n    CheckOrientation( tess );\n  }\n}\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/normal.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/normal.h,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#ifndef __normal_h_\n#define __normal_h_\n\n#include \"tess.h\"\n\n/* __gl_projectPolygon( tess ) determines the polygon normal\n * and project vertices onto the plane of the polygon.\n */\nvoid __gl_projectPolygon( SGItesselator *tess );\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/priorityq-heap.c",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/priorityq-heap.c,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#include <stddef.h>\n#include <assert.h>\n#include <limits.h>\n#include \"priorityq-heap.h\"\n#include \"memalloc.h\"\n\n#define INIT_SIZE\t32\n\n#define TRUE 1\n#define FALSE 0\n\n#ifdef FOR_TRITE_TEST_PROGRAM\n#define LEQ(x,y)\t(*pq->leq)(x,y)\n#else\n/* Violates modularity, but a little faster */\n#include \"geom.h\"\n#define LEQ(x,y)\tVertLeq((GLUvertex *)x, (GLUvertex *)y)\n#endif\n\n/* really __gl_pqHeapNewPriorityQ */\nPriorityQ *pqNewPriorityQ( int (*leq)(PQkey key1, PQkey key2) )\n{\n  PriorityQ *pq = (PriorityQ *)memAlloc( sizeof( PriorityQ ));\n  if (pq == NULL) return NULL;\n\n  pq->size = 0;\n  pq->max = INIT_SIZE;\n  pq->nodes = (PQnode *)memAlloc( (INIT_SIZE + 1) * sizeof(pq->nodes[0]) );\n  if (pq->nodes == NULL) {\n     memFree(pq);\n     return NULL;\n  }\n\n  pq->handles = (PQhandleElem *)memAlloc( (INIT_SIZE + 1) * sizeof(pq->handles[0]) );\n  if (pq->handles == NULL) {\n     memFree(pq->nodes);\n     memFree(pq);\n     return NULL;\n  }\n\n  pq->initialized = FALSE;\n  pq->freeList = 0;\n  pq->leq = leq;\n\n  pq->nodes[1].handle = 1;\t/* so that Minimum() returns NULL */\n  pq->handles[1].key = NULL;\n  return pq;\n}\n\n/* really __gl_pqHeapDeletePriorityQ */\nvoid pqDeletePriorityQ( PriorityQ *pq )\n{\n  memFree( pq->handles );\n  memFree( pq->nodes );\n  memFree( pq );\n}\n\n\nstatic void FloatDown( PriorityQ *pq, long curr )\n{\n  PQnode *n = pq->nodes;\n  PQhandleElem *h = pq->handles;\n  PQhandle hCurr, hChild;\n  long child;\n\n  hCurr = n[curr].handle;\n  for( ;; ) {\n    child = curr << 1;\n    if( child < pq->size && LEQ( h[n[child+1].handle].key,\n\t\t\t\t h[n[child].handle].key )) {\n      ++child;\n    }\n\n    assert(child <= pq->max);\n\n    hChild = n[child].handle;\n    if( child > pq->size || LEQ( h[hCurr].key, h[hChild].key )) {\n      n[curr].handle = hCurr;\n      h[hCurr].node = curr;\n      break;\n    }\n    n[curr].handle = hChild;\n    h[hChild].node = curr;\n    curr = child;\n  }\n}\n\n\nstatic void FloatUp( PriorityQ *pq, long curr )\n{\n  PQnode *n = pq->nodes;\n  PQhandleElem *h = pq->handles;\n  PQhandle hCurr, hParent;\n  long parent;\n\n  hCurr = n[curr].handle;\n  for( ;; ) {\n    parent = curr >> 1;\n    hParent = n[parent].handle;\n    if( parent == 0 || LEQ( h[hParent].key, h[hCurr].key )) {\n      n[curr].handle = hCurr;\n      h[hCurr].node = curr;\n      break;\n    }\n    n[curr].handle = hParent;\n    h[hParent].node = curr;\n    curr = parent;\n  }\n}\n\n/* really __gl_pqHeapInit */\nvoid pqInit( PriorityQ *pq )\n{\n  long i;\n\n  /* This method of building a heap is O(n), rather than O(n lg n). */\n\n  for( i = pq->size; i >= 1; --i ) {\n    FloatDown( pq, i );\n  }\n  pq->initialized = TRUE;\n}\n\n/* really __gl_pqHeapInsert */\n/* returns LONG_MAX iff out of memory */\nPQhandle pqInsert( PriorityQ *pq, PQkey keyNew )\n{\n  long curr;\n  PQhandle free;\n\n  curr = ++ pq->size;\n  if( (curr*2) > pq->max ) {\n    PQnode *saveNodes= pq->nodes;\n    PQhandleElem *saveHandles= pq->handles;\n\n    /* If the heap overflows, double its size. */\n    pq->max <<= 1;\n    pq->nodes = (PQnode *)memRealloc( pq->nodes, \n\t\t\t\t     (size_t) \n\t\t\t\t     ((pq->max + 1) * sizeof( pq->nodes[0] )));\n    if (pq->nodes == NULL) {\n       pq->nodes = saveNodes;\t/* restore ptr to free upon return */\n       return LONG_MAX;\n    }\n    pq->handles = (PQhandleElem *)memRealloc( pq->handles,\n\t\t\t                     (size_t)\n\t\t\t                      ((pq->max + 1) * \n\t\t\t\t\t       sizeof( pq->handles[0] )));\n    if (pq->handles == NULL) {\n       pq->handles = saveHandles; /* restore ptr to free upon return */\n       return LONG_MAX;\n    }\n  }\n\n  if( pq->freeList == 0 ) {\n    free = curr;\n  } else {\n    free = pq->freeList;\n    pq->freeList = pq->handles[free].node;\n  }\n\n  pq->nodes[curr].handle = free;\n  pq->handles[free].node = curr;\n  pq->handles[free].key = keyNew;\n\n  if( pq->initialized ) {\n    FloatUp( pq, curr );\n  }\n  assert(free != LONG_MAX);\n  return free;\n}\n\n/* really __gl_pqHeapExtractMin */\nPQkey pqExtractMin( PriorityQ *pq )\n{\n  PQnode *n = pq->nodes;\n  PQhandleElem *h = pq->handles;\n  PQhandle hMin = n[1].handle;\n  PQkey min = h[hMin].key;\n\n  if( pq->size > 0 ) {\n    n[1].handle = n[pq->size].handle;\n    h[n[1].handle].node = 1;\n\n    h[hMin].key = NULL;\n    h[hMin].node = pq->freeList;\n    pq->freeList = hMin;\n\n    if( -- pq->size > 0 ) {\n      FloatDown( pq, 1 );\n    }\n  }\n  return min;\n}\n\n/* really __gl_pqHeapDelete */\nvoid pqDelete( PriorityQ *pq, PQhandle hCurr )\n{\n  PQnode *n = pq->nodes;\n  PQhandleElem *h = pq->handles;\n  long curr;\n\n  assert( hCurr >= 1 && hCurr <= pq->max && h[hCurr].key != NULL );\n\n  curr = h[hCurr].node;\n  n[curr].handle = n[pq->size].handle;\n  h[n[curr].handle].node = curr;\n\n  if( curr <= -- pq->size ) {\n    if( curr <= 1 || LEQ( h[n[curr>>1].handle].key, h[n[curr].handle].key )) {\n      FloatDown( pq, curr );\n    } else {\n      FloatUp( pq, curr );\n    }\n  }\n  h[hCurr].key = NULL;\n  h[hCurr].node = pq->freeList;\n  pq->freeList = hCurr;\n}\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/priorityq-heap.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/priorityq-heap.h,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#ifndef __priorityq_heap_h_\n#define __priorityq_heap_h_\n\n/* Use #define's so that another heap implementation can use this one */\n\n#define PQkey\t\t\tPQHeapKey\n#define PQhandle\t\tPQHeapHandle\n#define PriorityQ\t\tPriorityQHeap\n\n#define pqNewPriorityQ(leq)\t__gl_pqHeapNewPriorityQ(leq)\n#define pqDeletePriorityQ(pq)\t__gl_pqHeapDeletePriorityQ(pq)\n\n/* The basic operations are insertion of a new key (pqInsert),\n * and examination/extraction of a key whose value is minimum\n * (pqMinimum/pqExtractMin).  Deletion is also allowed (pqDelete);\n * for this purpose pqInsert returns a \"handle\" which is supplied\n * as the argument.\n *\n * An initial heap may be created efficiently by calling pqInsert\n * repeatedly, then calling pqInit.  In any case pqInit must be called\n * before any operations other than pqInsert are used.\n *\n * If the heap is empty, pqMinimum/pqExtractMin will return a NULL key.\n * This may also be tested with pqIsEmpty.\n */\n#define pqInit(pq)\t\t__gl_pqHeapInit(pq)\n#define pqInsert(pq,key)\t__gl_pqHeapInsert(pq,key)\n#define pqMinimum(pq)\t\t__gl_pqHeapMinimum(pq)\n#define pqExtractMin(pq)\t__gl_pqHeapExtractMin(pq)\n#define pqDelete(pq,handle)\t__gl_pqHeapDelete(pq,handle)\n#define pqIsEmpty(pq)\t\t__gl_pqHeapIsEmpty(pq)\n\n\n/* Since we support deletion the data structure is a little more\n * complicated than an ordinary heap.  \"nodes\" is the heap itself;\n * active nodes are stored in the range 1..pq->size.  When the\n * heap exceeds its allocated size (pq->max), its size doubles.\n * The children of node i are nodes 2i and 2i+1.\n *\n * Each node stores an index into an array \"handles\".  Each handle\n * stores a key, plus a pointer back to the node which currently\n * represents that key (ie. nodes[handles[i].node].handle == i).\n */\n\ntypedef void *PQkey;\ntypedef long PQhandle;\ntypedef struct PriorityQ PriorityQ;\n\ntypedef struct { PQhandle handle; } PQnode;\ntypedef struct { PQkey key; PQhandle node; } PQhandleElem;\n\nstruct PriorityQ {\n  PQnode\t*nodes;\n  PQhandleElem\t*handles;\n  long\t\tsize, max;\n  PQhandle\tfreeList;\n  int\t\tinitialized;\n  int\t\t(*leq)(PQkey key1, PQkey key2);\n};\n  \nPriorityQ\t*pqNewPriorityQ( int (*leq)(PQkey key1, PQkey key2) );\nvoid\t\tpqDeletePriorityQ( PriorityQ *pq );\n\nvoid\t\tpqInit( PriorityQ *pq );\nPQhandle\tpqInsert( PriorityQ *pq, PQkey key );\nPQkey\t\tpqExtractMin( PriorityQ *pq );\nvoid\t\tpqDelete( PriorityQ *pq, PQhandle handle );\n\n\n#define __gl_pqHeapMinimum(pq)\t((pq)->handles[(pq)->nodes[1].handle].key)\n#define __gl_pqHeapIsEmpty(pq)\t((pq)->size == 0)\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/priorityq-sort.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/priorityq-sort.h,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#ifndef __priorityq_sort_h_\n#define __priorityq_sort_h_\n\n#include \"priorityq-heap.h\"\n\n#undef PQkey\n#undef PQhandle\n#undef PriorityQ\n#undef pqNewPriorityQ\n#undef pqDeletePriorityQ\n#undef pqInit\n#undef pqInsert\n#undef pqMinimum\n#undef pqExtractMin\n#undef pqDelete\n#undef pqIsEmpty\n\n/* Use #define's so that another heap implementation can use this one */\n\n#define PQkey\t\t\tPQSortKey\n#define PQhandle\t\tPQSortHandle\n#define PriorityQ\t\tPriorityQSort\n\n#define pqNewPriorityQ(leq)\t__gl_pqSortNewPriorityQ(leq)\n#define pqDeletePriorityQ(pq)\t__gl_pqSortDeletePriorityQ(pq)\n\n/* The basic operations are insertion of a new key (pqInsert),\n * and examination/extraction of a key whose value is minimum\n * (pqMinimum/pqExtractMin).  Deletion is also allowed (pqDelete);\n * for this purpose pqInsert returns a \"handle\" which is supplied\n * as the argument.\n *\n * An initial heap may be created efficiently by calling pqInsert\n * repeatedly, then calling pqInit.  In any case pqInit must be called\n * before any operations other than pqInsert are used.\n *\n * If the heap is empty, pqMinimum/pqExtractMin will return a NULL key.\n * This may also be tested with pqIsEmpty.\n */\n#define pqInit(pq)\t\t__gl_pqSortInit(pq)\n#define pqInsert(pq,key)\t__gl_pqSortInsert(pq,key)\n#define pqMinimum(pq)\t\t__gl_pqSortMinimum(pq)\n#define pqExtractMin(pq)\t__gl_pqSortExtractMin(pq)\n#define pqDelete(pq,handle)\t__gl_pqSortDelete(pq,handle)\n#define pqIsEmpty(pq)\t\t__gl_pqSortIsEmpty(pq)\n\n\n/* Since we support deletion the data structure is a little more\n * complicated than an ordinary heap.  \"nodes\" is the heap itself;\n * active nodes are stored in the range 1..pq->size.  When the\n * heap exceeds its allocated size (pq->max), its size doubles.\n * The children of node i are nodes 2i and 2i+1.\n *\n * Each node stores an index into an array \"handles\".  Each handle\n * stores a key, plus a pointer back to the node which currently\n * represents that key (ie. nodes[handles[i].node].handle == i).\n */\n\ntypedef PQHeapKey PQkey;\ntypedef PQHeapHandle PQhandle;\ntypedef struct PriorityQ PriorityQ;\n\nstruct PriorityQ {\n  PriorityQHeap\t*heap;\n  PQkey\t\t*keys;\n  PQkey\t\t**order;\n  PQhandle\tsize, max;\n  int\t\tinitialized;\n  int\t\t(*leq)(PQkey key1, PQkey key2);\n};\n  \nPriorityQ\t*pqNewPriorityQ( int (*leq)(PQkey key1, PQkey key2) );\nvoid\t\tpqDeletePriorityQ( PriorityQ *pq );\n\nint\t\tpqInit( PriorityQ *pq );\nPQhandle\tpqInsert( PriorityQ *pq, PQkey key );\nPQkey\t\tpqExtractMin( PriorityQ *pq );\nvoid\t\tpqDelete( PriorityQ *pq, PQhandle handle );\n\nPQkey\t\tpqMinimum( PriorityQ *pq );\nint\t\tpqIsEmpty( PriorityQ *pq );\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/priorityq.c",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/priorityq.c,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#include \"gluos.h\"\n#include <stddef.h>\n#include <assert.h>\n#include <limits.h>\t\t/* LONG_MAX */\n#include \"memalloc.h\"\n\n/* Include all the code for the regular heap-based queue here. */\n\n#include \"priorityq-heap.c\"\n\n/* Now redefine all the function names to map to their \"Sort\" versions. */\n\n#include \"priorityq-sort.h\"\n\n/* really __gl_pqSortNewPriorityQ */\nPriorityQ *pqNewPriorityQ( int (*leq)(PQkey key1, PQkey key2) )\n{\n  PriorityQ *pq = (PriorityQ *)memAlloc( sizeof( PriorityQ ));\n  if (pq == NULL) return NULL;\n\n  pq->heap = __gl_pqHeapNewPriorityQ( leq );\n  if (pq->heap == NULL) {\n     memFree(pq);\n     return NULL;\n  }\n\n  pq->keys = (PQHeapKey *)memAlloc( INIT_SIZE * sizeof(pq->keys[0]) );\n  if (pq->keys == NULL) {\n     __gl_pqHeapDeletePriorityQ(pq->heap);\n     memFree(pq);\n     return NULL;\n  }\n\n  pq->size = 0;\n  pq->max = INIT_SIZE;\n  pq->initialized = FALSE;\n  pq->leq = leq;\n  return pq;\n}\n\n/* really __gl_pqSortDeletePriorityQ */\nvoid pqDeletePriorityQ( PriorityQ *pq )\n{\n  assert(pq != NULL); \n  if (pq->heap != NULL) __gl_pqHeapDeletePriorityQ( pq->heap );\n  if (pq->order != NULL) memFree( pq->order );\n  if (pq->keys != NULL) memFree( pq->keys );\n  memFree( pq );\n}\n\n\n#define LT(x,y)\t\t(! LEQ(y,x))\n#define GT(x,y)\t\t(! LEQ(x,y))\n#define Swap(a,b)\tif(1){PQkey *tmp = *a; *a = *b; *b = tmp;}else\n\n/* really __gl_pqSortInit */\nint pqInit( PriorityQ *pq )\n{\n  PQkey **p, **r, **i, **j, *piv;\n  struct { PQkey **p, **r; } Stack[50], *top = Stack;\n  unsigned long seed = 2016473283;\n\n  /* Create an array of indirect pointers to the keys, so that we\n   * the handles we have returned are still valid.\n   */\n/*\n  pq->order = (PQHeapKey **)memAlloc( (size_t)\n                                  (pq->size * sizeof(pq->order[0])) );\n*/\n  pq->order = (PQHeapKey **)memAlloc( (size_t)\n                                  ((pq->size+1) * sizeof(pq->order[0])) );\n/* the previous line is a patch to compensate for the fact that IBM */\n/* machines return a null on a malloc of zero bytes (unlike SGI),   */\n/* so we have to put in this defense to guard against a memory      */\n/* fault four lines down. from fossum@austin.ibm.com.               */\n  if (pq->order == NULL) return 0;\n\n  p = pq->order;\n  r = p + pq->size - 1;\n  for( piv = pq->keys, i = p; i <= r; ++piv, ++i ) {\n    *i = piv;\n  }\n\n  /* Sort the indirect pointers in descending order,\n   * using randomized Quicksort\n   */\n  top->p = p; top->r = r; ++top;\n  while( --top >= Stack ) {\n    p = top->p;\n    r = top->r;\n    while( r > p + 10 ) {\n      seed = seed * 1539415821 + 1;\n      i = p + seed % (r - p + 1);\n      piv = *i;\n      *i = *p;\n      *p = piv;\n      i = p - 1;\n      j = r + 1;\n      do {\n\tdo { ++i; } while( GT( **i, *piv ));\n\tdo { --j; } while( LT( **j, *piv ));\n\tSwap( i, j );\n      } while( i < j );\n      Swap( i, j );\t/* Undo last swap */\n      if( i - p < r - j ) {\n\ttop->p = j+1; top->r = r; ++top;\n\tr = i-1;\n      } else {\n\ttop->p = p; top->r = i-1; ++top;\n\tp = j+1;\n      }\n    }\n    /* Insertion sort small lists */\n    for( i = p+1; i <= r; ++i ) {\n      piv = *i;\n      for( j = i; j > p && LT( **(j-1), *piv ); --j ) {\n\t*j = *(j-1);\n      }\n      *j = piv;\n    }\n  }\n  pq->max = pq->size;\n  pq->initialized = TRUE;\n  __gl_pqHeapInit( pq->heap );\t/* always succeeds */\n\n#ifndef NDEBUG\n  p = pq->order;\n  r = p + pq->size - 1;\n  for( i = p; i < r; ++i ) {\n    assert( LEQ( **(i+1), **i ));\n  }\n#endif\n\n  return 1;\n}\n\n/* really __gl_pqSortInsert */\n/* returns LONG_MAX iff out of memory */ \nPQhandle pqInsert( PriorityQ *pq, PQkey keyNew )\n{\n  long curr;\n\n  if( pq->initialized ) {\n    return __gl_pqHeapInsert( pq->heap, keyNew );\n  }\n  curr = pq->size;\n  if( ++ pq->size >= pq->max ) {\n    PQkey *saveKey= pq->keys;\n\n    /* If the heap overflows, double its size. */\n    pq->max <<= 1;\n    pq->keys = (PQHeapKey *)memRealloc( pq->keys, \n\t \t                        (size_t)\n\t                                 (pq->max * sizeof( pq->keys[0] )));\n    if (pq->keys == NULL) {\t\n       pq->keys = saveKey;\t/* restore ptr to free upon return */\n       return LONG_MAX;\n    }\n  }\n  assert(curr != LONG_MAX);\t\n  pq->keys[curr] = keyNew;\n\n  /* Negative handles index the sorted array. */\n  return -(curr+1);\n}\n\n/* really __gl_pqSortExtractMin */\nPQkey pqExtractMin( PriorityQ *pq )\n{\n  PQkey sortMin, heapMin;\n\n  if( pq->size == 0 ) {\n    return __gl_pqHeapExtractMin( pq->heap );\n  }\n  sortMin = *(pq->order[pq->size-1]);\n  if( ! __gl_pqHeapIsEmpty( pq->heap )) {\n    heapMin = __gl_pqHeapMinimum( pq->heap );\n    if( LEQ( heapMin, sortMin )) {\n      return __gl_pqHeapExtractMin( pq->heap );\n    }\n  }\n  do {\n    -- pq->size;\n  } while( pq->size > 0 && *(pq->order[pq->size-1]) == NULL );\n  return sortMin;\n}\n\n/* really __gl_pqSortMinimum */\nPQkey pqMinimum( PriorityQ *pq )\n{\n  PQkey sortMin, heapMin;\n\n  if( pq->size == 0 ) {\n    return __gl_pqHeapMinimum( pq->heap );\n  }\n  sortMin = *(pq->order[pq->size-1]);\n  if( ! __gl_pqHeapIsEmpty( pq->heap )) {\n    heapMin = __gl_pqHeapMinimum( pq->heap );\n    if( LEQ( heapMin, sortMin )) {\n      return heapMin;\n    }\n  }\n  return sortMin;\n}\n\n/* really __gl_pqSortIsEmpty */\nint pqIsEmpty( PriorityQ *pq )\n{\n  return (pq->size == 0) && __gl_pqHeapIsEmpty( pq->heap );\n}\n\n/* really __gl_pqSortDelete */\nvoid pqDelete( PriorityQ *pq, PQhandle curr )\n{\n  if( curr >= 0 ) {\n    __gl_pqHeapDelete( pq->heap, curr );\n    return;\n  }\n  curr = -(curr+1);\n  assert( curr < pq->max && pq->keys[curr] != NULL );\n\n  pq->keys[curr] = NULL;\n  while( pq->size > 0 && *(pq->order[pq->size-1]) == NULL ) {\n    -- pq->size;\n  }\n}\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/render.c",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/render.c,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#include \"gluos.h\"\n#include <assert.h>\n#include <stddef.h>\n#include \"mesh.h\"\n#include \"tess.h\"\n#include \"render.h\"\n\n#define TRUE 1\n#define FALSE 0\n\n/* This structure remembers the information we need about a primitive\n * to be able to render it later, once we have determined which\n * primitive is able to use the most triangles.\n */\nstruct FaceCount {\n  long\t\tsize;\t\t/* number of triangles used */\n  GLUhalfEdge\t*eStart;\t/* edge where this primitive starts */\n  void\t\t(*render)(SGItesselator *, GLUhalfEdge *, long);\n                                /* routine to render this primitive */\n};\n\nstatic struct FaceCount MaximumFan( GLUhalfEdge *eOrig );\nstatic struct FaceCount MaximumStrip( GLUhalfEdge *eOrig );\n\nstatic void RenderFan( SGItesselator *tess, GLUhalfEdge *eStart, long size );\nstatic void RenderStrip( SGItesselator *tess, GLUhalfEdge *eStart, long size );\nstatic void RenderTriangle( SGItesselator *tess, GLUhalfEdge *eStart,\n\t\t\t    long size );\n\nstatic void RenderMaximumFaceGroup( SGItesselator *tess, GLUface *fOrig );\nstatic void RenderLonelyTriangles( SGItesselator *tess, GLUface *head );\n\n\n\n/************************ Strips and Fans decomposition ******************/\n\n/* __gl_renderMesh( tess, mesh ) takes a mesh and breaks it into triangle\n * fans, strips, and separate triangles.  A substantial effort is made\n * to use as few rendering primitives as possible (ie. to make the fans\n * and strips as large as possible).\n *\n * The rendering output is provided as callbacks (see the api).\n */\nvoid __gl_renderMesh( SGItesselator *tess, GLUmesh *mesh )\n{\n  GLUface *f;\n\n  /* Make a list of separate triangles so we can render them all at once */\n  tess->lonelyTriList = NULL;\n\n  for( f = mesh->fHead.next; f != &mesh->fHead; f = f->next ) {\n    f->marked = FALSE;\n  }\n  for( f = mesh->fHead.next; f != &mesh->fHead; f = f->next ) {\n\n    /* We examine all faces in an arbitrary order.  Whenever we find\n     * an unprocessed face F, we output a group of faces including F\n     * whose size is maximum.\n     */\n    if( f->inside && ! f->marked ) {\n      RenderMaximumFaceGroup( tess, f );\n      assert( f->marked );\n    }\n  }\n  if( tess->lonelyTriList != NULL ) {\n    RenderLonelyTriangles( tess, tess->lonelyTriList );\n    tess->lonelyTriList = NULL;\n  }\n}\n\n\nstatic void RenderMaximumFaceGroup( SGItesselator *tess, GLUface *fOrig )\n{\n  /* We want to find the largest triangle fan or strip of unmarked faces\n   * which includes the given face fOrig.  There are 3 possible fans\n   * passing through fOrig (one centered at each vertex), and 3 possible\n   * strips (one for each CCW permutation of the vertices).  Our strategy\n   * is to try all of these, and take the primitive which uses the most\n   * triangles (a greedy approach).\n   */\n  GLUhalfEdge *e = fOrig->anEdge;\n  struct FaceCount max, newFace;\n\n  max.size = 1;\n  max.eStart = e;\n  max.render = &RenderTriangle;\n\n  if( ! tess->flagBoundary ) {\n    newFace = MaximumFan( e ); if( newFace.size > max.size ) { max = newFace; }\n    newFace = MaximumFan( e->Lnext ); if( newFace.size > max.size ) { max = newFace; }\n    newFace = MaximumFan( e->Lprev ); if( newFace.size > max.size ) { max = newFace; }\n\n    newFace = MaximumStrip( e ); if( newFace.size > max.size ) { max = newFace; }\n    newFace = MaximumStrip( e->Lnext ); if( newFace.size > max.size ) { max = newFace; }\n    newFace = MaximumStrip( e->Lprev ); if( newFace.size > max.size ) { max = newFace; }\n  }\n  (*(max.render))( tess, max.eStart, max.size );\n}\n\n\n/* Macros which keep track of faces we have marked temporarily, and allow\n * us to backtrack when necessary.  With triangle fans, this is not\n * really necessary, since the only awkward case is a loop of triangles\n * around a single origin vertex.  However with strips the situation is\n * more complicated, and we need a general tracking method like the\n * one here.\n */\n#define Marked(f)\t(! (f)->inside || (f)->marked)\n\n#define AddToTrail(f,t)\t((f)->trail = (t), (t) = (f), (f)->marked = TRUE)\n\n#define FreeTrail(t)\tif( 1 ) { \\\n\t\t\t  while( (t) != NULL ) { \\\n\t\t\t    (t)->marked = FALSE; t = (t)->trail; \\\n\t\t\t  } \\\n\t\t\t} else /* absorb trailing semicolon */\n\n\n\nstatic struct FaceCount MaximumFan( GLUhalfEdge *eOrig )\n{\n  /* eOrig->Lface is the face we want to render.  We want to find the size\n   * of a maximal fan around eOrig->Org.  To do this we just walk around\n   * the origin vertex as far as possible in both directions.\n   */\n  struct FaceCount newFace = { 0, NULL, &RenderFan };\n  GLUface *trail = NULL;\n  GLUhalfEdge *e;\n\n  for( e = eOrig; ! Marked( e->Lface ); e = e->Onext ) {\n    AddToTrail( e->Lface, trail );\n    ++newFace.size;\n  }\n  for( e = eOrig; ! Marked( e->Rface ); e = e->Oprev ) {\n    AddToTrail( e->Rface, trail );\n    ++newFace.size;\n  }\n  newFace.eStart = e;\n  /*LINTED*/\n  FreeTrail( trail );\n  return newFace;\n}\n\n\n#define IsEven(n)\t(((n) & 1) == 0)\n\nstatic struct FaceCount MaximumStrip( GLUhalfEdge *eOrig )\n{\n  /* Here we are looking for a maximal strip that contains the vertices\n   * eOrig->Org, eOrig->Dst, eOrig->Lnext->Dst (in that order or the\n   * reverse, such that all triangles are oriented CCW).\n   *\n   * Again we walk forward and backward as far as possible.  However for\n   * strips there is a twist: to get CCW orientations, there must be\n   * an *even* number of triangles in the strip on one side of eOrig.\n   * We walk the strip starting on a side with an even number of triangles;\n   * if both side have an odd number, we are forced to shorten one side.\n   */\n  struct FaceCount newFace = { 0, NULL, &RenderStrip };\n  long headSize = 0, tailSize = 0;\n  GLUface *trail = NULL;\n  GLUhalfEdge *e, *eTail, *eHead;\n\n  for( e = eOrig; ! Marked( e->Lface ); ++tailSize, e = e->Onext ) {\n    AddToTrail( e->Lface, trail );\n    ++tailSize;\n    e = e->Dprev;\n    if( Marked( e->Lface )) break;\n    AddToTrail( e->Lface, trail );\n  }\n  eTail = e;\n\n  for( e = eOrig; ! Marked( e->Rface ); ++headSize, e = e->Dnext ) {\n    AddToTrail( e->Rface, trail );\n    ++headSize;\n    e = e->Oprev;\n    if( Marked( e->Rface )) break;\n    AddToTrail( e->Rface, trail );\n  }\n  eHead = e;\n\n  newFace.size = tailSize + headSize;\n  if( IsEven( tailSize )) {\n    newFace.eStart = eTail->Sym;\n  } else if( IsEven( headSize )) {\n    newFace.eStart = eHead;\n  } else {\n    /* Both sides have odd length, we must shorten one of them.  In fact,\n     * we must start from eHead to guarantee inclusion of eOrig->Lface.\n     */\n    --newFace.size;\n    newFace.eStart = eHead->Onext;\n  }\n  /*LINTED*/\n  FreeTrail( trail );\n  return newFace;\n}\n\n\nstatic void RenderTriangle( SGItesselator *tess, GLUhalfEdge *e, long size )\n{\n  /* Just add the triangle to a triangle list, so we can render all\n   * the separate triangles at once.\n   */\n  assert( size == 1 );\n  AddToTrail( e->Lface, tess->lonelyTriList );\n}\n\n\nstatic void RenderLonelyTriangles( SGItesselator *tess, GLUface *f )\n{\n  /* Now we render all the separate triangles which could not be\n   * grouped into a triangle fan or strip.\n   */\n  GLUhalfEdge *e;\n  int newState;\n  int edgeState = -1;\t/* force edge state output for first vertex */\n\n  CALL_BEGIN_OR_BEGIN_DATA( GL_TRIANGLES );\n\n  for( ; f != NULL; f = f->trail ) {\n    /* Loop once for each edge (there will always be 3 edges) */\n\n    e = f->anEdge;\n    do {\n      if( tess->flagBoundary ) {\n\t/* Set the \"edge state\" to TRUE just before we output the\n\t * first vertex of each edge on the polygon boundary.\n\t */\n\tnewState = ! e->Rface->inside;\n\tif( edgeState != newState ) {\n\t  edgeState = newState;\n          CALL_EDGE_FLAG_OR_EDGE_FLAG_DATA( edgeState );\n\t}\n      }\n      CALL_VERTEX_OR_VERTEX_DATA( e->Org->data );\n\n      e = e->Lnext;\n    } while( e != f->anEdge );\n  }\n  CALL_END_OR_END_DATA();\n}\n\n\nstatic void RenderFan( SGItesselator *tess, GLUhalfEdge *e, long size )\n{\n  /* Render as many CCW triangles as possible in a fan starting from\n   * edge \"e\".  The fan *should* contain exactly \"size\" triangles\n   * (otherwise we've goofed up somewhere).\n   */\n  CALL_BEGIN_OR_BEGIN_DATA( GL_TRIANGLE_FAN ); \n  CALL_VERTEX_OR_VERTEX_DATA( e->Org->data ); \n  CALL_VERTEX_OR_VERTEX_DATA( e->Dst->data ); \n\n  while( ! Marked( e->Lface )) {\n    e->Lface->marked = TRUE;\n    --size;\n    e = e->Onext;\n    CALL_VERTEX_OR_VERTEX_DATA( e->Dst->data ); \n  }\n\n  assert( size == 0 );\n  CALL_END_OR_END_DATA();\n}\n\n\nstatic void RenderStrip( SGItesselator *tess, GLUhalfEdge *e, long size )\n{\n  /* Render as many CCW triangles as possible in a strip starting from\n   * edge \"e\".  The strip *should* contain exactly \"size\" triangles\n   * (otherwise we've goofed up somewhere).\n   */\n  CALL_BEGIN_OR_BEGIN_DATA( GL_TRIANGLE_STRIP );\n  CALL_VERTEX_OR_VERTEX_DATA( e->Org->data ); \n  CALL_VERTEX_OR_VERTEX_DATA( e->Dst->data ); \n\n  while( ! Marked( e->Lface )) {\n    e->Lface->marked = TRUE;\n    --size;\n    e = e->Dprev;\n    CALL_VERTEX_OR_VERTEX_DATA( e->Org->data ); \n    if( Marked( e->Lface )) break;\n\n    e->Lface->marked = TRUE;\n    --size;\n    e = e->Onext;\n    CALL_VERTEX_OR_VERTEX_DATA( e->Dst->data ); \n  }\n\n  assert( size == 0 );\n  CALL_END_OR_END_DATA();\n}\n\n\n/************************ Boundary contour decomposition ******************/\n\n/* __gl_renderBoundary( tess, mesh ) takes a mesh, and outputs one\n * contour for each face marked \"inside\".  The rendering output is\n * provided as callbacks (see the api).\n */\nvoid __gl_renderBoundary( SGItesselator *tess, GLUmesh *mesh )\n{\n  GLUface *f;\n  GLUhalfEdge *e;\n\n  for( f = mesh->fHead.next; f != &mesh->fHead; f = f->next ) {\n    if( f->inside ) {\n      CALL_BEGIN_OR_BEGIN_DATA( GL_LINE_LOOP );\n      e = f->anEdge;\n      do {\n        CALL_VERTEX_OR_VERTEX_DATA( e->Org->data ); \n\te = e->Lnext;\n      } while( e != f->anEdge );\n      CALL_END_OR_END_DATA();\n    }\n  }\n}\n\n\n/************************ Quick-and-dirty decomposition ******************/\n\n#define SIGN_INCONSISTENT 2\n\nstatic int ComputeNormal( SGItesselator *tess, GLdouble norm[3], int check )\n/*\n * If check==FALSE, we compute the polygon normal and place it in norm[].\n * If check==TRUE, we check that each triangle in the fan from v0 has a\n * consistent orientation with respect to norm[].  If triangles are\n * consistently oriented CCW, return 1; if CW, return -1; if all triangles\n * are degenerate return 0; otherwise (no consistent orientation) return\n * SIGN_INCONSISTENT.\n */\n{\n  CachedVertex *v0 = tess->cache;\n  CachedVertex *vn = v0 + tess->cacheCount;\n  CachedVertex *vc;\n  GLdouble dot, xc, yc, zc, xp, yp, zp, n[3];\n  int sign = 0;\n\n  /* Find the polygon normal.  It is important to get a reasonable\n   * normal even when the polygon is self-intersecting (eg. a bowtie).\n   * Otherwise, the computed normal could be very tiny, but perpendicular\n   * to the true plane of the polygon due to numerical noise.  Then all\n   * the triangles would appear to be degenerate and we would incorrectly\n   * decompose the polygon as a fan (or simply not render it at all).\n   *\n   * We use a sum-of-triangles normal algorithm rather than the more\n   * efficient sum-of-trapezoids method (used in CheckOrientation()\n   * in normal.c).  This lets us explicitly reverse the signed area\n   * of some triangles to get a reasonable normal in the self-intersecting\n   * case.\n   */\n  if( ! check ) {\n    norm[0] = norm[1] = norm[2] = 0.0;\n  }\n\n  vc = v0 + 1;\n  xc = vc->coords[0] - v0->coords[0];\n  yc = vc->coords[1] - v0->coords[1];\n  zc = vc->coords[2] - v0->coords[2];\n  while( ++vc < vn ) {\n    xp = xc; yp = yc; zp = zc;\n    xc = vc->coords[0] - v0->coords[0];\n    yc = vc->coords[1] - v0->coords[1];\n    zc = vc->coords[2] - v0->coords[2];\n\n    /* Compute (vp - v0) cross (vc - v0) */\n    n[0] = yp*zc - zp*yc;\n    n[1] = zp*xc - xp*zc;\n    n[2] = xp*yc - yp*xc;\n\n    dot = n[0]*norm[0] + n[1]*norm[1] + n[2]*norm[2];\n    if( ! check ) {\n      /* Reverse the contribution of back-facing triangles to get\n       * a reasonable normal for self-intersecting polygons (see above)\n       */\n      if( dot >= 0 ) {\n\tnorm[0] += n[0]; norm[1] += n[1]; norm[2] += n[2];\n      } else {\n\tnorm[0] -= n[0]; norm[1] -= n[1]; norm[2] -= n[2];\n      }\n    } else if( dot != 0 ) {\n      /* Check the new orientation for consistency with previous triangles */\n      if( dot > 0 ) {\n\tif( sign < 0 ) return SIGN_INCONSISTENT;\n\tsign = 1;\n      } else {\n\tif( sign > 0 ) return SIGN_INCONSISTENT;\n\tsign = -1;\n      }\n    }\n  }\n  return sign;\n}\n\n/* __gl_renderCache( tess ) takes a single contour and tries to render it\n * as a triangle fan.  This handles convex polygons, as well as some\n * non-convex polygons if we get lucky.\n *\n * Returns TRUE if the polygon was successfully rendered.  The rendering\n * output is provided as callbacks (see the api).\n */\nGLboolean __gl_renderCache( SGItesselator *tess )\n{\n  CachedVertex *v0 = tess->cache;\n  CachedVertex *vn = v0 + tess->cacheCount;\n  CachedVertex *vc;\n  GLdouble norm[3];\n  int sign;\n\n  if( tess->cacheCount < 3 ) {\n    /* Degenerate contour -- no output */\n    return TRUE;\n  }\n\n  norm[0] = tess->normal[0];\n  norm[1] = tess->normal[1];\n  norm[2] = tess->normal[2];\n  if( norm[0] == 0 && norm[1] == 0 && norm[2] == 0 ) {\n    ComputeNormal( tess, norm, FALSE );\n  }\n\n  sign = ComputeNormal( tess, norm, TRUE );\n  if( sign == SIGN_INCONSISTENT ) {\n    /* Fan triangles did not have a consistent orientation */\n    return FALSE;\n  }\n  if( sign == 0 ) {\n    /* All triangles were degenerate */\n    return TRUE;\n  }\n\n  /* Make sure we do the right thing for each winding rule */\n  switch( tess->windingRule ) {\n  case GLU_TESS_WINDING_ODD:\n  case GLU_TESS_WINDING_NONZERO:\n    break;\n  case GLU_TESS_WINDING_POSITIVE:\n    if( sign < 0 ) return TRUE;\n    break;\n  case GLU_TESS_WINDING_NEGATIVE:\n    if( sign > 0 ) return TRUE;\n    break;\n  case GLU_TESS_WINDING_ABS_GEQ_TWO:\n    return TRUE;\n  }\n\n  CALL_BEGIN_OR_BEGIN_DATA( tess->boundaryOnly ? GL_LINE_LOOP\n\t\t\t  : (tess->cacheCount > 3) ? GL_TRIANGLE_FAN\n\t\t\t  : GL_TRIANGLES );\n\n  CALL_VERTEX_OR_VERTEX_DATA( v0->data ); \n  if( sign > 0 ) {\n    for( vc = v0+1; vc < vn; ++vc ) {\n      CALL_VERTEX_OR_VERTEX_DATA( vc->data ); \n    }\n  } else {\n    for( vc = vn-1; vc > v0; --vc ) {\n      CALL_VERTEX_OR_VERTEX_DATA( vc->data ); \n    }\n  }\n  CALL_END_OR_END_DATA();\n  return TRUE;\n}\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/render.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/render.h,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#ifndef __render_h_\n#define __render_h_\n\n#include \"mesh.h\"\n\n/* __gl_renderMesh( tess, mesh ) takes a mesh and breaks it into triangle\n * fans, strips, and separate triangles.  A substantial effort is made\n * to use as few rendering primitives as possible (ie. to make the fans\n * and strips as large as possible).\n *\n * The rendering output is provided as callbacks (see the api).\n */\nvoid __gl_renderMesh( SGItesselator *tess, GLUmesh *mesh );\nvoid __gl_renderBoundary( SGItesselator *tess, GLUmesh *mesh );\n\nGLboolean __gl_renderCache( SGItesselator *tess );\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/sweep.c",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n**\n** http://oss.sgi.com/projects/FreeB\n**\n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n**\n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n**\n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n*/\n\n#include \"gluos.h\"\n#include <assert.h>\n#include <stddef.h>\n#include <setjmp.h>\t\t/* longjmp */\n#include <limits.h>\t\t/* LONG_MAX */\n\n#include \"mesh.h\"\n#include \"geom.h\"\n#include \"tess.h\"\n#include \"dict.h\"\n#include \"priorityq-sort.h\"\n#include \"memalloc.h\"\n#include \"sweep.h\"\n\n#define TRUE 1\n#define FALSE 0\n\n#ifdef FOR_TRITE_TEST_PROGRAM\nextern void DebugEvent( SGItesselator *tess );\n#else\n#define DebugEvent( tess )\n#endif\n\n/*\n * Invariants for the Edge Dictionary.\n * - each pair of adjacent edges e2=Succ(e1) satisfies EdgeLeq(e1,e2)\n *   at any valid location of the sweep event\n * - if EdgeLeq(e2,e1) as well (at any valid sweep event), then e1 and e2\n *   share a common endpoint\n * - for each e, e->Dst has been processed, but not e->Org\n * - each edge e satisfies VertLeq(e->Dst,event) && VertLeq(event,e->Org)\n *   where \"event\" is the current sweep line event.\n * - no edge e has zero length\n *\n * Invariants for the Mesh (the processed portion).\n * - the portion of the mesh left of the sweep line is a planar graph,\n *   ie. there is *some* way to embed it in the plane\n * - no processed edge has zero length\n * - no two processed vertices have identical coordinates\n * - each \"inside\" region is monotone, ie. can be broken into two chains\n *   of monotonically increasing vertices according to VertLeq(v1,v2)\n *   - a non-invariant: these chains may intersect (very slightly)\n *\n * Invariants for the Sweep.\n * - if none of the edges incident to the event vertex have an activeRegion\n *   (ie. none of these edges are in the edge dictionary), then the vertex\n *   has only right-going edges.\n * - if an edge is marked \"fixUpperEdge\" (it is a temporary edge introduced\n *   by ConnectRightVertex), then it is the only right-going edge from\n *   its associated vertex.  (This says that these edges exist only\n *   when it is necessary.)\n */\n\n#undef\tMAX\n#undef\tMIN\n#define MAX(x,y)\t((x) >= (y) ? (x) : (y))\n#define MIN(x,y)\t((x) <= (y) ? (x) : (y))\n\n/* When we merge two edges into one, we need to compute the combined\n * winding of the new edge.\n */\n#define AddWinding(eDst,eSrc)\t(eDst->winding += eSrc->winding, \\\n                                 eDst->Sym->winding += eSrc->Sym->winding)\n\nstatic void SweepEvent( SGItesselator *tess, GLUvertex *vEvent );\nstatic void WalkDirtyRegions( SGItesselator *tess, ActiveRegion *regUp );\nstatic int CheckForRightSplice( SGItesselator *tess, ActiveRegion *regUp );\n\nstatic int EdgeLeq( SGItesselator *tess, ActiveRegion *reg1,\n\t\t    ActiveRegion *reg2 )\n/*\n * Both edges must be directed from right to left (this is the canonical\n * direction for the upper edge of each region).\n *\n * The strategy is to evaluate a \"t\" value for each edge at the\n * current sweep line position, given by tess->event.  The calculations\n * are designed to be very stable, but of course they are not perfect.\n *\n * Special case: if both edge destinations are at the sweep event,\n * we sort the edges by slope (they would otherwise compare equally).\n */\n{\n  GLUvertex *event = tess->event;\n  GLUhalfEdge *e1, *e2;\n  GLdouble t1, t2;\n\n  e1 = reg1->eUp;\n  e2 = reg2->eUp;\n\n  if( e1->Dst == event ) {\n    if( e2->Dst == event ) {\n      /* Two edges right of the sweep line which meet at the sweep event.\n       * Sort them by slope.\n       */\n      if( VertLeq( e1->Org, e2->Org )) {\n\treturn EdgeSign( e2->Dst, e1->Org, e2->Org ) <= 0;\n      }\n      return EdgeSign( e1->Dst, e2->Org, e1->Org ) >= 0;\n    }\n    return EdgeSign( e2->Dst, event, e2->Org ) <= 0;\n  }\n  if( e2->Dst == event ) {\n    return EdgeSign( e1->Dst, event, e1->Org ) >= 0;\n  }\n\n  /* General case - compute signed distance *from* e1, e2 to event */\n  t1 = EdgeEval( e1->Dst, event, e1->Org );\n  t2 = EdgeEval( e2->Dst, event, e2->Org );\n  return (t1 >= t2);\n}\n\n\nstatic void DeleteRegion( SGItesselator *tess, ActiveRegion *reg )\n{\n  if( reg->fixUpperEdge ) {\n    /* It was created with zero winding number, so it better be\n     * deleted with zero winding number (ie. it better not get merged\n     * with a real edge).\n     */\n    assert( reg->eUp->winding == 0 );\n  }\n  reg->eUp->activeRegion = NULL;\n  dictDelete( tess->dict, reg->nodeUp ); /* __gl_dictListDelete */\n  memFree( reg );\n}\n\n\nstatic int FixUpperEdge( ActiveRegion *reg, GLUhalfEdge *newEdge )\n/*\n * Replace an upper edge which needs fixing (see ConnectRightVertex).\n */\n{\n  assert( reg->fixUpperEdge );\n  if ( !__gl_meshDelete( reg->eUp ) ) return 0;\n  reg->fixUpperEdge = FALSE;\n  reg->eUp = newEdge;\n  newEdge->activeRegion = reg;\n\n  return 1;\n}\n\nstatic ActiveRegion *TopLeftRegion( ActiveRegion *reg )\n{\n  GLUvertex *org = reg->eUp->Org;\n  GLUhalfEdge *e;\n\n  /* Find the region above the uppermost edge with the same origin */\n  do {\n    reg = RegionAbove( reg );\n  } while( reg->eUp->Org == org );\n\n  /* If the edge above was a temporary edge introduced by ConnectRightVertex,\n   * now is the time to fix it.\n   */\n  if( reg->fixUpperEdge ) {\n    e = __gl_meshConnect( RegionBelow(reg)->eUp->Sym, reg->eUp->Lnext );\n    if (e == NULL) return NULL;\n    if ( !FixUpperEdge( reg, e ) ) return NULL;\n    reg = RegionAbove( reg );\n  }\n  return reg;\n}\n\nstatic ActiveRegion *TopRightRegion( ActiveRegion *reg )\n{\n  GLUvertex *dst = reg->eUp->Dst;\n\n  /* Find the region above the uppermost edge with the same destination */\n  do {\n    reg = RegionAbove( reg );\n  } while( reg->eUp->Dst == dst );\n  return reg;\n}\n\nstatic ActiveRegion *AddRegionBelow( SGItesselator *tess,\n\t\t\t\t     ActiveRegion *regAbove,\n\t\t\t\t     GLUhalfEdge *eNewUp )\n/*\n * Add a new active region to the sweep line, *somewhere* below \"regAbove\"\n * (according to where the new edge belongs in the sweep-line dictionary).\n * The upper edge of the new region will be \"eNewUp\".\n * Winding number and \"inside\" flag are not updated.\n */\n{\n  ActiveRegion *regNew = (ActiveRegion *)memAlloc( sizeof( ActiveRegion ));\n  if (regNew == NULL) longjmp(tess->env,1);\n\n  regNew->eUp = eNewUp;\n  /* __gl_dictListInsertBefore */\n  regNew->nodeUp = dictInsertBefore( tess->dict, regAbove->nodeUp, regNew );\n  if (regNew->nodeUp == NULL) longjmp(tess->env,1);\n  regNew->fixUpperEdge = FALSE;\n  regNew->sentinel = FALSE;\n  regNew->dirty = FALSE;\n\n  eNewUp->activeRegion = regNew;\n  return regNew;\n}\n\nstatic GLboolean IsWindingInside( SGItesselator *tess, int n )\n{\n  switch( tess->windingRule ) {\n  case GLU_TESS_WINDING_ODD:\n    return (n & 1);\n  case GLU_TESS_WINDING_NONZERO:\n    return (n != 0);\n  case GLU_TESS_WINDING_POSITIVE:\n    return (n > 0);\n  case GLU_TESS_WINDING_NEGATIVE:\n    return (n < 0);\n  case GLU_TESS_WINDING_ABS_GEQ_TWO:\n    return (n >= 2) || (n <= -2);\n  }\n  /*LINTED*/\n  assert( FALSE );\n  /*NOTREACHED*/\n  return GL_FALSE;  /* avoid compiler complaints */\n}\n\n\nstatic void ComputeWinding( SGItesselator *tess, ActiveRegion *reg )\n{\n  reg->windingNumber = RegionAbove(reg)->windingNumber + reg->eUp->winding;\n  reg->inside = IsWindingInside( tess, reg->windingNumber );\n}\n\n\nstatic void FinishRegion( SGItesselator *tess, ActiveRegion *reg )\n/*\n * Delete a region from the sweep line.  This happens when the upper\n * and lower chains of a region meet (at a vertex on the sweep line).\n * The \"inside\" flag is copied to the appropriate mesh face (we could\n * not do this before -- since the structure of the mesh is always\n * changing, this face may not have even existed until now).\n */\n{\n  GLUhalfEdge *e = reg->eUp;\n  GLUface *f = e->Lface;\n\n  f->inside = reg->inside;\n  f->anEdge = e;   /* optimization for __gl_meshTessellateMonoRegion() */\n  DeleteRegion( tess, reg );\n}\n\n\nstatic GLUhalfEdge *FinishLeftRegions( SGItesselator *tess,\n\t       ActiveRegion *regFirst, ActiveRegion *regLast )\n/*\n * We are given a vertex with one or more left-going edges.  All affected\n * edges should be in the edge dictionary.  Starting at regFirst->eUp,\n * we walk down deleting all regions where both edges have the same\n * origin vOrg.  At the same time we copy the \"inside\" flag from the\n * active region to the face, since at this point each face will belong\n * to at most one region (this was not necessarily true until this point\n * in the sweep).  The walk stops at the region above regLast; if regLast\n * is NULL we walk as far as possible.\tAt the same time we relink the\n * mesh if necessary, so that the ordering of edges around vOrg is the\n * same as in the dictionary.\n */\n{\n  ActiveRegion *reg, *regPrev;\n  GLUhalfEdge *e, *ePrev;\n\n  regPrev = regFirst;\n  ePrev = regFirst->eUp;\n  while( regPrev != regLast ) {\n    regPrev->fixUpperEdge = FALSE;\t/* placement was OK */\n    reg = RegionBelow( regPrev );\n    e = reg->eUp;\n    if( e->Org != ePrev->Org ) {\n      if( ! reg->fixUpperEdge ) {\n\t/* Remove the last left-going edge.  Even though there are no further\n\t * edges in the dictionary with this origin, there may be further\n\t * such edges in the mesh (if we are adding left edges to a vertex\n\t * that has already been processed).  Thus it is important to call\n\t * FinishRegion rather than just DeleteRegion.\n\t */\n\tFinishRegion( tess, regPrev );\n\tbreak;\n      }\n      /* If the edge below was a temporary edge introduced by\n       * ConnectRightVertex, now is the time to fix it.\n       */\n      e = __gl_meshConnect( ePrev->Lprev, e->Sym );\n      if (e == NULL) longjmp(tess->env,1);\n      if ( !FixUpperEdge( reg, e ) ) longjmp(tess->env,1);\n    }\n\n    /* Relink edges so that ePrev->Onext == e */\n    if( ePrev->Onext != e ) {\n      if ( !__gl_meshSplice( e->Oprev, e ) ) longjmp(tess->env,1);\n      if ( !__gl_meshSplice( ePrev, e ) ) longjmp(tess->env,1);\n    }\n    FinishRegion( tess, regPrev );\t/* may change reg->eUp */\n    ePrev = reg->eUp;\n    regPrev = reg;\n  }\n  return ePrev;\n}\n\n\nstatic void AddRightEdges( SGItesselator *tess, ActiveRegion *regUp,\n       GLUhalfEdge *eFirst, GLUhalfEdge *eLast, GLUhalfEdge *eTopLeft,\n       GLboolean cleanUp )\n/*\n * Purpose: insert right-going edges into the edge dictionary, and update\n * winding numbers and mesh connectivity appropriately.  All right-going\n * edges share a common origin vOrg.  Edges are inserted CCW starting at\n * eFirst; the last edge inserted is eLast->Oprev.  If vOrg has any\n * left-going edges already processed, then eTopLeft must be the edge\n * such that an imaginary upward vertical segment from vOrg would be\n * contained between eTopLeft->Oprev and eTopLeft; otherwise eTopLeft\n * should be NULL.\n */\n{\n  ActiveRegion *reg, *regPrev;\n  GLUhalfEdge *e, *ePrev;\n  int firstTime = TRUE;\n\n  /* Insert the new right-going edges in the dictionary */\n  e = eFirst;\n  do {\n    assert( VertLeq( e->Org, e->Dst ));\n    AddRegionBelow( tess, regUp, e->Sym );\n    e = e->Onext;\n  } while ( e != eLast );\n\n  /* Walk *all* right-going edges from e->Org, in the dictionary order,\n   * updating the winding numbers of each region, and re-linking the mesh\n   * edges to match the dictionary ordering (if necessary).\n   */\n  if( eTopLeft == NULL ) {\n    eTopLeft = RegionBelow( regUp )->eUp->Rprev;\n  }\n  regPrev = regUp;\n  ePrev = eTopLeft;\n  for( ;; ) {\n    reg = RegionBelow( regPrev );\n    e = reg->eUp->Sym;\n    if( e->Org != ePrev->Org ) break;\n\n    if( e->Onext != ePrev ) {\n      /* Unlink e from its current position, and relink below ePrev */\n      if ( !__gl_meshSplice( e->Oprev, e ) ) longjmp(tess->env,1);\n      if ( !__gl_meshSplice( ePrev->Oprev, e ) ) longjmp(tess->env,1);\n    }\n    /* Compute the winding number and \"inside\" flag for the new regions */\n    reg->windingNumber = regPrev->windingNumber - e->winding;\n    reg->inside = IsWindingInside( tess, reg->windingNumber );\n\n    /* Check for two outgoing edges with same slope -- process these\n     * before any intersection tests (see example in __gl_computeInterior).\n     */\n    regPrev->dirty = TRUE;\n    if( ! firstTime && CheckForRightSplice( tess, regPrev )) {\n      AddWinding( e, ePrev );\n      DeleteRegion( tess, regPrev );\n      if ( !__gl_meshDelete( ePrev ) ) longjmp(tess->env,1);\n    }\n    firstTime = FALSE;\n    regPrev = reg;\n    ePrev = e;\n  }\n  regPrev->dirty = TRUE;\n  assert( regPrev->windingNumber - e->winding == reg->windingNumber );\n\n  if( cleanUp ) {\n    /* Check for intersections between newly adjacent edges. */\n    WalkDirtyRegions( tess, regPrev );\n  }\n}\n\n\nstatic void CallCombine( SGItesselator *tess, GLUvertex *isect,\n\t\t\t void *data[4], GLfloat weights[4], int needed )\n{\n  GLdouble coords[3];\n\n  /* Copy coord data in case the callback changes it. */\n  coords[0] = isect->coords[0];\n  coords[1] = isect->coords[1];\n  coords[2] = isect->coords[2];\n\n  isect->data = NULL;\n  CALL_COMBINE_OR_COMBINE_DATA( coords, data, weights, &isect->data );\n  if( isect->data == NULL ) {\n    if( ! needed ) {\n      isect->data = data[0];\n    } else if( ! tess->fatalError ) {\n      /* The only way fatal error is when two edges are found to intersect,\n       * but the user has not provided the callback necessary to handle\n       * generated intersection points.\n       */\n      CALL_ERROR_OR_ERROR_DATA( GLU_TESS_NEED_COMBINE_CALLBACK );\n      tess->fatalError = TRUE;\n    }\n  }\n}\n\nstatic void SpliceMergeVertices( SGItesselator *tess, GLUhalfEdge *e1,\n\t\t\t\t GLUhalfEdge *e2 )\n/*\n * Two vertices with idential coordinates are combined into one.\n * e1->Org is kept, while e2->Org is discarded.\n */\n{\n  void *data[4] = { NULL, NULL, NULL, NULL };\n  GLfloat weights[4] = { 0.5, 0.5, 0.0, 0.0 };\n\n  data[0] = e1->Org->data;\n  data[1] = e2->Org->data;\n  CallCombine( tess, e1->Org, data, weights, FALSE );\n  if ( !__gl_meshSplice( e1, e2 ) ) longjmp(tess->env,1);\n}\n\nstatic void VertexWeights( GLUvertex *isect, GLUvertex *org, GLUvertex *dst,\n\t\t\t   GLfloat *weights )\n/*\n * Find some weights which describe how the intersection vertex is\n * a linear combination of \"org\" and \"dest\".  Each of the two edges\n * which generated \"isect\" is allocated 50% of the weight; each edge\n * splits the weight between its org and dst according to the\n * relative distance to \"isect\".\n */\n{\n  GLdouble t1 = VertL1dist( org, isect );\n  GLdouble t2 = VertL1dist( dst, isect );\n\n  weights[0] = 0.5 * t2 / (t1 + t2);\n  weights[1] = 0.5 * t1 / (t1 + t2);\n  isect->coords[0] += weights[0]*org->coords[0] + weights[1]*dst->coords[0];\n  isect->coords[1] += weights[0]*org->coords[1] + weights[1]*dst->coords[1];\n  isect->coords[2] += weights[0]*org->coords[2] + weights[1]*dst->coords[2];\n}\n\n\nstatic void GetIntersectData( SGItesselator *tess, GLUvertex *isect,\n       GLUvertex *orgUp, GLUvertex *dstUp,\n       GLUvertex *orgLo, GLUvertex *dstLo )\n/*\n * We've computed a new intersection point, now we need a \"data\" pointer\n * from the user so that we can refer to this new vertex in the\n * rendering callbacks.\n */\n{\n  void *data[4];\n  GLfloat weights[4];\n\n  data[0] = orgUp->data;\n  data[1] = dstUp->data;\n  data[2] = orgLo->data;\n  data[3] = dstLo->data;\n\n  isect->coords[0] = isect->coords[1] = isect->coords[2] = 0;\n  VertexWeights( isect, orgUp, dstUp, &weights[0] );\n  VertexWeights( isect, orgLo, dstLo, &weights[2] );\n\n  CallCombine( tess, isect, data, weights, TRUE );\n}\n\nstatic int CheckForRightSplice( SGItesselator *tess, ActiveRegion *regUp )\n/*\n * Check the upper and lower edge of \"regUp\", to make sure that the\n * eUp->Org is above eLo, or eLo->Org is below eUp (depending on which\n * origin is leftmost).\n *\n * The main purpose is to splice right-going edges with the same\n * dest vertex and nearly identical slopes (ie. we can't distinguish\n * the slopes numerically).  However the splicing can also help us\n * to recover from numerical errors.  For example, suppose at one\n * point we checked eUp and eLo, and decided that eUp->Org is barely\n * above eLo.  Then later, we split eLo into two edges (eg. from\n * a splice operation like this one).  This can change the result of\n * our test so that now eUp->Org is incident to eLo, or barely below it.\n * We must correct this condition to maintain the dictionary invariants.\n *\n * One possibility is to check these edges for intersection again\n * (ie. CheckForIntersect).  This is what we do if possible.  However\n * CheckForIntersect requires that tess->event lies between eUp and eLo,\n * so that it has something to fall back on when the intersection\n * calculation gives us an unusable answer.  So, for those cases where\n * we can't check for intersection, this routine fixes the problem\n * by just splicing the offending vertex into the other edge.\n * This is a guaranteed solution, no matter how degenerate things get.\n * Basically this is a combinatorial solution to a numerical problem.\n */\n{\n  ActiveRegion *regLo = RegionBelow(regUp);\n  GLUhalfEdge *eUp = regUp->eUp;\n  GLUhalfEdge *eLo = regLo->eUp;\n\n  if( VertLeq( eUp->Org, eLo->Org )) {\n    if( EdgeSign( eLo->Dst, eUp->Org, eLo->Org ) > 0 ) return FALSE;\n\n    /* eUp->Org appears to be below eLo */\n    if( ! VertEq( eUp->Org, eLo->Org )) {\n      /* Splice eUp->Org into eLo */\n      if ( __gl_meshSplitEdge( eLo->Sym ) == NULL) longjmp(tess->env,1);\n      if ( !__gl_meshSplice( eUp, eLo->Oprev ) ) longjmp(tess->env,1);\n      regUp->dirty = regLo->dirty = TRUE;\n\n    } else if( eUp->Org != eLo->Org ) {\n      /* merge the two vertices, discarding eUp->Org */\n      pqDelete( tess->pq, eUp->Org->pqHandle ); /* __gl_pqSortDelete */\n      SpliceMergeVertices( tess, eLo->Oprev, eUp );\n    }\n  } else {\n    if( EdgeSign( eUp->Dst, eLo->Org, eUp->Org ) < 0 ) return FALSE;\n\n    /* eLo->Org appears to be above eUp, so splice eLo->Org into eUp */\n    RegionAbove(regUp)->dirty = regUp->dirty = TRUE;\n    if (__gl_meshSplitEdge( eUp->Sym ) == NULL) longjmp(tess->env,1);\n    if ( !__gl_meshSplice( eLo->Oprev, eUp ) ) longjmp(tess->env,1);\n  }\n  return TRUE;\n}\n\nstatic int CheckForLeftSplice( SGItesselator *tess, ActiveRegion *regUp )\n/*\n * Check the upper and lower edge of \"regUp\", to make sure that the\n * eUp->Dst is above eLo, or eLo->Dst is below eUp (depending on which\n * destination is rightmost).\n *\n * Theoretically, this should always be true.  However, splitting an edge\n * into two pieces can change the results of previous tests.  For example,\n * suppose at one point we checked eUp and eLo, and decided that eUp->Dst\n * is barely above eLo.  Then later, we split eLo into two edges (eg. from\n * a splice operation like this one).  This can change the result of\n * the test so that now eUp->Dst is incident to eLo, or barely below it.\n * We must correct this condition to maintain the dictionary invariants\n * (otherwise new edges might get inserted in the wrong place in the\n * dictionary, and bad stuff will happen).\n *\n * We fix the problem by just splicing the offending vertex into the\n * other edge.\n */\n{\n  ActiveRegion *regLo = RegionBelow(regUp);\n  GLUhalfEdge *eUp = regUp->eUp;\n  GLUhalfEdge *eLo = regLo->eUp;\n  GLUhalfEdge *e;\n\n  assert( ! VertEq( eUp->Dst, eLo->Dst ));\n\n  if( VertLeq( eUp->Dst, eLo->Dst )) {\n    if( EdgeSign( eUp->Dst, eLo->Dst, eUp->Org ) < 0 ) return FALSE;\n\n    /* eLo->Dst is above eUp, so splice eLo->Dst into eUp */\n    RegionAbove(regUp)->dirty = regUp->dirty = TRUE;\n    e = __gl_meshSplitEdge( eUp );\n    if (e == NULL) longjmp(tess->env,1);\n    if ( !__gl_meshSplice( eLo->Sym, e ) ) longjmp(tess->env,1);\n    e->Lface->inside = regUp->inside;\n  } else {\n    if( EdgeSign( eLo->Dst, eUp->Dst, eLo->Org ) > 0 ) return FALSE;\n\n    /* eUp->Dst is below eLo, so splice eUp->Dst into eLo */\n    regUp->dirty = regLo->dirty = TRUE;\n    e = __gl_meshSplitEdge( eLo );\n    if (e == NULL) longjmp(tess->env,1);\n    if ( !__gl_meshSplice( eUp->Lnext, eLo->Sym ) ) longjmp(tess->env,1);\n    e->Rface->inside = regUp->inside;\n  }\n  return TRUE;\n}\n\n\nstatic int CheckForIntersect( SGItesselator *tess, ActiveRegion *regUp )\n/*\n * Check the upper and lower edges of the given region to see if\n * they intersect.  If so, create the intersection and add it\n * to the data structures.\n *\n * Returns TRUE if adding the new intersection resulted in a recursive\n * call to AddRightEdges(); in this case all \"dirty\" regions have been\n * checked for intersections, and possibly regUp has been deleted.\n */\n{\n  ActiveRegion *regLo = RegionBelow(regUp);\n  GLUhalfEdge *eUp = regUp->eUp;\n  GLUhalfEdge *eLo = regLo->eUp;\n  GLUvertex *orgUp = eUp->Org;\n  GLUvertex *orgLo = eLo->Org;\n  GLUvertex *dstUp = eUp->Dst;\n  GLUvertex *dstLo = eLo->Dst;\n  GLdouble tMinUp, tMaxLo;\n  GLUvertex isect, *orgMin;\n  GLUhalfEdge *e;\n\n  assert( ! VertEq( dstLo, dstUp ));\n  assert( EdgeSign( dstUp, tess->event, orgUp ) <= 0 );\n  assert( EdgeSign( dstLo, tess->event, orgLo ) >= 0 );\n  assert( orgUp != tess->event && orgLo != tess->event );\n  assert( ! regUp->fixUpperEdge && ! regLo->fixUpperEdge );\n\n  if( orgUp == orgLo ) return FALSE;\t/* right endpoints are the same */\n\n  tMinUp = MIN( orgUp->t, dstUp->t );\n  tMaxLo = MAX( orgLo->t, dstLo->t );\n  if( tMinUp > tMaxLo ) return FALSE;\t/* t ranges do not overlap */\n\n  if( VertLeq( orgUp, orgLo )) {\n    if( EdgeSign( dstLo, orgUp, orgLo ) > 0 ) return FALSE;\n  } else {\n    if( EdgeSign( dstUp, orgLo, orgUp ) < 0 ) return FALSE;\n  }\n\n  /* At this point the edges intersect, at least marginally */\n  DebugEvent( tess );\n\n  __gl_edgeIntersect( dstUp, orgUp, dstLo, orgLo, &isect );\n  /* The following properties are guaranteed: */\n  assert( MIN( orgUp->t, dstUp->t ) <= isect.t );\n  assert( isect.t <= MAX( orgLo->t, dstLo->t ));\n  assert( MIN( dstLo->s, dstUp->s ) <= isect.s );\n  assert( isect.s <= MAX( orgLo->s, orgUp->s ));\n\n  if( VertLeq( &isect, tess->event )) {\n    /* The intersection point lies slightly to the left of the sweep line,\n     * so move it until it''s slightly to the right of the sweep line.\n     * (If we had perfect numerical precision, this would never happen\n     * in the first place).  The easiest and safest thing to do is\n     * replace the intersection by tess->event.\n     */\n    isect.s = tess->event->s;\n    isect.t = tess->event->t;\n  }\n  /* Similarly, if the computed intersection lies to the right of the\n   * rightmost origin (which should rarely happen), it can cause\n   * unbelievable inefficiency on sufficiently degenerate inputs.\n   * (If you have the test program, try running test54.d with the\n   * \"X zoom\" option turned on).\n   */\n  orgMin = VertLeq( orgUp, orgLo ) ? orgUp : orgLo;\n  if( VertLeq( orgMin, &isect )) {\n    isect.s = orgMin->s;\n    isect.t = orgMin->t;\n  }\n\n  if( VertEq( &isect, orgUp ) || VertEq( &isect, orgLo )) {\n    /* Easy case -- intersection at one of the right endpoints */\n    (void) CheckForRightSplice( tess, regUp );\n    return FALSE;\n  }\n\n  if(\t (! VertEq( dstUp, tess->event )\n\t  && EdgeSign( dstUp, tess->event, &isect ) >= 0)\n      || (! VertEq( dstLo, tess->event )\n\t  && EdgeSign( dstLo, tess->event, &isect ) <= 0 ))\n  {\n    /* Very unusual -- the new upper or lower edge would pass on the\n     * wrong side of the sweep event, or through it.  This can happen\n     * due to very small numerical errors in the intersection calculation.\n     */\n    if( dstLo == tess->event ) {\n      /* Splice dstLo into eUp, and process the new region(s) */\n      if (__gl_meshSplitEdge( eUp->Sym ) == NULL) longjmp(tess->env,1);\n      if ( !__gl_meshSplice( eLo->Sym, eUp ) ) longjmp(tess->env,1);\n      regUp = TopLeftRegion( regUp );\n      if (regUp == NULL) longjmp(tess->env,1);\n      eUp = RegionBelow(regUp)->eUp;\n      FinishLeftRegions( tess, RegionBelow(regUp), regLo );\n      AddRightEdges( tess, regUp, eUp->Oprev, eUp, eUp, TRUE );\n      return TRUE;\n    }\n    if( dstUp == tess->event ) {\n      /* Splice dstUp into eLo, and process the new region(s) */\n      if (__gl_meshSplitEdge( eLo->Sym ) == NULL) longjmp(tess->env,1);\n      if ( !__gl_meshSplice( eUp->Lnext, eLo->Oprev ) ) longjmp(tess->env,1);\n      regLo = regUp;\n      regUp = TopRightRegion( regUp );\n      e = RegionBelow(regUp)->eUp->Rprev;\n      regLo->eUp = eLo->Oprev;\n      eLo = FinishLeftRegions( tess, regLo, NULL );\n      AddRightEdges( tess, regUp, eLo->Onext, eUp->Rprev, e, TRUE );\n      return TRUE;\n    }\n    /* Special case: called from ConnectRightVertex.  If either\n     * edge passes on the wrong side of tess->event, split it\n     * (and wait for ConnectRightVertex to splice it appropriately).\n     */\n    if( EdgeSign( dstUp, tess->event, &isect ) >= 0 ) {\n      RegionAbove(regUp)->dirty = regUp->dirty = TRUE;\n      if (__gl_meshSplitEdge( eUp->Sym ) == NULL) longjmp(tess->env,1);\n      eUp->Org->s = tess->event->s;\n      eUp->Org->t = tess->event->t;\n    }\n    if( EdgeSign( dstLo, tess->event, &isect ) <= 0 ) {\n      regUp->dirty = regLo->dirty = TRUE;\n      if (__gl_meshSplitEdge( eLo->Sym ) == NULL) longjmp(tess->env,1);\n      eLo->Org->s = tess->event->s;\n      eLo->Org->t = tess->event->t;\n    }\n    /* leave the rest for ConnectRightVertex */\n    return FALSE;\n  }\n\n  /* General case -- split both edges, splice into new vertex.\n   * When we do the splice operation, the order of the arguments is\n   * arbitrary as far as correctness goes.  However, when the operation\n   * creates a new face, the work done is proportional to the size of\n   * the new face.  We expect the faces in the processed part of\n   * the mesh (ie. eUp->Lface) to be smaller than the faces in the\n   * unprocessed original contours (which will be eLo->Oprev->Lface).\n   */\n  if (__gl_meshSplitEdge( eUp->Sym ) == NULL) longjmp(tess->env,1);\n  if (__gl_meshSplitEdge( eLo->Sym ) == NULL) longjmp(tess->env,1);\n  if ( !__gl_meshSplice( eLo->Oprev, eUp ) ) longjmp(tess->env,1);\n  eUp->Org->s = isect.s;\n  eUp->Org->t = isect.t;\n  eUp->Org->pqHandle = pqInsert( tess->pq, eUp->Org ); /* __gl_pqSortInsert */\n  if (eUp->Org->pqHandle == LONG_MAX) {\n     pqDeletePriorityQ(tess->pq);\t/* __gl_pqSortDeletePriorityQ */\n     tess->pq = NULL;\n     longjmp(tess->env,1);\n  }\n  GetIntersectData( tess, eUp->Org, orgUp, dstUp, orgLo, dstLo );\n  RegionAbove(regUp)->dirty = regUp->dirty = regLo->dirty = TRUE;\n  return FALSE;\n}\n\nstatic void WalkDirtyRegions( SGItesselator *tess, ActiveRegion *regUp )\n/*\n * When the upper or lower edge of any region changes, the region is\n * marked \"dirty\".  This routine walks through all the dirty regions\n * and makes sure that the dictionary invariants are satisfied\n * (see the comments at the beginning of this file).  Of course\n * new dirty regions can be created as we make changes to restore\n * the invariants.\n */\n{\n  ActiveRegion *regLo = RegionBelow(regUp);\n  GLUhalfEdge *eUp, *eLo;\n\n  for( ;; ) {\n    /* Find the lowest dirty region (we walk from the bottom up). */\n    while( regLo->dirty ) {\n      regUp = regLo;\n      regLo = RegionBelow(regLo);\n    }\n    if( ! regUp->dirty ) {\n      regLo = regUp;\n      regUp = RegionAbove( regUp );\n      if( regUp == NULL || ! regUp->dirty ) {\n\t/* We've walked all the dirty regions */\n\treturn;\n      }\n    }\n    regUp->dirty = FALSE;\n    eUp = regUp->eUp;\n    eLo = regLo->eUp;\n\n    if( eUp->Dst != eLo->Dst ) {\n      /* Check that the edge ordering is obeyed at the Dst vertices. */\n      if( CheckForLeftSplice( tess, regUp )) {\n\n\t/* If the upper or lower edge was marked fixUpperEdge, then\n\t * we no longer need it (since these edges are needed only for\n\t * vertices which otherwise have no right-going edges).\n\t */\n\tif( regLo->fixUpperEdge ) {\n\t  DeleteRegion( tess, regLo );\n\t  if ( !__gl_meshDelete( eLo ) ) longjmp(tess->env,1);\n\t  regLo = RegionBelow( regUp );\n\t  eLo = regLo->eUp;\n\t} else if( regUp->fixUpperEdge ) {\n\t  DeleteRegion( tess, regUp );\n\t  if ( !__gl_meshDelete( eUp ) ) longjmp(tess->env,1);\n\t  regUp = RegionAbove( regLo );\n\t  eUp = regUp->eUp;\n\t}\n      }\n    }\n    if( eUp->Org != eLo->Org ) {\n      if(    eUp->Dst != eLo->Dst\n\t  && ! regUp->fixUpperEdge && ! regLo->fixUpperEdge\n\t  && (eUp->Dst == tess->event || eLo->Dst == tess->event) )\n      {\n\t/* When all else fails in CheckForIntersect(), it uses tess->event\n\t * as the intersection location.  To make this possible, it requires\n\t * that tess->event lie between the upper and lower edges, and also\n\t * that neither of these is marked fixUpperEdge (since in the worst\n\t * case it might splice one of these edges into tess->event, and\n\t * violate the invariant that fixable edges are the only right-going\n\t * edge from their associated vertex).\n\t */\n\tif( CheckForIntersect( tess, regUp )) {\n\t  /* WalkDirtyRegions() was called recursively; we're done */\n\t  return;\n\t}\n      } else {\n\t/* Even though we can't use CheckForIntersect(), the Org vertices\n\t * may violate the dictionary edge ordering.  Check and correct this.\n\t */\n\t(void) CheckForRightSplice( tess, regUp );\n      }\n    }\n    if( eUp->Org == eLo->Org && eUp->Dst == eLo->Dst ) {\n      /* A degenerate loop consisting of only two edges -- delete it. */\n      AddWinding( eLo, eUp );\n      DeleteRegion( tess, regUp );\n      if ( !__gl_meshDelete( eUp ) ) longjmp(tess->env,1);\n      regUp = RegionAbove( regLo );\n    }\n  }\n}\n\n\nstatic void ConnectRightVertex( SGItesselator *tess, ActiveRegion *regUp,\n\t\t\t\tGLUhalfEdge *eBottomLeft )\n/*\n * Purpose: connect a \"right\" vertex vEvent (one where all edges go left)\n * to the unprocessed portion of the mesh.  Since there are no right-going\n * edges, two regions (one above vEvent and one below) are being merged\n * into one.  \"regUp\" is the upper of these two regions.\n *\n * There are two reasons for doing this (adding a right-going edge):\n *  - if the two regions being merged are \"inside\", we must add an edge\n *    to keep them separated (the combined region would not be monotone).\n *  - in any case, we must leave some record of vEvent in the dictionary,\n *    so that we can merge vEvent with features that we have not seen yet.\n *    For example, maybe there is a vertical edge which passes just to\n *    the right of vEvent; we would like to splice vEvent into this edge.\n *\n * However, we don't want to connect vEvent to just any vertex.  We don''t\n * want the new edge to cross any other edges; otherwise we will create\n * intersection vertices even when the input data had no self-intersections.\n * (This is a bad thing; if the user's input data has no intersections,\n * we don't want to generate any false intersections ourselves.)\n *\n * Our eventual goal is to connect vEvent to the leftmost unprocessed\n * vertex of the combined region (the union of regUp and regLo).\n * But because of unseen vertices with all right-going edges, and also\n * new vertices which may be created by edge intersections, we don''t\n * know where that leftmost unprocessed vertex is.  In the meantime, we\n * connect vEvent to the closest vertex of either chain, and mark the region\n * as \"fixUpperEdge\".  This flag says to delete and reconnect this edge\n * to the next processed vertex on the boundary of the combined region.\n * Quite possibly the vertex we connected to will turn out to be the\n * closest one, in which case we won''t need to make any changes.\n */\n{\n  GLUhalfEdge *eNew;\n  GLUhalfEdge *eTopLeft = eBottomLeft->Onext;\n  ActiveRegion *regLo = RegionBelow(regUp);\n  GLUhalfEdge *eUp = regUp->eUp;\n  GLUhalfEdge *eLo = regLo->eUp;\n  int degenerate = FALSE;\n\n  if( eUp->Dst != eLo->Dst ) {\n    (void) CheckForIntersect( tess, regUp );\n  }\n\n  /* Possible new degeneracies: upper or lower edge of regUp may pass\n   * through vEvent, or may coincide with new intersection vertex\n   */\n  if( VertEq( eUp->Org, tess->event )) {\n    if ( !__gl_meshSplice( eTopLeft->Oprev, eUp ) ) longjmp(tess->env,1);\n    regUp = TopLeftRegion( regUp );\n    if (regUp == NULL) longjmp(tess->env,1);\n    eTopLeft = RegionBelow( regUp )->eUp;\n    FinishLeftRegions( tess, RegionBelow(regUp), regLo );\n    degenerate = TRUE;\n  }\n  if( VertEq( eLo->Org, tess->event )) {\n    if ( !__gl_meshSplice( eBottomLeft, eLo->Oprev ) ) longjmp(tess->env,1);\n    eBottomLeft = FinishLeftRegions( tess, regLo, NULL );\n    degenerate = TRUE;\n  }\n  if( degenerate ) {\n    AddRightEdges( tess, regUp, eBottomLeft->Onext, eTopLeft, eTopLeft, TRUE );\n    return;\n  }\n\n  /* Non-degenerate situation -- need to add a temporary, fixable edge.\n   * Connect to the closer of eLo->Org, eUp->Org.\n   */\n  if( VertLeq( eLo->Org, eUp->Org )) {\n    eNew = eLo->Oprev;\n  } else {\n    eNew = eUp;\n  }\n  eNew = __gl_meshConnect( eBottomLeft->Lprev, eNew );\n  if (eNew == NULL) longjmp(tess->env,1);\n\n  /* Prevent cleanup, otherwise eNew might disappear before we've even\n   * had a chance to mark it as a temporary edge.\n   */\n  AddRightEdges( tess, regUp, eNew, eNew->Onext, eNew->Onext, FALSE );\n  eNew->Sym->activeRegion->fixUpperEdge = TRUE;\n  WalkDirtyRegions( tess, regUp );\n}\n\n/* Because vertices at exactly the same location are merged together\n * before we process the sweep event, some degenerate cases can't occur.\n * However if someone eventually makes the modifications required to\n * merge features which are close together, the cases below marked\n * TOLERANCE_NONZERO will be useful.  They were debugged before the\n * code to merge identical vertices in the main loop was added.\n */\n#define TOLERANCE_NONZERO\tFALSE\n\nstatic void ConnectLeftDegenerate( SGItesselator *tess,\n\t\t\t\t   ActiveRegion *regUp, GLUvertex *vEvent )\n/*\n * The event vertex lies exacty on an already-processed edge or vertex.\n * Adding the new vertex involves splicing it into the already-processed\n * part of the mesh.\n */\n{\n  GLUhalfEdge *e, *eTopLeft, *eTopRight, *eLast;\n  ActiveRegion *reg;\n\n  e = regUp->eUp;\n  if( VertEq( e->Org, vEvent )) {\n    /* e->Org is an unprocessed vertex - just combine them, and wait\n     * for e->Org to be pulled from the queue\n     */\n    assert( TOLERANCE_NONZERO );\n    SpliceMergeVertices( tess, e, vEvent->anEdge );\n    return;\n  }\n\n  if( ! VertEq( e->Dst, vEvent )) {\n    /* General case -- splice vEvent into edge e which passes through it */\n    if (__gl_meshSplitEdge( e->Sym ) == NULL) longjmp(tess->env,1);\n    if( regUp->fixUpperEdge ) {\n      /* This edge was fixable -- delete unused portion of original edge */\n      if ( !__gl_meshDelete( e->Onext ) ) longjmp(tess->env,1);\n      regUp->fixUpperEdge = FALSE;\n    }\n    if ( !__gl_meshSplice( vEvent->anEdge, e ) ) longjmp(tess->env,1);\n    SweepEvent( tess, vEvent ); /* recurse */\n    return;\n  }\n\n  /* vEvent coincides with e->Dst, which has already been processed.\n   * Splice in the additional right-going edges.\n   */\n  assert( TOLERANCE_NONZERO );\n  regUp = TopRightRegion( regUp );\n  reg = RegionBelow( regUp );\n  eTopRight = reg->eUp->Sym;\n  eTopLeft = eLast = eTopRight->Onext;\n  if( reg->fixUpperEdge ) {\n    /* Here e->Dst has only a single fixable edge going right.\n     * We can delete it since now we have some real right-going edges.\n     */\n    assert( eTopLeft != eTopRight );   /* there are some left edges too */\n    DeleteRegion( tess, reg );\n    if ( !__gl_meshDelete( eTopRight ) ) longjmp(tess->env,1);\n    eTopRight = eTopLeft->Oprev;\n  }\n  if ( !__gl_meshSplice( vEvent->anEdge, eTopRight ) ) longjmp(tess->env,1);\n  if( ! EdgeGoesLeft( eTopLeft )) {\n    /* e->Dst had no left-going edges -- indicate this to AddRightEdges() */\n    eTopLeft = NULL;\n  }\n  AddRightEdges( tess, regUp, eTopRight->Onext, eLast, eTopLeft, TRUE );\n}\n\n\nstatic void ConnectLeftVertex( SGItesselator *tess, GLUvertex *vEvent )\n/*\n * Purpose: connect a \"left\" vertex (one where both edges go right)\n * to the processed portion of the mesh.  Let R be the active region\n * containing vEvent, and let U and L be the upper and lower edge\n * chains of R.  There are two possibilities:\n *\n * - the normal case: split R into two regions, by connecting vEvent to\n *   the rightmost vertex of U or L lying to the left of the sweep line\n *\n * - the degenerate case: if vEvent is close enough to U or L, we\n *   merge vEvent into that edge chain.  The subcases are:\n *\t- merging with the rightmost vertex of U or L\n *\t- merging with the active edge of U or L\n *\t- merging with an already-processed portion of U or L\n */\n{\n  ActiveRegion *regUp, *regLo, *reg;\n  GLUhalfEdge *eUp, *eLo, *eNew;\n  ActiveRegion tmp;\n\n  /* assert( vEvent->anEdge->Onext->Onext == vEvent->anEdge ); */\n\n  /* Get a pointer to the active region containing vEvent */\n  tmp.eUp = vEvent->anEdge->Sym;\n  /* __GL_DICTLISTKEY */ /* __gl_dictListSearch */\n  regUp = (ActiveRegion *)dictKey( dictSearch( tess->dict, &tmp ));\n  regLo = RegionBelow( regUp );\n  eUp = regUp->eUp;\n  eLo = regLo->eUp;\n\n  /* Try merging with U or L first */\n  if( EdgeSign( eUp->Dst, vEvent, eUp->Org ) == 0 ) {\n    ConnectLeftDegenerate( tess, regUp, vEvent );\n    return;\n  }\n\n  /* Connect vEvent to rightmost processed vertex of either chain.\n   * e->Dst is the vertex that we will connect to vEvent.\n   */\n  reg = VertLeq( eLo->Dst, eUp->Dst ) ? regUp : regLo;\n\n  if( regUp->inside || reg->fixUpperEdge) {\n    if( reg == regUp ) {\n      eNew = __gl_meshConnect( vEvent->anEdge->Sym, eUp->Lnext );\n      if (eNew == NULL) longjmp(tess->env,1);\n    } else {\n      GLUhalfEdge *tempHalfEdge= __gl_meshConnect( eLo->Dnext, vEvent->anEdge);\n      if (tempHalfEdge == NULL) longjmp(tess->env,1);\n\n      eNew = tempHalfEdge->Sym;\n    }\n    if( reg->fixUpperEdge ) {\n      if ( !FixUpperEdge( reg, eNew ) ) longjmp(tess->env,1);\n    } else {\n      ComputeWinding( tess, AddRegionBelow( tess, regUp, eNew ));\n    }\n    SweepEvent( tess, vEvent );\n  } else {\n    /* The new vertex is in a region which does not belong to the polygon.\n     * We don''t need to connect this vertex to the rest of the mesh.\n     */\n    AddRightEdges( tess, regUp, vEvent->anEdge, vEvent->anEdge, NULL, TRUE );\n  }\n}\n\n\nstatic void SweepEvent( SGItesselator *tess, GLUvertex *vEvent )\n/*\n * Does everything necessary when the sweep line crosses a vertex.\n * Updates the mesh and the edge dictionary.\n */\n{\n  ActiveRegion *regUp, *reg;\n  GLUhalfEdge *e, *eTopLeft, *eBottomLeft;\n\n  tess->event = vEvent; \t/* for access in EdgeLeq() */\n  DebugEvent( tess );\n\n  /* Check if this vertex is the right endpoint of an edge that is\n   * already in the dictionary.  In this case we don't need to waste\n   * time searching for the location to insert new edges.\n   */\n  e = vEvent->anEdge;\n  while( e->activeRegion == NULL ) {\n    e = e->Onext;\n    if( e == vEvent->anEdge ) {\n      /* All edges go right -- not incident to any processed edges */\n      ConnectLeftVertex( tess, vEvent );\n      return;\n    }\n  }\n\n  /* Processing consists of two phases: first we \"finish\" all the\n   * active regions where both the upper and lower edges terminate\n   * at vEvent (ie. vEvent is closing off these regions).\n   * We mark these faces \"inside\" or \"outside\" the polygon according\n   * to their winding number, and delete the edges from the dictionary.\n   * This takes care of all the left-going edges from vEvent.\n   */\n  regUp = TopLeftRegion( e->activeRegion );\n  if (regUp == NULL) longjmp(tess->env,1);\n  reg = RegionBelow( regUp );\n  eTopLeft = reg->eUp;\n  eBottomLeft = FinishLeftRegions( tess, reg, NULL );\n\n  /* Next we process all the right-going edges from vEvent.  This\n   * involves adding the edges to the dictionary, and creating the\n   * associated \"active regions\" which record information about the\n   * regions between adjacent dictionary edges.\n   */\n  if( eBottomLeft->Onext == eTopLeft ) {\n    /* No right-going edges -- add a temporary \"fixable\" edge */\n    ConnectRightVertex( tess, regUp, eBottomLeft );\n  } else {\n    AddRightEdges( tess, regUp, eBottomLeft->Onext, eTopLeft, eTopLeft, TRUE );\n  }\n}\n\n\n/* Make the sentinel coordinates big enough that they will never be\n * merged with real input features.  (Even with the largest possible\n * input contour and the maximum tolerance of 1.0, no merging will be\n * done with coordinates larger than 3 * GLU_TESS_MAX_COORD).\n */\n#define SENTINEL_COORD\t(4 * GLU_TESS_MAX_COORD)\n\nstatic void AddSentinel( SGItesselator *tess, GLdouble t )\n/*\n * We add two sentinel edges above and below all other edges,\n * to avoid special cases at the top and bottom.\n */\n{\n  GLUhalfEdge *e;\n  ActiveRegion *reg = (ActiveRegion *)memAlloc( sizeof( ActiveRegion ));\n  if (reg == NULL) longjmp(tess->env,1);\n\n  e = __gl_meshMakeEdge( tess->mesh );\n  if (e == NULL) longjmp(tess->env,1);\n\n  e->Org->s = SENTINEL_COORD;\n  e->Org->t = t;\n  e->Dst->s = -SENTINEL_COORD;\n  e->Dst->t = t;\n  tess->event = e->Dst; \t/* initialize it */\n\n  reg->eUp = e;\n  reg->windingNumber = 0;\n  reg->inside = FALSE;\n  reg->fixUpperEdge = FALSE;\n  reg->sentinel = TRUE;\n  reg->dirty = FALSE;\n  reg->nodeUp = dictInsert( tess->dict, reg ); /* __gl_dictListInsertBefore */\n  if (reg->nodeUp == NULL) longjmp(tess->env,1);\n}\n\n\nstatic void InitEdgeDict( SGItesselator *tess )\n/*\n * We maintain an ordering of edge intersections with the sweep line.\n * This order is maintained in a dynamic dictionary.\n */\n{\n  /* __gl_dictListNewDict */\n  tess->dict = dictNewDict( tess, (int (*)(void *, DictKey, DictKey)) EdgeLeq );\n  if (tess->dict == NULL) longjmp(tess->env,1);\n\n  AddSentinel( tess, -SENTINEL_COORD );\n  AddSentinel( tess, SENTINEL_COORD );\n}\n\n\nstatic void DoneEdgeDict( SGItesselator *tess )\n{\n  ActiveRegion *reg;\n#ifndef NDEBUG\n  int fixedEdges = 0;\n#endif\n\n  /* __GL_DICTLISTKEY */ /* __GL_DICTLISTMIN */\n  while( (reg = (ActiveRegion *)dictKey( dictMin( tess->dict ))) != NULL ) {\n    /*\n     * At the end of all processing, the dictionary should contain\n     * only the two sentinel edges, plus at most one \"fixable\" edge\n     * created by ConnectRightVertex().\n     */\n    if( ! reg->sentinel ) {\n      assert( reg->fixUpperEdge );\n      assert( ++fixedEdges == 1 );\n    }\n    assert( reg->windingNumber == 0 );\n    DeleteRegion( tess, reg );\n/*    __gl_meshDelete( reg->eUp );*/\n  }\n  dictDeleteDict( tess->dict ); /* __gl_dictListDeleteDict */\n}\n\n\nstatic void RemoveDegenerateEdges( SGItesselator *tess )\n/*\n * Remove zero-length edges, and contours with fewer than 3 vertices.\n */\n{\n  GLUhalfEdge *e, *eNext, *eLnext;\n  GLUhalfEdge *eHead = &tess->mesh->eHead;\n\n  /*LINTED*/\n  for( e = eHead->next; e != eHead; e = eNext ) {\n    eNext = e->next;\n    eLnext = e->Lnext;\n\n    if( VertEq( e->Org, e->Dst ) && e->Lnext->Lnext != e ) {\n      /* Zero-length edge, contour has at least 3 edges */\n\n      SpliceMergeVertices( tess, eLnext, e );\t/* deletes e->Org */\n      if ( !__gl_meshDelete( e ) ) longjmp(tess->env,1); /* e is a self-loop */\n      e = eLnext;\n      eLnext = e->Lnext;\n    }\n    if( eLnext->Lnext == e ) {\n      /* Degenerate contour (one or two edges) */\n\n      if( eLnext != e ) {\n\tif( eLnext == eNext || eLnext == eNext->Sym ) { eNext = eNext->next; }\n\tif ( !__gl_meshDelete( eLnext ) ) longjmp(tess->env,1);\n      }\n      if( e == eNext || e == eNext->Sym ) { eNext = eNext->next; }\n      if ( !__gl_meshDelete( e ) ) longjmp(tess->env,1);\n    }\n  }\n}\n\nstatic int InitPriorityQ( SGItesselator *tess )\n/*\n * Insert all vertices into the priority queue which determines the\n * order in which vertices cross the sweep line.\n */\n{\n  PriorityQ *pq;\n  GLUvertex *v, *vHead;\n\n  /* __gl_pqSortNewPriorityQ */\n  pq = tess->pq = pqNewPriorityQ( (int (*)(PQkey, PQkey)) __gl_vertLeq );\n  if (pq == NULL) return 0;\n\n  vHead = &tess->mesh->vHead;\n  for( v = vHead->next; v != vHead; v = v->next ) {\n    v->pqHandle = pqInsert( pq, v ); /* __gl_pqSortInsert */\n    if (v->pqHandle == LONG_MAX) break;\n  }\n  if (v != vHead || !pqInit( pq ) ) { /* __gl_pqSortInit */\n    pqDeletePriorityQ(tess->pq);\t/* __gl_pqSortDeletePriorityQ */\n    tess->pq = NULL;\n    return 0;\n  }\n\n  return 1;\n}\n\n\nstatic void DonePriorityQ( SGItesselator *tess )\n{\n  pqDeletePriorityQ( tess->pq ); /* __gl_pqSortDeletePriorityQ */\n}\n\n\nstatic int RemoveDegenerateFaces( GLUmesh *mesh )\n/*\n * Delete any degenerate faces with only two edges.  WalkDirtyRegions()\n * will catch almost all of these, but it won't catch degenerate faces\n * produced by splice operations on already-processed edges.\n * The two places this can happen are in FinishLeftRegions(), when\n * we splice in a \"temporary\" edge produced by ConnectRightVertex(),\n * and in CheckForLeftSplice(), where we splice already-processed\n * edges to ensure that our dictionary invariants are not violated\n * by numerical errors.\n *\n * In both these cases it is *very* dangerous to delete the offending\n * edge at the time, since one of the routines further up the stack\n * will sometimes be keeping a pointer to that edge.\n */\n{\n  GLUface *f, *fNext;\n  GLUhalfEdge *e;\n\n  /*LINTED*/\n  for( f = mesh->fHead.next; f != &mesh->fHead; f = fNext ) {\n    fNext = f->next;\n    e = f->anEdge;\n    assert( e->Lnext != e );\n\n    if( e->Lnext->Lnext == e ) {\n      /* A face with only two edges */\n      AddWinding( e->Onext, e );\n      if ( !__gl_meshDelete( e ) ) return 0;\n    }\n  }\n  return 1;\n}\n\nint __gl_computeInterior( SGItesselator *tess )\n/*\n * __gl_computeInterior( tess ) computes the planar arrangement specified\n * by the given contours, and further subdivides this arrangement\n * into regions.  Each region is marked \"inside\" if it belongs\n * to the polygon, according to the rule given by tess->windingRule.\n * Each interior region is guaranteed be monotone.\n */\n{\n  GLUvertex *v, *vNext;\n\n  tess->fatalError = FALSE;\n\n  /* Each vertex defines an event for our sweep line.  Start by inserting\n   * all the vertices in a priority queue.  Events are processed in\n   * lexicographic order, ie.\n   *\n   *\te1 < e2  iff  e1.x < e2.x || (e1.x == e2.x && e1.y < e2.y)\n   */\n  RemoveDegenerateEdges( tess );\n  if ( !InitPriorityQ( tess ) ) return 0; /* if error */\n  InitEdgeDict( tess );\n\n  /* __gl_pqSortExtractMin */\n  while( (v = (GLUvertex *)pqExtractMin( tess->pq )) != NULL ) {\n    for( ;; ) {\n      vNext = (GLUvertex *)pqMinimum( tess->pq ); /* __gl_pqSortMinimum */\n      if( vNext == NULL || ! VertEq( vNext, v )) break;\n\n      /* Merge together all vertices at exactly the same location.\n       * This is more efficient than processing them one at a time,\n       * simplifies the code (see ConnectLeftDegenerate), and is also\n       * important for correct handling of certain degenerate cases.\n       * For example, suppose there are two identical edges A and B\n       * that belong to different contours (so without this code they would\n       * be processed by separate sweep events).  Suppose another edge C\n       * crosses A and B from above.  When A is processed, we split it\n       * at its intersection point with C.  However this also splits C,\n       * so when we insert B we may compute a slightly different\n       * intersection point.  This might leave two edges with a small\n       * gap between them.  This kind of error is especially obvious\n       * when using boundary extraction (GLU_TESS_BOUNDARY_ONLY).\n       */\n      vNext = (GLUvertex *)pqExtractMin( tess->pq ); /* __gl_pqSortExtractMin*/\n      SpliceMergeVertices( tess, v->anEdge, vNext->anEdge );\n    }\n    SweepEvent( tess, v );\n  }\n\n  /* Set tess->event for debugging purposes */\n  /* __GL_DICTLISTKEY */ /* __GL_DICTLISTMIN */\n  tess->event = ((ActiveRegion *) dictKey( dictMin( tess->dict )))->eUp->Org;\n  DebugEvent( tess );\n  DoneEdgeDict( tess );\n  DonePriorityQ( tess );\n\n  if ( !RemoveDegenerateFaces( tess->mesh ) ) return 0;\n  __gl_meshCheckMesh( tess->mesh );\n\n  return 1;\n}\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/sweep.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/sweep.h,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#ifndef __sweep_h_\n#define __sweep_h_\n\n#include \"mesh.h\"\n\n/* __gl_computeInterior( tess ) computes the planar arrangement specified\n * by the given contours, and further subdivides this arrangement\n * into regions.  Each region is marked \"inside\" if it belongs\n * to the polygon, according to the rule given by tess->windingRule.\n * Each interior region is guaranteed be monotone.\n */\nint __gl_computeInterior( SGItesselator *tess );\n\n\n/* The following is here *only* for access by debugging routines */\n\n#include \"dict.h\"\n\n/* For each pair of adjacent edges crossing the sweep line, there is\n * an ActiveRegion to represent the region between them.  The active\n * regions are kept in sorted order in a dynamic dictionary.  As the\n * sweep line crosses each vertex, we update the affected regions.\n */\n\nstruct ActiveRegion {\n  GLUhalfEdge\t*eUp;\t\t/* upper edge, directed right to left */\n  DictNode\t*nodeUp;\t/* dictionary node corresponding to eUp */\n  int\t\twindingNumber;\t/* used to determine which regions are\n                                 * inside the polygon */\n  GLboolean\tinside;\t\t/* is this region inside the polygon? */\n  GLboolean\tsentinel;\t/* marks fake edges at t = +/-infinity */\n  GLboolean\tdirty;\t\t/* marks regions where the upper or lower\n                                 * edge has changed, but we haven't checked\n                                 * whether they intersect yet */\n  GLboolean\tfixUpperEdge;\t/* marks temporary edges introduced when\n                                 * we process a \"right vertex\" (one without\n                                 * any edges leaving to the right) */\n};\n\n#define RegionBelow(r)\t((ActiveRegion *) dictKey(dictPred((r)->nodeUp)))\n#define RegionAbove(r)\t((ActiveRegion *) dictKey(dictSucc((r)->nodeUp)))\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/tess.c",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n**\n** http://oss.sgi.com/projects/FreeB\n**\n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n**\n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n**\n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n*/\n\n#include \"gluos.h\"\n#include <stddef.h>\n#include <assert.h>\n#include <setjmp.h>\n#include \"memalloc.h\"\n#include \"tess.h\"\n#include \"mesh.h\"\n#include \"normal.h\"\n#include \"sweep.h\"\n#include \"tessmono.h\"\n#include \"render.h\"\n\n#define GLU_TESS_DEFAULT_TOLERANCE 0.0\n#define GLU_TESS_MESH\t\t100112\t/* void (*)(GLUmesh *mesh)\t    */\n\n#define TRUE 1\n#define FALSE 0\n\n/*ARGSUSED*/ static void GLAPIENTRY noBegin( GLenum type ) {}\n/*ARGSUSED*/ static void GLAPIENTRY noEdgeFlag( GLboolean boundaryEdge ) {}\n/*ARGSUSED*/ static void GLAPIENTRY noVertex( void *data ) {}\n/*ARGSUSED*/ static void GLAPIENTRY noEnd( void ) {}\n/*ARGSUSED*/ static void GLAPIENTRY noError( GLenum errnum ) {}\n/*ARGSUSED*/ static void GLAPIENTRY noCombine( GLdouble coords[3], void *data[4],\n\t\t\t\t    GLfloat weight[4], void **dataOut ) {}\n/*ARGSUSED*/ static void GLAPIENTRY noMesh( GLUmesh *mesh ) {}\n\n\n/*ARGSUSED*/ void GLAPIENTRY __gl_noBeginData( GLenum type,\n\t\t\t\t\t     void *polygonData ) {}\n/*ARGSUSED*/ void GLAPIENTRY __gl_noEdgeFlagData( GLboolean boundaryEdge,\n\t\t\t\t       void *polygonData ) {}\n/*ARGSUSED*/ void GLAPIENTRY __gl_noVertexData( void *data,\n\t\t\t\t\t      void *polygonData ) {}\n/*ARGSUSED*/ void GLAPIENTRY __gl_noEndData( void *polygonData ) {}\n/*ARGSUSED*/ void GLAPIENTRY __gl_noErrorData( GLenum errnum,\n\t\t\t\t\t     void *polygonData ) {}\n/*ARGSUSED*/ void GLAPIENTRY __gl_noCombineData( GLdouble coords[3],\n\t\t\t\t\t       void *data[4],\n\t\t\t\t\t       GLfloat weight[4],\n\t\t\t\t\t       void **outData,\n\t\t\t\t\t       void *polygonData ) {}\n\n/* Half-edges are allocated in pairs (see mesh.c) */\ntypedef struct { GLUhalfEdge e, eSym; } EdgePair;\n\n#undef\tMAX\n#define MAX(a,b)\t((a) > (b) ? (a) : (b))\n#define MAX_FAST_ALLOC\t(MAX(sizeof(EdgePair), \\\n                         MAX(sizeof(GLUvertex),sizeof(GLUface))))\n\n\nSGItesselator * GLAPIENTRY\nsgiNewTess( void )\n{\n  SGItesselator *tess;\n\n  /* Only initialize fields which can be changed by the api.  Other fields\n   * are initialized where they are used.\n   */\n\n  if (memInit( MAX_FAST_ALLOC ) == 0) {\n     return 0;\t\t\t/* out of memory */\n  }\n  tess = (SGItesselator *)memAlloc( sizeof( SGItesselator ));\n  if (tess == NULL) {\n     return 0;\t\t\t/* out of memory */\n  }\n\n  tess->state = T_DORMANT;\n\n  tess->normal[0] = 0;\n  tess->normal[1] = 0;\n  tess->normal[2] = 0;\n\n  tess->relTolerance = GLU_TESS_DEFAULT_TOLERANCE;\n  tess->windingRule = GLU_TESS_WINDING_ODD;\n  tess->flagBoundary = FALSE;\n  tess->boundaryOnly = FALSE;\n\n  tess->callBegin = &noBegin;\n  tess->callEdgeFlag = &noEdgeFlag;\n  tess->callVertex = &noVertex;\n  tess->callEnd = &noEnd;\n\n  tess->callError = &noError;\n  tess->callCombine = &noCombine;\n  tess->callMesh = &noMesh;\n\n  tess->callBeginData= &__gl_noBeginData;\n  tess->callEdgeFlagData= &__gl_noEdgeFlagData;\n  tess->callVertexData= &__gl_noVertexData;\n  tess->callEndData= &__gl_noEndData;\n  tess->callErrorData= &__gl_noErrorData;\n  tess->callCombineData= &__gl_noCombineData;\n\n  tess->polygonData= NULL;\n\n  return tess;\n}\n\nstatic void MakeDormant( SGItesselator *tess )\n{\n  /* Return the tessellator to its original dormant state. */\n\n  if( tess->mesh != NULL ) {\n    __gl_meshDeleteMesh( tess->mesh );\n  }\n  tess->state = T_DORMANT;\n  tess->lastEdge = NULL;\n  tess->mesh = NULL;\n}\n\n#define RequireState( tess, s )   if( tess->state != s ) GotoState(tess,s)\n\nstatic void GotoState( SGItesselator *tess, enum TessState newState )\n{\n  while( tess->state != newState ) {\n    /* We change the current state one level at a time, to get to\n     * the desired state.\n     */\n    if( tess->state < newState ) {\n      switch( tess->state ) {\n      case T_DORMANT:\n\tCALL_ERROR_OR_ERROR_DATA( GLU_TESS_MISSING_BEGIN_POLYGON );\n\tsgiTessBeginPolygon( tess, NULL );\n\tbreak;\n      case T_IN_POLYGON:\n\tCALL_ERROR_OR_ERROR_DATA( GLU_TESS_MISSING_BEGIN_CONTOUR );\n\tsgiTessBeginContour( tess );\n\tbreak;\n      default:\n\t ;\n      }\n    } else {\n      switch( tess->state ) {\n      case T_IN_CONTOUR:\n\tCALL_ERROR_OR_ERROR_DATA( GLU_TESS_MISSING_END_CONTOUR );\n\tsgiTessEndContour( tess );\n\tbreak;\n      case T_IN_POLYGON:\n\tCALL_ERROR_OR_ERROR_DATA( GLU_TESS_MISSING_END_POLYGON );\n\t/* sgiTessEndPolygon( tess ) is too much work! */\n\tMakeDormant( tess );\n\tbreak;\n      default:\n\t ;\n      }\n    }\n  }\n}\n\n\nvoid GLAPIENTRY\nsgiDeleteTess( SGItesselator *tess )\n{\n  RequireState( tess, T_DORMANT );\n  memFree( tess );\n}\n\n\nvoid GLAPIENTRY\nsgiTessProperty( SGItesselator *tess, GLenum which, GLdouble value )\n{\n  GLenum windingRule;\n\n  switch( which ) {\n  case GLU_TESS_TOLERANCE:\n    if( value < 0.0 || value > 1.0 ) break;\n    tess->relTolerance = value;\n    return;\n\n  case GLU_TESS_WINDING_RULE:\n    windingRule = (GLenum) value;\n    if( windingRule != value ) break;\t/* not an integer */\n\n    switch( windingRule ) {\n    case GLU_TESS_WINDING_ODD:\n    case GLU_TESS_WINDING_NONZERO:\n    case GLU_TESS_WINDING_POSITIVE:\n    case GLU_TESS_WINDING_NEGATIVE:\n    case GLU_TESS_WINDING_ABS_GEQ_TWO:\n      tess->windingRule = windingRule;\n      return;\n    default:\n      break;\n    }\n\n  case GLU_TESS_BOUNDARY_ONLY:\n    tess->boundaryOnly = (value != 0);\n    return;\n\n  default:\n    CALL_ERROR_OR_ERROR_DATA( GLU_INVALID_ENUM );\n    return;\n  }\n  CALL_ERROR_OR_ERROR_DATA( GLU_INVALID_VALUE );\n}\n\n/* Returns tessellator property */\nvoid GLAPIENTRY\nsgiGetTessProperty( SGItesselator *tess, GLenum which, GLdouble *value )\n{\n   switch (which) {\n   case GLU_TESS_TOLERANCE:\n      /* tolerance should be in range [0..1] */\n      assert(0.0 <= tess->relTolerance && tess->relTolerance <= 1.0);\n      *value= tess->relTolerance;\n      break;\n   case GLU_TESS_WINDING_RULE:\n      assert(tess->windingRule == GLU_TESS_WINDING_ODD ||\n\t     tess->windingRule == GLU_TESS_WINDING_NONZERO ||\n\t     tess->windingRule == GLU_TESS_WINDING_POSITIVE ||\n\t     tess->windingRule == GLU_TESS_WINDING_NEGATIVE ||\n\t     tess->windingRule == GLU_TESS_WINDING_ABS_GEQ_TWO);\n      *value= tess->windingRule;\n      break;\n   case GLU_TESS_BOUNDARY_ONLY:\n      assert(tess->boundaryOnly == TRUE || tess->boundaryOnly == FALSE);\n      *value= tess->boundaryOnly;\n      break;\n   default:\n      *value= 0.0;\n      CALL_ERROR_OR_ERROR_DATA( GLU_INVALID_ENUM );\n      break;\n   }\n} /* sgiGetTessProperty() */\n\nvoid GLAPIENTRY\nsgiTessNormal( SGItesselator *tess, GLdouble x, GLdouble y, GLdouble z )\n{\n  tess->normal[0] = x;\n  tess->normal[1] = y;\n  tess->normal[2] = z;\n}\n\nvoid GLAPIENTRY\nsgiTessCallback( SGItesselator *tess, GLenum which, callback_t fn)\n{\n  switch( which ) {\n  case GLU_TESS_BEGIN:\n    tess->callBegin = (fn == NULL) ? &noBegin : (void (GLAPIENTRY *)(GLenum)) fn;\n    return;\n  case GLU_TESS_BEGIN_DATA:\n    tess->callBeginData = (fn == NULL) ?\n\t&__gl_noBeginData : (void (GLAPIENTRY *)(GLenum, void *)) fn;\n    return;\n  case GLU_TESS_EDGE_FLAG:\n    tess->callEdgeFlag = (fn == NULL) ? &noEdgeFlag :\n\t\t\t\t\t(void (GLAPIENTRY *)(GLboolean)) fn;\n    /* If the client wants boundary edges to be flagged,\n     * we render everything as separate triangles (no strips or fans).\n     */\n    tess->flagBoundary = (fn != NULL);\n    return;\n  case GLU_TESS_EDGE_FLAG_DATA:\n    tess->callEdgeFlagData= (fn == NULL) ?\n\t&__gl_noEdgeFlagData : (void (GLAPIENTRY *)(GLboolean, void *)) fn;\n    /* If the client wants boundary edges to be flagged,\n     * we render everything as separate triangles (no strips or fans).\n     */\n    tess->flagBoundary = (fn != NULL);\n    return;\n  case GLU_TESS_VERTEX:\n    tess->callVertex = (fn == NULL) ? &noVertex :\n\t\t\t\t      (void (GLAPIENTRY *)(void *)) fn;\n    return;\n  case GLU_TESS_VERTEX_DATA:\n    tess->callVertexData = (fn == NULL) ?\n\t&__gl_noVertexData : (void (GLAPIENTRY *)(void *, void *)) fn;\n    return;\n  case GLU_TESS_END:\n    tess->callEnd = (fn == NULL) ? &noEnd : (void (GLAPIENTRY *)(void)) fn;\n    return;\n  case GLU_TESS_END_DATA:\n    tess->callEndData = (fn == NULL) ? &__gl_noEndData :\n\t\t\t\t       (void (GLAPIENTRY *)(void *)) fn;\n    return;\n  case GLU_TESS_ERROR:\n    tess->callError = (fn == NULL) ? &noError : (void (GLAPIENTRY *)(GLenum)) fn;\n    return;\n  case GLU_TESS_ERROR_DATA:\n    tess->callErrorData = (fn == NULL) ?\n\t&__gl_noErrorData : (void (GLAPIENTRY *)(GLenum, void *)) fn;\n    return;\n  case GLU_TESS_COMBINE:\n    tess->callCombine = (fn == NULL) ? &noCombine :\n\t(void (GLAPIENTRY *)(GLdouble [3],void *[4], GLfloat [4], void ** )) fn;\n    return;\n  case GLU_TESS_COMBINE_DATA:\n    tess->callCombineData = (fn == NULL) ? &__gl_noCombineData :\n\t\t\t\t\t   (void (GLAPIENTRY *)(GLdouble [3],\n\t\t\t\t\t\t     void *[4],\n\t\t\t\t\t\t     GLfloat [4],\n\t\t\t\t\t\t     void **,\n\t\t\t\t\t\t     void *)) fn;\n    return;\n  case GLU_TESS_MESH:\n    tess->callMesh = (fn == NULL) ? &noMesh : (void (GLAPIENTRY *)(GLUmesh *)) fn;\n    return;\n  default:\n    CALL_ERROR_OR_ERROR_DATA( GLU_INVALID_ENUM );\n    return;\n  }\n}\n\nstatic int AddVertex( SGItesselator *tess, GLdouble coords[3], void *data )\n{\n  GLUhalfEdge *e;\n\n  e = tess->lastEdge;\n  if( e == NULL ) {\n    /* Make a self-loop (one vertex, one edge). */\n\n    e = __gl_meshMakeEdge( tess->mesh );\n    if (e == NULL) return 0;\n    if ( !__gl_meshSplice( e, e->Sym ) ) return 0;\n  } else {\n    /* Create a new vertex and edge which immediately follow e\n     * in the ordering around the left face.\n     */\n    if (__gl_meshSplitEdge( e ) == NULL) return 0;\n    e = e->Lnext;\n  }\n\n  /* The new vertex is now e->Org. */\n  e->Org->data = data;\n  e->Org->coords[0] = coords[0];\n  e->Org->coords[1] = coords[1];\n  e->Org->coords[2] = coords[2];\n\n  /* The winding of an edge says how the winding number changes as we\n   * cross from the edge''s right face to its left face.  We add the\n   * vertices in such an order that a CCW contour will add +1 to\n   * the winding number of the region inside the contour.\n   */\n  e->winding = 1;\n  e->Sym->winding = -1;\n\n  tess->lastEdge = e;\n\n  return 1;\n}\n\n\nstatic void CacheVertex( SGItesselator *tess, GLdouble coords[3], void *data )\n{\n  CachedVertex *v = &tess->cache[tess->cacheCount];\n\n  v->data = data;\n  v->coords[0] = coords[0];\n  v->coords[1] = coords[1];\n  v->coords[2] = coords[2];\n  ++tess->cacheCount;\n}\n\n\nstatic int EmptyCache( SGItesselator *tess )\n{\n  CachedVertex *v = tess->cache;\n  CachedVertex *vLast;\n\n  tess->mesh = __gl_meshNewMesh();\n  if (tess->mesh == NULL) return 0;\n\n  for( vLast = v + tess->cacheCount; v < vLast; ++v ) {\n    if ( !AddVertex( tess, v->coords, v->data ) ) return 0;\n  }\n  tess->cacheCount = 0;\n  tess->emptyCache = FALSE;\n\n  return 1;\n}\n\n\nvoid GLAPIENTRY\nsgiTessVertex( SGItesselator *tess, GLdouble coords[3], void *data )\n{\n  int i, tooLarge = FALSE;\n  GLdouble x, clamped[3];\n\n  RequireState( tess, T_IN_CONTOUR );\n\n  if( tess->emptyCache ) {\n    if ( !EmptyCache( tess ) ) {\n       CALL_ERROR_OR_ERROR_DATA( GLU_OUT_OF_MEMORY );\n       return;\n    }\n    tess->lastEdge = NULL;\n  }\n  for( i = 0; i < 3; ++i ) {\n    x = coords[i];\n    if( x < - GLU_TESS_MAX_COORD ) {\n      x = - GLU_TESS_MAX_COORD;\n      tooLarge = TRUE;\n    }\n    if( x > GLU_TESS_MAX_COORD ) {\n      x = GLU_TESS_MAX_COORD;\n      tooLarge = TRUE;\n    }\n    clamped[i] = x;\n  }\n  if( tooLarge ) {\n    CALL_ERROR_OR_ERROR_DATA( GLU_TESS_COORD_TOO_LARGE );\n  }\n\n  if( tess->mesh == NULL ) {\n    if( tess->cacheCount < TESS_MAX_CACHE ) {\n      CacheVertex( tess, clamped, data );\n      return;\n    }\n    if ( !EmptyCache( tess ) ) {\n       CALL_ERROR_OR_ERROR_DATA( GLU_OUT_OF_MEMORY );\n       return;\n    }\n  }\n  if ( !AddVertex( tess, clamped, data ) ) {\n       CALL_ERROR_OR_ERROR_DATA( GLU_OUT_OF_MEMORY );\n  }\n}\n\n\nvoid GLAPIENTRY\nsgiTessBeginPolygon( SGItesselator *tess, void *data )\n{\n  RequireState( tess, T_DORMANT );\n\n  tess->state = T_IN_POLYGON;\n  tess->cacheCount = 0;\n  tess->emptyCache = FALSE;\n  tess->mesh = NULL;\n\n  tess->polygonData= data;\n}\n\n\nvoid GLAPIENTRY\nsgiTessBeginContour( SGItesselator *tess )\n{\n  RequireState( tess, T_IN_POLYGON );\n\n  tess->state = T_IN_CONTOUR;\n  tess->lastEdge = NULL;\n  if( tess->cacheCount > 0 ) {\n    /* Just set a flag so we don't get confused by empty contours\n     * -- these can be generated accidentally with the obsolete\n     * NextContour() interface.\n     */\n    tess->emptyCache = TRUE;\n  }\n}\n\n\nvoid GLAPIENTRY\nsgiTessEndContour( SGItesselator *tess )\n{\n  RequireState( tess, T_IN_CONTOUR );\n  tess->state = T_IN_POLYGON;\n}\n\nvoid GLAPIENTRY\nsgiTessEndPolygon( SGItesselator *tess )\n{\n  GLUmesh *mesh;\n\n  if (setjmp(tess->env) != 0) { \n     /* come back here if out of memory */\n     CALL_ERROR_OR_ERROR_DATA( GLU_OUT_OF_MEMORY );\n     return;\n  }\n\n  RequireState( tess, T_IN_POLYGON );\n  tess->state = T_DORMANT;\n\n  if( tess->mesh == NULL ) {\n    if( ! tess->flagBoundary && tess->callMesh == &noMesh ) {\n\n      /* Try some special code to make the easy cases go quickly\n       * (eg. convex polygons).  This code does NOT handle multiple contours,\n       * intersections, edge flags, and of course it does not generate\n       * an explicit mesh either.\n       */\n      if( __gl_renderCache( tess )) {\n\ttess->polygonData= NULL;\n\treturn;\n      }\n    }\n    if ( !EmptyCache( tess ) ) longjmp(tess->env,1); /* could've used a label*/\n  }\n\n  /* Determine the polygon normal and project vertices onto the plane\n   * of the polygon.\n   */\n  __gl_projectPolygon( tess );\n\n  /* __gl_computeInterior( tess ) computes the planar arrangement specified\n   * by the given contours, and further subdivides this arrangement\n   * into regions.  Each region is marked \"inside\" if it belongs\n   * to the polygon, according to the rule given by tess->windingRule.\n   * Each interior region is guaranteed be monotone.\n   */\n  if ( !__gl_computeInterior( tess ) ) {\n     longjmp(tess->env,1);\t/* could've used a label */\n  }\n\n  mesh = tess->mesh;\n  if( ! tess->fatalError ) {\n    int rc = 1;\n\n    /* If the user wants only the boundary contours, we throw away all edges\n     * except those which separate the interior from the exterior.\n     * Otherwise we tessellate all the regions marked \"inside\".\n     */\n    if( tess->boundaryOnly ) {\n      rc = __gl_meshSetWindingNumber( mesh, 1, TRUE );\n    } else {\n      rc = __gl_meshTessellateInterior( mesh );\n    }\n    if (rc == 0) longjmp(tess->env,1);\t/* could've used a label */\n\n    __gl_meshCheckMesh( mesh );\n\n    if( tess->callBegin != &noBegin || tess->callEnd != &noEnd\n       || tess->callVertex != &noVertex || tess->callEdgeFlag != &noEdgeFlag\n       || tess->callBeginData != &__gl_noBeginData\n       || tess->callEndData != &__gl_noEndData\n       || tess->callVertexData != &__gl_noVertexData\n       || tess->callEdgeFlagData != &__gl_noEdgeFlagData )\n    {\n      if( tess->boundaryOnly ) {\n\t__gl_renderBoundary( tess, mesh );  /* output boundary contours */\n      } else {\n\t__gl_renderMesh( tess, mesh );\t   /* output strips and fans */\n      }\n    }\n    if( tess->callMesh != &noMesh ) {\n\n      /* Throw away the exterior faces, so that all faces are interior.\n       * This way the user doesn't have to check the \"inside\" flag,\n       * and we don't need to even reveal its existence.  It also leaves\n       * the freedom for an implementation to not generate the exterior\n       * faces in the first place.\n       */\n      __gl_meshDiscardExterior( mesh );\n      (*tess->callMesh)( mesh );\t\t/* user wants the mesh itself */\n      tess->mesh = NULL;\n      tess->polygonData= NULL;\n      return;\n    }\n  }\n  __gl_meshDeleteMesh( mesh );\n  tess->polygonData= NULL;\n  tess->mesh = NULL;\n}\n\n\n/*XXXblythe unused function*/\n#if 0\nvoid GLAPIENTRY\nsgiDeleteMesh( GLUmesh *mesh )\n{\n  __gl_meshDeleteMesh( mesh );\n}\n#endif\n\n\n\n/*******************************************************/\n\n/* Obsolete calls -- for backward compatibility */\n\nvoid GLAPIENTRY\nsgiBeginPolygon( SGItesselator *tess )\n{\n  sgiTessBeginPolygon( tess, NULL );\n  sgiTessBeginContour( tess );\n}\n\n\n/*ARGSUSED*/\nvoid GLAPIENTRY\nsgiNextContour( SGItesselator *tess, GLenum type )\n{\n  sgiTessEndContour( tess );\n  sgiTessBeginContour( tess );\n}\n\n\nvoid GLAPIENTRY\nsgiEndPolygon( SGItesselator *tess )\n{\n  sgiTessEndContour( tess );\n  sgiTessEndPolygon( tess );\n}\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/tess.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/tess.h,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#ifndef __tess_h_\n#define __tess_h_\n\n#include <k3d-platform-config.h>\n#ifdef K3D_API_DARWIN\n#include <OpenGL/glu.h>\n#else // K3D_API_DARWIN\n#include <GL/glu.h>\n#endif // !K3D_API_DARWIN\n\n#include <setjmp.h>\n#include \"mesh.h\"\n#include \"dict.h\"\n#include \"priorityq-sort.h\"\n\n/* The begin/end calls must be properly nested.  We keep track of\n * the current state to enforce the ordering.\n */\nenum TessState { T_DORMANT, T_IN_POLYGON, T_IN_CONTOUR };\n\n/* We cache vertex data for single-contour polygons so that we can\n * try a quick-and-dirty decomposition first.\n */\n#define TESS_MAX_CACHE\t100\n\ntypedef struct CachedVertex {\n  GLdouble\tcoords[3];\n  void\t\t*data;\n} CachedVertex;\n\ntypedef struct SGItesselator {\n\n  /*** state needed for collecting the input data ***/\n\n  enum TessState state;\t\t/* what begin/end calls have we seen? */\n\n  GLUhalfEdge\t*lastEdge;\t/* lastEdge->Org is the most recent vertex */\n  GLUmesh\t*mesh;\t\t/* stores the input contours, and eventually\n                                   the tessellation itself */\n\n  void\t\t(GLAPIENTRY *callError)( GLenum errnum );\n\n  /*** state needed for projecting onto the sweep plane ***/\n\n  GLdouble\tnormal[3];\t/* user-specified normal (if provided) */\n  GLdouble\tsUnit[3];\t/* unit vector in s-direction (debugging) */\n  GLdouble\ttUnit[3];\t/* unit vector in t-direction (debugging) */\n\n  /*** state needed for the line sweep ***/\n\n  GLdouble\trelTolerance;\t/* tolerance for merging features */\n  GLenum\twindingRule;\t/* rule for determining polygon interior */\n  GLboolean\tfatalError;\t/* fatal error: needed combine callback */\n\n  Dict\t\t*dict;\t\t/* edge dictionary for sweep line */\n  PriorityQ\t*pq;\t\t/* priority queue of vertex events */\n  GLUvertex\t*event;\t\t/* current sweep event being processed */\n\n  void\t\t(GLAPIENTRY *callCombine)( GLdouble coords[3], void *data[4],\n\t\t\t        GLfloat weight[4], void **outData );\n\n  /*** state needed for rendering callbacks (see render.c) ***/\n\n  GLboolean\tflagBoundary;\t/* mark boundary edges (use EdgeFlag) */\n  GLboolean\tboundaryOnly;\t/* Extract contours, not triangles */\n  GLUface\t*lonelyTriList;\n    /* list of triangles which could not be rendered as strips or fans */\n\n  void\t\t(GLAPIENTRY *callBegin)( GLenum type );\n  void\t\t(GLAPIENTRY *callEdgeFlag)( GLboolean boundaryEdge );\n  void\t\t(GLAPIENTRY *callVertex)( void *data );\n  void\t\t(GLAPIENTRY *callEnd)( void );\n  void\t\t(GLAPIENTRY *callMesh)( GLUmesh *mesh );\n\n\n  /*** state needed to cache single-contour polygons for renderCache() */\n\n  GLboolean\temptyCache;\t\t/* empty cache on next vertex() call */\n  int\t\tcacheCount;\t\t/* number of cached vertices */\n  CachedVertex\tcache[TESS_MAX_CACHE];\t/* the vertex data */\n\n  /*** rendering callbacks that also pass polygon data  ***/ \n  void\t\t(GLAPIENTRY *callBeginData)( GLenum type, void *polygonData );\n  void\t\t(GLAPIENTRY *callEdgeFlagData)( GLboolean boundaryEdge, \n\t\t\t\t     void *polygonData );\n  void\t\t(GLAPIENTRY *callVertexData)( void *data, void *polygonData );\n  void\t\t(GLAPIENTRY *callEndData)( void *polygonData );\n  void\t\t(GLAPIENTRY *callErrorData)( GLenum errnum, void *polygonData );\n  void\t\t(GLAPIENTRY *callCombineData)( GLdouble coords[3], void *data[4],\n\t\t\t\t    GLfloat weight[4], void **outData,\n\t\t\t\t    void *polygonData );\n\n  jmp_buf env;\t\t\t/* place to jump to when memAllocs fail */\n\n  void *polygonData;\t\t/* client data for current polygon */\n} SGItesselator;\n\nvoid GLAPIENTRY __gl_noBeginData( GLenum type, void *polygonData );\nvoid GLAPIENTRY __gl_noEdgeFlagData( GLboolean boundaryEdge, void *polygonData );\nvoid GLAPIENTRY __gl_noVertexData( void *data, void *polygonData );\nvoid GLAPIENTRY __gl_noEndData( void *polygonData );\nvoid GLAPIENTRY __gl_noErrorData( GLenum errnum, void *polygonData );\nvoid GLAPIENTRY __gl_noCombineData( GLdouble coords[3], void *data[4],\n\t\t\t GLfloat weight[4], void **outData,\n\t\t\t void *polygonData );\n\n#define CALL_BEGIN_OR_BEGIN_DATA(a) \\\n   if (tess->callBeginData != &__gl_noBeginData) \\\n      (*tess->callBeginData)((a),tess->polygonData); \\\n   else (*tess->callBegin)((a));\n\n#define CALL_VERTEX_OR_VERTEX_DATA(a) \\\n   if (tess->callVertexData != &__gl_noVertexData) \\\n      (*tess->callVertexData)((a),tess->polygonData); \\\n   else (*tess->callVertex)((a));\n\n#define CALL_EDGE_FLAG_OR_EDGE_FLAG_DATA(a) \\\n   if (tess->callEdgeFlagData != &__gl_noEdgeFlagData) \\\n      (*tess->callEdgeFlagData)((a),tess->polygonData); \\\n   else (*tess->callEdgeFlag)((a));\n\n#define CALL_END_OR_END_DATA() \\\n   if (tess->callEndData != &__gl_noEndData) \\\n      (*tess->callEndData)(tess->polygonData); \\\n   else (*tess->callEnd)();\n\n#define CALL_COMBINE_OR_COMBINE_DATA(a,b,c,d) \\\n   if (tess->callCombineData != &__gl_noCombineData) \\\n      (*tess->callCombineData)((a),(b),(c),(d),tess->polygonData); \\\n   else (*tess->callCombine)((a),(b),(c),(d));\n\n#define CALL_ERROR_OR_ERROR_DATA(a) \\\n   if (tess->callErrorData != &__gl_noErrorData) \\\n      (*tess->callErrorData)((a),tess->polygonData); \\\n   else (*tess->callError)((a));\n\ntypedef void (*callback_t)();\n\nextern SGItesselator* sgiNewTess (void);\nextern void sgiDeleteTess (SGItesselator* tess);\nextern void sgiGetTessProperty (SGItesselator* tess, GLenum which, GLdouble* data);\n\nextern void sgiTessBeginContour (SGItesselator* tess);\nextern void sgiTessBeginPolygon (SGItesselator* tess, GLvoid* data);\nextern void sgiTessCallback (SGItesselator* tess, GLenum which, callback_t CallBackFunc);\nextern void sgiTessEndContour (SGItesselator* tess);\nextern void sgiTessEndPolygon (SGItesselator* tess);\nextern void sgiTessNormal (SGItesselator* tess, GLdouble valueX, GLdouble valueY, GLdouble valueZ);\nextern void sgiTessProperty (SGItesselator* tess, GLenum which, GLdouble data);\nextern void sgiTessVertex (SGItesselator* tess, GLdouble *location, GLvoid* data);\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/tessmono.c",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/tessmono.c,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#include \"gluos.h\"\n#include <stdlib.h>\n#include \"geom.h\"\n#include \"mesh.h\"\n#include \"tessmono.h\"\n#include <assert.h>\n\n#define AddWinding(eDst,eSrc)\t(eDst->winding += eSrc->winding, \\\n\t\t\t\t eDst->Sym->winding += eSrc->Sym->winding)\n\n/* __gl_meshTessellateMonoRegion( face ) tessellates a monotone region\n * (what else would it do??)  The region must consist of a single\n * loop of half-edges (see mesh.h) oriented CCW.  \"Monotone\" in this\n * case means that any vertical line intersects the interior of the\n * region in a single interval.  \n *\n * Tessellation consists of adding interior edges (actually pairs of\n * half-edges), to split the region into non-overlapping triangles.\n *\n * The basic idea is explained in Preparata and Shamos (which I don''t\n * have handy right now), although their implementation is more\n * complicated than this one.  The are two edge chains, an upper chain\n * and a lower chain.  We process all vertices from both chains in order,\n * from right to left.\n *\n * The algorithm ensures that the following invariant holds after each\n * vertex is processed: the untessellated region consists of two\n * chains, where one chain (say the upper) is a single edge, and\n * the other chain is concave.  The left vertex of the single edge\n * is always to the left of all vertices in the concave chain.\n *\n * Each step consists of adding the rightmost unprocessed vertex to one\n * of the two chains, and forming a fan of triangles from the rightmost\n * of two chain endpoints.  Determining whether we can add each triangle\n * to the fan is a simple orientation test.  By making the fan as large\n * as possible, we restore the invariant (check it yourself).\n */\nint __gl_meshTessellateMonoRegion( GLUface *face )\n{\n  GLUhalfEdge *up, *lo;\n\n  /* All edges are oriented CCW around the boundary of the region.\n   * First, find the half-edge whose origin vertex is rightmost.\n   * Since the sweep goes from left to right, face->anEdge should\n   * be close to the edge we want.\n   */\n  up = face->anEdge;\n  assert( up->Lnext != up && up->Lnext->Lnext != up );\n\n  for( ; VertLeq( up->Dst, up->Org ); up = up->Lprev )\n    ;\n  for( ; VertLeq( up->Org, up->Dst ); up = up->Lnext )\n    ;\n  lo = up->Lprev;\n\n  while( up->Lnext != lo ) {\n    if( VertLeq( up->Dst, lo->Org )) {\n      /* up->Dst is on the left.  It is safe to form triangles from lo->Org.\n       * The EdgeGoesLeft test guarantees progress even when some triangles\n       * are CW, given that the upper and lower chains are truly monotone.\n       */\n      while( lo->Lnext != up && (EdgeGoesLeft( lo->Lnext )\n\t     || EdgeSign( lo->Org, lo->Dst, lo->Lnext->Dst ) <= 0 )) {\n\tGLUhalfEdge *tempHalfEdge= __gl_meshConnect( lo->Lnext, lo );\n\tif (tempHalfEdge == NULL) return 0;\n\tlo = tempHalfEdge->Sym;\n      }\n      lo = lo->Lprev;\n    } else {\n      /* lo->Org is on the left.  We can make CCW triangles from up->Dst. */\n      while( lo->Lnext != up && (EdgeGoesRight( up->Lprev )\n\t     || EdgeSign( up->Dst, up->Org, up->Lprev->Org ) >= 0 )) {\n\tGLUhalfEdge *tempHalfEdge= __gl_meshConnect( up, up->Lprev );\n\tif (tempHalfEdge == NULL) return 0;\n\tup = tempHalfEdge->Sym;\n      }\n      up = up->Lnext;\n    }\n  }\n\n  /* Now lo->Org == up->Dst == the leftmost vertex.  The remaining region\n   * can be tessellated in a fan from this leftmost vertex.\n   */\n  assert( lo->Lnext != up );\n  while( lo->Lnext->Lnext != up ) {\n    GLUhalfEdge *tempHalfEdge= __gl_meshConnect( lo->Lnext, lo );\n    if (tempHalfEdge == NULL) return 0;\n    lo = tempHalfEdge->Sym;\n  }\n\n  return 1;\n}\n\n\n/* __gl_meshTessellateInterior( mesh ) tessellates each region of\n * the mesh which is marked \"inside\" the polygon.  Each such region\n * must be monotone.\n */\nint __gl_meshTessellateInterior( GLUmesh *mesh )\n{\n  GLUface *f, *next;\n\n  /*LINTED*/\n  for( f = mesh->fHead.next; f != &mesh->fHead; f = next ) {\n    /* Make sure we don''t try to tessellate the new triangles. */\n    next = f->next;\n    if( f->inside ) {\n      if ( !__gl_meshTessellateMonoRegion( f ) ) return 0;\n    }\n  }\n\n  return 1;\n}\n\n\n/* __gl_meshDiscardExterior( mesh ) zaps (ie. sets to NULL) all faces\n * which are not marked \"inside\" the polygon.  Since further mesh operations\n * on NULL faces are not allowed, the main purpose is to clean up the\n * mesh so that exterior loops are not represented in the data structure.\n */\nvoid __gl_meshDiscardExterior( GLUmesh *mesh )\n{\n  GLUface *f, *next;\n\n  /*LINTED*/\n  for( f = mesh->fHead.next; f != &mesh->fHead; f = next ) {\n    /* Since f will be destroyed, save its next pointer. */\n    next = f->next;\n    if( ! f->inside ) {\n      __gl_meshZapFace( f );\n    }\n  }\n}\n\n#define MARKED_FOR_DELETION\t0x7fffffff\n\n/* __gl_meshSetWindingNumber( mesh, value, keepOnlyBoundary ) resets the\n * winding numbers on all edges so that regions marked \"inside\" the\n * polygon have a winding number of \"value\", and regions outside\n * have a winding number of 0.\n *\n * If keepOnlyBoundary is TRUE, it also deletes all edges which do not\n * separate an interior region from an exterior one.\n */\nint __gl_meshSetWindingNumber( GLUmesh *mesh, int value,\n\t\t\t        GLboolean keepOnlyBoundary )\n{\n  GLUhalfEdge *e, *eNext;\n\n  for( e = mesh->eHead.next; e != &mesh->eHead; e = eNext ) {\n    eNext = e->next;\n    if( e->Rface->inside != e->Lface->inside ) {\n\n      /* This is a boundary edge (one side is interior, one is exterior). */\n      e->winding = (e->Lface->inside) ? value : -value;\n    } else {\n\n      /* Both regions are interior, or both are exterior. */\n      if( ! keepOnlyBoundary ) {\n\te->winding = 0;\n      } else {\n\tif ( !__gl_meshDelete( e ) ) return 0;\n      }\n    }\n  }\n  return 1;\n}\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator/tessmono.h",
    "content": "/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n** \n** http://oss.sgi.com/projects/FreeB\n** \n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n** \n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n** \n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n*/\n/*\n** Author: Eric Veach, July 1994.\n**\n** $Date: 2005/12/11 13:36:43 $ $Revision: 1.1 $\n** $Header: /cvsroot/k3d/k3d/k3dsdk/sgi_tesselator/tessmono.h,v 1.1 2005/12/11 13:36:43 romainbehar Exp $\n*/\n\n#ifndef __tessmono_h_\n#define __tessmono_h_\n\n/* __gl_meshTessellateMonoRegion( face ) tessellates a monotone region\n * (what else would it do??)  The region must consist of a single\n * loop of half-edges (see mesh.h) oriented CCW.  \"Monotone\" in this\n * case means that any vertical line intersects the interior of the\n * region in a single interval.  \n *\n * Tessellation consists of adding interior edges (actually pairs of\n * half-edges), to split the region into non-overlapping triangles.\n *\n * __gl_meshTessellateInterior( mesh ) tessellates each region of\n * the mesh which is marked \"inside\" the polygon.  Each such region\n * must be monotone.\n *\n * __gl_meshDiscardExterior( mesh ) zaps (ie. sets to NULL) all faces\n * which are not marked \"inside\" the polygon.  Since further mesh operations\n * on NULL faces are not allowed, the main purpose is to clean up the\n * mesh so that exterior loops are not represented in the data structure.\n *\n * __gl_meshSetWindingNumber( mesh, value, keepOnlyBoundary ) resets the\n * winding numbers on all edges so that regions marked \"inside\" the\n * polygon have a winding number of \"value\", and regions outside\n * have a winding number of 0.\n *\n * If keepOnlyBoundary is TRUE, it also deletes all edges which do not\n * separate an interior region from an exterior one.\n */\n\nint __gl_meshTessellateMonoRegion( GLUface *face );\nint __gl_meshTessellateInterior( GLUmesh *mesh );\nvoid __gl_meshDiscardExterior( GLUmesh *mesh );\nint __gl_meshSetWindingNumber( GLUmesh *mesh, int value,\n\t\t\t        GLboolean keepOnlyBoundary );\n\n#endif\n"
  },
  {
    "path": "k3dsdk/sgi_tesselator.h",
    "content": "#ifndef K3DSDK_SGI_TESSELATOR_H\n#define K3DSDK_SGI_TESSELATOR_H\n\n\n/** \\file\n\t\t\\brief Declares the SGI tesselator\n*/\n\nextern \"C\"\n{\n\ntypedef void (*callback_t)();\n\nstruct SGItesselator;\n\t\nextern SGItesselator* sgiNewTess (void);\nextern void sgiDeleteTess (SGItesselator* tess);\nextern void sgiGetTessProperty (SGItesselator* tess, GLenum which, GLdouble* data);\nextern void sgiTessBeginContour (SGItesselator* tess);\nextern void sgiTessBeginPolygon (SGItesselator* tess, GLvoid* data);\nextern void sgiTessCallback (SGItesselator* tess, GLenum which, callback_t CallBackFunc);\nextern void sgiTessEndContour (SGItesselator* tess);\nextern void sgiTessEndPolygon (SGItesselator* tess);\nextern void sgiTessNormal (SGItesselator* tess, GLdouble valueX, GLdouble valueY, GLdouble valueZ);\nextern void sgiTessProperty (SGItesselator* tess, GLenum which, GLdouble data);\nextern void sgiTessVertex (SGItesselator* tess, GLdouble *location, GLvoid* data);\n\n}\n\n#endif // !K3DSDK_SGI_TESSELATOR_H\n\n"
  },
  {
    "path": "k3dsdk/shader_cache.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache_detail.h>\n#include <k3dsdk/shader_cache.h>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\n/// Stores the global shader cache directory\nfilesystem::path g_shader_cache_path;\n\n} // namespace detail\n\nvoid set_shader_cache_path(const filesystem::path& ShaderCachePath)\n{\n\treturn_if_fail(detail::g_shader_cache_path.empty());\n\tdetail::g_shader_cache_path = ShaderCachePath;\n}\n\nconst filesystem::path shader_cache_path()\n{\n\tif(detail::g_shader_cache_path.empty())\n\t\tk3d::log() << error << \"shader cache path must be set before use!\" << std::endl;\n\n\tk3d::filesystem::create_directories(detail::g_shader_cache_path);\n\tif(!k3d::filesystem::exists(detail::g_shader_cache_path))\n\t\tk3d::log() << error << \"shader cache does not exist\" << std::endl;\n\n\treturn detail::g_shader_cache_path;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/shader_cache.h",
    "content": "#ifndef K3DSDK_SHADER_CACHE_H\n#define K3DSDK_SHADER_CACHE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\n/// Returns the absolute path to the shader cached directory\nconst filesystem::path shader_cache_path();\n\n} // namespace k3d\n\n#endif // !K3DSDK_SHADER_CACHE_H\n\n"
  },
  {
    "path": "k3dsdk/shader_cache_detail.h",
    "content": "#ifndef K3DSDK_SHADER_CACHE_DETAIL_H\n#define K3DSDK_SHADER_CACHE_DETAIL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\n\n/// Sets the absolute path to the shader cache directory (call this once at application startup)\nvoid set_shader_cache_path(const filesystem::path& SharePath);\n\n} // namespace k3d\n\n#endif // !K3DSDK_SHADER_CACHE_DETAIL_H\n\n"
  },
  {
    "path": "k3dsdk/shader_collection_ri.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/shader_collection_ri.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// shader_collection::implementation\n\nclass shader_collection::implementation\n{\npublic:\n\t/// Stores a set of shaders\n\tshaders_t m_shaders;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// shader_collection\n\nshader_collection::shader_collection() :\n\tm_implementation(new implementation())\n{\n}\n\nshader_collection::~shader_collection()\n{\n\tdelete m_implementation;\n}\n\nvoid shader_collection::use_shader(const path& Path)\n{\n\tm_implementation->m_shaders.insert(Path);\n}\n\nconst shader_collection::shaders_t& shader_collection::shaders() const\n{\n\treturn m_implementation->m_shaders;\n}\n\n} // namespace ri\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/shader_collection_ri.h",
    "content": "#ifndef K3DSDK_SHADER_COLLECTION_RI_H\n#define K3DSDK_SHADER_COLLECTION_RI_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ishader_collection_ri.h>\n#include <set>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// shader_collection\n\n/// Provides a boilerplate implementation of k3d::ri::ishader_collection\nclass shader_collection :\n\tpublic ishader_collection\n{\npublic:\n\tshader_collection();\n\t~shader_collection();\n\n\tvoid use_shader(const path& Path);\n\n\t/// Stores a collection of shader paths\n\ttypedef std::set<path> shaders_t;\n\t/// Returns the set of shaders within the collection\n\tconst shaders_t& shaders() const;\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_SHADER_COLLECTION_RI_H\n\n"
  },
  {
    "path": "k3dsdk/shader_ri.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/fstream.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/istate_container.h>\n#include <k3dsdk/itexture_ri.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/shader_ri.h>\n#include <k3dsdk/user_property.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nnamespace detail\n{\n\nconst std::string shader_type_path(const k3d::sl::shader::type_t ShaderType)\n{\n\tswitch(ShaderType)\n\t{\n\t\tcase k3d::sl::shader::SURFACE:\n\t\t\treturn k3d::options::path::surface_shaders();\n\t\tcase k3d::sl::shader::LIGHT:\n\t\t\treturn k3d::options::path::light_shaders();\n\t\tcase k3d::sl::shader::VOLUME:\n\t\t\treturn k3d::options::path::volume_shaders();\n\t\tcase k3d::sl::shader::DISPLACEMENT:\n\t\t\treturn k3d::options::path::displacement_shaders();\n\t\tcase k3d::sl::shader::TRANSFORMATION:\n\t\t\treturn k3d::options::path::transformation_shaders();\n\t\tcase k3d::sl::shader::IMAGER:\n\t\t\treturn k3d::options::path::imager_shaders();\n\t}\n\n\tassert_not_reached();\n\treturn std::string();\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// shader\n\nshader::shader(iplugin_factory& Factory, idocument& Document, k3d::sl::shader::type_t ShaderType) :\n\tbase(Factory, Document),\n\tm_shader_type(ShaderType),\n\tm_shader_path(init_owner(*this) + init_name(\"shader_path\") + init_label(_(\"Shader Path\")) + init_description(_(\"Shader Path\")) + init_value(filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(detail::shader_type_path(ShaderType))),\n\tm_shader(init_owner(*this) + init_value(sl::shader(ShaderType))),\n\tm_user_property_changed_signal(*this)\n{\n\tm_shader_path.add_pattern_filter(ipath_property::pattern_filter(_(\"RenderMan shader (*.sl)\"), \"*.sl\"));\n\tm_shader_connection = m_shader_path.connect_explicit_change_signal(sigc::mem_fun(*this, &shader::on_shader_changed));\n\n\tm_user_property_changed_signal.connect(make_node_change_slot());\n}\n\nshader::~shader()\n{\n}\n\nvoid shader::load(xml::element& Element, const ipersistent::load_context& Context)\n{\n\t// Disable argument list updates while loading so we don't create the same arguments twice\n\tm_shader_connection.disconnect();\n\tbase::load(Element, Context);\n\tm_shader_connection = m_shader_path.connect_explicit_change_signal(sigc::mem_fun(*this, &shader::on_shader_changed));\n\n\tload_metafile();\n}\n\nconst path shader::shader_path()\n{\n\treturn m_shader_path.pipeline_value();\n}\n\nconst std::string shader::shader_name()\n{\n\treturn m_shader.internal_value().name;\n}\n\nparameter_list shader::shader_arguments(const render_state& State)\n{\n\tparameter_list results;\n\n\tconst iproperty_collection::properties_t& properties = base::properties();\n\tfor(iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t{\n\t\tif(dynamic_cast<iuser_property*>(*prop))\n\t\t{\n\t\t\tiproperty& property = **prop;\n\t\t\tconst std::type_info& property_type = property.property_type();\n\n\t\t\tif(property_type == typeid(ri::real))\n\t\t\t{\n\t\t\t\tresults.push_back(parameter(property.property_name(), CONSTANT, 1, property::pipeline_value<ri::real>(property)));\n\t\t\t}\n\t\t\telse if(property_type == typeid(ri::string))\n\t\t\t{\n\t\t\t\tresults.push_back(parameter(property.property_name(), CONSTANT, 1, property::pipeline_value<ri::string>(property)));\n\t\t\t}\n\t\t\telse if(property_type == typeid(k3d::inode*)) // Node properties always are of type \"inode*\", so we have to query for the interface type we really want\n\t\t\t{\n\t\t\t\tif(k3d::ri::itexture* const texture = dynamic_cast<k3d::ri::itexture*>(property::pipeline_value<inode*>(property)))\n\t\t\t\t\tresults.push_back(parameter(property.property_name(), CONSTANT, 1, static_cast<k3d::ri::string>(texture->renderman_texture_path(State).native_filesystem_string())));\n\t\t\t}\n\t\t\telse if(property_type == typeid(ri::point))\n\t\t\t{\n\t\t\t\tresults.push_back(parameter(property.property_name(), CONSTANT, 1, property::pipeline_value<ri::point>(property)));\n\t\t\t}\n\t\t\telse if(property_type == typeid(ri::vector))\n\t\t\t{\n\t\t\t\tresults.push_back(parameter(property.property_name(), CONSTANT, 1, property::pipeline_value<ri::vector>(property)));\n\t\t\t}\n\t\t\telse if(property_type == typeid(ri::normal))\n\t\t\t{\n\t\t\t\tresults.push_back(parameter(property.property_name(), CONSTANT, 1, property::pipeline_value<ri::normal>(property)));\n\t\t\t}\n\t\t\telse if(property_type == typeid(ri::hpoint))\n\t\t\t{\n\t\t\t\tresults.push_back(parameter(property.property_name(), CONSTANT, 1, property::pipeline_value<ri::hpoint>(property)));\n\t\t\t}\n\t\t\telse if(property_type == typeid(ri::matrix))\n\t\t\t{\n\t\t\t\tresults.push_back(parameter(property.property_name(), CONSTANT, 1, property::pipeline_value<ri::matrix>(property)));\n\t\t\t}\n\t\t\telse if(property_type == typeid(ri::color))\n\t\t\t{\n\t\t\t\tresults.push_back(parameter(property.property_name(), CONSTANT, 1, property::pipeline_value<ri::color>(property)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlog() << error << k3d_file_reference << \": unknown storage type [\" << property_type.name() << \"] for shader argument [\" << property.property_name() << \"] will be ignored\" << std::endl;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n}\n\nvoid shader::on_shader_changed(iunknown*)\n{\n\tif(document().state_recorder().current_change_set())\n\t\tdocument().state_recorder().current_change_set()->record_old_state(new user::property_container(*this));\n\n\tdelete_arguments();\n\tload_metafile();\n\tcreate_arguments();\n\n\tmake_node_change_slot()(0);\n\n\tif(document().state_recorder().current_change_set())\n\t\tdocument().state_recorder().current_change_set()->record_new_state(new user::property_container(*this));\n}\n\nvoid shader::delete_arguments()\n{\n\tconst iproperty_collection::properties_t user_properties = k3d::property::user_properties(*this);\n\n\tunregister_properties(user_properties);\n\n\tfor(iproperty_collection::properties_t::const_iterator property = user_properties.begin(); property != user_properties.end(); ++property)\n\t{\n\t\tif(ipersistent* const persistent = dynamic_cast<ipersistent*>(*property))\n\t\t\tdisable_serialization(*persistent);\n\t}\n\n\tfor(iproperty_collection::properties_t::const_iterator property = user_properties.begin(); property != user_properties.end(); ++property)\n\t\tundoable_delete(*property, document());\n}\n\nvoid shader::load_metafile()\n{\n    try\n    {\n        const filesystem::path shader_path = m_shader_path.pipeline_value();\n        const filesystem::path metafile_path = shader_path + \".slmeta\";\n        filesystem::ifstream metafile_stream(metafile_path);\n\n        const sl::shaders_t shaders = sl::parse_metafile(metafile_stream, shader_path, metafile_path);\n        if(shaders.size() != 1)\n        {\n            log() << error << \"Can't load metafile describing shader [\" << shader_path.native_console_string() << \"]\" << std::endl;\n            return;\n        }\n\n        const sl::shaders_t::const_iterator shader = shaders.begin();\n        if(shader->type != m_shader_type)\n        {\n            log() << error << \"Shader [\" << shader_path.native_console_string() << \"] is not the correct shader type\" << std::endl;\n            return;\n        }\n\n        m_shader.set_value(*shader);\n    }\n    catch(std::exception& e)\n    {\n        log() << error << \"Exception loading shader metafile: \" << e.what() << std::endl;\n    }\n}\n\nvoid shader::create_arguments()\n{\n\tconst sl::shader shader = m_shader.internal_value();\n\tfor(sl::shader::arguments_t::const_iterator argument = shader.arguments.begin(); argument != shader.arguments.end(); ++argument)\n\t{\n\t\tif(argument->output)\n\t\t\tcontinue;\n\n\t\tconst string_t& name = argument->name;\n\t\tconst string_t& label = argument->label;\n\t\tconst string_t& description = argument->description;\n\t\tconst string_t& default_value = argument->default_value;\n\n\t\tswitch(argument->extended_type)\n\t\t{\n\t\t\tcase sl::argument::EX_FLOAT:\n\t\t\tcase sl::argument::EX_TIME:\n\t\t\tcase sl::argument::EX_ANGLE:\n\t\t\tcase sl::argument::EX_DISTANCE:\n\t\t\tcase sl::argument::EX_AREA:\n\t\t\tcase sl::argument::EX_VOLUME:\n\t\t\tcase sl::argument::EX_MASS:\n\t\t\tcase sl::argument::EX_FORCE:\n\t\t\tcase sl::argument::EX_PRESSURE:\n\t\t\t{\n\t\t\t\tundoable_new(property::create<double_t>(*this, name, label, description, from_string<double>(default_value, 0.0)), document());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase sl::argument::EX_STRING:\n\t\t\tcase sl::argument::EX_SPACE:\n\t\t\t{\n\t\t\t\tundoable_new(property::create<string_t>(*this, name, label, description, default_value), document());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase sl::argument::EX_TEXTURE:\n\t\t\t{\n\t\t\t\tundoable_new(property::create<ri::itexture*>(*this, name, label, description, static_cast<k3d::ri::itexture*>(0)), document());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase sl::argument::EX_POINT:\n\t\t\t{\n\t\t\t\tundoable_new(property::create<point3>(*this, name, label, description, from_string<point3>(default_value, point3(0, 0, 0))), document());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase sl::argument::EX_VECTOR:\n\t\t\t{\n\t\t\t\tundoable_new(property::create<vector3>(*this, name, label, description, from_string<vector3>(default_value, vector3(0, 0, 0))), document());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase sl::argument::EX_NORMAL:\n\t\t\t{\n\t\t\t\tundoable_new(property::create<normal3>(*this, name, label, description, from_string<normal3>(default_value, normal3(0, 0, 0))), document());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase sl::argument::EX_HPOINT:\n\t\t\t{\n\t\t\t\tundoable_new(property::create<point4>(*this, name, label, description, from_string<point4>(default_value, point4(0, 0, 0, 0))), document());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase sl::argument::EX_MATRIX:\n\t\t\t{\n\t\t\t\tundoable_new(property::create<matrix4>(*this, name, label, description, from_string<matrix4>(default_value, matrix4())), document());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase sl::argument::EX_COLOR:\n\t\t\t{\n\t\t\t\tundoable_new(property::create<color>(*this, name, label, description, from_string<color>(default_value, color(1, 1, 1))), document());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tlog() << error << k3d_file_reference << \" unknown extended argument type for [\" << argument->name << \"] will not receive storage\" << std::endl;\n\t\t\t}\n\t\t}\n\t}\n}\n\n} // namespace ri\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/shader_ri.h",
    "content": "#ifndef K3DSDK_SHADER_RI_H\n#define K3DSDK_SHADER_RI_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/node.h>\n#include <k3dsdk/node_change_signal.h>\n#include <k3dsdk/sl.h>\n#include <k3dsdk/types_ri.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nclass render_state;\n\n/////////////////////////////////////////////////////////////////////////////\n// shader\n\n/// Abstract base class that provides most of the boilerplate for a RenderMan shader instance\nclass shader :\n\tpublic node,\n\tpublic node_change_signal<shader>\n{\n\ttypedef node base;\n\npublic:\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context);\n\nprotected:\n\tshader(iplugin_factory& Factory, idocument& Document, const sl::shader::type_t ShaderType);\n\tvirtual ~shader();\n\n\tconst path shader_path();\n\tconst std::string shader_name();\n\tparameter_list shader_arguments(const render_state& State);\n\nprivate:\n\tvoid on_shader_changed(iunknown*);\n\tvoid delete_arguments();\n\tvoid load_metafile();\n\tvoid create_arguments();\n\n\tconst sl::shader::type_t m_shader_type;\n\tk3d_data(filesystem::path, immutable_name, explicit_change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_shader_path;\n\tk3d_data(sl::shader, no_name, no_signal, with_undo, local_storage, no_constraint, no_property, no_serialization) m_shader;\n\n\tsigc::connection m_shader_connection;\n\n\tuser_property_changed_signal m_user_property_changed_signal;\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_SHADER_RI_H\n\n"
  },
  {
    "path": "k3dsdk/share.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/share_detail.h>\n#include <k3dsdk/share.h>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\n/// Stores the global shared-data directory\nfilesystem::path g_share_path;\n\t\n} // namespace detail\n\t\nvoid set_share_path(const filesystem::path& SharePath)\n{\n\treturn_if_fail(detail::g_share_path.empty());\n\tdetail::g_share_path = SharePath;\n}\n\nconst filesystem::path share_path()\n{\n\tstatic bool nag = true;\n\tif(detail::g_share_path.empty() && nag)\n\t{\n\t\tk3d::log() << error << \"share path must be set before use!\" << std::endl;\n\t\tnag = false;\n\t}\n\n\treturn detail::g_share_path;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/share.h",
    "content": "#ifndef K3DSDK_SHARE_H\n#define K3DSDK_SHARE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/path.h>\n\nnamespace k3d\n{\n\n/// Returns the absolute path to the shared-data directory\nconst filesystem::path share_path();\n\n} // namespace k3d\n\n#endif // !K3DSDK_SHARE_H\n\n"
  },
  {
    "path": "k3dsdk/share_detail.h",
    "content": "#ifndef K3DSDK_SHARE_DETAIL_H\n#define K3DSDK_SHARE_DETAIL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nnamespace filesystem { class path; }\n\n/// Sets the absolute path to the shared-data directory (call this once at application startup)\nvoid set_share_path(const filesystem::path& SharePath);\n\n} // namespace k3d\n\n#endif // !K3DSDK_SHARE_DETAIL_H\n\n"
  },
  {
    "path": "k3dsdk/signal_accumulators.h",
    "content": "#ifndef K3DSDK_SIGNAL_ACCUMULATORS_H\n#define K3DSDK_SIGNAL_ACCUMULATORS_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/log.h>\n#include <iostream>\n\nnamespace k3d\n{\n\nnamespace signal\n{\n\n/** Defines a signal accumulator for libsigc++ signals that require slots returning bool.\niff any slot returns \"false\", signal emission is stopped immediately and the signal will\nreturn \"false\".  Otherwise, the signal will return \"true\".  This is handy for signals that\nrepresent some action that any observer can cancel, e.g. a document object can prevent\nthe application from closing if the document hasn't been saved. */\n\nclass  cancelable\n{\npublic:\n\ttypedef bool result_type;\n\n\ttemplate<typename IteratorT>\n\tresult_type operator()(IteratorT First, IteratorT Last)\n\t{\n\t\tfor(; First != Last; ++First)\n\t\t\t{\n\t\t\t\tif(false == *First)\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\treturn true;\n\t}\n};\n\n/** Defines a signal accumulator for libsigc++ signals that require slots returning bool.\niff any slot returns \"true\", signal emission is stopped immediately and the signal will\nreturn \"true\".  Otherwise, the signal will return \"false\".  This is handy for signals that\nrepresent some event that is \"consumed\" by an observer, e.g. a keyboard event that\nmight-or-might-not be used in a hotkey.  If used, emission of the event should stop;\nif not, it should continue. */\n\nclass  consumable\n{\npublic:\n\ttypedef bool result_type;\n\n\t/// New implementation for use with libsigc++ 2.0\n\ttemplate<typename IteratorT>\n\tresult_type operator()(IteratorT First, IteratorT Last)\n\t{\n\t\tfor(; First != Last; ++First)\n\t\t\t{\n\t\t\t\tif(true == *First)\n\t\t\t\t\treturn true;\n\t\t\t}\n\n\t\treturn false;\n\t}\n};\n\n} // namespace signal\n\n} // namespace k3d\n\n#endif // !K3DSDK_SIGNAL_ACCUMULATORS_H\n\n"
  },
  {
    "path": "k3dsdk/signal_slots.h",
    "content": "#ifndef K3DSDK_SIGNAL_SLOTS_H\n#define K3DSDK_SIGNAL_SLOTS_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\nnamespace k3d\n{\n\nclass ihint;\n\nnamespace signal\n{\n\ntemplate<typename SignalT>\nclass loop_safe_slot\n{\npublic:\n\tloop_safe_slot(SignalT& Signal) :\n\t\tsignal(Signal),\n\t\temitting(false)\n\t{\n\t}\n\n\tvoid operator()()\n\t{\n\t\tif(emitting)\n\t\t\treturn;\n\n\t\temitting = true;\n\t\tsignal.emit();\n\t\temitting = false;\n\t}\n\n\tvoid operator()(ihint* const Hint)\n\t{\n\t\tif(emitting)\n\t\t\treturn;\n\n\t\temitting = true;\n\t\tsignal.emit(Hint);\n\t\temitting = false;\n\t}\n\nprivate:\n\tSignalT& signal;\n\tbool emitting;\n};\n\ntemplate<typename SignalT>\nloop_safe_slot<SignalT> make_loop_safe_slot(SignalT& Signal)\n{\n\treturn loop_safe_slot<SignalT>(Signal);\n}\n\n} // namespace signal\n\n} // namespace k3d\n\n#endif // !K3DSDK_SIGNAL_SLOTS_H\n\n\n"
  },
  {
    "path": "k3dsdk/signal_system.h",
    "content": "#ifndef K3DSDK_SIGNAL_SYSTEM_H\n#define K3DSDK_SIGNAL_SYSTEM_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <sigc++/sigc++.h>\n\n#endif // !K3DSDK_SIGNAL_SYSTEM_H\n\n"
  },
  {
    "path": "k3dsdk/sl.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the Shading Language library, which returns information (including parsed and cached metadata) about a RenderMan Shading Language shader\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/sl.h>\n#include <k3dsdk/xml.h>\nusing namespace k3d::xml;\n\n#include <boost/lexical_cast.hpp>\n\n#include <cassert>\n#include <iostream>\n\nnamespace k3d\n{\n\nnamespace sl\n{\n\nnamespace detail\n{\n\n// Define some character constants for parsing ...\nstatic const char singlequote = '\\'';\nstatic const char doublequote = '\"';\nstatic const char escape = '\\\\';\nstatic const char openbrace = '{';\nstatic const char closebrace = '}';\nstatic const char openparen = '(';\nstatic const char closeparen = ')';\nstatic const char openbracket = '[';\nstatic const char closebracket = ']';\nstatic const char equals = '=';\nstatic const char comma = ',';\nstatic const char semicolon = ';';\n\n/// A string token\ntypedef std::string token_t;\n\n/// Stores a collection of tokens\ntypedef std::vector<token_t> token_collection_t;\n\n/////////////////////////////////////////////////////////////////////////////\n// write_token\n\n/// Stores a parsed token\nvoid write_token(token_collection_t& Output, token_t& OutputToken)\n{\n\tif(OutputToken.size())\n\t\tOutput.push_back(OutputToken);\n\n\tOutputToken.clear();\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// parse_stream\n\n/// Parses a stream into a series of whitespace-delimited tokens.\n/// Handles string constants and special characters.\nvoid parse_stream(std::istream& Stream, token_collection_t& Output)\n{\n\t// Our input stream ...\n\tstd::ostringstream stream;\n\n\tStream.get(*stream.rdbuf(), '\\0');\n\tstream << '\\0';\n\n\t// Convert it to a string buffer ...\n\tstd::string buffer = stream.str();\n\t//stream.freeze(false);\n\n\t// Loop through the buffer ...\n\tchar stringliteral = 0;\n\n\ttoken_t token;\n\n\tfor(token_t::iterator c = buffer.begin(); c != buffer.end(); ++c)\n\t{\n\t\tif(stringliteral)\n\t\t{\n\t\t\tif((*c) == stringliteral && ((*(c-1)) != escape))\n\t\t\t{\n\t\t\t\ttoken += *c;\n\t\t\t\twrite_token(Output, token);\n\t\t\t\tstringliteral = 0;\n\t\t\t}\n\t\t\telse if((*c) == stringliteral && ((*(c-1)) == escape))\n\t\t\t{\n\t\t\t\ttoken.erase(token.end()-1);\n\t\t\t\ttoken += *c;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttoken += *c;\n\t\t\t}\n\t\t}\n\t\telse if(isspace(*c))\n\t\t{\n\t\t\tif(stringliteral)\n\t\t\t\ttoken += *c;\n\t\t\telse\n\t\t\t\twrite_token(Output, token);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch(*c)\n\t\t\t{\n\t\t\t\tcase singlequote:\n\t\t\t\tcase doublequote:\n\t\t\t\t\tstringliteral = *c;\n\t\t\t\t\ttoken += *c;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase openparen:\n\t\t\t\tcase closeparen:\n\t\t\t\tcase openbracket:\n\t\t\t\tcase closebracket:\n\t\t\t\tcase openbrace:\n\t\t\t\tcase closebrace:\n\t\t\t\tcase equals:\n\t\t\t\tcase comma:\n\t\t\t\tcase semicolon:\n\t\t\t\t\twrite_token(Output, token);\n\t\t\t\t\ttoken = *c;\n\t\t\t\t\twrite_token(Output, token);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\ttoken += *c;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// is_output\n\n/// Tests a token to see if it's the \"output\" token used for light -> shader message passing\nbool is_output(const token_t& InputToken)\n{\n\treturn InputToken == \"output\" ? true : false;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// is_storage\n\n/// Tests a token to see if it's a storage type\nbool is_storage(const token_t& InputToken)\n{\n\tstatic const char* types[] =\n\t{\n\t\t\"uniform\", \"varying\"\n\t};\n\n\tfor(unsigned long i = 0; i < sizeof(types) / sizeof(const char*); i++)\n\t{\n\t\tif(InputToken == types[i])\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// is_argument_type\n\n/// Tests a token to see if it's an argument type\nbool is_argument_type(const token_t& InputToken)\n{\n\tstatic const char* types[] =\n\t{\n\t\t\"float\",\n\t\t\"string\",\n\t\t\"point\",\n\t\t\"vector\",\n\t\t\"normal\",\n\t\t\"hpoint\",\n\t\t\"matrix\",\n\t\t\"color\"\n\t};\n\n\tfor(unsigned long i = 0; i < sizeof(types) / sizeof(const char*); i++)\n\t{\n\t\tif(InputToken == types[i])\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// is_string\n\n/// Tests a token to see if it's a string type\nbool is_string(const token_t& InputToken)\n{\n\tif((InputToken.substr(0, 1) == \"\\'\") || (InputToken.substr(0, 1) == \"\\\"\"))\n\t\treturn true;\n\n\treturn false;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// parse_arguments\n\nclass point3\n{\npublic:\n\t/// Stores the vector values\n\tdouble n[3];\n\n\tpoint3()\n\t{\n\t\tn[0] = n[1] = n[2] = 0.0;\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const point3& RHS)\n\t{\n\t\tStream << RHS.n[0] << \" \" << RHS.n[1] << \" \" << RHS.n[2];\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, point3& RHS)\n\t{\n\t\tStream >> RHS.n[0];\n\t\tRHS.n[1] = RHS.n[2] = RHS.n[0];\n\t\tStream >> RHS.n[1] >> RHS.n[2];\n\n\t\treturn Stream;\n\t}\n};\n\n/// Parses tokens to pick out all of the shader arguments ...\nk3d::sl::shader::arguments_t parse_arguments(token_collection_t& Arguments, const k3d::filesystem::path& SourcePath)\n{\n\tk3d::sl::shader::arguments_t results;\n\n\ttry\n\t{\n\t\tbool output = false;\n\t\tk3d::sl::argument::storage_class_t storage_class = k3d::sl::argument::UNIFORM;\n\t\tk3d::sl::argument::type_t type = k3d::sl::argument::FLOAT;\n\t\tk3d::sl::argument::extended_type_t extended_type = k3d::sl::argument::EX_FLOAT;\n\n\t\tfor(token_collection_t::const_iterator token = Arguments.begin(); token != Arguments.end(); ++token)\n\t\t{\n\t\t\t// Look to see if this is an output variable, part of the light message-passing system ...\n\t\t\tif(is_output(*token))\n\t\t\t{\n\t\t\t\toutput = true;\n\t\t\t\t++token;\n\t\t\t}\n\n\t\t\t// Check for a storage class ...\n\t\t\tif(is_storage(*token))\n\t\t\t{\n\t\t\t\tstorage_class = boost::lexical_cast<k3d::sl::argument::storage_class_t>(*token);\n\t\t\t\t++token;\n\t\t\t}\n\n\t\t\t// Check for an argument type ...\n\t\t\tif(is_argument_type(*token))\n\t\t\t{\n\t\t\t\ttype = boost::lexical_cast<k3d::sl::argument::type_t>(*token);\n\t\t\t\tswitch(type)\n\t\t\t\t{\n\t\t\t\t\tcase k3d::sl::argument::FLOAT:\n\t\t\t\t\t\textended_type = k3d::sl::argument::EX_FLOAT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase k3d::sl::argument::STRING:\n\t\t\t\t\t\textended_type = k3d::sl::argument::EX_STRING;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase k3d::sl::argument::POINT:\n\t\t\t\t\t\textended_type = k3d::sl::argument::EX_POINT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase k3d::sl::argument::VECTOR:\n\t\t\t\t\t\textended_type = k3d::sl::argument::EX_VECTOR;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase k3d::sl::argument::NORMAL:\n\t\t\t\t\t\textended_type = k3d::sl::argument::EX_NORMAL;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase k3d::sl::argument::HPOINT:\n\t\t\t\t\t\textended_type = k3d::sl::argument::EX_HPOINT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase k3d::sl::argument::MATRIX:\n\t\t\t\t\t\textended_type = k3d::sl::argument::EX_MATRIX;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase k3d::sl::argument::COLOR:\n\t\t\t\t\t\textended_type = k3d::sl::argument::EX_COLOR;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t++token;\n\t\t\t}\n\n\t\t\t// Whatever's left over has to be the argument name ...\n\t\t\tconst std::string name = *token;\n\t\t\t++token;\n\n\t\t\t// Check to see if this argument is an array ...\n\t\t\tunsigned long array_size = 1;\n\t\t\tif(*token == \"[\")\n\t\t\t{\n\t\t\t\t++token;\n\t\t\t\tarray_size = boost::lexical_cast<unsigned long>(*token);\n\t\t\t\t++token;\n\t\t\t\treturn_val_if_fail(*token == \"]\", results);\n\t\t\t\t++token;\n\t\t\t}\n\n\t\t\t// Sanity check for the (required) default value ...\n\t\t\treturn_val_if_fail(*token == \"=\", results);\n\t\t\t++token;\n\n\t\t\t// Some types syntactically use the type name when declaring constants - we can safely skip these ...\n\t\t\tif(is_argument_type(*token))\n\t\t\t\t++token;\n\n\t\t\t// If the next token is a string, and the argument isn't of string type, it must be a color/point/vector space ...\n\t\t\tstd::string space = \"\";\n\t\t\tif(is_string(*token) && (type != k3d::sl::argument::STRING))\n\t\t\t{\n\t\t\t\tspace = *token;\n\t\t\t\t++token;\n\t\t\t}\n\n\t\t\t// Next, we start accumulating the argument default ...\n\t\t\tbool same_type = false;\n\t\t\tunsigned long depth = 0;\n\t\t\tstd::string default_value = \"\";\n\t\t\tfor( ; token != Arguments.end(); ++token)\n\t\t\t{\n\t\t\t\tif((*token == \")\") && (0 == depth))\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse if((*token == \"(\") || (*token == \"{\"))\n\t\t\t\t{\n\t\t\t\t\tdefault_value += *token;\n\t\t\t\t\t++depth;\n\t\t\t\t}\n\t\t\t\telse if((*token == \"}\") || (*token == \")\"))\n\t\t\t\t{\n\t\t\t\t\tdefault_value += *token;\n\t\t\t\t\t--depth;\n\t\t\t\t}\n\t\t\t\telse if(*token == \";\")\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse if((*token == \",\") && (0 == depth))\n\t\t\t\t{\n\t\t\t\t\tsame_type = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tdefault_value += *token;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Massage our \"array\" types for consistency ...\n\t\t\tif((type == k3d::sl::argument::COLOR) || (type == k3d::sl::argument::POINT) || (type == k3d::sl::argument::VECTOR) || (type == k3d::sl::argument::NORMAL))\n\t\t\t{\n\t\t\t\tstd::istringstream ibuffer(default_value);\n\t\t\t\tpoint3 temp;\n\t\t\t\tibuffer >> temp;\n\n\t\t\t\tstd::ostringstream obuffer;\n\t\t\t\tobuffer << temp;\n\t\t\t\tdefault_value = obuffer.str();\n\t\t\t}\n\n\t\t\t// Get rid of excess quote marks and whitespace in strings ...\n\t\t\tif(default_value.size())\n\t\t\t{\n\t\t\t\tif(is_string(default_value))\n\t\t\t\t\tdefault_value = default_value.substr(1, default_value.size()-2);\n\t\t\t}\n\n\t\t\tif(space.size())\n\t\t\t{\n\t\t\t\tif(is_string(space))\n\t\t\t\t\tspace = space.substr(1, space.size()-2);\n\t\t\t}\n\n\t\t\t// These can't be extracted from SL code\n\t\t\tconst std::string label;\n\t\t\tconst std::string description;\n\n\t\t\t// Push the new argument into our results ...\n\t\t\tresults.push_back(k3d::sl::argument(name, label, description, storage_class, type, extended_type, array_size, space, output, default_value));\n\n\t\t\t// Clear our type information, unless our arguments were separated by commas ...\n\t\t\tif(!same_type)\n\t\t\t{\n\t\t\t\toutput = false;\n\t\t\t\tstorage_class = k3d::sl::argument::UNIFORM;\n\t\t\t\ttype = k3d::sl::argument::FLOAT;\n\t\t\t\textended_type = k3d::sl::argument::EX_FLOAT;\n\t\t\t}\n\n\t\t\t// Make sure we don't overrun the end of tokens ...\n\t\t\tif(token == Arguments.end())\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tk3d::log() << error << \"Exception parsing arguments for [ \" << SourcePath.native_console_string() << \" ]: \" << e.what() << std::endl;\n\t}\n\tcatch(...)\n\t{\n\t\tk3d::log() << error << \"Unknown exception parsing arguments for [ \" << SourcePath.native_console_string() << \" ]\" << std::endl;\n\t}\n\n\treturn results;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// parse_shader\n\n/// Parses tokens looking for shaders, and returns the results ...\nk3d::sl::shaders_t parse_shaders(token_collection_t& InputTokens, const k3d::filesystem::path& SourcePath)\n{\n\tk3d::sl::shaders_t results;\n\n\ttry\n\t{\n\t\t// Find the beginning of a shader (by looking for a shader type) ...\n\t\tstd::vector<std::string> shader_types;\n\t\tshader_types.push_back(\"light\");\n\t\tshader_types.push_back(\"surface\");\n\t\tshader_types.push_back(\"volume\");\n\t\tshader_types.push_back(\"displacement\");\n\t\tshader_types.push_back(\"transformation\");\n\t\tshader_types.push_back(\"imager\");\n\n\t\tconst token_collection_t::const_iterator type_token = std::find_first_of(InputTokens.begin(), InputTokens.end(), shader_types.begin(), shader_types.end());\n\t\treturn_val_if_fail(type_token != InputTokens.end(), results);\n\n\t\t// The shader name should be the next token ...\n\t\tconst token_collection_t::const_iterator name_token = type_token + 1;\n\t\treturn_val_if_fail(name_token != InputTokens.end(), results);\n\n\t\t// We now have the beginning of our shader arguments ...\n\t\ttoken_collection_t::const_iterator start_token = name_token + 1;\n\t\treturn_val_if_fail(start_token != InputTokens.end(), results);\n\t\treturn_val_if_fail(*start_token == \"(\", results);\n\n\t\t// Look for the end of the shader arguments ... since some arguments use parentheses in their declarations,\n\t\t// we have to maintain a count of nested parenthesis to figure out when we're done ...\n\t\ttoken_collection_t::const_iterator end_token = start_token;\n\t\tunsigned long depth = 1;\n\t\tdo\n\t\t{\n\t\t\t++end_token;\n\n\t\t\tif(*end_token == \"(\")\n\t\t\t\t++depth;\n\t\t\telse if(*end_token == \")\")\n\t\t\t\t--depth;\n\t\t}\n\t\twhile(depth);\n\n\t\t// We now have all the argument tokens ...\n\t\ttoken_collection_t arguments;\n\t\tstd::copy(start_token + 1, end_token, std::back_inserter(arguments));\n\n\t\t// Add the new shader to the collection ...\n\t\tconst k3d::sl::shader::type_t type = boost::lexical_cast<k3d::sl::shader::type_t>(*type_token);\n\t\tconst std::string name = *name_token;\n\n\t\tresults.push_back(k3d::sl::shader(SourcePath, type, name, \"\", \"\", \"\", parse_arguments(arguments, SourcePath)));\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tk3d::log() << error << \"Exception parsing shaders for [ \" << SourcePath.native_console_string() << \" ]: \" << e.what() << std::endl;\n\t}\n\tcatch(...)\n\t{\n\t\tk3d::log() << error << \"Unknown exception parsing shaders for [ \" << SourcePath.native_console_string() << \" ]\" << std::endl;\n\t}\n\n\treturn results;\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// argument\n\nargument::argument(const std::string& Name, const std::string& Label, const std::string& Description, const storage_class_t StorageClass, const type_t Type, const extended_type_t ExtendedType, const unsigned long ArrayCount, const std::string& Space, const bool Output, const std::string& DefaultValue) :\n\tname(Name),\n\tlabel(Label),\n\tdescription(Description),\n\tstorage_class(StorageClass),\n\ttype(Type),\n\textended_type(ExtendedType),\n\tarray_count(ArrayCount),\n\tspace(Space),\n\toutput(Output),\n\tdefault_value(DefaultValue)\n{\n\t// Sanity checks ...\n\tassert(name.size());\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// shader\n\nshader::shader(const type_t Type) :\n\ttype(Type),\n\tname(\"null\")\n{\n};\n\nshader::shader(const filesystem::path& FilePath, const type_t Type, const std::string& Name, const std::string& Authors, const std::string& Copyright, const std::string& Description, const arguments_t Arguments) :\n\tfile_path(FilePath),\n\ttype(Type),\n\tname(Name),\n\tauthors(Authors),\n\tcopyright(Copyright),\n\tdescription(Description),\n\targuments(Arguments)\n{\n\tassert(name.size());\n}\n\nbool operator==(const shader& LHS, const shader& RHS)\n{\n\treturn LHS.name == RHS.name;\n}\n\nbool operator!=(const shader& LHS, const shader& RHS)\n{\n\treturn !(LHS == RHS);\n}\n\nbool operator<(const shader& LHS, const shader& RHS)\n{\n\treturn LHS.name < RHS.name;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// serialization\n\nstd::ostream& operator<<(std::ostream& Stream, const argument::storage_class_t& Value)\n{\n\tswitch(Value)\n\t{\n\t\tcase argument::UNIFORM:\n\t\t\tStream << \"uniform\";\n\t\t\tbreak;\n\t\tcase argument::VARYING:\n\t\t\tStream << \"varying\";\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, argument::storage_class_t& Value)\n{\n\tstd::string text;\n\tStream >> text;\n\n\tif(text == \"uniform\")\n\t\tValue = argument::UNIFORM;\n\telse if(text == \"varying\")\n\t\tValue = argument::VARYING;\n\telse\n\t{\n\t\tlog() << error << \"Unknown Shading Language Storage Class: [\" << text << \"]\" << std::endl;\n\t}\n\n\treturn Stream;\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const argument::type_t& Value)\n{\n\tswitch(Value)\n\t{\n\t\tcase argument::FLOAT:\n\t\t\tStream << \"float\";\n\t\t\tbreak;\n\t\tcase argument::STRING:\n\t\t\tStream << \"string\";\n\t\t\tbreak;\n\t\tcase argument::POINT:\n\t\t\tStream << \"point\";\n\t\t\tbreak;\n\t\tcase argument::VECTOR:\n\t\t\tStream << \"vector\";\n\t\t\tbreak;\n\t\tcase argument::NORMAL:\n\t\t\tStream << \"normal\";\n\t\t\tbreak;\n\t\tcase argument::HPOINT:\n\t\t\tStream << \"hpoint\";\n\t\t\tbreak;\n\t\tcase argument::MATRIX:\n\t\t\tStream << \"matrix\";\n\t\t\tbreak;\n\t\tcase argument::COLOR:\n\t\t\tStream << \"color\";\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, argument::type_t& Value)\n{\n\tstd::string text;\n\tStream >> text;\n\n\tif(text == \"float\")\n\t\tValue = argument::FLOAT;\n\telse if(text == \"string\")\n\t\tValue = argument::STRING;\n\telse if(text == \"point\")\n\t\tValue = argument::POINT;\n\telse if(text == \"vector\")\n\t\tValue = argument::VECTOR;\n\telse if(text == \"normal\")\n\t\tValue = argument::NORMAL;\n\telse if(text == \"hpoint\")\n\t\tValue = argument::HPOINT;\n\telse if(text == \"matrix\")\n\t\tValue = argument::MATRIX;\n\telse if(text == \"color\")\n\t\tValue = argument::COLOR;\n\telse\n\t{\n\t\tlog() << error << \"Unknown Shading Language Type: [\" << text << \"]\" << std::endl;\n\t}\n\n\treturn Stream;\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const argument::extended_type_t& Value)\n{\n\tswitch(Value)\n\t{\n\t\tcase argument::EX_FLOAT:\n\t\t\tStream << \"float\";\n\t\t\tbreak;\n\t\tcase argument::EX_TIME:\n\t\t\tStream << \"time\";\n\t\t\tbreak;\n\t\tcase argument::EX_ANGLE:\n\t\t\tStream << \"angle\";\n\t\t\tbreak;\n\t\tcase argument::EX_DISTANCE:\n\t\t\tStream << \"distance\";\n\t\t\tbreak;\n\t\tcase argument::EX_AREA:\n\t\t\tStream << \"area\";\n\t\t\tbreak;\n\t\tcase argument::EX_VOLUME:\n\t\t\tStream << \"volume\";\n\t\t\tbreak;\n\t\tcase argument::EX_MASS:\n\t\t\tStream << \"mass\";\n\t\t\tbreak;\n\t\tcase argument::EX_FORCE:\n\t\t\tStream << \"force\";\n\t\t\tbreak;\n\t\tcase argument::EX_PRESSURE:\n\t\t\tStream << \"pressure\";\n\t\t\tbreak;\n\t\tcase argument::EX_STRING:\n\t\t\tStream << \"string\";\n\t\t\tbreak;\n\t\tcase argument::EX_TEXTURE:\n\t\t\tStream << \"texture\";\n\t\t\tbreak;\n\t\tcase argument::EX_SPACE:\n\t\t\tStream << \"space\";\n\t\t\tbreak;\n\t\tcase argument::EX_POINT:\n\t\t\tStream << \"point\";\n\t\t\tbreak;\n\t\tcase argument::EX_VECTOR:\n\t\t\tStream << \"vector\";\n\t\t\tbreak;\n\t\tcase argument::EX_NORMAL:\n\t\t\tStream << \"normal\";\n\t\t\tbreak;\n\t\tcase argument::EX_HPOINT:\n\t\t\tStream << \"hpoint\";\n\t\t\tbreak;\n\t\tcase argument::EX_MATRIX:\n\t\t\tStream << \"matrix\";\n\t\t\tbreak;\n\t\tcase argument::EX_COLOR:\n\t\t\tStream << \"color\";\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, argument::extended_type_t& Value)\n{\n\tstd::string text;\n\tStream >> text;\n\n\tif(text == \"float\")\n\t\tValue = argument::EX_FLOAT;\n\telse if(text == \"time\")\n\t\tValue = argument::EX_TIME;\n\telse if(text == \"angle\")\n\t\tValue = argument::EX_ANGLE;\n\telse if(text == \"distance\")\n\t\tValue = argument::EX_DISTANCE;\n\telse if(text == \"area\")\n\t\tValue = argument::EX_AREA;\n\telse if(text == \"volume\")\n\t\tValue = argument::EX_VOLUME;\n\telse if(text == \"mass\")\n\t\tValue = argument::EX_MASS;\n\telse if(text == \"force\")\n\t\tValue = argument::EX_FORCE;\n\telse if(text == \"pressure\")\n\t\tValue = argument::EX_PRESSURE;\n\telse if(text == \"string\")\n\t\tValue = argument::EX_STRING;\n\telse if(text == \"texture\")\n\t\tValue = argument::EX_TEXTURE;\n\telse if(text == \"space\")\n\t\tValue = argument::EX_SPACE;\n\telse if(text == \"point\")\n\t\tValue = argument::EX_POINT;\n\telse if(text == \"vector\")\n\t\tValue = argument::EX_VECTOR;\n\telse if(text == \"normal\")\n\t\tValue = argument::EX_NORMAL;\n\telse if(text == \"hpoint\")\n\t\tValue = argument::EX_HPOINT;\n\telse if(text == \"matrix\")\n\t\tValue = argument::EX_MATRIX;\n\telse if(text == \"color\")\n\t\tValue = argument::EX_COLOR;\n\telse\n\t{\n\t\tlog() << error << \"Unknown Extended Shading Language Type: [\" << text << \"]\" << std::endl;\n\t}\n\n\treturn Stream;\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const shader::type_t& Value)\n{\n\tswitch(Value)\n\t{\n\t\tcase shader::SURFACE:\n\t\t\tStream << \"surface\";\n\t\t\tbreak;\n\t\tcase shader::LIGHT:\n\t\t\tStream << \"light\";\n\t\t\tbreak;\n\t\tcase shader::VOLUME:\n\t\t\tStream << \"volume\";\n\t\t\tbreak;\n\t\tcase shader::DISPLACEMENT:\n\t\t\tStream << \"displacement\";\n\t\t\tbreak;\n\t\tcase shader::TRANSFORMATION:\n\t\t\tStream << \"transformation\";\n\t\t\tbreak;\n\t\tcase shader::IMAGER:\n\t\t\tStream << \"imager\";\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, shader::type_t& Value)\n{\n\tstd::string text;\n\tStream >> text;\n\n\tif(text == \"surface\")\n\t\tValue = shader::SURFACE;\n\telse if(text == \"light\")\n\t\tValue = shader::LIGHT;\n\telse if(text == \"volume\")\n\t\tValue = shader::VOLUME;\n\telse if(text == \"displacement\")\n\t\tValue = shader::DISPLACEMENT;\n\telse if(text == \"transformation\")\n\t\tValue = shader::TRANSFORMATION;\n\telse if(text == \"imager\")\n\t\tValue = shader::IMAGER;\n\telse\n\t{\n\t\tlog() << error << \"Unknown Shading Language Shader Type: [\" << text << \"]\" << std::endl;\n\t}\n\n\treturn Stream;\n}\n\nshaders_t parse_source(std::istream& Stream, const filesystem::path& SourcePath)\n{\n\tdetail::token_collection_t tokens;\n\tdetail::parse_stream(Stream, tokens);\n\n\treturn detail::parse_shaders(tokens, SourcePath);\n}\n\nshaders_t parse_metafile(std::istream& Stream, const filesystem::path& SourcePath, const filesystem::path& MetafilePath)\n{\n\tshaders_t results;\n\n\telement xml_metafile(\"k3dml\");\n\ttry\n\t{\n\t\thide_progress progress;\n\t\tparse(xml_metafile, Stream, MetafilePath.native_utf8_string().raw(), progress);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << \"Exception parsing metafile [\" << MetafilePath.native_console_string() << \"]: \" << e.what() << std::endl;\n\t\treturn results;\n\t}\n\n\t// Make sure it's a <k3dml> document ...\n\treturn_val_if_fail(xml_metafile.name == \"k3dml\", results);\n\n\t// Get the first child, which should be our <shaders> collection ...\n\telement* const xml_shaders = find_element(xml_metafile, \"shaders\");\n\treturn_val_if_fail(xml_shaders, results);\n\n\t// Iterate through the children, which should be <shader> elements ...\n\tfor(element::elements_t::iterator xml_shader = xml_shaders->children.begin(); xml_shader != xml_shaders->children.end(); ++xml_shader)\n\t{\n\t\ttry\n\t\t{\n\t\t\tif(xml_shader->name != \"shader\")\n\t\t\t\tcontinue;\n\n\t\t\t// Extract the shader name ...\n\t\t\tconst std::string name = attribute_text(*xml_shader, \"name\");\n\t\t\tif(name.empty())\n\t\t\t\tcontinue;\n\n\t\t\tconst std::string authors = element_text(*xml_shader, \"authors\");\n\t\t\tconst std::string copyright = element_text(*xml_shader, \"copyright\");\n\t\t\tconst std::string description = element_text(*xml_shader, \"description\");\n\t\t\tconst shader::type_t type = boost::lexical_cast<shader::type_t>(attribute_text(*xml_shader, \"type\"));\n\n\t\t\t// Extract shader arguments ...\n\t\t\tshader::arguments_t arguments;\n\t\t\tfor(element::elements_t::iterator xml_argument = xml_shader->children.begin(); xml_argument != xml_shader->children.end(); ++xml_argument)\n\t\t\t{\n\t\t\t\tif(xml_argument->name != \"argument\")\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// Extract the argument name ...\n\t\t\t\tconst std::string name = attribute_text(*xml_argument, \"name\");\n\t\t\t\tif(name.empty())\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst std::string label = attribute_text(*xml_argument, \"label\");\n\t\t\t\tconst std::string description = attribute_text(*xml_argument, \"description\");\n\n\t\t\t\tconst argument::storage_class_t storage_class = boost::lexical_cast<argument::storage_class_t>(attribute_text(*xml_argument, \"storage_class\"));\n\t\t\t\tconst argument::type_t type = boost::lexical_cast<argument::type_t>(attribute_text(*xml_argument, \"type\"));\n\t\t\t\tconst argument::extended_type_t extended_type = boost::lexical_cast<argument::extended_type_t>(attribute_text(*xml_argument, \"extended_type\"));\n\t\t\t\tconst unsigned long array_count = boost::lexical_cast<unsigned long>(attribute_text(*xml_argument, \"array_count\"));\n\t\t\t\tconst std::string space = attribute_text(*xml_argument, \"space\");\n\t\t\t\tconst bool output = attribute_text(*xml_argument, \"output\") == \"true\" ? true : false;\n\t\t\t\tconst std::string default_value = attribute_text(*xml_argument, \"default_value\");\n\n\t\t\t\targuments.push_back(argument(name, label, description, storage_class, type, extended_type, array_count, space, output, default_value));\n\t\t\t}\n\n\t\t\t// Insert the shader into the collection ...\n\t\t\tresults.push_back(shader(SourcePath, type, name, authors, copyright, description, arguments));\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tlog() << error << \"Exception loading metafile [ \" << MetafilePath.native_console_string() << \" ]: \" << e.what() << std::endl;\n\t\t}\n\t}\n\n\treturn results;\n}\n\nvoid generate_metafile(std::ostream& Stream, const shaders_t Shaders)\n{\n\telement xml_document(\"k3dml\");\n\telement& xml_shaders = xml_document.append(element(\"shaders\"));\n\n\tfor(shaders_t::const_iterator shader = Shaders.begin(); shader != Shaders.end(); ++shader)\n\t{\n\t\telement& xml_shader = xml_shaders.append(element(\"shader\"));\n\t\txml_shader.append(attribute(\"name\", shader->name));\n\t\txml_shader.append(attribute(\"type\", boost::lexical_cast<std::string>(shader->type)));\n\n\t\txml_shader.append(element(\"description\", shader->description));\n\t\txml_shader.append(element(\"authors\", shader->authors));\n\t\txml_shader.append(element(\"copyright\", shader->copyright));\n\n\t\tfor(shader::arguments_t::const_iterator argument = shader->arguments.begin(); argument != shader->arguments.end(); ++argument)\n\t\t{\n\t\t\telement& xml_argument = xml_shader.append(element(\"argument\"));\n\t\t\txml_argument.append(attribute(\"name\", argument->name));\n\t\t\txml_argument.append(attribute(\"label\", argument->label));\n\t\t\txml_argument.append(attribute(\"description\", argument->description));\n\t\t\txml_argument.append(attribute(\"storage_class\", boost::lexical_cast<std::string>(argument->storage_class)));\n\t\t\txml_argument.append(attribute(\"type\", boost::lexical_cast<std::string>(argument->type)));\n\t\t\txml_argument.append(attribute(\"extended_type\", boost::lexical_cast<std::string>(argument->extended_type)));\n\t\t\txml_argument.append(attribute(\"array_count\", boost::lexical_cast<std::string>(argument->array_count)));\n\t\t\txml_argument.append(attribute(\"space\", argument->space));\n\t\t\txml_argument.append(attribute(\"output\", argument->output ? \"true\" : \"false\"));\n\t\t\txml_argument.append(attribute(\"default_value\", argument->default_value));\n\t\t}\n\t}\n\n\tStream << k3d::xml::declaration() << xml_document << std::endl;\n}\n\n} // namespace sl\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/sl.h",
    "content": "#ifndef K3DSDK_SL_H\n#define K3DSDK_SL_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares the Shading Language interface, which returns information (including parsed and cached metadata) about a RenderMan Shading Language shader\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/path.h>\n\n#include <iosfwd>\n#include <string>\n#include <vector>\n\nnamespace k3d\n{\n\nnamespace sl\n{\n\n/// Encapsulates an argument to a Pixar RenderMan Shading Language shader\nclass argument\n{\npublic:\n\t/// Enumerates Shading Language storage classes\n\ttypedef enum\n\t{\n\t\tUNIFORM,\n\t\tVARYING,\n\t} storage_class_t;\n\n\t/// Enumerates Shading Language data types\n\ttypedef enum\n\t{\n\t\tFLOAT,\n\t\tSTRING,\n\t\tPOINT,\n\t\tVECTOR,\n\t\tNORMAL,\n\t\tHPOINT,\n\t\tMATRIX,\n\t\tCOLOR,\n\t} type_t;\n\n\t/// Enumerates \"extended\" data types\n\ttypedef enum\n\t{\n\t\tEX_FLOAT,\n\t\t\tEX_TIME,\n\t\t\tEX_ANGLE,\n\t\t\tEX_DISTANCE,\n\t\t\tEX_AREA,\n\t\t\tEX_VOLUME,\n\t\t\tEX_MASS,\n\t\t\tEX_FORCE,\n\t\t\tEX_PRESSURE,\n\t\tEX_STRING,\n\t\t\tEX_TEXTURE,\n\t\t\tEX_SPACE,\n\t\tEX_POINT,\n\t\tEX_VECTOR,\n\t\tEX_NORMAL,\n\t\tEX_HPOINT,\n\t\tEX_MATRIX,\n\t\tEX_COLOR,\n\t} extended_type_t;\n\n\t/// Stores the argument name\n\tstd::string name;\n\t/// Stores the argument label (human-readable string)\n\tstd::string label;\n\t/// Stores the argument description (human-readable string)\n\tstd::string description;\n\t/// Stores the Shading Language storage class\n\tstorage_class_t storage_class;\n\t/// Stores the Shading Language data type\n\ttype_t type;\n\t/// Stores the extended data type\n\textended_type_t extended_type;\n\t/// Stores the number of array elements for this argument\n\tunsigned long array_count;\n\t/// Stores the coordinate system that this argument is declared within\n\tstd::string space;\n\t/// Stores true iff this argument is an output (message passing) argument\n\tbool output;\n\t/// Stores the argument's default value as a string\n\tstd::string default_value;\n\n\t// Enforce strict initialization\n\targument(const std::string& Name, const std::string& Label, const std::string& Description, const storage_class_t StorageClass, const type_t Type, const extended_type_t ExtendedType, const unsigned long ArrayCount, const std::string& Space, const bool Output, const std::string& DefaultValue);\n};\n\n/// Encapsulates a Pixar RenderMan Shading Language shader\nclass shader\n{\npublic:\n\t/// Enumerates shader types\n\ttypedef enum\n\t{\n\t\tSURFACE,\n\t\tLIGHT,\n\t\tVOLUME,\n\t\tDISPLACEMENT,\n\t\tTRANSFORMATION,\n\t\tIMAGER,\n\t} type_t;\n\n\t/// Stores the shader file\n\tfilesystem::path file_path;\n\t/// Stores the shader type\n\ttype_t type;\n\t/// Stores the shader name\n\tstd::string name;\n\t/// Stores the shader author(s)\n\tstd::string authors;\n\t/// Stores the shader copyright\n\tstd::string copyright;\n\t/// Stores a brief description of the shader\n\tstd::string description;\n\t/// Stores the shader arguments\n\ttypedef std::vector<argument> arguments_t;\n\targuments_t arguments;\n\n\tshader(const type_t Type);\n\tshader(const filesystem::path& FilePath, const type_t Type, const std::string& Name, const std::string& Authors, const std::string& Copyright, const std::string& Description, const arguments_t Arguments);\n};\n\n/// A collection of shaders\ntypedef std::vector<shader> shaders_t;\n\nbool operator==(const shader& LHS, const shader& RHS);\nbool operator!=(const shader& LHS, const shader& RHS);\nbool operator<(const shader& LHS, const shader& RHS);\n\n// Serialization\nstd::ostream& operator<<(std::ostream& Stream, const argument::storage_class_t&);\nstd::istream& operator>>(std::istream& Stream, argument::storage_class_t&);\nstd::ostream& operator<<(std::ostream& Stream, const argument::type_t&);\nstd::istream& operator>>(std::istream& Stream, argument::type_t&);\nstd::ostream& operator<<(std::ostream& Stream, const argument::extended_type_t&);\nstd::istream& operator>>(std::istream& Stream, argument::extended_type_t&);\nstd::ostream& operator<<(std::ostream& Stream, const shader::type_t& Value);\nstd::istream& operator>>(std::istream& Stream, shader::type_t& Value);\n\n/// Parses preprocessed RenderMan shading language source-code, returning shader data (note: could return an empty collection, SourcePath is for informational messages only)\nshaders_t parse_source(std::istream& Stream, const filesystem::path& SourcePath);\n/// Parses a shader metafile, returning shader data (note: could return an empty collection, SourcePath and MetafilePath are for informational messages only)\nshaders_t parse_metafile(std::istream& Stream, const filesystem::path& SourcePath, const filesystem::path& MetafilePath);\n/// Generates a shader metafile from a collection of shaders\nvoid generate_metafile(std::ostream& Stream, const shaders_t Shaders);\n\n} // namespace sl\n\n} // namespace k3d\n\n#endif // !K3DSDK_SL_H\n\n"
  },
  {
    "path": "k3dsdk/snap_source.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/snap_source.h>\n\nnamespace k3d\n{\n\n////////////////////////////////////////////////////////////////////////////////////\n// snap_source\n\nsnap_source::snap_source(const std::string& Label, const position_slot_t& PositionSlot, const orientation_slot_t& OrientationSlot) :\n\tm_label(Label),\n\tm_position_slot(PositionSlot),\n\tm_orientation_slot(OrientationSlot)\n{\n}\n\t\nconst std::string snap_source::label()\n{\n\treturn m_label;\n}\n\nconst isnap_source::groups_t snap_source::groups()\n{\n\treturn groups_t();\n}\n\nconst point3 snap_source::source_position()\n{\n\treturn m_position_slot();\n}\n\nbool snap_source::source_orientation(vector3& SourceLook, vector3& SourceUp)\n{\n\treturn m_orientation_slot(SourceLook, SourceUp);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/snap_source.h",
    "content": "#ifndef K3DSDK_SNAP_SOURCE_H\n#define K3DSDK_SNAP_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/isnap_source.h>\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nclass snap_source :\n\tpublic isnap_source\n{\npublic:\n\ttypedef sigc::slot<const point3> position_slot_t;\n\ttypedef sigc::slot<bool, vector3&, vector3&> orientation_slot_t;\n\n\tsnap_source(const std::string& Label, const position_slot_t& PositionSlot, const orientation_slot_t& OrientationSlot);\n\t\n\tconst std::string label();\n\tconst groups_t groups();\n\tconst point3 source_position();\n\tbool source_orientation(vector3& SourceLook, vector3& SourceUp);\n\nprivate:\n\tconst std::string m_label;\n\tconst position_slot_t m_position_slot;\n\tconst orientation_slot_t m_orientation_slot;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_SNAP_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/snap_target.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/snap_target.h>\n\nnamespace k3d\n{\n\n////////////////////////////////////////////////////////////////////////////////////\n// snap_target\n\nsnap_target::snap_target(const std::string& Label, const position_slot_t& PositionSlot, const orientation_slot_t& OrientationSlot) :\n\tm_label(Label),\n\tm_position_slot(PositionSlot),\n\tm_orientation_slot(OrientationSlot)\n{\n}\n\t\nconst std::string snap_target::label()\n{\n\treturn m_label;\n}\n\nconst isnap_target::groups_t snap_target::groups()\n{\n\treturn groups_t();\n}\n\nbool snap_target::target_position(const point3& Position, point3& TargetPosition)\n{\n\treturn m_position_slot(Position, TargetPosition);\n}\n\nbool snap_target::target_orientation(const point3& Position, vector3& TargetLook, vector3& TargetUp)\n{\n\treturn m_orientation_slot(Position, TargetLook, TargetUp);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/snap_target.h",
    "content": "#ifndef K3DSDK_SNAP_TARGET_H\n#define K3DSDK_SNAP_TARGET_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/isnap_target.h>\n#include <k3dsdk/signal_system.h>\n\nnamespace k3d\n{\n\nclass snap_target :\n\tpublic isnap_target\n{\npublic:\n\ttypedef sigc::slot<bool, const point3&, point3&> position_slot_t;\n\ttypedef sigc::slot<bool, const point3&, vector3&, vector3&> orientation_slot_t;\n\n\tsnap_target(const std::string& Label, const position_slot_t& PositionSlot, const orientation_slot_t& OrientationSlot);\n\t\n\tconst std::string label();\n\tconst groups_t groups();\n\tbool target_position(const point3& Position, point3& TargetPosition);\n\tbool target_orientation(const point3& Position, vector3& TargetLook, vector3& TargetUp);\n\nprivate:\n\tconst std::string m_label;\n\tconst position_slot_t m_position_slot;\n\tconst orientation_slot_t m_orientation_slot;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_SNAP_TARGET_H\n\n"
  },
  {
    "path": "k3dsdk/snappable.h",
    "content": "#ifndef K3DSDK_SNAPPABLE_H\n#define K3DSDK_SNAPPABLE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/snappable_detail.h>\n\nnamespace k3d\n{\n\n/// Provides a boilerplate implementation of k3d::isnappable for objects that can be interactively \"snapped\"\ntemplate<typename base_t>\nclass snappable :\n\tpublic base_t,\n\tpublic snappable_detail\n{\npublic:\n\tsnappable(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document)\n\t{\n\t}\n\n\tvoid save(xml::element& Element, const ipersistent::save_context& Context)\n\t{\n\t\tsnappable_detail::save(Element, Context);\n\t\tbase_t::save(Element, Context);\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context)\n\t{\n\t\tsnappable_detail::load(Element, Context);\n\t\tbase_t::load(Element, Context);\n\t}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_SNAPPABLE_H\n\n"
  },
  {
    "path": "k3dsdk/snappable_detail.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares isnappable, an abstract interface implemented by objects to which other objects can be interactively \"snapped\"\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/explicit_snap_source.h>\n#include <k3dsdk/explicit_snap_target.h>\n#include <k3dsdk/isnap_source.h>\n#include <k3dsdk/isnap_target.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/snappable_detail.h>\n#include <k3dsdk/xml.h>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\nstruct delete_snap_object\n{\n\tvoid operator()(isnap_source* Object)\n\t{\n\t\tdelete Object;\n\t}\n\n\tvoid operator()(isnap_target* Object)\n\t{\n\t\tdelete Object;\n\t}\n};\n\n} // nsmespace detail\n\nsnappable_detail::~snappable_detail()\n{\n\tstd::for_each(m_snap_sources.begin(), m_snap_sources.end(), detail::delete_snap_object());\n\tstd::for_each(m_snap_targets.begin(), m_snap_targets.end(), detail::delete_snap_object());\n}\n\nconst isnappable::snap_sources_t snappable_detail::snap_sources()\n{\n\treturn m_snap_sources;\n}\n\nconst isnappable::snap_targets_t snappable_detail::snap_targets()\n{\n\treturn m_snap_targets;\n}\n\nvoid snappable_detail::add_snap_source(isnap_source* const SnapSource)\n{\n\treturn_if_fail(std::find(m_snap_sources.begin(), m_snap_sources.end(), SnapSource) == m_snap_sources.end());\n\tm_snap_sources.push_back(SnapSource);\n}\n\nvoid snappable_detail::add_snap_target(isnap_target* const SnapTarget)\n{\n\treturn_if_fail(std::find(m_snap_targets.begin(), m_snap_targets.end(), SnapTarget) == m_snap_targets.end());\n\tm_snap_targets.push_back(SnapTarget);\n}\n\nvoid snappable_detail::save(xml::element& Element, const ipersistent::save_context& Context)\n{\n\txml::element* xml_snap_sources = 0;\n\tfor(snap_sources_t::const_iterator snap_source = m_snap_sources.begin(); snap_source != m_snap_sources.end(); ++snap_source)\n\t{\n\t\tif(explicit_snap_source* const source = dynamic_cast<explicit_snap_source*>(*snap_source))\n\t\t{\n\t\t\tif(!xml_snap_sources)\n\t\t\t\txml_snap_sources = &Element.append(xml::element(\"snap_sources\"));\n\n\t\t\txml::element& xml_snap_source = xml_snap_sources->append(xml::element(\"snap_source\"));\n\t\t\txml_snap_source.append(xml::attribute(\"label\", source->m_label));\n\t\t\txml_snap_source.append(xml::attribute(\"position\", source->m_position));\n\t\t\tif(source->m_look.get())\n\t\t\t\txml_snap_source.append(xml::attribute(\"look\", *source->m_look));\n\t\t\tif(source->m_up.get())\n\t\t\t\txml_snap_source.append(xml::attribute(\"up\", *source->m_up));\n\n\t\t\tif(source->m_groups.size())\n\t\t\t{\n\t\t\t\txml::element& xml_groups = xml_snap_source.append(xml::element(\"groups\"));\n\t\t\t\tfor(isnap_source::groups_t::iterator group = source->m_groups.begin(); group != source->m_groups.end(); ++group)\n\t\t\t\t\txml_groups.append(xml::element(\"group\", *group));\n\t\t\t}\n\t\t}\n\t}\n\n\txml::element* xml_snap_targets = 0;\n\tfor(snap_targets_t::const_iterator snap_target = m_snap_targets.begin(); snap_target != m_snap_targets.end(); ++snap_target)\n\t{\n\t\tif(explicit_snap_target* const target = dynamic_cast<explicit_snap_target*>(*snap_target))\n\t\t{\n\t\t\tif(!xml_snap_targets)\n\t\t\t\txml_snap_targets = &Element.append(xml::element(\"snap_targets\"));\n\n\t\t\txml::element& xml_snap_target = xml_snap_targets->append(xml::element(\"snap_target\"));\n\t\t\txml_snap_target.append(xml::attribute(\"label\", target->m_label));\n\t\t\txml_snap_target.append(xml::attribute(\"position\", target->m_position));\n\t\t\tif(target->m_look.get())\n\t\t\t\txml_snap_target.append(xml::attribute(\"look\", *target->m_look));\n\t\t\tif(target->m_up.get())\n\t\t\t\txml_snap_target.append(xml::attribute(\"up\", *target->m_up));\n\n\t\t\tif(target->m_groups.size())\n\t\t\t{\n\t\t\t\txml::element& xml_groups = xml_snap_target.append(xml::element(\"groups\"));\n\t\t\t\tfor(isnap_source::groups_t::iterator group = target->m_groups.begin(); group != target->m_groups.end(); ++group)\n\t\t\t\t\txml_groups.append(xml::element(\"group\", *group));\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid snappable_detail::load(xml::element& Element, const ipersistent::load_context& Context)\n{\n\tif(xml::element* const xml_snap_sources = xml::find_element(Element, \"snap_sources\"))\n\t{\n\t\tfor(xml::element::elements_t::iterator xml_snap_source = xml_snap_sources->children.begin(); xml_snap_source != xml_snap_sources->children.end(); ++xml_snap_source)\n\t\t{\n\t\t\tif(xml_snap_source->name != \"snap_source\")\n\t\t\t\tcontinue;\n\n\t\t\tconst std::string xml_label = xml::attribute_text(*xml_snap_source, \"label\");\n\t\t\tif(xml_label.empty())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"snap source without label will be ignored\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tconst std::string xml_position = xml::attribute_text(*xml_snap_source, \"position\");\n\t\t\tif(xml_position.empty())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"snap source [\" << xml_label << \"] without position will be ignored\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tconst std::string xml_look = xml::attribute_text(*xml_snap_source, \"look\");\n\t\t\tconst std::string xml_up = xml::attribute_text(*xml_snap_source, \"up\");\n\n\t\t\texplicit_snap_source* snap_source = 0;\n\t\t\t\n\t\t\tif(xml_look.empty() || xml_up.empty())\n\t\t\t{\n\t\t\t\tsnap_source = new explicit_snap_source(\n\t\t\t\t\txml_label,\n\t\t\t\t\tfrom_string<k3d::point3>(xml_position, k3d::point3(0, 0, 0)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsnap_source = new explicit_snap_source(\n\t\t\t\t\txml_label,\n\t\t\t\t\tfrom_string<k3d::point3>(xml_position, k3d::point3(0, 0, 0)),\n\t\t\t\t\tfrom_string<k3d::vector3>(xml_look, k3d::vector3(0, 0, 1)),\n\t\t\t\t\tfrom_string<k3d::vector3>(xml_up, k3d::vector3(0, 1, 0)));\n\t\t\t}\n\n\t\t\tif(xml::element* const xml_groups = xml::find_element(*xml_snap_source, \"groups\"))\n\t\t\t{\n\t\t\t\tfor(xml::element::elements_t::iterator xml_group = xml_groups->children.begin(); xml_group != xml_groups->children.end(); ++xml_group)\n\t\t\t\t{\n\t\t\t\t\tif(xml_group->name != \"group\")\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tsnap_source->add_group(xml_group->text);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tadd_snap_source(snap_source);\n\t\t}\n\t}\n\t\n\tif(xml::element* const xml_snap_targets = xml::find_element(Element, \"snap_targets\"))\n\t{\n\t\tfor(xml::element::elements_t::iterator xml_snap_target = xml_snap_targets->children.begin(); xml_snap_target != xml_snap_targets->children.end(); ++xml_snap_target)\n\t\t{\n\t\t\tif(xml_snap_target->name != \"snap_target\")\n\t\t\t\tcontinue;\n\n\t\t\tconst std::string xml_label = xml::attribute_text(*xml_snap_target, \"label\");\n\t\t\tif(xml_label.empty())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"snap target without label will be ignored\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tconst std::string xml_position = xml::attribute_text(*xml_snap_target, \"position\");\n\t\t\tif(xml_position.empty())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"snap target [\" << xml_label << \"] without position will be ignored\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tconst std::string xml_look = xml::attribute_text(*xml_snap_target, \"look\");\n\t\t\tconst std::string xml_up = xml::attribute_text(*xml_snap_target, \"up\");\n\n\t\t\texplicit_snap_target* snap_target = 0;\n\n\t\t\tif(xml_look.empty() || xml_up.empty())\n\t\t\t{\n\t\t\t\tsnap_target = new explicit_snap_target(\n\t\t\t\t\txml_label,\n\t\t\t\t\tfrom_string<k3d::point3>(xml_position, k3d::point3(0, 0, 0)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsnap_target = new explicit_snap_target(\n\t\t\t\t\txml_label,\n\t\t\t\t\tfrom_string<k3d::point3>(xml_position, k3d::point3(0, 0, 0)),\n\t\t\t\t\tfrom_string<k3d::vector3>(xml_look, k3d::vector3(0, 0, 1)),\n\t\t\t\t\tfrom_string<k3d::vector3>(xml_up, k3d::vector3(0, 1, 0)));\n\t\t\t}\n\n\t\t\tif(xml::element* const xml_groups = xml::find_element(*xml_snap_target, \"groups\"))\n\t\t\t{\n\t\t\t\tfor(xml::element::elements_t::iterator xml_group = xml_groups->children.begin(); xml_group != xml_groups->children.end(); ++xml_group)\n\t\t\t\t{\n\t\t\t\t\tif(xml_group->name != \"group\")\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tsnap_target->add_group(xml_group->text);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tadd_snap_target(snap_target);\n\t\t}\n\t}\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/snappable_detail.h",
    "content": "#ifndef K3DSDK_SNAPPABLE_DETAIL_H\n#define K3DSDK_SNAPPABLE_DETAIL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ipersistent.h>\n#include <k3dsdk/isnappable.h>\n\nnamespace k3d\n{\n\n/// Provides a boilerplate implementation of k3d::isnappable for objects that can be interactively \"snapped\"\nclass snappable_detail :\n\tpublic isnappable\n{\npublic:\n\tvirtual ~snappable_detail();\n\n\tconst snap_sources_t snap_sources();\n\tconst snap_targets_t snap_targets();\n\n\tvoid add_snap_source(isnap_source* const SnapSource);\n\tvoid add_snap_target(isnap_target* const SnapTarget);\n\t\n\tvoid save(xml::element& Element, const ipersistent::save_context& Context);\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context);\n\nprivate:\n\tsnap_sources_t m_snap_sources;\n\tsnap_targets_t m_snap_targets;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_SNAPPABLE_DETAIL_H\n\n"
  },
  {
    "path": "k3dsdk/socket.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-platform-config.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/socket.h>\n#include <k3dsdk/string_cast.h>\n\n#include <cstring>\n\n#ifdef K3D_API_WIN32\n\n\t#include <winsock2.h>\n\n#else // K3D_API_WIN32\n\n\t#include <errno.h>\n\t#include <fcntl.h>\n\t#include <netdb.h>\n\t#include <netinet/in.h>\n\t#include <sys/socket.h>\n\t#include <sys/types.h>\n\n\textern int h_errno;\n\n#endif // !K3D_API_WIN32\n\n#ifdef K3D_API_DARWIN\n\n\t#define MSG_NOSIGNAL SO_NOSIGPIPE\n\n#endif // K3D_API_DARWIN\n\nnamespace k3d\n{\n\nnamespace socket\n{\n\n/////////////////////////////////////////////////////////////////////\n// exception\n\nexception::exception(const std::string& message) :\n\tstd::runtime_error(message)\n{\n}\n\n/////////////////////////////////////////////////////////////////////\n// closed\n\nclosed::closed() :\n\texception(\"socket closed\")\n{\n}\n\n/////////////////////////////////////////////////////////////////////\n// would_block\n\nwould_block::would_block() :\n\texception(\"socket operation would block\")\n{\n}\n\n/////////////////////////////////////////////////////////////////////\n// endpoint::implementation\n\n#ifdef K3D_API_WIN32\n\n\t/// Helper class that handles one-time winsock initialization\n\tclass wsa_startup\n\t{\n\tpublic:\n\t\twsa_startup()\n\t\t{\n\t\t\tif(initialized)\n\t\t\t\treturn;\n\n\t\t\tconst int result = WSAStartup(MAKEWORD(1, 1), &data);\n\t\t\tif(0 != result)\n\t\t\t\tthrow socket::exception(\"winsock initialization error: \" + k3d::string_cast(result));\n\n\t\t\tinitialized = true;\n\t\t}\n\n\tprivate:\n\t\tstatic bool initialized;\n\t\tstatic WSADATA data;\n\t};\n\n\tbool wsa_startup::initialized = false;\n\tWSADATA wsa_startup::data;\n\n\t/// Provides a winsock implementation of k3d::socket::endpoint\n\tclass endpoint::implementation\n\t{\n\tpublic:\n\t\timplementation(SOCKET Socket) :\n\t\t\tsocket(Socket)\n\t\t{\n\t\t\tset_blocking();\n\t\t}\n\n\t\timplementation(const port& Port) :\n\t\t\tsocket(::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))\n\t\t{\n\t\t\tif(INVALID_SOCKET == socket)\n\t\t\t\tthrow_exception();\n\n\t\t\tset_blocking();\n\n\t\t\tSOCKADDR_IN address;\n\t\t\taddress.sin_family = AF_INET;\n\t\t\taddress.sin_port = htons(Port);\n\t\t\taddress.sin_addr.s_addr = htonl(INADDR_ANY);\n\n\t\t\tif(SOCKET_ERROR == ::bind(socket, reinterpret_cast<SOCKADDR*>(&address), sizeof(address)))\n\t\t\t\tthrow_exception();\n\n\t\t\tif(SOCKET_ERROR == ::listen(socket, SOMAXCONN))\n\t\t\t\tthrow_exception();\n\t\t}\n\n\t\timplementation(const address& Address, const port& Port) :\n\t\t\tsocket(::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))\n\t\t{\n\t\t\tif(INVALID_SOCKET == socket)\n\t\t\t\tthrow_exception();\n\n\t\t\tset_blocking();\n\n\t\t\thostent* const host = gethostbyname(Address.c_str());\n\t\t\tif(!host)\n\t\t\t\tthrow_exception();\n\n\t\t\tSOCKADDR_IN address;\n\t\t\tmemset(&address, 0, sizeof(address));\n\t\t\taddress.sin_family = AF_INET;\n\t\t\taddress.sin_port = htons(Port);\n\t\t\tmemcpy(&address.sin_addr, host->h_addr, host->h_length);\n\n\t\t\tif(SOCKET_ERROR == ::connect(socket, reinterpret_cast<SOCKADDR*>(&address), sizeof(address)))\n\t\t\t\tthrow_exception();\n\t\t}\n\n\t\t~implementation()\n\t\t{\n\t\t\t// Never throw exceptions from dtors!\n\t\t\tif(SOCKET_ERROR == ::closesocket(socket))\n\t\t\t\tk3d::log() << error << \"error closing socket: \" << WSAGetLastError() << std::endl;\n\t\t}\n\n\t\tvoid set_blocking()\n\t\t{\n\t\t\tint mode = 0;\n\t\t\t::ioctlsocket(socket, FIONBIO, reinterpret_cast<u_long*>(&mode));\n\t\t}\n\n\t\tvoid set_non_blocking()\n\t\t{\n\t\t\tint mode = 1;\n\t\t\t::ioctlsocket(socket, FIONBIO, reinterpret_cast<u_long*>(&mode));\n\t\t}\n\n\t\tendpoint accept()\n\t\t{\n\t\t\tconst SOCKET new_connection = ::accept(socket, 0, 0);\n\t\t\tif(INVALID_SOCKET == new_connection)\n\t\t\t\tthrow_exception();\n\n\t\t\treturn endpoint(new implementation(new_connection));\n\t\t}\n\n\t\tvoid write(const char* buffer, const size_t length)\n\t\t{\n\t\t\tif(SOCKET_ERROR == ::send(socket, buffer, length, 0))\n\t\t\t\tthrow_exception();\n\t\t}\n\n\t\tsize_t read(char* buffer, const size_t length)\n\t\t{\n\t\t\tint bytes_read = ::recv(socket, buffer, length, 0);\n\t\t\tif(0 == bytes_read)\n                throw socket::closed();\n\t\t\tif(SOCKET_ERROR == bytes_read)\n\t\t\t\tthrow_exception();\n\n\t\t\treturn bytes_read;\n\t\t}\n\n\tprivate:\n\t\tvoid throw_exception()\n\t\t{\n\t\t\tswitch(WSAGetLastError())\n\t\t\t{\n\t\t\t\tcase WSAECONNRESET:\n\t\t\t\t\tthrow socket::closed();\n\n\t\t\t\tcase WSAEWOULDBLOCK:\n\t\t\t\t\tthrow socket::would_block();\n\n\t\t\t\tdefault:\n                {\n                    std::string buffer(2048, '\\0');\n                    buffer.resize(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), const_cast<char*>(buffer.data()), buffer.size(), 0));\n                    std::replace(buffer.begin(), buffer.end(), '\\r', ' ');\n                    std::replace(buffer.begin(), buffer.end(), '\\n', ' ');\n                    throw socket::exception(buffer);\n                }\n\t\t\t}\n\t\t}\n\n\t\twsa_startup startup;\n\t\tconst SOCKET socket;\n\t};\n\n#else // K3D_API_WIN32\n\n\t/// Provides a posix implementation of k3d::socket::endpoint\n\tclass endpoint::implementation\n\t{\n\tpublic:\n\t\timplementation(const int Socket) :\n\t\t\tsocket(Socket)\n\t\t{\n\t\t\tset_blocking();\n\t\t}\n\n\t\timplementation(const port& Port) :\n\t\t\tsocket(::socket(AF_INET, SOCK_STREAM, 0))\n\t\t{\n\t\t\tif(-1 == socket)\n\t\t\t\tthrow_exception();\n\n\t\t\tset_blocking();\n\n\t\t\tsockaddr_in address;\n\t\t\tmemset(&address, 0, sizeof(address));\n\t\t\taddress.sin_family = AF_INET;\n\t\t\taddress.sin_port = htons(Port);\n\t\t\taddress.sin_addr.s_addr = htonl(INADDR_ANY);\n\n\t\t\tif(-1 == ::bind(socket, reinterpret_cast<sockaddr*>(&address), sizeof(address)))\n\t\t\t\tthrow_exception();\n\n\t\t\tif(-1 == ::listen(socket, SOMAXCONN))\n\t\t\t\tthrow_exception();\n\t\t}\n\n\t\timplementation(const address& Address, const port& Port) :\n\t\t\tsocket(::socket(AF_INET, SOCK_STREAM, 0))\n\t\t{\n\t\t\tif(-1 == socket)\n\t\t\t\tthrow_exception();\n\n\t\t\tset_blocking();\n\n\t\t\thostent* const host = gethostbyname(Address.c_str());\n\t\t\tif(!host)\n\t\t\t\tthrow socket::exception(hstrerror(h_errno));\n\n\t\t\tsockaddr_in address;\n\t\t\tmemset(&address, 0, sizeof(address));\n\t\t\taddress.sin_family = AF_INET;\n\t\t\taddress.sin_port = htons(Port);\n\t\t\tmemcpy(&address.sin_addr, host->h_addr, host->h_length);\n\n\t\t\tif(-1 == ::connect(socket, reinterpret_cast<sockaddr*>(&address), sizeof(address)))\n\t\t\t\tthrow_exception();\n\t\t}\n\n\t\t~implementation()\n\t\t{\n\t\t\t// Never throw exceptions from a dtor!\n\t\t\tif(-1 == ::close(socket))\n\t\t\t\tk3d::log() << error << \"error closing socket: \" << strerror(errno) << std::endl;\n\t\t}\n\n\t\tvoid set_blocking()\n\t\t{\n\t\t\tint options = fcntl(socket, F_GETFL, 0);\n\t\t\toptions &= ~O_NONBLOCK;\n\n\t\t\tif(-1 == ::fcntl(socket, F_SETFL, options))\n\t\t\t\tthrow_exception();\n\t\t}\n\n\t\tvoid set_non_blocking()\n\t\t{\n\t\t\tint options = fcntl(socket, F_GETFL, 0);\n\t\t\toptions |= O_NONBLOCK;\n\n\t\t\tif(-1 == ::fcntl(socket, F_SETFL, options))\n\t\t\t\tthrow_exception();\n\t\t}\n\n\t\tendpoint accept()\n\t\t{\n\t\t\tconst int new_connection = ::accept(socket, 0, 0);\n\t\t\tif(-1 == new_connection)\n\t\t\t\tthrow_exception();\n\n\t\t\treturn endpoint(new implementation(new_connection));\n\t\t}\n\n\t\tvoid write(const char* buffer, const size_t length)\n\t\t{\n\t\t\tif(-1 == ::send(socket, buffer, length, MSG_NOSIGNAL))\n\t\t\t\tthrow_exception();\n\t\t}\n\n\t\tsize_t read(char* buffer, const size_t length)\n\t\t{\n\t\t\tint bytes_read = ::recv(socket, buffer, length, 0);\n\t\t\tif(-1 == bytes_read)\n\t\t\t\tthrow_exception();\n\n\t\t\tif(0 == bytes_read)\n\t\t\t\tthrow socket::closed();\n\n\t\t\treturn bytes_read;\n\t\t}\n\n\tprivate:\n\t\tvoid throw_exception()\n\t\t{\n\t\t\tswitch(errno)\n\t\t\t{\n\t\t\t\tcase EAGAIN:\n\t\t\t\t\tthrow socket::would_block();\n\n\t\t\t\tcase ECONNRESET:\n\t\t\t\tcase EPIPE:\n\t\t\t\t\tthrow socket::closed();\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow socket::exception(strerror(errno));\n\t\t\t}\n\t\t}\n\n\t\tconst int socket;\n\t};\n\n#endif // !K3D_API_WIN32\n\n/////////////////////////////////////////////////////////////////////\n// endpoint\n\nendpoint::endpoint(implementation* const Implementation) :\n\tm_implementation(Implementation)\n{\n}\n\nendpoint::~endpoint()\n{\n\tdelete m_implementation;\n}\n\nvoid endpoint::set_blocking()\n{\n\tm_implementation->set_blocking();\n}\n\nvoid endpoint::set_non_blocking()\n{\n\tm_implementation->set_non_blocking();\n}\n\nendpoint endpoint::accept()\n{\n\treturn m_implementation->accept();\n}\n\nvoid endpoint::write(const char* Buffer, const size_t Length)\n{\n\tm_implementation->write(Buffer, Length);\n}\n\nvoid endpoint::write(const std::string& Buffer)\n{\n\tm_implementation->write(Buffer.data(), Buffer.size());\n}\n\nsize_t endpoint::read(char* Buffer, const size_t Length)\n{\n\treturn m_implementation->read(Buffer, Length);\n}\n\nvoid endpoint::read(std::string& Buffer, const size_t Length)\n{\n\tBuffer.resize(Length, '\\0');\n\tconst size_t bytes_read = m_implementation->read(const_cast<char*>(Buffer.data()), Buffer.size());\n\tBuffer.resize(bytes_read);\n}\n\n/////////////////////////////////////////////////////////////////////\n// listen\n\nendpoint listen(const port& Port)\n{\n\treturn endpoint(new endpoint::implementation(Port));\n}\n\n/////////////////////////////////////////////////////////////////////\n// connect\n\nendpoint connect(const address& Host, const port& Port)\n{\n\treturn endpoint(new endpoint::implementation(Host, Port));\n}\n\n} // namespace socket\n\n} // namespace k3d\n"
  },
  {
    "path": "k3dsdk/socket.h",
    "content": "#ifndef K3DSDK_SOCKET_H\n#define K3DSDK_SOCKET_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <boost/cstdint.hpp>\n#include <stdexcept>\n\nnamespace k3d\n{\n\nnamespace socket\n{\n\n/// Defines storage for a host address (hostname or IP address in dotted-quad notation)\ntypedef std::string address;\n/// Defines storage for a TCP port number\ntypedef boost::uint16_t port;\n\n/// Base-class for all exceptions thrown by sockets\nclass exception :\n\tpublic std::runtime_error\n{\npublic:\n\texception(const std::string& message);\n};\n\n/// Exception thrown when the opposite end of a connection has closed\nclass closed :\n\tpublic exception\n{\npublic:\n\tclosed();\n};\n\n/// Exception thrown when a non-blocking socket operation would block\nclass would_block :\n\tpublic exception\n{\npublic:\n\twould_block();\n};\n\n/// Encapsulates one end of an open socket connection\nclass endpoint\n{\npublic:\n\t~endpoint();\n\n\t/// Sets blocking behavior for the endpoint (endpoints are blocking by default)\n\tvoid set_blocking();\n\t/// Sets non-blocking behavior for the endpoint (non-blocking endpoints throw a would_block exception if an operation would block)\n\tvoid set_non_blocking();\n\n\t/// Accepts an incoming connection, returning an endpoint for communicating with the remote host (server sockets only)\n\t/** \\note The new connection will be blocking, regardless of the state of the listening socket */\n\tendpoint accept();\n\n\t/// Writes a buffer of given length to the socket\n\tvoid write(const char* Buffer, const size_t Length);\n\t/// Writes a string to the socket\n\tvoid write(const std::string& Buffer);\n\t\n\t/// Reads up to Length bytes from the socket into the given buffer, returns the number of bytes read\n\tsize_t read(char* Buffer, const size_t Length);\n\t/// Reads up to Length bytes from the socket into a string, resizing the string to reflect the number of bytes read\n\tvoid read(std::string& Buffer, const size_t Length = 4096);\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n\n\tendpoint(implementation* const);\n\n\tfriend endpoint listen(const port&);\n\tfriend endpoint connect(const address&, const port&);\n};\n\n/// Creates a listening socket, bound to a local port (a server), throws on failure\nendpoint listen(const port& Port);\n/// Connects to a listening server, throws on failure\nendpoint connect(const address& Host, const port& Port);\n\n} // namespace socket\n\n} // namespace k3d\n\n#endif // !K3DSDK_SOCKET_H\n\n\n"
  },
  {
    "path": "k3dsdk/sphere.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/sphere.h>\n#include <k3dsdk/string_cast.h>\n\nnamespace k3d\n{\n\nnamespace sphere\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::matrices_t& Matrices,\n\tconst mesh::materials_t& Materials,\n\tconst mesh::doubles_t& Radii,\n\tconst mesh::doubles_t& ZMin,\n\tconst mesh::doubles_t& ZMax,\n\tconst mesh::doubles_t& SweepAngles,\n\tconst mesh::selection_t& Selections,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& SurfaceAttributes,\n\tconst mesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tradii(Radii),\n\tz_min(ZMin),\n\tz_max(ZMax),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::matrices_t& Matrices,\n\tmesh::materials_t& Materials,\n\tmesh::doubles_t& Radii,\n\tmesh::doubles_t& ZMin,\n\tmesh::doubles_t& ZMax,\n\tmesh::doubles_t& SweepAngles,\n\tmesh::selection_t& Selections,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& SurfaceAttributes,\n\tmesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tradii(Radii),\n\tz_min(ZMin),\n\tz_max(ZMax),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"sphere\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::matrices_t >(\"matrices\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::materials_t >(\"materials\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"radii\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"z_min\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"z_max\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"sweep_angles\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::selection_t>(\"selections\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"surface\"],\n\t\tgeneric_primitive.attributes[\"parameter\"]\n\t\t);\n\n\tresult->selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"sphere\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tconst mesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tconst mesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tconst mesh::doubles_t& radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"radii\");\n\t\tconst mesh::doubles_t& z_min = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_min\");\n\t\tconst mesh::doubles_t& z_max = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_max\");\n\t\tconst mesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tconst mesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new const_primitive(matrices, materials, radii, z_min, z_max, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"sphere\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tmesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tmesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tmesh::doubles_t& radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"radii\");\n\t\tmesh::doubles_t& z_min = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_min\");\n\t\tmesh::doubles_t& z_max = require_array<mesh::doubles_t >(Primitive, surface_structure, \"z_max\");\n\t\tmesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tmesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new primitive(matrices, materials, radii, z_min, z_max, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"sphere\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace sphere\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/sphere.h",
    "content": "#ifndef K3DSDK_SPHERE_H\n#define K3DSDK_SPHERE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace sphere\n{\n\n/// Gathers the member arrays of a sphere primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::matrices_t& Matrices,\n\t\tconst mesh::materials_t& Materials,\n\t\tconst mesh::doubles_t& Radii,\n\t\tconst mesh::doubles_t& ZMin,\n\t\tconst mesh::doubles_t& ZMax,\n\t\tconst mesh::doubles_t& SweepAngles,\n\t\tconst mesh::selection_t& Selections,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& SurfaceAttributes,\n\t\tconst mesh::table_t& ParameterAttributes);\n\n\tconst mesh::matrices_t& matrices;\n\tconst mesh::materials_t& materials;\n\tconst mesh::doubles_t& radii;\n\tconst mesh::doubles_t& z_min;\n\tconst mesh::doubles_t& z_max;\n\tconst mesh::doubles_t& sweep_angles;\n\tconst mesh::selection_t& selections;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& surface_attributes;\n\tconst mesh::table_t& parameter_attributes;\n};\n\n/// Gathers the member arrays of a sphere primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::matrices_t& Matrices,\n\t\tmesh::materials_t& Materials,\n\t\tmesh::doubles_t& Radii,\n\t\tmesh::doubles_t& ZMin,\n\t\tmesh::doubles_t& ZMax,\n\t\tmesh::doubles_t& SweepAngles,\n\t\tmesh::selection_t& Selections,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& SurfaceAttributes,\n\t\tmesh::table_t& ParameterAttributes);\n\n\tmesh::matrices_t& matrices;\n\tmesh::materials_t& materials;\n\tmesh::doubles_t& radii;\n\tmesh::doubles_t& z_min;\n\tmesh::doubles_t& z_max;\n\tmesh::doubles_t& sweep_angles;\n\tmesh::selection_t& selections;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& surface_attributes;\n\tmesh::table_t& parameter_attributes;\n};\n\n/// Creates a new sphere mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid sphere primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid sphere primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid sphere primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace sphere\n\n} // namespace k3d\n\n#endif // !K3DSDK_SPHERE_H\n\n"
  },
  {
    "path": "k3dsdk/state_change_set.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Dan Erikson (derikson@montana.com)\n*/\n\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/istate_container.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/utility.h>\n\n#include <algorithm>\n#include <functional>\n#include <vector>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// state_change_set::implementation\n\nclass state_change_set::implementation\n{\npublic:\n\timplementation()\n\t{\n\t}\n\n\t~implementation()\n\t{\n\t\tstd::for_each(m_old_states.begin(), m_old_states.end(), delete_object());\n\t\tstd::for_each(m_new_states.begin(), m_new_states.end(), delete_object());\n\t}\n\n\ttypedef std::vector<istate_container*> state_collection_t;\n\tstate_collection_t m_old_states;\n\tstate_collection_t m_new_states;\n\n\tsigc::signal<void> m_undo_signal;\n\tsigc::signal<void> m_redo_signal;\n};\n\t\n/////////////////////////////////////////////////////////////////////////////\n// state_change_set\n\nstate_change_set::state_change_set() :\n\tm_implementation(new implementation())\n{\n}\n\nstate_change_set::~state_change_set()\n{\n\tdelete m_implementation;\n}\n\nvoid state_change_set::record_old_state(istate_container* const OldState)\n{\n\treturn_if_fail(OldState);\n\tm_implementation->m_old_states.push_back(OldState);\n}\n\nvoid state_change_set::record_new_state(istate_container* const NewState)\n{\n\treturn_if_fail(NewState);\n\tm_implementation->m_new_states.push_back(NewState);\n}\n\nsigc::connection state_change_set::connect_undo_signal(const sigc::slot<void>& Slot)\n{\n\treturn m_implementation->m_undo_signal.connect(Slot);\n}\n\nsigc::connection state_change_set::connect_redo_signal(const sigc::slot<void>& Slot)\n{\n\treturn m_implementation->m_redo_signal.connect(Slot);\n}\n\nvoid state_change_set::undo()\n{\n\tstd::for_each(m_implementation->m_old_states.rbegin(), m_implementation->m_old_states.rend(), std::mem_fun(&istate_container::restore_state));\n\tm_implementation->m_undo_signal.emit();\n}\n\nvoid state_change_set::redo()\n{\n\tstd::for_each(m_implementation->m_new_states.begin(), m_implementation->m_new_states.end(), std::mem_fun(&istate_container::restore_state));\n\tm_implementation->m_redo_signal.emit();\n}\n\nsize_t state_change_set::undo_count() const\n{\n\treturn m_implementation->m_old_states.size();\n}\n\nsize_t state_change_set::redo_count() const\n{\n\treturn m_implementation->m_new_states.size();\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// create_state_change_set\n\nstd::unique_ptr<state_change_set> create_state_change_set(const char* const Context)\n{\n\treturn std::unique_ptr<state_change_set>(new state_change_set());\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// start_state_change_set\n\nvoid start_state_change_set(idocument& Document, const char* const Context)\n{\n\tDocument.state_recorder().start_recording(create_state_change_set(Context), Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// cancel_state_change_set\n\nvoid cancel_state_change_set(idocument& Document, const char* const Context)\n{\n\t// Tell the document to stop recording ...\n\tconst std::unique_ptr<state_change_set> changeset(Document.state_recorder().stop_recording(Context));\n\n\t// Undo any changes up to this point, and let the leftover data get destroyed ...\n\treturn_if_fail(changeset.get());\n\tchangeset->undo();\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// finish_state_change_set\n\nvoid finish_state_change_set(idocument& Document, const std::string& Label, const char* const Context)\n{\n\tDocument.state_recorder().commit_change_set(Document.state_recorder().stop_recording(Context), Label, Context);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// record_state_change_set\n\nrecord_state_change_set::record_state_change_set(idocument& Document, const std::string& Label, const char* const Context) :\n\tm_document(Document),\n\tm_label(Label),\n\tm_context(Context)\n{\n\t// Sanity checks ...\n\tassert_warning(m_label.size());\n\n\tstart_state_change_set(m_document, m_context);\n}\n\nrecord_state_change_set::~record_state_change_set()\n{\n\tfinish_state_change_set(m_document, m_label, m_context);\n}\n\n} //namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/state_change_set.h",
    "content": "#ifndef K3DSDK_STATE_CHANGE_SET_H\n#define K3DSDK_STATE_CHANGE_SET_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/signal_system.h>\n\n#include <memory>\n#include <string>\n\nnamespace k3d\n{\n\nclass idocument;\nclass istate_container;\n\n/// Stores an atomic set of state changes that can be undone / redone\nclass state_change_set\n{\npublic:\n\tstate_change_set();\n\t~state_change_set();\n\n\t/// Records an original state that should be restored as part of an \"undo\" operation (assumes ownership of the given state container)\n\tvoid record_old_state(k3d::istate_container* const OldState);\n\t/// Records a new state that should be restored as part of a \"redo\" operation (assumes ownership of the given state container)\n\tvoid record_new_state(k3d::istate_container* const NewState);\n\n\t/// Connects a slot that will be called if this change set is undone\n\tsigc::connection connect_undo_signal(const sigc::slot<void>& Slot);\n\t/// Connects a slot that will be called if this change set is redone\n\tsigc::connection connect_redo_signal(const sigc::slot<void>& Slot);\n\n\t/// Restores original states and emits the undo_signal\n\tvoid undo();\n\t/// Restores new states and emits the redo signal\n\tvoid redo();\n\n\t/// Returns the number of stored undo state containers (mainly for debugging)\n\tsize_t undo_count() const;\n\t/// Returns the number of stored redo state containers (mainly for debugging)\n\tsize_t redo_count() const;\n\t\nprivate:\n\tstate_change_set(const state_change_set&);\n\tstate_change_set& operator=(const state_change_set&);\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n#define K3D_CHANGE_SET_CONTEXT_STRINGIZE2(x) #x\n#define K3D_CHANGE_SET_CONTEXT_STRINGIZE(x) K3D_CHANGE_SET_CONTEXT_STRINGIZE2(x)\n#define K3D_CHANGE_SET_CONTEXT __FILE__ \" (\" K3D_CHANGE_SET_CONTEXT_STRINGIZE(__LINE__) \")\"\n\n/// Factory function for creating standard state change set objects\nstd::unique_ptr<state_change_set> create_state_change_set(const char* const Context);\n/// Convenience function that starts recording a state change set for undo/redo purposes\nvoid start_state_change_set(idocument& Document, const char* const Context);\n/// Convenience function that cancels recording the current state change set\nvoid cancel_state_change_set(idocument& Document, const char* const Context);\n/// Convenience function that finishes recording a state change set for undo/redo purposes\nvoid finish_state_change_set(idocument& Document, const std::string& Label, const char* const Context);\n\n/** \\brief RAII helper class that provides  a return- and exception-safe way to record state changes for UNDO purposes\n\t\\note You should prefer to use this class whenever possible, instead of start_state_change_set() / finish_state_change_set()\n*/\nclass record_state_change_set\n{\npublic:\n\trecord_state_change_set(idocument& Document, const std::string& Label, const char* const Context);\n\t~record_state_change_set();\n\nprivate:\n\tidocument& m_document;\n\tconst std::string m_label;\n\tconst char* const m_context;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_STATE_CHANGE_SET_H\n\n"
  },
  {
    "path": "k3dsdk/stream_io_ri.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/stream_io_ri.h>\n#include <k3dsdk/texture3.h>\n#include <set>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nnamespace detail\n{\n\n/// A collection of RenderMan RIB parameter types\ntypedef std::set<std::string> predefined_types_t;\n\n/// Returns the set of standard predefined RIB parameter types\npredefined_types_t& predefined_types()\n{\n\tstatic predefined_types_t types;\n\tif(types.empty())\n\t{\n\t\ttypes.insert(\"P\");\n\t\ttypes.insert(\"Pz\");\n\t\ttypes.insert(\"Pw\");\n/*\n\t\ttypes.insert(\"N\");\n\t\ttypes.insert(\"Cs\");\n\t\ttypes.insert(\"Os\");\n\t\ttypes.insert(\"s\");\n\t\ttypes.insert(\"t\");\n\t\ttypes.insert(\"blur\");\n\t\ttypes.insert(\"sblur\");\n\t\ttypes.insert(\"tblur\");\n\t\ttypes.insert(\"width\");\n\t\ttypes.insert(\"swidth\");\n\t\ttypes.insert(\"twidth\");\n\t\ttypes.insert(\"filter\");\n\t\ttypes.insert(\"fill\");\n\t\ttypes.insert(\"fov\");\n\t\ttypes.insert(\"shader\");\n*/\n\t}\n\n\treturn types;\n}\n\ntemplate<typename T>\nbool print_parameter(const std::string& Type, std::ostream& Stream, const parameter& RHS)\n{\n\ttypedef const typed_array<T> array_t;\n\n\tif(array_t* const array = dynamic_cast<array_t*>(RHS.storage.get()))\n\t{\n\t\t// First, print the parameter name, with optional inline type info (only if inlining is enabled and the type isn't predefined) ...\n\t\tStream << \"\\\"\";\n\n\t\tif(inline_types(Stream))\n\t\t{\n\t\t\tif(!detail::predefined_types().count(RHS.name))\n\t\t\t{\n\t\t\t\tStream << RHS.storage_class << \" \" << Type << \" \";\n\t\t\t\tif(RHS.tuple_size > 1)\n\t\t\t\t\tStream << \"[\" << RHS.tuple_size << \"] \";\n\t\t\t}\n\t\t}\n\n\t\tStream << RHS.name << \"\\\" \";\n\n\t\t// Next, print the parameter values\n\t\tStream << format_array(array->begin(), array->end());\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n} // namespace detail\n\n///////////////////////////////////////////////////////////////////////////////////\n// storage_class_t\n\nstd::ostream& operator<<(std::ostream& Stream, const storage_class_t RHS)\n{\n\tswitch(RHS)\n\t{\n\t\tcase k3d::ri::CONSTANT:\n\t\t\tStream << \"constant\";\n\t\t\tbreak;\n\t\tcase k3d::ri::UNIFORM:\n\t\t\tStream << \"uniform\";\n\t\t\tbreak;\n\t\tcase k3d::ri::VARYING:\n\t\t\tStream << \"varying\";\n\t\t\tbreak;\n\t\tcase k3d::ri::VERTEX:\n\t\t\tStream << \"vertex\";\n\t\t\tbreak;\n\t\tcase k3d::ri::FACEVARYING:\n\t\t\tStream << \"facevarying\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tassert_not_reached();\n\t}\n\n\treturn Stream;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////\n// inline_types\n\nlong& inline_types_storage(std::ios& Stream)\n{\n\tstatic const int index = std::ios_base::xalloc();\n\treturn Stream.iword(index);\n}\n\nbool inline_types(std::ostream& Stream)\n{\n\treturn inline_types_storage(Stream) ? true : false;\n}\n\nbool set_inline_types(std::ostream& Stream, const bool Enabled)\n{\n\tbool old_state = inline_types_storage(Stream) ? true : false;\n\tinline_types_storage(Stream) = Enabled;\n\treturn old_state;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n// format_string\n\nformat_string::format_string(const string& Token) :\n\ttoken(Token)\n{\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const format_string& RHS)\n{\n\tStream << \"\\\"\" << RHS.token << \"\\\"\";\n\treturn Stream;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n// format_matrix\n\nformat_matrix::format_matrix(const matrix& Matrix) :\n\tm(Matrix)\n{\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const format_matrix& RHS)\n{\n\tStream << \"[\";\n\tfor(int i = 0; i != 4; ++i)\n\t{\n\t\tfor(int j = 0; j != 4; ++j)\n\t\t{\n\t\t\tStream << RHS.m[j][i] << \" \";\n\t\t}\n\t}\n\tStream << \"]\";\n\n\treturn Stream;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////\n// parameter\n\nstd::ostream& operator<<(std::ostream& Stream, const parameter& RHS)\n{\n\tif(detail::print_parameter<integer>(\"integer\", Stream, RHS))\n\t\treturn Stream;\n\tif(detail::print_parameter<real>(\"float\", Stream, RHS))\n\t\treturn Stream;\n\tif(detail::print_parameter<string>(\"string\", Stream, RHS))\n\t\treturn Stream;\n\tif(detail::print_parameter<point>(\"point\", Stream, RHS))\n\t\treturn Stream;\n\tif(detail::print_parameter<vector>(\"vector\", Stream, RHS))\n\t\treturn Stream;\n\tif(detail::print_parameter<normal>(\"normal\", Stream, RHS))\n\t\treturn Stream;\n\tif(detail::print_parameter<texture3>(\"float[3]\", Stream, RHS))\n\t\treturn Stream;\n\tif(detail::print_parameter<color>(\"color\", Stream, RHS))\n\t\treturn Stream;\n\tif(detail::print_parameter<hpoint>(\"hpoint\", Stream, RHS))\n\t\treturn Stream;\n\tif(detail::print_parameter<matrix>(\"matrix\", Stream, RHS))\n\t\treturn Stream;\n\n\tlog() << error << k3d_file_reference << \" Parameter [\" << RHS.name << \"] unknown type\" << std::endl;\n\n\treturn Stream;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////\n// parameter_list\n\nstd::ostream& operator<<(std::ostream& Stream, const parameter_list& RHS)\n{\n\tstd::copy(RHS.begin(), RHS.end(), std::ostream_iterator<parameter>(Stream, \" \"));\n\treturn Stream;\n}\n\n} // namespace ri\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/stream_io_ri.h",
    "content": "#ifndef K3DSDK_STREAM_IO_RI_H\n#define K3DSDK_STREAM_IO_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types_ri.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\n/// Serializes storage_class_t to a stream\nstd::ostream& operator<<(std::ostream& Stream, const storage_class_t RHS);\n\n/// iostream-compatible manipulator that returns true iff inline types are enabled for an output stream\nbool inline_types(std::ostream& Stream);\n/// iostream-compatible manipulator that controls whether inline types are enabled for an output stream\nbool set_inline_types(std::ostream& Stream, const bool Enabled);\n\n/// Formats a string with real-quotes for inclusion in a RIB file; designed to be used as an inline formatting object\nclass format_string\n{\npublic:\n\texplicit format_string(const string& Token);\n\tfriend std::ostream& operator<<(std::ostream& Stream, const format_string& RHS);\n\nprivate:\n\tconst string& token;\n};\n\n/// Formats a matrix for inclusion in a RIB file; designed to be used as an inline formatting object\nclass format_matrix\n{\npublic:\n\texplicit format_matrix(const matrix& Matrix);\n\tfriend std::ostream& operator<<(std::ostream& Stream, const format_matrix& RHS);\n\nprivate:\n\tconst matrix& m;\n};\n\n/// Formats an array of values within square brackets for inclusion in a RIB file; designed to be used as an inline formatting object\ntemplate<typename iterator_t, typename value_t>\nclass format_array_t\n{\npublic:\n\tformat_array_t(const iterator_t Begin, const iterator_t End) :\n\t\tbegin(Begin),\n\t\tend(End)\n\t{\n\t}\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const format_array_t& RHS)\n\t{\n\t\tStream << \"[ \";\n\t\tstd::copy(RHS.begin, RHS.end, std::ostream_iterator<value_t>(Stream, \" \"));\n\t\tStream << \"]\";\n\n\t\treturn Stream;\n\t}\n\nprivate:\n\tconst iterator_t begin;\n\tconst iterator_t end;\n};\n\n/// Partial specialization of format_array_t for use with string values\ntemplate<typename iterator_t>\nclass format_array_t<iterator_t, k3d::ri::string>\n{\npublic:\n\tformat_array_t(const iterator_t Begin, const iterator_t End) :\n\t\tbegin(Begin),\n\t\tend(End)\n\t{\n\t}\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const format_array_t& RHS)\n\t{\n\t\tStream << \"[ \";\n\t\tfor(iterator_t element = RHS.begin; element != RHS.end; ++element)\n\t\t\tStream << format_string(*element) << \" \";\n\t\tStream << \"]\";\n\n\t\treturn Stream;\n\t}\n\nprivate:\n\tconst iterator_t begin;\n\tconst iterator_t end;\n};\n\n/// Convenience factory function for creating format_array_t objects\ntemplate<typename iterator_t>\nformat_array_t<iterator_t, typename std::iterator_traits<iterator_t>::value_type> format_array(const iterator_t Begin, const iterator_t End)\n{\n\treturn format_array_t<iterator_t, typename std::iterator_traits<iterator_t>::value_type>(Begin, End);\n}\n\n/// Serializes a parameter to a stream\nstd::ostream& operator<<(std::ostream& Stream, const parameter& RHS);\n/// Serializes a parameter list to a stream\nstd::ostream& operator<<(std::ostream& Stream, const parameter_list& RHS);\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_STREAM_IO_RI_H\n\n"
  },
  {
    "path": "k3dsdk/stream_ri.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/stream_ri.h>\n#include <k3dsdk/stream_io_ri.h>\n#include <k3dsdk/types_ri.h>\n#include <k3dsdk/vectors.h>\n\n#include <boost/array.hpp>\n\n#include <iostream>\n#include <numeric>\n#include <set>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\nnamespace detail\n{\n\nlong& indentation_storage(std::ios& Stream)\n{\n\tstatic const int index = std::ios::xalloc();\n\treturn Stream.iword(index);\n}\n\nstd::ostream& reset_indentation(std::ostream& Stream)\n{\n\tindentation_storage(Stream) = 0;\n\treturn Stream;\n}\n\nstd::ostream& push_indent(std::ostream& Stream)\n{\n\tindentation_storage(Stream)++;\n\treturn Stream;\n}\n\nstd::ostream& pop_indent(std::ostream& Stream)\n{\n\tlong& indent = indentation_storage(Stream);\n\tindent -= (indent > 0);\n\treturn Stream;\n}\n\nstd::ostream& indentation(std::ostream& Stream)\n{\n\tconst long& indent = indentation_storage(Stream);\n\tfor(long i = 0; i < indent; i++)\n\t\tStream << \"   \";\n\n\treturn Stream;\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// stream::implementation\n\nclass stream::implementation\n{\npublic:\n\timplementation(std::ostream& Stream) :\n\t\tm_stream(Stream),\n\t\tm_light_handle(0),\n\t\tm_object_handle(0),\n\t\tm_frame_block(false),\n\t\tm_world_block(false),\n\t\tm_object_block(false),\n\t\tm_motion_block(false)\n\t{\n\t}\n\n\t/// Stores the RIB output stream\n\tstd::ostream& m_stream;\n\t/// Stores the current light handle\n\tlight_handle m_light_handle;\n\t/// Stores the current object handle\n\tobject_handle m_object_handle;\n\t/// Set to true within a frame block\n\tbool m_frame_block;\n\t/// Set to true within a world block\n\tbool m_world_block;\n\t/// Set to true within an object block\n\tbool m_object_block;\n\t/// Set to true within a motion block\n\tbool m_motion_block;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// stream\n\nstream::stream(std::ostream& Stream) :\n\tm_implementation(new implementation(Stream))\n{\n\t// Enable inline type declarations by default ...\n\tk3d::ri::set_inline_types(m_implementation->m_stream, true);\n\n\t// Start out without any indentation ...\n\tdetail::reset_indentation(m_implementation->m_stream);\n\n\t// Start writing the RIB file header ...\n\tRiStructure(\"RenderMan RIB-Structure 1.0\");\n\tm_implementation->m_stream << \"version 3.03\" << \"\\n\";\n}\n\nstream::~stream()\n{\n\tdelete m_implementation;\n}\n\nbool stream::set_inline_types(const bool Inline)\n{\n\treturn k3d::ri::set_inline_types(m_implementation->m_stream, Inline);\n}\n\nvoid stream::RiDeclare(const string& Name, const string& Type)\n{\n\t// Sanity checks ...\n\treturn_if_fail(Name.size());\n\treturn_if_fail(Type.size());\n\n\tm_implementation->m_stream << detail::indentation << \"Declare \" << format_string(Name) << \" \" << format_string(Type) << \"\\n\";\n}\n\nvoid stream::RiFrameBegin(const unsigned_integer FrameNumber)\n{\n\t// Sanity checks ...\n\tif(m_implementation->m_frame_block)\n\t{\n\t\tlog() << error << \"Cannot nest calls to RiFrameBegin()\" << std::endl;\n\t\treturn;\n\t}\n\n\tm_implementation->m_frame_block = true;\n\tm_implementation->m_stream << detail::indentation << detail::indentation << \"FrameBegin \" << FrameNumber << \"\\n\";\n\tdetail::push_indent(m_implementation->m_stream);\n}\n\nvoid stream::RiFrameEnd()\n{\n\tdetail::pop_indent(m_implementation->m_stream);\n\tm_implementation->m_stream << detail::indentation << \"FrameEnd\" << \"\\n\";\n\tm_implementation->m_frame_block = false;\n}\n\nvoid stream::RiWorldBegin()\n{\n\t// Sanity checks ...\n\tif(m_implementation->m_world_block)\n\t{\n\t\tlog() << error << \"Cannot nest calls to RiWorldBegin()\" << std::endl;\n\t\treturn;\n\t}\n\n\tm_implementation->m_world_block = true;\n\tm_implementation->m_stream << detail::indentation << \"WorldBegin\" << \"\\n\";\n\tdetail::push_indent(m_implementation->m_stream);\n}\n\nvoid stream::RiWorldEnd()\n{\n\tdetail::pop_indent(m_implementation->m_stream);\n\tm_implementation->m_stream << detail::indentation << \"WorldEnd\" << \"\\n\";\n\tm_implementation->m_world_block = false;\n}\n\nvoid stream::RiFormat(const unsigned_integer XResolution, const unsigned_integer YResolution, const real AspectRatio)\n{\n\tm_implementation->m_stream << detail::indentation << \"Format \" << XResolution << \" \" << YResolution << \" \" << AspectRatio << \"\\n\";\n}\n\nvoid stream::RiFrameAspectRatio(real AspectRatio)\n{\n\tm_implementation->m_stream << detail::indentation << \"FrameAspectRatio \" << AspectRatio << \"\\n\";\n}\n\nvoid stream::RiScreenWindow(real Left, real Right, real Bottom, real Top)\n{\n\tm_implementation->m_stream << detail::indentation << \"ScreenWindow \" << Left << \" \" << Right << \" \" << Bottom << \" \" << Top << \"\\n\";\n}\n\nvoid stream::RiCropWindow(real XMin, real XMax, real YMin, real YMax)\n{\n\tm_implementation->m_stream << detail::indentation << \"CropWindow \" << XMin << \" \" << XMax << \" \" << YMin << \" \" << YMax << \"\\n\";\n}\n\nvoid stream::RiProjectionV(const string& Name, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Projection \" << format_string(Name) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiClipping(real NearPlane, real FarPlane)\n{\n\tm_implementation->m_stream << detail::indentation << \"Clipping \" << NearPlane << \" \" << FarPlane << \"\\n\";\n}\n\nvoid stream::RiDepthOfField(real FStop, real FocalLength, real FocalDistance)\n{\n\tm_implementation->m_stream << detail::indentation << \"DepthOfField \" << FStop << \" \" << FocalLength << \" \" << FocalDistance << \"\\n\";\n}\n\nvoid stream::RiShutter(real OpenTime, real CloseTime)\n{\n\tm_implementation->m_stream << detail::indentation << \"Shutter \" << OpenTime << \" \" << CloseTime << \"\\n\";\n}\n\nvoid stream::RiPixelFilter(const string& FilterName, real XWidth, real YWidth)\n{\n\tm_implementation->m_stream << detail::indentation << \"PixelFilter \" << format_string(FilterName) << \" \" << XWidth << \" \" << YWidth << \"\\n\";\n}\n\nvoid stream::RiPixelVariance(real Variation)\n{\n\tm_implementation->m_stream << detail::indentation << \"PixelVariance \" << Variation << \"\\n\";\n}\nvoid stream::RiPixelSamples(real XSamples, real YSamples)\n{\n\tm_implementation->m_stream << detail::indentation << \"PixelSamples \" << XSamples << \" \" << YSamples << \"\\n\";\n}\n\nvoid stream::RiExposure(real Gain, real Gamma)\n{\n\tm_implementation->m_stream << detail::indentation << \"Exposure \" << Gain << \" \" << Gamma << \"\\n\";\n}\n\nvoid stream::RiImagerV(const path& Path, const string& Name, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Imager \" << format_string(Name) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiQuantize(const string& Type, integer One, integer QMin, integer QMax, real Amplitude)\n{\n\tm_implementation->m_stream << detail::indentation << \"Quantize \" << format_string(Type) << \" \" << One << \" \" << QMin << \" \" << QMax << \" \" << Amplitude << \"\\n\";\n}\n\nvoid stream::RiDisplayV(const string& Name, const string& Type, const string& Mode, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Display \" << format_string(Name) << \" \" << format_string(Type) << \" \" << format_string(Mode) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiHiderV(const string& Type, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Hider \" << format_string(Type) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiColorSamples(const unsigned_integer ParameterCount, const reals& nRGB, const reals& RGBn)\n{\n\treturn_if_fail(ParameterCount == nRGB.size());\n\treturn_if_fail(ParameterCount == RGBn.size());\n\n\tm_implementation->m_stream << detail::indentation << \"ColorSamples \" << format_array(nRGB.begin(), nRGB.end()) << \" \" << format_array(RGBn.begin(), RGBn.end()) << \"\\n\";\n}\n\nvoid stream::RiRelativeDetail(real RelativeDetail)\n{\n\tm_implementation->m_stream << detail::indentation << \"RelativeDetail \" << RelativeDetail << \"\\n\";\n}\n\nvoid stream::RiOptionV(const string& Name, const parameter_list& Parameters)\n{\n\tconst bool old_state = k3d::ri::set_inline_types(m_implementation->m_stream, false);\n\n\tm_implementation->m_stream << detail::indentation << \"Option \" << format_string(Name) << \" \" << Parameters << \"\\n\";\n\n\tk3d::ri::set_inline_types(m_implementation->m_stream, old_state);\n}\n\nvoid stream::RiAttributeBegin()\n{\n\tm_implementation->m_stream << detail::indentation << \"AttributeBegin\" << \"\\n\";\n\tdetail::push_indent(m_implementation->m_stream);\n}\n\nvoid stream::RiAttributeEnd()\n{\n\tdetail::pop_indent(m_implementation->m_stream);\n\tm_implementation->m_stream << detail::indentation << \"AttributeEnd\" << \"\\n\";\n}\n\nvoid stream::RiColor(const color& Color)\n{\n\tm_implementation->m_stream << detail::indentation << \"Color \" << Color << \"\\n\";\n}\n\nvoid stream::RiOpacity(const color& Opacity)\n{\n\tm_implementation->m_stream << detail::indentation << \"Opacity \" << Opacity << \"\\n\";\n}\n\nvoid stream::RiTextureCoordinates(real S1, real T1, real S2, real T2, real S3, real T3, real S4, real T4)\n{\n\tm_implementation->m_stream << detail::indentation << \"TextureCoordinates \" << S1 << \" \" << T1 << \" \" << S2 << \" \" << T2 << \" \" << S3 << \" \" << T3 << \" \" << S4 << \" \" << T4 << \"\\n\";\n}\n\nconst light_handle stream::RiLightSourceV(const path& Path, const string& Name, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"LightSource \" << format_string(Name) << \" \" << ++m_implementation->m_light_handle << \" \" << Parameters << \"\\n\";\n\treturn m_implementation->m_light_handle;\n}\n\nconst light_handle stream::RiAreaLightSourceV(const path& Path, const string& Name, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"AreaLightSource \" << format_string(Name) << \" \" << ++m_implementation->m_light_handle << \" \" << Parameters << \"\\n\";\n\treturn m_implementation->m_light_handle;\n}\n\nvoid stream::RiIlluminate(const light_handle LightHandle, bool OnOff)\n{\n\tm_implementation->m_stream << detail::indentation << \"Illuminate \" << LightHandle << \" \" << OnOff << \"\\n\";\n}\n\nvoid stream::RiSurfaceV(const path& Path, const string& Name, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Surface \" << format_string(Name) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiAtmosphereV(const path& Path, const string& Name, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Atmosphere \" << format_string(Name) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiInteriorV(const path& Path, const string& Name, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Interior \" << format_string(Name) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiExteriorV(const path& Path, const string& Name, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Exterior \" << format_string(Name) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiShadingRate(real Size)\n{\n\tm_implementation->m_stream << detail::indentation << \"ShadingRate \" << Size << \"\\n\";\n}\n\nvoid stream::RiShadingInterpolation(const string& Type)\n{\n\tm_implementation->m_stream << detail::indentation << \"ShadingInterpolation \" << format_string(Type) << \"\\n\";\n}\n\nvoid stream::RiMatte(bool OnOff)\n{\n\tm_implementation->m_stream << detail::indentation << \"Matte \" << OnOff << \"\\n\";\n}\n\nvoid stream::RiBound(const boost::array<real, 6>& Bound)\n{\n\tm_implementation->m_stream << detail::indentation << \"Bound \" << format_array(Bound.begin(), Bound.end()) << \"\\n\";\n}\n\nvoid stream::RiDetail(const boost::array<real, 6>& Bound)\n{\n\tm_implementation->m_stream << detail::indentation << \"Detail \" << format_array(Bound.begin(), Bound.end()) << \"\\n\";\n}\n\nvoid stream::RiDetailRange(const real MinVis, const real LowTran, const real UpTran, const real MaxVis)\n{\n\tm_implementation->m_stream << detail::indentation << \"DetailRange \" << MinVis << \" \" << LowTran << \" \" << UpTran << \" \" << MaxVis << \"\\n\";\n}\n\nvoid stream::RiGeometricApproximation(const string& Type, real Value)\n{\n\tm_implementation->m_stream << detail::indentation << \"GeometricApproximation \" << format_string(Type) << \" \" << Value << \"\\n\";\n}\n\nvoid stream::RiGeometricRepresentation(const string& Type)\n{\n\tm_implementation->m_stream << detail::indentation << \"GeometricRepresentation \" << format_string(Type) << \"\\n\";\n}\n\nvoid stream::RiOrientation(const string& Orientation)\n{\n\tm_implementation->m_stream << detail::indentation << \"Orientation \" << format_string(Orientation) << \"\\n\";\n}\n\nvoid stream::RiReverseOrientation()\n{\n\tm_implementation->m_stream << detail::indentation << \"ReverseOrientation\" << \"\\n\";\n}\n\nvoid stream::RiSides(const unsigned_integer Sides)\n{\n\tm_implementation->m_stream << detail::indentation << \"Sides \" << Sides << \"\\n\";\n}\n\nvoid stream::RiIdentity()\n{\n\tm_implementation->m_stream << detail::indentation << \"Identity\" << \"\\n\";\n}\n\nvoid stream::RiTransform(const matrix& Transform)\n{\n\tm_implementation->m_stream << detail::indentation << \"Transform \" << format_matrix(Transform) << \"\\n\";\n}\n\nvoid stream::RiConcatTransform(const matrix& Transform)\n{\n\tm_implementation->m_stream << detail::indentation << \"ConcatTransform \" << format_matrix(Transform) << \"\\n\";\n}\n\nvoid stream::RiPerspective(real FieldOfView)\n{\n\tm_implementation->m_stream << detail::indentation << \"Perspective \" << FieldOfView << \"\\n\";\n}\n\nvoid stream::RiTranslate(real DX, real DY, real DZ)\n{\n\tm_implementation->m_stream << detail::indentation << \"Translate \" << DX << \" \" << DY << \" \" << DZ << \"\\n\";\n}\n\nvoid stream::RiRotate(real Angle, real DX, real DY, real DZ)\n{\n\tm_implementation->m_stream << detail::indentation << \"Rotate \" << Angle << \" \" << DX << \" \" << DY << \" \" << DZ << \"\\n\";\n}\n\nvoid stream::RiScale(real DX, real DY, real DZ)\n{\n\tm_implementation->m_stream << detail::indentation << \"Scale \" << DX << \" \" << DY << \" \" << DZ << \"\\n\";\n}\n\nvoid stream::RiSkew(real Angle, real DX1, real DY1, real DZ1, real DX2, real DY2, real DZ2)\n{\n\tm_implementation->m_stream << detail::indentation << \"Skew \" << Angle << \" \" << DX1 << \" \" << DY1 << \" \" << DZ1 << \" \" << DX2 << \" \" << DY2 << \" \" << DZ2 << \"\\n\";\n}\n\nvoid stream::RiDeformationV(const path& Path, const string& Name, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Deformation \" << format_string(Name) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiDisplacementV(const path& Path, const string& Name, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Displacement \" << format_string(Name) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiCoordinateSystem(const string& Space)\n{\n\tm_implementation->m_stream << detail::indentation << \"CoordinateSystem \" << format_string(Space) << \"\\n\";\n}\n\nvoid stream::RiCoordSysTransform(const string& Space)\n{\n\tm_implementation->m_stream << detail::indentation << \"CoordSysTransform \" << format_string(Space) << \"\\n\";\n}\n\nvoid stream::RiTransformBegin()\n{\n\tm_implementation->m_stream << detail::indentation << \"TransformBegin\" << \"\\n\";\n\tdetail::push_indent(m_implementation->m_stream);\n}\n\nvoid stream::RiTransformEnd()\n{\n\tdetail::pop_indent(m_implementation->m_stream);\n\tm_implementation->m_stream << detail::indentation << \"TransformEnd\" << \"\\n\";\n}\n\nvoid stream::RiAttributeV(const string& Name, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Attribute \" << format_string(Name) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiPointsV(const unsigned_integer VertexCount, const parameter_list& Parameters)\n{\n\t// Sanity checks ...\n\treturn_if_fail(VertexCount);\n\n\tm_implementation->m_stream << detail::indentation << \"Points \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiPolygonV(const unsigned_integer VertexCount, const parameter_list& Parameters)\n{\n\t// Sanity checks ...\n\treturn_if_fail(VertexCount);\n\n\tm_implementation->m_stream << detail::indentation << \"Polygon \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiGeneralPolygonV(const unsigned_integers& VertexCounts, const parameter_list& Parameters)\n{\n\t// Do some simple sanity checks ...\n\treturn_if_fail(VertexCounts.size());\n\n\tm_implementation->m_stream << detail::indentation << \"GeneralPolygon \" << format_array(VertexCounts.begin(), VertexCounts.end()) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiPointsPolygonsV(const unsigned_integers& VertexCounts, const unsigned_integers& VertexIDs, const parameter_list& Parameters)\n{\n\t// Sanity checks ...\n\treturn_if_fail(VertexCounts.size());\n\treturn_if_fail(VertexIDs.size() == std::accumulate(VertexCounts.begin(), VertexCounts.end(), 0UL));\n\n\tm_implementation->m_stream << detail::indentation << \"PointsPolygons \" << format_array(VertexCounts.begin(), VertexCounts.end()) << \" \" << format_array(VertexIDs.begin(), VertexIDs.end()) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiPointsGeneralPolygonsV(const unsigned_integers& LoopCounts, const unsigned_integers& VertexCounts, const unsigned_integers& VertexIDs, const parameter_list& Parameters)\n{\n\t// Sanity checks ...\n\treturn_if_fail(LoopCounts.size());\n\treturn_if_fail(VertexCounts.size() == std::accumulate(LoopCounts.begin(), LoopCounts.end(), 0UL));\n\treturn_if_fail(VertexIDs.size() == std::accumulate(VertexCounts.begin(), VertexCounts.end(), 0UL));\n\n\tm_implementation->m_stream << detail::indentation << \"PointsGeneralPolygons \" << format_array(LoopCounts.begin(), LoopCounts.end()) << \" \" << format_array(VertexCounts.begin(), VertexCounts.end()) << \" \" << format_array(VertexIDs.begin(), VertexIDs.end()) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiBasis(const matrix& UBasis, const unsigned_integer UStep, const matrix& VBasis, const unsigned_integer VStep)\n{\n\tm_implementation->m_stream << detail::indentation << \"Basis \" << format_matrix(UBasis) << \" \" << UStep << \" \" << format_matrix(VBasis) << \" \" << VStep << \"\\n\";\n}\n\nvoid stream::RiBasis(const string& UBasis, const unsigned_integer UStep, const string& VBasis, const unsigned_integer VStep)\n{\n\tm_implementation->m_stream << detail::indentation << \"Basis \" << format_string(UBasis) << \" \" << UStep << \" \" << format_string(VBasis) << \" \" << VStep << \"\\n\";\n}\n\nvoid stream::RiPatchV(const string& Type, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Patch \" << format_string(Type) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiPatchMeshV(const string& Type, const unsigned_integer UCount, const string& UWrap, const unsigned_integer VCount, const string& VWrap, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"PatchMesh \" << format_string(Type) << \" \" << UCount << \" \" << format_string(UWrap) << \" \" << VCount << \" \" << format_string(VWrap) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiNuPatchV(const unsigned_integer UCount, const unsigned_integer UOrder, const reals& UKnot, const real UMin, const real UMax, const unsigned_integer VCount, const unsigned_integer VOrder, const reals& VKnot, const real VMin, const real VMax, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"NuPatch \" << UCount << \" \" << UOrder << \" \" << format_array(UKnot.begin(), UKnot.end()) << \" \" << UMin << \" \" << UMax << \" \" << VCount << \" \" << VOrder << \" \" << format_array(VKnot.begin(), VKnot.end()) << \" \" << VMin << \" \" << VMax << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiTrimCurve(const unsigned_integers& CurveCounts, const unsigned_integers& Orders, const reals& Knots, const reals& Minimums, const reals& Maximums, const unsigned_integers& PointCounts, const reals& U, const reals& V, const reals& W)\n{\n\tm_implementation->m_stream << detail::indentation << \"TrimCurve \" << \" \" << format_array(CurveCounts.begin(), CurveCounts.end()) << \" \" << format_array(Orders.begin(), Orders.end()) << \" \" << format_array(Knots.begin(), Knots.end()) << \" \" << format_array(Minimums.begin(), Minimums.end()) << \" \" << format_array(Maximums.begin(), Maximums.end()) << \" \" << format_array(PointCounts.begin(), PointCounts.end()) << \" \" << format_array(U.begin(), U.end()) << \" \" << format_array(V.begin(), V.end()) << \" \" << format_array(W.begin(), W.end()) << \"\\n\";\n}\n\nvoid stream::RiSphereV(real Radius, real ZMin, real ZMax, real ThetaMax, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Sphere \" << Radius << \" \" << ZMin << \" \" << ZMax << \" \" << ThetaMax << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiConeV(real Height, real Radius, real ThetaMax, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Cone \" << Height << \" \" << Radius << \" \" << ThetaMax << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiCylinderV(real Radius, real ZMin, real ZMax, real ThetaMax, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Cylinder \" << Radius << \" \" << ZMin << \" \" << ZMax << \" \" << ThetaMax << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiHyperboloidV(const point& Point1, const point& Point2, real ThetaMax, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Hyperboloid \" << Point1 << \" \" << Point2 << \" \" << ThetaMax << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiParaboloidV(real RMax, real ZMin, real ZMax, real ThetaMax, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Paraboloid \" << RMax << \" \" << ZMin << \" \" << ZMax << \" \" << ThetaMax << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiDiskV(real Height, real Radius, real ThetaMax, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Disk \" << Height << \" \" << Radius << \" \" << ThetaMax << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiTorusV(real MajorRadius, real MinorRadius, real PhiMin, real PhiMax, real ThetaMax, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Torus \" << MajorRadius << \" \" << MinorRadius << \" \" << PhiMin << \" \" << PhiMax << \" \" << ThetaMax << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiCurvesV(const string& Type, const unsigned_integers& VertexCounts, const string& Wrap, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Curves \" << format_string(Type) << \" \" << format_array(VertexCounts.begin(), VertexCounts.end()) << \" \" << format_string(Wrap) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiGeometryV(const string& Type, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Geometry \" << format_string(Type) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiSolidBegin(const string& Type)\n{\n\tm_implementation->m_stream << detail::indentation << \"SolidBegin \" << format_string(Type) << \"\\n\";\n\tdetail::push_indent(m_implementation->m_stream);\n}\n\nvoid stream::RiSolidEnd()\n{\n\tdetail::pop_indent(m_implementation->m_stream);\n\tm_implementation->m_stream << detail::indentation << \"SolidEnd\" << \"\\n\";\n}\n\nconst object_handle stream::RiObjectBegin()\n{\n\t// Sanity checks ...\n\tif(m_implementation->m_object_block)\n\t{\n\t\tlog() << error << \"Cannot nest calls to RiObjectBegin()\" << std::endl;\n\t\treturn 0;\n\t}\n\n\tm_implementation->m_object_block = true;\n\tm_implementation->m_stream << detail::indentation << \"ObjectBegin \" << ++m_implementation->m_object_handle << \"\\n\";\n\tdetail::push_indent(m_implementation->m_stream);\n\treturn m_implementation->m_object_handle;\n}\n\nvoid stream::RiObjectEnd()\n{\n\tdetail::pop_indent(m_implementation->m_stream);\n\tm_implementation->m_stream << detail::indentation << \"ObjectEnd\" << \"\\n\";\n\tm_implementation->m_object_block = false;\n}\n\nvoid stream::RiObjectInstance(const object_handle Handle)\n{\n\tm_implementation->m_stream << detail::indentation << \"ObjectInstance \" << Handle << \"\\n\";\n}\n\nvoid stream::RiMotionBeginV(const sample_times_t& Times)\n{\n\t// Sanity checks ...\n\tif(m_implementation->m_motion_block)\n\t{\n\t\tlog() << error << \"Cannot nest calls to RiMotionBegin()\" << std::endl;\n\t\treturn;\n\t}\n\n\tm_implementation->m_motion_block = true;\n\tm_implementation->m_stream << detail::indentation << \"MotionBegin \" << format_array(Times.begin(), Times.end()) << \"\\n\";\n\tdetail::push_indent(m_implementation->m_stream);\n}\n\nvoid stream::RiMotionEnd()\n{\n\tdetail::pop_indent(m_implementation->m_stream);\n\tm_implementation->m_stream << detail::indentation << \"MotionEnd\" << \"\\n\";\n\tm_implementation->m_motion_block = false;\n}\n\nvoid stream::RiErrorHandler(const string& Style)\n{\n\tm_implementation->m_stream << detail::indentation << \"ErrorHandler \" << format_string(Style) << \"\\n\";\n}\n\nvoid stream::RiComment(const string& Comment)\n{\n\tm_implementation->m_stream << detail::indentation << \"#\" << Comment << \"\\n\";\n}\n\nvoid stream::RiNewline()\n{\n\tm_implementation->m_stream << \"\\n\";\n}\n\nvoid stream::RiReadArchive(const path& Archive)\n{\n\tm_implementation->m_stream << detail::indentation << \"ReadArchive \" << format_string(Archive.native_filesystem_string()) << \"\\n\";\n}\n\nvoid stream::RiProcDelayedReadArchive(const path& Archive, const bound& Bound)\n{\n\tm_implementation->m_stream << detail::indentation << \"Procedural \" << format_string(\"DelayedReadArchive\") << \" [ \" <<  format_string(Archive.native_filesystem_string()) << \" ] [ \" << Bound.nx << \" \" << Bound.px << \" \" << Bound.ny << \" \" << Bound.py << \" \" << Bound.nz << \" \" << Bound.pz << \" ]\\n\";\n}\n\nvoid stream::RiStructure(const string& Structure)\n{\n\tm_implementation->m_stream << \"##\" << Structure << \"\\n\";\n}\n\nvoid stream::RiSubdivisionMeshV(const string& Scheme, const unsigned_integers& VertexCounts, const unsigned_integers& VertexIDs, const strings& Tags, const unsigned_integers& ArgCounts, const integers& IntegerArgs, const reals& FloatArgs, const parameter_list& Parameters)\n{\n\t// Sanity checks ...\n\treturn_if_fail(VertexIDs.size() == std::accumulate(VertexCounts.begin(), VertexCounts.end(), 0UL));\n\n\tm_implementation->m_stream << detail::indentation << \"SubdivisionMesh \" << format_string(Scheme) << \" \" << format_array(VertexCounts.begin(), VertexCounts.end()) << \" \" << format_array(VertexIDs.begin(), VertexIDs.end()) << \" \" << format_array(Tags.begin(), Tags.end()) << \" \" << format_array(ArgCounts.begin(), ArgCounts.end()) << \" \" << format_array(IntegerArgs.begin(), IntegerArgs.end()) << \" \" << format_array(FloatArgs.begin(), FloatArgs.end()) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiMakeCubeFaceEnvironmentV(const string& px, const string& nx, const string& py, const string& ny, const string& pz, const string& nz, const string& texturename, const real fov, const string& swrap, const string& twrap, const string& filterfunc, const real swidth, const real twidth, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"MakeCubeFaceEnvironment \" << format_string(px) << \" \" << format_string(nx) << \" \" << format_string(py) << \" \" << format_string(ny) << \" \" << format_string(pz) << \" \" << format_string(nz) << \" \" << format_string(texturename) << \" \";\n\tm_implementation->m_stream << fov << \" \" << format_string(swrap) << \" \" << format_string(twrap) << \" \" << format_string(filterfunc) << \" \" << swidth << \" \" << twidth << \" \" << Parameters;\n}\n\nvoid stream::RiMakeLatLongEnvironmentV(const string& picturename, const string& texturename, const string& filterfunc, const real swidth, const real twidth, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"MakeLatLongEnvironment \" << format_string(picturename) << \" \" << format_string(texturename) << \" \" << format_string(filterfunc) << \" \" << swidth << \" \" << twidth << \" \" << Parameters;\n}\n\nvoid stream::RiMakeShadowV(const string& picturename, const string& texturename, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"MakeShadow \" << format_string(picturename) << \" \" << format_string(texturename) << \" \" << Parameters;\n}\n\nvoid stream::RiMakeTextureV(const string& picturename, const string& texturename, const string& swrap, const string& twrap, const string& filterfunc, const real swidth, const real twidth, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"MakeTexture \" << format_string(picturename) << \" \" << format_string(texturename) << \" \" << format_string(swrap) << \" \" << format_string(twrap) << \" \" << format_string(filterfunc) << \" \" << swidth << \" \" << twidth << \" \" << Parameters;\n}\n\nvoid stream::RiBlobbyV(const unsigned_integer NLeaf, const unsigned_integers& Codes, const reals& Floats, const strings& Strings, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"Blobby \" << NLeaf << \" \" << format_array(Codes.begin(), Codes.end()) << \" \" << format_array(Floats.begin(), Floats.end()) << \" \" << format_array(Strings.begin(), Strings.end()) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiShaderLayerV(const std::string& type, const path& Path, const std::string& name, const std::string& layername, const parameter_list& Parameters)\n{\n\tm_implementation->m_stream << detail::indentation << \"ShaderLayer \" << format_string(type) << \" \" << format_string(name) << \" \" << format_string(layername) << \" \" << Parameters << \"\\n\";\n}\n\nvoid stream::RiConnectShaderLayers(const std::string& type, const std::string& layer1, const std::string& variable1, const std::string& layer2, const std::string& variable2)\n{\n\tm_implementation->m_stream << detail::indentation << \"ConnectShaderLayers \" << format_string(type) << \" \" << format_string(layer1) << \" \" << format_string(variable1) << \" \" << format_string(layer2) << \" \" << format_string(variable2) << \"\\n\";\n}\n\n} // namespace ri\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/stream_ri.h",
    "content": "#ifndef K3DSDK_STREAM_RI_H\n#define K3DSDK_STREAM_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/istream_ri.h>\n#include <set>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// stream\n\n/// Provides a boilerplate implementation of k3d::ri::istream that writes RIB to a stream\nclass stream :\n\tpublic istream\n{\npublic:\n\tstream(std::ostream& Stream);\n\t~stream();\n\n\tbool set_inline_types(const bool Inline);\n\tvoid use_shader(const path& Path);\n\n\tconst light_handle RiAreaLightSourceV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list());\n\tvoid RiPointsV(const unsigned_integer VertexCount, const parameter_list& Parameters = parameter_list());\n\tvoid RiAtmosphereV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list());\n\tvoid RiAttributeBegin();\n\tvoid RiAttributeEnd();\n\tvoid RiAttributeV(const string& Name, const parameter_list& Parameters = parameter_list());\n\tvoid RiBasis(const matrix& UBasis, const unsigned_integer UStep, const matrix& VBasis, const unsigned_integer VStep);\n\tvoid RiBasis(const string& UBasis, const unsigned_integer UStep, const string& VBasis, const unsigned_integer VStep);\n\tvoid RiBlobbyV(const unsigned_integer NLeaf, const unsigned_integers& Codes, const reals& Floats, const strings& Strings, const parameter_list& Parameters = parameter_list());\n\tvoid RiBound(const boost::array<real, 6>& Bound);\n\tvoid RiClipping(const real Hither, const real Yon);\n\tvoid RiColor(const color& Color);\n\tvoid RiColorSamples(const unsigned_integer ParameterCount, const reals& nRGB, const reals& RGBn);\n\tvoid RiComment(const string& Comment);\n\tvoid RiConcatTransform(const matrix& Transform);\n\tvoid RiConeV(const real Height, const real Radius, const real ThetaMax, const parameter_list& Parameters = parameter_list());\n\tvoid RiCoordSysTransform(const string& Space);\n\tvoid RiCoordinateSystem(const string& Space);\n\tvoid RiCropWindow(const real XMin, const real XMax, const real YMin, const real YMax);\n\tvoid RiCurvesV(const string& Type, const unsigned_integers& VertexCounts, const string& Wrap, const parameter_list& Parameters = parameter_list());\n\tvoid RiCylinderV(const real Radius, const real ZMin, const real ZMax, const real ThetaMax, const parameter_list& Parameters = parameter_list());\n\tvoid RiDeclare(const string& Name, const string& Type);\n\tvoid RiDeformationV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list());\n\tvoid RiDepthOfField(const real FStop, const real FocalLength, const real FocalDistance);\n\tvoid RiDetail(const boost::array<real, 6>& Bound);\n\tvoid RiDetailRange(const real MinVis, const real LowTran, const real UpTran, const real MaxVis);\n\tvoid RiDiskV(real Height, real Radius, real ThetaMax, const parameter_list& Parameters = parameter_list());\n\tvoid RiDisplacementV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list());\n\tvoid RiDisplayV(const string& Name, const string& Type, const string& Mode, const parameter_list& Parameters = parameter_list());\n\tvoid RiErrorHandler(const string& Style);\n\tvoid RiExposure(const real Gain, const real Gamma);\n\tvoid RiExteriorV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list());\n\tvoid RiFormat(const unsigned_integer XResolution, const unsigned_integer YResolution, const real AspectRatio);\n\tvoid RiFrameAspectRatio(const real AspectRatio);\n\tvoid RiFrameBegin(const unsigned_integer FrameNumber);\n\tvoid RiFrameEnd();\n\tvoid RiGeneralPolygonV(const unsigned_integers& VertexCounts, const parameter_list& Parameters = parameter_list());\n\tvoid RiGeometricApproximation(const string& Type, const real Value);\n\tvoid RiGeometricRepresentation(const string& Type);\n\tvoid RiGeometryV(const string& Type, const parameter_list& Parameters = parameter_list());\n\tvoid RiHiderV(const string& Type, const parameter_list& Parameters = parameter_list());\n\tvoid RiHyperboloidV(const point& Point1, const point& Point2, const real ThetaMax, const parameter_list& Parameters = parameter_list());\n\tvoid RiIdentity();\n\tvoid RiIlluminate(const light_handle LightHandle, const bool OnOff);\n\tvoid RiImagerV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list());\n\tvoid RiInteriorV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list());\n\tconst light_handle RiLightSourceV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list());\n\tvoid RiMakeCubeFaceEnvironmentV(const string& px, const string& nx, const string& py, const string& ny, const string& pz, const string& nz, const string& texturename, const real fov, const string& swrap, const string& twrap, const string& filterfunc, const real swidth, const real twidth, const parameter_list& Parameters = parameter_list());\n\tvoid RiMakeLatLongEnvironmentV(const string& picturename, const string& texturename, const string& filterfunc, const real swidth, const real twidth, const parameter_list& Parameters = parameter_list());\n\tvoid RiMakeShadowV(const string& picturename, const string& texturename, const parameter_list& Parameters = parameter_list());\n\tvoid RiMakeTextureV(const string& picturename, const string& texturename, const string& swrap, const string& twrap, const string& filterfunc, const real swidth, const real twidth, const parameter_list& Parameters = parameter_list());\n\tvoid RiMatte(const bool OnOff);\n\tvoid RiMotionBeginV(const sample_times_t& Times);\n\tvoid RiMotionEnd();\n\tvoid RiNewline();\n\tvoid RiNuPatchV(const unsigned_integer UCount, const unsigned_integer UOrder, const reals& UKnot, const real UMin, const real UMax, const unsigned_integer VCount, const unsigned_integer VOrder, const reals& VKnot, const real VMin, const real VMax, const parameter_list& Parameters = parameter_list());\n\tconst object_handle RiObjectBegin();\n\tvoid RiObjectEnd();\n\tvoid RiObjectInstance(const object_handle Object);\n\tvoid RiOpacity(const color& Opacity);\n\tvoid RiOptionV(const string& Name, const parameter_list& Parameters = parameter_list());\n\tvoid RiOrientation(const string& Orientation);\n\tvoid RiParaboloidV(const real RMax, const real ZMin, const real ZMax, const real ThetaMax, const parameter_list& Parameters = parameter_list());\n\tvoid RiPatchMeshV(const string& Type, const unsigned_integer UCount, const string& UWrap, const unsigned_integer VCount, const string& VWrap, const parameter_list& Parameters = parameter_list());\n\tvoid RiPatchV(const string& Type, const parameter_list& Parameters = parameter_list());\n\tvoid RiPerspective(const real FieldOfView);\n\tvoid RiPixelFilter(const string& FilterName, const real XWidth, const real YWidth);\n\tvoid RiPixelSamples(const real XSamples, const real YSamples);\n\tvoid RiPixelVariance(const real Variation);\n\tvoid RiPointsGeneralPolygonsV(const unsigned_integers& LoopCounts, const unsigned_integers& VertexCounts, const unsigned_integers& VertexIDs, const parameter_list& Parameters = parameter_list());\n\tvoid RiPointsPolygonsV(const unsigned_integers& VertexCounts, const unsigned_integers& VertexIDs, const parameter_list& Parameters = parameter_list());\n\tvoid RiPolygonV(const unsigned_integer VertexCount, const parameter_list& Parameters = parameter_list());\n\tvoid RiProcDelayedReadArchive(const path& Archive, const bound& BoundingBox);\n\tvoid RiProjectionV(const string& Name, const parameter_list& Parameters = parameter_list());\n\tvoid RiQuantize(const string& Type, const integer One, const integer QMin, const integer QMax, const real Amplitude);\n\tvoid RiReadArchive(const path& Archive);\n\tvoid RiRelativeDetail(const real RelativeDetail);\n\tvoid RiReverseOrientation();\n\tvoid RiRotate(const real angle, const real DX, const real DY, const real DZ);\n\tvoid RiScale(const real DX, const real DY, const real DZ);\n\tvoid RiScreenWindow(const real Left, const real Right, const real Bottom, const real Top);\n\tvoid RiShadingInterpolation(const string& Type);\n\tvoid RiShadingRate(const real Size);\n\tvoid RiShutter(const real SMin, const real SMax);\n\tvoid RiSides(const unsigned_integer Sides);\n\tvoid RiSkew(const real Angle, const real DX1, const real DY1, const real DZ1, const real DX2, const real DY2, const real DZ2);\n\tvoid RiSolidBegin(const string& Type);\n\tvoid RiSolidEnd();\n\tvoid RiSphereV(const real Radius, const real ZMin, const real ZMax, const real ThetaMax, const parameter_list& Parameters = parameter_list());\n\tvoid RiStructure(const string& Structure);\n\tvoid RiSubdivisionMeshV(const string& Scheme, const unsigned_integers& VertexCounts, const unsigned_integers& VertexIDs, const strings& Tags, const unsigned_integers& ArgCounts, const integers& IntegerArgs, const reals& FloatArgs, const parameter_list& Parameters = parameter_list());\n\tvoid RiSurfaceV(const path& Path, const string& Name, const parameter_list& Parameters = parameter_list());\n\tvoid RiTextureCoordinates(const real S1, const real T1, const real S2, const real T2, const real S3, const real T3, const real S4, const real T4);\n\tvoid RiTorusV(const real MajorRadius, const real MinorRadius, const real PhiMin, const real PhiMax, const real ThetaMax, const parameter_list& Parameters = parameter_list());\n\tvoid RiTransform(const matrix& Transform);\n\tvoid RiTransformBegin();\n\tvoid RiTransformEnd();\n\tvoid RiTranslate(const real DX, const real DY, const real DZ);\n\tvoid RiTrimCurve(const unsigned_integers& CurveCounts, const unsigned_integers& Orders, const reals& Knots, const reals& Minimums, const reals& Maximums, const unsigned_integers& PointCounts, const reals& U, const reals& V, const reals& W);\n\tvoid RiWorldBegin();\n\tvoid RiWorldEnd();\n\n\tvoid RiShaderLayerV(const std::string& type, const path& Path, const std::string& name, const std::string& layername, const parameter_list& Parameters = parameter_list());\n\tvoid RiConnectShaderLayers(const std::string& type, const std::string& layer1, const std::string& variable1, const std::string& layer2, const std::string& variable2);\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_STREAM_RI_H\n\n"
  },
  {
    "path": "k3dsdk/string_cast.h",
    "content": "#ifndef K3DSDK_STRING_CAST_H\n#define K3DSDK_STRING_CAST_H\n\n#include <k3dsdk/path.h>\n\n#include <boost/format.hpp>\n\n#include <limits>\n#include <sstream>\n#include <string>\n\nnamespace k3d\n{\n\n///////////////////////////////////////////////////////////////////////////\n// string_cast\n\n/// Converts any serializable type to a string\ntemplate<typename type>\nconst string_t string_cast(const type& RHS)\n{\n\tstd::ostringstream buffer;\n\tif(std::numeric_limits<type>::is_specialized)\n\t        buffer.precision(std::numeric_limits<type>::digits10 + 1);\n\n\tbuffer << RHS;\n\treturn buffer.str();\n}\n\n/// Specialization of string_cast for type bool_t\ntemplate<>\ninline const string_t string_cast<bool_t>(const bool_t& RHS)\n{\n\treturn RHS ? \"true\" : \"false\";\n}\n\n/// Specialization of string_cast for strings\ntemplate<>\ninline const string_t string_cast<string_t>(const string_t& RHS)\n{\n\treturn RHS;\n}\n\n/// Specialization of string_cast() for filesystem::path\n/** \\todo Is this really the correct behavior?  */\ntemplate<>\ninline const string_t string_cast<filesystem::path>(const filesystem::path& RHS)\n{\n\treturn RHS.native_utf8_string().raw();\n}\n\n/// Specialization of string_cast() for boost::format\ntemplate<>\ninline const string_t string_cast<boost::format>(const boost::format& RHS)\n{\n\treturn RHS.str();\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// from_string\n\n/// Converts a string into any serializeable type\ntemplate<typename type>\ntype from_string(const string_t& Value, const type& Default)\n{\n\ttype result = Default;\n\tstd::istringstream stream(Value.c_str());\n\tstream >> result;\n\n\treturn result;\n}\n\n/// Specialization of from_string for type bool_t\ntemplate<>\ninline bool_t from_string(const string_t& Value, const bool_t& Default)\n{\n\tbool_t result = Default;\n\n\tif(Value == \"true\")\n\t\tresult = true;\n\telse if(Value == \"false\")\n\t\tresult = false;\n\n\treturn result;\n}\n\n/// Specialization of from_string for strings\ntemplate<>\ninline string_t from_string(const string_t& Value, const string_t&)\n{\n\treturn Value;\n}\n\n/// Specialization of from_string for filesystem::path\ntemplate<>\ninline filesystem::path from_string(const string_t& Value, const filesystem::path&)\n{\n\treturn filesystem::native_path(ustring::from_utf8(Value));\n}\n\n} // namespace k3d\n\n#endif // !K3DSDK_STRING_CAST_H\n\n"
  },
  {
    "path": "k3dsdk/string_modifiers.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements extended std::string functions\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/result.h>\n#include <k3dsdk/string_modifiers.h>\n\n#include <algorithm>\n#include <cctype>\n\nnamespace k3d\n{\n\nconst std::string replace_all(const std::string& Search, const std::string& Replacement, const std::string& Source)\n{\n\tstd::string result(Source);\n\n\tfor(std::string::size_type pos = result.find(Search); pos != std::string::npos; pos = result.find(Search, pos + Replacement.size()))\n\t\tresult.replace(pos, Search.size(), Replacement);\n\n\treturn result;\n}\n\nconst std::string right(const std::string& Text, std::string::size_type Count)\n{\n\tassert_warning(Count <= Text.size());\n\treturn std::string(Text.end() - Count, Text.end());\n}\n\nconst std::string trim(const std::string& Text)\n{\n\treturn trimleft(trimright(Text));\n}\n\nconst std::string trimleft(const std::string& Text)\n{\n\t// Easiest case ...\n\tif(!Text.size())\n\t\treturn std::string();\n\n\tstd::string::size_type i;\n\tfor(i = 0; i < Text.size(); ++i)\n\t\tif(!std::isspace(Text[i]))\n\t\t\tbreak;\n\n\t// No whitespace, so we're done ...\n\tif(i == 0)\n\t\treturn std::string(Text);\n\n\t// All whitespace, so clear the string ...\n\tif(i == Text.size())\n\t\treturn std::string();\n\n\treturn right(Text, Text.size()-i);\n}\n\nconst std::string trimright(const std::string& Text)\n{\n\t// Easiest case ...\n\tif(!Text.size())\n\t\treturn std::string();\n\n\tstd::string::size_type i;\n\tfor(i = Text.size()-1; i >= 0; --i)\n\t\tif(!std::isspace(Text[i]))\n\t\t\tbreak;\n\n\t// No whitespace, so we're done ...\n\tif(i == (Text.size()-1))\n\t\treturn std::string(Text);\n\n\t// All whitespace, so return empty string ...\n\tif(i == std::string::size_type(-1))\n\t\treturn std::string();\n\n\treturn Text.substr(0, i+1);\n}\n\n} // namespace k3d\n\n\n"
  },
  {
    "path": "k3dsdk/string_modifiers.h",
    "content": "#ifndef K3DSDK_STRING_MODIFIERS_H\n#define K3DSDK_STRING_MODIFIERS_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares extended std::string functions\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <sstream>\n#include <string>\n\nnamespace k3d\n{\n\n/// Replaces all occurrences of the Search string within the Source string with the Replacement string\nconst std::string replace_all(const std::string& Search, const std::string& Replacement, const std::string& Source);\n/// Returns the rightmost N characters of the string\nconst std::string right(const std::string& Text, std::string::size_type Count);\n/// Trims whitespaces from both ends of the string\nconst std::string trim(const std::string& Text);\n/// Trims beginning whitespaces from the string\nconst std::string trimleft(const std::string& Text);\n/// Trims trailing whitespaces from the string\nconst std::string trimright(const std::string& Text);\n\n} // namespace k3d\n\n#endif // !K3DSDK_STRING_MODIFIERS_H\n\n\n"
  },
  {
    "path": "k3dsdk/string_source.h",
    "content": "#ifndef K3DSDK_STRING_SOURCE_H\n#define K3DSDK_STRING_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/istring_source.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace k3d\n{\n\ntemplate<typename derived_t>\nclass string_source :\n\tpublic istring_source\n{\npublic:\n\tiproperty& string_source_output()\n\t{\n\t\treturn m_output_string;\n\t}\n\n\tsigc::slot<void, ihint*> make_update_string_slot()\n\t{\n\t\treturn m_output_string.make_slot();\n\t}\n\nprotected:\n\tstring_source() :\n\t\tm_output_string(\n\t\t\tinit_owner(*static_cast<derived_t*>(this))\n\t\t\t+ init_name(\"output_string\")\n\t\t\t+ init_label(_(\"Output String\"))\n\t\t\t+ init_description(\"Output string\")\n\t\t\t+ init_value(string_t()))\n\t{\n\t\tm_output_string.set_update_slot(sigc::mem_fun(*this, &string_source<derived_t>::execute));\n\t}\n\nprivate:\n\tk3d_data(std::string, data::immutable_name, data::change_signal, data::no_undo, data::value_demand_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_output_string;\n\n\t/// Called whenever the output has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, string_t& Output)\n\t{\n\t\t// We can safely ignore any hints ...\n\t\ton_update_string(Output);\n\t}\n\n\tvirtual void on_update_string(string_t& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_STRING_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/subdivision_surface/CMakeLists.txt",
    "content": "PROJECT(k3dsdk-subdivision-surface)\n\nFILE(GLOB HEADERS *.h)\nFILE(GLOB SOURCES *.cpp)\n\nINCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GLIBMM_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nK3D_ADD_LIBRARY(k3dsdk-subdivision-surface SHARED ${HEADERS} ${SOURCES})\nK3D_GENERATE_DEF_FILE(k3dsdk-subdivision-surface)\nTARGET_LINK_LIBRARIES(k3dsdk-subdivision-surface k3dsdk)\n\nINSTALL(TARGETS k3dsdk-subdivision-surface\n\tRUNTIME DESTINATION bin \n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR})\n\n"
  },
  {
    "path": "k3dsdk/subdivision_surface/catmull_clark.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file catmull_clark.cpp\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n\t\t\\created Feb 18, 2009\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/parallel/blocked_range.h>\n#include <k3dsdk/parallel/parallel_for.h>\n#include <k3dsdk/parallel/threads.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/subdivision_surface/catmull_clark.h>\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/vectors.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\nnamespace sds\n{\n\nnamespace detail\n{\n\n/// Replace the elements of Array with their cumulative sum\ntemplate<class ArrayT> void cumulative_sum(ArrayT& Array)\n{\n\tconst k3d::uint_t array_begin = 0;\n\tconst k3d::uint_t array_end = Array.size();\n\tfor(k3d::uint_t i = array_begin + 1; i != array_end; ++i)\n\t\tArray[i] += Array[i-1];\n}\n\n/// True if Face is the first face containing Point\nk3d::bool_t first_corner(const k3d::uint_t Face, const k3d::uint_t Point, const std::vector<k3d::mesh::indices_t>& PointFaces)\n{\n\tconst k3d::mesh::indices_t& faces = PointFaces[Point];\n\tconst k3d::uint_t face_begin = 0;\n\tconst k3d::uint_t face_end = faces.size();\n\tfor(k3d::uint_t i = face_begin; i != face_end; ++i)\n\t{\n\t\tif(faces[i] < Face)\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\n/// Stores references to commonly used arrays, and defines some common checks for faces and edges\nclass mesh_arrays\n{\npublic:\n\tmesh_arrays(const k3d::mesh::selection_t& FaceSelection,\n\t\t\tconst k3d::mesh::indices_t& FaceFirstLoops,\n\t\t\tconst k3d::mesh::counts_t& FaceLoopCounts,\n\t\t\tconst k3d::mesh::indices_t& LoopFirstEdges,\n\t\t\tconst k3d::mesh::indices_t& ClockwiseEdges,\n\t\t\tconst k3d::mesh::indices_t& EdgeFaces,\n\t\t\tconst k3d::mesh::indices_t& Companions) :\n\t\t\t\tface_selection(FaceSelection),\n\t\t\t\tface_first_loops(FaceFirstLoops),\n\t\t\t\tface_loop_counts(FaceLoopCounts),\n\t\t\t\tloop_first_edges(LoopFirstEdges),\n\t\t\t\tclockwise_edges(ClockwiseEdges),\n\t\t\t\tedge_faces(EdgeFaces),\n\t\t\t\tcompanions(Companions)\n\t{}\n\t\n\t/// True if the given face is affected by the operation\n\tk3d::bool_t is_affected(const k3d::uint_t Face) const\n\t{\n\t\treturn face_selection[Face] && face_loop_counts[Face] == 1;\n\t}\n\t\n\t/// True if the face adjacent to Edge is affected. In case of a boundary edge, returns the affected status of the face itself\n\tk3d::bool_t is_companion_affected(const k3d::uint_t Edge) const\n\t{\n\t\treturn is_affected(edge_faces[companions[Edge]]);\n\t}\n\t\n\t/// True if the face that Edge belongs to comes before the face its companion belongs to, when considering midpoints\n\tk3d::bool_t first_midpoint(const k3d::uint_t Edge) const\n\t{\n\t\tconst k3d::uint_t face = edge_faces[Edge];\n\t\tconst k3d::uint_t companion_face = edge_faces[companions[Edge]];\n\t\treturn ((face <= companion_face && !is_affected(face))\n\t\t\t\t\t\t|| is_affected(face) && (face <= companion_face || !is_affected(companion_face)));\n\t}\n\t\n\t/// True if the edge is part of the boundary of the mesh that is to be subdivided\n\t/**\n\t * This means it is one of the following:\n\t * - A real boundary edge\n\t * - An edge next to an unselected face\n\t * - An edge next to a face with holes\n\t */\n\tk3d::bool_t boundary(const k3d::uint_t Edge) const\n\t{\n\t\tconst k3d::uint_t companion = companions[Edge];\n\t\treturn companion == Edge\n\t\t\t\t\t|| (is_affected(edge_faces[Edge]) && !is_affected(edge_faces[companion]))\n\t\t\t\t\t|| (!is_affected(edge_faces[Edge]) && is_affected(edge_faces[companion]));\n\t}\n\t\n\tconst k3d::mesh::selection_t& face_selection;\n\tconst k3d::mesh::indices_t& face_first_loops;\n\tconst k3d::mesh::counts_t& face_loop_counts;\n\tconst k3d::mesh::indices_t& loop_first_edges;\n\tconst k3d::mesh::indices_t& clockwise_edges;\n\tconst k3d::mesh::indices_t& edge_faces;\n\tconst k3d::mesh::indices_t& companions;\n};\n\n/// For each old face index, count the number of subfaces, loops, edges and distinct points that will be in the new mesh\n/**\n * The parameters FaceSubfaceCounts, FaceSubloopCounts, FaceEdgeCounts and FacePointCounts store the result and must\n * have the same length as the number of faces of the input mesh\n */\nclass per_face_component_counter\n{\npublic:\n\tper_face_component_counter(const mesh_arrays& MeshArrays,\n\t\t\tconst k3d::mesh::indices_t& EdgePoints,\n\t\t\tconst std::vector<k3d::mesh::indices_t>& PointFaces,\n\t\t\tk3d::mesh::counts_t& FaceSubfaceCounts,\n\t\t\tk3d::mesh::counts_t& FaceSubloopCounts,\n\t\t\tk3d::mesh::counts_t& FaceEdgeCounts,\n\t\t\tk3d::mesh::counts_t& FacePointCounts) :\n\t\tm_mesh_arrays(MeshArrays),\n\t\tm_edge_points(EdgePoints),\n\t\tm_point_faces(PointFaces),\n\t\tm_face_subface_counts(FaceSubfaceCounts),\n\t\tm_face_subloop_counts(FaceSubloopCounts),\n\t\tm_face_edge_counts(FaceEdgeCounts),\n\t\tm_face_point_counts(FacePointCounts)\n\t{}\n\t\n\tvoid operator()(const unsigned int Face)\n\t{\n\t\tk3d::uint_t& subface_count = m_face_subface_counts[Face];\n\t\tk3d::uint_t& subloop_count = m_face_subloop_counts[Face];\n\t\tk3d::uint_t& edge_count = m_face_edge_counts[Face];\n\t\tk3d::uint_t& point_count = m_face_point_counts[Face];\n\t\tsubface_count = 0;\n\t\tsubloop_count = 0;\n\t\tedge_count = 0;\n\t\tpoint_count = 0;\n\t\tif(!m_mesh_arrays.is_affected(Face)) // Faces that will not be split\n\t\t{\n\t\t\t++subface_count;\n\t\t\tsubloop_count += m_mesh_arrays.face_loop_counts[Face];\n\t\t\tconst k3d::uint_t loop_begin = m_mesh_arrays.face_first_loops[Face];\n\t\t\tconst k3d::uint_t loop_end = loop_begin + m_mesh_arrays.face_loop_counts[Face];\n\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_edge = m_mesh_arrays.loop_first_edges[loop];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\t++edge_count; // Count the original edge\n\t\t\t\t\t// Note: we assume here that in case of a boundary edge, companion == edge\n\t\t\t\t\tif(m_mesh_arrays.is_companion_affected(edge))\n\t\t\t\t\t{\n\t\t\t\t\t\t++edge_count; // Reserve space for an edge that is split because this or the adjacent face is selected\n\t\t\t\t\t} \n\t\t\t\t\t\n\t\t\t\t\t// Count the new corner points, respecting face order\n\t\t\t\t\t\n\t\t\t\t\tif(first_corner(Face, m_edge_points[m_mesh_arrays.clockwise_edges[edge]], m_point_faces))\n\t\t\t\t\t{\n\t\t\t\t\t\t++point_count;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tedge = m_mesh_arrays.clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse // Faces to split\n\t\t{\n\t\t\tconst k3d::uint_t first_edge = m_mesh_arrays.loop_first_edges[m_mesh_arrays.face_first_loops[Face]];\n\t\t\t// Count the face point\n\t\t\t++point_count;\n\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t{\n\t\t\t\t++subface_count;\n\t\t\t\t++subloop_count;\n\t\t\t\tedge_count += 4;\n\t\t\t\t\n\t\t\t\tif(m_mesh_arrays.first_midpoint(edge))\n\t\t\t\t{\n\t\t\t\t\t++point_count; // Count the midpoint\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(first_corner(Face, m_edge_points[m_mesh_arrays.clockwise_edges[edge]], m_point_faces))\n\t\t\t\t\t++point_count;\n\t\t\t\t\n\t\t\t\tedge = m_mesh_arrays.clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t\nprivate:\n\tconst mesh_arrays& m_mesh_arrays;\n\tconst k3d::mesh::indices_t& m_edge_points;\n\tconst std::vector<k3d::mesh::indices_t>& m_point_faces;\n\tk3d::mesh::counts_t& m_face_subface_counts;\n\tk3d::mesh::counts_t& m_face_subloop_counts;\n\tk3d::mesh::counts_t& m_face_edge_counts;\n\tk3d::mesh::counts_t& m_face_point_counts;\n};\n\n/// Calculates the new indices of corner points, edge midpoints and face centers \nclass point_index_calculator\n{\npublic:\n\tpoint_index_calculator(const mesh_arrays& MeshArrays,\n\t\t\tconst k3d::mesh::indices_t& EdgePoints,\n\t\t\tstd::vector<k3d::mesh::indices_t>& PointFaces,\n\t\t\tconst k3d::mesh::counts_t& FacePointCounts,\n\t\t\tk3d::mesh::indices_t& CornerPoints,\n\t\t\tk3d::mesh::indices_t& EdgeMidpoints,\n\t\t\tk3d::mesh::indices_t& FaceCenters\n\t\t\t) :\n\t\t\t\tm_mesh_arrays(MeshArrays),\n\t\t\t\tm_edge_points(EdgePoints),\n\t\t\t\tm_point_faces(PointFaces),\n\t\t\t\tm_face_point_counts(FacePointCounts),\n\t\t\t\tm_corner_points(CornerPoints),\n\t\t\t\tm_edge_midpoints(EdgeMidpoints),\n\t\t\t\tm_face_centers(FaceCenters)\n\t\t\t{}\n\t\n\tvoid operator()(const k3d::uint_t Face)\n\t{\n\t\tk3d::uint_t point_count = Face == 0 ? 0 : m_face_point_counts[Face - 1];\n\t\tif(!m_mesh_arrays.is_affected(Face)) // Faces that will not be split\n\t\t{\n\t\t\tconst k3d::uint_t loop_begin = m_mesh_arrays.face_first_loops[Face];\n\t\t\tconst k3d::uint_t loop_end = loop_begin + m_mesh_arrays.face_loop_counts[Face];\n\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_edge = m_mesh_arrays.loop_first_edges[loop];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tif(first_corner(Face, m_edge_points[m_mesh_arrays.clockwise_edges[edge]], m_point_faces))\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t clockwise = m_mesh_arrays.clockwise_edges[edge]; \n\t\t\t\t\t\tm_corner_points[m_edge_points[clockwise]] = point_count;\n\t\t\t\t\t\t++point_count;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tedge = m_mesh_arrays.clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse // Faces to split\n\t\t{\n\t\t\tconst k3d::uint_t first_edge = m_mesh_arrays.loop_first_edges[m_mesh_arrays.face_first_loops[Face]];\n\t\t\tm_face_centers[Face] = point_count;\n\t\t\t++point_count;\n\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t{\n\t\t\t\tconst k3d::uint_t clockwise = m_mesh_arrays.clockwise_edges[edge];\n\t\t\t\tif(m_mesh_arrays.first_midpoint(edge))\n\t\t\t\t{\n\t\t\t\t\tm_edge_midpoints[edge] = point_count;\n\t\t\t\t\tm_edge_midpoints[m_mesh_arrays.companions[edge]] = point_count;\n\t\t\t\t\t++point_count; // Count the midpoint\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(first_corner(Face, m_edge_points[m_mesh_arrays.clockwise_edges[edge]], m_point_faces))\n\t\t\t\t{ \n\t\t\t\t\tm_corner_points[m_edge_points[clockwise]] = point_count;\n\t\t\t\t\t++point_count;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tedge = clockwise;\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t\nprivate:\n\tconst mesh_arrays& m_mesh_arrays;\n\tconst k3d::mesh::indices_t& m_edge_points;\n\tstd::vector<k3d::mesh::indices_t>& m_point_faces;\n\tconst k3d::mesh::counts_t& m_face_point_counts;\n\tk3d::mesh::indices_t& m_corner_points;\n\tk3d::mesh::indices_t& m_edge_midpoints;\n\tk3d::mesh::indices_t& m_face_centers;\n};\n\n/// Create the subdivided mesh topology\nclass topology_subdivider\n{\npublic:\n\ttopology_subdivider(const mesh_arrays& MeshArrays,\n\t\t\tconst k3d::mesh::indices_t& InputEdgePoints,\n\t\t\tconst k3d::mesh::materials_t& InputFaceMaterials,\n\t\t\tconst k3d::mesh::counts_t& FaceSubfaceCounts,\n\t\t\tconst k3d::mesh::counts_t& FaceSubloopCounts,\n\t\t\tconst k3d::mesh::counts_t& FaceEdgeCounts,\n\t\t\tconst k3d::mesh::indices_t& CornerPoints,\n\t\t\tconst k3d::mesh::indices_t& EdgeMidpoints,\n\t\t\tconst k3d::mesh::indices_t& FaceCenters,\n\t\t\tconst k3d::mesh::indices_t& InputFaceShells,\n\t\t\tk3d::mesh::indices_t& OutputEdgePoints,\n\t\t\tk3d::mesh::indices_t& OutputClockwiseEdges,\n\t\t\tk3d::mesh::indices_t& OutputLoopFirstEdges,\n\t\t\tk3d::mesh::indices_t& OutputFaceFirstLoops,\n\t\t\tk3d::mesh::counts_t& OutputFaceLoopCounts,\n\t\t\tk3d::mesh::materials_t& OutputFaceMaterials,\n\t\t\tk3d::mesh::selection_t& OutputFaceSelection,\n\t\t\tk3d::mesh::indices_t& OutputFaceShells\n\t\t\t) :\n\t\t\t\tm_mesh_arrays(MeshArrays),\n\t\t\t\tm_input_edge_points(InputEdgePoints),\n\t\t\t\tm_input_face_materials(InputFaceMaterials),\n\t\t\t\tm_face_subface_counts(FaceSubfaceCounts),\n\t\t\t\tm_face_subloop_counts(FaceSubloopCounts),\n\t\t\t\tm_face_edge_counts(FaceEdgeCounts),\n\t\t\t\tm_corner_points(CornerPoints),\n\t\t\t\tm_edge_midpoints(EdgeMidpoints),\n\t\t\t\tm_face_centers(FaceCenters),\n\t\t\t\tm_input_face_shells(InputFaceShells),\n\t\t\t\tm_output_edge_points(OutputEdgePoints),\n\t\t\t\tm_output_clockwise_edges(OutputClockwiseEdges),\n\t\t\t\tm_output_loop_first_edges(OutputLoopFirstEdges),\n\t\t\t\tm_output_face_first_loops(OutputFaceFirstLoops),\n\t\t\t\tm_output_face_loop_counts(OutputFaceLoopCounts),\n\t\t\t\tm_output_face_materials(OutputFaceMaterials),\n\t\t\t\tm_output_face_selection(OutputFaceSelection),\n\t\t\t\tm_output_face_shells(OutputFaceShells)\n\t\t\t\t{}\n\t\n\tvoid operator()(const k3d::uint_t Face)\n\t{\n\t\tconst k3d::uint_t first_new_face = Face == 0 ? 0 : m_face_subface_counts[Face - 1];\n\t\tconst k3d::uint_t first_new_loop = Face == 0 ? 0 : m_face_subloop_counts[Face - 1];\n\n\t\tif(!m_mesh_arrays.is_affected(Face))\n\t\t{ // copy unaffected face, splitting edges adjacent to affected faces\n\t\t\tcopy_face(Face);\n\t\t}\n\t\telse\n\t\t{ // subdivide affected faces\n\t\t\tconst k3d::uint_t face_center = m_face_centers[Face];\n\t\t\tconst k3d::uint_t first_edge = m_mesh_arrays.loop_first_edges[m_mesh_arrays.face_first_loops[Face]];\n\t\t\tk3d::uint_t edgenumber = 0;\n\t\t\tk3d::uint_t first_new_edge = Face == 0 ? 0 : m_face_edge_counts[Face - 1];\n\t\t\tm_output_loop_first_edges[first_new_loop] = first_new_edge;\n\t\t\tm_output_face_first_loops[first_new_face] = first_new_loop;\n\t\t\tm_output_face_materials[first_new_face] = m_input_face_materials[Face];\n\t\t\tm_output_face_selection[first_new_face] = m_mesh_arrays.face_selection[Face];\n\t\t\tm_output_face_shells[first_new_face] = m_input_face_shells[Face];\n\n\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t{\n\t\t\t\tconst k3d::uint_t clockwise = m_mesh_arrays.clockwise_edges[edge];\n\t\t\t\tconst k3d::uint_t mid1 = m_edge_midpoints[edge];\n\t\t\t\tconst k3d::uint_t mid2 = m_edge_midpoints[clockwise];\n\t\t\t\tconst k3d::uint_t center_to_mid1 = first_new_edge;\n\t\t\t\tconst k3d::uint_t mid1_to_corner = center_to_mid1 + 1;\n\t\t\t\tconst k3d::uint_t corner_to_mid2 = mid1_to_corner + 1;\n\t\t\t\tconst k3d::uint_t mid2_to_center = corner_to_mid2 + 1;\n\t\t\t\tm_output_edge_points[mid1_to_corner] = mid1;\n\t\t\t\tm_output_edge_points[corner_to_mid2] = m_corner_points[m_input_edge_points[clockwise]];\n\t\t\t\tm_output_edge_points[mid2_to_center] = mid2;\n\t\t\t\tm_output_edge_points[center_to_mid1] = face_center;\n\t\t\t\tm_output_clockwise_edges[mid1_to_corner] = corner_to_mid2;\n\t\t\t\tm_output_clockwise_edges[corner_to_mid2] = mid2_to_center;\n\t\t\t\tm_output_clockwise_edges[mid2_to_center] = center_to_mid1;\n\t\t\t\tm_output_clockwise_edges[center_to_mid1] = mid1_to_corner;\n\n\t\t\t\t// Append face data\n\t\t\t\tconst k3d::uint_t newloop = first_new_loop + edgenumber;\n\t\t\t\tm_output_loop_first_edges[newloop] = center_to_mid1; \n\t\t\t\tm_output_face_first_loops[first_new_face + edgenumber] = newloop;\n\t\t\t\tm_output_face_materials[first_new_face + edgenumber] = m_input_face_materials[Face];\n\t\t\t\tm_output_face_selection[first_new_face + edgenumber] = m_mesh_arrays.face_selection[Face];\n\t\t\t\tm_output_face_shells[first_new_face] = m_input_face_shells[Face];\n\n\t\t\t\tfirst_new_edge += 4;\n\n\t\t\t\tedge = clockwise;\n\t\t\t\t++edgenumber;\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\nprivate:\n\t/// Copies the face to the correct location in the output\n\tvoid copy_face(const k3d::uint_t Face)\n\t{\n\t\tconst k3d::uint_t first_new_edge = Face == 0 ? 0 : m_face_edge_counts[Face - 1];\n\t\tconst k3d::uint_t first_new_face = Face == 0 ? 0 : m_face_subface_counts[Face - 1];\n\t\tconst k3d::uint_t first_new_loop = Face == 0 ? 0 : m_face_subloop_counts[Face - 1];\n\n\t\tconst k3d::uint_t loop_begin = m_mesh_arrays.face_first_loops[Face];\n\t\tconst k3d::uint_t loop_end = loop_begin + m_mesh_arrays.face_loop_counts[Face];\n\t\tk3d::uint_t edgenumber = 0;\n\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst k3d::uint_t first_edge = m_mesh_arrays.loop_first_edges[loop];\n\t\t\tk3d::uint_t loopedgenumber = 0;\n\t\t\tm_output_loop_first_edges[first_new_loop + loop - loop_begin] = first_new_edge + edgenumber;\n\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t{\n\t\t\t\tconst k3d::uint_t newedge = first_new_edge + edgenumber + loopedgenumber;\n\t\t\t\tm_output_edge_points[newedge] = m_corner_points[m_input_edge_points[edge]];\n\t\t\t\tm_output_clockwise_edges[newedge] = newedge + 1;\n\t\t\t\tif(m_mesh_arrays.is_companion_affected(edge))\n\t\t\t\t{\n\t\t\t\t\tm_output_edge_points[newedge + 1] = m_edge_midpoints[m_mesh_arrays.companions[edge]];\n\t\t\t\t\tm_output_clockwise_edges[newedge + 1] = newedge + 2;\n\t\t\t\t\t++loopedgenumber;\n\t\t\t\t}\n\n\t\t\t\tedge = m_mesh_arrays.clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t\t++loopedgenumber;\n\t\t\t}\n\t\t\tm_output_clockwise_edges[first_new_edge + edgenumber + loopedgenumber] = first_new_edge + edgenumber; // close the loop\n\t\t\tedgenumber += loopedgenumber + 1;\n\t\t}\n\n\t\t// Set face data\n\t\tm_output_face_loop_counts[first_new_face] = m_mesh_arrays.face_loop_counts[Face];\n\t\tm_output_face_first_loops[first_new_face] = first_new_loop;\n\t\tm_output_face_materials[first_new_face] = m_input_face_materials[Face];\n\t\tm_output_face_selection[first_new_face] = m_mesh_arrays.face_selection[Face];\n\t\tm_output_face_shells[first_new_face] = m_input_face_shells[Face];\n\t}\n\n\tconst mesh_arrays& m_mesh_arrays;\n\tconst k3d::mesh::indices_t& m_input_edge_points;\n\tconst k3d::mesh::materials_t& m_input_face_materials;\n\tconst k3d::mesh::counts_t& m_face_subface_counts;\n\tconst k3d::mesh::counts_t& m_face_subloop_counts;\n\tconst k3d::mesh::counts_t& m_face_edge_counts;\n\tconst k3d::mesh::indices_t& m_corner_points;\n\tconst k3d::mesh::indices_t& m_edge_midpoints;\n\tconst k3d::mesh::indices_t& m_face_centers;\n\tconst k3d::mesh::indices_t& m_input_face_shells;\n\tk3d::mesh::indices_t& m_output_edge_points;\n\tk3d::mesh::indices_t& m_output_clockwise_edges;\n\tk3d::mesh::indices_t& m_output_loop_first_edges;\n\tk3d::mesh::indices_t& m_output_face_first_loops;\n\tk3d::mesh::counts_t& m_output_face_loop_counts;\n\tk3d::mesh::materials_t& m_output_face_materials;\n\tk3d::mesh::selection_t& m_output_face_selection;\n\tk3d::mesh::indices_t& m_output_face_shells;\n};\n\n/// Calculates face centers\nclass face_center_calculator\n{\npublic:\n\t/// Constructs a new functor that will calculate the face centers of all selected faces with one loop\n\t/*\n\t * \\param FaceCenters The point index of the center for each face (only defined for selected faces with one loop)\n\t */\n\tface_center_calculator(\n\t\t\tconst mesh_arrays& MeshArrays,\n\t\t\tconst k3d::mesh::indices_t& InputEdgePoints,\n\t\t\tconst k3d::mesh::indices_t& OutputFaceFirstLoops,\n\t\t\tconst k3d::mesh::indices_t& OutputLoopFirstEdges,\n\t\t\tconst k3d::mesh::indices_t& OutputClockwiseEdges,\n\t\t\tconst k3d::mesh::indices_t& FaceCenters,\n\t\t\tconst k3d::mesh::counts_t& FaceSubfaceCounts,\n\t\t\tconst k3d::mesh::points_t& InputPoints,\n\t\t\tk3d::mesh::points_t& OutputPoints,\n\t\t\tk3d::table_copier& FaceCopier,\n\t\t\tk3d::table_copier& EdgeAttributesCopier,\n\t\t\tk3d::table_copier& VertexAttributesCopier,\n\t\t\tk3d::table_copier& PointAttributesCopier) :\n\t\tm_mesh_arrays(MeshArrays),\n\t\tm_input_edge_points(InputEdgePoints),\n\t\tm_output_face_first_loops(OutputFaceFirstLoops),\n\t\tm_output_loop_first_edges(OutputLoopFirstEdges),\n\t\tm_output_clockwise_edges(OutputClockwiseEdges),\n\t\tm_face_centers(FaceCenters),\n\t\tm_face_subface_counts(FaceSubfaceCounts),\n\t\tm_input_points(InputPoints),\n\t\tm_output_points(OutputPoints),\n\t\tm_uniform_copier(FaceCopier),\n\t\tm_edge_attributes_copier(EdgeAttributesCopier),\n\t\tm_vertex_attributes_copier(VertexAttributesCopier),\n\t\tm_point_attributes_copier(PointAttributesCopier)\n\t{}\n\t\t\t\n\tvoid operator()(const k3d::uint_t Face)\n\t{\n\t\tconst k3d::uint_t first_new_face = Face == 0 ? 0 : m_face_subface_counts[Face - 1];\n\t\t\n\t\t// Copy named arrays for unaffected faces\n\t\tif(!m_mesh_arrays.is_affected(Face))\n\t\t{\n\t\t\tm_uniform_copier.copy(Face, first_new_face);\n\t\t\tconst k3d::uint_t loop_begin = m_mesh_arrays.face_first_loops[Face];\n\t\t\tconst k3d::uint_t loop_end = loop_begin + m_mesh_arrays.face_loop_counts[Face];\n\t\t\tconst k3d::uint_t output_first_loop = m_output_face_first_loops[first_new_face];\n\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_edge = m_mesh_arrays.loop_first_edges[loop];\n\t\t\t\tk3d::uint_t output_edge = m_output_loop_first_edges[output_first_loop + loop - loop_begin];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tm_edge_attributes_copier.copy(edge, output_edge);\n\t\t\t\t\tm_vertex_attributes_copier.copy(edge, output_edge);\n\t\t\t\t\t\n\t\t\t\t\toutput_edge = m_output_clockwise_edges[output_edge];\n\t\t\t\t\tedge = m_mesh_arrays.clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst k3d::uint_t first_edge = m_mesh_arrays.loop_first_edges[m_mesh_arrays.face_first_loops[Face]];\n\t\t\tk3d::point3& center = m_output_points[m_face_centers[Face]];\n\t\t\tcenter = k3d::point3(0,0,0);\n\t\t\tk3d::uint_t count = 0;\n\t\t\t\n\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t{\n\t\t\t\tcenter += k3d::to_vector(m_input_points[m_input_edge_points[edge]]);\n\t\t\t\t++count;\n\t\n\t\t\t\tedge = m_mesh_arrays.clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcenter /= count;\n\t\t\t\n\t\t\t//indices for target of the varying data copy\n\t\t\tk3d::mesh::indices_t edges(count);\n\t\t\tk3d::mesh::indices_t points(count);\n\t\t\tk3d::mesh::weights_t weights(count, 1.0/static_cast<double>(count));\n\t\t\tk3d::uint_t i = 0;\n\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t{\n\t\t\t\tedges[i] = edge;\n\t\t\t\tpoints[i] = m_input_edge_points[edge];\n\t\t\t\t++i;\n\t\n\t\t\t\tedge = m_mesh_arrays.clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tk3d::uint_t output_face = first_new_face;\n\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t{\n\t\t\t\tconst k3d::uint_t output_first_edge = m_output_loop_first_edges[m_output_face_first_loops[output_face]];\n\t\t\t\tm_edge_attributes_copier.copy(count, &edges[0], &weights[0], output_first_edge); // varying data for the edge starting at the face center\n\t\t\t\tm_edge_attributes_copier.copy(m_mesh_arrays.clockwise_edges[edge], m_output_clockwise_edges[m_output_clockwise_edges[output_first_edge]]); // varying data for the edge starting at the corner\n\t\t\t\tm_vertex_attributes_copier.copy(count, &edges[0], &weights[0], output_first_edge); // varying data for the edge starting at the face center\n\t\t\t\tm_vertex_attributes_copier.copy(m_mesh_arrays.clockwise_edges[edge], m_output_clockwise_edges[m_output_clockwise_edges[output_first_edge]]); // varying data for the edge starting at the corner\n\t\t\t\tm_uniform_copier.copy(Face, output_face);\n\t\n\t\t\t\t++output_face;\n\t\t\t\tedge = m_mesh_arrays.clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tm_point_attributes_copier.copy(count, &points[0], &weights[0], m_face_centers[Face]);\n\t\t}\n\t}\n\t\nprivate:\n\tconst mesh_arrays& m_mesh_arrays;\n\tconst k3d::mesh::indices_t& m_input_edge_points;\n\tconst k3d::mesh::indices_t& m_output_face_first_loops;\n\tconst k3d::mesh::indices_t& m_output_loop_first_edges;\n\tconst k3d::mesh::indices_t& m_output_clockwise_edges;\n\tconst k3d::mesh::indices_t& m_face_centers;\n\tconst k3d::mesh::counts_t& m_face_subface_counts;\n\tconst k3d::mesh::points_t& m_input_points;\n\tk3d::mesh::points_t& m_output_points;\n\tk3d::table_copier& m_uniform_copier;\n\tk3d::table_copier& m_edge_attributes_copier;\n\tk3d::table_copier& m_vertex_attributes_copier;\n\tk3d::table_copier& m_point_attributes_copier;\n};\n\n/// Calculates edge midpoints\nclass edge_midpoint_calculator\n{\npublic:\n\t/// Constructs a new functor that will calculate the midpoints of all edges belonging to selected faces with one loop\n\t/*\n\t * \\param EdgeMidpoints The point index of the midpoint for each edge (only defined for selected faces with one loop)\n\t */\n\tedge_midpoint_calculator(\n\t\t\tconst mesh_arrays& MeshArrays,\n\t\t\tconst k3d::mesh::indices_t& InputEdgePoints,\n\t\t\tconst k3d::mesh::indices_t& OutputFaceFirstLoops,\n\t\t\tconst k3d::mesh::indices_t& OutputLoopFirstEdges,\n\t\t\tconst k3d::mesh::indices_t& OutputClockwiseEdges,\n\t\t\tconst k3d::mesh::indices_t& EdgeMidpoints,\n\t\t\tconst k3d::mesh::indices_t& FaceCenters,\n\t\t\tconst k3d::mesh::counts_t& FaceSubfaceCounts,\n\t\t\tconst k3d::mesh::points_t& InputPoints,\n\t\t\tk3d::mesh::points_t& OutputPoints,\n\t\t\tk3d::table_copier& EdgeAttributesCopier,\n\t\t\tk3d::table_copier& VertexAttributesCopier,\n\t\t\tk3d::table_copier& PointAttributesCopier,\n\t\t\tk3d::table_copier& PointAttributesMixer) :\n\t\tm_mesh_arrays(MeshArrays),\n\t\tm_input_edge_points(InputEdgePoints),\n\t\tm_output_face_first_loops(OutputFaceFirstLoops),\n\t\tm_output_loop_first_edges(OutputLoopFirstEdges),\n\t\tm_output_clockwise_edges(OutputClockwiseEdges),\n\t\tm_edge_midpoints(EdgeMidpoints),\n\t\tm_face_centers(FaceCenters),\n\t\tm_face_subface_counts(FaceSubfaceCounts),\n\t\tm_input_points(InputPoints),\n\t\tm_output_points(OutputPoints),\n\t\tm_edge_attributes_copier(EdgeAttributesCopier),\n\t\tm_vertex_attributes_copier(VertexAttributesCopier),\n\t\tm_point_attributes_copier(PointAttributesCopier),\n\t\tm_point_attributes_mixer(PointAttributesMixer)\n\t{}\n\n\n\tvoid operator()(const k3d::uint_t Face)\n\t{\n\t\tif(!m_mesh_arrays.is_affected(Face))\n\t\t\treturn;\n\t\t\n\t\tconst k3d::uint_t first_edge = m_mesh_arrays.loop_first_edges[m_mesh_arrays.face_first_loops[Face]];\n\t\t\n\t\t// Get the edge indices of the own face, for named array copying\n\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t{\n\t\t\tedge = m_mesh_arrays.clockwise_edges[edge];\n\t\t\tif(edge == first_edge)\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tconst k3d::uint_t first_new_face = Face == 0 ? 0 : m_face_subface_counts[Face - 1];\n\t\tk3d::uint_t output_face = first_new_face;\n\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t{\n\t\t\treturn_if_fail(m_edge_midpoints[edge] != 0);\n\t\t\tk3d::point3& midpoint = m_output_points[m_edge_midpoints[edge]];\n\t\t\tconst k3d::uint_t companion = m_mesh_arrays.companions[edge];\n\t\t\tconst k3d::uint_t output_first_edge = m_output_loop_first_edges[m_output_face_first_loops[output_face]];\n\t\t\tif(m_mesh_arrays.first_midpoint(edge))\n\t\t\t{\n\t\t\t\tif(m_mesh_arrays.boundary(edge))\n\t\t\t\t{\n\t\t\t\t\tmidpoint = 0.5 * (m_input_points[m_input_edge_points[edge]] + k3d::to_vector(m_input_points[m_input_edge_points[m_mesh_arrays.clockwise_edges[edge]]]));\n\t\t\t\t\tconst k3d::uint_t indices[] = {m_input_edge_points[edge], m_input_edge_points[m_mesh_arrays.clockwise_edges[edge]]};\n\t\t\t\t\tconst k3d::double_t weights[] = {0.5, 0.5};\n\t\t\t\t\tm_point_attributes_copier.copy(2, indices, weights, m_edge_midpoints[edge]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmidpoint = (m_input_points[m_input_edge_points[edge]] + k3d::to_vector(m_input_points[m_input_edge_points[m_mesh_arrays.clockwise_edges[edge]]])); // midpoint\n\t\t\t\t\tmidpoint += k3d::to_vector(m_output_points[m_face_centers[Face]]); // Add the face center of the current face\n\t\t\t\t\tmidpoint += k3d::to_vector(m_output_points[m_face_centers[m_mesh_arrays.edge_faces[companion]]]);\n\t\t\t\t\tmidpoint *= 0.25;\n\t\t\t\t\tconst k3d::uint_t corner_indices[] = {m_input_edge_points[edge],\n\t\t\t\t\t\t\t\t\t\t\t\tm_input_edge_points[m_mesh_arrays.clockwise_edges[edge]]};\n\t\t\t\t\tconst k3d::double_t corner_weights[] = {0.5, 0.5};\n\t\t\t\t\tm_point_attributes_copier.copy(2, corner_indices, corner_weights, m_edge_midpoints[edge]); // Copy the corner contribution\n\t\t\t\t\tconst k3d::double_t face_weights[] = {0.5, 0.25, 0.25};\n\t\t\t\t\tconst k3d::uint_t face_indices[] = {m_edge_midpoints[edge], m_face_centers[Face],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tm_face_centers[m_mesh_arrays.edge_faces[companion]]};\n\t\t\t\t\tm_point_attributes_mixer.copy(3, face_indices, face_weights, m_edge_midpoints[edge]); // Mix in the adjacent face values\n\t\t\t\t}\n\t\t\t}\n\t\t\t// copy varying data\n\t\t\tconst k3d::uint_t output_edge1 = m_output_clockwise_edges[m_output_clockwise_edges[m_output_clockwise_edges[output_first_edge]]]; // Edge from clockwise midpoint to center\n\t\t\tconst k3d::uint_t next_output_face = m_mesh_arrays.clockwise_edges[edge] == first_edge ? first_new_face : output_face + 1;\n\t\t\tconst k3d::uint_t next_output_first_edge = m_output_loop_first_edges[m_output_face_first_loops[next_output_face]];\n\t\t\tconst k3d::uint_t output_edge2 = m_output_clockwise_edges[next_output_first_edge]; // Edge from clockwise midpoint to corner\n\t\t\tconst k3d::double_t weights[] = {0.5, 0.5};\n\t\t\tconst k3d::uint_t varying_indices[] = {m_mesh_arrays.clockwise_edges[edge], m_mesh_arrays.clockwise_edges[m_mesh_arrays.clockwise_edges[edge]]};\n\t\t\tm_edge_attributes_copier.copy(2, varying_indices, weights, output_edge1);\n\t\t\tm_edge_attributes_copier.copy(2, varying_indices, weights, output_edge2);\n\t\t\tm_vertex_attributes_copier.copy(2, varying_indices, weights, output_edge1);\n\t\t\tm_vertex_attributes_copier.copy(2, varying_indices, weights, output_edge2);\n\n\t\t\t++output_face;\n\t\t\tedge = m_mesh_arrays.clockwise_edges[edge];\n\t\t\tif(edge == first_edge)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\nprivate:\n\tconst mesh_arrays& m_mesh_arrays;\n\tconst k3d::mesh::indices_t& m_input_edge_points;\n\tconst k3d::mesh::indices_t& m_output_face_first_loops;\n\tconst k3d::mesh::indices_t& m_output_loop_first_edges;\n\tconst k3d::mesh::indices_t& m_output_clockwise_edges;\n\tconst k3d::mesh::indices_t& m_edge_midpoints;\n\tconst k3d::mesh::indices_t& m_face_centers;\n\tconst k3d::mesh::counts_t& m_face_subface_counts;\n\tconst k3d::mesh::points_t& m_input_points;\n\tk3d::mesh::points_t& m_output_points;\n\tk3d::table_copier& m_edge_attributes_copier;\n\tk3d::table_copier& m_vertex_attributes_copier;\n\tk3d::table_copier& m_point_attributes_copier;\n\tk3d::table_copier& m_point_attributes_mixer;\n};\n\n/// Calculates patch corner positions\nclass corner_point_calculator\n{\npublic:\n\tcorner_point_calculator(\n\t\t\tconst mesh_arrays& MeshArrays,\n\t\t\tconst k3d::mesh::indices_t& InputEdgePoints,\n\t\t\tconst k3d::mesh::indices_t& CornerPoints,\n\t\t\tconst k3d::mesh::indices_t& EdgeMidpoints,\n\t\t\tconst k3d::mesh::indices_t& FaceCenters,\n\t\t\tconst std::vector<k3d::mesh::indices_t>& PointOutEdges,\n\t\t\tconst k3d::mesh::points_t& InputPoints,\n\t\t\tk3d::mesh::points_t& OutputPoints,\n\t\t\tk3d::table_copier& PointAttributesCopier,\n\t\t\tk3d::table_copier& PointAttributesMixer) :\n\t\tm_mesh_arrays(MeshArrays),\n\t\tm_input_edge_points(InputEdgePoints),\n\t\tm_corner_points(CornerPoints),\n\t\tm_edge_midpoints(EdgeMidpoints),\n\t\tm_face_centers(FaceCenters),\n\t\tm_input_points(InputPoints),\n\t\tm_point_out_edges(PointOutEdges),\n\t\tm_output_points(OutputPoints),\n\t\tm_point_attributes_copier(PointAttributesCopier),\n\t\tm_point_attributes_mixer(PointAttributesMixer)\n\t{}\n\n\n\tvoid operator()(const k3d::uint_t Point)\n\t{\n\t\t// Set initial position\n\t\tconst k3d::uint_t output_idx = m_corner_points[Point];\n\t\tk3d::point3& output_position = m_output_points[output_idx];\n\t\toutput_position = m_input_points[Point];\n\t\t\n\t\t// Get the number of outbound affected and boundary edges\n\t\tk3d::uint_t affected_edge_count = 0;\n\t\tk3d::uint_t boundary_edge_count = 0;\n\t\tconst k3d::mesh::indices_t& out_edges = m_point_out_edges[Point];\n\t\tconst k3d::uint_t valence = out_edges.size();\n\t\tconst k3d::uint_t start_index = 0;\n\t\tconst k3d::uint_t end_index = valence;\n\t\tfor(k3d::uint_t index = start_index; index != end_index; ++index)\n\t\t{\n\t\t\tconst k3d::uint_t edge = out_edges[index];\n\t\t\tconst k3d::uint_t face = m_mesh_arrays.edge_faces[edge];\n\t\t\tif(m_mesh_arrays.is_affected(face))\n\t\t\t\t++affected_edge_count;\n\t\t\tif(m_mesh_arrays.boundary(edge))\n\t\t\t\t++boundary_edge_count;\n\t\t}\n\t\t\n\t\tif(affected_edge_count == valence && boundary_edge_count == 0 && valence != 0) // Interior point of the subdivided surface\n\t\t{\n\t\t\tconst k3d::double_t own_weight = static_cast<double>(valence - 2.0) / static_cast<double>(valence); // Weight attributed to Point\n\t\t\tconst k3d::double_t neighbour_weight = 1.0 / static_cast<double>(valence * valence); // Weight attributed to surrounding corners and face vertices\n\t\t\toutput_position *=  own_weight; // adjust initial position\n\t\t\tk3d::vector3 sum(0, 0, 0);\n\t\t\tk3d::mesh::indices_t corner_indices(valence + 1); // indices of neighbor corners, for vertex attribute data\n\t\t\tk3d::mesh::indices_t face_indices(valence + 1); // indices of neighbor faces face vertices, for vertex attribute data\n\t\t\tfor(k3d::uint_t index = start_index; index != end_index; ++index)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t edge = out_edges[index];\n\t\t\t\tconst k3d::uint_t clockwise = m_mesh_arrays.clockwise_edges[edge];\n\t\t\t\tconst k3d::uint_t face = m_mesh_arrays.edge_faces[edge];\n\t\t\t\tconst k3d::vector3 next_corner = k3d::to_vector(m_input_points[m_input_edge_points[clockwise]]);\n\t\t\t\tconst k3d::vector3 face_vertex = k3d::to_vector(m_output_points[m_face_centers[face]]);\n\t\t\t\tcorner_indices[index - start_index] = m_input_edge_points[clockwise];\n\t\t\t\tface_indices[index - start_index] = m_face_centers[face];\n\t\t\t\tsum += next_corner + face_vertex;\n\t\t\t}\n\t\t\tsum *= neighbour_weight;\n\t\t\toutput_position += sum;\n\t\t\tk3d::mesh::weights_t corner_weights(corner_indices.size(), neighbour_weight);\n\t\t\tcorner_indices.back() = Point; // Append the current point and its weight\n\t\t\tcorner_weights.back() = own_weight;\n\t\t\tm_point_attributes_copier.copy(corner_indices.size(), &corner_indices[0], &corner_weights[0], output_idx); // Contribution of Point and its neighbor corners\n\t\t\tk3d::mesh::weights_t face_weights(face_indices.size(), neighbour_weight);\n\t\t\tface_indices.back() = output_idx;\n\t\t\tface_weights.back() = 1.0;\n\t\t\tm_point_attributes_mixer.copy(face_indices.size(), &face_indices[0], &face_weights[0], output_idx); // Contribution of the face vertices\n\t\t}\n\t\telse if(affected_edge_count != 0) // Boundary of the subdivided surface\n\t\t{\n\t\t\toutput_position *= 0.5;\n\t\t\tm_point_attributes_copier.copy(Point, m_corner_points[Point]);\n\t\t\tk3d::double_t boundary_weights[] = {0.5, 0.25};\n\t\t\tk3d::uint_t boundary_indices[] = {m_corner_points[Point], 0};\n\t\t\tfor(k3d::uint_t index = start_index; index != end_index; ++index)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t edge = out_edges[index];\n\t\t\t\t// we might also need to account for the counter-clockwise edge, since point_edges only stores outbound edges\n\t\t\t\tk3d::uint_t counter_clockwise = edge;\n\t\t\t\tfor(; ;)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t clockwise = m_mesh_arrays.clockwise_edges[counter_clockwise];\n\t\t\t\t\tif(clockwise == edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcounter_clockwise = clockwise;\n\t\t\t\t}\n\t\t\t\tif(m_mesh_arrays.companions[counter_clockwise] == counter_clockwise && m_mesh_arrays.is_affected(m_mesh_arrays.edge_faces[counter_clockwise]))\n\t\t\t\t{\n\t\t\t\t\toutput_position += 0.25 * k3d::to_vector(m_output_points[m_edge_midpoints[counter_clockwise]]);\n\t\t\t\t\tboundary_indices[1] = m_edge_midpoints[counter_clockwise];\n\t\t\t\t\tm_point_attributes_mixer.copy(2, boundary_indices, boundary_weights, m_corner_points[Point]);\n\t\t\t\t\tboundary_weights[0] = 1.0;\n\t\t\t\t}\n\t\t\t\tif(m_mesh_arrays.boundary(edge))\n\t\t\t\t{\n\t\t\t\t\toutput_position += 0.25 * k3d::to_vector(m_output_points[m_edge_midpoints[edge]]);\n\t\t\t\t\tboundary_indices[1] = m_edge_midpoints[edge];\n\t\t\t\t\tm_point_attributes_mixer.copy(2, boundary_indices, boundary_weights, m_corner_points[Point]);\n\t\t\t\t\tboundary_weights[0] = 1.0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nprivate:\n\tconst mesh_arrays& m_mesh_arrays;\n\tconst k3d::mesh::indices_t& m_input_edge_points;\n\tconst k3d::mesh::indices_t& m_corner_points;\n\tconst k3d::mesh::indices_t& m_edge_midpoints;\n\tconst k3d::mesh::indices_t& m_face_centers;\n\tconst std::vector<k3d::mesh::indices_t>& m_point_out_edges;\n\tconst k3d::mesh::points_t& m_input_points;\n\tk3d::mesh::points_t& m_output_points;\n\tk3d::table_copier& m_point_attributes_copier;\n\tk3d::table_copier& m_point_attributes_mixer;\n};\n\n/// Helper for TBB\nclass corner_worker\n{\npublic:\n\tcorner_worker(const k3d::mesh::indices_t& VertexPoints, corner_point_calculator& CornerCalculator) : m_vertex_points(VertexPoints), m_corner_calculator(CornerCalculator) {}\n\tvoid operator()(const k3d::parallel::blocked_range<k3d::uint_t>& range) const\n\t{\n\t\tconst k3d::uint_t point_begin = range.begin();\n\t\tconst k3d::uint_t point_end = range.end();\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tm_corner_calculator(m_vertex_points[point]);\n\t\t}\n\t}\nprivate:\n\tconst k3d::mesh::indices_t& m_vertex_points;\n\tcorner_point_calculator& m_corner_calculator;\n};\n\ntemplate<typename FunctorT>\nstruct worker\n{\n\tFunctorT& f;\n\tworker(FunctorT& F) : f(F) {}\n\tvoid operator()(const k3d::parallel::blocked_range<k3d::uint_t>& range) const\n\t{\n\t\tconst k3d::uint_t begin = range.begin();\n\t\tconst k3d::uint_t end = range.end();\n\t\tfor(k3d::uint_t i = begin; i != end; ++i)\n\t\t{\n\t\t\tf(i);\n\t\t}\n\t}\n};\n\n} // namespace detail\n\nclass catmull_clark_subdivider::implementation\n{\npublic:\n\timplementation(const k3d::uint_t Levels) :\n\t\tm_levels(Levels),\n\t\tm_intermediate_points(m_levels),\n\t\tm_intermediate_polyhedra(m_levels),\n\t\tm_intermediate_point_data(m_levels),\n\t\tm_topology_data(m_levels)\n\t{\n\t}\n\t\n\tvoid create_mesh(const k3d::mesh::points_t& InputPoints, const k3d::polyhedron::const_primitive& InputPolyhedron, const k3d::mesh::selection_t& InputFaceSelection, k3d::inode* Node)\n\t{\n\t\tfor(k3d::uint_t level = 0; level != m_levels; ++level)\n\t\t{\n\t\t\ttopology_data_t& topology_data = m_topology_data[level];\n\t\t\tconst k3d::mesh::points_t& input_points = level == 0 ? InputPoints : m_intermediate_points[level - 1];\n\t\t\tk3d::mesh points_mesh; // temporary mesh so we have the point count in a form that is compatible with the lookup functions in k3d::polyhedron\n\t\t\tpoints_mesh.points.create().resize(input_points.size());\n\t\t\tboost::scoped_ptr<const k3d::polyhedron::const_primitive> input_polyhedron_ptr(0);\n\t\t\tif (level != 0)\n\t\t\t{\n\t\t\t\tinput_polyhedron_ptr.reset(create_polyhedron_const_primitive(m_intermediate_polyhedra[level - 1]));\n\t\t\t}\n\t\t\tconst k3d::polyhedron::const_primitive& input_polyhedron = input_polyhedron_ptr.get() ? *input_polyhedron_ptr : InputPolyhedron;\n\t\t\tk3d::mesh::points_t& output_points = m_intermediate_points[level];\n\t\t\tpolyhedron& output_polyhedron = m_intermediate_polyhedra[level];\n\t\t\tconst k3d::mesh::selection_t& input_face_selection = level == 0 ? InputFaceSelection : input_polyhedron.face_selections;\n\t\t\t\n\t\t\t// Copy the unaffected constant data\n\t\t\toutput_polyhedron.constant_attributes = input_polyhedron.constant_attributes;\n\n\t\t\tconst k3d::uint_t input_edge_count = input_polyhedron.clockwise_edges.size();\n\t\t\tconst k3d::uint_t input_face_count = input_polyhedron.face_first_loops.size();\n\n\t\t\t// store some common arrays\n\t\t\tdetail::mesh_arrays mesh_arrays(input_face_selection,\n\t\t\t\t\tinput_polyhedron.face_first_loops,\n\t\t\t\t\tinput_polyhedron.face_loop_counts,\n\t\t\t\t\tinput_polyhedron.loop_first_edges,\n\t\t\t\t\tinput_polyhedron.clockwise_edges,\n\t\t\t\t\ttopology_data.edge_faces,\n\t\t\t\t\ttopology_data.companions);\n\n\t\t\t// Get the \"companion\" edge for each edge\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(input_polyhedron.vertex_points, input_polyhedron.clockwise_edges, boundary_edges, topology_data.companions);\n\t\t\tstd::vector<k3d::mesh::indices_t> point_faces;\n\t\t\tk3d::polyhedron::create_point_face_lookup(points_mesh, input_polyhedron, point_faces);\n\n\t\t\t// For each edge, get the face it belongs to\n\t\t\ttopology_data.edge_faces.resize(input_edge_count);\n\t\t\tk3d::polyhedron::create_edge_face_lookup(input_polyhedron, topology_data.edge_faces);\n\t\t\t// Count the number of components of the new mesh per old face\n\t\t\ttopology_data.face_subface_counts.resize(input_face_count);\n\t\t\tk3d::mesh::indices_t face_subloop_counts(input_face_count);\n\t\t\tk3d::mesh::indices_t face_edge_counts(input_face_count);\n\t\t\tk3d::mesh::indices_t face_point_counts(input_face_count);\n\t\t\tdetail::per_face_component_counter per_face_component_counter(mesh_arrays,\n\t\t\t\t\t\tinput_polyhedron.vertex_points,\n\t\t\t\t\t\tpoint_faces,\n\t\t\t\t\t\ttopology_data.face_subface_counts,\n\t\t\t\t\t\tface_subloop_counts,\n\t\t\t\t\t\tface_edge_counts,\n\t\t\t\t\t\tface_point_counts);\n\t\t\tk3d::parallel::parallel_for(\n\t\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, input_face_count, k3d::parallel::grain_size()),\n\t\t\t\tdetail::worker<detail::per_face_component_counter>(per_face_component_counter));\n\n\t\t\t// Turn these counts into cumulative sums\n\t\t\tdetail::cumulative_sum(topology_data.face_subface_counts);\n\t\t\tdetail::cumulative_sum(face_subloop_counts);\n\t\t\tdetail::cumulative_sum(face_edge_counts);\n\t\t\tdetail::cumulative_sum(face_point_counts);\n\t\t\t// We now have the following relationships between old and new geometry:\n\t\t\t// first new component index = ..._counts[old component index - 1]\n\t\t\t\n\t\t\ttopology_data.corner_points.resize(input_points.size(), 0);\n\t\t\ttopology_data.edge_midpoints.resize(input_polyhedron.vertex_points.size());\n\t\t\ttopology_data.face_centers.resize(input_polyhedron.face_first_loops.size());\n\t\t\tdetail::point_index_calculator point_index_calculator(mesh_arrays,\t\t\t\t\t\n\t\t\t\t\tinput_polyhedron.vertex_points,\n\t\t\t\t\tpoint_faces,\n\t\t\t\t\tface_point_counts,\n\t\t\t\t\ttopology_data.corner_points,\n\t\t\t\t\ttopology_data.edge_midpoints,\n\t\t\t\t\ttopology_data.face_centers);\n\t\t\tk3d::parallel::parallel_for(\n\t\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, input_face_count, k3d::parallel::grain_size()),\n\t\t\t\tdetail::worker<detail::point_index_calculator>(point_index_calculator));\n\t\t\t\t\t\n\t\t\t// Allocate required memory\n\t\t\toutput_points.resize(face_point_counts.back());\n\t\t\toutput_polyhedron.vertex_points.resize(face_edge_counts.back(), 0);\n\t\t\toutput_polyhedron.clockwise_edges.resize(face_edge_counts.back(), 0);\n\t\t\toutput_polyhedron.loop_first_edges.resize(face_subloop_counts.back());\n\t\t\toutput_polyhedron.face_first_loops.resize(topology_data.face_subface_counts.back());\n\t\t\toutput_polyhedron.face_loop_counts.resize(topology_data.face_subface_counts.back(), 1);\n\t\t\toutput_polyhedron.face_selections.resize(topology_data.face_subface_counts.back(), 0.0);\n\t\t\toutput_polyhedron.face_materials.resize(topology_data.face_subface_counts.back());\n\t\t\toutput_polyhedron.edge_attributes.set_row_count(face_edge_counts.back());\n\t\t\toutput_polyhedron.face_attributes.set_row_count(topology_data.face_subface_counts.back());\n\t\t\toutput_polyhedron.face_shells.resize(topology_data.face_subface_counts.back());\n\t\t\t\n\t\t\tdetail::topology_subdivider topology_subdivider(mesh_arrays,\n\t\t\t\t\tinput_polyhedron.vertex_points,\n\t\t\t\t\tinput_polyhedron.face_materials,\n\t\t\t\t\ttopology_data.face_subface_counts,\n\t\t\t\t\tface_subloop_counts,\n\t\t\t\t\tface_edge_counts,\n\t\t\t\t\ttopology_data.corner_points,\n\t\t\t\t\ttopology_data.edge_midpoints,\n\t\t\t\t\ttopology_data.face_centers,\n\t\t\t\t\tinput_polyhedron.face_shells,\n\t\t\t\t\toutput_polyhedron.vertex_points,\n\t\t\t\t\toutput_polyhedron.clockwise_edges,\n\t\t\t\t\toutput_polyhedron.loop_first_edges,\n\t\t\t\t\toutput_polyhedron.face_first_loops,\n\t\t\t\t\toutput_polyhedron.face_loop_counts,\n\t\t\t\t\toutput_polyhedron.face_materials,\n\t\t\t\t\toutput_polyhedron.face_selections,\n\t\t\t\t\toutput_polyhedron.face_shells);\n\t\t\t\n\t\t\t// Connect face centers to edge midpoints\n\t\t\tconst k3d::uint_t face_start = 0;\n\t\t\tconst k3d::uint_t face_end = face_start + input_polyhedron.face_shells.size();\n\t\t\tk3d::parallel::parallel_for(\n\t\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(face_start, face_end, k3d::parallel::grain_size()),\n\t\t\t\tdetail::worker<detail::topology_subdivider>(topology_subdivider));\n\n\t\t\t// Set the per-polyhedron arrays\n\t\t\toutput_polyhedron.shell_types = input_polyhedron.shell_types;\n\t\t\t\n\t\t\t// Update selection arrays\n\t\t\toutput_polyhedron.edge_selections.assign(output_polyhedron.vertex_points.size(), 0.0);\n\t\t\t\n\t\t\t// Calculate vertex valences, needed for corner point updates.\n\t\t\tk3d::polyhedron::create_point_out_edge_lookup(points_mesh, input_polyhedron, topology_data.point_out_edges);\n\n\t\t\t// Assign a default vertex selection\n\t\t\toutput_polyhedron.vertex_selections = input_polyhedron.vertex_selections;\n\t\t\toutput_polyhedron.vertex_selections.assign(output_polyhedron.vertex_points.size(), 0.0);\n\t\t}\n\t}\n\t\n\tvoid update_mesh(const k3d::mesh::points_t& InputPoints, const k3d::polyhedron::const_primitive& InputPolyhedron, const k3d::table& InputPointData, const k3d::mesh::selection_t& InputFaceSelection, k3d::inode* Node)\n\t{\n\t\tfor(k3d::uint_t level = 0; level != m_levels; ++level)\n\t\t{\n\t\t\ttopology_data_t& topology_data = m_topology_data[level];\n\t\t\tconst k3d::mesh::points_t& input_points = level == 0 ? InputPoints : m_intermediate_points[level - 1];\n\t\t\tboost::scoped_ptr<const k3d::polyhedron::const_primitive> input_polyhedron_ptr(0);\n\t\t\tif (level != 0)\n\t\t\t{\n\t\t\t\tinput_polyhedron_ptr.reset(create_polyhedron_const_primitive(m_intermediate_polyhedra[level - 1]));\n\t\t\t}\n\t\t\tconst k3d::polyhedron::const_primitive& input_polyhedron = input_polyhedron_ptr.get() ? *input_polyhedron_ptr : InputPolyhedron;\n\t\t\tconst k3d::table& input_point_data = level == 0 ? InputPointData : m_intermediate_point_data[level - 1];\n\t\t\tk3d::mesh::points_t& output_points = m_intermediate_points[level];\n\t\t\tpolyhedron& output_polyhedron = m_intermediate_polyhedra[level];\n\t\t\tk3d::table& output_point_data = m_intermediate_point_data[level];\n\t\t\tconst k3d::mesh::selection_t& input_face_selection = level == 0 ? InputFaceSelection : input_polyhedron.face_selections;\n\t\t\n\t\t\tconst k3d::uint_t face_count = input_polyhedron.face_first_loops.size();\n\t\t\t\n\t\t\t// store some common arrays\n\t\t\tdetail::mesh_arrays mesh_arrays(input_face_selection,\n\t\t\t\t\tinput_polyhedron.face_first_loops,\n\t\t\t\t\tinput_polyhedron.face_loop_counts,\n\t\t\t\t\tinput_polyhedron.loop_first_edges,\n\t\t\t\t\tinput_polyhedron.clockwise_edges,\n\t\t\t\t\ttopology_data.edge_faces,\n\t\t\t\t\ttopology_data.companions\n\t\t\t\t\t);\n\t\t\t\n\t\t\t// Create copiers for the uniform and varying data\n\t\t\toutput_polyhedron.face_attributes = input_polyhedron.face_attributes.clone_types();\n\t\t\toutput_polyhedron.edge_attributes = input_polyhedron.edge_attributes.clone_types();\n\t\t\toutput_polyhedron.vertex_attributes = input_polyhedron.vertex_attributes.clone_types();\n\t\t\toutput_point_data = input_point_data.clone_types();\n\t\t\toutput_polyhedron.face_attributes.set_row_count(output_polyhedron.face_first_loops.size());\n\t\t\toutput_polyhedron.edge_attributes.set_row_count(output_polyhedron.vertex_points.size());\n\t\t\toutput_polyhedron.vertex_attributes.set_row_count(output_polyhedron.vertex_points.size());\n\t\t\toutput_point_data.set_row_count(output_points.size());\n\t\t\tk3d::table_copier face_attributes_copier(input_polyhedron.face_attributes, output_polyhedron.face_attributes);\n\t\t\tk3d::table_copier edge_attributes_copier(input_polyhedron.edge_attributes, output_polyhedron.edge_attributes);\n\t\t\tk3d::table_copier vertex_attributes_copier(input_polyhedron.vertex_attributes, output_polyhedron.vertex_attributes);\n\t\t\tk3d::table_copier point_data_copier(input_point_data, output_point_data);\n\t\t\tk3d::table_copier point_data_mixer(output_point_data, output_point_data);\n\t\n\t\t\toutput_points.assign(output_points.size(), k3d::point3(0,0,0));\n\n\t\t\t// Calculate face centers\n\t\t\tdetail::face_center_calculator face_center_calculator(\n\t\t\t\t\tmesh_arrays,\n\t\t\t\t\tinput_polyhedron.vertex_points,\n\t\t\t\t\toutput_polyhedron.face_first_loops,\n\t\t\t\t\toutput_polyhedron.loop_first_edges,\n\t\t\t\t\toutput_polyhedron.clockwise_edges,\n\t\t\t\t\ttopology_data.face_centers,\n\t\t\t\t\ttopology_data.face_subface_counts,\n\t\t\t\t\tinput_points,\n\t\t\t\t\toutput_points,\n\t\t\t\t\tface_attributes_copier,\n\t\t\t\t\tedge_attributes_copier,\n\t\t\t\t\tvertex_attributes_copier,\n\t\t\t\t\tpoint_data_copier);\n\t\t\tk3d::parallel::parallel_for(\n\t\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, face_count, k3d::parallel::grain_size()),\n\t\t\t\tdetail::worker<detail::face_center_calculator>(face_center_calculator));\n\t\n\t\t\t// Calculate edge midpoints\n\t\t\tdetail::edge_midpoint_calculator edge_midpoint_calculator(\n\t\t\t\t\tmesh_arrays,\n\t\t\t\t\tinput_polyhedron.vertex_points,\n\t\t\t\t\toutput_polyhedron.face_first_loops,\n\t\t\t\t\toutput_polyhedron.loop_first_edges,\n\t\t\t\t\toutput_polyhedron.clockwise_edges,\n\t\t\t\t\ttopology_data.edge_midpoints,\n\t\t\t\t\ttopology_data.face_centers,\n\t\t\t\t\ttopology_data.face_subface_counts,\n\t\t\t\t\tinput_points,\n\t\t\t\t\toutput_points,\n\t\t\t\t\tedge_attributes_copier,\n\t\t\t\t\tvertex_attributes_copier,\n\t\t\t\t\tpoint_data_copier,\n\t\t\t\t\tpoint_data_mixer);\n\t\t\tk3d::parallel::parallel_for(\n\t\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, face_count, k3d::parallel::grain_size()),\n\t\t\t\tdetail::worker<detail::edge_midpoint_calculator>(edge_midpoint_calculator));\n\n\t\t\t// Calculate new point positions\n\t\t\tdetail::corner_point_calculator corner_point_calculator(\n\t\t\t\t\tmesh_arrays,\n\t\t\t\t\tinput_polyhedron.vertex_points,\n\t\t\t\t\ttopology_data.corner_points,\n\t\t\t\t\ttopology_data.edge_midpoints,\n\t\t\t\t\ttopology_data.face_centers,\n\t\t\t\t\ttopology_data.point_out_edges,\n\t\t\t\t\tinput_points,\n\t\t\t\t\toutput_points,\n\t\t\t\t\tpoint_data_copier,\n\t\t\t\t\tpoint_data_mixer);\n\t\t\tconst k3d::uint_t points_begin = 0;\n\t\t\tconst k3d::uint_t points_end = input_polyhedron.vertex_points.size();\n\t\t\tk3d::parallel::parallel_for(\n\t\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(points_begin, points_end, k3d::parallel::grain_size()),\n\t\t\t\tdetail::corner_worker(input_polyhedron.vertex_points, corner_point_calculator));\n\t\t}\n\t}\n\t\n\tvoid copy_output(k3d::mesh::points_t& Points, k3d::polyhedron::primitive& Polyhedron, k3d::table& PointData)\n\t{\n\t\tconst k3d::uint_t point_offset = Points.size();\n\t\tconst k3d::mesh::points_t& new_points = m_intermediate_points[m_levels - 1];\n\t\tconst k3d::uint_t new_point_count = new_points.size();\n\t\tPoints.resize(point_offset + new_point_count);\n\t\tstd::copy(new_points.begin(), new_points.end(), Points.begin() + point_offset);\n\t\tcopy_output_polyhedron(m_intermediate_polyhedra[m_levels - 1], Polyhedron, point_offset);\n\t\tk3d::table_copier point_copier(m_intermediate_point_data[m_levels - 1], PointData);\n\t\tfor(k3d::uint_t i = 0; i != new_point_count; ++i)\n\t\t\tpoint_copier.push_back(i);\n\t}\n\t\n\tvoid visit_surface(const k3d::uint_t Level, ipatch_surface_visitor& Visitor) const\n\t{\n\t\tk3d::uint_t last_count = 0;\n\t\tfor(k3d::uint_t face = 0; face != m_topology_data[0].face_subface_counts.size(); ++face)\n\t\t{\n\t\t\tconst k3d::uint_t face_count = m_topology_data[0].face_subface_counts[face]; \n\t\t\tif(face_count - last_count > 1)\n\t\t\t{\n\t\t\t\tVisitor.start_face(face);\n\t\t\t\tvisit_subfacets(Level, 0, face, Visitor);\n\t\t\t\tVisitor.finish_face(face);\n\t\t\t}\n\t\t\tlast_count = face_count;\n\t\t}\n\t}\n\t\n\tvoid visit_boundary(const k3d::polyhedron::const_primitive& Polyhedron, const k3d::uint_t Level, ipatch_boundary_visitor& Visitor) const\n\t{\n\t\tconst k3d::uint_t edge_count = m_topology_data[0].edge_midpoints.size();\n\t\tconst k3d::mesh::indices_t& input_edge_points = Polyhedron.vertex_points;\n\t\tconst k3d::mesh::indices_t& input_clockwise_edges = Polyhedron.clockwise_edges;\n\t\tfor(k3d::uint_t edge = 0; edge != edge_count; ++edge)\n\t\t{\n\t\t\tVisitor.start_edge(edge);\n\t\t\tk3d::uint_t c0 = input_edge_points[edge];\n\t\t\tk3d::uint_t c1 = input_edge_points[input_clockwise_edges[edge]];\n\t\t\tk3d::uint_t first_edge = edge;\n\t\t\tfor(k3d::uint_t level = 0; level != Level - 1; ++level)\n\t\t\t{\n\t\t\t\tc0 = m_topology_data[level].corner_points[c0];\n\t\t\t\tc1 = m_topology_data[level].corner_points[c1];\n\t\t\t\tconst k3d::uint_t midpoint = m_topology_data[level].edge_midpoints[first_edge];\n\t\t\t\tconst k3d::mesh::indices_t& point_edges = m_topology_data[level+1].point_out_edges[c0];\n\t\t\t\tconst k3d::uint_t point_edge_begin = 0;\n\t\t\t\tconst k3d::uint_t point_edge_end = point_edges.size();\n\t\t\t\tconst polyhedron& polyhedron_at_level = m_intermediate_polyhedra[level];\n\t\t\t\tconst k3d::mesh::indices_t& edge_points = polyhedron_at_level.vertex_points;\n\t\t\t\tconst k3d::mesh::indices_t& clockwise_edges = polyhedron_at_level.clockwise_edges;\n\t\t\t\tfor(k3d::uint_t point_edge_index = point_edge_begin; point_edge_index != point_edge_end; ++point_edge_index)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t point_edge = point_edges[point_edge_index];\n\t\t\t\t\tif(edge_points[clockwise_edges[point_edge]] == midpoint)\n\t\t\t\t\t{\n\t\t\t\t\t\tfirst_edge = point_edge;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst polyhedron& polyhedron_at_level = m_intermediate_polyhedra[Level - 2];\n\t\t\tconst k3d::mesh::indices_t& edge_points = polyhedron_at_level.vertex_points;\n\t\t\tconst k3d::mesh::indices_t& clockwise_edges = polyhedron_at_level.clockwise_edges;\n\t\t\tconst k3d::mesh::indices_t& corner_points = m_topology_data[Level-1].corner_points;\n\t\t\tconst k3d::mesh::indices_t& edge_midpoints = m_topology_data[Level-1].edge_midpoints;\n\t\t\tconst k3d::mesh::indices_t& companions = m_topology_data[Level-1].companions;\n\t\t\tconst k3d::mesh::points_t& points = m_intermediate_points[Level-1];\n\t\t\treturn_if_fail(edge_points[first_edge] == c0);\n\t\t\tfor(k3d::uint_t subedge = first_edge; ;)\n\t\t\t{ \n\t\t\t\tVisitor.add_vertex(points[corner_points[edge_points[subedge]]]);\n\t\t\t\tVisitor.add_vertex(points[edge_midpoints[subedge]]);\n\t\t\t\t\n\t\t\t\tif(edge_points[clockwise_edges[subedge]] == c1)\n\t\t\t\t\tbreak;\n\t\t\t\tsubedge = clockwise_edges[companions[clockwise_edges[subedge]]];\n\t\t\t}\n\t\t\tVisitor.finish_edge(edge);\n\t\t}\n\t}\n\t\n\tvoid visit_corners(const k3d::uint_t Level, ipatch_corner_visitor& Visitor) const\n\t{\n\t\tconst k3d::uint_t point_count = m_topology_data[0].corner_points.size();\n\t\tfor(k3d::uint_t point = 0; point != point_count; ++point)\n\t\t{\n\t\t\tk3d::uint_t corner = point;\n\t\t\tfor(k3d::uint_t level = 0; level != Level; ++level)\n\t\t\t{\n\t\t\t\tcorner = m_topology_data[level].corner_points[corner];\n\t\t\t}\n\t\t\tVisitor.add_vertex(m_intermediate_points[Level-1].at(corner));\n\t\t}\n\t}\n\t\n\tconst k3d::mesh::points_t& points(const k3d::uint_t Level) const\n\t{\n\t\treturn m_intermediate_points[Level - 1];\n\t}\n\n\tconst k3d::mesh::normals_t& point_normals(const k3d::uint_t Level) const\n\t{\n\t\tconst k3d::table& point_data = m_intermediate_point_data[Level - 1];\n\t\tconst k3d::mesh::normals_t* normals = point_data.lookup<k3d::mesh::normals_t>(\"sds_normals\");\n\t\tif(!normals)\n\t\t\tthrow std::runtime_error(\"sds::catmull_clark_subdivider: mesh did not have normals\");\n\t\treturn *normals;\n\t}\n\nprivate:\n\t/// Used to recurse through levels to associate an original face with its subfaces\n\tvoid visit_subfacets(const k3d::uint_t MaxLevel, const k3d::uint_t Level, const k3d::uint_t Face, ipatch_surface_visitor& Visitor) const\n\t{\n\t\tconst k3d::uint_t face_begin = Face == 0 ? 0 : m_topology_data[Level].face_subface_counts[Face - 1];\n\t\tconst k3d::uint_t face_end = m_topology_data[Level].face_subface_counts[Face];\n\t\tif(Level < MaxLevel - 1)\n\t\t{\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\tvisit_subfacets(MaxLevel, Level + 1, face, Visitor);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tk3d::uint_t corners[4];\n\t\t\tconst polyhedron& polyhedron_at_level = m_intermediate_polyhedra[Level];\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_edge = polyhedron_at_level.loop_first_edges[polyhedron_at_level.face_first_loops[face]];\n\t\t\t\tk3d::uint_t corner = 0;\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t{\n\t\t\t\t\treturn_if_fail(corner < 4);\n\t\t\t\t\tcorners[corner++] = polyhedron_at_level.vertex_points[edge];\n\t\t\t\t\t\n\t\t\t\t\tedge = polyhedron_at_level.clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tVisitor.add_quad(corners[0], corners[1], corners[2], corners[3]);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/// Some arrays containing additional topology data\n\tstruct topology_data_t\n\t{\n\t\tk3d::mesh::indices_t corner_points; // New point index, for each original point\n\t\tk3d::mesh::indices_t edge_midpoints; // Midpoint index for each edge (if any)\n\t\tk3d::mesh::indices_t face_centers; // Face center index, for each face (if any)\n\t\tk3d::mesh::indices_t companions; // Companion edges\n\t\tk3d::mesh::indices_t edge_faces; // For each original edge, the original owning face\n\t\tstd::vector<k3d::mesh::indices_t> point_out_edges; // Outgoing edge adjacency list\n\t\tk3d::mesh::counts_t face_subface_counts; // Cumulative subface count for each input face (needed to copy uniform and face varying data)\n\t};\n\t\n\tstruct polyhedron\n\t{\n\t\tk3d::typed_array<int32_t> shell_types;\n\t\tk3d::mesh::indices_t face_shells;\n\t\tk3d::mesh::indices_t face_first_loops;\n\t\tk3d::mesh::counts_t face_loop_counts;\n\t\tk3d::mesh::selection_t face_selections;\n\t\tk3d::mesh::materials_t face_materials;\n\t\tk3d::mesh::indices_t loop_first_edges;\n\t\tk3d::mesh::indices_t clockwise_edges;\n\t\tk3d::mesh::selection_t edge_selections;\n\t\tk3d::mesh::indices_t vertex_points;\n\t\tk3d::mesh::selection_t vertex_selections;\n\t\tk3d::mesh::table_t constant_attributes;\n\t\tk3d::mesh::table_t face_attributes;\n\t\tk3d::mesh::table_t edge_attributes;\n\t\tk3d::mesh::table_t vertex_attributes;\n\t};\n\t\n\tk3d::polyhedron::const_primitive* create_polyhedron_const_primitive(const polyhedron& Polyhedron)\n\t{\n\t\treturn new k3d::polyhedron::const_primitive(\n\t\t\t\tPolyhedron.shell_types,\n\t\t\t\tPolyhedron.face_shells,\n\t\t\t\tPolyhedron.face_first_loops,\n\t\t\t\tPolyhedron.face_loop_counts,\n\t\t\t\tPolyhedron.face_selections,\n\t\t\t\tPolyhedron.face_materials,\n\t\t\t\tPolyhedron.loop_first_edges,\n\t\t\t\tPolyhedron.clockwise_edges,\n\t\t\t\tPolyhedron.edge_selections,\n\t\t\t\tPolyhedron.vertex_points,\n\t\t\t\tPolyhedron.vertex_selections,\n\t\t\t\tPolyhedron.constant_attributes,\n\t\t\t\tPolyhedron.face_attributes,\n\t\t\t\tPolyhedron.edge_attributes,\n\t\t\t\tPolyhedron.vertex_attributes\n\t\t\t\t);\n\t}\n\t\n\ttemplate<typename ArrayT>\n\tvoid copy_array(const ArrayT& Source, ArrayT& Destination)\n\t{\n\t\tDestination.resize(Source.size());\n\t\tstd::copy(Source.begin(), Source.end(), Destination.begin());\n\t}\n\t\n\tvoid copy_output_polyhedron(const polyhedron& Input, k3d::polyhedron::primitive& Output, const k3d::uint_t PointOffset)\n\t{\n\t\tcopy_array(Input.shell_types, Output.shell_types);\n\t\tcopy_array(Input.face_shells, Output.face_shells);\n\t\tcopy_array(Input.face_first_loops, Output.face_first_loops);\n\t\tcopy_array(Input.face_loop_counts, Output.face_loop_counts);\n\t\tcopy_array(Input.face_selections, Output.face_selections);\n\t\tcopy_array(Input.face_materials, Output.face_materials);\n\t\tcopy_array(Input.loop_first_edges, Output.loop_first_edges);\n\t\tOutput.vertex_points.resize(Input.vertex_points.size());\n\t\tfor(k3d::uint_t i = 0; i != Input.vertex_points.size(); ++i)\n\t\t\tOutput.vertex_points[i] = (Input.vertex_points[i] + PointOffset);\n\t\tcopy_array(Input.clockwise_edges, Output.clockwise_edges);\n\t\tcopy_array(Input.edge_selections, Output.edge_selections);\n\t\tOutput.constant_attributes = Input.constant_attributes;\n\t\tOutput.face_attributes = Input.face_attributes;\n\t\tOutput.edge_attributes = Input.edge_attributes;\n\t\tOutput.vertex_attributes = Input.vertex_attributes;\n\t\tOutput.vertex_selections = Input.vertex_selections;\n\t}\n\t\n\tconst k3d::uint_t m_levels; // The number of SDS levels to create\n\ttypedef std::vector<k3d::mesh::points_t> points_t;\n\ttypedef std::vector<polyhedron> polyhedra_t;\n\ttypedef std::vector<k3d::table> arrays_t;\n\tpoints_t m_intermediate_points;\n\tpolyhedra_t m_intermediate_polyhedra;\n\tarrays_t m_intermediate_point_data;\n\tstd::vector<topology_data_t> m_topology_data;\n};\n\ncatmull_clark_subdivider::catmull_clark_subdivider(const k3d::uint_t Levels)\n{\n\tm_implementation = new implementation(Levels);\n}\n\ncatmull_clark_subdivider::~catmull_clark_subdivider()\n{\n\tdelete m_implementation;\n}\n\nvoid catmull_clark_subdivider::set_levels(const k3d::uint_t Levels)\n{\n\tif(m_implementation)\n\t\tdelete m_implementation;\n\tm_implementation = new implementation(Levels);\n}\n\nvoid catmull_clark_subdivider::create_mesh(const k3d::mesh::points_t& InputPoints, const k3d::polyhedron::const_primitive& InputPolyhedron, const k3d::mesh::selection_t& InputFaceSelection, k3d::inode* Node)\n{\n\tm_implementation->create_mesh(InputPoints, InputPolyhedron, InputFaceSelection, Node);\n}\n\nvoid catmull_clark_subdivider::update_mesh(const k3d::mesh::points_t& InputPoints, const k3d::polyhedron::const_primitive& InputPolyhedron, const k3d::table& InputPointData, const k3d::mesh::selection_t& InputFaceSelection, k3d::inode* Node)\n{\n\tm_implementation->update_mesh(InputPoints, InputPolyhedron, InputPointData, InputFaceSelection, Node);\n}\n\nvoid catmull_clark_subdivider::copy_output(k3d::mesh::points_t& Points, k3d::polyhedron::primitive& Polyhedron, k3d::table& PointData)\n{\n\tm_implementation->copy_output(Points, Polyhedron, PointData);\n}\n\nvoid catmull_clark_subdivider::visit_surface(const k3d::uint_t Level, ipatch_surface_visitor& Visitor) const\n{\n\tm_implementation->visit_surface(Level, Visitor);\n}\n\nvoid catmull_clark_subdivider::visit_boundary(const k3d::polyhedron::const_primitive Polyhedron, const k3d::uint_t Level, ipatch_boundary_visitor& Visitor) const\n{\n\tm_implementation->visit_boundary(Polyhedron, Level, Visitor);\n}\n\nvoid catmull_clark_subdivider::visit_corners(const k3d::uint_t Level, ipatch_corner_visitor& Visitor) const\n{\n\tm_implementation->visit_corners(Level, Visitor);\n}\n\nconst k3d::mesh::points_t& catmull_clark_subdivider::points(const k3d::uint_t Level) const\n{\n\treturn m_implementation->points(Level);\n}\n\nconst k3d::mesh::normals_t& catmull_clark_subdivider::point_normals(const k3d::uint_t Level) const\n{\n\treturn m_implementation->point_normals(Level);\n}\n\n} // namespace sds\n\n} // namespace k3d\n"
  },
  {
    "path": "k3dsdk/subdivision_surface/catmull_clark.h",
    "content": "#ifndef K3DSDK_SUBDIVISION_SURFACE_CATMULL_CLARK_H\n#define K3DSDK_SUBDIVISION_SURFACE_CATMULL_CLARK_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file catmull_clark.h\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n\t\t\\created Feb 18, 2009\n*/\n\n#include <k3dsdk/inode.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/types.h>\n\n#include <boost/ptr_container/ptr_vector.hpp>\n\nnamespace k3d\n{\n\nclass point3;\nclass normal3;\n\nnamespace sds\n{\n\n/// Visitor used to collect information about the SDS surface\n/**\n * Note: required information about points and normals is available through k3d::sds::catmull_clark_subdivider::points and ...point_normals.\n */\nclass ipatch_surface_visitor\n{\npublic:\n\t/// Called at the start of each patch (corresponding to a face on the original mesh) traversal\n\tvirtual void start_face(const k3d::uint_t Face) = 0;\n\t\n\t/// Passes the corner indices for all quads that make up the subdivided surface\n\tvirtual void add_quad(const k3d::uint_t P1, const k3d::uint_t P2, const k3d::uint_t P3, const k3d::uint_t P4) = 0;\n\t\n\t/// Called when we are finished iterating through a face's subfacets\n\tvirtual void finish_face(const k3d::uint_t Face) = 0;\n\nprotected:\n\tipatch_surface_visitor() {}\n\tipatch_surface_visitor(const ipatch_surface_visitor&) {}\n\tvirtual ~ipatch_surface_visitor() {}\n\tipatch_surface_visitor& operator=(const ipatch_surface_visitor&) { return *this; }\n};\n\n/// Visitor used to collect information about the patch boundaries of the SDS surface\nclass ipatch_boundary_visitor\n{\npublic:\n\t/// Called at the start of each boundary, corresponding to an edge on the original mesh\n\tvirtual void start_edge(const k3d::uint_t Edge) = 0;\n\n\t/// Called at the end of each boundary, corresponding to an edge on the original mesh\n\tvirtual void finish_edge(const k3d::uint_t Edge) = 0;\n\t\n\t/// Called for each point on the patch boundaries\n\tvirtual void add_vertex(const k3d::point3& Point) = 0;\n\t\nprotected:\n\tipatch_boundary_visitor() {}\n\tipatch_boundary_visitor(const ipatch_boundary_visitor&) {}\n\tvirtual ~ipatch_boundary_visitor() {}\n\tipatch_boundary_visitor& operator=(const ipatch_boundary_visitor&) { return *this; }\n};\n\n/// Visitor used to collect information about patch corners of the SDS surface\nclass ipatch_corner_visitor\n{\npublic:\n\t/// Called for each patch corner, corresponding to a vertex of the original mesh\n\tvirtual void add_vertex(const k3d::point3& Point) = 0;\n\t\nprotected:\n\tipatch_corner_visitor() {}\n\tipatch_corner_visitor(const ipatch_corner_visitor&) {}\n\tvirtual ~ipatch_corner_visitor() {}\n\tipatch_corner_visitor& operator=(const ipatch_corner_visitor&) { return *this; }\n};\n\n/// Stores a hierarchy of Catmull-Clark levels, and provides methods to create and update this hierarchy\nclass catmull_clark_subdivider\n{\n\ttypedef std::vector<k3d::mesh::points_t> points_t;\n\ttypedef boost::ptr_vector<k3d::polyhedron::primitive> polyhedra_t;\npublic:\n\t/// Create an empty Catmull-Clark mesh hierarchy with the given number of levels.\n\tcatmull_clark_subdivider(const k3d::uint_t Levels = 2);\n\t\n\t~catmull_clark_subdivider();\n\t\n\t/// Set the number of SDS levels (rebuilds the cache)\n\tvoid set_levels(const k3d::uint_t Levels);\n\t\n\t/// Creates the topology of the hierarchy, with the final level being in Output\n\t/**\n\t * Note: the Node is passed in order to enable pipeline profiling\n\t */\n\tvoid create_mesh(const k3d::mesh::points_t& InputPoints, const k3d::polyhedron::const_primitive& InputPolyhedron, const k3d::mesh::selection_t& InputFaceSelection, k3d::inode* Node = 0);\n\t\n\t/// Updates the point coordinates throughout the hierarchy, with the final level in Output\n\t/**\n\t * Note: the Node is passed in order to enable pipeline profiling\n\t */\n\tvoid update_mesh(const k3d::mesh::points_t& InputPoints, const k3d::polyhedron::const_primitive& InputPolyhedron, const k3d::table& InputVertexData, const k3d::mesh::selection_t& InputFaceSelection, k3d::inode* Node = 0);\n\t\n\t/// Stores the subdivided mesh in the provided structures\n\tvoid copy_output(k3d::mesh::points_t& Points, k3d::polyhedron::primitive& Polyhedron, k3d::table& VertexData);\n\t\n\t/// Visit the data representing the SDS patch surface\n\tvoid visit_surface(const k3d::uint_t Level, ipatch_surface_visitor& Visitor) const;\n\t\n\t/// Visit the data representing the SDS patch boundaries, using the given source mesh (needed for topology info)\n\tvoid visit_boundary(const k3d::polyhedron::const_primitive Polyhedron, const k3d::uint_t Level, ipatch_boundary_visitor& Visitor) const;\n\t\n\t/// Visit the data representing the patch corners\n\tvoid visit_corners(const k3d::uint_t Level, ipatch_corner_visitor& Visitor) const;\n\t\n\t/// Returns the array of surface points at the given level\n\tconst k3d::mesh::points_t& points(const k3d::uint_t Level) const;\n\n\t/// Returns the array of point normals at the given level, or throws an exception if it doesn't exist\n\tconst k3d::mesh::normals_t& point_normals(const k3d::uint_t Level) const;\n\n\nprivate:\n\tclass implementation;\n\timplementation* m_implementation;\n};\n\n} // namespace sds\n\n} // namespace k3d\n\n#endif // !K3DSDK_SUBDIVISION_SURFACE_CATMULL_CLARK_H\n"
  },
  {
    "path": "k3dsdk/system.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements system related functions\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <errno.h>\n#include <k3dsdk/path.h>\n#include <k3d-platform-config.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/string_modifiers.h>\n#include <k3dsdk/system.h>\n\n#include <glibmm/spawn.h>\n\n#include <boost/tokenizer.hpp>\n\n#include <cmath>\n#include <cstring>\n\n#include <sys/stat.h>\n\n// Define some platform-specific odds-and-ends\n#if defined K3D_API_WIN32\n\n\t#define SEARCHPATH_SEPARATOR_STRING \";\"\n\t#define DEFAULT_TEMP_DIRECTORY \"c:\\\\\"\n\t#define DEFAULT_HOME_DIRECTORY \"c:\\\\\"\n\t#define popen _popen\n\n\t#include <k3dsdk/win32.h>\n\t#include <io.h>\n\n#else // K3D_API_WIN32\n\n\t#define SEARCHPATH_SEPARATOR_STRING \":\"\n\t#define DEFAULT_TEMP_DIRECTORY \"/tmp\"\n\t#define DEFAULT_HOME_DIRECTORY \"/\"\n\n\t#include <time.h>\n\t#include <unistd.h>\n\n#endif // !K3D_API_WIN32\n\n#if defined K3D_API_DARWIN\n\n\t#include <mach-o/dyld.h>\n\n#endif // K3D_API_DARWIN\n\nnamespace k3d\n{\n\nnamespace system\n{\n\nstatic filesystem::path g_executable_path;\n\nvoid initialize_executable_path(int argc, char* argv[])\n{\n#if defined K3D_API_WIN32\n\n\tstring_t buffer(256, '\\0');\n\tGetModuleFileName(0, const_cast<char*>(buffer.data()), buffer.size());\n\tbuffer.resize(strlen(buffer.c_str()));\n\tg_executable_path = filesystem::native_path(ustring::from_utf8(buffer));\n\treturn;\n\n#elif defined K3D_API_DARWIN\n\n\tstring_t buffer;\n\tuint32_t buffer_size = 0;\n\t_NSGetExecutablePath(const_cast<char*>(buffer.data()), &buffer_size);\n\tbuffer.resize(buffer_size);\n\t_NSGetExecutablePath(const_cast<char*>(buffer.data()), &buffer_size);\n\tg_executable_path = filesystem::native_path(ustring::from_utf8(buffer));\n\treturn;\n\n#else\n\t// Linux ...\n\tif(exists(filesystem::native_path(ustring::from_utf8(\"/proc/self/exe\"))))\n\t{\n\t\tstring_t buffer(256, '\\0');\n\t\treadlink(\"/proc/self/exe\", const_cast<char*>(buffer.data()), buffer.size());\n\t\tg_executable_path = filesystem::native_path(ustring::from_utf8(buffer));\n\t\treturn;\n\t}\n\n\t// BSD ...\n\tif(exists(filesystem::native_path(ustring::from_utf8(\"/proc/curproc/file\"))))\n\t{\n\t\tstring_t buffer(256, '\\0');\n\t\treadlink(\"/proc/curproc/file\", const_cast<char*>(buffer.data()), buffer.size());\n\t\tg_executable_path = filesystem::native_path(ustring::from_utf8(buffer));\n\t\treturn;\n\t}\n#endif\n}\n\nconst filesystem::path executable_path()\n{\n\tif(g_executable_path.empty())\n\t\tlog() << warning << \"Uninitialized executable path ... did you forget to call initialize_executable_path(...) at startup?\" << std::endl;\n\n\treturn g_executable_path;\n}\n\nconst string_t getenv(const string_t& Variable)\n{\n\tif(const char* variable = ::getenv(Variable.c_str()))\n\t\treturn string_t(variable);\n\n\treturn string_t();\n}\n\nvoid setenv(const string_t& Name, const string_t& Value)\n{\n#ifdef K3D_API_WIN32\n\n\t// Use putenv on Win32 because it's the only thing available, and it copies its inputs\n\t::putenv((Name + \"=\" + Value).c_str());\n\n#else // K3D_API_WIN32\n\n\t// Use setenv where possible because it copies its inputs\n\t::setenv(Name.c_str(), Value.c_str(), true);\n\n#endif // !K3D_API_WIN32\n}\n\nvoid setenv(const string_t& Variable)\n{\n#ifdef K3D_API_WIN32\n\n\t// Use putenv on Win32 because it's the only thing available, and it copies its inputs\n\t::putenv(Variable.c_str());\n\n#else // K3D_API_WIN32\n\n\t// On unix, we have to make a copy of the string to pass to putenv()\n\t::putenv(::strdup(Variable.c_str()));\n\n#endif // !K3D_API_WIN32\n}\n\nconst filesystem::path get_home_directory()\n{\n\tstatic filesystem::path home;\n\n#ifdef K3D_API_WIN32\n\n\tif(home.empty())\n\t\thome = filesystem::native_path(ustring::from_utf8(getenv(\"APPDATA\")));\n\n\tif(home.empty())\n\t\thome = filesystem::native_path(ustring::from_utf8(getenv(\"USERPROFILE\")));\n\n#endif // K3D_API_WIN32\n\n\tif(home.empty())\n\t\thome = filesystem::native_path(ustring::from_utf8(getenv(\"HOME\")));\n\n\tif(home.empty())\n\t{\n\t\thome = filesystem::native_path(ustring::from_utf8(DEFAULT_HOME_DIRECTORY));\n\t\tlog() << warning << \"Using default home directory [\" << home.native_console_string() << \"]\" << std::endl;\n\t}\n\n\treturn home;\n}\n\nconst filesystem::path get_temp_directory()\n{\n\tstatic filesystem::path temp_directory;\n\n\tif(temp_directory.empty())\n\t{\n\t\tif(!getenv(\"TMPDIR\").empty())\n\t\t{\n\t\t\ttemp_directory = filesystem::native_path(ustring::from_utf8(getenv(\"TMPDIR\")));\n\t\t}\n\t\telse if(!getenv(\"TMP\").empty())\n\t\t{\n\t\t\ttemp_directory = filesystem::native_path(ustring::from_utf8(getenv(\"TMP\")));\n\t\t}\n\t\telse if(!getenv(\"TEMP\").empty())\n\t\t{\n\t\t\ttemp_directory = filesystem::native_path(ustring::from_utf8(getenv(\"TEMP\")));\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttemp_directory = filesystem::native_path(ustring::from_utf8(DEFAULT_TEMP_DIRECTORY));\n\t\t}\n\t}\n\n\treturn temp_directory;\n}\n\nconst filesystem::path find_executable(const string_t& Executable)\n{\n\tconst string_t executable_name = k3d::system::executable_name(Executable);\n\n\tfilesystem::path result;\n\n\tconst filesystem::path_list paths = filesystem::split_native_paths(ustring::from_utf8(system::getenv(\"PATH\")));\n\tfor(filesystem::path_list::const_iterator path = paths.begin(); path != paths.end(); ++path)\n\t{\n\t\tconst filesystem::path test_path = (*path) / filesystem::generic_path(ustring::from_utf8(executable_name));\n\t\tif(filesystem::exists(test_path))\n\t\t{\n\t\t\tresult = test_path;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nconst filesystem::path generate_temp_file()\n{\n#ifdef K3D_API_WIN32\n\n\tstring_t buffer(MAX_PATH, '\\0');\n\treturn_val_if_fail(GetTempFileName(get_temp_directory().native_filesystem_string().c_str(), \"k3d\", 0, const_cast<char*>(buffer.c_str())), filesystem::path());\n\tbuffer.resize(strlen(buffer.c_str()));\n\n\treturn filesystem::native_path(ustring::from_utf8(buffer));\n\n#else // K3D_API_WIN32\n\n\tstring_t buffer = (get_temp_directory() / filesystem::generic_path(\"k3d-XXXXXX\")).native_filesystem_string();\n\tint fd = mkstemp(const_cast<char*>(buffer.c_str()));\n\treturn_val_if_fail(fd, filesystem::path());\n\tclose(fd);\n\n\treturn filesystem::native_path(ustring::from_utf8(buffer));\n\n#endif // !K3D_API_WIN32\n}\n\nbool file_modification_time(const filesystem::path& File, time_t& ModificationTime)\n{\n\tstruct stat statistics;\n\tif(-1 == stat(File.native_filesystem_string().c_str(), &statistics))\n\t\treturn false;\n\n\tModificationTime = statistics.st_mtime;\n\n\treturn true;\n}\n\nbool spawn_async(const string_t& CommandLine)\n{\n\treturn_val_if_fail(!CommandLine.empty(), false);\n\n\tlog() << info << \"spawn_async: \" << CommandLine << std::endl;\n\tlog() << info << \"PATH=\" << getenv(\"PATH\") << std::endl;\n\n\ttry\n\t{\n\t\tGlib::spawn_command_line_async(CommandLine);\n\t\treturn true;\n\t}\n\tcatch(Glib::Exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t\treturn false;\n\t}\n}\n\nbool spawn_sync(const string_t& CommandLine)\n{\n\treturn_val_if_fail(!CommandLine.empty(), false);\n\n\tlog() << info << \"spawn_sync: \" << CommandLine << std::endl;\n\tlog() << info << \"PATH=\" << getenv(\"PATH\") << std::endl;\n#ifdef K3D_API_WIN32\n\tk3d::bool_t status = true;\n\tSTARTUPINFO si;\n\tPROCESS_INFORMATION pi;\n\n\tZeroMemory( &si, sizeof(si) );\n\tsi.cb = sizeof(si);\n\tZeroMemory( &pi, sizeof(pi) );\n\n\tLPTSTR cmd_line = _strdup(CommandLine.c_str());\n\t\n\t// Start the child process. \n\tif( !CreateProcess( NULL,   // No module name (use command line)\n\t\tcmd_line,        // Command line\n\t\tNULL,           // Process handle not inheritable\n\t\tNULL,           // Thread handle not inheritable\n\t\tFALSE,          // Set handle inheritance to FALSE\n\t\t0,              // No creation flags\n\t\tNULL,           // Use parent's environment block\n\t\tNULL,           // Use parent's starting directory \n\t\t&si,            // Pointer to STARTUPINFO structure\n\t\t&pi )           // Pointer to PROCESS_INFORMATION structure\n\t) \n\t{\n\t\tlog() << error << \"Failed to CreateProcess with error: \" << GetLastError() << std::endl;\n\t\tstatus = false;\n\t}\n\telse\n\t{\n\t\t// Wait until child process exits.\n\t\tWaitForSingleObject( pi.hProcess, INFINITE );\n\n\t\t// Close process and thread handles. \n\t\tCloseHandle( pi.hProcess );\n\t\tCloseHandle( pi.hThread );\n\t}\n\t\n\tfree(cmd_line);\n\treturn status;\n#else // non-win32:\n\ttry\n\t{\n\t\tGlib::spawn_command_line_sync(CommandLine);\n\t\treturn true;\n\t}\n\tcatch(Glib::Exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t\treturn false;\n\t}\n#endif\n}\n\nconst paths_t decompose_path_list(const string_t Input)\n{\n\tpaths_t results;\n\n\ttypedef boost::tokenizer<boost::char_separator<char> > tokenizer;\n\tboost::char_separator<char> separator(SEARCHPATH_SEPARATOR_STRING);\n\ttokenizer input(Input, separator);\n\n\tfor(tokenizer::iterator path = input.begin(); path != input.end(); ++path)\n\t{\n\t\tconst string_t path_string = k3d::trim(*path);\n\t\tif(!path_string.empty())\n\t\t\tresults.push_back(filesystem::native_path(ustring::from_utf8(path_string)));\n\t}\n\n\treturn results;\n}\n\n#ifdef K3D_API_WIN32\n\nconst string_t executable_name(const string_t& Executable)\n{\n\treturn Executable + \".exe\";\n}\n\n#else // K3D_API_WIN32\n\nconst string_t executable_name(const string_t& Executable)\n{\n\treturn Executable;\n}\n\n#endif // !K3D_API_WIN32\n\n#ifdef K3D_API_WIN32\n\nvoid sleep(const double Seconds)\n{\n\tif(Seconds <= 0.0)\n\t\treturn;\n\n\tSleep(static_cast<DWORD>(Seconds * 1000));\n}\n\n#else // K3D_API_WIN32\n\nvoid sleep(const double Seconds)\n{\n\tif(Seconds <= 0.0)\n\t\treturn;\n\n\ttimespec t;\n\tt.tv_sec = static_cast<long>(std::floor(Seconds));\n\tt.tv_nsec = static_cast<long>((Seconds - std::floor(Seconds)) * 1000000000);\n\n\tnanosleep(&t, 0);\n}\n\n#endif // !K3D_API_WIN32\n\n} // namespace system\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/system.h",
    "content": "#ifndef K3DSDK_SYSTEM_H\n#define K3DSDK_SYSTEM_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/path.h>\n#include <k3dsdk/types.h>\n\n#include <vector>\n\nnamespace k3d\n{\n\nnamespace system\n{\n\n/// Used to initialize the current executable path.  Should be called once as soon as possible at startup, before the cwd can be altered.\nvoid initialize_executable_path(int argc, char* argv[]);\n/// Returns the absolute path of the current executable, or an empty path\nconst filesystem::path executable_path();\n\n/// Safely returns an environment variable (returns empty string if the variable doesn't exist)\nconst string_t getenv(const string_t& Variable);\n/// Safely sets an environment variable using separate name and value strings\nvoid setenv(const string_t& Name, const string_t& Value);\n/// Safely sets an environment variable using \"NAME=VALUE\" syntax\nvoid setenv(const string_t& Variable);\n\n/// Safely returns the user's home directory\nconst filesystem::path get_home_directory();\n/// Safely returns the user's temp directory\nconst filesystem::path get_temp_directory();\n/// Returns a unique temporary file path\nconst filesystem::path generate_temp_file();\n\n/// Returns the path to a binary executable by searching the contents of the PATH environment variable, or an empty path\nconst k3d::filesystem::path find_executable(const string_t& Executable);\n\n/// Returns the most recent modification time of a file\nbool file_modification_time(const filesystem::path& File, time_t& ModificationTime);\n\n/// Runs an external process asynchronously.  Note: execs the process directly, do not use shell features!  The child process will have the same environment as its parent, and the PATH environment variable will be used to lookup the binary to be executed.\nbool spawn_async(const string_t& CommandLine);\n/// Runs an external process synchronously, blocking until it returns.  Note: execs the process directly, do not use shell features!  The child process will have the same environment as its parent, and the PATH environment variable will be used to lookup the binary to be executed.\nbool spawn_sync(const string_t& CommandLine);\n\n/// Defines a collection of paths\ntypedef std::vector<filesystem::path> paths_t;\n/// Split a string containing zero-or-more paths separated by delimiters into a collection of paths ...\nconst paths_t decompose_path_list(const string_t Input);\n\n/// Returns the correct name for an executable on the local platform\nconst string_t executable_name(const string_t& Executable);\n\n/// Blocks the calling thread for the given number of seconds\nvoid sleep(const double Seconds);\n\n} // namespace system\n\n} // namespace k3d\n\n#endif // !K3DSDK_SYSTEM_H\n\n"
  },
  {
    "path": "k3dsdk/table.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/array.h>\n#include <k3dsdk/table.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/type_registry.h>\n\nnamespace k3d\n{\n\n///////////////////////////////////////////////////////////////////////////\n// table\n\nconst array* table::lookup(const string_t& Name) const\n{\n\tconst_iterator result = find(Name);\n\treturn result == end() ? static_cast<const array*>(0) : result->second.get();\n}\n\narray* table::writable(const string_t& Name)\n{\n\titerator result = find(Name);\n\treturn result == end() ? static_cast<array*>(0) : &result->second.writable();\n}\n\ntable table::clone_types() const\n{\n\ttable result;\n\n\tfor(const_iterator array = begin(); array != end(); ++array)\n\t\tresult.insert(std::make_pair(array->first, array->second->clone_type()));\n\n\treturn result;\n}\n\ntable table::clone() const\n{\n\ttable result;\n\n\tfor(const_iterator array = begin(); array != end(); ++array)\n\t\tresult.insert(std::make_pair(array->first, array->second->clone()));\n\n\treturn result;\n}\n\ntable table::clone(const uint_t Begin, const uint_t End) const\n{\n\ttable result;\n\n\tfor(const_iterator array = begin(); array != end(); ++array)\n\t\tresult.insert(std::make_pair(array->first, array->second->clone(Begin, End)));\n\n\treturn result;\n}\n\nvoid table::difference(const table& Other, difference::accumulator& Result) const\n{\n\t// If we have differing numbers of arrays, we definitely aren't equal\n\tResult.exact(column_count() == Other.column_count());\n\n\tfor(table::const_iterator a = begin(), b = Other.begin(); a != end() && b != Other.end(); ++a, ++b)\n\t{\n\t\t// Each pair of arrays must have equal names\n\t\tResult.exact(a->first == b->first);\n\n\t\t// Perform element-wise comparisons of the arrays\n\t\ta->second->difference(*b->second, Result);\n\t}\n}\n\ntable table::clone_types(const table_collection& AttributeArrays)\n{\n\ttable result;\n\n\tif(AttributeArrays.size())\n\t{\n\t\tfor(const_iterator array = AttributeArrays[0]->begin(); array != AttributeArrays[0]->end(); ++array)\n\t\t\tresult.insert(std::make_pair(array->first, array->second->clone_type()));\n\n/*\n\t\t{\n\t\t\tbool_t use_array = true;\n\n\t\t\tfor(uint_t i = 1; i < AttributeArrays.size(); ++i)\n\t\t\t{\n\t\t\t\t\n\t\t\t}\n\n\t\t\tif(use_array)\n\t\t\t\tresult.insert(std::make_pair(array->first, array->second->clone_type()));\n\t\t}\n*/\n\t}\n\n\treturn result;\n}\n\nuint_t table::column_count() const\n{\n\treturn base::size();\n}\n\nuint_t table::row_count() const\n{\n\tfor(const_iterator array = begin(); array != end(); )\n\t\treturn array->second->size();\n\treturn 0;\n}\n\nvoid table::set_row_count(const uint_t NewSize)\n{\n\tfor(iterator array = begin(); array != end(); ++array)\n\t\tarray->second.writable().resize(NewSize);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// operator<<\n\nstd::ostream& operator<<(std::ostream& Stream, const table& RHS)\n{\n\tfor(table::const_iterator array_iterator = RHS.begin(); array_iterator != RHS.end(); ++array_iterator)\n\t{\n\t\tStream << standard_indent << \"array \\\"\" << array_iterator->first << \"\\\" [\" << array_iterator->second->type_string() << \"] (\" << array_iterator->second->size() << \"):\\n\";\n\t\tif(array_iterator->second->size())\n\t\t\tStream << push_indent << start_block() << *array_iterator->second << finish_block << pop_indent << \"\\n\";\n\t}\n\n\treturn Stream;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/table.h",
    "content": "#ifndef K3DSDK_TABLE_H\n#define K3DSDK_TABLE_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/pipeline_data.h>\n#include <k3dsdk/types.h>\n\n#include <map>\n#include <vector>\n\nnamespace k3d\n{\n\nclass array;\n\n/// Defines a heterogeneous collection of named, shared arrays of equal length.  Note that the length of every\n/// array in the collection must remain equal at all times.\n/// For a concrete list of the datatypes that can be stored using k3d::table, see k3d::named_array_types.\nclass table :\n\tpublic std::map<string_t, pipeline_data<array> >\n{\n\ttypedef std::map<string_t, pipeline_data<array> > base;\n\npublic:\n\t/// Creates a new array with given name and type, inserting it into the table and returning a reference to the result.\n\t/** \\note: An existing array with the same name will be replaced by the new array. */\n\ttemplate<typename ArrayT>\n\tArrayT& create(const string_t& Name)\n\t{\n\t\tArrayT* const array = new ArrayT();\n\t\t(*this)[Name].create(array);\n\t\treturn *array;\n\t}\n\t/// Inserts a new array into the table with the given name, returning a reference to the result.\n\t/** \\note: An existing array with the same name will be replaced by the new array. */\n\ttemplate<typename ArrayT>\n\tArrayT& create(const string_t& Name, ArrayT* Array)\n\t{\n\t\t(*this)[Name].create(Array);\n\t\treturn *Array;\n\t}\n\t/// Returns an existing array with the given name, or NULL if no matching array exists.\n\tconst array* lookup(const string_t& Name) const;\n\t/// Returns an existing array with the given name and type, or NULL if no matching array exists.\n\ttemplate<typename ArrayT>\n\tconst ArrayT* lookup(const string_t& Name) const\n\t{\n\t\treturn dynamic_cast<const ArrayT*>(lookup(Name));\n\t}\n\t/// Returns an existing array with the given name, or NULL if no matching array exists.\n\tarray* writable(const string_t& Name);\n\t/// Returns an existing array with the given name and type, or NULL if no matching array exists.\n\ttemplate<typename ArrayT>\n\tArrayT* writable(const string_t& Name)\n\t{\n\t\treturn dynamic_cast<ArrayT*>(writable(Name));\n\t}\n\t/// Returns an table containing empty arrays with the same name and type as the originals.\n\ttable clone_types() const;\n\t/// Returns an table containing deep copies of all the original arrays.\n\ttable clone() const;\n\t/// Returns an table containing copies of a half-open range of all the original arrays.\n\ttable clone(const uint_t Begin, const uint_t End) const;\n\t/// Returns the difference between two tables, using the imprecise semantics of difference().\n\tvoid difference(const table& Other, difference::accumulator& Result) const;\n\n\ttypedef std::vector<const table*> table_collection;\n\tstatic table clone_types(const table_collection& AttributeArrays);\n\n\t/// Returns the number of columns in the table.\n\tuint_t column_count() const;\n\n\t/// Returns the number of rows in the table.\n\tuint_t row_count() const;\n\t/// Sets the number of rows in the table (i.e: resizes every column array).\n\tvoid set_row_count(const uint_t NewSize);\n\nprivate:\n\tuint_t size() const;\n};\n\n/// Serialization\nstd::ostream& operator<<(std::ostream& Stream, const table& RHS);\n\n/// Specialization of difference::test for k3d::table\nnamespace difference\n{\n\ninline void test(const table& A, const table& B, accumulator& Result)\n{\n\tA.difference(B, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_TABLE_H\n\n"
  },
  {
    "path": "k3dsdk/table_copier.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include <k3dsdk/array.h>\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/named_array_types.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/typed_array.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/uint_t_array.h>\n\n#include <boost/bind.hpp>\n#include <boost/mpl/for_each.hpp>\n#include <boost/ptr_container/ptr_vector.hpp>\n#include <boost/static_assert.hpp>\n\n#include <functional>\n\n#include <limits>\n\nnamespace k3d\n{\n\n/// Returns the weighted sum of a random-access subset of array values\nbool_t weighted_sum(const typed_array<bool_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\t// We return whichever value has the highest weight ...\n\tdouble_t weight = -std::numeric_limits<double_t>::max();\n\n\tbool_t result = false;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t{\n\t\tif(Weights[i] >= weight)\n\t\t{\n\t\t\tweight = Weights[i];\n\t\t\tresult = Source[Indices[i]];\n\t\t}\n\t}\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nint8_t weighted_sum(const typed_array<int8_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tint8_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += static_cast<int8_t>(Source[Indices[i]] * Weights[i]);\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nint16_t weighted_sum(const typed_array<int16_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tint16_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += static_cast<int16_t>(Source[Indices[i]] * Weights[i]);\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nint32_t weighted_sum(const typed_array<int32_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tint32_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += static_cast<int32_t>(Source[Indices[i]] * Weights[i]);\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nint64_t weighted_sum(const typed_array<int64_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tint64_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += static_cast<int64_t>(Source[Indices[i]] * Weights[i]);\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nuint8_t weighted_sum(const typed_array<uint8_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tuint8_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += static_cast<uint8_t>(Source[Indices[i]] * std::max(0.0, Weights[i]));\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nuint16_t weighted_sum(const typed_array<uint16_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tuint16_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += static_cast<uint16_t>(Source[Indices[i]] * std::max(0.0, Weights[i]));\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nuint32_t weighted_sum(const typed_array<uint32_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tuint32_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += static_cast<uint32_t>(Source[Indices[i]] * std::max(0.0, Weights[i]));\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nuint64_t weighted_sum(const typed_array<uint64_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tuint64_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += static_cast<uint64_t>(Source[Indices[i]] * std::max(0.0, Weights[i]));\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nuint_t weighted_sum(const uint_t_array& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tuint_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += static_cast<uint_t>(Source[Indices[i]] * std::max(0.0, Weights[i]));\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nhalf_t weighted_sum(const typed_array<half_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\thalf_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += Source[Indices[i]] * Weights[i];\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nfloat_t weighted_sum(const typed_array<float_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tfloat_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += Source[Indices[i]] * Weights[i];\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\ndouble_t weighted_sum(const typed_array<double_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tdouble_t result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += Source[Indices[i]] * Weights[i];\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nstring_t weighted_sum(const typed_array<string_t>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\t// We return whichever value has the highest weight ...\n\tdouble_t weight = -std::numeric_limits<double_t>::max();\n\n\tstring_t result;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t{\n\t\tif(Weights[i] >= weight)\n\t\t{\n\t\t\tweight = Weights[i];\n\t\t\tresult = Source[Indices[i]];\n\t\t}\n\t}\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\ncolor weighted_sum(const typed_array<color>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tcolor result;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult = result + (Source[Indices[i]] * Weights[i]);\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\npoint2 weighted_sum(const typed_array<point2>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tpoint2 result;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += to_vector(Source[Indices[i]] * Weights[i]);\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nvector2 weighted_sum(const typed_array<vector2>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tvector2 result;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += Source[Indices[i]] * Weights[i];\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nnormal3 weighted_sum(const typed_array<normal3>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tnormal3 result;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += Source[Indices[i]] * Weights[i];\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\npoint3 weighted_sum(const typed_array<point3>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tpoint3 result;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += to_vector(Source[Indices[i]] * Weights[i]);\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\ntexture3 weighted_sum(const typed_array<texture3>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\ttexture3 result;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += Source[Indices[i]] * Weights[i];\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nvector3 weighted_sum(const typed_array<vector3>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tvector3 result;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += Source[Indices[i]] * Weights[i];\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\npoint4 weighted_sum(const typed_array<point4>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tpoint4 result;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += to_vector(Source[Indices[i]] * Weights[i]);\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nmatrix4 weighted_sum(const typed_array<matrix4>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tmatrix4 result;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t\tresult += Source[Indices[i]] * Weights[i];\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\nimaterial* weighted_sum(const typed_array<imaterial*>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\t// We return whichever value has the highest weight ...\n\tdouble_t weight = -std::numeric_limits<double_t>::max();\n\n\timaterial* result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t{\n\t\tif(Weights[i] >= weight)\n\t\t{\n\t\t\tweight = Weights[i];\n\t\t\tresult = Source[Indices[i]];\n\t\t}\n\t}\n\treturn result;\n}\n\n/// Returns the weighted sum of a random-access subset of array values\ninode* weighted_sum(const typed_array<inode*>& Source, const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\t// We return whichever value has the highest weight ...\n\tdouble_t weight = -std::numeric_limits<double_t>::max();\n\n\tinode* result = 0;\n\tfor(uint_t i = 0; i != Count; ++i)\n\t{\n\t\tif(Weights[i] >= weight)\n\t\t{\n\t\t\tweight = Weights[i];\n\t\t\tresult = Source[Indices[i]];\n\t\t}\n\t}\n\treturn result;\n}\n\n////////////////////////////////////////////////////////////////////////////\n// table_copier::implementation\n\nclass table_copier::implementation\n{\npublic:\n\timplementation(const table& Source, table& Target, const copy_policy& CopyPolicy)\n\t{\n\t\tstd::vector<bool_t> used_source(Source.column_count(), false);\n\t\tstd::vector<bool_t> used_target(Target.column_count(), false);\n\n\t\tconst table::const_iterator source_begin = Source.begin();\n\t\tconst table::const_iterator source_end = Source.end();\n\n\t\tconst table::iterator target_begin = Target.begin();\n\t\tconst table::iterator target_end = Target.end();\n\t\n\t\tuint_t target_index = 0;\n\t\tfor(table::iterator target = target_begin; target != target_end; ++target, ++target_index)\n\t\t{\n\t\t\tuint_t source_index = 0;\n\t\t\tfor(table::const_iterator source = source_begin; source != source_end; ++source, ++source_index)\n\t\t\t{\n\t\t\t\tif(CopyPolicy.copy(source->first, *source->second.get(), target->first, *target->second.get()))\n\t\t\t\t{\n\t\t\t\t\tused_source[source_index] = true;\n\t\t\t\t\tused_target[target_index] = true;\n\n\t\t\t\t\tif(!copier_factory::create_copier(*source->second, target->second.writable(), copiers))\n\t\t\t\t\t{\n\t\t\t\t\t\tlog() << error << \"array [\" << target->first << \"] of unknown type [\" << demangle(typeid(*target->second)) << \"] will not receive data.\" << std::endl;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tuint_t source_index = 0;\n\t\t\tfor(table::const_iterator source = source_begin; source != source_end; ++source, ++source_index)\n\t\t\t{\n\t\t\t\tif(!used_source[source_index])\n\t\t\t\t\tCopyPolicy.unused_source(source->first, *source->second);\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tuint_t target_index = 0;\n\t\t\tfor(table::const_iterator target = target_begin; target != target_end; ++target, ++target_index)\n\t\t\t{\n\t\t\t\tif(!used_target[target_index])\n\t\t\t\t\tCopyPolicy.unused_target(target->first, *target->second);\n\t\t\t}\n\t\t}\n\t}\n\n\timplementation(table& Table)\n\t{\n\t\tconst table::iterator target_begin = Table.begin();\n\t\tconst table::iterator target_end = Table.end();\n\t\n\t\tfor(table::iterator target = target_begin; target != target_end; ++target)\n\t\t{\n\t\t\tif(!copier_factory::create_copier(target->second.writable(), target->second.writable(), copiers))\n\t\t\t\tlog() << error << \"array [\" << target->first << \"] of unknown type [\" << demangle(typeid(*target->second)) << \"] will not receive data.\" << std::endl;\n\t\t}\n\t}\n\n\tvoid push_back(const uint_t Index)\n\t{\n\t\tstd::for_each(copiers.begin(), copiers.end(), boost::bind(&array_copier::push_back, _1, Index));\n\t}\n\n\tvoid push_back(const uint_t Count, const uint_t* Indices, const double_t* Weights)\n\t{\n\t\tstd::for_each(copiers.begin(), copiers.end(), boost::bind(&array_copier::push_back, _1, Count, Indices, Weights));\n\t}\n\t\n\tvoid copy(const uint_t SourceIndex, const uint_t TargetIndex)\n\t{\n\t\tstd::for_each(copiers.begin(), copiers.end(), boost::bind(&array_copier::copy, _1, SourceIndex, TargetIndex));\n\t}\n\n\tvoid copy(const uint_t Count, const uint_t* Indices, const double_t* Weights, const uint_t TargetIndex)\n\t{\n\t\tstd::for_each(copiers.begin(), copiers.end(), boost::bind(&array_copier::copy, _1, Count, Indices, Weights, TargetIndex));\n\t}\n\nprivate:\n\t/// Abstract interface for concrete objects that provide array-copying operations\n\tclass array_copier\n\t{\n\tpublic:\n\t\tvirtual ~array_copier() {}\n\n\t\t/// Called to append a value (identified by index) from the source array to the target array\n\t\tvirtual void push_back(const uint_t Index) = 0;\n\t\t/// Called to compute a weighted sum from the source array and append the result to the target array\n\t\tvirtual void push_back(const uint_t Count, const uint_t* Indices, const double_t* Weights) = 0;\n\t\t/// Called to copy a value (identified by SourceIndex) from the source array to the target array at position TargetIndex\n\t\tvirtual void copy(const uint_t SourceIndex, const uint_t TargetIndex) = 0;\n\t\t/// Called to compute a weighted sum from the source array and store the result at TargetIndex in the target array\n\t\tvirtual void copy(const uint_t Count, const uint_t* Indices, const double_t* Weights, const uint_t TagetIndex) = 0;\n\t};\n\n\t/// Defines storage for a collection of array copiers\n\ttypedef boost::ptr_vector<array_copier> copiers_t;\n\n\t/// Helper class that instantiates array_copier objects based on the runtime type of source and target arrays\n\tclass copier_factory\n\t{\n\tpublic:\n\t\tstatic bool_t create_copier(const array& Source, array& Target, copiers_t& Copiers)\n\t\t{\n\t\t\tbool_t result = false;\n\t\t\tboost::mpl::for_each<named_array_types>(copier_factory(Source, Target, Copiers, result));\n\t\t\treturn result;\n\t\t}\n\n\t\ttemplate<typename T>\n\t\tvoid operator()(T)\n\t\t{\n\t\t\tif(created)\n\t\t\t\treturn;\n\n\t\t\tif(const typed_array<T>* const typed_source = dynamic_cast<const typed_array<T>* >(&source))\n\t\t\t{\n\t\t\t\tif(typed_array<T>* const typed_target = dynamic_cast<typed_array<T>* >(&target))\n\t\t\t\t{\n\t\t\t\t\tcopiers.push_back(new typed_array_copier<typed_array<T> >(*typed_source, *typed_target));\n\t\t\t\t\tcreated = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\tprivate:\n\t\tcopier_factory(const array& Source, array& Target, copiers_t& Copiers, bool_t& Created) :\n\t\t\tsource(Source),\n\t\t\ttarget(Target),\n\t\t\tcopiers(Copiers),\n\t\t\tcreated(Created)\n\t\t{\n\t\t\t// Special-case handling for uint_t_array ...\n\t\t\tif(const uint_t_array* const typed_source = dynamic_cast<const uint_t_array*>(&source))\n\t\t\t{\n\t\t\t\tif(uint_t_array* const typed_target = dynamic_cast<uint_t_array*>(&target))\n\t\t\t\t{\n\t\t\t\t\tcopiers.push_back(new typed_array_copier<uint_t_array>(*typed_source, *typed_target));\n\t\t\t\t\tcreated = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// Concrete array_copier implementation that is templated on the array type\n\t\ttemplate<typename array_t>\n\t\tclass typed_array_copier :\n\t\t\tpublic array_copier\n\t\t{\n\t\tpublic:\n\t\t\ttyped_array_copier(const array_t& Source, array_t& Target) :\n\t\t\t\tsource(Source),\n\t\t\t\ttarget(Target)\n\t\t\t{\n\t\t\t}\n\n\t\t\tvoid push_back(const uint_t Index)\n\t\t\t{\n\t\t\t\ttarget.push_back(source[Index]);\n\t\t\t}\n\n\t\t\tvoid push_back(const uint_t Count, const uint_t* Indices, const double_t* Weights)\n\t\t\t{\n\t\t\t\ttarget.push_back(weighted_sum(source, Count, Indices, Weights));\n\t\t\t}\n\t\t\t\n\t\t\tvoid copy(const uint_t SourceIndex, const uint_t TargetIndex)\n\t\t\t{\n\t\t\t\ttarget[TargetIndex] = source[SourceIndex];\n\t\t\t}\n\n\t\t\tvoid copy(const uint_t Count, const uint_t* Indices, const double_t* Weights, const uint_t TargetIndex)\n\t\t\t{\n\t\t\t\ttarget[TargetIndex] = weighted_sum(source, Count, Indices, Weights);\n\t\t\t}\n\n\t\tprivate:\n\t\t\tconst array_t& source;\n\t\t\tarray_t& target;\n\t\t};\n\n\t\tconst array& source;\n\t\tarray& target;\n\t\tcopiers_t& copiers;\n\t\tbool_t& created;\n\t};\n\n\t/// Stores a collection of array_copier objects that handle copying between each source/target pair of arrays\n\tcopiers_t copiers;\n};\n\n////////////////////////////////////////////////////////////////////////////\n// table_copier::strict_copy\n\nbool_t table_copier::strict_copy::copy(const string_t& SourceName, const array& Source, const string_t& TargetName, const array& Target) const\n{\n\tif(SourceName != TargetName)\n\t\treturn false;\n\n\tif(typeid(Source) != typeid(Target))\n\t{\n\t\tlog() << error << \"Source array [\" << SourceName << \"] of type [\" << demangle(typeid(Source)) << \"] does not match target array of type [\" << demangle(typeid(Target)) << \"].\" << std::endl;\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nvoid table_copier::strict_copy::unused_source(const string_t& SourceName, const array& Source) const\n{\n\tlog() << error << \"Source array [\" << SourceName << \"] of type [\" << demangle(typeid(Source)) << \"] has no corresponding target and will not supply data.\" << std::endl;\n}\n\nvoid table_copier::strict_copy::unused_target(const string_t& TargetName, const array& Target) const\n{\n\tlog() << error << \"Target array [\" << TargetName << \"] of type [\" << demangle(typeid(Target)) << \"] has no corresponding source and will not receive data.\" << std::endl;\n}\n\n////////////////////////////////////////////////////////////////////////////\n// table_copier::copy_subset\n\nbool_t table_copier::copy_subset::copy(const string_t& SourceName, const array& Source, const string_t& TargetName, const array& Target) const\n{\n\treturn SourceName == TargetName && typeid(Source) == typeid(Target);\n}\n\nvoid table_copier::copy_subset::unused_source(const string_t&, const array&) const\n{\n}\n\nvoid table_copier::copy_subset::unused_target(const string_t& TargetName, const array& Target) const\n{\n\tlog() << error << \"Target array [\" << TargetName << \"] of type [\" << demangle(typeid(Target)) << \"] has no corresponding source and will not receive data.\" << std::endl;\n}\n\n////////////////////////////////////////////////////////////////////////////\n// table_copier\n\ntable_copier::table_copier(const table& Source, table& Target, const copy_policy& CopyPolicy) :\n\tm_implementation(new implementation(Source, Target, CopyPolicy))\n{\n}\n\ntable_copier::table_copier(table& Table) :\n\tm_implementation(new implementation(Table))\n{\n}\n\ntable_copier::~table_copier()\n{\n}\n\nvoid table_copier::push_back(const uint_t Index)\n{\n\tm_implementation->push_back(Index);\n}\n\nvoid table_copier::push_back(const uint_t Count, const uint_t* Indices, const double_t* Weights)\n{\n\tm_implementation->push_back(Count, Indices, Weights);\n}\n\nvoid table_copier::copy(const uint_t SourceIndex, const uint_t TargetIndex)\n{\n\tm_implementation->copy(SourceIndex, TargetIndex);\n}\n\nvoid table_copier::copy(const uint_t Count, const uint_t* Indices, const double_t* Weights, const uint_t TargetIndex)\n{\n\tm_implementation->copy(Count, Indices, Weights, TargetIndex);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/table_copier.h",
    "content": "#ifndef K3DSDK_TABLE_COPIER_H\n#define K3DSDK_TABLE_COPIER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include <k3dsdk/table.h>\n\nnamespace k3d\n{\n\n/// Handles random-access copying among attribute arrays\nclass table_copier\n{\npublic:\n\t/// Abstract interface for policy objects that determine which source arrays get copied to which target arrays.\n\tclass copy_policy\n\t{\n\tprotected:\n\t\tcopy_policy() {}\n\t\tvirtual ~copy_policy() {}\n\n\tpublic:\n\t\t/// Return true to indicate that the given source array should be copied to the given target array.  Note that this method\n\t\t/// will be called once for every permutation of source and unused-target arrays, so a derivative could implement special behavior\n\t\t/// including mapping source and target arrays with different names, mapping a single source array to multiple target arrays, etc.\n\t\tvirtual bool_t copy(const string_t& SourceName, const array& Source, const string_t& TargetName, const array& Target) const = 0;\n\t\t/// Called once for each source array that isn't used.  Implementations may optionally choose to generate errors.\n\t\tvirtual void unused_source(const string_t& SourceName, const array& Source) const = 0;\n\t\t/// Called once for each target array that isn't used.  Implementations may optionally choose to generate errors.\n\t\tvirtual void unused_target(const string_t& TargetName, const array& Target) const = 0; \n\t};\n\n\t/// Strict copy policy that matches arrays by name, generating errors for all unused arrays and arrays that match names but not types.\n\t/// This policy is useful in the majority of cases where a node is copying data from one mesh input to one mesh output and the set of\n\t/// arrays is identical for both.\n\tclass strict_copy :\n\t\tpublic copy_policy\n\t{\n\tpublic:\n\t\tbool_t copy(const string_t& SourceName, const array& Source, const string_t& TargetName, const array& Target) const; \n\t\tvoid unused_source(const string_t& SourceName, const array& Source) const; \n\t\tvoid unused_target(const string_t& TargetName, const array& Target) const; \n\t};\n\n\t/// Copy policy that matches arrays by name, quietly ignoring unused source arrays and arrays with mismatched types. This policy is useful\n\t/// for nodes that are merging data from multiple input meshes to a single output mesh, where the output will contain a subset (usually\n\t/// the intersection) of all available input arrays.\n\tclass copy_subset :\n\t\tpublic copy_policy\n\t{\n\tpublic:\n\t\tbool_t copy(const string_t& SourceName, const array& Source, const string_t& TargetName, const array& Target) const; \n\t\tvoid unused_source(const string_t& SourceName, const array& Source) const; \n\t\tvoid unused_target(const string_t& TargetName, const array& Target) const; \n\t};\n\n\t/// Initializes table_copier to copy data from a source table to a target table, using a copy_policy\n\t/// object to determine how each source array maps to each target array.\n\ttable_copier(const table& Source, table& Target, const copy_policy& CopyPolicy = strict_copy());\n\t/// Special-case initialization of table_copier to copy data within a single table, using an identity-map copy policy.\n\ttable_copier(table& Table);\n\t~table_copier();\n\n\t/// Appends the given index value from each source array to each corresponding target array.\n\tvoid push_back(const uint_t Index);\n\t/// Computes a weighted sum of N values from each source array and appends the result to the corresponding target array.\n\tvoid push_back(const uint_t Count, const uint_t* Indices, const double_t* Weights);\n\t/// Copies the given source index value from each source array to the TargetIndex in each corresponding target array.\n\tvoid copy(const uint_t SourceIndex, const uint_t TargetIndex);\n\t/// Computes a weighted sum of N values from each source array and copies the result to the corresponding target array at the given TargetIndex.\n\tvoid copy(const uint_t Count, const uint_t* Indices, const double_t* Weights, const uint_t TargetIndex);\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n\n\ttable_copier(const table_copier&);\n\ttable_copier& operator=(const table_copier&);\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_TABLE_COPIER_H\n\n"
  },
  {
    "path": "k3dsdk/teapot.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/teapot.h>\n\nnamespace k3d\n{\n\nnamespace teapot\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::matrices_t& Matrices,\n\tconst mesh::materials_t& Materials,\n\tconst mesh::selection_t& Selections,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& SurfaceAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::matrices_t& Matrices,\n\tmesh::materials_t& Materials,\n\tmesh::selection_t& Selections,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& SurfaceAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"teapot\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::matrices_t >(\"matrices\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::materials_t >(\"materials\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::selection_t>(\"selections\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"surface\"]\n\t\t);\n\n\tresult->selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"teapot\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\n\t\tconst mesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tconst mesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tconst mesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\treturn new const_primitive(matrices, materials, selections, constant_attributes, surface_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"teapot\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\n\t\tmesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tmesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tmesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\treturn new primitive(matrices, materials, selections, constant_attributes, surface_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"teapot\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// points\n\nconst points_array_t& points()\n{\n\tstatic points_array_t raw_points =\n\t{\n\t\t{ 1.4, 0.0, 2.4 },\n\t\t{ 1.4, -0.784, 2.4 },\n\t\t{ 0.784, -1.4, 2.4 },\n\t\t{ 0.0, -1.4, 2.4 },\n\t\t{ 1.3375, 0.0, 2.53125 },\n\t\t{ 1.3375, -0.749, 2.53125 },\n\t\t{ 0.749, -1.3375, 2.53125 },\n\t\t{ 0.0, -1.3375, 2.53125 },\n\t\t{ 1.4375, 0.0, 2.53125 },\n\t\t{ 1.4375, -0.805, 2.53125 },\n\t\t{ 0.805, -1.4375, 2.53125 },\n\t\t{ 0.0, -1.4375, 2.53125 },\n\t\t{ 1.5, 0.0, 2.4 },\n\t\t{ 1.5, -0.84, 2.4 },\n\t\t{ 0.84, -1.5, 2.4 },\n\t\t{ 0.0, -1.5, 2.4 },\n\t\t{ -0.784, -1.4, 2.4 },\n\t\t{ -1.4, -0.784, 2.4 },\n\t\t{ -1.4, 0.0, 2.4 },\n\t\t{ -0.749, -1.3375, 2.53125 },\n\t\t{ -1.3375, -0.749, 2.53125 },\n\t\t{ -1.3375, 0.0, 2.53125 },\n\t\t{ -0.805, -1.4375, 2.53125 },\n\t\t{ -1.4375, -0.805, 2.53125 },\n\t\t{ -1.4375, 0.0, 2.53125 },\n\t\t{ -0.84, -1.5, 2.4 },\n\t\t{ -1.5, -0.84, 2.4 },\n\t\t{ -1.5, 0.0, 2.4 },\n\t\t{ -1.4, 0.784, 2.4 },\n\t\t{ -0.784, 1.4, 2.4 },\n\t\t{ 0.0, 1.4, 2.4 },\n\t\t{ -1.3375, 0.749, 2.53125 },\n\t\t{ -0.749, 1.3375, 2.53125 },\n\t\t{ 0.0, 1.3375, 2.53125 },\n\t\t{ -1.4375, 0.805, 2.53125 },\n\t\t{ -0.805, 1.4375, 2.53125 },\n\t\t{ 0.0, 1.4375, 2.53125 },\n\t\t{ -1.5, 0.84, 2.4 },\n\t\t{ -0.84, 1.5, 2.4 },\n\t\t{ 0.0, 1.5, 2.4 },\n\t\t{ 0.784, 1.4, 2.4 },\n\t\t{ 1.4, 0.784, 2.4 },\n\t\t{ 0.749, 1.3375, 2.53125 },\n\t\t{ 1.3375, 0.749, 2.53125 },\n\t\t{ 0.805, 1.4375, 2.53125 },\n\t\t{ 1.4375, 0.805, 2.53125 },\n\t\t{ 0.84, 1.5, 2.4 },\n\t\t{ 1.5, 0.84, 2.4 },\n\t\t{ 1.75, 0.0, 1.875 },\n\t\t{ 1.75, -0.98, 1.875 },\n\t\t{ 0.98, -1.75, 1.875 },\n\t\t{ 0.0, -1.75, 1.875 },\n\t\t{ 2.0, 0.0, 1.35 },\n\t\t{ 2.0, -1.12, 1.35 },\n\t\t{ 1.12, -2.0, 1.35 },\n\t\t{ 0.0, -2.0, 1.35 },\n\t\t{ 2.0, 0.0, 0.9 },\n\t\t{ 2.0, -1.12, 0.9 },\n\t\t{ 1.12, -2.0, 0.9 },\n\t\t{ 0.0, -2.0, 0.9 },\n\t\t{ -0.98, -1.75, 1.875 },\n\t\t{ -1.75, -0.98, 1.875 },\n\t\t{ -1.75, 0.0, 1.875 },\n\t\t{ -1.12, -2.0, 1.35 },\n\t\t{ -2.0, -1.12, 1.35 },\n\t\t{ -2.0, 0.0, 1.35 },\n\t\t{ -1.12, -2.0, 0.9 },\n\t\t{ -2.0, -1.12, 0.9 },\n\t\t{ -2.0, 0.0, 0.9 },\n\t\t{ -1.75, 0.98, 1.875 },\n\t\t{ -0.98, 1.75, 1.875 },\n\t\t{ 0.0, 1.75, 1.875 },\n\t\t{ -2.0, 1.12, 1.35 },\n\t\t{ -1.12, 2.0, 1.35 },\n\t\t{ 0.0, 2.0, 1.35 },\n\t\t{ -2.0, 1.12, 0.9 },\n\t\t{ -1.12, 2.0, 0.9 },\n\t\t{ 0.0, 2.0, 0.9 },\n\t\t{ 0.98, 1.75, 1.875 },\n\t\t{ 1.75, 0.98, 1.875 },\n\t\t{ 1.12, 2.0, 1.35 },\n\t\t{ 2.0, 1.12, 1.35 },\n\t\t{ 1.12, 2.0, 0.9 },\n\t\t{ 2.0, 1.12, 0.9 },\n\t\t{ 2.0, 0.0, 0.45 },\n\t\t{ 2.0, -1.12, 0.45 },\n\t\t{ 1.12, -2.0, 0.45 },\n\t\t{ 0.0, -2.0, 0.45 },\n\t\t{ 1.5, 0.0, 0.225 },\n\t\t{ 1.5, -0.84, 0.225 },\n\t\t{ 0.84, -1.5, 0.225 },\n\t\t{ 0.0, -1.5, 0.225 },\n\t\t{ 1.5, 0.0, 0.15 },\n\t\t{ 1.5, -0.84, 0.15 },\n\t\t{ 0.84, -1.5, 0.15 },\n\t\t{ 0.0, -1.5, 0.15 },\n\t\t{ -1.12, -2.0, 0.45 },\n\t\t{ -2.0, -1.12, 0.45 },\n\t\t{ -2.0, 0.0, 0.45 },\n\t\t{ -0.84, -1.5, 0.225 },\n\t\t{ -1.5, -0.84, 0.225 },\n\t\t{ -1.5, 0.0, 0.225 },\n\t\t{ -0.84, -1.5, 0.15 },\n\t\t{ -1.5, -0.84, 0.15 },\n\t\t{ -1.5, 0.0, 0.15 },\n\t\t{ -2.0, 1.12, 0.45 },\n\t\t{ -1.12, 2.0, 0.45 },\n\t\t{ 0.0, 2.0, 0.45 },\n\t\t{ -1.5, 0.84, 0.225 },\n\t\t{ -0.84, 1.5, 0.225 },\n\t\t{ 0.0, 1.5, 0.225 },\n\t\t{ -1.5, 0.84, 0.15 },\n\t\t{ -0.84, 1.5, 0.15 },\n\t\t{ 0.0, 1.5, 0.15 },\n\t\t{ 1.12, 2.0, 0.45 },\n\t\t{ 2.0, 1.12, 0.45 },\n\t\t{ 0.84, 1.5, 0.225 },\n\t\t{ 1.5, 0.84, 0.225 },\n\t\t{ 0.84, 1.5, 0.15 },\n\t\t{ 1.5, 0.84, 0.15 },\n\t\t{ -1.6, 0.0, 2.025 },\n\t\t{ -1.6, -0.3, 2.025 },\n\t\t{ -1.5, -0.3, 2.25 },\n\t\t{ -1.5, 0.0, 2.25 },\n\t\t{ -2.3, 0.0, 2.025 },\n\t\t{ -2.3, -0.3, 2.025 },\n\t\t{ -2.5, -0.3, 2.25 },\n\t\t{ -2.5, 0.0, 2.25 },\n\t\t{ -2.7, 0.0, 2.025 },\n\t\t{ -2.7, -0.3, 2.025 },\n\t\t{ -3.0, -0.3, 2.25 },\n\t\t{ -3.0, 0.0, 2.25 },\n\t\t{ -2.7, 0.0, 1.8 },\n\t\t{ -2.7, -0.3, 1.8 },\n\t\t{ -3.0, -0.3, 1.8 },\n\t\t{ -3.0, 0.0, 1.8 },\n\t\t{ -1.5, 0.3, 2.25 },\n\t\t{ -1.6, 0.3, 2.025 },\n\t\t{ -2.5, 0.3, 2.25 },\n\t\t{ -2.3, 0.3, 2.025 },\n\t\t{ -3.0, 0.3, 2.25 },\n\t\t{ -2.7, 0.3, 2.025 },\n\t\t{ -3.0, 0.3, 1.8 },\n\t\t{ -2.7, 0.3, 1.8 },\n\t\t{ -2.7, 0.0, 1.575 },\n\t\t{ -2.7, -0.3, 1.575 },\n\t\t{ -3.0, -0.3, 1.35 },\n\t\t{ -3.0, 0.0, 1.35 },\n\t\t{ -2.5, 0.0, 1.125 },\n\t\t{ -2.5, -0.3, 1.125 },\n\t\t{ -2.65, -0.3, 0.9375 },\n\t\t{ -2.65, 0.0, 0.9375 },\n\t\t{ -2.0, -0.3, 0.9 },\n\t\t{ -1.9, -0.3, 0.6 },\n\t\t{ -1.9, 0.0, 0.6 },\n\t\t{ -3.0, 0.3, 1.35 },\n\t\t{ -2.7, 0.3, 1.575 },\n\t\t{ -2.65, 0.3, 0.9375 },\n\t\t{ -2.5, 0.3, 1.125 },\n\t\t{ -1.9, 0.3, 0.6 },\n\t\t{ -2.0, 0.3, 0.9 },\n\t\t{ 1.7, 0.0, 1.425 },\n\t\t{ 1.7, -0.66, 1.425 },\n\t\t{ 1.7, -0.66, 0.6 },\n\t\t{ 1.7, 0.0, 0.6 },\n\t\t{ 2.6, 0.0, 1.425 },\n\t\t{ 2.6, -0.66, 1.425 },\n\t\t{ 3.1, -0.66, 0.825 },\n\t\t{ 3.1, 0.0, 0.825 },\n\t\t{ 2.3, 0.0, 2.1 },\n\t\t{ 2.3, -0.25, 2.1 },\n\t\t{ 2.4, -0.25, 2.025 },\n\t\t{ 2.4, 0.0, 2.025 },\n\t\t{ 2.7, 0.0, 2.4 },\n\t\t{ 2.7, -0.25, 2.4 },\n\t\t{ 3.3, -0.25, 2.4 },\n\t\t{ 3.3, 0.0, 2.4 },\n\t\t{ 1.7, 0.66, 0.6 },\n\t\t{ 1.7, 0.66, 1.425 },\n\t\t{ 3.1, 0.66, 0.825 },\n\t\t{ 2.6, 0.66, 1.425 },\n\t\t{ 2.4, 0.25, 2.025 },\n\t\t{ 2.3, 0.25, 2.1 },\n\t\t{ 3.3, 0.25, 2.4 },\n\t\t{ 2.7, 0.25, 2.4 },\n\t\t{ 2.8, 0.0, 2.475 },\n\t\t{ 2.8, -0.25, 2.475 },\n\t\t{ 3.525, -0.25, 2.49375 },\n\t\t{ 3.525, 0.0, 2.49375 },\n\t\t{ 2.9, 0.0, 2.475 },\n\t\t{ 2.9, -0.15, 2.475 },\n\t\t{ 3.45, -0.15, 2.5125 },\n\t\t{ 3.45, 0.0, 2.5125 },\n\t\t{ 2.8, 0.0, 2.4 },\n\t\t{ 2.8, -0.15, 2.4 },\n\t\t{ 3.2, -0.15, 2.4 },\n\t\t{ 3.2, 0.0, 2.4 },\n\t\t{ 3.525, 0.25, 2.49375 },\n\t\t{ 2.8, 0.25, 2.475 },\n\t\t{ 3.45, 0.15, 2.5125 },\n\t\t{ 2.9, 0.15, 2.475 },\n\t\t{ 3.2, 0.15, 2.4 },\n\t\t{ 2.8, 0.15, 2.4 },\n\t\t{ 0.0, 0.0, 3.15 },\n\t\t{ 0.0, -0.002, 3.15 },\n\t\t{ 0.002, 0.0, 3.15 },\n\t\t{ 0.8, 0.0, 3.15 },\n\t\t{ 0.8, -0.45, 3.15 },\n\t\t{ 0.45, -0.8, 3.15 },\n\t\t{ 0.0, -0.8, 3.15 },\n\t\t{ 0.0, 0.0, 2.85 },\n\t\t{ 0.2, 0.0, 2.7 },\n\t\t{ 0.2, -0.112, 2.7 },\n\t\t{ 0.112, -0.2, 2.7 },\n\t\t{ 0.0, -0.2, 2.7 },\n\t\t{ -0.002, 0.0, 3.15 },\n\t\t{ -0.45, -0.8, 3.15 },\n\t\t{ -0.8, -0.45, 3.15 },\n\t\t{ -0.8, 0.0, 3.15 },\n\t\t{ -0.112, -0.2, 2.7 },\n\t\t{ -0.2, -0.112, 2.7 },\n\t\t{ -0.2, 0.0, 2.7 },\n\t\t{ 0.0, 0.002, 3.15 },\n\t\t{ -0.8, 0.45, 3.15 },\n\t\t{ -0.45, 0.8, 3.15 },\n\t\t{ 0.0, 0.8, 3.15 },\n\t\t{ -0.2, 0.112, 2.7 },\n\t\t{ -0.112, 0.2, 2.7 },\n\t\t{ 0.0, 0.2, 2.7 },\n\t\t{ 0.45, 0.8, 3.15 },\n\t\t{ 0.8, 0.45, 3.15 },\n\t\t{ 0.112, 0.2, 2.7 },\n\t\t{ 0.2, 0.112, 2.7 },\n\t\t{ 0.4, 0.0, 2.55 },\n\t\t{ 0.4, -0.224, 2.55 },\n\t\t{ 0.224, -0.4, 2.55 },\n\t\t{ 0.0, -0.4, 2.55 },\n\t\t{ 1.3, 0.0, 2.55 },\n\t\t{ 1.3, -0.728, 2.55 },\n\t\t{ 0.728, -1.3, 2.55 },\n\t\t{ 0.0, -1.3, 2.55 },\n\t\t{ 1.3, 0.0, 2.4 },\n\t\t{ 1.3, -0.728, 2.4 },\n\t\t{ 0.728, -1.3, 2.4 },\n\t\t{ 0.0, -1.3, 2.4 },\n\t\t{ -0.224, -0.4, 2.55 },\n\t\t{ -0.4, -0.224, 2.55 },\n\t\t{ -0.4, 0.0, 2.55 },\n\t\t{ -0.728, -1.3, 2.55 },\n\t\t{ -1.3, -0.728, 2.55 },\n\t\t{ -1.3, 0.0, 2.55 },\n\t\t{ -0.728, -1.3, 2.4 },\n\t\t{ -1.3, -0.728, 2.4 },\n\t\t{ -1.3, 0.0, 2.4 },\n\t\t{ -0.4, 0.224, 2.55 },\n\t\t{ -0.224, 0.4, 2.55 },\n\t\t{ 0.0, 0.4, 2.55 },\n\t\t{ -1.3, 0.728, 2.55 },\n\t\t{ -0.728, 1.3, 2.55 },\n\t\t{ 0.0, 1.3, 2.55 },\n\t\t{ -1.3, 0.728, 2.4 },\n\t\t{ -0.728, 1.3, 2.4 },\n\t\t{ 0.0, 1.3, 2.4 },\n\t\t{ 0.224, 0.4, 2.55 },\n\t\t{ 0.4, 0.224, 2.55 },\n\t\t{ 0.728, 1.3, 2.55 },\n\t\t{ 1.3, 0.728, 2.55 },\n\t\t{ 0.728, 1.3, 2.4 },\n\t\t{ 1.3, 0.728, 2.4 },\n\t\t{ 0.0, 0.0, 0.0 },\n\t\t{ 1.5, 0.0, 0.15 },\n\t\t{ 1.5, 0.84, 0.15 },\n\t\t{ 0.84, 1.5, 0.15 },\n\t\t{ 0.0, 1.5, 0.15 },\n\t\t{ 1.5, 0.0, 0.075 },\n\t\t{ 1.5, 0.84, 0.075 },\n\t\t{ 0.84, 1.5, 0.075 },\n\t\t{ 0.0, 1.5, 0.075 },\n\t\t{ 1.425, 0.0, 0.0 },\n\t\t{ 1.425, 0.798, 0.0 },\n\t\t{ 0.798, 1.425, 0.0 },\n\t\t{ 0.0, 1.425, 0.0 },\n\t\t{ -0.84, 1.5, 0.15 },\n\t\t{ -1.5, 0.84, 0.15 },\n\t\t{ -1.5, 0.0, 0.15 },\n\t\t{ -0.84, 1.5, 0.075 },\n\t\t{ -1.5, 0.84, 0.075 },\n\t\t{ -1.5, 0.0, 0.075 },\n\t\t{ -0.798, 1.425, 0.0 },\n\t\t{ -1.425, 0.798, 0.0 },\n\t\t{ -1.425, 0.0, 0.0 },\n\t\t{ -1.5, -0.84, 0.15 },\n\t\t{ -0.84, -1.5, 0.15 },\n\t\t{ 0.0, -1.5, 0.15 },\n\t\t{ -1.5, -0.84, 0.075 },\n\t\t{ -0.84, -1.5, 0.075 },\n\t\t{ 0.0, -1.5, 0.075 },\n\t\t{ -1.425, -0.798, 0.0 },\n\t\t{ -0.798, -1.425, 0.0 },\n\t\t{ 0.0, -1.425, 0.0 },\n\t\t{ 0.84, -1.5, 0.15 },\n\t\t{ 1.5, -0.84, 0.15 },\n\t\t{ 0.84, -1.5, 0.075 },\n\t\t{ 1.5, -0.84, 0.075 },\n\t\t{ 0.798, -1.425, 0.0 },\n\t\t{ 1.425, -0.798, 0.0}\n\t};\n\n\treturn raw_points;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// patches\n\nconst patches_array_t& patches()\n{\n\tstatic patches_array_t raw_patches =\n\t{\n\t\t// Rim\n\t\t{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, \n\t\t{4, 17, 18, 19, 8, 20, 21, 22, 12, 23, 24, 25, 16, 26, 27, 28}, \n\t\t{19, 29, 30, 31, 22, 32, 33, 34, 25, 35, 36, 37, 28, 38, 39, 40}, \n\t\t{31, 41, 42, 1, 34, 43, 44, 5, 37, 45, 46, 9, 40, 47, 48, 13}, \n\t\t// Body\n\t\t{13, 14, 15, 16, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60}, \n\t\t{16, 26, 27, 28, 52, 61, 62, 63, 56, 64, 65, 66, 60, 67, 68, 69}, \n\t\t{28, 38, 39, 40, 63, 70, 71, 72, 66, 73, 74, 75, 69, 76, 77, 78}, \n\t\t{40, 47, 48, 13, 72, 79, 80, 49, 75, 81, 82, 53, 78, 83, 84, 57}, \n\t\t{57, 58, 59, 60, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96}, \n\t\t{60, 67, 68, 69, 88, 97, 98, 99, 92, 100, 101, 102, 96, 103, 104, 105}, \n\t\t{69, 76, 77, 78, 99, 106, 107, 108, 102, 109, 110, 111, 105, 112, 113, 114}, \n\t\t{78, 83, 84, 57, 108, 115, 116, 85, 111, 117, 118, 89, 114, 119, 120, 93}, \n\t\t// Handle\n\t\t{121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136}, \n\t\t{124, 137, 138, 121, 128, 139, 140, 125, 132, 141, 142, 129, 136, 143, 144, 133}, \n\t\t{133, 134, 135, 136, 145, 146, 147, 148, 149, 150, 151, 152, 69, 153, 154, 155}, \n\t\t{136, 143, 144, 133, 148, 156, 157, 145, 152, 158, 159, 149, 155, 160, 161, 69}, \n\t\t// Spout\n\t\t{162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177}, \n\t\t{165, 178, 179, 162, 169, 180, 181, 166, 173, 182, 183, 170, 177, 184, 185, 174}, \n\t\t{174, 175, 176, 177, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197}, \n\t\t{177, 184, 185, 174, 189, 198, 199, 186, 193, 200, 201, 190, 197, 202, 203, 194}, \n\t\t// Lid\n\t\t{204, 204, 204, 204, 207, 208, 209, 210, 211, 211, 211, 211, 212, 213, 214, 215}, \n\t\t{204, 204, 204, 204, 210, 217, 218, 219, 211, 211, 211, 211, 215, 220, 221, 222}, \n\t\t{204, 204, 204, 204, 219, 224, 225, 226, 211, 211, 211, 211, 222, 227, 228, 229}, \n\t\t{204, 204, 204, 204, 226, 230, 231, 207, 211, 211, 211, 211, 229, 232, 233, 212}, \n\t\t{212, 213, 214, 215, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245}, \n\t\t{215, 220, 221, 222, 237, 246, 247, 248, 241, 249, 250, 251, 245, 252, 253, 254}, \n\t\t{222, 227, 228, 229, 248, 255, 256, 257, 251, 258, 259, 260, 254, 261, 262, 263}, \n\t\t{229, 232, 233, 212, 257, 264, 265, 234, 260, 266, 267, 238, 263, 268, 269, 242}, \n\t\t// Bottom (not on original teapot)\n\t\t{270, 270, 270, 270, 279, 280, 281, 282, 275, 276, 277, 278, 271, 272, 273, 274}, \n\t\t{270, 270, 270, 270, 282, 289, 290, 291, 278, 286, 287, 288, 274, 283, 284, 285}, \n\t\t{270, 270, 270, 270, 291, 298, 299, 300, 288, 295, 296, 297, 285, 292, 293, 294}, \n\t\t{270, 270, 270, 270, 300, 305, 306, 279, 297, 303, 304, 275, 294, 301, 302, 271}\n\t};\n\n\t// We adjust the indices so they're zero-based ...\n\tstatic bool adjusted = false;\n\tif(!adjusted)\n\t{\n\t\tfor(uint_t i = 0; i != 32; ++i)\n\t\t{\n\t\t\tfor(uint_t j = 0; j != 16; ++j)\n\t\t\t{\n\t\t\t\traw_patches[i][j] = raw_patches[i][j] - 1;\n\t\t\t}\n\t\t}\n\n\t\tadjusted = true;\n\t}\n\n\treturn raw_patches;\n}\n\n} // namespace teapot\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/teapot.h",
    "content": "#ifndef K3DSDK_TEAPOT_H\n#define K3DSDK_TEAPOT_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace teapot\n{\n\n/// Gathers the member arrays of a teapot primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::matrices_t& Matrices,\n\t\tconst mesh::materials_t& Materials,\n\t\tconst mesh::selection_t& Selections,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& SurfaceAttributes);\n\n\tconst mesh::matrices_t& matrices;\n\tconst mesh::materials_t& materials;\n\tconst mesh::selection_t& selections;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& surface_attributes;\n};\n\n/// Gathers the member arrays of a teapot primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::matrices_t& Matrices,\n\t\tmesh::materials_t& Materials,\n\t\tmesh::selection_t& Selections,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& SurfaceAttributes);\n\n\tmesh::matrices_t& matrices;\n\tmesh::materials_t& materials;\n\tmesh::selection_t& selections;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& surface_attributes;\n};\n\n/// Creates a new teapot mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid teapot primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid teapot primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid teapot primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\ntypedef double_t points_array_t[306][3];\ntypedef uint_t patches_array_t[32][16];\n\n/// Returns an array of points which can be used to recreate a Newell Teapot from scratch.\nconst points_array_t& points();\n/// Returns an array of bicubic patch point-indices which can be used to recreate a Newell Teapot from scratch.\nconst patches_array_t& patches();\n\n} // namespace teapot\n\n} // namespace k3d\n\n#endif // !K3DSDK_TEAPOT_H\n\n"
  },
  {
    "path": "k3dsdk/texture3.h",
    "content": "#ifndef K3DSDK_TEXTURE3_H\n#define K3DSDK_TEXTURE3_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n/****************************************************************\n*\n* C++ Vector and Matrix Algebra routines\n* Author: Jean-Francois DOUE\n* Version 3.1 --- October 1993\n*\n****************************************************************/\n\n//\n//\tFrom \"Graphics Gems IV / Edited by Paul S. Heckbert\n//\tAcademic Press, 1994, ISBN 0-12-336156-9\n//\t\"You are free to use and modify this code in any way\n//\tyou like.\" (p. xv)\n//\n//\tModified by J. Nagle, March 1997\n//\t-\tAll functions are inline.\n//\t-\tAll functions are const-correct.\n//\t-\tAll checking is via the standard \"assert\" macro.\n//\n\n// Modified by Tim Shead for use with K-3D, January 1998\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/result.h>\n\n#include <boost/io/ios_state.hpp>\n#include <iomanip>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// texture3\n\n/// Encapsulates a location in three-dimensional space\nclass texture3\n{\npublic:\n\t/// Stores the texture coordinates\n\tdouble n[3];\n\n\ttexture3()\n\t{\n\t\tn[0] = n[1] = n[2] = 0.0;\n\t}\n\n\ttexture3(const double U, const double V)\n\t{\n\t\tn[0] = U;\n\t\tn[1] = V;\n\t\tn[2] = 0.0;\n\t}\n\n\ttexture3(const double U, const double V, const double W)\n\t{\n\t\tn[0] = U;\n\t\tn[1] = V;\n\t\tn[2] = W;\n\t}\n\n\t/// Addition of two texture coordinates\n\ttexture3& operator+=(const texture3& RHS)\n\t{\n\t\tn[0] += RHS.n[0];\n\t\tn[1] += RHS.n[1];\n\t\tn[2] += RHS.n[2];\n\t\treturn *this;\n\t}\n\n\t/// Multiplication by a constant\n\ttexture3& operator*=(const double d)\n\t{\n\t\tn[0] *= d;\n\t\tn[1] *= d;\n\t\tn[2] *= d;\n\t\treturn *this; \n\t}\n\n\t/// Division by a constant\n\ttexture3& operator/=(const double d)\n\t{\n\t\treturn_val_if_fail(d, *this);\n\n\t\tdouble d_inv = 1./d;\n\t\tn[0] *= d_inv;\n\t\tn[1] *= d_inv;\n\t\tn[2] *= d_inv;\n\n\t\treturn *this;\n\t}\n\n\t/// Returns an indexed dimension by reference\n\tdouble& operator[](int i)\n\t{\n\t\treturn n[i];\n\t}\n\n\t/// Returns an indexed dimension by value\n\tdouble operator[](int i) const\n\t{\n\t\treturn n[i];\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const texture3& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.n[0] << \" \" << RHS.n[1] << \" \" << RHS.n[2];\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, texture3& RHS)\n\t{\n\t\tStream >> RHS.n[0] >> RHS.n[1] >> RHS.n[2];\n\t\treturn Stream;\n\t}\n};\n\n/// Negation\ninline const texture3 operator-(const texture3& a)\n{\n\treturn texture3(-a.n[0], -a.n[1], -a.n[2]);\n}\n\n/// Addition\ninline const texture3 operator+(const texture3& a, const texture3& b)\n{\n\treturn texture3(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2]);\n}\n\n/// Multiplication by a constant\ninline const texture3 operator*(const texture3& a, const double d)\n{\n\treturn texture3(d * a.n[0], d * a.n[1], d * a.n[2]);\n}\n\n/// Multiplication by a constant\ninline const texture3 operator*(const double d, const texture3& a)\n{\n\treturn a * d;\n}\n\n/// Division by a constant\ninline const texture3 operator/(const texture3& a, const double d)\n{\n\treturn_val_if_fail(d, texture3());\n\n\tdouble d_inv = 1.0 / d;\n\treturn texture3(a.n[0] * d_inv, a.n[1] * d_inv, a.n[2] * d_inv);\n}\n\n/// Equality\ninline bool operator==(const texture3& a, const texture3& b)\n{\n\treturn (a.n[0] == b.n[0]) && (a.n[1] == b.n[1]) && (a.n[2] == b.n[2]);\n}\n\n/// Inequality\ninline bool operator!=(const texture3& a, const texture3& b)\n{\n\treturn !(a == b);\n}\n\nnamespace difference\n{\n\n/// Specialization of difference::test for texture3\ninline void test(const texture3& A, const texture3& B, accumulator& Result)\n{\n\trange_test(A.n, A.n + 3, B.n, B.n + 3, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_TEXTURE3_H\n\n"
  },
  {
    "path": "k3dsdk/time_sink.h",
    "content": "#ifndef K3DSDK_TIME_SINK_H\n#define K3DSDK_TIME_SINK_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/itime_sink.h>\n\nnamespace k3d\n{\n\nclass idocument;\n\n/// Adds a boilerplate implementation of k3d::itime_sink to a base class, using the parameterized-inheritance idiom\ntemplate<typename base_t>\nclass time_sink :\n\tpublic base_t,\n\tpublic itime_sink\n{\npublic:\n\ttime_sink(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_time(init_owner(*this) + init_name(\"time\") + init_label(_(\"Time\")) + init_description(_(\"Current simulation time.\")) + init_value(0.0))\n\t{\n\t}\n\n\tiproperty& time_sink_input()\n\t{\n\t\treturn m_time;\n\t}\n\nprotected:\n\tk3d_data(double_t, data::immutable_name, data::change_signal, data::with_undo, data::local_storage, data::no_constraint, data::writable_property, data::with_serialization) m_time;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_TIME_SINK_H\n\n"
  },
  {
    "path": "k3dsdk/time_source.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/time_source.h>\n\nnamespace k3d\n{\n\ninode* get_time_source(idocument& Document)\n{\n\tstatic iplugin_factory* const factory = plugin::factory::lookup(\"TimeSource\");\n\treturn_val_if_fail(factory, 0);\n\n\tconst std::vector<inode*> nodes = node::lookup(Document, factory->factory_id());\n\treturn (1 == nodes.size()) ? nodes[0] : 0;\n}\n\niproperty* get_start_time(idocument& Document)\n{\n\tinode* const object = get_time_source(Document);\n\treturn object ? property::get<double_t>(*object, \"start_time\") : 0;\n}\n\niproperty* get_end_time(idocument& Document)\n{\n\tinode* const object = get_time_source(Document);\n\treturn object ? property::get<double_t>(*object, \"end_time\") : 0;\n}\n\niproperty* get_frame_rate(idocument& Document)\n{\n\tinode* const object = get_time_source(Document);\n\treturn object ? property::get<double_t>(*object, \"frame_rate\") : 0;\n}\n\niproperty* get_time(idocument& Document)\n{\n\tinode* const object = get_time_source(Document);\n\treturn object ? property::get<double_t>(*object, \"time\") : 0;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/time_source.h",
    "content": "#ifndef K3DSDK_TIME_SOURCE_H\n#define K3DSDK_TIME_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nclass idocument;\nclass inode;\nclass iproperty;\n\n/// Returns the time source node for a document (could return NULL, if there is no source, or there's more than one)\ninode* get_time_source(idocument& Document);\n/// Returns the start time property for a document (could return NULL)\niproperty* get_start_time(idocument& Document);\n/// Returns the end time property for a document (could return NULL)\niproperty* get_end_time(idocument& Document);\n/// Returns the frame rate property for a document (could return NULL)\niproperty* get_frame_rate(idocument& Document);\n/// Returns the time property for a document (could return NULL)\niproperty* get_time(idocument& Document);\n\n} // namespace k3d\n\n#endif // !K3DSDK_TIME_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/tokens.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/tokens.h>\n#include <string.h>\n\nnamespace k3d\n{\n\nconst char* const make_token(const char* const Token)\n{\n\treturn strdup(Token);\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/tokens.h",
    "content": "#ifndef K3DSDK_TOKENS_H\n#define K3DSDK_TOKENS_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\n/// Inspired by the RenderMan API, this returns a persistent copy of a string, so it can be shared for efficiency, e.g. for property labels and descriptions\nconst char* const make_token(const char* const Token);\n\n} // namespace k3d\n\n#endif // !K3DSDK_TOKENS_H\n\n\n"
  },
  {
    "path": "k3dsdk/torus.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/torus.h>\n\nnamespace k3d\n{\n\nnamespace torus\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// const_primitive\n\nconst_primitive::const_primitive(\n\tconst mesh::matrices_t& Matrices,\n\tconst mesh::materials_t& Materials,\n\tconst mesh::doubles_t& MajorRadii,\n\tconst mesh::doubles_t& MinorRadii,\n\tconst mesh::doubles_t& PhiMin,\n\tconst mesh::doubles_t& PhiMax,\n\tconst mesh::doubles_t& SweepAngles,\n\tconst mesh::selection_t& Selections,\n\tconst mesh::table_t& ConstantAttributes,\n\tconst mesh::table_t& SurfaceAttributes,\n\tconst mesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tmajor_radii(MajorRadii),\n\tminor_radii(MinorRadii),\n\tphi_min(PhiMin),\n\tphi_max(PhiMax),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// primitive\n\nprimitive::primitive(\n\tmesh::matrices_t& Matrices,\n\tmesh::materials_t& Materials,\n\tmesh::doubles_t& MajorRadii,\n\tmesh::doubles_t& MinorRadii,\n\tmesh::doubles_t& PhiMin,\n\tmesh::doubles_t& PhiMax,\n\tmesh::doubles_t& SweepAngles,\n\tmesh::selection_t& Selections,\n\tmesh::table_t& ConstantAttributes,\n\tmesh::table_t& SurfaceAttributes,\n\tmesh::table_t& ParameterAttributes\n\t\t) :\n\tmatrices(Matrices),\n\tmaterials(Materials),\n\tmajor_radii(MajorRadii),\n\tminor_radii(MinorRadii),\n\tphi_min(PhiMin),\n\tphi_max(PhiMax),\n\tsweep_angles(SweepAngles),\n\tselections(Selections),\n\tconstant_attributes(ConstantAttributes),\n\tsurface_attributes(SurfaceAttributes),\n\tparameter_attributes(ParameterAttributes)\n{\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// create\n\nprimitive* create(mesh& Mesh)\n{\n\tmesh::primitive& generic_primitive = Mesh.primitives.create(\"torus\");\n\n\tprimitive* const result = new primitive(\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::matrices_t >(\"matrices\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::materials_t >(\"materials\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"major_radii\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"minor_radii\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"phi_min\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"phi_max\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::doubles_t >(\"sweep_angles\"),\n\t\tgeneric_primitive.structure[\"surface\"].create<mesh::selection_t>(\"selections\"),\n\t\tgeneric_primitive.attributes[\"constant\"],\n\t\tgeneric_primitive.attributes[\"surface\"],\n\t\tgeneric_primitive.attributes[\"parameter\"]\n\t\t);\n\n\tresult->selections.set_metadata_value(metadata::key::role(), metadata::value::selection_role());\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// validate\n\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"torus\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tconst mesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tconst mesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tconst mesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tconst mesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tconst mesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tconst mesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tconst mesh::doubles_t& major_radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"major_radii\");\n\t\tconst mesh::doubles_t& minor_radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"minor_radii\");\n\t\tconst mesh::doubles_t& phi_min = require_array<mesh::doubles_t >(Primitive, surface_structure, \"phi_min\");\n\t\tconst mesh::doubles_t& phi_max = require_array<mesh::doubles_t >(Primitive, surface_structure, \"phi_max\");\n\t\tconst mesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tconst mesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new const_primitive(matrices, materials, major_radii, minor_radii, phi_min, phi_max, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, mesh::primitive& Primitive)\n{\n\tif(Primitive.type != \"torus\")\n\t\treturn 0;\n\n\ttry\n\t{\n\t\trequire_valid_primitive(Mesh, Primitive);\n\n\t\tmesh::table_t& surface_structure = require_structure(Primitive, \"surface\");\n\n\t\tmesh::table_t& constant_attributes = require_attributes(Primitive, \"constant\");\n\t\tmesh::table_t& surface_attributes = require_attributes(Primitive, \"surface\");\n\t\tmesh::table_t& parameter_attributes = require_attributes(Primitive, \"parameter\");\n\n\t\tmesh::matrices_t& matrices = require_array<mesh::matrices_t >(Primitive, surface_structure, \"matrices\");\n\t\tmesh::materials_t& materials = require_array<mesh::materials_t >(Primitive, surface_structure, \"materials\");\n\t\tmesh::doubles_t& major_radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"major_radii\");\n\t\tmesh::doubles_t& minor_radii = require_array<mesh::doubles_t >(Primitive, surface_structure, \"minor_radii\");\n\t\tmesh::doubles_t& phi_min = require_array<mesh::doubles_t >(Primitive, surface_structure, \"phi_min\");\n\t\tmesh::doubles_t& phi_max = require_array<mesh::doubles_t >(Primitive, surface_structure, \"phi_max\");\n\t\tmesh::doubles_t& sweep_angles = require_array<mesh::doubles_t >(Primitive, surface_structure, \"sweep_angles\");\n\t\tmesh::selection_t& selections = require_array<mesh::selection_t>(Primitive, surface_structure, \"selections\");\n\n\t\trequire_metadata(Primitive, selections, \"selections\", metadata::key::role(), metadata::value::selection_role());\n\n\t\trequire_table_row_count(Primitive, parameter_attributes, \"parameter\", surface_structure.row_count() * 4);\n\n\t\treturn new primitive(matrices, materials, major_radii, minor_radii, phi_min, phi_max, sweep_angles, selections, constant_attributes, surface_attributes, parameter_attributes);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tlog() << error << e.what() << std::endl;\n\t}\n\n\treturn 0;\n}\n\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& Primitive)\n{\n  if(!Primitive.get())\n    return 0;\n\n\tif(Primitive->type != \"torus\")\n\t\treturn 0;\n\n  return validate(Mesh, Primitive.writable());\n}\n\n} // namespace torus\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/torus.h",
    "content": "#ifndef K3DSDK_TORUS_H\n#define K3DSDK_TORUS_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace torus\n{\n\n/// Gathers the member arrays of a torus primitive into a convenient package\nclass const_primitive\n{\npublic:\n\tconst_primitive(\n\t\tconst mesh::matrices_t& Matrices,\n\t\tconst mesh::materials_t& Materials,\n\t\tconst mesh::doubles_t& MajorRadii,\n\t\tconst mesh::doubles_t& MinorRadii,\n\t\tconst mesh::doubles_t& PhiMin,\n\t\tconst mesh::doubles_t& PhiMax,\n\t\tconst mesh::doubles_t& SweepAngles,\n\t\tconst mesh::selection_t& Selections,\n\t\tconst mesh::table_t& ConstantAttributes,\n\t\tconst mesh::table_t& SurfaceAttributes,\n\t\tconst mesh::table_t& ParameterAttributes);\n\n\tconst mesh::matrices_t& matrices;\n\tconst mesh::materials_t& materials;\n\tconst mesh::doubles_t& major_radii;\n\tconst mesh::doubles_t& minor_radii;\n\tconst mesh::doubles_t& phi_min;\n\tconst mesh::doubles_t& phi_max;\n\tconst mesh::doubles_t& sweep_angles;\n\tconst mesh::selection_t& selections;\n\tconst mesh::table_t& constant_attributes;\n\tconst mesh::table_t& surface_attributes;\n\tconst mesh::table_t& parameter_attributes;\n};\n\n/// Gathers the member arrays of a torus primitive into a convenient package\nclass primitive\n{\npublic:\n\tprimitive(\n\t\tmesh::matrices_t& Matrices,\n\t\tmesh::materials_t& Materials,\n\t\tmesh::doubles_t& MajorRadii,\n\t\tmesh::doubles_t& MinorRadii,\n\t\tmesh::doubles_t& PhiMin,\n\t\tmesh::doubles_t& PhiMax,\n\t\tmesh::doubles_t& SweepAngles,\n\t\tmesh::selection_t& Selections,\n\t\tmesh::table_t& ConstantAttributes,\n\t\tmesh::table_t& SurfaceAttributes,\n\t\tmesh::table_t& ParameterAttributes);\n\n\tmesh::matrices_t& matrices;\n\tmesh::materials_t& materials;\n\tmesh::doubles_t& major_radii;\n\tmesh::doubles_t& minor_radii;\n\tmesh::doubles_t& phi_min;\n\tmesh::doubles_t& phi_max;\n\tmesh::doubles_t& sweep_angles;\n\tmesh::selection_t& selections;\n\tmesh::table_t& constant_attributes;\n\tmesh::table_t& surface_attributes;\n\tmesh::table_t& parameter_attributes;\n};\n\n/// Creates a new torus mesh primitive, returning references to its member arrays.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* create(mesh& Mesh);\n\n/// Tests the given mesh primitive to see if it is a valid torus primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nconst_primitive* validate(const mesh& Mesh, const mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid torus primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, mesh::primitive& GenericPrimitive);\n/// Tests the given mesh primitive to see if it is a valid torus primitive, returning references to its member arrays, or NULL.\n/// The caller is responsible for the lifetime of the returned object.\nprimitive* validate(const mesh& Mesh, pipeline_data<mesh::primitive>& GenericPrimitive);\n\n} // namespace torus\n\n} // namespace k3d\n\n#endif // !K3DSDK_TORUS_H\n\n"
  },
  {
    "path": "k3dsdk/transform.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/classes.h>\n#include <k3dsdk/plugin.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/ikeyframer.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iparentable.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/transform.h>\n\n#include <iostream>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\nconst matrix4 upstream_matrix(inode& Node)\n{\n\timatrix_sink* const downstream_sink = dynamic_cast<imatrix_sink*>(&Node);\n\treturn_val_if_fail(downstream_sink, k3d::identity3());\n\n\tiproperty& downstream_input = downstream_sink->matrix_sink_input();\n\tiproperty* const upstream_output = Node.document().pipeline().dependency(downstream_input);\n\tif(upstream_output)\n\t\treturn boost::any_cast<k3d::matrix4>(upstream_output->property_internal_value());\n\t\t\n\treturn k3d::identity3();\n}\n\ninode* upstream_frozen_transformation(inode& Node)\n{\n\timatrix_sink* const downstream_sink = dynamic_cast<imatrix_sink*>(&Node);\n\treturn_val_if_fail(downstream_sink, 0);\n\n\tiproperty& downstream_input = downstream_sink->matrix_sink_input();\n\tiproperty* upstream_output = Node.document().pipeline().dependency(downstream_input);\n\t\n\t// Return the directly connected transformation matrix, if there is one\n\tif(upstream_output && upstream_output->property_node() && upstream_output->property_node()->factory().factory_id() == classes::FrozenMatrix())\n\t\treturn upstream_output->property_node();\n\t\n\t// Otherwise check if an animation track was inserted before the modifier\n\tif (upstream_output && upstream_output->property_node())\n\t{\n\t\tk3d::ikeyframer* keyframer = dynamic_cast<k3d::ikeyframer*>(upstream_output->property_node()); \n\t\tif(keyframer)\n\t\t{\n\t\t\tupstream_output = Node.document().pipeline().dependency(keyframer->input_property());\n\t\t\tif(upstream_output && upstream_output->property_node() && upstream_output->property_node()->factory().factory_id() == classes::FrozenMatrix())\n\t\t\t\treturn upstream_output->property_node();\n\t\t}\n\t}\n\n\treturn 0;\n}\n\ninode* insert_transform_modifier(inode& Node)\n{\n\timatrix_sink* const downstream_sink = dynamic_cast<imatrix_sink*>(&Node);\n\treturn_val_if_fail(downstream_sink, 0);\n\n\tiproperty& downstream_input = downstream_sink->matrix_sink_input();\n\tiproperty* const upstream_output = Node.document().pipeline().dependency(downstream_input);\n\n\tinode* const modifier = plugin::create<inode>(classes::FrozenMatrix(), Node.document(), _(\"Transformation\"));\n\treturn_val_if_fail(modifier, 0);\n\timatrix_sink* const modifier_sink = dynamic_cast<imatrix_sink*>(modifier);\n\treturn_val_if_fail(modifier_sink, 0);\n\timatrix_source* const modifier_source = dynamic_cast<imatrix_source*>(modifier);\n\n\tipipeline::dependencies_t dependencies;\n\tdependencies.insert(std::make_pair(&modifier_sink->matrix_sink_input(), upstream_output));\n\tdependencies.insert(std::make_pair(&downstream_input, &modifier_source->matrix_source_output()));\n\tNode.document().pipeline().set_dependencies(dependencies);\n\n\treturn modifier;\n}\n\n} // namespace detail\n\nconst point3 world_position(iunknown& Node)\n{\n\treturn node_to_world_matrix(Node) * point3(0, 0, 0);\n}\n\nconst matrix4 node_to_world_matrix(iunknown& Node)\n{\n\tiproperty* const property = property::get<matrix4>(Node, \"output_matrix\");\n\tif(property)\n\t\treturn boost::any_cast<matrix4>(property->property_internal_value());\n\n\treturn identity3();\n}\n\nconst matrix4 parent_to_world_matrix(iunknown& Node)\n{\n\tiparentable* const parentable = dynamic_cast<iparentable*>(&Node);\n\tinode* const parent = parentable ? boost::any_cast<inode*>(parentable->parent().property_internal_value()) : 0;\n\tif(parent)\n\t\treturn node_to_world_matrix(*parent);\n\n\treturn identity3();\n}\n\nk3d::inode* set_matrix(iunknown& Node, const matrix4& Matrix)\n{\n\tinode* const node = dynamic_cast<inode*>(&Node);\n\treturn_val_if_fail(node, 0);\n\n\t// Check for an upstream FrozenMatrix modifier\n\tif(inode* const modifier = detail::upstream_frozen_transformation(*node))\n\t{\n\t\tconst k3d::matrix4 upstream_matrix = detail::upstream_matrix(*modifier);\n\t\tproperty::set_internal_value(*modifier, \"matrix\", Matrix * inverse(upstream_matrix));\n\t\treturn 0;\n\t}\n\n\t// Create a new one\n\tconst k3d::matrix4 upstream_matrix = detail::upstream_matrix(*node);\n\n\tinode* const modifier = detail::insert_transform_modifier(*node);\n\treturn_val_if_fail(modifier, 0);\n\n\tproperty::set_internal_value(*modifier, \"matrix\", Matrix * inverse(upstream_matrix));\n\n\treturn modifier;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/transform.h",
    "content": "#ifndef K3DSDK_TRANSFORM_H\n#define K3DSDK_TRANSFORM_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n\nnamespace k3d\n{\n\nclass inode;\nclass iunknown;\nclass point3;\n\n/// Returns a node's position in world coordinates (returns the origin for non-transformable nodes)\nconst point3 world_position(iunknown& Node);\n/// Returns a complete, concatenated, node-to-world transformation matrix for the given transformable node.  Returns an identity matrix for non-transformable node.\nconst matrix4 node_to_world_matrix(iunknown& Node);\n/// Returns a complete, concatenated, parent-node-to-world transformation matrix for the given transformable node.  Returns an identity matrix for non-transformable nodes, or transformable nodes without a parent\nconst matrix4 parent_to_world_matrix(iunknown& Node);\n\n/// Sets the transformation matrix (in world coordinates) for a node, automatically adjusts for the parentage of a node. Returns upstream transformation pointer when created, returns 0 if the existing one was updated.\nk3d::inode* set_matrix(iunknown& Node, const k3d::matrix4& Matrix);\n\n} // namespace k3d\n\n#endif // !K3DSDK_TRANSFORM_H\n\n"
  },
  {
    "path": "k3dsdk/transformable.h",
    "content": "#ifndef K3DSDK_TRANSFORMABLE_H\n#define K3DSDK_TRANSFORMABLE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace k3d\n{\n\n/// Provides a boilerplate implementation of an object that can act as a matrix source and sink\ntemplate<typename base_t>\nclass transformable :\n\tpublic base_t,\n\tpublic imatrix_source,\n\tpublic imatrix_sink\n{\npublic:\n\ttransformable(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_input_matrix(init_owner(*this) + init_name(\"input_matrix\") + init_label(_(\"Input Matrix\")) + init_description(\"Input matrix\") + init_value(identity3())),\n\t\tm_output_matrix(init_owner(*this) + init_name(\"output_matrix\") + init_label(_(\"Output Matrix\")) + init_description(_(\"Output Matrix\")) + init_value(identity3()))\n\t{\n\t\tm_input_matrix.changed_signal().connect(hint::converter<\n\t\t\thint::convert<hint::any, hint::none> >(make_update_matrix_slot()));\n\n\t\tm_output_matrix.set_update_slot(sigc::mem_fun(*this, &transformable<base_t>::execute));\n\t}\n\n\tiproperty& matrix_source_output()\n\t{\n\t\treturn m_output_matrix;\n\t}\n\n\tiproperty& matrix_sink_input()\n\t{\n\t\treturn m_input_matrix;\n\t}\n\n\t/// Returns a slot that should be connected to input properties to signal that the output has changed\n\tsigc::slot<void, ihint*> make_update_matrix_slot()\n\t{\n\t\treturn m_output_matrix.make_slot();\n\t}\n\n\t/// Convenience function that returns this object's transformation matrix\n\tconst matrix4 matrix()\n\t{\n\t\treturn m_output_matrix.pipeline_value();\n\t}\n\nprotected:\n\tk3d_data(matrix4, data::immutable_name, data::change_signal, data::no_undo, data::local_storage, data::no_constraint, data::writable_property, data::with_serialization) m_input_matrix;\n\nprivate:\n\tk3d_data(matrix4, data::immutable_name, data::change_signal, data::no_undo, data::value_demand_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_output_matrix;\n\n\t/// Called whenever the output has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, matrix4& Output)\n\t{\n\t\t// We can safely ignore any hints ...\n\t\ton_update_matrix(m_input_matrix.pipeline_value(), Output);\n\t}\n\n\t/// Override this in derived classes, to return a new / modified transformation matrix.\n\tvirtual void on_update_matrix(const matrix4& Input, matrix4& Output)\n\t{\n\t\tOutput = Input;\n\t}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_TRANSFORMABLE_H\n\n"
  },
  {
    "path": "k3dsdk/triangulator.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/sgi_tesselator.h>\n#include <k3dsdk/triangulator.h>\n#include <set>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////////\n// triangulator::implementation\n\nclass triangulator::implementation\n{\npublic:\n\timplementation(triangulator& Owner) :\n\t\towner(Owner),\n\t\ttessellator(sgiNewTess())\n\t{\n\t\t// Note: specifying an edge flag callback ensures that we don't receive triangle fans or triangle strips\n\n\t\tsgiTessCallback(tessellator, GLU_TESS_BEGIN_DATA, reinterpret_cast<callback_t>(&raw_begin_callback));\n\t\tsgiTessCallback(tessellator, GLU_TESS_COMBINE_DATA, reinterpret_cast<callback_t>(&raw_combine_callback));\n//\t\tsgiTessCallback(tessellator, GLU_TESS_EDGE_FLAG, reinterpret_cast<callback_t>(&raw_edge_flag_callback));\n\t\tsgiTessCallback(tessellator, GLU_TESS_VERTEX_DATA, reinterpret_cast<callback_t>(&raw_vertex_callback));\n\t\tsgiTessCallback(tessellator, GLU_TESS_END_DATA, reinterpret_cast<callback_t>(&raw_end_callback));\n\t\tsgiTessCallback(tessellator, GLU_TESS_ERROR_DATA, reinterpret_cast<callback_t>(&raw_error_callback));\n\t}\n\n\t~implementation()\n\t{\n\t\tsgiDeleteTess(tessellator);\n\t}\n\n\tvoid process(const mesh& Mesh, const polyhedron::const_primitive& Polyhedron)\n\t{\n\t\tconst uint_t face_begin = 0;\n\t\tconst uint_t face_end = face_begin + Polyhedron.face_first_loops.size();\n\t\tfor(uint_t face = face_begin; face != face_end; ++face)\n\t\t{\n\t\t\tprocess(\n\t\t\t\t*Mesh.points,\n\t\t\t\tPolyhedron.face_first_loops,\n\t\t\t\tPolyhedron.face_loop_counts,\n\t\t\t\tPolyhedron.loop_first_edges,\n\t\t\t\tPolyhedron.vertex_points,\n\t\t\t\tPolyhedron.clockwise_edges,\n\t\t\t\tface);\n\t\t}\n\t}\n\n\n\tvoid process(\n\t\tconst mesh::points_t& Points,\n\t\tconst mesh::indices_t& FaceFirstLoops,\n\t\tconst mesh::counts_t& FaceLoopCounts,\n\t\tconst mesh::indices_t& LoopFirstEdges,\n\t\tconst mesh::indices_t& EdgePoints,\n\t\tconst mesh::indices_t& ClockwiseEdges,\n\t\tconst uint_t Face)\n\t{\n\t\towner.start_face(Face);\n\n\t\tvertex_edges.resize(Points.size());\n\n\t\tsgiTessBeginPolygon(tessellator, this);\n\n\t\tconst uint_t loop_begin = FaceFirstLoops[Face];\n\t\tconst uint_t loop_end = loop_begin + FaceLoopCounts[Face];\n\n\t\tfor(uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tsgiTessBeginContour(tessellator);\n\n\t\t\tconst uint_t first_edge = LoopFirstEdges[loop];\n\t\t\tfor(uint_t edge = first_edge; ; )\n\t\t\t{\n\t\t\t\tvertex_edges[EdgePoints[edge]] = edge;\n\n\t\t\t\tsgiTessVertex(tessellator, const_cast<double_t*>(Points[EdgePoints[edge]].n), const_cast<void*>(reinterpret_cast<void*>(EdgePoints[edge])));\n\n\t\t\t\tedge = ClockwiseEdges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tsgiTessEndContour(tessellator);\n\t\t}\n\n\t\tsgiTessEndPolygon(tessellator);\n\n\t\towner.finish_face(Face);\n\t}\n\n\tvoid begin_callback(GLenum Mode)\n\t{\n\t\tmode = Mode;\n\t\tvertex_count = 0;\n\t\tflip_strip = false;\n\t}\n\n\tvoid combine_callback(GLdouble Coords[3], void* VertexData[4], GLfloat Weight[4], void** OutputData)\n\t{\n\t\tconst k3d::point3 coordinates(Coords[0], Coords[1], Coords[2]);\n\n\t\tuint_t vertices[4];\n\t\tvertices[0] = reinterpret_cast<uint_t>(VertexData[0]);\n\t\tvertices[1] = reinterpret_cast<uint_t>(VertexData[1]);\n\t\tvertices[2] = reinterpret_cast<uint_t>(VertexData[2]);\n\t\tvertices[3] = reinterpret_cast<uint_t>(VertexData[3]);\n\n\t\tuint_t edges[4];\n\t\tedges[0] = vertex_edges[vertices[0]];\n\t\tedges[1] = vertex_edges[vertices[1]];\n\t\tedges[2] = vertex_edges[vertices[2]];\n\t\tedges[3] = vertex_edges[vertices[3]];\n\n\t\tdouble_t weights[4];\n\t\tweights[0] = Weight[0];\n\t\tweights[1] = Weight[1];\n\t\tweights[2] = Weight[2];\n\t\tweights[3] = Weight[3];\n\n\t\tuint_t new_vertex = 0;\n\t\towner.add_vertex(coordinates, vertices, edges, weights, new_vertex);\n\n\t\twhile(vertex_edges.size() <= new_vertex)\n\t\t\tvertex_edges.push_back(0);\n\n\t\t*OutputData = reinterpret_cast<void*>(new_vertex);\n\t}\n\n\tvoid vertex_callback(void* VertexData)\n\t{\n\t\tvertices[std::min(static_cast<uint_t>(2), vertex_count)] = reinterpret_cast<uint_t>(VertexData);\n\n\t\tif(++vertex_count > 2)\n\t\t{\n\t\t\tuint_t triangle_vertices[3];\n\t\t\tswitch(mode)\n\t\t\t{\n\t\t\t\tcase GL_TRIANGLE_FAN:\n\t\t\t\t\ttriangle_vertices[0] = vertices[0];\n\t\t\t\t\ttriangle_vertices[1] = vertices[1];\n\t\t\t\t\ttriangle_vertices[2] = vertices[2];\n\n\t\t\t\t\tvertices[1] = vertices[2];\n\t\t\t\t\tbreak;\n\t\t\t\tcase GL_TRIANGLE_STRIP:\n\t\t\t\t\tif(flip_strip)\n\t\t\t\t\t{\n\t\t\t\t\t\ttriangle_vertices[0] = vertices[2];\n\t\t\t\t\t\ttriangle_vertices[1] = vertices[1];\n\t\t\t\t\t\ttriangle_vertices[2] = vertices[0];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\ttriangle_vertices[0] = vertices[0];\n\t\t\t\t\t\ttriangle_vertices[1] = vertices[1];\n\t\t\t\t\t\ttriangle_vertices[2] = vertices[2];\n\t\t\t\t\t}\n\n\t\t\t\t\tflip_strip = !flip_strip;\n\t\t\t\t\tvertices[0] = vertices[1];\n\t\t\t\t\tvertices[1] = vertices[2];\n\t\t\t\t\tbreak;\n\t\t\t\tcase GL_TRIANGLES:\n\t\t\t\t\ttriangle_vertices[0] = vertices[0];\n\t\t\t\t\ttriangle_vertices[1] = vertices[1];\n\t\t\t\t\ttriangle_vertices[2] = vertices[2];\n\n\t\t\t\t\tvertex_count = 0;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tuint_t triangle_edges[3];\n\t\t\ttriangle_edges[0] = vertex_edges[triangle_vertices[0]];\n\t\t\ttriangle_edges[1] = vertex_edges[triangle_vertices[1]];\n\t\t\ttriangle_edges[2] = vertex_edges[triangle_vertices[2]];\n\t\t\t\t\t\n\t\t\towner.add_triangle(triangle_vertices, triangle_edges);\n\t\t}\n\t}\n\n\tvoid end_callback()\n\t{\n\t}\n\n\tvoid error_callback(GLenum ErrorNumber)\n\t{\n\t\tlog() << error << k3d_file_reference << \" \" << gluErrorString(ErrorNumber) << std::endl;\n\t}\n\n\tstatic implementation* instance(void* UserData)\n\t{\n\t\treturn reinterpret_cast<implementation*>(UserData);\n\t}\n\n\tstatic void raw_begin_callback(GLenum Mode, void* UserData)\n\t{\n\t\tinstance(UserData)->begin_callback(Mode);\n\t}\n\n\tstatic void raw_combine_callback(GLdouble Coords[3], void* VertexData[4], GLfloat Weight[4], void** OutputData, void* UserData)\n\t{\n\t\tinstance(UserData)->combine_callback(Coords, VertexData, Weight, OutputData);\n\t}\n\n\tstatic void raw_edge_flag_callback(GLboolean)\n\t{\n\t\t// Note: Even though we don't use it, specifying this edge flag callback ensures that we don't receive triangle fans or triangle strips\n\t}\n\n\tstatic void raw_vertex_callback(void* VertexData, void* UserData)\n\t{\n\t\tinstance(UserData)->vertex_callback(VertexData);\n\t}\n\n\tstatic void raw_end_callback(void* UserData)\n\t{\n\t\tinstance(UserData)->end_callback();\n\t}\n\n\tstatic void raw_error_callback(GLenum ErrorNumber, void* UserData)\n\t{\n\t\tinstance(UserData)->error_callback(ErrorNumber);\n\t}\n\n\ttriangulator& owner;\n\tSGItesselator* const tessellator;\n\n\tGLenum mode;\n\tuint_t vertex_count;\n\tuint_t vertices[3];\n\tbool flip_strip;\n\tstd::vector<uint_t> vertex_edges;\n};\n\n/////////////////////////////////////////////////////////////////////////////////\n// triangulator\n\ntriangulator::triangulator() :\n\tm_implementation(new implementation(*this))\n{\n}\n\ntriangulator::~triangulator()\n{\n\tdelete m_implementation;\n}\n\nvoid triangulator::process(const mesh& SourceMesh, const polyhedron::const_primitive& Polyhedron)\n{\n\tstart_processing(SourceMesh);\n\tm_implementation->process(SourceMesh, Polyhedron);\n\tfinish_processing(SourceMesh);\n}\n\nvoid triangulator::process(\n\tconst mesh::points_t& Points,\n\tconst mesh::indices_t& FaceFirstLoops,\n\tconst mesh::counts_t& FaceLoopCounts,\n\tconst mesh::indices_t& LoopFirstEdges,\n\tconst mesh::indices_t& EdgePoints,\n\tconst mesh::indices_t& ClockwiseEdges,\n\tconst uint_t Face)\n{\n\tm_implementation->process(\n\t\tPoints,\n\t\tFaceFirstLoops,\n\t\tFaceLoopCounts,\n\t\tLoopFirstEdges,\n\t\tEdgePoints,\n\t\tClockwiseEdges,\n\t\tFace);\n}\n\nvoid triangulator::start_processing(const mesh& SourceMesh)\n{\n}\n\nvoid triangulator::start_face(const uint_t Face)\n{\n}\n\nvoid triangulator::add_vertex(const point3& Coordinates, uint_t Vertices[4], uint_t Edges[4], double_t Weights[4], uint_t& NewVertex)\n{\n}\n\nvoid triangulator::add_triangle(uint_t Points[3], uint_t Edges[3])\n{\n}\n\nvoid triangulator::finish_face(const uint_t Face)\n{\n}\n\nvoid triangulator::finish_processing(const mesh& SourceMesh)\n{\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/triangulator.h",
    "content": "#ifndef K3DSDK_TRIANGULATOR_H\n#define K3DSDK_TRIANGULATOR_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/mesh.h>\n\nnamespace k3d\n{\n\nnamespace polyhedron { class const_primitive; }\n\n/// Provides a template design pattern object for triangulating polyhedra.\n/// To generate triangulated data, derive from k3d::triangulator and\n/// override the private virtual methods to process triangles\nclass triangulator\n{\npublic:\n\ttriangulator();\n\t~triangulator();\n\n\t/// Generates triangles for every face in a polyhedron\n\tvoid process(const mesh& Mesh, const polyhedron::const_primitive& Polyhedron);\n\n\t/// Generates triangles for a single polyhedron face\n\tvoid process(\n\t\tconst mesh::points_t& Points,\n\t\tconst mesh::indices_t& FaceFirstLoops,\n\t\tconst mesh::counts_t& FaceLoopCounts,\n\t\tconst mesh::indices_t& LoopFirstEdges,\n\t\tconst mesh::indices_t& VertexPoints,\n\t\tconst mesh::indices_t& ClockwiseEdges,\n\t\tconst uint_t Face);\n\nprivate:\n\t/// Called once before processin begins on the given mesh\n\tvirtual void start_processing(const mesh& SourceMesh);\n\t/// Called once before processing begins on the given polygon face\n\tvirtual void start_face(const uint_t Face);\n\t/// Called anytime the triangulation process needs to create a new vertex (e.g: when edges cross within a self-intersecting polygon)\n\tvirtual void add_vertex(const point3& Coordinates, uint_t Vertices[4], uint_t Edges[4], double_t Weights[4], uint_t& NewVertex);\n\t/// Called once for each triangle generated\n\tvirtual void add_triangle(uint_t Vertices[3], uint_t Edges[3]);\n\t/// Called once after processing for the given face has been completed\n\tvirtual void finish_face(const uint_t Face);\n\t/// Called once after the entire mesh has been processed\n\tvirtual void finish_processing(const mesh& SourceMesh);\n\n\tclass implementation;\n\timplementation* const m_implementation;\n\n\tfriend class implementation;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_TRIANGULATOR_H\n\n"
  },
  {
    "path": "k3dsdk/type_registry.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/gl/context.h>\n#include <k3dsdk/gl/context_factory.h>\n#include <k3dsdk/gl/offscreen_context.h>\n#include <k3dsdk/gl/offscreen_context_factory.h>\n#include <k3dsdk/i3d_2d_mapping.h>\n#include <k3dsdk/ibitmap_exporter.h>\n#include <k3dsdk/ibitmap_importer.h>\n#include <k3dsdk/ibitmap_sink.h>\n#include <k3dsdk/ibitmap_source.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/icolor_source.h>\n#include <k3dsdk/idisplacement_shader_ri.h>\n#include <k3dsdk/idocument_exporter.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/idouble_source.h>\n#include <k3dsdk/ievent_loop.h>\n#include <k3dsdk/ifile_change_notifier.h>\n#include <k3dsdk/iimager_shader_ri.h>\n#include <k3dsdk/iint32_source.h>\n#include <k3dsdk/ikeyframer.h>\n#include <k3dsdk/ilight_gl.h>\n#include <k3dsdk/ilight_ri.h>\n#include <k3dsdk/ilight_shader_ri.h>\n#include <k3dsdk/ilight_yafray.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imaterial_ri.h>\n#include <k3dsdk/imaterial_yafray.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/imesh_selection_algorithm.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/imesh_storage.h>\n#include <k3dsdk/imime_type_handler.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_selection.h>\n#include <k3dsdk/irender_animation.h>\n#include <k3dsdk/irender_camera_animation.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/irender_camera_preview.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/irender_frame.h>\n#include <k3dsdk/irender_preview.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/istring_source.h>\n#include <k3dsdk/isurface_shader_ri.h>\n#include <k3dsdk/itexture.h>\n#include <k3dsdk/itexture_ri.h>\n#include <k3dsdk/itime_sink.h>\n#include <k3dsdk/itransform_array_1d.h>\n#include <k3dsdk/itransform_array_2d.h>\n#include <k3dsdk/itransform_array_3d.h>\n#include <k3dsdk/iuri_handler.h>\n#include <k3dsdk/ivector3_source.h>\n#include <k3dsdk/ivolume_shader_ri.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/texture3.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/types.h>\n\n#include <map>\n\n#if defined(__GNUC__) &&  __GNUC__ >= 3\n\n\t#define K3D_HAVE_GCC_DEMANGLE\n\n\t// http://lists.debian.org/debian-gcc/2003/09/msg00055.html notes\n\t// that, in cxxabi.h of gcc-3.x for x < 4, this type is used before it\n\t// is declared.\n\n\t#if __GNUC__ == 3 && __GNUC_MINOR__ < 4\n\t\tclass __class_type_info;\n\t#endif\n\n\t#include <cxxabi.h>\n#endif\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\n/// \"Wraps\" a std::type_info object so it can be used as the key in a sorted container\nstruct type_info\n{\n\ttype_info(const std::type_info& Info) :\n\t\tinfo(Info)\n\t{\n\t}\n\n\tbool operator<(const type_info& RHS) const\n\t{\n\t\treturn info.before(RHS.info);\n\t}\n\n\tconst std::type_info& info;\n};\n\n/// Defines storage for a mapping of type_info objects to their corresponding string representation\ntypedef std::map<type_info, string_t> type_to_name_map_t;\n/// Stores a mapping of type_info objects to their corresponding string representation\ntype_to_name_map_t type_to_name_map;\n\n/// Defines storage for a mapping of string to the corresponding type_info\ntypedef std::map<string_t, type_info> name_to_type_map_t;\n/// Stores a mapping of string to the corresponding type_info\nname_to_type_map_t name_to_type_map;\n\nvoid register_type(const std::type_info& Info, const string_t& Name)\n{\n\tif(type_to_name_map.count(type_info(Info)))\n\t{\n\t\tk3d::log() << error << k3d_file_reference << \": attempt to re-register type [\" << demangle(Info) << \"] with existing name [\" << type_to_name_map[type_info(Info)] << \"] under new name [\" << Name << \"]\" << std::endl;\n\t\treturn;\n\t}\n\n\tif(type_to_name_map.count(type_info(Info)) || name_to_type_map.count(Name))\n\t{\n\t\tk3d::log() << error << k3d_file_reference << \": attempt to register new type [\" << demangle(Info) << \"] using existing name [\" << Name << \"]\" << std::endl;\n\t\treturn;\n\t}\n\n\ttype_to_name_map.insert(std::make_pair(type_info(Info), Name));\n\tname_to_type_map.insert(std::make_pair(Name, type_info(Info)));\n}\n\nvoid initialize_types()\n{\n\tstatic bool initialized = false;\n\tif(initialized)\n\t\treturn;\n\n\tregister_type(typeid(k3d::angle_axis), \"k3d::angle_axis\");\n\tregister_type(typeid(k3d::bitmap), \"k3d::bitmap\");\n\tregister_type(typeid(k3d::bitmap*), \"k3d::bitmap*\");\n\tregister_type(typeid(k3d::bool_t), \"k3d::bool_t\");\n\tregister_type(typeid(k3d::bounding_box3), \"k3d::bounding_box3\");\n\tregister_type(typeid(k3d::color), \"k3d::color\");\n\tregister_type(typeid(k3d::double_t), \"k3d::double_t\");\n\tregister_type(typeid(k3d::filesystem::path), \"k3d::filesystem::path\");\n\tregister_type(typeid(k3d::float_t), \"k3d::float_t\");\n\tregister_type(typeid(k3d::gl::context), \"k3d::gl::context\");\n\tregister_type(typeid(k3d::gl::context_factory), \"k3d::gl::context_factory\");\n\tregister_type(typeid(k3d::gl::offscreen_context), \"k3d::gl::offscreen_context\");\n\tregister_type(typeid(k3d::gl::offscreen_context_factory), \"k3d::gl::offscreen_context_factory\");\n\tregister_type(typeid(k3d::gl::ilight), \"k3d::gl::ilight\");\n\tregister_type(typeid(k3d::gl::imesh_painter), \"k3d::gl::imesh_painter\");\n\tregister_type(typeid(k3d::gl::imesh_painter*), \"k3d::gl::imesh_painter*\");\n\tregister_type(typeid(k3d::half_t), \"k3d::half_t\");\n\tregister_type(typeid(k3d::i3d_2d_mapping), \"k3d::i3d_2d_mapping\");\n\tregister_type(typeid(k3d::ibitmap_exporter), \"k3d::ibitmap_exporter\");\n\tregister_type(typeid(k3d::ibitmap_importer), \"k3d::ibitmap_importer\");\n\tregister_type(typeid(k3d::ibitmap_sink), \"k3d::ibitmap_sink\");\n\tregister_type(typeid(k3d::ibitmap_source), \"k3d::ibitmap_source\");\n\tregister_type(typeid(k3d::icamera), \"k3d::icamera\");\n\tregister_type(typeid(k3d::icolor_source), \"k3d::icolor_source\");\n\tregister_type(typeid(k3d::idocument_exporter), \"k3d::idocument_exporter\");\n\tregister_type(typeid(k3d::idocument_importer), \"k3d::idocument_importer\");\n\tregister_type(typeid(k3d::idouble_source), \"k3d::idouble_source\");\n\tregister_type(typeid(k3d::ievent_loop), \"k3d::ievent_loop\");\n\tregister_type(typeid(k3d::ifile_change_notifier), \"k3d::ifile_change_notifier\");\n\tregister_type(typeid(k3d::iint32_source), \"k3d::iint32_source\");\n\tregister_type(typeid(k3d::ikeyframer), \"k3d::ikeyframer\");\n\tregister_type(typeid(k3d::imaterial), \"k3d::imaterial\");\n\tregister_type(typeid(k3d::imaterial*), \"k3d::imaterial*\");\n\tregister_type(typeid(k3d::imesh_selection_algorithm), \"k3d::imesh_selection_algorithm\");\n\tregister_type(typeid(k3d::imesh_sink), \"k3d::imesh_sink\");\n\tregister_type(typeid(k3d::imesh_source), \"k3d::imesh_source\");\n\tregister_type(typeid(k3d::imesh_storage), \"k3d::imesh_storage\");\n\tregister_type(typeid(k3d::imime_type_handler), \"k3d::imime_type_handler\");\n\tregister_type(typeid(k3d::imulti_mesh_sink), \"k3d::imulti_mesh_sink\");\n\tregister_type(typeid(k3d::inode), \"k3d::inode\");\n\tregister_type(typeid(k3d::inode*), \"k3d::inode*\");\n\tregister_type(typeid(k3d::inode_selection), \"k3d::inode_selection\");\n\tregister_type(typeid(k3d::inode_selection*), \"k3d::inode_selection*\");\n\tregister_type(typeid(k3d::int16_t), \"k3d::int16_t\");\n\tregister_type(typeid(k3d::int32_t), \"k3d::int32_t\");\n\tregister_type(typeid(k3d::int64_t), \"k3d::int64_t\");\n\tregister_type(typeid(k3d::int8_t), \"k3d::int8_t\");\n\tregister_type(typeid(k3d::irender_animation), \"k3d::irender_animation\");\n\tregister_type(typeid(k3d::irender_camera_animation), \"k3d::irender_camera_animation\");\n\tregister_type(typeid(k3d::irender_camera_frame), \"k3d::irender_camera_frame\");\n\tregister_type(typeid(k3d::irender_camera_preview), \"k3d::irender_camera_preview\");\n\tregister_type(typeid(k3d::irender_frame), \"k3d::irender_frame\");\n\tregister_type(typeid(k3d::irender_preview), \"k3d::irender_preview\");\n\tregister_type(typeid(k3d::iscript_engine), \"k3d::iscript_engine\");\n\tregister_type(typeid(k3d::istring_source), \"k3d::istring_source\");\n\tregister_type(typeid(k3d::itexture), \"k3d::itexture\");\n\tregister_type(typeid(k3d::itexture*), \"k3d::itexture*\");\n\tregister_type(typeid(k3d::itime_sink), \"k3d::itime_sink\");\n\tregister_type(typeid(k3d::itransform_array_1d), \"k3d::itransform_array_1d\");\n\tregister_type(typeid(k3d::itransform_array_2d), \"k3d::itransform_array_2d\");\n\tregister_type(typeid(k3d::itransform_array_3d), \"k3d::itransform_array_3d\");\n\tregister_type(typeid(k3d::imatrix_sink), \"k3d::imatrix_sink\");\n\tregister_type(typeid(k3d::imatrix_source), \"k3d::imatrix_source\");\n\tregister_type(typeid(k3d::iunknown), \"k3d::iunknown\");\n\tregister_type(typeid(k3d::iunknown*), \"k3d::iunknown*\");\n\tregister_type(typeid(k3d::iuri_handler), \"k3d::iuri_handler\");\n\tregister_type(typeid(k3d::ivector3_source), \"k3d::ivector3_source\");\n\tregister_type(typeid(k3d::matrix4), \"k3d::matrix4\");\n\tregister_type(typeid(k3d::mesh), \"k3d::mesh\");\n\tregister_type(typeid(k3d::mesh*), \"k3d::mesh*\");\n\tregister_type(typeid(k3d::normal3), \"k3d::normal3\");\n\tregister_type(typeid(k3d::point2), \"k3d::point2\");\n\tregister_type(typeid(k3d::point3), \"k3d::point3\");\n\tregister_type(typeid(k3d::point4), \"k3d::point4\");\n\tregister_type(typeid(k3d::ri::idisplacement_shader), \"k3d::ri::idisplacement_shader\");\n\tregister_type(typeid(k3d::ri::iimager_shader), \"k3d::ri::iimager_shader\");\n\tregister_type(typeid(k3d::ri::ilight), \"k3d::ri::ilight\");\n\tregister_type(typeid(k3d::ri::ilight_shader), \"k3d::ri::ilight_shader\");\n\tregister_type(typeid(k3d::ri::imaterial), \"k3d::ri::imaterial\");\n\tregister_type(typeid(k3d::ri::imesh_painter), \"k3d::ri::imesh_painter\");\n\tregister_type(typeid(k3d::ri::imesh_painter*), \"k3d::ri::imesh_painter*\");\n\tregister_type(typeid(k3d::ri::irender_engine), \"k3d::ri::irender_engine\");\n\tregister_type(typeid(k3d::ri::irender_engine*), \"k3d::ri::irender_engine*\");\n\tregister_type(typeid(k3d::ri::isurface_shader), \"k3d::ri::isurface_shader\");\n\tregister_type(typeid(k3d::ri::itexture), \"k3d::ri::itexture\");\n\tregister_type(typeid(k3d::ri::itexture*), \"k3d::ri::itexture*\");\n\tregister_type(typeid(k3d::ri::ivolume_shader), \"k3d::ri::ivolume_shader\");\n\tregister_type(typeid(k3d::rectangle), \"k3d::rectangle\");\n\tregister_type(typeid(k3d::selection::set), \"k3d::selection::set\");\n\tregister_type(typeid(k3d::string_t), \"k3d::string_t\");\n\tregister_type(typeid(k3d::texture3), \"k3d::texture3\");\n\tregister_type(typeid(k3d::uint16_t), \"k3d::uint16_t\");\n\tregister_type(typeid(k3d::uint32_t), \"k3d::uint32_t\");\n\tregister_type(typeid(k3d::uint64_t), \"k3d::uint64_t\");\n\tregister_type(typeid(k3d::uint8_t), \"k3d::uint8_t\");\n\tregister_type(typeid(k3d::vector2), \"k3d::vector2\");\n\tregister_type(typeid(k3d::vector3), \"k3d::vector3\");\n\tregister_type(typeid(k3d::yafray::ilight), \"k3d::yafray::ilight\");\n\tregister_type(typeid(k3d::yafray::imaterial), \"k3d::yafray::imaterial\");\n\n\t/** \\todo Come up with a more explicit type for these */\n\tregister_type(typeid(k3d::typed_array<unsigned int>), \"k3d::typed_array<unsigned int>\");\n\tregister_type(typeid(k3d::typed_array<k3d::double_t>), \"k3d::typed_array<k3d::double_t>\");\n\tregister_type(typeid(std::vector<k3d::point3>), \"std::vector<k3d::point3>\");\n\tregister_type(typeid(std::vector<unsigned int>), \"std::vector<unsigned int>\");\n\tregister_type(typeid(std::vector<k3d::inode*>), \"std::vector<k3d::inode*>\");\n\n\tinitialized = true;\n}\n\nconst string_t demangle(const string_t& Type)\n{\n\tstring_t result = Type;\n\n#ifdef K3D_HAVE_GCC_DEMANGLE\n\n\tint status = 0;\n\tchar* const temp = ::abi::__cxa_demangle(Type.c_str(), 0, 0, &status);\n\tif(temp && (status == 0))\n\t\tresult = temp;\n\tif(temp)\n\t\t::free(temp);\n\n#endif // K3D_HAVE_GCC_DEMANGLE\n\n\treturn result;\n}\n\n} // namespace detail\n\nbool_t type_registered(const std::type_info& Info)\n{\n\tdetail::initialize_types();\n\n\treturn detail::type_to_name_map.count(detail::type_info(Info));\n}\n\nconst string_t type_string(const std::type_info& Info)\n{\n\tdetail::initialize_types();\n\n\tdetail::type_to_name_map_t::iterator type = detail::type_to_name_map.find(detail::type_info(Info));\n\tif(type != detail::type_to_name_map.end())\n\t\treturn type->second;\n\n\tlog() << error << k3d_file_reference << \": unknown type: \" << demangle(Info) << std::endl;\n\treturn \"\";\n}\n\nconst std::type_info* type_id(const string_t& Name)\n{\n\tdetail::initialize_types();\n\n\tdetail::name_to_type_map_t::iterator type = detail::name_to_type_map.find(Name);\n\tif(type != detail::name_to_type_map.end())\n\t\treturn &type->second.info;\n\n\tlog() << error << k3d_file_reference << \": unknown type: \" << Name << std::endl;\n\treturn 0;\n}\n\nconst std::type_info& type_id_k3d_bitmap_ptr()\n{\n    return typeid(k3d::bitmap*);\n}\n\nconst string_t demangle(const std::type_info& Type)\n{\n\treturn detail::demangle(Type.name());\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/type_registry.h",
    "content": "#ifndef K3DSDK_TYPE_REGISTRY_H\n#define K3DSDK_TYPE_REGISTRY_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n#include <typeinfo>\n\nnamespace k3d\n{\n\n/// Returns true iff the given type is registered\nbool_t type_registered(const std::type_info& Info);\n/// Returns true iff the given type if registered\ntemplate<typename T>\nbool_t type_registered()\n{\n\treturn type_registered(typeid(T));\n}\n\n/// Returns the string representation for a registered type, or an empty string\nconst string_t type_string(const std::type_info& Info);\n/// Returns the string representation for a registered type, or an empty string\ntemplate<typename T>\nconst string_t type_string()\n{\n\treturn type_string(typeid(T));\n}\n\n/// Returns the type_info representation of a registered type, or NULL\nconst std::type_info* type_id(const string_t& Name);\n\nconst std::type_info& type_id_k3d_bitmap_ptr();\n\n/// Returns an informal, human-readable string representation for the given type.\n/// On platforms that support it, the returned string will be the fully-qualified\n/// type-name, including namespaces.  Otherwise, the result will be the mangled\n/// symbol name or some other unique string representation.\n///\n/// Note: this function is only for use in error-messages and for troubleshooting,\n/// you cannot make any assumptions about the return values.\nconst string_t demangle(const std::type_info& Type);\n\n} // namespace k3d\n\n#endif // !K3DSDK_TYPE_REGISTRY_H\n\n"
  },
  {
    "path": "k3dsdk/typed_array.h",
    "content": "#ifndef K3DSDK_TYPED_ARRAY_H\n#define K3DSDK_TYPED_ARRAY_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/array.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/type_registry.h>\n\n#include <algorithm>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Strongly-typed dynamic array of objects, based on std::vector\ntemplate<typename T>\nclass typed_array :\n\tpublic std::vector<T>,\n\tpublic array\n{\n\ttypedef std::vector<T> base_type;\n\ttypedef typed_array<T> this_type;\n\npublic:\n\ttyped_array() :\n\t\tstd::vector<T>()\n\t{\n\t}\n\n\texplicit typed_array(const uint_t count) :\n\t\tstd::vector<T>(count)\n\t{\n\t}\n\n\ttyped_array(const uint_t count, const T& val) :\n\t\tstd::vector<T>(count, val)\n\t{\n\t}\n\n\ttyped_array(const typed_array<T>& right) :\n\t\tstd::vector<T>(right),\n\t\tarray(right.metadata)\n\t{\n\t}\n\n\ttemplate<class IteratorT>\n\ttyped_array(const IteratorT first, const IteratorT last) :\n\t\tstd::vector<T>(first, last)\n\t{\n\t}\n\n\tconst string_t type_string() const\n\t{\n\t\treturn k3d::type_string<T>();\n\t}\n\n\tvoid print(std::ostream& Stream) const\n\t{\n\t\tfor(typename base_type::const_iterator i = base_type::begin(); i != base_type::end(); ++i)\n\t\t\tStream << block_delimiter << *i;\n\t}\n\n\tarray* clone_type() const\n\t{\n\t\tthis_type* const result = new this_type();\n\t\tresult->metadata = metadata;\n\t\treturn result;\n\t}\n\n\tarray* clone() const\n\t{\n\t\tthis_type* const result = new this_type(*this);\n\t\treturn result;\n\t}\n\n\tarray* clone(const uint_t Begin, const uint_t End) const\n\t{\n\t\tthis_type* const result = new this_type(this->begin() + Begin, this->begin() + End);\n\t\tresult->metadata = metadata;\n\t\treturn result;\n\t}\n\n\tvoid resize(const uint_t NewSize)\n\t{\n\t\tbase_type::resize(NewSize);\n\t}\n\n\tvoid resize(const uint_t NewSize, const T& Value)\n\t{\n\t\tbase_type::resize(NewSize, Value);\n\t}\n\n\tuint_t size() const\n\t{\n\t\treturn base_type::size();\n\t}\n\n\tbool_t empty() const\n\t{\n\t\treturn base_type::empty();\n\t}\n\n\tvoid difference(const array& Other, difference::accumulator& Result) const\n\t{\n\t\tconst this_type* const other = dynamic_cast<const this_type*>(&Other);\n\t\tResult.exact(other ? true : false);\n\n\t\tif(other)\n\t\t\tdifference(*other, Result);\n\t}\n\n\tvoid difference(const this_type& Other, difference::accumulator& Result) const\n\t{\n\t\tResult.exact(metadata == Other.metadata);\n\t\trange_test(base_type::begin(), base_type::end(), Other.begin(), Other.end(), Result);\n\t}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_TYPED_ARRAY_H\n\n"
  },
  {
    "path": "k3dsdk/types.h",
    "content": "#ifndef K3DSDK_TYPES_H\n#define K3DSDK_TYPES_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-platform-config.h>\n#include <k3dsdk/Half/half.h>\n#include <boost/cstdint.hpp>\n#include <string>\n\nnamespace k3d\n{\n\ntypedef bool bool_t;\n\ntypedef boost::int8_t int8_t;\ntypedef boost::int16_t int16_t;\ntypedef boost::int32_t int32_t;\ntypedef boost::int64_t int64_t;\n\ntypedef boost::uint8_t uint8_t;\ntypedef boost::uint16_t uint16_t;\ntypedef boost::uint32_t uint32_t;\ntypedef boost::uint64_t uint64_t;\n\ntypedef ::half half_t;\ntypedef float float_t;\ntypedef double double_t;\n\ntypedef std::string string_t;\n\n#if defined K3D_UINT_T_32_BITS\n\ttypedef uint32_t uint_t;\n#elif defined K3D_UINT_T_64_BITS\n\ttypedef uint64_t uint_t;\n#else\n\t#error \"Unknown size for k3d::uint_t\"\n#endif\n\n} // namespace k3d\n\n#endif // !K3DSDK_TYPES_H\n\n"
  },
  {
    "path": "k3dsdk/types_ri.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the k3d::ri::render class, which provides a default implementation of k3d::ri::irender\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/types_ri.h>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\n//////////////////////////////////////////////////////////////////////////////////////\n// parameter\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const integer& Value) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(new typed_array<integer>(1, Value))\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const unsigned_integer& Value) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(new typed_array<unsigned_integer>(1, Value))\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const real& Value) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(new typed_array<real>(1, Value))\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const string& Value) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(new typed_array<string>(1, Value))\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const point& Value) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(new typed_array<point>(1, Value))\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const vector& Value) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(new typed_array<vector>(1, Value))\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const normal& Value) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(new typed_array<normal>(1, Value))\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const color& Value) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(new typed_array<color>(1, Value))\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const hpoint& Value) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(new typed_array<hpoint>(1, Value))\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const matrix& Value) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(new typed_array<matrix>(1, Value))\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<integer>* Values) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(Values)\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<unsigned_integer>* Values) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(Values)\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<real>* Values) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(Values)\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<string>* Values) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(Values)\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<point>* Values) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(Values)\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<vector>* Values) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(Values)\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<normal>* Values) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(Values)\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<color>* Values) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(Values)\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<hpoint>* Values) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(Values)\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<matrix>* Values) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(Values)\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const array* Values) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize),\n\tstorage(Values)\n{\n}\n\nparameter::parameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const boost::any&) :\n\tname(Name),\n\tstorage_class(StorageClass),\n\ttuple_size(TupleSize)\n{\n\tassert_not_implemented();\n}\n\n\n} // namespace ri\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/types_ri.h",
    "content": "#ifndef K3DSDK_TYPES_RI_H\n#define K3DSDK_TYPES_RI_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/bounding_box3.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/typed_array.h>\n#include <k3dsdk/types.h>\n\n#include <boost/any.hpp>\n#include <boost/shared_ptr.hpp>\n\n#include <list>\n#include <vector>\n\nnamespace k3d\n{\n\nnamespace ri\n{\n\n/// RenderMan integer datatype\ntypedef k3d::int32_t integer;\n/// RenderMan unsigned integer datatype\ntypedef k3d::uint32_t unsigned_integer;\n/// RenderMan real datatype\ntypedef k3d::double_t real;\n/// RenderMan string datatype\ntypedef std::string string;\n/// RenderMan point datatype\ntypedef k3d::point3 point;\n/// RenderMan vector datatype\ntypedef k3d::vector3 vector;\n/// RenderMan normal datatype\ntypedef k3d::normal3 normal;\n/// Renderman color datatype\ntypedef k3d::color color;\n/// Renderman hpoint datatype\ntypedef k3d::point4 hpoint;\n/// RenderMan matrix datatype\ntypedef k3d::matrix4 matrix;\n/// Filesystem path datatype\ntypedef k3d::filesystem::path path;\n/// 3D bounding-box datatype\ntypedef k3d::bounding_box3 bound;\n/// RenderMan light handle datatype\ntypedef k3d::uint32_t light_handle;\n/// RenderMan object handle datatype\ntypedef k3d::uint32_t object_handle;\n\n/// RenderMan integer array\ntypedef std::vector<integer> integers;\n/// RenderMan unsigned integer array\ntypedef std::vector<unsigned_integer> unsigned_integers;\n/// RenderMan real array\ntypedef std::vector<real> reals;\n/// RenderMan string array\ntypedef std::vector<string> strings;\n/// RenderMan point array\ntypedef std::vector<point> points;\n/// RenderMan vector array\ntypedef std::vector<vector> vectors;\n/// RenderMan normal array\ntypedef std::vector<normal> normals;\n/// RenderMan color array\ntypedef std::vector<color> colors;\n/// RenderMan hpoint array\ntypedef std::vector<hpoint> hpoints;\n/// RenderMan matrix array\ntypedef std::vector<matrix> matrices;\n\n/// Enumerates parameter storage classes defined by the RenderMan standard\ntypedef enum\n{\n\tCONSTANT,\n\tUNIFORM,\n\tVARYING,\n\tVERTEX,\n\tFACEVARYING\n} storage_class_t;\n\n/// Defines a named array of homogeneous RenderMan data\nclass parameter\n{\npublic:\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const integer& Value);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const unsigned_integer& Value);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const real& Value);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const string& Value);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const point& Value);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const vector& Value);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const normal& Value);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const color& Value);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const hpoint& Value);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const matrix& Value);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<integer>* Values);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<unsigned_integer>* Values);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<real>* Values);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<string>* Values);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<point>* Values);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<vector>* Values);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<normal>* Values);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<color>* Values);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<hpoint>* Values);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const typed_array<matrix>* Values);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const array* Values);\n\tparameter(const string& Name, const storage_class_t StorageClass, const unsigned_integer TupleSize, const boost::any& Value);\n\n\tconst string name;\n\tconst storage_class_t storage_class;\n\tconst unsigned_integer tuple_size;\n\tboost::shared_ptr<const k3d::array> storage;\n};\n\n/// Defines a collection of named arrays\ntypedef std::list<parameter> parameter_list;\n\n/// Defines a collection of intra-frame sample times in the range [0, 1]\ntypedef std::vector<real> sample_times_t;\n\n/// Enumerates possible values for the current render context\ntypedef enum\n{\n\t/// We're generating a CSG solid object\n\tCSG_SOLID,\n\t/// We're generating an object instance\n\tOBJECT_INSTANCE,\n\t/// We're generating a shadow map\n\tSHADOW_MAP,\n\t/// We're generating an environment map\n\tENVIRONMENT_MAP,\n\t/// We're generating the final output frame\n\tFINAL_FRAME,\n\n} render_context_t;\n\n} // namespace ri\n\n} // namespace k3d\n\n#endif // !K3DSDK_TYPES_RI_H\n\n"
  },
  {
    "path": "k3dsdk/uint_t_array.h",
    "content": "#ifndef K3DSDK_UINT_T_ARRAY_H\n#define K3DSDK_UINT_T_ARRAY_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/array.h>\n\n#include <algorithm>\n#include <vector>\n\nnamespace k3d\n{\n\n/// Strongly-typed dynamic array of k3d::uint_t values, based on std::vector.\n/// We declare this is a special-type to prevent conflicts with k3d::typed_array.\nclass uint_t_array :\n\tpublic std::vector<uint_t>,\n\tpublic array\n{\n\ttypedef std::vector<uint_t> base_type;\n\ttypedef uint_t_array this_type;\n\npublic:\n\tuint_t_array() :\n\t\tbase_type()\n\t{\n\t}\n\n\texplicit uint_t_array(const uint_t count) :\n\t\tbase_type(count)\n\t{\n\t}\n\n\tuint_t_array(const uint_t count, const uint_t& val) :\n\t\tbase_type(count, val)\n\t{\n\t}\n\n\tuint_t_array(const this_type& right) :\n\t\tbase_type(right),\n\t\tarray(right.metadata)\n\t{\n\t}\n\n\ttemplate<class IteratorT>\n\tuint_t_array(const IteratorT first, const IteratorT last) :\n\t\tbase_type(first, last)\n\t{\n\t}\n\n\tconst string_t type_string() const\n\t{\n\t\t// We have to hard-code our result here.\n\t\treturn \"k3d::uint_t\";\n\t}\n\n\tvoid print(std::ostream& Stream) const\n\t{\n\t\tfor(base_type::const_iterator i = base_type::begin(); i != base_type::end(); ++i)\n\t\t\tStream << block_delimiter << *i;\n\t}\n\n\tarray* clone_type() const\n\t{\n\t\tthis_type* const result = new this_type();\n\t\tresult->metadata = metadata;\n\t\treturn result;\n\t}\n\n\tarray* clone() const\n\t{\n\t\tthis_type* const result = new this_type(*this);\n\t\treturn result;\n\t}\n\n\tarray* clone(const uint_t Begin, const uint_t End) const\n\t{\n\t\tthis_type* const result = new this_type(this->begin() + Begin, this->begin() + End);\n\t\tresult->metadata = metadata;\n\t\treturn result;\n\t}\n\n\tvoid resize(const uint_t NewSize)\n\t{\n\t\tbase_type::resize(NewSize);\n\t}\n\n\tvoid resize(const uint_t NewSize, const uint_t& Value)\n\t{\n\t\tbase_type::resize(NewSize, Value);\n\t}\n\n\tuint_t size() const\n\t{\n\t\treturn base_type::size();\n\t}\n\n\tbool_t empty() const\n\t{\n\t\treturn base_type::empty();\n\t}\n\n\tvoid difference(const array& Other, difference::accumulator& Result) const\n\t{\n\t\tconst this_type* const other = dynamic_cast<const this_type*>(&Other);\n\t\tResult.exact(other ? true : false);\n\n\t\tif(other)\n\t\t\tdifference(*other, Result);\n\t}\n\n\tvoid difference(const this_type& Other, difference::accumulator& Result) const\n\t{\n\t\tResult.exact(metadata == Other.metadata);\n\t\trange_test(base_type::begin(), base_type::end(), Other.begin(), Other.end(), Result);\n\t}\n};\n\nnamespace difference\n{\n\n/// Specialization of difference::test for k3d::uint_t_array\ninline void test(const uint_t_array& A, const uint_t_array& B, accumulator& Result)\n{\n\tA.difference(B, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_UINT_T_ARRAY_H\n\n"
  },
  {
    "path": "k3dsdk/user_interface.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/user_interface_init.h>\n#include <k3dsdk/user_interface.h>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\n/// Stores the global user_interface object\niuser_interface* g_user_interface = 0;\n\t\n} // namespace detail\n\t\nvoid set_user_interface(iuser_interface& UserInterface)\n{\n\treturn_if_fail(!detail::g_user_interface);\n\tdetail::g_user_interface = &UserInterface;\n}\n\niuser_interface& user_interface()\n{\n\tassert_critical(detail::g_user_interface);\n\treturn *detail::g_user_interface;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/user_interface.h",
    "content": "#ifndef K3DSDK_USER_INTERFACE_H\n#define K3DSDK_USER_INTERFACE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nclass iuser_interface;\n\n/// Returns the global user interface object\niuser_interface& user_interface();\n\n} // namespace k3d\n\n#endif // !K3DSDK_USER_INTERFACE_H\n\n"
  },
  {
    "path": "k3dsdk/user_interface_init.h",
    "content": "#ifndef K3DSDK_USER_INTERFACE_INIT_H\n#define K3DSDK_USER_INTERFACE_INIT_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\nnamespace k3d\n{\n\nclass iuser_interface;\n\n/// Sets the global singleton user interface object (call once at startup)\nvoid set_user_interface(iuser_interface& UserInterface);\n\n} // namespace k3d\n\n#endif // !K3DSDK_USER_INTERFACE_INIT_H\n\n"
  },
  {
    "path": "k3dsdk/user_property.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ipersistent.h>\n#include <k3dsdk/ipersistent_collection.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/user_property.h>\n\nnamespace k3d\n{\n\nnamespace user\n{\n\n////////////////////////////////////////////////////////////////////////////////////////////////////\n// property_container\n\nproperty_container::property_container(iunknown& Owner) :\n\tm_property_collection(dynamic_cast<iproperty_collection*>(&Owner)),\n\tm_persistent_collection(dynamic_cast<ipersistent_collection*>(&Owner))\n{\n\t// Keep track of user properties ...\n\tif(m_property_collection)\n\t\tm_user_properties = property::user_properties(Owner);\n\n\t// Keep track of serialized properties ...\n\tif(m_persistent_collection)\n\t{\n\t\tconst std::vector<std::pair<string_t, ipersistent*> > persistent_objects = m_persistent_collection->persistent_objects();\n\t\tfor(uint_t i = 0; i != persistent_objects.size(); ++i)\n\t\t{\n\t\t\tif(dynamic_cast<iuser_property*>(persistent_objects[i].second))\n\t\t\t{\n\t\t\t\tm_persistent_property_names.push_back(persistent_objects[i].first);\n\t\t\t\tm_persistent_properties.push_back(persistent_objects[i].second);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid property_container::restore_state()\n{\n\t// Unregister existing user properties and disable their serialization\n\tif(m_property_collection)\n\t\tm_property_collection->unregister_properties(property::user_properties(*m_property_collection));\n\n\tif(m_persistent_collection)\n\t{\n\t\tconst std::vector<std::pair<string_t, ipersistent*> > persistent_objects = m_persistent_collection->persistent_objects();\n\t\tfor(uint_t i = 0; i != persistent_objects.size(); ++i)\n\t\t{\n\t\t\tif(dynamic_cast<iuser_property*>(persistent_objects[i].second))\n\t\t\t\tm_persistent_collection->disable_serialization(*persistent_objects[i].second);\n\t\t}\n\t}\n\n\t// Register our properties and enable their serialization\n\tif(m_property_collection)\n\t\tm_property_collection->register_properties(m_user_properties);\n\n\tif(m_persistent_collection)\n\t{\n\t\tfor(uint_t i = 0; i != m_persistent_property_names.size(); ++i)\n\t\t\tm_persistent_collection->enable_serialization(m_persistent_property_names[i], *m_persistent_properties[i]);\n\t}\n}\n\n} // namespace user\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/user_property.h",
    "content": "#ifndef K3DSDK_USER_PROPERTY_H\n#define K3DSDK_USER_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/istate_container.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\nclass iproperty_collection;\nclass ipersistent_collection;\nclass iproperty;\n\nnamespace user\n{\n\n////////////////////////////////////////////////////////////////////////////////////////////////////\n// property_container\n\n/// istate_container implementation that handles undo/redo for the set of user properties within a property collection\nclass property_container :\n\tpublic istate_container\n{\npublic:\n\tproperty_container(iunknown& Owner);\n\tvoid restore_state();\n\nprivate:\n\tiproperty_collection* const m_property_collection;\n\tipersistent_collection* const m_persistent_collection;\n\tstd::vector<iproperty*> m_user_properties;\n\tstd::vector<string_t> m_persistent_property_names;\n\tstd::vector<ipersistent*> m_persistent_properties;\n};\n\n} // namespace user\n\n} // namespace k3d\n\n#endif // !K3DSDK_USER_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/user_property_changed_signal.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\n#include <k3dsdk/log.h>\n#include <iomanip>\n\nnamespace k3d\n{\n\nuser_property_changed_signal::user_property_changed_signal(iproperty_collection& Collection) :\n\tm_collection(Collection)\n{\n\tCollection.connect_properties_changed_signal(sigc::mem_fun(*this, &user_property_changed_signal::on_collection_changed));\n\ton_collection_changed(0);\n}\n\nsigc::connection user_property_changed_signal::connect(const sigc::slot<void, ihint*>& Slot)\n{\n\treturn m_changed_signal.connect(Slot);\n}\n\nvoid user_property_changed_signal::on_collection_changed(ihint*)\n{\n\tfor(connections_t::iterator connection = m_connections.begin(); connection != m_connections.end(); ++connection)\n\t\tconnection->disconnect();\n\tm_connections.clear();\n\n\tconst iproperty_collection::properties_t& properties = m_collection.properties();\n\tfor(iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t{\n\t\tif(dynamic_cast<iuser_property*>(*property))\n\t\t\tm_connections.push_back((*property)->property_changed_signal().connect(m_changed_signal.make_slot()));\n\t}\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/user_property_changed_signal.h",
    "content": "#ifndef K3DSDK_USER_PROPERTY_CHANGED_SIGNAL_H\n#define K3DSDK_USER_PROPERTY_CHANGED_SIGNAL_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/signal_system.h>\n#include <vector>\n\nnamespace k3d\n{\n\nclass iproperty;\nclass iproperty_collection;\n\n/// Tracks user properties as they are added/removed from a property collection, and emits a signal whenever any user property value changeds\nclass user_property_changed_signal\n{\npublic:\n\tuser_property_changed_signal(iproperty_collection& Collection);\n\n\tsigc::connection connect(const sigc::slot<void, ihint*>& Slot);\n\nprivate:\n\tvoid on_collection_changed(ihint*);\n\n\tiproperty_collection& m_collection;\n\tsigc::signal<void, ihint*> m_changed_signal;\n\ttypedef std::vector<sigc::connection> connections_t;\n\tconnections_t m_connections;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_USER_PROPERTY_CHANGED_SIGNAL_H\n\n"
  },
  {
    "path": "k3dsdk/ustring.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ustring.h>\n\nnamespace k3d\n{\n\nconst ustring::size_type ustring::npos = Glib::ustring::npos;\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/ustring.h",
    "content": "#ifndef K3DSDK_USTRING_H\n#define K3DSDK_USTRING_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <glibmm/ustring.h>\n\nnamespace k3d\n{\n\n/// UTF-8 string class that is based on Glib::ustring, with some omissions\n/** \\note: Does not provide implicit conversions to/from std::string */\n/** \\note: Does not insertion and extraction operators */\nclass ustring\n{\npublic:\n\ttypedef Glib::ustring::size_type size_type;\n\ttypedef Glib::ustring::difference_type difference_type;\n\ttypedef gunichar value_type;\n\ttypedef gunichar& reference;\n\ttypedef const gunichar& const_reference;\n\ttypedef Glib::ustring::iterator iterator;\n\ttypedef Glib::ustring::const_iterator const_iterator;\n\ttypedef Glib::ustring::reverse_iterator reverse_iterator;\n\ttypedef Glib::ustring::const_reverse_iterator const_reverse_iterator;\n\n\tstatic const size_type npos;\n\n\t/*! Default constructor, which creates an empty string.\n\t*/\n\tustring();\n\n\t~ustring();\n\n\t/*! Construct a ustring as a copy of another ustring.\n\t* @param other A source string.\n\t*/\n\tustring(const ustring& other);\n\n\t/*! Construct a ustring as a copy of a substring.\n\t* @param src %Source ustring.\n\t* @param i Index of first character to copy from.\n\t* @param n Number of characters to copy (defaults to copying the remainder).\n\t*/\n\tustring(const ustring& src, size_type i, size_type n=npos);\n\n\t/*! Construct a ustring as multiple characters.\n\t* @param n Number of characters.\n\t* @param uc UCS-4 code point to use.\n\t*/  \n\tustring(size_type n, gunichar uc);\n\n\t/// Constructs a ustring from a string that already contains UTF-8 characters (i.e. no conversion is performed)\n\tstatic ustring from_utf8(const std::string& src);\n\t/// Constructs a ustring from a string that already contains UTF-8 characters (i.e. no conversion is performed)\n\tstatic ustring from_utf8(const char* src);\n\n\t/*! Assign the value of another string to this string.\n\t* @param other A source string.\n\t*/ \n\tustring& operator=(const ustring& other);\n\n\t/*! Swap contents with another string.\n\t* @param other String to swap with.\n\t*/\n\tvoid swap(ustring& other);\n\n\t//! @name Assign new contents.\n\t//! @{\n\n\tustring& assign(const ustring& src);\n\tustring& assign(const ustring& src, size_type i, size_type n);\n\tustring& assign(size_type n, gunichar uc);\n\n\t//! @}\n\t//! @name Append to the string.\n\t//! @{\n\n\tustring operator+(const ustring& src) const;\n\tustring& operator+=(const ustring& src);\n\tustring& operator+=(gunichar uc);\n\tvoid push_back(gunichar uc);\n\n\tustring& append(const ustring& src);\n\tustring& append(const ustring& src, size_type i, size_type n);\n\tustring& append(size_type n, gunichar uc);\n\n\t//! @}\n\t//! @name Insert into the string.\n\t//! @{\n\n\tustring& insert(size_type i, const ustring& src);\n\tustring& insert(size_type i, const ustring& src, size_type i2, size_type n);\n\tustring& insert(size_type i, size_type n, gunichar uc);\n\titerator insert(iterator p, gunichar uc);\n\tvoid     insert(iterator p, size_type n, gunichar uc);\n\n\t//! @}\n\t//! @name Replace sub-strings.\n\t//! @{\n\n\tustring& replace(size_type i, size_type n, const ustring& src);\n\tustring& replace(size_type i, size_type n, const ustring& src, size_type i2, size_type n2);\n\tustring& replace(size_type i, size_type n, size_type n2, gunichar uc);\n\tustring& replace(iterator pbegin, iterator pend, const ustring& src);\n\tustring& replace(iterator pbegin, iterator pend, size_type n, gunichar uc);\n\n\t//! @}\n\t//! @name Erase sub-strings.\n\t//! @{\n\n\tvoid clear();\n\tustring& erase(size_type i, size_type n=npos);\n\tustring& erase();\n\titerator erase(iterator p);\n\titerator erase(iterator pbegin, iterator pend);\n\n\t//! @}\n\t//! @name Compare and collate.\n\t//! @{\n\n\tint compare(const ustring& rhs) const;\n\tint compare(size_type i, size_type n, const ustring& rhs) const;\n\tint compare(size_type i, size_type n, const ustring& rhs, size_type i2, size_type n2) const;\n\n\t/*! Create a unique sorting key for the UTF-8 string.  If you need to\n\t* compare UTF-8 strings regularly, e.g. for sorted containers such as\n\t* <tt>std::set<></tt>, you should consider creating a collate key first\n\t* and compare this key instead of the actual string.\n\t*\n\t* The ustring::compare() methods as well as the relational operators\n\t* <tt>==&nbsp;!=&nbsp;<&nbsp;>&nbsp;<=&nbsp;>=</tt> are quite costly\n\t* because they have to deal with %Unicode and the collation rules defined by\n\t* the current locale.  Converting both operands to UCS-4 is just the first\n\t* of several costly steps involved when comparing ustrings.  So be careful.\n\t*/\n\tstd::string collate_key() const;\n\n\t/*! Create a unique key for the UTF-8 string that can be used for caseless\n\t* sorting.  <tt>ustr.casefold_collate_key()</tt> results in the same string\n\t* as <tt>ustr.casefold().collate_key()</tt>, but the former is likely more\n\t* efficient.\n\t*/\n\tstd::string casefold_collate_key() const;\n\n\t//! @}\n\t//! @name Extract characters and sub-strings.\n\t//! @{\n\n\t/*! No reference return; use replace() to write characters. */\n\tvalue_type operator[](size_type i) const;\n\n\t/*! No reference return; use replace() to write characters. @throw std::out_of_range */\n\tvalue_type at(size_type i) const;\n\n\tinline ustring substr(size_type i=0, size_type n=npos) const;\n\n\t//! @}\n\t//! @name Access a sequence of characters.\n\t//! @{\n\n\titerator begin();\n\titerator end();\n\tconst_iterator begin() const;\n\tconst_iterator end()   const;\n\treverse_iterator rbegin();\n\treverse_iterator rend();\n\tconst_reverse_iterator rbegin() const;\n\tconst_reverse_iterator rend()   const;\n\n\t//! @}\n\t//! @name Find sub-strings.\n\t//! @{\n\n\tsize_type find(const ustring& str, size_type i=0) const;\n\tsize_type find(gunichar uc, size_type i=0) const;\n\n\tsize_type rfind(const ustring& str, size_type i=npos) const;\n\tsize_type rfind(gunichar uc, size_type i=npos) const;\n\n\t//! @}\n\t//! @name Match against a set of characters.\n\t//! @{\n\n\tsize_type find_first_of(const ustring& match, size_type i=0) const;\n\tsize_type find_first_of(gunichar uc, size_type i=0) const;\n\n\tsize_type find_last_of(const ustring& match, size_type i=npos) const;\n\tsize_type find_last_of(gunichar uc, size_type i=npos) const;\n\n\tsize_type find_first_not_of(const ustring& match, size_type i=0) const;\n\tsize_type find_first_not_of(gunichar uc, size_type i=0) const;\n\n\tsize_type find_last_not_of(const ustring& match, size_type i=npos) const;\n\tsize_type find_last_not_of(gunichar uc, size_type i=npos) const;\n\t\n\t//! @}\n\t//! @name Retrieve the string's size.\n\t//! @{\n\n\t/** Returns true if the string is empty. Equivalent to *this == \"\".\n\t* @result Whether the string is empty.\n\t*/\n\tbool empty()  const;\n\n\t/** Returns the number of characters in the string, not including any null-termination.\n\t* @result The number of UTF-8 characters.\n\t*\n\t* @see bytes(), empty() \n\t*/\n\tsize_type size()   const;\n\n\t//We have length() as well as size(), because std::string has both.\n\n\t/** This is the same as size().\n\t*/\n\tsize_type length() const;\n\n\t/** Returns the number of bytes in the string, not including any null-termination.\n\t* @result The number of bytes.\n\t*\n\t* @see size(), empty()\n\t*/\n\tsize_type bytes()  const;\n\n\t//! @}\n\t//! @name Change the string's size.\n\t//! @{\n\n\tvoid resize(size_type n, gunichar uc);\n\n\t//! @}\n\t//! @name Control the allocated memory.\n\t//! @{\n\n\tsize_type capacity() const;\n\tsize_type max_size() const;\n\tvoid reserve(size_type n=0);\n\n\t//! @}\n\t//! @name Get a per-byte representation of the string.\n\t//! @{\n\n\tconst std::string& raw() const;\n\n\tconst std::string& utf8_str() const;\n\n\t//! @}\n\t//! @name UTF-8 utilities.\n\t//! @{\n\n\t/*! Check whether the string is valid UTF-8. */\n\tbool validate() const;\n\n\t/*! Check whether the string is valid UTF-8. */\n\tbool validate(iterator& first_invalid);\n\n\t/*! Check whether the string is valid UTF-8. */\n\tbool validate(const_iterator& first_invalid) const;\n\n\t/*! Check whether the string is plain 7-bit ASCII. @par\n\t* Unlike any other ustring method, is_ascii() is safe to use on invalid\n\t* UTF-8 strings.  If the string isn't valid UTF-8, it cannot be valid\n\t* ASCII either, therefore is_ascii() will just return @c false then.\n\t* @return Whether the string contains only ASCII characters.\n\t*/\n\tbool is_ascii() const;\n\n\t/*! \"Normalize\" the %Unicode character representation of the string. */\n//\tustring normalize(Glib::ustring::NormalizeMode mode = Glib::ustring::NORMALIZE_DEFAULT_COMPOSE) const;\n\n\t//! @}\n\t//! @name Character case conversion.\n\t//! @{\n\n\t/*! Returns a new UTF-8 string with all characters characters converted to\n\t* their lowercase equivalent, while honoring the current locale.  The\n\t* resulting string may change in the number of bytes as well as in the\n\t* number of characters.  For instance, the German sharp&nbsp;s\n\t* <tt>&quot;&szlig;&quot;</tt> will be replaced by two characters\n\t* <tt>\"SS\"</tt> because there is no capital <tt>&quot;&szlig;&quot;</tt>.\n\t*/\n\tustring uppercase() const;\n\n\t/*! Returns a new UTF-8 string with all characters characters converted to\n\t* their lowercase equivalent, while honoring the current locale.  The\n\t* resulting string may change in the number of bytes as well as in the\n\t* number of characters.\n\t*/\n\tustring lowercase() const;\n\n\t/*! Returns a caseless representation of the UTF-8 string.  The resulting\n\t* string doesn't correspond to any particular case, therefore the result\n\t* is only useful to compare strings and should never be displayed to the\n\t* user.\n\t*/\n\tustring casefold() const;\n\n//! @}\n\n\tfriend bool operator<(const ustring& lhs, const ustring& rhs);\n\tfriend bool operator==(const ustring& lhs, const ustring& rhs);\n\tfriend bool operator!=(const ustring& lhs, const ustring& rhs);\n\nprivate:\n\tustring(const Glib::ustring& str);\n\tGlib::ustring storage;\n};\n\ninline ustring::ustring() {}\ninline ustring::~ustring() {}\ninline ustring::ustring(const ustring& other) : storage(other.storage) {}\ninline ustring::ustring(const ustring& src, size_type i, size_type n) : storage(src.storage, i, n) {}\ninline ustring::ustring(size_type n, gunichar uc) : storage(n, uc) {}\ninline ustring::ustring(const Glib::ustring& str) : storage(str) {}\ninline ustring ustring::from_utf8(const std::string& src) { return ustring(Glib::ustring(src)); }\ninline ustring ustring::from_utf8(const char* src) { return ustring(Glib::ustring(src)); }\ninline ustring& ustring::operator=(const ustring& other) { storage = other.storage; return *this; }\ninline void ustring::swap(ustring& other) { storage.swap(other.storage); }\ninline ustring& ustring::assign(const ustring& src) { storage.assign(src.storage); return *this; }\ninline ustring& ustring::assign(const ustring& src, size_type i, size_type n) { storage.assign(src.storage, i, n); return *this; }\ninline ustring& ustring::assign(size_type n, gunichar uc) { storage.assign(n, uc); return *this; }\ninline ustring ustring::operator+(const ustring& src) const { ustring temp(storage); temp += src; return temp; }\ninline ustring& ustring::operator+=(const ustring& src) { storage += src.storage; return *this; }\ninline ustring& ustring::operator+=(gunichar uc) { storage += uc; return *this; }\ninline void ustring::push_back(gunichar uc) { storage.push_back(uc); }\ninline ustring& ustring::append(const ustring& src) { storage.append(src.storage); return *this; }\ninline ustring& ustring::append(const ustring& src, size_type i, size_type n) { storage.append(src.storage, i, n); return *this; }\ninline ustring& ustring::append(size_type n, gunichar uc) { storage.append(n, uc); return *this; }\ninline ustring& ustring::insert(size_type i, const ustring& src) { storage.insert(i, src.storage); return *this; }\ninline ustring& ustring::insert(size_type i, const ustring& src, size_type i2, size_type n) { storage.insert(i, src.storage, i2, n); return *this; }\ninline ustring& ustring::insert(size_type i, size_type n, gunichar uc) { storage.insert(i, n, uc); return *this; }\ninline ustring::iterator ustring::insert(ustring::iterator p, gunichar uc) { return storage.insert(p, uc); }\ninline void ustring::insert(ustring::iterator p, size_type n, gunichar uc) { storage.insert(p, n, uc); }\ninline ustring& ustring::replace(size_type i, size_type n, const ustring& src) { storage.replace(i, n, src.storage); return *this; }\ninline ustring& ustring::replace(size_type i, size_type n, const ustring& src, size_type i2, size_type n2) { storage.replace(i, n, src.storage, i2, n2); return *this; }\ninline ustring& ustring::replace(size_type i, size_type n, size_type n2, gunichar uc) { storage.replace(i, n, n2, uc); return *this; }\ninline ustring& ustring::replace(iterator pbegin, iterator pend, const ustring& src) { storage.replace(pbegin, pend, src.storage); return *this; }\ninline ustring& ustring::replace(iterator pbegin, iterator pend, size_type n, gunichar uc) { storage.replace(pbegin, pend, n, uc); return *this; }\ninline void ustring::clear() { storage.clear(); }\ninline ustring& ustring::erase(size_type i, size_type n) { storage.erase(i, n); return *this; }\ninline ustring& ustring::erase() { storage.erase(); return *this; }\ninline ustring::iterator ustring::erase(ustring::iterator p) { return storage.erase(p); }\ninline ustring::iterator ustring::erase(ustring::iterator pbegin, iterator pend) { return storage.erase(pbegin, pend); }\ninline int ustring::compare(const ustring& rhs) const { return storage.compare(rhs.storage); }\ninline int ustring::compare(size_type i, size_type n, const ustring& rhs) const { return storage.compare(i, n, rhs.storage); }\ninline int ustring::compare(size_type i, size_type n, const ustring& rhs, size_type i2, size_type n2) const { return storage.compare(i, n, rhs.storage, i2, n2); }\ninline std::string ustring::collate_key() const { return storage.collate_key(); }\ninline std::string ustring::casefold_collate_key() const { return storage.casefold_collate_key(); }\ninline ustring::value_type ustring::operator[](size_type i) const { return storage[i]; }\ninline ustring::value_type ustring::at(size_type i) const { return storage.at(i); }\ninline ustring ustring::substr(size_type i, size_type n) const { return storage.substr(i, n); }\ninline ustring::iterator ustring::begin() { return storage.begin(); }\ninline ustring::iterator ustring::end() { return storage.end(); }\ninline ustring::const_iterator ustring::begin() const { return storage.begin(); }\ninline ustring::const_iterator ustring::end() const { return storage.end(); }\ninline ustring::reverse_iterator ustring::rbegin() { return storage.rbegin(); }\ninline ustring::reverse_iterator ustring::rend() { return storage.rend(); }\ninline ustring::const_reverse_iterator ustring::rbegin() const { return storage.rbegin(); }\ninline ustring::const_reverse_iterator ustring::rend() const { return storage.rend(); }\ninline ustring::size_type ustring::find(const ustring& str, size_type i) const { return storage.find(str.storage, i); }\ninline ustring::size_type ustring::find(gunichar uc, size_type i) const { return storage.find(uc, i); }\ninline ustring::size_type ustring::rfind(const ustring& str, size_type i) const { return storage.rfind(str.storage, i); }\ninline ustring::size_type ustring::rfind(gunichar uc, size_type i) const { return storage.rfind(uc, i); }\ninline ustring::size_type ustring::find_first_of(const ustring& match, size_type i) const { return storage.find_first_of(match.storage, i); }\ninline ustring::size_type ustring::find_first_of(gunichar uc, size_type i) const { return storage.find_first_of(uc, i); }\ninline ustring::size_type ustring::find_last_of(const ustring& match, size_type i) const { return storage.find_last_of(match.storage, i); }\ninline ustring::size_type ustring::find_last_of(gunichar uc, size_type i) const { return storage.find_last_of(uc, i); }\ninline ustring::size_type ustring::find_first_not_of(const ustring& match, size_type i) const { return storage.find_first_not_of(match.storage, i); }\ninline ustring::size_type ustring::find_first_not_of(gunichar uc, size_type i) const { return storage.find_first_not_of(uc, i); }\ninline ustring::size_type ustring::find_last_not_of(const ustring& match, size_type i) const { return storage.find_last_not_of(match.storage, i); }\ninline ustring::size_type ustring::find_last_not_of(gunichar uc, size_type i) const { return storage.find_last_not_of(uc, i); }\ninline bool ustring::empty() const { return storage.empty(); }\ninline ustring::size_type ustring::size() const { return storage.size(); }\ninline ustring::size_type ustring::length() const { return storage.length(); }\ninline ustring::size_type ustring::bytes() const { return storage.bytes(); }\ninline void ustring::resize(size_type n, gunichar uc) { storage.resize(n, uc); }\ninline ustring::size_type ustring::capacity() const { return storage.capacity(); }\ninline ustring::size_type ustring::max_size() const { return storage.max_size(); }\ninline void ustring::reserve(size_type n) { storage.reserve(n); }\ninline const std::string& ustring::raw() const { return storage.raw(); }\ninline const std::string& ustring::utf8_str() const { return storage.raw(); }\ninline bool ustring::validate() const { return storage.validate(); }\ninline bool ustring::validate(iterator& first_invalid) { return storage.validate(first_invalid); }\ninline bool ustring::validate(const_iterator& first_invalid) const { return storage.validate(first_invalid); }\ninline bool ustring::is_ascii() const { return storage.is_ascii(); }\n//inline ustring ustring::normalize(NormalizeMode mode) const { return storage.normalize(mode); }\ninline ustring ustring::uppercase() const { return storage.uppercase(); }\ninline ustring ustring::lowercase() const { return storage.lowercase(); }\ninline ustring ustring::casefold() const { return storage.casefold(); }\n\ninline bool operator<(const ustring& lhs, const ustring& rhs) { return lhs.storage < rhs.storage; }\ninline bool operator==(const ustring& lhs, const ustring& rhs) { return lhs.storage == rhs.storage; }\ninline bool operator!=(const ustring& lhs, const ustring& rhs) { return lhs.storage != rhs.storage; }\n\n} // namespace k3d\n\n#endif // !K3DSDK_USTRING_H\n\n"
  },
  {
    "path": "k3dsdk/utility.h",
    "content": "#ifndef K3DSDK_UTILITY_H\n#define K3DSDK_UTILITY_H\n\nnamespace k3d\n{\n\ntemplate<typename container_t>\nstruct inserter_t\n{\n\texplicit inserter_t(container_t& Container) : container(Container) {}\n\t\n\tvoid operator()(typename container_t::value_type Value)\n\t{\n\t\tcontainer.insert(container.end(), Value);\n\t}\n\t\n\tcontainer_t& container;\n};\n\ntemplate<typename container_t>\ninserter_t<container_t> inserter(container_t& Container)\n{\n\treturn inserter_t<container_t>(Container);\n}\n\n/// Convenience function that returns a collection containing a single item\ntemplate<typename container_t, typename value_t>\nconst container_t make_collection(const value_t& Value)\n{\n\tcontainer_t result;\n\tresult.insert(result.end(), Value);\n\t\n\treturn result;\n}\n\n/// copy_if() - as described in \"Effective STL\" ...\ntemplate<typename InputIterator, typename OutputIterator, typename Predicate>\nOutputIterator copy_if(InputIterator Begin, InputIterator End, OutputIterator DestBegin, Predicate P)\n{\n\twhile(Begin != End)\n\t{\n\t\tif(P(*Begin))\n\t\t\t*DestBegin++ = *Begin;\n\t\t++Begin;\n\t}\n\t\n\treturn DestBegin;\n}\n\n/// Use with std::for_each to destroy collections of objects stored by pointer\nstruct delete_object\n{\n\ttemplate<typename T>\n\tvoid operator()(const T* ptr) const\n\t{\n\t\tdelete ptr;\n\t}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_UTILITY_H\n"
  },
  {
    "path": "k3dsdk/utility_gl.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-platform-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/bounding_box3.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/irender_viewport_gl.h>\n#include <k3dsdk/material.h>\n#include <k3dsdk/plane.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/gil/extension/numeric/resample.hpp>\n#include <boost/gil/extension/numeric/sampler.hpp>\n\n#include <algorithm>\n#include <set>\n\nnamespace k3d\n{\n\nnamespace gl\n{\n\nnamespace detail\n{\n\nclass redraw\n{\npublic:\n\tredraw(const irender_viewport::redraw_type_t RedrawType) :\n\t\tm_redraw_type(RedrawType)\n\t{\n\t}\n\n\tvoid operator()(inode* const Object)\n\t{\n\t\tif(irender_viewport* const render_engine = dynamic_cast<irender_viewport*>(Object))\n\t\t\trender_engine->redraw_request_signal().emit(m_redraw_type);\n\t}\n\nprotected:\n\tconst irender_viewport::redraw_type_t m_redraw_type;\n};\n\n} // namespace detail\n\nvoid draw(const plane& Plane)\n{\n\tconst k3d::vector3 n = Plane.normal;\n\n\tk3d::vector3 nx(-0.7071, -0.7071, 0);\n\tk3d::vector3 ny(0.7071, -0.7071, 0);\n\tconst k3d::vector3 x_projection = n ^ vector3(n[1], n[0], n[2]);\n\tif(x_projection.length())\n\t{\n\t\tnx = normalize(n ^ vector3(n[1], n[0], n[2]));\n\t\tny = normalize(n ^ nx);\n\t}\n\n\tconst k3d::point3 origin = k3d::point3(0, 0, 0) + (Plane.normal * Plane.distance);\n\n\tglBegin(GL_LINE_LOOP);\n\t\tvertex3d(origin - nx + ny);\n\t\tvertex3d(origin + nx + ny);\n\t\tvertex3d(origin + nx - ny);\n\t\tvertex3d(origin - nx - ny);\n\tglEnd();\n\n\tglBegin(GL_LINES);\n\t\tvertex3d(origin);\n\t\tvertex3d(origin + n);\n\tglEnd();\n}\n\nvoid draw(const bounding_box3& Box)\n{\n\tglBegin(GL_QUADS);\n\t\tglNormal3d(0, 0, -1);\n\t\tglVertex3d(Box.nx, Box.py, Box.nz);\n\t\tglVertex3d(Box.px, Box.py, Box.nz);\n\t\tglVertex3d(Box.px, Box.ny, Box.nz);\n\t\tglVertex3d(Box.nx, Box.ny, Box.nz);\n\n\t\tglNormal3d(0, 0, 1);\n\t\tglVertex3d(Box.px, Box.py, Box.pz);\n\t\tglVertex3d(Box.nx, Box.py, Box.pz);\n\t\tglVertex3d(Box.nx, Box.ny, Box.pz);\n\t\tglVertex3d(Box.px, Box.ny, Box.pz);\n\n\t\tglNormal3d(0, 1, 0);\n\t\tglVertex3d(Box.nx, Box.py, Box.pz);\n\t\tglVertex3d(Box.px, Box.py, Box.pz);\n\t\tglVertex3d(Box.px, Box.py, Box.nz);\n\t\tglVertex3d(Box.nx, Box.py, Box.nz);\n\n\t\tglNormal3d(0, -1, 0);\n\t\tglVertex3d(Box.px, Box.ny, Box.nz);\n\t\tglVertex3d(Box.nx, Box.ny, Box.nz);\n\t\tglVertex3d(Box.nx, Box.ny, Box.pz);\n\t\tglVertex3d(Box.px, Box.ny, Box.pz);\n\n\t\tglNormal3d(-1, 0, 0);\n\t\tglVertex3d(Box.nx, Box.py, Box.pz);\n\t\tglVertex3d(Box.nx, Box.py, Box.nz);\n\t\tglVertex3d(Box.nx, Box.ny, Box.nz);\n\t\tglVertex3d(Box.nx, Box.ny, Box.pz);\n\n\t\tglNormal3d(1, 0, 0);\n\t\tglVertex3d(Box.px, Box.py, Box.nz);\n\t\tglVertex3d(Box.px, Box.py, Box.pz);\n\t\tglVertex3d(Box.px, Box.ny, Box.pz);\n\t\tglVertex3d(Box.px, Box.ny, Box.nz);\n\tglEnd();\n}\n\nvoid draw_bounding_box(const bounding_box3& Box)\n{\n\tglBegin(GL_LINE_LOOP);\n\t\tglVertex3d(Box.nx, Box.ny, Box.nz);\n\t\tglVertex3d(Box.px, Box.ny, Box.nz);\n\t\tglVertex3d(Box.px, Box.ny, Box.pz);\n\t\tglVertex3d(Box.nx, Box.ny, Box.pz);\n\tglEnd();\n\n\tglBegin(GL_LINE_LOOP);\n\t\tglVertex3d(Box.nx, Box.py, Box.nz);\n\t\tglVertex3d(Box.px, Box.py, Box.nz);\n\t\tglVertex3d(Box.px, Box.py, Box.pz);\n\t\tglVertex3d(Box.nx, Box.py, Box.pz);\n\tglEnd();\n\n\tglBegin(GL_LINES);\n\t\tglVertex3d(Box.nx, Box.ny, Box.nz);\n\t\tglVertex3d(Box.nx, Box.py, Box.nz);\n\n\t\tglVertex3d(Box.px, Box.ny, Box.nz);\n\t\tglVertex3d(Box.px, Box.py, Box.nz);\n\n\t\tglVertex3d(Box.px, Box.ny, Box.pz);\n\t\tglVertex3d(Box.px, Box.py, Box.pz);\n\n\t\tglVertex3d(Box.nx, Box.ny, Box.pz);\n\t\tglVertex3d(Box.nx, Box.py, Box.pz);\n\tglEnd();\n\n\tglBegin(GL_LINE_STRIP);\n\t\tglVertex3d(Box.nx, Box.py, Box.nz);\n\t\tglVertex3d(0.5 * (Box.nx + Box.px), Box.ny, Box.nz);\n\t\tglVertex3d(Box.px, Box.py, Box.nz);\n\tglEnd();\n}\n\nvoid redraw_all(idocument& Document, const irender_viewport::redraw_type_t RedrawType)\n{\n\tstd::for_each(Document.nodes().collection().begin(), Document.nodes().collection().end(), detail::redraw(RedrawType));\n}\n\nvoid tex_image_2d(const bitmap& Source)\n{\n\t// Compute power-of-two dimensions ...\n\tunsigned long width = Source.width();\n\tunsigned long height = Source.height();\n\n\tif(width & (width - 1))\n\t{\n\t\twidth |= (width >> 1);\n\t\twidth |= (width >> 2);\n\t\twidth |= (width >> 4);\n\t\twidth |= (width >> 8);\n\t\twidth |= (width >> 16);\n\t\twidth += 1;\n\t\twidth /= 2;\n\t}\n\n\tif(height & (height - 1))\n\t{\n\t\theight |= (height >> 1);\n\t\theight |= (height >> 2);\n\t\theight |= (height >> 4);\n\t\theight |= (height >> 8);\n\t\theight |= (height >> 16);\n\t\theight += 1;\n\t\theight /= 2;\n\t}\n\n\tboost::gil::rgba8_image_t target(0, 0);\n\tassert_not_implemented();\n/*\n\tif(extension::query(\"GL_ARB_texture_non_power_of_two\") || (width == Source.width() && height == Source.height()))\n\t{\n\t\ttarget.recreate(Source.width(), Source.height());\n\t\tboost::gil::copy_and_convert_pixels(boost::gil::const_view(Source), boost::gil::view(target));\n\t}\n\telse\n*/\n\t{\n\t\ttarget.recreate(width, height);\n#ifdef K3D_API_DARWIN\n    assert_not_implemented();\n#else\n\t\tboost::gil::resize_view(boost::gil::color_converted_view<boost::gil::rgba8_pixel_t>(boost::gil::const_view(Source)), boost::gil::view(target), boost::gil::bilinear_sampler());\n#endif\n\t}\n\n\tglPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n\tglTexImage2D(\n\t\tGL_TEXTURE_2D,\n\t\t0,\n\t\tGL_RGBA,\n\t\ttarget.width(),\n\t\ttarget.height(),\n\t\t0,\n\t\tGL_RGBA,\n\t\tGL_UNSIGNED_BYTE,\n\t\t&boost::gil::view(target)[0]);\n}\n\nconst point3 project(const point3& WorldCoords)\n{\n\tk3d::point3 result;\n\t\n\tGLdouble modelview[16];\n\tglGetDoublev(GL_MODELVIEW_MATRIX, modelview);\n\t\n\tGLdouble projection[16];\n\tglGetDoublev(GL_PROJECTION_MATRIX, projection);\n\t\n\tGLint viewport[4];\n\tglGetIntegerv(GL_VIEWPORT, viewport);\n\n\tGLint error = gluProject(\n\t\tWorldCoords[0],\n\t\tWorldCoords[1],\n\t\tWorldCoords[2],\n\t\tmodelview,\n\t\tprojection,\n\t\tviewport,\n\t\t&result[0],\n\t\t&result[1],\n\t\t&result[2]);\n\t\n\treturn_val_if_fail(error, result);\n\n\treturn result;\n}\n\nvoid calculate_projection(icamera& Camera, const uint_t PixelWidth, const uint_t PixelHeight, rectangle& WindowRect, rectangle& CameraRect, double& Near, double& Far, bool& Orthographic)\n{\n\treturn_if_fail(PixelWidth && PixelHeight);\n\n\tif(k3d::iperspective* const perspective = dynamic_cast<k3d::iperspective*>(&Camera.projection()))\n\t{\n\t\tOrthographic = false;\n\n\t\tCameraRect.x1 = k3d::property::pipeline_value<double>(perspective->left());\n\t\tCameraRect.x2 = k3d::property::pipeline_value<double>(perspective->right());\n\t\tif(CameraRect.x2 < CameraRect.x1)\n\t\t\tstd::swap(CameraRect.x1, CameraRect.x2);\n\n\t\tCameraRect.y1 = k3d::property::pipeline_value<double>(perspective->top());\n\t\tCameraRect.y2 = k3d::property::pipeline_value<double>(perspective->bottom());\n\t\tif(CameraRect.y1 < CameraRect.y2)\n\t\t\tstd::swap(CameraRect.y1, CameraRect.y2);\n\n\t\tNear = k3d::property::pipeline_value<double>(perspective->near());\n\t\tFar = k3d::property::pipeline_value<double>(perspective->far());\n\n\t\treturn_if_fail(CameraRect.x1 != CameraRect.x2 && CameraRect.y1 != CameraRect.y2);\n\n\t\tconst double frustum_ratio = (CameraRect.x2 - CameraRect.x1) / (CameraRect.y1 - CameraRect.y2);\n\t\tconst double raster_ratio = static_cast<double>(PixelWidth) / static_cast<double>(PixelHeight);\n\n\t\tif(raster_ratio > frustum_ratio)\n\t\t{\n\t\t\tconst double width = 0.5 * raster_ratio * CameraRect.height();\n\n\t\t\tWindowRect.x1 = ((CameraRect.x1 + CameraRect.x2) * 0.5) - width;\n\t\t\tWindowRect.x2 = ((CameraRect.x1 + CameraRect.x2) * 0.5) + width;\n\t\t\tWindowRect.y1 = CameraRect.y1;\n\t\t\tWindowRect.y2 = CameraRect.y2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst double height = 0.5 * CameraRect.width() / raster_ratio;\n\n\t\t\tWindowRect.x1 = CameraRect.x1;\n\t\t\tWindowRect.x2 = CameraRect.x2;\n\t\t\tWindowRect.y1 = ((CameraRect.y1 + CameraRect.y2) * 0.5) + height;\n\t\t\tWindowRect.y2 = ((CameraRect.y1 + CameraRect.y2) * 0.5) - height;\n\t\t}\n\n\t\treturn;\n\t}\n\telse if(k3d::iorthographic* const orthographic = dynamic_cast<k3d::iorthographic*>(&Camera.projection()))\n\t{\n\t\tOrthographic = true;\n\n\t\tCameraRect.x1 = k3d::property::pipeline_value<double>(orthographic->left());\n\t\tCameraRect.x2 = k3d::property::pipeline_value<double>(orthographic->right());\n\t\tif(CameraRect.x2 < CameraRect.x1)\n\t\t\tstd::swap(CameraRect.x1, CameraRect.x2);\n\n\t\tCameraRect.y1 = k3d::property::pipeline_value<double>(orthographic->top());\n\t\tCameraRect.y2 = k3d::property::pipeline_value<double>(orthographic->bottom());\n\t\tif(CameraRect.y1 < CameraRect.y2)\n\t\t\tstd::swap(CameraRect.y1, CameraRect.y2);\n\n\t\tNear = k3d::property::pipeline_value<double>(orthographic->near());\n\t\tFar = k3d::property::pipeline_value<double>(orthographic->far());\n\n\t\treturn_if_fail(CameraRect.x1 != CameraRect.x2 && CameraRect.y1 != CameraRect.y2);\n\n\t\tconst double frustum_ratio = (CameraRect.x2 - CameraRect.x1) / (CameraRect.y1 - CameraRect.y2);\n\t\tconst double raster_ratio = static_cast<double>(PixelWidth) / static_cast<double>(PixelHeight);\n\n\t\tif(raster_ratio > frustum_ratio)\n\t\t{\n\t\t\tconst double width = 0.5 * raster_ratio * CameraRect.height();\n\n\t\t\tWindowRect.x1 = ((CameraRect.x1 + CameraRect.x2) * 0.5) - width;\n\t\t\tWindowRect.x2 = ((CameraRect.x1 + CameraRect.x2) * 0.5) + width;\n\t\t\tWindowRect.y1 = CameraRect.y1;\n\t\t\tWindowRect.y2 = CameraRect.y2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst double height = 0.5 * CameraRect.width() / raster_ratio;\n\n\t\t\tWindowRect.x1 = CameraRect.x1;\n\t\t\tWindowRect.x2 = CameraRect.x2;\n\t\t\tWindowRect.y1 = ((CameraRect.y1 + CameraRect.y2) * 0.5) + height;\n\t\t\tWindowRect.y2 = ((CameraRect.y1 + CameraRect.y2) * 0.5) - height;\n\t\t}\n\n\t\treturn;\n\t}\n\n\tk3d::log() << error << k3d_file_reference << \": unknown projection type\" << std::endl;\n}\n\n\n} // namespace gl\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/utility_gl.h",
    "content": "#ifndef K3DSDK_UTILITY_GL_H\n#define K3DSDK_UTILITY_GL_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/irender_viewport_gl.h>\n\nnamespace k3d\n{\n\nclass bounding_box3;\nclass icamera;\nclass idocument;\nclass plane;\n\nnamespace gl\n{\n\n/// Converts an OpenGL matrix into a standard K-3D matrix\ninline const matrix4 matrix(GLdouble* GLMatrix)\n{\n\tmatrix4 result;\n\tmemcpy(&result[0][0], &GLMatrix[0], 16 * sizeof(GLdouble));\n\treturn transpose(result);\n}\n\n/// Converts an OpenGL matrix into a standard K-3D matrix\ninline const matrix4 matrix(const GLfloat GLMatrix[16])\n{\n\tmatrix4 result;\n\tfor(uint_t i = 0; i != 4; ++i)\n\t{\n\t\tfor(uint_t j = 0; j != 4; ++j)\n\t\t{\n\t\t\tresult[i][j] = static_cast<double_t>(GLMatrix[j*4+i]);\n\t\t}\n\t}\n\treturn result;\n}\n\n/// Pushes a matrix onto the OpenGL matrix stack\ninline void push_matrix(const matrix4& Matrix)\n{\n\tdouble glmatrix[16];\n\ttranspose(Matrix).CopyArray(glmatrix);\n\tglMultMatrixd(glmatrix);\n}\n\n/// Passes a k3d::point4 to glVertex4d()\ninline void vertex4d(const point4& Vertex)\n{\n\tglVertex4d(Vertex.n[0], Vertex.n[1], Vertex.n[2], Vertex.n[3]);\n}\n\n/// Passes a k3d::point3 to glVertex3d()\ninline void vertex3d(const point3& Vertex)\n{\n\tglVertex3d(Vertex.n[0], Vertex.n[1], Vertex.n[2]);\n}\n\n/// Passes a k3d::vector3 to glNormal3d()\ninline void normal3d(const vector3& Vector)\n{\n\tglNormal3d(Vector.n[0], Vector.n[1], Vector.n[2]);\n}\n\n/// Passes a k3d::normal3 to glNormal3d()\ninline void normal3d(const normal3& Vector)\n{\n\tglNormal3d(Vector.n[0], Vector.n[1], Vector.n[2]);\n}\n\n/// Passes a k3d::color to glColor3d()\ninline void color3d(const color& Color)\n{\n\tglColor3d(Color.red, Color.green, Color.blue);\n}\n\n/// Passes a k3d::color to glMaterialfv()\ninline void material(GLenum Face, GLenum PName, const color& Color, double Alpha = 1.0)\n{\n\tGLfloat color[] = { static_cast<GLfloat>(Color.red), static_cast<GLfloat>(Color.green), static_cast<GLfloat>(Color.blue), static_cast<GLfloat>(Alpha) };\n\tglMaterialfv(Face, PName, color);\n}\n\n/// Sets an OpenGL state flag\ninline void set(GLenum Flag, const bool State)\n{\n\tif(State)\n\t\tglEnable(Flag);\n\telse\n\t\tglDisable(Flag);\n}\n\n/// Provides exception- and return-safe RAII behavior for saving / restoring OpenGL attributes\nstruct store_attributes\n{\n\tstore_attributes(const GLbitfield Mask = GL_ALL_ATTRIB_BITS)\n\t{\n\t\tglPushAttrib(Mask);\n\t}\n\n\t~store_attributes()\n\t{\n\t\tglPopAttrib();\n\t}\n};\n\n/// Convenience function for refreshing all OpenGL render engines\nvoid redraw_all(idocument& Document, const irender_viewport::redraw_type_t RedrawType);\n/// Draws a 1x1 plane\nvoid draw(const plane& Plane);\n/// Draws a box\nvoid draw(const bounding_box3& Box);\n/// Draws a standard bounding box to make it easier to visualize an object\nvoid draw_bounding_box(const bounding_box3& Box);\n/// Passes a k3d::bitmap to glTexImage2D(), handling non-power-of-two sizes and translations between image formats\nvoid tex_image_2d(const bitmap& Bitmap);\n\n/// Projects a point in world coordinates into screen space, returning the 2D widget coordinates and Z-buffer depth\nconst point3 project(const point3& WorldCoords);\n\n/// Calculates the settings for a projection for the given camera\nvoid calculate_projection(k3d::icamera& Camera, const uint_t PixelWidth, const uint_t PixelHeight, k3d::rectangle& WindowRect, k3d::rectangle& CameraRect, double& Near, double& Far, bool& Orthographic);\n\n} // namespace gl\n\n} // namespace k3d\n\n#endif // !K3DSDK_UTILITY_GL_H\n\n"
  },
  {
    "path": "k3dsdk/uuid.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/result.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/uuid.h>\n\n#include <boost/uuid/nil_generator.hpp>\n#include <boost/uuid/random_generator.hpp>\n\n#include <iomanip>\n#include <iostream>\n\nnamespace k3d\n{\n\nuuid::uuid() :\n\tboost::uuids::uuid(boost::uuids::nil_generator()())\n{\n}\n\nuuid::uuid(const boost::uuids::uuid& Other) :\n\tboost::uuids::uuid(Other)\n{\n}\n\nuuid::uuid(const uint32_t Data1, const uint32_t Data2, const uint32_t Data3, const uint32_t Data4)\n{\n\tdata[0] = Data1 >> 24 & 0xff;\n\tdata[1] = Data1 >> 16 & 0xff;\n\tdata[2] = Data1 >> 8 & 0xff;\n\tdata[3] = Data1 >> 0 & 0xff;\n\n\tdata[4] = Data2 >> 24 & 0xff;\n\tdata[5] = Data2 >> 16 & 0xff;\n\tdata[6] = Data2 >> 8 & 0xff;\n\tdata[7] = Data2 >> 0 & 0xff;\n\n\tdata[8] = Data3 >> 24 & 0xff;\n\tdata[9] = Data3 >> 16 & 0xff;\n\tdata[10] = Data3 >> 8 & 0xff;\n\tdata[11] = Data3 >> 0 & 0xff;\n\n\tdata[12] = Data4 >> 24 & 0xff;\n\tdata[13] = Data4 >> 16 & 0xff;\n\tdata[14] = Data4 >> 8 & 0xff;\n\tdata[15] = Data4 >> 0 & 0xff;\n}\n\nconst uuid uuid::null()\n{\n\treturn uuid(boost::uuids::nil_generator()());\n}\n\nconst uuid uuid::random()\n{\n\treturn uuid(boost::uuids::random_generator()());\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const k3d::uuid& Value)\n{\n\tstd::ostream::fmtflags oldflags(Stream.flags());\n\tStream.setf(std::ostream::right);\n\n\tconst char oldfill(Stream.fill());\n\tStream.fill('0');\n\n\tStream << std::hex;\n\tfor(int i = 0; i != Value.size(); ++i)\n\t{\n\t\tif(i && (0 == i % 4))\n\t\t\tStream << \" \";\n\t\tStream << std::setw(2) << static_cast<uint32_t>(Value.data[i]);\n\t}\n\n\tStream.fill(oldfill);\n\tStream.flags(oldflags);\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, k3d::uuid& Value)\n{\n\tstd::istream::fmtflags oldflags(Stream.flags());\n\n\tuint32_t data1, data2, data3, data4;\n\tStream >> std::hex >> data1 >> data2 >> data3 >> data4;\n\tStream.flags(oldflags);\n\n\tValue = k3d::uuid(data1, data2, data3, data4);\n\n\treturn Stream;\n}\n\n} // namespace\n\n"
  },
  {
    "path": "k3dsdk/uuid.h",
    "content": "#ifndef K3DSDK_UUID_H\n#define K3DSDK_UUID_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n#define BOOST_UUID_NO_SIMD // This can be removed again once the Boost 1.56 - 1.57 regression in the SSE2 implementation of operator< is fixed.\n#include <boost/uuid/uuid.hpp>\n#include <iosfwd>\n\nnamespace k3d\n{\n\n/// Identifier used to uniquely identify plugin modules and plugin objects\nclass uuid :\n\tpublic boost::uuids::uuid\n{\npublic:\n\tuuid();\n\texplicit uuid(const boost::uuids::uuid&);\n\tuuid(const uint32_t Data1, const uint32_t Data2, const uint32_t Data3, const uint32_t Data4);\n\n\t/// Creates a NULL (all zeros) uuid\n\tstatic const uuid null();\n\t/// Creates a unique uuid based on the current system time and a high-quality pseudo-random number generators\n\tstatic const uuid random();\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const uuid& Value);\n\tfriend std::istream& operator>>(std::istream& Stream, uuid& Value);\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_UUID_H\n\n"
  },
  {
    "path": "k3dsdk/value_demand_storage.h",
    "content": "#ifndef K3DSDK_VALUE_DEMAND_STORAGE_H\n#define K3DSDK_VALUE_DEMAND_STORAGE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <boost/scoped_ptr.hpp>\n#include <boost/static_assert.hpp>\n#include <boost/type_traits.hpp>\n\nnamespace k3d\n{\n\nnamespace data\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// value_demand_storage\n\n/// Storage policy that computes a value on-demand\ntemplate<typename value_t, typename signal_policy_t>\nclass value_demand_storage :\n\tpublic signal_policy_t\n{\n\t// This policy only works for data stored by-value\n\tBOOST_STATIC_ASSERT((!boost::is_pointer<value_t>::value));\n\npublic:\n\ttypedef value_demand_storage<value_t, signal_policy_t> this_t;\n\ttypedef std::vector<ihint*> pending_hints_t;\n\n\t/// Set the slot that will be called to bring the underlying data up-to-date\n\tvoid set_update_slot(const sigc::slot<void, const pending_hints_t&, value_t&>& Slot)\n\t{\n\t\tm_update_slot = Slot;\n\t\tupdate();\n\t}\n\n\t/// Returns a slot that will invoke the update() method\n\tsigc::slot<void, ihint*> make_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &this_t::update);\n\t}\n\n\t/// Schedule an update for the value the next time it's read\n\tvoid update(ihint* const Hint = 0)\n\t{\n\t\tm_pending_hints.push_back(Hint ? Hint->clone() : static_cast<ihint*>(0));\n\t\tsignal_policy_t::set_value(Hint);\n\t}\n\n\t/// Accesses the underlying data, updating it if necessary\n\tconst value_t& internal_value()\n\t{\n\t\tif(!m_pending_hints.empty())\n\t\t{\n\t\t\t// Create a temporary copy of pending hints in-case we are updated while executing ...\n\t\t\tconst pending_hints_t pending_hints(m_pending_hints);\n\t\t\tm_update_slot(pending_hints, m_value);\n\t\t\t\n\t\t\tstd::for_each(m_pending_hints.begin(), m_pending_hints.end(), delete_object());\n\t\t\tm_pending_hints.clear();\n\t\t}\n\n\t\treturn m_value;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tvalue_demand_storage(const init_t& Init) :\n\t\tsignal_policy_t(Init),\n\t\tm_value(Init.value())\n\t{\n\t}\n\n\t~value_demand_storage()\n\t{\n\t\tstd::for_each(m_pending_hints.begin(), m_pending_hints.end(), delete_object());\n\t}\n\nprivate:\n\t/// Storage for this policy's value\n\tvalue_t m_value;\n\t/// Stores a slot that will be called to bring this policy's value up-to-date\n\tsigc::slot<void, const pending_hints_t&, value_t&> m_update_slot;\n\t/// Stores a collection of pending hints to be updated\n\tpending_hints_t m_pending_hints;\n};\n\n} // namespace data\n\n} // namespace k3d\n\n#endif // !K3DSDK_VALUE_DEMAND_STORAGE_H\n\n"
  },
  {
    "path": "k3dsdk/vector2.h",
    "content": "#ifndef K3DSDK_VECTOR2_H\n#define K3DSDK_VECTOR2_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/****************************************************************\n*\n* C++ Vector and Matrix Algebra routines\n* Author: Jean-Francois DOUE\n* Version 3.1 --- October 1993\n*\n****************************************************************/\n\n//\n//\tFrom \"Graphics Gems IV / Edited by Paul S. Heckbert\n//\tAcademic Press, 1994, ISBN 0-12-336156-9\n//\t\"You are free to use and modify this code in any way\n//\tyou like.\" (p. xv)\n//\n//\tModified by J. Nagle, March 1997\n//\t-\tAll functions are inline.\n//\t-\tAll functions are const-correct.\n//\t-\tAll checking is via the standard \"assert\" macro.\n//\n\n// Modified by Tim Shead for use with K-3D, January 1998\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/result.h>\n\n#include <boost/io/ios_state.hpp>\n\n#include <cmath>\n#include <iomanip>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// vector2\n\n/// Encapsulates a direction vector in two-dimensional space\nclass vector2\n{\npublic:\n\t/// Stores the vector values\n\tdouble n[2];\n\n\tvector2()\n\t{\n\t\tn[0] = n[1] = 0.0;\n\t}\n\n\tvector2(const double x, const double y)\n\t{\n\t\tn[0] = x;\n\t\tn[1] = y;\n\t}\n\n\tvector2& operator+=(const vector2& v)\n\t{\n\t\tn[0] += v.n[0];\n\t\tn[1] += v.n[1];\n\t\treturn *this;\n\t}\n\n\tvector2& operator-=(const vector2& v)\n\t{\n\t\tn[0] -= v.n[0];\n\t\tn[1] -= v.n[1];\n\t\treturn *this;\n\t}\n\n\tvector2& operator*=(const double d)\n\t{\n\t\tn[0] *= d;\n\t\tn[1] *= d;\n\t\treturn *this;\n\t}\n\n\tvector2& operator/=(const double d)\n\t{\n\t\treturn_val_if_fail(d, *this);\n\n\t\tconst double d_inv = 1./d;\n\t\tn[0] *= d_inv;\n\t\tn[1] *= d_inv;\n\t\treturn *this;\n\t}\n\n\tdouble& operator[](const unsigned int i)\n\t{\n\t\treturn n[i];\n\t}\n\n\tdouble operator[](const unsigned int i) const\n\t{\n\t\treturn n[i];\n\t}\n\n\t/// Returns the normal length\n\tdouble length() const\n\t{\n\t\treturn std::sqrt(length2());\n\t}\n\n\t/// Returns the squared normal length\n\tdouble length2() const\n\t{\n\t\treturn n[0] * n[0] + n[1] * n[1];\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const vector2& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.n[0] << \" \" << RHS.n[1];\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, vector2& RHS)\n\t{\n\t\tStream >> RHS.n[0] >> RHS.n[1];\n\t\treturn Stream;\n\t}\n};\n\n/// Negation\ninline const vector2 operator-(const vector2& v)\n{\n\treturn vector2(-v.n[0], -v.n[1]);\n}\n\n/// Addition\ninline const vector2 operator+(const vector2& a, const vector2& b)\n{\n\treturn vector2(a.n[0] + b.n[0], a.n[1] + b.n[1]);\n}\n\n/// Subtraction\ninline const vector2 operator-(const vector2& a, const vector2& b)\n{\n\treturn vector2(a.n[0] - b.n[0], a.n[1] - b.n[1]);\n}\n\n/// Multiplication by a constant\ninline const vector2 operator*(const vector2& a, const double d)\n{\n\treturn vector2(a.n[0] * d, a.n[1] * d);\n}\n\n/// Multiplication by a constant\ninline const vector2 operator*(const double d, const vector2& a)\n{\n\treturn vector2(a.n[0] * d, a.n[1] * d);\n}\n\n/// Returns the dot product of two vectors\ninline double operator*(const vector2& a, const vector2& b)\n{\n\treturn a.n[0] * b.n[0] + a.n[1] * b.n[1];\n}\n\n/// Division by a constant\ninline const vector2 operator/(const vector2& a, const double d)\n{\n\treturn_val_if_fail(d, vector2());\n\treturn vector2(a.n[0] / d, a.n[1] / d);\n}\n\n/// Equality\ninline bool operator==(const vector2& a, const vector2& b)\n{\n\treturn a.n[0] == b.n[0] && a.n[1] == b.n[1];\n}\n\n/// Inequality\ninline bool operator!=(const vector2& a, const vector2& b)\n{\n\treturn a.n[0] != b.n[0] || a.n[1] != b.n[1];\n}\n\n/// Returns the length of a vector\ninline double length(const vector2& Vector)\n{\n\treturn Vector.length();\n}\n\n/// Returns the normalized form of a vector\ninline const vector2 normalize(const vector2& Vector)\n{\n\tconst double length = Vector.length();\n\treturn_val_if_fail(length, Vector);\n\treturn Vector / length;\n}\n\n/// Returns a vector perpendicular to the given vector\ninline const vector2 perpendicular(const vector2& Vector)\n{\n\treturn vector2(Vector[1], -Vector[0]);\n}\n\nnamespace difference\n{\n\n/// Specialization of difference::test for vector2\ninline void test(const vector2& A, const vector2& B, accumulator& Result)\n{\n\trange_test(A.n, A.n + 2, B.n, B.n + 2, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_VECTOR2_H\n\n"
  },
  {
    "path": "k3dsdk/vector3.h",
    "content": "#ifndef K3DSDK_VECTOR3_H\n#define K3DSDK_VECTOR3_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Vector (points, vectors and normals) routines\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n/****************************************************************\n*\n* C++ Vector and Matrix Algebra routines\n* Author: Jean-Francois DOUE\n* Version 3.1 --- October 1993\n*\n****************************************************************/\n\n//\n//\tFrom \"Graphics Gems IV / Edited by Paul S. Heckbert\n//\tAcademic Press, 1994, ISBN 0-12-336156-9\n//\t\"You are free to use and modify this code in any way\n//\tyou like.\" (p. xv)\n//\n//\tModified by J. Nagle, March 1997\n//\t-\tAll functions are inline.\n//\t-\tAll functions are const-correct.\n//\t-\tAll checking is via the standard \"assert\" macro.\n//\n\n// Modified by Tim Shead for use with K-3D, January 1998\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/result.h>\n\n#include <boost/io/ios_state.hpp>\n\n#include <cmath>\n#include <iomanip>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// vector3\n\n/// Encapsulates a direction vector in three-dimensional space\nclass vector3\n{\npublic:\n\t/// Stores the vector values\n\tdouble n[3];\n\n\tvector3()\n\t{\n\t\tn[0] = n[1] = n[2] = 0.0;\n\t}\n\n\tvector3(const double x, const double y, const double z)\n\t{\n\t\tn[0] = x;\n\t\tn[1] = y;\n\t\tn[2] = z;\n\t}\n\n\tvector3& operator+=(const vector3& v)\n\t{\n\t\tn[0] += v.n[0];\n\t\tn[1] += v.n[1];\n\t\tn[2] += v.n[2];\n\t\treturn *this;\n\t}\n\n\tvector3& operator-=(const vector3& v)\n\t{\n\t\tn[0] -= v.n[0];\n\t\tn[1] -= v.n[1];\n\t\tn[2] -= v.n[2];\n\t\treturn *this;\n\t}\n\n\tvector3& operator*=(const double d)\n\t{\n\t\tn[0] *= d;\n\t\tn[1] *= d;\n\t\tn[2] *= d;\n\t\treturn *this;\n\t}\n\n\tvector3& operator/=(const double d)\n\t{\n\t\treturn_val_if_fail(d, *this);\n\n\t\tconst double d_inv = 1./d;\n\t\tn[0] *= d_inv;\n\t\tn[1] *= d_inv;\n\t\tn[2] *= d_inv;\n\t\treturn *this;\n\t}\n\n\tdouble& operator[](const unsigned int i)\n\t{\n\t\treturn n[i];\n\t}\n\n\tdouble operator[](const unsigned int i) const\n\t{\n\t\treturn n[i];\n\t}\n\n\t/// Returns the normal length\n\tdouble length() const\n\t{\n\t\treturn std::sqrt(length2());\n\t}\n\n\t/// Returns the squared normal length\n\tdouble length2() const\n\t{\n\t\treturn n[0] * n[0] + n[1] * n[1] + n[2] * n[2];\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const vector3& RHS)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << RHS.n[0] << \" \" << RHS.n[1] << \" \" << RHS.n[2];\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, vector3& RHS)\n\t{\n\t\tStream >> RHS.n[0] >> RHS.n[1] >> RHS.n[2];\n\t\treturn Stream;\n\t}\n};\n\n/// Negation\ninline const vector3 operator-(const vector3& v)\n{\n\treturn vector3(-v.n[0], -v.n[1], -v.n[2]);\n}\n\n/// Addition\ninline const vector3 operator+(const vector3& a, const vector3& b)\n{\n\treturn vector3(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2]);\n}\n\n/// Subtraction\ninline const vector3 operator-(const vector3& a, const vector3& b)\n{\n\treturn vector3(a.n[0] - b.n[0], a.n[1] - b.n[1], a.n[2] - b.n[2]);\n}\n\n/// Multiplication by a constant\ninline const vector3 operator*(const vector3& a, const double d)\n{\n\treturn vector3(a.n[0] * d, a.n[1] * d, a.n[2] * d);\n}\n\n/// Multiplication by a constant\ninline const vector3 operator*(const double d, const vector3& a)\n{\n\treturn vector3(a.n[0] * d, a.n[1] * d, a.n[2] * d);\n}\n\n/// Returns the dot product of two vectors\ninline double operator*(const vector3& a, const vector3& b)\n{\n\treturn a.n[0] * b.n[0] + a.n[1] * b.n[1] + a.n[2] * b.n[2];\n}\n\n/// Division by a constant\ninline const vector3 operator/(const vector3& a, const double d)\n{\n\treturn_val_if_fail(d, vector3());\n\treturn vector3(a.n[0] / d, a.n[1] / d, a.n[2] / d);\n}\n\n/// Returns the cross product of two vectors\ninline const vector3 operator^(const vector3& a, const vector3& b)\n{\n\treturn vector3(a.n[1] * b.n[2] - a.n[2] * b.n[1], a.n[2] * b.n[0] - a.n[0] * b.n[2], a.n[0] * b.n[1] - a.n[1] * b.n[0]);\n}\n\n/// Equality\ninline bool operator==(const vector3& a, const vector3& b)\n{\n\treturn a.n[0] == b.n[0] && a.n[1] == b.n[1] && a.n[2] == b.n[2];\n}\n\n/// Inequality\ninline bool operator!=(const vector3& a, const vector3& b)\n{\n\treturn a.n[0] != b.n[0] || a.n[1] != b.n[1] || a.n[2] != b.n[2];\n}\n\n/// Returns the length of a vector\ninline double length(const vector3& Vector)\n{\n\treturn Vector.length();\n}\n\n/// Returns the normalized form of a vector\ninline const vector3 normalize(const vector3& Vector)\n{\n\tconst double length = Vector.length();\n\treturn_val_if_fail(length, Vector);\n\treturn Vector / length;\n}\n\n/// Converts Cartesian coordinates to spherical coordinates\ninline const vector3 spherical(const vector3& Vector)\n{\n\treturn vector3(Vector.length(), std::atan2(Vector[0], Vector[2]), std::atan2(Vector[1], sqrt(Vector[0] * Vector[0] + Vector[2] * Vector[2])));\n/*\n\t// Handle the singularity at the poles\n\tif(0.0 == Vector[0] && 0.0 == Vector[2])\n\t\treturn point3(n[1] > 0.0 ? sdpPiOver2 : -sdpPiOver2, 0.0, Vector.length());\n\n\n\treturn point3(atan2(Vector[1], sqrt(Vector[0] * Vector[0] + Vector[2] * Vector[2])), atan2(Vector[0], Vector[2]), Vector.length());\n*/\n}\n\nnamespace difference\n{\n\n/// Specialization of difference::test for vector3\ninline void test(const vector3& A, const vector3& B, accumulator& Result)\n{\n\trange_test(A.n, A.n + 3, B.n, B.n + 3, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_VECTOR3_H\n\n"
  },
  {
    "path": "k3dsdk/vector3_source.h",
    "content": "#ifndef K3DSDK_VECTOR3_SOURCE_H\n#define K3DSDK_VECTOR3_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/ivector3_source.h>\n#include <k3dsdk/value_demand_storage.h>\n#include <k3dsdk/vector3.h>\n\nnamespace k3d\n{\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// vector3_source\n\ntemplate<typename derived_t>\nclass vector3_source :\n\tpublic ivector3_source\n{\npublic:\n\tiproperty& vector3_source_output()\n\t{\n\t\treturn m_output_vector3;\n\t}\n\n\tsigc::slot<void, ihint*> make_update_vector3_slot()\n\t{\n\t\treturn m_output_vector3.make_slot();\n\t}\n\nprotected:\n\tvector3_source() :\n\t\tm_output_vector3(\n\t\t\tinit_owner(*static_cast<derived_t*>(this))\n\t\t\t+ init_name(\"output_vector\")\n\t\t\t+ init_label(_(\"Output Vector\"))\n\t\t\t+ init_description(\"Output vector\")\n\t\t\t+ init_value(vector3(0, 0, 0)))\n\t{\n\t\tm_output_vector3.set_update_slot(sigc::mem_fun(*this, &vector3_source<derived_t>::execute));\n\t}\n\n\nprivate:\n\tk3d_data(vector3, data::immutable_name, data::change_signal, data::no_undo, data::value_demand_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_output_vector3;\n\n\t/// Called whenever the output has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, vector3& Output)\n\t{\n\t\t// We can safely ignore any hints ...\n\t\ton_update_vector3(Output);\n\t}\n\n\tvirtual void on_update_vector3(vector3& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_VECTOR3_SOURCE_H\n\n"
  },
  {
    "path": "k3dsdk/vector4.h",
    "content": "#ifndef K3DSDK_VECTOR4_H\n#define K3DSDK_VECTOR4_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n/****************************************************************\n*\n* C++ Vector and Matrix Algebra routines\n* Author: Jean-Francois DOUE\n* Version 3.1 --- October 1993\n*\n****************************************************************/\n\n//\n//\tFrom \"Graphics Gems IV / Edited by Paul S. Heckbert\n//\tAcademic Press, 1994, ISBN 0-12-336156-9\n//\t\"You are free to use and modify this code in any way\n//\tyou like.\" (p. xv)\n//\n//\tModified by J. Nagle, March 1997\n//\t-\tAll functions are inline.\n//\t-\tAll functions are const-correct.\n//\t-\tAll checking is via the standard \"assert\" macro.\n//\n\n// Modified by Tim Shead for use with K-3D, January 1998\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/result.h>\n\n#include <boost/io/ios_state.hpp>\n\n#include <cmath>\n#include <iomanip>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// vector4\n\n/// Encapsulates a direction vector in four-dimensional space\nclass vector4\n{\npublic:\n\t/// Stores the vector values\n\tdouble_t n[4];\n\n\tvector4()\n\t{\n\t\tn[0] = n[1] = n[2] = n[3] = 0.0;\n\t}\n\n\tvector4(const double_t x, const double_t y, const double_t z, const double_t w)\n\t{\n\t\tn[0] = x;\n\t\tn[1] = y;\n\t\tn[2] = z;\n\t\tn[3] = w;\n\t}\n\n\tvector4& operator+=(const vector4& v)\n\t{\n\t\tn[0] += v.n[0];\n\t\tn[1] += v.n[1];\n\t\tn[2] += v.n[2];\n\t\tn[3] += v.n[3];\n\t\treturn *this;\n\t}\n\n\tvector4& operator-=(const vector4& v)\n\t{\n\t\tn[0] -= v.n[0];\n\t\tn[1] -= v.n[1];\n\t\tn[2] -= v.n[2];\n\t\tn[3] -= v.n[3];\n\t\treturn *this;\n\t}\n\n\tvector4& operator*=(const double_t d)\n\t{\n\t\tn[0] *= d;\n\t\tn[1] *= d;\n\t\tn[2] *= d;\n\t\tn[3] *= d;\n\t\treturn *this;\n\t}\n\n\tvector4& operator/=(const double_t d)\n\t{\n\t\treturn_val_if_fail(d, *this);\n\n\t\tconst double_t d_inv = 1.0 / d;\n\t\tn[0] *= d_inv;\n\t\tn[1] *= d_inv;\n\t\tn[2] *= d_inv;\n\t\tn[3] *= d_inv;\n\t\treturn *this;\n\t}\n\n\tdouble_t& operator[](const unsigned int i)\n\t{\n\t\treturn n[i];\n\t}\n\n\tdouble_t operator[](const unsigned int i) const\n\t{\n\t\treturn n[i];\n\t}\n\n\t/// Returns the normal length\n\tdouble_t length() const\n\t{\n\t\treturn std::sqrt(length2());\n\t}\n\n\t/// Returns the squared normal length\n\tdouble_t length2() const\n\t{\n\t\treturn n[0] * n[0] + n[1] * n[1] + n[2] * n[2] + n[3] * n[3];\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const vector4& Value)\n\t{\n\t\tboost::io::ios_flags_saver stream_state(Stream);\n\t\tStream << std::setprecision(17) << Value.n[0] << \" \" << Value.n[1] << \" \" << Value.n[2] << \" \" << Value.n[3];\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, vector4& Value)\n\t{\n\t\tStream >> Value.n[0] >> Value.n[1] >> Value.n[2] >> Value.n[3];\n\t\treturn Stream;\n\t}\n};\n\n/// Negation\ninline const vector4 operator-(const vector4& v)\n{\n\treturn vector4(-v.n[0], -v.n[1], -v.n[2], -v.n[3]);\n}\n\n/// Addition\ninline const vector4 operator+(const vector4& a, const vector4& b)\n{\n\treturn vector4(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2], a.n[3] + b.n[3]);\n}\n\n/// Subtraction\ninline const vector4 operator-(const vector4& a, const vector4& b)\n{\n\treturn vector4(a.n[0] - b.n[0], a.n[1] - b.n[1], a.n[2] - b.n[2], a.n[3] - b.n[3]);\n}\n\n/// Multiplication by a constant\ninline const vector4 operator*(const vector4& a, const double_t d)\n{\n\treturn vector4(a.n[0] * d, a.n[1] * d, a.n[2] * d, a.n[3] * d);\n}\n\n/// Multiplication by a constant\ninline const vector4 operator*(const double_t d, const vector4& a)\n{\n\treturn vector4(a.n[0] * d, a.n[1] * d, a.n[2] * d, a.n[3] * d);\n}\n\n/// Returns the dot product of two vectors\ninline double_t operator*(const vector4& a, const vector4& b)\n{\n\treturn a.n[0] * b.n[0] + a.n[1] * b.n[1] + a.n[2] * b.n[2] + a.n[3] * b.n[3];\n}\n\n/// Division by a constant\ninline const vector4 operator/(const vector4& a, const double_t d)\n{\n\treturn_val_if_fail(d, vector4());\n\treturn vector4(a.n[0] / d, a.n[1] / d, a.n[2] / d, a.n[3] / d);\n}\n\n/// Equality\ninline bool operator==(const vector4& a, const vector4& b)\n{\n\treturn a.n[0] == b.n[0] && a.n[1] == b.n[1] && a.n[2] == b.n[2] && a.n[3] == b.n[3];\n}\n\n/// Inequality\ninline bool operator!=(const vector4& a, const vector4& b)\n{\n\treturn a.n[0] != b.n[0] || a.n[1] != b.n[1] || a.n[2] != b.n[2] || a.n[3] != b.n[3];\n}\n\n/// Returns the length of a vector\ninline double_t length(const vector4& Vector)\n{\n\treturn Vector.length();\n}\n\n/// Returns the normalized form of a vector\ninline const vector4 normalize(const vector4& Vector)\n{\n\tconst double_t length = Vector.length();\n\treturn_val_if_fail(length, Vector);\n\treturn Vector / length;\n}\n\nnamespace difference\n{\n\n/// Specialization of difference::test for vector4\ninline void test(const vector4& A, const vector4& B, accumulator& Result)\n{\n\trange_test(A.n, A.n + 4, B.n, B.n + 4, Result);\n}\n\n} // namespace difference\n\n} // namespace k3d\n\n#endif // !K3DSDK_VECTOR4_H\n\n"
  },
  {
    "path": "k3dsdk/vectors.h",
    "content": "#ifndef K3DSDK_VECTORS_H\n#define K3DSDK_VECTORS_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Vector (points, vectors and normals) routines\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n/****************************************************************\n*\n* C++ Vector and Matrix Algebra routines\n* Author: Jean-Francois DOUE\n* Version 3.1 --- October 1993\n*\n****************************************************************/\n\n//\n//\tFrom \"Graphics Gems IV / Edited by Paul S. Heckbert\n//\tAcademic Press, 1994, ISBN 0-12-336156-9\n//\t\"You are free to use and modify this code in any way\n//\tyou like.\" (p. xv)\n//\n//\tModified by J. Nagle, March 1997\n//\t-\tAll functions are inline.\n//\t-\tAll functions are const-correct.\n//\t-\tAll checking is via the standard \"assert\" macro.\n//\n\n// Modified by Tim Shead for use with K-3D, January 1998\n\n#include <k3dsdk/difference.h>\n#include <k3dsdk/normal3.h>\n#include <k3dsdk/point2.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/point4.h>\n#include <k3dsdk/vector2.h>\n#include <k3dsdk/vector3.h>\n#include <k3dsdk/vector4.h>\n\n#include <algorithm>\n#include <cmath>\n#include <iostream>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// vector2 / point2 operations\n\n/// Add a point and a vector, returning the moved point\ninline const point2 operator+(const point2& a, const vector2& b)\n{\n\treturn point2(a.n[0] + b.n[0], a.n[1] + b.n[1]);\n}\n\n/// Add a vector and a point, returning the moved point\ninline const point2 operator+(const vector2& a, const point2& b)\n{\n\treturn point2(a.n[0] + b.n[0], a.n[1] + b.n[1]);\n}\n\n/// Subtracts a vector from a point, returning the modified point\ninline const point2 operator-(const point2& a, const vector2& b)\n{\n\treturn point2(a.n[0] - b.n[0], a.n[1] - b.n[1]);\n}\n\n/// Returns the vector difference between two points\ninline const vector2 operator-(const point2& a, const point2& b)\n{\n\treturn vector2(a.n[0] - b.n[0], a.n[1] - b.n[1]);\n}\n\ninline point2& point2::operator+=(const vector2& v)\n{\n\tn[0] += v.n[0];\n\tn[1] += v.n[1];\n\treturn *this;\n}\n\ninline point2& point2::operator-=(const vector2& v)\n{\n\tn[0] -= v.n[0];\n\tn[1] -= v.n[1];\n\treturn *this;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// vector3 / point3 operations\n\n/// Add a point and a vector, returning the modified point\ninline const point3 operator+(const point3& a, const vector3& b)\n{\n\treturn point3(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2]);\n}\n\n/// Adds a vector and a point, returning the modified point\ninline const point3 operator+(const vector3& a, const point3& b)\n{\n\treturn point3(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2]);\n}\n\n/// Add a point and a normal, returning the modified point\ninline const point3 operator+(const point3& a, const normal3& b)\n{\n\treturn point3(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2]);\n}\n\n/// Adds a normal and a point, returning the modified point\ninline const point3 operator+(const normal3& a, const point3& b)\n{\n\treturn point3(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2]);\n}\n\n/// Subtracts a vector from a point, returning the modified point\ninline const point3 operator-(const point3& a, const vector3& b)\n{\n\treturn point3(a.n[0] - b.n[0], a.n[1] - b.n[1], a.n[2] - b.n[2]);\n}\n\n/// Returns the vector difference between two points\ninline const vector3 operator-(const point3& a, const point3& b)\n{\n\treturn vector3(a.n[0] - b.n[0], a.n[1] - b.n[1], a.n[2] - b.n[2]);\n}\n\ninline point3& point3::operator+=(const vector3& v)\n{\n\tn[0] += v.n[0]; n[1] += v.n[1]; n[2] += v.n[2]; return *this;\n}\n\ninline point3& point3::operator-=(const vector3& v)\n{\n\tn[0] -= v.n[0]; n[1] -= v.n[1]; n[2] -= v.n[2]; return *this;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// vector3 / normal3 operations\n\n/// Returns the dot product of a vector and a normal\ninline double operator*(const vector3& a, const normal3& b)\n{\n\treturn a.n[0] * b.n[0] + a.n[1] * b.n[1] + a.n[2] * b.n[2];\n}\n\n/// Returns the dot product of a normal and a vector\ninline double operator*(const normal3& a, const vector3& b)\n{\n\treturn a.n[0] * b.n[0] + a.n[1] * b.n[1] + a.n[2] * b.n[2];\n}\n\n/// Returns the cross product of a vector and a normal\ninline const vector3 operator^(const vector3& a, const normal3& b)\n{\n\treturn vector3(a.n[1] * b.n[2] - a.n[2] * b.n[1], a.n[2] * b.n[0] - a.n[0] * b.n[2], a.n[0] * b.n[1] - a.n[1] * b.n[0]);\n}\n\n/// Returns the cross product of a normal and a vector\ninline const vector3 operator^(const normal3& a, const vector3& b)\n{\n\treturn vector3(a.n[1] * b.n[2] - a.n[2] * b.n[1], a.n[2] * b.n[0] - a.n[0] * b.n[2], a.n[0] * b.n[1] - a.n[1] * b.n[0]);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// vector4 / point4 operations\n\n/// Add a point and a vector, returning the modified point\ninline const point4 operator+(const point4& a, const vector4& b)\n{\n\treturn point4(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2], a.n[3] + b.n[3]);\n}\n\n/// Adds a vector and a point, returning the modified point\ninline const point4 operator+(const vector4& a, const point4& b)\n{\n\treturn point4(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2], a.n[3] + b.n[3]);\n}\n\n/// Subtracts a vector from a point, returning the modified point\ninline const point4 operator-(const point4& a, const vector4& b)\n{\n\treturn point4(a.n[0] - b.n[0], a.n[1] - b.n[1], a.n[2] - b.n[2], a.n[3] - b.n[3]);\n}\n\n/// Returns the vector difference between two points\ninline const vector4 operator-(const point4& a, const point4& b)\n{\n\treturn vector4(a.n[0] - b.n[0], a.n[1] - b.n[1], a.n[2] - b.n[2], a.n[3] - b.n[3]);\n}\n\ninline point4& point4::operator+=(const vector4& v)\n{\n\tn[0] += v.n[0]; n[1] += v.n[1]; n[2] += v.n[2]; n[3] += v.n[3]; return *this;\n}\n\ninline point4& point4::operator-=(const vector4& v)\n{\n\tn[0] -= v.n[0]; n[1] -= v.n[1]; n[2] -= v.n[2]; n[3] -= v.n[3]; return *this;\n}\n\n//////////////////////////////////////////////////////////////////////////\n// Odds-and-ends\n\n/// Converts homogeneous coordinates to Cartesian.\ninline const point3 cartesian(const point4& p)\n{\n\tdouble_t denom_inv = (p.n[3] == 0) ? double_t(1.0) : double_t(1.0) / p.n[3];\n\treturn point3(p.n[0] * denom_inv, p.n[1] * denom_inv, p.n[2] * denom_inv);\n}\n\n/// Returns the distance between two points\ninline double distance(const point2& P1, const point2& P2)\n{\n\treturn length(P2 - P1);\n}\n\n/// Returns the distance between two points\ninline double distance(const point3& P1, const point3& P2)\n{\n\treturn length(P2 - P1);\n}\n\n/// Returns the distance between two points\ninline double distance(const point4& P1, const point4& P2)\n{\n\treturn length(P2 - P1);\n}\n\n/// Explicit conversion\ninline const vector2 to_vector(const point2& v)\n{\n\treturn vector2(v.n[0], v.n[1]);\n}\n\n/// Explicit conversion\ninline const point3 to_point(const vector3& v)\n{\n\treturn point3(v.n[0], v.n[1], v.n[2]);\n}\n\n/// Explicit conversion\ninline const point3 to_point(const normal3& v)\n{\n\treturn point3(v.n[0], v.n[1], v.n[2]);\n}\n\n/// Explicit conversion\ninline const vector3 to_vector(const point3& v)\n{\n\treturn vector3(v.n[0], v.n[1], v.n[2]);\n}\n\n/// Explicit conversion\ninline const vector3 to_vector(const normal3& v)\n{\n\treturn vector3(v.n[0], v.n[1], v.n[2]);\n}\n\n/// Explicit conversion\ninline const normal3 to_normal(const point3& v)\n{\n\treturn normal3(v.n[0], v.n[1], v.n[2]);\n}\n\n/// Explicit conversion\ninline const normal3 to_normal(const vector3& v)\n{\n\treturn normal3(v.n[0], v.n[1], v.n[2]);\n}\n\n/// Explicit conversion\ninline const vector4 to_vector(const point4& v)\n{\n\treturn vector4(v.n[0], v.n[1], v.n[2], v.n[3]);\n}\n\n/// Explicit conversion\ninline const point4 to_point(const vector4& v)\n{\n\treturn point4(v.n[0], v.n[1], v.n[2], v.n[3]);\n}\n\n} // namespace k3d\n\n#endif // !K3DSDK_VECTORS_H\n\n"
  },
  {
    "path": "k3dsdk/virtual_document_plugin_factory.h",
    "content": "#ifndef K3DSDK_VIRTUAL_DOCUMENT_PLUGIN_FACTORY_H\n#define K3DSDK_VIRTUAL_DOCUMENT_PLUGIN_FACTORY_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/interface_list.h>\n#include <k3dsdk/plugin_factory.h>\n\nnamespace k3d\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// document_plugin_factory\n\ntemplate<typename interface_list = null_interface>\nclass virtual_document_plugin_factory :\n\tpublic plugin_factory,\n\tpublic idocument_plugin_factory\n{\npublic:\n\tvirtual_document_plugin_factory(const uuid& ClassID, const std::string& Name, const std::string& ShortDescription, const std::string& Categories, const quality_t Quality = STABLE) :\n\t\tplugin_factory(ClassID, Name, ShortDescription, Categories, Quality)\n\t{\n\t}\n\n\tbool implements(const std::type_info& InterfaceType)\n\t{\n\t\treturn implements_interface<interface_list>()(InterfaceType);\n\t}\n\n\tconst interfaces_t interfaces()\n\t{\n\t\tinterfaces_t results;\n\t\tget_interfaces<interface_list>()(results);\n\t\treturn results;\n\t}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_VIRTUAL_DOCUMENT_PLUGIN_FACTORY_H\n\n"
  },
  {
    "path": "k3dsdk/watched_path_property.h",
    "content": "#ifndef K3DSDK_WATCHED_PATH_PROPERTY_H\n#define K3DSDK_WATCHED_PATH_PROPERTY_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file watched_path_property.h\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n\t\t\\created Feb 6, 2009\n*/\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/ihint.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/iwatched_path_property.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d\n{\n\ntemplate<typename value_t, class name_policy_t>\nclass watched_path_property :\n\tpublic iwatched_path_property,\n\tpublic path_property<value_t, name_policy_t>\n{\n\ttypedef path_property<value_t, name_policy_t> base;\npublic:\n\tvoid watch(const bool_t Watch)\n\t{\n\t\tm_watched = Watch;\n\t\tbase::changed_signal().emit(0);\n\t}\n\t\n\tconst bool_t is_watched() const\n\t{\n\t\treturn m_watched;\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\twatched_path_property(const init_t& Init) : base(Init), m_watched(true), m_watch_id(0)\n\t{\n\t\tbase::changed_signal().connect(hint::converter<\n\t\t\thint::convert<hint::any, hint::unchanged> >(sigc::mem_fun(*this, &watched_path_property::on_path_changed)));\n\t}\n\t\n\t~watched_path_property()\n\t{\n\t\tuser_interface().unwatch_path(m_watch_id);\n\t}\n\t\nprivate:\n\tvoid on_path_changed(ihint* Hint)\n\t{\n\t\tif(dynamic_cast<hint::file_changed*>(Hint))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tuser_interface().unwatch_path(m_watch_id);\n\t\tm_watch_id = 0;\n\t\t\n\t\tconst filesystem::path path = base::pipeline_value();\n\t\tif(path.empty() || !m_watched)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tm_watch_id = k3d::user_interface().watch_path(path, sigc::mem_fun(*this, &watched_path_property::on_file_changed));\n\t}\n\t\n\tvoid on_file_changed()\n\t{\n\t\tbase::changed_signal().emit(hint::file_changed::instance());\n\t}\n\t\n\tbool_t m_watched;\n\tuint_t m_watch_id;\t\n};\n\t\n/// Serialization policy for filesystem path data that handles external filesystem resources\ntemplate<typename value_t, class property_policy_t>\nclass watched_path_serialization :\n\tpublic path_serialization<value_t, property_policy_t>\n{\n\t// This policy only works for data stored by-value\n\tBOOST_STATIC_ASSERT((!boost::is_pointer<value_t>::value));\n\n\ttypedef path_serialization<value_t, property_policy_t> base;\n\t\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context& Context)\n\t{\n\t\txml::element& xml_storage = save_external_resource(Element, Context, property_policy_t::name(), property_policy_t::property_path_reference(), property_policy_t::internal_value());\n\t\txml_storage.append(xml::attribute(\"watched\", property_policy_t::is_watched()));\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context)\n\t{\n\t\tbase::load(Element, Context);\n\t\tproperty_policy_t::watch(xml::attribute_value<bool_t>(Element, \"watched\", false));\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\twatched_path_serialization(const init_t& Init) : base(Init) {}\n};\n\n} // namespace k3d\n\n#endif // !K3DSDK_WATCHED_PATH_PROPERTY_H\n\n"
  },
  {
    "path": "k3dsdk/win32.h",
    "content": "#ifndef K3DSDK_WIN32_H\n#define K3DSDK_WIN32_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#ifndef NOMINMAX\n\t#define NOMINMAX\n#endif // !NOMINMAX\n\n#include <windows.h>\n\n#undef interface\n#undef near\n#undef far\n\n#endif // !K3DSDK_WIN32_H\n\n"
  },
  {
    "path": "k3dsdk/xml.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements k3dxml, an XML API designed to fit-in well with the Standard C++ Library\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/xml.h>\n\n#include <iostream>\n#include <iterator>\n#include <stack>\n#include <stdexcept>\n\n#if defined K3D_HAVE_EXPAT\n\n\t#include <expat.h>\n\t#define BACKEND_PARSER expat_parser\n\t\n#elif defined K3D_HAVE_LIBXML2\n\n\t#include <libxml/parser.h>\n\t#define BACKEND_PARSER libxml2_parser\n\t\n#else\n\n\t#error No XML parser defined ... did you forget to run configure?\n\n#endif\n\nnamespace k3d\n{\n\nnamespace xml\n{\n\nnamespace detail\n{\n\n// We provide a set of iostream-compatible manipulators for formatting XML output\n\n/// Returns true iff the XML should be serialized on a single line, otherwise false\nlong& single_line(std::ios& Stream)\n{\n\tstatic const int index = std::ios::xalloc();\n\treturn Stream.iword(index);\n}\n\n/// Inserts a \"virtual\" line break into a stream, the actual output is controlled by the state of the single_line flag\nstd::ostream& eol(std::ostream& Stream)\n{\n\tif(!single_line(Stream))\n\t\tStream << \"\\n\";\n\t\n\treturn Stream;\n}\n\n/// Inserts whitespace into a stream, proportional to its indentation level (we override the default to implement single_line behavior).\nstd::ostream& indentation(std::ostream& Stream)\n{\n\tif(!single_line(Stream))\n\t\tStream << std::string(k3d::current_indent(Stream), '\\t'); \n\treturn Stream;\n}\n\n/// Returns the input string with leading and trailing whitespace removed\nconst std::string trim(const std::string& String)\n{\n\tstd::string::size_type string_size = String.size();\n\n\tstd::string::size_type start = 0;\n\tfor(; start != string_size; ++start)\n\t{\n\t\tif(!isspace(String[start]))\n\t\t\tbreak;\n\t}\n\n\tstd::string::size_type end = string_size;\n\tfor(; end != start; --end)\n\t{\n\t\tif(!isspace(String[end-1]))\n\t\t\tbreak;\n\t}\n\n\treturn std::string(String.substr(start, end - start));\n}\n\n/// Returns the input string, with special characters encoded for XML\nconst std::string encode(const std::string& String)\n{\n\tstd::string result;\n\tresult.reserve(String.size());\n\n\tfor(std::string::size_type i = 0; i != String.size(); ++i)\n\t{\n\t\tif(String[i] == '&')\n\t\t\tresult += \"&amp;\";\n\t\telse if(String[i] == '<')\n\t\t\tresult += \"&lt;\";\n\t\telse if(String[i] == '>')\n\t\t\tresult += \"&gt;\";\n\t\telse if(String[i] == '\\'')\n\t\t\tresult += \"&apos;\";\n\t\telse if(String[i] == '\\\"')\n\t\t\tresult += \"&quot;\";\n\t\telse\n\t\t\tresult += String[i];\n\t}\n\n\treturn result;\n}\n\n#ifdef K3D_HAVE_EXPAT\n\n/// Adaptor class that uses James Clark's expat library to parse a stream into an xml::element - replace this if you prefer some other parser\nclass expat_parser\n{\npublic:\n\ttypedef expat_parser this_t;\n\n\texpat_parser() :\n\t\tparser(XML_ParserCreate(0)),\n\t\troot(0)\n\t{\n\t\tXML_SetUserData(parser, this);\n\t\tXML_SetStartElementHandler(parser, raw_start_element_handler);\n\t\tXML_SetEndElementHandler(parser, raw_end_element_handler);\n\t\tXML_SetCharacterDataHandler(parser, raw_character_data_handler);\n\t}\n\n\t~expat_parser()\n\t{\n\t\tXML_ParserFree(parser);\n\t}\n\n\tconst char* error_description()\n\t{\n\t\tstatic std::string buffer;\n\t\tbuffer = XML_ErrorString(XML_GetErrorCode(parser)) + std::string(\" line: \") + string_cast(XML_GetCurrentLineNumber(parser)) + std::string(\" column: \") + string_cast(XML_GetCurrentColumnNumber(parser));\n\t\t\n\t\treturn buffer.c_str();\n\t}\n\n\tvoid parse(xml::element& Root, std::istream& InputStream, const std::string&, progress& Progress)\n\t{\n\t\troot = &Root;\n\n\t\twhile(!element_stack.empty())\n\t\t\telement_stack.pop();\n\n\t\tstd::vector<char> buffer(1024);\n\t\tfor(InputStream.read(&buffer[0], buffer.size()); InputStream; InputStream.read(&buffer[0], buffer.size()))\n\t\t{\n\t\t\tProgress.show_activity();\n\t\t\tif(XML_STATUS_ERROR == XML_Parse(parser, &buffer[0], InputStream.gcount(), false))\n\t\t\t\tthrow std::runtime_error(error_description());\n\t\t}\n\t\tProgress.show_activity();\n\t\tif(XML_STATUS_ERROR == XML_Parse(parser, &buffer[0], InputStream.gcount(), true))\n\t\t\tthrow std::runtime_error(error_description());\n\t}\n\nprivate:\n\tvoid start_element_handler(const XML_Char* Name, const XML_Char** Attributes)\n\t{\n\t\tif(element_stack.empty())\n\t\t{\n\t\t\troot->name = Name;\n\t\t\telement_stack.push(root);\n\t\t}\n\t\telse\n\t\t{\n\t\t\telement_stack.top()->children.push_back(xml::element(Name));\n\t\t\telement_stack.push(&element_stack.top()->children.back());\n\t\t}\n\n\n\t\tif(Attributes)\n\t\t{\n\t\t\tfor(unsigned long i = 0; Attributes[i]; i+=2)\n\t\t\t\telement_stack.top()->attributes.push_back(xml::attribute(Attributes[i], Attributes[i+1]));\n\t\t}\n\t}\n\n\tvoid end_element_handler(const XML_Char*)\n\t{\n\t\tif(!element_stack.empty())\n\t\t{\n\t\t\telement_stack.top()->text = trim(element_stack.top()->text);\n\t\t\telement_stack.pop();\n\t\t}\n\t}\n\n\tvoid character_data_handler(const XML_Char* Data, int Length)\n\t{\n\t\telement_stack.top()->text += std::string(Data, Length);\n\t}\n\n\tstatic void raw_start_element_handler(void* UserData, const XML_Char* Name, const XML_Char** Attributes)\n\t{\n\t\treinterpret_cast<this_t*>(UserData)->start_element_handler(Name, Attributes);\n\t}\n\n\tstatic void raw_end_element_handler(void* UserData, const XML_Char* Name)\n\t{\n\t\treinterpret_cast<this_t*>(UserData)->end_element_handler(Name);\n\t}\n\n\tstatic void raw_character_data_handler(void* UserData, const XML_Char* Data, int Length)\n\t{\n\t\treinterpret_cast<this_t*>(UserData)->character_data_handler(Data, Length);\n\t}\n\n\tXML_Parser parser;\n\txml::element* root;\n\tstd::stack<xml::element*> element_stack;\n};\n\n#endif // K3D_HAVE_EXPAT\n\n#ifdef K3D_HAVE_LIBXML2\n\n/// Adaptor class that uses the Gnome libxml2 library to parse a stream into an xml::element - replace this if you prefer some other parser\nclass libxml2_parser\n{\npublic:\n\ttypedef libxml2_parser this_t;\n\n\tlibxml2_parser() :\n\t\troot(0)\n\t{\n\t\tmemset(&sax_handler, 0, sizeof(sax_handler));\n\t\tsax_handler.startElement = raw_start_element_handler;\n\t\tsax_handler.endElement = raw_end_element_handler;\n\t\tsax_handler.characters = raw_character_data_handler;\n\t\tsax_handler.warning = raw_warning_handler;\n\t\tsax_handler.error = raw_error_handler;\n\t\tsax_handler.fatalError = raw_fatal_error_handler;\n\t}\n\n\tvoid parse(k3d::xml::element& Root, std::istream& InputStream, const std::string& StreamName, k3d::xml::progress& Progress)\n\t{\n\t\tparser_context parser(xmlCreatePushParserCtxt(&sax_handler, this, 0, 0, StreamName.c_str()));\n\t\txmlCtxtUseOptions(parser, XML_PARSE_NOENT);\n\t\t\n\t\troot = &Root;\n\n\t\twhile(!element_stack.empty())\n\t\t\telement_stack.pop();\n\n\t\tstd::vector<char> buffer(1024);\n\t\tfor(InputStream.read(&buffer[0], buffer.size()); InputStream; InputStream.read(&buffer[0], buffer.size()))\n\t\t{\n\t\t\tProgress.show_activity();\n\t\t\tif(XML_ERR_OK != xmlParseChunk(parser, &buffer[0], InputStream.gcount(), false))\n\t\t\t\tthrow std::runtime_error(error_description(parser));\n\t\t}\n\t\tProgress.show_activity();\n\t\tif(XML_ERR_OK != xmlParseChunk(parser, &buffer[0], InputStream.gcount(), true))\n\t\t\tthrow std::runtime_error(error_description(parser));\n\t}\n\nprivate:\n\tconst char* error_description(xmlParserCtxtPtr Context)\n\t{\n\t\tstd::ostringstream buffer;\n\n\t\tbuffer << \"XML parsing error\";\n\t\t\n\t\tstatic std::string results;\n\n\t\tresults = buffer.str();\n\t\tresults.erase(std::remove(results.begin(), results.end(), '\\n'), results.end());\n\n\t\treturn results.c_str();\n\t}\n\n\tclass parser_context\n\t{\n\tpublic:\n\t\tparser_context(xmlParserCtxtPtr Context) :\n\t\t\tcontext(Context)\n\t\t{\n\t\t}\n\n\t\t~parser_context()\n\t\t{\n\t\t\txmlFreeParserCtxt(context);\n\t\t}\n\n\t\toperator xmlParserCtxtPtr()\n\t\t{\n\t\t\treturn context;\n\t\t}\n\t\t\n\tprivate:\n\t\txmlParserCtxtPtr context;\n\t};\n\n\t// This may-or-may-not-be safe-to-do, but at least it's all in one place\n\tstatic const char* utf8_to_char(const xmlChar* RHS)\n\t{\n\t\treturn reinterpret_cast<const char*>(RHS);\n\t}\n\n\tvoid start_element_handler(const xmlChar* Name, const xmlChar** Attributes)\n\t{\n\t\tif(element_stack.empty())\n\t\t{\n\t\t\troot->name = utf8_to_char(Name);\n\t\t\telement_stack.push(root);\n\t\t}\n\t\telse\n\t\t{\n\t\t\telement_stack.top()->children.push_back(k3d::xml::element(utf8_to_char(Name)));\n\t\t\telement_stack.push(&element_stack.top()->children.back());\n\t\t}\n\n\t\tif(Attributes)\n\t\t{\n\t\t\tfor(unsigned long i = 0; Attributes[i]; i+=2)\n\t\t\t\telement_stack.top()->attributes.push_back(k3d::xml::attribute(utf8_to_char(Attributes[i]), utf8_to_char(Attributes[i+1])));\n\t\t}\n\t}\n\n\tvoid end_element_handler(const xmlChar* Name)\n\t{\n\t\tif(!element_stack.empty())\n\t\t{\n\t\t\telement_stack.top()->text = trim(element_stack.top()->text);\n\t\t\telement_stack.pop();\n\t\t}\n\t}\n\n\tvoid character_data_handler(const xmlChar* Data, int Length)\n\t{\n\t\telement_stack.top()->text += std::string(utf8_to_char(Data), Length);\n\t}\n\n\tstatic void raw_start_element_handler(void* UserData, const xmlChar* Name, const xmlChar** Attributes)\n\t{\n\t\treinterpret_cast<this_t*>(UserData)->start_element_handler(Name, Attributes);\n\t}\n\n\tstatic void raw_end_element_handler(void* UserData, const xmlChar* Name)\n\t{\n\t\treinterpret_cast<this_t*>(UserData)->end_element_handler(Name);\n\t}\n\n\tstatic void raw_character_data_handler(void* UserData, const xmlChar* Data, int Length)\n\t{\n\t\treinterpret_cast<this_t*>(UserData)->character_data_handler(Data, Length);\n\t}\n\n\tstatic void raw_warning_handler(void* UserData, const char* Message, ...)\n\t{\n\t\tva_list args;\n\t\tva_start(args, Message);\n\n\t\tstd::string buffer(256, '\\0');\n\t\tvsnprintf(&buffer[0], buffer.size(), Message, args);\n\t\tbuffer.resize(strlen(buffer.c_str()));\n\t\t\n\t\tlog() << warning << buffer << std::flush;\n\t\t\n\t\tva_end(args);\n\t}\n\n\tstatic void raw_error_handler(void* UserData, const char* Message, ...)\n\t{\n\t\tva_list args;\n\t\tva_start(args, Message);\n\t\t\n\t\tstd::string buffer(256, '\\0');\n\t\tvsnprintf(&buffer[0], buffer.size(), Message, args);\n\t\tbuffer.resize(strlen(buffer.c_str()));\n\t\t\n\t\tlog() << error << buffer << std::flush;\n\t\t\n\t\tva_end(args);\n\t}\n\n\tstatic void raw_fatal_error_handler(void* UserData, const char* Message, ...)\n\t{\n\t\tva_list args;\n\t\tva_start(args, Message);\n\t\t\n\t\tstd::string buffer(256, '\\0');\n\t\tvsnprintf(&buffer[0], buffer.size(), Message, args);\n\t\tbuffer.resize(strlen(buffer.c_str()));\n\t\t\n\t\tlog() << critical << buffer << std::flush;\n\t\t\n\t\tva_end(args);\n\t}\n\n\txmlSAXHandler sax_handler;\n\tk3d::xml::element* root;\n\tstd::stack<k3d::xml::element*> element_stack;\n};\n\n#endif // K3D_HAVE_LIBXML2\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////\n// single_line\n\nsingle_line::single_line(bool Enable) :\n\tenable(Enable)\n{\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const single_line& RHS)\n{\n\tdetail::single_line(Stream) = RHS.enable;\n\treturn Stream;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////\n// declaration\n\nstd::ostream& operator<<(std::ostream& Stream, const declaration&)\n{\n\tStream << \"<?xml version=\\\"1.0\\\" ?>\" << detail::eol;\n\treturn Stream;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////\n// element\n\nelement& element::safe_element(const std::string& Name)\n{\n\t\n\tfor(element::elements_t::iterator child = children.begin(); child != children.end(); ++child)\n\t{\n\t\tif(child->name == Name)\n\t\t\treturn *child;\n\t}\n\n\treturn append(element(Name));\n}\n\nelement& element::safe_element(const element& Match)\n{\n\treturn safe_element(Match, Match);\n}\n\nelement& element::safe_element(const element& Match, const element& Prototype)\n{\n\tfor(element::elements_t::iterator child = children.begin(); child != children.end(); ++child)\n\t{\n\t\tif(child->name != Match.name)\n\t\t\tcontinue;\n\t\t\t\n\t\telement::attributes_t::const_iterator search_attribute;\n\t\tfor(search_attribute = Match.attributes.begin(); search_attribute != Match.attributes.end(); ++search_attribute)\n\t\t{\n\t\t\tconst attribute* const a = find_attribute(*child, search_attribute->name);\n\t\t\tif(!a)\n\t\t\t\tbreak;\n\n\t\t\tif(a->value != search_attribute->value)\n\t\t\t\tbreak;\n\t\t}\n\t\t\t\n\t\tif(search_attribute != Match.attributes.end())\n\t\t\tcontinue;\n\t\t\t\n\t\treturn *child;\n\t}\n\n\treturn append(Prototype);\n}\n\nattribute& element::append(const attribute& Child)\n{\n\tattributes.push_back(Child);\n\treturn attributes.back();\n}\n\nelement& element::append(const element& Child)\n{\n\tchildren.push_back(Child);\n\treturn children.back();\n}\n\nconst attribute* find_attribute(const element& Element, const std::string& AttributeName)\n{\n\tfor(element::attributes_t::const_iterator child = Element.attributes.begin(); child != Element.attributes.end(); ++child)\n\t{\n\t\tif(child->name == AttributeName)\n\t\t\treturn &(*child);\n\t}\n\n\treturn 0;\n}\n\nattribute* find_attribute(element& Element, const std::string& AttributeName)\n{\n\tfor(element::attributes_t::iterator child = Element.attributes.begin(); child != Element.attributes.end(); ++child)\n\t{\n\t\tif(child->name == AttributeName)\n\t\t\treturn &(*child);\n\t}\n\n\treturn 0;\n}\n\nconst element* find_element(const element& Element, const std::string& ElementName)\n{\n\tfor(element::elements_t::const_iterator child = Element.children.begin(); child != Element.children.end(); ++child)\n\t{\n\t\tif(child->name == ElementName)\n\t\t\treturn &(*child);\n\t}\n\n\treturn 0;\n}\n\nelement* find_element(element& Element, const std::string& ElementName)\n{\n\tfor(element::elements_t::iterator child = Element.children.begin(); child != Element.children.end(); ++child)\n\t{\n\t\tif(child->name == ElementName)\n\t\t\treturn &(*child);\n\t}\n\n\treturn 0;\n}\n\nattribute& set_attribute(element& Element, const attribute& Attribute)\n{\n\tattribute* const a = find_attribute(Element, Attribute.name);\n\tif(a)\n\t{\n\t\ta->value = Attribute.value;\n\t\treturn *a;\n\t}\n\n\treturn Element.append(Attribute);\n}\n\nconst std::string attribute_text(const element& Element, const std::string& AttributeName, const std::string& DefaultValue)\n{\n\tconst attribute* child = find_attribute(Element, AttributeName);\n\treturn child ? child->value : DefaultValue;\n}\n\nconst std::string remove_attribute(element& Element, const std::string& AttributeName)\n{\n\tstd::string result;\n\tfor(element::attributes_t::iterator child = Element.attributes.begin(); child != Element.attributes.end(); ++child)\n\t{\n\t\tif(child->name == AttributeName)\n\t\t{\n\t\t\tresult = child->value;\n\t\t\tElement.attributes.erase(child);\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn result;\n}\n\nconst std::string element_text(const element& Element, const std::string& ElementName, const std::string& DefaultValue)\n{\n\tconst element* child = find_element(Element, ElementName);\n\treturn child ? child->text : DefaultValue;\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const attribute& RHS)\n{\n\tStream << RHS.name << \"=\\\"\" << detail::encode(RHS.value) << \"\\\"\";\n\treturn Stream;\n}\n\nstd::ostream& operator<<(std::ostream& Stream, const element& RHS)\n{\n\tStream << detail::indentation << \"<\" << RHS.name;\n\n\tfor(element::attributes_t::const_iterator a = RHS.attributes.begin(); a != RHS.attributes.end(); ++a)\n\t\tStream << \" \" << *a;\n\t\n\tif(RHS.children.empty() && RHS.text.empty())\n\t{\n\t\tStream << \"/>\" << detail::eol;\n\t\treturn Stream;\n\t}\n\n\tStream << \">\" << detail::encode(RHS.text);\n\n\tif(RHS.children.size())\n\t{\n\t\tStream << detail::eol << push_indent;\n\t\tstd::copy(RHS.children.begin(), RHS.children.end(), std::ostream_iterator<element>(Stream));\n\t\tStream << pop_indent << detail::indentation;\n\t}\n\n\tStream << \"</\" << RHS.name << \">\" << detail::eol;\n\n\treturn Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, element& RHS)\n{\n\thide_progress p;\n\tparse(RHS, Stream, \"\", p);\n\treturn Stream;\n}\n\nvoid parse(element& Root, std::istream& InputStream, const std::string& StreamName, progress& Progress)\n{\n\tdetail::BACKEND_PARSER parser;\n\tparser.parse(Root, InputStream, StreamName, Progress);\n}\n\n} // namespace xml\n\n} // namespace k3d\n\n"
  },
  {
    "path": "k3dsdk/xml.h",
    "content": "#ifndef K3DSDK_XML_H\n#define K3DSDK_XML_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Declares the public API of k3dxml, an XML API designed to fit-in well with the Standard C++ Library\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/string_cast.h>\n\n#include <iosfwd>\n#include <sstream>\n#include <vector>\n\nnamespace k3d\n{\n\nnamespace xml\n{\n\n/// Encapsulates an XML attribute with name and value\nclass attribute\n{\npublic:\n\tattribute() {}\n\tattribute(const std::string& Name, const std::string& Value) : name(Name), value(Value) {}\n\tattribute(const std::string& Name, const char* Value) : name(Name), value(Value) {}\n\n\ttemplate<typename T>\n\tattribute(const std::string& Name, const T& Value) : name(Name), value(string_cast(Value)) {}\n\n\t/// Stores the attribute name\n\tstd::string name;\n\t/// Stores the attribute value\n\tstd::string value;\n};\n\n/// Encapsulates an XML element with name, text, child attributes, and child elements\nclass element\n{\npublic:\n\telement(){}\n\n\telement(const std::string& Name) : name(Name) {}\n\t\n\ttemplate<typename T1>\t\n\telement(const std::string& Name, const T1& A1) : name(Name) { push_back(A1); }\n\n\ttemplate<typename T1, typename T2>\n\telement(const std::string& Name, const T1& A1, const T2& A2) : name(Name) { push_back(A1); push_back(A2); }\n\n\ttemplate<typename T1, typename T2, typename T3>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3) : name(Name) { push_back(A1); push_back(A2); push_back(A3); }\n\t\n\ttemplate<typename T1, typename T2, typename T3, typename T4>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); }\n\n\ttemplate<typename T1, typename T2, typename T3, typename T4, typename T5>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); push_back(A5); }\n\n\ttemplate<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); push_back(A5); push_back(A6); }\n\n\ttemplate<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6, const T7& A7) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); push_back(A5); push_back(A6); push_back(A7); }\n\n\ttemplate<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6, const T7& A7, const T8& A8) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); push_back(A5); push_back(A6); push_back(A7); push_back(A8); }\n\t\n\ttemplate<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6, const T7& A7, const T8& A8, const T9& A9) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); push_back(A5); push_back(A6); push_back(A7); push_back(A8); push_back(A9);}\n\n\ttemplate<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6, const T7& A7, const T8& A8, const T9& A9, const T10& A10) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); push_back(A5); push_back(A6); push_back(A7); push_back(A8); push_back(A9); push_back(A10);}\n\n\ttemplate<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6, const T7& A7, const T8& A8, const T9& A9, const T10& A10, const T11& A11) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); push_back(A5); push_back(A6); push_back(A7); push_back(A8); push_back(A9); push_back(A10); push_back(A11); }\n\n\ttemplate<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6, const T7& A7, const T8& A8, const T9& A9, const T10& A10, const T11& A11, const T12& A12) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); push_back(A5); push_back(A6); push_back(A7); push_back(A8); push_back(A9); push_back(A10); push_back(A11); push_back(A12); }\n\n\ttemplate<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6, const T7& A7, const T8& A8, const T9& A9, const T10& A10, const T11& A11, const T12& A12, const T13& A13) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); push_back(A5); push_back(A6); push_back(A7); push_back(A8); push_back(A9); push_back(A10); push_back(A11); push_back(A12); push_back(A13); }\n\n\ttemplate<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6, const T7& A7, const T8& A8, const T9& A9, const T10& A10, const T11& A11, const T12& A12, const T13& A13, const T14& A14) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); push_back(A5); push_back(A6); push_back(A7); push_back(A8); push_back(A9); push_back(A10); push_back(A11); push_back(A12); push_back(A13); push_back(A14); }\n\n\ttemplate<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>\n\telement(const std::string& Name, const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6, const T7& A7, const T8& A8, const T9& A9, const T10& A10, const T11& A11, const T12& A12, const T13& A13, const T14& A14, const T15& A15) : name(Name) { push_back(A1); push_back(A2); push_back(A3); push_back(A4); push_back(A5); push_back(A6); push_back(A7); push_back(A8); push_back(A9); push_back(A10); push_back(A11); push_back(A12); push_back(A13); push_back(A14); push_back(A15); }\n\n\tvoid push_back(const std::string& Value) { text += Value; }\n\tvoid push_back(const attribute& Value) { attributes.push_back(Value); }\n\tvoid push_back(const element& Value) { children.push_back(Value); }\n\t\n\t/// Searches for a child element by name, creating it if it isn't found\n\telement& safe_element(const std::string& Name);\n\t/// Searches for a child element, creating it from the match if it isn't found\n\telement& safe_element(const element& Match);\n\t/// Searches for a child element, creating it from the prototype if it isn't found\n\telement& safe_element(const element& Match, const element& Prototype);\n\n\t/// Appends a child attribute, returning a reference to the new child for convenience\n\tattribute& append(const attribute& Child);\n\t/// Appends a child element, returning a reference to the new child for convenience\n\telement& append(const element& Child);\n\n\t/// Stores the element name\n\tstd::string name;\n\t/// Stores element text\n\tstd::string text;\n\n\t/// Defines a collection of attributes\n\ttypedef std::vector<attribute> attributes_t;\n\t/// Stores child attributes\n\tattributes_t attributes;\n\t/// Defines a collection of child elements\n\ttypedef std::vector<element> elements_t;\n\t/// Stores child elements\n\telements_t children;\n};\n\nclass same_name\n{\npublic:\n\tsame_name(const std::string& Name) : name(Name) {}\n\n\ttemplate<typename T>\n\tbool operator()(const T& Val) { return Val.name == name; }\n\nprivate:\n\tconst std::string name;\n};\n\n/// Sets an attribute on a child element, overwriting any existing attribute value\nattribute& set_attribute(element& Element, const attribute& Child);\n/*\n/// Appends a child attribute to an element, returning a reference to the new child for convenience\nattribute& append(element& Element, const attribute& Child);\n/// Appends a child element to an element, returning a reference to the new child for convenience\nelement& append(element& Element, const element& Child);\n*/\n\n/// Searches for a child attribute by name, returning the child if found, else NULL\nconst attribute* find_attribute(const element& Element, const std::string& AttributeName);\n/// Searches for a child attribute by name, returning the child if found, else NULL\nattribute* find_attribute(element& Element, const std::string& AttributeName);\n/// Searches for a child element by name, returning the child if found, else NULL\nconst element* find_element(const element& Element, const std::string& ElementName);\n/// Searches for a child element by name, returning the child if found, else NULL\nelement* find_element(element& Element, const std::string& ElementName);\n/// Searches for a child element by name, returning the child if found, else NULL\nelement* find_element(element& Element, const std::string& ElementName);\n\n/// Returns the text value of an attribute as a string by name, or a default value if the attribute can't be found\nconst std::string attribute_text(const element& Element, const std::string& AttributeName, const std::string& DefaultValue = std::string());\n/// Returns the text value of an attribute, converted to a specific type, or a default value if the attribute can't be found\ntemplate<typename T>\nconst T attribute_value(const element& Element, const std::string& AttributeName, const T& DefaultValue)\n{\n\tconst attribute* const a = find_attribute(Element, AttributeName);\n\tif(a)\n\t\treturn k3d::from_string<T>(a->value, DefaultValue);\n\t\n\treturn DefaultValue;\n}\n\n/// Removes an attribute from an element, returning its string value if it exists, or empty string.\nconst std::string remove_attribute(element& Element, const std::string& AttributeName);\n\n/// Returns the text value of a child element as a string by name, or a default value if the child element can't be found\nconst std::string element_text(const element& Element, const std::string& ElementName, const std::string& DefaultValue = std::string());\n\n/// iostream-compatible manipulator that controls whether subsequent XML will be serialized with-or-without line breaks\nstruct single_line\n{\n\tsingle_line(bool Enable = true);\n\tbool enable;\n};\nstd::ostream& operator<<(std::ostream& Stream, const single_line& RHS);\n\n/// Inserts an XML declaration <?xml version=\"1.0\" ?> into a stream\nstruct declaration\n{\n};\nstd::ostream& operator<<(std::ostream& Stream, const declaration& RHS);\n\n/// Serializes an XML attribute to a stream\nstd::ostream& operator<<(std::ostream& Stream, const attribute& RHS);\n/// Serializes an XML document to a stream\nstd::ostream& operator<<(std::ostream& Stream, const element& RHS);\n/// Extracts an XML document from a stream.  Throws std::runtime_error if there are any problems.\nstd::istream& operator>>(std::istream& Stream, element& RHS);\n\n/// Abstract interface used to provide feedback during long parsing operations\nclass progress\n{\npublic:\n\tvirtual void show_activity() = 0;\n\nprotected:\n\tprogress() {}\n\tprogress(const progress&) {}\n\tprogress& operator=(const progress&) { return *this; }\n\tvirtual ~progress() {}\n};\n\n/// Convenience implementation of the progress interface for use when feedback is not required (Null Object Pattern)\nclass hide_progress :\n\tpublic progress\n{\npublic:\n\tvoid show_activity() {}\n};\n\n/// Parses an XML document from a stream.  Throws std::runtime_error if there are any problems.\nvoid parse(element& Root, std::istream& InputStream, const std::string& StreamName, progress& Progress);\n\n} // namespace xml\n\n} // namespace k3d\n\n#endif // !K3DSDK_XML_H\n\n"
  },
  {
    "path": "k3dsdk/xpath.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/result.h>\n#include <k3dsdk/xml.h>\n#include <k3dsdk/xpath.h>\n\n#include <boost/spirit/include/classic.hpp>\nusing namespace boost::spirit::classic;\n\nnamespace k3d\n{\n\nnamespace xml\n{\n\nnamespace xpath\n{\n\nstruct match_context\n{\n\tmatch_context(element& Tree, result_set& Results) :\n\t\ttree(Tree),\n\t\tresults(Results)\n\t{\n\t}\n\n\telement& tree;\n\tresult_set& results;\n\tstring_t attribute_name;\n};\n\nstruct match_root_path\n{\n\tmatch_root_path(match_context& Context) :\n\t\tcontext(Context)\n\t{\n\t}\n\n\tvoid operator()(const char&) const\n\t{\n\t\tcontext.results.clear();\n\t}\n\n\tmatch_context& context;\n};\n\nstruct match_absolute_path\n{\n\tmatch_absolute_path(match_context& Context) :\n\t\tcontext(Context)\n\t{\n\t}\n\n\tvoid operator()(const char* Begin, const char* End) const\n\t{\n\t\tconst string_t name(Begin, End);\n\t\tif(name != context.tree.name)\n\t\t\tcontext.results.clear();\n\t}\n\n\tmatch_context& context;\n};\n\nstruct match_child\n{\n\tmatch_child(match_context& Context) :\n\t\tcontext(Context)\n\t{\n\t}\n\n\tvoid operator()(const char* Begin, const char* End) const\n\t{\n\t\tconst string_t name(Begin, End);\n\n\t\tresult_set new_results;\n\t\tfor(result_set::const_iterator anchor = context.results.begin(); anchor != context.results.end(); ++anchor)\n\t\t{\n\t\t\tfor(element::elements_t::iterator child = (*anchor)->children.begin(); child != (*anchor)->children.end(); ++child)\n\t\t\t{\n\t\t\t\tif(child->name == name)\n\t\t\t\t\tnew_results.push_back(&*child);\n\t\t\t}\n\t\t}\n\t\tcontext.results = new_results;\n\t}\n\n\tmatch_context& context;\n};\n\nstruct match_wildcard\n{\n\tmatch_wildcard(match_context& Context) :\n\t\tcontext(Context)\n\t{\n\t}\n\n\tvoid operator()(const char*, const char*) const\n\t{\n\t\tresult_set new_results;\n\t\tfor(result_set::const_iterator anchor = context.results.begin(); anchor != context.results.end(); ++anchor)\n\t\t{\n\t\t\tfor(element::elements_t::iterator child = (*anchor)->children.begin(); child != (*anchor)->children.end(); ++child)\n\t\t\t{\n\t\t\t\tnew_results.push_back(&*child);\n\t\t\t}\n\t\t}\n\t\tcontext.results = new_results;\n\t}\n\n\tmatch_context& context;\n};\n\nstruct match_attribute_name\n{\n\tmatch_attribute_name(match_context& Context) :\n\t\tcontext(Context)\n\t{\n\t}\n\n\tvoid operator()(const char* Begin, const char* End) const\n\t{\n\t\tcontext.attribute_name = string_t(Begin, End);\n\n\t\tresult_set new_results;\n\t\tfor(result_set::const_iterator anchor = context.results.begin(); anchor != context.results.end(); ++anchor)\n\t\t{\n\t\t\tif(find_attribute(**anchor, context.attribute_name))\n\t\t\t\tnew_results.push_back(*anchor);\n\t\t}\n\t\tcontext.results = new_results;\n\t}\n\n\tmatch_context& context;\n};\n\nstruct match_attribute_value\n{\n\tmatch_attribute_value(match_context& Context) :\n\t\tcontext(Context)\n\t{\n\t}\n\n\tvoid operator()(const char* Begin, const char* End) const\n\t{\n\t\tconst string_t attribute_value = string_t(Begin, End);\n\n\t\tresult_set new_results;\n\t\tfor(result_set::const_iterator anchor = context.results.begin(); anchor != context.results.end(); ++anchor)\n\t\t{\n\t\t\tif(attribute_text(**anchor, context.attribute_name) == attribute_value)\n\t\t\t\tnew_results.push_back(*anchor);\n\t\t}\n\t\tcontext.results = new_results;\n\t}\n\n\tmatch_context& context;\n};\n\nclass grammar :\n\tpublic boost::spirit::classic::grammar<grammar>\n{\npublic:\n\tgrammar(match_context& Context) :\n\t\tcontext(Context)\n\t{\n\t\tcontext.results.assign(1, &context.tree);\n\t}\n\n\ttemplate<typename ScannerT>\n\tstruct definition\n\t{\n\t\tdefinition(const grammar& self)\n\t\t{\n\t\t\tname = chset_p(\"_a-zA-Z\") >> *chset_p(\"_a-zA-Z0-9\");\n\t\t\twildcard = ch_p('*');\n\t\t\tnode_test = name[match_child(self.context)] | wildcard[match_wildcard(self.context)];\n\t\t\tattribute_test = '@' >> name[match_attribute_name(self.context)];\n\t\t\tattribute_value_test = '@' >> name[match_attribute_name(self.context)] >> ch_p('=') >> confix_p(ch_p('\\''), (*anychar_p)[match_attribute_value(self.context)], ch_p('\\''));\n\t\t\tpredicate_expression = attribute_value_test | attribute_test;\n\t\t\tpredicate = '[' >> predicate_expression >> ']';\n\t\t\tpredicate_list = *predicate;\n\t\t\tstep = node_test >> !predicate_list;\n\t\t\troot_path = ch_p('/')[match_root_path(self.context)];\n\t\t\tabsolute_path = ch_p('/') >> name[match_absolute_path(self.context)] >> *('/' >> step);\n\t\t\trelative_path = step >> *('/' >> step);\n\t\t\texpression = relative_path | absolute_path | root_path;\n\t\t}\n\n\t\trule<ScannerT> const& start() const\n\t\t{\n\t\t\treturn expression;\n\t\t}\n\n\t\trule<ScannerT> name, wildcard, node_test, attribute_test, attribute_value_test, predicate_expression, predicate, predicate_list, step, root_path, absolute_path, relative_path, expression;\n\t};\n\nprivate:\n\tmatch_context& context;\n};\n\nresult_set match(element& Tree, const string_t& Expression)\n{\n\t// Special-case: an empty expression matches nothing\n\tif(Expression.empty())\n\t\treturn result_set();\n\n\tresult_set results;\n\tmatch_context context(Tree, results);\n\tif(!parse(Expression.c_str(), grammar(context), space_p).full)\n\t{\n\t\tk3d::log() << error << \"Not a valid XPath expression: \" << Expression << std::endl;\n\t\treturn result_set();\n\t}\n\treturn results;\n}\n\n} // namespace xpath\n\n} // namespace xml\n\n} // namespace k3d\n\nstd::ostream& operator<<(std::ostream& Stream, const k3d::xml::xpath::result_set& RHS)\n{\n\tfor(k3d::xml::xpath::result_set::const_iterator result = RHS.begin(); result != RHS.end(); ++result)\n\t\tStream << **result << \"\\n\";\n\n\treturn Stream;\n}\n\n"
  },
  {
    "path": "k3dsdk/xpath.h",
    "content": "#ifndef K3DSDK_XPATH_H\n#define K3DSDK_XPATH_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/types.h>\n#include <vector>\n\nnamespace k3d\n{\n\nnamespace xml\n{\n\nclass element;\n\n/// Defines functionality for working with k3d::xml data using the XPath standard\nnamespace xpath\n{\n\n/// Defines storage for an XPath result-set\ntypedef std::vector<element*> result_set;\n\n/// Searchs an XML tree using an XPath expression, returning any elements that match\nresult_set match(element& Tree, const string_t& Expression);\n\n} // namespace xpath\n\n} // namespace xml\n\n} // namespace k3d\n\n/// Serializes an XPath result-set to a stream\nstd::ostream& operator<<(std::ostream& Stream, const k3d::xml::xpath::result_set& RHS);\n\n#endif // !K3DSDK_XPATH_H\n\n"
  },
  {
    "path": "make-module-proxy/CMakeLists.txt",
    "content": "PROJECT(k3d-make-module-proxy)\n\nINCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GLIBMM_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_SIGC_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${K3D_GLIBMM_LIB_DIRS})\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nADD_EXECUTABLE(k3d-make-module-proxy\n  main.cpp\n  )\n\nSET_TARGET_PROPERTIES(k3d-make-module-proxy PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY ${K3D_RUNTIME_OUTPUT_DIRECTORY}\n  )\n\nTARGET_LINK_LIBRARIES(k3d-make-module-proxy\n  k3dsdk\n  )\n\n"
  },
  {
    "path": "make-module-proxy/main.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-version-config.h>\n\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/iapplication_plugin_factory.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/plugin_factory_collection.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/xml.h>\n\n#include <iostream>\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// plugin_message_handler\n\nvoid plugin_message_handler(const std::string& Message)\n{\n\tstd::cerr << Message << std::endl;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n// usage\n\n/// Prints usage info\nvoid usage(std::ostream& Stream)\n{\n\tStream << \"usage: k3d-make-module-proxy [Module] [OutputFile]\" << std::endl;\n\tStream << std::endl;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n// main\n\nint main(int argc, char* argv[])\n{\n\tif(argc != 3)\n\t{\n\t\tusage(std::cerr);\n\t\treturn 1;\n\t}\n\n\tconst k3d::filesystem::path module_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(argv[1]));\n\tconst k3d::filesystem::path output_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(argv[2]));\n\n\tk3d::plugin_factory_collection plugins;\n\tplugins.connect_message_signal(sigc::ptr_fun(plugin_message_handler));\n\tplugins.load_module(module_path, k3d::plugin_factory_collection::IGNORE_PROXIES);\n\n\tconst k3d::iplugin_factory_collection::factories_t factories = plugins.factories();\n\tif(factories.empty())\n\t\treturn 0;\n\n\tk3d::xml::element xml_proxy(\"k3dml\",\n\t\tk3d::xml::attribute(\"package\", K3D_PACKAGE),\n\t\tk3d::xml::attribute(\"version\", K3D_VERSION),\n\t\tk3d::xml::attribute(\"host\", K3D_HOST));\n\n\tk3d::xml::element& xml_module = xml_proxy.append(\n\t\tk3d::xml::element(\"module\",\n\t\t\tk3d::xml::attribute(\"name\", module_path.leaf().raw())));\n\n\tk3d::xml::element& xml_plugins = xml_module.append(k3d::xml::element(\"plugins\"));\n\n\tfor(k3d::iplugin_factory_collection::factories_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t{\n\t\tk3d::xml::element& xml_plugin = xml_plugins.append(\n\t\t\tk3d::xml::element(\"plugin\",\n\t\t\t\tk3d::xml::attribute(\"name\", (*factory)->name()),\n\t\t\t\tk3d::xml::attribute(\"factory_id\", (*factory)->factory_id()),\n\t\t\t\tk3d::xml::attribute(\"quality\", (*factory)->quality())));\n\n\t\tif(dynamic_cast<k3d::iapplication_plugin_factory*>(*factory))\n\t\t{\n\t\t\txml_plugin.append(k3d::xml::attribute(\"type\", \"application\"));\n\t\t}\n\t\telse if(dynamic_cast<k3d::idocument_plugin_factory*>(*factory))\n\t\t{\n\t\t\txml_plugin.append(k3d::xml::attribute(\"type\", \"document\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstd::cerr << \"Unknown factory type for plugin [\" << (*factory)->name() << \"] - proxy cannot be created\" << std::endl;\n\t\t\treturn 1;\n\t\t}\n\n\t\txml_plugin.append(k3d::xml::element(\"short_description\", (*factory)->short_description()));\n\n\t\tk3d::xml::element& xml_categories = xml_plugin.append(k3d::xml::element(\"categories\"));\n\t\tfor(k3d::iplugin_factory::categories_t::const_iterator category = (*factory)->categories().begin(); category != (*factory)->categories().end(); ++category)\n\t\t\txml_categories.append(k3d::xml::element(\"category\", *category));\n\n\t\tk3d::xml::element& xml_interfaces = xml_plugin.append(k3d::xml::element(\"interfaces\"));\n\t\tconst k3d::iplugin_factory::interfaces_t interfaces = (*factory)->interfaces();\n\t\tfor(k3d::iplugin_factory::interfaces_t::const_iterator interface = interfaces.begin(); interface != interfaces.end(); ++interface)\n\t\t{\n\t\t\tconst std::string xml_interface = k3d::type_string(**interface);\n\t\t\tif(xml_interface.empty())\n\t\t\t{\n\t\t\t\tstd::cerr << \"Interface type [\" << k3d::demangle(**interface) << \"] has not been registered, proxy cannot be created.\" << std::endl;\n\t\t\t\tstd::cerr << \"Normally, this means you're exposing an interface that isn't part of the SDK.\" << std::endl;\n\t\t\t\tstd::cerr << \"Either merge your interface into the SDK (and add it to the type registry),\" << std::endl;\n\t\t\t\tstd::cerr << \"or skip trying to create a module proxy altogether.\" << std::endl;\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\txml_interfaces.append(k3d::xml::element(\"interface\", k3d::type_string(**interface)));\n\t\t}\n\n\t\tk3d::xml::element& xml_metadata = xml_plugin.append(k3d::xml::element(\"metadata\"));\n\t\tconst k3d::iplugin_factory::metadata_t& metadata = (*factory)->metadata();\n\t\tfor(k3d::iplugin_factory::metadata_t::const_iterator pair = metadata.begin(); pair != metadata.end(); ++pair)\n\t\t\txml_metadata.append(k3d::xml::element(\"pair\", k3d::xml::attribute(\"name\", pair->first), k3d::xml::attribute(\"value\", pair->second)));\n\t}\n\n\tk3d::filesystem::ofstream output(output_path);\n\toutput << k3d::xml::declaration() << xml_proxy;\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "man/k3d.1.in",
    "content": ".TH k3d 1 \"June 2010\" \"K-3D Version @K3D_VERSION@\"\n.SH NAME\nk3d \\- 3D modeling and animation system\n\n.SH SYNOPSIS\n.B k3d\n[options]\n\n.SH DESCRIPTION\nK-3D is a free (as in freedom) 3D modeling, animation, and rendering system \nfor GNU/Linux and Win32. K-3D features a robust, object-oriented plugin \narchitecture and is capable of producing motion-picture-quality output when\npaired with a RenderMan Interface compliant render engine such as Aqsis.\n.PP\n.RI \"Please visit \" \"http://www.k-3d.org\" \" for more information.\"\n\n.SH OPTIONS\n\n.B --add-path\n[path]\n.RS\nPrepends a filesystem path to the PATH environment variable.\n.RE\n\n.B --color\n.RS\nColor-codes log messages based on their priority.  Requires an ANSI color-capable terminal.\n.RE\n\n.B --disable-gl-extension\n[extension]\n.RS\nDisables the given OpenGL extension.\n.RE\n\n.B --exit\n.RS\nExits the program (useful after running scripts in batch mode).\n.RE\n\n.B -h, --help\n.RS\nPrints this help information and exits.\n.RE\n\n.B --log-level\n[level]\n.RS\nSpecifies the minimum message priority to log (valid values are \"warning\", \"information\", or \"debug\").\n.RE\n\n.B --options\n[path]\n.RS\nOverrides the filepath for storing user options (this overrides both defaults and the K3D_OPTIONS_PATH environment variable, below).\n.RE\n\n.B --plugins\n[path]\n.RS\nOverrides the path(s) for loading plugin libraries (this overrides both defaults and the K3D_PLUGIN_PATHS environment variable, below).\nMultiple colon-delimited paths are allowed.  Use \"&\" as a synonym for the default paths.\n.RE\n\n.B --script \n[file]\n.RS\nPlay the given script after startup (use - for stdin).\n.RE\n\n.B --shadercache\n[path]\n.RS\nOverrides the path where compiled shaders will be cached (this overrides both defaults and the K3D_SHADER_CACHE_PATH environment variable, below).\n.RE\n\n.B --share\n[path]\n.RS\nOverrides the path for loading shared data files (this overrides both defaults and the K3D_SHARE_PATH environment variable, below).\n.RE\n\n.B --show-process\n.RS\nPrints the process name next to log messages.\n.RE\n\n.B --show-timestamps\n.RS\nPrints timestamps next to log messages.\n.RE\n\n.B --syslog\n.RS\nLogs messages to syslog.\n.RE\n\n.B -u, --ui\n[ui path]\n.RS\nSpecifies the path to a user interface plugin (this overrides both the default and the K3D_USER_INTERFACE_PATH environment variable, below).\nAs a special-case the string \"none\" can be used as a synonym for the Null (no gui) User Interface.\n.RE\n\n.B -H, --user-interface-help\n.RS\nPrints a user-interface specific help message and exits.\n.RE\n\n.B --version\n.RS\nPrints program version information and exits.\n.RE\n\n.SH USER INTERFACE OPTIONS\n.B --batch\n.RS\nOperate in batch (no user intervention) mode.\n.RE\n\n.B -n, --new\n.RS\nCreates a new document after startup.\n.RE\n\n.B --no-custom-layouts\n.RS\nDisable custom user interface layouts (useful when playing-back recorded tutorials, which rely on the default layout).\n.RE\n\n.B --no-splash\n.RS\nDisables the startup splash screen.\n.RE\n\n.B -o, --open \n[file]\n.RS\nOpens the given file after startup.\n.RE\n\n.B --show-tutorials\n.RS\nOpens the tutorials menu immediately following startup.\n.RE\n\n.B --tutorials\n[path]\n.RS\nOverrides the path for loading interactive tutorials (this overrides both defaults and the K3D_TUTORIALS_PATH environment variable, below).\n.RE\n\n.SH ENVIRONMENT VARIABLES\n\n.B K3D_EXTRA_OPTIONS\n.RS\nProvides additional options that are appended to the command-line at startup.\nNote that unlike other K-3D environment variables, options specified via K3D_EXTRA_OPTIONS\nwill override options specified on the command line.\n.RE\n\n.B K3D_OPTIONS_PATH\n.RS\nOverrides the path for storing user options (this overrides the default, but can be overridden by the --options option, above).\n.RE\n\n.B K3D_PLUGIN_PATHS\n.RS\nOverrides the path(s) for loading plugin libraries (this overrides the default, but can be overridden by the --plugins option, above).\nMultiple colon-delimited paths are allowed.  Use \"&\" as a synonym for the default paths.\n.RE\n\n.B K3D_SHADER_CACHE_PATH\n.RS\nOverrides the path where compiled shaders are cached (this overrides the default, but can be overridden by the --shadercache option, above).\n.RE\n\n.B K3D_SHARE_PATH\n.RS\nOverrides the path for loading shared data files (this overrides the default, but can be overridden by the --share option, above).\n.RE\n\n.B K3D_USER_INTERFACE_PATH\n.RS\nOverrides the path to the user interface plugin (this overrides the default, but can be overridden by the --ui option, above).\n.RE\n\n.SH AUTHORS\nWritten by Timothy M. Shead <tshead@k-3d.com>, and many others.\n\n.SH REPORTING BUGS\nReport bugs to <k3d-development@lists.sourceforge.net>\n\n.SH COPYRIGHT\n@K3D_COPYRIGHT@\n.br\nThis software is licensed under the terms of the GNU General Public License; see the source for copying conditions.  \nThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n.SH SEE ALSO\nThe K\\-3D Home Page: http://www.k\\-3d.org\n\n"
  },
  {
    "path": "modules/3ds_io/3dschunknames.h",
    "content": "#ifndef MODULES_3DS_IO_3DSCHUNKNAMES_H\n#define MODULES_3DS_IO_3DSCHUNKNAMES_H\n\n\n\n\n// Source http://www.martinreddy.net/gfx/3d/3DS.spec\n\n//>------ Primary chunk\n\n #define MAIN3DS       0x4D4D\n\n //>------ Main Chunks\n\n #define EDIT3DS       0x3D3D  // this is the start of the editor config\n #define KEYF3DS       0xB000  // this is the start of the keyframer config\n\n //>------ sub defines of EDIT3DS\n\n #define EDIT_MATERIAL 0xAFFF\n #define EDIT_CONFIG1  0x0100\n #define EDIT_CONFIG2  0x3E3D\n #define EDIT_VIEW_P1  0x7012\n #define EDIT_VIEW_P2  0x7011\n #define EDIT_VIEW_P3  0x7020\n #define EDIT_VIEW1    0x7001\n #define EDIT_BACKGR   0x1200\n #define EDIT_AMBIENT  0x2100\n #define EDIT_OBJECT   0x4000\n\n #define EDIT_UNKNW01  0x1100\n #define EDIT_UNKNW02  0x1201\n #define EDIT_UNKNW03  0x1300\n #define EDIT_UNKNW04  0x1400\n #define EDIT_UNKNW05  0x1420\n #define EDIT_UNKNW06  0x1450\n #define EDIT_UNKNW07  0x1500\n #define EDIT_UNKNW08  0x2200\n #define EDIT_UNKNW09  0x2201\n #define EDIT_UNKNW10  0x2210\n #define EDIT_UNKNW11  0x2300\n #define EDIT_UNKNW12  0x2302 \n #define EDIT_UNKNW13  0x3000\n #define EDIT_UNKNW14  0xAFFF\n\n //>------ sub defines of EDIT_OBJECT\n #define OBJ_TRIMESH   0x4100\n #define OBJ_LIGHT     0x4600\n #define OBJ_CAMERA    0x4700\n\n #define OBJ_UNKNWN01  0x4010\n #define OBJ_UNKNWN02  0x4012 //>>---- Could be shadow\n\n //>------ sub defines of OBJ_CAMERA\n #define CAM_UNKNWN01  0x4710 \n #define CAM_UNKNWN02  0x4720 \n\n //>------ sub defines of OBJ_LIGHT\n #define LIT_OFF       0x4620\n #define LIT_SPOT      0x4610\n #define LIT_UNKNWN01  0x465A\n\n //>------ sub defines of OBJ_TRIMESH\n #define TRI_VERTEXL   0x4110\n #define TRI_FACEL2    0x4111 \n #define TRI_FACEL1    0x4120\n #define TRI_TEXCOORD  0x4140\t// DAS 11-26-04\n #define TRI_SMOOTH    0x4150\n #define TRI_LOCAL     0x4160\n #define TRI_VISIBLE   0x4165\n\n\n //>>------ sub defs of KEYF3DS\n\n #define KEYF_UNKNWN01 0xB009\n #define KEYF_UNKNWN02 0xB00A\n #define KEYF_FRAMES   0xB008\n #define KEYF_OBJDES   0xB002\n\n //>>------  these define the different color chunk types\n #define COL_RGB  0x0010\n #define COL_TRU  0x0011\n #define COL_UNK  0x0013\n\n //>>------ defines for viewport chunks\n\n #define TOP           0x0001\n #define BOTTOM        0x0002\n #define LEFT          0x0003\n #define RIGHT         0x0004\n #define FRONT         0x0005\n #define BACK          0x0006\n #define USER          0x0007\n #define CAMERA        0x0008 // 0xFFFF is the actual code read from file\n #define LIGHT         0x0009\n #define DISABLED      0x0010\n #define BOGUS         0x0011\n\n#endif // !MODULES_3DS_IO_3DSCHUNKNAMES_H\n"
  },
  {
    "path": "modules/3ds_io/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_3DS_INCLUDE_DIRS})\n\nK3D_BUILD_MODULE(k3d-3ds-io)\nK3D_CREATE_MODULE_PROXY(k3d-3ds-io)\n\nTARGET_LINK_LIBRARIES(k3d-3ds-io ${K3D_3DS_LIBS})"
  },
  {
    "path": "modules/3ds_io/integration.cpp",
    "content": "#include \"integration.h\"\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <lib3ds/file.h>\n#include <lib3ds/camera.h>\n#include <lib3ds/mesh.h>\n#include <lib3ds/node.h>\n#include <lib3ds/material.h>\n#include <lib3ds/matrix.h>\n#include <lib3ds/vector.h>\n#include <lib3ds/light.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace f3ds\n{\n\nnamespace io\n{\n\nstatic void add_nodes(k3d::mesh& Mesh, Lib3dsFile* file, Lib3dsNode* node, k3d::uint_t &offset, k3d::imaterial* const Material, k3d::polyhedron::primitive& polyhedron)\n{\n\tif(node->type == LIB3DS_OBJECT_NODE)\n\t{\n\t\tfor(Lib3dsNode* p = node->childs; p != 0; p = p->next)\n\t\t\tadd_nodes(Mesh, file, p, offset, Material, polyhedron);\n\n\t\tif(strcmp(node->name,\"$$$DUMMY\") == 0)\n\t\t\treturn;\n\t\t\n\t\tLib3dsMesh* mesh = lib3ds_file_mesh_by_name(file, node->data.object.morph);\n\t\tif(!mesh)\n\t\t\tmesh = lib3ds_file_mesh_by_name(file, node->name);\n\n\t\tif(!mesh)\n\t\t\treturn;\n\n\t\tfor(int p = 0; p < mesh->faces; ++p)\n\t\t{\n\t\t\tLib3dsFace* const f = &mesh->faceL[p];\n\n\t\t\tpolyhedron.face_shells.push_back(0);\n\t\t\tpolyhedron.face_first_loops.push_back(polyhedron.loop_first_edges.size());\n\t\t\tpolyhedron.face_loop_counts.push_back(1);\n\t\t\tpolyhedron.face_selections.push_back(0);\n\t\t\tpolyhedron.face_materials.push_back(Material);\n\t\t\tpolyhedron.loop_first_edges.push_back(polyhedron.clockwise_edges.size());\n\n\t\t\tfor(int j = 0; j != 3; ++j)\n\t\t\t{\n\t\t\t\tpolyhedron.clockwise_edges.push_back(polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tpolyhedron.edge_selections.push_back(0);\n\t\t\t\tpolyhedron.vertex_points.push_back(f->points[j] + offset);\n\t\t\t\tpolyhedron.vertex_selections.push_back(0);\n\t\t\t}\n\t\t\tpolyhedron.clockwise_edges.back() = polyhedron.loop_first_edges.back();\n\t\t}\n\n\t\tk3d::mesh::points_t& points = Mesh.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Mesh.point_selection.writable();\n\t\tfor(int i = 0; i < mesh->points; ++i)\n\t\t{\n\t\t\tpoints.push_back(k3d::point3(mesh->pointL[i].pos[0], mesh->pointL[i].pos[1], mesh->pointL[i].pos[2]));\n\t\t\tpoint_selection.push_back(0);\n\t\t}\n\n\t\toffset += mesh->points;\n\t}\n}\n\nf3dsParser::f3dsParser(const char* filename, k3d::imaterial* const Material, k3d::mesh& Mesh)\n{\n\tLib3dsFile* const file = lib3ds_file_load(filename);\n\tif(!file) \n\t{\n\t\tk3d::log() << error << \"Not a 3DS file: \" << filename << std::endl;\n\t\treturn;\n\t}\n\n\tMesh.points.create();\n\tMesh.point_selection.create();\n\n\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Mesh));\n\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t/* No nodes?  Fabricate nodes to display all the meshes. */\n\tif(!file->nodes)\n\t{\n\t\tk3d::log() << warning << \"3DS file doesn't contain any nodes, creating virtual nodes instead.\" << std::endl;\n\t\n\t\tfor(Lib3dsMesh* mesh = file->meshes; mesh; mesh = mesh->next)\n\t\t{\n\t\t\tLib3dsNode* const node = lib3ds_node_new_object();\n\t\t\tstrcpy(node->name, mesh->name);\n\t\t\tnode->parent_id = LIB3DS_NO_PARENT;\n\t\t\tlib3ds_file_insert_node(file, node);\n\t\t}\n\t}\n\n\tk3d::uint_t offset = 0;\n\tfor(Lib3dsNode* p = file->nodes; p; p = p->next)\n\t\tadd_nodes(Mesh, file, p, offset, Material, *polyhedron);\n}\n\n} // namespace io\n\n} // namespace f3ds\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/3ds_io/integration.h",
    "content": "#ifndef MODULES_3DS_IO_INTEGRATION_H\n#define MODULES_3DS_IO_INTEGRATION_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n*/\n\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/mesh.h>\n\nnamespace module\n{\n\nnamespace f3ds\n{\n\nnamespace io\n{\n\nclass f3dsParser\n{\npublic:\n\tf3dsParser(const char *filename, k3d::imaterial* const Material, k3d::mesh& Mesh);\n};\n\n} // namespace io\n\n} // namespace f3ds\n\n} // namespace module\n\n#endif // !MODULES_3DS_IO_INTEGRATION_H\n\n"
  },
  {
    "path": "modules/3ds_io/mesh_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n*/\n\n#include \"integration.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_reader.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace f3ds\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_reader\n\nclass mesh_reader :\n\tpublic k3d::material_sink<k3d::mesh_reader<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_reader<k3d::node > > base;\n\npublic:\n\tmesh_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n    base(Factory, Document)\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reload_mesh_slot()));\n\t}\n\n\tvoid on_load_mesh(const k3d::filesystem::path& Path, k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tf3dsParser f3ds_file(Path.native_console_string().c_str(), material, Output);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_reader,k3d::interface_list<k3d::imesh_source,k3d::interface_list<k3d::imesh_storage> > > factory(\n\t\t\tk3d::uuid(0xf8bbd8fb, 0x7d47911e, 0xbf64f3a3, 0x25652955),\n\t\t\t\"3DSMeshReader\",\n\t\t\t_(\"Mesh reader that loads external 3ds (.3ds) files into the document by reference\"),\n\t\t\t\"MeshReader\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& mesh_reader_factory()\n{\n\treturn mesh_reader::get_factory();\n}\n\n} // namespace io\n\n} // namespace f3ds\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/3ds_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace f3ds\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& mesh_reader_factory();\n//extern k3d::iplugin_factory& mesh_writer_factory();\n//extern k3d::iplugin_factory& document_importer_factory();\n//extern k3d::iplugin_factory& document_exporter_factory();\n\n} // namespace io\n\n} // namespace f3ds\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\t//Registry.register_factory(module::f3ds::io::document_importer_factory());\n\t//Registry.register_factory(module::f3ds::io::document_exporter_factory());\n\tRegistry.register_factory(module::f3ds::io::mesh_reader_factory());\n\t//Registry.register_factory(module::f3ds::io::mesh_writer_factory());\nK3D_MODULE_END\n"
  },
  {
    "path": "modules/CMakeLists.txt",
    "content": "SET(K3D_PLUGINS \"\" CACHE INTERNAL \"\" FORCE)\n\nINCLUDE(K3DParseArguments)\n\nMACRO(K3D_BUILD_MODULE MODULE_NAME)\n\tK3D_PARSE_ARGUMENTS(MODULE \"EXTRA_SOURCES;EXCLUDE_SOURCES\" \"\" ${ARGN})\n\n\tSET(K3D_PLUGINS ${K3D_PLUGINS} ${MODULE_NAME} CACHE INTERNAL \"\" FORCE)\n\n\tFILE(GLOB ABSOLUTE_HEADERS *.h)\n\tFILE(GLOB ABSOLUTE_SOURCES *.cpp)\n\n\tLIST(SORT ABSOLUTE_HEADERS)\n\tLIST(SORT ABSOLUTE_SOURCES)\n\n\tFOREACH(ABSOLUTE_HEADER ${ABSOLUTE_HEADERS})\n\t\tGET_FILENAME_COMPONENT(HEADER ${ABSOLUTE_HEADER} NAME)\n\t\tLIST(APPEND HEADERS ${HEADER})\n\tENDFOREACH()\n\n\tFOREACH(ABSOLUTE_SOURCE ${ABSOLUTE_SOURCES})\n\t\tGET_FILENAME_COMPONENT(SOURCE ${ABSOLUTE_SOURCE} NAME)\n\t\tLIST(APPEND SOURCES ${SOURCE})\n\tENDFOREACH()\n\n\tLIST(LENGTH HEADERS HEADER_COUNT)\n\tLIST(LENGTH SOURCES SOURCE_COUNT)\n\n\tIF(HEADER_COUNT GREATER 0)\n\t\tFOREACH(MODULE_EXCLUDE_SOURCE ${MODULE_EXCLUDE_SOURCES})\n\t\t\tLIST(REMOVE_ITEM HEADERS ${MODULE_EXCLUDE_SOURCE})\n\t\tENDFOREACH()\n\tENDIF()\n\n\tIF(SOURCE_COUNT GREATER 0)\n\t\tFOREACH(MODULE_EXCLUDE_SOURCE ${MODULE_EXCLUDE_SOURCES})\n\t\t\tLIST(REMOVE_ITEM SOURCES ${MODULE_EXCLUDE_SOURCE})\n\t\tENDFOREACH()\n\tENDIF()\n\n\tINCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\n\tINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\n\tINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\n\tINCLUDE_DIRECTORIES(${K3D_GLIBMM_INCLUDE_DIRS})\n\tINCLUDE_DIRECTORIES(${K3D_SIGC_INCLUDE_DIRS})\n\tINCLUDE_DIRECTORIES(${K3D_OPENGL_INCLUDE_DIR})\n\n\tIF(K3D_ENABLE_NLS)\n\t\tINCLUDE_DIRECTORIES(${K3D_INTL_INCLUDE_DIRS})\n\tENDIF(K3D_ENABLE_NLS)\n\n\tIF(K3D_ENABLE_PARALLEL)\n\t\tINCLUDE_DIRECTORIES(${K3D_TBB_INCLUDE_DIR})\n\tENDIF(K3D_ENABLE_PARALLEL)\n\n\tIF(K3D_ENABLE_PROFILING)\n\t\tINCLUDE_DIRECTORIES(${K3D_GPERFTOOLS_INCLUDE_DIR})\n\tENDIF(K3D_ENABLE_PROFILING)\n\n\tLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\n\tADD_LIBRARY(${MODULE_NAME} MODULE ${HEADERS} ${SOURCES} ${MODULE_EXTRA_SOURCES})\n\tSET_TARGET_PROPERTIES(${MODULE_NAME} PROPERTIES\n\t\tLIBRARY_OUTPUT_DIRECTORY ${K3D_MODULE_OUTPUT_DIRECTORY}\n\t\tPREFIX \"\"\n\t\tSUFFIX \".module\"\n\t\t)\n\n\tTARGET_LINK_LIBRARIES(${MODULE_NAME} k3dsdk)\n\n\tIF(K3D_ENABLE_NLS)\n\t\tTARGET_LINK_LIBRARIES(${MODULE_NAME} ${K3D_INTL_LIBS})\n\tENDIF(K3D_ENABLE_NLS)\n\n\tIF(K3D_ENABLE_PROFILING)\n\t\tTARGET_LINK_LIBRARIES(${MODULE_NAME} ${K3D_PROFILER_LIBRARY})\n\tENDIF(K3D_ENABLE_PROFILING)\n\n\tINSTALL(TARGETS ${MODULE_NAME}\n\t\tRUNTIME DESTINATION ${K3D_LIBDIR}/k3d/plugins\n\t\tLIBRARY DESTINATION ${K3D_LIBDIR}/k3d/plugins)\nENDMACRO(K3D_BUILD_MODULE)\n\nMACRO(K3D_BUILD_NGUI_MODULE MODULE_NAME)\n\tINCLUDE_DIRECTORIES(${K3D_CAIROMM_INCLUDE_DIRS})\n\tINCLUDE_DIRECTORIES(${K3D_GTKMM_INCLUDE_DIRS})\n\tINCLUDE_DIRECTORIES(${K3D_GTKGLEXT_INCLUDE_DIRS})\n\n\tLINK_DIRECTORIES(${K3D_GTKGLEXT_LIB_DIRS})\n\n\tK3D_BUILD_MODULE(${MODULE_NAME} ${ARGN})\n\n\tTARGET_LINK_LIBRARIES(${MODULE_NAME} k3dsdk-ngui)\n\tTARGET_LINK_LIBRARIES(${MODULE_NAME} ${K3D_CAIROMM_LIBS})\nENDMACRO(K3D_BUILD_NGUI_MODULE)\n\nMACRO(K3D_BUILD_QTUI_MODULE MODULE_NAME)\n\tADD_DEFINITIONS(-DQT_NO_KEYWORDS)\n\n\tINCLUDE_DIRECTORIES(${k3dsdk-qtui_BINARY_DIR})\n\tINCLUDE_DIRECTORIES(${QT_INCLUDES})\n\n\tK3D_BUILD_MODULE(${MODULE_NAME} ${ARGN})\n\tTARGET_LINK_LIBRARIES(${MODULE_NAME} k3dsdk-qtui)\nENDMACRO()\n\nMACRO(K3D_CREATE_MODULE_PROXY MODULE_NAME)\n\tGET_TARGET_PROPERTY(K3D_MAKE_MODULE_PROXY k3d-make-module-proxy LOCATION)\n\tGET_TARGET_PROPERTY(MODULE ${MODULE_NAME} LOCATION)\n\tADD_CUSTOM_COMMAND(\n\t\tOUTPUT ${MODULE}.proxy\n\t\tCOMMAND ${K3D_MAKE_MODULE_PROXY} ${MODULE} ${MODULE}.proxy\n\t\tDEPENDS k3d-make-module-proxy ${MODULE_NAME}\n\t\t)\n\tADD_CUSTOM_TARGET(${MODULE_NAME}-proxy ALL DEPENDS ${MODULE}.proxy)\n\tINSTALL(FILES ${MODULE}.proxy DESTINATION ${K3D_LIBDIR}/k3d/plugins)\nENDMACRO(K3D_CREATE_MODULE_PROXY)\n\nK3D_ADD_SUBDIRECTORY(3ds_io REQUIRES K3D_BUILD_3DS_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(advanced_opengl_painters REQUIRES K3D_BUILD_ADVANCED_OPENGL_PAINTERS_MODULE)\nK3D_ADD_SUBDIRECTORY(animation REQUIRES K3D_BUILD_ANIMATION_MODULE)\nK3D_ADD_SUBDIRECTORY(annotation REQUIRES K3D_BUILD_ANNOTATION_MODULE)\nK3D_ADD_SUBDIRECTORY(aqsis REQUIRES K3D_BUILD_AQSIS_MODULE)\nK3D_ADD_SUBDIRECTORY(array REQUIRES K3D_BUILD_ARRAY_MODULE)\nK3D_ADD_SUBDIRECTORY(bicubic_patch REQUIRES K3D_BUILD_BICUBIC_PATCH_MODULE)\nK3D_ADD_SUBDIRECTORY(bilinear_patch REQUIRES K3D_BUILD_BILINEAR_PATCH_MODULE)\nK3D_ADD_SUBDIRECTORY(bitmap REQUIRES K3D_BUILD_BITMAP_MODULE)\nK3D_ADD_SUBDIRECTORY(blobby REQUIRES K3D_BUILD_BLOBBY_MODULE)\nK3D_ADD_SUBDIRECTORY(bundled_renderman_engines REQUIRES K3D_BUILD_BUNDLED_RENDERMAN_ENGINES_MODULE)\nK3D_ADD_SUBDIRECTORY(carve REQUIRES K3D_BUILD_CARVE_MODULE)\nK3D_ADD_SUBDIRECTORY(cgal REQUIRES K3D_BUILD_CGAL_MODULE)\nK3D_ADD_SUBDIRECTORY(cloth REQUIRES K3D_BUILD_CLOTH_MODULE)\nK3D_ADD_SUBDIRECTORY(collada_io REQUIRES K3D_BUILD_COLLADA_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(compiz REQUIRES K3D_BUILD_COMPIZ_MODULE)\nK3D_ADD_SUBDIRECTORY(core REQUIRES K3D_BUILD_CORE_MODULE)\nK3D_ADD_SUBDIRECTORY(cuda REQUIRES K3D_BUILD_CUDA_MODULE)\nK3D_ADD_SUBDIRECTORY(deformation REQUIRES K3D_BUILD_DEFORMATION_MODULE)\nK3D_ADD_SUBDIRECTORY(development REQUIRES K3D_BUILD_DEVELOPMENT_MODULE)\nK3D_ADD_SUBDIRECTORY(double REQUIRES K3D_BUILD_DOUBLE_MODULE)\nK3D_ADD_SUBDIRECTORY(euler_operations REQUIRES K3D_BUILD_EULER_OPERATIONS_MODULE)\nK3D_ADD_SUBDIRECTORY(file_magic REQUIRES K3D_BUILD_FILE_MAGIC_MODULE)\nK3D_ADD_SUBDIRECTORY(freetype2 REQUIRES K3D_BUILD_FREETYPE2_MODULE)\nK3D_ADD_SUBDIRECTORY(gio REQUIRES K3D_BUILD_GIO_MODULE)\nK3D_ADD_SUBDIRECTORY(glx REQUIRES K3D_BUILD_GLX_MODULE)\nK3D_ADD_SUBDIRECTORY(gmsh_io REQUIRES K3D_BUILD_GMSH_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(gperftools REQUIRES K3D_BUILD_GPERFTOOLS_MODULE K3D_ENABLE_PROFILING)\nK3D_ADD_SUBDIRECTORY(graphviz REQUIRES K3D_BUILD_GRAPHVIZ_MODULE)\nK3D_ADD_SUBDIRECTORY(gts_io REQUIRES K3D_BUILD_GTS_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(gts REQUIRES K3D_BUILD_GTS_MODULE)\nK3D_ADD_SUBDIRECTORY(highlighting REQUIRES K3D_BUILD_HIGHLIGHTING_MODULE)\nK3D_ADD_SUBDIRECTORY(iges_io REQUIRES K3D_BUILD_IGES_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(imagemagick_io REQUIRES K3D_BUILD_IMAGEMAGICK_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(indigo REQUIRES K3D_BUILD_INDIGO_MODULE)\nK3D_ADD_SUBDIRECTORY(inotify REQUIRES K3D_BUILD_INOTIFY_MODULE)\nK3D_ADD_SUBDIRECTORY(jpeg_io REQUIRES K3D_BUILD_JPEG_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(k3d_io REQUIRES K3D_BUILD_K3D_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(linear_curve REQUIRES K3D_BUILD_LINEAR_CURVE_MODULE)\nK3D_ADD_SUBDIRECTORY(lipsync REQUIRES K3D_BUILD_LIPSYNC_MODULE)\nK3D_ADD_SUBDIRECTORY(lsystem REQUIRES K3D_BUILD_LSYSTEM_MODULE)\nK3D_ADD_SUBDIRECTORY(luxrender REQUIRES K3D_BUILD_LUXRENDER_MODULE)\nK3D_ADD_SUBDIRECTORY(matrix REQUIRES K3D_BUILD_MATRIX_MODULE)\nK3D_ADD_SUBDIRECTORY(md2_io REQUIRES K3D_BUILD_MD2_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(mesh_attributes REQUIRES K3D_BUILD_MESH_ATTRIBUTES_MODULE)\nK3D_ADD_SUBDIRECTORY(mesh_instance REQUIRES K3D_BUILD_MESH_INSTANCE_MODULE)\nK3D_ADD_SUBDIRECTORY(mesh REQUIRES K3D_BUILD_MESH_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_about REQUIRES K3D_BUILD_NGUI_ABOUT_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_animation_timeline_panel REQUIRES K3D_BUILD_NGUI_ANIMATION_TIMELINE_PANEL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_assign_hotkeys REQUIRES K3D_BUILD_NGUI_ASSIGN_HOTKEYS_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_atk_event_recorder REQUIRES K3D_BUILD_NGUI_ATK_EVENT_RECORDER_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_knot_vector_control REQUIRES K3D_BUILD_NGUI_KNOT_VECTOR_CONTROL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_learning REQUIRES K3D_BUILD_NGUI_LEARNING_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_log REQUIRES K3D_BUILD_NGUI_LOG_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_material_manager_panel REQUIRES K3D_BUILD_NGUI_MATERIAL_MANAGER_PANEL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_mesh_control REQUIRES K3D_BUILD_NGUI_MESH_CONTROL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui REQUIRES K3D_BUILD_NGUI_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_morph_points_page REQUIRES K3D_BUILD_NGUI_MORPH_POINTS_PAGE_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_node_list_panel REQUIRES K3D_BUILD_NGUI_NODE_LIST_PANEL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_node_properties_panel REQUIRES K3D_BUILD_NGUI_NODE_PROPERTIES_PANEL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_opengl_dialog REQUIRES K3D_BUILD_NGUI_OPENGL_DIALOG_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_parent_tool REQUIRES K3D_BUILD_NGUI_PARENT_TOOL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_pipeline_panel REQUIRES K3D_BUILD_NGUI_PIPELINE_PANEL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_pipeline_profiler_panel REQUIRES K3D_BUILD_NGUI_PIPELINE_PROFILER_PANEL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_python_shell REQUIRES K3D_BUILD_NGUI_PYTHON_SHELL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_rectangle_control REQUIRES K3D_BUILD_NGUI_RECTANGLE_CONTROL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_render_region_tool REQUIRES K3D_BUILD_NGUI_RENDER_REGION_TOOL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_selection_control REQUIRES K3D_BUILD_NGUI_SELECTION_CONTROL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_snap_tool REQUIRES K3D_BUILD_NGUI_SNAP_TOOL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_space_navigator REQUIRES K3D_BUILD_NGUI_SPACE_NAVIGATOR_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_text_editor REQUIRES K3D_BUILD_NGUI_TEXT_EDITOR_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_timeline_panel REQUIRES K3D_BUILD_NGUI_TIMELINE_PANEL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_toolbar_panel REQUIRES K3D_BUILD_NGUI_TOOLBAR_PANEL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_tool_properties_panel REQUIRES K3D_BUILD_NGUI_TOOL_PROPERTIES_PANEL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_undo_tree_panel REQUIRES K3D_BUILD_NGUI_UNDO_TREE_PANEL_MODULE)\nK3D_ADD_SUBDIRECTORY(ngui_uv_editor_panel REQUIRES K3D_BUILD_NGUI_UV_EDITOR_PANEL_MODULE)\nK3D_ADD_SUBDIRECTORY(nui REQUIRES K3D_BUILD_NUI_MODULE)\nK3D_ADD_SUBDIRECTORY(nurbs REQUIRES K3D_BUILD_NURBS_MODULE)\nK3D_ADD_SUBDIRECTORY(nurbs_sources REQUIRES K3D_BUILD_NURBS_SOURCES_MODULE)\nK3D_ADD_SUBDIRECTORY(obj_io REQUIRES K3D_BUILD_OBJ_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(ode REQUIRES K3D_BUILD_ODE_MODULE)\nK3D_ADD_SUBDIRECTORY(ogre_io REQUIRES K3D_BUILD_OGRE_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(openexr_io REQUIRES K3D_BUILD_OPENEXR_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(opengl REQUIRES K3D_BUILD_OPENGL_MODULE)\nK3D_ADD_SUBDIRECTORY(osmesa REQUIRES K3D_BUILD_OSMESA_MODULE)\nK3D_ADD_SUBDIRECTORY(osx REQUIRES K3D_BUILD_OSX_MODULE)\nK3D_ADD_SUBDIRECTORY(particle REQUIRES K3D_BUILD_PARTICLE_MODULE)\nK3D_ADD_SUBDIRECTORY(pdiff REQUIRES K3D_BUILD_PDIFF_MODULE)\nK3D_ADD_SUBDIRECTORY(pixie REQUIRES K3D_BUILD_PIXIE_MODULE)\nK3D_ADD_SUBDIRECTORY(plot REQUIRES K3D_BUILD_PLOT_MODULE)\nK3D_ADD_SUBDIRECTORY(ply_io REQUIRES K3D_BUILD_PLY_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(png_io REQUIRES K3D_BUILD_PNG_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(polyhedron REQUIRES K3D_BUILD_POLYHEDRON_MODULE)\nK3D_ADD_SUBDIRECTORY(polyhedron_sources REQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE)\nK3D_ADD_SUBDIRECTORY(python REQUIRES K3D_BUILD_PYTHON_MODULE)\nK3D_ADD_SUBDIRECTORY(pyui REQUIRES K3D_BUILD_PYUI_MODULE)\nK3D_ADD_SUBDIRECTORY(qslim REQUIRES K3D_BUILD_QSLIM_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_about_dialog REQUIRES K3D_BUILD_QTUI_ABOUT_DIALOG_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_aqsis_mode REQUIRES K3D_BUILD_QTUI_AQSIS_MODE_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_aqsis REQUIRES K3D_BUILD_QTUI_AQSIS_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_boolean REQUIRES K3D_BUILD_QTUI_BOOLEAN_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_color REQUIRES K3D_BUILD_QTUI_COLOR_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_default_mode REQUIRES K3D_BUILD_QTUI_DEFAULT_MODE_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_javascript_shell REQUIRES K3D_BUILD_QTUI_JAVASCRIPT_SHELL_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_log REQUIRES K3D_BUILD_QTUI_LOG_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_matrix REQUIRES K3D_BUILD_QTUI_MATRIX_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_move_mode REQUIRES K3D_BUILD_QTUI_MOVE_MODE_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui REQUIRES K3D_BUILD_QTUI_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_node_list REQUIRES K3D_BUILD_QTUI_NODE_LIST_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_node_properties REQUIRES K3D_BUILD_QTUI_NODE_PROPERTIES_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_opengl REQUIRES K3D_BUILD_QTUI_OPENGL_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_path REQUIRES K3D_BUILD_QTUI_PATH_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_programmable_mode REQUIRES K3D_BUILD_QTUI_PROGRAMMABLE_MODE_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_string REQUIRES K3D_BUILD_QTUI_STRING_MODULE)\nK3D_ADD_SUBDIRECTORY(qtui_text_editor REQUIRES K3D_BUILD_QTUI_TEXT_EDITOR_MODULE)\nK3D_ADD_SUBDIRECTORY(quadrics REQUIRES K3D_BUILD_QUADRICS_MODULE)\nK3D_ADD_SUBDIRECTORY(reference_opengl_painters REQUIRES K3D_BUILD_REFERENCE_OPENGL_PAINTERS_MODULE)\nK3D_ADD_SUBDIRECTORY(release REQUIRES K3D_BUILD_RELEASE_MODULE)\nK3D_ADD_SUBDIRECTORY(renderman_engines REQUIRES K3D_BUILD_RENDERMAN_ENGINES_MODULE)\nK3D_ADD_SUBDIRECTORY(renderman REQUIRES K3D_BUILD_RENDERMAN_MODULE)\nK3D_ADD_SUBDIRECTORY(renderman_painters REQUIRES K3D_BUILD_RENDERMAN_PAINTERS_MODULE)\nK3D_ADD_SUBDIRECTORY(scripted_plugins REQUIRES K3D_BUILD_SCRIPTED_PLUGINS_MODULE)\nK3D_ADD_SUBDIRECTORY(scripting REQUIRES K3D_BUILD_SCRIPTING_MODULE)\nK3D_ADD_SUBDIRECTORY(selection REQUIRES K3D_BUILD_SELECTION_MODULE)\nK3D_ADD_SUBDIRECTORY(solar REQUIRES K3D_BUILD_SOLAR_MODULE)\nK3D_ADD_SUBDIRECTORY(stl_io REQUIRES K3D_BUILD_STL_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(subdivision_surface REQUIRES K3D_BUILD_SUBDIVISION_SURFACE_MODULE)\nK3D_ADD_SUBDIRECTORY(svg_io REQUIRES K3D_BUILD_SVG_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(test REQUIRES K3D_BUILD_TEST_MODULE)\nK3D_ADD_SUBDIRECTORY(tiff_io REQUIRES K3D_BUILD_TIFF_IO_MODULE)\nK3D_ADD_SUBDIRECTORY(time REQUIRES K3D_BUILD_TIME_MODULE)\nK3D_ADD_SUBDIRECTORY(uniform_polyhedron REQUIRES K3D_BUILD_UNIFORM_POLYHEDRON_MODULE)\nK3D_ADD_SUBDIRECTORY(virtual_offscreen REQUIRES K3D_BUILD_VIRTUAL_OFFSCREEN_MODULE)\nK3D_ADD_SUBDIRECTORY(virtual_opengl_painters REQUIRES K3D_BUILD_VIRTUAL_OPENGL_PAINTERS_MODULE)\nK3D_ADD_SUBDIRECTORY(wgl REQUIRES K3D_BUILD_WGL_MODULE)\nK3D_ADD_SUBDIRECTORY(windows REQUIRES K3D_BUILD_WINDOWS_MODULE)\nK3D_ADD_SUBDIRECTORY(xtrackcad REQUIRES K3D_BUILD_XTRACKCAD_MODULE)\nK3D_ADD_SUBDIRECTORY(yafray REQUIRES K3D_BUILD_YAFRAY_MODULE)\n\nADD_SUBDIRECTORY(external)\n\n# Test for unwanted plugin binaries ...\nFILE(GLOB_RECURSE PLUGIN_BINARIES \"${K3D_MODULE_OUTPUT_DIRECTORY}/*\")\nLIST(SORT PLUGIN_BINARIES)\nFOREACH(PLUGIN_BINARY ${PLUGIN_BINARIES})\n\tGET_FILENAME_COMPONENT(RELATIVE_PLUGIN_BINARY ${PLUGIN_BINARY} NAME)\n\n\tSET(UNEXPECTED_FILE 1)\n\tFOREACH(K3D_PLUGIN ${K3D_PLUGINS})\n\t\tIF(RELATIVE_PLUGIN_BINARY MATCHES \"${K3D_PLUGIN}.module\")\n\t\t\tSET(UNEXPECTED_FILE 0)\n\t\t\tBREAK()\n\t\tELIF(RELATIVE_PLUGIN_BINARY MATCHES \"${K3D_PLUGIN}.module.proxy\")\n\t\t\tSET(UNEXPECTED_FILE 0)\n\t\t\tBREAK()\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(UNEXPECTED_FILE)\n\t\tMESSAGE(SEND_ERROR \"Unexpected file in plugin directory ... delete ${PLUGIN_BINARY} to eliminate this error.\")\n\tENDIF()\nENDFOREACH()\n"
  },
  {
    "path": "modules/advanced_opengl_painters/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-advanced-opengl-painters)\nK3D_CREATE_MODULE_PROXY(k3d-advanced-opengl-painters)\n\nTARGET_LINK_LIBRARIES(k3d-advanced-opengl-painters k3dsdk-subdivision-surface)\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/cached_triangulation.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"cached_triangulation.h\"\n\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nvoid cached_triangulation::on_execute(const k3d::mesh& Mesh, k3d::inode* Painter)\n{\n\tm_input_points = Mesh.points;\n\tif (m_points.empty())\n\t{\n\t\tm_progress = 0;\n\t\tm_point_links.resize(Mesh.points->size());\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(polyhedron.get() && !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t{\n\t\t\t\tm_points.resize(m_points.size() + polyhedron->edge_points.size());\n\t\t\t\tk3d::triangulator::process(Mesh, *polyhedron);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (m_affected_indices.empty())\n\t\t{\n\t\t\tfor (k3d::uint_t index = 0; index != m_point_links.size(); ++index)\n\t\t\t{\n\t\t\t\tk3d::mesh::indices_t& linked_points = m_point_links[index];\n\t\t\t\tfor (k3d::uint_t i = 0; i != linked_points.size(); ++i)\n\t\t\t\t{\n\t\t\t\t\tm_points[linked_points[i]] = m_input_points->at(index);\n\t\t\t\t} \n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (k3d::uint_t index = 0; index != m_affected_indices.size(); ++index)\n\t\t\t{\n\t\t\t\tk3d::mesh::indices_t& linked_points = m_point_links[m_affected_indices[index]];\n\t\t\t\tfor (k3d::uint_t i = 0; i != linked_points.size(); ++i)\n\t\t\t\t{\n\t\t\t\t\tm_points[linked_points[i]] = m_input_points->at(m_affected_indices[index]);\n\t\t\t\t} \n\t\t\t}\n\t\t}\n\t}\n\tm_affected_indices.clear();\n}\n\nvoid cached_triangulation::start_face(const k3d::uint_t Face)\n{\n\tm_point_map.clear();\n\tm_face_starts.push_back(m_indices.size());\n\tm_face_points.push_back(k3d::mesh::indices_t());\n}\n\nvoid cached_triangulation::add_vertex(const k3d::point3& Coordinates, k3d::uint_t Vertices[4], k3d::uint_t Edges[4], k3d::double_t Weights[4], k3d::uint_t& NewVertex)\n{\n\tNewVertex = m_points.size();\n\tk3d::log() << debug << \"added new vertex: \" << NewVertex << std::endl;\n\tm_point_map.insert(std::make_pair(m_points.size(), m_points.size()));\n\tm_face_points.back().push_back(m_points.size());\n\tm_points.push_back(Coordinates);\n}\n\nvoid cached_triangulation::add_triangle(k3d::uint_t Vertices[3], k3d::uint_t Edges[3])\n{\n\ttypedef std::pair<point_map_t::iterator, bool> result_t;\n\t// Create point copies for this face, if they don't exist already\n\tresult_t r1 = m_point_map.insert(std::make_pair(Vertices[0], m_progress));\n\tif (r1.second)\n\t{\n\t\tm_point_links[Vertices[0]].push_back(m_progress);\n\t\tm_face_points.back().push_back(m_progress);\n\t\tm_points[m_progress] = m_input_points->at(Vertices[0]);\n\t\t++m_progress;\n\t}\n\tresult_t r2 = m_point_map.insert(std::make_pair(Vertices[1], m_progress));\n\tif (r2.second)\n\t{\n\t\tm_point_links[Vertices[1]].push_back(m_progress);\n\t\tm_face_points.back().push_back(m_progress);\n\t\tm_points[m_progress] = m_input_points->at(Vertices[1]);\n\t\t++m_progress;\n\t}\n\tresult_t r3 = m_point_map.insert(std::make_pair(Vertices[2], m_progress));\n\tif (r3.second)\n\t{\n\t\tm_point_links[Vertices[2]].push_back(m_progress);\n\t\tm_face_points.back().push_back(m_progress);\n\t\tm_points[m_progress] = m_input_points->at(Vertices[2]);\n\t\t++m_progress;\n\t}\n\t\t\n\t// Store corner indices\n\tm_indices.push_back(r1.first->second);\n\tm_indices.push_back(r2.first->second);\n\tm_indices.push_back(r3.first->second);\n}\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/cached_triangulation.h",
    "content": "#ifndef MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_CACHED_TRIANGULATION_H\n#define MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_CACHED_TRIANGULATION_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Cached triangulation for use in mesh painters.\n * \t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n#include <k3dsdk/hints.h>\n#include <k3dsdk/triangulator.h>\n\n#include \"painter_cache.h\"\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nclass cached_triangulation :\n\tpublic k3d::triangulator,\n\tpublic scheduler\n{\npublic:\n\tcached_triangulation(const k3d::mesh* const Mesh) : m_mesh(Mesh) {}\n\t/// Links a single index to a list of indices\n\ttypedef std::vector<k3d::mesh::indices_t> index_vectors_t;\n\t// 32 bit so arrays can be passed directly to OpenGL on 64bit platforms\n\ttypedef std::vector<k3d::uint32_t> indices_t;\n\n\t/// The points that form the corners of the triangles. Duplicated per face to allow per-face normals\n\tk3d::mesh::points_t& points()\n\t{\n\t\treturn m_points;\n\t}\n\t\n\t/// The indices into points() for the triangles\n\tindices_t& indices()\n\t{\n\t\treturn m_indices;\n\t}\n\t\n\t/// First triangle corner (index into indices()) for each original face\n\tk3d::mesh::indices_t& face_starts()\n\t{\n\t\treturn m_face_starts;\n\t}\n\t\n\t/// Link between original mesh point indices and the indices into points() of its copies\n\tindex_vectors_t& point_links()\n\t{\n\t\treturn m_point_links;\n\t}\n\t\n\t/// Link between a face index in the original mesh and its corner indices into points()\n\tindex_vectors_t& face_points()\n\t{\n\t\treturn m_face_points;\n\t}\n\t\nprivate:\n\n\tvoid on_schedule(k3d::hint::mesh_geometry_changed* Hint, k3d::inode* Painter)\n\t{\n\t\tif (m_affected_indices.empty())\n\t\t{\n\t\t\tm_affected_indices = Hint->changed_points;\n\t\t}\n\t}\n\n\tvoid on_schedule(k3d::inode* Painter)\n\t{\n\t\tm_indices.clear();\n\t\tm_point_map.clear();\n\t\tm_points.clear();\n\t\tm_face_starts.clear();\n\t\tm_point_links.clear();\n\t\tm_progress = 0;\n\t\tm_face_points.clear();\n\t\tm_affected_indices.clear();\n\t}\n\t\n\tvoid on_execute(const k3d::mesh& Mesh, k3d::inode* Painter);\n\n\tvirtual void start_face(const k3d::uint_t Face);\n\tvirtual void add_vertex(const k3d::point3& Coordinates, k3d::uint_t Vertices[4], k3d::uint_t Edges[4], k3d::double_t Weights[4], k3d::uint_t& NewVertex);\n\tvirtual void add_triangle(k3d::uint_t Vertices[3], k3d::uint_t Edges[3]);\n\t\n\tk3d::pipeline_data<k3d::mesh::points_t> m_input_points;\n\t\n\t// mapping between mesh point index and triangulation point index (valid for the face being processed only!)\n\ttypedef std::map<k3d::uint_t, k3d::uint_t> point_map_t;\n\tpoint_map_t m_point_map;\n\t\n\t// points used by the triangles\n\tk3d::mesh::points_t m_points;\n\t\n\t// indices into m_points for the triangle corners\n\tindices_t m_indices;\n\t\n\t// First triangle corner (index into m_indices) for each original face\n\tk3d::mesh::indices_t m_face_starts;\n\t\n\t// Link between original point indices and the indices of its copies\n\tindex_vectors_t m_point_links;\n\t\n\t// Link between a face and its corners in the triangle representation\n\tindex_vectors_t m_face_points;\n\t\n\tk3d::mesh::indices_t m_affected_indices;\n\t\n\t// Keep track of what point we're at\n\tk3d::uint_t m_progress;\n\t\n\tconst k3d::mesh* const m_mesh;\n};\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n\n#endif // !MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_CACHED_TRIANGULATION_H\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/face_varying_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"colored_selection_painter_gl.h\"\n#include \"normal_cache.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nnamespace detail\n{\n\n/// Returns a point offset by Offset * edge_length into the face, normal to the edge vector and inside the face plane\nconst k3d::point3 get_offset_point(const k3d::mesh::indices_t& EdgePoints, const k3d::mesh::indices_t& ClockwiseEdges, const k3d::mesh::points_t& Points, const k3d::uint_t EdgeIndex, const k3d::double_t Offset)\n{\n\tk3d::point3 corner = Points[EdgePoints[EdgeIndex]];\n\tk3d::point3 next_corner = Points[EdgePoints[ClockwiseEdges[EdgeIndex]]];\n\tk3d::normal3 normal = k3d::normalize(k3d::polyhedron::normal(EdgePoints, ClockwiseEdges, Points, EdgeIndex));\n\tk3d::vector3 edge_vector = next_corner - corner;\n\tk3d::vector3 inward_vector = normal ^ edge_vector;\n\treturn corner + Offset*inward_vector + Offset*edge_vector;\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// face_varying_painter\n\nclass face_varying_painter :\n\tpublic colored_selection_painter\n{\n\ttypedef colored_selection_painter base;\n\npublic:\n\tface_varying_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_point_size(init_owner(*this) + init_name(\"point_size\") + init_label(_(\"Point Size\")) + init_description(_(\"Size for the points\")) + init_value(6.0) + init_constraint(k3d::data::constraint::minimum(1.0, k3d::data::constraint::maximum<double>(50.0))) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_offset(init_owner(*this) + init_name(\"offset\") + init_label(_(\"Offset\")) + init_description(_(\"Offset factor for the point, in units of edge length\")) + init_value(0.1) + init_constraint(k3d::data::constraint::minimum(0.0, k3d::data::constraint::maximum<double>(1.0))) + init_step_increment(0.05) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_point_size.changed_signal().connect(make_async_redraw_slot());\n\t\tm_offset.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\tconst k3d::mesh::selection_t& point_selection = *Mesh.point_selection;\n\n\t\tglEnableClientState(GL_VERTEX_ARRAY);\n\t\tglVertexPointer(3, GL_DOUBLE, 0, &points[0]);\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglDisable(GL_LIGHTING);\n\n\t\tconst color_t color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst color_t selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\n\t\tenable_blending();\n\n\t\tGLfloat old_point_size;\n\t\tglGetFloatv(GL_POINT_SIZE, &old_point_size);\n\t\tglPointSize(m_point_size.pipeline_value());\n\t\tconst k3d::double_t offset = m_offset.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\tglBegin(GL_POINTS);\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = polyhedron->face_first_loops.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\tconst k3d::uint_t loop_end = loop_begin +polyhedron->face_loop_counts[face];\n\t\t\t\tfor(k3d::uint_t loop = 0; loop != loop_end; ++loop)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t\t{\n\t\t\t\t\t\tcolor4d(polyhedron->edge_selections[edge] ? selected_color : color);\n\t\t\t\t\t\tk3d::gl::vertex3d(detail::get_offset_point(polyhedron->edge_points, polyhedron->clockwise_edges, points, edge, offset));\n\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tglEnd();\n\t\t}\n\t\tglPointSize(old_point_size);\n\t\tdisable_blending();\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::SPLIT_EDGE))\n\t\t\treturn;\n\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\tglEnableClientState(GL_VERTEX_ARRAY);\n\t\tglVertexPointer(3, GL_DOUBLE, 0, &points[0]);\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglDisable(GL_LIGHTING);\n\n\t\tGLfloat old_point_size;\n\t\tglGetFloatv(GL_POINT_SIZE, &old_point_size);\n\t\tglPointSize(m_point_size.pipeline_value());\n\t\tconst k3d::double_t offset = m_offset.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = polyhedron->face_first_loops.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\tconst k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\tfor(k3d::uint_t loop = 0; loop != loop_end; ++loop)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::gl::push_selection_token(k3d::selection::SPLIT_EDGE, edge);\n\t\n\t\t\t\t\t\tglBegin(GL_POINTS);\n\t\t\t\t\t\tk3d::gl::vertex3d(detail::get_offset_point(polyhedron->edge_points, polyhedron->clockwise_edges, points, edge, offset));\n\t\t\t\t\t\tglEnd();\n\t\n\t\t\t\t\t\tk3d::gl::pop_selection_token(); // SPLIT_EDGE\n\t\n\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tglPointSize(old_point_size);\n\t}\n\n\tvoid on_mesh_changed(const k3d::mesh& Mesh, k3d::ihint* Hint)\n\t{\n\t\tschedule_data<normal_cache>(&Mesh, Hint, this);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<face_varying_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xfbd81412, 0xa94df849, 0x1172a09e, 0xe08104f4),\n\t\t\t\"OpenGLFaceVaryingPainter\",\n\t\t\t_(\"Renders selection hooks for facevarying data\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_point_size;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_offset;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// face_varying_painter_factory\n\nk3d::iplugin_factory& face_varying_painter_factory()\n{\n\treturn face_varying_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/hidden_line_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Painter that triangulates its input first\n * \t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n#include \"cached_triangulation.h\"\n#include \"colored_selection_painter_gl.h\"\n#include \"utility.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/array.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// hidden_line_painter\n\nclass hidden_line_painter :\n\tpublic colored_selection_painter\n{\n\ttypedef colored_selection_painter base;\n\npublic:\n\thidden_line_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_line_width(init_owner(*this) + init_name(\"line_width\") + init_label(_(\"Line Width\")) + init_description(_(\"Control the rendered edge width (in pixels).\")) + init_value(1.0) + init_constraint(k3d::data::constraint::minimum(0.0)) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_line_width.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\t\t\n\t\tk3d::gl::store_attributes attributes;\n\n\t\t// Draw solid polygons for masking ...\n\t\tglDepthMask(GL_TRUE);\n\t\tglEnable(GL_DEPTH_TEST);\n\t\tglDisable(GL_LIGHTING);\n\t\tglColorMask(false, false, false, false);\n\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\tglPolygonOffset(2.0, 1.0);\n\t\tglDisable(GL_CULL_FACE);\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\n\t\tconst color_t color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst color_t selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\t\t\n\t\tcached_triangulation& triangles = get_data<cached_triangulation>(&Mesh, this);\n\t\tconst k3d::mesh::indices_t& face_starts = triangles.face_starts();\n\t\tif(face_starts.empty())\n\t\t\treturn;\n\n\t\tconst k3d::mesh::points_t& points = triangles.points();\n\t\tconst cached_triangulation::indices_t& indices = triangles.indices();\n\t\t\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get() || k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tglBegin(GL_TRIANGLES);\n\t\t\tfor (k3d::uint_t face = 0; face != face_starts.size(); ++face)\n\t\t\t{\n\t\t\t\tk3d::uint_t startindex = face_starts[face];\n\t\t\t\tk3d::uint_t endindex = face+1 == (face_starts.size()) ? indices.size() : face_starts[face+1];\n\t\t\t\tfor(k3d::uint_t corner = startindex; corner != endindex; ++corner)\n\t\t\t\t\tk3d::gl::vertex3d(points[indices[corner]]);\n\t\t\t}\n\t\t\tglEnd();\n\t\n\t\t\t// Draw wireframe edges ...\n\t\t\tglDepthMask(GL_FALSE);\n\t\t\tglColorMask(true, true, true, true);\n\t\t\tglDisable(GL_POLYGON_OFFSET_FILL);\n\t\n\t\t\tglEnable(GL_BLEND);\n\t\t\tglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\t\t\tglEnable(GL_LINE_SMOOTH);\n\t\t\tglHint(GL_LINE_SMOOTH_HINT, GL_NICEST);\n\t\n\t\t\tglLineWidth(m_line_width.pipeline_value());\n\t\n\t\t\tglBegin(GL_LINES);\n\t\t\tconst k3d::uint_t edge_count = polyhedron->edge_points.size();\n\t\t\tfor(k3d::uint_t edge = 0; edge != edge_count; ++edge)\n\t\t\t{\n\t\t\t\tcolor4d(polyhedron->edge_selections[edge] ? selected_color : color);\n\t\t\t\tk3d::gl::vertex3d(points[polyhedron->edge_points[edge]]);\n\t\t\t\tk3d::gl::vertex3d(points[polyhedron->edge_points[polyhedron->clockwise_edges[edge]]]);\n\t\t\t}\n\t\t\tglEnd();\n\t\t}\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::UNIFORM))\n\t\t\treturn;\n\t\t\t\n\t\tk3d::gl::store_attributes attributes;\n\t\t\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\tk3d::gl::set(GL_CULL_FACE, !SelectionState.select_backfacing);\n\n\t\tcached_triangulation& triangles = get_data<cached_triangulation>(&Mesh, this); \n\t\t\n\t\tconst k3d::mesh::indices_t& face_starts = triangles.face_starts();\n\t\tif (face_starts.empty())\n\t\t\treturn;\n\t\tconst k3d::mesh::points_t& points = triangles.points();\n\t\tconst cached_triangulation::indices_t& indices = triangles.indices();\n\n\t\tk3d::uint_t face_offset = 0;\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get() || k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tk3d::uint_t face_count = polyhedron->face_first_loops.size();\n\t\t\tfor(k3d::uint_t poly_face = 0; poly_face != face_count; ++poly_face)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t face = poly_face + face_offset;\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::UNIFORM, face);\n\t\n\t\t\t\tk3d::uint_t startindex = face_starts[face];\n\t\t\t\tk3d::uint_t endindex = face+1 == (face_starts.size()) ? indices.size() : face_starts[face+1];\n\t\t\t\tglBegin(GL_TRIANGLES);\n\t\t\t\tfor (k3d::uint_t corner = startindex; corner != endindex; ++corner)\n\t\t\t\t\tk3d::gl::vertex3d(points[indices[corner]]);\n\t\t\t\tglEnd();\n\t\n\t\t\t\tk3d::gl::pop_selection_token(); // UNIFORM\n\t\t\t}\n\t\t\tface_offset += face_count;\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\t\n\tvoid on_mesh_changed(const k3d::mesh& Mesh, k3d::ihint* Hint)\n\t{\n\t\tif(!has_non_sds_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\n\t\tschedule_data<cached_triangulation>(&Mesh, Hint, this);\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<hidden_line_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x5c0a98d1, 0x4148e5e1, 0x901e36b5, 0xc5aa6ee6),\n\t\t\t\"OpenGLHiddenLinePainter\",\n\t\t\t_(\"Renders meshes using a classic hidden-line effect.\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_line_width;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// hidden_line_painter_factory\n\nk3d::iplugin_factory& hidden_line_painter_factory()\n{\n\treturn hidden_line_painter::get_factory();\n}\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/normal_cache.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"normal_cache.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/hints.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/transform.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nnamespace detail\n{\n\n/// Calclate the normal for the given global face index (cumulative index over all polyhedra)\nconst k3d::normal3 normal(const k3d::uint_t GlobalFace, const k3d::mesh& Mesh)\n{\n\tk3d::uint_t faces_end = 0;\n\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t{\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\tif(!polyhedron.get())\n\t\t\tcontinue;\n\t\tfaces_end += polyhedron->face_first_loops.size();\n\t\tif(GlobalFace < faces_end)\n\t\t{\n\t\t\tconst k3d::uint_t face = GlobalFace - (faces_end - polyhedron->face_first_loops.size());\n\t\t\treturn k3d::polyhedron::normal(polyhedron->edge_points, polyhedron->clockwise_edges, *Mesh.points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]);\n\t\t}\n\t}\n}\n\ntypedef std::set<k3d::uint_t> index_set_t;\nvoid get_affected_points(const k3d::mesh& Mesh, const k3d::uint_t GlobalFace, index_set_t& AffectedPoints)\n{\n\tk3d::uint_t faces_end = 0;\n\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t{\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\tif(!polyhedron.get())\n\t\t\tcontinue;\n\t\tfaces_end += polyhedron->face_first_loops.size();\n\t\tif(GlobalFace < faces_end)\n\t\t{\n\t\t\tconst k3d::uint_t face = GlobalFace - (faces_end - polyhedron->face_first_loops.size());\n\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\tconst k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tAffectedPoints.insert(polyhedron->edge_points[edge]);\n\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/// Traverse polygonal mesh, visiting faces, loops, and points.\ntemplate<typename FunctorT>\nvoid traverse_polyhedra(const k3d::mesh& Mesh, FunctorT& Functor)\n{\n\tk3d::uint_t face_offset = 0;\n\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t{\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\tif(!polyhedron.get())\n\t\t\tcontinue;\n\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\tconst k3d::mesh::indices_t& face_first_loops = polyhedron->face_first_loops;\n\t\tconst k3d::mesh::counts_t& face_loop_counts = polyhedron->face_loop_counts;\n\t\tconst k3d::mesh::indices_t& loop_first_edges = polyhedron->loop_first_edges;\n\t\tconst k3d::mesh::indices_t& edge_points = polyhedron->edge_points;\n\t\tconst k3d::mesh::indices_t& clockwise_edges = polyhedron->clockwise_edges;\n\t\t\n\t\tconst k3d::uint_t face_count = face_first_loops.size();\n\t\tfor(k3d::uint_t poly_face = 0; poly_face != face_count; ++poly_face)\n\t\t{\n\t\t\tconst k3d::uint_t face = poly_face + face_offset;\n\t\t\tFunctor.on_face_start(face);\n\t\t\tconst k3d::uint_t loop_begin = face_first_loops[face];\n\t\t\tconst k3d::uint_t loop_end = loop_begin + face_loop_counts[face];\n\t\n\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t{\n\t\t\t\tFunctor.on_loop(loop);\n\t\t\t\tconst k3d::uint_t first_edge = loop_first_edges[loop];\n\t\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tFunctor.on_edge(edge, edge_points[edge], edge_points[clockwise_edges[edge]], points[edge_points[edge]], points[edge_points[clockwise_edges[edge]]]);\n\t\t\t\t\tedge = clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tFunctor.on_face_end(face);\n\t\t}\n\t\tface_offset += face_count;\n\t}\n}\n\nclass face_normals : public scheduler \n{\npublic:\n\tface_normals(const k3d::mesh* const Mesh) : m_normal(0,0,0)\n\t{\n\t}\n\t\n\tvoid on_face_start(const k3d::uint_t Face)\n\t{\n\t\tm_face = Face;\n\t}\n\t\n\tvoid on_face_end(const k3d::uint_t Face)\n\t{\n\t\tif(m_normal.length())\n\t\t{\n\t\t\tf_normals.push_back(k3d::normalize(m_normal));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tk3d::log() << debug << \"bad normal on face \" << m_face << std::endl;\n\t\t\tf_normals.push_back(k3d::normal3(0,0,1));\n\t\t}\n\t\tm_normal = k3d::normal3(0,0,0);\n\t}\n\t\n\tvoid on_loop(const k3d::uint_t Loop) {}\n\t\n\tvoid on_edge(const k3d::uint_t Edge, const k3d::uint_t StartPointIndex, const k3d::uint_t EndPointIndex, const k3d::point3& StartPoint, const k3d::point3& EndPoint)\n\t{\n\t\tm_normal[0] += (StartPoint[1] + EndPoint[1]) * (EndPoint[2] - StartPoint[2]);\n\t\tm_normal[1] += (StartPoint[2] + EndPoint[2]) * (EndPoint[0] - StartPoint[0]);\n\t\tm_normal[2] += (StartPoint[0] + EndPoint[0]) * (EndPoint[1] - StartPoint[1]);\n\t\tpoint_to_faces[StartPointIndex].push_back(m_face);\n\t}\n\t\n\t/// Per face normals\n\tk3d::mesh::normals_t f_normals;\n\t/// For each point, the faces it belongs to\n\tstd::vector<k3d::mesh::indices_t> point_to_faces;\n\t/// Indices of modified points\n\tk3d::mesh::indices_t indices;\n\t\nprotected:\n\tvoid on_schedule(k3d::hint::mesh_geometry_changed* Hint, k3d::inode* Painter)\n\t{\t\n\t\tif (indices.empty()) // Only set indices once (they are cleared upon execute()\n\t\t{\n\t\t\tindices = Hint->changed_points;\n\t\t}\n\t}\n\t\n\tvoid on_schedule(k3d::inode* Painter)\n\t{\n\t\tf_normals.clear();\n\t\tpoint_to_faces.clear();\n\t\tindices.clear();\n\t}\n\t\n\tvoid on_execute(const k3d::mesh& Mesh, k3d::inode* Painter)\n\t{\n\t\t// Resize arrays and initialize normals if the topology changed\n\t\tif (point_to_faces.empty())\n\t\t{\n\t\t\tpoint_to_faces.resize(Mesh.points->size());\n\t\t\tdetail::traverse_polyhedra(Mesh, *this);\n\t\t}\n\t\tfor (k3d::uint_t i = 0; i != indices.size(); ++i)\n\t\t{\n\t\t\tconst k3d::mesh::indices_t& faces = point_to_faces[indices[i]];\n\t\t\tfor (k3d::uint_t j = 0; j != faces.size(); ++j)\n\t\t\t{\n\t\t\t\tf_normals[faces[j]] = detail::normal(faces[j], Mesh);\n\t\t\t}\n\t\t}\n\t\tindices.clear();\n\t}\n\t\nprivate:\n\tk3d::normal3 m_normal;\n\tk3d::uint_t m_face;\n};\n\nclass point_normals : public scheduler\n{\npublic:\n\tpoint_normals(const k3d::mesh* const Mesh) {}\n\t\n\tk3d::mesh::normals_t p_normals;\n\tk3d::mesh::indices_t indices;\n\t\nprotected:\n\tvoid on_schedule(k3d::hint::mesh_geometry_changed* Hint, k3d::inode* Painter)\n\t{\t\n\t\tif (indices.empty()) // Only set indices once (they are cleared upon execute()\n\t\t{\n\t\t\tindices = Hint->changed_points;\n\t\t}\n\t}\n\t\n\tvoid on_schedule(k3d::inode* Painter)\n\t{\n\t\tp_normals.clear();\n\t\tindices.clear();\n\t}\n\t\n\tvoid on_execute(const k3d::mesh& Mesh, k3d::inode* Painter)\n\t{\n\t\tif(!has_non_empty_polyhedra(Mesh))\n\t\t\treturn;\n\t\tface_normals& f_normals = get_data<face_normals>(&Mesh, Painter);\n\t\t// Resize arrays and initialize normals if the topology changed\n\t\tif (p_normals.empty())\n\t\t{\n\t\t\tk3d::uint_t point_count = Mesh.points->size();\n\t\t\tp_normals.resize(point_count, k3d::normal3(0.0,0.0,0.0));\n\t\t\tfor (k3d::uint_t i = 0; i != point_count; ++i)\n\t\t\t{\n\t\t\t\tconst k3d::mesh::indices_t& faces = f_normals.point_to_faces[i];\n\t\t\t\tfor (k3d::uint_t j = 0; j != faces.size(); ++j)\n\t\t\t\t\tp_normals[i] += f_normals.f_normals[faces[j]];\n\t\t\t\tp_normals[i] /= faces.size();\n\t\t\t}\n\t\t}\n\t\t\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\t\n\t\t// not only the moved points, but all points belonging to deformed faces need to be updated\n\t\tdetail::index_set_t affected_points;\n\t\tfor (k3d::uint_t i = 0; i != indices.size(); ++i)\n\t\t{\n\t\t\tconst k3d::mesh::indices_t& faces = f_normals.point_to_faces[indices[i]];\n\t\t\tfor (k3d::uint_t j = 0; j != faces.size(); ++j)\n\t\t\t{\n\t\t\t\tk3d::uint_t face = faces[j];\n\t\t\t\tdetail::get_affected_points(Mesh, face, affected_points);\n\t\t\t}\n\t\t}\n\t\tfor (std::set<k3d::uint_t>::iterator point = affected_points.begin(); point != affected_points.end(); ++point)\n\t\t{\n\t\t\tp_normals[*point] = k3d::normal3(0,0,0);\n\t\t\tconst k3d::mesh::indices_t& faces = f_normals.point_to_faces[*point];\n\t\t\tfor (k3d::uint_t j = 0; j != faces.size(); ++j)\n\t\t\t{\n\t\t\t\tp_normals[*point] += f_normals.f_normals[faces[j]];\n\t\t\t}\n\t\t\tp_normals[*point] = k3d::normalize(p_normals[*point]);\n\t\t}\n\t\tindices.clear();\n\t}\n};\n\n} // namespace detail\n\n////////////////////\n// normal_cache\n////////////////////\n\nconst k3d::mesh::normals_t& normal_cache::point_normals(k3d::inode* Painter)\n{\n\treturn get_data<detail::point_normals>(m_mesh, Painter).p_normals;\n}\n\nconst k3d::mesh::normals_t& normal_cache::face_normals(k3d::inode* Painter)\n{\n\treturn get_data<detail::face_normals>(m_mesh, Painter).f_normals;\n}\n\nvoid normal_cache::on_schedule(k3d::hint::mesh_geometry_changed* Hint, k3d::inode* Painter)\n{\n\tschedule_data<detail::face_normals>(m_mesh, Hint, Painter);\n\tschedule_data<detail::point_normals>(m_mesh, Hint, Painter);\n}\n\nvoid normal_cache::on_schedule(k3d::inode* Painter)\n{\n\tschedule_data<detail::face_normals>(m_mesh, 0, Painter);\n\tschedule_data<detail::point_normals>(m_mesh, 0, Painter);\n}\n\nvoid normal_cache::on_execute(const k3d::mesh& Mesh, k3d::inode* Painter)\n{\n\t// nothing needed here, everything gets executed when the normals are requested\n}\n\nbool backfacing(const k3d::point3& Point, k3d::icamera& Camera, const k3d::normal3& Normal)\n{\n\tk3d::point3 eye = k3d::property::pipeline_value<k3d::matrix4>(Camera.transformation().matrix_source_output()) * k3d::point3(0,0,0);\n\ttry\n\t{\n\t\tk3d::iperspective& perspective = dynamic_cast<k3d::iperspective&>(Camera.projection());\n\t\treturn ((Point - eye) * Normal) > -1e-8; // 1e-8 avoids non-deterministic behaviour\n\t}\n\tcatch (std::bad_cast)\n\t{\n\t\tk3d::point3 target = k3d::property::pipeline_value<k3d::point3>(Camera.world_target());\n\t\treturn ((target - eye) * Normal) > 1e-8;\n\t}\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/normal_cache.h",
    "content": "#ifndef MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_NORMAL_CACHE_H\n#define MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_NORMAL_CACHE_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Cache normals\n * \t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n#include <k3dsdk/mesh.h>\n#include \"painter_cache.h\"\n\nnamespace k3d { class icamera; }\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nclass normal_cache : public scheduler\n{\npublic:\n\tnormal_cache(const k3d::mesh* const Mesh) : m_mesh(Mesh) {}\n\t/// Return the point (\"smooth\") normals\n\tconst k3d::mesh::normals_t& point_normals(k3d::inode* Painter);\n\t/// Return the face (\"flat\") normals\n\tconst k3d::mesh::normals_t& face_normals(k3d::inode* Painter);\nprotected:\n\t/// Scheduler implementation\n\tvoid on_schedule(k3d::hint::mesh_geometry_changed* Hint, k3d::inode* Painter);\n\tvoid on_schedule(k3d::inode* Painter);\n\tvoid on_execute(const k3d::mesh& Mesh, k3d::inode* Painter);\nprivate:\n\tconst k3d::mesh* const m_mesh;\n};\n\n/// Returns true if Point is on a backfacing component\nbool backfacing(const k3d::point3& Point, k3d::icamera& Camera, const k3d::normal3& Normal);\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n#endif // !MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_NORMAL_CACHE_H\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/point_normal_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"normal_cache.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// point_normal_painter\n\nclass point_normal_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tpoint_normal_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_draw_selected(init_owner(*this) + init_name(\"draw_selected\") + init_label(_(\"Draw Selected\")) + init_description(_(\"Draw normals for selected polygons\")) + init_value(true)),\n\t\tm_draw_unselected(init_owner(*this) + init_name(\"draw_unselected\") + init_label(_(\"Draw Unselected\")) + init_description(_(\"Draw normals for unselected polygons\")) + init_value(false)),\n\t\tm_selected_color(init_owner(*this) + init_name(\"selected_color\") + init_label(_(\"Selected Color\")) + init_description(_(\"Normal color for selected polygons\")) + init_value(k3d::color(0, 1, 1))),\n\t\tm_unselected_color(init_owner(*this) + init_name(\"unselected_color\") + init_label(_(\"Unselected Color\")) + init_description(_(\"Normal color for unselected polygons\")) + init_value(k3d::color(0, 0.6, 0.6)))\n\t{\n\t\tm_draw_selected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_draw_unselected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_selected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_unselected_color.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::bool_t draw_selected = m_draw_selected.pipeline_value() && RenderState.show_component_selection;\n\t\tconst k3d::bool_t draw_unselected = m_draw_unselected.pipeline_value();\n\n\t\tif(!draw_selected && !draw_unselected)\n\t\t\treturn;\n\n\t\tconst k3d::mesh::selection_t& point_selection = *Mesh.point_selection;\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\tconst k3d::uint_t point_count = points.size();\n\t\tnormal_cache& n_cache = get_data<normal_cache>(&Mesh, this);\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglDisable(GL_LIGHTING);\n\n\t\tif(draw_selected)\n\t\t{\n\t\t\tk3d::gl::color3d(m_selected_color.pipeline_value());\n\n\t\t\tglBegin(GL_LINES);\n\t\t\tfor(k3d::uint_t point = 0; point != point_count; ++point)\n\t\t\t{\n\t\t\t\tif(point_selection[point])\n\t\t\t\t{\n\t\t\t\t\tk3d::gl::vertex3d(points[point]);\n\t\t\t\t\tk3d::gl::vertex3d(points[point] + k3d::to_point(n_cache.point_normals(this).at(point)));\n\t\t\t\t}\n\t\t\t}\n\t\t\tglEnd();\n\t\t}\n\n\t\tif(draw_unselected)\n\t\t{\n\t\t\tk3d::gl::color3d(m_unselected_color.pipeline_value());\n\n\t\t\tglBegin(GL_LINES);\n\t\t\tfor(k3d::uint_t point = 0; point != point_count; ++point)\n\t\t\t{\n\t\t\t\tif(!point_selection[point])\n\t\t\t\t{\n\t\t\t\t\tk3d::gl::vertex3d(points[point]);\n\t\t\t\t\tk3d::gl::vertex3d(points[point] + k3d::to_point(n_cache.point_normals(this).at(point)));\n\t\t\t\t}\n\t\t\t}\n\t\t\tglEnd();\n\t\t}\n\t}\n\t\n\tvoid on_mesh_changed(const k3d::mesh& Mesh, k3d::ihint* Hint)\n\t{\n\t\tschedule_data<normal_cache>(&Mesh, Hint, this);\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<point_normal_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x2285917f, 0xfe40cc4f, 0xb462449f, 0xf5172d0a),\n\t\t\t\"OpenGLPointNormalPainter\",\n\t\t\t_(\"Renders polyhedron point normal vectors\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\t\n\t\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_selected;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_unselected;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_unselected_color;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// point_normal_painter_factory\n\nk3d::iplugin_factory& point_normal_painter_factory()\n{\n\treturn point_normal_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/sds_cache.h",
    "content": "#ifndef MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_SDS_CACHE_H\n#define MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_SDS_CACHE_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Common SDS painter classes\n * \t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n\n#include <k3dsdk/gl.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/subdivision_surface/catmull_clark.h>\n\n#include <boost/ptr_container/ptr_map.hpp>\n#include <map>\n\n#include \"painter_cache.h\"\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/// Color with alpha channel support\ntypedef k3d::basic_rgba<double, k3d::color_traits<double> > color_t;\n\n/// Common SDS cache functionality\nclass sds_cache : public scheduler\n{\npublic:\n\tsds_cache(const k3d::mesh* const Mesh) : m_levels(2), m_selection_changed(false) {}\n\t\n\t~sds_cache();\n\t\n\t/// Visit the data representing the SDS patch surface\n\tvoid visit_surface(const k3d::mesh::primitive* Polyhedron, const k3d::uint_t Level, k3d::sds::ipatch_surface_visitor& Visitor);\n\t\n\t/// Visit the data representing the SDS patch boundaries\n\tvoid visit_boundary(const k3d::mesh::primitive* Polyhedron, const k3d::uint_t Level, k3d::sds::ipatch_boundary_visitor& Visitor);\n\t\n\t/// Visit the data representing the patch corners\n\tvoid visit_corners(const k3d::mesh::primitive* Polyhedron, const k3d::uint_t Level, k3d::sds::ipatch_corner_visitor& Visitor);\n\t\n\tconst k3d::uint_t point_count() const\n\t{\n\t\treturn m_point_count;\n\t}\n\tconst k3d::uint_t edge_count(const k3d::mesh::primitive* Polyhedron)\n\t{\n\t\treturn m_edge_counts[Polyhedron];\n\t}\n\tconst k3d::uint_t face_count(const k3d::mesh::primitive* Polyhedron)\n\t{\n\t\treturn m_face_counts[Polyhedron];\n\t}\n\t\nprotected:\n\t/// Scheduler implementation\n\tvoid on_schedule(k3d::inode* Painter);\n\tvoid on_schedule(k3d::hint::mesh_geometry_changed* Hint, k3d::inode* Painter);\n\tvoid on_schedule(k3d::hint::selection_changed* Hint, k3d::inode* Painter);\n\tvoid on_schedule(k3d::hint::mesh_topology_changed* Hint, k3d::inode* Painter) { on_schedule(Painter); }\n\tvoid on_execute(const k3d::mesh& Mesh, k3d::inode* Painter);\nprivate:\n\t\n\t/// Executed when a level has changed \n\tvoid level_changed(k3d::ihint* Hint);\n\t\n\t/// Register a level property\n\tvoid register_painter(k3d::inode* Painter);\n\t\n\t/// Remove a level property\n\tvoid remove_painter(k3d::inode* Painter);\n\t\n\tk3d::uint_t m_levels;\n\t/// Indices of changed points\n\tk3d::mesh::indices_t m_indices;\n\ttypedef std::set<k3d::iproperty*> levels_t;\n\tlevels_t m_level_properties;\n\t// store connections for safe deletion of cache\n\ttypedef std::map<const k3d::inode*, sigc::connection> connections_t;\n\tconnections_t m_changed_connections; // connections to changed_signals\n\tconnections_t m_deleted_connections; // connections to deleted_signals\n\tboost::ptr_map<const k3d::mesh::primitive*, k3d::sds::catmull_clark_subdivider> m_caches;\n\tbool m_selection_changed;\n\tk3d::uint_t m_point_count;\n\tstd::map<const k3d::mesh::primitive*, k3d::uint_t> m_edge_counts;\n\tstd::map<const k3d::mesh::primitive*, k3d::uint_t> m_face_counts;\n};\n\n/// Stores SDS face data in OpenGL-compatible arrays\nclass face_visitor : public k3d::sds::ipatch_surface_visitor\n{\npublic:\n\tface_visitor(const k3d::uint_t PointCount, const k3d::uint_t EdgeCount, const k3d::uint_t FaceCount) :\n\t\tpoints_array(PointCount),\n\t\tnormals_array(PointCount),\n\t\tindices(EdgeCount),\n\t\tface_starts(FaceCount),\n\t\tm_point(0),\n\t\tm_edge(0),\n\t\tm_face(0)\n\t{ \n\t}\n\n\tvoid on_vertex(const k3d::point3& Point, const k3d::normal3& Normal)\n\t{\n\t\tpoints_array[m_point]= Point;\n\t\tnormals_array[m_point++] = Normal;\n\t}\n\tvoid on_edge(const k3d::uint_t PointIndex)\n\t{\n\t\tindices[m_edge++] = PointIndex;\n\t}\n\tvoid on_patch(k3d::uint_t Face)\n\t{\n\t\tface_starts[m_face++] = m_edge;\n\t}\n\tk3d::mesh::points_t points_array;\n\tk3d::mesh::normals_t normals_array;\n\tstd::vector<GLuint> indices;\n\tk3d::mesh::indices_t face_starts;\nprivate:\n\tk3d::uint_t m_point;\n\tk3d::uint_t m_edge;\n\tk3d::uint_t m_face;\n};\n\n/// Stores SDS patch border data in OpenGL-compatible arrays\nclass edge_visitor : public k3d::sds::ipatch_boundary_visitor\n{\npublic:\n\tedge_visitor(const k3d::uint_t EdgeCount) : edge_starts(EdgeCount) {}\n\n\tvoid on_point(const k3d::point3& Point)\n\t{\n\t\tpoints_array.push_back(Point);\n\t}\n\tvoid on_boundary(const k3d::uint_t Edge)\n\t{\n\t\tedge_starts[Edge] = points_array.size();\n\t}\n\t\n\tk3d::mesh::points_t points_array;\n\tk3d::mesh::indices_t edge_starts;\n};\n\n/// Stores SDS patch corner data in OpenGL-compatible arrays\nclass point_visitor : public k3d::sds::ipatch_corner_visitor\n{\npublic:\n\t\n\tvoid on_corner(const k3d::point3& Point)\n\t{\n\t\tpoints_array.push_back(Point);\n\t}\n\t\n\tk3d::mesh::points_t points_array;\n};\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n\n#endif // !MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_SDS_CACHE_H\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/sds_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file SDS painters\n */\n\n#include \"colored_selection_painter_gl.h\"\n#include \"sds_cache.h\"\n#include \"selection_cache.h\"\n#include \"utility.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n\t/////////////////////////////////////////////////////////////////////////////\n// sds_painter\n\ntemplate <typename selection_t>\nclass sds_painter :\n\tpublic colored_selection_painter\n{\n\ttypedef colored_selection_painter base;\npublic:\n\tsds_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document, const k3d::color Unselected = k3d::color(0.2,0.2,0.2), const k3d::color Selected = k3d::color(0.6,0.6,0.6)) :\n\t\tbase(Factory, Document, Unselected, Selected),\n\t\tm_levels(init_owner(*this) + init_name(\"levels\") + init_label(_(\"Levels\")) + init_description(_(\"Number of SDS levels\")) + init_value(2) + init_constraint(constraint::minimum<k3d::int32_t>(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_levels.changed_signal().connect(sigc::mem_fun(*this, &sds_painter<selection_t>::on_levels_changed));\n\t}\n\t\n\tvoid on_levels_changed(k3d::ihint* Hint)\n\t{\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\t\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!has_sds_polyhedra(Mesh))\n\t\t\treturn;\n\t\tk3d::gl::store_attributes attributes;\n\t\t\n\t\tenable_blending();\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tdraw(**primitive, get_data<sds_cache>(&Mesh, this), get_data<selection_t>(&Mesh, this), RenderState);\n\t\t}\n\t\tdisable_blending();\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!has_sds_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\n\t\tk3d::gl::store_attributes attributes;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tselect(**primitive, get_data<sds_cache>(&Mesh, this), SelectionState);\n\t\t}\n\t}\n\t\n\tvoid on_mesh_changed(const k3d::mesh& Mesh, k3d::ihint* Hint)\n\t{\n\t\tif(!has_sds_polyhedra(Mesh))\n\t\t\treturn;\n\n\t\tschedule_data<selection_t>(&Mesh, Hint, this);\n\t\tschedule_data<sds_cache>(&Mesh, Hint, this);\n\t}\n\nprotected:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_levels;\n\t\n\t// override to choose drawing mode\n\tvirtual void draw(const k3d::mesh::primitive& Primitive, sds_cache& Cache, selection_t& Selection, const k3d::gl::painter_render_state& RenderState) = 0;\n\t\n\t// override to choose selection mode\n\tvirtual void select(const k3d::mesh::primitive& Primitive, sds_cache& Cache, const k3d::gl::painter_selection_state& SelectionState) = 0;\n};\n\n////////////////////////////////:\n// sds_face_painter\n\nclass sds_face_painter : public sds_painter<face_selection>\n{\n\ttypedef sds_painter<face_selection> base;\n\ttypedef face_selection selection_t;\n\ttypedef k3d::typed_array<std::string> strings_t;\npublic:\n\tsds_face_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::color(0.2,0.2,0.2),k3d::color(0.6,0.6,0.6))\n\t{}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sds_face_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\t\tk3d::uuid(0xf8578aba, 0x674bbc2d, 0x40622ea4, 0x9167eaf9),\n\t\t\"OpenGLSDSFacePainter\",\n\t\t_(\"Renders mesh as SDS faces using OpenGL 1.1\"),\n\t\t\"OpenGL Painter\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprotected:\n\tvirtual void draw(const k3d::mesh::primitive& Primitive, sds_cache& Cache, selection_t& Selection, const k3d::gl::painter_render_state& RenderState)\n\t{\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Primitive));\n\t\tif(!polyhedron.get() || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\treturn;\n\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\tglEnable(GL_CULL_FACE);\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\tglPolygonOffset(1.0, 1.0);\n\t\tglEnable(GL_LIGHTING);\n\t\t\n\t\tconst color_t color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst color_t selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\t\t\n\t\tconst k3d::bool_t interpolateboundary = polyhedron->constant_attributes.lookup<strings_t>(\"interpolateboundary\") ? true : false;\n\t\tk3d::mesh::indices_t companions;\n\t\tk3d::mesh::bools_t boundary_edges;\n\t\tk3d::mesh::bools_t boundary_faces;\n\t\tif (!interpolateboundary)\n\t\t{\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->edge_points, polyhedron->clockwise_edges, boundary_edges, companions);\n\t\t\tk3d::polyhedron::create_boundary_face_lookup(polyhedron->face_first_loops, polyhedron->face_loop_counts, polyhedron->loop_first_edges, polyhedron->clockwise_edges, boundary_edges, companions, boundary_faces);\n\t\t}\n\t\t\n\t\tface_visitor visitor(Cache.point_count(), Cache.edge_count(&Primitive), polyhedron->face_first_loops.size());\n\t\tCache.visit_surface(&Primitive, m_levels.pipeline_value(), visitor);\n\t\t\n\t\tk3d::uint_t face_count = visitor.face_starts.size();\n\t\tconst selection_records_t& face_selection_records = Selection.records(&Primitive);\n\t\tglBegin(GL_QUADS);\n\t\tif (interpolateboundary)\n\t\t{\n\t\t\tassert_not_implemented();\n/*\n\t\t\tif (!face_selection_records.empty())\n\t\t\t{\n\t\t\t\tfor (selection_records_t::const_iterator record = face_selection_records.begin(); record != face_selection_records.end() && record->begin < face_count; ++record)\n\t\t\t\t{ // color by selection\n\t\t\t\t\tconst color_t& face_color = record->weight ? selected_color : color;\n\t\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, k3d::color(face_color.red, face_color.green, face_color.blue), face_color.alpha);\n\t\t\t\t\tk3d::uint_t start = record->begin;\n\t\t\t\t\tk3d::uint_t end = record->end;\n\t\t\t\t\tend = end > face_count ? face_count : end;\n\t\t\t\t\tk3d::uint_t start_index = visitor.face_starts[start];\n\t\t\t\t\tk3d::uint_t end_index = end == face_count ? visitor.indices.size() : visitor.face_starts[end];\n\t\t\t\t\tfor (k3d::uint_t i = start_index; i != end_index; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::gl::normal3d(k3d::to_vector(visitor.normals_array[visitor.indices[i]]));\n\t\t\t\t\t\tk3d::gl::vertex3d(visitor.points_array[visitor.indices[i]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{ // empty selection, everything has the same color\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, k3d::color(color.red, color.green, color.blue), color.alpha);\n\t\t\t\tfor (k3d::uint_t i = 0; i != visitor.indices.size(); ++i)\n\t\t\t\t{\n\t\t\t\t\tk3d::gl::normal3d(k3d::to_vector(visitor.normals_array[visitor.indices[i]]));\n\t\t\t\t\tk3d::gl::vertex3d(visitor.points_array[visitor.indices[i]]);\n\t\t\t\t}\n\t\t\t}\n*/\n\t\t}\n\t\telse // no boundary interpolation requires us not to render the faces of the mesh boundary\n\t\t{\n\t\t\tfor (k3d::uint_t face = 0; face != visitor.face_starts.size(); ++face)\n\t\t\t{\n\t\t\t\tif (boundary_faces[face])\n\t\t\t\t\tcontinue;\n\t\t\t\tconst color_t& face_color = polyhedron->face_selections[face] ? selected_color : color;\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, k3d::color(face_color.red, face_color.green, face_color.blue), face_color.alpha);\n\t\t\t\tk3d::uint_t start_index = visitor.face_starts[face];\n\t\t\t\tk3d::uint_t end_index = face == (visitor.face_starts.size()-1) ? visitor.indices.size() : visitor.face_starts[face+1]; \n\t\t\t\tfor (k3d::uint_t i = start_index; i != end_index; ++i)\n\t\t\t\t{\n\t\t\t\t\tk3d::gl::normal3d(k3d::to_vector(visitor.normals_array[visitor.indices[i]]));\n\t\t\t\t\tk3d::gl::vertex3d(visitor.points_array[visitor.indices[i]]);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\tglEnd();\n\t}\n\tvirtual void select(const k3d::mesh::primitive& Primitive, sds_cache& Cache, const k3d::gl::painter_selection_state& SelectionState)\n\t{\n\t\tif (!SelectionState.select_uniform)\n\t\t\treturn;\n\t\t\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Primitive));\n\t\tif(!polyhedron.get() || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\treturn;\n\t\t\n\t\tk3d::gl::store_attributes attributes;\n\t\t\t\t\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\tk3d::gl::set(GL_CULL_FACE, !SelectionState.select_backfacing);\n\n\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\tglPolygonOffset(1.0, 1.0);\n\t\t\n\t\tface_visitor visitor(Cache.point_count(), Cache.edge_count(&Primitive), polyhedron->face_first_loops.size());\n\t\tCache.visit_surface(&Primitive, m_levels.pipeline_value(), visitor);\n\t\t\n\t\tfor (k3d::uint_t face = 0; face != visitor.face_starts.size(); ++face)\n\t\t{\n\t\t\tk3d::gl::push_selection_token(k3d::selection::UNIFORM, face);\n\t\t\tglBegin(GL_QUADS);\n\t\t\tk3d::uint_t start_index = visitor.face_starts[face];\n\t\t\tk3d::uint_t end_index = face == (visitor.face_starts.size()-1) ? visitor.indices.size() : visitor.face_starts[face+1]; \n\t\t\tfor (k3d::uint_t i = start_index; i != end_index; ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::normal3d(k3d::to_vector(visitor.normals_array[visitor.indices[i]]));\n\t\t\t\tk3d::gl::vertex3d(visitor.points_array[visitor.indices[i]]);\n\t\t\t}\n\t\t\tglEnd();\n\t\t\tk3d::gl::pop_selection_token(); // UNIFORM\n\t\t}\n\t}\n};\n\nk3d::iplugin_factory& sds_face_painter_factory()\n{\n\treturn sds_face_painter::get_factory();\n}\n\t\n////////////\n// sds_edge_painter\n////////////\n\t\nclass sds_edge_painter : public sds_painter<edge_selection>\n{\n\ttypedef sds_painter<edge_selection> base;\n\ttypedef edge_selection selection_t;\npublic:\n\tsds_edge_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::color(0.0,0.0,0.0),k3d::color(1.0,1.0,1.0))\n\t{}\n\t\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sds_edge_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\t\tk3d::uuid(0x55238c22, 0xed466597, 0xb86c86a3, 0x0de46700),\n\t\t\"OpenGLSDSEdgePainter\",\n\t\t_(\"Renders mesh as SDS patch borders using OpenGL 1.1\"),\n\t\t\"Development\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\t\nprivate:\n\tvirtual void draw(const k3d::mesh::primitive& Primitive, sds_cache& Cache, selection_t& Selection, const k3d::gl::painter_render_state& RenderState)\n\t{\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Primitive));\n\t\tif(!polyhedron.get() || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\treturn;\n\t\tglDisable(GL_LIGHTING);\n\t\tedge_visitor visitor(polyhedron->edge_points.size());\n\t\tCache.visit_boundary(&Primitive, m_levels.pipeline_value(), visitor);\n\t\t\n\t\tglEnableClientState(GL_VERTEX_ARRAY);\n\t\tglVertexPointer(3, GL_DOUBLE, 0, &visitor.points_array[0]);\n\t\t\n\t\tconst color_t color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst color_t selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\t\t\n\t\tk3d::uint_t edge_count = visitor.edge_starts.size();\n\t\t\n\t\tglBegin(GL_LINES);\nassert_not_implemented();\n/*\n\t\tconst selection_records_t& edge_selection_records = Selection.records(&Primitive);\n\t\tif (!edge_selection_records.empty())\n\t\t{\n\t\t\tfor (selection_records_t::const_iterator record = edge_selection_records.begin(); record != edge_selection_records.end() && record->begin < edge_count; ++record)\n\t\t\t{ // color by selection\n\t\t\t\tcolor4d(record->weight ? selected_color : color);\n\t\t\t\tk3d::uint_t start = record->begin;\n\t\t\t\tk3d::uint_t end = record->end;\n\t\t\t\tend = end > edge_count ? edge_count : end;\n\t\t\t\tk3d::uint_t start_index = visitor.edge_starts[start];\n\t\t\t\tk3d::uint_t end_index = end == edge_count ? visitor.points_array.size() : visitor.edge_starts[end];\n\t\t\t\tfor (k3d::uint_t i = start_index; i < end_index; ++i)\n\t\t\t\t{\n\t\t\t\t\tk3d::gl::vertex3d(visitor.points_array[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{ // empty selection, everything has the same color\n\t\t\tcolor4d(color);\n\t\t\tfor (k3d::uint_t i = 0; i != edge_count; ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::vertex3d(visitor.points_array[i]);\n\t\t\t}\n\t\t}\n*/\n\t\tglEnd();\n\t}\n\t\n\tvirtual void select(const k3d::mesh::primitive& Primitive, sds_cache& Cache, const k3d::gl::painter_selection_state& SelectionState)\n\t{\n\t\tif (!SelectionState.select_split_edges)\n\t\t\treturn;\n\t\t\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Primitive));\n\t\tif(!polyhedron.get() || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\treturn;\n\t\t\n\t\tglDisable(GL_LIGHTING);\n\t\tedge_visitor visitor(polyhedron->edge_points.size());\n\t\tCache.visit_boundary(&Primitive, m_levels.pipeline_value(), visitor);\n\t\t\n\t\tk3d::uint_t edge_count = visitor.edge_starts.size();\n\t\t\n\t\tfor (k3d::uint_t edge = 0; edge != visitor.edge_starts.size(); ++edge)\n\t\t{\n\t\t\tk3d::gl::push_selection_token(k3d::selection::SPLIT_EDGE, edge);\n\t\t\t\n\t\t\tk3d::uint_t start_index = visitor.edge_starts[edge];\n\t\t\tk3d::uint_t end_index = edge == (edge_count-1) ? visitor.points_array.size() : visitor.edge_starts[edge+1];\n\t\t\tglBegin(GL_LINES);\n\t\t\tfor (k3d::uint_t i = start_index; i < end_index; ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::vertex3d(visitor.points_array[i]);\n\t\t\t}\n\t\t\tglEnd();\n\t\t\t\n\t\t\tk3d::gl::pop_selection_token(); // SPLIT_EDGE\n\t\t}\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// sds_edge_painter_factory\n\nk3d::iplugin_factory& sds_edge_painter_factory()\n{\n\treturn sds_edge_painter::get_factory();\n}\n\n////////////\n// sds_point_painter\n////////////\n\t\nclass sds_point_painter : public sds_painter<point_selection>\n{\n\ttypedef sds_painter<point_selection> base;\n\ttypedef point_selection selection_t;\npublic:\n\tsds_point_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::color(0.0,0.0,0.0),k3d::color(1.0,1.0,1.0))\n\t{}\n\t\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sds_point_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\t\tk3d::uuid(0xc336f1ed, 0x0a4fab65, 0x7ceeb380, 0x4a67eca1),\n\t\t\"OpenGLSDSPointPainter\",\n\t\t_(\"Renders mesh as SDS patch corners using OpenGL 1.1\"),\n\t\t\"Development\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\t\nprivate:\n\tvirtual void draw(const k3d::mesh::primitive& Primitive, sds_cache& Cache, selection_t& Selection, const k3d::gl::painter_render_state& RenderState)\n\t{\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Primitive));\n\t\tif(!polyhedron.get() || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\treturn;\n\t\tglDisable(GL_LIGHTING);\n\t\tpoint_visitor visitor;\n\t\tCache.visit_corners(&Primitive, m_levels.pipeline_value(), visitor);\n\t\t\n\t\tk3d::uint_t point_count = Cache.point_count();\n\t\t\n\t\tconst color_t color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst color_t selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\nassert_not_implemented();\n/*\n\t\tglBegin(GL_POINTS);\n\t\tconst selection_records_t& point_selection_records = Selection.records();\n\t\tif (!point_selection_records.empty())\n\t\t{\n\t\t\tfor (selection_records_t::const_iterator record = point_selection_records.begin(); record != point_selection_records.end() && record->begin < point_count; ++record)\n\t\t\t{ // color by selection\n\t\t\t\tcolor4d(record->weight ? selected_color : color);\n\t\t\t\tk3d::uint_t start = record->begin;\n\t\t\t\tk3d::uint_t end = record->end;\n\t\t\t\tend = end > point_count ? point_count : end;\n\t\t\t\tfor (k3d::uint_t i = start; i != end; ++i)\n\t\t\t\t{\n\t\t\t\t\tk3d::gl::vertex3d(visitor.points_array[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{ // empty selection, everything has the same color\n\t\t\tcolor4d(color);\n\t\t\tfor (k3d::uint_t i = 0; i != point_count; ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::vertex3d(visitor.points_array[i]);\n\t\t\t}\n\t\t}\n\t\tglEnd();\n*/\n\t}\n\t\n\tvirtual void select(const k3d::mesh::primitive& Primitive, sds_cache& Cache, const k3d::gl::painter_selection_state& SelectionState)\n\t{\n\t\tif (!SelectionState.select_points)\n\t\t\treturn;\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Primitive));\n\t\tif(!polyhedron.get() || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\treturn;\n\t\tglDisable(GL_LIGHTING);\n\t\tpoint_visitor visitor;\n\t\tCache.visit_corners(&Primitive, m_levels.pipeline_value(), visitor);\n\t\t\n\t\tk3d::uint_t point_count = Cache.point_count();\n\t\t\n\t\tglEnableClientState(GL_VERTEX_ARRAY);\n\t\tglVertexPointer(3, GL_DOUBLE, 0, &visitor.points_array[0]);\n\t\t\n\t\tfor (k3d::uint_t point = 0; point != point_count; ++point)\n\t\t{\n\t\t\tk3d::gl::push_selection_token(k3d::selection::POINT, point);\n\t\t\tglBegin(GL_POINTS);\n\t\t\tk3d::gl::vertex3d(visitor.points_array[point]);\n\t\t\tglEnd();\n\t\t\tk3d::gl::pop_selection_token();\n\t\t}\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// sds_point_painter_factory\n\nk3d::iplugin_factory& sds_point_painter_factory()\n{\n\treturn sds_point_painter::get_factory();\n}\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/selection_cache.h",
    "content": "#ifndef MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_SELECTION_CACHE_H\n#define MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_SELECTION_CACHE_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Caches for selection data\n * \t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/// Storage for selection data\n//typedef std::vector<k3d::mesh_selection::record> selection_records_t;\ntypedef std::vector<int> selection_records_t;\n\nnamespace detail\n{\n\ninline void copy_selection(const k3d::mesh::selection_t& Selection, selection_records_t& Records)\n{\n\tassert_not_implemented();\n/*\n\tfor (k3d::uint_t i = 0; i < Selection.size();)\n\t{\n\t\tk3d::uint_t start = i;\n\t\tk3d::mesh_selection::record record(start, i+1, Selection[i]);\n\t\twhile (i < Selection.size() && record.weight == Selection[i])\n\t\t{\n\t\t\trecord.end = i+1;\n\t\t\t++i;\n\t\t}\n\t\tRecords.push_back(record);\n\t}\n*/\n}\n\n} // namespace detail\n\n/// Keep track of component selections\nclass component_selection : public scheduler\n{\npublic:\n\tcomponent_selection(const k3d::mesh* const Mesh) {}\n\t/// Provide access to the stored selection records\n\tconst selection_records_t& records(const k3d::mesh::primitive* Polyhedron)\n\t{\n\t\treturn m_selection_records[Polyhedron];\n\t}\n\nprotected:\n\tvoid on_schedule(k3d::inode* Painter)\n\t{\n\t\tm_selection_records.clear();\n\t}\n\tvoid on_schedule(k3d::hint::selection_changed* Hint, k3d::inode* Painter)\n\t{\n\t\ton_schedule(Painter);\n\t}\n\tstd::map<const k3d::mesh::primitive*, selection_records_t> m_selection_records;\n};\n\n/// point selection\nclass point_selection : public scheduler\n{\npublic:\n\tpoint_selection(const k3d::mesh* const Mesh) {}\n\t\n\tconst selection_records_t& records() const\n\t{\n\t\treturn m_selection_records;\n\t}\nprotected:\n\tvoid on_execute(const k3d::mesh& Mesh, k3d::inode* Painter)\n\t{\n\t\tif (m_selection_records.empty())\n\t\t{\n\t\t\tdetail::copy_selection(*Mesh.point_selection, m_selection_records);\n\t\t}\n\t}\n\tvoid on_schedule(k3d::inode* Painter)\n\t{\n\t\tm_selection_records.clear();\n\t}\n\tvoid on_schedule(k3d::hint::selection_changed* Hint, k3d::inode* Painter)\n\t{\n\t\ton_schedule(Painter);\n\t}\n\tselection_records_t m_selection_records;\n};\n\n/// Implement component_selection::on_execute for an edge selection\nclass edge_selection : public component_selection\n{\npublic:\n\tedge_selection(const k3d::mesh* const Mesh) : component_selection(Mesh) {}\nprotected:\n\tvoid on_execute(const k3d::mesh& Mesh, k3d::inode* Painter)\n\t{\n\t\tif (m_selection_records.empty())\n\t\t{\n\t\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\t\tif(!polyhedron.get())\n\t\t\t\t\tcontinue;\n\t\t\t\tdetail::copy_selection(polyhedron->edge_selections, m_selection_records[primitive->get()]);\n\t\t\t}\n\t\t}\n\t}\n};\n\n/// Implement component_selection::on_execute for a face selection\nclass face_selection : public component_selection\n{\npublic:\n\tface_selection(const k3d::mesh* const Mesh) : component_selection(Mesh) {}\nprotected:\n\tvoid on_execute(const k3d::mesh& Mesh, k3d::inode* Painter)\n\t{\n\t\tif (m_selection_records.empty())\n\t\t{\n\t\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\t\tif(!polyhedron.get())\n\t\t\t\t\tcontinue;\n\t\t\t\tdetail::copy_selection(polyhedron->face_selections, m_selection_records[primitive->get()]);\n\t\t\t}\n\t\t}\n\t}\n};\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n#endif // !MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_SELECTION_CACHE_H\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/textured_face_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Painter that triangulates its input first\n * \t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n#include \"cached_triangulation.h\"\n#include \"colored_selection_painter_gl.h\"\n#include \"normal_cache.h\"\n#include \"utility.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/array.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/texture3.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// textured_face_painter\n\nclass textured_face_painter :\n\tpublic colored_selection_painter\n{\n\ttypedef colored_selection_painter base;\n\npublic:\n\ttextured_face_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::color(0.2,0.2,0.2), k3d::color(0.6,0.6,0.6)),\n\t\tm_bitmap(init_owner(*this) + init_name(\"bitmap\") + init_label(_(\"Bitmap\")) + init_description(_(\"Bitmap\")) + init_value<k3d::bitmap*>(0)),\n\t\tm_texture_name(0)\n\t{\n\t\tm_bitmap.changed_signal().connect(sigc::mem_fun(*this, &textured_face_painter::bitmap_changed));\n\t}\n\n\t~textured_face_painter()\n\t{\n\t\tif(m_texture_name)\n\t\t\tglDeleteTextures(1, &m_texture_name);\n\t}\n\n\tvoid bitmap_changed(k3d::ihint* Hint)\n\t{\n\t\tif(m_texture_name)\n\t\t{\n\t\t\tglDeleteTextures(1, &m_texture_name);\n\t\t\tm_texture_name = 0;\n\t\t}\n\n\t\tasync_redraw(Hint);\n\t}\n\n\tvoid async_redraw(k3d::ihint*)\n\t{\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!has_non_sds_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\n\t\tk3d::bitmap* const bitmap = m_bitmap.pipeline_value();\n\t\tif(!(bitmap && bitmap->width() && bitmap->height()))\n\t\t\treturn;\n\n\t\tif(0 == m_texture_name)\n\t\t{\n\t\t\tglGenTextures(1, &m_texture_name);\n\t\t\tif(0 == m_texture_name)\n\t\t\t\treturn;\n\n\t\t\tglBindTexture(GL_TEXTURE_2D, m_texture_name);\n\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);\n\n\t\t\tk3d::gl::tex_image_2d(*bitmap);\n\t\t}\n\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\tk3d::gl::set(GL_CULL_FACE, RenderState.draw_two_sided);\n\n\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\tglPolygonOffset(1.0, 1.0);\n\t\t\n\t\tconst color_t color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst color_t selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\t\t\n\t\tcached_triangulation& triangles = get_data<cached_triangulation>(&Mesh, this);\n\t\tconst k3d::mesh::indices_t& face_starts = triangles.face_starts();\n\t\tif (face_starts.empty())\n\t\t\treturn;\n\t\tconst k3d::mesh::points_t& points = triangles.points();\n\t\tconst cached_triangulation::indices_t& indices = triangles.indices();\n\t\t\n\t\tglEnable(GL_LIGHTING);\n\t\tenable_blending();\n\t\t\n\t\tk3d::uint_t face_offset = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tif (k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\t\t\n\t\t\tnormal_cache& n_cache = get_data<normal_cache>(&Mesh, this);\n\t\n\t\t\tconst k3d::typed_array<k3d::texture3>* texcoords = 0;\n\t\t\tfor(k3d::named_arrays::const_iterator array_it = polyhedron->face_varying_attributes.begin(); array_it != polyhedron->face_varying_attributes.end(); ++array_it)\n\t\t\t{\n\t\t\t\ttexcoords = dynamic_cast<const k3d::typed_array<k3d::texture3>* >(array_it->second.get());\n\t\t\t\tif(texcoords)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\n\t\t\tglEnable(GL_TEXTURE_2D);\n\t\t\tglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);\n\t\t\tglBindTexture(GL_TEXTURE_2D, m_texture_name);\n\t\n\t\t\tglBegin(GL_TRIANGLES);\n\t\t\tconst k3d::uint_t face_count = polyhedron->face_first_loops.size();\n\t\t\tfor (k3d::uint_t poly_face = 0; poly_face != face_starts.size(); ++poly_face)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t face = poly_face + face_offset;\n\t\t\t\tk3d::uint_t startindex = face_starts[face];\n\t\t\t\tk3d::uint_t endindex = face+1 == (face_starts.size()) ? indices.size() : face_starts[face+1];\n\t\t\t\tconst color_t& face_color = polyhedron->face_selections[poly_face] ? selected_color : color;\n\t\t\t\tk3d::gl::normal3d(n_cache.face_normals(this).at(face));\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, k3d::color(face_color.red, face_color.green, face_color.blue), face_color.alpha);\n\t\t\t\tk3d::uint_t point_offset = indices[startindex];\n\t\t\t\tk3d::uint_t edge_offset = polyhedron->loop_first_edges[polyhedron->face_first_loops[poly_face]];\n\t\t\t\tfor (k3d::uint_t corner = startindex; corner != endindex; ++corner)\n\t\t\t\t{\n\t\t\t\t\tif(texcoords)\n\t\t\t\t\t{\n\t\t\t\t\t\t// TODO: This mapping isn't very nice, but the idea is to get the edge index of the triangulated point\n\t\t\t\t\t\t//\t\t Maybe it's possible some better way already?\n\t\t\t\t\t\tsize_t coord_index = (indices[corner]-point_offset) + edge_offset;\n\t\t\t\t\t\tglTexCoord2d((*texcoords)[coord_index].n[0], (*texcoords)[coord_index].n[1]);\n\t\t\t\t\t}\n\t\t\t\t\tk3d::gl::vertex3d(points[indices[corner]]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tglEnd();\n\t\t\tface_offset += face_count;\n\t\t}\n\t\tdisable_blending();\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!has_non_sds_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\t\n\t\tif(!SelectionState.select_component.count(k3d::selection::UNIFORM))\n\t\t\treturn;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\t\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\tk3d::gl::set(GL_CULL_FACE, !SelectionState.select_backfacing);\n\n\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\tglPolygonOffset(1.0, 1.0);\n\t\t\n\t\tcached_triangulation& triangles = get_data<cached_triangulation>(&Mesh, this); \n\t\t\n\t\tconst k3d::mesh::indices_t& face_starts = triangles.face_starts();\n\t\tif (face_starts.empty())\n\t\t\treturn;\n\t\tconst k3d::mesh::points_t& points = triangles.points();\n\t\tconst cached_triangulation::indices_t& indices = triangles.indices();\n\t\t\n\t\tk3d::uint_t face_offset = 0;\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tif (k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tconst k3d::uint_t face_count = polyhedron->face_first_loops.size();\n\t\t\tfor(k3d::uint_t poly_face = 0; poly_face != face_count; ++poly_face)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t face = poly_face + face_offset;\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::UNIFORM, poly_face);\n\t\n\t\t\t\tk3d::uint_t startindex = face_starts[face];\n\t\t\t\tk3d::uint_t endindex = face+1 == (face_starts.size()) ? indices.size() : face_starts[face+1];\n\t\t\t\tglBegin(GL_TRIANGLES);\n\t\t\t\tfor (k3d::uint_t corner = startindex; corner != endindex; ++corner)\n\t\t\t\t\tk3d::gl::vertex3d(points[indices[corner]]);\n\t\t\t\tglEnd();\n\t\n\t\t\t\tk3d::gl::pop_selection_token(); // UNIFORM\n\t\t\t}\n\t\t\tface_offset += face_count;\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\t\n\tvoid on_mesh_changed(const k3d::mesh& Mesh, k3d::ihint* Hint)\n\t{\n\t\tif(!has_non_sds_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\n\t\tschedule_data<cached_triangulation>(&Mesh, Hint, this);\n\t\tschedule_data<normal_cache>(&Mesh, Hint, this);\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<textured_face_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x44f5c208, 0x4e8206cd, 0x29843cb3, 0x0cf46093),\n\t\t\t\"OpenGLTexturedFacePainter\",\n\t\t\t_(\"Renders textured mesh faces, after triangulating them (OpenGL 1.1)\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprotected:\n\n\tk3d_data(k3d::bitmap*, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) m_bitmap;\n\tGLuint m_texture_name;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// textured_face_painter_factory\n\nk3d::iplugin_factory& textured_face_painter_factory()\n{\n\treturn textured_face_painter::get_factory();\n}\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/vbo.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n\n#include \"normal_cache.h\"\n#include \"vbo.h\"\n#include \"sds_cache.h\"\n\n#include <k3dsdk/hints.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/any.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <map>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n////////\n// class vbo\n///////\n\nvbo::vbo( )\n{\n\tglGenBuffers(1, &m_name);\n}\n\nvbo::~ vbo( )\n{\n\tglDeleteBuffers(1, &m_name);\n}\n\nvbo::operator GLuint( ) const\n{\n\treturn m_name;\n}\n\n///////////\n// class point_vbo\n///////////\n\nvoid point_vbo::bind()\n{\n\tif(!m_vbo)\n\t{\n\t\tthrow vbo_exception(\"point_vbo is null\");\n\t}\n\tif(!glIsBuffer(*m_vbo))\n\t{\n\t\tthrow vbo_exception(\"point_vbo is not a buffer!\");\n\t}\n\tglBindBuffer(GL_ARRAY_BUFFER, *m_vbo);\t\n\tglVertexPointer(3, GL_DOUBLE, 0, 0);\n\tglEnableClientState(GL_VERTEX_ARRAY);\n}\n\nvoid point_vbo::on_schedule(k3d::inode* Painter)\n{\n\tdelete m_vbo;\n\tm_vbo = 0;\n\tm_indices.clear();\n}\n\nvoid point_vbo::on_schedule(k3d::hint::mesh_geometry_changed* Hint, k3d::inode* Painter)\n{\n\tif (m_indices.empty()) // Only set indices once (they are cleared upon execute()\n\t{\n\t\tm_indices = Hint->changed_points;\n\t}\n}\n\nvoid point_vbo::on_execute(const k3d::mesh& Mesh, k3d::inode* Painter)\n{\n\treturn_if_fail(Mesh.points);\n\tconst k3d::mesh::points_t& points = *(Mesh.points);\n\tbool new_vbo = false;\n\t\n\tif (!m_vbo) // OpenGL VBO functions may only be called in the drawing context, i.e. during paint_mesh or select_mesh\n\t{\n\t\tm_vbo = new vbo();\n\t\tnew_vbo = true;\n\t}\n\t\n\tglBindBuffer(GL_ARRAY_BUFFER, *m_vbo);\n\t\n\tif (m_indices.empty() || new_vbo)\n\t{\n\t\tglBufferData(GL_ARRAY_BUFFER, sizeof(points[0]) * points.size(), &points[0], GL_STATIC_DRAW);\n\t}\n\telse\n\t{\n\t\tk3d::point3* vertices = static_cast<k3d::point3*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));\n\t\tfor (size_t index = 0; index != m_indices.size(); ++index)\n\t\t{\n\t\t\tvertices[m_indices[index]] = points[m_indices[index]];\n\t\t}\n\t\tglUnmapBuffer(GL_ARRAY_BUFFER);\n\t}\n\t\n\tm_indices.clear(); // Clear indices for next schedule call\n}\n\n////////\n// Class edge_vbo\n////////\n\nvoid edge_vbo::bind(const k3d::mesh::primitive* Primitive)\n{\n\tif(m_vbos.find(Primitive) == m_vbos.end())\n\t{\n\t\tthrow vbo_exception(\"No VBO for edges\");\n\t}\n\tvbo& the_vbo = m_vbos[Primitive];\n\tif(!glIsBuffer(the_vbo))\n\t{\n\t\tthrow vbo_exception(\"edge_vbo is not a buffer!\");\n\t}\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, the_vbo);\n}\n\nvoid edge_vbo::on_schedule(k3d::inode* Painter)\n{\n\tm_vbos.clear();\n}\n\nvoid edge_vbo::on_execute(const k3d::mesh& Mesh, k3d::inode* Painter)\n{\n\tif(m_vbos.size())\n\t\treturn;\n\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t{\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\tif(!polyhedron.get())\n\t\t\tcontinue;\n\t\n\t\tconst k3d::mesh::indices_t& edge_points = polyhedron->edge_points;\n\t\tconst k3d::mesh::indices_t& clockwise_edges = polyhedron->clockwise_edges;\n\t\t\n\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vbos[primitive->get()]);\n\t\tglBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * edge_points.size() * 2, 0, GL_STATIC_DRAW); // left uninited\n\t\t// init index buffer with indices from edge_points and clockwise_edges\n\t\tGLuint* indices = static_cast<GLuint*>(glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_READ_WRITE)); // map buffer memory in indices\n\t\tfor (size_t i = 0; i < edge_points.size(); ++i)\n\t\t{\n\t\t\tindices[2*i] = static_cast<GLuint>(edge_points[i]);\n\t\t\tindices[2*i + 1] = static_cast<GLuint>(edge_points[clockwise_edges[i]]);\n\t\t}\n\t\tglUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); // release indices\n\t}\n}\n\n///////////////\n// triangle_vbo\n///////////////\n\nvoid triangle_vbo::on_schedule(k3d::inode* Painter)\n{\n\tdelete m_point_vbo;\n\tm_point_vbo = 0;\n\tdelete m_index_vbo;\n\tm_index_vbo = 0;\n\tdelete m_normal_vbo;\n\tm_normal_vbo = 0;\n\tm_indices.clear();\n\tm_corner_to_face.clear();\n\tschedule_data<cached_triangulation>(m_mesh, 0, Painter);\n\tschedule_data<normal_cache>(m_mesh, 0, Painter);\n}\n\nvoid triangle_vbo::on_schedule(k3d::hint::mesh_geometry_changed* Hint, k3d::inode* Painter)\n{\n\tif (m_indices.empty()) // Only set indices once (they are cleared upon execute()\n\t{\n\t\tm_indices = Hint->changed_points;\n\t}\n\tschedule_data<cached_triangulation>(m_mesh, Hint, Painter);\n\tschedule_data<normal_cache>(m_mesh, Hint, Painter);\n}\n\nvoid triangle_vbo::on_execute(const k3d::mesh& Mesh, k3d::inode* Painter)\n{\n\tcached_triangulation& triangle_cache = get_data<cached_triangulation>(&Mesh, Painter);\n\tconst k3d::mesh::points_t& points = triangle_cache.points();\n\t\n\tif (!m_point_vbo) // OpenGL VBO functions may only be called in the drawing context, i.e. during paint_mesh or select_mesh\n\t{\n\t\tm_point_vbo = new vbo();\n\t\tm_indices.clear();\n\t}\n\t\n\tcached_triangulation::index_vectors_t& point_links = triangle_cache.point_links();\n\t\n\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\t\n\tif (m_indices.empty())\n\t{\n\t\tglBufferData(GL_ARRAY_BUFFER, sizeof(points[0]) * points.size(), &points[0], GL_STATIC_DRAW);\n\t}\n\telse\n\t{\n\t\tk3d::point3* vertices = static_cast<k3d::point3*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));\n\t\tfor (k3d::uint_t index = 0; index != m_indices.size(); ++index)\n\t\t{\n\t\t\tk3d::mesh::indices_t triangle_points = point_links[m_indices[index]];\n\t\t\tfor (k3d::uint_t i = 0; i != triangle_points.size(); ++i)\n\t\t\t\tvertices[triangle_points[i]] = points[triangle_points[i]];\n\t\t}\n\t\tglUnmapBuffer(GL_ARRAY_BUFFER);\n\t}\n\t\n\tcached_triangulation::indices_t& triangles = triangle_cache.indices();\n\tcached_triangulation::index_vectors_t& face_points = triangle_cache.face_points();\n\t\n\tif (!m_index_vbo)\n\t{\n\t\tm_index_vbo = new vbo();\n\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *m_index_vbo);\n\t\tglBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * triangles.size(), &triangles[0], GL_STATIC_DRAW);\n\t\tm_corner_to_face.resize(points.size());\n\t\tfor (k3d::uint_t face = 0; face != face_points.size(); ++face)\n\t\t{\n\t\t\tk3d::mesh::indices_t& corners = face_points[face];\n\t\t\tfor (k3d::uint_t i = 0; i != corners.size(); ++i)\n\t\t\t{ \n\t\t\t\tm_corner_to_face[corners[i]] = face;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tif (!m_normal_vbo)\n\t{\n\t\tm_normal_vbo = new vbo();\n\t\tm_indices.clear();\n\t}\n\t\n\tnormal_cache& n_cache = get_data<normal_cache>(&Mesh, Painter);\n\t\n\tglBindBuffer(GL_ARRAY_BUFFER, *m_normal_vbo);\n\tglBufferData(GL_ARRAY_BUFFER, sizeof(k3d::normal3) * points.size(), 0, GL_STATIC_DRAW);\n\tk3d::normal3* normalbuffer = static_cast<k3d::normal3*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));\n\t\n\tif (m_indices.empty())\n\t{\n\t\tfor (k3d::uint_t face = 0; face != face_points.size(); ++face)\n\t\t{\n\t\t\tk3d::mesh::indices_t& corners = face_points[face];\n\t\t\tfor (k3d::uint_t i = 0; i != corners.size(); ++i)\n\t\t\t{ \n\t\t\t\tnormalbuffer[corners[i]] = n_cache.face_normals(Painter).at(face);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (k3d::uint_t index = 0; index != m_indices.size(); ++index) // for all transformed points\n\t\t{\n\t\t\tk3d::mesh::indices_t triangle_points = point_links[m_indices[index]]; // get the associated VBO point indices\n\t\t\tfor (k3d::uint_t i = 0; i != triangle_points.size(); ++i) // For all those associated points (one per face)\n\t\t\t{\n\t\t\t\tk3d::uint_t face = m_corner_to_face[triangle_points[i]]; // Get the face this point belongs to\n\t\t\t\tconst k3d::normal3& n = n_cache.face_normals(Painter).at(face);\n\t\t\t\tk3d::mesh::indices_t& corners = face_points[face];\n\t\t\t\tfor (k3d::uint_t j = 0; j != corners.size(); ++j)\n\t\t\t\t{ \n\t\t\t\t\tnormalbuffer[corners[j]] = n;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tglUnmapBuffer(GL_ARRAY_BUFFER);\n\tm_indices.clear();\n}\n\nvoid triangle_vbo::bind()\n{\n\tif (!glIsBuffer(*m_point_vbo) || !glIsBuffer(*m_index_vbo))\n\t\treturn;\n\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\tglVertexPointer(3, GL_DOUBLE, 0, 0);\n\tglEnableClientState(GL_VERTEX_ARRAY);\n\t\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *m_index_vbo);\n\t\n\tif (glIsBuffer(*m_normal_vbo))\n\t{\n\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_normal_vbo); // activate normals VBO\n\t\tglEnableClientState(GL_NORMAL_ARRAY);\n\t\tglNormalPointer(GL_DOUBLE, 0, 0);\n\t}\n}\n\nvoid triangle_vbo::draw_range(k3d::uint_t Start, k3d::uint_t End, k3d::inode* Painter)\n{\n\tcached_triangulation& triangle_cache = get_data<cached_triangulation>(m_mesh, Painter);\n\tk3d::mesh::indices_t& face_starts = triangle_cache.face_starts();\n\tif (face_starts.empty())\n\t\treturn;\n\tcached_triangulation::indices_t& indices = triangle_cache.indices();\n\tk3d::uint_t startindex = face_starts[Start];\n\tk3d::uint_t endindex = End == (face_starts.size()) ? indices.size() : face_starts[End];\n\tglDrawElements(GL_TRIANGLES, endindex - startindex, GL_UNSIGNED_INT, static_cast<GLuint*>(0) + startindex);\n}\n\n////////////\n// sds_face_vbo\n/////////////\n\n/// Helper class to update the point VBO\nclass update_face_vbo_visitor : public k3d::sds::ipatch_surface_visitor\n{\npublic:\n\tupdate_face_vbo_visitor(k3d::point3* Points) :\n\t\tm_points(Points),\n\t\tm_index(0) \n\t{}\n\tvoid on_vertex(const k3d::point3& Point, const k3d::normal3& Normal)\n\t{\n\t\tmodified_indices.push_back(m_index);\n\t\tm_points[m_index++] = Point;\n\t\tnormals.push_back(Normal); // Unfortunately, we need temp storage for the normals, since we can't map two buffers at once\n\t}\n\tvoid on_edge(const k3d::uint_t PointIndex) {}\n\tvoid on_patch(k3d::uint_t Face) {}\n\tk3d::mesh::indices_t modified_indices;\n\tk3d::mesh::normals_t normals;\nprivate:\n\tk3d::point3* m_points;\n\tk3d::uint_t m_index;\n};\n\n// Create face arrays in case interpolateboundary is not set\nclass face_visitor_no_boundary : public k3d::sds::ipatch_surface_visitor\n{\npublic:\n\tface_visitor_no_boundary(const k3d::mesh::bools_t& BoundaryFaces) : m_boundary_faces(BoundaryFaces), m_ignore_face(false)\n\t{\n\t}\n\tvoid on_vertex(const k3d::point3& Point, const k3d::normal3& Normal)\n\t{\n\t\tpoints_array.push_back(Point);\n\t\tnormals_array.push_back(Normal);\n\t}\n\tvoid on_edge(const k3d::uint_t PointIndex)\n\t{\n\t\tif (m_ignore_face)\n\t\t\treturn;\n\t\tindices.push_back(PointIndex);\n\t}\n\tvirtual void on_patch(k3d::uint_t Face)\n\t{\n\t\tm_ignore_face = m_boundary_faces[Face];\n\t\tface_starts.push_back(indices.size());\n\t}\n\tk3d::mesh::points_t points_array;\n\tk3d::mesh::normals_t normals_array;\n\tstd::vector<GLuint> indices;\n\tk3d::mesh::indices_t face_starts;\n\tconst k3d::mesh::bools_t& m_boundary_faces;\n\tbool m_ignore_face;\n};\n\n/// Helper class to update the point VBO when interpolateboundary is not set\nclass update_face_vbo_visitor_no_boundary : public k3d::sds::ipatch_surface_visitor\n{\npublic:\n\tupdate_face_vbo_visitor_no_boundary(const k3d::mesh::indices_t& FaceStarts, const GLuint* Indices, k3d::point3* Points, const k3d::mesh::bools_t& BoundaryFaces) :\n\t\tm_face_starts(FaceStarts),\n\t\tm_indices(Indices),\n\t\tm_points(Points),\n\t\tm_index(0),\n\t\tm_boundary_faces(BoundaryFaces),\n\t\tm_ignore_face(false)\n\t{}\n\tvoid on_vertex(const k3d::point3& Point, const k3d::normal3& Normal)\n\t{\n\t\tif (m_ignore_face)\n\t\t\treturn;\n\t\tmodified_indices.push_back(m_index);\n\t\tm_points[m_index++] = Point;\n\t\tnormals.push_back(Normal); // Unfortunately, we need temp storage for the normals, since we can't map two buffers at once\n\t}\n\tvoid on_edge(const k3d::uint_t PointIndex) {}\n\tvoid on_patch(k3d::uint_t Face)\n\t{\n\t\tm_ignore_face = m_boundary_faces[Face];\n\t\tif (m_ignore_face)\n\t\t\treturn;\n\t\tm_index = m_indices[m_face_starts[Face]];\n\t}\n\tk3d::mesh::indices_t modified_indices;\n\tk3d::mesh::normals_t normals;\nprivate:\n\tconst k3d::mesh::indices_t& m_face_starts;\n\tconst GLuint* m_indices;\n\tk3d::point3* m_points;\n\tk3d::uint_t m_index;\n\tconst k3d::mesh::bools_t& m_boundary_faces;\n\tbool m_ignore_face;\n};\n\ntypedef k3d::typed_array<std::string> tags_t;\n\nvoid sds_face_vbo::update(const k3d::mesh::primitive* Primitive, const k3d::uint_t Level, sds_cache& Cache)\n{\n\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*Primitive));\n\treturn_if_fail(polyhedron && k3d::polyhedron::is_sds(*polyhedron));\n\tif (!m_point_vbo) // new cache -> completely regenerate the VBOs\n\t{\n\t\tif(polyhedron->constant_attributes.lookup<tags_t>(\"interpolateboundary\"))\n\t\t{\n\t\t\tface_visitor visitor(Cache.point_count(), Cache.edge_count(Primitive), polyhedron->face_first_loops.size());\n\t\t\tCache.visit_surface(Primitive, Level, visitor);\n\t\t\t\n\t\t\tm_point_vbo = new vbo();\n\t\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\t\t\tglBufferData(GL_ARRAY_BUFFER, sizeof(visitor.points_array[0]) * visitor.points_array.size(), &visitor.points_array[0], GL_STATIC_DRAW);\n\t\t\t\n\t\t\tm_normal_vbo = new vbo();\n\t\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_normal_vbo);\n\t\t\tglBufferData(GL_ARRAY_BUFFER, sizeof(visitor.normals_array[0]) * visitor.normals_array.size(), &visitor.normals_array[0], GL_STATIC_DRAW);\n\t\t\t\n\t\t\tm_index_vbo = new vbo();\n\t\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *m_index_vbo);\n\t\t\tglBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(visitor.indices[0]) * visitor.indices.size(), &visitor.indices[0], GL_STATIC_DRAW);\n\t\t\t\n\t\t\tface_starts = visitor.face_starts;\n\t\t\tindex_size = visitor.indices.size();\n\t\t}\n\t\telse // interpolateboundary not set\n\t\t{\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->edge_points, polyhedron->clockwise_edges, m_boundary_edges, m_companions);\n\t\t\tk3d::polyhedron::create_boundary_face_lookup(polyhedron->face_first_loops, polyhedron->face_loop_counts, polyhedron->loop_first_edges, polyhedron->clockwise_edges, m_boundary_edges, m_companions, boundary_faces);\n\t\t\t\n\t\t\tface_visitor_no_boundary visitor(boundary_faces);\n\t\t\tCache.visit_surface(Primitive, Level, visitor);\n\t\t\t\n\t\t\tm_point_vbo = new vbo();\n\t\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\t\t\tglBufferData(GL_ARRAY_BUFFER, sizeof(visitor.points_array[0]) * visitor.points_array.size(), &visitor.points_array[0], GL_STATIC_DRAW);\n\t\t\t\n\t\t\tm_normal_vbo = new vbo();\n\t\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_normal_vbo);\n\t\t\tglBufferData(GL_ARRAY_BUFFER, sizeof(visitor.normals_array[0]) * visitor.normals_array.size(), &visitor.normals_array[0], GL_STATIC_DRAW);\n\t\t\t\n\t\t\tm_index_vbo = new vbo();\n\t\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *m_index_vbo);\n\t\t\tglBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(visitor.indices[0]) * visitor.indices.size(), &visitor.indices[0], GL_STATIC_DRAW);\n\t\t\t\n\t\t\tface_starts = visitor.face_starts;\n\t\t\tindex_size = visitor.indices.size();\n\t\t}\n\t}\n\telse // Only update the point VBO with new positions\n\t{\n\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\t\tk3d::point3* points = static_cast<k3d::point3*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));\n\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *m_index_vbo);\n\t\tGLuint* indices = static_cast<GLuint*>(glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_READ_ONLY));\n\t\n\t\tupdate_face_vbo_visitor visitor(points);\n\t\tCache.visit_surface(Primitive, Level, visitor);\n\t\t\n\t\tglUnmapBuffer(GL_ARRAY_BUFFER);\n\t\tglUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);\n\t\t\n\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_normal_vbo);\n\t\tk3d::normal3* normals = static_cast<k3d::normal3*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));\n\t\tfor(k3d::uint_t i = 0; i != visitor.modified_indices.size(); ++i)\n\t\t\tnormals[visitor.modified_indices[i]] = visitor.normals[i];\n\t\t\n\t\tglUnmapBuffer(GL_ARRAY_BUFFER);\n\t}\n}\n\nvoid sds_face_vbo::bind()\n{\n\tif (!glIsBuffer(*m_point_vbo) || !glIsBuffer(*m_index_vbo))\n\t\treturn;\n\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\tglVertexPointer(3, GL_DOUBLE, 0, 0);\n\tglEnableClientState(GL_VERTEX_ARRAY);\n\t\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *m_index_vbo);\n\t\n\tif (glIsBuffer(*m_normal_vbo))\n\t{\n\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_normal_vbo); // activate normals VBO\n\t\tglEnableClientState(GL_NORMAL_ARRAY);\n\t\tglNormalPointer(GL_DOUBLE, 0, 0);\n\t}\n}\n\n/////////////\n// sds_edge_vbo\n/////////////\n\n/// Helper class to update the point VBO\nclass update_edge_vbo_visitor : public k3d::sds::ipatch_boundary_visitor\n{\npublic:\n\tupdate_edge_vbo_visitor(const k3d::mesh::indices_t& EdgeStarts,\n\t\t\tk3d::point3* Points) :\n\t\tm_edge_starts(EdgeStarts),\n\t\tm_points(Points),\n\t\tm_index(0)\n\t{}\n\tvoid on_point(const k3d::point3& Point)\n\t{\n\t\tm_points[m_index++] = Point;\n\t}\n\tvoid on_boundary(const k3d::uint_t Edge)\n\t{\n\t\tm_index = m_edge_starts[Edge];\n\t}\nprivate:\n\tconst k3d::mesh::indices_t& m_edge_starts;\n\tk3d::point3* m_points;\n\tk3d::uint_t m_index;\n\tk3d::uint_t m_edge;\n};\n\nvoid sds_edge_vbo::update(const k3d::mesh::primitive* Primitive, const k3d::uint_t Level, sds_cache& Cache)\n{\n\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*Primitive));\n\treturn_if_fail(polyhedron && k3d::polyhedron::is_sds(*polyhedron));\n\tif (!m_point_vbo) // new cache -> completely regenerate the VBOs\n\t{\n\t\tedge_visitor visitor(polyhedron->edge_points.size());\n\t\tCache.visit_boundary(Primitive, Level, visitor);\n\t\t\n\t\tm_point_vbo = new vbo();\n\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\t\tglBufferData(GL_ARRAY_BUFFER, sizeof(visitor.points_array[0]) * visitor.points_array.size(), &visitor.points_array[0], GL_STATIC_DRAW);\n\t\t\n\t\tedge_starts = visitor.edge_starts;\n\t\tindex_size = visitor.points_array.size();\n\t}\n\telse // Only update the point VBO with new positions\n\t{\n\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\t\tk3d::point3* points = static_cast<k3d::point3*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));\n\t\t\n\t\tupdate_edge_vbo_visitor visitor(edge_starts, points);\n\t\tCache.visit_boundary(Primitive, Level, visitor);\n\t\t\n\t\tglUnmapBuffer(GL_ARRAY_BUFFER);\n\t}\n}\n\nvoid sds_edge_vbo::bind()\n{\n\tif (!glIsBuffer(*m_point_vbo))\n\t\treturn;\n\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\tglVertexPointer(3, GL_DOUBLE, 0, 0);\n\tglEnableClientState(GL_VERTEX_ARRAY);\n}\n\n/////////////\n// sds_point_vbo\n/////////////\n\n/// Helper class to update the point VBO\nclass update_point_vbo_visitor : public k3d::sds::ipatch_corner_visitor\n{\npublic:\n\tupdate_point_vbo_visitor(k3d::point3* Points) :\n\t\tm_points(Points),\n\t\tm_index(0)\n\t{}\n\tvoid on_corner(const k3d::point3& Point)\n\t{\n\t\tm_points[m_index++] = Point;\n\t}\nprivate:\n\tk3d::point3* m_points;\n\tk3d::uint_t m_index;\n};\n\nvoid sds_point_vbo::update(const k3d::mesh::primitive* Primitive, const k3d::uint_t Level, sds_cache& Cache)\n{\n\tif (!m_point_vbo) // new cache -> completely regenerate the VBOs\n\t{\n\t\tpoint_visitor visitor;\n\t\tCache.visit_corners(Primitive, Level, visitor);\n\t\t\n\t\tm_point_vbo = new vbo();\n\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\t\tglBufferData(GL_ARRAY_BUFFER, sizeof(visitor.points_array[0]) * visitor.points_array.size(), &visitor.points_array[0], GL_STATIC_DRAW);\n\t\t\n\t\tindex_size = visitor.points_array.size();\n\t}\n\telse // Only update the point VBO with new positions\n\t{\n\t\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\t\tk3d::point3* points = static_cast<k3d::point3*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));\n\t\t\n\t\tupdate_point_vbo_visitor visitor(points);\n\t\tCache.visit_corners(Primitive, Level, visitor);\n\t\t\n\t\tglUnmapBuffer(GL_ARRAY_BUFFER);\n\t}\n}\n\nvoid sds_point_vbo::bind()\n{\n\tif (!glIsBuffer(*m_point_vbo))\n\t\treturn;\n\tglBindBuffer(GL_ARRAY_BUFFER, *m_point_vbo);\n\tglVertexPointer(3, GL_DOUBLE, 0, 0);\n\tglEnableClientState(GL_VERTEX_ARRAY);\n}\n\n///////////////\n// Convenience functions\n//////////////\n\nvoid clean_vbo_state()\n{\n\tglDisableClientState(GL_VERTEX_ARRAY);\n\tglDisableClientState(GL_COLOR_ARRAY);\n\tglDisableClientState(GL_SECONDARY_COLOR_ARRAY);\n\tglDisableClientState(GL_INDEX_ARRAY);\n\tglDisableClientState(GL_NORMAL_ARRAY);\n\tglDisableClientState(GL_FOG_COORDINATE_ARRAY);\n\tglDisableClientState(GL_TEXTURE_COORD_ARRAY);\n\tglDisableClientState(GL_EDGE_FLAG_ARRAY);\n\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/vbo.h",
    "content": "#ifndef MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_VBO_H\n#define MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_VBO_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Helper functions and classes to manage a global data cache for the mesh painters\n * \t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n#include <list>\n#include <map>\n#include <set>\n\n#include <k3dsdk/gl.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/subdivision_surface/catmull_clark.h>\n\n#include \"cached_triangulation.h\"\n#include \"painter_cache.h\"\n#include \"sds_cache.h\"\n#include \"selection_cache.h\"\n\n#include <boost/ptr_container/ptr_map.hpp>\n\n#include <stdexcept>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\ntypedef std::map<size_t, size_t> indexmap_t;\ntypedef std::multimap<size_t, size_t> indexmultimap_t;\ntypedef std::list<size_t> indexlist_t;\n\n/// Exception for VBO-related errors\nclass vbo_exception : public std::runtime_error\n{\n\ttypedef std::runtime_error base;\npublic:\n\tvbo_exception(const std::string& Message) : base(\"VBO error: \" + Message) {} \n};\n\n/// Convenience wrapper for OpenGL vertex buffer objects\nclass vbo\n{\npublic:\n\tvbo();\n\t~vbo();\n\t/// Implicit conversion so we can use a vbo instance as an argument to OpenGL functions\n\toperator GLuint() const;\nprivate:\n\tvbo(const vbo&);\n\tvbo& operator=(const vbo&);\n\n\tGLuint m_name;\n};\n\ntypedef boost::ptr_map<const k3d::mesh::primitive*, vbo> vbos_t;\n\n/// Keep track of point position data in a VBO\nclass point_vbo : public scheduler\n{\npublic:\n\tpoint_vbo(const k3d::mesh* const Mesh) : m_vbo(0) {}\n\t/// Bind the internal VBO for usage by the array drawing commands\n\tvoid bind();\nprotected:\n\t/// Implements the scheduling phase of a point position update\n\tvoid on_schedule(k3d::inode* Painter);\n\tvoid on_schedule(k3d::hint::mesh_geometry_changed* Hint, k3d::inode* Painter);\n\t\n\t/// Executes the point position update\n\tvirtual void on_execute(const k3d::mesh& Mesh, k3d::inode* Painter);\nprivate:\n\t/// Stores the data itself\n\tvbo* m_vbo;\n\t\n\t/// Stores the modified point indices provided by the hint\n\tk3d::mesh::indices_t m_indices;\n};\n\n/// Keep track of edge indices in a VBO\nclass edge_vbo : public scheduler\n{\npublic:\n\tedge_vbo(const k3d::mesh* const Mesh) {}\n\t/// Bind the internal VBO for usage by the array drawing commands\n\tvoid bind(const k3d::mesh::primitive* Primitive);\nprotected:\n\tvoid on_schedule(k3d::inode* Painter);\n\t/// Creates the edge vbo\n\tvirtual void on_execute(const k3d::mesh& Mesh, k3d::inode* Painter);\nprivate:\n\t/// Stores the data itself\n\tvbos_t m_vbos;\n};\n\n/// VBOs used to paint a triangulated mesh\nclass triangle_vbo : public scheduler\n{\npublic:\n\ttriangle_vbo(const k3d::mesh* const Mesh) : m_point_vbo(0), m_index_vbo(0), m_normal_vbo(0), m_mesh(Mesh) {}\n\t~triangle_vbo()\n\t{\n\t\tdelete m_point_vbo;\n\t\tdelete m_normal_vbo;\n\t\tdelete m_index_vbo;\n\t}\n\t\n\t/// Bind the buffers for drawing\n\tvoid bind();\n\t\n\t/// Draw faces with original mesh indices Start to End\n\tvoid draw_range(k3d::uint_t Start, k3d::uint_t End, k3d::inode* Painter);\nprotected:\n\tvoid on_schedule(k3d::inode* Painter);\n\tvoid on_schedule(k3d::hint::mesh_geometry_changed* Hint, k3d::inode* Painter);\n\tvoid on_execute(const k3d::mesh& Mesh, k3d::inode* Painter);\nprivate:\n\tvbo* m_point_vbo;\n\tvbo* m_index_vbo;\n\tvbo* m_normal_vbo;\n\tk3d::mesh::indices_t m_indices;\n\t// For each triangle corner, store the face it belongs to (used for flat normal calculation)\n\tk3d::mesh::indices_t m_corner_to_face;\n\tconst k3d::mesh* const m_mesh;\n};\n\n/// Keep track of the SDS VBOs per level\ntemplate<class component_t> class sds_vbo : public scheduler\n{\npublic:\n\tsds_vbo(const k3d::mesh* const Mesh) : m_mesh(Mesh) {}\n\t\n\t~sds_vbo()\n\t{\n\t\tfor (typename connections_t::iterator connection = m_changed_connections.begin(); connection != m_changed_connections.end(); ++connection)\n\t\t{\n\t\t\tconnection->second.disconnect();\n\t\t\tm_deleted_connections[connection->first].disconnect();\n\t\t}\n\t\tm_changed_connections.clear();\n\t\tm_deleted_connections.clear();\n\t}\n\t\n\t/// Binds the vbo's at the given level\n\tvoid bind(k3d::uint_t Level, k3d::inode* Painter, const k3d::mesh::primitive* Primitive)\n\t{\n\t\tcache(Level, Painter, Primitive).bind();\n\t}\n\t\n\t/// Get the cache at the requested level\n\tcomponent_t& cache(k3d::uint_t Level, k3d::inode* Painter, const k3d::mesh::primitive* Primitive)\n\t{\n\t\tcaches_per_level_t& caches = m_caches[Primitive];\n\t\tstd::pair<typename caches_per_level_t::iterator, bool> result = caches.insert(std::make_pair(Level, component_t()));\n\t\tif (result.second)\n\t\t\tresult.first->second.update(Primitive, Level, get_data<sds_cache>(m_mesh, Painter));\n\t\treturn caches[Level];\n\t}\n\t\nprotected:\n\t\n\tvoid on_execute(const k3d::mesh& Mesh, k3d::inode* Painter)\n\t{\n\t\treturn_if_fail(Painter);\n\t\tk3d::int32_t level = k3d::property::pipeline_value<k3d::int32_t>(*Painter, \"levels\");\n\t\tsds_cache& cache = get_data<sds_cache>(&Mesh, Painter);\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get() || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\t\t\tcaches_per_level_t& caches = m_caches[primitive->get()];\n\t\t\tcaches.insert(std::make_pair(level, component_t())).first->second.update(primitive->get(), level, cache);\n\t\t}\n\t}\n\t\n\tvoid on_schedule(k3d::inode* Painter) \n\t{\n\t\tclear();\n\t\tregister_painter(Painter);\n\t\tschedule_data<sds_cache>(m_mesh, 0, Painter);\n\t}\n\tvoid on_schedule(k3d::hint::mesh_geometry_changed* Hint, k3d::inode* Painter)\n\t{\n\t\tregister_painter(Painter);\n\t\tschedule_data<sds_cache>(m_mesh, Hint, Painter);\n\t}\n\tvoid on_schedule(k3d::hint::selection_changed* Hint, k3d::inode* Painter)\n\t{\n\t\tregister_painter(Painter);\n\t\tschedule_data<sds_cache>(m_mesh, Hint, Painter);\n\t}\nprivate:\n\tvoid clear(k3d::ihint* Hint = 0)\n\t{\n\t\tm_caches.clear();\n\t}\n\t\n\tvoid register_painter(k3d::inode* Painter)\n\t{\n\t\tk3d::iproperty* property = k3d::property::get(*Painter, \"levels\");\n\t\tif (property)\n\t\t{\n\t\t\tif (m_changed_connections.find(Painter) == m_changed_connections.end())\n\t\t\t\tm_changed_connections[Painter] = property->property_changed_signal().connect(sigc::mem_fun(*this, &sds_vbo::clear));\n\t\t\tif (m_deleted_connections.find(Painter) == m_deleted_connections.end())\n\t\t\t\tm_deleted_connections[Painter] = Painter->deleted_signal().connect(sigc::bind(sigc::mem_fun(*this, &sds_vbo::remove_painter), Painter));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tk3d::log() << error << \"sds_cache: failed to register property \\\"levels\\\"\" << std::endl;\n\t\t}\n\t}\n\t\n\tvoid remove_painter(k3d::inode* Painter)\n\t{\n\t\tm_changed_connections[Painter].disconnect();\n\t\tm_deleted_connections[Painter].disconnect();\n\t\tm_changed_connections.erase(Painter);\n\t\tm_deleted_connections.erase(Painter);\n\t\tclear();\n\t}\n\t\n\t// store connections for safe deletion of cache\n\ttypedef std::map<k3d::inode*, sigc::connection> connections_t;\n\tconnections_t m_changed_connections; // connections to changed_signals\n\tconnections_t m_deleted_connections; // connections to deleted_signals\n\ttypedef std::map<k3d::uint_t, component_t> caches_per_level_t;\n\ttypedef std::map<const k3d::mesh::primitive*, caches_per_level_t> caches_t;\n\tcaches_t m_caches; // stores an sds_vbo cache per level\n\tconst k3d::mesh* const m_mesh;\n};\n\n/// Cache SDS face VBOs\nclass sds_face_vbo\n{\npublic:\n\tsds_face_vbo() : m_point_vbo(0), m_index_vbo(0), m_normal_vbo(0) {}\n\t~sds_face_vbo()\n\t{\n\t\tdelete m_point_vbo;\n\t\tdelete m_normal_vbo;\n\t\tdelete m_index_vbo;\n\t}\n\t\n\t/// Update the cache using the supplied sds cache\n\tvoid update(const k3d::mesh::primitive* Primitive, const k3d::uint_t Level, sds_cache& Cache);\n\t\n\t/// Bind the VBOs\n\tvoid bind();\n\t\n\t/// Start indices for the faces\n\tk3d::mesh::indices_t face_starts;\n\t\n\t/// Length of the index buffer\n\tk3d::uint_t index_size;\n\t\n\t/// Indicates if a face is on the boundary\n\tk3d::mesh::bools_t boundary_faces;\n\t\nprivate:\n\tvbo* m_point_vbo;\n\tvbo* m_index_vbo;\n\tvbo* m_normal_vbo;\n\tk3d::mesh::indices_t m_companions;\n\tk3d::mesh::bools_t m_boundary_edges;\n};\n\n/// Cache SDS edge VBOs\nclass sds_edge_vbo\n{\npublic:\n\tsds_edge_vbo() : m_point_vbo(0) {}\n\t~sds_edge_vbo()\n\t{\n\t\tdelete m_point_vbo;\n\t}\n\t\n\t/// Update the cache using the supplied sds cache\n\tvoid update(const k3d::mesh::primitive* Primitive, const k3d::uint_t Level, sds_cache& Cache);\n\t\n\t/// Bind the VBOs\n\tvoid bind();\n\t\n\t/// Start indices for the edges\n\tk3d::mesh::indices_t edge_starts;\n\t\n\t/// Length of the index buffer\n\tk3d::uint_t index_size;\n\t\nprivate:\n\tvbo* m_point_vbo;\n};\n\n/// Cache SDS point VBOs\nclass sds_point_vbo\n{\npublic:\n\tsds_point_vbo() : m_point_vbo(0) {}\n\t~sds_point_vbo()\n\t{\n\t\tdelete m_point_vbo;\n\t}\n\t\n\t/// Update the cache using the supplied sds cache\n\tvoid update(const k3d::mesh::primitive* Primitive, const k3d::uint_t Level, sds_cache& Cache);\n\t\n\t/// Bind the VBOs\n\tvoid bind();\n\t\n\t/// Length of the index buffer\n\tk3d::uint_t index_size;\n\t\nprivate:\n\tvbo* m_point_vbo;\n};\n\n//////////////\n// Convenience functions  and types for functionality used by several mesh painters\n/////////////\n\n/// Clean VBO state. Call before and after VBO command sequence to ensure OpenGL state consistancy across painters\nvoid clean_vbo_state();\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n#endif // !MODULES_ADVANCED_OPENGL_PAINTERS_ATTIC_VBO_H\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/vbo_edge_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Paint edges using a VBO\n */\n\n#include \"colored_selection_painter_gl.h\"\n#include \"normal_cache.h\"\n#include \"utility.h\"\n#include \"vbo.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n\t/////////////////////////////////////////////////////////////////////////////\n// vbo_edge_painter\n\nclass vbo_edge_painter :\n\tpublic colored_selection_painter\n{\n\ttypedef colored_selection_painter base;\npublic:\n\tvbo_edge_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\t\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\treturn_if_fail(k3d::gl::extension::query_vbo());\n\n\t\tif(!has_non_empty_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\n\t\tconst color_t color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst color_t selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglDisable(GL_LIGHTING);\n\t\t\n\t\tenable_blending();\n\t\t\n\t\tclean_vbo_state();\n\t\t\n\t\tedge_selection& selected_edges = get_data<edge_selection>(&Mesh, this);\n\t\t\n\t\tget_data<point_vbo>(&Mesh, this).bind();\n\t\t\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\n\t\t\tget_data<edge_vbo>(&Mesh, this).bind(primitive->get());\n\nassert_not_implemented();\n/*\n\t\t\tconst k3d::uint_t edge_count = polyhedron->edge_points.size();\n\t\t\tconst selection_records_t& edge_selection_records = selected_edges.records(primitive->get());\n\t\t\tif (!edge_selection_records.empty())\n\t\t\t{\n\t\t\t\tfor (selection_records_t::const_iterator record = edge_selection_records.begin(); record != edge_selection_records.end(); ++record)\n\t\t\t\t{\n\t\t\t\t\tcolor4d(record->weight ? selected_color : color);\n\t\t\t\t\tsize_t start = record->begin * 2;\n\t\t\t\t\tsize_t end = record->end;\n\t\t\t\t\tend = end > edge_count ? edge_count : end;\n\t\t\t\t\tend *= 2;\n\t\t\t\t\tsize_t count = end - start;\n\t\t\t\t\tglDrawElements(GL_LINES, count, GL_UNSIGNED_INT, static_cast<GLuint*>(0) + start);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcolor4d(color);\n\t\t\t\tglDrawElements(GL_LINES, polyhedron->edge_points.size() * 2, GL_UNSIGNED_INT, 0);\n\t\t\t}\n*/\n\t\t}\n\t\t\n\t\tclean_vbo_state();\n\t\tdisable_blending();\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\treturn_if_fail(k3d::gl::extension::query_vbo());\n\n\t\tif(!has_non_empty_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\t\n\t\tif (!SelectionState.select_split_edges)\n\t\t\treturn;\n\t\t\n\t\tk3d::gl::store_attributes attributes;\n\t\tglDisable(GL_LIGHTING);\n\n\t\tclean_vbo_state();\n\t\t\n\t\tget_data<point_vbo>(&Mesh, this).bind();\n\t\t\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\n\t\t\tget_data<edge_vbo>(&Mesh, this).bind(primitive->get());\n\t\t\t\n\t\t\tconst k3d::mesh::indices_t& edge_points = polyhedron->edge_points;\n\t\t\tconst k3d::mesh::indices_t& clockwise_edges = polyhedron->clockwise_edges;\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\t\t\n\t\t\tconst size_t edge_count = polyhedron->edge_points.size();\n\t\t\tfor(size_t edge = 0; edge < edge_count; ++edge)\n\t\t\t{\n\t\t\t\tif (SelectionState.select_backfacing || \n\t\t\t\t\t\t(!SelectionState.select_backfacing && \n\t\t\t\t\t\t\t\t!backfacing(points[edge_points[edge]] * RenderState.matrix, RenderState.camera, get_data<normal_cache>(&Mesh, this).point_normals(this).at(edge_points[edge]))\n\t\t\t\t\t\t\t\t&& !backfacing(points[edge_points[clockwise_edges[edge]]] * RenderState.matrix, RenderState.camera, get_data<normal_cache>(&Mesh, this).point_normals(this).at(edge_points[clockwise_edges[edge]]))))\n\t\t\t\t{\n\t\t\t\t\tk3d::gl::push_selection_token(k3d::selection::SPLIT_EDGE, edge);\n\t\t\n\t\t\t\t\tglDrawElements(GL_LINES, 2, GL_UNSIGNED_INT, static_cast<GLuint*>(0) + 2*edge);\n\t\t\n\t\t\t\t\tk3d::gl::pop_selection_token();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tclean_vbo_state();\n\t}\n\t\n\tvoid on_mesh_changed(const k3d::mesh& Mesh, k3d::ihint* Hint)\n\t{\n\t\treturn_if_fail(k3d::gl::extension::query_vbo());\n\t\t\n\t\tif(!has_non_empty_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\n\t\tschedule_data<point_vbo>(&Mesh, Hint, this);\n\t\tschedule_data<edge_vbo>(&Mesh, Hint, this);\n\t\tschedule_data<edge_selection>(&Mesh, Hint, this);\n\t\tschedule_data<normal_cache>(&Mesh, Hint, this);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<vbo_edge_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\t\tk3d::uuid(0x7fca3f65, 0x531b4db6, 0xa11dac8a, 0x0b9f17b1),\n\t\t\"OpenGLVBOEdgePainter\",\n\t\t_(\"Renders mesh edges (OpenGL VBOs)\"),\n\t\t\"OpenGL Painter\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n\t/////////////////////////////////////////////////////////////////////////////\n// vbo_edge_painter_factory\n\n\tk3d::iplugin_factory& vbo_edge_painter_factory()\n\t{\n\t\treturn vbo_edge_painter::get_factory();\n\t}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/vbo_face_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Painter that triangulates its input first\n * \t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n#include \"cached_triangulation.h\"\n#include \"colored_selection_painter_gl.h\"\n#include \"utility.h\"\n#include \"vbo.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/array.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// vbo_face_painter\n\nclass vbo_face_painter :\n\tpublic colored_selection_painter\n{\n\ttypedef colored_selection_painter base;\n\npublic:\n\tvbo_face_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::color(0.2,0.2,0.2), k3d::color(0.6,0.6,0.6))\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\treturn_if_fail(k3d::gl::extension::query_vbo());\n\n\t\tif(!has_non_sds_polyhedra(Mesh))\n\t\t\treturn;\n\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\tk3d::gl::set(GL_CULL_FACE, RenderState.draw_two_sided);\n\n\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\tglPolygonOffset(1.0, 1.0);\n\t\t\n\t\tenable_blending();\n\t\t\n\t\tconst color_t color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst color_t selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\t\t\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Triangulate\");\n\t\ttriangle_vbo& vbos = get_data<triangle_vbo>(&Mesh, this);\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Triangulate\");\n\t\tface_selection& selected_faces = get_data<face_selection>(&Mesh, this);\n\t\t\n\t\tk3d::uint_t face_offset = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get() || k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\t\t\n\t\t\tconst k3d::uint_t face_count = polyhedron->face_first_loops.size();\n\t\t\tconst selection_records_t& face_selection_records = selected_faces.records(primitive->get());\n\t\t\t\n\t\t\tglEnable(GL_LIGHTING);\n\t\t\t\n\t\t\tclean_vbo_state();\n\nassert_not_implemented();\n/*\n\t\t\tvbos.bind();\n\t\t\tif (!face_selection_records.empty())\n\t\t\t{\n\t\t\t\tfor (selection_records_t::const_iterator record = face_selection_records.begin(); record != face_selection_records.end() && record->begin < face_count; ++record)\n\t\t\t\t{ // color by selection\n\t\t\t\t\tconst color_t& face_color = record->weight ? selected_color : color;\n\t\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, k3d::color(face_color.red, face_color.green, face_color.blue), face_color.alpha);\n\t\t\t\t\tsize_t start = record->begin + face_offset;\n\t\t\t\t\tsize_t end = record->end;\n\t\t\t\t\tend = end > face_count ? face_count : end;\n\t\t\t\t\tend += face_offset;\n\t\t\t\t\tvbos.draw_range(start, end, this);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{ // empty selection, everything has the same color\n\t\t\t\tcolor4d(color);\n\t\t\t\tvbos.draw_range(face_offset, face_count + face_offset, this);\n\t\t\t}\n\t\t\tface_offset += face_count;\n*/\n\t\t}\n\t\t\n\t\tclean_vbo_state();\n\t\tdisable_blending();\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\treturn_if_fail(k3d::gl::extension::query_vbo());\n\n\t\tif(!has_non_sds_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\t\n\t\tif (!SelectionState.select_uniform)\n\t\t\treturn;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\t\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\tk3d::gl::set(GL_CULL_FACE, !SelectionState.select_backfacing);\n\n\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\tglPolygonOffset(1.0, 1.0);\n\t\t\n\t\ttriangle_vbo& vbos = get_data<triangle_vbo>(&Mesh, this);\n\t\t\n\t\tclean_vbo_state();\n\t\t\n\t\tvbos.bind();\n\t\t\n\t\tk3d::uint_t face_offset = 0;\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get() || k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\t\t\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tconst k3d::uint_t face_count = polyhedron->face_first_loops.size();\n\t\t\tfor(k3d::uint_t poly_face = 0; poly_face != face_count; ++poly_face)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::UNIFORM, poly_face);\n\t\n\t\t\t\tconst k3d::uint_t face = poly_face + face_offset;\n\t\t\t\tvbos.draw_range(face, face+1, this);\n\t\n\t\t\t\tk3d::gl::pop_selection_token(); // UNIFORM\n\t\t\t}\n\t\t\tface_offset += face_count;\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t\t\n\t\tclean_vbo_state();\n\t}\n\t\n\tvoid on_mesh_changed(const k3d::mesh& Mesh, k3d::ihint* Hint)\n\t{\n\t\treturn_if_fail(k3d::gl::extension::query_vbo());\n\t\t\n\t\tif(!has_non_sds_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\n\t\tschedule_data<triangle_vbo>(&Mesh, Hint, this);\n\t\tschedule_data<face_selection>(&Mesh, Hint, this);\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<vbo_face_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x2f953308, 0xc8474bc9, 0x6d58bba7, 0x0355bcfe),\n\t\t\t\"OpenGLVBOFacePainter\",\n\t\t\t_(\"Renders mesh faces, after trianglulating them (OpenGL VBOs)\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// vbo_face_painter_factory\n\nk3d::iplugin_factory& vbo_face_painter_factory()\n{\n\treturn vbo_face_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/vbo_point_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Paint points using a VBO\n */\n\n#include \"vbo_colored_selection_painter_gl.h\"\n//#include \"normal_cache.h\"\n//#include \"utility.h\"\n#include \"painter_cache.h\"\n#include \"vbo.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n\t/////////////////////////////////////////////////////////////////////////////\n// vbo_point_painter\n\nclass vbo_point_painter :\n\tpublic vbo_colored_selection_painter\n{\n\ttypedef vbo_colored_selection_painter base;\n\npublic:\n\tvbo_point_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\t\t\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\treturn_if_fail(k3d::gl::extension::query_vbo());\n\n\t\tif(!Mesh.points || Mesh.points->empty())\n\t\t\treturn;\n\n\t\tconst point_data& data = get_cached_data<point_vbo>(Mesh.points.get(), ChangedSignal).value(Mesh);\n\t\tbind_vertex_buffer(data.points);\n\t\tbind_texture_buffer(data.selection);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDrawArrays(GL_POINTS, 0, Mesh.points->size());\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\treturn_if_fail(k3d::gl::extension::query_vbo());\n\n\t\tif(!Mesh.points || Mesh.points->empty())\n\t\t\treturn;\n\n\t\tif (!SelectionState.select_component.count(k3d::selection::POINT))\n\t\t\treturn;\n\n\t\tbind_vertex_buffer(get_cached_data<point_vbo>(Mesh.points.get(), ChangedSignal).value(Mesh).points);\n\n\t\tglDisable(GL_LIGHTING);\n\n\t\tconst size_t point_count = Mesh.points->size();\n\t\tfor(size_t point = 0; point != point_count; ++point)\n\t\t{\n\t\t\t//TODO: restore backfacing selection\n//\t\t\tif (!valid_polyhedra || SelectionState.select_backfacing ||\n//\t\t\t\t\t(!SelectionState.select_backfacing &&\n//\t\t\t\t\t\t\t!backfacing(Mesh.points->at(point) * RenderState.matrix,RenderState.camera, get_data<normal_cache>(&Mesh, this).point_normals(this).at(point))))\n//\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::POINT, point);\n\n\t\t\t\tglBegin(GL_POINTS);\n\t\t\t\tglArrayElement(point);\n\t\t\t\tglEnd();\n\n\t\t\t\tk3d::gl::pop_selection_token(); // k3d::selection::POINT\n\t\t\t//}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<vbo_point_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\t\tk3d::uuid(0xe2495ce1, 0x0c4c42eb, 0x81142404, 0x3c25889e),\n\t\t\"OpenGLVBOPointPainter\",\n\t\t_(\"Renders mesh points (OpenGL VBOs)\"),\n\t\t\"OpenGL Painter\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n\t/////////////////////////////////////////////////////////////////////////////\n// vbo_point_painter_factory\n\n\tk3d::iplugin_factory& vbo_point_painter_factory()\n\t{\n\t\treturn vbo_point_painter::get_factory();\n\t}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/attic/vbo_sds_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file SDS painters\n */\n\n#include \"colored_selection_painter_gl.h\"\n#include \"sds_cache.h\"\n#include \"selection_cache.h\"\n#include \"utility.h\"\n#include \"vbo.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n\t/////////////////////////////////////////////////////////////////////////////\n// vbo_sds_painter\n\ntemplate <typename selection_t, typename vbo_t>\nclass vbo_sds_painter :\n\tpublic colored_selection_painter\n{\n\ttypedef colored_selection_painter base;\n\npublic:\n\tvbo_sds_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document, const k3d::color Unselected = k3d::color(0.2,0.2,0.2), const k3d::color Selected = k3d::color(0.6,0.6,0.6)) :\n\t\tbase(Factory, Document, Unselected, Selected),\n\t\tm_levels(init_owner(*this) + init_name(\"levels\") + init_label(_(\"Levels\")) + init_description(_(\"Number of SDS levels\")) + init_value(2) + init_constraint(constraint::minimum<k3d::int32_t>(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_levels.changed_signal().connect(sigc::mem_fun(*this, &vbo_sds_painter<selection_t, vbo_t>::on_levels_changed));\n\t}\n\t\n\tvoid on_levels_changed(k3d::ihint* Hint)\n\t{\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\t\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!has_sds_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\n\t\tsds_vbo<vbo_t>& vbo_cache = get_data<sds_vbo<vbo_t> >(&Mesh, this);\n\t\t\n\t\tk3d::gl::store_attributes attributes;\n\t\t\n\t\tenable_blending();\n\t\tclean_vbo_state();\n\t\tk3d::uint_t levels = m_levels.pipeline_value();\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get() || k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\t\t\tvbo_cache.bind(levels, this, primitive->get());\n\t\t\tdraw(primitive->get(), vbo_cache.cache(levels, this, primitive->get()), get_data<selection_t>(&Mesh, this), RenderState);\n\t\t}\n\t\tclean_vbo_state();\n\t\tdisable_blending();\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!has_sds_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\n\t\tsds_vbo<vbo_t>& cache = get_data<sds_vbo<vbo_t> >(&Mesh, this);\n\t\t\n\t\tk3d::gl::store_attributes attributes;\n\t\t\n\t\tclean_vbo_state();\n\t\tk3d::uint_t levels = m_levels.pipeline_value();\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get() || k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\t\t\tcache.bind(levels, this, primitive->get());\n\t\t\tselect(cache.cache(levels, this, primitive->get()), SelectionState);\n\t\t}\n\t\tclean_vbo_state();\n\t}\n\t\n\tvoid on_mesh_changed(const k3d::mesh& Mesh, k3d::ihint* Hint)\n\t{\n\t\treturn_if_fail(k3d::gl::extension::query_vbo());\n\n\t\tif(!has_sds_polyhedra(Mesh))\n\t\t\treturn;\n\t\t\n\t\tschedule_data<selection_t>(&Mesh, Hint, this);\n\t\tschedule_data<sds_vbo<vbo_t> >(&Mesh, Hint, this);\n\t}\n\nprotected:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_levels;\n\t\n\t// override to choose drawing mode\n\tvirtual void draw(const k3d::mesh::primitive* Primitive, vbo_t& Cache, selection_t& Selection, const k3d::gl::painter_render_state& RenderState) = 0;\n\t\n\t// override to choose selection mode\n\tvirtual void select(vbo_t& Cache, const k3d::gl::painter_selection_state& SelectionState) = 0;\n};\n\n////////////////////////////////:\n// vbo_sds_face_painter\n\nclass vbo_sds_face_painter : public vbo_sds_painter<face_selection, sds_face_vbo>\n{\n\ttypedef vbo_sds_painter<face_selection, sds_face_vbo> base;\n\ttypedef face_selection selection_t;\n\ttypedef sds_face_vbo vbo_t;\npublic:\n\tvbo_sds_face_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::color(0.2,0.2,0.2),k3d::color(0.6,0.6,0.6))\n\t{}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<vbo_sds_face_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\t\tk3d::uuid(0x6db5cbd0, 0x0c4c42eb, 0x81142404, 0x3c25889e),\n\t\t\"OpenGLVBOSDSFacePainter\",\n\t\t_(\"Renders mesh as SDS faces using OpenGL VBOs\"),\n\t\t\"OpenGL Painter\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprotected:\n\tvirtual void draw(const k3d::mesh::primitive* Primitive, vbo_t& Cache, selection_t& Selection, const k3d::gl::painter_render_state& RenderState)\n\t{\n\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\tglEnable(GL_CULL_FACE);\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\tglPolygonOffset(1.0, 1.0);\n\t\tglEnable(GL_LIGHTING);\n\t\t\n\t\tconst color_t color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst color_t selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\nassert_not_implemented();\n/*\n\t\tk3d::uint_t face_count = Cache.face_starts.size();\n\t\tconst selection_records_t& face_selection_records = Selection.records(Primitive);\n\t\tif (!face_selection_records.empty())\n\t\t{\n\t\t\tfor (selection_records_t::const_iterator record = face_selection_records.begin(); record != face_selection_records.end() && record->begin < face_count; ++record)\n\t\t\t{ // color by selection\n\t\t\t\tconst color_t& face_color = record->weight ? selected_color : color;\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, k3d::color(face_color.red, face_color.green, face_color.blue), face_color.alpha);\n\t\t\t\tk3d::uint_t start = record->begin;\n\t\t\t\tk3d::uint_t end = record->end;\n\t\t\t\tend = end > face_count ? face_count : end;\n\t\t\t\tk3d::uint_t start_index = Cache.face_starts[start];\n\t\t\t\tk3d::uint_t end_index = end == face_count ? Cache.index_size : Cache.face_starts[end];\n\t\t\t\tglDrawElements(GL_QUADS, end_index-start_index, GL_UNSIGNED_INT, static_cast<GLuint*>(0) + start_index);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{ // empty selection, everything has the same color\n\t\t\tcolor4d(color);\n\t\t\tglDrawElements(GL_QUADS, Cache.index_size, GL_UNSIGNED_INT, static_cast<GLuint*>(0));\n\t\t}\n*/\n\t}\n\tvirtual void select(vbo_t& Cache, const k3d::gl::painter_selection_state& SelectionState)\n\t{\n\t\tif (!SelectionState.select_uniform)\n\t\t\treturn;\n\t\t\n\t\tk3d::gl::store_attributes attributes;\n\t\t\t\t\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\tk3d::gl::set(GL_CULL_FACE, !SelectionState.select_backfacing);\n\n\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\tglPolygonOffset(1.0, 1.0);\n\t\t\n\t\tfor (k3d::uint_t face = 0; face != Cache.face_starts.size(); ++face)\n\t\t{\n\t\t\tk3d::gl::push_selection_token(k3d::selection::UNIFORM, face);\n\t\t\t\n\t\t\tk3d::uint_t start_index = Cache.face_starts[face];\n\t\t\tk3d::uint_t end_index = face == (Cache.face_starts.size()-1) ? Cache.index_size : Cache.face_starts[face+1]; \n\t\t\tglDrawElements(GL_QUADS, end_index-start_index, GL_UNSIGNED_INT, static_cast<GLuint*>(0) + start_index);\n\t\t\t\n\t\t\tk3d::gl::pop_selection_token(); // UNIFORM\n\t\t}\n\t}\n};\n\nk3d::iplugin_factory& vbo_sds_face_painter_factory()\n{\n\treturn vbo_sds_face_painter::get_factory();\n}\n\t\n////////////\n// vbo_sds_edge_painter\n////////////\n\t\nclass vbo_sds_edge_painter : public vbo_sds_painter<edge_selection, sds_edge_vbo>\n{\n\ttypedef vbo_sds_painter<edge_selection, sds_edge_vbo> base;\n\ttypedef edge_selection selection_t;\n\ttypedef sds_edge_vbo vbo_t;\npublic:\n\tvbo_sds_edge_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::color(0.0,0.0,0.0),k3d::color(1.0,1.0,1.0))\n\t{}\n\t\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<vbo_sds_edge_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\t\tk3d::uuid(0x4282a7b2, 0xb34a138f, 0xcda9df91, 0xa9c9c8ab),\n\t\t\"OpenGLVBOSDSEdgePainter\",\n\t\t_(\"Renders mesh as SDS patch borders using OpenGL VBOs\"),\n\t\t\"Development\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\t\nprivate:\n\tvirtual void draw(const k3d::mesh::primitive* Primitive, vbo_t& Cache, selection_t& Selection, const k3d::gl::painter_render_state& RenderState)\n\t{\n\t\tglDisable(GL_LIGHTING);\n\t\t\n\t\tconst color_t color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst color_t selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\t\t\n\t\tk3d::uint_t edge_count = Cache.edge_starts.size();\n\nassert_not_implemented();\n/*\n\t\tconst selection_records_t& edge_selection_records = Selection.records(Primitive);\n\t\tif (!edge_selection_records.empty())\n\t\t{\n\t\t\tfor (selection_records_t::const_iterator record = edge_selection_records.begin(); record != edge_selection_records.end() && record->begin < edge_count; ++record)\n\t\t\t{ // color by selection\n\t\t\t\tcolor4d(record->weight ? selected_color : color);\n\t\t\t\tk3d::uint_t start = record->begin;\n\t\t\t\tk3d::uint_t end = record->end;\n\t\t\t\tend = end > edge_count ? edge_count : end;\n\t\t\t\tk3d::uint_t start_index = Cache.edge_starts[start];\n\t\t\t\tk3d::uint_t end_index = end == edge_count ? Cache.index_size : Cache.edge_starts[end];\n\t\t\t\tglDrawArrays(GL_LINES, start_index, end_index-start_index);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{ // empty selection, everything has the same color\n\t\t\tcolor4d(color);\n\t\t\tglDrawArrays(GL_LINES, 0, edge_count);\n\t\t}\n*/\n\t}\n\t\n\tvirtual void select(vbo_t& Cache, const k3d::gl::painter_selection_state& SelectionState)\n\t{\n\t\tif (!SelectionState.select_split_edges)\n\t\t\t\t\treturn;\n\n\t\tglDisable(GL_LIGHTING);\n\t\t\n\t\tk3d::uint_t edge_count = Cache.edge_starts.size();\n\t\t\n\t\tfor (k3d::uint_t edge = 0; edge != edge_count; ++edge)\n\t\t{\n\t\t\tk3d::gl::push_selection_token(k3d::selection::SPLIT_EDGE, edge);\n\t\t\t\n\t\t\tk3d::uint_t start_index = Cache.edge_starts[edge];\n\t\t\tk3d::uint_t end_index = edge == (edge_count-1) ? Cache.index_size : Cache.edge_starts[edge+1];\n\t\t\tglDrawArrays(GL_LINES, start_index, end_index-start_index);\n\t\t\t\n\t\t\tk3d::gl::pop_selection_token(); // SPLIT_EDGE\n\t\t}\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// vbo_sds_edge_painter_factory\n\nk3d::iplugin_factory& vbo_sds_edge_painter_factory()\n{\n\treturn vbo_sds_edge_painter::get_factory();\n}\n\n////////////\n// vbo_sds_point_painter\n////////////\n\t\nclass vbo_sds_point_painter : public vbo_sds_painter<point_selection, sds_point_vbo>\n{\n\ttypedef vbo_sds_painter<point_selection, sds_point_vbo> base;\n\ttypedef point_selection selection_t;\n\ttypedef sds_point_vbo vbo_t;\npublic:\n\tvbo_sds_point_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::color(0.0,0.0,0.0),k3d::color(1.0,1.0,1.0))\n\t{}\n\t\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<vbo_sds_point_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\t\tk3d::uuid(0x44621bcb, 0x404a76ea, 0x1a256ebd, 0xb119ad07),\n\t\t\"OpenGLVBOSDSPointPainter\",\n\t\t_(\"Renders mesh as SDS patch corners using OpenGL VBOs\"),\n\t\t\"Development\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\t\nprivate:\n\tvirtual void draw(const k3d::mesh::primitive* Primitive, vbo_t& Cache, selection_t& Selection, const k3d::gl::painter_render_state& RenderState)\n\t{\n\t\tglDisable(GL_LIGHTING);\n\t\t\n\t\tk3d::uint_t point_count = Cache.index_size;\n\t\t\n\t\tconst color_t color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst color_t selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\nassert_not_implemented();\n/*\n\t\tconst selection_records_t& point_selection_records = Selection.records();\n\t\tif (!point_selection_records.empty())\n\t\t{\n\t\t\tfor (selection_records_t::const_iterator record = point_selection_records.begin(); record != point_selection_records.end() && record->begin < point_count; ++record)\n\t\t\t{ // color by selection\n\t\t\t\tcolor4d(record->weight ? selected_color : color);\n\t\t\t\tk3d::uint_t start = record->begin;\n\t\t\t\tk3d::uint_t end = record->end;\n\t\t\t\tend = end > point_count ? point_count : end;\n\t\t\t\tglDrawArrays(GL_POINTS, start, end-start);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{ // empty selection, everything has the same color\n\t\t\tcolor4d(color);\n\t\t\tglDrawArrays(GL_POINTS, 0, point_count);\n\t\t}\n*/\n\t}\n\t\n\tvirtual void select(vbo_t& Cache, const k3d::gl::painter_selection_state& SelectionState)\n\t{\n\t\tif (!SelectionState.select_points)\n\t\t\treturn;\n\t\tglDisable(GL_LIGHTING);\n\t\t\n\t\tk3d::uint_t point_count = Cache.index_size;\n\t\t\n\t\tfor (k3d::uint_t point = 0; point != point_count; ++point)\n\t\t{\n\t\t\tk3d::gl::push_selection_token(k3d::selection::POINT, point);\n\t\t\tglDrawArrays(GL_POINTS, point, 1);\n\t\t\tk3d::gl::pop_selection_token();\n\t\t}\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// vbo_sds_point_painter_factory\n\nk3d::iplugin_factory& vbo_sds_point_painter_factory()\n{\n\treturn vbo_sds_point_painter::get_factory();\n}\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n//extern k3d::iplugin_factory& face_varying_painter_factory();\n//extern k3d::iplugin_factory& hidden_line_painter_factory();\n//extern k3d::iplugin_factory& point_normal_painter_factory();\nextern k3d::iplugin_factory& sds_edge_painter_factory();\nextern k3d::iplugin_factory& sds_face_painter_factory();\nextern k3d::iplugin_factory& sds_point_painter_factory();\n//extern k3d::iplugin_factory& textured_face_painter_factory();\n//extern k3d::iplugin_factory& vbo_edge_painter_factory();\n//extern k3d::iplugin_factory& vbo_face_painter_factory();\n//extern k3d::iplugin_factory& vbo_point_painter_factory();\n//extern k3d::iplugin_factory& vbo_sds_edge_painter_factory();\n//extern k3d::iplugin_factory& vbo_sds_face_painter_factory();\n//extern k3d::iplugin_factory& vbo_sds_point_painter_factory();\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n//\tRegistry.register_factory(module::opengl::painters::face_varying_painter_factory());\n//\tRegistry.register_factory(module::opengl::painters::hidden_line_painter_factory());\n//\tRegistry.register_factory(module::opengl::painters::point_normal_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::sds_edge_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::sds_face_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::sds_point_painter_factory());\n//\tRegistry.register_factory(module::opengl::painters::textured_face_painter_factory());\n//\tRegistry.register_factory(module::opengl::painters::vbo_edge_painter_factory());\n//\tRegistry.register_factory(module::opengl::painters::vbo_face_painter_factory());\n//\tRegistry.register_factory(module::opengl::painters::vbo_point_painter_factory());\n//\tRegistry.register_factory(module::opengl::painters::vbo_sds_edge_painter_factory());\n//\tRegistry.register_factory(module::opengl::painters::vbo_sds_face_painter_factory());\n//\tRegistry.register_factory(module::opengl::painters::vbo_sds_point_painter_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/painter_cache.h",
    "content": "#ifndef MODULES_ADVANCED_OPENGL_PAINTERS_PAINTER_CACHE_H\n#define MODULES_ADVANCED_OPENGL_PAINTERS_PAINTER_CACHE_H\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/pointer_demand_storage.h>\n#include <k3dsdk/signal_system.h>\n\n#include <map>\n#include <set>\n\nnamespace k3d { class mesh; }\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/// Stores cached data that can be shared between mesh painters\n/**\n * key_t must be a type that allows compare operations\n * data_t must have a constructor that takes a k3d::iproperty::changed_signal_t& argument\n */\ntemplate<class key_t, class data_t> class painter_cache\n{\n\t/// Collection of cached data associated with different mesh components\n\ttypedef std::map<key_t, data_t*> data_collection_t;\npublic:\n\n\t/// Get an instance of the global cache\n\tstatic painter_cache& instance()\n\t{\n\t\tstatic painter_cache* g_painter_cache = 0;\n\t\tif(!g_painter_cache)\n\t\t\tg_painter_cache = new painter_cache();\n\t\treturn *g_painter_cache;\n\t}\n\n\t~painter_cache()\n\t{\n\t\tfor (typename data_collection_t::iterator data = m_data.begin(); data != m_data.end(); ++data)\n\t\t\tdelete data->second;\n\t}\n\n\t/// Get the up-to-date data associated with Key\n\t/**\n\t * @param ChangedSignal: This signal is connected to by the cached data, so it is notified when to update\n\t */\n\tdata_t& get_cached_data(const key_t& Key, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\t// Maximum size for the data cache\n\t\tstatic const k3d::uint_t MAX_CACHE_SIZE = 100;\n\t\tm_stack.use(Key);\n\t\ttypename data_collection_t::iterator data = m_data.find(Key);\n\t\tif (data == m_data.end())\n\t\t{\n\t\t\t// First check if the max cache size would be exceeded, and if so, remove the least recently used item\n\t\t\tif(m_data.size() == MAX_CACHE_SIZE)\n\t\t\t\tremove_data(m_stack.pop());\n\n\t\t\tdata = m_data.insert(std::make_pair(Key, new data_t(Key, ChangedSignal))).first;\n\t\t}\n\t\treturn *(data->second);\n\t}\n\nprivate:\n\t/// The managed data\n\tdata_collection_t m_data;\n\n\t/// Free the data if any for the given key\n\tvoid remove_data(key_t Key)\n\t{\n\t\ttypename data_collection_t::iterator data = m_data.find(Key);\n\t\tif (data != m_data.end())\n\t\t{\n\t\t\tdelete data->second;\n\t\t\tm_data.erase(data);\n\t\t}\n\t}\n\n\t/// A custom stack, where items are unique\n\tclass lru_stack\n\t{\n\tpublic:\n\t\tlru_stack() : m_first_item(0), m_last_item(0) {}\n\n\t\t~lru_stack()\n\t\t{\n\t\t\twhile(m_first_item)\n\t\t\t\tpop();\n\t\t}\n\n\t\tvoid use(const key_t& Key)\n\t\t{\n\t\t\tstackitem* item;\n\t\t\tif(!m_stackitems.count(Key))\n\t\t\t{\n\t\t\t\titem = new stackitem(Key);\n\t\t\t\tm_stackitems[Key] = item;\n\t\t\t\tif(!m_first_item)\n\t\t\t\t\tm_first_item = item;\n\t\t\t\tif(!m_last_item)\n\t\t\t\t\tm_last_item = item;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\titem = m_stackitems[Key];\n\t\t\t}\n\t\t\t// Move the item to the top of the stack\n\t\t\tif(item != m_first_item)\n\t\t\t{\n\t\t\t\tif(item->previous)\n\t\t\t\t\titem->previous->next = item->next;\n\t\t\t\tif(item->next)\n\t\t\t\t\titem->next->previous = item->previous;\n\t\t\t\tif(item == m_last_item)\n\t\t\t\t\tm_last_item = item->previous;\n\t\t\t\titem->previous = 0;\n\t\t\t\titem->next = m_first_item;\n\t\t\t\tm_first_item = item;\n\t\t\t}\n\t\t}\n\n\t\tconst key_t pop()\n\t\t{\n\t\t\tif(!m_first_item)\n\t\t\t\tthrow std::runtime_error(\"The painter cache LRU stack was empty!\");\n\t\t\tkey_t key = m_first_item->key;\n\t\t\tstackitem* item = m_first_item;\n\t\t\tm_first_item = item->next;\n\t\t\tm_first_item->previous = 0;\n\t\t\tm_stackitems.erase(key);\n\t\t\tdelete item;\n\t\t\treturn key;\n\t\t}\n\n\tprivate:\n\t\tstruct stackitem\n\t\t{\n\t\t\tstackitem(const key_t& Key) : previous(0), next(0), key(Key) {}\n\t\t\tstackitem* previous;\n\t\t\tstackitem* next;\n\t\t\tconst key_t key;\n\t\t};\n\t\tstd::map<key_t, stackitem*> m_stackitems;\n\t\tstackitem* m_first_item;\n\t\tstackitem* m_last_item;\n\t};\n\n\tlru_stack m_stack;\n\n\t/// Private constructor for singleton pattern\n\tpainter_cache() {}\n};\n\n/// Convenience function for easy access to cache data\ntemplate<class data_t, class key_t> data_t& get_cached_data(const key_t& Key, k3d::iproperty::changed_signal_t& ChangedSignal)\n{\n\treturn painter_cache<key_t, data_t>::instance().get_cached_data(Key, ChangedSignal);\n}\n\n/// Boilerplate implementation for hint processing\n/**\n * Data that is to be stored in a painter cache can derive from this class.\n */\ntemplate<class key_t, class data_t>\nclass cached_polyhedron_data\n{\npublic:\n\tcached_polyhedron_data(const key_t Key, k3d::iproperty::changed_signal_t& ChangedSignal) :\n\t\tm_key(Key),\n\t\tm_data(init_owner(*this) + init_name(\"data\")),\n\t\tm_input_mesh(0)\n\t{\n\t\tm_data.set_update_slot(sigc::mem_fun(*this, &cached_polyhedron_data<key_t, data_t>::execute));\n\t\tm_changed_connection = ChangedSignal.connect(k3d::hint::converter<\n\t\t\t\t\t\tk3d::hint::convert<k3d::hint::mesh_geometry_changed, k3d::hint::unchanged,\n\t\t\t\t\t\tk3d::hint::convert<k3d::hint::mesh_topology_changed, k3d::hint::unchanged,\n\t\t\t\t\t\tk3d::hint::convert<k3d::hint::selection_changed, k3d::hint::unchanged,\n\t\t\t\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> > > > >(m_data.make_slot()));\n\t}\n\n\t~cached_polyhedron_data()\n\t{\n\t\tm_changed_connection.disconnect();\n\t}\n\n\t/// Get the up-to-date value of the cache, using InputMesh as input data\n\tconst data_t& value(const k3d::mesh& InputMesh)\n\t{\n\t\tm_input_mesh = &InputMesh;\n\t\treturn *m_data.internal_value();\n\t}\nprotected:\n\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, data_t& Data)\n\t{\n\t\treturn_if_fail(m_input_mesh);\n\t\tk3d::bool_t topology_changed = false;\n\t\tk3d::bool_t selection_changed = false;\n\t\tstd::vector<k3d::mesh::indices_t> changed_points;\n\n\t\tfor(int i = 0; i != Hints.size(); ++i)\n\t\t{\n\t\t\tif(k3d::hint::mesh_geometry_changed* hint = dynamic_cast<k3d::hint::mesh_geometry_changed*>(Hints[i]))\n\t\t\t{\n\t\t\t\tif(changed_points.empty() || hint->changed_points != changed_points.back())\n\t\t\t\tchanged_points.push_back(hint->changed_points);\n\t\t\t}\n\t\t\telse if(k3d::hint::selection_changed* hint = dynamic_cast<k3d::hint::selection_changed*>(Hints[i]))\n\t\t\t{\n\t\t\t\tselection_changed = true;\n\t\t\t}\n\t\t\telse if(k3d::hint::mesh_topology_changed* hint = dynamic_cast<k3d::hint::mesh_topology_changed*>(Hints[i]))\n\t\t\t{\n\t\t\t\ttopology_changed = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tselection_changed = true;\n\t\t\t\ttopology_changed = true;\n\t\t\t}\n\t\t}\n\t\tif(topology_changed)\n\t\t\ton_topology_changed(Data, *m_input_mesh);\n\t\tif(selection_changed)\n\t\t\ton_selection_changed(Data, *m_input_mesh);\n\t\tfor(k3d::uint_t i = 0; i != changed_points.size(); ++i)\n\t\t\ton_geometry_changed(Data, *m_input_mesh, changed_points[i]);\n\t}\n\n\tconst key_t m_key;\nprivate:\n\tvirtual void on_topology_changed(data_t& Output, const k3d::mesh& InputMesh) = 0;\n\tvirtual void on_selection_changed(data_t& Output, const k3d::mesh& InputMesh) = 0;\n\tvirtual void on_geometry_changed(data_t& Output, const k3d::mesh& InputMesh, const k3d::mesh::indices_t& ChangedPoints) = 0;\n\n\tk3d_data(data_t*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, no_property, no_serialization) m_data;\n\tconst k3d::mesh* m_input_mesh;\n\tsigc::connection m_changed_connection;\n};\n\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n\n#endif // !MODULES_ADVANCED_OPENGL_PAINTERS_PAINTER_CACHE_H\n"
  },
  {
    "path": "modules/advanced_opengl_painters/sds_cache.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"sds_cache.h\"\n\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n////////////\n// sds_cache\n////////////\n\nvoid sds_cache::on_topology_changed(k3d::sds::catmull_clark_subdivider& Output, const k3d::mesh& InputMesh)\n{\n\tk3d::mesh input_with_normals;\n\tcalculate_normals(input_with_normals, InputMesh);\n\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(input_with_normals, *input_with_normals.primitives[polyhedron_idx(InputMesh)]));\n\treturn_if_fail(polyhedron);\n\treturn_if_fail(k3d::polyhedron::is_sds(*polyhedron));\n\tOutput.set_levels(m_key.first);\n\tk3d::mesh::selection_t face_selections(polyhedron->face_selections.size(), 1.0);\n\tOutput.create_mesh(*input_with_normals.points, *polyhedron, face_selections);\n\tOutput.update_mesh(*input_with_normals.points, *polyhedron, input_with_normals.point_attributes, face_selections);\n}\n\nvoid sds_cache::on_geometry_changed(k3d::sds::catmull_clark_subdivider& Output, const k3d::mesh& InputMesh, const k3d::mesh::indices_t& ChangedPoints)\n{\n\tk3d::mesh input_with_normals;\n\tcalculate_normals(input_with_normals, InputMesh);\n\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(input_with_normals, *input_with_normals.primitives[polyhedron_idx(InputMesh)]));\n\treturn_if_fail(polyhedron.get());\n\treturn_if_fail(k3d::polyhedron::is_sds(*polyhedron));\n\tk3d::mesh::selection_t face_selections(polyhedron->face_selections.size(), 1.0);\n\tOutput.update_mesh(*input_with_normals.points, *polyhedron, input_with_normals.point_attributes, face_selections);\n}\n\nconst k3d::uint_t sds_cache::polyhedron_idx(const k3d::mesh& InputMesh)\n{\n\tfor(k3d::uint_t i = 0; i != InputMesh.primitives.size(); ++i)\n\t{\n\t\tif(InputMesh.primitives[i].get() == m_key.second)\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\tstd::stringstream msg;\n\tmsg << \"polyhedron \" << m_key.second << \" not found for cache \" << this << \" and mesh \" << &InputMesh;\n\tthrow std::runtime_error(msg.str());\n}\n\nvoid sds_cache::calculate_normals(k3d::mesh& Output, const k3d::mesh& Input)\n{\n\tOutput = Input;\n\tconst k3d::mesh::points_t& points = *Output.points;\n\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Output, *Output.primitives[polyhedron_idx(Input)]));\n\treturn_if_fail(polyhedron.get());\n\treturn_if_fail(k3d::polyhedron::is_sds(*polyhedron));\n\tconst k3d::uint_t face_begin = 0;\n\tconst k3d::uint_t face_end = polyhedron->face_first_loops.size();\n\tk3d::mesh::normals_t uniform_normals(polyhedron->face_first_loops.size());\n\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\tuniform_normals[face] = k3d::normalize(k3d::polyhedron::normal(polyhedron->vertex_points, polyhedron->clockwise_edges, *Output.points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]));\n\tk3d::mesh::normals_t& vertex_normals = Output.point_attributes.create(\"sds_normals\", new k3d::mesh::normals_t(points.size()));\n\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\tconst k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\tvertex_normals[polyhedron->vertex_points[edge]] += uniform_normals[face];\n\n\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n"
  },
  {
    "path": "modules/advanced_opengl_painters/sds_cache.h",
    "content": "#ifndef MODULES_ADVANCED_OPENGL_PAINTERS_SDS_CACHE_H\n#define MODULES_ADVANCED_OPENGL_PAINTERS_SDS_CACHE_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Common SDS painter classes\n * \t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n\n#include <k3dsdk/gl.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/subdivision_surface/catmull_clark.h>\n\n#include <boost/ptr_container/ptr_map.hpp>\n#include <map>\n\n#include \"painter_cache.h\"\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nclass sds_cache : public cached_polyhedron_data<std::pair<k3d::uint_t, const k3d::mesh::primitive* const>, k3d::sds::catmull_clark_subdivider>\n{\n\ttypedef cached_polyhedron_data<std::pair<k3d::uint_t, const k3d::mesh::primitive* const>, k3d::sds::catmull_clark_subdivider> base;\npublic:\n\tsds_cache(const std::pair<k3d::uint_t, const k3d::mesh::primitive* const> Key, k3d::iproperty::changed_signal_t& ChangedSignal) : base(Key, ChangedSignal) {}\nprotected:\n\tvoid on_topology_changed(k3d::sds::catmull_clark_subdivider& Output, const k3d::mesh& InputMesh);\n\tvoid on_selection_changed(k3d::sds::catmull_clark_subdivider& Output, const k3d::mesh& InputMesh) {}\n\tvoid on_geometry_changed(k3d::sds::catmull_clark_subdivider& Output, const k3d::mesh& InputMesh, const k3d::mesh::indices_t& ChangedPoints);\nprivate:\n\tconst k3d::uint_t polyhedron_idx(const k3d::mesh& InputMesh);\n\tvoid calculate_normals(k3d::mesh& Output, const k3d::mesh& Input);\n};\n\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n\n#endif // !MODULES_ADVANCED_OPENGL_PAINTERS_SDS_CACHE_H\n"
  },
  {
    "path": "modules/advanced_opengl_painters/sds_edge_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Paint points using a VBO\n */\n\n#include \"texture_colored_selection_painter_gl.h\"\n#include \"painter_cache.h\"\n#include \"sds_cache.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n\t/////////////////////////////////////////////////////////////////////////////\n// sds_edge_painter\n\nclass sds_edge_painter :\n\tpublic texture_colored_selection_painter\n{\n\ttypedef texture_colored_selection_painter base;\n\npublic:\n\tsds_edge_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_levels(init_owner(*this) + init_name(\"levels\") + init_label(_(\"Levels\")) + init_description(_(\"Number of SDS levels\")) + init_value(2) + init_constraint(constraint::minimum<k3d::int32_t>(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_levels.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tclass painting_visitor : public k3d::sds::ipatch_boundary_visitor\n\t{\n\tpublic:\n\t\tpainting_visitor(const k3d::mesh::selection_t& PointSelections) : m_edge_selections(PointSelections) {}\n\n\t\tvoid start_edge(const k3d::uint_t Edge)\n\t\t{\n\t\t\tglTexCoord1d(m_edge_selections[Edge]);\n\t\t}\n\n\t\tvoid finish_edge(const k3d::uint_t Edge)\n\t\t{\n\t\t}\n\t\t\n\t\tvoid add_vertex(const k3d::point3& Point)\n\t\t{\n\t\t\tk3d::gl::vertex3d(Point);\n\t\t}\n\tprivate:\n\t\tconst k3d::mesh::selection_t& m_edge_selections;\n\t};\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::uint_t levels = m_levels.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::sds::catmull_clark_subdivider& subdivider = get_cached_data<sds_cache>(std::make_pair(levels, primitive->get()), ChangedSignal).value(Mesh);\n\t\t\tpainting_visitor visitor(polyhedron->edge_selections);\n\n\t\t\tglBegin(GL_LINES);\n\t\t\tsubdivider.visit_boundary(*polyhedron, levels, visitor);\n\t\t\tglEnd();\n\t\t}\n\t}\n\t\n\tclass selecting_visitor : public k3d::sds::ipatch_boundary_visitor\n\t{\n\tpublic:\n\t\tvoid start_edge(const k3d::uint_t Edge)\n\t\t{\n\t\t\tk3d::gl::push_selection_token(k3d::selection::EDGE, Edge);\n\t\t}\n\n\t\tvoid finish_edge(const k3d::uint_t Edge)\n\t\t{\n\t\t\tk3d::gl::pop_selection_token(); // EDGE\n\t\t}\n\n\t\tvoid add_vertex(const k3d::point3& Point)\n\t\t{\n\t\t\tk3d::gl::vertex3d(Point);\n\t\t}\n\t};\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tglDisable(GL_LIGHTING);\n\t\t\n\t\tif(!SelectionState.select_component.count(k3d::selection::EDGE))\n\t\t\treturn;\n\n\t\tconst k3d::uint_t levels = m_levels.pipeline_value();\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::sds::catmull_clark_subdivider& subdivider = get_cached_data<sds_cache>(std::make_pair(levels, primitive->get()), ChangedSignal).value(Mesh);\n\t\t\tselecting_visitor visitor;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\t\t\tsubdivider.visit_boundary(*polyhedron, levels, visitor);\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sds_edge_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\t\t\t\tk3d::uuid(0x55238c22, 0xed466597, 0xb86c86a3, 0x0de46700),\n\t\t\t\t\"OpenGLSDSEdgePainter\",\n\t\t\t\t_(\"Renders mesh as SDS patch borders using OpenGL 1.1\"),\n\t\t\t\t\"Development\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_levels;\n};\n\n\t/////////////////////////////////////////////////////////////////////////////\n// sds_edge_painter_factory\n\n\tk3d::iplugin_factory& sds_edge_painter_factory()\n\t{\n\t\treturn sds_edge_painter::get_factory();\n\t}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/sds_face_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Paint points using a VBO\n */\n\n#include \"texture_colored_selection_painter_gl.h\"\n#include \"painter_cache.h\"\n#include \"sds_cache.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sds_face_painter\n\nclass sds_face_painter :\n\tpublic texture_colored_selection_painter\n{\n\ttypedef texture_colored_selection_painter base;\n\npublic:\n\tsds_face_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::color(0.2,0.2,0.2),k3d::color(0.6,0.6,0.6)),\n\t\tm_levels(init_owner(*this) + init_name(\"levels\") + init_label(_(\"Levels\")) + init_description(_(\"Number of SDS levels\")) + init_value(2) + init_constraint(constraint::minimum<k3d::int32_t>(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_levels.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tclass painting_visitor : public k3d::sds::ipatch_surface_visitor\n\t{\n\tpublic:\n\t\tpainting_visitor(const k3d::mesh::points_t& Points, const k3d::mesh::normals_t& Normals, const k3d::mesh::selection_t& FaceSelections) :\n\t\t\tm_points(Points),\n\t\t\tm_normals(Normals),\n\t\t\tm_face_selections(FaceSelections)\n\t\t\t{}\n\n\t\tvoid add_quad(const k3d::uint_t P1, const k3d::uint_t P2, const k3d::uint_t P3, const k3d::uint_t P4)\n\t\t{\n\t\t\tk3d::gl::normal3d(m_normals[P1]);\n\t\t\tk3d::gl::vertex3d(m_points[P1]);\n\t\t\tk3d::gl::normal3d(m_normals[P2]);\n\t\t\tk3d::gl::vertex3d(m_points[P2]);\n\t\t\tk3d::gl::normal3d(m_normals[P3]);\n\t\t\tk3d::gl::vertex3d(m_points[P3]);\n\t\t\tk3d::gl::normal3d(m_normals[P4]);\n\t\t\tk3d::gl::vertex3d(m_points[P4]);\n\t\t}\n\n\t\tvoid start_face(const k3d::uint_t Face)\n\t\t{\n\t\t\tglTexCoord1d(m_face_selections[Face]);\n\t\t}\n\n\t\tvoid finish_face(const k3d::uint_t Face)\n\t\t{\n\t\t}\n\n\tprivate:\n\t\tconst k3d::mesh::points_t& m_points;\n\t\tconst k3d::mesh::normals_t& m_normals;\n\t\tconst k3d::mesh::selection_t& m_face_selections;\n\t};\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\tglEnable(GL_CULL_FACE);\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\tglPolygonOffset(1.0, 1.0);\n\t\tglEnable(GL_LIGHTING);\n\t\tglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);\n\n\t\tconst k3d::uint_t levels = m_levels.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::sds::catmull_clark_subdivider& subdivider = get_cached_data<sds_cache>(std::make_pair(levels, primitive->get()), ChangedSignal).value(Mesh);\n\t\t\tpainting_visitor visitor(subdivider.points(levels), subdivider.point_normals(levels), polyhedron->face_selections);\n\n\t\t\tglBegin(GL_QUADS);\n\t\t\tsubdivider.visit_surface(levels, visitor);\n\t\t\tglEnd();\n\t\t}\n\t}\n\n\tclass selecting_visitor : public k3d::sds::ipatch_surface_visitor\n\t{\n\tpublic:\n\t\tselecting_visitor(const k3d::mesh::points_t& Points, const k3d::mesh::normals_t& Normals) :\n\t\t\tm_points(Points),\n\t\t\tm_normals(Normals)\n\t\t\t{}\n\n\t\tvoid add_quad(const k3d::uint_t P1, const k3d::uint_t P2, const k3d::uint_t P3, const k3d::uint_t P4)\n\t\t{\n\t\t\tk3d::gl::normal3d(m_normals[P1]);\n\t\t\tk3d::gl::vertex3d(m_points[P1]);\n\t\t\tk3d::gl::normal3d(m_normals[P2]);\n\t\t\tk3d::gl::vertex3d(m_points[P2]);\n\t\t\tk3d::gl::normal3d(m_normals[P3]);\n\t\t\tk3d::gl::vertex3d(m_points[P3]);\n\t\t\tk3d::gl::normal3d(m_normals[P4]);\n\t\t\tk3d::gl::vertex3d(m_points[P4]);\n\t\t}\n\n\t\tvoid start_face(const k3d::uint_t Face)\n\t\t{\n\t\t\tk3d::gl::push_selection_token(k3d::selection::FACE, Face);\n\t\t\tglBegin(GL_QUADS);\n\t\t}\n\n\t\tvoid finish_face(const k3d::uint_t Face)\n\t\t{\n\t\t\tglEnd(); // GL_QUADS\n\t\t\tk3d::gl::pop_selection_token(); // FACE\n\t\t}\n\n\tprivate:\n\t\tconst k3d::mesh::points_t& m_points;\n\t\tconst k3d::mesh::normals_t& m_normals;\n\t};\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::FACE))\n\t\t\treturn;\n\n\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\tk3d::gl::set(GL_CULL_FACE, !SelectionState.select_backfacing);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\tglPolygonOffset(1.0, 1.0);\n\n\t\tconst k3d::uint_t levels = m_levels.pipeline_value();\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::sds::catmull_clark_subdivider& subdivider = get_cached_data<sds_cache>(std::make_pair(levels, primitive->get()), ChangedSignal).value(Mesh);\n\t\t\tselecting_visitor visitor(subdivider.points(levels), subdivider.point_normals(levels));\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\t\t\tsubdivider.visit_surface(levels, visitor);\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sds_face_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\t\t\t\tk3d::uuid(0xf8578aba, 0x674bbc2d, 0x40622ea4, 0x9167eaf9),\n\t\t\t\t\"OpenGLSDSFacePainter\",\n\t\t\t\t_(\"Renders mesh as SDS faces using OpenGL 1.1\"),\n\t\t\t\t\"OpenGL Painter\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_levels;\n\n};\n\n\t/////////////////////////////////////////////////////////////////////////////\n// sds_face_painter_factory\n\n\tk3d::iplugin_factory& sds_face_painter_factory()\n\t{\n\t\treturn sds_face_painter::get_factory();\n\t}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/sds_point_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Paint points using a VBO\n */\n\n#include \"texture_colored_selection_painter_gl.h\"\n#include \"painter_cache.h\"\n#include \"sds_cache.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n\t/////////////////////////////////////////////////////////////////////////////\n// sds_point_painter\n\nclass sds_point_painter :\n\tpublic texture_colored_selection_painter\n{\n\ttypedef texture_colored_selection_painter base;\n\npublic:\n\tsds_point_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_levels(init_owner(*this) + init_name(\"levels\") + init_label(_(\"Levels\")) + init_description(_(\"Number of SDS levels\")) + init_value(2) + init_constraint(constraint::minimum<k3d::int32_t>(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_levels.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tclass painting_visitor : public k3d::sds::ipatch_corner_visitor\n\t{\n\tpublic:\n\t\tpainting_visitor(const k3d::mesh::selection_t& PointSelections) : m_point_selections(PointSelections), m_point(0) {}\n\t\t\n\t\tvoid add_vertex(const k3d::point3& Point)\n\t\t{\n\t\t\tglTexCoord1d(m_point_selections[m_point]);\n\t\t\tk3d::gl::vertex3d(Point);\n\t\t\t++m_point;\n\t\t}\n\tprivate:\n\t\tconst k3d::mesh::selection_t& m_point_selections;\n\t\tk3d::uint_t m_point;\n\t};\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::uint_t levels = m_levels.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::sds::catmull_clark_subdivider& subdivider = get_cached_data<sds_cache>(std::make_pair(levels, primitive->get()), ChangedSignal).value(Mesh);\n\t\t\tpainting_visitor visitor(*Mesh.point_selection);\n\n\t\t\tglBegin(GL_POINTS);\n\t\t\tsubdivider.visit_corners(levels, visitor);\n\t\t\tglEnd();\n\t\t}\n\t}\n\t\n\tclass selecting_visitor : public k3d::sds::ipatch_corner_visitor\n\t{\n\tpublic:\n\t\tselecting_visitor() : m_point(0) {}\n\n\t\tvoid add_vertex(const k3d::point3& Point)\n\t\t{\n\t\t\tk3d::gl::push_selection_token(k3d::selection::POINT, m_point);\n\t\t\tglBegin(GL_POINTS);\n\t\t\tk3d::gl::vertex3d(Point);\n\t\t\tglEnd();\n\t\t\tk3d::gl::pop_selection_token(); // k3d::selection::POINT\n\t\t\t++m_point;\n\t\t}\n\tprivate:\n\t\tk3d::uint_t m_point;\n\t};\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::POINT))\n\t\t\treturn;\n\n\t\tglDisable(GL_LIGHTING);\n\t\t\n\t\tconst k3d::uint_t levels = m_levels.pipeline_value();\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron || !k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::sds::catmull_clark_subdivider& subdivider = get_cached_data<sds_cache>(std::make_pair(levels, primitive->get()), ChangedSignal).value(Mesh);\n\t\t\tselecting_visitor visitor;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\t\t\tsubdivider.visit_corners(levels, visitor);\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sds_point_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\t\t\tk3d::uuid(0xc336f1ed, 0x0a4fab65, 0x7ceeb380, 0x4a67eca1),\n\t\t\t\"OpenGLSDSPointPainter\",\n\t\t\t_(\"Renders mesh as SDS patch corners using OpenGL 1.1\"),\n\t\t\t\"Development\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_levels;\n};\n\n\t/////////////////////////////////////////////////////////////////////////////\n// sds_point_painter_factory\n\n\tk3d::iplugin_factory& sds_point_painter_factory()\n\t{\n\t\treturn sds_point_painter::get_factory();\n\t}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/texture_colored_selection_painter_gl.h",
    "content": "#ifndef MODULES_ADVANCED_OPENGL_PAINTERS_TEXTURE_COLORED_SELECTION_PAINTER_GL_H\n#define MODULES_ADVANCED_OPENGL_PAINTERS_TEXTURE_COLORED_SELECTION_PAINTER_GL_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Base class for mesh painters that change colors by component- and mesh selection\n */\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/utility_gl.h>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nclass texture_colored_selection_painter :\n\tpublic k3d::node,\n\tpublic k3d::gl::imesh_painter\n{\n\ttypedef k3d::node base;\npublic:\n\ttexture_colored_selection_painter(k3d::iplugin_factory& Factory,\n\t\t\tk3d::idocument& Document,\n\t\t\tconst k3d::color UnselectedMeshColor = k3d::color(0.0, 0.0, 0.0),\n\t\t\tconst k3d::color SelectedMeshColor = k3d::color(1.0, 1.0, 1.0),\n\t\t\tconst k3d::color SelectedComponentColor = k3d::color(1.0, 0.0, 0.0),\n\t\t\tconst k3d::color SelectedParentMeshColor = k3d::color(0.5, 0.5, 0.5)) :\n\t\tbase(Factory, Document),\n\t\tm_enabled(init_owner(*this) + init_name(\"enabled\") + init_label(_(\"Enabled\")) + init_description(_(\"Enable / disable drawing for this painter.\")) + init_value(true)),\n\t\tm_unselected_mesh_color(init_owner(*this) + init_name(\"unselected_mesh_color\") + init_label(_(\"Unselected Mesh Color\")) + init_description(_(\"Color the mesh is drawn in when it is unselected\")) + init_value(UnselectedMeshColor)),\n\t\tm_parent_selected_mesh_color(init_owner(*this) + init_name(\"child_mesh_color\") + init_label(_(\"Child Mesh Color\")) + init_description(_(\"Color the mesh is drawn in when its parent is selected\")) + init_value(SelectedParentMeshColor)),\n\t\tm_selected_mesh_color(init_owner(*this) + init_name(\"selected_mesh_color\") + init_label(_(\"Selected Mesh Color\")) + init_description(_(\"Color unselected components are drawn in when their mesh is selected\")) + init_value(SelectedMeshColor)),\n\t\tm_selected_component_color(init_owner(*this) + init_name(\"selected_component_color\") + init_label(_(\"Selected Component Color\")) + init_description(_(\"Color selected components are drawn in\")) + init_value(SelectedComponentColor))\n\t{\n\t\tm_unselected_mesh_color.changed_signal().connect(sigc::mem_fun(*this, &texture_colored_selection_painter::make_unselected_texture));\n\t\tm_parent_selected_mesh_color.changed_signal().connect(sigc::mem_fun(*this, &texture_colored_selection_painter::make_parent_selected_texture));\n\t\tm_selected_mesh_color.changed_signal().connect(sigc::mem_fun(*this, &texture_colored_selection_painter::make_selected_texture));\n\t\tm_selected_component_color.changed_signal().connect(sigc::mem_fun(*this, &texture_colored_selection_painter::make_component_texture));\n\t}\n\t\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!m_enabled.pipeline_value())\n\t\t\treturn;\n\n\t\tif(!glIsTexture(m_unselected_name) || !glIsTexture(m_parent_selected_name) || !glIsTexture(m_selected_name) || !glIsTexture(m_component_name))\n\t\t\tinit_textures();\n\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglEnable(GL_TEXTURE_1D);\n\t\tglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);\n\n\t\tif(RenderState.show_component_selection && RenderState.node_selection)\n\t\t\tbind_selected_component_color();\n\t\telse if(RenderState.node_selection)\n\t\t\tbind_selected_mesh_color();\n\t\telse\n\t\t\tbind_unselected_mesh_color(RenderState.parent_selection);\n\n\t\ton_paint_mesh(Mesh, RenderState, ChangedSignal);\n\t}\n\n\tvoid select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(m_enabled.pipeline_value())\n\t\t{\n\t\t\ton_select_mesh(Mesh, RenderState, SelectionState, ChangedSignal);\n\t\t}\n\t}\n\nprotected:\n\t/// Returns a slot that will schedule an asynchronous screen update when called\n\tsigc::slot<void, k3d::ihint*> make_async_redraw_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &texture_colored_selection_painter::async_redraw);\n\t}\n\n\t/// Schedules an asynchronous screen update\n\tvoid async_redraw(k3d::ihint*)\n\t{\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\t/// Implement this in derived classes to draw mesh components\n\tvirtual void on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t}\n\n\t/// Implement this in derived classes to draw mesh components for selection\n\tvirtual void on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t}\n\n\t/// Return the unselected mesh color. May be different if the parent mesh is selected\n\tvoid bind_unselected_mesh_color(bool ParentSelected)\n\t{\n\t\tif(ParentSelected)\n\t\t{\n\t\t\treturn_if_fail(glIsTexture(m_parent_selected_name));\n\t\t\tglBindTexture(GL_TEXTURE_1D, m_parent_selected_name);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn_if_fail(glIsTexture(m_unselected_name));\n\t\t\tglBindTexture(GL_TEXTURE_1D, m_unselected_name);\n\t\t}\n\t}\n\t\n\t/// Return the selected mesh color\n\tvoid bind_selected_mesh_color()\n\t{\n\t\treturn_if_fail(glIsTexture(m_selected_name));\n\t\tglBindTexture(GL_TEXTURE_1D, m_selected_name);\n\t}\n\t\n\t/// Return the selected component color\n\tvoid bind_selected_component_color()\n\t{\n\t\treturn_if_fail(glIsTexture(m_component_name));\n\t\tglBindTexture(GL_TEXTURE_1D, m_component_name);\n\t}\n\t\nprivate:\n\tvoid init_textures()\n\t{\n\t\tglPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n\t\tglGenTextures(1, &m_unselected_name);\n\t\tglGenTextures(1, &m_parent_selected_name);\n\t\tglGenTextures(1, &m_selected_name);\n\t\tglGenTextures(1, &m_component_name);\n\t\tmake_unselected_texture(0);\n\t\tmake_parent_selected_texture(0);\n\t\tmake_selected_texture(0);\n\t\tmake_component_texture(0);\n\t}\n\n\tvoid setup_texture(GLuint Name, GLubyte Texels[][3])\n\t{\n\t\tglBindTexture(GL_TEXTURE_1D, Name);\n\t\treturn_if_fail(glIsTexture(Name));\n\t\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\t\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\t\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);\n\t\tglTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, TEX_SIZE, 0, GL_RGB, GL_UNSIGNED_BYTE, Texels);\n\t}\n\n\tvoid set_uniform_color(const k3d::color& Color, GLubyte ColorArray[][3])\n\t{\n\t\tfor(k3d::uint_t i = 0; i != TEX_SIZE; ++i)\n\t\t{\n\t\t\tColorArray[i][0] = static_cast<GLubyte>(Color.red*255);\n\t\t\tColorArray[i][1] = static_cast<GLubyte>(Color.green*255);\n\t\t\tColorArray[i][2] = static_cast<GLubyte>(Color.blue*255);\n\t\t}\n\t}\n\n\tvoid make_unselected_texture(k3d::ihint* Hint)\n\t{\n\t\tset_uniform_color(m_unselected_mesh_color.pipeline_value(), m_unselected_texels);\n\t\tsetup_texture(m_unselected_name, m_unselected_texels);\n\t\tasync_redraw(0);\n\t}\n\n\tvoid make_parent_selected_texture(k3d::ihint* Hint)\n\t{\n\t\tset_uniform_color(m_parent_selected_mesh_color.pipeline_value(), m_parent_selected_texels);\n\t\tsetup_texture(m_parent_selected_name, m_parent_selected_texels);\n\t\tasync_redraw(0);\n\t}\n\n\tvoid make_selected_texture(k3d::ihint* Hint)\n\t{\n\t\tset_uniform_color(m_selected_mesh_color.pipeline_value(), m_selected_texels);\n\t\tsetup_texture(m_selected_name, m_selected_texels);\n\t\tmake_component_texture(0);\n\t}\n\n\tvoid make_component_texture(k3d::ihint* Hint)\n\t{\n\t\tconst k3d::color c1 = m_selected_mesh_color.pipeline_value();\n\t\tconst k3d::color c2 = m_selected_component_color.pipeline_value();\n\t\tfor(k3d::uint_t i = 0; i != TEX_SIZE; ++i)\n\t\t{\n\t\t\tconst k3d::double_t weight = static_cast<k3d::double_t>(i) / static_cast<k3d::double_t>(TEX_SIZE - 1);\n\t\t\tk3d::color mixed = k3d::mix(c1, c2, weight);\n\t\t\tm_component_texels[i][0] = static_cast<GLubyte>(mixed.red*255);\n\t\t\tm_component_texels[i][1] = static_cast<GLubyte>(mixed.green*255);\n\t\t\tm_component_texels[i][2] = static_cast<GLubyte>(mixed.blue*255);\n\t\t}\n\t\tsetup_texture(m_component_name, m_component_texels);\n\t\tasync_redraw(0);\n\t}\n\n\t/// Used to enable/disable the painter\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_enabled;\n\n\t/// Color used when the mesh is not selected\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_unselected_mesh_color;\n\t\n\t/// Color used when the mesh is not selected, but its parent is\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_parent_selected_mesh_color;\n\t\n\t/// Color used for unselected components on selected mesh\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_mesh_color;\n\t\n\t/// Color used for selected components\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_component_color;\n\n\tstatic const k3d::uint_t TEX_SIZE = 256;\n\n\t/// 1D Texture arrays for each selection type\n\tGLubyte m_unselected_texels[TEX_SIZE][3];\n\tGLubyte m_parent_selected_texels[TEX_SIZE][3];\n\tGLubyte m_selected_texels[TEX_SIZE][3];\n\tGLubyte m_component_texels[TEX_SIZE][3];\n\tGLuint m_unselected_name;\n\tGLuint m_parent_selected_name;\n\tGLuint m_selected_name;\n\tGLuint m_component_name;\n}; // class texture_colored_selection_painter\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n\n#endif // !MODULES_ADVANCED_OPENGL_PAINTERS_TEXTURE_COLORED_SELECTION_PAINTER_GL_H\n\n"
  },
  {
    "path": "modules/advanced_opengl_painters/vbo.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"vbo.h\"\n\n#include <k3dsdk/hints.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/any.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <map>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n////////\n// class vbo\n///////\n\nvbo::vbo( )\n{\n\tglGenBuffers(1, &m_name);\n}\n\nvbo::~ vbo( )\n{\n\tglDeleteBuffers(1, &m_name);\n}\n\nvbo::operator GLuint( ) const\n{\n\treturn m_name;\n}\n\nvoid validate(const vbo& VBO)\n{\n\tif(!glIsBuffer(VBO))\n\t{\n\t\tthrow vbo_exception(\"point_vbo is not a buffer!\");\n\t}\n}\n\nvoid bind_vertex_buffer(const vbo& VBO)\n{\n\tvalidate(VBO);\n\tglBindBuffer(GL_ARRAY_BUFFER, VBO);\n\tglVertexPointer(3, GL_DOUBLE, 0, 0);\n\tglEnableClientState(GL_VERTEX_ARRAY);\n}\n\nvoid bind_texture_buffer(const vbo& VBO)\n{\n\tvalidate(VBO);\n\tglBindBuffer(GL_ARRAY_BUFFER, VBO);\n\tglTexCoordPointer(1, GL_DOUBLE, 0, 0);\n\tglEnableClientState(GL_TEXTURE_COORD_ARRAY);\n}\n\nvoid clean_vbo_state()\n{\n\tglDisableClientState(GL_VERTEX_ARRAY);\n\tglDisableClientState(GL_COLOR_ARRAY);\n\tglDisableClientState(GL_SECONDARY_COLOR_ARRAY);\n\tglDisableClientState(GL_INDEX_ARRAY);\n\tglDisableClientState(GL_NORMAL_ARRAY);\n\tglDisableClientState(GL_FOG_COORDINATE_ARRAY);\n\tglDisableClientState(GL_TEXTURE_COORD_ARRAY);\n\tglDisableClientState(GL_EDGE_FLAG_ARRAY);\n\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n}\n\n///////////////////////////////\n// point_vbo\n///////////////////////////////\n\nvoid point_vbo::on_topology_changed(point_data& Output, const k3d::mesh& InputMesh)\n{\n\tconst k3d::mesh::points_t& points = *InputMesh.points;\n\tglBindBuffer(GL_ARRAY_BUFFER, Output.points);\n\tglBufferData(GL_ARRAY_BUFFER, sizeof(points[0]) * points.size(), &points[0], GL_STATIC_DRAW);\n}\n\nvoid point_vbo::on_selection_changed(point_data& Output, const k3d::mesh& InputMesh)\n{\n\tconst k3d::mesh::selection_t& selection = *InputMesh.point_selection;\n\tglBindBuffer(GL_ARRAY_BUFFER, Output.selection);\n\tglBufferData(GL_ARRAY_BUFFER, sizeof(selection[0]) * selection.size(), &selection[0], GL_STATIC_DRAW);\n}\n\nvoid point_vbo::on_geometry_changed(point_data& Output, const k3d::mesh& InputMesh, const k3d::mesh::indices_t& ChangedPoints)\n{\n\tconst k3d::mesh::points_t& points = *InputMesh.points;\n\tglBindBuffer(GL_ARRAY_BUFFER, Output.points);\n\tif(ChangedPoints.empty()) // caller didn't tell which points changed, so update everything\n\t{\n\t\tglBufferData(GL_ARRAY_BUFFER, sizeof(points[0]) * points.size(), &points[0], GL_STATIC_DRAW);\n\t}\n\telse\n\t{\n\t\tk3d::point3* opengl_points = static_cast<k3d::point3*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));\n\t\tfor (size_t index = 0; index != ChangedPoints.size(); ++index)\n\t\t{\n\t\t\topengl_points[ChangedPoints[index]] = points[ChangedPoints[index]];\n\t\t}\n\t\tglUnmapBuffer(GL_ARRAY_BUFFER);\n\t}\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n"
  },
  {
    "path": "modules/advanced_opengl_painters/vbo.h",
    "content": "#ifndef MODULES_ADVANCED_OPENGL_PAINTERS_VBO_H\n#define MODULES_ADVANCED_OPENGL_PAINTERS_VBO_H\n\n// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Helper functions and classes to manage a global data cache for the mesh painters\n * \t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n#include <k3dsdk/gl.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/property.h>\n\n#include \"painter_cache.h\"\n\n#include <stdexcept>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/// Exception for VBO-related errors\nclass vbo_exception : public std::runtime_error\n{\n\ttypedef std::runtime_error base;\npublic:\n\tvbo_exception(const std::string& Message) : base(\"VBO error: \" + Message) {}\n};\n\n/// Convenience wrapper for OpenGL vertex buffer objects\nclass vbo\n{\npublic:\n\tvbo();\n\t~vbo();\n\t/// Implicit conversion so we can use a vbo instance as an argument to OpenGL functions\n\toperator GLuint() const;\nprivate:\n\tvbo(const vbo&);\n\tvbo& operator=(const vbo&);\n\n\tGLuint m_name;\n};\n\n/// Bind a vertex buffer VBO, and enable the required OpenGL state\nvoid bind_vertex_buffer(const vbo& VBO);\n\n/// Bind a texture coordinate VBO, and enable the required OpenGL state\nvoid bind_texture_buffer(const vbo& VBO);\n\n/// Disable all VBOs\nvoid clean_vbo_state();\n\n//////////////////////////////////////////\n// point_vbo\n//////////////////////////////////////////\n\nstruct point_data\n{\n\tvbo points;\n\tvbo selection;\n};\n\n/// Cached object for point data stored in VBOs\nclass point_vbo : public cached_polyhedron_data<const k3d::mesh::points_t* const, point_data>\n{\n\ttypedef const k3d::mesh::points_t* const key_t;\n\ttypedef cached_polyhedron_data<key_t, point_data> base;\npublic:\n\tpoint_vbo(const key_t Key, k3d::iproperty::changed_signal_t& ChangedSignal) : base(Key, ChangedSignal) {}\nprivate:\n\tvoid on_topology_changed(point_data& Output, const k3d::mesh& InputMesh);\n\tvoid on_selection_changed(point_data& Output, const k3d::mesh& InputMesh);\n\tvoid on_geometry_changed(point_data& Output, const k3d::mesh& InputMesh, const k3d::mesh::indices_t& ChangedPoints);\n};\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n#endif // !MODULES_ADVANCED_OPENGL_PAINTERS_VBO_H\n"
  },
  {
    "path": "modules/animation/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-animation)\n#K3D_CREATE_MODULE_PROXY(k3d-animation)\n\n"
  },
  {
    "path": "modules/animation/animation_track.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief A track object, containing keyframes of an animation\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/ikeyframer.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property_group_collection.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/tokens.h>\n#include <k3dsdk/value_demand_storage.h>\n#include <k3dsdk/vectors.h>\n\n#include \"interpolator.h\"\n\nnamespace module\n{\n\nnamespace animation\n{\n\ntemplate <typename time_t, typename value_t> class animation_track;\n\n/// State container that restores using a \"store keyframe\" operation\ntemplate <typename time_t, typename value_t>\nclass store_state_container :\n\tpublic k3d::istate_container\n{\npublic:\n\tstore_state_container(animation_track<time_t, value_t>& Track, time_t Time, value_t Value, const std::string& Keynumber) :\n\t\tm_track(Track),\n\t\tm_time(Time),\n\t\tm_value(Value),\n\t\tm_keynumber(Keynumber)\n\t{}\n\t\n\tvoid restore_state()\n\t{\n\t\tm_track.store_value(m_time, m_value, m_keynumber);\n\t\tm_track.reset_output();\n\t}\n\t\n\tvoid update_value(const value_t& Value)\n\t{\n\t\tm_value = Value;\n\t}\n\t\nprivate:\n\tanimation_track<time_t, value_t>& m_track;\n\ttime_t m_time;\n\tvalue_t m_value;\n\tstd::string m_keynumber;\n};\n\n/// State container that restores using a delete_key operation\ntemplate <typename time_t, typename value_t>\nclass delete_state_container :\n\tpublic k3d::istate_container\n{\npublic:\n\tdelete_state_container(animation_track<time_t, value_t>& Track, const std::string& Keynumber) :\n\t\tm_track(Track),\n\t\tm_keynumber(Keynumber)\n\t{}\n\t\n\tvoid restore_state()\n\t{\n\t\tm_track.delete_key(m_keynumber);\n\t}\n\t\nprivate:\n\tanimation_track<time_t, value_t>& m_track;\n\tstd::string m_keynumber;\n};\n\n/// State container that updates an existing key\ntemplate <typename time_t, typename value_t>\nclass update_state_container :\n\tpublic k3d::istate_container\n{\npublic:\n\tupdate_state_container(animation_track<time_t, value_t>& Track, const std::string& Label, const value_t& Value) :\n\t\tm_track(Track),\n\t\tm_label(Label),\n\t\tm_value(Value)\n\t{}\n\t\n\tvoid restore_state()\n\t{\n\t\tm_track.update_value(m_label, m_value);\n\t}\n\t\nprivate:\n\tanimation_track<time_t, value_t>& m_track;\n\tstd::string m_label;\n\tvalue_t m_value;\n};\n\n/// Encapsulates a series of keyframes\ntemplate <typename time_t, typename value_t>\nclass animation_track :\n\tpublic k3d::node,\n\tpublic k3d::property_group_collection,\n\tpublic k3d::ikeyframer\n{\n\ttypedef k3d::node base;\n\ttypedef k3d_data(time_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) time_property_t;\n\ttypedef k3d_data(value_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, with_serialization) value_property_t;\n\ttypedef std::map<time_property_t*, value_property_t*> keyframes_t;\n\ttypedef interpolator<time_t, value_t> interpolator_t;\n\ttypedef std::map<time_property_t*, std::string> keygroups_t;\npublic:\n\tanimation_track(k3d::iplugin_factory& Factory, k3d::idocument& Document, time_t Time, value_t Value) :\n\t\tbase(Factory, Document),\n\t\tm_time_input(init_owner(*this) + init_name(\"time_input\") + init_label((\"Time Input\")) + init_description((\"Time for the animation\")) + init_value(Time)),\n\t\tm_value_input(init_owner(*this) + init_name(\"value_input\") + init_label((\"Value Input\")) + init_description((\"Input that is keyframed when it changes\")) + init_value(Value)),\n\t\tm_output_value(init_owner(*this) + init_name(\"output_value\") + init_label((\"Output Value\")) + init_description((\"Interpolated output value\")) + init_value(value_t())),\n\t\tm_interpolator(init_owner(*this) + init_name(\"interpolator\") + init_label(\"Interpolator\") + init_description(\"Method used to interpolate keyframes\") + init_value(static_cast<interpolator_t*>(0))),\n\t\tm_manual_keyframe(init_owner(*this) + init_name(\"manual_keyframe\") + init_label((\"Manual keyframe only\")) + init_description((\"If checked, keyframes are created only usint the timeline. Otherwise keyframes are created/updated whenever the Value Input changes\")) + init_value(false)),\n\t\tm_record(true),\n\t\tm_no_interpolation(false)\n\t{\n\t\tm_output_value.set_update_slot(sigc::mem_fun(*this, &animation_track::on_output_request));\n\t\tm_time_input.changed_signal().connect(m_output_value.make_slot());\n\t\tm_value_input.changed_signal().connect(sigc::mem_fun(*this, &animation_track::on_value_change));\n\t}\n\t\n\tvoid on_output_request(const std::vector<k3d::ihint*>& Hints, value_t& Output)\n\t{\n\t\t// If we're not supposed to interpolate, return the input\n\t\tif (m_no_interpolation)\n\t\t{\n\t\t\tm_no_interpolation = false;\n\t\t\tOutput = m_value_input.pipeline_value();\n\t\t\treturn;\n\t\t}\n\t\t// Interpolate value\n\t\tinterpolator_t* interpolator = m_interpolator.pipeline_value();\n\t\tif (!interpolator)\n\t\t{\n\t\t\tOutput =  m_value_input.pipeline_value();\n\t\t\treturn;\n\t\t}\n\t\ttypename interpolator_t::keyframes_t keyframes;\n\t\tfor (typename keyframes_t::iterator keyframe = m_keyframes.begin(); keyframe != m_keyframes.end(); ++keyframe)\n\t\t\tkeyframes.insert(std::make_pair(keyframe->first->pipeline_value(), keyframe->second->pipeline_value()));\n\t\ttime_t time = m_time_input.pipeline_value();\n\t\ttry\n\t\t{\n\t\t\tOutput = interpolator->interpolate(time, keyframes);\n\t\t}\n\t\tcatch (insufficient_data_exception& e)\n\t\t{\n\t\t\tk3d::log() << warning << name() << \": Insufficient keyframe data to calculate value at time \" << time << std::endl;\n\t\t\tOutput =  m_value_input.pipeline_value();\n\t\t}\n\t}\n\t\n\t/// Create a keyframe from the current time and value inputs\n\tvoid keyframe()\n\t{\n\t\ttime_t time = m_time_input.pipeline_value();\n\t\tvalue_t value = m_value_input.pipeline_value();\n\t\ttime_property_t* time_property = 0;\n\t\tfor (typename keyframes_t::const_iterator keyframe = m_keyframes.begin(); keyframe != m_keyframes.end(); ++keyframe)\n\t\t{\n\t\t\tif (keyframe->first->pipeline_value() == time)\n\t\t\t{\n\t\t\t\ttime_property = keyframe->first;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\ttypename keyframes_t::iterator value_it;\n\t\t// Create new keyframe if a keyframe did not already exist for the current time\n\t\tif (time_property == 0)\n\t\t{\n\t\t\tstd::string key_number = boost::lexical_cast<std::string>(m_keyframes.size());\n\t\t\tstore_value(time, value, key_number);\n\t\t\t// Make keyframe creation undoable\n\t\t\tif (!document().state_recorder().current_change_set())\n\t\t\t{\n\t\t\t\tk3d::record_state_change_set changeset(document(), \"Create keyframe \" + key_number, K3D_CHANGE_SET_CONTEXT);\n\t\t\t\trecord_create(time, value, key_number);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trecord_create(time, value, key_number);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvalue_it = m_keyframes.find(time_property);\n\t\t\t// record undo/redo\n\t\t\tif(document().state_recorder().current_change_set())\n\t\t\t{\n\t\t\t\tdocument().state_recorder().current_change_set()->record_old_state(new update_state_container<time_t, value_t>(*this, value_it->second->property_label(), value_it->second->internal_value()));\n\t\t\t\tdocument().state_recorder().current_change_set()->record_new_state(new update_state_container<time_t, value_t>(*this, value_it->second->property_label(), value));\n\t\t\t}\n\t\t\tvalue_it->second->set_value(value);\n\t\t\t// Update the stored key creation redo value in case we are creating a key through a drag motion\n\t\t\tif (m_last_set == document().state_recorder().current_change_set())\n\t\t\t{\n\t\t\t\tm_last_store->update_value(value);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_last_set = 0;\n\t\t\t\tm_last_store = 0;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid reset_output(bool Interpolate = true)\n\t{\n\t\tm_no_interpolation = !Interpolate;\n\t\tm_output_value.update();\n\t}\n\t\n\tvoid delete_key(k3d::iproperty* TimeProperty)\n\t{\n\t\trecord_delete(TimeProperty);\n\t\t\n\t\ttime_property_t* time_property = dynamic_cast<time_property_t*>(TimeProperty);\n\t\tvalue_property_t* value_property = m_keyframes[time_property];\n\t\tunregister_property_group(m_keygroups[time_property]);\n\t\tdisable_serialization(*value_property);\n\t\tdisable_serialization(*time_property);\n\t\tunregister_property(*value_property);\n\t\tunregister_property(*time_property);\n\t\tm_keyframes.erase(time_property);\n\t\tm_keygroups.erase(time_property);\n\t\tdelete value_property;\n\t\tdelete time_property;\n\t\tm_keys_changed_signal.emit();\n\t\treset_output();\n\t}\n\t\n\t/// Delete key by number (used for redo)\n\tvoid delete_key(const std::string& Keynumber)\n\t{\n\t\tm_record = false; // don't record this delete\n\t\tfor (typename keyframes_t::const_iterator keyframe = m_keyframes.begin(); keyframe != m_keyframes.end(); ++keyframe)\n\t\t{\n\t\t\tif (keyframe->first->property_name().substr(9, keyframe->first->property_name().size() - 8) == Keynumber)\n\t\t\t{\n\t\t\t\tdelete_key(keyframe->first);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tm_record = true;\n\t}\n\t\n\tk3d::iproperty& input_property()\n\t{\n\t\treturn m_value_input;\n\t}\n\t\n\tk3d::ikeyframer::keys_t get_keys()\n\t{\n\t\tk3d::ikeyframer::keys_t keys;\n\t\tfor (typename keyframes_t::const_iterator keyframe = m_keyframes.begin(); keyframe != m_keyframes.end(); ++keyframe)\n\t\t\tkeys.push_back(keyframe->first);\n\t\treturn keys;\n\t}\n\t\t\n\t/// Make sure the keyframe structures get updated on load\n\tvoid load(k3d::xml::element& Element, const k3d::ipersistent::load_context& Context)\n\t{\n\t\tbase::load(Element, Context);\n\t\t\n\t\tk3d::xml::element* const properties = k3d::xml::find_element(Element, \"properties\");\n\t\treturn_if_fail(properties);\n\t\t\n\t\t// Keep track of frames by stored number\n\t\tstd::map<std::string, time_t> times;\n\t\t\n\t\t// Read the times (this is not an ad)\n\t\tfor(k3d::xml::element::elements_t::iterator element = properties->children.begin(); element != properties->children.end(); ++element)\n\t\t{\n\t\t\tif(element->name == \"property\")\n\t\t\t{\n\t\t\t\tconst std::string& property_name = k3d::xml::attribute_value<std::string>(*element, \"name\", \"\");\n\t\t\t\tif (property_name.find(\"key_time_\") == 0)\n\t\t\t\t{\n\t\t\t\t\tstd::string keynumber = property_name.substr(9, property_name.size() - 8);\n\t\t\t\t\ttime_t time = k3d::from_string<time_t>(element->text, time_t());\n\t\t\t\t\ttimes[keynumber] = time;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Read the values and create the properties\n\t\tfor(k3d::xml::element::elements_t::iterator element = properties->children.begin(); element != properties->children.end(); ++element)\n\t\t{\n\t\t\tif(element->name == \"property\")\n\t\t\t{\n\t\t\t\tconst std::string& property_name = k3d::xml::attribute_value<std::string>(*element, \"name\", \"\");\n\t\t\t\tif (property_name.find(\"key_value_\") == 0)\n\t\t\t\t{\n\t\t\t\t\tstd::string keynumber = property_name.substr(10, property_name.size() - 9);\n\t\t\t\t\tvalue_t value = k3d::from_string<value_t>(element->text, value_t());\n\t\t\t\t\ttypename std::map<std::string, time_t>::iterator time_it = times.find(keynumber);\n\t\t\t\t\treturn_if_fail(time_it != times.end());\n\t\t\t\t\tstore_value(time_it->second, value, keynumber);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/// Stores the given value keyed by the given time property, and handles group creation\n\tvoid store_value(time_t Time, value_t Value, const std::string& KeyNumber)\n\t{\n\t\tstd::string time_name = \"key_time_\" + KeyNumber;\n\t\tstd::string time_label = \"Key Time \" + KeyNumber;\t\n\t\tstd::string value_name = \"key_value_\" + KeyNumber;\n\t\tstd::string value_label = \"Key Value \" + KeyNumber;\n\t\tstd::string group_name = \"Key \" + KeyNumber;\n\t\tstd::string delete_name = \"delete_\" + KeyNumber;\n\t\tstd::string delete_label = \"Delete Key \" + KeyNumber;\n\t\t\n\t\t// time property\n\t\ttime_property_t* time_property = new time_property_t(init_owner(*this) + init_name(k3d::make_token(time_name.c_str())) + init_label(k3d::make_token(time_label.c_str())) + init_description((\"\")) + init_value(Time));\n\t\t\n\t\t// value property\n\t\ttypename keyframes_t::iterator value_it = m_keyframes.insert(std::make_pair(time_property, new value_property_t(init_owner(*this) + init_name(k3d::make_token(value_name.c_str())) + init_label(k3d::make_token(value_label.c_str())) + init_description((\"\")) + init_value(Value)))).first;\n\t\t\n\t\t// group for this key\n\t\tk3d::iproperty_group_collection::group key_group(group_name);\n\t\tm_keygroups[time_property] = group_name;\n\t\tkey_group.properties.push_back(static_cast<k3d::iproperty*>(time_property));\n\t\tkey_group.properties.push_back(static_cast<k3d::iproperty*>(value_it->second));\n\t\tregister_property_group(key_group);\n\t\tm_keys_changed_signal.emit();\n\t}\n\t\n\t/// Stores the current value at Time using keynumber\n\tvoid store_current_value(time_t Time, const std::string& KeyNumber)\n\t{\n\t\tstore_value(Time, m_value_input.pipeline_value(), KeyNumber);\n\t}\n\t\n\t/// Updates the value of the property named by label\n\tvoid update_value(const std::string& Label, const value_t& Value)\n\t{\n\t\tfor (typename keyframes_t::iterator keyframe = m_keyframes.begin(); keyframe != m_keyframes.end(); ++keyframe)\n\t\t{\n\t\t\tif (keyframe->second->property_label() == Label)\n\t\t\t{\n\t\t\t\tkeyframe->second->set_value(Value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tk3d::log() << warning << \"animation_track: Labeled value property not found!\" << std::endl;\n\t}\n\t\n\tk3d::ikeyframer::keys_changed_signal_t& keys_changed_signal()\n\t{\n\t\treturn m_keys_changed_signal;\n\t}\n\t\n\nprivate:\n\t\n\t/// Executed when the input value changes\n\tvoid on_value_change(k3d::ihint* Hint)\n\t{\n\t\tbool manual_key = m_manual_keyframe.pipeline_value();\n\t\tif(!manual_key && document().state_recorder().current_change_set())\n\t\t{\n\t\t\tkeyframe();\n\t\t}\n\t\treset_output(!manual_key);\n\t}\n\t\n\t/// Record delete undo\n\tvoid record_delete(k3d::iproperty* TimeProperty)\n\t{\n\t\tif (!m_record)\n\t\t\treturn;\n\n\t\ttime_property_t* time_property = dynamic_cast<time_property_t*>(TimeProperty);\n\t\tvalue_property_t* value_property = m_keyframes[time_property];\n\t\tstd::string keynumber = time_property->property_name().substr(9, time_property->property_name().size() - 8);\n\t\t\n\t\tk3d::record_state_change_set changeset(document(), \"Delete keyframe \" + keynumber, K3D_CHANGE_SET_CONTEXT);\n\t\t\n\t\tif(document().state_recorder().current_change_set())\n\t\t{\n\t\t\tdocument().state_recorder().current_change_set()->record_old_state(new store_state_container<time_t, value_t>(*this, time_property->pipeline_value(), value_property->pipeline_value(), keynumber));\n\t\t\tdocument().state_recorder().current_change_set()->record_new_state(new delete_state_container<time_t, value_t>(*this, keynumber));\n\t\t}\n\t}\n\t\n\t/// Record key creation undo\n\tvoid record_create(time_t& Time, value_t& Value, const std::string& Keynumber)\n\t{\n\t\tif (document().state_recorder().current_change_set())\n\t\t{\n\t\t\tm_last_store = new store_state_container<time_t, value_t>(*this, Time, Value, Keynumber);\n\t\t\tm_last_set = document().state_recorder().current_change_set();\n\t\t\tdocument().state_recorder().current_change_set()->record_new_state(m_last_store);\n\t\t\tdocument().state_recorder().current_change_set()->record_old_state(new delete_state_container<time_t, value_t>(*this, Keynumber));\n\t\t}\n\t}\n\n\ttime_property_t m_time_input;\n\tvalue_property_t m_value_input;\n\tk3d_data(value_t, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::value_demand_storage, k3d::data::no_constraint, k3d::data::read_only_property, k3d::data::no_serialization) m_output_value;\n\tk3d_data(interpolator_t*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::with_undo, k3d::data::node_storage, k3d::data::no_constraint, k3d::data::node_property, k3d::data::node_serialization) m_interpolator;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_manual_keyframe;\n\tkeyframes_t m_keyframes;\n\tkeygroups_t m_keygroups;\n\t/// True if changes should be recorded for undo/redo\n\tbool m_record;\n\t/// If true, interpolation is turned off and the input value is passed on as output\n\tbool m_no_interpolation;\n\t/// Last state change set that was being recorded to\n\tk3d::state_change_set* m_last_set; \n\tstore_state_container<time_t, value_t>* m_last_store;\n\tk3d::ikeyframer::keys_changed_signal_t m_keys_changed_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// specific instances and factories\n\n////////// matrix4 track /////////////////:\n\nclass animation_track_double_matrix4 : public animation_track<double, k3d::matrix4>\n{\n\ttypedef animation_track<double, k3d::matrix4> base;\npublic:\n\tanimation_track_double_matrix4(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, 0.0, k3d::identity3()) {}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<animation_track_double_matrix4, k3d::interface_list<k3d::ikeyframer> >factory(\n\t\t\t\tk3d::uuid(0x00347e9b, 0x97486a2b, 0xb79e71ab, 0xc719354f),\n\t\t\t\t\"AnimationTrackDoubleMatrix4\",\n\t\t\t\t(\"Stores a series of keyframes for an animation, using 'double' as time type and 'matrix4' as value\"),\n\t\t\t\t\"Animation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& animation_track_double_matrix4_factory()\n{\n\treturn animation_track_double_matrix4::get_factory();\n}\n\n/////////////// double track ///////////\n\nclass animation_track_double_double : public animation_track<double, double>\n{\n\ttypedef animation_track<double, double> base;\npublic:\n\tanimation_track_double_double(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, 0.0, 0.0) {}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<animation_track_double_double, k3d::interface_list<k3d::ikeyframer> >factory(\n\t\t\t\tk3d::uuid(0xa0b9d507, 0x20400293, 0x8f13c393, 0x31d908a8),\n\t\t\t\t\"AnimationTrackDoubleDouble\",\n\t\t\t\t(\"Stores a series of keyframes for an animation, using 'double' as time and value\"),\n\t\t\t\t\"Animation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& animation_track_double_double_factory()\n{\n\treturn animation_track_double_double::get_factory();\n}\n\n} // namespace animation\n\n} // namespace module\n"
  },
  {
    "path": "modules/animation/interpolator.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Nodes representing the actual interpolation plugins\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/tokens.h>\n#include <k3dsdk/vectors.h>\n\n#include \"interpolator.h\"\n#include <k3dsdk/type_registry.h>\n\nnamespace module\n{\n\nnamespace animation\n{\n\nclass interpolator_double_matrix4_linear :\n\tpublic linear_interpolator<double, k3d::matrix4>\n{\n\ttypedef linear_interpolator<double, k3d::matrix4> base;\npublic:\n\tinterpolator_double_matrix4_linear(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document) {}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<interpolator_double_matrix4_linear, k3d::interface_list<interpolator<double, k3d::matrix4> > >factory(\n\t\t\t\tk3d::uuid(0x2df4d81e, 0xc5499561, 0x68c25fa8, 0x34e77dc4),\n\t\t\t\t\"InterpolatorDoubleMatrix4Linear\",\n\t\t\t\t(\"Linearly interpolates matrix4 values to a double time source\"),\n\t\t\t\t\"Animation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& interpolator_double_matrix4_linear_factory()\n{\n\treturn interpolator_double_matrix4_linear::get_factory();\n}\n\nclass interpolator_double_double_linear :\n\tpublic linear_interpolator<double, double>\n{\n\ttypedef linear_interpolator<double, double> base;\npublic:\n\tinterpolator_double_double_linear(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document) {}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<interpolator_double_double_linear, k3d::interface_list<interpolator<double, double> > >factory(\n\t\t\t\tk3d::uuid(0x1aca4dea, 0x8c44f5c1, 0x5f21b9b4, 0x6ec0bbce),\n\t\t\t\t\"InterpolatorDoubleDoubleLinear\",\n\t\t\t\t(\"Linearly interpolates double values to a double time source\"),\n\t\t\t\t\"Animation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& interpolator_double_double_linear_factory()\n{\n\treturn interpolator_double_double_linear::get_factory();\n}\n\n} // namespace animation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/animation/interpolator.h",
    "content": "#ifndef MODULES_ANIMATION_INTERPOLATOR_H\n#define MODULES_ANIMATION_INTERPOLATOR_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Keyframe interpolator interface and default implementations\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <stdexcept>\n\n#include <k3dsdk/algebra.h>\n\nnamespace module\n{\n\nnamespace animation\n{\n\n/// Thrown when the interpolator does not have enough key data to give an interpolation\nclass insufficient_data_exception : public std::runtime_error\n{\npublic:\n\tinsufficient_data_exception() : std::runtime_error(\"Animation keyframe: insufficuent data to interpolate\") {}\n};\n\n/// Base class for interpolation methods for keyframed animations\ntemplate<typename time_t, typename value_t>\nclass interpolator : public k3d::node\n{\n\ttypedef k3d::node base;\npublic:\n\t/// Stores the keyframe data\n\ttypedef std::map<time_t, value_t> keyframes_t;\n\t\n\tinterpolator(k3d::iplugin_factory& Factory, k3d::idocument& Document) : base (Factory, Document) {}\n\t/// Calculate the interpolation value at Time based on Keyframes. Throws insufficient_data_exception if there aren't enough keyframes around Time\n\tvirtual value_t interpolate(time_t Time, const keyframes_t& Keyframes) = 0;\n\t\n\tvirtual ~interpolator() {}\nprotected:\n\t/// Stores the keys and values of the key before and after Time in the non-const arguments\n\tvoid get_surrounding_keys(const time_t& Time, const keyframes_t& Keyframes, time_t& t_lower, time_t& t_upper, value_t& v_lower, value_t& v_upper)\n\t{\n\t\ttypename keyframes_t::const_iterator found_key = Keyframes.lower_bound(Time);\n\t\tif (found_key == Keyframes.begin() && found_key->first == Time && !Keyframes.empty())\n\t\t{\n\t\t\tt_upper = found_key->first;\n\t\t\tv_upper = found_key->second;\n\t\t\tt_lower = t_upper;\n\t\t\tv_lower = v_upper;\n\t\t\treturn;\n\t\t}\n\t\tif (found_key == Keyframes.begin() || found_key == Keyframes.end())\n\t\t\tthrow insufficient_data_exception(); // no key before or after Time\n\t\tt_upper = found_key->first;\n\t\tv_upper = found_key->second;\n\t\t--found_key;\n\t\tt_lower = found_key->first;\n\t\tv_lower = found_key->second;\n\t}  \n};\n\n\n/// Implement linear interpolation\ntemplate <typename time_t, typename value_t>\nclass linear_interpolator :\n\tpublic interpolator<time_t, value_t>\n{\n\ttypedef interpolator<time_t, value_t> base;\npublic:\n\tlinear_interpolator<time_t, value_t>(k3d::iplugin_factory& Factory, k3d::idocument& Document) : interpolator<time_t, value_t>(Factory, Document) {}\n\tvirtual value_t interpolate(time_t Time, const typename base::keyframes_t& Keyframes)\n\t{\n\t\ttime_t t_lower, t_upper;\n\t\tvalue_t v_lower, v_upper;\n\t\tbase::get_surrounding_keys(Time, Keyframes, t_lower, t_upper, v_lower, v_upper); \n\t\treturn lerp(t_lower, t_upper, v_lower, v_upper, Time);\n\t}\nprotected:\n\tvalue_t lerp(const time_t& t_lower, const time_t& t_upper, const value_t& v_lower, const value_t& v_upper, const time_t& Time)\n\t{\n\t\tif (t_upper == t_lower)\n\t\t\treturn v_lower;\n\t\treturn v_lower + (v_upper - v_lower)*(Time - t_lower)/(t_upper - t_lower);\n\t}\t\n};\n\n/// Specialization with correct interpolation of angles\ntemplate <typename time_t>\nclass linear_interpolator<time_t, k3d::matrix4> : public interpolator<time_t, k3d::matrix4> \n{\n\ttypedef k3d::matrix4 value_t;\n\ttypedef interpolator<time_t, value_t> base;\npublic:\n\tlinear_interpolator<time_t, k3d::matrix4>(k3d::iplugin_factory& Factory, k3d::idocument& Document) : base(Factory, Document) {}\n\tvirtual value_t interpolate(time_t Time, const typename base::keyframes_t& Keyframes)\n\t{\n\t\ttime_t t_lower, t_upper;\n\t\tvalue_t v_lower, v_upper;\n\t\tbase::get_surrounding_keys(Time, Keyframes, t_lower, t_upper, v_lower, v_upper); \n\t\treturn lerp(t_lower, t_upper, v_lower, v_upper, Time);\n\t} \nprotected:\n\tk3d::matrix4 lerp(const double& t_lower, const double& t_upper, const k3d::matrix4& v_lower, const k3d::matrix4& v_upper, const double& Time)\n\t{\n\t\tif (t_upper == t_lower)\n\t\t\treturn v_lower;\n\t\tk3d::matrix4 rotation_l = k3d::extract_rotation(v_lower);\n\t\tk3d::matrix4 rotation_u = k3d::extract_rotation(v_upper);\n\t\tk3d::matrix4 norotation_l = v_lower * k3d::inverse(rotation_l);\n\t\tk3d::matrix4 norotation_u = v_upper * k3d::inverse(rotation_u);\n\t\tk3d::matrix4 norotation = norotation_l + (norotation_u - norotation_l)*(Time - t_lower)/(t_upper - t_lower);\n\t\tk3d::euler_angles angles_l(rotation_l, k3d::euler_angles::XYZstatic);\n\t\tk3d::euler_angles angles_u(rotation_u, k3d::euler_angles::XYZstatic);\n\t\tk3d::quaternion q_l(angles_l);\n\t\tk3d::quaternion q_u(angles_u);\n\t\tk3d::quaternion q_i = k3d::Slerp(q_l, q_u, (Time - t_lower)/(t_upper - t_lower));\n\t\treturn k3d::matrix4(norotation * k3d::rotate3(q_i));\n\t}\n};\n\n} // namespace animation\n\n} // namespace module\n\n#endif // !MODULES_ANIMATION_INTERPOLATOR_H\n\n"
  },
  {
    "path": "modules/animation/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements procedures required to export K-3D objects from the core module\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace animation\n{\n\nextern k3d::iplugin_factory& animation_track_double_matrix4_factory();\nextern k3d::iplugin_factory& animation_track_double_double_factory();\nextern k3d::iplugin_factory& interpolator_double_matrix4_linear_factory();\nextern k3d::iplugin_factory& interpolator_double_double_linear_factory();\n\n} // namespace animation\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::animation::animation_track_double_matrix4_factory());\n\tRegistry.register_factory(module::animation::animation_track_double_double_factory());\n\tRegistry.register_factory(module::animation::interpolator_double_matrix4_linear_factory());\n\tRegistry.register_factory(module::animation::interpolator_double_double_linear_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/annotation/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_FTGL_INCLUDE_DIR})\nINCLUDE_DIRECTORIES(${K3D_FREETYPE2_INCLUDE_DIRS})\nLINK_DIRECTORIES(${K3D_FREETYPE2_LIB_DIRS})\n\nK3D_BUILD_MODULE(k3d-annotation)\nK3D_CREATE_MODULE_PROXY(k3d-annotation)\n\nTARGET_LINK_LIBRARIES(k3d-annotation ${K3D_FTGL_LIBRARY})\nTARGET_LINK_LIBRARIES(k3d-annotation ${K3D_FREETYPE2_LIBS})\n\n"
  },
  {
    "path": "modules/annotation/annotate_normal.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transformable.h>\n#include <k3dsdk/vectors.h>\n\nnamespace module\n{\n\nnamespace annotation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// annotate_normal\n\nclass annotate_normal :\n\tpublic k3d::gl::renderable<k3d::transformable<k3d::node > >\n{\n\ttypedef k3d::gl::renderable<k3d::transformable<k3d::node > > base;\n\npublic:\n\tannotate_normal(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_normal(init_owner(*this) + init_name(\"normal\") + init_label(_(\"Normal\")) + init_description(_(\"Normal\")) + init_value(k3d::vector3(0, 0, 1))),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Color\")) + init_value(k3d::color(1, 1, 1)))\n\t{\n\t\tm_normal.changed_signal().connect(make_async_redraw_slot());\n\t\tm_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_input_matrix.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::color3d(State.node_selection ? k3d::color(1, 1, 1) : m_color.pipeline_value());\n\t\tdraw(State);\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw(State);\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid draw(const k3d::gl::render_state& State)\n\t{\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\t\tglDisable(GL_BLEND);\n\n\t\tconst k3d::vector3 normal = m_normal.pipeline_value();\n\n\t\tglBegin(GL_LINES);\n\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0));\n\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + normal);\n\t\tglEnd();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<annotate_normal> factory(\n\t\t\tk3d::uuid(0x4a17ae9f, 0x237c4c81, 0x88dffdaf, 0x96b6d095),\n\t\t\t\"AnnotateNormal\",\n\t\t\t_(\"Displays a normal\"),\n\t\t\t\"Annotation\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_normal;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// annotate_normal\n\nk3d::iplugin_factory& annotate_normal_factory()\n{\n\treturn annotate_normal::get_factory();\n}\n\n} // namespace annotation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/annotation/annotation.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"common.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/transformable.h>\n#include <k3dsdk/vectors.h>\n\n#include <FTGL/ftgl.h>\n\nnamespace module\n{\n\nnamespace annotation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// annotation\n\nclass annotation :\n\tpublic k3d::gl::renderable<k3d::transformable<k3d::node > >\n{\n\ttypedef k3d::gl::renderable<k3d::transformable<k3d::node > > base;\n\npublic:\n\tannotation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(k3d::share_path() / k3d::filesystem::generic_path(\"fonts/VeraBd.ttf\")) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_font_size(init_owner(*this) + init_name(\"font_size\") + init_label(_(\"Font Size\")) + init_description(_(\"Font size.\")) + init_value(14.0)),\n\t\tm_line_width(init_owner(*this) + init_name(\"line_width\") + init_label(_(\"Line Width\")) + init_description(_(\"Maximum width of a single line of text..\")) + init_value(200.0)),\n\t\tm_line_spacing(init_owner(*this) + init_name(\"line_spacing\") + init_label(_(\"Line Spacing\")) + init_description(_(\"Controls the spacing between lines of text.\")) + init_value(1.0)),\n\t\tm_alignment(init_owner(*this) + init_name(\"alignment\") + init_label(_(\"Alignment\")) + init_description(_(\"Controls the alignment of adjacent lines of text.\")) + init_value(LEFT) + init_values(alignment_values())),\n\t\tm_text(init_owner(*this) + init_name(\"text\") + init_label(_(\"Text\")) + init_description(_(\"Annotation text\")) + init_value(k3d::string_t(_(\"Annotation\")))),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Annotation color\")) + init_value(k3d::color(0, 0, 0))),\n\t\tm_leader(init_owner(*this) + init_name(\"leader\") + init_label(_(\"Leader\")) + init_description(_(\"Leader line\")) + init_value(false)),\n\t\tm_leader_target(init_owner(*this) + init_name(\"leader_target\") + init_label(_(\"Leader Target\")) + init_description(_(\"Leader line target\")) + init_value(k3d::identity3()))\n\t{\n\t\tm_text.set_metadata_value(\"k3d:property-type\", \"k3d:multi-line-text\");\n\n\t\tm_font_path.changed_signal().connect(make_async_redraw_slot());\n\t\tm_font_size.changed_signal().connect(make_async_redraw_slot());\n\t\tm_line_width.changed_signal().connect(make_async_redraw_slot());\n\t\tm_line_spacing.changed_signal().connect(make_async_redraw_slot());\n\t\tm_alignment.changed_signal().connect(make_async_redraw_slot());\n\t\tm_text.changed_signal().connect(make_async_redraw_slot());\n\t\tm_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_leader.changed_signal().connect(make_async_redraw_slot());\n\t\tm_leader_target.changed_signal().connect(make_async_redraw_slot());\n\t\tm_input_matrix.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::color3d(State.node_selection ? k3d::color(1, 1, 1) : m_color.pipeline_value());\n\t\tdraw(State);\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw(State);\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid draw(const k3d::gl::render_state& State)\n\t{\n\t\tFTGLPixmapFont font(m_font_path.pipeline_value().native_filesystem_string().c_str());\n\t\tif(font.Error())\n\t\t{\n\t\t\tk3d::log() << error << \"error initializing font\" << std::endl;\n\t\t\treturn;\n\t\t}\n\t\tfont.FaceSize(static_cast<unsigned int>(m_font_size.pipeline_value()));\n\n\t\tFTSimpleLayout layout;\n\t\tlayout.SetFont(&font);\n\t\tlayout.SetLineLength(m_line_width.pipeline_value());\n\t\tlayout.SetLineSpacing(m_line_spacing.pipeline_value());\n\n\t\tswitch(m_alignment.pipeline_value())\n\t\t{\n\t\t\tcase LEFT:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_LEFT);\n\t\t\t\tbreak;\n\t\t\tcase CENTER:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_CENTER);\n\t\t\t\tbreak;\n\t\t\tcase RIGHT:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_RIGHT);\n\t\t\t\tbreak;\n\t\t\tcase JUSTIFY:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_JUSTIFY);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\t\tglDisable(GL_BLEND);\n\n\t\tglRasterPos3d(0, 0, 0);\n\t\tlayout.Render(m_text.pipeline_value().c_str());\n\n\t\tif(m_leader.pipeline_value())\n\t\t{\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tglPushMatrix();\n\t\t\tk3d::gl::push_matrix(k3d::inverse(matrix()));\n\n\t\t\tconst k3d::point3 a = m_input_matrix.pipeline_value() * k3d::point3(0, 0, 0);\n\t\t\tconst k3d::point3 c = m_leader_target.pipeline_value() * k3d::point3(0, 0, 0);\n\t\t\tconst k3d::point3 b = a + (0.05 * (b - a));\n\n\t\t\tglBegin(GL_LINES);\n\t\t\tk3d::gl::vertex3d(b);\n\t\t\tk3d::gl::vertex3d(c);\n\t\t\tglEnd();\n\n\t\t\tglPopMatrix();\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<annotation,\n\t\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\t\tk3d::interface_list<k3d::imatrix_sink > > >factory(\n\t\t\tk3d::uuid(0x951d3c20, 0xe2f74d6d, 0x8bc90ef8, 0x9a8967b6),\n\t\t\t\"Annotation\",\n\t\t\t_(\"Displays text annotations in the 3D document, primarily for documentation / tutorials\"),\n\t\t\t\"Annotation\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_font_size;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_line_width;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_line_spacing;\n\tk3d_data(alignment_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_alignment;\n\tk3d::metadata::property<k3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization)> m_text;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_leader;\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_leader_target;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// annotation_factory\n\nk3d::iplugin_factory& annotation_factory()\n{\n\treturn annotation::get_factory();\n}\n\n} // namespace annotation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/annotation/annotation_2d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"common.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/irenderable_gl.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/render_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/utility_gl.h>\n#include <k3dsdk/vectors.h>\n\n#include <FTGL/ftgl.h>\n\nnamespace module\n{\n\nnamespace annotation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// annotation_2d\n\nclass annotation_2d :\n\tpublic k3d::node,\n\tpublic k3d::gl::irenderable\n{\n\ttypedef k3d::node base;\n\npublic:\n\tannotation_2d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(k3d::share_path() / k3d::filesystem::generic_path(\"fonts/VeraBd.ttf\")) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_font_size(init_owner(*this) + init_name(\"font_size\") + init_label(_(\"Font Size\")) + init_description(_(\"Font size.\")) + init_value(14.0)),\n\t\tm_line_width(init_owner(*this) + init_name(\"line_width\") + init_label(_(\"Line Width\")) + init_description(_(\"Maximum width of a single line of text..\")) + init_value(200.0)),\n\t\tm_line_spacing(init_owner(*this) + init_name(\"line_spacing\") + init_label(_(\"Line Spacing\")) + init_description(_(\"Controls the spacing between lines of text.\")) + init_value(1.0)),\n\t\tm_alignment(init_owner(*this) + init_name(\"alignment\") + init_label(_(\"Alignment\")) + init_description(_(\"Controls the alignment of adjacent lines of text.\")) + init_value(LEFT) + init_values(alignment_values())),\n\t\tm_text(init_owner(*this) + init_name(\"text\") + init_label(_(\"Text\")) + init_description(_(\"Annotation text\")) + init_value(k3d::string_t(_(\"Annotation\")))),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Annotation color\")) + init_value(k3d::color(0, 0, 0))),\n\t\tm_x(init_owner(*this) + init_name(\"x\") + init_label(_(\"X\")) + init_description(_(\"X Position\")) + init_value(0.0) + init_units(typeid(k3d::measurement::scalar)) + init_step_increment(0.1)),\n\t\tm_y(init_owner(*this) + init_name(\"y\") + init_label(_(\"Y\")) + init_description(_(\"Y Position\")) + init_value(0.0) + init_units(typeid(k3d::measurement::scalar)) + init_step_increment(0.1))\n\t{\n\t\tm_text.set_metadata_value(\"k3d:property-type\", \"k3d:multi-line-text\");\n\n\t\tm_font_path.changed_signal().connect(make_async_redraw_slot());\n\t\tm_font_size.changed_signal().connect(make_async_redraw_slot());\n\t\tm_line_width.changed_signal().connect(make_async_redraw_slot());\n\t\tm_line_spacing.changed_signal().connect(make_async_redraw_slot());\n\t\tm_alignment.changed_signal().connect(make_async_redraw_slot());\n\t\tm_text.changed_signal().connect(make_async_redraw_slot());\n\t\tm_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_x.changed_signal().connect(make_async_redraw_slot());\n\t\tm_y.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tsigc::slot<void, iunknown*> make_async_redraw_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &annotation_2d::async_redraw);\n\t}\n\n\tvoid async_redraw(iunknown*)\n\t{\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tk3d::uint_t gl_layer()\n\t{\n\t\treturn 2048;\n\t}\n\n\tvoid gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::color3d(State.node_selection ? k3d::color(1, 1, 1) : m_color.pipeline_value());\n\t\tdraw(State);\n\t}\n\n\tvoid gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\t/** \\note Selection is disabled for this plugin for a couple of reasons:\n\t\tFirst, the combination of the custom matrix used to position the text and the\n\t\tpick matrix causes weird behavior.\n\t\tSecond, we assume that it is useful to have on-screen displays that don't\n\t\tinterfere with \"normal\" selection of geometry. */\n\t}\n\n\tvoid draw(const k3d::gl::render_state& State)\n\t{\n\t\tFTGLPixmapFont font(m_font_path.pipeline_value().native_filesystem_string().c_str());\n\t\tif(font.Error())\n\t\t{\n\t\t\tk3d::log() << error << \"error initializing font\" << std::endl;\n\t\t\treturn;\n\t\t}\n\t\tfont.FaceSize(static_cast<unsigned int>(m_font_size.pipeline_value()));\n\n\t\tFTSimpleLayout layout;\n\t\tlayout.SetFont(&font);\n\t\tlayout.SetLineLength(m_line_width.pipeline_value());\n\t\tlayout.SetLineSpacing(m_line_spacing.pipeline_value());\n\n\t\tswitch(m_alignment.pipeline_value())\n\t\t{\n\t\t\tcase LEFT:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_LEFT);\n\t\t\t\tbreak;\n\t\t\tcase CENTER:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_CENTER);\n\t\t\t\tbreak;\n\t\t\tcase RIGHT:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_RIGHT);\n\t\t\t\tbreak;\n\t\t\tcase JUSTIFY:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_JUSTIFY);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\t\tglDisable(GL_BLEND);\n\n\t\tglMatrixMode(GL_PROJECTION);\n\t\tglPushMatrix();\n\t\tglLoadIdentity();\n\t\tglOrtho(-1, 1, -1, 1, -1, 1);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tglLoadIdentity();\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\t\tglDisable(GL_BLEND);\n\n\t\tconst std::string text = m_text.pipeline_value();\n\n\t\tglRasterPos3d(m_x.pipeline_value(), m_y.pipeline_value(), 0);\n\t\tlayout.Render(m_text.pipeline_value().c_str());\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\n\t\tglMatrixMode(GL_PROJECTION);\n\t\tglPopMatrix();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<annotation_2d>factory(\n\t\t\tk3d::uuid(0x2ad16705, 0x62f1410d, 0xbcc9800c, 0xfa93762e),\n\t\t\t\"Annotation2D\",\n\t\t\t_(\"Displays 2D text annotations, primarily for documentation / tutorials\"),\n\t\t\t\"Annotation\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_font_size;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_line_width;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_line_spacing;\n\tk3d_data(alignment_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_alignment;\n\tk3d::metadata::property<k3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization)> m_text;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// annotation_2d_factory\n\nk3d::iplugin_factory& annotation_2d_factory()\n{\n\treturn annotation_2d::get_factory();\n}\n\n} // namespace annotation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/annotation/annotation_3d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"common.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/transformable.h>\n#include <k3dsdk/vectors.h>\n\n#include <FTGL/ftgl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace annotation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// annotation_3d\n\nclass annotation_3d :\n\tpublic k3d::gl::renderable<k3d::transformable<k3d::node > >\n{\n\ttypedef k3d::gl::renderable<k3d::transformable<k3d::node > > base;\n\npublic:\n\tannotation_3d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(k3d::share_path() / k3d::filesystem::generic_path(\"fonts/VeraBd.ttf\")) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_font_size(init_owner(*this) + init_name(\"font_size\") + init_label(_(\"Font Size\")) + init_description(_(\"Font size.\")) + init_value(14.0)),\n\t\tm_line_width(init_owner(*this) + init_name(\"line_width\") + init_label(_(\"Line Width\")) + init_description(_(\"Maximum width of a single line of text..\")) + init_value(200.0)),\n\t\tm_line_spacing(init_owner(*this) + init_name(\"line_spacing\") + init_label(_(\"Line Spacing\")) + init_description(_(\"Controls the spacing between lines of text.\")) + init_value(1.0)),\n\t\tm_alignment(init_owner(*this) + init_name(\"alignment\") + init_label(_(\"Alignment\")) + init_description(_(\"Controls the alignment of adjacent lines of text.\")) + init_value(LEFT) + init_values(alignment_values())),\n\t\tm_text(init_owner(*this) + init_name(\"text\") + init_label(_(\"Text\")) + init_description(_(\"Annotation text\")) + init_value(k3d::string_t(_(\"Annotation\")))),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Annotation color\")) + init_value(k3d::color(0, 0, 0)))\n\t{\n\t\tm_text.set_metadata_value(\"k3d:property-type\", \"k3d:multi-line-text\");\n\n\t\tm_font_path.changed_signal().connect(make_async_redraw_slot());\n\t\tm_font_size.changed_signal().connect(make_async_redraw_slot());\n\t\tm_line_width.changed_signal().connect(make_async_redraw_slot());\n\t\tm_line_spacing.changed_signal().connect(make_async_redraw_slot());\n\t\tm_alignment.changed_signal().connect(make_async_redraw_slot());\n\t\tm_text.changed_signal().connect(make_async_redraw_slot());\n\t\tm_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_input_matrix.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::color3d(State.node_selection ? k3d::color(1, 1, 1) : m_color.pipeline_value());\n\t\tdraw(State);\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw(State);\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid draw(const k3d::gl::render_state& State)\n\t{\n\t\tFTGLPolygonFont font(m_font_path.pipeline_value().native_filesystem_string().c_str());\n\t\tif(font.Error())\n\t\t{\n\t\t\tk3d::log() << error << \"error initializing font\" << std::endl;\n\t\t\treturn;\n\t\t}\n\t\tfont.FaceSize(static_cast<unsigned int>(m_font_size.pipeline_value()));\n\n\t\tFTSimpleLayout layout;\n\t\tlayout.SetFont(&font);\n\t\tlayout.SetLineLength(m_line_width.pipeline_value());\n\t\tlayout.SetLineSpacing(m_line_spacing.pipeline_value());\n\n\t\tswitch(m_alignment.pipeline_value())\n\t\t{\n\t\t\tcase LEFT:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_LEFT);\n\t\t\t\tbreak;\n\t\t\tcase CENTER:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_CENTER);\n\t\t\t\tbreak;\n\t\t\tcase RIGHT:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_RIGHT);\n\t\t\t\tbreak;\n\t\t\tcase JUSTIFY:\n\t\t\t\tlayout.SetAlignment(FTGL::ALIGN_JUSTIFY);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\t\tglDisable(GL_BLEND);\n\n\t\tglRasterPos3d(0, 0, 0);\n\t\tlayout.Render(m_text.pipeline_value().c_str());\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<annotation_3d,\n\t\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\t\tk3d::interface_list<k3d::imatrix_sink > > >factory(\n\t\t\tk3d::uuid(0xc507e5ea, 0x8f425637, 0x85b2829d, 0x7eb1c4c4),\n\t\t\t\"Annotation3D\",\n\t\t\t_(\"Displays text annotations in the 3D document, primarily for documentation / tutorials\"),\n\t\t\t\"Annotation\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_font_size;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_line_width;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_line_spacing;\n\tk3d_data(alignment_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_alignment;\n\tk3d::metadata::property<k3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization)> m_text;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// annotation_3d_factory\n\nk3d::iplugin_factory& annotation_3d_factory()\n{\n\treturn annotation_3d::get_factory();\n}\n\n} // namespace annotation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/annotation/common.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"common.h\"\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/types.h>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace annotation\n{\n\nstd::ostream& operator << (std::ostream& Stream, const alignment_t& Value)\n{\n\tswitch(Value)\n\t{\n\t\tcase LEFT:\n\t\t\tStream << \"left\";\n\t\t\tbreak;\n\t\tcase CENTER:\n\t\t\tStream << \"center\";\n\t\t\tbreak;\n\t\tcase RIGHT:\n\t\t\tStream << \"right\";\n\t\t\tbreak;\n\t\tcase JUSTIFY:\n\t\t\tStream << \"justify\";\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\nstd::istream& operator >> (std::istream& Stream, alignment_t& Value)\n{\n\tk3d::string_t text;\n\tStream >> text;\n\n\tif(text == \"left\")\n\t\tValue = LEFT;\n\telse if(text == \"center\")\n\t\tValue = CENTER;\n\telse if(text == \"right\")\n\t\tValue = RIGHT;\n\telse if(text == \"justify\")\n\t\tValue = JUSTIFY;\n\telse\n\t\tk3d::log() << k3d_file_reference << \": unknown enumeration [\" << text << \"]\"<< std::endl;\n\n\treturn Stream;\n}\n\nconst k3d::ienumeration_property::enumeration_values_t& alignment_values()\n{\n\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Left\", \"left\", \"Left-justify text.\"));\n\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Center\", \"center\", \"Center-justify text.\"));\n\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Right\", \"right\", \"Right-justify text.\"));\n\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Justify\", \"justify\", \"Justify text.\"));\n\t}\n\n\treturn values;\n}\n\n} // namespace annotation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/annotation/common.h",
    "content": "#ifndef MODULES_ANNOTATION_COMMON_H\n#define MODULES_ANNOTATION_COMMON_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/ienumeration_property.h>\n#include <iosfwd>\n\nnamespace module\n{\n\nnamespace annotation\n{\n\nenum alignment_t\n{\n\tLEFT,\n\tCENTER,\n\tRIGHT,\n\tJUSTIFY,\n};\n\nstd::ostream& operator << (std::ostream& Stream, const alignment_t& Value);\nstd::istream& operator >> (std::istream& Stream, alignment_t& Value);\n\nconst k3d::ienumeration_property::enumeration_values_t& alignment_values();\n\n} // namespace annotation\n\n} // namespace module\n\n#endif // !MODULES_ANNOTATION_COMMON_H\n\n"
  },
  {
    "path": "modules/annotation/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements procedures required to export K-3D objects from the core module\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace annotation\n{\n\nextern k3d::iplugin_factory& annotate_normal_factory();\nextern k3d::iplugin_factory& annotation_2d_factory();\nextern k3d::iplugin_factory& annotation_3d_factory();\nextern k3d::iplugin_factory& annotation_factory();\n\n} // namespace annotation\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::annotation::annotate_normal_factory());\n\tRegistry.register_factory(module::annotation::annotation_2d_factory());\n\tRegistry.register_factory(module::annotation::annotation_3d_factory());\n\tRegistry.register_factory(module::annotation::annotation_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/aqsis/CMakeLists.txt",
    "content": "LIST(GET Aqsis_INCLUDE_DIRECTORIES 1 Aqsis_SRC_INCL_DIR)\nSET(Aqsis_SOURCE_DIR ${Aqsis_SRC_INCL_DIR}/..)\n\nINCLUDE_DIRECTORIES(\n\t${CMAKE_CURRENT_BINARY_DIR}\n\t${Aqsis_INCLUDE_DIRECTORIES}\n\t${Aqsis_SOURCE_DIR}\n\t${Aqsis_SOURCE_DIR}/libs/core\n\t${Aqsis_SOURCE_DIR}/libs/core/api\n\t${Aqsis_SOURCE_DIR}/libs/core/ddmanager\n\t${Aqsis_SOURCE_DIR}/libs/core/geometry\n\t${Aqsis_SOURCE_DIR}/libs/core/raytrace\n\t)\n\nK3D_BUILD_MODULE(k3d-aqsis)\nK3D_CREATE_MODULE_PROXY(k3d-aqsis)\nTARGET_LINK_LIBRARIES(k3d-aqsis aqsis_core)\n"
  },
  {
    "path": "modules/aqsis/engine.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/imeta_object.h>\n#include <k3dsdk/istreaming_bitmap_source.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/signal_system.h>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n#include <sstream>\n\n#include <aqsis/ri/ri.h>\n#include <aqsis/math/region.h>\n#include <libs/core/ddmanager/iddmanager.h>\n#include <libs/core/renderer.h>\n\nnamespace module\n{\n\nnamespace aqsis\n{\n\ntypedef sigc::signal<void, k3d::istreaming_bitmap_source::coordinate, k3d::istreaming_bitmap_source::coordinate> bitmap_start_signal_t;\ntypedef sigc::signal<void, k3d::istreaming_bitmap_source::coordinate, k3d::istreaming_bitmap_source::coordinate, const k3d::istreaming_bitmap_source::bucket&> bitmap_bucket_signal_t;\ntypedef sigc::signal<void> bitmap_finish_signal_t;\n\n/////////////////////////////////////////////////////////////////////////////\n// display_manager\n\n/// Custom Aqsis display manager that forwards display data using signals\nclass display_manager : public Aqsis::IqDDManager\n{\npublic:\n\tdisplay_manager(bitmap_start_signal_t& BitmapStartSignal, bitmap_bucket_signal_t& BitmapBucketSignal, bitmap_finish_signal_t BitmapFinishSignal) :\n\t\tbitmap_start_signal(BitmapStartSignal),\n\t\tbitmap_bucket_signal(BitmapBucketSignal),\n\t\tbitmap_finish_signal(BitmapFinishSignal)\n\t{\n\t}\n\nprivate:\n\tTqInt Initialise()\n\t{\n\t\treturn 0;\n\t}\n\n\tTqInt Shutdown()\n\t{\n\t\treturn 0;\n\t}\n\n\tTqInt AddDisplay(const TqChar* name, const TqChar* type, const TqChar* mode, TqInt modeID, TqInt dataOffset, TqInt dataSize, std::map<std::string, void*> mapOfArguments)\n\t{\n\t\treturn 0;\n\t}\n\n\tTqInt ClearDisplays()\n\t{\n\t\treturn 0;\n\t}\n\n\tTqInt OpenDisplays(TqInt width, TqInt height)\n\t{\n\t\tbitmap_start_signal.emit(width, height);\n\t\treturn 0;\n\t}\n\n\tTqInt CloseDisplays()\n\t{\n\t\tbitmap_finish_signal.emit();\n\t\treturn 0;\n\t}\n\n\tTqInt DisplayBucket(const Aqsis::CqRegion& Region, const Aqsis::IqChannelBuffer* Buffer)\n\t{\n\t\tbitmap.recreate(Buffer->width(), Buffer->height());\n\t\tk3d::istreaming_bitmap_source::bitmap::view_t bucket = view(bitmap);\n\n\t\tconst int index = Buffer->getChannelIndex(\"rgb\");\n\t\tfor(int y = 0; y != Buffer->height(); ++y)\n\t\t{\n\t\t\tfor(int x = 0; x != Buffer->width(); ++x)\n\t\t\t{\n\t\t\t\tAqsis::IqChannelBuffer::TqConstChannelPtr values = (*Buffer)(x, y, index);\n\t\t\t\t*bucket.at(x, y) = k3d::istreaming_bitmap_source::pixel(values[0], values[1], values[2], values[3]);\n\t\t\t}\n\t\t}\n\n\t\tbitmap_bucket_signal.emit(Region.xMin(), Region.yMin(), bucket);\n\t\treturn 0;\n\t}\n\n\tbool fDisplayNeeds(const TqChar* var)\n\t{\n\t\tif(std::string(var) == \"rgba\")\n\t\t\treturn true;\n\t\tif(std::string(var) == \"Ci\")\n\t\t\treturn true;\n\t\tif(std::string(var) == \"Oi\")\n\t\t\treturn true;\n\t\treturn false;\n\t}\n\n\tTqInt Uses()\n\t{\n\t\treturn 0;\n\t}\n\n\tTqInt numDisplayRequests()\n\t{\n\t\treturn 0;\n\t}\n\n\tboost::shared_ptr<Aqsis::IqDisplayRequest> displayRequest(TqInt index)\n\t{\n\t\treturn boost::shared_ptr<Aqsis::IqDisplayRequest>();\n\t}\n\n\tbitmap_start_signal_t& bitmap_start_signal;\n\tbitmap_bucket_signal_t& bitmap_bucket_signal;\n\tbitmap_finish_signal_t& bitmap_finish_signal;\n\n\tk3d::istreaming_bitmap_source::bitmap bitmap;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// engine\n\nclass engine :\n\tpublic k3d::istreaming_bitmap_source,\n\tpublic k3d::imeta_object\n{\npublic:\n\tvirtual sigc::connection connect_bitmap_start_signal(const sigc::slot<void, coordinate, coordinate>& Slot)\n\t{\n\t\treturn bitmap_start_signal.connect(Slot);\n\t}\n\n\tvirtual sigc::connection connect_bitmap_bucket_signal(const sigc::slot<void, coordinate, coordinate, const bucket&>& Slot)\n\t{\n\t\treturn bitmap_bucket_signal.connect(Slot);\n\t}\n\n\tvirtual sigc::connection connect_bitmap_finish_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn bitmap_finish_signal.connect(Slot);\n\t}\n\n\tvirtual const boost::any execute(const k3d::string_t& Command, const std::vector<boost::any>& Arguments)\n\t{\n\t\tif(Command == \"render\")\n\t\t{\n\t\t\tstatic RtFloat fov = 45, intensity = 0.5;\n\t\t\tstatic RtFloat Ka = 0.5, Kd = 0.8, Ks = 0.2;\n\t\t\tstatic RtPoint from = {0,0,1}, to = {0,10,0};\n\t\t\tRiBegin(RI_NULL);\n\n\t\t\t//display_manager* const manager = new display_manager(bitmap_start_signal, bitmap_bucket_signal, bitmap_finish_signal);\n\t\t\t//Aqsis::QGetRenderContext()->SetDisplayManager(manager);\n\n\t\t\tRiFormat(512, 512, 1);\n\t\t\tRiPixelSamples(2, 2);\n\t\t\tRiFrameBegin(1);\n\t\t\tRiDisplay(\"test1.tiff\", \"framebuffer\", \"rgba\", RI_NULL);\n\t\t\tRiProjection(\"perspective\", \"fov\", &fov, RI_NULL);\n\t\t\tRiRotate(-116.344, 0, 0, 1);\n\t\t\tRiRotate(-47.9689, 1, 0, 0);\n\t\t\tRiRotate(-123.69, 0, 1, 0);\n\t\t\tRiTranslate(15, -20, -10);\n\t\t\tRiWorldBegin();\n\t\t\tRiSphere(5, -5, 5, 360, RI_NULL);\n\t\t\tRiWorldEnd();\n\t\t\tRiFrameEnd();\n\t\t\tRiEnd();\n\n\t\t\treturn true;\n\t\t}\n\t\telse if(Command == \"cancel\")\n\t\t{\n\t\t\tAqsis::QGetRenderContext()->Quit();\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tk3d::log() << error << \"Unknown command: \" << Command << std::endl;\n\t\t}\n\n\t\treturn boost::any();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<engine> factory(\n\t\t\tk3d::uuid(0xe01447a1, 0x9642d8f8, 0xb5d73db8, 0xccaf2bf7),\n\t\t\t\"EmbeddedAqsisRenderManEngine\",\n\t\t\t_(\"Provides an embedded Aqsis RenderMan engine.\"),\n\t\t\t\"RenderMan\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tbitmap_start_signal_t bitmap_start_signal;\n\tbitmap_bucket_signal_t bitmap_bucket_signal;\n\tbitmap_finish_signal_t bitmap_finish_signal;\n};\n\n} // namespace aqsis\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::aqsis::engine::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/array/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-array)\nK3D_CREATE_MODULE_PROXY(k3d-array)\n\n"
  },
  {
    "path": "modules/array/alternate_array_1d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace array\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// alternate_array_1d\n\nclass alternate_array_1d :\n\tpublic transform_array_1d\n{\n\ttypedef transform_array_1d base;\n\npublic:\n\talternate_array_1d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_axis1(init_owner(*this) + init_name(\"axis1\") + init_label(_(\"Axis1\")) + init_description(_(\"Axis1\")) + init_value(k3d::X) + init_enumeration(k3d::axis_values()))\n\t{\n\t\tm_axis1.changed_signal().connect(make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1)\n\t{\n\t\tconst k3d::axis axis1 = m_axis1.pipeline_value();\n\t\tk3d::point3 scale1(k3d::X == axis1 ? -1 : 1, k3d::Y == axis1 ? -1 : 1, k3d::Z == axis1 ? -1 : 1);\n\n\t\tconst k3d::matrix4 matrix1 = (Index1 % 2) ? k3d::scale3(scale1[0], scale1[1], scale1[2]) : k3d::identity3();\n\n\t\treturn matrix1;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory< alternate_array_1d,\n\t\t\t\tk3d::interface_list<k3d::itransform_array_1d> > factory(\n\t\t\t\tk3d::uuid(0x172b9170, 0x91d2449b, 0xaa057e85, 0xafb2c01a),\n\t\t\t\t\"AlternateArray1D\",\n\t\t\t\t_(\"AlternateArray1D\"),\n\t\t\t\t\"Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_axis1;\n};\n\nk3d::iplugin_factory& alternate_array_1d_factory()\n{\n\treturn alternate_array_1d::get_factory();\n}\n\n} // namespace array\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/array/alternate_array_2d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace array\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// alternate_array_2d\n\nclass alternate_array_2d :\n\tpublic transform_array_2d\n{\n\ttypedef transform_array_2d base;\n\npublic:\n\talternate_array_2d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_axis1(init_owner(*this) + init_name(\"axis1\") + init_label(_(\"Axis1\")) + init_description(_(\"Axis1\")) + init_value(k3d::X) + init_enumeration(k3d::axis_values())),\n\t\tm_axis2(init_owner(*this) + init_name(\"axis2\") + init_label(_(\"Axis2\")) + init_description(_(\"Axis2\")) + init_value(k3d::Y) + init_enumeration(k3d::axis_values()))\n\t{\n\t\tm_axis1.changed_signal().connect(make_node_change_slot());\n\t\tm_axis2.changed_signal().connect(make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2)\n\t{\n\t\tconst k3d::axis axis1 = m_axis1.pipeline_value();\n\t\tconst k3d::axis axis2 = m_axis2.pipeline_value();\n\n\t\tk3d::point3 scale1(k3d::X == axis1 ? -1 : 1, k3d::Y == axis1 ? -1 : 1, k3d::Z == axis1 ? -1 : 1);\n\t\tk3d::point3 scale2(k3d::X == axis2 ? -1 : 1, k3d::Y == axis2 ? -1 : 1, k3d::Z == axis2 ? -1 : 1);\n\n\t\tconst k3d::matrix4 matrix1 = (Index1 % 2) ? k3d::scale3(scale1[0], scale1[1], scale1[2]) : k3d::identity3();\n\t\tconst k3d::matrix4 matrix2 = (Index2 % 2) ? k3d::scale3(scale2[0], scale2[1], scale2[2]) : k3d::identity3();\n\n\t\treturn matrix1 * matrix2;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory< alternate_array_2d,\n\t\t\t\tk3d::interface_list<k3d::itransform_array_2d> > factory(\n\t\t\t\tk3d::uuid(0x172b9170, 0x92d2449b, 0xaa057e85, 0xafb2c01b),\n\t\t\t\t\"AlternateArray2D\",\n\t\t\t\t_(\"AlternateArray2D\"),\n\t\t\t\t\"Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_axis1;\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_axis2;\n};\n\nk3d::iplugin_factory& alternate_array_2d_factory()\n{\n\treturn alternate_array_2d::get_factory();\n}\n\n} // namespace array\n\n} // namespace module\n"
  },
  {
    "path": "modules/array/alternate_array_3d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace array\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// alternate_array_3d\n\nclass alternate_array_3d :\n\tpublic transform_array_3d\n{\n\ttypedef transform_array_3d base;\n\npublic:\n\talternate_array_3d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_axis1(init_owner(*this) + init_name(\"axis1\") + init_label(_(\"Axis1\")) + init_description(_(\"Axis1\")) + init_value(k3d::X) + init_enumeration(k3d::axis_values())),\n\t\tm_axis2(init_owner(*this) + init_name(\"axis2\") + init_label(_(\"Axis2\")) + init_description(_(\"Axis2\")) + init_value(k3d::Y) + init_enumeration(k3d::axis_values())),\n\t\tm_axis3(init_owner(*this) + init_name(\"axis3\") + init_label(_(\"Axis3\")) + init_description(_(\"Axis3\")) + init_value(k3d::Z) + init_enumeration(k3d::axis_values()))\n\t{\n\t\tm_axis1.changed_signal().connect(make_node_change_slot());\n\t\tm_axis2.changed_signal().connect(make_node_change_slot());\n\t\tm_axis3.changed_signal().connect(make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2, unsigned long Index3, unsigned long Count3)\n\t{\n\t\tconst k3d::axis axis1 = m_axis1.pipeline_value();\n\t\tconst k3d::axis axis2 = m_axis2.pipeline_value();\n\t\tconst k3d::axis axis3 = m_axis3.pipeline_value();\n\n\t\tk3d::point3 scale1(k3d::X == axis1 ? -1 : 1, k3d::Y == axis1 ? -1 : 1, k3d::Z == axis1 ? -1 : 1);\n\t\tk3d::point3 scale2(k3d::X == axis2 ? -1 : 1, k3d::Y == axis2 ? -1 : 1, k3d::Z == axis2 ? -1 : 1);\n\t\tk3d::point3 scale3(k3d::X == axis3 ? -1 : 1, k3d::Y == axis3 ? -1 : 1, k3d::Z == axis3 ? -1 : 1);\n\n\t\tconst k3d::matrix4 matrix1 = (Index1 % 2) ? k3d::scale3(scale1[0], scale1[1], scale1[2]) : k3d::identity3();\n\t\tconst k3d::matrix4 matrix2 = (Index2 % 2) ? k3d::scale3(scale2[0], scale2[1], scale2[2]) : k3d::identity3();\n\t\tconst k3d::matrix4 matrix3 = (Index3 % 2) ? k3d::scale3(scale3[0], scale3[1], scale3[2]) : k3d::identity3();\n\n\t\treturn matrix1 * matrix2 * matrix3;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory< alternate_array_3d,\n\t\t\t\tk3d::interface_list<k3d::itransform_array_3d> > factory(\n\t\t\t\tk3d::uuid(0x172b9170, 0x93d2449b, 0xaa057e85, 0xafb2c01c),\n\t\t\t\t\"AlternateArray3D\",\n\t\t\t\t_(\"AlternateArray3D\"),\n\t\t\t\t\"Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_axis1;\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_axis2;\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_axis3;\n};\n\nk3d::iplugin_factory& alternate_array_3d_factory()\n{\n\treturn alternate_array_3d::get_factory();\n}\n\n} // namespace array\n\n} // namespace module\n"
  },
  {
    "path": "modules/array/detail.h",
    "content": "#ifndef MODULES_ARRAY_DETAIL_H\n#define MODULES_ARRAY_DETAIL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/itransform_array_1d.h>\n#include <k3dsdk/itransform_array_2d.h>\n#include <k3dsdk/itransform_array_3d.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/node_change_signal.h>\n#include <k3dsdk/signal_slots.h>\n\nnamespace module\n{\n\nnamespace array\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// transform_array_1d\n\n/// Boilerplate implementation of k3d::itransform_array_1d\nclass transform_array_1d :\n\tpublic k3d::node,\n\tpublic k3d::node_change_signal<transform_array_1d>,\n\tpublic k3d::itransform_array_1d\n{\n\ttypedef k3d::node base;\n\npublic:\n\ttransform_array_1d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_layout(init_owner(*this) + init_name(\"layout\") + init_label(_(\"Layout\")) + init_description(_(\"Layout\")) + init_value<k3d::itransform_array_1d*>(0)),\n\t\tm_processing(false)\n\t{\n\t\tm_layout.changed_signal().connect(this->make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 get_element(unsigned long Index1, unsigned long Count1)\n\t{\n\t\tk3d::matrix4 result = on_get_element(Index1, Count1);\n\n\t\tif(m_processing)\n\t\t{\n\t\t\tif(!Index1)\n\t\t\t\tk3d::log() << warning << \"breaking array_1d infinite loop\" << std::endl;\n\t\t\treturn result;\n\t\t}\n\n\t\tm_processing = true;\n\t\tif(k3d::itransform_array_1d* const layout = m_layout.pipeline_value())\n\t\t\tresult = result * layout->get_element(Index1, Count1);\n\t\tm_processing = false;\n\n\t\treturn result;\n\t}\n\nprivate:\n\tvirtual const k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1) = 0;\n\n\tk3d_data(k3d::itransform_array_1d*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_layout;\n\n\tbool m_processing;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// transform_array_2d\n\n/// Boilerplate implementation of k3d::itransform_array_1d\nclass transform_array_2d :\n\tpublic k3d::node,\n\tpublic k3d::node_change_signal<transform_array_2d>,\n\tpublic k3d::itransform_array_2d\n{\n\ttypedef k3d::node base;\n\npublic:\n\ttransform_array_2d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_layout(init_owner(*this) + init_name(\"layout\") + init_label(_(\"Layout\")) + init_description(_(\"Layout\")) + init_value<k3d::itransform_array_2d*>(0)),\n\t\tm_processing(false)\n\t{\n\t\tm_layout.changed_signal().connect(this->make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2)\n\t{\n\t\tk3d::matrix4 result = on_get_element(Index1, Count1, Index2, Count2);\n\n\t\tif(m_processing)\n\t\t{\n\t\t\tif(!Index1 && !Index2)\n\t\t\t\tk3d::log() << warning << \"breaking array_2d infinite loop\" << std::endl;\n\t\t\treturn result;\n\t\t}\n\n\t\tm_processing = true;\n\t\tif(k3d::itransform_array_2d* const layout = m_layout.pipeline_value())\n\t\t\tresult = result * layout->get_element(Index1, Count1, Index2, Count2);\n\t\tm_processing = false;\n\n\t\treturn result;\n\t}\n\nprivate:\n\tvirtual const k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2) = 0;\n\n\tk3d_data(k3d::itransform_array_2d*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_layout;\n\n\tbool m_processing;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// transform_array_3d\n\n/// Boilerplate implementation of k3d::itransform_array_1d\nclass transform_array_3d :\n\tpublic k3d::node,\n\tpublic k3d::node_change_signal<transform_array_3d>,\n\tpublic k3d::itransform_array_3d\n{\n\ttypedef k3d::node base;\n\npublic:\n\ttransform_array_3d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_layout(init_owner(*this) + init_name(\"layout\") + init_label(_(\"Layout\")) + init_description(_(\"Layout\")) + init_value<k3d::itransform_array_3d*>(0)),\n\t\tm_processing(false)\n\t{\n\t\tm_layout.changed_signal().connect(this->make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2, unsigned long Index3, unsigned long Count3)\n\t{\n\t\tk3d::matrix4 result = on_get_element(Index1, Count1, Index2, Count2, Index3, Count3);\n\n\t\tif(m_processing)\n\t\t{\n\t\t\tif(!Index1 && !Index2 && !Index3)\n\t\t\t\tk3d::log() << warning << \"breaking array_3d infinite loop\" << std::endl;\n\t\t\treturn k3d::identity3();\n\t\t}\n\n\t\tm_processing = true;\n\t\tif(k3d::itransform_array_3d* const layout = m_layout.pipeline_value())\n\t\t\tresult = result * layout->get_element(Index1, Count1, Index2, Count2, Index3, Count3);\n\t\tm_processing = false;\n\n\t\treturn result;\n\t}\n\nprivate:\n\tvirtual const k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2, unsigned long Index3, unsigned long Count3) = 0;\n\n\tk3d_data(k3d::itransform_array_3d*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_layout;\n\n\tbool m_processing;\n};\n\n} // namespace namespace array\n\n} // namespace module\n\n#endif // !MODULES_ARRAY_DETAIL_H\n\n"
  },
  {
    "path": "modules/array/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements procedures required to export K-3D objects from the core module\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace array\n{\n\n//extern k3d::iplugin_factory& cube_face_environment_map_factory();\nextern k3d::iplugin_factory& alternate_array_1d_factory();\nextern k3d::iplugin_factory& alternate_array_2d_factory();\nextern k3d::iplugin_factory& alternate_array_3d_factory();\nextern k3d::iplugin_factory& rotate_array_1d_factory();\nextern k3d::iplugin_factory& rotate_array_2d_factory();\nextern k3d::iplugin_factory& rotate_array_3d_factory();\nextern k3d::iplugin_factory& translate_array_1d_factory();\nextern k3d::iplugin_factory& translate_array_2d_factory();\nextern k3d::iplugin_factory& translate_array_3d_factory();\n\n} // namespace array\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::array::alternate_array_1d_factory());\n\tRegistry.register_factory(module::array::alternate_array_2d_factory());\n\tRegistry.register_factory(module::array::alternate_array_3d_factory());\n\tRegistry.register_factory(module::array::rotate_array_1d_factory());\n\tRegistry.register_factory(module::array::rotate_array_2d_factory());\n\tRegistry.register_factory(module::array::rotate_array_3d_factory());\n\tRegistry.register_factory(module::array::translate_array_1d_factory());\n\tRegistry.register_factory(module::array::translate_array_2d_factory());\n\tRegistry.register_factory(module::array::translate_array_3d_factory());\nK3D_MODULE_END\n"
  },
  {
    "path": "modules/array/rotate_array_1d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace array\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// rotate_array_1d\n\nclass rotate_array_1d :\n\tpublic transform_array_1d\n{\n\ttypedef transform_array_1d base;\n\npublic:\n\trotate_array_1d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_angle(init_owner(*this) + init_name(\"angle\") + init_label(_(\"Angle\")) + init_description(_(\"Angle\")) + init_value(k3d::angle_axis(k3d::radians(360.0 / 6.0), k3d::point3(0, 0, 1))))\n\t{\n\t\tm_angle.changed_signal().connect(make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1)\n\t{\n\t\tconst k3d::angle_axis angle = m_angle.pipeline_value();\n\n\t\treturn k3d::rotate3(k3d::angle_axis(angle.angle * Index1, angle.axis));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory< rotate_array_1d,\n\t\t\t\tk3d::interface_list<k3d::itransform_array_1d> > factory(\n\t\t\t\tk3d::uuid(0x321d43cf, 0x45da4300, 0x87fa6c4c, 0xec37e850),\n\t\t\t\t\"RotateArray1D\",\n\t\t\t\t_(\"RotateArray1D\"),\n\t\t\t\t\"Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::angle_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_angle;\n};\n\nk3d::iplugin_factory& rotate_array_1d_factory()\n{\n\treturn rotate_array_1d::get_factory();\n}\n\n} // namespace array\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/array/rotate_array_2d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace array\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// rotate_array_2d\n\nclass rotate_array_2d :\n\tpublic transform_array_2d\n{\n\ttypedef transform_array_2d base;\n\npublic:\n\trotate_array_2d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_angle1(init_owner(*this) + init_name(\"angle1\") + init_label(_(\"Angle 1\")) + init_description(_(\"Angle 1\")) + init_value(k3d::angle_axis(k3d::radians(10.0), k3d::point3(0, 1, 0)))),\n\t\tm_angle2(init_owner(*this) + init_name(\"angle2\") + init_label(_(\"Angle 2\")) + init_description(_(\"Angle 2\")) + init_value(k3d::angle_axis(k3d::radians(10.0), k3d::point3(0, 0, 1))))\n\t{\n\t\tm_angle1.changed_signal().connect(make_node_change_slot());\n\t\tm_angle2.changed_signal().connect(make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2)\n\t{\n\t\tconst k3d::angle_axis angle1 = m_angle1.pipeline_value();\n\t\tconst k3d::angle_axis angle2 = m_angle2.pipeline_value();\n\n\t\treturn k3d::rotate3(k3d::angle_axis(angle1.angle * Index1, angle1.axis)) *\n\t\t\tk3d::rotate3(k3d::angle_axis(angle2.angle * Index2, angle2.axis));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory< rotate_array_2d,\n\t\t\t\tk3d::interface_list<k3d::itransform_array_2d> > factory(\n\t\t\t\tk3d::uuid(0x19870cd0, 0x37724e7f, 0xb01505a4, 0xe773d2ed),\n\t\t\t\t\"RotateArray2D\",\n\t\t\t\t_(\"RotateArray2D\"),\n\t\t\t\t\"Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::angle_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_angle1;\n\tk3d_data(k3d::angle_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_angle2;\n};\n\nk3d::iplugin_factory& rotate_array_2d_factory()\n{\n\treturn rotate_array_2d::get_factory();\n}\n\n} // namespace array\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/array/rotate_array_3d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace array\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// rotate_array_3d\n\nclass rotate_array_3d :\n\tpublic transform_array_3d\n{\n\ttypedef transform_array_3d base;\n\npublic:\n\trotate_array_3d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_angle1(init_owner(*this) + init_name(\"angle1\") + init_label(_(\"Angle 1\")) + init_description(_(\"Angle 1\")) + init_value(k3d::angle_axis(k3d::radians(10.0), k3d::point3(0, 1, 0)))),\n\t\tm_angle2(init_owner(*this) + init_name(\"angle2\") + init_label(_(\"Angle 2\")) + init_description(_(\"Angle 2\")) + init_value(k3d::angle_axis(k3d::radians(10.0), k3d::point3(0, 0, 1)))),\n\t\tm_angle3(init_owner(*this) + init_name(\"angle3\") + init_label(_(\"Angle 3\")) + init_description(_(\"Angle 3\")) + init_value(k3d::angle_axis(k3d::radians(10.0), k3d::point3(1, 0, 0))))\n\t{\n\t\tm_angle1.changed_signal().connect(make_node_change_slot());\n\t\tm_angle2.changed_signal().connect(make_node_change_slot());\n\t\tm_angle3.changed_signal().connect(make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2, unsigned long Index3, unsigned long Count3)\n\t{\n\t\tconst k3d::angle_axis angle1 = m_angle1.pipeline_value();\n\t\tconst k3d::angle_axis angle2 = m_angle2.pipeline_value();\n\t\tconst k3d::angle_axis angle3 = m_angle3.pipeline_value();\n\n\t\treturn k3d::rotate3(k3d::angle_axis(angle1.angle * Index1, angle1.axis)) *\n\t\t\tk3d::rotate3(k3d::angle_axis(angle2.angle * Index2, angle2.axis)) *\n\t\t\tk3d::rotate3(k3d::angle_axis(angle3.angle * Index3, angle3.axis));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory< rotate_array_3d,\n\t\t\t\tk3d::interface_list<k3d::itransform_array_3d> > factory(\n\t\t\t\tk3d::uuid(0xc103b1c3, 0x909b45fa, 0xb59de8c4, 0x0dadfd51),\n\t\t\t\t\"RotateArray3D\",\n\t\t\t\t_(\"RotateArray3D\"),\n\t\t\t\t\"Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::angle_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_angle1;\n\tk3d_data(k3d::angle_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_angle2;\n\tk3d_data(k3d::angle_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_angle3;\n};\n\nk3d::iplugin_factory& rotate_array_3d_factory()\n{\n\treturn rotate_array_3d::get_factory();\n}\n\n} // namespace array\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/array/translate_array_1d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace array\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// translate_array_1d\n\nclass translate_array_1d :\n\tpublic transform_array_1d\n{\n\ttypedef transform_array_1d base;\n\npublic:\n\ttranslate_array_1d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_offset(init_owner(*this) + init_name(\"offset\") + init_label(_(\"Offset\")) + init_description(_(\"Offset\")) + init_value(k3d::vector3(5, 0, 0)))\n\t{\n\t\tm_offset.changed_signal().connect(make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1)\n\t{\n\t\treturn k3d::translate3((m_offset.pipeline_value() * Index1));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory< translate_array_1d,\n\t\t\t\tk3d::interface_list<k3d::itransform_array_1d> > factory(\n\t\t\t\tk3d::uuid(0x172b9170, 0x91d2449b, 0xaa057e85, 0xafb2c019),\n\t\t\t\t\"TranslateArray1D\",\n\t\t\t\t_(\"TranslateArray1D\"),\n\t\t\t\t\"Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_offset;\n};\n\nk3d::iplugin_factory& translate_array_1d_factory()\n{\n\treturn translate_array_1d::get_factory();\n}\n\n} // namespace array\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/array/translate_array_2d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace array\n{\n\n\n/////////////////////////////////////////////////////////////////////////////\n// translate_array_2d\n\nclass translate_array_2d :\n\tpublic transform_array_2d\n{\n\ttypedef transform_array_2d base;\n\npublic:\n\ttranslate_array_2d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_offset1(init_owner(*this) + init_name(\"offset1\") + init_label(_(\"Offset 1\")) + init_description(_(\"Offset 1\")) + init_value(k3d::vector3(5, 0, 0))),\n\t\tm_offset2(init_owner(*this) + init_name(\"offset2\") + init_label(_(\"Offset 2\")) + init_description(_(\"Offset 2\")) + init_value(k3d::vector3(0, -5, 0)))\n\t{\n\t\tm_offset1.changed_signal().connect(make_node_change_slot());\n\t\tm_offset2.changed_signal().connect(make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2)\n\t{\n\t\treturn k3d::translate3((m_offset1.pipeline_value() * Index1) + (m_offset2.pipeline_value() * Index2));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory< translate_array_2d,\n\t\t\t\tk3d::interface_list<k3d::itransform_array_2d> > factory(\n\t\t\t\tk3d::uuid(0xa2d1cd67, 0x901e411b, 0x9c624ca6, 0xa02b6a5a),\n\t\t\t\t\"TranslateArray2D\",\n\t\t\t\t_(\"TranslateArray2D\"),\n\t\t\t\t\"Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_offset1;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_offset2;\n};\n\nk3d::iplugin_factory& translate_array_2d_factory()\n{\n\treturn translate_array_2d::get_factory();\n}\n\n} // namespace array\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/array/translate_array_3d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace array\n{\n\n\n/////////////////////////////////////////////////////////////////////////////\n// translate_array_3d\n\nclass translate_array_3d :\n\tpublic transform_array_3d\n{\n\ttypedef transform_array_3d base;\n\npublic:\n\ttranslate_array_3d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_offset1(init_owner(*this) + init_name(\"offset1\") + init_label(_(\"Offset 1\")) + init_description(_(\"Offset 1\")) + init_value(k3d::vector3(5, 0, 0))),\n\t\tm_offset2(init_owner(*this) + init_name(\"offset2\") + init_label(_(\"Offset 2\")) + init_description(_(\"Offset 2\")) + init_value(k3d::vector3(0, -5, 0))),\n\t\tm_offset3(init_owner(*this) + init_name(\"offset3\") + init_label(_(\"Offset 3\")) + init_description(_(\"Offset 3\")) + init_value(k3d::vector3(0, 0, 5)))\n\t{\n\t\tm_offset1.changed_signal().connect(make_node_change_slot());\n\t\tm_offset2.changed_signal().connect(make_node_change_slot());\n\t\tm_offset3.changed_signal().connect(make_node_change_slot());\n\t}\n\n\tconst k3d::matrix4 on_get_element(unsigned long Index1, unsigned long Count1, unsigned long Index2, unsigned long Count2, unsigned long Index3, unsigned long Count3)\n\t{\n\t\treturn k3d::translate3((m_offset1.pipeline_value() * Index1) + (m_offset2.pipeline_value() * Index2) + (m_offset3.pipeline_value() * Index3));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory< translate_array_3d,\n\t\t\t\tk3d::interface_list<k3d::itransform_array_3d> > factory(\n\t\t\t\tk3d::uuid(0xef028b9d, 0x68964ef0, 0xb09c0ff8, 0x8c324ae4),\n\t\t\t\t\"TranslateArray3D\",\n\t\t\t\t_(\"TranslateArray3D\"),\n\t\t\t\t\"Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_offset1;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_offset2;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_offset3;\n};\n\nk3d::iplugin_factory& translate_array_3d_factory()\n{\n\treturn translate_array_3d::get_factory();\n}\n\n} // namespace array\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/bicubic_patch/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-bicubic-patch)\nK3D_CREATE_MODULE_PROXY(k3d-bicubic-patch)\n\n"
  },
  {
    "path": "modules/bicubic_patch/bicubic_to_poly.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace bicubic_patch\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bicubic_to_poly\n\nclass bicubic_to_poly :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tbicubic_to_poly(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_subdivisions(init_owner(*this) + init_name(\"subdivisions\") + init_label(_(\"Subdivisions\")) + init_description(_(\"Patch subdivision number\")) + init_value(3) + init_step_increment(1) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_subdivisions.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\t// Copy point data only ...\n\t\tOutput = k3d::mesh();\n\t\tOutput.points = Input.points;\n\t\tOutput.point_selection = Input.point_selection;\n\t\tOutput.point_attributes = Input.point_attributes;\n\n\t\tconst k3d::int32_t subdivisions = m_subdivisions.pipeline_value();\n\n\t\t// For each primitive ...\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{\n\t\t\t// Convert bicubic patch primitives to polyhedron primitives, passing-through all other primitive types ...\n\t\t\tboost::scoped_ptr<k3d::bicubic_patch::const_primitive> bicubic_patch(k3d::bicubic_patch::validate(Output, **primitive));\n\t\t\tif(!bicubic_patch)\n\t\t\t{\n\t\t\t\tOutput.primitives.push_back(*primitive);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Create a new polyhedron and prepare to copy attributes ...\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\t\tpolyhedron->face_attributes = bicubic_patch->patch_attributes.clone_types();\n\t\t\tk3d::table_copier face_attributes(bicubic_patch->patch_attributes, polyhedron->face_attributes);\n\n\t\t\t// Prepare to create new points ...\n\t\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\t\t\tk3d::table_copier point_attributes(Output.point_attributes);\n\n\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\tconst k3d::uint_t patch_end = patch_begin + bicubic_patch->patch_selections.size();\n\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t point_offset = points.size();\n\n\t\t\t\tfor(k3d::int32_t j = 0; j <= subdivisions; ++j)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::double_t u = k3d::ratio(j, subdivisions);\n\t\t\t\t\tfor(k3d::int32_t k = 0; k <= subdivisions; ++k)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::double_t v = k3d::ratio(k, subdivisions);\n\n\t\t\t\t\t\tk3d::double_t U[4], V[4];\n\t\t\t\t\t\tU[0] = (1-u)*(1-u)*(1-u);\n\t\t\t\t\t\tU[1] = 3*u*(1-u)*(1-u);\n\t\t\t\t\t\tU[2] = 3*u*u*(1-u);\n\t\t\t\t\t\tU[3] = u*u*u;\n\t\t\t\t\t\tV[0] = (1-v)*(1-v)*(1-v);\n\t\t\t\t\t\tV[1] = 3*v*(1-v)*(1-v);\n\t\t\t\t\t\tV[2] = 3*v*v*(1-v);\n\t\t\t\t\t\tV[3] = v*v*v;\n\n\t\t\t\t\t\tk3d::mesh::indices_t point_indices;\n\t\t\t\t\t\tk3d::mesh::weights_t point_weights;\n\t\t\t\t\t\tfor(k3d::int32_t l = 0; l < 4; ++l)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor(k3d::int32_t m = 0; m < 4; ++m)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpoint_indices.push_back(bicubic_patch->patch_points[(patch * 16) + (l * 4) + m]);\n\t\t\t\t\t\t\t\tpoint_weights.push_back(U[l] * V[m]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tk3d::point3 new_point(0, 0, 0);\n\t\t\t\t\t\tfor(k3d::uint_t i = 0; i != point_indices.size(); ++i)\n\t\t\t\t\t\t\tnew_point += k3d::to_vector(point_weights[i] * points[point_indices[i]]);\n\n\t\t\t\t\t\tpoints.push_back(new_point);\n\t\t\t\t\t\tpoint_selection.push_back(1);\n\t\t\t\t\t\tpoint_attributes.push_back(point_indices.size(), &point_indices[0], &point_weights[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor(k3d::int32_t j = 0; j != subdivisions; ++j)\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::int32_t k = 0; k != subdivisions; ++k)\n\t\t\t\t\t{\n\t\t\t\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\t\t\tpolyhedron->face_selections.push_back(1);\n\t\t\t\t\t\tpolyhedron->face_materials.push_back(bicubic_patch->patch_materials[patch]);\n\t\t\t\t\t\tface_attributes.push_back(patch);\n\t\t\t\t\t\t\n\t\t\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() - 3);\n\n\t\t\t\t\t\tpolyhedron->edge_selections.push_back(1);\n\t\t\t\t\t\tpolyhedron->edge_selections.push_back(1);\n\t\t\t\t\t\tpolyhedron->edge_selections.push_back(1);\n\t\t\t\t\t\tpolyhedron->edge_selections.push_back(1);\n\n\t\t\t\t\t\tpolyhedron->vertex_points.push_back(point_offset + (j+0) * (subdivisions+1) + (k+0));\n\t\t\t\t\t\tpolyhedron->vertex_points.push_back(point_offset + (j+0) * (subdivisions+1) + (k+1));\n\t\t\t\t\t\tpolyhedron->vertex_points.push_back(point_offset + (j+1) * (subdivisions+1) + (k+1));\n\t\t\t\t\t\tpolyhedron->vertex_points.push_back(point_offset + (j+1) * (subdivisions+1) + (k+0));\n\n\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(1);\n\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(1);\n\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(1);\n\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t\t}\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bicubic_to_poly,\n\t\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0xbd6bdff8, 0xb4374eb1, 0xad39f4ad, 0x87209e59),\n\t\t\t\t\"BicubicToPoly\",\n\t\t\t\t_(\"Polygonizes bicubic patches\"),\n\t\t\t\t\"BicubicPatch\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_subdivisions;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bicubic_to_poly_factory\n\nk3d::iplugin_factory& bicubic_to_poly_factory()\n{\n\treturn bicubic_to_poly::get_factory();\n}\n\n} // namespace bicubic_patch\n\n} // namespace module\n\n\n\n"
  },
  {
    "path": "modules/bicubic_patch/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace bicubic_patch\n{\n\nextern k3d::iplugin_factory& newell_primitive_factory();\nextern k3d::iplugin_factory& bicubic_to_poly_factory();\n\n} // namespace bicubic_patch\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::bicubic_patch::newell_primitive_factory());\n\tRegistry.register_factory(module::bicubic_patch::bicubic_to_poly_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/bicubic_patch/newell_primitives.cpp",
    "content": "// K-3D\n// Copyright (c) 2002-2005, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/teapot.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace bicubic_patch\n{\n\nstatic const double TeacupPoints[251][3] =\n{\n\t{0.409091,0.772727,0.0},\n\t{0.409091,0.772727,-0.229091},\n\t{0.229091,0.772727,-0.409091},\n\t{0.0,0.772727,-0.409091},\n\t{0.409091,0.886364,0.0},\n\t{0.409091,0.886364,-0.229091},\n\t{0.229091,0.886364,-0.409091},\n\t{0.0,0.886364,-0.409091},\n\t{0.454545,0.886364,0.0},\n\t{0.454545,0.886364,-0.254545},\n\t{0.254545,0.886364,-0.454545},\n\t{0.0,0.886364,-0.454545},\n\t{0.454545,0.772727,0.0},\n\t{0.454545,0.772727,-0.254545},\n\t{0.254545,0.772727,-0.454545},\n\t{0.0,0.772727,-0.454545},\n\t{-0.229091,0.772727,-0.409091},\n\t{-0.409091,0.772727,-0.229091},\n\t{-0.409091,0.772727,0.0},\n\t{-0.229091,0.886364,-0.409091},\n\t{-0.409091,0.886364,-0.229091},\n\t{-0.409091,0.886364,0.0},\n\t{-0.254545,0.886364,-0.454545},\n\t{-0.454545,0.886364,-0.254545},\n\t{-0.454545,0.886364,0.0},\n\t{-0.254545,0.772727,-0.454545},\n\t{-0.454545,0.772727,-0.254545},\n\t{-0.454545,0.772727,0.0},\n\t{-0.409091,0.772727,0.229091},\n\t{-0.229091,0.772727,0.409091},\n\t{0.0,0.772727,0.409091},\n\t{-0.409091,0.886364,0.229091},\n\t{-0.229091,0.886364,0.409091},\n\t{0.0,0.886364,0.409091},\n\t{-0.454545,0.886364,0.254545},\n\t{-0.254545,0.886364,0.454545},\n\t{0.0,0.886364,0.454545},\n\t{-0.454545,0.772727,0.254545},\n\t{-0.254545,0.772727,0.454545},\n\t{0.0,0.772727,0.454545},\n\t{0.229091,0.772727,0.409091},\n\t{0.409091,0.772727,0.229091},\n\t{0.229091,0.886364,0.409091},\n\t{0.409091,0.886364,0.229091},\n\t{0.254545,0.886364,0.454545},\n\t{0.454545,0.886364,0.254545},\n\t{0.254545,0.772727,0.454545},\n\t{0.454545,0.772727,0.254545},\n\t{0.454545,0.545455,0.0},\n\t{0.454545,0.545455,-0.254545},\n\t{0.254545,0.545455,-0.454545},\n\t{0.0,0.545455,-0.454545},\n\t{0.454545,0.272727,0.0},\n\t{0.454545,0.272727,-0.254545},\n\t{0.254545,0.272727,-0.454545},\n\t{0.0,0.272727,-0.454545},\n\t{0.318182,0.0454545,0.0},\n\t{0.318182,0.0454545,-0.178182},\n\t{0.178182,0.0454545,-0.318182},\n\t{0.0,0.0454545,-0.318182},\n\t{-0.254545,0.545455,-0.454545},\n\t{-0.454545,0.545455,-0.254545},\n\t{-0.454545,0.545455,0.0},\n\t{-0.254545,0.272727,-0.454545},\n\t{-0.454545,0.272727,-0.254545},\n\t{-0.454545,0.272727,0.0},\n\t{-0.178182,0.0454545,-0.318182},\n\t{-0.318182,0.0454545,-0.178182},\n\t{-0.318182,0.0454545,0.0},\n\t{-0.454545,0.545455,0.254545},\n\t{-0.254545,0.545455,0.454545},\n\t{0.0,0.545455,0.454545},\n\t{-0.454545,0.272727,0.254545},\n\t{-0.254545,0.272727,0.454545},\n\t{0.0,0.272727,0.454545},\n\t{-0.318182,0.0454545,0.178182},\n\t{-0.178182,0.0454545,0.318182},\n\t{0.0,0.0454545,0.318182},\n\t{0.254545,0.545455,0.454545},\n\t{0.454545,0.545455,0.254545},\n\t{0.254545,0.272727,0.454545},\n\t{0.454545,0.272727,0.254545},\n\t{0.178182,0.0454545,0.318182},\n\t{0.318182,0.0454545,0.178182},\n\t{0.545455,0.0454545,0.0},\n\t{0.545455,0.0454545,-0.305455},\n\t{0.305455,0.0454545,-0.545455},\n\t{0.0,0.0454545,-0.545455},\n\t{0.727273,0.136364,0.0},\n\t{0.727273,0.136364,-0.407273},\n\t{0.407273,0.136364,-0.727273},\n\t{0.0,0.136364,-0.727273},\n\t{0.909091,0.136364,0.0},\n\t{0.909091,0.136364,-0.509091},\n\t{0.509091,0.136364,-0.909091},\n\t{0.0,0.136364,-0.909091},\n\t{-0.305455,0.0454545,-0.545455},\n\t{-0.545455,0.0454545,-0.305455},\n\t{-0.545455,0.0454545,0.0},\n\t{-0.407273,0.136364,-0.727273},\n\t{-0.727273,0.136364,-0.407273},\n\t{-0.727273,0.136364,0.0},\n\t{-0.509091,0.136364,-0.909091},\n\t{-0.909091,0.136364,-0.509091},\n\t{-0.909091,0.136364,0.0},\n\t{-0.545455,0.0454545,0.305455},\n\t{-0.305455,0.0454545,0.545455},\n\t{0.0,0.0454545,0.545455},\n\t{-0.727273,0.136364,0.407273},\n\t{-0.407273,0.136364,0.727273},\n\t{0.0,0.136364,0.727273},\n\t{-0.909091,0.136364,0.509091},\n\t{-0.509091,0.136364,0.909091},\n\t{0.0,0.136364,0.909091},\n\t{0.305455,0.0454545,0.545455},\n\t{0.545455,0.0454545,0.305455},\n\t{0.407273,0.136364,0.727273},\n\t{0.727273,0.136364,0.407273},\n\t{0.509091,0.136364,0.909091},\n\t{0.909091,0.136364,0.509091},\n\t{1.0,0.136364,0.0},\n\t{1.0,0.136364,-0.56},\n\t{0.56,0.136364,-1.0},\n\t{0.0,0.136364,-1.0},\n\t{1.0,0.0909091,0.0},\n\t{1.0,0.0909091,-0.56},\n\t{0.56,0.0909091,-1.0},\n\t{0.0,0.0909091,-1.0},\n\t{0.909091,0.0909091,0.0},\n\t{0.909091,0.0909091,-0.509091},\n\t{0.509091,0.0909091,-0.909091},\n\t{0.0,0.0909091,-0.909091},\n\t{-0.56,0.136364,-1.0},\n\t{-1.0,0.136364,-0.56},\n\t{-1.0,0.136364,0.0},\n\t{-0.56,0.0909091,-1.0},\n\t{-1.0,0.0909091,-0.56},\n\t{-1.0,0.0909091,0.0},\n\t{-0.509091,0.0909091,-0.909091},\n\t{-0.909091,0.0909091,-0.509091},\n\t{-0.909091,0.0909091,0.0},\n\t{-1.0,0.136364,0.56},\n\t{-0.56,0.136364,1.0},\n\t{0.0,0.136364,1.0},\n\t{-1.0,0.0909091,0.56},\n\t{-0.56,0.0909091,1.0},\n\t{0.0,0.0909091,1.0},\n\t{-0.909091,0.0909091,0.509091},\n\t{-0.509091,0.0909091,0.909091},\n\t{0.0,0.0909091,0.909091},\n\t{0.56,0.136364,1.0},\n\t{1.0,0.136364,0.56},\n\t{0.56,0.0909091,1.0},\n\t{1.0,0.0909091,0.56},\n\t{0.509091,0.0909091,0.909091},\n\t{0.909091,0.0909091,0.509091},\n\t{0.727273,0.0909091,0.0},\n\t{0.727273,0.0909091,-0.407273},\n\t{0.407273,0.0909091,-0.727273},\n\t{0.0,0.0909091,-0.727273},\n\t{0.545455,0.0,0.0},\n\t{0.545455,0.0,-0.305455},\n\t{0.305455,0.0,-0.545455},\n\t{0.0,0.0,-0.545455},\n\t{0.318182,0.0,0.0},\n\t{0.318182,0.0,-0.178182},\n\t{0.178182,0.0,-0.318182},\n\t{0.0,0.0,-0.318182},\n\t{-0.407273,0.0909091,-0.727273},\n\t{-0.727273,0.0909091,-0.407273},\n\t{-0.727273,0.0909091,0.0},\n\t{-0.305455,0.0,-0.545455},\n\t{-0.545455,0.0,-0.305455},\n\t{-0.545455,0.0,0.0},\n\t{-0.178182,0.0,-0.318182},\n\t{-0.318182,0.0,-0.178182},\n\t{-0.318182,0.0,0.0},\n\t{-0.727273,0.0909091,0.407273},\n\t{-0.407273,0.0909091,0.727273},\n\t{0.0,0.0909091,0.727273},\n\t{-0.545455,0.0,0.305455},\n\t{-0.305455,0.0,0.545455},\n\t{0.0,0.0,0.545455},\n\t{-0.318182,0.0,0.178182},\n\t{-0.178182,0.0,0.318182},\n\t{0.0,0.0,0.318182},\n\t{0.407273,0.0909091,0.727273},\n\t{0.727273,0.0909091,0.407273},\n\t{0.305455,0.0,0.545455},\n\t{0.545455,0.0,0.305455},\n\t{0.178182,0.0,0.318182},\n\t{0.318182,0.0,0.178182},\n\t{0.272727,0.0454545,0.0},\n\t{0.272727,0.0454545,-0.152727},\n\t{0.152727,0.0454545,-0.272727},\n\t{0.0,0.0454545,-0.272727},\n\t{0.409091,0.272727,0.0},\n\t{0.409091,0.272727,-0.229091},\n\t{0.229091,0.272727,-0.409091},\n\t{0.0,0.272727,-0.409091},\n\t{0.409091,0.545455,0.0},\n\t{0.409091,0.545455,-0.229091},\n\t{0.229091,0.545455,-0.409091},\n\t{0.0,0.545455,-0.409091},\n\t{-0.152727,0.0454545,-0.272727},\n\t{-0.272727,0.0454545,-0.152727},\n\t{-0.272727,0.0454545,0.0},\n\t{-0.229091,0.272727,-0.409091},\n\t{-0.409091,0.272727,-0.229091},\n\t{-0.409091,0.272727,0.0},\n\t{-0.229091,0.545455,-0.409091},\n\t{-0.409091,0.545455,-0.229091},\n\t{-0.409091,0.545455,0.0},\n\t{-0.272727,0.0454545,0.152727},\n\t{-0.152727,0.0454545,0.272727},\n\t{0.0,0.0454545,0.272727},\n\t{-0.409091,0.272727,0.229091},\n\t{-0.229091,0.272727,0.409091},\n\t{0.0,0.272727,0.409091},\n\t{-0.409091,0.545455,0.229091},\n\t{-0.229091,0.545455,0.409091},\n\t{0.0,0.545455,0.409091},\n\t{0.152727,0.0454545,0.272727},\n\t{0.272727,0.0454545,0.152727},\n\t{0.229091,0.272727,0.409091},\n\t{0.409091,0.272727,0.229091},\n\t{0.229091,0.545455,0.409091},\n\t{0.409091,0.545455,0.229091},\n\t{-0.454545,0.704545,0.0},\n\t{-0.454545,0.704545,-0.0454545},\n\t{-0.454545,0.772727,-0.0454545},\n\t{-0.772727,0.863636,0.0},\n\t{-0.772727,0.863636,-0.0454545},\n\t{-0.818182,0.954545,-0.0454545},\n\t{-0.818182,0.954545,0.0},\n\t{-0.772727,0.522727,0.0},\n\t{-0.772727,0.522727,-0.0454545},\n\t{-0.909091,0.477273,-0.0454545},\n\t{-0.909091,0.477273,0.0},\n\t{-0.409091,0.363636,0.0},\n\t{-0.409091,0.363636,-0.0454545},\n\t{-0.409091,0.295455,-0.0454545},\n\t{-0.409091,0.295455,0.0},\n\t{-0.454545,0.772727,0.0454545},\n\t{-0.454545,0.704545,0.0454545},\n\t{-0.818182,0.954545,0.0454545},\n\t{-0.772727,0.863636,0.0454545},\n\t{-0.909091,0.477273,0.0454545},\n\t{-0.772727,0.522727,0.0454545},\n\t{-0.409091,0.295455,0.0454545},\n\t{-0.409091,0.363636,0.0454545}\n};\n\nstatic const unsigned long TeacupPatches[26][16] =\n{\n\t{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},\n\t{4,17,18,19,8,20,21,22,12,23,24,25,16,26,27,28},\n\t{19,29,30,31,22,32,33,34,25,35,36,37,28,38,39,40},\n\t{31,41,42,1,34,43,44,5,37,45,46,9,40,47,48,13},\n\t{13,14,15,16,49,50,51,52,53,54,55,56,57,58,59,60},\n\t{16,26,27,28,52,61,62,63,56,64,65,66,60,67,68,69},\n\t{28,38,39,40,63,70,71,72,66,73,74,75,69,76,77,78},\n\t{40,47,48,13,72,79,80,49,75,81,82,53,78,83,84,57},\n\t{193,194,195,196,197,198,199,200,201,202,203,204,1,2,3,4},\n\t{196,205,206,207,200,208,209,210,204,211,212,213,4,17,18,19},\n\t{207,214,215,216,210,217,218,219,213,220,221,222,19,29,30,31},\n\t{216,223,224,193,219,225,226,197,222,227,228,201,31,41,42,1},\n\t{229,230,231,28,232,233,234,235,236,237,238,239,240,241,242,243},\n\t{28,244,245,229,235,246,247,232,239,248,249,236,243,250,251,240},\n\t{57,58,59,60,85,86,87,88,89,90,91,92,93,94,95,96},\n\t{60,67,68,69,88,97,98,99,92,100,101,102,96,103,104,105},\n\t{69,76,77,78,99,106,107,108,102,109,110,111,105,112,113,114},\n\t{78,83,84,57,108,115,116,85,111,117,118,89,114,119,120,93},\n\t{93,94,95,96,121,122,123,124,125,126,127,128,129,130,131,132},\n\t{96,103,104,105,124,133,134,135,128,136,137,138,132,139,140,141},\n\t{105,112,113,114,135,142,143,144,138,145,146,147,141,148,149,150},\n\t{114,119,120,93,144,151,152,121,147,153,154,125,150,155,156,129},\n\t{129,130,131,132,157,158,159,160,161,162,163,164,165,166,167,168},\n\t{132,139,140,141,160,169,170,171,164,172,173,174,168,175,176,177},\n\t{141,148,149,150,171,178,179,180,174,181,182,183,177,184,185,186},\n\t{150,155,156,129,180,187,188,157,183,189,190,161,186,191,192,165}\n};\n\nstatic const double TeaspoonPoints[256][3] =\n{\n\t{-0.000107143,0.205357,0.0},\n\t{0.0,0.196429,-0.0178571},\n\t{0.0,0.196429,-0.0178571},\n\t{0.000107143,0.205357,0.0},\n\t{-0.0535714,0.205357,0.0},\n\t{-0.0222714,0.178571,-0.0534286},\n\t{0.0222714,0.178571,-0.0534286},\n\t{0.0535714,0.205357,0.0},\n\t{-0.107143,0.0952429,-0.0178571},\n\t{-0.0446429,0.0952429,-0.0892857},\n\t{0.0446429,0.0952429,-0.0892857},\n\t{0.107143,0.0952429,-0.0178571},\n\t{-0.107143,0.0,-0.0178571},\n\t{-0.0446429,0.0,-0.0892857},\n\t{0.0446429,0.0,-0.0892857},\n\t{0.107143,0.0,-0.0178571},\n\t{0.000107143,0.205357,0.0},\n\t{0.000135714,0.207589,0.00446429},\n\t{0.000157143,0.216518,0.00446429},\n\t{0.000125,0.214286,0.0},\n\t{0.0535714,0.205357,0.0},\n\t{0.0613964,0.212054,0.0133571},\n\t{0.0714286,0.220982,0.015625},\n\t{0.0625,0.214286,0.0},\n\t{0.107143,0.0952429,-0.0178571},\n\t{0.122768,0.0952429,0.0},\n\t{0.142857,0.0952429,0.00446429},\n\t{0.125,0.0952429,-0.0178571},\n\t{0.107143,0.0,-0.0178571},\n\t{0.122768,0.0,0.0},\n\t{0.142857,0.0,0.00446429},\n\t{0.125,0.0,-0.0178571},\n\t{0.000125,0.214286,0.0},\n\t{0.0,0.205357,-0.0178571},\n\t{0.0,0.205357,-0.0178571},\n\t{-0.000125,0.214286,0.0},\n\t{0.0625,0.214286,0.0},\n\t{0.0267857,0.1875,-0.0625},\n\t{-0.0267857,0.1875,-0.0625},\n\t{-0.0625,0.214286,0.0},\n\t{0.125,0.0952429,-0.0178571},\n\t{0.0535714,0.0952429,-0.107143},\n\t{-0.0535714,0.0952429,-0.107143},\n\t{-0.125,0.0952429,-0.0178571},\n\t{0.125,0.0,-0.0178571},\n\t{0.0535714,0.0,-0.107143},\n\t{-0.0535714,0.0,-0.107143},\n\t{-0.125,0.0,-0.0178571},\n\t{-0.000125,0.214286,0.0},\n\t{-0.000157143,0.216518,0.00446429},\n\t{-0.000135714,0.207589,0.00446429},\n\t{-0.000107143,0.205357,0.0},\n\t{-0.0625,0.214286,0.0},\n\t{-0.0714286,0.220982,0.015625},\n\t{-0.0613964,0.212054,0.0133571},\n\t{-0.0535714,0.205357,0.0},\n\t{-0.125,0.0952429,-0.0178571},\n\t{-0.142857,0.0952429,0.00446429},\n\t{-0.122768,0.0952429,0.0},\n\t{-0.107143,0.0952429,-0.0178571},\n\t{-0.125,0.0,-0.0178571},\n\t{-0.142857,0.0,0.00446429},\n\t{-0.122768,0.0,0.0},\n\t{-0.107143,0.0,-0.0178571},\n\t{-0.107143,0.0,-0.0178571},\n\t{-0.0446429,0.0,-0.0892857},\n\t{0.0446429,0.0,-0.0892857},\n\t{0.107143,0.0,-0.0178571},\n\t{-0.107143,-0.142857,-0.0178571},\n\t{-0.0446429,-0.142857,-0.0892857},\n\t{0.0446429,-0.142857,-0.0892857},\n\t{0.107143,-0.142857,-0.0178571},\n\t{-0.0133929,-0.160714,0.0386893},\n\t{-0.00557857,-0.160714,0.0386893},\n\t{0.00557857,-0.160714,0.0386893},\n\t{0.0133929,-0.160714,0.0386893},\n\t{-0.0133929,-0.25,0.0535714},\n\t{-0.00557857,-0.25,0.0535714},\n\t{0.00557857,-0.25,0.0535714},\n\t{0.0133929,-0.25,0.0535714},\n\t{0.107143,0.0,-0.0178571},\n\t{0.122768,0.0,0.0},\n\t{0.142857,0.0,0.00446429},\n\t{0.125,0.0,-0.0178571},\n\t{0.107143,-0.142857,-0.0178571},\n\t{0.122768,-0.142857,0.0},\n\t{0.142857,-0.142857,0.00446429},\n\t{0.125,-0.142857,-0.0178571},\n\t{0.0133929,-0.160714,0.0386893},\n\t{0.0153464,-0.160714,0.0386893},\n\t{0.0178571,-0.160714,0.0314357},\n\t{0.015625,-0.160714,0.0297607},\n\t{0.0133929,-0.25,0.0535714},\n\t{0.0153464,-0.25,0.0535714},\n\t{0.0178571,-0.25,0.0463179},\n\t{0.015625,-0.25,0.0446429},\n\t{0.125,0.0,-0.0178571},\n\t{0.0535714,0.0,-0.107143},\n\t{-0.0535714,0.0,-0.107143},\n\t{-0.125,0.0,-0.0178571},\n\t{0.125,-0.142857,-0.0178571},\n\t{0.0535714,-0.142857,-0.107143},\n\t{-0.0535714,-0.142857,-0.107143},\n\t{-0.125,-0.142857,-0.0178571},\n\t{0.015625,-0.160714,0.0297607},\n\t{0.00669643,-0.160714,0.0230643},\n\t{-0.00781071,-0.160714,0.0208321},\n\t{-0.015625,-0.160714,0.0297607},\n\t{0.015625,-0.25,0.0446429},\n\t{0.00669643,-0.25,0.0379464},\n\t{-0.00781071,-0.25,0.0357143},\n\t{-0.015625,-0.25,0.0446429},\n\t{-0.125,0.0,-0.0178571},\n\t{-0.142857,0.0,0.00446429},\n\t{-0.122768,0.0,0.0},\n\t{-0.107143,0.0,-0.0178571},\n\t{-0.125,-0.142857,-0.0178571},\n\t{-0.142857,-0.142857,0.00446429},\n\t{-0.122768,-0.142857,0.0},\n\t{-0.107143,-0.142857,-0.0178571},\n\t{-0.015625,-0.160714,0.0297607},\n\t{-0.0175786,-0.160714,0.0319929},\n\t{-0.0153464,-0.160714,0.0386893},\n\t{-0.0133929,-0.160714,0.0386893},\n\t{-0.015625,-0.25,0.0446429},\n\t{-0.0175786,-0.25,0.046875},\n\t{-0.0153464,-0.25,0.0535714},\n\t{-0.0133929,-0.25,0.0535714},\n\t{-0.0133929,-0.25,0.0535714},\n\t{-0.00557857,-0.25,0.0535714},\n\t{0.00557857,-0.25,0.0535714},\n\t{0.0133929,-0.25,0.0535714},\n\t{-0.0133929,-0.46425,0.0892857},\n\t{-0.00557857,-0.46425,0.0892857},\n\t{0.00557857,-0.46425,0.0892857},\n\t{0.0133929,-0.46425,0.0892857},\n\t{-0.0446429,-0.678571,0.0535714},\n\t{-0.00892857,-0.678571,0.0625},\n\t{0.00892857,-0.678571,0.0625},\n\t{0.0446429,-0.678571,0.0535714},\n\t{-0.0446429,-0.857143,0.0357143},\n\t{-0.00892857,-0.857143,0.0446429},\n\t{0.00892857,-0.857143,0.0446429},\n\t{0.0446429,-0.857143,0.0357143},\n\t{0.0133929,-0.25,0.0535714},\n\t{0.0153464,-0.25,0.0535714},\n\t{0.0178571,-0.25,0.0463179},\n\t{0.015625,-0.25,0.0446429},\n\t{0.0133929,-0.46425,0.0892857},\n\t{0.0153464,-0.464286,0.0892857},\n\t{0.0178571,-0.46425,0.0820321},\n\t{0.015625,-0.46425,0.0803571},\n\t{0.0446429,-0.678571,0.0535714},\n\t{0.0535714,-0.678571,0.0513393},\n\t{0.0535714,-0.678571,0.0334821},\n\t{0.0446429,-0.678571,0.0357143},\n\t{0.0446429,-0.857143,0.0357143},\n\t{0.0535714,-0.857143,0.0334821},\n\t{0.0535714,-0.857143,0.015625},\n\t{0.0446429,-0.857143,0.0178571},\n\t{0.015625,-0.25,0.0446429},\n\t{0.00669643,-0.25,0.0379464},\n\t{-0.00781071,-0.25,0.0357143},\n\t{-0.015625,-0.25,0.0446429},\n\t{0.015625,-0.46425,0.0803571},\n\t{0.00669643,-0.464286,0.0736607},\n\t{-0.00781071,-0.46425,0.0714286},\n\t{-0.015625,-0.46425,0.0803571},\n\t{0.0446429,-0.678571,0.0357143},\n\t{0.00892857,-0.678571,0.0446429},\n\t{-0.00892857,-0.678571,0.0446429},\n\t{-0.0446429,-0.678571,0.0357143},\n\t{0.0446429,-0.857143,0.0178571},\n\t{0.00892857,-0.857143,0.0267857},\n\t{-0.00892857,-0.857143,0.0267857},\n\t{-0.0446429,-0.857143,0.0178571},\n\t{-0.015625,-0.25,0.0446429},\n\t{-0.0175786,-0.25,0.046875},\n\t{-0.0153464,-0.25,0.0535714},\n\t{-0.0133929,-0.25,0.0535714},\n\t{-0.015625,-0.46425,0.0803571},\n\t{-0.0175786,-0.464286,0.0825893},\n\t{-0.0153464,-0.464286,0.0892857},\n\t{-0.0133929,-0.46425,0.0892857},\n\t{-0.0446429,-0.678571,0.0357143},\n\t{-0.0535714,-0.678571,0.0334821},\n\t{-0.0535714,-0.678571,0.0513393},\n\t{-0.0446429,-0.678571,0.0535714},\n\t{-0.0446429,-0.857143,0.0178571},\n\t{-0.0535714,-0.857143,0.015625},\n\t{-0.0535714,-0.857143,0.0334821},\n\t{-0.0446429,-0.857143,0.0357143},\n\t{-0.0446429,-0.857143,0.0357143},\n\t{-0.00892857,-0.857143,0.0446429},\n\t{0.00892857,-0.857143,0.0446429},\n\t{0.0446429,-0.857143,0.0357143},\n\t{-0.0446429,-0.928571,0.0285714},\n\t{-0.00892857,-0.928571,0.0375},\n\t{0.00892857,-0.928571,0.0375},\n\t{0.0446429,-0.928571,0.0285714},\n\t{-0.0539286,-0.999643,0.0178571},\n\t{0.000357143,-0.999643,0.0178571},\n\t{0.0,-0.999643,0.0178571},\n\t{0.0535714,-0.999643,0.0178571},\n\t{-0.000357143,-1,0.0178571},\n\t{0.000357143,-1,0.0178571},\n\t{0.0,-1,0.0178571},\n\t{0.0,-1,0.0178571},\n\t{0.0446429,-0.857143,0.0357143},\n\t{0.0535714,-0.857143,0.0334821},\n\t{0.0535714,-0.857143,0.015625},\n\t{0.0446429,-0.857143,0.0178571},\n\t{0.0446429,-0.928571,0.0285714},\n\t{0.0535714,-0.928571,0.0263393},\n\t{0.0535714,-0.928571,0.00848214},\n\t{0.0446429,-0.928571,0.0107143},\n\t{0.0535714,-0.999643,0.0178571},\n\t{0.0669643,-0.999643,0.0178571},\n\t{0.0673214,-0.999643,0.0},\n\t{0.0539286,-0.999643,0.0},\n\t{0.0,-1,0.0178571},\n\t{0.0,-1,0.0178571},\n\t{0.000357143,-1,0.0},\n\t{0.000357143,-1,0.0},\n\t{0.0446429,-0.857143,0.0178571},\n\t{0.00892857,-0.857143,0.0267857},\n\t{-0.00892857,-0.857143,0.0267857},\n\t{-0.0446429,-0.857143,0.0178571},\n\t{0.0446429,-0.928571,0.0107143},\n\t{0.00892857,-0.928571,0.0196429},\n\t{-0.00892857,-0.928571,0.0196429},\n\t{-0.0446429,-0.928571,0.0107143},\n\t{0.0539286,-0.999643,0.0},\n\t{0.000357143,-0.999643,0.0},\n\t{-0.000357143,-0.999643,0.0},\n\t{-0.0539286,-0.999643,0.0},\n\t{0.000357143,-1,0.0},\n\t{0.000357143,-1,0.0},\n\t{-0.000357143,-1,0.0},\n\t{-0.000357143,-1,0.0},\n\t{-0.0446429,-0.857143,0.0178571},\n\t{-0.0535714,-0.857143,0.015625},\n\t{-0.0535714,-0.857143,0.0334821},\n\t{-0.0446429,-0.857143,0.0357143},\n\t{-0.0446429,-0.928571,0.0107143},\n\t{-0.0535714,-0.928571,0.00848214},\n\t{-0.0535714,-0.928571,0.0263393},\n\t{-0.0446429,-0.928571,0.0285714},\n\t{-0.0539286,-0.999643,0.0},\n\t{-0.0673214,-0.999643,0.0},\n\t{-0.0675,-0.999643,0.0178571},\n\t{-0.0539286,-0.999643,0.0178571},\n\t{-0.000357143,-1,0.0},\n\t{-0.000357143,-1,0.0},\n\t{-0.000535714,-1,0.0178571},\n\t{-0.000357143,-1,0.0178571}\n};\n\nstatic const unsigned long TeaspoonPatches[16][16] =\n{\n\t{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},\n\t{17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32},\n\t{33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48},\n\t{49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64},\n\t{65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80},\n\t{81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96},\n\t{97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112},\n\t{113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128},\n\t{129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144},\n\t{145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160},\n\t{161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176},\n\t{177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192},\n\t{193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208},\n\t{209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224},\n\t{225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240},\n\t{241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// newell_primitive\n\nclass newell_primitive :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tnewell_primitive(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_type(init_owner(*this) + init_name(\"type\") + init_label(_(\"Primitive\")) + init_description(_(\"Primitive type (teapot, teacup or teaspoon\")) + init_value(TEAPOT) + init_enumeration(type_values())),\n\t\tm_size(init_owner(*this) + init_name(\"size\") + init_label(_(\"Size\")) + init_description(_(\"Primitive size (scale)\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_type.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_size.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t size = m_size.pipeline_value();\n\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\t\tboost::scoped_ptr<k3d::bicubic_patch::primitive> primitive(k3d::bicubic_patch::create(Output));\n\n\t\tswitch(m_type.pipeline_value())\n\t\t{\n\t\t\tcase TEAPOT:\n\t\t\t{\n\t\t\t\tconst k3d::teapot::points_array_t& teapot_points = k3d::teapot::points();\n\t\t\t\tconst k3d::teapot::patches_array_t& teapot_patches = k3d::teapot::patches();\n\n\t\t\t\tfor(k3d::uint_t i = 0; i != 306; ++i)\n\t\t\t\t{\n\t\t\t\t\tpoints.push_back(size * k3d::point3(teapot_points[i][0], teapot_points[i][1], teapot_points[i][2]));\n\t\t\t\t\tpoint_selection.push_back(0);\n\t\t\t\t}\n\n\t\t\t\tfor(k3d::uint_t i = 0; i < 32; i++)\n\t\t\t\t{\n\t\t\t\t\tprimitive->patch_selections.push_back(0);\n\t\t\t\t\tprimitive->patch_materials.push_back(material);\n\n\t\t\t\t\tfor(k3d::uint_t j = 0; j != 16; ++j)\n\t\t\t\t\t\tprimitive->patch_points.push_back(teapot_patches[i][j]);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TEACUP :\n\t\t\t{\n\t\t\t\tfor(k3d::uint_t i = 0; i != 251; ++i)\n\t\t\t\t{\n\t\t\t\t\tpoints.push_back(size * k3d::point3(TeacupPoints[i][0], TeacupPoints[i][2], TeacupPoints[i][1]));\n\t\t\t\t\tpoint_selection.push_back(0);\n\t\t\t\t}\n\n\t\t\t\tfor(k3d::uint_t i = 0; i != 26; ++i)\n\t\t\t\t{\n\t\t\t\t\tprimitive->patch_selections.push_back(0);\n\t\t\t\t\tprimitive->patch_materials.push_back(material);\n\n\t\t\t\t\tfor(k3d::uint_t j = 0; j != 16; ++j)\n\t\t\t\t\t\tprimitive->patch_points.push_back(TeacupPatches[i][j]-1);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TEASPOON :\n\t\t\t{\n\t\t\t\tfor(k3d::uint_t i = 0; i != 256; ++i)\n\t\t\t\t{\n\t\t\t\t\tpoints.push_back(size * k3d::point3(TeaspoonPoints[i][1], TeaspoonPoints[i][0], TeaspoonPoints[i][2]));\n\t\t\t\t\tpoint_selection.push_back(0);\n\t\t\t\t}\n\n\t\t\t\tfor(k3d::uint_t i = 0; i != 16; ++i)\n\t\t\t\t{\n\t\t\t\t\tprimitive->patch_selections.push_back(0);\n\t\t\t\t\tprimitive->patch_materials.push_back(material);\n\n\t\t\t\t\tfor(k3d::uint_t j = 0; j != 16; ++j)\n\t\t\t\t\t\tprimitive->patch_points.push_back(TeaspoonPatches[i][j]-1);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<newell_primitive, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0x274c0cae, 0x2efd5bbf, 0x986a500f, 0xff5e2de6),\n\t\t\t\"Newell\",\n\t\t\t_(\"Generates Newell primitives using bicubic patches.\"),\n\t\t\t\"BicubicPatch\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t/// Enumerates supported primitive types\n\ttypedef enum\n\t{\n\t\tTEAPOT,\n\t\tTEACUP,\n\t\tTEASPOON\n\t} primitive_t;\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const primitive_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase TEAPOT:\n\t\t\t\tStream << \"teapot\";\n\t\t\t\tbreak;\n\t\t\tcase TEACUP:\n\t\t\t\tStream << \"teacup\";\n\t\t\t\tbreak;\n\t\t\tcase TEASPOON:\n\t\t\t\tStream << \"teaspoon\";\n\t\t\t\tbreak;\n\t\t}\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator >> (std::istream& Stream, primitive_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"teapot\")\n\t\t\tValue = TEAPOT;\n\t\telse if(text == \"teacup\")\n\t\t\tValue = TEACUP;\n\t\telse if(text == \"teaspoon\")\n\t\t\tValue = TEASPOON;\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& type_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Teapot\", \"teapot\", \"Creates a Newell teapot\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Teacup\", \"teacup\", \"Creates a Newell teacup\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Teaspoon\", \"teaspoon\", \"Creates a Newell teaspoon\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\t/// Controls the type of primitive to be created\n\tk3d_data(primitive_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_type;\n\n\t/// Generic size control\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_size;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// newell_primitive_factory\n\nk3d::iplugin_factory& newell_primitive_factory()\n{\n\treturn newell_primitive::get_factory();\n}\n\n} // namespace bicubic_patch\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/bilinear_patch/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-bilinear-patch)\nK3D_CREATE_MODULE_PROXY(k3d-bilinear-patch)\n\n"
  },
  {
    "path": "modules/bilinear_patch/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace bilinear_patch\n{\n\nextern k3d::iplugin_factory& poly_to_bilinear_factory();\n\n} // namespace bilinear_patch\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::bilinear_patch::poly_to_bilinear_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/bilinear_patch/poly_to_bilinear.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace bilinear_patch\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_to_bilinear\n\nclass poly_to_bilinear:\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tpoly_to_bilinear(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput.points = Input.points;\n\t\tOutput.point_selection = Input.point_selection;\n\t\tOutput.point_attributes = Input.point_attributes;\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Input, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Create bilinear patches ...\n\t\t\tboost::scoped_ptr<k3d::bilinear_patch::primitive> bilinear_patches(k3d::bilinear_patch::create(Output));\n\n\t\t\t// Get ready to copy attributes ...\n\t\t\tbilinear_patches->constant_attributes = polyhedron->constant_attributes;\n\t\t\tbilinear_patches->patch_attributes = polyhedron->face_attributes.clone_types();\n\t\t\tbilinear_patches->vertex_attributes = polyhedron->vertex_attributes.clone_types();\n\n\t\t\tk3d::table_copier patch_attributes(polyhedron->face_attributes, bilinear_patches->patch_attributes);\n\t\t\tk3d::table_copier vertex_attributes(polyhedron->vertex_attributes, bilinear_patches->vertex_attributes);\n\n\t\t\t// Create a patch for each quadrilateral face in the polyhedron ...\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tstd::vector<k3d::uint_t> edges;\n\n\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[polyhedron->face_first_loops[face]];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t{\n\t\t\t\t\tedges.push_back(edge);\n\n\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif(edges.size() != 4)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tbilinear_patches->patch_selections.push_back(polyhedron->face_selections[face]);\n\t\t\t\tbilinear_patches->patch_materials.push_back(polyhedron->face_materials[face]);\n\t\t\t\tpatch_attributes.push_back(face);\n\n\t\t\t\t// Note: Bilinear patch control points *aren't* in clockwise order!\n\t\t\t\tbilinear_patches->patch_points.push_back(polyhedron->vertex_points[edges[0]]);\n\t\t\t\tbilinear_patches->patch_points.push_back(polyhedron->vertex_points[edges[1]]);\n\t\t\t\tbilinear_patches->patch_points.push_back(polyhedron->vertex_points[edges[3]]); \n\t\t\t\tbilinear_patches->patch_points.push_back(polyhedron->vertex_points[edges[2]]);\n\n\t\t\t\tvertex_attributes.push_back(edges[0]);\n\t\t\t\tvertex_attributes.push_back(edges[1]);\n\t\t\t\tvertex_attributes.push_back(edges[3]);\n\t\t\t\tvertex_attributes.push_back(edges[2]);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<poly_to_bilinear,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0xe99f3672, 0x6e85457d, 0x9ce1f9dc, 0x6bb71691),\n\t\t\t\t\"PolyToBilinear\",\n\t\t\t\t_(\"Converts input quadrilaterals to bilinear patches.\"),\n\t\t\t\t\"BilinearPatch\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_to_bilinear_factory\n\nk3d::iplugin_factory& poly_to_bilinear_factory()\n{\n\treturn poly_to_bilinear::get_factory();\n}\n\n} // namespace bilinear_patch\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/bitmap/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-bitmap)\nK3D_CREATE_MODULE_PROXY(k3d-bitmap)\n\n"
  },
  {
    "path": "modules/bitmap/add.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include \"simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// add\n\nclass add :\n\tpublic simple_modifier\n{\n\ttypedef simple_modifier base;\n\npublic:\n\tadd(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_value(init_owner(*this) + init_name(\"value\") + init_label(_(\"Add value\")) + init_description(_(\"Add value to each pixel's Red, Green and Blue component\")) + init_value(0.0))\n\t{\n\t\tm_value.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tstruct functor\n\t{\n\t\tfunctor(const double Value) :\n\t\t\tvalue(Value)\n\t\t{\n\t\t}\n\n\t\tk3d::pixel operator()(const k3d::pixel& Input) const\n\t\t{\n\t\t\treturn k3d::pixel(\n\t\t\t\tstd::min(1.0, boost::gil::get_color(Input, boost::gil::red_t()) + value),\n\t\t\t\tstd::min(1.0, boost::gil::get_color(Input, boost::gil::green_t()) + value),\n\t\t\t\tstd::min(1.0, boost::gil::get_color(Input, boost::gil::blue_t()) + value),\n\t\t\t\tboost::gil::get_color(Input, boost::gil::alpha_t()));\n\t\t}\n\n\t\tconst double value;\n\t};\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tboost::gil::transform_pixels(const_view(Input), view(Output), functor(m_value.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<add,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0x30d648f9, 0x74844196, 0x801a34f9, 0x6ff15920),\n\t\t\t\t\"BitmapAdd\",\n\t\t\t\t_(\"Add value to each pixel color component\"),\n\t\t\t\t\"Bitmap\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// add\n\nk3d::iplugin_factory& add_factory()\n{\n\treturn add::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/bitmap/checker.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_source.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n\n#include <iterator>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// checker\n\nclass checker :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_source<checker>\n{\n\ttypedef k3d::node base;\n\npublic:\n\tchecker(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Bitmap width\")) + init_value(64L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Bitmap height\")) + init_value(64L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_check_width(init_owner(*this) + init_name(\"check_width\") + init_label(_(\"Check width\")) + init_description(_(\"Check (rectangle) width\")) + init_value(8L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_check_height(init_owner(*this) + init_name(\"check_height\") + init_label(_(\"Check height\")) + init_description(_(\"Check (rectangle) height\")) + init_value(8L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_color1(init_owner(*this) + init_name(\"color1\") + init_label(_(\"Color 1\")) + init_description(_(\"First check color\")) + init_value(k3d::color(1, 1, 1))),\n\t\tm_color2(init_owner(*this) + init_name(\"color2\") + init_label(_(\"Color 2\")) + init_description(_(\"Second check color\")) + init_value(k3d::color(0, 0, 0)))\n\t{\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_dimensions_changed> >(make_update_bitmap_slot()));\n\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_dimensions_changed> >(make_update_bitmap_slot()));\n\n\t\tm_check_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\n\t\tm_check_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\n\t\tm_color1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\n\t\tm_color2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tvoid on_resize_bitmap(k3d::bitmap& Output)\n\t{\n\t        const k3d::pixel_size_t width = m_width.pipeline_value();\n\t\tconst k3d::pixel_size_t height = m_height.pipeline_value();\n\t\tOutput.recreate(width, height);\n\t}\n\n\tvoid on_assign_pixels(k3d::bitmap& Output)\n\t{\n\t\tconst k3d::pixel_size_t check_width = m_check_width.pipeline_value();\n\t\tconst k3d::pixel_size_t check_height = m_check_height.pipeline_value();\n\t\tconst k3d::color color1 = m_color1.pipeline_value();\n\t\tconst k3d::color color2 = m_color2.pipeline_value();\n\n\t\tk3d::checkerboard_fill(view(Output), check_width, check_height, k3d::pixel(color1.red, color1.green, color1.blue, 1.0), k3d::pixel(color2.red, color2.green, color2.blue, 1.0));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<checker,\n\t\t\tk3d::interface_list<k3d::ibitmap_source> > factory(\n\t\t\t\tk3d::uuid(0x8d65a65f, 0x853e4460, 0xbc2ecbad, 0xce65b404),\n\t\t\t\t\"BitmapChecker\",\n\t\t\t\t_(\"Generates a checker-pattern bitmap\"),\n\t\t\t\t\"Bitmap\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_check_width;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_check_height;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color1;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color2;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// checker_factory\n\nk3d::iplugin_factory& checker_factory()\n{\n\treturn checker::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/bitmap/color_monochrome.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include \"simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// color_monochrome\n\nclass color_monochrome :\n\tpublic simple_modifier\n{\n\ttypedef simple_modifier base;\n\npublic:\n\tcolor_monochrome(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_red_weight(init_owner(*this) + init_name(\"red_weight\") + init_label(_(\"Red weight\")) + init_description(_(\"Scale Red componnt value\")) + init_value(0.3)),\n\t\tm_green_weight(init_owner(*this) + init_name(\"green_weight\") + init_label(_(\"Green weight\")) + init_description(_(\"Scale Green component value\")) + init_value(0.59)),\n\t\tm_blue_weight(init_owner(*this) + init_name(\"blue_weight\") + init_label(_(\"Blue weight\")) + init_description(_(\"Scale Blue component value\")) + init_value(0.11))\n\t{\n\t\tm_red_weight.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t\tm_green_weight.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t\tm_blue_weight.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tstruct functor\n\t{\n\t\tfunctor(const double RedWeight, const double GreenWeight, const double BlueWeight) :\n\t\t\tred_weight(RedWeight),\n\t\t\tgreen_weight(GreenWeight),\n\t\t\tblue_weight(BlueWeight)\n\t\t{\n\t\t}\n\n\t\tk3d::pixel operator()(const k3d::pixel& Input) const\n\t\t{\n\t\t\tconst double value = \n\t\t\t\tred_weight * boost::gil::get_color(Input, boost::gil::red_t()) +\n\t\t\t\tgreen_weight * boost::gil::get_color(Input, boost::gil::green_t()) + \n\t\t\t\tblue_weight * boost::gil::get_color(Input, boost::gil::blue_t());\n\n\t\t\treturn k3d::pixel(\n\t\t\t\tvalue,\n\t\t\t\tvalue,\n\t\t\t\tvalue,\n\t\t\t\tboost::gil::get_color(Input, boost::gil::alpha_t()));\n\t\t}\n\n\t\tconst double red_weight;\n\t\tconst double green_weight;\n\t\tconst double blue_weight;\n\t};\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tk3d::ipipeline_profiler::profile profile(document().pipeline_profiler(), *this, \"Update Bitmap\");\n\t\tboost::gil::transform_pixels(const_view(Input), view(Output), functor(m_red_weight.pipeline_value(), m_green_weight.pipeline_value(), m_blue_weight.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<color_monochrome,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0x73cd5356, 0x4d3d4eaf, 0xacda0d76, 0x8070a016),\n\t\t\t\t\"BitmapColorMonochrome\",\n\t\t\t\t_(\"Make any image black and white\"),\n\t\t\t\t\"Bitmap\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_red_weight;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_green_weight;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_blue_weight;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// color_monochrome_factory\n\nk3d::iplugin_factory& color_monochrome_factory()\n{\n\treturn color_monochrome::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/bitmap/gamma.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include \"simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// gamma\n\nclass gamma :\n\tpublic simple_modifier\n{\n\ttypedef simple_modifier base;\n\npublic:\n\tgamma(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_gamma(init_owner(*this) + init_name(\"gamma\") + init_label(_(\"Gamma Value\")) + init_description(_(\"Apply gamma value to each pixel.\")) + init_value(1.0))\n\t{\n\t\tm_gamma.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tstruct functor\n\t{\n\t\tfunctor(const double Gamma) :\n\t\t\tgamma(Gamma ? 1.0 / Gamma : 1.0)\n\t\t{\n\t\t}\n\n\t\tk3d::pixel operator()(const k3d::pixel& Input)\n\t\t{\n\t\t\treturn k3d::pixel(\n\t\t\t\tstd::pow(static_cast<double>(boost::gil::get_color(Input, boost::gil::red_t())), gamma),\n\t\t\t\tstd::pow(static_cast<double>(boost::gil::get_color(Input, boost::gil::green_t())), gamma),\n\t\t\t\tstd::pow(static_cast<double>(boost::gil::get_color(Input, boost::gil::blue_t())), gamma),\n\t\t\t\tboost::gil::get_color(Input, boost::gil::alpha_t()));\n\t\t}\n\n\t\tconst double gamma;\n\t};\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tboost::gil::transform_pixels(const_view(Input), view(Output), functor(m_gamma.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<gamma,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0xa2ff08c9, 0x96e54063, 0x907ad507, 0xec36dd1c),\n\t\t\t\t\"BitmapGamma\",\n\t\t\t\t_(\"Apply gamma value to each pixel\"),\n\t\t\t\t\"Bitmap\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_gamma;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// gamma_factory\n\nk3d::iplugin_factory& gamma_factory()\n{\n\treturn gamma::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/bitmap/invert.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// invert\n\nclass invert :\n\tpublic simple_modifier\n{\n\ttypedef simple_modifier base;\n\npublic:\n\tinvert(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tstruct functor\n\t{\n\t\tk3d::pixel operator()(const k3d::pixel& Input)\n\t\t{\n\t\t\treturn k3d::pixel(\n\t\t\t\tboost::gil::channel_invert(boost::gil::get_color(Input, boost::gil::red_t())),\n\t\t\t\tboost::gil::channel_invert(boost::gil::get_color(Input, boost::gil::green_t())),\n\t\t\t\tboost::gil::channel_invert(boost::gil::get_color(Input, boost::gil::blue_t())),\n\t\t\t\tboost::gil::get_color(Input, boost::gil::alpha_t()));\n\t\t}\n\t};\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tboost::gil::transform_pixels(const_view(Input), view(Output), functor());\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<invert,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0xb56232dd, 0x3e204f04, 0x83e2273c, 0x3b0539ad),\n\t\t\t\t\"BitmapInvert\",\n\t\t\t\t_(\"Inverts a bitmap\"),\n\t\t\t\t\"Bitmap\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// invert_factory\n\nk3d::iplugin_factory& invert_factory()\n{\n\treturn invert::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/bitmap/matte_colordiff.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include \"simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// matte_colordiff\n\nclass matte_colordiff :\n\tpublic simple_modifier\n{\n\ttypedef simple_modifier base;\n\npublic:\n\tmatte_colordiff(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_threshold(init_owner(*this) + init_name(\"threshold\") + init_label(_(\"Threshold Value\")) + init_description(_(\"Set alpha channel using color difference\")) + init_value(0.0))\n\t{\n\t\tm_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tstruct functor\n\t{\n\t\tfunctor(const double Threshold) :\n\t\t\tthreshold(Threshold)\n\t\t{\n\t\t}\n\n\t\tk3d::pixel operator()(const k3d::pixel& Input)\n\t\t{\n\t\t\tconst half red = boost::gil::get_color(Input, boost::gil::red_t());\n\t\t\tconst half green = boost::gil::get_color(Input, boost::gil::green_t());\n\t\t\tconst half blue = boost::gil::get_color(Input, boost::gil::blue_t());\n\t\t\tconst half alpha = boost::gil::get_color(Input, boost::gil::alpha_t());\n\n\t\t\treturn k3d::pixel(\n\t\t\t\tred,\n\t\t\t\tgreen,\n\t\t\t\tstd::min(green, blue),\n\t\t\t\tblue > threshold ? 1 - (blue - std::max(red, green)) : 1);\n\t\t}\n\n\t\tconst double threshold;\n\t};\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tboost::gil::transform_pixels(const_view(Input), view(Output), functor(m_threshold.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<matte_colordiff,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0xeefaccf2, 0x65bc4c78, 0xbd46cbdb, 0x5ca5d3e2),\n\t\t\t\t\"BitmapMatteColorDiff\",\n\t\t\t\t_(\"Create alpha channel using color difference\"),\n\t\t\t\t\"Bitmap\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_threshold;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// matte_colordiff_factory\n\nk3d::iplugin_factory& matte_colordiff_factory()\n{\n\treturn matte_colordiff::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/bitmap/matte_invert.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// matte_invert\n\nclass matte_invert :\n\tpublic simple_modifier\n{\n\ttypedef simple_modifier base;\n\npublic:\n\tmatte_invert(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tstruct functor\n\t{\n\t\tk3d::pixel operator()(const k3d::pixel& Input)\n\t\t{\n\t\t\treturn k3d::pixel(\n\t\t\t\tboost::gil::get_color(Input, boost::gil::red_t()),\n\t\t\t\tboost::gil::get_color(Input, boost::gil::green_t()),\n\t\t\t\tboost::gil::get_color(Input, boost::gil::blue_t()),\n\t\t\t\tboost::gil::channel_invert(boost::gil::get_color(Input, boost::gil::alpha_t())));\n\t\t}\n\t};\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tboost::gil::transform_pixels(const_view(Input), view(Output), functor());\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<matte_invert,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0x6856b0e9, 0x36b645d9, 0xb324d58b, 0x624072e9),\n\t\t\t\t\"BitmapMatteInvert\",\n\t\t\t\t_(\"Inverts a bitmap's alpha channel\"),\n\t\t\t\t\"Bitmap\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// matte_invert_factory\n\nk3d::iplugin_factory& matte_invert_factory()\n{\n\treturn matte_invert::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/bitmap/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\nextern k3d::iplugin_factory& add_factory();\nextern k3d::iplugin_factory& checker_factory();\nextern k3d::iplugin_factory& color_monochrome_factory();\nextern k3d::iplugin_factory& gamma_factory();\nextern k3d::iplugin_factory& invert_factory();\nextern k3d::iplugin_factory& matte_colordiff_factory();\nextern k3d::iplugin_factory& matte_invert_factory();\nextern k3d::iplugin_factory& multiply_factory();\nextern k3d::iplugin_factory& reader_factory();\nextern k3d::iplugin_factory& reference_image_2d_factory();\nextern k3d::iplugin_factory& reference_image_3d_factory();\nextern k3d::iplugin_factory& solid_factory();\nextern k3d::iplugin_factory& subtract_factory();\nextern k3d::iplugin_factory& threshold_factory();\n\n} // namespace bitmap\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::bitmap::add_factory());\n\tRegistry.register_factory(module::bitmap::checker_factory());\n\tRegistry.register_factory(module::bitmap::color_monochrome_factory());\n\tRegistry.register_factory(module::bitmap::gamma_factory());\n\tRegistry.register_factory(module::bitmap::invert_factory());\n\tRegistry.register_factory(module::bitmap::matte_colordiff_factory());\n\tRegistry.register_factory(module::bitmap::matte_invert_factory());\n\tRegistry.register_factory(module::bitmap::multiply_factory());\n\tRegistry.register_factory(module::bitmap::reader_factory());\n\tRegistry.register_factory(module::bitmap::reference_image_2d_factory());\n\tRegistry.register_factory(module::bitmap::reference_image_3d_factory());\n\tRegistry.register_factory(module::bitmap::solid_factory());\n\tRegistry.register_factory(module::bitmap::subtract_factory());\n\tRegistry.register_factory(module::bitmap::threshold_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/bitmap/multiply.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include \"simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// multiply\n\nclass multiply :\n\tpublic simple_modifier\n{\n\ttypedef simple_modifier base;\n\npublic:\n\tmultiply(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_value(init_owner(*this) + init_name(\"value\") + init_label(_(\"Multiplicand\")) + init_description(_(\"Multiply each pixel component with this value\")) + init_value(1.0))\n\t{\n\t\tm_value.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tstruct functor\n\t{\n\t\tfunctor(const double Value) :\n\t\t\tvalue(Value)\n\t\t{\n\t\t}\n\n\t\tk3d::pixel operator()(const k3d::pixel& Input) const\n\t\t{\n\t\t\treturn k3d::pixel(\n\t\t\t\tboost::gil::get_color(Input, boost::gil::red_t()) * value,\n\t\t\t\tboost::gil::get_color(Input, boost::gil::green_t()) * value,\n\t\t\t\tboost::gil::get_color(Input, boost::gil::blue_t()) * value,\n\t\t\t\tboost::gil::get_color(Input, boost::gil::alpha_t()));\n\t\t}\n\n\t\tconst double value;\n\t};\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tboost::gil::transform_pixels(const_view(Input), view(Output), functor(m_value.pipeline_value()));\n\t}\n\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<multiply,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0x03d2ac85, 0x37af4255, 0x956c0def, 0x82c3c753),\n\t\t\t\t\"BitmapMultiply\",\n\t\t\t\t_(\"Multiply value of each pixel\"),\n\t\t\t\t\"Bitmap\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// multiply_factory\n\nk3d::iplugin_factory& multiply_factory()\n{\n\treturn multiply::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/bitmap/reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_source.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/ibitmap_importer.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mime_types.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/plugin.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iterator>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// reader\n\nclass reader :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_source<reader>\n{\n\ttypedef k3d::node base;\n\npublic:\n\treader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Browse for an input bitmap\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::bitmaps()))\n\t{\n\t\tm_file.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_bitmap_slot()));\n\t}\n\n\tvoid on_resize_bitmap(k3d::bitmap& Output)\n\t{\n\t\tconst k3d::filesystem::path file = m_file.pipeline_value();\n\t\tif(!k3d::filesystem::exists(file))\n\t\t\treturn;\n\n\t\tconst k3d::mime::type mime_type = k3d::mime::type::lookup(file);\n\t\tif(mime_type.empty())\n\t\t{\n\t\t\tk3d::log() << error << \"couldn't identify MIME type for file [\" << file.native_console_string() << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::ibitmap_importer>(mime_type);\n\t\tif(factories.empty())\n\t\t{\n\t\t\tk3d::log() << error << \"no plugins available to load MIME type [\" << mime_type.str() << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tfor(k3d::plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::ibitmap_importer> importer(k3d::plugin::create<k3d::ibitmap_importer>(**factory));\n\t\t\tif(!importer)\n\t\t\t\tcontinue;\n\n\t\t\tif(!importer->read_file(file, Output))\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"factory [\" << (**factory).name() << \"] couldn't load file [\" << file.native_console_string() << \"]\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\tvoid on_assign_pixels(k3d::bitmap& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<reader,\n\t\t\tk3d::interface_list<k3d::ibitmap_source> > factory(\n\t\t\t\tk3d::classes::FileBitmap(),\n\t\t\t\t\"BitmapReader\",\n\t\t\t\t_(\"Loads a bitmap from the filesystem\"),\n\t\t\t\t\"Bitmap BitmapReader\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// reader_factory\n\nk3d::iplugin_factory& reader_factory()\n{\n\treturn reader::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/bitmap/reference_image_2d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/irenderable_gl.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/render_state_gl.h>\n#include <k3dsdk/utility_gl.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// reference_image_2d\n\nclass reference_image_2d :\n\tpublic k3d::node,\n\tpublic k3d::gl::irenderable\n{\n\ttypedef k3d::node base;\n\npublic:\n\treference_image_2d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Color\")) + init_value(k3d::color(1, 1, 1))),\n\t\tm_opacity(init_owner(*this) + init_name(\"opacity\") + init_label(_(\"Opacity\")) + init_description(_(\"Opacity\")) + init_value(0.1)),\n\t\tm_camera(init_owner(*this) + init_name(\"camera\") + init_label(_(\"Camera\")) + init_description(_(\"Camera\")) + init_value<k3d::icamera*>(0)),\n\t\tm_bitmap(init_owner(*this) + init_name(\"bitmap\") + init_label(_(\"Bitmap\")) + init_description(_(\"Bitmap\")) + init_value<k3d::bitmap*>(0)),\n\t\tm_aspect_ratio_type(init_owner(*this) + init_name(\"aspect_ratio_type\") + init_label(_(\"Aspect Ratio Type\")) + init_description(_(\"Aspect Ratio Type\")) + init_value(IMAGE) + init_enumeration(aspect_ratio_type_values())),\n\t\tm_aspect_ratio(init_owner(*this) + init_name(\"aspect_ratio\") + init_label(_(\"Aspect Ratio\")) + init_description(_(\"Aspect Ratio\")) + init_value(1.0)),\n\t\tm_texture_name(0)\n\t{\n\t\tm_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_opacity.changed_signal().connect(make_async_redraw_slot());\n\t\tm_camera.changed_signal().connect(make_async_redraw_slot());\n\t\tm_bitmap.changed_signal().connect(sigc::mem_fun(*this, &reference_image_2d::bitmap_changed));\n\t\tm_aspect_ratio_type.changed_signal().connect(make_async_redraw_slot());\n\t\tm_aspect_ratio.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\t~reference_image_2d()\n\t{\n\t\tif(m_texture_name)\n\t\t\tglDeleteTextures(1, &m_texture_name);\n\t}\n\n\tvoid bitmap_changed(k3d::ihint* Hint)\n\t{\n\t\tif(m_texture_name)\n\t\t{\n\t\t\tglDeleteTextures(1, &m_texture_name);\n\t\t\tm_texture_name = 0;\n\t\t}\n\n\t\tasync_redraw(Hint);\n\t}\n\n\tsigc::slot<void, k3d::ihint*> make_async_redraw_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &reference_image_2d::async_redraw);\n\t}\n\n\tvoid async_redraw(k3d::ihint*)\n\t{\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tk3d::uint_t gl_layer()\n\t{\n\t\treturn 2048;\n\t}\n\n\tvoid gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tif(&State.camera != m_camera.pipeline_value())\n\t\t\treturn;\n\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tdraw(State);\n\t}\n\n\tvoid gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\t/** \\note Selection is disabled for this plugin, so we don't interfere with\n\t\t * selection of \"normal\" geometry */\n\t}\n\n\tvoid draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::bitmap* const bitmap = m_bitmap.pipeline_value();\n\t\tif(!(bitmap && bitmap->width() && bitmap->height()))\n\t\t\treturn;\n\n\t\tconst k3d::color color = m_color.pipeline_value();\n\t\tconst double opacity = m_opacity.pipeline_value();\n\t\tconst aspect_ratio_type_t aspect_ratio_type = m_aspect_ratio_type.pipeline_value();\n\t\tconst double aspect_ratio = m_aspect_ratio.pipeline_value();\n\n\t\tglColor4d(color.red, color.green, color.blue, opacity);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tglLoadIdentity();\n\t\tglScaled(1, 1, -1);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_CULL_FACE);\n\n\t\tglEnable(GL_BLEND);\n\t\tglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\n\t\tglDepthMask(GL_FALSE);\n\n\t\tif(0 == m_texture_name)\n\t\t{\n\t\t\tglGenTextures(1, &m_texture_name);\n\t\t\tglBindTexture(GL_TEXTURE_2D, m_texture_name);\n\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n\n\t\t\tk3d::gl::tex_image_2d(*bitmap);\n\t\t}\n\n\t\tif(m_texture_name)\n\t\t{\n\t\t\tglEnable(GL_TEXTURE_2D);\n\t\t\tglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);\n\t\t\tglBindTexture(GL_TEXTURE_2D, m_texture_name);\n\n\t\t\tdouble camera_left = 0;\n\t\t\tdouble camera_right = 0;\n\t\t\tdouble camera_top = 0;\n\t\t\tdouble camera_bottom = 0;\n\t\t\tdouble camera_far = 0;\n\t\t\t\n\t\t\tif(State.orthographic)\n\t\t\t{\n\t\t\t\tcamera_left = State.gl_camera_frustum_left;\n\t\t\t\tcamera_right = State.gl_camera_frustum_right;\n\t\t\t\tcamera_top = State.gl_camera_frustum_top;\n\t\t\t\tcamera_bottom = State.gl_camera_frustum_bottom;\n\t\t\t\tcamera_far = State.gl_camera_frustum_far;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst double q = State.gl_camera_frustum_far / State.gl_camera_frustum_near;\n\n\t\t\t\tcamera_left = State.gl_camera_frustum_left * q;\n\t\t\t\tcamera_right = State.gl_camera_frustum_right * q;\n\t\t\t\tcamera_top = State.gl_camera_frustum_top * q;\n\t\t\t\tcamera_bottom = State.gl_camera_frustum_bottom * q;\n\t\t\t\tcamera_far = State.gl_camera_frustum_far;\n\t\t\t}\n\n\t\t\tdouble draw_left = 0;\n\t\t\tdouble draw_right = 0;\n\t\t\tdouble draw_top = 0;\n\t\t\tdouble draw_bottom = 0;\n\t\t\tdouble draw_z = 0;\n\t\n\t\t\tconst double camera_ratio = (camera_right - camera_left) / (camera_top - camera_bottom);\n\t\t\tdouble target_ratio = 0;\n\n\t\t\tswitch(aspect_ratio_type)\n\t\t\t{\n\t\t\t\tcase IMAGE:\n\t\t\t\t\ttarget_ratio = static_cast<double>(bitmap->width()) / static_cast<double>(bitmap->height());\n\t\t\t\t\tbreak;\n\t\t\t\tcase CAMERA:\n\t\t\t\t\ttarget_ratio = camera_ratio;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ttarget_ratio *= aspect_ratio;\n\n\t\t\tif(target_ratio > camera_ratio)\n\t\t\t{\n\t\t\t\tdraw_left = camera_left;\n\t\t\t\tdraw_right = camera_right;\n\t\t\t\tdraw_top = camera_top * camera_ratio / target_ratio;\n\t\t\t\tdraw_bottom = camera_bottom * camera_ratio / target_ratio;\n\t\t\t\tdraw_z = camera_far * 0.99;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdraw_left = camera_left * target_ratio / camera_ratio;\n\t\t\t\tdraw_right = camera_right * target_ratio / camera_ratio;\n\t\t\t\tdraw_top = camera_top;\n\t\t\t\tdraw_bottom = camera_bottom;\n\t\t\t\tdraw_z = camera_far * 0.99;\n\t\t\t}\n\n\t\t\tglBegin(GL_QUADS);\n\t\t\t\tglTexCoord2d(0, 0);\n\t\t\t\tglVertex3d(draw_left, draw_top, draw_z);\n\t\t\t\tglTexCoord2d(1, 0);\n\t\t\t\tglVertex3d(draw_right, draw_top, draw_z);\n\t\t\t\tglTexCoord2d(1, 1);\n\t\t\t\tglVertex3d(draw_right, draw_bottom, draw_z);\n\t\t\t\tglTexCoord2d(0, 1);\n\t\t\t\tglVertex3d(draw_left, draw_bottom, draw_z);\n\t\t\tglEnd();\n\t\t}\n\t\t\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<reference_image_2d>factory(\n\t\t\tk3d::uuid(0x77c55d01, 0x138e45bd, 0xbb4aefa2, 0xfe2911b2),\n\t\t\t\"ReferenceImage2D\",\n\t\t\t_(\"Displays a bitmap image in the background of the viewport.\"),\n\t\t\t\"Annotation\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttypedef enum\n\t{\n\t\tIMAGE,\n\t\tCAMERA,\n\t} aspect_ratio_type_t;\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& aspect_ratio_type_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Image\"), \"image\", _(\"Maintain the image aspect ratio\")));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Camera\"), \"camera\", _(\"Stretch the image to fill the camera aspect ratio\")));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const aspect_ratio_type_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase IMAGE:\n\t\t\t\tStream << \"image\";\n\t\t\t\tbreak;\n\t\t\tcase CAMERA:\n\t\t\t\tStream << \"camera\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, aspect_ratio_type_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"image\")\n\t\t\tValue = IMAGE;\n\t\telse if(text == \"camera\")\n\t\t\tValue = CAMERA;\n\t\telse\n\t\t\tk3d::log() << k3d_file_reference << \": unknown enumeration [\" << text << \"]\"<< std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_opacity;\n\tk3d_data(k3d::icamera*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_camera;\n\tk3d_data(k3d::bitmap*, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) m_bitmap;\n\tk3d_data(aspect_ratio_type_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_aspect_ratio_type;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_aspect_ratio;\n\n\tGLuint m_texture_name;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// reference_image_2d_factory\n\nk3d::iplugin_factory& reference_image_2d_factory()\n{\n\treturn reference_image_2d::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/bitmap/reference_image_3d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/transformable.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// reference_image_3d\n\nclass reference_image_3d :\n\tpublic k3d::gl::renderable<k3d::transformable<k3d::node > >\n{\n\ttypedef k3d::gl::renderable<k3d::transformable<k3d::node > > base;\n\npublic:\n\treference_image_3d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Color\")) + init_value(k3d::color(1, 1, 1))),\n\t\tm_opacity(init_owner(*this) + init_name(\"opacity\") + init_label(_(\"Opacity\")) + init_description(_(\"Opacity\")) + init_value(0.3)),\n\t\tm_bitmap(init_owner(*this) + init_name(\"bitmap\") + init_label(_(\"Bitmap\")) + init_description(_(\"Bitmap\")) + init_value<k3d::bitmap*>(0)),\n\t\tm_size(init_owner(*this) + init_name(\"size\") + init_label(_(\"Size\")) + init_description(_(\"Size\")) + init_value(10.0)),\n\t\tm_aspect_ratio_type(init_owner(*this) + init_name(\"aspect_ratio_type\") + init_label(_(\"Aspect Ratio Type\")) + init_description(_(\"Aspect Ratio Type\")) + init_value(ASPECT_RATIO_IMAGE) + init_enumeration(aspect_ratio_type_values())),\n\t\tm_aspect_ratio(init_owner(*this) + init_name(\"aspect_ratio\") + init_label(_(\"Aspect Ratio\")) + init_description(_(\"Aspect Ratio\")) + init_value(1.0)),\n\t\tm_orientation(init_owner(*this) + init_name(\"orientation\") + init_label(_(\"Orientation\")) + init_description(_(\"Orientation type (forward or backward along X, Y or Z axis)\")) + init_value(k3d::PZ) + init_enumeration(k3d::signed_axis_values())),\n\t\tm_draw_behind(init_owner(*this) + init_name(\"draw_behind\") + init_label(_(\"Draw Behind\")) + init_description(_(\"Draw the image so that always appears behind geometry\")) + init_value(true)),\n\t\tm_texture_name(0)\n\t{\n\t\tm_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_opacity.changed_signal().connect(make_async_redraw_slot());\n\t\tm_bitmap.changed_signal().connect(sigc::mem_fun(*this, &reference_image_3d::bitmap_changed));\n\t\tm_size.changed_signal().connect(make_async_redraw_slot());\n\t\tm_aspect_ratio_type.changed_signal().connect(make_async_redraw_slot());\n\t\tm_aspect_ratio.changed_signal().connect(make_async_redraw_slot());\n\t\tm_orientation.changed_signal().connect(make_async_redraw_slot());\n\t\tm_draw_behind.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\t~reference_image_3d()\n\t{\n\t\tif(m_texture_name)\n\t\t\tglDeleteTextures(1, &m_texture_name);\n\t}\n\n\tvoid bitmap_changed(k3d::ihint* Hint)\n\t{\n\t\tif(m_texture_name)\n\t\t{\n\t\t\tglDeleteTextures(1, &m_texture_name);\n\t\t\tm_texture_name = 0;\n\t\t}\n\n\t\tasync_redraw(Hint);\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tdraw(State);\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\t/** \\note Selection is disabled for this plugin, so we don't interfere with\n\t\t * selection of \"normal\" geometry */\n\t}\n\n\tvoid draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::bitmap* const bitmap = m_bitmap.pipeline_value();\n\t\tif(!(bitmap && bitmap->width() && bitmap->height()))\n\t\t\treturn;\n\n\t\tconst k3d::color color = m_color.pipeline_value();\n\t\tconst double opacity = m_opacity.pipeline_value();\n\t\tconst double size = m_size.pipeline_value();\n\t\tconst aspect_ratio_type_t aspect_ratio_type = m_aspect_ratio_type.pipeline_value();\n\t\tconst double aspect_ratio = m_aspect_ratio.pipeline_value();\n\t\tconst bool draw_behind = m_draw_behind.pipeline_value();\n\n\t\tglColor4d(color.red, color.green, color.blue, opacity);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_CULL_FACE);\n\n\t\tglEnable(GL_BLEND);\n\t\tglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\n\t\tif(draw_behind)\n\t\t\tglDepthMask(GL_FALSE);\n\n\t\tif(0 == m_texture_name)\n\t\t{\n\t\t\tglGenTextures(1, &m_texture_name);\n\t\t\tglBindTexture(GL_TEXTURE_2D, m_texture_name);\n\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n\n\t\t\tk3d::gl::tex_image_2d(*bitmap);\n\t\t}\n\n\t\tif(m_texture_name)\n\t\t{\n\t\t\tglEnable(GL_TEXTURE_2D);\n\t\t\tglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);\n\t\t\tglBindTexture(GL_TEXTURE_2D, m_texture_name);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\n\t\t\tswitch(m_orientation.pipeline_value())\n\t\t\t{\n\t\t\t\tcase k3d::PX:\n\t\t\t\t\tglRotated(-90, 0, 0, 1);\n\t\t\t\t\tglRotated(-90, 1, 0, 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase k3d::NX:\n\t\t\t\t\tglRotated(90, 0, 0, 1);\n\t\t\t\t\tglRotated(-90, 1, 0, 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase k3d::PY:\n\t\t\t\t\tglRotated(-90, 1, 0, 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase k3d::NY:\n\t\t\t\t\tglRotated(180, 0, 0, 1);\n\t\t\t\t\tglRotated(-90, 1, 0, 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase k3d::PZ:\n\t\t\t\t\tbreak;\n\t\t\t\tcase k3d::NZ:\n\t\t\t\t\tglRotated(180, 1, 0, 0);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tglScaled(size, size, 1);\n\n\t\t\tswitch(aspect_ratio_type)\n\t\t\t{\n\t\t\t\tcase ASPECT_RATIO_IMAGE:\n\t\t\t\t\tglScaled(static_cast<double>(bitmap->width()) / static_cast<double>(bitmap->height()), 1, 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase ASPECT_RATIO_ABSOLUTE:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tglScaled(aspect_ratio, 1, 1);\n\n\t\t\tglBegin(GL_QUADS);\n\t\t\t\tglTexCoord2d(0, 0);\n\t\t\t\tglVertex3d(-1, -1, 0);\n\t\t\t\tglTexCoord2d(1, 0);\n\t\t\t\tglVertex3d(1, -1, 0);\n\t\t\t\tglTexCoord2d(1, 1);\n\t\t\t\tglVertex3d(1, 1, 0);\n\t\t\t\tglTexCoord2d(0, 1);\n\t\t\t\tglVertex3d(-1, 1, 0);\n\t\t\tglEnd();\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<reference_image_3d>factory(\n\t\t\tk3d::uuid(0x0f6fa200, 0xa0094bc2, 0xa05379eb, 0x948f244f),\n\t\t\t\"ReferenceImage3D\",\n\t\t\t_(\"Displays a bitmap image on a resizable plane within the viewport.\"),\n\t\t\t\"Annotation\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttypedef enum\n\t{\n\t\tASPECT_RATIO_IMAGE,\n\t\tASPECT_RATIO_ABSOLUTE,\n\t} aspect_ratio_type_t;\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& aspect_ratio_type_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Image\"), \"image\", _(\"Maintain the image aspect ratio\")));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Absolute\"), \"absolute\", _(\"Draw the image with a fixed aspect ratio, ignoring the image aspect ratio\")));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const aspect_ratio_type_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase ASPECT_RATIO_IMAGE:\n\t\t\t\tStream << \"image\";\n\t\t\t\tbreak;\n\t\t\tcase ASPECT_RATIO_ABSOLUTE:\n\t\t\t\tStream << \"absolute\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, aspect_ratio_type_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"image\")\n\t\t\tValue = ASPECT_RATIO_IMAGE;\n\t\telse if(text == \"absolute\")\n\t\t\tValue = ASPECT_RATIO_ABSOLUTE;\n\t\telse\n\t\t\tk3d::log() << k3d_file_reference << \": unknown enumeration [\" << text << \"]\"<< std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_opacity;\n\tk3d_data(k3d::bitmap*, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) m_bitmap;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_size;\n\tk3d_data(aspect_ratio_type_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_aspect_ratio_type;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_aspect_ratio;\n\tk3d_data(k3d::signed_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_orientation;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_behind;\n\n\tGLuint m_texture_name;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// reference_image_3d_factory\n\nk3d::iplugin_factory& reference_image_3d_factory()\n{\n\treturn reference_image_3d::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/bitmap/simple_modifier.h",
    "content": "#ifndef MODULES_BITMAP_SIMPLE_MODIFIER_H\n#define MODULES_BITMAP_SIMPLE_MODIFIER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/bitmap_modifier.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\nclass simple_modifier :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_modifier<simple_modifier>\n{\n\ttypedef k3d::node base;\n\npublic:\n\tsimple_modifier(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\nprivate:\n\tvirtual void on_resize_bitmap(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tOutput.recreate(Input.width(), Input.height());\n\t}\n};\n\n} // namespace bitmap\n\n} // namespace module\n\n#endif // !MODULES_BITMAP_SIMPLE_MODIFIER_H\n\n"
  },
  {
    "path": "modules/bitmap/solid.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_source.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// solid\n\nclass solid :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_source<solid>\n{\n\ttypedef k3d::node base;\n\npublic:\n\tsolid(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Bitmap width\")) + init_value(64L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Bitmap height\")) + init_value(64L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Bitmap color\")) + init_value(k3d::color(1, 1, 1)))\n\t{\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_dimensions_changed> >(make_update_bitmap_slot()));\n\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_dimensions_changed> >(make_update_bitmap_slot()));\n\n\t\tm_color.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tvoid on_resize_bitmap(k3d::bitmap& Output)\n\t{\n\t\tconst k3d::pixel_size_t width = m_width.pipeline_value();\n\t\tconst k3d::pixel_size_t height = m_height.pipeline_value();\n\t\tOutput.recreate(width, height);\n\t}\n\n\tvoid on_assign_pixels(k3d::bitmap& Output)\n\t{\n\t\tconst k3d::color color = m_color.pipeline_value();\n\t\tconst k3d::bitmap::view_t& bitmap = boost::gil::view(Output);\n\t\tstd::fill(bitmap.begin(), bitmap.end(), k3d::pixel(color.red, color.green, color.blue, 1.0));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<solid,\n\t\t\tk3d::interface_list<k3d::ibitmap_source> > factory(\n\t\t\t\tk3d::uuid(0x3e3b43f0, 0xcd21465c, 0x9c099aba, 0x8dc117d8),\n\t\t\t\t\"BitmapSolid\",\n\t\t\t\t_(\"Generates a solid-color bitmap\"),\n\t\t\t\t\"Bitmap\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// solid_factory\n\nk3d::iplugin_factory& solid_factory()\n{\n\treturn solid::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n"
  },
  {
    "path": "modules/bitmap/subtract.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include \"simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// subtract\n\nclass subtract :\n\tpublic simple_modifier\n{\n\ttypedef simple_modifier base;\n\npublic:\n\tsubtract(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_value(init_owner(*this) + init_name(\"value\") + init_label(_(\"Subtract value\")) + init_description(_(\"Subtract value to each pixel color component\")) + init_value(0.0))\n\t{\n\t\tm_value.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tstruct functor\n\t{\n\t\tfunctor(const double Value) :\n\t\t\tvalue(Value)\n\t\t{\n\t\t}\n\n\t\tk3d::pixel operator()(const k3d::pixel& Input) const\n\t\t{\n\t\t\treturn k3d::pixel(\n\t\t\t\tstd::max(0.0, boost::gil::get_color(Input, boost::gil::red_t()) - value),\n\t\t\t\tstd::max(0.0, boost::gil::get_color(Input, boost::gil::green_t()) - value),\n\t\t\t\tstd::max(0.0, boost::gil::get_color(Input, boost::gil::blue_t()) - value),\n\t\t\t\tboost::gil::get_color(Input, boost::gil::alpha_t()));\n\t\t}\n\n\t\tconst double value;\n\t};\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tboost::gil::transform_pixels(const_view(Input), view(Output), functor(m_value.pipeline_value()));\n\t}\n\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<subtract,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0x51c8f52f, 0x53834926, 0x865e3592, 0xf0d09510),\n\t\t\t\t\"BitmapSubtract\",\n\t\t\t\t_(\"Subtract value from each pixel\"),\n\t\t\t\t\"Bitmap\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_value;\n\tdouble m_value_cache;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// subtract_factory\n\nk3d::iplugin_factory& subtract_factory()\n{\n\treturn subtract::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/bitmap/threshold.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include \"simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace bitmap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// threshold\n\nclass threshold :\n\tpublic simple_modifier\n{\n\ttypedef simple_modifier base;\n\npublic:\n\tthreshold(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_red_threshold(init_owner(*this) + init_name(\"red_threshold\") + init_label(_(\"Red threshold\")) + init_description(_(\"Clamp Red channel to threshold\")) + init_value(0.0)),\n\t\tm_green_threshold(init_owner(*this) + init_name(\"green_threshold\") + init_label(_(\"Green threshold\")) + init_description(_(\"Clamp Green channel to threshold\")) + init_value(0.0)),\n\t\tm_blue_threshold(init_owner(*this) + init_name(\"blue_threshold\") + init_label(_(\"Blue threshold\")) + init_description(_(\"Clamp Blue channel to threshold\")) + init_value(0.0)),\n\t\tm_alpha_threshold(init_owner(*this) + init_name(\"alpha_threshold\") + init_label(_(\"Alpha threshold\")) + init_description(_(\"Clamp Alpha channel to threshold\")) + init_value(0.0))\n\t{\n\t\tm_red_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t\tm_green_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t\tm_blue_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t\tm_alpha_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tstruct functor\n\t{\n\t\tfunctor(const double RedThreshold, const double GreenThreshold, const double BlueThreshold, const double AlphaThreshold) :\n\t\t\tred_threshold(RedThreshold),\n\t\t\tgreen_threshold(GreenThreshold),\n\t\t\tblue_threshold(BlueThreshold),\n\t\t\talpha_threshold(AlphaThreshold)\n\t\t{\n\t\t}\n\n\t\tk3d::pixel operator()(const k3d::pixel& Input) const\n\t\t{\n\n\t\t\treturn k3d::pixel(\n\t\t\t\tstd::max(red_threshold, static_cast<double>(boost::gil::get_color(Input, boost::gil::red_t()))),\n\t\t\t\tstd::max(green_threshold, static_cast<double>(boost::gil::get_color(Input, boost::gil::green_t()))),\n\t\t\t\tstd::max(blue_threshold, static_cast<double>(boost::gil::get_color(Input, boost::gil::blue_t()))),\n\t\t\t\tstd::max(alpha_threshold, static_cast<double>(boost::gil::get_color(Input, boost::gil::alpha_t()))));\n\t\t}\n\n\t\tconst double red_threshold;\n\t\tconst double green_threshold;\n\t\tconst double blue_threshold;\n\t\tconst double alpha_threshold;\n\t};\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tboost::gil::transform_pixels(const_view(Input), view(Output), functor(m_red_threshold.pipeline_value(), m_green_threshold.pipeline_value(), m_blue_threshold.pipeline_value(), m_alpha_threshold.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<threshold,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0xcc8d625b, 0x970d4293, 0xa304d906, 0x81201d28),\n\t\t\t\t\"BitmapThreshold\",\n\t\t\t\t_(\"Cut off chanels at a certain value\"),\n\t\t\t\t\"Bitmap\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_red_threshold;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_green_threshold;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_blue_threshold;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_alpha_threshold;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// threshold_factory\n\nk3d::iplugin_factory& threshold_factory()\n{\n\treturn threshold::get_factory();\n}\n\n} // namespace bitmap\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-blobby)\nK3D_CREATE_MODULE_PROXY(k3d-blobby)\n\n"
  },
  {
    "path": "modules/blobby/add.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// add\n\nclass add :\n\tpublic k3d::imulti_mesh_sink,\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tadd(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_user_property_changed_signal(*this)\n\t{\n\t\tm_user_property_changed_signal.connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\t\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\t// Get the set of input meshes ...\n\t\tdetail::mesh_collection meshes;\n\n\t\tconst k3d::iproperty_collection::properties_t properties = k3d::property::user_properties(*static_cast<k3d::iproperty_collection*>(this));\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t\t{\n\t\t\tk3d::iproperty& property = **prop;\n\t\t\tif(property.property_type() == typeid(k3d::mesh*))\n\t\t\t{\n\t\t\t\tif(const k3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(k3d::property::pipeline_value(property)))\n\t\t\t\t\tmeshes.push_back(mesh);\n\t\t\t}\n\t\t}\n\n\t\t// Merge 'em ...\n\t\tdetail::merge(meshes, m_material.pipeline_value(), k3d::blobby::ADD, true, Output);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<add, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imulti_mesh_sink> > > factory(\n\t\t\tk3d::uuid(0xf075d161, 0x2b42365f, 0x5eeb458b, 0x67c2a928),\n\t\t\t\"BlobbyAdd\",\n\t\t\t_(\"Combines blobbies using the Addition operator.\"),\n\t\t\t\"Blobby\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// add_factory\n\nk3d::iplugin_factory& add_factory()\n{\n\treturn add::get_factory();\n}\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/detail.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\nnamespace detail\n{\n\nvoid merge(const mesh_collection& Inputs, k3d::imaterial* const Material, const k3d::blobby::operator_type Operator, const k3d::bool_t VariableArguments, k3d::mesh& Output)\n{\n\t// Collect all of the parameter and vertex arrays to be merged ...\n\tk3d::mesh::table_t::table_collection source_parameter_attributes;\n\tk3d::mesh::table_t::table_collection source_vertex_attributes;\n\tfor(mesh_collection::const_iterator mesh = Inputs.begin(); mesh != Inputs.end(); ++mesh)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = (*mesh)->primitives.begin(); primitive != (*mesh)->primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::blobby::const_primitive> source_blobby(k3d::blobby::validate(**mesh, **primitive));\n\t\t\tif(!source_blobby)\n\t\t\t\tcontinue;\n\n\t\t\tsource_parameter_attributes.push_back(&source_blobby->parameter_attributes);\n\t\t\tsource_vertex_attributes.push_back(&source_blobby->vertex_attributes);\n\t\t}\n\t}\n\n\t// Setup the initial state of the output mesh ...\n\tboost::scoped_ptr<k3d::blobby::primitive> target_blobby(k3d::blobby::create(Output));\n\n\ttarget_blobby->parameter_attributes = k3d::table::clone_types(source_parameter_attributes);\n\ttarget_blobby->vertex_attributes = k3d::table::clone_types(source_vertex_attributes);\n\n\ttarget_blobby->first_primitives.push_back(0);\n\ttarget_blobby->primitive_counts.push_back(0);\n\ttarget_blobby->first_operators.push_back(0);\n\ttarget_blobby->operator_counts.push_back(0);\n\ttarget_blobby->materials.push_back(Material);\n\n\tk3d::mesh::indices_t blobby_roots;\n\n\t// Iterate over each input mesh ...\n\tfor(mesh_collection::const_iterator mesh = Inputs.begin(); mesh != Inputs.end(); ++mesh)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = (*mesh)->primitives.begin(); primitive != (*mesh)->primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::blobby::const_primitive> source_blobby(k3d::blobby::validate(**mesh, **primitive));\n\t\t\tif(!source_blobby)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::table_copier parameter_copier(source_blobby->parameter_attributes, target_blobby->parameter_attributes, k3d::table_copier::copy_subset());\n\t\t\tk3d::table_copier vertex_copier(source_blobby->vertex_attributes, target_blobby->vertex_attributes, k3d::table_copier::copy_subset());\n\n\t\t\tconst k3d::uint_t blobby_begin = 0;\n\t\t\tconst k3d::uint_t blobby_end = blobby_begin + source_blobby->first_primitives.size();\n\t\t\tfor(k3d::uint_t blobby = blobby_begin; blobby != blobby_end; ++blobby)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t operand_offset = target_blobby->primitive_counts[0] + target_blobby->operator_counts[0];\n\n\t\t\t\tconst k3d::uint_t source_primitive_count = source_blobby->primitive_counts[blobby];\n\t\t\t\tconst k3d::uint_t source_primitives_begin = source_blobby->first_primitives[blobby];\n\t\t\t\tconst k3d::uint_t source_primitives_end = source_primitives_begin + source_primitive_count;\n\t\t\t\tfor(k3d::uint_t source_primitive = source_primitives_begin; source_primitive != source_primitives_end; ++source_primitive)\n\t\t\t\t{\n\t\t\t\t\ttarget_blobby->primitives.push_back(source_blobby->primitives[source_primitive]);\n\t\t\t\t\ttarget_blobby->primitive_first_floats.push_back(target_blobby->floats.size());\n\t\t\t\t\ttarget_blobby->primitive_float_counts.push_back(source_blobby->primitive_float_counts[source_primitive]);\n\t\t\t\t\tparameter_copier.push_back(source_primitive);\n\t\t\t\t\tvertex_copier.push_back(source_primitive);\n\n\t\t\t\t\tconst k3d::uint_t source_floats_begin = source_blobby->primitive_first_floats[source_primitive];\n\t\t\t\t\tconst k3d::uint_t source_floats_end = source_floats_begin + source_blobby->primitive_float_counts[source_primitive];\n\t\t\t\t\tfor(k3d::uint_t source_float = source_floats_begin; source_float != source_floats_end; ++source_float)\n\t\t\t\t\t\ttarget_blobby->floats.push_back(source_blobby->floats[source_float]);\n\t\t\t\t}\n\t\t\t\ttarget_blobby->primitive_counts[0] += source_primitive_count;\n\n\t\t\t\tconst k3d::uint_t source_operator_count = source_blobby->operator_counts[blobby];\n\t\t\t\tconst k3d::uint_t source_operators_begin = source_blobby->first_operators[blobby];\n\t\t\t\tconst k3d::uint_t source_operators_end = source_operators_begin + source_operator_count;\n\t\t\t\tfor(k3d::uint_t source_operator = source_operators_begin; source_operator != source_operators_end; ++source_operator)\n\t\t\t\t{\n\t\t\t\t\ttarget_blobby->operators.push_back(source_blobby->operators[source_operator]);\n\t\t\t\t\ttarget_blobby->operator_first_operands.push_back(target_blobby->operands.size());\n\t\t\t\t\ttarget_blobby->operator_operand_counts.push_back(source_blobby->operator_operand_counts[source_operator]);\n\n\t\t\t\t\tconst k3d::uint_t source_operands_begin = source_blobby->operator_first_operands[source_operator];\n\t\t\t\t\tconst k3d::uint_t source_operands_end = source_operands_begin + source_blobby->operator_operand_counts[source_operator];\n\t\t\t\t\tfor(k3d::uint_t source_operand = source_operands_begin; source_operand != source_operands_end; ++source_operand)\n\t\t\t\t\t\ttarget_blobby->operands.push_back(source_blobby->operands[source_operand] + operand_offset);\n\t\t\t\t}\n\t\t\t\ttarget_blobby->operator_counts[0] += source_operator_count;\n\n\t\t\t\tif(source_primitive_count || source_operator_count)\n\t\t\t\t\tblobby_roots.push_back(target_blobby->primitive_counts[0] + target_blobby->operator_counts[0] - 1);\n\t\t\t}\n\t\t}\n\t}\t\n\n\tif(!blobby_roots.empty())\n\t{\n\t\ttarget_blobby->operator_counts[0] += 1;\n\t\ttarget_blobby->operators.push_back(Operator);\n\t\ttarget_blobby->operator_first_operands.push_back(target_blobby->operands.size());\n\n\t\tif(VariableArguments)\n\t\t{\n\t\t\ttarget_blobby->operator_operand_counts.push_back(blobby_roots.size() + 1);\n\t\t\ttarget_blobby->operands.push_back(blobby_roots.size());\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttarget_blobby->operator_operand_counts.push_back(blobby_roots.size());\n\t\t}\n\n\t\ttarget_blobby->operands.insert(target_blobby->operands.end(), blobby_roots.begin(), blobby_roots.end());\n\t}\n}\n\n} // namespace detail\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/detail.h",
    "content": "#ifndef MODULES_BLOBBY_DETAIL_H\n#define MODULES_BLOBBY_DETAIL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/blobby.h>\n#include <vector>\n\nnamespace k3d { class mesh; }\n\nnamespace module\n{\n\nnamespace blobby\n{\n\nnamespace detail\n{\n\ntypedef std::vector<const k3d::mesh*> mesh_collection;\n\nvoid merge(const mesh_collection& Inputs, k3d::imaterial* const Material, const k3d::blobby::operator_type Operator, const k3d::bool_t VariableArguments, k3d::mesh& Output);\n\n} // namespace detail\n\n} // namespace blobby\n\n} // namespace module\n\n#endif // !MODULES_BLOBBY_DETAIL_H\n\n"
  },
  {
    "path": "modules/blobby/divide.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// divide\n\nclass divide :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tdivide(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input_a(init_owner(*this) + init_name(\"input_a\") + init_label(_(\"Input A\")) + init_description(_(\"First input mesh.\")) + init_value<k3d::mesh*>(0)),\n\t\tm_input_b(init_owner(*this) + init_name(\"input_b\") + init_label(_(\"Input B\")) + init_description(_(\"Second input mesh.\")) + init_value<k3d::mesh*>(0))\n\t{\n\t\tm_input_a.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\n\t\tm_input_b.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\t\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\t// Get the set of input meshes ...\n\t\tdetail::mesh_collection meshes;\n\n\t\tk3d::mesh* const input_a = m_input_a.pipeline_value();\n\t\tk3d::mesh* const input_b = m_input_b.pipeline_value();\n\n\t\tif(input_a)\n\t\t\tmeshes.push_back(input_a);\n\n\t\tif(input_b)\n\t\t\tmeshes.push_back(input_b);\n\n\t\t// Merge 'em ...\n\t\tdetail::merge(meshes, m_material.pipeline_value(), k3d::blobby::DIVIDE, false, Output);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<divide, k3d::interface_list<k3d::imesh_source> > factory(\n\t\t\tk3d::uuid(0x19533129, 0x6b45e7ea, 0x4a120cb8, 0x06cf305a),\n\t\t\t\"BlobbyDivide\",\n\t\t\t_(\"Combines blobbies using the Division operator.\"),\n\t\t\t\"Blobby\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::mesh*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::read_only_property, k3d::data::no_serialization) m_input_a;\n\tk3d_data(k3d::mesh*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::read_only_property, k3d::data::no_serialization) m_input_b;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// divide_factory\n\nk3d::iplugin_factory& divide_factory()\n{\n\treturn divide::get_factory();\n}\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/edges_to_blobby.cpp",
    "content": "// K-3D\n// Copyright (c) 2004-2005, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/blobby.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iterator>\n#include <set>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// edges_to_blobby\n\nclass edges_to_blobby :\n\tpublic k3d::material_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tedges_to_blobby(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Controls the radius of each blobby segment.\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_type(init_owner(*this) + init_name(\"type\") + init_label(_(\"Operator\")) + init_description(_(\"Specify the mathematical operator to merge segments: addition, multiplication, minimum or maximum.\")) + init_enumeration(operation_values()) + init_value(MAX))\n\t{\n\t\tm_material.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_radius.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_type.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{\n      boost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Input, **primitive));\n      if(!polyhedron)\n        continue;\n\n      const k3d::double_t radius = m_radius.pipeline_value();\n      const operation_t type = m_type.pipeline_value();\n      k3d::imaterial* const material = m_material.pipeline_value();\n\n      // Build a list of edges, eliminating duplicates (neighbors) as we go ...\n      const k3d::mesh::points_t& points = *Input.points;\n\n      typedef std::set<std::pair<k3d::uint_t, k3d::uint_t> > edges_t;\n      edges_t edges;\n\n      const k3d::uint_t edge_begin = 0;\n      const k3d::uint_t edge_end = edge_begin + polyhedron->clockwise_edges.size();\n      for(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n      {\n        edges.insert(std::make_pair(\n          std::min(polyhedron->vertex_points[edge], polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]),\n          std::max(polyhedron->vertex_points[edge], polyhedron->vertex_points[polyhedron->clockwise_edges[edge]])));\n      }\n\n      // Setup arrays to build a new blobby ...\n      boost::scoped_ptr<k3d::blobby::primitive> blobby(k3d::blobby::create(Output));\n\n      blobby->first_primitives.push_back(blobby->primitives.size());\n      blobby->primitive_counts.push_back(edges.size());\n      blobby->first_operators.push_back(blobby->operators.size());\n      blobby->operator_counts.push_back(1);\n      blobby->materials.push_back(material);\n\n      // Add a blobby segment for each edge ...\n      for(edges_t::const_iterator edge = edges.begin(); edge != edges.end(); ++edge)\n      {\n        blobby->primitives.push_back(k3d::blobby::SEGMENT);\n        blobby->primitive_first_floats.push_back(blobby->floats.size());\n        blobby->primitive_float_counts.push_back(23);\n\n        blobby->floats.push_back(points[edge->first][0]);\n        blobby->floats.push_back(points[edge->first][1]);\n        blobby->floats.push_back(points[edge->first][2]);\n        blobby->floats.push_back(points[edge->second][0]);\n        blobby->floats.push_back(points[edge->second][1]);\n        blobby->floats.push_back(points[edge->second][2]);\n        blobby->floats.push_back(radius);\n\n        k3d::matrix4 matrix = k3d::transpose(k3d::identity3());\n        blobby->floats.insert(blobby->floats.end(), static_cast<double*>(matrix), static_cast<double*>(matrix) + 16);\n      }\n\n      // Merge the edges together ...\n      switch(type)\n      {\n        case ADD:\n          blobby->operators.push_back(k3d::blobby::ADD);\n          break;\n        case MULT:\n          blobby->operators.push_back(k3d::blobby::MULTIPLY);\n          break;\n        case MIN:\n          blobby->operators.push_back(k3d::blobby::MINIMUM);\n          break;\n        case MAX:\n          blobby->operators.push_back(k3d::blobby::MAXIMUM);\n          break;\n      }\n      blobby->operator_first_operands.push_back(blobby->operands.size());\n      blobby->operator_operand_counts.push_back(edges.size() + 1);\n      blobby->operands.push_back(edges.size());\n      for(k3d::uint_t i = 0; i != edges.size(); ++i)\n        blobby->operands.push_back(i);\n    }\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<edges_to_blobby,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0xc6a00316, 0x72a54b1a, 0xb9ac478e, 0x00fdfc6c),\n\t\t\t\t\"EdgesToBlobby\",\n\t\t\t\t\"Converts input edges to segment blobbies\",\n\t\t\t\t\"Blobby\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttypedef enum\n\t{\n\t\tADD,\n\t\tMULT,\n\t\tMIN,\n\t\tMAX\n\t} operation_t;\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const operation_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase ADD:\n\t\t\t\tStream << \"addition\";\n\t\t\t\tbreak;\n\t\t\tcase MULT:\n\t\t\t\tStream << \"multiplication\";\n\t\t\t\tbreak;\n\t\t\tcase MIN:\n\t\t\t\tStream << \"minimum\";\n\t\t\t\tbreak;\n\t\t\tcase MAX:\n\t\t\t\tStream << \"maximum\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator >> (std::istream& Stream, operation_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"addition\")\n\t\t\tValue = ADD;\n\t\telse if(text == \"multiplication\")\n\t\t\tValue = MULT;\n\t\telse if(text == \"minimum\")\n\t\t\tValue = MIN;\n\t\telse if(text == \"maximum\")\n\t\t\tValue = MAX;\n\t\telse\n\t\t\tk3d::log() << k3d_file_reference << \": unknown enumeration [\" << text << \"]\"<< std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& operation_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Addition\", \"addition\", \"Combine blobby segments with BlobbyAdd\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Multiplication\", \"multiplication\", \"Combine blobby segments with BlobbyMult\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Minimum\", \"minimum\", \"Combine blobby segments with BlobbyMin\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Maximum\", \"maximum\", \"Combine blobby segments with BlobbyMax\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(operation_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_type;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// edges_to_blobby_factory\n\nk3d::iplugin_factory& edges_to_blobby_factory()\n{\n\treturn edges_to_blobby::get_factory();\n}\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/ellipsoid.cpp",
    "content": "// K-3D\n// Copyright (c) 2004-2005, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/blobby.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// ellipsoid\n\nclass ellipsoid :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node> > base;\n\npublic:\n\tellipsoid(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_x(init_owner(*this) + init_name(\"x\") + init_label(_(\"X Position\")) + init_description(_(\"Position on X axis\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_y(init_owner(*this) + init_name(\"y\") + init_label(_(\"Y Position\")) + init_description(_(\"Position on Y axis\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z(init_owner(*this) + init_name(\"z\") + init_label(_(\"Z Position\")) + init_description(_(\"Position on Z axis\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_size_x(init_owner(*this) + init_name(\"size_x\") + init_label(_(\"X Size\")) + init_description(_(\"Size on X axis\")) + init_value(1.0) + init_step_increment(0.1) + init_constraint(constraint::minimum<double>(0.1)) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_size_y(init_owner(*this) + init_name(\"size_y\") + init_label(_(\"Y Size\")) + init_description(_(\"Size on Y axis\")) + init_value(1.0) + init_step_increment(0.1) + init_constraint(constraint::minimum<double>(0.1)) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_size_z(init_owner(*this) + init_name(\"size_z\") + init_label(_(\"Z Size\")) + init_description(_(\"Size on Z axis\")) + init_value(1.0) + init_step_increment(0.1) + init_constraint(constraint::minimum<double>(0.1)) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Ellipsoid color\")) + init_value(k3d::color(1, 1, 1)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_x.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_y.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_z.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_size_x.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_size_y.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_size_z.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_color.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst double x = m_x.pipeline_value();\n\t\tconst double y = m_y.pipeline_value();\n\t\tconst double z = m_z.pipeline_value();\n\t\tconst double size_x = m_size_x.pipeline_value();\n\t\tconst double size_y = m_size_y.pipeline_value();\n\t\tconst double size_z = m_size_z.pipeline_value();\n\t\tconst k3d::color color = m_color.pipeline_value();\n\n\t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::blobby::primitive> blobby(k3d::blobby::create(Output));\n\t\tk3d::typed_array<k3d::color>& parameter_colors = blobby->parameter_attributes.create<k3d::typed_array<k3d::color> >(\"Cs\");\n\n\t\tblobby->first_primitives.push_back(blobby->primitives.size());\n\t\tblobby->primitive_counts.push_back(1);\n\t\tblobby->first_operators.push_back(blobby->operators.size());\n\t\tblobby->operator_counts.push_back(0);\n\t\tblobby->materials.push_back(material);\n\n\t\tblobby->primitives.push_back(k3d::blobby::ELLIPSOID);\n\t\tblobby->primitive_first_floats.push_back(blobby->floats.size());\n\t\tblobby->primitive_float_counts.push_back(16);\n\n\t\tk3d::matrix4 matrix = k3d::transpose(k3d::translate3(x, y, z) * k3d::scale3(size_x, size_y, size_z));\n\t\tblobby->floats.insert(blobby->floats.end(), static_cast<double*>(matrix), static_cast<double*>(matrix) + 16);\n\n\t\tparameter_colors.push_back(color);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<ellipsoid > factory(\n\t\t\tk3d::uuid(0x76ba2f7c, 0xd49945e2, 0xa54d32b0, 0x0f756a94),\n\t\t\t\"BlobbyEllipsoid\",\n\t\t\t\"Creates a RenderMan Blobby Ellipsoid\",\n\t\t\t\"Blobby\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_size_x;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_size_y;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_size_z;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n};\n\nk3d::iplugin_factory& ellipsoid_factory()\n{\n\treturn ellipsoid::get_factory();\n}\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/maximum.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// maximum\n\nclass maximum :\n\tpublic k3d::imulti_mesh_sink,\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tmaximum(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_user_property_changed_signal(*this)\n\t{\n\t\tm_user_property_changed_signal.connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\t\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\t// Get the set of input meshes ...\n\t\tdetail::mesh_collection meshes;\n\n\t\tconst k3d::iproperty_collection::properties_t properties = k3d::property::user_properties(*static_cast<k3d::iproperty_collection*>(this));\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t\t{\n\t\t\tk3d::iproperty& property = **prop;\n\t\t\tif(property.property_type() == typeid(k3d::mesh*))\n\t\t\t{\n\t\t\t\tif(const k3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(k3d::property::pipeline_value(property)))\n\t\t\t\t\tmeshes.push_back(mesh);\n\t\t\t}\n\t\t}\n\n\t\t// Merge 'em ...\n\t\tdetail::merge(meshes, m_material.pipeline_value(), k3d::blobby::MAXIMUM, true, Output);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<maximum, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imulti_mesh_sink> > > factory(\n\t\t\tk3d::uuid(0x196b28f1, 0xde4d1b2e, 0x0350a5b7, 0x493514e8),\n\t\t\t\"BlobbyMaximum\",\n\t\t\t_(\"Combines blobbies using the Maximum operator.\"),\n\t\t\t\"Blobby\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// maximum_factory\n\nk3d::iplugin_factory& maximum_factory()\n{\n\treturn maximum::get_factory();\n}\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/minimum.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// minimum\n\nclass minimum :\n\tpublic k3d::imulti_mesh_sink,\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tminimum(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_user_property_changed_signal(*this)\n\t{\n\t\tm_user_property_changed_signal.connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\t\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\t// Get the set of input meshes ...\n\t\tdetail::mesh_collection meshes;\n\n\t\tconst k3d::iproperty_collection::properties_t properties = k3d::property::user_properties(*static_cast<k3d::iproperty_collection*>(this));\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t\t{\n\t\t\tk3d::iproperty& property = **prop;\n\t\t\tif(property.property_type() == typeid(k3d::mesh*))\n\t\t\t{\n\t\t\t\tif(const k3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(k3d::property::pipeline_value(property)))\n\t\t\t\t\tmeshes.push_back(mesh);\n\t\t\t}\n\t\t}\n\n\t\t// Merge 'em ...\n\t\tdetail::merge(meshes, m_material.pipeline_value(), k3d::blobby::MINIMUM, true, Output);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<minimum, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imulti_mesh_sink> > > factory(\n\t\t\tk3d::uuid(0x4e995200, 0x7d4e22bc, 0x11bdea87, 0x20d69ba3),\n\t\t\t\"BlobbyMinimum\",\n\t\t\t_(\"Combines blobbies using the Minimum operator.\"),\n\t\t\t\"Blobby\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// minimum_factory\n\nk3d::iplugin_factory& minimum_factory()\n{\n\treturn minimum::get_factory();\n}\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\nextern k3d::iplugin_factory& add_factory();\nextern k3d::iplugin_factory& divide_factory();\nextern k3d::iplugin_factory& edges_to_blobby_factory();\nextern k3d::iplugin_factory& ellipsoid_factory();\nextern k3d::iplugin_factory& maximum_factory();\nextern k3d::iplugin_factory& minimum_factory();\nextern k3d::iplugin_factory& multiply_factory();\nextern k3d::iplugin_factory& negate_factory();\nextern k3d::iplugin_factory& points_to_blobby_factory();\nextern k3d::iplugin_factory& segment_factory();\nextern k3d::iplugin_factory& subtract_factory();\n\n} // namespace blobby\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::blobby::add_factory());\n\tRegistry.register_factory(module::blobby::divide_factory());\n\tRegistry.register_factory(module::blobby::edges_to_blobby_factory());\n\tRegistry.register_factory(module::blobby::ellipsoid_factory());\n\tRegistry.register_factory(module::blobby::maximum_factory());\n\tRegistry.register_factory(module::blobby::minimum_factory());\n\tRegistry.register_factory(module::blobby::multiply_factory());\n\tRegistry.register_factory(module::blobby::negate_factory());\n\tRegistry.register_factory(module::blobby::points_to_blobby_factory());\n\tRegistry.register_factory(module::blobby::segment_factory());\n\tRegistry.register_factory(module::blobby::subtract_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/blobby/multiply.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// multiply\n\nclass multiply :\n\tpublic k3d::imulti_mesh_sink,\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tmultiply(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_user_property_changed_signal(*this)\n\t{\n\t\tm_user_property_changed_signal.connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\t\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\t// Get the set of input meshes ...\n\t\tdetail::mesh_collection meshes;\n\n\t\tconst k3d::iproperty_collection::properties_t properties = k3d::property::user_properties(*static_cast<k3d::iproperty_collection*>(this));\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t\t{\n\t\t\tk3d::iproperty& property = **prop;\n\t\t\tif(property.property_type() == typeid(k3d::mesh*))\n\t\t\t{\n\t\t\t\tif(const k3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(k3d::property::pipeline_value(property)))\n\t\t\t\t\tmeshes.push_back(mesh);\n\t\t\t}\n\t\t}\n\n\t\t// Merge 'em ...\n\t\tdetail::merge(meshes, m_material.pipeline_value(), k3d::blobby::MULTIPLY, true, Output);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<multiply, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imulti_mesh_sink> > > factory(\n\t\t\tk3d::uuid(0xbbe264dc, 0x524e47a5, 0x9e3d04bb, 0x72ecec5a),\n\t\t\t\"BlobbyMultiply\",\n\t\t\t_(\"Combines blobbies using the Multiplication operator.\"),\n\t\t\t\"Blobby\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// multiply_factory\n\nk3d::iplugin_factory& multiply_factory()\n{\n\treturn multiply::get_factory();\n}\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/negate.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// negate\n\nclass negate :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tnegate(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input_a(init_owner(*this) + init_name(\"input_mesh\") + init_label(_(\"Input Mesh\")) + init_description(_(\"Input mesh.\")) + init_value<k3d::mesh*>(0))\n\t{\n\t\tm_input_a.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\t\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\t// Get the set of input meshes ...\n\t\tdetail::mesh_collection meshes;\n\t\tif(k3d::mesh* const input_a = m_input_a.pipeline_value())\n\t\t\tmeshes.push_back(input_a);\n\n\t\t// Merge 'em ...\n\t\tdetail::merge(meshes, m_material.pipeline_value(), k3d::blobby::NEGATE, false, Output);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<negate, k3d::interface_list<k3d::imesh_source> > factory(\n\t\t\tk3d::uuid(0xfdf62f9c, 0xeb44de65, 0x25345692, 0xdef8aa28),\n\t\t\t\"BlobbyNegate\",\n\t\t\t_(\"Combines blobbies using the Negation operator.\"),\n\t\t\t\"Blobby\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::mesh*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::read_only_property, k3d::data::no_serialization) m_input_a;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// negate_factory\n\nk3d::iplugin_factory& negate_factory()\n{\n\treturn negate::get_factory();\n}\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/points_to_blobby.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/blobby.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// points_to_blobby\n\nclass points_to_blobby :\n\tpublic k3d::material_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tpoints_to_blobby(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Points radius\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_material.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_radius.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tif(!Input.points)\n\t\t\treturn;\n\n\t\tconst k3d::mesh::points_t& input_points = *Input.points;\n\t\tconst k3d::mesh::table_t& input_point_attributes = Input.point_attributes;\n\n\t\tboost::scoped_ptr<k3d::blobby::primitive> blobby(k3d::blobby::create(Output));\n\n\t\tblobby->vertex_attributes = input_point_attributes.clone_types();\n\t\tk3d::table_copier point_attributes_copier(input_point_attributes, blobby->vertex_attributes);\n\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\n\t\tblobby->first_primitives.push_back(blobby->primitives.size());\n\t\tblobby->primitive_counts.push_back(input_points.size());\n\t\tblobby->first_operators.push_back(blobby->operators.size());\n\t\tblobby->operator_counts.push_back(1);\n\t\tblobby->materials.push_back(material);\n\n\t\tconst k3d::uint_t points_begin = 0;\n\t\tconst k3d::uint_t points_end = points_begin + input_points.size();\n\t\tfor(k3d::uint_t point = points_begin; point != points_end; ++point)\n\t\t{\n\t\t\tblobby->primitives.push_back(k3d::blobby::ELLIPSOID);\n\t\t\tblobby->primitive_first_floats.push_back(blobby->floats.size());\n\t\t\tblobby->primitive_float_counts.push_back(16);\n\t\t\tpoint_attributes_copier.push_back(point);\n\n\t\t\tk3d::matrix4 matrix = k3d::transpose(k3d::translate3(k3d::to_vector(input_points[point])) * k3d::scale3(radius, radius, radius));\n\t\t\tblobby->floats.insert(blobby->floats.end(), static_cast<double*>(matrix), static_cast<double*>(matrix) + 16);\n\t\t}\n\n\t\tblobby->operators.push_back(k3d::blobby::ADD);\n\t\tblobby->operator_first_operands.push_back(blobby->operands.size());\n\t\tblobby->operator_operand_counts.push_back(input_points.size() + 1);\n\t\tblobby->operands.push_back(input_points.size());\n\t\tfor(k3d::uint_t i = 0; i != input_points.size(); ++i)\n\t\t\tblobby->operands.push_back(i);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<points_to_blobby,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x9d5d69d9, 0xfe994aa0, 0x9b7dee22, 0x1823bd2c),\n\t\t\t\t\"PointsToBlobby\",\n\t\t\t\t\"Converts input points to an implicit surface composed of blobby ellipsoids\",\n\t\t\t\t\"Blobby\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// points_to_blobby_factory\n\nk3d::iplugin_factory& points_to_blobby_factory()\n{\n\treturn points_to_blobby::get_factory();\n}\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/segment.cpp",
    "content": "// K-3D\n// Copyright (c) 2004-2005, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/blobby.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// segment\n\nclass segment :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node> > base;\n\npublic:\n\tsegment(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Segment radius\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_x1(init_owner(*this) + init_name(\"x1\") + init_label(_(\"X1 Position\")) + init_description(_(\"First segment end X position\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_y1(init_owner(*this) + init_name(\"y1\") + init_label(_(\"Y1 Position\")) + init_description(_(\"First segment end Y position\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z1(init_owner(*this) + init_name(\"z1\") + init_label(_(\"Z1 Position\")) + init_description(_(\"First segment end Z position\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_x2(init_owner(*this) + init_name(\"x2\") + init_label(_(\"X2 Position\")) + init_description(_(\"Second segment end X position\")) + init_value(3.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_y2(init_owner(*this) + init_name(\"y2\") + init_label(_(\"Y2 Position\")) + init_description(_(\"Second segment end Y position\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z2(init_owner(*this) + init_name(\"z2\") + init_label(_(\"Z2 Position\")) + init_description(_(\"Second segment end Z position\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Segment color\")) + init_value(k3d::color(1, 1, 1)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_x1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_y1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_z1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_x2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_y2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_z2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_color.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst double radius = m_radius.pipeline_value();\n\t\tconst double x1 = m_x1.pipeline_value();\n\t\tconst double y1 = m_y1.pipeline_value();\n\t\tconst double z1 = m_z1.pipeline_value();\n\t\tconst double x2 = m_x2.pipeline_value();\n\t\tconst double y2 = m_y2.pipeline_value();\n\t\tconst double z2 = m_z2.pipeline_value();\n\t\tconst k3d::color color = m_color.pipeline_value();\n\n\t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::blobby::primitive> blobby(k3d::blobby::create(Output));\n\t\tk3d::typed_array<k3d::color>& parameter_colors = blobby->parameter_attributes.create<k3d::typed_array<k3d::color> >(\"Cs\");\n\n\t\tblobby->first_primitives.push_back(blobby->primitives.size());\n\t\tblobby->primitive_counts.push_back(1);\n\t\tblobby->first_operators.push_back(blobby->operators.size());\n\t\tblobby->operator_counts.push_back(0);\n\t\tblobby->materials.push_back(material);\n\n\t\tblobby->primitives.push_back(k3d::blobby::SEGMENT);\n\t\tblobby->primitive_first_floats.push_back(blobby->floats.size());\n\t\tblobby->primitive_float_counts.push_back(23);\n\n\t\tblobby->floats.push_back(x1);\n\t\tblobby->floats.push_back(y1);\n\t\tblobby->floats.push_back(z1);\n\t\tblobby->floats.push_back(x2);\n\t\tblobby->floats.push_back(y2);\n\t\tblobby->floats.push_back(z2);\n\t\tblobby->floats.push_back(radius);\n\n\t\tk3d::matrix4 matrix = k3d::transpose(k3d::identity3());\n\t\tblobby->floats.insert(blobby->floats.end(), static_cast<double*>(matrix), static_cast<double*>(matrix) + 16);\n\n\t\tparameter_colors.push_back(color);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<segment > factory(\n\t\t\tk3d::uuid(0x975d22ad, 0xe55e41a5, 0x9fdb26d2, 0x529952e0),\n\t\t\t\"BlobbySegment\",\n\t\t\t\"Creates a blobby containing a single segment primitive\",\n\t\t\t\"Blobby\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x1;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y1;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z1;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x2;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y2;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z2;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n};\n\nk3d::iplugin_factory& segment_factory()\n{\n\treturn segment::get_factory();\n}\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/blobby/subtract.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"detail.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\nnamespace module\n{\n\nnamespace blobby\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// subtract\n\nclass subtract :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tsubtract(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input_a(init_owner(*this) + init_name(\"input_a\") + init_label(_(\"Input A\")) + init_description(_(\"First input mesh.\")) + init_value<k3d::mesh*>(0)),\n\t\tm_input_b(init_owner(*this) + init_name(\"input_b\") + init_label(_(\"Input B\")) + init_description(_(\"Second input mesh.\")) + init_value<k3d::mesh*>(0))\n\t{\n\t\tm_input_a.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_input_b.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\t\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\t// Get the set of input meshes ...\n\t\tdetail::mesh_collection meshes;\n\n\t\tif(k3d::mesh* const input_a = m_input_a.pipeline_value())\n\t\t\tmeshes.push_back(input_a);\n\n\t\tif(k3d::mesh* const input_b = m_input_b.pipeline_value())\n\t\t\tmeshes.push_back(input_b);\n\n\t\t// Merge 'em ...\n\t\tdetail::merge(meshes, m_material.pipeline_value(), k3d::blobby::SUBTRACT, false, Output);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<subtract, k3d::interface_list<k3d::imesh_source> > factory(\n\t\t\tk3d::uuid(0x43df044b, 0xa24f6cf6, 0x442bfc83, 0x44c3592e),\n\t\t\t\"BlobbySubtract\",\n\t\t\t_(\"Combines blobbies using the Subtraction operator.\"),\n\t\t\t\"Blobby\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::mesh*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::read_only_property, k3d::data::no_serialization) m_input_a;\n\tk3d_data(k3d::mesh*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::read_only_property, k3d::data::no_serialization) m_input_b;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// subtract_factory\n\nk3d::iplugin_factory& subtract_factory()\n{\n\treturn subtract::get_factory();\n}\n\n} // namespace blobby\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/bundled_renderman_engines/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-bundled-renderman-engines)\nK3D_CREATE_MODULE_PROXY(k3d-bundled-renderman-engines)\n\n"
  },
  {
    "path": "modules/bundled_renderman_engines/aqsis.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nnamespace bundled\n{\n\nclass aqsis :\n\tpublic k3d::node,\n\tpublic k3d::ri::irender_engine\n{\n\ttypedef k3d::node base;\n\npublic:\n\taqsis(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tk3d::bool_t installed()\n\t{\n\t\tconst k3d::filesystem::path aqsis = k3d::system::executable_path().branch_path() / k3d::filesystem::generic_path(k3d::system::executable_name(\"aqsis\"));\n\t\tif(!k3d::filesystem::exists(aqsis))\n\t\t\treturn false;\n\n\t\tconst k3d::filesystem::path aqsl = k3d::system::executable_path().branch_path() / k3d::filesystem::generic_path(k3d::system::executable_name(\"aqsl\"));\n\t\tif(!k3d::filesystem::exists(aqsl))\n\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t compile_shader(const k3d::filesystem::path& Shader)\n\t{\n\t\tconst k3d::filesystem::path aqsl = k3d::system::executable_path().branch_path() / k3d::filesystem::generic_path(\"aqsl\");\n\n\t\tconst k3d::filesystem::path shader_source_path = Shader;\n\t\tconst k3d::filesystem::path shader_binary_path = k3d::shader_cache_path() / k3d::filesystem::generic_path(k3d::filesystem::replace_extension(Shader, \".slx\").leaf());\n\t\tconst k3d::filesystem::path shader_source_directory = Shader.branch_path();\n\t\tconst k3d::filesystem::path global_source_directory = k3d::share_path() / k3d::filesystem::generic_path(\"shaders\");\n\n\t\tif(k3d::filesystem::up_to_date(shader_source_path, shader_binary_path))\n\t\t\treturn true;\n\n\t\tstd::ostringstream command_line;\n\t\tcommand_line << \"\\\"\" << aqsl.native_filesystem_string() << \"\\\"\";\n\t\tcommand_line << \" -I\\\"\" << shader_source_directory.native_filesystem_string()  << \"\\\"\";\n\t\tcommand_line << \" -I\\\"\" << global_source_directory.native_filesystem_string()  << \"\\\"\";\n\t\tcommand_line << \" -o \\\"\" << shader_binary_path.native_filesystem_string() << \"\\\"\";\n\t\tcommand_line << \" \\\"\" << shader_source_path.native_filesystem_string() << \"\\\"\";\n\n\t\treturn_val_if_fail(k3d::system::spawn_sync(command_line.str()), false);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render(k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& RIB)\n\t{\n\t\tconst k3d::filesystem::path aqsis = k3d::system::executable_path().branch_path() / k3d::filesystem::generic_path(\"aqsis\");\n\t\tconst k3d::filesystem::path displays = k3d::system::executable_path().branch_path();\n\t\tconst k3d::filesystem::path procedurals = k3d::system::executable_path().branch_path();\n\t\tconst k3d::filesystem::path plugins = k3d::system::executable_path().branch_path();\n\t\tconst k3d::filesystem::path shaders = k3d::shader_cache_path();\n\n\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"-displays=\\\"\" + displays.native_filesystem_string() + \"\\\"\"));\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"-procedurals=\\\"\" + procedurals.native_filesystem_string() + \"\\\"\"));\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"-plugins=\\\"\" + plugins.native_filesystem_string() + \"\\\"\"));\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"-shaders=\\\"\" + shaders.native_filesystem_string() + \"\\\"\"));\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(RIB.native_filesystem_string()));\n\n\t\tFrame.add_exec_command(aqsis.native_filesystem_string(), environment, arguments);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<aqsis,\n\t\t\tk3d::interface_list<k3d::ri::irender_engine> > factory(\n\t\t\t\tk3d::uuid(0x1197f6b5, 0x44e6fb49, 0x638aaea1, 0x7a3dac64),\n\t\t\t\t\"BundledAqsisRenderManEngine\",\n\t\t\t\t_(\"Provides render integration with a bundled copy of Aqsis, http://www.aqsis.org\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// aqsis_factory\n\nk3d::iplugin_factory& aqsis_factory()\n{\n\treturn aqsis::get_factory();\n}\n\n} // namespace bundled\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/bundled_renderman_engines/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nnamespace bundled\n{\n\nextern k3d::iplugin_factory& aqsis_factory();\n\n} // namespace bundled\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace modules\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::renderman::engine::bundled::aqsis_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/carve/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_CARVE_INCLUDE_DIR})\nK3D_BUILD_MODULE(k3d-carve)\nK3D_CREATE_MODULE_PROXY(k3d-carve)\nTARGET_LINK_LIBRARIES(k3d-carve ${K3D_CARVE_LIBRARY})\n"
  },
  {
    "path": "modules/carve/boolean.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// As a special exception, you have permission to link this program\n// with the CARVE (http://www.carve.org) library and distribute executables, as long as you\n// follow the requirements of the GNU GPL in regard to all of the\n// software in the executable aside from CARVE.\n\n/** \\file\n\t\t\\brief Plugin to perform 3D boolean operations using CARVE\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/euler_operations.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/triangulator.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\n#include <boost/mpl/vector.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <carve/csg.hpp>\n#include <carve/mesh.hpp>\n\nusing namespace carve;\n\nnamespace module\n{\n\nnamespace carve\n{\n\nnamespace detail\n{\n\t\nvoid merge_coplanar_faces(const k3d::mesh::points_t& Points, k3d::polyhedron::primitive& Polyhedron, const k3d::double_t Threshold)\n{\n\tconst k3d::uint_t face_begin = 0;\n\tconst k3d::uint_t face_end = Polyhedron.face_first_loops.size();\n\tk3d::mesh::selection_t input_face_selection(face_end, 1.0);\n\t\n\tk3d::mesh::bools_t boundary_edges;\n\tk3d::mesh::indices_t companions;\n\tk3d::polyhedron::create_edge_adjacency_lookup(Polyhedron.vertex_points, Polyhedron.clockwise_edges, boundary_edges, companions);\n\t\n\t// Calculate the face normals\n\tk3d::mesh::normals_t face_normals(Polyhedron.face_first_loops.size());\n\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tface_normals[face] = k3d::normalize(k3d::polyhedron::normal(Polyhedron.vertex_points, Polyhedron.clockwise_edges, Points, Polyhedron.loop_first_edges[Polyhedron.face_first_loops[face]]));\n\t}\n\t\n\tk3d::mesh::indices_t edge_faces;\n\tk3d::polyhedron::create_edge_face_lookup(Polyhedron, edge_faces);\n\tk3d::mesh::indices_t redundant_edges;\n\tk3d::polyhedron::mark_coplanar_edges(companions, boundary_edges, face_normals, edge_faces, input_face_selection, redundant_edges, Threshold);\n\n\tk3d::euler::kill_edge_make_loop(Polyhedron, redundant_edges, boundary_edges, companions, Points, face_normals);\n}\n\nvoid merge_collinear_edges(const k3d::mesh::points_t& Points, k3d::polyhedron::primitive& Polyhedron, const k3d::double_t Threshold)\n{\n\tconst k3d::uint_t face_begin = 0;\n\tconst k3d::uint_t face_end = Polyhedron.face_first_loops.size();\n\tk3d::mesh::selection_t input_edge_selection(Polyhedron.vertex_points.size(), 1.0);\n\t\n\tk3d::mesh::bools_t boundary_edges;\n\tk3d::mesh::indices_t companions;\n\tk3d::polyhedron::create_edge_adjacency_lookup(Polyhedron.vertex_points, Polyhedron.clockwise_edges, boundary_edges, companions);\n\t\n\tk3d::mesh::counts_t vertex_valences;\n\tk3d::polyhedron::create_point_valence_lookup(Points.size(), Polyhedron.vertex_points, vertex_valences);\n\tk3d::mesh::indices_t redundant_edges;\n\tk3d::polyhedron::mark_collinear_edges(redundant_edges, input_edge_selection, Points, Polyhedron.vertex_points, Polyhedron.clockwise_edges, vertex_valences, boundary_edges, companions, Threshold);\n\n\tk3d::euler::kill_edge_and_vertex(Polyhedron, redundant_edges, boundary_edges, companions, Points.size());\n}\n\n/// Types supported for interpolation\ntypedef boost::mpl::vector<k3d::color, k3d::double_t, k3d::texture3, k3d::int32_t, k3d::uint_t> interpolation_types;\n\n/// Stores attribute values at a single index\nstruct table_value\n{\n\n\ttypedef std::map<k3d::string_t, boost::any> values_t;\n\tvalues_t values;\n\nprivate:\n\t/// Extracts single values from a table, and puts them into the supplied map\n\tstruct value_extractor\n\t{\n\t\tvalue_extractor(values_t& Values, const k3d::table& Table, const k3d::uint_t Index) : m_values(Values), m_table(Table), m_idx(Index) {}\n\n\t\ttemplate<typename T> void operator()(T v)\n\t\t{\n\t\t\ttypedef k3d::typed_array<T> array_t;\n\t\t\tfor(k3d::table::const_iterator it = m_table.begin(); it != m_table.end(); ++it)\n\t\t\t{\n\t\t\t\tconst k3d::string_t& array_name = it->first;\n\t\t\t\tif(const array_t* array = dynamic_cast<const array_t*>(it->second))\n\t\t\t\t{\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\tprivate:\n\t\tvalues_t& m_values;\n\t\tconst k3d::table& m_table;\n\t\tconst k3d::uint_t m_idx;\n\t};\n};\n\t\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// boolean\n\nclass boolean :\n\tpublic k3d::imulti_mesh_sink,\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\ttypedef mesh::MeshSet<3>::vertex_t vertex_t;\n  typedef mesh::MeshSet<3>::face_t face_t;\n  typedef mesh::MeshSet<3>::const_face_iter const_face_iter;\npublic:\n\tboolean(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_type(init_owner(*this) + init_name(\"type\") + init_label(_(\"Type\")) + init_description(_(\"Boolean operation (intersection, union, difference, reverse difference)\")) + init_value(BOOLEAN_INTERSECTION) + init_enumeration(boolean_values())),\n\t\tm_threshold(init_owner(*this) + init_name(\"threshold\") + init_label(_(\"Threshold\")) + init_description(_(\"Controls the sensitivity for deciding when to simplify coplanar faces or collinear edges.\")) + init_value(1e-8) + init_step_increment(1e-8) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_user_property_changed_signal(*this)\t\n\t{\n\t\tm_type.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_user_property_changed_signal.connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\t\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\ttry\n\t\t{\n\t\t\tdo_boolean(Output, *this);\n\t\t}\n\t\tcatch (std::exception& E)\n\t\t{\n\t\t\tk3d::log() << error << \"CARVEBoolean: error executing boolean operation: \" << E.what() << std::endl;\n\t\t\tOutput = k3d::mesh();\n\t\t\treturn;\n\t\t}\n\t\t\n\t}\n\t\n\tvoid on_update_mesh_geometry(k3d::mesh& Output) {}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<boolean, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imulti_mesh_sink> > > factory(\n\t\t\tk3d::uuid(0x1f463505, 0x2c4bd104, 0xde32b98f, 0xb2da1ed1),\n\t\t\t\"CARVEBoolean\",\n\t\t\t_(\"3D mesh boolean operations\"),\n\t\t\t\"CSG\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\t\nprivate:\n\t\n\ttypedef enum\n\t{\n\t\tBOOLEAN_INTERSECTION,\n\t\tBOOLEAN_UNION,\n\t\tBOOLEAN_DIFFERENCE,\n\t\tBOOLEAN_REVERSE_DIFFERENCE\n\t} boolean_t;\n\t\n\tclass boolean_functor\n\t{\n\tpublic:\n\t\tboolean_functor(const boolean::boolean_t BooleanType, k3d::inode& Node) : m_boolean_type(BooleanType), m_node(Node), m_sequence(1)\n\t\t{\n\t\t}\n\n\t\tvoid operator()(k3d::iproperty* const Property)\n\t\t{\n\t\t\tif(Property->property_type() == typeid(k3d::mesh*))\n\t\t\t{\n\t\t\t\tconst k3d::mesh* const input_mesh = boost::any_cast<k3d::mesh*>(k3d::property::pipeline_value(*Property));\n\t\t\t\tif(!input_mesh)\n\t\t\t\t\tthrow std::runtime_error(\"No mesh found in property \" + Property->property_name());\n\t\t\t\t// make a copy of the mesh, where we can alter the face selection so everything is selected\n\t\t\t\tk3d::mesh mesh_hole_faces_selected(*input_mesh);\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron;\n\t\t\t\tfor(k3d::mesh::primitives_t::iterator primitive = mesh_hole_faces_selected.primitives.begin(); primitive != mesh_hole_faces_selected.primitives.end(); ++primitive)\n\t\t\t\t{\n\t\t\t\t\t// We only get the first polyhedron\n\t\t\t\t\tpolyhedron.reset(k3d::polyhedron::validate(mesh_hole_faces_selected, primitive->writable()));\n\t\t\t\t\tif(polyhedron.get())\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(!polyhedron.get())\n\t\t\t\t\treturn;\n\n\t\t\t\tconst k3d::uint_t input_face_count = polyhedron->face_selections.size();\n\t\t\t\tfor(k3d::uint_t face = 0; face != input_face_count; ++face)\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->face_selections[face] = polyhedron->face_loop_counts[face] > 1 ? 1.0 : 0.0;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// We triangulate the holes\n\t\t\t\tk3d::mesh triangulated_mesh;\n\t\t\t\t\n\t\t\t\tk3d::string_t boolean_op = k3d::string_cast(m_sequence - 1);\n\t\t\t\tk3d::string_t sequence_string = k3d::string_cast(m_sequence++); \n\t\t\t\t\n\t\t\t\tm_node.document().pipeline_profiler().start_execution(m_node, \"Triangulate input \" + sequence_string);\n\t\t\t\tconst k3d::mesh::primitive* triangulated_prim = k3d::polyhedron::triangulate(mesh_hole_faces_selected, *polyhedron, triangulated_mesh);\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> triangulated_polyhedron(k3d::polyhedron::validate(triangulated_mesh, *triangulated_prim));\n\t\t\t\tm_node.document().pipeline_profiler().finish_execution(m_node, \"Triangulate input \" + sequence_string);\n\n\t\t\t\tstd::vector<vertex_t::vector_t> vertices;\n\t\t\t\tstd::vector<int> faces;\n\t\t\t\tconst k3d::uint_t point_count = triangulated_mesh.points->size();\n\t\t\t\tvertices.reserve(point_count);\n\t\t\t\tfor(k3d::uint_t p_idx = 0; p_idx != point_count; ++p_idx)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::point3& p = triangulated_mesh.points->at(p_idx);\n\t\t\t\t\tvertices.push_back(geom::VECTOR(p[0],p[1],p[2]));\n\t\t\t\t}\n\t\t\t\tconst k3d::uint_t face_count = triangulated_polyhedron->face_first_loops.size();\n\t\t\t\tfaces.reserve(face_count+triangulated_polyhedron->vertex_points.size());\n\t\t\t\tfor(k3d::uint_t face = 0; face != face_count; ++face)\n\t\t\t\t{\n\t\t\t\t\tassert_error(triangulated_polyhedron->face_loop_counts[face] == 1);\n\t\t\t\t\tconst k3d::uint_t loop = triangulated_polyhedron->face_first_loops[face];\n\t\t\t\t\tconst k3d::uint_t first_edge = triangulated_polyhedron->loop_first_edges[loop];\n          faces.push_back(0); // Number of points for this face is stored first\n          int& face_num_vertices = faces.back();\n\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t\t{\n            ++face_num_vertices;\n\t\t\t\t\t\tfaces.push_back(triangulated_polyhedron->vertex_points[edge]);\n\n\t\t\t\t\t\tedge = triangulated_polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmesh::MeshSet<3>* new_mesh = new mesh::MeshSet<3>(vertices, face_count, faces);\n\t\t\t\tif (!m_result)\n\t\t\t\t{\n\t\t\t\t\tm_result.reset(new_mesh);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tm_node.document().pipeline_profiler().start_execution(m_node, \"Execute boolean operation \" + boolean_op);\n\t\t\t\t\tcsg::CSG::OP op = csg::CSG::UNION;\n\t\t\t\t\tswitch(m_boolean_type)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase BOOLEAN_INTERSECTION:\n\t\t\t\t\t\t\top = csg::CSG::INTERSECTION;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\n\t\t\t\t\t\tcase BOOLEAN_UNION:\n\t\t\t\t\t\t\top = csg::CSG::UNION;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\n\t\t\t\t\t\tcase BOOLEAN_DIFFERENCE:\n\t\t\t\t\t\t\top = csg::CSG::A_MINUS_B;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tcase BOOLEAN_REVERSE_DIFFERENCE:\n\t\t\t\t\t\t\top = csg::CSG::B_MINUS_A;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcsg::CSG csg;\n\t\t\t\t\tboost::scoped_ptr< mesh::MeshSet<3> > operand(new_mesh);\n\t\t\t\t\tm_result.reset(csg.compute(m_result.get(), operand.get(), op));\n\t\t\t\t\tm_node.document().pipeline_profiler().finish_execution(m_node, \"Execute boolean operation \" + boolean_op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst mesh::MeshSet<3>& result()\n\t\t{\n\t\t\treturn *m_result;\n\t\t}\n\t\t\n\t\tvoid canonicalize()\n    {\n      m_result->canonicalize();\n    }\n\n\tprivate:\n\t\tconst boolean::boolean_t m_boolean_type;\n\t\tk3d::inode& m_node;\n\t\tk3d::uint_t m_sequence;\n\t\tboost::scoped_ptr< mesh::MeshSet<3> > m_result;\n\t};\n\t\n\t/// Executes a boolean operation\n\tvoid do_boolean(k3d::mesh& Output, k3d::inode& Node)\n\t{\n\t\tOutput = k3d::mesh();\n\t\tconst boolean_t boolean_type = m_type.pipeline_value();\n\t\t\n\t\tconst k3d::iproperty_collection::properties_t properties = k3d::property::user_properties(*static_cast<k3d::iproperty_collection*>(this));\n\t\tboolean_functor functor(boolean_type, Node);\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t\tfunctor(*property);\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Canonicalize\");\n\t\tfunctor.canonicalize();\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Canonicalize\");\n\t\t\t\n\t\tk3d::mesh::points_t vertices;\n\t\tk3d::mesh::counts_t vertex_counts;\n\t\tk3d::mesh::indices_t vertex_indices;\n\n\t\tstd::map<const vertex_t*, k3d::uint_t> vertex_map;\n\n\t\tconst k3d::uint_t vertex_count = functor.result().vertex_storage.size();\n\t\tvertices.reserve(vertex_count);\n\t\tfor(k3d::uint_t v_idx = 0; v_idx != vertex_count; ++v_idx)\n\t\t{\n\t\t\tconst vertex_t& v = functor.result().vertex_storage[v_idx];\n\t\t\tvertex_map[&v] = vertices.size();\n\t\t\tvertices.push_back(k3d::point3(v.v[0], v.v[1], v.v[2]));\n\t\t}\n\n\t\tconst const_face_iter faces_begin = functor.result().faceBegin();\n    const const_face_iter faces_end = functor.result().faceEnd();\n\t\tfor(const_face_iter face_it = faces_begin; face_it != faces_end; ++face_it)\n\t\t{\n\t\t\tconst face_t& f = **face_it;\n      std::vector<vertex_t*> face_verts;\n      f.getVertices(face_verts);\n\t\t\tconst k3d::uint_t f_v_count = face_verts.size();\n\t\t\tvertex_counts.push_back(f_v_count);\n\t\t\tfor(k3d::uint_t v_idx = 0; v_idx != f_v_count; ++v_idx)\n\t\t\t{\n\t\t\t\tvertex_indices.push_back(vertex_map[face_verts[v_idx]]);\n\t\t\t}\n\t\t}\n\t\tk3d::polyhedron::create(Output, vertices, vertex_counts, vertex_indices, 0);\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& boolean_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Intersection\"), \"intersection\", _(\"Render intersecting volumes\")));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Union\"), \"union\", _(\"Render the union of two volumnes\")));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Difference\"), \"difference\", _(\"Render the difference of two volumes\")));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Reverse Difference\"), \"reverse_difference\", _(\"Render the difference of two volumes\")));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const boolean_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase BOOLEAN_UNION:\n\t\t\t\tStream << \"union\";\n\t\t\t\tbreak;\n\t\t\tcase BOOLEAN_INTERSECTION:\n\t\t\t\tStream << \"intersection\";\n\t\t\t\tbreak;\n\t\t\tcase BOOLEAN_DIFFERENCE:\n\t\t\t\tStream << \"difference\";\n\t\t\t\tbreak;\n\t\t\tcase BOOLEAN_REVERSE_DIFFERENCE:\n\t\t\t\tStream << \"reverse_difference\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, boolean_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"union\")\n\t\t\tValue = BOOLEAN_UNION;\n\t\telse if(text == \"intersection\")\n\t\t\tValue = BOOLEAN_INTERSECTION;\n\t\telse if(text == \"difference\")\n\t\t\tValue = BOOLEAN_DIFFERENCE;\n\t\telse if(text == \"reverse_difference\")\n\t\t\tValue = BOOLEAN_REVERSE_DIFFERENCE;\n\t\telse\n\t\t\tk3d::log() << k3d_file_reference << \": unknown enumeration [\" << text << \"]\"<< std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tk3d_data(boolean_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_type;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_threshold;\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n};\n\nk3d::iplugin_factory& boolean_factory()\n{\n\treturn boolean::get_factory();\n}\n\n} // namespace carve\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/carve/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace carve\n{\n\nextern k3d::iplugin_factory& boolean_factory();\n\n} // namespace carvemod\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::carve::boolean_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/cgal/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_CGAL_INCLUDE_DIR})\n\nSET_SOURCE_FILES_PROPERTIES(boolean.cpp module.cpp PROPERTIES COMPILE_FLAGS \"-frounding-math\")\n\nK3D_BUILD_MODULE(k3d-cgal)\nK3D_CREATE_MODULE_PROXY(k3d-cgal)\n\nTARGET_LINK_LIBRARIES(k3d-cgal\n\t${K3D_CGAL_LIBRARY}\n\t${K3D_MPFR_LIBRARY}\n\t${K3D_GMP_LIBRARY}\n\t${Boost_THREAD_LIBRARY}\n\t)\n\n"
  },
  {
    "path": "modules/cgal/big_integer.h",
    "content": "#ifndef MODULES_CGAL_BIG_INTEGER_H\n#define MODULES_CGAL_BIG_INTEGER_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// As a special exception, you have permission to link this program\n// with the CGAL (http://www.cgal.org) library and distribute executables, as long as you\n// follow the requirements of the GNU GPL in regard to all of the\n// software in the executable aside from CGAL.\n\n/** \\file\n\t\t\\brief Number type that provides comparison operators that have a tolerance specified by a threshold\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <CGAL/Gmpz.h>\n\n#include <k3dsdk/types.h>\n\n#include <boost/integer_traits.hpp>\n\nCGAL_BEGIN_NAMESPACE\n\ntypedef Gmpz exact_t; // exact type\ntypedef k3d::int64_t integer_t;\ntypedef boost::integer_traits<integer_t> traits;\n\nclass big_integer\n{\npublic:\n\tbig_integer() : n(0), overflow(false) {}\n\tbig_integer(const double D)\n\t{\n\t\tif(D > traits::const_max || D < traits::const_min)\n\t\t{\n\t\t\toverflow = true;\n\t\t\texact = exact_t(D);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tn = D;\n\t\t\toverflow = false;\n\t\t}\n\t}\n\tbig_integer(const int N) : n(N), overflow(false)\n\t{\n\t}\n\t\n\tbig_integer& operator+=(const big_integer& N)\n\t{\n\t\tn += N.n;\n\t\treturn *this;\n\t}\n\tbig_integer& operator-=(const big_integer& N)\n\t{\n\t\tn -= N.n;\n\t\treturn *this;\n\t}\n\tbig_integer& operator*=(const big_integer& N)\n\t{\n\t\tn *= N.n;\n\t\treturn *this;\n\t}\n\tbig_integer& operator/=(const big_integer& N)\n\t{\n\t\tn /= N.n;\n\t\treturn *this;\n\t}\n\n\texact_t exact;\n\tinteger_t n;\n\tk3d::bool_t overflow;\n};\n\ninline big_integer operator-(const big_integer& N)\n{ return big_integer(-N.n); }\n\ninline big_integer operator-(const big_integer& N1, const big_integer& N2)\n{\n\treturn big_integer(N1.n - N2.n);\n}\n\ninline big_integer operator+(const big_integer& N1, const big_integer& N2)\n{\n\treturn big_integer(N1.n + N2.n);\n}\n\ninline big_integer operator*(const big_integer& N1, const big_integer& N2)\n{\n\treturn big_integer(N1.n * N2.n);\n}\n\ninline big_integer operator/(const big_integer& N1, const big_integer& N2)\n{\n\treturn big_integer(N1.n / N2.n);\n}\n\ninline bool operator==(const big_integer& N1, const big_integer& N2)\n{ return N1.n == N2.n; }\n\ninline bool operator!=(const big_integer& N1, const big_integer& N2)\n{ return N1.n != N2.n; }\n\ninline bool operator<(const big_integer& N1, const big_integer& N2)\n{ return N1.n < N2.n; }\n\ninline bool operator>(const big_integer& N1, const big_integer& N2)\n{ return N1.n > N2.n; }\n\ninline bool operator<=(const big_integer& N1, const big_integer& N2)\n{ return N1.n <= N2.n; }\n\ninline bool operator>=(const big_integer& N1, const big_integer& N2)\n{ return N1.n >= N2.n; }\n\ninline std::ostream& operator<<(std::ostream& Stream, const big_integer& N)\n{\n\tStream << N.n;\n\treturn Stream;\n}\n\nCGAL_END_NAMESPACE\n\n#endif // !MODULES_CGAL_BIG_INTEGER_H\n"
  },
  {
    "path": "modules/cgal/boolean.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// As a special exception, you have permission to link this program\n// with the CGAL (http://www.cgal.org) library and distribute executables, as long as you\n// follow the requirements of the GNU GPL in regard to all of the\n// software in the executable aside from CGAL.\n\n/** \\file\n\t\t\\brief Plugin to perform 3D boolean operations using CGAL\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"conversion.h\"\n\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/euler_operations.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/triangulator.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace cgal\n{\n\nnamespace detail\n{\n\t\nvoid merge_coplanar_faces(const k3d::mesh::points_t& Points, k3d::polyhedron::primitive& Polyhedron, const k3d::double_t Threshold)\n{\n\tconst k3d::uint_t face_begin = 0;\n\tconst k3d::uint_t face_end = Polyhedron.face_first_loops.size();\n\tk3d::mesh::selection_t input_face_selection(face_end, 1.0);\n\t\n\tk3d::mesh::bools_t boundary_edges;\n\tk3d::mesh::indices_t companions;\n\tk3d::polyhedron::create_edge_adjacency_lookup(Polyhedron.vertex_points, Polyhedron.clockwise_edges, boundary_edges, companions);\n\t\n\t// Calculate the face normals\n\tk3d::mesh::normals_t face_normals(Polyhedron.face_first_loops.size());\n\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tface_normals[face] = k3d::normalize(k3d::polyhedron::normal(Polyhedron.vertex_points, Polyhedron.clockwise_edges, Points, Polyhedron.loop_first_edges[Polyhedron.face_first_loops[face]]));\n\t}\n\t\n\tk3d::mesh::indices_t edge_faces;\n\tk3d::polyhedron::create_edge_face_lookup(Polyhedron, edge_faces);\n\tk3d::mesh::indices_t redundant_edges;\n\tk3d::polyhedron::mark_coplanar_edges(companions, boundary_edges, face_normals, edge_faces, input_face_selection, redundant_edges, Threshold);\n\n\tk3d::euler::kill_edge_make_loop(Polyhedron, redundant_edges, boundary_edges, companions, Points, face_normals);\n}\n\nvoid merge_collinear_edges(const k3d::mesh::points_t& Points, k3d::polyhedron::primitive& Polyhedron, const k3d::double_t Threshold)\n{\n\tconst k3d::uint_t face_begin = 0;\n\tconst k3d::uint_t face_end = Polyhedron.face_first_loops.size();\n\tk3d::mesh::selection_t input_edge_selection(Polyhedron.vertex_points.size(), 1.0);\n\t\n\tk3d::mesh::bools_t boundary_edges;\n\tk3d::mesh::indices_t companions;\n\tk3d::polyhedron::create_edge_adjacency_lookup(Polyhedron.vertex_points, Polyhedron.clockwise_edges, boundary_edges, companions);\n\t\n\tk3d::mesh::counts_t vertex_valences;\n\tk3d::polyhedron::create_point_valence_lookup(Points.size(), Polyhedron.vertex_points, vertex_valences);\n\tk3d::mesh::indices_t redundant_edges;\n\tk3d::polyhedron::mark_collinear_edges(redundant_edges, input_edge_selection, Points, Polyhedron.vertex_points, Polyhedron.clockwise_edges, vertex_valences, boundary_edges, companions, Threshold);\n\n\tk3d::euler::kill_edge_and_vertex(Polyhedron, redundant_edges, boundary_edges, companions, Points.size());\n}\n\t\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// boolean\n\nclass boolean :\n\tpublic k3d::imulti_mesh_sink,\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tboolean(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_type(init_owner(*this) + init_name(\"type\") + init_label(_(\"Type\")) + init_description(_(\"Boolean operation (intersection, union, difference, reverse difference)\")) + init_value(BOOLEAN_INTERSECTION) + init_enumeration(boolean_values())),\n\t\tm_threshold(init_owner(*this) + init_name(\"threshold\") + init_label(_(\"Threshold\")) + init_description(_(\"Controls the sensitivity for deciding when to simplify coplanar faces or collinear edges.\")) + init_value(1e-8) + init_step_increment(1e-8) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_user_property_changed_signal(*this)\t\n\t{\n\t\tm_type.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_user_property_changed_signal.connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\t\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\ttry\n\t\t{\n\t\t\tdo_boolean<exact_nef>(Output, *this);\n\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> output_polyhedron;\n\t\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t\t{\n\t\t\t\t// We only get the first polyhedron\n\t\t\t\toutput_polyhedron.reset(k3d::polyhedron::validate(Output, primitive->writable()));\n\t\t\t\tif(output_polyhedron.get())\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(Output.points && output_polyhedron.get())\n\t\t\t{\n\t\t\t\tdocument().pipeline_profiler().start_execution(*this, \"Simplify output\");\n\t\t\t\tdetail::merge_coplanar_faces(*Output.points, *output_polyhedron, m_threshold.pipeline_value());\n\t\t\t\tdetail::merge_collinear_edges(*Output.points, *output_polyhedron, m_threshold.pipeline_value());\n\t\t\t\tk3d::mesh::bools_t unused_points;\n\t\t\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\t\t\tk3d::mesh::delete_points(Output, unused_points);\n\t\t\t\tdocument().pipeline_profiler().finish_execution(*this, \"Simplify output\");\n\t\t\t}\n\t\t}\n\t\tcatch (std::exception& E)\n\t\t{\n\t\t\tk3d::log() << error << \"CGALBoolean: error executing boolean operation: \" << E.what() << std::endl;\n\t\t\tOutput = k3d::mesh();\n\t\t\treturn;\n\t\t}\n\t\t\n\t}\n\t\n\tvoid on_update_mesh_geometry(k3d::mesh& Output) {}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<boolean, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imulti_mesh_sink> > > factory(\n\t\t\tk3d::uuid(0x0d88fe28, 0xea4fdf20, 0xae858297, 0x487f857b),\n\t\t\t\"CGALBoolean\",\n\t\t\t_(\"3D mesh boolean operations\"),\n\t\t\t\"CSG\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\t\nprivate:\n\t\n\ttypedef enum\n\t{\n\t\tBOOLEAN_INTERSECTION,\n\t\tBOOLEAN_UNION,\n\t\tBOOLEAN_DIFFERENCE,\n\t\tBOOLEAN_REVERSE_DIFFERENCE\n\t} boolean_t;\n\t\n\ttemplate<typename nef_t>\n\tclass boolean_functor\n\t{\n\tpublic:\n\t\tboolean_functor(const boolean::boolean_t BooleanType, nef_t& Result, k3d::inode& Node) : m_boolean_type(BooleanType), m_result(Result), m_started(false), m_node(Node), m_sequence(1)\n\t\t{\n\t\t}\n\t\tvoid operator()(k3d::iproperty* const Property)\n\t\t{\n\t\t\tif(Property->property_type() == typeid(k3d::mesh*))\n\t\t\t{\n\t\t\t\tconst k3d::mesh* const input_mesh = boost::any_cast<k3d::mesh*>(k3d::property::pipeline_value(*Property));\n\t\t\t\tif(!input_mesh)\n\t\t\t\t\tthrow std::runtime_error(\"No mesh found in property \" + Property->property_name());\n\t\t\t\t// make a copy of the mesh, where we can alter the face selection so everything is selected\n\t\t\t\tk3d::mesh mesh_all_faces_selected(*input_mesh);\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron;\n\t\t\t\tfor(k3d::mesh::primitives_t::iterator primitive = mesh_all_faces_selected.primitives.begin(); primitive != mesh_all_faces_selected.primitives.end(); ++primitive)\n\t\t\t\t{\n\t\t\t\t\t// We only get the first polyhedron\n\t\t\t\t\tpolyhedron.reset(k3d::polyhedron::validate(mesh_all_faces_selected, primitive->writable()));\n\t\t\t\t\tif(polyhedron.get())\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(!polyhedron.get())\n\t\t\t\t\treturn;\n\t\t\t\treturn_if_fail(k3d::polyhedron::is_solid(*polyhedron));\n\t\t\t\tpolyhedron->face_selections.assign(polyhedron->face_selections.size(), 1.0);\n\t\t\t\t\n\t\t\t\t// First triangulate inputs\n\t\t\t\tk3d::mesh triangulated_mesh;\n\t\t\t\t\n\t\t\t\tk3d::string_t boolean_op = k3d::string_cast(m_sequence - 1);\n\t\t\t\tk3d::string_t sequence_string = k3d::string_cast(m_sequence++); \n\t\t\t\t\n\t\t\t\tm_node.document().pipeline_profiler().start_execution(m_node, \"Triangulate input \" + sequence_string);\n\t\t\t\tconst k3d::mesh::primitive* triangulated_prim = k3d::polyhedron::triangulate(mesh_all_faces_selected, *polyhedron, triangulated_mesh);\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> triangulated_polyhedron(k3d::polyhedron::validate(triangulated_mesh, *triangulated_prim));\n\t\t\t\tm_node.document().pipeline_profiler().finish_execution(m_node, \"Triangulate input \" + sequence_string);\n\t\t\t\t\n\t\t\t\tm_node.document().pipeline_profiler().start_execution(m_node, \"Convert input \" + sequence_string + \" to Nef\");\n\t\t\t\tboost::shared_ptr<nef_t> operand = to_nef<nef_t>(*triangulated_mesh.points, *triangulated_polyhedron);\n\t\t\t\tm_node.document().pipeline_profiler().finish_execution(m_node, \"Convert input \" + sequence_string + \" to Nef\");\n\t\t\t\treturn_if_fail(operand.get());\n\t\t\t\tif (!m_started)\n\t\t\t\t{\n\t\t\t\t\tm_result = *operand;\n\t\t\t\t\tm_started = true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tm_node.document().pipeline_profiler().start_execution(m_node, \"Execute boolean operation \" + boolean_op);\n\t\t\t\t\tswitch(m_boolean_type)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase BOOLEAN_INTERSECTION:\n\t\t\t\t\t\t\tm_result *= *operand;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\n\t\t\t\t\t\tcase BOOLEAN_UNION:\n\t\t\t\t\t\t\tm_result += *operand;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\n\t\t\t\t\t\tcase BOOLEAN_DIFFERENCE:\n\t\t\t\t\t\t\tm_result -= *operand;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tcase BOOLEAN_REVERSE_DIFFERENCE:\n\t\t\t\t\t\t\tm_result -= *operand;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tm_node.document().pipeline_profiler().finish_execution(m_node, \"Execute boolean operation \" + boolean_op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tprivate:\n\t\tconst boolean::boolean_t m_boolean_type;\n\t\tnef_t& m_result;\n\t\tk3d::bool_t m_started;\n\t\tk3d::inode& m_node;\n\t\tk3d::uint_t m_sequence;\n\t};\n\t\n\t/// Executes a boolean operation, using the given Nef polyhedron type\n\ttemplate<typename nef_t>\n\tvoid do_boolean(k3d::mesh& Output, k3d::inode& Node)\n\t{\n\t\tOutput = k3d::mesh();\n\t\tnef_t result;\n\t\tconst boolean_t boolean_type = m_type.pipeline_value();\n\t\t\n\t\tconst k3d::iproperty_collection::properties_t properties = k3d::property::user_properties(*static_cast<k3d::iproperty_collection*>(this));\n\t\tboolean_functor<nef_t> functor(boolean_type, result, Node);\n\t\tif (boolean_type == BOOLEAN_REVERSE_DIFFERENCE)\n\t\t{\n\t\t\tstd::for_each(properties.rbegin(), properties.rend(), functor);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstd::for_each(properties.begin(), properties.end(), functor);\n\t\t}\n\t\t\t\n\t\tto_mesh(result, Output, static_cast<k3d::imaterial*>(0));\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& boolean_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Intersection\"), \"intersection\", _(\"Render intersecting volumes\")));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Union\"), \"union\", _(\"Render the union of two volumnes\")));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Difference\"), \"difference\", _(\"Render the difference of two volumes\")));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(_(\"Reverse Difference\"), \"reverse_difference\", _(\"Render the difference of two volumes\")));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const boolean_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase BOOLEAN_UNION:\n\t\t\t\tStream << \"union\";\n\t\t\t\tbreak;\n\t\t\tcase BOOLEAN_INTERSECTION:\n\t\t\t\tStream << \"intersection\";\n\t\t\t\tbreak;\n\t\t\tcase BOOLEAN_DIFFERENCE:\n\t\t\t\tStream << \"difference\";\n\t\t\t\tbreak;\n\t\t\tcase BOOLEAN_REVERSE_DIFFERENCE:\n\t\t\t\tStream << \"reverse_difference\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, boolean_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"union\")\n\t\t\tValue = BOOLEAN_UNION;\n\t\telse if(text == \"intersection\")\n\t\t\tValue = BOOLEAN_INTERSECTION;\n\t\telse if(text == \"difference\")\n\t\t\tValue = BOOLEAN_DIFFERENCE;\n\t\telse if(text == \"reverse_difference\")\n\t\t\tValue = BOOLEAN_REVERSE_DIFFERENCE;\n\t\telse\n\t\t\tk3d::log() << k3d_file_reference << \": unknown enumeration [\" << text << \"]\"<< std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tk3d_data(boolean_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_type;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_threshold;\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n};\n\nk3d::iplugin_factory& boolean_factory()\n{\n\treturn boolean::get_factory();\n}\n\n} // namespace cgal\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cgal/cgal_simplifying_constructors.h",
    "content": "#ifndef MODULES_CGAL_CGAL_SIMPLIFYING_CONSTRUCTORS_H\n#define MODULES_CGAL_CGAL_SIMPLIFYING_CONSTRUCTORS_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// As a special exception, you have permission to link this program\n// with the CGAL (http://www.cgal.org) library and distribute executables, as long as you\n// follow the requirements of the GNU GPL in regard to all of the\n// software in the executable aside from CGAL.\n\n/*\n * \\file cgal_simplifying_constructors.h\n * \\created Jan 2, 2009\n * \\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n#include <CGAL/Homogeneous.h>\n#include <CGAL/Origin.h>\n\nnamespace module\n{\n\nnamespace cgal\n{\n\n/// Returns the greatest common divisor for the 4 given arguments\ntemplate<typename NT>\nconst NT gcd(const NT& X, const NT& Y, const NT& Z, const NT& W)\n{\n\tconst NT gcd_x = CGAL::gcd(X, W);\n\tconst NT gcd_y = CGAL::gcd(Y, W);\n\tconst NT gcd_z = CGAL::gcd(Z, W);\n\tconst NT gcd_xy = CGAL::gcd(gcd_x, gcd_y);\n\treturn CGAL::gcd(gcd_xy, gcd_z);\n}\n\n/// Replacement for the standard point constructor that finds the GCD of 4 homogeneous coordinates and simplifies them\ntemplate<typename K>\nclass Construct_point_3_simplify\n{\n\ttypedef typename K::RT         RT;\n\ttypedef typename K::FT         FT;\n\ttypedef typename K::Point_3    Point_3;\n\ttypedef typename Point_3::Rep  Rep;\npublic:\n\ttypedef Point_3          result_type;\n\t\n\tRep // Point_3\n\toperator()(CGAL::Return_base_tag, CGAL::Origin o) const\n\t{ return Rep(o); }\n\n\ttemplate < typename Tx, typename Ty, typename Tz >\n\tRep // Point_3\n\toperator()(CGAL::Return_base_tag, const Tx& x, const Ty& y, const Tz& z) const\n\t{ return Rep(x, y, z); }\n\n\tRep // Point_3\n\toperator()(CGAL::Return_base_tag, const FT& x, const FT& y, const FT& z) const\n\t{ return Rep(x, y, z); }\n\n\tRep // Point_3\n\toperator()(CGAL::Return_base_tag, const RT& x, const RT& y, const RT& z, const RT& w) const\n\t{\n\t\tconst RT f = gcd(x, y, z, w);\n\t\treturn Rep(x/f, y/f, z/f, w/f);\n\t}\n\t\n  Point_3\n  operator()(CGAL::Origin o) const\n  { return this->operator()(CGAL::Return_base_tag(), o); }\n\n  template < typename Tx, typename Ty, typename Tz >\n  Point_3\n  operator()(const Tx& x, const Ty& y, const Tz& z) const\n  { return this->operator()(CGAL::Return_base_tag(), x, y, z); }\n\n  Point_3\n  operator()(const FT& x, const FT& y, const FT& z) const\n  { return this->operator()(CGAL::Return_base_tag(), x, y, z); }\n\n  Point_3\n  operator()(const RT& x, const RT& y, const RT& z, const RT& w) const\n  { return this->operator()(CGAL::Return_base_tag(), x, y, z, w); }\n};\n\n/// Replacement for the standard vector constructor that finds the GCD of 4 homogeneous coordinates and simplifies them\ntemplate <typename K>\nclass Construct_vector_3_simplify\n{\n\ttypedef typename K::RT           RT;\n\ttypedef typename K::FT           FT;\n\ttypedef typename K::Direction_3  Direction_3;\n\ttypedef typename K::Segment_3    Segment_3;\n\ttypedef typename K::Ray_3        Ray_3;\n\ttypedef typename K::Line_3       Line_3;\n\ttypedef typename K::Vector_3     Vector_3;\n\ttypedef typename K::Point_3      Point_3;\n\ttypedef typename Vector_3::Rep   Rep;\npublic:\n\ttypedef Vector_3         result_type;\n\n\tRep // Vector_3\n\toperator()(CGAL::Return_base_tag, const Point_3& p, const Point_3& q) const\n\t{\n\t\tconst RT x = q.hx()*p.hw() - p.hx()*q.hw();\n\t\tconst RT y = q.hy()*p.hw() - p.hy()*q.hw();\n\t\tconst RT z = q.hz()*p.hw() - p.hz()*q.hw();\n\t\tconst RT w = q.hw()*p.hw();\n\t\tconst RT f = gcd(x, y, z, w);\n\t\treturn Rep(x/f, y/f, z/f, w/f);\n\t}\n\n\tRep // Vector_3\n\toperator()(CGAL::Return_base_tag, const CGAL::Origin&, const Point_3& q) const\n\t{\n\t\tconst RT f = gcd(q.hx(), q.hy(), q.hz(), q.hw());\n\t\treturn Rep(q.hx()/f, q.hy()/f, q.hz()/f, q.hw()/f);\n\t}\n\n\tRep // Vector_3\n\toperator()(CGAL::Return_base_tag, const Point_3& p, const CGAL::Origin& ) const\n\t{\n\t\tconst RT f = gcd(p.hx(), p.hy(), p.hz(), p.hw());\n\t\treturn Rep(-p.hx()/f, -p.hy()/f, -p.hz()/f, p.hw()/f);\n\t}\n\n\tRep // Vector_3\n\toperator()(CGAL::Return_base_tag, const Direction_3& d) const\n\t{ \n\t\tVector_3 v = d.rep().to_vector();\n\t\tconst RT f = gcd(v.hx(), v.hy(), v.hz(), v.hw());\n\t\treturn Rep(v.hx()/f, v.hy()/f, v.hz()/f, v.hw()/f);\n\t}\n\n\tRep // Vector_3\n\toperator()(CGAL::Return_base_tag, const Segment_3& s) const\n\t{ \n\t\tVector_3 v = s.rep().to_vector();\n\t\tconst RT f = gcd(v.hx(), v.hy(), v.hz(), v.hw());\n\t\treturn Rep(v.hx()/f, v.hy()/f, v.hz()/f, v.hw()/f);\n\t}\n\n\tRep // Vector_3\n\toperator()(CGAL::Return_base_tag, const Ray_3& r) const\n\t{ \n\t\tVector_3 v = r.rep().to_vector();\n\t\tconst RT f = gcd(v.hx(), v.hy(), v.hz(), v.hw());\n\t\treturn Rep(v.hx()/f, v.hy()/f, v.hz()/f, v.hw()/f);\n\t}\n\n\tRep // Vector_3\n\toperator()(CGAL::Return_base_tag, const Line_3& l) const\n\t{ \n\t\tVector_3 v = l.rep().to_vector();\n\t\tconst RT f = gcd(v.hx(), v.hy(), v.hz(), v.hw());\n\t\treturn Rep(v.hx()/f, v.hy()/f, v.hz()/f, v.hw()/f);\n\t}\n\n\tRep // Vector_3\n\toperator()(CGAL::Return_base_tag, const CGAL::Null_vector&) const\n\t{ return Rep(RT(0), RT(0), RT(0), RT(1)); }\n\n\ttemplate < typename Tx, typename Ty, typename Tz >\n\tRep // Vector_3\n\toperator()(CGAL::Return_base_tag, const Tx & x, const Ty & y, const Tz & z) const\n\t{ return Rep(x, y, z); }\n\n\tRep // Vector_3\n\toperator()(CGAL::Return_base_tag, const RT& x, const RT& y, const RT& z, const RT& w) const\n\t{\n\t\tconst RT f = gcd(x, y, z, w);\n\t\treturn Rep(x/f, y/f, z/f, w/f);\n\t}\n\n\n\tVector_3\n\toperator()( const Point_3& p, const Point_3& q) const\n\t{ return this->operator()(CGAL::Return_base_tag(), p, q); }\n\n\tVector_3\n\toperator()( const CGAL::Origin& o, const Point_3& q) const\n\t{ return this->operator()(CGAL::Return_base_tag(), o, q); }\n\n\tVector_3\n\toperator()( const Point_3& p, const CGAL::Origin& q) const\n\t{ return this->operator()(CGAL::Return_base_tag(), p, q); }\n\n\tVector_3\n\toperator()( const Direction_3& d) const\n\t{ return this->operator()(CGAL::Return_base_tag(), d); }\n\n\tVector_3\n\toperator()( const Segment_3& s) const\n\t{ return this->operator()(CGAL::Return_base_tag(), s); }\n\n\tVector_3\n\toperator()( const Ray_3& r) const\n\t{ return this->operator()(CGAL::Return_base_tag(), r); }\n\n\tVector_3\n\toperator()( const Line_3& l) const\n\t{ return this->operator()(CGAL::Return_base_tag(), l); }\n\n\tVector_3\n\toperator()( const CGAL::Null_vector& n) const\n\t{ return this->operator()(CGAL::Return_base_tag(), n); }\n\n\ttemplate < typename Tx, typename Ty, typename Tz >\n\tVector_3\n\toperator()(const Tx & x, const Ty & y, const Tz & z) const\n\t{ return this->operator()(CGAL::Return_base_tag(), x, y, z); }\n\n\tVector_3\n\toperator()( const RT& x, const RT& y, const RT& z, const RT& w) const\n\t{ return this->operator()(CGAL::Return_base_tag(), x, y, z, w); }\n};\n\n/// Base for a kernel using these simplifying constructors\ntemplate < typename K_, typename K_Base >\nclass simplifying_kernel_base\n  : public K_Base::template Base<K_>::Type\n{\n  typedef typename K_Base::template Base<K_>::Type   OldK;\npublic:\n  typedef K_                                Kernel;\n  typedef Construct_point_3_simplify<K_>    Construct_point_3;\n  typedef Construct_vector_3_simplify<K_>   Construct_vector_3;\n\n  Construct_point_3\n  construct_point_3_object() const\n  { return Construct_point_3(); }\n  \n  Construct_vector_3\n\tconstruct_vector_3_object() const\n\t{ return Construct_vector_3(); }\n\n  template < typename Kernel2 >\n  struct Base { typedef simplifying_kernel_base<Kernel2, K_Base>  Type; };\n};\n\n/// Wrapper around the homogeneous kernel\ntemplate < typename RT_ >\nstruct simplifying_kernel\n\t: public CGAL::Type_equality_wrapper<\n\t\t\t\t\t\t\t\tsimplifying_kernel_base<simplifying_kernel<RT_>, CGAL::Homogeneous<RT_> >,\n\t\t\t\t\t\t\t\tsimplifying_kernel<RT_> >\n{};\n\n} // namespace cgal\n\n} // namespace module\n\n\n#endif // !MODULES_CGAL_CGAL_SIMPLIFYING_CONSTRUCTORS_H\n"
  },
  {
    "path": "modules/cgal/conversion.h",
    "content": "#ifndef MODULES_CGAL_CONVERSION_H\n#define MODULES_CGAL_CONVERSION_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// As a special exception, you have permission to link this program\n// with the CGAL (http://www.cgal.org) library and distribute executables, as long as you\n// follow the requirements of the GNU GPL in regard to all of the\n// software in the executable aside from CGAL.\n\n/** \\file\n\t\t\\brief Conversion between CGAL and K-3D formats\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"k3d_to_nef.h\"\n\n// For debug off output\n#include <CGAL/IO/Nef_polyhedron_iostream_3.h>\n\n#include <k3dsdk/imaterial.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <map>\n\nnamespace module\n{\n\nnamespace cgal\n{\n\n/// Visitor class to help building the k3d mesh\ntemplate<typename nef_t>\nclass nef_visitor\n{\n\ttypedef typename nef_t::Vertex_const_iterator Vertex_const_iterator;\n\ttypedef typename nef_t::Halffacet_const_handle Halffacet_const_handle;\n\ttypedef typename nef_t::SHalfedge_const_handle SHalfedge_const_handle;\n\ttypedef typename nef_t::Halffacet_cycle_const_iterator Halffacet_cycle_const_iterator;\n\ttypedef typename nef_t::SHalfedge_around_facet_const_circulator SHalfedge_around_facet_const_circulator;\npublic:\n\tnef_visitor(k3d::polyhedron::primitive& Polyhedron, const CGAL::Object_index<Vertex_const_iterator>& VertexIndices)\n\t: m_polyhedron(Polyhedron), m_vertex_indices(VertexIndices), m_edge(0), m_shell(Polyhedron.shell_types.size())\n\t{\n\t\tm_polyhedron.shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t}\n\t\n\tvoid visit(Halffacet_const_handle OppositeFacet)\n\t{\n\t\treturn_if_fail(nef_t::Infi_box::is_standard(OppositeFacet->plane()));\n\t\t\n\t\tSHalfedge_const_handle se;\n\t\tHalffacet_cycle_const_iterator fc;\n\t\t     \t\n\t\tHalffacet_const_handle f = OppositeFacet->incident_volume()->mark() == 1 ? OppositeFacet->twin() : OppositeFacet;\n\t\t\n\t\tfc = f->facet_cycles_begin();\n\t\tse = SHalfedge_const_handle(fc);\n\t\treturn_if_fail(se!=0);\n\t\tSHalfedge_around_facet_const_circulator hc_start(se);\n\t\tSHalfedge_around_facet_const_circulator hc_end(hc_start);\n\t\tconst k3d::uint_t face_first_edge = m_polyhedron.vertex_points.size();\n\t\tCGAL_For_all(hc_start,hc_end)\n\t\t{\n\t\t\tm_polyhedron.vertex_points.push_back(m_vertex_indices[hc_start->source()->center_vertex()]);\n\t\t\tm_polyhedron.clockwise_edges.push_back(m_polyhedron.vertex_points.size());\n\t\t\tm_polyhedron.edge_selections.push_back(0.0);\n\t\t\tm_polyhedron.vertex_selections.push_back(0.0);\n\t\t}\n\t\tm_polyhedron.clockwise_edges.back() = face_first_edge;\n\t\tm_polyhedron.face_first_loops.push_back(m_polyhedron.loop_first_edges.size());\n\t\tm_polyhedron.loop_first_edges.push_back(face_first_edge);\n\t\tm_polyhedron.face_loop_counts.push_back(1);\n\t\tm_polyhedron.face_materials.push_back(static_cast<k3d::imaterial*>(0));\n\t\tm_polyhedron.face_selections.push_back(0.0);\n\t\tm_polyhedron.face_shells.push_back(m_shell);\n\t\t++fc;\n\t\tCGAL_For_all(fc, f->facet_cycles_end())\n\t\t{\n\t\t\tse = SHalfedge_const_handle(fc);\n\t\t\treturn_if_fail(se!=0);\n\t\t\tSHalfedge_around_facet_const_circulator hole_start(se);\n\t\t\tSHalfedge_around_facet_const_circulator hole_end(hole_start);\n\t\t\tconst k3d::uint_t hole_first_edge = m_polyhedron.vertex_points.size();\n\t\t\tCGAL_For_all(hole_start,hole_end)\n\t\t\t{\n\t\t\t\tm_polyhedron.vertex_points.push_back(m_vertex_indices[hole_start->source()->center_vertex()]);\n\t\t\t\tm_polyhedron.clockwise_edges.push_back(m_polyhedron.vertex_points.size());\n\t\t\t\tm_polyhedron.edge_selections.push_back(0.0);\n\t\t\t\tm_polyhedron.vertex_selections.push_back(0.0);\n\t\t\t}\n\t\t\tm_polyhedron.clockwise_edges.back() = hole_first_edge;\n\t\t\tm_polyhedron.loop_first_edges.push_back(hole_first_edge);\n\t\t\t++m_polyhedron.face_loop_counts.back();\n\t\t}\n\t}\n\t\n\tvoid visit(typename nef_t::SFace_const_handle) {}\n  void visit(typename nef_t::Halfedge_const_handle edge) {}\n  void visit(typename nef_t::Vertex_const_handle) {}\n  void visit(SHalfedge_const_handle) {}\n  void visit(typename nef_t::SHalfloop_const_handle) {}\n\t\nprivate:\n\tk3d::polyhedron::primitive& m_polyhedron;\n\tconst CGAL::Object_index<Vertex_const_iterator>& m_vertex_indices;\n\tk3d::uint_t m_edge;\n\tconst k3d::uint_t m_shell;\n};\n\n/// Converts a Nef_polyhedron to a k3d mesh\ntemplate<typename nef_t>\nvoid to_mesh(nef_t& NefPolyhedron, k3d::mesh& Mesh, k3d::imaterial* const Material)\n{\n\ttypedef typename nef_t::Vertex_const_iterator Vertex_const_iterator;\n\ttypedef typename nef_t::Point_3 Point_3;\n\ttypedef typename nef_t::Volume_const_handle Volume_const_handle;\n\ttypedef typename nef_t::SFace_const_handle SFace_const_handle;\n\t\n\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Mesh));\n\tk3d::mesh::points_t& points = Mesh.points.create();\n\tk3d::mesh::selection_t& point_selection = Mesh.point_selection.create();\n\t\n\tk3d::int32_t skip_volumes = nef_t::Infi_box::extended_kernel() ? 2 : 1;\n\t\n\tVertex_const_iterator v;\n\tCGAL::Object_index<Vertex_const_iterator> vertex_indices; \n\tCGAL_forall_vertices(v, NefPolyhedron)\n\t{\n\t\tif(nef_t::Infi_box::is_standard(v->point()))\n\t\t{\n\t\t\tPoint_3 mesh_point = v->point();\n\t\t\tpoints.push_back(k3d::point3(CGAL::to_double(mesh_point.x()), CGAL::to_double(mesh_point.y()), CGAL::to_double(mesh_point.z())));\n\t\t\tpoint_selection.push_back(0.0);\n\t\t\tvertex_indices[v] = points.size() - 1;\n\t\t}\n\t}\n\t\n\tnef_visitor<nef_t> V(*polyhedron, vertex_indices);\n\tVolume_const_handle c;\n\tCGAL_forall_volumes(c, NefPolyhedron)\n\t{\n\t\tif(skip_volumes-- <= 0)\n\t\t{\n\t\t\tNefPolyhedron.visit_shell_objects(SFace_const_handle(c->shells_begin()),V);\n\t\t}\n\t}\n}\n\n/// Converts a k3d mesh to a Nef polyhedron\n/**\n * Note: nef_t to mesh conversion based on the to_Polyhedron_3 conversion from Nef_Polyhedron_3.h in the CGAL distribution,\n * so part is (c) the authors of that file.\n */\ntemplate<typename nef_t>\nboost::shared_ptr<nef_t> to_nef(const k3d::mesh::points_t Points, const k3d::polyhedron::const_primitive& Polyhedron)\n{\n\ttypedef typename nef_t::SNC_structure SNC_structure;\n\tSNC_structure snc;\n\ttry\n\t{\n\t\tk3d_to_nef<nef_t>(Points, Polyhedron, snc);\n\t}\n\tcatch(std::exception& E)\n\t{\n\t\tk3d::log() << error << \"CGAL: Failed to convert to Nef: \" << E.what() << std::endl;\n\t\treturn boost::shared_ptr<nef_t>();\n\t}\n\tboost::shared_ptr<nef_t> nef(new nef_t(snc));\n\tnef->build_external_structure();\n\tnef->simplify();\n\treturn nef;\n}\n\n} // namespace cgal\n\n} // namespace module\n\n#endif // !MODULES_CGAL_CONVERSION_H\n"
  },
  {
    "path": "modules/cgal/k3d_to_nef.h",
    "content": "#ifndef MODULES_CGAL_K3D_TO_NEF_H\n#define MODULES_CGAL_K3D_TO_NEF_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// As a special exception, you have permission to link this program\n// with the CGAL (http://www.cgal.org) library and distribute executables, as long as you\n// follow the requirements of the GNU GPL in regard to all of the\n// software in the executable aside from CGAL.\n\n/** \\file\n\t\t\\brief Converts a K-3D mesh to a Nef polyhedron. Based on polyhedron_3_to_nef3 from CGAL\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"cgal_simplifying_constructors.h\"\n\n#include <CGAL/assertions.h>\n#include <CGAL/Gmpz.h>\n#include <CGAL/Homogeneous.h>\n#include <CGAL/Nef_3/SNC_structure.h>\n#include <CGAL/Nef_polyhedron_3.h>\n#include <CGAL/normal_vector_newell_3.h>\n#include <CGAL/to_rational.h>\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/polyhedron.h>\n\nnamespace module\n{\n\nnamespace cgal\n{\n\n/// Using standard integers, with the risk of overflow\n/**\n * The purpose of this kernel is to avoid creating points with coordinates that are to big to\n * represent in a 64 bit integer. Unfortunately, even when simplifying the homogeneous coordinates as much\n * as possible, this happens even in the simplest of cases when doing booleans.\n * TODO: See if we can use this with a number type that switches to Gmpz only when int64 overflows\n */\ntypedef simplifying_kernel<k3d::int64_t> int_kernel;\n/// Homogeneous kernel, using the GMP integer of arbitrary length. Robust but slow.\ntypedef CGAL::Homogeneous<CGAL::Gmpz> exact_kernel;\n/// Corresponding Nef polyhedron types\ntypedef CGAL::Nef_polyhedron_3<int_kernel, CGAL::SNC_indexed_items> int_nef;\ntypedef CGAL::Nef_polyhedron_3<exact_kernel, CGAL::SNC_indexed_items> exact_nef;\n\n/// Convert coordinates to the format of kernel_t\ntemplate<typename kernel_t>\nclass point_converter\n{\npublic:\n\t\n\ttypedef typename kernel_t::RT RT;\n\ttypedef typename kernel_t::Point_3 Point_3; \n\t\n\tpoint_converter() : m_factor(1e10)\n\t{\n\t}\n\t\n\tconst Point_3 operator()(const k3d::point3& Point)\n\t{\n\t\treturn Point_3(RT(static_cast<double>(k3d::round(Point[0]*m_factor))), RT(static_cast<double>(k3d::round(Point[1]*m_factor))), RT(static_cast<double>(k3d::round(Point[2]*m_factor))), RT(static_cast<double>(m_factor)));\n\t}\n\nprivate:\n\t/// Factor to multiply by before rounding off \n\tconst k3d::double_t m_factor;\n};\n\n/// Returns the plane containing the face given to operator()\ntemplate<typename kernel_t>\nclass face_plane\n{\n\ttypedef typename kernel_t::Point_3 Point_3;\n\ttypedef typename kernel_t::Vector_3 Vector_3;\n\ttypedef typename kernel_t::Plane_3 Plane_3;\n\ttypedef std::vector<Point_3> points_t;\npublic:\n\tface_plane(const k3d::polyhedron::const_primitive& Polyhedron, const points_t& Points) : m_polyhedron(Polyhedron), m_points(Points) {}\n\t\n  typename kernel_t::Plane_3 operator()(size_t FirstLoop) {\n\t\t\n\t\tstd::vector<size_t> corners;\n\t\tpoints_t corner_points;\n\t\tsize_t first_edge = m_polyhedron.loop_first_edges[FirstLoop];\n\t\tfor(size_t edge = first_edge; ; )\n\t\t{\n\t\t\tsize_t point = m_polyhedron.vertex_points[edge];\n\t\t\tcorner_points.push_back(m_points[point]);\n\t\t\t\n\t\t\tedge = m_polyhedron.clockwise_edges[edge];\n\t\t\tif(edge == first_edge)\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif (corner_points.size() < 3)\n\t\t\tthrow std::runtime_error(\"face_plane: Error determining plane: less than 3 points\");\n\t\t\n\t\tVector_3 n;\n\t\t\n\t\tCGAL::normal_vector_newell_3(corner_points.begin(), corner_points.end(), n);\n\t\t\n\t\tPlane_3 plane(corner_points[0], n);\n\t\tif(plane.is_degenerate())\n\t\t{\n\t\t\tstd::stringstream error_message;\n\t\t\terror_message << \"face_plane: Degenerate plane with normal \" << n;\n\t\t\tthrow std::runtime_error(error_message.str());\n\t\t}\n\t\t\n    return plane;\n  }\n  \n  const k3d::polyhedron::const_primitive& m_polyhedron;\n  const points_t& m_points;\n};\n\ntemplate<typename nef_t>\nvoid k3d_to_nef(const k3d::mesh::points_t& Points, const k3d::polyhedron::const_primitive& Polyhedron, typename nef_t::SNC_structure& S)\n{\n\ttypedef typename nef_t::Kernel Kernel;\n\ttypedef typename nef_t::Plane_3 Plane_3;\n\ttypedef typename nef_t::Vector_3 Vector_3;\n\ttypedef typename nef_t::Point_3 Point_3;\n\ttypedef std::vector<Point_3> points_t;\n\t\n\ttypedef typename nef_t::SNC_structure\t\t\t\t\t\t\tSNC_structure;\n  typedef typename SNC_structure::SNC_decorator      SNC_decorator;\n  typedef typename SNC_structure::SM_decorator       SM_decorator;\n  typedef typename SNC_structure::Vertex_handle      Vertex_handle;\n  typedef typename SNC_structure::SVertex_handle     SVertex_handle;\n  typedef typename SNC_structure::SHalfedge_handle   SHalfedge_handle;\n  typedef typename SNC_structure::SFace_handle       SFace_handle;\n  typedef typename SNC_structure::Sphere_point       Sphere_point;\n  typedef typename SNC_structure::Sphere_segment     Sphere_segment;\n  typedef typename SNC_structure::Sphere_circle      Sphere_circle;\n  typedef std::vector<SHalfedge_handle> \t\tindices_t;\n\n\tpoints_t points;\n\t\n\tpoint_converter<Kernel> converter;\n\t\n\t// Convert to Point_3 representation\n\tfor (size_t point = 0; point != Points.size(); ++point)\n\t{ \n\t\tpoints.push_back(converter(Points[point]));\n\t}\n\t\n\tstd::vector<Plane_3> planes(Polyhedron.face_first_loops.size());\n  \n\tstd::transform(Polyhedron.face_first_loops.begin(), Polyhedron.face_first_loops.end(),\n\t\tplanes.begin(), face_plane<Kernel>(Polyhedron, points));\n\t\n\t// Calculate companions\n\tk3d::mesh::indices_t companions;\n\tk3d::mesh::bools_t boundary_edges;\n\tk3d::polyhedron::create_edge_adjacency_lookup(Polyhedron.vertex_points, Polyhedron.clockwise_edges, boundary_edges, companions);\n\t\n\t// Provide an edge-to-face link\n\tk3d::mesh::indices_t face_for_edge;\n\tk3d::polyhedron::create_edge_face_lookup(Polyhedron, face_for_edge);\n\t\n\t// Store an incoming edge for each point\n\tk3d::mesh::indices_t first_in_edges(points.size());\n\tsize_t edge_count = Polyhedron.vertex_points.size();\n\tfor (size_t edge = 0; edge != edge_count; ++edge)\n\t\tfirst_in_edges[Polyhedron.vertex_points[Polyhedron.clockwise_edges[edge]]] = edge;\n\t\n\tindices_t indices(Polyhedron.vertex_points.size()); // for indexed items\n  for (size_t point = 0; point != points.size(); ++point)\n  {\n\t  Vertex_handle nv = S.new_vertex();\n\t  Point_3 pvpoint = points[point];\n\t\tnv->point() = pvpoint;\n\t\tnv->mark() = true;\n\n\t\tSM_decorator SM(&*nv);\n\t\tsize_t prev_edge = first_in_edges[point];\n\t\tsize_t edge = prev_edge;\n\t\tsize_t first_edge = prev_edge;\n\t\tPoint_3 pe_target_0 = points[Polyhedron.vertex_points[first_edge]];\n\t\tPoint_3 sp_point_0(CGAL::ORIGIN+(pe_target_0-pvpoint));\n\t\tSphere_point sp_0(sp_point_0);\n\t\tSVertex_handle sv_0 = SM.new_svertex(sp_0);\n\t\tsv_0->mark() = true; \n\t\tedge = companions[Polyhedron.clockwise_edges[edge]];\n\n\t\tSVertex_handle sv_prev = sv_0;\n\n    do {\n      Point_3 pe_target = points[Polyhedron.vertex_points[edge]];\n      Point_3 sp_point = CGAL::ORIGIN+(pe_target-pvpoint);\n      Sphere_point sp(sp_point);\n      SVertex_handle sv = SM.new_svertex(sp);\n      sv->mark() = true;\n      Plane_3 ss_plane(CGAL::ORIGIN, planes[face_for_edge[prev_edge]].opposite().orthogonal_vector());\n      Sphere_circle ss_circle(ss_plane);\n\n      SHalfedge_handle e = SM.new_shalfedge_pair(sv_prev, sv);\n      e->circle() = ss_circle;\n      e->twin()->circle() = ss_circle.opposite();\n      e->mark() = e->twin()->mark() = true;\n  \n  \t\tindices[prev_edge] = e;\n  \n      sv_prev = sv;\n      prev_edge = edge;\n      edge = companions[Polyhedron.clockwise_edges[edge]];\n    }\n    while(edge != first_edge);\n\n    Plane_3 ss_plane(CGAL::ORIGIN, planes[face_for_edge[prev_edge]].opposite().orthogonal_vector());\n    Sphere_circle ss_circle(ss_plane);\n \n    SHalfedge_handle e = SM.new_shalfedge_pair(sv_prev, sv_0);\n    e->circle() = ss_circle;\n    e->twin()->circle() = ss_circle.opposite();\n    e->mark() = e->twin()->mark() = true;\n    \n    indices[prev_edge] = e;\n\n    // create faces\n    SFace_handle fint = SM.new_sface();\n    SFace_handle fext = SM.new_sface();\n    SM.link_as_face_cycle(e, fint);\n    SM.link_as_face_cycle(e->twin(), fext);\n    \n    // mark faces properly...\n    fint->mark() = true;\n    fext->mark() = false;\n    SM.check_integrity_and_topological_planarity();   \n  }\n  \n  // resolve indices  \n  for (size_t face = 0; face != Polyhedron.face_first_loops.size(); ++face)\n\t{\n  \tint se, set;\n\t\tfor (size_t loop = 0; loop != Polyhedron.face_loop_counts[face]; ++loop)\n\t\t{\n\t\t\tsize_t first_edge = Polyhedron.loop_first_edges[Polyhedron.face_first_loops[face] + loop];\n\t\t\tif (loop == 0)\n\t\t\t{\n\t\t\t\tindices[first_edge]->set_index();\n\t\t    indices[first_edge]->twin()->set_index();\n\t\t    se  = indices[first_edge]->get_index();\n\t\t    set = indices[first_edge]->twin()->get_index();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tindices[first_edge]->set_index(se);\n\t\t    indices[first_edge]->twin()->set_index(set);\n\t\t\t}\n\t    indices[first_edge]->twin()->source()->set_index();\n\t    int sv  = indices[first_edge]->twin()->source()->get_index();\n\t\t\tfor(size_t edge = Polyhedron.clockwise_edges[first_edge]; ; )\n\t\t\t{\n\t\t\t\tindices[edge]->set_index(se);\n\t\t\t\tindices[edge]->twin()->set_index(set);\n\t\t\t\tindices[edge]->source()->set_index(sv);\n\t\t\t\tindices[edge]->twin()->source()->set_index();\n\t\t\t\tsv = indices[edge]->twin()->source()->get_index();\t\t\t\t\n\n\t\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tindices[first_edge]->source()->set_index(sv);\n\t\t}\n\t}\n}\n\n} // namespace cgal\n\n} // namespace module\n\n#endif // !MODULES_CGAL_K3D_TO_NEF_H\n"
  },
  {
    "path": "modules/cgal/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace cgal\n{\n\nextern k3d::iplugin_factory& boolean_factory();\n\n} // namespace cgal\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::cgal::boolean_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/cloth/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-cloth)\nK3D_CREATE_MODULE_PROXY(k3d-cloth)\n"
  },
  {
    "path": "modules/cloth/cloth_solver.h",
    "content": "#ifndef MODULES_CLOTH_CLOTH_SOLVER_H\n#define MODULES_CLOTH_CLOTH_SOLVER_H\n\n#include <vector>\n#include <iostream>\n#include \"particle.h\"\n#include \"d_Vecf.h\"\n\n/*helper functions to locate particle positions and velocities\n  within the X and f vectors*/\nunsigned P(unsigned p, unsigned c) { return 3*p*2+c; }\nunsigned V(unsigned p, unsigned c) { return 3*p*2+3+c; }\n\nusing namespace std;\n\nclass cloth_solver\n{\npublic:\n\tcloth_solver(unsigned num)\n\t{\n\t\tParticle tmp(0);\n\t\tfor (int i=0; i<num; i++) \n\t\t\tparticles.push_back(tmp);\n\n\t\tfor (int i=0; i<num; i++)\n\t\t\tparticles[i].m = 2/(float)num;\n\t\t\n\t\tf.set_size(6*num);\n\t\tX.set_size(6*num);\n\t\tpnum = num;\n\t\tt=0;\n\t\tks = 20;\n\t\tvd = 2;\n\t\tgravity = -9.81;\n\t\tdamping = 2;\n\t\tstiffness = 20;\n\t}\n\t\n\tvoid set_constants(double g, double d, double s)\n\t{\n\t\tgravity = g;\n\t\tdamping = d;\n\t\tstiffness = s;\n\t}\n\t\n\tvoid generate_particles(k3d::mesh::points_t Points)\n\t{\n\t\tfor(int i=0; i<Points.size(); i++)\n\t\t\tfor(int j=0; j<3; j++)\n\t\t\t{\n\t\t\t\tparticles[i].x[j] = Points[i][j];\n\t\t\t\tparticles[i].v[j] = 0;\n\t\t\t}\n\t}\n\n\tvoid update_vertices(k3d::mesh::points_t& Points)\n\t{\n\t\tfor(int i=0; i<Points.size(); i++)\n\t\t\tfor(int j=0; j<3; j++)\n\t\t\t\tPoints[i][j] = particles[i].x[j];\n\n\t}\n\n\tvoid compute_accelerations(d_Vecf Y, d_Vecf *out, const k3d::mesh::selection_t& PointSelection)\n\t{\n\t\tstatic d_Vecf W;\n\t\td_Vec3f tmp = d_Vec3f(0,0,0);\n\t\td_Vec3f p1, p2;\n\t\tW.set_size(6*pnum);\n\t\tfloat eightrt = sqrt(8);\n\t\tks = stiffness;\n\t\tfor(int i=0; i<pnum; i++)\n\t\t{\n\t\t\tp1 = d_Vec3f(Y[P(i,0)], Y[P(i,1)], Y[P(i,2)]);\n\t\t\t//if(i!=0 && i!=5)\n\t\t\t//\ttmp = add_gravity(particles[i].m, -9.81);\n\t\t\t//else\n\t\t\ttmp = add_gravity(particles[i].m, gravity);\n\n\t\t\t//if(i>0&&i<5)\n\t\t\t{\n\t\t\t\t//p2 = d_Vec3f(Y[P(i-1,0)], Y[P(i-1,1)], Y[P(i-1,2)]);\n\t\t\t\t//tmp = tmp + add_spring(p1, p2, ks, 2);\n\t\t\t\t//p2 = d_Vec3f(Y[P(i+1,0)], Y[P(i+1,1)], Y[P(i+1,2)]);\n\t\t\t\t//tmp = tmp + add_spring(p1, p2, ks, 2);\n\t\t\t\t//std::cout << \"BLA: \" << abs(p2[0]-p1[0]) << std::endl;\n\t\t\t}\n\n/////////////////////////////////////\n\n\t\t\tif(i>5)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i-6,0)], Y[P(i-6,1)], Y[P(i-6,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, 2);\n\t\t\t}\n\n\t\t\tif(i<30)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i+6,0)], Y[P(i+6,1)], Y[P(i+6,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, 2);\n\t\t\t}\n\n\t\t\tif(i%6 != 0)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i-1,0)], Y[P(i-1,1)], Y[P(i-1,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, 2);\n\t\t\t}\n\n\t\t\tif((i-5)%6 !=0)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i+1,0)], Y[P(i+1,1)], Y[P(i+1,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, 2);\n\t\t\t}\n\n/////////////////////////////////////////\n\n\t\t\tif(i>5 && (i-5)%6 !=0)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i-5,0)], Y[P(i-5,1)], Y[P(i-5,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, eightrt);\n\t\t\t}\n\n\t\t\tif(i>5 && i%6 !=0)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i-7,0)], Y[P(i-7,1)], Y[P(i-7,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, eightrt);\n\t\t\t}\n\t\t\t\t\n\t\t\tif(i<30 && (i-5)%6 !=0)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i+7,0)], Y[P(i+7,1)], Y[P(i+7,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, eightrt);\n\t\t\t}\n\n\t\t\tif(i<5 && i%6 !=0)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i+5,0)], Y[P(i+5,1)], Y[P(i+5,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, eightrt);\n\t\t\t}\n\n/////////////////////////////////////////\n\t\t\tif(i<24)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i+12,0)], Y[P(i+12,1)], Y[P(i+12,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, 4);\n\t\t\t}\n\t\t\t\n\t\t\tif(i>11)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i-12,0)], Y[P(i-12,1)], Y[P(i-12,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, 4);\n\t\t\t}\n\n\t\t\tif((i-5)%6 !=0 && (i-4)%6 !=0)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i+2,0)], Y[P(i+2,1)], Y[P(i+2,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, 4);\n\t\t\t}\n\n\t\t\tif(i%6 !=0 && (i-1)%6 !=0)\n\t\t\t{\n\t\t\t\tp2 = d_Vec3f(Y[P(i-2,0)], Y[P(i-2,1)], Y[P(i-2,2)]);\n\t\t\t\ttmp = tmp + add_spring(p1, p2, ks, 4);\n\t\t\t}\n///////////////////////////////////////////\n\t\t\t\n\t\t\ttmp = tmp + add_damping(d_Vec3f(Y[V(i,0)], Y[V(i,1)], Y[V(i,2)]), damping);\n\n\n\t\t\tif(PointSelection.at(i)==1)\n\t\t\t\ttmp = d_Vec3f(0,0,0);\n\t\t\t//if(i==25)\n\t\t\t//\ttmp = d_Vec3f(0,0,0);\n\n\t\t\t//if(i < 30)\n\t\t\t//{\n\t\t\t//\tp2 = d_Vec3f(Y[P(i-6,0)], Y[P(i-6,1)], Y[P(i-6,2)]);\n\t\t\t//\ttmp = add_spring(p1,p2,ks,len(particles[i].x-particles[i-6].x));\n\t\t\t//}\n\t\n\t\t\tW[P(i, 0)]= Y[V(i,0)];\n\t\t\tW[P(i, 1)]= Y[V(i,1)];\n\t\t\tW[P(i, 2)]= Y[V(i,2)];\n\t\t\tW[V(i, 0)]= tmp[0]/particles[i].m;\n\t\t\tW[V(i, 1)]= tmp[1]/particles[i].m;\n\t\t\tW[V(i, 2)]= tmp[2]/particles[i].m;\n\t\t}\n\t\t*out= W;\n\t}\n\n\tvoid get_state()\n\t{\n\t\tfor (int i=0; i<particles.size(); i++) \n\t\t{\n\t\t\tX[P(i,0)]= particles[i].x[0];\n\t\t\tX[P(i,1)]= particles[i].x[1];\n\t\t\tX[P(i,2)]= particles[i].x[2];\n\t\t\tX[V(i,0)]= particles[i].v[0];\n\t\t\tX[V(i,1)]= particles[i].v[1];\n\t\t\tX[V(i,2)]= particles[i].v[2];\n\t\t}\n\t}\n\n\tvoid set_state()\n\t{\n\t\tfor (int i=0; i<particles.size(); i++) \n\t\t{\n\t\t\tparticles[i].t += t;\n\t\t\tparticles[i].x[0]= X[P(i,0)];\n\t\t\tparticles[i].x[1]= X[P(i,1)];\n\t\t\tparticles[i].x[2]= X[P(i,2)];\n\t\t\tparticles[i].v[0]= X[V(i,0)];\n\t\t\tparticles[i].v[1]= X[V(i,1)];\n\t\t\tparticles[i].v[2]= X[V(i,2)];\n\t\t}\n\t}\n\n\tvoid rk_step(float dt, const k3d::mesh::selection_t& PointSelection)\n\t{\n\t\t//for(int i=0; i<pnum; i++)\n\t\t//\tparticles[i].x = particles[i].x + d_Vec3f(0,0,dt);\n\t\tstatic d_Vecf k1, k2, k3, k4;\n\t\tk1.set_size(6*pnum);\n\t\tk2.set_size(6*pnum);\n\t\tk3.set_size(6*pnum);\n\t\tk4.set_size(6*pnum);\n\t\tget_state();\n\t\tcompute_accelerations(X, &k1, PointSelection);\n\t\tk1 = k1*dt;\n\t\tcompute_accelerations(X+k2/2, &k2, PointSelection);\n\t\tk2 = k2*dt;\n\t\tcompute_accelerations(X+k2/2, &k3, PointSelection);\n\t\tk3 = k3*dt;\n\t\tcompute_accelerations(X+k3, &k4, PointSelection);\n\t\tk4 = k4*dt;\n\t\tX = X + k1/6 + k2/3 + k3/3 + k4/6;\n\t\tt=dt;\n\t\tset_state();\n\t}\n\n\tunsigned S(unsigned r, unsigned c){ return r*pnum/(int)sqrt(pnum)+c; }\n\n\tvector<Particle> particles;\n\td_Math::d_Vec3f generator;\n\tint pnum;\n\td_Vecf X;\n\td_Vecf f;\n\tint w, h;\n\tfloat r;\n\tfloat t;\n\tdouble ks;\n\tfloat vd;\n\tdouble gravity;\n\tdouble damping;\n\tdouble stiffness;\n};\n\n#endif // !MODULES_CLOTH_CLOTH_SOLVER_H\n\n"
  },
  {
    "path": "modules/cloth/d_Vec3f.h",
    "content": "#ifndef MODULES_CLOTH_D_VEC3F_H\n#define MODULES_CLOTH_D_VEC3F_H\n\nnamespace d_Math\n{\n\tclass d_Vec3f\n\t{\n\tpublic:\n\t\tfloat p[3];\n\n\t\td_Vec3f()  //Initialize to zero everything\n\t\t{\n\t\t\tp[0] = p[1] = p[2] = 0;\n\t\t}\n\n\t\td_Vec3f(float x, float y, float z) //Put values\n\t\t{\n\t\t\tp[0]=x;p[1]=y;p[2]=z;\n\t\t}\n\n\t\td_Vec3f(const d_Vec3f &v) //Copy constructor\n\t\t{\n\t\t\tp[0] = v[0];\n\t\t\tp[1] = v[1];\n\t\t\tp[2] = v[2];\n\t\t}\n\n\t\tfloat &operator [] (int i)\n\t\t{\n\t\t\tif(i>3)\n\t\t\t{\n\t\t\t\tstd::cout << \"Bad index for vector!\" << std::endl;\n\t\t\t\treturn p[0];\n\t\t\t}\n\t\t\treturn p[i];\n\t\t}\n\n\t\tfloat operator [] (int i) const\n\t\t{\n\t\t\tif(i>3)\n\t\t\t{\n\t\t\t\tstd::cout << \"Bad index for vector!\" << std::endl;\n\t\t\t\treturn p[0];\n\t\t\t}\n\t\t\treturn p[i];\n\t\t}\n\n\t\td_Vec3f operator + (const d_Vec3f& v) const\n\t\t{\n\t\t\td_Vec3f res(p[0]+v[0], p[1]+v[1], p[2]+v[2]);\n\t\t\treturn res;\n\t\t}\n\n\t\td_Vec3f operator - (const d_Vec3f& v) const\n\t\t{\n\t\t\td_Vec3f res(p[0]-v[0], p[1]-v[1], p[2]-v[2]);\n\t\t\treturn res;\n\t\t}\n\n\t\td_Vec3f operator * (const float a) const\n\t\t{\n\t\t\td_Vec3f res(p[0]*a, p[1]*a, p[2]*a);\n\t\t\treturn res;\n\t\t}\n\n\t\td_Vec3f operator / (const float a) const\n\t\t{\n\t\t\td_Vec3f res(p[0]/a, p[1]/a, p[2]/a);\n\t\t\treturn res;\n\t\t}\n\n\t};\n\n\tfloat len(const d_Vec3f& a)\n\t{\n\t\treturn sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2]);\n\t}\n}\n\n#endif // !MODULES_CLOTH_D_VEC3F_H\n\n"
  },
  {
    "path": "modules/cloth/d_Vecf.h",
    "content": "#ifndef MODULES_CLOTH_D_VECF_H\n#define MODULES_CLOTH_D_VECF_H\n\n#include <math.h>\n\nnamespace d_Math\n{\n\tclass d_Vecf\n\t{\n\tpublic:\n\t\tfloat *p;\n\t\tint vec_size;\n\n\t\td_Vecf() : p(0), vec_size(0)\n\t\t{\n\t\t}\n\t\t\n\t\td_Vecf(const d_Vecf& other) : p(0)\n\t\t{\n\t\t\tset_size(other.vec_size);\n\t\t\tfor(int i = 0; i != vec_size; ++i)\n\t\t\t\tp[i] = other.p[i];\n\t\t}\n\t\t\n\t\t~d_Vecf()\n\t\t{\n\t\t\tif(p)\n\t\t\t\tdelete[] p;\n\t\t}\n\n\t\tvoid set_size(int size)\n\t\t{\n\t\t\tif(!p)\n\t\t\t{\n\t\t\t\tp = new float[size];\n\t\t\t\tvec_size = size;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfloat *tmp = new float[size];\n\t\t\t\tint iter=0;\n\t\t\t\tif(size > vec_size)\n\t\t\t\t\titer = vec_size;\n\t\t\t\telse\n\t\t\t\t\titer = size;\n\t\t\t\tfor(int i=0; i<iter; i++)\n\t\t\t\t{\n\t\t\t\t\ttmp[i] = p[i];\n\t\t\t\t}\n\t\t\t\tdelete[] p;\n\t\t\t\tp = tmp;\n\t\t\t\tvec_size = size;\n\t\t\t}\n\t\t}\n\n\t\tfloat &operator [] (int index) {return p[index];}\n\n\t\td_Vecf operator = (d_Vecf a) \n\t\t{\n\t\t\tif(vec_size != a.vec_size)\n\t\t\t\tset_size(a.vec_size);\n\t\t\tfor (int i=0; i<vec_size; i++) \n\t\t\t{\n\t\t\t\tp[i] = a.p[i];\n\t\t\t}\n\t\t\treturn *this;\n\t\t}\n\n\t\td_Vecf operator + (d_Vecf a)\n\t\t{\n\t\t\td_Vecf aux;\n\t\t\taux.set_size(vec_size);\n\t\t\tfor(int i=0; i<vec_size; i++)\n\t\t\t\taux[i] = p[i] + a[i];\n\t\t\treturn aux;\n\t\t}\n\n\t\td_Vecf operator - (d_Vecf a)\n\t\t{\n\t\t\td_Vecf aux;\n\t\t\taux.set_size(vec_size);\n\t\t\tfor(int i=0; i<vec_size; i++)\n\t\t\t\taux[i] = p[i] - a[i];\n\t\t\treturn aux;\n\t\t}\n\n\t\td_Vecf operator * (float a)\n\t\t{\n\t\t\td_Vecf aux;\n\t\t\taux.set_size(vec_size);\n\t\t\tfor(int i=0; i<vec_size; i++)\n\t\t\t\taux[i] = p[i] * a;\n\t\t\treturn aux;\n\t\t}\n\n\t\td_Vecf operator / (float a)\n\t\t{\n\t\t\td_Vecf aux;\n\t\t\taux.set_size(vec_size);\n\t\t\tfor(int i=0; i<vec_size; i++)\n\t\t\t\taux[i] = p[i] / a;\n\t\t\treturn aux;\n\t\t}\n\n\t\td_Vecf operator + (void) const\n\t\t{\n\t\t\treturn *this;\n\t\t}\t\t\n\n\t\td_Vecf operator - (void) const\n\t\t{\n\t\t\td_Vecf aux;\n\t\t\taux.set_size(vec_size);\n\t\t\tfor(int i=0; i<vec_size; i++)\n\t\t\t\taux[i] = -p[i];\n\t\t\treturn aux;\n\t\t}\n\t};\n}\n\n#endif // !MODULES_CLOTH_D_VECF_H\n\n"
  },
  {
    "path": "modules/cloth/particle.h",
    "content": "#ifndef MODULES_CLOTH_PARTICLE_H\n#define MODULES_CLOTH_PARTICLE_H\n\n#include \"d_Vec3f.h\"\n\nusing namespace d_Math;\n\nclass Particle\n{\npublic:\n\tParticle(int ind)\n\t{\n\t\tx = v = f = n =  d_Vec3f(0,0,0);\n\t\tm = .018;\n\t\tindex = ind;\n\t}\n\n\tParticle(int ind, d_Vec3f pos, d_Vec3f vel, float ms)\n\t{\n\t\tx = pos;\n\t\tv = vel;\n\t\tf = d_Math::d_Vec3f(0,0,0);\n\t\tm = ms;\n\t\tindex = ind;\n\t}\n\n\td_Vec3f x;\n\td_Vec3f v;\n\td_Vec3f n;\n\td_Vec3f f;\n\tfloat m;\n\tfloat t;\n\tint index;\n};\n\nd_Vec3f add_gravity(float g, float m)\n{\n\treturn d_Vec3f(0, 0, g*m);\n}\n\nd_Vec3f add_spring(d_Vec3f p1, d_Vec3f p2, float k, float r)\n{\n\t//d_Vec3f d = p1-p2;\n\t//return d*(-k)*(len(d)-r)/len(d);\n\td_Vec3f d = p1-p2;\n\treturn d*((-k*(len(d)-r))/len(d));\n}\n\nd_Vec3f add_damping(d_Vec3f x, float k)\n{\n\treturn x*(-k);\n}\n\n#endif // !MODULES_CLOTH_PARTICLE_H\n\n"
  },
  {
    "path": "modules/cloth/simulation.cpp",
    "content": "\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc at gmail dot com)\n*/\n\n\n#include <k3dsdk/module.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_deformation_modifier.h>\n\n#include \"d_Vec3f.h\"\n#include \"cloth_solver.h\"\n\nnamespace module\n{\n\nnamespace cloth\n{\n\nclass simulation :\n\tpublic k3d::mesh_deformation_modifier\n{\n\ttypedef k3d::mesh_deformation_modifier base;\npublic:\n\tsimulation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_time(init_owner(*this) + init_name(\"time\") + init_label(_(\"Time\")) + init_description(_(\"Controls the current time displayed in the viewports.\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::time))),\n\t\tm_damping(init_owner(*this) + init_name(\"damping\") + init_label(_(\"Damping\")) + init_description(_(\"Damping of cloth\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_gravity(init_owner(*this) + init_name(\"gravity\") + init_label(_(\"Gravity\")) + init_description(_(\"Gravity to affect the system\")) + init_value(-9.81) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_stiffness(init_owner(*this) + init_name(\"stiffness\") + init_label(_(\"Stiffness\")) + init_description(_(\"Stiffness of cloth (k constant for spring structure)\")) + init_value(20) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_time.changed_signal().connect(make_update_mesh_slot());\n\t\tfirst_time = true;\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh& InputMesh, const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst double damping = m_damping.pipeline_value();\n\t\tconst double gravity = m_gravity.pipeline_value();\n\t\tconst double stiffness = m_stiffness.pipeline_value();\n\t\t//const k3d::mesh::indices_t& face_first_loops = *InputMesh.polyhedra->face_first_loops;\n\t\t//const k3d::mesh::indices_t& loop_first_edges = *InputMesh.polyhedra->loop_first_edges;\n\t\t//const k3d::mesh::indices_t& edge_points = *InputMesh.polyhedra->edge_points;\n\n\t\tif(first_time)\n\t\t{\n\t\t\tsolver = new cloth_solver(36);\n\t\t\tsolver->generate_particles(InputPoints);\n\t\t\tfirst_time = false;\n\t\t}\t\t\n\t\telse\n\t\t{\t\n\t\t\tsolver->set_constants(gravity, damping, stiffness);\n\n\t\t\tfor(int i=0; i<10; i++)\n\t\t\t\tsolver->rk_step(0.003, PointSelection);\n\t\t}\n\t\t\n\t\tsolver->update_vertices(OutputPoints);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<simulation,\n\t\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xd6a72aa4, 0x9e426c45, 0x2429eaab, 0x634a2ff8),\n\t\t\t\t\"ClothSimulation\",\n\t\t\t\t_(\"Cloth simulation (currently for grids only)\"),\n\t\t\t\t\"Simulation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\tk3d_data(double, immutable_name, change_signal, no_undo, local_storage, no_constraint, measurement_property, with_serialization) m_time;\n\tk3d_data(double, immutable_name, change_signal, no_undo, local_storage, no_constraint, measurement_property, with_serialization) m_damping;\n\tk3d_data(double, immutable_name, change_signal, no_undo, local_storage, no_constraint, measurement_property, with_serialization) m_gravity;\n\tk3d_data(double, immutable_name, change_signal, no_undo, local_storage, no_constraint, measurement_property, with_serialization) m_stiffness;\n\tcloth_solver *solver;\n\tbool first_time;\n};\n\n} // namespace cloth\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n        Registry.register_factory(module::cloth::simulation::get_factory());\nK3D_MODULE_END\n\n\n"
  },
  {
    "path": "modules/collada_io/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_COLLADA_INCLUDE_DIRS})\n\nK3D_BUILD_MODULE(k3d-collada-io)\nK3D_CREATE_MODULE_PROXY(k3d-collada-io)\n\nTARGET_LINK_LIBRARIES(k3d-collada-io\n\t${K3D_COLLADA_LIBS}\n\t${K3D_XML_LIB}\n\t${Boost_FILESYSTEM_LIBRARY}\n\t${Boost_SYSTEM_LIBRARY}\n\t)\n"
  },
  {
    "path": "modules/collada_io/collada.cpp",
    "content": "#include \"collada.h\"\n\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\nnamespace collada\n{\nnamespace io\n{\n\n\t// \"myGeom\" --> \"#myGeom\"\n\tstd::string makeUriRef(const std::string& id) \n\t{\n\t\treturn std::string(\"#\") + id;\n\t}\n\t\n\tstd::string removeSpaces(std::string str)\n\t{\n\t\tfor(int i=0; i<str.length(); i++)\n\t\t\tif(str[i]==' ')\n\t\t\t\tstr[i]='_';\n\t\treturn str;\n\t}\n\n\tvoid addSource(daeElement* mesh, const std::string& srcID, const std::string& paramNames, domFloat values[], int valueCount)\n\t{\n\t\tSafeAdd(mesh, \"source\", src);\n\t\tsrc->setAttribute(\"id\", srcID.c_str());\n\t\n\t\tdomFloat_array* fa = daeSafeCast<domFloat_array>(src->add(\"float_array\"));\n\t\tfa->setId((src->getAttribute(\"id\") + \"-array\").c_str());\n\t\tfa->setCount(valueCount);\n\t\tfa->getValue() = rawArrayToDaeArray(values, valueCount);\n\t\n\t\tdomAccessor* acc = daeSafeCast<domAccessor>(src->add(\"technique_common accessor\"));\n\t\tacc->setSource(makeUriRef(fa->getId()).c_str());\n\t\n\t\tstd::list<std::string> params = cdom::tokenize(paramNames, \" \");\n\t\tacc->setStride(params.size());\n\t\tacc->setCount(valueCount/params.size());\n\t\tfor (cdom::tokenIter iter = params.begin(); iter != params.end(); iter++) \n\t\t{\n\t\t\tSafeAdd(acc, \"param\", p);\n\t\t\tp->setAttribute(\"name\", iter->c_str());\n\t\t\tp->setAttribute(\"type\", \"float\");\n\t\t}\n\t}\n\t\n\tvoid addInput(daeElement* triangles, const std::string& semantic, const std::string& srcID, int offset) \n\t{\n\t\tdomInputLocalOffset* input = daeSafeCast<domInputLocalOffset>(triangles->add(\"input\"));\n\t\tinput->setSemantic(semantic.c_str());\n\t\tinput->setOffset(offset);\n\t\tinput->setSource(makeUriRef(srcID).c_str());\n\t\tif (semantic == \"TEXCOORD\")\n\t\t\tinput->setSet(0);\n\t}\n\t\n\tvoid addGeometry(daeElement* library_geometries, const std::string &name, k3d::mesh *mesh) \n\t{\n\t\tSafeAdd(library_geometries, \"geometry\", geom);\n\t\tgeom->setAttribute(\"id\", removeSpaces(name).c_str());\n\t\tgeom->setAttribute(\"name\", removeSpaces(name).c_str());\n\t\tSafeAdd(geom, \"mesh\", gmesh);\n\t\n\t\t// Add the position data\n\t\n\t\tdomFloat posArray[mesh->points->size()*3];\n\t\tfor(int i=0; i<mesh->points->size(); i++)\n\t\t\tfor(int j=0; j<3;j++)\n\t\t\t\tposArray[i*3+j] = mesh->points->at(i)[j];\n\t\n\t\tint count = sizeof(posArray)/sizeof(posArray[0]);\n\t\n\t\taddSource(gmesh, removeSpaces(name) + \"-positions\", \"X Y Z\", posArray, count);\n\t\n\t\t// Add the <vertices> element\n\t\tSafeAdd(gmesh, \"vertices\", vertices);\n\t\tvertices->setAttribute(\"id\", (removeSpaces(name) + \"-vertices\").c_str());\n\t\tSafeAdd(vertices, \"input\", verticesInput);\n\t\tverticesInput->setAttribute(\"semantic\", \"POSITION\");\n\t\tverticesInput->setAttribute(\"source\", makeUriRef(removeSpaces(name) + \"-positions\").c_str());\n\t\n\t\t// Store polyhedra ...\n\t\tstd::vector<domUint> ind;\n\t\tstd::vector<domUint> vcou;\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != mesh->primitives.size(); ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, *mesh->primitives[prim_idx]));\n\t\t\tif(polyhedron)\n\t\t\t{\n\t\t\t\tconst size_t face_begin = 0;\n\t\t\t\tconst size_t face_end = polyhedron->face_first_loops.size();\n\t\t\t\tfor(size_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tconst size_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\t\tconst size_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\t\tfor(size_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst size_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\t\tsize_t face_size = 0;\n\t\t\t\t\t\tfor(size_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tind.push_back(polyhedron->vertex_points[edge]);\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tface_size++;\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvcou.push_back(face_size);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/** \\todo Support faces with holes */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdomPolylist* polylist = daeSafeCast<domPolylist>(gmesh->add(\"polylist\"));\n\t\t\t\tpolylist->setMaterial(\"mtl\");\n\t\t\t\tpolylist->setCount(face_end);\n\t\t\t\tdomPolylist::domVcount *vcount = daeSafeCast<domPolylist::domVcount>(polylist->add(\"vcount\"));\n\n\t\t\t\taddInput(polylist, \"VERTEX\",   removeSpaces(name) + \"-vertices\", 0);\n\t\t\t\t//addInput(polylist, \"NORMAL\",   geomID + \"-normals\",  1);\n\t\t\t\t//addInput(polylist, \"TEXCOORD\", geomID + \"-uv\",       2);\n\n\t\t\t\tdomP* p = daeSafeCast<domP>(polylist->add(\"p\"));\n\t\t\t\tdomUint index[ind.size()];\n\t\t\t\tfor(int i=0; i<ind.size(); i++)\n\t\t\t\t\tindex[i] = ind[i];\n\t\t\t\tdomUint vcount_tmp[vcou.size()];\n\t\t\t\tfor(int i=0; i<vcou.size(); i++)\n\t\t\t\t\tvcount_tmp[i] = vcou[i];\n\n\t\t\t\tp->getValue() = rawArrayToDaeArray(index, ind.size());\n\t\t\t\tvcount->getValue() = rawArrayToDaeArray(vcount_tmp, vcou.size());\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid addMeshInstance(daeElement * visualScene, k3d::inode *inode) \n\t{\n\t\t// Add a <node> with a simple transformation\n\t\tSafeAdd(visualScene, \"node\", node);\n\t\tnode->setAttribute(\"id\", removeSpaces(inode->name()).c_str());\n\t\tnode->setAttribute(\"name\", removeSpaces(inode->name()).c_str());\n\t\n\t\t// Instantiate the <geometry>\n\t\tSafeAdd(node, \"instance_geometry\", instanceGeom);\n\t\n\t\tstd::string ID = k3d::data::property_lookup(k3d::property::get(*inode, \"input_mesh\"))->property_node()->name();\n\t\n\t\tinstanceGeom->setAttribute(\"url\", makeUriRef(removeSpaces(ID)).c_str());\n\t\n\t\t// Bind material parameters\n\t\t//SafeAdd(instanceGeom, \"bind_material technique_common instance_material\", instanceMaterial);\n\t\t//instanceMaterial->setAttribute(\"symbol\", \"mtl\");\n\t\t//instanceMaterial->setAttribute(\"target\", makeUriRef(\"cubeMaterial\").c_str());\n\t\n\t\t//SafeAdd(instanceMaterial, \"bind_vertex_input\", bindVertexInput);\n\t\t//bindVertexInput->setAttribute(\"semantic\", \"uv0\");\n\t\t//bindVertexInput->setAttribute(\"input_semantic\", \"TEXCOORD\");\n\t\t//bindVertexInput->setAttribute(\"input_set\", \"0\");\n\n\t\tk3d::matrix4 matrix = boost::any_cast<k3d::matrix4>(k3d::property::get(*inode, \"input_matrix\")->property_pipeline_value());\n\n\t\tstd::stringstream mat;\n\t\tfor(int i=0; i<4; i++)\n\t\t\tfor(int j=0; j<4; j++)\n\t\t\t\tmat << matrix[i][j] << \" \" << std::endl;\n\t\tnode->add(\"matrix\")->setCharData(mat.str());\n\t}\n\n\tvoid addCameraInstance(daeElement * visualScene, k3d::inode *inode)\n\t{\n\t\t// Add a <node> with a simple transformation\n\t\tSafeAdd(visualScene, \"node\", node);\n\t\tnode->setAttribute(\"id\", removeSpaces(inode->name()).c_str());\n\t\tnode->setAttribute(\"name\", removeSpaces(inode->name()).c_str());\n\t\n\t\t// Instantiate the <geometry>\n\t\tSafeAdd(node, \"instance_camera\", instanceCam);\n\n\t\tinstanceCam->setAttribute(\"url\", makeUriRef(removeSpaces(inode->name())).c_str());\n\n\t\tk3d::matrix4 matrix = boost::any_cast<k3d::matrix4>(k3d::property::get(*inode, \"input_matrix\")->property_pipeline_value());\n\n\t\tstd::stringstream mat;\n\t\tfor(int i=0; i<4; i++)\n\t\t\tfor(int j=0; j<4; j++)\n\t\t\t\tmat << matrix[i][j] << \" \" << std::endl;\n\t\tnode->add(\"matrix\")->setCharData(mat.str());\n\t}\n\n\tk3d::mesh to_k3d_mesh(domGeometry &geom)\n\t{\n\t\tintGeometry result(geom,k3d::identity3());\n\t\treturn result.getMesh();\n\t}\n\n}\n}\n}\n"
  },
  {
    "path": "modules/collada_io/collada.h",
    "content": "#ifndef MODULES_COLLADA_IO_COLLADA_H\n#define MODULES_COLLADA_IO_COLLADA_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n*/\n\n// Main integration file\n\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/imesh_storage.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/ustring.h>\n#include <dae.h>\n#include <dae/daeUtils.h>\n#include <dom/domCOLLADA.h>\n#include <dom/domLight.h>\n#include <dom/domCamera.h>\n#include \"int_elements.h\"\n\n#define SafeAdd(elt, name, var) \\\n\tdaeElement* var = elt->add(name);\n\nnamespace module\n{\nnamespace collada\n{\nnamespace io\n{\n\n\t// \"myGeom\" --> \"#myGeom\"\n\tstd::string makeUriRef(const std::string& id);\n\n\t// Helper function to convert an array to a daeArray type\n\ttemplate<typename T>\n\tdaeTArray<T> rawArrayToDaeArray(T rawArray[], size_t count) \n\t{\n\t\tdaeTArray<T> result;\n\t\tfor (size_t i = 0; i < count; i++)\n\t\t\tresult.append(rawArray[i]);\n\t\treturn result;\n\t}\n\n\t// Helper function to remove spaces in a string replacing them with \n\t// the character '_'\n\tstd::string removeSpaces(std::string str);\n\n\t// Collada integration functions to add collada specific elements to a file\n\tvoid addSource(daeElement* mesh, const std::string& srcID, const std::string& paramNames, domFloat values[], int valueCount);\n\tvoid addInput(daeElement* triangles, const std::string& semantic, const std::string& srcID, int offset);\n\tvoid addGeometry(daeElement* library_geometries, const std::string &name, k3d::mesh *mesh);\n\tvoid addMeshInstance(daeElement * visualScene, k3d::inode *inode);\n\tvoid addCameraInstance(daeElement * visualscene, k3d::inode *inode);\n\n\t// Helper function to convert a domGeometry into a k3d::mesh\n\tk3d::mesh to_k3d_mesh(domGeometry &geom);\n\n\tclass collada_obj\n\t{\n\tpublic:\n\n\t\t// Creates a node with a frozen mesh and stores the mesh_source\n\t\t// for referencing\n\t\tcollada_obj(k3d::idocument &Document, domGeometry &geom)\n\t\t{\n\t\t\tid = geom.getAttribute(\"id\");\n\t\t\tname =  k3d::unique_name(Document.nodes(), \"COLLADA \" + geom.getAttribute(\"name\"));\n\t\t\ttype = \"frozen_mesh\";\n\n\t\t\tk3d::mesh *mesh = new k3d::mesh();\n\t\t\tk3d::inode *frozen_mesh = k3d::plugin::create<k3d::inode>(*k3d::plugin::factory::lookup(\"FrozenMesh\"), Document, name);\n\t\t\tk3d::imesh_storage* mesh_storage = dynamic_cast<k3d::imesh_storage*>(frozen_mesh);\n\t\t\tmesh_storage->reset_mesh(mesh);\n\t\t\t*mesh  = \n\t\t\t//intGeometry result(geom,k3d::identity3());\n\t\t\tto_k3d_mesh(geom);\n//return;\n\n\t\t\tk3d::imesh_source* const mesh_source = dynamic_cast<k3d::imesh_source*>(frozen_mesh);\n\t\t\tmesh_source_output = &mesh_source->mesh_source_output();\n\t\t}\n\t\t// Creates a Camera node and store it's properties\n\t\t// This camera won't be shown on screen and will be used as a \n\t\t// template for further referencing. Because of these we store it's values\n\t\t// to connect them later with its instances\n\t\tcollada_obj(k3d::idocument &Document, domCamera &cam)\n\t\t{\n\t\t\tid = cam.getAttribute(\"id\");\n\t\t\tname = k3d::unique_name(Document.nodes(), \"COLLADA \" + id);\n\t\t\ttype = \"camera\";\n\n\t\t\tk3d::inode *camera = k3d::plugin::create<k3d::inode>(*k3d::plugin::factory::lookup(\"Camera\"), Document, name);\n\n\t\t\tdomCamera::domOptics::domTechnique_common *technique_common = cam.getOptics()->getTechnique_common();\n\t\t\tdomCamera::domOptics::domTechnique_common::domPerspective *perspective = technique_common->getPerspective();\n\t\t\tdomCamera::domOptics::domTechnique_common::domOrthographic *orthographic = technique_common->getOrthographic();\n\t\t\tdouble znear, zfar;\n\t\t\tdouble aspect_ratio;\n\t\t\tif(orthographic!=NULL)\n\t\t\t{\n\t\t\t\tdouble xmag = orthographic->getXmag()->getValue();\n\t\t\t\tdouble ymag = orthographic->getYmag()->getValue();\n\n\t\t\t\tif(orthographic->getAspect_ratio()!=NULL)\n\t\t\t\t\taspect_ratio = orthographic->getAspect_ratio()->getValue();\n\t\t\t\telse\n\t\t\t\t\taspect_ratio = xmag/ymag;\n\n\t\t\t\tk3d::property::set_internal_value(*camera, \"top\", ymag);\n\t\t\t\tk3d::property::set_internal_value(*camera, \"bottom\", -ymag);\n\t\t\t\tk3d::property::set_internal_value(*camera, \"right\", xmag);\n\t\t\t\tk3d::property::set_internal_value(*camera, \"left\", -xmag);\n\t\t\t\tznear = orthographic->getZnear()->getValue();\n\t\t\t\tzfar = orthographic->getZfar()->getValue();\n\t\t\t}\n\t\t\tif(perspective!=NULL)\n\t\t\t{\n\t\t\t\tif(perspective->getAspect_ratio()!=NULL)\n\t\t\t\t\taspect_ratio = perspective->getAspect_ratio()->getValue();\n\t\t\t\telse\n\t\t\t\t\taspect_ratio = 1;\n\t\t\t\tdouble x;\n\t\t\t\tif(perspective->getYfov()!=NULL)\n\t\t\t\t{\n\t\t\t\t\tdouble yfov = perspective->getYfov()->getValue();\n\t\t\t\t\tx = tan(k3d::radians(yfov/2))*znear;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tif(perspective->getXfov()!=NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tdouble xfov = perspective->getXfov()->getValue();\n\t\t\t\t\t\tx = tan(k3d::radians(xfov/2))*znear;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn;\n\n\t\t\t\tznear = perspective->getZnear()->getValue();\n\t\t\t\tzfar = perspective->getZfar()->getValue();\n\t\t\t\tk3d::property::set_internal_value(*camera, \"top\", x);\n\t\t\t\tk3d::property::set_internal_value(*camera, \"bottom\", x);\n\t\t\t\tk3d::property::set_internal_value(*camera, \"left\", -x*aspect_ratio);\n\t\t\t\tk3d::property::set_internal_value(*camera, \"right\", x*aspect_ratio);\n\t\t\t}\n\n\t\t\tk3d::property::set_internal_value(*camera, \"viewport_visible\", false);\n\t\t\tk3d::property::set_internal_value(*camera, \"near\", znear);\n\t\t\tk3d::property::set_internal_value(*camera, \"far\", zfar);\n\n\t\t\t//Collect properties\n\t\t\ttop = k3d::property::get(*camera, \"top\");\n\t\t\tbottom = k3d::property::get(*camera, \"bottom\");\n\t\t\tleft = k3d::property::get(*camera, \"left\");\n\t\t\tright = k3d::property::get(*camera, \"right\");\n\t\t\tnear = k3d::property::get(*camera, \"near\");\n\t\t\tfar = k3d::property::get(*camera, \"far\");\n\t\t}\n\n\t\t// Creates a Light node and a LightShader node, this is still on development\n\t\t// and not completely supported yet\n\t\tcollada_obj(k3d::idocument &Document, domLight &li)\n\t\t{\n\t\t\tid = li.getAttribute(\"id\");\n\t\t\tname = k3d::unique_name(Document.nodes(), \"COLLADA \" + id);\n\t\t\tstd::string shader_name = k3d::unique_name(Document.nodes(), name + \" Shader\");\n\t\t\ttype = \"light\";\n\n\t\t\tdomLight::domTechnique_common *technique_common = li.getTechnique_common();\n\t\t\tdomLight::domTechnique_common::domPoint *point = technique_common->getPoint();\n\t\t\tdomLight::domTechnique_common::domAmbient *ambient = technique_common->getAmbient();\n\t\t\tdomLight::domTechnique_common::domDirectional *directional = technique_common->getDirectional();\n\t\t\tdomLight::domTechnique_common::domSpot *spot = technique_common->getSpot();\n\n\t\t\tk3d::inode *light = k3d::plugin::create<k3d::inode>(*k3d::plugin::factory::lookup(\"RenderManLight\"), Document, name);\n\t\t\tlight_shader = k3d::plugin::create<k3d::inode>(*k3d::plugin::factory::lookup(\"RenderManLightShader\"), Document, shader_name);\n\n\t\t\tk3d::property::set_internal_value(*light, \"viewport_visible\", false);\n\t\t\tk3d::property::set_internal_value(*light, \"shader\", light_shader);\n\t\t\t//k3d::filesystem::path shader_path;\n\n\t\t\tif(point!=NULL)\n\t\t\t{\n\t\t\t\t//shader_path = k3d::filesystem::generic_path(\"k3d_pointlight.sl\");\n\t\t\t}\n\n\t\t\t//k3d::property::set_internal_value(*light_shader, \"shader_path\", shader_path);\n\t\t}\n\n\t\t// Creates a bitmap node containing an image taken from the <library_images>\n\t\tcollada_obj(k3d::idocument &Document, domImage &img)\n\t\t{\n\t\t\tid = img.getAttribute(\"id\");\n\t\t\tname = k3d::unique_name(Document.nodes(), \"COLLADA \" + img.getAttribute(\"id\"));\n\t\t\ttype = \"image\";\n\n\t\t\tdomImage::domInit_from *init_from = img.getInit_from();\n\n\t\t\tif(init_from != NULL)\n\t\t\t{\n\t\t\t\t//std::string factory;\n\t\t\t\tstd::string tmp_path = init_from->getValue().str().substr(5);\n\t\t\t\tstd::string img_path;\n\t\t\t\tfor(int i=0; i<tmp_path.length(); i++)\n\t\t\t\t{\n\t\t\t\t\tif(tmp_path[i]=='%')\n\t\t\t\t\t{\n\t\t\t\t\t\timg_path = img_path + \" \";\n\t\t\t\t\t\ti+=2;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\timg_path = img_path + tmp_path[i];\n\t\t\t\t}\n\t\t\t\tk3d::inode *image = k3d::plugin::create<k3d::inode>(*k3d::plugin::factory::lookup(\"BitmapReader\"),Document,name);\n\t\t\t\tk3d::property::set_internal_value(*image, \"file\", k3d::filesystem::generic_path(img_path));\n\t\t\t}\n\t\t}\n\n\t\t// Accessor functions\n\t\tstd::string get_name(){return name;}\n\t\tstd::string get_type(){return type;}\n\t\tstd::string get_id(){return id;}\n\t\tk3d::iproperty *get_mesh_source_output(){return mesh_source_output;}\n\t\tk3d::iproperty *get_top(){return top;}\n\t\tk3d::iproperty *get_bottom(){return bottom;}\n\t\tk3d::iproperty *get_left(){return left;}\n\t\tk3d::iproperty *get_right(){return right;}\n\t\tk3d::iproperty *get_near(){return near;}\n\t\tk3d::iproperty *get_far(){return far;}\n\t\tk3d::inode *get_light_shader(){return light_shader;}\n\tprivate:\n\t\tstd::string name;\n\t\tstd::string id;\n\t\tstd::string type;\n\t\tk3d::iproperty *mesh_source_output;\n\t\tk3d::iproperty *matrix_source_output;\n\t\tk3d::iproperty *top, *bottom, *left, *right, *near, *far;\n\t\tk3d::inode *light_shader;\n\t};\n\n}\n}\n}\n\n#endif // !MODULES_COLLADA_IO_COLLADA_H\n\n"
  },
  {
    "path": "modules/collada_io/document_exporter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n*/\n\n#include <dae.h>\n#include <dae/daeUtils.h>\n#include <dom/domCOLLADA.h>\n#include <dom/domLight.h>\n#include <dom/domCamera.h>\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/dependencies.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_exporter.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/string_modifiers.h>\n#include <k3dsdk/xml.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/transformable.h>\n\n#include <string>\n#include <list>\n\n#include \"collada.h\"\n\nnamespace module\n{\nnamespace collada\n{\nnamespace io\n{\n\ntemplate <class T>\nstd::string to_string(T & t)\n{\n        std::stringstream s;\n        s << t;\n        return s.str();\n}\n\nclass document_exporter :\n\tpublic k3d::idocument_exporter\n{\npublic:\n\tbool write_file(k3d::idocument& Document, const k3d::filesystem::path& Path)\n\t{\n\t\tk3d::log() << info << \"Writing \" << Path.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\t\tDAE dae(NULL, NULL, \"1.4.1\");\n\t\tdaeElement *root = dae.add(k3d::string_cast<k3d::filesystem::path>(Path));\n\n\t\tdaeElement *asset = root->add(\"asset\");\n\t\tdaeElement *library_cameras = root->add(\"library_cameras\");\n\t\tdaeElement *library_lights = root->add(\"library_lights\");\n\t\tdaeElement *library_geometries = root->add(\"library_geometries\");\n\n\t\tdaeElement* contributor = asset->add(\"contributor\");\n\t\tdaeElement* created = asset->add(\"created\");\n\t\tdaeElement* modified = asset->add(\"modified\");\n\n\t\tstd::stringstream author;\n\t\tauthor << \"K-3D \" << K3D_PACKAGE << \" , \" << K3D_VERSION << \" , \" << K3D_HOST;\n\t\tcontributor->setCharData(author.str().c_str());\n\t\tconst char* date = \"2008-04-08T13:07:52-08:00\";\n\t\tcreated->setCharData(date);\n\t\tmodified->setCharData(date);\n\n\t\t// Sort objects by ID before saving them ...\n\t\tconst k3d::inode_collection::nodes_t nodes = Document.nodes().collection();\n\n\t\tfor(k3d::inode_collection::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\t// Add cameras into file\n\t\t\tif((*node)->factory().factory_id() == k3d::plugin::factory::lookup(\"Camera\")->factory_id())\n\t\t\t{\n\t\t\t\tdomCamera *camera = daeSafeCast<domCamera>(library_cameras->add(\"camera\"));\n\t\t\t\tdomCamera::domOptics::domTechnique_common *technique = daeSafeCast<domCamera::domOptics::domTechnique_common>(camera->add(\"optics technique_common\"));\n\t\t\t\tcamera->setName((*node)->name().c_str());\n\t\t\t\tcamera->setId((*node)->name().c_str());\n\n\t\t\t\tdouble zfar = boost::any_cast<double>(k3d::property::get(**node, \"far\")->property_internal_value());\n\t\t\t\tdouble znear = boost::any_cast<double>(k3d::property::get(**node, \"near\")->property_internal_value());\n\t\t\t\tdouble left = boost::any_cast<double>(k3d::property::get(**node, \"left\")->property_internal_value());\n\t\t\t\tdouble right = boost::any_cast<double>(k3d::property::get(**node, \"right\")->property_internal_value());\n\t\t\t\tdouble top = boost::any_cast<double>(k3d::property::get(**node, \"top\")->property_internal_value());\n\t\t\t\tdouble bottom = boost::any_cast<double>(k3d::property::get(**node, \"bottom\")->property_internal_value());\n\t\t\t\tdouble aspect_ratio = (right-left)/(top-bottom);\n\n\n\t\t\t\tbool ortho = boost::any_cast<bool>(k3d::property::get(**node, \"orthographic\")->property_internal_value());\n\n\t\t\t\t// attributes differ with camera type, some attributes had to be computed manually\n\t\t\t\t// as K-3D use them in a different way\n\t\t\t\tdomElement *cam_type;\n\t\t\t\tif(ortho)\n\t\t\t\t{\n\t\t\t\t\tcam_type = technique->add(\"orthographic\");\n\t\t\t\t\tdouble xmag = (right-left)/2;\n\t\t\t\t\tdomElement *xm = cam_type->add(\"xmag\");\n\t\t\t\t\txm->setCharData(to_string(xmag).c_str());\n\t\t\t\t\tdouble ymag = (top-bottom)/2;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcam_type = technique->add(\"perspective\");\n\t\t\t\t\tdouble yfov = k3d::degrees(2*atan((top-bottom)/(2*znear)));\n\t\t\t\t\tdomElement *yf = cam_type->add(\"yfov\");\n\t\t\t\t\tyf->setCharData(to_string(yfov).c_str());\n\t\t\t\t}\n\n\t\t\t\t// Add common attributes\n\t\t\t\tdomElement *near = cam_type->add(\"znear\");\n\t\t\t\tnear->setCharData(to_string(znear).c_str());\n\t\t\t\tdomElement *far = cam_type->add(\"zfar\");\n\t\t\t\tfar->setCharData(to_string(zfar).c_str());\n\t\t\t\tdomElement *aspect = cam_type->add(\"aspect_ratio\");\n\t\t\t\taspect->setCharData(to_string(aspect_ratio).c_str());\n\t\t\t}\n\n\t\t\t// Add geometry to the collada file, this will take the Frozen mesh\n\t\t\t// and store it into the library_geometries\n\t\t\tk3d::iproperty *mesh_property = boost::any_cast<k3d::iproperty*>(k3d::property::get(**node, \"output_mesh\"));\n\t\t\tif(mesh_property != NULL && (*node)->factory().factory_id() != k3d::plugin::factory::lookup(\"MeshInstance\")->factory_id())\n\t\t\t{\n\t\t\t\tk3d::mesh *mesh = boost::any_cast<k3d::mesh*>(mesh_property->property_internal_value());\n\t\t\t\taddGeometry(library_geometries, (*node)->name(), mesh);\n\t\t\t}\n\t\t}\n\n\t\t//Setup visual scenes library and the main scene\n\t\tSafeAdd(root, \"library_visual_scenes\", visualSceneLib);\n\t\tSafeAdd(visualSceneLib, \"visual_scene\", visualScene);\n\t\tvisualScene->setAttribute(\"id\", \"mainScene\");\n\n\n\t\tfor(k3d::inode_collection::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\t// Add MeshInstance to instanciate the input_mesh in\n\t\t\t// the visual scene with it's corresponding transformation\n\t\t\tif((*node)->factory().factory_id() == k3d::plugin::factory::lookup(\"MeshInstance\")->factory_id())\n\t\t\t\taddMeshInstance(visualScene,(*node));\n\n\t\t\t// Add Camera to instanciate the camera in\n\t\t\t// the visual scene with it's corresponding transformation\n\t\t\tif((*node)->factory().factory_id() == k3d::plugin::factory::lookup(\"Camera\")->factory_id())\n\t\t\t\taddCameraInstance(visualScene,(*node));\n\t\t}\n\n\t\t// Add the main scene to root file and instanciate the created visual_scene\n\t\troot->add(\"scene instance_visual_scene\")->setAttribute(\"url\", makeUriRef(\"mainScene\").c_str());\n\n\t\tdae.writeAll();\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<document_exporter, k3d::interface_list<k3d::idocument_exporter> > factory(\n\t\t\tk3d::uuid(0x33f1ba2c, 0x5b41392d, 0xe9dc9d99, 0x66a8129d),\n\t\t\t\"COLLADADocumentExporter\",\n\t\t\t_(\"COLLADA ( .dae )\"),\n\t\t\t\"\");\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& document_exporter_factory()\n{\n\treturn document_exporter::get_factory();\n}\n\n}\n}\n}\n"
  },
  {
    "path": "modules/collada_io/document_importer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the DocumentReader COLLADA plugin, which imports the COLLADA(.dae) file format\n\t\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n*/\n\n#define COLLADA_DOM_SUPPORT141\n\n#include <dae.h>\n#include <dom/domCOLLADA.h>\n#include <dom/domConstants.h>\n#include <dom/domLibrary_geometries.h>\n#include <dom/domLibrary_cameras.h>\n#include <dom/domLibrary_visual_scenes.h>\n#include <dom/domGeometry.h>\n#include <dom/domMatrix.h>\n#include <dom/domNode.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/iplugin_factory.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/node.h>\n\n#include <k3dsdk/plugin.h>\n\n#include \"int_elements.h\"\n#include \"integration.h\"\n#include \"collada.h\"\n\n#include <boost/assign/list_of.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace collada\n{\n\nnamespace io\n{\n\nk3d::matrix4 getTransformation(domNode& node)\n{\n\tk3d::matrix4 result = k3d::identity3();\n\n\t// Look for Translations\n\tdomTranslate_Array translate_array = node.getTranslate_array();\n\tfor(int i=0; i<translate_array.getCount(); i++)\n\t{\n\t\tdomTranslate* translate = translate_array[i];\n\t\tdomFloat3 trans = translate->getValue();\n\t\tk3d::matrix4 tmp_matrix = k3d::identity3();\n\t\ttmp_matrix[0][3] = trans[0];\n\t\ttmp_matrix[1][3] = trans[1];\n\t\ttmp_matrix[2][3] = trans[2];\n\t\tresult = result * tmp_matrix;\n\t}\n\n\t// Look for Scaling\n\tdomScale_Array scale_array = node.getScale_array();\n\tfor(int i=0; i<scale_array.getCount(); i++)\n\t{\n\t\tdomScale* scale = scale_array[i];\n\t\tdomFloat3 sc = scale->getValue();\n\t\tk3d::matrix4 tmp_matrix = k3d::identity3();\n\t\ttmp_matrix[0][0] = sc[0];\n\t\ttmp_matrix[1][1] = sc[1];\n\t\ttmp_matrix[2][2] = sc[2];\n\t\tresult = result * tmp_matrix;\n\t}\n\n\t// Look for Rotations\n\tdomRotate_Array rotate_array = node.getRotate_array();\n\tfor(int i=0; i<rotate_array.getCount(); i++)\n\t{\n\t\tdomRotate* rotate = rotate_array[i];\n\t\tdomFloat4 rot = rotate->getValue();\n\t\tk3d::matrix4 tmp_matrix = k3d::identity3();\n\t\tfloat c = cos(k3d::radians(rot[3])), s = sin(k3d::radians(rot[3])), C = 1-c;\n\t\tfloat x = rot[0], y = rot[1], z = rot[2];\n\t\tfloat xs = x*s, ys = y*s, zs = z*s;\n\t\tfloat xC = x*C, yC = y*C, zC = z*C;\n\t\tfloat xyC=x*y*C,yzC=y*z*C,zxC=z*x*C;\n\t\ttmp_matrix[0][0] = x*xC+c;\n\t\ttmp_matrix[0][1] = xyC-zs;\n\t\ttmp_matrix[0][2] = zxC+ys;\n\t\ttmp_matrix[1][0] = xyC+zs;\n\t\ttmp_matrix[1][1] = y*yC+c;\n\t\ttmp_matrix[1][2] = yzC-xs;\n\t\ttmp_matrix[2][0] = zxC-ys;\n\t\ttmp_matrix[2][1] = yzC+xs;\n\t\ttmp_matrix[2][2] = z*zC+c;\n\t\tresult = result * tmp_matrix;\n\t}\n\n\t// Look for complete transformation matrix\n\tdomMatrix_Array matrix_array = node.getMatrix_array();\n\tfor(int k=0; k<matrix_array.getCount(); k++)\n\t{\n\t\tdomFloat4x4 mat = matrix_array[k]->getValue();\n\t\tk3d::matrix4 tmp_matrix = k3d::identity3();\n\t\tfor(int i=0; i<4; i++)\n\t\t\tfor(int j=0; j<4; j++)\n\t\t\t\ttmp_matrix[i][j] = mat[4*i+j];\n\t\tresult = result * tmp_matrix;\n\t}\n\n\treturn result;\n}\n\n\ncollada_obj lookcollada(std::vector<collada_obj> &collada_objs, std::string id)\n{\n\tfor(int i=0; i<collada_objs.size(); i++)\n\t\tif(id==collada_objs[i].get_id())\n\t\t\treturn collada_objs[i];\n\tk3d::log() << error << \"Could not connect collada object with instace!\" << std::endl;\n\treturn collada_objs[0];\n}\n\nvoid node_recursion(k3d::idocument& Document, std::vector<collada_obj> &collada_objs,  domNode &node)\n{\n\tk3d::matrix4 mcurrent = getTransformation(node);\n\n\tdomNode_Array scene_nodes = node.getNode_array();\n\tfor(int i=0; i<scene_nodes.getCount(); i++)\n\t{\n\t\tnode_recursion(Document,collada_objs,*scene_nodes[i]);\n\t}\n\n\tstd::stringstream trans_name;\n\ttrans_name << \"COLLADA \" << node.getName() << \" Transformation\";\n\tk3d::inode *frozen_trans = k3d::plugin::create<k3d::inode>(*k3d::plugin::factory::lookup(\"FrozenMatrix\"), Document, k3d::unique_name(Document.nodes(),trans_name.str()));\n\tk3d::property::set_internal_value(*frozen_trans, \"matrix\", mcurrent);\n\tk3d::imatrix_source* const matrix_source = dynamic_cast<k3d::imatrix_source*>(frozen_trans);\n\n\tk3d::ipipeline::dependencies_t dependencies;\n\n\tfor (size_t l = 0; l < node.getInstance_geometry_array().getCount(); l++)\n\t{\n\t\tdomInstance_geometry* instanceGeom = node.getInstance_geometry_array()[l];\n\n\t\tstd::stringstream instance_name;\n\t\tinstance_name << \"COLLADA \" << node.getName() << \" Instance\";\n\t\tk3d::inode *mesh_instance = k3d::plugin::create<k3d::inode>(*k3d::plugin::factory::lookup(\"MeshInstance\"),Document,k3d::unique_name(Document.nodes(),instance_name.str()));\n\n\t\t// Set painters\n\t\tconst k3d::nodes_t gl_nodes = k3d::node::lookup(Document, \"GL Default Painter\");\n\t\tk3d::inode* gl_painter = (1 == gl_nodes.size()) ? *gl_nodes.begin() : 0;\n\t\tconst k3d::nodes_t ri_nodes = k3d::node::lookup(Document, \"RenderMan Default Painter\");\n\t\tk3d::inode* ri_painter = (1 == ri_nodes.size()) ? *ri_nodes.begin() : 0;\n\t\tk3d::property::set_internal_value(*mesh_instance, \"gl_painter\", gl_painter);\n\t\tk3d::property::set_internal_value(*mesh_instance, \"ri_painter\", ri_painter);\n\n\t\t// Connect the MeshInstance\n\t\tk3d::imesh_sink* const mesh_sink = dynamic_cast<k3d::imesh_sink*>(mesh_instance);\n\n\t\tdependencies.insert(std::make_pair(&mesh_sink->mesh_sink_input(), lookcollada(collada_objs,instanceGeom->getUrl().getElement()->getAttribute(\"id\")).get_mesh_source_output()));\n\n\t\tk3d::imatrix_sink* const matrix_sink = dynamic_cast<k3d::imatrix_sink*>(mesh_instance);\n\n\t\tdependencies.insert(std::make_pair(&matrix_sink->matrix_sink_input(),&matrix_source->matrix_source_output()));\n\t}\n\n\tfor (size_t l = 0; l < node.getInstance_camera_array().getCount(); l++)\n\t{\n\t\tdomInstance_camera* instanceCam = node.getInstance_camera_array()[l];\n\n\t\tstd::stringstream cam_name;\n\t\tcam_name << \"COLLADA \" << node.getName();\n\n\t\tk3d::inode *camera = k3d::plugin::create<k3d::inode>(*k3d::plugin::factory::lookup(\"Camera\"), Document, cam_name.str());\n\t\tk3d::imatrix_sink* const cam_matrix_sink = dynamic_cast<k3d::imatrix_sink*>(camera);\n\n\t\tdependencies.insert(std::make_pair(&cam_matrix_sink->matrix_sink_input(),&matrix_source->matrix_source_output()));\n\n\t\tdependencies.insert(std::make_pair(k3d::property::get(*camera,\"top\"),lookcollada(collada_objs,instanceCam->getUrl().getElement()->getAttribute(\"id\")).get_top()));\n\t\tdependencies.insert(std::make_pair(k3d::property::get(*camera,\"bottom\"),lookcollada(collada_objs,instanceCam->getUrl().getElement()->getAttribute(\"id\")).get_bottom()));\n\t\tdependencies.insert(std::make_pair(k3d::property::get(*camera,\"left\"),lookcollada(collada_objs,instanceCam->getUrl().getElement()->getAttribute(\"id\")).get_left()));\n\t\tdependencies.insert(std::make_pair(k3d::property::get(*camera,\"right\"),lookcollada(collada_objs,instanceCam->getUrl().getElement()->getAttribute(\"id\")).get_right()));\n\t\tdependencies.insert(std::make_pair(k3d::property::get(*camera,\"near\"),lookcollada(collada_objs,instanceCam->getUrl().getElement()->getAttribute(\"id\")).get_near()));\n\t\tdependencies.insert(std::make_pair(k3d::property::get(*camera,\"far\"),lookcollada(collada_objs,instanceCam->getUrl().getElement()->getAttribute(\"id\")).get_far()));\n\t}\n\n\tfor (size_t l = 0; l < node.getInstance_light_array().getCount(); l++)\n\t{\n\t\tdomInstance_light* instanceLight = node.getInstance_light_array()[l];\n\n\t\tstd::stringstream light_name;\n\t\tlight_name << \"COLLADA \" << node.getName();\n\n\t\tk3d::inode *light = k3d::plugin::create<k3d::inode>(*k3d::plugin::factory::lookup(\"RenderManLight\"), Document, light_name.str());\n\t\tk3d::imatrix_sink* const light_matrix_sink = dynamic_cast<k3d::imatrix_sink*>(light);\n\n\t\tk3d::property::set_internal_value(*light, \"shader\", lookcollada(collada_objs, instanceLight->getUrl().getElement()->getAttribute(\"id\")).get_light_shader());\n\n\t\tdependencies.insert(std::make_pair(&light_matrix_sink->matrix_sink_input(),&matrix_source->matrix_source_output()));\n\t}\n\tDocument.pipeline().set_dependencies(dependencies);\n}\n\nclass document_importer :\n\tpublic k3d::idocument_importer\n{\npublic:\n\tk3d::bool_t read_file(const k3d::filesystem::path& FilePath, k3d::idocument& Document)\n\t{\n\t\t// Instantiate the reference implementation\n\t\tDAE dae(NULL, NULL, \"1.4.1\");\n\t\tstd::vector<collada_obj> collada_objs;\n\n\t\tk3d::log() << info << \"Importing .dae file: \" << FilePath.native_console_string() << std::endl;\n\t\tdomCOLLADA* root = dae.open141(k3d::string_cast<k3d::filesystem::path>(FilePath));\n\t\tif(!root)\n\t\t{\n            \t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << FilePath.native_console_string() << \"]\" << std::endl;\n\t\t\treturn false;\n\t\t}\n\n\t\t// First we add all possible objects from COLLADA libraries to Pipeline even if they aren't used. This is done\n\t\t// so a correct exporting is performed too.\n\n\t\t//Add all possible Geometries to pipeline\n\t\tdomLibrary_geometries_Array library_geometries = root->getLibrary_geometries_array();\n\t\tfor(int j=0; j<library_geometries.getCount(); j++)\n\t\t{\n\t\t\tdomGeometry_Array geometries = library_geometries[j]->getGeometry_array();\n\t\t\tfor(int i=0; i<geometries.getCount(); i++)\n\t\t\t{\n\t\t\t\tcollada_objs.push_back(collada_obj(Document,*geometries[i]));\n\t\t\t}\n\t\t}\n\n\t\t//Add all cameras to pipeline\n\t\tdomLibrary_cameras_Array library_cameras = root->getLibrary_cameras_array();\n\t\tfor(int j=0; j<library_cameras.getCount(); j++)\n\t\t{\n\t\t\tdomCamera_Array cameras = library_cameras[j]->getCamera_array();\n\t\t\tfor(int i=0; i<cameras.getCount(); i++)\n\t\t\t\tcollada_objs.push_back(collada_obj(Document,*cameras[i]));\n\t\t}\n\n\t\t//Add all lights to pipeline\n\t\tdomLibrary_lights_Array library_lights = root->getLibrary_lights_array();\n\t\tfor(int j=0; j<library_lights.getCount(); j++)\n\t\t{\n\t\t\tdomLight_Array lights = library_lights[j]->getLight_array();\n\t\t\tfor(int i=0; i<lights.getCount(); i++)\n\t\t\t\tcollada_objs.push_back(collada_obj(Document,*lights[i]));\n\t\t}\n\n\t\t//Add all images to pipeline\n\t\tdomLibrary_images_Array library_images = root->getLibrary_images_array();\n\t\tfor(int j=0; j<library_images.getCount(); j++)\n\t\t{\n\t\t\tdomImage_Array images = library_images[j]->getImage_array();\n\t\t\tfor(int i=0; i<images.getCount(); i++)\n\t\t\t\tcollada_objs.push_back(collada_obj(Document,*images[i]));\n\t\t}\n\n\t\tdomLibrary_visual_scenes_Array library_visual_scenes = root->getLibrary_visual_scenes_array();\n\t\tfor(int j=0; j<library_visual_scenes.getCount(); j++)\n\t\t{\n\t\t\tdomVisual_scene_Array visual_scenes = library_visual_scenes[j]->getVisual_scene_array();\n\t\t\tfor(int k=0; k<visual_scenes.getCount(); k++)\n\t\t\t{\n\t\t\t\tdomNode_Array scene_nodes = visual_scenes[k]->getNode_array();\n\t\t\t\tfor(int i=0; i<scene_nodes.getCount(); i++)\n\t\t\t\t{\n\t\t\t\t\tnode_recursion(Document,collada_objs,*scene_nodes[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n/*\n\t\t// Do the conversion. The conversion process throws an exception on error, so\n\t\t// we'll include a try/catch handler.\n\t\t//daeParser dae_file(*root, Document);\n\n\t\t//k3d::inode* const mesh_node = k3d::plugin::create<k3d::inode>(*k3d::plugin::factory::lookup(\"Scale\"), Document, \"MyScale\");\n\t\t//mesh_node->set_property(\"name\", \"Bla\");\n\t\tk3d::iplugin_factory *factory = k3d::plugin::factory::lookup(\"Scale\");\n*/\n\n\t\t// destroy the objects we created during the conversion process\n\t\tfreeConversionObjects<Node, domNode>(dae);\n\t\tfreeConversionObjects<intGeometry, domGeometry>(dae);\n\t\tfreeConversionObjects<intLight, domLight>(dae);\n\t\tfreeConversionObjects<intCamera, domCamera>(dae);\n\n\t\treturn true;\n\t}\n\n\tk3d::imetadata::metadata_t get_file_metadata(const k3d::filesystem::path& File)\n\t{\n\t\treturn k3d::imetadata::metadata_t();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<document_importer, k3d::interface_list<k3d::idocument_importer> > factory(\n\t\t\tk3d::uuid(0xd473c2a6, 0x45447d4c, 0x7fb4bfbc, 0xf0feda54),\n\t\t\t\"COLLADADocumentImporter\",\n\t\t\t_(\"COLLADA ( .dae )\"),\n\t\t\t\"\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\tboost::assign::map_list_of(\"k3d:mime-types\", \"application/x-collada\"));\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& document_importer_factory()\n{\n\treturn document_importer::get_factory();\n}\n\n}\n}\n}\n"
  },
  {
    "path": "modules/collada_io/int_elements.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n\t\\author Barbiero Mattia\n*/\n#include <dae.h>\n#include <dae/daeDom.h>\n#include \"int_elements.h\"\n#include <iostream>\n#include <dom/domPolylist.h>\n#include <dom/domTriangles.h>\n\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nusing namespace std;\nnamespace module\n{\n\nnamespace collada\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_reader_implementation\n\n\tintGeometry::intGeometry(domGeometry& geomElement, const k3d::matrix4& ccst)\n\t{\n\t\tdomMesh *meshElement = geomElement.getMesh();\n\n\t\tk3d::mesh::points_t& points = Mesh.points.create();\n\t\tk3d::mesh::texture_coordinates_t texture_coordinates;\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Mesh));\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\tdomInputLocalOffset* vertex_input;\n\t\tdomInputLocalOffset* normal_input;\n\t\tdomInputLocalOffset* texcoord_input;\n\n\t\tfor(int i=0; i<meshElement->getPolylist_array().getCount()>0; i++)\n\t\t{\n\t\t\ttexcoord_input = NULL;\n\t\t\tdomPolylist *polygons = meshElement->getPolylist_array()[i];\n\n\t\t\t// polyCount stores how many polygons there are\n\t\t\tint polyCount = 0;\n\t\t\t// inputArraysCount stores how many polygon arrays are\n\t\t\tint inputArraysCount = 0;\n\t\n\t\t\t// offset for the mesh declaration input string, \n\t\t\t// vertex, normal and texture values are stored in a single array\n\t\t\t// if one of them is not present it is not taken into account\n\t\t\tint v_offset = -1;\n\t\t\tint n_offset = -1;\n\t\t\tint t_offset = -1;\n\n\t\t\tint max_offset = 0;\n\n\t\t\tpolyCount = polygons->getCount();\n\t\t\tinputArraysCount = polygons->getInput_array().getCount();\n\n\t\t\t// Routine to declare the offsets if these attributes are present\n\t\t\t// only VERTEX attributes are obligatory\n\t\t\tfor (int i=0; i<inputArraysCount; i++)\n\t\t\t{\n\t\t\t\tif(strcmp(polygons->getInput_array()[i]->getSemantic(),\"VERTEX\")==0){\n\t\t\t\t\tv_offset = polygons->getInput_array()[i]->getOffset();\n\t\t\t\t\tvertex_input = polygons->getInput_array()[i];\n\t\t\t\t}else\n\t\t\t\tif(strcmp(polygons->getInput_array()[i]->getSemantic(),\"NORMAL\")==0){\n\t\t\t\t\tn_offset = polygons->getInput_array()[i]->getOffset();\n\t\t\t\t\tnormal_input = polygons->getInput_array()[i];\n\t\t\t\t}else\n\t\t\t\tif(strcmp(polygons->getInput_array()[i]->getSemantic(),\"TEXCOORD\")==0){\n\t\t\t\t\tt_offset = polygons->getInput_array()[i]->getOffset();\n\t\t\t\t\ttexcoord_input = polygons->getInput_array()[i];\n\t\t\t\t}\n\t\t\t\tif(max_offset< polygons->getInput_array()[i]->getOffset())\n\t\t\t\t\tmax_offset = polygons->getInput_array()[i]->getOffset();\n\t\t\t}\n\n\t\t\tdomSource *source_vertex;\n\t\t\tdomSource *source_texcoord=NULL;\n\t\t\tdaeURI *elementURI;\n\n\t\t\tdomVertices* domV;\n\t\t\tdomV = daeSafeCast<domVertices>(vertex_input->getSource().getElement());\n\t\n\t\t\tsource_vertex = daeSafeCast<domSource>(domV->getInput_array()[0]->getSource().getElement());\n\t\n\t\t\tif(texcoord_input)\n\t\t\t{\n\t\t\t\telementURI = &texcoord_input->getSource();\n\t\t\t\tsource_texcoord = daeSafeCast<domSource>(elementURI->getElement());\n\t\t\t}\n\n\t\t\tdomFloat_array *floatArray_vertex;\n\t\t\tdomFloat_array *floatArray_texcoord;\n\n\t\t\tif(source_vertex)\n\t\t\t\tfloatArray_vertex = &source_vertex->getFloat_array()[0];\n\n\t\t\tif(source_texcoord)\n\t\t\t\tfloatArray_texcoord = &source_texcoord->getFloat_array()[0];\n\n\t\t\tint stride = source_vertex->getTechnique_common()->getAccessor()->getStride();\n\n\t\t\t// Assume there are 3 values per vertex with a stride of 3.\n\t\t\t// Copy the vertices into my structure one-by-one\n\t\t\t// (converts from COLLADA's doubles to floats).\n\n\t\t\tfor ( unsigned int i = 0; i < floatArray_vertex->getCount(); i+=stride )\n\t\t\t{\n\t\t\t\tk3d::point3 vertex(floatArray_vertex->getValue()[i],\n\t\t\t\t\t\tfloatArray_vertex->getValue()[i+1],\n\t\t\t\t\t\tfloatArray_vertex->getValue()[i+2]);\n\t\t\t\tpoints.push_back(ccst*vertex);\n\t\t\t}\n\n\t\t\tif(source_texcoord)\n\t\t\t{\n\t\t\t\tstride = source_texcoord->getTechnique_common()->getAccessor()->getStride();\n\t\t\t\tfor ( unsigned int i = 0; i < floatArray_texcoord->getCount(); i+=stride)\n\t\t\t\t{\n\t\t\t\t\tk3d::texture3 texture(floatArray_texcoord->getValue()[i],\n\t\t\t\t\t\t\t\t\t1-floatArray_texcoord->getValue()[i+1],\n\t\t\t\t\t\t\t\t\t1);\n\t\t\t\t\ttexture_coordinates.push_back(texture);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Stores the list of polygons\n\t\t\tdomP *poly = polygons->getP();\n\n\t\t\tmax_offset++;\n\t\n\t\t\tint tot = 0;\n\t\n\t\t\t// Add polygons into gprim_factory taking into account offsets to parse correctly\n\t\t\tfor (int i=0;i<polyCount;i++)\n\t\t\t{\n\t\t\t\tk3d::mesh::indices_t vertex_coordinates;\n\t\t\t\tk3d::mesh::indices_t texture_coordinates;\n\t\t\t\tk3d::mesh::indices_t normal_coordinates;\n\t\t\n\t\t\t\t// Copy all the indices from the domP into my structure.\n\t\t\t\tint vcount = polygons->getVcount()->getValue()[i];\n\t\t\t\tconst k3d::uint_t face_first_edge = polyhedron->vertex_points.size();\n\t\t\t\tfor(int v=0;v<vcount*max_offset;v+=max_offset)\n\t\t\t\t{\n\t\t\t\t\tif(v_offset!=-1)\n\t\t\t\t\t{\n\t\t\t\t\t\tpolyhedron->vertex_points.push_back(poly->getValue()[tot+v+v_offset]);\n\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->vertex_points.size());\n\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0.0);\n\t\t\t\t\t}\n\t\t\t\t\tif(t_offset!=-1)\n\t\t\t\t\t\ttexture_coordinates.push_back(poly->getValue()[tot+v+t_offset]);\n\t\t\t\t}\n\t\t\t\ttot+=vcount*max_offset;\n\t\t\t\tpolyhedron->clockwise_edges.back() = face_first_edge;\n\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\tpolyhedron->loop_first_edges.push_back(face_first_edge);\n\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\tpolyhedron->face_materials.push_back(static_cast<k3d::imaterial*>(0));\n\t\t\t\tpolyhedron->face_selections.push_back(0.0);\n\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->shell_types.size()-1);\n\t\t\t}\n\t\t}\n\n\t\tfor(int i=0; i<meshElement->getTriangles_array().getCount()>0; i++)\n\t\t{\n\t\t\ttexcoord_input = NULL;\n\t\t\tdomTriangles *triangles = meshElement->getTriangles_array()[i];\n\n\t\t\t// polyCount stores how many polygons there are\n\t\t\tint polyCount = 0;\n\t\t\t// inputArraysCount stores how many polygon arrays are\n\t\t\tint inputArraysCount = 0;\n\t\n\t\t\t// offset for the mesh declaration input string, \n\t\t\t// vertex, normal and texture values are stored in a single array\n\t\t\t// if one of them is not present it is not taken into account\n\t\t\tint v_offset = -1;\n\t\t\tint n_offset = -1;\n\t\t\tint t_offset = -1;\n\n\t\t\tint max_offset = 0;\n\t\n\t\t\tdomP *poly;\n\n\t\t\tpolyCount = triangles->getCount();\n\t\t\tinputArraysCount = triangles->getInput_array().getCount();\n\n\t\t\t// Routine to declare the offsets if these attributes are present\n\t\t\t// only VERTEX attributes are obligatory\n\t\t\tfor (int i=0; i<inputArraysCount; i++)\n\t\t\t{\n\t\t\t\tif(strcmp(triangles->getInput_array()[i]->getSemantic(),\"VERTEX\")==0){\n\t\t\t\t\tv_offset = triangles->getInput_array()[i]->getOffset();\n\t\t\t\t\tvertex_input = triangles->getInput_array()[i];\n\t\t\t\t}else\n\t\t\t\tif(strcmp(triangles->getInput_array()[i]->getSemantic(),\"NORMAL\")==0){\n\t\t\t\t\tn_offset = triangles->getInput_array()[i]->getOffset();\n\t\t\t\t\tnormal_input = triangles->getInput_array()[i];\n\t\t\t\t}else\n\t\t\t\tif(strcmp(triangles->getInput_array()[i]->getSemantic(),\"TEXCOORD\")==0){\n\t\t\t\t\tt_offset = triangles->getInput_array()[i]->getOffset();\n\t\t\t\t\ttexcoord_input = triangles->getInput_array()[i];\n\t\t\t\t}\n\t\t\t\tif(max_offset< triangles->getInput_array()[i]->getOffset())\n\t\t\t\t\tmax_offset = triangles->getInput_array()[i]->getOffset();\n\t\t\t}\n\n\t\t\tdomSource *source_vertex;\n\t\t\tdomSource *source_texcoord=NULL;\n\t\t\tdaeURI *elementURI;\n\t\t\n\t\t\t\n\t\t\tdomVertices* domV;\n\t\t\tdomV = daeSafeCast<domVertices>(vertex_input->getSource().getElement());\n\t\n\t\t\tsource_vertex = daeSafeCast<domSource>(domV->getInput_array()[0]->getSource().getElement());\n\t\n\t\t\tif(texcoord_input)\n\t\t\t{\n\t\t\t\telementURI = &texcoord_input->getSource();\n\t\t\t\tsource_texcoord = daeSafeCast<domSource>(elementURI->getElement());\n\t\t\t}\n\t\n\t\t\tdomFloat_array *floatArray_vertex;\n\t\t\tdomFloat_array *floatArray_texcoord;\n\t\t\n\t\t\tif(source_vertex)\n\t\t\t\tfloatArray_vertex = &source_vertex->getFloat_array()[0];\n\n\t\t\tif(source_texcoord)\n\t\t\t\tfloatArray_texcoord = &source_texcoord->getFloat_array()[0];\n\t\n\t\t\tint stride = source_vertex->getTechnique_common()->getAccessor()->getStride();\n\t\t\n\t\t\t// Assume there are 3 values per vertex with a stride of 3.\n\t\t\t// Copy the vertices into my structure one-by-one\n\t\t\t// (converts from COLLADA's doubles to floats).\n\t\n\t\t\tfor ( unsigned int i = 0; i < floatArray_vertex->getCount(); i+=stride )\n\t\t\t{\n\t\t\t\tk3d::point3 vertex(floatArray_vertex->getValue()[i],\n\t\t\t\t\t\tfloatArray_vertex->getValue()[i+1],\n\t\t\t\t\t\tfloatArray_vertex->getValue()[i+2]);\n\t\t\t\tpoints.push_back(ccst*vertex);\n\t\t\t}\n\n\t\t\tif(source_texcoord)\n\t\t\t{\n\t\t\t\tstride = source_texcoord->getTechnique_common()->getAccessor()->getStride();\n\t\t\t\tfor ( unsigned int i = 0; i < floatArray_texcoord->getCount(); i+=stride)\n\t\t\t\t{\n\t\t\t\t\tk3d::texture3 texture(floatArray_texcoord->getValue()[i],\n\t\t\t\t\t\t\t\t\t1-floatArray_texcoord->getValue()[i+1],\n\t\t\t\t\t\t\t\t\t1);\n\t\t\t\t\ttexture_coordinates.push_back(texture);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Stores the list of polygons\n\t\t\tpoly = triangles->getP();\n\n\t\t\tmax_offset++;\n\t\n\t\t\tint tot = 0;\n\t\n\t\t\t// Add polygons into gprim_factory taking into account offsets to parse correctly\n\t\t\tfor (int i=0;i<polyCount;i++)\n\t\t\t{\n\t\t\t\tk3d::mesh::indices_t vertex_coordinates;\n\t\t\t\tk3d::mesh::indices_t texture_coordinates;\n\t\t\t\tk3d::mesh::indices_t normal_coordinates;\n\t\t\n\t\t\t\t// Copy all the indices from the domP into my structure.\n\t\t\t\tint vcount = 3;\n\t\t\t\tconst k3d::uint_t face_first_edge = polyhedron->vertex_points.size();\n\t\t\t\tfor(int v=0;v<vcount*max_offset;v+=max_offset)\n\t\t\t\t{\n\t\t\t\t\tif(v_offset!=-1)\n\t\t\t\t\t{\n\t\t\t\t\t\tpolyhedron->vertex_points.push_back(poly->getValue()[tot+v+v_offset]);\n\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->vertex_points.size());\n\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0.0);\n\t\t\t\t\t}\n\t\t\t\t\tif(t_offset!=-1)\n\t\t\t\t\t\ttexture_coordinates.push_back(poly->getValue()[tot+v+t_offset]);\n\t\t\t\t}\n\t\t\t\ttot+=vcount*max_offset;\n\t\t\t\tpolyhedron->clockwise_edges.back() = face_first_edge;\n\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\tpolyhedron->loop_first_edges.push_back(face_first_edge);\n\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\tpolyhedron->face_materials.push_back(static_cast<k3d::imaterial*>(0));\n\t\t\t\tpolyhedron->face_selections.push_back(0.0);\n\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->shell_types.size()-1);\n\t\t\t}\n\t\t}\n\t\tMesh.point_selection.create(new k3d::mesh::selection_t(Mesh.points->size(), 0.0));\n\t\tpolyhedron->vertex_selections.resize(polyhedron->vertex_points.size(), 0.0);\n\t}\n\n\tintLight::intLight(domLight& Light, const k3d::matrix4& ccst)\n\t{\n\t\t//TODO Extract light attributes\n\t}\n\n\tintCamera::intCamera(domCamera& Camera, const k3d::matrix4& ccst)\n\t{\n\t\t//TODO Extract camera attributes\n\t}\n}}}\n\n\n\n"
  },
  {
    "path": "modules/collada_io/int_elements.h",
    "content": "#ifndef MODULES_COLLADA_IO_INT_ELEMENTS_H\n#define MODULES_COLLADA_IO_INT_ELEMENTS_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Barbiero Mattia\n*/\n\n// int_elements is the implementation of the conversion between the dae format elements and\n// their equivalent on K-3D\n\n\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/algebra.h>\n#include <dom/domGeometry.h>\n#include <dom/domCamera.h>\n#include <dom/domLight.h>\n\n/**\n * Geometry describes the visual shape and appearance of an object in the\n * scene. The geometry element categorizes the declaration of geometric information.\n * Geometry is a  branch of mathematics that deals with the measurement, properties,\n * and relationships of  points, lines, angles, surfaces, and solids.\n */\n\nnamespace module\n{\n\nnamespace collada\n{\n\nnamespace io\n{\n\nusing namespace ColladaDOM141;\n\n// Integrates mesh creation and loading\n// from domGeometry -> FrozenMesh\nclass intGeometry\n{\nprivate:\n\n    k3d::mesh Mesh;\npublic: // Constuctor and Destructor\n\t/**\n\t* Default Constructor.\n\t* Passes ccst (Current Coordinate System Transformation) to compute real vertex positions\n\t*/\n\tintGeometry(domGeometry&, const k3d::matrix4& ccst);\n\n\t/// returns generated mesh in k3d::mesh format\n\tk3d::mesh getMesh(){return Mesh;}\n\t/**\n\t * Default Destructor.\n\t */\n\t~intGeometry(){}\n};\n\n// Integrates camera loading\n// from domCamera -> Camera\nclass intCamera\n{\nprivate:\n\tk3d::point3 Position;\n\tk3d::point3 Direction;\n\t//k3d::float FOV;\npublic:\n\tintCamera(domCamera&, const k3d::matrix4& ccst);\n\tk3d::point3 get_position(){return Position;}\n\tk3d::point3 get_direction(){return Direction;}\n};\n\n\n// Integrates light loading\n// from domLight -> Light\nclass intLight\n{\nprivate:\n\tk3d::point3 Position;\npublic:\n\tintLight(domLight&, const k3d::matrix4& ccst);\n\tk3d::point3 get_position(){return Position;}\n};\n\n}}}\n\n#endif // !MODULES_COLLADA_IO_INT_ELEMENTS_H\n"
  },
  {
    "path": "modules/collada_io/integration.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n\t\\author Barbiero Mattia\n*/\n\n#include <list>\n#include <vector>\n#include <iostream>\n#include <dae.h>\n#include <dom/domMaterial.h>\n#include <dom/domGeometry.h>\n#include <dom/domNode.h>\n#include <dom/domCOLLADA.h>\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/imesh_storage.h>\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n\n\n#include \"integration.h\"\n#include \"int_elements.h\"\nusing namespace std;\nnamespace module\n{\n\nnamespace collada\n{\n\nnamespace io\n{\n\n/// Creates a new FrozenMesh using the given name, and returns a pointer to the MeshInstance of the new node\nk3d::inode* create_frozen_mesh(k3d::idocument& Document, const std::string& Name, k3d::mesh* Mesh)\n{\n\tstd::string unique_name = k3d::unique_name(Document.nodes(), Name);\n\t// The frozen mesh\n\tk3d::inode* const mesh_node = k3d::plugin::create<k3d::inode>(k3d::classes::FrozenMesh(), Document, unique_name);\n\t// The mesh instance\n\tk3d::inode* const mesh_instance = k3d::plugin::create<k3d::inode>(k3d::classes::MeshInstance(), Document, unique_name + \" Instance\");\n\t// Set painters\n\tconst k3d::nodes_t gl_nodes = k3d::node::lookup(Document, \"GL Default Painter\");\n\tk3d::inode* gl_painter = (1 == gl_nodes.size()) ? *gl_nodes.begin() : 0;\n\tconst k3d::nodes_t ri_nodes = k3d::node::lookup(Document, \"RenderMan Default Painter\");\n\tk3d::inode* ri_painter = (1 == ri_nodes.size()) ? *ri_nodes.begin() : 0;\n\tk3d::property::set_internal_value(*mesh_instance, \"gl_painter\", gl_painter);\n\tk3d::property::set_internal_value(*mesh_instance, \"ri_painter\", ri_painter);\n\t// Connect the MeshInstance\n\tk3d::ipipeline::dependencies_t dependencies;\n\tk3d::imesh_sink* const mesh_sink = dynamic_cast<k3d::imesh_sink*>(mesh_instance);\n\tk3d::imesh_source* const mesh_source = dynamic_cast<k3d::imesh_source*>(mesh_node);\n\tif(mesh_sink && mesh_node)\n\t\tdependencies.insert(std::make_pair(&mesh_sink->mesh_sink_input(), &mesh_source->mesh_source_output()));\n\tDocument.pipeline().set_dependencies(dependencies);\n\tk3d::imesh_storage* mesh_storage = dynamic_cast<k3d::imesh_storage*>(mesh_node);\n\treturn_val_if_fail(mesh_storage, 0);\n\tmesh_storage->reset_mesh(Mesh);\n\t\n\t// Make the mesh_instance visible (shamelessly stolen from document_state.cpp)\n\tconst k3d::inode_collection::nodes_t::const_iterator doc_node_end = Document.nodes().collection().end();\n\tfor(k3d::inode_collection::nodes_t::const_iterator doc_node = Document.nodes().collection().begin(); doc_node != doc_node_end; ++doc_node)\n\t{\n\t\tif(k3d::inode_collection_sink* const node_collection_sink = dynamic_cast<k3d::inode_collection_sink*>(*doc_node))\n\t\t{\n\t\t\tconst k3d::inode_collection_sink::properties_t properties = node_collection_sink->node_collection_properties();\n\t\t\tfor(k3d::inode_collection_sink::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t\t{\n\t\t\t\tif(k3d::inode_collection_property* const node_collection_property = dynamic_cast<k3d::inode_collection_property*>(*property))\n\t\t\t\t{\n\t\t\t\t\tk3d::inode_collection_property::nodes_t nodes = k3d::property::internal_value<k3d::inode_collection_property::nodes_t>(**property);\n\t\t\t\t\tif(node_collection_property->property_allow(*mesh_instance))\n\t\t\t\t\t\tnodes.push_back(mesh_instance);\n\t\t\t\t\tk3d::property::set_internal_value(**property, nodes);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn mesh_instance;\n}\n\n/// Creates a new Light using the given name, and returns a pointer to the Node of the new node\nk3d::inode* create_light(k3d::idocument& Document, const std::string& Name)\n{\n\tstd::string unique_name = k3d::unique_name(Document.nodes(), Name);\n\tk3d::inode* const light_node = k3d::plugin::create<k3d::inode>(k3d::uuid(1,0,0,29), Document, unique_name);\n\treturn light_node;\n}\n\n/// Creates a new Camera using the given name, and returns a pointer to the Node of the new node\nk3d::inode* create_camera(k3d::idocument& Document, const std::string& Name)\n{\n\tstd::string unique_name = k3d::unique_name(Document.nodes(), Name);\n\tk3d::inode* const camera_node = k3d::plugin::create<k3d::inode>(k3d::classes::Camera(), Document, unique_name);\n\treturn camera_node;\n}\n\nNode::Node(domNode& node, const k3d::matrix4& mat)\n{\n\t// Extract and compute transformation matrix\n\tk3d::matrix4 mcurrent = getTransformation(node);\n\t\n\n\t// Recursively convert all child nodes. First iterate over the <node> elements.\n\tfor (size_t i = 0; i < node.getNode_array().getCount(); i++)\n\t\tchildNodes.push_back(&lookup<Node, domNode>(*node.getNode_array()[i],mcurrent));\n\n\t// Then iterate over the <instance_node> elements.\n\tfor (size_t i = 0; i < node.getInstance_node_array().getCount(); i++) \n\t{\n\t\tdomNode* child = daeSafeCast<domNode>(node.getInstance_node_array()[i]->getUrl().getElement());\n\t\tif(!child)\n\t\t{\n\t\t\tk3d::log() << \"Invalid <instance_node> element\\n\";\n\t\t\treturn;\n\t\t}\n\t\tchildNodes.push_back(&lookup<Node, domNode>(*child,mcurrent));\n\t}\n\n\t// Iterate over all the <instance_geometry> elements\n\tfor (size_t i = 0; i < node.getInstance_geometry_array().getCount(); i++) \n\t{\n\t\tdomInstance_geometry* instanceGeom = node.getInstance_geometry_array()[i];\n\t\tdomGeometry* geom = daeSafeCast<domGeometry>(instanceGeom->getUrl().getElement());\n\t\tif(!geom)\n\t\t{\n\t\t\tk3d::log() << \"Invalid <instance_geometry> element\\n\";\n\t\t\treturn;\n\t\t}\n\t\t// Lookup the material that we should apply to the <geometry>. In a real app\n\t\t// we'd need to worry about having multiple <instance_material>s, but in this\n\t\t// test let's just convert the first <instance_material> we find.\n\t\t//domInstance_material* instanceMtl = daeSafeCast<domInstance_material>(\n\t\t\t//instanceGeom->getDescendant(\"instance_material\"));\n\t\t//Check(instanceMtl);\n\t\t//domMaterial* mtl = daeSafeCast<domMaterial>(instanceMtl->getTarget().getElement());\n\t\t//Check(mtl);\n\t\t//Material& convertedMtl = lookup<Material, domMaterial>(*mtl);\n\n\t\t// Now convert the geometry, add the result to our list of meshes, and assign\n\t\t// the mesh a material.\n\t\tmeshes.push_back(&lookup<intGeometry, domGeometry>(*geom,mcurrent));\n\t\t//meshes.back()->mtl = &convertedMtl;\n\t}\n\n\t// Iterate over all the <instance_light> elements\n\tfor(size_t i=0; i < node.getInstance_light_array().getCount(); i++)\n\t{\n\t\tdomInstance_light* instanceLight = node.getInstance_light_array()[i];\n\t\tdomLight* light = daeSafeCast<domLight>(instanceLight->getUrl().getElement());\n\t\tif(!light)\n\t\t{\n\t\t\tk3d::log() << \"Invalid <instance_light> element\\n\";\n\t\t\treturn;\n\t\t}\n\t\tlights.push_back(&lookup<intLight, domLight>(*light, mcurrent));\n\t}\n\n\t// Iterate over all the <instance_camera> elements\n\tfor(size_t i=0; i < node.getInstance_camera_array().getCount(); i++)\n\t{\n\t\tdomInstance_camera* instanceCamera = node.getInstance_camera_array()[i];\n\t\tdomCamera* camera = daeSafeCast<domCamera>(instanceCamera->getUrl().getElement());\n\t\tif(!camera)\n\t\t{\n\t\t\tk3d::log() << \"Invalid <instance_camera> element\\n\";\n\t\t\treturn;\n\t\t}\n\t\tcameras.push_back(&lookup<intCamera, domCamera>(*camera, mcurrent));\n\t}\n}\n\nk3d::matrix4 Node::getTransformation(domNode& node)\n{\n\tk3d::matrix4 result = k3d::identity3();\n\n\t// Look for Translations\n\tdomTranslate_Array translate_array = node.getTranslate_array();\n\tfor(int i=0; i<translate_array.getCount(); i++)\n\t{\n\t\tdomTranslate* translate = translate_array[i];\n\t\tdomFloat3 trans = translate->getValue();\n\t\tk3d::matrix4 tmp_matrix = k3d::identity3();\n\t\ttmp_matrix[0][3] = trans[0];\n\t\ttmp_matrix[1][3] = trans[1];\n\t\ttmp_matrix[2][3] = trans[2];\n\t\tresult = result * tmp_matrix;\n\t}\n\n\t// Look for Scaling\n\tdomScale_Array scale_array = node.getScale_array();\n\tfor(int i=0; i<scale_array.getCount(); i++)\n\t{\n\t\tdomScale* scale = scale_array[i];\n\t\tdomFloat3 sc = scale->getValue();\n\t\tk3d::matrix4 tmp_matrix = k3d::identity3();\n\t\ttmp_matrix[0][0] = sc[0];\n\t\ttmp_matrix[1][1] = sc[1];\n\t\ttmp_matrix[2][2] = sc[2];\n\t\tresult = result * tmp_matrix;\n\t}\n\n\t// Look for Rotations\n\tdomRotate_Array rotate_array = node.getRotate_array();\n\tfor(int i=0; i<rotate_array.getCount(); i++)\n\t{\n\t\tdomRotate* rotate = rotate_array[i];\n\t\tdomFloat4 rot = rotate->getValue();\n\t\tk3d::matrix4 tmp_matrix = k3d::identity3();\n\t\tfloat c = cos(k3d::radians(rot[3])), s = sin(k3d::radians(rot[3])), C = 1-c;\n\t\tfloat x = rot[0], y = rot[1], z = rot[2];\n\t\tfloat xs = x*s, ys = y*s, zs = z*s;\n\t\tfloat xC = x*C, yC = y*C, zC = z*C;\n\t\tfloat xyC=x*y*C,yzC=y*z*C,zxC=z*x*C;\n\t\ttmp_matrix[0][0] = x*xC+c;\n\t\ttmp_matrix[0][1] = xyC-zs;\n\t\ttmp_matrix[0][2] = zxC+ys;\n\t\ttmp_matrix[1][0] = xyC+zs;\n\t\ttmp_matrix[1][1] = y*yC+c;\n\t\ttmp_matrix[1][2] = yzC-xs;\n\t\ttmp_matrix[2][0] = zxC-ys;\n\t\ttmp_matrix[2][1] = yzC+xs;\n\t\ttmp_matrix[2][2] = z*zC+c;\n\t\tresult = result * tmp_matrix;\n\t}\n\n\treturn result;\n}\n\n\n//void convertModel(domCOLLADA& root, k3d::mesh& Mesh) \ndaeParser::daeParser(domCOLLADA& root, k3d::mesh& Mesh)\n{\n\t// We need to convert the model from the DOM's representation to our internal representation.\n\t// First find a <visual_scene> to load. In a real app we would look for and load all\n\t// the <visual_scene>s in a document, but for this app we just convert the first\n\t// <visual_scene> we find.\n\n\tdomVisual_scene* visualScene = daeSafeCast<domVisual_scene>(root.getDescendant(\"visual_scene\"));\n\tif(!visualScene)\n\t{\n\t\tk3d::log() << \"Invalid <visual_scene> element\\n\";\n\t\treturn;\n\t}\n\t// Now covert all the <node>s in the <visual_scene>. This is a recursive process,\n\t// so any child nodes will also be converted.\n\tdomNode_Array& nodes = visualScene->getNode_array();\n\tfor (size_t i = 0; i < nodes.getCount(); i++)\n\t\tlookup<Node, domNode>(*nodes[i],k3d::identity3());\n\t//k3d::log() << \"ASDFASDFASDf\" << std::endl;\n\t\n\t//for (size_t i = 0; i < nodes.getCount(); i++)\n\t//\tif(!lookup<Node, domNode>(*nodes[i],k3d::identity3()).meshes.empty()){\t\n\t//\t\tMesh = lookup<Node, domNode>(*nodes[i],k3d::identity3()).meshes.back()->getMesh();\n\t//\t\treturn;\n\t//\t}\n\t\n}\n\ndaeParser::daeParser(domCOLLADA& root, k3d::idocument& Document)\n{\n\n\t// We need to convert the model from the DOM's representation to our internal representation.\n\t// First find a <visual_scene> to load. In a real app we would look for and load all\n\t// the <visual_scene>s in a document, but for this app we just convert the first\n\t// <visual_scene> we find.\n\tdomVisual_scene* visualScene = daeSafeCast<domVisual_scene>(root.getDescendant(\"visual_scene\"));\n\tif(!visualScene)\n\t{\n\t     k3d::log() << \"Invalid <visual_scene> element\\n\";\n\t     return;\n\t}\n\n\t// Now covert all the <node>s in the <visual_scene>. This is a recursive process,\n\t// so any child nodes will also be converted.\n\tdomNode_Array& scene_nodes = visualScene->getNode_array();\n\tfor (size_t i = 0; i < scene_nodes.getCount(); i++)\n\t\tlookup<Node, domNode>(*scene_nodes[i],k3d::identity3());\n\n\n\t////////////////////////////////////////////////////\n\t////////////////////////////////////////////////////\n\n\t//k3d::inode_collection::nodes_t nodes;\n\t//std::vector<k3d::inode*> persistent_nodes;\n\n\tfor(size_t i =0; i < scene_nodes.getCount(); i++)\n\t{\n\t\tstd::string name;// = \"Light\";\n\t\tk3d::uuid factory_id;// = k3d::uuid(1,0,0,29);\n\n\t\tif(!lookup<Node, domNode>(*scene_nodes[i],k3d::identity3()).lights.empty())\n\t\t{\n\t\t\tk3d::inode *light_node;\n\t\t\tlight_node = create_light(Document,\"COLLADA Light\");\n\t\t}\n\t\telse\n\t\tif(!lookup<Node, domNode>(*scene_nodes[i],k3d::identity3()).cameras.empty())\n\t\t{\n\t\t\tk3d::inode *camera_node;\n\t\t\tcamera_node = create_camera(Document,\"COLLADA Camera\");\n\t\t}\n\t\telse\n\t\tif(!lookup<Node, domNode>(*scene_nodes[i],k3d::identity3()).meshes.empty())\n\t\t{\n\t\t\tk3d::mesh *mesh = new k3d::mesh();\n\t\t\tcreate_frozen_mesh(Document,\"COLLADA Mesh\", mesh);\n\t\t\t*mesh = lookup<Node, domNode>(*scene_nodes[i],k3d::identity3()).meshes.back()->getMesh();\n\t\t\tcontinue;\n\t\t}\n\t\telse\n\t\t\tfactory_id == k3d::uuid::null();\n/*\n\t\tif(factory_id == k3d::uuid::null())\n\t\t{\n\t\t\tk3d::log() << error << \"node [\" << name << \"] with unspecified factory ID will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst k3d::ipersistent_lookup::id_type node_id = 2;\n\t\tif(node_id == 0)\n\t\t{\n\t\t\tk3d::log() << error << \"node [\" << name << \"] with unspecified ID will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\t\n\t\tk3d::iplugin_factory* const plugin_factory = k3d::plugin::factory::lookup(factory_id);\n\t\tif(!plugin_factory)\n\t\t{\n\t\t\tk3d::log() << error << \"node [\" << name << \"] with unknown factory ID [\" << factory_id << \"] will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\t\n\t\tk3d::idocument_plugin_factory* const document_plugin_factory = dynamic_cast<k3d::idocument_plugin_factory*>(plugin_factory);\n\t\tif(!document_plugin_factory)\n\t\t{\n\t\t\tk3d::log() << error << \"Non-document plugin [\" << name << \"] will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\t\n\t\tk3d::inode* const node = document_plugin_factory->create_plugin(*plugin_factory, Document);\n\t\tif(!node)\n\t\t{\n\t\t\tk3d::log() << error << \"Error creating node [\" << name << \"] instance\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\t\n\t\tk3d::ipersistent* const persistent = dynamic_cast<k3d::ipersistent*>(node);\n\t\tif(!persistent)\n\t\t{\n\t\t\tk3d::log() << error << \"node [\" << name << \"] does not support persistence\" << std::endl;\n\t\n\t\t\tdelete node;\n\t\t\tcontinue;\n\t\t}\n\t\n\t\tk3d::undoable_new(node, Document);\n\t\n\t\tnodes.push_back(node);\n\t\tpersistent_nodes.push_back(node);\n*/\n\t}\n\n\t//Document.nodes().add_nodes(nodes);\n\t////////////////////////////////////////////////////\n\t////////////////////////////////////////////////////\n}\n\n}}}\n"
  },
  {
    "path": "modules/collada_io/integration.h",
    "content": "#ifndef MODULES_COLLADA_IO_INTEGRATION_H\n#define MODULES_COLLADA_IO_INTEGRATION_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n\t\\author Barbiero Mattia\n*/\n\n#include <list>\n#include <vector>\n#include <iostream>\n#include <stack>\n#include <dae.h>\n#include <dom/domMaterial.h>\n#include <dom/domGeometry.h>\n#include <dom/domNode.h>\n#include <dom/domCOLLADA.h>\n#include <k3dsdk/mesh_source.h>\n#include \"int_elements.h\"\n\nusing namespace std;\nnamespace module\n{\n\nnamespace collada\n{\n\nnamespace io\n{\n\t// Our node structure, which we create by converting a domNode object\n\tclass Node {\n\tpublic:\n\t\tlist<intGeometry*> meshes;\n\t\tlist<intCamera*> cameras;\n\t\tlist<intLight*> lights;\n\t\tlist<Node*> childNodes;\n\t\n\t\t// This is defined later to work around a circular dependency on the lookup function\n\t\tNode(domNode& node, const k3d::matrix4& mat);\n\t\tk3d::matrix4 getTransformation(domNode& node);\n\t};\n\t\n\t// This function checks to see if a user data object has already been attached to\n\t// the DOM object. If so, that object is casted from void* to the appropriate type\n\t// and returned, otherwise the object is created and attached to the DOM object\n\t// via the setUserData method.\n\ttemplate<typename MyType, typename DomType>\n\tMyType& lookup(DomType& domObject, const k3d::matrix4& mat) {\n\t\tif (!domObject.getUserData())\n\t\t\tdomObject.setUserData(new MyType(domObject,mat));\n\t\treturn *(MyType*)(domObject.getUserData());\n\t\n\t}\n\t\n\t// This function traverses all the DOM objects of a particular type and frees\n\t// destroys the associated user data object.\n\ttemplate<typename MyType, typename DomType>\n\tvoid freeConversionObjects(DAE& dae) {\n\t\tvector<daeElement*> elts = dae.getDatabase()->typeLookup(DomType::ID());\n\t\tfor (size_t i = 0; i < elts.size(); i++)\n\t\t\tdelete (MyType*)elts[i]->getUserData();\n\t\n\t}\n\n\tenum\n\t{IMPORTER,READER};\t\n\n\tclass daeParser\n\t{\n\tpublic:\n\t\tdaeParser(domCOLLADA& root, k3d::mesh& Mesh);\n\t\tdaeParser(domCOLLADA& root, k3d::idocument& Document);\n\t\t//k3d::mesh get_mesh(){return Mesh;}\n\t\t//k3d::idocument &get_document(){return Document;}\n\tprivate:\n\t\t//k3d::mesh Mesh;\n\t\t//k3d::idocument Document;\n\t};\n\t//void convertModel(domCOLLADA&, k3d::mesh& );\n}}}\n\n#endif // !MODULES_COLLADA_IO_INTEGRATION_H\n\n"
  },
  {
    "path": "modules/collada_io/mesh_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n\t\\author Barbiero Mattia\n*/\n\n#define COLLADA_DOM_SUPPORT141\n\n#include \"int_elements.h\"\n#include \"integration.h\"\n#include \"collada.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_reader.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/path.h>\n\n#include <dae.h>\n#include <dom/domCOLLADA.h>\n#include <dom/domConstants.h>\n\nnamespace module\n{\n\nnamespace collada\n{\n\nnamespace io\n{\n\n\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_reader\n\nclass mesh_reader :\n\tpublic k3d::mesh_reader<k3d::node >\n{\n\ttypedef k3d::mesh_reader<k3d::node > base;\n\npublic:\n\tmesh_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) : base(Factory, Document),\n\t\tm_geom(init_owner(*this) + init_name(\"geom\") + init_label(_(\"Geometry\")) + init_description(_(\"Geometry index from file to extract mesh\")) + init_value(0) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_geom.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reload_mesh_slot()));\n\t}\n\n\tvoid on_load_mesh(const k3d::filesystem::path& Path, k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\t// Instantiate the reference implementation\n\t\tDAE dae(NULL, NULL, \"1.4.1\");\n\n\t\tdomCOLLADA* root = dae.open141(Path.native_filesystem_string());\n\t\tif(!root) {\n            \t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << Path.native_console_string() << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\t\t// Do the conversion. The conversion process throws an exception on error, so\n\t\t// we'll include a try/catch handler.\n\t\t//daeParser dae_file(*root, Output);\n\n\t\t//Add all possible Geometries to pipeline\n\t\tdomLibrary_geometries_Array library_geometries = root->getLibrary_geometries_array();\n\n\t\tif(library_geometries.getCount()==0)\n\t\t\treturn;\n\n\t\tdomGeometry_Array geometries = library_geometries[0]->getGeometry_array();\n\n\t\tint cur_geom = m_geom.pipeline_value();\n\t\tif(cur_geom >= geometries.getCount())\n\t\t{\n\t\t\tk3d::log() << error << \"There aren't that many geometries in file!\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tintGeometry geom = intGeometry(*geometries[cur_geom], k3d::identity3());\n\t\tOutput = geom.getMesh();\n\n\t\t// destroy the objects we created during the conversion process\n\t\tfreeConversionObjects<Node, domNode>(dae);\n\t\tfreeConversionObjects<intGeometry, domGeometry>(dae);\n\t\t//freeConversionObjects<Material, domMaterial>(dae);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_reader,k3d::interface_list<k3d::imesh_source,k3d::interface_list<k3d::imesh_storage> > > factory(\n\t\t\tk3d::uuid(0x4d603851, 0x0441b8b5, 0x294d5a8c, 0x95478016),\n\t\t\t\"COLLADAMeshReader\",\n\t\t\t_(\"Mesh reader that loads external COLLADA (.dae) files into the document by reference\"),\n\t\t\t\"MeshReader\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(int, immutable_name, change_signal, no_undo, local_storage, no_constraint, measurement_property, with_serialization) m_geom;\n};\n\nk3d::iplugin_factory& mesh_reader_factory()\n{\n\treturn mesh_reader::get_factory();\n}\n\n} // namespace io\n\n} // namespace collada\n\n} // namespace module\n"
  },
  {
    "path": "modules/collada_io/mesh_writer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Wladyslaw Strugala (fizws@julia.univ.gda.pl)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/mesh_sink.h>\n#include <k3dsdk/node.h>\n#include \"collada.h\"\n\nnamespace module\n{\n\nnamespace collada\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_writerio\n\nclass mesh_writer :\n\tpublic k3d::mesh_sink<k3d::node >\n{\n\ttypedef k3d::mesh_sink<k3d::node > base;\n\npublic:\n\tmesh_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Output file\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::WRITE) + init_path_type(\"obj_files\"))\n\t{\n\t\tm_file.changed_signal().connect(sigc::mem_fun(*this, &mesh_writer::on_write_file));\n\t\tm_input_mesh.changed_signal().connect(sigc::mem_fun(*this, &mesh_writer::on_write_file));\n\t}\n\n\tvoid on_write_file(k3d::iunknown*)\n\t{\n\t\tconst k3d::filesystem::path path = m_file.pipeline_value();\n\t\tk3d::mesh* const mesh = m_input_mesh.pipeline_value();\n\n\t\tif(!mesh || path.empty())\n\t\t\treturn;\n\n\t\tk3d::log() << info << \"Writing .dae file: \" << path.native_console_string() << std::endl;\n\n\t\t// The main file where de mesh will be exported\n\t\tDAE dae(NULL, NULL, \"1.4.1\");\n\t\t//Create root branch of the dae xml tree and create the only library we are\n\t\t// going to need, library_geometries where we are going to store the mesh\n\t\tdaeElement *root = dae.add(path.native_console_string());\n\t\tdaeElement *library_geometries = root->add(\"library_geometries\");\n\n\t\t// Every dae file needs an asset node for reference\n\t\tdaeElement *asset = root->add(\"asset\");\n\t\tdaeElement* contributor = asset->add(\"contributor\");\n\t\tdaeElement* created = asset->add(\"created\");\n\t\tdaeElement* modified = asset->add(\"modified\");\n\n\t\t// Fill asset values. Note that the date is hardcoded, this is going to be changed soon\n\t\tstd::stringstream author;\n\t\tauthor << \"K-3D \" << K3D_PACKAGE << \" , \" << K3D_VERSION << \" , \" << K3D_HOST;\n\t\tcontributor->setCharData(author.str().c_str());\n\t\tconst char* date = \"2008-04-08T13:07:52-08:00\";\n\t\tcreated->setCharData(date);\n\t\tmodified->setCharData(date);\n\n\t\t// Store the mesh source into library_geometries using the name \"K3DGeometry\" for reference\n\t\taddGeometry(library_geometries, \"K3DGeometry\", mesh);\n\n\t\t// Setup visual scenes library and the main scene\n\t\tSafeAdd(root, \"library_visual_scenes\", visualSceneLib);\n\t\tSafeAdd(visualSceneLib, \"visual_scene\", visualScene);\n\t\tvisualScene->setAttribute(\"id\", \"mainScene\");\n\n\t\tSafeAdd(visualScene, \"node\", node);\n\t\tnode->setAttribute(\"id\", \"K3DWriter_mesh\");\n\t\tnode->setAttribute(\"name\", \"K3DWriter_mesh\");\n\n\t\t// Instantiate the <geometry> so it is displayed on the scene\n\t\tSafeAdd(node, \"instance_geometry\", instanceGeom);\n\t\tinstanceGeom->setAttribute(\"url\", makeUriRef(\"K3DGeometry\").c_str());\n\n\t\t// Add the main scene to root file and instanciate the created visual_scene\n\t\troot->add(\"scene instance_visual_scene\")->setAttribute(\"url\", makeUriRef(\"mainScene\").c_str());\n\n\t\tdae.writeAll();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_writer, k3d::interface_list<k3d::imesh_sink > > factory(\n\t\t\tk3d::uuid(0xcf5833ea, 0x264c781c, 0x844512a5, 0xe2270efc),\n\t\t\t\"COLLADAMeshWriter\",\n\t\t\t_(\"Mesh writer that saves external COLLADA (.dae) files\"),\n\t\t\t\"MeshWriter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n};\n\nk3d::iplugin_factory& mesh_writer_factory()\n{\n\treturn mesh_writer::get_factory();\n}\n\n}\n}\n}\n"
  },
  {
    "path": "modules/collada_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n\t\\author Barbiero Mattia\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace collada\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& mesh_reader_factory();\nextern k3d::iplugin_factory& mesh_writer_factory();\nextern k3d::iplugin_factory& document_importer_factory();\nextern k3d::iplugin_factory& document_exporter_factory();\n\n} // namespace io\n\n} // namespace collada\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::collada::io::document_importer_factory());\n\tRegistry.register_factory(module::collada::io::document_exporter_factory());\n\tRegistry.register_factory(module::collada::io::mesh_reader_factory());\n\tRegistry.register_factory(module::collada::io::mesh_writer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/compiz/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_DBUS_INCLUDE_DIRS})\nLINK_DIRECTORIES(${K3D_DBUS_LIB_DIRS})\n\nK3D_BUILD_MODULE(k3d-compiz)\nK3D_CREATE_MODULE_PROXY(k3d-compiz)\nTARGET_LINK_LIBRARIES(k3d-compiz ${K3D_DBUS_LIBS})\n\n"
  },
  {
    "path": "modules/compiz/compiz_check.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/user_interface.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <stdexcept>\n\n#include <dbus/dbus-glib.h>\n\nnamespace module\n{\n\nnamespace compiz\n{\n\nclass compiz_check :\n\tpublic k3d::iunknown\n{\npublic:\n\tcompiz_check()\n\t{\n\t\tg_type_init();\n\n\t\tGError* error = 0;\n\t\tDBusGConnection* const connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);\n\t\tif(connection)\n\t\t{\n\t\t\tDBusGProxy* const proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);\n\t\t\tif(proxy)\n\t\t\t{\n\t\t\t\tgboolean compiz_running = false;\n\t\t\t\tif(dbus_g_proxy_call(proxy, \"NameHasOwner\", &error, G_TYPE_STRING, \"org.freedesktop.compiz\", G_TYPE_INVALID, G_TYPE_BOOLEAN, &compiz_running, G_TYPE_INVALID))\n\t\t\t\t{\n\t\t\t\t\tif(compiz_running)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::user_interface().nag_message(\n\t\t\t\t\t\t\t\"CompizCheck/1\",\n\t\t\t\t\t\t\tk3d::ustring::from_utf8(_(\"Found running Compiz window manager.\")),\n\t\t\t\t\t\t\tk3d::ustring::from_utf8(_(\"Depending on your system hardware, Compiz may interfere with rendering in K-3D and other OpenGL applications.  If you have problems (black viewport, problems with viewport updates, etc), try disabling Compiz and re-running K-3D.\")));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"Error testing for org.freedesktop.compiz: \" << error->message << std::endl;\n\t\t\t\t}\n\n\t\t\t\tg_object_unref(proxy);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Error creating proxy for org.freedesktop.DBus\" << std::endl;\n\t\t\t}\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tk3d::log() << error << \"Error connecting to DBus session bus: \" << error->message << std::endl;\n\t\t}\n\n\t\tif(error)\n\t\t{\n\t\t\tg_error_free(error);\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<compiz_check,\n\t\t\tk3d::interface_list<k3d::iunknown> > factory(\n\t\t\t\tk3d::uuid(0x0f389f4a, 0xaf41ac00, 0xfc7fe4bf, 0x3524c1eb),\n\t\t\t\t\"CompizCheck\",\n\t\t\t\t_(\"Warns users that the Compiz window manager may interfere with OpenGL rendering in K-3D\"),\n\t\t\t\t\"Desktop\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tboost::assign::map_list_of(\"ngui:application-start\", \"true\")(\"qtui:application-start\", \"true\"));\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& compiz_check_factory()\n{\n\treturn compiz_check::get_factory();\n}\n\n} // namespace compiz\n\n} // namespace module\n"
  },
  {
    "path": "modules/compiz/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace compiz\n{\n\nextern k3d::iplugin_factory& compiz_check_factory();\n\n} // namespace compiz\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::compiz::compiz_check_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/core/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_FTGL_INCLUDE_DIR})\nINCLUDE_DIRECTORIES(${K3D_FREETYPE2_INCLUDE_DIRS})\nLINK_DIRECTORIES(${K3D_FREETYPE2_LIB_DIRS})\n\nK3D_BUILD_MODULE(k3d-core)\nK3D_CREATE_MODULE_PROXY(k3d-core)\n\nTARGET_LINK_LIBRARIES(k3d-core ${K3D_FTGL_LIBRARY})\nTARGET_LINK_LIBRARIES(k3d-core ${K3D_FREETYPE2_LIBS})\n\n"
  },
  {
    "path": "modules/core/axes.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/ibounded.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/snap_target.h>\n#include <k3dsdk/snappable.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/transformable.h>\n#include <k3dsdk/vectors.h>\n\n#include <FTGL/ftgl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace core\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// axes\n\n/// Provides a configurable set of axes to assist users in visualizing the 3D workspace\nclass axes :\n\tpublic k3d::snappable<k3d::gl::renderable<k3d::transformable<k3d::node > > >,\n\tpublic k3d::ibounded\n{\n\ttypedef k3d::snappable<k3d::gl::renderable<k3d::transformable<k3d::node > > > base;\n\npublic:\n\taxes(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_axes(init_owner(*this) + init_name(\"axes\") + init_label(_(\"Axes\")) + init_description(_(\"Display XYZ axes\")) + init_value(true)),\n\t\tm_xy_plane(init_owner(*this) + init_name(\"xyplane\") + init_label(_(\"XY Plane\")) + init_description(_(\"Display XY plane as a grid\")) + init_value(true)),\n\t\tm_yz_plane(init_owner(*this) + init_name(\"yzplane\") + init_label(_(\"YZ Plane\")) + init_description(_(\"Display YZ plane as a grid\")) + init_value(false)),\n\t\tm_xz_plane(init_owner(*this) + init_name(\"xzplane\") + init_label(_(\"XZ Plane\")) + init_description(_(\"Display XZ plane as a grid\")) + init_value(false)),\n\t\tm_grid_size(init_owner(*this) + init_name(\"gridsize\") + init_label(_(\"Grid Size\")) + init_description(_(\"The size of each grid square\")) + init_value(2.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_grid_count(init_owner(*this) + init_name(\"gridcount\") + init_label(_(\"Grid Count\")) + init_description(_(\"Number of squares along each grid\")) + init_value(5) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_x_color(init_owner(*this) + init_name(\"xcolor\") + init_label(_(\"X Color\")) + init_description(_(\"X axis color\")) + init_value(k3d::color(1, 0, 0))),\n\t\tm_y_color(init_owner(*this) + init_name(\"ycolor\") + init_label(_(\"Y Color\")) + init_description(_(\"Y axis color\")) + init_value(k3d::color(0, 0.7, 0))),\n\t\tm_z_color(init_owner(*this) + init_name(\"zcolor\") + init_label(_(\"Z Color\")) + init_description(_(\"Z axis color\")) + init_value(k3d::color(0, 0, 0.7))),\n\t\tm_grid_color(init_owner(*this) + init_name(\"gridcolor\") + init_label(_(\"Grid Color\")) + init_description(_(\"Grid color\")) + init_value(k3d::color(0.4, 0.4, 0.4))),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(k3d::share_path() / k3d::filesystem::generic_path(\"fonts/Vera.ttf\")) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_font_size(init_owner(*this) + init_name(\"font_size\") + init_label(_(\"Font Size\")) + init_description(_(\"Font size.\")) + init_value(12.0))\n\t{\n\t\tm_axes.changed_signal().connect(make_async_redraw_slot());\n\t\tm_xy_plane.changed_signal().connect(make_async_redraw_slot());\n\t\tm_yz_plane.changed_signal().connect(make_async_redraw_slot());\n\t\tm_xz_plane.changed_signal().connect(make_async_redraw_slot());\n\t\tm_grid_size.changed_signal().connect(make_async_redraw_slot());\n\t\tm_grid_count.changed_signal().connect(make_async_redraw_slot());\n\t\tm_x_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_y_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_z_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_grid_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_input_matrix.changed_signal().connect(make_async_redraw_slot());\n\n\t\tm_font_path.changed_signal().connect(sigc::mem_fun(this, &axes::on_font_changed));\n\t\tm_font_size.changed_signal().connect(sigc::mem_fun(this, &axes::on_font_changed));\n\n\t\tadd_snap_target(new k3d::snap_target(_(\"Grid\"), sigc::mem_fun(*this, &axes::grid_target_position), sigc::mem_fun(*this, &axes::grid_target_orientation)));\n\t}\n\n\tvoid on_font_changed(k3d::ihint*)\n\t{\n\t\tm_font.reset();\n\t\tasync_redraw(0);\n\t}\n\n\tbool grid_target_position(const k3d::point3& Position, k3d::point3& TargetPosition)\n\t{\n\t\tconst double grid_size = m_grid_size.pipeline_value();\n\n\t\tTargetPosition = k3d::point3(\n\t\t\tk3d::round(Position[0] / grid_size) * grid_size,\n\t\t\tk3d::round(Position[1] / grid_size) * grid_size,\n\t\t\tk3d::round(Position[2] / grid_size) * grid_size);\n\n\t\treturn true;\n\t}\n\n\tbool grid_target_orientation(const k3d::point3& Position, k3d::vector3& Look, k3d::vector3& Up)\n\t{\n\t\treturn false;\n\t}\n\n\tconst k3d::bounding_box3 extents()\n\t{\n\t\tconst double size = m_grid_size.pipeline_value() * m_grid_count.pipeline_value();\n\t\treturn k3d::bounding_box3(size, -size, size, -size, size, -size);\n\t}\n\n\tk3d::uint_t gl_layer()\n\t{\n\t\treturn 2048;\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tconst long grid_count = m_grid_count.pipeline_value();\n\t\tconst k3d::double_t grid_size = m_grid_size.pipeline_value();\n\t\tconst k3d::color x_color = m_x_color.pipeline_value();\n\t\tconst k3d::color y_color = m_y_color.pipeline_value();\n\t\tconst k3d::color z_color = m_z_color.pipeline_value();\n\t\tconst k3d::color grid_color = m_grid_color.pipeline_value();\n\n\t\tconst k3d::double_t size = grid_count * grid_size;\n\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\t\tglDisable(GL_BLEND);\n\n\t\tglLineWidth(1.0f);\n\t\tglDisable(GL_LINE_STIPPLE);\n\n\t\t// Draw axes and labels\n\t\tif(m_axes.pipeline_value())\n\t\t{\n\t\t\t// Draw X axis\n\t\t\tk3d::gl::color3d(x_color);\n\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\tglVertex3d(-size, 0.0, 0.0);\n\t\t\tglVertex3d(size, 0.0, 0.0);\n\t\t\tglEnd();\n\n\t\t\t// Draw Y axis\n\t\t\tk3d::gl::color3d(y_color);\n\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\tglVertex3d(0.0, -size, 0.0);\n\t\t\tglVertex3d(0.0, size, 0.0);\n\t\t\tglEnd();\n\n\t\t\t// Draw Z axis\n\t\t\tk3d::gl::color3d(z_color);\n\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\tglVertex3d(0.0, 0.0, -size);\n\t\t\tglVertex3d(0.0, 0.0, size);\n\t\t\tglEnd();\n\t\t}\n\n\t\t// Setup grid color\n\t\tk3d::gl::color3d(grid_color);\n\n\t\t// Draw XY plane\n\t\tif(m_xy_plane.pipeline_value())\n\t\t{\n\t\t\tglBegin(GL_LINES);\n\t\t\tfor(long i = -grid_count; i <= grid_count; ++i)\n\t\t\t{\n\t\t\t\tglVertex3d(i * grid_size, -size, 0.0);\n\t\t\t\tglVertex3d(i * grid_size, size, 0.0);\n\t\t\t\tglVertex3d(-size, i * grid_size, 0.0);\n\t\t\t\tglVertex3d(size, i * grid_size, 0.0);\n\t\t\t}\n\t\t\tglEnd();\n\t\t}\n\n\t\t// Draw YZ plane\n\t\tif(m_yz_plane.pipeline_value())\n\t\t{\n\t\t\tglBegin(GL_LINES);\n\t\t\tfor(long i = -grid_count; i <= grid_count; ++i)\n\t\t\t{\n\t\t\t\tglVertex3d(0.0, i * grid_size, -size);\n\t\t\t\tglVertex3d(0.0, i * grid_size, size);\n\t\t\t\tglVertex3d(0.0, -size, i * grid_size);\n\t\t\t\tglVertex3d(0.0, size, i * grid_size);\n\t\t\t}\n\t\t\tglEnd();\n\t\t}\n\n\t\t// Draw XZ plane\n\t\tif(m_xz_plane.pipeline_value())\n\t\t{\n\t\t\tglBegin(GL_LINES);\n\t\t\tfor(long i = -grid_count; i <= grid_count; ++i)\n\t\t\t{\n\t\t\t\tglVertex3d(i * grid_size, 0.0, -size);\n\t\t\t\tglVertex3d(i * grid_size, 0.0, size);\n\t\t\t\tglVertex3d(-size, 0.0, i * grid_size);\n\t\t\t\tglVertex3d(size, 0.0, i * grid_size);\n\t\t\t}\n\t\t\tglEnd();\n\t\t}\n\n\t\tif(m_axes.pipeline_value())\n\t\t{\n\t\t\t// Draw axis labels ...\n\t\t\tk3d::gl::color3d(grid_color);\n\n\t\t\tk3d::double_t labelposition = size * 1.1;\n\n\t\t\tif(!m_font)\n\t\t\t{\n\t\t\t\tk3d::filesystem::path font_path = m_font_path.pipeline_value();\n\t\t\t\tif(!k3d::filesystem::exists(font_path))\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"axis: error loading font \" << font_path.native_filesystem_string().c_str() << std::endl;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tm_font.reset(new FTPixmapFont(font_path.native_filesystem_string().c_str()));\n\t\t\t\tm_font->FaceSize(static_cast<unsigned int>(m_font_size.pipeline_value()));\n\t\t\t\tm_font->UseDisplayList(true);\n\t\t\t\tif(m_font->Error())\n\t\t\t\t\tk3d::log() << error << \"error initializing font\" << std::endl;\n\t\t\t}\n\n\t\t\tglRasterPos3d(labelposition, 0, 0);\n\t\t\tm_font->Render(\"+X\");\n\t\t\tglRasterPos3d(0, labelposition, 0);\n\t\t\tm_font->Render(\"+Y\");\n\t\t\tglRasterPos3d(0, 0, labelposition);\n\t\t\tm_font->Render(\"+Z\");\n\n\t\t\tglRasterPos3d(-labelposition, 0, 0);\n\t\t\tm_font->Render(\"-X\");\n\t\t\tglRasterPos3d(0, -labelposition, 0);\n\t\t\tm_font->Render(\"-Y\");\n\t\t\tglRasterPos3d(0, 0, -labelposition);\n\t\t\tm_font->Render(\"-Z\");\n\t\t}\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t}\n\n\tvoid snap(const k3d::point3& InputCoordinates, k3d::point3& SnapCoordinates, std::string& SnapDescription)\n\t{\n\t\t// Convert coordinates to our frame ...\n\t\tk3d::point3 input_coordinates = k3d::inverse(k3d::node_to_world_matrix(*this)) * InputCoordinates;\n\n\t\t// Snap coordinates ...\n\t\tinput_coordinates[0] = k3d::round(input_coordinates[0] / m_grid_size.pipeline_value()) * m_grid_size.pipeline_value();\n\t\tinput_coordinates[1] = k3d::round(input_coordinates[1] / m_grid_size.pipeline_value()) * m_grid_size.pipeline_value();\n\t\tinput_coordinates[2] = k3d::round(input_coordinates[2] / m_grid_size.pipeline_value()) * m_grid_size.pipeline_value();\n\n\t\t// Convert coordinates back to world frame ...\n\t\tSnapCoordinates = k3d::node_to_world_matrix(*this) * input_coordinates;\n\t\tSnapDescription = \"Axes Grid\";\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<axes,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > >factory(\n\t\t\tk3d::classes::Axes(),\n\t\t\t\"Axes\",\n\t\t\t_(\"Configurable set of axes to help in visualizing the 3D workspace\"),\n\t\t\t\"Annotation\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_axes;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_xy_plane;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_yz_plane;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_xz_plane;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_grid_size;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_grid_count;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_x_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_y_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_z_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_grid_color;\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_font_size;\n\n\tboost::scoped_ptr<FTFont> m_font;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// axes_factory\n\nk3d::iplugin_factory& axes_factory()\n{\n\treturn axes::get_factory();\n}\n\n} // namespace core\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/core/camera.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/aspect_ratios.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/icrop_window.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/parentable.h>\n#include <k3dsdk/property_group_collection.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/transformable.h>\n\n#ifdef\tWIN32\n#ifdef\tnear\n#undef\tnear\n#endif\t//near\n#ifdef\tfar\n#undef\tfar\n#endif\t//far\n#endif\t//WIN32\n\nnamespace module\n{\n\nnamespace core\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// camera\n\nclass camera :\n\tpublic k3d::gl::renderable<k3d::parentable<k3d::transformable<k3d::node > > >,\n\tpublic k3d::icamera,\n\tpublic k3d::icrop_window,\n\tpublic k3d::property_group_collection\n{\n\ttypedef k3d::gl::renderable<k3d::parentable<k3d::transformable<k3d::node > > > base;\n\npublic:\n\tcamera(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_navigation_target(init_owner(*this) + init_name(\"navigation_target\") + init_label(_(\"Navigation Target\")) + init_description(_(\"Navigation Target\")) + init_value<k3d::imatrix_source*>(this)),\n\t\tm_world_target(init_owner(*this) + init_name(\"world_target\") + init_label(_(\"World target\")) + init_description(_(\"World target\")) + init_value(k3d::point3(0, -5, 0))),\n\t\tm_target_distance(init_owner(*this) + init_name(\"target_distance\") + init_label(_(\"Target distance\")) + init_description(_(\"Target distance from camera position\")) + init_value(0) + init_units(typeid(k3d::measurement::distance)) + init_slot(sigc::mem_fun(*this, &camera::get_target_distance))),\n\t\tm_aspect_ratio(init_owner(*this) + init_name(\"aspect_ratio\") + init_label(_(\"Aspect Ratio\")) + init_description(_(\"Choose a predefined aspect ratio\")) + init_enumeration(k3d::aspect_ratio_values()) + init_value(std::string(\"\"))),\n\t\tm_show_projection(init_owner(*this) + init_name(\"show_projection\") + init_label(_(\"Show Projection\")) + init_description(_(\"Show viewing projection\")) + init_value(false)),\n\t\tm_orthographic(init_owner(*this) + init_name(\"orthographic\") + init_label(_(\"Orthographic\")) + init_description(_(\"Orthographic projection\")) + init_value(false)),\n\t\tm_left(init_owner(*this) + init_name(\"left\") + init_label(_(\"Left\")) + init_description(_(\"Left\")) + init_value(-2.0/3.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_right(init_owner(*this) + init_name(\"right\") + init_label(_(\"Right\")) + init_description(_(\"Right\")) + init_value(2.0/3.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_top(init_owner(*this) + init_name(\"top\") + init_label(_(\"Top\")) + init_description(_(\"Top\")) + init_value(0.5) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_bottom(init_owner(*this) + init_name(\"bottom\") + init_label(_(\"Bottom\")) + init_description(_(\"Bottom\")) + init_value(-0.5) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_near(init_owner(*this) + init_name(\"near\") + init_label(_(\"Near\")) + init_description(_(\"Near Plane Distance\")) + init_value(1.0) + init_constraint(constraint::minimum<k3d::double_t>(0.0)) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_far(init_owner(*this) + init_name(\"far\") + init_label(_(\"Far\")) + init_description(_(\"Far Plane Distance\")) + init_value(1000.0) + init_constraint(constraint::minimum<k3d::double_t>(0.0)) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_crop_window_left(init_owner(*this) + init_name(\"crop_window_left\") + init_label(_(\"Crop Window Left\")) + init_description(_(\"Crop window left\")) + init_value(0.0) + init_constraint(constraint::minimum<k3d::double_t>(0.0, constraint::maximum<k3d::double_t>(1.0))) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_crop_window_right(init_owner(*this) + init_name(\"crop_window_right\") + init_label(_(\"Crop Window Right\")) + init_description(_(\"Crop Window Right\")) + init_value(1.0) + init_constraint(constraint::minimum<k3d::double_t>(0.0, constraint::maximum<k3d::double_t>(1.0)))  + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_crop_window_top(init_owner(*this) + init_name(\"crop_window_top\") + init_label(_(\"Crop Window Top\")) + init_description(_(\"Crop Window Top\")) + init_value(0.0) + init_constraint(constraint::minimum<k3d::double_t>(0.0, constraint::maximum<k3d::double_t>(1.0)))  + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_crop_window_bottom(init_owner(*this) + init_name(\"crop_window_bottom\") + init_label(_(\"Crop Window Bottom\")) + init_description(_(\"Crop window bottom\")) + init_value(1.0) + init_constraint(constraint::minimum<k3d::double_t>(0.0, constraint::maximum<k3d::double_t>(1.0)))  + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_show_reference_plane(init_owner(*this) + init_name(\"show_reference_plane\") + init_label(_(\"Show Reference Plane\")) + init_description(_(\"Show Reference Plane\")) + init_value(false)),\n\t\tm_reference_plane(init_owner(*this) + init_name(\"reference_plane\") + init_label(_(\"Reference Plane\")) + init_description(_(\"Reference Plane Distance\")) + init_value(0.0) + init_constraint(constraint::minimum<k3d::double_t>(0.0))  + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_reference_plane_color(init_owner(*this) + init_name(\"reference_plane_color\") + init_label(_(\"Reference Plane Color\")) + init_description(_(\"Reference Plane Color\")) + init_value(k3d::color(0, 0, 0.7))),\n\t\tm_perspective_projection(m_left, m_right, m_top, m_bottom, m_near, m_far),\n\t\tm_orthographic_projection(m_left, m_right, m_top, m_bottom, m_near, m_far)\n\t{\n\t\tk3d::iproperty_group_collection::group projection_group(\"Projection\");\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_navigation_target));\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_aspect_ratio));\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_orthographic));\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_left));\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_right));\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_top));\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_bottom));\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_near));\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_far));\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_show_reference_plane));\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_reference_plane));\n\t\tprojection_group.properties.push_back(&static_cast<k3d::iproperty&>(m_reference_plane_color));\n\n\t\tk3d::iproperty_group_collection::group output_group(\"Output\");\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_crop_window_left));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_crop_window_right));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_crop_window_top));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_crop_window_bottom));\n\n\t\tregister_property_group(projection_group);\n\t\tregister_property_group(output_group);\n\n\t\tm_aspect_ratio.changed_signal().connect(sigc::mem_fun(*this, &camera::on_aspect_ratio_changed));\n\n\t\tm_show_projection.changed_signal().connect(make_async_redraw_slot());\n\t\tm_orthographic.changed_signal().connect(make_async_redraw_slot());\n\t\tm_left.changed_signal().connect(make_async_redraw_slot());\n\t\tm_right.changed_signal().connect(make_async_redraw_slot());\n\t\tm_top.changed_signal().connect(make_async_redraw_slot());\n\t\tm_bottom.changed_signal().connect(make_async_redraw_slot());\n\t\tm_near.changed_signal().connect(make_async_redraw_slot());\n\t\tm_far.changed_signal().connect(make_async_redraw_slot());\n\t\tm_show_reference_plane.changed_signal().connect(make_async_redraw_slot());\n\t\tm_reference_plane.changed_signal().connect(make_async_redraw_slot());\n\t\tm_reference_plane_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_crop_window_left.changed_signal().connect(make_async_redraw_slot());\n\t\tm_crop_window_right.changed_signal().connect(make_async_redraw_slot());\n\t\tm_crop_window_top.changed_signal().connect(make_async_redraw_slot());\n\t\tm_crop_window_bottom.changed_signal().connect(make_async_redraw_slot());\n\t\tm_input_matrix.changed_signal().connect(make_async_redraw_slot());\n\n\t\tm_input_matrix.changed_signal().connect(sigc::mem_fun(*this, &camera::on_position_changed));\n\t\tm_world_target.changed_signal().connect(sigc::mem_fun(*this, &camera::on_position_changed));\n\t}\n\n\tk3d::imatrix_source& transformation()\n\t{\n\t\treturn *this;\n\t}\n\n\tk3d::iprojection& projection()\n\t{\n\t\tconst k3d::bool_t orthographic = m_orthographic.pipeline_value();\n\n\t\tif(orthographic)\n\t\t\treturn m_orthographic_projection;\n\n\t\treturn m_perspective_projection;\n\t}\n\n\tk3d::icrop_window& crop_window()\n\t{\n\t\treturn *this;\n\t}\n\n\tk3d::imatrix_source& navigation_target()\n\t{\n\t\tk3d::imatrix_source* target = m_navigation_target.pipeline_value();\n\t\tif(!target)\n\t\t\ttarget = this;\n\n\t\treturn *target;\n\t}\n\n\tk3d::iproperty& world_target()\n\t{\n\t\treturn m_world_target;\n\t}\n\n\tk3d::iproperty& crop_left()\n\t{\n\t\treturn m_crop_window_left;\n\t}\n\n\tk3d::iproperty& crop_right()\n\t{\n\t\treturn m_crop_window_right;\n\t}\n\n\tk3d::iproperty& crop_top()\n\t{\n\t\treturn m_crop_window_top;\n\t}\n\n\tk3d::iproperty& crop_bottom()\n\t{\n\t\treturn m_crop_window_bottom;\n\t}\n\n\tvoid on_aspect_ratio_changed(k3d::ihint*)\n\t{\n\t\tconst std::string new_ratio = m_aspect_ratio.pipeline_value();\n\n\t\tconst k3d::aspect_ratios_t& ratios = k3d::aspect_ratios();\n\t\tfor(k3d::aspect_ratios_t::const_iterator ratio = ratios.begin(); ratio != ratios.end(); ++ratio)\n\t\t{\n\t\t\tif(ratio->name != new_ratio)\n\t\t\t\tcontinue;\n\n\t\t\tm_left.set_value(-0.5 * ratio->value);\n\t\t\tm_right.set_value(0.5 * ratio->value);\n\t\t\tm_top.set_value(0.5);\n\t\t\tm_bottom.set_value(-0.5);\n\n\t\t\treturn;\n\t\t}\n\n\t\tassert_not_reached();\n\t}\n\n\tvoid on_position_changed(k3d::ihint* const Hint)\n\t{\n\t\tm_target_distance.update(Hint);\n\t}\n\n\tk3d::double_t get_target_distance()\n\t{\n\t\tconst k3d::point3 position = k3d::node_to_world_matrix(navigation_target()) * k3d::point3(0, 0, 0);\n\t\treturn k3d::distance(position, m_world_target.pipeline_value());\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\n\t\tk3d::gl::color3d(State.node_selection ? k3d::color(1, 1, 1) : k3d::color(0, 0, 0));\n\t\tglLineWidth(1.0f);\n\t\tglDisable(GL_LINE_STIPPLE);\n\n\t\tdraw();\n\n\t\tif(m_show_projection.pipeline_value())\n\t\t\tdraw_projection();\n\n\t\tif(m_show_reference_plane.pipeline_value())\n\t\t\tdraw_reference_plane();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw();\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid draw_projection()\n\t{\n\t\tconst k3d::bool_t orthographic = m_orthographic.pipeline_value();\n\t\tconst k3d::double_t left = m_left.pipeline_value();\n\t\tconst k3d::double_t right = m_right.pipeline_value();\n\t\tconst k3d::double_t top = m_top.pipeline_value();\n\t\tconst k3d::double_t bottom = m_bottom.pipeline_value();\n\t\tconst k3d::double_t near = m_near.pipeline_value();\n\t\tconst k3d::double_t far = m_far.pipeline_value();\n\n\t\tconst k3d::double_t reference_plane = m_reference_plane.pipeline_value();\n\t\tconst k3d::color reference_plane_color = m_reference_plane_color.pipeline_value();\n\n\t\tif(orthographic)\n\t\t{\n\t\t\t// Draw the near plane ...\n\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\t\tglVertex3d(left, top, near);\n\t\t\t\tglVertex3d(right, top, near);\n\t\t\t\tglVertex3d(right, bottom, near);\n\t\t\t\tglVertex3d(left, bottom, near);\n\t\t\tglEnd();\n\n\t\t\t// Draw the reference plane ...\n\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\t\tglVertex3d(left, top, reference_plane);\n\t\t\t\tglVertex3d(right, top, reference_plane);\n\t\t\t\tglVertex3d(right, bottom, reference_plane);\n\t\t\t\tglVertex3d(left, bottom, reference_plane);\n\t\t\tglEnd();\n\n\t\t\t// Draw the far plane ...\n\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\t\tglVertex3d(left, top, far);\n\t\t\t\tglVertex3d(right, top, far);\n\t\t\t\tglVertex3d(right, bottom, far);\n\t\t\t\tglVertex3d(left, bottom, far);\n\t\t\tglEnd();\n\n\t\t\t// Draw the frustum ...\n\t\t\tglBegin(GL_LINES);\n\t\t\t\tglVertex3d(left, top, near);\n\t\t\t\tglVertex3d(left, top, far);\n\n\t\t\t\tglVertex3d(right, top, near);\n\t\t\t\tglVertex3d(right, top, far);\n\n\t\t\t\tglVertex3d(right, bottom, near);\n\t\t\t\tglVertex3d(right, bottom, far);\n\n\t\t\t\tglVertex3d(left, bottom, near);\n\t\t\t\tglVertex3d(left, bottom, far);\n\t\t\tglEnd();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst k3d::double_t p = far / near;\n\t\t\tconst k3d::double_t left2 = left * p;\n\t\t\tconst k3d::double_t right2 = right * p;\n\t\t\tconst k3d::double_t top2 = top * p;\n\t\t\tconst k3d::double_t bottom2 = bottom * p;\n\n\t\t\tconst k3d::double_t q = reference_plane / near;\n\t\t\tconst k3d::double_t left3 = left * q;\n\t\t\tconst k3d::double_t right3 = right * q;\n\t\t\tconst k3d::double_t top3 = top * q;\n\t\t\tconst k3d::double_t bottom3 = bottom * q;\n\n\t\t\t// Draw the near plane ...\n\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\t\tglVertex3d(left, top, near);\n\t\t\t\tglVertex3d(right, top, near);\n\t\t\t\tglVertex3d(right, bottom, near);\n\t\t\t\tglVertex3d(left, bottom, near);\n\t\t\tglEnd();\n\n\t\t\t// Draw the reference plane ...\n\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\t\tglVertex3d(left3, top3, reference_plane);\n\t\t\t\tglVertex3d(right3, top3, reference_plane);\n\t\t\t\tglVertex3d(right3, bottom3, reference_plane);\n\t\t\t\tglVertex3d(left3, bottom3, reference_plane);\n\t\t\tglEnd();\n\n\t\t\t// Draw the far plane ...\n\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\t\tglVertex3d(left2, top2, far);\n\t\t\t\tglVertex3d(right2, top2, far);\n\t\t\t\tglVertex3d(right2, bottom2, far);\n\t\t\t\tglVertex3d(left2, bottom2, far);\n\t\t\tglEnd();\n\n\t\t\t// Draw the frustum ...\n\t\t\tglBegin(GL_LINES);\n\t\t\t\tglVertex3d(left, top, near);\n\t\t\t\tglVertex3d(left2, top2, far);\n\n\t\t\t\tglVertex3d(right, top, near);\n\t\t\t\tglVertex3d(right2, top2, far);\n\n\t\t\t\tglVertex3d(right, bottom, near);\n\t\t\t\tglVertex3d(right2, bottom2, far);\n\n\t\t\t\tglVertex3d(left, bottom, near);\n\t\t\t\tglVertex3d(left2, bottom2, far);\n\t\t\tglEnd();\n\t\t}\n\t}\n\n\tvoid draw_reference_plane()\n\t{\n\t\tconst k3d::bool_t orthographic = m_orthographic.pipeline_value();\n\t\tconst k3d::double_t left = m_left.pipeline_value();\n\t\tconst k3d::double_t right = m_right.pipeline_value();\n\t\tconst k3d::double_t top = m_top.pipeline_value();\n\t\tconst k3d::double_t bottom = m_bottom.pipeline_value();\n\t\tconst k3d::double_t near = m_near.pipeline_value();\n\n\t\tconst k3d::double_t reference_plane = m_reference_plane.pipeline_value();\n\t\tconst k3d::color reference_plane_color = m_reference_plane_color.pipeline_value();\n\n\t\tif(orthographic)\n\t\t{\n\t\t\tk3d::gl::color3d(reference_plane_color);\n\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\t\tglVertex3d(left, top, reference_plane);\n\t\t\t\tglVertex3d(right, top, reference_plane);\n\t\t\t\tglVertex3d(right, bottom, reference_plane);\n\t\t\t\tglVertex3d(left, bottom, reference_plane);\n\t\t\tglEnd();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst k3d::double_t q = reference_plane / near;\n\t\t\tconst k3d::double_t left3 = left * q;\n\t\t\tconst k3d::double_t right3 = right * q;\n\t\t\tconst k3d::double_t top3 = top * q;\n\t\t\tconst k3d::double_t bottom3 = bottom * q;\n\n\t\t\tk3d::gl::color3d(reference_plane_color);\n\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\t\tglVertex3d(left3, top3, reference_plane);\n\t\t\t\tglVertex3d(right3, top3, reference_plane);\n\t\t\t\tglVertex3d(right3, bottom3, reference_plane);\n\t\t\t\tglVertex3d(left3, bottom3, reference_plane);\n\t\t\tglEnd();\n\t\t}\n\t}\n\n\tvoid draw()\n\t{\n\t\t// Our dimensions\n\t\tconst k3d::double_t bodylength = 0.5 * 0.5;\n\t\tconst k3d::double_t bodywidth = 0.25 * 0.5;\n\t\tconst k3d::double_t bodyheight = 0.25 * 0.5;\n\t\tconst k3d::double_t lenslength = 0.25 * 0.5;\n\t\tconst k3d::double_t lenswidth = 0.15 * 0.5;\n\t\tconst k3d::double_t lensheight = 0.1 * 0.5;\n\t\tconst k3d::double_t lensoffset = 0.05;\n\t\tconst k3d::double_t filmradius = 0.2;\n\t\tconst k3d::double_t filmwidth = 0.125 * 0.5;\n\n\t\tglTranslated(0, 0, -0.25);\n\n\t\t// Draw the camera body ...\n\t\tglBegin(GL_LINE_LOOP);\n\t\tglVertex3d(-bodywidth, bodyheight, bodylength);\n\t\tglVertex3d(bodywidth, bodyheight, bodylength);\n\t\tglVertex3d(bodywidth, bodyheight, -bodylength);\n\t\tglVertex3d(-bodywidth, bodyheight, -bodylength);\n\t\tglEnd();\n\n\t\tglBegin(GL_LINE_LOOP);\n\t\tglVertex3d(-bodywidth, -bodyheight, bodylength);\n\t\tglVertex3d(bodywidth, -bodyheight, bodylength);\n\t\tglVertex3d(bodywidth, -bodyheight, -bodylength);\n\t\tglVertex3d(-bodywidth, -bodyheight, -bodylength);\n\t\tglEnd();\n\n\t\tglBegin(GL_LINES);\n\t\tglVertex3d(-bodywidth, bodyheight, bodylength);\n\t\tglVertex3d(-bodywidth, -bodyheight, bodylength);\n\t\tglVertex3d(bodywidth, bodyheight, bodylength);\n\t\tglVertex3d(bodywidth, -bodyheight, bodylength);\n\t\tglVertex3d(bodywidth, bodyheight, -bodylength);\n\t\tglVertex3d(bodywidth, -bodyheight, -bodylength);\n\t\tglVertex3d(-bodywidth, bodyheight, -bodylength);\n\t\tglVertex3d(-bodywidth, -bodyheight, -bodylength);\n\t\tglEnd();\n\n\t\t// Draw the camera lens ...\n\t\tglBegin(GL_LINE_LOOP);\n\t\tglVertex3d(-lenswidth, lensheight, bodylength);\n\t\tglVertex3d(lenswidth, lensheight, bodylength);\n\t\tglVertex3d(lenswidth, -lensheight, bodylength);\n\t\tglVertex3d(-lenswidth, -lensheight, bodylength);\n\t\tglEnd();\n\n\t\tglBegin(GL_LINE_LOOP);\n\t\tglVertex3d(-lenswidth - lensoffset, lensheight + lensoffset, bodylength + lenslength);\n\t\tglVertex3d(lenswidth + lensoffset, lensheight + lensoffset, bodylength + lenslength);\n\t\tglVertex3d(lenswidth + lensoffset, -lensheight - lensoffset, bodylength + lenslength);\n\t\tglVertex3d(-lenswidth - lensoffset, -lensheight - lensoffset, bodylength + lenslength);\n\t\tglEnd();\n\n\t\tglBegin(GL_LINES);\n\t\tglVertex3d(-lenswidth, lensheight, bodylength);\n\t\tglVertex3d(-lenswidth - lensoffset, lensheight + lensoffset, bodylength + lenslength);\n\t\tglVertex3d(lenswidth, lensheight, bodylength);\n\t\tglVertex3d(lenswidth + lensoffset, lensheight + lensoffset, bodylength + lenslength);\n\t\tglVertex3d(lenswidth, -lensheight, bodylength);\n\t\tglVertex3d(lenswidth + lensoffset, -lensheight - lensoffset, bodylength + lenslength);\n\t\tglVertex3d(-lenswidth, -lensheight, bodylength);\n\t\tglVertex3d(-lenswidth - lensoffset, -lensheight - lensoffset, bodylength + lenslength);\n\t\tglEnd();\n\n\t\t// Draw the film can ...\n\t\tglBegin(GL_LINE_LOOP);\n\t\tglVertex3d(-filmwidth, bodyheight, -bodylength);\n\t\tglVertex3d(-filmwidth, bodyheight, -bodylength + filmradius);\n\t\tglVertex3d(-filmwidth, bodyheight + 0.8 * filmradius, -bodylength + 0.8 * filmradius);\n\t\tglVertex3d(-filmwidth, bodyheight + filmradius, -bodylength);\n\t\tglVertex3d(-filmwidth, bodyheight + 0.8 * filmradius, -bodylength - 0.8 * filmradius);\n\t\tglVertex3d(-filmwidth, bodyheight, -bodylength - filmradius);\n\t\tglVertex3d(-filmwidth, bodyheight - 0.8 * filmradius, -bodylength - 0.8 * filmradius);\n\t\tglVertex3d(-filmwidth, bodyheight - filmradius, -bodylength);\n\t\tglEnd();\n\n\t\tglBegin(GL_LINE_LOOP);\n\t\tglVertex3d(filmwidth, bodyheight, -bodylength);\n\t\tglVertex3d(filmwidth, bodyheight, -bodylength + filmradius);\n\t\tglVertex3d(filmwidth, bodyheight + 0.8 * filmradius, -bodylength + 0.8 * filmradius);\n\t\tglVertex3d(filmwidth, bodyheight + filmradius, -bodylength);\n\t\tglVertex3d(filmwidth, bodyheight + 0.8 * filmradius, -bodylength - 0.8 * filmradius);\n\t\tglVertex3d(filmwidth, bodyheight, -bodylength - filmradius);\n\t\tglVertex3d(filmwidth, bodyheight - 0.8 * filmradius, -bodylength - 0.8 * filmradius);\n\t\tglVertex3d(filmwidth, bodyheight - filmradius, -bodylength);\n\t\tglEnd();\n\n\t\tglBegin(GL_LINES);\n\t\tglVertex3d(-filmwidth, bodyheight, -bodylength + filmradius);\n\t\tglVertex3d(filmwidth, bodyheight, -bodylength + filmradius);\n\t\tglVertex3d(-filmwidth, bodyheight + 0.8 * filmradius, -bodylength + 0.8 * filmradius);\n\t\tglVertex3d(filmwidth, bodyheight + 0.8 * filmradius, -bodylength + 0.8 * filmradius);\n\t\tglVertex3d(-filmwidth, bodyheight + filmradius, -bodylength);\n\t\tglVertex3d(filmwidth, bodyheight + filmradius, -bodylength);\n\t\tglVertex3d(-filmwidth, bodyheight + 0.8 * filmradius, -bodylength - 0.8 * filmradius);\n\t\tglVertex3d(filmwidth, bodyheight + 0.8 * filmradius, -bodylength - 0.8 * filmradius);\n\t\tglVertex3d(-filmwidth, bodyheight, -bodylength - filmradius);\n\t\tglVertex3d(filmwidth, bodyheight, -bodylength - filmradius);\n\t\tglVertex3d(-filmwidth, bodyheight - 0.8 * filmradius, -bodylength - 0.8 * filmradius);\n\t\tglVertex3d(filmwidth, bodyheight - 0.8 * filmradius, -bodylength - 0.8 * filmradius);\n\t\tglVertex3d(-filmwidth, bodyheight - filmradius, -bodylength);\n\t\tglVertex3d(filmwidth, bodyheight - filmradius, -bodylength);\n\t\tglEnd();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<camera,\n\t\t\tk3d::interface_list<k3d::icamera,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink> > > > factory(\n\t\t\t\tk3d::classes::Camera(),\n\t\t\t\t\"Camera\",\n\t\t\t\t_(\"Camera\"),\n\t\t\t\t\"RenderEngine\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tclass perspective_projection :\n\t\tpublic k3d::iperspective\n\t{\n\tpublic:\n\t\tperspective_projection(k3d::iproperty& Left, k3d::iproperty& Right, k3d::iproperty& Top, k3d::iproperty& Bottom, k3d::iproperty& Near, k3d::iproperty& Far) :\n\t\t\tm_left(Left),\n\t\t\tm_right(Right),\n\t\t\tm_top(Top),\n\t\t\tm_bottom(Bottom),\n\t\t\tm_near(Near),\n\t\t\tm_far(Far)\n\t\t{\n\t\t}\n\n\t\tk3d::iproperty& left()\n\t\t{\n\t\t\treturn m_left;\n\t\t}\n\n\t\tk3d::iproperty& right()\n\t\t{\n\t\t\treturn m_right;\n\t\t}\n\n\t\tk3d::iproperty& top()\n\t\t{\n\t\t\treturn m_top;\n\t\t}\n\n\t\tk3d::iproperty& bottom()\n\t\t{\n\t\t\treturn m_bottom;\n\t\t}\n\n\t\tk3d::iproperty& near()\n\t\t{\n\t\t\treturn m_near;\n\t\t}\n\n\t\tk3d::iproperty& far()\n\t\t{\n\t\t\treturn m_far;\n\t\t}\n\n\tprivate:\n\t\tk3d::iproperty& m_left;\n\t\tk3d::iproperty& m_right;\n\t\tk3d::iproperty& m_top;\n\t\tk3d::iproperty& m_bottom;\n\t\tk3d::iproperty& m_near;\n\t\tk3d::iproperty& m_far;\n\t};\n\n\tclass orthographic_projection :\n\t\tpublic k3d::iorthographic\n\t{\n\tpublic:\n\t\torthographic_projection(k3d::iproperty& Left, k3d::iproperty& Right, k3d::iproperty& Top, k3d::iproperty& Bottom, k3d::iproperty& Near, k3d::iproperty& Far) :\n\t\t\tm_left(Left),\n\t\t\tm_right(Right),\n\t\t\tm_top(Top),\n\t\t\tm_bottom(Bottom),\n\t\t\tm_near(Near),\n\t\t\tm_far(Far)\n\t\t{\n\t\t}\n\n\t\tk3d::iproperty& left()\n\t\t{\n\t\t\treturn m_left;\n\t\t}\n\n\t\tk3d::iproperty& right()\n\t\t{\n\t\t\treturn m_right;\n\t\t}\n\n\t\tk3d::iproperty& top()\n\t\t{\n\t\t\treturn m_top;\n\t\t}\n\n\t\tk3d::iproperty& bottom()\n\t\t{\n\t\t\treturn m_bottom;\n\t\t}\n\n\t\tk3d::iproperty& near()\n\t\t{\n\t\t\treturn m_near;\n\t\t}\n\n\t\tk3d::iproperty& far()\n\t\t{\n\t\t\treturn m_far;\n\t\t}\n\n\tprivate:\n\t\tk3d::iproperty& m_left;\n\t\tk3d::iproperty& m_right;\n\t\tk3d::iproperty& m_top;\n\t\tk3d::iproperty& m_bottom;\n\t\tk3d::iproperty& m_near;\n\t\tk3d::iproperty& m_far;\n\t};\n\n\tk3d_data(k3d::imatrix_source*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_navigation_target;\n\tk3d_data(k3d::point3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_world_target;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_target_distance;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_aspect_ratio;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_show_projection;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_orthographic;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_left;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_right;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_top;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_bottom;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_near;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_far;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_crop_window_left;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_crop_window_right;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_crop_window_top;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_crop_window_bottom;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_show_reference_plane;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_reference_plane;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_reference_plane_color;\n\n\tperspective_projection m_perspective_projection;\n\torthographic_projection m_orthographic_projection;\n};\n\nk3d::iplugin_factory& camera_factory()\n{\n\treturn camera::get_factory();\n}\n\n} // namespace core\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/core/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace core\n{\n\nextern k3d::iplugin_factory& axes_factory();\nextern k3d::iplugin_factory& camera_factory();\nextern k3d::iplugin_factory& multi_material_factory();\nextern k3d::iplugin_factory& null_factory();\n\n} // namespace core\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::core::axes_factory());\n\tRegistry.register_factory(module::core::camera_factory());\n\tRegistry.register_factory(module::core::multi_material_factory());\n\tRegistry.register_factory(module::core::null_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/core/multi_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace core\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass multi_material :\n\tpublic k3d::node,\n\tpublic k3d::imaterial\n{\n\ttypedef k3d::node base;\n\npublic:\n\tmulti_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<multi_material,\n\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\t\tk3d::classes::MultiMaterial(),\n\t\t\t\t\"MultiMaterial\",\n\t\t\t\t_(\"Material\"),\n\t\t\t\t\"Material\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& multi_material_factory()\n{\n\treturn multi_material::get_factory();\n}\n\n} // namespace core\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/core/null.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief An object that converts a scalar to a string using strftime()\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace core\n{\n\nclass null :\n\tpublic k3d::node\n{\n\ttypedef k3d::node base;\npublic:\n\tnull(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<null> factory(\n\t\t\tk3d::uuid(0xe1cbc7e2, 0xf4b44daf, 0x9176080c, 0x80d2c4ab),\n\t\t\t\"Null\",\n\t\t\t_(\"Empty node\"),\n\t\t\t\"Utility\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& null_factory()\n{\n\treturn null::get_factory();\n}\n\n} //namespace core\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/CMakeLists.txt",
    "content": "INCLUDE ( FindCUDA.cmake )\nIF(WIN32)\n  LINK_DIRECTORIES(${k3d_BINARY_DIR}/bin)\nELSE(WIN32)\n  LINK_DIRECTORIES(${k3d_BINARY_DIR}/lib)\nENDIF(WIN32)\n\nWRAP_CUDA(CUDA_SOURCES cuda_entry_points.cu)\n\nK3D_BUILD_CUDA_MODULE(k3d-cuda)\nK3D_CREATE_MODULE_PROXY(k3d-cuda)\n\nTARGET_LINK_LIBRARIES(k3d-cuda k3d-cuda-shared)\n\n# disable RPATH since it prevents the emulation mode from working correctly\nIF (CUDA_EMULATION)\n    SET_TARGET_PROPERTIES ( k3d-cuda PROPERTIES SKIP_RPATH \"ON\" )\nENDIF (CUDA_EMULATION)\n\n\n"
  },
  {
    "path": "modules/cuda/FindCUDA.cmake",
    "content": "#\n# Try to find CUDA compiler, runtime libraries, and include path.\n# Once done this will define\n#\n# CUDA_FOUND\n# CUDA_INCLUDE_PATH\n# CUDA_RUNTIME_LIBRARY\n# CUDA_COMPILER\n#\n# It will also define the following macro:\n#\n# WRAP_CUDA\n#\n\nIF (WIN32)\n\tFIND_PROGRAM (CUDA_COMPILER nvcc.exe\n\t\t$ENV{CUDA_BIN_PATH}\n\t\tDOC \"The CUDA Compiler\")\nELSE(WIN32)\n\tFIND_PROGRAM (CUDA_COMPILER nvcc\n\t\t$ENV{CUDA_BIN_PATH}\n\t\t/usr/local/cuda/bin\n\t\tDOC \"The CUDA Compiler\")\nENDIF(WIN32)\n\nIF (CUDA_COMPILER)\n\tGET_FILENAME_COMPONENT (CUDA_COMPILER_DIR ${CUDA_COMPILER} PATH)\n\tGET_FILENAME_COMPONENT (CUDA_COMPILER_SUPER_DIR ${CUDA_COMPILER_DIR} PATH)\nELSE (CUDA_COMPILER)\n\tSET (CUDA_COMPILER_DIR .)\n\tSET (CUDA_COMPILER_SUPER_DIR ..)\nENDIF (CUDA_COMPILER)\n\nFIND_PATH (CUDA_INCLUDE_PATH cuda_runtime.h\n\t$ENV{CUDA_INC_PATH}\n\t${CUDA_COMPILER_SUPER_DIR}/include\n\t${CUDA_COMPILER_DIR}\n\tDOC \"The directory where CUDA headers reside\")\n\nFIND_LIBRARY (CUDA_RUNTIME_LIBRARY\n\tNAMES cudart\n\tPATHS\n\t$ENV{CUDA_LIB_PATH}\n\t${CUDA_COMPILER_SUPER_DIR}/lib\n\t${CUDA_COMPILER_DIR}\n\tDOC \"The CUDA runtime library\")\n\t\nIF(WIN32)\nFIND_PATH (VC_SDK_INCLUDE_PATH Windows.h\n    \"C:/Program Files/Microsoft SDKs/Windows/v6.0A/Include\"\n    DOC \"The directory where the Visual Studio SDK include files reside\")\nFIND_PATH (VC_SDK_LIB_PATH Uuid.lib\n    \"C:/Program Files/Microsoft SDKs/Windows/v6.0A/Lib\"\n    DOC \"The directory where the Visual Studio SDK library files reside\")\nENDIF(WIN32)\n\nIF (CUDA_INCLUDE_PATH AND CUDA_RUNTIME_LIBRARY)\n\tSET (CUDA_FOUND TRUE)\nELSE (CUDA_INCLUDE_PATH AND CUDA_RUNTIME_LIBRARY)\n\tSET (CUDA_FOUND FALSE)\nENDIF (CUDA_INCLUDE_PATH AND CUDA_RUNTIME_LIBRARY)\n\nSET (CUDA_LIBRARIES ${CUDA_RUNTIME_LIBRARY})\n\n\n#SET(CUDA_OPTIONS \"-ncfe\")\n\nIF(UNIX AND K3D_UINT_T_64_BITS)\n    SET(CUDA_LINUX_64_FLAGS -Xcompiler -fPIC)\nELSE(UNIX AND K3D_UINT_T_64_BITS)\n    SET(CUDA_LINUX_64_FLAGS \"\")\nENDIF(UNIX AND K3D_UINT_T_64_BITS)\n\nSET(CUDA_OPTIONS \"\")\nOPTION(CUDA_EMULATION \"Enable Device Emulation\" ON)\n\nIF (CUDA_EMULATION)\n\tSET (CUDA_OPTIONS \"${CUDA_OPTIONS}-deviceemu;-D_DEVICEEMU;-g\")\nENDIF (CUDA_EMULATION)\n\n\n# Get include directories.\nMACRO(GET_CUDA_INC_DIRS _cuda_INC_DIRS)\n\tSET(${_cuda_INC_DIRS})\n\tGET_DIRECTORY_PROPERTY(_inc_DIRS INCLUDE_DIRECTORIES)\n\n\tFOREACH(_current ${_inc_DIRS})\n\t\tSET(${_cuda_INC_DIRS} ${${_cuda_INC_DIRS}} \"-I\" ${_current})\n\tENDFOREACH(_current ${_inc_DIRS})\n\t\n\tSET(${_cuda_INC_DIRS} ${${_cuda_INC_DIRS}} \"-I\" ${CUDA_INCLUDE_PATH})\n\t\n\tIF(WIN32)\n\t    SET(${_cuda_INC_DIRS} ${${_cuda_INC_DIRS}} \"-I\" ${VC_SDK_INCLUDE_PATH})\n\t    SET(${_cuda_INC_DIRS} ${${_cuda_INC_DIRS}} \"-L\" ${VC_SDK_LIB_PATH})\n\tENDIF(WIN32)\n    \n    #MESSAGE(\"_cuda_INC_DIRS = ${${_cuda_INC_DIRS}}\")\n\n#\tIF (CMAKE_SYTEM_INCLUDE_PATH)\n#\t\tSET(${_cuda_INC_DIRS} ${${_cuda_INC_DIRS}} \"-I\" ${CMAKE_SYSTEM_INCLUDE_PATH})\n#\tENDIF (CMAKE_SYTEM_INCLUDE_PATH)\n#\tIF (CMAKE_INCLUDE_PATH)\n#\t\tSET(${_cuda_INC_DIRS} ${${_cuda_INC_DIRS}} \"-I\" ${CMAKE_INCLUDE_PATH})\n#\tENDIF (CMAKE_INCLUDE_PATH)\n\nENDMACRO(GET_CUDA_INC_DIRS)\n\n\n# Get file dependencies.\nMACRO (GET_CUFILE_DEPENDENCIES dependencies file)\n\tGET_FILENAME_COMPONENT(filepath ${file} PATH)\n\t\n\t#  parse file for dependencies\n\tFILE(READ \"${file}\" CONTENTS)\n\t#STRING(REGEX MATCHALL \"#[ \\t]*include[ \\t]+[<\\\"][^>\\\"]*\" DEPS \"${CONTENTS}\")\n\tSTRING(REGEX MATCHALL \"#[ \\t]*include[ \\t]+\\\"[^\\\"]*\" DEPS \"${CONTENTS}\")\n\t\n\tSET(${dependencies})\n\t\n\tFOREACH(DEP ${DEPS})\n\t\tSTRING(REGEX REPLACE \"#[ \\t]*include[ \\t]+\\\"\" \"\" DEP \"${DEP}\")\n\t\t\n\t\t# clear the dependency path so that the correct version of the file can be found\n\t\tSET (PATH_OF_${DEP} \"${PATH_OF_${DEP}}-NOTFOUND\")\n\n\t\tFIND_PATH(PATH_OF_${DEP} ${DEP} ${filepath})\n\n\t\tIF(NOT ${PATH_OF_${DEP}} STREQUAL PATH_OF_${DEP}-NOTFOUND)\n\t\t\t#MESSAGE(\"${file} : ${PATH_OF_${DEP}}/${DEP}\")\n\t\t\tSET(${dependencies} ${${dependencies}} ${PATH_OF_${DEP}}/${DEP})\n\t\tENDIF(NOT ${PATH_OF_${DEP}} STREQUAL PATH_OF_${DEP}-NOTFOUND)\n\t\t\n\tENDFOREACH(DEP)\n\nENDMACRO (GET_CUFILE_DEPENDENCIES)\n\n# Get the dependencies (simplified)\nMACRO (GET_CUFILE_DEPS depend file)\n\tGET_FILENAME_COMPONENT(filepath ${file} PATH)\n\t\n\t#  parse file for dependencies\n\tFILE(READ \"${file}\" CONTENTS)\n\tSTRING(REGEX MATCHALL \"#[ \\t]*include[ \\t]+\\\"[^\\\"]*\" DEPS \"${CONTENTS}\")\n\t\n\tSET(${depend})\n\n\tFOREACH(DEP ${DEPS})\n\t\tSTRING(REGEX REPLACE \"#[ \\t]*include[ \\t]+\\\"\" \"\" DEP \"${DEP}\")\n\t\tSET(${depend} ${${depend}}  \"${DEP}\")\n\tENDFOREACH(DEP)\n\nENDMACRO (GET_CUFILE_DEPS)\n\n\n# WRAP_CUDA(outfile ...)\n\nIF(WIN32)\n    SET(CUTIL_LIB \"cutil32\")\n    SET(OFILE ${k3d_BINARY_DIR}/bin/libk3d-cuda-shared.dll)\n    SET(CUDA_LIB_OUTPUT_PATH \"bin\")\nELSE(WIN32)\n    SET(CUTIL_LIB \"cutil\")\n    SET(OFILE ${k3d_BINARY_DIR}/lib/libk3d-cuda-shared.so)\n    SET(CUDA_LIB_OUTPUT_PATH \"lib\")\nENDIF(WIN32)\n    \nMACRO (WRAP_CUDA outfiles)\n\tGET_CUDA_INC_DIRS(cuda_includes)\n\t#MESSAGE(${cuda_includes})\n\n\tFOREACH (INFILE ${ARGN})\n\t\tGET_FILENAME_COMPONENT (ABSFILE ${INFILE} ABSOLUTE)\n\t\tSET(INFILES ${INFILES} ${ABSFILE})\n\tENDFOREACH (INFILE)\n\t\n\tGET_CUFILE_DEPS(CUDEPS ${INFILES})\n\n\tADD_CUSTOM_COMMAND (\n\t\t\tOUTPUT ${OFILE}\n\t\t\tCOMMAND ${CUDA_COMPILER}\n\t\t\tARGS -shared ${CUDA_LINUX_64_FLAGS}\n                ${CUDA_OPTIONS}\n\t\t\t\t${cuda_includes} -o ${OFILE} ${INFILES}\n\t\t\t\t-lcudart\n\t\t\tDEPENDS ${INFILES} ${CUDEPS})\n\n        #MACRO_ADD_FILE_DEPENDENCIES(${CUFILE} ${OFILE})\n\n\t\tSET (${outfiles} ${${outfiles}} ${OFILE})\n\t\n\tSET_SOURCE_FILES_PROPERTIES(${outfiles} PROPERTIES GENERATED 1)\n\tINSTALL(FILES ${OFILE} DESTINATION ${CUDA_LIB_OUTPUT_PATH})\n\t\nENDMACRO (WRAP_CUDA)\n\n# define a makro to build a CUDA module\nMACRO(K3D_BUILD_CUDA_MODULE PLUGIN_NAME)\n\tPROJECT(${PLUGIN_NAME})\n    \n\tFILE(GLOB SOURCES *.cpp)\n\n\tIF(CMAKE_HAS_SORT)\n\t\tLIST(SORT SOURCES)\n\tENDIF(CMAKE_HAS_SORT)\n\n    ADD_LIBRARY(${PROJECT_NAME} SHARED ${CUDA_SOURCES} ${SOURCES} )\n\t\n    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES PREFIX \"\" SUFFIX \".module\" LINK_FLAG -L.)\n\n\tINSTALL(TARGETS ${PROJECT_NAME}\n\t\tRUNTIME DESTINATION lib/k3d/plugins\n\t\tLIBRARY DESTINATION lib/k3d/plugins)\n    \nENDMACRO(K3D_BUILD_CUDA_MODULE)\n"
  },
  {
    "path": "modules/cuda/cuda_bitmap_add.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include \"cuda_bitmap_simple_modifier.h\" \n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace cuda\n{\n\t\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_add\n\nclass cuda_bitmap_add :\n\tpublic cuda_bitmap_simple_modifier\n{\n\ttypedef cuda_bitmap_simple_modifier base;\n\npublic:\n\tcuda_bitmap_add(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_value(init_owner(*this) + init_name(\"value\") + init_label(_(\"Add value\")) + init_description(_(\"Add value to each pixel's Red, Green and Blue component\")) + init_value(0.0))\n\t{\n\t\tm_value.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tbitmap_arithmetic(Input, Output, CUDA_BITMAP_ADD, static_cast<float>(m_value.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_bitmap_add,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0x86ddee78, 0x074d46f7, 0x13bf758a, 0x8893b6c2),\n\t\t\t\t\"CUDABitmapAdd\",\n\t\t\t\t_(\"Add value to each pixel color component using the CUDA API\"),\n\t\t\t\t\"CUDABitmap\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_add\n\nk3d::iplugin_factory& cuda_bitmap_add_factory()\n{\n\treturn cuda_bitmap_add::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/cuda_bitmap_color_monochrome.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include \"cuda_bitmap_simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace cuda\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_color_monochrome\n\nclass cuda_bitmap_color_monochrome :\n\tpublic cuda_bitmap_simple_modifier\n{\n\ttypedef cuda_bitmap_simple_modifier base;\n\npublic:\n\tcuda_bitmap_color_monochrome(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_red_weight(init_owner(*this) + init_name(\"red_weight\") + init_label(_(\"Red weight\")) + init_description(_(\"Scale Red componnt value\")) + init_value(0.3)),\n\t\tm_green_weight(init_owner(*this) + init_name(\"green_weight\") + init_label(_(\"Green weight\")) + init_description(_(\"Scale Green component value\")) + init_value(0.59)),\n\t\tm_blue_weight(init_owner(*this) + init_name(\"blue_weight\") + init_label(_(\"Blue weight\")) + init_description(_(\"Scale Blue component value\")) + init_value(0.11))\n\t{\n\t\tm_red_weight.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t\tm_green_weight.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t\tm_blue_weight.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tconst unsigned short* inputPixels = reinterpret_cast<const unsigned short*>(&(const_view(Input)[0]));\n\t\tunsigned short* outputPixels = reinterpret_cast<unsigned short*>(&(view(Output)[0]));\n\t\tunsigned short *p_device_image;\n\t\tk3d::int32_t sizeInBytes = Input.width()*Input.height()*8;\n\t\t\n\t\t// copy the data to the device\n\t\tstart_profile_step();\n\t\tallocate_device_memory((void**)&p_device_image, sizeInBytes);\n\t\tcopy_from_host_to_device(p_device_image, inputPixels, sizeInBytes);\n\t\tstop_profile_step(PROFILE_STRING_HOST_TO_DEVICE);\n\n\t\t// perform the calculation\n\t\tstart_profile_step();\n\t\tbitmap_color_monochrome_kernel_entry(p_device_image, Input.width(), Input.height(), (float)(m_red_weight.pipeline_value()), (float)(m_green_weight.pipeline_value()), (float)(m_blue_weight.pipeline_value()));\n\t\tstop_profile_step(PROFILE_STRING_EXECUTE_KERNEL);       \n\n\t\t// copy the data from the device\n\t\tstart_profile_step();\n\t\tcopy_from_device_to_host(outputPixels, p_device_image, sizeInBytes);\n\t\tstop_profile_step(PROFILE_STRING_DEVICE_TO_HOST);\n\n\t\t// free the memory allocated on the device\n\t\tfree_device_memory(p_device_image);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_bitmap_color_monochrome,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0xa51271ab, 0xfc43d4b9, 0xdec56aab, 0x35605d9c),\n\t\t\t\t\"CUDABitmapColorMonochrome\",\n\t\t\t\t_(\"Make any image black and white\"),\n\t\t\t\t\"CUDABitmap\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_red_weight;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_green_weight;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_blue_weight;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_color_monochrome\n\nk3d::iplugin_factory& cuda_bitmap_color_monochrome_factory()\n{\n\treturn cuda_bitmap_color_monochrome::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/cuda_bitmap_gamma.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n    \\author Evan Lezar (evanlezar@gmail.com)\n    \\date 9 July 2008\n*/\n\n#include \"cuda_bitmap_simple_modifier.h\" \n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace cuda\n{\n    \n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_gamma\n\nclass cuda_bitmap_gamma :\n    public cuda_bitmap_simple_modifier\n{\n    typedef cuda_bitmap_simple_modifier base;\n\npublic:\n    cuda_bitmap_gamma(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n        base(Factory, Document),\n        m_value(init_owner(*this) + init_name(\"value\") + init_label(_(\"Gamma value\")) + init_description(_(\"Apply gamma value to each pixel\")) + init_value(1.0))\n    {\n\t\tm_value.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n    }\n\n\n    void on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n    {\n        bitmap_arithmetic(Input, Output, CUDA_BITMAP_GAMMA, (float)((m_value.pipeline_value() ? 1.0 / m_value.pipeline_value() : 1.0)));\n    }\n\n    static k3d::iplugin_factory& get_factory()\n    {\n        static k3d::document_plugin_factory<cuda_bitmap_gamma,\n            k3d::interface_list<k3d::ibitmap_source,\n            k3d::interface_list<k3d::ibitmap_sink> > > factory(\n                k3d::uuid(0xd7e5034c, 0x064437f8, 0x6b9aa9b1, 0xb3714887),\n                \"CUDABitmapGamma\",\n                _(\"Apply gamma value to each pixel using the CUDA API\"),\n                \"CUDABitmap\",\n                k3d::iplugin_factory::EXPERIMENTAL);\n\n        return factory;\n    }\n\nprivate:\n    k3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_gamma\n\nk3d::iplugin_factory& cuda_bitmap_gamma_factory()\n{\n    return cuda_bitmap_gamma::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n"
  },
  {
    "path": "modules/cuda/cuda_bitmap_invert.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Evan Lezar (evanlezar@gmail.com)\n    \\date 10 July 2008\n*/\n\n#include \"cuda_bitmap_simple_modifier.h\" \n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace cuda\n{\n\t\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_invert\n\nclass cuda_bitmap_invert :\n\tpublic cuda_bitmap_simple_modifier\n{\n\ttypedef cuda_bitmap_simple_modifier base;\n\npublic:\n\tcuda_bitmap_invert(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tbitmap_arithmetic(Input, Output, CUDA_BITMAP_INVERT, 0);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_bitmap_invert,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0x0647b6fb, 0xdb467947, 0xad9fb783, 0xf07efe04),\n\t\t\t\t\"CUDABitmapInvert\",\n\t\t\t\t_(\"Inverts a bitmap using the CUDA API\"),\n\t\t\t\t\"CUDABitmap\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_invert\n\nk3d::iplugin_factory& cuda_bitmap_invert_factory()\n{\n\treturn cuda_bitmap_invert::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/cuda_bitmap_matte_colordiff.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Evan Lezar (evanlezar@gmail.com)\n    \\date 10 July 2008\n*/\n\n#include \"cuda_bitmap_simple_modifier.h\" \n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace cuda\n{\n\t\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_matte_colordiff\n\nclass cuda_bitmap_matte_colordiff :\n\tpublic cuda_bitmap_simple_modifier\n{\n\ttypedef cuda_bitmap_simple_modifier base;\n\npublic:\n\tcuda_bitmap_matte_colordiff(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_value(init_owner(*this) + init_name(\"value\") + init_label(_(\"Threshold Value\")) + init_description(_(\"Set alpha channel using color difference\")) + init_value(0.0))\n\t{\n\t\tm_value.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tbitmap_arithmetic(Input, Output, CUDA_BITMAP_MATTE_COLORDIFF, (float)(m_value.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_bitmap_matte_colordiff,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0x307cab3f, 0xa34fd535, 0xde1675b1, 0x71fac02a),\n\t\t\t\t\"CUDABitmapMatteColorDiff\",\n\t\t\t\t_(\"Create alpha channel using color difference using the CUDA API\"),\n\t\t\t\t\"CUDABitmap\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_matte_colordiff\n\nk3d::iplugin_factory& cuda_bitmap_matte_colordiff_factory()\n{\n\treturn cuda_bitmap_matte_colordiff::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/cuda_bitmap_matte_invert.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Evan Lezar (evanlezar@gmail.com)\n    \\date 10 July 2008\n*/\n\n#include \"cuda_bitmap_simple_modifier.h\" \n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace cuda\n{\n\t\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_matte_invert\n\nclass cuda_bitmap_matte_invert :\n\tpublic cuda_bitmap_simple_modifier\n{\n\ttypedef cuda_bitmap_simple_modifier base;\n\npublic:\n\tcuda_bitmap_matte_invert(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tbitmap_arithmetic(Input, Output, CUDA_BITMAP_MATTE_INVERT, 0);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_bitmap_matte_invert,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0x31d95a63, 0x694628e4, 0xcb88ddaf, 0x48c0b47b),\n\t\t\t\t\"CUDABitmapMatteInvert\",\n\t\t\t\t_(\"Inverts a bitmap's alpha channel using the CUDA API\"),\n\t\t\t\t\"CUDABitmap\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_matte_invert\n\nk3d::iplugin_factory& cuda_bitmap_matte_invert_factory()\n{\n\treturn cuda_bitmap_matte_invert::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/cuda_bitmap_multiply.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include \"cuda_bitmap_simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace cuda\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_multiply\n\nclass cuda_bitmap_multiply :\n\tpublic cuda_bitmap_simple_modifier\n{\n\ttypedef cuda_bitmap_simple_modifier base;\n\npublic:\n\tcuda_bitmap_multiply(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_value(init_owner(*this) + init_name(\"value\") + init_label(_(\"Multiplicand\")) + init_description(_(\"Multiply each pixel component with this value\")) + init_value(1.0))\n\t{\n\t\tm_value.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tbitmap_arithmetic(Input, Output, CUDA_BITMAP_MULTIPLY, (float)(m_value.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_bitmap_multiply,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0xf2b5cdd6, 0x574d0d53, 0x8053ff81, 0x8612d328),\n\t\t\t\t\"CUDABitmapMultiply\",\n\t\t\t\t_(\"Multiply each each pixel color component by a specified value using the CUDA API\"),\n\t\t\t\t\"CUDABitmap\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_multiply\n\nk3d::iplugin_factory& cuda_bitmap_multiply_factory()\n{\n\treturn cuda_bitmap_multiply::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/cuda_bitmap_simple_modifier.h",
    "content": "#ifndef MODULES_CUDA_CUDA_BITMAP_SIMPLE_MODIFIER_H\n#define MODULES_CUDA_CUDA_BITMAP_SIMPLE_MODIFIER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/bitmap_modifier.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/node.h>\n\n// include the entry points as external definitions\n#include \"cuda_entry_points.h\"\n\nnamespace module\n{\n\nnamespace cuda\n{\n\nclass cuda_bitmap_simple_modifier :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_modifier<cuda_bitmap_simple_modifier>\n{\n\ttypedef k3d::node base;\n\npublic:\n\tcuda_bitmap_simple_modifier(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\nprotected:\n\tvoid start_profile_step()\n\t{\n\t\tdocument().pipeline_profiler().start_execution(*this, \"\");\n\t}\n\n\tvoid stop_profile_step(const std::string& Task)\n\t{\n\t\tdocument().pipeline_profiler().finish_execution(*this, Task);\n\t}\n\t\n\tvoid bitmap_arithmetic(const k3d::bitmap& Input, k3d::bitmap& Output, const k3d::int32_t bitmapOperation, float value)\n\t{\n\t\tconst unsigned short* inputPixels = reinterpret_cast<const unsigned short*>(&(const_view(Input)[0]));\n\t\tunsigned short* outputPixels = reinterpret_cast<unsigned short*>(&(view(Output)[0]));\n\t\tk3d::int32_t sizeInBytes = Input.width()*Input.height()*8;\n\t\t\n\t\tstart_profile_step();\n\t\t\n\t\t// allocate device storage for the image at 8 bits per pixel\n\t\tunsigned short *p_device_image;\n\t\tallocate_device_memory((void**)&p_device_image, sizeInBytes);\n\t\t// copy the data to the device\t\t\n\t\tcopy_from_host_to_device(p_device_image, inputPixels, sizeInBytes);  \t\t\n\t\tstop_profile_step(PROFILE_STRING_HOST_TO_DEVICE);\n\t\t\n\t\t// perform the calculation\n\t\tstart_profile_step();\n\t\tbitmap_arithmetic_kernel_entry(bitmapOperation, p_device_image, Input.width(), Input.height(), value);\n\t\tstop_profile_step(PROFILE_STRING_EXECUTE_KERNEL);\n\t\t\n\t\t// copy the data from the device\n\t\tstart_profile_step();\n\t\tcopy_from_device_to_host(outputPixels, p_device_image, sizeInBytes);\n\t\tstop_profile_step(PROFILE_STRING_DEVICE_TO_HOST);\n\t\t\n\t\t// free the memory allocated on the device\n\t\tfree_device_memory(p_device_image);\t\t\t\n\t} \n\t\nprivate:\n\tvirtual void on_resize_bitmap(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tOutput.recreate(Input.width(), Input.height());\n\t}\n\n};\n\n} // namespace cuda\n\n} // namespace module\n\n#endif // !MODULES_CUDA_CUDA_BITMAP_SIMPLE_MODIFIER_H\n\n"
  },
  {
    "path": "modules/cuda/cuda_bitmap_subtract.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include \"cuda_bitmap_simple_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace cuda\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_subtract\n\nclass cuda_bitmap_subtract :\n\tpublic cuda_bitmap_simple_modifier\n{\n\ttypedef cuda_bitmap_simple_modifier base;\n\npublic:\n\tcuda_bitmap_subtract(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_value(init_owner(*this) + init_name(\"value\") + init_label(_(\"Subtract value\")) + init_description(_(\"Add value to each pixel's Red, Green and Blue component\")) + init_value(0.0))\n\t{\n\t\tm_value.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tbitmap_arithmetic(Input, Output, CUDA_BITMAP_SUBTRACT, (float)(m_value.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_bitmap_subtract,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0xd85e4b52, 0xfd48fa70, 0x20c5cc93, 0x08ceb52f),\n\t\t\t\t\"CUDABitmapSubtract\",\n\t\t\t\t_(\"Subtract value from each pixel color component using the CUDA API\"),\n\t\t\t\t\"CUDABitmap\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_subtract\n\nk3d::iplugin_factory& cuda_bitmap_subtract_factory()\n{\n\treturn cuda_bitmap_subtract::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/cuda_bitmap_threshold.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Evan Lezar (evanlezar@gmail.com)\\\n    \\date 10 July 2008\n*/\n\n#include \"cuda_bitmap_simple_modifier.h\" \n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace cuda\n{\n\t\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_threshold\n\nclass cuda_bitmap_threshold :\n\tpublic cuda_bitmap_simple_modifier\n{\n\ttypedef cuda_bitmap_simple_modifier base;\n\npublic:\n\tcuda_bitmap_threshold(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_red_threshold(init_owner(*this) + init_name(\"red_threshold\") + init_label(_(\"Red threshold\")) + init_description(_(\"Clamp Red channel to threshold\")) + init_value(0.0)),\n        m_green_threshold(init_owner(*this) + init_name(\"green_threshold\") + init_label(_(\"Green threshold\")) + init_description(_(\"Clamp Green channel to threshold\")) + init_value(0.0)),\n        m_blue_threshold(init_owner(*this) + init_name(\"blue_threshold\") + init_label(_(\"Blue threshold\")) + init_description(_(\"Clamp Blue channel to threshold\")) + init_value(0.0)),\n        m_alpha_threshold(init_owner(*this) + init_name(\"alpha_threshold\") + init_label(_(\"Alpha threshold\")) + init_description(_(\"Clamp Alpha channel to threshold\")) + init_value(0.0))\n    {\n\t\tm_red_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t\tm_green_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t\tm_blue_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\t\tm_alpha_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n    }\n\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tconst unsigned short* inputPixels = reinterpret_cast<const unsigned short*>(&(const_view(Input)[0]));\n        unsigned short* outputPixels = reinterpret_cast<unsigned short*>(&(view(Output)[0]));\n        unsigned short *p_device_image;\n        k3d::int32_t sizeInBytes = Input.width()*Input.height()*8;\n        \n        // copy the data to the device\n        start_profile_step();\n        allocate_device_memory((void**)&p_device_image, sizeInBytes);\n        copy_from_host_to_device(p_device_image, inputPixels, sizeInBytes);\n        stop_profile_step(PROFILE_STRING_HOST_TO_DEVICE);\n\n        // perform the calculation\n        start_profile_step();\n        bitmap_threshold_kernel_entry(p_device_image, Input.width(), Input.height(), \n                                            (float)(m_red_threshold.pipeline_value()), \n                                            (float)(m_green_threshold.pipeline_value()), \n                                            (float)(m_blue_threshold.pipeline_value()), \n                                            (float)(m_alpha_threshold.pipeline_value()));\n                                            \n        stop_profile_step(PROFILE_STRING_EXECUTE_KERNEL);       \n\n        // copy the data from the device\n        start_profile_step();\n        copy_from_device_to_host(outputPixels, p_device_image, sizeInBytes);\n        stop_profile_step(PROFILE_STRING_DEVICE_TO_HOST);\n\n        // free the memory allocated on the device\n        free_device_memory(p_device_image);\n\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_bitmap_threshold,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink> > > factory(\n\t\t\t\tk3d::uuid(0xee5346f6, 0x0747fb8d, 0x524333a8, 0xe92dfee7),\n\t\t\t\t\"CUDABitmapThreshold\",\n\t\t\t\t_(\"Cut off chanels at a certain value using the CUDA API\"),\n\t\t\t\t\"CUDABitmap\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_red_threshold;\n    k3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_green_threshold;\n    k3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_blue_threshold;\n    k3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_alpha_threshold;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_bitmap_threshold\n\nk3d::iplugin_factory& cuda_bitmap_threshold_factory()\n{\n\treturn cuda_bitmap_threshold::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/cuda_deformation_transform_points.cpp",
    "content": "// K-3D\n// Copyright (c) 2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n#include <k3dsdk/transformable.h>\n\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/log.h>\n\n// include the entry points as external definitions\n#include \"cuda_entry_points.h\"\n#include \"cuda_mesh_simple_deformation_modifier.h\"\n\nnamespace module\n{\n\nnamespace cuda\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_deformation_transform_points\n\nclass cuda_deformation_transform_points :\n\tpublic k3d::transformable<k3d::mesh_simple_deformation_modifier>\n{\n\ttypedef k3d::transformable<k3d::mesh_simple_deformation_modifier> base;\n\npublic:\n\tcuda_deformation_transform_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_input_matrix.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tdocument().pipeline_profiler().start_execution(*this, \"\");\n\t\tconst k3d::matrix4 Transformation = m_input_matrix.pipeline_value();\n\n\t\tint num_points = InputPoints.size();\n\t\tvoid *cuda_array = NULL;\n\n\t\t// first convert the double precision mesh points to single precision for the GPU\n\t\t// use 3 floats for the points, and a 4th for the selection weight\n\n\t\t// a 4 x 4 matrix of floats\n\t\tfloat *float_transformation = (float*) malloc ( 64 );\n\n\t\tfloat_transformation[0] = Transformation[0][0];\n\t\tfloat_transformation[1] = Transformation[0][1];\n\t\tfloat_transformation[2] = Transformation[0][2];\n\t\tfloat_transformation[3] = Transformation[0][3];\n\t\tfloat_transformation[4] = Transformation[1][0];\n\t\tfloat_transformation[5] = Transformation[1][1];\n\t\tfloat_transformation[6] = Transformation[1][2];\n\t\tfloat_transformation[7] = Transformation[1][3];\n\t\tfloat_transformation[8] = Transformation[2][0];\n\t\tfloat_transformation[9] = Transformation[2][1];\n\t\tfloat_transformation[10] = Transformation[2][2];\n\t\tfloat_transformation[11] = Transformation[2][3];\n\t\tfloat_transformation[12] = Transformation[3][0];\n\t\tfloat_transformation[13] = Transformation[3][1];\n\t\tfloat_transformation[14] = Transformation[3][2];\n\t\tfloat_transformation[15] = Transformation[3][3];\n\t\tcopy_and_bind_texture_to_array( &cuda_array, float_transformation, 4, 4 );\n\n\t\t// struct to store timing info for GPU implementation\n    \ttimingInfo_t timing_info;\n    \ttiming_info.numEntries = 0;\n    \ttiming_info.timings = 0;\n    \ttiming_info.labels = 0;\n\n    \tdocument().pipeline_profiler().finish_execution(*this, \"BIND_TEXTURE\");\n\n    \t// use non-streamed version\n    \ttransform_points_synchronous ( (double *)&(InputPoints[0]), (double *)&(PointSelection[0]), (double *)&(OutputPoints[0]), num_points, &timing_info );\n\n\t\tfree_CUDA_array ( cuda_array );\n\t\tfree ( float_transformation );\n\n\t\tif ( timing_info.timings && timing_info.labels )\n\t\t{\n\t\t\tfor ( int i = 0; i < timing_info.numEntries; i++ )\n\t\t\t{\n\t\t\t\tif ( timing_info.labels[i])\n\t\t\t\t{\n\t\t\t\t\tdocument().pipeline_profiler().add_timing_entry(*this, timing_info.labels[i], timing_info.timings[i]);\n\t\t\t\t\tfree ( timing_info.labels[i] );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tdocument().pipeline_profiler().add_timing_entry(*this, \"\", timing_info.timings[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfree ( timing_info.labels );\n\t\t\tfree ( timing_info.timings );\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_deformation_transform_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > > > factory(\n\t\t\t\tk3d::uuid(0x3bb9fc2b, 0x65483516, 0xd7c69198, 0x30375235),\n\t\t\t\t\"CUDATransformPoints\",\n\t\t\t\t_(\"Transform mesh points using input matrix\"),\n\t\t\t\t\"CUDADeformation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_deformation_transform_points_factory\n\nk3d::iplugin_factory& cuda_deformation_transform_points_factory()\n{\n\treturn cuda_deformation_transform_points::get_factory();\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_deformation_transform_points_asynchronous\n\nclass cuda_deformation_transform_points_asynchronous :\n\tpublic k3d::transformable<k3d::mesh_simple_deformation_modifier>\n{\n\ttypedef k3d::transformable<k3d::mesh_simple_deformation_modifier> base;\n\npublic:\n\tcuda_deformation_transform_points_asynchronous(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_input_matrix.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tdocument().pipeline_profiler().start_execution(*this, \"\");\n\t\tconst k3d::matrix4 Transformation = m_input_matrix.pipeline_value();\n\n\t\tint num_points = InputPoints.size();\n\t\tvoid *cuda_array = NULL;\n\n\t\t// a 4 x 4 matrix of floats\n\t\tfloat *float_transformation = (float*) malloc ( 64 );\n\n\t\tfloat_transformation[0] = Transformation[0][0];\n\t\tfloat_transformation[1] = Transformation[0][1];\n\t\tfloat_transformation[2] = Transformation[0][2];\n\t\tfloat_transformation[3] = Transformation[0][3];\n\t\tfloat_transformation[4] = Transformation[1][0];\n\t\tfloat_transformation[5] = Transformation[1][1];\n\t\tfloat_transformation[6] = Transformation[1][2];\n\t\tfloat_transformation[7] = Transformation[1][3];\n\t\tfloat_transformation[8] = Transformation[2][0];\n\t\tfloat_transformation[9] = Transformation[2][1];\n\t\tfloat_transformation[10] = Transformation[2][2];\n\t\tfloat_transformation[11] = Transformation[2][3];\n\t\tfloat_transformation[12] = Transformation[3][0];\n\t\tfloat_transformation[13] = Transformation[3][1];\n\t\tfloat_transformation[14] = Transformation[3][2];\n\t\tfloat_transformation[15] = Transformation[3][3];\n\t\tcopy_and_bind_texture_to_array( &cuda_array, float_transformation, 4, 4 );\n\n\t\t// struct to store timing info for GPU implementation\n    \ttimingInfo_t timing_info;\n    \ttiming_info.numEntries = 0;\n    \ttiming_info.timings = 0;\n    \ttiming_info.labels = 0;\n\n    \tdocument().pipeline_profiler().finish_execution(*this, \"BIND_TEXTURE\");\n\n\t\t// use streams\n\t\ttransform_points_asynchronous ( (double *)&(InputPoints[0]), (double *)&(PointSelection[0]), (double *)&(OutputPoints[0]), num_points, &timing_info );\n\n\t\tfree_CUDA_array ( cuda_array );\n\t\tfree ( float_transformation );\n\n\t\tif ( timing_info.timings && timing_info.labels )\n\t\t{\n\t\t\tfor ( int i = 0; i < timing_info.numEntries; i++ )\n\t\t\t{\n\t\t\t\tif ( timing_info.labels[i])\n\t\t\t\t{\n\t\t\t\t\tdocument().pipeline_profiler().add_timing_entry(*this, timing_info.labels[i], timing_info.timings[i]);\n\t\t\t\t\tfree ( timing_info.labels[i] );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tdocument().pipeline_profiler().add_timing_entry(*this, \"\", timing_info.timings[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfree ( timing_info.labels );\n\t\t\tfree ( timing_info.timings );\n\t\t}\n\n\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_deformation_transform_points_asynchronous,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > > > factory(\n\t\t\t\tk3d::uuid(0x1cf04dc1, 0x7b443a52, 0x384baca7, 0xc84071a3),\n\t\t\t\t\"CUDATransformPointsAsynchronous\",\n\t\t\t\t_(\"Transform mesh points using input matrix\"),\n\t\t\t\t\"CUDADeformation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_deformation_transform_points_asynchronous_factory\n\nk3d::iplugin_factory& cuda_deformation_transform_points_asynchronous_factory()\n{\n\treturn cuda_deformation_transform_points_asynchronous::get_factory();\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_deformation_transform_points_device_mesh\n\nclass cuda_deformation_transform_points_device_mesh :\n\tpublic k3d::transformable<k3d::cuda_mesh_simple_deformation_modifier>\n{\n\ttypedef k3d::transformable<k3d::cuda_mesh_simple_deformation_modifier> base;\n\npublic:\n\tcuda_deformation_transform_points_device_mesh(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_input_matrix.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(k3d::mesh& Output)\n\t{\n\t\tk3d::log() << debug << \"on_deform_mesh\" << std::endl;\n\t\tdocument().pipeline_profiler().start_execution(*this, \"\");\n\t\tconst k3d::matrix4 Transformation = m_input_matrix.pipeline_value();\n\n\t\tint num_points = m_p_input_device_mesh.pipeline_value()->get_number_of_points();\n\t\tvoid *cuda_array = NULL;\n\n\t\t// first convert the double precision mesh points to single precision for the GPU\n\t\t// use 3 floats for the points, and a 4th for the selection weight\n\n\t\t// a 4 x 4 matrix of floats\n\t\tfloat *float_transformation = (float*) malloc ( 64 );\n\n\t\tfloat_transformation[0] = Transformation[0][0];\n\t\tfloat_transformation[1] = Transformation[0][1];\n\t\tfloat_transformation[2] = Transformation[0][2];\n\t\tfloat_transformation[3] = Transformation[0][3];\n\t\tfloat_transformation[4] = Transformation[1][0];\n\t\tfloat_transformation[5] = Transformation[1][1];\n\t\tfloat_transformation[6] = Transformation[1][2];\n\t\tfloat_transformation[7] = Transformation[1][3];\n\t\tfloat_transformation[8] = Transformation[2][0];\n\t\tfloat_transformation[9] = Transformation[2][1];\n\t\tfloat_transformation[10] = Transformation[2][2];\n\t\tfloat_transformation[11] = Transformation[2][3];\n\t\tfloat_transformation[12] = Transformation[3][0];\n\t\tfloat_transformation[13] = Transformation[3][1];\n\t\tfloat_transformation[14] = Transformation[3][2];\n\t\tfloat_transformation[15] = Transformation[3][3];\n\t\tcopy_and_bind_texture_to_array( &cuda_array, float_transformation, 4, 4 );\n\n    \tdocument().pipeline_profiler().finish_execution(*this, \"BIND_TEXTURE\");\n\n    \tdocument().pipeline_profiler().start_execution(*this, \"Kernel Call\");\n    \t// use the implementation that uses the device mesh\n    \ttransform_points_device_mesh (m_p_input_device_mesh.pipeline_value()->get_points_and_selection_pointer() , num_points);\n    \tdocument().pipeline_profiler().finish_execution(*this, \"Kernel Call\");\n\n    \tdocument().pipeline_profiler().start_execution(*this, \"Free Memory\");\n\t\tfree_CUDA_array ( cuda_array );\n\t\tfree ( float_transformation );\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Free Memory\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Copy From Device\");\n\n\t\tOutput.points.reset();\n\t\tOutput.point_selection.reset();\n\t\tm_p_input_device_mesh.pipeline_value()->copy_from_device(Output, MESH_POINTS+MESH_SELECTION);\n\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Copy From Device\");\n\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_deformation_transform_points_device_mesh,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > > > factory(\n\t\t\t\tk3d::uuid(0x2ef86b2e, 0x2449d8a8, 0xbac438a5, 0xffeb92c8),\n\t\t\t\t\"CUDATransformPointsDeviceMesh\",\n\t\t\t\t_(\"Transform mesh points using input matrix using a device mesh\"),\n\t\t\t\t\"CUDADeformation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_deformation_transform_points_device_mesh_factory\n\nk3d::iplugin_factory& cuda_deformation_transform_points_device_mesh_factory()\n{\n\treturn cuda_deformation_transform_points_device_mesh::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/cuda_device_mesh.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n    \\author Evan Lezar (evanlezar@gmail.com)\n    \\date 27 July 2008\n*/\n\n\n#include \"cuda_device_mesh.h\"\n\n/// Constructors\ncuda_device_mesh::cuda_device_mesh ( ):\n\tm_p_host_mesh(0),\n\tm_cuda_device_polyhedra()\n{\n\tpdev_points_and_selection = 0;\n    m_number_of_points = 0;\n}\n\ncuda_device_mesh::cuda_device_mesh ( const k3d::mesh& mesh ):\n\tm_p_host_mesh(&mesh),\n\tm_cuda_device_polyhedra()\n{\n\tif ( mesh.polyhedra )\n\t{\n\t\tm_cuda_device_polyhedra.set_polyhedra(*mesh.polyhedra);\n\t}\n    pdev_points_and_selection = 0;\n    m_number_of_points = mesh.points->size();\n}\n\n/// Destructor - frees the allocated device pointers\ncuda_device_mesh::~cuda_device_mesh()\n{\n    //k3d::log() << debug << \"~cuda_device_mesh\" << std::endl;\n    free_device_memory((void*)pdev_points_and_selection);\n}\n\n/**\n * Set the mesh\n */\nvoid cuda_device_mesh::set_mesh ( const k3d::mesh& input_mesh )\n{\n\tm_p_host_mesh = &input_mesh;\n\t// TODO:  Set the points and polyhedra associated with the mesh\n    set_points_and_selections( *input_mesh.points, *input_mesh.point_selection);\n}\n\n/**\n * Set the point and selection pointers\n */\nvoid cuda_device_mesh::set_points_and_selections ( k3d::mesh::points_t input_points, k3d::mesh::selection_t input_selections )\n{\n\tm_p_host_points = &input_points;\n    m_number_of_points = input_points.size();\n\tm_p_host_selections = &input_selections;\n}\n\n/**\n * copy the specified mesh to the device\n */\nvoid cuda_device_mesh::copy_to_device( k3d::uint32_t what_to_copy )\n{\n\tfloat* host_points_and_selection = 0;\n    if ( what_to_copy & (MESH_POINTS + MESH_SELECTION) )\n    {\n    \tbool copy_points = what_to_copy & MESH_POINTS;\n        bool copy_selection = what_to_copy & MESH_SELECTION;\n    \t// allocate the memory for the points and the point selection\n    \tallocate_device_memory((void**)&pdev_points_and_selection, (m_number_of_points)*4*sizeof(float));\n\n    \t// convert the point coordinates and selection to floats and copy to the device\n    \t// first allocate host memory\n\t\thost_points_and_selection = (float*) malloc (  m_number_of_points*4*sizeof(float) );\n\n\t\tfor ( int point = 0 ; point < m_number_of_points ; ++point )\n\t\t{\n            int float_index = point*4;\n            if ( copy_points )\n            {\n                host_points_and_selection[float_index] = (float)((*m_p_host_mesh->points)[point][0]);\n                host_points_and_selection[float_index+1] = (float)((*m_p_host_mesh->points)[point][1]);\n                host_points_and_selection[float_index+2] = (float)((*m_p_host_mesh->points)[point][2]);\n            }\n            if ( copy_selection )\n            {\n                host_points_and_selection[float_index+3] = (float)((*m_p_host_mesh->point_selection)[point]);\n            }\n\t\t}\n\n\t\t// copy the coordinates and selection to the device\n\t\tcopy_from_host_to_device((void*)pdev_points_and_selection, (const void*)host_points_and_selection, m_number_of_points*4*sizeof(float));\n    }\n\n    // remember to also copy the device versions of polyhedra etc\n    if ( what_to_copy & ALL_POLYHEDRA_INFO )\n    {\n    \tm_cuda_device_polyhedra.copy_to_device( what_to_copy );\n    }\n\n    // free the temporary host data\n\tsynchronize_threads();\n\tfree ( host_points_and_selection );\n}\n\n/**\n * Copy the specified mesh from the device\n */\nvoid cuda_device_mesh::copy_from_device( k3d::mesh& destination_mesh, k3d::uint32_t what_to_copy )\n{\n\tk3d::mesh* p_output_mesh = &destination_mesh;\n\tfloat* host_points_and_selection = 0;\n\tif ( what_to_copy & (MESH_POINTS + MESH_SELECTION) )\n    {\n    \tbool copy_points = what_to_copy & MESH_POINTS;\n        bool copy_selection = what_to_copy & MESH_SELECTION;\n\n    \t// allocate temporary storage for the floats from the device\n    \thost_points_and_selection = (float*) malloc ( m_number_of_points*4*sizeof(float) );\n    \tcopy_from_device_to_host( (void*) host_points_and_selection, (void*) pdev_points_and_selection, m_number_of_points*4*sizeof(float) );\n\n        double* out_points;\n        double* out_selection;\n\n    \tif ( copy_points )\n        {\n            // check to see if mesh's points exist\n            if ( !(p_output_mesh->points) )\n            {\n                p_output_mesh->points.create(new k3d::mesh::points_t(m_number_of_points));\n            }\n            // check to see if the number of points has changed\n            else if ( m_number_of_points  != p_output_mesh->points->size() )\n            {\n                p_output_mesh->points.create( new k3d::mesh::points_t ( m_number_of_points ) );\n                p_output_mesh->point_selection.create ( new k3d::mesh::selection_t ( m_number_of_points ) );\n            }\n            out_points = (double*)&(p_output_mesh->points->front());\n        }\n\n        if ( copy_selection )\n        {\n    \t\tif ( !(p_output_mesh->point_selection) )\n    \t\t{\n    \t\t\tp_output_mesh->point_selection.create(new k3d::mesh::selection_t(m_number_of_points));\n    \t\t}\n            else if ( m_number_of_points  != p_output_mesh->point_selection->size() )\n            {\n                p_output_mesh->point_selection.create ( new k3d::mesh::selection_t ( m_number_of_points ) );\n            }\n            out_selection = (double*)&(p_output_mesh->point_selection->front());\n        }\n\n\t\tsynchronize_threads();\n\t\tfor ( int point = 0 ; point < m_number_of_points ; ++point )\n\t\t{\n            int float_index = point*4;\n\t\t\tint double_index = point*3;\n            if ( copy_points )\n            {\n                out_points[double_index] = (double)(host_points_and_selection[float_index]);\n                out_points[double_index+1] = (double)(host_points_and_selection[float_index+1]);\n                out_points[double_index+2] = (double)(host_points_and_selection[float_index+2]);\n            }\n            if ( copy_selection )\n            {\n                out_selection[point] = (double)(host_points_and_selection[float_index+3]);\n            }\n\t\t}\n    }\n    // copy the polyhedra data from the device\n\n\tif ( what_to_copy & ALL_POLYHEDRA_INFO )\n\t{\n        if ( !p_output_mesh->polyhedra )\n        {\n            p_output_mesh->polyhedra.create();\n        }\n\n        m_cuda_device_polyhedra.copy_from_device(*(p_output_mesh->polyhedra), what_to_copy);\n\t}\n\n    synchronize_threads();\n    free ( host_points_and_selection );\n}\n\n/**\n * Allocate the memory for the mesh on the device - good for sources and output meshes\n */\nvoid cuda_device_mesh::allocate_on_device( k3d::uint32_t what_to_allocate )\n{\n\tif ( what_to_allocate & (MESH_POINTS + MESH_SELECTION) )\n\t{\n\t\tbool allocate_points = what_to_allocate & MESH_POINTS;\n\t\tbool allocate_selection = what_to_allocate & MESH_SELECTION;\n\t\t// allocate the memory for the points and the point selection\n\t\tallocate_device_memory((void**)&pdev_points_and_selection, (m_number_of_points)*4*sizeof(float));\n\t}\n\n\t// remember to also copy the device versions of polyhedra etc\n\tif ( what_to_allocate & ALL_POLYHEDRA_INFO )\n\t{\n\t\tm_cuda_device_polyhedra.allocate_on_device( what_to_allocate );\n\t}\n\n\t// free the temporary host data\n\tsynchronize_threads();\n}\n\n/**\n * Ouput debug information for the data structure\n */\nvoid cuda_device_mesh::output_debug_info()\n{\n    k3d::log() << debug << \"=====================\" << std::endl;\n    k3d::log() << debug << \"CUDA Device mesh info\" << std::endl;\n    k3d::log() << debug << \"=====================\" << std::endl;\n    k3d::log() << debug << \"pdev_points_and_selection: \" << pdev_points_and_selection << std::endl;\n    k3d::log() << debug << \"m_number_of_points: \" << m_number_of_points << std::endl;\n    k3d::log() << debug << \"m_p_host_mesh: \" << m_p_host_mesh << std::endl;\n    m_cuda_device_polyhedra.output_debug_info();\n    k3d::log() << debug << \"=====================\" << std::endl;\n}\n\n\ncuda_device_polyhedra& cuda_device_mesh::get_device_polyhedra ()\n{\n    return m_cuda_device_polyhedra;\n}\n\nfloat* cuda_device_mesh::get_points_and_selection_pointer()\n{\n    return pdev_points_and_selection;\n}\n\nk3d::uint32_t* cuda_device_mesh::get_polyhedra_edge_point_indices_pointer()\n{\n    return m_cuda_device_polyhedra.get_per_edge_points_pointer();\n}\n\nk3d::uint32_t* cuda_device_mesh::get_polyhedra_clockwise_edge_point_indices_pointer()\n{\n    return m_cuda_device_polyhedra.get_per_edge_clockwise_edges_pointer();\n}\n\nk3d::uint32_t* cuda_device_mesh::get_polyhedra_loop_first_edges_pointer()\n{\n    return m_cuda_device_polyhedra.get_per_loop_first_edges_pointer();\n}\n\nvoid cuda_device_mesh::set_device_polyhedra( const k3d::mesh::polyhedra_t& host_polyhedra )\n{\n\n}\n\n/**\n * Allocate space on the device for a new number of points and copy the data if required\n */\nvoid cuda_device_mesh::resize_points_and_selection ( k3d::uint32_t new_number_of_points, float default_selection )\n{\n    float* new_pdev_point_and_selection;\n    allocate_device_memory((void**)&new_pdev_point_and_selection, new_number_of_points*sizeof(float)*4);\n\n    if ( pdev_points_and_selection != 0 )\n    {\n        copy_from_device_to_device((void*)new_pdev_point_and_selection, (const void*)pdev_points_and_selection, std::min(m_number_of_points, new_number_of_points)*4*sizeof(float));\n\n        // initialize the selection to its default value\n        if ( ( new_number_of_points > m_number_of_points ) & ( default_selection != 0 ) )\n        {\n            set_selection_value_entry ( new_pdev_point_and_selection + m_number_of_points*4, default_selection, new_number_of_points - m_number_of_points );\n        }\n        // free the memory allocated previously\n        free_device_memory( pdev_points_and_selection );\n    }\n\n    synchronize_threads();\n    pdev_points_and_selection = new_pdev_point_and_selection;\n    m_number_of_points = new_number_of_points;\n}\n\n/**\n * Set all the selection values to 1\n */\nvoid cuda_device_mesh::select_all_points()\n{\n\tif ( pdev_points_and_selection )\n\t{\n\t\tset_selection_value_entry ( pdev_points_and_selection, 1.0, m_number_of_points );\n\t}\n}\n\n/**\n *  Get the number of points in the device mesh\n */\nk3d::uint32_t cuda_device_mesh::get_number_of_points()\n{\n\treturn m_number_of_points;\n}\n"
  },
  {
    "path": "modules/cuda/cuda_device_mesh.h",
    "content": "#ifndef MODULES_CUDA_CUDA_DEVICE_MESH_H\n#define MODULES_CUDA_CUDA_DEVICE_MESH_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n    \\author Evan Lezar (evanlezar@gmail.com)\n    \\date 27 July 2008\n*/\n\n#include <k3dsdk/mesh.h>\n#include \"cuda_device_polyhedra.h\"\n\n/// Start fleshing out cuda mesh structure.\n\nclass cuda_device_mesh\n{\n    public:\n    \t/// Constructors\n    \tcuda_device_mesh ( );\n        cuda_device_mesh ( const k3d::mesh& host_mesh );\n        ~cuda_device_mesh ();\n\n        void set_mesh ( const k3d::mesh& input_mesh );\n        void set_points_and_selections ( k3d::mesh::points_t input_points, k3d::mesh::selection_t input_selections );\n\n        void copy_to_device ( k3d::uint32_t what_to_copy = ALL_MESH_INFO );\n        void copy_from_device ( k3d::mesh& destination_mesh, k3d::uint32_t what_to_copy = ALL_MESH_INFO );\n\n        void allocate_on_device ( k3d::uint32_t what_to_allocate = ALL_MESH_INFO );\n\n        void output_debug_info ();\n\n        cuda_device_polyhedra& get_device_polyhedra ();\n        void set_device_polyhedra ( const k3d::mesh::polyhedra_t& host_polyhedra );\n\n        float* get_points_and_selection_pointer();\n\n        k3d::uint32_t* get_polyhedra_edge_point_indices_pointer();\n        k3d::uint32_t* get_polyhedra_clockwise_edge_point_indices_pointer();\n        k3d::uint32_t* get_polyhedra_loop_first_edges_pointer();\n\n        /// resize the point array - allow for adding points in an operation\n        void resize_points_and_selection ( k3d::uint32_t new_number_of_points, float default_selection = 0);\n\n        void select_all_points ();\n\n        /// methods to get mesh size info\n\n        k3d::uint32_t get_number_of_points();\n\n    private:\n        /// a pointer to a array of float4's allocated on the device\n        float* pdev_points_and_selection;\n        k3d::uint32_t m_number_of_points;\n\n        const k3d::mesh* m_p_host_mesh;\n        k3d::mesh::points_t* m_p_host_points;\n        k3d::mesh::selection_t* m_p_host_selections;\n\n        cuda_device_polyhedra m_cuda_device_polyhedra;\n};\n\ntypedef boost::shared_ptr<cuda_device_mesh> cuda_device_mesh_p;\n\n#endif // !MODULES_CUDA_CUDA_DEVICE_MESH_H\n\n"
  },
  {
    "path": "modules/cuda/cuda_device_polyhedra.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n    \\author Evan Lezar (evanlezar@gmail.com)\n    \\date 14 July 2008\n*/\n\n#include \"cuda_device_polyhedra.h\"\n\ninline void copy_from_host_to_device_uint_64_bit_check ( void* device_pointer, const void* host_pointer, int size_in_bytes )\n{\n#ifdef K3D_UINT_T_64_BITS\n    copy_from_host_to_device_64_to_32_convert (device_pointer, host_pointer, size_in_bytes );\n#else\n    copy_from_host_to_device (device_pointer, host_pointer, size_in_bytes );\n#endif\n}\n\ninline void copy_from_device_to_host_uint_64_bit_check ( void* host_pointer, const void* device_pointer, int size_in_bytes )\n{\n#ifdef K3D_UINT_T_64_BITS\n\tcopy_from_device_to_host_32_to_64_convert (host_pointer, device_pointer, size_in_bytes );\n#else\n  copy_from_device_to_host (host_pointer, device_pointer, size_in_bytes );\n#endif\n}\n\n/// Constructors\ncuda_device_polyhedra::cuda_device_polyhedra ( ):\n    m_p_input_polyhedra(0)\n{\n    pdev_per_polygon_first_face = 0;\n    pdev_per_polygon_face_count = 0;\n    pdev_per_polygon_types = 0;\n\n    m_number_of_polygons = 0;\n\n    pdev_per_face_first_loops = 0;\n    pdev_per_face_loop_count = 0;\n    pdev_per_face_selection = 0;\n\n\tm_number_of_faces = 0;\n\n    pdev_per_loop_first_edge = 0;\n\tm_number_of_loops = 0;\n\n    pdev_per_edge_point = 0;\n    pdev_per_edge_clockwise_edge = 0;\n    pdev_per_edge_selection = 0;\n\n    m_number_of_edges = 0;\n\n}\n\ncuda_device_polyhedra::cuda_device_polyhedra ( const k3d::mesh::polyhedra_t& host_polyhedra ):\n    m_p_input_polyhedra(&host_polyhedra)\n{\n    pdev_per_polygon_first_face = 0;\n    pdev_per_polygon_face_count = 0;\n    pdev_per_polygon_types = 0;\n\n    pdev_per_face_first_loops = 0;\n    pdev_per_face_loop_count = 0;\n    pdev_per_face_selection = 0;\n\n    pdev_per_loop_first_edge = 0;\n\n    pdev_per_edge_point = 0;\n    pdev_per_edge_clockwise_edge = 0;\n    pdev_per_edge_selection = 0;\n\n    set_polyhedra( host_polyhedra );\n}\n\n/// Destructor - free the allocated device pointers\ncuda_device_polyhedra::~cuda_device_polyhedra ()\n{\n    //k3d::log() << debug << \"~cuda_device_polyhedra\" << std::endl;\n    free_device_memory((void*)pdev_per_polygon_first_face);\n    free_device_memory((void*)pdev_per_polygon_face_count);\n    free_device_memory((void*)pdev_per_polygon_types);\n\n    free_device_memory((void*)pdev_per_face_first_loops);\n    free_device_memory((void*)pdev_per_face_loop_count);\n    free_device_memory((void*)pdev_per_face_selection);\n\n    free_device_memory((void*)pdev_per_loop_first_edge);\n\n    free_device_memory((void*)pdev_per_edge_point);\n    free_device_memory((void*)pdev_per_edge_clockwise_edge);\n    free_device_memory((void*)pdev_per_edge_selection);\n\n    pdev_per_polygon_first_face = 0;\n\tpdev_per_polygon_face_count = 0;\n\tpdev_per_polygon_types = 0;\n\tm_number_of_polygons = 0;\n\n\tpdev_per_face_first_loops = 0;\n\tpdev_per_face_loop_count = 0;\n\tpdev_per_face_selection = 0;\n\tm_number_of_faces = 0;\n\n\tpdev_per_loop_first_edge = 0;\n\tm_number_of_loops = 0;\n\n\tpdev_per_edge_point = 0;\n\tpdev_per_edge_clockwise_edge = 0;\n\tpdev_per_edge_selection = 0;\n\tm_number_of_edges = 0;\n\n\tm_p_input_polyhedra = 0;\n\n}\n\nvoid cuda_device_polyhedra::set_polyhedra( const k3d::mesh::polyhedra_t& host_polyhedra )\n{\n\tm_p_input_polyhedra = &host_polyhedra;\n\ttry\n\t{\n\t\tm_number_of_polygons = m_p_input_polyhedra->first_faces->size();\n\t}\n\tcatch (...)\n\t{\n\t\tm_number_of_polygons = 0;\n\t}\n\n\ttry\n\t{\n\t\tm_number_of_faces = m_p_input_polyhedra->face_first_loops->size();\n\t}\n\tcatch (...)\n\t{\n\t\tm_number_of_faces = 0;\n\t}\n\n\ttry\n\t{\n\t\tm_number_of_loops = m_p_input_polyhedra->loop_first_edges->size();\n\t}\n\tcatch (...)\n\t{\n\t\tm_number_of_loops = 0;\n\t}\n\n\ttry\n\t{\n\t\tm_number_of_edges = m_p_input_polyhedra->edge_points->size();\n\t}\n\tcatch (...)\n\t{\n\t\tm_number_of_edges = 0;\n\t}\n\n}\n\n/**\n * copy the specified polyhedra to the device\n */\nvoid cuda_device_polyhedra::copy_to_device( k3d::uint32_t what_to_copy  )\n{\n    if ( what_to_copy & POLYHEDRA_ALL_POLYGONS )\n    {\n        allocate_device_memory((void**)&pdev_per_polygon_first_face, m_number_of_polygons*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_polygon_face_count, m_number_of_polygons*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_polygon_types, m_number_of_polygons*sizeof(int32_t));\n\n        copy_from_host_to_device_uint_64_bit_check(pdev_per_polygon_first_face, &(m_p_input_polyhedra->first_faces->front()), m_number_of_polygons*sizeof(k3d::uint32_t));\n        copy_from_host_to_device_uint_64_bit_check(pdev_per_polygon_face_count, &(m_p_input_polyhedra->face_counts->front()), m_number_of_polygons*sizeof(k3d::uint32_t));\n        copy_from_host_to_device(pdev_per_polygon_types, &(m_p_input_polyhedra->types->front()), m_number_of_polygons*sizeof(int32_t));\n    }\n\n    float* face_selection_temp = 0;\n    if ( what_to_copy & POLYHEDRA_ALL_FACES )\n    {\n        allocate_device_memory((void**)&pdev_per_face_first_loops, m_number_of_faces*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_face_loop_count, m_number_of_faces*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_face_selection, m_number_of_faces*sizeof(float));\n\n        copy_from_host_to_device_uint_64_bit_check(pdev_per_face_first_loops, &(m_p_input_polyhedra->face_first_loops->front()), m_number_of_faces*sizeof(k3d::uint32_t));\n        copy_from_host_to_device_uint_64_bit_check(pdev_per_face_loop_count, &(m_p_input_polyhedra->face_loop_counts->front()), m_number_of_faces*sizeof(k3d::uint32_t));\n\n        face_selection_temp = (float*) malloc ( m_number_of_faces*sizeof(float) );\n        for ( k3d::uint32_t face = 0 ; face < m_number_of_faces ; ++face )\n        {\n            face_selection_temp[face] = (float)((*m_p_input_polyhedra->face_selection)[face]);\n        }\n        copy_from_host_to_device(pdev_per_face_selection, face_selection_temp, m_number_of_faces*sizeof(float));\n\n    }\n\n    if ( what_to_copy & POLYHEDRA_ALL_LOOPS )\n    {\n\n        allocate_device_memory((void**)&pdev_per_loop_first_edge, m_number_of_loops*sizeof(k3d::uint32_t));\n        copy_from_host_to_device_uint_64_bit_check(pdev_per_loop_first_edge, &(m_p_input_polyhedra->loop_first_edges->front()), m_number_of_loops*sizeof(k3d::uint32_t));\n    }\n\n    float* edge_selection_temp = 0;\n    if ( what_to_copy & POLYHEDRA_ALL_EDGES )\n    {\n        allocate_device_memory((void**)&pdev_per_edge_point, m_number_of_edges*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_edge_clockwise_edge, m_number_of_edges*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_edge_selection, m_number_of_edges*sizeof(float));\n\n        copy_from_host_to_device_uint_64_bit_check(pdev_per_edge_point, &(m_p_input_polyhedra->edge_points->front()), m_number_of_edges*sizeof(k3d::uint32_t));\n        copy_from_host_to_device_uint_64_bit_check(pdev_per_edge_clockwise_edge, &(m_p_input_polyhedra->clockwise_edges->front()), m_number_of_edges*sizeof(k3d::uint32_t));\n\n        edge_selection_temp = (float*) malloc ( m_number_of_edges*sizeof(float) );\n        for ( k3d::uint32_t edge = 0 ; edge < m_number_of_edges ; ++edge )\n        {\n            edge_selection_temp[edge] = (float)((*m_p_input_polyhedra->edge_selection)[edge]);\n        }\n        copy_from_host_to_device(pdev_per_edge_selection, edge_selection_temp, m_number_of_edges*sizeof(float));\n\n    }\n\n    synchronize_threads();\n    free ( face_selection_temp );\n    free ( edge_selection_temp );\n\n}\n\n/**\n * Copy the polyhedra from the device\n */\nvoid cuda_device_polyhedra::copy_from_device(const k3d::mesh::polyhedra_t& destination_polyhedra, k3d::uint32_t what_to_copy )\n{\n    //k3d::log() << debug << \"cuda_device_polyhedra::copy_from_device\" << std::endl;\n\n    k3d::mesh::polyhedra_t* p_output_polyhedra = const_cast<k3d::mesh::polyhedra_t*>(&destination_polyhedra);\n\n    float* edge_selection_temp = 0;\n    if ( what_to_copy & POLYHEDRA_ALL_EDGES )\n    {\n        //k3d::log() << debug << \"cuda_device_polyhedra::copy_from_device::POLYHEDRA_ALL_EDGES\" << std::endl;\n        edge_selection_temp = (float*) malloc ( m_number_of_edges*sizeof(float) );\n        copy_from_device_to_host(edge_selection_temp, pdev_per_edge_selection, m_number_of_edges*sizeof(float));\n\n        if ( !p_output_polyhedra->edge_points )\n        {\n            p_output_polyhedra->edge_points.create(new k3d::mesh::indices_t ( m_number_of_edges ) );\n        }\n        else if ( p_output_polyhedra->edge_points->size() != m_number_of_edges )\n        {\n            p_output_polyhedra->edge_points.create ( new k3d::mesh::indices_t ( m_number_of_edges ) );\n        }\n\n        if ( !p_output_polyhedra->clockwise_edges )\n        {\n            p_output_polyhedra->clockwise_edges.create(new k3d::mesh::indices_t ( m_number_of_edges ) );\n        }\n        else if ( p_output_polyhedra->clockwise_edges->size() != m_number_of_edges )\n        {\n            p_output_polyhedra->clockwise_edges.create( new k3d::mesh::indices_t ( m_number_of_edges ) );\n        }\n\n        if ( !p_output_polyhedra->edge_selection )\n        {\n            p_output_polyhedra->edge_selection.create( new k3d::mesh::selection_t ( m_number_of_edges ) );\n        }\n        else if ( p_output_polyhedra->edge_selection->size() != m_number_of_edges )\n        {\n            p_output_polyhedra->edge_selection.create( new k3d::mesh::selection_t ( m_number_of_edges ) );\n        }\n        \n        // Create a default face materials array\n        if(!p_output_polyhedra->face_materials)\n        {\n        \tp_output_polyhedra->face_materials.create(new k3d::mesh::materials_t(m_number_of_faces));\n        }\n\n        synchronize_threads();\n        double* out_selection = (double*)&(p_output_polyhedra->edge_selection->front());\n        for ( k3d::uint32_t edge = 0 ; edge < m_number_of_edges ; ++edge )\n        {\n            (out_selection)[edge] = (double) edge_selection_temp[edge];\n        }\n\n        copy_from_device_to_host_uint_64_bit_check((void*)&(p_output_polyhedra->edge_points->front()),(const void*) pdev_per_edge_point, m_number_of_edges*sizeof(k3d::uint32_t));\n        copy_from_device_to_host_uint_64_bit_check((void*)&(p_output_polyhedra->clockwise_edges->front()), (const void*) pdev_per_edge_clockwise_edge, m_number_of_edges*sizeof(k3d::uint32_t));\n    }\n\n    if ( what_to_copy & POLYHEDRA_ALL_LOOPS )\n    {\n        //k3d::log() << debug << \"cuda_device_polyhedra::copy_from_device::POLYHEDRA_ALL_LOOPS\" << std::endl;\n        if ( !p_output_polyhedra->loop_first_edges )\n        {\n            p_output_polyhedra->loop_first_edges.create( new k3d::mesh::indices_t ( m_number_of_loops ) );\n        }\n        else if ( p_output_polyhedra->loop_first_edges->size() != m_number_of_loops )\n        {\n            p_output_polyhedra->loop_first_edges.create( new k3d::mesh::indices_t ( m_number_of_loops ) );\n        }\n\n        copy_from_device_to_host_uint_64_bit_check((void*)&(p_output_polyhedra->loop_first_edges->front()), (const void*)pdev_per_loop_first_edge, m_number_of_loops*sizeof(k3d::uint32_t));\n    }\n\n    float* face_selection_temp = 0;\n    if ( what_to_copy & ( POLYHEDRA_ALL_FACES ) )\n    {\n        //k3d::log() << debug << \"cuda_device_polyhedra::copy_from_device::POLYHEDRA_ALL_FACES\" << std::endl;\n        // allocate memory for the float to double conversion\n        face_selection_temp = (float*) malloc ( m_number_of_faces*sizeof(float) );\n        copy_from_device_to_host(face_selection_temp, pdev_per_face_selection, m_number_of_faces*sizeof(float));\n\n        if ( !p_output_polyhedra->face_first_loops )\n        {\n            p_output_polyhedra->face_first_loops.create( new k3d::mesh::indices_t ( m_number_of_faces ) );\n        }\n        else if ( p_output_polyhedra->face_first_loops->size() != m_number_of_faces )\n        {\n            p_output_polyhedra->face_first_loops.create( new k3d::mesh::indices_t ( m_number_of_faces ) );\n        }\n\n        if ( !p_output_polyhedra->face_loop_counts )\n        {\n            p_output_polyhedra->face_loop_counts.create( new k3d::mesh::indices_t ( m_number_of_faces ) );\n        }\n        else if ( p_output_polyhedra->face_loop_counts->size() != m_number_of_faces )\n        {\n            p_output_polyhedra->face_loop_counts.create( new k3d::mesh::indices_t ( m_number_of_faces ) );\n        }\n\n        if ( !p_output_polyhedra->face_selection )\n        {\n            p_output_polyhedra->face_selection.create(new k3d::mesh::selection_t ( m_number_of_faces ) );\n        }\n        else if ( p_output_polyhedra->face_selection->size() != m_number_of_faces )\n        {\n            p_output_polyhedra->face_selection.create(new k3d::mesh::selection_t ( m_number_of_faces ) );\n        }\n\n        synchronize_threads();\n        double* out_selection = (double*)&(p_output_polyhedra->face_selection->front());\n        for ( k3d::uint32_t face = 0 ; face < m_number_of_faces ; ++face )\n        {\n            (out_selection)[face] = (double)face_selection_temp[face];\n        }\n\n        copy_from_device_to_host_uint_64_bit_check((void*)&(p_output_polyhedra->face_first_loops->front()), (const void*)pdev_per_face_first_loops, m_number_of_faces*sizeof(k3d::uint32_t));\n        copy_from_device_to_host_uint_64_bit_check((void*)&(p_output_polyhedra->face_loop_counts->front()), (const void*)pdev_per_face_loop_count, m_number_of_faces*sizeof(k3d::uint32_t));\n    }\n\n    if ( what_to_copy & ( POLYHEDRA_ALL_POLYGONS ) )\n    {\n        //k3d::log() << debug << \"cuda_device_polyhedra::copy_from_device::POLYHEDRA_ALL_POLYGONS\" << std::endl;\n\n        if ( !p_output_polyhedra->first_faces )\n        {\n            p_output_polyhedra->first_faces.create(new k3d::mesh::indices_t ( m_number_of_polygons ) );\n        }\n        else if ( p_output_polyhedra->first_faces->size() != m_number_of_polygons )\n        {\n            p_output_polyhedra->first_faces.create(new k3d::mesh::indices_t ( m_number_of_polygons ) );\n        }\n\n        if ( !p_output_polyhedra->face_counts )\n        {\n            p_output_polyhedra->face_counts.create(new k3d::mesh::indices_t ( m_number_of_polygons ) );\n        }\n        else if ( p_output_polyhedra->face_counts->size() != m_number_of_polygons )\n        {\n            p_output_polyhedra->face_counts.create(new k3d::mesh::indices_t ( m_number_of_polygons ) );\n        }\n\n        if ( !p_output_polyhedra->types )\n        {\n            p_output_polyhedra->types.create(new k3d::mesh::polyhedra_t::types_t ( m_number_of_polygons ) );\n        }\n        else if ( p_output_polyhedra->types->size() != m_number_of_polygons )\n        {\n            p_output_polyhedra->types.create(new k3d::mesh::polyhedra_t::types_t ( m_number_of_polygons ) );\n        }\n\n        copy_from_device_to_host_uint_64_bit_check((void*)&(p_output_polyhedra->first_faces->front()), (const void*)pdev_per_polygon_first_face, m_number_of_polygons*sizeof(k3d::uint32_t));\n        copy_from_device_to_host_uint_64_bit_check((void*)&(p_output_polyhedra->face_counts->front()), (const void*)pdev_per_polygon_face_count, m_number_of_polygons*sizeof(k3d::uint32_t));\n        copy_from_device_to_host((void*)&(p_output_polyhedra->types->front()), (const void*)pdev_per_polygon_types, m_number_of_polygons*sizeof(int32_t));\n\n    }\n\n    synchronize_threads();\n    free ( face_selection_temp );\n    free ( edge_selection_temp );\n    //k3d::log() << debug << \"cuda_device_polyhedra::copy_from_device::end\" << std::endl;\n}\n\nvoid cuda_device_polyhedra::allocate_on_device( k3d::uint32_t what_to_allocate )\n{\n    if ( what_to_allocate & POLYHEDRA_ALL_POLYGONS )\n    {\n        allocate_device_memory((void**)&pdev_per_polygon_first_face, m_number_of_polygons*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_polygon_face_count, m_number_of_polygons*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_polygon_types, m_number_of_polygons*sizeof(int32_t));\n    }\n\n    if ( what_to_allocate & POLYHEDRA_ALL_FACES )\n    {\n        allocate_device_memory((void**)&pdev_per_face_first_loops, m_number_of_faces*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_face_loop_count, m_number_of_faces*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_face_selection, m_number_of_faces*sizeof(float));\n    }\n\n    if ( what_to_allocate & POLYHEDRA_ALL_LOOPS )\n    {\n        allocate_device_memory((void**)&pdev_per_loop_first_edge, m_number_of_loops*sizeof(k3d::uint32_t));\n    }\n\n    if ( what_to_allocate & POLYHEDRA_ALL_EDGES )\n    {\n        allocate_device_memory((void**)&pdev_per_edge_point, m_number_of_edges*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_edge_clockwise_edge, m_number_of_edges*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&pdev_per_edge_selection, m_number_of_edges*sizeof(float));\n    }\n\n    synchronize_threads();\n}\n\n/**\n * Ouput debug information for the data structure\n */\nvoid cuda_device_polyhedra::output_debug_info()\n{\n    k3d::log() << debug << \"=====================\" << std::endl;\n    k3d::log() << debug << \"CUDA Device polyhedra info\" << std::endl;\n    k3d::log() << debug << \"=====================\" << std::endl;\n    k3d::log() << debug << \"pdev_per_polygon_first_face: \" << pdev_per_polygon_first_face << std::endl;\n    k3d::log() << debug << \"pdev_per_polygon_face_count: \" << pdev_per_polygon_face_count << std::endl;\n    k3d::log() << debug << \"pdev_per_polygon_types: \" << pdev_per_polygon_types << std::endl;\n    k3d::log() << debug << \"m_number_of_polygons: \" << m_number_of_polygons << std::endl;\n\n    k3d::log() << debug << \"pdev_per_face_first_loops: \" << pdev_per_face_first_loops << std::endl;\n    k3d::log() << debug << \"pdev_per_face_loop_count: \" << pdev_per_face_loop_count << std::endl;\n    k3d::log() << debug << \"pdev_per_face_selection: \" << pdev_per_face_selection << std::endl;\n    k3d::log() << debug << \"m_number_of_faces: \" << m_number_of_faces << std::endl;\n\n    k3d::log() << debug << \"pdev_per_loop_first_edge: \" << pdev_per_loop_first_edge << std::endl;\n    k3d::log() << debug << \"m_number_of_loops: \" << m_number_of_loops << std::endl;\n\n    k3d::log() << debug << \"pdev_per_edge_point: \" << pdev_per_face_first_loops << std::endl;\n    k3d::log() << debug << \"pdev_per_edge_clockwise_edge: \" << pdev_per_face_loop_count << std::endl;\n    k3d::log() << debug << \"pdev_per_edge_selection: \" << pdev_per_face_selection << std::endl;\n    k3d::log() << debug << \"m_number_of_edges: \" << m_number_of_faces << std::endl;\n\n    k3d::log() << debug << \"m_p_input_polyhedra: \" << m_p_input_polyhedra << std::endl;\n    k3d::log() << debug << \"=====================\" << std::endl;\n}\n\nk3d::uint32_t* cuda_device_polyhedra::get_per_edge_points_pointer()\n{\n    return pdev_per_edge_point;\n}\n\nk3d::uint32_t* cuda_device_polyhedra::get_per_edge_clockwise_edges_pointer()\n{\n    return pdev_per_edge_clockwise_edge;\n}\n\nk3d::uint32_t* cuda_device_polyhedra::get_per_loop_first_edges_pointer()\n{\n    return pdev_per_loop_first_edge;\n}\n\nk3d::uint32_t* cuda_device_polyhedra::get_per_face_first_loops_pointer()\n{\n\treturn pdev_per_face_first_loops;\n}\n\nk3d::uint32_t* cuda_device_polyhedra::get_per_face_loop_counts_pointer()\n{\n\treturn pdev_per_face_loop_count;\n}\n\nfloat* cuda_device_polyhedra::get_per_face_selection_pointer()\n{\n\treturn pdev_per_face_selection;\n}\n\nfloat* cuda_device_polyhedra::get_per_edge_selection_pointer()\n{\n\treturn pdev_per_edge_selection;\n}\n\n/**\n * Increase the size of the data structures corresponding to the edges\n */\nvoid cuda_device_polyhedra::resize_edges ( k3d::uint32_t new_number_of_edges, bool clear )\n{\n\tint new_edges_count = new_number_of_edges - m_number_of_edges;\n\n\tif ( new_edges_count != 0 )\n\t{\n\t\tfloat* new_pdev_per_edge_selection = 0;\n\t\tk3d::uint32_t* new_pdev_per_edge_point = 0;\n\t\tk3d::uint32_t* new_pdev_per_edge_clockwise_edge = 0;\n\n\t\t// resize the device memory structures\n\t\tresize_device_memory_block((void**)&new_pdev_per_edge_selection, pdev_per_edge_selection, new_number_of_edges*sizeof(float), m_number_of_edges*sizeof(float), clear);\n\t\tresize_device_memory_block((void**)&new_pdev_per_edge_point, pdev_per_edge_point, new_number_of_edges*sizeof(k3d::uint32_t), m_number_of_edges*sizeof(k3d::uint32_t), clear);\n\t\tresize_device_memory_block((void**)&new_pdev_per_edge_clockwise_edge, pdev_per_edge_clockwise_edge, new_number_of_edges*sizeof(k3d::uint32_t), m_number_of_edges*sizeof(k3d::uint32_t), clear);\n\n\t\t// update the member pointers and number of edges\n\t\tpdev_per_edge_selection = new_pdev_per_edge_selection;\n\t\tpdev_per_edge_point = new_pdev_per_edge_point;\n\t\tpdev_per_edge_clockwise_edge = new_pdev_per_edge_clockwise_edge;\n\n\t\tm_number_of_edges = new_number_of_edges;\n\t}\n}\n\n/**\n * Increase the size of the data structures corresponding to the loops\n */\nvoid cuda_device_polyhedra::resize_loops ( k3d::uint32_t new_number_of_loops, bool clear )\n{\n\tint new_loops_count = new_number_of_loops - m_number_of_loops;\n\n\tif ( new_loops_count != 0 )\n\t{\n\t\tk3d::uint32_t* new_pdev_per_loop_first_edge = 0;\n\t\tresize_device_memory_block((void**)&new_pdev_per_loop_first_edge, pdev_per_loop_first_edge, new_number_of_loops*sizeof(k3d::uint32_t), m_number_of_loops*sizeof(k3d::uint32_t), clear);\n\t\tpdev_per_loop_first_edge = new_pdev_per_loop_first_edge;\n\n\t\tm_number_of_loops = new_number_of_loops;\n\t}\n}\n\n/**\n * Increase the size of the data structures corresponding to the faces\n */\nvoid cuda_device_polyhedra::resize_faces ( k3d::uint32_t new_number_of_faces, bool clear )\n{\n\tint new_faces_count = new_number_of_faces - m_number_of_faces;\n\n\tif ( new_faces_count != 0 )\n\t{\n\t\tfloat* new_pdev_per_face_selection = 0;\n\t\tk3d::uint32_t* new_pdev_per_face_first_loops = 0;\n\t\tk3d::uint32_t* new_pdev_per_face_loop_count = 0;\n\n\t\t// resize the device memory structures\n\t\tresize_device_memory_block((void**)&new_pdev_per_face_selection, pdev_per_face_selection, new_number_of_faces*sizeof(float), m_number_of_faces*sizeof(float), clear);\n\t\tresize_device_memory_block((void**)&new_pdev_per_face_first_loops, pdev_per_face_first_loops, new_number_of_faces*sizeof(k3d::uint32_t), m_number_of_faces*sizeof(k3d::uint32_t), clear);\n\t\tresize_device_memory_block((void**)&new_pdev_per_face_loop_count, pdev_per_face_loop_count, new_number_of_faces*sizeof(k3d::uint32_t), m_number_of_faces*sizeof(k3d::uint32_t), clear);\n\n\t\t// update the member pointers and number of edges\n\t\tpdev_per_face_selection = new_pdev_per_face_selection;\n\t\tpdev_per_face_first_loops = new_pdev_per_face_first_loops;\n\t\tpdev_per_face_loop_count = new_pdev_per_face_loop_count;\n\n\t\tm_number_of_faces = new_number_of_faces;\n\t}\n}\n"
  },
  {
    "path": "modules/cuda/cuda_device_polyhedra.h",
    "content": "#ifndef MODULES_CUDA_CUDA_DEVICE_POLYHEDRA_H\n#define MODULES_CUDA_CUDA_DEVICE_POLYHEDRA_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n    \\author Evan Lezar (evanlezar@gmail.com)\n    \\date 14 July 2008\n*/\n\n#define ALL_MESH_INFO 0xFFFF\n#define MESH_POINTS 0x0001\n#define MESH_SELECTION 0x0002\n#define POLYHEDRA_ALL_POLYGONS 0x0004\n#define POLYHEDRA_ALL_FACES 0x0008\n#define POLYHEDRA_ALL_LOOPS 0x0010\n#define POLYHEDRA_ALL_EDGES 0x0020\n#define ALL_POLYHEDRA_INFO 0x003C\n\n#include <k3dsdk/mesh.h>\n#include \"cuda_entry_points.h\"\n\nclass cuda_device_polyhedra\n{\n    public:\n        /// Constructors\n    \tcuda_device_polyhedra ( );\n        cuda_device_polyhedra ( const k3d::mesh::polyhedra_t& host_polyhedra );\n\n        /// Destructor\n        ~cuda_device_polyhedra ();\n\n\t\tvoid set_polyhedra( const k3d::mesh::polyhedra_t& host_polyhedra );\n        void copy_to_device (  k3d::uint32_t what_to_copy = ALL_MESH_INFO  );\n        void copy_from_device ( const k3d::mesh::polyhedra_t& destination_polyhedra,  k3d::uint32_t what_to_copy = ALL_MESH_INFO );\n\n        void allocate_on_device ( k3d::uint32_t what_to_allocate = ALL_MESH_INFO );\n\n        void output_debug_info ();\n\n        k3d::uint32_t* get_per_edge_points_pointer();\n        k3d::uint32_t* get_per_edge_clockwise_edges_pointer();\n\n        k3d::uint32_t* get_per_loop_first_edges_pointer();\n\n        k3d::uint32_t* get_per_face_first_loops_pointer();\n        k3d::uint32_t* get_per_face_loop_counts_pointer();\n        float* get_per_face_selection_pointer();\n\n        float* get_per_edge_selection_pointer();\n\n        void resize_edges ( k3d::uint32_t new_number_of_edges, bool clear = false );\n        void resize_loops ( k3d::uint32_t new_number_of_loops, bool clear = false );\n        void resize_faces ( k3d::uint32_t new_number_of_faces, bool clear = false );\n\n    private:\n        /// a pointer to uint arrays allocated on the device\n        k3d::uint32_t* pdev_per_polygon_first_face;\n        k3d::uint32_t* pdev_per_polygon_face_count;\n\n        /// a pointer to a int array allocated on the device\n        int32_t* pdev_per_polygon_types;\n\n        /// the number of polyhedra\n        k3d::uint32_t m_number_of_polygons;\n\n\n        /// a pointer to uint arrays allocated on the device\n        k3d::uint32_t* pdev_per_face_first_loops;\n        k3d::uint32_t* pdev_per_face_loop_count;\n\n        /// a pointer to a float array on the device\n        float* pdev_per_face_selection;\n\n        /// the number of faces - ie.  The length of the above 3 arrays\n        k3d::uint32_t m_number_of_faces;\n\n        /// a pointer to a uint array allocated on the device\n        k3d::uint32_t* pdev_per_loop_first_edge;\n        /// the number of loops - ie.  The length of the above array\n        k3d::uint32_t m_number_of_loops;\n\n        /// a pointer to uint arrays allocated on the device\n        k3d::uint32_t* pdev_per_edge_point;\n        k3d::uint32_t* pdev_per_edge_clockwise_edge;\n        /// a pointer to a float array on the device\n        float* pdev_per_edge_selection;\n\n        /// the number of edges - ie.  The length of the above 3 arrays\n        k3d::uint32_t m_number_of_edges;\n\n        /// a pointer to the host version of the polyhedra_t\n        const k3d::mesh::polyhedra_t* m_p_input_polyhedra;\n};\n\n#endif // !MODULES_CUDA_CUDA_DEVICE_POLYHEDRA_H\n\n"
  },
  {
    "path": "modules/cuda/cuda_entry_points.cu",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n    \\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n// cuda includes\n#include <stdio.h>\n#include <vector_types.h>\n//include the kernels\n#include \"cuda_kernels.cu\"\n\n// define the externals\n#include \"cuda_entry_points.h\"\n\n#ifdef K3D_API_WIN32\n\n/// Retrieves a timestamp in seconds using the Win32 high performance counters\ninline double nanotime()\n{\n\tLARGE_INTEGER timestamp;\n\tLARGE_INTEGER frequency;\n\tif ( !(QueryPerformanceCounter(&timestamp) && QueryPerformanceFrequency(&frequency)) )\n\t{\n\t\treturn 0.0;\n\t}\n\n\treturn static_cast<double>(timestamp.QuadPart) / static_cast<double>(frequency.QuadPart);\n}\n\n#else // K3D_API_WIN32\n\n/// Retrieves a timestamp in seconds using gettimeofday() for portable timing\ninline double nanotime()\n{\n\ttimeval tv;\n\tgettimeofday(&tv, 0);\n\n\treturn tv.tv_sec + static_cast<double>(tv.tv_usec) / 1000000;\n}\n\n#endif // !K3D_API_WIN32\n\n\n/**\n * Initialize the timing info structure\n */\nvoid initTimingInfo(timingInfo_t* tInfo, int numberOfEntries)\n{\n\t(*tInfo).numEntries = numberOfEntries;\n\t(*tInfo).timings = (double*)malloc ( numberOfEntries*sizeof(double) );\n\t(*tInfo).labels = (char**)malloc ( numberOfEntries*sizeof(char*) );\n\tfor ( int i = 0 ; i < numberOfEntries ; i++ )\n\t{\n\t\t(*tInfo).labels[i] = (char*) malloc ( 33*sizeof(char) );\n\t}\n}\n\n/**\n * Set the label of a given timing_info entry\n */\ninline void setTimingInfoLabel(timingInfo_t* tInfo, int index, char* label)\n{\n\tsprintf((*tInfo).labels[index], \"%s\", label);\n}\n\n/**\n * Initialize the timing_info entry to the current time\n */\ninline void startTimingInfoTimer (timingInfo_t* tInfo, int index)\n{\n\t(*tInfo).timings[index] = nanotime();\n}\n/**\n * Set the timing value of a given timing_info entry to the elapsed time since it was started\n */\ninline void measureTimingInfoTimer(timingInfo_t* tInfo, int index)\n{\n\t(*tInfo).timings[index] = nanotime() - (*tInfo).timings[index];\n}\n\n/**\n * Integer division and rounding up\n */\nint iDivUp(int a, int b)\n{\n\t// if a is not divisible by b, return a/b + 1, else return a/b\n\treturn ((a % b) != 0) ? (a / b + 1) : (a / b);\n}\n\n/**\n * Get the last CUDA error and display it if required\n */\nextern \"C\" void checkLastCudaError ()\n{\n\tcudaThreadSynchronize();\n\tcudaError_t error = cudaGetLastError();\n\tif ( error != cudaSuccess )\n\t{\n\t\tprintf(\"CUDA ERROR: %s\\n\", cudaGetErrorString(error));\n\t}\n}\n\n/// entry point for the CUDA version of the BitmapAdd BitmapSubtract and BitmapMultiply plugin\nextern \"C\" void bitmap_arithmetic_kernel_entry(int operation, unsigned short* p_deviceImage, int width, int height, float value)\n{\n    // allocate the blocks and threads\n    dim3 threads_per_block(8, 8);\n    dim3 blocks_per_grid( iDivUp(width, 8), iDivUp(height,8));\n\n\tswitch ( operation )\n\t{\n    \tcase CUDA_BITMAP_ADD:\n    \t\t// execute the add\n    \t\tadd_kernel<<< blocks_per_grid, threads_per_block >>> ((ushort4*)p_deviceImage, width, height, value);\n    \t\tbreak;\n    \tcase CUDA_BITMAP_MULTIPLY:\n    \t\t// execute the multiply kernel\n    \t\tmultiply_kernel<<< blocks_per_grid, threads_per_block >>> ((ushort4*)p_deviceImage, width, height, value);\n    \t\tbreak;\n    \tcase CUDA_BITMAP_SUBTRACT:\n    \t\t// execute the add kernel with value negated\n    \t\tadd_kernel<<< blocks_per_grid, threads_per_block >>> ((ushort4*)p_deviceImage, width, height, -value);\n    \t\tbreak;\n        case CUDA_BITMAP_GAMMA:\n            // execute the gamma kernel\n            gamma_kernel<<< blocks_per_grid, threads_per_block >>> ((ushort4*)p_deviceImage, width, height, value);\n            break;\n        case CUDA_BITMAP_INVERT:\n            // excute the bitmap invert kernel\n            invert_kernel<<< blocks_per_grid, threads_per_block >>> ((ushort4*)p_deviceImage, width, height);\n            break;\n        case CUDA_BITMAP_MATTE_COLORDIFF:\n            matte_color_diff_kernel<<< blocks_per_grid, threads_per_block >>> ((ushort4*)p_deviceImage, width, height, value);\n            break;\n        case CUDA_BITMAP_MATTE_INVERT:\n            matte_invert_kernel<<< blocks_per_grid, threads_per_block >>> ((ushort4*)p_deviceImage, width, height);\n            break;\n    \tdefault:\n    \t\t// unknown operation\n    \t\t;\n\t}\n\n    // check if the kernel executed correctly\n    checkLastCudaError();\n    // Make sure this function blocks until the calculation is complete\n    cudaThreadSynchronize();\n}\n\nextern \"C\" void bitmap_color_monochrome_kernel_entry(unsigned short* p_deviceImage, int width, int height, float redWeight, float greenWeight, float blueWeight)\n{\n\t// allocate the blocks and threads\n    dim3 threads_per_block(8, 8);\n    dim3 blocks_per_grid( iDivUp(width, 8), iDivUp(height,8));\n\n\tcolor_monochrome_kernel<<< blocks_per_grid, threads_per_block >>> ((ushort4*)p_deviceImage, width, height, redWeight, greenWeight, blueWeight);\n\n    // check if the kernel executed correctly\n    checkLastCudaError();\n    cudaThreadSynchronize();\n\n}\n\nextern \"C\" void bitmap_threshold_kernel_entry(unsigned short* p_deviceImage, int width, int height, float redThreshold, float greenThreshold, float blueThreshold, float alphaThreshold)\n{\n    // allocate the blocks and threads\n    dim3 threads_per_block(8, 8);\n    dim3 blocks_per_grid( iDivUp(width, 8), iDivUp(height,8));\n\n    threshold_kernel<<< blocks_per_grid, threads_per_block >>> ((ushort4*)p_deviceImage, width, height, redThreshold, greenThreshold, blueThreshold, alphaThreshold);\n\n    // check if the kernel executed correctly\n    checkLastCudaError();\n    cudaThreadSynchronize();\n\n}\n\nextern \"C\" void copy_and_bind_texture_to_array( void** cudaArrayPointer, float* arrayData, int width, int height )\n{\n\t// alocate a cudaArray to store the transformation matrix\n\tcudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);\n\tcudaArray* cu_array;\n\tcudaMallocArray( &cu_array, &channelDesc, width, height );\n    cudaMemcpyToArray( cu_array, 0, 0, arrayData, width*height*sizeof(float), cudaMemcpyHostToDevice);\n\n\t// set texture parameters\n    transformTexture.addressMode[0] = cudaAddressModeClamp;\n    transformTexture.addressMode[1] = cudaAddressModeClamp;\n    transformTexture.filterMode = cudaFilterModePoint;\n    transformTexture.normalized = false;\n\n\t// Bind the array to the texture\n    cudaBindTextureToArray( transformTexture, cu_array, channelDesc);\n\n\t*cudaArrayPointer = (void*)cu_array;\n}\n\nextern \"C\" void free_CUDA_array ( void* cudaArrayPointer )\n{\n\tcudaFreeArray((cudaArray*)cudaArrayPointer);\n}\n\nextern \"C\" void apply_linear_transform_to_point_data ( float *device_points, float *T_matrix, int num_points )\n{\n\tdim3 threads_per_block(64, 1);\n    dim3 blocks_per_grid( iDivUp(num_points, 64), 1);\n\n\tlinear_transform_kernel <<< blocks_per_grid, threads_per_block >>> ((float4*)device_points, num_points);\n\n\t// check if the kernel executed correctly\n    checkLastCudaError();\n    cudaThreadSynchronize();\n}\n\nextern \"C\" void allocate_device_memory ( void** device_pointer, int size_in_bytes )\n{\n\tcudaMalloc(device_pointer, size_in_bytes);\n}\n\nextern \"C\" void set_device_memory ( void* device_pointer, int value, int size_in_bytes )\n{\n\tcudaMemset(device_pointer, value, size_in_bytes);\n}\n\nextern \"C\" void resize_device_memory_block ( void** new_device_pointer, void* current_device_pointer, int new_size_in_bytes, int old_size_in_bytes, char clear )\n{\n\tif ( new_size_in_bytes == old_size_in_bytes )\n\t{\n\t\t*new_device_pointer = current_device_pointer;\n\t}\n\telse\n\t{\n\t\tcudaMalloc(new_device_pointer, new_size_in_bytes);\n\t\tcudaThreadSynchronize();\n\n\t\tif ( !clear )\n\t\t{\n\t\t\tif ( new_size_in_bytes < old_size_in_bytes )\n\t\t\t{\n\t\t\t\tcudaMemcpy(*new_device_pointer, current_device_pointer, new_size_in_bytes, cudaMemcpyDeviceToDevice);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcudaMemset( *new_device_pointer, 0, new_size_in_bytes );\n\t\t\t\tcudaThreadSynchronize();\n\t\t\t\tcudaMemcpy(*new_device_pointer, current_device_pointer, old_size_in_bytes, cudaMemcpyDeviceToDevice);\n\t\t\t}\n\t\t\tcudaThreadSynchronize();\n\t\t}\n\t\tcudaFree ( current_device_pointer );\n\t}\n\n\tif ( clear )\n\t{\n\t\tcudaMemset( *new_device_pointer, 0, new_size_in_bytes );\n\t\tcudaThreadSynchronize();\n\t}\n\telse\n\t{\n\t\tcudaThreadSynchronize();\n\t}\n\n}\n\nextern \"C\" void copy_from_host_to_device ( void* device_pointer, const void* host_pointer, int size_in_bytes )\n{\n\tcudaMemcpy(device_pointer, host_pointer, size_in_bytes, cudaMemcpyHostToDevice);\n}\n\nextern \"C\" void copy_from_host_to_device_64_to_32_convert ( void* device_pointer, const void* host_pointer, int size_in_bytes )\n{\n    #define NUM_THREADS 64\n    int num_uints = size_in_bytes/sizeof(unsigned int);\n    uint2* pdev_uint_64;\n\n    allocate_device_memory((void**)&pdev_uint_64, size_in_bytes*2);\n    copy_from_host_to_device((void*)pdev_uint_64, (const void*)host_pointer, size_in_bytes*2);\n\n    dim3 threads_per_block(NUM_THREADS, 1);\n    dim3 blocks_per_grid( iDivUp(num_uints, NUM_THREADS), 1);\n\n    convert_uint_64_to_32_kernel <<< blocks_per_grid, threads_per_block >>> ( pdev_uint_64, (unsigned int*) device_pointer, num_uints);\n\n    checkLastCudaError();\n\n    cudaThreadSynchronize();\n    free_device_memory ( pdev_uint_64 );\n}\n\nextern \"C\" void copy_from_device_to_host ( void* host_pointer, const void* device_pointer, int size_in_bytes )\n{\n\tcudaMemcpy(host_pointer, device_pointer, size_in_bytes, cudaMemcpyDeviceToHost);\n}\n\nextern \"C\" void copy_from_device_to_host_32_to_64_convert ( void* host_pointer, const void* device_pointer, int size_in_bytes )\n{\n\t#define NUM_THREADS 64\n\tint num_uints = size_in_bytes/sizeof(unsigned int);\n\tuint2* pdev_uint_64;\n\n\tallocate_device_memory((void**)&pdev_uint_64, size_in_bytes*2);\n\n\tdim3 threads_per_block(NUM_THREADS, 1);\n\tdim3 blocks_per_grid( iDivUp(num_uints, NUM_THREADS), 1);\n\n\tconvert_uint_32_to_64_kernel <<< blocks_per_grid, threads_per_block >>> ( pdev_uint_64, (unsigned int*) device_pointer, num_uints);\n\n\tcheckLastCudaError();\n\n\tcopy_from_device_to_host(host_pointer, (const void*)pdev_uint_64, size_in_bytes*2);\n\n\tcudaThreadSynchronize();\n\tfree_device_memory ( pdev_uint_64 );\n}\n\nextern \"C\" void copy_from_device_to_device ( void* device_dest_pointer, const void* device_source_pointer, int size_in_bytes )\n{\n    cudaMemcpy(device_dest_pointer, device_source_pointer, size_in_bytes, cudaMemcpyDeviceToDevice);\n}\nextern \"C\" void free_device_memory ( void* device_pointer )\n{\n\tcudaFree(device_pointer);\n}\n\nextern \"C\" void allocate_pinned_host_memory ( void** pointer_on_host, int size_in_bytes )\n{\n\tcudaMallocHost(pointer_on_host, size_in_bytes);\n}\n\nextern \"C\" void free_pinned_host_memory ( void* pointer_on_host )\n{\n\tcudaFreeHost(pointer_on_host);\n}\n\nextern \"C\" void transform_points_device_mesh ( float * pdev_output_points_and_selection, int num_points )\n{\n\tdim3 threads_per_block(64, 1);\n\tdim3 blocks_per_grid( iDivUp(num_points, 64), 1);\n\n\tlinear_transform_kernel <<< blocks_per_grid, threads_per_block >>> ((float4*)(pdev_output_points_and_selection), num_points);\n\tcheckLastCudaError();\n}\n\nextern \"C\" void transform_points_synchronous ( double *InputPoints, double *PointSelection, double *OutputPoints, int num_points, timingInfo_t* tInfo )\n{\n\t#define SETUP 0\n\t#define CONVERT_PRE 1\n\t#define TO_DEVICE 2\n\t#define EXECUTE 3\n\t#define TO_HOST 4\n\t#define CONVERT_POST 5\n\t#define CLEANUP 6\n\n\t// initialize the timing info structure\n\tinitTimingInfo(tInfo, 7);\n\n    setTimingInfoLabel(tInfo, SETUP, \"SETUP\");\n\tsetTimingInfoLabel(tInfo, CONVERT_PRE, \"CONVERT_PRE\");\n\tsetTimingInfoLabel(tInfo, TO_DEVICE, \"TO_DEVICE\");\n\tsetTimingInfoLabel(tInfo, EXECUTE, \"EXECUTE\");\n\tsetTimingInfoLabel(tInfo, TO_HOST, \"TO_HOST\");\n\tsetTimingInfoLabel(tInfo, CONVERT_POST, \"CONVERT_POST\");\n\tsetTimingInfoLabel(tInfo, CLEANUP, \"CLEANUP\");\n\n\tstartTimingInfoTimer ( tInfo, SETUP );\n    float *device_points;\n\n\t// allocate the memory on the device - 16 bytes per point\n\tallocate_device_memory((void**)&device_points, num_points*sizeof(float)*4);\n\n\t// allocate pinned host memory to allow for asynchronous operations\n\tfloat *host_points_single_p;\n\tallocate_pinned_host_memory ((void**)&host_points_single_p, num_points*sizeof(float)*4);\n\n\tdim3 threads_per_block(64, 1);\n\tdim3 blocks_per_grid( iDivUp(num_points, 64), 1);\n\n\tmeasureTimingInfoTimer( tInfo, SETUP );\n\n\n\n    startTimingInfoTimer (tInfo, CONVERT_PRE);\n\tfor (int point = 0; point < num_points; ++point)\n\t{\n\t\tint float_index = (point)*4;\n\t\tint double_index = (point)*3;\n\t\thost_points_single_p[float_index] = (float)InputPoints[double_index];\n\t\thost_points_single_p[float_index+1] = (float)InputPoints[double_index+1];\n\t\thost_points_single_p[float_index+2] = (float)InputPoints[double_index+2];\n\t\thost_points_single_p[float_index+3] = (float)PointSelection[point];\n\t}\n\tmeasureTimingInfoTimer (tInfo, CONVERT_PRE);\n\n\n\tstartTimingInfoTimer (tInfo, TO_DEVICE);\n\tcudaMemcpy(device_points, host_points_single_p, num_points*16, cudaMemcpyHostToDevice);\n\tsynchronize_threads();\n\tmeasureTimingInfoTimer (tInfo, TO_DEVICE);\n\n\n\tstartTimingInfoTimer (tInfo, EXECUTE);\n\tlinear_transform_kernel <<< blocks_per_grid, threads_per_block >>> ((float4*)(device_points), num_points);\n\tcudaThreadSynchronize();\n\tmeasureTimingInfoTimer ( tInfo, EXECUTE );\n\n\tstartTimingInfoTimer ( tInfo, TO_HOST );\n\tcudaMemcpy(host_points_single_p, device_points, num_points*16, cudaMemcpyDeviceToHost);\n\tmeasureTimingInfoTimer ( tInfo, TO_HOST );\n\n\tstartTimingInfoTimer ( tInfo, CONVERT_POST );\n\tfor (int point = 0; point < num_points; ++point)\n\t{\n\t\tint float_index = (point)*4;\n\t\tint double_index = (point)*3;\n\t\tOutputPoints[double_index] = host_points_single_p[float_index];\n\t\tOutputPoints[double_index+1] = host_points_single_p[float_index+1];\n\t\tOutputPoints[double_index+2] = host_points_single_p[float_index+2];\n\t}\n\tmeasureTimingInfoTimer(tInfo, CONVERT_POST);\n\n\tstartTimingInfoTimer ( tInfo, CLEANUP );\n\tfree_device_memory(device_points);\n\tfree_pinned_host_memory ( host_points_single_p );\n\tmeasureTimingInfoTimer ( tInfo, CLEANUP );\n}\n\nextern \"C\" void transform_points_asynchronous ( double *InputPoints, double *PointSelection, double *OutputPoints, int num_points, timingInfo_t* tInfo )\n{\n\t#define SETUP 0\n\t#define STREAM_CREATE 1\n\t#define PHASE_1 2\n\t#define PHASE_2 3\n\t#define STREAM_DESTROY 4\n\t#define DEV_CLEANUP 5\n\n\t// initialize the timing info structure\n\tinitTimingInfo(tInfo, 6);\n\n    setTimingInfoLabel(tInfo, SETUP, \"SETUP\");\n\tsetTimingInfoLabel(tInfo, STREAM_CREATE, \"STREAM_CREATE\");\n\tsetTimingInfoLabel(tInfo, PHASE_1, \"CONVERT_TO_DEVICE_EXECUTE\");\n\tsetTimingInfoLabel(tInfo, PHASE_2, \"TO_HOST_CONVERT\");\n\tsetTimingInfoLabel(tInfo, STREAM_DESTROY, \"STREAM_DESTROY\");\n\tsetTimingInfoLabel(tInfo, DEV_CLEANUP, \"CLEANUP\");\n\n\n\n\tstartTimingInfoTimer ( tInfo, SETUP);\n\t// set the number of streams\n\tint nstreams = 4;\n\n    float *device_points;\n\t// allocate the memory on the device - 16 bytes per point\n\tallocate_device_memory((void**)&device_points, num_points*sizeof(float)*4);\n\n\t// allocate pinned host memory to allow for asynchronous operations\n\tfloat *host_points_single_p;\n\tallocate_pinned_host_memory ((void**)&host_points_single_p, num_points*sizeof(float)*4);\n\n\tint points_per_stream = num_points/nstreams;\n\n\tdim3 threads_per_block(32, 1);\n\tdim3 blocks_per_grid( iDivUp(points_per_stream, 32), 1);\n    measureTimingInfoTimer(tInfo, SETUP);\n\n\tstartTimingInfoTimer ( tInfo, STREAM_CREATE);\n\t// allocate and initialize an array of stream handles\n    cudaStream_t *streams = (cudaStream_t*) malloc(nstreams * sizeof(cudaStream_t));\n    for(int n = 0; n < nstreams; n++)\n    \tcudaStreamCreate(&(streams[n]));\n    measureTimingInfoTimer(tInfo, STREAM_CREATE);\n\n    startTimingInfoTimer ( tInfo, PHASE_1);\n\tfor ( int n = 0; n < nstreams; n++ )\n\t{\n\t\t// Convert a subset of the data to floats\n\t\tfor (int point = n*points_per_stream; point < (n+1)*points_per_stream; ++point)\n\t\t{\n\t\t\tint float_index = (point)*4;\n\t\t\tint double_index = (point)*3;\n\t\t\thost_points_single_p[float_index] = (float)InputPoints[double_index];\n\t\t\thost_points_single_p[float_index+1] = (float)InputPoints[double_index+1];\n\t\t\thost_points_single_p[float_index+2] = (float)InputPoints[double_index+2];\n\t\t\thost_points_single_p[float_index+3] = (float)PointSelection[point];\n\t\t}\n\n\t\t// for each stream copy the data to the device and execute the kernel\n\t\tcudaMemcpyAsync(device_points + n*points_per_stream*4, host_points_single_p + n*points_per_stream*4, points_per_stream*16, cudaMemcpyHostToDevice, streams[n]);\n\t\tlinear_transform_kernel <<< blocks_per_grid, threads_per_block, 0, streams[n] >>> ((float4*)(device_points + n*points_per_stream*4), points_per_stream);\n\t}\n    measureTimingInfoTimer(tInfo, PHASE_1);\n\n    startTimingInfoTimer ( tInfo, PHASE_2);\n\t// copy the data back from the device and convert\n\tfor ( int n = 0; n < nstreams; n++ )\n\t{\n\t\tcudaMemcpyAsync(host_points_single_p + n*points_per_stream*4, device_points + n*points_per_stream*4, points_per_stream*16, cudaMemcpyDeviceToHost, streams[n]);\n\t\t// need to synchronize the streams so that the data is available to copy to the output points\n\t\tcudaStreamSynchronize(streams[n]);\n\t\tfor (int point = n*points_per_stream; point < (n+1)*points_per_stream; ++point)\n\t\t{\n\t\t\tint float_index = (point)*4;\n\t\t\tint double_index = (point)*3;\n\t\t\tOutputPoints[double_index] = host_points_single_p[float_index];\n\t\t\tOutputPoints[double_index+1] = host_points_single_p[float_index+1];\n\t\t\tOutputPoints[double_index+2] = host_points_single_p[float_index+2];\n\t\t}\n\t}\n\tmeasureTimingInfoTimer(tInfo, PHASE_2);\n\n\tstartTimingInfoTimer ( tInfo, STREAM_DESTROY);\n\t// release resources\n\tfor(int n = 0; n < nstreams; n++)\n\t{\n    \tcudaStreamDestroy(streams[n]);\n\t}\n\tmeasureTimingInfoTimer(tInfo, STREAM_DESTROY);\n\n\tstartTimingInfoTimer ( tInfo, DEV_CLEANUP);\n\tfree_device_memory(device_points);\n\tfree_pinned_host_memory ( host_points_single_p );\n\tmeasureTimingInfoTimer(tInfo, DEV_CLEANUP);\n}\n\nextern \"C\" void subdivide_edges_split_point_calculator ( const unsigned int* pdev_first_midpoint,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned char* pdev_has_midpoint,\n                                                        float* pdev_points_and_selection,\n                                                        unsigned int num_input_points,\n                                                        unsigned int* pdev_edge_point_indices,\n                                                        unsigned int* pdev_clockwise_edge_indices,\n                                                        const float* pdev_edge_selection,\n                                                        const unsigned int* pdev_companions,\n                                                        const unsigned char* pdev_boundary_edges,\n                                                        const unsigned int* pdev_edge_faces,\n                                                        int num_split_points,\n                                                        int num_edges)\n{\n    // allocate device memory for the edge_indices\n    if ( num_edges > 0 & num_split_points > 0 & num_input_points > 0 )\n    {\n        int threads_x = 512 / num_split_points;\n\n        dim3 threads_per_block(threads_x, num_split_points);\n        dim3 blocks_per_grid( iDivUp(num_edges, threads_x), 1);\n        subdivide_edges_split_point_kernel<<< blocks_per_grid, threads_per_block >>> ( pdev_first_midpoint,\n                                                                                       pdev_has_midpoint,\n                                                                                       (float4*)pdev_points_and_selection,\n                                                                                       num_input_points,\n                                                                                       pdev_edge_point_indices,\n                                                                                       pdev_clockwise_edge_indices,\n                                                                                       pdev_edge_selection,\n                                                                                       pdev_companions,\n                                                                                       pdev_boundary_edges,\n                                                                                       pdev_edge_faces,\n                                                                                       num_split_points,\n                                                                                       num_edges);\n        checkLastCudaError();\n    }\n}\n\nextern \"C\" void subdivide_edges_update_indices_entry (unsigned int* pdev_input_edge_point_indices,\n                                                      unsigned int* pdev_input_clockwise_edge_point_indices,\n                                                      unsigned int num_host_edges,\n                                                      unsigned int* pdev_output_edge_point_indices,\n                                                      unsigned int* pdev_output_clockwise_edge_point_indices,\n                                                      unsigned int* pdev_edge_index_map,\n                                                      int num_edge_maps)\n{\n    int threads_x = 512;\n    dim3 threads_per_block(threads_x, 1);\n    dim3 blocks_per_grid( iDivUp(num_edge_maps, threads_x), 1);\n\n\n    subdivide_edges_update_edge_indices_kernel<<< blocks_per_grid, threads_per_block >>>\n                                              ( pdev_output_edge_point_indices,\n                                                pdev_output_clockwise_edge_point_indices,\n                                                pdev_input_edge_point_indices,\n                                                pdev_input_clockwise_edge_point_indices,\n                                                pdev_edge_index_map,\n                                                num_edge_maps );\n\n    checkLastCudaError();\n}\n\nextern \"C\" void subdivide_edges_update_loop_first_edges_entry (\n                                                        unsigned int* pdev_ouput_loop_first_edges,\n                                                        unsigned int num_loops,\n                                                        unsigned int* pdev_edge_index_map,\n                                                        int num_edge_maps\n                                                            )\n{\n    int threads_x = 64;\n    dim3 threads_per_block(threads_x, 1);\n    dim3 blocks_per_grid( iDivUp(num_loops, threads_x), 1);\n\n    subdivide_edges_update_loop_first_edges_kernel<<< blocks_per_grid, threads_per_block >>>\n                                              ( pdev_ouput_loop_first_edges,\n                                                num_loops,\n                                                pdev_edge_index_map );\n\n    checkLastCudaError();\n}\n\nextern \"C\" void subdivide_edges_split_edges_entry ( unsigned int* pdev_output_edge_point_indices,\n                                                    unsigned int* pdev_output_clockwise_edge_point_indices,\n                                                    unsigned int* pdev_input_clockwise_edge_point_indices,\n                                                    const float* pdev_edge_selection,\n                                                    unsigned int* pdev_edge_index_map,\n                                                    unsigned int* pdev_first_midpoint,\n                                                    unsigned char* pdev_has_midpoint,\n                                                    int num_split_points,\n                                                    unsigned int* pdev_companions,\n                                                    unsigned char* pdev_boundary_edges,\n                                                    const unsigned int num_edges,\n                                                    const unsigned int* pdev_edge_faces\n                                                    )\n{\n    int threads_x = 512 / num_split_points;\n    dim3 threads_per_block(threads_x, num_split_points);\n    dim3 blocks_per_grid( iDivUp(num_edges, threads_x), 1);\n\n    subdivide_edges_split_edges_kernel<<< blocks_per_grid, threads_per_block >>>\n                                                   (pdev_output_edge_point_indices,\n                                                    pdev_output_clockwise_edge_point_indices,\n                                                    pdev_input_clockwise_edge_point_indices,\n                                                    pdev_edge_selection,\n                                                    pdev_edge_index_map,\n                                                    pdev_first_midpoint,\n                                                    pdev_has_midpoint,\n                                                    num_split_points,\n                                                    pdev_companions,\n                                                    pdev_boundary_edges,\n                                                    num_edges,\n                                                    pdev_edge_faces\n                                                    );\n    checkLastCudaError();\n}\n\nextern \"C\" void copy_2D_from_host_to_device_with_padding ( void* device_pointer, const void* host_pointer, int device_pitch, int host_pitch, int width_in_bytes, int rows )\n{\n    cudaMemcpy2D(device_pointer, device_pitch, host_pointer, host_pitch, width_in_bytes, rows, cudaMemcpyHostToDevice);\n}\n\n/**\n * Call thread synchronize to ensure consistency\n */\nextern \"C\" void synchronize_threads ()\n{\n    cudaThreadSynchronize();\n}\n\nextern \"C\" void set_selection_value_entry ( float* points_and_selection, float selection_value, int num_points )\n{\n    int numThreads = 64;\n\n    dim3 threads_per_block(numThreads, 1);\n    dim3 blocks_per_grid( iDivUp(num_points, numThreads), 1);\n\n    set_selection_value_kernel <<< blocks_per_grid, threads_per_block >>> ( (float4*)points_and_selection, selection_value, num_points );\n\n    checkLastCudaError();\n\n    cudaThreadSynchronize();\n}\n\nextern \"C\" void find_companion_kernel_entry ( unsigned char* pdev_boundary_edges,\n\t\t\t\t\t\t\t\t\t\t\t  unsigned int* pdev_adjacent_edge_indices,\n\t\t\t\t\t\t\t\t\t\t\t  const int num_edges,\n\t\t\t\t\t\t\t\t\t\t\t  const unsigned int* pdev_edge_point_indices,\n\t\t\t\t\t\t\t\t\t\t\t  const unsigned int* pdev_clockwise_edges_point_indices,\n\t\t\t\t\t\t\t\t\t\t\t  const unsigned int* pdev_first_edges,\n\t\t\t\t\t\t\t\t\t\t\t  const unsigned int* pdev_valences,\n\t\t\t\t\t\t\t\t\t\t\t  const unsigned int* pdev_point_edges )\n{\n\t#define NUM_THREADS 64\n\n\tdim3 threads_per_block(NUM_THREADS, 1);\n\tdim3 blocks_per_grid( iDivUp(num_edges, NUM_THREADS), 1);\n\n\t// initialize the values for the boundary edges to true and the adjacent edge list to zeros\n\tcudaMemset(pdev_boundary_edges, 1, num_edges*sizeof(unsigned char));\n\tcudaMemset(pdev_adjacent_edge_indices, 0, num_edges*sizeof(unsigned int));\n\tcudaThreadSynchronize();\n\n\tfind_companion_kernel <<< blocks_per_grid, threads_per_block >>> ( pdev_boundary_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   pdev_adjacent_edge_indices,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   num_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   pdev_edge_point_indices,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   pdev_clockwise_edges_point_indices,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   pdev_first_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   pdev_valences,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   pdev_point_edges );\n\n\tcheckLastCudaError();\n\n\tcudaThreadSynchronize();\n\n\n}\n\nextern \"C\" int create_vertex_valence_lookup_kernel_entry (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_valence,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_edge_point_indices,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tint num_edges\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n{\n\tint host_valence_size = 0;\n\tint* pdev_valence_size;\n\tallocate_device_memory((void**)&pdev_valence_size, sizeof(int));\n\n\t// intialize the valence data on the device - set to zero\n\tcudaMemset((void*)pdev_valence, 0, num_edges*2*sizeof(unsigned int));\n\n\t// the following runs serially\n\n\tdim3 threads_per_block(1, 1);\n\tdim3 blocks_per_grid(1, 1);\n\n\tcudaThreadSynchronize();\n\tcreate_vertex_valence_lookup_kernel<<< blocks_per_grid, threads_per_block >>> ( pdev_valence, pdev_edge_point_indices, pdev_valence_size, num_edges );\n\tcudaThreadSynchronize();\n\tcheckLastCudaError();\n\n\tcopy_from_device_to_host((void*)&host_valence_size, (const void*)pdev_valence_size, sizeof(int));\n\n\n\tfree_device_memory((void*)pdev_valence_size);\n\n\treturn host_valence_size;\n}\n\nextern \"C\" void calculate_first_edge_entry ( unsigned int* pdev_first_edge, const unsigned int* pdev_valences, int num_points )\n{\n\t// Serial execution\n\tint numThreads = 1;\n\tdim3 threads_per_block(numThreads, 1);\n\tdim3 blocks_per_grid( 1, 1);\n\n\tcalculate_first_edges_kernel<<< blocks_per_grid, threads_per_block >>> ( pdev_first_edge, pdev_valences, num_points );\n\tcheckLastCudaError();\n\n}\n\nextern \"C\" void calculate_point_edges_entry (\n\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_point_edges,\n\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_found_edges,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_edge_point_indices,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_first_edges,\n\t\t\t\t\t\t\t\t\t\t\tint num_edges,\n\t\t\t\t\t\t\t\t\t\t\tint num_points )\n{\n\t// initialize the point edges\n\tcudaMemset((void*)pdev_point_edges, 0, num_edges*sizeof(unsigned int));\n\tcudaMemset((void*)pdev_found_edges, 0, num_points*sizeof(unsigned int));\n\t// runs serially\n\tdim3 threads_per_block(1, 1);\n\tdim3 blocks_per_grid(1, 1);\n\tcudaThreadSynchronize();\n\tcalculate_point_edges_kernel<<<blocks_per_grid, threads_per_block>>> (pdev_point_edges, pdev_found_edges, pdev_edge_point_indices, pdev_first_edges, num_edges);\n\tcheckLastCudaError();\n}\n\nextern \"C\" void edge_index_calculator_entry (\n\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_first_midpoint,\n\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned char* pdev_has_midpoint,\n\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_index_map,\n\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_edge_faces,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_face_first_loops,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_face_loop_counts,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_loop_first_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_clockwise_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst float* pdev_edge_selection,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_companions,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned char* pdev_boundary_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\tint split_point_count,\n\t\t\t\t\t\t\t\t\t\t\t\t\tint num_faces,\n\t\t\t\t\t\t\t\t\t\t\t\t\tint first_new_point_index,\n\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* new_point_count,\n\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* new_edge_count\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n{\n\tdim3 threads_per_block(64, 1);\n\tdim3 blocks_per_grid( iDivUp(num_faces, 64), 1);\n\n\t// Get the face for each edge\n\tface_per_edge_kernel <<< blocks_per_grid, threads_per_block >>> (\n\t\t\t\t\t\t\t\t\t\tpdev_face_first_loops,\n\t\t\t\t\t\t\t\t\t\tnum_faces,\n\t\t\t\t\t\t\t\t\t\tpdev_face_loop_counts,\n\t\t\t\t\t\t\t\t\t\tpdev_loop_first_edges,\n\t\t\t\t\t\t\t\t\t\tpdev_clockwise_edges,\n\t\t\t\t\t\t\t\t\t\tpdev_edge_faces);\n\tcheckLastCudaError();\n\tcudaThreadSynchronize();\n\t\n\t// Allocate an array to store the per-face edge and new split point count\n\tunsigned int* face_edge_counts;\n\tallocate_device_memory((void**)&face_edge_counts, num_faces * sizeof(unsigned int));\n\tunsigned int* face_split_point_counts;\n\tallocate_device_memory((void**)&face_split_point_counts, num_faces * sizeof(unsigned int));\n\n\t// count edges and new split points per face\n\tsubdivide_edges_count_components_per_face <<< blocks_per_grid, threads_per_block >>> (\n\t\t\t\t\t\t\t\t\t\tpdev_face_first_loops,\n\t\t\t\t\t\t\t\t\t\tnum_faces,\n\t\t\t\t\t\t\t\t\t\tpdev_face_loop_counts,\n\t\t\t\t\t\t\t\t\t\tpdev_loop_first_edges,\n\t\t\t\t\t\t\t\t\t\tpdev_clockwise_edges,\n\t\t\t\t\t\t\t\t\t\tpdev_edge_selection,\n\t\t\t\t\t\t\t\t\t\tpdev_companions,\n\t\t\t\t\t\t\t\t\t\tpdev_boundary_edges,\n\t\t\t\t\t\t\t\t\t\tsplit_point_count,\n\t\t\t\t\t\t\t\t\t\tpdev_edge_faces,\n\t\t\t\t\t\t\t\t\t\tface_edge_counts,\n\t\t\t\t\t\t\t\t\t\tface_split_point_counts\n\t\t\t\t\t\t\t\t\t\t );\n\tcudaThreadSynchronize();\n\t\n\t// Replace face_edge_counts with its cumulative sum\n\tunsigned int* temp_e;\n\tallocate_device_memory((void**)&temp_e, num_faces * sizeof(unsigned int));\n\tunsigned int* temp_p;\n\tallocate_device_memory((void**)&temp_p, num_faces * sizeof(unsigned int));\n\tfor(int step_size = 1; step_size < num_faces; step_size *= 2)\n\t{\n\t\tunsigned int* temp2_e = face_edge_counts;\n\t\tface_edge_counts = temp_e;\n\t\ttemp_e = temp2_e;\n\t\tcumulative_sum_step<<< blocks_per_grid, threads_per_block >>>(temp_e, face_edge_counts, num_faces, step_size);\n\t\tcheckLastCudaError();\n\t\tunsigned int* temp2_p = face_split_point_counts;\n\t\tface_split_point_counts = temp_p;\n\t\ttemp_p = temp2_p;\n\t\tcumulative_sum_step<<< blocks_per_grid, threads_per_block >>>(temp_p, face_split_point_counts, num_faces, step_size);\n\t\tcheckLastCudaError();\n\t\tcudaThreadSynchronize();\n\t}\n\t\n\t// Calculate the new indices for the split points and the edges\n\tsubdivide_edges_edge_index_calculator_kernel <<< blocks_per_grid, threads_per_block >>> (\n\t\t\t\t\t\t\t\t\t\tpdev_first_midpoint,\n\t\t\t\t\t\t\t\t\t\tpdev_has_midpoint,\n\t\t\t\t\t\t\t\t\t\tpdev_index_map,\n\t\t\t\t\t\t\t\t\t\tpdev_face_first_loops,\n\t\t\t\t\t\t\t\t\t\tnum_faces,\n\t\t\t\t\t\t\t\t\t\tpdev_face_loop_counts,\n\t\t\t\t\t\t\t\t\t\tpdev_loop_first_edges,\n\t\t\t\t\t\t\t\t\t\tpdev_clockwise_edges,\n\t\t\t\t\t\t\t\t\t\tpdev_edge_selection,\n\t\t\t\t\t\t\t\t\t\tpdev_companions,\n\t\t\t\t\t\t\t\t\t\tpdev_boundary_edges,\n\t\t\t\t\t\t\t\t\t\tpdev_edge_faces,\n\t\t\t\t\t\t\t\t\t\tface_edge_counts,\n\t\t\t\t\t\t\t\t\t\tface_split_point_counts,\n\t\t\t\t\t\t\t\t\t\tsplit_point_count,\n\t\t\t\t\t\t\t\t\t\tfirst_new_point_index\n\t\t\t\t\t\t\t\t\t\t );\n\tcheckLastCudaError();\n\n\tcudaThreadSynchronize();\n\t\n\tcopy_from_device_to_host((void*) new_point_count, (void*) &(face_split_point_counts[num_faces - 1]), sizeof(unsigned int));\n\tcopy_from_device_to_host((void*) new_edge_count, (void*) &(face_edge_counts[num_faces - 1]), sizeof(unsigned int));\n\t\t\t\n\tfree_device_memory(temp_e);\n\tfree_device_memory(temp_p);\n\tfree_device_memory(face_edge_counts);\n\tfree_device_memory(face_split_point_counts);\n}\n\n/**\n * entry point for setting up a polygrid on the device\n */\nextern \"C\" void create_grid_structure_kernel_entry (\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_face_first_loops,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_face_loop_count,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_loop_first_edge,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_edge_point,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_clockwise_edge,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int rows,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int columns)\n{\n\tdim3 threads_per_block(8, 8);\n\n\tdim3 blocks_per_grid(iDivUp(rows, 8), iDivUp(columns, 8));\n\n\tcreate_grid_structure_kernel<<< blocks_per_grid, threads_per_block >>> (\n\t\t\t\t\t\t\t\t\t\t\t\tpdev_face_first_loops,\n\t\t\t\t\t\t\t\t\t\t\t\tpdev_face_loop_count,\n\t\t\t\t\t\t\t\t\t\t\t\tpdev_loop_first_edge,\n\t\t\t\t\t\t\t\t\t\t\t\t(uint4*) pdev_edge_point,\n\t\t\t\t\t\t\t\t\t\t\t\t(uint4*) pdev_clockwise_edge,\n\t\t\t\t\t\t\t\t\t\t\t\trows,\n\t\t\t\t\t\t\t\t\t\t\t\tcolumns );\n\tcheckLastCudaError();\n\n}\n\n/**\n * Entry point for calculating polyGrid point positions\n */\nextern \"C\" void calculate_grid_points_kernel_entry (\n\t\t\t\t\t\t\t\t\t\t\t\tfloat* pdev_point_and_selection,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat* phost_x,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat* phost_y,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int rows,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int columns\n\t\t\t\t\t\t\t\t\t\t\t\t)\n{\n\tdim3 threads_per_block(8, 8);\n\n\tdim3 blocks_per_grid(iDivUp(rows, 8), iDivUp(columns, 8));\n\n\tfloat3 x;\n\tx.x = phost_x[0];\n\tx.y = phost_x[1];\n\tx.z = phost_x[2];\n\tfloat3 y;\n\ty.x = phost_y[0];\n\ty.y = phost_y[1];\n\ty.z = phost_y[2];\n\n\tcalculate_grid_points_kernel <<< blocks_per_grid, threads_per_block >>> (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(float4*) pdev_point_and_selection,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tx,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trows,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumns\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\tcheckLastCudaError();\n\n}\n\n"
  },
  {
    "path": "modules/cuda/cuda_entry_points.h",
    "content": "#ifndef MODULES_CUDA_CUDA_ENTRY_POINTS_H\n#define MODULES_CUDA_CUDA_ENTRY_POINTS_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include <k3d-platform-config.h>\n\n#if defined K3D_API_WIN32\n\t#include <k3dsdk/win32.h>\n\t#define K3D_CUDA_DECLSPEC __declspec(dllexport)\n#else\n\t#include <sys/time.h>\n\t#define K3D_CUDA_DECLSPEC\n#endif // !K3D_API_WIN32\n\n// define the types of bitmap kernels supported\n#define CUDA_BITMAP_ADD 0x00\n#define CUDA_BITMAP_MULTIPLY 0x01\n#define CUDA_BITMAP_SUBTRACT 0x02\n#define CUDA_BITMAP_COLOR_MONOCHROME 0x03\n#define CUDA_BITMAP_GAMMA 0x04\n#define CUDA_BITMAP_INVERT 0x05\n#define CUDA_BITMAP_MATTE_COLORDIFF 0x06\n#define CUDA_BITMAP_MATTE_INVERT 0x07\n\n// define the profiling strings\n#define PROFILE_STRING_HOST_TO_DEVICE \"Copy from Host to Device\"\n#define PROFILE_STRING_EXECUTE_KERNEL \"Execute Kernel\"\n#define PROFILE_STRING_DEVICE_TO_HOST \"Copy from Device to Host\"\n\n/**\n * a struct to pass timing info back from external C functions\n */\ntypedef struct\n{\n\tint numEntries;\n\tdouble *timings;\n\tchar **labels;\n} timingInfo_t;\n\n// forward declaration of the entry functions\n\nextern \"C\" K3D_CUDA_DECLSPEC void checkLastCudaError ();\nextern \"C\" K3D_CUDA_DECLSPEC void bitmap_arithmetic_kernel_entry(int operation, unsigned short* p_deviceImage, int width, int height, float value);\nextern \"C\" K3D_CUDA_DECLSPEC void bitmap_color_monochrome_kernel_entry(unsigned short* p_deviceImage, int width, int height, float redWeight, float greenWeight, float blueWeight);\nextern \"C\" K3D_CUDA_DECLSPEC void bitmap_threshold_kernel_entry(unsigned short* p_deviceImage, int width, int height, float redThreshold, float greenThreshold, float blueThreshold, float alphaThreshold);\n\nextern \"C\" K3D_CUDA_DECLSPEC void apply_linear_transform_to_point_data ( float *device_points, float *device_matrix, int num_points );\n\nextern \"C\" K3D_CUDA_DECLSPEC void allocate_device_memory ( void** device_pointer, int size_in_bytes );\nextern \"C\" K3D_CUDA_DECLSPEC void set_device_memory ( void* device_pointer, int value, int size_in_bytes );\nextern \"C\" K3D_CUDA_DECLSPEC void resize_device_memory_block ( void** new_device_pointer, void* current_device_pointer, int new_size_in_bytes, int old_size_in_bytes, char clear );\nextern \"C\" K3D_CUDA_DECLSPEC void copy_from_host_to_device ( void* device_pointer, const void* host_pointer, int size_in_bytes );\nextern \"C\" K3D_CUDA_DECLSPEC void copy_from_host_to_device_64_to_32_convert ( void* device_pointer, const void* host_pointer, int size_in_bytes );\n\nextern \"C\" K3D_CUDA_DECLSPEC void copy_from_device_to_host ( void* host_pointer, const void* device_pointer, int size_in_bytes );\nextern \"C\" K3D_CUDA_DECLSPEC void copy_from_device_to_host_32_to_64_convert ( void* host_pointer, const void* device_pointer, int size_in_bytes );\n\nextern \"C\" K3D_CUDA_DECLSPEC void copy_from_device_to_device ( void* device_dest_pointer, const void* device_source_pointer, int size_in_bytes );\n\nextern \"C\" K3D_CUDA_DECLSPEC void free_device_memory ( void* device_pointer );\nextern \"C\" K3D_CUDA_DECLSPEC void allocate_pinned_host_memory ( void** pointer_on_host, int size_in_bytes );\nextern \"C\" K3D_CUDA_DECLSPEC void free_pinned_host_memory ( void* pointer_on_host );\n\n\nextern \"C\" K3D_CUDA_DECLSPEC void copy_and_bind_texture_to_array( void** cudaArrayPointer, float* arrayData, int width, int height );\nextern \"C\" K3D_CUDA_DECLSPEC void free_CUDA_array ( void* cudaArrayPointer );\n\nextern \"C\" K3D_CUDA_DECLSPEC void transform_points_device_mesh ( float * pdev_output_points_and_selection, int num_points );\nextern \"C\" K3D_CUDA_DECLSPEC void transform_points_synchronous ( double *InputPoints, double *PointSelection, double *OutputPoints, int num_points, timingInfo_t* tInfo );\nextern \"C\" K3D_CUDA_DECLSPEC void transform_points_asynchronous ( double *InputPoints, double *PointSelection, double *OutputPoints, int num_points, timingInfo_t* tInfo );\n\nextern \"C\" K3D_CUDA_DECLSPEC void subdivide_edges_split_point_calculator (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_first_midpoint,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned char* pdev_has_midpoint,\n\t\t                                                        float* pdev_points_and_selection,\n\t\t                                                        unsigned int num_input_points,\n\t\t                                                        unsigned int* pdev_edge_point_indices,\n\t\t                                                        unsigned int* pdev_clockwise_edge_indices,\n\t\t                                                        const float* pdev_edge_selection,\n\t\t                                                        const unsigned int* pdev_companions,\n\t\t                                                        const unsigned char* pdev_boundary_edges,\n\t\t                                                        const unsigned int* pdev_edge_faces,\n\t\t                                                        int num_split_points,\n\t\t                                                        int num_edges\n                                                            );\n\nextern \"C\" K3D_CUDA_DECLSPEC void subdivide_edges_update_indices_entry (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_input_edge_point_indices,\n\t\t                                                      unsigned int* pdev_input_clockwise_edge_point_indices,\n\t\t                                                      unsigned int num_host_edges,\n\t\t                                                      unsigned int* pdev_output_edge_point_indices,\n\t\t                                                      unsigned int* pdev_output_clockwise_edge_point_indices,\n\t\t                                                      unsigned int* pdev_edge_index_map,\n\t\t                                                      int num_edge_maps);\n\nextern \"C\" K3D_CUDA_DECLSPEC void subdivide_edges_update_loop_first_edges_entry (\n                                                        unsigned int* pdev_ouput_loop_first_edges,\n                                                        unsigned int num_loops,\n                                                        unsigned int* pdev_edge_index_map,\n                                                        int num_edge_maps\n                                                            );\nextern \"C\" K3D_CUDA_DECLSPEC void subdivide_edges_split_edges_entry (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_output_edge_point_indices,\n\t\t                                                    unsigned int* pdev_output_clockwise_edge_point_indices,\n\t\t                                                    unsigned int* pdev_input_clockwise_edge_point_indices,\n\t\t                                                    const float* pdev_edge_selection,\n\t\t                                                    unsigned int* pdev_edge_index_map,\n\t\t                                                    unsigned int* pdev_first_midpoint,\n\t\t                                                    unsigned char* pdev_has_midpoint,\n\t\t                                                    int num_split_points,\n\t\t                                                    unsigned int* pdev_companions,\n\t\t                                                    unsigned char* pdev_boundary_edges,\n\t\t                                                    const unsigned int num_edges,\n\t\t                                                    const unsigned int* pdev_edge_faces\n                                                        );\n\nextern \"C\" K3D_CUDA_DECLSPEC void copy_2D_from_host_to_device_with_padding ( void* device_pointer, const void* host_pointer, int device_pitch, int host_pitch, int width_in_bytes, int rows );\n\nextern \"C\" K3D_CUDA_DECLSPEC void synchronize_threads ();\n\nextern \"C\" K3D_CUDA_DECLSPEC void set_selection_value_entry ( float* points_and_selection, float selection_value, int num_points );\n\nextern \"C\" K3D_CUDA_DECLSPEC void find_companion_kernel_entry ( unsigned char* pdev_boundary_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_adjacent_edge_indices,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    const int num_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    const unsigned int* pdev_edge_point_indices,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    const unsigned int* pdev_clockwise_edges_point_indices,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    const unsigned int* pdev_first_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    const unsigned int* pdev_valences,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    const unsigned int* pdev_point_edges\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    );\n\nextern \"C\" K3D_CUDA_DECLSPEC int create_vertex_valence_lookup_kernel_entry (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_valence,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_edge_point_indices,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tint num_edges\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\nextern \"C\" K3D_CUDA_DECLSPEC void calculate_first_edge_entry ( unsigned int* pdev_first_edge, const unsigned int* pdev_valences, int num_points );\n\nextern \"C\" K3D_CUDA_DECLSPEC void calculate_point_edges_entry (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_point_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_found_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* edge_point_indices,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_first_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tint num_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tint num_points);\n\nextern \"C\" K3D_CUDA_DECLSPEC void edge_index_calculator_entry (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_first_midpoint,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned char* pdev_has_midpoint,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_index_map,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_edge_faces,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_face_first_loops,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_face_loop_counts,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_loop_first_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_clockwise_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst float* pdev_edge_selection,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* pdev_companions,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned char* pdev_boundary_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tint split_point_count,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tint num_faces,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tint first_new_point_index,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* new_point_count,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* new_edge_count\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\nextern \"C\" K3D_CUDA_DECLSPEC void create_grid_structure_kernel_entry (\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_face_first_loops,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_face_loop_count,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_loop_first_edge,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_edge_point,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* pdev_clockwise_edge,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int rows,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int columns);\n\nextern \"C\" K3D_CUDA_DECLSPEC void calculate_grid_points_kernel_entry (\n\t\t\t\t\t\t\t\t\t\t\t\tfloat* pdev_point_and_selection,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat* phost_x,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat* phost_y,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int rows,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int columns\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\n#endif // !MODULES_CUDA_CUDA_ENTRY_POINTS_H\n"
  },
  {
    "path": "modules/cuda/cuda_kernels.cu",
    "content": "#ifndef _CUDA_KERNELS_H_\n#define _CUDA_KERNELS_H_\n\n#ifdef __DEVICE_EMULATION__\n#include <stdio.h>\n#endif\n\n// declare the texture reference for Matrix multiplication\ntexture<float, 2> transformTexture;\n\n// convert a half-float to a single precision float\n__device__ float halfToFloat (unsigned short halfIn)\n{\n\tint s = (halfIn >> 15) & 0x00000001;\n    int e = (halfIn >> 10) & 0x0000001f;\n    int m =  halfIn        & 0x000003ff;\n\n\tint val = 0;\n\tint done = 0;\n\n    if (e == 0)\n    {\n\t\tif (m == 0)\n\t\t{\n\t    \t//\n\t    \t// Plus or minus zero\n\t    \t//\n\t\t\tval = s << 31;\n\t\t\tdone = 1;\n\t\t}\n\t\telse\n\t\t{\n\t    \t//\n\t    \t// Denormalized number -- renormalize it\n\t    \t//\n\n\t    \twhile (!(m & 0x00000400))\n\t    \t{\n\t\t\t\tm <<= 1;\n\t\t\t\te -=  1;\n\t    \t}\n\n\t    \te += 1;\n\t    \tm &= ~0x00000400;\n\t\t}\n    }\n    else if (e == 31)\n    {\n\t\tif (m == 0)\n\t\t{\n\t    \t//\n\t    \t// Positive or negative infinity\n\t    \t//\n\n\t    \tval = (s << 31) | 0x7f800000;\n\t    \tdone = 1;\n\t\t}\n\t\telse\n\t\t{\n\t    \t//\n\t    \t// Nan -- preserve sign and significand bits\n\t    \t//\n\n\t    \tval = (s << 31) | 0x7f800000 | (m << 13);\n\t    \tdone = 1;\n\t\t}\n    }\n\n    //\n    // Normalized number\n    //\n\tif ( !done )\n\t{\n\t\te = e + (127 - 15);\n    \tm = m << 13;\n\n    \t//\n    \t// Assemble s, e and m.\n    \t//\n\t\tval = (s << 31) | (e << 23) | m;\n\t}\n\n\treturn __int_as_float (val);\n\n}\n\n// convert a single precision float to a half-float\n__device__ unsigned short floatToHalf( float floatIn )\n{\n    //\n    // Our floating point number, f, is represented by the bit\n    // pattern in integer i.  Disassemble that bit pattern into\n    // the sign, s, the exponent, e, and the significand, m.\n    // Shift s into the position where it will go in in the\n    // resulting half number.\n    // Adjust e, accounting for the different exponent bias\n    // of float and half (127 versus 15).\n    //\n\n\tint floatBits = __float_as_int( floatIn );\n\n    int s =  ((floatBits >> 16) & 0x00008000);\n    int e = ((floatBits >> 23) & 0x000000ff) - (127 - 15);\n    int m =   floatBits        & 0x007fffff;\n    //\n    // Now reassemble s, e and m into a half:\n    //\n\n    if (e <= 0)\n    {\n\t\tif (e < -10)\n\t\t{\n\t    \t//\n\t    \t// E is less than -10.  The absolute value of f is\n\t    \t// less than HALF_MIN (f may be a small normalized\n\t    \t// float, a denormalized float or a zero).\n\t    \t//\n\t    \t// We convert f to a half zero.\n\t    \t//\n\n\t    \treturn 0;\n\t\t}\n\n\t\t//\n\t\t// E is between -10 and 0.  F is a normalized float,\n\t\t// whose magnitude is less than HALF_NRM_MIN.\n\t\t//\n\t\t// We convert f to a denormalized half.\n\t\t//\n\n\t\tm = (m | 0x00800000) >> (1 - e);\n\n\t\t//\n\t\t// Round to nearest, round \"0.5\" up.\n\t\t//\n\t\t// Rounding may cause the significand to overflow and make\n\t\t// our number normalized.  Because of the way a half's bits\n\t\t// are laid out, we don't have to treat this case separately;\n\t\t// the code below will handle it correctly.\n\t\t//\n\n\t\tif (m &  0x00001000)\n\t    \tm += 0x00002000;\n\n\t\t//\n\t\t// Assemble the half from s, e (zero) and m.\n\t\t//\n\t\treturn s | (m >> 13);\n    }\n    else if (e == 0xff - (127 - 15))\n    {\n\t\tif (m == 0)\n\t\t{\n\t    \t//\n\t    \t// F is an infinity; convert f to a half\n\t    \t// infinity with the same sign as f.\n\t    \t//\n\t\t\treturn s | 0x7c00;\n\t\t}\n\t\telse\n\t\t{\n\t    \t//\n\t    \t// F is a NAN; produce a half NAN that preserves\n\t    \t// the sign bit and the 10 leftmost bits of the\n\t    \t// significand of f.\n\t    \t//\n\t\t\treturn s | 0x7c00 | (m >> 13);\n\t\t}\n    }\n    else\n    {\n\t\t//\n\t\t// E is greater than zero.  F is a normalized float.\n\t\t// We try to convert f to a normalized half.\n\t\t//\n\n\t\t//\n\t\t// Round to nearest, round \"0.5\" up\n\t\t//\n\n\t\tif (m &  0x00001000)\n\t\t{\n\t    \tm += 0x00002000;\n\n\t    \tif (m & 0x00800000)\n\t    \t{\n\t\t\t\tm =  0;\t\t// overflow in significand,\n\t\t\t\te += 1;\t\t// adjust exponent\n\t    \t}\n\t\t}\n\n\t\t//\n\t\t// Handle exponent overflow\n\t\t//\n\n\t\tif (e > 30)\n\t\t{\n\t\t\treturn s | 0x7c00;\t// if this returns, the half becomes an\n\t    \t // infinity with the same sign as f.\n\t\t}\n\n\t\t//\n\t\t// Assemble the half from s, e and m.\n\t\t//\n\t\treturn s | (e << 10) | (m >> 13);\n    }\n}\n\n__global__ void add_kernel (ushort4 *image_RGBA, int width, int height, float value)\n{\n\tconst int ix = blockDim.x * blockIdx.x + threadIdx.x;\n    const int iy = blockDim.y * blockIdx.y + threadIdx.y;\n\n    if(ix < width && iy < height)\n    {\n        // the first, second, third, and fourth fields can be accessed using x, y, z, and w\n        const int idx = width * iy + ix;\n\n        float4 pixelFloat;\n\n        pixelFloat.x = halfToFloat((unsigned short)image_RGBA[idx].x) + value;\n        pixelFloat.y = halfToFloat((unsigned short)image_RGBA[idx].y) + value;\n        pixelFloat.z = halfToFloat((unsigned short)image_RGBA[idx].z) + value;\n\n        image_RGBA[idx].x = floatToHalf(pixelFloat.x);\n        image_RGBA[idx].y = floatToHalf(pixelFloat.y);\n        image_RGBA[idx].z = floatToHalf(pixelFloat.z);\n    }\n\t__syncthreads();\n}\n\n__global__ void multiply_kernel (ushort4 *image_RGBA, int width, int height, float value)\n{\n\tconst int ix = blockDim.x * blockIdx.x + threadIdx.x;\n    const int iy = blockDim.y * blockIdx.y + threadIdx.y;\n\n    if(ix < width && iy < height)\n    {\n        // the first, second, third, and fourth fields can be accessed using x, y, z, and w\n        const int idx = width * iy + ix;\n\n        float4 pixelFloat;\n\n        pixelFloat.x = halfToFloat((unsigned short)image_RGBA[idx].x) * value;\n        pixelFloat.y = halfToFloat((unsigned short)image_RGBA[idx].y) * value;\n        pixelFloat.z = halfToFloat((unsigned short)image_RGBA[idx].z) * value;\n\n        image_RGBA[idx].x = floatToHalf(pixelFloat.x);\n        image_RGBA[idx].y = floatToHalf(pixelFloat.y);\n        image_RGBA[idx].z = floatToHalf(pixelFloat.z);\n    }\n\t__syncthreads();\n}\n\n/**\n * Apply gamma transform to each pixel value of an immage\n */\n__global__ void gamma_kernel (ushort4 *image_RGBA, int width, int height, float value)\n{\n    const int ix = blockDim.x * blockIdx.x + threadIdx.x;\n    const int iy = blockDim.y * blockIdx.y + threadIdx.y;\n\n    if(ix < width && iy < height)\n    {\n        // the first, second, third, and fourth fields can be accessed using x, y, z, and w\n        const int idx = width * iy + ix;\n\n        float4 pixelFloat;\n\n        pixelFloat.x = powf(halfToFloat((unsigned short)image_RGBA[idx].x), value);\n        pixelFloat.y = powf(halfToFloat((unsigned short)image_RGBA[idx].y), value);\n        pixelFloat.z = powf(halfToFloat((unsigned short)image_RGBA[idx].z), value);\n\n        image_RGBA[idx].x = floatToHalf(pixelFloat.x);\n        image_RGBA[idx].y = floatToHalf(pixelFloat.y);\n        image_RGBA[idx].z = floatToHalf(pixelFloat.z);\n    }\n}\n\n/**\n * Invert each color channel value:  out = max - in + min  with max = 1 and min = 0\n */\n__global__ void invert_kernel (ushort4 *image_RGBA, int width, int height)\n{\n    #define MAX_HALF 1.0f\n\n    const int ix = blockDim.x * blockIdx.x + threadIdx.x;\n    const int iy = blockDim.y * blockIdx.y + threadIdx.y;\n\n    if(ix < width && iy < height)\n    {\n        // the first, second, third, and fourth fields can be accessed using x, y, z, and w\n        const int idx = width * iy + ix;\n\n        float4 pixelFloat;\n\n        pixelFloat.x = MAX_HALF - halfToFloat((unsigned short)image_RGBA[idx].x);\n        pixelFloat.y = MAX_HALF - halfToFloat((unsigned short)image_RGBA[idx].y);\n        pixelFloat.z = MAX_HALF - halfToFloat((unsigned short)image_RGBA[idx].z);\n\n        image_RGBA[idx].x = floatToHalf(pixelFloat.x);\n        image_RGBA[idx].y = floatToHalf(pixelFloat.y);\n        image_RGBA[idx].z = floatToHalf(pixelFloat.z);\n    }\n}\n\n/**\n * Create an alpha channel from the color difference\n */\n__global__ void matte_color_diff_kernel (ushort4 *image_RGBA, int width, int height, float threshold)\n{\n    const int ix = blockDim.x * blockIdx.x + threadIdx.x;\n    const int iy = blockDim.y * blockIdx.y + threadIdx.y;\n\n    if(ix < width && iy < height)\n    {\n        // the first, second, third, and fourth fields can be accessed using x, y, z, and w\n        const int idx = width * iy + ix;\n\n        float4 pixelFloat;\n\n        pixelFloat.x = halfToFloat((unsigned short)image_RGBA[idx].x);\n        pixelFloat.y = halfToFloat((unsigned short)image_RGBA[idx].y);\n        pixelFloat.z = fminf(pixelFloat.y, halfToFloat((unsigned short)image_RGBA[idx].z));\n\n        if ( pixelFloat.z > threshold )\n        {\n            pixelFloat.w = 1 - pixelFloat.z + fmaxf(pixelFloat.x, pixelFloat.y);\n        }\n        else\n        {\n            pixelFloat.w = 1.0f;\n        }\n\n        // red and green channels are unchanged\n        image_RGBA[idx].z = floatToHalf(pixelFloat.z);\n        image_RGBA[idx].w = floatToHalf(pixelFloat.w);\n\n    }\n}\n\n/**\n * Invert the alpha channel:  out = max - in + min  with max = 1 and min = 0\n */\n__global__ void matte_invert_kernel (ushort4 *image_RGBA, int width, int height)\n{\n    #define MAX_HALF 1.0f\n\n    const int ix = blockDim.x * blockIdx.x + threadIdx.x;\n    const int iy = blockDim.y * blockIdx.y + threadIdx.y;\n\n    if(ix < width && iy < height)\n    {\n        // the first, second, third, and fourth fields can be accessed using x, y, z, and w\n        const int idx = width * iy + ix;\n\n        float newAlpha;\n\n        newAlpha = MAX_HALF - halfToFloat((unsigned short)image_RGBA[idx].w);\n\n        image_RGBA[idx].w = floatToHalf(newAlpha);\n    }\n}\n\n__global__ void color_monochrome_kernel ( ushort4 *image_RGBA, int width, int height, float redWeight, float greenWeight, float blueWeight)\n{\n\tconst int ix = blockDim.x * blockIdx.x + threadIdx.x;\n    const int iy = blockDim.y * blockIdx.y + threadIdx.y;\n\n    if(ix < width && iy < height)\n    {\n        // the first, second, third, and fourth fields can be accessed using x, y, z, and w\n        const int idx = width * iy + ix;\n\n        float monoValue;\n\n        monoValue = halfToFloat(image_RGBA[idx].x) * redWeight\n        \t\t  + halfToFloat(image_RGBA[idx].y) * greenWeight\n        \t\t  + halfToFloat(image_RGBA[idx].z) * blueWeight;\n\n        image_RGBA[idx].x = floatToHalf(monoValue);\n        image_RGBA[idx].y = floatToHalf(monoValue);\n        image_RGBA[idx].z = floatToHalf(monoValue);\n    }\n\t__syncthreads();\n}\n\n__global__ void threshold_kernel ( ushort4 *image_RGBA, int width, int height, float redThreshold, float greenThreshold, float blueThreshold, float alphaThreshold)\n{\n    const int ix = blockDim.x * blockIdx.x + threadIdx.x;\n    const int iy = blockDim.y * blockIdx.y + threadIdx.y;\n\n    if(ix < width && iy < height)\n    {\n        // the first, second, third, and fourth fields can be accessed using x, y, z, and w\n        const int idx = width * iy + ix;\n\n        float4 pixelFloat;\n\n        pixelFloat.x = fmaxf(halfToFloat((unsigned short)image_RGBA[idx].x), redThreshold);\n        pixelFloat.y = fmaxf(halfToFloat((unsigned short)image_RGBA[idx].y), blueThreshold);\n        pixelFloat.z = fmaxf(halfToFloat((unsigned short)image_RGBA[idx].z), greenThreshold);\n        pixelFloat.w = fmaxf(halfToFloat((unsigned short)image_RGBA[idx].w), alphaThreshold);\n\n        image_RGBA[idx].x = floatToHalf(pixelFloat.x);\n        image_RGBA[idx].y = floatToHalf(pixelFloat.y);\n        image_RGBA[idx].z = floatToHalf(pixelFloat.z);\n        image_RGBA[idx].w = floatToHalf(pixelFloat.w);\n    }\n    __syncthreads();\n}\n\n__global__ void linear_transform_kernel ( float4 *points, int num_points )\n{\n\tconst int idx = blockDim.x * blockIdx.x + threadIdx.x;\n\t__shared__ float T[4][4];\n\n\t__shared__ float4 ThreadPoints[64];\n\n\t/*\n\t__syncthreads();\n\n\tif ( threadIdx.x < 1 )\n\t{\n\t\tT[0][0] = tex2D(transformTexture, 0, 0);\n\t\tT[1][0] = tex2D(transformTexture, 0, 1);\n\t\tT[2][0] = tex2D(transformTexture, 0, 2);\n\t\tT[3][0] = tex2D(transformTexture, 0, 3);\n\t\tT[0][1] = tex2D(transformTexture, 1, 0);\n\t\tT[1][1] = tex2D(transformTexture, 1, 1);\n\t\tT[2][1] = tex2D(transformTexture, 1, 2);\n\t\tT[3][1] = tex2D(transformTexture, 1, 3);\n\t\tT[0][2] = tex2D(transformTexture, 2, 0);\n\t\tT[1][2] = tex2D(transformTexture, 2, 1);\n\t\tT[2][2] = tex2D(transformTexture, 2, 2);\n\t\tT[3][2] = tex2D(transformTexture, 2, 3);\n\t\tT[0][3] = tex2D(transformTexture, 3, 0);\n\t\tT[1][3] = tex2D(transformTexture, 3, 1);\n\t\tT[2][3] = tex2D(transformTexture, 3, 2);\n\t\tT[3][3] = tex2D(transformTexture, 3, 3);\n\t}\n\t*/\n\n    if ( threadIdx.x < 16 )\n\t{\n\t\t//const int row = idx >> 2;\n\t\t//const int col = idx & 0x3;\n\t\tT[idx >> 2][idx & 0x3] = tex2D(transformTexture, idx & 0x3, idx >> 2);\n\t}\n\tif ( blockDim.x < 16 )\n\t{\n\t\tfor ( int i = blockDim.x ; i < 16 ; i++ )\n\t\t{\n\t\t\tT[i >> 2][i & 0x3] = tex2D(transformTexture, i & 0x3, i >> 2);\n\t\t}\n\t}\n\t__syncthreads();\n\n\tif ( idx < num_points )\n\t{\n\t\tfloat4 vt;\n\t\tThreadPoints[threadIdx.x] = points[idx];\n\t\tvt.w = T[3][0]*ThreadPoints[threadIdx.x].x + T[3][1]*ThreadPoints[threadIdx.x].y + T[3][2]*ThreadPoints[threadIdx.x].z + T[3][3];\n\n\t\tvt.x = (T[0][0]*ThreadPoints[threadIdx.x].x + T[0][1]*ThreadPoints[threadIdx.x].y + T[0][2]*ThreadPoints[threadIdx.x].z + T[0][3])/vt.w;\n\t\tvt.y = (T[1][0]*ThreadPoints[threadIdx.x].x + T[1][1]*ThreadPoints[threadIdx.x].y + T[1][2]*ThreadPoints[threadIdx.x].z + T[1][3])/vt.w;\n\t\tvt.z = (T[2][0]*ThreadPoints[threadIdx.x].x + T[2][1]*ThreadPoints[threadIdx.x].y + T[2][2]*ThreadPoints[threadIdx.x].z + T[2][3])/vt.w;\n\n\t\tpoints[idx].x = ThreadPoints[threadIdx.x].x*(1 - ThreadPoints[threadIdx.x].w) + ThreadPoints[threadIdx.x].w*vt.x;\n\t\tpoints[idx].y = ThreadPoints[threadIdx.x].y*(1 - ThreadPoints[threadIdx.x].w) + ThreadPoints[threadIdx.x].w*vt.y;\n\t\tpoints[idx].z = ThreadPoints[threadIdx.x].z*(1 - ThreadPoints[threadIdx.x].w) + ThreadPoints[threadIdx.x].w*vt.z;\n\t}\n\n\t__syncthreads();\n\n}\n\n/**\n * Kernel for calculating the coordinates of the new points along the specified edges.\n *\n */\n__global__ void subdivide_edges_split_point_kernel ( const unsigned int* first_midpoint,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned char* has_midpoint,\n                                                     float4* points_and_selection,\n                                                     unsigned int num_points,\n                                                     unsigned int* edge_point_indices,\n                                                     unsigned int* clockwise_edge_indices,\n                                                     const float* edge_selection,\n                                                     const unsigned int* companions,\n                                                     const unsigned char* boundary_edges,\n                                                     const unsigned int* edge_faces,\n                                                     int num_split_points,\n                                                     const int num_edges)\n{\n    unsigned int edge_index = (blockIdx.x * blockDim.x) + threadIdx.x;\n    int split_index = (blockIdx.y * blockDim.y) + threadIdx.y;\n\n    const unsigned char boundary = boundary_edges[edge_index];\n    const unsigned int companion = companions[edge_index];\n    if ( edge_index < num_edges  && has_midpoint[edge_index] && (boundary || (!boundary && (edge_faces[companion] > edge_faces[edge_index] || !edge_selection[companion]))))\n    {\n        unsigned int p_index = edge_point_indices[edge_index];\n        unsigned int new_point_index = first_midpoint[edge_index] + split_index;\n\n        #ifdef __DEVICE_EMULATION__\n\t/*\n            printf(\"Split Index: %d\\n\", split_index);\n            printf(\"Edge Index: %d\\n\", edge_index);\n            printf(\"Clockwise Edge Index: %d\\n\", clockwise_edge_indices[edge_index]);\n            printf(\"Point Index: %d\\n\", edge_point_indices[edge_index]);\n            printf(\"Clockwise Point Index: %d\\n\", edge_point_indices[clockwise_edge_indices[edge_index]]);\n            printf(\"New Point Index: %d\\n\", new_point_index);\n\t*/\n        #endif\n\n\n        float4 p0 = points_and_selection[p_index];\n        float4 p1 = points_and_selection[edge_point_indices[clockwise_edge_indices[edge_index]]];\n\n        #ifdef __DEVICE_EMULATION__\n\t/*\n            printf(\"P_0:%d: (%f, %f, %f)\\n\", p_index, p0.x, p0.y, p0.z);\n            printf(\"P_1:%d: (%f, %f, %f)\\n\", edge_point_indices[clockwise_edge_indices[edge_index]], p1.x, p1.y, p1.z);\n\t*/\n        #endif\n\n        p1.x = (p1.x - p0.x) / (num_split_points + 1);\n        p1.y = (p1.y - p0.y) / (num_split_points + 1);\n        p1.z = (p1.z - p0.z) / (num_split_points + 1);\n\n        #ifdef __DEVICE_EMULATION__\n\t/*\n            printf(\"P_delta:(%f, %f, %f)\\n\", p1.x, p1.y, p1.z);\n\t*/\n        #endif\n\n        points_and_selection[new_point_index].x = p0.x + (split_index + 1)*p1.x;\n        points_and_selection[new_point_index].y = p0.y + (split_index + 1)*p1.y;\n        points_and_selection[new_point_index].z = p0.z + (split_index + 1)*p1.z;\n        points_and_selection[new_point_index].w = 1;\n\n    }\n\n}\n\n__global__ void subdivide_edges_update_edge_indices_kernel ( unsigned int* output_edge_point_indices,\n                                                        unsigned int* output_clockwise_edge_point_indices,\n                                                        unsigned int* input_edge_point_indices,\n                                                        unsigned int* input_clockwise_edge_point_indices,\n                                                        unsigned int* edge_index_map,\n                                                        int num_edge_maps)\n{\n    unsigned int edge_index_index = (blockIdx.x * blockDim.x) + threadIdx.x;\n\n    if ( edge_index_index < num_edge_maps )\n    {\n        unsigned int out_edge_index = edge_index_map[edge_index_index];\n\n        #ifdef __DEVICE_EMULATION__\n\t/*\n            printf(\"Edge: %d : Mapped Edge : %d \\n\", edge_index_index, out_edge_index);\n\t*/\n        #endif\n\n        output_edge_point_indices[out_edge_index] = input_edge_point_indices[edge_index_index];\n        output_clockwise_edge_point_indices[out_edge_index] = edge_index_map[input_clockwise_edge_point_indices[edge_index_index]];\n\n        #ifdef __DEVICE_EMULATION__\n\t/*\n            printf(\"Input Edge Point: %d : Input CW Edge Point : %d \\n\", input_edge_point_indices[edge_index_index], input_clockwise_edge_point_indices[edge_index_index]);\n\t*/\n        #endif\n    }\n}\n\n__global__ void subdivide_edges_update_loop_first_edges_kernel (\n                                                        unsigned int* pdev_ouput_loop_first_edges,\n                                                        int num_loops,\n                                                        unsigned int* edge_index_map\n                                                        )\n{\n    unsigned int loop_index = (blockIdx.x * blockDim.x) + threadIdx.x;\n\n    if ( loop_index < num_loops )\n    {\n        pdev_ouput_loop_first_edges[loop_index] = edge_index_map[pdev_ouput_loop_first_edges[loop_index]];\n    }\n}\n\n__global__ void subdivide_edges_split_edges_kernel (unsigned int* output_edge_point_indices,\n                                                    unsigned int* output_clockwise_edge_point_indices,\n                                                    unsigned int* input_clockwise_edge_point_indices,\n                                                    const float* edge_selection,\n                                                    unsigned int* edge_index_map,\n                                                    unsigned int* pdev_first_midpoint,\n                                                    unsigned char* has_midpoint,\n                                                    int num_split_points,\n                                                    unsigned int* pdev_companions,\n                                                    unsigned char* pdev_boundary_edges,\n                                                    const unsigned int num_edges,\n                                                    const unsigned int* edge_faces\n                                                    )\n\n{\n    unsigned int edge = (blockIdx.x * blockDim.x) + threadIdx.x;\n    int split_index = (blockIdx.y * blockDim.y) + threadIdx.y;\n    \n    if ( edge < num_edges  && has_midpoint[edge])\n    {\n        unsigned int old_clockwise = input_clockwise_edge_point_indices[edge];\n        unsigned int new_edge = edge_index_map[edge] + 1 + split_index;\n        \n        const unsigned int companion = pdev_companions[edge];\n        const unsigned char boundary = pdev_boundary_edges[edge];\n\n        if(edge_selection[edge] && (boundary || (!boundary && (edge_faces[edge] < edge_faces[companion] || !edge_selection[companion]))))\n        {\n        \toutput_edge_point_indices[new_edge] = pdev_first_midpoint[edge] + split_index;\n        }\n        else\n        {\n        \toutput_edge_point_indices[new_edge] = pdev_first_midpoint[edge] - split_index + num_split_points - 1;\n        }\n        output_clockwise_edge_point_indices[new_edge - 1] = new_edge;\n\n        if ( split_index == 0 )\n        {\n            output_clockwise_edge_point_indices[new_edge + num_split_points - 1] = edge_index_map[old_clockwise];\n        }\n\n    }\n}\n\n__global__ void convert_uint_64_to_32_kernel ( uint2* p_uint_64, unsigned int* p_uint_32, int num_ints )\n{\n    const int int_index = (blockDim.x * blockIdx.x) + threadIdx.x;\n\n    if ( int_index < num_ints )\n    {\n        // set the 32bit unsigned int to the lower 32bits of the 64bit unsigned int\n        p_uint_32[int_index] = p_uint_64[int_index].x;\n    }\n}\n\n__global__ void convert_uint_32_to_64_kernel ( uint2* p_uint_64, unsigned int* p_uint_32, int num_ints )\n{\n    const int int_index = (blockDim.x * blockIdx.x) + threadIdx.x;\n\n    if ( int_index < num_ints )\n    {\n        // zero the upper 32bits and equate the lower 32\n        p_uint_64[int_index].y = 0;\n        p_uint_64[int_index].x = p_uint_32[int_index];\n    }\n}\n\n\n__global__ void set_selection_value_kernel ( float4* points_and_selection, float selection_value, int num_points )\n{\n    const int index = (blockDim.x * blockIdx.x) + threadIdx.x;\n    if ( index < num_points )\n    {\n        points_and_selection[index].w = selection_value;\n    }\n}\n\n/**\n * Kernel for companion computation\n */\n__global__ void find_companion_kernel(unsigned char* boundary_edges,\n\t\t\t\t\t\t\t\t\t  unsigned int* adjacent_edge_indices,\n\t\t\t\t\t\t\t\t\t  const int num_edges,\n\t\t\t\t\t\t\t\t\t  const unsigned int* edge_point_indices,\n\t\t\t\t\t\t\t\t\t  const unsigned int* clockwise_edges_point_indices,\n\t\t\t\t\t\t\t\t\t  const unsigned int* first_edges,\n\t\t\t\t\t\t\t\t\t  const unsigned int* valences,\n\t\t\t\t\t\t\t\t\t  const unsigned int* point_edges)\n{\n\tconst int edge_index = (blockDim.x * blockIdx.x) + threadIdx.x;\n\n\tif ( edge_index < num_edges )\n\t{\n\t\tconst unsigned int vertex1 = edge_point_indices[edge_index];\n\t\tconst unsigned int vertex2 = edge_point_indices[clockwise_edges_point_indices[edge_index]];\n\n\t\tconst unsigned int first_index = first_edges[vertex2];\n\t\tconst unsigned int last_index = first_index + valences[vertex2];\n\t\tfor ( unsigned int i = first_index; i != last_index; ++i )\n\t\t{\n\t\t\tconst unsigned int companion = point_edges[i];\n\t\t\tif ( edge_point_indices[clockwise_edges_point_indices[companion]] == vertex1 )\n\t\t\t{\n\t\t\t\tboundary_edges[edge_index] = 0;\n\t\t\t\tadjacent_edge_indices[edge_index] = companion;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n}\n\n\n/**\n * Kernel for looking up the valence of edges points\n */\n__global__ void create_vertex_valence_lookup_kernel ( unsigned int* valence, const unsigned int* edge_point_indices, int* num_valence, int num_edges )\n{\n\tint tmp_num_valence = 0;\n\tunsigned int point_index = 0;\n\n\tfor ( unsigned int edge_index = 0; edge_index < num_edges ; edge_index++ )\n\t{\n\t\tpoint_index = edge_point_indices[edge_index];\n\t\tvalence[point_index] += 1;\n\t\ttmp_num_valence = max(tmp_num_valence, (point_index+1));\n\t}\n\n\t*num_valence = tmp_num_valence;\n}\n\n/**\n * Kernel to calculate first edges in edge_adjacency lookup\n */\n__global__ void calculate_first_edges_kernel ( unsigned int* first_edges, const unsigned int* valences, int num_points )\n{\n\tunsigned int count = 0;\n\n\tfor ( unsigned int point = 0; point < num_points; ++point)\n\t{\n\t\tfirst_edges[point] = count;\n\t\tcount += valences[point];\n\t}\n\n}\n__global__ void calculate_first_edges_block_kernel ( unsigned int* first_edges, const unsigned int* valences, int num_edges )\n{\n\t// use shared memory to store both the result per block as well as the initial block values\n\t__shared__ extern uint2 shared_first[];\n\n\tunsigned int edge_index = ( blockDim.x * blockIdx.x) + threadIdx.x;\n\n\tif ( edge_index < num_edges )\n\t{\n\t\tshared_first[threadIdx.x].x = valences[edge_index];\n\t\tshared_first[0].y = 0;\n\n\t\tif ( edge_index > 0 )\n\t\t{\n\t\t\tshared_first[threadIdx.x].y = valences[edge_index-1];\n\t\t}\n\t}\n\n\t__syncthreads();\n\n\tif ( edge_index < num_edges )\n\t{\n\t\tfor ( int i = 1; i < blockDim.x ; i++ )\n\t\t{\n\t\t\tif ( threadIdx.x >= i )\n\t\t\t{\n\t\t\t\tshared_first[threadIdx.x].x += shared_first[threadIdx.x - i].y;\n\t\t\t}\n\t\t}\n\t}\n\n\t__syncthreads();\n\tif ( edge_index < num_edges )\n\t{\n\t\tfirst_edges[edge_index] = shared_first[threadIdx.x].x;\n\t}\n\t__syncthreads();\n\n}\n\n__global__ void calculate_first_edges_update_kernel ( unsigned int* first_edges, int num_edges )\n{\n\n\t__shared__ extern unsigned int shared_first_edge[];\n\t__shared__ unsigned int update_val;\n\n\tunsigned int edge_index = ( blockDim.x * blockIdx.x) + threadIdx.x;\n\n#ifdef __DEVICE_EMULATION__\n/*\n\tprintf(\"calculate_first_edges_update_kernel: %u of %d blah\\n\", edge_index, num_edges);\n*/\n#endif\n\n\tif ( edge_index < num_edges )\n\t{\n\t\tshared_first_edge[threadIdx.x] = first_edges[edge_index];\n\t}\n\n\tif ( threadIdx.x == 0 )\n\t{\n\t\tupdate_val = 0;\n\t\tfor ( int k = 1 ; k <= ( blockIdx.x ) ; k++ )\n\t\t{\n\t\t\tupdate_val += first_edges[k*blockDim.x -1];\n\t\t}\n\t}\n\t__syncthreads();\n\n\n\tif ( edge_index < num_edges )\n\t{\n\t\tshared_first_edge[threadIdx.x] += update_val;\n\t}\n\n\t__syncthreads();\n\n\tif ( edge_index < num_edges )\n\t{\n\t\tfirst_edges[edge_index] = shared_first_edge[threadIdx.x];\n\t}\n\n}\n\n/**\n * Kernel for calculating point edges\n */\n__global__ void calculate_point_edges_kernel ( unsigned int* point_edges, unsigned int* found_edges, const unsigned int* edge_point_indices, const unsigned int* first_edges, int num_edges)\n{\n\tunsigned int point_index = 0;\n\tfor ( unsigned int edge_index = 0 ; edge_index < num_edges ; ++edge_index )\n\t{\n\t\tpoint_index = edge_point_indices[edge_index];\n\t\tpoint_edges[first_edges[point_index] + found_edges[point_index]] = edge_index;\n\t\t++found_edges[point_index];\n\t}\n}\n\n/**\n * Kernel to get the first loop index as well as the loop count for a given face\n */\n__global__ void get_loop_index_and_count_kernel (\n\t\t\t\t\t\t\t\t\t\t\tunsigned int* index_and_counts,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* face_first_loops,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* face_loop_counts,\n\t\t\t\t\t\t\t\t\t\t\tint face_index )\n{\n\tindex_and_counts[0] = face_first_loops[face_index];\n\tindex_and_counts[1] = face_loop_counts[face_index];\n}\n\n\n/**\n * Count the total number of edges each face will have after applying the edge subdivision, and the number of new points added per face\n */\n\n__global__ void subdivide_edges_count_components_per_face(\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* face_first_loops,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst int num_faces,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* face_loop_counts,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* loop_first_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* clockwise_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst float* edge_selection,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* companions,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned char* boundary_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst int split_point_count,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* edge_faces,\n\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* face_edge_counts,\n\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* face_split_point_counts\n\t\t)\n{\n\tunsigned int face_index = (blockIdx.x * blockDim.x) + threadIdx.x;\t\n\tif(face_index >= num_faces)\n\t\treturn;\n\t\n\tunsigned int edge_count = 0;\n\tunsigned int new_point_count = 0;\n\t\n\tunsigned int loop_begin = face_first_loops[face_index];\n\tunsigned int loop_end = loop_begin + face_loop_counts[face_index];\n\tfor(unsigned int loop_index = loop_begin; loop_index != loop_end; ++loop_index)\n\t{\n\t\tunsigned int first_edge_index = loop_first_edges[loop_index];\n\t\t\n\t\tfor( unsigned int edge_index = first_edge_index; 1 ; )\n\t\t{\n\t\t\tunsigned int companion = companions[edge_index]; \n\t\t\t++edge_count;\n\t\n\t\t\tedge_count += split_point_count * (edge_selection[edge_index] || (!boundary_edges[edge_index] && edge_selection[companion]));\n\t\t\tunsigned int found_points = 0;\n\t\t\tif(edge_selection[edge_index] && (boundary_edges[edge_index] || edge_faces[edge_index] < edge_faces[companion] || !edge_selection[companion]))\n\t\t\t\tfound_points = split_point_count;\n\t\t\t//const unsigned int found_points = split_point_count * (edge_selection[edge_index] && !(!boundary_edges[edge_index] && (edge_faces[edge_index] > edge_faces[companion] || !edge_selection[companion])));\n\t\t\tnew_point_count += found_points;\n\t\t\t\n#ifdef __DEVICE_EMULATION__\n/*\n\tprintf(\"adding %d points for edge %d\\n\", found_points, edge_index);\n*/\n#endif\n\t\t\t\t\t\t\n\t\t\tedge_index = clockwise_edges[edge_index];\n\t\t\tif (edge_index == first_edge_index)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tface_edge_counts[face_index] = edge_count;\n\tface_split_point_counts[face_index] = new_point_count;\n}\n\n/**\n *\n */\n__global__ void subdivide_edges_edge_index_calculator_kernel (\n\t\t\t\t\t\t\t\t\t\t\tunsigned int* first_midpoint,\n\t\t\t\t\t\t\t\t\t\t\tunsigned char* has_midpoint,\n\t\t\t\t\t\t\t\t\t\t\tunsigned int* index_map,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* face_first_loops,\n\t\t\t\t\t\t\t\t\t\t\tint num_faces,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* face_loop_counts,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* loop_first_edges,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* clockwise_edges,\n\t\t\t\t\t\t\t\t\t\t\tconst float* edge_selection,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* companions,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned char* boundary_edges,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* edge_faces,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* face_edge_counts,\n\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* face_split_point_counts,\n\t\t\t\t\t\t\t\t\t\t\tint split_point_count,\n\t\t\t\t\t\t\t\t\t\t\tint first_new_point_index\n\t\t\t\t\t\t\t\t\t\t\t )\n{\n\n\tunsigned int face_index = (blockIdx.x * blockDim.x) + threadIdx.x;\n\t\n\tif(face_index >= num_faces)\n\t\treturn;\n\t\t\n\t// initialize the edge count to the cumulative edge count of the previous faces\n\tunsigned int edge_count = face_index == 0 ? 0 : face_edge_counts[face_index - 1];\n\t// initialise the new midpoint point index to the cumulative new point count of the previous faces\n\tunsigned int midpoint_index = face_index == 0 ? first_new_point_index : first_new_point_index + face_split_point_counts[face_index - 1];\n\n\tunsigned int loop_begin = face_first_loops[face_index];\n\tunsigned int loop_end = loop_begin + face_loop_counts[face_index];\n\tfor(unsigned int loop_index = loop_begin; loop_index != loop_end; ++loop_index)\n\t{\n\t\tunsigned int first_edge_index = loop_first_edges[loop_index];\n\t\tfor( unsigned int edge_index = first_edge_index; 1 ; )\n\t\t{\n\t\t\tindex_map[edge_index] = edge_count;\n\t\t\tconst unsigned int companion = companions[edge_index];\n\t\t\tconst char boundary = boundary_edges[edge_index];\n\t\t\t\n\t\t\t// The midpoint was/is being/will be calculated in another kernel, but we still need to update the edge index counter for this face\n\t\t\tif(!boundary && edge_selection[companion] && (!edge_selection[edge_index] || edge_faces[edge_index] > edge_faces[companion]))\n\t\t\t{\n\t\t\t\tedge_count += split_point_count;\n\t\t\t}\n\t\n\t\t\t// Get the midpoint index, and set it for both ourselves and the companion edge if we are the kernel for the first face of the edge-companion pair\n\t\t\tif(edge_selection[edge_index] && (boundary || (!boundary && (edge_faces[edge_index] < edge_faces[companion] || !edge_selection[companion]))))\n\t\t\t{\n\t\t\t\tfirst_midpoint[edge_index] = midpoint_index;\n\t\t\t\thas_midpoint[edge_index] = 1;\n\t\t\t\tif(!boundary)\n\t\t\t\t{\n\t\t\t\t\tfirst_midpoint[companion] = midpoint_index;\n\t\t\t\t\thas_midpoint[companion] = 1;\n\t\t\t\t}\n\t\t\t\tmidpoint_index += split_point_count;\n\t\t\t\tedge_count += split_point_count;\n\t\t\t}\n\t\n\t\t\tedge_index = clockwise_edges[edge_index];\n\t\t\t++edge_count;\n\t\t\tif (edge_index == first_edge_index)\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Execute a single step in the iterative calculation of a cumulative sum. The algorithm\n * has to as long as step_size < size\n * \\param input The input array\n * \\param output The result, which is partial as long as step_size < size\n * \\param size The number of elements in input and output\n * \\param step_size Equal to 2^(step_number), with step_number starting at 0\n */\n__global__ void cumulative_sum_step(const unsigned int* input, unsigned int* output, const int size, const int step_size)\n{\n\tconst unsigned int index = (blockIdx.x * blockDim.x) + threadIdx.x;\n\t\n\tif(index >= size)\n\t\treturn;\n\t\n\tchar to_calculate = step_size <= index; // true if the number at index still needs calculating\n\toutput[index] = input[index] + input[(index - step_size) * to_calculate] * to_calculate;\n}\n\n/**\n * Stores the face each edge belongs to\n */\n__global__ void face_per_edge_kernel(\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* face_first_loops,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst int num_faces,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* face_loop_counts,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* loop_first_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst unsigned int* clockwise_edges,\n\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* edge_faces)\n{\n\tunsigned int face_index = (blockIdx.x * blockDim.x) + threadIdx.x;\t\n\tif(face_index >= num_faces)\n\t\treturn;\n\n\tunsigned int loop_begin = face_first_loops[face_index];\n\tunsigned int loop_end = loop_begin + face_loop_counts[face_index];\n\tfor(unsigned int loop_index = loop_begin; loop_index != loop_end; ++loop_index)\n\t{\n\t\tunsigned int first_edge_index = loop_first_edges[loop_index];\n\t\t\n\t\tfor( unsigned int edge_index = first_edge_index; 1 ; )\n\t\t{\n\t\t\tedge_faces[edge_index] = face_index;\n\t\t\t\n\t\t\tedge_index = clockwise_edges[edge_index];\n\t\t\tif (edge_index == first_edge_index)\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Kernel to construct the mesh structure of the polyhedra\n */\n__global__ void create_grid_structure_kernel (\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* face_first_loops,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* face_loop_count,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int* loop_first_edge,\n\t\t\t\t\t\t\t\t\t\t\t\tuint4* edge_point,\n\t\t\t\t\t\t\t\t\t\t\t\tuint4* clockwise_edge,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int rows,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int columns\n\t\t\t\t\t\t\t\t\t\t\t\t)\n{\n\tunsigned int row_index = ( blockIdx.x * blockDim.x ) + threadIdx.x;\n\tunsigned int col_index = ( blockIdx.y * blockDim.y ) + threadIdx.y;\n\n\tif ( ( row_index < rows ) && (col_index < columns) )\n\t{\n\t\tunsigned int face_number = row_index * columns + col_index;\n\t\tface_first_loops[face_number] = face_number;\n\t\tface_loop_count[face_number] = 1;\n\t\tloop_first_edge[face_number] = 4*face_number;\n\n\t\tedge_point[face_number].x = face_number + row_index;\n\t\tedge_point[face_number].y = face_number + row_index + 1;\n\t\tedge_point[face_number].z = face_number + row_index + columns + 2;\n\t\tedge_point[face_number].w = face_number + row_index + columns + 1;\n\n\t\tclockwise_edge[face_number].x = 4*face_number + 1;\n\t\tclockwise_edge[face_number].y = 4*face_number + 2;\n\t\tclockwise_edge[face_number].z = 4*face_number + 3;\n\t\tclockwise_edge[face_number].w = 4*face_number;\n\n\t}\n\n}\n\n/**\n * Kernel to calculate the point coordinates of a poly_grid\n */\n__global__ void calculate_grid_points_kernel ( float4 *point_and_selection,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat3 x,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat3 y,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int rows,\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned int columns\n\t\t\t\t\t\t\t\t\t\t\t\t)\n{\n\tunsigned int row_index = ( blockIdx.x * blockDim.x ) + threadIdx.x;\n\tunsigned int col_index = ( blockIdx.y * blockDim.y ) + threadIdx.y;\n\n\tif ( ( row_index <= rows ) && (col_index <= columns) )\n\t{\n\t\tfloat row_percent = 0.5 - (float)row_index / (float)rows;\n\t\tfloat col_percent = (float)col_index/(float)columns - 0.5;\n\n\t\tunsigned int point_index = row_index*(columns+1) + col_index;\n\n\t\tpoint_and_selection[point_index].x = col_percent * x.x + row_percent * y.x;\n\t\tpoint_and_selection[point_index].y = col_percent * x.y + row_percent * y.y;\n\t\tpoint_and_selection[point_index].z = col_percent * x.z + row_percent * y.z;\n\t\tpoint_and_selection[point_index].w = 0;\n\t}\n\n}\n\n#endif // #ifndef _CUDA_KERNELS_H_\n\n"
  },
  {
    "path": "modules/cuda/cuda_mesh_cuda_to_k3d_converter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n    \\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n\n#include \"cuda_device_mesh.h\"\n\nnamespace module\n{\n    \nnamespace cuda\n{\n    \n/////////////////////////////////////////////////////////////////////////////\n// cuda_mesh_cuda_to_k3d_converter\n\nclass cuda_mesh_cuda_to_k3d_converter : \n    public k3d::mesh_source<k3d::node >\n{\n    typedef k3d::mesh_source<k3d::node > base;\n\npublic:\n    cuda_mesh_cuda_to_k3d_converter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n        base(Factory, Document),\n        m_input_cuda_device_mesh(init_owner(*this) + init_name(\"device_input_mesh\") + init_label(_(\"Device Mesh\")) + init_description(_(\"Device mesh\")) + init_value<cuda_device_mesh*>(0))        \n    {\n        m_input_cuda_device_mesh.changed_signal().connect(sigc::mem_fun(*this, &cuda_mesh_cuda_to_k3d_converter::convert_from_cuda_mesh));\n    }\n    \n    void convert_from_cuda_mesh(k3d::iunknown*)\n    {\n        k3d::log() << info << \"Converting from CUDA\" << std::endl;\n        \n        if ( m_input_cuda_device_mesh.pipeline_value() )\n        {\n            m_input_cuda_device_mesh.pipeline_value()->output_debug_info();\n            m_input_cuda_device_mesh.pipeline_value()->copy_from_device( *(m_output_mesh.pipeline_value()) );\n        }\n    }\n    \n    void on_update_mesh_topology(k3d::mesh& Output)\n    {\n        k3d::log() << info << \"Create Topology\" << std::endl;\n    \tOutput = k3d::mesh();\n    }\n    \n    void on_update_mesh_geometry(k3d::mesh& Output)\n    {\n        k3d::log() << info << \"Update Geometry\" << std::endl;\n    }\n     \n    static k3d::iplugin_factory& get_factory()\n    {\n        static k3d::document_plugin_factory<cuda_mesh_cuda_to_k3d_converter,\n            k3d::interface_list<k3d::imesh_source> > factory(\n                k3d::uuid(0x53ad6a9b, 0x434e15bc, 0x18297a93, 0xd0b43a5e),\n                \"CUDAMeshCUDAToK3dConverter\",\n                _(\"Convert a CUDA mesh to a k3d mesh\"),\n                \"CUDAMesh\",\n                k3d::iplugin_factory::EXPERIMENTAL);\n\n        return factory;\n    }\n\nprivate:\n    k3d_data(cuda_device_mesh*, immutable_name, change_signal, no_undo, local_storage, no_constraint, read_only_property, no_serialization) m_input_cuda_device_mesh;             \n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_mesh_cuda_to_k3d_converter\n\nk3d::iplugin_factory& cuda_mesh_cuda_to_k3d_converter_factory()\n{\n    return cuda_mesh_cuda_to_k3d_converter::get_factory();\n}  \n  \n} // namespace cuda\n    \n} // namespace module\n"
  },
  {
    "path": "modules/cuda/cuda_mesh_k3d_to_cuda_converter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n    \\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_sink.h>\n#include <k3dsdk/node.h>\n\n#include \"cuda_device_mesh.h\"\n\nnamespace module\n{\n    \nnamespace cuda\n{\n    \n/////////////////////////////////////////////////////////////////////////////\n// cuda_mesh_k3d_to_cuda_converter\n\nclass cuda_mesh_k3d_to_cuda_converter : \n    public k3d::mesh_sink<k3d::node >\n{\n    typedef k3d::mesh_sink<k3d::node > base;\n\npublic:\n    cuda_mesh_k3d_to_cuda_converter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n        base(Factory, Document),\n        m_output_cuda_device_mesh(init_owner(*this) + init_name(\"device_output_mesh\") + init_label(_(\"Device Mesh\")) + init_description(_(\"Device mesh\")) + init_value<cuda_device_mesh*>(0))        \n    {\n        m_input_mesh.changed_signal().connect(sigc::mem_fun(*this, &cuda_mesh_k3d_to_cuda_converter::convert_to_cuda_mesh));\n    }\n    \n    \n    ~cuda_mesh_k3d_to_cuda_converter()\n    {\n        // free the device mesh allocated\n        delete m_output_cuda_device_mesh.internal_value();\n    }\n    \n    \n    void convert_to_cuda_mesh(k3d::iunknown*)\n    {\n        k3d::log() << info << \"Converting to CUDA\" << std::endl;\n        \n        if ( m_output_cuda_device_mesh.pipeline_value() )\n        {\n            delete m_output_cuda_device_mesh.pipeline_value(); \n        }\n\n        m_output_cuda_device_mesh.set_value( new cuda_device_mesh ( *(m_input_mesh.pipeline_value()) ) );\n        m_output_cuda_device_mesh.internal_value()->copy_to_device();\n        m_output_cuda_device_mesh.internal_value()->output_debug_info();\n\n    }\n    \n    static k3d::iplugin_factory& get_factory()\n    {\n        static k3d::document_plugin_factory<cuda_mesh_k3d_to_cuda_converter,\n            k3d::interface_list<k3d::imesh_sink> > factory(\n                k3d::uuid(0xd6321dd2, 0xd949bf23, 0x049c58bd, 0x4562ddae),\n                \"CUDAMeshK3dToCUDAConverter\",\n                _(\"Convert a k3d mesh do a CUDA mesh\"),\n                \"CUDAMesh\",\n                k3d::iplugin_factory::EXPERIMENTAL);\n\n        return factory;\n    }\n\nprivate:\n    k3d_data(cuda_device_mesh*, immutable_name, change_signal, no_undo, local_storage, no_constraint, read_only_property, no_serialization) m_output_cuda_device_mesh;             \n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_mesh_k3d_to_cuda_converter\n\nk3d::iplugin_factory& cuda_mesh_k3d_to_cuda_converter_factory()\n{\n    return cuda_mesh_k3d_to_cuda_converter::get_factory();\n}  \n  \n} // namespace cuda\n    \n} // namespace module\n"
  },
  {
    "path": "modules/cuda/cuda_mesh_poly_grid.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n\n#include \"cuda_device_mesh.h\"\n#include \"cuda_entry_points.h\"\n\n#include <iterator>\n\nnamespace module\n{\n\nnamespace cuda\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_mesh_poly_grid\n\nclass cuda_mesh_poly_grid :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tcuda_mesh_poly_grid(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_columns(init_owner(*this) + init_name(\"columns\") + init_label(_(\"Columns\")) + init_description(_(\"Column number\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_rows(init_owner(*this) + init_name(\"rows\") + init_label(_(\"Rows\")) + init_description(_(\"Row number\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Grid width\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Grid height\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_orientation(init_owner(*this) + init_name(\"orientation\") + init_label(_(\"Orientation\")) + init_description(_(\"Orientation type (forward or backward along X, Y or Z axis)\")) + init_value(k3d::PZ) + init_enumeration(k3d::signed_axis_values())),\n\t\tm_p_output_device_mesh(init_owner(*this) + init_name(\"ouput_device_mesh\") + init_label(_(\"Output Device Mesh\")) + init_description(_(\"Pointer to device mesh\")) + init_value<cuda_device_mesh*>(0))\n\t{\n\t\tm_columns.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_rows.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_orientation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Topology:init\");\n\t\tk3d::uint32_t rows = m_rows.pipeline_value();\n\t\tk3d::uint32_t columns = m_columns.pipeline_value();\n\n\t\t// Setup some of the data structure on the host\n\t\tk3d::mesh::polyhedra_t& polyhedra = Output.polyhedra.create(new k3d::mesh::polyhedra_t());\n\t\tk3d::mesh::indices_t& first_faces = polyhedra.first_faces.create(new k3d::mesh::indices_t(1, 0));\n\t\tk3d::mesh::counts_t& face_counts = polyhedra.face_counts.create(new k3d::mesh::counts_t(1, rows * columns));\n\t\tk3d::mesh::polyhedra_t::types_t& types = polyhedra.types.create(new k3d::mesh::polyhedra_t::types_t(1, k3d::mesh::polyhedra_t::POLYGONS));\n\t\tk3d::mesh::materials_t& face_materials = polyhedra.face_materials.create(new k3d::mesh::materials_t(rows * columns, m_material.pipeline_value()));\n\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Topology:init\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Topology:DeviceAllocate\");\n\n\t\tm_p_output_device_mesh.pipeline_value()->resize_points_and_selection((rows+1)*(columns+1));\n\t\tm_p_output_device_mesh.pipeline_value()->get_device_polyhedra().resize_faces(rows*columns, true);\n\t\tm_p_output_device_mesh.pipeline_value()->get_device_polyhedra().resize_loops(rows*columns, true);\n\t\tm_p_output_device_mesh.pipeline_value()->get_device_polyhedra().resize_edges(4*rows*columns, true);\n\n\t\tsynchronize_threads();\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Topology:DeviceAllocate\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Topology:Kernel\");\n\t\tcreate_grid_structure_kernel_entry (\n\t\t\t\t\t\t\t\t\t\t\t(unsigned int*)m_p_output_device_mesh.pipeline_value()->get_device_polyhedra().get_per_face_first_loops_pointer(),\n\t\t\t\t\t\t\t\t\t\t\t(unsigned int*)m_p_output_device_mesh.pipeline_value()->get_device_polyhedra().get_per_face_loop_counts_pointer(),\n\t\t\t\t\t\t\t\t\t\t\t(unsigned int*)m_p_output_device_mesh.pipeline_value()->get_device_polyhedra().get_per_loop_first_edges_pointer(),\n\t\t\t\t\t\t\t\t\t\t\t(unsigned int*)m_p_output_device_mesh.pipeline_value()->get_device_polyhedra().get_per_edge_points_pointer(),\n\t\t\t\t\t\t\t\t\t\t\t(unsigned int*)m_p_output_device_mesh.pipeline_value()->get_device_polyhedra().get_per_edge_clockwise_edges_pointer(),\n\t\t\t\t\t\t\t\t\t\t\trows,\n\t\t\t\t\t\t\t\t\t\t\tcolumns);\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Topology:Kernel\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Topology:Copy\");\n\t\tm_p_output_device_mesh.pipeline_value()->copy_from_device ( Output, POLYHEDRA_ALL_FACES + POLYHEDRA_ALL_LOOPS + POLYHEDRA_ALL_EDGES );\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Topology:Copy\");\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Geometry:init\");\n\t\tconst float width = (float)m_width.pipeline_value();\n\t\tconst float height = (float)m_height.pipeline_value();\n\t\tconst k3d::signed_axis orientation = m_orientation.pipeline_value();\n\n\t\tk3d::uint32_t rows = m_rows.pipeline_value();\n\t\tk3d::uint32_t columns = m_columns.pipeline_value();\n\n\t\tfloat xf[3] = {0, 0, 0};\n\t\tfloat yf[3] = {0, 0, 0};\n\n\t\tswitch(orientation)\n\t\t{\n\t\t\tcase k3d::PX:\n\t\t\t\txf[1] = -width;\n\t\t\t\tyf[2] = height;\n\t\t\t\tbreak;\n\t\t\tcase k3d::NX:\n\t\t\t\txf[1] = width;\n\t\t\t\tyf[2] = height;\n\t\t\t\tbreak;\n\t\t\tcase k3d::NY:\n\t\t\t\txf[0] = -width;\n\t\t\t\tyf[2] = height;\n\t\t\t\tbreak;\n\t\t\tcase k3d::PY:\n\t\t\t\txf[0] = width;\n\t\t\t\tyf[2] = height;\n\t\t\t\tbreak;\n\t\t\tcase k3d::PZ:\n\t\t\t\txf[0] = -width;\n\t\t\t\tyf[1] = height;\n\t\t\t\tbreak;\n\t\t\tcase k3d::NZ:\n\t\t\t\txf[0] = width;\n\t\t\t\tyf[1] = height;\n\t\t\t\tbreak;\n\t\t}\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Geometry:init\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Geometry:Kernel\");\n\t\tcalculate_grid_points_kernel_entry (m_p_output_device_mesh.pipeline_value()->get_points_and_selection_pointer(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\txf,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyf,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trows,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumns\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Geometry:Kernel\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Geometry:Copy\");\n\t\tm_p_output_device_mesh.pipeline_value()->copy_from_device ( Output, MESH_POINTS + MESH_SELECTION );\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Geometry:Copy\");\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_mesh_poly_grid, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0xe55a0246, 0xc24a39d2, 0xe9f6b1a5, 0xe859fd69),\n\t\t\t\"CUDAPolyGrid\",\n\t\t\t_(\"Generates a polygonal grid using the CUDA API\"),\n\t\t\t\"CUDAPolygon\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_columns;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_rows;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::signed_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_orientation;\n\n\tk3d_data(cuda_device_mesh*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_p_output_device_mesh;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_mesh_poly_grid_factory\n\nk3d::iplugin_factory& cuda_mesh_poly_grid_factory()\n{\n\treturn cuda_mesh_poly_grid::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/cuda_mesh_poly_grid_with_transform_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n\n#include \"cuda_device_mesh.h\"\n#include \"cuda_entry_points.h\"\n\n#include <iterator>\n\nnamespace module\n{\n\nnamespace cuda\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_mesh_poly_grid_and_transform\n\nclass cuda_mesh_poly_grid_and_transform :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tcuda_mesh_poly_grid_and_transform(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_columns(init_owner(*this) + init_name(\"columns\") + init_label(_(\"Columns\")) + init_description(_(\"Column number\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_rows(init_owner(*this) + init_name(\"rows\") + init_label(_(\"Rows\")) + init_description(_(\"Row number\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Grid width\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Grid height\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_orientation(init_owner(*this) + init_name(\"orientation\") + init_label(_(\"Orientation\")) + init_description(_(\"Orientation type (forward or backward along X, Y or Z axis)\")) + init_value(k3d::PZ) + init_enumeration(k3d::signed_axis_values())),\n\t\tm_input_matrix(init_owner(*this) + init_name(\"input_matrix\") + init_label(_(\"Input matrix\")) + init_description(_(\"Input matrix\")) + init_value(k3d::identity3())),\n\t\tm_p_output_device_mesh(init_owner(*this) + init_name(\"ouput_device_mesh\") + init_label(_(\"Output Device Mesh\")) + init_description(_(\"Pointer to device mesh\")) + init_value<cuda_device_mesh*>(0))\n\t{\n\t\tm_columns.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_rows.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_orientation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\n\t\tm_input_matrix.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Topology:init\");\n\t\tk3d::uint32_t rows = m_rows.pipeline_value();\n\t\tk3d::uint32_t columns = m_columns.pipeline_value();\n\n\t\t// Setup some of the data structure on the host\n\t\tk3d::mesh::polyhedra_t& polyhedra = Output.polyhedra.create(new k3d::mesh::polyhedra_t());\n\t\tk3d::mesh::indices_t& first_faces = polyhedra.first_faces.create(new k3d::mesh::indices_t(1, 0));\n\t\tk3d::mesh::counts_t& face_counts = polyhedra.face_counts.create(new k3d::mesh::counts_t(1, rows * columns));\n\t\tk3d::mesh::polyhedra_t::types_t& types = polyhedra.types.create(new k3d::mesh::polyhedra_t::types_t(1, k3d::mesh::polyhedra_t::POLYGONS));\n\t\tk3d::mesh::materials_t& face_materials = polyhedra.face_materials.create(new k3d::mesh::materials_t(rows * columns, m_material.pipeline_value()));\n\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Topology:init\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Topology:DeviceAllocate\");\n\n\t\tm_p_output_device_mesh.pipeline_value()->resize_points_and_selection((rows+1)*(columns+1));\n\t\tm_p_output_device_mesh.pipeline_value()->get_device_polyhedra().resize_faces(rows*columns, true);\n\t\tm_p_output_device_mesh.pipeline_value()->get_device_polyhedra().resize_loops(rows*columns, true);\n\t\tm_p_output_device_mesh.pipeline_value()->get_device_polyhedra().resize_edges(4*rows*columns, true);\n\n\t\tsynchronize_threads();\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Topology:DeviceAllocate\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Topology:Kernel\");\n\t\tcreate_grid_structure_kernel_entry (\n\t\t\t\t\t\t\t\t\t\t\t(unsigned int*)m_p_output_device_mesh.pipeline_value()->get_device_polyhedra().get_per_face_first_loops_pointer(),\n\t\t\t\t\t\t\t\t\t\t\t(unsigned int*)m_p_output_device_mesh.pipeline_value()->get_device_polyhedra().get_per_face_loop_counts_pointer(),\n\t\t\t\t\t\t\t\t\t\t\t(unsigned int*)m_p_output_device_mesh.pipeline_value()->get_device_polyhedra().get_per_loop_first_edges_pointer(),\n\t\t\t\t\t\t\t\t\t\t\t(unsigned int*)m_p_output_device_mesh.pipeline_value()->get_device_polyhedra().get_per_edge_points_pointer(),\n\t\t\t\t\t\t\t\t\t\t\t(unsigned int*)m_p_output_device_mesh.pipeline_value()->get_device_polyhedra().get_per_edge_clockwise_edges_pointer(),\n\t\t\t\t\t\t\t\t\t\t\trows,\n\t\t\t\t\t\t\t\t\t\t\tcolumns);\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Topology:Kernel\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Topology:Copy\");\n\t\tm_p_output_device_mesh.pipeline_value()->copy_from_device ( Output, POLYHEDRA_ALL_FACES + POLYHEDRA_ALL_LOOPS + POLYHEDRA_ALL_EDGES );\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Topology:Copy\");\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Geometry:init\");\n\t\tconst float width = (float)m_width.pipeline_value();\n\t\tconst float height = (float)m_height.pipeline_value();\n\t\tconst k3d::signed_axis orientation = m_orientation.pipeline_value();\n\n\t\tk3d::uint32_t rows = m_rows.pipeline_value();\n\t\tk3d::uint32_t columns = m_columns.pipeline_value();\n\n\t\tfloat xf[3] = {0, 0, 0};\n\t\tfloat yf[3] = {0, 0, 0};\n\n\t\tswitch(orientation)\n\t\t{\n\t\t\tcase k3d::PX:\n\t\t\t\txf[1] = -width;\n\t\t\t\tyf[2] = height;\n\t\t\t\tbreak;\n\t\t\tcase k3d::NX:\n\t\t\t\txf[1] = width;\n\t\t\t\tyf[2] = height;\n\t\t\t\tbreak;\n\t\t\tcase k3d::NY:\n\t\t\t\txf[0] = -width;\n\t\t\t\tyf[2] = height;\n\t\t\t\tbreak;\n\t\t\tcase k3d::PY:\n\t\t\t\txf[0] = width;\n\t\t\t\tyf[2] = height;\n\t\t\t\tbreak;\n\t\t\tcase k3d::PZ:\n\t\t\t\txf[0] = -width;\n\t\t\t\tyf[1] = height;\n\t\t\t\tbreak;\n\t\t\tcase k3d::NZ:\n\t\t\t\txf[0] = width;\n\t\t\t\tyf[1] = height;\n\t\t\t\tbreak;\n\t\t}\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Geometry:init\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Geometry:Kernel\");\n\t\tcalculate_grid_points_kernel_entry (m_p_output_device_mesh.pipeline_value()->get_points_and_selection_pointer(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\txf,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyf,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trows,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumns\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Geometry:Kernel\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Geometry:Transform Points\");\n\n\t\tm_p_output_device_mesh.pipeline_value()->select_all_points();\n\t\tconst k3d::matrix4 Transformation = m_input_matrix.pipeline_value();\n\n\t\tint num_points = m_p_output_device_mesh.pipeline_value()->get_number_of_points();\n\t\tvoid *cuda_array = NULL;\n\n\t\t// first convert the double precision mesh points to single precision for the GPU\n\t\t// use 3 floats for the points, and a 4th for the selection weight\n\t\t// a 4 x 4 matrix of floats\n\t\tfloat *float_transformation = (float*) malloc ( 64 );\n\n\t\tfloat_transformation[0] = Transformation[0][0];\n\t\tfloat_transformation[1] = Transformation[0][1];\n\t\tfloat_transformation[2] = Transformation[0][2];\n\t\tfloat_transformation[3] = Transformation[0][3];\n\t\tfloat_transformation[4] = Transformation[1][0];\n\t\tfloat_transformation[5] = Transformation[1][1];\n\t\tfloat_transformation[6] = Transformation[1][2];\n\t\tfloat_transformation[7] = Transformation[1][3];\n\t\tfloat_transformation[8] = Transformation[2][0];\n\t\tfloat_transformation[9] = Transformation[2][1];\n\t\tfloat_transformation[10] = Transformation[2][2];\n\t\tfloat_transformation[11] = Transformation[2][3];\n\t\tfloat_transformation[12] = Transformation[3][0];\n\t\tfloat_transformation[13] = Transformation[3][1];\n\t\tfloat_transformation[14] = Transformation[3][2];\n\t\tfloat_transformation[15] = Transformation[3][3];\n\t\tcopy_and_bind_texture_to_array( &cuda_array, float_transformation, 4, 4 );\n\n\t\t// use the implementation that uses the device mesh\n\t\ttransform_points_device_mesh (m_p_output_device_mesh.pipeline_value()->get_points_and_selection_pointer() , num_points);\n\n\n\t\tfree_CUDA_array ( cuda_array );\n\t\tfree ( float_transformation );\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Geometry:Transform Points\");\n\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Update Geometry:Copy\");\n\t\tm_p_output_device_mesh.pipeline_value()->copy_from_device ( Output, MESH_POINTS + MESH_SELECTION );\n\t\tdocument().pipeline_profiler().finish_execution(*this, \"Update Geometry:Copy\");\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cuda_mesh_poly_grid_and_transform, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0x37a67c9d, 0x504dae59, 0xa4967c95, 0xdb261ca6),\n\t\t\t\"CUDAPolyGridAndTransformPoints\",\n\t\t\t_(\"Generates a polygonal grid and applies a transform points filter using the CUDA API\"),\n\t\t\t\"CUDAPolygon\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_columns;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_rows;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::signed_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_orientation;\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input_matrix;\n\n\tk3d_data(cuda_device_mesh*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_p_output_device_mesh;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_mesh_poly_grid_and_transform_factory\n\nk3d::iplugin_factory& cuda_mesh_poly_grid_and_transform_factory()\n{\n\treturn cuda_mesh_poly_grid_and_transform::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/cuda/cuda_mesh_simple_deformation_modifier.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Evan Lezar (evanlezar@gmail.com)\n */\n\n\n#include \"cuda_mesh_simple_deformation_modifier.h\"\n\nnamespace k3d\n{\n\ncuda_mesh_simple_deformation_modifier::cuda_mesh_simple_deformation_modifier(iplugin_factory& Factory, idocument& Document) :\n\tbase(Factory, Document),\n\tm_selection_changed(true),\n\tm_p_input_device_mesh(init_owner(*this) + init_name(\"input_device_mesh\") + init_label(_(\"Input Device Mesh\")) + init_description(_(\"Pointer to device mesh\")) + init_value<cuda_device_mesh*>(0))\n{\n\tm_mesh_selection.changed_signal().connect(sigc::mem_fun(*this, &cuda_mesh_simple_deformation_modifier::on_selection_changed));\n\tm_p_input_device_mesh.changed_signal().connect(make_reset_mesh_slot());\n}\n\nvoid cuda_mesh_simple_deformation_modifier::on_create_mesh(const mesh& Input, mesh& Output)\n{\n\tk3d::log() << debug << \"cuda_mesh_simple_deformation_modifier::on_create_mesh\" << std::endl;\n\n\tk3d::log() << debug << \"Device Pointer : \" << m_p_input_device_mesh.internal_value() << std::endl;\n\tm_p_input_device_mesh.pipeline_value()->output_debug_info();\n\n\t//Output = Input;\n\n\tm_selection_changed = true; // make sure we merge selection after the mesh has been recreated\n\tk3d::log() << debug << \"cuda_mesh_simple_deformation_modifier::on_create_mesh::DONE\" << std::endl;\n}\n\nvoid cuda_mesh_simple_deformation_modifier::on_update_mesh(const mesh& Input, mesh& Output)\n{\n\tk3d::log() << debug << \"cuda_mesh_simple_deformation_modifier::on_update_mesh\" << std::endl;\n\n\tm_p_input_device_mesh.pipeline_value()->output_debug_info();\n\n\tif(m_selection_changed)\n\t{\n\t\t// simply select all the points on the device mesh\n\t\tm_p_input_device_mesh.pipeline_value()->select_all_points();\n\t\tm_selection_changed = false;\n\t}\n\n\ton_deform_mesh(Output);\n\n\tk3d::log() << debug << \"cuda_mesh_simple_deformation_modifier::on_update_mesh::DONE\" << std::endl;\n}\n\nvoid cuda_mesh_simple_deformation_modifier::on_selection_changed(ihint* Hint)\n{\n\tk3d::log() << debug << \"cuda_mesh_simple_deformation_modifier::on_selection_changed\" << std::endl;\n\tm_selection_changed = true;\n\tk3d::log() << debug << \"cuda_mesh_simple_deformation_modifier::on_selection_changed::DONE\" << std::endl;\n}\n\n} // namespace k3d\n\n"
  },
  {
    "path": "modules/cuda/cuda_mesh_simple_deformation_modifier.h",
    "content": "#ifndef MODULES_CUDA_CUDA_MESH_SIMPLE_DEFORMATION_MODIFIER_H\n#define MODULES_CUDA_CUDA_MESH_SIMPLE_DEFORMATION_MODIFIER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Evan Lezar (evanlezar@gmail.com)\n */\n\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/pointer_demand_storage.h>\n\n#include \"cuda_device_mesh.h\"\n\nnamespace k3d\n{\n\n/// Mesh modifier implementation for use in plugins that deform a mesh (modify its points) without altering topology, and based solely on the input point positions and selection.  To create a plugin, derive from mesh_simple_deformation_modifier and implement the on_deform_mesh() method.  If you are only modifying points but need more information about the input mesh, consider using mesh_deformation_modifier instead.\nclass cuda_mesh_simple_deformation_modifier :\n\tpublic mesh_selection_sink<mesh_modifier<node > >\n{\n\ttypedef mesh_selection_sink<mesh_modifier<node > > base;\n\npublic:\n\tcuda_mesh_simple_deformation_modifier(iplugin_factory& Factory, idocument& Document);\n\nprivate:\n\tvoid on_create_mesh(const mesh& Input, mesh& Output);\n\tvoid on_update_mesh(const mesh& Input, mesh& Output);\n\n\t/// Executed when the selection changed\n\tvoid on_selection_changed(ihint* Hint);\n\n\t/// Implement this method in derived classes and deform the output mesh using its input points and selection.\n\tvirtual void on_deform_mesh(mesh& Output) = 0;\n\n\t/// True if the selection changed\n\tbool_t m_selection_changed;\n\nprotected:\n\t/// A shared pointer to store the device version of the input mesh\n\tk3d_data(cuda_device_mesh*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_p_input_device_mesh;\n};\n\n} // namespace k3d\n\n#endif // !MODULES_CUDA_CUDA_MESH_SIMPLE_DEFORMATION_MODIFIER_H\n\n"
  },
  {
    "path": "modules/cuda/cuda_mesh_subdivide_edges.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2008 Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n        \\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/vectors.h>\n\n#include <k3d-platform-config.h>\n\n#include \"cuda_device_mesh.h\"\n#include \"cuda_mesh_topology_data.h\"\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace cuda\n{\n\nnamespace detail\n{\n\ntypedef std::vector<k3d::uint32_t> indices_t;\n\n/// Copies and interpolates the varying data as needed (serial usage only)\nclass varying_data_copier\n{\npublic:\n    varying_data_copier(const k3d::mesh::points_t Points,\n            const k3d::mesh::indices_t& EdgePoints,\n            const k3d::mesh::indices_t& ClockwiseEdges,\n            const indices_t& Companions,\n            const k3d::mesh::bools_t& BoundaryEdges,\n            const k3d::mesh::bools_t& HasMidpoint,\n            const k3d::uint_t SplitPointCount,\n            k3d::table_copier& Copier) :\n                m_points(Points),\n                m_edge_points(EdgePoints),\n                m_clockwise_edges(ClockwiseEdges),\n                m_companions(Companions),\n                m_boundary_edges(BoundaryEdges),\n                m_has_midpoint(HasMidpoint),\n                m_split_point_count(SplitPointCount),\n                m_copier(Copier)\n            {}\n\n    void operator()(const k3d::uint_t Edge)\n    {\n        m_copier.push_back(Edge);\n        if(m_has_midpoint[Edge] || (!m_boundary_edges[Edge] && m_has_midpoint[m_companions[Edge]]))\n        {\n            const k3d::uint_t clockwise = m_clockwise_edges[Edge];\n            const k3d::uint_t indices[] = {Edge, clockwise};\n            const k3d::point3& start_point = m_points[m_edge_points[Edge]];\n            const k3d::point3& end_point = m_points[m_edge_points[Edge]];\n            const k3d::double_t weight_step = 1.0 / static_cast<double>(m_split_point_count + 1);\n            for(k3d::uint_t i = 1; i <= m_split_point_count; ++i)\n            {\n                const k3d::double_t last_weight = weight_step * static_cast<k3d::double_t>(i);\n                const k3d::double_t weights[] = {1 - last_weight, last_weight};\n                m_copier.push_back(2, indices, weights);\n            }\n        }\n    }\n\nprivate:\n    const k3d::mesh::points_t m_points;\n    const k3d::mesh::indices_t& m_edge_points;\n    const k3d::mesh::indices_t& m_clockwise_edges;\n    const indices_t& m_companions;\n    const k3d::mesh::bools_t& m_boundary_edges;\n    const k3d::mesh::bools_t& m_has_midpoint;\n    const k3d::uint_t m_split_point_count;\n    k3d::table_copier& m_copier;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_mesh_subdivide_edges\n\nclass cuda_mesh_subdivide_edges :\n    public k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n    typedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n    cuda_mesh_subdivide_edges(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n        base(Factory, Document),\n        m_vertices(init_owner(*this) + init_name(\"vertices\") + init_label(_(\"Vertices\")) + init_description(_(\"Number of vertices to insert in each selected edge\")) + init_value(1L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n        m_p_output_device_mesh(),\n        m_p_input_device_mesh(),\n        m_pdev_first_midpoint(0),\n        m_pdev_has_midpoint(0),\n        m_pdev_companions(0),\n        m_pdev_boundary_edges(0),\n        m_pdev_edge_faces(0),\n        m_pdev_input_edge_selection(0)\n    {\n        m_vertices.changed_signal().connect(make_reset_mesh_slot());\n        m_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n    }\n\n    ~cuda_mesh_subdivide_edges()\n    {\n    \tif ( m_pdev_first_midpoint )\n    \t{\n    \t\tfree_device_memory ( (void*) m_pdev_first_midpoint );\n    \t\tfree_device_memory((void*) m_pdev_has_midpoint);\n\t\t\t\tfree_device_memory((void*) m_pdev_companions);\n\t\t\t\tfree_device_memory((void*) m_pdev_boundary_edges);\n\t\t\t\tfree_device_memory((void*) m_pdev_edge_faces);\n\t\t\t\tfree_device_memory((void*) m_pdev_input_edge_selection);\n    \t}\n    }\n\n    void on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n    {\n    \tif ( m_pdev_first_midpoint )\n\t\t\t{\n\t\t\t\tfree_device_memory ( (void*) m_pdev_first_midpoint );\n\t\t\t\tfree_device_memory((void*) m_pdev_has_midpoint);\n\t\t\t\tfree_device_memory((void*) m_pdev_companions);\n\t\t\t\tfree_device_memory((void*) m_pdev_boundary_edges);\n\t\t\t\tfree_device_memory((void*) m_pdev_edge_faces);\n\t\t\t\tfree_device_memory((void*) m_pdev_input_edge_selection);\n\t\t\t\tsynchronize_threads();\n\t\t\t}\n\n        // If there are no valid polyhedra, we give up\n        document().pipeline_profiler().start_execution(*this, \"Create:Validate input\");\n        boost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Input));\n        if(!polyhedron)\n        {\n            document().pipeline_profiler().finish_execution(*this, \"Create:Validate input\");\n            return;\n        }\n        // should move up\n        m_p_input_device_mesh.reset ( new cuda_device_mesh ( Input) );\n        m_p_input_device_mesh->copy_to_device( ); // TODO:  Selectively copy parts of mesh\n\n        document().pipeline_profiler().finish_execution(*this, \"Create:Validate input\");\n\n        // Shallow copy of the input (no data is copied, only shared pointers are)\n        document().pipeline_profiler().start_execution(*this, \"Merge selection\");\n        Output = Input;\n        k3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output); // Merges the current document selection with the mesh\n        document().pipeline_profiler().finish_execution(*this, \"Merge selection\");\n\n        k3d::mesh::polyhedra_t& polyhedra = Output.polyhedra.writable();\n\n        document().pipeline_profiler().start_execution(*this, \"Calculate companions\");\n\n        const k3d::uint_t split_point_count = m_vertices.pipeline_value();\n        const k3d::uint_t old_edge_count = Input.polyhedra->edge_points->size();\n\n        allocate_device_memory((void**)&m_pdev_companions, old_edge_count*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&m_pdev_boundary_edges, old_edge_count*sizeof(unsigned char));\n\n        k3d::cuda_create_edge_adjacency_lookup(m_p_input_device_mesh->get_polyhedra_edge_point_indices_pointer(), m_p_input_device_mesh->get_device_polyhedra().get_per_edge_clockwise_edges_pointer(), m_pdev_boundary_edges, m_pdev_companions, old_edge_count, Input.points->size());\n\n        document().pipeline_profiler().finish_execution(*this, \"Calculate companions\");\n\n\t\tdocument().pipeline_profiler().start_execution(*this, \"Calculate indices\");\n\n        k3d::uint32_t* pdev_index_map;\n        \n        // allocate the device memory\n        allocate_device_memory((void**)&pdev_index_map, old_edge_count*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&m_pdev_edge_faces, old_edge_count*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&m_pdev_first_midpoint, old_edge_count*sizeof(k3d::uint32_t));\n        allocate_device_memory((void**)&m_pdev_has_midpoint, old_edge_count*sizeof(unsigned char));\n        allocate_device_memory((void**)&m_pdev_input_edge_selection, old_edge_count*sizeof(float));\n        set_device_memory((void*)m_pdev_has_midpoint, 0, old_edge_count*sizeof(unsigned char));\n\n        m_p_output_device_mesh.reset( new cuda_device_mesh ( Output ) );\n        m_p_output_device_mesh->copy_to_device(POLYHEDRA_ALL_EDGES+MESH_POINTS+MESH_SELECTION+POLYHEDRA_ALL_LOOPS);\n\n        k3d::uint32_t new_edge_count;\n        k3d::uint32_t new_point_count;\n        \n        edge_index_calculator_entry (\n\t\t\t\t\t\t\t\t\t(unsigned int*) m_pdev_first_midpoint,\n\t\t\t\t\t\t\t\t\tm_pdev_has_midpoint,\n\t\t\t\t\t\t\t\t\tpdev_index_map,\n\t\t\t\t\t\t\t\t\tm_pdev_edge_faces,\n\t\t\t\t\t\t\t\t\t(const unsigned int*)m_p_input_device_mesh->get_device_polyhedra().get_per_face_first_loops_pointer(),\n\t\t\t\t\t\t\t\t\t(const unsigned int*)m_p_input_device_mesh->get_device_polyhedra().get_per_face_loop_counts_pointer(),\n\t\t\t\t\t\t\t\t\t(const unsigned int*)m_p_input_device_mesh->get_device_polyhedra().get_per_loop_first_edges_pointer(),\n\t\t\t\t\t\t\t\t\t(const unsigned int*)m_p_input_device_mesh->get_device_polyhedra().get_per_edge_clockwise_edges_pointer(),\n\t\t\t\t\t\t\t\t\tm_p_output_device_mesh->get_device_polyhedra().get_per_edge_selection_pointer(),\n\t\t\t\t\t\t\t\t\t(const unsigned int*) m_pdev_companions,\n\t\t\t\t\t\t\t\t\t(const unsigned char*) m_pdev_boundary_edges,\n\t\t\t\t\t\t\t\t\tsplit_point_count,\n\t\t\t\t\t\t\t\t\tInput.polyhedra->face_first_loops->size(),\n\t\t\t\t\t\t\t\t\tInput.points->size(),\n\t\t\t\t\t\t\t\t\t&new_point_count,\n\t\t\t\t\t\t\t\t\t&new_edge_count\n\t\t\t\t\t\t\t\t\t);\n\n        document().pipeline_profiler().finish_execution(*this, \"Calculate indices\");\n        \n        document().pipeline_profiler().start_execution(*this, \"Allocate memory\");\n        \n\t\t\t\t// Store a copy of the original selection\n        copy_from_device_to_device(m_pdev_input_edge_selection, m_p_output_device_mesh->get_device_polyhedra().get_per_edge_selection_pointer(), old_edge_count * sizeof(float));\n        m_p_output_device_mesh->get_device_polyhedra().resize_edges(new_edge_count, true);\n\n        document().pipeline_profiler().finish_execution(*this, \"Allocate memory\");\n\n        document().pipeline_profiler().start_execution(*this, \"Update indices\");\n\n        m_p_output_device_mesh->resize_points_and_selection ( new_point_count + Input.points->size(), 1.0 );\n\n        subdivide_edges_update_indices_entry ((unsigned int*)m_p_input_device_mesh->get_polyhedra_edge_point_indices_pointer(),\n                                              (unsigned int*)m_p_input_device_mesh->get_polyhedra_clockwise_edge_point_indices_pointer(),\n                                              (unsigned int) Input.polyhedra->edge_points->size(),\n                                              (unsigned int*)(m_p_output_device_mesh->get_polyhedra_edge_point_indices_pointer()),\n                                              (unsigned int*)(m_p_output_device_mesh->get_polyhedra_clockwise_edge_point_indices_pointer()),\n                                              pdev_index_map,\n                                              old_edge_count);// index_map.size = old_edge_count\n\n        subdivide_edges_update_loop_first_edges_entry ((unsigned int*)m_p_output_device_mesh->get_polyhedra_loop_first_edges_pointer(),\n                                                 (unsigned int)Input.polyhedra->loop_first_edges->size(),\n                                                 pdev_index_map,\n                                                 old_edge_count);// index_map.size = old_edge_count\n\n\n        document().pipeline_profiler().finish_execution(*this, \"Update indices\");\n\n\n        document().pipeline_profiler().start_execution(*this, \"Split edges\");\n\n        subdivide_edges_split_edges_entry ((unsigned int*)(m_p_output_device_mesh->get_polyhedra_edge_point_indices_pointer()),\n                                           (unsigned int*)(m_p_output_device_mesh->get_polyhedra_clockwise_edge_point_indices_pointer()),\n                                           (unsigned int*)m_p_input_device_mesh->get_polyhedra_clockwise_edge_point_indices_pointer(),\n                                           m_pdev_input_edge_selection,\n                                           pdev_index_map,\n                                           m_pdev_first_midpoint,\n                                           m_pdev_has_midpoint,\n                                           (unsigned int)m_vertices.pipeline_value(),\n                                           m_pdev_companions,\n                                           m_pdev_boundary_edges,\n                                           Input.polyhedra->edge_points->size(),\n                                           m_pdev_edge_faces\n                                           );\n\n        synchronize_threads();\n\n\n        polyhedra.clockwise_edges.reset();\n        polyhedra.edge_points.reset();\n        polyhedra.edge_selection.reset();\n        polyhedra.loop_first_edges.reset();\n\n        m_p_output_device_mesh->copy_from_device( Output, POLYHEDRA_ALL_EDGES + POLYHEDRA_ALL_LOOPS);\n\n\n        free_device_memory ( pdev_index_map );\n\n        document().pipeline_profiler().finish_execution(*this, \"Split edges\");\n\n        polyhedra.constant_data = Input.polyhedra->constant_data;\n        polyhedra.uniform_data = Input.polyhedra->uniform_data;\n    }\n\n    void on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n    {\n        document().pipeline_profiler().start_execution(*this, \"Update:Validate input\");\n\n        boost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Input));\n\t\t\t\tif(!polyhedron)\n        {\n            document().pipeline_profiler().finish_execution(*this, \"Update:Validate input\");\n            return;\n        }\n        document().pipeline_profiler().finish_execution(*this, \"Update:Validate input\");\n\n        document().pipeline_profiler().start_execution(*this, \"Calculate positions\");\n        \n        subdivide_edges_split_point_calculator ( m_pdev_first_midpoint,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tm_pdev_has_midpoint,\n                                                m_p_output_device_mesh->get_points_and_selection_pointer(),\n                                                (unsigned int)Input.points->size(),\n                                                m_p_input_device_mesh->get_device_polyhedra().get_per_edge_points_pointer(),\n                                                m_p_input_device_mesh->get_device_polyhedra().get_per_edge_clockwise_edges_pointer(),\n                                                m_pdev_input_edge_selection,\n                                                m_pdev_companions,\n                                                m_pdev_boundary_edges,\n                                                m_pdev_edge_faces,\n                                                (unsigned int)m_vertices.pipeline_value(),\n                                                Input.polyhedra->edge_points->size());\n        document().pipeline_profiler().finish_execution(*this, \"Calculate positions\");\n\n        document().pipeline_profiler().start_execution(*this, \"Update:Copy\");\n        Output.points.reset();\n        Output.point_selection.reset();\n        m_p_output_device_mesh->copy_from_device ( Output, MESH_POINTS + MESH_SELECTION );\n\n        document().pipeline_profiler().finish_execution(*this, \"Update:Copy\");\n    }\n\n    static k3d::iplugin_factory& get_factory()\n    {\n        static k3d::document_plugin_factory<cuda_mesh_subdivide_edges,\n            k3d::interface_list<k3d::imesh_source,\n            k3d::interface_list<k3d::imesh_sink > > > factory(\n                k3d::uuid(0x7cf6b6b8, 0x154c3103, 0x2db817b2, 0x1319509a),\n                \"CUDASubdivideEdges\",\n                \"Subdivides edges by creating one or more vertices along selected edges using CUDA API\",\n                \"CUDAMesh\",\n                k3d::iplugin_factory::EXPERIMENTAL);\n\n        return factory;\n    }\n\nprivate:\n    k3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_vertices;\n\n    // Cache the midpoints, for fast updating\n    //detail::indices_t m_edge_list;\n\n    k3d::uint32_t* m_pdev_first_midpoint;\n    unsigned char* m_pdev_has_midpoint;\n    k3d::uint32_t* m_pdev_companions;\n    unsigned char* m_pdev_boundary_edges;\n    k3d::uint32_t* m_pdev_edge_faces; // For each edge, store the face it belongs to. Filled by edge_index_calculator_entry.\n    float* m_pdev_input_edge_selection;\n    boost::shared_ptr<cuda_device_mesh> m_p_output_device_mesh;\n    boost::shared_ptr<cuda_device_mesh> m_p_input_device_mesh;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cuda_mesh_subdivide_edges_factory\n\nk3d::iplugin_factory& cuda_mesh_subdivide_edges_factory()\n{\n    return cuda_mesh_subdivide_edges::get_factory();\n}\n\n} // namespace cuda\n\n} // namespace module\n"
  },
  {
    "path": "modules/cuda/cuda_mesh_topology_data.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Declares structures to add extra \"convenience\" data to a mesh\n * \t\tFrom k3dsdk/mesh_topology data.  CUDA implementation\n\t\\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include \"cuda_mesh_topology_data.h\"\n#include \"cuda_entry_points.h\"\n\n#include <k3dsdk/parallel/blocked_range.h>\n#include <k3dsdk/parallel/parallel_for.h>\n#include <k3dsdk/parallel/threads.h>\n\nnamespace k3d\n{\n\nnamespace detail\n{\n\nvoid cuda_find_companion_worker(const mesh::indices_t& EdgePoints,\n\t\t\t\t\t\t\t\tconst mesh::indices_t& ClockwiseEdges,\n\t\t\t\t\t\t\t\tconst mesh::counts_t& Valences,\n\t\t\t\t\t\t\t\tconst mesh::indices_t& FirstEdges,\n\t\t\t\t\t\t\t\tconst mesh::indices_t& PointEdges,\n\t\t\t\t\t\t\t\tmesh::bools_t& BoundaryEdges,\n\t\t\t\t\t\t\t\tmesh::indices_t& AdjacentEdges);\n\nclass find_companion_worker\n{\npublic:\n\tfind_companion_worker(const mesh::indices_t& EdgePoints,\n\t\t\tconst mesh::indices_t& ClockwiseEdges,\n\t\t\tconst mesh::counts_t& Valences,\n\t\t\tconst mesh::indices_t& FirstEdges,\n\t\t\tconst mesh::indices_t& PointEdges,\n\t\t\tmesh::bools_t& BoundaryEdges,\n\t\t\tmesh::indices_t& AdjacentEdges) :\n\t\t\t\tm_edge_points(EdgePoints),\n\t\t\t\tm_clockwise_edges(ClockwiseEdges),\n\t\t\t\tm_valences(Valences),\n\t\t\t\tm_first_edges(FirstEdges),\n\t\t\t\tm_point_edges(PointEdges),\n\t\t\t\tm_boundary_edges(BoundaryEdges),\n\t\t\t\tm_adjacent_edges(AdjacentEdges)\n\t\t\t{}\n\n\tvoid operator()(const k3d::parallel::blocked_range<k3d::uint_t>& range) const\n\t{\n\t\tconst k3d::uint_t edge_begin = range.begin();\n\t\tconst k3d::uint_t edge_end = range.end();\n\t\tfor(size_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t{\n\t\t\tconst uint_t vertex1 = m_edge_points[edge];\n\t\t\tconst uint_t vertex2 = m_edge_points[m_clockwise_edges[edge]];\n\t\t\t/// Calculates the split points positions for each edge\n\n\t\t\tconst uint_t first_index = m_first_edges[vertex2];\n\t\t\tconst uint_t last_index = first_index + m_valences[vertex2];\n\t\t\tfor(uint_t i = first_index; i != last_index; ++i)\n\t\t\t{\n\t\t\t\tconst uint_t companion = m_point_edges[i];\n\t\t\t\tif(m_edge_points[m_clockwise_edges[companion]] == vertex1)\n\t\t\t\t{\n\t\t\t\t\tm_boundary_edges[edge] = false;\n\t\t\t\t\tm_adjacent_edges[edge] = companion;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nprivate:\n\tconst mesh::indices_t& m_edge_points;\n\tconst mesh::indices_t& m_clockwise_edges;\n\tconst mesh::counts_t& m_valences;\n\tconst mesh::indices_t& m_first_edges;\n\tconst mesh::indices_t& m_point_edges;\n\tmesh::bools_t& m_boundary_edges;\n\tmesh::indices_t& m_adjacent_edges;\n};\n\n} // namespace detail\n\nvoid cuda_create_edge_adjacency_lookup(const k3d::uint32_t* pdev_edgePoints, const k3d::uint32_t* pdev_clockwiseEdges, unsigned char* pdev_boundaryEdges, k3d::uint32_t* pdev_adjacentEdges, int num_edges, int num_points)\n{\n\tk3d::uint32_t* pdev_valences;\n\tk3d::uint32_t* pdev_found_edges;\n\tk3d::uint32_t* pdev_first_edges;\n\tk3d::uint32_t* pdev_point_edges;\n\t// since it is not known how many valence points the edges refer to, allocate maximum (all edges disconnected)\n\tallocate_device_memory((void**)&pdev_valences, num_edges*2*sizeof(k3d::uint32_t));\n\n\tint valence_size = create_vertex_valence_lookup_kernel_entry ( pdev_valences, (const unsigned int*)pdev_edgePoints, num_edges );\n\n\n\tallocate_device_memory((void**)&pdev_first_edges, valence_size*sizeof(k3d::uint32_t));\n\n\tallocate_device_memory((void**)&pdev_found_edges, valence_size*sizeof(k3d::uint32_t));\n\tallocate_device_memory((void**)&pdev_point_edges, num_edges*sizeof(k3d::uint32_t));\n\n\tsynchronize_threads();\n\tcalculate_first_edge_entry ( (unsigned int*)pdev_first_edges, ( const unsigned int*)pdev_valences, valence_size );\n\n\tcalculate_point_edges_entry ((unsigned int*) pdev_point_edges,\n\t\t\t\t\t\t\t\t(unsigned int*) pdev_found_edges,\n\t\t\t\t\t\t\t\t(const unsigned int*) pdev_edgePoints,\n\t\t\t\t\t\t\t\t(const unsigned int*) pdev_first_edges,\n\t\t\t\t\t\t\t\tnum_edges,\n\t\t\t\t\t\t\t\tvalence_size);\n\n\tfind_companion_kernel_entry ( pdev_boundaryEdges,\n\t\t\t\t\t\t\t\t  pdev_adjacentEdges,\n\t\t\t\t\t\t\t\t  num_edges,\n\t\t\t\t\t\t\t\t  pdev_edgePoints,\n\t\t\t\t\t\t\t\t  pdev_clockwiseEdges,\n\t\t\t\t\t\t\t\t  pdev_first_edges,\n\t\t\t\t\t\t\t\t  (unsigned int*) pdev_valences,\n\t\t\t\t\t\t\t\t  pdev_point_edges );\n\n\tfree_device_memory(pdev_valences);\n\tfree_device_memory(pdev_found_edges);\n\tfree_device_memory(pdev_first_edges);\n\tfree_device_memory(pdev_point_edges);\n\n}\n\nvoid create_edge_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& ClockwiseEdges, mesh::indices_t& EdgeFaces)\n{\n\tEdgeFaces.assign(ClockwiseEdges.size(), 0);\n\n\tconst size_t face_begin = 0;\n\tconst size_t face_end = face_begin + FaceFirstLoops.size();\n\tfor(size_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tconst size_t loop_begin = FaceFirstLoops[face];\n\t\tconst size_t loop_end = loop_begin + FaceLoopCounts[face];\n\t\tfor(size_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst size_t first_edge = LoopFirstEdges[loop];\n\t\t\tfor(size_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\tEdgeFaces[edge] = face;\n\n\t\t\t\tedge = ClockwiseEdges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid create_vertex_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& EdgePoints, const mesh::indices_t& ClockwiseEdges, const mesh::points_t& Points, mesh::indices_t& PointFirstFaces, mesh::counts_t& PointFaceCounts, mesh::indices_t& PointFaces)\n{\n\tstd::vector<std::vector<size_t> > adjacency_list(Points.size());\n\n\tconst size_t face_begin = 0;\n\tconst size_t face_end = face_begin + FaceFirstLoops.size();\n\tfor(size_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tconst size_t loop_begin = FaceFirstLoops[face];\n\t\tconst size_t loop_end = loop_begin + FaceLoopCounts[face];\n\t\tfor(size_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst size_t first_edge = LoopFirstEdges[loop];\n\t\t\tfor(size_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\tadjacency_list[EdgePoints[edge]].push_back(face);\n\n\t\t\t\tedge = ClockwiseEdges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tPointFirstFaces.assign(Points.size(), 0);\n\tPointFaceCounts.assign(Points.size(), 0);\n\tPointFaces.clear();\n\n\tconst size_t point_begin = 0;\n\tconst size_t point_end = point_begin + Points.size();\n\tfor(size_t point = point_begin; point != point_end; ++point)\n\t{\n\t\tPointFirstFaces[point] = PointFaces.size();\n\t\tPointFaceCounts[point] = adjacency_list[point].size();\n\t\tPointFaces.insert(PointFaces.end(), adjacency_list[point].begin(), adjacency_list[point].end());\n\t}\n}\n\nvoid create_vertex_valence_lookup(const uint_t PointCount, const mesh::indices_t& EdgePoints, mesh::counts_t& Valences)\n{\n\tValences.assign(PointCount, 0);\n\n\t// Add 1 for each edge that starts at a point\n\tuint_t edge_count = EdgePoints.size();\n\tfor (uint_t edge = 0; edge != edge_count; ++edge)\n\t{\n\t\tconst uint_t edge_point = EdgePoints[edge];\n\t\tif(edge_point >= Valences.size()) // In case PointCount was not known to the caller\n\t\t\tValences.resize(edge_point + 1, 0);\n\t\t++Valences[edge_point];\n\t}\n}\n\nvoid create_boundary_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& ClockwiseEdges, const mesh::bools_t& BoundaryEdges, const mesh::indices_t& AdjacentEdges, mesh::bools_t& BoundaryFaces)\n{\n\tBoundaryFaces.clear();\n\tBoundaryFaces.resize(FaceFirstLoops.size());\n\n\tconst size_t face_begin = 0;\n\tconst size_t face_end = face_begin + FaceFirstLoops.size();\n\tfor(size_t face = face_begin; face != face_end; ++face)\n\t{\n\t\tconst size_t loop_begin = FaceFirstLoops[face];\n\t\tconst size_t loop_end = loop_begin + FaceLoopCounts[face];\n\t\tfor(size_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst size_t first_edge = LoopFirstEdges[loop];\n\t\t\tfor(size_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\tif (BoundaryEdges[edge])\n\t\t\t\t{\n\t\t\t\t\tBoundaryFaces[face] = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tedge = ClockwiseEdges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n} // namespace k3d\n"
  },
  {
    "path": "modules/cuda/cuda_mesh_topology_data.h",
    "content": "#ifndef MODULES_CUDA_CUDA_MESH_TOPOLOGY_DATA_H\n#define MODULES_CUDA_CUDA_MESH_TOPOLOGY_DATA_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Declares structures to add extra \"convenience\" data to a mesh\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/mesh.h>\n\ntypedef k3d::typed_array<unsigned char> cuda_bools_t;\n\nnamespace k3d\n{\n\n/// Initializes arrays for constant-time lookup from an edge to the adjacent edge (if any)\nvoid cuda_create_edge_adjacency_lookup(const k3d::uint32_t* pdev_edgePoints, const k3d::uint32_t* pdev_clockwiseEdges, unsigned char* pdev_boundaryEdges, k3d::uint32_t* pdev_adjacentEdges, int num_edges, int num_points);\n\n/// Initializes an array for constant-time lookup from an edge to the face that owns it\nvoid create_edge_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& ClockwiseEdges, mesh::indices_t& EdgeFaces);\n\n/// Initialize arrays for fast lookup from a vertex to its adjacent faces\nvoid create_vertex_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& EdgePoints, const mesh::indices_t& ClockwiseEdges, const mesh::points_t& Points, mesh::indices_t& PointFirstFaces, mesh::counts_t& PointFaceCounts, mesh::indices_t& PointFaces);\n\n/// Initialize Valences array for constant time lookup of vertex valence (number of incoming edges)\n/**\n * \\param PointCount Initial guess for the number of points. Valences will be expanded to the correct size if this is too small\n * \\param EdgePoints The indices of the edge points\n * \\param Valences will store the number of edges for each point\n */\nvoid create_vertex_valence_lookup(const uint_t PointCount, const mesh::indices_t& EdgePoints, mesh::counts_t& Valences);\n\n/// Initialise boundary_faces array for constant time lookup of faces that are on the mesh boundary. BoundaryEdges and AdjacentEdges can be created using create_edge_adjacency_lookup\nvoid create_boundary_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& ClockwiseEdges, const mesh::bools_t& BoundaryEdges, const mesh::indices_t& AdjacentEdges, mesh::bools_t& BoundaryFaces);\n\n} // namespace k3d\n\n#endif // !MODULES_CUDA_CUDA_MESH_TOPOLOGY_DATA_H\n\n"
  },
  {
    "path": "modules/cuda/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file cuda module\n\t\\author Evan Lezar (evanlezar@gmail.com)\n*/\n\n#include <k3dsdk/module.h>\nnamespace module\n{\n\nnamespace cuda\n{\n// bitmap plugins\nextern k3d::iplugin_factory& cuda_bitmap_add_factory();\nextern k3d::iplugin_factory& cuda_bitmap_multiply_factory();\nextern k3d::iplugin_factory& cuda_bitmap_subtract_factory();\nextern k3d::iplugin_factory& cuda_bitmap_color_monochrome_factory();\nextern k3d::iplugin_factory& cuda_bitmap_gamma_factory();\nextern k3d::iplugin_factory& cuda_bitmap_invert_factory();\nextern k3d::iplugin_factory& cuda_bitmap_matte_colordiff_factory();\nextern k3d::iplugin_factory& cuda_bitmap_matte_invert_factory();\nextern k3d::iplugin_factory& cuda_bitmap_threshold_factory();\n// deformation plugins\nextern k3d::iplugin_factory& cuda_deformation_transform_points_factory();\nextern k3d::iplugin_factory& cuda_deformation_transform_points_asynchronous_factory();\n\n// mesh plugins\nextern k3d::iplugin_factory& cuda_mesh_subdivide_edges_factory();\nextern k3d::iplugin_factory& cuda_mesh_k3d_to_cuda_converter_factory();\nextern k3d::iplugin_factory& cuda_mesh_cuda_to_k3d_converter_factory();\n\nextern k3d::iplugin_factory& cuda_mesh_poly_grid_factory();\nextern k3d::iplugin_factory& cuda_mesh_poly_grid_and_transform_factory();\n\n} // namespace cuda\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\t// bitmap plugins\n\tRegistry.register_factory(module::cuda::cuda_bitmap_add_factory());\n\tRegistry.register_factory(module::cuda::cuda_bitmap_multiply_factory());\n\tRegistry.register_factory(module::cuda::cuda_bitmap_subtract_factory());\n\tRegistry.register_factory(module::cuda::cuda_bitmap_color_monochrome_factory());\n    Registry.register_factory(module::cuda::cuda_bitmap_gamma_factory());\n    Registry.register_factory(module::cuda::cuda_bitmap_invert_factory());\n    Registry.register_factory(module::cuda::cuda_bitmap_matte_colordiff_factory());\n    Registry.register_factory(module::cuda::cuda_bitmap_matte_invert_factory());\n    Registry.register_factory(module::cuda::cuda_bitmap_threshold_factory());\n\t// deformation plugins\n\tRegistry.register_factory(module::cuda::cuda_deformation_transform_points_factory());\n\tRegistry.register_factory(module::cuda::cuda_deformation_transform_points_asynchronous_factory());\n    // mesh plugins\n    Registry.register_factory(module::cuda::cuda_mesh_subdivide_edges_factory());\n    Registry.register_factory(module::cuda::cuda_mesh_k3d_to_cuda_converter_factory());\n    Registry.register_factory(module::cuda::cuda_mesh_cuda_to_k3d_converter_factory());\n    // mesh sources\n    Registry.register_factory(module::cuda::cuda_mesh_poly_grid_factory());\n    Registry.register_factory(module::cuda::cuda_mesh_poly_grid_and_transform_factory());\n\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/deformation/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-deformation)\nK3D_CREATE_MODULE_PROXY(k3d-deformation)\n\nTARGET_LINK_LIBRARIES(k3d-deformation k3dsdk-expression)\n"
  },
  {
    "path": "modules/deformation/bend_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Andy Gill (buzz@ucky.com)\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bend_points\n\nclass bend_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tbend_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_angle(init_owner(*this) + init_name(\"angle\") + init_label(_(\"Angle\")) + init_description(_(\"Bend angle\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_tightness(init_owner(*this) + init_name(\"tightness\") + init_label(_(\"Tightness\")) + init_description(_(\"Bend tightness\")) + init_value(0.6) + init_constraint(constraint::minimum<double>(0.0, constraint::maximum(1.0))) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_position(init_owner(*this) + init_name(\"position\") + init_label(_(\"Position\")) + init_description(_(\"Bend position\")) + init_value(0.5) + init_constraint(constraint::minimum<double>(0.0, constraint::maximum(1.0))) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_along(init_owner(*this) + init_name(\"along\") + init_label(_(\"Along\")) + init_description(_(\"Axis to bend along\")) + init_value(k3d::Z) + init_enumeration(k3d::axis_values())),\n\t\tm_around(init_owner(*this) + init_name(\"around\") + init_label(_(\"Around\")) + init_description(_(\"Axis to bend around\")) + init_value(k3d::X) + init_enumeration(k3d::axis_values()))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_angle.changed_signal().connect(make_update_mesh_slot());\n\t\tm_tightness.changed_signal().connect(make_update_mesh_slot());\n\t\tm_position.changed_signal().connect(make_update_mesh_slot());\n\t\tm_along.changed_signal().connect(make_update_mesh_slot());\n\t\tm_around.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tclass bend\n\t{\n\tpublic:\n\t\tbend(const k3d::point3& Origin, const k3d::point3& Min, const k3d::point3& Max, const k3d::axis Along, const k3d::axis Around, const double BendAngle, const double Tightness, const double JointPosition) :\n\t\t\tm_Origin(Origin),\n\t\t\tm_Min(Min),\n\t\t\tm_Max(Max),\n\t\t\tm_Along(Along),\n\t\t\tm_Around(Around),\n\t\t\tm_BendAngle(BendAngle),\n\t\t\tm_Tightness(Tightness),\n\t\t\tm_JointPosition(JointPosition),\n\t\t\tm_Size(Max - Min),\n\t\t\tm_Joint(k3d::mix(Min, Max, JointPosition)),\n\t\t\tm_Radius(1.0 - Tightness),\n\t\t\tm_JLower(k3d::mix(Min, Max, JointPosition - m_Radius))\n\t\t{\n\t\t}\n\n\t\tconst k3d::point3 operator()(k3d::point3 coords)\n\t\t{\n\t\t\tif(m_Along == m_Around || m_BendAngle == 0)\n\t\t\t\treturn coords;\n\n\t\t\tdouble delta = 0;\n\t\t\tdouble length = 0;\n\t\t\tk3d::vector3 axis;\n\t\t\tk3d::point3 offset;\n\t\t\tk3d::point3 pivot = m_Origin;\n\n\t\t\tswitch(m_Along)\n\t\t\t{\n\t\t\t\tcase k3d::X :\n\t\t\t\t\tif(m_Size[0] != 0)\n\t\t\t\t\t\tdelta = (coords[0] - m_Min[0]) / m_Size[0];\n\n\t\t\t\t\tlength = m_Size[0];\n\n\t\t\t\t\tif(delta > m_JointPosition - m_Radius && delta < m_JointPosition + m_Radius && m_BendAngle != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tcoords[0] = m_JLower[0];\n\t\t\t\t\t\tpivot[0] = m_JLower[0];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tm_Origin[0] = m_Joint[0];\n\n\t\t\t\t\tswitch(m_Around)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase k3d::X :\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase k3d::Y :\n\t\t\t\t\t\t\taxis = k3d::vector3(0, 1, 0);\n\t\t\t\t\t\t\toffset = k3d::point3(0, 0, -1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase k3d::Z:\n\t\t\t\t\t\t\taxis = k3d::vector3(0, 0, 1);\n\t\t\t\t\t\t\toffset = k3d::point3(0, 1, 0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\t\tcase k3d::Y :\n\t\t\t\t\tif(m_Size[1])\n\t\t\t\t\t\tdelta = (coords[1] - m_Min[1]) / m_Size[1];\n\n\t\t\t\t\tlength = m_Size[1];\n\n\t\t\t\t\tif(delta > m_JointPosition - m_Radius && delta < m_JointPosition + m_Radius && m_BendAngle != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tcoords[1] = m_JLower[1];\n\t\t\t\t\t\tpivot[1] = m_JLower[1];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tm_Origin[1] = m_Joint[1];\n\n\t\t\t\t\tswitch(m_Around)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase k3d::X :\n\t\t\t\t\t\t\taxis = k3d::vector3(1, 0, 0);\n\t\t\t\t\t\t\toffset = k3d::point3(0, 0, 1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase k3d::Y :\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase k3d::Z :\n\t\t\t\t\t\t\taxis = k3d::vector3(0, 0, 1);\n\t\t\t\t\t\t\toffset = k3d::point3(-1, 0, 0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t\tcase k3d::Z:\n\t\t\t\t\tif(m_Size[2])\n\t\t\t\t\t\tdelta = (coords[2] - m_Min[2]) / m_Size[2];\n\n\t\t\t\t\tlength = m_Size[2];\n\n\t\t\t\t\tif(delta > m_JointPosition - m_Radius && delta < m_JointPosition + m_Radius && m_BendAngle != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tcoords[2] = m_JLower[2];\n\t\t\t\t\t\tpivot[2] = m_JLower[2];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tm_Origin[2] = m_Joint[2];\n\n\t\t\t\t\tswitch(m_Around)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase k3d::X :\n\t\t\t\t\t\t\taxis = k3d::vector3(1, 0, 0);\n\t\t\t\t\t\t\toffset = k3d::point3(0, -1, 0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase k3d::Y :\n\t\t\t\t\t\t\taxis = k3d::vector3(0, 1, 0);\n\t\t\t\t\t\t\toffset = k3d::point3(1, 0, 0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase k3d::Z :\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(delta > m_JointPosition - m_Radius && delta < m_JointPosition + m_Radius && m_BendAngle != 0)\n\t\t\t{\n\t\t\t\tdouble d = (delta - (m_JointPosition - m_Radius)) / (m_Radius * 2.0);\n\t\t\t\tdouble factor = m_Radius * length / tan(m_BendAngle * 0.5);\n\t\t\t\tk3d::matrix4 rotation = k3d::rotate3(d * m_BendAngle, axis);\n\t\t\t\toffset = offset * factor;\n\t\t\t\tcoords -= k3d::to_vector(pivot + offset);\n\t\t\t\tcoords = rotation * coords;\n\t\t\t\tcoords += k3d::to_vector(pivot + offset);\n\t\t\t}\n\t\t\telse if(delta >= m_JointPosition + m_Radius)\n\t\t\t{\n\t\t\t\tk3d::matrix4 rotation = k3d::rotate3(m_BendAngle, axis);\n\t\t\t\tcoords -= k3d::to_vector(m_Origin);\n\t\t\t\tcoords = rotation * coords;\n\t\t\t\tcoords += k3d::to_vector(m_Origin);\n\t\t\t}\n\n\t\t\treturn coords;\n\t\t}\n\n\tprivate:\n\t\tk3d::point3 m_Origin;\n\t\tconst k3d::point3 m_Min;\n\t\tconst k3d::point3 m_Max;\n\t\tconst k3d::axis m_Along;\n\t\tconst k3d::axis m_Around;\n\t\tconst double m_BendAngle;\n\t\tconst double m_Tightness;\n\t\tconst double m_JointPosition;\n\t\tconst k3d::vector3 m_Size;\n\t\tconst k3d::point3 m_Joint;\n\t\tconst double m_Radius;\n\t\tconst k3d::point3 m_JLower;\n\t};\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::bounding_box3 bounds = k3d::mesh::bounds(InputPoints);\n\n\t\tconst double angle = m_angle.pipeline_value();\n\t\tconst double tightness = m_tightness.pipeline_value();\n\t\tconst double position = m_position.pipeline_value();\n\t\tconst k3d::axis along = m_along.pipeline_value();\n\t\tconst k3d::axis around = m_around.pipeline_value();\n\n\t\tbend deformation(k3d::point3(0, 0, 0), k3d::point3(bounds.nx, bounds.ny, bounds.nz), k3d::point3(bounds.px, bounds.py, bounds.pz), along, around, angle, tightness, position);\n\n\t\tconst size_t point_begin = 0;\n\t\tconst size_t point_end = point_begin + OutputPoints.size();\n\t\tfor(size_t point = point_begin; point != point_end; ++point)\n\t\t\tOutputPoints[point] = k3d::mix(InputPoints[point], deformation(InputPoints[point]), PointSelection[point]);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bend_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xfd599b45, 0x20384cd3, 0xb0af634b, 0x9372888a),\n\t\t\t\t\"BendPoints\",\n\t\t\t\t_(\"Bends mesh points around an axis\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_angle;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_tightness;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_position;\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_along;\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_around;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bend_points_factory\n\nk3d::iplugin_factory& bend_points_factory()\n{\n\treturn bend_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/deformation/bulge_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements Bulge tool, applies a \"Bulge\" transformation to points\n\t\t\\author Andy Gill (buzz@ucky.com)\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n#include <k3dsdk/parallel/blocked_range.h>\n#include <k3dsdk/parallel/parallel_for.h>\n#include <k3dsdk/parallel/threads.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bulge_points\n\nclass bulge_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tbulge_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_bulge_factor(init_owner(*this) + init_name(\"bulge_factor\") + init_label(_(\"Bulge factor\")) + init_description(_(\"Bulge amount\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_origin(init_owner(*this) + init_name(\"origin\") + init_label(_(\"Origin\")) + init_description(_(\"Origin of the bulge.\")) + init_value(k3d::point3(0, 0, 0))),\n\t\tm_displace_x(init_owner(*this) + init_name(\"displace_x\") + init_label(_(\"Displace x\")) + init_description(_(\"Displace on X axis\")) + init_value(true)),\n\t\tm_displace_y(init_owner(*this) + init_name(\"displace_y\") + init_label(_(\"Displace y\")) + init_description(_(\"Displace on Y axis\")) + init_value(true)),\n\t\tm_displace_z(init_owner(*this) + init_name(\"displace_z\") + init_label(_(\"Displace z\")) + init_description(_(\"Displace on Z axis\")) + init_value(true)),\n\t\tm_axis(init_owner(*this) + init_name(\"axis\") + init_label(_(\"Axis\")) + init_description(_(\"Axis to bulge along\")) + init_value(k3d::Z) + init_enumeration(k3d::axis_values())),\n\t\tm_type(init_owner(*this) + init_name(\"type\") + init_label(_(\"Type\")) + init_description(_(\"Bulge type\")) + init_value(RADIAL) + init_enumeration(type_values()))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_origin.changed_signal().connect(make_update_mesh_slot());\n\t\tm_bulge_factor.changed_signal().connect(make_update_mesh_slot());\n\t\tm_displace_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_displace_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_displace_z.changed_signal().connect(make_update_mesh_slot());\n\t\tm_axis.changed_signal().connect(make_update_mesh_slot());\n\t\tm_type.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tclass worker\n\t{\n\tpublic:\n\t\tworker(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints, const k3d::point3& Origin, const k3d::point3& Min, const k3d::point3& Max, const k3d::axis Axis, const k3d::bool_t Radial, const k3d::bool_t displace_x, const k3d::bool_t displace_y, const k3d::bool_t displace_z, const k3d::double_t bulge_factor) :\n\t\t\tinput_points(InputPoints),\n\t\t\tpoint_selection(PointSelection),\n\t\t\toutput_points(OutputPoints),\n\t\t\tm_origin(k3d::to_vector(Origin)),\n\t\t\tm_min(Min),\n\t\t\tm_max(Max),\n\t\t\tm_axis(Axis),\n\t\t\tm_radial(Radial),\n\t\t\tm_displace_x(displace_x),\n\t\t\tm_displace_y(displace_y),\n\t\t\tm_displace_z(displace_z),\n\t\t\tm_bulge_factor(bulge_factor),\n\t\t\tm_size(Max - Min)\n\t\t{\n\t\t}\n\n\t\tvoid operator()(const k3d::parallel::blocked_range<k3d::uint_t>& range) const\n\t\t{\n\t\t\tconst k3d::uint_t point_begin = range.begin();\n\t\t\tconst k3d::uint_t point_end = range.end();\n\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t{\n\t\t\t\tk3d::point3 coords = input_points[point];\n\n\t\t\t\tcoords -= m_origin;\n\n\t\t\t\tk3d::double_t delta = 0;\n\t\t\t\tk3d::double_t length = m_size[m_axis];\n\t\t\t\tif(length != 0)\n\t\t\t\t{\n\t\t\t\t\tk3d::double_t min = m_min[m_axis];\n\t\t\t\t\tk3d::double_t max = m_max[m_axis];\n\t\t\t\t\tk3d::double_t value = coords[m_axis];\n\n\t\t\t\t\tk3d::double_t down = value - min;\n\t\t\t\t\tk3d::double_t up = max - value;\n\n\t\t\t\t\tdelta = 2 * down * up / (length*length);\n\t\t\t\t}\n\n\t\t\t\tk3d::double_t bulge_amount = delta;\n\t\t\t\tif(m_radial)\n\t\t\t\t{\n\t\t\t\t\tk3d::double_t distance = k3d::to_vector(coords).length();\n\t\t\t\t\tk3d::double_t scale;\n\t\t\t\t\tif(0 == distance)\n\t\t\t\t\t\tscale = 1.0;\n\t\t\t\t\telse\n\t\t\t\t\t\tscale = (distance + m_bulge_factor * bulge_amount) / distance;\n\n\t\t\t\t\tif(m_displace_x && (k3d::X != m_axis))\n\t\t\t\t\t\tcoords[0] *= scale;\n\n\t\t\t\t\tif(m_displace_y && (k3d::Y != m_axis))\n\t\t\t\t\t\tcoords[1] *= scale;\n\n\t\t\t\t\tif(m_displace_z && (k3d::Z != m_axis))\n\t\t\t\t\t\tcoords[2] *= scale;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tk3d::double_t offset = m_bulge_factor * bulge_amount;\n\n\t\t\t\t\tif(m_displace_x && (k3d::X != m_axis))\n\t\t\t\t\t\tcoords[0] += offset;\n\n\t\t\t\t\tif(m_displace_y && (k3d::Y != m_axis))\n\t\t\t\t\t\tcoords[1] += offset;\n\n\t\t\t\t\tif(m_displace_z && (k3d::Z != m_axis))\n\t\t\t\t\t\tcoords[2] += offset;\n\t\t\t\t}\n\n\t\t\t\tcoords += m_origin;\n\n\t\t\t\toutput_points[point] = k3d::mix(input_points[point], coords, point_selection[point]);\n\t\t\t}\n\t\t}\n\n\tprivate:\n\t\tconst k3d::mesh::points_t& input_points;\n\t\tconst k3d::mesh::selection_t& point_selection;\n\t\tk3d::mesh::points_t& output_points;\n\t\tconst k3d::vector3 m_origin;\n\t\tconst k3d::point3 m_min;\n\t\tconst k3d::point3 m_max;\n\t\tconst k3d::axis m_axis;\n\t\tconst k3d::bool_t m_radial;\n\t\tconst k3d::bool_t m_displace_x;\n\t\tconst k3d::bool_t m_displace_y;\n\t\tconst k3d::bool_t m_displace_z;\n\t\tconst k3d::double_t m_bulge_factor;\n\t\tconst k3d::vector3 m_size;\n\t};\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::bounding_box3 bounds = k3d::mesh::bounds(InputPoints);\n\n\t\tconst k3d::double_t bulge_factor = m_bulge_factor.pipeline_value();\n\t\tconst k3d::double_t displace_x = m_displace_x.pipeline_value();\n\t\tconst k3d::double_t displace_y = m_displace_y.pipeline_value();\n\t\tconst k3d::double_t displace_z = m_displace_z.pipeline_value();\n\t\tconst k3d::axis axis = m_axis.pipeline_value();\n\n\t\tconst k3d::point3 origin = m_origin.pipeline_value();\n\t\tconst k3d::point3 min(bounds.nx, bounds.ny, bounds.nz);\n\t\tconst k3d::point3 max(bounds.px, bounds.py, bounds.pz);\n\t\tconst k3d::bool_t radial = m_type.pipeline_value() == RADIAL;\n\n\t\tk3d::parallel::parallel_for(\n\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, OutputPoints.size(), k3d::parallel::grain_size()),\n\t\t\tworker(InputPoints, PointSelection, OutputPoints, origin, min, max, axis, radial, displace_x, displace_y, displace_z, bulge_factor));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bulge_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xb7002ece, 0x8e6348f5, 0xa99ce9b0, 0xfbeba55f),\n\t\t\t\t\"BulgePoints\",\n\t\t\t\t_(\"Bulges mesh points around a point\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttypedef enum\n\t{\n\t\tLINEAR,\n\t\tRADIAL,\n\t} Type;\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const Type& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase LINEAR:\n\t\t\t\tStream << \"linear\";\n\t\t\t\tbreak;\n\t\t\tcase RADIAL:\n\t\t\t\tStream << \"radial\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, Type& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"linear\")\n\t\t\tValue = LINEAR;\n\t\telse if(text == \"radial\")\n\t\t\tValue = RADIAL;\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& type_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Linear\", \"linear\", \"Linear bulge\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Radial\", \"radial\", \"Radial bulge\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_bulge_factor;\n\tk3d_data(k3d::point3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_origin;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_displace_x;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_displace_y;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_displace_z;\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_axis;\n\tk3d_data(Type, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_type;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bulge_points_factory\n\nk3d::iplugin_factory& bulge_points_factory()\n{\n\treturn bulge_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/deformation/center_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"linear_transformation_worker.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// center_points\n\nclass center_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tcenter_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_center_x(init_owner(*this) + init_name(\"center_x\") + init_label(_(\"Center X\")) + init_description(_(\"Center X components around origin\")) + init_value(true)),\n\t\tm_center_y(init_owner(*this) + init_name(\"center_y\") + init_label(_(\"Center Y\")) + init_description(_(\"Center Y components around origin\")) + init_value(true)),\n\t\tm_center_z(init_owner(*this) + init_name(\"center_z\") + init_label(_(\"Center Z\")) + init_description(_(\"Center Z components around origin\")) + init_value(true))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_center_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_center_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_center_z.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::bounding_box3 bounds = k3d::mesh::bounds(InputPoints);\n\t\tif(bounds.empty())\n\t\t\treturn;\n\n\t\tconst bool center_x = m_center_x.pipeline_value();\n\t\tconst bool center_y = m_center_y.pipeline_value();\n\t\tconst bool center_z = m_center_z.pipeline_value();\n\n\t\tconst k3d::matrix4 transformation = k3d::translate3(k3d::vector3(\n\t\t\tcenter_x ? -0.5 * (bounds.px + bounds.nx) : 0,\n\t\t\tcenter_y ? -0.5 * (bounds.py + bounds.ny) : 0,\n\t\t\tcenter_z ? -0.5 * (bounds.pz + bounds.nz) : 0));\n\n\t\tk3d::parallel::parallel_for(\n\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, OutputPoints.size(), k3d::parallel::grain_size()),\n\t\t\tlinear_transformation_worker(InputPoints, PointSelection, OutputPoints, transformation));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<center_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xc030994f, 0x97ed4165, 0x9ac0b7f0, 0xa777abbc),\n\t\t\t\t\"CenterPoints\",\n\t\t\t\t_(\"Centers mesh points around the origin\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_center_x;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_center_y;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_center_z;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// center_points_factory\n\nk3d::iplugin_factory& center_points_factory()\n{\n\treturn center_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/deformation/cylindrical_wave_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cylindrical_wave_points\n\nclass cylindrical_wave_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tcylindrical_wave_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_along(init_owner(*this) + init_name(\"along\") + init_label(_(\"Along\")) + init_description(_(\"Wave points along given axis\")) + init_value(k3d::Z) + init_enumeration(k3d::axis_values())),\n\t\tm_amplitude(init_owner(*this) + init_name(\"amplitude\") + init_label(_(\"Amplitude\")) + init_description(_(\"Wave amplitude\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_wavelength(init_owner(*this) + init_name(\"wavelength\") + init_label(_(\"Wavelength\")) + init_description(_(\"Wavelength\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_phase(init_owner(*this) + init_name(\"phase\") + init_label(_(\"Phase\")) + init_description(_(\"Wave phase\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_along.changed_signal().connect(make_update_mesh_slot());\n\t\tm_amplitude.changed_signal().connect(make_update_mesh_slot());\n\t\tm_wavelength.changed_signal().connect(make_update_mesh_slot());\n\t\tm_phase.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::axis along = m_along.pipeline_value();\n\t\tconst double amplitude = m_amplitude.pipeline_value();\n\t\tconst double wavelength = m_wavelength.pipeline_value();\n\t\tconst double phase = m_phase.pipeline_value();\n\n\t\t// Filter-out infinite frequencies ...\n\t\tif(0 == wavelength)\n\t\t\treturn;\n\n\n\t\tconst size_t point_begin = 0;\n\t\tconst size_t point_end = point_begin + OutputPoints.size();\n\t\tfor(size_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tk3d::point3 position = InputPoints[point];\n\n\t\t\tconst double wave_position = phase + (k3d::pi_times_2() * position[along] / wavelength);\n\t\t\tconst double offset = amplitude * sin(wave_position);\n\n\t\t\tconst k3d::vector3 direction((k3d::X != along) * position[0], (k3d::Y != along) * position[1], (k3d::Z != along) * position[2]);\n\t\t\tif(0 == direction.length2())\n\t\t\t\tcontinue;\n\n\t\t\tOutputPoints[point] = k3d::mix(InputPoints[point], InputPoints[point] + offset * k3d::normalize(direction), PointSelection[point]);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cylindrical_wave_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xfb3c4caf, 0xec534256, 0x96705718, 0xf6e5ec41),\n\t\t\t\t\"CylindricalWavePoints\",\n\t\t\t\t_(\"Applies a wave function to points along an axis\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_along;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_amplitude;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_wavelength;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_phase;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cylindrical_wave_points_factory\n\nk3d::iplugin_factory& cylindrical_wave_points_factory()\n{\n\treturn cylindrical_wave_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/deformation/deformation_expression.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Joaquin Duo (joaduo at lugmen org ar)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/expression/parser.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// deformation_expression\n\nclass deformation_expression :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tdeformation_expression(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_x_function(init_owner(*this) + init_name(\"x_function\") + init_label(_(\"X Function\")) + init_description(_(\"Output X coordinate function, in terms of x, y, z, and any user-defined scalars.\")) + init_value(k3d::string_t(_(\"x\")))),\n\t\tm_y_function(init_owner(*this) + init_name(\"y_function\") + init_label(_(\"Y Function\")) + init_description(_(\"Output Y coordinate function, in terms of x, y, z, and any user-defined scalars.\")) + init_value(k3d::string_t(_(\"y\")))),\n\t\tm_z_function(init_owner(*this) + init_name(\"z_function\") + init_label(_(\"Z Function\")) + init_description(_(\"Output Z coordinate function, in terms of x, y, z, and any user-defined scalars.\")) + init_value(k3d::string_t(_(\"z + sin(x)\")))),\n\t\tm_user_property_changed_signal(*this)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_x_function.changed_signal().connect(make_update_mesh_slot());\n\t\tm_y_function.changed_signal().connect(make_update_mesh_slot());\n\t\tm_z_function.changed_signal().connect(make_update_mesh_slot());\n\t\tm_user_property_changed_signal.connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tOutputPoints = InputPoints;\n\n\t\t// Setup default variables for x, y, and z coordinates ...\n\t\tstd::string variables(\"x,y,z\");\n\t\tstd::vector<k3d::double_t> values(3, 0.0);\n\n\t\t// Collect additional, user-defined variables ...\t\t\n\t\tconst k3d::iproperty_collection::properties_t& properties = k3d::node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t{\n\t\t\tif(!dynamic_cast<k3d::iuser_property*>(*property))\n\t\t\t\tcontinue;\n\n\t\t\tif((**property).property_type() != typeid(k3d::double_t))\n\t\t\t{\n\t\t\t\tk3d::log() << warning << factory().name() << \": user property [\" << (**property).property_name() << \"] with unsupported type [\" << k3d::demangle((**property).property_type()) << \"] will be ignored\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvariables += \",\" + (**property).property_name();\n\t\t\tvalues.push_back(k3d::property::pipeline_value<double>(**property));\n\t\t}\n\t\t\t\n\t\tk3d::expression::parser parser_x_component;\n\t\tif(!parser_x_component.parse(m_x_function.pipeline_value(), variables))\n\t\t{\n\t\t\tk3d::log() << error << factory().name() << \": function parsing for x component failed: \" << parser_x_component.last_parse_error() << std::endl;\n\t\t\treturn;\n\t\t}\n\t\tk3d::expression::parser parser_y_component;\n\t\tif(!parser_y_component.parse(m_y_function.pipeline_value(), variables))\n\t\t{\n\t\t\tk3d::log() << error << factory().name() << \": function parsing for y component failed: \" << parser_y_component.last_parse_error() << std::endl;\n\t\t\treturn;\n\t\t}\n\t\tk3d::expression::parser parser_z_component;\n\t\tif(!parser_z_component.parse(m_z_function.pipeline_value(), variables))\n\t\t{\n\t\t\tk3d::log() << error << factory().name() << \": function parsing for z component failed: \" << parser_z_component.last_parse_error() << std::endl;\n\t\t\treturn;\n\t\t}\t\t\t\t\n\t\t\n\t\t//Evaluate functions on each point.\n\t\tconst k3d::uint_t point_begin = 0;\n\t\tconst k3d::uint_t point_end = point_begin + OutputPoints.size();\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tif(!PointSelection[point])\n\t\t\t\tcontinue;\n\n\t\t\tvalues[0] = InputPoints[point].n[0];\n\t\t\tvalues[1] = InputPoints[point].n[1];\n\t\t\tvalues[2] = InputPoints[point].n[2];\n\n\t\t\tOutputPoints[point] = k3d::point3(\n\t\t\t\tparser_x_component.evaluate(&values[0]),\n\t\t\t\tparser_y_component.evaluate(&values[0]),\n\t\t\t\tparser_z_component.evaluate(&values[0])\n\t\t\t\t);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<deformation_expression,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x82777f90, 0xb74d7201, 0xcc5bed8a, 0x35275e00),\n\t\t\t\t\"DeformationExpression\",\n\t\t\t\t_(\"Displace a mesh using functional expressions in x, y, and z.\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_x_function;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_y_function;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_z_function;\n\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n\t\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// deformation_expression_factory\n\nk3d::iplugin_factory& deformation_expression_factory()\n{\n\treturn deformation_expression::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/deformation/linear_point_noise.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n#include <k3dsdk/noise.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// linear_point_noise\n\nclass linear_point_noise :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tlinear_point_noise(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_use_x(init_owner(*this) + init_name(\"use_x\") + init_label(_(\"Use X\")) + init_description(_(\"Add noise on X components\")) + init_value(true)),\n\t\tm_use_y(init_owner(*this) + init_name(\"use_y\") + init_label(_(\"Use Y\")) + init_description(_(\"Add noise on Y components\")) + init_value(true)),\n\t\tm_use_z(init_owner(*this) + init_name(\"use_z\") + init_label(_(\"Use Z\")) + init_description(_(\"Add noise on Z components\")) + init_value(true)),\n\t\tm_move_x(init_owner(*this) + init_name(\"move_x\") + init_label(_(\"Move X\")) + init_description(_(\"Apply offset on X component\")) + init_value(false)),\n\t\tm_move_y(init_owner(*this) + init_name(\"move_y\") + init_label(_(\"Move Y\")) + init_description(_(\"Apply offset on Y component\")) + init_value(false)),\n\t\tm_move_z(init_owner(*this) + init_name(\"move_z\") + init_label(_(\"Move Z\")) + init_description(_(\"Apply offset on Z component\")) + init_value(true)),\n\t\tm_frequency_x(init_owner(*this) + init_name(\"frequency_x\") + init_label(_(\"X frequency\")) + init_description(_(\"X Frequency\")) + init_value(0.1) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_frequency_y(init_owner(*this) + init_name(\"frequency_y\") + init_label(_(\"Y frequency\")) + init_description(_(\"Y Frequency\")) + init_value(0.1) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_frequency_z(init_owner(*this) + init_name(\"frequency_z\") + init_label(_(\"Z frequency\")) + init_description(_(\"Z Frequency\")) + init_value(0.1) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_offset_x(init_owner(*this) + init_name(\"offset_x\") + init_label(_(\"X offset\")) + init_description(_(\"X Offset\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_offset_y(init_owner(*this) + init_name(\"offset_y\") + init_label(_(\"Y offset\")) + init_description(_(\"Y Offset\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_offset_z(init_owner(*this) + init_name(\"offset_z\") + init_label(_(\"Z offset\")) + init_description(_(\"Z Offset\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_amplitude_x(init_owner(*this) + init_name(\"amplitude_x\") + init_label(_(\"X amplitude\")) + init_description(_(\"X Amplitude\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_amplitude_y(init_owner(*this) + init_name(\"amplitude_y\") + init_label(_(\"Y amplitude\")) + init_description(_(\"Y Amplitude\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_amplitude_z(init_owner(*this) + init_name(\"amplitude_z\") + init_label(_(\"Z amplitude\")) + init_description(_(\"Z Amplitude\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_use_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_use_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_use_z.changed_signal().connect(make_update_mesh_slot());\n\t\tm_move_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_move_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_move_z.changed_signal().connect(make_update_mesh_slot());\n\t\tm_frequency_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_frequency_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_frequency_z.changed_signal().connect(make_update_mesh_slot());\n\t\tm_offset_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_offset_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_offset_z.changed_signal().connect(make_update_mesh_slot());\n\t\tm_amplitude_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_amplitude_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_amplitude_z.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::bool_t use_x = m_use_x.pipeline_value();\n\t\tconst k3d::bool_t use_y = m_use_y.pipeline_value();\n\t\tconst k3d::bool_t use_z = m_use_z.pipeline_value();\n\n\t\tconst k3d::bool_t move_x = m_move_x.pipeline_value();\n\t\tconst k3d::bool_t move_y = m_move_y.pipeline_value();\n\t\tconst k3d::bool_t move_z = m_move_z.pipeline_value();\n\n\t\tconst k3d::double_t frequency_x = m_frequency_x.pipeline_value();\n\t\tconst k3d::double_t frequency_y = m_frequency_y.pipeline_value();\n\t\tconst k3d::double_t frequency_z = m_frequency_z.pipeline_value();\n\n\t\tconst k3d::double_t offset_x = m_offset_x.pipeline_value();\n\t\tconst k3d::double_t offset_y = m_offset_y.pipeline_value();\n\t\tconst k3d::double_t offset_z = m_offset_z.pipeline_value();\n\n\t\tconst k3d::double_t amplitude_x = m_amplitude_x.pipeline_value();\n\t\tconst k3d::double_t amplitude_y = m_amplitude_y.pipeline_value();\n\t\tconst k3d::double_t amplitude_z = m_amplitude_z.pipeline_value();\n\n\t\tk3d::noise::classic3 noise;\n\n\t\tconst k3d::uint_t point_begin = 0;\n\t\tconst k3d::uint_t point_end = point_begin + OutputPoints.size();\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tconst k3d::point3 start = InputPoints[point];\n\n\t\t\tconst k3d::vector3 perturb = k3d::noise::map3<k3d::vector3>(\n\t\t\t\tnoise,\n\t\t\t\tuse_x ? offset_x + frequency_x * start[0] : 0.0,\n\t\t\t\tuse_y ? offset_y + frequency_y * start[1] : 0.0,\n\t\t\t\tuse_z ? offset_z + frequency_z * start[2] : 0.0);\n\n\t\t\tconst k3d::vector3 offset =\n\t\t\t\tk3d::vector3(\n\t\t\t\t\tmove_x ? amplitude_x * perturb[0] : 0.0,\n\t\t\t\t\tmove_y ? amplitude_y * perturb[1] : 0.0,\n\t\t\t\t\tmove_z ? amplitude_z * perturb[2] : 0.0);\n\n\t\t\tOutputPoints[point] = k3d::mix(start, start + offset, PointSelection[point]);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<linear_point_noise,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xbbcaf2e7, 0xc45346bf, 0x9dfd92f2, 0xfb9e6d68),\n\t\t\t\t\"LinearPointNoise\",\n\t\t\t\t_(\"Applies a linear noise offset to mesh points\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_use_x;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_use_y;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_use_z;\n\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_move_x;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_move_y;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_move_z;\n\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_frequency_x;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_frequency_y;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_frequency_z;\n\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_offset_x;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_offset_y;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_offset_z;\n\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_amplitude_x;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_amplitude_y;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_amplitude_z;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// linear_point_noise_factory\n\nk3d::iplugin_factory& linear_point_noise_factory()\n{\n\treturn linear_point_noise::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/deformation/linear_transformation_worker.h",
    "content": "#ifndef MODULES_DEFORMATION_LINEAR_TRANSFORMATION_WORKER_H\n#define MODULES_DEFORMATION_LINEAR_TRANSFORMATION_WORKER_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/parallel/blocked_range.h>\n#include <k3dsdk/parallel/parallel_for.h>\n#include <k3dsdk/parallel/threads.h>\n\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/// Helper class that can apply a linear transformation to a collection of points.\n/// Designed for compatibility with k3d::parallel::parallel_for().\nclass linear_transformation_worker\n{\npublic:\n\n\tlinear_transformation_worker(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints, const k3d::matrix4& Transformation) :\n\t\tinput_points(InputPoints),\n\t\tpoint_selection(PointSelection),\n\t\toutput_points(OutputPoints),\n\t\ttransformation(Transformation)\n\t{\n\t}\n\t\n\tvoid operator()(const k3d::parallel::blocked_range<k3d::uint_t>& range) const\n\t{\n\t\tconst k3d::uint_t point_begin = range.begin();\n\t\tconst k3d::uint_t point_end = range.end();\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\toutput_points[point] = k3d::mix(input_points[point], transformation * input_points[point], point_selection[point]);\n\t}\n\nprivate:\n\tconst k3d::mesh::points_t& input_points;\n\tconst k3d::mesh::selection_t& point_selection;\n\tk3d::mesh::points_t& output_points;\n\tconst k3d::matrix4& transformation;\n};\n\n} // namespace deformation\n\n} // namespace module\n\n#endif // !MODULES_DEFORMATION_LINEAR_TRANSFORMATION_WORKER_H\n"
  },
  {
    "path": "modules/deformation/linear_wave_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// linear_wave_points\n\nclass linear_wave_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tlinear_wave_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_axis(init_owner(*this) + init_name(\"axis\") + init_label(_(\"Axis\")) + init_description(_(\"Axis\")) + init_value(k3d::Z) + init_enumeration(k3d::axis_values())),\n\t\tm_along(init_owner(*this) + init_name(\"along\") + init_label(_(\"Along\")) + init_description(_(\"Along\")) + init_value(k3d::X) + init_enumeration(k3d::axis_values())),\n\t\tm_amplitude(init_owner(*this) + init_name(\"amplitude\") + init_label(_(\"Amplitude\")) + init_description(_(\"Amplitude\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_wavelength(init_owner(*this) + init_name(\"wavelength\") + init_label(_(\"Wavelength\")) + init_description(_(\"Wavelength\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_phase(init_owner(*this) + init_name(\"phase\") + init_label(_(\"Phase\")) + init_description(_(\"Phase\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_axis.changed_signal().connect(make_update_mesh_slot());\n\t\tm_along.changed_signal().connect(make_update_mesh_slot());\n\t\tm_amplitude.changed_signal().connect(make_update_mesh_slot());\n\t\tm_wavelength.changed_signal().connect(make_update_mesh_slot());\n\t\tm_phase.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::axis axis = m_axis.pipeline_value();\n\t\tconst k3d::axis along = m_along.pipeline_value();\n\t\tconst double amplitude = m_amplitude.pipeline_value();\n\t\tconst double wavelength = m_wavelength.pipeline_value();\n\t\tconst double phase = m_phase.pipeline_value();\n\n\t\tconst k3d::point3 offset_filter(k3d::X == axis, k3d::Y == axis, k3d::Z == axis);\n\n\t\t// Filter-out infinite frequencies ...\n\t\tif(0 == wavelength)\n\t\t\treturn;\n\n\t\tconst size_t point_begin = 0;\n\t\tconst size_t point_end = point_begin + OutputPoints.size();\n\t\tfor(size_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tk3d::point3 position = InputPoints[point];\n\n\t\t\tconst double wave_position = phase + (k3d::pi_times_2() * position[along] / wavelength);\n\t\t\tconst double offset = amplitude * sin(wave_position);\n\n\t\t\tOutputPoints[point] = k3d::mix(InputPoints[point], InputPoints[point] + (offset * offset_filter), PointSelection[point]);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<linear_wave_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x8053da77, 0xef6743cd, 0x9d60f12a, 0x63d1fdc7),\n\t\t\t\t\"LinearWavePoints\",\n\t\t\t\t_(\"Applies a wave function to points along an axis\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_axis;\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_along;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_amplitude;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_wavelength;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_phase;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// linear_wave_points_factory\n\nk3d::iplugin_factory& linear_wave_points_factory()\n{\n\treturn linear_wave_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/deformation/mesh_modifier.h",
    "content": "#ifndef MODULES_DEFORMATION_MESH_MODIFIER_H\n#define MODULES_DEFORMATION_MESH_MODIFIER_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/data.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/pointer_demand_storage.h>\n\nnamespace _k3d\n{\n\nusing namespace k3d;\n\ntemplate<typename base_t>\nclass mesh_modifier :\n\tpublic base_t,\n\tpublic imesh_sink,\n\tpublic imesh_source\n{\npublic:\n\tmesh_modifier(iplugin_factory& Factory, idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_input_mesh(init_owner(*this) + init_name(\"input_mesh\") + init_label(_(\"Input Mesh\")) + init_description(_(\"Input mesh\")) + init_value<mesh*>(0)),\n\t\tm_output_mesh(init_owner(*this) + init_name(\"output_mesh\") + init_label(_(\"Output Mesh\")) + init_description(_(\"Output mesh\")))\n\t{\n\t\tm_input_mesh.changed_signal().connect(hint::converter<\n\t\t\t\thint::convert<hint::mesh_geometry_changed, hint::unchanged,\n\t\t\t\thint::convert<hint::mesh_topology_changed, hint::unchanged,\n\t\t\t\thint::convert<hint::selection_changed, hint::unchanged,\n\t\t\t\thint::convert<hint::any, hint::none> > > > >(m_output_mesh.make_slot()));\n\n\t\tm_output_mesh.set_update_slot(sigc::mem_fun(*this, &mesh_modifier<base_t>::execute));\n\t}\n\n\tiproperty& mesh_source_output()\n\t{\n\t\treturn m_output_mesh;\n\t}\n\n\tiproperty& mesh_sink_input()\n\t{\n\t\treturn m_input_mesh;\n\t}\n\n\tsigc::slot<void, ihint*> make_update_mesh_slot()\n\t{\n\t\treturn m_output_mesh.make_slot();\n\t}\n\nprotected:\n\tk3d_data(mesh*, immutable_name, change_signal, no_undo, local_storage, no_constraint, read_only_property, no_serialization) m_input_mesh;\n\tk3d_data(mesh*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_output_mesh;\n\nprivate:\n\tvoid execute(const std::vector<ihint*>& Hints, mesh& Output)\n\t{\n\t\tif(const mesh* const input = m_input_mesh.pipeline_value())\n\t\t{\n\t\t\tbase_t::document().pipeline_profiler().start_execution(*this, \"Execute\");\n\t\t\ton_execute(Hints, *input, Output);\n\t\t\tbase_t::document().pipeline_profiler().finish_execution(*this, \"Execute\");\n\t\t}\n\t}\n\n\tvirtual void on_execute(const std::vector<ihint*>& Hints, const mesh& Input, mesh& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !MODULES_DEFORMATION_MESH_MODIFIER_H\n"
  },
  {
    "path": "modules/deformation/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\nextern k3d::iplugin_factory& bend_points_factory();\nextern k3d::iplugin_factory& bulge_points_factory();\nextern k3d::iplugin_factory& center_points_factory();\nextern k3d::iplugin_factory& cylindrical_wave_points_factory();\nextern k3d::iplugin_factory& deformation_expression_factory();\nextern k3d::iplugin_factory& linear_point_noise_factory();\nextern k3d::iplugin_factory& linear_wave_points_factory();\nextern k3d::iplugin_factory& morph_points_factory();\nextern k3d::iplugin_factory& rotate_points_factory();\nextern k3d::iplugin_factory& scale_points_factory();\nextern k3d::iplugin_factory& set_position_factory();\nextern k3d::iplugin_factory& shear_points_factory();\nextern k3d::iplugin_factory& smooth_points_factory();\nextern k3d::iplugin_factory& sphereize_points_factory();\nextern k3d::iplugin_factory& taper_points_factory();\nextern k3d::iplugin_factory& transform_points_factory();\nextern k3d::iplugin_factory& translate_points_factory();\nextern k3d::iplugin_factory& tweak_points_factory();\nextern k3d::iplugin_factory& twist_points_factory();\n} // namespace deformation\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::deformation::bend_points_factory());\n\tRegistry.register_factory(module::deformation::bulge_points_factory());\n\tRegistry.register_factory(module::deformation::center_points_factory());\n\tRegistry.register_factory(module::deformation::cylindrical_wave_points_factory());\n\tRegistry.register_factory(module::deformation::deformation_expression_factory());\n\tRegistry.register_factory(module::deformation::linear_point_noise_factory());\n\tRegistry.register_factory(module::deformation::linear_wave_points_factory());\n\tRegistry.register_factory(module::deformation::morph_points_factory());\n\tRegistry.register_factory(module::deformation::rotate_points_factory());\n\tRegistry.register_factory(module::deformation::scale_points_factory());\n\tRegistry.register_factory(module::deformation::set_position_factory());\n\tRegistry.register_factory(module::deformation::shear_points_factory());\n\tRegistry.register_factory(module::deformation::smooth_points_factory());\n\tRegistry.register_factory(module::deformation::sphereize_points_factory());\n\tRegistry.register_factory(module::deformation::taper_points_factory());\n\tRegistry.register_factory(module::deformation::transform_points_factory());\n\tRegistry.register_factory(module::deformation::translate_points_factory());\n\tRegistry.register_factory(module::deformation::tweak_points_factory());\n\tRegistry.register_factory(module::deformation::twist_points_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/deformation/morph_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com) parts of code\n\t\\author Joaquin Duo (joaduo at lugmen org ar)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// morph_points\n\nclass morph_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tmorph_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_user_property_changed_signal(*this)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_user_property_changed_signal.connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tstd::vector<const k3d::mesh::points_t*> inputs;\n\t\tstd::vector<k3d::double_t> amounts;\n\t\t\n\t\t//Search for the Meshes targets and its morph percent multiplier\n\t\tconst k3d::iproperty_collection::properties_t& properties = k3d::node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t{\n\t\t\tif(!dynamic_cast<k3d::iuser_property*>(*property))\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tif((**property).property_type() == typeid(k3d::mesh*))\n\t\t\t{\n\t\t\t\tif(k3d::mesh* const mesh = k3d::property::pipeline_value<k3d::mesh*>(**property))\n\t\t\t\t{\n\t\t\t\t\tif(const k3d::mesh::points_t* const points = mesh->points.get())\n\t\t\t\t\t\tinputs.push_back(points);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if((**property).property_type() == typeid(k3d::double_t))\n\t\t\t{\n\t\t\t\tamounts.push_back(k3d::property::pipeline_value<k3d::double_t>(**property));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tk3d::log() << warning << factory().name() << \": user property [\" << (**property).property_name() << \"] with unsupported type [\" << k3d::demangle((**property).property_type()) << \"] will be ignored\" << std::endl;\n\t\t\t}\n\t\t}\n\n\t\tif(inputs.size() != amounts.size())\n\t\t{\n\t\t\tk3d::log() << error << \"mismatch in number of morph inputs and amounts.\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tOutputPoints = InputPoints;\n\n\t\tconst k3d::uint_t input_begin = 0;\n\t\tconst k3d::uint_t input_end = input_begin + inputs.size();\n\t\tfor(k3d::uint_t i = input_begin; i != input_end; ++i)\n\t\t{\n\t\t\tconst k3d::mesh::points_t& input_points = *inputs[i];\n\t\t\tconst k3d::double_t amount = amounts[i];\n\n\t\t\tconst k3d::uint_t point_begin = 0;\n\t\t\tconst k3d::uint_t point_end = point_begin + std::min(OutputPoints.size(), input_points.size());\n\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\tOutputPoints[point] += PointSelection[point] * amount * (input_points[point] - InputPoints[point]);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<morph_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xc52c53c2, 0x3fca4d28, 0x88db7096, 0xea60f819),\n\t\t\t\t\"MorphPoints\",\n\t\t\t\t_(\"Applies morph to different targets, interpolating between target and source position\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n\t\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// morph_points_factory\n\nk3d::iplugin_factory& morph_points_factory()\n{\n\treturn morph_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/deformation/rotate_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"linear_transformation_worker.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// rotate_points\n\nclass rotate_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\trotate_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_x(init_owner(*this) + init_name(\"x\") + init_label(_(\"X\")) + init_description(_(\"X rotation angle\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_y(init_owner(*this) + init_name(\"y\") + init_label(_(\"Y\")) + init_description(_(\"Y rotation angle\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_z(init_owner(*this) + init_name(\"z\") + init_label(_(\"Z\")) + init_description(_(\"Z rotation angle\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_origin(init_owner(*this) + init_name(\"origin\") + init_label(_(\"Origin\")) + init_description(_(\"Origin of the rotation.\")) + init_value(k3d::point3(0, 0, 0)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_z.changed_signal().connect(make_update_mesh_slot());\n\t\tm_origin.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::matrix4 rotation = k3d::rotate3(k3d::point3(m_x.pipeline_value(), m_y.pipeline_value(), m_z.pipeline_value()));\n\t\tconst k3d::vector3 translation_vector = k3d::to_vector(m_origin.pipeline_value());\n\t\tconst k3d::matrix4 pre_translation = k3d::translate3(-translation_vector);\n\t\tconst k3d::matrix4 post_translation = k3d::translate3(translation_vector);\n\n\t\tconst k3d::matrix4 transformation = post_translation * rotation * pre_translation;\n\n\t\tk3d::parallel::parallel_for(\n\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, OutputPoints.size(), k3d::parallel::grain_size()),\n\t\t\tlinear_transformation_worker(InputPoints, PointSelection, OutputPoints, transformation));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<rotate_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x89a6a016, 0x3db04f26, 0xb626bb37, 0x6c812533),\n\t\t\t\t\"RotatePoints\",\n\t\t\t\t_(\"Rotates mesh points\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z;\n\tk3d_data(k3d::point3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_origin;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// rotate_points_factory\n\nk3d::iplugin_factory& rotate_points_factory()\n{\n\treturn rotate_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/deformation/scale_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"linear_transformation_worker.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// scale_points\n\nclass scale_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tscale_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_x(init_owner(*this) + init_name(\"x\") + init_label(_(\"X\")) + init_description(_(\"X scale\")) + init_value(1.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_y(init_owner(*this) + init_name(\"y\") + init_label(_(\"Y\")) + init_description(_(\"Y scale\")) + init_value(1.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_z(init_owner(*this) + init_name(\"z\") + init_label(_(\"Z\")) + init_description(_(\"Z scale\")) + init_value(1.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_z.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::matrix4 transformation = k3d::scale3(m_x.pipeline_value(), m_y.pipeline_value(), m_z.pipeline_value());\n\n\t\tk3d::parallel::parallel_for(\n\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, OutputPoints.size(), k3d::parallel::grain_size()),\n\t\t\tlinear_transformation_worker(InputPoints, PointSelection, OutputPoints, transformation));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<scale_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xd3829136, 0x1f934c4d, 0x89151994, 0xa49d9f65),\n\t\t\t\t\"ScalePoints\",\n\t\t\t\t_(\"Scales mesh points\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// scale_points_factory\n\nk3d::iplugin_factory& scale_points_factory()\n{\n\treturn scale_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/deformation/set_position.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// set_position\n\nclass set_position :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tset_position(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_x(init_owner(*this) + init_name(\"x\") + init_label(_(\"X\")) + init_description(_(\"X position\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_y(init_owner(*this) + init_name(\"y\") + init_label(_(\"Y\")) + init_description(_(\"Y position\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z(init_owner(*this) + init_name(\"z\") + init_label(_(\"Z\")) + init_description(_(\"Z position\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_use_x(init_owner(*this) + init_name(\"use_x\") + init_label(_(\"Use X\")) + init_description(_(\"Set position on X components\")) + init_value(true)),\n\t\tm_use_y(init_owner(*this) + init_name(\"use_y\") + init_label(_(\"Use Y\")) + init_description(_(\"Set position on Y components\")) + init_value(true)),\n\t\tm_use_z(init_owner(*this) + init_name(\"use_z\") + init_label(_(\"Use Z\")) + init_description(_(\"Set position on Z components\")) + init_value(true))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_z.changed_signal().connect(make_update_mesh_slot());\n\t\tm_use_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_use_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_use_z.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::uint_t points_begin = 0;\n\t\tconst k3d::uint_t points_end = InputPoints.size();\n\t\tconst k3d::bool_t use_x = m_use_x.pipeline_value();\n\t\tconst k3d::bool_t use_y = m_use_y.pipeline_value();\n\t\tconst k3d::bool_t use_z = m_use_z.pipeline_value();\n\t\tfor(k3d::uint_t point_idx = points_begin; point_idx != points_end; ++point_idx)\n\t\t{\n\t\t\tk3d::point3& point = OutputPoints[point_idx];\n\t\t\tpoint = InputPoints[point_idx];\n\t\t\tif(PointSelection[point_idx])\n\t\t\t{\n\t\t\t\tif(use_x)\n\t\t\t\t\tpoint[0] = m_x.pipeline_value();\n\t\t\t\tif(use_y)\n\t\t\t\t\tpoint[1] = m_y.pipeline_value();\n\t\t\t\tif(use_z)\n\t\t\t\t\tpoint[2] = m_z.pipeline_value();\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<set_position,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xa01212cf, 0x4cb34ab4, 0x879b76dd, 0x8e861efa),\n\t\t\t\t\"SetPosition\",\n\t\t\t\t_(\"Set points positions\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_use_x;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_use_y;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_use_z;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// set_position_factory\n\nk3d::iplugin_factory& set_position_factory()\n{\n\treturn set_position::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/deformation/shear_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"linear_transformation_worker.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// shear_points\n\nclass shear_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tshear_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_direction(init_owner(*this) + init_name(\"direction\") + init_label(_(\"Direction\")) + init_description(_(\"Shear direction\")) + init_value(k3d::Z) + init_enumeration(k3d::axis_values())),\n\t\tm_axis(init_owner(*this) + init_name(\"axis\") + init_label(_(\"Axis\")) + init_description(_(\"Shear axis\")) + init_value(k3d::X) + init_enumeration(k3d::axis_values())),\n\t\tm_shear_factor(init_owner(*this) + init_name(\"shear_factor\") + init_label(_(\"Shear factor\")) + init_description(_(\"Shear factor\")) + init_value(0.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_direction.changed_signal().connect(make_update_mesh_slot());\n\t\tm_axis.changed_signal().connect(make_update_mesh_slot());\n\t\tm_shear_factor.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::axis direction = m_direction.pipeline_value();\n\t\tconst k3d::axis axis = m_axis.pipeline_value();\n\t\tconst double shear_factor = m_shear_factor.pipeline_value();\n\n\t\tconst double xy = k3d::X == direction && k3d::Y == axis ? shear_factor : 0;\n\t\tconst double xz = k3d::X == direction && k3d::Z == axis ? shear_factor : 0;\n\t\tconst double yx = k3d::Y == direction && k3d::X == axis ? shear_factor : 0;\n\t\tconst double yz = k3d::Y == direction && k3d::Z == axis ? shear_factor : 0;\n\t\tconst double zx = k3d::Z == direction && k3d::X == axis ? shear_factor : 0;\n\t\tconst double zy = k3d::Z == direction && k3d::Y == axis ? shear_factor : 0;\n\n\t\tconst k3d::matrix4 transformation = k3d::shear3(xy, xz, yx, yz, zx, zy);\n\n\t\tk3d::parallel::parallel_for(\n\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, OutputPoints.size(), k3d::parallel::grain_size()),\n\t\t\tlinear_transformation_worker(InputPoints, PointSelection, OutputPoints, transformation));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<shear_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x0def4291, 0x51ce479b, 0xadf9aec8, 0xed522ccc),\n\t\t\t\t\"ShearPoints\",\n\t\t\t\t_(\"Shears mesh points along an axis\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_direction;\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_axis;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_shear_factor;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// shear_points_factory\n\nk3d::iplugin_factory& shear_points_factory()\n{\n\treturn shear_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/deformation/smooth_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_deformation_modifier.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// smooth_points\n\nclass smooth_points :\n\tpublic k3d::mesh_deformation_modifier\n{\n\ttypedef k3d::mesh_deformation_modifier base;\n\npublic:\n\tsmooth_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_smoothing(init_owner(*this) + init_name(\"smoothing\") + init_label(_(\"Smoothing\")) + init_description(_(\"Smoothing factor\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_smoothing.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh& Input, const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n    const k3d::double_t smoothing = m_smoothing.pipeline_value();\n\n    k3d::mesh::points_t sums(InputPoints.size(), k3d::point3(0, 0, 0));\n    std::vector<k3d::uint_t> counts(InputPoints.size(), 0);\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{\n      boost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Input, **primitive));\n      if(!polyhedron)\n        continue;\n\n      const k3d::uint_t edge_begin = 0;\n      const k3d::uint_t edge_end = edge_begin + polyhedron->clockwise_edges.size();\n      for(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n      {\n        sums[polyhedron->vertex_points[edge]] += k3d::to_vector(InputPoints[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]]);\n        counts[polyhedron->vertex_points[edge]] += 1;\n\n        sums[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]] += k3d::to_vector(InputPoints[polyhedron->vertex_points[edge]]);\n        counts[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]] += 1;\n      }\n    }\n\n    const k3d::uint_t point_begin = 0;\n    const k3d::uint_t point_end = point_begin + OutputPoints.size();\n\n    for(k3d::uint_t point = point_begin; point != point_end; ++point)\n    {\n      if(counts[point])\n        sums[point] /= counts[point];\n      else\n        sums[point] = InputPoints[point];\n    }\n\n    for(k3d::uint_t point = point_begin; point != point_end; ++point)\n      OutputPoints[point] = k3d::mix(InputPoints[point], sums[point], smoothing * PointSelection[point]);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<smooth_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x3d6d1c61, 0x706f4968, 0x93462489, 0x9a3134a7),\n\t\t\t\t\"SmoothPoints\",\n\t\t\t\t_(\"Smooths mesh points by averaging their positions with their neighbors'\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_smoothing;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// smooth_points_factory\n\nk3d::iplugin_factory& smooth_points_factory()\n{\n\treturn smooth_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/deformation/sphereize_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sphereize_points\n\nclass sphereize_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\tsphereize_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_sphere_factor(init_owner(*this) + init_name(\"sphere_factor\") + init_label(_(\"Sphere factor\")) + init_description(_(\"Sphere factor\")) + init_value(1.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_sphere_factor.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst double sphere_factor = m_sphere_factor.pipeline_value();\n\n\t\tconst size_t point_begin = 0;\n\t\tconst size_t point_end = point_begin + OutputPoints.size();\n\n\t\tdouble target_radius = 0.0;\n\t\tfor(size_t point = point_begin; point != point_end; ++point)\n\t\t\ttarget_radius = std::max(target_radius, k3d::length(k3d::to_vector(InputPoints[point])));\n\t\tif(0.0 == target_radius)\n\t\t\treturn;\n\n\t\tfor(size_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tdouble radius = k3d::length(k3d::to_vector(InputPoints[point]));\n\t\t\tif(0.0 == radius)\n\t\t\t\tradius = target_radius;\n\n\t\t\tOutputPoints[point] = k3d::mix(InputPoints[point], InputPoints[point] * k3d::mix(radius, target_radius, sphere_factor) / radius, PointSelection[point]);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sphereize_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x643a4bdd, 0x191e4297, 0xa9b600fc, 0x699b46f9),\n\t\t\t\t\"SphereizePoints\",\n\t\t\t\t_(\"Constrains points to the surface of a sphere\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_sphere_factor;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// sphereize_points_factory\n\nk3d::iplugin_factory& sphereize_points_factory()\n{\n\treturn sphereize_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/deformation/taper_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n#include <k3dsdk/parallel/blocked_range.h>\n#include <k3dsdk/parallel/parallel_for.h>\n#include <k3dsdk/parallel/threads.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// taper_points\n\nclass taper_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\ttaper_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_axis(init_owner(*this) + init_name(\"axis\") + init_label(_(\"Axis\")) + init_description(_(\"Taper points along this axis.\")) + init_value(k3d::Z) + init_enumeration(k3d::axis_values())),\n\t\tm_taper_factor(init_owner(*this) + init_name(\"taper_factor\") + init_label(_(\"Taper Factor\")) + init_description(_(\"Controls the amount of taper, 0 = no taper, 1 = taper to a point.\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_displace_x(init_owner(*this) + init_name(\"displace_x\") + init_label(_(\"Displace X\")) + init_description(_(\"Enable point displacement along the X axis.\")) + init_value(true)),\n\t\tm_displace_y(init_owner(*this) + init_name(\"displace_y\") + init_label(_(\"Displace Y\")) + init_description(_(\"Enable point displacement along the Y axis.\")) + init_value(true)),\n\t\tm_displace_z(init_owner(*this) + init_name(\"displace_z\") + init_label(_(\"Displace Z\")) + init_description(_(\"Enable point displacement along the Z axis.\")) + init_value(false))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_axis.changed_signal().connect(make_update_mesh_slot());\n\t\tm_taper_factor.changed_signal().connect(make_update_mesh_slot());\n\t\tm_displace_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_displace_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_displace_z.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tclass worker\n\t{\n\tpublic:\n\t\tworker(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints, const k3d::axis Axis, const double Size, const bool DisplaceX, const bool DisplaceY, const bool DisplaceZ, const double TaperFactor) :\n\t\t\tinput_points(InputPoints),\n\t\t\tpoint_selection(PointSelection),\n\t\t\toutput_points(OutputPoints),\n\t\t\taxis(Axis),\n\t\t\tsize(Size),\n\t\t\tdisplace_x(DisplaceX),\n\t\t\tdisplace_y(DisplaceY),\n\t\t\tdisplace_z(DisplaceZ),\n\t\t\ttaper_factor(TaperFactor)\n\t\t{\n\t\t}\n\n\t\tvoid operator()(const k3d::parallel::blocked_range<k3d::uint_t>& range) const\n\t\t{\n\t\t\tconst k3d::uint_t point_begin = range.begin();\n\t\t\tconst k3d::uint_t point_end = range.end();\n\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t{\n\t\t\t\tconst double scale = k3d::mix(1.0, 1.0 - taper_factor, std::abs(input_points[point][axis] / size));\n\n\t\t\t\tk3d::point3 position(input_points[point]);\n\t\t\t\tif(displace_x)\n\t\t\t\t\tposition[0] *= scale;\n\t\t\t\tif(displace_y)\n\t\t\t\t\tposition[1] *= scale;\n\t\t\t\tif(displace_z)\n\t\t\t\t\tposition[2] *= scale;\n\n\t\t\t\toutput_points[point] = k3d::mix(input_points[point], position, point_selection[point]);\n\t\t\t}\n\t\t}\n\n\tprivate:\n\t\tconst k3d::mesh::points_t& input_points;\n\t\tconst k3d::mesh::selection_t& point_selection;\n\t\tk3d::mesh::points_t& output_points;\n\t\tconst k3d::axis axis;\n\t\tconst double size;\n\t\tconst bool displace_x;\n\t\tconst bool displace_y;\n\t\tconst bool displace_z;\n\t\tconst double taper_factor;\n\t};\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\n\t\tconst k3d::axis axis = m_axis.pipeline_value();\n\t\tconst double taper_factor = m_taper_factor.pipeline_value();\n\t\tconst bool displace_x = m_displace_x.pipeline_value();\n\t\tconst bool displace_y = m_displace_y.pipeline_value();\n\t\tconst bool displace_z = m_displace_z.pipeline_value();\n\n\t\tconst k3d::bounding_box3 bounds = k3d::mesh::bounds(InputPoints);\n\t\tdouble size = 0.0;\n\t\tswitch(axis)\n\t\t{\n\t\t\tcase k3d::X:\n\t\t\t\tsize = std::max(std::abs(bounds.px), std::abs(bounds.nx));\n\t\t\t\tbreak;\n\t\t\tcase k3d::Y:\n\t\t\t\tsize = std::max(std::abs(bounds.py), std::abs(bounds.ny));\n\t\t\t\tbreak;\n\t\t\tcase k3d::Z:\n\t\t\t\tsize = std::max(std::abs(bounds.pz), std::abs(bounds.nz));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tassert_not_reached();\n\t\t}\n\t\tif(0.0 == size)\n\t\t\treturn;\n\n\t\tk3d::parallel::parallel_for(\n\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, OutputPoints.size(), k3d::parallel::grain_size()),\n\t\t\tworker(InputPoints, PointSelection, OutputPoints, axis, size, displace_x, displace_y, displace_z, taper_factor));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<taper_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x4d05f002, 0x27764b67, 0xa1a12e21, 0x436c3d06),\n\t\t\t\t\"TaperPoints\",\n\t\t\t\t_(\"Tapers mesh points along an axis\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_axis;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_taper_factor;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_displace_x;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_displace_y;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_displace_z;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// taper_points_factory\n\nk3d::iplugin_factory& taper_points_factory()\n{\n\treturn taper_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/deformation/transform_points.cpp",
    "content": "// K-3D\n// Copyright (c) 2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"linear_transformation_worker.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n#include <k3dsdk/transformable.h>\n\n#include <k3dsdk/ipipeline_profiler.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// transform_points\n\nclass transform_points :\n\tpublic k3d::transformable<k3d::mesh_simple_deformation_modifier>\n{\n\ttypedef k3d::transformable<k3d::mesh_simple_deformation_modifier> base;\n\npublic:\n\ttransform_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_input_matrix.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tk3d::ipipeline_profiler::profile profile(document().pipeline_profiler(), *this, \"Deform Mesh\");\n\t\tconst k3d::matrix4 transformation = m_input_matrix.pipeline_value();\n\t\tk3d::parallel::parallel_for(\n\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, OutputPoints.size(), k3d::parallel::grain_size()),\n\t\t\tlinear_transformation_worker(InputPoints, PointSelection, OutputPoints, transformation));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<transform_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > > > factory(\n\t\t\t\tk3d::uuid(0x8543cf2d, 0x170c4edc, 0x9bf821bd, 0xe8567b6f),\n\t\t\t\t\"TransformPoints\",\n\t\t\t\t_(\"Transform mesh points using input matrix\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// transform_points_factory\n\nk3d::iplugin_factory& transform_points_factory()\n{\n\treturn transform_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/deformation/translate_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"linear_transformation_worker.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// translate_points\n\nclass translate_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\ttranslate_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_x(init_owner(*this) + init_name(\"x\") + init_label(_(\"X\")) + init_description(_(\"X translation\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_y(init_owner(*this) + init_name(\"y\") + init_label(_(\"Y\")) + init_description(_(\"Y translation\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z(init_owner(*this) + init_name(\"z\") + init_label(_(\"Z\")) + init_description(_(\"Z translation\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_x.changed_signal().connect(make_update_mesh_slot());\n\t\tm_y.changed_signal().connect(make_update_mesh_slot());\n\t\tm_z.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::matrix4 transformation = k3d::translate3(m_x.pipeline_value(), m_y.pipeline_value(), m_z.pipeline_value());\n\n\t\tk3d::parallel::parallel_for(\n\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, OutputPoints.size(), k3d::parallel::grain_size()),\n\t\t\tlinear_transformation_worker(InputPoints, PointSelection, OutputPoints, transformation));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<translate_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x460b8dac, 0x780240a3, 0xa2f87b5b, 0xba0272cd),\n\t\t\t\t\"TranslatePoints\",\n\t\t\t\t_(\"Translates mesh points\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// translate_points_factory\n\nk3d::iplugin_factory& translate_points_factory()\n{\n\treturn translate_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/deformation/tweak_points.cpp",
    "content": "// K-3D\n// Copyright (c) 2005, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"mesh_modifier.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// tweak_points\n\nclass tweak_points :\n\tpublic _k3d::mesh_modifier<k3d::node>\n{\n\ttypedef _k3d::mesh_modifier<k3d::node> base;\n\ttypedef std::pair<k3d::mesh::indices_t, k3d::mesh::points_t> tweaks_t;\n\npublic:\n\ttweak_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_tweaks(init_owner(*this) + init_name(\"tweaks\") + init_label(_(\"Tweaks\")) + init_description(_(\"A pair of indices_t and points_t arrays, indicating which positions to set\")) + init_value(tweaks_t()))\n\t{\n\t\tm_tweaks.changed_signal().connect(k3d::hint::converter<\n\t\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_execute(const std::vector<k3d::ihint*>& Hints, const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tk3d::bool_t reset = Hints.empty();\n\t\tfor(k3d::uint_t i = 0; i != Hints.size(); ++i)\n\t\t{\n\t\t\tif(!dynamic_cast<k3d::hint::mesh_geometry_changed*>(Hints[i]) && !dynamic_cast<k3d::hint::selection_changed*>(Hints[i]))\n\t\t\t\treset = true;\n\t\t}\n\n\t\tif(reset)\n\t\t{\n\t\t\tOutput = Input;\n\t\t\tif(!m_tweaked_points || m_tweaked_points->size() != Output.points->size())\n\t\t\t\tm_tweaked_points = Output.points;\n\t\t}\n\n\t\tk3d::mesh::points_t& output_points = m_tweaked_points.writable();\n\n\t\tconst tweaks_t tweaks = m_tweaks.pipeline_value();\n\t\tconst k3d::uint_t tweaks_begin = 0;\n\t\tconst k3d::uint_t tweaks_end = tweaks.first.size();\n\t\tconst k3d::uint_t point_count = output_points.size();\n\t\treturn_if_fail(tweaks_end == tweaks.second.size());\n\t\tk3d::state_change_set* change_set = document().state_recorder().current_change_set();\n\t\tif(change_set)\n\t\t{\n\t\t\tk3d::mesh::points_t old_positions;\n\t\t\tfor(k3d::uint_t i = tweaks_begin; i != tweaks_end; ++i)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t point_idx = tweaks.first[i];\n\t\t\t\tif(point_idx < point_count)\n\t\t\t\t\told_positions.push_back(output_points[point_idx]);\n\t\t\t}\n\t\t\t// If undo/redo is being recorded, we need to store the old positions at the new tweak indices for the old state:\n\t\t\tchange_set->record_old_state(new tweaks_container(m_tweaks, tweaks.first, old_positions));\n\t\t\t// The new state is simply the new tweak indices and the new positions:\n\t\t\tchange_set->record_new_state(new tweaks_container(m_tweaks, tweaks.first, tweaks.second));\n\t\t}\n\n\t\tfor(k3d::uint_t i = tweaks_begin; i != tweaks_end; ++i)\n\t\t{\n\t\t\tconst k3d::uint_t point_idx = tweaks.first[i];\n\t\t\tif(point_idx < point_count)\n\t\t\t\toutput_points[point_idx] = tweaks.second[i];\n\t\t}\n\t\tOutput.points = m_tweaked_points;\n\t}\n\n\tvoid save(k3d::xml::element& Element, const k3d::ipersistent::save_context& Context)\n\t{\n\t\tbase::save(Element, Context);\n\n\t\tk3d::xml::element& tweaks = Element.append(k3d::xml::element(\"tweaks\"));\n\n\t\tif(!m_input_mesh.pipeline_value())\n\t\t\treturn;\n\n\t\tconst k3d::mesh::points_t& input_points = *m_input_mesh.pipeline_value()->points;\n\t\tconst k3d::mesh::points_t& output_points = *m_output_mesh.pipeline_value()->points;\n\n\t\tfor(k3d::uint_t point = 0; point != input_points.size(); ++point)\n\t\t{\n\t\t\t// Note: exact compare should work here, since we copied from the original array\n\t\t\tif(input_points[point] != output_points[point])\n\t\t\t\ttweaks.append(k3d::xml::element(\"tweak\", k3d::xml::attribute(\"index\", point), k3d::xml::attribute(\"value\", output_points[point])));\n\t\t}\n\t}\n\n\tvoid load(k3d::xml::element& Element, const k3d::ipersistent::load_context& Context)\n\t{\n\t\tbase::load(Element, Context);\n\n\t\tk3d::xml::element* const tweaks = k3d::xml::find_element(Element, \"tweaks\");\n\t\treturn_if_fail(tweaks);\n\n\t\ttweaks_t loaded_tweaks;\n\t\tsize_t count = 0;\n\t\tfor(k3d::xml::element::elements_t::iterator element = tweaks->children.begin(); element != tweaks->children.end(); ++element)\n\t\t{\n\t\t\tif(element->name == \"tweak\")\n\t\t\t{\n\t\t\t\tsize_t index = k3d::xml::attribute_value<size_t>(*element, \"index\", count);\n\t\t\t\tk3d::point3 value = k3d::xml::attribute_value<k3d::point3>(*element, \"value\", k3d::point3(0, 0, 0));\n\t\t\t\tif (value != k3d::point3(0,0,0)) // Skip zeros from old file format\n\t\t\t\t{\n\t\t\t\t\tloaded_tweaks.first.push_back(index);\n\t\t\t\t\tloaded_tweaks.second.push_back(value);\n\t\t\t\t}\n\t\t\t\t++count;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tk3d::log() << warning << k3d_file_reference << \": unknown element \\\"\" << element->name << \"\\\" will be ignored ... \" << std::endl;\n\t\t\t}\n\t\t}\n\t\tm_tweaks.set_value(loaded_tweaks);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<tweak_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xed302b87, 0x49bf4fe6, 0x99064963, 0x17ec12d9),\n\t\t\t\t\"TweakPoints\",\n\t\t\t\t_(\"Sets the point positions at the given indices\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(tweaks_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) m_tweaks;\n\t/// Stores the cumulative result of all the tweaks\n\tk3d::pipeline_data<k3d::mesh::points_t> m_tweaked_points;\n\n\tclass tweaks_container :\n\t\tpublic k3d::istate_container\n\t{\n\tpublic:\n\t\ttweaks_container(k3d::iproperty& Tweaks, const k3d::mesh::indices_t& StoredIndices, const k3d::mesh::points_t& StoredPoints) :\n\t\t\tm_tweaks(Tweaks),\n\t\t\tm_stored_indices(StoredIndices),\n\t\t\tm_stored_points(StoredPoints)\n\t\t{\n\t\t}\n\n\t\tvoid restore_state()\n\t\t{\n\t\t\tk3d::property::set_internal_value(m_tweaks, std::make_pair(m_stored_indices, m_stored_points));\n\t\t}\n\n\tprivate:\n\t\tk3d::iproperty& m_tweaks;\n\t\tconst k3d::mesh::indices_t m_stored_indices;\n\t\tconst k3d::mesh::points_t m_stored_points;\n\t};\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// tweak_points_factory\n\nk3d::iplugin_factory& tweak_points_factory()\n{\n\treturn tweak_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n\n\n"
  },
  {
    "path": "modules/deformation/twist_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/bounding_box3.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_simple_deformation_modifier.h>\n#include <k3dsdk/parallel/blocked_range.h>\n#include <k3dsdk/parallel/parallel_for.h>\n#include <k3dsdk/parallel/threads.h>\n\nnamespace module\n{\n\nnamespace deformation\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// twist_points\n\nclass twist_points :\n\tpublic k3d::mesh_simple_deformation_modifier\n{\n\ttypedef k3d::mesh_simple_deformation_modifier base;\n\npublic:\n\ttwist_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_axis(init_owner(*this) + init_name(\"axis\") + init_label(_(\"Axis\")) + init_description(_(\"Twist around given axis\")) + init_value(k3d::Z) + init_enumeration(k3d::axis_values())),\n\t\tm_angle(init_owner(*this) + init_name(\"angle\") + init_label(_(\"Angle\")) + init_description(_(\"Twist angle\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_axis.changed_signal().connect(make_update_mesh_slot());\n\t\tm_angle.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tclass worker\n\t{\n\tpublic:\n\t\tworker(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints, const k3d::axis Axis, const double Size, const k3d::point3& Angles) :\n\t\t\tinput_points(InputPoints),\n\t\t\tpoint_selection(PointSelection),\n\t\t\toutput_points(OutputPoints),\n\t\t\taxis(Axis),\n\t\t\tsize(Size),\n\t\t\tangles(Angles)\n\t\t{\n\t\t}\n\n\t\tvoid operator()(const k3d::parallel::blocked_range<k3d::uint_t>& range) const\n\t\t{\n\t\t\tconst k3d::uint_t point_begin = range.begin();\n\t\t\tconst k3d::uint_t point_end = range.end();\n\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t{\n\t\t\t\tconst double twist = input_points[point][axis] / size;\n\t\t\t\toutput_points[point] = k3d::mix(input_points[point], k3d::rotate3(angles * twist) * input_points[point], point_selection[point]);\n\t\t\t}\n\t\t}\n\n\tprivate:\n\t\tconst k3d::mesh::points_t& input_points;\n\t\tconst k3d::mesh::selection_t& point_selection;\n\t\tk3d::mesh::points_t& output_points;\n\t\tconst k3d::axis axis;\n\t\tconst double size;\n\t\tconst k3d::point3& angles;\n\t};\n\n\tvoid on_deform_mesh(const k3d::mesh::points_t& InputPoints, const k3d::mesh::selection_t& PointSelection, k3d::mesh::points_t& OutputPoints)\n\t{\n\t\tconst k3d::axis axis = m_axis.pipeline_value();\n\t\tconst double angle = m_angle.pipeline_value();\n\n\t\tconst k3d::bounding_box3 bounds = k3d::mesh::bounds(InputPoints);\n\t\tdouble size = 0.0;\n\t\tk3d::point3 angles;\n\t\tswitch(axis)\n\t\t{\n\t\t\tcase k3d::X:\n\t\t\t\tsize = std::max(std::abs(bounds.px), std::abs(bounds.nx));\n\t\t\t\tangles = k3d::point3(angle, 0, 0);\n\t\t\t\tbreak;\n\t\t\tcase k3d::Y:\n\t\t\t\tsize = std::max(std::abs(bounds.py), std::abs(bounds.ny));\n\t\t\t\tangles = k3d::point3(0, angle, 0);\n\t\t\t\tbreak;\n\t\t\tcase k3d::Z:\n\t\t\t\tsize = std::max(std::abs(bounds.pz), std::abs(bounds.nz));\n\t\t\t\tangles = k3d::point3(0, 0, angle);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tassert_not_reached();\n\t\t}\n\t\tif(0.0 == size)\n\t\t\treturn;\n\n\t\tk3d::parallel::parallel_for(\n\t\t\tk3d::parallel::blocked_range<k3d::uint_t>(0, OutputPoints.size(), k3d::parallel::grain_size()),\n\t\t\tworker(InputPoints, PointSelection, OutputPoints, axis, size, angles));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<twist_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x76051829, 0x66b54dbf, 0xb67d7719, 0xb2e2596f),\n\t\t\t\t\"TwistPoints\",\n\t\t\t\t_(\"Twists mesh points along an axis\"),\n\t\t\t\t\"Deformation\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_axis;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_angle;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// twist_points_factory\n\nk3d::iplugin_factory& twist_points_factory()\n{\n\treturn twist_points::get_factory();\n}\n\n} // namespace deformation\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/development/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-development)\nK3D_CREATE_MODULE_PROXY(k3d-development)"
  },
  {
    "path": "modules/development/glsl_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n\nnamespace module\n{\n\nnamespace development\n{\n\nGLhandleARB compile_shader(const GLenum ShaderType, const std::string& ShaderSource)\n{\n\tGLhandleARB shader_object = glCreateShaderObjectARB(ShaderType);\n\treturn_val_if_fail(shader_object, 0);\n\n\tconst GLcharARB* source = ShaderSource.c_str();\n\tglShaderSourceARB(shader_object, 1, &source, 0);\n\tglCompileShaderARB(shader_object);\n\n\tGLint compile_status = 0;\n\tglGetObjectParameterivARB(shader_object, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status);\n\tk3d::log() << debug << \"compile status: \" << compile_status << std::endl;\n\n\tGLint log_length = 0;\n\tglGetObjectParameterivARB(shader_object, GL_OBJECT_INFO_LOG_LENGTH_ARB, &log_length);\n\tstd::string log(log_length, ' ');\n\tglGetInfoLogARB(shader_object, log_length, 0, const_cast<char*>(log.data()));\n\n\tk3d::log() << debug << \"compile log: \" << log << std::endl;\n\n\treturn shader_object;\n}\n\nGLhandleARB link_shader(const GLhandleARB VertexObject, const GLhandleARB FragmentObject)\n{\n\tGLhandleARB program_object = glCreateProgramObjectARB();\n\treturn_val_if_fail(program_object, 0);\n\n\tglAttachObjectARB(program_object, VertexObject);\n\tglAttachObjectARB(program_object, FragmentObject);\n\n\tglLinkProgramARB(program_object);\n\n\tGLint link_status = 0;\n\tglGetObjectParameterivARB(program_object, GL_OBJECT_LINK_STATUS_ARB, &link_status);\n\tk3d::log() << debug << \"link status: \" << link_status << std::endl;\n\n\tGLint log_length = 0;\n\tglGetObjectParameterivARB(program_object, GL_OBJECT_INFO_LOG_LENGTH_ARB, &log_length);\n\tstd::string log(log_length, ' ');\n\tglGetInfoLogARB(program_object, log_length, 0, const_cast<char*>(log.data()));\n\n\tk3d::log() << debug << \"link log: \" << log << std::endl;\n\n\treturn program_object;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// glsl_painter\n\nclass glsl_painter :\n\tpublic k3d::node,\n\tpublic k3d::gl::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tglsl_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_vertex_shader(init_owner(*this) + init_name(\"vertex_shader\") + init_label(_(\"Vertex Shader\")) + init_description(_(\"Vertex shader source code\")) + init_value<std::string>(\"\")),\n\t\tm_fragment_shader(init_owner(*this) + init_name(\"fragment_shader\") + init_label(_(\"Fragment Shader\")) + init_description(_(\"Fragment shader source code\")) + init_value<std::string>(\"\")),\n\t\tm_program_object(0)\n\t{\n\t\tm_vertex_shader.changed_signal().connect(sigc::mem_fun(*this, &glsl_painter::on_shader_source_changed));\n\t\tm_fragment_shader.changed_signal().connect(sigc::mem_fun(*this, &glsl_painter::on_shader_source_changed));\n\t}\n\n\t~glsl_painter()\n\t{\n\t\tif(m_program_object)\n\t\t\tglDeleteObjectARB(m_program_object);\n\t}\n\n\tvoid on_shader_source_changed(k3d::ihint* Hint)\n\t{\n\t\tif(m_program_object)\n\t\t{\n\t\t\tglDeleteObjectARB(m_program_object);\n\t\t\tm_program_object = 0;\n\t\t}\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!m_program_object)\n\t\t{\n\t\t\tconst GLhandleARB vertex_shader_object = compile_shader(GL_VERTEX_SHADER_ARB, m_vertex_shader.pipeline_value());\n\t\t\tconst GLhandleARB fragment_shader_object = compile_shader(GL_FRAGMENT_SHADER_ARB, m_fragment_shader.pipeline_value());\n\t\t\tm_program_object = link_shader(vertex_shader_object, fragment_shader_object);\n\n\t\t\tif(fragment_shader_object)\n\t\t\t\tglDeleteObjectARB(fragment_shader_object);\n\t\t\tif(vertex_shader_object)\n\t\t\t\tglDeleteObjectARB(vertex_shader_object);\n\t\t}\n\n\t\tglUseProgramObjectARB(m_program_object);\n\n\t\tconst k3d::iproperty_collection::properties_t& properties = node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t\t{\n\t\t\tk3d::iproperty& property = **prop;\n\t\t\tif(property.property_type() == typeid(k3d::inode*))\n\t\t\t{\n\t\t\t\tif(k3d::gl::imesh_painter* const painter = dynamic_cast<k3d::gl::imesh_painter*>(boost::any_cast<k3d::inode*>(k3d::property::pipeline_value(property))))\n\t\t\t\t{\n\t\t\t\t\tpainter->paint_mesh(Mesh, RenderState, ChangedSignal);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tglUseProgramObjectARB(0);\n\t}\n\t\n\tvoid select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::iproperty_collection::properties_t& properties = node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t\t{\n\t\t\tk3d::iproperty& property = **prop;\n\t\t\tif(property.property_type() == typeid(k3d::inode*))\n\t\t\t{\n\t\t\t\tif(k3d::gl::imesh_painter* const painter = dynamic_cast<k3d::gl::imesh_painter*>(boost::any_cast<k3d::inode*>(k3d::property::pipeline_value(property))))\n\t\t\t\t{\n\t\t\t\t\tpainter->select_mesh(Mesh, RenderState, SelectionState, ChangedSignal);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<glsl_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x24d4d987, 0x62f849ea, 0xad1907fe, 0xe2a0a728),\n\t\t\t\"OpenGLSLPainter\",\n\t\t\t_(\"Applies an OpenGL shader to downstream painters\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, script_property, with_serialization) m_vertex_shader;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, script_property, with_serialization) m_fragment_shader;\n\tGLhandleARB m_program_object;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// glsl_painter_factory\n\nk3d::iplugin_factory& glsl_painter_factory()\n{\n\treturn glsl_painter::get_factory();\n}\n\n} // namespace development\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/development/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the development plugin module, to protect public symbols from name clashes with other modules\nnamespace development\n{\n\nextern k3d::iplugin_factory& glsl_painter_factory();\n\n} // namespace development\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::development::glsl_painter_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/double/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-double)\nK3D_CREATE_MODULE_PROXY(k3d-double)\n\nTARGET_LINK_LIBRARIES(k3d-double k3dsdk-expression)\n"
  },
  {
    "path": "modules/double/add.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include <k3dsdk/scalar_source.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace scalar\n{\n\n/// Takes two doubles as input and produce their sum as output\nclass add :\n\tpublic k3d::scalar_source\n{\n\ttypedef k3d::scalar_source base;\npublic:\n\tadd(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, _(\"Sum of inputs.\")),\n\t\tm_input1(init_owner(*this) + init_name(\"input1\") + init_label(_(\"Input 1\")) + init_description(_(\"First input float\")) + init_value(0.0)),\n\t\tm_input2(init_owner(*this) + init_name(\"input2\") + init_label(_(\"Input 2\")) + init_description(_(\"Second input float\")) + init_value(0.0))\n\t{\n\t\tm_input1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t\tm_input2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<add > factory(\n\t\t\tk3d::uuid(0xe2d5e227, 0x98a6424f, 0xae607c8c, 0xc4e99bec),\n\t\t\t\"DoubleAdd\",\n\t\t\t_(\"Add two double inputs and produce their sum as output\"),\n\t\t\t\"Double\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input1;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input2;\n\n\tvoid on_update_value(k3d::double_t& Output)\n\t{\n\t\tOutput = m_input1.pipeline_value() + m_input2.pipeline_value();\n\t}\n};\n\nk3d::iplugin_factory& add_factory()\n{\n\treturn add::get_factory();\n}\n\n} //namespace scalar\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/double/divide.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include <k3dsdk/scalar_source.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace scalar\n{\n\n/// An object that take two doubles as input and produce their quotient as output\nclass divide :\n\tpublic k3d::scalar_source\n{\n\ttypedef k3d::scalar_source base;\npublic:\n\tdivide(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, _(\"Quotient of inputs\")),\n\t\tm_input1(init_owner(*this) + init_name(\"input1\") + init_label(_(\"Input 1\")) + init_description(_(\"First input float\")) + init_value(0.0)),\n\t\tm_input2(init_owner(*this) + init_name(\"input2\") + init_label(_(\"Input 2\")) + init_description(_(\"Second input float\")) + init_value(1.0))\n\t{\n\t\tm_input1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t\tm_input2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<divide > factory(\n\t\t\tk3d::uuid(0xa797e7a9, 0x237f45a8, 0xa6ee43b3, 0xfd58596f),\n\t\t\t\"DoubleDivide\",\n\t\t\t_(\"Divide two double inputs and produce their quotient as output\"),\n\t\t\t\"Double\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input1;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input2;\n\n\tvoid on_update_value(k3d::double_t& Output)\n\t{\n\t\tconst k3d::double_t input1 = m_input1.pipeline_value();\n\t\tconst k3d::double_t input2 = m_input2.pipeline_value();\n\n\t\tOutput = input2 != 0 ?  input1 / input2 : input1;\n\t}\n};\n\nk3d::iplugin_factory& divide_factory()\n{\n\treturn divide::get_factory();\n}\n\n} //namespace scalar\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/double/double_to_string.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/value_demand_storage.h>\n\n#include <boost/format.hpp>\n\nnamespace module\n{\n\nnamespace scalar\n{\n\nclass double_to_string :\n\tpublic k3d::node\n{\n\ttypedef k3d::node base;\npublic:\n\tdouble_to_string(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input(init_owner(*this) + init_name(\"input\") + init_label(_(\"Input\")) + init_description(_(\"Float value\")) + init_value(0.0)),\n\t\tm_format(init_owner(*this) + init_name(\"format\") + init_label(_(\"Format\")) + init_description(_(\"printf()-style format string.\")) + init_value(std::string(\"%f\"))),\n\t\tm_output(init_owner(*this) + init_name(\"output\") + init_label(_(\"Output text\")) + init_description(_(\"Output string.\")) + init_value(k3d::string_t()))\n\t{\n\t\tm_input.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_output.make_slot()));\n\t\tm_format.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_output.make_slot()));\n\n\t\tm_output.set_update_slot(sigc::mem_fun(*this, &double_to_string::execute));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<double_to_string > factory(\n\t\t\tk3d::uuid(0x3af7d777, 0x691d41b0, 0xaa801d59, 0x7ee4180e),\n\t\t\t\"DoubleToString\",\n\t\t\t_(\"Converts a double to a string using printf() style double_to_stringting\"),\n\t\t\t\"Double String\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_format;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_output;\n\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::string_t& Output)\n\t{\n\t\ttry\n\t\t{\n\t\t\tOutput = (boost::format(m_format.pipeline_value()) % m_input.pipeline_value()).str();\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\tOutput = k3d::string_t();\n\t\t}\n\t}\n\n};\n\nk3d::iplugin_factory& double_to_string_factory()\n{\n\treturn double_to_string::get_factory();\n}\n\n} //namespace scalar\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/double/expression.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/scalar_source.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/expression/parser.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\nnamespace module\n{\n\nnamespace scalar\n{\n\nclass expression :\n\tpublic k3d::scalar_source\n{\n\ttypedef k3d::scalar_source base;\npublic:\n\texpression(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, _(\"Output value.\")),\n\t\tm_expression(init_owner(*this) + init_name(\"expression\") + init_label(_(\"Expression\")) + init_description(_(\"Expression to be evaluated.\")) + init_value(std::string(_(\"cos(pi/2)\")))),\n\t\tm_user_property_changed_signal(*this)\n\t{\n\t\tm_expression.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t\tm_user_property_changed_signal.connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<expression > factory(\n\t\t\tk3d::uuid(0x53de65d7, 0xee4a01e2, 0x259127b2, 0x676834f8),\n\t\t\t\"DoubleExpression\",\n\t\t\t_(\"Calculates a C-style expression, returning a double value as output\"),\n\t\t\t\"Double\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_expression;\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n\n\tvoid on_update_value(k3d::double_t& Output)\n\t{\n\t\tconst k3d::string_t expression = m_expression.pipeline_value();\n\n\t\tk3d::string_t variables;\n\t\tstd::vector<k3d::double_t> values;\n\n\t\tconst k3d::iproperty_collection::properties_t& properties = k3d::node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t{\n\t\t\tif(!dynamic_cast<k3d::iuser_property*>(*property))\n\t\t\t\tcontinue;\n\n\t\t\tif((**property).property_type() != typeid(k3d::double_t))\n\t\t\t{\n\t\t\t\tk3d::log() << warning << factory().name() << \": user property [\" << (**property).property_name() << \"] with unsupported type [\" << k3d::demangle((**property).property_type()) << \"] will be ignored\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(values.size())\n\t\t\t\tvariables += \",\";\n\t\t\tvariables += (**property).property_name();\n\t\t\tvalues.push_back(k3d::property::pipeline_value<k3d::double_t>(**property));\n\t\t}\n\n\t\tk3d::expression::parser parser;\n\t\tif(!parser.parse(expression, variables))\n\t\t{\n\t\t\tk3d::log() << error << factory().name() << \": expression parsing failed: \" << parser.last_parse_error() << std::endl;\n\t\t\tOutput = 0.0;\n\t\t\treturn;\n\t\t}\n\n\t\tOutput = parser.evaluate(&values[0]);\n\t}\n\n};\n\nk3d::iplugin_factory& expression_factory()\n{\n\treturn expression::get_factory();\n}\n\n} //namespace scalar\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/double/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace scalar\n{\n\nextern k3d::iplugin_factory& add_factory();\nextern k3d::iplugin_factory& divide_factory();\nextern k3d::iplugin_factory& expression_factory();\nextern k3d::iplugin_factory& double_to_string_factory();\nextern k3d::iplugin_factory& modulo_factory();\nextern k3d::iplugin_factory& multiply_factory();\nextern k3d::iplugin_factory& sine_factory();\nextern k3d::iplugin_factory& subtract_factory();\n\n} // namespace scalar\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::scalar::add_factory());\n\tRegistry.register_factory(module::scalar::divide_factory());\n\tRegistry.register_factory(module::scalar::expression_factory());\n\tRegistry.register_factory(module::scalar::double_to_string_factory());\n\tRegistry.register_factory(module::scalar::modulo_factory());\n\tRegistry.register_factory(module::scalar::multiply_factory());\n\tRegistry.register_factory(module::scalar::sine_factory());\n\tRegistry.register_factory(module::scalar::subtract_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/double/modulo.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include <k3dsdk/scalar_source.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\n#include <cmath>\n\nnamespace module\n{\n\nnamespace scalar\n{\n\n/// An object that take two doubles as input and produce their remainder as output\nclass modulo :\n\tpublic k3d::scalar_source\n{\n\ttypedef k3d::scalar_source base;\npublic:\n\tmodulo(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, _(\"Remainder of inputs.\")),\n\t\tm_input1(init_owner(*this) + init_name(\"input1\") + init_label(_(\"Input 1\")) + init_description(_(\"First input float\")) + init_value(0.0)),\n\t\tm_input2(init_owner(*this) + init_name(\"input2\") + init_label(_(\"Input 2\")) + init_description(_(\"Second input float\")) + init_value(1.0))\n\t{\n\t\tm_input1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t\tm_input2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<modulo > factory(\n\t\t\tk3d::uuid(0x7c6cb94a, 0xe20d4fa2, 0xb56f0f2a, 0x50e822a0),\n\t\t\t\"DoubleModulo\",\n\t\t\t_(\"Modulo two double inputs and produce their remainder as output\"),\n\t\t\t\"Double\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input1;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input2;\n\n\tvoid on_update_value(k3d::double_t& Output)\n\t{\n\t\tconst k3d::double_t input1 = m_input1.pipeline_value();\n\t\tconst k3d::double_t input2 = m_input2.pipeline_value();\n\n\t\tOutput = input2 != 0 ?  std::fmod(input1, input2) : input1;\n\t}\n\n};\n\nk3d::iplugin_factory& modulo_factory()\n{\n\treturn modulo::get_factory();\n}\n\n} //namespace scalar\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/double/multiply.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include <k3dsdk/scalar_source.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace scalar\n{\n\n/// An object that take two doubles as input and produce their product as output\nclass multiply :\n\tpublic k3d::scalar_source\n{\n\ttypedef k3d::scalar_source base;\npublic:\n\tmultiply(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, _(\"Product of inputs.\")),\n\t\tm_input1(init_owner(*this) + init_name(\"input1\") + init_label(_(\"Input 1\")) + init_description(_(\"First input float\")) + init_value(0.0)),\n\t\tm_input2(init_owner(*this) + init_name(\"input2\") + init_label(_(\"Input 2\")) + init_description(_(\"Second input float\")) + init_value(1.0))\n\t{\n\t\tm_input1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t\tm_input2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t}\n\n\t// return the factory at module registration time\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<multiply > factory(\n\t\t\tk3d::uuid(0xd5d068d2, 0xb4f2470d, 0xb99280ae, 0x1b092e59),\n\t\t\t\"DoubleMultiply\",\n\t\t\t_(\"Multiply two double inputs and produce their product as output\"),\n\t\t\t\"Double\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\n\t// Implementation of the factory method required by the k3dinode interface:\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input1;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input2;\n\n\tvoid on_update_value(k3d::double_t& Output)\n\t{\n\t\tOutput = m_input1.pipeline_value() * m_input2.pipeline_value();\n\t}\n};\n\nk3d::iplugin_factory& multiply_factory()\n{\n\treturn multiply::get_factory();\n}\n\n} //namespace scalar\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/double/sine.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include <k3dsdk/scalar_source.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\n#include <cmath>\n\nnamespace module\n{\n\nnamespace scalar\n{\n\n/// Applies the sine() operator to input value\nclass sine :\n\tpublic k3d::scalar_source\n{\n\ttypedef k3d::scalar_source base;\npublic:\n\tsine(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, _(\"Sine wave function applied to input.\")),\n\t\tm_input(init_owner(*this) + init_name(\"input\") + init_label(_(\"Input value\")) + init_description(_(\"Input value\")) + init_value(0.0))\n\t{\n\t\tm_input.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sine > factory(\n\t\t\tk3d::uuid(0xb00248d6, 0x9d6843d5, 0xab5a24bc, 0x852519e5),\n\t\t\t\"DoubleSine\",\n\t\t\t_(\"Applies a sine function to its input\"),\n\t\t\t\"Double\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input;\n\n\tvoid on_update_value(k3d::double_t& Output)\n\t{\n\t\tOutput = std::sin(m_input.pipeline_value());\n\t}\n};\n\nk3d::iplugin_factory& sine_factory()\n{\n\treturn sine::get_factory();\n}\n\n} //namespace scalar\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/double/subtract.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include <k3dsdk/scalar_source.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace scalar\n{\n\n/// An object that take two doubles as input and produce their difference as output\nclass subtract :\n\tpublic k3d::scalar_source\n{\n\ttypedef k3d::scalar_source base;\npublic:\n\tsubtract(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, _(\"Difference of inputs.\")),\n\t\tm_input1(init_owner(*this) + init_name(\"input1\") + init_label(_(\"Input 1\")) + init_description(_(\"First input float\")) + init_value(0.0)),\n\t\tm_input2(init_owner(*this) + init_name(\"input2\") + init_label(_(\"Input 2\")) + init_description(_(\"Second input float\")) + init_value(0.0))\n\t{\n\t\tm_input1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t\tm_input2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_value_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<subtract > factory(\n\t\t\tk3d::uuid(0x2b788bf5, 0x09e44dd4, 0x866a2d39, 0x1b782873),\n\t\t\t\"DoubleSubtract\",\n\t\t\t_(\"Subtract two double inputs and produce their difference as output\"),\n\t\t\t\"Double\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input1;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input2;\n\n\tvoid on_update_value(k3d::double_t& Output)\n\t{\n\t\tOutput = m_input1.pipeline_value() - m_input2.pipeline_value();\n\t}\n};\n\nk3d::iplugin_factory& subtract_factory()\n{\n\treturn subtract::get_factory();\n}\n\n} // namespace scalar\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/euler_operations/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-euler_operations)\nK3D_CREATE_MODULE_PROXY(k3d-euler_operations)\n\n"
  },
  {
    "path": "modules/euler_operations/kill_edge_and_vertex.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2009 Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/euler_operations.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/vectors.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace euler\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// kill_edge_and_vertex\n\nclass kill_edge_and_vertex :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tkill_edge_and_vertex(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n      boost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n      if(!polyhedron)\n        continue;\n\n      k3d::mesh::indices_t edge_list;\n      const k3d::uint_t edge_begin = 0;\n      const k3d::uint_t edge_end = edge_begin + polyhedron->edge_selections.size();\n      for(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n      {\n        if(polyhedron->edge_selections[edge])\n          edge_list.push_back(edge);\n      }\n      \n      const k3d::mesh::points_t& points = *Input.points;\n      \n      k3d::mesh::bools_t boundary_edges;\n      k3d::mesh::indices_t companions;\n      k3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, companions);\n      \n      k3d::euler::kill_edge_and_vertex(*polyhedron, edge_list, boundary_edges, companions, points.size());\n    }\n\t\t\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<kill_edge_and_vertex,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x42c80daa, 0x214fc707, 0x030c24a5, 0x665fcd4b),\n\t\t\t\t\"EulerKillEdgeAndVertex\",\n\t\t\t\t_(\"Apply the Kill Edge And Vertex (KEV) Euler operation to the selected edges\"),\n\t\t\t\t\"Mesh\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// kill_edge_and_vertex_factory\n\nk3d::iplugin_factory& kill_edge_and_vertex_factory()\n{\n\treturn kill_edge_and_vertex::get_factory();\n}\n\n} // namespace euler\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/euler_operations/kill_edge_make_loop.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2009 Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/euler_operations.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/high_res_timer.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/vectors.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace euler\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// kill_edge_make_loop\n\nclass kill_edge_make_loop :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tkill_edge_make_loop(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\t\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n      boost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\t\n      if(!polyhedron)\n        return;\n      \n      k3d::mesh::indices_t edge_list;\n      const k3d::uint_t edge_begin = 0;\n      const k3d::uint_t edge_end = edge_begin + polyhedron->edge_selections.size();\n      for(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n      {\n        if(polyhedron->edge_selections[edge])\n          edge_list.push_back(edge);\n      }\n      \n      const k3d::mesh::points_t& points = *Input.points;\n      \n      k3d::mesh::bools_t boundary_edges;\n      k3d::mesh::indices_t companions;\n      k3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, companions);\n      \n      k3d::mesh::normals_t face_normals(polyhedron->face_first_loops.size());\n      const k3d::uint_t face_begin = 0;\n      const k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n      for(k3d::uint_t face = face_begin; face != face_end; ++face)\n      {\n        face_normals[face] = k3d::normalize(k3d::polyhedron::normal(polyhedron->vertex_points, polyhedron->clockwise_edges, points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]));\n      }\n      \n      k3d::euler::kill_edge_make_loop(*polyhedron, edge_list, boundary_edges, companions, points, face_normals);\n    }\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<kill_edge_make_loop,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xe7bd38c1, 0xa841a725, 0x22e170b0, 0x417ba28a),\n\t\t\t\t\"EulerKillEdgeMakeLoop\",\n\t\t\t\t_(\"Apply the Kill Edge Make Loop (KEML) Euler operation to the selected edges\"),\n\t\t\t\t\"Mesh\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// kill_edge_make_loop_factory\n\nk3d::iplugin_factory& kill_edge_make_loop_factory()\n{\n\treturn kill_edge_make_loop::get_factory();\n}\n\n} // namespace euler\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/euler_operations/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file module.cpp\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n\t\t\\created Jan 7, 2009\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace euler\n{\n\nextern k3d::iplugin_factory& kill_edge_make_loop_factory();\nextern k3d::iplugin_factory& kill_edge_and_vertex_factory();\n\n} // namespace inotify\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\nRegistry.register_factory(module::euler::kill_edge_make_loop_factory());\n\tRegistry.register_factory(module::euler::kill_edge_and_vertex_factory());\nK3D_MODULE_END\n"
  },
  {
    "path": "modules/external/CMakeLists.txt",
    "content": "PROJECT(k3d-external)\n\nSET(K3D_EXTERNAL_MODULES \"\" CACHE STRING \"Semicolon-separated list of external modules that will be included in the build.\")\n\nFOREACH(MODULE ${K3D_EXTERNAL_MODULES})\n\tOPTION(K3D_BUILD_${MODULE} \"Build external ${MODULE} module\" ON)\n\n\tIF(K3D_BUILD_${MODULE})\n\t\tFIND_PATH(${MODULE}_EXTERNAL_SOURCE_DIR\n\t\t\tCMakeLists.txt\n\t\t\tDOC \"Path to the ${MODULE} directory.\"\n\t\t\t)\n\n\t\tSET(MODULE_DIRECTORY ${${MODULE}_EXTERNAL_SOURCE_DIR})\n\n\t\tIF(NOT EXISTS ${MODULE_DIRECTORY})\n\t\t\tMESSAGE(SEND_ERROR \"You must specify an existing \\\"${MODULE}\\\" source directory using ${MODULE}_EXTERNAL_SOURCE_DIR.\")\n\t\tELSEIF(NOT EXISTS ${MODULE_DIRECTORY}/CMakeLists.txt)\n\t\t\tMESSAGE(SEND_ERROR \"The \\\"${MODULE}\\\" source directory \\\"${MODULE_DIRECTORY}\\\" must contain a CMakeLists.txt file.\")\n\t\tELSE()\n\t\t\tADD_SUBDIRECTORY(${MODULE_DIRECTORY} \"${CMAKE_CURRENT_BINARY_DIR}/${MODULE}\")\n\t\tENDIF()\n\tENDIF()\nENDFOREACH()\n\n"
  },
  {
    "path": "modules/file_magic/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-file-magic)\nK3D_CREATE_MODULE_PROXY(k3d-file-magic)\n\n"
  },
  {
    "path": "modules/file_magic/mime_type_handler.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/imime_type_handler.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace file\n{\n\nnamespace magic\n{\n\n/// Uses a hard-coded list of file extensions to identify MIME types.\nclass mime_type_handler :\n\tpublic k3d::imime_type_handler\n{\npublic:\n\tmime_type_handler()\n\t{\n\t}\n\n\t~mime_type_handler()\n\t{\n\t}\n\n\tconst k3d::bool_t test_type(const k3d::string_t& TestExtension, const k3d::string_t& TestType, const k3d::filesystem::path& File, k3d::string_t& FileType)\n\t{\n\t\tif(TestExtension != k3d::filesystem::extension(File).lowercase().raw())\n\t\t\treturn false;\n\n\t\tFileType = TestType;\n\n\t\tk3d::log() << info << \"Identified \" << File.native_console_string() << \" as \" << FileType << \" using \" << get_factory().name() << std::endl;\n\t\treturn true;\n\t}\n\n\tk3d::bool_t identify_mime_type(const k3d::filesystem::path& File, k3d::string_t& FileType)\n\t{\n\t\tif(test_type(\".bmp\", \"image/bmp\", File, FileType)) return true;\n\t\tif(test_type(\".jpe\", \"image/jpeg\", File, FileType)) return true;\n\t\tif(test_type(\".jpg\", \"image/jpeg\", File, FileType)) return true;\n\t\tif(test_type(\".jpeg\", \"image/jpeg\", File, FileType)) return true;\n\t\tif(test_type(\".k3d\", \"application/x-k3d\", File, FileType)) return true;\n\t\tif(test_type(\".png\", \"image/png\", File, FileType)) return true;\n\t\tif(test_type(\".pnm\", \"image/x-portable-anymap\", File, FileType)) return true;\n\t\tif(test_type(\".py\", \"text/x-python\", File, FileType)) return true;\n\t\tif(test_type(\".pyc\", \"application/x-python-bytecode\", File, FileType)) return true;\n\t\tif(test_type(\".sun\", \"image/x-sun-raster\", File, FileType)) return true;\n\t\tif(test_type(\".tif\", \"image/tiff\", File, FileType)) return true;\n\t\tif(test_type(\".tiff\", \"image/tiff\", File, FileType)) return true;\n\n\t\t// COLLADA\n\t\tif(test_type(\".dae\", \"application/x-collada\", File, FileType)) return true;\n\n\t\t// XTrackCAD types\n\t\tif(test_type(\".xtc\", \"application/x-xtrackcad\", File, FileType)) return true;\n\n\t\treturn false;\n\t}\n\n\tk3d::bool_t test_type(const k3d::string_t& TestToken, const k3d::string_t& TestType, const k3d::string_t& Data, k3d::string_t& DataType)\n\t{\n\t\tif(Data.substr(0, TestToken.size()) != TestToken)\n\t\t\treturn false;\n\n\t\tDataType = TestType;\n\n\t\tk3d::log() << info << \"Identified data as \" << DataType << \" using \" << get_factory().name() << std::endl;\n\t\treturn true;\n\t}\n\n\tk3d::bool_t identify_mime_type(const k3d::string_t& Data, k3d::string_t& DataType)\n\t{\n\t\tif(test_type(\"#python\", \"text/x-python\", Data, DataType)) return true;\n\n\t\treturn false;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<mime_type_handler,\n\t\t\tk3d::interface_list<k3d::imime_type_handler> > factory(\n\t\t\t\tk3d::uuid(0xc51f66a9, 0x104bd99e, 0x19fbadab, 0x1c84a1b3),\n\t\t\t\t\"FileMagicMIMETypeHandler\",\n\t\t\t\t_(\"Identifies a file's MIME Type based on filename extensions\"),\n\t\t\t\t\"Desktop\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tboost::assign::map_list_of(\"k3d:load-order\", \"128\"));\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mime_type_handler_factory\n\nk3d::iplugin_factory& mime_type_handler_factory()\n{\n\treturn mime_type_handler::get_factory();\n}\n\n} // namespace magic\n\n} // namespace file\n\n} // namespace module\n"
  },
  {
    "path": "modules/file_magic/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace file\n{\n\nnamespace magic\n{\n\nextern k3d::iplugin_factory& mime_type_handler_factory();\n\n} // namespace magic\n\n} // namespace file\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::file::magic::mime_type_handler_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/freetype2/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_FREETYPE2_INCLUDE_DIRS})\nLINK_DIRECTORIES(${K3D_FREETYPE2_LIB_DIRS})\n\nK3D_BUILD_MODULE(k3d-freetype2)\nK3D_CREATE_MODULE_PROXY(k3d-freetype2)\n\nTARGET_LINK_LIBRARIES(k3d-freetype2 ${K3D_FREETYPE2_LIBS})\n\n"
  },
  {
    "path": "modules/freetype2/freetype.h",
    "content": "#ifndef MODULES_FREETYPE2_FREETYPE_H\n#define MODULES_FREETYPE2_FREETYPE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/path.h>\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_OUTLINE_H\n\nnamespace module\n{\n\nnamespace freetype2\n{\n\n/// Encapsulates the freetype FT_Library struct to provide RAII behavior\nclass library\n{\npublic:\n\tlibrary() :\n\t\tm_initialized(0 == FT_Init_FreeType(&m_library))\n\t{\n\t}\n\n\t~library()\n\t{\n\t\tif(m_initialized)\n\t\t\tFT_Done_FreeType(m_library);\n\t}\n\n\toperator bool()\n\t{\n\t\treturn m_initialized;\n\t}\n\n\toperator FT_Library()\n\t{\n\t\treturn m_library;\n\t}\n\nprivate:\n\tconst bool m_initialized;\n\tFT_Library m_library;\n};\n\n/// Encapsulates the freetype FT_Face struct to provide RAII behavior\nclass face\n{\npublic:\n\tface(FT_Library Library, const k3d::filesystem::path& Path) :\n\t\tm_initialized(0 == FT_New_Face(Library, Path.native_filesystem_string().c_str(), 0, &m_face))\n\t{\n\t}\n\n\t~face()\n\t{\n\t\tif(m_initialized)\n\t\t\tFT_Done_Face(m_face);\n\t}\n\n\tk3d::bool_t is_scalable() const\n\t{\n\t\treturn m_initialized && FT_IS_SCALABLE(m_face);\n\t}\n\n\toperator k3d::bool_t()\n\t{\n\t\treturn m_initialized;\n\t}\n\n\tFT_Face& operator->()\n\t{\n\t\treturn m_face;\n\t}\n\n\toperator FT_Face()\n\t{\n\t\treturn m_face;\n\t}\n\nprivate:\n\tconst bool m_initialized;\n\tFT_Face m_face;\n};\n\n} // namespace freetype2\n\n} // namespace module\n\n#endif // !MODULES_FREETYPE2_FREETYPE_H\n\n"
  },
  {
    "path": "modules/freetype2/poly_text.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"freetype.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/bezier.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/share.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iterator>\n\nnamespace module\n{\n\nnamespace freetype2\n{\n\nnamespace detail\n{\n\n/// Defines a closed contour\ntypedef k3d::mesh::points_t contour_t;\n/// Defines a collection of closed contours\ntypedef std::vector<contour_t> contours_t;\n\nconst k3d::filesystem::path default_font()\n{\n\treturn k3d::share_path() / k3d::filesystem::generic_path(\"fonts/VeraBd.ttf\");\n}\n\n/// Returns the signed 2D area of a contour\nconst k3d::double_t area(const contour_t& Contour)\n{\n\tk3d::double_t result = 0;\n\n\tfor(k3d::uint_t i = 0; i != Contour.size(); ++i)\n\t\tresult += (Contour[i][0] * Contour[(i+1)%Contour.size()][1]) - (Contour[(i+1)%Contour.size()][0] * Contour[i][1]);\n\n\treturn result * 0.5;\n}\n\n/// Returns true iff a contour is clockwise\nconst bool clockwise(const contour_t& Contour)\n{\n\treturn area(Contour) < 0;\n}\n\n/// Adds a freetype glyph outline to a k3d::polyhedron::primitive\nclass freetype_outline\n{\npublic:\n\tfreetype_outline(const k3d::uint_t CurveDivisions) :\n\t\tcurve_divisions(CurveDivisions)\n\t{\n\t\tft_outline_funcs.move_to = raw_move_to_func;\n\t\tft_outline_funcs.line_to = raw_line_to_func;\n\t\tft_outline_funcs.conic_to = raw_conic_to_func;\n\t\tft_outline_funcs.cubic_to = raw_cubic_to_func;\n\t\tft_outline_funcs.shift = 0;\n\t\tft_outline_funcs.delta = 0;\n\t}\n\n\tvoid convert(FT_Outline& Outline, k3d::mesh& Mesh, k3d::polyhedron::primitive& Polyhedron, k3d::imaterial* const Material, const k3d::matrix4& Matrix)\n\t{\n\t\tcontours.clear();\n\n\t\t// Generate a set of closed contours ...\n\t\tFT_Outline_Decompose(&Outline, &ft_outline_funcs, this);\n\n\t\t// Segregate contours into faces and holes, based on their orientation (clockwise or counter-clockwise, respectively)\n\t\tcontours_t face_contours;\n\t\tcontours_t hole_contours;\n\t\tfor(contours_t::iterator contour = contours.begin(); contour != contours.end(); ++contour)\n\t\t{\n\t\t\tif(clockwise(*contour))\n\t\t\t\tface_contours.push_back(*contour);\n\t\t\telse\n\t\t\t\thole_contours.push_back(*contour);\n\t\t}\n\n\t\tfor(k3d::uint_t i = 0; i != face_contours.size(); ++i)\n\t\t\tfor(k3d::uint_t j = 0; j != face_contours[i].size(); ++j)\n\t\t\t\tface_contours[i][j] = Matrix * face_contours[i][j];\n\n\t\tfor(k3d::uint_t i = 0; i != hole_contours.size(); ++i)\n\t\t\tfor(k3d::uint_t j = 0; j != hole_contours[i].size(); ++j)\n\t\t\t\thole_contours[i][j] = Matrix * hole_contours[i][j];\n\n\t\t// Create faces.  This is a bit of hack, because we assume that all hole contours belong to the first\n\t\t// face contour ...\n\t\tif(face_contours.size())\n\t\t\tk3d::polyhedron::add_face(Mesh, Polyhedron, 0, face_contours[0], hole_contours, Material);\n\n\t\tfor(k3d::uint_t i = 1; i < face_contours.size(); ++i)\n\t\t\tk3d::polyhedron::add_face(Mesh, Polyhedron, 0, face_contours[i], Material);\n\t}\n\nprivate:\n\tvoid begin_contour(const k3d::point3& From)\n\t{\n\t\tcontours.push_back(contour_t());\n\t\tlast_point = From;\n\t}\n\n\tvoid line_to(const k3d::point3& To)\n\t{\n\t\tcontours.back().push_back(To);\n\t\tlast_point = To;\n\t}\n\n\tvoid conic_to(const k3d::point3& From, const k3d::point3& Control, const k3d::point3& To)\n\t{\n\t\tstd::vector<k3d::point3> control_points;\n\t\tcontrol_points.push_back(From);\n\t\tcontrol_points.push_back(Control);\n\t\tcontrol_points.push_back(To);\n\n\t\tfor(k3d::uint_t i = 0; i != curve_divisions; ++i)\n\t\t{\n\t\t\tcontours.back().push_back(k3d::Bezier<k3d::point3>(control_points, static_cast<k3d::double_t>(i+1) / static_cast<k3d::double_t>(curve_divisions)));\n\t\t}\n\n\t\tlast_point = To;\n\t}\n\n\tvoid cubic_to(const k3d::point3& From, const k3d::point3& Control1, const k3d::point3& Control2, const k3d::point3& To)\n\t{\n\t\tstd::vector<k3d::point3> control_points;\n\t\tcontrol_points.push_back(From);\n\t\tcontrol_points.push_back(Control1);\n\t\tcontrol_points.push_back(Control2);\n\t\tcontrol_points.push_back(To);\n\n\t\tfor(k3d::uint_t i = 0; i != curve_divisions; ++i)\n\t\t{\n\t\t\tcontours.back().push_back(k3d::Bezier<k3d::point3>(control_points, static_cast<k3d::double_t>(i+1) / static_cast<k3d::double_t>(curve_divisions)));\n\t\t}\n\n\t\tlast_point = To;\n\t}\n\n\tconst k3d::point3 convert(const FT_Vector* RHS)\n\t{\n\t\treturn k3d::point3(RHS->x, RHS->y, 0);\n\t}\n\n\tint move_to_func(const FT_Vector* To)\n\t{\n\t\tbegin_contour(convert(To));\n\t\treturn 0;\n\t}\n\n\tint line_to_func(const FT_Vector* To)\n\t{\n\t\tline_to(convert(To));\n\t\treturn 0;\n\t}\n\n\tint conic_to_func(const FT_Vector* Control, const FT_Vector* To)\n\t{\n\t\tconic_to(last_point, convert(Control), convert(To));\n\t\treturn 0;\n\t}\n\n\tint cubic_to_func(const FT_Vector* Control1, const FT_Vector* Control2, const FT_Vector* To)\n\t{\n\t\tcubic_to(last_point, convert(Control1), convert(Control2), convert(To));\n\t\treturn 0;\n\t}\n\n#if (((FREETYPE_MAJOR) > 2) || ((FREETYPE_MAJOR) == 2 && (FREETYPE_MINOR) >= 2))\n\n\tstatic int raw_move_to_func(const FT_Vector* to, void* user)\n\t{\n\t\treturn reinterpret_cast<freetype_outline*>(user)->move_to_func(to);\n\t}\n\n\tstatic int raw_line_to_func(const FT_Vector* to, void* user)\n\t{\n\t\treturn reinterpret_cast<freetype_outline*>(user)->line_to_func(to);\n\t}\n\n\tstatic int raw_conic_to_func(const FT_Vector* control, const FT_Vector* to, void* user)\n\t{\n\t\treturn reinterpret_cast<freetype_outline*>(user)->conic_to_func(control, to);\n\t}\n\n\tstatic int raw_cubic_to_func(const FT_Vector* control1, const FT_Vector* control2, const FT_Vector* to, void* user)\n\t{\n\t\treturn reinterpret_cast<freetype_outline*>(user)->cubic_to_func(control1, control2, to);\n\t}\n\n#else\n\n\tstatic int raw_move_to_func(FT_Vector* to, void* user)\n\t{\n\t\treturn reinterpret_cast<freetype_outline*>(user)->move_to_func(to);\n\t}\n\n\tstatic int raw_line_to_func(FT_Vector* to, void* user)\n\t{\n\t\treturn reinterpret_cast<freetype_outline*>(user)->line_to_func(to);\n\t}\n\n\tstatic int raw_conic_to_func(FT_Vector* control, FT_Vector* to, void* user)\n\t{\n\t\treturn reinterpret_cast<freetype_outline*>(user)->conic_to_func(control, to);\n\t}\n\n\tstatic int raw_cubic_to_func(FT_Vector* control1, FT_Vector* control2, FT_Vector* to, void* user)\n\t{\n\t\treturn reinterpret_cast<freetype_outline*>(user)->cubic_to_func(control1, control2, to);\n\t}\n\n#endif\n\n\tconst k3d::uint_t curve_divisions;\n\n\tFT_Outline_Funcs ft_outline_funcs;\n\n\tk3d::point3 last_point;\n\tcontours_t contours;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_text\n\nclass poly_text :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tpoly_text(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(detail::default_font()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_text(init_owner(*this) + init_name(\"text\") + init_label(_(\"Text\")) + init_description(_(\"Text\")) + init_value<std::string>(\"Text!\")),\n\t\tm_curve_divisions(init_owner(*this) + init_name(\"curve_divisions\") + init_label(_(\"Curve subdivisions\")) + init_description(_(\"Bezier curves subdivision number\")) + init_value(3) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Font height\")) + init_value(10.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_orientation(init_owner(*this) + init_name(\"orientation\") + init_label(_(\"Orientation\")) + init_description(_(\"Orientation type (forward or backward along X, Y or Z axis)\")) + init_value(k3d::PY) + init_enumeration(k3d::signed_axis_values()))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_font_path.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_text.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_curve_divisions.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_orientation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::filesystem::path font_path = m_font_path.pipeline_value();\n\t\tconst k3d::string_t text = m_text.pipeline_value();\n\t\tconst k3d::int32_t curve_divisions = m_curve_divisions.pipeline_value();\n\t\tconst k3d::double_t height = m_height.pipeline_value();\n\n\t\tk3d::matrix4 char_orientation;\n\t\tk3d::vector3 offset_direction;\n\t\tswitch(m_orientation.pipeline_value())\n\t\t{\n\t\t\tcase k3d::PX:\n\t\t\t\tchar_orientation = k3d::rotate3(k3d::angle_axis(k3d::radians(-90), k3d::vector3(0, 0, 1))) *\n\t\t\t\t\tk3d::rotate3(k3d::angle_axis(k3d::radians(90), k3d::vector3(1, 0, 0)));\n\t\t\t\toffset_direction = k3d::vector3(0, -1, 0);\n\t\t\t\tbreak;\n\t\t\tcase k3d::NX:\n\t\t\t\tchar_orientation = k3d::rotate3(k3d::angle_axis(k3d::radians(90), k3d::vector3(0, 0, 1))) *\n\t\t\t\t\tk3d::rotate3(k3d::angle_axis(k3d::radians(90), k3d::vector3(1, 0, 0)));\n\t\t\t\toffset_direction = k3d::vector3(0, 1, 0);\n\t\t\t\tbreak;\n\t\t\tcase k3d::PY:\n\t\t\t\tchar_orientation = k3d::rotate3(k3d::angle_axis(k3d::radians(90), k3d::vector3(1, 0, 0)));\n\t\t\t\toffset_direction = k3d::vector3(1, 0, 0);\n\t\t\t\tbreak;\n\t\t\tcase k3d::NY:\n\t\t\t\tchar_orientation = k3d::rotate3(k3d::angle_axis(k3d::radians(180), k3d::vector3(0, 0, 1))) *\n\t\t\t\t\tk3d::rotate3(k3d::angle_axis(k3d::radians(90), k3d::vector3(1, 0, 0)));\n\t\t\t\toffset_direction = k3d::vector3(-1, 0, 0);\n\t\t\t\tbreak;\n\t\t\tcase k3d::PZ:\n\t\t\t\tchar_orientation = k3d::rotate3(k3d::angle_axis(k3d::radians(180), k3d::vector3(1, 0, 0)));\n\t\t\t\toffset_direction = k3d::vector3(1, 0, 0);\n\t\t\t\tbreak;\n\t\t\tcase k3d::NZ:\n\t\t\t\tchar_orientation = k3d::identity3();\n\t\t\t\toffset_direction = k3d::vector3(1, 0, 0);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tlibrary ft_library;\n\t\tif(!ft_library)\n\t\t{\n\t\t\tk3d::log() << error << \"Error initializing FreeType library\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tface ft_face(ft_library, font_path);\n\t\tif(!ft_face)\n\t\t{\n\t\t\tk3d::log() << error << \"Error opening font file: \" << font_path.native_console_string() << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tif(!ft_face.is_scalable())\n\t\t{\n\t\t\tk3d::log() << error << \"Not a scalable font: \" << font_path.native_console_string() << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::double_t normalize_height = 1.0 / static_cast<k3d::double_t>(ft_face->bbox.yMax - ft_face->bbox.yMin);\n\t\tconst k3d::double_t scale = normalize_height * height;\n\n\t\tdetail::freetype_outline outline(curve_divisions);\n\n\t\tOutput.points.create();\n\t\tOutput.point_selection.create();\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\tk3d::double_t offset = 0;\n\t\tfor(k3d::string_t::const_iterator c = text.begin(); c != text.end(); ++c)\n\t\t{\n\t\t\tif(0 != FT_Load_Glyph(ft_face, FT_Get_Char_Index(ft_face, static_cast<FT_ULong>(*c)), FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM))\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Error loading glyph for \" << font_path.native_console_string() << \"[\" << *c << \"]\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst k3d::matrix4 matrix =\n\t\t\t\tk3d::translate3(offset_direction * (offset * scale)) * char_orientation * k3d::scale3(scale);\n\n\t\t\toutline.convert(ft_face->glyph->outline, Output, *polyhedron, material, matrix);\n\n\t\t\toffset += ft_face->glyph->metrics.horiAdvance;\n\t\t}\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<poly_text, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0x9acaeaf1, 0x1fe74387, 0xae71cbb3, 0x9b5e33fd),\n\t\t\t\"PolyText\",\n\t\t\t_(\"Generates polygonal text using Freetype 2\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_text;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_curve_divisions;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::signed_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_orientation;\n};\n\n} // namespace freetype2\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::freetype2::poly_text::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/gio/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_GIOMM_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${GIOMM_LIBRARY_DIRS})\n\nK3D_BUILD_MODULE(k3d-gio)\nK3D_CREATE_MODULE_PROXY(k3d-gio)\n\nTARGET_LINK_LIBRARIES(k3d-gio ${K3D_GIOMM_LIBS})\n\n"
  },
  {
    "path": "modules/gio/mime_type_handler.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/imime_type_handler.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <giomm/contenttype.h>\n\nnamespace module\n{\n\nnamespace gio\n{\n\n/// Uses the GIO API to identify MIME types.\nclass mime_type_handler :\n\tpublic k3d::imime_type_handler\n{\npublic:\n\tmime_type_handler()\n\t{\n\t}\n\n\t~mime_type_handler()\n\t{\n\t}\n\n\tk3d::bool_t identify_mime_type(const k3d::filesystem::path& File, k3d::string_t& FileType)\n\t{\n\t\tbool uncertain = false;\n\t\tGlib::ustring mime_type = Gio::content_type_guess(File.native_filesystem_string(), std::string(), uncertain);\n\n\t\tif(uncertain)\n\t\t\treturn false;\n\n\t\tFileType = mime_type;\n\n\t\tk3d::log() << info << \"Identified \" << File.native_console_string() << \" as \" << FileType << \" using \" << get_factory().name() << std::endl;\n\t\treturn true;\n\t}\n\n\tk3d::bool_t identify_mime_type(const k3d::string_t& Data, k3d::string_t& DataType)\n\t{\n\t\treturn false;\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<mime_type_handler,\n\t\t\tk3d::interface_list<k3d::imime_type_handler> > factory(\n\t\t\t\tk3d::uuid(0x8939ae52, 0x0342a2fc, 0x7976e5b5, 0xd6873980),\n\t\t\t\t\"GioMIMETypeHandler\",\n\t\t\t\t_(\"Identifies a file's MIME Type using the GIO API\"),\n\t\t\t\t\"Desktop\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tboost::assign::map_list_of(\"k3d:load-order\", \"129\"));\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mime_type_handler_factory\n\nk3d::iplugin_factory& mime_type_handler_factory()\n{\n\treturn mime_type_handler::get_factory();\n}\n\n} // namespace gio\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/gio/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the gio plugin module, to protect public symbols from name clashes with other modules\nnamespace gio\n{\n\nextern k3d::iplugin_factory& mime_type_handler_factory();\nextern k3d::iplugin_factory& uri_handler_factory();\n\n} // namespace gio\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::gio::mime_type_handler_factory());\n\tRegistry.register_factory(module::gio::uri_handler_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/gio/uri_handler.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/iuri_handler.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n\n#include <iostream>\n\n#include <giomm/appinfo.h>\n\nnamespace module\n{\n\nnamespace gio\n{\n\n/// Uses the GIO API to open a URI in the user's preferred application\nclass uri_handler :\n\tpublic k3d::iuri_handler\n{\npublic:\n\turi_handler()\n\t{\n\t}\n\n\t~uri_handler()\n\t{\n\t}\n\n\n\tbool open_uri(const std::string& URI)\n\t{\n\t\treturn Gio::AppInfo::launch_default_for_uri(URI);\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<uri_handler,\n\t\t\tk3d::interface_list<k3d::iuri_handler> > factory(\n\t\t\t\tk3d::uuid(0xac560e92, 0x1d31478b, 0x9139ace8, 0x1bb0ae31),\n\t\t\t\t\"GioURIHandler\",\n\t\t\t\t_(\"Opens a URI using the GIO libraries\"),\n\t\t\t\t\"Desktop\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// uri_handler_factory\n\nk3d::iplugin_factory& uri_handler_factory()\n{\n\treturn uri_handler::get_factory();\n}\n\n} // namespace gio\n\n} // namespace module\n"
  },
  {
    "path": "modules/glx/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-glx)\nK3D_CREATE_MODULE_PROXY(k3d-glx)\nTARGET_LINK_LIBRARIES(k3d-glx X11)\n\n"
  },
  {
    "path": "modules/glx/context_factory.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/gl/context_factory.h>\n#include <k3dsdk/gl/context.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/result.h>\n\n#include <boost/optional.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <iterator>\n#include <stdexcept>\n\n#include <GL/glx.h>\n#include <X11/Xlib.h>\n\n#include <dlfcn.h>\n\nnamespace module\n{\n\nnamespace glx\n{\n\nclass context :\n\tpublic k3d::gl::context\n{\npublic:\n\tcontext(Display* const XDisplay, const GLXContext XContext, const GLXDrawable XDrawable) :\n\t\tx_display(XDisplay),\n\t\tx_context(XContext),\n\t\tx_drawable(XDrawable)\n\t{\n\t}\n\n\t~context()\n\t{\n\t\tglXDestroyContext(x_display, x_context);\n//\t\tglXDestroyWindow(x_display, x_drawable);\n\t}\n\n\tvoid on_begin()\n\t{\n\t\ttry\n\t\t{\n\t\t\tif(!glXMakeCurrent(x_display, x_drawable, x_context))\n\t\t\t\tthrow std::runtime_error(\"Error making GLX context current.\");\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t}\n\t}\n\n\tvoid on_end()\n\t{\n\t\tglXSwapBuffers(x_display, x_drawable);\n\t}\n\n\tDisplay* const x_display;\n\tconst GLXContext x_context;\n\tconst GLXDrawable x_drawable;\n};\n\nclass context_factory :\n\tpublic k3d::gl::context_factory\n{\npublic:\n\tcontext_factory()\n\t{\n\t}\n\n\tk3d::gl::context* create(k3d::uint64_t Drawable)\n\t{\n\t\ttry\n\t\t{\n\t\t\tDisplay* const x_display = XOpenDisplay(0);\n\t\t\tif(!x_display)\n\t\t\t\tthrow std::runtime_error(\"Error opening X display.\");\n\n\t\t\tint dummy = 0;\n\t\t\tif(!glXQueryExtension(x_display, &dummy, &dummy))\n\t\t\t\tthrow std::runtime_error(\"X display doesn't support GLX.\");\n\n\t\t\tint x_config[] = {GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DEPTH_SIZE, 1, GLX_DOUBLEBUFFER, None};\n\t\t\tXVisualInfo* const x_visual = glXChooseVisual(x_display, DefaultScreen(x_display), x_config);\n\n\t\t\tif(!x_visual)\n\t\t\t\tthrow std::runtime_error(\"Error choosing X visual.\");\n\t\t\n\t\t\tconst GLXContext x_context = glXCreateContext(x_display, x_visual, 0, False);\n\t\t\tif(!x_context)\n\t\t\t\tthrow std::runtime_error(\"Error creating X context.\");\n\n\t\t\treturn new context(x_display, x_context, GLXDrawable(Drawable));\n\n/*\n\t\t\tconst int x_attributes[] = { GLX_RENDER_TYPE, GLX_RGBA_BIT, GLX_DOUBLEBUFFER, True, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, None };\n\t\t\tint x_config_count = 0;\n\t\t\tconst GLXFBConfig* const x_configs = glXChooseFBConfig(x_display, DefaultScreen(x_display), x_attributes, &x_config_count);\n\t\t\tif(!x_configs)\n\t\t\t\tthrow std::runtime_error(\"Error choosing GLXFBConfig.\");\n\t\t\tif(!x_config_count)\n\t\t\t\tthrow std::runtime_error(\"No compatible GLXFBConfig.\");\n\n\t\t\tconst GLXContext x_context = glXCreateNewContext(x_display, x_configs[0], GLX_RGBA_TYPE, NULL, True);\n\t\t\tif(!x_context)\n\t\t\t\tthrow std::runtime_error(\"Error creating GLXContext.\");\n\n\t\t\tconst GLXDrawable x_drawable = glXCreateWindow(x_display, x_configs[0], XID(Drawable), NULL);\n\t\t\tif(!x_drawable)\n\t\t\t\tthrow std::runtime_error(\"Error creating GLXDrawable.\");\n\n\t\t\treturn new context(x_display, x_context, x_drawable, api.get());\n*/\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<context_factory,\n\t\t\tk3d::interface_list<k3d::gl::context_factory> > factory(\n\t\t\t\tk3d::uuid(0x3a6869e9, 0x9a4ed128, 0x0f06b4bc, 0x672b53e1),\n\t\t\t\t\"GLXContextFactory\",\n\t\t\t\t_(\"Creates GLX graphics contexts.\"),\n\t\t\t\t\"OpenGL\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// context_factory_factory\n\nk3d::iplugin_factory& context_factory_factory()\n{\n\treturn context_factory::get_factory();\n}\n\n} // namespace glx\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/glx/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the glx plugin module, to protect public symbols from name clashes with other modules\nnamespace glx\n{\n\nextern k3d::iplugin_factory& context_factory_factory();\n\n} // namespace glx\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::glx::context_factory_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/gmsh_io/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-gmsh-io)\nK3D_CREATE_MODULE_PROXY(k3d-gmsh-io)\n\n"
  },
  {
    "path": "modules/gmsh_io/mesh_writer.cpp",
    "content": "#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/mesh_writer.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace gmsh\n{\n\nnamespace io\n{\n\nclass mesh_writer :\n\tpublic k3d::mesh_writer<k3d::node>\n{\n\ttypedef k3d::mesh_writer<k3d::node> base;\n\npublic:\n\tmesh_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_writer, k3d::interface_list<k3d::imesh_sink > > factory(\n\t\t\tk3d::uuid(0x01ce13c6, 0xca1e4d58, 0xbcc558a1, 0xf9780d73),\n\t\t\t\"GmshGeoMeshWriter\",\n\t\t\t_(\"Mesh writer that saves external Gmsh Geo geometry files\"),\n\t\t\t\"MeshWriter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_write_mesh(const k3d::mesh& Input, const k3d::filesystem::path& OutputPath, std::ostream& Output)\n\t{\n    Output << \"cl = 1e-2;\\n\";\n\n\t\t// Store points ...\n\t\tif(Input.points)\n\t\t{\n\t\t\tconst k3d::mesh::points_t& points = *Input.points;\n\t\t\tconst size_t point_begin = 0;\n\t\t\tconst size_t point_end = point_begin + points.size();\n\t\t\tfor(size_t point = point_begin; point != point_end; ++point) {\n        Output << \"Point(\" << point+1 << \") = {\" << points[point][0] << \", \" << points[point][1] << \", \" << points[point][2] << \", cl};\\n\";\n\t\t\t}\n\t\t}\n\n\t\tk3d::uint_t polyhedron_idx = 0;\n    k3d::uint_t shell_offset = 0;\n\t\tk3d::int64_t gmsh_line_offset = 0;\n\t\tk3d::uint_t gmsh_loop_offset = 0;\n\t\tk3d::uint_t gmsh_face_offset = 0;\n\t\tk3d::uint_t gmsh_surface_loop_offset = 0;\n\t\t// Store polyhedra ...\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Input, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n      ++polyhedron_idx;\n\n\t\t\tconst k3d::mesh::indices_t& face_first_loops = polyhedron->face_first_loops;\n\t\t\tconst k3d::mesh::indices_t& loop_first_edges = polyhedron->loop_first_edges;\n\t\t\tconst k3d::mesh::indices_t& clockwise_edges = polyhedron->clockwise_edges;\n\t\t\tconst k3d::mesh::indices_t& vertex_points = polyhedron->vertex_points;\n\n      k3d::mesh::bools_t boundary_edges;\n      k3d::mesh::indices_t companions;\n      k3d::polyhedron::create_edge_adjacency_lookup(vertex_points, clockwise_edges, boundary_edges, companions);\n\n      const k3d::uint_t nb_edges = vertex_points.size();\n\n      std::vector<k3d::int64_t> edge_to_gmsh_lines(nb_edges, 0);\n      std::vector<k3d::uint_t> gmsh_line_starts; gmsh_line_starts.reserve(nb_edges);\n      std::vector<k3d::uint_t> gmsh_line_ends; gmsh_line_ends.reserve(nb_edges);\n      for(k3d::uint_t edge = 0; edge != nb_edges; ++edge)\n      {\n        if(edge_to_gmsh_lines[edge] != 0)\n          continue;\n\n        gmsh_line_starts.push_back(vertex_points[edge]+1);\n        gmsh_line_ends.push_back(vertex_points[clockwise_edges[edge]]+1);\n        k3d::int64_t line_idx = static_cast<k3d::int64_t>(gmsh_line_starts.size());\n        edge_to_gmsh_lines[edge] = line_idx;\n        if(!boundary_edges[edge])\n          edge_to_gmsh_lines[companions[edge]] = -line_idx;\n      }\n\n      // Write the lines to file\n      const k3d::uint_t nb_lines = gmsh_line_starts.size();\n      for(k3d::uint_t line = 0; line != nb_lines; ++line)\n      {\n        Output << \"Line(\" << gmsh_line_offset+line+1 << \") = {\" << gmsh_line_starts[line] << \", \" << gmsh_line_ends[line] << \"};\\n\";\n      }\n\n\n      std::vector< std::vector<k3d::uint_t> > gmsh_surface_loops(polyhedron->shell_types.size());\n\n      const k3d::uint_t face_begin = 0;\n      const k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\tk3d::uint_t nb_loops = 0;\n      for(k3d::uint_t face = face_begin; face != face_end; ++face)\n      {\n        std::stringstream face_str;\n        face_str << \"Plane Surface(\" << gmsh_face_offset+face+1 << \") = {\";\n        const k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n        const k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n        for(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n        {\n\t\t\t\t\t++nb_loops;\n          face_str << gmsh_loop_offset+loop+1 << (loop == loop_end-1 ? \"};\\n\" : \",\");\n          Output << \"Line Loop(\" << gmsh_loop_offset+loop+1 << \") = {\";\n          const k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n          for(k3d::uint_t edge = first_edge; ; )\n          {\n\t\t\t\t\t\tk3d::int64_t gmsh_line_idx = edge_to_gmsh_lines[edge];\n            Output << gmsh_line_idx + (gmsh_line_idx > 0 ? gmsh_line_offset : -gmsh_line_offset);\n\n            edge = polyhedron->clockwise_edges[edge];\n            if(edge == first_edge)\n            {\n              Output << \"};\\n\";\n              break;\n            }\n            else\n            {\n              Output << \",\";\n            }\n          }\n        }\n        Output << face_str.str();\n        gmsh_surface_loops[polyhedron->face_shells[face]].push_back(face+1+gmsh_face_offset);\n      }\n      const k3d::uint_t nb_surface_loops = gmsh_surface_loops.size();\n      for(k3d::uint_t loop = 0; loop != nb_surface_loops; ++loop)\n      {\n        const std::vector<k3d::uint_t>& loop_faces = gmsh_surface_loops[loop];\n        if(loop_faces.empty())\n          continue;\n        Output << \"Surface Loop(\" << gmsh_surface_loop_offset+shell_offset+loop+1 << \") = {\" << loop_faces.front();\n\n        const k3d::uint_t loop_nb_faces = loop_faces.size();\n        for(k3d::uint_t face = 1; face != loop_nb_faces; ++face)\n          Output << \", \" << loop_faces[face];\n        Output << \"};\\n\";\n      }\n      Output << \"Volume(\" << polyhedron_idx << \") = {\" << gmsh_surface_loop_offset+shell_offset+1;\n      for(k3d::uint_t loop = 1; loop != nb_surface_loops; ++loop)\n      {\n        Output << \", \" << gmsh_surface_loop_offset+loop+shell_offset+1;\n      }\n      Output << \"};\\n\";\n\t\t\tgmsh_line_offset += nb_lines;\n\t\t\tgmsh_face_offset += face_end;\n\t\t\tgmsh_loop_offset += nb_loops;\n\t\t\tgmsh_surface_loop_offset += nb_surface_loops;\n\t\t}\n\t}\n};\n\nk3d::iplugin_factory& mesh_writer_factory()\n{\n\treturn mesh_writer::get_factory();\n}\n\n} // namespace io\n\n} // namespace gmsh\n\n} // namespace module\n"
  },
  {
    "path": "modules/gmsh_io/module.cpp",
    "content": "#include <k3dsdk/module.h>\n\nnamespace module\n{\n\t\nnamespace gmsh\n{\n\nnamespace io\n{\n\t\nextern k3d::iplugin_factory& mesh_writer_factory();\n\n} // namespace io\n\n} // namespace gmsh\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::gmsh::io::mesh_writer_factory());\nK3D_MODULE_END\n"
  },
  {
    "path": "modules/gperftools/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-gperftools)\nK3D_CREATE_MODULE_PROXY(k3d-gperftools)\n"
  },
  {
    "path": "modules/gperftools/gperftools.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/user_interface.h>\n\n#include <gperftools/profiler.h>\n\nnamespace module\n{\n\nnamespace gperftools\n{\n\n// Optional config item to set the profile file directory\ninline const k3d::string_t profile_files() { return \"profile_files\"; }\n\nclass gperftools : public k3d::iunknown\n{\npublic:\n\tgperftools()\n\t{\n\t\tconst k3d::string_t prefix = \"k3d-profile\";\n\t\tconst k3d::string_t suffix = \"pprof\";\n\n\t\tk3d::filesystem::path profile_path = k3d::options::get_path(profile_files());\n\t\tif(profile_path.empty())\n\t\t\tprofile_path = k3d::system::get_temp_directory();\n\n\t\t// Ensure that the profile gets a unique name ...\n\t\tk3d::uint_t  index = 0;\n\t\tk3d::string_t profile_name(prefix + \"-\" + k3d::string_cast(index++) + \".\" + suffix);\n\t\twhile(k3d::filesystem::exists(profile_path / k3d::filesystem::generic_path(profile_name)))\n\t\t\tprofile_name = prefix + \"-\" + k3d::string_cast(index++) + \".\" + suffix;\n\n\t\tk3d::log() << info << \"gperftools: saving profile data to file \" << (profile_path / k3d::filesystem::generic_path(profile_name)).native_console_string() << std::endl;\n\n\t\tProfilerStart((profile_path / k3d::filesystem::generic_path(profile_name)).native_filesystem_string().c_str());\n\t}\n\n\t~gperftools()\n\t{\n\t\tk3d::log() << info << \"gperftools: Stopping profiler\" << std::endl;\n\t\tProfilerStop();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tk3d::iplugin_factory::metadata_t metadata;\n\t\tmetadata[\"k3d:application-start\"] = \"\";\n\t\tstatic k3d::application_plugin_factory<gperftools,\n\t\t\tk3d::interface_list<k3d::iunknown> > factory(\n\t\t\t\tk3d::uuid(0x2b517d24, 0x88462d22, 0x5401a896, 0xdd48c985),\n\t\t\t\t\"GPerftools\",\n\t\t\t\t_(\"Starts CPU profiling using GPerftools\"),\n\t\t\t\t\"Development\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\t\tmetadata);\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& gperftools_factory()\n{\n\treturn gperftools::get_factory();\n}\n\n} // namespace gperftools\n\n} // namespace module\n"
  },
  {
    "path": "modules/gperftools/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the glx plugin module, to protect public symbols from name clashes with other modules\nnamespace gperftools\n{\n\nextern k3d::iplugin_factory& gperftools_factory();\n\n} // namespace gperftools\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::gperftools::gperftools_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/graphviz/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-graphviz)\nK3D_CREATE_MODULE_PROXY(k3d-graphviz)\n\n"
  },
  {
    "path": "modules/graphviz/mesh_writer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/mesh_writer.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/string_source.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace graphviz\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_writer\n\nclass mesh_writer :\n\tpublic k3d::mesh_writer<k3d::node >,\n\tpublic k3d::string_source<mesh_writer>\n{\n\ttypedef k3d::mesh_writer<k3d::node > base;\n\npublic:\n\tmesh_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_input_mesh.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_string_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_writer, k3d::interface_list<k3d::imesh_sink > > factory(\n\t\t\tk3d::uuid(0xb0fc811a, 0xd241b237, 0xd8922faf, 0x70e32542),\n\t\t\t\"GraphVizMeshWriter\",\n\t\t\t_(\"Mesh writer that saves meshes as GraphViz (.dot) files\"),\n\t\t\t\"MeshWriter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttemplate<typename ContainerT>\n\tstatic const k3d::string_t dot_array_vertex(const ContainerT& Container)\n\t{\n\t\tstd::ostringstream buffer;\n\n\t\tbuffer << \"v\" << Container.get();\n\t\tbuffer << \" [\";\n\t\tbuffer << \" shape=\\\"plaintext\\\"\";\n\t\tbuffer << \" label=<\";\n\t\tbuffer << \" <table border=\\\"0\\\" cellborder=\\\"1\\\" cellspacing=\\\"0\\\"><tr>\";\n\t\tbuffer << \" <td\";\n\t\tbuffer << \" port=\\\"array\\\"\";\n\t\tif(Container->type_string() == \"k3d::imaterial*\")\n\t\t\tbuffer << \" color=\\\"#00dd00\\\"\";\n\t\telse if(Container->get_metadata_value(k3d::metadata::key::role()) == k3d::metadata::value::selection_role())\n\t\t\tbuffer << \" color=\\\"#0000dd\\\"\";\n\t\telse if(Container->get_metadata_value(k3d::metadata::key::domain()) == k3d::metadata::value::point_indices_domain())\n\t\t\tbuffer << \" color=\\\"#dd0000\\\"\";\n\t\tbuffer << \">\";\n\t\tbuffer << Container->type_string() << \" array\";\n\t\tbuffer << \"</td>\";\n\t\tbuffer << \" </tr></table>\";\n\t\tbuffer << \" >\";\n\t\tbuffer << \"]\";\n\t\t\n\t\treturn buffer.str();\n\t}\n\n\ttemplate<typename ContainerT>\n\tstatic const k3d::string_t dot_array_reference(const ContainerT& Container)\n\t{\n\t\tstd::ostringstream buffer;\n\t\tbuffer << \"v\" << Container.get() << \":array\";\n\t\treturn buffer.str();\n\t}\n\n\tstatic void table_vertex(const k3d::string_t& Name, const k3d::table& Table, std::ostream& Output)\n\t{\n\t\tOutput << k3d::standard_indent << \"v\" << &Table;\n\t\tOutput << \" [\";\n\t\tOutput << \" shape=\\\"plaintext\\\"\";\n\t\tOutput << \" label=<\";\n\t\tOutput << \" <table border=\\\"0\\\" cellborder=\\\"1\\\" cellspacing=\\\"0\\\">\";\n\t\tOutput << \" <tr><td port=\\\"name\\\" bgcolor=\\\"#ddddff\\\">Table \\\"\" << Name << \"\\\"</td></tr>\";\n\n\t\tfor(k3d::mesh::table_t::const_iterator array = Table.begin(); array != Table.end(); ++array)\n\t\t\tOutput << \"<tr><td port=\\\"\" << array->first << \"\\\">\" << \"\\\"\" << array->first << \"\\\"\" << \"</td></tr>\";\n\t\tOutput << \" </table>\";\n        \tOutput << \" >\";\n\t\tOutput << \"]\\n\";\n\n\t\tfor(k3d::mesh::table_t::const_iterator array = Table.begin(); array != Table.end(); ++array)\n\t\t{\n\t\t\tOutput << k3d::standard_indent << dot_array_vertex(array->second) << \"\\n\";\n\t\t\tOutput << k3d::standard_indent << \"v\" << &Table << \":\" << array->first << \":e -> \" << dot_array_reference(array->second) << \":w\\n\";\n\t\t}\n\n\t\tOutput << k3d::pop_indent;\n\t}\n\n\tstatic const k3d::string_t table_reference(const k3d::table& Table)\n\t{\n\t\tstd::ostringstream buffer;\n\t\tbuffer << \"v\" << &Table << \":name:w\";\n\t\treturn buffer.str();\n\t}\n\n\tstatic void write_mesh(const k3d::mesh& Input, std::ostream& Output)\n\t{\n\t\tOutput << \"// Written by K-3D \" << K3D_VERSION << \", http://www.k-3d.org\\n\\n\";\n\n\t\tOutput << k3d::standard_indent << \"digraph\\n\";\n\t\tOutput << k3d::standard_indent << \"{\\n\";\n\t\tOutput << k3d::push_indent;\n\n\t\tOutput << k3d::standard_indent << \"graph [rankdir=\\\"LR\\\" ranksep=\\\"1.0\\\"]\\n\";\n\t\tOutput << k3d::standard_indent << \"node [shape=\\\"record\\\" fontname=\\\"Helvetica\\\" fontsize=12 height=0 width=0]\\n\";\n\t\tOutput << k3d::standard_indent << \"edge [fontname=\\\"Helvetica\\\" fontsize=10]\\n\";\n\n\t\tOutput << k3d::standard_indent << \"v\" << &Input;\n\t\tOutput << \" [\";\n\t\tOutput << \" shape=\\\"plaintext\\\"\";\n\t\tOutput << \" label=<\";\n\t\tOutput << \" <table border=\\\"0\\\" cellborder=\\\"1\\\" cellspacing=\\\"0\\\">\";\n\t\tOutput << \" <tr><td port=\\\"geometry\\\" bgcolor=\\\"#ffdddd\\\">Geometry</td></tr>\";\n\t\tOutput << \" <tr><td port=\\\"points\\\">points</td></tr>\";\n\t\tOutput << \" <tr><td port=\\\"point_selection\\\">point_selection</td></tr>\";\n\t\tOutput << \" <tr><td port=\\\"point_attributes\\\">point_attributes</td></tr>\";\n\t\tOutput << \" <tr><td port=\\\"primitives\\\">primitives</td></tr>\";\n\t\tOutput << \" </table>\";\n\t\tOutput << \">\";\n\t\tOutput << \"]\\n\";\n\t\tOutput << k3d::push_indent;\n\n\t\tOutput << k3d::standard_indent << \"subgraph cluster_0\\n\";\n\t\tOutput << k3d::standard_indent << \"{\\n\";\n\t\tOutput << k3d::push_indent;\n\t\tOutput << k3d::standard_indent << \"color=white;\\n\";\n\n\t\tif(Input.points)\n\t\t{\n\t\t\tOutput << k3d::standard_indent << dot_array_vertex(Input.points) << \"\\n\";\n\t\t\tOutput << k3d::standard_indent << \"v\" << &Input << \":points:e -> \" << dot_array_reference(Input.points) << \":w\\n\";\n\t\t}\n\n\t\tif(Input.point_selection)\n\t\t{\n\t\t\tOutput << k3d::standard_indent << dot_array_vertex(Input.point_selection) << \"\\n\";\n\t\t\tOutput << k3d::standard_indent << \"v\" << &Input << \":point_selection:e -> \" << dot_array_reference(Input.point_selection) << \":w\\n\";\n\t\t}\n\n\t\tOutput << k3d::pop_indent;\n\t\tOutput << k3d::standard_indent << \"}\\n\";\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{ \n\t\t\tOutput << k3d::standard_indent << \"v\" << (*primitive).get();\n\t\t\tOutput << \" [\";\n\t\t\tOutput << \" shape=\\\"plaintext\\\"\";\n\t\t\tOutput << \" label=<\";\n\t\t\tOutput << \" <table border=\\\"0\\\" cellborder=\\\"1\\\" cellspacing=\\\"0\\\">\";\n\t\t\tOutput << \" <tr><td port=\\\"primitive\\\" bgcolor=\\\"#ddffdd\\\">Primitive \\\"\" << (*primitive)->type << \"\\\"</td></tr>\";\n\t\t\tOutput << \" <tr><td port=\\\"structure\\\">structure</td></tr>\";\n\t\t\tOutput << \" <tr><td port=\\\"attributes\\\">attributes</td></tr>\";\n\t\t\tOutput << \" </table>\";\n\t\t\tOutput << \">\";\n\t\t\tOutput << \"]\\n\";\n\t\t\tOutput << k3d::standard_indent << \"v\" << &Input << \":primitives:e -> \" << \"v\" << (*primitive).get() << \":primitive:w\\n\";\n\t\t\tOutput << k3d::push_indent;\n\n\t\t\tfor(k3d::mesh::named_tables_t::const_iterator named_table = (**primitive).structure.begin(); named_table != (**primitive).structure.end(); ++named_table)\n\t\t\t{\n\t\t\t\ttable_vertex(named_table->first, named_table->second, Output);\n\t\t\t\tOutput << k3d::standard_indent << \"v\" << (*primitive).get() << \":structure:e -> \" << \"v\" << &named_table->second << \":name:w\\n\";\n\t\t\t}\n\n\t\t\tfor(k3d::mesh::named_tables_t::const_iterator named_table = (**primitive).attributes.begin(); named_table != (**primitive).attributes.end(); ++named_table)\n\t\t\t{\n\t\t\t\ttable_vertex(named_table->first, named_table->second, Output);\n\t\t\t\tOutput << k3d::standard_indent << \"v\" << (*primitive).get() << \":attributes:e -> \" << \"v\" << &named_table->second << \":name:w\\n\";\n\t\t\t}\n\n\t\t\tOutput << k3d::pop_indent;\n\t\t}\n\n\t\tOutput << k3d::pop_indent;\n\t\tOutput << k3d::pop_indent;\n\t\tOutput << k3d::standard_indent << \"}\\n\";\n\t}\n\n\tvoid on_write_mesh(const k3d::mesh& Input, const k3d::filesystem::path& OutputPath, std::ostream& Output)\n\t{\n\t\twrite_mesh(Input, Output);\n\t}\n\n\tvoid on_update_string(k3d::string_t& Output)\n\t{\n\t\tstd::ostringstream buffer;\n\n\t\tif(const k3d::mesh* const mesh = m_input_mesh.pipeline_value())\n\t\t\twrite_mesh(*mesh, buffer);\n\n\t\tOutput = buffer.str();\t\n\t}\n};\n\nk3d::iplugin_factory& mesh_writer_factory()\n{\n\treturn mesh_writer::get_factory();\n}\n\n} // namespace graphviz\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/graphviz/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace graphviz\n{\n\nextern k3d::iplugin_factory& mesh_writer_factory();\nextern k3d::iplugin_factory& render_engine_factory();\n\n} // namespace graphviz\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::graphviz::mesh_writer_factory());\n\tRegistry.register_factory(module::graphviz::render_engine_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/graphviz/render_engine.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/inetwork_render_farm.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/inetwork_render_job.h>\n#include <k3dsdk/inode_collection_property.h>\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/irender_frame.h>\n#include <k3dsdk/irender_preview.h>\n#include <k3dsdk/network_render_farm.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n\n#include <iomanip>\n#include <iterator>\n\nnamespace module\n{\n\nnamespace graphviz\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// render_engine\n\nclass render_engine :\n\tpublic k3d::node,\n\tpublic k3d::inode_collection_sink,\n\tpublic k3d::irender_preview,\n\tpublic k3d::irender_frame\n{\n\ttypedef k3d::node base;\n\npublic:\n\trender_engine(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_visible_nodes(init_owner(*this) + init_name(\"visible_nodes\") + init_label(_(\"Visible Nodes\")) + init_description(_(\"Visible Nodes\")) + init_value(std::vector<k3d::inode*>())),\n\t\tm_show_property_labels(init_owner(*this) + init_name(\"show_property_labels\") + init_label(_(\"Show Property Labels\")) + init_description(_(\"Display property labels in the rendered image.\")) + init_value(true)),\n\t\tm_show_property_loops(init_owner(*this) + init_name(\"show_property_loops\") + init_label(_(\"Show Property Loops\")) + init_description(_(\"Display property connections that originate and terminate on the same node.\")) + init_value(true)),\n\t\tm_render_command(init_owner(*this) + init_name(\"render_command\") + init_label(_(\"Render Command\")) + init_description(_(\"Specify the GraphViz command to use for rendering.\")) + init_value(k3d::string_t(\"dot\")) + init_values(render_command_values()))\n\t{\n\t}\n\n\tconst k3d::inode_collection_sink::properties_t node_collection_properties()\n\t{\n\t\treturn k3d::inode_collection_sink::properties_t(1, &m_visible_nodes);\n\t}\n\n\tbool render_preview()\n\t{\n\t\t// Start a new render job ...\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-graphviz-preview\");\n\n\t\t// Add a single render frame to the job ...\n\t\tk3d::inetwork_render_frame& frame = job.create_frame(\"frame\");\n\n\t\t// Create an output image path ...\n\t\tconst k3d::filesystem::path output_image_path = frame.add_file(\"world.svg\");\n\n\t\t// Render it ...\n\t\treturn_val_if_fail(render(frame, output_image_path), false);\n\n\t\t// View the output image when it's done ...\n\t\tframe.add_view_command(output_image_path);\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tbool render_frame(const k3d::filesystem::path& OutputImage, const bool ViewImage)\n\t{\n\t\t// Sanity checks ...\n\t\treturn_val_if_fail(!OutputImage.empty(), false);\n\n\t\t// Start a new render job ...\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-graphviz-render\");\n\n\t\t// Add a single render frame to the job ...\n\t\tk3d::inetwork_render_frame& frame = job.create_frame(\"frame\");\n\n\t\t// Create an output image path ...\n\t\tconst k3d::filesystem::path output_image_path = frame.add_file(\"world.svg\");\n\n\t\t// Render it ...\n\t\treturn_val_if_fail(render(frame, output_image_path), false);\n\n\t\t// Copy the output image to its requested destination ...\n\t\tframe.add_copy_command(output_image_path, OutputImage);\n\n\t\t// View the output image when it's done ...\n\t\tif(ViewImage)\n\t\t\tframe.add_view_command(OutputImage);\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<render_engine,\n\t\t\tk3d::interface_list<k3d::irender_frame,\n\t\t\tk3d::interface_list<k3d::irender_preview> > > factory(\n\t\t\t\tk3d::uuid(0xbe72cb50, 0x011f41d8, 0x90449ae0, 0x4c24ace5),\n\t\t\t\t\"GraphVizEngine\",\n\t\t\t\t_(\"GraphViz Render Engine\"),\n\t\t\t\t\"RenderEngine\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttemplate<typename T>\n\tstatic const k3d::string_t pointer_id(const T* RHS)\n\t{\n\t\tstd::stringstream buffer;\n\t\tbuffer << \"v\" << RHS;\n\t\treturn buffer.str();\n\t}\n\n\tstatic const k3d::string_t escaped_string(const k3d::string_t& Source)\n\t{\n\t\tk3d::string_t result(Source);\n\n\t\tfor(k3d::string_t::size_type i = result.find('\\\"'); i != k3d::string_t::npos; i = result.find('\\\"', i+2))\n\t\t\tresult.replace(i, 1, \"\\\\\\\"\");\n\n\t\treturn result;\n\t}\n\n\tbool render(k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& OutputImagePath)\n\t{\n\t\t// Start our GraphViz DOT file ...\n\t\tconst k3d::filesystem::path dot_file = Frame.add_file(\"world.dot\");\n\n\t\t// Open the DOT file stream ...\n\t\tk3d::filesystem::ofstream stream(dot_file);\n\t\treturn_val_if_fail(stream.good(), false);\n\n\t\tconst k3d::bool_t show_property_labels = m_show_property_labels.pipeline_value();\n\t\tconst k3d::bool_t show_property_loops = m_show_property_loops.pipeline_value();\n\n\t\t// Setup the frame for GraphViz rendering ...\n\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"-Tsvg\"));\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(dot_file.native_filesystem_string()));\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"-o\"));\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"world.svg\"));\n\n\t\tFrame.add_exec_command(m_render_command.pipeline_value(), environment, arguments);\n\n\t\tstream << \"digraph \\\"\" << boost::any_cast<k3d::ustring>(document().title().property_internal_value()).raw() << \"\\\"\\n\";\n\t\tstream << \"{\\n\\n\";\n\t\tstream << \"graph [rankdir=\\\"LR\\\"]\\n\\n\";\n\t\tstream << \"node [fontname=\\\"Helvetica\\\" fontsize=\\\"12\\\" shape=\\\"box\\\" style=\\\"filled\\\" fillcolor=\\\"white\\\" width=\\\"0\\\" height=\\\"0\\\"]\\n\\n\";\n\t\tstream << \"edge [fontname=\\\"Helvetica\\\" fontsize=\\\"8\\\"]\\n\\n\";\n\n\t\t// Create a mapping of properties-to-nodes as we go ...\n\t\ttypedef std::map<k3d::iproperty*, k3d::inode*> property_node_map_t;\n\t\tproperty_node_map_t property_node_map;\n\n\t\t// Draw a vertex for every visible node ...\n\t\tconst k3d::inode_collection_property::nodes_t visible_nodes = m_visible_nodes.pipeline_value();\n\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = visible_nodes.begin(); node != visible_nodes.end(); ++node)\n\t\t{\n\t\t\tstream << pointer_id(*node);\n\t\t\tstream << \" [\";\n\t\t\tstream << \" label=\\\"\" << escaped_string((*node)->name()) << \"\\\"\";\n\t\t\tstream << \" ]\\n\";\n\n\t\t\tif(k3d::iproperty_collection* const property_collection = dynamic_cast<k3d::iproperty_collection*>(*node))\n\t\t\t{\n\t\t\t\tconst k3d::iproperty_collection::properties_t properties = property_collection->properties();\n\t\t\t\tfor(k3d::iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t\t\t\tproperty_node_map.insert(std::make_pair(*property, *node));\n\t\t\t}\n\t\t}\n\n\t\t// Draw an edge for every property dependency between visible nodes ...\n\t\tstream << \"\\n\";\n\t\tconst k3d::ipipeline::dependencies_t dependencies = document().pipeline().dependencies();\n\t\tfor(k3d::ipipeline::dependencies_t::const_iterator dependency = dependencies.begin(); dependency != dependencies.end(); ++dependency)\n\t\t{\n\t\t\tk3d::iproperty* const source_property = dependency->second;\n\t\t\tk3d::iproperty* const target_property = dependency->first;\n\n\t\t\tif(property_node_map.count(source_property) && property_node_map.count(target_property))\n\t\t\t{\n\t\t\t\tk3d::inode* const source_node = property_node_map[source_property];\n\t\t\t\tk3d::inode* const target_node = property_node_map[target_property];\n\n\t\t\t\tif((source_node == target_node) && !show_property_loops)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tstream << pointer_id(source_node) << \":e -> \" << pointer_id(target_node) << \":w\";\n\t\t\t\tstream << \" [\";\n\n\t\t\t\tif(show_property_labels)\n\t\t\t\t{\n\t\t\t\t\tstream << \" label=\\\"\" << escaped_string(source_property->property_name()) << \" > \" << escaped_string(target_property->property_name()) << \"\\\"\";\n\t\t\t\t}\n\n\t\t\t\tstream << \" ]\\n\";\n\t\t\t}\n\t\t}\n\n\t\t// Draw an edge for every property whose value is another property ...\n\t\tstream << \"\\n\";\n\t\tfor(property_node_map_t::const_iterator property = property_node_map.begin(); property != property_node_map.end(); ++property)\n\t\t{\n\t\t\tif(typeid(k3d::inode*) == property->first->property_type())\n\t\t\t{\n\t\t\t\tif(k3d::inode* const referenced_node = boost::any_cast<k3d::inode*>(property->first->property_internal_value()))\n\t\t\t\t{\n\t\t\t\t\tif(std::count(visible_nodes.begin(), visible_nodes.end(), referenced_node))\n\t\t\t\t\t{\n\t\t\t\t\t\tstream << pointer_id(referenced_node) << \":e -> \" << pointer_id(property->second) << \":w\";\n\t\t\t\t\t\tstream << \" [ color=\\\"gray\\\"\";\n\n\t\t\t\t\t\tif(show_property_labels)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstream << \" label=\\\"\" << escaped_string(property->first->property_name()) << \"\\\"\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstream << \" ]\\n\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tstream << \"\\n}\\n\";\n\n\t\treturn true;\n\t}\n\n\tk3d_data(k3d::inode_collection_property::nodes_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, node_collection_serialization) m_visible_nodes;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_show_property_labels;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_show_property_loops;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_render_command;\n\n\tconst k3d::ilist_property<k3d::string_t>::values_t& render_command_values()\n\t{\n\t\tstatic k3d::ilist_property<k3d::string_t>::values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(\"dot\");\n\t\t\tvalues.push_back(\"neato\");\n\t\t\tvalues.push_back(\"twopi\");\n\t\t}\n\t\treturn values;\n\t}\n};\n\nk3d::iplugin_factory& render_engine_factory()\n{\n\treturn render_engine::get_factory();\n}\n\n} // namespace graphviz\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/gts/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_GTS_INCLUDE_DIRS})\nLINK_DIRECTORIES(${K3D_GTS_LIB_DIRS})\n\nK3D_BUILD_MODULE(k3d-gts)\nK3D_CREATE_MODULE_PROXY(k3d-gts)\n\nTARGET_LINK_LIBRARIES(k3d-gts ${K3D_GTS_LIBS})\n\n"
  },
  {
    "path": "modules/gts/helpers.cpp",
    "content": "// K-3D\n// Copyright (c) 2004-2007, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"helpers.h\"\n\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/triangulator.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <vector>\n\nnamespace module\n{\n\nnamespace gts\n{\n\nnamespace detail\n{\n\n/// Converts a k3d::mesh to a GtsSurface as it is triangulated\nclass triangulator :\n\tpublic k3d::triangulator\n{\n\ttypedef k3d::triangulator base;\n\npublic:\n\tGtsSurface* process(const k3d::mesh& Mesh, const k3d::polyhedron::const_primitive& Polyhedron)\n\t{\n\t\tgts_surface = gts_surface_new(gts_surface_class(), gts_face_class(), gts_edge_class(), gts_vertex_class());\n\n\t\tmesh_points = Mesh.points.get();\n\t\tgts_vertices.assign(mesh_points->size(), 0);\n\n\t\tbase::process(Mesh, Polyhedron);\n\n\t\tgts_vertices.clear();\n\t\tmesh_points = 0;\n\n\t\treturn gts_surface;\n\t}\n\nprivate:\n\tvoid add_vertex(const k3d::point3& Coordinates, k3d::uint_t Vertices[4], k3d::uint_t Edges[4], double Weights[4], k3d::uint_t& NewVertex)\n\t{\n\t\tNewVertex = gts_vertices.size();\n\t\tgts_vertices.push_back(gts_vertex_new(gts_vertex_class(), Coordinates[0], Coordinates[1], Coordinates[2]));\n\t}\n\n\tvoid add_triangle(k3d::uint_t Vertices[3], k3d::uint_t Edges[3])\n\t{\n\t\tGtsVertex* const vertex1 = get_vertex(Vertices[0]);\n\t\tGtsVertex* const vertex2 = get_vertex(Vertices[1]);\n\t\tGtsVertex* const vertex3 = get_vertex(Vertices[2]);\n\n\t\tGtsEdge* const edge1 = gts_edge_new(gts_edge_class(), vertex1, vertex2);\n\t\tGtsEdge* const edge2 = gts_edge_new(gts_edge_class(), vertex2, vertex3);\n\t\tGtsEdge* const edge3 = gts_edge_new(gts_edge_class(), vertex3, vertex1);\n\n\t\tGtsFace* const face = gts_face_new(gts_face_class(), edge1, edge2, edge3);\n\n\t\tgts_surface_add_face(gts_surface, face);\n\t}\n\n\tGtsVertex* get_vertex(const k3d::uint_t Vertex)\n\t{\n\t\tif(!gts_vertices[Vertex])\n\t\t{\n\t\t\tconst k3d::point3 mesh_point = (*mesh_points)[Vertex];\n\t\t\tgts_vertices[Vertex] = gts_vertex_new(gts_vertex_class(), mesh_point[0], mesh_point[1], mesh_point[2]);\n\t\t}\n\n\t\treturn gts_vertices[Vertex];\n\t}\n\n\tGtsSurface* gts_surface;\n\tstd::vector<GtsVertex*> gts_vertices;\n\n\tconst k3d::mesh::points_t* mesh_points;\n};\n\n} // namespace detail\n\nGtsSurface* convert(const k3d::mesh& Mesh, const k3d::polyhedron::const_primitive& Polyhedron)\n{\n\treturn detail::triangulator().process(Mesh, Polyhedron);\n}\n\n/*\n// Did you know that a GtsSurface cannot be converted into a K-3D mesh\n// in a way that is compatible with the K-3D pipeline?  Unless you can\n// prove that GTS has been fixed to provide deterministic output, we\n// will-not accept any function that converts from GtsSurface to a\n// K-3D mesh.\n//\n// See http://www.k-3d.org/wiki/GTS_Plugins_Removed for details.\n*/\n\n} // namespace gts\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/gts/helpers.h",
    "content": "#ifndef MODULES_GTS_HELPERS_H\n#define MODULES_GTS_HELPERS_H\n\n// K-3D\n// Copyright (c) 2004-2007, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Defines GTS interface: data types and functions\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <gts.h>\n\nnamespace k3d { class mesh; }\nnamespace k3d { namespace polyhedron { class const_primitive; } }\n\nnamespace module\n{\n\nnamespace gts\n{\n\n/// Converts a K-3D mesh into a GtsSurface\nGtsSurface* convert(const k3d::mesh& Mesh, const k3d::polyhedron::const_primitive& Polyhedron);\n\n/// Smart pointer for holding GTS objects\ntemplate<typename T>\nclass gts_ptr\n{\npublic:\n\tgts_ptr(T* const Object) :\n\t\tm_object(Object)\n\t{\n\t}\n\n\t~gts_ptr()\n\t{\n\t\tif(m_object)\n\t\t\tgts_object_destroy(GTS_OBJECT(m_object));\n\t}\n\n\toperator T*() const\n\t{\n\t\treturn m_object;\n\t}\n\n\tT* operator->() const\n\t{\n\t\treturn m_object;\n\t}\n\nprivate:\n\tT* const m_object;\n};\n\n} // namespace gts\n\n} // namespace module\n\n#endif // !MODULES_GTS_HELPERS_H\n\n"
  },
  {
    "path": "modules/gts/mesh_area.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace module\n{\n\nnamespace gts\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_area\n\nclass mesh_area :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tmesh_area(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_area(init_owner(*this) + init_name(\"area\") + init_label(_(\"Mesh area\")) + init_description(_(\"Mesh area\")) + init_value(0.0))\n\t{\n\t\tm_input_mesh.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_area.make_slot()));\n\n\t\tm_area.set_update_slot(sigc::mem_fun(*this, &mesh_area::execute));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_area,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x9a340565, 0x47498847, 0x8979d2a1, 0x25f072d9),\n\t\t\t\t\"GTSMeshArea\",\n\t\t\t\t_(\"Calculates input mesh area\"),\n\t\t\t\t\"Mesh\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_area;\n\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::double_t& Area)\n\t{\n\t\tArea = 0;\n\n\t\tk3d::mesh* const mesh = m_input_mesh.pipeline_value();\n\t\tif(!mesh)\n\t\t\treturn;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = mesh->primitives.begin(); primitive != mesh->primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst gts_ptr<GtsSurface> gts_surface = convert(*mesh, *polyhedron);\n\t\t\tArea += gts_surface_area(gts_surface);\n\t\t}\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_area\n\nk3d::iplugin_factory& mesh_area_factory()\n{\n\treturn mesh_area::get_factory();\n}\n\n} // namespace gts\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/gts/mesh_volume.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/value_demand_storage.h>\n#include <k3dsdk/polyhedron.h>\n\nnamespace module\n{\n\nnamespace gts\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_volume\n\nclass mesh_volume :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tmesh_volume(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_volume(init_owner(*this) + init_name(\"volume\") + init_label(_(\"Volume\")) + init_description(_(\"Mesh volume\")) + init_value(0.0))\n\t{\n\t\tm_input_mesh.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_volume.make_slot()));\n\n\t\tm_volume.set_update_slot(sigc::mem_fun(*this, &mesh_volume::execute));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_volume,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x905f24ef, 0x344f1c6f, 0x3242b79d, 0xeb8b0a57),\n\t\t\t\t\"GTSMeshVolume\",\n\t\t\t\t_(\"Calculates input mesh volume\"),\n\t\t\t\t\"Mesh\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_volume;\n\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::double_t& Volume)\n\t{\n\t\tVolume = 0;\n\n\t\tk3d::mesh* const mesh = m_input_mesh.pipeline_value();\n\t\tif(!mesh)\n\t\t\treturn;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = mesh->primitives.begin(); primitive != mesh->primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst gts_ptr<GtsSurface> gts_surface = convert(*mesh, *polyhedron);\n\t\t\tVolume += gts_surface_volume(gts_surface);\n\t\t}\n\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_volume_factory\n\nk3d::iplugin_factory& mesh_volume_factory()\n{\n\treturn mesh_volume::get_factory();\n}\n\n} // namespace gts\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/gts/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the gts plugin module, to protect public symbols from name clashes with other modules\nnamespace gts\n{\n\nextern k3d::iplugin_factory& mesh_area_factory();\nextern k3d::iplugin_factory& mesh_volume_factory();\n\n} // namespace gts\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::gts::mesh_area_factory());\n\tRegistry.register_factory(module::gts::mesh_volume_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/gts_io/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-gts-io)\nK3D_CREATE_MODULE_PROXY(k3d-gts-io)\n\n"
  },
  {
    "path": "modules/gts_io/mesh_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Implements GTSMeshReader, which reads GNU Triangulated Surface (.gts) files\n\t\\author Tom Browder (tbrowder@home.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Tim Shead (tshead@k3d.com)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/file_helpers.h>\n#include <k3dsdk/gzstream.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_reader.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/string_modifiers.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace gts\n{\n\nnamespace io\n{\n\n/// Retrieve a line from a GTS file, skipping comments and empty lines\nvoid gts_line(std::istream& Stream, std::string& Buffer)\n{\n\tfor(k3d::getline(Stream, Buffer); Stream; k3d::getline(Stream, Buffer))\n\t{\n\t\tif(Buffer[0] == '#')\n\t\t\tcontinue;\n\n\t\tif(k3d::trim(Buffer).empty())\n\t\t\tcontinue;\n\n\t\tbreak;\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_reader\n\nclass mesh_reader :\n\tpublic k3d::material_sink<k3d::mesh_reader<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_reader<k3d::node > > base;\n\npublic:\n\tmesh_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_load_mesh(const k3d::filesystem::path& Path, k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::filesystem::igzstream file(Path);\n\t\tif(!file)\n\t\t\treturn;\n\n\t\t// Read point, edge, and triangle counts ...\n\t\tstd::string buffer;\n\t\tgts_line(file, buffer);\n\t\tif(!file)\n\t\t{\n\t\t\tk3d::log() << error << \"Empty GTS file: \" << Path.native_console_string() << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::uint_t point_count = 0;\n\t\tk3d::uint_t edge_count = 0;\n\t\tk3d::uint_t triangle_count = 0;\n\t\tstd::stringstream line_buffer(buffer);\n\t\tline_buffer >> point_count >> edge_count >> triangle_count;\n\n\t\t// Read points ...\n\t\tk3d::mesh::points_t& points = Output.points.create(new k3d::mesh::points_t(point_count));\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create(new k3d::mesh::selection_t(point_count, 0.0));\n\n\t\tfor(k3d::uint_t i = 0; i != point_count; ++i)\n\t\t{\n\t\t\tgts_line(file, buffer);\n\t\t\tif(!file)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Unexpected end-of-file: \" << Path.native_console_string() << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tk3d::point3 point;\n\t\t\tstd::stringstream line_buffer(buffer);\n\t\t\tline_buffer >> point[0] >> point[1] >> point[2];\n\n\t\t\tpoints[i] = point;\n\t\t}\n\n\t\t// Read edges ...\n\t\tstd::vector<k3d::uint_t> edge_from;\n\t\tstd::vector<k3d::uint_t> edge_to;\n\n\t\tedge_from.reserve(edge_count);\n\t\tedge_to.reserve(edge_count);\n\n\t\tfor(k3d::uint_t i = 0; i != edge_count; ++i)\n\t\t{\n\t\t\tgts_line(file, buffer);\n\t\t\tif(!file)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Unexpected end-of-file: \" << Path.native_console_string() << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tk3d::uint_t from;\n\t\t\tk3d::uint_t to;\n\t\t\tstd::stringstream line_buffer(buffer);\n\t\t\tline_buffer >> from >> to;\n\n\t\t\tedge_from.push_back(from - 1); // GTS indices are one-based\n\t\t\tedge_to.push_back(to - 1); // GTS indices are one-based\n\t\t}\n\n\t\t// Read faces ...\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\tpolyhedron->face_shells.reserve(triangle_count);\n\t\tpolyhedron->face_first_loops.reserve(triangle_count);\n\t\tpolyhedron->face_loop_counts.reserve(triangle_count);\n\t\tpolyhedron->face_selections.reserve(triangle_count);\n\t\tpolyhedron->face_materials.reserve(triangle_count);\n\t\tpolyhedron->loop_first_edges.reserve(triangle_count);\n\t\tpolyhedron->clockwise_edges.reserve(3 * triangle_count);\n\t\tpolyhedron->edge_selections.reserve(3 * triangle_count);\n\t\tpolyhedron->vertex_points.reserve(3 * triangle_count);\n\t\tpolyhedron->vertex_selections.reserve(3 * triangle_count);\n\n\t\tfor(k3d::uint_t i = 0; i != triangle_count; ++i)\n\t\t{\n\t\t\tgts_line(file, buffer);\n\t\t\tif(!file)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Unexpected end-of-file: \" << Path.native_console_string() << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tk3d::uint_t edge1;\n\t\t\tk3d::uint_t edge2;\n//\t\t\tk3d::uint_t edge3; This is totally redundant ... strange file format!\n\n\t\t\tstd::stringstream line_buffer(buffer);\n\t\t\tline_buffer >> edge1 >> edge2 /* >> edge3 */;\n\n\t\t\t// Calculate a consistent order for triangle points ...\n\t\t\tconst k3d::uint_t edge1_from = edge_from[edge1 - 1];\n\t\t\tconst k3d::uint_t edge1_to = edge_to[edge1 - 1];\n\t\t\tconst k3d::uint_t edge2_from = edge_from[edge2 - 1];\n\t\t\tconst k3d::uint_t edge2_to = edge_to[edge2 - 1];\n\n\t\t\t// Determine triangle orientation\n\t\t\tk3d::uint_t point1;\n\t\t\tk3d::uint_t point2;\n\t\t\tk3d::uint_t point3;\n\n\t\t\tif(edge1_from == edge2_from)\n\t\t\t{\n\t\t\t\tpoint1 = edge1_to;\n\t\t\t\tpoint2 = edge1_from;\n\t\t\t\tpoint3 = edge2_to;\n\t\t\t}\n\t\t\telse if(edge1_from == edge2_to)\n\t\t\t{\n\t\t\t\tpoint1 = edge1_to;\n\t\t\t\tpoint2 = edge1_from;\n\t\t\t\tpoint3 = edge2_from;\n\t\t\t}\n\t\t\telse if(edge1_to == edge2_from)\n\t\t\t{\n\t\t\t\tpoint1 = edge1_from;\n\t\t\t\tpoint2 = edge1_to;\n\t\t\t\tpoint3 = edge2_to;\n\t\t\t}\n\t\t\telse //if(edge1_to == edge2_to)\n\t\t\t{\n\t\t\t\tpoint1 = edge1_from;\n\t\t\t\tpoint2 = edge1_to;\n\t\t\t\tpoint3 = edge2_from;\n\t\t\t}\n\n\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\tpolyhedron->face_selections.push_back(0.0);\n\t\t\tpolyhedron->face_materials.push_back(0);\n\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\t\t\t\n\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\tpolyhedron->edge_selections.push_back(0.0);\n\t\t\tpolyhedron->vertex_points.push_back(point1);\n\t\t\tpolyhedron->vertex_selections.push_back(0.0);\n\n\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\tpolyhedron->edge_selections.push_back(0.0);\n\t\t\tpolyhedron->vertex_points.push_back(point2);\n\t\t\tpolyhedron->vertex_selections.push_back(0.0);\n\n\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() - 2);\n\t\t\tpolyhedron->edge_selections.push_back(0.0);\n\t\t\tpolyhedron->vertex_points.push_back(point3);\n\t\t\tpolyhedron->vertex_selections.push_back(0.0);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_reader, k3d::interface_list<k3d::imesh_source> > factory(\n\t\t\tk3d::uuid(0x7dbddd53, 0xef4e9588, 0x2643acb3, 0x4ad62813),\n\t\t\t\"GTSMeshReader\",\n\t\t\t_(\"Mesh reader that reads external GNU Triangulated Surface (.gts) files\"),\n\t\t\t\"MeshReader\");\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& mesh_reader_factory()\n{\n\treturn mesh_reader::get_factory();\n}\n\n} // namespace io\n\n} // namespace gts\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/gts_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace gts\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& mesh_reader_factory();\n\n} // namespace io\n\n} // namespace gts\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::gts::io::mesh_reader_factory());\nK3D_MODULE_END\n\n\n"
  },
  {
    "path": "modules/highlighting/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-highlighting)\nK3D_CREATE_MODULE_PROXY(k3d-highlighting)\n\n"
  },
  {
    "path": "modules/highlighting/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace highlighting\n{\n\nextern k3d::iplugin_factory& rubber_band_factory();\n\n} // namespace highlighting\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::highlighting::rubber_band_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/highlighting/rubber_band.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/irenderable_gl.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/render_state_gl.h>\n#include <k3dsdk/utility_gl.h>\n\nnamespace module\n{\n\nnamespace highlighting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// rubber_band\n\nclass rubber_band :\n\tpublic k3d::node,\n\tpublic k3d::gl::irenderable\n{\n\ttypedef k3d::node base;\n\npublic:\n\trubber_band(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_camera(init_owner(*this) + init_name(\"camera\") + init_label(_(\"Camera\")) + init_description(_(\"Camera\")) + init_value<k3d::icamera*>(0)),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Color\")) + init_value(k3d::color(1, 0, 0))),\n\t\tm_opacity(init_owner(*this) + init_name(\"opacity\") + init_label(_(\"Opacity\")) + init_description(_(\"Opacity\")) + init_value(0.1) + init_units(typeid(k3d::measurement::scalar)) + init_step_increment(0.1)),\n\t\tm_border_color(init_owner(*this) + init_name(\"border_color\") + init_label(_(\"Border Color\")) + init_description(_(\"Border Color\")) + init_value(k3d::color(1, 0, 0))),\n\t\tm_border_opacity(init_owner(*this) + init_name(\"border_opacity\") + init_label(_(\"Border Opacity\")) + init_description(_(\"Border Opacity\")) + init_value(0.5) + init_units(typeid(k3d::measurement::scalar)) + init_step_increment(0.1)),\n\t\tm_rectangle(init_owner(*this) + init_name(\"rectangle\") + init_label(_(\"Rectangle\")) + init_description(_(\"Rectangle\")) + init_value(k3d::rectangle(0, 0, 0, 0)))\n\t{\n\t\tm_camera.changed_signal().connect(make_async_redraw_slot());\n\t\tm_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_opacity.changed_signal().connect(make_async_redraw_slot());\n\t\tm_border_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_border_opacity.changed_signal().connect(make_async_redraw_slot());\n\t\tm_rectangle.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tsigc::slot<void, k3d::ihint*> make_async_redraw_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &rubber_band::async_redraw);\n\t}\n\n\tvoid async_redraw(k3d::ihint*)\n\t{\n\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tk3d::uint_t gl_layer()\n\t{\n\t\treturn 4096;\n\t}\n\n\tvoid gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tif(&State.camera != m_camera.pipeline_value())\n\t\t\treturn;\n\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tdraw(State);\n\t}\n\n\tvoid gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\t/** \\note Selection is disabled for this plugin, so we don't interfere with\n\t\t * selection of \"normal\" geometry */\n\t}\n\n\tvoid draw(const k3d::gl::render_state& State)\n\t{\n\t\tconst k3d::color color = m_color.pipeline_value();\n\t\tconst k3d::double_t opacity = m_opacity.pipeline_value();\n\t\tconst k3d::color border_color = m_border_color.pipeline_value();\n\t\tconst k3d::double_t border_opacity = m_border_opacity.pipeline_value();\n\n\t\tconst k3d::rectangle rectangle = m_rectangle.pipeline_value();\n\t\tconst k3d::double_t depth = 0;\n\n\t\tglMatrixMode(GL_PROJECTION);\n\t\tglPushMatrix();\n\t\tglLoadIdentity();\n\t\tglOrtho(State.gl_viewport[0], State.gl_viewport[0] + State.gl_viewport[2], State.gl_viewport[1], State.gl_viewport[1] + State.gl_viewport[3], -1, 1);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tglLoadIdentity();\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_CULL_FACE);\n\n\t\tglEnable(GL_BLEND);\n\t\tglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\n\t\tglDepthFunc(GL_ALWAYS);\n\t\tglDepthMask(GL_FALSE);\n\n\t\tglColor4d(color.red, color.green, color.blue, opacity);\n\t\tglBegin(GL_QUADS);\n\t\t\tglVertex3d(rectangle.x1, rectangle.y1, depth);\n\t\t\tglVertex3d(rectangle.x2, rectangle.y1, depth);\n\t\t\tglVertex3d(rectangle.x2, rectangle.y2, depth);\n\t\t\tglVertex3d(rectangle.x1, rectangle.y2, depth);\n\t\tglEnd();\n\n\t\tglColor4d(border_color.red, border_color.green, border_color.blue, border_opacity);\n\t\tglBegin(GL_LINE_LOOP);\n\t\t\tglVertex3d(rectangle.x1, rectangle.y1, depth);\n\t\t\tglVertex3d(rectangle.x2, rectangle.y1, depth);\n\t\t\tglVertex3d(rectangle.x2, rectangle.y2, depth);\n\t\t\tglVertex3d(rectangle.x1, rectangle.y2, depth);\n\t\tglEnd();\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\n\t\tglMatrixMode(GL_PROJECTION);\n\t\tglPopMatrix();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<rubber_band>factory(\n\t\t\tk3d::uuid(0x72d36e00, 0x0a4621f4, 0xfdc8e69d, 0x621eadc8),\n\t\t\t\"RubberBand\",\n\t\t\t_(\"Displays a rubber-band box in the viewport.\"),\n\t\t\t\"Annotation\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::icamera*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_camera;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_opacity;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_border_color;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_border_opacity;\n\tk3d_data(k3d::rectangle, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_rectangle;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// rubber_band_factory\n\nk3d::iplugin_factory& rubber_band_factory()\n{\n\treturn rubber_band::get_factory();\n}\n\n} // namespace highlighting\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/iges_io/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-iges-io)\nK3D_CREATE_MODULE_PROXY(k3d-iges-io)\n\n"
  },
  {
    "path": "modules/iges_io/mesh_writer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/ihint.h>\n#include <k3dsdk/mesh_writer.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/triangulator.h>\n\n#include <boost/date_time/posix_time/posix_time.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <iomanip>\n\nnamespace module\n{\n\nnamespace iges\n{\n\nnamespace io\n{\n\nnamespace detail\n{\n/// Helper struct to write variable-length parameter data\nstruct parameter_section\n{\n\tparameter_section(const char Label, const k3d::bool_t AddDictEntry = false) : m_column(0), m_line(0), m_width(AddDictEntry ? 64 : 72), m_label(Label), m_dict_entry(0)\n\t{\n\t}\n\t\n\t// Ends the current line\n\tvoid endline()\n\t{\n\t\tconst k3d::uint_t padding = m_width - m_column;\n\t\tfor(k3d::uint_t i = 0; i != padding; ++i)\n\t\t\tstream << \" \";\n\t\tif(m_dict_entry != 0)\n\t\t\tstream << \" \" << std::setw(7) << std::right << m_dict_entry;\n\t\tstream << m_label << std::setw(7) << std::right << (++m_line) << \"\\n\";\n\t\tm_column = 0;\n\t}\n\t\n\t// Ends the current record\n\tvoid endrecord()\n\t{\n\t\tstream << \";\";\n\t\t++m_column;\n\t\tendline();\n\t}\n\t\n\t// Adds a formatted value to the stream\n\tvoid add_formatted_value(const std::string& Value)\n\t{\n\t\tif(Value.size() + m_column < m_width)\n\t\t{\n\t\t\tstream << Value;\n\t\t\tm_column += Value.size();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tendline();\n\t\t\tstream << Value;\n\t\t\tm_column += Value.size();\n\t\t}\n\t}\n\t\n\tvoid set_dict_entry(const k3d::uint_t Dict)\n\t{\n\t\tm_dict_entry = Dict;\n\t}\n\t\n\t/// Number of lines stored\n\tk3d::uint_t lines() const\n\t{\n\t\treturn m_line;\n\t}\n\t\n\tstd::stringstream stream;\n\t\nprivate:\n\tk3d::uint_t m_column;\n\tk3d::uint_t m_line;\n\tconst k3d::uint_t m_width;\n\t\n\tconst char m_label;\n\t\n\tk3d::uint_t m_dict_entry;\n};\n\nparameter_section& operator<<(parameter_section& ParamaterSection, const std::string& Value)\n{\n\tif(Value.empty())\n\t{\n\t\tParamaterSection.add_formatted_value(\",\");\n\t\treturn ParamaterSection;\n\t}\n\t\n\tstd::stringstream temp;\n\ttemp << Value.size() << 'H' << Value << ',';\n\tParamaterSection.add_formatted_value(temp.str());\n\t\n\treturn ParamaterSection;\n}\n\nparameter_section& operator<<(parameter_section& ParamaterSection, const int Value)\n{\n\tstd::stringstream temp;\n\ttemp << Value << ',';\n\tParamaterSection.add_formatted_value(temp.str());\n\t\n\treturn ParamaterSection;\n}\n\nparameter_section& operator<<(parameter_section& ParamaterSection, const k3d::double_t Value)\n{\n\tstd::stringstream temp;\n\ttemp << std::setprecision(15) << std::fixed << Value << ',';\n\tParamaterSection.add_formatted_value(temp.str());\n\t\n\treturn ParamaterSection;\n}\n\n/// Represents an entry in a directory\nstruct directory_entry\n{\n\tdirectory_entry(const int Type, const int ParameterData, const int ParameterLength, const int Index) :\n\t\tentity_type(Type),\n\t\tparameter_data(ParameterData),\n\t\tstructure(0),\n\t\tline_font_pattern(0),\n\t\tlevel(0),\n\t\tview(0),\n\t\ttransformation_matrix(0),\n\t\tlabel_display_associativity(0),\n\t\tstatus(\"00000000\"),\n\t\tline_weight(0),\n\t\tcolor(0),\n\t\tparameter_line_count(ParameterLength),\n\t\tform(0),\n\t\treserved1(\"        \"),\n\t\treserved2(\"        \"),\n\t\tlabel(\"        \"),\n\t\tentity_subscript(0),\n\t\tindex(Index)\n\t{\n\t}\n\t\n\t/// See file format spec for details on all these fields\n\tint entity_type;\n\tint parameter_data;\n\tint structure;\n\tint line_font_pattern;\n\tint level;\n\tint view;\n\tint transformation_matrix;\n\tint label_display_associativity;\n\tstd::string status;\n\tint line_weight;\n\tint color;\n\tint parameter_line_count;\n\tint form;\n\tstd::string reserved1;\n\tstd::string reserved2;\n\tstd::string label;\n\tint entity_subscript;\n\t\n\t/// Zero-based index of this entry (the 1-based line number as specified in the standard is derived from this)\n\tk3d::uint_t index;\n\t\n\t/// Write to an output stream\n\tvoid write(std::ostream& Output)\n\t{\n\t\tOutput <<\n\t\t\tstd::setw(8) << entity_type <<\n\t\t\tstd::setw(8) << parameter_data <<\n\t\t\tstd::setw(8) << structure <<\n\t\t\tstd::setw(8) << line_font_pattern <<\n\t\t\tstd::setw(8) << level <<\n\t\t\tstd::setw(8) << view <<\n\t\t\tstd::setw(8) << transformation_matrix <<\n\t\t\tstd::setw(8) << label_display_associativity <<\n\t\t\tstd::setw(8) << status <<\n\t\t\t'D' << std::setw(7) << 1 + 2*index << \"\\n\" <<\n\t\t\tstd::setw(8) << entity_type <<\n\t\t\tstd::setw(8) << line_weight <<\n\t\t\tstd::setw(8) << color <<\n\t\t\tstd::setw(8) << parameter_line_count <<\n\t\t\tstd::setw(8) << form <<\n\t\t\treserved1 << reserved2 << label <<\n\t\t\tstd::setw(8) << entity_subscript <<\n\t\t\t'D' << std::setw(7) << 2 + 2*index << \"\\n\";\n\t}\n};\n\n/// Helper struct to simplify writing in the fixed-width format of IGES\nstruct iges_formatter\n{\n\tiges_formatter(std::ostream& Output, const std::string& Header, const std::string& Name) : m_output(Output), m_parameters('P', true), m_directory_index(0)\n\t{\n\t\t// Get the creation time\n\t\tstd::stringstream time_str;\n\t\tconst boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();\n\t\tboost::posix_time::time_facet* f = new boost::posix_time::time_facet(\"%Y%m%d.%H%M%S\");\n\t\ttime_str.imbue(std::locale(time_str.getloc(),f));\n\t\ttime_str << now;\n\t\t\n\t\t// Write the start section\n\t\tm_output << std::setw(72) << std::left << Header << 'S' << std::setw(7) << std::right << 1 << \"\\n\";\n\t\t\n\t\t// Write the global section\n\t\tparameter_section global_section('G');\n\t\tglobal_section << \"\" << \"\" << Name << Name + \".iges\" << K3D_PACKAGE << K3D_VERSION << 32 << 38 << 7 << 307 << 15\n\t\t\t<< Name << 1. << 6 << \"M\" << 1 << 0.005 << time_str.str() << 0.000001 << \"\" << \"\" << \"\" << 11 << \"\" << \"\" << \"\";\n\t\tglobal_section.endrecord();\n\t\tm_global_size = global_section.lines();\n\t\tm_output << global_section.stream.str();\n\t}\n\t\n\t~iges_formatter()\n\t{\n\t\tm_output << m_parameters.stream.str();\n\t\tm_output << 'S' << std::setw(7) << 1 << 'G' << std::setw(7) << m_global_size << 'D' << std::setw(7) << 2*m_directory_index << 'P' << std::setw(7) << m_parameters.lines() << std::setw(40) << \"\" << 'T' << std::setw(7) << 1 << \"\\n\";\n\t}\n\t\n\t/// K1: number of points in U direction - 1\n\t/// M1: degree in the U direction (= order - 1)\n\tvoid add_nurbs_patch(const int K1, const int K2, const int M1, const int M2, const k3d::mesh::knots_t& UKnots, const k3d::mesh::knots_t& VKnots, const k3d::mesh::weights_t Weights, const k3d::mesh::points_t& Points)\n\t{\n\t\tconst int param_start = m_parameters.lines();\n\t\tm_parameters.set_dict_entry(m_directory_index + 1);\n\t\t\n\t\t// Set global patch prameters\n\t\tm_parameters << 128 << K1 << K2 << M1 << M2 << 0 << 0 << 0 << 0 << 0;\n\t\t\n\t\t// Add U knots\n\t\tconst k3d::uint_t nb_u_knots = UKnots.size();\n\t\tfor(k3d::uint_t i = 0; i != nb_u_knots; ++i)\n\t\t\tm_parameters << UKnots[i];\n\t\t\n\t\t// Add V knots\n\t\tconst k3d::uint_t nb_v_knots = VKnots.size();\n\t\tfor(k3d::uint_t i = 0; i != nb_v_knots; ++i)\n\t\t\tm_parameters << VKnots[i];\n\t\t\n\t\t// Weights\n\t\tconst k3d::uint_t nb_weights = Weights.size();\n\t\tfor(k3d::uint_t i = 0; i != nb_weights; ++i)\n\t\t\tm_parameters << Weights[i];\n\t\t\n\t\t// Points\n\t\tfor(k3d::uint_t i = 0; i != nb_weights; ++i)\n\t\t\tm_parameters << Points[i][0] << Points[i][1] << Points[i][2];\n\t\t\n\t\t// Parameter limits\n\t\tm_parameters << UKnots.front() << UKnots.back() << VKnots.front() << VKnots.back();\n\t\t\n\t\tm_parameters.endrecord();\n\t\tconst int param_end = m_parameters.lines();\n\t\t\n\t\tdirectory_entry entry(128, param_start+1, param_end - param_start, m_directory_index);\n\t\tentry.write(m_output);\n\t\t\n\t\t++m_directory_index;\n\t}\n\t\n\tprivate:\n\t\tstd::ostream& m_output;\n\t\tstd::stringstream m_directory;\n\t\tparameter_section m_parameters;\n\t\tk3d::uint_t m_directory_index;\n\t\tk3d::uint_t m_global_size;\n};\n\n} // detail\n\t\n/////////////////////////////////////////////////////////////////////////////\n// mesh_writerio\n\nclass mesh_writer :\n\tpublic k3d::mesh_writer<k3d::node >\n{\n\ttypedef k3d::mesh_writer<k3d::node > base;\n\npublic:\n\tmesh_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_writer, k3d::interface_list<k3d::imesh_sink > > factory(\n\t\t\tk3d::uuid(0x95dc7909, 0xfa8e4c74, 0xab789866, 0xef89e707),\n\t\t\t\"IGESMeshWriter\",\n\t\t\t_(\"Mesh writer that saves IGES CAD (.iges) files\"),\n\t\t\t\"MeshWriter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t\n\tvoid on_write_mesh(const k3d::mesh& Input, const k3d::filesystem::path& OutputPath, std::ostream& Output)\n\t{\n\t\tdetail::iges_formatter iges(Output, \"K-3D IGES export\", OutputPath.leaf().raw().substr(0, OutputPath.leaf().raw().find_last_of(\".\")));\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{\n\t\t\t// TODO: Only export NURBS patches for now\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs_patch(k3d::nurbs_patch::validate(Input, **primitive));\n\t\t\tif(!nurbs_patch)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst k3d::uint_t nb_patches = nurbs_patch->patch_first_points.size();\n\t\t\tfor(k3d::uint_t patch_idx = 0; patch_idx != nb_patches; ++patch_idx)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t nb_u_points = nurbs_patch->patch_u_point_counts[patch_idx];\n\t\t\t\tconst k3d::uint_t nb_v_points = nurbs_patch->patch_v_point_counts[patch_idx];\n\t\t\t\tconst k3d::uint_t u_order = nurbs_patch->patch_u_orders[patch_idx];\n\t\t\t\tconst k3d::uint_t v_order = nurbs_patch->patch_v_orders[patch_idx];\n\t\t\t\t\n\t\t\t\tconst k3d::uint_t u_knots_begin = nurbs_patch->patch_u_first_knots[patch_idx];\n\t\t\t\tconst k3d::uint_t u_knots_end = u_knots_begin + u_order + nb_u_points;\n\t\t\t\tconst k3d::mesh::knots_t u_knots(nurbs_patch->patch_u_knots.begin() + u_knots_begin, nurbs_patch->patch_u_knots.begin() + u_knots_end);\n\t\t\t\t\n\t\t\t\tconst k3d::uint_t v_knots_begin = nurbs_patch->patch_v_first_knots[patch_idx];\n\t\t\t\tconst k3d::uint_t v_knots_end = v_knots_begin + v_order + nb_v_points;\n\t\t\t\tconst k3d::mesh::knots_t v_knots(nurbs_patch->patch_v_knots.begin() + v_knots_begin, nurbs_patch->patch_v_knots.begin() + v_knots_end);\n\t\t\t\t\n\t\t\t\tk3d::mesh::points_t points;\n\t\t\t\tk3d::mesh::weights_t weights;\n\t\t\t\tconst k3d::uint_t nb_points = nb_u_points * nb_v_points;\n\t\t\t\tpoints.reserve(nb_points);\n\t\t\t\tweights.reserve(nb_points);\n\t\t\t\tconst k3d::uint_t points_begin = nurbs_patch->patch_first_points[patch_idx];\n\t\t\t\tconst k3d::uint_t points_end = points_begin + nb_points;\n\t\t\t\tfor(k3d::uint_t i = points_begin; i != points_end; ++i)\n\t\t\t\t{\n\t\t\t\t\tpoints.push_back(Input.points->at(nurbs_patch->patch_points[i]));\n\t\t\t\t\tweights.push_back(nurbs_patch->patch_point_weights[i]);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tiges.add_nurbs_patch(nb_u_points-1, nb_v_points-1, u_order-1, v_order-1, u_knots, v_knots, weights, points);\n\t\t\t}\n\t\t}\n\t}\n};\n\nk3d::iplugin_factory& mesh_writer_factory()\n{\n\treturn mesh_writer::get_factory();\n}\n\n} // namespace io\n\n} // namespace iges\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/iges_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace iges\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& mesh_writer_factory();\n\n} // namespace io\n\n} // namespace iges\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::iges::io::mesh_writer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/imagemagick_io/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_IMAGEMAGICK_INCLUDE_DIRS})\n\nK3D_BUILD_MODULE(k3d-imagemagick-io)\nK3D_CREATE_MODULE_PROXY(k3d-imagemagick-io)\n\nTARGET_LINK_LIBRARIES(k3d-imagemagick-io ${K3D_IMAGEMAGICK_LIBS})\n\n"
  },
  {
    "path": "modules/imagemagick_io/bitmap_importer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Brett W. McCoy (bmccoy@chapelperilous.net)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/ibitmap_importer.h>\n#include <k3dsdk/path.h>\n\n#include <Magick++.h>\n\n#include <boost/assign/list_of.hpp>\n\nnamespace module\n{\n\nnamespace imagemagick\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_importer\n\n/// Reads a wide variety of image file formats using the ImageMagick C++ bindings\nclass bitmap_importer :\n\tpublic k3d::ibitmap_importer\n{\npublic:\n\tbitmap_importer()\n\t{\n\t}\n\n\tbool read_file(const k3d::filesystem::path& File, k3d::bitmap& Bitmap)\n\t{\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Reading \" << File.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\n\t\t\tMagick::Image image;\n\t\t\timage.read(File.native_filesystem_string());\n\t\t\t\n\t\t\tconst unsigned long width = image.columns();\n\t\t\tconst unsigned long height = image.rows();\n\t\t\t\n\t\t\treturn_val_if_fail(width, false);\n\t\t\treturn_val_if_fail(height, false);\n\n\t\t\tBitmap.recreate(width, height);\n\n\t\t\tMagick::ColorRGB color_rgb;\n\t\t\tk3d::bitmap::view_t::iterator destination = view(Bitmap).begin();\n\t\t\t\n\t\t\tfor(unsigned long y = 0; y < height; y++) \n\t\t\t{\n\t\t\t\tfor(unsigned long x = 0; x < width; x++) \n\t\t\t\t{\n\t\t\t\t\tcolor_rgb = image.pixelColor(x, y);\n\n\t\t\t\t\tget_color(*destination, boost::gil::red_t()) = color_rgb.red();\n\t\t\t\t\tget_color(*destination, boost::gil::green_t()) = color_rgb.green();\n\t\t\t\t\tget_color(*destination, boost::gil::blue_t()) = color_rgb.blue();\n\t\t\t\t\tget_color(*destination, boost::gil::alpha_t()) = 1.0 - color_rgb.alpha();\n\t\t\t\t\t\n\t\t\t\t\t++destination;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\tcatch(Magick::Exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t\treturn false;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t\treturn false;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t\treturn false;\n\t\t}\n\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<bitmap_importer, \n\t\t\tk3d::interface_list<k3d::ibitmap_importer> > factory(\n\t\t\t\tk3d::uuid(0x4eb70e35, 0x4e654a53, 0xa8e4b07c, 0x4219d946),\n\t\t\t\t\"ImageMagickBitmapImporter\",\n\t\t\t\t_(\"ImageMagick Formats ( many )\"),\n\t\t\t\t\"Bitmap BitmapImporter\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tboost::assign::map_list_of(\"k3d:load-order\", \"128\")(\"k3d:mime-types\", \"image/bmp image/x-sun-raster\"));\n \n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_importer_factory\n\nk3d::iplugin_factory& bitmap_importer_factory()\n{\n\treturn bitmap_importer::get_factory();\n}\n\n} // namespace io\n\n} // namespace imagemagick\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/imagemagick_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace imagemagick\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& bitmap_importer_factory();\n\n} // namespace io\n\n} // namespace imagemagick\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::imagemagick::io::bitmap_importer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/indigo/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-indigo)\nK3D_CREATE_MODULE_PROXY(k3d-indigo)\n\n"
  },
  {
    "path": "modules/indigo/background.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n#include \"spectrum.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/vector3.h>\n\nnamespace module\n{\n\nnamespace indigo\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// background\n\nclass background :\n\tpublic k3d::node,\n\tpublic indigo::light\n{\n\ttypedef k3d::node base;\n\npublic:\n\tbackground(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n    m_spectrum(this)\n\t{\n\t}\n\n  void setup(std::ostream& Stream)\n  {\n    Stream << k3d::standard_indent << \"<background>\\n\" << k3d::push_indent;\n    m_spectrum.setup(\"spectrum\", Stream);\n    Stream << k3d::pop_indent << k3d::standard_indent << \"</background>\\n\";\n  }\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<background> factory(\n\t\t\tk3d::uuid(0x80dbb6b4, 0xbd46a1db, 0x67fc4995, 0x01d98679),\n\t\t\t\"IndigoBackground\",\n\t\t\t_(\"Indigo Background\"),\n\t\t\t\"Indigo Light\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n  spectrum m_spectrum;\n};\n\nk3d::iplugin_factory& background_factory()\n{\n\treturn background::get_factory();\n}\n\n} // namespace indigo\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/indigo/diffuse_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"material.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace indigo\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass diffuse_material :\n\tpublic k3d::node ,\n  public indigo::material\n{\n\ttypedef k3d::node base;\n\npublic:\n\tdiffuse_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Color\")) + init_value(k3d::color(0.8, 0.8, 0.8)))\n\t{\n\t}\n\n  void setup(const k3d::string_t& Name, std::ostream& Stream)\n  {\n    Stream << k3d::standard_indent << \"<material>\\n\" << k3d::push_indent;\n    Stream << k3d::standard_indent << \"<name>\" << Name << \"</name>\\n\";\n    Stream << k3d::standard_indent << \"<diffuse>\\n\" << k3d::push_indent;\n    Stream << k3d::standard_indent << \"<colour>\" << m_color.pipeline_value() << \"</colour>\\n\";\n    Stream << k3d::pop_indent << k3d::standard_indent << \"</diffuse>\\n\";\n    Stream << k3d::pop_indent << k3d::standard_indent << \"</material>\\n\";\n  }\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<diffuse_material,\n\t\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0x7fbdeb17, 0xce413e5d, 0x65f51688, 0xa789b421),\n\t\t\t\"IndigoDiffuseMaterial\",\n\t\t\t_(\"Indigo Diffuse Material\"),\n\t\t\t\"Indigo Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n};\n\nk3d::iplugin_factory& diffuse_material_factory()\n{\n\treturn diffuse_material::get_factory();\n}\n\n} // namespace indigo\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/indigo/light.h",
    "content": "#ifndef MODULES_INDIGO_LIGHT_H\n#define MODULES_INDIGO_LIGHT_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <iosfwd>\n\nnamespace module\n{\n\nnamespace indigo\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// light\n\n/// Used to \"flag\" Indigo light objects\nclass light\n{\npublic:\n  virtual void setup(std::ostream& Stream) = 0;\n};\n\n} // namespace indigo\n\n} // namespace module\n\n#endif // !MODULES_INDIGO_LIGHT_H\n"
  },
  {
    "path": "modules/indigo/material.h",
    "content": "#ifndef MODULES_INDIGO_MATERIAL_H\n#define MODULES_INDIGO_MATERIAL_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/types.h>\n\n#include <iosfwd>\n\nnamespace module\n{\n\nnamespace indigo\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\n/// Used to \"flag\" Indigo material objects\nclass material :\n  public k3d::imaterial\n{\npublic:\n  virtual void setup(const k3d::string_t& Name, std::ostream& Stream) = 0;\n};\n\n} // namespace indigo\n\n} // namespace module\n\n#endif // !MODULES_INDIGO_MATERIAL_H\n\n"
  },
  {
    "path": "modules/indigo/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the indigo plugin module, to protect public symbols from name clashes with other modules\nnamespace indigo\n{\n\nextern k3d::iplugin_factory& background_factory();\nextern k3d::iplugin_factory& diffuse_material_factory();\nextern k3d::iplugin_factory& rectangle_light_factory();\nextern k3d::iplugin_factory& render_engine_factory();\nextern k3d::iplugin_factory& skylight_factory();\n\n} // namespace indigo\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::indigo::background_factory());\n\tRegistry.register_factory(module::indigo::diffuse_material_factory());\n\tRegistry.register_factory(module::indigo::rectangle_light_factory());\n\tRegistry.register_factory(module::indigo::render_engine_factory());\n\tRegistry.register_factory(module::indigo::skylight_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/indigo/rectangle_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n#include \"spectrum.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/transformable.h>\n\nnamespace module\n{\n\nnamespace indigo\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// rectangle_light\n\nclass rectangle_light :\n\tpublic k3d::gl::renderable<k3d::transformable<k3d::node> >,\n\tpublic indigo::light\n{\n\ttypedef k3d::gl::renderable<k3d::transformable<k3d::node> > base;\n\npublic:\n\trectangle_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Width\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Height\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_power(init_owner(*this) + init_name(\"power\") + init_label(_(\"Power\")) + init_description(_(\"Power-drawn by the light source in Watts.\")) + init_value(100.0)),\n\t\tm_luminous_efficacy(init_owner(*this) + init_name(\"luminous_efficacy\") + init_label(_(\"Luminous Efficacy\")) + init_description(_(\"Luminous efficacy of the light source in luminous flux per Watt.\")) + init_value(17.5)),\n    m_spectrum(this)\n\t{\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\n\t\tk3d::gl::color3d(State.node_selection ? k3d::color(1, 1, 1) : k3d::color(1, 1, 0));\n\t\tglLineWidth(1.0f);\n\t\tglDisable(GL_LINE_STIPPLE);\n\n\t\tdraw();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw();\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid draw()\n\t{\n    const k3d::point3 center(0, 0, 0);\n    const k3d::double_t width = 0.5 * m_width.pipeline_value();\n    const k3d::double_t height = 0.5 * m_height.pipeline_value();\n\n\t\tglBegin(GL_LINE_LOOP);\n\n\t\tglVertex3d(center[0] - width, center[1] - height, center[2]);\n\t\tglVertex3d(center[0] + width, center[1] - height, center[2]);\n\t\tglVertex3d(center[0] + width, center[1] + height, center[2]);\n\t\tglVertex3d(center[0] - width, center[1] + height, center[2]);\n\n\t\tglEnd();\n\t}\n\n  void setup(std::ostream& Stream)\n  {\n    const k3d::point3 pos = k3d::world_position(*this);\n\n    Stream << k3d::standard_indent << \"<rectanglelight>\\n\" << k3d::push_indent;\n    Stream << k3d::standard_indent << \"<pos>\" << -pos[0] << \" \" << pos[1] << \" \" << pos[2] << \"</pos>\\n\";\n    Stream << k3d::standard_indent << \"<width>\" << m_width.pipeline_value() << \"</width>\\n\";\n    Stream << k3d::standard_indent << \"<height>\" << m_height.pipeline_value() << \"</height>\\n\";\n\n    m_spectrum.setup(\"spectrum\", Stream);\n    \n    Stream << k3d::standard_indent << \"<efficacy_scale>\\n\" << k3d::push_indent;\n    Stream << k3d::standard_indent << \"<power_drawn>\" << m_power.pipeline_value() << \"</power_drawn>\\n\";\n    Stream << k3d::standard_indent << \"<overall_luminous_efficacy>\" << m_luminous_efficacy.pipeline_value() << \"</overall_luminous_efficacy>\\n\";\n    Stream << k3d::pop_indent << k3d::standard_indent << \"</efficacy_scale>\\n\";\n    Stream << k3d::pop_indent << k3d::standard_indent << \"</rectanglelight>\\n\";\n  }\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<rectangle_light> factory(\n\t\t\tk3d::uuid(0xfe05aa8d, 0xcf485202, 0x82a460ba, 0xab3184a3),\n\t\t\t\"IndigoRectangleLight\",\n\t\t\t_(\"Indigo Rectangle Light\"),\n\t\t\t\"Indigo Light\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_power;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_luminous_efficacy;\n  spectrum m_spectrum;\n};\n\nk3d::iplugin_factory& rectangle_light_factory()\n{\n\treturn rectangle_light::get_factory();\n}\n\n} // namespace indigo\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/indigo/render_engine.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n#include \"material.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/file_range.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/inetwork_render_farm.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/inetwork_render_job.h>\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/irender_camera_animation.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/irender_camera_preview.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/material.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/network_render_farm.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/resolutions.h>\n#include <k3dsdk/time_source.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/triangulator.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iomanip>\n#include <iterator>\n#include <map>\n#include <set>\n\nnamespace module\n{\n\nnamespace indigo\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// render_engine\n\nclass render_engine :\n\tpublic k3d::node,\n\tpublic k3d::inode_collection_sink,\n\tpublic k3d::irender_camera_preview,\n\tpublic k3d::irender_camera_frame,\n\tpublic k3d::irender_camera_animation\n{\n\ttypedef k3d::node base;\n// initialise properties\npublic:\n\trender_engine(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_visible_nodes(init_owner(*this) + init_name(\"visible_nodes\") + init_label(_(\"Visible Nodes\")) + init_description(_(\"A list of nodes that will be visible in the rendered output.\")) + init_value(std::vector<k3d::inode*>())),\n\t\tm_enabled_lights(init_owner(*this) + init_name(\"enabled_lights\") + init_label(_(\"Enabled Lights\")) + init_description(_(\"A list of light sources that will contribute to the rendered output.\")) + init_value(std::vector<k3d::inode*>())),\n\t\tm_resolution(init_owner(*this) + init_name(\"resolution\") + init_label(_(\"Resolution\")) + init_description(_(\"Choose a predefined image resolution\")) + init_enumeration(k3d::resolution_values()) + init_value(k3d::string_t(\"\"))),\n\t\tm_pixel_width(init_owner(*this) + init_name(\"pixel_width\") + init_label(_(\"pixel_width\")) + init_description(_(\"The horizontal size in pixels of the rendered output image.\")) + init_value(320) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_pixel_height(init_owner(*this) + init_name(\"pixel_height\") + init_label(_(\"pixel_height\")) + init_description(_(\"The vertical size in pixels of the rendered output image.\")) + init_value(240) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_halt_time(init_owner(*this) + init_name(\"halt_time\") + init_label(_(\"Halt Time\")) + init_description(_(\"Maximum rendering time in seconds.\")) + init_value(30) + init_step_increment(1) + init_units(typeid(k3d::measurement::time))),\n\t\tm_halt_samples(init_owner(*this) + init_name(\"halt_samples\") + init_label(_(\"Halt Samples\")) + init_description(_(\"Maximum number of samples-per-pixel.\")) + init_value(100) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_resolution.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_resolution_changed));\n\t}\n\n\tconst k3d::inode_collection_sink::properties_t node_collection_properties()\n\t{\n\t\tk3d::inode_collection_sink::properties_t results;\n\t\tresults.push_back(&m_visible_nodes);\n\t\tresults.push_back(&m_enabled_lights);\n\n\t\treturn results;\n\t}\n\n\tvoid on_resolution_changed(k3d::iunknown*)\n\t{\n\t\tconst k3d::string_t new_resolution = m_resolution.pipeline_value();\n\n\t\tconst k3d::resolutions_t& resolutions = k3d::resolutions();\n\t\tfor(k3d::resolutions_t::const_iterator resolution = resolutions.begin(); resolution != resolutions.end(); ++resolution)\n\t\t{\n\t\t\tif(resolution->name != new_resolution)\n\t\t\t\tcontinue;\n\n\t\t\tm_pixel_width.set_value(resolution->width);\n\t\t\tm_pixel_height.set_value(resolution->height);\n\t\t\treturn;\n\t\t}\n\n\t\tassert_not_reached();\n\t}\n\n\tk3d::bool_t render_camera_preview(k3d::icamera& Camera)\n\t{\n\t\t// Start a new render job ...\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-indigo-preview\");\n\n\t\t// Add a single render frame to the job ...\n\t\tk3d::inetwork_render_frame& frame = job.create_frame(\"frame\");\n\n\t\t// Create an output image path ...\n\t\tconst k3d::filesystem::path output_image = frame.add_file(\"output.png\");\n\n\t\t// Render it ...\n\t\treturn_val_if_fail(render(Camera, frame, output_image, true), false);\n\n\t\t// View the output when it's done ...\n\t\tframe.add_view_command(output_image);\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render_camera_frame(k3d::icamera& Camera, const k3d::filesystem::path& OutputImage, const k3d::bool_t ViewImage)\n\t{\n\t\t// Sanity checks ...\n\t\treturn_val_if_fail(!OutputImage.empty(), false);\n\n\t\t// Start a new render job ...\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-indigo-render-frame\");\n\n\t\t// Add a single render frame to the job ...\n\t\tk3d::inetwork_render_frame& frame = job.create_frame(\"frame\");\n\n\t\t// Create an output image path ...\n\t\tconst k3d::filesystem::path output_image = frame.add_file(\"output.png\");\n\n\t\t// Render it ...\n\t\treturn_val_if_fail(render(Camera, frame, output_image, false), false);\n\n\t\t// Copy the output image to its requested destination ...\n\t\tframe.add_copy_command(output_image, OutputImage);\n\n\t\t// View the output image when it's done ...\n\t\tif(ViewImage)\n\t\t\tframe.add_view_command(OutputImage);\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render_camera_animation(k3d::icamera& Camera, k3d::iproperty& Time, const k3d::frames& Frames, const k3d::bool_t ViewCompletedImages)\n\t{\n\t\t// Start a new render job ...\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-indigo-render-animation\");\n\n\t\t// For each frame to be rendered ...\n\t\tk3d::uint_t frame_index = 0;\n\t\tfor(k3d::frames::const_iterator frame = Frames.begin(); frame != Frames.end(); ++frame, ++frame_index)\n\t\t{\n\t\t\t// Set the frame time ...\n\t\t\tk3d::property::set_internal_value(Time, frame->begin_time);\n\n\t\t\t// Redraw everything ...\n\t\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::SYNCHRONOUS);\n\n\t\t\t// Add a render frame to the job ...\n\t\t\tstd::stringstream buffer;\n\t\t\tbuffer << \"frame-\" << frame_index;\n\t\t\tk3d::inetwork_render_frame& render_frame = job.create_frame(buffer.str());\n\n\t\t\t// Create an output image path ...\n\t\t\tconst k3d::filesystem::path output_image = render_frame.add_file(\"output.png\");\n\n\t\t\t// Render it (hidden rendering) ...\n\t\t\treturn_val_if_fail(render(Camera, render_frame, output_image, false), false);\n\n\t\t\t// Copy the output image to its requested destination ...\n\t\t\trender_frame.add_copy_command(output_image, frame->destination);\n\n\t\t\t// View the output image when it's done ...\n\t\t\tif(ViewCompletedImages)\n\t\t\t\trender_frame.add_view_command(frame->destination);\n\t\t}\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<render_engine,\n\t\t\tk3d::interface_list<k3d::irender_camera_animation,\n\t\t\tk3d::interface_list<k3d::irender_camera_frame,\n\t\t\tk3d::interface_list<k3d::irender_camera_preview> > > > factory(\n\t\t\t\tk3d::uuid(0xd3415ff0, 0x084b272d, 0x76eba2ad, 0x813d5f1d),\n\t\t\t\t\"IndigoEngine\",\n\t\t\t\t_(\"Indigo Render Engine\"),\n\t\t\t\t\"Indigo RenderEngine\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t/// Helper class used to triangulate faces\n\tclass create_triangles :\n\t\tpublic k3d::triangulator\n\t{\n\t\ttypedef k3d::triangulator base;\n\n\tpublic:\n\t\tcreate_triangles(\n\t\t\tconst k3d::mesh::materials_t& FaceMaterials,\n\t\t\tk3d::mesh::points_t& Points,\n\t\t\tk3d::mesh::indices_t& APoints,\n\t\t\tk3d::mesh::indices_t& BPoints,\n\t\t\tk3d::mesh::indices_t& CPoints,\n\t\t\tstd::vector<indigo::material*>& TriangleMaterials,\n\t\t\tstd::set<indigo::material*>& MaterialList) :\n\t\t\tm_points(Points),\n\t\t\tm_a_points(APoints),\n\t\t\tm_b_points(BPoints),\n\t\t\tm_c_points(CPoints),\n\t\t\tm_triangle_materials(TriangleMaterials),\n\t\t\tm_material_list(MaterialList)\n\t\t{\n\t\t\tm_face_materials.resize(FaceMaterials.size());\n\t\t\tfor(k3d::uint_t i = 0; i != FaceMaterials.size(); ++i)\n\t\t\t\tm_face_materials[i] = k3d::material::lookup<indigo::material>(FaceMaterials[i]);\n\t\t}\n\n\tprivate:\n\t\tvoid start_face(const k3d::uint_t Face)\n\t\t{\n\t\t\tm_current_face = Face;\n\t\t}\n\n\t\tvoid add_vertex(const k3d::point3& Coordinates, k3d::uint_t Vertices[4], k3d::uint_t Edges[4], double Weights[4], k3d::uint_t& NewVertex)\n\t\t{\n\t\t\tNewVertex = m_points.size();\n\t\t\tm_points.push_back(Coordinates);\n\t\t}\n\n\t\tvoid add_triangle(k3d::uint_t Vertices[3], k3d::uint_t Edges[3])\n\t\t{\n\t\t\tm_a_points.push_back(Vertices[0]);\n\t\t\tm_b_points.push_back(Vertices[1]);\n\t\t\tm_c_points.push_back(Vertices[2]);\n\t\t\tm_triangle_materials.push_back(m_face_materials[m_current_face]);\n\t\t\tm_material_list.insert(m_face_materials[m_current_face]);\n\t\t}\n\n\t\tstd::vector<indigo::material*> m_face_materials;\n\t\tk3d::mesh::points_t& m_points;\n\t\tk3d::mesh::indices_t& m_a_points;\n\t\tk3d::mesh::indices_t& m_b_points;\n\t\tk3d::mesh::indices_t& m_c_points;\n\t\tstd::vector<indigo::material*>& m_triangle_materials;\n\t\tstd::set<indigo::material*>& m_material_list;\n\n\t\tk3d::uint_t m_current_face;\n\t};\n\n\tvoid render_mesh(std::map<indigo::material*, k3d::string_t>& MaterialNames, const k3d::string_t& Name, k3d::inode& MeshInstance, const k3d::mesh& Mesh, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"<mesh>\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"<name>\" << Name << \"</name>\\n\";\n\t\tStream << k3d::standard_indent << \"<normal_smoothing>false</normal_smoothing>\\n\";\n\t\tStream << k3d::standard_indent << \"<embedded>\\n\" << k3d::push_indent;\n\n\t\tstd::set<indigo::material*> material_list;\n\n\t\tk3d::mesh::points_t points(*Mesh.points);\n\t\tk3d::mesh::indices_t a_points;\n\t\tk3d::mesh::indices_t b_points;\n\t\tk3d::mesh::indices_t c_points;\n\t\tstd::vector<indigo::material*> triangle_materials;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Triangulate the mesh faces ...\n\t\t\tcreate_triangles(polyhedron->face_materials, points, a_points, b_points, c_points, triangle_materials, material_list).process(Mesh, *polyhedron);\n\t\t}\n\n\t\tconst k3d::matrix4 matrix = k3d::node_to_world_matrix(MeshInstance);\n\t\tfor(k3d::mesh::points_t::const_iterator point = points.begin(); point != points.end(); ++point)\n\t\t{\n\t\t\tconst k3d::point3 pos = matrix * (*point);\n\t\t\tStream << k3d::standard_indent << \"<vertex pos=\\\"\" << -pos[0] << \" \" << pos[1] << \" \" << pos[2] << \"\\\"/>\\n\";\n\t\t}\n\n\t\tfor(std::set<indigo::material*>::const_iterator material = material_list.begin(); material != material_list.end(); ++material)\n\t\t{\n\t\t\tif(0 == *material)\n\t\t\t{\n\t\t\t\tk3d::log() << warning << \"Geometry without an Indigo material will not be rendered.\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tStream << k3d::standard_indent << \"<triangle_set>\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"<material_name>\" << MaterialNames[*material] << \"</material_name>\\n\";\n\t\t\tconst k3d::uint_t begin = 0;\n\t\t\tconst k3d::uint_t end = begin + triangle_materials.size();\n\t\t\tfor(k3d::uint_t i = begin; i != end; ++i)\n\t\t\t{\n\t\t\t\tif(triangle_materials[i] != *material)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tStream << k3d::standard_indent << \"<tri>\" << a_points[i] << \" \" << b_points[i] << \" \" << c_points[i] << \"</tri>\\n\";\n\t\t\t}\n\t\t\tStream << k3d::pop_indent << k3d::standard_indent << \"</triangle_set>\\n\";\n\t\t}\n\n\t\tStream << k3d::pop_indent << k3d::standard_indent << \"</embedded>\\n\";\n\t\tStream << k3d::pop_indent << k3d::standard_indent << \"</mesh>\\n\";\n\n\t\tStream << k3d::standard_indent << \"<model>\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"<pos>\" << \"0 0 0\" << \"</pos>\\n\";\n\t\tStream << k3d::standard_indent << \"<scale>\" << \"1\" << \"</scale>\\n\";\n\t\tStream << k3d::standard_indent << \"<mesh_name>\" << Name << \"</mesh_name>\\n\";\n\t\tStream << k3d::pop_indent << k3d::standard_indent << \"</model>\\n\";\n\t}\n\n\tk3d::bool_t render(k3d::icamera& Camera, k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& OutputImagePath, const k3d::bool_t VisibleRender)\n\t{\n\t\ttry\n\t\t{\n\t\t\tk3d::iperspective* const projection = dynamic_cast<k3d::iperspective*>(&Camera.projection());\n\t\t\tif(!projection)\n\t\t\t\tthrow std::runtime_error(\"A perspective projection is required.\");\n\n\t\t\t// Start our indigo XML file ...\n\t\t\tconst k3d::filesystem::path scene_path = Frame.add_file(\"world.igs\");\n\t\t\tk3d::filesystem::ofstream stream(scene_path);\n\t\t\treturn_val_if_fail(stream.good(), false);\n\n\t\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\t\t//     arguments.push_back(k3d::inetwork_render_frame::argument(\"-n m\"));\n\t\t\targuments.push_back(k3d::inetwork_render_frame::argument(scene_path.native_filesystem_string()));\n\t\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"-o\"));\n\t\t\targuments.push_back(k3d::inetwork_render_frame::argument(OutputImagePath.native_filesystem_string()));\n\n\t\t\tFrame.add_exec_command(\"indigo_console\", environment, arguments);\n\n\t\t\t// Setup the scene description ...\n\t\t\tstream << k3d::xml::declaration();\n\t\t\tstream << k3d::standard_indent << \"<!-- Indigo scene generated by K-3D Version \" K3D_VERSION \", http://www.k-3d.org -->\\n\";\n\t\t\tstream << k3d::standard_indent << \"<scene>\\n\" << k3d::push_indent;\n\n\t\t\t// Set renderer options ...\n\t\t\tconst k3d::int32_t pixel_width = m_pixel_width.pipeline_value();\n\t\t\tconst k3d::int32_t pixel_height = m_pixel_height.pipeline_value();\n\t\t\tstream << k3d::standard_indent << \"<renderer_settings>\\n\" << k3d::push_indent;\n\t\t\tstream << k3d::standard_indent << \"<width>\" << pixel_width << \"</width>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<height>\" << pixel_height << \"</height>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<halt_time>\" << m_halt_time.pipeline_value() << \"</halt_time>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<halt_samples_per_pixel>\" << m_halt_samples.pipeline_value() << \"</halt_samples_per_pixel>\\n\";\n\t\t\tstream << k3d::pop_indent << k3d::standard_indent << \"</renderer_settings>\\n\";\n\n\t\t\t// Setup the camera ...\n\t\t\tconst k3d::matrix4 camera_matrix = k3d::property::pipeline_value<k3d::matrix4>(Camera.transformation().matrix_source_output());\n\t\t\tconst k3d::point3 camera_pos = k3d::position(camera_matrix);\n\t\t\tconst k3d::vector3 camera_up = camera_matrix * k3d::vector3(0, 1, 0);\n\t\t\tconst k3d::vector3 camera_forwards = camera_matrix * k3d::vector3(0, 0, 1);\n\n\t\t\tconst k3d::double_t camera_near = k3d::property::pipeline_value<k3d::double_t>(projection->near());\n\t\t\tconst k3d::double_t camera_width = std::abs(k3d::property::pipeline_value<k3d::double_t>(projection->left()) - k3d::property::pipeline_value<k3d::double_t>(projection->right()));\n\n\t\t\tstream << k3d::standard_indent << \"<camera>\\n\" << k3d::push_indent;\n\t\t\tstream << k3d::standard_indent << \"<pos>\" << -camera_pos[0] << \" \" << camera_pos[1] << \" \" << camera_pos[2] << \"</pos>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<up>\" << -camera_up[0] << \" \" << camera_up[1] << \" \" << camera_up[2] << \"</up>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<forwards>\" << -camera_forwards[0] << \" \" << camera_forwards[1] << \" \" << camera_forwards[2] << \"</forwards>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<aperture_radius>\" << \"0.001\" << \"</aperture_radius>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<focus_distance>\" << \"3.0\" << \"</focus_distance>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<aspect_ratio>\" << static_cast<k3d::double_t>(pixel_width) / static_cast<k3d::double_t>(pixel_height) << \"</aspect_ratio>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<sensor_width>\" << camera_width << \"</sensor_width>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<lens_sensor_dist>\" << camera_near << \"</lens_sensor_dist>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<white_balance>\" << \"D65\" << \"</white_balance>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<autofocus/>\\n\";\n\t\t\tstream << k3d::pop_indent << k3d::standard_indent << \"</camera>\\n\";\n\n\t\t\t// Setup tonemapping ...\n\t\t\tstream << k3d::standard_indent << \"<tonemapping>\\n\" << k3d::push_indent;\n\t\t\t//      stream << \"<linear>\\n\";\n\t\t\t//     stream << \"<scale>\" << \"1.0\" << \"</scale>\\n\";\n\t\t\t//      stream << \"</linear>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<reinhard>\\n\" << k3d::push_indent;\n\t\t\tstream << k3d::standard_indent << \"<pre_scale>\" << \"6.0\" << \"</pre_scale>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<post_scale>\" << \"1.0\" << \"</post_scale>\\n\";\n\t\t\tstream << k3d::standard_indent << \"<burn>\" << \"6.0\" << \"</burn>\\n\";\n\t\t\tstream << k3d::pop_indent << k3d::standard_indent << \"</reinhard>\\n\";\n\t\t\tstream << k3d::pop_indent << k3d::standard_indent << \"</tonemapping>\\n\";\n\n\t\t\t// Setup lights ...\n\t\t\tconst k3d::inode_collection_property::nodes_t enabled_lights = m_enabled_lights.pipeline_value();\n\t\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = enabled_lights.begin(); node != enabled_lights.end(); ++node)\n\t\t\t{\n\t\t\t\tif(indigo::light* const light = dynamic_cast<indigo::light*>(*node))\n\t\t\t\t{\n\t\t\t\t\tlight->setup(stream);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Setup materials, assigning unique names as-we-go ...\n\t\t\tstd::map<indigo::material*, k3d::string_t> material_names;\n\t\t\tconst std::vector<indigo::material*> materials = k3d::node::lookup<indigo::material>(document());\n\t\t\tfor(k3d::uint_t i = 0; i != materials.size(); ++i)\n\t\t\t{\n\t\t\t\tconst k3d::string_t material_name = \"material_\" + k3d::string_cast(material_names.size());\n\t\t\t\tmaterial_names.insert(std::make_pair(materials[i], material_name));\n\t\t\t\tmaterials[i]->setup(material_name, stream);\n\t\t\t}\n\n\t\t\t// Render geometry ...\n\t\t\tk3d::uint_t mesh_index = 0;\n\t\t\tconst k3d::inode_collection_property::nodes_t visible_nodes = m_visible_nodes.pipeline_value();\n\t\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = visible_nodes.begin(); node != visible_nodes.end(); ++node)\n\t\t\t{\n\t\t\t\tif((*node)->factory().factory_id() != k3d::classes::MeshInstance())\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst k3d::mesh* const mesh = k3d::property::pipeline_value<k3d::mesh*>(**node, \"output_mesh\");\n\t\t\t\tif(!mesh)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst k3d::string_t mesh_name = \"mesh_\" + k3d::string_cast(mesh_index++);\n\n\t\t\t\trender_mesh(material_names, mesh_name, **node, *mesh, stream);\n\t\t\t}\n\n\t\t\t// Finish the scene ...\n\t\t\tstream << k3d::pop_indent << k3d::standard_indent << \"</scene>\\n\";\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << \"exception: \" << e.what() << std::endl;\n\t\t\treturn false;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << \"unknown exception\" << std::endl;\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/// Helper class that limits the list of visible nodes to those that we can render\n\ttemplate<typename value_t, class name_policy_t>\n\tclass indigo_visible_nodes_property :\n\t\tpublic k3d::data::writable_property<value_t, name_policy_t>,\n\t\tpublic k3d::inode_collection_property\n\t{\n\t\ttypedef k3d::data::writable_property<value_t, name_policy_t> base;\n\n\tpublic:\n\t\tk3d::bool_t property_allow(k3d::inode& Node)\n\t\t{\n\t\t\treturn Node.factory().factory_id() == k3d::classes::MeshInstance();\n\t\t}\n\n\tprotected:\n\t\ttemplate<typename init_t>\n\t\tindigo_visible_nodes_property(const init_t& Init) :\n\t\t\tbase(Init)\n\t\t{\n\t\t}\n\t};\n\n\t/// Helper class that limits the list of enabled lights\n\ttemplate<typename value_t, class name_policy_t>\n\tclass indigo_enabled_lights_property :\n\t\tpublic k3d::data::writable_property<value_t, name_policy_t>,\n\t\tpublic k3d::inode_collection_property\n\t{\n\t\ttypedef k3d::data::writable_property<value_t, name_policy_t> base;\n\n\tpublic:\n\t\tk3d::bool_t property_allow(k3d::inode& Node)\n\t\t{\n\t\t\treturn dynamic_cast<indigo::light*>(&Node) ? true : false;\n\t\t}\n\n\tprotected:\n\t\ttemplate<typename init_t>\n\t\tindigo_enabled_lights_property(const init_t& Init) :\n\t\t\tbase(Init)\n\t\t{\n\t\t}\n\t};\n\n// define properties\n\tk3d_data(k3d::inode_collection_property::nodes_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, indigo_visible_nodes_property, node_collection_serialization) m_visible_nodes;\n\tk3d_data(k3d::inode_collection_property::nodes_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, indigo_enabled_lights_property, node_collection_serialization) m_enabled_lights;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_resolution;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_width;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_height;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_halt_time;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_halt_samples;\n};\n\nk3d::iplugin_factory& render_engine_factory()\n{\n\treturn render_engine::get_factory();\n}\n\n} // namespace indigo\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/indigo/skylight.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/vector3.h>\n\nnamespace module\n{\n\nnamespace indigo\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// skylight\n\nclass skylight :\n\tpublic k3d::node,\n\tpublic indigo::light\n{\n\ttypedef k3d::node base;\n\npublic:\n\tskylight(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_direction(init_owner(*this) + init_name(\"direction\") + init_label(_(\"Direction\")) + init_description(_(\"Vector pointing to the sun.\")) + init_value(k3d::vector3(0, 0, 1))),\n\t\tm_turbidity(init_owner(*this) + init_name(\"turbidity\") + init_label(_(\"Turbidity\")) + init_description(_(\"Controls sky clarity / haziness.\")) + init_value(2.0)),\n\t\tm_extra_atmospheric(init_owner(*this) + init_name(\"extra_atmospheric\") + init_label(_(\"Extra-Atmospheric\")) + init_description(_(\"Computes skylight without atmospheric scattering.\")) + init_value(false))\n\t{\n\t}\n\n  void setup(std::ostream& Stream)\n  {\n    const k3d::vector3 sundir = m_direction.pipeline_value();\n\n    Stream << k3d::standard_indent << \"<skylight>\\n\" << k3d::push_indent;\n    Stream << k3d::standard_indent << \"<sundir>\" << -sundir[0] << \" \" << sundir[1] << \" \" << sundir[2] << \"</sundir>\\n\";\n    Stream << k3d::standard_indent << \"<turbidity>\" << m_turbidity.pipeline_value() << \"</turbidity>\\n\";\n    Stream << k3d::standard_indent << \"<extra_atmospheric>\" << (m_extra_atmospheric.pipeline_value() ? \"true\" : \"false\") << \"</extra_atmospheric>\\n\";\n    Stream << k3d::pop_indent << k3d::standard_indent << \"</skylight>\\n\";\n  }\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<skylight> factory(\n\t\t\tk3d::uuid(0xc3a70c62, 0xa7425db2, 0x08a93ba7, 0x788d3e9b),\n\t\t\t\"IndigoSkylight\",\n\t\t\t_(\"Indigo Skylight\"),\n\t\t\t\"Indigo Light\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_direction;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_turbidity;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_extra_atmospheric;\n};\n\nk3d::iplugin_factory& skylight_factory()\n{\n\treturn skylight::get_factory();\n}\n\n} // namespace indigo\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/indigo/spectrum.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n  \\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"spectrum.h\"\n\n#include <k3dsdk/iomanip.h>\n\nnamespace module\n{\n\nnamespace indigo\n{\n\nstd::ostream& operator<<(std::ostream& Stream, const spectrum::type& Value)\n{\n  switch(Value)\n  {\n    case spectrum::BLACKBODY:\n      Stream << \"blackbody\";\n      break;\n    case spectrum::RGB:\n      Stream << \"rgb\";\n      break;\n  }\n  return Stream;\n}\n\nstd::istream& operator>>(std::istream& Stream, spectrum::type& Value)\n{\n  std::string text;\n  Stream >> text;\n\n  if(text == \"blackbody\")\n    Value = spectrum::BLACKBODY;\n  else if(text == \"rgb\")\n    Value = spectrum::RGB;\n  else\n    k3d::log() << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n  return Stream;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// spectrum\n\nvoid spectrum::setup(const k3d::string_t& ElementName, std::ostream& Stream)\n{\n  Stream << k3d::standard_indent << \"<\" << ElementName << \">\\n\" << k3d::push_indent;\n\n  switch(m_type.pipeline_value())\n  {\n  case BLACKBODY:\n    Stream << k3d::standard_indent << \"<blackbody>\\n\" << k3d::push_indent;\n    Stream << k3d::standard_indent << \"<temperature>\" << m_blackbody_temperature.pipeline_value() << \"</temperature>\\n\";\n    Stream << k3d::standard_indent << \"<gain>\" << m_blackbody_gain.pipeline_value() << \"</gain>\\n\";\n    Stream << k3d::pop_indent << k3d::standard_indent << \"</blackbody>\\n\";\n    break;\n  case RGB:\n    Stream << k3d::standard_indent << \"<rgb>\\n\" << k3d::push_indent;\n    Stream << k3d::standard_indent << \"<rgb>\" << m_red.pipeline_value() << \" \" << m_green.pipeline_value() << \" \" << m_blue.pipeline_value() << \"</rgb>\\n\";\n    Stream << k3d::standard_indent << \"<gamma>\" << m_gamma.pipeline_value() << \"</gamma>\\n\";\n    Stream << k3d::pop_indent << k3d::standard_indent << \"</rgb>\\n\";\n    break;\n  }\n  \n  Stream << k3d::pop_indent << k3d::standard_indent << \"</\" << ElementName << \">\\n\";\n}\n\nconst k3d::ienumeration_property::enumeration_values_t& spectrum::type_values()\n{\n  static k3d::ienumeration_property::enumeration_values_t values;\n  if(values.empty())\n  {\n    values.push_back(k3d::ienumeration_property::enumeration_value_t(\"Blackbody\", \"blackbody\", \"Generate a blackbody spectrum.\"));\n    values.push_back(k3d::ienumeration_property::enumeration_value_t(\"RGB\", \"rgb\", \"Generate an RGB spectrum.\"));\n  }\n\n  return values;\n}\n\n} // namespace indigo\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/indigo/spectrum.h",
    "content": "#ifndef MODULES_INDIGO_SPECTRUM_H\n#define MODULES_INDIGO_SPECTRUM_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n  \\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n\nnamespace module\n{\n\nnamespace indigo\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// spectrum\n\n/// Provides property storage and rendering for an Indigo \"spectrum\" tag\nclass spectrum\n{\npublic:\n  template<typename OwnerT>\n  spectrum(OwnerT* Owner) : \n\t\tm_type(init_owner(*Owner) + init_name(\"type\") + init_label(_(\"Spectrum Type\")) + init_description(_(\"Spectrum type.\")) + init_value(RGB) + init_enumeration(type_values())),\n    m_blackbody_temperature(init_owner(*Owner) + init_name(\"blackbody_temperature\") + init_label(_(\"Blackbody Temperature\")) + init_description(_(\"Blackbody Temperature of the light source in degrees kelvin.\")) + init_value(6500)), \n    m_blackbody_gain(init_owner(*Owner) + init_name(\"blackbody_gain\") + init_label(_(\"Blackbody Gain\")) + init_description(_(\"Blackbody Temperature Gain, multiplier.\")) + init_value(1.0)),\n    m_red(init_owner(*Owner) + init_name(\"red\") + init_label(_(\"Red\")) + init_description(_(\"Red\")) + init_value(1.0) + init_constraint(k3d::data::constraint::minimum<k3d::double_t>(0.0))),\n    m_green(init_owner(*Owner) + init_name(\"green\") + init_label(_(\"Green\")) + init_description(_(\"Green\")) + init_value(1.0) + init_constraint(k3d::data::constraint::minimum<k3d::double_t>(0.0))),\n    m_blue(init_owner(*Owner) + init_name(\"blue\") + init_label(_(\"Blue\")) + init_description(_(\"Blue\")) + init_value(1.0) + init_constraint(k3d::data::constraint::minimum<k3d::double_t>(0.0))),\n    m_gamma(init_owner(*Owner) + init_name(\"gamma\") + init_label(_(\"Gamma\")) + init_description(_(\"Gamma\")) + init_value(2.2))\n  {\n  }\n\n  void setup(const k3d::string_t& ElementName, std::ostream& Stream);\n\nprivate:\n\tenum type\n\t{\n\t\tBLACKBODY,\n\t\tRGB,\n\t};\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const type& Value);\n\tfriend std::istream& operator >> (std::istream& Stream, type& Value);\n\tstatic const k3d::ienumeration_property::enumeration_values_t& type_values();\n\n\tk3d_data(type, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_type;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_blackbody_temperature;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_blackbody_gain;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_red;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_green;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_blue;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_gamma;\n};\n\n} // namespace indigo\n\n} // namespace module\n\n#endif // !MODULES_INDIGO_SPECTRUM_H\n\n"
  },
  {
    "path": "modules/inotify/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_INOTIFY_INCLUDE_DIR})\nK3D_BUILD_MODULE(k3d-inotify)\nK3D_CREATE_MODULE_PROXY(k3d-inotify)\n\n"
  },
  {
    "path": "modules/inotify/file_change_notifier.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"inotify-cxx.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/ifile_change_notifier.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n\n#include <boost/scoped_ptr.hpp>\n#include <boost/shared_ptr.hpp>\n\n#include <stdexcept>\n\nnamespace module\n{\n\nnamespace inotify\n{\n\nclass file_change_notifier :\n\tpublic k3d::ifile_change_notifier\n{\npublic:\n\tfile_change_notifier()\n\t{\n\t\ttry\n\t\t{\n\t\t\tinotify.reset(new Inotify());\n\t\t\tinotify->SetNonBlock(true);\n\t\t}\n\t\tcatch(InotifyException& e)\n\t\t{\n\t\t\tinotify.reset();\n\t\t\tk3d::log() << error << e.GetMessage() << \" - Inotify-based change notification disabled.\" << std::endl;\n\t\t}\n\t}\n\t\n\tk3d::uint_t watch_file(const k3d::filesystem::path& Path, const sigc::slot<void>& Slot)\n\t{\n\t\ttry\n\t\t{\n\t\t\tif(!inotify)\n\t\t\t\tthrow std::runtime_error(\"Inotify-based change notification disabled.\");\n\n\t\t\tif(Path.empty())\n\t\t\t\tthrow std::runtime_error(\"Cannot watch empty path.\");\n\n\t\t\tboost::shared_ptr<InotifyWatch> watch;\n\t\t\tif(paths.count(Path))\n\t\t\t{\n\t\t\t\twatch = paths[Path];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twatch.reset(new InotifyWatch(Path.native_filesystem_string(), IN_CLOSE_WRITE));\n\t\t\t\tinotify->Add(*watch);\n\t\t\t\tpaths[Path] = watch;\n\t\t\t}\n\n\t\t\tfor(k3d::uint_t i = 0; i != watches.size(); ++i)\n\t\t\t{\n\t\t\t\tif(!watches[i])\n\t\t\t\t{\n\t\t\t\t\twatches[i] = watch.get();\n\t\t\t\t\tslots[i] = Slot;\n\t\t\t\t\treturn i + 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twatches.push_back(watch.get());\n\t\t\tslots.push_back(Slot);\n\t\t\treturn watches.size();\n\t\t}\n\t\tcatch(InotifyException& e)\n\t\t{\n\t\t\tk3d::log() << error << e.GetMessage() << \" code: \" << e.GetErrorNumber() << std::endl;\n\t\t\treturn 0;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\treturn 0;\n\t\t}\n\t}\n\t\n\tvoid unwatch_file(const k3d::uint_t WatchID)\n\t{\n\t\tif(!inotify)\n\t\t\treturn;\n\n\t\tif(WatchID == 0)\n\t\t\treturn;\n\n\t\ttry\n\t\t{\n\t\t\tconst k3d::uint_t watch_index = WatchID - 1;\n\n\t\t\tif(watch_index >= watches.size())\n\t\t\t\tthrow std::runtime_error(\"Watch ID out-of-range.\");\n\n\t\t\tif(!watches[watch_index])\n\t\t\t\tthrow std::runtime_error(\"Invalid Watch ID.\");\n\n\t\t\tInotifyWatch* const watch = watches[watch_index];\n\t\t\twatches[watch_index] = 0;\n\t\t\tslots[watch_index] = sigc::slot<void>();\n\n\t\t\tif(0 == std::count(watches.begin(), watches.end(), watch))\n\t\t\t{\n\t\t\t\tfor(paths_t::iterator path = paths.begin(); path != paths.end(); ++path)\n\t\t\t\t{\n\t\t\t\t\tif(path->second.get() == watch)\n\t\t\t\t\t{\t\n\t\t\t\t\t\tinotify->Remove(*watch);\n\t\t\t\t\t\tpaths.erase(path);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\tcatch(InotifyException& e)\n\t\t{\n\t\t\tk3d::log() << error << e.GetMessage() << \" code: \" << e.GetErrorNumber() << std::endl;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t}\n\t}\n\n\tvoid wait_for_changes()\n\t{\n\t\tif(!inotify)\n\t\t\treturn;\n\t\t\n\t\t// In the blocking case, we check for events in a manner that does not require holding a lock on the inotify object\n\t\tinotify->SetNonBlock(false);\n\t\tfd_set read_descriptors;\n\t\tFD_ZERO(&read_descriptors);\n\t\tFD_SET(inotify->GetDescriptor(), &read_descriptors);\n\t\tselect(inotify->GetDescriptor() + 1, &read_descriptors, NULL, NULL, NULL);\n\t}\n\t\n\tconst k3d::uint_t change_count()\n\t{\n\t\tif(!inotify)\n\t\t\treturn 0;\n\t\t\n\t\tinotify->SetNonBlock(true);\n\t\tinotify->WaitForEvents();\n\t\treturn inotify->GetEventCount();\n\t}\n\t\n\tvoid signal_change()\n\t{\n\t\tif(!inotify)\n\t\t\treturn;\n\n\t\tif(!inotify->GetEventCount())\n\t\t\treturn;\n\t\t\n\t\tInotifyEvent event;\n\t\tif(!inotify->GetEvent(&event))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tInotifyWatch* watch = event.GetWatch();\n\t\tfor(k3d::uint_t i = 0; i != watches.size(); ++i)\n\t\t{\n\t\t\tif(watches[i] == watch)\n\t\t\t\tslots[i]();\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<file_change_notifier,\n\t\t\tk3d::interface_list<k3d::ifile_change_notifier> > factory(\n\t\t\t\tk3d::uuid(0x37e5155b, 0xed45e9aa, 0xd1f0ed88, 0xb582ea76),\n\t\t\t\t\"InotifyFileChangeNotifier\",\n\t\t\t\t_(\"Monitors files for changes, using the Linux inotify system\"),\n\t\t\t\t\"Desktop\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\t\nprivate:\n\tboost::scoped_ptr<Inotify> inotify;\n\n\ttypedef std::map<k3d::filesystem::path, boost::shared_ptr<InotifyWatch> > paths_t;\n\tpaths_t paths;\n\n\tstd::vector<InotifyWatch*> watches;\n\tstd::vector<sigc::slot<void> > slots;\n};\n\n\n/////////////////////////////////////////////////////////////////////////////\n// file_change_notifier_factory\n\nk3d::iplugin_factory& file_change_notifier_factory()\n{\n\treturn file_change_notifier::get_factory();\n}\n\n} // namespace inotify\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/inotify/inotify-cxx.cpp",
    "content": "\n/// inotify C++ interface implementation\n/**\n * \\file inotify-cxx.cpp\n * \n * inotify C++ interface\n * \n * Copyright (C) 2006, 2007 Lukas Jelinek <lukas@aiken.cz>\n * \n * This program is free software; you can redistribute it and/or\n * modify it under the terms of one of the following licenses:\n *\n * \\li 1. X11-style license (see LICENSE-X11)\n * \\li 2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL)\n * \\li 3. GNU General Public License, version 2  (see LICENSE-GPL)\n *\n * If you want to help with choosing the best license for you,\n * please visit http://www.gnu.org/licenses/license-list.html.\n * \n */\n \n\n#include <errno.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <cstdio>\n\n#include \"inotify-cxx.h\"\n\n/// procfs inotify base path\n#define PROCFS_INOTIFY_BASE \"/proc/sys/fs/inotify/\"\n\n/// dump separator (between particular entries)\n#define DUMP_SEP \\\n  ({ \\\n    if (!rStr.empty()) { \\\n      rStr.append(\",\"); \\\n    } \\\n  })\n\n\n\nint32_t InotifyEvent::GetDescriptor() const\n{\n  return  m_pWatch != NULL            // if watch exists\n      ?   m_pWatch->GetDescriptor()   // return its descriptor\n      :   -1;                         // else return -1\n}\n\nuint32_t InotifyEvent::GetMaskByName(const std::string& rName)\n{\n  if (rName == \"IN_ACCESS\")\n    return IN_ACCESS;\n  else if (rName == \"IN_MODIFY\")\n    return IN_MODIFY;\n  else if (rName == \"IN_ATTRIB\")\n    return IN_ATTRIB;\n  else if (rName == \"IN_CLOSE_WRITE\")\n    return IN_CLOSE_WRITE;\n  else if (rName == \"IN_CLOSE_NOWRITE\")\n    return IN_CLOSE_NOWRITE;\n  else if (rName == \"IN_OPEN\")\n    return IN_OPEN;\n  else if (rName == \"IN_MOVED_FROM\")\n    return IN_MOVED_FROM;\n  else if (rName == \"IN_MOVED_TO\")\n    return IN_MOVED_TO;\n  else if (rName == \"IN_CREATE\")\n    return IN_CREATE;\n  else if (rName == \"IN_DELETE\")\n    return IN_DELETE;\n  else if (rName == \"IN_DELETE_SELF\")\n    return IN_DELETE_SELF;\n  else if (rName == \"IN_UNMOUNT\")\n    return IN_UNMOUNT;\n  else if (rName == \"IN_Q_OVERFLOW\")\n    return IN_Q_OVERFLOW;\n  else if (rName == \"IN_IGNORED\")\n    return IN_IGNORED;\n  else if (rName == \"IN_CLOSE\")\n    return IN_CLOSE;\n  else if (rName == \"IN_MOVE\")\n    return IN_MOVE;\n  else if (rName == \"IN_ISDIR\")\n    return IN_ISDIR;\n  else if (rName == \"IN_ONESHOT\")\n    return IN_ONESHOT;\n  else if (rName == \"IN_ALL_EVENTS\")\n    return IN_ALL_EVENTS;\n    \n#ifdef IN_DONT_FOLLOW\n  else if (rName == \"IN_DONT_FOLLOW\")\n    return IN_DONT_FOLLOW;\n#endif // IN_DONT_FOLLOW\n\n#ifdef IN_ONLYDIR\n  else if (rName == \"IN_ONLYDIR\")\n    return IN_ONLYDIR;\n#endif // IN_ONLYDIR\n\n#ifdef IN_MOVE_SELF\n  else if (rName == \"IN_MOVE_SELF\")\n    return IN_MOVE_SELF;\n#endif // IN_MOVE_SELF\n    \n  return (uint32_t) 0;\n}\n\nvoid InotifyEvent::DumpTypes(uint32_t uValue, std::string& rStr)\n{\n  rStr = \"\";\n  \n  if (IsType(uValue, IN_ALL_EVENTS)) {\n    rStr.append(\"IN_ALL_EVENTS\");\n  }\n  else {\n    if (IsType(uValue, IN_ACCESS)) {\n      DUMP_SEP;\n      rStr.append(\"IN_ACCESS\");    \n    }\n    if (IsType(uValue, IN_MODIFY)) {\n      DUMP_SEP;\n      rStr.append(\"IN_MODIFY\");\n    }\n    if (IsType(uValue, IN_ATTRIB)) {\n      DUMP_SEP;\n      rStr.append(\"IN_ATTRIB\");\n    }\n    if (IsType(uValue, IN_CREATE)) {\n      DUMP_SEP;\n      rStr.append(\"IN_CREATE\");\n    }\n    if (IsType(uValue, IN_DELETE)) {\n      DUMP_SEP;\n      rStr.append(\"IN_DELETE\");\n    }\n    if (IsType(uValue, IN_DELETE_SELF)) {\n      DUMP_SEP;\n      rStr.append(\"IN_DELETE_SELF\");\n    }\n    if (IsType(uValue, IN_OPEN)) {\n      DUMP_SEP;\n      rStr.append(\"IN_OPEN\");\n    }\n    if (IsType(uValue, IN_CLOSE)) {\n      DUMP_SEP;\n      rStr.append(\"IN_CLOSE\");\n    }\n\n#ifdef IN_MOVE_SELF\n    if (IsType(uValue, IN_MOVE_SELF)) {\n      DUMP_SEP;\n      rStr.append(\"IN_MOVE_SELF\");    \n    }\n#endif // IN_MOVE_SELF\n    \n    else {\n      if (IsType(uValue, IN_CLOSE_WRITE)) {\n        DUMP_SEP;\n        rStr.append(\"IN_CLOSE_WRITE\");\n      }\n      if (IsType(uValue, IN_CLOSE_NOWRITE)) {\n        DUMP_SEP;\n        rStr.append(\"IN_CLOSE_NOWRITE\");\n      }\n    }\n    if (IsType(uValue, IN_MOVE)) {\n      DUMP_SEP;\n      rStr.append(\"IN_MOVE\");\n    }\n    else {\n      if (IsType(uValue, IN_MOVED_FROM)) {\n        DUMP_SEP;\n        rStr.append(\"IN_MOVED_FROM\");\n      }\n      if (IsType(uValue, IN_MOVED_TO)) {\n        DUMP_SEP;\n        rStr.append(\"IN_MOVED_TO\");\n      }\n    }\n  }\n  if (IsType(uValue, IN_UNMOUNT)) {\n    DUMP_SEP;\n    rStr.append(\"IN_UNMOUNT\");\n  }\n  if (IsType(uValue, IN_Q_OVERFLOW)) {\n    DUMP_SEP;\n    rStr.append(\"IN_Q_OVERFLOW\");\n  }\n  if (IsType(uValue, IN_IGNORED)) {\n    DUMP_SEP;\n    rStr.append(\"IN_IGNORED\");\n  }\n  if (IsType(uValue, IN_ISDIR)) {\n    DUMP_SEP;\n    rStr.append(\"IN_ISDIR\");\n  }\n  if (IsType(uValue, IN_ONESHOT)) {\n    DUMP_SEP;\n    rStr.append(\"IN_ONESHOT\");\n  }\n  \n#ifdef IN_DONT_FOLLOW\n  if (IsType(uValue, IN_DONT_FOLLOW)) {\n    DUMP_SEP;\n    rStr.append(\"IN_DONT_FOLLOW\");\n  }\n#endif // IN_DONT_FOLLOW\n  \n#ifdef IN_ONLYDIR\n  if (IsType(uValue, IN_ONLYDIR)) {\n    DUMP_SEP;\n    rStr.append(\"IN_ONLYDIR\");\n  }\n#endif // IN_ONLYDIR\n}\n\nvoid InotifyEvent::DumpTypes(std::string& rStr) const\n{\n  DumpTypes(m_uMask, rStr);\n}\n\n\nvoid InotifyWatch::SetMask(uint32_t uMask) throw (InotifyException)\n{\n  IN_WRITE_BEGIN\n  \n  if (m_wd != -1) {\n    int wd = inotify_add_watch(m_pInotify->GetDescriptor(), m_path.c_str(), uMask);\n    if (wd != m_wd) {\n      IN_WRITE_END_NOTHROW\n      throw InotifyException(IN_EXC_MSG(\"changing mask failed\"), wd == -1 ? errno : EINVAL, this); \n    }\n  }\n  \n  m_uMask = uMask;\n  \n  IN_WRITE_END\n}\n\nvoid InotifyWatch::SetEnabled(bool fEnabled) throw (InotifyException)\n{\n  IN_WRITE_BEGIN\n  \n  if (fEnabled == m_fEnabled) {\n    IN_WRITE_END_NOTHROW\n    return;\n  }\n  \n  if (m_pInotify != NULL) {\n    if (fEnabled) {\n      m_wd = inotify_add_watch(m_pInotify->GetDescriptor(), m_path.c_str(), m_uMask);\n      if (m_wd == -1) {\n        IN_WRITE_END_NOTHROW\n        throw InotifyException(IN_EXC_MSG(\"enabling watch failed\"), errno, this);\n      }\n      m_pInotify->m_watches.insert(IN_WATCH_MAP::value_type(m_wd, this));\n    }\n    else {\n      if (inotify_rm_watch(m_pInotify->GetDescriptor(), m_wd) != 0) {\n        IN_WRITE_END_NOTHROW\n        throw InotifyException(IN_EXC_MSG(\"disabling watch failed\"), errno, this);\n      }\n      m_pInotify->m_watches.erase(m_wd);\n      m_wd = -1;\n    }\n  }\n  \n  m_fEnabled = fEnabled;\n  \n  IN_WRITE_END\n}\n\nvoid InotifyWatch::__Disable()\n{\n  IN_WRITE_BEGIN\n  \n  if (!m_fEnabled) {\n    IN_WRITE_END_NOTHROW\n    throw InotifyException(IN_EXC_MSG(\"event cannot occur on disabled watch\"), EINVAL, this);\n  }\n  \n  if (m_pInotify != NULL) {\n    m_pInotify->m_watches.erase(m_wd);\n    m_wd = -1;\n  }\n  \n  m_fEnabled = false;\n  \n  IN_WRITE_END\n}\n\n\nInotify::Inotify() throw (InotifyException)\n{\n  IN_LOCK_INIT\n  \n  m_fd = inotify_init();\n  if (m_fd == -1) {\n    IN_LOCK_DONE\n    throw InotifyException(IN_EXC_MSG(\"inotify init failed\"), errno, NULL);\n  }\n}\n  \nInotify::~Inotify()\n{\n  Close();\n  \n  IN_LOCK_DONE\n}\n\nvoid Inotify::Close()\n{\n  IN_WRITE_BEGIN\n  \n  if (m_fd != -1) {\n    RemoveAll();\n    close(m_fd);\n    m_fd = -1;\n  }\n  \n  IN_WRITE_END\n}\n\nvoid Inotify::Add(InotifyWatch* pWatch) throw (InotifyException)\n{\n  IN_WRITE_BEGIN\n  \n  // invalid descriptor - this case shouldn't occur - go away\n  if (m_fd == -1) {\n    IN_WRITE_END_NOTHROW\n    throw InotifyException(IN_EXC_MSG(\"invalid file descriptor\"), EBUSY, this);\n  }\n\n  // this path already watched - go away  \n  if (FindWatch(pWatch->GetPath()) != NULL) {\n    IN_WRITE_END_NOTHROW\n    throw InotifyException(IN_EXC_MSG(\"path already watched\"), EBUSY, this);\n  }\n  \n  // for enabled watch\n  if (pWatch->IsEnabled()) {\n    \n    // try to add watch to kernel\n    int wd = inotify_add_watch(m_fd, pWatch->GetPath().c_str(), pWatch->GetMask());\n    \n    // adding failed - go away\n    if (wd == -1) {\n      IN_WRITE_END_NOTHROW\n      throw InotifyException(IN_EXC_MSG(\"adding watch failed\"), errno, this);\n    }\n    \n    // this path already watched (but defined another way)\n    InotifyWatch* pW = FindWatch(wd);\n    if (pW != NULL) {\n      \n      // try to recover old watch because it may be modified - then go away\n      if (inotify_add_watch(m_fd, pW->GetPath().c_str(), pW->GetMask()) < 0) {\n        IN_WRITE_END_NOTHROW\n        throw InotifyException(IN_EXC_MSG(\"watch collision detected and recovery failed\"), errno, this);\n      }\n      else {\n        // recovery failed - go away\n        IN_WRITE_END_NOTHROW\n        throw InotifyException(IN_EXC_MSG(\"path already watched (but defined another way)\"), EBUSY, this);\n      }\n    }\n    \n    pWatch->m_wd = wd;\n    m_watches.insert(IN_WATCH_MAP::value_type(pWatch->m_wd, pWatch));\n  }\n  \n  m_paths.insert(IN_WP_MAP::value_type(pWatch->m_path, pWatch));\n  pWatch->m_pInotify = this;\n  \n  IN_WRITE_END\n}\n\nvoid Inotify::Remove(InotifyWatch* pWatch) throw (InotifyException)\n{\n  IN_WRITE_BEGIN\n  \n  // invalid descriptor - this case shouldn't occur - go away\n  if (m_fd == -1) {\n    IN_WRITE_END_NOTHROW\n    throw InotifyException(IN_EXC_MSG(\"invalid file descriptor\"), EBUSY, this);\n  }\n  \n  // for enabled watch\n  if (pWatch->m_wd != -1) {  \n    \n    // removing watch failed - go away\n    if (inotify_rm_watch(m_fd, pWatch->m_wd) == -1) {\n      IN_WRITE_END_NOTHROW\n      throw InotifyException(IN_EXC_MSG(\"removing watch failed\"), errno, this);\n    }\n    m_watches.erase(pWatch->m_wd);\n    pWatch->m_wd = -1;\n  }\n\n  m_paths.erase(pWatch->m_path);\n  pWatch->m_pInotify = NULL;\n  \n  IN_WRITE_END\n}\n\nvoid Inotify::RemoveAll()\n{\n  IN_WRITE_BEGIN\n  \n  IN_WP_MAP::iterator it = m_paths.begin();\n  while (it != m_paths.end()) {\n    InotifyWatch* pW = (*it).second;\n    if (pW->m_wd != -1) {\n      inotify_rm_watch(m_fd, pW->m_wd);\n      pW->m_wd = -1;\n    }\n    pW->m_pInotify = NULL;\n    ++it;\n  }\n  \n  m_watches.clear();\n  m_paths.clear();\n  \n  IN_WRITE_END\n}\n\nvoid Inotify::WaitForEvents(bool fNoIntr) throw (InotifyException)\n{\n  ssize_t len = 0;\n  \n  do {\n    len = read(m_fd, m_buf, INOTIFY_BUFLEN);\n  } while (fNoIntr && len == -1 && errno == EINTR);\n  \n  if (len == -1 && !(errno == EWOULDBLOCK || errno == EINTR))\n    throw InotifyException(IN_EXC_MSG(\"reading events failed\"), errno, this);\n  \n  if (len == -1)\n    return;\n  \n  IN_WRITE_BEGIN\n  \n  ssize_t i = 0;\n  while (i < len) {\n    struct inotify_event* pEvt = (struct inotify_event*) &m_buf[i];\n    InotifyWatch* pW = FindWatch(pEvt->wd);\n    if (pW != NULL) {\n      InotifyEvent evt(pEvt, pW);\n      if (    InotifyEvent::IsType(pW->GetMask(), IN_ONESHOT)\n          ||  InotifyEvent::IsType(evt.GetMask(), IN_IGNORED))\n        pW->__Disable();\n      m_events.push_back(evt);\n    }\n    i += INOTIFY_EVENT_SIZE + (ssize_t) pEvt->len;\n  }\n  \n  IN_WRITE_END\n}\n  \nbool Inotify::GetEvent(InotifyEvent* pEvt) throw (InotifyException)\n{\n  if (pEvt == NULL)\n    throw InotifyException(IN_EXC_MSG(\"null pointer to event\"), EINVAL, this);\n  \n  IN_WRITE_BEGIN\n  \n  bool b = !m_events.empty();\n  if (b) {\n    *pEvt = m_events.front();\n    m_events.pop_front();\n  }\n  \n  IN_WRITE_END\n    \n  return b;\n}\n  \nbool Inotify::PeekEvent(InotifyEvent* pEvt) throw (InotifyException)\n{\n  if (pEvt == NULL)\n    throw InotifyException(IN_EXC_MSG(\"null pointer to event\"), EINVAL, this);\n  \n  IN_READ_BEGIN\n  \n  bool b = !m_events.empty();\n  if (b) {\n    *pEvt = m_events.front();\n  }\n  \n  IN_READ_END\n  \n  return b;\n}\n\nInotifyWatch* Inotify::FindWatch(int iDescriptor)\n{\n  IN_READ_BEGIN\n  \n  IN_WATCH_MAP::iterator it = m_watches.find(iDescriptor);\n  InotifyWatch* pW = it == m_watches.end() ? NULL : (*it).second;\n  \n  IN_READ_END\n  \n  return pW;\n}\n\nInotifyWatch* Inotify::FindWatch(const std::string& rPath)\n{\n  IN_READ_BEGIN\n  \n  IN_WP_MAP::iterator it = m_paths.find(rPath);\n  InotifyWatch* pW = it == m_paths.end() ? NULL : (*it).second;\n  \n  IN_READ_END\n    \n  return pW;\n}\n  \nvoid Inotify::SetNonBlock(bool fNonBlock) throw (InotifyException)\n{\n  IN_WRITE_BEGIN\n  \n  if (m_fd == -1) {\n    IN_WRITE_END_NOTHROW\n    throw InotifyException(IN_EXC_MSG(\"invalid file descriptor\"), EBUSY, this);\n  }\n    \n  int res = fcntl(m_fd, F_GETFL);\n  if (res == -1) {\n    IN_WRITE_END_NOTHROW\n    throw InotifyException(IN_EXC_MSG(\"cannot get inotify flags\"), errno, this);\n  }\n  \n  if (fNonBlock) {\n    res |= O_NONBLOCK;\n  }\n  else {\n    res &= ~O_NONBLOCK;\n  }\n      \n  if (fcntl(m_fd, F_SETFL, res) == -1) {\n    IN_WRITE_END_NOTHROW\n    throw InotifyException(IN_EXC_MSG(\"cannot set inotify flags\"), errno, this);\n  }\n    \n  IN_WRITE_END\n}\n\nvoid Inotify::SetCloseOnExec(bool fClOnEx) throw (InotifyException)\n{\n  IN_WRITE_BEGIN\n  \n  if (m_fd == -1) {\n    IN_WRITE_END_NOTHROW\n    throw InotifyException(IN_EXC_MSG(\"invalid file descriptor\"), EBUSY, this);\n  }\n    \n  int res = fcntl(m_fd, F_GETFD);\n  if (res == -1) {\n    IN_WRITE_END_NOTHROW\n    throw InotifyException(IN_EXC_MSG(\"cannot get inotify flags\"), errno, this);\n  }\n  \n  if (fClOnEx) {\n    res |= FD_CLOEXEC;\n  }\n  else {\n    res &= ~FD_CLOEXEC;\n  }\n      \n  if (fcntl(m_fd, F_SETFD, res) == -1) {\n    IN_WRITE_END_NOTHROW\n    throw InotifyException(IN_EXC_MSG(\"cannot set inotify flags\"), errno, this);\n  }\n    \n  IN_WRITE_END\n}\n\nuint32_t Inotify::GetCapability(InotifyCapability_t cap) throw (InotifyException)\n{\n  FILE* f = fopen(GetCapabilityPath(cap).c_str(), \"r\");\n  if (f == NULL)\n    throw InotifyException(IN_EXC_MSG(\"cannot get capability\"), errno, NULL);\n    \n  unsigned int val = 0;\n  if (fscanf(f, \"%u\", &val) != 1) {\n    fclose(f);\n    throw InotifyException(IN_EXC_MSG(\"cannot get capability\"), EIO, NULL);\n  }\n  \n  fclose(f);\n  \n  return (uint32_t) val;\n}\n\nvoid Inotify::SetCapability(InotifyCapability_t cap, uint32_t val) throw (InotifyException)\n{\n  FILE* f = fopen(GetCapabilityPath(cap).c_str(), \"w\");\n  if (f == NULL)\n    throw InotifyException(IN_EXC_MSG(\"cannot set capability\"), errno, NULL);\n    \n  if (fprintf(f, \"%u\", (unsigned int) val) <= 0) {\n    fclose(f);\n    throw InotifyException(IN_EXC_MSG(\"cannot set capability\"), EIO, NULL);\n  }\n  \n  fclose(f);\n}\n\nstd::string Inotify::GetCapabilityPath(InotifyCapability_t cap) throw (InotifyException)\n{\n  std::string path(PROCFS_INOTIFY_BASE);\n  \n  switch (cap) {\n    case IN_MAX_EVENTS:\n      path.append(\"max_queued_events\");\n      break;\n    case IN_MAX_INSTANCES:\n      path.append(\"max_user_instances\");\n      break;\n    case IN_MAX_WATCHES:\n      path.append(\"max_user_watches\");\n      break;\n    default:\n      throw InotifyException(IN_EXC_MSG(\"unknown capability type\"), EINVAL, NULL);\n  }\n  \n  return path;\n}\n\n"
  },
  {
    "path": "modules/inotify/inotify-cxx.h",
    "content": "\n/// inotify C++ interface header\n/**\n * \\file inotify-cxx.h\n * \n * inotify C++ interface\n * \n * Copyright (C) 2006, 2007 Lukas Jelinek, <lukas@aiken.cz>\n * \n * This program is free software; you can redistribute it and/or\n * modify it under the terms of one of the following licenses:\n *\n * \\li 1. X11-style license (see LICENSE-X11)\n * \\li 2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL)\n * \\li 3. GNU General Public License, version 2  (see LICENSE-GPL)\n *\n * If you want to help with choosing the best license for you,\n * please visit http://www.gnu.org/licenses/license-list.html.\n * \n */\n\n#ifndef MODULES_INOTIFY_INOTIFY_CXX_H\n#define MODULES_INOTIFY_INOTIFY_CXX_H\n\n#include <stdint.h>\n#include <string>\n#include <deque>\n#include <map>\n\n#include <sys/inotify.h>\n\n/// Event struct size\n#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event))\n\n/// Event buffer length\n#define INOTIFY_BUFLEN (1024 * (INOTIFY_EVENT_SIZE + 16))\n\n/// Helper macro for creating exception messages.\n/**\n * It prepends the message by the function name.\n */\n#define IN_EXC_MSG(msg) (std::string(__PRETTY_FUNCTION__) + \": \" + msg)\n\n/// inotify capability/limit identifiers \ntypedef enum\n{\n  IN_MAX_EVENTS     = 0,  ///< max. events in the kernel queue\n  IN_MAX_INSTANCES  = 1,  ///< max. inotify file descriptors per process\n  IN_MAX_WATCHES    = 2   ///< max. watches per file descriptor\n} InotifyCapability_t;\n\n/// inotify-cxx thread safety\n/**\n * If this symbol is defined you can use this interface safely\n * threaded applications. Remember that it slightly degrades\n * performance.\n * \n * Even if INOTIFY_THREAD_SAFE is defined some classes stay\n * unsafe. If you must use them (must you?) in more than one\n * thread concurrently you need to implement explicite locking.\n * \n * You need not to define INOTIFY_THREAD_SAFE in that cases\n * where the application is multithreaded but all the inotify\n * infrastructure will be managed only in one thread. This is\n * the recommended way.\n * \n * Locking may fail (it is very rare but not impossible). In this\n * case an exception is thrown. But if unlocking fails in case\n * of an error it does nothing (this failure is ignored).\n */\n#ifdef INOTIFY_THREAD_SAFE\n\n#include <pthread.h>\n\n#define IN_LOCK_DECL mutable pthread_rwlock_t __m_lock;\n\n#define IN_LOCK_INIT \\\n  { \\\n    pthread_rwlockattr_t attr; \\\n    int res = 0; \\\n    if ((res = pthread_rwlockattr_init(&attr)) != 0) \\\n      throw InotifyException(IN_EXC_MSG(\"cannot initialize lock attributes\"), res, this); \\\n    if ((res = pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NP)) != 0) \\\n      throw InotifyException(IN_EXC_MSG(\"cannot set lock kind\"), res, this); \\\n    if ((res = pthread_rwlock_init(&__m_lock, &attr)) != 0) \\\n      throw InotifyException(IN_EXC_MSG(\"cannot initialize lock\"), res, this); \\\n    pthread_rwlockattr_destroy(&attr); \\\n  }\n \n#define IN_LOCK_DONE pthread_rwlock_destroy(&__m_lock);\n\n#define IN_READ_BEGIN \\\n  { \\\n    int res = pthread_rwlock_rdlock(&__m_lock); \\\n    if (res != 0) \\\n      throw InotifyException(IN_EXC_MSG(\"locking for reading failed\"), res, (void*) this); \\\n  }\n  \n#define IN_READ_END \\\n  { \\\n    int res = pthread_rwlock_unlock(&__m_lock); \\\n    if (res != 0) \\\n      throw InotifyException(IN_EXC_MSG(\"unlocking failed\"), res, (void*) this); \\\n  }\n  \n#define IN_READ_END_NOTHROW pthread_rwlock_unlock(&__m_lock);\n  \n#define IN_WRITE_BEGIN \\\n  { \\\n    int res = pthread_rwlock_wrlock(&__m_lock); \\\n    if (res != 0) \\\n      throw InotifyException(IN_EXC_MSG(\"locking for writing failed\"), res, (void*) this); \\\n  }\n  \n#define IN_WRITE_END IN_READ_END\n#define IN_WRITE_END_NOTHROW IN_READ_END_NOTHROW\n\n#else // INOTIFY_THREAD_SAFE\n\n#define IN_LOCK_DECL\n#define IN_LOCK_INIT\n#define IN_LOCK_DONE\n#define IN_READ_BEGIN\n#define IN_READ_END\n#define IN_READ_END_NOTHROW\n#define IN_WRITE_BEGIN\n#define IN_WRITE_END\n#define IN_WRITE_END_NOTHROW\n\n#endif // INOTIFY_THREAD_SAFE\n\n\n\n\n// forward declaration\nclass InotifyWatch;\nclass Inotify;\n\n\n/// Class for inotify exceptions\n/**\n * This class allows to acquire information about exceptional\n * events. It makes easier to log or display error messages\n * and to identify problematic code locations.\n * \n * Although this class is basically thread-safe it is not intended\n * to be shared between threads.\n */\nclass InotifyException\n{\npublic:\n  /// Constructor\n  /**\n   * \\param[in] rMsg message\n   * \\param[in] iErr error number (see errno.h)\n   * \\param[in] pSrc source\n   */\n  InotifyException(const std::string& rMsg = \"\", int iErr = 0, void* pSrc = NULL)\n  : m_msg(rMsg),\n    m_err(iErr)\n  {\n    m_pSrc = pSrc;\n  }\n  \n  /// Returns the exception message.\n  /**\n   * \\return message\n   */\n  inline const std::string& GetMessage() const\n  {\n    return m_msg;\n  }\n  \n  /// Returns the exception error number.\n  /**\n   * If not applicable this value is 0 (zero).\n   * \n   * \\return error number (standardized; see errno.h)\n   */\n  inline int GetErrorNumber() const\n  {\n    return m_err;\n  } \n  \n  /// Returns the exception source.\n  /**\n   * \\return source\n   */\n  inline void* GetSource() const\n  {\n    return m_pSrc;\n  }\n\nprotected:\n  std::string m_msg;      ///< message\n  int m_err;              ///< error number\n  mutable void* m_pSrc;   ///< source\n};\n\n\n/// inotify event class\n/**\n * It holds all information about inotify event and provides\n * access to its particular values.\n * \n * This class is not (and is not intended to be) thread-safe\n * and therefore it must not be used concurrently in multiple\n * threads.\n */\nclass InotifyEvent\n{\npublic:\n  /// Constructor.\n  /**\n   * Creates a plain event.\n   */\n  InotifyEvent()\n  : m_uMask(0),\n    m_uCookie(0)\n  {\n    m_pWatch = NULL;\n  }\n  \n  /// Constructor.\n  /**\n   * Creates an event based on inotify event data.\n   * For NULL pointers it works the same way as InotifyEvent().\n   * \n   * \\param[in] pEvt event data\n   * \\param[in] pWatch inotify watch\n   */\n  InotifyEvent(const struct inotify_event* pEvt, InotifyWatch* pWatch)\n  : m_uMask(0),\n    m_uCookie(0)\n  {\n    if (pEvt != NULL) {\n      m_uMask = (uint32_t) pEvt->mask;\n      m_uCookie = (uint32_t) pEvt->cookie;\n      if (pEvt->name != NULL) {\n        m_name = pEvt->len > 0\n            ? pEvt->name\n            : \"\";\n      }\n      m_pWatch = pWatch;\n    }\n    else {\n      m_pWatch = NULL;\n    }\n  }\n  \n  /// Destructor.\n  ~InotifyEvent() {}\n  \n  /// Returns the event watch descriptor.\n  /**\n   * \\return watch descriptor\n   * \n   * \\sa InotifyWatch::GetDescriptor()\n   */\n  int32_t GetDescriptor() const;\n  \n  /// Returns the event mask.\n  /**\n   * \\return event mask\n   * \n   * \\sa InotifyWatch::GetMask()\n   */\n  inline uint32_t GetMask() const\n  {\n    return m_uMask;\n  }\n  \n  /// Checks a value for the event type.\n  /**\n   * \\param[in] uValue checked value\n   * \\param[in] uType type which is checked for\n   * \\return true = the value contains the given type, false = otherwise\n   */\n  inline static bool IsType(uint32_t uValue, uint32_t uType)\n  {\n    return ((uValue & uType) != 0) && ((~uValue & uType) == 0);\n  }\n  \n  /// Checks for the event type.\n  /**\n   * \\param[in] uType type which is checked for\n   * \\return true = event mask contains the given type, false = otherwise\n   */\n  inline bool IsType(uint32_t uType) const\n  {\n    return IsType(m_uMask, uType);\n  }\n  \n  /// Returns the event cookie.\n  /**\n   * \\return event cookie\n   */\n  inline uint32_t GetCookie() const\n  {\n    return m_uCookie;\n  }\n  \n  /// Returns the event name length.\n  /**\n   * \\return event name length\n   */\n  inline uint32_t GetLength() const\n  {\n    return (uint32_t) m_name.length();\n  }\n  \n  /// Returns the event name.\n  /**\n   * \\return event name\n   */\n  inline const std::string& GetName() const\n  {\n    return m_name;\n  }\n  \n  /// Extracts the event name.\n  /**\n   * \\param[out] rName event name\n   */\n  inline void GetName(std::string& rName) const\n  {\n    rName = GetName();\n  }\n  \n  /// Returns the source watch.\n  /**\n   * \\return source watch\n   */\n  inline InotifyWatch* GetWatch()\n  {\n    return m_pWatch;\n  }\n  \n  /// Finds the appropriate mask for a name.\n  /**\n   * \\param[in] rName mask name\n   * \\return mask for name; 0 on failure\n   */\n  static uint32_t GetMaskByName(const std::string& rName);\n  \n  /// Fills the string with all types contained in an event mask value.\n  /**\n   * \\param[in] uValue event mask value\n   * \\param[out] rStr dumped event types\n   */\n  static void DumpTypes(uint32_t uValue, std::string& rStr);\n  \n  /// Fills the string with all types contained in the event mask.\n  /**\n   * \\param[out] rStr dumped event types\n   */\n  void DumpTypes(std::string& rStr) const;\n  \nprivate:\n  uint32_t m_uMask;           ///< mask\n  uint32_t m_uCookie;         ///< cookie\n  std::string m_name;         ///< name\n  InotifyWatch* m_pWatch;     ///< source watch\n};\n\n\n\n/// inotify watch class\n/**\n * It holds information about the inotify watch on a particular\n * inode.\n * \n * If the INOTIFY_THREAD_SAFE is defined this class is thread-safe.\n */\nclass InotifyWatch\n{\npublic:\n  /// Constructor.\n  /**\n   * Creates an inotify watch. Because this watch is\n   * inactive it has an invalid descriptor (-1).\n   * \n   * \\param[in] rPath watched file path\n   * \\param[in] uMask mask for events\n   * \\param[in] fEnabled events enabled yes/no\n   */\n  InotifyWatch(const std::string& rPath, int32_t uMask, bool fEnabled = true)\n  : m_path(rPath),\n    m_uMask(uMask),\n    m_wd((int32_t) -1),\n    m_fEnabled(fEnabled)\n  {\n    IN_LOCK_INIT\n  }\n  \n  /// Destructor.\n  ~InotifyWatch()\n  {\n    IN_LOCK_DONE\n  }\n  \n  /// Returns the watch descriptor.\n  /**\n   * \\return watch descriptor; -1 for inactive watch\n   */\n  inline int32_t GetDescriptor() const\n  {\n    return m_wd;\n  }\n  \n  /// Returns the watched file path.\n  /**\n   * \\return file path\n   */\n  inline const std::string& GetPath() const\n  {\n    return m_path;\n  }\n  \n  /// Returns the watch event mask.\n  /**\n   * \\return event mask\n   */\n  inline uint32_t GetMask() const\n  {\n    return (uint32_t) m_uMask;\n  }\n  \n  /// Sets the watch event mask.\n  /**\n   * If the watch is active (added to an instance of Inotify)\n   * this method may fail due to unsuccessful re-setting\n   * the watch in the kernel.\n   * \n   * \\param[in] uMask event mask\n   * \n   * \\throw InotifyException thrown if changing fails\n   */\n  void SetMask(uint32_t uMask) throw (InotifyException);   \n  \n  /// Returns the appropriate inotify class instance.\n  /**\n   * \\return inotify instance\n   */\n  inline Inotify* GetInotify()\n  {\n    return m_pInotify;\n  }\n  \n  /// Enables/disables the watch.\n  /**\n   * If the watch is active (added to an instance of Inotify)\n   * this method may fail due to unsuccessful re-setting\n   * the watch in the kernel.\n   * \n   * Re-setting the current state has no effect.\n   * \n   * \\param[in] fEnabled set enabled yes/no\n   * \n   * \\throw InotifyException thrown if enabling/disabling fails\n   */\n  void SetEnabled(bool fEnabled) throw (InotifyException);\n  \n  /// Checks whether the watch is enabled.\n  /**\n   * \\return true = enables, false = disabled\n   */\n  inline bool IsEnabled() const\n  {\n    return m_fEnabled;\n  }\n  \n  /// Checks whether the watch is recursive.\n  /**\n   * A recursive watch monitors a directory itself and all\n   * its subdirectories. This watch is a logical object\n   * which may have many underlying kernel watches.\n   * \n   * \\return currently always false (recursive watches not yet supported)\n   * \\attention Recursive watches are currently NOT supported.\n   *            They are planned for future versions.\n   */\n  inline bool IsRecursive() const\n  {\n    return false;    \n  }\n  \nprivate:\n  friend class Inotify;\n\n  std::string m_path;   ///< watched file path\n  uint32_t m_uMask;     ///< event mask\n  int32_t m_wd;         ///< watch descriptor\n  Inotify* m_pInotify;  ///< inotify object\n  bool m_fEnabled;      ///< events enabled yes/no\n  \n  IN_LOCK_DECL\n  \n  /// Disables the watch (due to removing by the kernel).\n  /**\n   * This method must be called after receiving an event.\n   * It ensures the watch object is consistent with the kernel\n   * data. \n   */\n  void __Disable();\n};\n\n\n/// Mapping from watch descriptors to watch objects.\ntypedef std::map<int32_t, InotifyWatch*> IN_WATCH_MAP;\n\n/// Mapping from paths to watch objects.\ntypedef std::map<std::string, InotifyWatch*> IN_WP_MAP;\n\n\n/// inotify class\n/**\n * It holds information about the inotify device descriptor\n * and manages the event queue.\n * \n * If the INOTIFY_THREAD_SAFE is defined this class is thread-safe.\n */\nclass Inotify\n{\npublic:\n  /// Constructor.\n  /**\n   * Creates and initializes an instance of inotify communication\n   * object (opens the inotify device).\n   * \n   * \\throw InotifyException thrown if inotify isn't available\n   */\n  Inotify() throw (InotifyException);\n  \n  /// Destructor.\n  /**\n   * Calls Close() due to clean-up.\n   */\n  ~Inotify();\n  \n  /// Removes all watches and closes the inotify device.\n  void Close();\n    \n  /// Adds a new watch.\n  /**\n   * \\param[in] pWatch inotify watch\n   * \n   * \\throw InotifyException thrown if adding failed\n   */\n  void Add(InotifyWatch* pWatch) throw (InotifyException);\n  \n  /// Adds a new watch.\n  /**\n   * \\param[in] rWatch inotify watch\n   * \n   * \\throw InotifyException thrown if adding failed\n   */\n  inline void Add(InotifyWatch& rWatch) throw (InotifyException)\n  {\n    Add(&rWatch);\n  }\n  \n  /// Removes a watch.\n  /**\n   * If the given watch is not present it does nothing.\n   * \n   * \\param[in] pWatch inotify watch\n   * \n   * \\throw InotifyException thrown if removing failed\n   */\n  void Remove(InotifyWatch* pWatch) throw (InotifyException);\n  \n  /// Removes a watch.\n  /**\n   * If the given watch is not present it does nothing.\n   * \n   * \\param[in] rWatch inotify watch\n   * \n   * \\throw InotifyException thrown if removing failed\n   */\n  inline void Remove(InotifyWatch& rWatch) throw (InotifyException)\n  {\n    Remove(&rWatch);\n  }\n  \n  /// Removes all watches.\n  void RemoveAll();\n  \n  /// Returns the count of watches.\n  /**\n   * This is the total count of all watches (regardless whether\n   * enabled or not).\n   * \n   * \\return count of watches\n   * \n   * \\sa GetEnabledCount()\n   */\n  inline size_t GetWatchCount() const\n  {\n    IN_READ_BEGIN\n    size_t n = (size_t) m_paths.size();\n    IN_READ_END\n    return n;\n  }\n  \n  /// Returns the count of enabled watches.\n  /**\n   * \\return count of enabled watches\n   * \n   * \\sa GetWatchCount()\n   */  \n  inline size_t GetEnabledCount() const\n  {\n    IN_READ_BEGIN\n    size_t n = (size_t) m_watches.size();\n    IN_READ_END\n    return n;\n  }\n  \n  /// Waits for inotify events.\n  /**\n   * It waits until one or more events occur. When called\n   * in nonblocking mode it only retrieves occurred events\n   * to the internal queue and exits.\n   * \n   * \\param[in] fNoIntr if true it re-calls the system call after a handled signal\n   * \n   * \\throw InotifyException thrown if reading events failed\n   * \n   * \\sa SetNonBlock()\n   */\n  void WaitForEvents(bool fNoIntr = false) throw (InotifyException);\n  \n  /// Returns the count of received and queued events.\n  /**\n   * This number is related to the events in the queue inside\n   * this object, not to the events pending in the kernel.\n   * \n   * \\return count of events\n   */\n  inline size_t GetEventCount()\n  {\n    IN_READ_BEGIN\n    size_t n = (size_t) m_events.size();\n    IN_READ_END\n    return n;\n  }\n  \n  /// Extracts a queued inotify event.\n  /**\n   * The extracted event is removed from the queue.\n   * If the pointer is NULL it does nothing.\n   * \n   * \\param[in,out] pEvt event object\n   * \n   * \\throw InotifyException thrown if the provided pointer is NULL\n   */\n  bool GetEvent(InotifyEvent* pEvt) throw (InotifyException);\n  \n  /// Extracts a queued inotify event.\n  /**\n   * The extracted event is removed from the queue.\n   * \n   * \\param[in,out] rEvt event object\n   * \n   * \\throw InotifyException thrown only in very anomalous cases\n   */\n  bool GetEvent(InotifyEvent& rEvt) throw (InotifyException)\n  {\n    return GetEvent(&rEvt);\n  }\n  \n  /// Extracts a queued inotify event (without removing).\n  /**\n   * The extracted event stays in the queue.\n   * If the pointer is NULL it does nothing.\n   * \n   * \\param[in,out] pEvt event object\n   * \n   * \\throw InotifyException thrown if the provided pointer is NULL\n   */\n  bool PeekEvent(InotifyEvent* pEvt) throw (InotifyException);\n  \n  /// Extracts a queued inotify event (without removing).\n  /**\n   * The extracted event stays in the queue.\n   * \n   * \\param[in,out] rEvt event object\n   * \n   * \\throw InotifyException thrown only in very anomalous cases\n   */\n  bool PeekEvent(InotifyEvent& rEvt) throw (InotifyException)\n  {\n    return PeekEvent(&rEvt);\n  }\n  \n  /// Searches for a watch by a watch descriptor.\n  /**\n   * It tries to find a watch by the given descriptor.\n   * \n   * \\param[in] iDescriptor watch descriptor\n   * \\return pointer to a watch; NULL if no such watch exists\n   */\n  InotifyWatch* FindWatch(int iDescriptor);\n  \n  /// Searches for a watch by a filesystem path.\n  /**\n   * It tries to find a watch by the given filesystem path.\n   * \n   * \\param[in] rPath filesystem path\n   * \\return pointer to a watch; NULL if no such watch exists\n   * \n   * \\attention The path must be exactly identical to the one\n   *            used for the searched watch. Be careful about\n   *            absolute/relative and case-insensitive paths.\n   */\n   InotifyWatch* FindWatch(const std::string& rPath);\n  \n  /// Returns the file descriptor.\n  /**\n   * The descriptor can be used in standard low-level file\n   * functions (poll(), select(), fcntl() etc.).\n   * \n   * \\return valid file descriptor or -1 for inactive object\n   * \n   * \\sa SetNonBlock()\n   */\n  inline int GetDescriptor() const\n  {\n    return m_fd;\n  }\n  \n  /// Enables/disables non-blocking mode.\n  /**\n   * Use this mode if you want to monitor the descriptor\n   * (acquired thru GetDescriptor()) in functions such as\n   * poll(), select() etc.\n   * \n   * Non-blocking mode is disabled by default.\n   * \n   * \\param[in] fNonBlock enable/disable non-blocking mode\n   * \n   * \\throw InotifyException thrown if setting mode failed\n   * \n   * \\sa GetDescriptor(), SetCloseOnExec()\n   */\n  void SetNonBlock(bool fNonBlock) throw (InotifyException);\n  \n  /// Enables/disables closing on exec.\n  /**\n   * Enable this if you want to close the descriptor when\n   * executing another program. Otherwise, the descriptor\n   * will be inherited.\n   * \n   * Closing on exec is disabled by default.\n   * \n   * \\param[in] fClOnEx enable/disable closing on exec\n   * \n   * \\throw InotifyException thrown if setting failed\n   * \n   * \\sa GetDescriptor(), SetNonBlock()\n   */\n  void SetCloseOnExec(bool fClOnEx) throw (InotifyException);\n  \n  /// Acquires a particular inotify capability/limit.\n  /**\n   * \\param[in] cap capability/limit identifier\n   * \\return capability/limit value\n   * \\throw InotifyException thrown if the given value cannot be acquired\n   */\n  static uint32_t GetCapability(InotifyCapability_t cap) throw (InotifyException);\n  \n  /// Modifies a particular inotify capability/limit.\n  /**\n   * \\param[in] cap capability/limit identifier\n   * \\param[in] val new capability/limit value\n   * \\throw InotifyException thrown if the given value cannot be set\n   * \\attention Using this function requires root privileges.\n   *            Beware of setting extensive values - it may seriously\n   *            affect system performance and/or stability.\n   */\n  static void SetCapability(InotifyCapability_t cap, uint32_t val) throw (InotifyException);\n  \n  /// Returns the maximum number of events in the kernel queue.\n  /**\n   * \\return maximum number of events in the kernel queue\n   * \\throw InotifyException thrown if the given value cannot be acquired\n   */\n  inline static uint32_t GetMaxEvents() throw (InotifyException)\n  {\n    return GetCapability(IN_MAX_EVENTS);\n  }\n  \n  /// Sets the maximum number of events in the kernel queue.\n  /**\n   * \\param[in] val new value\n   * \\throw InotifyException thrown if the given value cannot be set\n   * \\attention Using this function requires root privileges.\n   *            Beware of setting extensive values - the greater value\n   *            is set here the more physical memory may be used for the inotify\n   *            infrastructure.\n   */\n  inline static void SetMaxEvents(uint32_t val) throw (InotifyException)\n  {\n    SetCapability(IN_MAX_EVENTS, val);\n  }\n  \n  /// Returns the maximum number of inotify instances per process.\n  /**\n   * It means the maximum number of open inotify file descriptors\n   * per running process.\n   * \n   * \\return maximum number of inotify instances\n   * \\throw InotifyException thrown if the given value cannot be acquired\n   */\n  inline static uint32_t GetMaxInstances() throw (InotifyException)\n  {\n    return GetCapability(IN_MAX_INSTANCES);\n  }\n  \n  /// Sets the maximum number of inotify instances per process.\n  /**\n   * \\param[in] val new value\n   * \\throw InotifyException thrown if the given value cannot be set\n   * \\attention Using this function requires root privileges.\n   *            Beware of setting extensive values - the greater value\n   *            is set here the more physical memory may be used for the inotify\n   *            infrastructure.\n   */\n  inline static void SetMaxInstances(uint32_t val) throw (InotifyException)\n  {\n    SetCapability(IN_MAX_INSTANCES, val);\n  }\n  \n  /// Returns the maximum number of inotify watches per instance.\n  /**\n   * It means the maximum number of inotify watches per inotify\n   * file descriptor.\n   * \n   * \\return maximum number of inotify watches\n   * \\throw InotifyException thrown if the given value cannot be acquired\n   */\n  inline static uint32_t GetMaxWatches() throw (InotifyException)\n  {\n    return GetCapability(IN_MAX_WATCHES);\n  }\n  \n  /// Sets the maximum number of inotify watches per instance.\n  /**\n   * \\param[in] val new value\n   * \\throw InotifyException thrown if the given value cannot be set\n   * \\attention Using this function requires root privileges.\n   *            Beware of setting extensive values - the greater value\n   *            is set here the more physical memory may be used for the inotify\n   *            infrastructure.\n   */\n  inline static void SetMaxWatches(uint32_t val) throw (InotifyException)\n  {\n    SetCapability(IN_MAX_WATCHES, val);\n  }\n\nprivate: \n  int m_fd;                             ///< file descriptor\n  IN_WATCH_MAP m_watches;               ///< watches (by descriptors)\n  IN_WP_MAP m_paths;                    ///< watches (by paths)\n  unsigned char m_buf[INOTIFY_BUFLEN];  ///< buffer for events\n  std::deque<InotifyEvent> m_events;    ///< event queue\n  \n  IN_LOCK_DECL\n  \n  friend class InotifyWatch;\n  \n  static std::string GetCapabilityPath(InotifyCapability_t cap) throw (InotifyException);\n};\n\n\n#endif // !MODULES_INOTIFY_INOTIFY_CXX_H\n\n"
  },
  {
    "path": "modules/inotify/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace inotify\n{\nextern k3d::iplugin_factory& file_change_notifier_factory();\n\n} // namespace inotify\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::inotify::file_change_notifier_factory());\nK3D_MODULE_END\n"
  },
  {
    "path": "modules/jpeg_io/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_JPEG_INCLUDE_DIRS})\n\nK3D_BUILD_MODULE(k3d-jpeg-io)\nK3D_CREATE_MODULE_PROXY(k3d-jpeg-io)\n\nTARGET_LINK_LIBRARIES(k3d-jpeg-io ${K3D_JPEG_LIBS})\n\n"
  },
  {
    "path": "modules/jpeg_io/bitmap_importer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/ibitmap_importer.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/string_modifiers.h>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/gil/extension/io/jpeg.hpp>\n\nnamespace module\n{\n\nnamespace jpeg\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_importer\n\nclass bitmap_importer :\n\tpublic k3d::ibitmap_importer\n{\npublic:\n\tbitmap_importer()\n\t{\n\t}\n\n\tbool read_file(const k3d::filesystem::path& Path, k3d::bitmap& Bitmap)\n\t{\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Reading \" << Path.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\t\t\tboost::gil::read_and_convert_image(Path.native_filesystem_string(), Bitmap, boost::gil::jpeg_tag());\n\t\t\treturn true;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t\treturn false;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<bitmap_importer,\n\t\t\tk3d::interface_list<k3d::ibitmap_importer> > factory(\n\t\t\t\tk3d::uuid(0xfb924031, 0x25c242af, 0xa2e1398e, 0x35000e3c),\n\t\t\t\t\"JPEGBitmapImporter\",\n\t\t\t\t_(\"JPEG (*.jpeg)\"),\n\t\t\t\t\"Bitmap BitmapImporter\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tboost::assign::map_list_of(\"k3d:load-order\", \"8\")(\"k3d:mime-types\", \"image/jpeg\"));\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_importer_factory\n\nk3d::iplugin_factory& bitmap_importer_factory()\n{\n\treturn bitmap_importer::get_factory();\n}\n\n} // namespace io\n\n} // namespace jpeg\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/jpeg_io/bitmap_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_source.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/path.h>\n\n#include <boost/gil/extension/io/jpeg.hpp>\n\nnamespace module\n{\n\nnamespace jpeg\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_reader\n\nclass bitmap_reader :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_source<bitmap_reader>\n{\n\ttypedef k3d::node base;\n\npublic:\n\tbitmap_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Browse for an input bitmap\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::bitmaps()))\n\t{\n\t\tm_file.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_bitmap_slot()));\n\t}\n\n\tvoid on_resize_bitmap(k3d::bitmap& Output)\n\t{\n\t\tconst k3d::filesystem::path file = m_file.pipeline_value();\n\t\tif(file.empty())\n\t\t\treturn;\n\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Reading \" << file.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\t\t\tboost::gil::read_and_convert_image(file.native_filesystem_string(), Output, boost::gil::jpeg_tag());\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t}\n\t}\n\n\tvoid on_assign_pixels(k3d::bitmap& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bitmap_reader,\n\t\t\tk3d::interface_list<k3d::ibitmap_source> > factory(\n\t\t\t\tk3d::uuid(0xfbee383b, 0x8443128c, 0x6c8b0ba9, 0xda52ceba),\n\t\t\t\t\"JPEGBitmapReader\",\n\t\t\t\t_(\"Loads a JPEG (*.jpeg) bitmap from the filesystem\"),\n\t\t\t\t\"Bitmap BitmapReader\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_reader_factory\n\nk3d::iplugin_factory& bitmap_reader_factory()\n{\n\treturn bitmap_reader::get_factory();\n}\n\n} // namespace io\n\n} // namespace jpeg\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/jpeg_io/bitmap_writer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_sink.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n\n#include <boost/gil/extension/io/jpeg.hpp>\n\nnamespace module\n{\n\nnamespace jpeg\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_writer\n\nclass bitmap_writer :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_sink<bitmap_writer>\n{\n\ttypedef k3d::node base;\n\npublic:\n\tbitmap_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Output file\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::WRITE) + init_path_type(\"jpeg_files\"))\n\t{\n\t\tm_file.changed_signal().connect(make_input_changed_slot());\n\t}\n\n\tstruct extract_rgb\n\t{\n\t\ttemplate<typename P1, typename P2>\n\t\tvoid operator()(const P1& src, P2& dst) const\n\t\t{\n\t\t\tget_color(dst, boost::gil::red_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::red_t()));\n\t\t\tget_color(dst, boost::gil::green_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::green_t()));\n\t\t\tget_color(dst, boost::gil::blue_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::blue_t()));\n\t\t}\n\t};\n\n\tvoid on_input_changed(k3d::ihint*)\n\t{\n\t\tconst k3d::filesystem::path file = m_file.pipeline_value();\n\t\tif(file.empty())\n\t\t\treturn;\n\n\t\tk3d::bitmap* const bitmap = m_input_bitmap.pipeline_value();\n\t\tif(!bitmap)\n\t\t\treturn;\n\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Writing \" << file.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\t\t\tboost::gil::write_view(file.native_filesystem_string(), boost::gil::color_converted_view<boost::gil::rgb8_pixel_t>(view(*bitmap), extract_rgb()), boost::gil::jpeg_tag());\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bitmap_writer,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink > > factory(\n\t\t\t\tk3d::uuid(0xf7aeb6b2, 0x2a46abda, 0xf7c63687, 0xb0d9dd44),\n\t\t\t\t\"JPEGBitmapWriter\",\n\t\t\t\t_(\"Bitmap writer that saves JPEG (*.jpg) files\"),\n\t\t\t\t\"Bitmap BitmapWriter\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n};\n\nk3d::iplugin_factory& bitmap_writer_factory()\n{\n\treturn bitmap_writer::get_factory();\n}\n\n} // namespace io\n\n} // namespace jpeg\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/jpeg_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace jpeg\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& bitmap_importer_factory();\nextern k3d::iplugin_factory& bitmap_reader_factory();\nextern k3d::iplugin_factory& bitmap_writer_factory();\n\n} // namespace io\n\n} // namespace jpeg\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::jpeg::io::bitmap_importer_factory());\n\tRegistry.register_factory(module::jpeg::io::bitmap_reader_factory());\n\tRegistry.register_factory(module::jpeg::io::bitmap_writer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/k3d_io/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-k3d-io)\nK3D_CREATE_MODULE_PROXY(k3d-k3d-io)\n\n"
  },
  {
    "path": "modules/k3d_io/document_exporter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/dependencies.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_exporter.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/persistent_lookup.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/serialization_xml.h>\n#include <k3dsdk/string_modifiers.h>\n#include <k3dsdk/xml.h>\n\nnamespace module\n{\n\nnamespace k3d_io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// document_exporter\n\n/// Serializes a K-3D document using the native K-3D XML format\nclass document_exporter :\n\tpublic k3d::idocument_exporter\n{\npublic:\n\tbool write_file(k3d::idocument& Document, const k3d::filesystem::path& Path)\n\t{\n\t\tk3d::log() << info << \"Writing \" << Path.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\n\t\t// Try to open the file ...\n\t\tk3d::filesystem::ofstream filestream(Path);\n\t\treturn_val_if_fail(filestream.good(), false);\n\n\t\t// Record our new path & title ...\n\t\treturn_val_if_fail(k3d::property::set_internal_value(Document.path(), Path), false);\n\t\treturn_val_if_fail(k3d::property::set_internal_value(Document.title(), Path.leaf()), false);\n\n\t\t// Create our output document and dependencies objects ...\n\t\tk3d::xml::element xml(\n\t\t\t\"k3dml\",\n\t\t\tk3d::xml::attribute(\"package\", K3D_PACKAGE),\n\t\t\tk3d::xml::attribute(\"version\", K3D_VERSION),\n\t\t\tk3d::xml::attribute(\"host\", K3D_HOST));\n\n\t\tconst k3d::filesystem::path root_path = Path.branch_path();\n\t\tk3d::dependencies dependencies;\n\t\tk3d::persistent_lookup lookup;\n\t\tk3d::ipersistent::save_context context(root_path, dependencies, lookup);\n\n\t\t// Save per-document data ...\n\t\tk3d::xml::element& xml_document = xml.append(k3d::xml::element(\"document\"));\n\t\tk3d::xml::element& xml_nodes = xml_document.append(k3d::xml::element(\"nodes\"));\n\n\t\t// Sort objects by ID before saving them ...\n\t\tconst k3d::inode_collection::nodes_t nodes = Document.nodes().collection();\n\n\t\tfor(k3d::inode_collection::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t\tk3d::xml::save(**node, xml_nodes, context);\n\n\t\t// Save the DAG ...\n\t\tk3d::xml::save_pipeline(Document, xml_document, context);\n\n\t\t// Save the XML ...\n\t\tfilestream << k3d::xml::declaration() << xml << std::endl;\n\t\treturn_val_if_fail(filestream.good(), false);\n\n\t\t// Record the saved position in the undo/redo hierarchy\n\t\tDocument.state_recorder().mark_saved();\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<document_exporter, k3d::interface_list<k3d::idocument_exporter> > factory(\n\t\t\tk3d::classes::DocumentExporter(),\n\t\t\t\"K3DDocumentExporter\",\n\t\t\t_(\"K-3D Native ( .k3d )\"),\n\t\t\t\"DocumentExporter\");\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& document_exporter_factory()\n{\n\treturn document_exporter::get_factory();\n}\n\n} // namespace k3d_io\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/k3d_io/document_importer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Implements the DocumentReader K-3D plugin, which imports the K-3D native file format\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/gzstream.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/persistent_lookup.h>\n#include <k3dsdk/serialization_xml.h>\n#include <k3dsdk/string_modifiers.h>\n#include <k3dsdk/vectors.h>\n#include <k3dsdk/xml.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace k3d_io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// document_importer\n\t\nstatic void node_execution(k3d::inode& Node, const k3d::string_t& Task, k3d::double_t Time)\n{\n\tk3d::log() << info << Node.name() << \" \" << Task << \" \" << Time << std::endl;\n}\n\nclass document_importer :\n\tpublic k3d::idocument_importer\n{\npublic:\n\tk3d::imetadata::metadata_t get_file_metadata(const k3d::filesystem::path& File)\n\t{\n\t\tk3d::imetadata::metadata_t metadata;\n\n\t\ttry\n\t\t{\n\t\t\tk3d::xml::element xml(\"k3dml\");\n\t\t\tk3d::filesystem::igzstream stream(File);\n\t\t\tk3d::xml::hide_progress progress;\n\t\t\tk3d::xml::parse(xml, stream, File.native_utf8_string().raw(), progress);\n\n\t\t\tmetadata.insert(std::make_pair(k3d::metadata::key::version(), k3d::xml::attribute_text(xml, \"version\")));\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t}\n\n\t\treturn metadata;\n\t}\n\n\tk3d::bool_t read_file(const k3d::filesystem::path& File, k3d::idocument& Document)\n\t{\n\t\tk3d::log() << info << \"Reading \" << File.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\n//\t\tsigc::connection connection = Document.pipeline_profiler().connect_node_execution_signal(sigc::ptr_fun(&node_execution));\n\n\t\tk3d::xml::element xml(\"k3dml\");\n\t\ttry\n\t\t{\n\t\t\tk3d::filesystem::igzstream stream(File);\n\t\t\tk3d::xml::hide_progress progress;\n\t\t\tk3d::xml::parse(xml, stream, File.native_utf8_string().raw(), progress);\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\treturn false;\n\t\t}\n\n\t\t// Make sure it's a K3D document ...\n\t\treturn_val_if_fail(xml.name == \"k3dml\", false);\n\n\t\tconst k3d::filesystem::path root_path = File.branch_path();\n\t\tk3d::persistent_lookup persistent_lookup;\n\t\tk3d::ipersistent::load_context context(root_path, persistent_lookup);\n\n\t\t// Load per-node data ...\n\t\tif(k3d::xml::element* xml_document = k3d::xml::find_element(xml, \"document\"))\n\t\t{\n\t\t\t// Handle documents from older versions of the software by modifying the XML\n\t\t\tk3d::xml::upgrade_document(*xml_document);\n\n\t\t\t// Load nodes\n\t\t\tif(k3d::xml::element* xml_nodes = k3d::xml::find_element(*xml_document, \"nodes\"))\n\t\t\t{\n\t\t\t\tk3d::inode_collection::nodes_t nodes;\n\t\t\t\tstd::vector<k3d::inode*> persistent_nodes;\n\t\t\t\tstd::vector<k3d::xml::element*> node_storage;\n\n\t\t\t\tfor(k3d::xml::element::elements_t::iterator xml_node = xml_nodes->children.begin(); xml_node != xml_nodes->children.end(); ++xml_node)\n\t\t\t\t{\n\t\t\t\t\tif(xml_node->name != \"node\")\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tif(k3d::xml::attribute_value<k3d::bool_t>(*xml_node, \"do_not_load\", false))\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst std::string name = k3d::xml::attribute_text(*xml_node, \"name\");\n\t\t\t\t\tconst k3d::uuid factory_id = k3d::xml::attribute_value<k3d::uuid>(*xml_node, \"factory\", k3d::uuid::null());\n\t\t\t\t\tif(factory_id == k3d::uuid::null())\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"node [\" << name << \"] with unspecified factory ID will not be loaded\" << std::endl;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst k3d::ipersistent_lookup::id_type node_id = k3d::xml::attribute_value<k3d::ipersistent_lookup::id_type>(*xml_node, \"id\", 0);\n\t\t\t\t\tif(node_id == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"node [\" << name << \"] with unspecified ID will not be loaded\" << std::endl;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tk3d::iplugin_factory* const plugin_factory = k3d::plugin::factory::lookup(factory_id);\n\t\t\t\t\tif(!plugin_factory)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"node [\" << name << \"] with unknown factory ID [\" << factory_id << \"] will not be loaded\" << std::endl;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tk3d::idocument_plugin_factory* const document_plugin_factory = dynamic_cast<k3d::idocument_plugin_factory*>(plugin_factory);\n\t\t\t\t\tif(!document_plugin_factory)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"Non-document plugin [\" << name << \"] will not be loaded\" << std::endl;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tk3d::inode* const node = document_plugin_factory->create_plugin(*plugin_factory, Document);\n\t\t\t\t\tif(!node)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"Error creating node [\" << name << \"] instance\" << std::endl;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tk3d::ipersistent* const persistent = dynamic_cast<k3d::ipersistent*>(node);\n\t\t\t\t\tif(!persistent)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"node [\" << name << \"] does not support persistence\" << std::endl;\n\n\t\t\t\t\t\tdelete node;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tk3d::undoable_new(node, Document);\n\n\t\t\t\t\tnodes.push_back(node);\n\t\t\t\t\tpersistent_nodes.push_back(node);\n\t\t\t\t\tnode_storage.push_back(&(*xml_node));\n\n\t\t\t\t\tpersistent_lookup.insert_lookup(node_id, node);\n\t\t\t\t}\n\n\t\t\t\tDocument.nodes().add_nodes(nodes);\n\n\t\t\t\tfor(k3d::uint_t i = 0; i != persistent_nodes.size(); ++i)\n\t\t\t\t\tk3d::xml::load(*persistent_nodes[i], *node_storage[i], context);\n\t\t\t}\n\n\t\t\t// Load the DAG ...\n\t\t\tk3d::xml::load_pipeline(Document, *xml_document, context);\n\t\t}\n\n//\t\tconnection.disconnect();\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<document_importer, k3d::interface_list<k3d::idocument_importer> > factory(\n\t\t\tk3d::classes::DocumentImporter(),\n\t\t\t\"K3DDocumentImporter\",\n\t\t\t_(\"K-3D Native ( .k3d )\"),\n\t\t\t\"DocumentImporter\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"k3d:mime-types\", \"application/x-k3d\"));\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& document_importer_factory()\n{\n\treturn document_importer::get_factory();\n}\n\n} // namespace k3d_io\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/k3d_io/mesh_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Wladyslaw Strugala (fizws@julia.univ.gda.pl)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/file_helpers.h>\n#include <k3dsdk/gzstream.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_reader.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/persistent_lookup.h>\n#include <k3dsdk/serialization_xml.h>\n\nnamespace module\n{\n\nnamespace k3d_io\n{\n\nclass set_default_material\n{\npublic:\n\tset_default_material(k3d::imaterial* Material) : m_material(Material) {}\n\n\tvoid operator()(const k3d::string_t&, const k3d::table&, const k3d::string_t& ArrayName, k3d::pipeline_data<k3d::array>& Array)\n\t{\n\t\tk3d::mesh::materials_t* const materials = dynamic_cast<k3d::mesh::materials_t*>(&Array.writable());\n\t\tif(!materials)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tmaterials->assign(materials->size(), m_material);\n\t}\n\nprivate:\n\tk3d::imaterial* m_material;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_reader\n\nclass mesh_reader :\n\tpublic k3d::material_sink<k3d::mesh_reader<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_reader<k3d::node > > base;\n\npublic:\n\tmesh_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reload_mesh_slot()));\n\t}\n\n\tvoid on_load_mesh(const k3d::filesystem::path& Path, k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\t\ttry\n\t\t{\n\t\t\tk3d::filesystem::igzstream file(Path);\n\t\t\tif(!file)\n\t\t\t{\n\t\t\t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << Path.native_console_string() << \"]\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tk3d::xml::element xml_document(\"k3dml\");\n\t\t\tfile >> xml_document;\n\n\t\t\tconst k3d::filesystem::path root_path = Path.branch_path();\n\t\t\tk3d::persistent_lookup lookup;\n\t\t\tk3d::ipersistent::load_context context(root_path, lookup);\n\n\t\t\tif(k3d::xml::element* const xml_mesh_arrays = k3d::xml::find_element(xml_document, \"mesh_arrays\"))\n\t\t\t\tk3d::xml::load(Output, *xml_mesh_arrays, context);\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << Path.native_console_string() << \"]\" << std::endl;\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\tOutput = k3d::mesh();\n\t\t\treturn;\n\t\t}\n\t\t// Assign a default material\n\t\tk3d::mesh::visit_arrays(Output, set_default_material(m_material.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_reader,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_storage> > > factory(\n\t\t\t\tk3d::uuid(0x7dd19499, 0x965e4c06, 0xb970f545, 0x0e47855d),\n\t\t\t\t\"K3DMeshReader\",\n\t\t\t\t_(\"Mesh reader that loads external K-3D XML (.k3d) files\"),\n\t\t\t\t\"MeshReader\");\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& mesh_reader_factory()\n{\n\treturn mesh_reader::get_factory();\n}\n\n} // namespace k3d_io\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/k3d_io/mesh_writer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/dependencies.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/file_helpers.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/mesh_writer.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/persistent_lookup.h>\n#include <k3dsdk/serialization_xml.h>\n\nnamespace module\n{\n\nnamespace k3d_io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_writer\n\nclass mesh_writer :\n\tpublic k3d::mesh_writer<k3d::node >\n{\n\ttypedef k3d::mesh_writer<k3d::node > base;\n\npublic:\n\tmesh_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_writer, k3d::interface_list<k3d::imesh_sink > > factory(\n\t\t\tk3d::uuid(0xefdcb347, 0x0e984075, 0x87973a80, 0xca8b196d),\n\t\t\t\"K3DMeshWriter\",\n\t\t\t_(\"Mesh writer that saves K-3D XML (.k3d) files\"),\n\t\t\t\"MeshWriter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_write_mesh(const k3d::mesh& Input, const k3d::filesystem::path& OutputPath, std::ostream& Output)\n\t{\n\t\tconst k3d::filesystem::path root_path(OutputPath.branch_path());\n\t\tk3d::dependencies dependencies;\n\t\tk3d::persistent_lookup lookup;\n\t\tk3d::ipersistent::save_context context(root_path, dependencies, lookup);\n\n\t\tk3d::xml::element xml(\"k3dml\");\n\t\tk3d::xml::element& xml_mesh = xml.append(k3d::xml::element(\"mesh_arrays\"));\n\t\tk3d::xml::save(Input, xml_mesh, context);\n\n\t\tOutput << k3d::xml::declaration() << xml;\n\t}\n};\n\nk3d::iplugin_factory& mesh_writer_factory()\n{\n\treturn mesh_writer::get_factory();\n}\n\n} // namespace k3d_io\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/k3d_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace k3d_io\n{\n\nextern k3d::iplugin_factory& document_importer_factory();\nextern k3d::iplugin_factory& document_exporter_factory();\nextern k3d::iplugin_factory& mesh_reader_factory();\nextern k3d::iplugin_factory& mesh_writer_factory();\n\n} // namespace k3d_io\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::k3d_io::document_importer_factory());\n\tRegistry.register_factory(module::k3d_io::document_exporter_factory());\n\tRegistry.register_factory(module::k3d_io::mesh_reader_factory());\n\tRegistry.register_factory(module::k3d_io::mesh_writer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/linear_curve/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-linear-curve)\nK3D_CREATE_MODULE_PROXY(k3d-linear-curve)\n\n"
  },
  {
    "path": "modules/linear_curve/knot_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 2002-2005, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/vectors.h>\n\nnamespace module\n{\n\nnamespace linear_curve\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// knot_curve\n\nclass knot_curve :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tknot_curve(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_edge_count(init_owner(*this) + init_name(\"edgecount\") + init_label(_(\"Edge count\")) + init_description(_(\"Number of edges building up the curve\")) + init_value(100) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_meridian_wraps(init_owner(*this) + init_name(\"meridianwraps\") + init_label(_(\"Meridian wraps\")) + init_description(_(\"Number of meridian wraps\")) + init_value(3) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_longitudinal_wraps(init_owner(*this) + init_name(\"longitudinalwraps\") + init_label(_(\"Longitudinal wraps\")) + init_description(_(\"Number of longitudinal wraps\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_scale(init_owner(*this) + init_name(\"scale\") + init_label(_(\"Scale\")) + init_description(_(\"Knot scale\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Curve width\")) + init_value(0.1) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_wrap(init_owner(*this) + init_name(\"closed\") + init_label(_(\"Closed\")) + init_description(_(\"Closed curve (loop)\")) + init_value(true))\n\t{\n\t\tm_edge_count.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_wrap.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\n\t\tm_meridian_wraps.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_longitudinal_wraps.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_scale.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t edge_count = m_edge_count.pipeline_value();\n\t\tconst k3d::double_t wrap = m_wrap.pipeline_value();\n\t\tconst k3d::double_t width = m_width.pipeline_value();\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\n\t\tpoints.resize(edge_count);\n\t\tpoint_selection.assign(edge_count, 0.0);\n\n\t\tboost::scoped_ptr<k3d::linear_curve::primitive> primitive(k3d::linear_curve::create(Output));\n\t\tk3d::mesh::doubles_t& widths = primitive->constant_attributes.create<k3d::mesh::doubles_t>(\"width\");\n\n\t\tprimitive->periodic.push_back(wrap);\n\t\tprimitive->material.push_back(material);\n\t\twidths.push_back(width);\n\n\t\tprimitive->curve_first_points.push_back(primitive->curve_points.size());\n\t\tprimitive->curve_point_counts.push_back(edge_count);\n\t\tprimitive->curve_selections.push_back(0.0);\n\n\t\tfor(k3d::uint32_t i = 0; i != edge_count; ++i)\n\t\t\tprimitive->curve_points.push_back(i);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t edge_count = m_edge_count.pipeline_value();\n\t\tconst k3d::double_t mwraps = m_meridian_wraps.pipeline_value();\n\t\tconst k3d::double_t lwraps = m_longitudinal_wraps.pipeline_value();\n\t\tconst k3d::double_t scale = m_scale.pipeline_value();\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\n\t\tfor(k3d::uint32_t i = 0; i != edge_count; ++i)\n\t\t{\n\t\t\tconst k3d::double_t percent = static_cast<k3d::double_t>(i) / static_cast<k3d::double_t>(edge_count);\n\t\t\tconst k3d::double_t radians = percent * k3d::pi_times_2();\n\t\t\tconst k3d::double_t mu = radians * mwraps;\n\n\t\t\tk3d::point3 point;\n\n\t\t\tpoint[0] = cos(mu) * (1 + cos(lwraps * mu / mwraps) / 2.0);\n\t\t\tpoint[1] = sin(mu) * (1 + cos(lwraps * mu / mwraps) / 2.0);\n\t\t\tpoint[2] = sin(lwraps * mu / mwraps) / 2.0;\n\n\t\t\tpoints[i] = point * scale;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<knot_curve > factory(\n\t\t\tk3d::uuid(0xb39c53a3, 0xe2fe0e32, 0x21d09384, 0xc4ed13fe),\n\t\t\t\t\"LinearKnot\",\n\t\t\t\t_(\"Generates a PQ-knot curve\"),\n\t\t\t\t\"LinearCurve\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_edge_count;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_meridian_wraps;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_longitudinal_wraps;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_scale;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_wrap;\n};\n\nk3d::iplugin_factory& knot_curve_factory()\n{\n\treturn knot_curve::get_factory();\n}\n\n} // namespace linear_curve\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/linear_curve/lissajous_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/vectors.h>\n\nnamespace module\n{\n\nnamespace linear_curve\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// lissajous_curve\n\nclass lissajous_curve :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tlissajous_curve(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_edge_count(init_owner(*this) + init_name(\"edgecount\") + init_label(_(\"Edge Count\")) + init_description(_(\"Edge count\")) + init_value(100) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_mamp(init_owner(*this) + init_name(\"mamp\") + init_label(_(\"Modulation Amplitude\")) + init_description(_(\"Modulation amplitude\")) + init_value(0.05) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_mfreq(init_owner(*this) + init_name(\"mfreq\") + init_label(_(\"Modulation Frequency\")) + init_description(_(\"Modulation frequency\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_mphase(init_owner(*this) + init_name(\"mphase\") + init_label(_(\"Modulation Phase\")) + init_description(_(\"Modulation phase\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_xamp(init_owner(*this) + init_name(\"xamp\") + init_label(_(\"X Amplitude\")) + init_description(_(\"X amplitude\")) + init_value(5.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_xfreq(init_owner(*this) + init_name(\"xfreq\") + init_label(_(\"X Frequency\")) + init_description(_(\"X frequency\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_xphase(init_owner(*this) + init_name(\"xphase\") + init_label(_(\"X Phase\")) + init_description(_(\"X phase\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_yamp(init_owner(*this) + init_name(\"yamp\") + init_label(_(\"Y Amplitude\")) + init_description(_(\"Y amplitude\")) + init_value(5.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_yfreq(init_owner(*this) + init_name(\"yfreq\") + init_label(_(\"Y Frequency\")) + init_description(_(\"Y frequency\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_yphase(init_owner(*this) + init_name(\"yphase\") + init_label(_(\"Y Phase\")) + init_description(_(\"Y phase\")) + init_value(k3d::pi_over_2()) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_zamp(init_owner(*this) + init_name(\"zamp\") + init_label(_(\"Z Amplitude\")) + init_description(_(\"Z amplitude\")) + init_value(0.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_zfreq(init_owner(*this) + init_name(\"zfreq\") + init_label(_(\"Z Frequency\")) + init_description(_(\"Z frequency\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_zphase(init_owner(*this) + init_name(\"zphase\") + init_label(_(\"Z Phase\")) + init_description(_(\"Z phase\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Curve width\")) + init_value(0.1) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_wrap(init_owner(*this) + init_name(\"closed\") + init_label(_(\"Closed Curve\")) + init_description(_(\"Closed curve (loop)\")) + init_value(true))\n\t{\n\t\tm_edge_count.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_wrap.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\n\t\tm_mamp.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_mfreq.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_mphase.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_xamp.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_xfreq.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_xphase.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_yamp.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_yfreq.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_yphase.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_zamp.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_zfreq.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_zphase.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tconst k3d::uint32_t edge_count = m_edge_count.pipeline_value();\n\t\tconst k3d::bool_t wrap = m_wrap.pipeline_value();\n\t\tconst k3d::double_t width = m_width.pipeline_value();\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\n\t\tpoints.resize(edge_count);\n\t\tpoint_selection.assign(edge_count, 0.0);\n\n\t\tboost::scoped_ptr<k3d::linear_curve::primitive> primitive(k3d::linear_curve::create(Output));\n\t\tk3d::mesh::doubles_t& widths = primitive->constant_attributes.create<k3d::mesh::doubles_t>(\"width\");\n\n\t\tprimitive->periodic.push_back(wrap);\n\t\tprimitive->material.push_back(material);\n\t\twidths.push_back(width);\n\n\t\tprimitive->curve_first_points.push_back(primitive->curve_points.size());\n\t\tprimitive->curve_point_counts.push_back(edge_count);\n\t\tprimitive->curve_selections.push_back(0.0);\n\n\t\tfor(k3d::uint32_t i = 0; i != edge_count; ++i)\n\t\t\tprimitive->curve_points.push_back(i);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tconst k3d::uint32_t edge_count = m_edge_count.pipeline_value();\n\t\tconst k3d::double_t mamp = m_mamp.pipeline_value();\n\t\tconst k3d::double_t mfreq = m_mfreq.pipeline_value();\n\t\tconst k3d::double_t mphase = m_mphase.pipeline_value();\n\t\tconst k3d::double_t xamp = m_xamp.pipeline_value();\n\t\tconst k3d::double_t xfreq = m_xfreq.pipeline_value();\n\t\tconst k3d::double_t xphase = m_xphase.pipeline_value();\n\t\tconst k3d::double_t yamp = m_yamp.pipeline_value();\n\t\tconst k3d::double_t yfreq = m_yfreq.pipeline_value();\n\t\tconst k3d::double_t yphase = m_yphase.pipeline_value();\n\t\tconst k3d::double_t zamp = m_zamp.pipeline_value();\n\t\tconst k3d::double_t zfreq = m_zfreq.pipeline_value();\n\t\tconst k3d::double_t zphase = m_zphase.pipeline_value();\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\n\t\tfor(k3d::uint32_t i = 0; i != edge_count; ++i)\n\t\t{\n\t\t\tconst k3d::double_t percent = static_cast<k3d::double_t>(i) / static_cast<k3d::double_t>(edge_count);\n\t\t\tconst k3d::double_t theta = percent * k3d::pi_times_2();\n\n\t\t\tk3d::point3 point(\n\t\t\t\txamp * sin(xfreq * theta + xphase),\n\t\t\t\tyamp * sin(yfreq * theta + yphase),\n\t\t\t\tzamp * sin(zfreq * theta + zphase));\n\n\t\t\tif(mamp)\n\t\t\t{\n\t\t\t\tpoint *= 1.0 + (mamp * sin(mfreq * theta + mphase));\n\t\t\t}\n\n\t\t\tpoints[i] = point;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<lissajous_curve > factory(\n\t\tk3d::uuid(0x7fdcbdc1, 0xd1c6404e, 0xae15a8eb, 0x45ffc793),\n\t\t\t\"LinearLissajousCurve\",\n\t\t\t_(\"Generates a lissajous (sine-wave) curve\"),\n\t\t\t\"LinearCurve\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_edge_count;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_mamp;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_mfreq;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_mphase;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_xamp;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_xfreq;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_xphase;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_yamp;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_yfreq;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_yphase;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_zamp;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_zfreq;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_zphase;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_wrap;\n};\n\nk3d::iplugin_factory& lissajous_curve_factory()\n{\n\treturn lissajous_curve::get_factory();\n}\n\n} // namespace linear_curve\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/linear_curve/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\n/// Namespace reserved for the primitives plugin module, to protect public symbols from name clashes with other modules\nnamespace module\n{\n\nnamespace linear_curve\n{\n\nextern k3d::iplugin_factory& knot_curve_factory();\nextern k3d::iplugin_factory& lissajous_curve_factory();\n\n} // namespace linear_curve\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::linear_curve::knot_curve_factory());\n\tRegistry.register_factory(module::linear_curve::lissajous_curve_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/lipsync/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-lipsync)\nK3D_CREATE_MODULE_PROXY(k3d-lipsync)\n\n"
  },
  {
    "path": "modules/lipsync/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Joaquin Duo (joaduo@lugmen.org.ar)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace papagayo_lipsync_reader\n{\n\nextern k3d::iplugin_factory& papagayo_lipsync_reader_factory();\n\n} // namespace plot\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::papagayo_lipsync_reader::papagayo_lipsync_reader_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/lipsync/papagayo_lipsync_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Joaquin Duo (joaduo@lugmen.org.ar)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/file_helpers.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/string_source.h>\n\n// #include <iostream>\n\nnamespace module\n{\n\nnamespace papagayo_lipsync_reader\n{\n\nnamespace detail\n{\n\nclass papagayo_lipsync_reader_implementation\n{\n\tpublic:\n\t\tpapagayo_lipsync_reader_implementation()\n\t\t{\n\t\t\n\t\t}\n\t\t\n\t\tvoid load_papagayo_file(k3d::filesystem::path path_papagayo_file)\n\t\t{\n\t\t\t//clear the last file loaded (if any)\n\t\t\ttimes_vector.clear();\n\t\t\tmouth_names_vector.clear();\n\t\t\t\n\t\t\tk3d::filesystem::ifstream file(path_papagayo_file);\n\t\t\tif(!file)\n\t\t\t{\n\t\t\t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << path_papagayo_file.native_console_string() << \"]\" << std::endl;\n\t\t\t\treturn ;\n\t\t\t}\n\t\t\t\n\t\t\t//Check the file header for \"MohoSwitch1\" and warn if fails\n\t\t\tk3d::string_t line_buffer;\n\t\t\tk3d::getline(file, line_buffer);\n\t\t\tif(line_buffer.compare(\"MohoSwitch1\"))\n\t\t\t{\n\t\t\t\tk3d::log() << warning << \"Probably this is not a papagayo file format. First line should be \\\"MohoSwitch1\\\"\" << std::endl;\n\t\t\t\treturn ;\n\t\t\t}\n\t\t\t\n\t\t\t//Add a rest state at the beginning for simplicity\n\t\t\ttimes_vector.push_back(0);\n\t\t\tmouth_names_vector.push_back(\"rest\");\n\t\t\t\n\t\t\t//Load all the other mouths\n\t\t\tk3d::uint_t line_count = 0; // Track the number of lines parsed\n\t\t\tfor(k3d::getline(file, line_buffer); file; k3d::getline(file, line_buffer))\n\t\t\t{\n\t\t\t\t++line_count;\n\t\t\t\tstd::istringstream line_stream(line_buffer);\n\t\t\t\tk3d::uint_t mouth_frame;\n\t\t\t\tk3d::string_t mouth_name;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tline_stream >> mouth_frame;\n\t\t\t\t\tline_stream >> mouth_name;\n\t\t\t\t\ttimes_vector.push_back(mouth_frame);\n\t\t\t\t\tmouth_names_vector.push_back(mouth_name);\n\t\t\t\t}\n\t\t\t\tcatch(...)\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"Could not parse file at line: [\"<< line_count << \"] \"<< line_buffer << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//Add rest mouth at the end for simplicity\n\t\t\ttimes_vector.push_back(times_vector[times_vector.size()-1]+1);\n\t\t\tmouth_names_vector.push_back(\"rest\");\n\t\t}\n\t\t\n\t\t//Calculate the value for a mouth, given a time value\n\t\tdouble get_mouth_value(k3d::string_t mouth_name,k3d::double_t frame_rate, k3d::double_t time)\n\t\t{\n\t\t\tif(times_vector.empty())\n\t\t\t\treturn 0.;\n\t\t\tk3d::uint_t index = std::upper_bound( times_vector.begin(), times_vector.end(), static_cast<k3d::uint_t>(time*frame_rate) ) - times_vector.begin();\n\t\t\tif(index > 0)\n\t\t\t\t--index;\n\t\t\tif(mouth_names_vector[index].compare(mouth_name) == 0)\n\t\t\t\treturn 1.;\n\t\t\treturn 0.;\n\t\t}\n\t\t\n\t\t//Calculate the value for a mouth, given a time value\n\t\tdouble get_mouth_value_interpolated(k3d::string_t mouth_name,k3d::double_t frame_rate, k3d::double_t time, k3d::double_t interpolation_time)\n\t\t{\n\t\t\tif(times_vector.empty())\n\t\t\t\treturn 0.;\n\t\t\tk3d::uint_t index_next = std::upper_bound( times_vector.begin(), times_vector.end(), static_cast<k3d::uint_t>(time*frame_rate) ) - times_vector.begin();\n\t\t\tk3d::uint_t index_previous;\n\t\t\tk3d::uint_t index;\n\t\t\t\n\t\t\t//Check extreme cases\n\t\t\tif(index_next <= 1)\n\t\t\t{\n\t\t\t\tif(mouth_names_vector[0].compare(mouth_name) == 0)\n\t\t\t\t\treturn 1.;\n\t\t\t\telse\n\t\t\t\t\treturn 0.;\n\t\t\t}\n\t\t\telse if(index_next == times_vector.size())\n\t\t\t{\n\t\t\t\tif(mouth_names_vector[index_next-1].compare(mouth_name) == 0)\n\t\t\t\t\treturn 1.;\n\t\t\t\telse\n\t\t\t\t\treturn 0.;\n\t\t\t}\n\t\t\t\n\t\t\tindex = index_next - 1;\n\t\t\tindex_previous = index - 1;\n\t\t\t\n\t\t\t//Check if interpolation_time is too long, and correct it\n\t\t\tif( interpolation_time > (times_vector[index_next]/frame_rate - times_vector[index]/frame_rate))\n\t\t\t{\n\t\t\t\tinterpolation_time = (times_vector[index_next]/frame_rate - times_vector[index]/frame_rate)/4.;\n\t\t\t}\n\t\t\t\n\t\t\tif(time <= times_vector[index]/frame_rate + interpolation_time/2.)\n\t\t\t{\n\t\t\t\tif(mouth_names_vector[index         ].compare(mouth_name) == 0)\n\t\t\t\t\treturn .5 + .5*(time - times_vector[index]/frame_rate)/interpolation_time;\n\t\t\t\tif(mouth_names_vector[index_previous].compare(mouth_name) == 0)\n\t\t\t\t\treturn .5 - .5*(time - times_vector[index]/frame_rate)/interpolation_time;\n\t\t\t\treturn 0.;\n\t\t\t}\n\t\t\telse if(time > times_vector[index_next]/frame_rate - interpolation_time/2.)\n\t\t\t{\n\t\t\t\tif(mouth_names_vector[index     ].compare(mouth_name) == 0)\n\t\t\t\t\treturn 1. - .5*(times_vector[index_next]/frame_rate - time)/interpolation_time;\n\t\t\t\tif(mouth_names_vector[index_next].compare(mouth_name) == 0)\n\t\t\t\t\treturn      .5*(times_vector[index_next]/frame_rate - time)/interpolation_time;\n\t\t\t\treturn 0.;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(mouth_names_vector[index].compare(mouth_name) == 0)\n\t\t\t\t\treturn 1.;\n\t\t\t\treturn 0.;\n\t\t\t}\n\t\t}\n\tprivate:\n\t\tstd::vector<k3d::uint_t> times_vector;\n\t\tstd::vector<k3d::string_t> mouth_names_vector;\n}; //class papagayo_lipsync_reader_implementation\n\n} //namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// papagayo_lipsync_reader\n\n/// Reads a papagayo .dat file and outputs the values for morphing\nclass papagayo_lipsync_reader :\n\tpublic k3d::node\n{\n\ttypedef k3d::node base;\n\npublic:\n\tpapagayo_lipsync_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_papagayo_file(init_owner(*this) + init_name(\"papagayo_file\") + init_label(_(\"Papagayo File\")) + init_description(_(\"Papagayo Lipsync File to Load\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(\"\")),\n\t\tm_frame_rate(init_owner(*this) + init_name(\"frame_rate\") + init_label(_(\"Frame Rate\")) + init_description(_(\"Frame rate of the papagayo lipsync file. Frames are converted to time units according to this value.\")) + init_value(30.0) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(std::numeric_limits<double>::epsilon()))),\n\t\tm_time(init_owner(*this) + init_name(\"time\") + init_label(_(\"Time\")) + init_description(_(\"Time for the current mouths' values(should be connected to a time source)\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::time))),\n\t\tm_interpolate(init_owner(*this) + init_name(\"interpolate\") + init_label(_(\"Interpolate\")) + init_description(_(\"Enables linear interpolation between mouths values.\")) + init_value(true)),\n\t\tm_interpolation_time(init_owner(*this) + init_name(\"interpolation_time\") + init_label(_(\"Interpolation Time\")) + init_description(_(\"Time for the transition from mouth to mouth\")) + init_value(0.2) + init_step_increment(0.05) + init_units(typeid(k3d::measurement::time))),\n\t\t// Mouths names:\tAI  E  etc  FV  L  MBP  O  rest  U  WQ\n\t\t#define INITIALIZE_MOUTH_PROPERTY(name_mouth) m_##name_mouth(init_owner(*this) + init_name(#name_mouth) + init_label(_(#name_mouth)) + init_description(_(#name_mouth\" mouth value.\"))  + init_value(0.0))\n\t\tINITIALIZE_MOUTH_PROPERTY(AI),\n\t\tINITIALIZE_MOUTH_PROPERTY(E),\n\t\tINITIALIZE_MOUTH_PROPERTY(etc),\n\t\tINITIALIZE_MOUTH_PROPERTY(FV),\n\t\tINITIALIZE_MOUTH_PROPERTY(L),\n\t\tINITIALIZE_MOUTH_PROPERTY(MBP),\n\t\tINITIALIZE_MOUTH_PROPERTY(O),\n\t\tINITIALIZE_MOUTH_PROPERTY(rest),\n\t\tINITIALIZE_MOUTH_PROPERTY(U),\n\t\tINITIALIZE_MOUTH_PROPERTY(WQ)\n\t{\n\t\tm_papagayo_file.changed_signal().connect(sigc::mem_fun(*this, &papagayo_lipsync_reader::load_papagayo_file));\n\t\t\n\t\t#define CONNECT_UPDATE_SLOT(name_mouth) m_##name_mouth.set_update_slot(sigc::mem_fun(*this, &papagayo_lipsync_reader::get_value_##name_mouth))\n\t\t\tCONNECT_UPDATE_SLOT(AI);\n\t\t\tCONNECT_UPDATE_SLOT(E);\n\t\t\tCONNECT_UPDATE_SLOT(etc);\n\t\t\tCONNECT_UPDATE_SLOT(FV);\n\t\t\tCONNECT_UPDATE_SLOT(L);\n\t\t\tCONNECT_UPDATE_SLOT(MBP);\n\t\t\tCONNECT_UPDATE_SLOT(O);\n\t\t\tCONNECT_UPDATE_SLOT(rest);\n\t\t\tCONNECT_UPDATE_SLOT(U);\n\t\t\tCONNECT_UPDATE_SLOT(WQ);\n\t\t\t\n\t\t#define CONNECT_CHANGE_SIGNAL(property,name_mouth) property.changed_signal().connect(m_##name_mouth.make_slot())\n\t\t\t//Chaging the file changes the mouths\n\t\t\tCONNECT_CHANGE_SIGNAL(m_papagayo_file,AI);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_papagayo_file,E);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_papagayo_file,etc);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_papagayo_file,FV);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_papagayo_file,L);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_papagayo_file,MBP);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_papagayo_file,O);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_papagayo_file,rest);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_papagayo_file,U);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_papagayo_file,WQ);\n\t\t\t//Chaging the interpolate bool changes the mouths\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolate,AI);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolate,E);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolate,etc);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolate,FV);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolate,L);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolate,MBP);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolate,O);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolate,rest);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolate,U);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolate,WQ);\n\t\t\t//Chaging the interpolation_time changes the mouths\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolation_time,AI);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolation_time,E);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolation_time,etc);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolation_time,FV);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolation_time,L);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolation_time,MBP);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolation_time,O);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolation_time,rest);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolation_time,U);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_interpolation_time,WQ);\n\t\t\t//Chaging the time changes the mouths\n\t\t\tCONNECT_CHANGE_SIGNAL(m_time,AI);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_time,E);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_time,etc);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_time,FV);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_time,L);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_time,MBP);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_time,O);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_time,rest);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_time,U);\n\t\t\tCONNECT_CHANGE_SIGNAL(m_time,WQ);\n\t}\n\nk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<papagayo_lipsync_reader, k3d::interface_list<k3d::istring_source> > factory(\n\t\t\tk3d::uuid(0x9e43b56a, 0x3c4198c9, 0xfd0d46b4, 0xb18446ae),\n\t\t\t\"PapagayoLipsyncReader\",\n\t\t\t_(\"Load a papagayo lipsync (.dat) file and output its values given a time source\"),\n\t\t\t\"Animation\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization)  m_papagayo_file;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_frame_rate;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_time;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization)   m_interpolate;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_interpolation_time;\n\t//mouths\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_AI;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_E;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_etc;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_FV;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_L;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_MBP;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_O;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_rest;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_U;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_WQ;\n\n\tdetail::papagayo_lipsync_reader_implementation implementation;\n\t\n\tvoid load_papagayo_file(k3d::ihint* Hint)\n\t{\n\t\timplementation.load_papagayo_file(m_papagayo_file.pipeline_value());\n\t}\n\n\tk3d::double_t get_property_value(k3d::string_t name)\n\t{\n\t\tif(m_interpolate.pipeline_value())\n\t\t\treturn implementation.get_mouth_value_interpolated\n\t\t\t\t(\n\t\t\t\t\tname,m_frame_rate.pipeline_value(),m_time.pipeline_value(),m_interpolation_time.pipeline_value()\n\t\t\t\t);\n\t\telse\n\t\t\treturn implementation.get_mouth_value(name,m_frame_rate.pipeline_value(),m_time.pipeline_value());\n\t}\n\n// \tvoid scalar_source::execute(const std::vector<k3d::ihint*>& Hints, k3d::double_t& Output)\n// \t#define FUNCTION_GET_VALUE_MOUTH(name_mouth) k3d::double_t get_value_##name_mouth() {return get_property_value(#name_mouth);}\n\t#define FUNCTION_GET_VALUE_MOUTH(name_mouth) void get_value_##name_mouth(const std::vector<k3d::ihint*>& Hints, k3d::double_t& Output) { Output = get_property_value(#name_mouth);}\n\t\tFUNCTION_GET_VALUE_MOUTH(AI)\n\t\tFUNCTION_GET_VALUE_MOUTH(E)\n\t\tFUNCTION_GET_VALUE_MOUTH(etc)\n\t\tFUNCTION_GET_VALUE_MOUTH(FV)\n\t\tFUNCTION_GET_VALUE_MOUTH(L)\n\t\tFUNCTION_GET_VALUE_MOUTH(MBP)\n\t\tFUNCTION_GET_VALUE_MOUTH(O)\n\t\tFUNCTION_GET_VALUE_MOUTH(rest)\n\t\tFUNCTION_GET_VALUE_MOUTH(U)\n\t\tFUNCTION_GET_VALUE_MOUTH(WQ)\n\t\n}; //class papagayo_lipsync_reader\n\n\n/////////////////////////////////////////////////////////////////////////////\n// papagayo_lipsync_reader_factory\n\nk3d::iplugin_factory& papagayo_lipsync_reader_factory()\n{\n\treturn papagayo_lipsync_reader::get_factory();\n}\n\n} //namespace papagayo_lipsync_reader\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/lsystem/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-lsystem)\nK3D_CREATE_MODULE_PROXY(k3d-lsystem)\n\n"
  },
  {
    "path": "modules/lsystem/l_parser.cpp",
    "content": "// K-3D\n// Copyright (c) 2004-2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/file_helpers.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/string_modifiers.h>\n\n#include <cmath>\n#include <fstream>\n#include <limits>\n#include <map>\n#include <sstream>\n#include <stack>\n\nnamespace module\n{\n\nnamespace lsystem\n{\n\nnamespace lparser\n{\n\n// Based on free code from Laurens Lapre\n// http://home.wanadoo.nl/laurens.lapre/lparser.htm\n// for more information, read share/doc/lsystem.txt\n\n\n// Rules\nstd::vector<std::string> rules;\n\n// Marked rules need special processing when growing shapes are active\nstd::vector<bool> marks;\n\n// Used to build the production string\nstd::string object_string;\n\n// Settings stack used for solving [] references\ntypedef struct s_rec\n{\n\tk3d::point3\tpos;\t// position in 3space of turtle origin\n\tk3d::vector3\tfow;\t// forward direction\n\n\tk3d::vector3\tlef;\t// left direction\n\tk3d::vector3\tupp;\t// up direction\n\tk3d::point3\tlast;\t// last position used for connecting cylinders\n\tk3d::point3\tlast_v[8];\t// last vertices of object used for connecting cylinders\n\tk3d::double_t\t\tdis;\t// value of F distance\n\tk3d::double_t\t\tang;\t// value of basic angle\n\tk3d::double_t\t\tthick;\t// value of thickness\n\tk3d::double_t\t\tdis2;\t// value of Z distance\n\tk3d::double_t\t\ttr;\t// trope value\n\tunsigned long\tcol;\t// current color\n\tunsigned long\tlast_col;\t// color of last object\n} s_rec;\n\n// Flags\nbool trope_set = false;\nbool rand_set = false;\nbool closed_form = false;\nbool last_recur = false; // processing the last recursion step\n\n// Init vars\nk3d::double_t\t\tthick, min_thick = 0.0, rand_amount = 0.0;\nk3d::double_t\t\ttrope_amount = 0.0;\nunsigned long\tpolcount = 0;\n// Limit total generated polygons\nunsigned long\tpoly_limit = 500000L;\n// Set maximum production string size in kbytes\nunsigned long\tmax_string = 2L * 1024L * 1024L;\nunsigned long\tcol = 2, lev, last_col = 0;\nk3d::double_t\t\tdis, ang, dis2, tr = 0.2;\nk3d::vector3\tsky(0.0, 0.0, 1.0);\nk3d::vector3\ttrope;\nk3d::point3\tlast(1.0, 1.0, 1.0), last_v[8];\nk3d::double_t\t\tfraction;\nk3d::point3\taxis_x, axis_y, axis_z;\n\n// Stacks []\nstd::stack<s_rec> stack;\ns_rec save;\n\n// Polygon stack used for solving {} references\ntypedef std::vector<k3d::point3> vectors_t;\nstd::stack<vectors_t> pstack;\n\n// Max size of the [] and {} stacks during drawing\n// useful during mutation\nunsigned long\tmax_stack_size = 1000;\n\n// Polygons\nclass polygon\n{\npublic:\n\tunsigned long a;\n\tunsigned long b;\n\tunsigned long c;\n\tunsigned long d;\n\n\tpolygon()\n\t{\n\t\ta = b = c = d = 0;\n\t}\n\n\tpolygon(unsigned long A, unsigned long B, unsigned long C, unsigned long D) :\n\t\ta(A), b(B), c(C), d(D)\n\t{\n\t}\n};\n\n\n// Store vertices and polygons\nvectors_t vertices;\ntypedef std::vector<polygon> polygons_t;\npolygons_t polygons;\nk3d::signed_axis orientation;\nbool flip_normals;\n\n// Bounding-box\nk3d::bounding_box3 bounding_box;\nk3d::double_t bbox_x = 0;\nk3d::double_t bbox_y = 0;\nk3d::double_t bbox_z = 0;\n\n// LViewer colors\nconst unsigned long color_number = 15;\nk3d::color colors[color_number] = {\n\tk3d::color(0.5, 0.5, 0.5), // default\n\tk3d::color(0.3, 0.3, 0.3),\n\tk3d::color(0.8, 0.4, 0.4),\n\tk3d::color(0.8, 0.8, 0.4),\n\tk3d::color(0.4, 0.8, 0.4),\n\tk3d::color(0.4, 0.8, 0.8),\n\tk3d::color(0.4, 0.4, 0.8),\n\tk3d::color(0.8, 0.4, 0.8),\n\tk3d::color(0.2, 0.5, 0.2),\n\tk3d::color(0.2, 0.5, 0.5),\n\tk3d::color(0.2, 0.2, 0.5),\n\tk3d::color(0.5, 0.2, 0.5),\n\tk3d::color(0.6, 0.2, 0.2),\n\tk3d::color(0.5, 0.5, 0.5),\n\tk3d::color(0.9, 0.9, 0.9)\n};\n\nstruct context\n{\n\tcontext(k3d::mesh::points_t& Points, k3d::mesh::selection_t& PointSelection, k3d::polyhedron::primitive& Polyhedron, k3d::imaterial* const Material) :\n\t\tpoints(Points),\n\t\tpoint_selection(PointSelection),\n\t\tpolyhedron(Polyhedron),\n\t\tmaterial(Material)\n\t{\n\t}\n\n\tk3d::mesh::points_t& points;\n\tk3d::mesh::selection_t& point_selection;\n\tk3d::polyhedron::primitive& polyhedron;\n\tk3d::imaterial* const material;\n};\n\nbool add_geometry(unsigned long Color, const context& Context)\n{\n\tk3d::mesh::indices_t new_points;\n\tfor(unsigned long t = 0; t < vertices.size(); t++)\n\t{\n\t\t// Update orientation and change handedness\n\t\tk3d::double_t x = 0;\n\t\tk3d::double_t y = 0;\n\t\tk3d::double_t z = 0;\n\t\tswitch(orientation)\n\t\t{\n\t\t\tcase k3d::PX:\n\t\t\t\tx = vertices[t][2];\n\t\t\t\ty = -vertices[t][1];\n\t\t\t\tz = vertices[t][0];\n\t\t\t\tbreak;\n\t\t\tcase k3d::NX:\n\t\t\t\tx = -vertices[t][2];\n\t\t\t\ty = -vertices[t][1];\n\t\t\t\tz = -vertices[t][0];\n\t\t\t\tbreak;\n\t\t\tcase k3d::PY:\n\t\t\t\tx = -vertices[t][0];\n\t\t\t\ty = vertices[t][2];\n\t\t\t\tz = vertices[t][1];\n\t\t\t\tbreak;\n\t\t\tcase k3d::NY:\n\t\t\t\tx = vertices[t][0];\n\t\t\t\ty = -vertices[t][2];\n\t\t\t\tz = vertices[t][1];\n\t\t\t\tbreak;\n\t\t\tcase k3d::PZ:\n\t\t\t\tx = -vertices[t][0];\n\t\t\t\ty = -vertices[t][1];\n\t\t\t\tz = vertices[t][2];\n\t\t\t\tbreak;\n\t\t\tcase k3d::NZ:\n\t\t\t\tx = vertices[t][0];\n\t\t\t\ty = -vertices[t][1];\n\t\t\t\tz = -vertices[t][2];\n\t\t\t\tbreak;\n\t\t}\n\n\t\tconst k3d::point3 point(x, y, z);\n\n\t\tnew_points.push_back(Context.points.size());\n\n\t\tContext.points.push_back(point);\n\t\tContext.point_selection.push_back(0);\n\t\tbounding_box.insert(point);\n\t}\n\n\tfor(unsigned long t = 0; t < polygons.size(); t++)\n\t{\n\t\tContext.polyhedron.face_shells.push_back(0);\n\t\tContext.polyhedron.face_first_loops.push_back(Context.polyhedron.loop_first_edges.size());\n\t\tContext.polyhedron.face_loop_counts.push_back(1);\n\t\tContext.polyhedron.face_selections.push_back(0);\n\t\tContext.polyhedron.face_materials.push_back(Context.material);\n\n\t\tContext.polyhedron.loop_first_edges.push_back(Context.polyhedron.clockwise_edges.size());\n\n\t\tif(flip_normals)\n\t\t{\n\t\t\tif(polygons[t].c != polygons[t].d)\n\t\t\t{\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() - 3);\n\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].a]);\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].d]);\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].c]);\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].b]);\n\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() - 2);\n\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].a]);\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].c]);\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].b]);\n\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(polygons[t].c != polygons[t].d)\n\t\t\t{\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() - 3);\n\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].a]);\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].b]);\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].c]);\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].d]);\n\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() + 1);\n\t\t\t\tContext.polyhedron.clockwise_edges.push_back(Context.polyhedron.clockwise_edges.size() - 2);\n\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\t\t\t\tContext.polyhedron.edge_selections.push_back(0);\n\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].a]);\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].b]);\n\t\t\t\tContext.polyhedron.vertex_points.push_back(new_points[polygons[t].c]);\n\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t\tContext.polyhedron.vertex_selections.push_back(0);\n\t\t\t}\n\t\t}\n\n/*\n\t\t// Set color ...\n\t\tunsigned long color_index = Color;\n\t\tif(color_index > color_number - 1)\n\t\t\tcolor_index = 0;\n\n\t\tnew_face->uniform_data[\"Cs\"] = colors[color_index];\n*/\n\t}\n\n\treturn true;\n}\n\n\n// Here we build a cube shape directly on the input vectors\nvoid add_cube(k3d::point3 start, k3d::point3 end, k3d::vector3 up, unsigned long color, const context& Context, const k3d::signed_axis Orientation)\n{\n\t// Check size\n\tk3d::vector3 direction = end - start;\n\tk3d::double_t length = direction.length();\n\tif(length == 0)\n\t\treturn;\n\n\tk3d::double_t s = length * thick;\n\ts = std::max(s, min_thick);\n\ts *= 0.5;\n\n\tk3d::vector3 d1 = k3d::normalize(direction);\n\tk3d::vector3 d2 = k3d::normalize(up);\n\n\tk3d::vector3 d3 = k3d::normalize(d1 ^ d2);\n\n\tvertices.clear();\n\tvertices.resize(4);\n\n\t// Base 1, 3\n\td1 = k3d::normalize(d2 + d3);\n\tvertices[0] = start + s * d1;\n\tvertices[2] = start + (-s) * d1;\n\n\t// Base 2, 4\n\td1 = k3d::normalize(d2 - d3);\n\tvertices[1] = start + s * d1;\n\tvertices[3] = start + (-s) * d1;\n\n\t// Top\n\tfor(unsigned long i = 0; i < 4; i++)\n\t\tvertices.push_back(vertices[i] + direction);\n\n\t// Polygons\n\tpolygons.clear();\n\tpolygons.push_back(polygon(0, 4, 5, 1));\n\tpolygons.push_back(polygon(1, 5, 6, 2));\n\tpolygons.push_back(polygon(2, 6, 7, 3));\n\tpolygons.push_back(polygon(3, 7, 4, 0));\n\tpolygons.push_back(polygon(0, 1, 2, 3));\n\tpolygons.push_back(polygon(7, 6, 5, 4));\n\n\tadd_geometry(color, Context);\n}\n\n// The lastxxx vars are used to store the previous top of the cylinder\n// for connecting a next one; since the vars are stacked for [] we can\n// connect correctly according to current nesting level\nvoid add_cylinder(k3d::point3 start, k3d::point3 end, k3d::vector3 up, unsigned long color, const context& Context, const k3d::signed_axis Orientation)\n{\n\t// Check size\n\tk3d::vector3 direction = end - start;\n\tk3d::double_t length = direction.length();\n\tif(length == 0.0)\n\t\treturn;\n\n\tk3d::double_t s = length * thick;\n\ts = std::max(s, min_thick);\n\ts *= 0.5;\n\n\tk3d::vector3 d1 = k3d::normalize(direction);\n\tk3d::vector3 d2 = k3d::normalize(up);\n\n\tk3d::vector3 d3 = k3d::normalize(d1 ^ d2);\n\n\tk3d::point3 t1 = k3d::to_point(k3d::normalize(d2 + d3));\n\tk3d::point3 t2 = k3d::to_point(k3d::normalize(d2 - d3));\n\n\tvertices.clear();\n\tvertices.resize(8);\n\n\tvertices[0] = start + s * t1;\n\tvertices[4] = start + (-s) * t1;\n\tvertices[2] = start + s * t2;\n\tvertices[6] = start + (-s) * t2;\n\n\ts *= 0.7071;\n\tvertices[1] = start + s * t1 + s * t2;\n\tvertices[3] = start + (-s) * t1 + s * t2;\n\tvertices[5] = start + (-s) * t1 + (-s) * t2;\n\tvertices[7] = start + s * t1 + (-s) * t2;\n\n\t// Top\n\tfor(unsigned long i = 0; i < 8; i++)\n\t\tvertices.push_back(vertices[i] + direction);\n\n\tif(last_col == color)\n\t{\n\t\tdirection = start - last;\n\t\tlength = direction.length();\n\t\tk3d::double_t dd = std::numeric_limits<k3d::double_t>::max();\n\n\t\t// Connect cylinders if near enough\n\t\tif(length < 1.0)\n\t\t{\n\t\t\t// Find nearest vertex\n\t\t\tunsigned long ii = 0;\n\t\t\tfor(unsigned long i = 0; i < 8; i++)\n\t\t\t{\n\t\t\t\tdirection = vertices[0] - last_v[i];\n\t\t\t\tlength = direction.length();\n\t\t\t\tif(length < dd)\n\t\t\t\t{\n\t\t\t\t\tdd = length;\n\t\t\t\t\tii = i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor(unsigned long i = 0; i < 8; i++)\n\t\t\t{\n\t\t\t\tvertices[i] = last_v[ii];\n\t\t\t\tii = (ii + 1) % 8;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Polygons\n\tpolygons.clear();\n\tpolygons.push_back(polygon(0, 8, 9, 1));\n\tpolygons.push_back(polygon(1, 9, 10, 2));\n\tpolygons.push_back(polygon(2, 10, 11, 3));\n\tpolygons.push_back(polygon(3, 11, 12, 4));\n\tpolygons.push_back(polygon(4, 12, 13, 5));\n\tpolygons.push_back(polygon(5, 13, 14, 6));\n\tpolygons.push_back(polygon(6, 14, 15, 7));\n\tpolygons.push_back(polygon(7, 15, 8, 0));\n\n\tadd_geometry(color, Context);\n\n\t// Save cylinder's parameters and top vertices\n\tlast_col = color;\n\tlast = end;\n\tfor(unsigned long i = 0; i < 8; i++)\n\t\tlast_v[i] = vertices[i + 8];\n}\n\n// L-system routines ------------------------------------------------------\n\n// Get a line from a .ls file;\n// skips comments (lines beginning with '#') and empty lines\nbool ls_line(std::istream& file, std::string& linebuffer)\n{\n\twhile(!file.eof())\n\t{\n\t\tk3d::getline(file, linebuffer);\n\n\t\t// Skip comments ...\n\t\tif(linebuffer[0] == '#')\n\t\t\tcontinue;\n\n\t\t// Skip blank lines\n\t\tif(!(k3d::trim(linebuffer)).size())\n\t\t\tcontinue;\n\n\t\t// Must qualify\n\t\treturn true;\n\t}\n\n\t// end-of-file reached\n\treturn false;\n}\n\nbool load_configuration_values(const k3d::filesystem::path& file_path, k3d::double_t& recursion, k3d::double_t& basic_angle, k3d::double_t& thickness)\n{\n\t// Open configuration file\n\tk3d::filesystem::ifstream file(file_path);\n\tif(!file.good())\n\t{\n\t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << file_path.native_console_string() << \"]\" << std::endl;\n\t\treturn 0.0;\n\t}\n\n\t// Get recursion level\n\tstd::string temp;\n\treturn_val_if_fail(ls_line(file, temp), false);\n\tstd::stringstream scan(temp);\n\tscan >> recursion;\n\n\t// Get asic angle\n\treturn_val_if_fail(ls_line(file, temp), false);\n\tstd::stringstream scan2(temp);\n\tscan2 >> basic_angle;\n\n\t// Get thickness\n\treturn_val_if_fail(ls_line(file, temp), false);\n\tstd::stringstream scan3(temp);\n\tscan3 >> thickness;\n\n\treturn true;\n}\n\n// Process a ls file and setup rules\nbool load_configuration_rules(const k3d::double_t recursion, const k3d::double_t basic_angle, const k3d::double_t thickness, const k3d::filesystem::path& file_path)\n{\n\t// Open grammar file\n\tk3d::filesystem::ifstream file(file_path);\n\tif(!file.good())\n\t{\n\t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << file_path.native_console_string() << \"]\" << std::endl;\n\t\treturn false;\n\t}\n\n\t// Set default values\n\ttrope_set = false;\n\trand_set = false;\n\tclosed_form = false;\n\tlast_recur = false;\n\n\tmin_thick = 0.0; rand_amount = 0.0;\n\ttrope_amount = 0.0;\n\tpolcount = 0;\n\tpoly_limit = 500000L;\n\tcol = 2; last_col = 0;\n\ttr = 0.2;\n\tsky = k3d::vector3(0.0, 0.0, 1.0);\n\tlast = k3d::point3(1.0, 1.0, 1.0);\n\n\t// Clear stacks\n\tstack = std::stack<s_rec>();\n\tpstack = std::stack<vectors_t>();\n\n\t// Skip but setup recursion level, basic angle and thickness\n\tstd::string temp;\n\treturn_val_if_fail(ls_line(file, temp), false);\n\n\tlev = (unsigned long)std::floor(recursion);\n\tfraction = recursion - (k3d::double_t)lev;\n\tif(fraction > 0)\n\t\tlev++;\n\n\treturn_val_if_fail(ls_line(file, temp), false);\n\tang = basic_angle / 180 * 3.141592654;\n\n\treturn_val_if_fail(ls_line(file, temp), false);\n\tthick = thickness / 100;\n\n\t// Axiom\n\treturn_val_if_fail(ls_line(file, temp), false);\n\n\tobject_string = strtok(const_cast<char*>(temp.c_str()), \" \\r\\n\\t#\");\n\n\t// Get rules\n\trules.clear();\n\tfor(unsigned long i = 0; i < 150; i++)\n\t{\n\t\treturn_val_if_fail(ls_line(file, temp), false);\n\n\t\tstd::string rule = strtok(const_cast<char*>(temp.c_str()), \" \\r\\n\\t#\");\n\n\t\tif(!rule.size())\n\t\t\tcontinue;\n\n\t\tif(rule[0] == '@')\n\t\t\tbreak;\n\n\t\trules.push_back(rule);\n\t}\n\n\t// Add default rules\n\trules.push_back(\"+=+\");\n\trules.push_back(\"-=-\");\n\trules.push_back(\"&=&\");\n\trules.push_back(\"^=^\");\n\trules.push_back(\"<=<\");\n\trules.push_back(\">=>\");\n\n\trules.push_back(\"%=%\");\n\trules.push_back(\"|=|\");\n\trules.push_back(\"!=!\");\n\trules.push_back(\"?=?\");\n\trules.push_back(\":=:\");\n\trules.push_back(\";=;\");\n\trules.push_back(\"\\'=\\'\");\n\trules.push_back(\"\\\"=\\\"\");\n\trules.push_back(\"c=c\");\n\n\trules.push_back(\"[=[\");\n\trules.push_back(\"]=]\");\n\trules.push_back(\"{={\");\n\trules.push_back(\"}=}\");\n\n\trules.push_back(\"F=F\");\n\trules.push_back(\"f=f\");\n\trules.push_back(\"t=t\");\n\trules.push_back(\"g=g\");\n\trules.push_back(\"Z=Z\");\n\trules.push_back(\"z=z\");\n\trules.push_back(\"*=*\");\n\trules.push_back(\"$=$\");\n\trules.push_back(\"~=~\");\n\n\trules.push_back(\".=.\");\n\trules.push_back(\"1=1\");\n\trules.push_back(\"2=2\");\n\trules.push_back(\"3=3\");\n\trules.push_back(\"4=4\");\n\trules.push_back(\"5=5\");\n\trules.push_back(\"6=6\");\n\trules.push_back(\"7=7\");\n\trules.push_back(\"8=8\");\n\trules.push_back(\"9=9\");\n\trules.push_back(\"0=0\");\n\trules.push_back(\"(=(\");\n\trules.push_back(\")=)\");\n\n\t// Closer default\n\trules.push_back(\"_=_\");\n\n\t// Set start values for F and Z distances\n\tdis = 100.0;\n\tdis2 = dis * 0.5;\n\n\t// Get marks\n\tmarks.clear();\n\tfor(unsigned long n = 0; n < rules.size(); n++)\n\t\tmarks.push_back(false);\n\n\t// Check which rules need to be marked for last recursion when growing\n\tfor(unsigned long n = 0; n < rules.size(); n++)\n\t{\n\t\tif(rules[n][0] == '+')\n\t\t\tbreak;\n\n\t\tmarks[n] = true;\n\n\t\t// All rules with basic move/block before '=' mark false\n\t\tif(rules[n][0] == 'F')\n\t\t\tmarks[n] = false;\n\t\tif(rules[n][0] == 'f')\n\t\t\tmarks[n] = false;\n\t\tif(rules[n][0] == 'Z')\n\t\t\tmarks[n] = false;\n\t\tif(rules[n][0] == 'z')\n\t\t\tmarks[n] = false;\n\t}\n\n\treturn true;\n}\n\n// Apply mutations to the rules\nconst k3d::double_t inv_max = 1.0 / RAND_MAX;\nk3d::double_t Rnd()\n{\n\treturn rand() * inv_max;\n}\n\nvoid L_mutate()\n{\n\tunsigned long n;\n\tfor(n = 0; n < rules.size(); n++)\n\t\tif(rules[n][0] == '+')\n\t\t\tbreak;\n\n\tk3d::double_t rules_n = static_cast<k3d::double_t>(n);\n\tconst unsigned long max = 1000;\n\n\tunsigned long i = static_cast<unsigned long>(Rnd() * 6.0);\n\tswitch(i)\n\t{\n\t\tdefault:\n\t\t\treturn;\n\n\t\t// Insert\n\t\tcase 1:\n\t\t{\n\t\t\tstd::string T(\"\");\n\t\t\ti = static_cast<unsigned long>(Rnd() * rules_n);\n\t\t\tT = rules[i][0];\n\n\t\t\tunsigned long j = static_cast<unsigned long>(Rnd() * rules_n);\n\n\t\t\tunsigned long k = (unsigned long)(Rnd() * (k3d::double_t)rules[j].length());\n\t\t\tk = (k < 2) ? 2 : k;\n\t\t\tstd::string rulet = std::string(rules[j], k);\n\t\t\trules[j].replace(k, rulet.length(), '[' + T + ']');\n\t\t\trules[j].replace(k, rulet.length(), std::string('[' + T + ']'));\n\n\t\t\trules[j] += rulet;\n\t\t}\n\t\tbreak;\n\n\t\t// Replace\n\t\tcase 0:\n\t\tcase 2:\n\t\t{\n\t\t\tstd::string R(\"\");\n\t\t\tstd::string T(\"\");\n\n\t\t\tdo\n\t\t\t{\n\t\t\t\tunsigned long i = static_cast<unsigned long>(Rnd() * rules_n);\n\t\t\t\tunsigned long j = static_cast<unsigned long>(Rnd() * rules_n);\n\t\t\t\tT = rules[i][0];\n\t\t\t\tR = rules[j][0];\n\t\t\t}\n\t\t\twhile(T == R);\n\n\t\t\tfor(unsigned long ii = 0; ii < max; ii++)\n\t\t\t{\n\t\t\t\ti = static_cast<unsigned long>(Rnd() * rules_n);\n\t\t\t\tfor(unsigned long j = 2; j < (rules[i]).length(); j++)\n\t\t\t\t{\n\t\t\t\t\tif(rules[i][j] == T[0])\n\t\t\t\t\t{\n\t\t\t\t\t\trules[i][j] = R[0];\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\t// Append\n\t\tcase 3:\n\t\t{\n\t\t\tstd::string S(\"\");\n\t\t\ti = static_cast<unsigned long>(Rnd() * rules_n);\n\t\t\tS = rules[i][0];\n\n\t\t\ti = static_cast<unsigned long>(Rnd() * rules_n);\n\t\t\trules[i] = S;\n\t\t}\n\t\tbreak;\n\n\t\t// Swap directions\n\t\tcase 4:\n\t\t\tfor(unsigned long ii = 0; ii < max; ii++)\n\t\t\t{\n\t\t\t\ti = static_cast<unsigned long>(Rnd() * rules_n);\n\t\t\t\tfor(unsigned long j = 2; j < rules[i].size(); j++)\n\t\t\t\t{\n\t\t\t\t\tchar mutations[12][2] = {\n\t\t\t\t\t\t{ '+', '-' },\n\t\t\t\t\t\t{ '-', '+' },\n\t\t\t\t\t\t{ '&', '^' },\n\t\t\t\t\t\t{ '^', '&' },\n\t\t\t\t\t\t{ '>', '<' },\n\t\t\t\t\t\t{ '<', '>' },\n\t\t\t\t\t\t{ '|', '%' },\n\t\t\t\t\t\t{ '%', '|' },\n\t\t\t\t\t\t{ ':', ';' },\n\t\t\t\t\t\t{ ';', ':' },\n\t\t\t\t\t\t{ '\\'', '\"' },\n\t\t\t\t\t\t{ '\"', '\\'' } };\n\n\t\t\t\t\tunsigned long random = (unsigned long)(Rnd() * 12.0);\n\n\t\t\t\t\tif(random > 11)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tif(rules[i][j] == mutations[random][0])\n\t\t\t\t\t{\n\t\t\t\t\t\trules[i][j] = mutations[random][1];\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\n\t\t// Swap sizes\n\t\tcase 5:\n\t\t\tfor(unsigned long ii = 0; ii < max; ii++)\n\t\t\t{\n\t\t\t\ti = static_cast<unsigned long>(Rnd() * rules_n);\n\t\t\t\tfor(unsigned long j = 2; j < rules[i].size(); j++)\n\t\t\t\t{\n\t\t\t\t\tchar mutations[6][2] = {\n\t\t\t\t\t\t{ 'F', 'Z' },\n\t\t\t\t\t\t{ 'Z', 'F' },\n\t\t\t\t\t\t{ 'f', 'z' },\n\t\t\t\t\t\t{ 'z', 'f' },\n\t\t\t\t\t\t{ '!', '?' },\n\t\t\t\t\t\t{ '?', '!' } };\n\n\t\t\t\t\tunsigned long random = (unsigned long)(Rnd() * 6.0);\n\n\t\t\t\t\tif(random > 5)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tif(rules[i][j] == mutations[random][0])\n\t\t\t\t\t{\n\t\t\t\t\t\trules[i][j] = mutations[random][1];\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\t}\n}\n\n// Expand l-system into production string.\n// object_string is read with the k counter and\n// the next generation is built up in otemp\nvoid L_system()\n{\n\t// Map rule names\n\ttypedef std::map<char, unsigned long> map_t;\n\tmap_t S;\n\n\t// Each char gets a rule number\n\tfor(unsigned long i = rules.size(); i > 0; i--)\n\t\tif(rules[i - 1].size())\n\t\t\tS[(rules[i - 1][0])] = i - 1;\n\n\t// For each recursion\n\tunsigned long max = max_string - 10L;\n\tbool incomplete = false;\n\tfor(unsigned long l = 0; l < lev; l++)\n\t{\n\t\t// Need markers ?\n\t\tbool marker = (l == (lev - 1)) && (fraction != 0.0);\n\n\t\tstd::string otemp(\"\");\n\t\tunsigned long ss = 0;\n\n\t\t// For each char in the string\n\t\tfor(unsigned long k = 0; k < object_string.size(); k++)\n\t\t{\n\t\t\t// Default rule which does nothing\n\t\t\tunsigned long i = rules.size() - 1;\n\t\t\t// i = rule number attached to current char\n\t\t\tmap_t::const_iterator find_rule = S.find(object_string[k]);\n\t\t\tif(find_rule != S.end())\n\t\t\t\ti = find_rule->second;\n\n\t\t\t// s = size of current rule\n\t\t\tunsigned long s = rules[i].size() - 2;\n\t\t\tss += s;\n\n\t\t\t// Overflow\n\t\t\tif(ss >= max)\n\t\t\t{\n\t\t\t\tl = lev;\n\t\t\t\tincomplete = true;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\t// Add mark char\n\t\t\tif(marker && marks[i])\n\t\t\t{\n\t\t\t\totemp += '@';\n\t\t\t\totemp += std::string(rules[i], 2, s);\n\t\t\t\totemp += '@';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Copy\n\t\t\t\totemp += std::string(rules[i], 2, s);\n\t\t\t}\n\t\t}\n\n\t\t// Copy the temp string to object_string and repeat cycle\n\t\tobject_string = otemp;\n\t}\n}\n\n// Save mutated ls-system for re-run\nvoid L_save()\n{\n/*\n\tremove(\"mutation.ls\");\n\tFILE* f = fopen(\"mutation.ls\", \"wt\");\n\tif(!f)\n\t\tUser_error(\"Cannot open file [mutation.ls]\");\n\n\tfprintf(f, \"%d\\n\", lev);\n\tfprintf(f, \"%g\\n\", (ang / 3.141592654) * 180.0);\n\tfprintf(f, \"%g\\n\", thick * 100.0);\n\n\tfprintf(f, \"%s\\n\", object_string.c_str());\n\n\tfor(unsigned long i = 0; i < rules.size(); i++)\n\t\t{\n\t\t\tif(rules[i][0] == '+')\n\t\t\t\tbreak;\n\n\t\t\tfprintf(f, \"%s\\n\", rules[i].c_str());\n\t\t}\n\n\tfprintf(f, \"@\\n\");\n\tfclose(f);\n*/\n}\n\n// Read a (xx) value from a production string\n// at location j and return it as k3d::double_t\nk3d::double_t parse_value(unsigned long& j)\n{\n\t// Skip current character and '('\n\tj += 2;\n\n\tstd::string val(\"\");\n\twhile(object_string[j] != ')')\n\t\tval += object_string[j++];\n\n\tstd::stringstream scan(val);\n\tk3d::double_t r = 0.0;\n\tscan >> r;\n\n\tif(last_recur)\n\t\treturn r * fraction;\n\n\treturn r;\n}\n\n// Set up a rotation matrix\nk3d::vector3 C1, C2, C3;\n\nvoid set_rotation_matrix(k3d::double_t a, k3d::vector3 n)\n{\n\tk3d::double_t cosa = cos(a);\n\tk3d::double_t sina = sin(a);\n\n\tk3d::double_t n11 = n[0] * n[0];\n\tk3d::double_t n22 = n[1] * n[1];\n\tk3d::double_t n33 = n[2] * n[2];\n\n\tk3d::double_t nxy = n[0] * n[1];\n\tk3d::double_t nxz = n[0] * n[2];\n\tk3d::double_t nyz = n[1] * n[2];\n\n\tC1[0] = n11 + (1.0 - n11) * cosa;\n\tC1[1] = nxy * (1.0 - cosa) - n[2] * sina;\n\tC1[2] = nxz * (1.0 - cosa) + n[1] * sina;\n\n\tC2[0] = nxy * (1.0 - cosa) + n[2] * sina;\n\tC2[1] = n22 + (1.0 - n22) * cosa;\n\tC2[2] = nyz * (1.0 - cosa) - n[0] * sina;\n\n\tC3[0] = nxz * (1.0 - cosa) - n[1] * sina;\n\tC3[1] = nyz * (1.0 - cosa) + n[0] * sina;\n\tC3[2] = n33 + (1.0 - n33) * cosa;\n}\n\nk3d::vector3 rotate(const k3d::vector3& In)\n{\n\treturn k3d::normalize(k3d::vector3(C1 * In, C2 * In, C3 * In));\n}\n\n// Process a production string and generate form\nvoid L_draw(const context& Context, const k3d::signed_axis Orientation)\n{\n\t// Save values\n\tk3d::double_t thick_l = 0;\n\tk3d::double_t ang_l = 0;\n\tk3d::double_t dis_l = 0;\n\tk3d::double_t dis2_l = 0;\n\tk3d::double_t trope_l = 0;\n\n\tbool poly_on = false;\n\n\t// Setup vectors\n\tk3d::point3 pos(0.0, 0.0, 0.0);\n\tk3d::vector3 fow(0.0, 0.0, 1.0);\n\tk3d::vector3 lef(0.0, 1.0, 0.0);\n\tk3d::vector3 upp(1.0, 0.0, 0.0);\n\n\ttrope = k3d::normalize(trope);\n\n\tfor(unsigned long i = 0; i < object_string.size(); i++)\n\t{\n\t\t// Overflow\n\t\tif(polcount > poly_limit)\n\t\t\tbreak;\n\n\t\t// The next char in the string\n\t\tchar next = object_string[i + 1];\n\n\t\t// The current char in the string\n\t\tswitch(object_string[i])\n\t\t{\n\t\t\tdefault:\n\t\t\t\tbreak;\n\n\t\t\t// Marks last recursion level during growing phase\n\t\t\tcase '@':\n\t\t\t\tlast_recur = !last_recur;\n\t\t\t\tif(last_recur)\n\t\t\t\t{\n\t\t\t\t\t// Store all variables and do fraction\n\t\t\t\t\tthick_l = thick;\n\t\t\t\t\tang_l = ang;\n\t\t\t\t\tdis_l = dis;\n\t\t\t\t\tdis2_l = dis2;\n\t\t\t\t\ttrope_l = trope_amount;\n\n\t\t\t\t\tdis *= fraction;\n\t\t\t\t\tdis2 *= fraction;\n\t\t\t\t\tthick *= fraction;\n\t\t\t\t\tang *= fraction;\n\t\t\t\t\ttrope_amount *= fraction;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Restore\n\t\t\t\t\tthick = thick_l;\n\t\t\t\t\tang = ang_l;\n\t\t\t\t\tdis = dis_l;\n\t\t\t\t\tdis2 = dis2_l;\n\t\t\t\t\ttrope_amount = trope_l;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase '+':\n\t\t\t\tsave.ang = ang;\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tang = 0.017453 * parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tang *= fraction;\n\t\t\t\t}\n\n\t\t\t\tset_rotation_matrix(-ang, upp);\n\t\t\t\tfow = rotate(fow);\n\t\t\t\tlef = rotate(lef);\n\t\t\t\tang = save.ang;\n\t\t\tbreak;\n\n\t\t\tcase '-':\n\t\t\t\tsave.ang = ang;\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tang = 0.017453 * parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tang *= fraction;\n\t\t\t\t}\n\n\t\t\t\tset_rotation_matrix(ang, upp);\n\t\t\t\tfow = rotate(fow);\n\t\t\t\tlef = rotate(lef);\n\t\t\t\tang = save.ang;\n\t\t\tbreak;\n\n\t\t\tcase '~':\n\t\t\t{\n\t\t\t\tk3d::double_t r = 6.0;\n\t\t\t\tif(next == '(')\n\t\t\t\t\tr = 0.017453 * parse_value(i);\n\t\t\t\telse if(rand_set)\n\t\t\t\t\tr = 0.017453 * rand_amount;\n\n\t\t\t\tk3d::double_t a = Rnd() * r * 2.0 - r;\n\t\t\t\tset_rotation_matrix(a, upp);\n\t\t\t\tfow = rotate(fow);\n\t\t\t\tlef = rotate(lef);\n\t\t\t\ta = (Rnd() * r * 2.0) - r;\n\t\t\t\tset_rotation_matrix(a, lef);\n\t\t\t\tfow = rotate(fow);\n\t\t\t\tupp = rotate(upp);\n\t\t\t\ta = (Rnd() * r * 2.0) - r;\n\t\t\t\tset_rotation_matrix(a, fow);\n\t\t\t\tlef = rotate(lef);\n\t\t\t\tupp = rotate(upp);\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 't':\n\t\t\t{\n\t\t\t\tif((fow[0] == 0.0) && (fow[1] == 0.0))\n\t\t\t\t\tbreak;\n\n\t\t\t\tsave.tr = tr;\n\t\t\t\tif(trope_set)\n\t\t\t\t\ttr = trope_amount;\n\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\ttr = parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\ttr *= fraction;\n\t\t\t\t}\n\n\t\t\t\ttrope = fow;\n\t\t\t\ttrope[0] = -trope[0];\n\t\t\t\ttrope[1] = -trope[1];\n\t\t\t\ttrope[2] = 0.0;\n\t\t\t\ttrope = k3d::normalize(trope);\n\t\t\t\tk3d::double_t r = tr * (fow * trope);\n\t\t\t\tset_rotation_matrix(-r, lef);\n\t\t\t\tfow = rotate(fow);\n\t\t\t\tupp = rotate(upp);\n\t\t\t\ttr = save.tr;\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase '$':\n\t\t\t{\n\t\t\t\tk3d::vector3 v = fow - sky;\n\t\t\t\tif(v.length() == 0.0)\n\t\t\t\t\tbreak;\n\n\t\t\t\tlef = fow ^ sky;\n\t\t\t\tupp = fow ^ lef;\n\t\t\t\tif(upp[2] < 0.0)\n\t\t\t\t{\n\t\t\t\t\tupp = -upp;\n\t\t\t\t\tlef = -lef;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase '&':\n\t\t\t\tsave.ang = ang;\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tang = 0.017453 * parse_value(i);\n\t\t\t\t\t if(last_recur)\n\t\t\t\t\tang *= fraction;\n\t\t\t\t}\n\n\t\t\t\tset_rotation_matrix(ang, lef);\n\t\t\t\tfow = rotate(fow);\n\t\t\t\tupp = rotate(upp);\n\t\t\t\tang = save.ang;\n\t\t\tbreak;\n\n\t\t\tcase '^':\n\t\t\t\tsave.ang = ang;\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tang = 0.017453 * parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tang *= fraction;\n\t\t\t\t}\n\n\t\t\t\tset_rotation_matrix(-ang, lef);\n\t\t\t\tfow = rotate(fow);\n\t\t\t\tupp = rotate(upp);\n\t\t\t\tang = save.ang;\n\t\t\tbreak;\n\n\t\t\tcase '<':\n\t\t\t\tsave.ang = ang;\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tang = 0.017453 * parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tang *= fraction;\n\t\t\t\t}\n\n\t\t\t\tset_rotation_matrix(-ang, fow);\n\t\t\t\tlef = rotate(lef);\n\t\t\t\tupp = rotate(upp);\n\t\t\t\tang = save.ang;\n\t\t\tbreak;\n\n\t\t\tcase '>':\n\t\t\t\tsave.ang = ang;\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tang = 0.017453 * parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tang *= fraction;\n\t\t\t\t}\n\n\t\t\t\tset_rotation_matrix(ang, fow);\n\t\t\t\tlef = rotate(lef);\n\t\t\t\tupp = rotate(upp);\n\t\t\t\tang = save.ang;\n\t\t\tbreak;\n\n\t\t\tcase '%':\n\t\t\t\tset_rotation_matrix(3.141592654, fow);\n\t\t\t\tlef = rotate(lef);\n\t\t\t\tupp = rotate(upp);\n\t\t\tbreak;\n\n\t\t\tcase '|':\n\t\t\t\tset_rotation_matrix(3.141592654, upp);\n\t\t\t\tfow = rotate(fow);\n\t\t\t\tlef = rotate(lef);\n\t\t\tbreak;\n\n\t\t\tcase '!':\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tthick *= 1.0 + fraction * (parse_value(i) - 1.0);\n\t\t\t\t\telse\n\t\t\t\t\t\tthick *= parse_value(i);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tthick *= 1.0 + fraction * (0.7 - 1.0);\n\t\t\t\t\telse\n\t\t\t\t\t\tthick *= 0.7;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase '?':\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tthick *= 1.0 + fraction * (parse_value(i) - 1.0);\n\t\t\t\t\telse\n\t\t\t\t\t\tthick *= parse_value(i);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tthick /= 1.0 + fraction * (0.7 - 1.0);\n\t\t\t\t\telse\n\t\t\t\t\t\tthick /= 0.7;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase ':':\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tang *= 1.0 + fraction * (parse_value(i) - 1.0);\n\t\t\t\t\telse\n\t\t\t\t\t\tang *= parse_value(i);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tang *= 1.0 + fraction * (0.9 - 1.0);\n\t\t\t\t\telse\n\t\t\t\t\t\tang *= 0.9;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase ';':\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tang *= 1.0 + fraction * (parse_value(i) - 1.0);\n\t\t\t\t\telse\n\t\t\t\t\t\tang *= parse_value(i);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tang /= 1.0 + fraction * (0.9 - 1.0);\n\t\t\t\t\telse\n\t\t\t\t\t\tang /= 0.9;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase '\\'':\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tk3d::double_t r = parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t{\n\t\t\t\t\t\tdis *= 1.0 + fraction * (r - 1.0);\n\t\t\t\t\t\tdis2 *= 1.0 + fraction * (r - 1.0);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdis *= r;\n\t\t\t\t\t\tdis2 *= r;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t{\n\t\t\t\t\t\tdis *= 1.0 + fraction * (0.9 - 1.0);\n\t\t\t\t\t\tdis2 *= 1.0 + fraction * (0.9 - 1.0);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdis *= 0.9;\n\t\t\t\t\t\tdis2 *= 0.9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase '\"':\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tk3d::double_t r = parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t{\n\t\t\t\t\t\tdis *= 1.0 + fraction * (r - 1.0);\n\t\t\t\t\t\tdis2 *= 1.0 + fraction * (r - 1.0);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdis *= r;\n\t\t\t\t\t\tdis2 *= r;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t{\n\t\t\t\t\t\tdis /= 1.0 + fraction * (0.9 - 1.0);\n\t\t\t\t\t\tdis2 /= 1.0 + fraction * (0.9 - 1.0);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdis /= 0.9;\n\t\t\t\t\t\tdis2 /= 0.9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 'Z':\n\t\t\t{\n\t\t\t\tsave.dis2 = dis2;\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tdis2 = parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tdis2 *= fraction;\n\t\t\t\t}\n\n\t\t\t\tk3d::point3 end = pos + dis2 * fow;\n\t\t\t\tif(closed_form)\n\t\t\t\t\tadd_cylinder(pos, end, upp, col, Context, Orientation);\n\t\t\t\telse\n\t\t\t\t\tadd_cube(pos, end, upp, col, Context, Orientation);\n\n\t\t\t\tpos = end;\n\t\t\t\tdis2 = save.dis2;\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 'F':\n\t\t\t{\n\t\t\t\tsave.dis = dis;\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tdis = parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tdis *= fraction;\n\t\t\t\t}\n\n\t\t\t\tk3d::point3 end = pos + dis * fow;\n\t\t\t\tif(closed_form)\n\t\t\t\t\tadd_cylinder(pos, end, upp, col, Context, Orientation);\n\t\t\t\telse\n\t\t\t\t\tadd_cube(pos, end, upp, col, Context, Orientation);\n\n\t\t\t\tpos = end;\n\t\t\t\tdis = save.dis;\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase '[':\n\t\t\t{\n\t\t\t\ts_rec new_rec;\n\t\t\t\tnew_rec.pos = pos;\n\t\t\t\tnew_rec.fow = fow;\n\t\t\t\tnew_rec.lef = lef;\n\t\t\t\tnew_rec.upp = upp;\n\t\t\t\tnew_rec.col = col;\n\t\t\t\tnew_rec.dis = dis;\n\t\t\t\tnew_rec.dis2 = dis2;\n\t\t\t\tnew_rec.ang = ang;\n\t\t\t\tnew_rec.thick = thick;\n\t\t\t\tnew_rec.tr = tr;\n\n\t\t\t\tif(closed_form)\n\t\t\t\t{\n\t\t\t\t\tnew_rec.last = last;\n\t\t\t\t\tnew_rec.last_col = last_col;\n\t\t\t\t\tfor(unsigned long j = 0; j < 8; j++)\n\t\t\t\t\t\tnew_rec.last_v[j] = last_v[j];\n\t\t\t\t}\n\n\t\t\t\tif(stack.size() < max_stack_size)\n\t\t\t\t\tstack.push(new_rec);\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase ']':\n\t\t\t{\n\t\t\t\tif(!stack.size())\n\t\t\t\t\tbreak;\n\n\t\t\t\ts_rec old_rec = stack.top();\n\t\t\t\tpos = old_rec.pos;\n\t\t\t\tfow = old_rec.fow;\n\t\t\t\tlef = old_rec.lef;\n\t\t\t\tupp = old_rec.upp;\n\t\t\t\tcol = old_rec.col;\n\t\t\t\tdis = old_rec.dis;\n\t\t\t\tdis2 = old_rec.dis2;\n\t\t\t\tang = old_rec.ang;\n\t\t\t\tthick = old_rec.thick;\n\t\t\t\ttr = old_rec.tr;\n\t\t\t\tif(closed_form)\n\t\t\t\t{\n\t\t\t\t\tlast = old_rec.last;\n\t\t\t\t\tlast_col = old_rec.last_col;\n\t\t\t\t\tfor(unsigned long j = 0; j < 8; j++)\n\t\t\t\t\t\tlast_v[j] = old_rec.last_v[j];\n\t\t\t\t}\n\n\t\t\t\tstack.pop();\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase '{':\n\t\t\t\tif(poly_on)\n\t\t\t\t{\n\t\t\t\t\tvectors_t new_rec = vertices;\n\t\t\t\t\tif(pstack.size() < max_stack_size)\n\t\t\t\t\t\tpstack.push(new_rec);\n\t\t\t\t}\n\n\t\t\t\tpoly_on = true;\n\n\t\t\t\tvertices.clear();\n\t\t\t\tvertices.push_back(pos);\n\t\t\tbreak;\n\n\t\t\tcase 'f':\n\t\t\t\tsave.dis = dis;\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tdis = parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tdis *= fraction;\n\t\t\t\t}\n\n\t\t\t\tpos = pos + dis * fow;\n\t\t\t\tif(poly_on)\n\t\t\t\t\tvertices.push_back(pos);\n\n\t\t\t\tdis = save.dis;\n\t\t\tbreak;\n\n\t\t\tcase '.':\n\t\t\t\tif(poly_on)\n\t\t\t\t\tvertices.push_back(pos);\n\t\t\tbreak;\n\n\t\t\tcase 'g':\n\t\t\t\tsave.dis = dis;\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tdis = parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tdis *= fraction;\n\t\t\t\t}\n\n\t\t\t\tpos = pos + dis * fow;\n\t\t\t\tdis = save.dis;\n\t\t\tbreak;\n\n\t\t\tcase 'z':\n\t\t\t\tsave.dis2 = dis2;\n\t\t\t\tif(next == '(')\n\t\t\t\t{\n\t\t\t\t\tdis2 = parse_value(i);\n\t\t\t\t\tif(last_recur)\n\t\t\t\t\t\tdis2 *= fraction;\n\t\t\t\t}\n\n\t\t\t\tpos = pos + dis2 * fow;\n\t\t\t\tif(poly_on)\n\t\t\t\t\tvertices.push_back(pos);\n\n\t\t\t\tdis2 = save.dis2;\n\t\t\tbreak;\n\n\t\t\tcase '}':\n\t\t\t\tpolygons.clear();\n\t\t\t\tif(vertices.size() > 3)\n\t\t\t\t{\n\t\t\t\t\tfor(unsigned long j = 1; j < vertices.size() - 1; j++)\n\t\t\t\t\t\tpolygons.push_back(polygon(0, j, j + 1, j + 1));\n\n\t\t\t\t\tadd_geometry(col, Context);\n\t\t\t\t}\n\n\t\t\t\tpoly_on = false;\n\t\t\t\tif(pstack.size() > 0)\n\t\t\t\t{\n\t\t\t\t\tvertices.clear();\n\n\t\t\t\t\tif(!pstack.size())\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tvertices = pstack.top();\n\t\t\t\t\tpstack.pop();\n\n\t\t\t\t\tpoly_on = true;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 'c':\n\t\t\t\tif(next == '(')\n\t\t\t\t\tcol = (unsigned long)parse_value(i);\n\t\t\t\telse\n\t\t\t\t\tcol++;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nbool l_parser(const unsigned long RandomSeed, const bool ClosedForm, const k3d::double_t Trope, const unsigned long Mutations, const unsigned long MutationSeed, const unsigned long MaximalStackSize, const context& Context, const k3d::signed_axis Orientation, const bool FlipNormals)\n{\n\t// set minimum thickness\n\t//min_thick = ;\n\n\t// set amount of trope\n\ttrope_amount = Trope;\n\n\t// create closed connected cylinders\n\tclosed_form = ClosedForm;\n\n\t// Save face orientation variables\n\torientation = Orientation;\n\tflip_normals = FlipNormals;\n\n\t// Execute mutations\n\tsrand(MutationSeed);\n\tfor(unsigned long i = 0; i < Mutations; i++)\n\t\t// Perform mutations on stored rule set\n\t\tL_mutate();\n\n\t// Create L-system production string\n\tL_system();\n\n\t// Parse production string and create geometry\n\tsrand(RandomSeed);\n\tmax_stack_size = MaximalStackSize;\n\tL_draw(Context, Orientation);\n\n\treturn true;\n}\n\n} // namespace lparser\n\n/////////////////////////////////////////////////////////////////////////////\n// l_parser\n\nclass l_parser :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tl_parser(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file_path(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"File path for lsystem description\")) + init_value(k3d::filesystem::path(k3d::share_path() / k3d::filesystem::generic_path(\"lsystem/abop-nested-polygon-leaves.ls\"))) + init_path_mode(k3d::ipath_property::READ) + init_path_type(\"lsystems\")),\n\t\tm_recursion(init_owner(*this) + init_name(\"growth\") + init_label(_(\"Growth\")) + init_description(_(\"Growth value\")) + init_value(5.0) + init_step_increment(0.1) + init_constraint(constraint::minimum<k3d::double_t>(1.0)) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_basic_angle(init_owner(*this) + init_name(\"basic_angle\") + init_label(_(\"Basic angle\")) + init_description(_(\"Basic angle\")) + init_value(10.0) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_thickness(init_owner(*this) + init_name(\"thickness\") + init_label(_(\"Thickness\")) + init_description(_(\"Thickness\")) + init_value(50.0) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_random_seed(init_owner(*this) + init_name(\"random_seed\") + init_label(_(\"Random seed\")) + init_description(_(\"Random seed\")) + init_value(0) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_size(init_owner(*this) + init_name(\"size\") + init_label(_(\"Size\")) + init_description(_(\"Size\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_closed_form(init_owner(*this) + init_name(\"closed_form\") + init_label(_(\"Closed form\")) + init_description(_(\"Closed form\")) + init_value(true)),\n\t\tm_mutations(init_owner(*this) + init_name(\"mutations\") + init_label(_(\"Mutations\")) + init_description(_(\"Mutations\")) + init_value(0) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_mutation_seed(init_owner(*this) + init_name(\"mutation_seed\") + init_label(_(\"Mutation seed\")) + init_description(_(\"Mutation seed\")) + init_value(0) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_max_stack_size(init_owner(*this) + init_name(\"max_stack_size\") + init_label(_(\"Max stack size\")) + init_description(_(\"Max stack size\")) + init_value(1000) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_orientation(init_owner(*this) + init_name(\"orientation\") + init_label(_(\"Orientation\")) + init_description(_(\"Orientation type (forward or backward along X, Y or Z axis)\")) + init_value(k3d::PZ) + init_enumeration(k3d::signed_axis_values())),\n\t\tm_flip_normals(init_owner(*this) + init_name(\"flip_normals\") + init_label(_(\"Flip normals\")) + init_description(_(\"Flip normals in case the faces are reversed\")) + init_value(false))\n\t{\n\t\tm_file_path.changed_signal().connect(sigc::mem_fun(*this, &l_parser::on_new_file));\n\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_recursion.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_basic_angle.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_thickness.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_random_seed.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_size.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_closed_form.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_mutations.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_mutation_seed.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_max_stack_size.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_orientation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_flip_normals.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\n\t\t// Init with default example\n\t\tinit_lsystem();\n\t}\n\n\tvoid init_lsystem()\n\t{\n\t\t// Load configuration file\n\t\tconst k3d::filesystem::path file_path = m_file_path.pipeline_value();\n\t\tk3d::double_t recursion, basic_angle, thickness;\n\t\tif(!lparser::load_configuration_values(file_path, recursion, basic_angle, thickness))\n\t\t\treturn;\n\n\t\t// Set configuration's default recursion values\n\t\tk3d::property::set_internal_value(m_recursion, recursion);\n\t\tk3d::property::set_internal_value(m_basic_angle, basic_angle);\n\t\tk3d::property::set_internal_value(m_thickness, thickness);\n\n\t\t// Reset bounding box\n\t\tlparser::bounding_box = k3d::bounding_box3();\n\t\tlparser::bbox_x = lparser::bbox_y = lparser::bbox_z = 0;\n\t}\n\n\tvoid on_new_file(k3d::iunknown*)\n\t{\n\t\tinit_lsystem();\n\t\tmake_update_mesh_slot()(0);\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tconst k3d::double_t recursion = m_recursion.pipeline_value();\n\t\tconst k3d::double_t basic_angle = m_basic_angle.pipeline_value();\n\t\tconst k3d::double_t thickness = m_thickness.pipeline_value();\n\t\tconst unsigned long random_seed = m_random_seed.pipeline_value();\n\t\tconst k3d::double_t size = m_size.pipeline_value();\n\t\tconst bool closed_form = m_closed_form.pipeline_value();\n\t\tconst unsigned long mutations = m_mutations.pipeline_value();\n\t\tconst unsigned long mutation_seed = m_mutation_seed.pipeline_value();\n\t\tconst unsigned long max_stack_size = m_max_stack_size.pipeline_value();\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\n\t\t// Load configuration file\n\t\tconst k3d::filesystem::path file_path = m_file_path.pipeline_value();\n\t\tif(!lparser::load_configuration_rules(recursion, basic_angle, thickness, file_path))\n\t\t\treturn;\n\n\t\t// Create geometry ...\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\n\t\tlparser::l_parser(random_seed, closed_form, 0, mutations, mutation_seed, max_stack_size, lparser::context(points, point_selection, *polyhedron, material), m_orientation.pipeline_value(), m_flip_normals.pipeline_value());\n\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\t// Cache first bounding box to allow growth\n\t\tif(lparser::bbox_x == 0 && lparser::bbox_y == 0 && lparser::bbox_z == 0)\n\t\t{\n\t\t\tlparser::bbox_x = lparser::bounding_box.width();\n\t\t\tlparser::bbox_y = lparser::bounding_box.height();\n\t\t\tlparser::bbox_z = lparser::bounding_box.depth();\n\t\t}\n\n\t\t// Resize ...\n\t\tk3d::double_t bbox_size = std::max(std::max(lparser::bbox_x, lparser::bbox_y), lparser::bbox_z);\n\t\tif(bbox_size > 0)\n\t\t{\n\t\t\tk3d::double_t new_size = 1 / bbox_size * size;\n\n\t\t\tconst k3d::uint_t point_begin = 0;\n\t\t\tconst k3d::uint_t point_end = point_begin + points.size();\n\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\tpoints[point] *= new_size;\n\t\t}\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<l_parser, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0xa637e99d, 0x707c4342, 0x8c6d4d15, 0x78c9054a),\n\t\t\t\"LSystemParser\",\n\t\t\t_(\"Generates an L-System object from a configuration file\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_recursion;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_basic_angle;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_thickness;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_random_seed;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_size;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_closed_form;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_mutations;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_mutation_seed;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_max_stack_size;\n\tk3d_data(k3d::signed_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_orientation;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_flip_normals;\n};\n\n} // namespace lsystem\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::lsystem::l_parser::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/luxrender/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-luxrender)\nK3D_CREATE_MODULE_PROXY(k3d-luxrender)\n\n"
  },
  {
    "path": "modules/luxrender/bilinear_interpolation_texture.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture.h\"\n#include \"texture2.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bilinear_interpolation_texture\n\nclass bilinear_interpolation_texture :\n\tpublic texture2,\n\tpublic color_texture\n{\n\ttypedef texture2 base;\n\npublic:\n\tbilinear_interpolation_texture(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_v00(init_owner(*this) + init_name(\"v00\") + init_label(_(\"V00\")) + init_description(_(\"V00\")) + init_value(k3d::color(1, 0, 0))),\n\t\tm_v01(init_owner(*this) + init_name(\"v01\") + init_label(_(\"V01\")) + init_description(_(\"V01\")) + init_value(k3d::color(0, 1, 0))),\n\t\tm_v10(init_owner(*this) + init_name(\"v10\") + init_label(_(\"V10\")) + init_description(_(\"V10\")) + init_value(k3d::color(0, 0, 1))),\n\t\tm_v11(init_owner(*this) + init_name(\"v11\") + init_label(_(\"V11\")) + init_description(_(\"V11\")) + init_value(k3d::color(1, 1, 1)))\n\t{\n\t}\n\n\tvoid on_setup(name_map& TextureNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"Texture \\\"\" << Name << \"\\\" \\\"color\\\" \\\"bilerp\\\"\\n\" << k3d::push_indent;\n\t\tsetup_texture2(Stream);\n\t\tStream << k3d::standard_indent << \"\\\"color v00\\\" [\" << m_v00.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"color v01\\\" [\" << m_v01.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"color v10\\\" [\" << m_v10.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"color v11\\\" [\" << m_v11.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::pop_indent; \n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bilinear_interpolation_texture,\n\t\t\tk3d::interface_list<k3d::itexture> > factory(\n\t\t\tk3d::uuid(0x9df9057c, 0x204e6f80, 0x5768e69b, 0xb5ba08ba),\n\t\t\t\"LuxRenderBilinearInterpolationTexture\",\n\t\t\t_(\"LuxRender Bilinear Interpolation Texture\"),\n\t\t\t\"LuxRender\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_v00;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_v01;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_v10;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_v11;\n};\n\nk3d::iplugin_factory& bilinear_interpolation_texture_factory()\n{\n\treturn bilinear_interpolation_texture::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/carpaint_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture_reference.h\"\n#include \"material.h\"\n#include \"scalar_texture_reference.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n\n/////////////////////////////////////////////////////////////////////////////\n// name_values\n\nstatic const k3d::ilist_property<std::string>::values_t& name_values()\n{\n\tstatic k3d::ilist_property<std::string>::values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(\"ford f8\");\n\t\tvalues.push_back(\"polaris silber\");\n\t\tvalues.push_back(\"opel titan\");\n\t\tvalues.push_back(\"bmw339\");\n\t\tvalues.push_back(\"2k acrylack\");\n\t\tvalues.push_back(\"white\");\n\t\tvalues.push_back(\"blue\");\n\t\tvalues.push_back(\"blue matte\");\n\t\tvalues.push_back(\"<custom>\");\n\t}\n\treturn values;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass carpaint_material :\n\tpublic material\n{\n\ttypedef material base;\n\npublic:\n\tcarpaint_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_name(init_owner(*this) + init_name(\"name\") + init_label(_(\"Name\")) + init_description(_(\"Paint name.\")) + init_value(k3d::string_t(\"ford f8\")) + init_values(name_values())),\n\t\tm_kd(*this, \"kd\", _(\"Kd\"), _(\"Diffuse Color\"), _(\"Kd Texture\"), k3d::color(0.2, 0.2, 0.4)),\n\t\tm_ks1(*this, \"ks1\", _(\"Ks1\"), _(\"Specular Color 1\"), _(\"Ks1 Texture\"), k3d::color(0.2, 0.2, 0.4)),\n\t\tm_ks2(*this, \"ks2\", _(\"Ks2\"), _(\"Specular Color 2\"), _(\"Ks2 Texture\"), k3d::color(0.2, 0.2, 0.4)),\n\t\tm_ks3(*this, \"ks3\", _(\"Ks3\"), _(\"Specular Color 3\"), _(\"Ks3 Texture\"), k3d::color(0.2, 0.2, 0.4)),\n\t\tm_r1(*this, \"r1\", _(\"R1\"), _(\"Fresnel Constant 1\"), _(\"R1 Texture\"), 0.1),\n\t\tm_r2(*this, \"r2\", _(\"R2\"), _(\"Fresnel Constant 2\"), _(\"R2 Texture\"), 0.1),\n\t\tm_r3(*this, \"r3\", _(\"R3\"), _(\"Fresnel Constant 3\"), _(\"R3 Texture\"), 0.1),\n\t\tm_m1(*this, \"m1\", _(\"M1\"), _(\"Microfacet Roughness 1\"), _(\"M1 Texture\"), 0.1),\n\t\tm_m2(*this, \"m2\", _(\"M2\"), _(\"Microfacet Roughness 2\"), _(\"M2 Texture\"), 0.1),\n\t\tm_m3(*this, \"m3\", _(\"M3\"), _(\"Microfacet Roughness 3\"), _(\"M3 Texture\"), 0.1)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<carpaint_material,\n\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0xa8a9550f, 0x0c496f29, 0xf31fc2a8, 0xa7467491),\n\t\t\t\"LuxRenderCarpaintMaterial\",\n\t\t\t_(\"LuxRender Carpaint Material\"),\n\t\t\t\"LuxRender Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_setup(const texture::name_map& TextureNames, material::name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tconst k3d::string_t name = m_name.pipeline_value();\n\n\t\tStream << k3d::standard_indent << \"MakeNamedMaterial \\\"\" << Name << \"\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"string type\\\" [\\\"carpaint\\\"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"string name\\\" [\\\"\" << name << \"\\\"]\\n\";\n\t\tsetup_bumpmap(TextureNames, Stream);\n\n\t\tif(name == \"<custom>\")\n\t\t{\n\t\t\tm_kd.setup(TextureNames, \"color\", \"Kd\", Stream);\n\t\t\tm_ks1.setup(TextureNames, \"color\", \"Ks1\", Stream);\n\t\t\tm_ks2.setup(TextureNames, \"color\", \"Ks2\", Stream);\n\t\t\tm_ks3.setup(TextureNames, \"color\", \"Ks3\", Stream);\n\t\t\tm_r1.setup(TextureNames, \"float\", \"R1\", Stream);\n\t\t\tm_r2.setup(TextureNames, \"float\", \"R2\", Stream);\n\t\t\tm_r3.setup(TextureNames, \"float\", \"R3\", Stream);\n\t\t\tm_m1.setup(TextureNames, \"float\", \"M1\", Stream);\n\t\t\tm_m2.setup(TextureNames, \"float\", \"M2\", Stream);\n\t\t\tm_m3.setup(TextureNames, \"float\", \"M3\", Stream);\n\t\t}\n\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_name;\n\tcolor_texture_reference m_kd;\n\tcolor_texture_reference m_ks1;\n\tcolor_texture_reference m_ks2;\n\tcolor_texture_reference m_ks3;\n\tscalar_texture_reference m_r1;\n\tscalar_texture_reference m_r2;\n\tscalar_texture_reference m_r3;\n\tscalar_texture_reference m_m1;\n\tscalar_texture_reference m_m2;\n\tscalar_texture_reference m_m3;\n};\n\nk3d::iplugin_factory& carpaint_material_factory()\n{\n\treturn carpaint_material::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/color_texture.h",
    "content": "#ifndef MODULES_LUXRENDER_COLOR_TEXTURE_H\n#define MODULES_LUXRENDER_COLOR_TEXTURE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/itexture.h>\n#include <k3dsdk/types.h>\n\n#include <iosfwd>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// color_texture\n\n/// Abstract interface for LuxRender color texture nodes.\nclass color_texture :\n\tpublic k3d::itexture\n{\npublic:\n};\n\n} // namespace luxrender\n\n} // namespace module\n\n#endif // !MODULES_LUXRENDER_COLOR_TEXTURE_H\n\n"
  },
  {
    "path": "modules/luxrender/color_texture_reference.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture.h\"\n#include \"color_texture_reference.h\"\n\n#include <k3dsdk/iomanip.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// color_texture_reference\n\nvoid color_texture_reference::setup(const texture::name_map& TextureNames, const k3d::string_t& Type, const k3d::string_t& Name, std::ostream& Stream)\n{\n\tif(texture* const texture_node = dynamic_cast<texture*>(m_texture.pipeline_value()))\n\t{\n\t\ttexture::use(TextureNames, texture_node, Name, Stream);\n\t\treturn;\n\t}\n\n\tStream << k3d::standard_indent << \"\\\"\" << Type << \" \" << Name << \"\\\" [\" << m_color.pipeline_value() << \"]\\n\";\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/color_texture_reference.h",
    "content": "#ifndef MODULES_LUXRENDER_COLOR_TEXTURE_REFERENCE_H\n#define MODULES_LUXRENDER_COLOR_TEXTURE_REFERENCE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture.h\"\n#include \"texture.h\"\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/itexture.h>\n#include <k3dsdk/tokens.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// color_texture_reference\n\n/// Wraps a set of K-3D properties for use as a LuxRender color texture.\nclass color_texture_reference\n{\npublic:\n\ttemplate<typename OwnerT>\n\tcolor_texture_reference(OwnerT& Owner, const char* const Name, const char* const Label, const char* const Description, const char* const TextureLabel, const k3d::color& Value) :\n\tm_color(\n\t\tinit_owner(Owner)\n\t\t+ init_name(Name)\n\t\t+ init_label(Label)\n\t\t+ init_description(Description)\n\t\t+ init_value(Value)\n\t\t),\n\tm_texture(\n\t\tinit_owner(Owner)\n\t\t+ init_name(k3d::make_token((k3d::string_t(Name) + \"_texture\").c_str()))\n\t\t+ init_label(TextureLabel)\n\t\t+ init_description(Description)\n\t\t+ init_value(static_cast<color_texture*>(0))\n\t\t)\n\t{\n\t}\n\n\t/// Inserts the texture state into a LuxRender scene as part of a Material definition.\n\tvoid setup(const texture::name_map& TextureNames, const k3d::string_t& Type, const k3d::string_t& Name, std::ostream& Stream);\n\nprivate:\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(color_texture*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_texture;\n};\n\n} // namespace luxrender\n\n} // namespace module\n\n#endif // !MODULES_LUXRENDER_COLOR_TEXTURE_REFERENCE_H\n\n"
  },
  {
    "path": "modules/luxrender/distant_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n#include \"utility.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/vector3.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// distant_light\n\nclass distant_light :\n\tpublic light\n{\n\ttypedef light base;\n\npublic:\n\tdistant_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_from(init_owner(*this) + init_name(\"from\") + init_label(_(\"From\")) + init_description(_(\"Light origin.\")) + init_value(k3d::point3(0, 0, 1))),\n\t\tm_to(init_owner(*this) + init_name(\"to\") + init_label(_(\"To\")) + init_description(_(\"Light target.\")) + init_value(k3d::point3(0, 0, 0))),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Light color.\")) + init_value(k3d::color(1, 1, 1)))\n\t{\n\t}\n\n\tvoid on_setup(std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"LightSource \\\"distant\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"point from\\\" [\" << convert(m_from.pipeline_value()) << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"point to\\\" [\" << convert(m_to.pipeline_value()) << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"color L\\\" [\" << m_color.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<distant_light> factory(\n\t\t\tk3d::uuid(0xb303503d, 0xc2448c83, 0xe363b7a6, 0x275afc81),\n\t\t\t\"LuxRenderDistantLight\",\n\t\t\t_(\"LuxRender Distant Light\"),\n\t\t\t\"LuxRender Light\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::point3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_from;\n\tk3d_data(k3d::point3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_to;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n};\n\nk3d::iplugin_factory& distant_light_factory()\n{\n\treturn distant_light::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/environment_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n#include \"utility.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/path.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// environment_light\n\nclass environment_light :\n\tpublic light\n{\n\ttypedef light base;\n\npublic:\n\tenvironment_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"The color of the light.\")) + init_value(k3d::color(1, 1, 1))),\n\t\tm_samples(init_owner(*this) + init_name(\"samples\") + init_label(_(\"Samples\")) + init_description(_(\"Shadow samples.\")) + init_value(1)),\n\t\tm_map(init_owner(*this) + init_name(\"map\") + init_label(_(\"Map\")) + init_description(_(\"Path to an HDR environment map.\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(\"hdr\"))\n\t{\n\t}\n\n\tvoid on_setup(std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"LightSource \\\"infinite\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"color L\\\" [\" << m_color.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"integer nsamples\\\" [\" << m_samples.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"string mapname\\\" [\\\"\" << m_map.pipeline_value().native_filesystem_string() << \"\\\"]\\n\";\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<environment_light> factory(\n\t\t\tk3d::uuid(0x88c6e2b5, 0xb64bcd1e, 0x03861c9e, 0x034584f8),\n\t\t\t\"LuxRenderEnvironmentLight\",\n\t\t\t_(\"LuxRender EnvironmentLight\"),\n\t\t\t\"LuxRender Light\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_samples;\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, with_serialization) m_map;\n};\n\nk3d::iplugin_factory& environment_light_factory()\n{\n\treturn environment_light::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/glass_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture_reference.h\"\n#include \"material.h\"\n#include \"scalar_texture_reference.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass glass_material :\n\tpublic material\n{\n\ttypedef material base;\n\npublic:\n\tglass_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_kr(*this, \"kr\", _(\"Kr\"), _(\"Surface reflectivity.\"), _(\"Kr Texture\"), k3d::color(1, 1, 1)),\n\t\tm_kt(*this, \"kt\", _(\"Kt\"), _(\"Fraction of light transmitted through the surface.\"), _(\"Kt Texture\"), k3d::color(1, 1, 1)),\n\t\tm_index(*this, \"index\", _(\"Index\"), _(\"Index of refraction.\"), _(\"Index Texture\"), 1.5),\n\t\tm_cauchy_b(*this, \"cauchy_b\", _(\"Cauchy B\"), _(\"Cauchy B coefficient.\"), _(\"Cauchy B Texture\"), 0.0),\n\t\tm_film(*this, \"film\", _(\"Film\"), _(\"Thin film coating thickness (nanometers).\"), _(\"Film Texture\"), 0.001),\n\t\tm_film_index(*this, \"film_index\", _(\"Film Index\"), _(\"Index of refraction of the thin film coating.\"), _(\"Film Index Texture\"), 1.5)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<glass_material,\n\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0x3fd264f3, 0xd7478ccc, 0xb6992185, 0x4c0c9dd2),\n\t\t\t\"LuxRenderGlassMaterial\",\n\t\t\t_(\"LuxRender Glass Material\"),\n\t\t\t\"LuxRender Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_setup(const texture::name_map& TextureNames, material::name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"MakeNamedMaterial \\\"\" << Name << \"\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"string type\\\" [\\\"glass\\\"]\\n\";\n\t\t\n\t\tsetup_bumpmap(TextureNames, Stream);\n\t\tm_kr.setup(TextureNames, \"color\", \"Kr\", Stream);\n\t\tm_kt.setup(TextureNames, \"color\", \"Kt\", Stream);\n\t\tm_index.setup(TextureNames, \"float\", \"index\", Stream);\n\t\tm_cauchy_b.setup(TextureNames, \"float\", \"cauchyb\", Stream);\n\t\tm_film.setup(TextureNames, \"float\", \"film\", Stream);\n\t\tm_film_index.setup(TextureNames, \"float\", \"filmindex\", Stream);\n\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tcolor_texture_reference m_kr;\n\tcolor_texture_reference m_kt;\n\tscalar_texture_reference m_index;\n\tscalar_texture_reference m_cauchy_b;\n\tscalar_texture_reference m_film;\n\tscalar_texture_reference m_film_index;\n};\n\nk3d::iplugin_factory& glass_material_factory()\n{\n\treturn glass_material::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/glossy_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture_reference.h\"\n#include \"material.h\"\n#include \"scalar_texture_reference.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass glossy_material :\n\tpublic material\n{\n\ttypedef material base;\n\npublic:\n\tglossy_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_kd(*this, \"kd\", _(\"Kd\"), _(\"Diffuse color.\"), _(\"Kd Texture\"), k3d::color(1, 1, 1)),\n\t\tm_ks(*this, \"ks\", _(\"Ks\"), _(\"Specular color.\"), _(\"Ks Texture\"), k3d::color(1, 1, 1)),\n\t\tm_ka(*this, \"ka\", _(\"Ka\"), _(\"Absorptive color.\"), _(\"Ka Texture\"), k3d::color(1, 1, 1)),\n\t\tm_u_roughness(*this, \"u_roughness\", _(\"U Roughness\"), _(\"Surface roughness along the u direction.\"), _(\"U Roughness Texture\"), 0.0),\n\t\tm_v_roughness(*this, \"v_roughness\", _(\"V Roughness\"), _(\"Surface roughness along the v direction.\"), _(\"V Roughness Texture\"), 0.001),\n\t\tm_d(*this, \"d\", _(\"D\"), _(\"Depth of the coating layer for absorption effects.\"), _(\"D Texture\"), 1.5)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<glossy_material,\n\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0x19218403, 0x5c41d9e1, 0xa1588597, 0xcb609e56),\n\t\t\t\"LuxRenderGlossyMaterial\",\n\t\t\t_(\"LuxRender Glossy Material\"),\n\t\t\t\"LuxRender Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_setup(const texture::name_map& TextureNames, material::name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"MakeNamedMaterial \\\"\" << Name << \"\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"string type\\\" [\\\"glossy\\\"]\\n\";\n\t\t\n\t\tsetup_bumpmap(TextureNames, Stream);\n\t\tm_kd.setup(TextureNames, \"color\", \"Kd\", Stream);\n\t\tm_ks.setup(TextureNames, \"color\", \"Ks\", Stream);\n\t\tm_ka.setup(TextureNames, \"color\", \"Ka\", Stream);\n\t\tm_u_roughness.setup(TextureNames, \"float\", \"uroughness\", Stream);\n\t\tm_v_roughness.setup(TextureNames, \"float\", \"vroughness\", Stream);\n\t\tm_d.setup(TextureNames, \"float\", \"d\", Stream);\n\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tcolor_texture_reference m_kd;\n\tcolor_texture_reference m_ks;\n\tcolor_texture_reference m_ka;\n\tscalar_texture_reference m_u_roughness;\n\tscalar_texture_reference m_v_roughness;\n\tscalar_texture_reference m_d;\n};\n\nk3d::iplugin_factory& glossy_material_factory()\n{\n\treturn glossy_material::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/goniometric_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transformable.h>\n#include <k3dsdk/transform.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// goniometric_light\n\nclass goniometric_light :\n\tpublic k3d::gl::renderable<k3d::transformable<light > >\n{\n\ttypedef k3d::gl::renderable<k3d::transformable<light > > base;\n\npublic:\n\tgoniometric_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_quadric(gluNewQuadric()),\n\t\tm_color(init_owner(*this) + init_name(\"L\") + init_label(_(\"Color\")) + init_description(_(\"Color\")) + init_value(k3d::color(0.8, 0.8, 0.8))),\n\t\tm_map(init_owner(*this) + init_name(\"map\") + init_label(_(\"Map\")) + init_description(_(\"Path to goniometric file.\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(\"ies\"))\n\t{\n\t\tm_input_matrix.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\t~goniometric_light()\n\t{\n\t\tgluDeleteQuadric(m_quadric);\n\t}\n\n\tvoid on_setup(std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"Transform [\" << convert(k3d::node_to_world_matrix(*this)) << \"]\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"LightSource \\\"goniometric\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"color L\\\" [\" << m_color.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"string mapname\\\" [\\\"\" << m_map.pipeline_value().native_filesystem_string() << \"\\\"]\\n\";\n\t\tStream << k3d::pop_indent << k3d::pop_indent;\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, State.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.8, 0.8, 0.2));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0.5, 0.5, 0));\n\n\t\tglEnable(GL_LIGHTING);\n\t\tdraw_geometry();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglDisable(GL_LIGHTING);\n\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw_geometry();\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<goniometric_light,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::uuid(0x4e372287, 0x66475408, 0x1b51468e, 0x8979b418),\n\t\t\t\t\"LuxRenderGoniometricLight\",\n\t\t\t\t_(\"LuxRender Goniometric Light\"),\n\t\t\t\t\"LuxRender Light\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid draw_geometry()\n\t{\n\t\tgluSphere(m_quadric, 0.5, 8, 8);\n\t}\n\n\t/// Stores a GLU quadric object for drawing the manipulators\n\tGLUquadricObj* const m_quadric;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, with_serialization) m_map;\n};\n\nk3d::iplugin_factory& goniometric_light_factory()\n{\n\treturn goniometric_light::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/image_texture.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture.h\"\n#include \"texture2.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// wrap_values\n\nstatic const k3d::ilist_property<std::string>::values_t& wrap_values()\n{\n\tstatic k3d::ilist_property<std::string>::values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(\"repeat\");\n\t\tvalues.push_back(\"black\");\n\t\tvalues.push_back(\"clamp\");\n\t}\n\treturn values;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// filtertype_values\n\nstatic const k3d::ilist_property<std::string>::values_t& filtertype_values()\n{\n\tstatic k3d::ilist_property<std::string>::values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(\"bilinear\");\n\t\tvalues.push_back(\"mipmap_trilinear\");\n\t\tvalues.push_back(\"mapmap_ewa\");\n\t\tvalues.push_back(\"nearest\");\n\t}\n\treturn values;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// image_texture\n\nclass image_texture :\n\tpublic texture2,\n\tpublic color_texture\n{\n\ttypedef texture2 base;\n\npublic:\n\timage_texture(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Path to a bitmap image.\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(\"texture\")),\n\t\tm_wrap(init_owner(*this) + init_name(\"wrap\") + init_label(_(\"Wrap\")) + init_description(_(\"Specifies how to wrap the texture.\")) + init_value(k3d::string_t(\"repeat\")) + init_values(wrap_values())),\n\t\tm_filtertype(init_owner(*this) + init_name(\"filtertype\") + init_label(_(\"Filter\")) + init_description(_(\"Specifies how to filter the texture.\")) + init_value(k3d::string_t(\"bilinear\")) + init_values(filtertype_values())),\n\t\tm_gain(init_owner(*this) + init_name(\"gain\") + init_label(_(\"Gain\")) + init_description(_(\"Applies a gain function to the texture.\")) + init_value(1.0)),\n\t\tm_gamma(init_owner(*this) + init_name(\"gamma\") + init_label(_(\"Gamma\")) + init_description(_(\"Applies a gamma function to the texture.\")) + init_value(2.2))\n\t{\n\t}\n\n\tvoid on_setup(name_map& TextureNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"Texture \\\"\" << Name << \"\\\" \\\"color\\\" \\\"imagemap\\\"\\n\" << k3d::push_indent;\n\t\tsetup_texture2(Stream);\n\t\tStream << k3d::standard_indent << \"\\\"string filename\\\" [\\\"\" << m_file.pipeline_value().native_filesystem_string() << \"\\\"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"string wrap\\\" [\\\"\" << m_wrap.pipeline_value() << \"\\\"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"string filtertype\\\" [\\\"\" << m_filtertype.pipeline_value() << \"\\\"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"float gain\\\" [\" << m_gain.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"float gamma\\\" [\" << m_gamma.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::pop_indent; \n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<image_texture,\n\t\t\tk3d::interface_list<k3d::itexture> > factory(\n\t\t\tk3d::uuid(0x4c6d4e1b, 0x46488112, 0xc82d33a9, 0x0518b7df),\n\t\t\t\"LuxRenderImageTexture\",\n\t\t\t_(\"LuxRender Image Texture\"),\n\t\t\t\"LuxRender\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, with_serialization) m_file;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_wrap;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_filtertype;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_gain;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_gamma;\n};\n\nk3d::iplugin_factory& image_texture_factory()\n{\n\treturn image_texture::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/iomanip.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// light\n\nlight::light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\tk3d::node(Factory, Document),\n\tm_group(init_owner(*this) + init_name(\"group\") + init_label(_(\"Light Group\")) + init_description(_(\"Light group.\")) + init_value(k3d::string_t(\"default\")))\n{\n}\n\nvoid light::setup(std::ostream& Stream)\n{\n\tStream << k3d::standard_indent << \"AttributeBegin\\n\" << k3d::push_indent;\n\tStream << k3d::standard_indent << \"LightGroup \\\"\" << m_group.pipeline_value() << \"\\\"\\n\";\n\n\ton_setup(Stream);\n\n\tStream << k3d::pop_indent << k3d::standard_indent << \"AttributeEnd\\n\";\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/light.h",
    "content": "#ifndef MODULES_LUXRENDER_LIGHT_H\n#define MODULES_LUXRENDER_LIGHT_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/node.h>\n\n#include <iosfwd>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// light\n\n/// Abstract interface for LuxRender light nodes.\nclass light :\n\tpublic k3d::node\n{\npublic:\n\tlight(k3d::iplugin_factory& Factory, k3d::idocument& Document);\n\n\tvoid setup(std::ostream& Stream);\n\nprivate:\n\t/// Implemented in derivatives to do the actual work of inserting the light definition into the scene.\n\tvirtual void on_setup(std::ostream& Stream) = 0;\n\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_group;\n};\n\n} // namespace luxrender\n\n} // namespace module\n\n#endif // !MODULES_LUXRENDER_LIGHT_H\n"
  },
  {
    "path": "modules/luxrender/material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"material.h\"\n#include \"scalar_texture.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/material.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nmaterial::material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\tk3d::node(Factory, Document),\n\tm_bumpmap(\n\t\tinit_owner(*this)\n\t\t+ init_name(\"bumpmap\")\n\t\t+ init_label(_(\"Bumpmap\"))\n\t\t+ init_description(_(\"Optional bumpmap texture.\"))\n\t\t+ init_value(static_cast<scalar_texture*>(0))\n\t\t)\n{\n}\n\nvoid material::setup(const texture::name_map& TextureNames, name_map& MaterialNames, std::ostream& Stream)\n{\n\tif(MaterialNames.count(this))\n\t\treturn;\n\n\tstd::ostringstream name_buffer;\n\tname_buffer << \"Material\" << MaterialNames.size();\n\tconst k3d::string_t name = name_buffer.str();\n\n\tMaterialNames.insert(std::make_pair(this, name));\n\n\ton_setup(TextureNames, MaterialNames, name, Stream);\n}\n\nvoid material::setup_bumpmap(const texture::name_map& TextureNames, std::ostream& Stream)\n{\n\tif(texture* const texture_node = dynamic_cast<texture*>(m_bumpmap.pipeline_value()))\n\t\ttexture::use(TextureNames, texture_node, \"bumpmap\", Stream);\n}\n\nvoid material::use(const name_map& MaterialNames, k3d::imaterial* const Material, std::ostream& Stream)\n{\n\t// Insert a reference to an existing material ...\n\tif(material* const lux_material = k3d::material::lookup<material>(Material))\n\t{\n\t\tif(MaterialNames.count(lux_material))\n\t\t{\n\t\t\tStream << k3d::standard_indent << \"NamedMaterial \\\"\" << MaterialNames.find(lux_material)->second << \"\\\"\\n\";\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::log() << error << \"Missing named material, falling-back to default material instead.\" << std::endl;\n\t}\n\n\t// Otherwise, provide a default material ...\n\tStream << k3d::standard_indent << \"Texture \\\"a\\\" \\\"color\\\" \\\"constant\\\" \\\"color value\\\" [1 1 1]\\n\";\n\tStream << k3d::standard_indent << \"Texture \\\"b\\\" \\\"color\\\" \\\"constant\\\" \\\"color value\\\" [0.1 0.1 0.1]\\n\";\n\tStream << k3d::standard_indent << \"Texture \\\"c\\\" \\\"float\\\" \\\"constant\\\" \\\"float value\\\" [0.000571]\\n\";\n\tStream << k3d::standard_indent << \"Material \\\"plastic\\\" \\\"texture Kd\\\" [\\\"a\\\"] \\\"texture Ks\\\" [\\\"b\\\"] \\\"texture bumpmap\\\" [\\\"c\\\"]\\n\";\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/material.h",
    "content": "#ifndef MODULES_LUXRENDER_MATERIAL_H\n#define MODULES_LUXRENDER_MATERIAL_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"scalar_texture.h\"\n#include \"texture.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/itexture.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/types.h>\n\n#include <iosfwd>\n#include <map>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\n/// Abstract interface for LuxRender material nodes.\nclass material :\n\tpublic k3d::node,\n\tpublic k3d::imaterial\n{\npublic:\n\tmaterial(k3d::iplugin_factory& Factory, k3d::idocument& Document);\n\n\t/// Provides storage for a mapping from material objects to unique names\n\ttypedef std::map<material*, k3d::string_t> name_map;\n\t/// Inserts a material definition into a scene, assigning the material a unique name\n\tvoid setup(const texture::name_map& TextureNames, name_map& MaterialNames, std::ostream& Stream);\n\t/// Inserts a material reference into a scene, handling NULL materials by supplying a standard default.\n\tstatic void use(const name_map& MaterialNames, k3d::imaterial* const Material, std::ostream& Stream);\n\nprotected:\n\tvoid setup_bumpmap(const texture::name_map& TextureNames, std::ostream& Stream);\n\nprivate:\n\t/// Implemented in derivatives to do the actual work of inserting the material definition into the scene.\n\tvirtual void on_setup(const texture::name_map& TextureNames, name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream) = 0;\n\n\tk3d_data(scalar_texture*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_bumpmap;\n};\n\n} // namespace luxrender\n\n} // namespace module\n\n#endif // !MODULES_LUXRENDER_MATERIAL_H\n\n"
  },
  {
    "path": "modules/luxrender/matte_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture_reference.h\"\n#include \"material.h\"\n#include \"scalar_texture_reference.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass matte_material :\n\tpublic material\n{\n\ttypedef material base;\n\npublic:\n\tmatte_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_color(*this, \"kd\", _(\"Color\"), _(\"Diffuse Color.\"), _(\"Color Texture\"), k3d::color(0.8, 0.8, 0.8)),\n\t\tm_sigma(*this, \"sigma\", _(\"Sigma\"), _(\"The sigma parameter in the Oren-Nayer shader in degrees.  Zero for pure Lambertian reflection.\"), _(\"Sigma Texture\"), 0.0)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<matte_material,\n\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0x77bbeecb, 0x59483223, 0x142c92b9, 0x235096bb),\n\t\t\t\"LuxRenderMatteMaterial\",\n\t\t\t_(\"LuxRender Matte Material\"),\n\t\t\t\"LuxRender Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_setup(const texture::name_map& TextureNames, material::name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"MakeNamedMaterial \\\"\" << Name << \"\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"string type\\\" [\\\"matte\\\"]\\n\";\n\n\t\tsetup_bumpmap(TextureNames, Stream);\n\t\tm_color.setup(TextureNames, \"color\", \"Kd\", Stream);\n\t\tm_sigma.setup(TextureNames, \"float\", \"sigma\", Stream);\n\t\t\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tcolor_texture_reference m_color;\n\tscalar_texture_reference m_sigma;\n};\n\nk3d::iplugin_factory& matte_material_factory()\n{\n\treturn matte_material::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/matte_translucent_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture_reference.h\"\n#include \"material.h\"\n#include \"scalar_texture_reference.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass matte_translucent_material :\n\tpublic material\n{\n\ttypedef material base;\n\npublic:\n\tmatte_translucent_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_kr(*this, \"kr\", _(\"Kr\"), _(\"Diffuse Color.\"), _(\"Kr Texture\"), k3d::color(1, 1, 1)),\n\t\tm_kt(*this, \"kt\", _(\"Kt\"), _(\"Transparent Color.\"), _(\"Kt Texture\"), k3d::color(1, 1, 1)),\n\t\tm_sigma(*this, \"sigma\", _(\"Sigma\"), _(\"The sigma parameter in the Oren-Nayer shader in degrees.  Zero for pure Lambertian reflection.\"), _(\"Sigma Texture\"), 0.0)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<matte_translucent_material,\n\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0xe932477f, 0xe04fb993, 0xf3d3cf9a, 0x799ae0cc),\n\t\t\t\"LuxRenderMatteTranslucentMaterial\",\n\t\t\t_(\"LuxRender Matte Translucent Material\"),\n\t\t\t\"LuxRender Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_setup(const texture::name_map& TextureNames, material::name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"MakeNamedMaterial \\\"\" << Name << \"\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"string type\\\" [\\\"mattetranslucent\\\"]\\n\";\n\n\t\tsetup_bumpmap(TextureNames, Stream);\n\t\tm_kr.setup(TextureNames, \"color\", \"Kr\", Stream);\n\t\tm_kt.setup(TextureNames, \"color\", \"Kt\", Stream);\n\t\tm_sigma.setup(TextureNames, \"float\", \"sigma\", Stream);\n\t\t\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tcolor_texture_reference m_kr;\n\tcolor_texture_reference m_kt;\n\tscalar_texture_reference m_sigma;\n};\n\nk3d::iplugin_factory& matte_translucent_material_factory()\n{\n\treturn matte_translucent_material::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/metal_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"material.h\"\n#include \"scalar_texture_reference.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// name_values\n\nstatic const k3d::ilist_property<std::string>::values_t& name_values()\n{\n\tstatic k3d::ilist_property<std::string>::values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(\"amorphous carbon\");\n\t\tvalues.push_back(\"silver\");\n\t\tvalues.push_back(\"gold\");\n\t\tvalues.push_back(\"copper\");\n\t\tvalues.push_back(\"aluminum\");\n\t}\n\treturn values;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass metal_material :\n\tpublic material\n{\n\ttypedef material base;\n\npublic:\n\tmetal_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_name(init_owner(*this) + init_name(\"name\") + init_label(_(\"Name\")) + init_description(_(\"Metal name, or the path to an NK optical properties file.\")) + init_value(k3d::string_t(\"copper\")) + init_values(name_values())),\n\t\tm_u_roughness(*this, \"u_roughness\", _(\"U Roughness\"), _(\"Roughness of the surface in the u direction.\"), _(\"U Roughness Texture\"), 0.001),\n\t\tm_v_roughness(*this, \"v_roughness\", _(\"V Roughness\"), _(\"Roughness of the surface in the v direction.\"), _(\"V Roughness Texture\"), 0.001)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<metal_material,\n\t\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0x7bb2bd65, 0x764ec9c7, 0xdd52c5a2, 0x8a7048e9),\n\t\t\t\"LuxRenderMetalMaterial\",\n\t\t\t_(\"LuxRender Metal Material\"),\n\t\t\t\"LuxRender Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_setup(const texture::name_map& TextureNames, material::name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"MakeNamedMaterial \\\"\" << Name << \"\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"string type\\\" [\\\"metal\\\"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"string name\\\" \\\"\" << m_name.pipeline_value() << \"\\\"\\n\";\n\n\t\tsetup_bumpmap(TextureNames, Stream);\n\t\tm_u_roughness.setup(TextureNames, \"float\", \"uroughness\", Stream);\n\t\tm_v_roughness.setup(TextureNames, \"float\", \"vroughness\", Stream);\n\t\t\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_name;\n\tscalar_texture_reference m_u_roughness;\n\tscalar_texture_reference m_v_roughness;\n};\n\nk3d::iplugin_factory& metal_material_factory()\n{\n\treturn metal_material::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/mirror_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture_reference.h\"\n#include \"material.h\"\n#include \"scalar_texture_reference.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass mirror_material :\n\tpublic material\n{\n\ttypedef material base;\n\npublic:\n\tmirror_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_kr(*this, \"kr\", _(\"Kr\"), _(\"Surface reflectivity.\"), _(\"Kr Texture\"), k3d::color(1, 1, 1)),\n\t\tm_film(*this, \"film\", _(\"Film\"), _(\"Thin film coating thickness (nanometers).\"), _(\"Film Texture\"), 0.001),\n\t\tm_film_index(*this, \"film_index\", _(\"Film Index\"), _(\"Index of refraction of the thin film coating.\"), _(\"Film Index Texture\"), 1.5)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mirror_material,\n\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0x3969bf64, 0xb9419f4c, 0xe515a99c, 0x11cccf42),\n\t\t\t\"LuxRenderMirrorMaterial\",\n\t\t\t_(\"LuxRender Mirror Material\"),\n\t\t\t\"LuxRender Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_setup(const texture::name_map& TextureNames, material::name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"MakeNamedMaterial \\\"\" << Name << \"\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"string type\\\" [\\\"mirror\\\"]\\n\";\n\t\t\n\t\tsetup_bumpmap(TextureNames, Stream);\n\t\tm_kr.setup(TextureNames, \"color\", \"Kr\", Stream);\n\t\tm_film.setup(TextureNames, \"float\", \"film\", Stream);\n\t\tm_film_index.setup(TextureNames, \"float\", \"filmindex\", Stream);\n\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tcolor_texture_reference m_kr;\n\tscalar_texture_reference m_film;\n\tscalar_texture_reference m_film_index;\n};\n\nk3d::iplugin_factory& mirror_material_factory()\n{\n\treturn mirror_material::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/mix_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"material.h\"\n#include \"scalar_texture_reference.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass mix_material :\n\tpublic material\n{\n\ttypedef material base;\n\npublic:\n\tmix_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_material_1(init_owner(*this) + init_name(\"material1\") + init_label(_(\"Material 1\")) + init_description(_(\"Material 1\")) + init_value(static_cast<material*>(0))),\n\t\tm_material_2(init_owner(*this) + init_name(\"material2\") + init_label(_(\"Material 2\")) + init_description(_(\"Material 2\")) + init_value(static_cast<material*>(0))),\n\t\tm_amount(*this, \"amount\", _(\"Amount\"), _(\"Used to do linear interpolation between Material 1 and Material 2.\"), _(\"Amount Texture\"), 0.5)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mix_material,\n\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0x63320de7, 0x6043a28b, 0xd214d7aa, 0x10682945),\n\t\t\t\"LuxRenderMixMaterial\",\n\t\t\t_(\"LuxRender Mix Material\"),\n\t\t\t\"LuxRender Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_setup(const texture::name_map& TextureNames, material::name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tmaterial* const material1 = m_material_1.pipeline_value();\n\t\tif(material1)\n\t\t\tmaterial1->setup(TextureNames, MaterialNames, Stream);\n\n\t\tmaterial* const material2 = m_material_2.pipeline_value();\n\t\tif(material2)\n\t\t\tmaterial2->setup(TextureNames, MaterialNames, Stream);\n\n\t\tStream << k3d::standard_indent << \"MakeNamedMaterial \\\"\" << Name << \"\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"string type\\\" [\\\"mix\\\"]\\n\";\n\n\t\tsetup_bumpmap(TextureNames, Stream);\n\n\t\tif(material1 && MaterialNames.count(material1))\n\t\t\tStream << k3d::standard_indent << \"\\\"string namedmaterial1\\\" [\\\"\" << MaterialNames.find(material1)->second << \"\\\"]\\n\";\n\n\t\tif(material2 && MaterialNames.count(material2))\n\t\t\tStream << k3d::standard_indent << \"\\\"string namedmaterial2\\\" [\\\"\" << MaterialNames.find(material2)->second << \"\\\"]\\n\";\n\n\t\tm_amount.setup(TextureNames, \"float\", \"amount\", Stream);\n\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tk3d_data(material*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_material_1;\n\tk3d_data(material*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_material_2;\n\tscalar_texture_reference m_amount;\n};\n\nk3d::iplugin_factory& mix_material_factory()\n{\n\treturn mix_material::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the luxrender plugin module, to protect public symbols from name clashes with other modules\nnamespace luxrender\n{\n\nextern k3d::iplugin_factory& bilinear_interpolation_texture_factory();\nextern k3d::iplugin_factory& carpaint_material_factory();\nextern k3d::iplugin_factory& distant_light_factory();\nextern k3d::iplugin_factory& environment_light_factory();\nextern k3d::iplugin_factory& glass_material_factory();\nextern k3d::iplugin_factory& glossy_material_factory();\nextern k3d::iplugin_factory& goniometric_light_factory();\nextern k3d::iplugin_factory& image_texture_factory();\nextern k3d::iplugin_factory& matte_material_factory();\nextern k3d::iplugin_factory& matte_translucent_material_factory();\nextern k3d::iplugin_factory& metal_material_factory();\nextern k3d::iplugin_factory& mirror_material_factory();\nextern k3d::iplugin_factory& mix_material_factory();\nextern k3d::iplugin_factory& null_material_factory();\nextern k3d::iplugin_factory& point_light_factory();\nextern k3d::iplugin_factory& render_engine_factory();\nextern k3d::iplugin_factory& rough_glass_material_factory();\nextern k3d::iplugin_factory& scalar_image_texture_factory();\nextern k3d::iplugin_factory& shiny_metal_material_factory();\nextern k3d::iplugin_factory& sky_light_factory();\nextern k3d::iplugin_factory& sun_light_factory();\n\n} // namespace luxrender\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::luxrender::bilinear_interpolation_texture_factory());\n\tRegistry.register_factory(module::luxrender::carpaint_material_factory());\n\tRegistry.register_factory(module::luxrender::distant_light_factory());\n\tRegistry.register_factory(module::luxrender::environment_light_factory());\n\tRegistry.register_factory(module::luxrender::glass_material_factory());\n\tRegistry.register_factory(module::luxrender::glossy_material_factory());\n\tRegistry.register_factory(module::luxrender::goniometric_light_factory());\n\tRegistry.register_factory(module::luxrender::image_texture_factory());\n\tRegistry.register_factory(module::luxrender::matte_material_factory());\n\tRegistry.register_factory(module::luxrender::matte_translucent_material_factory());\n\tRegistry.register_factory(module::luxrender::metal_material_factory());\n\tRegistry.register_factory(module::luxrender::mirror_material_factory());\n\tRegistry.register_factory(module::luxrender::mix_material_factory());\n\tRegistry.register_factory(module::luxrender::null_material_factory());\n\tRegistry.register_factory(module::luxrender::point_light_factory());\n\tRegistry.register_factory(module::luxrender::render_engine_factory());\n\tRegistry.register_factory(module::luxrender::rough_glass_material_factory());\n\tRegistry.register_factory(module::luxrender::scalar_image_texture_factory());\n\tRegistry.register_factory(module::luxrender::shiny_metal_material_factory());\n\tRegistry.register_factory(module::luxrender::sky_light_factory());\n\tRegistry.register_factory(module::luxrender::sun_light_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/luxrender/null_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"material.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass null_material :\n\tpublic material\n{\n\ttypedef material base;\n\npublic:\n\tnull_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<null_material,\n\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0xb55cd32a, 0x4b4f4bd2, 0x317685bc, 0x14327799),\n\t\t\t\"LuxRenderNullMaterial\",\n\t\t\t_(\"LuxRender Null Material\"),\n\t\t\t\"LuxRender Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_setup(const texture::name_map& TextureNames, material::name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"MakeNamedMaterial \\\"\" << Name << \"\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"string type\\\" [\\\"null\\\"]\\n\";\n\t\tsetup_bumpmap(TextureNames, Stream);\n\t\tStream << k3d::pop_indent;\n\t}\n};\n\nk3d::iplugin_factory& null_material_factory()\n{\n\treturn null_material::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/point_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transformable.h>\n#include <k3dsdk/transform.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// point_light\n\nclass point_light :\n\tpublic k3d::gl::renderable<k3d::transformable<light> >\n{\n\ttypedef k3d::gl::renderable<k3d::transformable<light> > base;\n\npublic:\n\tpoint_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_quadric(gluNewQuadric()),\n\t\tm_color(init_owner(*this) + init_name(\"L\") + init_label(_(\"Color\")) + init_description(_(\"Color\")) + init_value(k3d::color(0.8, 0.8, 0.8)))\n\t{\n\t\tm_input_matrix.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\t~point_light()\n\t{\n\t\tgluDeleteQuadric(m_quadric);\n\t}\n\n\tvoid on_setup(std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"LightSource \\\"point\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"point from\\\" [\" << convert(k3d::world_position(*this)) << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"color L\\\" [\" << m_color.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, State.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.8, 0.8, 0.2));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0.5, 0.5, 0));\n\n\t\tglEnable(GL_LIGHTING);\n\t\tdraw_geometry();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglDisable(GL_LIGHTING);\n\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw_geometry();\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<point_light,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::uuid(0xcbc855c0, 0xed49e9d1, 0x37fc2a83, 0xc58e863f),\n\t\t\t\t\"LuxRenderPointLight\",\n\t\t\t\t_(\"LuxRender Point Light\"),\n\t\t\t\t\"LuxRender Light\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid draw_geometry()\n\t{\n\t\tgluSphere(m_quadric, 0.5, 8, 8);\n\t}\n\n\t/// Stores a GLU quadric object for drawing the manipulators\n\tGLUquadricObj* const m_quadric;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n};\n\nk3d::iplugin_factory& point_light_factory()\n{\n\treturn point_light::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/luxrender/render_engine.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n#include \"material.h\"\n#include \"texture.h\"\n#include \"utility.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/cone.h>\n#include <k3dsdk/cylinder.h>\n#include <k3dsdk/disk.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/file_range.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/hyperboloid.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/inetwork_render_farm.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/inetwork_render_job.h>\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/irender_camera_animation.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/irender_camera_preview.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/material.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/network_render_farm.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/paraboloid.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/resolutions.h>\n#include <k3dsdk/sphere.h>\n#include <k3dsdk/time_source.h>\n#include <k3dsdk/torus.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/triangulator.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iomanip>\n#include <iterator>\n#include <map>\n#include <set>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// render_engine\n\nclass render_engine :\n\tpublic k3d::node,\n\tpublic k3d::inode_collection_sink,\n\tpublic k3d::irender_camera_preview,\n\tpublic k3d::irender_camera_frame,\n\tpublic k3d::irender_camera_animation\n{\n\ttypedef k3d::node base;\n// initialise properties\npublic:\n\trender_engine(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_visible_nodes(init_owner(*this) + init_name(\"visible_nodes\") + init_label(_(\"Visible Nodes\")) + init_description(_(\"A list of nodes that will be visible in the rendered output.\")) + init_value(std::vector<k3d::inode*>())),\n\t\tm_enabled_lights(init_owner(*this) + init_name(\"enabled_lights\") + init_label(_(\"Enabled Lights\")) + init_description(_(\"A list of light sources that will contribute to the rendered output.\")) + init_value(std::vector<k3d::inode*>())),\n\t\tm_resolution(init_owner(*this) + init_name(\"resolution\") + init_label(_(\"Resolution\")) + init_description(_(\"Choose a predefined image resolution\")) + init_enumeration(k3d::resolution_values()) + init_value(k3d::string_t(\"\"))),\n\t\tm_pixel_width(init_owner(*this) + init_name(\"pixel_width\") + init_label(_(\"Pixel Width\")) + init_description(_(\"The horizontal size in pixels of the rendered output image.\")) + init_value(320) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_pixel_height(init_owner(*this) + init_name(\"pixel_height\") + init_label(_(\"Pixel Height\")) + init_description(_(\"The vertical size in pixels of the rendered output image.\")) + init_value(240) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_halt_samples(init_owner(*this) + init_name(\"halt_samples\") + init_label(_(\"Halt Samples\")) + init_description(_(\"Halt rendering once the number of samples per pixel reaches this value.\")) + init_value(200) + init_constraint(constraint::minimum<k3d::int32_t>(1)))\n\t{\n\t\tm_resolution.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_resolution_changed));\n\t}\n\n\tconst k3d::inode_collection_sink::properties_t node_collection_properties()\n\t{\n\t\tk3d::inode_collection_sink::properties_t results;\n\t\tresults.push_back(&m_visible_nodes);\n\t\tresults.push_back(&m_enabled_lights);\n\n\t\treturn results;\n\t}\n\n\tvoid on_resolution_changed(k3d::iunknown*)\n\t{\n\t\tconst k3d::string_t new_resolution = m_resolution.pipeline_value();\n\n\t\tconst k3d::resolutions_t& resolutions = k3d::resolutions();\n\t\tfor(k3d::resolutions_t::const_iterator resolution = resolutions.begin(); resolution != resolutions.end(); ++resolution)\n\t\t{\n\t\t\tif(resolution->name != new_resolution)\n\t\t\t\tcontinue;\n\n\t\t\tm_pixel_width.set_value(resolution->width);\n\t\t\tm_pixel_height.set_value(resolution->height);\n\t\t\treturn;\n\t\t}\n\n\t\tassert_not_reached();\n\t}\n\n\tk3d::bool_t render_camera_preview(k3d::icamera& Camera)\n\t{\n\t\t// Start a new render job ...\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-luxrender-preview\");\n\n\t\t// Add a single render frame to the job ...\n\t\tk3d::inetwork_render_frame& frame = job.create_frame(\"frame\");\n\n\t\t// Create an output image path ...\n\t\tconst k3d::filesystem::path output_image = frame.add_file(\"output\");\n\n\t\t// Render it ...\n\t\treturn_val_if_fail(render(Camera, frame, output_image, true), false);\n\n\t\t// View the output when it's done ...\n\t\tframe.add_view_command(output_image + \".png\");\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render_camera_frame(k3d::icamera& Camera, const k3d::filesystem::path& OutputImage, const k3d::bool_t ViewImage)\n\t{\n\t\t// Sanity checks ...\n\t\treturn_val_if_fail(!OutputImage.empty(), false);\n\n\t\t// Start a new render job ...\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-luxrender-render-frame\");\n\n\t\t// Add a single render frame to the job ...\n\t\tk3d::inetwork_render_frame& frame = job.create_frame(\"frame\");\n\n\t\t// Create an output image path ...\n\t\tconst k3d::filesystem::path output_image = frame.add_file(\"output\");\n\n\t\t// Render it ...\n\t\treturn_val_if_fail(render(Camera, frame, output_image, false), false);\n\n\t\t// Copy the output image to its requested destination ...\n\t\tframe.add_copy_command(output_image + \".png\", OutputImage);\n\n\t\t// View the output image when it's done ...\n\t\tif(ViewImage)\n\t\t\tframe.add_view_command(OutputImage);\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render_camera_animation(k3d::icamera& Camera, k3d::iproperty& Time, const k3d::frames& Frames, const k3d::bool_t ViewCompletedImages)\n\t{\n\t\t// Start a new render job ...\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-luxrender-render-animation\");\n\n\t\t// For each frame to be rendered ...\n\t\tk3d::uint_t frame_index = 0;\n\t\tfor(k3d::frames::const_iterator frame = Frames.begin(); frame != Frames.end(); ++frame, ++frame_index)\n\t\t{\n\t\t\t// Set the frame time ...\n\t\t\tk3d::property::set_internal_value(Time, frame->begin_time);\n\n\t\t\t// Redraw everything ...\n\t\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::SYNCHRONOUS);\n\n\t\t\t// Add a render frame to the job ...\n\t\t\tstd::stringstream buffer;\n\t\t\tbuffer << \"frame-\" << frame_index;\n\t\t\tk3d::inetwork_render_frame& render_frame = job.create_frame(buffer.str());\n\n\t\t\t// Create an output image path ...\n\t\t\tconst k3d::filesystem::path output_image = render_frame.add_file(\"output\");\n\n\t\t\t// Render it (hidden rendering) ...\n\t\t\treturn_val_if_fail(render(Camera, render_frame, output_image, false), false);\n\n\t\t\t// Copy the output image to its requested destination ...\n\t\t\trender_frame.add_copy_command(output_image + \".png\", frame->destination);\n\n\t\t\t// View the output image when it's done ...\n\t\t\tif(ViewCompletedImages)\n\t\t\t\trender_frame.add_view_command(frame->destination);\n\t\t}\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<render_engine,\n\t\t\tk3d::interface_list<k3d::irender_camera_animation,\n\t\t\tk3d::interface_list<k3d::irender_camera_frame,\n\t\t\tk3d::interface_list<k3d::irender_camera_preview> > > > factory(\n\t\t\t\tk3d::uuid(0xe28cbcb2, 0x1940a2f6, 0x5a8228ba, 0xdf1cd742),\n\t\t\t\t\"LuxRenderEngine\",\n\t\t\t\t_(\"LuxRender Render Engine\"),\n\t\t\t\t\"LuxRender RenderEngine\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t/// Helper class used to triangulate faces\n\tclass create_triangles :\n\t\tpublic k3d::triangulator\n\t{\n\t\ttypedef k3d::triangulator base;\n\n\tpublic:\n\t\tcreate_triangles(\n\t\t\tconst k3d::mesh::points_t& FacePoints,\n\t\t\tconst k3d::mesh::normals_t* VertexNormals,\n\t\t\tconst k3d::mesh::normals_t* FaceNormals,\n\t\t\tconst k3d::mesh::normals_t* EdgeNormals,\n\t\t\tconst k3d::mesh::materials_t& FaceMaterials,\n\t\t\tk3d::mesh::points_t& TrianglePoints,\n\t\t\tk3d::mesh::normals_t& TriangleNormals,\n\t\t\tstd::vector<k3d::imaterial*>& TriangleMaterials\n\t\t\t) :\n\t\t\tm_face_points(FacePoints),\n\t\t\tm_vertex_normals(VertexNormals),\n\t\t\tm_face_normals(FaceNormals),\n\t\t\tm_edge_normals(EdgeNormals),\n\t\t\tm_face_materials(FaceMaterials),\n\t\t\tm_triangle_points(TrianglePoints),\n\t\t\tm_triangle_normals(TriangleNormals),\n\t\t\tm_triangle_materials(TriangleMaterials)\n\t\t{\n\t\t}\n\n\tprivate:\n\t\tvoid start_face(const k3d::uint_t Face)\n\t\t{\n\t\t\tm_current_face = Face;\n\t\t}\n\n\t\tvoid add_vertex(const k3d::point3& Coordinates, k3d::uint_t Vertices[4], k3d::uint_t Edges[4], double Weights[4], k3d::uint_t& NewVertex)\n\t\t{\n\t\t\tNewVertex = m_face_points.size();\n\t\t\tm_face_points.push_back(Coordinates);\n\t\t}\n\n\t\tvoid add_triangle(k3d::uint_t Vertices[3], k3d::uint_t Edges[3])\n\t\t{\n\t\t\tm_triangle_points.push_back(m_face_points[Vertices[0]]);\n\t\t\tm_triangle_points.push_back(m_face_points[Vertices[1]]);\n\t\t\tm_triangle_points.push_back(m_face_points[Vertices[2]]);\n\n\t\t\tif(m_edge_normals)\n\t\t\t{\n\t\t\t\tm_triangle_normals.push_back((*m_edge_normals)[Edges[0]]);\n\t\t\t\tm_triangle_normals.push_back((*m_edge_normals)[Edges[1]]);\n\t\t\t\tm_triangle_normals.push_back((*m_edge_normals)[Edges[2]]);\n\t\t\t}\n\t\t\telse if(m_vertex_normals)\n\t\t\t{\n\t\t\t\tm_triangle_normals.push_back((*m_vertex_normals)[Vertices[0]]);\n\t\t\t\tm_triangle_normals.push_back((*m_vertex_normals)[Vertices[1]]);\n\t\t\t\tm_triangle_normals.push_back((*m_vertex_normals)[Vertices[2]]);\n\t\t\t}\n\t\t\telse if(m_face_normals)\n\t\t\t{\n\t\t\t\tm_triangle_normals.push_back((*m_face_normals)[m_current_face]);\n\t\t\t\tm_triangle_normals.push_back((*m_face_normals)[m_current_face]);\n\t\t\t\tm_triangle_normals.push_back((*m_face_normals)[m_current_face]);\n\t\t\t}\n\n\t\t\tm_triangle_materials.push_back(m_face_materials[m_current_face]);\n\t\t}\n\n\t\tk3d::mesh::points_t m_face_points;\n\t\tconst k3d::mesh::normals_t* const m_vertex_normals;\n\t\tconst k3d::mesh::normals_t* const m_face_normals;\n\t\tconst k3d::mesh::normals_t* const m_edge_normals;\n\t\tconst k3d::mesh::materials_t& m_face_materials;\n\t\tk3d::mesh::points_t& m_triangle_points;\n\t\tk3d::mesh::normals_t& m_triangle_normals;\n\t\tstd::vector<k3d::imaterial*>& m_triangle_materials;\n\n\t\tk3d::uint_t m_current_face;\n\t};\n\n\tvoid render_cone(const material::name_map& MaterialNames, k3d::inode& MeshInstance, const k3d::mesh& Mesh, k3d::cone::const_primitive& Cone, std::ostream& Stream)\n\t{\n\t\tfor(k3d::uint_t i = 0; i != Cone.matrices.size(); ++i)\n\t\t{\n\t\t\tStream << k3d::standard_indent << \"AttributeBegin\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"ConcatTransform [\" << convert(k3d::node_to_world_matrix(MeshInstance) * Cone.matrices[i]) << \"]\\n\" << k3d::push_indent;\n\n\t\t\tmaterial::use(MaterialNames, Cone.materials[i], Stream);\n\n\t\t\tStream << k3d::standard_indent << \"Shape \\\"cone\\\"\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"\\\"float height\\\" [\" << Cone.heights[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float radius\\\" [\" << Cone.radii[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float phimax\\\" [\" << k3d::degrees(Cone.sweep_angles[i]) << \"]\\n\";\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent << k3d::standard_indent << \"AttributeEnd\\n\";\n\t\t}\n\t}\n\n\tvoid render_cylinder(const material::name_map& MaterialNames, k3d::inode& MeshInstance, const k3d::mesh& Mesh, k3d::cylinder::const_primitive& Cylinder, std::ostream& Stream)\n\t{\n\t\tfor(k3d::uint_t i = 0; i != Cylinder.matrices.size(); ++i)\n\t\t{\n\t\t\tStream << k3d::standard_indent << \"AttributeBegin\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"ConcatTransform [\" << convert(k3d::node_to_world_matrix(MeshInstance) * Cylinder.matrices[i]) << \"]\\n\" << k3d::push_indent;\n\n\t\t\tmaterial::use(MaterialNames, Cylinder.materials[i], Stream);\n\n\t\t\tStream << k3d::standard_indent << \"Shape \\\"cylinder\\\"\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"\\\"float zmin\\\" [\" << Cylinder.z_min[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float zmax\\\" [\" << Cylinder.z_max[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float radius\\\" [\" << Cylinder.radii[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float phimax\\\" [\" << k3d::degrees(Cylinder.sweep_angles[i]) << \"]\\n\";\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent << k3d::standard_indent << \"AttributeEnd\\n\";\n\t\t}\n\t}\n\n\tvoid render_disk(const material::name_map& MaterialNames, k3d::inode& MeshInstance, const k3d::mesh& Mesh, k3d::disk::const_primitive& Disk, std::ostream& Stream)\n\t{\n\t\tfor(k3d::uint_t i = 0; i != Disk.matrices.size(); ++i)\n\t\t{\n\t\t\tStream << k3d::standard_indent << \"AttributeBegin\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"ConcatTransform [\" << convert(k3d::node_to_world_matrix(MeshInstance) * Disk.matrices[i]) << \"]\\n\" << k3d::push_indent;\n\n\t\t\tmaterial::use(MaterialNames, Disk.materials[i], Stream);\n\n\t\t\tStream << k3d::standard_indent << \"Shape \\\"disk\\\"\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"\\\"float height\\\" [\" << Disk.heights[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float radius\\\" [\" << Disk.radii[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float phimax\\\" [\" << k3d::degrees(Disk.sweep_angles[i]) << \"]\\n\";\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent << k3d::standard_indent << \"AttributeEnd\\n\";\n\t\t}\n\t}\n\n\tvoid render_hyperboloid(const material::name_map& MaterialNames, k3d::inode& MeshInstance, const k3d::mesh& Mesh, k3d::hyperboloid::const_primitive& Hyperboloid, std::ostream& Stream)\n\t{\n\t\tfor(k3d::uint_t i = 0; i != Hyperboloid.matrices.size(); ++i)\n\t\t{\n\t\t\tStream << k3d::standard_indent << \"AttributeBegin\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"ConcatTransform [\" << convert(k3d::node_to_world_matrix(MeshInstance) * Hyperboloid.matrices[i]) << \"]\\n\" << k3d::push_indent;\n\n\t\t\tmaterial::use(MaterialNames, Hyperboloid.materials[i], Stream);\n\n\t\t\tStream << k3d::standard_indent << \"Shape \\\"hyperboloid\\\"\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"\\\"point p1\\\" [\" << Hyperboloid.start_points[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"point p2\\\" [\" << Hyperboloid.end_points[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float phi\\\" [\" << k3d::degrees(Hyperboloid.sweep_angles[i]) << \"]\\n\";\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent << k3d::standard_indent << \"AttributeEnd\\n\";\n\t\t}\n\t}\n\n\tvoid render_nurbs_patch(const material::name_map& MaterialNames, k3d::inode& MeshInstance, const k3d::mesh& Mesh, k3d::nurbs_patch::const_primitive& Nurbs, std::ostream& Stream)\n\t{\n\t\tconst k3d::mesh::points_t& mesh_points = *Mesh.points;\n\n\t\tStream << k3d::standard_indent << \"AttributeBegin\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"Transform [\" << convert(k3d::node_to_world_matrix(MeshInstance)) << \"]\\n\" << k3d::push_indent;\n\n\t\tconst k3d::uint_t patch_begin = 0;\n\t\tconst k3d::uint_t patch_end = patch_begin + Nurbs.patch_first_points.size();\n\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t{\n\t\t\tmaterial::use(MaterialNames, Nurbs.patch_materials[patch], Stream);\n\n\t\t\tStream << k3d::standard_indent << \"Shape \\\"nurbs\\\"\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"\\\"integer nu\\\" [\" << Nurbs.patch_u_point_counts[patch] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"integer nv\\\" [\" << Nurbs.patch_v_point_counts[patch] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"integer uorder\\\" [\" << Nurbs.patch_u_orders[patch] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"integer vorder\\\" [\" << Nurbs.patch_v_orders[patch] << \"]\\n\";\n\n\t\t\tStream << k3d::standard_indent << \"\\\"float uknots\\\" [\";\n\t\t\tconst k3d::uint_t u_knot_begin = Nurbs.patch_u_first_knots[patch];\n\t\t\tconst k3d::uint_t u_knot_end = u_knot_begin + Nurbs.patch_u_point_counts[patch] + Nurbs.patch_u_orders[patch];\n\t\t\tfor(k3d::uint_t knot = u_knot_begin; knot != u_knot_end; ++knot)\n\t\t\t\tStream << \" \" << Nurbs.patch_u_knots[knot];\n\t\t\tStream << \"]\\n\";\n\n\t\t\tStream << k3d::standard_indent << \"\\\"float vknots\\\" [\";\n\t\t\tconst k3d::uint_t v_knot_begin = Nurbs.patch_v_first_knots[patch];\n\t\t\tconst k3d::uint_t v_knot_end = v_knot_begin + Nurbs.patch_v_point_counts[patch] + Nurbs.patch_v_orders[patch];\n\t\t\tfor(k3d::uint_t knot = v_knot_begin; knot != v_knot_end; ++knot)\n\t\t\t\tStream << \" \" << Nurbs.patch_v_knots[knot];\n\t\t\tStream << \"]\\n\";\n\n\t\t\tStream << k3d::standard_indent << \"\\\"float Pw\\\" [\";\n\t\t\tconst k3d::uint_t point_begin = Nurbs.patch_first_points[patch];\n\t\t\tconst k3d::uint_t point_end = point_begin + (Nurbs.patch_u_point_counts[patch] * Nurbs.patch_v_point_counts[patch]);\n\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t point_index = Nurbs.patch_points[point];\n\t\t\t\tconst k3d::double_t point_weight = Nurbs.patch_point_weights[point];\n\n\t\t\t\tStream << \" \" << point_weight * mesh_points[point_index][0];\n\t\t\t\tStream << \" \" << point_weight * mesh_points[point_index][1];\n\t\t\t\tStream << \" \" << point_weight * mesh_points[point_index][2];\n\t\t\t\tStream << \" \" << point_weight;\n\t\t\t}\n\t\t\tStream << \"]\\n\";\n\n\t\t\tStream << k3d::pop_indent;\n\t\t}\n\n/*\n\t\t// For each material, render the triangles that use that material ...\n\t\tfor(std::set<k3d::imaterial*>::const_iterator material = material_list.begin(); material != material_list.end(); ++material)\n\t\t{\n\t\t\tmaterial::use(MaterialNames, *material, Stream);\n\n\t\t\tStream << k3d::standard_indent << \"Shape \\\"trianglemesh\\\"\\n\" << k3d::push_indent;\n\n\t\t\tconst k3d::uint_t triangle_begin = 0;\n\t\t\tconst k3d::uint_t triangle_end = triangle_begin + triangle_materials.size();\n\n\t\t\tStream << k3d::standard_indent << \"\\\"integer indices\\\" [\";\n\t\t\tfor(k3d::uint_t triangle = triangle_begin; triangle != triangle_end; ++triangle)\n\t\t\t{\n\t\t\t\tif(triangle_materials[triangle] != *material)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tStream << \" \" << (triangle * 3) + 0 << \" \" << (triangle * 3) + 1 << \" \" << (triangle * 3) + 2;\n\t\t\t}\n\t\t\tStream << \"]\\n\";\n\n\t\t\tStream << k3d::standard_indent << \"\\\"point P\\\" [\";\n\t\t\tfor(k3d::uint_t triangle = triangle_begin; triangle != triangle_end; ++triangle)\n\t\t\t{\n\t\t\t\tif(triangle_materials[triangle] != *material)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tStream << \" \" << triangle_points[(triangle * 3) + 0] << \" \" << triangle_points[(triangle * 3) + 1] << \" \" << triangle_points[(triangle * 3) + 2];\n\t\t\t}\n\t\t\tStream << \"]\\n\";\n\n\t\t\tif(triangle_normals.size())\n\t\t\t{\n\t\t\t\tStream << k3d::standard_indent << \"\\\"normal N\\\" [\";\n\t\t\t\tfor(k3d::uint_t triangle = triangle_begin; triangle != triangle_end; ++triangle)\n\t\t\t\t{\n\t\t\t\t\tif(triangle_materials[triangle] != *material)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tStream << \" \" << triangle_normals[(triangle * 3) + 0] << \" \" << triangle_normals[(triangle * 3) + 1] << \" \" << triangle_normals[(triangle * 3) + 2];\n\t\t\t\t}\n\t\t\t\tStream << \"]\\n\";\n\t\t\t}\n\n\t\t\tStream << k3d::pop_indent;\n\t\t}\n*/\n\n\t\tStream << k3d::pop_indent;\n\t\tStream << k3d::pop_indent << k3d::standard_indent << \"AttributeEnd\\n\";\n\t}\n\n\tvoid render_paraboloid(const material::name_map& MaterialNames, k3d::inode& MeshInstance, const k3d::mesh& Mesh, k3d::paraboloid::const_primitive& Paraboloid, std::ostream& Stream)\n\t{\n\t\tfor(k3d::uint_t i = 0; i != Paraboloid.matrices.size(); ++i)\n\t\t{\n\t\t\tStream << k3d::standard_indent << \"AttributeBegin\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"ConcatTransform [\" << convert(k3d::node_to_world_matrix(MeshInstance) * Paraboloid.matrices[i]) << \"]\\n\" << k3d::push_indent;\n\n\t\t\tmaterial::use(MaterialNames, Paraboloid.materials[i], Stream);\n\n\t\t\tStream << k3d::standard_indent << \"Shape \\\"paraboloid\\\"\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"\\\"float radius\\\" [\" << Paraboloid.radii[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float zmin\\\" [\" << Paraboloid.z_min[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float zmax\\\" [\" << Paraboloid.z_max[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float phimax\\\" [\" << k3d::degrees(Paraboloid.sweep_angles[i]) << \"]\\n\";\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent << k3d::standard_indent << \"AttributeEnd\\n\";\n\t\t}\n\t}\n\n\tvoid render_polyhedron(const material::name_map& MaterialNames, k3d::inode& MeshInstance, const k3d::mesh& Mesh, k3d::polyhedron::const_primitive& Polyhedron, std::ostream& Stream)\n\t{\n\t\t// Triangulate the polyhedron faces ...\n\t\tconst k3d::mesh::normals_t* const vertex_normals = Mesh.point_attributes.lookup<k3d::mesh::normals_t>(\"N\");\n\t\tconst k3d::mesh::normals_t* const face_normals = Polyhedron.face_attributes.lookup<k3d::mesh::normals_t>(\"N\");\n\t\tconst k3d::mesh::normals_t* const edge_normals = Polyhedron.edge_attributes.lookup<k3d::mesh::normals_t>(\"N\");\n\n\t\tk3d::mesh::points_t triangle_points; // Receives the list of triangle vertices\n\t\tk3d::mesh::normals_t triangle_normals; // Receives the (optional) list of triangle normals\n\t\tstd::vector<k3d::imaterial*> triangle_materials; // Recieves the list of triangle materials\n\n\t\tcreate_triangles(*Mesh.points, vertex_normals, face_normals, edge_normals, Polyhedron.face_materials, triangle_points, triangle_normals, triangle_materials).process(Mesh, Polyhedron);\n\n\t\t// Get the set of unique materials ...\n\t\tstd::set<k3d::imaterial*> material_list(triangle_materials.begin(), triangle_materials.end());\n\n\t\t// Make it happen ...\n\t\tStream << k3d::standard_indent << \"AttributeBegin\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"Transform [\" << convert(k3d::node_to_world_matrix(MeshInstance)) << \"]\\n\" << k3d::push_indent;\n\n\t\t// For each material, render the triangles that use that material ...\n\t\tfor(std::set<k3d::imaterial*>::const_iterator material = material_list.begin(); material != material_list.end(); ++material)\n\t\t{\n\t\t\tmaterial::use(MaterialNames, *material, Stream);\n\n\t\t\tStream << k3d::standard_indent << \"Shape \\\"trianglemesh\\\"\\n\" << k3d::push_indent;\n\n\t\t\tconst k3d::uint_t triangle_begin = 0;\n\t\t\tconst k3d::uint_t triangle_end = triangle_begin + triangle_materials.size();\n\n\t\t\tStream << k3d::standard_indent << \"\\\"integer indices\\\" [\";\n\t\t\tfor(k3d::uint_t triangle = triangle_begin; triangle != triangle_end; ++triangle)\n\t\t\t{\n\t\t\t\tif(triangle_materials[triangle] != *material)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tStream << \" \" << (triangle * 3) + 0 << \" \" << (triangle * 3) + 1 << \" \" << (triangle * 3) + 2;\n\t\t\t}\n\t\t\tStream << \"]\\n\";\n\n\t\t\tStream << k3d::standard_indent << \"\\\"point P\\\" [\";\n\t\t\tfor(k3d::uint_t triangle = triangle_begin; triangle != triangle_end; ++triangle)\n\t\t\t{\n\t\t\t\tif(triangle_materials[triangle] != *material)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tStream << \" \" << triangle_points[(triangle * 3) + 0] << \" \" << triangle_points[(triangle * 3) + 1] << \" \" << triangle_points[(triangle * 3) + 2];\n\t\t\t}\n\t\t\tStream << \"]\\n\";\n\n\t\t\tif(triangle_normals.size())\n\t\t\t{\n\t\t\t\tStream << k3d::standard_indent << \"\\\"normal N\\\" [\";\n\t\t\t\tfor(k3d::uint_t triangle = triangle_begin; triangle != triangle_end; ++triangle)\n\t\t\t\t{\n\t\t\t\t\tif(triangle_materials[triangle] != *material)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tStream << \" \" << triangle_normals[(triangle * 3) + 0] << \" \" << triangle_normals[(triangle * 3) + 1] << \" \" << triangle_normals[(triangle * 3) + 2];\n\t\t\t\t}\n\t\t\t\tStream << \"]\\n\";\n\t\t\t}\n\n\t\t\tStream << k3d::pop_indent;\n\t\t}\n\n\t\tStream << k3d::pop_indent;\n\t\tStream << k3d::pop_indent << k3d::standard_indent << \"AttributeEnd\\n\";\n\t}\n\n\tvoid render_sphere(const material::name_map& MaterialNames, k3d::inode& MeshInstance, const k3d::mesh& Mesh, k3d::sphere::const_primitive& Sphere, std::ostream& Stream)\n\t{\n\t\tfor(k3d::uint_t i = 0; i != Sphere.matrices.size(); ++i)\n\t\t{\n\t\t\tStream << k3d::standard_indent << \"AttributeBegin\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"ConcatTransform [\" << convert(k3d::node_to_world_matrix(MeshInstance) * Sphere.matrices[i]) << \"]\\n\" << k3d::push_indent;\n\n\t\t\tmaterial::use(MaterialNames, Sphere.materials[i], Stream);\n\n\t\t\tStream << k3d::standard_indent << \"Shape \\\"sphere\\\"\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"\\\"float radius\\\" [\" << Sphere.radii[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float zmin\\\" [\" << Sphere.radii[i] * Sphere.z_min[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float zmax\\\" [\" << Sphere.radii[i] * Sphere.z_max[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float phimax\\\" [\" << k3d::degrees(Sphere.sweep_angles[i]) << \"]\\n\";\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent << k3d::standard_indent << \"AttributeEnd\\n\";\n\t\t}\n\t}\n\n\tvoid render_torus(const material::name_map& MaterialNames, k3d::inode& MeshInstance, const k3d::mesh& Mesh, k3d::torus::const_primitive& Torus, std::ostream& Stream)\n\t{\n\t\tfor(k3d::uint_t i = 0; i != Torus.matrices.size(); ++i)\n\t\t{\n\t\t\tStream << k3d::standard_indent << \"AttributeBegin\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"ConcatTransform [\" << convert(k3d::node_to_world_matrix(MeshInstance) * Torus.matrices[i]) << \"]\\n\" << k3d::push_indent;\n\n\t\t\tmaterial::use(MaterialNames, Torus.materials[i], Stream);\n\n\t\t\tStream << k3d::standard_indent << \"Shape \\\"torus\\\"\\n\" << k3d::push_indent;\n\t\t\tStream << k3d::standard_indent << \"\\\"float majorradius\\\" [\" << Torus.major_radii[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float minorradius\\\" [\" << Torus.minor_radii[i] << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float thetamin\\\" [\" << k3d::degrees(Torus.phi_min[i]) << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float thetamax\\\" [\" << k3d::degrees(Torus.phi_max[i]) << \"]\\n\";\n\t\t\tStream << k3d::standard_indent << \"\\\"float phimax\\\" [\" << k3d::degrees(Torus.sweep_angles[i]) << \"]\\n\";\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent;\n\t\t\tStream << k3d::pop_indent << k3d::standard_indent << \"AttributeEnd\\n\";\n\t\t}\n\t}\n\n\tvoid render_mesh_instance(const material::name_map& MaterialNames, k3d::inode& MeshInstance, std::ostream& Stream)\n\t{\n\t\tconst k3d::mesh* const mesh = k3d::property::pipeline_value<k3d::mesh*>(MeshInstance, \"output_mesh\");\n\t\tif(!mesh)\n\t\t\treturn;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = mesh->primitives.begin(); primitive != mesh->primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::cone::const_primitive> cone(k3d::cone::validate(*mesh, **primitive));\n\t\t\tif(cone)\n\t\t\t{\n\t\t\t\trender_cone(MaterialNames, MeshInstance, *mesh, *cone, Stream);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tboost::scoped_ptr<k3d::cylinder::const_primitive> cylinder(k3d::cylinder::validate(*mesh, **primitive));\n\t\t\tif(cylinder)\n\t\t\t{\n\t\t\t\trender_cylinder(MaterialNames, MeshInstance, *mesh, *cylinder, Stream);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tboost::scoped_ptr<k3d::disk::const_primitive> disk(k3d::disk::validate(*mesh, **primitive));\n\t\t\tif(disk)\n\t\t\t{\n\t\t\t\trender_disk(MaterialNames, MeshInstance, *mesh, *disk, Stream);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tboost::scoped_ptr<k3d::hyperboloid::const_primitive> hyperboloid(k3d::hyperboloid::validate(*mesh, **primitive));\n\t\t\tif(hyperboloid)\n\t\t\t{\n\t\t\t\trender_hyperboloid(MaterialNames, MeshInstance, *mesh, *hyperboloid, Stream);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs_patch(k3d::nurbs_patch::validate(*mesh, **primitive));\n\t\t\tif(nurbs_patch)\n\t\t\t{\n\t\t\t\trender_nurbs_patch(MaterialNames, MeshInstance, *mesh, *nurbs_patch, Stream);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tboost::scoped_ptr<k3d::paraboloid::const_primitive> paraboloid(k3d::paraboloid::validate(*mesh, **primitive));\n\t\t\tif(paraboloid)\n\t\t\t{\n\t\t\t\trender_paraboloid(MaterialNames, MeshInstance, *mesh, *paraboloid, Stream);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, **primitive));\n\t\t\tif(polyhedron)\n\t\t\t{\n\t\t\t\trender_polyhedron(MaterialNames, MeshInstance, *mesh, *polyhedron, Stream);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tboost::scoped_ptr<k3d::sphere::const_primitive> sphere(k3d::sphere::validate(*mesh, **primitive));\n\t\t\tif(sphere)\n\t\t\t{\n\t\t\t\trender_sphere(MaterialNames, MeshInstance, *mesh, *sphere, Stream);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tboost::scoped_ptr<k3d::torus::const_primitive> torus(k3d::torus::validate(*mesh, **primitive));\n\t\t\tif(torus)\n\t\t\t{\n\t\t\t\trender_torus(MaterialNames, MeshInstance, *mesh, *torus, Stream);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid start_file(std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"# LuxRender scene generated by K-3D Version \" K3D_VERSION \", http://www.k-3d.org\\n\\n\";\n\t}\n\n\tk3d::bool_t render(k3d::icamera& Camera, k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& OutputImagePath, const k3d::bool_t VisibleRender)\n\t{\n\t\ttry\n\t\t{\n\t\t\t// Start our luxrender XML file ...\n\t\t\tconst k3d::filesystem::path scene_path = Frame.add_file(\"world.lxs\");\n\t\t\tk3d::filesystem::ofstream scene_stream(scene_path);\n\t\t\treturn_val_if_fail(scene_stream.good(), false);\n\t\t\tstart_file(scene_stream);\n\n\t\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\t\targuments.push_back(k3d::inetwork_render_frame::argument(scene_path.native_filesystem_string()));\n\n\t\t\tif(VisibleRender)\n\t\t\t\tFrame.add_exec_command(\"luxrender\", environment, arguments);\n\t\t\telse\n\t\t\t\tFrame.add_exec_command(\"luxconsole\", environment, arguments);\n\n\t\t\t// Setup the camera ...\n\t\t\tk3d::iperspective* const perspective = dynamic_cast<k3d::iperspective*>(&Camera.projection());\n\t\t\tif(!perspective)\n\t\t\t\tthrow std::runtime_error(\"A perspective projection is required.\");\n\n\t\t\tconst k3d::matrix4 camera_matrix = k3d::property::pipeline_value<k3d::matrix4>(Camera.transformation().matrix_source_output());\n\t\t\tconst k3d::point3 camera_from = k3d::position(camera_matrix);\n\t\t\tconst k3d::point3 camera_to = camera_from + (camera_matrix * k3d::vector3(0, 0, 1));\n\t\t\tconst k3d::vector3 camera_up = camera_matrix * k3d::vector3(0, 1, 0);\n\t\t\tscene_stream << k3d::standard_indent << \"LookAt \" << convert(camera_from) << \" \" << convert(camera_to) << \" \" << convert(camera_up) << \"\\n\";\n\n\t\t\tconst k3d::double_t camera_left = k3d::property::pipeline_value<k3d::double_t>(perspective->left());\n\t\t\tconst k3d::double_t camera_right = k3d::property::pipeline_value<k3d::double_t>(perspective->right());\n\t\t\tconst k3d::double_t camera_top = k3d::property::pipeline_value<k3d::double_t>(perspective->top());\n\t\t\tconst k3d::double_t camera_bottom = k3d::property::pipeline_value<k3d::double_t>(perspective->bottom());\n\t\t\tconst k3d::double_t camera_near = k3d::property::pipeline_value<k3d::double_t>(perspective->near());\n\t\t\tconst k3d::double_t camera_far = k3d::property::pipeline_value<k3d::double_t>(perspective->far());\n\n\t\t\tconst k3d::double_t camera_width = std::abs(camera_right - camera_left);\n\t\t\tconst k3d::double_t camera_height = std::abs(camera_top - camera_bottom);\n\t\t\tconst k3d::double_t camera_fov = k3d::degrees(2 * atan2(0.5 * std::min(camera_width, camera_height), camera_near));\n\n\t\t\tscene_stream << k3d::standard_indent << \"Camera \\\"perspective\\\"\\n\" << k3d::push_indent;\n\t\t\tscene_stream << k3d::standard_indent << \"\\\"float hither\\\" [\" << camera_near << \"]\\n\";\n\t\t\tscene_stream << k3d::standard_indent << \"\\\"float yon\\\" [\" << camera_far << \"]\\n\";\n\t\t\tscene_stream << k3d::standard_indent << \"\\\"float fov\\\" [\" << camera_fov << \"]\\n\";\n\t\t\tscene_stream << k3d::pop_indent;\n\n\t\t\t// Setup output options ...\n\t\t\tconst k3d::int32_t pixel_width = m_pixel_width.pipeline_value();\n\t\t\tconst k3d::int32_t pixel_height = m_pixel_height.pipeline_value();\n\n\t\t\tscene_stream << k3d::standard_indent << \"Film \\\"fleximage\\\"\\n\" << k3d::push_indent;\n\t\t\tscene_stream << k3d::standard_indent << \"\\\"string filename\\\" [\\\"\" << OutputImagePath.native_filesystem_string() << \"\\\"]\\n\";\n\t\t\tscene_stream << k3d::standard_indent << \"\\\"integer xresolution\\\" [\" << pixel_width << \"]\\n\";\n\t\t\tscene_stream << k3d::standard_indent << \"\\\"integer yresolution\\\" [\" << pixel_height << \"]\\n\";\n\n\t\t\tif(!VisibleRender)\n\t\t\t\tscene_stream << k3d::standard_indent << \"\\\"integer haltspp\\\" [\" << m_halt_samples.pipeline_value() << \"]\\n\";\n\n\t\t\tscene_stream << k3d::pop_indent;\n\n\t\t\t// Scene setup ...\n\t\t\tscene_stream << k3d::standard_indent << \"WorldBegin\\n\" << k3d::push_indent;\n\n\t\t\t// Setup a separate file for lights ...\n\t\t\tconst k3d::filesystem::path light_path = Frame.add_file(\"lights.lxs\");\n\t\t\tk3d::filesystem::ofstream light_stream(light_path);\n\t\t\treturn_val_if_fail(light_stream.good(), false);\n\t\t\tstart_file(light_stream);\n\n\t\t\t// Setup lights ...\n\t\t\tconst k3d::inode_collection_property::nodes_t enabled_lights = m_enabled_lights.pipeline_value();\n\t\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = enabled_lights.begin(); node != enabled_lights.end(); ++node)\n\t\t\t{\n\t\t\t\tif(luxrender::light* const light = dynamic_cast<luxrender::light*>(*node))\n\t\t\t\t{\n\t\t\t\t\tlight->setup(light_stream);\n\t\t\t\t}\n\t\t\t}\n\t\t\tscene_stream << k3d::standard_indent << \"Include \\\"\" << light_path.native_filesystem_string() << \"\\\"\\n\";\n\n\t\t\t// Setup a separate file for textures and materials ...\n\t\t\tconst k3d::filesystem::path material_path = Frame.add_file(\"materials.lxs\");\n\t\t\tk3d::filesystem::ofstream material_stream(material_path);\n\t\t\treturn_val_if_fail(material_stream.good(), false);\n\t\t\tstart_file(material_stream);\n\n\t\t\t// Setup textures, assigning unique names as-we-go ...\n\t\t\ttexture::name_map texture_names;\n\t\t\tconst std::vector<texture*> textures = k3d::node::lookup<texture>(document());\n\t\t\tfor(k3d::uint_t i = 0; i != textures.size(); ++i)\n\t\t\t\ttextures[i]->setup(texture_names, material_stream);\n\n\t\t\t// Setup materials, assigning unique names as-we-go ...\n\t\t\tmaterial::name_map material_names;\n\t\t\tconst std::vector<material*> materials = k3d::node::lookup<material>(document());\n\t\t\tfor(k3d::uint_t i = 0; i != materials.size(); ++i)\n\t\t\t\tmaterials[i]->setup(texture_names, material_names, material_stream);\n\t\t\tscene_stream << k3d::standard_indent << \"Include \\\"\" << material_path.native_filesystem_string() << \"\\\"\\n\";\n\n\t\t\t// Setup a separate file for geometry ...\n\t\t\tconst k3d::filesystem::path geometry_path = Frame.add_file(\"geometry.lxs\");\n\t\t\tk3d::filesystem::ofstream geometry_stream(geometry_path);\n\t\t\treturn_val_if_fail(geometry_stream.good(), false);\n\t\t\tstart_file(geometry_stream);\n\n\t\t\t// Render geometry ...\n\t\t\tconst k3d::inode_collection_property::nodes_t visible_nodes = m_visible_nodes.pipeline_value();\n\t\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = visible_nodes.begin(); node != visible_nodes.end(); ++node)\n\t\t\t{\n\t\t\t\tif((*node)->factory().factory_id() != k3d::classes::MeshInstance())\n\t\t\t\t\tcontinue;\n\n\t\t\t\trender_mesh_instance(material_names, **node, geometry_stream);\n\t\t\t}\n\t\t\tscene_stream << k3d::standard_indent << \"Include \\\"\" << geometry_path.native_filesystem_string() << \"\\\"\\n\";\n\n\t\t\tscene_stream << k3d::pop_indent << k3d::standard_indent << \"WorldEnd\\n\";\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << \"exception: \" << e.what() << std::endl;\n\t\t\treturn false;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << \"unknown exception\" << std::endl;\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/// Helper class that limits the list of visible nodes to those that we can render\n\ttemplate<typename value_t, class name_policy_t>\n\tclass luxrender_visible_nodes_property :\n\t\tpublic k3d::data::writable_property<value_t, name_policy_t>,\n\t\tpublic k3d::inode_collection_property\n\t{\n\t\ttypedef k3d::data::writable_property<value_t, name_policy_t> base;\n\n\tpublic:\n\t\tk3d::bool_t property_allow(k3d::inode& Node)\n\t\t{\n\t\t\treturn Node.factory().factory_id() == k3d::classes::MeshInstance();\n\t\t}\n\n\tprotected:\n\t\ttemplate<typename init_t>\n\t\tluxrender_visible_nodes_property(const init_t& Init) :\n\t\t\tbase(Init)\n\t\t{\n\t\t}\n\t};\n\n\t/// Helper class that limits the list of enabled lights\n\ttemplate<typename value_t, class name_policy_t>\n\tclass luxrender_enabled_lights_property :\n\t\tpublic k3d::data::writable_property<value_t, name_policy_t>,\n\t\tpublic k3d::inode_collection_property\n\t{\n\t\ttypedef k3d::data::writable_property<value_t, name_policy_t> base;\n\n\tpublic:\n\t\tk3d::bool_t property_allow(k3d::inode& Node)\n\t\t{\n\t\t\treturn dynamic_cast<luxrender::light*>(&Node) ? true : false;\n\t\t}\n\n\tprotected:\n\t\ttemplate<typename init_t>\n\t\tluxrender_enabled_lights_property(const init_t& Init) :\n\t\t\tbase(Init)\n\t\t{\n\t\t}\n\t};\n\n// define properties\n\tk3d_data(k3d::inode_collection_property::nodes_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, luxrender_visible_nodes_property, node_collection_serialization) m_visible_nodes;\n\tk3d_data(k3d::inode_collection_property::nodes_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, luxrender_enabled_lights_property, node_collection_serialization) m_enabled_lights;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_resolution;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_width;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_height;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_halt_samples;\n};\n\nk3d::iplugin_factory& render_engine_factory()\n{\n\treturn render_engine::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/rough_glass_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture_reference.h\"\n#include \"material.h\"\n#include \"scalar_texture_reference.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass rough_glass_material :\n\tpublic material\n{\n\ttypedef material base;\n\npublic:\n\trough_glass_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_kr(*this, \"kr\", _(\"Kr\"), _(\"Surface reflectivity.\"), _(\"Kr Texture\"), k3d::color(1, 1, 1)),\n\t\tm_kt(*this, \"kt\", _(\"Kt\"), _(\"Fraction of light transmitted through the surface.\"), _(\"Kt Texture\"), k3d::color(1, 1, 1)),\n\t\tm_u_roughness(*this, \"u_roughness\", _(\"U Roughness\"), _(\"U Roughness.\"), _(\"U Roughness Texture\"), 0.001),\n\t\tm_v_roughness(*this, \"v_roughness\", _(\"V Roughness\"), _(\"V Roughness.\"), _(\"V Roughness Texture\"), 0.001),\n\t\tm_index(*this, \"index\", _(\"Index\"), _(\"Index of refraction.\"), _(\"Index Texture\"), 1.5),\n\t\tm_cauchy_b(*this, \"cauchy_b\", _(\"Cauchy B\"), _(\"Cauchy B coefficient.\"), _(\"Cauchy B Texture\"), 0.0)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<rough_glass_material,\n\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0x4f3bbd0c, 0x2746e725, 0xb37e4b9a, 0x1a7a0299),\n\t\t\t\"LuxRenderRoughGlassMaterial\",\n\t\t\t_(\"LuxRender Rough Glass Material\"),\n\t\t\t\"LuxRender Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_setup(const texture::name_map& TextureNames, material::name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"MakeNamedMaterial \\\"\" << Name << \"\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"string type\\\" [\\\"roughglass\\\"]\\n\";\n\t\t\n\t\tsetup_bumpmap(TextureNames, Stream);\n\t\tm_kr.setup(TextureNames, \"color\", \"Kr\", Stream);\n\t\tm_kt.setup(TextureNames, \"color\", \"Kt\", Stream);\n\t\tm_u_roughness.setup(TextureNames, \"float\", \"uroughness\", Stream);\n\t\tm_v_roughness.setup(TextureNames, \"float\", \"vroughness\", Stream);\n\t\tm_index.setup(TextureNames, \"float\", \"index\", Stream);\n\t\tm_cauchy_b.setup(TextureNames, \"float\", \"cauchyb\", Stream);\n\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tcolor_texture_reference m_kr;\n\tcolor_texture_reference m_kt;\n\tscalar_texture_reference m_u_roughness;\n\tscalar_texture_reference m_v_roughness;\n\tscalar_texture_reference m_index;\n\tscalar_texture_reference m_cauchy_b;\n};\n\nk3d::iplugin_factory& rough_glass_material_factory()\n{\n\treturn rough_glass_material::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/scalar_image_texture.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"scalar_texture.h\"\n#include \"texture2.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// wrap_values\n\nstatic const k3d::ilist_property<std::string>::values_t& wrap_values()\n{\n\tstatic k3d::ilist_property<std::string>::values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(\"repeat\");\n\t\tvalues.push_back(\"black\");\n\t\tvalues.push_back(\"clamp\");\n\t}\n\treturn values;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// filtertype_values\n\nstatic const k3d::ilist_property<std::string>::values_t& filtertype_values()\n{\n\tstatic k3d::ilist_property<std::string>::values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(\"bilinear\");\n\t\tvalues.push_back(\"mipmap_trilinear\");\n\t\tvalues.push_back(\"mapmap_ewa\");\n\t\tvalues.push_back(\"nearest\");\n\t}\n\treturn values;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// scalar_image_texture\n\nclass scalar_image_texture :\n\tpublic texture2,\n\tpublic scalar_texture\n{\n\ttypedef texture2 base;\n\npublic:\n\tscalar_image_texture(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Path to a bitmap image.\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(\"texture\")),\n\t\tm_wrap(init_owner(*this) + init_name(\"wrap\") + init_label(_(\"Wrap\")) + init_description(_(\"Specifies how to wrap the texture.\")) + init_value(k3d::string_t(\"repeat\")) + init_values(wrap_values())),\n\t\tm_filtertype(init_owner(*this) + init_name(\"filtertype\") + init_label(_(\"Filter\")) + init_description(_(\"Specifies how to filter the texture.\")) + init_value(k3d::string_t(\"bilinear\")) + init_values(filtertype_values())),\n\t\tm_gain(init_owner(*this) + init_name(\"gain\") + init_label(_(\"Gain\")) + init_description(_(\"Applies a gain function to the texture.\")) + init_value(1.0)),\n\t\tm_gamma(init_owner(*this) + init_name(\"gamma\") + init_label(_(\"Gamma\")) + init_description(_(\"Applies a gamma function to the texture.\")) + init_value(2.2))\n\t{\n\t}\n\n\tvoid on_setup(name_map& TextureNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"Texture \\\"\" << Name << \"\\\" \\\"float\\\" \\\"imagemap\\\"\\n\" << k3d::push_indent;\n\t\tsetup_texture2(Stream);\n\t\tStream << k3d::standard_indent << \"\\\"string filename\\\" [\\\"\" << m_file.pipeline_value().native_filesystem_string() << \"\\\"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"string wrap\\\" [\\\"\" << m_wrap.pipeline_value() << \"\\\"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"string filtertype\\\" [\\\"\" << m_filtertype.pipeline_value() << \"\\\"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"float gain\\\" [\" << m_gain.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"float gamma\\\" [\" << m_gamma.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::pop_indent; \n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<scalar_image_texture,\n\t\t\tk3d::interface_list<k3d::itexture> > factory(\n\t\t\tk3d::uuid(0xf730e933, 0xb44761f7, 0x7d5ef696, 0x4290345f),\n\t\t\t\"LuxRenderScalarImageTexture\",\n\t\t\t_(\"LuxRender Scalar Image Texture\"),\n\t\t\t\"LuxRender\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, with_serialization) m_file;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_wrap;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_filtertype;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_gain;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_gamma;\n};\n\nk3d::iplugin_factory& scalar_image_texture_factory()\n{\n\treturn scalar_image_texture::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/scalar_texture.h",
    "content": "#ifndef MODULES_LUXRENDER_SCALAR_TEXTURE_H\n#define MODULES_LUXRENDER_SCALAR_TEXTURE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/itexture.h>\n#include <k3dsdk/types.h>\n\n#include <iosfwd>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// scalar_texture\n\n/// Abstract interface for LuxRender float texture nodes.\nclass scalar_texture :\n\tpublic k3d::itexture\n{\npublic:\n};\n\n} // namespace luxrender\n\n} // namespace module\n\n#endif // !MODULES_LUXRENDER_SCALAR_TEXTURE_H\n\n"
  },
  {
    "path": "modules/luxrender/scalar_texture_reference.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"scalar_texture.h\"\n#include \"scalar_texture_reference.h\"\n\n#include <k3dsdk/iomanip.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// scalar_texture_reference\n\nvoid scalar_texture_reference::setup(const texture::name_map& TextureNames, const k3d::string_t& Type, const k3d::string_t& Name, std::ostream& Stream)\n{\n\tif(texture* const texture_node = dynamic_cast<texture*>(m_texture.pipeline_value()))\n\t{\n\t\ttexture::use(TextureNames, texture_node, Name, Stream);\n\t\treturn;\n\t}\n\n\tStream << k3d::standard_indent << \"\\\"\" << Type << \" \" << Name << \"\\\" [\" << m_scalar.pipeline_value() << \"]\\n\";\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/scalar_texture_reference.h",
    "content": "#ifndef MODULES_LUXRENDER_SCALAR_TEXTURE_REFERENCE_H\n#define MODULES_LUXRENDER_SCALAR_TEXTURE_REFERENCE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture.h\"\n#include \"texture.h\"\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/itexture.h>\n#include <k3dsdk/tokens.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// scalar_texture_reference\n\n/// Wraps a set of K-3D properties for use as a LuxRender color texture.\nclass scalar_texture_reference\n{\npublic:\n\ttemplate<typename OwnerT>\n\tscalar_texture_reference(OwnerT& Owner, const char* const Name, const char* const Label, const char* const Description, const char* TextureLabel, const k3d::double_t Value) :\n\tm_scalar(\n\t\tinit_owner(Owner)\n\t\t+ init_name(Name)\n\t\t+ init_label(Label)\n\t\t+ init_description(Description)\n\t\t+ init_value(Value)\n\t\t),\n\tm_texture(\n\t\tinit_owner(Owner)\n\t\t+ init_name(k3d::make_token((k3d::string_t(Name) + \"_texture\").c_str()))\n\t\t+ init_label(TextureLabel)\n\t\t+ init_description(Description)\n\t\t+ init_value(static_cast<scalar_texture*>(0))\n\t\t)\n\t{\n\t}\n\n\t/// Inserts the texture state into a LuxRender scene as part of a Material definition.\n\tvoid setup(const texture::name_map& TextureNames, const k3d::string_t& Type, const k3d::string_t& Name, std::ostream& Stream);\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_scalar;\n\tk3d_data(scalar_texture*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_texture;\n};\n\n} // namespace luxrender\n\n} // namespace module\n\n#endif // !MODULES_LUXRENDER_SCALAR_TEXTURE_REFERENCE_H\n\n"
  },
  {
    "path": "modules/luxrender/shiny_metal_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"color_texture_reference.h\"\n#include \"material.h\"\n#include \"scalar_texture_reference.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass shiny_metal_material :\n\tpublic material\n{\n\ttypedef material base;\n\npublic:\n\tshiny_metal_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_ks(*this, \"ks\", _(\"Ks\"), _(\"Glossy color.\"), _(\"Ks Texture\"), k3d::color(1, 1, 1)),\n\t\tm_kr(*this, \"kr\", _(\"Kr\"), _(\"Specular color.\"), _(\"Kr Texture\"), k3d::color(1, 1, 1)),\n\t\tm_u_roughness(*this, \"u_roughness\", _(\"U Roughness\"), _(\"U Roughness.\"), _(\"U Roughness Texture\"), 0.001),\n\t\tm_v_roughness(*this, \"v_roughness\", _(\"V Roughness\"), _(\"V Roughness.\"), _(\"V Roughness Texture\"), 0.001),\n\t\tm_film(*this, \"film\", _(\"Film\"), _(\"Thin film coating thickness (nanometers).\"), _(\"Film Texture\"), 0.001),\n\t\tm_film_index(*this, \"film_index\", _(\"Film Index\"), _(\"Index of refraction of the thin film coating.\"), _(\"Film Index Texture\"), 1.5)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<shiny_metal_material,\n\t\t\tk3d::interface_list<k3d::imaterial> > factory(\n\t\t\tk3d::uuid(0x6059f7c9, 0xda4b0775, 0x2aa066b6, 0x738d9433),\n\t\t\t\"LuxRenderShinyMetalMaterial\",\n\t\t\t_(\"LuxRender Shiny Metal Material\"),\n\t\t\t\"LuxRender Material\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_setup(const texture::name_map& TextureNames, material::name_map& MaterialNames, const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"MakeNamedMaterial \\\"\" << Name << \"\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"string type\\\" [\\\"shinymetal\\\"]\\n\";\n\t\t\n\t\tsetup_bumpmap(TextureNames, Stream);\n\t\tm_ks.setup(TextureNames, \"color\", \"Ks\", Stream);\n\t\tm_kr.setup(TextureNames, \"color\", \"Kr\", Stream);\n\t\tm_u_roughness.setup(TextureNames, \"float\", \"uroughness\", Stream);\n\t\tm_v_roughness.setup(TextureNames, \"float\", \"vroughness\", Stream);\n\t\tm_film.setup(TextureNames, \"float\", \"film\", Stream);\n\t\tm_film_index.setup(TextureNames, \"float\", \"filmindex\", Stream);\n\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tcolor_texture_reference m_ks;\n\tcolor_texture_reference m_kr;\n\tscalar_texture_reference m_u_roughness;\n\tscalar_texture_reference m_v_roughness;\n\tscalar_texture_reference m_film;\n\tscalar_texture_reference m_film_index;\n};\n\nk3d::iplugin_factory& shiny_metal_material_factory()\n{\n\treturn shiny_metal_material::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/sky_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n#include \"utility.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/vector3.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sky_light\n\nclass sky_light :\n\tpublic light\n{\n\ttypedef light base;\n\npublic:\n\tsky_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_gain(init_owner(*this) + init_name(\"gain\") + init_label(_(\"Gain\")) + init_description(_(\"Scales light intensity.\")) + init_value(0.005)),\n\t\tm_samples(init_owner(*this) + init_name(\"samples\") + init_label(_(\"Samples\")) + init_description(_(\"Shadow samples.\")) + init_value(1)),\n\t\tm_direction(init_owner(*this) + init_name(\"direction\") + init_label(_(\"Direction\")) + init_description(_(\"Vector pointing to the sun.\")) + init_value(k3d::vector3(0, 0, 1))),\n\t\tm_turbidity(init_owner(*this) + init_name(\"turbidity\") + init_label(_(\"Turbidity\")) + init_description(_(\"Controls sky_light clarity / haziness.\")) + init_value(2.0))\n\t{\n\t}\n\n\tvoid on_setup(std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"LightSource \\\"sky\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"float gain\\\" [\" << m_gain.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"integer nsamples\\\" [\" << m_samples.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"vector sundir\\\" [\" << convert(m_direction.pipeline_value()) << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"float turbidity\\\" [\" << m_turbidity.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sky_light> factory(\n\t\t\tk3d::uuid(0x0d372c47, 0xca43956e, 0x128aed90, 0xb2fb05f2),\n\t\t\t\"LuxRenderSkyLight\",\n\t\t\t_(\"LuxRender SkyLight\"),\n\t\t\t\"LuxRender Light\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_gain;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_samples;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_direction;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_turbidity;\n};\n\nk3d::iplugin_factory& sky_light_factory()\n{\n\treturn sky_light::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/sun_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"light.h\"\n#include \"utility.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/vector3.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sun_light\n\nclass sun_light :\n\tpublic light\n{\n\ttypedef light base;\n\npublic:\n\tsun_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_gain(init_owner(*this) + init_name(\"gain\") + init_label(_(\"Gain\")) + init_description(_(\"Scales light intensity.\")) + init_value(0.005)),\n\t\tm_samples(init_owner(*this) + init_name(\"samples\") + init_label(_(\"Samples\")) + init_description(_(\"Shadow samples.\")) + init_value(1)),\n\t\tm_direction(init_owner(*this) + init_name(\"direction\") + init_label(_(\"Direction\")) + init_description(_(\"Vector pointing to the sun.\")) + init_value(k3d::vector3(0, 0, 1))),\n\t\tm_turbidity(init_owner(*this) + init_name(\"turbidity\") + init_label(_(\"Turbidity\")) + init_description(_(\"Controls sun_light clarity / haziness.\")) + init_value(2.0)),\n\t\tm_size(init_owner(*this) + init_name(\"size\") + init_label(_(\"Size\")) + init_description(_(\"Relative size.\")) + init_value(1.0))\n\t{\n\t}\n\n\tvoid on_setup(std::ostream& Stream)\n\t{\n\t\tStream << k3d::standard_indent << \"LightSource \\\"sun\\\"\\n\" << k3d::push_indent;\n\t\tStream << k3d::standard_indent << \"\\\"float gain\\\" [\" << m_gain.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"integer nsamples\\\" [\" << m_samples.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"vector sundir\\\" [\" << convert(m_direction.pipeline_value()) << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"float turbidity\\\" [\" << m_turbidity.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"float relsize\\\" [\" << m_size.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::pop_indent;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sun_light> factory(\n\t\t\tk3d::uuid(0x31a4dc66, 0xba47822e, 0xfa07b286, 0xc4534449),\n\t\t\t\"LuxRenderSunLight\",\n\t\t\t_(\"LuxRender SunLight\"),\n\t\t\t\"LuxRender Light\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_gain;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_samples;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_direction;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_turbidity;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_size;\n};\n\nk3d::iplugin_factory& sun_light_factory()\n{\n\treturn sun_light::get_factory();\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/texture.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"texture.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/iomanip.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// texture\n\ntexture::texture(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\tk3d::node(Factory, Document)\n{\n}\n\nvoid texture::setup(name_map& TextureNames, std::ostream& Stream)\n{\n\tif(TextureNames.count(this))\n\t\treturn;\n\n\tstd::ostringstream name_buffer;\n\tname_buffer << \"Texture\" << TextureNames.size();\n\tconst k3d::string_t name = name_buffer.str();\n\n\tTextureNames.insert(std::make_pair(this, name));\n\n\ton_setup(TextureNames, name, Stream);\n}\n\nvoid texture::use(const name_map& TextureNames, k3d::iunknown* const Texture, const k3d::string_t& Name, std::ostream& Stream)\n{\n\t// Insert a reference to an existing texture ...\n\tif(texture* const lux_texture = dynamic_cast<texture*>(Texture))\n\t{\n\t\tif(TextureNames.count(lux_texture))\n\t\t{\n\t\t\tStream << k3d::standard_indent << \"\\\"texture \" << Name << \"\\\" [\\\"\" << TextureNames.find(lux_texture)->second << \"\\\"]\\n\";\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::log() << error << \"Missing named texture.\" << std::endl;\n\t}\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/texture.h",
    "content": "#ifndef MODULES_LUXRENDER_TEXTURE_H\n#define MODULES_LUXRENDER_TEXTURE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/itexture.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/types.h>\n\n#include <iosfwd>\n#include <map>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// texture\n\n/// Abstract interface for LuxRender texture objects\nclass texture :\n\tpublic k3d::node,\n\tpublic k3d::itexture\n{\npublic:\n\ttexture(k3d::iplugin_factory& Factory, k3d::idocument& Document);\n\n\t/// Provides storage for a mapping from texture objects to unique names\n\ttypedef std::map<texture*, k3d::string_t> name_map;\n\t/// Inserts a texture definition into a scene, assigning the texture a unique name\n\tvoid setup(name_map& TextureNames, std::ostream& Stream);\n\t/// Inserts a texture reference into a scene, handling NULL textures gracefully.\n\tstatic void use(const name_map& TextureNames, k3d::iunknown* const Texture, const k3d::string_t& Name, std::ostream& Stream);\n\nprivate:\n\t/// Implemented in derivatives to do the actual work of inserting the texture definition into the scene.\n\tvirtual void on_setup(name_map& TextureNames, const k3d::string_t& Name, std::ostream& Stream) = 0;\n};\n\n} // namespace luxrender\n\n} // namespace module\n\n#endif // !MODULES_LUXRENDER_TEXTURE_H\n\n"
  },
  {
    "path": "modules/luxrender/texture2.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"texture2.h\"\n#include \"utility.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/iomanip.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mapping_values\n\nstatic const k3d::ilist_property<std::string>::values_t& mapping_values()\n{\n\tstatic k3d::ilist_property<std::string>::values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(\"uv\");\n\t\tvalues.push_back(\"spherical\");\n\t\tvalues.push_back(\"cylindrical\");\n\t\tvalues.push_back(\"planar\");\n\t}\n\treturn values;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// texture2\n\ntexture2::texture2(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\tbase(Factory, Document),\n\tm_mapping(init_owner(*this) + init_name(\"mapping\") + init_label(_(\"Mapping\")) + init_description(_(\"Projection mapping.\")) + init_value(k3d::string_t(\"uv\")) + init_values(mapping_values())),\n\tm_u_scale(init_owner(*this) + init_name(\"u_scale\") + init_label(_(\"U Scale\")) + init_description(_(\"U Scale.\")) + init_value(1.0)),\n\tm_v_scale(init_owner(*this) + init_name(\"v_scale\") + init_label(_(\"V Scale\")) + init_description(_(\"V Scale.\")) + init_value(1.0)),\n\tm_u_delta(init_owner(*this) + init_name(\"u_delta\") + init_label(_(\"U Delta\")) + init_description(_(\"U Delta.\")) + init_value(0.0)),\n\tm_v_delta(init_owner(*this) + init_name(\"v_delta\") + init_label(_(\"V Delta\")) + init_description(_(\"V Delta.\")) + init_value(0.0)),\n\tm_u_axis(init_owner(*this) + init_name(\"u_axis\") + init_label(_(\"U Axis\")) + init_description(_(\"Specify the U axis for planar mapping.\")) + init_value(k3d::vector3(1, 0, 0))),\n\tm_v_axis(init_owner(*this) + init_name(\"v_axis\") + init_label(_(\"V Axis\")) + init_description(_(\"Specify the V axis for planar mapping.\")) + init_value(k3d::vector3(0, 1, 0)))\n{\n}\n\nvoid texture2::setup_texture2(std::ostream& Stream)\n{\n\tconst k3d::string_t mapping = m_mapping.pipeline_value();\n\n\tStream << k3d::standard_indent << \"\\\"string mapping\\\" \\\"\" << mapping << \"\\\"\\n\";\n\n\tif(mapping == \"uv\")\n\t{\n\t\tStream << k3d::standard_indent << \"\\\"float uscale\\\" [\" << m_u_scale.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"float vscale\\\" [\" << m_v_scale.pipeline_value() << \"]\\n\";\n\t}\n\n\tif(mapping == \"uv\" || mapping == \"planar\")\n\t{\n\t\tStream << k3d::standard_indent << \"\\\"float udelta\\\" [\" << m_u_delta.pipeline_value() << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"float vdelta\\\" [\" << m_v_delta.pipeline_value() << \"]\\n\";\n\t}\n\n\tif(mapping == \"planar\")\n\t{\n\t\tStream << k3d::standard_indent << \"\\\"vector v1\\\" [\" << convert(m_u_axis.pipeline_value()) << \"]\\n\";\n\t\tStream << k3d::standard_indent << \"\\\"vector v2\\\" [\" << convert(m_v_axis.pipeline_value()) << \"]\\n\";\n\t}\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/texture2.h",
    "content": "#ifndef MODULES_LUXRENDER_TEXTURE2_H\n#define MODULES_LUXRENDER_TEXTURE2_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"texture.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/vector3.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// texture2\n\n/// Abstract base class for LuxRender 2D texture objects\nclass texture2 :\n\tpublic texture\n{\npublic:\n\ttypedef texture base;\n\n\ttexture2(k3d::iplugin_factory& Factory, k3d::idocument& Document);\n\nprotected:\n\tvoid setup_texture2(std::ostream& Stream);\n\nprivate:\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_mapping;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_u_scale;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_v_scale;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_u_delta;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_v_delta;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_u_axis;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_v_axis;\n};\n\n} // namespace luxrender\n\n} // namespace module\n\n#endif // !MODULES_LUXRENDER_TEXTURE2_H\n\n"
  },
  {
    "path": "modules/luxrender/utility.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include \"utility.h\"\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\nconst k3d::point3 convert(const k3d::point3& Value)\n{\n\treturn k3d::point3(-Value[0], Value[1], Value[2]);\n}\n\nconst k3d::vector3 convert(const k3d::vector3& Value)\n{\n\treturn k3d::vector3(-Value[0], Value[1], Value[2]);\n}\n\nconst k3d::matrix4 convert(const k3d::matrix4& Value)\n{\n\treturn k3d::transpose(k3d::scale3(-1, 1, 1) * Value);\n}\n\n} // namespace luxrender\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/luxrender/utility.h",
    "content": "#ifndef MODULES_LUXRENDER_UTILITY_H\n#define MODULES_LUXRENDER_UTILITY_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/algebra.h>\n\nnamespace module\n{\n\nnamespace luxrender\n{\n\n/// Converts from K-3D's right-handed to LuxRender's left-handed coordinate system\nconst k3d::point3 convert(const k3d::point3& Value);\n/// Converts from K-3D's right-handed to LuxRender's left-handed coordinate system\nconst k3d::vector3 convert(const k3d::vector3& Value);\n/// Converts from K-3D's right-handed to LuxRender's left-handed coordinate system\nconst k3d::matrix4 convert(const k3d::matrix4& Value);\n\n} // namespace luxrender\n\n} // namespace module\n\n#endif // !MODULES_LUXRENDER_UTILITY_H\n\n\n"
  },
  {
    "path": "modules/matrix/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-matrix)\nK3D_CREATE_MODULE_PROXY(k3d-matrix)\n\n# TARGET_LINK_LIBRARIES(k3d-matrix)\n# TARGET_LINK_LIBRARIES(k3d-matrix k3dsdk-expression)\n"
  },
  {
    "path": "modules/matrix/frozen_matrix.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace module\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// frozen_matrix\n\nclass frozen_matrix :\n\tpublic k3d::node,\n\tpublic k3d::imatrix_source,\n\tpublic k3d::imatrix_sink\n{\n\ttypedef k3d::node base;\n\npublic:\n\tfrozen_matrix(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input(init_owner(*this) + init_name(\"input_matrix\") + init_label(_(\"Input matrix\")) + init_description(_(\"Input matrix\")) + init_value(k3d::identity3())),\n\t\tm_matrix(init_owner(*this) + init_name(\"matrix\") + init_label(_(\"Matrix\")) + init_description(_(\"Transformation matrix\")) + init_value(k3d::identity3())),\n\t\tm_output(init_owner(*this) + init_name(\"output_matrix\") + init_label(_(\"Output Matrix\")) + init_description(_(\"Output matrix (read only)\")) + init_value(k3d::identity3()))\n\t{\n\t\tm_input.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_output.make_slot()));\n\t\tm_matrix.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_output.make_slot()));\n\n\t\tm_output.set_update_slot(sigc::mem_fun(*this, &frozen_matrix::execute));\n\t}\n\n\tk3d::iproperty& matrix_source_output()\n\t{\n\t\treturn m_output;\n\t}\n\n\tk3d::iproperty& matrix_sink_input()\n\t{\n\t\treturn m_input;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<frozen_matrix,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::classes::FrozenMatrix(),\n\t\t\t\t\"FrozenMatrix\",\n\t\t\t\t_(\"Stores an arbitrary transformation matrix\"),\n\t\t\t\t\"Matrix\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input;\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_matrix;\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_output;\n\n\t/// Called whenever the output matrix has been modified and needs to be updated.\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::matrix4& Matrix)\n\t{\n\t\tMatrix = m_input.pipeline_value() * m_matrix.pipeline_value();\n\t}\n\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// frozen_matrix_factory\n\nk3d::iplugin_factory& frozen_matrix_factory()\n{\n\treturn frozen_matrix::get_factory();\n}\n\n} // namespace matrix\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/matrix/inverse.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Joaquín Duo (joaduo at lugmen org ar)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/transformable.h>\n\nnamespace module\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// inverse\n\nclass inverse :\n\tpublic k3d::transformable<k3d::node >\n{\n\ttypedef k3d::transformable<k3d::node > base;\n\npublic:\n\tinverse(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<inverse,\n\t\t\tk3d::interface_list<k3d::imatrix_sink, k3d::interface_list<k3d::imatrix_source> > > factory(\n\t\t\tk3d::uuid(0x9582e25c, 0xcf41e6fb, 0xc796fd94, 0x35a89d33),\n\t\t\t\"MatrixInverse\",\n\t\t\t_(\"Computes the inverse of a matrix.\"),\n\t\t\t\"Matrix\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_update_matrix(const k3d::matrix4& Input, k3d::matrix4& Output)\n\t{\n\t\tOutput = k3d::inverse(Input);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// inverse_factory\n\nk3d::iplugin_factory& inverse_factory()\n{\n\treturn inverse::get_factory();\n}\n\n} // namespace matrix\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/matrix/look.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/transformable.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/vectors.h>\n\nnamespace module\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// look\n\nclass look :\n\tpublic k3d::transformable<k3d::node >\n{\n\ttypedef k3d::transformable<k3d::node > base;\n\npublic:\n\tlook(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_target(init_owner(*this) + init_name(\"target_matrix\") + init_label(_(\"Target matrix\")) + init_description(_(\"Target matrix\")) + init_value(k3d::identity3()))\n\t{\n\t\tm_target.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<look,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::uuid(0x4e2a30f5, 0x6d7d47ad, 0x943ccd36, 0x4b305b55),\n\t\t\t\t\"MatrixLook\",\n\t\t\t\t_(\"Creates a transformation matrix that looks from one to another.\"),\n\t\t\t\t\"Matrix\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_update_matrix(const k3d::matrix4& Input, k3d::matrix4& Output)\n\t{\n\t\tconst k3d::matrix4 target_matrix = m_target.pipeline_value();\n\n\t\tconst k3d::point3 from = Input * k3d::point3(0, 0, 0);\n\t\tconst k3d::point3 to = target_matrix * k3d::point3(0, 0, 0);\n\t\tconst k3d::vector3 spherical = k3d::spherical(to - from);\n\n\t\tOutput = Input * rotate3(k3d::quaternion(k3d::euler_angles(0, -spherical[2], spherical[1], k3d::euler_angles::ZXYstatic)));\n\t}\n\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_target;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// look_factory\n\nk3d::iplugin_factory& look_factory()\n{\n\treturn look::get_factory();\n}\n\n} // namespace matrix\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/matrix/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Joaquín Duo (joaduo at lugmen org ar)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace matrix\n{\n\nextern k3d::iplugin_factory& frozen_matrix_factory();\nextern k3d::iplugin_factory& inverse_factory();\nextern k3d::iplugin_factory& look_factory();\nextern k3d::iplugin_factory& orientation_factory();\nextern k3d::iplugin_factory& position_factory();\nextern k3d::iplugin_factory& scale_factory();\nextern k3d::iplugin_factory& snap_factory();\nextern k3d::iplugin_factory& view_factory();\n\n} // namespace matrix\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::matrix::frozen_matrix_factory());\n\tRegistry.register_factory(module::matrix::inverse_factory());\n\tRegistry.register_factory(module::matrix::look_factory());\n\tRegistry.register_factory(module::matrix::orientation_factory());\n\tRegistry.register_factory(module::matrix::position_factory());\n\tRegistry.register_factory(module::matrix::scale_factory());\n\tRegistry.register_factory(module::matrix::snap_factory());\n\tRegistry.register_factory(module::matrix::view_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/matrix/orientation.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/transformable.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// orientation\n\nclass orientation :\n\tpublic k3d::transformable<k3d::node >\n{\n\ttypedef k3d::transformable<k3d::node > base;\n\npublic:\n\torientation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_space(init_owner(*this) + init_name(\"space\") + init_label(_(\"Coordinate space\")) + init_description(_(\"Coordinate space\")) + init_value(k3d::identity3())),\n\t\tm_x(init_owner(*this) + init_name(\"x\") + init_label(_(\"X\")) + init_description(_(\"X rotation angle\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_y(init_owner(*this) + init_name(\"y\") + init_label(_(\"Y\")) + init_description(_(\"Y rotation angle\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_z(init_owner(*this) + init_name(\"z\") + init_label(_(\"Z\")) + init_description(_(\"Z rotation angle\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_space.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_x.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_y.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_z.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<orientation,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::classes::Orientation(),\n\t\t\t\t\"MatrixOrientation\",\n\t\t\t\t_(\"Creates an orientation transform matrix\"),\n\t\t\t\t\"Matrix\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_space;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z;\n\n\tvoid on_update_matrix(const k3d::matrix4& Input, k3d::matrix4& Output)\n\t{\n\t\tOutput = Input * m_space.pipeline_value() * rotate3(k3d::point3(m_x.pipeline_value(), m_y.pipeline_value(), m_z.pipeline_value())) * k3d::inverse(m_space.pipeline_value());\n\t}\n\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// orientation_factory\n\nk3d::iplugin_factory& orientation_factory()\n{\n\treturn orientation::get_factory();\n}\n\n} // namespace matrix\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/matrix/position.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/transformable.h>\n\nnamespace module\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// position\n\nclass position :\n\tpublic k3d::transformable<k3d::node >\n{\n\ttypedef k3d::transformable<k3d::node > base;\n\npublic:\n\tposition(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_space(init_owner(*this) + init_name(\"space\") + init_label(_(\"Coordinate space\")) + init_description(_(\"Coordinate space\")) + init_value(k3d::identity3())),\n\t\tm_x(init_owner(*this) + init_name(\"x\") + init_label(_(\"X\")) + init_description(_(\"X offset\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_y(init_owner(*this) + init_name(\"y\") + init_label(_(\"Y\")) + init_description(_(\"Y offset\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z(init_owner(*this) + init_name(\"z\") + init_label(_(\"Z\")) + init_description(_(\"Z offset\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_space.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_x.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_y.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_z.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<position,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::classes::Position(),\n\t\t\t\t\"MatrixPosition\",\n\t\t\t\t_(\"Creates a position transform matrix\"),\n\t\t\t\t\"Matrix\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_space;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z;\n\n\tvoid on_update_matrix(const k3d::matrix4& Input, k3d::matrix4& Output)\n\t{\n\t\tOutput = Input * m_space.pipeline_value() * translate3(k3d::vector3(m_x.pipeline_value(), m_y.pipeline_value(), m_z.pipeline_value())) * k3d::inverse(m_space.pipeline_value());\n\t}\n\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// position_factory\n\nk3d::iplugin_factory& position_factory()\n{\n\treturn position::get_factory();\n}\n\n} // namespace matrix\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/matrix/scale.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/transformable.h>\n\nnamespace module\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// scale\n\nclass scale :\n\tpublic k3d::transformable<k3d::node >\n{\n\ttypedef k3d::transformable<k3d::node > base;\n\npublic:\n\tscale(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_space(init_owner(*this) + init_name(\"space\") + init_label(_(\"Coordinate space\")) + init_description(_(\"Coordinate space (matrix)\")) + init_value(k3d::identity3())),\n\t\tm_x(init_owner(*this) + init_name(\"x\") + init_label(_(\"X\")) + init_description(_(\"X scaling\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_y(init_owner(*this) + init_name(\"y\") + init_label(_(\"Y\")) + init_description(_(\"Y scaling\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_z(init_owner(*this) + init_name(\"z\") + init_label(_(\"Z\")) + init_description(_(\"Z scaling\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_space.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_x.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_y.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_z.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<scale,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::classes::Scale(),\n\t\t\t\t\"MatrixScale\",\n\t\t\t\t_(\"Creates a scale transform matrix\"),\n\t\t\t\t\"Matrix\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_space;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z;\n\n\tvoid on_update_matrix(const k3d::matrix4& Input, k3d::matrix4& Output)\n\t{\n\t\tOutput = Input * m_space.pipeline_value() * k3d::scale3(m_x.pipeline_value(), m_y.pipeline_value(), m_z.pipeline_value()) * k3d::inverse(m_space.pipeline_value());\n\t}\n\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// scale_factory\n\nk3d::iplugin_factory& scale_factory()\n{\n\treturn scale::get_factory();\n}\n\n} // namespace matrix\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/matrix/snap.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/isnappable.h>\n#include <k3dsdk/isnap_source.h>\n#include <k3dsdk/isnap_target.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/transformable.h>\n#include <k3dsdk/transform.h>\n\nnamespace module\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// get_snap_source\n\nk3d::isnap_source* get_snap_source(k3d::iunknown* Snappable)\n{\n\tk3d::isnappable* const snappable = dynamic_cast<k3d::isnappable*>(Snappable);\n\tif(!snappable)\n\t\treturn 0;\n\n\tconst k3d::isnappable::snap_sources_t sources = snappable->snap_sources();\n\tif(sources.empty())\n\t\treturn 0;\n\n\treturn sources[0];\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// get_snap_target\n\nk3d::isnap_target* get_snap_target(k3d::iunknown* Snappable)\n{\n\tk3d::isnappable* const snappable = dynamic_cast<k3d::isnappable*>(Snappable);\n\tif(!snappable)\n\t\treturn 0;\n\n\tconst k3d::isnappable::snap_targets_t targets = snappable->snap_targets();\n\tif(targets.empty())\n\t\treturn 0;\n\n\treturn targets[0];\n}\n\n////////////////////////////////////////////////////////////////////////////////////\n// snap\n\nclass snap :\n\tpublic k3d::transformable<k3d::node >\n{\n\ttypedef k3d::transformable<k3d::node > base;\n\npublic:\n\tsnap(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_source(init_owner(*this) + init_name(\"source\") + init_label(_(\"Source Node\")) + init_description(_(\"Source Node\")) + init_value(static_cast<k3d::isnappable*>(0))),\n\t\tm_snap_source(init_owner(*this) + init_name(\"snap_source\") + init_label(_(\"Snap Source\")) + init_description(_(\"Snap Source\")) + init_value(std::string(\"-- None --\")) + init_values(m_snap_sources)),\n\t\tm_target(init_owner(*this) + init_name(\"target\") + init_label(_(\"Target Node\")) + init_description(_(\"Target Node\")) + init_value(static_cast<k3d::isnappable*>(0))),\n\t\tm_snap_target(init_owner(*this) + init_name(\"snap_target\") + init_label(_(\"Snap Target\")) + init_description(_(\"Snap Target\")) + init_value(std::string(\"-- None --\")) + init_values(m_snap_targets)),\n\t\tm_snap_orientation(init_owner(*this) + init_name(\"snap_orientation\") + init_label(_(\"Snap Orientation\")) + init_description(_(\"Snap Orientation\")) + init_value(true))\n\t{\n\t\tm_source.changed_signal().connect(sigc::mem_fun(*this, &snap::on_source_changed));\n\t\tm_target.changed_signal().connect(sigc::mem_fun(*this, &snap::on_target_changed));\n\n\t\tm_source.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_snap_source.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_target.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_snap_target.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_snap_orientation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\n\t\ton_source_changed();\n\t\ton_target_changed();\n\t}\n\n\tvoid on_source_changed(k3d::ihint* Hint = 0)\n\t{\n\t\tm_snap_sources.clear();\n\t\tm_snap_sources.push_back(k3d::ienumeration_property::enumeration_value_t(\"-- None --\", \"-- None --\", \"-- None --\"));\n\n\t\tif(k3d::isnappable* const snappable = m_source.pipeline_value())\n\t\t{\n\t\t\tconst k3d::isnappable::snap_sources_t sources = snappable->snap_sources();\n\t\t\tfor(k3d::isnappable::snap_sources_t::const_iterator source = sources.begin(); source != sources.end(); ++source)\n\t\t\t\tm_snap_sources.push_back(k3d::ienumeration_property::enumeration_value_t((*source)->label(), (*source)->label(), (*source)->label()));\n\t\t}\n\n\t\tm_snap_source.notify_enumeration_values_changed();\n\t}\n\n\tvoid on_target_changed(k3d::ihint* Hint = 0)\n\t{\n\t\tm_snap_targets.clear();\n\t\tm_snap_targets.push_back(k3d::ienumeration_property::enumeration_value_t(\"-- None --\", \"-- None --\", \"-- None --\"));\n\n\t\tif(k3d::isnappable* const snappable = m_target.pipeline_value())\n\t\t{\n\t\t\tconst k3d::isnappable::snap_targets_t targets = snappable->snap_targets();\n\t\t\tfor(k3d::isnappable::snap_targets_t::const_iterator target = targets.begin(); target != targets.end(); ++target)\n\t\t\t\tm_snap_targets.push_back(k3d::ienumeration_property::enumeration_value_t((*target)->label(), (*target)->label(), (*target)->label()));\n\t\t}\n\n\t\tm_snap_target.notify_enumeration_values_changed();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<snap,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::uuid(0x176d4553, 0x65fc48ca, 0x845a8160, 0xd31b41ae),\n\t\t\t\t\"Snap\",\n\t\t\t\t_(\"Snaps one node to another\"),\n\t\t\t\t\"Matrix\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::isnappable*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_source;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_snap_source;\n\tk3d_data(k3d::isnappable*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_target;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_snap_target;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_snap_orientation;\n\n\tk3d::ienumeration_property::enumeration_values_t m_snap_sources;\n\tk3d::ienumeration_property::enumeration_values_t m_snap_targets;\n\n\tvoid on_update_matrix(const k3d::matrix4& Input, k3d::matrix4& Output)\n\t{\n\t\tk3d::isnappable* const source_node = m_source.pipeline_value();\n\t\tk3d::isnappable* const target_node = m_target.pipeline_value();\n\n\t\tk3d::isnap_source* const source = get_snap_source(source_node);\n\t\tif(!source)\n\t\t{\n\t\t\tOutput = Input;\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::isnap_target* const target = get_snap_target(target_node);\n\t\tif(!target)\n\t\t{\n\t\t\tOutput = Input;\n\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::matrix4 source_matrix = k3d::node_to_world_matrix(*source_node);\n\t\tconst k3d::matrix4 target_matrix = k3d::node_to_world_matrix(*target_node);\n\n\t\tconst k3d::point3 source_position = k3d::inverse(target_matrix) * source_matrix * source->source_position();\n\n\t\tk3d::point3 target_position;\n\t\tif(!target->target_position(source_position, target_position))\n\t\t{\n\t\t\tOutput = Input;\n\t\t\treturn;\n\t\t}\n\n/*\n\t\tif(m_snap_orientation.pipeline_value())\n\t\t{\n\t\t\tk3d::vector3 source_orientation;\n\t\t\tif(source->source_orientation(source_orientation))\n\t\t\t{\n\t\t\t\tsource_orientation = k3d::inverse(target_matrix) * source_matrix * source_orientation;\n\n\t\t\t\t// Calculate the target orientation in world coordinates\n\t\t\t\tk3d::vector3 target_orientation;\n\t\t\t\tif(target->target_orientation(source_position, target_orientation))\n\t\t\t\t{\n\t\t\t\t\tk3d::matrix4 rotation = k3d::rotate3(k3d::angle_axis(\n\t\t\t\t\t\tstd::acos(k3d::normalize(source_orientation) * k3d::normalize(target_orientation)),\n\t\t\t\t\t\tsource_orientation ^ target_orientation));\n\n\t\t\t\t\treturn k3d::translate3(target_position - source_position) * input_matrix * rotation;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n*/\n\n\t\tOutput = k3d::translate3(target_position - source_position) * Input;\n\t}\n\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// snap_factory\n\nk3d::iplugin_factory& snap_factory()\n{\n\treturn snap::get_factory();\n}\n\n} // namespace matrix\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/matrix/snap_test.py",
    "content": "#python\n\nimport k3d\n\ncontext.document.start_change_set()\ntry:\n\tfloor = context.document.new_node(\"PolyCube\")\n\tfloor.name = \"Floor\"\n\tfloor.width = 10\n\tfloor.height = 10\n\tfloor.depth = 2\n\n\tfloor_instance = context.document.new_node(\"MeshInstance\")\n\tfloor_instance.name = \"Floor Instance\"\n\tfloor_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\n\tfloor_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n\tk3d.property.connect(context.document, floor.get_property(\"output_mesh\"), floor_instance.get_property(\"input_mesh\"))\n\n\tk3d.dynamic_cast(floor_instance, \"isnappable\").add_snap_target(\"-x\", k3d.point3(-5, 0, 0))\n\tk3d.dynamic_cast(floor_instance, \"isnappable\").add_snap_target(\"+x\", k3d.point3(5, 0, 0))\n\tk3d.dynamic_cast(floor_instance, \"isnappable\").add_snap_target(\"-y\", k3d.point3(0, -5, 0))\n\tk3d.dynamic_cast(floor_instance, \"isnappable\").add_snap_target(\"+y\", k3d.point3(0, 5, 0))\n\tk3d.dynamic_cast(floor_instance, \"isnappable\").add_snap_target(\"-z\", k3d.point3(0, 0, -1))\n\tk3d.dynamic_cast(floor_instance, \"isnappable\").add_snap_target(\"+z\", k3d.point3(0, 0, 1))\n\n\tchair = context.document.new_node(\"PolyCube\")\n\tchair.name = \"Chair\"\n\n\tchair_instance = context.document.new_node(\"MeshInstance\")\n\tchair_instance.name = \"Chair Instance\"\n\tchair_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\n\tchair_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n\tk3d.property.connect(context.document, chair.get_property(\"output_mesh\"), chair_instance.get_property(\"input_mesh\"))\n\n\tk3d.dynamic_cast(chair_instance, \"isnappable\").add_snap_source(\"bottom\", k3d.point3(0, 0, -2.5))\n\n\tcontext.document.finish_change_set(\"Create Snap Cube\")\n\nexcept:\n\tcontext.document.cancel_change_set()\n\traise\n\n"
  },
  {
    "path": "modules/matrix/view.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/transformable.h>\n\nnamespace module\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// view\n\nclass view :\n\tpublic k3d::transformable<k3d::node >\n{\n\ttypedef k3d::transformable<k3d::node > base;\n\npublic:\n\tview(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_position(init_owner(*this) + init_name(\"position\") + init_label(_(\"Position\")) + init_description(_(\"Position\")) + init_value(k3d::identity3())),\n\t\tm_look(init_owner(*this) + init_name(\"look\") + init_label(_(\"Look Position\")) + init_description(_(\"Look Position\")) + init_value(k3d::translate3(k3d::vector3(0, 0, 1)))),\n\t\tm_up(init_owner(*this) + init_name(\"up\") + init_label(_(\"Up Position\")) + init_description(_(\"Up Position\")) + init_value(k3d::translate3(k3d::vector3(0, 1, 0))))\n\t{\n\t\tm_position.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_look.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t\tm_up.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<view,\n\t\t\tk3d::interface_list<k3d::imatrix_source> > factory(\n\t\t\t\tk3d::uuid(0x8c5f4eef, 0xa858499f, 0x83774152, 0x147b7fe2),\n\t\t\t\t\"MatrixView\",\n\t\t\t\t_(\"Generates a viewing matrix from a position, a look vector, and an up vector\"),\n\t\t\t\t\"Matrix\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_position;\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_look;\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_up;\n\n\tvoid on_update_matrix(const k3d::matrix4& Input, k3d::matrix4& Output)\n\t{\n\t\tconst k3d::point3 look_position = m_look.pipeline_value() * k3d::point3();\n\t\tconst k3d::point3 up_position = m_up.pipeline_value() * k3d::point3();\n\t\tconst k3d::point3 position = m_position.pipeline_value() * k3d::point3();\n\n\t\tOutput = Input * k3d::view_matrix(look_position - position, up_position - position, position);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// view_factory\n\nk3d::iplugin_factory& view_factory()\n{\n\treturn view::get_factory();\n}\n\n} // namespace matrix\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/md2_io/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-md2-io)\nK3D_CREATE_MODULE_PROXY(k3d-md2-io)\n\n"
  },
  {
    "path": "modules/md2_io/md2.cpp",
    "content": "#include \"md2.h\"\n\n#include <k3dsdk/log.h>\n#include <stdexcept>\n\nnamespace module\n{\n\nnamespace md2\n{\n\nnamespace io\n{\n\nmd2Model::md2Model(const char *f) :\n\ttriangles(0),\n\tframes(0),\n\ttexcoords(0),\n\tskins(0)\n{\n\tFILE *md2file = fopen(f, \"rb\");\n\n\t// Check if the file was loaded correctly\n\tif(md2file == NULL)\n\t\tthrow std::runtime_error(\"Error opening file.\");\n\t\n\t// Extract Header and check if it is a valid md2 file\n\tfread(&header, 1, sizeof(md2Header), md2file);\t\n\t\n\tif((header.id != 844121161) || (header.version != 8))\n\t{\n\t\tfclose(md2file);\n\t\tthrow std::runtime_error(\"Not an MD2 model.\");\n\t}\n\n\t// Extract Skin names\n\tskins = new md2Skins[header.numSkins];\n\tfor(k3d::int32_t i=0; i<header.numSkins;i++)\n\t\tfread(skins[i],1,sizeof(md2Skins), md2file);\n\t// Extract Texture coordinates\n\ttexcoords = new md2TexCoords[header.numTexCoords];\n\tmd2TmpTexCoords tmpcoords;\n\tfseek(md2file, header.offsetTexCoords, SEEK_SET);\n\tfor(k3d::int32_t i=0; i<header.numTexCoords;i++)\n\t{\n\t\t//Converting values to [0,1]\n\t\tfread(&tmpcoords, sizeof(md2TmpTexCoords), 1, md2file);\n\t\ttexcoords[i].val[0] = (float)tmpcoords.x/(float)header.skinWidth;\n\t\ttexcoords[i].val[1] = 1-(float)tmpcoords.y/(float)header.skinHeight;\n\t\t//printf(\"%f \\t %f \\n\", texcoords[i].val[0], texcoords[i].val[1]);\n\t}\n\n\t// Extract triangle indices\n\ttriangles = new md2Triangles[header.numTriangles];\n\tfseek(md2file, header.offsetTriangles, SEEK_SET);\n\tfor(k3d::int32_t i=0; i<header.numTriangles; i++)\n\t\tfread(&triangles[i], 1, sizeof(md2Triangles), md2file);\n\n\t// Extract frames and vertices\n\tbyte buffer[2048*4+128];\n\tfloat a;\n\tframes = new md2Frames[header.numFrames];\n\n\tfor(k3d::int32_t i=0; i<header.numFrames; i++)\n\t{\n\t\tmd2SingleFrame *frame = (md2SingleFrame *) buffer;\n\t\tframes[i].vertex = new md2Vertex[header.numVertex];\n\t\tfseek(md2file, header.offsetFrames+header.frameSize*i, SEEK_SET);\n\t\tfread(&a, 1, sizeof(float), md2file);\n\t\tframe->scale[0] = a;\n\t\tfread(&a, 1, sizeof(float), md2file);\n\t\tframe->scale[1] = a;\n\t\tfread(&a, 1, sizeof(float), md2file);\n\t\tframe->scale[2] = a;\n\t\tfread(&a, 1, sizeof(float), md2file);\n\t\tframe->translate[0] = a;\n\t\tfread(&a, 1, sizeof(float), md2file);\n\t\tframe->translate[1] = a;\n\t\tfread(&a, 1, sizeof(float), md2file);\n\t\tframe->translate[2] = a;\n\t\tfread(frame->name, sizeof(char), 16, md2file);\n\t\tstrcpy(frames[i].name, frame->name);\n\t\t//printf(\"%s\\n\", frame->name);\n\t\tfread(frame->vertex, sizeof(md2TriangleVertex), header.numVertex, md2file);\n\t\tfor(k3d::int32_t j=0; j<header.numVertex; j++)\n\t\t{\n\t\t\tframes[i].vertex[j].val[0] = frame->vertex[j].val[0]*frame->scale[0] + frame->translate[0];\n\t\t\tframes[i].vertex[j].val[2] = frame->vertex[j].val[1]*frame->scale[1] + frame->translate[1];\n\t\t\tframes[i].vertex[j].val[1] = frame->vertex[j].val[2]*frame->scale[2] + frame->translate[2];\n\t\t}\n\t}\n\n\tfclose(md2file);\n}\n\nmd2Model::~md2Model()\n{\n\tdelete[] frames;\n\tdelete[] triangles;\n\tdelete[] texcoords;\n\tdelete[] skins;\n}\n\n} // namespace io\n\n} // namespace md2\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/md2_io/md2.h",
    "content": "#ifndef MODULES_MD2_IO_MD2_H\n#define MODULES_MD2_IO_MD2_H\n\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/texture3.h>\n\nnamespace module\n{\n\nnamespace md2\n{\n\nnamespace io\n{\n\ntypedef unsigned char byte;\n\ntypedef char md2Skins[64];\n\nstruct md2Header\n{\n\n\tk3d::int32_t id;\n\tk3d::int32_t version;\n\tk3d::int32_t skinWidth;\n\tk3d::int32_t skinHeight;\n\tk3d::int32_t frameSize;\n\tk3d::int32_t numSkins;\n\tk3d::int32_t numVertex;\n\tk3d::int32_t numTexCoords;\n\tk3d::int32_t numTriangles;\n\tk3d::int32_t numGLCommands;\n\tk3d::int32_t numFrames;\n\tk3d::int32_t offsetSkins;\n\tk3d::int32_t offsetTexCoords;\n\tk3d::int32_t offsetTriangles;\n\tk3d::int32_t offsetFrames;\n\tk3d::int32_t offsetGLCommands;\n\tk3d::int32_t fileSize;\n\n};\n\nstruct md2Vertex\n{\n\tfloat val[3];\n};\n\nstruct md2TriangleVertex\n{\n\tbyte val[3];\n\tbyte lightnormalIndex;\n};\n\nstruct md2SingleFrame\n{\n\tfloat scale[3];\n\tfloat translate[3];\n\tchar name[16];\n\tmd2TriangleVertex vertex[1];\n};\n\nstruct md2Frames\n{\n\tchar name[16];\n\tmd2Vertex *vertex;\n};\n\nstruct md2Triangles\n{\n\tk3d::uint16_t vertexIndices[3];\n\tk3d::uint16_t textureIndices[3];\n};\n\nstruct md2TmpTexCoords\n{\n\tk3d::int16_t x, y;\n};\n\nstruct md2TexCoords\n{\n\tfloat val[2];\n};\n\nclass md2Model\n{\npublic:\n\tmd2Model(const char *f);\n\t~md2Model();\n\n\tvoid draw(k3d::int32_t fr);\n\tvoid loadSkin(char *f);\n\n\tk3d::int32_t get_num_triangles(){return header.numTriangles;}\n\tk3d::int32_t get_num_frames(){return header.numFrames;}\n\tk3d::int32_t get_num_vertices(){return header.numVertex;}\n\tk3d::int32_t get_num_texcoords(){return header.numTexCoords;}\n\tk3d::int32_t get_index(k3d::int32_t triangle, k3d::int32_t p){return triangles[triangle].vertexIndices[p];}\n\tk3d::int32_t get_texindex(k3d::int32_t triangle, k3d::int32_t p){return triangles[triangle].textureIndices[p];}\n\n\tk3d::point3 get_point(k3d::int32_t frame, k3d::int32_t index)\n\t{\n\t\treturn k3d::point3(\n\t\t\tframes[frame].vertex[index].val[0],\n\t\t\tframes[frame].vertex[index].val[1],\n\t\t\tframes[frame].vertex[index].val[2]);\n\t}\n\n\tk3d::point3 get_point(k3d::int32_t frame, k3d::int32_t triangle, k3d::int32_t p)\n\t{\n\t\treturn k3d::point3(\n\t\t\tframes[frame].vertex[triangles[triangle].vertexIndices[p]].val[0],\n\t\t\tframes[frame].vertex[triangles[triangle].vertexIndices[p]].val[1],\n\t\t\tframes[frame].vertex[triangles[triangle].vertexIndices[p]].val[2]);\n\t}\n\t\n\tk3d::texture3 get_texcoord(k3d::int32_t index)\n\t{\n\t\treturn k3d::texture3(\n\t\t\ttexcoords[index].val[0],\n\t\t\t1-texcoords[index].val[1],\n\t\t\t1);\n\t}\n\t\nprivate:\n\tmd2Header header;\n\tmd2Triangles* triangles;\n\tmd2Frames* frames;\n\tmd2TexCoords* texcoords;\n\tmd2Skins* skins;\n};\n\n} // namespace io\n\n} // namespace md2\n\n} // namespace module\n\n#endif // !MODULES_MD2_IO_MD2_H\n\n"
  },
  {
    "path": "modules/md2_io/mesh_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n*   \\author Carlos Andres Dominguez Caballero\n*   (carlosadc@gmail.com)\n*/\n\n#include \"md2.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_reader.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace md2\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_reader_implementation\n\nclass mesh_reader_implementation :\n\tpublic k3d::mesh_reader<k3d::node >\n{\n\ttypedef k3d::mesh_reader<k3d::node > base;\n\npublic:\n\tmesh_reader_implementation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_frame(init_owner(*this) + init_name(\"frame\") + init_label(_(\"Frame\")) + init_description(_(\"Frame of model\")) + init_value(0) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_frame.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reload_mesh_slot()));\n\t}\n\n\tvoid on_load_mesh(const k3d::filesystem::path& Path, k3d::mesh& Output)\n\t{\n\t\ttry\n\t\t{\n\t\t\tOutput = k3d::mesh();\n\n\t\t\tboost::scoped_ptr<md2Model> model(new md2Model(Path.native_filesystem_string().c_str()));\n\n\t\t\tconst k3d::int32_t frame = m_frame.pipeline_value();\n\t\t\tif(frame < 0 || frame >= model->get_num_frames())\n\t\t\t\tthrow std::runtime_error(\"Frame out-of-range.\");\n\n\t\t\tconst k3d::int32_t vertex_count = model->get_num_vertices();\n\t\t\tconst k3d::int32_t triangle_count = model->get_num_triangles();\n\n\t\t\tk3d::mesh::points_t& points = Output.points.create(new k3d::mesh::points_t(vertex_count));\n\t\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create(new k3d::mesh::selection_t(vertex_count, 0.0));\n\t\t\tfor(k3d::int32_t i = 0; i != vertex_count; ++i)\n\t\t\t\tpoints[i] = model->get_point(frame, i);\n\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\n\t\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\t\tpolyhedron->face_shells.reserve(triangle_count);\n\t\t\tpolyhedron->face_first_loops.reserve(triangle_count);\n\t\t\tpolyhedron->face_loop_counts.reserve(triangle_count);\n\t\t\tpolyhedron->face_selections.reserve(triangle_count);\n\t\t\tpolyhedron->face_materials.reserve(triangle_count);\n\t\t\tpolyhedron->loop_first_edges.reserve(triangle_count);\n\t\t\tpolyhedron->clockwise_edges.reserve(3 * triangle_count);\n\t\t\tpolyhedron->edge_selections.reserve(3 * triangle_count);\n\t\t\tpolyhedron->vertex_points.reserve(3 * triangle_count);\n\t\t\tpolyhedron->vertex_selections.reserve(3 * triangle_count);\n\n\t\t\tfor(k3d::int32_t i = 0; i != triangle_count; ++i)\n\t\t\t{\n\t\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\tpolyhedron->face_selections.push_back(0);\n\t\t\t\tpolyhedron->face_materials.push_back(0);\n\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\tfor(k3d::uint_t j = 0; j != 3; ++j)\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\tpolyhedron->vertex_points.push_back(model->get_index(i, j));\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t}\n\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\t\t\t}\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << \"Caught exception: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << \"Caught unknown exception.\" << std::endl;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_reader_implementation,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_storage> > > factory(\n\t\t\t\tk3d::uuid(0xcd0962b6, 0x3e4a132b, 0x575537a5, 0xc4af7d0a),\n\t\t\t\t\"MD2MeshReader\",\n\t\t\t\t_(\"Reader that loads external MD2 (.md2) files into the document by reference\"),\n\t\t\t\t\"MeshReader\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_frame;\n};\n\nk3d::iplugin_factory& mesh_reader_factory()\n{\n\treturn mesh_reader_implementation::get_factory();\n}\n\n} // namespace io\n\n} // namespace md2\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/md2_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace md2\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& mesh_reader_factory();\n//extern k3d::iplugin_factory& document_importer_factory();\n\n} // namespace io\n\n} // namespace md2\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::md2::io::mesh_reader_factory());\n\t//Registry.register_factory(module::md2::io::document_importer_factory());\nK3D_MODULE_END\n"
  },
  {
    "path": "modules/mesh/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-mesh)\nK3D_CREATE_MODULE_PROXY(k3d-mesh)\n\n"
  },
  {
    "path": "modules/mesh/array_1d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/itransform_array_1d.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace mesh\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// array_1d_implementation\n\nclass array_1d_implementation :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tarray_1d_implementation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_layout(init_owner(*this) + init_name(\"layout\") + init_label(_(\"Layout\")) + init_description(_(\"Layout\")) + init_value<k3d::itransform_array_1d*>(0)),\n\t\tm_count(init_owner(*this) + init_name(\"count\") + init_label(_(\"Count\")) + init_description(_(\"Number of mesh copies\")) + init_value(5) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t\tm_layout.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t\tm_count.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::itransform_array_1d* const layout = m_layout.pipeline_value();\n\t\tif(!layout)\n\t\t\treturn;\n\n\t\tconst k3d::int32_t count = m_count.pipeline_value();\n\t\tfor(k3d::int32_t i = 0; i != count; ++i)\n\t\t{\n\t\t\t// Merge input geometry into our output ...\n\t\t\tk3d::uint_t point_begin = 0;\n\t\t\tk3d::uint_t point_end = 0;\n\t\t\tk3d::mesh::append(Input, Output, &point_begin, &point_end);\n\n\t\t\t// Transform the corresponding output points ...\n\t\t\tif(Output.points)\n\t\t\t{\n\t\t\t\tk3d::mesh::points_t& output_points = Output.points.writable();\n\n\t\t\t\tconst k3d::matrix4 matrix = layout->get_element(i, count);\n\t\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\t\toutput_points[point] = matrix * output_points[point];\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<array_1d_implementation,\n\t\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x15e5e4e3, 0x80144246, 0xb8b43558, 0xcd361180),\n\t\t\t\t\"MeshArray1D\",\n\t\t\t\t_(\"Makes copies of a mesh along one dimension\"),\n\t\t\t\t\"Mesh Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::itransform_array_1d*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_layout;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// array_1d_factory\n\nk3d::iplugin_factory& array_1d_factory()\n{\n\treturn array_1d_implementation::get_factory();\n}\n\n} // namespace mesh\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/mesh/array_2d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/itransform_array_2d.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace mesh\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// array_2d_implementation\n\nclass array_2d_implementation :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tarray_2d_implementation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_layout(init_owner(*this) + init_name(\"layout\") + init_label(_(\"Layout\")) + init_description(_(\"Layout\")) + init_value<k3d::itransform_array_2d*>(0)),\n\t\tm_count1(init_owner(*this) + init_name(\"count1\") + init_label(_(\"Count 1\")) + init_description(_(\"Number of mesh copies\")) + init_value(5) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_count2(init_owner(*this) + init_name(\"count2\") + init_label(_(\"Count 2\")) + init_description(_(\"Number of mesh copies\")) + init_value(5) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t\tm_layout.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t\tm_count1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t\tm_count2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t}\n\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::itransform_array_2d* const layout = m_layout.pipeline_value();\n\t\tif(!layout)\n\t\t\treturn;\n\n\t\tconst k3d::int32_t count1 = m_count1.pipeline_value();\n\t\tconst k3d::int32_t count2 = m_count2.pipeline_value();\n\t\tfor(k3d::int32_t i = 0; i != count1; ++i)\n\t\t{\n\t\t\tfor(k3d::int32_t j = 0; j != count2; ++j)\n\t\t\t{\n\t\t\t\t// Merge input geometry into our output ...\n\t\t\t\tk3d::uint_t point_begin = 0;\n\t\t\t\tk3d::uint_t point_end = 0;\n\t\t\t\tk3d::mesh::append(Input, Output, &point_begin, &point_end);\n\n\t\t\t\t// Transform the corresponding output points ...\n\t\t\t\tif(Output.points)\n\t\t\t\t{\n\t\t\t\t\tk3d::mesh::points_t& output_points = Output.points.writable();\n\n\t\t\t\t\tconst k3d::matrix4 matrix = layout->get_element(i, count1, j, count2);\n\t\t\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\t\t\toutput_points[point] = matrix * output_points[point];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<array_2d_implementation,\n\t\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x4818d995, 0xf8664006, 0xba02ded4, 0x8cb9defb),\n\t\t\t\t\"MeshArray2D\",\n\t\t\t\t_(\"Makes copies of a mesh along two dimensions\"),\n\t\t\t\t\"Mesh Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::itransform_array_2d*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_layout;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count1;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count2;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// array_2d_factory\n\nk3d::iplugin_factory& array_2d_factory()\n{\n\treturn array_2d_implementation::get_factory();\n}\n\n} // namespace mesh\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/mesh/array_3d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/itransform_array_3d.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace mesh\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// array_3d_implementation\n\nclass array_3d_implementation :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tarray_3d_implementation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_layout(init_owner(*this) + init_name(\"layout\") + init_label(_(\"Layout\")) + init_description(_(\"Layout\")) + init_value<k3d::itransform_array_3d*>(0)),\n\t\tm_count1(init_owner(*this) + init_name(\"count1\") + init_label(_(\"Count 1\")) + init_description(_(\"Number of mesh copies\")) + init_value(5) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_count2(init_owner(*this) + init_name(\"count2\") + init_label(_(\"Count 2\")) + init_description(_(\"Number of mesh copies\")) + init_value(5) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_count3(init_owner(*this) + init_name(\"count3\") + init_label(_(\"Count 3\")) + init_description(_(\"Number of mesh copies\")) + init_value(5) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t\tm_layout.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t\tm_count1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t\tm_count2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t\tm_count3.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::itransform_array_3d* const layout = m_layout.pipeline_value();\n\t\tif(!layout)\n\t\t\treturn;\n\n\t\tconst k3d::int32_t count1 = m_count1.pipeline_value();\n\t\tconst k3d::int32_t count2 = m_count2.pipeline_value();\n\t\tconst k3d::int32_t count3 = m_count3.pipeline_value();\n\t\tfor(k3d::int32_t i = 0; i != count1; ++i)\n\t\t{\n\t\t\tfor(k3d::int32_t j = 0; j != count2; ++j)\n\t\t\t{\n\t\t\t\tfor(k3d::int32_t k = 0; k != count3; ++k)\n\t\t\t\t{\n\t\t\t\t\t// Merge input geometry into our output ...\n\t\t\t\t\tk3d::uint_t point_begin = 0;\n\t\t\t\t\tk3d::uint_t point_end = 0;\n\t\t\t\t\tk3d::mesh::append(Input, Output, &point_begin, &point_end);\n\n\t\t\t\t\t// Transform the corresponding output points ...\n\t\t\t\t\tif(Output.points)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::mesh::points_t& output_points = Output.points.writable();\n\n\t\t\t\t\t\tconst k3d::matrix4 matrix = layout->get_element(i, count1, j, count2, k, count3);\n\t\t\t\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\t\t\t\toutput_points[point] = matrix * output_points[point];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<array_3d_implementation,\n\t\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x29bb292a, 0x421647be, 0x99236f5c, 0x3407fe41),\n\t\t\t\t\"MeshArray3D\",\n\t\t\t\t_(\"Makes copies of a mesh along three dimensions\"),\n\t\t\t\t\"Mesh Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::itransform_array_3d*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_layout;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count1;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count2;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count3;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// array_3d_factory\n\nk3d::iplugin_factory& array_3d_factory()\n{\n\treturn array_3d_implementation::get_factory();\n}\n\n} // namespace mesh\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/mesh/merge_mesh.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imulti_mesh_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/parallel/blocked_range.h>\n#include <k3dsdk/parallel/parallel_for.h>\n#include <k3dsdk/parallel/threads.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace mesh\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// merge_mesh\n\nclass merge_mesh :\n\tpublic k3d::imulti_mesh_sink,\n\tpublic k3d::mesh_source<k3d::node >\n{\n\ttypedef k3d::mesh_source<k3d::node > base;\n\npublic:\n\tmerge_mesh(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_user_property_changed_signal(*this)\n\t{\n\t\tm_user_property_changed_signal.connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\t// For each input mesh ...\n\t\tconst k3d::iproperty_collection::properties_t properties = k3d::property::user_properties(*static_cast<k3d::iproperty_collection*>(this));\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator p = properties.begin(); p != properties.end(); ++p)\n\t\t{\n\t\t\tk3d::iproperty& property = **p;\n\t\t\tif(property.property_type() != typeid(k3d::mesh*))\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh* const mesh = k3d::property::pipeline_value<k3d::mesh*>(property);\n\t\t\tif(!mesh)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::mesh::append(*mesh, Output);\n\t\t}\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<merge_mesh, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imulti_mesh_sink> > > factory(\n\t\t\tk3d::uuid(0x50aef311, 0xf5264da2, 0x9c5995e8, 0xdc2e4ddf),\n\t\t\t\"MergeMesh\",\n\t\t\t_(\"Merges two meshes into one\"),\n\t\t\t\"Mesh\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// merge_mesh_factory\n\nk3d::iplugin_factory& merge_mesh_factory()\n{\n\treturn merge_mesh::get_factory();\n}\n\n} // namespace mesh\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/mesh/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace mesh\n{\n\nextern k3d::iplugin_factory& array_1d_factory();\nextern k3d::iplugin_factory& array_2d_factory();\nextern k3d::iplugin_factory& array_3d_factory();\nextern k3d::iplugin_factory& merge_mesh_factory();\nextern k3d::iplugin_factory& points_centroid_factory();\nextern k3d::iplugin_factory& weld_points_factory();\n\n} // namespace mesh\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::mesh::array_1d_factory());\n\tRegistry.register_factory(module::mesh::array_2d_factory());\n\tRegistry.register_factory(module::mesh::array_3d_factory());\n\tRegistry.register_factory(module::mesh::merge_mesh_factory());\n\tRegistry.register_factory(module::mesh::points_centroid_factory());\n\tRegistry.register_factory(module::mesh::weld_points_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/mesh/points_centroid.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace module\n{\n\nnamespace mesh\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// points_centroid\n\nclass points_centroid :\n\tpublic k3d::mesh_selection_sink<k3d::node>,\n\tpublic k3d::imesh_sink\n{\n\ttypedef k3d::mesh_selection_sink<k3d::node> base;\n\npublic:\n\tpoints_centroid(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input_mesh(init_owner(*this) + init_name(\"input_mesh\") + init_label(_(\"Input Mesh\")) + init_description(_(\"Input mesh\")) + init_value<k3d::mesh*>(0)),\n\t\tm_centroid(init_owner(*this) + init_name(\"centroid\") + init_label(_(\"Centroid\")) + init_description(_(\"Calculated centroid\")) + init_value(k3d::point3(0, 0, 0)))\n\t{\n\t\tm_centroid.set_update_slot(sigc::mem_fun(*this, &points_centroid::execute));\n\n\t\tm_input_mesh.changed_signal().connect(k3d::hint::converter<\n\t\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_centroid.make_slot()));\n\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_centroid.make_slot()));\n\t}\n\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::point3& Output)\n\t{\n\t\tOutput = k3d::point3(0.,0.,0.);\n\t\tif(const k3d::mesh* const input = m_input_mesh.pipeline_value())\n\t\t{\n\t\t\tif(!input->points)\n\t\t\t\treturn;\n\t\t\tk3d::mesh selected_mesh = *input;\n\t\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), selected_mesh);\n\t\t\tconst k3d::uint_t points_begin = 0;\n\t\t\tconst k3d::uint_t points_end = selected_mesh.points->size();\n\t\t\tk3d::double_t weightsum = 0.;\n\t\t\tfor(k3d::uint_t point = points_begin; point != points_end; ++point)\n\t\t\t{\n\t\t\t\tconst k3d::double_t weight = selected_mesh.point_selection->at(point);\n\t\t\t\tweightsum += weight;\n\t\t\t\tOutput += weight * k3d::to_vector(selected_mesh.points->at(point));\n\t\t\t}\n\t\t\tOutput /= weightsum;\n\t\t}\n\t}\n\n\tk3d::iproperty& mesh_sink_input()\n\t{\n\t\treturn m_input_mesh;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<points_centroid,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > factory(\n\t\t\t\tk3d::uuid(0x30c540a0, 0x544f37c4, 0x1f4a2d8b, 0xb0fa06a2),\n\t\t\t\t\"PointsCentroid\",\n\t\t\t\t_(\"Calculates the average position (centroid) of the points, weighted by the selection value\"),\n\t\t\t\t\"Mesh\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\n\tk3d_data(k3d::mesh*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::read_only_property, k3d::data::no_serialization) m_input_mesh;\n\tk3d_data(k3d::point3, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::value_demand_storage, k3d::data::no_constraint, k3d::data::read_only_property, k3d::data::no_serialization) m_centroid;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// points_centroid_factory\n\nk3d::iplugin_factory& points_centroid_factory()\n{\n\treturn points_centroid::get_factory();\n}\n\n} // namespace mesh\n\n} // namespace module\n"
  },
  {
    "path": "modules/mesh/weld_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/utility.h>\n\nnamespace module\n{\n\nnamespace mesh\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// weld_points\n\nclass weld_points :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tweld_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_distance(init_owner(*this) + init_name(\"distance\") + init_label(_(\"Distance\")) + init_description(_(\"Maximum distance between points\")) + init_value(0.001) + init_step_increment(0.0001) + init_units(typeid(k3d::measurement::distance)) + init_constraint(constraint::minimum<k3d::double_t>(0.0)))\n\t{\n\t\tm_distance.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tstruct map_point_indices\n\t{\n\t\tmap_point_indices(const k3d::mesh::indices_t& PointMap) :\n\t\t\tpoint_map(PointMap)\n\t\t{\n\t\t}\n\n\t\tvoid operator()(const k3d::string_t&, const k3d::table&, const k3d::string_t& ArrayName, k3d::pipeline_data<k3d::array>& Array)\n\t\t{\n\t\t\tif(Array->get_metadata_value(k3d::metadata::key::domain()) != k3d::metadata::value::point_indices_domain())\n\t\t\t\treturn;\n\n\t\t\tk3d::uint_t_array* const array = dynamic_cast<k3d::uint_t_array*>(&Array.writable());\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"array [\" << ArrayName << \"] must be a k3d::uint_t_array.\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst k3d::uint_t begin = 0;\n\t\t\tconst k3d::uint_t end = begin + array->size();\n\t\t\tfor(k3d::uint_t i = begin; i != end; ++i)\n\t\t\t\t(*array)[i] = point_map[(*array)[i]];\n\t\t}\n\n\t\tconst k3d::mesh::indices_t& point_map;\t\n\t};\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\n\t\t// Begin by creating an identity map from each mesh point to itself ...\n\t\tconst k3d::uint_t point_begin = 0;\n\t\tconst k3d::uint_t point_end = point_begin + points.size();\n\t\tk3d::mesh::indices_t point_map(points.size());\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\tpoint_map[point] = point;\n\n\t\t// Update the point map to eliminate \"duplicate\" points ... warning: this is O(N^2)!!!\n\t\tk3d::uint_t weld_points_count = 0;\n\t\tconst k3d::double_t distance = m_distance.pipeline_value();\n\t\tfor(k3d::uint_t point1 = point_begin; point1 != point_end; ++point1)\n\t\t{\n\t\t\t// Skip points that have already been weld_pointsed ...\n\t\t\tif(point_map[point1] != point1)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::uint_t point2 = point1 + 1; point2 != point_end; ++point2)\n\t\t\t{\n\t\t\t\t// Skip points that have already been weld_pointsed ...\n\t\t\t\tif(point_map[point2] != point2)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst k3d::vector3 delta = points[point2] - points[point1];\n\t\t\t\tif(std::fabs(delta[0]) < distance && std::fabs(delta[1]) < distance && std::fabs(delta[2]) < distance)\n\t\t\t\t{\n\t\t\t\t\t++weld_points_count;\n\t\t\t\t\tpoint_map[point2] = point1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we didn't find any points to weld_points, we're done ...\n\t\tif(!weld_points_count)\n\t\t\treturn;\n\n\t\t// Remap primitive points so that they no longer reference \"duplicate\" points ... \n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t\tk3d::mesh::visit_arrays(primitive->writable(), map_point_indices(point_map));\n\n\t\t// Delete lefover unused points ...\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<weld_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xacfb8148, 0x4f404ca1, 0x937564e3, 0x2977984c),\n\t\t\t\t\"WeldPoints\",\n\t\t\t\t_(\"Eliminates points with duplicate 3D coordinates\"),\n\t\t\t\t\"Mesh\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_distance;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// weld_points_factory\n\nk3d::iplugin_factory& weld_points_factory()\n{\n\treturn weld_points::get_factory();\n}\n\n} // namespace mesh\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/mesh_attributes/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-mesh-attributes)\nK3D_CREATE_MODULE_PROXY(k3d-mesh-attributes)\n\n"
  },
  {
    "path": "modules/mesh_attributes/calculate_normals.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n#include <iterator>\n\nnamespace module\n{\n\nnamespace mesh_attributes\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// calculate_normals\n\nclass calculate_normals :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tcalculate_normals(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_max_angle(init_owner(*this) + init_name(\"max_angle\") + init_label(_(\"Maximum Angle\")) + init_description(_(\"Normals will not be smoothed across points sharper than this angle (only applies to Vertex Normals).\")) + init_value(k3d::radians(89.0)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_face(init_owner(*this) + init_name(\"face\") + init_label(_(\"Face Normals\")) + init_description(_(\"Generate per-face normals.\")) + init_value(false)),\n\t\tm_vertex(init_owner(*this) + init_name(\"vertex\") + init_label(_(\"Vertex Normals\")) + init_description(_(\"Generate per-vertex normals.\")) + init_value(true)),\n\t\tm_point(init_owner(*this) + init_name(\"point\") + init_label(_(\"Point Normals\")) + init_description(_(\"Generate per-point normals.\")) + init_value(false)),\n\t\tm_face_array(init_owner(*this) + init_name(\"face_array\") + init_label(_(\"Face Array Name\")) + init_description(_(\"Face output array name.\")) + init_value(k3d::string_t(\"N\"))),\n\t\tm_vertex_array(init_owner(*this) + init_name(\"vertex_array\") + init_label(_(\"Vertex Array Name\")) + init_description(_(\"Vertex output array name.\")) + init_value(k3d::string_t(\"N\"))),\n\t\tm_point_array(init_owner(*this) + init_name(\"point_array\") + init_label(_(\"Point Array Name\")) + init_description(_(\"Point output array name.\")) + init_value(k3d::string_t(\"N\")))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\n\t\tm_max_angle.changed_signal().connect(make_update_mesh_slot());\n\n\t\tm_face.changed_signal().connect(make_update_mesh_slot());\n\t\tm_vertex.changed_signal().connect(make_update_mesh_slot());\n\t\tm_point.changed_signal().connect(make_update_mesh_slot());\n\t\t\n\t\tm_face_array.changed_signal().connect(make_update_mesh_slot());\n\t\tm_vertex_array.changed_signal().connect(make_update_mesh_slot());\n\t\tm_point_array.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\n\t\tconst k3d::bool_t store_face = m_face.pipeline_value();\n\t\tconst k3d::bool_t store_vertex = m_vertex.pipeline_value();\n\t\tconst k3d::bool_t store_point = m_point.pipeline_value();\n\t\tconst k3d::mesh::points_t& points = *Output.points;\n\n\t\t// Optionally store point normals ...\n\t\tk3d::mesh::normals_t* point_normals = 0;\n\t\tif(store_point)\n\t\t\tpoint_normals = &Output.point_attributes.create(m_point_array.pipeline_value(), new k3d::mesh::normals_t(points.size()));\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\n\t\t\t// Compute per-face normals (used for all subsequent calculations) ...\n\t\t\tk3d::mesh::normals_t face_normals(polyhedron->face_first_loops.size());\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\tface_normals[face] = k3d::normalize(k3d::polyhedron::normal(polyhedron->vertex_points, polyhedron->clockwise_edges, points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]));\n\n\t\t\t// Optionally store the face normals ...\n\t\t\tif(store_face)\n\t\t\t\tpolyhedron->face_attributes.create(m_face_array.pipeline_value(), new k3d::mesh::normals_t(face_normals));\n\n\t\t\t// Optionally compute per-vertex normals ...\n\t\t\tif(store_vertex)\n\t\t\t{\n\t\t\t\tconst k3d::double_t cos_max_angle = std::cos(std::max(0.0, m_max_angle.pipeline_value()));\n\n\t\t\t\tk3d::mesh::normals_t& vertex_normals = polyhedron->vertex_attributes.create(m_vertex_array.pipeline_value(), new k3d::mesh::normals_t(polyhedron->vertex_points.size()));\n\n\t\t\t\tk3d::mesh::indices_t point_first_faces;\n\t\t\t\tk3d::mesh::counts_t point_face_counts;\n\t\t\t\tk3d::mesh::indices_t point_faces;\n\t\t\t\tk3d::polyhedron::create_point_face_lookup(polyhedron->face_first_loops, polyhedron->face_loop_counts, polyhedron->loop_first_edges, polyhedron->vertex_points, polyhedron->clockwise_edges, points, point_first_faces, point_face_counts, point_faces);\n\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::normal3 face_normal = face_normals[face];\n\n\t\t\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\t\tconst k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvertex_normals[edge] += face_normal;\n\n\t\t\t\t\t\t\tif(polyhedron->face_selections[face])\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst k3d::uint_t point_face_begin = point_first_faces[polyhedron->vertex_points[edge]];\n\t\t\t\t\t\t\t\tconst k3d::uint_t point_face_end = point_face_begin + point_face_counts[polyhedron->vertex_points[edge]];\n\t\t\t\t\t\t\t\tfor(k3d::uint_t point_face = point_face_begin; point_face != point_face_end; ++point_face)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tconst k3d::uint_t adjacent_face = point_faces[point_face];\n\t\t\t\t\t\t\t\t\tif(adjacent_face == face)\n\t\t\t\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t\t\t\tif(!polyhedron->face_selections[adjacent_face])\n\t\t\t\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t\t\t\tconst k3d::normal3 adjacent_normal = face_normals[adjacent_face];\n\n\t\t\t\t\t\t\t\t\tconst k3d::double_t cos_angle = adjacent_normal * face_normal;\n\t\t\t\t\t\t\t\t\tif(cos_angle < cos_max_angle)\n\t\t\t\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t\t\t\tvertex_normals[edge] += adjacent_normal;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n      \t\t\t}\n\n\t\t\t// Optionally compute per-point normals as the sum of adjacent face normals ...\n\t\t\tif(store_point)\n\t\t\t{\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\t\tconst k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t(*point_normals)[polyhedron->vertex_points[edge]] += face_normals[face];\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<calculate_normals,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xa6d565ee, 0x6b4a065d, 0x2430ca88, 0xb0bd88a1),\n\t\t\t\t\"CalculateNormals\",\n\t\t\t\t_(\"Calculates a variety of polygon normals\"),\n\t\t\t\t\"MeshAttributes\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_max_angle;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_face;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_vertex;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_point;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_face_array;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_vertex_array;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_point_array;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// calculate_normals_factory\n\nk3d::iplugin_factory& calculate_normals_factory()\n{\n\treturn calculate_normals::get_factory();\n}\n\n} // namespace mesh_attributes\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/mesh_attributes/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace mesh_attributes\n{\n\nextern k3d::iplugin_factory& calculate_normals_factory();\nextern k3d::iplugin_factory& named_text_array_factory();\nextern k3d::iplugin_factory& set_color_factory();\nextern k3d::iplugin_factory& set_material_factory();\n\n} // namespace mesh_attributes\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::mesh_attributes::calculate_normals_factory());\n\tRegistry.register_factory(module::mesh_attributes::named_text_array_factory());\n\tRegistry.register_factory(module::mesh_attributes::set_color_factory());\n\tRegistry.register_factory(module::mesh_attributes::set_material_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/mesh_attributes/named_text_array.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file named_text_array.cpp\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n\t\t\\created Feb 25, 2009\n*/\n\n#include <k3d-i18n-config.h>\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace mesh_attributes\n{\n\nclass named_text_array :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tnamed_text_array(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_array_name(init_owner(*this) + init_name(\"array_name\") + init_label(_(\"Array Name\")) + init_description(_(\"Name of the output array\")) + init_value(std::string(\"string_data\"))),\n\t\tm_default_value(init_owner(*this) + init_name(\"array_name\") + init_label(_(\"Default Value\")) + init_description(_(\"Default value, associated with unselected items\")) + init_value(std::string(\"default\"))),\n\t\tm_value(init_owner(*this) + init_name(\"value\") + init_label(_(\"Value\")) + init_description(_(\"Value, associated with selected items\")) + init_value(std::string(\"text_data\")))\n\t\t{\n\t\t\tm_array_name.changed_signal().connect(make_reset_mesh_slot());\n\t\t\tm_default_value.changed_signal().connect(make_reset_mesh_slot());\n\t\t\tm_value.changed_signal().connect(make_reset_mesh_slot());\n\t\t}\n\t\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tconst k3d::string_t array_name = m_array_name.pipeline_value();\n\t\tconst k3d::string_t default_value = m_default_value.pipeline_value();\n\t\tconst k3d::string_t value = m_value.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n      boost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n      if(!polyhedron)\n        continue;\n\n\t\t\tk3d::mesh::strings_t& string_data = polyhedron->face_attributes.lookup<k3d::mesh::strings_t>(array_name)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t ? *(polyhedron->face_attributes.writable<k3d::mesh::strings_t>(array_name))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t : polyhedron->face_attributes.create(array_name, new k3d::mesh::strings_t(polyhedron->face_first_loops.size(), default_value));\n\n      const k3d::uint_t face_begin = 0;\n      const k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n      for(k3d::uint_t face = face_begin; face != face_end; ++face)\n      {\n        if(polyhedron->face_selections[face])\n          string_data[face] = value;\n      }\n    }\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<named_text_array,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xf4d7f4d5, 0x3a40e51a, 0xfaf269bb, 0x1b68fdfe),\n\t\t\t\t\"NamedTextArray\",\n\t\t\t\t_(\"Creates or updates a named array with string data\"),\n\t\t\t\t\"MeshAttributes\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_array_name;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_default_value;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_value;\n};\n\t\nk3d::iplugin_factory& named_text_array_factory()\n{\n\treturn named_text_array::get_factory();\n}\n\n} // namespace mesh_attributes\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/mesh_attributes/set_color.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/component.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/node.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace mesh_attributes\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// set_color\n\nclass set_color :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tset_color(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_name(init_owner(*this) + init_name(\"name\") + init_label(_(\"Name\")) + init_description(_(\"Name for the color attribute array\")) + init_value(k3d::string_t(\"Cs\"))),\n\t\tm_default_color(init_owner(*this) + init_name(\"default_color\") + init_label(_(\"Default Color\")) + init_description(_(\"Color used for unselected faces in case no previous array existed\")) + init_value(k3d::color(0, 1, 1))),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Color to apply to selected faces\")) + init_value(k3d::color(0, 0, 1)))\n\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_name.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_default_color.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_color.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tconst k3d::string_t array_name = m_name.pipeline_value();\n\t\tconst k3d::color default_color = m_default_color.pipeline_value();\n\t\tconst k3d::color color = m_color.pipeline_value();\n\n\t\t// Note: this loop is tricky because we want to avoid deep-copies where possible ...\n\t\tfor(k3d::uint_t p = 0; p != Output.primitives.size(); ++p)\n\t\t{\n\t\t\tfor(k3d::mesh::named_tables_t::const_iterator s = Output.primitives[p]->structure.begin(); s != Output.primitives[p]->structure.end(); ++s)\n\t\t\t{\n\t\t\t\t// Look for the selection array in a structure\n\t\t\t\tfor(k3d::mesh::named_arrays_t::const_iterator array = s->second.begin(); array != s->second.end(); ++array)\n\t\t\t\t{\n\t\t\t\t\tif(array->second.get() && array->second->get_metadata_value(k3d::metadata::key::role()) == k3d::metadata::value::selection_role())\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::mesh::selection_t* selections = dynamic_cast<const k3d::mesh::selection_t*>(array->second.get());\n\t\t\t\t\t\tif(selections)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst k3d::string_t& structure_name = s->first;\n\t\t\t\t\t\t\t// Now look for an existing color array, or create it if it doesn't exist\n\t\t\t\t\t\t\tk3d::mesh::primitive& primitive = Output.primitives[p].writable();\n\t\t\t\t\t\t\tfor(k3d::mesh::named_tables_t::iterator attribute = primitive.attributes.begin(); attribute != primitive.attributes.end(); ++attribute)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst k3d::string_t& attribute_name = attribute->first;\n\t\t\t\t\t\t\t\tif(attribute_name != structure_name)\n\t\t\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t\t\tconst k3d::uint_t attribute_count = k3d::component_size(primitive, attribute_name);\n\t\t\t\t\t\t\t\tif(0 == attribute_count)\n\t\t\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t\t\treturn_if_fail(attribute_count == selections->size());\n\n\t\t\t\t\t\t\t\tk3d::table& attribute_table = attribute->second;\n\t\t\t\t\t\t\t\tk3d::mesh::colors_t& array = attribute_table.lookup<k3d::mesh::colors_t>(array_name) ? *(attribute_table.writable<k3d::mesh::colors_t>(array_name)) : attribute_table.create(array_name, new k3d::mesh::colors_t(attribute_count, default_color));\n\n\t\t\t\t\t\t\t\tfor(k3d::uint_t i = 0; i != attribute_count; ++i)\n\t\t\t\t\t\t\t\t\tif(selections->at(i))\n\t\t\t\t\t\t\t\t\t\tarray[i] = color * selections->at(i);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<set_color,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x9d2cc7f6, 0x27462cca, 0x77e8dca7, 0x25608d51),\n\t\t\t\t\"SetColor\",\n\t\t\t\t_(\"Sets geometry color\"),\n\t\t\t\t\"Material MeshAttributes\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprivate:\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_name;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_default_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// set_color_factory\n\nk3d::iplugin_factory& set_color_factory()\n{\n\treturn set_color::get_factory();\n}\n\n} // namespace mesh_attributes\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/mesh_attributes/set_material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/node.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace mesh_attributes\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// set_material\n\nclass set_material :\n\tpublic k3d::material_sink<k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > > base;\n\npublic:\n\tset_material(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_material.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\n\t\t// Note: this loop is tricky because we want to avoid deep-copies where possible ...\n\t\tfor(k3d::mesh::primitives_t::iterator p = Output.primitives.begin(); p != Output.primitives.end(); ++p)\n\t\t{\n\t\t\t// Look for primitive structures that contain a material and a selection ...\n\t\t\tfor(k3d::mesh::named_tables_t::const_iterator s = (**p).structure.begin(); s != (**p).structure.end(); ++s)\n\t\t\t{\n\t\t\t\tk3d::string_t materials_name;\n\t\t\t\tk3d::string_t selection_name;\n\n\t\t\t\tfor(k3d::mesh::named_arrays_t::const_iterator array = s->second.begin(); array != s->second.end(); ++array)\n\t\t\t\t{\n\t\t\t\t\tif(materials_name.empty())\n\t\t\t\t\t{\n\t\t\t\t\t\tif(dynamic_cast<const k3d::mesh::materials_t*>(array->second.get()))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmaterials_name = array->first;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(selection_name.empty())\n\t\t\t\t\t{\n\t\t\t\t\t\tif(array->second->get_metadata_value(k3d::metadata::key::role()) == k3d::metadata::value::selection_role())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(dynamic_cast<const k3d::mesh::selection_t*>(array->second.get()))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tselection_name = array->first;\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Only now that we've got what we're looking for do we starting making changes ...\n\t\t\t\tif(materials_name.size() && selection_name.size())\n\t\t\t\t{\n\t\t\t\t\tk3d::mesh::primitive& primitive = p->writable();\n\t\t\t\t\tk3d::mesh::table_t& structure = primitive.structure[s->first];\n\n\t\t\t\t\tk3d::mesh::materials_t* const materials = structure.writable<k3d::mesh::materials_t>(materials_name);\n\t\t\t\t\tk3d::mesh::selection_t* const selection = structure.writable<k3d::mesh::selection_t>(selection_name);\n\n\t\t\t\t\tconst k3d::uint_t begin = 0;\n\t\t\t\t\tconst k3d::uint_t end = begin + materials->size();\n\t\t\t\t\tfor(k3d::uint_t i = begin; i != end; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((*selection)[i])\n\t\t\t\t\t\t\t(*materials)[i] = material;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<set_material,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x7743a7f2, 0x995345b9, 0x8d6dacc7, 0x3fa37029),\n\t\t\t\t\"SetMaterial\",\n\t\t\t\t_(\"Sets geometry materials\"),\n\t\t\t\t\"Material MeshAttributes\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// set_material_factory\n\nk3d::iplugin_factory& set_material_factory()\n{\n\treturn set_material::get_factory();\n}\n\n} // namespace mesh_attributes\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/mesh_instance/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-mesh-instance)\nK3D_CREATE_MODULE_PROXY(k3d-mesh-instance)\n\n"
  },
  {
    "path": "modules/mesh_instance/frozen_mesh.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_storage.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/pointer_demand_storage.h>\n#include <k3dsdk/serialization_xml.h>\n\n#include <iterator>\n\nnamespace module\n{\n\nnamespace mesh_instance\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// frozen_mesh\n\nclass frozen_mesh :\n\tpublic k3d::node,\n\tpublic k3d::imesh_sink,\n\tpublic k3d::imesh_source,\n\tpublic k3d::imesh_storage\n{\n\ttypedef k3d::node base;\n\npublic:\n\tfrozen_mesh(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input_mesh(init_owner(*this) + init_name(\"input_mesh\") + init_label(_(\"Input Mesh\")) + init_description(_(\"Input mesh\")) + init_value<k3d::mesh*>(0)),\n\t\tm_output_mesh(init_owner(*this) + init_name(\"output_mesh\") + init_label(_(\"Output Mesh\")) + init_description(_(\"Output mesh\")))\n\t{\n\t\tm_output_mesh.set_update_slot(sigc::mem_fun(*this, &frozen_mesh::execute));\n\t}\n\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::mesh& Output)\n\t{\n\t\tif(const k3d::mesh* const input = m_input_mesh.pipeline_value())\n\t\t\tk3d::mesh::deep_copy(*input, Output);\n\t}\n\n\tk3d::iproperty& mesh_source_output()\n\t{\n\t\treturn m_output_mesh;\n\t}\n\n\tk3d::iproperty& mesh_sink_input()\n\t{\n\t\treturn m_input_mesh;\n\t}\n\n\tvoid reset_mesh(k3d::mesh* const Mesh)\n\t{\n\t\tm_output_mesh.reset(Mesh);\n\t}\n\n\tvoid save(k3d::xml::element& Element, const k3d::ipersistent::save_context& Context)\n\t{\n\t\tbase::save(Element, Context);\n\n\t\tif(k3d::mesh* const mesh = m_output_mesh.internal_value())\n\t\t{\n\t\t\tk3d::xml::element& xml_mesh = Element.append(k3d::xml::element(\"mesh_arrays\"));\n\t\t\tk3d::xml::save(*mesh, xml_mesh, Context);\n\t\t}\n\t}\n\n\tvoid load(k3d::xml::element& Element, const k3d::ipersistent::load_context& Context)\n\t{\n\t\tbase::load(Element, Context);\n\n\t\t// Create a new mesh ...\n\t\tk3d::mesh* const mesh = new k3d::mesh();\n\t\tm_output_mesh.reset(mesh);\n\n\t\t// Load the stored mesh data ...\n\t\tk3d::xml::element* xml_mesh = k3d::xml::find_element(Element, \"mesh_arrays\");\n\t\tif(xml_mesh)\n\t\t{\n\t\t\tk3d::xml::load(*mesh, *xml_mesh, Context);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<frozen_mesh,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\tk3d::classes::FrozenMesh(),\n\t\t\t\"FrozenMesh\",\n\t\t\t_(\"Freezes its input for manual editing\"),\n\t\t\t\"Mesh\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\n\tk3d_data(k3d::mesh*, immutable_name, change_signal, no_undo, local_storage, no_constraint, read_only_property, no_serialization) m_input_mesh;\n\tk3d_data(k3d::mesh*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_output_mesh;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// frozen_mesh_factory\n\nk3d::iplugin_factory& frozen_mesh_factory()\n{\n\treturn frozen_mesh::get_factory();\n}\n\n} // namespace mesh_instance\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/mesh_instance/mesh_instance.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/ibounded.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/parentable.h>\n#include <k3dsdk/pointer_demand_storage.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/snappable.h>\n#include <k3dsdk/transformable.h>\n\n#include <boost/any.hpp>\n\n#include <list>\n\nnamespace module\n{\n\nnamespace mesh_instance\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_instance\n\nclass mesh_instance :\n\tpublic k3d::snappable<k3d::gl::renderable<k3d::ri::renderable<k3d::mesh_selection_sink<k3d::parentable<k3d::transformable<k3d::node > > > > > >,\n\tpublic k3d::ibounded,\n\tpublic k3d::imesh_sink,\n\tpublic k3d::imesh_source\n{\n\ttypedef k3d::snappable<k3d::gl::renderable<k3d::ri::renderable<k3d::mesh_selection_sink<k3d::parentable<k3d::transformable<k3d::node > > > > > > base;\npublic:\n\tmesh_instance(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input_mesh(init_owner(*this) + init_name(\"input_mesh\") + init_label(_(\"Input Mesh\")) + init_description(_(\"Input mesh\")) + init_value<k3d::mesh*>(0)),\n\t\tm_output_mesh(init_owner(*this) + init_name(\"output_mesh\") + init_label(_(\"Output Mesh\")) + init_description(_(\"Output mesh\"))),\n\t\tm_gl_painter(init_owner(*this) + init_name(\"gl_painter\") + init_label(_(\"OpenGL Mesh Painter\")) + init_description(_(\"OpenGL Mesh Painter\")) + init_value(static_cast<k3d::gl::imesh_painter*>(0))),\n\t\tm_ri_painter(init_owner(*this) + init_name(\"ri_painter\") + init_label(_(\"RenderMan Mesh Painter\")) + init_description(_(\"RenderMan Mesh Painter\")) + init_value(static_cast<k3d::ri::imesh_painter*>(0))),\n\t\tm_show_component_selection(init_owner(*this) + init_name(\"show_component_selection\") + init_label(_(\"Show Component Selection\")) + init_description(_(\"Show component selection\")) + init_value(false))\n\t{\n\t\tm_input_mesh.changed_signal().connect(k3d::hint::converter<k3d::hint::convert<k3d::hint::any, k3d::hint::unchanged> >(m_output_mesh.make_slot()));\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<k3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(m_output_mesh.make_slot()));\n\n\t\tm_input_mesh.changed_signal().connect(make_async_redraw_slot());\n\t\tm_mesh_selection.changed_signal().connect(make_async_redraw_slot());\n\t\tm_input_matrix.changed_signal().connect(make_async_redraw_slot());\n\t\tm_gl_painter.changed_signal().connect(make_async_redraw_slot());\n\t\tm_show_component_selection.changed_signal().connect(make_async_redraw_slot());\n\t\t\n\t\tm_output_mesh.set_update_slot(sigc::mem_fun(*this, &mesh_instance::execute));\n\t}\n\t\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::mesh& Output)\n\t{\n\t\tif(const k3d::mesh* const input_mesh = m_input_mesh.pipeline_value())\n\t\t{\n\t\t\tk3d::bool_t geometry_only = true;\n\t\t\tk3d::ipipeline_profiler::profile profile(document().pipeline_profiler(), *this, \"Update mesh\");\n\t\t\tfor(k3d::uint_t i = 0; i != Hints.size(); ++i)\n\t\t\t{\n\t\t\t\tif(!dynamic_cast<k3d::hint::mesh_geometry_changed*>(Hints[i]))\n\t\t\t\t\tgeometry_only = false;\n\t\t\t}\n\t\t\tif(!geometry_only)\n\t\t\t{\n\t\t\t\tOutput = *input_mesh;\n\t\t\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tOutput.points = input_mesh->points;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tOutput = k3d::mesh();\n\t\t}\n\t}\n\n\tconst k3d::bounding_box3 extents()\n\t{\n\t\tk3d::bounding_box3 results;\n\n\t\tconst k3d::mesh* const output_mesh = k3d::property::pipeline_value<k3d::mesh*>(m_output_mesh);\n\t\treturn_val_if_fail(output_mesh, results);\n\n\t\tif(output_mesh->points)\n\t\t{\n\t\t\tfor(k3d::mesh::points_t::const_iterator point = output_mesh->points->begin(); point != output_mesh->points->end(); ++point)\n\t\t\t{\n\t\t\t\tresults.px = std::max(results.px, (*point)[0]);\n\t\t\t\tresults.py = std::max(results.py, (*point)[1]);\n\t\t\t\tresults.pz = std::max(results.pz, (*point)[2]);\n\t\t\t\tresults.nx = std::min(results.nx, (*point)[0]);\n\t\t\t\tresults.ny = std::min(results.ny, (*point)[1]);\n\t\t\t\tresults.nz = std::min(results.nz, (*point)[2]);\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\t\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::ipipeline_profiler::profile profile(document().pipeline_profiler(), *this, \"Draw\");\n\t\tif(k3d::gl::imesh_painter* const painter = m_gl_painter.pipeline_value())\n\t\t{\n\t\t\tconst k3d::mesh* const output_mesh = k3d::property::pipeline_value<k3d::mesh*>(m_output_mesh);\n\t\t\treturn_if_fail(output_mesh);\n\t\t\t\n\t\t\tk3d::gl::painter_render_state render_state(State, matrix(), m_show_component_selection.pipeline_value());\n\t\t\ttry\n\t\t\t{\n\t\t\t\tpainter->paint_mesh(*output_mesh, render_state, m_output_mesh.changed_signal());\n\t\t\t}\n\t\t\tcatch(std::runtime_error& E) // VBO painters throw an exception if the VBO state is corrupted.\n\t\t\t{\n\t\t\t\tk3d::log() << error << E.what() << std::endl;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectionState)\n\t{\n\t\tk3d::ipipeline_profiler::profile profile(document().pipeline_profiler(), *this, \"Select\");\n\t\tif(k3d::gl::imesh_painter* const painter = m_gl_painter.pipeline_value())\n\t\t{\n\t\t\tconst k3d::mesh* const output_mesh = k3d::property::pipeline_value<k3d::mesh*>(m_output_mesh);\n\t\t\treturn_if_fail(output_mesh);\n\n\t\t\tk3d::gl::painter_render_state render_state(State, matrix(), m_show_component_selection.pipeline_value());\n\t\t\tk3d::gl::painter_selection_state selection_state(SelectionState);\n\n\t\t\t// At the top-level, ID the entire instance ...\n\t\t\tk3d::gl::push_selection_token(this);\n\t\t\t// Then, ID the underlying mesh ...\n\t\t\tk3d::gl::push_selection_token(k3d::selection::MESH, 0);\n\t\t\t// Now give the painters a chance ...\n\t\t\ttry\n\t\t\t{\n\t\t\t\tpainter->select_mesh(*output_mesh, render_state, selection_state, m_output_mesh.changed_signal());\n\t\t\t}\n\t\t\tcatch(std::runtime_error& E) // VBO painters throw an exception if the VBO state is corrupted.\n\t\t\t{\n\t\t\t\tk3d::log() << error << E.what() << std::endl;\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // mesh\n\t\t\tk3d::gl::pop_selection_token(); // node\n\t\t}\n\t}\n\n\tvoid on_renderman_render(const k3d::ri::render_state& State)\n\t{\n\t\tif(k3d::ri::imesh_painter* const painter = m_ri_painter.pipeline_value())\n\t\t{\n\t\t\tconst k3d::mesh* const input_mesh = m_input_mesh.pipeline_value();\n\t\t\treturn_if_fail(input_mesh);\n\n\t\t\tpainter->paint_mesh(*input_mesh, State);\n\t\t}\n\t}\n\n\tvoid on_renderman_render_complete(const k3d::ri::render_state& State)\n\t{\n\t\tif(k3d::ri::imesh_painter* const painter = m_ri_painter.pipeline_value())\n\t\t{\n\t\t\tconst k3d::mesh* const input_mesh = m_input_mesh.pipeline_value();\n\t\t\treturn_if_fail(input_mesh);\n\n\t\t\tpainter->paint_complete(*input_mesh, State);\n\t\t}\n\t}\n\n\tk3d::iproperty& mesh_source_output()\n\t{\n\t\treturn m_output_mesh;\n\t}\n\n\tk3d::iproperty& mesh_sink_input()\n\t{\n\t\treturn m_input_mesh;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_instance,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > > > factory(\n\t\t\t\tk3d::classes::MeshInstance(),\n\t\t\t\t\"MeshInstance\",\n\t\t\t\t_(\"Renders an instance of a geometric mesh\"),\n\t\t\t\t\"Mesh\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\n\nprivate:\n\tk3d_data(k3d::mesh*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::read_only_property, k3d::data::no_serialization) m_input_mesh;\n\tk3d_data(k3d::mesh*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::pointer_demand_storage, k3d::data::no_constraint, k3d::data::read_only_property, k3d::data::no_serialization) m_output_mesh;\n\tk3d_data(k3d::gl::imesh_painter*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::with_undo, k3d::data::node_storage, k3d::data::no_constraint, k3d::data::node_property, k3d::data::node_serialization) m_gl_painter;\n\tk3d_data(k3d::ri::imesh_painter*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::with_undo, k3d::data::node_storage, k3d::data::no_constraint, k3d::data::node_property, k3d::data::node_serialization) m_ri_painter;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_show_component_selection;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_instance_factory\n\nk3d::iplugin_factory& mesh_instance_factory()\n{\n\treturn mesh_instance::get_factory();\n}\n\n} // namespace mesh_instance\n\n} // namespace module\n"
  },
  {
    "path": "modules/mesh_instance/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\n/// Namespace reserved for the mesh instance plugin module, to protect public symbols from name clashes with other modules\nnamespace module\n{\n\nnamespace mesh_instance\n{\n\nextern k3d::iplugin_factory& frozen_mesh_factory();\nextern k3d::iplugin_factory& mesh_instance_factory();\n\n} // namespace mesh_instance\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::mesh_instance::frozen_mesh_factory());\n\tRegistry.register_factory(module::mesh_instance::mesh_instance_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GLIBMM_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GTKGLEXT_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GTKMM_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_SIGC_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${K3D_GTKGLEXT_LIB_DIRS})\nLINK_DIRECTORIES(${K3D_GTKMM_LIB_DIRS})\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nK3D_BUILD_MODULE(k3d-ngui)\nK3D_CREATE_MODULE_PROXY(k3d-ngui)\n\nINCLUDE(K3DFindGthread)\n\nTARGET_LINK_LIBRARIES(k3d-ngui k3dsdk)\nTARGET_LINK_LIBRARIES(k3d-ngui k3dsdk-ngui)\nTARGET_LINK_LIBRARIES(k3d-ngui ${K3D_GLIBMM_LIBS})\nTARGET_LINK_LIBRARIES(k3d-ngui ${K3D_GTKGLEXT_LIBS})\nTARGET_LINK_LIBRARIES(k3d-ngui ${K3D_GTKMM_LIBS})\nTARGET_LINK_LIBRARIES(k3d-ngui ${K3D_GTHREAD_LIBS})\n\nIF(K3D_ENABLE_NLS)\n\tINCLUDE_DIRECTORIES(${K3D_INTL_INCLUDE_DIRS})\n\tTARGET_LINK_LIBRARIES(k3d-ngui ${K3D_INTL_LIBS})\nENDIF(K3D_ENABLE_NLS)\n\n"
  },
  {
    "path": "modules/ngui/file_notification.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"file_notification.h\"\n\n#include <k3dsdk/ifile_change_notifier.h>\n#include <k3dsdk/plugin.h>\n\n#include <glibmm/dispatcher.h>\n#include <glibmm/thread.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// file_notification::implementation\n\nclass file_notification::implementation\n{\npublic:\n\t/// Stores an object that provides an abstraction over platform-specific file-change-notification APIs.\n\tboost::scoped_ptr<k3d::ifile_change_notifier> m_notifier;\n\t/// Controls a timeout loop or thread that handles file-notification events.\n\tsigc::connection m_file_notification_connection;\n\t/// Dispatcher used for threaded file change notification\n\tboost::scoped_ptr<Glib::Dispatcher> m_file_notification_dispatcher;\n\t/// Mutex and condition, used to make the watching thread wait until the event has been handled\n\tboost::scoped_ptr<Glib::Mutex> m_file_notification_mutex;\n\tboost::scoped_ptr<Glib::Cond> m_file_notification_cond;\n};\n\t\n/////////////////////////////////////////////////////////////////////////////\n// file_notification\n\nfile_notification::file_notification() :\n\tm_implementation(new implementation())\n{\n}\n\nfile_notification::~file_notification()\n{\n\tdelete m_implementation;\n}\n\nvoid file_notification::start()\n{\n\t// Use the first file change notifier found\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup<k3d::ifile_change_notifier>();\n\tif(factories.size())\n\t\tm_implementation->m_notifier.reset(k3d::plugin::create<k3d::ifile_change_notifier>(**factories.begin()));\n\n\tif(!m_implementation->m_notifier)\n\t{\n\t\tk3d::log() << info << \"File change notification disabled.\" << std::endl;\n\t\treturn;\n\t}\n\n#ifdef G_THREADS_ENABLED\n\tif(!Glib::thread_supported())\n\t\tGlib::thread_init();\n\tm_implementation->m_file_notification_dispatcher.reset(new Glib::Dispatcher());\n\tm_implementation->m_file_notification_mutex.reset(new Glib::Mutex());\n\tm_implementation->m_file_notification_cond.reset(new Glib::Cond());\n\tm_implementation->m_file_notification_connection = m_implementation->m_file_notification_dispatcher->connect(sigc::mem_fun(*this, &file_notification::on_notify_file_changes_threaded));\n\tGlib::Thread::create(sigc::mem_fun(*this, &file_notification::notify_file_change_thread_function), false);\n#else\n\tm_implementation->m_file_notification_connection = Glib::signal_timeout().connect(sigc::bind_return(sigc::mem_fun(*this, &file_notification::on_notify_file_changes), true), 1000);\n#endif\n}\n\nk3d::uint_t file_notification::watch_path(const k3d::filesystem::path& Path, const sigc::slot<void>& Slot)\n{\n\tif(!m_implementation->m_notifier)\n\t\treturn 0;\n\n\treturn m_implementation->m_notifier->watch_file(Path, Slot);\n}\n\nvoid file_notification::unwatch_path(const k3d::uint_t WatchID)\n{\n\tif(!m_implementation->m_notifier)\n\t\treturn;\n\n\tm_implementation->m_notifier->unwatch_file(WatchID);\n}\n\t\nvoid file_notification::stop()\n{\n\tm_implementation->m_file_notification_connection.disconnect();\n}\n\nvoid file_notification::on_notify_file_changes()\n{\n\twhile(m_implementation->m_notifier->change_count())\n\t\tm_implementation->m_notifier->signal_change();\n}\n\nvoid file_notification::on_notify_file_changes_threaded()\n{\n\tGlib::Mutex::Lock lock(*m_implementation->m_file_notification_mutex);\n\ton_notify_file_changes();\n\tm_implementation->m_file_notification_cond->signal();\n}\n\nvoid file_notification::notify_file_change_thread_function()\n{\n\twhile(true)\n\t{\n\t\tm_implementation->m_notifier->wait_for_changes();\n\t\t// Signal the main thread that events have occurred\n\t\tm_implementation->m_file_notification_dispatcher->emit();\n\t\t// Wait until the main thread has handled the events\n\t\tGlib::Mutex::Lock lock(*m_implementation->m_file_notification_mutex);\n\t\tm_implementation->m_file_notification_cond->wait(*m_implementation->m_file_notification_mutex);\n\t}\n}\n\n} // namespace ngui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/ngui/file_notification.h",
    "content": "#ifndef MODULES_NGUI_FILE_NOTIFICATION_H\n#define MODULES_NGUI_FILE_NOTIFICATION_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/signal_system.h>\n#include <k3dsdk/types.h>\n\nnamespace k3d { namespace filesystem { class path; } }\n\nnamespace module\n{\n\nnamespace ngui\n{\n\n/// Implements all of the logic for file-change-notification.  Based on the current configuration, \n/// file-notification may be disabled altogether, implemented using timeout-based polling, or\n/// implementing using glibmm threads.\nclass file_notification\n{\npublic:\n\tfile_notification();\n\t~file_notification();\n\n\t/// Start the file notification system.\n\tvoid start();\n\tk3d::uint_t watch_path(const k3d::filesystem::path& Path, const sigc::slot<void>& Slot);\n\tvoid unwatch_path(const k3d::uint_t WatchID);\n\t/// Stop the file notification system and cleanup resources.\n\tvoid stop();\n\nprivate:\n\tvoid on_notify_file_changes();\n\tvoid on_notify_file_changes_threaded();\n\tvoid notify_file_change_thread_function();\n\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace ngui\n\n} // namespace module\n\n#endif // !MODULES_NGUI_FILE_NOTIFICATION_H\n"
  },
  {
    "path": "modules/ngui/splash_box.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include \"splash_box.h\"\n\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/path.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/frame.h>\n#include <gtkmm/image.h>\n#include <gtkmm/label.h>\n\n#include <iostream>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// splash_box\n\nsplash_box::splash_box(const k3d::filesystem::path& SharePath) :\n\tbase(Gtk::WINDOW_TOPLEVEL),\n\tm_startup_message(new Gtk::Label(\"\", Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER))\n{\n\tset_title(_(\"Starting K-3D ...\"));\n\tset_role(\"splash_box\");\n\tset_position(Gtk::WIN_POS_CENTER_ALWAYS);\n\tset_decorated(false);\n\tset_border_width(8);\n\n\tGtk::VBox* const vbox = new Gtk::VBox(false, 0);\n\n\tvbox->pack_start(*Gtk::manage(\n\t\tnew Gtk::Label()\n\t\t<< line_wrap()\n\t\t<< center_justify()\n\t\t<< set_markup(\"<big><b>K-3D Version \" K3D_VERSION \"</b></big>\")));\n\n\tvbox->pack_start(*Gtk::manage(\n\t\tnew Gtk::Label(K3D_COPYRIGHT)\n\t\t<< line_wrap()\n\t\t<< center_justify()));\n\n\tvbox->pack_start(*Gtk::manage(\n\t\tnew Gtk::Label(\"Portions copyright (c) 2002, Industrial Light & Magic, a division of Lucas Digital Ltd. LLC\")\n\t\t<< line_wrap()\n\t\t<< center_justify()));\n\n\tvbox->pack_start(*Gtk::manage(\n\t\tnew Gtk::Label(\"See \\\"Help > About\\\" for contributors.\")\n\t\t<< line_wrap()\n\t\t<< center_justify()));\n\n\tvbox->pack_start(*Gtk::manage(\n\t\tnew Gtk::Label(\"This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License.  See \\\"Help > About\\\" for details.\")\n\t\t<< line_wrap()\n\t\t<< center_justify()));\n\n\tGtk::HBox* const hbox = new Gtk::HBox(false, 8);\n\n\tconst k3d::filesystem::path path = SharePath / k3d::filesystem::generic_path(\"splash.xpm\");\n\ttry\n\t{\n\t\tGtk::Frame* const frame = new Gtk::Frame();\n\t\tframe->set_shadow_type(Gtk::SHADOW_OUT);\n\t\tframe->add(*Gtk::manage(new Gtk::Image(Gdk::Pixbuf::create_from_file(path.native_filesystem_string()))));\n\n\t\t// Note: we can't use our convenience load_pixbuf() function here, because k3d::application() isn't initialized, yet ...\n\t\thbox->pack_start(*Gtk::manage(frame));\n\t}\n\tcatch(...)\n\t{\n\t\tk3d::log() << error << \"Error loading image [\" << path.native_console_string() << \"]\" << std::endl;\n\t}\n\n\thbox->pack_start(*Gtk::manage(vbox));\n\n\tGtk::VBox* const vbox2 = new Gtk::VBox(false, 8);\n\tvbox2->pack_start(*Gtk::manage(hbox));\n\tvbox2->pack_start(*Gtk::manage(m_startup_message));\n\n\tadd(*Gtk::manage(vbox2));\n\n\tshow_all();\n\thandle_pending_events();\n}\n\nvoid splash_box::on_startup_message(const std::string& Message)\n{\n\tm_startup_message->set_text(Message);\n\thandle_pending_events();\n}\n\n} // namespace ngui\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/ngui/splash_box.h",
    "content": "#ifndef MODULES_NGUI_SPLASH_BOX_H\n#define MODULES_NGUI_SPLASH_BOX_H\n\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Declares the splash_box class, which provides a custom startup \"splash\" box for K-3D\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gtkmm/window.h>\n\nnamespace k3d { namespace filesystem { class path; } }\nnamespace Gtk { class Label; }\n\nnamespace module\n{\n\nnamespace ngui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// splash_box\n\n/// Creates a modal \"splash\" box that displays program version and copyright\nclass splash_box :\n\tpublic Gtk::Window\n{\n\ttypedef Gtk::Window base;\n\npublic:\n\tsplash_box(const k3d::filesystem::path& SharePath);\n\tvoid on_startup_message(const std::string& Message);\n\nprivate:\n\tGtk::Label* const m_startup_message;\n};\n\n} // namespace ngui\n\n} // namespace module\n\n#endif // !MODULES_NGUI_SPLASH_BOX_H\n\n"
  },
  {
    "path": "modules/ngui/user_interface.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"file_notification.h\"\n#include \"splash_box.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/ngui/application_state.h>\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/ngui/document.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/ngui/main_document_window.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/options.h>\n#include <k3dsdk/ngui/uri.h>\n#include <k3dsdk/ngui/utility.h>\n\n#include <k3dsdk/application.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/ifile_change_notifier.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/iscripted_action.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/ievent_loop.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/system.h>\n\n#include <glibmm/main.h>\n\n#include <gtkmm/accelkey.h>\n#include <gtkmm/accelmap.h>\n#include <gtkmm/main.h>\n\n#include <gtk/gtkgl.h>\n\n#include <boost/date_time/gregorian/gregorian.hpp>\n#include <boost/date_time/posix_time/posix_time.hpp>\n#include <boost/program_options.hpp>\n\n#include <k3dsdk/fstream.h>\n#include <boost/format.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace detail\n{\n\nvoid handle_error(const k3d::string_t& Message, bool& Quit, bool& Error)\n{\n\tk3d::log() << error << Message << std::endl;\n\n\tQuit = true;\n\tError = true;\n}\n\nconst k3d::filesystem::path hotkey_path()\n{\n\treturn k3d::system::get_home_directory() / k3d::filesystem::generic_path(\".k3d/hotkeys\");\n}\n\nvoid setup_default_hotkeys()\n{\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/create/PolyCube\", Gtk::AccelKey(\"F5\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/create/PolyCylinder\", Gtk::AccelKey(\"F6\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/create/PolyGrid\", Gtk::AccelKey(\"F8\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/create/PolySphere\", Gtk::AccelKey(\"F7\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/delete\", Gtk::AccelKey(\"Delete\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/duplicate\", Gtk::AccelKey(\"d\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/instantiate\", Gtk::AccelKey(\"d\").get_key(), Gdk::SHIFT_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/redo\", Gtk::AccelKey(\"z\").get_key(), Gdk::CONTROL_MASK | Gdk::SHIFT_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/tools/move_tool\", Gtk::AccelKey(\"w\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/tools/parent_tool\", Gtk::AccelKey(\"p\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/tools/rotate_tool\", Gtk::AccelKey(\"e\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/tools/scale_tool\", Gtk::AccelKey(\"r\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/tools/select_tool\", Gtk::AccelKey(\"q\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/tools/snap_tool\", Gtk::AccelKey(\"s\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/tools/unparent\", Gtk::AccelKey(\"p\").get_key(), Gdk::SHIFT_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/edit/undo\", Gtk::AccelKey(\"z\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/file/close\", Gtk::AccelKey(\"w\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/file/new\", Gtk::AccelKey(\"n\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/file/open\", Gtk::AccelKey(\"o\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/file/quit\", Gtk::AccelKey(\"q\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/file/save\", Gtk::AccelKey(\"s\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/file/save_as\", Gtk::AccelKey(\"s\").get_key(), Gdk::CONTROL_MASK | Gdk::SHIFT_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/help/manual\", Gtk::AccelKey(\"F1\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/layout/fullscreen\", Gtk::AccelKey(\"F11\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/layout/hide_unpinned\", Gtk::AccelKey(\"grave\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/CollapseEdges\", Gtk::AccelKey(\"b\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/ConnectVertices\", Gtk::AccelKey(\"j\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/Delete\", Gtk::AccelKey(\"BackSpace\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/Dissolve\", Gtk::AccelKey(\"BackSpace\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/ExtrudeFaces\", Gtk::AccelKey(\"m\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/FilletEdges\", Gtk::AccelKey(\"n\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/FlipOrientation\", Gtk::AccelKey(\"i\").get_key(), Gdk::SHIFT_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/GrowSelection\", Gtk::AccelKey(\"equal\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/SelectEdgeLoops\", Gtk::AccelKey(\"semicolon\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/SelectEdgeRings\", Gtk::AccelKey(\"l\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/SubdivideEdges\", Gtk::AccelKey(\"k\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/modifier/SubdivideFaces\", Gtk::AccelKey(\"k\").get_key(), Gdk::SHIFT_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/render/render_frame\", Gtk::AccelKey(\"F12\").get_key(), Gdk::SHIFT_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/render/render_preview\", Gtk::AccelKey(\"F12\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/render/render_region\", Gtk::AccelKey(\"F12\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/select/select_all\", Gtk::AccelKey(\"a\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/select/select_child\", Gtk::AccelKey(\"bracketleft\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/select/select_faces\", Gtk::AccelKey(\"4\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/select/select_invert\", Gtk::AccelKey(\"i\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/select/select_lines\", Gtk::AccelKey(\"3\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/select/select_nodes\", Gtk::AccelKey(\"1\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/select/select_none\", Gtk::AccelKey(\"space\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/select/select_parent\", Gtk::AccelKey(\"p\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/select/select_points\", Gtk::AccelKey(\"2\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/select/select_sibling\", Gtk::AccelKey(\"bracketright\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/view/aim_selection\", Gtk::AccelKey(\"a\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/view/assign_hotkeys\", Gtk::AccelKey(\"Insert\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/view/frame_selection\", Gtk::AccelKey(\"f\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/view/hide_selection\", Gtk::AccelKey(\"h\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/view/hide_unselected\", Gtk::AccelKey(\"h\").get_key(), Gdk::SHIFT_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/view/set_camera\", Gtk::AccelKey(\"c\").get_key(), Gdk::ModifierType(0));\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/view/show_all\", Gtk::AccelKey(\"h\").get_key(), Gdk::CONTROL_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/view/show_selection\", Gtk::AccelKey(\"h\").get_key(), Gdk::CONTROL_MASK | Gdk::SHIFT_MASK);\n\tGtk::AccelMap::add_entry(\"<k3d-document>/actions/view/toggle_projection\", Gtk::AccelKey(\"o\").get_key(), Gdk::ModifierType(0));\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// user_interface\n\nclass user_interface :\n\tpublic k3d::iuser_interface,\n\tpublic k3d::ievent_loop,\n\tpublic sigc::trackable\n{\npublic:\n\tuser_interface() :\n\t\tm_show_learning_menu(options::nag(\"show_learning_menu\"))\n\t{\n\t\t// This ensures that we can use ATK for testing, even when the user hasn't enabled desktop accessibility.\n\t\tk3d::system::setenv(\"GTK_MODULES\", \"gail\");\n\n\t\t/// Redirect glib-based logging to our own standard logging mechanism\n\t\tg_log_set_handler(\"\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"Gdk\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"GdkPixbuf\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"Glib\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"Glib-GObject\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"GLib-GObject\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"Gtk\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"Pango\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"atk-bridge\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"atkmm\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"gdkmm\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"glibmm\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"gtkmm\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t\tg_log_set_handler(\"pangomm\", static_cast<GLogLevelFlags>(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), log_handler, 0);\n\t}\n\n\t~user_interface()\n\t{\n\t\tdelete_auto_start_plugins();\n\n\t\tconst k3d::filesystem::path hotkey_path = detail::hotkey_path();\n\t\tk3d::filesystem::create_directories(hotkey_path.branch_path());\n\t\tk3d::log() << info << \"Saving hotkeys to \" << hotkey_path.native_console_string() << std::endl;\n\t\tGtk::AccelMap::save(hotkey_path.native_filesystem_string());\n\t}\n\n\tstatic void log_handler(const gchar* LogDomain, GLogLevelFlags LogLevel, const gchar* Message, gpointer UserData)\n\t{\n\t\tconst k3d::string_t domain = LogDomain ? LogDomain : \"\";\n\t\tk3d::string_t message(Message ? Message : \"\");\n\t\tstd::replace(message.begin(), message.end(), '\\n', ' ');\n\t\tstd::replace(message.begin(), message.end(), '\\r', ' ');\n\n\t\tswitch(LogLevel)\n\t\t{\n\t\t\tcase G_LOG_LEVEL_ERROR:\n\t\t\t\tk3d::log() << critical << domain << \": \" << message << std::endl;\n\t\t\t\tbreak;\n\t\t\tcase G_LOG_LEVEL_CRITICAL:\n\t\t\t\tk3d::log() << error << domain << \": \" << message << std::endl;\n\t\t\t\tbreak;\n\t\t\tcase G_LOG_LEVEL_WARNING:\n\t\t\t\tk3d::log() << warning << domain << \": \" << message << std::endl;\n\t\t\t\tbreak;\n\t\t\tcase G_LOG_LEVEL_MESSAGE:\n\t\t\tcase G_LOG_LEVEL_INFO:\n\t\t\t\tk3d::log() << info << domain << \": \" << message << std::endl;\n\t\t\t\tbreak;\n\t\t\tcase G_LOG_LEVEL_DEBUG:\n\t\t\t\tk3d::log() << debug << domain << \": \" << message << std::endl;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tk3d::log() << domain << \": \" << message << std::endl;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid get_command_line_arguments(boost::program_options::options_description& Description)\n\t{\n\t\tDescription.add_options()\n\t\t\t(\"new,n\", \"Create a new document.\")\n\t\t\t(\"no-custom-layouts\", \"Disable custom user interface layouts (useful when playing-back recorded tutorials).\")\n\t\t\t(\"no-splash\", \"Disables the startup splash screen.\")\n\t\t\t(\"open,o\", boost::program_options::value<k3d::string_t>(), \"Open an existing document.\")\n\t\t\t(\"show-learning-menu\", \"Display the learning menu after startup.\")\n\t\t\t;\n\t}\n\n\tconst arguments_t parse_startup_arguments(const arguments_t& Arguments, bool& Quit, bool& Error)\n\t{\n\t\t// Keep track of whether to display a splash screen or not ...\n\t\tbool show_splash = true;\n\n\t\t// We want GTK to parse an optional RC file from the user's home directory ...\n\t\tconst k3d::filesystem::path rc_file = k3d::system::get_home_directory() / k3d::filesystem::generic_path(\".k3d/gtkrc\");\n\t\tk3d::filesystem::create_directories(rc_file.branch_path());\n\t\tif(!k3d::filesystem::exists(rc_file))\n\t\t{\n\t\t\tk3d::filesystem::ofstream stream(rc_file);\n\t\t\tstream << \"# You can add your own K-3D-specific GTK styles here.\\n\\n\";\n\n\t\t\tstream << \"# Un-comment this to modify icon sizes.\\n\";\n\t\t\tstream << \"# gtk-icon-sizes = \\\"mini-commander-icon=24,24:print-manager=64,64:panel-button=32,32:gtk-dnd=48,48:gtk-menu=32,32:panel-menu=48,48:gtk-large-toolbar=48,48:gtk-small-toolbar=32,32:gtk-button=32,32:gtk-dialog=64,64\\\"\\n\\n\";\n\n\t\t\tstream << \"# Add styles that will apply to all K-3D widgets here.\\n\";\n\t\t\tstream << \"style \\\"k3d-style\\\"\\n\";\n\t\t\tstream << \"{\\n\\n\";\n\n\t\t\tstream << \"}\\n\\n\";\n\n\t\t\tstream << \"class \\\"*\\\" style \\\"k3d-style\\\"\\n\";\n\t\t}\n\t\tif(k3d::filesystem::exists(rc_file))\n\t\t{\n\t\t\tGtk::RC::add_default_file(rc_file.native_filesystem_string());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tk3d::log() << warning << \"Could not locate or create \" << rc_file.native_console_string() << \" resource file\" << std::endl;\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\tconst Glib::StringArrayHandle default_files = Gtk::RC::get_default_files();\n\t\t\tfor(Glib::StringArrayHandle::const_iterator file = default_files.begin(); file != default_files.end(); ++file)\n\t\t\t\tk3d::log() << info << \"Loading GTK resources from \" << *file << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\t/** \\todo Figure-out why printing a path with a non-ASCII character throws an exception,\n\t\t\tsee http://sourceforge.net/tracker/index.php?func=detail&aid=1364098&group_id=11113&atid=111113 */\n\t\t\tk3d::log() << error << \"Caught exception logging GTK resource paths\" << std::endl;\n\t\t}\n\n\t\t// gtkmm expects to parse and modify argc / argv, so create some temporary storage for it to fiddle with ...\n\t\tstd::vector<char*> argv_buffer;\n\t\targv_buffer.push_back(const_cast<char*>(\"k3d\"));\n//\t\tfor(arguments_t::const_iterator argument = Arguments.begin(); argument != Arguments.end(); ++argument)\n//\t\t\targv_buffer.push_back(const_cast<char*>(argument->c_str()));\n\t\tint argc = argv_buffer.size();\n\t\tchar** argv = &argv_buffer[0];\n\n\t\tm_main.reset(new Gtk::Main(argc, argv));\n\n\t\t// Give gtkglext a chance at the startup arguments ...\n\t\tif(!gtk_gl_init_check(&argc, &argv))\n\t\t{\n\t\t\tdetail::handle_error(\"Could not initialize gtkglext\", Quit, Error);\n\t\t\treturn arguments_t();\n\t\t}\n\n\t\t// We return any \"unused\" arguments ...\n\t\targuments_t unused;\n\n\t\t// For each command-line argument ...\n\t\tfor(arguments_t::const_iterator argument = Arguments.begin(); argument != Arguments.end(); ++argument)\n\t\t{\n\t\t\tif(argument->string_key == \"no-custom-layouts\")\n\t\t\t{\n\t\t\t\tapplication_state::instance().enable_custom_layouts(false);\n\t\t\t}\n\t\t\telse if(argument->string_key == \"no-splash\")\n\t\t\t{\n\t\t\t\tshow_splash = false;\n\t\t\t}\n\t\t\telse if(argument->string_key == \"show-learning-menu\")\n\t\t\t{\n\t\t\t\tm_show_learning_menu = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tunused.push_back(*argument);\n\t\t\t}\n\t\t}\n\n\t\tGtk::Window::set_default_icon(load_pixbuf(k3d::share_path() / k3d::filesystem::generic_path(\"ngui/pixmap\"), k3d::filesystem::generic_path(\"default_icon.png\")));\n\n\t\tif(show_splash)\n\t\t\tm_splash_box.reset(new splash_box(k3d::share_path() / k3d::filesystem::generic_path(\"ngui/pixmap\")));\n\n\t\treturn unused;\n\t}\n\n\tvoid startup_message_handler(const k3d::string_t& Message)\n\t{\n\t\tif(m_splash_box.get())\n\t\t\tm_splash_box->on_startup_message(Message);\n\t}\n\n\tvoid display_user_interface()\n\t{\n    g_type_init();\n\t\tdetail::setup_default_hotkeys();\n\n\t\tconst k3d::filesystem::path hotkey_path = detail::hotkey_path();\n\t\tk3d::log() << info << \"Loading hotkeys from \" << hotkey_path.native_console_string() << std::endl;\n\t\tGtk::AccelMap::load(hotkey_path.native_filesystem_string());\n\n\t\tm_splash_box.reset();\n\n\t        create_document();\n\n\t\tif(m_show_learning_menu)\n\t\t{\n\t\t\tGtk::Window* const window = k3d::plugin::create<Gtk::Window>(\"NGUILearningDialog\");\n\t\t\tif(!window)\n\t\t\t\tk3d::log() << error << \"Error creating learning dialog at startup\" << std::endl;\n\t\t}\n\n\t\tcreate_auto_start_plugins();\n\t}\n\n\tconst arguments_t parse_runtime_arguments(const arguments_t& Arguments, bool& Quit, bool& Error)\n\t{\n\t\t// We return any \"unused\" arguments ...\n\t\targuments_t unused;\n\n\t\t// For each command-line argument ...\n\t\tfor(arguments_t::const_iterator argument = Arguments.begin(); argument != Arguments.end(); ++argument)\n\t\t{\n\t\t\tif(argument->string_key == \"new\")\n\t\t\t{\n\t\t\t    create_document();\n\t\t\t}\n\t\t\telse if(argument->string_key == \"open\")\n\t\t\t{\n\t\t\t\tif(argument->value.size() != 1 || argument->value[0].empty())\n\t\t\t\t{\n\t\t\t\t\tdetail::handle_error(\"You must supply a file path with the --open argument!\", Quit, Error);\n\t\t\t\t\treturn arguments_t();\n\t\t\t\t}\n\n\t\t\t\topen_document(k3d::filesystem::native_path(k3d::ustring::from_utf8(argument->value[0])));\n\t\t\t}\n\t\t\telse if(argument->position_key != -1)\n\t\t\t{\n\t\t\t\topen_document(k3d::filesystem::native_path(k3d::ustring::from_utf8(argument->value[0])));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tunused.push_back(*argument);\n\t\t\t}\n\t\t}\n\n\t\treturn unused;\n\t}\n\n\tvoid start_event_loop()\n\t{\n\t\tget_file_notification()->start();\n\t\tm_main->run();\n\t}\n\n\tvoid stop_event_loop()\n\t{\n\t\tget_file_notification()->stop();\n\t\tm_main->quit();\n\t}\n\n\tvoid open_uri(const k3d::string_t& URI)\n\t{\n\t\tk3d::ngui::uri::open(URI);\n\t}\n\n\tvoid message(const k3d::string_t& Message)\n\t{\n\t\tk3d::ngui::message(Message);\n\t}\n\n\tvoid warning_message(const k3d::string_t& Message)\n\t{\n\t\tk3d::ngui::warning_message(Message);\n\t}\n\n\tvoid error_message(const k3d::string_t& Message)\n\t{\n\t\tk3d::ngui::error_message(Message);\n\t}\n\n\tk3d::uint_t query_message(const k3d::string_t& Message, const k3d::uint_t DefaultOption, const std::vector<k3d::string_t>& Options)\n\t{\n\t\treturn k3d::ngui::query_message(Message, DefaultOption, Options);\n\t}\n\n\tvoid nag_message(const k3d::string_t& Type, const k3d::ustring& Message, const k3d::ustring& SecondaryMessage)\n\t{\n\t\tk3d::ngui::nag_message(Type, Message, SecondaryMessage);\n\t}\n\n\tk3d::bool_t get_file_path(const k3d::ipath_property::mode_t Mode, const k3d::string_t& Type, const k3d::string_t& Prompt, const k3d::filesystem::path& OldPath, k3d::filesystem::path& Result)\n\t{\n\t\tfile_chooser_dialog dialog(Prompt, Type, Mode);\n\t\treturn dialog.get_file_path(Result);\n\t}\n\n\tk3d::bool_t show(iunknown& Object)\n\t{\n\t\tk3d::log() << error << k3d_file_reference << \": not implemented!\" << std::endl;\n\t\treturn false;\n\t}\n\n\tvoid synchronize()\n\t{\n\t\tk3d::ngui::handle_pending_events();\n\t}\n\n\tsigc::connection get_timer(const k3d::double_t FrameRate, sigc::slot<void> Slot)\n\t{\n\t\treturn_val_if_fail(FrameRate != 0.0, sigc::connection());\n\n\t\tconst unsigned int interval = static_cast<unsigned int>(1000.0 / FrameRate);\n\t\treturn Glib::signal_timeout().connect(sigc::bind_return(Slot, true), interval);\n\t}\n\n\tk3d::uint_t watch_path(const k3d::filesystem::path& Path, const sigc::slot<void>& Slot)\n\t{\n\t\treturn get_file_notification()->watch_path(Path, Slot);\n\t}\n\tvoid unwatch_path(const k3d::uint_t WatchID)\n\t{\n\t\tget_file_notification()->unwatch_path(WatchID);\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<user_interface,\n\t\t\tk3d::interface_list<k3d::ievent_loop> > factory(\n\t\t\t\tk3d::uuid(0x444fbabf, 0x08164c85, 0x879751e7, 0x2d6d05b5),\n\t\t\t\t\"NGUI\",\n\t\t\t\t\"Next Generation User Interface (NGUI)\",\n\t\t\t\t\"Interface\");\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid create_auto_start_plugins()\n\t{\n\t\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup();\n\t\tfor(k3d::plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t\t{\n\t\t\tk3d::iplugin_factory::metadata_t metadata = (**factory).metadata();\n\n\t\t\tif(!metadata.count(\"ngui:application-start\"))\n\t\t\t\tcontinue;\n\n\t\t\tk3d::log() << info << \"Creating plugin [\" << (**factory).name() << \"] via ngui:application-start\" << std::endl;\n\n\t\t\tk3d::iunknown* const plugin = k3d::plugin::create(**factory);\n\t\t\tif(!plugin)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Error creating plugin [\" << (**factory).name() << \"] via ngui:application-start\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tm_auto_start_plugins.push_back(plugin);\n\n\t\t\tif(k3d::iscripted_action* const scripted_action = dynamic_cast<k3d::iscripted_action*>(plugin))\n\t\t\t{\n\t\t\t\tk3d::iscript_engine::context context;\n\t\t\t\tcontext[\"command\"] = k3d::string_t(\"startup\");\n\t\t\t\tscripted_action->execute(context);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid delete_auto_start_plugins()\n\t{\n\t\tfor(auto_start_plugins_t::iterator plugin = m_auto_start_plugins.begin(); plugin != m_auto_start_plugins.end(); ++plugin)\n\t\t{\n\t\t\tif(k3d::iscripted_action* const scripted_action = dynamic_cast<k3d::iscripted_action*>(*plugin))\n\t\t\t{\n\t\t\t\tk3d::iscript_engine::context context;\n\t\t\t\tcontext[\"command\"] = k3d::string_t(\"shutdown\");\n\t\t\t\tscripted_action->execute(context);\n\t\t\t}\n\t\t}\n\n\t\tfor(auto_start_plugins_t::iterator plugin = m_auto_start_plugins.begin(); plugin != m_auto_start_plugins.end(); ++plugin)\n\t\t\tdelete *plugin;\n\n\t\tm_auto_start_plugins.clear();\n\t}\n\t\n\t/// Handles file-notification functionality\n\tfile_notification* get_file_notification()\n\t{\n\t\tstatic file_notification* file_notifier = 0;\n\t\tif(!file_notifier)\n\t\t\tfile_notifier = new file_notification();\n\t\treturn file_notifier;\n\t}\n\t\n\t/// Set to true iff we should display the tutorial menu at startup\n\tk3d::bool_t m_show_learning_menu;\n\t/// Stores the main loop\n\tstd::unique_ptr<Gtk::Main> m_main;\n\t/// Stores the (optional) splash screen\n\tstd::unique_ptr<splash_box> m_splash_box;\n\n\t/// Stores (optional) auto-start plugins\n\ttypedef std::vector<k3d::iunknown*> auto_start_plugins_t;\n\t/// Stores (optional) auto-start plugins\n\tauto_start_plugins_t m_auto_start_plugins;\n};\n\t\n/////////////////////////////////////////////////////////////////////////////\n// user_interface_factory\n\nk3d::iplugin_factory& user_interface_factory()\n{\n\treturn user_interface::get_factory();\n}\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::user_interface_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_about/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-about)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-about)\n"
  },
  {
    "path": "modules/ngui_about/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/contributors.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/widget_manip.h>\n#include <k3dsdk/path.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/buttonbox.h>\n#include <gtkmm/frame.h>\n#include <gtkmm/image.h>\n#include <gtkmm/label.h>\n#include <gtkmm/notebook.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/stock.h>\n#include <gtkmm/textview.h>\n\n#include <boost/assign/list_of.hpp>\n#include <sstream>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace about\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dialog\n\n/// Creates an \"about\" box that displays program version and copyright\nclass dialog :\n\tpublic k3d::ngui::application_window,\n\tpublic k3d::iunknown\n{\n\ttypedef k3d::ngui::application_window base;\n\npublic:\n\tdialog()\n\t{\n\t\tset_title(_(\"About K-3D\"));\n\t\tset_role(\"about_box\");\n\t\tset_position(Gtk::WIN_POS_CENTER);\n\n\t\tGtk::Notebook* const notebook = new Gtk::Notebook();\n\t\t{\n\t\t\t{\n\t\t\t\tGtk::VBox* const box = new Gtk::VBox(false, 10);\n\t\t\t\tbox->set_border_width(5);\n\n\t\t\t\tbox->pack_start(*Gtk::manage(new Gtk::Image(load_pixbuf(k3d::filesystem::native_path(k3d::ustring::from_utf8(\"about.xpm\"))))), Gtk::PACK_EXPAND_WIDGET);\n\t\t\t\tbox->pack_start(*Gtk::manage(new Gtk::Label() << line_wrap() << center_justify() << set_markup(\"<big><b>K-3D Version \" K3D_VERSION \"</b></big>\")));\n\t\t\t\tbox->pack_start(*Gtk::manage(new Gtk::Label(K3D_COPYRIGHT) << line_wrap() << center_justify()));\n\t\t\t\tbox->pack_start(*Gtk::manage(new Gtk::Label(\"Portions copyright (c) 2002, Industrial Light & Magic, a division of Lucas Digital Ltd. LLC\") << line_wrap() << center_justify()));\n\n\t\t\t\tnotebook->append_page(*Gtk::manage(box), \"Copyright\");\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tGtk::VBox* const box = new Gtk::VBox(false, 10);\n\t\t\t\tbox->set_border_width(5);\n\n\t\t\t\tGtk::TextView* const text_view = new Gtk::TextView();\n\t\t\t\ttext_view->set_editable(false);\n\t\t\t\ttext_view->set_wrap_mode(Gtk::WRAP_WORD);\n\t\t\t\ttext_view->set_justification(Gtk::JUSTIFY_LEFT);\n\n\t\t\t\tGlib::RefPtr<Gtk::TextBuffer> text_buffer = text_view->get_buffer();\n\n\t\t\t\tGlib::RefPtr<Gtk::TextTag> heading_tag = Gtk::TextTag::create(\"name\");\n\t\t\t\theading_tag->property_foreground() = \"#000000\";\n\t\t\t\theading_tag->property_weight() = Pango::WEIGHT_BOLD;\n\t\t\t\theading_tag->property_justification() = Gtk::JUSTIFY_CENTER;\n\t\t\t\ttext_buffer->get_tag_table()->add(heading_tag);\n\n\t\t\t\ttext_buffer->insert(text_buffer->end(),\n\t\t\t\t\t\"This program is free software; you can redistribute it and/or \"\n\t\t\t\t\t\"modify it under the terms of the GNU General Public License:\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t);\n\n\t\t\t\ttext_buffer->insert_with_tag(text_buffer->end(),\n\t\t\t\t\t\"GNU GENERAL PUBLIC LICENSE\\n\"\n\t\t\t\t\t\"Version 2, June 1991\\n\"\n\t\t\t\t\t\"\\n\",\n\t\t\t\t\theading_tag);\n\n\t\t\t\ttext_buffer->insert(text_buffer->end(),\n\t\t\t\t\t\"Copyright (C) 1989, 1991 Free Software Foundation, Inc. \"\n\t\t\t\t\t\"59 Temple Place, Suite 330, Boston, MA  02111-1307  USA \"\n\t\t\t\t\t\"Everyone is permitted to copy and distribute verbatim copies \"\n\t\t\t\t\t\"of this license document, but changing it is not allowed.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t);\n\n\t\t\t\ttext_buffer->insert_with_tag(text_buffer->end(),\n\t\t\t\t\t\"Preamble\\n\"\n\t\t\t\t\t\"\\n\",\n\t\t\t\t\theading_tag);\n\n\t\t\t\ttext_buffer->insert(text_buffer->end(),\n\t\t\t\t\t\"  The licenses for most software are designed to take away your \"\n\t\t\t\t\t\"freedom to share and change it.  By contrast, the GNU General Public \"\n\t\t\t\t\t\"License is intended to guarantee your freedom to share and change free \"\n\t\t\t\t\t\"software--to make sure the software is free for all its users.  This \"\n\t\t\t\t\t\"General Public License applies to most of the Free Software \"\n\t\t\t\t\t\"Foundation's software and to any other program whose authors commit to \"\n\t\t\t\t\t\"using it.  (Some other Free Software Foundation software is covered by \"\n\t\t\t\t\t\"the GNU Library General Public License instead.)  You can apply it to \"\n\t\t\t\t\t\"your programs, too.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  When we speak of free software, we are referring to freedom, not \"\n\t\t\t\t\t\"price.  Our General Public Licenses are designed to make sure that you \"\n\t\t\t\t\t\"have the freedom to distribute copies of free software (and charge for \"\n\t\t\t\t\t\"this service if you wish), that you receive source code or can get it \"\n\t\t\t\t\t\"if you want it, that you can change the software or use pieces of it \"\n\t\t\t\t\t\"in new free programs; and that you know you can do these things.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  To protect your rights, we need to make restrictions that forbid \"\n\t\t\t\t\t\"anyone to deny you these rights or to ask you to surrender the rights. \"\n\t\t\t\t\t\"These restrictions translate to certain responsibilities for you if you \"\n\t\t\t\t\t\"distribute copies of the software, or if you modify it.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  For example, if you distribute copies of such a program, whether \"\n\t\t\t\t\t\"gratis or for a fee, you must give the recipients all the rights that \"\n\t\t\t\t\t\"you have.  You must make sure that they, too, receive or can get the \"\n\t\t\t\t\t\"source code.  And you must show them these terms so they know their \"\n\t\t\t\t\t\"rights.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  We protect your rights with two steps: (1) copyright the software, and \"\n\t\t\t\t\t\"(2) offer you this license which gives you legal permission to copy, \"\n\t\t\t\t\t\"distribute and/or modify the software.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  Also, for each author's protection and ours, we want to make certain \"\n\t\t\t\t\t\"that everyone understands that there is no warranty for this free \"\n\t\t\t\t\t\"software.  If the software is modified by someone else and passed on, we \"\n\t\t\t\t\t\"want its recipients to know that what they have is not the original, so \"\n\t\t\t\t\t\"that any problems introduced by others will not reflect on the original \"\n\t\t\t\t\t\"authors' reputations.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  Finally, any free program is threatened constantly by software \"\n\t\t\t\t\t\"patents.  We wish to avoid the danger that redistributors of a free \"\n\t\t\t\t\t\"program will individually obtain patent licenses, in effect making the \"\n\t\t\t\t\t\"program proprietary.  To prevent this, we have made it clear that any \"\n\t\t\t\t\t\"patent must be licensed for everyone's free use or not licensed at all.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  The precise terms and conditions for copying, distribution and \"\n\t\t\t\t\t\"modification follow.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t);\n\n\t\t\t\ttext_buffer->insert_with_tag(text_buffer->end(),\n\t\t\t\t\t\"GNU GENERAL PUBLIC LICENSE\\n\"\n\t\t\t\t\t\"TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\\n\"\n\t\t\t\t\t\"\\n\",\n\t\t\t\t\theading_tag);\n\n\t\t\t\ttext_buffer->insert(text_buffer->end(),\n\t\t\t\t\t\"  0. This License applies to any program or other work which contains \"\n\t\t\t\t\t\"a notice placed by the copyright holder saying it may be distributed \"\n\t\t\t\t\t\"under the terms of this General Public License.  The \\\"Program\\\", below, \"\n\t\t\t\t\t\"refers to any such program or work, and a \\\"work based on the Program\\\" \"\n\t\t\t\t\t\"means either the Program or any derivative work under copyright law: \"\n\t\t\t\t\t\"that is to say, a work containing the Program or a portion of it, \"\n\t\t\t\t\t\"either verbatim or with modifications and/or translated into another \"\n\t\t\t\t\t\"language.  (Hereinafter, translation is included without limitation in \"\n\t\t\t\t\t\"the term \\\"modification\\\".)  Each licensee is addressed as \\\"you\\\".\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"Activities other than copying, distribution and modification are not \"\n\t\t\t\t\t\"covered by this License; they are outside its scope.  The act of \"\n\t\t\t\t\t\"running the Program is not restricted, and the output from the Program \"\n\t\t\t\t\t\"is covered only if its contents constitute a work based on the \"\n\t\t\t\t\t\"Program (independent of having been made by running the Program). \"\n\t\t\t\t\t\"Whether that is true depends on what the Program does.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  1. You may copy and distribute verbatim copies of the Program's \"\n\t\t\t\t\t\"source code as you receive it, in any medium, provided that you \"\n\t\t\t\t\t\"conspicuously and appropriately publish on each copy an appropriate \"\n\t\t\t\t\t\"copyright notice and disclaimer of warranty; keep intact all the \"\n\t\t\t\t\t\"notices that refer to this License and to the absence of any warranty; \"\n\t\t\t\t\t\"and give any other recipients of the Program a copy of this License \"\n\t\t\t\t\t\"along with the Program.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"You may charge a fee for the physical act of transferring a copy, and \"\n\t\t\t\t\t\"you may at your option offer warranty protection in exchange for a fee.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  2. You may modify your copy or copies of the Program or any portion \"\n\t\t\t\t\t\"of it, thus forming a work based on the Program, and copy and \"\n\t\t\t\t\t\"distribute such modifications or work under the terms of Section 1 \"\n\t\t\t\t\t\"above, provided that you also meet all of these conditions:\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"a) You must cause the modified files to carry prominent notices \"\n\t\t\t\t\t\"stating that you changed the files and the date of any change.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"b) You must cause any work that you distribute or publish, that in \"\n\t\t\t\t\t\"whole or in part contains or is derived from the Program or any \"\n\t\t\t\t\t\"part thereof, to be licensed as a whole at no charge to all third \"\n\t\t\t\t\t\"parties under the terms of this License.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"c) If the modified program normally reads commands interactively \"\n\t\t\t\t\t\"when run, you must cause it, when started running for such \"\n\t\t\t\t\t\"interactive use in the most ordinary way, to print or display an \"\n\t\t\t\t\t\"announcement including an appropriate copyright notice and a \"\n\t\t\t\t\t\"notice that there is no warranty (or else, saying that you provide \"\n\t\t\t\t\t\"a warranty) and that users may redistribute the program under \"\n\t\t\t\t\t\"these conditions, and telling the user how to view a copy of this \"\n\t\t\t\t\t\"License.  (Exception: if the Program itself is interactive but \"\n\t\t\t\t\t\"does not normally print such an announcement, your work based on \"\n\t\t\t\t\t\"the Program is not required to print an announcement.)\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"These requirements apply to the modified work as a whole.  If \"\n\t\t\t\t\t\"identifiable sections of that work are not derived from the Program, \"\n\t\t\t\t\t\"and can be reasonably considered independent and separate works in \"\n\t\t\t\t\t\"themselves, then this License, and its terms, do not apply to those \"\n\t\t\t\t\t\"sections when you distribute them as separate works.  But when you \"\n\t\t\t\t\t\"distribute the same sections as part of a whole which is a work based \"\n\t\t\t\t\t\"on the Program, the distribution of the whole must be on the terms of \"\n\t\t\t\t\t\"this License, whose permissions for other licensees extend to the \"\n\t\t\t\t\t\"entire whole, and thus to each and every part regardless of who wrote it.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"Thus, it is not the intent of this section to claim rights or contest \"\n\t\t\t\t\t\"your rights to work written entirely by you; rather, the intent is to \"\n\t\t\t\t\t\"exercise the right to control the distribution of derivative or \"\n\t\t\t\t\t\"collective works based on the Program.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"In addition, mere aggregation of another work not based on the Program \"\n\t\t\t\t\t\"with the Program (or with a work based on the Program) on a volume of \"\n\t\t\t\t\t\"a storage or distribution medium does not bring the other work under \"\n\t\t\t\t\t\"the scope of this License.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  3. You may copy and distribute the Program (or a work based on it, \"\n\t\t\t\t\t\"under Section 2) in object code or executable form under the terms of \"\n\t\t\t\t\t\"Sections 1 and 2 above provided that you also do one of the following:\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"a) Accompany it with the complete corresponding machine-readable \"\n\t\t\t\t\t\"source code, which must be distributed under the terms of Sections \"\n\t\t\t\t\t\"1 and 2 above on a medium customarily used for software interchange; or,\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"b) Accompany it with a written offer, valid for at least three \"\n\t\t\t\t\t\"years, to give any third party, for a charge no more than your \"\n\t\t\t\t\t\"cost of physically performing source distribution, a complete \"\n\t\t\t\t\t\"machine-readable copy of the corresponding source code, to be \"\n\t\t\t\t\t\"distributed under the terms of Sections 1 and 2 above on a medium \"\n\t\t\t\t\t\"customarily used for software interchange; or,\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"c) Accompany it with the information you received as to the offer \"\n\t\t\t\t\t\"to distribute corresponding source code.  (This alternative is \"\n\t\t\t\t\t\"allowed only for noncommercial distribution and only if you \"\n\t\t\t\t\t\"received the program in object code or executable form with such \"\n\t\t\t\t\t\"an offer, in accord with Subsection b above.)\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"The source code for a work means the preferred form of the work for \"\n\t\t\t\t\t\"making modifications to it.  For an executable work, complete source \"\n\t\t\t\t\t\"code means all the source code for all modules it contains, plus any \"\n\t\t\t\t\t\"associated interface definition files, plus the scripts used to \"\n\t\t\t\t\t\"control compilation and installation of the executable.  However, as a \"\n\t\t\t\t\t\"special exception, the source code distributed need not include \"\n\t\t\t\t\t\"anything that is normally distributed (in either source or binary \"\n\t\t\t\t\t\"form) with the major components (compiler, kernel, and so on) of the \"\n\t\t\t\t\t\"operating system on which the executable runs, unless that component \"\n\t\t\t\t\t\"itself accompanies the executable.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"If distribution of executable or object code is made by offering \"\n\t\t\t\t\t\"access to copy from a designated place, then offering equivalent \"\n\t\t\t\t\t\"access to copy the source code from the same place counts as \"\n\t\t\t\t\t\"distribution of the source code, even though third parties are not \"\n\t\t\t\t\t\"compelled to copy the source along with the object code.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  4. You may not copy, modify, sublicense, or distribute the Program \"\n\t\t\t\t\t\"except as expressly provided under this License.  Any attempt \"\n\t\t\t\t\t\"otherwise to copy, modify, sublicense or distribute the Program is \"\n\t\t\t\t\t\"void, and will automatically terminate your rights under this License. \"\n\t\t\t\t\t\"However, parties who have received copies, or rights, from you under \"\n\t\t\t\t\t\"this License will not have their licenses terminated so long as such \"\n\t\t\t\t\t\"parties remain in full compliance.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  5. You are not required to accept this License, since you have not \"\n\t\t\t\t\t\"signed it.  However, nothing else grants you permission to modify or \"\n\t\t\t\t\t\"distribute the Program or its derivative works.  These actions are \"\n\t\t\t\t\t\"prohibited by law if you do not accept this License.  Therefore, by \"\n\t\t\t\t\t\"modifying or distributing the Program (or any work based on the \"\n\t\t\t\t\t\"Program), you indicate your acceptance of this License to do so, and \"\n\t\t\t\t\t\"all its terms and conditions for copying, distributing or modifying \"\n\t\t\t\t\t\"the Program or works based on it.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  6. Each time you redistribute the Program (or any work based on the \"\n\t\t\t\t\t\"Program), the recipient automatically receives a license from the \"\n\t\t\t\t\t\"original licensor to copy, distribute or modify the Program subject to \"\n\t\t\t\t\t\"these terms and conditions.  You may not impose any further \"\n\t\t\t\t\t\"restrictions on the recipients' exercise of the rights granted herein. \"\n\t\t\t\t\t\"You are not responsible for enforcing compliance by third parties to \"\n\t\t\t\t\t\"this License.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  7. If, as a consequence of a court judgment or allegation of patent \"\n\t\t\t\t\t\"infringement or for any other reason (not limited to patent issues), \"\n\t\t\t\t\t\"conditions are imposed on you (whether by court order, agreement or \"\n\t\t\t\t\t\"otherwise) that contradict the conditions of this License, they do not \"\n\t\t\t\t\t\"excuse you from the conditions of this License.  If you cannot \"\n\t\t\t\t\t\"distribute so as to satisfy simultaneously your obligations under this \"\n\t\t\t\t\t\"License and any other pertinent obligations, then as a consequence you \"\n\t\t\t\t\t\"may not distribute the Program at all.  For example, if a patent \"\n\t\t\t\t\t\"license would not permit royalty-free redistribution of the Program by \"\n\t\t\t\t\t\"all those who receive copies directly or indirectly through you, then \"\n\t\t\t\t\t\"the only way you could satisfy both it and this License would be to \"\n\t\t\t\t\t\"refrain entirely from distribution of the Program.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"If any portion of this section is held invalid or unenforceable under \"\n\t\t\t\t\t\"any particular circumstance, the balance of the section is intended to \"\n\t\t\t\t\t\"apply and the section as a whole is intended to apply in other \"\n\t\t\t\t\t\"circumstances.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"It is not the purpose of this section to induce you to infringe any \"\n\t\t\t\t\t\"patents or other property right claims or to contest validity of any \"\n\t\t\t\t\t\"such claims; this section has the sole purpose of protecting the \"\n\t\t\t\t\t\"integrity of the free software distribution system, which is \"\n\t\t\t\t\t\"implemented by public license practices.  Many people have made \"\n\t\t\t\t\t\"generous contributions to the wide range of software distributed \"\n\t\t\t\t\t\"through that system in reliance on consistent application of that \"\n\t\t\t\t\t\"system; it is up to the author/donor to decide if he or she is willing \"\n\t\t\t\t\t\"to distribute software through any other system and a licensee cannot \"\n\t\t\t\t\t\"impose that choice.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"This section is intended to make thoroughly clear what is believed to \"\n\t\t\t\t\t\"be a consequence of the rest of this License.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  8. If the distribution and/or use of the Program is restricted in \"\n\t\t\t\t\t\"certain countries either by patents or by copyrighted interfaces, the \"\n\t\t\t\t\t\"original copyright holder who places the Program under this License \"\n\t\t\t\t\t\"may add an explicit geographical distribution limitation excluding \"\n\t\t\t\t\t\"those countries, so that distribution is permitted only in or among \"\n\t\t\t\t\t\"countries not thus excluded.  In such case, this License incorporates \"\n\t\t\t\t\t\"the limitation as if written in the body of this License.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  9. The Free Software Foundation may publish revised and/or new versions \"\n\t\t\t\t\t\"of the General Public License from time to time.  Such new versions will \"\n\t\t\t\t\t\"be similar in spirit to the present version, but may differ in detail to \"\n\t\t\t\t\t\"address new problems or concerns.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"Each version is given a distinguishing version number.  If the Program \"\n\t\t\t\t\t\"specifies a version number of this License which applies to it and \\\"any \"\n\t\t\t\t\t\"later version\\\", you have the option of following the terms and conditions \"\n\t\t\t\t\t\"either of that version or of any later version published by the Free \"\n\t\t\t\t\t\"Software Foundation.  If the Program does not specify a version number of \"\n\t\t\t\t\t\"this License, you may choose any version ever published by the Free Software \"\n\t\t\t\t\t\"Foundation.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  10. If you wish to incorporate parts of the Program into other free \"\n\t\t\t\t\t\"programs whose distribution conditions are different, write to the author \"\n\t\t\t\t\t\"to ask for permission.  For software which is copyrighted by the Free \"\n\t\t\t\t\t\"Software Foundation, write to the Free Software Foundation; we sometimes \"\n\t\t\t\t\t\"make exceptions for this.  Our decision will be guided by the two goals \"\n\t\t\t\t\t\"of preserving the free status of all derivatives of our free software and \"\n\t\t\t\t\t\"of promoting the sharing and reuse of software generally.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t);\n\n\t\t\t\ttext_buffer->insert_with_tag(text_buffer->end(),\n\t\t\t\t\t\"NO WARRANTY\\n\"\n\t\t\t\t\t\"\\n\",\n\t\t\t\t\theading_tag);\n\n\t\t\t\ttext_buffer->insert(text_buffer->end(),\n\t\t\t\t\t\"  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY \"\n\t\t\t\t\t\"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN \"\n\t\t\t\t\t\"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES \"\n\t\t\t\t\t\"PROVIDE THE PROGRAM \\\"AS IS\\\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED \"\n\t\t\t\t\t\"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \"\n\t\t\t\t\t\"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS \"\n\t\t\t\t\t\"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE \"\n\t\t\t\t\t\"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, \"\n\t\t\t\t\t\"REPAIR OR CORRECTION.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t\"  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING \"\n\t\t\t\t\t\"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR \"\n\t\t\t\t\t\"REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, \"\n\t\t\t\t\t\"INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING \"\n\t\t\t\t\t\"OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED \"\n\t\t\t\t\t\"TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY \"\n\t\t\t\t\t\"YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER \"\n\t\t\t\t\t\"PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE \"\n\t\t\t\t\t\"POSSIBILITY OF SUCH DAMAGES.\\n\"\n\t\t\t\t\t\"\\n\"\n\t\t\t\t\t);\n\n\t\t\t\ttext_buffer->insert_with_tag(text_buffer->end(),\n\t\t\t\t\t\"END OF TERMS AND CONDITIONS\\n\",\n\t\t\t\t\theading_tag);\n\n\t\t\t\tGtk::ScrolledWindow* const scrolled_window = new Gtk::ScrolledWindow();\n\t\t\t\tscrolled_window->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);\n\t\t\t\tscrolled_window->add(*Gtk::manage(text_view));\n\n\t\t\t\tbox->pack_start(*Gtk::manage(scrolled_window), Gtk::PACK_EXPAND_WIDGET);\n\n\t\t\t\tnotebook->append_page(*Gtk::manage(box), \"License\");\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tGtk::VBox* const box = new Gtk::VBox(false, 10);\n\t\t\t\tbox->set_border_width(5);\n\n\t\t\t\tGtk::TextView* const text_view = new Gtk::TextView();\n\t\t\t\ttext_view->set_editable(false);\n\t\t\t\ttext_view->set_wrap_mode(Gtk::WRAP_WORD);\n\t\t\t\ttext_view->set_justification(Gtk::JUSTIFY_CENTER);\n\n\t\t\t\tGlib::RefPtr<Gtk::TextBuffer> text_buffer = text_view->get_buffer();\n\n\t\t\t\tGlib::RefPtr<Gtk::TextTag> category_tag = Gtk::TextTag::create(\"category\");\n\t\t\t\tcategory_tag->property_foreground() = \"#5555ff\";\n\t\t\t\tcategory_tag->property_scale() = 1.4;\n\t\t\t\ttext_buffer->get_tag_table()->add(category_tag);\n\n\t\t\t\tGlib::RefPtr<Gtk::TextTag> name_tag = Gtk::TextTag::create(\"name\");\n\t\t\t\tname_tag->property_foreground() = \"#000000\";\n\t\t\t\tname_tag->property_scale() = 1.2;\n\t\t\t\tname_tag->property_weight() = Pango::WEIGHT_BOLD;\n\t\t\t\ttext_buffer->get_tag_table()->add(name_tag);\n\n\t\t\t\tGlib::RefPtr<Gtk::TextTag> description_tag = Gtk::TextTag::create(\"description\");\n\t\t\t\tdescription_tag->property_foreground() = \"#555555\";\n\t\t\t\tdescription_tag->property_scale() = 0.8;\n\t\t\t\ttext_buffer->get_tag_table()->add(description_tag);\n\n\t\t\t\ttext_buffer->insert(text_buffer->end(), \"\\n\\n\\n\\n\");\n\t\t\t\tconst k3d::contributors_t& contributors = k3d::contributors();\n\t\t\t\tfor(k3d::contributors_t::const_iterator contributor = contributors.begin(); contributor != contributors.end(); ++contributor)\n\t\t\t\t{\n\t\t\t\t\tif(contributor->category.size())\n\t\t\t\t\t{\n\t\t\t\t\t\ttext_buffer->insert(text_buffer->end(), \"\\n\");\n\t\t\t\t\t\ttext_buffer->insert_with_tag(text_buffer->end(), contributor->category, category_tag);\n\t\t\t\t\t\ttext_buffer->insert(text_buffer->end(), \"\\n\\n\\n\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\ttext_buffer->insert_with_tag(text_buffer->end(), contributor->name.raw(), name_tag);\n\t\t\t\t\t\ttext_buffer->insert(text_buffer->end(), \"\\n\");\n\t\t\t\t\t\ttext_buffer->insert_with_tag(text_buffer->end(), contributor->description, description_tag);\n\t\t\t\t\t\ttext_buffer->insert(text_buffer->end(), \"\\n\\n\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttext_buffer->insert(text_buffer->end(), \"\\n\\n\\n\\n\");\n\t\t\t\n\t\t\t\tGtk::ScrolledWindow* const scrolled_window = new Gtk::ScrolledWindow();\n\t\t\t\tscrolled_window->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);\n\t\t\t\tscrolled_window->add(*Gtk::manage(text_view));\n\n\t\t\t\tbox->pack_start(*Gtk::manage(scrolled_window), Gtk::PACK_EXPAND_WIDGET);\n\n\t\t\t\tnotebook->append_page(*Gtk::manage(box), \"Credits\");\n\t\t\t}\n\t\t}\n\n\t\tGtk::HButtonBox* const button_box = new Gtk::HButtonBox(Gtk::BUTTONBOX_END);\n\t\tbutton_box->pack_start(*Gtk::manage(\n\t\t\tnew Gtk::Button(Gtk::Stock::CLOSE) << connect_button(sigc::mem_fun(*this, &dialog::close))\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tGtk::VBox* const box = new Gtk::VBox(false, 5);\n\t\tbox->set_border_width(5);\n\t\tbox->pack_start(*Gtk::manage(notebook), Gtk::PACK_EXPAND_WIDGET);\n\t\tbox->pack_start(*Gtk::manage(button_box));\n\n\t\tadd(*Gtk::manage(box));\n\n\t\tshow_all();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<dialog> factory(\n\t\t\tk3d::uuid(0xdf6588d0, 0xb8473152, 0xfe6e839b, 0x484b9694),\n\t\t\t\"NGUIAboutDialog\",\n\t\t\t_(\"Displays the current K-3D version and credits contributors\"),\n\t\t\t\"NGUI Dialog\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"dialog\"));\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace about\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::about::dialog::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_animation_timeline_panel/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-animation-timeline-panel)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-animation-timeline-panel)\n"
  },
  {
    "path": "modules/ngui_animation_timeline_panel/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Timeline panel that allows keyframe representation/manipulation. Buttons copied from old timeline.\n\t\t\\author Tim Shead (tshead@k-3d.com)\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n\n#include <k3dsdk/ngui/asynchronous_update.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/interactive.h>\n#include <k3dsdk/ngui/panel.h>\n#include <k3dsdk/ngui/utility.h>\n\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/ikeyframer.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/time_source.h>\n\n#include <gtkmm/adjustment.h>\n#include <gtkmm/box.h>\n#include <gtkmm/comboboxtext.h>\n#include <gtkmm/drawingarea.h>\n#include <gtkmm/image.h>\n#include <gtkmm/entry.h>\n#include <gtkmm/scrollbar.h>\n\n#include <gdkmm/colormap.h>\n#include <gdkmm/cursor.h>\n#include <gdkmm/window.h>\n\n#include <boost/assign/list_of.hpp>\n\n// Temporary hack\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace animation_timeline\n{\n\nnamespace detail\n{\n\n/// Custom timeline widget\nclass timeline : public Gtk::DrawingArea\n{\npublic:\n\ttypedef sigc::signal<void, double> time_changed_signal_t;\n\ttypedef sigc::signal<void, const std::string&, double> key_changed_signal_t;\n\t\n\ttimeline();\n\tvirtual ~timeline();\n\t\n\t/// Set start and end time\n\tvoid set_range(double Min, double Max)\n\t{\n\t\tm_tmin = Min;\n\t\tm_tmax = Max;\n\t}\n\t\n\t/// Set current time\n\tvoid set_time(double T);\n\t\n\t/// Add a keymarker at the specified time\n\tvoid add_key(const std::string& Name, double Time);\n\t\n\t/// Delete the named key\n\tvoid delete_key(const std::string& Name)\n\t{\n\t\tm_keys.erase(Name);\n\t}\n\t\n\t/// Remove all keys\n\tvoid clear_keys()\n\t{\n\t\tm_keys.clear();\n\t\tredraw();\n\t}\n\t\n\t/// Emitted when the timeline widget wants the time to change\n\ttime_changed_signal_t& time_changed_signal()\n\t{\n\t\treturn m_time_changed_signal;\n\t}\n\t\n\t/// Emitted when a key time was dragged\n\tkey_changed_signal_t& key_changed_signal()\n\t{\n\t\treturn m_key_changed_signal;\n\t}\n\nprotected:\n  //Overridden default signal handlers:\n  virtual void on_realize();\n  virtual bool on_expose_event(GdkEventExpose* event);\n  virtual bool on_button_press_event(GdkEventButton* Event);\n  virtual bool on_button_release_event(GdkEventButton* Event);\n  virtual bool on_motion_notify_event(GdkEventMotion* event);\n  \n  // draw key using specified colors\n  void draw_key(double Time, Gdk::Color& ArrowColor, Gdk::Color& LineColor);\n\t\n\tGlib::RefPtr<Gdk::GC> m_gc;\n  Gdk::Color m_blue;\n  Gdk::Color m_red;\n  Gdk::Color m_black;\n  Gdk::Color m_green;\n  Gdk::Color m_white;\n  \n  int m_barleft;\n  int m_bartop;\n  int m_barwidth;\n  int m_barheight;\n  int m_keyheight;\n  \n  double m_tmin;\n  double m_tmax;\n  double m_t;\n  \n  time_changed_signal_t m_time_changed_signal;\n  key_changed_signal_t m_key_changed_signal;\n  \n  bool m_timeline_click;\n  std::string m_clicked_key;\n  \n  Gdk::Cursor m_active_cursor;\n  \n private:\n \t// helper functions\n \tint to_w(double Time)\n \t{\n \t\treturn static_cast<int>(static_cast<double>(m_barwidth) * Time / (m_tmax - m_tmin));\n \t}\n \t\n \tdouble to_time(double x)\n \t{\n \t\treturn m_tmin + ((x - static_cast<double>(m_barleft))/static_cast<double>(m_barwidth)) * (m_tmax - m_tmin);\n \t}\n \t\n \tvoid redraw();\n \t\n \t/// True if (x,y) is on the timeline\n \tbool hit_timeline(double x, double y);\n \t\n \ttypedef std::map<std::string, double> keys_t;\n \t\n \t/// True if a key was hit\n \tkeys_t::iterator hit_key(double x, double y);\n \t\n \t/// Set the cursor, based on the given position\n \tvoid set_cursor(double x, double y);\n \t\n \tkeys_t m_keys; \n};\n\ntimeline::timeline() :\n\tm_active_cursor(Gdk::TCROSS)\n{\n\tm_keyheight = 5;\n\t\n\tGlib::RefPtr<Gdk::Colormap> colormap = get_default_colormap();\n\n  m_blue = Gdk::Color(\"blue\");\n  m_red = Gdk::Color(\"red\");\n  m_black = Gdk::Color(\"black\");\n  m_green = Gdk::Color(\"green\");\n  m_white = Gdk::Color(\"white\");\n\n  colormap->alloc_color(m_blue);\n  colormap->alloc_color(m_red);\n  colormap->alloc_color(m_black);\n  colormap->alloc_color(m_green);\n  colormap->alloc_color(m_white);\n  \n  m_timeline_click = false;\n  m_clicked_key = \"\";\n\n  add_events(Gdk::EXPOSURE_MASK);\n  add_events(Gdk::BUTTON_PRESS_MASK);\n  add_events(Gdk::BUTTON_MOTION_MASK);\n  add_events(Gdk::BUTTON_RELEASE_MASK);\n  add_events(Gdk::POINTER_MOTION_MASK);\n}\n\ntimeline::~timeline()\n{\n}\n\nvoid timeline::set_time(double T)\n{\n\tif(!(T >= m_tmin && T <= m_tmax))\n\t\treturn;\n\tm_t = T;\n\t\n\tredraw();\n}\n\nvoid timeline::add_key(const std::string& Name, double Time)\n{\n\tm_keys[Name] = Time;\n\tredraw();\n}\n\nvoid timeline::draw_key(double Time, Gdk::Color& ArrowColor, Gdk::Color& LineColor)\n{\n\tGlib::RefPtr<Gdk::Window> window = get_window();\n  \n  // window geometry: x, y, width, height, depth\n  int winx, winy, winw, winh, wind;\n  window->get_geometry(winx, winy, winw, winh, wind);\n  \n  int x = m_barleft + to_w(Time);\n  int arrow_size = m_keyheight;\n  \n  std::vector<Gdk::Point> vec3;\n  vec3.push_back(Gdk::Point(x, m_bartop));\n  vec3.push_back(Gdk::Point(x-1, m_bartop));\n  vec3.push_back(Gdk::Point(x-arrow_size,m_bartop-arrow_size));\n  vec3.push_back(Gdk::Point(x+arrow_size,m_bartop-arrow_size));\n\t\n\tm_gc->set_foreground(ArrowColor);\n  window->draw_polygon(m_gc, true, vec3);\n  m_gc->set_foreground(LineColor);\n  window->draw_line(m_gc, x, m_bartop, x, m_bartop+m_barheight-1);\n}\n\nvoid timeline::on_realize()\n{\n  // We need to call the base on_realize()\n  Gtk::DrawingArea::on_realize();\n\n  // Now we can allocate any additional resources we need\n  Glib::RefPtr<Gdk::Window> window = get_window();\n\n  m_gc = Gdk::GC::create(window);\n\n  //window->set_background(black_);\n  //window->clear();\n\n  m_gc->set_foreground(m_blue);\n}\n\nbool timeline::on_expose_event(GdkEventExpose*)\n{\n  Glib::RefPtr<Gdk::Window> window = get_window();\n  \n  // window geometry: x, y, width, height, depth\n  int winx, winy, winw, winh, wind;\n  window->get_geometry(winx, winy, winw, winh, wind);\n\n  window->clear();\n  \n  m_barleft = 5;\n  m_bartop = 10;\n  m_barwidth = winw-10;\n  m_barheight = 5;\n  \n  set_time(m_t);\n  \n  return true;\n}\n\nbool timeline::on_button_press_event(GdkEventButton* Event)\n{\n\tdouble x = Event->x;\n\tdouble y = Event->y;\n\t// If the click happened in the timebar, set the time\n\tif (hit_timeline(x, y))\n\t{\n\t\tdouble time = to_time(x);\n\t\tm_time_changed_signal.emit(time);\n\t\tm_timeline_click = true;\n\t}\n\telse\n\t{\n\t\tkeys_t::iterator key = hit_key(x, y);\n\t\tif (key != m_keys.end())\n\t\t{\n\t\t\tm_time_changed_signal.emit(key->second);\n\t\t\tm_clicked_key = key->first;\n\t\t}\n\t}\t\n\treturn true;\n}\n\nbool timeline::on_button_release_event(GdkEventButton* Event)\n{\n\tm_timeline_click = false;\n\tm_clicked_key = \"\";\n\tset_cursor(Event->x, Event->y);\n\treturn true;\n}\n\nbool timeline::on_motion_notify_event(GdkEventMotion* event)\n{\n\tif (m_timeline_click)\n\t{\n\t\tdouble new_time = to_time(event->x);\n\t\tif (new_time >= m_tmin && new_time <= m_tmax)\n\t\t\tm_time_changed_signal.emit(new_time);\n\t}\n\telse\n\t{\n\t\tkeys_t::iterator key = m_keys.find(m_clicked_key);\n\t\tif (key != m_keys.end())\n\t\t{\n\t\t\tdouble new_time = to_time(event->x);\n\t\t\tif (new_time >= m_tmin && new_time <= m_tmax)\n\t\t\t{\n\t\t\t\tm_t = new_time;\n\t\t\t\tm_key_changed_signal.emit(key->first, new_time);\n\t\t\t\tm_time_changed_signal.emit(new_time);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{ // No click, but set cursor to indicate key and timeline clickability\n\t\t\tset_cursor(event->x, event->y);\n\t\t}\n\t}\n\treturn true;\n}\n\nvoid timeline::redraw()\n{\n\tGlib::RefPtr<Gdk::Window> window = get_window();\n\t\n\tif (!window)\n\t\treturn;\n\t\n\twindow->clear();\n\t\n\t// Draw the timeline\n\tint timewidth = to_w(m_t);\n\tm_gc->set_foreground(m_red);\n\twindow->draw_rectangle(m_gc, true, m_barleft, m_bartop, timewidth, m_barheight);\n\tm_gc->set_foreground(m_blue);\n\twindow->draw_rectangle(m_gc, true, m_barleft+timewidth, m_bartop, m_barwidth-timewidth, m_barheight);\n\tm_gc->set_foreground(m_black);\n\twindow->draw_line(m_gc, m_barleft-1, m_bartop, m_barleft-1, m_bartop+m_barheight-1);\n\twindow->draw_line(m_gc, m_barleft-1, m_bartop-1, m_barleft+m_barwidth, m_bartop-1);\n\tm_gc->set_foreground(m_white);\n\twindow->draw_line(m_gc, m_barleft+m_barwidth, m_bartop, m_barleft+m_barwidth, m_bartop+m_barheight-1);\n\twindow->draw_line(m_gc, m_barleft-1, m_bartop+m_barheight, m_barleft+m_barwidth, m_bartop+m_barheight);\n\t\n\t// Show the keys\n\tfor (keys_t::iterator key = m_keys.begin(); key != m_keys.end(); ++key)\n\t{\n\t\tif (key->second != m_t)\n\t\t{\n\t\t\tdraw_key(key->second, m_black, m_black);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdraw_key(key->second, m_green, m_green);\n\t\t}\n\t}\n}\n\nbool timeline::hit_timeline(double x, double y)\n{\n\tif (y >= m_bartop && y <= m_bartop + m_barheight)\n\t{\n\t\tif (x >= m_barleft && x <= m_barleft + m_barwidth)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\ntimeline::keys_t::iterator timeline::hit_key(double x, double y)\n{\n\tif (y >= m_bartop - m_keyheight && y <= m_bartop) // Check if a key was clicked\n\t{\n\t\tdouble d = m_bartop - y;\n\t\tfor (keys_t::iterator key = m_keys.begin(); key != m_keys.end(); ++key)\n\t\t{\n\t\t\tif (std::abs(x-(m_barleft + to_w(key->second))) <= d)\n\t\t\t{\n\t\t\t\treturn key;\n\t\t\t}\n\t\t}\n\t}\n\treturn m_keys.end();\n}\n\nvoid timeline::set_cursor(double x, double y)\n{\n\tGlib::RefPtr<Gdk::Window> window = get_window();\n\tif (hit_timeline(x, y) || hit_key(x, y) != m_keys.end())\n\t{\n\t\twindow->set_cursor(m_active_cursor);\n\t}\n\telse\n\t{\n\t\twindow->set_cursor();\n\t}\n}\n\nclass implementation :\n\tpublic k3d::ngui::asynchronous_update,\n\tpublic k3d::property_collection\n{\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tk3d::property_collection(),\n\t\tm_document_state(DocumentState),\n\t\tm_no_track(\"Select Track...\"),\n\t\tm_rewind(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"rewind\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_loop_reverse_play(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"reverse_play_loop\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_reverse_play(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"reverse_play\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_stop(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"stop\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_play(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"play\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_loop_play(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"play_loop\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_fast_forward(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"fast_forward\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_playback_mode(init_name(\"playback_mode\") + init_label(_(\"Playback Mode\")) + init_description(_(\"When on, plays animation\")) + init_value(STOP))\n\t{\n\t\tm_frame_label.set_editable(false);\n\t\tm_frame_label.set_width_chars(5);\n\t\t\n\t\tm_container.pack_start(m_track_selector, Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(m_timeline, Gtk::PACK_EXPAND_WIDGET);\n\t\tm_container.pack_start(m_frame_label, Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_rewind), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_loop_reverse_play), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_reverse_play), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_stop), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_play), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_loop_play), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_fast_forward), Gtk::PACK_SHRINK);\n\t\tm_container.show_all();\n\t\t\n\t\tm_document_state.document().nodes().add_nodes_signal().connect(sigc::mem_fun(*this, &implementation::on_nodes_added));\n\t\tm_document_state.document().nodes().remove_nodes_signal().connect(sigc::mem_fun(*this, &implementation::on_nodes_removed));\n\t\t\n\t\tm_timeline.time_changed_signal().connect(sigc::mem_fun(*this, &implementation::on_set_time));\n\t\tm_timeline.key_changed_signal().connect(sigc::mem_fun(*this, &implementation::on_move_key));\n\t\t\n\t\tm_track_selector.signal_changed().connect(sigc::mem_fun(*this, &implementation::update_keys));\n\t\t\n\t\tm_rewind->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_rewind));\n\t\tm_loop_reverse_play->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_loop_reverse_play));\n\t\tm_reverse_play->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_reverse_play));\n\t\tm_stop->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_stop));\n\t\tm_play->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_play));\n\t\tm_loop_play->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_loop_play));\n\t\tm_fast_forward->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_fast_forward));\n\n\t\tm_playback_mode.changed_signal().connect(sigc::mem_fun(*this, &implementation::on_playback_mode_changed));\n\t\t\n\t\treset_time_properties();\n\t\tupdate_track_list();\n\t\t\n\t\ton_time_changed(0);\n\t\t\n\t\tschedule_update();\n\t}\n\n\t/// Called by the signal system anytime new nodes are added to the document\n\tvoid on_nodes_added(const k3d::inode_collection::nodes_t& Nodes)\n\t{\n\t\treset_time_properties();\n\t\tupdate_track_list();\n\t}\n\n\t/// Called by the signal system anytime nodes are removed from the document\n\tvoid on_nodes_removed(const k3d::inode_collection::nodes_t& Nodes)\n\t{\n\t\treset_time_properties();\n\t\tupdate_track_list();\n\t}\n\n\tvoid on_update()\n\t{\n\t\treturn_if_fail(m_start_time && m_end_time && m_time);\n\n\t\tconst double start_time = boost::any_cast<double>(m_start_time->property_internal_value());\n\t\tconst double end_time = boost::any_cast<double>(m_end_time->property_internal_value());\n\t\tconst double time = boost::any_cast<double>(m_time->property_internal_value());\n\t\t\n\t\tm_timeline.set_range(start_time, end_time);\n\t\tm_timeline.set_time(time);\n\t}\n\t\n\tvoid on_start_time_changed(k3d::ihint*)\n\t{\n\t\tschedule_update();\n\t}\n\n\tvoid on_end_time_changed(k3d::ihint*)\n\t{\n\t\tschedule_update();\n\t}\n\t\n\tvoid on_frame_rate_changed(k3d::ihint*)\n\t{\n\t\tschedule_update();\n\t}\n\t\n\tvoid on_time_changed(k3d::ihint*)\n\t{\n\t\treturn_if_fail(m_time && m_frame_rate);\n\t\tconst double frame_rate = boost::any_cast<double>(m_frame_rate->property_internal_value());\n\t\tconst double time = boost::any_cast<double>(m_time->property_internal_value());\n\t\tm_frame_label.set_text(k3d::string_cast(k3d::round(time * frame_rate)));\n\t\tschedule_update();\n\t}\n\t\n\tvoid on_set_time(double Time)\n\t{\n\t\tif (m_writable_time)\n\t\t\tm_writable_time->property_set_value(Time);\n\t}\n\t\n\tvoid on_keytime_changed(k3d::ihint* Hint, k3d::iproperty* Property)\n\t{\n\t\tm_timeline.delete_key(Property->property_label());\n\t\tm_timeline.add_key(Property->property_label(), k3d::property::pipeline_value<double>(*Property));\n\t}\n\t\n\tvoid on_move_key(const std::string& Key, double Time)\n\t{\n\t\tk3d::property::set_internal_value(*m_keys[Key], Time);\n\t}\n\t\n\tvoid reset_time_properties()\n\t{\n\t\tm_start_time = 0;\n\t\tm_end_time = 0;\n\t\tm_time = 0;\n\t\tm_writable_time = 0;\n\n\t\tm_start_time_changed_connection.disconnect();\n\t\tm_end_time_changed_connection.disconnect();\n\t\tm_time_changed_connection.disconnect();\n\n\t\tm_start_time = k3d::get_start_time(m_document_state.document());\n\t\tif(m_start_time)\n\t\t\tm_start_time_changed_connection = m_start_time->property_changed_signal().connect(sigc::mem_fun(*this, &implementation::on_start_time_changed));\n\n\t\tm_end_time = k3d::get_end_time(m_document_state.document());\n\t\tif(m_end_time)\n\t\t\tm_end_time_changed_connection = m_end_time->property_changed_signal().connect(sigc::mem_fun(*this, &implementation::on_end_time_changed));\n\t\t\t\n\t\tm_frame_rate = k3d::get_frame_rate(m_document_state.document());\n\t\tif(m_frame_rate)\n\t\t\tm_frame_rate_changed_connection = m_frame_rate->property_changed_signal().connect(sigc::mem_fun(*this, &implementation::on_frame_rate_changed));\n\n\t\tm_time = k3d::get_time(m_document_state.document());\n\t\tif(m_time)\n\t\t\tm_time_changed_connection = m_time->property_changed_signal().connect(sigc::mem_fun(*this, &implementation::on_time_changed));\n\n\t\tm_writable_time = dynamic_cast<k3d::iwritable_property*>(m_time);\n\t\t\n\t\tconst bool enabled = m_start_time && m_end_time && m_frame_rate && m_time && m_writable_time;\n\t\t\n\t\tm_rewind->set_sensitive(enabled);\n\t\tm_loop_reverse_play->set_sensitive(enabled);\n\t\tm_reverse_play->set_sensitive(enabled);\n\t\tm_stop->set_sensitive(enabled);\n\t\tm_play->set_sensitive(enabled);\n\t\tm_loop_play->set_sensitive(enabled);\n\t\tm_fast_forward->set_sensitive(enabled);\n\t}\n\t\n\ttypedef std::map<std::string, k3d::ikeyframer*> tracks_t;\n\t\n\tvoid update_track_list()\n\t{\n\t\tstd::string selection = m_track_selector.get_active_text();\n\t\tif (selection == \"\")\n\t\t\tselection = m_no_track;\n\t\tm_track_selector.clear_items();\n\t\tm_tracks.clear();\n\t\tm_track_selector.append_text(m_no_track);\n\t\tconst k3d::inode_collection::nodes_t& nodes = m_document_state.document().nodes().collection();\n\t\tfor (k3d::inode_collection::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\tk3d::ikeyframer* keyframer = dynamic_cast<k3d::ikeyframer*>(*node);\n\t\t\tif (keyframer)\n\t\t\t{\n\t\t\t\tm_track_selector.append_text((*node)->name());\n\t\t\t\tm_tracks[(*node)->name()] = keyframer;\n\t\t\t}\n\t\t}\n\t\tif (m_tracks.find(selection) == m_tracks.end()) // Display tooltip if the old selection was removed\n\t\t\tselection = m_no_track;\n\t\tm_track_selector.set_active_text(selection);\n\t\tupdate_keys();\n\t}\n\t\n\tvoid update_keys()\n\t{\n\t\tfor (size_t i = 0; i != m_connections.size(); ++i)\n\t\t\tm_connections[i].disconnect();\n\t\tm_keys_changed_connection.disconnect();\n\t\tm_connections.clear();\n\t\tm_keys.clear();\n\t\tm_timeline.clear_keys();\n\t\ttracks_t::iterator track_it = m_tracks.find(m_track_selector.get_active_text());\n\t\tif (track_it != m_tracks.end())\n\t\t{\n\t\t\tk3d::ikeyframer* track = track_it->second;\n\t\t\tm_keys_changed_connection = track->keys_changed_signal().connect(sigc::mem_fun(*this, &implementation::update_keys));\n\t\t\tk3d::ikeyframer::keys_t keys = track->get_keys();\n\t\t\tfor (k3d::ikeyframer::keys_t::iterator key = keys.begin(); key != keys.end(); ++key)\n\t\t\t{\n\t\t\t\tk3d::iproperty* prop = *key;\n\t\t\t\tm_timeline.add_key(prop->property_label(), k3d::property::pipeline_value<double>(*prop));\n\t\t\t\tm_keys[prop->property_label()] = prop;\n\t\t\t\tm_connections.push_back(prop->property_changed_signal().connect(sigc::bind(sigc::mem_fun(*this, &implementation::on_keytime_changed), prop)));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid on_rewind()\n\t{\n\t\tm_playback_mode.set_value(STOP);\n\n\t\treturn_if_fail(m_start_time && m_writable_time);\n\t\tconst double start_time = boost::any_cast<double>(m_start_time->property_internal_value());\n\n\t\tm_writable_time->property_set_value(start_time);\n\t}\n\n\tvoid on_loop_reverse_play()\n\t{\n\t\tm_playback_mode.set_value(LOOP_REVERSE_PLAY);\n\t}\n\n\tvoid on_reverse_play()\n\t{\n\t\tm_playback_mode.set_value(REVERSE_PLAY);\n\t}\n\n\tvoid on_stop()\n\t{\n\t\tm_playback_mode.set_value(STOP);\n\t}\n\n\tvoid on_play()\n\t{\n\t\tm_playback_mode.set_value(PLAY);\n\t}\n\n\tvoid on_loop_play()\n\t{\n\t\tm_playback_mode.set_value(LOOP_PLAY);\n\t}\n\n\tvoid on_fast_forward()\n\t{\n\t\tm_playback_mode.set_value(STOP);\n\n\t\treturn_if_fail(m_frame_rate && m_end_time && m_writable_time);\n\n\t\tconst double end_time = boost::any_cast<double>(m_end_time->property_internal_value());\n\t\tconst double frame_rate = boost::any_cast<double>(m_frame_rate->property_internal_value());\n\t\treturn_if_fail(frame_rate);\n\t\tconst double frame_length = 1.0 / frame_rate;\n\n\t\tm_writable_time->property_set_value(end_time - frame_length);\n\t}\n\n\tvoid on_playback_mode_changed(k3d::ihint*)\n\t{\n\t\tswitch(m_playback_mode.internal_value())\n\t\t{\n\t\t\tcase LOOP_REVERSE_PLAY:\n\t\t\tcase REVERSE_PLAY:\n\t\t\tcase PLAY:\n\t\t\tcase LOOP_PLAY:\n\t\t\t\tif(!m_playback_connection.connected())\n\t\t\t\t\tm_playback_connection = Glib::signal_idle().connect(sigc::mem_fun(*this, &implementation::on_playback_handler));\n\t\t\t\treturn;\n\t\t\tcase STOP:\n\t\t\t\tm_playback_connection.disconnect();\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tbool on_playback_handler()\n\t{\n\t\ton_next_frame();\n\t\treturn true;\n\t}\n\n\tvoid on_next_frame()\n\t{\n\t\tk3d::iwritable_property* const writable_time = dynamic_cast<k3d::iwritable_property*>(m_time);\n\t\treturn_if_fail(m_start_time && m_end_time && m_frame_rate && m_time && writable_time);\n\n\t\tconst double start_time = boost::any_cast<double>(m_start_time->property_internal_value());\n\t\tconst double end_time = boost::any_cast<double>(m_end_time->property_internal_value());\n\t\tconst double frame_rate = boost::any_cast<double>(m_frame_rate->property_internal_value());\n\t\tconst double time = boost::any_cast<double>(m_time->property_internal_value());\n\n\t\treturn_if_fail(frame_rate != 0.0);\n\t\tconst double frame_length = 1.0 / frame_rate;\n\n\t\tswitch(m_playback_mode.internal_value())\n\t\t{\n\t\t\tcase LOOP_REVERSE_PLAY:\n\t\t\t{\n\t\t\t\tdouble new_time = time - frame_length;\n\t\t\t\tif(new_time <= start_time)\n\t\t\t\t\tnew_time = end_time - frame_length;\n\t\t\t\twritable_time->property_set_value(new_time);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase REVERSE_PLAY:\n\t\t\t{\n\t\t\t\tconst double new_time = time - frame_length;\n\t\t\t\tif(new_time <= start_time)\n\t\t\t\t{\n\t\t\t\t\twritable_time->property_set_value(start_time);\n\t\t\t\t\tm_playback_mode.set_value(STOP);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\twritable_time->property_set_value(new_time);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase PLAY:\n\t\t\t{\n\t\t\t\tconst double new_time = time + frame_length;\n\t\t\t\tif(new_time >= (end_time - frame_length))\n\t\t\t\t{\n\t\t\t\t\twritable_time->property_set_value(end_time - frame_length);\n\t\t\t\t\tm_playback_mode.set_value(STOP);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\twritable_time->property_set_value(new_time);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase LOOP_PLAY:\n\t\t\t{\n\t\t\t\tdouble new_time = time + frame_length;\n\t\t\t\tif(new_time >= (end_time - frame_length))\n\t\t\t\t\tnew_time = start_time;\n\t\t\t\twritable_time->property_set_value(new_time);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase STOP:\n\t\t\t\treturn;\n\t\t}\n\n\t\tassert_not_reached();\n\t}\n\n\t/// Enumerates animation playback modes\n\ttypedef enum\n\t{\n\t\tLOOP_REVERSE_PLAY,\n\t\tREVERSE_PLAY,\n\t\tSTOP,\n\t\tPLAY,\n\t\tLOOP_PLAY\n\t} playback_t;\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const playback_t& RHS)\n\t{\n\t\tswitch(RHS)\n\t\t{\n\t\t\tcase LOOP_REVERSE_PLAY:\n\t\t\t\tStream << \"loop_reverse_play\";\n\t\t\t\tbreak;\n\t\t\tcase REVERSE_PLAY:\n\t\t\t\tStream << \"reverse_play\";\n\t\t\t\tbreak;\n\t\t\tcase STOP:\n\t\t\t\tStream << \"stop\";\n\t\t\t\tbreak;\n\t\t\tcase PLAY:\n\t\t\t\tStream << \"play\";\n\t\t\t\tbreak;\n\t\t\tcase LOOP_PLAY:\n\t\t\t\tStream << \"loop_play\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tassert_warning(0);\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, playback_t& RHS)\n\t{\n\t\tstd::string temp;\n\t\tStream >> temp;\n\n\t\tif(temp == \"loop_reverse_play\")\n\t\t\tRHS = LOOP_REVERSE_PLAY;\n\t\telse if(temp == \"reverse_play\")\n\t\t\tRHS = REVERSE_PLAY;\n\t\telse if(temp == \"stop\")\n\t\t\tRHS = STOP;\n\t\telse if(temp == \"play\")\n\t\t\tRHS = PLAY;\n\t\telse if(temp == \"loop_play\")\n\t\t\tRHS = LOOP_PLAY;\n\n\t\treturn Stream;\n\t}\n\n\tGtk::HBox m_container;\n\t\n\tdocument_state& m_document_state;\n\ttimeline m_timeline;\n\t\n\tk3d::iproperty* m_start_time;\n\tsigc::connection m_start_time_changed_connection;\n\n\tk3d::iproperty* m_end_time;\n\tsigc::connection m_end_time_changed_connection;\n\t\n\tk3d::iproperty* m_frame_rate;\n\tsigc::connection m_frame_rate_changed_connection;\n\n\tk3d::iproperty* m_time;\n\tsigc::connection m_time_changed_connection;\n\tk3d::iwritable_property* m_writable_time;\n\t\n\tGtk::ComboBoxText m_track_selector;\n\tstd::string m_no_track;\n\ttracks_t m_tracks;\n\t\n\tstd::vector<sigc::connection> m_connections;\n\tstd::map<std::string, k3d::iproperty*> m_keys;\n\tsigc::connection m_keys_changed_connection;\n\n\tGtk::Entry m_frame_label;\n\tGtk::Button* const m_rewind;\n\tGtk::Button* const m_loop_reverse_play;\n\tGtk::Button* const m_reverse_play;\n\tGtk::Button* const m_stop;\n\tGtk::Button* const m_play;\n\tGtk::Button* const m_loop_play;\n\tGtk::Button* const m_fast_forward;\n\t\n\tk3d_data(playback_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_playback_mode;\n\tsigc::connection m_playback_connection;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// panel\n\nclass panel :\n\tpublic k3d::ngui::panel::control,\n\tpublic Gtk::VBox\n{\n\ttypedef Gtk::VBox base;\n\npublic:\n\tpanel() :\n\t\tbase(false, 0),\n\t\tm_implementation(0)\n\t{\n\t}\n\n\t~panel()\n\t{\n\t\tdelete m_implementation;\n\t}\n\n\tvoid initialize(document_state& DocumentState)\n\t{\n\t\tm_implementation = new detail::implementation(DocumentState);\n\t\t\n\t\tpack_start(m_implementation->m_container, Gtk::PACK_EXPAND_WIDGET);\n\t\tshow_all();\n\t}\n\n\tconst k3d::string_t panel_type()\n\t{\n\t\treturn get_factory().name();\n\t}\n\n\tsigc::connection connect_focus_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn sigc::connection();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<panel> factory(\n\t\t\tk3d::uuid(0xd6ddc369, 0x674697b8, 0xb7e6fd81, 0xd42aed12),\n\t\t\t\"NGUIAnimationTimelinePanel\",\n\t\t\t_(\"Provides a panel for manipulating the current animation time\"),\n\t\t\t\"NGUI Panel\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"panel\")(\"ngui:panel-label\", \"Animation Timeline\"));\n\n\t\treturn factory;\n\t}\nprivate:\n\tdetail::implementation* m_implementation;\n};\n\n} // namespace animation_timeline\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::animation_timeline::panel::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_assign_hotkeys/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-assign-hotkeys)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-assign-hotkeys)\n"
  },
  {
    "path": "modules/ngui_assign_hotkeys/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/ngui/application_state.h>\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/widget_manip.h>\n#include <k3dsdk/module.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/buttonbox.h>\n#include <gtkmm/label.h>\n#include <gtkmm/settings.h>\n#include <gtkmm/stock.h>\n\n#include <boost/assign/list_of.hpp>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace assign_hotkeys\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dialog\n\nclass dialog :\n\tpublic application_window,\n\tpublic k3d::iunknown\n{\n\ttypedef application_window base;\npublic:\n\tdialog()\n\t{\n\t\tis_open = true;\n\n\t\tset_title(_(\"Assign Hotkeys:\"));\n\t\tset_role(\"assign_hotkeys\");\n\t\tset_keep_above(true);\n\n\t\tGtk::HButtonBox* const box2 = new Gtk::HButtonBox(Gtk::BUTTONBOX_END);\n\t\tbox2->pack_start(*Gtk::manage(\n\t\t\tnew Gtk::Button(Gtk::Stock::CLOSE)\n\t\t\t<< connect_button(sigc::mem_fun(*this, &dialog::close))\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tGtk::VBox* const box1 = new Gtk::VBox(false, 10);\n\t\tbox1->set_border_width(10);\n\t\tbox1->pack_start(*Gtk::manage(new Gtk::Label() << line_wrap() << center_justify() << set_markup(_(\"<big><b>Assign Hotkeys Mode</b></big>\"))));\n\t\tbox1->pack_start(*Gtk::manage(new Gtk::Label(_(\"To assign hotkeys, hover the mouse over a menu item, and hit the desired hotkey combination.  Use \\\"delete\\\" to remove hotkeys.  Close this window to turn-off Assign Hotkeys Mode.\")) << line_wrap() << center_justify()));\n\t\tbox1->pack_start(*Gtk::manage(box2));\n\n\t\tadd(*Gtk::manage(box1));\n\n\t\tshow_all();\n\n\t\tapplication_state::instance().enable_hotkey_assignment(true);\n\n\t\tGtk::Settings::get_default()->property_gtk_can_change_accels() = true;\n\t}\n\n\t~dialog()\n\t{\n\t\tGtk::Settings::get_default()->property_gtk_can_change_accels() = false;\n\n\t\tapplication_state::instance().enable_hotkey_assignment(false);\n\t\tis_open = false;\n\t}\n\n\tstatic bool is_open;\n\n\t/// Provides a custom plugin factory for creating assign_hotkeys::dialog instances\n\tclass plugin_factory :\n\t\tpublic k3d::plugin_factory,\n\t\tpublic k3d::iapplication_plugin_factory\n\t{\n\tpublic:\n\t\tplugin_factory() :\n\t\t\tk3d::plugin_factory(k3d::uuid(0x5924a92d, 0x664e6000, 0xaa69218f, 0x6cbc7e5c),\n\t\t\t\t\"NGUIAssignHotkeysDialog\",\n\t\t\t\t_(\"Provides a user-interface for assigning menu hotkeys.\"),\n\t\t\t\t\"NGUI Dialog\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"dialog\"))\n\t\t{\n\t\t}\n\n\t\tvirtual k3d::iunknown* create_plugin()\n\t\t{\n\t\t\tif(dialog::is_open)\n\t\t\t\treturn 0;\n\n\t\t\treturn new dialog();\n\t\t}\n\n\t\tbool implements(const std::type_info& InterfaceType)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst interfaces_t interfaces()\n\t\t{\n\t\t\treturn interfaces_t();\n\t\t}\n\t};\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic dialog::plugin_factory factory;\n\t\treturn factory;\n\t}\n};\n\nbool dialog::is_open = false;\n\n} // namespace assign_hotkeys\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::assign_hotkeys::dialog::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_atk_event_recorder/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-atk-event-recorder)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-atk-event-recorder)\n"
  },
  {
    "path": "modules/ngui_atk_event_recorder/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/gzstream.h>\n#include <k3dsdk/idocument_sink.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/mime_types.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/scripting.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/type_registry.h>\n\n#include <atkmm/object.h>\n\n#include <gtkmm/action.h>\n#include <gtkmm/actiongroup.h>\n#include <gtkmm/box.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/stock.h>\n#include <gtkmm/textbuffer.h>\n#include <gtkmm/textview.h>\n#include <gtkmm/toggleaction.h>\n#include <gtkmm/uimanager.h>\n\n#include <gtk/gtk.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/assign/list_of.hpp>\n#include <stack>\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace atk_event_recorder\n{\n\nnamespace detail\n{\n\nconst k3d::string_t script_name(const k3d::string_t& Name)\n{\n\treturn boost::replace_all_copy(Name, \" \", \"_\");\n}\n\n/// Returns the index in a \"per role\" array of children, for the given child number of the parent Object\nconst k3d::uint_t get_index_in_role(AtkObject* Object)\n{\n\tconst k3d::uint_t index_in_parent = atk_object_get_index_in_parent(Object);\n\tconst AtkRole role = atk_object_get_role(Object);\n\tAtkObject* parent = atk_object_get_parent(Object);\n\treturn_val_if_fail(parent, 0);\n\tk3d::uint_t result = 0;\n\tfor(k3d::uint_t i = 0; i != index_in_parent; ++i)\n\t{\n\t\tif(atk_object_get_role(atk_object_ref_accessible_child(parent, i)) == role)\n\t\t\t++result;\n\t}\n\treturn result;\n}\n\n} // namespace detail\n\nclass dialog :\n\tpublic k3d::ngui::application_window,\n\tpublic k3d::idocument_sink\n{\n\ttypedef k3d::ngui::application_window base;\npublic:\n\tdialog() : m_document(0),\n\t\tm_running(false),\n\t\tm_saving(false),\n\t\tm_recording(false),\n\t\tm_view(new Gtk::TextView())\n\t{\n\t\t// Set up the UI\n\t\tm_actions = Gtk::ActionGroup::create();\n\n\t\tm_actions->add(Gtk::Action::create(\"file\", _(\"_File\")));\n\t\tm_actions->add(Gtk::Action::create(\"new\", Gtk::Stock::NEW), sigc::mem_fun(*this, &dialog::on_new));\n\t\tm_actions->add(Gtk::Action::create(\"open\", Gtk::Stock::OPEN), sigc::mem_fun(*this, &dialog::on_open));\n\t\tm_actions->add(Gtk::ToggleAction::create(\"record\", Gtk::Stock::MEDIA_RECORD, _(\"Record\"), _(\"Toggle the recording of actions\"), false), sigc::mem_fun(*this, &dialog::on_record_toggle));\n\t\tm_actions->add(Gtk::Action::create(\"save\", Gtk::Stock::SAVE), sigc::mem_fun(*this, &dialog::on_save));\n\t\tm_actions->add(Gtk::Action::create(\"save_as\", Gtk::Stock::SAVE_AS), sigc::hide_return(sigc::mem_fun(*this, &dialog::on_save_as)));\n\t\tm_actions->add(Gtk::Action::create(\"revert\", Gtk::Stock::REVERT_TO_SAVED), sigc::mem_fun(*this, &dialog::on_revert));\n\t\tm_actions->add(Gtk::Action::create(\"close\", Gtk::Stock::CLOSE), sigc::mem_fun(*this, &dialog::close));\n\t\tm_actions->add(Gtk::Action::create(\"edit\", _(\"_Edit\")));\n\t\tm_actions->add(Gtk::Action::create(\"execute\", Gtk::Stock::EXECUTE), sigc::mem_fun(*this, &dialog::on_execute));\n\n\t\tm_ui_manager = Gtk::UIManager::create();\n\t\tm_ui_manager->insert_action_group(m_actions);\n\t\tadd_accel_group(m_ui_manager->get_accel_group());\n\n\t\tm_ui_manager->add_ui_from_string(\n\t\t\t\"<ui>\"\n\t\t\t\"  <menubar name='menubar'>\"\n\t\t\t\"    <menu action='file'>\"\n\t\t\t\"      <menuitem action='new'/>\"\n\t\t\t\"      <menuitem action='open'/>\"\n\t\t\t\"      <menuitem action='record'/>\"\n\t\t\t\"      <menuitem action='save'/>\"\n\t\t\t\"      <menuitem action='save_as'/>\"\n\t\t\t\"      <menuitem action='revert'/>\"\n\t\t\t\"      <separator/>\"\n\t\t\t\"      <menuitem action='close'/>\"\n\t\t\t\"    </menu>\"\n\t\t\t\"    <menu action='edit'>\"\n\t\t\t\"      <menuitem action='execute'/>\"\n\t\t\t\"    </menu>\"\n\t\t\t\"  </menubar>\"\n\t\t\t\"  <toolbar name='toolbar'>\"\n\t\t\t\"    <toolitem action='new'/>\"\n\t\t\t\"    <toolitem action='open'/>\"\n\t\t\t\"    <toolitem action='save'/>\"\n\t\t\t\"    <separator/>\"\n\t\t\t\"    <toolitem action='execute'/>\"\n\t\t\t\"    <toolitem action='record'/>\"\n\t\t\t\"  </toolbar>\"\n\t\t\t\"</ui>\"\n\t\t\t);\n\n\t\tGtk::ScrolledWindow* const scrolled_window = new Gtk::ScrolledWindow();\n\t\tscrolled_window->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\t\tscrolled_window->add(*Gtk::manage(m_view));\n\n\t\tm_cursor_position.set_alignment(Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER);\n\n\t\tGtk::VBox* const vbox1 = new Gtk::VBox(false);\n\t\tvbox1->pack_start(*manage(m_ui_manager->get_widget(\"/menubar\")), Gtk::PACK_SHRINK);\n\t\tvbox1->pack_start(*manage(m_ui_manager->get_widget(\"/toolbar\")), Gtk::PACK_SHRINK);\n\t\tvbox1->pack_start(*manage(scrolled_window), Gtk::PACK_EXPAND_WIDGET);\n\t\tvbox1->pack_start(m_cursor_position, Gtk::PACK_SHRINK);\n\n\t\tadd(*Gtk::manage(vbox1));\n\t\tset_role(get_factory().name());\n\t\tresize(600, 300);\n\n\t\tupdate_title();\n\t\tupdate_widgets();\n\t\tshow_all();\n\n\t\tm_view->get_buffer()->signal_changed().connect(sigc::mem_fun(*this, &dialog::update_title));\n\n\t\tshow_all();\n\n\t\tappend_line(\"#python\");\n\t\tappend_line(\"import k3d\");\n\t\tappend_line(\"\");\n\n\t\tk3d::log() << info << \"Listening to \" << atk_get_toolkit_name() << \" \" << atk_get_toolkit_version() << std::endl;\n\n\t\tadd_event_listeners();\n\t\tm_record_connection = action_recorded_signal().connect(sigc::mem_fun(*this, &dialog::on_action_recorded));\n\t}\n\n\t~dialog()\n\t{\n\t\tm_record_connection.disconnect();\n\t}\n\n\tvoid set_document(k3d::idocument* const Document)\n\t{\n\t\tm_document = Document;\n\t}\n\n\t/// Appends the given text, followed by a newline\n\tvoid append_line(const k3d::string_t Text)\n\t{\n\t\tGlib::RefPtr<Gtk::TextBuffer> buffer = m_view->get_buffer();\n\t\tbuffer->insert(buffer->end(), Text);\n\t\tbuffer->insert(buffer->end(), \"\\n\");\n\t\tbuffer->place_cursor(buffer->end());\n\t\tm_view->scroll_to(buffer->get_insert());\n\t}\n\n\tvoid set_text(const k3d::string_t& Text)\n\t{\n\t\tm_view->get_buffer()->set_text(Text);\n\t\tm_view->get_buffer()->set_modified(false);\n\t}\n\n\tvoid set_text(const k3d::filesystem::path& Path)\n\t{\n\t\tk3d::filesystem::igzstream stream(Path);\n\t\tstd::stringstream text;\n\t        stream.get(*text.rdbuf(), '\\0');\n\n\t\tm_view->get_buffer()->set_text(text.str().c_str());\n\t\tm_view->get_buffer()->set_modified(false);\n\t}\n\n\tvoid set_path(const k3d::filesystem::path& Path)\n\t{\n\t\tm_path = Path;\n\t\tupdate_title();\n\t}\n\n\tvoid on_new()\n\t{\n//\t\tif(!save_changes())\n//\t\t\treturn;\n\n\t\tset_text(\"\");\n\t\tupdate_title();\n\t}\n\n\tvoid on_open()\n\t{\n\t\tk3d::filesystem::path filepath;\n\t\t{\n\t\t\tk3d::ngui::file_chooser_dialog dialog(_(\"Open File:\"), k3d::options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_OPEN);\n\t\t\tif(!dialog.get_file_path(filepath))\n\t\t\t\treturn;\n\t\t}\n\n\t\tset_text(filepath);\n\t\tset_path(filepath);\n\t}\n\n\tvoid on_record_toggle()\n\t{\n\t\tm_recording = !m_recording;\n\t}\n\n\tvoid on_save()\n\t{\n\t\tif(m_path.empty())\n\t\t{\n\t\t\ton_save_as();\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::filesystem::ofstream stream(m_path);\n\t\tstream << m_view->get_buffer()->get_text();\n\n\t\tm_view->get_buffer()->set_modified(false);\n\t\tupdate_title();\n\t}\n\n\tbool on_save_as()\n\t{\n\t\tm_saving = true;\n\t\t{\n\t\t\tk3d::ngui::file_chooser_dialog dialog(_(\"Save Script As::\"), k3d::options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\t\tif(!dialog.get_file_path(m_path))\n\t\t\t{\n\t\t\t\tm_saving = false;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tk3d::filesystem::ofstream stream(m_path);\n\t\tstream << m_view->get_buffer()->get_text();\n\n\t\tm_view->get_buffer()->set_modified(false);\n\t\tset_path(m_path);\n\n\t\tm_saving = false;\n\t\treturn true;\n\t}\n\n\tvoid on_revert()\n\t{\n\t\tif(m_path.empty())\n\t\t{\n\t\t\tset_text(\"\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tset_text(m_path);\n\t\t}\n\t}\n\n\tvoid on_execute()\n\t{\n\t\tconst k3d::script::code code(m_view->get_buffer()->get_text());\n\t\tconst k3d::mime::type mime_type = k3d::mime::type::lookup(code.source());\n\n\t\tif(mime_type.empty())\n\t\t{\n\t\t\tk3d::ngui::error_message(\n\t\t\t\t_(\"Unknown script language\"),\n\t\t\t\t_(\"Could not identify the MIME-type for this script. \"\n\t\t\t\t\" K-3D supports multiple scripting languages, and the MIME-type is used to \"\n\t\t\t\t\"match scripts to the correct script engines. \"\n\t\t\t\t\"You can add a \\\"magic token\\\" at the beginning of a script to \"\n\t\t\t\t\"force identification of its MIME-type - for example, add \\\"#python\\\" at the \"\n\t\t\t\t\"beginning of a Python script.\"\n\t\t\t\t));\n\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::string_t name = get_title();\n\n\t\tk3d::iscript_engine::context context;\n\t\tif(m_document)\n\t\t\tcontext[\"document\"] = m_document;\n\n\t\tm_running = true;\n\t\tupdate_title();\n\n\t\tk3d::ngui::execute_script(code, name, context);\n\n\t\tm_running = false;\n\t\tupdate_title();\n\t}\n\n\tvoid update_title()\n\t{\n\t\tk3d::string_t title;\n\n\t\tif(!m_path.empty())\n\t\t{\n\t\t\ttitle = m_path.leaf().raw();\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttitle = _(\"Untitled\");\n\t\t}\n\n\t\tif(m_view->get_buffer()->get_modified())\n\t\t\ttitle += _(\" [changed]\");\n\n\t\tif(m_running)\n\t\t\ttitle += _(\" [running]\");\n\n\t\tset_title(title);\n\t}\n\n\tvoid update_widgets()\n\t{\n\t\tm_actions->get_action(\"new\")->set_visible(true);\n\t\tm_actions->get_action(\"open\")->set_visible(true);\n\t\tm_actions->get_action(\"save\")->set_visible(true);\n\t\tm_actions->get_action(\"save_as\")->set_visible(true);\n\t\tm_actions->get_action(\"revert\")->set_visible(true);\n\t\tm_actions->get_action(\"execute\")->set_visible(true);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<dialog> factory(\n\t\t\tk3d::uuid(0xc8ac6ef4, 0xce48212a, 0xed0006b2, 0x8f29e761),\n\t\t\t\"NGUIATKEventRecorderDialog\",\n\t\t\t_(\"Sends a stream of ATK user interface events to stderr, primarily intended for troubleshooting\"),\n\t\t\t\"NGUI Dialog\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"dialog\")\n\t\t\t);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttypedef std::stack<Glib::RefPtr<Atk::Object> > click_trace_t;\n\n\t// Make sure we only listen once for events\n\tstatic void add_event_listeners()\n\t{\n\t\tstatic bool events_added = false;\n\t\tif(!events_added)\n\t\t{\n\t\t\tatk_add_global_event_listener(click_event_listener, \"Gtk:GtkButton:clicked\");\n\t\t\tatk_add_global_event_listener(click_event_listener, \"Gtk:GtkMenuItem:activate\");\n\t\t\tevents_added = true;\n\t\t}\n\t}\n\n\tstatic gboolean click_event_listener(GSignalInvocationHint* signal_hint, guint n_param_values, const GValue* param_values, gpointer data)\n\t{\n\t\tAtkObject* root = atk_get_root();\n\t\tGlib::RefPtr<Atk::Object> object;\n\t\tif(GTK_IS_WIDGET(g_value_get_object(param_values)))\n\t\t{\n\t\t\tGtk::Widget* widget = Glib::wrap(GTK_WIDGET(g_value_get_object(param_values)));\n\t\t\tobject = widget->get_accessible();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tobject = Glib::wrap(ATK_OBJECT(g_value_get_object(param_values)), true);\n\t\t}\n\t\treturn_val_if_fail(object, true);\n\t\tk3d::bool_t click_found = false;\n\t\tif(ATK_IS_ACTION(object->gobj()))\n\t\t{\n\t\t\tAtkAction* action = ATK_ACTION(object->gobj());\n\t\t\tfor(k3d::uint_t i = 0; i != atk_action_get_n_actions(action); ++i)\n\t\t\t{\n\t\t\t\tif(std::string(atk_action_get_name(action, i)) == \"click\")\n\t\t\t\t\tclick_found = true;\n\t\t\t}\n\t\t}\n\t\treturn_val_if_fail(click_found, true);\n\t\tclick_trace_t click_trace;\n\t\twhile(object && object->get_index_in_parent() > -1)\n\t\t{\n\t\t\tclick_trace.push(object);\n\t\t\tobject = object->get_parent();\n\t\t}\n\t\taction_recorded_signal().emit(click_trace, \"click\");\n\t\treturn true;\n\t}\n\n\tvoid on_action_recorded(click_trace_t& Trace, const k3d::string_t& ActionName)\n\t{\n\t\tif(!m_recording)\n\t\t\treturn;\n\t\tif(Trace.empty())\n\t\t\treturn;\n\t\tif(m_running)\n\t\t\treturn;\n\t\tif(m_saving)\n\t\t\treturn;\n\t\tGlib::RefPtr<Atk::Object> self = this->get_accessible();\n\t\tstd::stringstream line;\n\t\tline << \"k3d.atk.root()\";\n\t\twhile(!Trace.empty())\n\t\t{\n\t\t\tGlib::RefPtr<Atk::Object> obj = Trace.top();\n\t\t\tif(obj == self) // skip recording actions on ourself\n\t\t\t\treturn;\n\t\t\tline << \".\" << detail::script_name(atk_role_get_name(atk_object_get_role(obj->gobj())));\n\t\t\tif(obj->get_name() == \"\")\n\t\t\t\tline << \"(\" << detail::get_index_in_role(obj->gobj()) << \")\";\n\t\t\telse\n\t\t\t\tline << \"(\\\"\" << obj->get_name() << \"\\\")\";\n\t\t\tTrace.pop();\n\t\t}\n\t\tline << \".\" << ActionName << \"()\";\n\t\tappend_line(line.str());\n\t}\n\n\t/// (Optional) document for the current text (could be NULL)\n\tk3d::idocument* m_document;\n\t/// (Optional) file path source for the current text (could be empty)\n\tk3d::filesystem::path m_path;\n\t/// Set to true iff script playback is in progress\n\tbool m_running, m_saving, m_recording;\n\n\t// Menu items\n\tGlib::RefPtr<Gtk::ActionGroup> m_actions;\n\tGlib::RefPtr<Gtk::UIManager> m_ui_manager;\n\t/// Storage and editing for the current text\n\tGtk::TextView* const m_view;\n\t/// Displays cursor position\n\tGtk::Label m_cursor_position;\n\n\t// Needed to pass the atk event to an object, since we need to connect to a static function\n\ttypedef sigc::signal<void, click_trace_t&, const k3d::string_t&> action_recorded_t;\n\tstatic action_recorded_t& action_recorded_signal()\n\t{\n\t\tstatic action_recorded_t action_recorded;\n\t\treturn action_recorded;\n\t}\n\n\tsigc::connection m_record_connection;\n};\n\n} // namespace atk_event_recorder\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::atk_event_recorder::dialog::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_knot_vector_control/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-knot-vector-control)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-knot-vector-control)\n"
  },
  {
    "path": "modules/ngui_knot_vector_control/control.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/custom_property_control.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/entry.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/type_registry.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/spinbutton.h>\n\n#include <boost/assign/list_of.hpp>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace knot_vector\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a custom property-control for NURBS knot-vectors\nclass control :\n\tpublic k3d::ngui::custom_property::control,\n\tpublic k3d::iunknown,\n\tpublic Gtk::VBox\n{\npublic:\n\tcontrol() :\n\t\tGtk::VBox()\n\t{\n\t}\n\n\t~control()\n\t{\n\t}\n\n\t/// Implementation of entry::imodel for use with knot vectors\n\tclass knot_vector_model :\n\t\tpublic entry::imodel\n\t{\n\tpublic:\n\t\tknot_vector_model(k3d::iproperty& Data) :\n\t\t\tm_readable_data(Data),\n\t\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Data))\n\t\t{\n\t\t}\n\n\t\tconst Glib::ustring label()\n\t\t{\n\t\t\tGlib::ustring result = m_readable_data.property_label();\n\n\t\t\tif(m_readable_data.property_node())\n\t\t\t\tresult = m_readable_data.property_node()->name() + \" \" + result;\n\n\t\t\treturn result;\n\t\t}\n\n\t\tconst k3d::string_t value()\n\t\t{\n\t\t\tconst std::type_info& type = m_readable_data.property_type();\n\n\t\t\tif(type == typeid(k3d::mesh::knots_t))\n\t\t\t{\n\t\t\t\tconst k3d::mesh::knots_t knots = boost::any_cast<k3d::mesh::knots_t>(m_readable_data.property_internal_value());\n\n\t\t\t\tstd::ostringstream buffer;\n\t\t\t\tstd::copy(knots.begin(), knots.end(), std::ostream_iterator<double>(buffer, \" \"));\n\n\t\t\t\treturn buffer.str();\n\t\t\t}\n\t\t\t\n\t\t\tk3d::log() << error << k3d_file_reference << \": unsupported property type: \" << k3d::demangle(type) << std::endl;\n\t\t\treturn k3d::string_t();\n\t\t}\n\n\t\tvoid set_value(const k3d::string_t& Value)\n\t\t{\n\t\t\treturn_if_fail(m_writable_data);\n\n\t\t\tconst std::type_info& type = m_readable_data.property_type();\n\n\t\t\tif(type == typeid(k3d::mesh::knots_t))\n\t\t\t{\n\t\t\t\tdouble knot;\n\t\t\t\tk3d::mesh::knots_t knots;\n\t\t\t\tstd::istringstream buffer(Value);\n\t\t\t\tfor(buffer >> knot; buffer; buffer >> knot)\n\t\t\t\t\tknots.push_back(knot);\n\n\t\t\t\tm_writable_data->property_set_value(knots);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tk3d::log() << error << k3d_file_reference << \": unsupported property type: \" << k3d::demangle(type) << std::endl;\n\t\t}\n\n\t\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t\t{\n\t\t\treturn m_readable_data.property_changed_signal().connect(sigc::hide(Slot));\n\t\t}\n\n\tprivate:\n\t\tk3d::iproperty& m_readable_data;\n\t\tk3d::iwritable_property* const m_writable_data;\n\t};\n\n\tvoid initialize(document_state& DocumentState, k3d::iproperty& Property)\n\t{\n\t\tentry::control* const control = new entry::control(new knot_vector_model(Property), &DocumentState.document().state_recorder());\n\t\tpack_start(*Gtk::manage(control), Gtk::PACK_EXPAND_WIDGET);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<control> factory(\n\t\t\tk3d::uuid(0xade18285, 0x9a4333fc, 0x7449f382, 0x39628d15),\n\t\t\t\"NGUIKnotVectorControl\",\n\t\t\t_(\"Provides a custom property control for NURBS knot vectors.\"),\n\t\t\t\"NGUI Control\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"property-control\")(\"ngui:property-role\", k3d::metadata::value::nurbs_knot_vector_role().c_str()));\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace knot_vector\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::knot_vector::control::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_learning/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-learning)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-learning)\n"
  },
  {
    "path": "modules/ngui_learning/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gzstream.h>\n#include <k3dsdk/mime_types.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/document.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/options.h>\n#include <k3dsdk/ngui/scripting.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/widget_manip.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/xml.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/buttonbox.h>\n#include <gtkmm/checkbutton.h>\n#include <gtkmm/label.h>\n#include <gtkmm/liststore.h>\n#include <gtkmm/messagedialog.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/stock.h>\n#include <gtkmm/treeview.h>\n\n#include <boost/scoped_ptr.hpp>\n#include <boost/assign/list_of.hpp>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace learning\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dialog\n\n/// Provides a menu of demonstration documents\nclass dialog :\n\tpublic k3d::ngui::application_window,\n\tpublic k3d::iunknown\n{\n\ttypedef k3d::ngui::application_window base;\n\npublic:\n\tdialog() :\n\t\tm_show_at_startup(_(\"Show examples at startup\"))\n\t{\n\t\tload_examples();\n\n\t\tset_title(_(\"K-3D Tutorials and Examples\"));\n\t\tset_role(\"learning_menu\");\n\t\tset_border_width(10);\n\t\tresize(300, 470);\n\t\tset_position(Gtk::WIN_POS_CENTER);\n\n\t\tGtk::HButtonBox* const box2 = Gtk::manage(new Gtk::HButtonBox(Gtk::BUTTONBOX_END));\n\t\tbox2->pack_start(*Gtk::manage(\n\t\t\tnew Gtk::Button(Gtk::Stock::CLOSE) <<\n\t\t\tconnect_button(sigc::mem_fun(*this, &dialog::close))));\n\n\t\tGtk::TreeView* const example_list = Gtk::manage(new Gtk::TreeView(m_example_store));\n\t\texample_list->set_headers_visible(false);\n\t\texample_list->append_column(\"Example Documents\", m_columns.label);\n\t\texample_list->signal_row_activated().connect(sigc::mem_fun(*this, &dialog::on_open_example));\n\t\tGtk::ScrolledWindow* const example_window = Gtk::manage(new Gtk::ScrolledWindow());\n\t\texample_window->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\t\texample_window->add(*example_list);\n\n\t\tm_show_at_startup.set_active(options::nag(\"show_learning_menu\"));\n\t\tm_show_at_startup.signal_toggled().connect(sigc::mem_fun(*this, &dialog::on_show_at_startup));\n\n\t\tGtk::VBox* const box1 = Gtk::manage(new Gtk::VBox(false, 10));\n\t\tbox1->pack_start(*Gtk::manage(new Gtk::Label() << set_markup(_(\"<big><b>Welcome to K-3D!</b></big>\"))), Gtk::PACK_SHRINK);\n\t\tbox1->pack_start(*Gtk::manage(new Gtk::Label(_(\"Below are example documents you can\\nuse to become familiar with K-3D.\"))), Gtk::PACK_SHRINK);\n\t\tbox1->pack_start(*Gtk::manage(new Gtk::Label(_(\"Double-click to open an example document:\"))), Gtk::PACK_SHRINK);\n\t\tbox1->pack_start(*example_window, Gtk::PACK_EXPAND_WIDGET);\n\t\tbox1->pack_start(m_show_at_startup, Gtk::PACK_SHRINK);\n\t\tbox1->pack_start(*box2, Gtk::PACK_SHRINK);\n\n\t\tadd(*box1);\n\n\t\tshow_all();\n\t}\n\n\ttemplate<class PredicateT>\n\tvoid load_resources(Glib::RefPtr<Gtk::ListStore>& ResourceModel, const k3d::filesystem::path& ResourcePath, const k3d::string_t& ContainerTag, const k3d::string_t& ResourceTag, PredicateT Predicate)\n\t{\n\t\tResourceModel = Gtk::ListStore::create(m_columns);\n\n\t\tconst k3d::filesystem::path index_path = ResourcePath / k3d::filesystem::generic_path(\"index.k3d\");\n\n\t\tif(!k3d::filesystem::exists(index_path))\n\t\t{\n\t\t\tk3d::log() << error << \"Learning resource index file [\" << index_path.native_console_string() << \"] does not exist\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\t// Load the index file as XML ...\n\t\tk3d::xml::element index(\"k3dml\");\n\t\tk3d::filesystem::ifstream stream(index_path);\n\t\tstream >> index;\n\n\t\t// Get the set of indexed resources ...\n\t\tk3d::xml::element* const xml_application = k3d::xml::find_element(index, \"application\");\n\t\tif(!xml_application)\n\t\t\treturn;\n\n\t\tk3d::xml::element* const xml_resources = k3d::xml::find_element(*xml_application, ContainerTag);\n\t\tif(!xml_resources)\n\t\t\treturn;\n\n\t\tunsigned long resource_number = 0;\n\t\tfor(k3d::xml::element::elements_t::const_iterator xml_resource = xml_resources->children.begin(); xml_resource != xml_resources->children.end(); ++xml_resource)\n\t\t{\n\t\t\tif(xml_resource->name != ResourceTag)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::string_t xml_title = k3d::xml::attribute_text(*xml_resource, \"title\");\n\t\t\tif(xml_title.empty())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Learning resource without title attribute will be ignored\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst k3d::string_t xml_path = k3d::xml::attribute_text(*xml_resource, \"path\");\n\t\t\tif(xml_path.empty())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Learning resource without path attribute will be ignored\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst k3d::xml::element* const xml_description = k3d::xml::find_element(*xml_resource, \"description\");\n\n\t\t\tconst k3d::filesystem::path resource_path = ResourcePath / k3d::filesystem::native_path(k3d::ustring::from_utf8(xml_path));\n\t\t\tif(!k3d::filesystem::exists(resource_path))\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Learning resource [\" << resource_path.native_console_string() << \"] does not exist\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(!Predicate(resource_path))\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst k3d::string_t label = k3d::string_cast(++resource_number) + \". \" + xml_title;\n\n\t\t\tGtk::TreeRow row = *ResourceModel->append();\n\t\t\trow[m_columns.title] = xml_title;\n\t\t\trow[m_columns.description] = xml_description ? xml_description->text : k3d::string_t();\n\t\t\trow[m_columns.path] = resource_path;\n\t\t\trow[m_columns.label] = label;\n\t\t}\n\t}\n\n\tclass test_examples\n\t{\n\tpublic:\n\t\tconst bool operator()(const k3d::filesystem::path& Path) const\n\t\t{\n\t\t\tconst k3d::mime::type mime_type = k3d::mime::type::lookup(Path);\n\t\t\tif(mime_type.empty())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Example [\" << Path.native_console_string() << \"] does not match a known MIME type\" << std::endl;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup(mime_type);\n\t\t\tif(factories.empty())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"No plugins available to process example [\" << Path.native_console_string() << \"] with MIME type [\" << mime_type.str() << \"]\" << std::endl;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tvoid load_examples()\n\t{\n\t\tload_resources(m_example_store, k3d::share_path() / k3d::filesystem::generic_path(\"documents\"), \"examples\", \"example\", test_examples());\n\t}\n\n\tvoid on_open_example(const Gtk::TreePath& Path, Gtk::TreeViewColumn* Column)\n\t{\n\t\t// Get the row that was activated ...\n\t\tGtk::TreeRow row = *m_example_store->get_iter(Path);\n\n\t\t// Look-up the path to the actual example document ...\n\t\tconst Glib::ustring title = row[m_columns.title];\n\t\tconst Glib::ustring description = row[m_columns.description];\n\t\tconst k3d::filesystem::path path = row[m_columns.path];\n\n\t\t// (Optionally) display a description of the document ...\n\t\tif(!description.empty())\n\t\t{\n\t\t\tconst k3d::string_t message = k3d::string_cast(boost::format(_(\"Open example document \\\"%1%\\\"?\")) % title);\n\n\t\t\tGtk::MessageDialog dialog(*this, \"\", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO);\n\t\t\tdialog.set_message(message);\n\t\t\tdialog.set_secondary_text(description);\n\n\t\t\tdialog.set_default_response(Gtk::RESPONSE_YES);\n\n\t\t\tif(dialog.run() != Gtk::RESPONSE_YES)\n\t\t\t\treturn;\n\t\t}\n\n\t\thide();\n\t\tclose();\n\t\thandle_pending_events();\n\n\t\topen_document(path);\n\t}\n\n\tvoid on_show_at_startup()\n\t{\n\t\toptions::enable_nag(\"show_learning_menu\", m_show_at_startup.get_active());\n\t\tk3d::options::commit();\n\t}\n\n\tclass resource_columns :\n\t\tpublic Gtk::TreeModelColumnRecord\n\t{\n\tpublic:\n\t\tresource_columns()\n\t\t{\n\t\t\tadd(title);\n\t\t\tadd(description);\n\t\t\tadd(path);\n\t\t\tadd(label);\n\t\t}\n\n\t\tGtk::TreeModelColumn<Glib::ustring> title;\n\t\tGtk::TreeModelColumn<Glib::ustring> description;\n\t\tGtk::TreeModelColumn<k3d::filesystem::path> path;\n\t\tGtk::TreeModelColumn<Glib::ustring> label;\n\t};\n\n\tresource_columns m_columns;\n\tGlib::RefPtr<Gtk::ListStore> m_example_store;\n\tGtk::CheckButton m_show_at_startup;\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<dialog> factory(\n\t\t\tk3d::uuid(0xd7d79750, 0x344aa731, 0xbeb2a198, 0x739e0cfe),\n\t\t\t\"NGUILearningDialog\",\n\t\t\t_(\"Displays a menu containing sample documents\"),\n\t\t\t\"NGUI Dialog\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"dialog\"));\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace learning\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::learning::dialog::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_log/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-log)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-log)\n"
  },
  {
    "path": "modules/ngui_log/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/log_control.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/ngui/console.h>\n\n#include <gtkmm/texttag.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace log\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dialog\n\n/// Provides a window for viewing the contents of the K-3D log\nclass dialog :\n\tpublic k3d::ngui::application_window,\n\tpublic k3d::iunknown\n{\n\ttypedef k3d::ngui::application_window base;\n\npublic:\n\tdialog() :\n\t\tconsole(Gtk::manage(new k3d::ngui::console::control()))\n\t{\n\t\tcritical_tag = Gtk::TextTag::create(\"critical\");\n\t\tcritical_tag->property_foreground() = \"#ff0000\";\n\t\tcritical_tag->property_weight() = Pango::WEIGHT_BOLD;\n\n\t\terror_tag = Gtk::TextTag::create(\"error\");\n\t\terror_tag->property_foreground() = \"#ff0000\";\n\n\t\twarning_tag = Gtk::TextTag::create(\"warning\");\n\t\twarning_tag->property_foreground() = \"#ff8000\";\n\n\t\tdebug_tag = Gtk::TextTag::create(\"debug\");\n\t\tdebug_tag->property_foreground() = \"#00bb00\";\n\n\t\tset_title(_(\"K-3D Log Window\"));\n\t\tset_role(\"log_window\");\n\t\tset_border_width(0);\n\t\tresize(800, 400);\n\t\tset_position(Gtk::WIN_POS_CENTER);\n\n\t\tadd(*console);\n\n\t\tk3d::get_log_cache(sigc::mem_fun(*this, &dialog::on_log_message));\n\t\tk3d::connect_log_message(sigc::mem_fun(*this, &dialog::on_log_message));\n\n\t\tshow_all();\n\t}\n\n\tvoid on_log_message(const time_t Timestamp, const k3d::log_level_t Level, const std::string& Message)\n\t{\n\t\tstd::string timestamp(256, '\\0');\n\t\ttimestamp.resize(strftime(&timestamp[0], timestamp.size(), \"%m/%d/%Y %H:%M:%S \", localtime(&Timestamp)));\n\t\tconsole->set_current_format(default_tag);\n\t\tconsole->print_string(timestamp);\n\n\t\tswitch(Level)\n\t\t{\n\t\tcase k3d::K3D_LOG_LEVEL_CRITICAL:\n\t\t\tconsole->set_current_format(critical_tag);\n\t\t\tbreak;\n\t\tcase k3d::K3D_LOG_LEVEL_ERROR:\n\t\t\tconsole->set_current_format(error_tag);\n\t\t\tbreak;\n\t\tcase k3d::K3D_LOG_LEVEL_WARNING:\n\t\t\tconsole->set_current_format(warning_tag);\n\t\t\tbreak;\n\t\tcase k3d::K3D_LOG_LEVEL_INFO:\n\t\t\tconsole->set_current_format(default_tag);\n\t\t\tbreak;\n\t\tcase k3d::K3D_LOG_LEVEL_DEBUG:\n\t\t\tconsole->set_current_format(debug_tag);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole->set_current_format(default_tag);\n\t\t\tbreak;\n\t\t}\n\n\t\tswitch(Level)\n\t\t{\n\t\tcase k3d::K3D_LOG_LEVEL_CRITICAL:\n\t\t\tconsole->print_string(\"CRITICAL: \");\n\t\t\tbreak;\n\t\tcase k3d::K3D_LOG_LEVEL_ERROR:\n\t\t\tconsole->print_string(\"ERROR: \");\n\t\t\tbreak;\n\t\tcase k3d::K3D_LOG_LEVEL_WARNING:\n\t\t\tconsole->print_string(\"WARNING: \");\n\t\t\tbreak;\n\t\tcase k3d::K3D_LOG_LEVEL_INFO:\n\t\t\tconsole->print_string(\"INFO: \");\n\t\t\tbreak;\n\t\tcase k3d::K3D_LOG_LEVEL_DEBUG:\n\t\t\tconsole->print_string(\"DEBUG: \");\n\t\t\tbreak;\n\t\t}\n\n\t\tconsole->print_string(Message);\n\t}\n\n\tk3d::ngui::console::control* const console;\n\tGlib::RefPtr<Gtk::TextTag> critical_tag;\n\tGlib::RefPtr<Gtk::TextTag> error_tag;\n\tGlib::RefPtr<Gtk::TextTag> warning_tag;\n\tGlib::RefPtr<Gtk::TextTag> debug_tag;\n\tGlib::RefPtr<Gtk::TextTag> default_tag;\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<dialog> factory(\n\t\t\tk3d::uuid(0xe552df91, 0x264b17ad, 0x6e65cd9d, 0x208bdfe7),\n\t\t\t\"NGUILogDialog\",\n\t\t\t_(\"Displays the contents of the K-3D log\"),\n\t\t\t\"NGUI Dialog\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"dialog\"));\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace log\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::log::dialog::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-material-manager-panel)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-material-manager-panel)\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/ContentPanel.cpp",
    "content": "#include \"ContentPanel.h\"\n#include <k3dsdk/inode_collection_sink.h>\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\n// bool ContentPanel::checkDocForMeta(const k3d::string_t meta_tag, \n//                                    const k3d::string_t meta_data, \n//                                    k3d::inode **node_ptr)\n// {\n//   //Iterate Through Document. If A Node Has Meta Data & Matches, Pass To node_ptr\n//   k3d::inode_collection::nodes_t::const_iterator node \n//     = m_document_state->document().nodes().collection().begin();\n\n//   for(; node != m_document_state->document().nodes().collection().end(); ++node)\n//     {\n//       if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(*node))\n//         {\n//           k3d::string_t value = metadata->get_metadata()[meta_tag];\n          \n//           if(value == meta_data)\n//             {\n//               //There Is A Match!\n//               *node_ptr = *node;\n//               return true;\n//             }\n//         }//if\n//     }//for\n\n//   //No Match Found\n//   node_ptr = 0;\n//   return false;\n\n// }//checkDocForMeta\n\n\n\nvoid ContentPanel::createPreviewNodes()\n{\n  //Flags For Each Node\n  bool hasAqsis_renderer = \tfalse;\n  bool hasCamera = \t\t\t\tfalse;\n  bool hasGeoSphere = \t\t  \tfalse;\n  bool hasGeoCube = \t\t \t \tfalse;\n  bool hasGeoTorus = \t\t  \tfalse;\n  bool hasLight = \t\t\t\tfalse;\n  bool hasLightFill = \t\t\tfalse;\n  bool hasLightBack = \t\t\tfalse;\n  bool hasLight_shader = \t\tfalse;\n  bool hasLightFill_shader = \tfalse;\n  bool hasRenderman_engine = \tfalse;\n\n\n  //Meta Data Strings\n  k3d::string_t aqsis_render_meta \t= \"p_aqsis_renderer\";\n  k3d::string_t camera_meta \t\t\t= \"p_camera\";\n\n  // k3d::string_t sphere_geo_meta \t\t= \"p_sphere_geo\";\n//   k3d::string_t cube_geo_meta \t\t= \"p_cube_geo\";\n//   k3d::string_t torus_geo_meta \t\t= \"p_torus_geo\";\n\n  k3d::string_t key_light_meta \t\t= \"p_light\";\n  k3d::string_t fill_light_meta \t\t= \"p_fill_light\";\n  k3d::string_t back_light_meta \t\t= \"p_back_light\";\n\n  k3d::string_t key_bck_lshade_meta = \"p_light_shader\";\n  k3d::string_t fill_lshade_meta \t= \"p_fill_light_shader\";\n  \n  k3d::string_t rman_engine_meta   \t= \"p_rman_engine\";\n\n  k3d::string_t nametag_metatag \t\t= \"PreviewCore::nametag\";\n\n  //Pointer To Aqsis Engine For RMAN Engine Node\n  k3d::ri::irender_engine* aqsis = 0;\n  k3d::string_t pointLightPath = \"shaders/light/k3d_pointlight.sl\";\n\n  //Check Nodes MetaData To See If These Nodes Exist.\n  //If They Do Dont Exist Then Create New Nodes\n\n  k3d::inode *node_ptr = 0;\n  \n  //Check For Aqsis Engine\n  if(checkDocForMeta(nametag_metatag, aqsis_render_meta, &node_ptr, m_document_state))\n    {\n      hasAqsis_renderer = true;\n      if(node_ptr)\n        aqsis = dynamic_cast<k3d::ri::irender_engine*>(node_ptr);\n\n    }\n\n  //Check For Camera\n  node_ptr = 0;\n  if(checkDocForMeta(nametag_metatag, camera_meta, &node_ptr, m_document_state))\n    {\n       hasCamera = true;\n       if(node_ptr)\n         m_camera = dynamic_cast<camera_t*>(node_ptr);\n    }\n\n                                     \n  //Check For Geometry**********************************************************\n\n  //Check For Sphere Geometry\n  node_ptr = 0;\n  if(checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::sphere_md, &node_ptr, m_document_state))\n    {\n      hasGeoSphere = true;\n      if(node_ptr)\n        m_geometry = dynamic_cast<geo_t*>(node_ptr);\n    }\n\n  //Check For Cube Geometry\n  node_ptr = 0;\n  if(checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::cube_md, &node_ptr, m_document_state))\n    {\n      hasGeoCube = true;\n      if(node_ptr)\n        m_geometry = dynamic_cast<geo_t*>(node_ptr);\n    }\n\n  //Check For Torus Geometry\n  node_ptr = 0;\n  if(checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::torus_md, &node_ptr, m_document_state))\n    {\n      hasGeoTorus = true;\n      if(node_ptr)\n        m_geometry = dynamic_cast<geo_t*>(node_ptr);\n    }\n\n  //****************************************************************************\n\n\n  //Check For Main Key Light\n  node_ptr = 0;\n  if(checkDocForMeta(nametag_metatag, key_light_meta, &node_ptr, m_document_state))\n    {\n      hasLight = true;\n      if(node_ptr)\n        m_main_light = dynamic_cast<light_t*>(node_ptr);\n    }\n\n\n  //Check For Fill Light\n  node_ptr = 0;\n  if(checkDocForMeta(nametag_metatag, fill_light_meta, &node_ptr, m_document_state))\n    {\n      hasLightFill = true;\n      if(node_ptr)\n        m_fill_light = dynamic_cast<light_t*>(node_ptr);\n    }\n\n\n  //Check For Back Light\n  node_ptr = 0;\n  if(checkDocForMeta(nametag_metatag, back_light_meta, &node_ptr, m_document_state))\n    {\n      hasLightBack = true;\n      if(node_ptr)\n        m_back_light = dynamic_cast<light_t*>(node_ptr);\n    }\n\n\n  //Check For Key + Back Light Shader\n  node_ptr = 0;\n  if(checkDocForMeta(nametag_metatag, key_bck_lshade_meta, &node_ptr, m_document_state))\n    {\n      hasLight_shader = true;\n      if(node_ptr)\n        m_light_shader = dynamic_cast<k3d::inode*>(node_ptr);\t\n    }\n\n\n  //Check For Fill Light Shader\n  node_ptr = 0;\n  if(checkDocForMeta(nametag_metatag, fill_lshade_meta, &node_ptr, m_document_state))\n    {\n      hasLightFill_shader = true;\n      if(node_ptr)\n        m_fill_light_shader = dynamic_cast<k3d::inode*>(node_ptr);\n    }\n\n\n  //Check For Render Engine\n  node_ptr = 0;\n  if(checkDocForMeta(nametag_metatag, rman_engine_meta, &node_ptr, m_document_state))\n    {\n      hasRenderman_engine = true;\n      if(node_ptr)\n        m_engine = dynamic_cast<rManEngine_t*>(node_ptr);\n    }\n\n\n\n\n  //Setup Light Shader Preview Node**********\n\n  if(!hasLight_shader)\n    {\n      m_light_shader \n        = dynamic_cast<k3d::inode*>(k3d::plugin::create(\"RenderManLightShader\", \n                                                        m_document_state->document(), \n                                                        \"Preview Core::Light Shader\"));\n\n      k3d::property::set_internal_value(*m_light_shader, \n                                        \"shader_path\", k3d::share_path() /\n                                        k3d::filesystem::generic_path(pointLightPath));\n\n\n      k3d::property::set_internal_value(*m_light_shader, \n                                        \"intensity\", k3d::double_t(1200));\n\t      \n      //Create Meta Data\n      if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_light_shader))\n        metadata->set_metadata_value(nametag_metatag, key_bck_lshade_meta);\n   \n    }//if\n\n\n  if(!hasLightFill_shader)\n    {\n      m_fill_light_shader\n        = dynamic_cast<k3d::inode*>(k3d::plugin::create(\"RenderManLightShader\", \n                                                        m_document_state->document(), \n                                                        \"Preview Core::Fill Light Shader\"));\n\n      k3d::property::set_internal_value(*m_fill_light_shader, \n                                        \"shader_path\", k3d::share_path() /\n                                        k3d::filesystem::generic_path(pointLightPath));\n\n      k3d::property::set_internal_value(*m_fill_light_shader, \n                                        \"intensity\", k3d::double_t(650));\n\t      \n      //Create Meta Data\n      if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_fill_light_shader))\n        metadata->set_metadata_value(nametag_metatag, fill_lshade_meta);\n   \n    }//if\n\n  //Setup The Light**********\n\n  if(!hasLight)\n    {\n      m_main_light \n        = dynamic_cast<light_t*>(k3d::plugin::create(\"RenderManLight\", \n                                                     m_document_state->document(), \n                                                     \"Preview Core::Light\"));\n\n      k3d::property::set_internal_value(*m_main_light, \n                                        \"shader\", m_light_shader);\n\n\n      k3d::inode* light_transformation \n        = k3d::set_matrix(*m_main_light, \n                          k3d::translate3(-20, 20, 20));\n      \n\n      k3d::property::set_internal_value(*m_main_light, \n                                        \"viewport_visible\", false);\n\n\n      //Create Meta Data\n      if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_main_light))\n        metadata->set_metadata_value(nametag_metatag, key_light_meta);\n\n    }//if\n\n\n  if(!hasLightFill)\n    {\n      m_fill_light \n        = dynamic_cast<light_t*>(k3d::plugin::create(\"RenderManLight\", \n                                                     m_document_state->document(), \n                                                     \"Preview Core::Fill Light\"));\n\n      k3d::property::set_internal_value(*m_fill_light, \n                                        \"shader\", m_fill_light_shader);\n\n\n      k3d::inode* light_transformation \n        = k3d::set_matrix(*m_fill_light, \n                          k3d::translate3(20, 28, -18));\n\n\n      k3d::property::set_internal_value(*m_fill_light, \n                                        \"viewport_visible\", false);\n\n\n      //Create Meta Data\n      if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_fill_light))\n        metadata->set_metadata_value(nametag_metatag, fill_light_meta);\n\n    }//if\n\n\n  if(!hasLightBack)\n    {\n      m_back_light \n        = dynamic_cast<light_t*>(k3d::plugin::create(\"RenderManLight\", \n                                                     m_document_state->document(), \n                                                     \"Preview Core::Back Light\"));\n\n      k3d::property::set_internal_value(*m_back_light, \n                                        \"shader\", m_light_shader);\n\n\n      k3d::inode* light_transformation \n        = k3d::set_matrix(*m_back_light, \n                          k3d::translate3(0, -38, 18));\n\n\n      k3d::property::set_internal_value(*m_back_light, \n                                        \"viewport_visible\", false);\n\n      //Create Meta Data\n      if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_back_light))\n        metadata->set_metadata_value(nametag_metatag, back_light_meta);\n\n    }//if\n\n\n  //Setup The Camera**********\n\t  \n  if(!hasCamera)\n    {\n      m_camera \n        = dynamic_cast<camera_t*>(k3d::plugin::create(\"Camera\", \n                                                      m_document_state->document(), \n                                                      \"Preview Core::Camera\"));\n\n      //Orientate The Camera In The World\n      const k3d::point3 origin = k3d::point3(0, 0, 0);\n      const k3d::vector3 world_up = k3d::vector3(0, 0, 1);\n      const k3d::point3 position = k3d::point3(0, 13, 0);\n      const k3d::vector3 look_vector = origin - position;\n      const k3d::vector3 right_vector = look_vector ^ world_up;\n      const k3d::vector3 up_vector = right_vector ^ look_vector;\n\n      k3d::inode* const camera_transformation \n        = k3d::set_matrix(*m_camera, \n                          k3d::view_matrix(look_vector, up_vector, position));\n       \n      camera_transformation->set_name(\"Camera Transformation\");\n\n      k3d::property::set_internal_value(*m_camera, \n                                        \"world_target\", k3d::point3(0, 0, 0));\n\n      k3d::property::set_internal_value(*m_camera, \n                                        \"viewport_visible\", false);\n\n      k3d::property::set_internal_value(*m_camera, \n                                        \"aspect_ratio\", k3d::string_t(\"Square\"));\n\n      //Create Meta Data\n      if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_camera))\n        metadata->set_metadata_value(nametag_metatag, camera_meta);\n\n    }//if\n\n  //****************************************************************************\n\n  //Setup The Aqsis Renderman Engine**********\n\n  if(!hasAqsis_renderer)\n    {\n\t\t\t// Try the bundled engine first, for win32 installed versions\n\t\t\taqsis \n  \t        = k3d::plugin::create<k3d::ri::irender_engine>(\"BundledAqsisRenderManEngine\", \n  \t                                                       m_document_state->document(), \n  \t                                                       \"Preview Core::Aqsis Renderer\");\n  \t  \n  \t  // bundled engine is not installed, remove it\n  \t  if(aqsis && !aqsis->installed())\n  \t  {\n  \t  \tk3d::delete_nodes(m_document_state->document(), k3d::nodes_t(1, dynamic_cast<k3d::inode*>(aqsis)));\n  \t  \taqsis = 0;\n  \t  }\n  \t  \n  \t  if(!aqsis)\n  \t  {\n\t\t\t\taqsis \n\t\t\t\t\t= k3d::plugin::create<k3d::ri::irender_engine>(\"AqsisRenderManEngine\", \n                                                              m_document_state->document(), \n                                                              \"Preview Core::Aqsis Renderer\");\n  \t  }\n\n      //Create Meta Data\n      if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(aqsis))\n        metadata->set_metadata_value(nametag_metatag, aqsis_render_meta);\n\n    }//if\n\n\n  //Setup The Renderman Engine\n\n  if(!hasRenderman_engine)\n    {\n      m_engine \n        = dynamic_cast<rManEngine_t*>(k3d::plugin::create(\"RenderManEngine\", \n                                                         m_document_state->document(), \n                                                          \"Preview Core::RenderManEngine\"));\n\n      k3d::property::set_internal_value(*m_engine, \n                                        \"enabled_lights\", \n                                        k3d::inode_collection_property\n                                        ::nodes_t(1, m_main_light));\n\n      k3d::property::set_internal_value(*m_engine, \n                                        \"visible_nodes\", \n                                        k3d::inode_collection_property\n                                        ::nodes_t(1, m_geometry));\n\n\n      //Assign Aqsis To The Chosen RenderEngine Slot\n\n      k3d::property::set_internal_value(*m_engine, \n                                        \"render_engine\", \n                                        dynamic_cast<k3d::inode*>(aqsis));\n\n      //Setup Preview Render Dimensions\n\n      k3d::property::set_internal_value(*m_engine, \n                                        \"pixel_width\", \n                                        static_cast<k3d::int32_t>(m_pview_size));\n\n\n      k3d::property::set_internal_value(*m_engine, \n                                        \"pixel_height\", \n                                        static_cast<k3d::int32_t>(m_pview_size));\n\n      k3d::double_t aspectRatio = 1.0;\n\n      k3d::property::set_internal_value(*m_engine, \n                                        \"pixel_aspect_ratio\", aspectRatio);\n\n\n      //Set Render Quality Attributes: Optimized For Preview Render\n      k3d::double_t pixel_xy_samples = 1.0;\n\n      k3d::property::set_internal_value(*m_engine, \n                                        \"pixel_xsamples\", pixel_xy_samples);\n\n      k3d::property::set_internal_value(*m_engine, \n                                        \"pixel_ysamples\", pixel_xy_samples);\n\n\n      k3d::double_t shading_rate = 8.0;\n\n      k3d::property::set_internal_value(*m_engine, \n                                        \"shading_rate\", shading_rate);\n\n      //Create Meta Data\n      if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_engine))\n        metadata->set_metadata_value(nametag_metatag, rman_engine_meta);\n      \n\n    }//if\n  \n  //Setup The Geometry**********************************************************\n\n  if(!hasGeoSphere)\n    {\n      //Create The Default Sphere Geometric Object\n      PreviewSphere *default_sphereObj = new PreviewSphere(\"Sphere\", m_document_state);\n      default_sphereObj->init(PreviewObj::sphere_node_name, PreviewObj::sphere_md, m_engine);\n      m_used_geometry.push_back(default_sphereObj);\n\n      //Set Current Geometry To The Sphere\n      m_geometry = default_sphereObj->m_doc_node;\n\n    }//if\n\n //  if(!hasGeoCube)\n//     {\n//       //Create The Default Cube Geometric Object\n//       PreviewCube *default_cubeObj = new PreviewCube(\"Cube\", m_document_state);\n//       default_cubeObj->init(PreviewObj::cube_node_name, PreviewObj::cube_md);\n//       m_used_geometry.push_back(default_cubeObj);\n\n//       //Set Current Geometry To The Sphere\n//       m_geometry = default_cubeObj->m_doc_node;\n\n//     }//if\n\n//   if(!hasGeoTorus)\n//     {\n//       //Create The Default Torus Geometric Object\n//       PreviewTorus *default_torusObj = new PreviewTorus(\"Torus\", m_document_state);\n//       default_torusObj->init(PreviewObj::torus_node_name, PreviewObj::torus_md);\n//       m_used_geometry.push_back(default_torusObj);\n\n//       //Set Current Geometry To The Sphere\n//       m_geometry = default_torusObj->m_doc_node;\n\n//     }//if\n\n}//createPreviewNodes\n\n\n\nvoid ContentPanel::renderInit()\n{\n  //Re-init The Preview Render Dimensions\n  k3d::property::set_internal_value(*m_engine, \n                                    \"pixel_width\", \n                                    static_cast<k3d::int32_t>(m_pview_size));\n\n\n  k3d::property::set_internal_value(*m_engine, \n                                    \"pixel_height\", \n                                    static_cast<k3d::int32_t>(m_pview_size));\n\n\n  //Ensure Current Preview Engine Has Selected Nodes Only Visible\n  k3d::inode_collection::nodes_t::const_iterator node \n    = m_document_state->document().nodes().collection().begin();\n\n  for(; node != m_document_state->document().nodes().collection().end(); ++node)\n    {\n      if((*node)->factory().implements(typeid(k3d::ri::ilight)))\n        {\n          //Disable Node Regardless In RMANEngine::lights and nodes\n          k3d::property::set_internal_value(*m_engine, \n                                            \"enabled_lights\", \n                                            k3d::inode_collection_property\n                                            ::nodes_t(0, (*node)));\n        }//if\n      else if((*node)->factory().implements(typeid(k3d::imatrix_sink)))\n        {\n          k3d::property::set_internal_value(*m_engine, \n                                            \"visible_nodes\", \n                                            k3d::inode_collection_property\n                                            ::nodes_t(0, (*node)));\n        }//else if\n\t    \n    }//for\n\n  //Vector List Of Lights To Be Enabled In Chosen Render Engine\n  std::vector<k3d::inode*>lightsEnabled;\n  lightsEnabled.push_back(m_main_light);\n  lightsEnabled.push_back(m_fill_light);\n  lightsEnabled.push_back(m_back_light);\n\n  //Simply Enable Now Only USed Lights & Geo\n  k3d::property::set_internal_value(*m_engine, \n                                    \"enabled_lights\", lightsEnabled);\n \n\n\n  // k3d::property::set_internal_value(*m_engine, \n//                                     \"visible_nodes\", \n//                                     k3d::inode_collection_property\n//                                     ::nodes_t(1, m_geometry));\n\n}//renderInit\n\n\n\nvoid ContentPanel::rEngineAlpha(k3d::bool_t toggle, MaterialObj *mat)\n{\n  if(m_engine)\n    {\n      //Turn The Render Alpha Property On Or Off Depending On Switch\n      k3d::property::set_internal_value(*m_engine, \n                                        \"render_alpha\", \n                                        toggle);\n\n    }//if\n\n\n  //Get The Doc Node From MaterialObj Ptr\n  k3d::inode *mat_node = mat->m_doc_node;\n\n  if(mat_node)\n    {\n      //Set The MetaData For Background\n      if(toggle)\n        {\n          //Set MetaData To Show Background\n          if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(mat_node))\n            metadata->set_metadata_value(MaterialObj::show_bg_nametag_mt, MaterialObj::do_show_bg);\n        }\n      else\n        {\n          //Set MetaData To NOT Show Background\n          if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(mat_node))\n            metadata->set_metadata_value(MaterialObj::show_bg_nametag_mt, MaterialObj::do_not_show_bg);\n        }\n    }\n\n\n}//rEngineAlpha\n\n\n\n\nbool ContentPanel::checkPviewBackground(MaterialObj *mat)\n{\n  //Get The Doc Node From MaterialObj Ptr\n  k3d::inode *mat_node = mat->m_doc_node;\n\n  //Search m_doc_node Material For Attached Geometry\n  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(mat_node))\n    {\n      k3d::string_t value = metadata->get_metadata()[MaterialObj::show_bg_nametag_mt];\n\n      if(value == MaterialObj::do_show_bg)\n        {\n          //Background Needs To Be Shown\n          return true;\n        }\n      else if(value == MaterialObj::do_not_show_bg)\n        {\n          //Background Does Not Need To Be Shown\n          return false;\n        }\n      else\n        {\n          //DEFAULT: Background Does Not Need To Be Shown\n          return false;\n        }\n\n\n\n    }//if\n\n\n}//checkPviewBackground\n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/ContentPanel.h",
    "content": "#ifndef MODULES_NGUI_MATERIAL_MANAGER_PANEL_CONTENTPANEL_H\n#define MODULES_NGUI_MATERIAL_MANAGER_PANEL_CONTENTPANEL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include <k3dsdk/types.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/ilight_ri.h>\n#include <k3dsdk/ilight_shader_ri.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/imatrix_sink.h>\n\n#include <gtkmm.h>\n\n#include <sstream>\n\n#include \"PreviewTorus.h\"\n#include \"PreviewSphere.h\"\n#include \"PreviewCube.h\"\n\n#include \"MaterialObj.h\"\n\n#include \"DocumentUtilities.h\"\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\nclass ContentPanel\n{\n public:\n\n  //Type Definitions\n  typedef k3d::irender_camera_frame rManEngine_t;\n  typedef k3d::icamera camera_t;\n  typedef k3d::inode light_t;\n  typedef k3d::inode lightShader_t;\n  typedef k3d::inode geo_t;\n\n  ContentPanel(Gtk::HPaned *_m_hpane,  \n               document_state *_documentState)\n    :m_hpane(_m_hpane), \n    m_document_state(_documentState),\n    m_pview_size(200), m_single_imgfile(\"singlePreviewRender\"),\n    m_multi_imgfile(\"multiPreviewRender\")    \n      {\n        //Get Instance Number From This Value & Mark Render Images Accordingly\n        std::stringstream stream_for_id;\n        stream_for_id << this;\n        k3d::string_t instance_id = stream_for_id.str();\n\n        //Edit Render File Names To Represent Unique Files\n        m_multi_imgfile.append(instance_id);\n        m_single_imgfile.append(instance_id);\n        m_single_imgfile += k3d::string_t(\".png\");\n\n        //Setup The Rendering Components Using Meta Data\n        createPreviewNodes(); \n      }\n\t  \n      \n    virtual ~ContentPanel()\n      {\n        //Clean Up Used Geometry\n        std::list<PreviewObj*>::iterator geo_iter\n          = m_used_geometry.begin();\n\n        for(; geo_iter != m_used_geometry.end(); ++geo_iter)\n          delete (*geo_iter);    \n      }\n\n public:\n\n    //Analyse Doc For Preview Nodes And Create As Appropriate\n    void createPreviewNodes();\n\n    //Analyse Doc For Embedded Meta Data In Nodes\n    /* bool checkDocForMeta(const k3d::string_t meta_tag,  */\n/*                          const k3d::string_t meta_data,  */\n/*                          k3d::inode **node_ptr); */\n\n    //Abstract Functions To Be Used By Group & Profile Derivatives\n    virtual void renderPreview() \t\t\t\t  \t\t\t\t= 0;\n    virtual void renderSinglePreview(k3d::inode *node) \t= 0;\n    virtual bool updatePreviewImage() \t\t\t\t\t\t\t= 0;\n    virtual void buildPanel() \t\t\t\t\t\t\t\t\t= 0;\n\n    //Initialization Of Object Contents Beyond Initial Values\n    virtual void init()\t\t\t\t\t\t\t\t\t\t\t\t= 0;\n\n    //Attach Geometry To MaterialObj\n    virtual void matobjAttachGeo()\t\t\t\t\t\t\t\t= 0;\n\n    //Generic Render Initialization\n    void renderInit();\n\n    //Turn Render Engine Alpha On Or Off\n    void rEngineAlpha(k3d::bool_t toggle, MaterialObj *mat);\n\n    //Render Preview Background Checker\n    bool checkPviewBackground(MaterialObj *mat);\n\n    //Find A Material From A Doc Node\n    virtual bool findMaterial(const k3d::inode *node) \t= 0;\n\n    //Accessor Functions\n    //const k3d::string_t name() const\t\t{return this->m_name.internal_value();}\n\n protected:\n\n    //Main Panel GTK Widgets\n    Gtk::HPaned \t\t\t\t*m_hpane;\n    Gtk::ScrolledWindow \tm_scrolled_window;\n\n    //Preview Update Timer Connection\n    sigc::connection \t\tm_timer_connection;\n\n    //Document Info\n    document_state \t\t\t*m_document_state;\n   \n    //Initial Preview File Name ( + unique val + ext)\n    k3d::string_t \t\t\tm_single_imgfile;\t  \n    k3d::string_t \t\t\tm_multi_imgfile;\n\t  \n\n protected:\n\n    //Render Preview Components\n    light_t \t\t\t*m_main_light;\n    light_t \t\t\t*m_fill_light;\n    light_t \t\t\t*m_back_light;\n\n    lightShader_t \t*m_light_shader;\n    lightShader_t \t*m_fill_light_shader;\n\n    //NOTE: Back Uses Key Light Shader\n\n    geo_t \t\t\t\t*m_geometry;\t//Current Selected Geometry\n    rManEngine_t \t\t*m_engine;\n    camera_t \t\t\t*m_camera;\n\n    //Size Of Render Preview\n    k3d::uint_t \t\tm_pview_size;\n\n    //All Used Geometry\n    std::list<PreviewObj*> m_used_geometry;\n\n   \n};//ContentPanel\n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n\n#endif // !MODULES_NGUI_MATERIAL_MANAGER_PANEL_CONTENTPANEL_H\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/DocumentUtilities.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include \"DocumentUtilities.h\"\n\n#include <k3dsdk/imaterial_sink.h>\n#include <k3dsdk/imesh_sink.h>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\n\nbool checkDocForMeta(const k3d::string_t meta_tag, \n                     const k3d::string_t meta_data, \n                     k3d::inode **node_ptr, document_state *_document_state)\n\n{\n  //Iterate Through Document. If A Node Has Meta Data & Matches, Pass To node_ptr\n  k3d::inode_collection::nodes_t::const_iterator node \n    = _document_state->document().nodes().collection().begin();\n\n  for(; node != _document_state->document().nodes().collection().end(); ++node)\n    {\n      if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(*node))\n        {\n          k3d::string_t value = metadata->get_metadata()[meta_tag];\n          \n          if(value == meta_data)\n            {\n              //There Is A Match!\n              *node_ptr = *node;\n              return true;\n            }\n        }//if\n    }//for\n\n  //No Match Found\n  node_ptr = 0;\n  return false;\n}\n\nk3d::inode* get_material_sink(k3d::inode* Node, k3d::ipipeline& Pipeline)\n{\n\tk3d::inode* material_sink = Node;\n\tif(!dynamic_cast<k3d::imaterial_sink*>(material_sink))\n\t{\n\t\tk3d::imesh_sink* mesh_sink = dynamic_cast<k3d::imesh_sink*>(Node);\n\t\tif(mesh_sink)\n\t\t{\n\t\t\tk3d::iproperty* material_sink_property = Pipeline.dependency(mesh_sink->mesh_sink_input());\n\t\t\treturn_val_if_fail(material_sink_property, Node);\n\t\t\tmaterial_sink = material_sink_property->property_node();\n\t\t}\n\t}\n\tif(!dynamic_cast<k3d::imaterial_sink*>(material_sink))\n\t\tk3d::log() << error << \"get_material_sink: Failed to find a material sink\" << std::endl;\n\treturn material_sink;\n}\n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/DocumentUtilities.h",
    "content": "#ifndef MODULES_NGUI_MATERIAL_MANAGER_PANEL_DOCUMENTUTILITIES_H\n#define MODULES_NGUI_MATERIAL_MANAGER_PANEL_DOCUMENTUTILITIES_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include <k3dsdk/types.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/ilight_ri.h>\n#include <k3dsdk/ilight_shader_ri.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/imatrix_sink.h>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\n\n\n//Analyse Doc For Specific Embedded Meta Data In Nodes\nbool checkDocForMeta(const k3d::string_t meta_tag, \n                     const k3d::string_t meta_data, \n                     k3d::inode **node_ptr, document_state *_document_state);\n\n/// Gets the upstream node if the top node is not a material sink\nk3d::inode* get_material_sink(k3d::inode* Node, k3d::ipipeline& Pipeline);\n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n\n#endif // !MODULES_NGUI_MATERIAL_MANAGER_PANEL_DOCUMENTUTILITIES_H\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/GroupContentPanel.cpp",
    "content": "#include \"GroupContentPanel.h\"\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\nGroupContentPanel::~GroupContentPanel()\n{\n  //Clean Up Dynamic Allocated Memory :)\n\n  //All GTK Widgets >>\n\n  //ALL Gtk Hboxes*****************\n  std::vector<Gtk::HBox*>::iterator hbox_iter = m_pview_data_conts.begin();\n  for(; hbox_iter != m_pview_data_conts.end(); ++hbox_iter)\n    delete (*hbox_iter);  \n\n  hbox_iter = m_label_data_conts.begin();\n  for(; hbox_iter != m_label_data_conts.end(); ++hbox_iter)\n    delete (*hbox_iter);  \n\n\n  //ALL Gtk Vboxes*****************\n  std::vector<Gtk::VBox*>::iterator vbox_iter = m_data_desc_conts.begin();\n  for(; vbox_iter != m_data_desc_conts.end(); ++vbox_iter)\n    delete (*vbox_iter); \n            \n  vbox_iter = m_label_conts.begin();\n  for(; vbox_iter != m_label_conts.end(); ++vbox_iter)\n    delete (*vbox_iter); \n\n  vbox_iter = m_data_conts.begin();\n  for(; vbox_iter != m_data_conts.end(); ++vbox_iter)\n    delete (*vbox_iter); \n\n\n  //ALL Gtk Frames*****************\n  std::vector<Gtk::Frame*>::iterator frame_iter = m_pview_frames.begin();\n  for(; frame_iter != m_pview_frames.end(); ++frame_iter)\n    delete (*frame_iter); \n\n\n  //ALL Gtk Labels*****************\n  std::vector<Gtk::Label*>::iterator label_iter = m_name_labels.begin();\n  for(; label_iter != m_name_labels.end(); ++label_iter)\n    delete (*label_iter); \n\n  label_iter = m_type_labels.begin();\n  for(; label_iter != m_type_labels.end(); ++label_iter)\n    delete (*label_iter); \n\n  label_iter = m_datemod_labels.begin();\n  for(; label_iter != m_datemod_labels.end(); ++label_iter)\n    delete (*label_iter); \n\n  label_iter = m_artistname_labels.begin();\n  for(; label_iter != m_artistname_labels.end(); ++label_iter)\n    delete (*label_iter); \n\n  label_iter = m_name_data_labels.begin();\n  for(; label_iter != m_name_data_labels.end(); ++label_iter)\n    delete (*label_iter); \n\n  label_iter = m_type_data_labels.begin();\n  for(; label_iter != m_type_data_labels.end(); ++label_iter)\n    delete (*label_iter); \n\n  label_iter = m_datemod_data_labels.begin();\n  for(; label_iter != m_datemod_data_labels.end(); ++label_iter)\n    delete (*label_iter); \n\n  label_iter = m_artistname_data_labels.begin();\n  for(; label_iter != m_artistname_data_labels.end(); ++label_iter)\n    delete (*label_iter); \n\n            \n  //ALL Gtk Textviews***************\n  std::vector<Gtk::TextView*>::iterator mltxt_iter = m_artistnotes_mltext.begin();\n  for(; mltxt_iter != m_artistnotes_mltext.end(); ++mltxt_iter)\n    delete (*mltxt_iter); \n\n\n  //ALL Gtk ScrolledWindows*********\n  std::vector<Gtk::ScrolledWindow*>::iterator scroll_iter = m_artistnotes_scrollwin.begin();\n  for(; scroll_iter != m_artistnotes_scrollwin.end(); ++scroll_iter)\n    delete (*scroll_iter); \n\n\n  //ALL Gtk HSeparator**************\n  std::vector<Gtk::HSeparator*>::iterator hsep_iter = m_data_notes_seps.begin();\n  for(; hsep_iter != m_data_notes_seps.end(); ++hsep_iter)\n    delete (*hsep_iter); \n\n  hsep_iter = m_materials_seps.begin();\n  for(; hsep_iter != m_materials_seps.end(); ++hsep_iter)\n    delete (*hsep_iter); \n\n\n  //ALL Gtk VSeparator**************\n  std::vector<Gtk::VSeparator*>::iterator vsep_iter = m_label_data_seps.begin();\n  for(; vsep_iter !=  m_label_data_seps.end(); ++vsep_iter)\n    delete (*vsep_iter); \n\n\n  //Disconect Signal Connections****\n  m_timer_connection.disconnect();\n\n}\n\n\n\nvoid GroupContentPanel::init()\n{\n  //GLib Timer > Updates Preview Image Every 0.25s\n  m_timer_connection = Glib::signal_timeout()\n    .connect(sigc::mem_fun(*this, &GroupContentPanel::updatePreviewImage), 250);\n}\n\n\n\nvoid GroupContentPanel::buildPanel()\n{\n  if(m_hpane)\n    {\n      //Add Container To Right Pane From Implementation\n      m_hpane->add2(m_toolbar_main_cont);\n\n      //Embed The ToolBar\n      m_toolbar_main_cont.pack_start(m_toolbar, false, false, 0);\n\n      //----Insert Toolbar Setup HERE-----\n\n      //Setup & Embed The Panel ScrollWindow\n      m_scrolled_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n      m_toolbar_main_cont.pack_start(m_scrolled_window, true, true, 0);\n      m_scrolled_window.add(m_materials_cont);\n\n      //Integer Value To Tack Onto Filenames To Make Them Unique (In This Panel)\n      int fileName_int = 0;\n\n      //For Each Of The Elements In Group->m_materials Create A GUI Strip\n      std::list<MaterialObj*>::const_iterator mat_iter \n        = m_materialgrp->materialBegin();\n\n      for(; mat_iter != m_materialgrp->materialEnd(); ++mat_iter)\n        {\n          //Create File Name For Material Preview Image\n          k3d::string_t int_str;\n          k3d::string_t finalFile_str;\n          std::stringstream out;\n          out << fileName_int;\n          int_str = out.str();\n          int_str += k3d::string_t(\".png\");\n          finalFile_str.append(m_multi_imgfile);\n          finalFile_str.append(int_str);\t\t    \n\n          //Create The Material Preview Image Object\n          RenderedImage *s_preview_obj \n            = new RenderedImage(k3d::system::get_temp_directory() \n                                / k3d::filesystem::generic_path(finalFile_str));\n\n          //Add Material Preview Image Object To List\n          //m_material_pviews.push_back(s_preview_obj);\n\t\t    \n          \n          //Set The MaterialObj's Preview Image Object\n          (*mat_iter)->setPviewImg(s_preview_obj);\n\n\n          //Create & Embed Container To Hold A Single Material Section\n          Gtk::HBox *t_HBox = new Gtk::HBox;\n          m_pview_data_conts.push_back(t_HBox);\n          m_materials_cont.pack_start(*t_HBox, false, false, 10);\n\n          //Create & Embed The Preview Frame For Each Material\n          Gtk::Frame *t_Frame = new Gtk::Frame(\"Preview Render:\");\n          t_Frame->add(*s_preview_obj);\n          m_pview_frames.push_back(t_Frame);\n          t_Frame->set_size_request(m_pview_size + 25, m_pview_size + 35);\n          t_HBox->pack_start(*t_Frame, false, false, 5);\n\n          //Create & Embed Data & Artist Notes Container\n          Gtk::VBox *t_VBox_dd = new Gtk::VBox;\n          m_data_desc_conts.push_back(t_VBox_dd);\n          t_HBox->pack_start(*t_VBox_dd, true, true, 5); //HERE\n\n          //Data Container (Contains x3 VBox -> Label, vertical break and Data)\n          Gtk::HBox *t_HBox_ld = new Gtk::HBox;\n          m_label_data_conts.push_back(t_HBox_ld);\n          t_VBox_dd->pack_start(*t_HBox_ld, false, false, 5);\n\t\t    \n          //Create & Embed The Label Container\n          Gtk::VBox *t_VBox_label = new Gtk::VBox;\n          m_label_conts.push_back(t_VBox_label);\n          t_HBox_ld->pack_start(*t_VBox_label, false, false, 0);\n          t_VBox_label->set_spacing(4);\n\n          \n          //Label (Non-Data) Creation\n          Gtk::Label *t_Name_label = new Gtk::Label(\"Material Name:\");\n          Gtk::Label *t_Type_label = new Gtk::Label(\"Material Type:\");\n          Gtk::Label *t_dateMod_label = new Gtk::Label(\"Date Modified:\");\n          Gtk::Label *t_ArtistName_label = new Gtk::Label(\"Artist's Name:\");\n\n          m_name_labels.push_back(t_Name_label);\n          m_type_labels.push_back(t_Type_label);\n          m_datemod_labels.push_back(t_dateMod_label);\n          m_artistname_labels.push_back(t_ArtistName_label);\n\n          t_VBox_label->pack_start(*t_Name_label, false, false, 0);\n          t_VBox_label->pack_start(*t_Type_label, false, false, 0);\n          t_VBox_label->pack_start(*t_dateMod_label, false, false, 0);\n          t_VBox_label->pack_start(*t_ArtistName_label, false, false, 0);\n\n          t_Name_label->set_alignment(0.0);\n          t_Type_label->set_alignment(0.0);\n          t_dateMod_label->set_alignment(0.0);\n          t_ArtistName_label->set_alignment(0.0);\n\n\n          //Create Vertical Seperator Between Label & Label Data\n          Gtk::VSeparator *t_VBreaker = new Gtk::VSeparator();\n          m_label_data_seps.push_back(t_VBreaker);\n          t_HBox_ld->pack_start(*t_VBreaker, false, false, 10);\n\n          //Create & Embed Label Data Container\n          Gtk::VBox *t_VBox_d = new Gtk::VBox;\n          m_data_conts.push_back(t_VBox_d);\n          t_HBox_ld->pack_start(*t_VBox_d, false, false, 0);\n          t_VBox_d->set_spacing(4);\n\n          //Label Data Creation\n          Gtk::Label *t_Name_d = new Gtk::Label((*mat_iter)->name());\n          Gtk::Label *t_Type_d = new Gtk::Label((*mat_iter)->type());\n          Gtk::Label *t_dateMod_d = new Gtk::Label((*mat_iter)->dateStamp());\n          Gtk::Label *t_ArtistName_d = new Gtk::Label((*mat_iter)->artistName());\n\n          m_name_data_labels.push_back(t_Name_d);\n          m_type_data_labels.push_back(t_Type_d);\n          m_datemod_data_labels.push_back(t_dateMod_d);\n          m_artistname_data_labels.push_back(t_ArtistName_d);\n\n          t_VBox_d->pack_start(*t_Name_d, false, false, 0);\n          t_VBox_d->pack_start(*t_Type_d, false, false, 0);\n          t_VBox_d->pack_start(*t_dateMod_d, false, false, 0);\n          t_VBox_d->pack_start(*t_ArtistName_d, false, false, 0);\n\n          t_Name_d->set_alignment(0.0);\n          t_Type_d->set_alignment(0.0);\n          t_dateMod_d->set_alignment(0.0);\n          t_ArtistName_d->set_alignment(0.0);\n\n          //Create Seperator Between Labels & Artist Notes\n          Gtk::HSeparator *t_DataHBreaker = new Gtk::HSeparator();\n          m_data_notes_seps.push_back(t_DataHBreaker);\n          t_VBox_dd->pack_start(*t_DataHBreaker, false, false, 0);\n\n          //Create The Artist Notes ML Text Widget\n          Glib::RefPtr<Gtk::TextBuffer> txtDisplay = Gtk::TextBuffer::create();\n          txtDisplay->set_text((*mat_iter)->artistNotes());\n\n          Gtk::TextView *t_NotesView = new Gtk::TextView(txtDisplay);\n          t_NotesView->set_editable(false);\t    \n          m_artistnotes_mltext.push_back(t_NotesView);\n\n          //Embed The ml Text Widget Into A Scroll Window\n          Gtk::ScrolledWindow *t_NotesScrollWin = new Gtk::ScrolledWindow;\n          m_artistnotes_scrollwin.push_back(t_NotesScrollWin);\n          t_NotesScrollWin->add(*t_NotesView);\n          t_VBox_dd->pack_start(*t_NotesScrollWin, true, true, 0);\n\n          //Create Seperator Between Each Material Section\n          Gtk::HSeparator *t_HBreaker = new Gtk::HSeparator();\n          m_materials_seps.push_back(t_HBreaker);\n          m_materials_cont.pack_start(*t_HBreaker, false, false, 0);\n\n          //Increment Filename Tag For Unique Identifier\n          ++fileName_int;\n\n        }//for\n\n      //Gtk Build / Show GUI Hint\n      m_hpane->show_all(); \n\n\n     //  k3d::bool_t toggle_alpha = checkPviewBackground((*mat_iter));\n\n\n//       k3d::log() << \"toggle_alpha ok\" << std::endl;\n\n//       rEngineAlpha(toggle_alpha, (*mat_iter));\n\n//       k3d::log() << \"renginealpha ok\" << std::endl;\n\n      matobjAttachGeo();\n\n      //Set Off Renderer In New Process \n      renderPreview();\n    }\n  else\n    ; // Invalid HPanel Pointer \n\n}//buildPanel\n\n\nvoid GroupContentPanel::renderPreview()\n{\n  //Invoke Generic Render Initialization\n  renderInit();\n\n \n  //Iterate Through Each Material In Group & Render\n\n  std::list<MaterialObj*>::const_iterator mat_iter = m_materialgrp->materialBegin();\n\n  for(; mat_iter != m_materialgrp->materialEnd(); ++mat_iter)\n    {\n      //Check If Selected Node Is A RenderMan Material\n      if((*mat_iter)->isMaterial())\n        {\n//Set Alpha Render In Render Engine\n          k3d::bool_t toggle_alpha = checkPviewBackground(*mat_iter);\n          rEngineAlpha(toggle_alpha, *mat_iter);\n\n\n          //Select Correct Geometry\n          k3d::inode *selected_geo = (*mat_iter)->m_preview_geo;\n\n          // k3d::property::set_internal_value(*m_engine, \n//                                             \"visible_nodes\", \n//                                             k3d::inode_collection_property\n//                                             ::nodes_t(1, m_geometry));\n\n          \n          k3d::property::set_internal_value(*m_engine, \n                                            \"visible_nodes\", \n                                            k3d::inode_collection_property\n                                            ::nodes_t(1, selected_geo));\n\n          //If It Is, Assign To Current Geometry As A Surface Shader\n          k3d::property\n            ::set_internal_value(*get_material_sink(selected_geo, m_document_state->document().pipeline()), \n                                 \"material\", \n                                 const_cast<k3d::inode*>((*mat_iter)->docNode()));\n\n          //Render The Preview Using Selected External Renderer\n          m_engine\n            ->render_camera_frame(*m_camera, \n                                  (const_cast<RenderedImage*>((*mat_iter)->pviewImg()))->imgFilePath(), false);\n\n        }//if\t \n\n      else\n        {\n          ; //Not A Renderman Material\n        }\n\n    }//for  \n\n}//renderPreview\n\n\n\nbool GroupContentPanel::updatePreviewImage()\n{\n  //Invoke A Gtk Image Update / Refresh For Each Preview Image\n  std::list<MaterialObj*>::const_iterator mat_iter = m_materialgrp->materialBegin();\n\n  for(; mat_iter != m_materialgrp->materialEnd(); ++mat_iter)\n    {\n      (const_cast<RenderedImage*>((*mat_iter)->pviewImg()))->queue_resize();\n      (const_cast<RenderedImage*>((*mat_iter)->pviewImg()))->queue_draw();\n    }\n\t    \n  return true;\n}\n\n\n\nvoid GroupContentPanel::renderSinglePreview(k3d::inode *node)\n{\n  //Iterate Through All Of The Stored MaterialObj's.\n   std::list<MaterialObj*>::const_iterator mat_iter = m_materialgrp->materialBegin();\n\n   MaterialObj* matching_material = 0;\n\n   for(; mat_iter != m_materialgrp->materialEnd(); ++mat_iter)\n   {\n     //Check If MaterialObj's Doc Node Equals Argument Node\n     if((*mat_iter)->m_doc_node == node)\n       {\n         matching_material = (*mat_iter);\n         break;\n       }\n   }//for\n\n   //Start A Single Render Preview\n   if(matching_material)\n     {\n       //Invoke Generic Render Initialization\n       renderInit();\n\n\n       k3d::property::set_internal_value(*m_engine, \n                                         \"visible_nodes\", \n                                         k3d::inode_collection_property\n                                         ::nodes_t(1, m_geometry));\n\n\n       //Check If Selected Node Is A RenderMan Material\n       if(matching_material->isMaterial())\n         {\n           //If It Is, Assign To Current Geometry As A Surface Shader\n           k3d::property\n             ::set_internal_value(*get_material_sink(m_geometry, m_document_state->document().pipeline()), \n                                  \"material\", \n                                  const_cast<k3d::inode*>(matching_material->docNode()));\n\n\n           //Get Path Of Target Render Image\n           k3d::filesystem::path pimg_path \n             =(const_cast<RenderedImage*>((*mat_iter)->pviewImg()))->imgFilePath();\n\n           //Render The Preview Using Selected External Renderer\n           m_engine->render_camera_frame(*m_camera, \n                                         pimg_path,\n                                         false);\n\n    }//if\t \n\n  else\n    {\n      ; //Not A Renderman Material\n    }\n\n\n\n     }//if\n  \n}\n\n\nbool GroupContentPanel::findMaterial(const k3d::inode *node)\n{\n  //Iterate Through All Of The Stored MaterialObj's.\n   std::list<MaterialObj*>::const_iterator mat_iter = m_materialgrp->materialBegin();\n\n   for(; mat_iter != m_materialgrp->materialEnd(); ++mat_iter)\n     {\n       if((*mat_iter)->docNode() == node)\n         {\n           return true;\n         }\n     }\n\n   return false;\n\n}\n\n\n\nbool GroupContentPanel::findMaterial(const MaterialObj *mat)\n{\n  //Iterate Through All Of The Stored MaterialObj's.\n  std::list<MaterialObj*>::const_iterator mat_iter = m_materialgrp->materialBegin();\n\n  for(; mat_iter != m_materialgrp->materialEnd(); ++mat_iter)\n     {\n       if(*mat_iter == mat)\n         {\n           return true;\n         }\n     }\n  \n  return false;\n}\n\n\n\n\nvoid GroupContentPanel::matobjAttachGeo()\n{\n  //Iterate Through All Of The Stored MaterialObj's.\n  std::list<MaterialObj*>::const_iterator mat_iter = m_materialgrp->materialBegin();\n\n  for(; mat_iter != m_materialgrp->materialEnd(); ++mat_iter)\n    {\n      //Get The Doc Node From MaterialObj Ptr\n      k3d::inode *mat_node = (*mat_iter)->m_doc_node;\n\n      //Geometry Flags For Combo Update\n      bool sphereUsed = false;\n      bool cubeUsed = false;\n      bool torusUsed = false;\n\n      //Search m_doc_node Material For Attached Geometry\n      if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(mat_node))\n        {\n          k3d::string_t value = metadata->get_metadata()[MaterialObj::attached_geo_nametag_mt];\n\n          k3d::inode *attached_geo = 0; //Geometry Is Already Availible\n          PreviewObj *attached_new_geo = 0; //Geometery Is New & Needs To Be Created\n\n          k3d::string_t meta_attachedgeo = \"\";\n\n          k3d::log() << \"VALUE: \" << value << std::endl;\n          \n          //Check If Sphere Attached\n          if(value == PreviewObj::sphere_md)\n            {\n              //Check If Doesnt Exist In Document\n              if(!checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::sphere_md, &attached_geo, m_document_state))\n                {\n                  //Create The Default Sphere For Preview\n                  attached_new_geo = new PreviewSphere(\"Sphere\", m_document_state);\n                  attached_new_geo->init(PreviewObj::sphere_node_name, PreviewObj::sphere_md, m_engine);\n                }\n\n              meta_attachedgeo = PreviewObj::sphere_md;\n              sphereUsed = true;\n            }\n\n          //Check If Cube Attached\n          else if(value == PreviewObj::cube_md)\n            {\n              //Check If Doesnt Exist In Document\n              if(!checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::cube_md, &attached_geo, m_document_state))\n                {\n                  //Create The Default Cube For Preview\n                  attached_new_geo = new PreviewCube(\"Cube\", m_document_state);\n                  attached_new_geo->init(PreviewObj::cube_node_name, PreviewObj::cube_md, m_engine);\n                }\n\n              meta_attachedgeo = PreviewObj::cube_md;\n              cubeUsed = true;\n\n            }\n\n          //Check If Torus Attached\n          else if(value == PreviewObj::torus_md)\n            {\n              //Check If Doesnt Exist In Document\n              if(!checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::torus_md, &attached_geo, m_document_state))\n                {\n\n                  k3d::log() << \"TORUS NEW BUILT!\" << std::endl;\n                  //Create The Default Torus For Preview\n                  attached_new_geo = new PreviewTorus(\"torus\", m_document_state);\n                  attached_new_geo->init(PreviewObj::torus_node_name, PreviewObj::torus_md, m_engine);\n                }\n\n              meta_attachedgeo = PreviewObj::torus_md;\n              torusUsed = true;\n            }\n\n          else\n            {\n              //No Meta Data. Possibly Create & Attach Default Sphere\n              //k3d::inode *existing_sphere = 0;\n              if(!checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::sphere_md, &attached_geo, m_document_state))\n                {\n                  attached_new_geo =  new PreviewSphere(\"Sphere\", m_document_state);\n                  attached_new_geo->init(PreviewObj::sphere_node_name, PreviewObj::sphere_md, m_engine);\n\n                  (*mat_iter)->setPreviewGeo(attached_new_geo->m_doc_node, PreviewObj::sphere_md);\n\n                  k3d::log() << \"no meta, sphere node created: \" << attached_new_geo->m_doc_node << std::endl;\n\n                }\n              else\n                {\n                  //Default Sphere Exists In Document\n                  if(attached_geo)\n                    {\n                      (*mat_iter)->setPreviewGeo(attached_geo, PreviewObj::sphere_md);\n                      k3d::log() << \"no meta, sphere node Not created: \" << attached_geo << std::endl;\n                    }\n\n                }\n\n\n              meta_attachedgeo = PreviewObj::sphere_md;\n              sphereUsed = true;\n\n\n            }\n\n\n          //Attach The Geometry To The MaterialObj**********************************\n\n          if(attached_geo)\n            {\n              (*mat_iter)->setPreviewGeo(attached_geo, meta_attachedgeo);\n              k3d::log() << \"attached geo: \" << (*mat_iter)->m_preview_geo << std::endl;\n            }\n\n          else if(attached_new_geo)\n            {\n              (*mat_iter)->setPreviewGeo(attached_new_geo->m_doc_node, meta_attachedgeo);\n              m_used_geometry.push_back(attached_new_geo);\n              k3d::log() << \"attached new geo: \" << (*mat_iter)->m_preview_geo << std::endl;\n            }\n\n\n          //************************************************************************\n\n              k3d::log() << \"OI HERE BABY!\" << std::endl;\n\n        }//if\n      \n\n     \n\n\n    }//for\n\n\n}\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/GroupContentPanel.h",
    "content": "#ifndef MODULES_NGUI_MATERIAL_MANAGER_PANEL_GROUPCONTENTPANEL_H\n#define MODULES_NGUI_MATERIAL_MANAGER_PANEL_GROUPCONTENTPANEL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include <gtkmm/textview.h>\n\n#include <k3dsdk/ngui/text.h>\n#include <k3dsdk/imatrix_sink.h>\n\n#include <sstream>\n\n#include \"ContentPanel.h\"\n#include \"MaterialObj.h\"\n#include \"RenderedImage.h\"\n\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\nclass GroupContentPanel : public ContentPanel\n{\n public:\n  GroupContentPanel(Gtk::HPaned *_m_hpane, MaterialGroup *_m_materialgrp, \n                    document_state *_documentState)\n    :ContentPanel(_m_hpane, _documentState), m_materialgrp(_m_materialgrp)\n    {\n    }\n\n    ~GroupContentPanel();\n\n    //Initialization Of Object Contents Beyond Initial Values\n    void init();\n\n    //Attach Geometry To MaterialObj\n    void matobjAttachGeo();\n\n public:\n\n    //Build The GUI Panel\n    void buildPanel();\n\n    //Panel Specific Preview Render Mechanism (ALL)\n    void renderPreview();\n\n    //Renders One Of The Materials In Group\n    void renderSinglePreview(k3d::inode *node);\n\n    //Invoke A Preview Image Update\n    bool updatePreviewImage();\n\n    //Find A Material From A Doc Node\n    bool findMaterial(const k3d::inode *node);\n\n    //Find A Material From A MaterialObj Pointer\n    bool findMaterial(const MaterialObj *mat);\n\n\n\n\n private:\n          \n    //GTK Widget Containers\n    Gtk::VBox \t\t\t\t\t\t\t\t\t\tm_materials_cont;\n    Gtk::VBox \t\t\t\t\t\t\t\t\t\tm_toolbar_main_cont;\n    std::vector<Gtk::HBox *> \t\t\t\t\tm_pview_data_conts;\n    std::vector<Gtk::Frame *> \t  \t\t\tm_pview_frames;\n    std::vector<Gtk::VBox *> \t\t\t\t\tm_data_desc_conts;\n    std::vector<Gtk::HBox *> \t\t\t\t\tm_label_data_conts;\n    std::vector<Gtk::VBox *> \t\t\t\t\tm_label_conts;\n    std::vector<Gtk::VBox *> \t\t\t\t\tm_data_conts;\n\n    //Gtk Label Widgets\n    std::vector<Gtk::Label*> \t\t\t\t\tm_name_labels;\n    std::vector<Gtk::Label*> \t\t\t\t\tm_type_labels;\n    std::vector<Gtk::Label*> \t\t\t\t\tm_datemod_labels;\n    std::vector<Gtk::Label*> \t\t\t\t\tm_artistname_labels;\n    std::vector<Gtk::Label*> \t\t\t\t\tm_name_data_labels;\n    std::vector<Gtk::Label*> \t\t\t\t\tm_type_data_labels;\n    std::vector<Gtk::Label*> \t\t\t\t\tm_datemod_data_labels;\n    std::vector<Gtk::Label*> \t\t\t\t\tm_artistname_data_labels;\n\n    //Gtk Widgets For Artist Notes View\n    std::vector<Gtk::TextView*> \t\t\t\tm_artistnotes_mltext;\n    std::vector<Gtk::ScrolledWindow*> \t\tm_artistnotes_scrollwin;\n\n    //Gtk Seperators For Visual Clarity\n    std::vector<Gtk::HSeparator*> \t\t\tm_data_notes_seps;\n    std::vector<Gtk::HSeparator*> \t\t\tm_materials_seps;\n    std::vector<Gtk::VSeparator*> \t\t\tm_label_data_seps;\n\n    //Gtk Toolbar & Toolbar Contents\n    Gtk::Toolbar \t\t\t\t\t\t\t\t\tm_toolbar; \n\n    //The Render Preview Images\n    std::vector<RenderedImage*> \t\t\t\tm_material_pviews;\n\n private:\n\n    MaterialGroup \t\t\t\t\t\t\t\t*m_materialgrp;\n\n\n};//GroupContentPanel\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n\n#endif // !MODULES_NGUI_MATERIAL_MANAGER_PANEL_GROUPCONTENTPANEL_H\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/MaterialContentPanel.cpp",
    "content": "#include \"MaterialContentPanel.h\"\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\nvoid MaterialContentPanel::init()\n{\n  m_name_label.set_text\t\t\t(\"Material Name: \");\n  m_type_label.set_text\t\t\t(\"Material Type: \");\n  m_datemod_label.set_text\t\t(\"Date Modified: \");\n  m_artistname_label.set_text\t(\"Artist's Name: \");\n\n\n  //Create  A Preview Image In MaterialObj\n  RenderedImage *m_preview_img\n    = new RenderedImage(k3d::system::get_temp_directory() \n                        / k3d::filesystem::generic_path(m_single_imgfile));\n\n  m_materialobj->setPviewImg(m_preview_img);\n\n\n  //glib timer set that updates preview image every 0.25 seconds\n  m_timer_connection \n    = Glib::signal_timeout()\n    .connect(sigc::mem_fun(*this, &MaterialContentPanel::updatePreviewImage), 250);\n\n  //Date Insert Connection\n  m_date_button.signal_clicked()\n    .connect(sigc::mem_fun(*this, &MaterialContentPanel::onDateButtonPressed));\n\n\n  //Preview Geometry Combo Connection\n  m_tool_geo_combo.signal_changed()\n    .connect(sigc::mem_fun(*this, &MaterialContentPanel::onRenderComboSelect));\n\n\n  //Background Button Button Connection\n  m_tool_bg_button.signal_clicked()\n    .connect(sigc::mem_fun(*this, &MaterialContentPanel::onBGButtonPressed));\n\n\n\n}//init\n\n\nvoid MaterialContentPanel::buildPanel()\n{\n  if(m_hpane)\n    {\n      //Set Off Renderer In New Process \n      //renderPreview();\n\n      //Embed Everything In Master HBOX Padder\n      m_master_pad_cont.pack_start(m_pview_editor_cont, true, true, 5);\n\n      //Setup Render Preview Frame\n      m_pview_frame.set_size_request(m_pview_size + 25, m_pview_size + 35);\n      //m_pview_frame.add(m_material_preview);\n      m_pview_frame.add(*(m_materialobj->pviewImg()));\n\n      m_pview_cont.pack_start(m_pview_frame, false, false, 8);\n \t      \n      //Add ScrollWindowed Panel To Right Pane From Implementation\n      m_scrolled_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n      m_scrolled_window.add(m_master_pad_cont);\n\n      m_hpane->add2(m_scrolled_window);\n\n      //Place Containers In Correct Hierachy\n      m_pview_editor_cont.pack_start(m_pview_data_cont, false, false, 0); \n      m_pview_data_cont.pack_start(m_pview_cont, false, false, 0);\n      m_pview_data_cont.pack_start(m_data_toolbar_cont, false, false, 0);\n      m_data_toolbar_cont.pack_start(m_label_data_cont, true, true, 0);\n      m_label_data_cont.pack_start(m_label_cont, true, true, 0);\n      m_label_data_cont.pack_start(m_data_cont, true, true, 0);\n\n      m_pview_data_cont.set_spacing(10);\n\n      //Setup Material Name (Lable & Entry)\n      m_name_label.set_alignment(0.0);\n      m_label_cont.pack_start(m_name_label, true, true, 0);\n      m_data_cont.pack_start(m_name_entry, true, true, 2);\n\n      //Setup Material Type (Lable & Entry)\n      m_type_label.set_alignment(0.0);\n      m_label_cont.pack_start(m_type_label, true, true, 0);\n      m_data_cont.pack_start(m_type_entry, true, true, 0);\n\n      //Setup Material Date Modified (Lable & Entry)\n      m_datemod_label.set_alignment(0.0);\n      m_label_cont.pack_start(m_datemod_label, true, true, 0);\n\n      //Date Button Button & Button Icon\n      k3d::string_t date_graphic \n        = (k3d::share_path() / k3d::filesystem::generic_path(\"ngui/pixmap\") \n           / k3d::filesystem::generic_path(\"mat_preview_date_icon.xpm\"))\n        .native_filesystem_string();\n\n      m_date_button.add_pixlabel(date_graphic, \"Todays Date\");\n             \n      //Embed The Date Entry & Button Container\n      m_datebutton_cont.pack_start(m_datemod_entry, true, false, 0);\n      m_datebutton_cont.pack_start(m_date_button, true, false, 0);\n      m_data_cont.pack_start(m_datebutton_cont, true, false, 0);\n\n      //Setup Material Artist Name (Lable & Entry)\n      m_artistname_label.set_alignment(0.0);\n      m_label_cont.pack_start(m_artistname_label, true, true, 0);\n      m_data_cont.pack_start(m_artistname_entry, true, true, 0);\t\n\n\n      //ToolBox Setup********************************************\n\n      //Setup ToolBox Frame & Internal Container\n      m_toolbox_frame.set_size_request(-1, 48);\n      m_data_toolbar_cont.pack_start(m_toolbox_frame, false, false, 8);\n      m_toolbox_frame.add(m_toolbox_cont);\n                \n      //Setup Preview Geometry ComboBox\n      m_toolbox_cont.pack_start(m_tool_geo_combo, false, false, 2);\n\n      m_tool_geo_combo.append_text(\"Sphere\");\n      //tool_geo_combo.append_text(\"Cube\");\n      m_tool_geo_combo.append_text(\"Torus\");\n      //m_tool_geo_combo.set_active_text(\"Sphere\");\n      m_tool_geo_combo.set_size_request(-1, 30);\n\n      //Setup Preview Background Button\n      m_toolbox_cont.pack_start(m_tool_bg_button, false, false, 2);\n\n      k3d::string_t bg_graphic_path \n        = (k3d::share_path() / k3d::filesystem::generic_path(\"ngui/pixmap\") \n           / k3d::filesystem::generic_path(\"mat_preview_bg_icon.xpm\"))\n        .native_filesystem_string();\n\n      m_tool_bg_button.add_pixlabel(bg_graphic_path, \"Bg\");\n\n      //**********************************************************\n      \n      //Setup Material Artist Notes (Lable & Entry)\n      m_pview_editor_cont.pack_start(m_artnotes_frame, true, true, 10);\n      m_artistnotes_cont.pack_start( m_artistnotes_mltext, true, true, 5);\n      m_artnotes_frame.add(m_artistnotes_cont);\n\n      //Gtk Build / Show Hint\n      m_hpane->show_all(); \n\n      matobjAttachGeo();\n\n      //Set Off Renderer In New Process \n      renderPreview();\n\n\n    }\n  else\n    ; // Invalid HPanel Pointer\t\n\n}//buildPanel\n\n\n\nvoid MaterialContentPanel::renderPreview()\n{\n  //Invoke Generic Render Initialization\n  renderInit();\n\n  //Set Alpha Render In Render Engine\n  k3d::bool_t toggle_alpha = checkPviewBackground(m_materialobj);\n  rEngineAlpha(toggle_alpha, m_materialobj);\n\n\n  k3d::property::set_internal_value(*m_engine, \n                                    \"visible_nodes\", \n                                    k3d::inode_collection_property\n                                    ::nodes_t(1, m_geometry));\n\n  //Check If Selected Node Is A RenderMan Material\n  if(m_materialobj->isMaterial())\n    {  \n      //If It Is, Assign To Current Geometry As A Surface Shader\n      k3d::property\n        ::set_internal_value(*get_material_sink(m_geometry, m_document_state->document().pipeline()), \n                             \"material\", \n                             const_cast<k3d::inode*>(m_materialobj->docNode()));\n\t   \n\n      //Render The Preview Using Selected External Renderer\n      m_engine->render_camera_frame(*m_camera, \n                                    k3d::system::get_temp_directory() \n                                    / k3d::filesystem::generic_path(m_single_imgfile),\n                                    false);\n\n    }//if\t \n \n  else\n    {\n      ; //Not A Renderman Material\n    }\n\t    \n}//renderPreview\n\n\n\nbool MaterialContentPanel::updatePreviewImage()\n{\n  (m_materialobj->pviewImg())->queue_resize();\n  (m_materialobj->pviewImg())->queue_draw();\n\n  return true;\n}\t\n\n\nvoid MaterialContentPanel::renderSinglePreview(k3d::inode *node)\n{\n  renderPreview();\n}\n\n\n\nvoid MaterialContentPanel::onRenderComboSelect()\n{\n  k3d::string_t selected_geo = m_tool_geo_combo.get_active_text();\n\n  k3d::string_t meta_data = \"\";\n\n  //Work Out Which Geometric Object Was Selected\n  if(selected_geo == \"Sphere\")\n    {\n      meta_data = PreviewObj::sphere_md;\n\n    }\n  else if(selected_geo == \"Cube\")\n    {\n      meta_data = PreviewObj::cube_md;\n    }\n  else\n    {\n      meta_data = PreviewObj::torus_md;\n    }\n\n\n  //Meta Tag To Be Found / Added\n  k3d::string_t meta_tag = PreviewObj::pview_geo_nametag_mt;\n\n  //Node That Points To Actual Doc Node\n  k3d::inode *node_ptr = 0;\n\n  //Check If The Node Exists In The Document\n  checkDocForMeta(meta_tag, meta_data, &node_ptr, m_document_state);\n\n\n  if(node_ptr)\n    {\n      m_materialobj->setPreviewGeo(node_ptr, meta_data);\n      m_geometry =  m_materialobj->m_preview_geo; //Node Found In Document!\n\n      // m_geometry = node_ptr; //Node Found In Document!\n\n    }\n  else\n    {\n      //Build The Correct Geometric Object From Scratch\n      PreviewObj *built_geo = 0;\n\n\n      if(selected_geo == \"Sphere\")\n        {\n          built_geo = new PreviewSphere(\"Sphere\", m_document_state);\n          built_geo->init(PreviewObj::sphere_node_name, PreviewObj::sphere_md, m_engine);\n        }        \n\n      else if(selected_geo == \"Cube\")\n        {\n        built_geo = new PreviewCube(\"Cube\", m_document_state);\n        built_geo->init(PreviewObj::cube_node_name, PreviewObj::cube_md, m_engine);\n        }\n\n      else\n        {\n        built_geo = new PreviewTorus(\"Torus\", m_document_state);\n        built_geo->init(PreviewObj::torus_node_name, PreviewObj::torus_md, m_engine);\n        }\n      \n      if(built_geo)\n        {\n          m_materialobj->setPreviewGeo(built_geo->m_doc_node, meta_data);\n\n          //Set The Current Geometric Object To This\n          m_geometry =  m_materialobj->m_preview_geo;\n\n          //m_geometry = built_geo->m_doc_node;\n\n        }\n\n    }//else\n\n  //Render & Refresh Preview\n  renderPreview();\n  updatePreviewImage();\n\n  k3d::log() << \"Render Combo Changed\" << std::endl;\n\n}\n\n\n\nvoid MaterialContentPanel::matobjAttachGeo()\n{\n  //Get The Doc Node From MaterialObj Ptr\n  k3d::inode *mat_node = m_materialobj->m_doc_node;\n\n  //Geometry Flags For Combo Update\n  bool sphereUsed = false;\n  bool cubeUsed = false;\n  bool torusUsed = false;\n\n  //Search m_doc_node Material For Attached Geometry\n  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(mat_node))\n    {\n      k3d::string_t value = metadata->get_metadata()[MaterialObj::attached_geo_nametag_mt];\n\n      k3d::inode *attached_geo = 0; //Geometry Is Already Availible\n      PreviewObj *attached_new_geo = 0; //Geometery Is New & Needs To Be Created\n\n      k3d::string_t meta_attachedgeo = \"\";\n\n      k3d::log() << \"VALUE: \" << value << std::endl;\n          \n      //Check If Sphere Attached\n      if(value == PreviewObj::sphere_md)\n        {\n          //Check If Doesnt Exist In Document\n          if(!checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::sphere_md, &attached_geo, m_document_state))\n            {\n              //Create The Default Sphere For Preview\n              attached_new_geo = new PreviewSphere(\"Sphere\", m_document_state);\n              attached_new_geo->init(PreviewObj::sphere_node_name, PreviewObj::sphere_md, m_engine);\n            }\n\n          meta_attachedgeo = PreviewObj::sphere_md;\n          sphereUsed = true;\n        }\n\n      //Check If Cube Attached\n      else if(value == PreviewObj::cube_md)\n        {\n          //Check If Doesnt Exist In Document\n          if(!checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::cube_md, &attached_geo, m_document_state))\n            {\n              //Create The Default Cube For Preview\n              attached_new_geo = new PreviewCube(\"Cube\", m_document_state);\n              attached_new_geo->init(PreviewObj::cube_node_name, PreviewObj::cube_md, m_engine);\n            }\n\n          meta_attachedgeo = PreviewObj::cube_md;\n          cubeUsed = true;\n\n        }\n\n      //Check If Torus Attached\n      else if(value == PreviewObj::torus_md)\n        {\n          //Check If Doesnt Exist In Document\n          if(!checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::torus_md, &attached_geo, m_document_state))\n            {\n\n              k3d::log() << \"TORUS NEW BUILT!\" << std::endl;\n              //Create The Default Torus For Preview\n              attached_new_geo = new PreviewTorus(\"torus\", m_document_state);\n              attached_new_geo->init(PreviewObj::torus_node_name, PreviewObj::torus_md, m_engine);\n            }\n\n          meta_attachedgeo = PreviewObj::torus_md;\n          torusUsed = true;\n        }\n\n      else\n        {\n          //No Meta Data. Possibly Create & Attach Default Sphere\n          //k3d::inode *existing_sphere = 0;\n          if(!checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::sphere_md, &attached_geo, m_document_state))\n            {\n              attached_new_geo =  new PreviewSphere(\"Sphere\", m_document_state);\n              attached_new_geo->init(PreviewObj::sphere_node_name, PreviewObj::sphere_md, m_engine);\n\n              m_materialobj->setPreviewGeo(attached_new_geo->m_doc_node, PreviewObj::sphere_md);\n\n              k3d::log() << \"no meta, sphere node created: \" << attached_new_geo->m_doc_node << std::endl;\n\n            }\n          else\n            {\n              //Default Sphere Exists In Document\n              if(attached_geo)\n                {\n                  m_materialobj->setPreviewGeo(attached_geo, PreviewObj::sphere_md);\n                  k3d::log() << \"no meta, sphere node Not created: \" << attached_geo << std::endl;\n                }\n\n            }\n\n\n          meta_attachedgeo = PreviewObj::sphere_md;\n          sphereUsed = true;\n\n\n        }\n\n\n      //Attach The Geometry To The MaterialObj**********************************\n\n      if(attached_geo)\n        {\n        m_materialobj->setPreviewGeo(attached_geo, meta_attachedgeo);\n        k3d::log() << \"attached geo: \" << m_materialobj->m_preview_geo << std::endl;\n        }\n\n      else if(attached_new_geo)\n        {\n          m_materialobj->setPreviewGeo(attached_new_geo->m_doc_node, meta_attachedgeo);\n          m_used_geometry.push_back(attached_new_geo);\n          k3d::log() << \"attached new geo: \" << m_materialobj->m_preview_geo << std::endl;\n        }\n\n\n      //Update The Gui Combo\n      if(sphereUsed)\n        m_tool_geo_combo.set_active_text(\"Sphere\");\n      else if(cubeUsed)\n        m_tool_geo_combo.set_active_text(\"Cube\");\n      else if(torusUsed)\n        m_tool_geo_combo.set_active_text(\"Torus\");\n\n\n\n      //************************************************************************\n\n          k3d::log() << \"OI HERE BABY!\" << std::endl;\n\n    }//if\n\n\n\n  m_geometry =  m_materialobj->m_preview_geo;\n\n}//matobjAttachGeo\n\n\n\n\nvoid MaterialContentPanel::onBGButtonPressed()\n{\n  if(checkPviewBackground(m_materialobj))\n    {\n      rEngineAlpha(false, m_materialobj);\n    }\n  else\n    {\n      rEngineAlpha(true, m_materialobj);\n    }\n\n  //Render & Refresh Preview\n  renderPreview();\n  updatePreviewImage();\n\n  k3d::log() << \"Change The Background!\" << std::endl;\n\n}//onBGButtonPressed\n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/MaterialContentPanel.h",
    "content": "#ifndef MODULES_NGUI_MATERIAL_MANAGER_PANEL_MATERIALCONTENTPANEL_H\n#define MODULES_NGUI_MATERIAL_MANAGER_PANEL_MATERIALCONTENTPANEL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include <k3dsdk/ngui/entry.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/image_toggle_button.h>\n#include <k3dsdk/ngui/text.h>\n#include <k3dsdk/imatrix_sink.h>\n\n#include \"ContentPanel.h\"\n#include \"MaterialObj.h\"\n#include \"RenderedImage.h\"\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\nclass MaterialContentPanel : public ContentPanel\n  {\n  public:\n\n    MaterialContentPanel(Gtk::HPaned *_m_hpane, MaterialObj *_m_materialobj, \n                         document_state *_documentState)\n      :ContentPanel(_m_hpane, _documentState), \n      m_materialobj(_m_materialobj),\n      m_pview_frame(\"Preview Render:\"), \n      m_artnotes_frame(\"Artist's Notes:\"), \n      m_toolbox_frame(\"Toolbox:\"),\n      m_name_entry(\n                   entry::model(_m_materialobj->m_name), 0),\n      m_type_entry(\n                   entry::model(_m_materialobj->m_type), 0),\n      m_datemod_entry(\n                      entry::model(_m_materialobj->m_datestamp), 0),\n      m_artistname_entry(\n                         entry::model(_m_materialobj->m_artistname), 0),\n      m_artistnotes_mltext(\n                           text::model(_m_materialobj->m_artistnotes), 0)\n\n        {\n        }\n\n\n      ~MaterialContentPanel()\n        {\n          m_timer_connection.disconnect();\n        }\n\n\n      //Initialization Of Object Contents Beyond Initial Values\n      void init();\n\n      //Attach Geometry To MaterialObj\n      void matobjAttachGeo();\n\n\n  public:\n      \n      //Build The GUI Panel\n      void buildPanel();\n\n      //Panel Specific Preview Render Mechanism\n      void renderPreview();\n\n      //Simply Calls renderPreview (Required For Group Render Update)\n      void renderSinglePreview(k3d::inode *node);\n      \n      //Invoke A Preview Image Update\n      bool updatePreviewImage();\n\n      //Todays Date Button Event Handler\n      void onDateButtonPressed()\n      {\n        //Insert Todays Date (mm/dd/yyyy) into date entry\n        m_materialobj->insertTodaysDate();\n      }\n\n      //Switch Preview Geometry On Combo Select\n      void onRenderComboSelect();\n\n      //Displays Background (Or Not)\n      void onBGButtonPressed();\n\n      //Find A Material From A Doc Node\n      bool findMaterial(const k3d::inode *node)\n      {\n        if(m_materialobj->m_doc_node == node)\n          return true;\n\n        else\n          return false;\n\n      }\n\n  private:\n\n      //Main Panel GTK Widgets\n      Gtk::Label \t\t\tm_name_label;\n      Gtk::Label \t\t\tm_type_label;\n      Gtk::Label \t\t\tm_datemod_label;\n      Gtk::Label \t\t\tm_artistname_label;\n\n\n      Gtk::HBox \t\t\tm_master_pad_cont;\n      Gtk::VBox \t\t\tm_pview_editor_cont;\n      Gtk::HBox \t\t\tm_pview_data_cont;\n      Gtk::VBox \t\t\tm_data_toolbar_cont;\n      Gtk::HBox \t\t\tm_label_data_cont;\n      Gtk::VBox \t\t\tm_label_cont;\n      Gtk::VBox \t\t\tm_data_cont;\n      Gtk::VBox \t\t\tm_pview_cont;\n      Gtk::HBox \t\t\tm_datebutton_cont;\n\n      Gtk::HBox \t\t\tm_name_cont;\n      Gtk::HBox \t\t\tm_type_cont;\n      Gtk::HBox \t\t\tm_datemod_cont;\n      Gtk::HBox \t\t\tm_artistname_cont;\n\n      Gtk::HBox \t\t\tm_artistnotes_cont;\n\n      Gtk::Frame \t\t\tm_pview_frame;\n      Gtk::Frame \t\t\tm_artnotes_frame;\n      Gtk::Frame \t\t\tm_toolbox_frame;\n\n      entry::control \tm_name_entry;\n      entry::control \tm_type_entry;\n      entry::control \tm_datemod_entry;\n      entry::control \tm_artistname_entry;\n\n      Gtk::Button \t\tm_date_button;\n      text::control \t\tm_artistnotes_mltext;\n\n      //ToolBox Gtk Widgets\n      Gtk::HBox\t\t\t \tm_toolbox_cont;\n      Gtk::ComboBoxText   \tm_tool_geo_combo;\n      Gtk::Button   \t\t\tm_tool_bg_button;\n\n  private:\n\n      MaterialObj \t\t\t*m_materialobj;\n\n\n  };//MaterialContentPanel\n\n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n\n#endif // !MODULES_NGUI_MATERIAL_MANAGER_PANEL_MATERIALCONTENTPANEL_H\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/MaterialGroup.cpp",
    "content": "#include \"MaterialGroup.h\"\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\nvoid MaterialGroup::clearGroup()\n{\n  std::list<MaterialObj*>::iterator materialIter = m_materials.begin();\n\n  //Clean Up The List Of material Objects (MaterialObj)\n  for(; materialIter != m_materials.end(); ++materialIter)\n      delete (*materialIter);\n   \n  //Ensure Clean List Storage \n  m_materials.clear();\n}\n\n  void MaterialGroup::addMaterial(const MaterialObj* mat)\n  {\n    m_materials.push_back(const_cast<MaterialObj*>(mat));\n  }\n\n  void MaterialGroup::removeMaterial(const MaterialObj* mat)\n  {\n    m_materials.remove(const_cast<MaterialObj*>(mat));\n  }\n\n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/MaterialGroup.h",
    "content": "#ifndef MODULES_NGUI_MATERIAL_MANAGER_PANEL_MATERIALGROUP_H\n#define MODULES_NGUI_MATERIAL_MANAGER_PANEL_MATERIALGROUP_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include <k3dsdk/types.h>\n\n#include<list>\n\n#include \"MaterialObj.h\"\n\nusing std::list;\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\n//forward declaration for material object\nclass MaterialObj;\n\n\nclass MaterialGroup\n{\n public:\n  MaterialGroup(k3d::string_t _sg_name)\n    :m_name(_sg_name)\n    {\n    }\n\n  ~MaterialGroup()\n    {\n      //Clean Up All Shader Children\n      clearGroup();\n    }\n\n public:\n\n  //Accessor Functions\n  std::list<MaterialObj*>::const_iterator materialBegin()\n    {\n      return m_materials.begin();\n    }\n\n  std::list<MaterialObj*>::const_iterator materialEnd()\n    {\n      return m_materials.end();\n    }\n    \n\n  const k3d::string_t name()\t\t\t{return this->m_name;}\n\n  //Mutator Functions\n  void addMaterial(const MaterialObj* mat);\n  void removeMaterial(const MaterialObj* mat);\n\n  void clearGroup();\n\n private:\n\n  std::list<MaterialObj*>     \tm_materials;\n  k3d::string_t            \tm_name;\n\n};//MaterialGroup\n\n\n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n\n#endif // !MODULES_NGUI_MATERIAL_MANAGER_PANEL_MATERIALGROUP_H\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/MaterialObj.cpp",
    "content": "#include \"MaterialObj.h\"\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\n//Static Definitions\nconst k3d::string_t MaterialObj::attached_geo_nametag_mt = \"PreviewCore::attachedgeotag\";\nconst k3d::string_t MaterialObj::show_bg_nametag_mt = \"PreviewCore::showbackground\";\nconst k3d::string_t MaterialObj::do_show_bg = \"do_show_bg\";\nconst k3d::string_t MaterialObj::do_not_show_bg = \"do_not_show_bg\";\n\n\n\n\nvoid MaterialObj::init()\n{\n  //Get Any Availible Data (If There Is Any)\n  loadFromMeta();\n\n  //Drop Hint To Multiline Text Item\n  m_artistnotes.set_metadata_value(\"k3d:property-type\", \"k3d:multi-line-text\");\n\n  //Change Signals For Data Variables\n  m_name.changed_signal()\n    .connect(sigc::mem_fun(*this, &MaterialObj::onNameChange));\n\n  m_type.changed_signal()\n    .connect(sigc::mem_fun(*this, &MaterialObj::onTypeChange));\n\n  m_datestamp.changed_signal()\n    .connect(sigc::mem_fun(*this, &MaterialObj::onDateStampChange));\n\n  m_artistname.changed_signal()\n    .connect(sigc::mem_fun(*this, &MaterialObj::onArtistNameChange));\n\n  m_artistnotes.changed_signal()\n    .connect(sigc::mem_fun(*this, &MaterialObj::onArtistNotesChange));\n\n\n\n}//init\n\n\nvoid MaterialObj::onNameChange(k3d::ihint *_h)\n{\n  m_doc_node->set_name(m_name.internal_value());\n}\n\t  \n\nvoid MaterialObj::onTypeChange(k3d::ihint *_h)\n{\n  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_doc_node))\n    metadata->set_metadata_value(\"materialManager::material_type\", type());\n}\n\n\nvoid MaterialObj::onDateStampChange(k3d::ihint *_h)\n{\n  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_doc_node))\n    metadata->set_metadata_value(\"materialManager::material_datestamp\", dateStamp());\n}\n\n\nvoid MaterialObj::onArtistNameChange(k3d::ihint *_h)\n{\n  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_doc_node))\n    metadata->set_metadata_value(\"materialManager::material_artistname\", artistName());\n}\n\n\nvoid MaterialObj::onArtistNotesChange(k3d::ihint *h_)\n{\n  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_doc_node))\n    metadata->set_metadata_value(\"materialManager::material_artistnotes\", artistNotes());\n}\t\n\n\nvoid MaterialObj::loadFromMeta()\n{\n  //Get Node Name\n  m_name.set_value(m_doc_node->name());\n\n  //Get Any Availible Meta Data (If There Is Any)\n  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_doc_node))\n    {\n      m_type.set_value(metadata->get_metadata()[\"materialManager::material_type\"]);\n      m_datestamp.set_value(metadata->get_metadata()[\"materialManager::material_datestamp\"]);\n      m_artistname.set_value(metadata->get_metadata()[\"materialManager::material_artistname\"]);\n      m_artistnotes.set_value(metadata->get_metadata()[\"materialManager::material_artistnotes\"]);\n    }//if\n}\n\n \nvoid MaterialObj::insertTodaysDate()\n{\n  //Insert Todays Date Into Date Entry\n  time_t rawtime;\n  struct tm * timeinfo;\n  time(&rawtime);\n  timeinfo = localtime(&rawtime);\n\n  //Use String Stream To Convert Numerical Values To Strings\n  std::stringstream stream_for_date;\n  //Adding to values as they origionally represent amount from jan (jan = 0) and 1900 \n  stream_for_date << (1 + timeinfo->tm_mon) << \"/\" << timeinfo->tm_mday << \"/\" << (1900 + timeinfo->tm_year);\n  k3d::string_t current_date_str = stream_for_date.str();\n\n  setDateStamp(current_date_str);\n}\n\n\nvoid  MaterialObj::setPreviewGeo(k3d::inode *geo, k3d::string_t meta_attachedgeo)\n{\n  //Set Pointer To New Geometry\n  m_preview_geo = geo;\n\n  //Set Meta Data For Material\n  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_doc_node))\n    metadata->set_metadata_value(MaterialObj::attached_geo_nametag_mt, meta_attachedgeo);\n\n\n}\n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/MaterialObj.h",
    "content": "#ifndef MODULES_NGUI_MATERIAL_MANAGER_PANEL_MATERIALOBJ_H\n#define MODULES_NGUI_MATERIAL_MANAGER_PANEL_MATERIALOBJ_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/ihint.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imaterial_ri.h>\n\n#include \"RenderedImage.h\"\n#include \"MaterialGroup.h\"\n\n#include \"PreviewTorus.h\"\n#include \"PreviewSphere.h\"\n#include \"PreviewCube.h\"\n\n#include \"DocumentUtilities.h\"\n\nusing namespace k3d::data;\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\n//forward declaration for list of materials\nclass MaterialGroup;\n\nclass MaterialObj\n{\n public:\n  MaterialObj(MaterialGroup *_parent, k3d::inode *_node, k3d::string_t _s_type)\n    :m_group_parent(_parent), \n    m_doc_node(_node), \n    m_pview_img(0),\n    m_preview_geo(0),\n    m_name(init_value(_node->name())),\n    m_type(init_value(_s_type)),\n    m_datestamp(init_value(k3d::string_t(\"\"))),\n    m_artistname(init_value(k3d::string_t(\"\"))),\n    m_artistnotes(init_value(k3d::string_t(\"\")))\n      {    \n      }\n \n    ~MaterialObj()\n      {\n        //Clean Up Preview Image Dynamic Memory\n        if(m_pview_img)\n          delete m_pview_img;\n      }\n\n public:\n \n    //Initialization Of Object Contents Beyond Initial Values\n    void init();\n\n    //Accessor Functions\n    const k3d::string_t name() const\t\t\t\t\t{return this->m_name.internal_value();}\n    const k3d::string_t type() const\t\t\t\t\t{return this->m_type.internal_value();}\n    const k3d::string_t dateStamp() const\t\t\t\t{return this->m_datestamp.internal_value();}\n    const k3d::string_t artistName() const\t  \t\t{return this->m_artistname.internal_value();}\n    const k3d::string_t artistNotes() const\t\t\t{return this->m_artistnotes.internal_value();}  \n    RenderedImage* pviewImg() const\t\t\t  \t{return this->m_pview_img;}\n\n    \n /*   m_data_t  nameData() const\t\t{return this->m_name;}\n    data_t* typeData() const\t\t{return this->m_type;}\n    data_t* dateStampData() const\t\t{return this->m_datestamp;}\n    data_t* artistNameData() const\t{return this->m_artistname;}\n     data_t* artistNotesData() const\t{return this->m_artistnotes;} */\n    \n    k3d::inode* docNode() const \t\t\t\t\t{return this->m_doc_node;}\n    const k3d::string_t docNodeName() const\t\t\t{return this->m_doc_node->factory().name();}\n    MaterialGroup* groupParent() const\t \t\t\t\t{return this->m_group_parent;}\n\n    //Mutator Functions\n    void setName(const k3d::string_t &_str)\t\t\t{this->m_name.set_value(_str);}\n    void setType(const k3d::string_t &_str)\t\t\t{this->m_type.set_value(_str);}\n    void setDateStamp(const k3d::string_t &_str)\t{this->m_datestamp.set_value(_str);}\n    void setArtistName(const k3d::string_t &_str)\t{this->m_artistname.set_value(_str);}\n    void setArtistNotes(const k3d::string_t &_str)\t{this->m_artistnotes.set_value(_str);}\n    void setDocNode(k3d::inode *_node_ptr) \t\t\t{this->m_doc_node = _node_ptr;}\n    void setGroupParent(MaterialGroup *_gp_ptr) \t{this->m_group_parent = _gp_ptr;}\n    void setPviewImg(RenderedImage *img) \t\t\t\t{this->m_pview_img = img;}\n\n    void setPreviewGeo(k3d::inode *geo, k3d::string_t meta_attachedgeo);\n\n    \n    //Material Profile Signal Event Handlers\n    void onNameChange(k3d::ihint *_h);\n    void onTypeChange(k3d::ihint *_h);\n    void onDateStampChange(k3d::ihint *_h);\n    void onArtistNameChange(k3d::ihint *_h);\n    void onArtistNotesChange(k3d::ihint *h_);\n\n\n    //Reset Content To Curent Saved Node Meta Data\n    void loadFromMeta();  \n\n    //Generate And Insert Todays Date Into Date Stamp Variable\n    void insertTodaysDate();\n    \n    //Find Out If This Is A k3d::ri::imaterial (A K3d Material)\n    bool isMaterial()\n    {\n      if(m_doc_node->factory().implements(typeid(k3d::ri::imaterial)))\n        return true;  \n      else \n        return false;\n    }\n   \n\n public:\n    k3d_data(k3d::string_t, no_name, change_signal,\n             no_undo, local_storage, no_constraint, \n             no_property, no_serialization) \t\t\t\t\t\tm_name;\n\n    k3d_data(k3d::string_t, no_name, change_signal, \n             no_undo, local_storage, no_constraint, \n             no_property, no_serialization) \t\t\t\t\t\tm_type;\n\n    k3d_data(k3d::string_t, no_name, change_signal, \n             no_undo, local_storage, no_constraint, \n             no_property, no_serialization) \t\t\t\t\t\tm_datestamp;\n\n    k3d_data(k3d::string_t, no_name, change_signal, \n             no_undo, local_storage, no_constraint, \n             no_property, no_serialization) \t\t\t\t\t\tm_artistname;\n\n    k3d::metadata::property\n      <k3d_data(k3d::string_t, no_name, change_signal, \n                no_undo, local_storage, no_constraint, \n                no_property, no_serialization)> \t\t\t\t\tm_artistnotes;\n\n\n    k3d::inode\t\t\t\t\t*m_doc_node;\n    MaterialGroup \t  \t\t*m_group_parent;\n\n    RenderedImage\t\t\t\t*m_pview_img;\n    \n    k3d::inode\t\t\t\t\t*m_preview_geo;\n\n\n    //Static Attached Geometry MetaTag\n    static const k3d::string_t attached_geo_nametag_mt;\n\n    //Static Show Background MetaTag\n    static const k3d::string_t show_bg_nametag_mt;\n\n    //Static Show Background MetaData\n    static const k3d::string_t do_show_bg;\n    static const k3d::string_t do_not_show_bg;\n    \n    \n\t  \n};//MaterialObj  \n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n\n#endif // !MODULES_NGUI_MATERIAL_MANAGER_PANEL_MATERIALOBJ_H\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/PreviewCube.cpp",
    "content": "#include \"PreviewCube.h\"\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\n\nvoid PreviewCube::init(k3d::string_t _node_name, k3d::string_t _meta_nametag, k3d::irender_camera_frame* RenderEngine)\n{\n  //Create The Poly Cube\n  m_doc_node \n    = dynamic_cast<k3d::inode*>(k3d::plugin::create(\"Torus\", \n                                                    m_document_state->document(), \n                                                    _node_name));\n\n  // //Create The Mesh Instance\n//   mesh_instance = dynamic_cast<k3d::inode*>(k3d::plugin::create(\"MeshInstance\", \n//                                                     m_document_state->document(), \n//                                                     \"Preview Core::Geo::Cube Mesh Instance\"));\n\n\n\n//Scale The Torus To Fit In Camera\n//   k3d::point4 v1(0.7642975655067189, 0, 0, 0);\n//   k3d::point4 v2(0, 0.63264167284287942, 0.42885345098536998, 5.5511151231257827e-17);\n//   k3d::point4 v3(0, -0.42885345098536998, 0.63264167284287942, 0.75945015577859709);\n//   k3d::point4 v4(0, 0, 0, 1);\n\n//   k3d::matrix4 torus_transform(v1, v2, v3, v4);\n//   k3d::inode* torus_transformation = k3d::set_matrix(*m_doc_node, torus_transform);\n\n\n  //k3d::property::set_internal_value(*m_doc_node, \n   //                                 \"render_shadows\", false);\n  \n  //k3d::property::set_internal_value(*m_doc_node, \n  //                                  \"viewport_visible\", false);\n\n  //Create Meta Data\n  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_doc_node))\n    metadata->set_metadata_value(\"PreviewCore::nametag\", _meta_nametag);\n}\n\n\nvoid PreviewCube::defaultInit()\n{\n\n\n}\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/PreviewCube.h",
    "content": "#ifndef MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWCUBE_H\n#define MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWCUBE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include \"PreviewObj.h\"\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\nusing namespace k3d::ngui;\n\nclass PreviewCube : public PreviewObj\n{\n public:\n  \n  PreviewCube(k3d::string_t _combo_value, document_state *_document_state)\n    :PreviewObj(_combo_value, _document_state)\n    {\n    }\n\n  virtual ~PreviewCube()\n    {\n    }\n\n public:\n\n  //Initialization Of Object Contents Beyond Initial Values\n  void init(k3d::string_t _node_name, k3d::string_t _meta_nametag, k3d::irender_camera_frame* RenderEngine);\n\n  //Create The Default Preview Object For Material Preview (Preview Core::...)\n  void defaultInit();\n\n\n};//PreviewCube\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n\n#endif // !MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWCUBE_H\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/PreviewObj.cpp",
    "content": "#include \"PreviewObj.h\"\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\n//Static Definitions\nconst k3d::string_t PreviewObj::pview_geo_nametag_mt\n= \"PreviewCore::nametag\";\n\nconst k3d::string_t PreviewObj::sphere_md\n= \"p_sphere_geo\";\n\nconst k3d::string_t PreviewObj::cube_md\n= \"p_cube_geo\";\n\nconst k3d::string_t PreviewObj::torus_md\n= \"p_torus_geo\";\n\nconst k3d::string_t PreviewObj::sphere_node_name\n= \"Preview Core::Geo::Sphere\";\n\nconst k3d::string_t PreviewObj::cube_node_name \n= \"Preview Core::Geo::Cube\";\n\nconst k3d::string_t PreviewObj::torus_node_name\n= \"Preview Core::Geo::Torus\";\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/PreviewObj.h",
    "content": "#ifndef MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWOBJ_H\n#define MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWOBJ_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/irender_camera_frame.h>\n\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\nusing namespace k3d::ngui;\n\nclass PreviewObj\n{\n public:\n\n  PreviewObj(k3d::string_t _combo_value, document_state *_document_state)\n    :m_doc_node(0),\n    m_document_state(_document_state)\n    {\n    }\n\n  virtual ~PreviewObj()\n    {\n    }\n\n\n public:\n\n  //Abstract Functions To Be Used By Group & Profile Derivatives\n  virtual void init(k3d::string_t _node_name, k3d::string_t _meta_nametag, k3d::irender_camera_frame* RenderEngine) = 0;\n\n  //Create The Default Preview Object For Material Preview (Preview Core::...)\n  virtual void defaultInit() = 0;\n\n public:\n    k3d::inode \t\t*m_doc_node;\n    k3d::inode\t\t\t*mesh_instance;\n\n    document_state \t*m_document_state;\n\n    //Preview Geometry MetaTag\n    static const k3d::string_t pview_geo_nametag_mt;\n\n    //Preview Object MetaData\n    static const k3d::string_t sphere_md; \n    static const k3d::string_t cube_md; \n    static const k3d::string_t torus_md;\n\n\n    //Preview Object Node Name\n    static const k3d::string_t sphere_node_name; \n    static const k3d::string_t cube_node_name; \n    static const k3d::string_t torus_node_name;\n\n};//PreviewObj\n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n\n#endif // !MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWOBJ_H\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/PreviewSphere.cpp",
    "content": "#include \"PreviewSphere.h\"\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/ngui/pipeline.h>\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\n\nvoid PreviewSphere::init(k3d::string_t _node_name, k3d::string_t _meta_nametag, k3d::irender_camera_frame* RenderEngine)\n{\n  k3d::inode* sphere\n    = dynamic_cast<k3d::inode*>(k3d::plugin::create(\"QuadricSphere\", \n                                                    m_document_state->document(), \n                                                    _node_name));\n  return_if_fail(sphere);\n  m_doc_node = k3d::ngui::pipeline::instantiate_mesh(m_document_state->document(), *sphere);\n  return_if_fail(m_doc_node);\n  k3d::property::set_internal_value(*m_doc_node, \"gl_painter\", static_cast<k3d::inode*>(0));\n    \n  //Create Meta Data\n  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_doc_node))\n    metadata->set_metadata_value(\"PreviewCore::nametag\", _meta_nametag);\n  \n  // Make the node visible\n  k3d::inode_collection_sink* visible_nodes_sink = dynamic_cast<k3d::inode_collection_sink*>(RenderEngine);\n  return_if_fail(visible_nodes_sink);\n  k3d::make_visible(k3d::nodes_t(1, m_doc_node), *visible_nodes_sink);\n}\n\n\nvoid PreviewSphere::defaultInit()\n{\n\n\n}\n\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/PreviewSphere.h",
    "content": "#ifndef MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWSPHERE_H\n#define MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWSPHERE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include \"PreviewObj.h\"\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\nusing namespace k3d::ngui;\n\nclass PreviewSphere : public PreviewObj\n{\n public:\n  \n  PreviewSphere(k3d::string_t _combo_value, document_state *_document_state)\n    :PreviewObj(_combo_value, _document_state)\n    {\n    }\n\n  virtual ~PreviewSphere()\n    {\n    }\n\n public:\n\n  //Initialization Of Object Contents Beyond Initial Values\n  void init(k3d::string_t _node_name, k3d::string_t _meta_nametag, k3d::irender_camera_frame* RenderEngine);\n\n //Create The Default Preview Object For Material Preview (Preview Core::...)\n  void defaultInit();\n\n  \n\n};//PreviewSphere\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n\n\n#endif // !MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWSPHERE_H\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/PreviewTorus.cpp",
    "content": "#include \"PreviewTorus.h\"\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/ngui/pipeline.h>\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\n\nvoid PreviewTorus::init(k3d::string_t _node_name, k3d::string_t _meta_nametag, k3d::irender_camera_frame* RenderEngine)\n{\n\tk3d::inode* torus \n    = dynamic_cast<k3d::inode*>(k3d::plugin::create(\"QuadricTorus\", \n                                                    m_document_state->document(), \n                                                     _node_name));\n  return_if_fail(torus);\n\tm_doc_node = k3d::ngui::pipeline::instantiate_mesh(m_document_state->document(), *torus);\n\treturn_if_fail(m_doc_node);\n\tk3d::property::set_internal_value(*m_doc_node, \"gl_painter\", static_cast<k3d::inode*>(0));\n\n  //Scale The Torus To Fit In Camera\n  k3d::vector4 v1(0.7642975655067189, 0, 0, 0);\n  k3d::vector4 v2(0, 0.63264167284287942, 0.42885345098536998, 5.5511151231257827e-17);\n  k3d::vector4 v3(0, -0.42885345098536998, 0.63264167284287942, 0.75945015577859709);\n  k3d::vector4 v4(0, 0, 0, 1);\n\n  k3d::matrix4 torus_transform(v1, v2, v3, v4);\n  k3d::inode* torus_transformation = k3d::set_matrix(*m_doc_node, torus_transform);\n\n  //Create Meta Data\n  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_doc_node))\n    metadata->set_metadata_value(\"PreviewCore::nametag\", _meta_nametag);\n  \n  // Make the node visible\n\tk3d::inode_collection_sink* visible_nodes_sink = dynamic_cast<k3d::inode_collection_sink*>(RenderEngine);\n\treturn_if_fail(visible_nodes_sink);\n\tk3d::make_visible(k3d::nodes_t(1, m_doc_node), *visible_nodes_sink);\n}\n\n\nvoid PreviewTorus::defaultInit()\n{\n\n\n}\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/PreviewTorus.h",
    "content": "#ifndef MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWTORUS_H\n#define MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWTORUS_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include \"PreviewObj.h\"\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\nusing namespace k3d::ngui;\n\nclass PreviewTorus : public PreviewObj\n{\n public:\n  \n  PreviewTorus(k3d::string_t _combo_value, document_state *_document_state)\n    :PreviewObj(_combo_value, _document_state)\n    {\n    }\n\n  virtual ~PreviewTorus()\n    {\n    }\n\n public:\n\n  //Initialization Of Object Contents Beyond Initial Values\n  void init(k3d::string_t _node_name, k3d::string_t _meta_nametag, k3d::irender_camera_frame* RenderEngine);\n\n  //Create The Default Preview Object For Material Preview (Preview Core::...)\n  void defaultInit();\n \n  \n\n};//PreviewTorus\n\n\n}//namespace mechanics\n\n}//namespace material_manager\n\n}//namespace ngui\n\n}//namespace module\n\n\n#endif // !MODULES_NGUI_MATERIAL_MANAGER_PANEL_PREVIEWTORUS_H\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/RenderedImage.cpp",
    "content": "#include \"RenderedImage.h\"\n\n#include <iostream>\n#include <k3dsdk/log.h>\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\n//Static Variable Definitions\nconst k3d::string_t RenderedImage::m_holderImgFileName = \"renderingShader.png\";\nconst k3d::string_t RenderedImage::m_pview_bg_filename = \"material_pview_bg.png\";\n\n\n\nRenderedImage::RenderedImage(k3d::filesystem::path _imgPath)\n{\n  setImgFilePath(_imgPath);\n\n  //Remove Preview Render from tmp dir -> Required at uncertain close events occur\n  k3d::filesystem::remove(m_imgFilePath);\n\n  //Build Holder Image File Path (if no render preview file found)\n  m_imgHolderPath = k3d::share_path() / k3d::filesystem::generic_path(\"ngui/rasterized\") \n    / k3d::filesystem::generic_path(m_holderImgFileName);\n\n\n  //Build Pview Background Image Path\n  m_pview_bg_path = k3d::share_path() / k3d::filesystem::generic_path(\"ngui/rasterized\") \n    / k3d::filesystem::generic_path(m_pview_bg_filename);\n\n}\n\n\nRenderedImage::~RenderedImage()\n{\n  //Remove Preview Render from tmp dir\n  k3d::filesystem::remove(m_imgFilePath);\n}\n\n\nbool RenderedImage::on_expose_event(GdkEventExpose* event)\n{\n\ttry\n\t{\n     //Place The Background Image In First Layer\n     if(k3d::filesystem::exists(m_pview_bg_path))\n       {\n         //This Variable Is Temporary\n         const int image_dimension = 200;\n\n         //Tile The Bckground Image\n         for(int x_tile = 10; x_tile < image_dimension; x_tile += 100)\n           {\n             for(int y_tile = 10; y_tile < image_dimension; y_tile += 100)\n               {\n                 Glib::RefPtr<Gdk::Pixbuf> bg_image = Gdk::Pixbuf::create_from_file(m_pview_bg_path.native_filesystem_string());\n                 bg_image->render_to_drawable(get_window(), get_style()->get_black_gc(),\n                                              0, 0, x_tile, y_tile, bg_image->get_width(), bg_image->get_height(),\n                                              Gdk::RGB_DITHER_NONE, 0, 0);\n\n               }\n           }\n       }//if\n\n\n     //Place The Render Preview On Second Layer. (Background Will Display Only If This Has Alpha\n     if(k3d::filesystem::exists(m_imgFilePath))\n       {\n\n         Glib::RefPtr<Gdk::Pixbuf> image = Gdk::Pixbuf::create_from_file(m_imgFilePath.native_filesystem_string());\n         image->render_to_drawable(get_window(), get_style()->get_black_gc(),\n                                   0, 0, 10, 10, image->get_width(), image->get_height(),\n                                   Gdk::RGB_DITHER_NONE, 0, 0);\n       }\n     else\n       {\n\t\t\t//No Image File. Display Default Image Holder\n\t\t\tGlib::RefPtr<Gdk::Pixbuf> image = Gdk::Pixbuf::create_from_file(m_imgHolderPath.native_filesystem_string());\n\t\t\timage->render_to_drawable(get_window(), get_style()->get_black_gc(),\n                                   0, 0, 10, 10, image->get_width(), image->get_height(),\n                                   Gdk::RGB_DITHER_NONE, 0, 0);\n       }\n\t}\n   catch(...)\n     {\n\n       //Should not hopefully Get Here!\n     }\n\n   return true;\n\n}//on_expose_event\n\n\n\n} //namespace mechanics\n\n} //namespace material_manager\n\n} //namespace ngui\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/RenderedImage.h",
    "content": "#ifndef MODULES_NGUI_MATERIAL_MANAGER_PANEL_RENDEREDIMAGE_H\n#define MODULES_NGUI_MATERIAL_MANAGER_PANEL_RENDEREDIMAGE_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n\n#include <gtkmm/drawingarea.h>\n\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\nnamespace module\n{\nnamespace ngui\n{\nnamespace material_manager\n{\nnamespace mechanics\n{\n\nconst k3d::string_t holderImgFile  = \"renderingShader.png\";\n\nclass RenderedImage: public Gtk::DrawingArea\n{\n public:\n\n  RenderedImage(k3d::filesystem::path _imgPath);\n\n  ~RenderedImage();\n\t  \n public:\n\n  //Preview Reqest Signal Handler\n  bool onUpdatePreview();\n\n  //Variable Accessors\n  k3d::filesystem::path imgFilePath()\t\t\t{return m_imgFilePath;}\n  k3d::filesystem::path imgHolderPath()\t\t{return m_imgHolderPath;}\n\n  //Variable Mutators\n  void setImgFilePath(const k3d::filesystem::path &p)\t\t{m_imgFilePath = p;}\n  void setImgHolderPath(const k3d::filesystem::path &p)\t{m_imgHolderPath = p;}\n\n public:\n\n  k3d::filesystem::path m_imgFilePath;\n  k3d::filesystem::path m_imgHolderPath;\n  k3d::filesystem::path m_pview_bg_path;\n\n  static const k3d::string_t m_holderImgFileName;\n  static const k3d::string_t m_pview_bg_filename;\n\n protected:\n\n  //Override Deafult Signal Handler For Draw\n  virtual bool on_expose_event(GdkEventExpose* event);\n\n\n};//RenderedImage\n\n\n/* //Static Variable Definitions */\n/* const k3d::string_t RenderedImage::m_holderImgFileName = \"renderingShader.png\"; */\n\n/* RenderedImage::RenderedImage(k3d::filesystem::path _imgPath) */\n/* { */\n/*   setImgFilePath(_imgPath); */\n\n/*   //Remove Preview Render from tmp dir -> Required at uncertain close events occur */\n/*   k3d::filesystem::remove(m_imgFilePath); */\n\n/*   //Build Holder Image File Path (if no render preview file found) */\n/*   m_imgHolderPath = k3d::share_path() / k3d::filesystem::generic_path(\"ngui/rasterized\") */\n/*     / k3d::filesystem::generic_path(m_holderImgFileName); */\n/* } */\n\n\n/* RenderedImage::~RenderedImage() */\n/* { */\n/*   //Remove Preview Render from tmp dir */\n/*   k3d::filesystem::remove(m_imgFilePath); */\n/* } */\n\n\n/* bool RenderedImage::on_expose_event(GdkEventExpose* event) */\n/* { */\n/*   try */\n/*     { */\n/*       Glib::RefPtr<Gdk::Pixbuf> image = Gdk::Pixbuf::create_from_file(m_imgFilePath.native_filesystem_string()); */\n/*       image->render_to_drawable(get_window(), get_style()->get_black_gc(), */\n/*                                 0, 0, 10, 10, image->get_width(), image->get_height(), */\n/*                                 Gdk::RGB_DITHER_NONE, 0, 0); */\n/*     } */\n/*   catch(Glib::FileError) */\n/*     { */\n/*       //No Image File. Display Default Image Holder */\n/*       Glib::RefPtr<Gdk::Pixbuf> image = Gdk::Pixbuf::create_from_file(m_imgHolderPath.native_filesystem_string()); */\n/*       image->render_to_drawable(get_window(), get_style()->get_black_gc(), */\n/*                                 0, 0, 10, 10, image->get_width(), image->get_height(), */\n/*                                 Gdk::RGB_DITHER_NONE, 0, 0); */\n/*     } */\n/*   catch(Glib::Error) */\n/*     { */\n\n/*       //Should not hopefully Get Here! */\n/*     } */\n\n/*   return true; */\n/* }//on_expose_event */\n\n\n} //namespace mechanics\n\n} //namespace material_manager\n\n} //namespace ngui\n\n} //namespace module\n\n#endif // !MODULES_NGUI_MATERIAL_MANAGER_PANEL_RENDEREDIMAGE_H\n"
  },
  {
    "path": "modules/ngui_material_manager_panel/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n//\n// ---------------------\n//\n// Panel That Allows The User To Create / Modify Shaders For Different Renderers.\n// Artist Notes Are Also Availible\n//\n// Material Manager Panel Developed By Alex Curtis\n// Contact: alx.curtis@gmail.com\n\n#include <gtk/gtkmain.h>\n#include <gtkmm.h>\n#include <gtkmm/comboboxtext.h>\n#include <gtkmm/drawingarea.h>\n#include <gtkmm/frame.h>\n#include <gtkmm/label.h>\n#include <gtkmm/label.h>\n#include <gtkmm/menutoolbutton.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/separator.h>\n#include <gtkmm/textview.h>\n#include <gtkmm/toggletoolbutton.h>\n#include <gtkmm/toolbar.h>\n#include <gtkmm/treemodel.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/ilight_ri.h>\n#include <k3dsdk/ilight_shader_ri.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imaterial_ri.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/asynchronous_update.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/entry.h>\n#include <k3dsdk/ngui/hotkey_cell_renderer_text.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/image_toggle_button.h>\n#include <k3dsdk/ngui/panel.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/text.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\n#include <boost/assign/list_of.hpp>\n#include <iostream>\n#include <sstream>\n#include <time.h>\n\n#include \"RenderedImage.h\"\n#include \"MaterialGroup.h\"\n#include \"MaterialObj.h\"\n#include \"ContentPanel.h\"\n#include \"MaterialContentPanel.h\"\n#include \"GroupContentPanel.h\"\n\nusing namespace k3d::ngui;\nusing namespace k3d::data;\n\nnamespace module{\n\nnamespace ngui{\n\nnamespace material_manager{\n\nnamespace mechanics{\n  \n//Material Type Definitions\nconst k3d::string_t riMaterialStr \t= \"Renderman Materials\";\nconst k3d::string_t glMaterialStr \t= \"OpenGL Materials\";\nconst k3d::string_t otherStuffStr \t= \"Other Stuff\";\t\n\nclass Model\n{\npublic:\n\n  Model()\n    :m_rmangrp(riMaterialStr),\n     m_glgrp(glMaterialStr),\n     m_othergrp(otherStuffStr)\n  {\n  }\n\n  ~Model()\n  {\n  }\n\n\npublic:\n  void buildModel(document_state& DocumentState);\n  void clearModel();\n\npublic:\n  std::list<MaterialGroup*>     \tm_groups;\n\n  MaterialGroup \t\t\t\t\t\tm_rmangrp;\n  MaterialGroup \t\t\t  \t\t\tm_glgrp;\n  MaterialGroup \t\t\t\t\t\tm_othergrp;\n\n};//m_Model\n\nvoid Model::buildModel(document_state& DocumentState)\n{\n\n//Search m_doc_node Material For Attached Geometry\n //  if(k3d::imetadata* const metadata = dynamic_cast<k3d::imetadata*>(m_doc_node))\n//     {\n//       k3d::string_t value = metadata->get_metadata()[attached_geo_nametag_mt];\n\n//       k3d::inode *attached_geo = 0;\n          \n//       //Check If Sphere Attached\n//       if(value == PreviewObj::sphere_md)\n//         {\n//           //Check If Exists In Document\n//           if(checkDocForMeta(PreviewObj::pview_geo_nametag_mt, PreviewObj::sphere_node_name, &attached_geo, m_document_state))\n//             {\n//               if(attached_geo)\n//                 ;// m_preview_geo = dynamic_cast<k3d::inode*>(attached_geo);\n//             }\n//         }\n\n//       //Check If Cube Attached\n//       if(value == PreviewObj::cube_md)\n//         {\n//           ;\n\n//         }\n\n//       //Check If Torus Attached\n//       if(value == PreviewObj::torus_md)\n//         {\n//           ;\n\n//         }\n\n\n//     }//if\n//   else\n//     {\n//       //No Meta Data. Create & Attach Default Sphere\n      \n//       ;\n//     }\n\n\n\n  // if(checkDocForMeta(MaterialObj::attached_geo_nametag_mt, \n//                      camera_meta, &m_doc_node, m_document_state))\n//     {\n\n//       ;\n//     }\n\n\n\n  //Add Compulsory Groups To Group List\n  m_groups.push_back(&m_rmangrp);\n  m_groups.push_back(&m_glgrp);\n  m_groups.push_back(&m_othergrp);\n\n  //Iterate Through The Document Nodes Find Materials\n  k3d::inode_collection::nodes_t::const_iterator nodeIter \n    = DocumentState.document().nodes().collection().begin();\n\t\n  for(nodeIter; nodeIter != DocumentState.document().nodes().collection().end(); ++nodeIter)\n    {\n      //Check IF A Node Is A Material\n      if((*nodeIter)->factory().implements(typeid(k3d::imaterial)))\n        {\n          //Is It A Renderman Material\n          if((*nodeIter)->factory().implements(typeid(k3d::ri::imaterial)))\n            {\n              MaterialObj *renderman_matobj =\n                new MaterialObj(&m_rmangrp, (*nodeIter), riMaterialStr);\n\n              //Initialize The Material Object\n              renderman_matobj->init();\n\n              //Add Material To Renderman Group\n              m_rmangrp.addMaterial(renderman_matobj);\n            }\n\n          //Must Be An Uncatagorized Material\n          else\n            {\n              MaterialObj *other_matobj \n                = new MaterialObj(&m_othergrp, (*nodeIter), otherStuffStr);\n\n              //Initialize The Material Object\n              other_matobj->init();\n\n              //Add Material To Other Group\n              m_othergrp.addMaterial(other_matobj);\n            }\n\n        }//if\n    }//for\n  \n}//buildModel\n\n\nvoid Model::clearModel()\n{\n  std::list<MaterialGroup*>::iterator groupIter = m_groups.begin();\n  for(; groupIter != m_groups.end(); ++groupIter)\n    delete (*groupIter);      \n\n  //Ensure Clean Storage \n  m_groups.clear();\n}\n\n// [Implementation]*************************************************************\n\nclass Implementation : public k3d::ngui::asynchronous_update\n{\npublic:\n  Implementation(document_state& DocumentState) \n    :m_document_state(DocumentState),\n     m_model(new Model),\n     m_current_mat_node(0),\n     m_init(false),\n     add_group(\"Add\"),\n     remove_group(\"Remove\")\n  {\n  }\n\n  ~Implementation()\n  {\t\n    //Disconnect Any Existing Connection With Properties\n    m_pConnection.disconnect();\n  }\n\n  //Initialization Of Object Contents Beyond Initial Values\n  void init();\n\n\npublic:\n\n  //GTK Method Invoked On A Scheduled Panel Update\n  void on_update();\n\n  //Build The Interface\n  void buildGui();\n  void buildTree();\n  void buildContentPanel(Gtk::TreeModel::Row row, bool iMaterialGroup);\n\n  //Event Handlers (Tree)\n  void onNodesAdded(const k3d::inode_collection::nodes_t& Nodes) ;\n  void onNodesRemoved(const k3d::inode_collection::nodes_t& Nodes);\n  void onNodeRenamed(k3d::inode* const Node);\n  bool onNodeSelection(k3d::inode* const Node);\n\n  void on_add_button_button_clicked();\n  void on_remove_button_button_clicked();\n\t  \n  void onTreeRowChanged();\n\n  //Re-Render Preview Wrapper\n  void propertySignalRender(k3d::iunknown* t);\n\n  //Find Tree Row Based On 1st Argument\n  bool getRow(k3d::inode* const Node, Gtk::TreeIter& Row);\n\n  //Find Group Based On Given Material\n  bool getGroup(MaterialObj *matobj, Gtk::TreeIter& Row);\n\t\nprivate:\n\n  //Property Signal connection\n  sigc::connection \t\t\t\tm_pConnection;\n\npublic:\n\n  //GTK Widgets\n  Gtk::ScrolledWindow \t\t\tm_tree_scrolled_window;\n  Gtk::HPaned \t\t\t\t\t\tm_main_hpaned;\n  Gtk::TreeView \t\t\t\t\tm_tree;\n  Gtk::VBox \t\t\t\t\t\tm_tool_tree_cont;\n\n  //Toolbar Contents\n  Gtk::Toolbar \t\t\t\t\tm_toolbar; \n  Gtk::ToolButton add_group; //BIN\n  Gtk::ToolButton remove_group; //BIN\n\n  //Currently Selected Material Node\n  k3d::inode\t\t\t\t\t\t*m_current_mat_node;\n\n  //Signal When Control Grabs The Panel Focus\n  sigc::signal<void> \t\t\tm_panel_grab_signal;\n\n  //A Reference To The Owning Document\n  document_state& \t\t\t\tm_document_state;\n\t  \n  //Model That Stores Data\n  std::unique_ptr<Model> \t\t\tm_model;\n\n  //The Right Content Pane For The Panel\n  std::unique_ptr<ContentPanel> m_rpane_content;\n\n  //Flag To Hold Startup Routine Heads Up\n  bool\t\t\t\t\t\t\t\tm_init;\n\n  //Tree Model Used By Material Navigator\n  class columns :\n    public Gtk::TreeModel::ColumnRecord\n  {\n  public:\n    columns()\n    {\n      add(m_col_name);\n      add(m_col_icon);\n      add(m_col_ismg);\n      add(m_col_mgptr);\n      add(m_col_moptr);\n    }\n    Gtk::TreeModelColumn<MaterialGroup*> \t\t\t\t\tm_col_mgptr;\n    Gtk::TreeModelColumn<MaterialObj*> \t\t\t\t\tm_col_moptr;\n    Gtk::TreeModelColumn<Glib::ustring> \t\t\t\t\tm_col_name;\n    Gtk::TreeModelColumn<bool>\t\t    \t\t\t\t\tm_col_ismg;\n    Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > \tm_col_icon;\n  };\n\n  //Tree Related Variables\n  columns \t\t\t\t\t\t\t\t\tm_columns;\n  Glib::RefPtr<Gtk::TreeStore> \t\ttree_model;\n  Glib::RefPtr<Gtk::TreeSelection> \ttree_selection;\n\n\n};//Implementation\n\n\n\nvoid Implementation::init()\n{\n  //Currently In init\n  m_init = true;\n\n  //Create The Material Tree Model\n  tree_model = Gtk::TreeStore::create(m_columns);\n  m_tree.set_model(tree_model);\n  tree_selection = m_tree.get_selection();\n\n  //Tree Event Signal Connections\n  tree_selection->signal_changed()\n    .connect(sigc::mem_fun(*this,  &Implementation::onTreeRowChanged));\n\n  //Document Event Signal Connections\n  m_document_state.document().nodes().add_nodes_signal()\n    .connect(sigc::mem_fun(*this, &Implementation::onNodesAdded));\n\n  m_document_state.document().nodes().remove_nodes_signal()\n    .connect(sigc::mem_fun(*this, &Implementation::onNodesRemoved));\n\n  m_document_state.document().nodes().rename_node_signal()\n    .connect(sigc::mem_fun(*this, &Implementation::onNodeRenamed));\n\n \n//   m_document_state.view_node_properties_signal()\n//    .connect(sigc::mem_fun(*this, &Implementation::onNodeSelection));\n\n  //Tree Editing Signal Connections\n  add_group.signal_clicked()\n    .connect(sigc::mem_fun(*this, &Implementation::on_add_button_button_clicked));\n\n  //Create A Signal Connection For Remove Group Button\n  remove_group.signal_clicked()\n    .connect(sigc::mem_fun(*this, &Implementation::on_remove_button_button_clicked));\n\n\n  //Delete Model Data\n  m_model->clearModel();\n\n  //Rebuild Model Data\n  m_model->buildModel(m_document_state);\n\n  //Build The GTK GUI\n  buildGui();\n\n  //Hint To GTK To Update Interface\n  schedule_update();\n\n\n  //Try To Connect The Selected Node. (Otherwise Wont Work Until Re-Select)\n  k3d::inode_collection::nodes_t::const_iterator node_iter \n    = m_document_state.document().nodes().collection().begin();\n\n  bool selected_result = false;\n\t    \n  for(node_iter; node_iter != m_document_state.document().nodes().collection().end(); ++node_iter)\n    {\n      //Check If Node Is Selected\n      selected_result = selection::state(m_document_state.document()).is_selected(**node_iter);\n      if(selected_result)\n        {\n          onNodeSelection(*node_iter);\n          //if(onNodeSelection((*node_iter)))\n           //break;\n        }\n    }//for\n\n}//init\n\n\n\nvoid Implementation::on_update()\n{\n  //Clear The Tree Model\n  tree_model->clear();\n\n  //Rebuild Tree From Rebuilt Model\n  buildTree();\n\n}//on_update\n\n\n\nvoid Implementation::buildGui()\n{\n  //Setup The Material Tree\n  m_tree.set_headers_visible(false);\n  m_tree.set_reorderable(false);\n  Gtk::CellRendererText* const cell_text = new hotkey_cell_renderer_text();\n  cell_text->property_editable() = true;\n\n  //Add A Name Column To The Tree\n  Gtk::TreeViewColumn* const name_column = new Gtk::TreeViewColumn;\n  name_column->pack_start(*manage(cell_text), true);\n  name_column->add_attribute(cell_text->property_text(), m_columns.m_col_name);\n\n  //Add A Icon Column To The Tree\n  m_tree.append_column(\"icon\", m_columns.m_col_icon);\n  m_tree.append_column(*manage(name_column));\n\n  //Setup Tree Headers & Display Look & Feel Options\n  m_tree.set_headers_visible(false);\n  m_tree.set_rules_hint(true);  \t\n\n  //Setup the Window\n  m_tree_scrolled_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n   \n  //Add The Tree To The Scrolling Window\n  m_tree_scrolled_window.add(m_tree);\n\n  //Create & Embed Tree Toolbar\n  m_main_hpaned.add1(m_tool_tree_cont);\n  m_toolbar.append(add_group);\n  m_toolbar.append(remove_group);\n\n  //TOOLBAR NEEDS SORTING OUT\n  //m_tool_tree_cont.pack_start(m_toolbar, false, false, 0);\n\n  //Resize The Tree's Scroll Window To Fit Correctly\n  m_tree_scrolled_window.set_size_request(220, -1);\n\n  //Embed The Tree\n  m_tool_tree_cont.pack_start(m_tree_scrolled_window, true, true, 0);\n  \t  \n}//buildGui\n\n\n\nvoid Implementation::buildTree()\n{\n  //Iterate Through Known Groups & Build Tree Hierachy\n  std::list<MaterialGroup*>::const_iterator group_iter = m_model->m_groups.begin();\n\n  Gtk::TreeRow first_group_row;\n  bool on_first_row = true;\n\n  for(; group_iter !=  m_model->m_groups.end(); ++group_iter)\n    {\n      Gtk::TreeRow row = *tree_model->append();\n      row[m_columns.m_col_name] = (*group_iter)->name();\n      row[m_columns.m_col_ismg] = true;\n      row[m_columns.m_col_mgptr] = (*group_iter);\n      row[m_columns.m_col_moptr] = 0;\n\n      //Grab First Row For Groups\n      if(on_first_row)\n        {\n          first_group_row = row;\n          on_first_row = false;\n        }\n\n      //Build Each Groups Children Using Groups Associated Material Objects\n      std::list<MaterialObj*>::const_iterator matobj_iter \n        = (*group_iter)->materialBegin();\n\n      for(; matobj_iter !=  (*group_iter)->materialEnd(); ++matobj_iter)\n        {\n          //Create Row & USe MaterialObj To Fill In The Blanks\n          Gtk::TreeModel::Row childrow = *(tree_model->append(row.children()));\n          childrow[m_columns.m_col_name] = (*matobj_iter)->name();\n          childrow[m_columns.m_col_ismg] = false;\n          childrow[m_columns.m_col_mgptr] = 0;\n          childrow[m_columns.m_col_moptr] = (*matobj_iter);\n          childrow[m_columns.m_col_icon] \n            = quiet_load_icon((*matobj_iter)->docNodeName(), Gtk::ICON_SIZE_MENU);\n        }//for\t\n\t\n    }//for\n\n  //Ensure Tree Inital Selection Is The First Row \n  if(!on_first_row)\n    tree_selection->select(first_group_row);\t   \n\n}//buildTree\n\n    \n\nvoid Implementation::onTreeRowChanged()\n{\n  //Get The Current Row Selection\n  Gtk::TreeModel::iterator iter = tree_selection->get_selected();\n  \n  if(iter)\n    {\n      Gtk::TreeModel::Row row = *iter;\n\n      //Is The Selection A Material Group\n      if(row[m_columns.m_col_ismg])\n        {\n          k3d::log() << row->get_value(m_columns.m_col_mgptr)->name() << std::endl;\n          buildContentPanel(row, true);\n\n\n          k3d::inode_collection::nodes_t::const_iterator node_iter \n            = m_document_state.document().nodes().collection().begin();\n\n          bool selected_result = false;\n     \n          // for(node_iter; node_iter != m_document_state.document().nodes().collection().end(); ++node_iter)\n//             {\n//               //Check If Node Selected\n//               selected_result = m_document_state.is_selected((*node_iter));\n\n//               if(selected_result)\n//             //     {\n//                   m_init = true;\n//                   onNodeSelection(m_current_mat_node);\n                  //}\n      \n                  // }\n        }\n\n      //Must Be A Material Object\n      else\n        {\n          //Emit Selection Signal For Other Panels (Node Properties Panel etc)\n          k3d::inode* const selectedNode \n            = (row->get_value(m_columns.m_col_moptr))->docNode();\n\n          selection::state(m_document_state.document()).select(*selectedNode);\n\n          //Build The GTK GUI Context\n          buildContentPanel(row, false);\n\n          onNodeSelection(const_cast<k3d::inode*>(selectedNode));\n        }\n\n\n    }//if\n\n}//onTreeRowChanged\n\n\n\nvoid Implementation::buildContentPanel(Gtk::TreeModel::Row row, bool m_col_ismg)\n{\n  //Check If Building Group Panel Or Material Object Panel\n  if(m_col_ismg)\n    {\n      //Delete Object. Create New GroupContentPanel Through Smart Pointer\n      m_rpane_content \n        = std::unique_ptr<ContentPanel>\n        (new GroupContentPanel(&m_main_hpaned, \n                               row->get_value(m_columns.m_col_mgptr), \n                               &m_document_state));\n\n      //Initialise GroupContentPanel\n      m_rpane_content->init();\n    }\n\n  else\n    {\n      //Delete Object. Create New MaterialContentPanel Through Smart Pointer\n      m_rpane_content \n        = std::unique_ptr<ContentPanel>\n        (new MaterialContentPanel(&m_main_hpaned, \n                                  row->get_value(m_columns.m_col_moptr), \n                                  &m_document_state));\n\n      //Initialise MaterialContentPanel\n      m_rpane_content->init();\n\n    }\n\n  //Build The Content Pane From Corrected Pointer\n  m_rpane_content->buildPanel();\n\n}//buildContentPanel\n\n\n\n\nvoid Implementation::onNodesAdded(const k3d::inode_collection::nodes_t& Nodes)\n{\n  //Flag Used For Possible Panel Update\n  bool material_added = false;\n\n  //Iterate Through Each Node & Add Appropriate To The Tree Hierachy\n  for(k3d::inode_collection::nodes_t::const_iterator node_iter \n        = Nodes.begin(); node_iter != Nodes.end(); ++node_iter)\n    {\n      //Check If Is A Material Type\n      if((*node_iter)->factory().implements(typeid(k3d::imaterial))){\n\n        //Set Flag (Material Added) > Will Try To Update Panel\n        material_added = true;\n\n        Gtk::TreeNodeChildren rows = tree_model->children();\n        Gtk::TreeRow new_row;\n        Gtk::TreeIter row = rows.begin();\n\n        k3d::string_t typeStr = \"\";\n        MaterialGroup *groupPtr = 0;\n\n        //Place Renderman Material\n        if((*node_iter)->factory().implements(typeid(k3d::ri::imaterial))){\n          typeStr = riMaterialStr;\n          groupPtr = &(m_model->m_rmangrp);\n        }\n\n        //Place Other Material\n        else{\n          typeStr = otherStuffStr;\n          groupPtr = &(m_model->m_othergrp);\n        }\n\n        //Type Of Node Found. Now Find It In The Tree & Insert\n        for(; row != rows.end(); ++row)\n          {\n            if(row->get_value(m_columns.m_col_name) == typeStr)\n              {\n                //Create A New MaterialObj For Material Node\n                MaterialObj *newSObject \n                  = new MaterialObj(groupPtr, *node_iter, typeStr);\n                \n                //Initalize The New MaterialObj\n                newSObject->init();\n\n                //Add The MaterialObj To The Groups Listing\n                groupPtr->addMaterial(newSObject);\n\n                //Create The Tree Entry\n                new_row = *tree_model->append(row->children());\n                new_row[m_columns.m_col_moptr] = newSObject;\n                new_row[m_columns.m_col_mgptr] = 0;\n                new_row[m_columns.m_col_ismg] = false;\n                new_row[m_columns.m_col_name] = (*node_iter)->name();\n                new_row[m_columns.m_col_icon] \n                  = quiet_load_icon((*node_iter)->factory().name(), \n                                    Gtk::ICON_SIZE_MENU);\n\n                //Row Found. No Need To Continue Searching\n                break;\n\n              }//if\n          }//for\n      }//if\n    }//for\n\n  //Check If Material Was Added >> If So Update Panel Only If Group\n  if(material_added)\n    {\n      //Get The Selected Tree Row\n      Gtk::TreeModel::iterator iter = tree_selection->get_selected();\n      if(iter)\n        {\n          Gtk::TreeModel::Row row = *iter;\n\n          //Build Content Panel Only If Group Type Selected\n          if(row[m_columns.m_col_ismg])\n            buildContentPanel(row, true);\n   \n        }//if\n    }//if\n\n}//onNodesAdded\n\n\n\n\nvoid Implementation::onNodesRemoved(const k3d::inode_collection::nodes_t& Nodes)\n{\n  //Flag For Possible Panel Update\n  bool material_removed = false;\n\n  k3d::inode_collection::nodes_t::const_iterator node_iter = Nodes.begin();\n\n  for(; node_iter != Nodes.end(); ++node_iter)\n    {       \n      //Check If Is A Material Type First\n      if((*node_iter)->factory().implements(typeid(k3d::imaterial)))\n        {\n          //Set Flag (Material Added) > Will Try To Update Panel\n          material_removed = true;\n        }\n\n      Gtk::TreeIter row;\n      bool row_result = getRow(*node_iter, row);\n\n      if(row_result)\n        {\n\t    \n          MaterialObj *tmpSObj = row->get_value(m_columns.m_col_moptr);\n          MaterialGroup *grpPtr = 0;\n\n          if(tmpSObj)  \n            grpPtr = tmpSObj->groupParent();\n\n          \n          //If This Node Is The Selected Tree Row. Back Out To Parent Group\n          Gtk::TreeModel::iterator iter = tree_selection->get_selected();\n          if(iter)\n            {\n              Gtk::TreeModel::Row selected_row = *iter;\n              if(tmpSObj->m_doc_node == *node_iter)\n                {\n                  //Gtk::TreeIter parent_group_row;\n                  //getRow(, parent_group_row)\n                  ; //tree_selection->select(parent_group_row);\n                }\n\n         \n            }//if\n          \n\t      \n          //Erase The Material Node From Tree\n          tree_model->erase(row);\t\n    \n          //Delete In Stored Model\n          if(grpPtr)\n            grpPtr->removeMaterial(tmpSObj);\n\n        }//if\n\t    \n    }//for\n\n  //Rebuild Currently Selected Pane. Only If Material Removed\n  if(material_removed)\n    {\n      //Get Selected Row In Tree\n      Gtk::TreeModel::iterator iter = tree_selection->get_selected();\n      if(iter)\n        {\n          Gtk::TreeModel::Row row = *iter;\n          if(row[m_columns.m_col_ismg])\n            buildContentPanel(row, true);\n      \t\t\n        }//if\n    }//if\n\n}//onNodesRemoved\n\n\n\n\nvoid Implementation::onNodeRenamed(k3d::inode* const Node)\n{\n  Gtk::TreeIter row;\n  \n  //Find The Row On Tree That Has Pointer To Node\n  bool row_result = getRow(Node, row);\n\n  if(row_result)\n    {\n      //Rename That Row With The New Node Name\n      (*row)[m_columns.m_col_name] = Node->name();\n\n      //Rename In Stored Model\n      (row->get_value(m_columns.m_col_moptr))->setName(Node->name());\n    }\n\n}//onNodeRenamed\n\n\n\nbool getGroup(MaterialObj *matobj, Gtk::TreeIter& Row)\n{\n  bool result = false;\n\n //  //Go Through Each Group And Try To Find MaterialObj\n//   std::list<MaterialGroup*>::const_iterator grp_iter\n//     = m_model->m_groups.begin();\n\n  \n\n//   for(; grp_iter != m_model->m_groups.end(); grp_iter++)\n//     {\n//       if((*grp_iter)->findMaterial(matobj))\n\n//     }//for\n\n  return result;\n}\n\n\n\nbool Implementation::getRow(k3d::inode* const Node, Gtk::TreeIter& Row)\n{\n  Gtk::TreeNodeChildren rows = tree_model->children();\n\n  //Iterate Through Each Row (Parent Rows)\n  Gtk::TreeIter parent_iter = rows.begin();\n  for(; parent_iter != rows.end(); parent_iter++)\n    {\n      //Iterate Through Each Child Of Parent\n      Gtk::TreeIter children_iter = parent_iter->children().begin();\n      for(; children_iter != parent_iter->children().end(); children_iter++)\n        {\n          //Check If material Object and Not Group\n          if(children_iter->get_value(m_columns.m_col_moptr) \n             && !(children_iter->get_value(m_columns.m_col_ismg)))\n            {\n              //Check If Node Ptr Matches The Current Node Argument\n              if((children_iter->get_value(m_columns.m_col_moptr)->docNode()) == Node)\n                {\n                Row = children_iter;\n                return true;\n            }\n\n          }//if\n\n        }//for\n    }//for\n\n  //No Node Found On Tree\n  return false;\n\n}//onNodeRenamed\n\n\n\n\nbool Implementation::onNodeSelection(k3d::inode* const Node)\n{\n  //return result (if Not Material)\n  bool result = false;\n\n  //Disconnect Any Existing Connection With Properties\n  m_pConnection.disconnect();\n\n\n  //Check If Node Is A Renderman Material\n  if((Node)->factory().implements(typeid(k3d::ri::imaterial))){\n\n    //Set Current Node Selected Member Variable (Used In Single Render)\n    m_current_mat_node = Node;\n    result = true;\n\n    //Check If This Function was Invoked By init()\n    if(m_init)\n      {\n        //Set Flag Back To False >> init() only called once\n        m_init = false;\n\n        //THIS IS NOT IDEAL. NEEDS FIXING************V\n\n        //Create Connection For Node Change\n        k3d::inode_change_signal *n_sig \n          = dynamic_cast<k3d::inode_change_signal*>(Node);\n\n        if(n_sig){\n          m_pConnection \n            = n_sig->connect_node_changed_signal(sigc::mem_fun(*this, \n                                                               &Implementation\n                                                               ::propertySignalRender));\n        }\n      }\n    else\n      {\n        //Get The Current Row Selection\n        Gtk::TreeModel::iterator iter = tree_selection->get_selected();\n\n        Gtk::TreeModel::Row row = *iter;\n\n        //Check If The Selected Row In Tree IS A Valid Pointer\n        if(iter)\n          {\n            k3d::inode *selected_node = 0;\n\n            //Check If Group Display Or Profile Display\n            if(row->get_value(m_columns.m_col_ismg))\n              {\n                //Check If Material Is Present With Node\n                if(m_rpane_content->findMaterial(Node))\n                  {\n                    selected_node = Node;\n                  }\n                else\n                  {\n                    selected_node = 0;\n                  }\n                //selected_node = 0;\n              }\n            //Material Profile Displayed (MaterialObj)\n            else\n              {\n                selected_node = (row->get_value(m_columns.m_col_moptr))->m_doc_node;\n              }\n          \n\n            //Check If Selected Node's \"Node Pointer\" Equals Argument Pointer\n            if(selected_node && selected_node == Node)\n              {\n            \n                //Create Connection For Node Change\n                k3d::inode_change_signal *n_sig \n                  = dynamic_cast<k3d::inode_change_signal*>(Node);\n\n\n                if(n_sig){\n                  m_pConnection \n                    = n_sig->connect_node_changed_signal(sigc::mem_fun(*this, \n                                                                       &Implementation\n                                                                       ::propertySignalRender));\n\n                  k3d::log() << \"Property Contected!!!!!!!!!!!!!!!!!!!!!!!!!!\" << std::endl;\n                }\n                else\n                  {\n                    k3d::log() << \"Property NOT Contected!!!!!!!!!!!!!!!!!!!!!!!!!!\" << std::endl;\n                  }\n\n              }//if\n\n            else\n              k3d::log() << \"DEBUG: MATERIAL BUT NOT SELECTED MATERIAL\" << std::endl;\n\n\n          }//if\n      }\n  }\n\n  return result;\n\n  }//onNodeSelection \n\n\n\nvoid Implementation::propertySignalRender(k3d::iunknown* t)\n{\n  //Render The Selected Node\n  if(m_current_mat_node)\n    m_rpane_content->renderSinglePreview(m_current_mat_node);\n}\n\n\n        void Implementation::on_add_button_button_clicked()\n        {\n          k3d::log() << \" Add Button Pressed\" << std::endl;\n\n          //Create & Embed New Group\n          MaterialGroup *newGroup = new MaterialGroup(\"New Group\");\n          m_model->m_groups.push_back(newGroup);\n\n          //Add New Group To The Tree\n          Gtk::TreeRow row = *tree_model->append();\n          row[m_columns.m_col_name] = newGroup->name();\n          row[m_columns.m_col_ismg] = true;\n          row[m_columns.m_col_mgptr] = newGroup;\n          row[m_columns.m_col_moptr] = 0;\n\n        }//on_add_button_button_clicked\n\n\n\n        void Implementation::on_remove_button_button_clicked()\n        {\n\n          //Get The Currently Selected Row (Group)\n          Gtk::TreeModel::iterator iter = tree_selection->get_selected();\n          if(iter) //If anything is selected\n            {\n              Gtk::TreeModel::Row row = *iter;\n\n              //Is It A Group?\n              if(row[m_columns.m_col_ismg])\n                {\n\t\t  \n                  k3d::log() << \" Remove Button Pressed... Will Delete Group (Eventually :) )\" << std::endl;\n\n                }//if\n            }//if\n\n        }//on_remove_button_button_clicked\n\n\n} //namespace mechanics\n\n\n// [Panel]************************************************************************************\n     \nclass Panel :\n\tpublic k3d::ngui::panel::control,\n\tpublic Gtk::VBox\n{\n  //baseContainer is the preview & ctrl container\n  typedef Gtk::VBox base_cont_t;\n\npublic:\n  Panel() \n    :base_cont_t(false, 0),\n     m_implementation(0)\n  {\n  }\n\n  ~Panel()\n  {\n    delete m_implementation;\n  }\n\n  void initialize(document_state& _document_sate)\n  {\n    //Create New Implementation Object\n    m_implementation = new mechanics::Implementation(_document_sate);\n    m_implementation->init();\n\n    //Pack Implementation Into This Panel\n    pack_start(m_implementation->m_main_hpaned, Gtk::PACK_EXPAND_WIDGET);\n\n    show_all();\n  }\n\n  const k3d::string_t panel_type()\n  {\n    return get_factory().name();\n  }\n\n  sigc::connection connect_focus_signal(const sigc::slot<void>& Slot)\n  {\n    return m_implementation->m_panel_grab_signal.connect(Slot);\n  }\n\n\n  static k3d::iplugin_factory& get_factory()\n  {\n    static k3d::application_plugin_factory<Panel> \n      factory(k3d::uuid(0xd363f420, 0x7240b35e, 0x7cf38788, 0xda06e8e6),\n              \"NGUIMaterialManagerPanel\",\n              _(\"Material Manager Panel\"),\n              \"NGUI Panel\",\n              k3d::iplugin_factory::EXPERIMENTAL,\n              boost::assign::map_list_of(\"ngui:component-type\", \"panel\")(\"ngui:panel-label\", \"Material Manager\"));\n\n    return factory;\n  }\n\nprivate:\n\n  mechanics::Implementation* m_implementation;\n\n};//Panel\n\n      \n} // namespace material_manager\n\n} // namespace ngui\n\n} // namespace module\n\n\n//Register The Plugin (K-3D)*****************************************************\nK3D_MODULE_START(Registry)\n  Registry.register_factory(module::ngui::material_manager::Panel::get_factory());\nK3D_MODULE_END\n//*******************************************************************************\n\n"
  },
  {
    "path": "modules/ngui_mesh_control/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-mesh-control)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-mesh-control)\n\n"
  },
  {
    "path": "modules/ngui_mesh_control/control.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/dependencies.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/custom_property_control.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/entry.h>\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/persistent_lookup.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/type_registry.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/menu.h>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/mpl/for_each.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <gtk/gtkmain.h>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace mesh\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a custom property-control for NURBS knot-vectors\nclass control :\n\tpublic k3d::ngui::custom_property::control,\n\tpublic k3d::iunknown,\n\tpublic Gtk::VBox\n{\npublic:\n\tcontrol() :\n\t\tGtk::VBox()\n\t{\n\t}\n\n\t~control()\n\t{\n\t}\n\n\tvoid initialize(document_state& DocumentState, k3d::iproperty& Property)\n\t{\n\t\tGtk::Button* const menu_button = new Gtk::Button(_(\"Mesh Options\"));\n\t\tmenu_button->signal_clicked().connect(sigc::bind(sigc::mem_fun(*this, &control::on_choose), &Property));\n\n\t\tpack_start(*Gtk::manage(menu_button), Gtk::PACK_EXPAND_WIDGET);\n\t}\n\n\tvoid on_choose(k3d::iproperty* const Property)\n\t{\n\t\tconst k3d::mesh* const mesh = k3d::property::pipeline_value<k3d::mesh*>(*Property);\n\t\tif(!mesh)\n\t\t\treturn;\n\t\t\t\n\t\tm_menu.reset(new Gtk::Menu());\n\n\t\tGtk::MenuItem* const save_mesh = new Gtk::MenuItem(_(\"Save Mesh ...\"));\n\t\tsave_mesh->signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &control::on_save_mesh), mesh));\n\t\tm_menu->items().push_back(*manage(save_mesh));\n\n\t\tGtk::MenuItem* const save_detailed_dotfile = new Gtk::MenuItem(_(\"Save GraphViz (.dot) file ...\"));\n\t\tsave_detailed_dotfile->signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &control::on_save_dotfile), mesh));\n\t\tm_menu->items().push_back(*manage(save_detailed_dotfile));\n\n\t\tm_menu->show_all();\n\t\tm_menu->popup(1, gtk_get_current_event_time());\n\t}\n\n\tvoid on_save_mesh(const k3d::mesh* const Mesh)\n\t{\n\t\tk3d::filesystem::path output_path;\n\t\t{\n\t\t\tfile_chooser_dialog dialog(_(\"Save mesh file:\"), \"k3d\", Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\t\tif(!dialog.get_file_path(output_path))\n\t\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::filesystem::path root_path = output_path.branch_path();\n\t\tk3d::dependencies dependencies;\n\t\tk3d::persistent_lookup lookup;\n\t\tk3d::ipersistent::save_context context(root_path, dependencies, lookup);\n\n\t\tk3d::xml::element xml(\"k3dml\");\n\t\tk3d::xml::element& xml_mesh = xml.append(k3d::xml::element(\"mesh_arrays\"));\n\t\tk3d::xml::save(*Mesh, xml_mesh, context);\n\n\t\tk3d::filesystem::ofstream stream(output_path);\n\t\tstream << k3d::xml::declaration() << xml << std::endl;\n\t}\n\n  template<typename ContainerT>\n  const k3d::string_t dot_array_vertex(const ContainerT& Container)\n  {\n    std::ostringstream buffer;\n//    buffer << \"v\" << Container.get() << \" [label=\\\"{|||...|}\\\"]\";\n//    buffer << \"v\" << Container.get() << \" [label=\\\"{Array}\\\"]\";\n    buffer << \"v\" << Container.get() << \" [label=\\\"{\" << Container->type_string() << \" array}\\\"]\";\n    return buffer.str();\n  }\n\n  template<typename ContainerT>\n  const k3d::string_t dot_array_reference(const ContainerT& Container)\n  {\n    std::ostringstream buffer;\n    buffer << \"v\" << Container.get();\n    return buffer.str();\n  }\n\n\tvoid on_save_dotfile(const k3d::mesh* const Mesh)\n\t{\n\t\tk3d::filesystem::path output_path;\n\t\t{\n\t\t\tfile_chooser_dialog dialog(_(\"Save Mesh as GraphViz .dot file:\"), \"dotfile\", Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\t\tif(!dialog.get_file_path(output_path))\n\t\t\t\treturn;\n\t\t}\n\n\t\tk3d::filesystem::ofstream stream(output_path);\n\n    stream << k3d::standard_indent << \"digraph\\n\";\n    stream << k3d::standard_indent << \"{\\n\";\n    stream << k3d::push_indent;\n\n    stream << k3d::standard_indent << \"graph [rankdir=\\\"LR\\\"]\\n\";\n    stream << k3d::standard_indent << \"node [shape=\\\"record\\\" fontname=\\\"Helvetica\\\" fontsize=12 height=0 width=0]\\n\";\n    stream << k3d::standard_indent << \"edge [fontname=\\\"Helvetica\\\" fontsize=10]\\n\";\n\n    stream << k3d::standard_indent << \"v\" << Mesh << \" [label=\\\"<geometry>Geometry|<points>points|<point_selection>point_selection|<point_attributes>point_attributes|<primitives>primitives\\\"]\\n\";\n    stream << k3d::push_indent;\n\n    stream << k3d::standard_indent << \"subgraph cluster_0\\n\";\n    stream << k3d::standard_indent << \"{\\n\";\n    stream << k3d::push_indent;\n    stream << k3d::standard_indent << \"color=white;\\n\";\n\n    if(Mesh->points)\n\t\t{\n\t\t\tstream << k3d::standard_indent << dot_array_vertex(Mesh->points) << \"\\n\";\n\t\t\tstream << k3d::standard_indent << \"v\" << Mesh << \":points:e -> \" << dot_array_reference(Mesh->points) << \":w\\n\";\n\t\t}\n\n    if(Mesh->point_selection)\n\t\t{\n\t\t\tstream << k3d::standard_indent << dot_array_vertex(Mesh->point_selection) << \"\\n\";\n\t\t\tstream << k3d::standard_indent << \"v\" << Mesh << \":point_selection:e -> \" << dot_array_reference(Mesh->point_selection) << \":w\\n\";\n\t\t}\n\n    stream << k3d::pop_indent;\n    stream << k3d::standard_indent << \"}\\n\";\n \n    for(k3d::mesh::primitives_t::const_iterator primitive = Mesh->primitives.begin(); primitive != Mesh->primitives.end(); ++primitive)\n    { \n\t\t\tstream << k3d::standard_indent << \"v\" << (*primitive).get() << \" [label=\\\"<primitive>Primitive \\\\\\\"\" << (*primitive)->type << \"\\\\\\\"|<structure>structure|<attributes>attributes\\\"]\\n\";\n\t\t\tstream << k3d::standard_indent << \"v\" << Mesh << \":primitives:e -> \" << \"v\" << (*primitive).get() << \":primitive:w\\n\";\n\t\t\tstream << k3d::push_indent;\n\n      for(k3d::mesh::named_tables_t::const_iterator named_table = (**primitive).structure.begin(); named_table != (**primitive).structure.end(); ++named_table)\n      {\n        const k3d::string_t name = (*named_table).first;\n        const k3d::mesh::table_t& table = (*named_table).second;\n\n        stream << k3d::standard_indent << \"v\" << &table;\n        stream << \" [label=\\\"<name>Table \\\\\\\"\" << name << \"\\\\\\\"\";\n\n        for(k3d::mesh::table_t::const_iterator array = table.begin(); array != table.end(); ++array)\n          stream << \"|<\" << array->first << \">\" << \"\\\\\\\"\" << array->first << \"\\\\\\\"\";\n\n        stream << \"\\\"]\\n\";\n        stream << k3d::standard_indent << \"v\" << (*primitive).get() << \":structure:e -> \" << \"v\" << &table << \":name:w\\n\";\n        stream << k3d::push_indent;\n\n        for(k3d::mesh::table_t::const_iterator array = table.begin(); array != table.end(); ++array)\n        {\n          stream << k3d::standard_indent << dot_array_vertex(array->second) << \"\\n\";\n          stream << k3d::standard_indent << \"v\" << &table << \":\" << array->first << \":e -> \" << dot_array_reference(array->second) << \":w\\n\";\n        }\n\n        stream << k3d::pop_indent;\n      }\n\n      for(k3d::mesh::named_tables_t::const_iterator named_table = (**primitive).attributes.begin(); named_table != (**primitive).attributes.end(); ++named_table)\n      {\n        const k3d::string_t name = (*named_table).first;\n        const k3d::mesh::table_t& table = (*named_table).second;\n\n        stream << k3d::standard_indent << \"v\" << &table;\n        stream << \" [label=\\\"<name>Table \\\\\\\"\" << name << \"\\\\\\\"\";\n\n        for(k3d::mesh::table_t::const_iterator array = table.begin(); array != table.end(); ++array)\n          stream << \"|<\" << array->first << \">\" << \"\\\\\\\"\" << array->first << \"\\\\\\\"\";\n\n        stream << \"\\\"]\\n\";\n        stream << k3d::standard_indent << \"v\" << (*primitive).get() << \":attributes:e -> \" << \"v\" << &table << \":name:w\\n\";\n        stream << k3d::push_indent;\n\n        for(k3d::mesh::table_t::const_iterator array = table.begin(); array != table.end(); ++array)\n        {\n          stream << k3d::standard_indent << dot_array_vertex(array->second) << \"\\n\";\n          stream << k3d::standard_indent << \"v\" << &table << \":\" << array->first << \":e -> \" << dot_array_reference(array->second) << \":w\\n\";\n        }\n\n        stream << k3d::pop_indent;\n      }\n\n\t\t\tstream << k3d::pop_indent;\n    }\n\n    stream << k3d::pop_indent;\n    stream << k3d::pop_indent;\n    stream << k3d::standard_indent << \"}\\n\";\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<control> factory(\n\t\t\tk3d::uuid(0x8faf4941, 0x674986ba, 0x5cfbeead, 0xae08da4e),\n\t\t\t\"NGUIMeshControl\",\n\t\t\t_(\"Provides a standard control for mesh properties.\"),\n\t\t\t\"NGUI Control\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"property-control\")(\"ngui:property-type\", \"k3d::mesh*\"));\n\n\t\treturn factory;\n\t}\n\n\tboost::scoped_ptr<Gtk::Menu> m_menu;\n};\n\n} // namespace mesh\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::mesh::control::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_morph_points_page/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-morph-points-page)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-morph-points-page)\n\n"
  },
  {
    "path": "modules/ngui_morph_points_page/page.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/custom_property_page.h>\n\n#include <gtkmm/label.h>\n\n#include <boost/assign/list_of.hpp>\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace morph_points\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// page\n\n/// Provides a custom plugin-page for the MorphPoints modifier\nclass page :\n\tpublic k3d::ngui::custom_property_page::control,\n\tpublic k3d::iunknown\n{\npublic:\n\tpage() :\n\t\tm_label(\"MorphPoints custom property page\")\n\t{\n\t}\n\n\tGtk::Widget& get_widget(k3d::ngui::document_state& DocumentState, k3d::inode& Node)\n\t{\n\t\tm_label.show();\n\t\treturn m_label;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<page> factory(\n\t\t\tk3d::uuid(0xb9897383, 0xba485a29, 0x9166ff98, 0xb4cb6be6),\n\t\t\t\"NGUIMorphPointsPage\",\n\t\t\t_(\"Provides a custom property page for the MorphPoints modifier.\"),\n\t\t\t\"NGUI Page\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"plugin-page\")(\"ngui:plugin-type\", \"MorphPoints\"));\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tGtk::Label m_label;\n};\n\n} // namespace morph_points\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::morph_points::page::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_node_list_panel/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-node-list-panel)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-node-list-panel)\n\n"
  },
  {
    "path": "modules/ngui_node_list_panel/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <gtkmm/box.h>\n#include <gtkmm/liststore.h>\n#include <gtkmm/menu.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/treeview.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/inode_name_map.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/asynchronous_update.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/hotkey_cell_renderer_text.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/interactive.h>\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/panel.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/utility.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <set>\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace node_list\n{\n\n/*\nnamespace detail\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// implementation\n\nclass implementation :\n\tpublic k3d::ngui::asynchronous_update\n{\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState),\n\t\tm_filter_policy(new all_nodes_filter_policy(DocumentState.document())),\n\t\tm_layout_policy(new sort_by_label_layout_policy()),\n\t\tm_document_selection_change_mutex(false),\n\t\tm_node_list_selection_change_mutex(false)\n\t{\n\t\t// Connect signals\n\t\tm_view.signal_button_press_event().connect(sigc::mem_fun(*this, &implementation::on_button_press_event), false);\n\n\t\t// Update node selection according to document's\n\t\tm_document_state.document_selection_change_signal().connect(sigc::mem_fun(*this, &implementation::on_document_selection_changed));\n\n\t\tschedule_update();\n\t}\n\n\t/// Looks-up a node for a given row\n\tk3d::inode* const get_node(const Gtk::TreeIter& Row)\n\t{\n\t\treturn (*Row)[m_columns.node];\n\t}\n\n\tbool on_button_press_event(GdkEventButton* Event)\n\t{\n\t\tif(3 == Event->button)\n\t\t{\n\t\t\tGtk::TreeViewColumn* column = 0;\n\t\t\tint cell_x = 0;\n\t\t\tint cell_y = 0;\n\t\t\tm_view.get_path_at_pos(static_cast<int>(Event->x), static_cast<int>(Event->y), m_context_menu_path, column, cell_x, cell_y);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/// This mutex blocks node list update triggered by document selection update (true when updating document selection from new node list selection)\n\tbool m_document_selection_change_mutex;\n\t/// This mutex blocks document selection update triggered by node list update (true when updating node list selection from new document selection)\n\tbool m_node_list_selection_change_mutex;\n\n\n};\n\n} // namespace detail\n*/\n\n/////////////////////////////////////////////////////////////////////////////\n// panel\n\nclass panel :\n\tpublic k3d::ngui::panel::control,\n\tpublic Gtk::VBox\n{\n\ttypedef Gtk::VBox base;\n\npublic:\n\tpanel() :\n\t\tbase(false, 0),\n\t\tm_document_state(0)\n\t{\n\t\tm_model = Gtk::ListStore::create(m_columns);\n\n\t\tm_view.set_model(m_model);\n\t\tm_view.set_headers_visible(false);\n\t\tm_view.set_reorderable(false);\n\n\t\tGtk::CellRendererText* const cell_text = new k3d::ngui::hotkey_cell_renderer_text();\n\t\tcell_text->property_editable() = true;\n\t\tcell_text->signal_edited().connect(sigc::mem_fun(*this, &panel::on_node_name_edited));\n\n\t\tGtk::TreeViewColumn* const name_column = new Gtk::TreeViewColumn;\n\t\tname_column->pack_start(*manage(cell_text), true);\n\t\tname_column->add_attribute(cell_text->property_text(), m_columns.name);\n\n\t\tm_view.append_column(\"icon\", m_columns.icon);\n\t\tm_view.append_column(*manage(name_column));\n\t\tm_view.get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);\n\n\t\tm_scrolled_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\t\tm_scrolled_window.add(m_view);\n\n\t\tpack_start(m_scrolled_window, Gtk::PACK_EXPAND_WIDGET);\n\n\t\t// Set ourselves up so we can grab the (NGUI) panel focus ...\n\t\tm_view.signal_focus_in_event().connect(sigc::bind_return(sigc::hide(m_panel_grab_signal.make_slot()), false), false);\n\n\t\tshow_all();\n\t}\n\n\t~panel()\n\t{\n\t}\n\n\tvoid initialize(k3d::ngui::document_state& DocumentState)\n\t{\n\t\tm_document_state = &DocumentState;\n\n\t\t// Reset the control contents anytime the document node collection changes\n\t\tm_document_state->document().nodes().add_nodes_signal().connect(sigc::mem_fun(*this, &panel::on_nodes_added));\n\t\tm_document_state->document().nodes().remove_nodes_signal().connect(sigc::mem_fun(*this, &panel::on_nodes_removed));\n\t\tm_document_state->document().nodes().rename_node_signal().connect(sigc::mem_fun(*this, &panel::on_node_renamed));\n\n\t\tm_view.get_selection()->set_select_function(sigc::mem_fun(*this, &panel::on_select_row));\n\t\tm_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &panel::on_selection_changed));\n\n\t\ton_nodes_added(m_document_state->document().nodes().collection());\n\t}\n\n\tconst k3d::string_t panel_type()\n\t{\n\t\treturn get_factory().name();\n\t}\n\n\tsigc::connection connect_focus_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_panel_grab_signal.connect(Slot);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<panel> factory(\n\t\t\tk3d::uuid(0xdae07bf6, 0xa64cc64e, 0xce15e798, 0x16f8eb43),\n\t\t\t\"NGUINodeListPanel\",\n\t\t\t_(\"Displays the document nodes as a flat list\"),\n\t\t\t\"NGUI Panel\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"panel\")(\"ngui:panel-label\", \"Node List\"));\n\n\t\treturn factory;\n\t}\n\t\nprivate:\n\t/// Looks-up a model row based on a node pointer\n\tk3d::bool_t get_row(k3d::inode* const Node, Gtk::TreeIter& Row)\n\t{\n\t\tGtk::TreeNodeChildren rows = m_model->children();\n\t\tfor(Gtk::TreeIter row = rows.begin(); row != rows.end(); ++row)\n\t\t{\n\t\t\tif(row->get_value(m_columns.node) == Node)\n\t\t\t{\n\t\t\t\tRow = row;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/// Looks-up a node based on a model row path\n\tk3d::inode* const get_node(const Gtk::TreePath& Path)\n\t{\n\t\tif(Path.empty())\n\t\t\treturn 0;\n\n\t\tGtk::TreeRow row = *m_model->get_iter(Path);\n\t\treturn row[m_columns.node];\n\t}\n\n\t/// Called by the signal system anytime new nodes are added to the document\n\tvoid on_nodes_added(const k3d::inode_collection::nodes_t& Nodes)\n\t{\n\t\tfor(k3d::inode_collection::nodes_t::const_iterator node = Nodes.begin(); node != Nodes.end(); ++node)\n\t\t{\n\t\t\tGtk::TreeRow new_row = *m_model->append();\n\t\t\tnew_row[m_columns.name] = (*node)->name();\n\t\t\tnew_row[m_columns.icon] = k3d::ngui::quiet_load_icon((*node)->factory().name(), Gtk::ICON_SIZE_MENU);\n\t\t\tnew_row[m_columns.node] = *node;\n\t\t}\n\n\t\tm_model->set_sort_column(2, Gtk::SORT_ASCENDING);\n\t}\n\n\t/// Called by the signal system anytime nodes are removed from the document\n\tvoid on_nodes_removed(const k3d::inode_collection::nodes_t& Nodes)\n\t{\n\t\tGtk::TreeIter row;\n\t\tfor(k3d::inode_collection::nodes_t::const_iterator node = Nodes.begin(); node != Nodes.end(); ++node)\n\t\t{\n\t\t\tif(get_row(*node, row))\n\t\t\t{\n\t\t\t\tm_model->erase(row);\n\t\t\t}\n\t\t}\n\t}\n\n\t/// Called by the signal system anytime a node is renamed\n\tvoid on_node_renamed(k3d::inode* const Node)\n\t{\n\t\tGtk::TreeIter row;\n\t\tif(get_row(Node, row))\n\t\t{\n\t\t\t(*row)[m_columns.name] = Node->name();\n\t\t\tm_model->set_sort_column(2, Gtk::SORT_ASCENDING);\n\t\t}\n\t}\n\n\t/// Called by the signal system anytime the user edits a node name in-place\n\tvoid on_node_name_edited(const Glib::ustring& Path, const Glib::ustring& NewText)\n\t{\n\t\tGtk::TreeRow row = *m_model->get_iter(Path);\n\t\tk3d::inode* const node = row[m_columns.node];\n\t\treturn_if_fail(node);\n\n\t\t// If the name didn't change, we're done ...\n\t\tif(node->name() == NewText)\n\t\t\treturn;\n\n\t\tk3d::record_state_change_set change_set(m_document_state->document(), k3d::string_cast(boost::format(_(\"Rename node %1%\")) % NewText), K3D_CHANGE_SET_CONTEXT);\n\t\tnode->set_name(NewText);\n\t}\n\n\t/// Called for each row whose state is changing during interactive selection ...\n\tbool on_select_row(const Glib::RefPtr<Gtk::TreeModel>&, const Gtk::TreePath& Path, bool PathCurrentlySelected)\n\t{\n\t\tconst k3d::bool_t new_selection_state = !PathCurrentlySelected;\n\n\t\t// We often get row selections that cancel each other out - filter them out of the selection set\n\t\tif(m_selection_paths.count(Path) && m_selection_paths[Path] != new_selection_state)\n\t\t{\n\t\t\tm_selection_paths.erase(Path);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Otherwise, store the new selection state ...\n\t\tm_selection_paths[Path] = new_selection_state;\n\n\t\treturn true;\n\t}\n\n\t/// Called to signal that interactive selection is complete ...\n\tvoid on_selection_changed()\n\t{\n\t\tstd::vector<k3d::inode*> selected_nodes;\n\t\tstd::vector<k3d::inode*> deselected_nodes;\n\t\tfor(selection_paths_t::const_iterator selection = m_selection_paths.begin(); selection != m_selection_paths.end(); ++selection)\n\t\t{\n\t\t\tif(selection->second)\n\t\t\t\tselected_nodes.push_back(get_node(selection->first));\n\t\t\telse\n\t\t\t\tdeselected_nodes.push_back(get_node(selection->first));\n\t\t}\n\n// \t\tif(selected_nodes.size() || deselected_nodes.size())\n// \t\t{\n// \t\t\tk3d::record_state_change_set change_set(m_document_state->document(), _(\"Select nodes\"), K3D_CHANGE_SET_CONTEXT);\n// \t\t\tk3d::ngui::selection::state(m_document_state->document()).select_nodes(selected_nodes);\n// \t\t\tk3d::ngui::selection::state(m_document_state->document()).deselect_nodes(deselected_nodes);\n// \t\t}\n\n\t\tif(selected_nodes.size() == 1)\n\t\t\tk3d::ngui::panel::mediator(m_document_state->document()).set_focus(*selected_nodes[0], *this);\n\n\t\tm_selection_paths.clear();\n\n/*\n\t\tif(!m_context_menu_path.empty())\n\t\t\tm_document_state.popup_context_menu();\n\n\t\tm_context_menu_path = Gtk::TreePath();\n*/\n\t}\n\n\tclass columns :\n\t\tpublic Gtk::TreeModelColumnRecord\n\t{\n\tpublic:\n\t\tcolumns()\n\t\t{\n\t\t\tadd(node);\n\t\t\tadd(icon);\n\t\t\tadd(name);\n\t\t}\n\n\t\tGtk::TreeModelColumn<k3d::inode*> node;\n\t\tGtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon;\n\t\tGtk::TreeModelColumn<Glib::ustring> name;\n\t};\n\n\tcolumns m_columns;\n\tGlib::RefPtr<Gtk::ListStore> m_model;\n\tGtk::TreeView m_view;\n\tGtk::ScrolledWindow m_scrolled_window;\n\n\t/// Stores the set of nodes being selected / deselected by the current interactive selection operation\n\ttypedef std::map<Gtk::TreePath, bool> selection_paths_t;\n\tselection_paths_t m_selection_paths;\n\t/// Stores the row over which the context menu should be displayed (if at all)\n\tGtk::TreePath m_context_menu_path;\n\n\t/// Signal to be emitted whenever this control needs to grab the panel focus\n\tsigc::signal<void> m_panel_grab_signal;\n\n\tk3d::ngui::document_state* m_document_state;\n};\n\n} // namespace node_list\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::node_list::panel::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_node_properties_panel/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-node-properties-panel)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-node-properties-panel)\n\n"
  },
  {
    "path": "modules/ngui_node_properties_panel/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iplugin_factory_collection.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/asynchronous_update.h>\n#include <k3dsdk/ngui/auto_property_page.h>\n#include <k3dsdk/ngui/auto_property_toolbar.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/custom_property_page.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/panel.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/uri.h>\n#include <k3dsdk/ngui/widget_manip.h>\n#include <k3dsdk/plugin.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/label.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/stock.h>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <iterator>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace node_properties\n{\n\nnamespace detail\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// implementation\n\nclass implementation :\n\tpublic asynchronous_update\n{\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState),\n\t\tm_auto_toolbar(DocumentState),\n\t\tm_auto_properties(DocumentState)\n\t{\n\t\t// Setup the panel label (always visible) ...\n\t\tm_label.set_alignment(Gtk::ALIGN_LEFT);\n\t\tm_label.set_padding(5, 5);\n\n\t\t// Setup the auto-generated page (usually visible, unless a custom page is available) ...\n\t\tGtk::ScrolledWindow* const scrolled_window = new Gtk::ScrolledWindow();\n\t\tscrolled_window->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\t\tscrolled_window->add(m_auto_properties.get_widget());\n\t\tscrolled_window->signal_button_press_event().connect(sigc::bind_return(sigc::hide(m_panel_grab_signal.make_slot()), false), false);\n\n\t\tm_auto_page.pack_start(m_auto_toolbar.get_widget(), Gtk::PACK_SHRINK);\n\t\tm_auto_page.pack_start(*Gtk::manage(scrolled_window), Gtk::PACK_EXPAND_WIDGET);\n\n\t\t// Setup the main top-level widget ...\n\t\tm_main_widget.pack_start(m_label, Gtk::PACK_SHRINK);\n\t\tm_main_widget.pack_start(m_auto_page, Gtk::PACK_EXPAND_WIDGET);\n\n\t\tpanel::mediator(m_document_state.document()).connect_focus_node_signal(sigc::mem_fun(*this, &implementation::on_view_node_properties));\n\t\tm_document_state.document().close_signal().connect(sigc::mem_fun(*this, &implementation::on_document_closed));\n\n\t\t// Initial update ...\n\t\tm_nodes = selection::state(m_document_state.document()).selected_nodes();\n\n\t\tif(m_nodes.size() > 1)\n\t\t\tm_nodes.resize(1);\n\t\tupdate_connections();\n\t\tschedule_update();\n\t}\n\n\tvoid on_view_node_properties(k3d::inode* const Node, k3d::iunknown* const Sender)\n\t{\n\t\tm_nodes = Node ? k3d::nodes_t(1, Node) : k3d::nodes_t();\n\t\tupdate_connections();\n\t\tschedule_update();\n\t}\n\n\tvoid on_document_closed()\n\t{\n\t\tblock_updates();\n\t}\n\n\tvoid update_connections()\n\t{\n\t\tstd::for_each(m_node_connections.begin(), m_node_connections.end(), std::mem_fun_ref(&sigc::connection::disconnect));\n\t\tm_node_connections.clear();\n\n\t\tfor(k3d::nodes_t::const_iterator node = m_nodes.begin(); node != m_nodes.end(); ++node)\n\t\t{\n\t\t\tm_node_connections.push_back((**node).deleted_signal().connect(sigc::bind(sigc::mem_fun(*this, &implementation::on_node_deleted), *node)));\n\t\t\tm_node_connections.push_back((**node).name_changed_signal().connect(sigc::mem_fun(*this, &implementation::update_label)));\n\t\t\tif(k3d::iproperty_collection* const property_collection = dynamic_cast<k3d::iproperty_collection*>(*node))\n\t\t\t\tm_node_connections.push_back(property_collection->connect_properties_changed_signal(sigc::hide(sigc::mem_fun(*this, &implementation::on_node_properties_changed))));\n\t\t}\n\t}\n\n\tvoid on_node_properties_changed()\n\t{\n\t\tschedule_update();\n\t}\n\n\tvoid on_node_deleted(k3d::inode* Node)\n\t{\n\t\tm_nodes.erase(std::remove(m_nodes.begin(), m_nodes.end(), Node), m_nodes.end());\n\t\tupdate_connections();\n\n\t\tschedule_update();\n\t}\n\n\tvoid update_label()\n\t{\n\t\tswitch(m_nodes.size())\n\t\t{\n\t\tcase 0:\n\t\t\tm_label.set_text(\"\");\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tm_label.set_text(m_nodes[0]->name());\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tm_label.set_text(_(\"Multiple Nodes\"));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid on_update()\n\t{\n\t\t// Cache the set of available custom property page plugins ...\n\t\tstatic std::map<k3d::string_t, k3d::iplugin_factory*> custom_pages;\n\t\tif(custom_pages.empty())\n\t\t{\n\t\t\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup();\n\t\t\tfor(k3d::plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t\t\t{\n\t\t\t\tk3d::iplugin_factory::metadata_t metadata = (**factory).metadata();\n\n\t\t\t\tif(metadata[\"ngui:component-type\"] != \"plugin-page\")\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst k3d::string_t plugin_type = metadata[\"ngui:plugin-type\"];\n\t\t\t\tif(plugin_type.empty())\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"Property page plugin without ngui:plugin-type metadata will be ignored\" << std::endl;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcustom_pages[plugin_type] = *factory;\n\t\t\t}\n\t\t}\n\n\t\tupdate_label();\n\n\t\tm_main_widget.hide();\n\n\t\tif(m_nodes.size() == 1 && custom_pages.count(m_nodes[0]->factory().name()))\n\t\t{\n\t\t\tm_custom_page.reset(k3d::plugin::create<k3d::ngui::custom_property_page::control>(*custom_pages[m_nodes[0]->factory().name()]));\n\t\t\tif(m_custom_page)\n\t\t\t{\n\t\t\t\tm_auto_page.hide();\n\t\t\t\tm_main_widget.pack_start(m_custom_page->get_widget(m_document_state, *m_nodes[0]), Gtk::PACK_EXPAND_WIDGET);\n\t\t\t\tm_main_widget.show();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tm_custom_page.reset();\n\n\t\tm_auto_toolbar.set_object(m_nodes.size() == 1 ? m_nodes[0] : 0);\n\t\tm_auto_properties.set_properties(m_nodes.begin(), m_nodes.end());\n\t\tm_auto_page.show();\n\n\t\tm_main_widget.show();\n\n/*\n\t\t// Used to determine if we need to add ikeyframer buttons\n\t\tk3d::ikeyframer* keyframer = dynamic_cast<k3d::ikeyframer*>(m_node);\n\t\tk3d::iproperty* last_time_property;\n\t\t\n\t\t// First add a manual keyframe button\n\t\tif (keyframer)\n\t\t{\n\t\t\tGtk::Button* const control =\n\t\t\t\t\t\tnew Gtk::Button(m_parent, \"set_keyframe_button\", \"Set Keyframe\")\n\t\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_manual_keyframe), keyframer))\n\t\t\t\t\t\t<< set_tooltip(\"Manually set keyframe\");\n\t\t\t\t\t\t\n\t\t\ttoolbar_control->row(0).pack_start(*Gtk::manage(control), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\t\t\t// If we have a keyframer, add a delete button to each keyframe group\n\t\t\t\tif (keyframer && property_name.find(\"key_time_\", 0) != std::string::npos)\n\t\t\t\t{\n\t\t\t\t\tlast_time_property = &property;\n\t\t\t\t}\n\t\t\t\tif (keyframer && property_name.find(\"key_value_\", 0) != std::string::npos)\n\t\t\t\t{\n\t\t\t\t\tif (!last_time_property)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << warning << \"No time property registered for \" << property_name << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t++row;\n\t\t\t\t\t\tstd::string keynumber = property_name.substr(10, property_name.size() - 9);\n\t\t\t\t\t\tGtk::Button* const control =\n\t\t\t\t\t\tnew Gtk::Button(m_parent, \"delete_key_\" + keynumber, \"Delete Key \" + keynumber)\n\t\t\t\t\t\t\t<< connect_button(sigc::bind(sigc::bind(sigc::mem_fun(*this, &implementation::on_key_delete), last_time_property), keyframer))\n\t\t\t\t\t\t\t<< set_tooltip(\"Delete Key \" + keynumber);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\ttable->attach(*manage(control), prop_label_begin, prop_label_end, row, row + 1, Gtk::SHRINK, Gtk::SHRINK);\n\t\t\t\t\t\t\n\t\t\t\t\t\tGtk::Button* const zoomcontrol =\n\t\t\t\t\t\tnew Gtk::Button(m_parent, \"zoom_key_\" + keynumber, \"Zoom to Key \" + keynumber)\n\t\t\t\t\t\t\t<< connect_button(sigc::bind(sigc::bind(sigc::mem_fun(*this, &implementation::on_key_zoom), last_time_property), keyframer))\n\t\t\t\t\t\t\t<< set_tooltip(\"Sets the time to the time associated with \" + keynumber);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\ttable->attach(*manage(zoomcontrol), prop_control_begin, prop_control_end, row, row + 1, Gtk::SHRINK, Gtk::SHRINK);\n\t\t\t\t\t\t\n\t\t\t\t\t\tlast_time_property = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n*/\n\t}\n\n/*\n\tvoid on_manual_keyframe(k3d::ikeyframer* Keyframer)\n\t{\n\t\tKeyframer->keyframe();\n\t}\n\t\n\tvoid on_key_delete(k3d::ikeyframer* Keyframer, k3d::iproperty* TimeProperty)\n\t{\n\t\tKeyframer->delete_key(TimeProperty);\n\t}\n\t\n\tvoid on_key_zoom(k3d::ikeyframer* Keyframer, k3d::iproperty* TimeProperty)\n\t{\n\t\tk3d::iwritable_property* timeprop = dynamic_cast<k3d::iwritable_property*>(k3d::get_time(m_document_state.document()));\n\t\tif (timeprop)\n\t\t\ttimeprop->property_set_value(TimeProperty->property_internal_value());\n\t}\n*/\n\n\t/// Stores a reference to the owning document\n\tdocument_state& m_document_state;\n\t/// Stores the current set of nodes to be displayed (if any)\n\tk3d::nodes_t m_nodes;\n\t/// Stores the current set of connections to node signals (if any)\n\tstd::vector<sigc::connection> m_node_connections;\n\n\t/// Contains the other widgets\n\tGtk::VBox m_main_widget;\n\t/// Displays the current node name\n\tGtk::Label m_label;\n\n\t/// Contains the standard auto-generated UI\n\tGtk::VBox m_auto_page;\n\t/// Provides the standard auto-generated toolbar\n\tk3d::ngui::auto_property_toolbar::control m_auto_toolbar;\n\t/// Provides the standard auto-generated property controls\n\tk3d::ngui::auto_property_page::control m_auto_properties;\n\n\t/// Stores the (optional) custom UI\n\tboost::scoped_ptr<k3d::ngui::custom_property_page::control> m_custom_page;\n\n\t/// Signal that will be emitted whenever this control should grab the panel focus\n\tsigc::signal<void> m_panel_grab_signal;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// panel\n\nclass panel :\n\tpublic k3d::ngui::panel::control,\n\tpublic Gtk::VBox\n{\n\ttypedef Gtk::VBox base;\n\npublic:\n\tpanel() :\n\t\tm_implementation(0)\n\t{\n\t}\n\n\t~panel()\n\t{\n\t\tdelete m_implementation;\n\t}\n\n\tvoid initialize(document_state& DocumentState)\n\t{\n\t\tm_implementation = new detail::implementation(DocumentState);\n\n\t\tpack_start(m_implementation->m_main_widget, Gtk::PACK_EXPAND_WIDGET);\n\t\tshow_all();\n\t}\n\n\tconst k3d::string_t panel_type()\n\t{\n\t\treturn get_factory().name();\n\t}\n\n\tsigc::connection connect_focus_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_implementation->m_panel_grab_signal.connect(Slot);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<panel> factory(\n\t\t\tk3d::uuid(0x159a2e07, 0x4b92028d, 0x9a998884, 0x4cf8bba5),\n\t\t\t\"NGUINodePropertiesPanel\",\n\t\t\t_(\"Displays properties for one node\"),\n\t\t\t\"NGUI Panel\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"panel\")(\"ngui:panel-label\", \"Node Properties\"));\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tdetail::implementation* m_implementation;\n};\n\n} // namespace node_properties\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::node_properties::panel::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_opengl_dialog/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-opengl-dialog)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-opengl-dialog)\n"
  },
  {
    "path": "modules/ngui_opengl_dialog/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/widget_manip.h>\n#include <k3dsdk/types.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/buttonbox.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/stock.h>\n#include <gtkmm/textview.h>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/tokenizer.hpp>\n\n#include <set>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace opengl\n{\n\nstatic const k3d::string_t get_string(GLenum name)\n{\n\tconst GLubyte* result = glGetString(name);\n\treturn result ? k3d::string_t(reinterpret_cast<const char*>(result)) + \"\\n\" : k3d::string_t(\"<unknown>\");\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// dialog\n\n/// Creates an \"about\" box that displays program version and copyright\nclass dialog :\n\tpublic k3d::ngui::application_window,\n\tpublic k3d::iunknown\n{\n\ttypedef k3d::ngui::application_window base;\n\npublic:\n\tdialog()\n\t{\n\t\tset_title(_(\"OpenGL Information\"));\n\t\tset_role(\"opengl_information\");\n\t\tset_position(Gtk::WIN_POS_CENTER);\n\t\tset_default_size(300, 400);\n\n\t\tGtk::TextView* const text_view = new Gtk::TextView();\n\t\ttext_view->set_editable(false);\n\t\ttext_view->set_wrap_mode(Gtk::WRAP_WORD);\n\t\ttext_view->set_justification(Gtk::JUSTIFY_LEFT);\n\n\t\tGlib::RefPtr<Gtk::TextBuffer> text_buffer = text_view->get_buffer();\n\n\t\tGlib::RefPtr<Gtk::TextTag> heading_tag = Gtk::TextTag::create(\"name\");\n\t\theading_tag->property_foreground() = \"#000000\";\n\t\theading_tag->property_weight() = Pango::WEIGHT_BOLD;\n\t\theading_tag->property_justification() = Gtk::JUSTIFY_LEFT;\n\t\ttext_buffer->get_tag_table()->add(heading_tag);\n\n\t\ttext_buffer->insert_with_tag(text_buffer->end(), \"OpenGL Vendor:\\n\\n\", heading_tag);\n\t\ttext_buffer->insert(text_buffer->end(), reinterpret_cast<const char*>(glGetString(GL_VENDOR)));\n\t\ttext_buffer->insert(text_buffer->end(), \"\\n\\n\");\n\n\t\ttext_buffer->insert_with_tag(text_buffer->end(), \"OpenGL Renderer:\\n\\n\", heading_tag);\n\t\ttext_buffer->insert(text_buffer->end(), reinterpret_cast<const char*>(glGetString(GL_RENDERER)));\n\t\ttext_buffer->insert(text_buffer->end(), \"\\n\\n\");\n\n\t\ttext_buffer->insert_with_tag(text_buffer->end(), \"OpenGL Version:\\n\\n\", heading_tag);\n\t\ttext_buffer->insert(text_buffer->end(), reinterpret_cast<const char*>(glGetString(GL_VERSION)));\n\t\ttext_buffer->insert(text_buffer->end(), \"\\n\\n\");\n\n\t\tconst k3d::string_t gl_extensions_string(glGetString(GL_EXTENSIONS) ? reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)) : \"\");\n\t\tstd::set<k3d::string_t> gl_extensions;\n\t\tboost::char_separator<char> gl_separator(\" \");\n\t\tboost::tokenizer<boost::char_separator<char> > gl_tokenizer(gl_extensions_string, gl_separator);\n\t\tstd::copy(gl_tokenizer.begin(), gl_tokenizer.end(), std::inserter(gl_extensions, gl_extensions.end()));\n\n\t\ttext_buffer->insert_with_tag(text_buffer->end(), \"OpenGL Extensions:\\n\\n\", heading_tag);\n\t\tfor(std::set<k3d::string_t>::const_iterator extension = gl_extensions.begin(); extension != gl_extensions.end(); ++extension)\n\t\t{\n\t\t\ttext_buffer->insert(text_buffer->end(), *extension);\n\t\t\ttext_buffer->insert(text_buffer->end(), \"\\n\");\n\t\t}\n\t\ttext_buffer->insert(text_buffer->end(), \"\\n\");\n\n\t\ttext_buffer->insert_with_tag(text_buffer->end(), \"OpenGLU Version:\\n\\n\", heading_tag);\n\t\ttext_buffer->insert(text_buffer->end(), reinterpret_cast<const char*>(gluGetString(GLU_VERSION)));\n\t\ttext_buffer->insert(text_buffer->end(), \"\\n\\n\");\n\n\t\tconst k3d::string_t glu_extensions_string(gluGetString(GLU_EXTENSIONS) ? reinterpret_cast<const char*>(gluGetString(GLU_EXTENSIONS)) : \"\");\n\t\tstd::set<k3d::string_t> glu_extensions;\n\t\tboost::char_separator<char> glu_separator(\" \");\n\t\tboost::tokenizer<boost::char_separator<char> > glu_tokenizer(glu_extensions_string, glu_separator);\n\t\tstd::copy(glu_tokenizer.begin(), glu_tokenizer.end(), std::inserter(glu_extensions, glu_extensions.end()));\n\n\t\ttext_buffer->insert_with_tag(text_buffer->end(), \"OpenGLU Extensions:\\n\\n\", heading_tag);\n\t\tfor(std::set<k3d::string_t>::const_iterator extension = glu_extensions.begin(); extension != glu_extensions.end(); ++extension)\n\t\t{\n\t\t\ttext_buffer->insert(text_buffer->end(), *extension);\n\t\t\ttext_buffer->insert(text_buffer->end(), \"\\n\");\n\t\t}\n\t\ttext_buffer->insert(text_buffer->end(), \"\\n\");\n\n\t\tGtk::ScrolledWindow* const scrolled_window = new Gtk::ScrolledWindow();\n\t\tscrolled_window->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);\n\t\tscrolled_window->add(*Gtk::manage(text_view));\n\n\t\tGtk::HButtonBox* const button_box = new Gtk::HButtonBox(Gtk::BUTTONBOX_END);\n\t\tbutton_box->pack_start(*Gtk::manage(\n\t\t\tnew Gtk::Button(Gtk::Stock::CLOSE) << connect_button(sigc::mem_fun(*this, &dialog::close))\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tGtk::VBox* const box = new Gtk::VBox(false, 5);\n\t\tbox->set_border_width(5);\n\t\tbox->pack_start(*Gtk::manage(scrolled_window), Gtk::PACK_EXPAND_WIDGET);\n\t\tbox->pack_start(*Gtk::manage(button_box), Gtk::PACK_SHRINK);\n\n\t\tadd(*Gtk::manage(box));\n\n\t\tshow_all();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<dialog> factory(\n\t\t\tk3d::uuid(0xa631c644, 0x634cc7e5, 0x55c41489, 0xc069b6e7),\n\t\t\t\"NGUIOpenGLDialog\",\n\t\t\t_(\"Displays information about the OpenGL implementation.\"),\n\t\t\t\"NGUI Dialog\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"dialog\"));\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace opengl\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::opengl::dialog::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_parent_tool/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-parent-tool)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-parent-tool)\n\n"
  },
  {
    "path": "modules/ngui_parent_tool/tool.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gdkmm/cursor.h>\n#include <gtkmm/widget.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/iparentable.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/basic_viewport_input_model.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/interactive.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/navigation_input_model.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/tool.h>\n#include <k3dsdk/ngui/transform.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/transform.h>\n\n#include <boost/assign/list_of.hpp>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace parent\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// implementation\n\nstruct implementation\n{\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState),\n\t\tm_set_parent(false),\n\t\tm_navigation_model(DocumentState)\n\t{\n\t\tm_input_model.connect_lbutton_click(sigc::mem_fun(*this, &implementation::on_lbutton_click));\n\t\tm_input_model.connect_rbutton_click(sigc::mem_fun(*this, &implementation::on_rbutton_click));\n\t\t\n\t\tm_input_model.connect_mbutton_click(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_click));\n\t\tm_input_model.connect_mbutton_start_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_start_drag));\n\t\tm_input_model.connect_mbutton_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_drag));\n\t\tm_input_model.connect_mbutton_end_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_end_drag));\n\t\tm_input_model.connect_rbutton_start_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_start_drag));\n\t\tm_input_model.connect_rbutton_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_drag));\n\t\tm_input_model.connect_rbutton_end_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_end_drag));\n\t\tm_input_model.connect_scroll(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_scroll));\n\t}\n\n\tvoid on_lbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tif(m_set_parent)\n\t\t\ton_set_parent(Viewport, Event);\n\t\telse\n\t\t\ton_pick(Viewport, Event);\n\t}\n\n\tvoid on_rbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tm_set_parent = false;\n\n\t\tm_document_state.set_active_tool(m_document_state.selection_tool());\n\t}\n\n\tvoid set_parent(viewport::control& Viewport, k3d::inode& Parent)\n\t{\n\t\tm_set_parent = false;\n\t\tm_document_state.clear_cursor_signal().emit();\n\n\t\tk3d::imatrix_source* const matrix_source = dynamic_cast<k3d::imatrix_source*>(&Parent);\n\t\treturn_if_fail(matrix_source);\n\n\t\tconst k3d::matrix4 parent_compensation = k3d::inverse(k3d::node_to_world_matrix(Parent));\n\n\t\tk3d::ipipeline::dependencies_t dependencies;\n\n\t\tk3d::record_state_change_set changeset(m_document_state.document(), _(\"Set Parent\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\t// Note - we enumerate over a *copy* of the set of document nodes, since we're adding nodes as we go ...\n\t\tconst k3d::nodes_t nodes = m_document_state.document().nodes().collection();\n\t\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\t// Ensure we don't try to parent an object to itself ...\n\t\t\tif(&Parent == *node)\n\t\t\t\tcontinue;\n\n\t\t\tif(!selection::state(m_document_state.document()).is_selected(**node))\n\t\t\t\tcontinue;\n\n\t\t\tconst transform_history_t history = parent_to_node_history(**node);\n\t\t\tif(!history.empty())\n\t\t\t{\n\t\t\t\tif(k3d::imatrix_sink* const matrix_sink = dynamic_cast<k3d::imatrix_sink*>(history.front()))\n\t\t\t\t{\n\t\t\t\t\tconst transform_modifier modifier = create_transform_modifier(m_document_state.document(), k3d::classes::FrozenMatrix(), \"Parent Compensation\");\n\t\t\t\t\tif(modifier)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::property::set_internal_value(*modifier.node, \"matrix\", parent_compensation);\n\t\t\t\t\t\tdependencies.insert(std::make_pair(&matrix_sink->matrix_sink_input(), &modifier.source->matrix_source_output()));\n\t\t\t\t\t\tdependencies.insert(std::make_pair(&modifier.sink->matrix_sink_input(), &matrix_source->matrix_source_output()));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(k3d::iparentable* const parentable = dynamic_cast<k3d::iparentable*>(*node))\n\t\t\t{\n\t\t\t\tif(k3d::iwritable_property* const writable_parent = dynamic_cast<k3d::iwritable_property*>(&parentable->parent()))\n\t\t\t\t\twritable_parent->property_set_value(&Parent);\n\t\t\t}\n\t\t}\n\n\t\tselection::state(m_document_state.document()).deselect_all();\n\t\tselection::state(m_document_state.document()).select(Parent);\n\t\tm_document_state.document().pipeline().set_dependencies(dependencies);\n\t}\n\t\n\tvoid on_set_parent(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::selection::record selection = Viewport.pick_node(k3d::point2(Event.x, Event.y));\n\t\tif(selection.empty())\n\t\t\treturn;\n\n\t\tk3d::inode* const node = k3d::selection::get_node(selection);\n\t\tif(!node)\n\t\t\treturn;\n\n\t\tset_parent(Viewport, *node);\n\n\t}\n\n\tvoid on_pick(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::selection::record selection = Viewport.pick_node(k3d::point2(Event.x, Event.y));\n\t\tif(selection.empty())\n\t\t\treturn;\n\n\t\tk3d::inode* const node = k3d::selection::get_node(selection);\n\t\treturn_if_fail(node);\n\n\t\tif(selection::state(m_document_state.document()).is_selected(*node))\n\t\t{\n\t\t\tm_set_parent = true;\n\t\t\tm_document_state.set_cursor_signal().emit(load_icon(\"parent_cursor\", Gtk::ICON_SIZE_BUTTON));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tselection::state(m_document_state.document()).select(selection);\n\t\t}\n\t}\n\n\t/// Stores a reference to the owning document\n\tdocument_state& m_document_state;\n\t/// Set to true iff the next pick should choose a new parent for all selected objects\n\tbool m_set_parent;\n\t/// Provides interactive navigation behavior\n\tnavigation_input_model m_navigation_model;\n\t/// Dispatches incoming user input events\n\tbasic_viewport_input_model m_input_model;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// tool\n\n/// User-interface tool that provides interactive node parenting\nclass tool :\n\tpublic k3d::ngui::tool,\n\tpublic k3d::iunknown\n{\npublic:\n\ttool() :\n\t\tm_implementation(0)\n\t{\n\t}\n\n\t~tool()\n\t{\n\t\tdelete m_implementation;\n\t}\n\n\tconst k3d::string_t tool_type()\n\t{\n\t\treturn get_factory().name();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<tool> factory(\n\t\t\tk3d::uuid(0x07371997, 0x1040b5a8, 0x2cf245be, 0xf1bbb199),\n\t\t\t\"NGUIParentTool\",\n\t\t\t_(\"Provides interactive controls for reparenting nodes.\"),\n\t\t\t\"NGUI Tool\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"tool\"));\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvirtual void on_initialize(document_state& DocumentState)\n\t{\n\t\tm_implementation = new parent::implementation(DocumentState);\n\t}\n\n\tvirtual void on_deactivate()\n\t{\n\t\tm_implementation->m_document_state.clear_cursor_signal().emit();\n\t}\n\n\tvirtual viewport_input_model& get_input_model()\n\t{\n\t\treturn m_implementation->m_input_model;\n\t}\n\n\tparent::implementation* m_implementation;\n};\n\n} // namespace parent\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::parent::tool::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-pipeline-panel)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-pipeline-panel)\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/document_to_graph.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include \"document_to_graph.h\"\n\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/ipipeline.h>\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace pipeline\n{\n\ndocument_to_graph::document_to_graph(k3d::idocument& Document) :\n\tm_document(Document),\n\tm_include_materials(init_owner(*this) + init_name(\"include_materials\") + init_label(\"\") + init_description(\"\") + init_value(false)),\n\tm_include_painters(init_owner(*this) + init_name(\"include_painters\") + init_label(\"\") + init_description(\"\") + init_value(false))\n{\n\tm_include_materials.changed_signal().connect(k3d::hint::converter<\n\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::graph_topology_changed> >(make_update_graph_slot()));\n\n\tm_include_painters.changed_signal().connect(k3d::hint::converter<\n\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::graph_topology_changed> >(make_update_graph_slot()));\n}\n\nvoid document_to_graph::on_update_graph_topology(k3d::graph::undirected& Output)\n{\n\tconst bool include_materials = m_include_materials.pipeline_value();\n\tconst bool include_painters = m_include_painters.pipeline_value();\n\n\tconst k3d::nodes_t nodes = m_document.nodes().collection();\n\n\tk3d::graph::undirected::adjacency_list_t& topology = Output.topology.create();\n\tk3d::graph::nodes_t& vertex_node = Output.vertex_data.create<k3d::graph::nodes_t>(\"node\");\n\tk3d::graph::indices_t& edge_type = Output.edge_data.create<k3d::graph::indices_t>(\"type\");\n\n\t// Insert nodes ...\n\tstd::map<k3d::inode*, k3d::graph::undirected::vertex_descriptor_t> node_map;\n\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t{\n\t\tif(!include_materials && dynamic_cast<k3d::imaterial*>(*node))\n\t\t\tcontinue;\n\t\tif(!include_painters && dynamic_cast<k3d::gl::imesh_painter*>(*node))\n\t\t\tcontinue;\n\t\tif(!include_painters && dynamic_cast<k3d::ri::imesh_painter*>(*node))\n\t\t\tcontinue;\n\n\t\tnode_map[*node] = boost::add_vertex(topology);\n\t\tvertex_node.push_back(*node);\n\t}\n\n\t// Insert edges ...\n\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t{\n\t\tif(!node_map.count(*node))\n\t\t\tcontinue;\n\n\t\tif(k3d::iproperty_collection* const property_collection = dynamic_cast<k3d::iproperty_collection*>(*node))\n\t\t{\n\t\t\tconst k3d::iproperty_collection::properties_t properties = property_collection->properties();\n\t\t\tfor(k3d::iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t\t{\n\t\t\t\tif(typeid(k3d::inode*) == (*property)->property_type())\n\t\t\t\t{\n\t\t\t\t\tif(k3d::inode* const referenced_node = boost::any_cast<k3d::inode*>((*property)->property_internal_value()))\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!node_map.count(referenced_node))\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::add_edge(node_map[referenced_node], node_map[*node], topology).first;\n\t\t\t\t\t\tedge_type.push_back(BEHAVIOR_EDGE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst k3d::ipipeline::dependencies_t dependencies = m_document.pipeline().dependencies();\n\tfor(k3d::ipipeline::dependencies_t::const_iterator dependency = dependencies.begin(); dependency != dependencies.end(); ++dependency)\n\t{\n\t\tif(dependency->first && dependency->first->property_node() && dependency->second && dependency->second->property_node())\n\t\t{\n\t\t\tif(!node_map.count(dependency->second->property_node()))\n\t\t\t\tcontinue;\n\n\t\t\tif(!node_map.count(dependency->first->property_node()))\n\t\t\t\tcontinue;\n\n\t\t\tboost::add_edge(node_map[dependency->second->property_node()], node_map[dependency->first->property_node()], topology).first;\n\t\t\tedge_type.push_back(DATA_EDGE);\n\t\t}\n\t}\n}\n\nvoid document_to_graph::on_update_graph_attributes(k3d::graph::undirected& Output)\n{\n}\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/document_to_graph.h",
    "content": "#ifndef MODULES_NGUI_PIPELINE_PANEL_DOCUMENT_TO_GRAPH_H\n#define MODULES_NGUI_PIPELINE_PANEL_DOCUMENT_TO_GRAPH_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"graph_source.h\"\n\nnamespace k3d { class idocument; }\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace pipeline\n{\n\nenum edge_type\n{\n\tDATA_EDGE,\n\tBEHAVIOR_EDGE\n};\t\n\n/// Converts a K-3D document to an undirected graph.\nclass document_to_graph :\n\tpublic k3d::graph_source\n{\npublic:\n\tdocument_to_graph(k3d::idocument& Document);\n\n\tk3d::iproperty& include_materials()\n\t{\n\t\treturn m_include_materials;\n\t}\n\nprivate:\n\tvoid on_update_graph_topology(k3d::graph::undirected& Output);\n\tvoid on_update_graph_attributes(k3d::graph::undirected& Output);\n\n\tk3d::idocument& m_document;\n\n\tk3d_data(bool, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::writable_property, k3d::data::no_serialization) m_include_materials;\n\tk3d_data(bool, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::writable_property, k3d::data::no_serialization) m_include_painters;\n};\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace module\n\n#endif // !MODULES_NGUI_PIPELINE_PANEL_DOCUMENT_TO_GRAPH_H\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/edge_indices.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include \"edge_indices.h\"\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace pipeline\n{\n\nedge_indices::edge_indices()\n{\n}\n\nvoid edge_indices::on_update_graph_topology(const k3d::graph::undirected& Input, k3d::graph::undirected& Output)\n{\n\tOutput = Input;\n\n\tk3d::graph::undirected::adjacency_list_t& topology = Output.topology.writable();\n\n\tk3d::uint_t index = 0;\n\tfor(std::pair<k3d::graph::undirected::edge_iterator_t, k3d::graph::undirected::edge_iterator_t> edges = boost::edges(topology); edges.first != edges.second; ++index, ++edges.first)\n\t\ttopology[*edges.first].index = index;\n}\n\nvoid edge_indices::on_update_graph_attributes(const k3d::graph::undirected& Input, k3d::graph::undirected& Output)\n{\n}\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/edge_indices.h",
    "content": "#ifndef MODULES_NGUI_PIPELINE_PANEL_EDGE_INDICES_H\n#define MODULES_NGUI_PIPELINE_PANEL_EDGE_INDICES_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"graph_modifier.h\"\n\nnamespace k3d { class idocument; }\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace pipeline\n{\n\n/// graph_modifier implementation that computes the index for every edge in a graph\nclass edge_indices :\n\tpublic k3d::graph_modifier\n{\npublic:\n\tedge_indices();\n\nprivate:\n\tvoid on_update_graph_topology(const k3d::graph::undirected& Input, k3d::graph::undirected& Output);\n\tvoid on_update_graph_attributes(const k3d::graph::undirected& Input, k3d::graph::undirected& Output);\n};\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace module\n\n#endif // !MODULES_NGUI_PIPELINE_PANEL_EDGE_INDICES_H\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/extract_tree.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include \"extract_tree.h\"\n\n#include <k3dsdk/table_copier.h>\n\n#include <boost/graph/breadth_first_search.hpp>\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace pipeline\n{\n\nnamespace detail\n{\n\n/// BFS visitor class that marks vertices and edges for extraction from a graph\nclass extract_tree_visitor :\n\tpublic boost::default_bfs_visitor\n{\npublic:\n\textract_tree_visitor(k3d::graph::bools_t& ExtractVertex, k3d::graph::bools_t& ExtractEdge) :\n\t\textract_vertex(ExtractVertex),\n\t\textract_edge(ExtractEdge)\n\t{\n\t}\n\n\ttemplate<typename vertex_t, typename graph_t>\n\tvoid discover_vertex(const vertex_t Vertex, const graph_t& Graph)\n\t{\n\t\textract_vertex[Vertex] = true;\n\t}\n\n\ttemplate<typename edge_t, typename graph_t>\n\tvoid tree_edge(const edge_t Edge, const graph_t Graph)\n\t{\n\t\textract_edge[Graph[Edge].index] = true;\n\t}\n\nprivate:\n\tk3d::graph::bools_t& extract_vertex;\n\tk3d::graph::bools_t& extract_edge;\n};\n\n} // namespace detail\n\nextract_tree::extract_tree() :\n\tm_root(init_owner(*this) + init_name(\"root\") + init_label(\"\") + init_description(\"\") + init_value(0))\n{\n\tm_root.changed_signal().connect(k3d::hint::converter<\n\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::graph_topology_changed> >(make_update_graph_slot()));\n}\n\nvoid extract_tree::on_update_graph_topology(const k3d::graph::undirected& Input, k3d::graph::undirected& Output)\n{\n\tOutput = k3d::graph::undirected();\n\n\treturn_if_fail(Input.topology);\n\tconst k3d::graph::undirected::adjacency_list_t& input_topology = *Input.topology;\n\tconst k3d::uint_t vertex_count = boost::num_vertices(input_topology);\n\tconst k3d::uint_t edge_count = boost::num_edges(input_topology);\n\n\tconst k3d::uint_t root = m_root.pipeline_value();\n\treturn_if_fail(root < vertex_count);\n\n\t// Use a simple BFS to determine which vertices and edges should appear in the output tree ...\n\tk3d::graph::bools_t extract_vertex(vertex_count, false);\n\tk3d::graph::bools_t extract_edge(edge_count, false);\n\tdetail::extract_tree_visitor extract_tree_visitor(extract_vertex, extract_edge);\n\tboost::breadth_first_search(input_topology, root, visitor(extract_tree_visitor));\n\n\t// Create a new graph, only copying those vertices and edges that were marked for extraction ...\n\tk3d::graph::undirected::adjacency_list_t& output_topology = Output.topology.create();\n\n\tOutput.graph_data = Input.graph_data;\n\tOutput.vertex_data = Input.vertex_data.clone_types();\n\tOutput.edge_data = Input.edge_data.clone_types();\n\n\tk3d::table_copier vertex_data_copier(Input.vertex_data, Output.vertex_data);\n\tk3d::table_copier edge_data_copier(Input.edge_data, Output.edge_data);\n\n\tstd::map<k3d::graph::undirected::vertex_descriptor_t, k3d::graph::undirected::vertex_descriptor_t> vertex_map;\n\tfor(k3d::graph::undirected::vertex_descriptor_t vertex = 0; vertex != vertex_count; ++vertex)\n\t{\n\t\tif(extract_vertex[vertex])\n\t\t{\n\t\t\tvertex_map[vertex] = boost::add_vertex(output_topology);\n\t\t\tvertex_data_copier.push_back(vertex);\n\t\t}\n\t}\n\n\tfor(std::pair<k3d::graph::undirected::edge_iterator_t, k3d::graph::undirected::edge_iterator_t> edges = boost::edges(input_topology); edges.first != edges.second; ++edges.first)\n\t{\n\t\tconst k3d::graph::undirected::edge_descriptor_t edge = *edges.first;\n\t\tconst k3d::uint_t edge_index = input_topology[edge].index;\n\n\t\tif(extract_edge[edge_index])\n\t\t{\n\t\t\tboost::add_edge(vertex_map[boost::source(edge, input_topology)], vertex_map[boost::target(edge, input_topology)], output_topology);\n\t\t\tedge_data_copier.push_back(edge_index);\n\t\t}\n\t}\n\n\t// Mark the new graph as a tree by specifying the index of the root vertex\n\tk3d::graph::indices_t& root_array = Output.graph_data.create<k3d::graph::indices_t>(\"root\");\n\troot_array.push_back(vertex_map[root]);\n}\n\nvoid extract_tree::on_update_graph_attributes(const k3d::graph::undirected& Input, k3d::graph::undirected& Output)\n{\n}\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/extract_tree.h",
    "content": "#ifndef MODULES_NGUI_PIPELINE_PANEL_EXTRACT_TREE_H\n#define MODULES_NGUI_PIPELINE_PANEL_EXTRACT_TREE_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"graph_modifier.h\"\n\nnamespace k3d { class idocument; }\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace pipeline\n{\n\nclass extract_tree :\n\tpublic k3d::graph_modifier\n{\npublic:\n\textract_tree();\n\n\tk3d::iproperty& root()\n\t{\n\t\treturn m_root;\n\t}\n\nprivate:\n\tvoid on_update_graph_topology(const k3d::graph::undirected& Input, k3d::graph::undirected& Output);\n\tvoid on_update_graph_attributes(const k3d::graph::undirected& Input, k3d::graph::undirected& Output);\n\n\tk3d_data(k3d::uint_t, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::writable_property, k3d::data::no_serialization) m_root;\n};\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace module\n\n#endif // !MODULES_NGUI_PIPELINE_PANEL_EXTRACT_TREE_H\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/graph_modifier.h",
    "content": "#ifndef MODULES_NGUI_PIPELINE_PANEL_GRAPH_MODIFIER_H\n#define MODULES_NGUI_PIPELINE_PANEL_GRAPH_MODIFIER_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/graph.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/pointer_demand_storage.h>\n#include <k3dsdk/property_collection.h>\n\nnamespace k3d\n{\n\nclass graph_modifier :\n\tpublic property_collection\n{\npublic:\n\tgraph_modifier() :\n\t\tm_input(init_owner(*this) + init_name(\"input_graph\") + init_label(_(\"Input Graph\")) + init_description(\"Input graph\") + init_value<graph::undirected*>(0)),\n\t\tm_output(init_owner(*this) + init_name(\"output_graph\") + init_label(_(\"Output Graph\")) + init_description(\"Output graph\"))\n\t{\n\t\tm_output.set_update_slot(sigc::mem_fun(*this, &graph_modifier::execute));\n\n\t\tm_input.changed_signal().connect(hint::converter<\n\t\t\thint::convert<hint::any, hint::unchanged> >(m_output.make_slot()));\n\t}\n\n\tiproperty& input()\n\t{\n\t\treturn m_input;\n\t}\n\n\tiproperty& output()\n\t{\n\t\treturn m_output;\n\t}\n\n\tsigc::slot<void, ihint*> make_update_graph_slot()\n\t{\n\t\treturn m_output.make_slot();\n\t}\n\nprotected:\n\tk3d_data(graph::undirected*, immutable_name, change_signal, no_undo, local_storage, no_constraint, read_only_property, no_serialization) m_input;\n\tk3d_data(graph::undirected*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_output;\n\nprivate:\n\tvoid execute(const std::vector<ihint*>& Hints, graph::undirected& Output)\n\t{\n\t\tif(const graph::undirected* const input = m_input.pipeline_value())\n\t\t{\n\t\t\tbool_t update_topology = false;\n\t\t\tbool_t update_attributes = false;\n\n\t\t\tfor(uint_t i = 0; i != Hints.size(); ++i)\n\t\t\t{\n\t\t\t\t// Update attributes ...\n\t\t\t\tif(dynamic_cast<hint::bitmap_pixels_changed*>(Hints[i]))\n\t\t\t\t{\n\t\t\t\t\tupdate_attributes = true;\n\t\t\t\t}\n\t\t\t\t// In every other case (graph_topology_changed, unknown hint, or no hint),\n\t\t\t\t// we assume the worst and recreate everything from scratch ...\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tupdate_topology = true;\n\t\t\t\t\tupdate_attributes = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(update_topology)\n\t\t\t{\n\t\t\t\ton_update_graph_topology(*input, Output);\n\t\t\t}\n\n\t\t\tif(update_attributes)\n\t\t\t{\n\t\t\t\ton_update_graph_attributes(*input, Output);\n\t\t\t}\n\t\t}\n\t}\n\n\tvirtual void on_update_graph_topology(const graph::undirected& Input, graph::undirected& Output) = 0;\n\tvirtual void on_update_graph_attributes(const graph::undirected& Input, graph::undirected& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !MODULES_NGUI_PIPELINE_PANEL_GRAPH_MODIFIER_H\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/graph_source.h",
    "content": "#ifndef MODULES_NGUI_PIPELINE_PANEL_GRAPH_SOURCE_H\n#define MODULES_NGUI_PIPELINE_PANEL_GRAPH_SOURCE_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/graph.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/pointer_demand_storage.h>\n#include <k3dsdk/property_collection.h>\n\nnamespace k3d\n{\n\nclass graph_source :\n\tpublic property_collection\n{\npublic:\n\tgraph_source() :\n\t\tm_output(init_owner(*this) + init_name(\"output_graph\") + init_label(_(\"Output Graph\")) + init_description(\"Output graph\"))\n\t{\n\t\tm_output.set_update_slot(sigc::mem_fun(*this, &graph_source::execute));\n\t}\n\n\tiproperty& output()\n\t{\n\t\treturn m_output;\n\t}\n\n\t/// Returns a slot that can be connected to input properties to signal that the output has changed\n\tsigc::slot<void, ihint*> make_update_graph_slot()\n\t{\n\t\treturn m_output.make_slot();\n\t}\n\nprotected:\n\tk3d_data(graph::undirected*, data::immutable_name, data::change_signal, data::no_undo, data::pointer_demand_storage, data::no_constraint, data::read_only_property, data::no_serialization) m_output;\n\nprivate:\n\t/// Called whenever the output has been modified and needs to be updated.\n\tvoid execute(const std::vector<ihint*>& Hints, graph::undirected& Graph)\n\t{\n\t\tbool_t update_topology = false;\n\t\tbool_t update_attributes = false;\n\n\t\tfor(uint_t i = 0; i != Hints.size(); ++i)\n\t\t{\n\t\t\t// Update attributes ...\n\t\t\tif(dynamic_cast<hint::graph_attributes_changed*>(Hints[i]))\n\t\t\t{\n\t\t\t\tupdate_attributes = true;\n\t\t\t}\n\t\t\t// In every other case (graph_topology_changed, unknown hint, or no hint),\n\t\t\t// we assume the worst and recreate everything from scratch ...\n\t\t\telse\n\t\t\t{\n\t\t\t\tupdate_topology = true;\n\t\t\t\tupdate_attributes = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(update_topology)\n\t\t{\n\t\t\ton_update_graph_topology(Graph);\n\t\t}\n\n\t\tif(update_attributes)\n\t\t{\n\t\t\ton_update_graph_attributes(Graph);\n\t\t}\n\t}\n\n\tvirtual void on_update_graph_topology(graph::undirected& Output) = 0;\n\tvirtual void on_update_graph_attributes(graph::undirected& Output) = 0;\n};\n\n} // namespace k3d\n\n#endif // !MODULES_NGUI_PIPELINE_PANEL_GRAPH_SOURCE_H\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include \"document_to_graph.h\"\n#include \"edge_indices.h\"\n#include \"extract_tree.h\"\n#include \"tree_layout.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/graph.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/basic_input_model.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/ngui/panel.h>\n#include <k3dsdk/ngui/panel_mediator.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/pipeline.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/vectors.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/button.h>\n#include <gtkmm/drawingarea.h>\n\n#include <cairomm/context.h>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <valarray>\n\n// Temporary hack ...\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace pipeline\n{\n\nnamespace detail\n{\n\n/// Drawing area widget that emits a signal when it needs to be redrawn\nclass drawing_area :\n\tpublic Gtk::DrawingArea\n{\npublic:\n\tsigc::connection connect_expose_event(const sigc::slot<void, GdkEventExpose*>& Slot)\n\t{\n\t\treturn expose_event_signal.connect(Slot);\n\t}\n\nprivate:\n\tbool on_expose_event(GdkEventExpose* event)\n\t{\n\t\texpose_event_signal.emit(event);\n\t\treturn true;\n\t}\n\n\tsigc::signal<void, GdkEventExpose*> expose_event_signal;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// panel\n\nclass panel :\n\tpublic k3d::ngui::panel::control,\n\tpublic Gtk::VBox\n{\npublic:\n\tpanel() :\n\t\tm_save_png(\"Save PNG\"),\n\t\tm_save_pdf(\"Save PDF\"),\n\t\tm_save_ps(\"Save PS\"),\n\t\tm_save_svg(\"Save SVG\"),\n\t\tm_zoom_factor(1.0),\n\t\tm_document_state(0),\n\t\tm_root_node(0),\n\t\tm_node_width(k3d::data::init_value(0.4)),\n\t\tm_node_height(k3d::data::init_value(0.07)),\n\t\tm_arrow_size(k3d::data::init_value(0.04)),\n\t\tm_background_color(k3d::data::init_value(k3d::color(1, 1, 1))),\n\t\tm_node_color(k3d::data::init_value(k3d::color(1, 1, 1))),\n\t\tm_node_border_color(k3d::data::init_value(k3d::color(0, 0, 0))),\n\t\tm_node_label_color(k3d::data::init_value(k3d::color(0, 0, 0))),\n\t\tm_connection_color(k3d::data::init_value(k3d::color(0, 0, 0)))\n\t{\n\t\tm_hbox.pack_start(m_save_png, Gtk::PACK_SHRINK);\n\t\tm_hbox.pack_start(m_save_pdf, Gtk::PACK_SHRINK);\n\t\tm_hbox.pack_start(m_save_ps, Gtk::PACK_SHRINK);\n\t\tm_hbox.pack_start(m_save_svg, Gtk::PACK_SHRINK);\n\n\t\tpack_start(m_hbox, Gtk::PACK_SHRINK);\n\t\tpack_start(m_drawing_area);\n\n\t\tm_save_png.signal_clicked().connect(sigc::mem_fun(*this, &panel::on_save_png));\n\t\tm_save_pdf.signal_clicked().connect(sigc::mem_fun(*this, &panel::on_save_pdf));\n\t\tm_save_ps.signal_clicked().connect(sigc::mem_fun(*this, &panel::on_save_ps));\n\t\tm_save_svg.signal_clicked().connect(sigc::mem_fun(*this, &panel::on_save_svg));\n\n\t\tm_input_model.connect_lbutton_double_click(sigc::mem_fun(*this, &panel::on_toggle_node_expansion));\n\t\tm_input_model.connect_lbutton_start_drag(sigc::mem_fun(*this, &panel::on_start_pan));\n\t\tm_input_model.connect_lbutton_drag(sigc::mem_fun(*this, &panel::on_pan));\n\t\tm_input_model.connect_mbutton_start_drag(sigc::mem_fun(*this, &panel::on_start_pan));\n\t\tm_input_model.connect_mbutton_drag(sigc::mem_fun(*this, &panel::on_pan));\n\t\tm_input_model.connect_rbutton_start_drag(sigc::mem_fun(*this, &panel::on_start_zoom));\n\t\tm_input_model.connect_rbutton_drag(sigc::mem_fun(*this, &panel::on_zoom));\n\t\tm_input_model.connect_scroll(sigc::mem_fun(*this, &panel::on_scroll_zoom));\n\n\t\tm_drawing_area.add_events(Gdk::POINTER_MOTION_MASK | Gdk::SCROLL_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK);\n\t\tm_drawing_area.connect_expose_event(sigc::mem_fun(*this, &panel::on_draw_pipeline));\n\n\t\tm_drawing_area.signal_button_press_event().connect(sigc::bind_return(sigc::mem_fun(m_input_model, &basic_input_model::button_press_event), true));\n\t\tm_drawing_area.signal_button_release_event().connect(sigc::bind_return(sigc::mem_fun(m_input_model, &basic_input_model::button_release_event), true));\n\t\tm_drawing_area.signal_motion_notify_event().connect(sigc::bind_return(sigc::mem_fun(m_input_model, &basic_input_model::motion_notify_event), true));\n\t\tm_drawing_area.signal_scroll_event().connect(sigc::bind_return(sigc::mem_fun(m_input_model, &basic_input_model::scroll_event), true));\n\t}\n\n\tvoid initialize(k3d::ngui::document_state& DocumentState)\n\t{\n\t\tm_document_state = &DocumentState;\n\t\n\t\tm_create_graph.reset(new document_to_graph(DocumentState.document()));\n\n\t\tm_edge_indices.reset(new edge_indices());\n\t\t\n\t\tm_extract_tree.reset(new extract_tree());\n\n\t\tm_tree_layout.reset(new tree_layout());\n\t\tk3d::property::set_internal_value(m_tree_layout->column_offset(), 0.6);\n\t\tk3d::property::set_internal_value(m_tree_layout->row_offset(), 0.1);\n\t\t\n\t\tm_graph_pipeline.reset(new k3d::pipeline());\n\t\tm_graph_pipeline->connect(m_create_graph->output(), m_edge_indices->input());\n\t\tm_graph_pipeline->connect(m_edge_indices->output(), m_extract_tree->input());\n\t\tm_graph_pipeline->connect(m_extract_tree->output(), m_tree_layout->input());\n\n\t\tm_tree_layout->output().property_changed_signal().connect(sigc::hide(sigc::mem_fun(*this, &panel::schedule_redraw)));\n\n\t\tm_document_state->document().nodes().add_nodes_signal().connect(sigc::hide(sigc::mem_fun(*this, &panel::reset_graph)));\n\t\tm_document_state->document().nodes().remove_nodes_signal().connect(sigc::hide(sigc::mem_fun(*this, &panel::reset_graph)));\n\t\tm_document_state->document().nodes().rename_node_signal().connect(sigc::hide(sigc::mem_fun(*this, &panel::schedule_redraw)));\n\n\t\tk3d::ngui::panel::mediator(m_document_state->document()).connect_focus_node_signal(sigc::mem_fun(*this, &panel::selected_node_changed));\n\n\t\tshow_all();\n\t}\n\n\tconst k3d::string_t panel_type()\n\t{\n\t\treturn get_factory().name();\n\t}\n\n\tsigc::connection connect_focus_signal(const sigc::slot<void>& Slot)\n\t{\n\t        return m_focus_signal.connect(Slot);\n\t}\n\n\tvoid on_save_png()\n\t{\n\t\tconst unsigned long width = 512;\n\t\tconst unsigned long height = static_cast<unsigned long>(width * aspect_ratio());\n\n\t\tk3d::ngui::file_chooser_dialog dialog(_(\"Save PNG Image:\"), k3d::options::path::bitmaps(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\tdialog.add_pattern_filter(_(\"PNG Image (*.png)\"), \"*.png\");\n\t\tdialog.add_all_files_filter();\n\t\tdialog.append_extension(\".png\");\n\n\t\tk3d::filesystem::path file_path;\n\t\tif(!dialog.get_file_path(file_path))\n\t\t\treturn;\n\t\tdialog.hide_all();\n\n\t\tconst Cairo::RefPtr<Cairo::Surface> surface = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, width, height);\n\t\treturn_if_fail(surface);\n\n\t\tconst Cairo::RefPtr<Cairo::Context> context = Cairo::Context::create(surface);\n\t\treturn_if_fail(context);\n\n\t\tdraw_pipeline(context, width, height);\n\n\t\tsurface->write_to_png(file_path.native_filesystem_string());\n\t}\n\n\tvoid on_save_pdf()\n\t{\n\t\tconst k3d::double_t width = 5 * 72.0;\n\t\tconst k3d::double_t height = width * aspect_ratio();\n\n\t\tk3d::ngui::file_chooser_dialog dialog(_(\"Save PDF Document:\"), k3d::options::path::bitmaps(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\tdialog.add_pattern_filter(_(\"PDF Document (*.pdf)\"), \"*.pdf\");\n\t\tdialog.add_all_files_filter();\n\t\tdialog.append_extension(\".pdf\");\n\n\t\tk3d::filesystem::path file_path;\n\t\tif(!dialog.get_file_path(file_path))\n\t\t\treturn;\n\t\tdialog.hide_all();\n\n\t\tconst Cairo::RefPtr<Cairo::Surface> surface = Cairo::PdfSurface::create(file_path.native_filesystem_string(), width, height);\n\t\treturn_if_fail(surface);\n\n\t\tconst Cairo::RefPtr<Cairo::Context> context = Cairo::Context::create(surface);\n\t\treturn_if_fail(context);\n\n\t\tdraw_pipeline(context, width, height);\n\t}\n\n\tvoid on_save_ps()\n\t{\n\t\tconst k3d::double_t width = 5 * 72.0;\n\t\tconst k3d::double_t height = width * aspect_ratio();\n\n\t\tk3d::ngui::file_chooser_dialog dialog(_(\"Save Postscript Document:\"), k3d::options::path::bitmaps(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\tdialog.add_pattern_filter(_(\"Postscript Document (*.ps)\"), \"*.ps\");\n\t\tdialog.add_all_files_filter();\n\t\tdialog.append_extension(\".ps\");\n\n\t\tk3d::filesystem::path file_path;\n\t\tif(!dialog.get_file_path(file_path))\n\t\t\treturn;\n\t\tdialog.hide_all();\n\n\t\tconst Cairo::RefPtr<Cairo::Surface> surface = Cairo::PsSurface::create(file_path.native_filesystem_string(), width, height);\n\t\treturn_if_fail(surface);\n\n\t\tconst Cairo::RefPtr<Cairo::Context> context = Cairo::Context::create(surface);\n\t\treturn_if_fail(context);\n\n\t\tdraw_pipeline(context, width, height);\n\t}\n\n\tvoid on_save_svg()\n\t{\n\t\tconst k3d::double_t width = 5 * 72.0;\n\t\tconst k3d::double_t height = width * aspect_ratio();\n\n\t\tk3d::ngui::file_chooser_dialog dialog(_(\"Save SVG Document:\"), k3d::options::path::bitmaps(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\tdialog.add_pattern_filter(_(\"SVG Document (*.svg)\"), \"*.svg\");\n\t\tdialog.add_all_files_filter();\n\t\tdialog.append_extension(\".svg\");\n\n\t\tk3d::filesystem::path file_path;\n\t\tif(!dialog.get_file_path(file_path))\n\t\t\treturn;\n\t\tdialog.hide_all();\n\n\t\tconst Cairo::RefPtr<Cairo::Surface> surface = Cairo::SvgSurface::create(file_path.native_filesystem_string(), width, height);\n\t\treturn_if_fail(surface);\n\n\t\tconst Cairo::RefPtr<Cairo::Context> context = Cairo::Context::create(surface);\n\t\treturn_if_fail(context);\n\n\t\tdraw_pipeline(context, width, height);\n\t}\n\n\tvoid on_toggle_node_expansion(const GdkEventButton& Event)\n\t{\n/*\n\t\tk3d::graph& graph = get_graph();\n\t\tconst k3d::graph::adjacency_list& topology = *graph.topology;\n\t\tconst k3d::uint_t vertex_count = boost::num_vertices(topology);\n\n\t\tk3d::graph::bools& vertex_expanded = k3d::get_array<k3d::graph::bools>(graph.vertex_data, \"expanded\", vertex_count);\n\t\tconst k3d::graph::points& vertex_position = k3d::get_array<k3d::graph::points>(graph.vertex_data, \"position\", vertex_count);\n\n\t\tconst k3d::point2 mouse = world_to_user(k3d::point2(Event.x, Event.y));\n\n\t\tfor(k3d::uint_t vertex = 0; vertex != vertex_count; ++vertex)\n\t\t{\n\t\t\tconst k3d::rectangle box(vertex_position[vertex], m_node_width, m_node_height);\n\t\t\tif(box.contains(mouse))\n\t\t\t{\n\t\t\t\tvertex_expanded[vertex] = !vertex_expanded[vertex];\n\n//\t\t\t\ttree_plus_layout(graph, m_root_vertex, m_column_offset, m_row_offset);\n\t\t\t\tschedule_redraw();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n*/\n\t}\n\n\tvoid on_start_pan(const GdkEventMotion& Event)\n\t{\n\t\tm_last_mouse = k3d::point2(Event.x, Event.y);\n\t}\n\n\tvoid on_pan(const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::point2 current_mouse = k3d::point2(Event.x, Event.y);\n\t\tconst k3d::vector2 delta = current_mouse - m_last_mouse;\n\n\t\tGtk::Allocation allocation = m_drawing_area.get_allocation();\n\t\tconst k3d::double_t width = allocation.get_width();\n\t\tconst k3d::double_t height = allocation.get_height();\n\n\t\tm_origin += delta * (1.0 / m_zoom_factor) * (1.0 / std::min(width, height));\n\t\tm_last_mouse = current_mouse;\n\n\t\tschedule_redraw();\n\t}\n\n\tvoid on_start_zoom(const GdkEventMotion& Event)\n\t{\n\t\tm_last_mouse = k3d::point2(Event.x, Event.y);\n\t}\n\n\tvoid on_zoom(const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::point2 current_mouse = k3d::point2(Event.x, Event.y);\n\t\tconst k3d::vector2 delta = current_mouse - m_last_mouse;\n\n\t\tconst k3d::double_t sensitivity = 1.008;\n\t\tconst k3d::double_t zoom_factor = delta[1] < 0 ? std::pow(sensitivity, std::abs(delta[1])) : std::pow(1 / sensitivity, std::abs(delta[1]));\n\t\tm_last_mouse = current_mouse;\n\n\t\tm_zoom_factor *= zoom_factor;\n\t\tschedule_redraw();\n\t}\n\n\tvoid on_scroll_zoom(const GdkEventScroll& Event)\n\t{\n\t\tstatic const k3d::double_t zoom_sensitivity = 1.2;\n\n\t\tswitch(Event.direction)\n\t\t{\n\t\t\tcase GDK_SCROLL_UP:\n\t\t\t\tm_zoom_factor *= zoom_sensitivity;\n\t\t\t\tschedule_redraw();\n\t\t\t\tbreak;\n\t\t\tcase GDK_SCROLL_DOWN:\n\t\t\t\tm_zoom_factor *= (1.0 / zoom_sensitivity);\n\t\t\t\tschedule_redraw();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid schedule_redraw()\n\t{\n\t\tif(Glib::RefPtr<Gdk::Window> window = m_drawing_area.get_window())\n\t\t{\n\t\t\tGdk::Rectangle r(0, 0, m_drawing_area.get_allocation().get_width(), m_drawing_area.get_allocation().get_height());\n\t\t\twindow->invalidate_rect(r, false);\n\t\t}\n\t}\n\n\tvoid reset_graph()\n\t{\n\t\tm_create_graph->make_update_graph_slot()(0);\n\t}\n\n\tvoid selected_node_changed(k3d::inode* const Node, k3d::iunknown* const Sender)\n\t{\n\t\tif(m_root_node == Node)\n\t\t\treturn;\n\n\t\tm_root_node = Node;\n\n\t\tk3d::graph::undirected& graph = *k3d::property::pipeline_value<k3d::graph::undirected*>(m_create_graph->output());\n\t\tconst k3d::graph::undirected::adjacency_list_t& topology = *graph.topology;\n\t\tconst k3d::uint_t vertex_count = boost::num_vertices(topology);\n\n\t\tconst k3d::graph::nodes_t& vertex_node = *graph.vertex_data.lookup<k3d::graph::nodes_t>(\"node\");\n\t\tfor(k3d::uint_t vertex = 0; vertex != vertex_count; ++vertex)\n\t\t{\n\t\t\tif(vertex_node[vertex] == Node)\n\t\t\t{\n\t\t\t\tk3d::property::set_internal_value(*m_extract_tree, \"root\", vertex);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst k3d::double_t aspect_ratio()\n\t{\n\t\tGtk::Allocation allocation = m_drawing_area.get_allocation();\n\t\tconst k3d::double_t width = allocation.get_width();\n\t\tconst k3d::double_t height = allocation.get_height();\n\t\treturn height / width;\n\t}\n\n\tconst k3d::point2 world_to_user(const k3d::point2& Point)\n\t{\n\t\tGtk::Allocation allocation = m_drawing_area.get_allocation();\n\t\tconst k3d::double_t width = allocation.get_width();\n\t\tconst k3d::double_t height = allocation.get_height();\n\n\t\tk3d::point2 result = Point;\n\n\t\tif(width > height)\n\t\t{\n\t\t\tresult -= k3d::vector2((width - height) / 2, 0);\n\t\t\tresult /= height;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresult -= k3d::vector2(0, (height - width) / 2);\n\t\t\tresult /= width;\n\t\t}\n\n\t\tresult -= k3d::vector2(0.5, 0.5);\n\t\tresult /= m_zoom_factor;\n\t\tresult -= k3d::vector2(m_origin[0], m_origin[1]);\n\n\t\treturn result;\n\t}\n\n\tvoid on_draw_pipeline(GdkEventExpose* event)\n\t{\n\t\tif(Glib::RefPtr<Gdk::Window> window = m_drawing_area.get_window())\n\t\t{\n\t\t\tGtk::Allocation allocation = m_drawing_area.get_allocation();\n\t\t\tconst int width = allocation.get_width();\n\t\t\tconst int height = allocation.get_height();\n\n\t\t\tCairo::RefPtr<Cairo::Context> context = window->create_cairo_context();\n\n\t\t\tif(event)\n\t\t\t{\n\t\t\t\t// clip to the area indicated by the expose event so that we only\n\t\t\t\t// redraw the portion of the window that needs to be redrawn\n\t\t\t\tcontext->rectangle(event->area.x, event->area.y, event->area.width, event->area.height);\n\t\t\t\tcontext->clip();\n\t\t\t}\n\n\t\t\tdraw_pipeline(context, width, height);\n\t\t}\n\t}\n\n\tvoid draw_box(const Cairo::RefPtr<Cairo::Context>& Context, const k3d::rectangle& Box)\n\t{\n\t\tContext->move_to(Box.x1, Box.y1);\n\t\tContext->line_to(Box.x2, Box.y1);\n\t\tContext->line_to(Box.x2, Box.y2);\n\t\tContext->line_to(Box.x1, Box.y2);\n\t\tContext->close_path();\n\n\t\tContext->stroke();\n\t}\n\n\tvoid draw_filled_box(const Cairo::RefPtr<Cairo::Context>& Context, const k3d::rectangle& Box)\n\t{\n\t\tContext->move_to(Box.x1, Box.y1);\n\t\tContext->line_to(Box.x2, Box.y1);\n\t\tContext->line_to(Box.x2, Box.y2);\n\t\tContext->line_to(Box.x1, Box.y2);\n\t\tContext->close_path();\n\n\t\tContext->fill();\n\t}\n\n\tvoid draw_curved_arrow(const Cairo::RefPtr<Cairo::Context>& Context, const k3d::point2& Source, const k3d::point2& Target, const k3d::double_t Size)\n\t{\n\t\tif(!k3d::length(Source - Target))\n\t\t\treturn;\n\n\t\tconst k3d::vector2 length_vector = k3d::normalize(k3d::vector2(Source[0] - Target[0], 0));\n\t\tconst k3d::vector2 width_vector = k3d::perpendicular(length_vector);\n\n\t\tconst k3d::point2 a = Source;\n\t\tconst k3d::point2 b = Target + (Size * length_vector);\n\t\tconst k3d::point2 c = Target + (Size * length_vector) + (0.3 * Size * width_vector);\n\t\tconst k3d::point2 d = Target;\n\t\tconst k3d::point2 e = Target + (Size * length_vector) + (-0.3 * Size * width_vector);\n\n\t\tconst k3d::point2 ca = Source + k3d::vector2((Target[0] - Source[0]) * 0.4, 0);\n\t\tconst k3d::point2 cb = Target + k3d::vector2((Source[0] - Target[0]) * 0.4, 0);\n\n\t\tContext->set_line_cap(Cairo::LINE_CAP_BUTT);\n\t\tContext->set_line_join(Cairo::LINE_JOIN_MITER);\n\n\t\t// Draw the line ...\n\t\tContext->move_to(a[0], a[1]);\n\t\tContext->curve_to(ca[0], ca[1], cb[0], cb[1], b[0], b[1]);\n\t\tContext->stroke();\n\n\t\t// Draw the arrow ...\n\t\tContext->move_to(c[0], c[1]);\n\t\tContext->line_to(d[0], d[1]);\n\t\tContext->line_to(e[0], e[1]);\n\t\tContext->line_to(c[0], c[1]);\n\t\tContext->fill();\n\t}\n\n\tvoid draw_centered_text(const Cairo::RefPtr<Cairo::Context>& Context, const k3d::double_t FontSize, const k3d::point2& Position, const std::string& Text, const k3d::double_t MaxWidth)\n\t{\n\t\tContext->save();\n\n\t\tCairo::TextExtents extents;\n\t\tk3d::double_t font_size = FontSize;\n\t\tContext->set_font_size(font_size);\n\t\tfor(Context->get_text_extents(Text, extents); extents.width > MaxWidth; Context->get_text_extents(Text, extents))\n\t\t{\n\t\t\tfont_size *= 0.8;\n\t\t\tContext->set_font_size(font_size);\n\t\t}\n\n\t\tContext->translate(-extents.width / 2, extents.height / 2);\n\t\tContext->move_to(Position[0], Position[1]);\n\t\tContext->show_text(Text);\n\n\t\tContext->restore();\n\t}\n\n\tvoid draw_pipeline(const Cairo::RefPtr<Cairo::Context>& Context, const k3d::double_t Width, const k3d::double_t Height)\n\t{\n\t\tconst k3d::double_t node_width = m_node_width.internal_value();\n\t\tconst k3d::double_t node_height = m_node_height.internal_value();\n\t\tconst k3d::double_t arrow_size = m_arrow_size.internal_value();\n\t\tconst k3d::color background_color = m_background_color.internal_value();\n\t\tconst k3d::color node_color = m_node_color.internal_value();\n\t\tconst k3d::color node_border_color = m_node_border_color.internal_value();\n\t\tconst k3d::color node_label_color = m_node_label_color.internal_value();\n\t\tconst k3d::color connection_color = m_connection_color.internal_value();\n\n\t\tContext->save();\n\n\t\ttry\n\t\t{\n\t\t\t// Setup the viewport ...\n\t\t\tif(Width > Height)\n\t\t\t{\n\t\t\t\tContext->translate((Width - Height) / 2, 0);\n\t\t\t\tContext->scale(Height, Height);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tContext->translate(0, (Height - Width) / 2);\n\t\t\t\tContext->scale(Width, Width);\n\t\t\t}\n\n\t\t\tContext->translate(0.5, 0.5);\n\t\t\tContext->scale(m_zoom_factor, m_zoom_factor);\n\t\t\tContext->translate(m_origin[0], m_origin[1]);\n\n\t\t\t// Clear the background ...\n\t\t\tContext->save();\n\t\t\tContext->set_source_rgb(background_color.red, background_color.green, background_color.blue);\n\t\t\tContext->paint();\n\t\t\tContext->restore();\n\n\t\t\t// Get the graph to be rendered ...\n\t\t\tconst k3d::graph::undirected& graph = *boost::any_cast<k3d::graph::undirected*>(k3d::property::pipeline_value(m_tree_layout->output()));\n\n\t\t\treturn_if_fail(graph.topology);\n\t\t\treturn_if_fail(graph.vertex_data.count(\"node\"));\n\t\t\treturn_if_fail(graph.vertex_data.count(\"position\"));\n\t\t\treturn_if_fail(graph.edge_data.count(\"type\"));\n\n\t\t\tconst k3d::graph::undirected::adjacency_list_t& topology = *graph.topology;\n\t\t\tconst k3d::uint_t vertex_count = boost::num_vertices(topology);\n\t\t\tconst k3d::uint_t edge_count = boost::num_edges(topology);\n\n\t\t\tconst k3d::graph::nodes_t& vertex_node = *graph.vertex_data.lookup<k3d::graph::nodes_t>(\"node\");\n\t\t\tconst k3d::graph::points_2d_t& vertex_position = *graph.vertex_data.lookup<k3d::graph::points_2d_t>(\"position\");\n\t\t\tconst k3d::graph::indices_t& edge_type = *graph.edge_data.lookup<k3d::graph::indices_t>(\"type\");\n\t\t\t\n\t\t\t// Render the graph edges ...\n\t\t\tContext->save();\n\t\t\tContext->set_line_width(0.003);\n\t\t\tContext->set_source_rgb(connection_color.red, connection_color.green, connection_color.blue);\n\n\t\t\tk3d::uint_t edge_index = 0;\n\t\t\tfor(std::pair<k3d::graph::undirected::edge_iterator_t, k3d::graph::undirected::edge_iterator_t> edges = boost::edges(topology); edges.first != edges.second; ++edge_index, ++edges.first)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t source = boost::source(*edges.first, topology);\n\t\t\t\tconst k3d::uint_t target = boost::target(*edges.first, topology);\n\n\t\t\t\tswitch(edge_type[edge_index])\n\t\t\t\t{\n\t\t\t\t\tcase BEHAVIOR_EDGE:\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::valarray<k3d::double_t> pattern(0.008, 1);\n\t\t\t\t\t\tContext->set_dash(pattern, 0.1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase DATA_EDGE:\n\t\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::valarray<k3d::double_t> pattern;\n\t\t\t\t\t\tContext->set_dash(pattern, 0.0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tk3d::point2 begin = vertex_position[source];\n\t\t\t\tk3d::point2 end = vertex_position[target];\n\n\t\t\t\tbegin[0] += end[0] > begin[0] ? node_width * 0.5 : node_width * -0.5;\n\t\t\t\tend[0] -= end[0] > begin[0] ? node_width * 0.5 : node_width * -0.5;\n\n\t\t\t\tdraw_curved_arrow(\n\t\t\t\t\tContext,\n\t\t\t\t\tbegin,\n\t\t\t\t\tend,\n\t\t\t\t\tarrow_size);\n\t\t\t}\n\n\t\t\tContext->restore();\n\t\t\t\n\t\t\t// Render the graph vertices ...\n\t\t\tContext->save();\n\n\t\t\tContext->select_font_face(\"Sans\", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_NORMAL);\n\t\t\tContext->set_line_width(0.003);\n\n\t\t\tfor(k3d::uint_t vertex = 0; vertex != vertex_count; ++vertex)\n\t\t\t{\n\t\t\t\tContext->set_source_rgb(node_color.red, node_color.green, node_color.blue);\n\t\t\t\tdraw_filled_box(Context, k3d::rectangle(vertex_position[vertex], node_width, node_height));\n\n\t\t\t\tContext->set_source_rgb(node_border_color.red, node_border_color.green, node_border_color.blue);\n\t\t\t\tdraw_box(Context, k3d::rectangle(vertex_position[vertex], node_width, node_height));\n\n\t\t\t\tContext->set_source_rgb(node_label_color.red, node_label_color.green, node_label_color.blue);\n\t\t\t\tdraw_centered_text(Context, 0.03, vertex_position[vertex], vertex_node[vertex]->name(), node_width);\n\t\t\t}\n\n\t\t\tContext->restore();\n\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << \"caught exception: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << \"caught unknown exception\" << std::endl;\n\t\t}\n\n\t\tContext->restore();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<panel> factory(\n\t\t\tk3d::uuid(0xf37f08af, 0xf542d517, 0xde317099, 0x79394ed8),\n\t\t\t\"NGUIPipelinePanel\",\n\t\t\t_(\"Displays the visualization pipeline\"),\n\t\t\t\"NGUI Panel\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"panel\")(\"ngui:panel-label\", \"Pipeline\"));\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tsigc::signal<void> m_focus_signal;\n\n\tGtk::HBox m_hbox;\n\tGtk::Button m_save_png;\n\tGtk::Button m_save_pdf;\n\tGtk::Button m_save_ps;\n\tGtk::Button m_save_svg;\n\tdetail::drawing_area m_drawing_area;\n\n\tk3d::double_t m_zoom_factor;\n\tk3d::point2 m_origin;\n\n\tk3d::point2 m_last_mouse;\n\n\tdocument_state* m_document_state;\n\tboost::scoped_ptr<document_to_graph> m_create_graph;\n\tboost::scoped_ptr<edge_indices> m_edge_indices;\n\tboost::scoped_ptr<extract_tree> m_extract_tree;\n\tboost::scoped_ptr<tree_layout> m_tree_layout;\n\tboost::scoped_ptr<k3d::pipeline> m_graph_pipeline;\n\n\tk3d::inode* m_root_node;\n\n\tk3d_data(k3d::double_t, k3d::data::no_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::no_property, k3d::data::no_serialization) m_node_width;\n\tk3d_data(k3d::double_t, k3d::data::no_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::no_property, k3d::data::no_serialization) m_node_height;\n\tk3d_data(k3d::double_t, k3d::data::no_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::no_property, k3d::data::no_serialization) m_arrow_size;\n\tk3d_data(k3d::color, k3d::data::no_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::no_property, k3d::data::no_serialization) m_background_color;\n\tk3d_data(k3d::color, k3d::data::no_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::no_property, k3d::data::no_serialization) m_node_color;\n\tk3d_data(k3d::color, k3d::data::no_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::no_property, k3d::data::no_serialization) m_node_border_color;\n\tk3d_data(k3d::color, k3d::data::no_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::no_property, k3d::data::no_serialization) m_node_label_color;\n\tk3d_data(k3d::color, k3d::data::no_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::no_property, k3d::data::no_serialization) m_connection_color;\n\t\n\tbasic_input_model m_input_model;\n};\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::pipeline::panel::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/tree_layout.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include \"tree_layout.h\"\n\n\n#include <boost/graph/breadth_first_search.hpp>\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace pipeline\n{\n\n/// BFS visitor class that computes rank and item for each node in a tree\nclass tree_layout::coordinate_visitor :\n\tpublic boost::default_bfs_visitor\n{\npublic:\n\tcoordinate_visitor(k3d::graph::indices_t& VertexRank, k3d::graph::indices_t& VertexItem, std::map<k3d::uint_t, k3d::uint_t>& RankCounts) :\n\t\tvertex_rank(VertexRank),\n\t\tvertex_item(VertexItem),\n\t\trank_counts(RankCounts)\n\t{\n\t}\n\n\ttemplate<typename edge_t, typename graph_t>\n\tvoid tree_edge(const edge_t Edge, const graph_t Graph)\n\t{\n\t\tconst k3d::uint_t rank = vertex_rank[boost::source(Edge, Graph)] + 1;\n\n\t\tvertex_rank[boost::target(Edge, Graph)] = rank;\n\t\tvertex_item[boost::target(Edge, Graph)] = rank_counts[rank]++;\n\n//\t\trank_counts[rank] += 1;\n\t}\n\nprivate:\n\tk3d::graph::indices_t& vertex_rank;\n\tk3d::graph::indices_t& vertex_item;\n\tstd::map<k3d::uint_t, k3d::uint_t>& rank_counts;\n};\n\ntree_layout::tree_layout() :\n\tm_column_offset(init_owner(*this) + init_name(\"column_offset\") + init_label(\"\") + init_description(\"\") + init_value(1.0)),\n\tm_row_offset(init_owner(*this) + init_name(\"row_offset\") + init_label(\"\") + init_description(\"\") + init_value(1.0))\n{\n\tm_column_offset.changed_signal().connect(k3d::hint::converter<\n\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::graph_topology_changed> >(make_update_graph_slot()));\n\n\tm_row_offset.changed_signal().connect(k3d::hint::converter<\n\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::graph_topology_changed> >(make_update_graph_slot()));\n}\n\nvoid tree_layout::on_update_graph_topology(const k3d::graph::undirected& Input, k3d::graph::undirected& Output)\n{\n\tOutput = Input;\n}\n\nvoid tree_layout::on_update_graph_attributes(const k3d::graph::undirected& Input, k3d::graph::undirected& Output)\n{\n\t// The input graph must be a tree ...\n\tconst k3d::graph::indices_t* const root_array = Input.graph_data.lookup<k3d::graph::indices_t>(\"root\");\n\treturn_if_fail(root_array);\n\treturn_if_fail(root_array->size() == 1);\n\tconst k3d::uint_t root = root_array->at(0);\n\n\treturn_if_fail(Input.topology);\n\tconst k3d::graph::undirected::adjacency_list_t& input_topology = *Input.topology;\n\tconst k3d::uint_t vertex_count = boost::num_vertices(input_topology);\n\n\t// Use a BFS to calculate each vertex' rank and number (its position within its rank) ...\n\tk3d::graph::indices_t vertex_rank(vertex_count, 0);\n\tk3d::graph::indices_t vertex_item(vertex_count, 0);\n\tstd::map<k3d::uint_t, k3d::uint_t> rank_counts;\n\tboost::breadth_first_search(input_topology, root, visitor(coordinate_visitor(vertex_rank, vertex_item, rank_counts)));\n\n\t// Convert rank and item numbers into 2D coordinates ...\n\tconst k3d::double_t column_offset = m_column_offset.pipeline_value();\n\tconst k3d::double_t row_offset = m_row_offset.pipeline_value();\n\n\tk3d::graph::points_2d_t& vertex_position = Output.vertex_data.create(\"position\", new k3d::graph::points_2d_t(vertex_count));\n\tfor(k3d::uint_t vertex = 0; vertex != vertex_count; ++vertex)\n\t{\n\t\tconst k3d::uint_t rank = vertex_rank[vertex];\n\t\tconst k3d::uint_t item = vertex_item[vertex];\n\t\tconst k3d::uint_t item_offset = rank_counts[rank] ? rank_counts[rank] - 1 : 0;\n\n\t\tvertex_position[vertex] = k3d::point2(rank * column_offset, (item * row_offset) - (item_offset * row_offset * 0.5));\n\t}\n}\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/ngui_pipeline_panel/tree_layout.h",
    "content": "#ifndef MODULES_NGUI_PIPELINE_PANEL_TREE_LAYOUT_H\n#define MODULES_NGUI_PIPELINE_PANEL_TREE_LAYOUT_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"graph_modifier.h\"\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace pipeline\n{\n\nclass tree_layout :\n\tpublic k3d::graph_modifier\n{\npublic:\n\ttree_layout();\n\n\tk3d::iproperty& column_offset()\n\t{\n\t\treturn m_column_offset;\n\t}\n\n\tk3d::iproperty& row_offset()\n\t{\n\t\treturn m_row_offset;\n\t}\n\nprivate:\n\tclass coordinate_visitor;\n\n\tvoid on_update_graph_topology(const k3d::graph::undirected& Input, k3d::graph::undirected& Output);\n\tvoid on_update_graph_attributes(const k3d::graph::undirected& Input, k3d::graph::undirected& Output);\n\n\tk3d_data(double, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::writable_property, k3d::data::no_serialization) m_column_offset;\n\tk3d_data(double, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::writable_property, k3d::data::no_serialization) m_row_offset;\n};\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace module\n\n#endif // !MODULES_NGUI_PIPELINE_PANEL_TREE_LAYOUT_H\n\n"
  },
  {
    "path": "modules/ngui_pipeline_profiler_panel/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-pipeline-profiler-panel)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-pipeline-profiler-panel)\n\n"
  },
  {
    "path": "modules/ngui_pipeline_profiler_panel/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/treestore.h>\n#include <gtkmm/treeview.h>\n#include <gtkmm/box.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/asynchronous_update.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/hotkey_cell_renderer_text.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/panel.h>\n\n#include <boost/assign/list_of.hpp>\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace pipeline_profiler\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// panel\n\nclass panel :\n\tpublic k3d::ngui::panel::control,\n\tpublic k3d::ngui::asynchronous_update,\n\tpublic Gtk::VBox\n{\n\ttypedef Gtk::VBox base;\n\npublic:\n\tpanel() :\n\t\tbase(false, 0)\n\t{\n\t\tm_scrolled_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\t\tm_scrolled_window.add(m_view);\n\n\t\tm_model = Gtk::TreeStore::create(m_columns);\n\n\t\tm_view.set_model(m_model);\n\t\tm_view.set_headers_visible(true);\n\t\tm_view.set_reorderable(true);\n\t\tm_view.get_selection()->set_mode(Gtk::SELECTION_NONE);\n\n\t\tGtk::TreeView::Column* const node_column = Gtk::manage(new Gtk::TreeView::Column(_(\"Node\"))); \n\t\tnode_column->pack_start(m_columns.icon, false); //false = don't expand.\n\t\tnode_column->pack_start(m_columns.name);\n\t\tm_view.append_column(*Gtk::manage(node_column));\n\n\t\tm_view.append_column(_(\"Task\"), m_columns.task);\n\t\tm_view.append_column(_(\"Count\"), m_columns.count);\n\t\tm_view.append_column(_(\"Time\"), m_columns.time);\n\t\tm_view.append_column_numeric(_(\"%\"), m_columns.percent, _(\"%.2f%%\"));\n\n//\t\tm_view.get_column(0)->add_attribute(m_view.get_column(0)->get_first_cell_renderer()->property_cell_background_gdk(), m_columns.color);\n//\t\tm_view.get_column(1)->add_attribute(m_view.get_column(1)->get_first_cell_renderer()->property_cell_background_gdk(), m_columns.color);\n\t\tm_view.get_column(2)->add_attribute(m_view.get_column(2)->get_first_cell_renderer()->property_cell_background_gdk(), m_columns.color);\n\t\tm_view.get_column(3)->add_attribute(m_view.get_column(3)->get_first_cell_renderer()->property_cell_background_gdk(), m_columns.color);\n\t\t\n\t\tschedule_update();\n\n\t\tm_view.signal_focus_in_event().connect(sigc::bind_return(sigc::hide(m_panel_grab_signal.make_slot()), false), false);\n\n\t\tpack_start(m_scrolled_window, Gtk::PACK_EXPAND_WIDGET);\n\t\tshow_all();\n\t}\n\n\tvoid initialize(k3d::ngui::document_state& DocumentState)\n\t{\n\t\tDocumentState.document().pipeline_profiler().connect_node_execution_signal(sigc::mem_fun(*this, &panel::on_node_execution));\n\t\tDocumentState.document().nodes().rename_node_signal().connect(sigc::mem_fun(*this, &panel::on_node_renamed));\n\t\t\n\t}\n\n\tconst k3d::string_t panel_type()\n\t{\n\t\treturn get_factory().name();\n\t}\n\n\tsigc::connection connect_focus_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_panel_grab_signal.connect(Slot);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<panel> factory(\n\t\t\tk3d::uuid(0xcaadef85, 0xb848e17d, 0x9f4c8a8b, 0x15ed410f),\n\t\t\t\"NGUIPipelineProfilerPanel\",\n\t\t\t_(\"Provides a panel for profiling execution of the visualization pipeline\"),\n\t\t\t\"NGUI Panel\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"panel\")(\"ngui:panel-label\", \"Pipeline Profiler\"));\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t/// Called by the signal system when profile data arrives\n\tvoid on_node_execution(k3d::inode& Node, const k3d::string_t& Task, k3d::double_t Time)\n\t{\n\t\tnew_records.push_back(new_record(Node, Task, Time));\n\t\tschedule_update();\n\t}\n\t\n\t/// Called by the signal system anytime a node is renamed\n\tvoid on_node_renamed(k3d::inode* const Node)\n\t{\n\t\treturn_if_fail(Node);\n\n\t\tGtk::TreeNodeChildren node_rows = m_model->children();\n\t\tfor(Gtk::TreeIter node_row = node_rows.begin(); node_row != node_rows.end(); ++node_row)\n\t\t{\n\t\t\tif(node_row->get_value(m_columns.node) == Node)\n\t\t\t{\n\t\t\t\t(*node_row)[m_columns.name] = Node->name();\n\t\t\t}\n\t\t}\n\t}\n\n\t/// Looks-up the row for a given node\n\tbool get_node_row(k3d::inode* const Node, Gtk::TreeRow& Row)\n\t{\n\t\tGtk::TreeNodeChildren rows = m_model->children();\n\t\tfor(Gtk::TreeIter row = rows.begin(); row != rows.end(); ++row)\n\t\t{\n\t\t\tif(row->get_value(m_columns.node) == Node)\n\t\t\t{\n\t\t\t\tRow = *row;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/// Looks-up the row for a given task\n\tbool get_task_row(Gtk::TreeRow NodeRow, const k3d::string_t& Task, Gtk::TreeRow& Row)\n\t{\n\t\tGtk::TreeNodeChildren rows = NodeRow.children();\n\t\tfor(Gtk::TreeIter row = rows.begin(); row != rows.end(); ++row)\n\t\t{\n\t\t\tif(row->get_value(m_columns.task) == Task)\n\t\t\t{\n\t\t\t\tRow = *row;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/// Computes a color based on a percentage\n\tconst Gdk::Color get_color(const k3d::double_t percentage)\n\t{\t\n\t\tGdk::Color result;\n\t\n\t\tif(percentage > 0.5)\n\t\t{\n\t\t\tresult.set_hsv(0.0, percentage - 0.5, 1.0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresult.set_hsv(120.0, 0.5 - percentage, 1.0);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/// Iterate over all rows and calculate totals / percentages / colors\n\tvoid calculate_totals()\n\t{\n\t\tGdk::Color white;\n\t\twhite.set_rgb_p(1, 1, 1);\n\n\t\tk3d::double_t total_time = 0;\n\n\t\tGtk::TreeNodeChildren node_rows = m_model->children();\n\t\tfor(Gtk::TreeIter node_row = node_rows.begin(); node_row != node_rows.end(); ++node_row)\n\t\t{\n\t\t\t(*node_row)[m_columns.count] = 0;\n\t\t\t(*node_row)[m_columns.time] = 0.0;\n\n\t\t\tGtk::TreeNodeChildren task_rows = node_row->children();\n\t\t\tfor(Gtk::TreeIter task_row = task_rows.begin(); task_row != task_rows.end(); ++task_row)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t task_count = (*task_row)[m_columns.count];\n\t\t\t\tconst k3d::double_t task_time = (*task_row)[m_columns.time];\n\n\t\t\t\t(*node_row)[m_columns.count] = (*node_row)[m_columns.count] + task_count;\n\t\t\t\t(*node_row)[m_columns.time] = (*node_row)[m_columns.time] + task_time;\n\t\t\t\ttotal_time += task_time;\n\t\t\t}\n\t\t}\n\n\t\tfor(Gtk::TreeIter node_row = node_rows.begin(); node_row != node_rows.end(); ++node_row)\n\t\t{\n\t\t\tif(total_time)\n\t\t\t{\n\t\t\t\tconst k3d::double_t percent = (*node_row)[m_columns.time] / total_time;\n\n\t\t\t\t(*node_row)[m_columns.percent] = 100.0 * percent;\n\t\t\t\t(*node_row)[m_columns.color] = get_color(percent);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t(*node_row)[m_columns.percent] = 0.0;\n\t\t\t\t(*node_row)[m_columns.color] = white;\n\t\t\t}\n\n\t\t\tGtk::TreeNodeChildren task_rows = node_row->children();\n\t\t\tfor(Gtk::TreeIter task_row = task_rows.begin(); task_row != task_rows.end(); ++task_row)\n\t\t\t{\n\t\t\t\tif(total_time)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::double_t percent = (*task_row)[m_columns.time] / total_time;\n\n\t\t\t\t\t(*task_row)[m_columns.percent] = 100.0 * (*task_row)[m_columns.time] / total_time;\n\t\t\t\t\t(*task_row)[m_columns.color] = get_color(percent);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t(*task_row)[m_columns.percent] = 0.0;\n\t\t\t\t\t(*task_row)[m_columns.color] = white;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/// Updates the contents of the control\n\tvoid on_update()\n\t{\n\t\tfor(unsigned long i = 0; i != new_records.size(); ++i)\n\t\t{\n\t\t\tGtk::TreeRow node_row;\n\t\t\tif(!get_node_row(new_records[i].node, node_row))\n\t\t\t{\n\t\t\t\tnode_row = *m_model->append();\n\n\t\t\t\tnode_row[m_columns.node] = new_records[i].node;\n\t\t\t\tnode_row[m_columns.icon] = k3d::ngui::quiet_load_icon(new_records[i].node->factory().name(), Gtk::ICON_SIZE_MENU);\n\t\t\t\tnode_row[m_columns.name] = new_records[i].node->name();\n\t\t\t\tnode_row[m_columns.count] = 0;\n\t\t\t}\n\n\t\t\tGtk::TreeRow task_row;\n\t\t\tif(!get_task_row(node_row, new_records[i].task, task_row))\n\t\t\t{\n\t\t\t\ttask_row = *m_model->append(node_row.children());\n\n\t\t\t\ttask_row[m_columns.node] = new_records[i].node;\n\t\t\t\ttask_row[m_columns.task] = new_records[i].task;\n\t\t\t\ttask_row[m_columns.count] = 0;\n\t\t\t}\n\n\t\t\ttask_row[m_columns.count] = task_row[m_columns.count] + 1;\n\t\t\ttask_row[m_columns.time] = new_records[i].time;\n\t\t}\n\t\tnew_records.clear();\n\n\t\tcalculate_totals();\n\t}\n\n\tclass columns :\n\t\tpublic Gtk::TreeModelColumnRecord\n\t{\n\tpublic:\n\t\tcolumns()\n\t\t{\n\t\t\tadd(node);\n\t\t\tadd(icon);\n\t\t\tadd(name);\n\t\t\tadd(task);\n\t\t\tadd(count);\n\t\t\tadd(time);\n\t\t\tadd(percent);\n\t\t\tadd(color);\n\t\t}\n\n\t\tGtk::TreeModelColumn<k3d::inode*> node;\n\t\tGtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon;\n\t\tGtk::TreeModelColumn<Glib::ustring> name;\n\t\tGtk::TreeModelColumn<Glib::ustring> task;\n\t\tGtk::TreeModelColumn<k3d::uint_t> count;\n\t\tGtk::TreeModelColumn<k3d::double_t> time;\n\t\tGtk::TreeModelColumn<k3d::double_t> percent;\n\t\tGtk::TreeModelColumn<Gdk::Color> color;\n\t};\n\tcolumns m_columns;\n\t\n\tGlib::RefPtr<Gtk::TreeStore> m_model;\n\tGtk::TreeView m_view;\n\tGtk::ScrolledWindow m_scrolled_window;\n\n\t/// Signal that will be emitted whenever this control should grab the panel focus\n\tsigc::signal<void> m_panel_grab_signal;\n\n\tclass new_record\n\t{\n\tpublic:\n\t\tnew_record()\n\t\t{\n\t\t}\n\n\t\tnew_record(k3d::inode& Node, const k3d::string_t& Task, k3d::double_t Time) :\n\t\t\tnode(&Node),\n\t\t\ttask(Task),\n\t\t\ttime(Time)\n\t\t{\n\t\t}\n\n\t\tk3d::inode* node;\n\t\tk3d::string_t task;\n\t\tk3d::double_t time;\n\t};\n\n\tstd::vector<new_record> new_records;\n};\n\n} // namespace pipeline_profiler\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::pipeline_profiler::panel::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_python_shell/CMakeLists.txt",
    "content": "K3D_COMPILE_RESOURCE(RESOURCES completion.py \"/module/ngui_python_shell/completion.py\")\n\nINCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})\n\nK3D_BUILD_NGUI_MODULE(k3d-ngui-python-shell EXTRA_SOURCES ${RESOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-ngui-python-shell)\n\nTARGET_LINK_LIBRARIES(k3d-ngui-python-shell k3dsdk-python)\nTARGET_LINK_LIBRARIES(k3d-ngui-python-shell ${PYTHON_LIBRARIES})\n"
  },
  {
    "path": "modules/ngui_python_shell/completion.py",
    "content": "# This code is a heavily-modified version of the Pythoni 2.6 \"rlcompleter\" module,\n# altered for use with the K-3D Python interactive shell.  \n\ndef get_class_members(klass):\n\tret = dir(klass)\n\tif hasattr(klass,'__bases__'):\n\t\tfor base in klass.__bases__:\n\t\t\tret = ret + get_class_members(base)\n\treturn ret\n\ndef attribute_matches(text, namespace):\n\timport re\n\tm = re.match(r\"(\\w+(\\.\\w+)*)\\.(\\w*)\", text)\n\tif not m:\n\t\treturn []\n\texpr, attr = m.group(1, 3)\n\ttry:\n\t\tthisobject = eval(expr, namespace)\n\texcept Exception:\n\t\treturn []\n\n\t# get the content of the object, except __builtins__\n\twords = dir(thisobject)\n\tif \"__builtins__\" in words:\n\t\twords.remove(\"__builtins__\")\n\n\tif hasattr(thisobject, '__class__'):\n\t\twords.append('__class__')\n\t\twords.extend(get_class_members(thisobject.__class__))\n\t\tmatches = []\n\t\tn = len(attr)\n\t\tfor word in words:\n\t\t\tif word[:n] == attr and hasattr(thisobject, word):\n\t\t\t\tval = getattr(thisobject, word)\n\t\t\t\tword = callable_postfix(val, \"%s.%s\" % (expr, word))\n\t\t\t\tmatches.append(word)\n\t\treturn matches\n\ndef callable_postfix(val, word):\n\tif hasattr(val, '__call__'):\n\t\tword = word + \"(\"\n\treturn word\n\ndef global_matches(text, namespace):\n\tmatches = []\n\tn = len(text)\n\timport keyword\n\tfor word in keyword.kwlist:\n\t\tif word[:n] == text:\n\t\t\tmatches.append(word)\n\timport __builtin__\n\tfor nspace in [__builtin__.__dict__, namespace]:\n\t\tfor word, val in nspace.items():\n\t\t\tif word[:n] == text and word != \"__builtins__\":\n\t\t\t\tmatches.append(callable_postfix(val, word))\n\treturn matches\n\ndef complete(text, namespace = locals()):\n\tmatches = []\n\n\tif \".\" in text:\n\t\treturn attribute_matches(text, namespace)\n\telse:\n\t\treturn global_matches(text, namespace)\n\n\treturn matches\n\nif __name__ == \"__main__\":\n\tcontext[\"matches\"] = complete(context.command)\n"
  },
  {
    "path": "modules/ngui_python_shell/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/idocument_sink.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/ngui/console.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/result.h>\n\n#include <gtkmm/texttag.h>\n#include <gdk/gdkkeysyms.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace python_shell\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dialog\n\n/// Provides an interactive Python shell dialog\nclass dialog :\n\tpublic k3d::ngui::application_window,\n\tpublic k3d::idocument_sink\n{\n\ttypedef k3d::ngui::application_window base;\n\npublic:\n\tdialog() :\n\t\tengine(k3d::plugin::create<k3d::iscript_engine>(\"Python\")),\n\t\tstdout_slot(sigc::mem_fun(*this, &dialog::print_stdout)),\n\t\tstderr_slot(sigc::mem_fun(*this, &dialog::print_stderr)),\n\t\tconsole(Gtk::manage(new k3d::ngui::console::control())),\n\t\tdocument(0)\n\t{\n\t\tprompt_tag = Gtk::TextTag::create(\"prompt\");\n\t\tprompt_tag->property_foreground() = \"#888888\";\n\t\tprompt_tag->property_family() = \"monospace\";\n\n\t\tstdout_tag = Gtk::TextTag::create(\"stdout\");\n\t\tstdout_tag->property_foreground() = \"#0000ff\";\n\n\t\tstderr_tag = Gtk::TextTag::create(\"stderr\");\n\t\tstderr_tag->property_foreground() = \"#ff0000\";\n\n\t\tcompletion_tag = Gtk::TextTag::create(\"completion\");\n\t\tcompletion_tag->property_foreground() = \"#00ff00\";\n\n\t\tset_title(_(\"K-3D Python Shell\"));\n\t\tset_role(\"python_shell_window\");\n\t\tset_border_width(0);\n\t\tresize(800, 400);\n\t\tset_position(Gtk::WIN_POS_CENTER);\n\n\t\tadd(*console);\n\t\tconsole->connect_command_signal(sigc::mem_fun(*this, &dialog::on_command));\n\t\tconsole->connect_complete_key_pressed_signal(sigc::mem_fun(*this, &dialog::on_complete_key_pressed));\n\t\tconsole->set_completion_key(GDK_Tab);\n\n\t\tshow_all();\n\n\t\treturn_if_fail(engine);\n\n\t\tk3d::iscript_engine::context context;\n\t\tengine->execute(get_factory().name(), \"import code\\n\", context);\n\t\tengine->execute(get_factory().name(), \"__console = code.InteractiveConsole(locals())\\n\", context);\n\n\t\tengine->execute(get_factory().name(), \"def quit():\\n  global context\\n  context.__close = True\\n\", context);\n\t\tengine->execute(get_factory().name(), \"def exit():\\n  global context\\n  context.__close = True\\n\", context);\n\t\tengine->execute(get_factory().name(), \"def help(target=None):\\n  if target:\\n    __builtins__.help(target)\\n  else:\\n    sys.stderr.write(\\\"Python online help isn't available in the K-3D Python Shell.\\\\n\\\")\\n\", context);\n\n\t\tengine->execute(get_factory().name(), \"import sys\\n\", context);\n\t\tengine->execute(get_factory().name(), \"print \\\"Python \\\" + sys.version + \\\" on \\\" + sys.platform\", context, &stdout_slot, &stderr_slot);\n\t\tengine->execute(get_factory().name(), \"import k3d\\n\", context);\n\n\t\tprint_prompt(\">>> \");\n\t}\n\n\tvoid set_document(k3d::idocument* Document)\n\t{\n\t\tdocument = Document;\n\t}\n\n\tvoid on_command(const k3d::string_t& Command)\n\t{\n\t\treturn_if_fail(engine);\n\n\t\tk3d::string_t command(Command);\n\t\tboost::replace_all(command, \"\\\\\", \"\\\\\\\\\");\n\t\tboost::replace_all(command, \"\\\"\", \"\\\\\\\"\");\n\n\t\tstd::ostringstream console_command;\n\t\tconsole_command << \"context.__incomplete = __console.push(\\\"\\\"\\\"\" << command << \"\\\"\\\"\\\")\";\n\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"__incomplete\"] = false;\n\t\tcontext[\"__close\"] = false;\n\n\t\tif(document)\n\t\t\tcontext[\"document\"] = document;\n\n\t\tengine->execute(get_factory().name(), console_command.str(), context, &stdout_slot, &stderr_slot);\n\n\t\tif(boost::any_cast<k3d::bool_t>(context[\"__close\"]))\n\t\t{\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\tprint_prompt(boost::any_cast<k3d::bool_t>(context[\"__incomplete\"]) ? \"... \" : \">>> \");\n\t}\n\n\tvoid on_complete_key_pressed(const k3d::string_t& Command)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"command\"] = Command;\n\t\tengine->execute(get_factory().name(), k3d::resource::get_string(\"/module/ngui_python_shell/completion.py\"), context);\n\n\t\ttry\n\t\t{\n\t\t\tconsole->print_string(\"\\n\", false);\n\n\t\t\tstd::vector<boost::any> matches = boost::any_cast<std::vector<boost::any> >(context[\"matches\"]);\n\t\t\tfor(k3d::uint_t i = 0; i != matches.size(); ++i)\n\t\t\t\tprint_completion(boost::any_cast<k3d::string_t>(matches[i]) + \"\\n\");\n\n\t\t\tk3d::string_t completion = matches.size() == 1 ? boost::any_cast<k3d::string_t>(matches[0]) : Command;\n\n\t\t\tprint_prompt(\">>> \");\n\t\t\tconsole->set_current_format(no_tag);\n\t\t\tconsole->print_string(completion, true);\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t}\n\t}\n\n\tvoid print_prompt(const k3d::string_t& Output)\n\t{\n\t\tconsole->set_current_format(prompt_tag);\n\t\tconsole->prompt_string(Output);\n\t}\n\n\tvoid print_stdout(const k3d::string_t& Output)\n\t{\n\t\tconsole->set_current_format(stdout_tag);\n\t\tconsole->print_string(Output);\n\t}\n\n\tvoid print_stderr(const k3d::string_t& Output)\n\t{\n\t\tconsole->set_current_format(stderr_tag);\n\t\tconsole->print_string(Output);\n\t}\n\n\tvoid print_completion(const k3d::string_t& Output)\n\t{\n\t\tconsole->set_current_format(completion_tag);\n\t\tconsole->print_string(Output);\n\t}\n\n\tboost::scoped_ptr<k3d::iscript_engine> engine;\n\tk3d::iscript_engine::output_t stdout_slot;\n\tk3d::iscript_engine::output_t stderr_slot;\n\n\tk3d::ngui::console::control* const console;\n\tGlib::RefPtr<Gtk::TextTag> prompt_tag;\n\tGlib::RefPtr<Gtk::TextTag> stdout_tag;\n\tGlib::RefPtr<Gtk::TextTag> stderr_tag;\n\tGlib::RefPtr<Gtk::TextTag> completion_tag;\n\tGlib::RefPtr<Gtk::TextTag> no_tag;\n\n\tk3d::idocument* document;\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<dialog> factory(\n\t\t\tk3d::uuid(0x0a0be598, 0x944d5b43, 0xfad02490, 0x854433fa),\n\t\t\t\"NGUIPythonShellDialog\",\n\t\t\t_(\"Provides an interactive Python shell window\"),\n\t\t\t\"NGUI Dialog\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"dialog\"));\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace python_shell\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::python_shell::dialog::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_rectangle_control/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-rectangle-control)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-rectangle-control)\n"
  },
  {
    "path": "modules/ngui_rectangle_control/control.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/custom_property_control.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/spin_button.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/type_registry.h>\n\n#include <gtkmm/label.h>\n#include <gtkmm/table.h>\n\n#include <boost/assign/list_of.hpp>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace rectangle\n{\n\n/// Adapts a spin button to control a single rectangle value\nclass spin_button_model :\n\tpublic k3d::ngui::spin_button::imodel\n{\npublic:\n\tspin_button_model(k3d::iproperty& Property, k3d::double_t k3d::rectangle::* Value) :\n\t\tm_readable_data(Property),\n\t\tm_writable_data(dynamic_cast<k3d::iwritable_property*>(&Property)),\n\t\tm_value(Value)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\tGlib::ustring result = m_readable_data.property_label();\n\n\t\tif(m_readable_data.property_node())\n\t\t\tresult = m_readable_data.property_node()->name() + \" \" + result;\n\n\t\treturn result;\n\t}\n\n\tk3d::bool_t writable()\n\t{\n\t\treturn m_writable_data;\n\t}\n\n\tk3d::double_t value()\n\t{\n\t\treturn boost::any_cast<k3d::rectangle>(m_readable_data.property_internal_value()).*m_value;\n\t}\n\n\tvoid set_value(const k3d::double_t Value)\n\t{\n\t\treturn_if_fail(m_writable_data);\n\n\t\tk3d::rectangle value = boost::any_cast<k3d::rectangle>(m_readable_data.property_internal_value());\n\t\tvalue.*m_value = Value;\n\t\tm_writable_data->property_set_value(value);\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_readable_data.property_changed_signal().connect(sigc::hide(Slot));\n\t}\n\n\tk3d::double_t step_increment()\n\t{\n\t\treturn 0.1;\n\t}\n\n\tconst std::type_info& units()\n\t{\n\t\treturn typeid(k3d::measurement::scalar);\n\t}\n\nprivate:\n\tk3d::iproperty& m_readable_data;\n\tk3d::iwritable_property* const m_writable_data;\n\tk3d::double_t k3d::rectangle::* m_value;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a control for k3d::rectangle properties.\nclass control :\n\tpublic k3d::ngui::custom_property::control,\n\tpublic k3d::iunknown,\n\tpublic Gtk::Table\n{\npublic:\n\tcontrol() :\n\t\tGtk::Table(4, 3, false)\n\t{\n\t}\n\n\t~control()\n\t{\n\t}\n\n\tvoid initialize(document_state& DocumentState, k3d::iproperty& Property)\n\t{\n\t\tspin_button::control* const x1 = new spin_button::control(new spin_button_model(Property, &k3d::rectangle::x1), &DocumentState.document().state_recorder());\n\t\tspin_button::control* const x2 = new spin_button::control(new spin_button_model(Property, &k3d::rectangle::x2), &DocumentState.document().state_recorder());\n\t\tspin_button::control* const y1 = new spin_button::control(new spin_button_model(Property, &k3d::rectangle::y1), &DocumentState.document().state_recorder());\n\t\tspin_button::control* const y2 = new spin_button::control(new spin_button_model(Property, &k3d::rectangle::y2), &DocumentState.document().state_recorder());\n\n\t\tattach(*Gtk::manage(new Gtk::Label(_(\"X1\"))), 0, 1, 0, 1);\n\t\tattach(*Gtk::manage(x1), 1, 2, 0, 1);\n\n\t\tattach(*Gtk::manage(new Gtk::Label(_(\"X2\"))), 0, 1, 1, 2);\n\t\tattach(*Gtk::manage(x2), 1, 2, 1, 2);\n\n\t\tattach(*Gtk::manage(new Gtk::Label(_(\"Y1\"))), 0, 1, 2, 3);\n\t\tattach(*Gtk::manage(y1), 1, 2, 2, 3);\n\n\t\tattach(*Gtk::manage(new Gtk::Label(_(\"Y2\"))), 0, 1, 3, 4);\n\t\tattach(*Gtk::manage(y2), 1, 2, 3, 4);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<control> factory(\n\t\t\tk3d::uuid(0x85a9b466, 0x6541a591, 0x69de379e, 0x90a31786),\n\t\t\t\"NGUIRectangleControl\",\n\t\t\t_(\"Provides a custom property control for k3d::rectangle properties.\"),\n\t\t\t\"NGUI Control\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"property-control\")(\"ngui:property-type\", \"k3d::rectangle\"));\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace rectangle\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::rectangle::control::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_render_region_tool/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-render-region-tool)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-render-region-tool)\n\n"
  },
  {
    "path": "modules/ngui_render_region_tool/tool.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <gdkmm/cursor.h>\n#include <gtkmm/widget.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/high_res_timer.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/icrop_window.h>\n#include <k3dsdk/irender_camera_preview.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/basic_viewport_input_model.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/interactive.h>\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/navigation_input_model.h>\n#include <k3dsdk/ngui/render.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/tool.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <boost/assign/list_of.hpp>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace render_region\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// implementation\n\nstruct implementation\n{\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState),\n\t\tm_navigation_model(DocumentState)\n\t{\n\t\tm_input_model.connect_lbutton_double_click(sigc::mem_fun(*this, &implementation::on_lbutton_double_click));\n\t\tm_input_model.connect_lbutton_start_drag(sigc::mem_fun(*this, &implementation::on_lbutton_start_drag));\n\t\tm_input_model.connect_lbutton_drag(sigc::mem_fun(*this, &implementation::on_lbutton_drag));\n\t\tm_input_model.connect_lbutton_end_drag(sigc::mem_fun(*this, &implementation::on_lbutton_end_drag));\n\t\tm_input_model.connect_rbutton_click(sigc::mem_fun(*this, &implementation::on_rbutton_click));\n\n\t\tm_input_model.connect_mbutton_click(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_click));\n\t\tm_input_model.connect_mbutton_start_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_start_drag));\n\t\tm_input_model.connect_mbutton_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_drag));\n\t\tm_input_model.connect_mbutton_end_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_end_drag));\n\t\tm_input_model.connect_rbutton_start_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_start_drag));\n\t\tm_input_model.connect_rbutton_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_drag));\n\t\tm_input_model.connect_rbutton_end_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_end_drag));\n\t\tm_input_model.connect_scroll(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_scroll));\t}\n\n\tvoid on_lbutton_double_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\t// If the user double-clicks outside the current crop window, reset it to render the entire frame ...\n\t\tk3d::icrop_window* const crop_window = dynamic_cast<k3d::icrop_window*>(Viewport.camera());\n\t\tif(crop_window)\n\t\t{\n\t\t\tconst k3d::rectangle window(\n\t\t\t\tk3d::property::pipeline_value<double>(crop_window->crop_left()),\n\t\t\t\tk3d::property::pipeline_value<double>(crop_window->crop_right()),\n\t\t\t\tk3d::property::pipeline_value<double>(crop_window->crop_top()),\n\t\t\t\tk3d::property::pipeline_value<double>(crop_window->crop_bottom())\n\t\t\t\t);\n\n\t\t\tif(!window.contains(widget_to_ndc(Viewport, k3d::point2(Event.x, Event.y))))\n\t\t\t{\n\t\t\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Reset Camera Crop Window\"), K3D_CHANGE_SET_CONTEXT);\n\t\t\t\tk3d::property::set_internal_value(crop_window->crop_left(), 0.0);\n\t\t\t\tk3d::property::set_internal_value(crop_window->crop_right(), 1.0);\n\t\t\t\tk3d::property::set_internal_value(crop_window->crop_top(), 0.0);\n\t\t\t\tk3d::property::set_internal_value(crop_window->crop_bottom(), 1.0);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Otherwise, render a preview ...\n\t\tk3d::icamera* camera = Viewport.camera();\n\t\tif(!camera)\n\t\t\tcamera = pick_camera(m_document_state);\n\t\tif(!camera)\n\t\t\treturn;\n\n\t\tk3d::irender_camera_preview* render_engine = Viewport.camera_preview_engine();\n\t\tif(!render_engine)\n\t\t\trender_engine = pick_camera_preview_render_engine(m_document_state);\n\t\tif(!render_engine)\n\t\t\treturn;\n\n\t\tViewport.set_camera(camera);\n\t\tViewport.set_camera_preview_engine(render_engine);\n\n\t\trender(*camera, *render_engine);\n\t}\n\n\tvoid on_lbutton_start_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tif(k3d::inode* const rubber_band = k3d::ngui::selection::state(m_document_state.document()).rubber_band())\n\t\t{\n\t\t\tk3d::property::set_internal_value(*rubber_band, \"camera\", dynamic_cast<k3d::inode*>(Viewport.camera()));\n\t\t\tk3d::property::set_internal_value(*rubber_band, \"color\", k3d::color(0, 0, 1));\n\t\t\tk3d::property::set_internal_value(*rubber_band, \"opacity\", 0.1);\n\t\t\tk3d::property::set_internal_value(*rubber_band, \"border_color\", k3d::color(0, 0, 1));\n\t\t\tk3d::property::set_internal_value(*rubber_band, \"border_opacity\", 0.5);\n\t\t\tk3d::property::set_internal_value(*rubber_band, \"rectangle\", k3d::rectangle(Event.x, Event.x, Viewport.get_height() - Event.y, Viewport.get_height() - Event.y));\n\t\t}\n\n\t\tm_timer.restart();\n\t}\n\n\tvoid on_lbutton_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tif(k3d::inode* const rubber_band = k3d::ngui::selection::state(m_document_state.document()).rubber_band())\n\t\t{\n\t\t\tk3d::rectangle new_rectangle = k3d::property::pipeline_value<k3d::rectangle>(*rubber_band, \"rectangle\");\n\t\t\tnew_rectangle.x2 = Event.x;\n\t\t\tnew_rectangle.y2 = Viewport.get_height() - Event.y;\n\t\t\tk3d::property::set_internal_value(*rubber_band, \"rectangle\", new_rectangle);\n\t\t}\n\t}\n\n\tvoid on_lbutton_end_drag(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tk3d::rectangle selection_rectangle;\n\t\tif(k3d::inode* const rubber_band = k3d::ngui::selection::state(m_document_state.document()).rubber_band())\n\t\t{\n\t\t\tselection_rectangle = k3d::property::pipeline_value<k3d::rectangle>(*rubber_band, \"rectangle\");\n\t\t\tselection_rectangle.y1 = Viewport.get_height() - selection_rectangle.y1;\n\t\t\tselection_rectangle.y2 = Viewport.get_height() - selection_rectangle.y2;\n\t\t\tk3d::property::set_internal_value(*rubber_band, \"camera\", static_cast<k3d::inode*>(0));\n\t\t}\n\n\t\tk3d::icrop_window* const crop_window = dynamic_cast<k3d::icrop_window*>(Viewport.camera());\n\t\treturn_if_fail(crop_window);\n\n\t\tconst k3d::rectangle box = k3d::rectangle::normalize(selection_rectangle);\n\t\tconst k3d::point2 top_left = widget_to_ndc(Viewport, k3d::point2(box.x1, box.y1));\n\t\tconst k3d::point2 bottom_right = widget_to_ndc(Viewport, k3d::point2(box.x2, box.y2));\n\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Set Camera Crop Window\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\tconst double left = top_left[0];\n\t\tconst double right = bottom_right[0];\n\t\tconst double top = top_left[1];\n\t\tconst double bottom = bottom_right[1];\n\n\t\tk3d::property::set_internal_value(crop_window->crop_left(), left);\n\t\tk3d::property::set_internal_value(crop_window->crop_right(), right);\n\t\tk3d::property::set_internal_value(crop_window->crop_top(), top);\n\t\tk3d::property::set_internal_value(crop_window->crop_bottom(), bottom);\n\t}\n\n\tvoid on_rbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tm_document_state.set_active_tool(m_document_state.selection_tool());\n\t}\n\n\t/// Stores the owning document\n\tdocument_state& m_document_state;\n\t/// Provides interactive navigation behavior\n\tnavigation_input_model m_navigation_model;\n\t/// Dispatches incoming user input events\n\tbasic_viewport_input_model m_input_model;\n\n\tk3d::timer m_timer;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// tool\n\n/// User-interface tool that provides interactive controls for cropped rendering\nclass tool :\n\tpublic k3d::ngui::tool,\n\tpublic k3d::iunknown\n{\npublic:\n\ttool() :\n\t\tm_implementation(0)\n\t{\n\t}\n\n\t~tool()\n\t{\n\t\tdelete m_implementation;\n\t}\n\n\tconst k3d::string_t tool_type()\n\t{\n\t\treturn get_factory().name();\n\t}\n\n\tvirtual k3d::ngui::viewport_input_model& get_input_model()\n\t{\n\t\treturn m_implementation->m_input_model;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<tool> factory(\n\t\t\tk3d::uuid(0x96a0445e, 0x85412ced, 0xfa1b9ca5, 0xd74e4922),\n\t\t\t\"NGUIRenderRegionTool\",\n\t\t\t_(\"Provides interactive controls for cropped rendering.\"),\n\t\t\t\"NGUI Tool\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"tool\"));\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvirtual void on_initialize(document_state& DocumentState)\n\t{\n\t\tm_implementation = new render_region::implementation(DocumentState);\n\t}\n\n\trender_region::implementation* m_implementation;\n};\n\n} // namespace render_region\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::render_region::tool::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_selection_control/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-selection-control)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-selection-control)\n\n"
  },
  {
    "path": "modules/ngui_selection_control/control.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/dependencies.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/iomanip.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/custom_property_control.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/persistent_lookup.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/serialization_xml.h>\n#include <k3dsdk/type_registry.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/menu.h>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <gtk/gtkmain.h>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// control\n\n/// Provides a custom control for k3d::selection::set properties.\nclass control :\n\tpublic k3d::ngui::custom_property::control,\n\tpublic k3d::iunknown,\n\tpublic Gtk::VBox\n{\npublic:\n\tcontrol() :\n\t\tGtk::VBox()\n\t{\n\t}\n\n\t~control()\n\t{\n\t}\n\n\tvoid initialize(document_state& DocumentState, k3d::iproperty& Property)\n\t{\n\t\tGtk::Button* const menu_button = new Gtk::Button(_(\"Selection Options\"));\n\t\tmenu_button->signal_clicked().connect(sigc::bind(sigc::mem_fun(*this, &control::on_choose), &Property));\n\n\t\tpack_start(*Gtk::manage(menu_button), Gtk::PACK_EXPAND_WIDGET);\n\t}\n\n\tvoid on_choose(k3d::iproperty* const Property)\n\t{\n\t\tconst k3d::selection::set selection = k3d::property::pipeline_value<k3d::selection::set>(*Property);\n\t\t\t\n\t\tm_menu.reset(new Gtk::Menu());\n\n\t\tGtk::MenuItem* const save_selection = new Gtk::MenuItem(_(\"Save selection ...\"));\n\t\tsave_selection->signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &control::on_save_selection), selection));\n\t\tm_menu->items().push_back(*manage(save_selection));\n\n\t\tGtk::MenuItem* const reset_selection = new Gtk::MenuItem(_(\"Reset Selection\"));\n\t\treset_selection->signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &control::on_reset_selection), Property));\n\t\tm_menu->items().push_back(*manage(reset_selection));\n\n\t\tGtk::MenuItem* const select_all = new Gtk::MenuItem(_(\"Select All\"));\n\t\tselect_all->signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &control::on_select_all), Property));\n\t\tm_menu->items().push_back(*manage(select_all));\n\n\t\tGtk::MenuItem* const select_none = new Gtk::MenuItem(_(\"Select None\"));\n\t\tselect_none->signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &control::on_select_none), Property));\n\t\tm_menu->items().push_back(*manage(select_none));\n\n\t\tm_menu->show_all();\n\t\tm_menu->popup(1, gtk_get_current_event_time());\n\t}\n\n\tvoid on_save_selection(const k3d::selection::set Selection)\n\t{\n\t\tk3d::filesystem::path output_path;\n\t\t{\n\t\t\tfile_chooser_dialog dialog(_(\"Save selection file:\"), \"k3d\", Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\t\tif(!dialog.get_file_path(output_path))\n\t\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::filesystem::path root_path = output_path.branch_path();\n\t\tk3d::dependencies dependencies;\n\t\tk3d::persistent_lookup lookup;\n\t\tk3d::ipersistent::save_context context(root_path, dependencies, lookup);\n\n\t\tk3d::xml::element xml(\"k3dml\");\n\t\tk3d::xml::element& xml_selection = xml.append(k3d::xml::element(\"selection\"));\n\t\tk3d::xml::save(Selection, xml_selection, context);\n\n\t\tk3d::filesystem::ofstream stream(output_path);\n\t\tstream << k3d::xml::declaration() << xml << std::endl;\n\t}\n\n\tvoid on_reset_selection(k3d::iproperty* const Property)\n\t{\n\t\tk3d::property::set_internal_value(*Property, k3d::selection::set());\n\t}\n\n\tvoid on_select_all(k3d::iproperty* const Property)\n\t{\n\t\tk3d::property::set_internal_value(*Property, k3d::geometry::selection::create(1.0));\n\t}\n\n\tvoid on_select_none(k3d::iproperty* const Property)\n\t{\n\t\tk3d::property::set_internal_value(*Property, k3d::geometry::selection::create(0.0));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<control> factory(\n\t\t\tk3d::uuid(0x7025b049, 0xdb4c25bc, 0xb37ca188, 0x0044ab19),\n\t\t\t\"NGUISelectionControl\",\n\t\t\t_(\"Provides a standard control for selection properties.\"),\n\t\t\t\"NGUI Control\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"property-control\")(\"ngui:property-type\", \"k3d::selection::set\"));\n\n\t\treturn factory;\n\t}\n\n\tboost::scoped_ptr<Gtk::Menu> m_menu;\n};\n\n} // namespace selection\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::selection::control::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_snap_tool/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-snap-tool)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-snap-tool)\n\n\n"
  },
  {
    "path": "modules/ngui_snap_tool/snap_tool_detail.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"snap_tool_detail.h\"\n\n#include <gdkmm/cursor.h>\n#include <gtkmm/widget.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/irenderable_gl.h>\n#include <k3dsdk/isnap_source.h>\n#include <k3dsdk/isnap_target.h>\n#include <k3dsdk/isnappable.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/interactive.h>\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/xml.h>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace snap\n{\n\n//////////////////////////////////////////////////////////////////////////////\n// get_snap_source\n\nk3d::isnap_source* get_snap_source(k3d::iunknown* Snappable)\n{\n\tk3d::isnappable* const snappable = dynamic_cast<k3d::isnappable*>(Snappable);\n\tif(!snappable)\n\t\treturn 0;\n\n\tconst k3d::isnappable::snap_sources_t sources = snappable->snap_sources();\n\tif(sources.empty())\n\t\treturn 0;\n\n\treturn sources[0];\n}\n\nconst k3d::isnappable::snap_targets_t get_snap_targets(k3d::isnappable* const Target, k3d::isnap_target* const SnapTarget)\n{\n\tif(!Target)\n\t\treturn k3d::isnappable::snap_targets_t();\n\n\tif(SnapTarget)\n\t\treturn k3d::isnappable::snap_targets_t(1, SnapTarget);\n\n\treturn Target->snap_targets();\n}\n\n///////////////////////////////////////////////////////////////////////////////////\n// snap_tool_detail::transform_target\n\nsnap_tool_detail::transform_target::transform_target(k3d::inode* Node)\n{\n\tnode = Node;\n\n\t// Sanity check\n\treturn_if_fail(node);\n}\n\nunsigned long snap_tool_detail::transform_target::target_number()\n{\n\treturn 1;\n}\n\nvoid snap_tool_detail::transform_target::reset(k3d::iunknown*)\n{\n}\n\nvoid snap_tool_detail::transform_target::start_transform()\n{\n\tif(create_transform_modifier(\"Snap \"))\n\t\tassert_warning(k3d::property::set_internal_value(*modifier, \"matrix\", k3d::identity3()));\n\n\tm_origin = k3d::point3();\n//\tm_world_position = k3d::point3();\n\n\t// Save orientation matrices\n\tswitch(current_system_type)\n\t{\n\t\tcase GLOBAL:\n\t\t\tm_system_orientation = k3d::inverse(k3d::node_to_world_matrix(*node));\n\t\t\tbreak;\n\t\tcase LOCAL:\n\t\t\tm_system_orientation = k3d::identity3();\n\t\t\tbreak;\n\t\tcase PARENT:\n\t\t\tm_system_orientation = k3d::inverse(k3d::node_to_world_matrix(*node)) * k3d::parent_to_world_matrix(*node);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tassert_not_reached();\n\t}\n}\n\nconst k3d::matrix4 upstream_matrix(k3d::inode& Node)\n{\n\tif(k3d::imatrix_sink* const downstream_sink = dynamic_cast<k3d::imatrix_sink*>(&Node))\n\t{\n\t\tif(k3d::iproperty* const upstream_output = Node.document().pipeline().dependency(downstream_sink->matrix_sink_input()))\n\t\t\treturn boost::any_cast<k3d::matrix4>(upstream_output->property_internal_value());\n\t}\n\n\treturn k3d::identity3();\n}\n\nconst k3d::matrix4 snap_tool_detail::transform_target::snap(k3d::isnappable* const Target, k3d::isnap_target* const SnapTarget, const double SnapDistance, const bool SnapOrientation, const bool MatchGroups, const k3d::matrix4& Transformation)\n{\n\tk3d::isnap_source* const snap_source = get_snap_source(node);\n\tif(!snap_source)\n\t\treturn Transformation;\n\n\tconst k3d::isnappable::snap_targets_t snap_targets = get_snap_targets(Target, SnapTarget);\n\tif(snap_targets.empty())\n\t\treturn Transformation;\n\n\tconst k3d::matrix4 target_matrix = k3d::node_to_world_matrix(*Target);\n\n\t// Convert the source position to target coordinates\n\tconst k3d::point3 source_position = k3d::inverse(target_matrix) * Transformation * snap_source->source_position();\n\n\t// Find the best (closest) snap target and its position\n\tk3d::isnap_target* snap_target = 0;\n\tk3d::point3 target_position;\n\tdouble target_distance = std::numeric_limits<double>::max();\n\n\tfor(k3d::isnappable::snap_targets_t::const_iterator i = snap_targets.begin(); i != snap_targets.end(); ++i)\n\t{\n\t\tif(MatchGroups)\n\t\t{\n\t\t\tconst k3d::isnap_source::groups_t source_groups = snap_source->groups();\n\t\t\tconst k3d::isnap_target::groups_t target_groups = (*i)->groups();\n\n\t\t\tif(source_groups.size() && target_groups.end() ==\n\t\t\t\tstd::find_first_of(target_groups.begin(), target_groups.end(), source_groups.begin(), source_groups.end()))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Get the target position in target coordinates\n\t\tk3d::point3 position;\n\t\tif((*i)->target_position(source_position, position))\n\t\t{\n\t\t\tconst double distance = k3d::distance(position, source_position);\n\t\t\tif(distance < target_distance)\n\t\t\t{\n\t\t\t\tsnap_target = *i;\n\t\t\t\ttarget_position = position;\n\t\t\t\ttarget_distance = distance;\n\t\t\t}\n\t\t}\n\t}\n\n\tif(!snap_target)\n\t\treturn Transformation;\n\n\tif(target_distance > SnapDistance)\n\t\treturn Transformation;\n\n\t// Optionally handle snap orientation\n\tif(SnapOrientation)\n\t{\n\t\t// If there's a source orientation, convert it to target coordinates\n\t\tk3d::vector3 source_look;\n\t\tk3d::vector3 source_up;\n\t\tif(snap_source->source_orientation(source_look, source_up))\n\t\t{\n\t\t\tsource_look = k3d::inverse(target_matrix) * Transformation * source_look;\n\t\t\tsource_up = k3d::inverse(target_matrix) * Transformation * source_up;\n\n\t\t\t// Get the target orientation in target coordinates\n\t\t\tk3d::vector3 target_look;\n\t\t\tk3d::vector3 target_up;\n\t\t\tif(snap_target->target_orientation(source_position, target_look, target_up))\n\t\t\t{\n\t\t\t\tk3d::matrix4 rotation1 = k3d::rotate3(k3d::angle_axis(\n\t\t\t\t\tstd::acos(k3d::normalize(source_look) * k3d::normalize(target_look)),\n\t\t\t\t\tsource_look ^ target_look));\n\n\t\t\t\tsource_up = rotation1 * source_up;\n\n\t\t\t\tk3d::matrix4 rotation2 = k3d::rotate3(k3d::angle_axis(\n\t\t\t\t\tstd::acos(k3d::normalize(source_up) * k3d::normalize(target_up)),\n\t\t\t\t\tsource_up ^ target_up));\n\n\t\t\t\treturn k3d::translate3(target_position - source_position) * Transformation * rotation2 * rotation1;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Just snap the position\n\treturn k3d::translate3(target_position - source_position) * Transformation;\n}\n\nvoid snap_tool_detail::transform_target::transform(k3d::isnappable* const Target, k3d::isnap_target* const SnapTarget, const double SnapDistance, const bool SnapOrientation, const bool MatchGroups, const k3d::matrix4& Transform)\n{\n\tif(!modifier)\n\t\tstart_transform();\n\n\tconst k3d::matrix4 snap_matrix = snap(Target, SnapTarget, SnapDistance, SnapOrientation, MatchGroups, Transform);\n\n\tassert_warning(k3d::property::set_internal_value(*modifier, \"matrix\", k3d::inverse(upstream_matrix(*modifier)) * snap_matrix));\n}\n\nbool snap_tool_detail::transform_target::create_transform_modifier(const std::string& Name)\n{\n\tif(modifier)\n\t\treturn false;\n\n\treturn_val_if_fail(node, false);\n\n\t// Check for an existing transform modifier\n\tk3d::inode* upstream_node = upstream_transform_modifier(*node);\n\t/** \\todo check for same name too */\n\tif(upstream_node && (k3d::classes::FrozenMatrix() == upstream_node->factory().factory_id()))\n\t{\n\t\tset_transform_modifier(upstream_node);\n\t\treturn false;\n\t}\n\n\tconst std::string modifier_name = Name + node->name();\n\tset_transform_modifier(insert_transform_modifier(*node, k3d::classes::FrozenMatrix(), modifier_name));\n\n\treturn true;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n// snap_tool_detail::mesh_target\n\nsnap_tool_detail::mesh_target::mesh_target(document_state& DocumentState, k3d::inode* Node, k3d::iproperty& MeshSourceProperty) :\n\tm_document_state(DocumentState),\n\tmesh_source_property(MeshSourceProperty),\n\tcomponent_center(k3d::point3(0, 0, 0)),\n\tm_tweaks_mutex(false)\n{\n\tnode = Node;\n\n\t// Sanity checks\n\treturn_if_fail(node);\n\n\treset_selection();\n}\n\nunsigned long snap_tool_detail::mesh_target::target_number()\n{\n\treturn selected_points.size();\n}\n\nvoid snap_tool_detail::mesh_target::reset_selection()\n{\n\tk3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(mesh_source_property.property_internal_value());\n\treturn_if_fail(mesh);\n\n\t// Get selection and save initial position\n\tcomponent_center = k3d::ngui::detail::get_selected_points(selection::state(m_document_state.document()).current_mode(), *mesh, selected_points);\n}\n\nvoid snap_tool_detail::mesh_target::reset(k3d::iunknown*)\n{\n\tif(m_tweaks_mutex)\n\t\treturn;\n\n\t// Reset position\n\treset_selection();\n\n\tmodifier = 0;\n}\n\nvoid snap_tool_detail::mesh_target::init_transformation()\n{\n\tassert_not_implemented();\n/*\n\t// Save initial positions\n\tk3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(mesh_source_property.property_internal_value());\n\treturn_if_fail(mesh);\n\tfor(detail::component_points_t::iterator point = selected_points.begin(); point != selected_points.end(); ++point)\n\t{\n\t\tconst unsigned long index = point->index;\n\t\tpoint->initial_position = mesh->points[index]->position;\n\t\tpoint->tweak_value = tweaks[index];\n\t}\n\n\t// Save orientation matrices\n\tswitch(current_system_type)\n\t{\n\t\tcase GLOBAL:\n\t\t\tm_system_orientation = k3d::inverse(k3d::node_to_world_matrix(*node));\n\t\t\tm_system_orientation_inverse = k3d::node_to_world_matrix(*node);\n\t\t\t// Zero translation components\n\t\t\tm_system_orientation[0][3] = m_system_orientation[1][3] = m_system_orientation[2][3] = 0;\n\t\t\tm_system_orientation_inverse[0][3] = m_system_orientation_inverse[1][3] = m_system_orientation_inverse[2][3] = 0;\n\t\t\tbreak;\n\t\tcase LOCAL:\n\t\t\tm_system_orientation = k3d::identity3();\n\t\t\tm_system_orientation_inverse = k3d::identity3();\n\t\t\tbreak;\n\t\tcase PARENT:\n\t\t\tm_system_orientation = k3d::inverse(k3d::node_to_world_matrix(*node)) * k3d::parent_to_world_matrix(*node);\n\t\t\tm_system_orientation_inverse = k3d::inverse(m_system_orientation);\n\t\t\t// Zero translation components\n\t\t\tm_system_orientation[0][3] = m_system_orientation[1][3] = m_system_orientation[2][3] = 0;\n\t\t\tm_system_orientation_inverse[0][3] = m_system_orientation_inverse[1][3] = m_system_orientation_inverse[2][3] = 0;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tassert_not_reached();\n\t}\n*/\n}\n\nvoid snap_tool_detail::mesh_target::start_transform()\n{\n\tassert_not_implemented();\n/*\n\tcreate_mesh_modifier(\"Move \");\n\n\tinit_transformation();\n\n\tm_origin = component_center;\n*/\n}\n\nvoid snap_tool_detail::mesh_target::transform(k3d::isnappable* const Target, k3d::isnap_target* const SnapTarget, const double SnapDistance, const bool SnapOrientation, const bool MatchGroups, const k3d::matrix4& Transform)\n{\n\tassert_not_implemented();\n/*\n\tif(SnapTarget)\n\t\tk3d::log() << warning << \"mesh snapping not implemented\" << std::endl;\n\n\tif(!modifier)\n\t\tstart_move();\n\n\t// Tweak points\n\tfor(detail::component_points_t::const_iterator point = selected_points.begin(); point != selected_points.end(); ++point)\n\t{\n\t\tconst k3d::point3 position = point->initial_position;\n\t\tconst k3d::point3 new_position = m_system_orientation * Move + position;\n\n\t\ttweaks[point->index] = (new_position - position) + point->tweak_value;\n\t}\n\n\t// Update manipulators position\n\tcomponent_center = m_system_orientation * Move + m_origin;\n\n\tupdate_mesh_modifier();\n*/\n}\n\nvoid snap_tool_detail::mesh_target::create_mesh_modifier(const std::string& Name)\n{\n\tassert_not_implemented();\n/*\n\t//if(modifier)\n\t//\treturn;\n\n\treturn_if_fail(node);\n\n\t// Get mesh to tweak\n\tk3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(mesh_source_property.property_internal_value());\n\treturn_if_fail(mesh);\n\n\t// Modify with TweakPoints\n\tconst k3d::uuid tweak_points(0xed302b87, 0x49bf4fe6, 0x99064963, 0x17ec12d9);\n\n\t// Check for an existing mesh modifier\n\tk3d::inode* upstream_node = upstream_mesh_modifier(*node);\n\tif(upstream_node && (tweak_points == upstream_node->factory().class_id()))\n\t{\n\t\tset_transform_modifier(upstream_node);\n\n\t\t// Init tweaks\n\t\ttweaks = boost::any_cast<tweaks_t>(k3d::property::pipeline_value(*modifier, \"tweaks\"));\n\t\ttweaks.resize(mesh->points.size(), k3d::point3(0, 0, 0));\n\n\t\treturn;\n\t}\n\n\t// Create a new TweakPoints modifier\n\tconst std::string modifier_name = Name + node->name() + \" components\";\n\tset_transform_modifier(insert_mesh_modifier(*node, tweak_points, modifier_name));\n\n\t// Initialize new TweakPoints modifier\n\ttweaks.clear();\n\ttweaks.resize(mesh->points.size(), k3d::point3(0, 0, 0));\n\tupdate_mesh_modifier();\n\n\t// Connect to change_signal to be acknowledged of external changes such as document Undo/Redo\n\tk3d::iproperty* property = property::get(*modifier, \"tweaks\");\n\treturn_if_fail(property);\n\tm_modifier_change_signal = property->property_changed_signal().connect(sigc::mem_fun(*this, &snap_tool_detail::mesh_target::reset));\n*/\n}\n\nvoid snap_tool_detail::mesh_target::update_mesh_modifier()\n{\n\tm_tweaks_mutex = true;\n\tassert_warning(k3d::property::set_internal_value(*modifier, \"tweaks\", tweaks));\n\tm_tweaks_mutex = false;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////\n// snap_tool_detail\n\nvoid snap_tool_detail::lbutton_down(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::key_modifiers& Modifiers)\n{\n\t// Return if an action is in progress\n\tif(MOTION_CLICK_DRAG == m_current_motion)\n\t\treturn;\n\n\tassert_warning(MOTION_NONE == m_current_motion);\n\n\t// Init action\n\tm_mouse_down_content = NOTHING;\n\n\t// Find what's under the mouse pointer\n\tk3d::selection::records picked_selectables;\n\tpick_selectables(picked_selectables, Viewport, Coordinates);\n\n\t// Shift modifier starts ADD action\n\tif(Modifiers.shift())\n\t{\n\t\tlmb_down_add();\n\t\treturn;\n\t}\n\n\t// Control modifier starts SUBTRACT action\n\tif(Modifiers.control())\n\t{\n\t\tlmb_down_subtract();\n\t\treturn;\n\t}\n\n\t// Manipulator selection starts move\n\tdetail::abstract_tool::manipulators_t manipulators;\n\tfor(k3d::selection::records::iterator record = picked_selectables.begin(); record != picked_selectables.end(); ++record)\n\t{\n\t\tfor(k3d::selection::record::tokens_t::const_iterator token = record->tokens.begin(); token != record->tokens.end(); ++token)\n\t\t{\n\t\t\tif(token->type == k3d::selection::USER1)\n\t\t\t\tmanipulators.push_back(m_abstract_tool.manipulator_name(token->id));\n\t\t}\n\t}\n\n\tconst std::string manipulator = m_abstract_tool.get_manipulator(manipulators);\n\tif(manipulator != \"\")\n\t{\n\t\tlmb_down_manipulator(manipulator);\n\t\treturn;\n\t}\n\n\t// If a node was hit ...\n\tif(k3d::selection::get_node(m_mouse_down_selection))\n\t{\n\t\tif(k3d::ngui::selection::state(m_document_state.document()).is_selected(m_mouse_down_selection))\n\t\t\tlmb_down_selected();\n\t\telse\n\t\t\tlmb_down_deselected();\n\n\t\treturn;\n\t}\n\n\tlmb_down_nothing();\n}\n\n// LMB down actions\nvoid snap_tool_detail::lmb_down_add()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\n\tm_mouse_down_content = SELECTION_ADD;\n}\n\nvoid snap_tool_detail::lmb_down_subtract()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\n\tm_mouse_down_content = SELECTION_SUBTRACT;\n}\n\nvoid snap_tool_detail::lmb_down_manipulator(const std::string& ManipulatorName)\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\n\tm_abstract_tool.set_manipulator(ManipulatorName);\n\tset_motion(MOTION_DRAG);\n\n\tm_mouse_down_content = SELECTED_OBJECT;\n}\n\nvoid snap_tool_detail::lmb_down_selected()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\n\tm_mouse_down_content = SELECTED_OBJECT;\n}\n\nvoid snap_tool_detail::lmb_down_deselected()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\n\tm_mouse_down_content = DESELECTED_OBJECT;\n\n\t// Deselect all\n\tselection::state(m_document_state.document()).deselect_all();\n\t// Select clicked object\n\tselection::state(m_document_state.document()).select(m_mouse_down_selection);\n}\n\nvoid snap_tool_detail::lmb_down_nothing()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\n\tm_mouse_down_content = NOTHING;\n}\n\nvoid snap_tool_detail::lbutton_click(const viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_CLICK_DRAG == m_current_motion)\n\t{\n\t\t// Stop click-drag\n\t\tlmb_click_stop_motion();\n\t\treturn;\n\t}\n\n\tswitch(m_mouse_down_content)\n\t{\n\t\tcase SELECTION_ADD:\n\t\t\tlmb_click_add();\n\t\tbreak;\n\t\tcase SELECTION_SUBTRACT:\n\t\t\tlmb_click_subtract();\n\t\tbreak;\n\t\tcase SELECTED_OBJECT:\n\t\t\tlmb_click_start_motion(Coordinates);\n\t\tbreak;\n\t\tcase DESELECTED_OBJECT:\n\t\t\tlmb_click_replace();\n\t\tbreak;\n\t\tcase NOTHING:\n\t\t\tlmb_click_deselect_all();\n\t\tbreak;\n\t\tdefault:\n\t\t\tassert_not_reached();\n\t}\n}\n\n// LMB click actions\nvoid snap_tool_detail::lmb_click_add()\n{\n\n\t// Shift key modifier always adds to the selection\n\tif(k3d::selection::get_node(m_mouse_down_selection))\n\t\tselection::state(m_document_state.document()).select(m_mouse_down_selection);\n\n\tk3d::finish_state_change_set(m_document, \"Selection add\", K3D_CHANGE_SET_CONTEXT);\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::lmb_click_subtract()\n{\n\n\t// Control key modifier always adds to the selection\n\tif(k3d::selection::get_node(m_mouse_down_selection))\n\t\tselection::state(m_document_state.document()).deselect(m_mouse_down_selection);\n\n\tk3d::finish_state_change_set(m_document, \"Selection subtract\", K3D_CHANGE_SET_CONTEXT);\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::lmb_click_replace()\n{\n\n\t// Replace selection\n\tselection::state(m_document_state.document()).deselect_all();\n\tif(k3d::selection::get_node(m_mouse_down_selection))\n\t\tselection::state(m_document_state.document()).select(m_mouse_down_selection);\n\n\tk3d::finish_state_change_set(m_document, \"Selection replace\", K3D_CHANGE_SET_CONTEXT);\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::lmb_click_start_motion(const k3d::point2& Coordinates)\n{\n\n\tdisconnect_navigation_input_model();\n\n\tset_motion(MOTION_CLICK_DRAG);\n\tm_abstract_tool.begin_mouse_move(Coordinates);\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::lmb_click_stop_motion()\n{\n\n\tconst std::string label = complete_mouse_move();\n\tk3d::finish_state_change_set(m_document, label, K3D_CHANGE_SET_CONTEXT);\n\n\tconnect_navigation_input_model();\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::lmb_click_deselect_all()\n{\n\n\t// Deselect all\n\tselection::state(m_document_state.document()).deselect_all();\n\n\tk3d::finish_state_change_set(m_document, \"Deselect all\", K3D_CHANGE_SET_CONTEXT);\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::lbutton_start_drag(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tdisconnect_navigation_input_model();\n\n\tswitch(m_mouse_down_content)\n\t{\n\t\tcase SELECTED_OBJECT:\n\t\tcase DESELECTED_OBJECT:\n\t\t\tlmb_start_drag_start_motion(Coordinates);\n\t\tbreak;\n\t\tcase SELECTION_ADD:\n\t\tcase SELECTION_SUBTRACT:\n\t\tcase NOTHING:\n\t\t\tlmb_start_drag_box_select(Viewport, Coordinates);\n\t\tbreak;\n\t\tdefault:\n\t\t\tassert_not_reached();\n\t}\n}\n\n// LMB start drag actions\nvoid snap_tool_detail::lmb_start_drag_start_motion(const k3d::point2& Coordinates)\n{\n\n\tm_off_screen_offset = k3d::point2(0, 0);\n\n\tset_motion(MOTION_DRAG);\n\tm_abstract_tool.begin_mouse_move(Coordinates);\n}\n\nvoid snap_tool_detail::lmb_start_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\n\tset_motion(MOTION_BOX_SELECT);\n\tm_box_selection = k3d::rectangle(Coordinates[0], Coordinates[0], Coordinates[1], Coordinates[1]);\n\tdraw_rubber_band(Viewport);\n}\n\nvoid snap_tool_detail::lmb_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\n\ton_box_select_motion(Viewport, Coordinates);\n}\n\nvoid snap_tool_detail::lbutton_end_drag(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_DRAG == m_current_motion)\n\t\tlmb_end_drag_stop_motion();\n\telse if(MOTION_BOX_SELECT == m_current_motion)\n\t\tlmb_end_drag_box_select(Viewport, Coordinates);\n\n\tconnect_navigation_input_model();\n}\n\n// LMB end drag actions\nvoid snap_tool_detail::lmb_end_drag_stop_motion()\n{\n\n\tconst std::string label = complete_mouse_move();\n\tk3d::finish_state_change_set(m_document, label, K3D_CHANGE_SET_CONTEXT);\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::lmb_end_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\n\tdraw_rubber_band(Viewport);\n\n\ton_box_select_objects(Viewport, Coordinates, m_box_selection);\n\n\t// Stop motion\n\tset_motion(MOTION_NONE);\n\n\tk3d::finish_state_change_set(m_document, \"Box selection\", K3D_CHANGE_SET_CONTEXT);\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::mbutton_click(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::key_modifiers& Modifiers)\n{\n\t// Motion mode\n\tif(MOTION_NONE != m_current_motion)\n\t{\n\t\tmmb_click_next_constraint(Viewport, Coordinates);\n\t\treturn;\n\t}\n\n\t// We aren't moving\n\tif(Modifiers.control())\n\t{\n\t\tmmb_click_switch_coordinate_system();\n\t}\n\telse if(Modifiers.shift())\n\t{\n\t\tmmb_click_manipulators_next_selection();\n\t}\n\telse\n\t{\n\t\tmmb_click_toggle_manipulators_visibility();\n\t}\n}\n\nvoid snap_tool_detail::mmb_click_toggle_manipulators_visibility()\n{\n\n\t// Toggle the visible state of the manipulators\n\tm_visible_manipulators.set_value(!m_visible_manipulators.internal_value());\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::mmb_click_manipulators_next_selection()\n{\n\n\t// Show manipulators on the next selection\n\tm_current_target = m_targets.size() ? (m_current_target + 1) % m_targets.size() : 0;\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::mmb_click_switch_coordinate_system()\n{\n\n\t// Switch coordinate system between global and local modes\n\tswitch(m_coordinate_system.internal_value())\n\t{\n\t\tcase GLOBAL:\n\t\t\tset_coordinate_system(LOCAL);\n\t\t\tbreak;\n\t\tcase LOCAL:\n\t\t\tset_coordinate_system(GLOBAL);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::mmb_click_next_constraint(viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\n\t// Set next constraint\n\tm_abstract_tool.update_constraint(Viewport, Coordinates);\n\n/*\n\t// Mouse warp\n\tconst k3d::point2 coords = Viewport.project(world_position());\n\n\tint root_x = 0;\n\tint root_y = 0;\n\tViewport.get_window()->get_origin(root_x, root_y);\n\n\tconst k3d::point2 screen_coords = k3d::point2(coords[0] + root_x, coords[1] + root_y);\n\n\t// We temporarily disable motion, so warping the pointer doesn't cause unintended side effects\n\tconst motion_t current_motion = m_current_motion;\n\tm_current_motion = MOTION_NONE;\n\tinteractive::warp_pointer(screen_coords);\n\thandle_pending_events();\n\n\t// Acknowledge new mouse position\n\tm_current_constraint->begin_mouse_move(coords);\n\n\tm_current_motion = current_motion;\n*/\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::rbutton_click(const viewport::control& Viewport, const k3d::point2& Coordinates)\n{\n\tif(MOTION_NONE == m_current_motion)\n\t\trmb_click_selection_tool();\n\telse\n\t\trmb_click_cancel_move();\n}\n\n// RMB click actions\nvoid snap_tool_detail::rmb_click_selection_tool()\n{\n\tk3d::start_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\n\tm_document_state.set_active_tool(m_document_state.selection_tool());\n\n\tk3d::finish_state_change_set(m_document, \"Selection tool\", K3D_CHANGE_SET_CONTEXT);\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::rmb_click_cancel_move()\n{\n\n\tcancel_mouse_move();\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::cancel_mouse_move()\n{\n\t// Stop motion\n\tset_motion(MOTION_NONE);\n\n\t// Undo changes\n\tk3d::cancel_state_change_set(m_document, K3D_CHANGE_SET_CONTEXT);\n\n\t// Reset targets\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t(*target)->reset(0);\n\n\tm_abstract_tool.reset();\n\n\tredraw_all();\n}\n\nstd::string snap_tool_detail::complete_mouse_move()\n{\n\tset_motion(MOTION_NONE);\n\n\treturn m_abstract_tool.get_constraint_name();\n}\n\nvoid snap_tool_detail::set_motion(const motion_t Motion)\n{\n\tm_current_motion = Motion;\n}\n\nvoid snap_tool_detail::update_manipulators_scale(viewport::control& Viewport, const k3d::point3& Origin)\n{\n\tk3d::icamera* camera = Viewport.camera();\n\treturn_if_fail(camera);\n\n\t// Project unit axis on screen space\n\tconst k3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*Viewport.camera());\n\tconst k3d::vector3 screen_parallel = screen_matrix * k3d::vector3(1, 0, 0);\n\tconst k3d::point2 position = Viewport.project(Origin);\n\tconst k3d::point2 x_axis = Viewport.project(Origin + screen_parallel);\n\tconst double length = k3d::distance(position, x_axis);\n\n\treturn_if_fail(length);\n\tm_manipulators_scale = m_manipulators_size / length;\n}\n\nbool snap_tool_detail::front_facing(viewport::control& Viewport, const k3d::vector3& Normal, const k3d::point3& Origin)\n{\n\treturn_val_if_fail(Viewport.gl_engine(), false);\n\treturn_val_if_fail(Viewport.camera(), false);\n\n\tconst k3d::matrix4 matrix = k3d::inverse(k3d::node_to_world_matrix(*Viewport.camera()));\n\tconst k3d::matrix4 orientation = k3d::identity3();\n\tconst k3d::point3 a = Origin + (orientation * Normal);\n\tconst k3d::point3 b = Origin + (orientation * -Normal);\n\treturn k3d::to_vector(matrix * a).length2() < k3d::to_vector(matrix * b).length2();\n}\n\nvoid snap_tool_detail::off_screen_warp(viewport::control& Viewport, k3d::point2& NewCoordinates)\n{\n\t// Get mouse coordinates\n\tint x, y;\n\tGdk::ModifierType modifiers;\n\tGdk::Display::get_default()->get_pointer(x, y, modifiers);\n\tk3d::point2 mouse(x, y);\n\n\t// Check for screen warp\n\tbool screen_warp = false;\n\tconst k3d::point2 previous_offset = m_off_screen_offset;\n\n\t// Wrap the mouse if it goes off the top-or-bottom of the screen ...\n\tconst int screen_height = Gdk::Display::get_default()->get_default_screen()->get_height();\n\tif(y == 0)\n\t{\n\t\tmouse = k3d::point2(mouse[0], screen_height - 2);\n\t\tscreen_warp = true;\n\n\t\tm_off_screen_offset[1] -= screen_height;\n\t}\n\telse if(screen_height - 1 == y)\n\t{\n\t\tmouse = k3d::point2(mouse[0], 1);\n\t\tscreen_warp = true;\n\n\t\tm_off_screen_offset[1] += screen_height;\n\t}\n\n\t// Wrap the mouse if it goes off the left-or-right of the screen ...\n\tconst int screen_width = Gdk::Display::get_default()->get_default_screen()->get_width();\n\tif(x == 0)\n\t{\n\t\tmouse = k3d::point2(screen_width - 2, mouse[1]);\n\t\tscreen_warp = true;\n\n\t\tm_off_screen_offset[0] -= screen_width;\n\t}\n\telse if(screen_width - 1 == x)\n\t{\n\t\tmouse = k3d::point2(1, mouse[1]);\n\t\tscreen_warp = true;\n\n\t\tm_off_screen_offset[0] += screen_width;\n\t}\n\n\tif(!screen_warp)\n\t{\n\t\t// No warp\n\t\tNewCoordinates += k3d::to_vector(m_off_screen_offset);\n\t}\n\telse\n\t{\n\t\t// Warp mouse pointer\n\t\tinteractive::warp_pointer(mouse);\n\n\t\t// Set new position\n\t\tNewCoordinates += k3d::to_vector(previous_offset);\n\t}\n}\n\nvoid snap_tool_detail::clear_targets()\n{\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t{\n\t\tdelete *target;\n\t}\n\n\tm_targets.clear();\n}\n\n/// Retrieves the current document selection, refreshing the target list\nvoid snap_tool_detail::get_current_selection()\n{\n\t// Convert the current document selection into the set of targets to be moved interactively\n\tclear_targets();\n\n\tconst k3d::nodes_t nodes = selection::state(m_document_state.document()).selected_nodes();\n\n\tif(selection::NODE == selection::state(m_document_state.document()).current_mode())\n\t{\n\t\t// Save transformable nodes as targets\n\t\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\tif(!dynamic_cast<k3d::gl::irenderable*>(*node))\n\t\t\t\tcontinue;\n\t\t\tif(!dynamic_cast<k3d::imatrix_sink*>(*node))\n\t\t\t\tcontinue;\n\n\t\t\tm_targets.push_back(new transform_target(*node));\n\t\t\t(*node)->deleted_signal().connect(sigc::mem_fun(*this, &snap_tool_detail::target_deleted));\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Component mode : save mesh nodes as targets\n\t\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t{\n\t\t\tif(!dynamic_cast<k3d::gl::irenderable*>(*node))\n\t\t\t\tcontinue;\n\n\t\t\t// Get node's mesh\n\t\t\tk3d::imesh_source* const mesh_source = dynamic_cast<k3d::imesh_source*>(*node);\n\t\t\tif(!mesh_source)\n\t\t\t\tcontinue;\n\n\t\t\t// Get non-transformed mesh output\n\t\t\tk3d::iproperty& property = mesh_source->mesh_source_output();\n\t\t\tm_targets.push_back(new mesh_target(m_document_state, *node, property));\n\n\t\t\t(*node)->deleted_signal().connect(sigc::mem_fun(*this, &snap_tool_detail::target_deleted));\n\t\t}\n\t}\n\n\tupdate_coordinate_system(0);\n}\n\nunsigned long snap_tool_detail::target_number()\n{\n\tunsigned long target_count = 0;\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\ttarget_count += (*target)->target_number();\n\n\treturn target_count;\n}\n\nvoid snap_tool_detail::update_targets()\n{\n\t// Update target list when one of them was deleted\n\tif(m_deleted_target)\n\t{\n\t\tget_current_selection();\n\t\tm_deleted_target = false;\n\t}\n}\n\nvoid snap_tool_detail::start_transform()\n{\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t(*target)->start_transform();\n}\n\nvoid snap_tool_detail::transform_targets(k3d::isnappable* const Target, k3d::isnap_target* const SnapTarget, const double SnapDistance, const bool SnapOrientation, const bool MatchGroups, const k3d::matrix4& Transform)\n{\n\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t(*target)->transform(Target, SnapTarget, SnapDistance, SnapOrientation, MatchGroups, Transform);\n\n\tredraw_all();\n}\n\nvoid snap_tool_detail::set_coordinate_system(const coordinate_system_t CoordinateSystem)\n{\n\tm_coordinate_system.set_value(CoordinateSystem);\n}\n\n/// Updates all targets : tells them what's the new coordinate system\nvoid snap_tool_detail::update_coordinate_system(k3d::iunknown*)\n{\n\tswitch(m_coordinate_system.internal_value())\n\t{\n\t\tcase GLOBAL:\n\t\t\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t\t\t(*target)->set_global();\n\t\t\tbreak;\n\t\tcase LOCAL:\n\t\t\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t\t\t(*target)->set_local();\n\t\t\tbreak;\n\t\tcase PARENT:\n\t\t\tfor(targets_t::iterator target = m_targets.begin(); target != m_targets.end(); ++target)\n\t\t\t\t(*target)->set_parent();\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tassert_not_reached();\n\t}\n\n\tredraw_all();\n}\n\n} // namespace snap\n\n} // namespace ngui\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/ngui_snap_tool/snap_tool_detail.h",
    "content": "#ifndef MODULES_NGUI_SNAP_TOOL_SNAP_TOOL_DETAIL_H\n#define MODULES_NGUI_SNAP_TOOL_SNAP_TOOL_DETAIL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/ngui/basic_viewport_input_model.h>\n#include <k3dsdk/ngui/navigation_input_model.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/tool_selection.h>\n#include <k3dsdk/ngui/transform_tool.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/transform.h>\n\nusing namespace k3d::ngui;\n\nnamespace k3d { class isnap_source; }\nnamespace k3d { class isnap_target; }\nnamespace k3d { class isnappable; }\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace snap\n{\n\nnamespace detail\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// abstract_tool\n\nclass abstract_tool\n{\npublic:\n\tvirtual ~abstract_tool() {}\n\n\t// Functions executed by transform_tool that rely on transform_tool's derived classes functions\n\tvirtual std::string manipulator_name(const k3d::selection::id ID) = 0;\n\ttypedef std::vector<std::string> manipulators_t;\n\tvirtual std::string get_manipulator(const manipulators_t& Manipulators) = 0;\n\tvirtual void set_manipulator(const std::string ManipulatorName) = 0;\n\tvirtual std::string get_constraint_name() = 0;\n\n\tvirtual void begin_mouse_move(const k3d::point2& Coordinates) = 0;\n\n\tvirtual void update_constraint(viewport::control& Viewport, const k3d::point2& Coordinates) = 0;\n\tvirtual void reset() = 0;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// snap_tool_detail\n\nclass snap_tool_detail :\n\tpublic tool_selection,\n\tpublic k3d::property_collection\n{\n\ttypedef tool_selection base;\n\npublic:\n\tsnap_tool_detail(k3d::idocument& Document, document_state& DocumentState, detail::abstract_tool& AbstractTool) :\n\t\tbase(Document, DocumentState),\n\t\tk3d::property_collection(),\n\t\tm_document(Document),\n\t\tm_document_state(DocumentState),\n\t\tm_abstract_tool(AbstractTool),\n\t\tm_navigation_model(DocumentState),\n\t\tm_current_target(0),\n\t\tm_deleted_target(false),\n\t\tm_coordinate_system(init_owner(*this) + init_name(\"coordinate_system\") + init_label(_(\"Coordinate system\")) + init_description(_(\"Coordinate system in which the transformation occurs\")) + init_value(GLOBAL) + init_enumeration(coordinate_system_values())),\n\t\tm_visible_manipulators(init_owner(*this) + init_name(\"visible_manipulators\") + init_label(_(\"Visible manipulators\")) + init_description(_(\"Shows/hides manipulators\")) + init_value(true))\n\t{\n\t\tm_coordinate_system.changed_signal().connect(sigc::mem_fun(*this, &snap_tool_detail::update_coordinate_system));\n\t\tm_visible_manipulators.changed_signal().connect(sigc::mem_fun(*this, &snap_tool_detail::redraw_all));\n\n\t\tconnect_navigation_input_model();\n\t}\n\n\t~snap_tool_detail()\n\t{\n\t\tclear_targets();\n\t}\n\n\t// Interface required for data containers\n\tk3d::idocument& document()\n\t{\n\t\treturn m_document;\n\t}\n\n\tnavigation_input_model& navigation_model()\n\t{\n\t\treturn m_navigation_model;\n\t}\n\n\tbasic_viewport_input_model& input_model()\n\t{\n\t\treturn m_input_model;\n\t}\n\nprotected:\n\tsigc::connection m_mbutton_start_drag_signal;\n\tsigc::connection m_mbutton_drag_signal;\n\tsigc::connection m_mbutton_end_drag_signal;\n\tsigc::connection m_rbutton_start_drag_signal;\n\tsigc::connection m_rbutton_drag_signal;\n\tsigc::connection m_rbutton_end_drag_signal;\n\tsigc::connection m_scroll_signal;\n\n\tvoid connect_navigation_input_model()\n\t{\n\t\tm_mbutton_start_drag_signal = m_input_model.connect_mbutton_start_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_start_drag));\n\t\tm_mbutton_drag_signal = m_input_model.connect_mbutton_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_drag));\n\t\tm_mbutton_end_drag_signal = m_input_model.connect_mbutton_end_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button1_end_drag));\n\t\tm_rbutton_start_drag_signal = m_input_model.connect_rbutton_start_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_start_drag));\n\t\tm_rbutton_drag_signal = m_input_model.connect_rbutton_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_drag));\n\t\tm_rbutton_end_drag_signal = m_input_model.connect_rbutton_end_drag(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_button2_end_drag));\n\t\tm_scroll_signal = m_input_model.connect_scroll(sigc::mem_fun(m_navigation_model, &navigation_input_model::on_scroll));\n\t}\n\n\tvoid disconnect_navigation_input_model()\n\t{\n\t\tm_mbutton_start_drag_signal.disconnect();\n\t\tm_mbutton_drag_signal.disconnect();\n\t\tm_mbutton_end_drag_signal.disconnect();\n\t\tm_rbutton_start_drag_signal.disconnect();\n\t\tm_rbutton_drag_signal.disconnect();\n\t\tm_rbutton_end_drag_signal.disconnect();\n\t\tm_scroll_signal.disconnect();\n\t}\n\n\t/// Mouse handling functions\n\tvoid lbutton_down(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::key_modifiers& Modifiers);\n\tvoid lmb_down_add();\n\tvoid lmb_down_subtract();\n\tvoid lmb_down_manipulator(const std::string& ManipulatorName);\n\tvoid lmb_down_selected();\n\tvoid lmb_down_deselected();\n\tvoid lmb_down_nothing();\n\tvoid lbutton_click(const viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lmb_click_add();\n\tvoid lmb_click_subtract();\n\tvoid lmb_click_replace();\n\tvoid lmb_click_start_motion(const k3d::point2& Coordinates);\n\tvoid lmb_click_stop_motion();\n\tvoid lmb_click_deselect_all();\n\tvoid lbutton_start_drag(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lmb_start_drag_start_motion(const k3d::point2& Coordinates);\n\tvoid lmb_start_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lmb_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lbutton_end_drag(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid lmb_end_drag_stop_motion();\n\tvoid lmb_end_drag_box_select(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid mbutton_click(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::key_modifiers& Modifiers);\n\tvoid mmb_click_toggle_manipulators_visibility();\n\tvoid mmb_click_manipulators_next_selection();\n\tvoid mmb_click_switch_coordinate_system();\n\tvoid mmb_click_next_constraint(viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid rbutton_click(const viewport::control& Viewport, const k3d::point2& Coordinates);\n\tvoid rmb_click_selection_tool();\n\tvoid rmb_click_cancel_move();\n\n\tvoid cancel_mouse_move();\n\tstd::string complete_mouse_move();\n\n\t// Common functions\n/** \\todo standardize set_motion in selection tool and transform tools */\n\tvoid set_motion(const motion_t Motion);\n\n\t/// Manipulators scale to adjust to viewport size\n\tdouble m_manipulators_scale;\n\t/// Updates manipulators scale to show at constant size after camera update\n\tvoid update_manipulators_scale(viewport::control& Viewport, const k3d::point3& Origin);\n\t/// Returns whether given direction faces the screen\n\tbool front_facing(viewport::control& Viewport, const k3d::vector3& Normal, const k3d::point3& Origin);\n\n\t/// Handles off-screen pointer warping during mouse drag\n\tvoid off_screen_warp(viewport::control& Viewport, k3d::point2& NewCoordinates);\n\t/// Keep an offset to compute mouse coordinates in an infinite virtual screen\n\tk3d::point2 m_off_screen_offset;\n\n\t/// Deletes all targets\n\tvoid clear_targets();\n\t/// Mark : one of the target nodes was deleted\n\tvoid target_deleted() { m_deleted_target = true; }\n\n\t/// Retrieves the current document selection, refreshing the target list\n\tvoid get_current_selection();\n\t/// Returns the number of selected targets (nodes or components depending on selection mode)\n\tunsigned long target_number();\n\t/// Updates target list whenever necessary (e.g. : one of them was deleted)\n\tvoid update_targets();\n\t/// Transform targets\n\tvoid start_transform();\n\tvoid transform_targets(k3d::isnappable* const Target, k3d::isnap_target* const SnapTarget, const double SnapDistance, const bool SnapOrientation, const bool MatchGroups, const k3d::matrix4& Transform);\n\nprivate:\n\t/// Stores an object to be moved interactively\n\tclass itarget\n\t{\n\tpublic:\n\t\titarget() :\n\t\t\tcurrent_system_type(GLOBAL),\n\t\t\tmodifier(0)\n\t\t{\n\t\t}\n\n\t\tvirtual ~itarget() {}\n\n\t\t// Returns selected target number\n\t\tvirtual unsigned long target_number() = 0;\n\n\t\t// Resets move\n\t\tvirtual void reset(k3d::iunknown*) = 0;\n\n\t\t// Update coordinate system\n\t\tvoid set_local() { current_system_type = LOCAL; reset(0); }\n\t\tvoid set_global() { current_system_type = GLOBAL; reset(0); }\n\t\tvoid set_parent() { current_system_type = PARENT; reset(0); }\n\n\t\t// World parameters\n\t\tk3d::matrix4 world_orientation()\n\t\t{\n\t\t\tif(LOCAL == current_system_type)\n\t\t\t\treturn k3d::extract_rotation(k3d::node_to_world_matrix(*node));\n\n\t\t\tif(PARENT == current_system_type)\n\t\t\t\treturn k3d::extract_rotation(k3d::parent_to_world_matrix(*node));\n\n\t\t\treturn k3d::identity3();\n\t\t}\n\n\t\t// Modifier\n\t\tvoid set_transform_modifier(k3d::inode* Modifier)\n\t\t{\n\t\t\tmodifier = Modifier;\n\t\t\tModifier->deleted_signal().connect(sigc::mem_fun(*this, &itarget::reset_transform_modifier));\n\t\t}\n\t\tvoid reset_transform_modifier()\n\t\t{\n\t\t\tmodifier = 0;\n\t\t}\n\n\t\t// Actions\n\t\tvirtual void start_transform() = 0;\n\t\tvirtual void transform(k3d::isnappable* const Target, k3d::isnap_target* const SnapTarget, const double SnapDistance, const bool SnapOrientation, const bool MatchGroups, const k3d::matrix4& Transform) = 0;\n\n\tprotected:\n\t\ttypedef enum\n\t\t{\n\t\t\tGLOBAL,\n\t\t\tLOCAL,\n\t\t\tPARENT\n\t\t} system_t;\n\n\t\t/// Stores the transformation type\n\t\tsystem_t current_system_type;\n\t\t/// Stores the target node\n\t\tk3d::inode* node;\n\t\t/// Stores the transformation to be applied\n\t\tk3d::inode* modifier;\n\n\t\t/// Stores initial position\n\t\tk3d::point3 m_origin;\n\t\t/// Stores manipulators matrix\n\t\tk3d::matrix4 m_manipulator_orientation;\n\t\t/// Stores orientation matrix and its inverse\n\t\tk3d::matrix4 m_system_orientation;\n\t\tk3d::matrix4 m_system_orientation_inverse;\n\t};\n\n\tclass transform_target :\n\t\tpublic itarget\n\t{\n\tpublic:\n\t\ttransform_target(k3d::inode* Node);\n\n\t\tunsigned long target_number();\n\t\tvirtual void reset(k3d::iunknown*);\n\n\t\tvirtual void start_transform();\n\t\tconst k3d::matrix4 snap(k3d::isnappable* const Target, k3d::isnap_target* const SnapTarget, const double SnapDistance, const bool SnapOrientation, const bool MatchGroups, const k3d::matrix4& Transform);\n\t\tvirtual void transform(k3d::isnappable* const Target, k3d::isnap_target* const SnapTarget, const double SnapDistance, const bool SnapOrientation, const bool MatchGroups, const k3d::matrix4& Transform);\n\n\t\tbool create_transform_modifier(const std::string& Name);\n\n\tprivate:\n\t\t/// Stores un-snapped transformation\n\t\tk3d::matrix4 m_world_transformation;\n\t\t/// Stores original rotation matrix\n\t\tk3d::matrix4 m_original_rotation;\n\t};\n\n\tclass mesh_target :\n\t\tpublic itarget\n\t{\n\tpublic:\n\t\tmesh_target(document_state& DocumentState, k3d::inode* Node, k3d::iproperty& MeshSourceProperty);\n\t\t~mesh_target()\n\t\t{\n\t\t\tm_modifier_change_signal.disconnect();\n\t\t}\n\n\t\tvirtual unsigned long target_number();\n\t\tvirtual void reset(k3d::iunknown*);\n\n\t\tvirtual void start_transform();\n\t\tvirtual void transform(k3d::isnappable* const Target, k3d::isnap_target* const SnapTarget, const double SnapDistance, const bool SnapOrientation, const bool MatchGroups, const k3d::matrix4& Transform);\n\n\tprivate:\n\t\tvoid reset_selection();\n\t\tvoid update_mesh_modifier();\n\n\t\t/// Inserts a tweak modifier\n\t\tvoid create_mesh_modifier(const std::string& Name);\n\t\t/// Initializes component transformation\n\t\tvoid init_transformation();\n\n\t\t/// Stores the owning document_state\n\t\tdocument_state& m_document_state;\n\t\t/// Stores the mesh_source property instead of the mesh itself because the k3d::mesh pointer can change\n\t\tk3d::iproperty& mesh_source_property;\n\n\t\t/// Stores the average component position\n\t\tk3d::point3 component_center;\n\t\t/// Stores the list of selected points with their index\n\t\tk3d::ngui::detail::component_points_t selected_points;\n\t\t/// Stores the tweak array when moving components\n\t\ttypedef std::vector<k3d::point3> tweaks_t;\n\t\ttweaks_t tweaks;\n\t\t/// Mutex to prevent unnecessary tweaks updates\n\t\tbool m_tweaks_mutex;\n\t\t/// Tweak change signal\n\t\tsigc::connection m_modifier_change_signal;\n\t};\n\n\t/// Defines a collection of objects to be manipulated interactively\n\ttypedef std::vector<itarget*> targets_t;\n\t/// Stores the current set of objects to be manipulated interactively\n\ttargets_t m_targets;\n\n\t/// Enumerates coordinate-system behaviors\n\ttypedef enum\n\t{\n\t\tLOCAL,\n\t\tGLOBAL,\n\t\tPARENT\n\t} coordinate_system_t;\n\n\tvoid set_coordinate_system(const coordinate_system_t CoordinateSystem);\n\tvoid update_coordinate_system(k3d::iunknown*);\n\nprotected:\n\t/// Stores the owning document\n\tk3d::idocument& m_document;\n\tdocument_state& m_document_state;\n\t/// Stores a reference to the derived tool\n\tdetail::abstract_tool& m_abstract_tool;\n\t/// Provides interactive navigation behavior\n\tnavigation_input_model m_navigation_model;\n\t/// Dispatches incoming user input events\n\tbasic_viewport_input_model m_input_model;\n\n\t/// Stores manipulators size\n\tdouble m_manipulators_size;\n\n\t/// Stores the target number used to provide local coordinates\n\tunsigned long m_current_target;\n\t/// Set to true when one of the targets is deleted\n\tbool m_deleted_target;\n\n\t/// Defines coordinate system enumeration property\n\tfriend std::ostream& operator << (std::ostream& Stream, const coordinate_system_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase LOCAL:\n\t\t\t\tStream << \"local\";\n\t\t\t\tbreak;\n\t\t\tcase GLOBAL:\n\t\t\t\tStream << \"global\";\n\t\t\t\tbreak;\n\t\t\tcase PARENT:\n\t\t\t\tStream << \"parent\";\n\t\t\t\tbreak;\n\t\t}\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator >> (std::istream& Stream, coordinate_system_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"local\")\n\t\t\tValue = LOCAL;\n\t\telse if(text == \"global\")\n\t\t\tValue = GLOBAL;\n\t\telse if(text == \"parent\")\n\t\t\tValue = PARENT;\n\t\telse\n\t\t\tk3d::log() << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& coordinate_system_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Local\", \"local\", \"Moves objects in local coordinate system\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Global\", \"global\", \"Moves objects in global coordinate system\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Parent\", \"parent\", \"Moves objects in parent's coordinate system\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\t/// Stores the current coordinate system behavior\n\tk3d_data(coordinate_system_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, no_serialization) m_coordinate_system;\n\n\t/// Stores the enabled/disabled state for the manipulators\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, no_serialization) m_visible_manipulators;\n};\n\n} // namespace snap\n\n} // namespace ngui\n\n} // namespace module\n\n#endif // !MODULES_NGUI_SNAP_TOOL_SNAP_TOOL_DETAIL_H\n\n"
  },
  {
    "path": "modules/ngui_snap_tool/tool.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"snap_tool_detail.h\"\n\n#include <gdkmm/cursor.h>\n#include <gtkmm/widget.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/geometric_operations.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/isnap_source.h>\n#include <k3dsdk/isnap_target.h>\n#include <k3dsdk/isnappable.h>\n#include <k3dsdk/line2.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/interactive.h>\n#include <k3dsdk/ngui/keyboard.h>\n#include <k3dsdk/ngui/modifiers.h>\n#include <k3dsdk/ngui/tool.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/plane.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/selectable.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/xml.h>\n\n#include <boost/assign/list_of.hpp>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace snap\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// tool\n\n/// Interactive tool that provides \"snappable\" transformations for objects\nclass tool :\n\tpublic k3d::ngui::tool,\n\tpublic k3d::iunknown\n{\npublic:\n\ttool();\n\t~tool();\n\n\tconst k3d::string_t tool_type();\n\tk3d::iproperty_collection* get_property_collection();\n\tviewport_input_model& get_input_model();\n\tstatic k3d::iplugin_factory& get_factory();\n\nprivate:\n\tvirtual void on_initialize(document_state& DocumentState);\n\tvoid on_activate();\n\tvoid on_deactivate();\n\tvoid on_document_selection_changed();\n\tvoid on_redraw(viewport::control& Viewport);\n\tvoid on_select(viewport::control& Viewport);\n\n\tclass implementation;\n\timplementation* m_implementation;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// tool::implementation\n\nstruct tool::implementation :\n\tpublic detail::abstract_tool,\n\tpublic snap_tool_detail\n{\n\ttypedef snap_tool_detail base;\n\n\tstruct constraint :\n\t\tpublic k3d::selectable\n\t{\n\t\tconstraint(const std::string& Label, Glib::RefPtr<Gdk::Pixbuf> Cursor, const k3d::selection::token& SelectionToken) :\n\t\t\tm_selection_token(SelectionToken),\n\t\t\tm_label(Label),\n\t\t\tm_cursor(Cursor),\n\t\t\tm_plane(k3d::vector3(0, 0, 1), 0),\n\t\t\tm_x_sensitivity(0),\n\t\t\tm_y_sensitivity(0),\n\t\t\tm_z_sensitivity(0)\n\t\t{\n\t\t\tassert_warning(!m_label.empty());\n\t\t}\n\n\t\tconst std::string label()\n\t\t{\n\t\t\treturn m_label;\n\t\t}\n\n\t\tGlib::RefPtr<Gdk::Pixbuf> cursor()\n\t\t{\n\t\t\treturn m_cursor;\n\t\t}\n\n\t\tvoid set_plane(const k3d::plane& Plane, const double XSensitivity, const double YSensitivity, const double ZSensitivity)\n\t\t{\n\t\t\tm_plane = Plane;\n\t\t\tm_x_sensitivity = XSensitivity;\n\t\t\tm_y_sensitivity = YSensitivity;\n\t\t\tm_z_sensitivity = ZSensitivity;\n\t\t}\n\n\t\tvoid begin_mouse_move(const k3d::point2& Mouse)\n\t\t{\n\t\t\tm_last_mouse = Mouse;\n\t\t}\n\n\t\tk3d::vector3 mouse_move(viewport::control& Viewport, const k3d::point2& Coordinates, const k3d::matrix4& Orientation)\n\t\t{\n\t\t\tconst k3d::point2 current_mouse(Coordinates);\n\n\t\t\t// Turn mouse coordinates into lines in world coordinates ...\n\t\t\tk3d::line3 last_line = mouse_to_world(Viewport, m_last_mouse);\n\t\t\tk3d::line3 current_line = mouse_to_world(Viewport, current_mouse);\n\t\t\tm_last_mouse = current_mouse;\n\n\t\t\t// Calculate intersections with our plane in world coordinates ...\n\t\t\tk3d::point3 last_intersection;\n\t\t\treturn_val_if_fail(k3d::intersect(m_plane, last_line, last_intersection), k3d::vector3(0, 0, 0));\n\n\t\t\tk3d::point3 current_intersection;\n\t\t\treturn_val_if_fail(k3d::intersect(m_plane, current_line, current_intersection), k3d::vector3(0, 0, 0));\n\n\t\t\t// Convert the change into world axis coordinates and constrain them (with sensitivity)\n\t\t\tconst k3d::vector3 delta = k3d::inverse(Orientation) * (current_intersection - last_intersection);\n\n\t\t\treturn k3d::vector3(delta[0] * m_x_sensitivity, delta[1] * m_y_sensitivity, delta[2] * m_z_sensitivity);\n\t\t}\n\n\t\tconst k3d::selection::token m_selection_token;\n\t\tconst std::string m_label;\n\t\tconst Glib::RefPtr<Gdk::Pixbuf> m_cursor;\n\n\t\t/// Stores the constraint plane in world coordinates\n\t\tk3d::plane m_plane;\n\n\t\tdouble m_x_sensitivity;\n\t\tdouble m_y_sensitivity;\n\t\tdouble m_z_sensitivity;\n\t\tk3d::point2 m_last_mouse;\n\t};\n\n\timplementation(k3d::idocument& Document, document_state& DocumentState, snap::tool& SnapTool) :\n\t\tbase(Document, DocumentState, *this),\n\t\tm_snap_tool(SnapTool),\n\t\tm_quadric(gluNewQuadric()),\n\t\tm_current_constraint(&m_screen_xy_constraint),\n\t\tm_screen_xy_constraint(_(\"Move Screen XY\"), load_icon(\"move_cursor_screen_xy\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 0)),\n\t\tm_x_constraint(_(\"Move X\"), load_icon(\"move_cursor_x\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 1)),\n\t\tm_y_constraint(_(\"Move Y\"), load_icon(\"move_cursor_y\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 2)),\n\t\tm_z_constraint(_(\"Move Z\"), load_icon(\"move_cursor_z\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 3)),\n\t\tm_xy_constraint(_(\"Move XY\"), load_icon(\"move_cursor_xy\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 4)),\n\t\tm_xz_constraint(_(\"Move XZ\"), load_icon(\"move_cursor_xz\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 5)),\n\t\tm_yz_constraint(_(\"Move YZ\"), load_icon(\"move_cursor_yz\", Gtk::ICON_SIZE_BUTTON), k3d::selection::token(k3d::selection::USER1, 6)),\n\t\tm_transformation(init_owner(*this) + init_name(\"transformation\") + init_label(_(\"Transformation\")) + init_description(_(\"Transformation\")) + init_value(k3d::identity3())),\n\t\tm_target(init_owner(*this) + init_name(\"target\") + init_label(_(\"Target\")) + init_description(_(\"Target\")) + init_value(static_cast<k3d::isnappable*>(0))),\n\t\tm_snap_target(init_owner(*this) + init_name(\"snap_target\") + init_label(_(\"Snap Target\")) + init_description(_(\"Snap Target\")) + init_value(std::string(\"\")) + init_values(m_snap_targets)),\n\t\tm_snap_distance(init_owner(*this) + init_name(\"snap_distance\") + init_label(_(\"Snap Distance\")) + init_description(_(\"Snap Distance\")) + init_value(5.0)),\n\t\tm_snap_orientation(init_owner(*this) + init_name(\"snap_orientation\") + init_label(_(\"Snap Orientation\")) + init_description(_(\"Snap Orientation\")) + init_value(true)),\n\t\tm_match_groups(init_owner(*this) + init_name(\"match_groups\") + init_label(_(\"Match Groups\")) + init_description(_(\"Match Groups\")) + init_value(true))\n\t{\n\t\tm_transformation.connect_explicit_change_signal(sigc::mem_fun(*this, &implementation::on_move));\n\n\t\tm_input_model.connect_lbutton_down(sigc::mem_fun(*this, &implementation::on_lbutton_down));\n\t\tm_input_model.connect_lbutton_click(sigc::mem_fun(*this, &implementation::on_lbutton_click));\n\t\tm_input_model.connect_lbutton_start_drag(sigc::mem_fun(*this, &implementation::on_lbutton_start_drag));\n\t\tm_input_model.connect_lbutton_drag(sigc::mem_fun(*this, &implementation::on_lbutton_drag));\n\t\tm_input_model.connect_lbutton_end_drag(sigc::mem_fun(*this, &implementation::on_lbutton_end_drag));\n\t\tm_input_model.connect_mbutton_click(sigc::mem_fun(*this, &implementation::on_mbutton_click));\n\t\tm_input_model.connect_rbutton_click(sigc::mem_fun(*this, &implementation::on_rbutton_click));\n\t\tm_input_model.connect_mouse_move(sigc::mem_fun(*this, &implementation::on_mouse_move));\n\n\t\ton_target_changed(0);\n\t\tm_target.changed_signal().connect(sigc::mem_fun(*this, &implementation::on_target_changed));\n\t}\n\n\t~implementation()\n\t{\n\t\tgluDeleteQuadric(m_quadric);\n\t}\n\n\tvoid on_target_changed(k3d::iunknown*)\n\t{\n\t\tm_snap_targets.clear();\n\t\tm_snap_targets.push_back(k3d::ienumeration_property::enumeration_value_t(\"-- Automatic --\", \"\", \"-- Automatic --\"));\n\n\t\tif(k3d::isnappable* const snappable = m_target.internal_value())\n\t\t{\n\t\t\tconst k3d::isnappable::snap_targets_t targets = snappable->snap_targets();\n\n\t\t\tunsigned long count = 0;\n\t\t\tfor(k3d::isnappable::snap_targets_t::const_iterator target = targets.begin(); target != targets.end(); ++target)\n\t\t\t{\n\t\t\t\tm_snap_targets.push_back(\n\t\t\t\t\tk3d::ienumeration_property::enumeration_value_t(\n\t\t\t\t\t\t(*target)->label(), k3d::string_cast(count++), (*target)->label()));\n\t\t\t}\n\t\t}\n\n\t\tm_snap_target.notify_enumeration_values_changed();\n\t}\n\n\tvoid on_activate()\n\t{\n\t\t// Load parameters from configuration file\n\t\ttry\n\t\t{\n\t\t\tk3d::filesystem::ifstream layout_stream(k3d::share_path() / k3d::filesystem::generic_path(\"ngui/tool_layout.k3d\"));\n\t\t\tk3d::xml::element layout_xml;\n\t\t\tlayout_stream >> layout_xml;\n\t\t\tk3d::xml::element& xml_move = layout_xml.safe_element(\"application\").safe_element(\"user_interface\").safe_element(\"tools\").safe_element(\"move\");\n\n\t\t\tm_manipulators_size = k3d::xml::attribute_value<double>(xml_move, \"size\", 10);\n\t\t\tm_current_color = k3d::xml::attribute_value<k3d::color>(xml_move, \"current_color\", k3d::color(1, 1, 0));\n\t\t\tm_x_color = k3d::xml::attribute_value<k3d::color>(xml_move, \"x_color\", k3d::color(1, 0, 0));\n\t\t\tm_y_color = k3d::xml::attribute_value<k3d::color>(xml_move, \"y_color\", k3d::color(0, 1, 0));\n\t\t\tm_z_color = k3d::xml::attribute_value<k3d::color>(xml_move, \"z_color\", k3d::color(0, 0, 1));\n\t\t\tm_screen_xy_color = k3d::xml::attribute_value<k3d::color>(xml_move, \"screen_xy_color\", k3d::color(0.9, 0.9, 0.9));\n\t\t\tm_plane_offset = k3d::xml::attribute_value<double>(xml_move, \"plane_offset\", 5);\n\t\t\tm_plane_size = k3d::xml::attribute_value<double>(xml_move, \"plane_size\", 4.8);\n\t\t\tm_screen_xy_radius = k3d::xml::attribute_value<double>(xml_move, \"screen_xy_radius\", 0.5);\n\t\t\tm_screen_xy_slices = k3d::xml::attribute_value<unsigned long>(xml_move, \"screen_xy_slices\", 8);\n\t\t\tm_screen_xy_stacks = k3d::xml::attribute_value<unsigned long>(xml_move, \"screen_xy_stacks\", 8);\n\t\t\tm_axis_start = k3d::xml::attribute_value<double>(xml_move, \"axis_start\", 5);\n\t\t\tm_axis_end = k3d::xml::attribute_value<double>(xml_move, \"axis_end\", 10);\n\t\t\tm_axis_line_width = k3d::xml::attribute_value<double>(xml_move, \"axis_line_width\", 1);\n\t\t\tm_axis_arrow_radius = k3d::xml::attribute_value<double>(xml_move, \"axis_arrow_radius\", 0.5);\n\t\t\tm_axis_arrow_length = k3d::xml::attribute_value<double>(xml_move, \"axis_arrow_length\", 2.0);\n\t\t\tm_axis_arrow_slices = k3d::xml::attribute_value<unsigned long>(xml_move, \"axis_arrow_slices\", 8);\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t}\n\n\t\tm_visible_manipulators.set_value(true);\n\t\tset_constraint(&m_screen_xy_constraint);\n\t\ton_document_selection_changed();\n\n\t\tredraw_all();\n\t}\n\n\tvoid on_deactivate()\n\t{\n\t\tif(MOTION_NONE != m_current_motion)\n\t\t\tcancel_mouse_move();\n\n\t\tclear_targets();\n\n\t\tm_document_state.clear_cursor_signal().emit();\n\t\tredraw_all();\n\t}\n\n\tvoid on_document_selection_changed()\n\t{\n\t\tget_current_selection();\n\t\treset();\n\t}\n\n\tvoid on_lbutton_down(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\t\tconst k3d::key_modifiers modifiers = convert(Event.state);\n\n\t\tlbutton_down(Viewport, coordinates, modifiers);\n\t}\n\n\tvoid on_lbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_click(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_start_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_start_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_drag(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tk3d::point2 coordinates(Event.x, Event.y);\n\n\t\t// Off-screen wrap\n\t\toff_screen_warp(Viewport, coordinates);\n\n\t\tconst k3d::vector3 move = lbutton_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_lbutton_end_drag(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\tlbutton_end_drag(Viewport, coordinates);\n\t}\n\n\tvoid on_mbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\t\tconst k3d::key_modifiers modifiers = convert(Event.state);\n\n\t\tmbutton_click(Viewport, coordinates, modifiers);\n\t}\n\n\tvoid on_rbutton_click(viewport::control& Viewport, const GdkEventButton& Event)\n\t{\n\t\tconst k3d::point2 coordinates(Event.x, Event.y);\n\n\t\trbutton_click(Viewport, coordinates);\n\t}\n\n\tvoid on_mouse_move(viewport::control& Viewport, const GdkEventMotion& Event)\n\t{\n\t\tif(MOTION_CLICK_DRAG != m_current_motion)\n\t\t\treturn;\n\n\t\tk3d::point2 coordinates(Event.x, Event.y);\n\n\t\t// Off-screen wrap\n\t\toff_screen_warp(Viewport, coordinates);\n\n\t\tconst k3d::vector3 move = mouse_move_action(Viewport, coordinates);\n\t}\n\n\tvoid on_redraw(viewport::control& Viewport)\n\t{\n\t\t// Sanity checks\n\t\treturn_if_fail(Viewport.gl_engine());\n\t\treturn_if_fail(Viewport.camera());\n\n\t\t// Update target list\n\t\tupdate_targets();\n\n\t\t// Update constraints\n\t\tconst k3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*Viewport.camera());\n\t\tconst k3d::vector3 screen_normal = screen_matrix * k3d::vector3(0, 0, 1);\n\n\t\tconst k3d::point3 origin = m_transformation.internal_value() * k3d::point3();\n\t\tconst k3d::matrix4 orientation = k3d::identity3();\n\n\t\t// Update the screen xy constraint so it always aligns with the camera direction vector in world coordinates\n\t\tm_screen_xy_constraint.set_plane(k3d::plane(screen_normal, origin), 1, 1, 1);\n\n\t\t// Update axis constraints so their planes are always as perpendicular to the screen as-possible\n\t\tm_x_constraint.set_plane(k3d::plane((orientation * k3d::vector3(1, 0, 0)) ^ ((orientation * k3d::vector3(1, 0, 0)) ^ screen_normal), origin), 1, 0, 0);\n\t\tm_y_constraint.set_plane(k3d::plane((orientation * k3d::vector3(0, 1, 0)) ^ ((orientation * k3d::vector3(0, 1, 0)) ^ screen_normal), origin), 0, 1, 0);\n\t\tm_z_constraint.set_plane(k3d::plane((orientation * k3d::vector3(0, 0, 1)) ^ ((orientation * k3d::vector3(0, 0, 1)) ^ screen_normal), origin), 0, 0, 1);\n\n\t\t// Update plane constraints so they have the correct positions in world coordinates\n\t\tm_xy_constraint.set_plane(k3d::plane(orientation * k3d::vector3(0, 0, 1), origin), 1, 1, 0);\n\t\tm_xz_constraint.set_plane(k3d::plane(orientation * k3d::vector3(0, 1, 0), origin), 1, 0, 1);\n\t\tm_yz_constraint.set_plane(k3d::plane(orientation * k3d::vector3(1, 0, 0), origin), 0, 1, 1);\n\n\t\t// Draw manipulators\n\t\tif(!m_visible_manipulators.internal_value() || !target_number())\n\t\t\treturn;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(k3d::to_vector(origin)));\n\t\tk3d::gl::push_matrix(orientation);\n\n\t\tglClear(GL_DEPTH_BUFFER_BIT);\n\n\t\t// Scale manipulators to show them at constant size (except on mouse drag)\n\t\tif(m_current_motion == MOTION_NONE)\n\t\t\tupdate_manipulators_scale(Viewport, origin);\n\n\t\tglScaled(m_manipulators_scale, m_manipulators_scale, m_manipulators_scale);\n\n\t\t// Draw manipulators\n\t\tk3d::vector3 px;\n\t\tk3d::vector3 py;\n\t\tk3d::vector3 pz;\n\n\t\tconst bool motion = (MOTION_DRAG == m_current_motion) || (MOTION_CLICK_DRAG == m_current_motion);\n\n\t\tif(!motion || &m_x_constraint == m_current_constraint || &m_xy_constraint == m_current_constraint || &m_xz_constraint == m_current_constraint)\n\t\t{\n\t\t\tif(front_facing(Viewport, k3d::vector3(1, 0, 0), origin))\n\t\t\t{\n\t\t\t\tpx = k3d::vector3(1, 0, 0);\n\t\t\t\tdraw_axis(m_x_color, m_current_constraint == &m_x_constraint ? m_current_color : m_x_color, k3d::rotate3(k3d::radians(90.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpx = k3d::vector3(-1, 0, 0);\n\t\t\t\tdraw_axis(m_x_color, m_current_constraint == &m_x_constraint ? m_current_color : m_x_color, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t}\n\n\t\tif(!motion || &m_y_constraint == m_current_constraint || &m_xy_constraint == m_current_constraint || &m_yz_constraint == m_current_constraint)\n\t\t{\n\t\t\tif(front_facing(Viewport, k3d::vector3(0, -1, 0), origin))\n\t\t\t{\n\t\t\t\tpy = k3d::vector3(0, -1, 0);\n\t\t\t\tdraw_axis(m_y_color, m_current_constraint == &m_y_constraint ? m_current_color : m_y_color, k3d::rotate3(k3d::radians(90.0), k3d::vector3(1, 0, 0)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpy = k3d::vector3(0, 1, 0);\n\t\t\t\tdraw_axis(m_y_color, m_current_constraint == &m_y_constraint ? m_current_color : m_y_color, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(1, 0, 0)));\n\t\t\t}\n\t\t}\n\n\t\tif(!motion || &m_z_constraint == m_current_constraint || &m_xz_constraint == m_current_constraint || &m_yz_constraint == m_current_constraint)\n\t\t{\n\t\t\tif(front_facing(Viewport, k3d::vector3(0, 0, 1), origin))\n\t\t\t{\n\t\t\t\tpz = k3d::vector3(0, 0, 1);\n\t\t\t\tdraw_axis(m_z_color, m_current_constraint == &m_z_constraint ? m_current_color : m_z_color, k3d::rotate3(k3d::radians(0.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpz = k3d::vector3(0, 0, -1);\n\t\t\t\tdraw_axis(m_z_color, m_current_constraint == &m_z_constraint ? m_current_color : m_z_color, k3d::rotate3(k3d::radians(180.0), k3d::vector3(0, 1, 0)));\n\t\t\t}\n\t\t}\n\n\t\tif(!motion || &m_yz_constraint == m_current_constraint)\n\t\t\tdraw_plane(m_current_constraint == &m_yz_constraint ? m_current_color : m_x_color, py, py + pz, pz);\n\t\tif(!motion || &m_xz_constraint == m_current_constraint)\n\t\t\tdraw_plane(m_current_constraint == &m_xz_constraint ? m_current_color : m_y_color, px, px + pz, pz);\n\t\tif(!motion || &m_xy_constraint == m_current_constraint)\n\t\t\tdraw_plane(m_current_constraint == &m_xy_constraint ? m_current_color : m_z_color, px, px + py, py);\n\n\t\tif(!motion || &m_screen_xy_constraint == m_current_constraint)\n\t\t\tdraw_screen_xy(Viewport, m_current_constraint == &m_screen_xy_constraint ? m_current_color : m_screen_xy_color);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\t}\n\n\tvoid on_select(viewport::control& Viewport)\n\t{\n\t\tif(!m_visible_manipulators.internal_value() || !target_number())\n\t\t\treturn;\n\n\t\tconst k3d::point3 origin = m_transformation.internal_value() * k3d::point3();\n\t\tconst k3d::matrix4 orientation = k3d::identity3();\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(k3d::to_vector(origin)));\n\t\tk3d::gl::push_matrix(orientation);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglClear(GL_DEPTH_BUFFER_BIT);\n\n\t\t// Scale manipulators\n\t\tglScaled(m_manipulators_scale, m_manipulators_scale, m_manipulators_scale);\n\n\t\t// Draw manipulators\n\t\tk3d::vector3 px;\n\t\tk3d::vector3 py;\n\t\tk3d::vector3 pz;\n\n\t\tif(front_facing(Viewport, k3d::vector3(1, 0, 0), origin))\n\t\t{\n\t\t\tpx = k3d::vector3(1, 0, 0);\n\t\t\tselect_axis(m_x_constraint, k3d::rotate3(k3d::radians(90.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpx = k3d::vector3(-1, 0, 0);\n\t\t\tselect_axis(m_x_constraint, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\n\t\tif(front_facing(Viewport, k3d::vector3(0, -1, 0), origin))\n\t\t{\n\t\t\tpy = k3d::vector3(0, -1, 0);\n\t\t\tselect_axis(m_y_constraint, k3d::rotate3(k3d::radians(90.0), k3d::vector3(1, 0, 0)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpy = k3d::vector3(0, 1, 0);\n\t\t\tselect_axis(m_y_constraint, k3d::rotate3(k3d::radians(-90.0), k3d::vector3(1, 0, 0)));\n\t\t}\n\n\t\tif(front_facing(Viewport, k3d::vector3(0, 0, 1), origin))\n\t\t{\n\t\t\tpz = k3d::vector3(0, 0, 1);\n\t\t\tselect_axis(m_z_constraint, k3d::rotate3(k3d::radians(0.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpz = k3d::vector3(0, 0, -1);\n\t\t\tselect_axis(m_z_constraint, k3d::rotate3(k3d::radians(180.0), k3d::vector3(0, 1, 0)));\n\t\t}\n\n\t\tselect_plane(m_yz_constraint, py, py + pz, pz);\n\t\tselect_plane(m_xz_constraint, px, px + pz, pz);\n\t\tselect_plane(m_xy_constraint, px, px + py, py);\n\n\t\tselect_screen_xy(m_screen_xy_constraint);\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPopMatrix();\n\t}\n\nprivate:\n\t// abstract_tool implementation\n\tvirtual std::string manipulator_name(const k3d::selection::id ID)\n\t{\n\t\tif(ID == m_screen_xy_constraint.m_selection_token.id)\n\t\t\treturn \"screen_xy\";\n\t\telse if(ID == m_x_constraint.m_selection_token.id)\n\t\t\treturn \"x_axis\";\n\t\telse if(ID == m_y_constraint.m_selection_token.id)\n\t\t\treturn \"y_axis\";\n\t\telse if(ID == m_z_constraint.m_selection_token.id)\n\t\t\treturn \"z_axis\";\n\t\telse if(ID == m_xy_constraint.m_selection_token.id)\n\t\t\treturn \"xy_plane\";\n\t\telse if(ID == m_xz_constraint.m_selection_token.id)\n\t\t\treturn \"xz_plane\";\n\t\telse if(ID == m_yz_constraint.m_selection_token.id)\n\t\t\treturn \"yz_plane\";\n\n\t\treturn \"\";\n\t}\n\n\tvirtual std::string get_manipulator(const manipulators_t& Manipulators)\n\t{\n\t\tif(!Manipulators.size())\n\t\t\treturn std::string(\"\");\n\n\t\t// Give priority to the middle sphere since the invisible planes intersect it\n\t\tif(std::find(Manipulators.begin(), Manipulators.end(), std::string(\"screen_xy\"))\n\t\t\t!= Manipulators.end())\n\t\t\treturn std::string(\"screen_xy\");\n\n\t\treturn *Manipulators.begin();\n\t}\n\n\t// Set manipulator constraint\n\tvirtual void set_manipulator(const std::string ManipulatorName)\n\t{\n\t\tif(ManipulatorName == \"screen_xy\")\n\t\t\tset_constraint(&m_screen_xy_constraint);\n\t\telse if(ManipulatorName == \"x_axis\")\n\t\t\tset_constraint(&m_x_constraint);\n\t\telse if(ManipulatorName == \"y_axis\")\n\t\t\tset_constraint(&m_y_constraint);\n\t\telse if(ManipulatorName == \"z_axis\")\n\t\t\tset_constraint(&m_z_constraint);\n\t\telse if(ManipulatorName == \"xy_plane\")\n\t\t\tset_constraint(&m_xy_constraint);\n\t\telse if(ManipulatorName == \"xz_plane\")\n\t\t\tset_constraint(&m_xz_constraint);\n\t\telse if(ManipulatorName == \"yz_plane\")\n\t\t\tset_constraint(&m_yz_constraint);\n\t\telse\n\t\t\tassert_not_reached();\n\t}\n\n\tvirtual std::string get_constraint_name()\n\t{\n\t\treturn_val_if_fail(m_current_constraint, \"\");\n\n\t\treturn m_current_constraint->label();\n\t}\n\n\tvirtual void begin_mouse_move(const k3d::point2& Coordinates)\n\t{\n\t\treturn_if_fail(m_current_constraint);\n\n\t\tstart_transform();\n\t\tm_current_constraint->begin_mouse_move(Coordinates);\n\t}\n\n\tvoid set_constraint(constraint* const Constraint)\n\t{\n\t\treturn_if_fail(Constraint);\n\n\t\tm_current_constraint = Constraint;\n\t\tm_document_state.set_cursor_signal().emit(m_current_constraint->cursor());\n\n\t\tredraw_all();\n\t}\n\n\tconstraint* cycle_constraint(constraint* Constraint)\n\t{\n\t\tif(Constraint == &m_x_constraint)\n\t\t\treturn &m_y_constraint;\n\n\t\tif(Constraint == &m_y_constraint)\n\t\t\treturn &m_z_constraint;\n\n\t\tif(Constraint == &m_z_constraint)\n\t\t\treturn &m_x_constraint;\n\n\t\treturn 0;\n\t}\n\n\tvirtual void update_constraint(viewport::control& Viewport, const k3d::point2& Coordinates)\n\t{\n\t\tconst k3d::point3 origin = m_transformation.internal_value() * k3d::point3();\n\n\t\t// Cycle through X - Screen - Y - Screen - Z - Screen - X - etc\n\t\tif(m_current_constraint == &m_x_constraint || m_current_constraint == &m_y_constraint || m_current_constraint == &m_z_constraint)\n\t\t{\n\t\t\t// Save current constraint\n\t\t\tm_previous_constraint = m_current_constraint;\n\n\t\t\t// Go back to screeen mode\n\t\t\tset_constraint(&m_screen_xy_constraint);\n\t\t}\n\t\telse if(m_previous_constraint)\n\t\t{\n\t\t\t// An axis was previously chosen, cycle to next one\n\t\t\tset_constraint(cycle_constraint(m_previous_constraint));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Constrain movement to the \"nearest\" axis\n\t\t\tconst k3d::point2 mouse(Coordinates);\n\t\t\tconst k3d::point2 coords = Viewport.project(origin);\n\t\t\tconst k3d::matrix4 orientation = k3d::identity3();\n\n\t\t\tstd::map<double, constraint*> constraints;\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(origin + (orientation * k3d::vector3(1, 0, 0))))), &m_x_constraint));\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(origin + (orientation * k3d::vector3(0, 1, 0))))), &m_y_constraint));\n\t\t\tconstraints.insert(std::make_pair(k3d::distance(mouse, k3d::line2(coords, Viewport.project(origin + (orientation * k3d::vector3(0, 0, 1))))), &m_z_constraint));\n\n\t\t\tset_constraint(constraints.begin()->second);\n\t\t}\n\n\t\tbegin_mouse_move(Coordinates);\n\t}\n\n\tvirtual void reset()\n\t{\n\t\tm_transformation.set_value(k3d::identity3());\n\t}\n\n\t// Manipulator drawing/selection functions\n\tvoid draw_screen_xy(viewport::control& Viewport, const k3d::color& Color)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::color3d(Color);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, Color);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\n\t\tglEnable(GL_LIGHTING);\n\t\tgluQuadricDrawStyle(m_quadric, GLU_FILL);\n\t\tgluQuadricNormals(m_quadric, GLU_SMOOTH);\n\t\tgluSphere(m_quadric, m_screen_xy_radius, m_screen_xy_slices, m_screen_xy_stacks);\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid select_screen_xy(constraint& Constraint)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\n\t\tk3d::gl::push_selection_token(Constraint.m_selection_token);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tgluQuadricDrawStyle(m_quadric, GLU_FILL);\n\t\tgluQuadricNormals(m_quadric, GLU_NONE);\n\t\tgluSphere(m_quadric, m_screen_xy_radius, m_screen_xy_slices, m_screen_xy_stacks);\n\n\t\tk3d::gl::pop_selection_token();\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid draw_axis(const k3d::color& ArrowColor, const k3d::color& AxisColor, const k3d::matrix4& Matrix)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(Matrix);\n\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(0, 0, m_axis_end - (0.5 * m_axis_arrow_length)));\n\t\tglEnable(GL_LIGHTING);\n\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, AxisColor);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n\t\tgluQuadricDrawStyle(m_quadric, GLU_FILL);\n\t\tgluQuadricNormals(m_quadric, GLU_SMOOTH);\n\t\tgluCylinder(m_quadric, m_axis_arrow_radius, m_axis_arrow_radius * 0.001, m_axis_arrow_length, m_axis_arrow_slices, 1);\n\t\tglPopMatrix();\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglHint(GL_LINE_SMOOTH_HINT, GL_NICEST);\n\t\tglEnable(GL_LINE_SMOOTH);\n\t\tglLineWidth(m_axis_line_width);\n\t\tk3d::gl::color3d(AxisColor);\n\t\tglBegin(GL_LINES);\n\t\t\tglVertex3d(0, 0, m_axis_start);\n\t\t\tglVertex3d(0, 0, m_axis_end);\n\t\tglEnd();\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid select_axis(constraint& Constraint, const k3d::matrix4& Matrix)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(Matrix);\n\n\t\tk3d::gl::push_selection_token(Constraint.m_selection_token);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(0, 0, m_axis_end - (0.5 * m_axis_arrow_length)));\n\t\tgluQuadricDrawStyle(m_quadric, GLU_FILL);\n\t\tgluQuadricNormals(m_quadric, GLU_NONE);\n\t\tgluCylinder(m_quadric, m_axis_arrow_radius, m_axis_arrow_radius * 0.001, m_axis_arrow_length, m_axis_arrow_slices, 1);\n\t\tglPopMatrix();\n\n\t\tglBegin(GL_LINES);\n\t\t\tglVertex3d(0, 0, m_axis_start);\n\t\t\tglVertex3d(0, 0, m_axis_end);\n\t\tglEnd();\n\t\tk3d::gl::pop_selection_token();\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid draw_plane(const k3d::color& Color, const k3d::vector3& P1, const k3d::vector3& P2, const k3d::vector3& P3)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tk3d::gl::color3d(Color);\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglLineWidth(m_axis_line_width);\n\n\t\tglBegin(GL_LINE_STRIP);\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P1 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P2 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P3 * m_plane_size));\n\t\tglEnd();\n\t}\n\n\tvoid select_plane(constraint& Constraint, const k3d::vector3& P1, const k3d::vector3& P2, const k3d::vector3& P3)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tk3d::gl::push_selection_token(Constraint.m_selection_token);\n\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglBegin(GL_QUADS);\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P1 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P2 * m_plane_size));\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) + (P3 * m_plane_size));\n\t\tglEnd();\n\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\t// LMB drag actions\n\tk3d::vector3 mouse_move_to_3d(viewport::control& Viewport, const k3d::point2& Coordinates)\n\t{\n\t\treturn_val_if_fail(m_current_constraint, k3d::vector3(0, 0, 0));\n\n\t\t// Transform mouse move to a world move\n\t\tconst k3d::matrix4 orientation = k3d::identity3();\n\t\tconst k3d::vector3 delta = m_current_constraint->mouse_move(Viewport, Coordinates, orientation);\n\n\t\treturn delta;\n\t}\n\n\tk3d::vector3 lbutton_drag(viewport::control& Viewport, const k3d::point2& Coordinates)\n\t{\n\t\tif(MOTION_DRAG == m_current_motion)\n\t\t{\n\t\t\tconst k3d::vector3 delta = mouse_move_to_3d(Viewport, Coordinates);\n\t\t\tmove_selection(delta);\n\n\t\t\treturn delta;\n\t\t}\n\n\t\tif(MOTION_BOX_SELECT == m_current_motion)\n\t\t\tlmb_drag_box_select(Viewport, Coordinates);\n\n\t\treturn k3d::vector3(0, 0, 0);\n\t}\n\n\tk3d::vector3 mouse_move_action(viewport::control& Viewport, const k3d::point2& Coordinates)\n\t{\n\t\tif(MOTION_CLICK_DRAG == m_current_motion)\n\t\t{\n\t\t\tconst k3d::vector3 delta = mouse_move_to_3d(Viewport, Coordinates);\n\t\t\tmove_selection(delta);\n\n\t\t\treturn delta;\n\t\t}\n\n\t\treturn k3d::vector3(0, 0, 0);\n\t}\n\n\tvoid move_selection(const k3d::vector3& Delta)\n\t{\n\t\tif(Delta == k3d::vector3(0, 0, 0))\n\t\t\treturn;\n\n\t\tm_transformation.set_value(k3d::translate3(Delta) * m_transformation.internal_value());\n\t}\n\n\tvoid on_move(k3d::iunknown*)\n\t{\n\t\tk3d::isnap_target* snap_target = 0;\n\n\t\tif(k3d::isnappable* const snappable = m_target.internal_value())\n\t\t{\n\t\t\tconst std::string snap_target_string = m_snap_target.internal_value();\n\t\t\tif(!snap_target_string.empty())\n\t\t\t{\n\t\t\t\tconst unsigned long snap_target_id = k3d::from_string<unsigned long>(snap_target_string, 0);\n\t\t\t\tconst k3d::isnappable::snap_targets_t targets = snappable->snap_targets();\n\n\t\t\t\tif(snap_target_id < targets.size())\n\t\t\t\t\tsnap_target = targets[snap_target_id];\n\t\t\t}\n\t\t}\n\n\t\ttransform_targets(m_target.internal_value(), snap_target, m_snap_distance.internal_value(), m_snap_orientation.internal_value(), m_match_groups.internal_value(), m_transformation.internal_value());\n\t\tredraw_all();\n\t}\n\n\t/// Stores a back-pointer to our parent\n\tsnap::tool& m_snap_tool;\n\t/// Stores a GLU quadric object for drawing the manipulators\n\tGLUquadricObj* const m_quadric;\n\n\t/// Stores the constraint that was in effect when movement began (if any)\n\tconstraint* m_current_constraint;\n\t/// Stores the constraint that was in effect before m_current_constraint\n\tconstraint* m_previous_constraint;\n\n\t// These are placeholders, used to identify hotspots in the manipulators\n\tconstraint m_screen_xy_constraint;\n\tconstraint m_x_constraint;\n\tconstraint m_y_constraint;\n\tconstraint m_z_constraint;\n\tconstraint m_xy_constraint;\n\tconstraint m_xz_constraint;\n\tconstraint m_yz_constraint;\n\n\t// Parameters that control the on-screen appearance of the tool\n\tk3d::color m_current_color;\n\tk3d::color m_x_color;\n\tk3d::color m_y_color;\n\tk3d::color m_z_color;\n\tk3d::color m_screen_xy_color;\n\tdouble m_plane_offset;\n\tdouble m_plane_size;\n\tdouble m_screen_xy_radius;\n\tunsigned long m_screen_xy_slices;\n\tunsigned long m_screen_xy_stacks;\n\tdouble m_axis_start;\n\tdouble m_axis_end;\n\tdouble m_axis_line_width;\n\tdouble m_axis_arrow_radius;\n\tdouble m_axis_arrow_length;\n\tunsigned long m_axis_arrow_slices;\n\n\tk3d_data(k3d::matrix4, immutable_name, explicit_change_signal, with_undo, local_storage, no_constraint, writable_property, no_serialization) m_transformation;\n\tk3d_data(k3d::isnappable*, immutable_name, change_signal, no_undo, node_storage, no_constraint, node_property, no_serialization) m_target;\n\tk3d_data(std::string, immutable_name, change_signal, no_undo, local_storage, no_constraint, enumeration_property, no_serialization) m_snap_target;\n\tk3d_data(double, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) m_snap_distance;\n\tk3d_data(bool, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) m_snap_orientation;\n\tk3d_data(bool, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) m_match_groups;\n\n\tk3d::ienumeration_property::enumeration_values_t m_snap_sources;\n\tk3d::ienumeration_property::enumeration_values_t m_snap_targets;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// tool\n\ntool::tool() :\n\tm_implementation(0)\n{\n}\n\ntool::~tool()\n{\n\tdelete m_implementation;\n}\n\nconst k3d::string_t tool::tool_type()\n{\n\treturn get_factory().name();\n}\n\nk3d::iproperty_collection* tool::get_property_collection()\n{\n\treturn dynamic_cast<k3d::iproperty_collection*>(m_implementation);\n}\n\nviewport_input_model& tool::get_input_model()\n{\n\treturn m_implementation->input_model();\n}\n\nk3d::iplugin_factory& tool::get_factory()\n{\n\tstatic k3d::application_plugin_factory<tool> factory(\n\t\tk3d::uuid(0xba57d873, 0xa34fe142, 0xf9cb54b6, 0xffa15af4),\n\t\t\"NGUISnapTool\",\n\t\t_(\"Provides interactive controls for 'snapping' nodes.\"),\n\t\t\"NGUI Tool\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"ngui:component-type\", \"tool\"));\n\n\treturn factory;\n}\n\nvoid tool::on_initialize(document_state& DocumentState)\n{\n\tm_implementation = new implementation(DocumentState.document(), DocumentState, *this);\n}\n\nvoid tool::on_activate()\n{\n\tm_implementation->on_activate();\n}\n\nvoid tool::on_deactivate()\n{\n\tm_implementation->on_deactivate();\n}\n\nvoid tool::on_document_selection_changed()\n{\n\tm_implementation->on_document_selection_changed();\n}\n\nvoid tool::on_redraw(viewport::control& Viewport)\n{\n\tm_implementation->on_redraw(Viewport);\n}\n\nvoid tool::on_select(viewport::control& Viewport)\n{\n\tm_implementation->on_select(Viewport);\n}\n\n} // namespace snap\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::snap::tool::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_space_navigator/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-space-navigator)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-space-navigator)\n\nTARGET_LINK_LIBRARIES(k3d-ngui-space-navigator spnav)\n"
  },
  {
    "path": "modules/ngui_space_navigator/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/user_interface.h>\n\n#include <gtkmm/label.h>\n\n#include <glibmm/dispatcher.h>\n#include <glibmm/thread.h>\n\n#include <boost/scoped_ptr.hpp>\n#include <boost/assign/list_of.hpp>\n\n#include <ostream>\n\n#include <spnav.h>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace space_navigator\n{\n\n/// Encapsulates threaded asynchronous handling of SpaceNavigator hardware events.\nclass events\n{\npublic:\n\tevents()\n\t{\n\t\tstatic k3d::bool_t initialized = false;\n\t\tif(!initialized)\n\t\t{\n\t\t\tinitialized = true;\n\n\t\t\tif(-1 == spnav_open())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Error opening connection to spnav daemon.\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(!Glib::thread_supported())\n\t\t\t\tGlib::thread_init();\n\n\t\t\tg_dispatcher.reset(new Glib::Dispatcher());\n\t\t\tg_dispatcher->connect(sigc::ptr_fun(handle_event));\n\n\t\t\tg_mutex.reset(new Glib::Mutex());\n\n\t\t\tGlib::Thread::create(sigc::ptr_fun(&event_loop), false);\n\t\t}\n\t}\n\n\t/// Connects a slot to a signal that will be emitted whenever a button event is received.\n\tsigc::connection connect_button_signal(const sigc::slot<void, int, int>& ButtonSlot)\n\t{\n\t\treturn g_button_signal.connect(ButtonSlot);\n\t}\n\n\t/// Connects a slot to a signal that will be emitted whenever a motion event is received.\n\tsigc::connection connect_motion_signal(const sigc::slot<void, int, int, int, int, int, int>& MotionSlot)\n\t{\n\t\treturn g_motion_signal.connect(MotionSlot);\n\t}\n\nprivate:\n\t/// This method executes within the context of a separate thread that\n\t/// blocks waiting for events from the SpaceNavigator hardware.\n\tstatic void event_loop()\n\t{\n\t\twhile(true)\n\t\t{\n\t\t\tif(0 == spnav_wait_event(&g_event))\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Error waiting for event.\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Signal the main thread that an event has occurred\n\t\t\tg_dispatcher->emit();\n\n\t\t\t// Wait until the main thread has handled the event\n\t\t\tGlib::Mutex::Lock lock(*g_mutex);\n\t\t}\n\t}\n\n\t/// This methods executes within the context of the main thread\n\t/// whenever a hardware event has been received.\n\tstatic void handle_event()\n\t{\n\t\tGlib::Mutex::Lock lock(*g_mutex);\n\n\t\tswitch(g_event.type)\n\t\t{\n\t\t\tcase SPNAV_EVENT_BUTTON:\n\t\t\t\tg_button_signal.emit(g_event.button.press, g_event.button.bnum);\n\t\t\t\tbreak;\n\t\t\tcase SPNAV_EVENT_MOTION:\n\t\t\t\tg_motion_signal.emit(g_event.motion.x, g_event.motion.y, g_event.motion.z, g_event.motion.rx, g_event.motion.ry, g_event.motion.rz);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/// Dispatcher used for threaded event notification\n\tstatic boost::scoped_ptr<Glib::Dispatcher> g_dispatcher;\n\t/// Used to make the watching thread wait until the event has been handled\n\tstatic boost::scoped_ptr<Glib::Mutex> g_mutex;\n\t/// Shared event datastructure\n\tstatic spnav_event g_event;\n\t/// Used to broadcast button events\n\tstatic sigc::signal<void, int, int> g_button_signal;\n\t/// Used to broadcast motion events\n\tstatic sigc::signal<void, int, int, int, int, int, int> g_motion_signal;\n};\n\nboost::scoped_ptr<Glib::Dispatcher> events::g_dispatcher;\nboost::scoped_ptr<Glib::Mutex> events::g_mutex;\nspnav_event events::g_event;\nsigc::signal<void, int, int> events::g_button_signal;\nsigc::signal<void, int, int, int, int, int, int> events::g_motion_signal;\n\nclass dialog :\n\tpublic application_window,\n\tpublic k3d::iunknown\n{\n\ttypedef application_window base;\n\npublic:\n\tdialog() :\n\t\tm_stream(k3d::log())\n\t{\n\t\tGtk::Label* const label = new Gtk::Label(_(\"Logging SpaceNavigator events to stderr ...\\nClose window to cancel logging.\"));\n\t\tadd(*Gtk::manage(label));\n\n\t\tset_border_width(10);\n\n\t\tset_role(\"space_navigator\");\n\t\tshow_all();\n\n\t\tm_events.connect_button_signal(sigc::mem_fun(*this, &dialog::on_button));\n\t\tm_events.connect_motion_signal(sigc::mem_fun(*this, &dialog::on_motion));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<dialog> factory(\n\t\t\tk3d::uuid(0xa58ff8d7, 0xfa4525b4, 0x500167bc, 0x4b4b22b4),\n\t\t\t\"NGUISpaceNavigatorDialog\",\n\t\t\t_(\"Sends a stream of SpaceNavigator events to stderr, intended mainly for debugging.\"),\n\t\t\t\"NGUI Dialog\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"dialog\")\n\t\t\t);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_button(int Press, int Button)\n\t{\n\t\tm_stream << Press << \" \" << Button << std::endl;\n\t}\n\n\tvoid on_motion(int X, int Y, int Z, int RX, int RY, int RZ)\n\t{\n\t\tm_stream << X << \" \" << Y << \" \" << Z << \" \" << RX << \" \" << RY << \" \" << RZ << std::endl;\n\t}\n\n\t/// Stores the output file stream\n\tstd::ostream& m_stream;\n\t/// Broadcasts device events\n\tevents m_events;\n};\n\n} // namespace space_navigator\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::space_navigator::dialog::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_text_editor/CMakeLists.txt",
    "content": "CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nIF(K3D_GTKSOURCEVIEW_FOUND)\n\tINCLUDE_DIRECTORIES(${K3D_GTKSOURCEVIEW_INCLUDE_DIRS})\n\tLINK_DIRECTORIES(${K3D_GTKSOURCEVIEW_LIBRARY_DIRS})\nENDIF(K3D_GTKSOURCEVIEW_FOUND)\n\nK3D_BUILD_NGUI_MODULE(k3d-ngui-text-editor)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-text-editor)\n\nIF(K3D_GTKSOURCEVIEW_FOUND)\n\tTARGET_LINK_LIBRARIES(k3d-ngui-text-editor ${K3D_GTKSOURCEVIEW_LIBRARIES})\nENDIF(K3D_GTKSOURCEVIEW_FOUND)\n\n"
  },
  {
    "path": "modules/ngui_text_editor/config.h.in",
    "content": "#ifndef MODULE_NGUI_TEXT_EDITOR_CONFIG_H\n#define MODULE_NGUI_TEXT_EDITOR_CONFIG_H\n\n// Generated file, do not edit!  Make changes to config.h.in instead.\n\n#cmakedefine K3D_GTKSOURCEVIEW_FOUND\n\n#endif // !MODULE_NGUI_TEXT_EDITOR_CONFIG_H\n\n"
  },
  {
    "path": "modules/ngui_text_editor/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"config.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gzstream.h>\n#include <k3dsdk/idocument_sink.h>\n#include <k3dsdk/iproperty_sink.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/istate_recorder_sink.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/mime_types.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/application_window.h>\n#include <k3dsdk/ngui/file_chooser_dialog.h>\n#include <k3dsdk/ngui/messages.h>\n#include <k3dsdk/ngui/scripting.h>\n#include <k3dsdk/ngui/widget_manip.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <gtkmm/action.h>\n#include <gtkmm/actiongroup.h>\n#include <gtkmm/box.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/stock.h>\n#include <gtkmm/textview.h>\n#include <gtkmm/uimanager.h>\n\n#ifdef K3D_GTKSOURCEVIEW_FOUND\n\t#include <gtksourceview/gtksourceview.h>\n\t#include <gtksourceview/gtksourcelanguagemanager.h>\n#endif // K3D_GTKSOURCEVIEW_FOUND\n\n#include <boost/assign/list_of.hpp>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace text_editor\n{\n\nclass dialog :\n\tpublic k3d::ngui::application_window,\n\tpublic k3d::idocument_sink,\n\tpublic k3d::iproperty_sink,\n\tpublic k3d::istate_recorder_sink\n{\npublic:\n\tdialog() :\n\t\tm_document(0),\n\t\tm_state_recorder(0),\n\t\tm_property(0),\n\t\tm_running(false),\n#ifdef K3D_GTKSOURCEVIEW_FOUND\n\t\tm_view(Glib::wrap(GTK_TEXT_VIEW(gtk_source_view_new())))\n#else // K3D_GTKSOURCEVIEW_FOUND\n\t\tm_view(new Gtk::TextView())\n#endif // !K3D_GTKSOURCEVIEW_FOUND\n\t{\n\t\tm_actions = Gtk::ActionGroup::create();\n\n\t\tm_actions->add(Gtk::Action::create(\"file\", _(\"_File\")));\n\t\tm_actions->add(Gtk::Action::create(\"new\", Gtk::Stock::NEW), sigc::mem_fun(*this, &dialog::on_new));\n\t\tm_actions->add(Gtk::Action::create(\"open\", Gtk::Stock::OPEN), sigc::mem_fun(*this, &dialog::on_open));\n\t\tm_actions->add(Gtk::Action::create(\"save\", Gtk::Stock::SAVE), sigc::mem_fun(*this, &dialog::on_save));\n\t\tm_actions->add(Gtk::Action::create(\"save_as\", Gtk::Stock::SAVE_AS), sigc::hide_return(sigc::mem_fun(*this, &dialog::on_save_as)));\n\t\tm_actions->add(Gtk::Action::create(\"revert\", Gtk::Stock::REVERT_TO_SAVED), sigc::mem_fun(*this, &dialog::on_revert));\n\t\tm_actions->add(Gtk::Action::create(\"import\", _(\"Import File ...\")), sigc::mem_fun(*this, &dialog::on_import));\n\t\tm_actions->add(Gtk::Action::create(\"export\", _(\"Export File ...\")), sigc::mem_fun(*this, &dialog::on_export));\n\t\tm_actions->add(Gtk::Action::create(\"commit\", _(\"Commit\"), _(\"Commit modifications to the underlying property.\")), sigc::mem_fun(*this, &dialog::on_commit));\n\t\tm_actions->add(Gtk::Action::create(\"close\", Gtk::Stock::CLOSE), sigc::mem_fun(*this, &dialog::close));\n\t\tm_actions->add(Gtk::Action::create(\"edit\", _(\"_Edit\")));\n\t\tm_actions->add(Gtk::Action::create(\"execute\", Gtk::Stock::EXECUTE), sigc::mem_fun(*this, &dialog::on_execute));\n\n\t\tm_ui_manager = Gtk::UIManager::create();\n\t\tm_ui_manager->insert_action_group(m_actions);\n\t\tadd_accel_group(m_ui_manager->get_accel_group());\n\n\t\tm_ui_manager->add_ui_from_string(\n\t\t\t\"<ui>\"\n\t\t\t\"  <menubar name='menubar'>\"\n\t\t\t\"    <menu action='file'>\"\n\t\t\t\"      <menuitem action='new'/>\"\n\t\t\t\"      <menuitem action='open'/>\"\n\t\t\t\"      <menuitem action='save'/>\"\n\t\t\t\"      <menuitem action='save_as'/>\"\n\t\t\t\"      <menuitem action='revert'/>\"\n\t\t\t\"      <menuitem action='import'/>\"\n\t\t\t\"      <menuitem action='export'/>\"\n\t\t\t\"      <menuitem action='commit'/>\"\n\t\t\t\"      <separator/>\"\n\t\t\t\"      <menuitem action='close'/>\"\n\t\t\t\"    </menu>\"\n\t\t\t\"    <menu action='edit'>\"\n\t\t\t\"      <menuitem action='execute'/>\"\n\t\t\t\"    </menu>\"\n\t\t\t\"  </menubar>\"\n\t\t\t\"  <toolbar name='toolbar'>\"\n\t\t\t\"    <toolitem action='new'/>\"\n\t\t\t\"    <toolitem action='open'/>\"\n\t\t\t\"    <toolitem action='save'/>\"\n\t\t\t\"    <toolitem action='commit'/>\"\n\t\t\t\"    <separator/>\"\n\t\t\t\"    <toolitem action='execute'/>\"\n\t\t\t\"  </toolbar>\"\n\t\t\t\"</ui>\"\n\t\t\t);\n\n\t\tGtk::ScrolledWindow* const scrolled_window = new Gtk::ScrolledWindow();\n\t\tscrolled_window->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\t\tscrolled_window->add(*Gtk::manage(m_view));\n\n\t\tm_cursor_position.set_alignment(Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER);\n\n\t\tGtk::VBox* const vbox1 = new Gtk::VBox(false);\n\t\tvbox1->pack_start(*manage(m_ui_manager->get_widget(\"/menubar\")), Gtk::PACK_SHRINK);\n\t\tvbox1->pack_start(*manage(m_ui_manager->get_widget(\"/toolbar\")), Gtk::PACK_SHRINK);\n\t\tvbox1->pack_start(*manage(scrolled_window), Gtk::PACK_EXPAND_WIDGET);\n\t\tvbox1->pack_start(m_cursor_position, Gtk::PACK_SHRINK);\n\n\t\tadd(*Gtk::manage(vbox1));\n\t\tset_role(get_factory().name());\n\t\tresize(600, 300);\n\n\t\tupdate_title();\n\t\tupdate_widgets();\n\t\tshow_all();\n\n\t\tm_view->get_buffer()->signal_changed().connect(sigc::mem_fun(*this, &dialog::update_title));\n\t\tm_view->get_buffer()->signal_mark_set().connect(sigc::mem_fun(*this, &dialog::update_cursor_position));\n\t}\n\n\tvoid set_document(k3d::idocument* const Document)\n\t{\n\t\tm_document = Document;\n\t}\n\n\tvoid set_state_recorder(k3d::istate_recorder* const StateRecorder)\n\t{\n\t\tm_state_recorder = StateRecorder;\n\t}\n\n\tvoid set_property(k3d::iproperty* const Property)\n\t{\n\t\tif(Property && Property->property_type() != typeid(k3d::string_t))\n\t\t{\n\t\t\tk3d::log() << error << \"Unsupported property type.\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tm_property = Property;\n\n\t\tset_text(m_property ? k3d::property::internal_value<k3d::string_t>(*m_property) : \"\");\n\n\t\tupdate_title();\n\t\tupdate_widgets();\n\t}\n\n\tvoid set_text(const k3d::string_t& Text)\n\t{\n\t\tconst k3d::mime::type mime_type = k3d::mime::type::lookup(Text);\n\n#ifdef K3D_GTKSOURCEVIEW_FOUND\n\t\tGtkSourceLanguageManager* const language_manager =  gtk_source_language_manager_get_default();\n\t\tGtkSourceLanguage* const language = gtk_source_language_manager_guess_language(language_manager, 0, mime_type.str().c_str());\n\t\tGtkSourceBuffer* const buffer = GTK_SOURCE_BUFFER(m_view->get_buffer()->gobj());\n\t\tgtk_source_buffer_set_language(buffer, language);\n\t\tgtk_source_buffer_set_highlight_syntax(buffer, true);\n#endif // K3D_GTKSOURCEVIEW_FOUND\n\n\t\tm_view->get_buffer()->set_text(Text);\n\t\tm_view->get_buffer()->set_modified(false);\n\t}\n\n\tvoid set_text(const k3d::filesystem::path& Path)\n\t{\n\t\tconst k3d::mime::type mime_type = k3d::mime::type::lookup(Path);\n\n#ifdef K3D_GTKSOURCEVIEW_FOUND\n\t\tGtkSourceLanguageManager* const language_manager =  gtk_source_language_manager_get_default();\n\t\tGtkSourceLanguage* const language = gtk_source_language_manager_guess_language(language_manager, 0, mime_type.str().c_str());\n\t\tGtkSourceBuffer* const buffer = GTK_SOURCE_BUFFER(m_view->get_buffer()->gobj());\n\t\tgtk_source_buffer_set_language(buffer, language);\n\t\tgtk_source_buffer_set_highlight_syntax(buffer, true);\n#endif // K3D_GTKSOURCEVIEW_FOUND\n\n\t\tk3d::filesystem::igzstream stream(Path);\n\t\tstd::stringstream text;\n\t        stream.get(*text.rdbuf(), '\\0');\n\n\t\tm_view->get_buffer()->set_text(text.str().c_str());\n\t\tm_view->get_buffer()->set_modified(false);\n\t}\n\n\tvoid set_path(const k3d::filesystem::path& Path)\n\t{\n\t\tm_path = Path;\n\t\tupdate_title();\n\t}\n\n\tvoid on_new()\n\t{\n//\t\tif(!save_changes())\n//\t\t\treturn;\n\n\t\tset_text(\"\");\n\t\tupdate_title();\n\t}\n\n\tvoid on_open()\n\t{\n//\t\tif(!save_changes())\n//\t\t\treturn;\n\n\t\tk3d::filesystem::path filepath;\n\t\t{\n\t\t\tk3d::ngui::file_chooser_dialog dialog(_(\"Open File:\"), k3d::options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_OPEN);\n\t\t\tif(!dialog.get_file_path(filepath))\n\t\t\t\treturn;\n\t\t}\n\n\t\tset_text(filepath);\n\t\tset_path(filepath);\n\t}\n\n\tvoid on_save()\n\t{\n\t\tif(m_path.empty())\n\t\t{\n\t\t\ton_save_as();\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::filesystem::ofstream stream(m_path);\n\t\tstream << m_view->get_buffer()->get_text();\n\n\t\tm_view->get_buffer()->set_modified(false);\n\t\tupdate_title();\n\t}\n\n\tbool on_save_as()\n\t{\n\t\t{\n\t\t\tk3d::ngui::file_chooser_dialog dialog(_(\"Save Script As::\"), k3d::options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\t\tif(!dialog.get_file_path(m_path))\n\t\t\t\treturn false;\n\t\t}\n\n\t\tk3d::filesystem::ofstream stream(m_path);\n\t\tstream << m_view->get_buffer()->get_text();\n\n\t\tm_view->get_buffer()->set_modified(false);\n\t\tset_path(m_path);\n\n\t\treturn true;\n\t}\n\n\tvoid on_revert()\n\t{\n//\t\tif(!save_changes())\n//\t\t\treturn;\n\n\t\tif(m_property)\n\t\t{\n\t\t\tset_text(m_property ? k3d::property::internal_value<k3d::string_t>(*m_property) : \"\");\n\t\t}\n\t\telse if(m_path.empty())\n\t\t{\n\t\t\tset_text(\"\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tset_text(m_path);\n\t\t}\n\t}\n\n\tvoid on_import()\n\t{\n\t\tk3d::filesystem::path path;\n\t\t{\n\t\t\tk3d::ngui::file_chooser_dialog dialog(_(\"Import File:\"), k3d::options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_OPEN);\n\t\t\tif(!dialog.get_file_path(path))\n\t\t\t\treturn;\n\t\t}\n\n\t\tset_text(path);\n\t}\n\n\tvoid on_export()\n\t{\n\t\tk3d::filesystem::path path;\n\t\t{\n\t\t\tk3d::ngui::file_chooser_dialog dialog(_(\"Export File:\"), k3d::options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\t\tif(!dialog.get_file_path(path))\n\t\t\t\treturn;\n\t\t}\n\n\t\tk3d::filesystem::ofstream stream(path);\n\t\tstream << m_view->get_buffer()->get_text();\n\t}\n\n\tvoid on_commit()\n\t{\n\t\tif(m_property)\n\t\t{\n\t\t\tif(m_state_recorder)\n\t\t\t\tm_state_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\t\t\tk3d::property::set_internal_value(*m_property, m_view->get_buffer()->get_text().raw());\n\n\t\t\tif(m_state_recorder)\n\t\t\t\tm_state_recorder->commit_change_set(m_state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), m_property->property_name(), K3D_CHANGE_SET_CONTEXT);\n\t\t}\n\t}\n\n\tvoid on_execute()\n\t{\n\t\tconst k3d::script::code code(m_view->get_buffer()->get_text());\n\t\tconst k3d::mime::type mime_type = k3d::mime::type::lookup(code.source());\n\n\t\tif(mime_type.empty())\n\t\t{\n\t\t\tk3d::ngui::error_message(\n\t\t\t\t_(\"Unknown script language\"),\n\t\t\t\t_(\"Could not identify the MIME-type for this script. \"\n\t\t\t\t\" K-3D supports multiple scripting languages, and the MIME-type is used to \"\n\t\t\t\t\"match scripts to the correct script engines. \"\n\t\t\t\t\"You can add a \\\"magic token\\\" at the beginning of a script to \"\n\t\t\t\t\"force identification of its MIME-type - for example, add \\\"#python\\\" at the \"\n\t\t\t\t\"beginning of a Python script.\"\n\t\t\t\t)); \n\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::string_t name = get_title();\n\n\t\tk3d::iscript_engine::context context;\n\t\tif(m_document)\n\t\t\tcontext[\"document\"] = m_document;\n\n\t\tm_running = true;\n\t\tupdate_title();\n\n\t\tk3d::ngui::execute_script(code, name, context);\n\n\t\tm_running = false;\n\t\tupdate_title();\n\t}\n\n\tvoid update_title()\n\t{\n\t\tk3d::string_t title;\n\n\t\tif(m_property)\n\t\t{\n\t\t\tif(m_property->property_node())\n\t\t\t{\n\t\t\t\ttitle = k3d::string_cast(boost::format(_(\"%1% \\\"%2%\\\" property\")) % m_property->property_node()->name() % m_property->property_name());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttitle = k3d::string_cast(boost::format(_(\"%1%\")) % m_property->property_name());\n\t\t\t}\n\t\t}\n\t\telse if(!m_path.empty())\n\t\t{\n\t\t\ttitle = m_path.leaf().raw();\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttitle = _(\"Untitled\");\n\t\t}\n\n\t\tif(m_view->get_buffer()->get_modified())\n\t\t\ttitle += _(\" [changed]\");\n\n\t\tif(m_running)\n\t\t\ttitle += _(\" [running]\");\n\n\t\tset_title(title);\n\t}\n\n\tvoid update_widgets()\n\t{\n\t\tm_actions->get_action(\"new\")->set_visible(!m_property);\n\t\tm_actions->get_action(\"open\")->set_visible(!m_property);\n\t\tm_actions->get_action(\"save\")->set_visible(!m_property);\n\t\tm_actions->get_action(\"save_as\")->set_visible(!m_property);\n\t\tm_actions->get_action(\"revert\")->set_visible(true);\n\t\tm_actions->get_action(\"import\")->set_visible(m_property);\n\t\tm_actions->get_action(\"export\")->set_visible(m_property);\n\t\tm_actions->get_action(\"commit\")->set_visible(m_property);\n\t\tm_actions->get_action(\"execute\")->set_visible(!m_property);\n\t}\n\n\tvoid update_cursor_position(const Gtk::TextIter& Iterator, const Glib::RefPtr<Gtk::TextMark>& Mark)\n\t{\n\t\tif(Mark->get_name() != \"insert\")\n\t\t\treturn;\n\n\t\tm_cursor_position.set_text(k3d::string_cast(boost::format(_(\"Line: %1% Column: %2%\")) % (Iterator.get_line() + 1) % (Iterator.get_visible_line_offset() + 1)));\n\t}\n\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<dialog> factory(\n\t\t\tk3d::uuid(0xca41ccc9, 0xb9433dec, 0x30c65c83, 0x40eb359b),\n\t\t\t\"NGUITextEditorDialog\",\n\t\t\t_(\"Provides a general-purpose dialog for editing source-code, text, scripts, and shaders.\"),\n\t\t\t\"NGUI Dialog\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"dialog\")\n\t\t\t);\n\n\t\treturn factory;\n\t}\n\n\t/// (Optional) document for the current text (could be NULL)\n\tk3d::idocument* m_document;\n\t/// (Optional) state recorder for making changes undoable (could be NULL)\n\tk3d::istate_recorder* m_state_recorder;\n\t/// (Optional) property source for the current text (could be NULL)\n\tk3d::iproperty* m_property;\n\t/// (Optional) file path source for the current text (could be empty)\n\tk3d::filesystem::path m_path;\n\t/// Set to true iff script playback is in progress\n\tbool m_running;\n\n\t// Menu items\n\tGlib::RefPtr<Gtk::ActionGroup> m_actions;\n\tGlib::RefPtr<Gtk::UIManager> m_ui_manager;\n\t/// Storage and editing for the current text\n\tGtk::TextView* const m_view;\n\t/// Displays cursor position\n\tGtk::Label m_cursor_position;\n};\n\n} // namespace text_editor\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::text_editor::dialog::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_timeline_panel/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-timeline-panel)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-timeline-panel)\n\n\n"
  },
  {
    "path": "modules/ngui_timeline_panel/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/asynchronous_update.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/interactive.h>\n#include <k3dsdk/ngui/panel.h>\n#include <k3dsdk/ngui/utility.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/time_source.h>\n\n#include <gtkmm/adjustment.h>\n#include <gtkmm/box.h>\n#include <gtkmm/image.h>\n#include <gtkmm/entry.h>\n#include <gtkmm/scrollbar.h>\n\n#include <boost/assign/list_of.hpp>\n\n// Temporary hack\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace timeline\n{\n\nnamespace detail\n{\n\nclass implementation :\n\tpublic k3d::ngui::asynchronous_update,\n\tpublic k3d::property_collection\n{\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tk3d::property_collection(),\n\t\tm_document_state(DocumentState),\n\t\tm_playback_mode(init_name(\"playback_mode\") + init_label(_(\"Playback Mode\")) + init_description(_(\"When on, plays animation\")) + init_value(STOP)),\n\t\tm_container(false, 0),\n\t\tm_rewind(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"rewind\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_loop_reverse_play(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"reverse_play_loop\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_reverse_play(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"reverse_play\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_stop(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"stop\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_play(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"play\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_loop_play(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"play_loop\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_fast_forward(button::create(*Gtk::manage(new Gtk::Image(load_icon(\"fast_forward\", Gtk::ICON_SIZE_BUTTON))))),\n\t\tm_start_time(0),\n\t\tm_end_time(0),\n\t\tm_frame_rate(0),\n\t\tm_time(0),\n\t\tm_writable_time(0)\n\t{\n\t\tm_frame_label.set_editable(false);\n\t\tm_frame_label.set_width_chars(5);\n\n\t\tm_rewind->set_tooltip_text(_(\"Rewind\"));\n\t\tm_loop_reverse_play->set_tooltip_text(_(\"Continuous reverse playback\"));\n\t\tm_reverse_play->set_tooltip_text(_(\"Reverse playback\"));\n\t\tm_stop->set_tooltip_text(_(\"Stop\"));\n\t\tm_play->set_tooltip_text(_(\"Play\"));\n\t\tm_loop_play->set_tooltip_text(_(\"Continuous playback\"));\n\t\tm_fast_forward->set_tooltip_text(_(\"Fast Forward\"));\n\n\t\tm_container.pack_start(m_scrollbar, Gtk::PACK_EXPAND_WIDGET);\n\t\tm_container.pack_start(m_frame_label, Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_rewind), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_loop_reverse_play), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_reverse_play), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_stop), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_play), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_loop_play), Gtk::PACK_SHRINK);\n\t\tm_container.pack_start(*Gtk::manage(m_fast_forward), Gtk::PACK_SHRINK);\n\n\t\tm_rewind->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_rewind));\n\t\tm_loop_reverse_play->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_loop_reverse_play));\n\t\tm_reverse_play->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_reverse_play));\n\t\tm_stop->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_stop));\n\t\tm_play->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_play));\n\t\tm_loop_play->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_loop_play));\n\t\tm_fast_forward->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_fast_forward));\n\n\t\tm_playback_mode.changed_signal().connect(sigc::mem_fun(*this, &implementation::on_playback_mode_changed));\n\n\t\tm_document_state.document().nodes().add_nodes_signal().connect(sigc::mem_fun(*this, &implementation::on_nodes_added));\n\t\tm_document_state.document().nodes().remove_nodes_signal().connect(sigc::mem_fun(*this, &implementation::on_nodes_removed));\n\n\t\treset_time_properties();\n\t\ton_time_changed(0);\n\t\tm_scrollbar.get_adjustment()->signal_value_changed().connect(sigc::mem_fun(*this, &implementation::on_scrollbar_value_changed));\n\n\t\tm_container.show_all();\n\t\tschedule_update();\n\t}\n\n\t/// Called by the signal system anytime new nodes are added to the document\n\tvoid on_nodes_added(const k3d::inode_collection::nodes_t& Nodes)\n\t{\n\t\treset_time_properties();\n\t}\n\n\t/// Called by the signal system anytime nodes are removed from the document\n\tvoid on_nodes_removed(const k3d::inode_collection::nodes_t& Nodes)\n\t{\n\t\treset_time_properties();\n\t}\n\n\tvoid reset_time_properties()\n\t{\n\t\tm_start_time = 0;\n\t\tm_end_time = 0;\n\t\tm_frame_rate = 0;\n\t\tm_time = 0;\n\t\tm_writable_time = 0;\n\n\t\tm_start_time_changed_connection.disconnect();\n\t\tm_end_time_changed_connection.disconnect();\n\t\tm_frame_rate_changed_connection.disconnect();\n\t\tm_time_changed_connection.disconnect();\n\n\t\tm_start_time = k3d::get_start_time(m_document_state.document());\n\t\tif(m_start_time)\n\t\t\tm_start_time_changed_connection = m_start_time->property_changed_signal().connect(sigc::mem_fun(*this, &implementation::on_start_time_changed));\n\n\t\tm_end_time = k3d::get_end_time(m_document_state.document());\n\t\tif(m_end_time)\n\t\t\tm_end_time_changed_connection = m_end_time->property_changed_signal().connect(sigc::mem_fun(*this, &implementation::on_end_time_changed));\n\n\t\tm_frame_rate = k3d::get_frame_rate(m_document_state.document());\n\t\tif(m_frame_rate)\n\t\t\tm_frame_rate_changed_connection = m_frame_rate->property_changed_signal().connect(sigc::mem_fun(*this, &implementation::on_frame_rate_changed));\n\n\t\tm_time = k3d::get_time(m_document_state.document());\n\t\tif(m_time)\n\t\t\tm_time_changed_connection = m_time->property_changed_signal().connect(sigc::mem_fun(*this, &implementation::on_time_changed));\n\n\t\tm_writable_time = dynamic_cast<k3d::iwritable_property*>(m_time);\n\n\t\tconst bool enabled = m_start_time && m_end_time && m_frame_rate && m_time && m_writable_time;\n\n\t\tm_scrollbar.set_sensitive(enabled);\n\t\tm_rewind->set_sensitive(enabled);\n\t\tm_loop_reverse_play->set_sensitive(enabled);\n\t\tm_reverse_play->set_sensitive(enabled);\n\t\tm_stop->set_sensitive(enabled);\n\t\tm_play->set_sensitive(enabled);\n\t\tm_loop_play->set_sensitive(enabled);\n\t\tm_fast_forward->set_sensitive(enabled);\n\t}\n\n\tvoid on_update()\n\t{\n\t\treturn_if_fail(m_start_time && m_end_time && m_frame_rate && m_time);\n\n\t\tconst double start_time = boost::any_cast<double>(m_start_time->property_internal_value());\n\t\tconst double end_time = boost::any_cast<double>(m_end_time->property_internal_value());\n\t\tconst double frame_rate = boost::any_cast<double>(m_frame_rate->property_internal_value());\n\t\tconst double time = boost::any_cast<double>(m_time->property_internal_value());\n\n\t\treturn_if_fail(frame_rate);\n\t\tconst double frame_length = 1.0 / frame_rate;\n\n\t\tconst double step_increment = 1.0;\n\t\tconst double page_increment = 1.0;\n\t\tconst double page_size = page_increment;\n\n\t\tconst double value = time;\n\t\tconst double lower = start_time;\n\t\tconst double upper = end_time - frame_length + page_size;\n\n//\t\tm_scrollbar.set_adjustment(Gtk::Adjustment(value, lower, upper, step_increment, page_increment, page_size));\n\n\t\tm_scrollbar.get_adjustment()->set_value(value);\n\t\tm_scrollbar.get_adjustment()->set_lower(lower);\n\t\tm_scrollbar.get_adjustment()->set_upper(upper);\n\n\t\tm_scrollbar.get_adjustment()->set_step_increment(step_increment);\n\t\tm_scrollbar.get_adjustment()->set_page_increment(page_increment);\n\t\tm_scrollbar.get_adjustment()->set_page_size(page_size);\n\t}\n\n\tvoid on_start_time_changed(k3d::iunknown*)\n\t{\n\t\tschedule_update();\n\t}\n\n\tvoid on_end_time_changed(k3d::iunknown*)\n\t{\n\t\tschedule_update();\n\t}\n\n\tvoid on_frame_rate_changed(k3d::iunknown*)\n\t{\n\t\tschedule_update();\n\t}\n\n\tvoid on_time_changed(k3d::iunknown*)\n\t{\n\t\treturn_if_fail(m_time && m_frame_rate);\n\t\tconst double frame_rate = boost::any_cast<double>(m_frame_rate->property_internal_value());\n\t\tconst double time = boost::any_cast<double>(m_time->property_internal_value());\n\n\t\tm_frame_label.set_text(k3d::string_cast(k3d::round(time * frame_rate)));\n//\t\tm_time_label.set_text(k3d::string_cast(time));\n\n\t\tm_scrollbar.get_adjustment()->set_value(time);\n\t}\n\n\tvoid on_scrollbar_value_changed()\n\t{\n\t\tconst double new_time = m_scrollbar.get_adjustment()->get_value();\n\t\tm_command_signal.emit(\"set_time\", k3d::string_cast(new_time));\n\n\t\tif(m_writable_time)\n\t\t\tm_writable_time->property_set_value(new_time);\n\t}\n\n\tvoid on_rewind()\n\t{\n\t\tm_playback_mode.set_value(STOP);\n\n\t\treturn_if_fail(m_start_time && m_writable_time);\n\t\tconst double start_time = boost::any_cast<double>(m_start_time->property_internal_value());\n\n\t\tm_writable_time->property_set_value(start_time);\n\t}\n\n\tvoid on_loop_reverse_play()\n\t{\n\t\tm_playback_mode.set_value(LOOP_REVERSE_PLAY);\n\t}\n\n\tvoid on_reverse_play()\n\t{\n\t\tm_playback_mode.set_value(REVERSE_PLAY);\n\t}\n\n\tvoid on_stop()\n\t{\n\t\tm_playback_mode.set_value(STOP);\n\t}\n\n\tvoid on_play()\n\t{\n\t\tm_playback_mode.set_value(PLAY);\n\t}\n\n\tvoid on_loop_play()\n\t{\n\t\tm_playback_mode.set_value(LOOP_PLAY);\n\t}\n\n\tvoid on_fast_forward()\n\t{\n\t\tm_playback_mode.set_value(STOP);\n\n\t\treturn_if_fail(m_frame_rate && m_end_time && m_writable_time);\n\n\t\tconst double end_time = boost::any_cast<double>(m_end_time->property_internal_value());\n\t\tconst double frame_rate = boost::any_cast<double>(m_frame_rate->property_internal_value());\n\t\treturn_if_fail(frame_rate);\n\t\tconst double frame_length = 1.0 / frame_rate;\n\n\t\tm_writable_time->property_set_value(end_time - frame_length);\n\t}\n\n\tvoid on_playback_mode_changed(k3d::iunknown*)\n\t{\n\t\tswitch(m_playback_mode.internal_value())\n\t\t{\n\t\t\tcase LOOP_REVERSE_PLAY:\n\t\t\tcase REVERSE_PLAY:\n\t\t\tcase PLAY:\n\t\t\tcase LOOP_PLAY:\n\t\t\t\tif(!m_playback_connection.connected())\n\t\t\t\t\tm_playback_connection = Glib::signal_idle().connect(sigc::mem_fun(*this, &implementation::on_playback_handler));\n\t\t\t\treturn;\n\t\t\tcase STOP:\n\t\t\t\tm_playback_connection.disconnect();\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tbool on_playback_handler()\n\t{\n\t\ton_next_frame();\n\t\treturn true;\n\t}\n\n\tvoid on_next_frame()\n\t{\n\t\tk3d::iwritable_property* const writable_time = dynamic_cast<k3d::iwritable_property*>(m_time);\n\t\treturn_if_fail(m_start_time && m_end_time && m_frame_rate && m_time && writable_time);\n\n\t\tconst double start_time = boost::any_cast<double>(m_start_time->property_internal_value());\n\t\tconst double end_time = boost::any_cast<double>(m_end_time->property_internal_value());\n\t\tconst double frame_rate = boost::any_cast<double>(m_frame_rate->property_internal_value());\n\t\tconst double time = boost::any_cast<double>(m_time->property_internal_value());\n\n\t\treturn_if_fail(frame_rate != 0.0);\n\t\tconst double frame_length = 1.0 / frame_rate;\n\n\t\tswitch(m_playback_mode.internal_value())\n\t\t{\n\t\t\tcase LOOP_REVERSE_PLAY:\n\t\t\t{\n\t\t\t\tdouble new_time = time - frame_length;\n\t\t\t\tif(new_time <= start_time)\n\t\t\t\t\tnew_time = end_time - frame_length;\n\t\t\t\twritable_time->property_set_value(new_time);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase REVERSE_PLAY:\n\t\t\t{\n\t\t\t\tconst double new_time = time - frame_length;\n\t\t\t\tif(new_time <= start_time)\n\t\t\t\t{\n\t\t\t\t\twritable_time->property_set_value(start_time);\n\t\t\t\t\tm_playback_mode.set_value(STOP);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\twritable_time->property_set_value(new_time);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase PLAY:\n\t\t\t{\n\t\t\t\tconst double new_time = time + frame_length;\n\t\t\t\tif(new_time >= (end_time - frame_length))\n\t\t\t\t{\n\t\t\t\t\twritable_time->property_set_value(end_time - frame_length);\n\t\t\t\t\tm_playback_mode.set_value(STOP);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\twritable_time->property_set_value(new_time);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase LOOP_PLAY:\n\t\t\t{\n\t\t\t\tdouble new_time = time + frame_length;\n\t\t\t\tif(new_time >= (end_time - frame_length))\n\t\t\t\t\tnew_time = start_time;\n\t\t\t\twritable_time->property_set_value(new_time);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase STOP:\n\t\t\t\treturn;\n\t\t}\n\n\t\tassert_not_reached();\n\t}\n\n\t/// Stores a reference to the owning document\n\tdocument_state& m_document_state;\n\n\t/// Enumerates animation playback modes\n\ttypedef enum\n\t{\n\t\tLOOP_REVERSE_PLAY,\n\t\tREVERSE_PLAY,\n\t\tSTOP,\n\t\tPLAY,\n\t\tLOOP_PLAY\n\t} playback_t;\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const playback_t& RHS)\n\t{\n\t\tswitch(RHS)\n\t\t{\n\t\t\tcase LOOP_REVERSE_PLAY:\n\t\t\t\tStream << \"loop_reverse_play\";\n\t\t\t\tbreak;\n\t\t\tcase REVERSE_PLAY:\n\t\t\t\tStream << \"reverse_play\";\n\t\t\t\tbreak;\n\t\t\tcase STOP:\n\t\t\t\tStream << \"stop\";\n\t\t\t\tbreak;\n\t\t\tcase PLAY:\n\t\t\t\tStream << \"play\";\n\t\t\t\tbreak;\n\t\t\tcase LOOP_PLAY:\n\t\t\t\tStream << \"loop_play\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tassert_warning(0);\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, playback_t& RHS)\n\t{\n\t\tstd::string temp;\n\t\tStream >> temp;\n\n\t\tif(temp == \"loop_reverse_play\")\n\t\t\tRHS = LOOP_REVERSE_PLAY;\n\t\telse if(temp == \"reverse_play\")\n\t\t\tRHS = REVERSE_PLAY;\n\t\telse if(temp == \"stop\")\n\t\t\tRHS = STOP;\n\t\telse if(temp == \"play\")\n\t\t\tRHS = PLAY;\n\t\telse if(temp == \"loop_play\")\n\t\t\tRHS = LOOP_PLAY;\n\n\t\treturn Stream;\n\t}\n\n\tk3d_data(playback_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_playback_mode;\n\tsigc::connection m_playback_connection;\n\n\tGtk::HBox m_container;\n\tGtk::HScrollbar m_scrollbar;\n\tGtk::Entry m_frame_label;\n\tGtk::Button* const m_rewind;\n\tGtk::Button* const m_loop_reverse_play;\n\tGtk::Button* const m_reverse_play;\n\tGtk::Button* const m_stop;\n\tGtk::Button* const m_play;\n\tGtk::Button* const m_loop_play;\n\tGtk::Button* const m_fast_forward;\n\n\tk3d::iproperty* m_start_time;\n\tsigc::connection m_start_time_changed_connection;\n\n\tk3d::iproperty* m_end_time;\n\tsigc::connection m_end_time_changed_connection;\n\n\tk3d::iproperty* m_frame_rate;\n\tsigc::connection m_frame_rate_changed_connection;\n\n\tk3d::iproperty* m_time;\n\tsigc::connection m_time_changed_connection;\n\tk3d::iwritable_property* m_writable_time;\n\n\tsigc::signal<void, const std::string&, const std::string&> m_command_signal;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// panel\n\nclass panel :\n\tpublic k3d::ngui::panel::control,\n\tpublic Gtk::VBox\n{\n\ttypedef Gtk::VBox base;\n\npublic:\n\tpanel() :\n\t\tbase(false, 0),\n\t\tm_implementation(0)\n\t{\n\t}\n\n\t~panel()\n\t{\n\t\tdelete m_implementation;\n\t}\n\n\tvoid initialize(document_state& DocumentState)\n\t{\n\t\tm_implementation = new detail::implementation(DocumentState);\n\t\t\n\t\tpack_start(m_implementation->m_container, Gtk::PACK_SHRINK);\n\t\tshow_all();\n\t}\n\n\tconst k3d::string_t panel_type()\n\t{\n\t\treturn get_factory().name();\n\t}\n\n\tsigc::connection connect_focus_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn sigc::connection();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<panel> factory(\n\t\t\tk3d::uuid(0xc8cab7fd, 0xa14a55af, 0x79779fa5, 0x1b516756),\n\t\t\t\"NGUITimelinePanel\",\n\t\t\t_(\"Provides a panel for manipulating the current time\"),\n\t\t\t\"NGUI Panel\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"panel\")(\"ngui:panel-label\", \"Timeline\"));\n\n\t\treturn factory;\n\t}\nprivate:\n\tdetail::implementation* m_implementation;\n};\n\n} // namespace timeline\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::timeline::panel::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_tool_properties_panel/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-tool-properties-panel)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-tool-properties-panel)\n\n"
  },
  {
    "path": "modules/ngui_tool_properties_panel/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/asynchronous_update.h>\n#include <k3dsdk/ngui/auto_property_page.h>\n#include <k3dsdk/ngui/bitmap_preview.h>\n#include <k3dsdk/ngui/bounding_box.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/panel.h>\n#include <k3dsdk/ngui/tool.h>\n#include <k3dsdk/ngui/widget_manip.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/label.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/stock.h>\n\n#include <boost/assign/list_of.hpp>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace tool_properties\n{\n\nnamespace detail\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// implementation\n\nclass implementation :\n\tpublic asynchronous_update\n{\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState),\n\t\tm_tool(0),\n\t\tm_object_properties(DocumentState)\n\t{\n\t\tm_label.set_alignment(Gtk::ALIGN_LEFT);\n\t\tm_label.set_padding(5, 5);\n\n\t\tm_scrolled_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\t\tm_scrolled_window.add(m_object_properties.get_widget());\n\n\t\tm_vbox.get_accessible()->set_name(\"vbox\");\n\t\tm_vbox.pack_start(m_label, Gtk::PACK_SHRINK);\n\t\tm_vbox.pack_start(m_scrolled_window, Gtk::PACK_EXPAND_WIDGET);\n\n\t\tm_document_state.connect_active_tool_changed_signal(sigc::mem_fun(*this, &implementation::on_active_tool_changed));\n\n\t\tm_tool = &m_document_state.active_tool();\n\t\tschedule_update();\n\t}\n\n\tvoid on_active_tool_changed()\n\t{\n\t\tm_tool = &m_document_state.active_tool();\n\n\t\tm_vbox.hide();\n\t\tschedule_update();\n\t}\n\n\tvoid on_update()\n\t{\n\t\tm_object_properties.set_properties(m_tool ? m_tool->properties() : 0);\n\t\tm_object_properties.get_widget().get_accessible()->set_name(m_tool ? m_tool->tool_type() : \"\");\n\n\t\tm_vbox.show();\n\t}\n\n\t/// Stores a reference to the owning document\n\tdocument_state& m_document_state;\n\t/// Stores the current tool to be displayed (if any)\n\tk3d::ngui::tool* m_tool;\n\t/// Contains the other widgets\n\tGtk::VBox m_vbox;\n\t/// Displays the current tool name\n\tGtk::Label m_label;\n\t/// Contains the set of tool properties\n\tGtk::ScrolledWindow m_scrolled_window;\n\t/// Provides a collection of property controls\n\tk3d::ngui::auto_property_page::control m_object_properties;\n\n\tsigc::signal<void, const std::string&, const std::string&> m_command_signal;\n\n\t/// Signal that will be emitted whenever this control should grab the panel focus\n\tsigc::signal<void> m_panel_grab_signal;\n};\n\n} // namespace detail\n\n\n/////////////////////////////////////////////////////////////////////////////\n// panel\n\nclass panel :\n\tpublic k3d::ngui::panel::control,\n\tpublic Gtk::VBox\n{\n\ttypedef Gtk::VBox base;\n\npublic:\n\tpanel() :\n\t\tm_implementation(0)\n\t{\n\t}\n\n\t~panel()\n\t{\n\t\tdelete m_implementation;\n\t}\n\n\tvoid initialize(document_state& DocumentState)\n\t{\n\t\tm_implementation = new detail::implementation(DocumentState);\n\n\t\tm_implementation->m_scrolled_window.signal_button_press_event().connect(sigc::bind_return(sigc::hide(m_implementation->m_panel_grab_signal.make_slot()), false), false);\n\t\t\n\t\tpack_start(m_implementation->m_vbox, Gtk::PACK_EXPAND_WIDGET);\n\t\tshow_all();\n\t}\n\n\tconst k3d::string_t panel_type()\n\t{\n\t\treturn get_factory().name();\n\t}\n\n\tsigc::connection connect_focus_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_implementation->m_panel_grab_signal.connect(Slot);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<panel> factory(\n\t\t\tk3d::uuid(0x2d5c6b09, 0x4b860158, 0x901dc7b6, 0xca8cb11e),\n\t\t\t\"NGUIToolPropertiesPanel\",\n\t\t\t_(\"Displays tool properties\"),\n\t\t\t\"NGUI Panel\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"panel\")(\"ngui:panel-label\", \"Tool Properties\"));\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tdetail::implementation* m_implementation;\n};\n\n} // namespace tool_properties\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::tool_properties::panel::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_toolbar_panel/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-toolbar-panel)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-toolbar-panel)\n\n"
  },
  {
    "path": "modules/ngui_toolbar_panel/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/ipath_property.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/icons.h>\n#include <k3dsdk/ngui/image_toggle_button.h>\n#include <k3dsdk/ngui/panel.h>\n#include <k3dsdk/ngui/pipeline.h>\n#include <k3dsdk/ngui/render.h>\n#include <k3dsdk/ngui/scripting.h>\n#include <k3dsdk/ngui/selection.h>\n#include <k3dsdk/ngui/tool.h>\n#include <k3dsdk/ngui/toolbar.h>\n#include <k3dsdk/ngui/transform.h>\n#include <k3dsdk/ngui/viewport.h>\n#include <k3dsdk/ngui/widget_manip.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/image.h>\n#include <gtkmm/notebook.h>\n#include <gtkmm/separatortoolitem.h>\n\n#include <boost/assign/list_of.hpp>\n\n// Temporary hack\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace toolbar\n{\n\nnamespace detail\n{\n\n/// \\deprecated Provides an implementation of k3d::toggle_button::imodel for visualizing the active tool\nclass builtin_tool_model :\n\tpublic image_toggle_button::imodel\n{\npublic:\n\tbuiltin_tool_model(document_state& DocumentState, tool& Choice) :\n\t\tm_document_state(DocumentState),\n\t\tm_choice(Choice)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn m_choice.tool_type();\n\t}\n\n\tconst k3d::bool_t value()\n\t{\n\t\treturn &m_document_state.active_tool() == &m_choice;\n\t}\n\n\tvoid set_value(const k3d::bool_t Value)\n\t{\n\t\tm_document_state.set_active_tool(m_choice);\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_document_state.connect_active_tool_changed_signal(Slot);\n\t}\n\nprivate:\n\tdocument_state& m_document_state;\n\ttool& m_choice;\n};\n\n/// Provides an implementation of k3d::toggle_button::imodel for visualizing the active tool\nclass plugin_tool_model :\n\tpublic image_toggle_button::imodel\n{\npublic:\n\tplugin_tool_model(document_state& DocumentState, const k3d::string_t& Tool) :\n\t\tm_document_state(DocumentState),\n\t\tm_tool(Tool)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn m_tool;\n\t}\n\n\tconst k3d::bool_t value()\n\t{\n\t\treturn m_document_state.active_tool().tool_type() == m_tool;\n\t}\n\n\tvoid set_value(const k3d::bool_t Value)\n\t{\n\t\tk3d::ngui::tool* const tool = m_document_state.get_tool(m_tool);\n\t\treturn_if_fail(tool);\n\n\t\tm_document_state.set_active_tool(*tool);\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_document_state.connect_active_tool_changed_signal(Slot);\n\t}\n\nprivate:\n\tdocument_state& m_document_state;\n\tconst k3d::string_t m_tool;\n};\n\n/// Provides an implementation of k3d::toggle_button::imodel for visualizing the current selection mode\nclass selection_mode_model :\n\tpublic toggle_button::imodel\n{\npublic:\n\tselection_mode_model(k3d::idocument& Document, const selection::mode Mode, const Glib::ustring& Label) :\n\t\tm_document(Document),\n\t\tm_mode(Mode),\n\t\tm_label(Label)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn m_label;\n\t}\n\n\tconst k3d::bool_t value()\n\t{\n\t\treturn selection::state(m_document).current_mode() == m_mode;\n\t}\n\n\tvoid set_value(const k3d::bool_t Value)\n\t{\n\t\tselection::state(m_document).set_current_mode(m_mode);\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn selection::state(m_document).connect_current_mode_changed_signal(sigc::hide(Slot));\n\t}\n\nprivate:\n\tk3d::idocument& m_document;\n\tconst selection::mode m_mode;\n\tconst Glib::ustring m_label;\n};\n\n/// Provides an implementation of k3d::toggle_button::imodel for visualizing the current keep selection mode\nclass keep_selection_model :\n\tpublic toggle_button::imodel\n{\npublic:\n\tkeep_selection_model(k3d::idocument& Document) :\n\t\tm_document(Document)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn _(\"Keep Selection\");\n\t}\n\n\tconst k3d::bool_t value()\n\t{\n\t\treturn selection::state(m_document).keep_selection();\n\t}\n\n\tvoid set_value(const k3d::bool_t Value)\n\t{\n\t\tselection::state(m_document).set_keep_selection(Value);\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn selection::state(m_document).connect_keep_selection_changed_signal(sigc::hide(Slot));\n\t}\n\nprivate:\n\tk3d::idocument& m_document;\n};\n\n/// Provides an implementation of k3d::toggle_button::imodel for visualizing the current convert selection mode\nclass convert_selection_model :\n\tpublic toggle_button::imodel\n{\npublic:\n\tconvert_selection_model(k3d::idocument& Document) :\n\t\tm_document(Document)\n\t{\n\t}\n\n\tconst Glib::ustring label()\n\t{\n\t\treturn _(\"Convert Selection\");\n\t}\n\n\tconst k3d::bool_t value()\n\t{\n\t\treturn selection::state(m_document).convert_selection();\n\t}\n\n\tvoid set_value(const k3d::bool_t Value)\n\t{\n\t\tselection::state(m_document).set_convert_selection(Value);\n\t}\n\n\tsigc::connection connect_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn selection::state(m_document).connect_convert_selection_changed_signal(sigc::hide(Slot));\n\t}\n\nprivate:\n\tk3d::idocument& m_document;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// implementation\n\nstruct implementation\n{\n\timplementation(document_state& DocumentState) :\n\t\tm_document_state(DocumentState),\n\t\tm_toolbox(false, 0)\n\t{\n\t\tm_toolbox.get_accessible()->set_name(\"toolbox\");\n\t\tk3d::ngui::toolbar::control* const main_toolbar = new k3d::ngui::toolbar::control();\n\t\tmain_toolbar->get_accessible()->set_name(\"main_toolbar\");\n\t\tmain_toolbar->row(0).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::builtin_tool_model(m_document_state, m_document_state.selection_tool()), 0,\n\t\t\t\tload_icon(\"select_tool\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Select\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(0).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::builtin_tool_model(m_document_state, m_document_state.move_tool()), 0,\n\t\t\t\tload_icon(\"move_tool\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Move\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(0).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::builtin_tool_model(m_document_state, m_document_state.rotate_tool()), 0,\n\t\t\t\tload_icon(\"rotate_tool\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Rotate\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(0).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::builtin_tool_model(m_document_state, m_document_state.scale_tool()), 0,\n\t\t\t\tload_icon(\"scale_tool\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Scale\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUISnapTool\"))\n\t\t{\n\t\t\tmain_toolbar->row(0).pack_start(*Gtk::manage(\n\t\t\t\tnew image_toggle_button::control(\n\t\t\t\t\tnew detail::plugin_tool_model(m_document_state, \"NGUISnapTool\"), 0,\n\t\t\t\t\tload_icon(\"NGUISnapTool\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t\t<< set_tooltip(_(\"Snap\"))\n\t\t\t\t<< make_toolbar_button()\n\t\t\t\t), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUIParentTool\"))\n\t\t{\n\t\t\tmain_toolbar->row(0).pack_start(*Gtk::manage(\n\t\t\t\tnew image_toggle_button::control(\n\t\t\t\t\tnew detail::plugin_tool_model(m_document_state, \"NGUIParentTool\"), 0,\n\t\t\t\t\tload_icon(\"NGUIParentTool\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t\t<< set_tooltip(_(\"Parent\"))\n\t\t\t\t<< make_toolbar_button()\n\t\t\t\t), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\tmain_toolbar->row(0).pack_start(*Gtk::manage(\n\t\t\tbutton::create(\n\t\t\t\t*Gtk::manage(new Gtk::Image(load_icon(\"unparent\", Gtk::ICON_SIZE_SMALL_TOOLBAR))))\n\t\t\t<< connect_button(sigc::mem_fun(*this, &implementation::on_unparent))\n\t\t\t<< set_tooltip(_(\"Unparent\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tif(k3d::plugin::factory::lookup(\"NGUIRenderRegionTool\"))\n\t\t{\n\t\t\tmain_toolbar->row(0).pack_start(*Gtk::manage(\n\t\t\t\tnew image_toggle_button::control(\n\t\t\t\t\tnew detail::plugin_tool_model(m_document_state, \"NGUIRenderRegionTool\"), 0,\n\t\t\t\t\tload_icon(\"NGUIRenderRegionTool\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t\t<< set_tooltip(_(\"Render Region\"))\n\t\t\t\t<< make_toolbar_button()), Gtk::PACK_SHRINK);\n\t\t}\n\n\t\tmain_toolbar->row(0).pack_start(*Gtk::manage(\n\t\t\tbutton::create(\n\t\t\t\t*Gtk::manage(new Gtk::Image(load_icon(\"render_preview\", Gtk::ICON_SIZE_SMALL_TOOLBAR))))\n\t\t\t<< connect_button(sigc::mem_fun(*this, &implementation::on_render_preview))\n\t\t\t<< set_tooltip(_(\"Render Preview\"))\n\t\t\t<< make_toolbar_button()), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(1).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::selection_mode_model(m_document_state.document(), k3d::ngui::selection::NODE, _(\"Select Nodes\")),\n\t\t\t\t&m_document_state.document().state_recorder(),\n\t\t\t\tload_icon(\"select_node\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Select Nodes\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(1).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::selection_mode_model(m_document_state.document(), k3d::ngui::selection::POINT, _(\"Select Points\")),\n\t\t\t\t&m_document_state.document().state_recorder(),\n\t\t\t\tload_icon(\"select_vertex\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Select Points\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(1).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::selection_mode_model(m_document_state.document(), k3d::ngui::selection::EDGE, _(\"Select Polygon Edges\")),\n\t\t\t\t&m_document_state.document().state_recorder(),\n\t\t\t\tload_icon(\"select_split_edge\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Select Polygon Edges\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(1).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::selection_mode_model(m_document_state.document(), k3d::ngui::selection::FACE, _(\"Select Polygons\")),\n\t\t\t\t&m_document_state.document().state_recorder(),\n\t\t\t\tload_icon(\"select_face\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Select Polygons\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(1).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::selection_mode_model(m_document_state.document(), k3d::ngui::selection::CURVE, _(\"Select Curves\")),\n\t\t\t\t&m_document_state.document().state_recorder(),\n\t\t\t\tload_icon(\"select_curve\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Select Curves\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(1).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::selection_mode_model(m_document_state.document(), k3d::ngui::selection::PATCH, _(\"Select Patches\")),\n\t\t\t\t&m_document_state.document().state_recorder(),\n\t\t\t\tload_icon(\"select_patch\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Select Patches\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(1).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::selection_mode_model(m_document_state.document(), k3d::ngui::selection::SURFACE, _(\"Select Surface\")),\n\t\t\t\t&m_document_state.document().state_recorder(),\n\t\t\t\tload_icon(\"select_uniform\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Select Surface\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(1).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::keep_selection_model(m_document_state.document()),\n\t\t\t\t0,\n\t\t\t\tload_icon(\"keep_selection\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Keep Selection\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tmain_toolbar->row(1).pack_start(*Gtk::manage(\n\t\t\tnew image_toggle_button::control(\n\t\t\t\tnew detail::convert_selection_model(m_document_state.document()),\n\t\t\t\t0,\n\t\t\t\tload_icon(\"convert_selection\", Gtk::ICON_SIZE_SMALL_TOOLBAR))\n\t\t\t<< set_tooltip(_(\"Convert Selection\"))\n\t\t\t<< make_toolbar_button()\n\t\t\t), Gtk::PACK_SHRINK);\n\n\t\tGtk::Notebook* const notebook = new Gtk::Notebook();\n\n\t\tconst k3d::filesystem::path layout_path = k3d::share_path() / k3d::filesystem::generic_path(\"ngui/toolbar_layout.k3d\");\n\t\tk3d::xml::element xml_layout;\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Loading toolbar layout from \" << layout_path.native_console_string() << std::endl;\n\t\t\tk3d::filesystem::ifstream layout_stream(layout_path);\n\t\t\tlayout_stream >> xml_layout;\n\t\t\tassert_warning(xml_layout.name == \"k3dml\");\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << \"Error loading toolbar layout from \" << layout_path.native_console_string() << std::endl;\n\t\t}\n\n\t\tk3d::xml::element& xml_application = xml_layout.safe_element(\"application\");\n\t\tk3d::xml::element& xml_user_interface = xml_application.safe_element(\"user_interface\");\n\t\tk3d::xml::element& xml_toolbars = xml_user_interface.safe_element(\"toolbars\");\n\n\t\tfor(k3d::xml::element::elements_t::const_iterator xml_toolbar = xml_toolbars.children.begin(); xml_toolbar != xml_toolbars.children.end(); ++xml_toolbar)\n\t\t{\n\t\t\tif(xml_toolbar->name != \"toolbar\")\n\t\t\t\tcontinue;\n\n\t\t\tconst std::string toolbar_name = k3d::xml::attribute_text(*xml_toolbar, \"name\");\n\t\t\tconst std::string toolbar_label = k3d::xml::attribute_text(*xml_toolbar, \"label\");\n\t\t\tconst std::string toolbar_description = k3d::xml::attribute_text(*xml_toolbar, \"description\");\n\n\t\t\tk3d::ngui::toolbar::control* const toolbar_widget = new k3d::ngui::toolbar::control();\n\n\t\t\tfor(k3d::xml::element::elements_t::const_iterator xml_button = xml_toolbar->children.begin(); xml_button != xml_toolbar->children.end(); ++xml_button)\n\t\t\t{\n\t\t\t\tif(xml_button->name == \"node\")\n\t\t\t\t{\n\t\t\t\t\tconst std::string name = k3d::xml::attribute_text(*xml_button, \"name\");\n\t\t\t\t\tk3d::iplugin_factory* const plugin_factory = k3d::plugin::factory::lookup(name);\n\t\t\t\t\tif(!plugin_factory)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst std::string node_name = \"create_\" + plugin_factory->name();\n\t\t\t\t\tGtk::Image* const image = new Gtk::Image(load_icon(plugin_factory->name(), Gtk::ICON_SIZE_SMALL_TOOLBAR));\n\n\t\t\t\t\tGtk::Button* const button =\n\t\t\t\t\t\tbutton::create(*manage(image))\n\t\t\t\t\t\t<< set_tooltip(plugin_factory->short_description())\n\t\t\t\t\t\t<< make_toolbar_button()\n\t\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_create_node), plugin_factory))\n\t\t\t\t\t\t<< enable_dynamic_accelerators();\n\n\t\t\t\t\ttoolbar_widget->row(0).pack_start(*Gtk::manage(button), Gtk::PACK_SHRINK);\n\t\t\t\t}\n\t\t\t\telse if(xml_button->name == \"script\")\n\t\t\t\t{\n\t\t\t\t\tconst std::string name = k3d::xml::attribute_text(*xml_button, \"name\");\n\t\t\t\t\tconst std::string label = k3d::xml::attribute_text(*xml_button, \"label\");\n\t\t\t\t\tconst std::string description = k3d::xml::attribute_text(*xml_button, \"description\");\n\n\t\t\t\t\tconst k3d::ipath_property::reference_t reference = k3d::xml::attribute_value<k3d::ipath_property::reference_t>(*xml_button, \"reference\", k3d::ipath_property::RELATIVE_REFERENCE);\n\t\t\t\t\tswitch(reference)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase k3d::ipath_property::ABSOLUTE_REFERENCE:\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst k3d::filesystem::path absolute_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(k3d::xml::attribute_text(*xml_button, \"absolute_path\")));\n\n\t\t\t\t\t\t\t\tGtk::Button* const button =\n\t\t\t\t\t\t\t\t\tnew Gtk::Button(label)\n\t\t\t\t\t\t\t\t\t<< set_tooltip(description)\n\t\t\t\t\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_run_external_script), absolute_path))\n\t\t\t\t\t\t\t\t\t<< make_toolbar_button()\n\t\t\t\t\t\t\t\t\t<< enable_dynamic_accelerators();\n\n\t\t\t\t\t\t\t\ttoolbar_widget->row(0).pack_start(*Gtk::manage(button), Gtk::PACK_SHRINK);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch(std::exception& e)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase k3d::ipath_property::RELATIVE_REFERENCE:\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::filesystem::path root_path = k3d::share_path() / k3d::filesystem::generic_path(\"ngui\");\n\t\t\t\t\t\t\t\tif(const k3d::xml::element* const xml_root = k3d::xml::find_element(*xml_button, \"root\"))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif(xml_root->text == \"$K3D_SHARE_PATH\")\n\t\t\t\t\t\t\t\t\t\troot_path = k3d::share_path();\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\troot_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(xml_root->text));\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst k3d::filesystem::path absolute_path = root_path / k3d::filesystem::native_path(k3d::ustring::from_utf8(k3d::xml::attribute_text(*xml_button, \"relative_path\")));\n\n\t\t\t\t\t\t\t\tGtk::Button* const button =\n\t\t\t\t\t\t\t\t\tnew Gtk::Button(label)\n\t\t\t\t\t\t\t\t\t<< set_tooltip(description)\n\t\t\t\t\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_run_external_script), absolute_path))\n\t\t\t\t\t\t\t\t\t<< make_toolbar_button()\n\t\t\t\t\t\t\t\t\t<< enable_dynamic_accelerators();\n\n\t\t\t\t\t\t\t\ttoolbar_widget->row(0).pack_start(*Gtk::manage(button), Gtk::PACK_SHRINK);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch(std::exception& e)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase k3d::ipath_property::INLINE_REFERENCE:\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst std::string encoding = k3d::xml::attribute_text(*xml_button, \"encoding\");\n\t\t\t\t\t\t\t\tif(encoding != \"text/plain\")\n\t\t\t\t\t\t\t\t\tthrow std::runtime_error(\"Toolbar script inline encoding must be text/plain\");\n\n\t\t\t\t\t\t\t\tGtk::Button* const button =\n\t\t\t\t\t\t\t\t\tnew Gtk::Button(label)\n\t\t\t\t\t\t\t\t\t<< set_tooltip(description)\n\t\t\t\t\t\t\t\t\t<< connect_button(sigc::bind(sigc::mem_fun(*this, &implementation::on_run_inline_script), xml_button->text))\n\t\t\t\t\t\t\t\t\t<< make_toolbar_button()\n\t\t\t\t\t\t\t\t\t<< enable_dynamic_accelerators();\n\n\t\t\t\t\t\t\t\ttoolbar_widget->row(0).pack_start(*Gtk::manage(button), Gtk::PACK_SHRINK);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch(std::exception& e)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(xml_button->name == \"separator\")\n\t\t\t\t{\n\t\t\t\t\ttoolbar_widget->row(0).pack_start(*Gtk::manage(new Gtk::SeparatorToolItem()), Gtk::PACK_SHRINK);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnotebook->append_page(*Gtk::manage(toolbar_widget), toolbar_label);\n\t\t}\n\n\t\tm_toolbox.pack_start(*Gtk::manage(main_toolbar), Gtk::PACK_SHRINK);\n\t\tm_toolbox.pack_start(*Gtk::manage(notebook), Gtk::PACK_EXPAND_WIDGET);\n\t}\n\n\tvoid on_create_node(k3d::iplugin_factory* const Factory)\n\t{\n\t\treturn_if_fail(Factory);\n\t\tk3d::ngui::pipeline::create_node(m_document_state.document(), *Factory);\n\t}\n\n\t/// Unparents all selected nodes\n\tvoid on_unparent()\n\t{\n\t\tconst k3d::nodes_t nodes = selection::state(m_document_state.document()).selected_nodes();\n\t\tif(nodes.empty())\n\t\t\treturn;\n\n\t\tk3d::record_state_change_set change_set(m_document_state.document(), _(\"Unparent selected\"), K3D_CHANGE_SET_CONTEXT);\n\n\t\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t\tk3d::ngui::unparent(**node);\n\n\t\tselection::state(m_document_state.document()).deselect_all();\n\t\tk3d::gl::redraw_all(m_document_state.document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\tvoid on_render_preview()\n\t{\n\t\tviewport::control* const viewport_control = m_document_state.get_focus_viewport();\n\t\treturn_if_fail(viewport_control);\n\n\t\tk3d::icamera* camera = viewport_control->camera();\n\t\tif(!camera)\n\t\t\tcamera = pick_camera(m_document_state);\n\t\tif(!camera)\n\t\t\treturn;\n\n\t\tk3d::irender_camera_preview* render_engine = viewport_control->camera_preview_engine();\n\t\tif(!render_engine)\n\t\t\trender_engine = pick_camera_preview_render_engine(m_document_state);\n\t\tif(!render_engine)\n\t\t\treturn;\n\n\t\tviewport_control->set_camera(camera);\n\t\tviewport_control->set_camera_preview_engine(render_engine);\n\n\t\trender(*camera, *render_engine);\n\t}\n\n\tvoid on_run_inline_script(const std::string Script)\n\t{\n\t\tk3d::script::code script(Script);\n\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &m_document_state.document();\n\n\t\texecute_script(script, \"Inline Script\", context);\n\t}\n\n\tvoid on_run_external_script(const k3d::filesystem::path Script)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &m_document_state.document();\n\n\t\texecute_script(Script, context);\n\t}\n\n\t/// Stores a reference to the owning document\n\tdocument_state& m_document_state;\n\n\tGtk::HBox m_toolbox;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// panel\n\nclass panel :\n\tpublic k3d::ngui::panel::control,\n  public Gtk::VBox\n{\n\ttypedef Gtk::VBox base;\n\npublic:\n\tpanel() :\n\t\tbase(false, 0),\n\t\tm_implementation(0)\n\t{\n\t\tget_accessible()->set_name(\"vbox\");\n\t}\n\n\t~panel()\n\t{\n\t\tdelete m_implementation;\n\t}\n\n\tvoid initialize(document_state& DocumentState)\n\t{\n\t\tm_implementation = new detail::implementation(DocumentState);\n\t\t\n\t\tpack_start(m_implementation->m_toolbox, Gtk::PACK_SHRINK);\n\t\tshow_all();\n\t}\n\n\tconst k3d::string_t panel_type()\n\t{\n\t\treturn get_factory().name();\n\t}\n\n\tsigc::connection connect_focus_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn sigc::connection();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<panel> factory(\n\t\t\tk3d::uuid(0xc4d044fe, 0x5043a104, 0xd97f0988, 0x19c053d8),\n\t\t\t\"NGUIToolbarPanel\",\n\t\t\t_(\"Provides the standard toolbar\"),\n\t\t\t\"NGUI Panel\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"panel\")(\"ngui:panel-label\", \"Toolbar\"));\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tdetail::implementation* m_implementation;\n};\n\n} // namespace toolbar\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::toolbar::panel::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_undo_tree_panel/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-undo-tree-panel)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-undo-tree-panel)\n\n"
  },
  {
    "path": "modules/ngui_undo_tree_panel/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/asynchronous_update.h>\n#include <k3dsdk/ngui/button.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/panel.h>\n#include <k3dsdk/ngui/toolbar.h>\n#include <k3dsdk/ngui/undo_utility.h>\n#include <k3dsdk/nodes.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <gtkmm/box.h>\n#include <gtkmm/menu.h>\n#include <gtkmm/scrolledwindow.h>\n#include <gtkmm/stock.h>\n#include <gtkmm/treestore.h>\n#include <gtkmm/treeview.h>\n\n#include <boost/assign/list_of.hpp>\n\n// Temporary hack\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace undo_tree\n{\n\nnamespace detail\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// implementation\n\n/** \\todo This use of the pimpl-idiom is obsolete and doesn't make much sense in the context of a plugin */\nclass implementation :\n\tpublic Gtk::VBox,\n\tpublic asynchronous_update\n{\n\ttypedef Gtk::VBox base;\n\npublic:\n\timplementation(document_state& DocumentState) :\n\t\tbase(false, 0),\n\t\tm_document_state(DocumentState),\n\t\tm_undo_button(0),\n\t\tm_redo_button(0)\n\t{\n\t\ttoolbar::control* const toolbar = new toolbar::control();\n\n\t\tm_undo_button = new Gtk::Button();\n\t\tm_redo_button = new Gtk::Button();\n\n\t\tm_undo_button->add(*Gtk::manage(new Gtk::Image(Gtk::Stock::UNDO, Gtk::ICON_SIZE_SMALL_TOOLBAR)));\n\t\tm_redo_button->add(*Gtk::manage(new Gtk::Image(Gtk::Stock::REDO, Gtk::ICON_SIZE_SMALL_TOOLBAR)));\n\n\t\tm_undo_button->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_undo));\n\t\tm_redo_button->signal_clicked().connect(sigc::mem_fun(*this, &implementation::on_redo));\n\n\t\ttoolbar->row(0).pack_start(*Gtk::manage(m_undo_button), Gtk::PACK_SHRINK);\n\t\ttoolbar->row(0).pack_start(*Gtk::manage(m_redo_button), Gtk::PACK_SHRINK);\n\n\t\tGtk::ScrolledWindow* const scrolled_window = new Gtk::ScrolledWindow();\n\t\tscrolled_window->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\n\t\tscrolled_window->add(m_view);\n\n\t\tpack_start(*Gtk::manage(toolbar), Gtk::PACK_SHRINK);\n\t\tpack_start(*Gtk::manage(scrolled_window), Gtk::PACK_EXPAND_WIDGET);\n\n\t\tm_model = Gtk::TreeStore::create(m_columns);\n\n\t\tm_view.set_model(m_model);\n\t\tm_view.set_headers_visible(false);\n\t\tm_view.set_reorderable(false);\n\t\tm_view.signal_row_activated().connect(sigc::mem_fun(*this, &implementation::on_select_row));\n\n\t\tGtk::CellRendererText* const cell_text = new Gtk::CellRendererText();\n\n\t\tGtk::TreeViewColumn* const column = new Gtk::TreeViewColumn;\n\t\tcolumn->pack_start(m_columns.saved, false);\n\t\tcolumn->pack_start(m_columns.current, false);\n\t\tcolumn->pack_start(*manage(cell_text), true);\n\t\tcolumn->add_attribute(cell_text->property_text(), m_columns.label);\n\t\tcolumn->add_attribute(cell_text->property_strikethrough(), m_columns.strikethrough);\n\n\t\tm_view.append_column(*manage(column));\n\n\t\tm_document_state.document().state_recorder().connect_node_added_signal(sigc::mem_fun(*this, &implementation::on_node_added));\n\t\tm_document_state.document().state_recorder().connect_current_node_changed_signal(sigc::mem_fun(*this, &implementation::on_current_node_changed));\n\t\tm_document_state.document().state_recorder().connect_last_saved_node_changed_signal(sigc::mem_fun(*this, &implementation::on_last_saved_node_changed));\n\n\t\tschedule_update();\n\t}\n\n\t/// Called by the signal system when the user clicks the undo button\n\tvoid on_undo()\n\t{\n\t\tconst k3d::istate_recorder::node* current_node = m_document_state.document().state_recorder().current_node();\n\t\treturn_if_fail(current_node);\n\n\t\tcurrent_node->change_set->undo();\n\t\tm_document_state.document().state_recorder().set_current_node(current_node->parent);\n\t\tk3d::gl::redraw_all(m_document_state.document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\t/// Called by the signal system when the user clicks the redo button\n\tvoid on_redo()\n\t{\n\t\tconst k3d::istate_recorder::node* const redo_node = next_redo(m_document_state.document().state_recorder());\n\t\treturn_if_fail(redo_node);\n\n\t\tredo_node->change_set->redo();\n\t\tm_document_state.document().state_recorder().set_current_node(redo_node);\n\t\tk3d::gl::redraw_all(m_document_state.document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\t/// Called by the signal system anytime a node is added to the hierarchical undo tree\n\tvoid on_node_added(const k3d::istate_recorder::node* const NewNode)\n\t{\n\t\tadd_node(NewNode, 0, m_model->children());\n\t}\n\n\t/// Called by the signal system anytime the current node in the hierarchical undo tree changes\n\tvoid on_current_node_changed()\n\t{\n\t\tk3d::istate_recorder& state_recorder = m_document_state.document().state_recorder();\n\t\tconst k3d::istate_recorder::node* const current_node = state_recorder.current_node();\n\t\tconst k3d::istate_recorder::node* const redo_node = next_redo(state_recorder);\n\t\tconst parent_nodes_t active_nodes = parent_nodes(current_node);\n\n\t\tset_current_node(current_node, redo_node, active_nodes, m_model->children());\n\n\t\tupdate_buttons();\n\t}\n\n\t/// Updates the state of the undo/redo buttons to match the current node in the hierarchical undo tree\n\tvoid update_buttons()\n\t{\n\t\tk3d::istate_recorder& state_recorder = m_document_state.document().state_recorder();\n\t\tconst k3d::istate_recorder::node* const current_node = state_recorder.current_node();\n\t\tconst k3d::istate_recorder::node* const redo_node = next_redo(state_recorder);\n\n\t\t// Setup the undo button ...\n\t\tif(current_node)\n\t\t{\n\t\t\tm_undo_button->set_sensitive(true);\n\n\t\t\tconst std::string label = k3d::string_cast(boost::format(_(\"Undo %1%\")) % current_node->label);\n\t\t\tm_undo_button->set_tooltip_text(label);\n//\t\t\t\tm_undo_button->set_label(label);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_undo_button->set_sensitive(false);\n\n\t\t\tconst std::string label = _(\"Can't Undo\");\n\t\t\tm_undo_button->set_tooltip_text(label);\n//\t\t\t\tm_undo_button->set_label(label);\n\t\t}\n\n\t\t// Setup the redo menu item ...\n\t\tif(redo_node)\n\t\t{\n\t\t\tm_redo_button->set_sensitive(true);\n\n\t\t\tconst std::string label = k3d::string_cast(boost::format(_(\"Redo %1%\")) % redo_node->label);\n\t\t\tm_redo_button->set_tooltip_text(label);\n//\t\t\t\tm_redo_button->set_label(label);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_redo_button->set_sensitive(false);\n\n\t\t\tconst std::string label = _(\"Can't Redo\");\n\t\t\tm_redo_button->set_tooltip_text(label);\n//\t\t\t\tm_redo_button->set_label(label);\n\t\t}\n\t}\n\n\t/// Called by the signal system anytime the last saved node in the hierarchical undo tree changes\n\tvoid on_last_saved_node_changed()\n\t{\n\t\tk3d::istate_recorder& state_recorder = m_document_state.document().state_recorder();\n\t\tconst k3d::istate_recorder::node* const last_saved_node = state_recorder.last_saved_node();\n\n\t\tset_last_saved_node(last_saved_node, m_model->children());\n\t}\n\n\tvoid on_update()\n\t{\n\t\tupdate_contents();\n\t\tupdate_buttons();\n\t}\n\n\t/// Rebuilds the contents of the control from scratch\n\tvoid update_contents()\n\t{\n\t\tk3d::istate_recorder& state_recorder = m_document_state.document().state_recorder();\n\t\tconst k3d::istate_recorder::node* const current_node = state_recorder.current_node();\n\t\tconst k3d::istate_recorder::node* const redo_node = next_redo(state_recorder);\n\t\tconst k3d::istate_recorder::node* const saved_node = state_recorder.last_saved_node();\n\t\tconst parent_nodes_t active_nodes = parent_nodes(current_node);\n\n\t\tm_model->clear();\n\n\t\tconst k3d::istate_recorder::nodes_t root_nodes = state_recorder.root_nodes();\n\t\tfor(k3d::istate_recorder::nodes_t::const_iterator node = root_nodes.begin(); node != root_nodes.end(); ++node)\n\t\t\tinsert_node(current_node, redo_node, saved_node, *node, active_nodes, m_model->children());\n\t}\n\n\t/// Used to efficiently insert a single new undo hierarchy node into the treeview model\n\tbool add_node(const k3d::istate_recorder::node* const NewNode, const k3d::istate_recorder::node* const ParentNode, const Gtk::TreeNodeChildren& ParentRows)\n\t{\n\t\tif(NewNode->parent == ParentNode)\n\t\t{\n\t\t\tGtk::TreeRow row = *m_model->append(ParentRows);\n\t\t\trow[m_columns.node] = NewNode;\n\t\t\trow[m_columns.label] = NewNode->label;\n\t\t\trow[m_columns.current] = Glib::RefPtr<Gdk::Pixbuf>();\n\t\t\trow[m_columns.saved] = Glib::RefPtr<Gdk::Pixbuf>();\n\t\t\trow[m_columns.strikethrough] = false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\tfor(Gtk::TreeIter row = ParentRows.begin(); row != ParentRows.end(); ++row)\n\t\t{\n\t\t\tif(add_node(NewNode, (*row)[m_columns.node], row->children()))\n\t\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/// Used to efficiently update the treeview model when the undo hierarchy current node has changed\n\tvoid set_current_node(const k3d::istate_recorder::node* const CurrentNode, const k3d::istate_recorder::node* const RedoNode, const parent_nodes_t& ActiveNodes, const Gtk::TreeNodeChildren& ParentRows)\n\t{\n\t\tfor(Gtk::TreeIter i = ParentRows.begin(); i != ParentRows.end(); ++i)\n\t\t{\n\t\t\tGtk::TreeRow row = *i;\n\n\t\t\tif(row[m_columns.node] == CurrentNode)\n\t\t\t{\n\t\t\t\trow[m_columns.current] = m_view.render_icon(Gtk::Stock::UNDO, Gtk::ICON_SIZE_SMALL_TOOLBAR);\n\n\t\t\t\tm_view.scroll_to_row(Gtk::TreePath(i), 0.5);\n\t\t\t\tm_view.expand_to_path(Gtk::TreePath(i));\n\t\t\t\tm_view.expand_row(Gtk::TreePath(i), false);\n\t\t\t}\n\t\t\telse if(row[m_columns.node] == RedoNode)\n\t\t\t{\n\t\t\t\trow[m_columns.current] = m_view.render_icon(Gtk::Stock::REDO, Gtk::ICON_SIZE_SMALL_TOOLBAR);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trow[m_columns.current] = Glib::RefPtr<Gdk::Pixbuf>();\n\t\t\t}\n\n\t\t\trow[m_columns.strikethrough] = std::find(ActiveNodes.begin(), ActiveNodes.end(), row[m_columns.node]) == ActiveNodes.end();\n\n\t\t\tset_current_node(CurrentNode, RedoNode, ActiveNodes, row.children());\n\t\t}\n\t}\n\n\t/// Used to efficiently update the treeview model when the undo hierarchy last saved node has changed\n\tvoid set_last_saved_node(const k3d::istate_recorder::node* const LastSavedNode, const Gtk::TreeNodeChildren& ParentRows)\n\t{\n\t\tfor(Gtk::TreeIter i = ParentRows.begin(); i != ParentRows.end(); ++i)\n\t\t{\n\t\t\tGtk::TreeRow row = *i;\n\n\t\t\tif(row[m_columns.node] == LastSavedNode)\n\t\t\t{\n\t\t\t\trow[m_columns.saved] = m_view.render_icon(Gtk::Stock::SAVE, Gtk::ICON_SIZE_SMALL_TOOLBAR);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trow[m_columns.saved] = Glib::RefPtr<Gdk::Pixbuf>();\n\t\t\t}\n\n\t\t\tset_last_saved_node(LastSavedNode, row.children());\n\t\t}\n\t}\n\n\t/// Used to recursively create the treeview model from scratch\n\tvoid insert_node(const k3d::istate_recorder::node* const CurrentNode, const k3d::istate_recorder::node* const RedoNode, const k3d::istate_recorder::node* const SavedNode, k3d::istate_recorder::node* const Node, const parent_nodes_t& ActiveNodes, const Gtk::TreeNodeChildren& ParentRows)\n\t{\n\t\tGtk::TreeIter i = m_model->append(ParentRows);\n\t\tGtk::TreeRow row = *i;\n\t\trow[m_columns.node] = Node;\n\t\trow[m_columns.label] = Node->label;\n\n\t\tif(Node == CurrentNode)\n\t\t{\n\t\t\trow[m_columns.current] = m_view.render_icon(Gtk::Stock::UNDO, Gtk::ICON_SIZE_SMALL_TOOLBAR);\n\t\t}\n\t\telse if(Node == RedoNode)\n\t\t{\n\t\t\trow[m_columns.current] = m_view.render_icon(Gtk::Stock::REDO, Gtk::ICON_SIZE_SMALL_TOOLBAR);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trow[m_columns.current] = Glib::RefPtr<Gdk::Pixbuf>();\n\t\t}\n\n\t\tif(Node == SavedNode)\n\t\t{\n\t\t\trow[m_columns.saved] = m_view.render_icon(Gtk::Stock::SAVE, Gtk::ICON_SIZE_SMALL_TOOLBAR);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trow[m_columns.saved] = Glib::RefPtr<Gdk::Pixbuf>();\n\t\t}\n\t\trow[m_columns.strikethrough] = std::find(ActiveNodes.begin(), ActiveNodes.end(), Node) == ActiveNodes.end();\n\n\t\tfor(k3d::istate_recorder::nodes_t::const_iterator node = Node->children.begin(); node != Node->children.end(); ++node)\n\t\t\tinsert_node(CurrentNode, RedoNode, SavedNode, *node, ActiveNodes, row.children());\n\n\t\tif(Node == CurrentNode)\n\t\t{\n\t\t\tm_view.scroll_to_row(Gtk::TreePath(i), 0.5);\n\t\t\tm_view.expand_to_path(Gtk::TreePath(i));\n\t\t\tm_view.expand_row(Gtk::TreePath(i), false);\n\t\t}\n\t}\n\n\t/// Called when the user selects (double-clicks) a row in the treeview control\n\tvoid on_select_row(const Gtk::TreePath& Path, Gtk::TreeViewColumn* Column)\n\t{\n\t\tGtk::TreeRow row = *m_model->get_iter(Path);\n\t\tconst k3d::istate_recorder::node* const selected_node = row[m_columns.node];\n\n\t\t// Get the current node parents ...\n\t\tconst parent_nodes_t current_parents = parent_nodes(m_document_state.document().state_recorder().current_node());\n\n\t\t// Get the selected node parents ...\n\t\tconst parent_nodes_t selected_parents = parent_nodes(selected_node);\n\n\t\t// Remove common nodes from both lists to produce the list of undos and the list of redos to be performed to change the state\n\t\tparent_nodes_t undos;\n\t\tfor(unsigned long i = 0; i != current_parents.size(); ++i)\n\t\t{\n\t\t\tif(i < selected_parents.size() && current_parents[i] == selected_parents[i])\n\t\t\t\tcontinue;\n\n\t\t\tundos.push_back(current_parents[i]);\n\t\t}\n\t\tstd::reverse(undos.begin(), undos.end());\n\n\t\tparent_nodes_t redos;\n\t\tfor(unsigned long i = 0; i != selected_parents.size(); ++i)\n\t\t{\n\t\t\tif(i < current_parents.size() && current_parents[i] == selected_parents[i])\n\t\t\t\tcontinue;\n\n\t\t\tredos.push_back(selected_parents[i]);\n\t\t}\n\n\t\t// Change from the current to the selected state ...\n\t\tm_document_state.document().state_recorder().set_current_node(selected_node);\n\t\tfor(parent_nodes_t::const_iterator undo = undos.begin(); undo != undos.end(); ++undo)\n\t\t\t(*undo)->change_set->undo();\n\n\t\tfor(parent_nodes_t::const_iterator redo = redos.begin(); redo != redos.end(); ++redo)\n\t\t\t(*redo)->change_set->redo();\n\n\t\tk3d::gl::redraw_all(m_document_state.document(), k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\n\t/// Stores a reference to the owning document\n\tdocument_state& m_document_state;\n\n\t/// Declares columns for the TreeView data model\n\tclass columns :\n\t\tpublic Gtk::TreeModelColumnRecord\n\t{\n\tpublic:\n\t\tcolumns()\n\t\t{\n\t\t\tadd(node);\n\t\t\tadd(label);\n\t\t\tadd(current);\n\t\t\tadd(saved);\n\t\t\tadd(strikethrough);\n\t\t}\n\n\t\tGtk::TreeModelColumn<const k3d::istate_recorder::node*> node;\n\t\tGtk::TreeModelColumn<Glib::ustring> label;\n\t\tGtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > current;\n\t\tGtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > saved;\n\t\tGtk::TreeModelColumn<bool> strikethrough;\n\t};\n\n\t/// Defines columns for the TreeView data model\n\tcolumns m_columns;\n\t/// Provides storage for the TreeView\n\tGlib::RefPtr<Gtk::TreeStore> m_model;\n\n\tGtk::Button* m_undo_button;\n\tGtk::Button* m_redo_button;\n\tGtk::TreeView m_view;\n\n\tsigc::signal<void, const std::string&, const std::string&> m_command_signal;\n\n\t/// Signal that will be emitted whenever this control should grab the panel focus\n\tsigc::signal<void> m_panel_grab_signal;\n};\n\n} // namespace detail\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// panel\n\nclass panel :\n\tpublic Gtk::VBox,\n\tpublic k3d::ngui::panel::control\n{\n\ttypedef Gtk::VBox base;\n\npublic:\n\tpanel() :\n\t\tbase(false, 0),\n\t\tm_implementation(0)\n\t{\n\t}\n\n\t~panel()\n\t{\n\t\tdelete m_implementation;\n\t}\n\n\tvoid initialize(document_state& DocumentState)\n\t{\n\t\tm_implementation = new detail::implementation(DocumentState);\n\n\t\tm_implementation->m_undo_button->signal_focus_in_event().connect(sigc::bind_return(sigc::hide(m_implementation->m_panel_grab_signal.make_slot()), false), false);\n\t\tm_implementation->m_redo_button->signal_focus_in_event().connect(sigc::bind_return(sigc::hide(m_implementation->m_panel_grab_signal.make_slot()), false), false);\n\t\tm_implementation->m_view.signal_focus_in_event().connect(sigc::bind_return(sigc::hide(m_implementation->m_panel_grab_signal.make_slot()), false), false);\n\t\t\n\t\tpack_start(*m_implementation, Gtk::PACK_EXPAND_WIDGET);\n\t\tshow_all();\n\t}\n\n\tconst k3d::string_t panel_type()\n\t{\n\t\treturn get_factory().name();\n\t}\n\n\tsigc::connection connect_focus_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_implementation->m_panel_grab_signal.connect(Slot);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<panel> factory(\n\t\t\tk3d::uuid(0x0242c7b7, 0x234e7664, 0x3a848fa7, 0x91465b42),\n\t\t\t\"NGUIUndoTreePanel\",\n\t\t\t_(\"Provides a panel for displaying the undo tree\"),\n\t\t\t\"NGUI Panel\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"panel\")(\"ngui:panel-label\", \"Undo Tree\"));\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tdetail::implementation* m_implementation;\n};\n\n} // namespace undo_tree\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::undo_tree::panel::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ngui_uv_editor_panel/CMakeLists.txt",
    "content": "K3D_BUILD_NGUI_MODULE(k3d-ngui-uv-editor-panel)\nK3D_CREATE_MODULE_PROXY(k3d-ngui-uv-editor-panel)\n\n"
  },
  {
    "path": "modules/ngui_uv_editor_panel/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include <gtkmm/drawingarea.h>\n#include <gtkmm/menu.h>\n#include <gtkmm/box.h>\n#include <gtkmm/widget.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/file_range.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/iselectable.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/ngui/basic_input_model.h>\n#include <k3dsdk/ngui/document_state.h>\n#include <k3dsdk/ngui/enumeration_chooser.h>\n#include <k3dsdk/ngui/panel.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/selection_state_gl.h>\n#include <k3dsdk/texture3.h>\n#include <k3dsdk/time_source.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <gtk/gtkgl.h>\n#include <gtk/gtkmain.h>\n\n#include <cassert>\n#include <iomanip>\n#include <sstream>\n#include <set>\n\nusing namespace k3d::ngui;\n\nnamespace module\n{\n\nnamespace ngui\n{\n\nnamespace uveditor\n{\n\nnamespace detail\n{\n\nstd::vector<const k3d::mesh*> get_selected_meshes(document_state& DocumentState )\n{\n\tconst k3d::nodes_t selected_nodes = DocumentState.selected_nodes();\n\tk3d::imesh_source* mesh_source = 0;\n\tstd::vector<const k3d::mesh*> meshes;\n\tfor(k3d::nodes_t::const_iterator node = selected_nodes.begin(); node != selected_nodes.end(); ++node)\n\t{\n\t\tmesh_source = dynamic_cast<k3d::imesh_source*>(*node);\n\t\tif( mesh_source )\n\t\t\tmeshes.push_back(k3d::property::pipeline_value<k3d::mesh*>(mesh_source->mesh_source_output()));\n\t}\n\treturn meshes;\n}\n\n\nclass uv_set_model : public enumeration_chooser::imodel\n{\npublic:\n\tuv_set_model(document_state& DocumentState )\n\t\t: m_document_state( DocumentState )\n\t{\n\t\tm_document_state.document_selection_change_signal().connect(sigc::mem_fun(*this, &uv_set_model::on_document_selection_changed));\n\t}\n\n\tvoid on_document_selection_changed()\n\t{\n\t\tm_values_changed_signal.emit();\n\t}\n\n\t/// Returns a human-readible label for the underlying data\n\tvirtual const Glib::ustring label()\n\t{\n\t\treturn \"UV Set\";\n\t}\n\n\t/// Returns the set of allowed values\n\tvirtual const k3d::ienumeration_property::enumeration_values_t enumeration_values()\n\t{\n\t\tstd::set<std::string> texcoord_sets;\n\t\tstd::vector<const k3d::mesh*> meshes = get_selected_meshes(m_document_state);\n\t\tfor(std::vector<const k3d::mesh*>::const_iterator mesh_it = meshes.begin(); mesh_it != meshes.end(); ++mesh_it)\n\t\t{\n\t\t\tconst k3d::mesh* mesh = *mesh_it;\n\t\t\tif(!mesh->polyhedra)\n\t\t\t\tcontinue;\n\t\t\tfor(k3d::named_arrays::const_iterator array_it = mesh->polyhedra->face_varying_data.begin(); array_it != mesh->polyhedra->face_varying_data.end(); ++array_it)\n\t\t\t{\n\t\t\t\tif(dynamic_cast<const k3d::typed_array<k3d::texture3>*>(array_it->second.get()))\n\t\t\t\t\ttexcoord_sets.insert(array_it->first);\n\t\t\t}\n\t\t}\n\n\t\tstd::vector<k3d::ienumeration_property::enumeration_value_t> values;\n\t\tfor(std::set<std::string>::const_iterator texcoord_set_it = texcoord_sets.begin(); texcoord_set_it != texcoord_sets.end(); ++texcoord_set_it)\n\t\t{\n\t\t\tvalues.push_back( k3d::ienumeration_property::enumeration_value_t( *texcoord_set_it, *texcoord_set_it, *texcoord_set_it ) );\n\t\t}\n\t\treturn values;\n\t}\n\n\t/// Called to return the underlying data value\n\tvirtual const k3d::string_t value()\n\t{\n\t\treturn m_value;\n\t}\n\n\t/// Called to set a new data value\n\tvirtual void set_value(const k3d::string_t& Value)\n\t{\n\t\tm_value = Value;\n\t}\n\n\t/// Makes a connection to a signal that will be emitted if the underlying data changes\n\tvirtual sigc::connection connect_changed(const sigc::slot<void, k3d::iunknown*>& Slot)\n\t{\n\t\treturn m_data_changed_signal.connect(Slot);\n\t}\n\n\t/// Makes a connection to a signal that will be emitted if the set of allowed values changes\n\tvirtual sigc::connection connect_enumeration_values_changed(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_values_changed_signal.connect(Slot);\n\t}\n\nprivate:\n\tdocument_state& m_document_state;\n\n\tsigc::signal<void, k3d::iunknown*> m_data_changed_signal;\n\tsigc::signal<void> m_values_changed_signal;\n\n\tk3d::string_t m_value;\n};\n\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// panel\n\nclass panel :\n\tpublic k3d::ngui::panel::control,\n\tpublic k3d::iunknown,\n\tpublic Gtk::VBox\n{\npublic:\n\tpanel() :\n\t\tm_glew_context( 0 ),\n\t\tm_zoom_factor(1.0),\n\t\tm_origin(-0.5, -0.5)\n\t{\n\t}\n\n\tvoid initialize(document_state& DocumentState)\n\t{\n\t\tm_document_state = &DocumentState;\n\n\t\t//enumeration_chooser::proxy(property, state_recorder, property_name)\n\t\tm_uv_set_model = new detail::uv_set_model( DocumentState );\n\t\tm_set_chooser = Gtk::manage(new enumeration_chooser::control( Parent, \"Test\", m_uv_set_model));\n\t\tm_drawing_area = Gtk::manage(new Gtk::DrawingArea());\n\t\t//pack_end(*Gtk::manage(new Gtk::Label(k3d::string_cast(_(\"Test\")))), Gtk::PACK_SHRINK);\n\t\tpack_start(*m_set_chooser, Gtk::PACK_SHRINK);\n\t\tpack_start(*m_drawing_area, Gtk::PACK_EXPAND_WIDGET);\n\n\t\tGdkGLConfig* const config = gdk_gl_config_new_by_mode(\n\t\t\tstatic_cast<GdkGLConfigMode>(GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE | GDK_GL_MODE_DEPTH));\n\t\treturn_if_fail(config);\n\n\t\treturn_if_fail(\n\t\t\tgtk_widget_set_gl_capability(GTK_WIDGET(m_drawing_area->gobj()), config, m_document_state->gdkgl_share_list(), true, GDK_GL_RGBA_TYPE));\n\n\t\tm_drawing_area->signal_expose_event().connect(sigc::hide(sigc::mem_fun(*this, &panel::on_redraw)));\n\n\t\tm_document_state->document_selection_change_signal().connect(sigc::mem_fun(*this, &panel::on_document_selection_changed));\n\n\t\tm_input_model.connect_mbutton_start_drag(sigc::mem_fun(*this, &panel::on_start_pan));\n\t\tm_input_model.connect_mbutton_drag(sigc::mem_fun(*this, &panel::on_pan));\n\t\tm_input_model.connect_rbutton_start_drag(sigc::mem_fun(*this, &panel::on_start_zoom));\n\t\tm_input_model.connect_rbutton_drag(sigc::mem_fun(*this, &panel::on_zoom));\n\t\tm_input_model.connect_scroll(sigc::mem_fun(*this, &panel::on_scroll_zoom));\n\n\t\tm_drawing_area->add_events(Gdk::POINTER_MOTION_MASK | Gdk::SCROLL_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK);\n\n\t\tm_drawing_area->signal_button_press_event().connect(sigc::bind_return(sigc::mem_fun(m_input_model, &basic_input_model::button_press_event), true));\n\t\tm_drawing_area->signal_button_release_event().connect(sigc::bind_return(sigc::mem_fun(m_input_model, &basic_input_model::button_release_event), true));\n\t\tm_drawing_area->signal_motion_notify_event().connect(sigc::bind_return(sigc::mem_fun(m_input_model, &basic_input_model::motion_notify_event), true));\n\t\tm_drawing_area->signal_scroll_event().connect(sigc::bind_return(sigc::mem_fun(m_input_model, &basic_input_model::scroll_event), true));\n\n        show_all();\n\t}\n\n\tconst std::string panel_type()\n\t{\n\t\treturn \"uveditor\";\n\t}\n\n\tsigc::connection connect_focus_signal(const sigc::slot<void>& Slot)\n\t{\n\t        return m_focus_signal.connect(Slot);\n\t}\n\n    void on_document_selection_changed()\n    {\n        m_drawing_area->queue_draw();\n    }\n\n\tvoid on_start_pan(const GdkEventMotion& Event)\n\t{\n\t\tm_last_mouse = k3d::point2(Event.x, Event.y);\n\t}\n\n\tvoid on_pan(const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::point2 current_mouse = k3d::point2(Event.x, Event.y);\n\t\tconst k3d::vector2 delta = current_mouse - m_last_mouse;\n\n\t\tGtk::Allocation allocation = m_drawing_area->get_allocation();\n\t\tconst k3d::double_t width = allocation.get_width();\n\t\tconst k3d::double_t height = allocation.get_height();\n\n\t\tm_origin += delta * (1.0 / m_zoom_factor) * (1.0 / std::min(width, height));\n\t\tm_last_mouse = current_mouse;\n\n\t\tschedule_redraw();\n\t}\n\n\tvoid on_start_zoom(const GdkEventMotion& Event)\n\t{\n\t\tm_last_mouse = k3d::point2(Event.x, Event.y);\n\t}\n\n\tvoid on_zoom(const GdkEventMotion& Event)\n\t{\n\t\tconst k3d::point2 current_mouse = k3d::point2(Event.x, Event.y);\n\t\tconst k3d::vector2 delta = current_mouse - m_last_mouse;\n\n\t\tk3d::double_t deltaSum = -delta[0] + delta[1];\n\t\tconst k3d::double_t sensitivity = 1.008;\n\t\tconst k3d::double_t zoom_factor = deltaSum < 0 ? std::pow(sensitivity, std::abs(deltaSum)) : std::pow(1 / sensitivity, std::abs(deltaSum));\n\t\tm_last_mouse = current_mouse;\n\n\t\tm_zoom_factor *= zoom_factor;\n\t\tschedule_redraw();\n\t}\n\n\tvoid on_scroll_zoom(const GdkEventScroll& Event)\n\t{\n\t\tstatic const k3d::double_t zoom_sensitivity = 1.2;\n\n\t\tswitch(Event.direction)\n\t\t{\n\t\t\tcase GDK_SCROLL_UP:\n\t\t\t\tm_zoom_factor *= zoom_sensitivity;\n\t\t\t\tschedule_redraw();\n\t\t\t\tbreak;\n\t\t\tcase GDK_SCROLL_DOWN:\n\t\t\t\tm_zoom_factor *= (1.0 / zoom_sensitivity);\n\t\t\t\tschedule_redraw();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid schedule_redraw()\n\t{\n\t\tif(Glib::RefPtr<Gdk::Window> window = m_drawing_area->get_window())\n\t\t{\n\t\t\tGdk::Rectangle r(0, 0, m_drawing_area->get_allocation().get_width(), m_drawing_area->get_allocation().get_height());\n\t\t\twindow->invalidate_rect(r, false);\n\t\t}\n\t}\n\n    bool on_redraw()\n    {\n        // If we're minimized, we're done ...\n        const unsigned long width = m_drawing_area->get_width();\n        const unsigned long height = m_drawing_area->get_height();\n        if(!width || !height)\n            return true;\n\n        if(!is_realized())\n            return true;\n\n        GdkGLDrawable* const drawable = gtk_widget_get_gl_drawable(GTK_WIDGET(m_drawing_area->gobj()));\n        return_val_if_fail(drawable, true);\n\n        GdkGLContext* const context = gtk_widget_get_gl_context(GTK_WIDGET(m_drawing_area->gobj()));\n        return_val_if_fail(context, true);\n\n        return_val_if_fail(gdk_gl_drawable_gl_begin(drawable, context), true);\n\n        if (!m_glew_context)\n        {\n            m_glew_context = new GLEWContext();\n            glew_context::instance().set_context(m_glew_context);\n            GLenum err = glewInit(); // needs to be called after context creation\n            if (GLEW_OK != err)\n            {\n                k3d::log() << error << \"GLEW init failed: \" << glewGetErrorString(err) << std::endl;\n                assert_not_reached();\n            }\n        }\n\n        glew_context::instance().set_context(m_glew_context);\n\n        glViewport(0, 0, width, height);\n\n\t\t// Background color shouldn't be hardcoded\n        glClearColor(0.7f, 0.7f, 0.7f, 0.7f);\n        glClear(GL_COLOR_BUFFER_BIT);\n\n        glMatrixMode( GL_PROJECTION );\n        glPushMatrix();\n        glLoadIdentity();\n\n\t\t// Set a projection matrix that keeps the -1.0 .. 1.0 post transform area visible in X and Y with a fixed aspect\n\t\tif( width > height )\n\t\t\tglOrtho( -0.5*width/height, 0.5*width/height, 0.5, -0.5, 0.1f, 1.0f );\n\t\telse\n\t\t\tglOrtho( -0.5, 0.5, 0.5*height/width, -0.5*height/width, 0.1f, 1.0f );\n\n\t\t// Translate & scale according to pan & zoom\n        glMatrixMode( GL_MODELVIEW );\n        glPushMatrix();\n        glLoadIdentity();\n\t\tglScaled( m_zoom_factor, m_zoom_factor, 1.0 );\n        glTranslated( m_origin[0], m_origin[1], -0.5 );\n        glPointSize( 4.0f );\n\n\t\t// Draw a box for the 0..1 area\n\t\tglBegin( GL_LINES );\n\t\t\tglColor3d( 0.5, 0.5, 0.5 );\n\n\t\t\tglVertex2d( -0.1,  0.0 );\n\t\t\tglVertex2d(  1.1,  0.0 );\n\n\t\t\tglVertex2d( -0.1,  1.0 );\n\t\t\tglVertex2d(  1.1,  1.0 );\n\n\t\t\tglVertex2d(  0.0, -0.1 );\n\t\t\tglVertex2d(  0.0,  1.1 );\n\n\t\t\tglVertex2d(  1.0, -0.1 );\n\t\t\tglVertex2d(  1.0,  1.1 );\n\t\tglEnd();\n\n\t\tstd::vector<const k3d::mesh*> meshes = detail::get_selected_meshes(*m_document_state);\n\t\tfor(std::vector<const k3d::mesh*>::const_iterator mesh_it = meshes.begin(); mesh_it != meshes.end(); ++mesh_it)\n        {\n\t\t\tconst k3d::mesh* mesh = *mesh_it;\n\t\t\tif(!mesh->polyhedra)\n\t\t\t\tcontinue;\n\n            const k3d::typed_array<k3d::texture3>* texcoords = 0;\n            k3d::named_arrays::const_iterator array_it = mesh->polyhedra->face_varying_data.find( m_uv_set_model->value() );\n            if( array_it != mesh->polyhedra->face_varying_data.end() )\n              texcoords = dynamic_cast<const k3d::typed_array<k3d::texture3>*>(array_it->second.get());\n\n            if( texcoords )\n            {\n\t\t\t\tk3d::color point_color( 1.0, 1.0, 0.0 );\n\t\t\t\tk3d::color selected_point_color( 1.0, 0.0, 0.0 );\n\t\t\t\tk3d::color edge_color( 1.0, 1.0, 1.0 );\n\t\t\t\tk3d::color selected_edge_color( 1.0, 0.0, 0.0 );\n\n\t\t\t\tconst k3d::mesh::indices_t& edge_points = *mesh->polyhedra->edge_points;\n\t\t\t\tconst k3d::mesh::selection_t& edge_selection = *mesh->polyhedra->edge_selection;\n\t\t\t\tconst k3d::mesh::selection_t& point_selection = *mesh->point_selection;\n\n\t\t\t\tconst size_t edge_count = mesh->polyhedra->edge_points->size();\n\n\t\t\t\t// Draw polygon edges\n\t\t\t\tglBegin(GL_LINES);\n\t\t\t\tconst k3d::mesh::indices_t& clockwise_edges = *mesh->polyhedra->clockwise_edges;\n\t\t\t\tk3d::gl::color3d(edge_color);\n\t\t\t\tfor(size_t edge = 0; edge != edge_count; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif( !edge_selection[edge] )\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::texture3 begin = (*texcoords)[edge];\n\t\t\t\t\t\tk3d::texture3 end = (*texcoords)[clockwise_edges[edge]];\n\t\t\t\t\t\tglVertex2d( begin[0], begin[1] );\n\t\t\t\t\t\tglVertex2d( end[0], end[1] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tk3d::gl::color3d(selected_edge_color);\n\t\t\t\tfor(size_t edge = 0; edge != edge_count; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif( edge_selection[edge] )\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::texture3 begin = (*texcoords)[edge];\n\t\t\t\t\t\tk3d::texture3 end = (*texcoords)[clockwise_edges[edge]];\n\t\t\t\t\t\tglVertex2d( begin[0], begin[1] );\n\t\t\t\t\t\tglVertex2d( end[0], end[1] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tglEnd();\n\n\n\t\t\t\t// Draw points on vertices\n                glColor3d( 1.0, 1.0, 1.0 );\n                glBegin( GL_POINTS );\n\t\t\t\tk3d::gl::color3d(point_color);\n\t\t\t\tfor(size_t edge = 0; edge != edge_count; ++edge)\n                {\n\t\t\t\t\tif( !point_selection[edge_points[edge]] )\n\t\t\t\t\t\tglVertex2d( (*texcoords)[edge].n[0], (*texcoords)[edge].n[1] );\n                }\n\t\t\t\tk3d::gl::color3d(selected_point_color);\n\t\t\t\tfor(size_t edge = 0; edge != edge_count; ++edge)\n                {\n\t\t\t\t\tif( point_selection[edge_points[edge]] )\n\t\t\t\t\t\tglVertex2d( (*texcoords)[edge].n[0], (*texcoords)[edge].n[1] );\n                }\n                glEnd();\n            }\n        }\n\n        glMatrixMode( GL_MODELVIEW );\n        glPopMatrix();\n        glMatrixMode( GL_PROJECTION );\n        glPopMatrix();\n\n        glFlush();\n\n        if(gdk_gl_drawable_is_double_buffered(drawable))\n            gdk_gl_drawable_swap_buffers(drawable);\n\n        gdk_gl_drawable_gl_end(drawable);\n\n        return true;\n    }\n\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<panel> factory(\n\t\t\tk3d::uuid(0xfc49ed0c, 0x4fc0b829, 0xb9f08d9e, 0xf924718f),\n\t\t\t\"NGUIUVEditor\",\n\t\t\t_(\"Used for editing of UV coordinates\"),\n\t\t\t\"NGUI Panel\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\tboost::assign::map_list_of(\"ngui:component-type\", \"panel\")(\"ngui:panel-type\", \"uveditor\")(\"ngui:panel-label\", \"UVEditor\"));\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tsigc::signal<void> m_focus_signal;\n\n\t/// Keep track of glew initialisation\n\tGLEWContext* m_glew_context;\n\n\tGtk::DrawingArea* m_drawing_area;\n\tenumeration_chooser::control* m_set_chooser;\n\tdetail::uv_set_model* m_uv_set_model;\n\n\tdocument_state* m_document_state;\n\n\tk3d::double_t m_zoom_factor;\n\tk3d::point2 m_origin;\n\n\tk3d::point2 m_last_mouse;\n\n\tbasic_input_model m_input_model;\n};\n\n} // namespace pipeline\n\n} // namespace ngui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ngui::uveditor::panel::get_factory());\nK3D_MODULE_END\n"
  },
  {
    "path": "modules/nui/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_SIGC_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nK3D_BUILD_MODULE(k3d-nui)\nK3D_CREATE_MODULE_PROXY(k3d-nui)\n\nTARGET_LINK_LIBRARIES(k3d-nui k3dsdk)\n\n"
  },
  {
    "path": "modules/nui/user_interface.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/ievent_loop.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace nui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// user_interface\n\n/// Provides the Null User Interface, a do-nothing user interface plugin useful for executing scripts and as a starting-point for user interface authors\nclass user_interface :\n\tpublic k3d::ievent_loop,\n\tpublic k3d::iuser_interface\n{\npublic:\n\tvoid get_command_line_arguments(boost::program_options::options_description& Description)\n\t{\n\t}\n\n\tconst arguments_t parse_startup_arguments(const arguments_t& Arguments, k3d::bool_t& Quit, k3d::bool_t& Error)\n\t{\n\t\treturn Arguments;\n\t}\n\n\tconst arguments_t parse_runtime_arguments(const arguments_t& Arguments, k3d::bool_t& Quit, k3d::bool_t& Error)\n\t{\n\t\treturn Arguments;\n\t}\n\n\tvoid startup_message_handler(const k3d::string_t& Message)\n\t{\n\t}\n\n\tvoid display_user_interface()\n\t{\n\t}\n\n\tvoid start_event_loop()\n\t{\n\t}\n\n\tvoid stop_event_loop()\n\t{\n\t}\n\n\tvoid open_uri(const k3d::string_t& URI)\n\t{\n\t}\n\n\tvoid message(const k3d::string_t& Message)\n\t{\n\t\tstd::cout << \"MESSAGE: \" << Message << std::endl;\n\t}\n\n\tvoid warning_message(const k3d::string_t& Message)\n\t{\n\t\tstd::cout << \"WARNING: \" << Message << std::endl;\n\t}\n\n\tvoid error_message(const k3d::string_t& Message)\n\t{\n\t\tstd::cout << \"ERROR: \" << Message << std::endl;\n\t}\n\n\tk3d::uint_t query_message(const k3d::string_t& Message, const k3d::uint_t DefaultOption, const std::vector<k3d::string_t>& Options)\n\t{\n\t\treturn 0;\n\t}\n\n\tvoid nag_message(const k3d::string_t& Type, const k3d::ustring& Message, const k3d::ustring& SecondaryMessage)\n\t{\n\t\tstd::cout << \"MESSAGE: \" << Message.raw() << \" \" << SecondaryMessage.raw() << std::endl;\n\t}\n\n\tk3d::bool_t get_file_path(const k3d::ipath_property::mode_t Mode, const k3d::string_t& Type, const k3d::string_t& Prompt, const k3d::filesystem::path& OldPath, k3d::filesystem::path& Result)\n\t{\n\t\treturn false;\n\t}\n\n\tk3d::bool_t show(iunknown& Object)\n\t{\n\t\treturn false;\n\t}\n\n\tvoid synchronize()\n\t{\n\t}\n\n\tsigc::connection get_timer(const k3d::double_t FrameRate, sigc::slot<void> Slot)\n\t{\n\t\treturn sigc::connection();\n\t}\n\t\n\tk3d::uint_t watch_path(const k3d::filesystem::path& Path, const sigc::slot<void>& Slot)\n\t{\t\n\t\treturn 0;\n\t}\n\n\tvoid unwatch_path(const k3d::uint_t WatchID)\n\t{\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<user_interface,\n\t\t\tk3d::interface_list<k3d::ievent_loop> > factory(\n\t\t\tk3d::uuid(0xe6ade3f1, 0x484ce7b1, 0x1c118cb2, 0x9a3da138),\n\t\t\t\"NUI\",\n\t\t\t\"Null User Interface (NUI)\",\n\t\t\t\"Interface\");\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace nui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::nui::user_interface::get_factory());\nK3D_MODULE_END\n\n\n"
  },
  {
    "path": "modules/nurbs/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-nurbs)\nK3D_CREATE_MODULE_PROXY(k3d-nurbs)\n\n"
  },
  {
    "path": "modules/nurbs/add_trim_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass add_trim_curve :\n\t\t\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tadd_trim_curve(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_delete_curve(init_owner(*this) + init_name(_(\"delete_curve\")) + init_label(_(\"Delete the Curve\")) + init_description(_(\"Delete the curve which was used to create the trimming curve\")) + init_value(false)),\n\t\tm_scale_u(init_owner(*this) + init_name(_(\"scale_u\")) + init_label(_(\"U Scale\")) + init_description(_(\"Scale factor in the U direction\")) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(0.0)) + init_value(1.0)),\n\t\tm_scale_v(init_owner(*this) + init_name(_(\"scale-V\")) + init_label(_(\"V Scale\")) + init_description(_(\"Scale factor in the V direction\")) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(0.0)) + init_value(1.0)),\n\t\tm_offset_u(init_owner(*this) + init_name(_(\"offset_u\")) + init_label(_(\"U Offset\")) + init_description(_(\"U position offset on the surface\")) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(0.0 , constraint::maximum(1.0))) + init_value(0.0)),\n\t\tm_offset_v(init_owner(*this) + init_name(_(\"offset_v\")) + init_label(_(\"V Offset\")) + init_description(_(\"V position offset on the surface\")) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(0.0 , constraint::maximum(1.0))) + init_value(0.0))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_delete_curve.changed_signal().connect(make_update_mesh_slot());\n\t\tm_scale_u.changed_signal().connect(make_update_mesh_slot());\n\t\tm_scale_v.changed_signal().connect(make_update_mesh_slot());\n\t\tm_offset_u.changed_signal().connect(make_update_mesh_slot());\n\t\tm_offset_v.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tif(!Output.points.get())\n\t\t\treturn;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\t\n\t\tk3d::mesh curves_mesh;\n\t\tcurves_mesh.points.create();\n\t\tcurves_mesh.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curves_prim(k3d::nurbs_curve::create(curves_mesh));\n\t\tvisit_selected_curves(Output, selected_curve_extractor(curves_mesh, *curves_prim));\n\t\t\n\t\tconst k3d::double_t u_offset = m_offset_u.pipeline_value();\n\t\tconst k3d::double_t v_offset = m_offset_v.pipeline_value();\n\t\tconst k3d::double_t u_scale = m_scale_u.pipeline_value();\n\t\tconst k3d::double_t v_scale = m_scale_v.pipeline_value();\n\n\t\tfor(k3d::uint_t curve = 0; curve != curves_prim->curve_first_points.size(); ++curve)\n\t\t{\n\t\t\tk3d::bounding_box3 bbox;\n\t\t\tconst k3d::uint_t points_begin = curves_prim->curve_first_points[curve];\n\t\t\tconst k3d::uint_t points_end = curves_prim->curve_point_counts[curve] + points_begin;\n\t\t\tfor(k3d::uint_t i = points_begin; i != points_end; ++i)\n\t\t\t{\n\t\t\t\tbbox.insert(curves_mesh.points->at(curves_prim->curve_points[i]));\n\t\t\t}\n\t\t\tconst k3d::double_t x_offset = (bbox.nx + bbox.px)*0.5;\n\t\t\tconst k3d::double_t y_offset = (bbox.ny + bbox.py)*0.5;\n\t\t\tconst k3d::double_t x_scale = 1.0 / (bbox.px - bbox.nx);\n\t\t\tconst k3d::double_t y_scale = 1.0 / (bbox.py - bbox.ny);\n\t\t\tk3d::mesh::points_2d_t trim_points;\n\t\t\tfor(k3d::uint_t i = points_begin; i != points_end; ++i)\n\t\t\t{\n\t\t\t\tconst k3d::point3& p = curves_mesh.points->at(curves_prim->curve_points[i]);\n\t\t\t\ttrim_points.push_back(k3d::point2((p[0] - x_offset) * x_scale, (p[1] - y_offset) * y_scale));\n\t\t\t}\n\t\t\tcurve_arrays input_curve(curves_mesh, *curves_prim, curve, true);\n\t\t\tk3d::mesh::weights_t weights;\n\t\t\tinput_curve.weights(weights);\n\t\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != Output.primitives.size(); ++prim_idx)\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> patch_prim(k3d::nurbs_patch::validate(Output, Output.primitives[prim_idx]));\n\t\t\t\tif(patch_prim)\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::uint_t patch = 0; patch != patch_prim->patch_first_points.size(); ++patch)\n\t\t\t\t\t{\n\t\t\t\t\t\tmodule::nurbs::add_trim_curve(*patch_prim, patch, trim_points, weights, input_curve.knots, input_curve.order, u_offset, v_offset, u_scale, v_scale);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(m_delete_curve.pipeline_value())\n\t\t{\n\t\t\tdelete_selected_curves(Output);\n\t\t}\n\t\tdelete_empty_primitives(Output);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<add_trim_curve, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0xb76a0952, 0x7c467888, 0x172b1aa9, 0x99f7a455),\n\t\t  \"NurbsAddTrimCurve\",\n\t\t  _(\"Adds a trimming curve to the selected patch\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_delete_curve;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_scale_u;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_scale_v;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_offset_u;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_offset_v;\n};\n\n//Create connect_curve factory\nk3d::iplugin_factory& add_trim_curve_factory()\n{\n\treturn add_trim_curve::get_factory();\n}\n\n}//namespace nurbs\n}//namespace module\n\n"
  },
  {
    "path": "modules/nurbs/close_curve.cpp",
    "content": "\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass close_curve :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tclose_curve(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_keep_ends(init_owner(*this) + init_name(\"keep_ends\") + init_label(_(\"Keep end points as CVs\")) + init_description(_(\"If enabled, the endpoints will work as CVs and a new endpoint gets added\")) + init_value(false))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_keep_ends.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tmodify_selected_curves(Input, Output, curve_closer(m_keep_ends.pipeline_value()));\n\t\treplace_duplicate_points(Output);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<close_curve, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0xc412ed0d, 0xbf48776e, 0x5c703091, 0x8b788353),\n\t\t  \"NurbsCloseCurve\",\n\t\t  _(\"Connects the 2 end points of the selected curve\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tstruct curve_closer\n\t{\n\t\tcurve_closer(const k3d::bool_t KeepEnds) : keep_ends(KeepEnds) {}\n\t\tvoid operator()(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t& Curve)\n\t\t{\n\t\t\tmodule::nurbs::close_curve(OutputMesh, OutputCurves, InputMesh, InputCurves, Curve, keep_ends);\n\t\t}\n\t\tconst k3d::bool_t keep_ends;\n\t};\n\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_keep_ends;\n};\n\n//Create connect_curve factory\nk3d::iplugin_factory& close_curve_factory()\n{\n\treturn close_curve::get_factory();\n}\n\n}//namespace nurbs\n} //namespace module\n"
  },
  {
    "path": "modules/nurbs/connect_curves.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nvoid connect_at_points(k3d::mesh& Mesh, k3d::uint_t curve1, k3d::uint_t curve2, k3d::uint_t point1, k3d::uint_t point2);\n\nclass connect_curves :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tconnect_curves(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tk3d::mesh::indices_t selected_primitives, selected_curves; // Keeps track of primitives and curves containing selected points\n\t\tk3d::mesh::bools_t first_point_selections; // True if the first point of a curve was selected, false otherwise\n\t\tconst k3d::mesh::selection_t point_selections = *Output.point_selection;\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != Input.primitives.size(); ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> curves(k3d::nurbs_curve::validate(Input, *Input.primitives[prim_idx]));\n\t\t\tif(!curves)\n\t\t\t\tcontinue;\n\t\t\tfor(k3d::uint_t curve = 0; curve != curves->curve_first_points.size(); ++curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_curve_point = curves->curve_first_points[curve];\n\t\t\t\tconst k3d::uint_t last_curve_point = first_curve_point + curves->curve_point_counts[curve] - 1;\n\t\t\t\tif(point_selections[curves->curve_points[first_curve_point]] && point_selections[curves->curve_points[last_curve_point]])\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"NurbsConnectCurves: selected points must lie on different curves\" << std::endl;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif(point_selections[curves->curve_points[first_curve_point]] || point_selections[curves->curve_points[last_curve_point]])\n\t\t\t\t{\n\t\t\t\t\tselected_primitives.push_back(prim_idx);\n\t\t\t\t\tselected_curves.push_back(curve);\n\t\t\t\t\tfirst_point_selections.push_back(point_selections[curves->curve_points[first_curve_point]]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(selected_curves.size() != 2)\n\t\t{\n\t\t\tk3d::log() << error << \"NurbsConnectCurves: you must select two end points on two different NURBS curves\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\t// Create a new primitive if the original curves belonged to different primitives, or append to the existing primitive if they were the same.\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> output_curves;\n\t\tif(selected_primitives[0] == selected_primitives[1])\n\t\t\toutput_curves.reset(k3d::nurbs_curve::validate(Output, Output.primitives[selected_primitives[0]]));\n\t\telse\n\t\t\toutput_curves.reset(k3d::nurbs_curve::create(Output));\n\t\tmodule::nurbs::connect_curves(Output, *output_curves, Input, selected_primitives[0], selected_curves[0], first_point_selections[0], selected_primitives[1], selected_curves[1], first_point_selections[1]);\n\t\tif(selected_primitives[0] == selected_primitives[1])\n\t\t{\n\t\t\tdelete_curve(*output_curves, selected_curves[0]);\n\t\t\tdelete_curve(*output_curves, selected_curves[1]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> prim1(k3d::nurbs_curve::validate(Output, Output.primitives[selected_primitives[0]]));\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> prim2(k3d::nurbs_curve::validate(Output, Output.primitives[selected_primitives[1]]));\n\t\t\toutput_curves->material.push_back(prim1->material.back());\n\t\t\tdelete_curve(*prim1, selected_curves[0]);\n\t\t\tdelete_curve(*prim2, selected_curves[1]);\n\t\t}\n\t\tdelete_empty_primitives(Output);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<connect_curves, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x959eb84b, 0x544d0672, 0xd53d899b, 0x6a568e86),\n\t\t  \"NurbsConnectCurves\",\n\t\t  _(\"Connects a set of NURBS curves\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n//Create connect_curve factory\nk3d::iplugin_factory& connect_curves_factory()\n{\n\treturn connect_curves::get_factory();\n}\n\n}//namespace nurbs\n\n} //namespace module\n"
  },
  {
    "path": "modules/nurbs/create_cap.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass create_cap :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tcreate_cap(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_delete_original(init_owner(*this) + init_name(_(\"delete_original\")) + init_label(_(\"Delete the Curve\")) + init_description(_(\"Delete the curve which was used to create the cap\")) + init_value(false)),\n\t\tm_u_offset(init_owner(*this) + init_name(_(\"u_offset\")) + init_label(_(\"U Offset\")) + init_description(_(\"Shift the capped curve U range by this amount, useful to rotate the UV-system on the cap\")) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(0.0 , constraint::maximum(1.0))) + init_value(0.0)),\n\t\tm_coons(init_owner(*this) + init_name(_(\"coons\")) + init_label(_(\"Coons\")) + init_description(_(\"Use a Coons surface to fill the curve if true, use a trimmed bilinear patch otherwise\")) + init_value(true))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_delete_original.changed_signal().connect(make_update_mesh_slot());\n\t\tm_u_offset.changed_signal().connect(make_update_mesh_slot());\n\t\tm_coons.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tif(!Output.points.get())\n\t\t\treturn;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> output_patches(k3d::nurbs_patch::create(Output));\n\n\t\tk3d::mesh selected_curves_mesh;\n\t\tselected_curves_mesh.points.create();\n\t\tselected_curves_mesh.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> selected_curves(k3d::nurbs_curve::create(selected_curves_mesh));\n\t\tselected_curves->material.push_back(0);\n\t\tvisit_selected_curves(Output, selected_curve_extractor(selected_curves_mesh, *selected_curves));\n\n\t\t// Eliminate duplicate points\n\t\treplace_duplicate_points(selected_curves_mesh);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(selected_curves_mesh, unused_points);\n\t\tk3d::mesh::delete_points(selected_curves_mesh, unused_points);\n\n\t\t// Merge all curves that share endpoints into a single curve\n\t\tk3d::mesh merged_mesh;\n\t\tmerged_mesh.points.create();\n\t\tmerged_mesh.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> merged_curves(k3d::nurbs_curve::create(merged_mesh));\n\t\tmerge_connected_curves(merged_mesh, *merged_curves, selected_curves_mesh, 0);\n\n\t\t// Eliminate duplicate points again, closing any loops\n\t\treplace_duplicate_points(merged_mesh);\n\t\tk3d::mesh::lookup_unused_points(merged_mesh, unused_points);\n\t\tk3d::mesh::delete_points(merged_mesh, unused_points);\n\n\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_merged_curves(k3d::nurbs_curve::validate(merged_mesh, *merged_mesh.primitives.front()));\n\n\t\tif(m_coons.pipeline_value())\n\t\t{\n\t\t\t// Split all loops into 4 curves, and apply the Coons patch algorithm to create the caps\n\t\t\tfor(k3d::uint_t curve = 0; curve != merged_curves->curve_first_points.size(); ++curve)\n\t\t\t{\n\t\t\t\tif(!is_closed(*const_merged_curves, curve))\n\t\t\t\t\tcontinue;\n\t\t\t\t// Split the curve in half\n\t\t\t\tk3d::mesh halved_mesh;\n\t\t\t\thalved_mesh.points.create();\n\t\t\t\thalved_mesh.point_selection.create();\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> halved_curves(k3d::nurbs_curve::create(halved_mesh));\n\t\t\t\t// This opens the curve\n\t\t\t\tsplit_curve(halved_mesh, *halved_curves, merged_mesh, *const_merged_curves, curve, m_u_offset.pipeline_value());\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_halved_curves(k3d::nurbs_curve::validate(halved_mesh, *halved_mesh.primitives.front()));\n\t\t\t\t// Now we split it in two\n\t\t\t\tsplit_curve(halved_mesh, *halved_curves, halved_mesh, *const_halved_curves, 0, 0.5);\n\t\t\t\treturn_if_fail(halved_curves->curve_first_points.size() == 3);\n\t\t\t\t// Split both new curves\n\t\t\t\tk3d::mesh quartered_mesh;\n\t\t\t\tquartered_mesh.points.create();\n\t\t\t\tquartered_mesh.point_selection.create();\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> quartered_curves(k3d::nurbs_curve::create(quartered_mesh));\n\t\t\t\tsplit_curve(quartered_mesh, *quartered_curves, halved_mesh, *const_halved_curves, 1, 0.5);\n\t\t\t\tsplit_curve(quartered_mesh, *quartered_curves, halved_mesh, *const_halved_curves, 2, 0.5);\n\n\t\t\t\t// Make sure the endpoints of the split curves are shared\n\t\t\t\treplace_duplicate_points(quartered_mesh);\n\t\t\t\tk3d::mesh::bools_t unused_points;\n\t\t\t\tk3d::mesh::lookup_unused_points(quartered_mesh, unused_points);\n\t\t\t\tk3d::mesh::delete_points(quartered_mesh, unused_points);\n\n\t\t\t\t// Apply coons\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_quartered_curves(k3d::nurbs_curve::validate(quartered_mesh, *quartered_mesh.primitives.front()));\n\t\t\t\tcoons_patch(Output, *output_patches, quartered_mesh, *const_quartered_curves);\n\t\t\t}\n\t\t}\n\t\telse // no coons requested, use a trimmed bilinear patch instead\n\t\t{\n\t\t\tfor(k3d::uint_t curve = 0; curve != merged_curves->curve_first_points.size(); ++curve)\n\t\t\t{\n\t\t\t\tif(!is_closed(*const_merged_curves, curve))\n\t\t\t\t\tcontinue;\n\t\t\t\tk3d::point3 origin;\n\t\t\t\tk3d::normal3 normal;\n\t\t\t\tk3d::vector3 u_axis;\n\t\t\t\tk3d::vector3 v_axis;\n\t\t\t\tk3d::mesh::points_2d_t parameter_points;\n\t\t\t\tk3d::mesh::points_t points;\n\t\t\t\tk3d::mesh::weights_t weights;\n\t\t\t\tcurve_arrays merged_arrays(merged_mesh, *const_merged_curves, curve, true);\n\t\t\t\tmerged_arrays.points3(points);\n\t\t\t\tmerged_arrays.weights(weights);\n\t\t\t\t// Get the plane the curve lies in\n\t\t\t\textract_plane(origin, normal, u_axis, v_axis, parameter_points, points, m_u_offset.pipeline_value());\n\t\t\t\t// Get the bounding box for the curve points in this plane\n\t\t\t\tk3d::point2 bbmin, bbmax;\n\t\t\t\tbbox2(bbmin, bbmax, parameter_points);\n\t\t\t\tconst k3d::double_t u_offset = -bbmin[0];\n\t\t\t\tconst k3d::double_t v_offset = -bbmin[1];\n\t\t\t\tconst k3d::double_t u_scale = u_axis.length() / (bbmax[0] - bbmin[0]);\n\t\t\t\tconst k3d::double_t v_scale = v_axis.length() / (bbmax[1] - bbmin[1]);\n\t\t\t\tpatch_point_data bilinear_point_data;\n\t\t\t\tbilinear_point_data.points.push_back(origin + bbmin[0] * u_axis + bbmin[1] * v_axis);\n\t\t\t\tbilinear_point_data.points.push_back(origin + bbmax[0] * u_axis + bbmin[1] * v_axis);\n\t\t\t\tbilinear_point_data.points.push_back(origin + bbmin[0] * u_axis + bbmax[1] * v_axis);\n\t\t\t\tbilinear_point_data.points.push_back(origin + bbmax[0] * u_axis + bbmax[1] * v_axis);\n\t\t\t\tbilinear_point_data.weights.resize(4, 1.0);\n\t\t\t\tk3d::table patch_attributes = merged_curves->curve_attributes.clone(curve, curve+1);\n\t\t\t\tk3d::table parameter_attributes = merged_curves->parameter_attributes.clone(2*curve, 2*curve+2);\n\t\t\t\tk3d::table_copier parameter_copier(merged_curves->parameter_attributes, parameter_attributes);\n\t\t\t\tparameter_copier.push_back(2*curve);\n\t\t\t\tparameter_copier.push_back(2*curve+1);\n\t\t\t\tcreate_bilinear_patch(Output, *output_patches, bilinear_point_data, patch_attributes, parameter_attributes);\n\t\t\t\toutput_patches->patch_materials.push_back(merged_curves->material.back());\n\t\t\t\tadd_trim_curve(*output_patches, output_patches->patch_first_points.size()-1, parameter_points, weights, merged_arrays.knots, merged_curves->curve_orders[curve], u_offset, v_offset, u_scale, v_scale);\n\t\t\t}\n\t\t}\n\n\t\tif(m_delete_original.pipeline_value())\n\t\t{\n\t\t\tdelete_selected_curves(Output);\n\t\t}\n\t\tdelete_empty_primitives(Output);\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<create_cap, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x3f8d9448, 0x5d442835, 0x7d4d0f87, 0x4c0e0593),\n\t\t  \"NurbsCreateCap\",\n\t\t  _(\"Creates a NURBS surface filling out the selected closed curves\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_delete_original;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_offset;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_coons;\n};\n\n//Create connect_curve factory\nk3d::iplugin_factory& create_cap_factory()\n{\n\treturn create_cap::get_factory();\n}\n\n}//namespace nurbs\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/curve_degree_elevation.cpp",
    "content": "\n// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass curve_degree_elevation :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tcurve_degree_elevation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_degree(init_owner(*this) + init_name(\"degree\") + init_label(_(\"The degree which will be added to the curve\")) + init_description(_(\"The curve degree gets elevated by the amount you specify here\")) + init_value(1) + init_constraint(constraint::minimum(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_degree.changed_signal().connect(make_update_mesh_slot());\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tmodify_selected_curves(Input, Output, degree_elevator(m_degree.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<curve_degree_elevation, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x3f1c2279, 0xb94454e5, 0xc9484aa3, 0x54fb11c3),\n\t\t  \"NurbsCurveDegreeElevation\",\n\t\t  _(\"Takes a curve of degree p and turns it into a curve with degree p+degree\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tstruct degree_elevator\n\t{\n\t\tdegree_elevator(const k3d::uint_t Elevations) : elevations(Elevations) {}\n\t\tvoid operator()(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t& Curve)\n\t\t{\n\t\t\televate_curve_degree(OutputMesh, OutputCurves, InputMesh, InputCurves, Curve, elevations);\n\t\t}\n\t\tconst k3d::uint_t elevations;\n\t};\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_degree;\n};\n\n//Create connect_curve factory\nk3d::iplugin_factory& curve_degree_elevation_factory()\n{\n\treturn curve_degree_elevation::get_factory();\n}\n\n}//namespace nurbs\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/curve_traversal.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass curve_traversal :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tcurve_traversal(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_delete_original(init_owner(*this) + init_name(_(\"delete_original\")) + init_label(_(\"Delete the Curves\")) + init_description(_(\"Delete the curves used to construct the surface\")) + init_value(true))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_delete_original.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\t// Find the two selected curves\n\t\tk3d::mesh::indices_t selected_curves;\n\t\tk3d::mesh::indices_t selected_prims;\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != Output.primitives.size(); ++prim_idx)\n\t\t{\n\t\t\tk3d::uint_t selected_count = selected_curves.size();\n\t\t\tif(Output.primitives[prim_idx]->type == \"nurbs_curve\")\n\t\t\t{\n\t\t\t\tk3d::mesh::visit_arrays(*Output.primitives[prim_idx], selected_component_extractor(selected_curves, \"curve\"));\n\t\t\t\tif(selected_count < selected_curves.size())\n\t\t\t\t\tselected_prims.push_back(prim_idx);\n\t\t\t}\n\t\t}\n\t\treturn_if_fail(selected_curves.size() == 2);\n\t\treturn_if_fail(selected_prims.size() == 2);\n\n\t\t// Create two meshes, each one having one of the two curves selected\n\t\tk3d::mesh to_traverse = Output;\n\t\tk3d::mesh traverse_along = Output;\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curves(k3d::nurbs_curve::validate(to_traverse, to_traverse.primitives[selected_prims.back()]));\n\t\tcurves->curve_selections[selected_curves.back()] = 0.0;\n\t\tcurves.reset(k3d::nurbs_curve::validate(to_traverse, traverse_along.primitives[selected_prims.front()]));\n\t\tcurves->curve_selections[selected_curves.front()] = 0.0;\n\n\t\t// traverse the curves\n\t\ttraverse_curve(to_traverse, traverse_along, Output);\n\n\t\t// clean up\n\t\tif(m_delete_original.pipeline_value())\n\t\t{\n\t\t\tdelete_selected_curves(Output);\n\t\t}\n\t\tdelete_empty_primitives(Output);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<curve_traversal, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x9e316d5f, 0x9945f986, 0xbb2f70b6, 0xec54bada),\n\t\t  \"NurbsCurveTraversal\",\n\t\t  _(\"Creates a NURBS surface while traversing one NURBS curve along another\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_delete_original;\n};\n\n//Create connect_curve factory\nk3d::iplugin_factory& curve_traversal_factory()\n{\n\treturn curve_traversal::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/edit_knot_vector.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/ireset_properties.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n#include <sstream>\n\nnamespace k3d\n{\n\nnamespace data\n{\n\n/// Serialization policy for data containers that can be serialized as XML\ntemplate<typename value_t, class property_policy_t>\nclass array_serialization :\n\tpublic property_policy_t,\n\tpublic ipersistent\n{\n\t// This policy only works for arrays\n\tBOOST_STATIC_ASSERT((boost::is_base_and_derived<array, typename boost::remove_pointer<value_t>::type>::value));\n\npublic:\n\tvoid save(xml::element& Element, const ipersistent::save_context& Context)\n\t{\n\t\tvalue_t& Array = property_policy_t::internal_value();\n\t\ttypename value_t::const_iterator item = Array.begin();\n\t\tconst typename value_t::const_iterator end = Array.end();\n\n\t\tstd::ostringstream buffer;\n\n\t\tif (item != end)\n\t\t\tbuffer << *item++;\n\t\tfor (; item != end; ++item)\n\t\t\tbuffer << \" \" << *item;\n\n\t\txml::element Storage(\"property\", buffer.str(), xml::attribute(\"name\", property_policy_t::name()));\n\t\tElement.append(Storage);\n\t}\n\n\tvoid load(xml::element& Element, const ipersistent::load_context& Context)\n\t{\n\t\ttypename value_t::value_type value;\n\t\tvalue_t Array;\n\n\t\tstd::istringstream buffer(Element.text);\n\t\twhile (true)\n\t\t{\n\t\t\tbuffer >> value;\n\n\t\t\tif (!buffer)\n\t\t\t\tbreak;\n\n\t\t\tArray.push_back(value);\n\t\t}\n\n\t\tproperty_policy_t::set_value(Array);\n\t}\n\nprotected:\n\ttemplate<typename init_t>\n\tarray_serialization(const init_t& Init) :\n\t\t\tproperty_policy_t(Init)\n\t{\n\t\tInit.persistent_collection().enable_serialization(Init.name(), *this);\n\t}\n};\n}\n}\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace detail\n{\n\tk3d::bool_t validate_knot_vector(const k3d::mesh::knots_t& Knots, const k3d::uint_t Order)\n\t{\n\t\tconst k3d::uint_t knot_count = Knots.size();\n\t\tfor(k3d::uint_t i = 0; i != (knot_count-1); ++i)\n\t\t{\n\t\t\treturn_val_if_fail(Knots[i+1] >= Knots[i], false);\n\t\t\treturn_val_if_fail(multiplicity(Knots, Knots[i], 1, knot_count-2) < Order, false);\n\t\t}\n\t\treturn true;\n\t}\n} // namespace detail\n\nclass edit_knot_vector :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >,\n\tpublic k3d::ireset_properties\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tedit_knot_vector(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_knot_vector(init_owner(*this) + init_name(\"knot_vector\") + init_label(_(\"Knot Vector\")) + init_description(_(\"Enter a new knot vector containing knot values separated with spaces.\")) + init_value(k3d::mesh::knots_t()))\n\t{\n\t\tm_knot_vector.set_metadata_value(k3d::metadata::key::role(), k3d::metadata::value::nurbs_knot_vector_role());\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_knot_vector.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid reset_properties()\n\t{\n\t\tconst k3d::mesh* input_mesh = m_input_mesh.pipeline_value();\n\t\tif(!input_mesh)\n\t\t\treturn;\n\t\tk3d::mesh input_with_selections = *input_mesh;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), input_with_selections);\n\t\tk3d::double_t order;\n\t\tvisit_selected_curves(input_with_selections, max_order_calculator(order));\n\t\tk3d::mesh elevated_mesh = input_with_selections;\n\t\tmodify_selected_curves(input_with_selections, elevated_mesh, degree_elevator(order));\n\t\tk3d::mesh::knots_t knots;\n\t\tvisit_selected_curves(elevated_mesh, knot_vector_calculator(knots));\n\n\t\tm_knot_vector.set_value(knots);\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\t// Get the maximum order\n\t\tk3d::double_t order;\n\t\tvisit_selected_curves(Output, max_order_calculator(order));\n\n\t\t// Elevate all selected curves to the maximal order\n\t\tk3d::mesh elevated_mesh = Output;\n\t\tmodify_selected_curves(Input, elevated_mesh, degree_elevator(order));\n\n\t\t// Validate the replacement knot vector\n\t\tconst k3d::mesh::knots_t knots = m_knot_vector.pipeline_value();\n\t\treturn_if_fail(detail::validate_knot_vector(knots, order));\n\n\t\t// Apply the new knot vector to all selected curves\n\t\tmodify_selected_curves(elevated_mesh, Output, knot_vector_merger(knots, order));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<edit_knot_vector, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x8ff0922c, 0xf6412c8d, 0x2cf9c5a3, 0x54bdd064),\n\t\t  \"NurbsEditCurveKnotVector\",\n\t\t  _(\"Edit the knot vector of a NURBS curve\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d::metadata::property< k3d_data(k3d::mesh::knots_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, array_serialization) > m_knot_vector;\n};\n\nk3d::iplugin_factory& edit_knot_vector_factory()\n{\n\treturn edit_knot_vector::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/extract_curve_point.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n\n#include \"nurbs_curves.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass extract_curve_point :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\textract_curve_point(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_parameter(init_owner(*this) + init_name(_(\"parameter\")) + init_label(_(\"Parameter Value\")) + init_description(_(\"Parameter value at which the point will be extracted\")) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(0.0 , constraint::maximum(1.0))) + init_value(0.0))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_parameter.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tif(!Input.points)\n\t\t\treturn;\n\t\tk3d::mesh tmp = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), tmp);\n\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selections = Output.point_selection.create();\n\t\tconst k3d::double_t u = m_parameter.pipeline_value();\n\t\tvisit_selected_curves(tmp, curve_point_extractor(points, Output.point_attributes, u));\n\t\tpoint_selections.resize(points.size(), 1.0);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<extract_curve_point, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x6d918270, 0xc84c904f, 0x1e078e8d, 0x661b8d72),\n\t\t  \"NurbsExtractCurvePoint\",\n\t\t  _(\"Extract the point at the given parameter value\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t// Extracts points at the given U value\n\tstruct curve_point_extractor\n\t{\n\t\tcurve_point_extractor(k3d::mesh::points_t& Points, k3d::table& PointAttributes, const k3d::double_t U) : points(Points), point_attributes(PointAttributes), u(U) {}\n\t\tvoid operator()(const k3d::mesh& Mesh, const k3d::nurbs_curve::const_primitive& Curves, const k3d::uint_t& Curve)\n\t\t{\n\t\t\tcurve_arrays curve(Mesh, Curves, Curve, true);\n\t\t\tcurve_arrays::curve_value value = curve.evaluate(u);\n\t\t\tpoints.push_back(value.position());\n\t\t\tk3d::table_copier copier(value.point_attributes, point_attributes);\n\t\t\tcopier.push_back(0);\n\t\t}\n\t\tk3d::mesh::points_t& points;\n\t\tk3d::table& point_attributes;\n\t\tconst k3d::double_t u;\n\t};\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_parameter;\n};\n\n//Create connect_curve factory\nk3d::iplugin_factory& extract_curve_point_factory()\n{\n\treturn extract_curve_point::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n"
  },
  {
    "path": "modules/nurbs/extract_patch_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass extract_patch_curve :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\textract_patch_curve(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_parameter(init_owner(*this) + init_name(_(\"parameter\")) + init_label(_(\"Parameter Value\")) + init_description(_(\"Parameter value (u or v) for which a curve will be extracted\")) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(0.0 , constraint::maximum(1.0))) + init_value(0.0)),\n\t\tm_extract_v_curve(init_owner(*this) + init_name(_(\"extract_v_curve\")) + init_label(_(\"Extract V curve\")) + init_description(_(\"If true, a curve in the V direction is extracted (iso-U curve), otherwise it's a U-curve\")) + init_value(false))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_parameter.changed_signal().connect(make_update_mesh_slot());\n\t\tm_extract_v_curve.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> output_patches(k3d::nurbs_patch::create(Output));\n\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> output_curves(k3d::nurbs_curve::create(Output));\n\t\toutput_curves->material.push_back(0);\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != Input.primitives.size(); ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> input_patches(k3d::nurbs_patch::validate(Output, *Output.primitives[prim_idx]));\n\t\t\tif(!input_patches.get())\n\t\t\t\tcontinue;\n\t\t\tfor(k3d::uint_t patch = 0; patch != input_patches->patch_first_points.size(); ++patch)\n\t\t\t{\n\t\t\t\tif(input_patches->patch_selections[patch])\n\t\t\t\t{\n\t\t\t\t\textract_patch_curve_by_parameter(Output, *output_curves, Output, *input_patches, patch, m_parameter.pipeline_value(), !m_extract_v_curve.pipeline_value());\n\t\t\t\t\toutput_curves->material[0] = input_patches->patch_materials[patch];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<extract_patch_curve, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0xd987a77b, 0xb84a96d5, 0x60291eba, 0xe9feb8fc),\n\t\t  \"NurbsExtractPatchCurve\",\n\t\t  _(\"Extract a curve from a patch at a given parameter in  given direction\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_parameter;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_extract_v_curve;\n};\n\n//Create connect_curve factory\nk3d::iplugin_factory& extract_patch_curve_factory()\n{\n\treturn extract_patch_curve::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n"
  },
  {
    "path": "modules/nurbs/extract_trim_curves.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass extract_trim_curves :\n\t\t\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\textract_trim_curves(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\t\tbase(Factory, Document),\n\t\t\tm_samples(init_owner(*this) + init_name(_(\"samples\")) + init_label(_(\"Samples\")) + init_description(_(\"Samples per knot interval of the trim curves. More is better\")) + init_value(5) + init_constraint(constraint::minimum(1)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_samples.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tif(!Output.points.get())\n\t\t\treturn;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tconst k3d::uint_t prim_count = Input.primitives.size();\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != prim_count; ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> patches(k3d::nurbs_patch::validate(Output, *Output.primitives[prim_idx]));\n\t\t\tif(patches)\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> output_curves;\n\t\t\t\tfor(k3d::uint_t patch = 0; patch != patches->patch_first_points.size(); ++patch)\n\t\t\t\t{\n\t\t\t\t\tif(patches->patch_selections[patch] && patches->patch_trim_loop_counts[patch])\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!output_curves)\n\t\t\t\t\t\t\toutput_curves.reset(k3d::nurbs_curve::create(Output));\n\t\t\t\t\t\ttrim_to_nurbs(Output, *output_curves, Output, *patches, patch, m_samples.pipeline_value());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdelete_empty_primitives(Output);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<extract_trim_curves, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0xb8facce3, 0x424bf565, 0xc4d5d5b0, 0x727fe955),\n\t\t  \"NurbsExtractTrimCurves\",\n\t\t  _(\"Extracts patch trim curves as 3D NURBS curve approximations\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_samples;\n};\n\nk3d::iplugin_factory& extract_trim_curves_factory()\n{\n\treturn extract_trim_curves::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/extrude_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass extrude_curve :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\textrude_curve(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_distance(init_owner(*this) + init_name(_(\"distance\")) + init_label(_(\"Distance\")) + init_description(_(\"How far to extrude the curve\")) + init_step_increment(0.5) + init_units(typeid(k3d::measurement::scalar)) + init_value(1.0)),\n\t\tm_segments(init_owner(*this) + init_name(\"segments\") + init_label(_(\"segments\")) + init_description(_(\"Segments\")) + init_value(1) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_along(init_owner(*this) + init_name(\"along\") + init_label(_(\"Extrude along\")) + init_description(_(\"Axis along which the curve gets extruded\")) + init_value(k3d::Z) + init_enumeration(k3d::axis_values())),\n\t\tm_delete_original(init_owner(*this) + init_name(_(\"delete_original\")) + init_label(_(\"Delete the Curve\")) + init_description(_(\"Delete the original curve\")) + init_value(true))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_distance.changed_signal().connect(make_update_mesh_slot());\n\t\tm_segments.changed_signal().connect(make_update_mesh_slot());\n\t\tm_along.changed_signal().connect(make_update_mesh_slot());\n\t\tm_delete_original.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::mesh input_with_selections = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), input_with_selections);\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tdouble distance = m_distance.pipeline_value();\n\t\tk3d::axis axis = m_along.pipeline_value();\n\t\tint segments = m_segments.pipeline_value();\n\n\t\t// Determine the start and end point of the extrusion vector\n\t\tconst k3d::point3 startpoint(0,0,0);\n\t\tk3d::point3 endpoint;\n\t\tswitch (axis)\n\t\t{\n\t\tcase k3d::X:\n\t\t\tendpoint = k3d::point3(distance, 0.0, 0.0);\n\t\t\tbreak;\n\t\tcase k3d::Y:\n\t\t\tendpoint = k3d::point3(0.0, distance, 0.0);\n\t\t\tbreak;\n\t\tcase k3d::Z:\n\t\t\tendpoint = k3d::point3(0.0, 0.0, distance);\n\t\t\tbreak;\n\t\t}\n\n\t\t// Create a straight curve from this vector to traverse along\n\t\tk3d::mesh extrusion_vector_mesh;\n\t\textrusion_vector_mesh.point_selection.create();\n\t\textrusion_vector_mesh.points.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> extrusion_vector_primitive(k3d::nurbs_curve::create(extrusion_vector_mesh));\n\t\tstraight_line(startpoint, endpoint, segments, *extrusion_vector_primitive, extrusion_vector_mesh);\n\t\textrusion_vector_primitive->curve_selections[0] = 1.0;\n\t\textrusion_vector_primitive->material.push_back(0);\n\n\t\ttraverse_curve(input_with_selections, extrusion_vector_mesh, Output);\n\n\t\tif(m_delete_original.pipeline_value())\n\t\t{\n\t\t\tdelete_selected_curves(Output);\n\t\t\tdelete_empty_primitives(Output);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<extrude_curve, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x93c6f141, 0x934f333a, 0x8a027ab4, 0x59b1510c),\n\t\t  \"NurbsExtrudeCurve\",\n\t\t  _(\"Extrudes the selected curve along a coordinate axis and lets you create caps if one of the curves is closed\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_distance;\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_along;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_delete_original;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_segments;\n};\n\n//Create connect_curve factory\nk3d::iplugin_factory& extrude_curve_factory()\n{\n\treturn extrude_curve::get_factory();\n}\n\n}//namespace nurbs\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/extrude_patch.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass extrude_patch :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\textrude_patch(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_distance(init_owner(*this) + init_name(_(\"distance\")) + init_label(_(\"Distance\")) + init_description(_(\"How far to extrude the curve\")) + init_step_increment(0.5) + init_units(typeid(k3d::measurement::scalar)) + init_value(1.0)),\n\t\tm_segments(init_owner(*this) + init_name(\"segments\") + init_label(_(\"segments\")) + init_description(_(\"Segments\")) + init_value(1) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_along(init_owner(*this) + init_name(\"along\") + init_label(_(\"Extrude along\")) + init_description(_(\"Axis along which the curve gets extruded\")) + init_value(k3d::Z) + init_enumeration(k3d::axis_values()))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_distance.changed_signal().connect(make_update_mesh_slot());\n\t\tm_segments.changed_signal().connect(make_update_mesh_slot());\n\t\tm_along.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tdouble distance = m_distance.pipeline_value();\n\t\tk3d::axis axis = m_along.pipeline_value();\n\t\tint segments = m_segments.pipeline_value();\n\n\t\t// Determine the start and end point of the extrusion vector\n\t\tconst k3d::point3 startpoint(0,0,0);\n\t\tk3d::point3 endpoint;\n\t\tswitch (axis)\n\t\t{\n\t\tcase k3d::X:\n\t\t\tendpoint = k3d::point3(distance, 0.0, 0.0);\n\t\t\tbreak;\n\t\tcase k3d::Y:\n\t\t\tendpoint = k3d::point3(0.0, distance, 0.0);\n\t\t\tbreak;\n\t\tcase k3d::Z:\n\t\t\tendpoint = k3d::point3(0.0, 0.0, distance);\n\t\t\tbreak;\n\t\t}\n\n\t\t// Create a straight curve from this vector to traverse along\n\t\tk3d::mesh extrusion_vector_mesh;\n\t\textrusion_vector_mesh.point_selection.create();\n\t\textrusion_vector_mesh.points.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> extrusion_vector_primitive(k3d::nurbs_curve::create(extrusion_vector_mesh));\n\t\tstraight_line(startpoint, endpoint, segments, *extrusion_vector_primitive, extrusion_vector_mesh);\n\t\textrusion_vector_primitive->curve_selections[0] = 1.0;\n\t\textrusion_vector_primitive->material.push_back(0);\n\n\t\tconst k3d::uint_t prim_count = Output.primitives.size();\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != prim_count; ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> patches(k3d::nurbs_patch::validate(Output, Output.primitives[prim_idx]));\n\t\t\tif(!patches)\n\t\t\t\tcontinue;\n\t\t\tconst k3d::mesh::selection_t patch_selections = patches->patch_selections;\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> const_patches(k3d::nurbs_patch::validate(Output, *Output.primitives[prim_idx]));\n\n\t\t\tfor(k3d::uint_t patch = 0; patch != patch_selections.size(); ++patch)\n\t\t\t{\n\t\t\t\tif(!patch_selections[patch])\n\t\t\t\t\tcontinue;\n\t\t\t\t// storage for the patch boundary curves\n\t\t\t\tk3d::mesh tmp_mesh;\n\t\t\t\ttmp_mesh.points.create();\n\t\t\t\ttmp_mesh.point_selection.create();\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> tmp_curves(k3d::nurbs_curve::create(tmp_mesh));\n\t\t\t\textract_patch_curve_by_number(tmp_mesh, *tmp_curves, Output, *const_patches, patch, 0, true);\n\t\t\t\textract_patch_curve_by_number(tmp_mesh, *tmp_curves, Output, *const_patches, patch, 0, false);\n\t\t\t\textract_patch_curve_by_number(tmp_mesh, *tmp_curves, Output, *const_patches, patch, const_patches->patch_v_point_counts[patch] - 1, true);\n\t\t\t\textract_patch_curve_by_number(tmp_mesh, *tmp_curves, Output, *const_patches, patch, const_patches->patch_u_point_counts[patch] - 1, false);\n\t\t\t\ttmp_curves->curve_selections.assign(4, 1.0);\n\t\t\t\ttmp_curves->material.push_back(const_patches->patch_materials[patch]);\n\n\t\t\t\ttraverse_curve(tmp_mesh, 0, extrusion_vector_mesh, Output, *patches);\n\t\t\t}\n\t\t}\n\t\treplace_duplicate_points(Output);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<extrude_patch, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0xfadb3ef0, 0xdc41c0f7, 0xe6f1caa6, 0x810ddfa5),\n\t\t  \"NurbsExtrudePatch\",\n\t\t  _(\"Extrudes the selected patch along a coordinate axis\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_distance;\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_along;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_segments;\n};\n\n//Create connect_curve factory\nk3d::iplugin_factory& extrude_patch_factory()\n{\n\treturn extrude_patch::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/flip_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"nurbs_curves.h\"\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass flip_curve :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tflip_curve(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points.get())\n\t\t\treturn;\n\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != Output.primitives.size(); ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curve_prim(k3d::nurbs_curve::validate(Output, Output.primitives[prim_idx]));\n\t\t\tif(!curve_prim)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::uint_t curve = 0; curve != curve_prim->curve_first_points.size(); ++curve)\n\t\t\t{\n\t\t\t\tif(curve_prim->curve_selections[curve])\n\t\t\t\t\tmodule::nurbs::flip_curve(*curve_prim, curve);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<flip_curve, k3d::interface_list<k3d::imesh_source , k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0xd69c221b, 0xdb49674c, 0x8ca63580, 0x517c0d23),\n\t\t  \"NurbsFlipCurve\",\n\t\t  _(\"Flips the order of the points for the selected curves\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\n};\n\nk3d::iplugin_factory& flip_curve_factory()\n{\n\treturn flip_curve::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/insert_knot.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass insert_knot :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tinsert_knot(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_u_value(init_owner(*this) + init_name(_(\"u_value\")) + init_label(_(\"u_value\")) + init_description(_(\"Insert knot at [0,1]\")) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(0.0 , constraint::maximum(1.0))) + init_value(0.5)),\n\t\tm_multiplicity(init_owner(*this) + init_name(_(\"multiplicity\")) + init_label(_(\"multiplicity\")) + init_description(_(\"Multiplicity\")) + init_constraint(constraint::minimum(1 , constraint::maximum(3))) + init_value(1))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_u_value.changed_signal().connect(make_update_mesh_slot());\n\t\tm_multiplicity.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tmodify_selected_curves(Input, Output, knot_inserter(m_u_value.pipeline_value(), m_multiplicity.pipeline_value()));\n\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<insert_knot, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x37e2f7e9, 0x7c44838e, 0x2227c981, 0x3018ab03),\n\t\t  \"NurbsCurveInsertKnot\",\n\t\t  _(\"Inserts a new Knot with the specified u-value\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprivate:\n\tstruct knot_inserter\n\t{\n\t\tknot_inserter(const k3d::double_t U, const k3d::uint_t R) : u(U), r(R) {}\n\t\tvoid operator()(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t& Curve)\n\t\t{\n\t\t\tcurve_arrays curve(InputMesh, InputCurves, Curve);\n\t\t\tmodule::nurbs::insert_knot(curve, u, r);\n\t\t\tcurve.add_curve(OutputMesh, OutputCurves);\n\t\t}\n\t\tconst k3d::double_t u;\n\t\tconst k3d::uint_t r;\n\t};\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_value;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_multiplicity;\n};\n\nk3d::iplugin_factory& insert_knot_factory()\n{\n\treturn insert_knot::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n"
  },
  {
    "path": "modules/nurbs/merge_connected_curves.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass merge_connected_curves :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tmerge_connected_curves(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tk3d::mesh selected_curves_mesh;\n\t\tselected_curves_mesh.points.create();\n\t\tselected_curves_mesh.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> selected_curves(k3d::nurbs_curve::create(selected_curves_mesh));\n\t\tselected_curves->material.push_back(0);\n\t\tvisit_selected_curves(Output, selected_curve_extractor(selected_curves_mesh, *selected_curves));\n\t\tdelete_selected_curves(Output);\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> output_curves(k3d::nurbs_curve::create(Output));\n\t\tmodule::nurbs::merge_connected_curves(Output, *output_curves, selected_curves_mesh, 0);\n\t\tif(output_curves->material.empty())\n\t\t\toutput_curves->material.push_back(selected_curves->material.back());\n\t\tdelete_empty_primitives(Output);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<merge_connected_curves, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x0f2af2c9, 0xe44d9e20, 0x3fcf769d, 0xb586ca27),\n\t\t  \"NurbsMergeConnectedCurves\",\n\t\t  _(\"Join selected curves with common endpoints into a single NURBS curve\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& merge_connected_curves_factory()\n{\n\treturn merge_connected_curves::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n"
  },
  {
    "path": "modules/nurbs/merge_curve_knot_vectors.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass merge_curve_knot_vectors :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tmerge_curve_knot_vectors(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tk3d::double_t order;\n\t\tvisit_selected_curves(Output, max_order_calculator(order));\n\t\tk3d::mesh elevated_mesh = Output;\n\t\tmodify_selected_curves(Input, elevated_mesh, degree_elevator(order));\n\t\tk3d::mesh::knots_t knots;\n\t\tvisit_selected_curves(elevated_mesh, knot_vector_calculator(knots));\n\t\tmodify_selected_curves(elevated_mesh, Output, knot_vector_merger(knots, order));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<merge_curve_knot_vectors, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0xf0080968, 0xeb4096c5, 0x33d94c96, 0x3c8af308),\n\t\t  \"NurbsMergeCurveKnotVectors\",\n\t\t  _(\"Inserts a new Knot with the specified u-value\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& merge_curve_knot_vectors_factory()\n{\n\treturn merge_curve_knot_vectors::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n"
  },
  {
    "path": "modules/nurbs/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nextern k3d::iplugin_factory& add_trim_curve_factory();\nextern k3d::iplugin_factory& close_curve_factory();\nextern k3d::iplugin_factory& connect_curves_factory();\nextern k3d::iplugin_factory& create_cap_factory();\nextern k3d::iplugin_factory& curve_degree_elevation_factory();\nextern k3d::iplugin_factory& curve_traversal_factory();\nextern k3d::iplugin_factory& edit_knot_vector_factory();\nextern k3d::iplugin_factory& extract_curve_point_factory();\nextern k3d::iplugin_factory& extract_patch_curve_factory();\nextern k3d::iplugin_factory& extract_trim_curves_factory();\nextern k3d::iplugin_factory& extrude_curve_factory();\nextern k3d::iplugin_factory& extrude_patch_factory();\nextern k3d::iplugin_factory& flip_curve_factory();\nextern k3d::iplugin_factory& insert_knot_factory();\nextern k3d::iplugin_factory& merge_connected_curves_factory();\nextern k3d::iplugin_factory& merge_curve_knot_vectors_factory();\nextern k3d::iplugin_factory& patch_degree_elevation_factory();\nextern k3d::iplugin_factory& patch_insert_knot_factory();\nextern k3d::iplugin_factory& polygonize_curve_factory();\nextern k3d::iplugin_factory& polygonize_patch_factory();\nextern k3d::iplugin_factory& revolve_curve_factory();\nextern k3d::iplugin_factory& ruled_surface_factory();\nextern k3d::iplugin_factory& set_weight_factory();\nextern k3d::iplugin_factory& skinned_surface_factory();\nextern k3d::iplugin_factory& split_curve_factory();\nextern k3d::iplugin_factory& split_patch_factory();\nextern k3d::iplugin_factory& sweep_surface_factory();\n\n} // namespace nurbs\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::nurbs::add_trim_curve_factory());\n\tRegistry.register_factory(module::nurbs::close_curve_factory());\n\tRegistry.register_factory(module::nurbs::connect_curves_factory());\n\tRegistry.register_factory(module::nurbs::create_cap_factory());\n\tRegistry.register_factory(module::nurbs::curve_degree_elevation_factory());\n\tRegistry.register_factory(module::nurbs::curve_traversal_factory());\n\tRegistry.register_factory(module::nurbs::edit_knot_vector_factory());\n\tRegistry.register_factory(module::nurbs::extract_curve_point_factory());\n\tRegistry.register_factory(module::nurbs::extract_patch_curve_factory());\n\tRegistry.register_factory(module::nurbs::extract_trim_curves_factory());\n\tRegistry.register_factory(module::nurbs::extrude_curve_factory());\n\tRegistry.register_factory(module::nurbs::extrude_patch_factory());\n\tRegistry.register_factory(module::nurbs::flip_curve_factory());\n\tRegistry.register_factory(module::nurbs::insert_knot_factory());\n\tRegistry.register_factory(module::nurbs::merge_connected_curves_factory());\n\tRegistry.register_factory(module::nurbs::merge_curve_knot_vectors_factory());\n\tRegistry.register_factory(module::nurbs::patch_degree_elevation_factory());\n\tRegistry.register_factory(module::nurbs::patch_insert_knot_factory());\n\tRegistry.register_factory(module::nurbs::polygonize_curve_factory());\n\tRegistry.register_factory(module::nurbs::polygonize_patch_factory());\n\tRegistry.register_factory(module::nurbs::revolve_curve_factory());\n\tRegistry.register_factory(module::nurbs::ruled_surface_factory());\n\tRegistry.register_factory(module::nurbs::set_weight_factory());\n\tRegistry.register_factory(module::nurbs::skinned_surface_factory());\n\tRegistry.register_factory(module::nurbs::split_curve_factory());\n\tRegistry.register_factory(module::nurbs::split_patch_factory());\n\tRegistry.register_factory(module::nurbs::sweep_surface_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/nurbs/nurbs_curves.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/table_copier.h>\n\n#include \"nurbs_curves.h\"\n#include \"utility.h\" // for knot_nomalizer\n\n#include <boost/scoped_ptr.hpp>\n#include <sstream>\n\n// For linear system solve in the approximate function\n#include <boost/numeric/ublas/lu.hpp>\n#include <boost/numeric/ublas/matrix_sparse.hpp>\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/io.hpp>\n\nnamespace ublas = boost::numeric::ublas;\n\nnamespace k3d { namespace nurbs_curve { class primitive; } }\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace detail\n{\n\nusing namespace k3d; // for easy moving to the SDK\n\nstruct inf_norm\n{\n\tinf_norm(const k3d::double_t Threshold = 0.000001) : threshold(Threshold) {}\n\n\tconst bool_t operator()(const point3& p1, const point3& p2)\n\t{\n\t\tif (fabs(p1[0] - p2[0]) < threshold\n\t\t\t\t&& fabs(p1[1] - p2[1]) < threshold\n\t\t\t\t&& fabs(p1[2] - p2[2]) < threshold)\n\t\t\treturn true;\n\t\treturn false;\n\t}\n\n\tconst k3d::double_t threshold;\n};\n\ntemplate<typename ComparatorT>\nvoid lookup_duplicate_points(const mesh::points_t& Points, mesh::indices_t& PointMap, ComparatorT Equal)\n{\n\tconst uint_t point_count = Points.size();\n\tmesh::bools_t duplicate_points(point_count, false);\n\tPointMap.resize(point_count);\n\tfor(uint_t i = 0; i != point_count; ++i)\n\t{\n\t\tif(duplicate_points[i])\n\t\t\tcontinue;\n\t\tfor(uint_t j = i+1; j != point_count; ++j)\n\t\t{\n\t\t\tif(Equal(Points[i], Points[j]))\n\t\t\t{\n\t\t\t\tduplicate_points[j] = true;\n\t\t\t\tPointMap[j] = i;\n\t\t\t}\n\t\t}\n\t\tPointMap[i] = i;\n\t}\n}\n\n} // namespace detail\n\n////////////////\n// curve_arrays\n\ncurve_arrays::curve_arrays(const k3d::uint_t PointCount, const k3d::uint_t Order) :\n\t\tpoints(PointCount, k3d::point4(0,0,0,0)),\n\t\torder(Order)\n{\n}\n\ncurve_arrays::curve_arrays(const k3d::mesh& Mesh, const k3d::nurbs_curve::const_primitive& Primitive, const k3d::uint_t Curve, const k3d::bool_t NormalizeKnots)\n{\n\torder = Primitive.curve_orders[Curve];\n\tconst k3d::uint_t point_count = Primitive.curve_point_counts[Curve];\n\tconst k3d::uint_t points_begin = Primitive.curve_first_points[Curve];\n\tconst k3d::uint_t knots_begin = Primitive.curve_first_knots[Curve];\n\tconst k3d::uint_t knots_end = knots_begin + point_count + order;\n\n\tpoints.resize(point_count);\n\tknots.resize(knots_end - knots_begin);\n\n\tpoint_attributes = Mesh.point_attributes.clone_types();\n\tk3d::table_copier point_attribute_copier(Mesh.point_attributes, point_attributes);\n\tcurve_attributes = Primitive.curve_attributes.clone_types();\n\tk3d::table_copier curve_attribute_copier(Primitive.curve_attributes, curve_attributes);\n\tparameter_attributes = Primitive.parameter_attributes.clone_types();\n\tk3d::table_copier parameter_attribute_copier(Primitive.parameter_attributes, parameter_attributes);\n\tvertex_attributes = Primitive.vertex_attributes.clone_types();\n\tk3d::table_copier vertex_attribute_copier(Primitive.vertex_attributes, vertex_attributes);\n\n\tpoint_attributes.set_row_count(point_count);\n\tvertex_attributes.set_row_count(point_count);\n\n\tcurve_attribute_copier.push_back(Curve);\n\tparameter_attribute_copier.push_back(2*Curve);\n\tparameter_attribute_copier.push_back(2*Curve+1);\n\n\tfor(k3d::uint_t point = 0; point != point_count; ++point)\n\t{\n\t\tconst k3d::uint_t curve_point_idx = points_begin + point;\n\t\tconst k3d::point3& p = Mesh.points->at(Primitive.curve_points[curve_point_idx]);\n\t\tconst k3d::double_t w = Primitive.curve_point_weights[curve_point_idx];\n\t\tpoints[point] = k3d::point4(p[0]*w, p[1]*w, p[2]*w, w);\n\t\t// Note: attributes must be weighted as well for uniform treatment\n\t\tpoint_attribute_copier.copy(1, &Primitive.curve_points[curve_point_idx], &w, point);\n\t\tvertex_attribute_copier.copy(1, &curve_point_idx, &w, point);\n\t}\n\n\tfor(k3d::uint_t knot_idx = knots_begin; knot_idx != knots_end; ++knot_idx)\n\t{\n\t\tconst k3d::uint_t i = knot_idx - knots_begin;\n\t\tknots[i] = Primitive.curve_knots[knot_idx];\n\t}\n\tif(NormalizeKnots)\n\t{\n\t\tconst k3d::double_t min = knots.front();\n\t\tconst k3d::double_t max = knots.back();\n\t\tstd::transform(knots.begin(), knots.end(), knots.begin(), knot_normalizer(min, max));\n\t}\n\tassert_error(validate());\n}\n\nconst k3d::bool_t curve_arrays::validate() const\n{\n\treturn_val_if_fail(order + points.size() == knots.size(), false);\n\n\treturn_val_if_fail(point_attributes.empty() || points.size() == point_attributes.row_count(), false);\n\treturn_val_if_fail(curve_attributes.empty() || curve_attributes.row_count() == 1, false);\n\treturn_val_if_fail(parameter_attributes.empty() || parameter_attributes.row_count() == 2, false);\n\treturn_val_if_fail(vertex_attributes.empty() || vertex_attributes.row_count() == points.size(), false);\n\n\treturn true;\n}\n\n/// Append attributes to the given mesh\nvoid curve_arrays::add_curve(k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Primitive)\n{\n\treturn_if_fail(validate());\n\n\t// Initialize point arrays, if needed\n\tif(!Mesh.points)\n\t{\n\t\tMesh.points.create();\n\t\tMesh.point_selection.create();\n\t\tMesh.point_attributes = k3d::table();\n\t}\n\n\t// Initialize attributes\n\tconst k3d::uint_t old_point_count = Mesh.points->size();\n\tconst k3d::uint_t old_vertex_count = Primitive.curve_points.size();\n\tif(Mesh.point_attributes.empty())\n\t{\n\t\tMesh.point_attributes = point_attributes.clone_types();\n\t\tMesh.point_attributes.set_row_count(old_point_count);\n\t}\n\tif(Primitive.vertex_attributes.empty())\n\t{\n\t\tPrimitive.vertex_attributes = vertex_attributes.clone_types();\n\t\tPrimitive.vertex_attributes.set_row_count(old_vertex_count);\n\t}\n\tif(Primitive.curve_attributes.empty())\n\t{\n\t\tPrimitive.curve_attributes = curve_attributes.clone_types();\n\t\tPrimitive.curve_attributes.set_row_count(Primitive.curve_first_points.size());\n\t}\n\tif(Primitive.parameter_attributes.empty())\n\t{\n\t\tPrimitive.parameter_attributes = parameter_attributes.clone_types();\n\t\tPrimitive.parameter_attributes.set_row_count(2*Primitive.curve_first_points.size());\n\t}\n\n\t// Copy the structure\n\tk3d::mesh::points_t points3;\n\tk3d::mesh::weights_t weights;\n\tconst k3d::uint_t points_end = points.size();\n\tfor(k3d::uint_t i = 0; i != points_end; ++i)\n\t{\n\t\tconst k3d::point4 p = points[i];\n\t\tweights.push_back(p[3]);\n\t\tpoints3.push_back(dehomogenize(p));\n\t}\n\tk3d::nurbs_curve::add_curve(Mesh, Primitive, order, points3, weights, knots);\n\t// Take care of the attributes\n\tk3d::table_copier point_attribute_copier(point_attributes, Mesh.point_attributes);\n\tk3d::table_copier vertex_attribute_copier(vertex_attributes, Primitive.vertex_attributes);\n\tconst k3d::uint_t point_count = points.size();\n\tfor(k3d::uint_t point_idx = 0; point_idx != point_count; ++point_idx)\n\t{\n\t\t// \"unweight\" attributes\n\t\tconst k3d::point4& point = points[point_idx];\n\t\tconst k3d::double_t weight = 1/point[3];\n\t\tpoint_attribute_copier.push_back(1, &point_idx, &weight);\n\t\tvertex_attribute_copier.push_back(1, &point_idx, &weight);\n\t}\n\tk3d::table_copier curve_attribute_copier(curve_attributes, Primitive.curve_attributes);\n\tk3d::table_copier parameter_attribute_copier(parameter_attributes, Primitive.parameter_attributes);\n\tcurve_attribute_copier.push_back(0);\n\tparameter_attribute_copier.push_back(0);\n\tparameter_attribute_copier.push_back(1);\n\n\t// Ensure the selection array is correctly sized\n\tPrimitive.curve_selections.resize(Primitive.curve_first_points.size(), 0.0);\n}\n\nvoid curve_arrays::resize(const k3d::uint_t Size, const k3d::uint_t Order)\n{\n\tpoints.resize(Size);\n\tknots.resize(Size + Order);\n\tpoint_attributes.set_row_count(Size);\n\tvertex_attributes.set_row_count(Size);\n\torder = Order;\n}\n\nconst curve_arrays::curve_value curve_arrays::evaluate(const k3d::double_t U) const\n{\n\tcurve_arrays tmp;\n\tcurve_copier tmp_copier(*this, tmp);\n\tcurve_value result;\n\tconst k3d::uint_t point_count = points.size();\n\tif(U <= knots.front())\n\t{\n\t\ttmp_copier.push_back(0);\n\t}\n\telse if(U >= knots.back())\n\t{\n\t\ttmp_copier.push_back(point_count - 1);\n\t}\n\telse\n\t{\n\t\tk3d::mesh::knots_t bases;\n\t\tbasis_functions(bases, knots, order, U);\n\t\tconst k3d::uint_t knot_idx = std::find_if(knots.begin(), knots.end(), find_first_knot_after(U)) - knots.begin();\n\t\tconst k3d::uint_t first_point = knot_idx != knots.size() ? knot_idx - order : knot_idx - (2*order);\n\t\tstd::vector<k3d::uint_t> indices;\n\t\tfor(k3d::uint_t i = 0; i != order; ++i)\n\t\t{\n\t\t\tindices.push_back(first_point+i);\n\t\t}\n\t\ttmp_copier.push_back(order, &indices[0], &bases[0]);\n\t}\n\tresult.point_attributes = tmp.point_attributes.clone_types();\n\tresult.vertex_attributes = tmp.vertex_attributes.clone_types();\n\tk3d::table_copier point_attribute_copier(tmp.point_attributes, result.point_attributes);\n\tk3d::table_copier vertex_attribute_copier(tmp.vertex_attributes, result.vertex_attributes);\n\t// \"unweight\" attributes\n\tconst k3d::uint_t point_idx = 0;\n\tconst k3d::double_t weight = 1/result.weight();\n\tpoint_attribute_copier.push_back(1, &point_idx, &weight);\n\tvertex_attribute_copier.push_back(1, &point_idx, &weight);\n\tresult.weighted_position = tmp.points.back();\n\treturn result;\n}\n\nconst k3d::vector3 curve_arrays::tangent(const k3d::double_t U, const k3d::double_t DeltaU) const\n{\n\tconst k3d::double_t u = U > (1.0 - DeltaU) ? U - DeltaU : U;\n  curve_value v1 = evaluate(u);\n  curve_value v2 = evaluate(u + DeltaU);\n\treturn k3d::normalize(v2.position() - v1.position());\n}\n\nvoid curve_arrays::points3(k3d::mesh::points_t& Points) const\n{\n\tconst k3d::uint_t point_count = points.size();\n\tfor(k3d::uint_t i = 0; i != point_count; ++i)\n\t{\n\t\tconst k3d::point4& p = points[i];\n\t\tconst k3d::double_t w = p[3];\n\t\tPoints.push_back(k3d::point3(p[0]/w, p[1]/w, p[2]/w));\n\t}\n}\n\nvoid curve_arrays::weights(k3d::mesh::weights_t& Weights) const\n{\n\tconst k3d::uint_t point_count = points.size();\n\tfor(k3d::uint_t i = 0; i != point_count; ++i)\n\t\tWeights.push_back(points[i][3]);\n}\n\nvoid curve_arrays::append(const curve_arrays& Other)\n{\n\treturn_if_fail(Other.validate());\n\tif(points.empty())\n\t{\n\t\torder = Other.order;\n\t}\n\telse\n\t{\n\t\treturn_if_fail(order == Other.order);\n\t}\n\tconst k3d::uint_t other_point_count = Other.points.size();\n\tcurve_copier copier(Other, *this);\n\tfor(k3d::uint_t i = (knots.empty() ? 0 : 1); i != other_point_count; ++i)\n\t\tcopier.push_back(i);\n\tconst k3d::uint_t knots_begin = knots.size() ? order : 0;\n\tconst k3d::uint_t knots_end = knots_begin + other_point_count + (knots.size() ? 0 : order);\n\tk3d::double_t knot_offset = knots.size() ? knots.back() - Other.knots.front() : 0;\n\tif(!knots.empty())\n\t\tknots.pop_back();\n\tfor(k3d::uint_t knot = knots_begin; knot != knots_end; ++knot)\n\t\tknots.push_back(Other.knots[knot] + knot_offset);\n}\n\n////////////////////////\n\n////////////// curve_copier ////////////\ncurve_copier::curve_copier(const curve_arrays& Source, curve_arrays& Destination) : m_source(Source), m_destination(Destination)\n{\n\tconst k3d::uint_t destination_size = m_destination.points.size();\n\tif(m_destination.point_attributes.empty())\n\t{\n\t\tm_destination.point_attributes = m_source.point_attributes.clone_types();\n\t\tm_destination.point_attributes.set_row_count(destination_size);\n\t}\n\tm_point_attribute_copier.reset(new k3d::table_copier(m_source.point_attributes, m_destination.point_attributes));\n\tif(m_destination.vertex_attributes.empty())\n\t{\n\t\tm_destination.vertex_attributes = m_source.vertex_attributes.clone_types();\n\t\tm_destination.vertex_attributes.set_row_count(destination_size);\n\t}\n\tm_vertex_attribute_copier.reset(new k3d::table_copier(m_source.vertex_attributes, m_destination.vertex_attributes));\n\tif(m_destination.curve_attributes.empty())\n\t{\n\t\tm_destination.curve_attributes = m_source.curve_attributes.clone_types();\n\t\tif(m_source.curve_attributes.row_count())\n\t\t{\n\t\t\tk3d::table_copier curve_attrib_copier(m_source.curve_attributes, m_destination.curve_attributes);\n\t\t\tcurve_attrib_copier.push_back(0);\n\t\t}\n\t}\n\tif(m_destination.parameter_attributes.empty())\n\t{\n\t\tm_destination.parameter_attributes = m_source.parameter_attributes.clone_types();\n\t\tif(m_source.parameter_attributes.row_count() == 2)\n\t\t{\n\t\t\tk3d::table_copier parameter_attrib_copier(m_source.parameter_attributes, m_destination.parameter_attributes);\n\t\t\tparameter_attrib_copier.push_back(0);\n\t\t\tparameter_attrib_copier.push_back(1);\n\t\t}\n\t}\n}\n\nvoid curve_copier::push_back(const k3d::uint_t Index)\n{\n\tm_destination.points.push_back(m_source.points[Index]);\n\tm_point_attribute_copier->push_back(Index);\n\tm_vertex_attribute_copier->push_back(Index);\n}\n\nvoid curve_copier::push_back(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights)\n{\n\tm_destination.points.push_back(k3d::point4(0,0,0,0));\n\tfor(k3d::uint_t i = 0; i != Count; ++i)\n\t{\n\t\tm_destination.points.back() += k3d::to_vector(m_source.points[Indices[i]] * Weights[i]);\n\t}\n\tm_point_attribute_copier->push_back(Count, Indices, Weights);\n\tm_vertex_attribute_copier->push_back(Count, Indices, Weights);\n}\n\nvoid curve_copier::copy(const k3d::uint_t SourceIndex, const k3d::uint_t TargetIndex)\n{\n\tm_destination.points[TargetIndex] = m_source.points[SourceIndex];\n\tm_point_attribute_copier->copy(SourceIndex, TargetIndex);\n\tm_vertex_attribute_copier->copy(SourceIndex, TargetIndex);\n}\n\nvoid curve_copier::copy(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights, const k3d::uint_t TargetIndex)\n{\n\tk3d::point4 result(0,0,0,0);\n\tfor(k3d::uint_t i = 0; i != Count; ++i)\n\t{\n\t\tresult += k3d::to_vector(m_source.points[Indices[i]] * Weights[i]);\n\t}\n\tm_destination.points[TargetIndex] = result;\n\tm_point_attribute_copier->copy(Count, Indices, Weights, TargetIndex);\n\tm_vertex_attribute_copier->copy(Count, Indices, Weights, TargetIndex);\n}\n\n//////////////////////////////////////\n\nvoid replace_duplicate_points(k3d::mesh& Mesh, const k3d::mesh::primitives_t::iterator Begin, const k3d::mesh::primitives_t::iterator End)\n{\n\tk3d::mesh clone;\n\tclone.points = Mesh.points;\n\tclone.point_selection = Mesh.point_selection;\n\tclone.point_attributes = Mesh.point_attributes;\n\tclone.primitives.insert(clone.primitives.end(), Begin, End);\n\treplace_duplicate_points(clone);\n\tstd::copy(clone.primitives.begin(), clone.primitives.end(), Begin);\n}\n\nvoid replace_duplicate_points(k3d::mesh& Mesh)\n{\n\t// Create a mapping between duplicate points and their replacement\n\tk3d::mesh::indices_t point_map;\n\tdetail::lookup_duplicate_points(*Mesh.points, point_map, detail::inf_norm());\n\tk3d::mesh::remap_points(Mesh, point_map);\n}\n\nvoid copy_curve(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Curve)\n{\n\tcurve_arrays input_arrays(InputMesh, InputCurves, Curve);\n\tinput_arrays.add_curve(OutputMesh, OutputCurves);\n\tOutputCurves.material = InputCurves.material;\n\tOutputCurves.curve_selections.back() = InputCurves.curve_selections[Curve];\n}\n\nvoid update_indices(k3d::mesh::indices_t& Indices, const k3d::uint_t Start, const k3d::int32_t Offset)\n{\n\tfor(k3d::uint_t i = 0; i != Indices.size(); ++i)\n\t{\n\t\tif(Indices[i] >= Start)\n\t\t\tIndices[i] += Offset;\n\t}\n}\n\n// Remove the item at Index\ntemplate<typename ArrayT>\nvoid erase(ArrayT& Array, const k3d::uint_t Index)\n{\n\treturn_if_fail(Index < Array.size());\n\tArray.erase(Array.begin() + Index);\n}\n\nvoid delete_curve(k3d::nurbs_curve::primitive& Curves, const k3d::uint_t Curve)\n{\n\tconst k3d::uint_t curve_count = Curves.curve_first_points.size();\n\n\tk3d::table curve_attributes = Curves.curve_attributes.clone_types();\n\tk3d::table_copier uniform_copier(Curves.curve_attributes, curve_attributes);\n\tfor(k3d::uint_t i = 0; i != Curve; ++i)\n\t\tuniform_copier.push_back(i);\n\tfor(k3d::uint_t i = Curve + 1; i != curve_count; ++i)\n\t\tuniform_copier.push_back(i);\n\tk3d::table parameter_attributes = Curves.parameter_attributes.clone_types();\n\tk3d::table_copier parameter_copier(Curves.parameter_attributes, parameter_attributes);\n\tk3d::uint_t curve_start_index = Curves.curve_first_points[Curve];\n\tk3d::uint_t curve_end_index = curve_start_index + Curves.curve_point_counts[Curve];\n\tfor(k3d::uint_t i = 0; i != curve_start_index; ++i)\n\t\tparameter_copier.push_back(i);\n\tfor(k3d::uint_t i = curve_end_index; i != Curves.curve_points.size(); ++i)\n\t\tparameter_copier.push_back(i);\n\n\treturn_if_fail(Curve < curve_count);\n\t// Erase point indices and weights\n\tk3d::mesh::indices_t::iterator points_begin = Curves.curve_points.begin() + Curves.curve_first_points[Curve];\n\tk3d::mesh::indices_t::iterator points_end = points_begin + Curves.curve_point_counts[Curve];\n\tCurves.curve_points.erase(points_begin, points_end);\n\tupdate_indices(Curves.curve_first_points, Curves.curve_first_points[Curve] + Curves.curve_point_counts[Curve], -Curves.curve_point_counts[Curve]);\n\tk3d::mesh::weights_t::iterator weights_begin = Curves.curve_point_weights.begin() + Curves.curve_first_points[Curve];\n\tk3d::mesh::weights_t::iterator weights_end = weights_begin + Curves.curve_point_counts[Curve];\n\tCurves.curve_point_weights.erase(weights_begin, weights_end);\n\t// Erase knots\n\tk3d::mesh::knots_t::iterator knots_begin = Curves.curve_knots.begin() + Curves.curve_first_knots[Curve];\n\tk3d::mesh::knots_t::iterator knots_end = knots_begin + Curves.curve_point_counts[Curve] + Curves.curve_orders[Curve];\n\tCurves.curve_knots.erase(knots_begin, knots_end);\n\tupdate_indices(Curves.curve_first_knots, Curves.curve_first_knots[Curve] + Curves.curve_point_counts[Curve] + Curves.curve_orders[Curve], -(Curves.curve_point_counts[Curve] + Curves.curve_orders[Curve]));\n\n\terase(Curves.curve_first_knots, Curve);\n\terase(Curves.curve_first_points, Curve);\n\terase(Curves.curve_orders, Curve);\n\terase(Curves.curve_point_counts, Curve);\n\terase(Curves.curve_selections, Curve);\n}\n\nvoid normalize_knot_vector(k3d::nurbs_curve::primitive& NurbsCurve, const k3d::uint_t Curve)\n{\n\tk3d::mesh::knots_t::iterator curve_knots_begin = NurbsCurve.curve_knots.begin() + NurbsCurve.curve_first_knots[Curve];\n\tk3d::mesh::knots_t::iterator curve_knots_end = curve_knots_begin + NurbsCurve.curve_point_counts[Curve] + NurbsCurve.curve_orders[Curve];\n\n\tk3d::double_t min = *curve_knots_begin;\n\tk3d::double_t max = *(curve_knots_end - 1);\n\n\tstd::transform(curve_knots_begin, curve_knots_end, curve_knots_begin, knot_normalizer(min, max));\n}\n\nvoid normalize_knot_vector(k3d::mesh::knots_t& Knots)\n{\n\tstd::transform(Knots.begin(), Knots.end(), Knots.begin(), knot_normalizer(Knots.front(), Knots.back()));\n}\n\nvoid close_curve(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Curve, const k3d::bool_t keep_ends)\n{\n\t/*\n\t\t\t- get both end points\n\t\t\tif(keep_ends)\n\t\t\t\t\t. add the middle of the points as new one and use the old ends as CV\n\t\t\telse . replace them by their arithmetical middle\n\t*/\n\n\t// Weights and indices for the middle of the endpoints\n\tconst k3d::uint_t point_count = InputCurves.curve_point_counts[Curve];\n\tconst k3d::uint_t indices[] = {0, point_count - 1};\n\tconst k3d::double_t weights[] = {0.5, 0.5};\n\n\tif (!keep_ends)\n\t{\n\t\t// New end points become the arithmetic mean of the old points\n\t\tcurve_arrays curve(InputMesh, InputCurves, Curve);\n\t\tcurve_copier copier(curve, curve);\n\t\tcopier.copy(2, indices, weights, 0);\n\t\tcopier.copy(2, indices, weights, point_count - 1);\n\t\tcurve.add_curve(OutputMesh, OutputCurves);\n\t}\n\telse\n\t{\n\t\tconst curve_arrays input_curve(InputMesh, InputCurves, Curve, true);\n\t\tcurve_arrays output_curve;\n\t\tcurve_copier input_copier(input_curve, output_curve);\n\t\toutput_curve.order = input_curve.order;\n\t\tconst k3d::uint_t point_count = input_curve.points.size();\n\t\t//take the first knot different from 0 and the last one different from 1.0, double the\n\t\tk3d::uint_t first = 0;\n\t\tconst k3d::uint_t knots_end = input_curve.knots.size();\n\n    while (first < knots_end && input_curve.knots[first] == 0.0)\n\t\t{\n\t\t\tfirst++;\n\t\t}\n\n\t\tk3d::uint_t last = knots_end - 1;\n\n\t\twhile (input_curve.knots[last] == 1.0 && last != 0)\n\t\t{\n\t\t\tlast--;\n\t\t}\n\n\t\toutput_curve.knots = input_curve.knots;\n\t\t//insert knot at the end\n\t\tdouble diff = 1.0 - input_curve.knots[last];\n\n\t\tfor (k3d::uint_t i = last + 1; i < knots_end; i++)\n\t\t\toutput_curve.knots[i] += diff;\n\n\t\t//insert knot at the beginning\n\t\tdiff = input_curve.knots[first];\n\n\t\tfor (int i = first - 1; i >= 0; i--)\n\t\t{\n\t\t\toutput_curve.knots[i] -= diff;\n\t\t}\n\n\t\tk3d::mesh::knots_t::iterator last_iter = output_curve.knots.begin() + last + 1;\n\t\toutput_curve.knots.insert(last_iter, 1.0);\n\t\tk3d::mesh::knots_t::iterator first_iter = output_curve.knots.begin() + first;\n\t\toutput_curve.knots.insert(first_iter, 0.0);\n\n\t\t//insert point indices to the new point\n\t\tinput_copier.push_back(2, indices, weights); // First point becomes the midpoint\n\t\tfor(k3d::uint_t i = 0; i != point_count; ++i) // Copy the original points\n\t\t\tinput_copier.push_back(i);\n\t\tinput_copier.push_back(2, indices, weights); // Last point is also the aveerage of the old endpoints\n\n\t\tnormalize_knot_vector(output_curve.knots);\n\t\toutput_curve.add_curve(OutputMesh, OutputCurves);\n\t}\n}\n\nconst k3d::uint_t factorial(const k3d::uint_t n)\n{\n\tif (n == 0) return 1;\n\tif (n < 3) return n;\n\treturn factorial(n -1)*n;\n}\n\nconst k3d::double_t binomial_coefficient(const k3d::uint_t n, const k3d::uint_t k)\n{\n\treturn_val_if_fail(n >= k, 0.0);\n\tk3d::double_t result = factorial(n);\n\tresult /= factorial(k) * factorial(n - k);\n\treturn result;\n}\n\nvoid fill_bezalfs(std::vector<std::vector<double> >& bezalfs, int power, int t)\n{\n\tint ph = power + t;\n\tint ph2 = ph / 2;\n\n\tbezalfs[0][0] = 1.0;\n\tbezalfs[ph][power] = 1.0;\n\n\tfor (int i = 1; i <= ph2; i++)\n\t{\n\t\tdouble inv = 1.0 / binomial_coefficient(ph, i);\n\t\tint mpi = std::min(power, i);\n\t\tfor (int j = std::max(0, i - t); j <= mpi; j++)\n\t\t{\n\t\t\tbezalfs[i][j] = inv * binomial_coefficient(power, j) * binomial_coefficient(t, i - j);\n\t\t}\n\t}\n\n\tfor (int i = ph2 + 1; i <= ph - 1; i++)\n\t{\n\t\tint mpi = std::min(power, i);\n\t\tfor (int j = std::max(0, i - t); j <= mpi; j++)\n\t\t{\n\t\t\tbezalfs[i][j] = bezalfs[ph - i][power - j];\n\t\t}\n\t}\n}\n\n/// Helper function to make a homogeneous point out of a point3\nconst k3d::point4 homogeneous(const k3d::point3& p, const k3d::double_t w)\n{\n\treturn k3d::point4(k3d::point4(p[0]*w, p[1]*w, p[2]*w, w));\n}\n\nvoid log_points(const curve_arrays::points4_t& Points)\n{\n\tfor(k3d::uint_t i = 0; i != Points.size(); ++i)\n\t{\n\t\tconst k3d::point4& p = Points[i];\n\t\tk3d::log() << \"  \" << p[0] << \", \" << p[1] << \", \" << p[2] << \", \" << p[3] << std::endl;\n\t}\n}\n\nvoid elevate_curve_degree(curve_arrays& Curve, const k3d::uint_t Elevations)\n{\n\tfor(k3d::uint_t level = 0; level != Elevations; ++level)\n\t{\n\t\tconst int t = 1;\n\t\tint power = Curve.order - 1;\n\t\tconst k3d::uint_t nr_points = Curve.points.size();\n\n\t\tstd::vector<std::vector<double> > bezalfs(power + t + 1, std::vector<double>(power + 1, 1.0));\n\t\tcurve_arrays bpts(power + 1, Curve.order);\n\t\tcurve_arrays ebpts(power + t + 1, Curve.order);\n\t\tcurve_arrays next_bpts(power - 1, Curve.order);\n\n\t\tcurve_copier bpts_input_copier(Curve, bpts);\n\t\tcurve_copier bpts_self_copier(bpts, bpts);\n\t\tcurve_copier next_bpts_bpts_copier(bpts, next_bpts);\n\t\tcurve_copier bpts_next_copier(next_bpts, bpts);\n\t\tcurve_copier ebpts_bpts_copier(bpts, ebpts);\n\t\tcurve_copier ebpts_self_copier(ebpts, ebpts);\n\n\t\tstd::vector<double> alphas(power - 1, 0.0);\n\n\t\tcurve_arrays new_curve(2*(nr_points + t), Curve.order + 1);\n\t\tnew_curve.knots.assign(2*(nr_points + Curve.order + t), 0.0);\n\n\t\tcurve_copier new_point_input_copier(Curve, new_curve);\n\t\tcurve_copier new_point_self_copier(new_curve, new_curve);\n\t\tcurve_copier new_point_ebpts_copier(ebpts, new_curve);\n\n\t\tfill_bezalfs(bezalfs, power, t);\n\n\t\tint m = nr_points + power;\n\t\tint mh = power + t;\n\t\tint kind = mh + 1;\n\t\tint r = -1;\n\t\tint a = power;\n\t\tint b = Curve.order;\n\t\tint cind = 1;\n\t\tdouble ua = Curve.knots.front();\n\n\t\tnew_point_input_copier.copy(0, 0);\n\n\t\tfor (int i = 0; i <= power + t; i++)\n\t\t\tnew_curve.knots.push_back(ua);\n\n\t\t//initialize first bezier segment\n\t\tfor (int i = 0; i <= power; i++)\n\t\t{\n\t\t\tbpts_input_copier.copy(i, i);\n\t\t}\n\n\t\twhile (b < m)//big loop through knot vector\n\t\t{\n\t\t\tint i = b;\n\t\t\twhile (b < m && fabs(Curve.knots[b] - Curve.knots[b + 1]) < 0.00001)\n\t\t\t\tb++;\n\t\t\tint mul = b - i + 1;\n\t\t\tmh = mh + mul + t;\n\t\t\tdouble ub = Curve.knots[b];\n\t\t\tint oldr = r;\n\t\t\tr = power - mul;\n\t\t\t//insert knot ub r times\n\t\t\tint lbz, rbz;\n\t\t\tif (oldr > 0)\n\t\t\t\tlbz = (oldr + 2) / 2;\n\t\t\telse\n\t\t\t\tlbz = 1;\n\n\t\t\tif (r > 0)\n\t\t\t\trbz = power + t - ((r + 1) / 2);\n\t\t\telse\n\t\t\t\trbz = power + t;\n\n\t\t\tif (r > 0)\n\t\t\t{\n\t\t\t\t//insert knot to get bezier segment\n\t\t\t\tdouble numer = ub - ua;\n\t\t\t\tfor (int k = power; k > mul; k--)\n\t\t\t\t{\n\t\t\t\t\talphas[k - mul - 1] = numer / (Curve.knots[a + k] - ua);\n\t\t\t\t}\n\t\t\t\tfor (int j = 1; j <= r; j++)\n\t\t\t\t{\n\t\t\t\t\tint save = r - j;\n\t\t\t\t\tint s = mul + j;\n\t\t\t\t\tfor (int k = power; k >= s; k--)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::double_t weights[] = {alphas[k - s], (1.0 - alphas[k - s])};\n\t\t\t\t\t\tk3d::uint_t indices[] = {static_cast<k3d::uint_t>(k), static_cast<k3d::uint_t>(k-1)};\n\t\t\t\t\t\tbpts_self_copier.copy(2, indices, weights, k);\n\t\t\t\t\t}\n\t\t\t\t\tnext_bpts_bpts_copier.copy(power, save);\n\t\t\t\t}\n\t\t\t}//end of \"insert knot\"\n\t\t\t//degree elevate bezier\n\t\t\tfor (int i = lbz; i <= power + t; i++)\n\t\t\t{\n\t\t\t\t//only points lbz, ... , power+t are used here\n\t\t\t\tint mpi = std::min(power, i);\n\t\t\t\tstd::vector<k3d::uint_t> indices;\n\t\t\t\tstd::vector<k3d::double_t> weights;\n\t\t\t\tfor (int j = std::max(0, i - t); j <= mpi; j++)\n\t\t\t\t{\n\t\t\t\t\tindices.push_back(j);\n\t\t\t\t\tweights.push_back(bezalfs[i][j]);\n\t\t\t\t}\n\t\t\t\tebpts_bpts_copier.copy(indices.size(), &indices[0], &weights[0], i);\n\t\t\t}\n\n\t\t\tif (oldr > 1)\n\t\t\t{\n\t\t\t\t//must remove knot ua oldr times\n\t\t\t\tint first = kind - 2;\n\t\t\t\tint last = kind;\n\t\t\t\tdouble den = ub - ua;\n\t\t\t\tdouble bet = (ub - new_curve.knots[kind - 1]) / den;\n\t\t\t\t//knot removal loop\n\t\t\t\tfor (int tr = 1; tr < oldr; tr++)\n\t\t\t\t{\n\t\t\t\t\tint i = first;\n\t\t\t\t\tint j = last;\n\t\t\t\t\tint kj = j - kind + 1;\n\t\t\t\t\twhile (j - i > tr)//loop and compute the new control points for one removal step\n\t\t\t\t\t{\n\t\t\t\t\t\tif (i < cind)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdouble alf = (ub - new_curve.knots[i]) / (ua - new_curve.knots[i]);\n\t\t\t\t\t\t\tk3d::uint_t indices[] = {static_cast<k3d::uint_t>(i), static_cast<k3d::uint_t>(i-1)};\n\t\t\t\t\t\t\tk3d::double_t weights[] = {alf, (1.0 - alf)};\n\t\t\t\t\t\t\tnew_point_self_copier.copy(2, indices, weights, i);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (j >= lbz)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (j - tr <= kind - power - t + oldr)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdouble gam = (ub - new_curve.knots[j - tr]) / den;\n\t\t\t\t\t\t\t\tk3d::uint_t indices[] = {static_cast<k3d::uint_t>(kj), static_cast<k3d::uint_t>(kj+1)};\n\t\t\t\t\t\t\t\tk3d::double_t weights[] = {gam, 1.0-gam};\n\t\t\t\t\t\t\t\tebpts_self_copier.copy(2, indices, weights, kj);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::uint_t indices[] = {static_cast<k3d::uint_t>(kj), static_cast<k3d::uint_t>(kj+1)};\n\t\t\t\t\t\t\t\tk3d::double_t weights[] = {bet, 1.0-bet};\n\t\t\t\t\t\t\t\tebpts_self_copier.copy(2, indices, weights, kj);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tj--;\n\t\t\t\t\t\tkj--;\n\t\t\t\t\t}\n\t\t\t\t\tfirst--;\n\t\t\t\t\tlast++;\n\t\t\t\t}\n\t\t\t}//end of removing knot ua\n\t\t\tif (a != power)\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < power + t - oldr; i++)\n\t\t\t\t{\n\t\t\t\t\tnew_curve.knots[kind] = ua;\n\t\t\t\t\tkind++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int j = lbz; j <= rbz; j++)\n\t\t\t{\n\t\t\t\tnew_point_ebpts_copier.copy(j, cind);\n\t\t\t\tcind++;\n\t\t\t}\n\n\t\t\tif (b < m)\n\t\t\t{\n\t\t\t\tfor (int j = 0; j < r; j++)\n\t\t\t\t{\n\t\t\t\t\tbpts_next_copier.copy(j, j);\n\t\t\t\t}\n\t\t\t\tfor (int j = r; j <= power; j++)\n\t\t\t\t{\n\t\t\t\t\tbpts_input_copier.copy(b - power + j, j);\n\t\t\t\t}\n\t\t\t\ta = b;\n\t\t\t\tb++;\n\t\t\t\tua = ub;\n\t\t\t}\n\t\t\telse//end knot\n\t\t\t{\n\t\t\t\tfor (int i = 0; i <= power + t; i++)\n\t\t\t\t{\n\t\t\t\t\tnew_curve.knots[kind + i] = ub;\n\t\t\t\t}\n\t\t\t}\n\t\t}//end while loop (b < m)\n\n\t\tconst k3d::uint_t new_n = mh - power - t;\n\t\tnew_point_input_copier.copy(Curve.points.size()-1, new_n - 1);\n\t\tnew_curve.resize(new_n, Curve.order + t);\n\t\tCurve = new_curve;\n\t}\n}\n\nvoid elevate_curve_degree(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Curve, const k3d::uint_t Elevations)\n{\n\tcurve_arrays input_curve(InputMesh, InputCurves, Curve);\n\televate_curve_degree(input_curve, Elevations);\n\tinput_curve.add_curve(OutputMesh, OutputCurves);\n}\n\nvoid flip_curve(k3d::nurbs_curve::primitive& NurbsCurves, const k3d::uint_t curve)\n{\n\tconst k3d::uint_t curve_point_begin = NurbsCurves.curve_first_points[curve];\n\tconst k3d::uint_t curve_point_end = curve_point_begin + NurbsCurves.curve_point_counts[curve];\n\n\tk3d::uint_t curve_knots_begin = NurbsCurves.curve_first_knots[curve];\n\tk3d::uint_t curve_knots_end = curve_knots_begin + NurbsCurves.curve_point_counts[curve] + NurbsCurves.curve_orders[curve];\n\tk3d::mesh::knots_t::iterator curve_knots_begin_it = NurbsCurves.curve_knots.begin() + curve_knots_begin;\n\tk3d::mesh::knots_t::iterator curve_knots_end_it = NurbsCurves.curve_knots.begin() + curve_knots_end;\n\tconst k3d::double_t max_knot = NurbsCurves.curve_knots[curve_knots_end-1];\n\tfor(k3d::uint_t i = curve_knots_begin; i != curve_knots_end; ++i) NurbsCurves.curve_knots[i] = max_knot - NurbsCurves.curve_knots[i];\n\tstd::reverse(curve_knots_begin_it, curve_knots_end_it);\n\n\t//flip point indices\n\tk3d::mesh::indices_t::iterator curve_points_begin_iter = NurbsCurves.curve_points.begin() + curve_point_begin;\n\tk3d::mesh::indices_t::iterator curve_points_end_iter = NurbsCurves.curve_points.begin() + curve_point_end;\n\tstd::reverse(curve_points_begin_iter, curve_points_end_iter);\n\n\t//flip weights\n\tk3d::mesh::weights_t::iterator point_weights_begin_iter = NurbsCurves.curve_point_weights.begin() + curve_point_begin;\n\tk3d::mesh::weights_t::iterator point_weights_end_iter = NurbsCurves.curve_point_weights.begin() + curve_point_end;\n\tstd::reverse(point_weights_begin_iter, point_weights_end_iter);\n}\n\nvoid flip_curve(curve_arrays& Curve)\n{\n\tcurve_arrays result;\n\tresult.order = Curve.order;\n\tresult.knots = Curve.knots;\n\n\tconst k3d::double_t max_knot = result.knots.back();\n\tfor(k3d::uint_t i = 0; i != result.knots.size(); ++i) result.knots[i] = max_knot - result.knots[i];\n\tstd::reverse(result.knots.begin(), result.knots.end());\n\n\tcurve_copier copier(Curve, result);\n\tconst k3d::uint_t point_count = Curve.points.size();\n\tfor(k3d::uint_t i = 0; i != point_count; ++i)\n\t\tcopier.push_back(point_count - 1 - i);\n\n\tCurve = result;\n}\n\nvoid connect_curves(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::uint_t Primitive1Index, const k3d::uint_t Curve1Index, const k3d::bool_t Curve1FirstPointSelection, const k3d::uint_t Primitive2Index, const k3d::uint_t Curve2Index, const k3d::bool_t Curve2FirstPointSelection)\n{\n\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> curves_prim1(k3d::nurbs_curve::validate(InputMesh, *InputMesh.primitives[Primitive1Index]));\n\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> curves_prim2(k3d::nurbs_curve::validate(InputMesh, *InputMesh.primitives[Primitive2Index]));\n\n\tcurve_arrays curve1(InputMesh, *curves_prim1, Curve1Index);\n\tcurve_arrays curve2(InputMesh, *curves_prim2, Curve2Index);\n\n\tif(curve1.order < curve2.order)\n\t{\n\t\televate_curve_degree(curve1, curve2.order - curve1.order);\n\t}\n\telse\n\t{\n\t\televate_curve_degree(curve2, curve1.order - curve2.order);\n\t}\n\n\tif(Curve1FirstPointSelection)\n\t\tflip_curve(curve1);\n\tif(!Curve2FirstPointSelection)\n\t\tflip_curve(curve2);\n\n\tnormalize_knot_vector(curve1.knots);\n\tnormalize_knot_vector(curve2.knots);\n\n\tcurve_arrays new_curve;\n\tcurve_copier copier1(curve1, new_curve);\n\tcurve_copier copier2(curve2, new_curve);\n\tnew_curve.order = curve1.order; // both orders are equal now\n\n\tfor(k3d::uint_t point_idx = 0; point_idx != curve1.points.size(); ++point_idx)\n\t{\n\t\tcopier1.push_back(point_idx);\n\t}\n\tfor(k3d::uint_t point_idx = 0; point_idx != curve2.points.size(); ++point_idx)\n\t{\n\t\tcopier2.push_back(point_idx);\n\t}\n\n\tfor(k3d::uint_t i = 0; i != curve1.points.size(); ++i)\n\t{\n\t\tnew_curve.knots.push_back(curve1.knots[i]);\n\t}\n\tconst k3d::uint_t knots2_begin = new_curve.order;\n\tconst k3d::double_t step = (1 + curve2.knots[knots2_begin] - new_curve.knots.back()) / (new_curve.order + 1);\n\tfor(k3d::uint_t i = 0; i != new_curve.order; ++i)\n\t\tnew_curve.knots.push_back(new_curve.knots.back() + step);\n\tfor(k3d::uint_t i = 0; i != curve2.points.size(); ++i)\n\t\tnew_curve.knots.push_back(1 + curve2.knots[knots2_begin + i]);\n\n\tnew_curve.add_curve(OutputMesh, OutputCurves);\n}\n\nvoid merge_connected_curves(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::uint_t InputCurvesPrimIdx)\n{\n\t// make sure all curves are at the same order, and store them in a temporary mesh\n\tk3d::mesh temp_mesh;\n\ttemp_mesh.points.create();\n\ttemp_mesh.point_selection.create();\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> temp_curves(k3d::nurbs_curve::create(temp_mesh));\n\tk3d::uint_t max_order = 0;\n\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> input_curves(k3d::nurbs_curve::validate(InputMesh, *InputMesh.primitives[InputCurvesPrimIdx]));\n\tconst k3d::uint_t curve_count = input_curves->curve_first_points.size();\n\ttemp_curves->material.push_back(input_curves->material.back());\n\tfor(k3d::uint_t curve = 0; curve != curve_count; ++curve)\n\t{\n\t\tconst k3d::uint_t order = input_curves->curve_orders[curve];\n\t\tmax_order = order > max_order ? order : max_order;\n\t}\n\tfor(k3d::uint_t curve = 0; curve != curve_count; ++curve)\n\t{\n\t\tconst k3d::uint_t order = input_curves->curve_orders[curve];\n\t\televate_curve_degree(temp_mesh, *temp_curves, InputMesh, *input_curves, curve, max_order - order);\n\t}\n\ttemp_curves->material = input_curves->material;\n\treplace_duplicate_points(temp_mesh);\n\n\t// Get the first and last point of every curve\n\tk3d::mesh::indices_t first_points, last_points;\n\tfor(k3d::uint_t curve = 0; curve != curve_count; ++curve)\n\t{\n\t\tconst k3d::uint_t first_idx = temp_curves->curve_first_points[curve];\n\t\tconst k3d::uint_t last_idx = first_idx + temp_curves->curve_point_counts[curve] - 1;\n\t\tfirst_points.push_back(temp_curves->curve_points[first_idx]);\n\t\tlast_points.push_back(temp_curves->curve_points[last_idx]);\n\t}\n\n\t// Find out how many curves share first and last points\n\tconst k3d::uint_t point_count = temp_mesh.points->size();\n\tk3d::mesh::counts_t first_valences(point_count);\n\tk3d::mesh::counts_t last_valences(point_count);\n\tk3d::mesh::bools_t connection_points(point_count);\n\tfor(k3d::uint_t point = 0; point != point_count; ++point)\n\t{\n\t\tfirst_valences[point] = std::count(first_points.begin(), first_points.end(), point);\n\t\tlast_valences[point] = std::count(last_points.begin(), last_points.end(), point);\n\t\tconnection_points[point] = (first_valences[point] + last_valences[point]) == 2;\n\t}\n\n\t// Flip curves in case two curves start or end at the same point\n\tk3d::mesh::bools_t flipped_curves(curve_count, 0);\n\tk3d::mesh::indices_t first_point_curves(point_count, 0); // Maps a first point index to its curve\n\tk3d::mesh::indices_t last_point_curves(point_count, 0); // Maps a last point index to its curve\n\tk3d::bool_t need_fix = true;\n\twhile(need_fix)\n\t{\n\t\tfor(k3d::uint_t curve = 0; curve != curve_count; ++curve)\n\t\t{\n\t\t\tconst k3d::uint_t first_point = first_points[curve];\n\t\t\tconst k3d::uint_t last_point = last_points[curve];\n\t\t\tif(!flipped_curves[curve] && connection_points[first_point] && first_valences[first_point] == 2)\n\t\t\t{\n\t\t\t\tflip_curve(*temp_curves, curve);\n\t\t\t\tflipped_curves[curve] = true;\n\t\t\t\tfirst_points[curve] = last_points[curve];\n\t\t\t\tlast_points[curve] = first_point;\n\t\t\t\tfirst_valences[first_point]--;\n\t\t\t\tfirst_valences[last_point]++;\n\t\t\t\tlast_valences[last_point]--;\n\t\t\t\tlast_valences[first_point]++;\n\t\t\t}\n\t\t\tfirst_point_curves[first_points[curve]] = curve;\n\t\t\tlast_point_curves[last_points[curve]] = curve;\n\t\t}\n\t\tneed_fix = false;\n\t\tfor(k3d::uint_t i = 0; i != first_valences.size(); ++i)\n\t\t{\n\t\t\tif(first_valences[i] == 2 && connection_points[i])\n\t\t\t\tneed_fix = true;\n\t\t}\n\t}\n\n\t// Follow connected curves and join them into single curves\n\tk3d::mesh::bools_t added_curves(curve_count, false);\n\tfor(k3d::uint_t checked_curve = 0; checked_curve != curve_count; ++checked_curve)\n\t{\n\t\tif(added_curves[checked_curve])\n\t\t\tcontinue;\n\t\tcurve_arrays merged_curve;\n\n\t\t// Find the first curve in this sequence\n\t\tk3d::uint_t first_curve;\n\t\tfor(first_curve = checked_curve; ;)\n\t\t{\n\t\t\tif(!connection_points[first_points[first_curve]])\n\t\t\t\tbreak;\n\n\t\t\tfirst_curve = last_point_curves[first_points[first_curve]];\n\t\t\tif(first_curve == checked_curve)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_temp_curves(k3d::nurbs_curve::validate(temp_mesh, *temp_mesh.primitives.back()));\n\t\t// Now append all curves in the sequence to the merged curve\n\t\tfor(k3d::uint_t curve = first_curve; ;)\n\t\t{\n\t\t\tcurve_arrays tmp_curve(temp_mesh, *const_temp_curves, curve);\n\t\t\tmerged_curve.append(tmp_curve);\n\t\t\tadded_curves[curve] = true;\n\n\t\t\tif(!connection_points[last_points[curve]])\n\t\t\t\tbreak;\n\n\t\t\tcurve = first_point_curves[last_points[curve]];\n\t\t\tif(curve == first_curve)\n\t\t\t\tbreak;\n\t\t}\n\t\tmerged_curve.add_curve(OutputMesh, OutputCurves);\n\t\tOutputCurves.curve_selections.back() = 1.0;\n\t}\n\tif(OutputCurves.material.empty())\n\t\tOutputCurves.material.push_back(input_curves->material.back());\n\n}\n\n/// Predicate to find knot multiplicity\nstruct find_knot_multiplicity\n{\n\tfind_knot_multiplicity(const k3d::double_t KnotValue) : knot_value(KnotValue) {}\n\tk3d::bool_t operator()(const k3d::double_t TestKnot)\n\t{\n\t\treturn std::abs(TestKnot - knot_value) < 0.000001;\n\t}\n\tconst k3d::double_t knot_value;\n};\n\nconst k3d::uint_t multiplicity(const k3d::mesh::knots_t& Knots, const k3d::double_t u, const k3d::uint_t Begin, const k3d::uint_t Count)\n{\n\tk3d::mesh::knots_t::const_iterator begin = Knots.begin() + Begin;\n\tk3d::mesh::knots_t::const_iterator end = begin + Count;\n\treturn std::count_if(begin, end, find_knot_multiplicity(u));\n}\n\n/// Helper function to enable consecutive knot insertions\n/**\n    Implementation of Algorithm \"CurveKnotInsertion\" from\n    \"The NURBS book\", page 151, by Piegl and Tiller\n**/\nvoid insert_knot(curve_arrays& Curve, const k3d::double_t u, const k3d::uint_t r)\n{\n\tcurve_arrays result;\n\tresult.order = Curve.order;\n\tconst k3d::uint_t nr_points = Curve.points.size();\n\tnormalize_knot_vector(Curve.knots);\n\n\tk3d::mesh::knots_t::iterator knot_u = std::find_if(Curve.knots.begin(), Curve.knots.end(), find_first_knot_after(u));\n\tconst k3d::uint_t s = std::count_if(Curve.knots.begin(), Curve.knots.end(), find_knot_multiplicity(u));\n\n\t//we found the first knot greater than u or we're at the end so thats our k now\n\tint k = knot_u - Curve.knots.begin() - 1;\n\n\tif(s + r > Curve.order - 1)\n\t{\n\t\tk3d::log() << error << \"insert_knot: No knot inserted: target multiplicity \" << s + r << \" for knot \" << u << \" exceeds curve degree \" << Curve.order-1 << std::endl;\n\t\treturn;\n\t}\n\n\t//*******************************************************************\n\t//Algorithm from \"The NURBS book\" page 151\n\t//*******************************************************************\n\n\tk3d::uint_t mp = Curve.knots.size();\n\tk3d::uint_t nq = nr_points + r;\n\n\tresult.knots.insert(result.knots.end(), Curve.knots.begin(), knot_u);\n\tfor (k3d::uint_t i = 1; i <= r; i++)\n\t{\n\t\tresult.knots.push_back(u);\n\t}\n\tresult.knots.insert(result.knots.end(), knot_u, Curve.knots.end());\n\n\tcurve_copier result_input_copier(Curve, result);\n\tresult.resize(nq, result.order);\n\n\tfor (k3d::uint_t i = 0; i <= k + 1 - result.order; i++)\n\t{\n\t\tresult_input_copier.copy(i, i);\n\t}\n\n\tfor (k3d::uint_t i = k - s; i < nr_points; i++)\n\t{\n\t\tresult_input_copier.copy(i, i + r);\n\t}\n\n\tcurve_arrays tmp;\n\tcurve_copier tmp_input_copier(Curve, tmp);\n\tcurve_copier tmp_self_copier(tmp, tmp);\n\tcurve_copier result_tmp_copier(tmp, result);\n\tfor (k3d::uint_t i = 0; i <= Curve.order - 1 - s; i++)\n\t{\n\t\ttmp_input_copier.push_back(i + k - (Curve.order - 1));\n\t}\n\tk3d::uint_t L = 0;\n\n\tfor (k3d::uint_t j = 1; j <= r; j++)\n\t{\n\t\tL = k - (Curve.order - 1) + j;\n\t\tdouble alpha = 0.0;\n\t\tfor (k3d::uint_t i = 0; i <= Curve.order - 1 - j - s; i++)\n\t\t{\n\t\t\talpha = (u - Curve.knots[L + i]) / (Curve.knots[i + k + 1] - Curve.knots[L + i]);\n\t\t\tk3d::uint_t indices[] = {static_cast<k3d::uint_t>(i + 1), static_cast<k3d::uint_t>(i)};\n\t\t\tk3d::double_t weights[] = {alpha, 1.0 - alpha};\n\t\t\ttmp_self_copier.copy(2, indices, weights, i);\n\t\t}\n\t\tresult_tmp_copier.copy(0, L);\n\t\tresult_tmp_copier.copy(Curve.order - 1 - j - s, k + r - j - s);\n\t}\n\n\tfor (k3d::uint_t i = L + 1; i < k - s; i++)\n\t{\n\t\tresult_tmp_copier.copy(i - L, i);\n\t}\n\tCurve = result;\n}\n\nk3d::bool_t is_closed(const k3d::nurbs_curve::const_primitive& NurbsCurves, const k3d::uint_t Curve)\n{\n\tk3d::uint_t curve_points_begin = NurbsCurves.curve_first_points[Curve];\n\tk3d::uint_t curve_points_end = curve_points_begin + NurbsCurves.curve_point_counts[Curve];\n\n\treturn (NurbsCurves.curve_points[curve_points_begin] == NurbsCurves.curve_points[curve_points_end - 1]);\n}\n\nvoid split_curve(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, k3d::uint_t Curve, const k3d::double_t u)\n{\n\t// Can't split at end\n\tif(u > 1 - 0.000001 || u < 0.000001)\n\t{\n\t\tcopy_curve(OutputMesh, OutputCurves, InputMesh, InputCurves, Curve);\n\t\tif(OutputCurves.material.empty())\n\t\t\tOutputCurves.material.push_back(InputCurves.material.back());\n\t\treturn;\n\t}\n\n\t// Curve arrays for the original curve\n\tcurve_arrays input_curve(InputMesh, InputCurves, Curve, true);\n\n\t// insert new knots at the requested u-value until the curve interpolates it\n\tconst k3d::uint_t order = input_curve.order;\n\tconst k3d::uint_t mul = multiplicity(input_curve.knots, u, 0, input_curve.knots.size());\n\tif(mul < (order - 1))\n\t{\n\t\tinsert_knot(input_curve, u, order - mul - 1);\n\t}\n\t// locate the first knot after the u-value\n\tconst k3d::mesh::knots_t::iterator split_knot = std::find_if(input_curve.knots.begin(), input_curve.knots.end(), find_first_knot_after(u));\n\n\tif(is_closed(InputCurves, Curve))\n\t{\n\t\tcurve_arrays new_curve;\n\t\tnew_curve.order = input_curve.order;\n\t\tnew_curve.knots = input_curve.knots;\n\t\tcurve_copier copier(input_curve, new_curve);\n\t\tconst k3d::uint_t split_point = (split_knot - input_curve.knots.begin()) - order;\n\t\tconst k3d::uint_t points_end = input_curve.points.size();\n\t\tfor(k3d::uint_t i = split_point; i != points_end; ++i)\n\t\t\tcopier.push_back(i);\n\t\tfor(k3d::uint_t i = 1; i != split_point + 1; ++i)\n\t\t\tcopier.push_back(i);\n\n\t\tnew_curve.add_curve(OutputMesh, OutputCurves);\n\t}\n\telse\n\t{\n\t\t// First curve: all knots up to and including the last knot with multiplicity u\n\t\tcurve_arrays first_curve;\n\t\tfirst_curve.order = input_curve.order;\n\t\tcurve_copier first_copier(input_curve, first_curve);\n\n\t\tfirst_curve.knots.insert(first_curve.knots.begin(), input_curve.knots.begin(), split_knot);\n\t\tfirst_curve.knots.push_back(first_curve.knots.back()); // Clamp knot vector by increasing the multiplicity to become equal to the order\n\t\tconst k3d::uint_t points_end = first_curve.knots.size() - order;\n\t\tfor(k3d::uint_t i = 0; i != points_end; ++i)\n\t\t\tfirst_copier.push_back(i);\n\n\t\t// Second curve: start with order times the u-knot, then take all remaining knots\n\t\tcurve_arrays second_curve;\n\t\tsecond_curve.order = input_curve.order;\n\t\tcurve_copier second_copier(input_curve, second_curve);\n\n\t\tsecond_curve.knots.insert(second_curve.knots.end(), order, u);\n\t\tsecond_curve.knots.insert(second_curve.knots.end(), split_knot, input_curve.knots.end());\n\t\tconst k3d::uint_t points_begin = first_curve.knots.size() - order - 1;\n\t\tfor(k3d::uint_t i = points_begin; i != input_curve.points.size(); ++i)\n\t\t\tsecond_copier.push_back(i);\n\n\t\t// Parameter attributes need tweaking\n\t\tconst k3d::double_t param_weights[] = {u, 1.0-u};\n\t\tconst k3d::uint_t param_indices[] = {0, 1};\n\t\tfirst_curve.parameter_attributes = input_curve.parameter_attributes.clone_types();\n\t\tk3d::table_copier first_param_copier(input_curve.parameter_attributes, first_curve.parameter_attributes);\n\t\tfirst_param_copier.push_back(0);\n\t\tfirst_param_copier.push_back(2, param_indices, param_weights);\n\t\tsecond_curve.parameter_attributes = input_curve.parameter_attributes.clone_types();\n\t\tk3d::table_copier second_param_copier(input_curve.parameter_attributes, second_curve.parameter_attributes);\n\t\tsecond_param_copier.push_back(2, param_indices, param_weights);\n\t\tsecond_param_copier.push_back(1);\n\n\t\tfirst_curve.add_curve(OutputMesh, OutputCurves);\n\t\tsecond_curve.add_curve(OutputMesh, OutputCurves);\n\t}\n\tif(OutputCurves.material.empty())\n\t\tOutputCurves.material.push_back(InputCurves.material.back());\n}\n\nvoid insert_knot(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, k3d::uint_t Curve, const k3d::double_t u, const k3d::uint_t r)\n{\n\tcurve_arrays curve(InputMesh, InputCurves, Curve);\n\tinsert_knot(curve, u, r);\n\tcurve.add_curve(OutputMesh, OutputCurves);\n}\n\nvoid append_common_knot_vector(k3d::mesh::knots_t& CommonKnotVector, const k3d::nurbs_curve::const_primitive& NurbsCurves, const k3d::uint_t Curve)\n{\n\tk3d::mesh::knots_t::const_iterator knots_begin = NurbsCurves.curve_knots.begin() + NurbsCurves.curve_first_knots[Curve];\n\tk3d::mesh::knots_t::const_iterator knots_end = knots_begin + NurbsCurves.curve_point_counts[Curve] + NurbsCurves.curve_orders[Curve];\n\tk3d::mesh::knots_t normalized_knots(knots_end - knots_begin);\n\tstd::transform(knots_begin, knots_end, normalized_knots.begin(), knot_normalizer(*knots_begin, *(knots_end - 1)));\n\n\tfor(k3d::mesh::knots_t::iterator knot = normalized_knots.begin(); knot != normalized_knots.end();)\n\t{\n\t\tconst k3d::uint_t old_mul = std::count_if(CommonKnotVector.begin(), CommonKnotVector.end(), find_knot_multiplicity(*knot));\n\t\tconst k3d::uint_t new_mul = std::count_if(knot, normalized_knots.end(), find_knot_multiplicity(*knot));\n\t\tif(new_mul > old_mul)\n\t\t{\n\t\t\tk3d::mesh::knots_t::iterator insert_loc = std::find_if(CommonKnotVector.begin(), CommonKnotVector.end(), find_first_knot_after(*knot));\n\t\t\tCommonKnotVector.insert(insert_loc, new_mul - old_mul, *knot);\n\t\t}\n\t\tknot += new_mul;\n\t}\n}\n\nconst k3d::point3 centroid(const k3d::mesh::points_t& Points, const k3d::nurbs_curve::const_primitive& Curves, const k3d::uint_t Curve)\n{\n\tk3d::point3 result(0,0,0);\n\tconst k3d::uint_t points_begin = Curves.curve_first_points[Curve];\n\tconst k3d::uint_t points_end = points_begin + Curves.curve_point_counts[Curve];\n\tk3d::mesh::bools_t used_points(Points.size(), false);\n\tfor(k3d::uint_t point_idx = points_begin; point_idx != points_end; ++point_idx)\n\t{\n\t\tconst k3d::uint_t point = Curves.curve_points[point_idx];\n\t\tif(!used_points[point])\n\t\t\tresult += k3d::to_vector(Points[point]);\n\t\tused_points[point] = true;\n\t}\n\treturn result / (points_end - points_begin);\n}\n\nvoid delete_selected_curves(k3d::mesh& Mesh)\n{\n\tfor(k3d::uint_t prim_idx = 0; prim_idx != Mesh.primitives.size(); ++prim_idx)\n\t{\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curves(k3d::nurbs_curve::validate(Mesh, Mesh.primitives[prim_idx]));\n\t\tif(curves.get())\n\t\t{\n\t\t\tfor(k3d::uint_t curve = 0; ;)\n\t\t\t{\n\t\t\t\tif(curves->curve_selections[curve])\n\t\t\t\t\tdelete_curve(*curves, curve);\n\t\t\t\telse\n\t\t\t\t\t++curve;\n\t\t\t\tif(curve == curves->curve_selections.size())\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid straight_line(const k3d::point3& Start, const k3d::point3 End, const k3d::uint_t Segments, k3d::nurbs_curve::primitive& NurbsCurves, k3d::mesh& OutputMesh, const k3d::uint_t Order)\n{\n\tk3d::vector3 delta = (End - Start) / Segments;\n\n\tk3d::mesh::points_t points;\n\tfor (k3d::uint_t i = 0; i <= Segments; i++)\n\t{\n\t\tpoints.push_back(Start + delta * i);\n\t}\n\tadd_curve(OutputMesh, NurbsCurves, Order, points);\n}\n\nvoid basis_functions(k3d::mesh::knots_t& BasisFunctions, const k3d::mesh::knots_t& Knots, const k3d::uint_t Order, const k3d::double_t U)\n{\n\tBasisFunctions.assign(Order, 0.0);\n\tBasisFunctions[0] = 1;\n\tk3d::mesh::weights_t left(Order, 0.0);\n\tk3d::mesh::weights_t right(Order, 0.0);\n\n\tk3d::uint_t span = std::find_if(Knots.begin(), Knots.end(), find_first_knot_after(U)) - Knots.begin() - 1;\n\tif(span == (Knots.size() - 1))\n\t\tspan -= Order;\n\n\tfor (k3d::uint_t j = 1; j != Order; j++)\n\t{\n\t\tleft[j] = U - Knots[span + 1 - j];\n\t\tright[j] = Knots[span + j] - U;\n\n\t\tk3d::double_t saved = 0.0;\n\n\t\tfor (k3d::uint_t r = 0; r != j; r++)\n\t\t{\n\t\t\tk3d::double_t temp = BasisFunctions[r] / (right[r + 1] + left[j - r]);\n\t\t\tBasisFunctions[r] = saved + right[r + 1] * temp;\n\t\t\tsaved = left[j - r] * temp;\n\t\t}\n\t\tBasisFunctions[j] = saved;\n\t}\n}\n\n/// Replace the elements of Array with their cumulative sum\ntemplate<class ArrayT> void cumulative_sum(ArrayT& Array)\n{\n\tconst k3d::uint_t array_begin = 0;\n\tconst k3d::uint_t array_end = Array.size();\n\tfor(k3d::uint_t i = array_begin + 1; i != array_end; ++i)\n\t\tArray[i] += Array[i-1];\n}\n\nvoid approximate(k3d::mesh::points_t& Points, k3d::mesh::weights_t& Weights, const k3d::mesh::knots_t& SampleParameters, const points4_t& SamplePoints, const k3d::uint_t Order, const k3d::mesh::knots_t& Knots)\n{\n\tconst k3d::uint_t knot_count = Knots.size();\n\tconst k3d::uint_t dim = knot_count - Order; // The dimension of the problem to solve is equal to the number of control points of the final curve\n\tconst k3d::uint_t sample_count = SampleParameters.size();\n\n\tstd::vector<k3d::mesh::knots_t> sample_bases(sample_count); // Non-zero basis function values for each sample\n\tk3d::mesh::counts_t offsets; // Multiplicity of knots separating spans\n\tk3d::mesh::indices_t span_first_samples; // First sample point in a span between different knot values.\n\tk3d::mesh::counts_t span_sample_counts; // Number of samples in the given span.\n\tk3d::mesh::indices_t base_span_starts(Order, 0); // First span for each base\n\tk3d::mesh::indices_t base_span_ends; // Last span + 1 for each base\n\n\toffsets.push_back(0); // The multiplicity of the first knot is not counted\n\tspan_first_samples.push_back(0);\n\tk3d::uint_t next_knot_idx = Order;\n\tk3d::double_t next_knot_val = Knots[next_knot_idx];\n\tfor(k3d::uint_t i = 0; i != sample_count; ++i)\n\t{\n\t\tif(SampleParameters[i] > next_knot_val)\n\t\t{\n\t\t\tconst k3d::uint_t mul = multiplicity(Knots, next_knot_val, 0, knot_count);\n\t\t\toffsets.push_back(mul);\n\t\t\tfor(k3d::uint_t base = 0; base != mul; ++base)\n\t\t\t{\n\t\t\t\tbase_span_starts.push_back(span_first_samples.size());\n\t\t\t\tbase_span_ends.push_back(span_first_samples.size());\n\t\t\t}\n\t\t\tspan_sample_counts.push_back(i - span_first_samples.back());\n\t\t\tspan_first_samples.push_back(i);\n\t\t\tnext_knot_idx += mul;\n\t\t\tnext_knot_val = Knots[next_knot_idx];\n\t\t}\n\t\tbasis_functions(sample_bases[i], Knots, Order, SampleParameters[i]);\n\t}\n\tspan_sample_counts.push_back(sample_count - span_first_samples.back());\n\tbase_span_ends.resize(dim, span_sample_counts.size());\n\tcumulative_sum(offsets);\n\tublas::vector<k3d::double_t> rhs_x(dim);\n\tublas::vector<k3d::double_t> rhs_y(dim);\n\tublas::vector<k3d::double_t> rhs_z(dim);\n\tublas::vector<k3d::double_t> rhs_w(dim);\n\tublas::compressed_matrix<k3d::double_t> A(dim, dim, ((Order - 1)*2+1)*dim); // system matrix\n\n\t// Find out what control points would interpolate the curve\n\tk3d::mesh::bools_t interpolating_points(dim, false);\n\tpoints4_t interpolation_points(dim, k3d::point4(0,0,0,1)); // store the samples to interpolate through\n\tfor(k3d::uint_t knot_idx = 0; knot_idx != knot_count;)\n\t{\n\t\treturn_if_fail(knot_idx < knot_count);\n\t\tconst k3d::uint_t mul = multiplicity(Knots, Knots[knot_idx], 0, knot_count);\n\t\tif(mul >= (Order - 1))\n\t\t{\n\t\t\tconst k3d::double_t u = Knots[knot_idx];\n\t\t\tconst k3d::uint_t sample_idx = (std::find_if(SampleParameters.begin(), SampleParameters.end(), find_first_knot_after(u)) - SampleParameters.begin()) - 1;\n\t\t\treturn_if_fail(sample_idx < sample_count);\n\t\t\tknot_idx += mul;\n\t\t\tif(std::abs(SampleParameters[sample_idx] - u) < 0.00000001)\n\t\t\t{\n\t\t\t\tinterpolating_points[knot_idx - Order - (knot_idx - Order == dim)] = true;\n\t\t\t\tinterpolation_points[knot_idx - Order - (knot_idx - Order == dim)] = SamplePoints[sample_idx];\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t++knot_idx;\n\t\t}\n\t}\n\n\tfor(k3d::uint_t i = 0; i != dim; ++i)\n\t{\n\t\tif(interpolating_points[i])\n\t\t{\n\t\t\tA(i,i) = 1.0;\n\t\t\tconst k3d::point4& p = interpolation_points[i];\n\t\t\trhs_x(i) = p[0];\n\t\t\trhs_y(i) = p[1];\n\t\t\trhs_z(i) = p[2];\n\t\t\trhs_w(i) = p[3];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst k3d::uint_t spans_begin_i = base_span_starts[i];\n\t\t\tconst k3d::uint_t spans_end_i = base_span_ends[i];\n\t\t\tfor(k3d::uint_t j = 0; j != dim; ++j)\n\t\t\t{\n\t\t\t\tk3d::double_t result = 0.0;\n\t\t\t\tconst k3d::uint_t spans_begin = std::max(base_span_starts[j], spans_begin_i);\n\t\t\t\tconst k3d::uint_t spans_end = std::min(base_span_ends[j], spans_end_i);\n\t\t\t\tfor(k3d::uint_t span = spans_begin; span < spans_end; ++span)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t idx_i = i - offsets[span];\n\t\t\t\t\tconst k3d::uint_t idx_j = j - offsets[span];\n\t\t\t\t\tconst k3d::uint_t samples_begin = span_first_samples[span];\n\t\t\t\t\tconst k3d::uint_t samples_end = samples_begin + span_sample_counts[span];\n\t\t\t\t\tfor(k3d::uint_t sample = samples_begin; sample != samples_end; ++sample)\n\t\t\t\t\t\tresult += sample_bases[sample][idx_i] * sample_bases[sample][idx_j];\n\t\t\t\t}\n\t\t\t\tA(i,j) = result;\n\t\t\t}\n\n\t\t\tk3d::double_t result_x = 0.0;\n\t\t\tk3d::double_t result_y = 0.0;\n\t\t\tk3d::double_t result_z = 0.0;\n\t\t\tk3d::double_t result_w = 0.0;\n\t\t\tfor(k3d::uint_t span = spans_begin_i; span < spans_end_i; ++span)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t idx = i - offsets[span];\n\t\t\t\tconst k3d::uint_t samples_begin = span_first_samples[span];\n\t\t\t\tconst k3d::uint_t samples_end = samples_begin + span_sample_counts[span];\n\t\t\t\tfor(k3d::uint_t sample = samples_begin; sample != samples_end; ++sample)\n\t\t\t\t{\n\t\t\t\t\tresult_x += sample_bases[sample][idx] * SamplePoints[sample][0];\n\t\t\t\t\tresult_y += sample_bases[sample][idx] * SamplePoints[sample][1];\n\t\t\t\t\tresult_z += sample_bases[sample][idx] * SamplePoints[sample][2];\n\t\t\t\t\tresult_w += sample_bases[sample][idx] * SamplePoints[sample][3];\n\t\t\t\t}\n\t\t\t}\n\t\t\trhs_x(i) = result_x;\n\t\t\trhs_y(i) = result_y;\n\t\t\trhs_z(i) = result_z;\n\t\t\trhs_w(i) = result_w;\n\t\t}\n\t}\n\n\t// This solves the system, overwriting the RHS with the solution\n\ttry\n\t{\n\t\tublas::permutation_matrix<k3d::double_t> PM(dim);\n\t\tublas::lu_factorize(A, PM);\n\t\tublas::lu_substitute(A, PM, rhs_x);\n\t\tublas::lu_substitute(A, PM, rhs_y);\n\t\tublas::lu_substitute(A, PM, rhs_z);\n\t\tublas::lu_substitute(A, PM, rhs_w);\n\n\t\t// Store the solution in the output arrays\n\t\tPoints.clear();\n\t\tWeights.clear();\n\t\tfor(k3d::uint_t i = 0; i != dim; ++i)\n\t\t{\n\t\t\tconst k3d::double_t w = rhs_w(i);\n\t\t\tPoints.push_back(k3d::point3(rhs_x(i)/w, rhs_y(i)/w, rhs_z(i)/w));\n\t\t\tWeights.push_back(w);\n\t\t}\n\t}\n\tcatch(std::exception& E)\n\t{\n\t\tk3d::log() << error << \"error solving system: \" << E.what() << std::endl;\n\t\tk3d::log() << error << \"matrix: \" << A << std::endl;\n\t}\n}\n\nvoid polygonize(k3d::mesh& OutputMesh, k3d::linear_curve::primitive& OutputCurve, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Curve, const k3d::uint_t Samples)\n{\n\tcurve_arrays curve(InputMesh, InputCurves, Curve, true);\n\tk3d::mesh::knots_t sample_u_vals;\n\tsample(sample_u_vals, curve.knots, Samples);\n\n\tif(OutputCurve.parameter_attributes.empty())\n\t{\n\t\tOutputCurve.parameter_attributes = curve.parameter_attributes.clone_types();\n\t\tOutputCurve.parameter_attributes.set_row_count(2*OutputCurve.curve_first_points.size());\n\t}\n\tk3d::table_copier parameter_copier(curve.parameter_attributes, OutputCurve.parameter_attributes);\n\tif(!curve.parameter_attributes.empty())\n\t{\n\t\tparameter_copier.push_back(0);\n\t\tparameter_copier.push_back(1);\n\t}\n\n\tif(OutputCurve.curve_attributes.empty())\n\t{\n\t\tOutputCurve.curve_attributes = curve.curve_attributes.clone_types();\n\t\tOutputCurve.curve_attributes.set_row_count(2*OutputCurve.curve_first_points.size());\n\t}\n\tk3d::table_copier curve_copier(curve.curve_attributes, OutputCurve.curve_attributes);\n\tif(!curve.curve_attributes.empty()) curve_copier.push_back(0);\n\n\tOutputCurve.periodic.push_back(false);\n\tOutputCurve.material = InputCurves.material;\n\tOutputCurve.curve_first_points.push_back(OutputCurve.curve_points.size());\n\tOutputCurve.curve_point_counts.push_back(0);\n\tOutputCurve.curve_selections.push_back(InputCurves.curve_selections[Curve]);\n\n\tif(OutputMesh.point_attributes.empty())\n\t\tOutputMesh.point_attributes = curve.point_attributes.clone_types();\n\tif(OutputCurve.vertex_attributes.empty())\n\t\tOutputCurve.vertex_attributes = curve.vertex_attributes.clone_types();\n\n\tk3d::mesh::points_t& points = OutputMesh.points.writable();\n\tconst k3d::uint_t samples_end = sample_u_vals.size();\n\tfor(k3d::uint_t i = 0; i != samples_end; ++i)\n\t{\n\t\tcurve_arrays::curve_value val = curve.evaluate(sample_u_vals[i]);\n\t\tOutputCurve.curve_points.push_back(points.size());\n\t\tOutputCurve.curve_point_counts.back()++;\n\t\tpoints.push_back(val.position());\n\n\t\tk3d::table_copier point_copier(val.point_attributes, OutputMesh.point_attributes);\n\t\tpoint_copier.push_back(0);\n\t\tk3d::table_copier vertex_copier(val.vertex_attributes, OutputCurve.vertex_attributes);\n\t\tvertex_copier.push_back(0);\n\t}\n\tOutputMesh.point_selection.writable().resize(points.size(), 1.0);\n}\n\nvoid sample(k3d::mesh::knots_t& Samples, const k3d::mesh::knots_t& Knots, const k3d::uint_t SampleCount)\n{\n\tk3d::mesh::knots_t unique_knots;\n\tconst k3d::uint_t knots_end = Knots.size();\n\tfor(k3d::uint_t i = 0; i < knots_end;)\n\t{\n\t\tconst k3d::double_t u = Knots[i];\n\t\tunique_knots.push_back(u);\n\t\ti += multiplicity(Knots, u, i, knots_end);\n\t}\n\n\tconst k3d::uint_t unique_knots_end = unique_knots.size() - 1;\n\tfor(k3d::uint_t i = 0; i != unique_knots_end; ++i)\n\t{\n\t\tconst k3d::double_t start_u = unique_knots[i];\n\t\tconst k3d::double_t step = (unique_knots[i+1] - start_u) / static_cast<k3d::double_t>(SampleCount + 1);\n\t\tSamples.push_back(start_u);\n\t\tfor(k3d::uint_t sample = 1; sample < (SampleCount+1); ++sample)\n\t\t{\n\t\t\tSamples.push_back(start_u + static_cast<k3d::double_t>(sample) * step);\n\t\t}\n\t}\n\tSamples.push_back(unique_knots.back());\n}\n\n} //namespace nurbs\n\n} //namespace module\n"
  },
  {
    "path": "modules/nurbs/nurbs_curves.h",
    "content": "#ifndef MODULES_NURBS_NURBS_CURVES_H\n#define MODULES_NURBS_NURBS_CURVES_H\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/types.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n#include <stdexcept>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\n/// Storage for an array of 4D points\ntypedef k3d::typed_array<k3d::point4> points4_t;\n\n/// Convenient storage for all components and attributes of a single curve\n/**\n * Points are represented in homogeneous coordinates, with the 4th coordinate being the weight.\n * If a single point is referenced more than once by the curve, it is duplicated in this representation,\n * so vertex and point attributes both have the same size.\n */\nstruct curve_arrays\n{\n\ttypedef std::vector<k3d::point4> points4_t;\n\tpoints4_t points;\n\tk3d::mesh::knots_t knots;\n\tk3d::table point_attributes;\n\tk3d::table curve_attributes;\n\tk3d::table parameter_attributes;\n\tk3d::table vertex_attributes;\n\tk3d::uint_t order;\n\n\t/// Encapsulates the complete evaluation of position, weight and attributes for a certain parameter value\n\tstruct curve_value\n\t{\n\t\t/// Homogeneous position\n\t\tk3d::point4 weighted_position;\n\t\tk3d::table point_attributes;\n\t\tk3d::table vertex_attributes;\n\n\t\tinline const k3d::double_t weight() const\n\t\t{\n\t\t\treturn weighted_position[3];\n\t\t}\n\n\t\tinline const k3d::point3 position() const\n\t\t{\n\t\t\tconst k3d::double_t w = weight();\n\t\t\treturn k3d::point3(weighted_position[0]/w, weighted_position[1]/w, weighted_position[2]/w);\n\t\t}\n\t};\n\n\tcurve_arrays() {}\n\n\t/// Sets up arrays with the given number of control points and order, leaving the knot vector empty\n\tcurve_arrays(const k3d::uint_t PointCount, const k3d::uint_t Order);\n\n\t/// Extract attributes and components from the given mesh and curve\n\tcurve_arrays(const k3d::mesh& Mesh, const k3d::nurbs_curve::const_primitive& Primitive, const k3d::uint_t Curve, const k3d::bool_t NormalizeKnots = false);\n\n\t/// Verifies correct array lengths\n\tconst k3d::bool_t validate() const;\n\n\t/// Adds the represented curve to a mesh\n\tvoid add_curve(k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Primitive);\n\n\t/// Resize all arrays, ensuring knot length = Size+Order\n\tvoid resize(const k3d::uint_t Size, const k3d::uint_t Order);\n\n\t/// Evaluate the curve at parameter value U\n\tconst curve_value evaluate(const k3d::double_t U) const;\n\n\t/// Normalized tangent at the given parameter value\n\tconst k3d::vector3 tangent(const k3d::double_t U, const k3d::double_t DeltaU = 0.00001) const;\n\n\t/// 3D point coordinates\n\tvoid points3(k3d::mesh::points_t& Points) const;\n\n\t/// Extract the weights\n\tvoid weights(k3d::mesh::weights_t& Weights) const;\n\n\t/// Append another curve\n\tvoid append(const curve_arrays& Other);\n};\n\n/// Copy structure and attributes between curves\n/**\n * Convenient copying class that treats points, point attributes and vertex attributes in one go.\n */\nclass curve_copier\n{\npublic:\n\tcurve_copier(const curve_arrays& Source, curve_arrays& Destination);\n\n\t/// Appends the given index value from each source array to each corresponding target array.\n\tvoid push_back(const k3d::uint_t Index);\n\t/// Computes a weighted sum of N values from each source array and appends the result to the corresponding target array.\n\tvoid push_back(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights);\n\t/// Copies the given source index value from each source array to the TargetIndex in each corresponding target array.\n\tvoid copy(const k3d::uint_t SourceIndex, const k3d::uint_t TargetIndex);\n\t/// Computes a weighted sum of N values from each source array and copies the result to the corresponding target array at the given TargetIndex.\n\tvoid copy(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights, const k3d::uint_t TargetIndex);\n\nprivate:\n\tconst curve_arrays& m_source;\n\tcurve_arrays& m_destination;\n\tboost::scoped_ptr<k3d::table_copier> m_point_attribute_copier;\n\tboost::scoped_ptr<k3d::table_copier> m_vertex_attribute_copier;\n};\n\n/// Copies a curve from one primitive to another\nvoid copy_curve(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Curve);\n\n/// Deletes a curve\nvoid delete_curve(k3d::nurbs_curve::primitive& Curves, const k3d::uint_t Curve);\n\n/// Normalizes the knot vector of the given curve number in the given NURBS curve primitive\nvoid normalize_knot_vector(k3d::nurbs_curve::primitive& NurbsCurve, const k3d::uint_t Curve);\n\n///Replace a point on the curve with a new one (by changing the index)\n/**\\param newIndex the index of the point which shall be used from now on\n * \\param curve The curve we're operating on\n * \\param point The index of the point which shall be replaced\n * \\param continuous If this is set to true, the curve's knot vector is changed so that the curve intersects the point\n **/\nvoid replace_point(k3d::nurbs_curve::primitive& NurbsCurve, k3d::uint_t newIndex, k3d::uint_t curve, k3d::uint_t point, bool continuous);\n\n/// Replace duplicate point indices in the mesh\nvoid replace_duplicate_points(k3d::mesh& Mesh);\n\n/// Only affects the given range of primitives\nvoid replace_duplicate_points(k3d::mesh& Mesh, const k3d::mesh::primitives_t::iterator Begin, const k3d::mesh::primitives_t::iterator End);\n\n///Close the selected curve either by adding a new point or by replacing the former end points by their average\n/** \\param curve The curve to close\n *  \\param keep_ends If this is true then we're going to add a new point, otherwise the old end points get discarded\n **/\nvoid close_curve(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Curve, const k3d::bool_t keep_ends);\n\n/// Elevate the degree of the curves listed in Curves, storing the resulting mesh in OutputMesh and OutputCurves\nvoid elevate_curve_degree(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Curve, const k3d::uint_t Elevations = 1);\n\n/// Flips a curve in the given mesh\nvoid flip_curve(k3d::nurbs_curve::primitive& NurbsCurves, const k3d::uint_t curve);\n\n/// Connect the two input curves at their selected end points, storing the result in Output\nvoid connect_curves(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::uint_t Primitive1Index, const k3d::uint_t Curve1Index, const k3d::bool_t Curve1FirstPointSelection, const k3d::uint_t Primitive2Index, const k3d::uint_t Curve2Index, const k3d::bool_t Curve2FirstPointSelection);\n\n/// Merge all input curves into one curve, if their endpoints are identical\nvoid merge_connected_curves(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::uint_t InputCurvesPrimIdx);\n\n///Insert a knot into a curve, makes use of the algorithm in \"The NURBS book\" by A. Piegl and W. Tiller\n/**\n * \\param Curve The curve\n * \\param u The u-value where to insert the knot\n * \\param r The multiplicity of the new knot\n */\nvoid insert_knot(curve_arrays& Curve, const k3d::double_t u, const k3d::uint_t r);\n\n/// Knot insertion for a mesh\nvoid insert_knot(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, k3d::uint_t Curve, const k3d::double_t u, const k3d::uint_t r);\n\n/// Splits a curve at the given u parameter value\nvoid split_curve(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, k3d::uint_t Curve, const k3d::double_t u);\n\n/// Returns the multiplicity of the given curve\n/**\n * \\param Knots a collection of knot vectors\n * \\param Begin The first knot of the knot vector to consider\n * \\param Count The number of knots to consider\n */\nconst k3d::uint_t multiplicity(const k3d::mesh::knots_t& Knots, const k3d::double_t u, const k3d::uint_t Begin, const k3d::uint_t Count);\n\n/// Appends new knots found in the given curve to the given output knot vector.\nvoid append_common_knot_vector(k3d::mesh::knots_t& CommonKnotVector, const k3d::nurbs_curve::const_primitive& NurbsCurves, const k3d::uint_t Curve);\n\n/// Find the centroid of all points in a curve\nconst k3d::point3 centroid(const k3d::mesh::points_t& Points, const k3d::nurbs_curve::const_primitive& Curves, const k3d::uint_t Curve);\n\n/// Deletes all selected curves from the mesh\nvoid delete_selected_curves(k3d::mesh& Mesh);\n\n/// Adds a straight line to the given NURBS curve set. New points are added to the OutputMesh\nvoid straight_line(const k3d::point3& Start, const k3d::point3 End, const k3d::uint_t Segments, k3d::nurbs_curve::primitive& NurbsCurves, k3d::mesh& OutputMesh, const k3d::uint_t Order = 2);\n\n/// True if the given curve is closed\nk3d::bool_t is_closed(const k3d::nurbs_curve::const_primitive& NurbsCurves, const k3d::uint_t Curve);\n\n/// Calculate the non-zero values of the B-spline basis functions at the given parameter value\nvoid basis_functions(k3d::mesh::knots_t& BasisFunctions, const k3d::mesh::knots_t& Knots, const k3d::uint_t Order, const k3d::double_t U);\n\n/// Least squares approximation of the given sample points.\nvoid approximate(k3d::mesh::points_t& Points, k3d::mesh::weights_t& Weights, const k3d::mesh::knots_t& SampleParameters, const points4_t& SamplePoints, const k3d::uint_t Order, const k3d::mesh::knots_t& Knots);\n\n/// Polygonize a curve\nvoid polygonize(k3d::mesh& OutputMesh, k3d::linear_curve::primitive& OutputCurve, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Curve, const k3d::uint_t Samples);\n\n/// Samples the supplied knot value SampleCount + 1 times on each interval between unique knots\nvoid sample(k3d::mesh::knots_t& Samples, const k3d::mesh::knots_t& Knots, const k3d::uint_t SampleCount);\n\n} //namespace nurbs\n\n} //namespace module\n\n#endif // !MODULES_NURBS_NURBS_CURVES_H\n"
  },
  {
    "path": "modules/nurbs/nurbs_patches.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n  \\author Carsten Haubold (CarstenHaubold@web.de)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/table_copier.h>\n\n#include <cmath>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\n//////////////////////\n// patch_point_data\n\npatch_point_data::patch_point_data(const k3d::mesh& Mesh, const k3d::nurbs_patch::const_primitive& Primitive, const k3d::uint_t Patch)\n{\n\tconst k3d::uint_t points_begin = Primitive.patch_first_points[Patch];\n\tconst k3d::uint_t points_end = Primitive.patch_u_point_counts[Patch] * Primitive.patch_v_point_counts[Patch];\n\tpoint_attributes = Mesh.point_attributes.clone_types();\n\tvertex_attributes = Primitive.vertex_attributes.clone(points_begin, points_end);\n\tk3d::table_copier point_attribute_copier(Mesh.point_attributes, point_attributes);\n\tfor(k3d::uint_t point_idx = points_begin; point_idx != points_end; ++point_idx)\n\t{\n\t\tpoints.push_back(Mesh.points->at(Primitive.patch_points[point_idx]));\n\t\tpoint_attribute_copier.push_back(Primitive.patch_points[point_idx]);\n\t\tweights.push_back(Primitive.patch_point_weights[point_idx]);\n\t}\n}\n\npatch_point_data::patch_point_data(const k3d::uint_t Size) : points(Size), weights(Size)\n{\n\tpoint_attributes.set_row_count(Size);\n\tvertex_attributes.set_row_count(Size);\n}\n\nconst k3d::bool_t patch_point_data::validate() const\n{\n\treturn_val_if_fail(points.size() == weights.size(), false);\n\treturn_val_if_fail(point_attributes.empty() || point_attributes.row_count() == points.size(), false);\n\treturn_val_if_fail(vertex_attributes.empty() || vertex_attributes.row_count() == points.size(), false);\n\treturn true;\n}\n\n////////////////////////////\n// point_data_copier\n\npoint_data_copier::point_data_copier(const patch_point_data& Source, patch_point_data& Destination) : m_source(Source), m_destination(Destination)\n{\n\tconst k3d::uint_t destination_size = m_destination.points.size();\n\tif(m_destination.point_attributes.empty())\n\t{\n\t\tm_destination.point_attributes = m_source.point_attributes.clone_types();\n\t\tm_destination.point_attributes.set_row_count(destination_size);\n\t}\n\tm_point_attribute_copier.reset(new k3d::table_copier(m_source.point_attributes, m_destination.point_attributes));\n\tif(m_destination.vertex_attributes.empty())\n\t{\n\t\tm_destination.vertex_attributes = m_source.vertex_attributes.clone_types();\n\t\tm_destination.vertex_attributes.set_row_count(destination_size);\n\t}\n\tm_vertex_attribute_copier.reset(new k3d::table_copier(m_source.vertex_attributes, m_destination.vertex_attributes));\n}\n\nvoid point_data_copier::push_back(const k3d::uint_t Index)\n{\n\tm_destination.points.push_back(m_source.points[Index]);\n\tm_destination.weights.push_back(m_source.weights[Index]);\n\tm_point_attribute_copier->push_back(Index);\n\tm_vertex_attribute_copier->push_back(Index);\n}\n\nvoid point_data_copier::push_back(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights)\n{\n\tk3d::point3 p(0,0,0);\n\tk3d::double_t w = 0.0;\n\tfor(k3d::uint_t i = 0; i != Count; ++i)\n\t{\n\t\tp += k3d::to_vector(m_source.points[Indices[i]])*Weights[i];\n\t\tw += m_source.weights[Indices[i]]*Weights[i];\n\t}\n\tm_destination.points.push_back(p);\n\tm_destination.weights.push_back(w);\n\tm_point_attribute_copier->push_back(Count, Indices, Weights);\n\tm_vertex_attribute_copier->push_back(Count, Indices, Weights);\n}\n\nvoid point_data_copier::copy(const k3d::uint_t SourceIndex, const k3d::uint_t TargetIndex)\n{\n\tm_destination.points[TargetIndex] = m_source.points[SourceIndex];\n\tm_destination.weights[TargetIndex] = m_source.weights[SourceIndex];\n\tm_point_attribute_copier->copy(SourceIndex, TargetIndex);\n\tm_vertex_attribute_copier->copy(SourceIndex, TargetIndex);\n}\n\nvoid point_data_copier::copy(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights, const k3d::uint_t TargetIndex)\n{\n\tk3d::point3 p(0,0,0);\n\tk3d::double_t w = 0.0;\n\tfor(k3d::uint_t i = 0; i != Count; ++i)\n\t{\n\t\tp += k3d::to_vector(m_source.points[Indices[i]])*Weights[i];\n\t\tw += m_source.weights[Indices[i]]*Weights[i];\n\t}\n\tm_destination.points[TargetIndex] = p;\n\tm_destination.weights[TargetIndex] = w;\n\tm_point_attribute_copier->copy(Count, Indices, Weights, TargetIndex);\n\tm_vertex_attribute_copier->copy(Count, Indices, Weights, TargetIndex);\n}\n\n////////////////////////////\n// curve_point_data_copier\n\ncurve_point_data_copier::curve_point_data_copier(const curve_arrays& Source, patch_point_data& Destination) : m_source(Source), m_destination(Destination)\n{\n\tconst k3d::uint_t destination_size = m_destination.points.size();\n\tif(m_destination.point_attributes.empty())\n\t{\n\t\tm_destination.point_attributes = m_source.point_attributes.clone_types();\n\t\tm_destination.point_attributes.set_row_count(destination_size);\n\t}\n\tm_point_attribute_copier.reset(new k3d::table_copier(m_source.point_attributes, m_destination.point_attributes));\n\tif(m_destination.vertex_attributes.empty())\n\t{\n\t\tm_destination.vertex_attributes = m_source.vertex_attributes.clone_types();\n\t\tm_destination.vertex_attributes.set_row_count(destination_size);\n\t}\n\tm_vertex_attribute_copier.reset(new k3d::table_copier(m_source.vertex_attributes, m_destination.vertex_attributes));\n}\n\nvoid curve_point_data_copier::push_back(const k3d::uint_t Index)\n{\n\tm_destination.points.push_back(dehomogenize(m_source.points[Index]));\n\tconst k3d::double_t w = 1 / m_source.points[Index][3];\n\tm_destination.weights.push_back(m_source.points[Index][3]);\n\tm_point_attribute_copier->push_back(1, &Index, &w);\n\tm_vertex_attribute_copier->push_back(1, &Index, &w);\n}\n\nvoid curve_point_data_copier::push_back(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights)\n{\n\tk3d::point3 p(0,0,0);\n\tk3d::double_t w = 0.0;\n\tk3d::double_t* inverted_weights = new k3d::double_t[Count];\n\tfor(k3d::uint_t i = 0; i != Count; ++i)\n\t{\n\t\tp += k3d::to_vector(dehomogenize(m_source.points[Indices[i]]))*Weights[i];\n\t\tw += m_source.points[Indices[i]][3]*Weights[i];\n\t\tinverted_weights[i] = Weights[i]/m_source.points[Indices[i]][3]; // Make sure we 'unweight' the curve attributes\n\t}\n\n\tm_destination.points.push_back(p);\n\tm_destination.weights.push_back(w);\n\tm_point_attribute_copier->push_back(Count, Indices, inverted_weights);\n\tm_vertex_attribute_copier->push_back(Count, Indices, inverted_weights);\n}\n\nvoid curve_point_data_copier::copy(const k3d::uint_t SourceIndex, const k3d::uint_t TargetIndex)\n{\n\tm_destination.points[TargetIndex] = dehomogenize(m_source.points[SourceIndex]);\n\tm_destination.weights[TargetIndex] = m_source.points[SourceIndex][3];\n\tconst k3d::double_t w = 1/m_source.points[SourceIndex][3];\n\tm_point_attribute_copier->copy(1, &SourceIndex, &w, TargetIndex);\n\tm_vertex_attribute_copier->copy(1, &SourceIndex, &w, TargetIndex);\n}\n\nvoid curve_point_data_copier::copy(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights, const k3d::uint_t TargetIndex)\n{\n\tk3d::point3 p(0,0,0);\n\tk3d::double_t w = 0.0;\n\tk3d::double_t* inverted_weights = new k3d::double_t[Count];\n\tfor(k3d::uint_t i = 0; i != Count; ++i)\n\t{\n\t\tp += k3d::to_vector(dehomogenize(m_source.points[Indices[i]]))*Weights[i];\n\t\tw += m_source.points[Indices[i]][3]*Weights[i];\n\t\tinverted_weights[i] = Weights[i]/m_source.points[Indices[i]][3]; // Make sure we 'unweight' the curve attributes\n\t}\n\n\tm_destination.points[TargetIndex] = p;\n\tm_destination.weights[TargetIndex] = w;\n\tm_point_attribute_copier->copy(Count, Indices, inverted_weights, TargetIndex);\n\tm_vertex_attribute_copier->copy(Count, Indices, inverted_weights, TargetIndex);\n}\n\n///////////////////////////\n// patch_attribute_tables\n\npatch_attribute_tables::patch_attribute_tables(const k3d::nurbs_patch::const_primitive& Primitive, const k3d::uint_t Patch)\n{\n\tif(!Primitive.patch_attributes.empty())\n\t{\n\t\tpatch_attributes = Primitive.patch_attributes.clone(Patch, Patch+1);\n\t}\n\tif(!Primitive.parameter_attributes.empty())\n\t{\n\t\tparameter_attributes = Primitive.parameter_attributes.clone(4*Patch, 4*Patch+4);\n\t}\n}\n\n///////////////////////////\n\n\nvoid add_patch(k3d::mesh& Mesh,\n\t\tk3d::nurbs_patch::primitive& NurbsPatches,\n\t\tconst patch_point_data& PointData,\n\t\tconst k3d::mesh::knots_t& UKnots,\n\t\tconst k3d::mesh::knots_t& VKnots,\n\t\tconst k3d::uint_t UOrder,\n\t\tconst k3d::uint_t VOrder,\n\t\tconst k3d::table& PatchAttributes,\n\t\tconst k3d::table& ParameterAttributes)\n{\n\t// Sanity checking ...\n\treturn_if_fail(Mesh.points);\n\treturn_if_fail(Mesh.point_selection);\n\n\treturn_if_fail(PointData.validate());\n\n\treturn_if_fail(UOrder >= 2);\n\treturn_if_fail(VOrder >= 2);\n\n\tk3d::mesh::points_t& points = Mesh.points.writable();\n\tk3d::mesh::selection_t& point_selection = Mesh.point_selection.writable();\n\n\tNurbsPatches.patch_first_points.push_back(NurbsPatches.patch_points.size());\n\tconst k3d::uint_t point_count = PointData.points.size();\n\n\tif(Mesh.point_attributes.empty())\n\t{\n\t\tMesh.point_attributes = PointData.point_attributes.clone_types();\n\t\tMesh.point_attributes.set_row_count(Mesh.points->size());\n\t}\n\tk3d::table_copier point_copier(PointData.point_attributes, Mesh.point_attributes);\n\n\tif(NurbsPatches.vertex_attributes.empty())\n\t{\n\t\tNurbsPatches.vertex_attributes = PointData.vertex_attributes.clone_types();\n\t\tNurbsPatches.vertex_attributes.set_row_count(NurbsPatches.patch_points.size());\n\t}\n\tk3d::table_copier vertex_copier(PointData.vertex_attributes, NurbsPatches.vertex_attributes);\n\n\tfor(k3d::uint_t i = 0; i != point_count; ++i)\n\t{\n\t\tNurbsPatches.patch_points.push_back(points.size());\n\t\tpoints.push_back(PointData.points[i]);\n\t\tpoint_copier.push_back(i);\n\t\tvertex_copier.push_back(i);\n\t}\n\tpoint_selection.resize(points.size(), 0.0);\n\n\tNurbsPatches.patch_selections.push_back(0.0);\n\tNurbsPatches.patch_u_first_knots.push_back(NurbsPatches.patch_u_knots.size());\n\tNurbsPatches.patch_v_first_knots.push_back(NurbsPatches.patch_v_knots.size());\n\tNurbsPatches.patch_u_orders.push_back(UOrder);\n\tNurbsPatches.patch_v_orders.push_back(VOrder);\n\tNurbsPatches.patch_u_point_counts.push_back(UKnots.size() - UOrder);\n\tNurbsPatches.patch_v_point_counts.push_back(VKnots.size() - VOrder);\n\tNurbsPatches.patch_trim_loop_counts.push_back(0);\n\tNurbsPatches.patch_first_trim_loops.push_back(0);\n\tNurbsPatches.patch_point_weights.insert(NurbsPatches.patch_point_weights.end(), PointData.weights.begin(), PointData.weights.end());\n\tNurbsPatches.patch_u_knots.insert(NurbsPatches.patch_u_knots.end(), UKnots.begin(), UKnots.end());\n\tNurbsPatches.patch_v_knots.insert(NurbsPatches.patch_v_knots.end(), VKnots.begin(), VKnots.end());\n\n\tif(NurbsPatches.patch_attributes.empty())\n\t{\n\t\tNurbsPatches.patch_attributes = PatchAttributes.clone_types();\n\t\tNurbsPatches.patch_attributes.set_row_count(NurbsPatches.patch_first_points.size()-1);\n\t}\n\tk3d::table_copier(PatchAttributes, NurbsPatches.patch_attributes).push_back(0);\n\n\tif(NurbsPatches.parameter_attributes.empty())\n\t{\n\t\tNurbsPatches.parameter_attributes = ParameterAttributes.clone_types();\n\t\tNurbsPatches.parameter_attributes.set_row_count(4*(NurbsPatches.patch_first_points.size()-1));\n\t}\n\tk3d::table_copier param_copier(ParameterAttributes, NurbsPatches.parameter_attributes);\n\tparam_copier.push_back(0);\n\tparam_copier.push_back(1);\n\tparam_copier.push_back(2);\n\tparam_copier.push_back(3);\n}\n\nvoid copy_patch(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch)\n{\n\tconst k3d::uint_t u_order = InputPatches.patch_u_orders[Patch];\n\tconst k3d::uint_t v_order = InputPatches.patch_v_orders[Patch];\n\tconst k3d::uint_t u_point_count = InputPatches.patch_u_point_counts[Patch];\n\tconst k3d::uint_t v_point_count = InputPatches.patch_v_point_counts[Patch];\n\n\tpatch_point_data point_data(InputMesh, InputPatches, Patch);\n\tpatch_attribute_tables attributes(InputPatches, Patch);\n\n\tconst k3d::uint_t u_knots_begin = InputPatches.patch_u_first_knots[Patch];\n\tconst k3d::uint_t u_knots_end = u_knots_begin + u_order + u_point_count;\n\tk3d::mesh::knots_t u_knots(InputPatches.patch_u_knots.begin() + u_knots_begin, InputPatches.patch_u_knots.begin() + u_knots_end);\n\tconst k3d::uint_t v_knots_begin = InputPatches.patch_v_first_knots[Patch];\n\tconst k3d::uint_t v_knots_end = v_knots_begin + v_order + v_point_count;\n\tk3d::mesh::knots_t v_knots(InputPatches.patch_v_knots.begin() + v_knots_begin, InputPatches.patch_v_knots.begin() + v_knots_end);\n\tadd_patch(OutputMesh, OutputPatches, point_data, u_knots, v_knots, u_order, v_order, attributes.patch_attributes, attributes.parameter_attributes);\n\tOutputPatches.patch_materials.push_back(InputPatches.patch_materials[Patch]);\n\tOutputPatches.constant_attributes = InputPatches.constant_attributes.clone();\n}\n\nvoid add_trim_curve(k3d::nurbs_patch::primitive& OutputPatches, const k3d::uint_t Patch, const k3d::mesh::points_2d_t& Points, const k3d::mesh::weights_t& Weights, const k3d::mesh::knots_t& Knots, const k3d::uint_t Order, const k3d::double_t UOffset, const k3d::double_t VOffset, const k3d::double_t UScale, const k3d::double_t VScale)\n{\n\treturn_if_fail(Points.size() == Weights.size());\n\treturn_if_fail(Points.size() + Order == Knots.size());\n\tconst k3d::uint_t insert_idx = OutputPatches.patch_trim_loop_counts[Patch] == 0 ? OutputPatches.trim_loop_first_curves.size() : OutputPatches.patch_first_trim_loops[Patch] + OutputPatches.patch_trim_loop_counts[Patch];\n\tif(OutputPatches.patch_trim_loop_counts[Patch] == 0)\n\t{\n\t\tOutputPatches.patch_first_trim_loops[Patch] = OutputPatches.trim_loop_first_curves.size();\n\t}\n\tconst k3d::double_t umin = OutputPatches.patch_u_knots[OutputPatches.patch_u_first_knots[Patch]];\n\tconst k3d::double_t urange = OutputPatches.patch_u_knots[OutputPatches.patch_u_first_knots[Patch] + OutputPatches.patch_u_point_counts[Patch] + OutputPatches.patch_u_orders[Patch] - 1] - umin;\n\tconst k3d::double_t vmin = OutputPatches.patch_v_knots[OutputPatches.patch_v_first_knots[Patch]];\n\tconst k3d::double_t vrange = OutputPatches.patch_v_knots[OutputPatches.patch_v_first_knots[Patch] + OutputPatches.patch_v_point_counts[Patch] + OutputPatches.patch_v_orders[Patch] - 1] - vmin;\n\tOutputPatches.trim_loop_first_curves.insert(OutputPatches.trim_loop_first_curves.begin() + insert_idx, OutputPatches.curve_first_points.size());\n\tOutputPatches.trim_loop_curve_counts.insert(OutputPatches.trim_loop_curve_counts.begin() + insert_idx, 1);\n\tOutputPatches.trim_loop_selections.insert(OutputPatches.trim_loop_selections.begin() + insert_idx, 1.0);\n\tfor(k3d::uint_t patch = Patch + 1; patch != OutputPatches.patch_first_trim_loops.size(); ++patch)\n\t\t++OutputPatches.patch_first_trim_loops[patch];\n\tOutputPatches.curve_first_points.push_back(OutputPatches.curve_points.size());\n\tOutputPatches.curve_first_knots.push_back(OutputPatches.curve_knots.size());\n\tfor(k3d::uint_t i = 0; i != Points.size(); ++i)\n\t{\n\t\tOutputPatches.curve_points.push_back(OutputPatches.points.size());\n\t\tconst k3d::double_t u = (Points[i][0] * UScale) + UOffset;\n\t\tconst k3d::double_t v = (Points[i][1] * VScale) + VOffset;\n\t\tOutputPatches.points.push_back(k3d::point2(u * urange + umin, v * vrange + vmin));\n\t\tOutputPatches.curve_point_weights.push_back(Weights[i]);\n\t\tOutputPatches.point_selections.push_back(1.0);\n\t}\n\tOutputPatches.curve_point_counts.push_back(Points.size());\n\tfor(k3d::uint_t i = 0; i != Knots.size(); ++i)\n\t{\n\t\tOutputPatches.curve_knots.push_back(Knots[i]);\n\t}\n\tOutputPatches.curve_selections.push_back(1.0);\n\tOutputPatches.curve_orders.push_back(Order);\n\tOutputPatches.patch_trim_loop_counts[Patch]++;\n}\n\nvoid traverse_curve(const k3d::mesh& SourceCurves, const k3d::uint_t SourcePrimIdx, const k3d::mesh& CurvesToTraverse, k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches)\n{\n\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> source_curves(k3d::nurbs_curve::validate(SourceCurves, *SourceCurves.primitives[SourcePrimIdx]));\n\treturn_if_fail(source_curves);\n\n\tfor(k3d::mesh::primitives_t::const_iterator trav_primitive = CurvesToTraverse.primitives.begin(); trav_primitive != CurvesToTraverse.primitives.end(); ++trav_primitive)\n\t{\n\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> curves_to_traverse(k3d::nurbs_curve::validate(CurvesToTraverse, **trav_primitive));\n\t\tif(!curves_to_traverse)\n\t\t\tcontinue;\n\n\t\tconst k3d::uint_t source_curves_begin = 0;\n\t\tconst k3d::uint_t source_curves_end = source_curves->curve_first_knots.size();\n\t\tfor(k3d::uint_t source_curve = source_curves_begin; source_curve != source_curves_end; ++source_curve)\n\t\t{\n\t\t\tif(!source_curves->curve_selections[source_curve])\n\t\t\t\tcontinue;\n\n\t\t\tcurve_arrays source_curve_arrays(SourceCurves, *source_curves, source_curve);\n\n\t\t\tconst k3d::uint_t curves_to_traverse_begin = 0;\n\t\t\tconst k3d::uint_t curves_to_traverse_end = curves_to_traverse->curve_first_knots.size();\n\t\t\tfor(k3d::uint_t curve_to_traverse = curves_to_traverse_begin; curve_to_traverse != curves_to_traverse_end; ++curve_to_traverse)\n\t\t\t{\n\t\t\t\tif(!curves_to_traverse->curve_selections[curve_to_traverse])\n\t\t\t\t\tcontinue;\n\n\t\t\t\tcurve_arrays curve_to_traverse_arrays(CurvesToTraverse, *curves_to_traverse, curve_to_traverse);\n\n\t\t\t\t//move the 1st curve along the 2nd\n\t\t\t\tconst k3d::uint_t curve_points_begin[2] = {source_curves->curve_first_points[source_curve], curves_to_traverse->curve_first_points[curve_to_traverse]};\n\t\t\t\tconst k3d::uint_t curve_points_end[2] = { curve_points_begin[0] + source_curves->curve_point_counts[source_curve], curve_points_begin[1] + curves_to_traverse->curve_point_counts[curve_to_traverse] };\n\n\t\t\t\tpatch_point_data new_points;\n\n\t\t\t\tk3d::mesh::knots_t u_knots(source_curve_arrays.knots.begin(), source_curve_arrays.knots.end());\n\t\t\t\tk3d::mesh::knots_t v_knots(curve_to_traverse_arrays.knots.begin(), curve_to_traverse_arrays.knots.end());\n\n\t\t\t\tk3d::uint_t u_order = source_curves->curve_orders[source_curve];\n\t\t\t\tk3d::uint_t v_order = curves_to_traverse->curve_orders[curve_to_traverse];\n\n\t\t\t\tconst k3d::uint_t point_count = source_curves->curve_point_counts[source_curve];\n\t\t\t\tconst k3d::mesh::points_t& source_mesh_points = *SourceCurves.points;\n\t\t\t\tconst k3d::mesh::points_t& traverse_mesh_points = *CurvesToTraverse.points;\n\n\t\t\t\tpatch_point_data tmp_points;\n\t\t\t\ttmp_points.points.resize(2);\n\t\t\t\ttmp_points.weights.resize(2);\n\t\t\t\tcurve_point_data_copier u_copier(curve_to_traverse_arrays, tmp_points);\n\t\t\t\tcurve_point_data_copier v_copier(source_curve_arrays, tmp_points);\n\t\t\t\tpoint_data_copier new_copier(tmp_points, new_points);\n\t\t\t\tk3d::double_t weights[] = {0.5, 0.5};\n\t\t\t\tif(curve_to_traverse_arrays.point_attributes.empty())\n\t\t\t\t{\n\t\t\t\t\tweights[0] = 0.0;\n\t\t\t\t\tweights[1] = 1.0;\n\t\t\t\t}\n\t\t\t\telse if(source_curve_arrays.point_attributes.empty())\n\t\t\t\t{\n\t\t\t\t\tweights[1] = 0.0;\n\t\t\t\t\tweights[0] = 1.0;\n\t\t\t\t}\n\t\t\t\tconst k3d::uint_t indices[] = {0,1};\n\t\t\t\tfor (int i = 0; i < curves_to_traverse->curve_point_counts[curve_to_traverse]; i++)\n\t\t\t\t{\n\t\t\t\t\tk3d::vector3 delta_u = dehomogenize(curve_to_traverse_arrays.points[i]) - dehomogenize(curve_to_traverse_arrays.points.front());\n\t\t\t\t\tconst k3d::double_t w_u = curve_to_traverse_arrays.points[i][3];\n\t\t\t\t\tu_copier.copy(i, 0);\n\n\t\t\t\t\tfor (int j = 0; j < point_count; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tv_copier.copy(j, 1);\n\t\t\t\t\t\tnew_copier.push_back(2, indices, weights);\n\n\t\t\t\t\t\tnew_points.points.back() = dehomogenize(source_curve_arrays.points[j]) + delta_u;\n\t\t\t\t\t\tnew_points.weights.back() = source_curve_arrays.points[j][3] * w_u;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tk3d::table patch_attributes = curve_to_traverse_arrays.curve_attributes.empty() ? source_curve_arrays.curve_attributes.clone() : curve_to_traverse_arrays.curve_attributes.clone();\n\t\t\t\tk3d::table parameter_attributes = curve_to_traverse_arrays.parameter_attributes.clone();\n\t\t\t\tif(parameter_attributes.empty())\n\t\t\t\t{\n\t\t\t\t\tparameter_attributes = source_curve_arrays.parameter_attributes.clone();\n\t\t\t\t}\n\t\t\t\tk3d::table_copier v_parameter_copier(source_curve_arrays.parameter_attributes, parameter_attributes);\n\t\t\t\tv_parameter_copier.push_back(0);\n\t\t\t\tv_parameter_copier.push_back(1);\n\t\t\t\tadd_patch(OutputMesh, OutputPatches, new_points, u_knots, v_knots, source_curves->curve_orders[source_curve], curves_to_traverse->curve_orders[curve_to_traverse], patch_attributes, parameter_attributes);\n\t\t\t\tOutputPatches.patch_materials.push_back(source_curves->material[0]);\n\t\t\t}\n\t\t}\n\t}\n\tOutputPatches.constant_attributes = source_curves->constant_attributes.clone();\n}\n\nvoid traverse_curve(const k3d::mesh& SourceCurves, const k3d::mesh& CurvesToTraverse, k3d::mesh& OutputMesh)\n{\n\tfor(k3d::uint_t prim_idx = 0; prim_idx != SourceCurves.primitives.size(); ++prim_idx)\n\t{\n\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> source_curves(k3d::nurbs_curve::validate(SourceCurves, *SourceCurves.primitives[prim_idx]));\n\t\tif(!source_curves)\n\t\t\tcontinue;\n\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> output_patches(k3d::nurbs_patch::create(OutputMesh));\n\t\ttraverse_curve(SourceCurves, prim_idx, CurvesToTraverse, OutputMesh, *output_patches);\n\t}\n}\n\nvoid extract_patch_curve_by_number(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurve, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch, const k3d::uint_t Curve, const k3d::bool_t UDirection)\n{\n\tconst k3d::uint_t curve_count = UDirection ? InputPatches.patch_v_point_counts[Patch] : InputPatches.patch_u_point_counts[Patch];\n\tconst k3d::uint_t curve_point_count = UDirection ? InputPatches.patch_u_point_counts[Patch] : InputPatches.patch_v_point_counts[Patch];\n\treturn_if_fail(Curve < curve_count);\n\n\tcurve_arrays output_curve;\n\toutput_curve.order = UDirection ? InputPatches.patch_u_orders[Patch] : InputPatches.patch_v_orders[Patch];\n\n\tconst k3d::mesh::knots_t& input_knots = UDirection ? InputPatches.patch_u_knots : InputPatches.patch_v_knots;\n\tconst k3d::uint_t order = UDirection ? InputPatches.patch_u_orders[Patch] : InputPatches.patch_v_orders[Patch];\n\tconst k3d::uint_t knot_count = curve_point_count + order;\n\tconst k3d::uint_t knots_begin = UDirection ? InputPatches.patch_u_first_knots[Patch] : InputPatches.patch_v_first_knots[Patch];\n\tconst k3d::uint_t knots_end = knots_begin + knot_count;\n\toutput_curve.knots.insert(output_curve.knots.end(), input_knots.begin() + knots_begin, input_knots.begin() + knots_end);\n\n\tconst k3d::uint_t point_step = UDirection ? 1 : curve_count;\n\tconst k3d::uint_t points_begin = InputPatches.patch_first_points[Patch] + Curve * (UDirection ? curve_point_count : 1);\n\tconst k3d::uint_t points_end = points_begin + point_step * curve_point_count;\n\toutput_curve.vertex_attributes = InputPatches.vertex_attributes.clone_types();\n\tk3d::table_copier vertex_copier(InputPatches.vertex_attributes, output_curve.vertex_attributes);\n\toutput_curve.point_attributes = InputMesh.point_attributes.clone_types();\n\tk3d::table_copier point_copier(InputMesh.point_attributes, output_curve.point_attributes);\n\tfor (int i = points_begin; i < points_end; i += point_step)\n\t{\n\t\tconst k3d::double_t w = InputPatches.patch_point_weights[i];\n\t\tconst k3d::point3& p = InputMesh.points->at(InputPatches.patch_points[i]);\n\t\toutput_curve.points.push_back(k3d::point4(p[0]*w, p[1]*w, p[2]*w, w));\n\t\tconst k3d::uint_t idx = static_cast<k3d::uint_t>(i);\n\t\tvertex_copier.push_back(1, &idx, &w);\n\t\tpoint_copier.push_back(1, &(InputPatches.patch_points[i]), &w);\n\t}\n\n\t// Calculate the value of the parameter attributes at the start and end of the curve\n\tconst k3d::uint_t start_indices[] = {Patch*4, UDirection ? Patch*4+2 : Patch*4+1};\n\tconst k3d::uint_t end_indices[] = {UDirection ? Patch*4+1 : Patch*4+2, Patch*4+3};\n\tconst k3d::mesh::knots_t& other_knots = UDirection ? InputPatches.patch_v_knots : InputPatches.patch_u_knots;\n\tconst k3d::uint_t other_order = UDirection ? InputPatches.patch_v_orders[Patch] : InputPatches.patch_u_orders[Patch];\n\tconst k3d::uint_t other_knots_begin = UDirection ? InputPatches.patch_v_first_knots[Patch] : InputPatches.patch_u_first_knots[Patch];\n\tconst k3d::double_t u = (other_knots[other_order-1 + Curve] - other_knots.front()) / (other_knots.back() - other_knots.front());\n\tconst k3d::double_t weights[] = {1.0-u, u};\n\toutput_curve.parameter_attributes = InputPatches.parameter_attributes.clone_types();\n\tk3d::table_copier param_copier(InputPatches.parameter_attributes, output_curve.parameter_attributes);\n\tparam_copier.push_back(2, start_indices, weights);\n\tparam_copier.push_back(2, end_indices, weights);\n\n\toutput_curve.curve_attributes = InputPatches.patch_attributes.clone(Patch, Patch+1);\n\n\toutput_curve.add_curve(OutputMesh, OutputCurve);\n\tOutputCurve.constant_attributes = InputPatches.constant_attributes.clone();\n}\n\nvoid extract_patch_curve_by_parameter(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurve, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch, const k3d::double_t U, const k3d::bool_t UDirection)\n{\n\tif(U < 0.000001)\n\t{\n\t\textract_patch_curve_by_number(OutputMesh, OutputCurve, InputMesh, InputPatches, Patch, 0, UDirection);\n\t\treturn;\n\t}\n\tif(U > 0.999999)\n\t{\n\t\tconst k3d::uint_t curve_count = UDirection ? InputPatches.patch_v_point_counts[Patch] : InputPatches.patch_u_point_counts[Patch];\n\t\textract_patch_curve_by_number(OutputMesh, OutputCurve, InputMesh, InputPatches, Patch, curve_count - 1, UDirection);\n\t\treturn;\n\t}\n\tk3d::mesh::knots_t::const_iterator knots_begin = !UDirection ? InputPatches.patch_u_knots.begin() + InputPatches.patch_u_first_knots[Patch] : InputPatches.patch_v_knots.begin() + InputPatches.patch_v_first_knots[Patch];\n\tconst k3d::uint_t order = !UDirection ? InputPatches.patch_u_orders[Patch] : InputPatches.patch_v_orders[Patch];\n\tconst k3d::uint_t knot_count = !UDirection ? InputPatches.patch_u_point_counts[Patch] + order : InputPatches.patch_v_point_counts[Patch] + order;\n\tk3d::mesh::knots_t normalized_knots(knot_count);\n\tstd::transform(knots_begin, knots_begin + knot_count, normalized_knots.begin(), knot_normalizer(*knots_begin, *(knots_begin + knot_count - 1)));\n\tconst k3d::uint_t mul = multiplicity(normalized_knots, U, 0, knot_count);\n\tk3d::mesh tmp_mesh;\n\ttmp_mesh.points.create();\n\ttmp_mesh.point_selection.create();\n\tboost::scoped_ptr<k3d::nurbs_patch::primitive> tmp_patch(k3d::nurbs_patch::create(tmp_mesh));\n\tif(mul < (order-1))\n\t{\n\t\tinsert_knot(tmp_mesh, *tmp_patch, InputMesh, InputPatches, Patch, U, order-mul-1, !UDirection);\n\t}\n\telse\n\t{\n\t\tcopy_patch(tmp_mesh, *tmp_patch, InputMesh, InputPatches, Patch);\n\t}\n\tconst k3d::mesh::knots_t& knots = !UDirection ? tmp_patch->patch_u_knots : tmp_patch->patch_v_knots;\n\tk3d::mesh::knots_t normalized_knots2(knots.size());\n\tstd::transform(knots.begin(), knots.end(), normalized_knots2.begin(), knot_normalizer(knots.front(), knots.back()));\n\tconst k3d::mesh::knots_t::const_iterator split_knot = std::find_if(normalized_knots2.begin(), normalized_knots2.end(), find_first_knot_after(U));\n\tconst k3d::uint_t curve_idx = (split_knot - normalized_knots2.begin()) - order;\n\textract_patch_curve_by_number(OutputMesh, OutputCurve, tmp_mesh, *tmp_patch, 0, curve_idx, UDirection);\n}\n\n// stores all curves of a patch in one direction in a curve primitive\nvoid extract_curves(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch, const k3d::bool_t UDirection)\n{\n\tOutputMesh.points.create();\n\tOutputMesh.point_selection.create();\n\tconst k3d::uint_t curve_count = UDirection ? InputPatches.patch_v_point_counts[Patch] : InputPatches.patch_u_point_counts[Patch];\n\tfor(k3d::uint_t curve = 0; curve != curve_count; ++curve)\n\t{\n\t\textract_patch_curve_by_number(OutputMesh, OutputCurves, InputMesh, InputPatches, Patch, curve, UDirection);\n\t}\n\tif(OutputCurves.material.empty())\n\t\tOutputCurves.material.push_back(InputPatches.patch_materials[Patch]);\n}\n\n// Convert a series of curves back to a patch\nvoid curves_to_patch(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_curve::primitive& InputCurves, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch, const k3d::bool_t UDirection)\n{\n\tconst k3d::uint_t u_order = UDirection ? InputCurves.curve_orders.front() : InputPatches.patch_u_orders[Patch];\n\tconst k3d::uint_t v_order = UDirection ? InputPatches.patch_v_orders[Patch] : InputCurves.curve_orders.front();\n\tconst k3d::uint_t curve_count = InputCurves.curve_first_points.size();\n\n\tif(UDirection)\n\t{\n\t\tconst k3d::uint_t v_knots_begin = InputPatches.patch_v_first_knots[Patch];\n\t\tconst k3d::uint_t v_knots_end = v_knots_begin + curve_count + v_order;\n\t\tk3d::mesh::knots_t v_knots(InputPatches.patch_v_knots.begin() + v_knots_begin, InputPatches.patch_v_knots.begin() + v_knots_end);\n\t\tskin_curves(OutputMesh, OutputPatches, InputMesh, InputCurves, v_knots, v_order);\n\t}\n\telse\n\t{\n\t\tpatch_point_data output_point_data;\n\t\tconst k3d::uint_t point_count = InputCurves.curve_point_counts.front();\n\t\tk3d::table patch_attributes;\n\t\tk3d::table parameter_attributes;\n\t\tfor(k3d::uint_t i = 0; i != point_count; ++i)\n\t\t{\n\t\t\tfor(k3d::uint_t curve = 0; curve != curve_count; ++curve)\n\t\t\t{\n\t\t\t\tcurve_arrays input_curve_arrays(InputMesh, InputCurves, curve);\n\t\t\t\tcurve_point_data_copier copier(input_curve_arrays, output_point_data);\n\t\t\t\tcopier.push_back(i);\n\t\t\t\tif(!input_curve_arrays.curve_attributes.empty())\n\t\t\t\t\tpatch_attributes = input_curve_arrays.curve_attributes.clone();\n\t\t\t\tif(i == 0 || i == (point_count-1))\n\t\t\t\t{\n\t\t\t\t\tif(curve == 0 || curve == (curve_count-1))\n\t\t\t\t\t{\n\t\t\t\t\t\tif(parameter_attributes.empty())\n\t\t\t\t\t\t\tparameter_attributes = input_curve_arrays.parameter_attributes.clone_types();\n\t\t\t\t\t\tk3d::table_copier parameter_copier(input_curve_arrays.parameter_attributes, parameter_attributes);\n\t\t\t\t\t\tparameter_copier.push_back(i == 0 ? 0 : 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tk3d::mesh::knots_t v_knots(InputCurves.curve_knots.begin(), InputCurves.curve_knots.begin() + InputCurves.curve_point_counts.front() + InputCurves.curve_orders.front());\n\t\tconst k3d::uint_t u_knots_begin = InputPatches.patch_u_first_knots[Patch];\n\t\tconst k3d::uint_t u_knots_end = u_knots_begin + curve_count + u_order;\n\t\tk3d::mesh::knots_t u_knots(InputPatches.patch_u_knots.begin() + u_knots_begin, InputPatches.patch_u_knots.begin() + u_knots_end);\n\t\tadd_patch(OutputMesh, OutputPatches, output_point_data, u_knots, v_knots, u_order, v_order, patch_attributes, parameter_attributes);\n\t\tOutputPatches.patch_materials.push_back(InputPatches.patch_materials[Patch]);\n\t\tOutputPatches.patch_selections.back() = InputPatches.patch_selections[Patch];\n\t}\n}\n\nvoid elevate_patch_degree(const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::uint_t Patch, const k3d::uint_t Elevations, const k3d::bool_t UDirection)\n{\n\t// Extract the curves\n\tk3d::mesh curves_mesh;\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curves_prim(k3d::nurbs_curve::create(curves_mesh));\n\tcurves_prim->material.push_back(InputPatches.patch_materials[Patch]);\n\textract_curves(curves_mesh, *curves_prim, InputMesh, InputPatches, Patch, UDirection);\n\n\t// Elevate them\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> elevated_curves_prim(k3d::nurbs_curve::create(curves_mesh));\n\televated_curves_prim->material.push_back(InputPatches.patch_materials[Patch]);\n\tconst k3d::uint_t curve_count = UDirection ? InputPatches.patch_v_point_counts[Patch] : InputPatches.patch_u_point_counts[Patch];\n\tfor(k3d::uint_t curve = 0; curve != curve_count; ++curve)\n\t{\n\t\televate_curve_degree(curves_mesh, *elevated_curves_prim, curves_mesh, *curves_prim, curve, Elevations);\n\t}\n\n\tcurves_to_patch(OutputMesh, OutputPatches, curves_mesh, *elevated_curves_prim, InputPatches, Patch, UDirection);\n}\n\nvoid insert_knot(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, k3d::uint_t Patch, const k3d::double_t u, const k3d::uint_t r, const k3d::bool_t UDirection)\n{\n\t// Extract the curves\n\tk3d::mesh curves_mesh;\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curves_prim(k3d::nurbs_curve::create(curves_mesh));\n\tcurves_prim->material.push_back(InputPatches.patch_materials[Patch]);\n\textract_curves(curves_mesh, *curves_prim, InputMesh, InputPatches, Patch, UDirection);\n\n\t// Insert the new knot into every curve\n\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_curves_prim(k3d::nurbs_curve::validate(curves_mesh, *curves_mesh.primitives.front()));\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> knot_inserted_curves_prim(k3d::nurbs_curve::create(curves_mesh));\n\tknot_inserted_curves_prim->material.push_back(InputPatches.patch_materials[Patch]);\n\tconst k3d::uint_t curve_count = UDirection ? InputPatches.patch_v_point_counts[Patch] : InputPatches.patch_u_point_counts[Patch];\n\tfor(k3d::uint_t curve = 0; curve != curve_count; ++curve)\n\t{\n\t\tinsert_knot(curves_mesh, *knot_inserted_curves_prim, curves_mesh, *const_curves_prim, curve, u, r);\n\t}\n\n\tcurves_to_patch(OutputMesh, OutputPatches, curves_mesh, *knot_inserted_curves_prim, InputPatches, Patch, UDirection);\n}\n\nvoid split_patch(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, k3d::uint_t Patch, const k3d::double_t u, const k3d::bool_t UDirection)\n{\n\t// Can't split at end\n\tif(u > 1 - 0.000001 || u < 0.000001)\n\t{\n\t\tcopy_patch(OutputMesh, OutputPatches, InputMesh, InputPatches, Patch);\n\t\treturn;\n\t}\n\n\t// Extract the curves\n\tk3d::mesh curves_mesh;\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curves_prim(k3d::nurbs_curve::create(curves_mesh));\n\tcurves_prim->material.push_back(InputPatches.patch_materials[Patch]);\n\textract_curves(curves_mesh, *curves_prim, InputMesh, InputPatches, Patch, UDirection);\n\n\t// Split all the curves\n\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_curves_prim(k3d::nurbs_curve::validate(curves_mesh, *curves_mesh.primitives.front()));\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> split_curves_prim(k3d::nurbs_curve::create(curves_mesh));\n\tsplit_curves_prim->material.push_back(InputPatches.patch_materials[Patch]);\n\tconst k3d::uint_t curve_count = UDirection ? InputPatches.patch_v_point_counts[Patch] : InputPatches.patch_u_point_counts[Patch];\n\tfor(k3d::uint_t curve = 0; curve != curve_count; ++curve)\n\t{\n\t\tsplit_curve(curves_mesh, *split_curves_prim, curves_mesh, *const_curves_prim, curve, u);\n\t}\n\n\tif(is_closed(*const_curves_prim, 0))\n\t{\n\t\tcurves_to_patch(OutputMesh, OutputPatches, curves_mesh, *split_curves_prim, InputPatches, Patch, UDirection);\n\t}\n\telse\n\t{\n\t\tassert_warning(curve_count * 2 == split_curves_prim->curve_first_points.size());\n\t\t// separate each first and second split curve into different primitives and meshes\n\t\tk3d::mesh first_mesh, second_mesh;\n\t\tfirst_mesh.points.create();\n\t\tfirst_mesh.point_selection.create();\n\t\tsecond_mesh.points.create();\n\t\tsecond_mesh.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> first_prim(k3d::nurbs_curve::create(first_mesh));\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> second_prim(k3d::nurbs_curve::create(second_mesh));\n\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_split_prim(k3d::nurbs_curve::validate(curves_mesh, *curves_mesh.primitives.back()));\n\t\tfor(k3d::uint_t curve = 0; curve != split_curves_prim->curve_first_points.size(); ++curve)\n\t\t{\n\t\t\tif(curve % 2 == 0)\n\t\t\t{\n\t\t\t\tcopy_curve(first_mesh, *first_prim, curves_mesh, *const_split_prim, curve);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcopy_curve(second_mesh, *second_prim, curves_mesh, *const_split_prim, curve);\n\t\t\t}\n\t\t}\n\t\tcurves_to_patch(OutputMesh, OutputPatches, first_mesh, *first_prim, InputPatches, Patch, UDirection);\n\t\tcurves_to_patch(OutputMesh, OutputPatches, second_mesh, *second_prim, InputPatches, Patch, UDirection);\n\t}\n}\n\nvoid revolve_curve(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Curve, const k3d::axis Axis, const k3d::double_t Angle, const k3d::uint_t Segments)\n{\n\t//create a circle with the given angle\n\tk3d::mesh::knots_t u_knots;\n\tk3d::mesh::weights_t u_weights;\n\tk3d::mesh::points_t u_control_points;\n\tswitch (Axis)\n\t{\n\tcase k3d::Z :\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, Angle, Segments, u_knots, u_weights, u_control_points);\n\t\tbreak;\n\tcase k3d::X :\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(0, 0, 1), k3d::vector3(0, 1, 0), 0, Angle, Segments, u_knots, u_weights, u_control_points);\n\t\tbreak;\n\tcase k3d::Y :\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 0, 1), 0, Angle, Segments, u_knots, u_weights, u_control_points);\n\t\tbreak;\n\t}\n\n\t// New patch arrays\n\tpatch_point_data output_points;\n\n\tcurve_arrays input_curve_arrays(InputMesh, InputCurves, Curve);\n\toutput_points.point_attributes = input_curve_arrays.point_attributes.clone_types();\n\toutput_points.vertex_attributes = input_curve_arrays.vertex_attributes.clone_types();\n\tk3d::table_copier point_copier(input_curve_arrays.point_attributes, output_points.point_attributes);\n\tk3d::table_copier vertex_copier(input_curve_arrays.vertex_attributes, output_points.vertex_attributes);\n\tconst k3d::uint_t curve_points_begin = 0;\n\tconst k3d::uint_t curve_points_end = input_curve_arrays.points.size();\n\n\tfor (k3d::uint_t i = curve_points_begin; i != curve_points_end; ++i)\n\t{\n\t\tk3d::point3 p = dehomogenize(input_curve_arrays.points[i]);\n\t\tconst k3d::double_t w = input_curve_arrays.points[i][3];\n\t\tconst k3d::double_t inv_w = 1.0/w;\n\t\tdouble distance = 1.0;\n\t\tswitch (Axis)\n\t\t{\n\t\tcase k3d::Z :\n\t\t\tdistance = sqrt((p[0] * p[0]) + (p[1] * p[1])); // we want the distance to the z axis\n\t\t\tbreak;\n\t\tcase k3d::X :\n\t\t\tdistance = sqrt((p[2] * p[2]) + (p[1] * p[1])); // we want the distance to the x axis\n\t\t\tbreak;\n\t\tcase k3d::Y :\n\t\t\tdistance = sqrt((p[0] * p[0]) + (p[2] * p[2])); // we want the distance to the y axis\n\t\t\tbreak;\n\t\t}\n\n\t\tfor (int j = 0; j < u_control_points.size(); j++)\n\t\t{\n\t\t\tk3d::point3 p_u;\n\t\t\tswitch (Axis)\n\t\t\t{\n\t\t\tcase k3d::Z :\n\t\t\t\tp_u = k3d::point3(u_control_points[j][0] * distance, u_control_points[j][1] * distance, p[2]);\n\t\t\t\tbreak;\n\t\t\tcase k3d::X :\n\t\t\t\tp_u = k3d::point3(p[0], u_control_points[j][1] * distance, u_control_points[j][2] * distance);\n\t\t\t\tbreak;\n\t\t\tcase k3d::Y :\n\t\t\t\tp_u = k3d::point3(u_control_points[j][0] * distance, p[1], u_control_points[j][2] * distance);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\toutput_points.points.push_back(p_u);\n\t\t\toutput_points.weights.push_back(w * u_weights[j]);\n\t\t\tpoint_copier.push_back(1, &i, &inv_w);\n\t\t\tvertex_copier.push_back(1, &i, &inv_w);\n\t\t}\n\t}\n\n\tconst k3d::uint_t v_order = InputCurves.curve_orders[Curve];\n\tconst k3d::uint_t knots_begin = InputCurves.curve_first_knots[Curve];\n\tconst k3d::uint_t knots_end = knots_begin + v_order + InputCurves.curve_point_counts[Curve];\n\tk3d::mesh::knots_t v_knots(InputCurves.curve_knots.begin() + knots_begin, InputCurves.curve_knots.begin() + knots_end);\n\n\tk3d::table parameter_attributes = input_curve_arrays.parameter_attributes.clone();\n\tk3d::table_copier parameter_copier(input_curve_arrays.parameter_attributes, parameter_attributes);\n\tparameter_copier.push_back(0);\n\tparameter_copier.push_back(1);\n\tparameter_copier.push_back(1);\n\n\tadd_patch(OutputMesh, OutputPatches, output_points, u_knots, v_knots, 3, v_order, input_curve_arrays.curve_attributes, parameter_attributes);\n\tOutputPatches.patch_materials.push_back(InputCurves.material.front());\n}\n\nvoid ruled_surface(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Order, const k3d::uint_t Segments)\n{\n\treturn_if_fail(InputCurves.curve_first_points.size() == 2);\n\treturn_if_fail(InputCurves.curve_orders.front() == InputCurves.curve_orders.back());\n\treturn_if_fail(InputCurves.curve_point_counts.front() == InputCurves.curve_point_counts.back());\n\n\tcurve_arrays input1_arrays(InputMesh, InputCurves, 0);\n\tcurve_arrays input2_arrays(InputMesh, InputCurves, 1);\n\n\tconst k3d::uint_t v_point_count = InputCurves.curve_point_counts.front();\n\tpatch_point_data output_point_data;\n\tpatch_point_data point_mixer;\n\tpoint_mixer.points.resize(2);\n\tpoint_mixer.weights.resize(2);\n\tcurve_point_data_copier input1_copier(input1_arrays, point_mixer);\n\tcurve_point_data_copier input2_copier(input2_arrays, point_mixer);\n\tpoint_data_copier output_copier(point_mixer, output_point_data);\n\tconst k3d::uint_t indices[] = {0,1};\n\tfor(k3d::uint_t i = 0; i != v_point_count; ++i)\n\t{\n\t\tinput1_copier.copy(i, 0);\n\t\tinput2_copier.copy(i, 1);\n\t\tconst k3d::point3& p1 = InputMesh.points->at(InputCurves.curve_points[i]);\n\t\tconst k3d::double_t w1 = InputCurves.curve_point_weights[i];\n\t\tconst k3d::point3& p2 = InputMesh.points->at(InputCurves.curve_points[i + v_point_count]);\n\t\tconst k3d::double_t w2 = InputCurves.curve_point_weights[i + v_point_count];\n\n\t\tconst k3d::vector3 delta = (p2 - p1) / Segments;\n\t\tfor (k3d::uint_t segment = 0; segment <= Segments; ++segment)\n\t\t{\n\t\t\tconst k3d::double_t w = static_cast<double>(segment)/static_cast<double>(Segments);\n\t\t\tconst k3d::double_t weights[] = {1.0-w, w};\n\t\t\toutput_copier.push_back(2, indices, weights);\n\t\t}\n\t}\n\n\tk3d::mesh::knots_t u_knots;\n\tk3d::nurbs_curve::add_open_uniform_knots(Order, Segments + 1, u_knots);\n\tconst k3d::uint_t v_order = InputCurves.curve_orders.front();\n\tk3d::mesh::knots_t v_knots(InputCurves.curve_knots.begin(), InputCurves.curve_knots.begin() + v_point_count + v_order);\n\n\tk3d::table parameter_attributes = input1_arrays.parameter_attributes.clone();\n\tk3d::table_copier parameter_copier(input2_arrays.parameter_attributes, parameter_attributes);\n\tparameter_copier.push_back(0);\n\tparameter_copier.push_back(1);\n\tadd_patch(OutputMesh, OutputPatches, output_point_data, u_knots, v_knots, Order, v_order, input1_arrays.curve_attributes, parameter_attributes);\n\tOutputPatches.patch_materials.push_back(InputCurves.material.back());\n}\n\nvoid apply_knot_vectors(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch, const k3d::mesh::knots_t& UKnots, const k3d::mesh::knots_t& VKnots, const k3d::uint_t UOrder, const k3d::uint_t VOrder)\n{\n\t// Make sure the patch is elevated to the correct degree\n\tk3d::mesh elevated_mesh;\n\televated_mesh.points.create();\n\televated_mesh.point_selection.create();\n\tboost::scoped_ptr<k3d::nurbs_patch::primitive> u_elevated(k3d::nurbs_patch::create(elevated_mesh));\n\televate_patch_degree(InputMesh, InputPatches, elevated_mesh, *u_elevated, Patch, UOrder - InputPatches.patch_u_orders[Patch], true);\n\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> const_u_elevated(k3d::nurbs_patch::validate(elevated_mesh, *elevated_mesh.primitives.back()));\n\tboost::scoped_ptr<k3d::nurbs_patch::primitive> v_elevated(k3d::nurbs_patch::create(elevated_mesh));\n\televate_patch_degree(elevated_mesh, *const_u_elevated, elevated_mesh, *v_elevated, 0, VOrder - InputPatches.patch_v_orders[Patch], false);\n\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> const_v_elevated(k3d::nurbs_patch::validate(elevated_mesh, *elevated_mesh.primitives.back()));\n\t// Adapt the U direction\n\tk3d::mesh u_mesh;\n\tu_mesh.points.create();\n\tu_mesh.point_selection.create();\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> u_curves(k3d::nurbs_curve::create(u_mesh));\n\textract_curves(u_mesh, *u_curves, elevated_mesh, *const_v_elevated, 0, true);\n\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_u_curves(k3d::nurbs_curve::validate(u_mesh, *u_mesh.primitives.back()));\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> u_curves_merged(k3d::nurbs_curve::create(u_mesh));\n\tknot_vector_merger u_merger(UKnots, UOrder);\n\tfor(k3d::uint_t curve = 0; curve != u_curves->curve_first_points.size(); ++curve)\n\t\tu_merger(u_mesh, *u_curves_merged, u_mesh, *const_u_curves, curve);\n\tu_curves_merged->material = const_u_curves->material;\n\tboost::scoped_ptr<k3d::nurbs_patch::primitive> u_patch_merged(k3d::nurbs_patch::create(u_mesh));\n\tcurves_to_patch(u_mesh, *u_patch_merged, u_mesh, *u_curves_merged, *const_v_elevated, 0, true);\n\n\t// V direction\n\tk3d::mesh v_mesh;\n\tv_mesh.points.create();\n\tv_mesh.point_selection.create();\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> v_curves(k3d::nurbs_curve::create(v_mesh));\n\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> const_u_patch_merged(k3d::nurbs_patch::validate(u_mesh, *u_mesh.primitives.back()));\n\textract_curves(v_mesh, *v_curves, u_mesh, *const_u_patch_merged, 0, false);\n\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_v_curves(k3d::nurbs_curve::validate(v_mesh, *v_mesh.primitives.back()));\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> v_curves_merged(k3d::nurbs_curve::create(v_mesh));\n\tknot_vector_merger v_merger(VKnots, VOrder);\n\tfor(k3d::uint_t curve = 0; curve != v_curves->curve_first_points.size(); ++curve)\n\t\tv_merger(v_mesh, *v_curves_merged, v_mesh, *const_v_curves, curve);\n\tv_curves_merged->material = const_v_curves->material;\n\tcurves_to_patch(OutputMesh, OutputPatches, v_mesh, *v_curves_merged, *const_u_patch_merged, 0, false);\n}\n\nvoid create_bilinear_patch(k3d::mesh& OutputMesh,\n\t\tk3d::nurbs_patch::primitive& OutputPatches,\n\t\tconst patch_point_data& PointData,\n\t\tconst k3d::table& PatchAttributes,\n\t\tconst k3d::table& ParameterAttributes)\n{\n\tk3d::mesh::knots_t bilinear_knots;\n\tbilinear_knots.push_back(0);\n\tbilinear_knots.push_back(0);\n\tbilinear_knots.push_back(1);\n\tbilinear_knots.push_back(1);\n\tadd_patch(OutputMesh, OutputPatches, PointData, bilinear_knots, bilinear_knots, 2, 2, PatchAttributes, ParameterAttributes);\n}\n\nvoid coons_patch(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t U1, const k3d::uint_t V1, const k3d::uint_t U2, const k3d::uint_t V2)\n{\n\tpatch_point_data bilinear_point_data;\n\tbilinear_point_data.points.push_back(InputMesh.points->at(InputCurves.curve_points[InputCurves.curve_first_points[U1]]));\n\tbilinear_point_data.points.push_back(InputMesh.points->at(InputCurves.curve_points[InputCurves.curve_first_points[V1]]));\n\tbilinear_point_data.points.push_back(InputMesh.points->at(InputCurves.curve_points[InputCurves.curve_first_points[V2]]));\n\tbilinear_point_data.points.push_back(InputMesh.points->at(InputCurves.curve_points[InputCurves.curve_first_points[U2]]));\n\n\tbilinear_point_data.weights.push_back(InputCurves.curve_point_weights[InputCurves.curve_first_points[U1]]);\n\tbilinear_point_data.weights.push_back(InputCurves.curve_point_weights[InputCurves.curve_first_points[V1]]);\n\tbilinear_point_data.weights.push_back(InputCurves.curve_point_weights[InputCurves.curve_first_points[V2]]);\n\tbilinear_point_data.weights.push_back(InputCurves.curve_point_weights[InputCurves.curve_first_points[U2]]);\n\n\tbilinear_point_data.vertex_attributes = InputCurves.vertex_attributes.clone_types();\n\tbilinear_point_data.point_attributes = InputMesh.point_attributes.clone_types();\n\tk3d::table_copier vertex_copier(InputCurves.vertex_attributes, bilinear_point_data.vertex_attributes);\n\tk3d::table_copier point_copier(InputMesh.point_attributes, bilinear_point_data.point_attributes);\n\n\tvertex_copier.push_back(InputCurves.curve_first_points[U1]);\n\tvertex_copier.push_back(InputCurves.curve_first_points[V1]);\n\tvertex_copier.push_back(InputCurves.curve_first_points[U2]);\n\tvertex_copier.push_back(InputCurves.curve_first_points[V2]);\n\n\tpoint_copier.push_back(InputCurves.curve_points[InputCurves.curve_first_points[U1]]);\n\tpoint_copier.push_back(InputCurves.curve_points[InputCurves.curve_first_points[V1]]);\n\tpoint_copier.push_back(InputCurves.curve_points[InputCurves.curve_first_points[U2]]);\n\tpoint_copier.push_back(InputCurves.curve_points[InputCurves.curve_first_points[V2]]);\n\n\tk3d::table patch_attributes = InputCurves.curve_attributes.clone_types();\n\tk3d::table_copier patch_copier(InputCurves.curve_attributes, patch_attributes);\n\tk3d::uint_t curve_indices[] = {U1, V1, U2, V2};\n\tk3d::double_t curve_weights[] = {0.5, 0.5, 0.5, 0.5};\n\tpatch_copier.push_back(4, curve_indices, curve_weights);\n\n\tk3d::table parameter_attributes = InputCurves.parameter_attributes.clone_types();\n\tif(!parameter_attributes.empty())\n\t{\n\t\tk3d::table_copier parameter_copier(InputCurves.parameter_attributes, parameter_attributes);\n\t\tk3d::uint_t param_idx0[] = {2*U1, 2*U2};\n\t\tk3d::double_t param_weights[] = {0.5, 0.5};\n\t\tparameter_copier.push_back(2, param_idx0, param_weights);\n\t\tk3d::uint_t param_idx1[] = {2*U1+1, 2*U2+1};\n\t\tparameter_copier.push_back(2, param_idx1, param_weights);\n\t\tk3d::uint_t param_idx2[] = {2*V1, 2*V2};\n\t\tparameter_copier.push_back(2, param_idx2, param_weights);\n\t\tk3d::uint_t param_idx3[] = {2*V1+1, 2*V2+1};\n\t\tparameter_copier.push_back(2, param_idx3, param_weights);\n\t}\n\n\t// Storage for temporary patches\n\tk3d::mesh patch_mesh;\n\tpatch_mesh.points.create();\n\tpatch_mesh.point_selection.create();\n\n\tboost::scoped_ptr<k3d::nurbs_patch::primitive> bilinear_patch(k3d::nurbs_patch::create(patch_mesh));\n\tcreate_bilinear_patch(patch_mesh, *bilinear_patch, bilinear_point_data, patch_attributes, parameter_attributes);\n\tbilinear_patch->patch_materials.push_back(InputCurves.material.back());\n\n\t// Flip curve U2 and V2\n\tk3d::mesh flipped_mesh;\n\tflipped_mesh.points.create();\n\tflipped_mesh.point_selection.create();\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> flipped_curves(k3d::nurbs_curve::create(flipped_mesh));\n\tcopy_curve(flipped_mesh, *flipped_curves, InputMesh, InputCurves, U2);\n\tcopy_curve(flipped_mesh, *flipped_curves, InputMesh, InputCurves, V2);\n\tflipped_curves->material = InputCurves.material;\n\tflip_curve(*flipped_curves, 0);\n\tflip_curve(*flipped_curves, 1);\n\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_flipped_curves(k3d::nurbs_curve::validate(flipped_mesh, *flipped_mesh.primitives.front()));\n\n\t// Make sure all curves are compatible\n\tk3d::mesh u_compatible_mesh;\n\tu_compatible_mesh.points.create();\n\tu_compatible_mesh.point_selection.create();\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> u_compatible_curves(k3d::nurbs_curve::create(u_compatible_mesh));\n\tconst k3d::double_t u_order = std::max(InputCurves.curve_orders[U1], InputCurves.curve_orders[U2]);\n\tk3d::mesh::knots_t common_u_knots;\n\tknot_vector_calculator u_knot_extractor(common_u_knots);\n\tu_knot_extractor(InputMesh, InputCurves, U1);\n\tu_knot_extractor(flipped_mesh, *const_flipped_curves, 0);\n\tknot_vector_merger u_merger(common_u_knots, u_order);\n\tu_merger(u_compatible_mesh, *u_compatible_curves, InputMesh, InputCurves, U1);\n\tu_merger(u_compatible_mesh, *u_compatible_curves, flipped_mesh, *const_flipped_curves, 0);\n\n\tk3d::mesh v_compatible_mesh;\n\tv_compatible_mesh.points.create();\n\tv_compatible_mesh.point_selection.create();\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> v_compatible_curves(k3d::nurbs_curve::create(v_compatible_mesh));\n\tconst k3d::double_t v_order = std::max(InputCurves.curve_orders[V1], InputCurves.curve_orders[U2]);\n\tk3d::mesh::knots_t common_v_knots;\n\tknot_vector_calculator v_knot_extractor(common_v_knots);\n\tv_knot_extractor(flipped_mesh, *const_flipped_curves, 1);\n\tv_knot_extractor(InputMesh, InputCurves, V1);\n\tknot_vector_merger v_merger(common_v_knots, v_order);\n\tv_merger(v_compatible_mesh, *v_compatible_curves, flipped_mesh, *const_flipped_curves, 1);\n\tv_merger(v_compatible_mesh, *v_compatible_curves, InputMesh, InputCurves, V1);\n\n\tu_compatible_curves->material = InputCurves.material;\n\tv_compatible_curves->material = InputCurves.material;\n\n\t// ruled surfaces\n\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_u_compatible_curves(k3d::nurbs_curve::validate(u_compatible_mesh, *u_compatible_mesh.primitives.front()));\n\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_v_compatible_curves(k3d::nurbs_curve::validate(v_compatible_mesh, *v_compatible_mesh.primitives.front()));\n\tboost::scoped_ptr<k3d::nurbs_patch::primitive> u_ruled(k3d::nurbs_patch::create(patch_mesh));\n\truled_surface(patch_mesh, *u_ruled, u_compatible_mesh, *const_u_compatible_curves, 2, 1);\n\tboost::scoped_ptr<k3d::nurbs_patch::primitive> v_ruled(k3d::nurbs_patch::create(patch_mesh));\n\truled_surface(patch_mesh, *v_ruled, v_compatible_mesh, *const_v_compatible_curves, 2, 1);\n\n\t// Make all surfaces compatible\n\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> const_bilinear(k3d::nurbs_patch::validate(patch_mesh, *patch_mesh.primitives[0]));\n\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> const_u_ruled(k3d::nurbs_patch::validate(patch_mesh, *patch_mesh.primitives[1]));\n\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> const_v_ruled(k3d::nurbs_patch::validate(patch_mesh, *patch_mesh.primitives[2]));\n\tboost::scoped_ptr<k3d::nurbs_patch::primitive> bilinear_compatible(k3d::nurbs_patch::create(patch_mesh));\n\tboost::scoped_ptr<k3d::nurbs_patch::primitive> u_ruled_compatible(k3d::nurbs_patch::create(patch_mesh));\n\tboost::scoped_ptr<k3d::nurbs_patch::primitive> v_ruled_compatible(k3d::nurbs_patch::create(patch_mesh));\n\tapply_knot_vectors(patch_mesh, *bilinear_compatible, patch_mesh, *const_bilinear, 0, common_u_knots, common_v_knots, u_order, v_order);\n\tapply_knot_vectors(patch_mesh, *u_ruled_compatible, patch_mesh, *const_u_ruled, 0, common_v_knots, common_u_knots, u_order, v_order);\n\tapply_knot_vectors(patch_mesh, *v_ruled_compatible, patch_mesh, *const_v_ruled, 0, common_u_knots, common_v_knots, v_order, u_order);\n\n\t// Compose the final patch\n\tpatch_point_data output_point_data;\n\tpatch_point_data mixer(3); // data from a single point of the 3 patches\n\tmixer.point_attributes = patch_mesh.point_attributes.clone_types();\n\tmixer.vertex_attributes = u_ruled_compatible->vertex_attributes.clone_types();\n\tmixer.point_attributes.set_row_count(3);\n\tmixer.vertex_attributes.set_row_count(3);\n\t// copiers\n\tk3d::table_copier patch_point_copier(patch_mesh.point_attributes, mixer.point_attributes);\n\tk3d::table_copier u_vertex_copier(u_ruled_compatible->vertex_attributes, mixer.vertex_attributes);\n\tk3d::table_copier v_vertex_copier(v_ruled_compatible->vertex_attributes, mixer.vertex_attributes);\n\tk3d::table_copier bilinear_vertex_copier(bilinear_compatible->vertex_attributes, mixer.vertex_attributes);\n\tconst k3d::uint_t u_count = bilinear_compatible->patch_u_point_counts.back();\n\tconst k3d::uint_t v_count = bilinear_compatible->patch_v_point_counts.back();\n\t// output copying\n\tpoint_data_copier output_copier(mixer, output_point_data);\n\tconst k3d::uint_t indices[] = {0, 1, 2};\n\tconst k3d::double_t weights[] = {1.0, 1.0, -1.0};\n\tfor(k3d::uint_t v = 0; v != v_count; ++v)\n\t{\n\t\tconst k3d::uint_t u_start = u_count * v;\n\t\tfor(k3d::uint_t u = 0; u != u_count; ++u)\n\t\t{\n\t\t\tconst k3d::uint_t idx = u_start + u;\n\t\t\tconst k3d::uint_t transposed_idx = v + u*v_count;\n\n\t\t\tpatch_point_copier.copy(u_ruled_compatible->patch_points[transposed_idx], 0);\n\t\t\tpatch_point_copier.copy(v_ruled_compatible->patch_points[idx], 1);\n\t\t\tpatch_point_copier.copy(bilinear_compatible->patch_points[idx], 2);\n\n\t\t\tu_vertex_copier.copy(transposed_idx, 0);\n\t\t\tv_vertex_copier.copy(idx, 1);\n\t\t\tbilinear_vertex_copier.copy(idx, 2);\n\n\t\t\tmixer.points[0] = patch_mesh.points->at(u_ruled_compatible->patch_points[transposed_idx]);\n\t\t\tmixer.points[1] = patch_mesh.points->at(v_ruled_compatible->patch_points[idx]);\n\t\t\tmixer.points[2] = patch_mesh.points->at(bilinear_compatible->patch_points[idx]);\n\n\t\t\tmixer.weights[0] = u_ruled_compatible->patch_point_weights[transposed_idx];\n\t\t\tmixer.weights[1] = v_ruled_compatible->patch_point_weights[idx];\n\t\t\tmixer.weights[2] = bilinear_compatible->patch_point_weights[idx];\n\n\t\t\toutput_copier.push_back(3, indices, weights);\n\t\t}\n\t}\n\tadd_patch(OutputMesh, OutputPatches, output_point_data, common_u_knots, common_v_knots, u_order, v_order, patch_attributes, parameter_attributes);\n\tOutputPatches.patch_materials.push_back(InputCurves.material.back());\n}\n\nvoid extract_plane(k3d::point3& Origin, k3d::normal3& Normal, k3d::vector3& U, k3d::vector3& V, k3d::mesh::points_2d_t& ParameterPoints, const k3d::mesh::points_t& Points, const k3d::double_t UOffset)\n{\n\t// The origin is the centroid of the point cloud\n\tOrigin = k3d::point3(0,0,0);\n\tconst k3d::uint_t points_count = Points.size();\n\tfor(k3d::uint_t i = 0; i != points_count; ++i)\n\t\tOrigin += k3d::to_vector(Points[i]);\n\tOrigin /= points_count;\n\n\t// Extract the average normal (from polyhedron.cpp)\n\tNormal = k3d::normal3(0,0,0);\n\tfor(k3d::uint_t p = 0; p != points_count; ++p)\n\t{\n\t\tconst k3d::point3& i = Points[p];\n\t\tconst k3d::point3& j = Points[(p+1)%points_count];\n\n\t\tNormal[0] += (i[1] + j[1]) * (j[2] - i[2]);\n\t\tNormal[1] += (i[2] + j[2]) * (j[0] - i[0]);\n\t\tNormal[2] += (i[0] + j[0]) * (j[1] - i[1]);\n\t}\n\tNormal = k3d::normalize(Normal);\n\n\t// As U-axis, we use the first point in the cloud, rotated by an angle depending on the UOffset parameter\n\tk3d::point4 u_point(Points.front()[0], Points.front()[1], Points.front()[2], 1);\n\tk3d::point4 u_point_rotated = k3d::rotate3(k3d::pi_times_2()*UOffset, k3d::to_vector(Normal)) * u_point;\n\tU = k3d::normalize(k3d::point3(u_point_rotated[0], u_point_rotated[1], u_point_rotated[2]) - Origin);\n\n\t// The V axis is the cross product of the Normal and U\n\tV = Normal ^ U;\n\n\t// Now we can extract the parameter coords\n\tfor(k3d::uint_t i = 0; i != points_count; ++i)\n\t{\n\t\tconst k3d::vector3 vec = Points[i] - Origin;\n\t\tParameterPoints.push_back(k3d::point2(U*vec, V*vec));\n\t}\n}\n\nvoid bbox2(k3d::point2& Min, k3d::point2& Max, const k3d::mesh::points_2d_t& Points)\n{\n\tMin = k3d::point2(std::numeric_limits<double>::max(), std::numeric_limits<double>::max());\n\tMax = k3d::point2(-std::numeric_limits<double>::max(), -std::numeric_limits<double>::max());\n\tfor(k3d::uint_t i = 0; i != Points.size(); ++i)\n\t{\n\t\tconst k3d::point2& p = Points[i];\n\t\tMin[0] = std::min(p[0], Min[0]);\n\t\tMin[1] = std::min(p[1], Min[1]);\n\t\tMax[0] = std::max(p[0], Max[0]);\n\t\tMax[1] = std::max(p[1], Max[1]);\n\t}\n}\n\nvoid skin_curves(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_curve::primitive& InputCurves, const k3d::mesh::knots_t VKnots, const k3d::uint_t VOrder)\n{\n\tconst k3d::uint_t u_order = InputCurves.curve_orders.front();\n\tconst k3d::uint_t curve_count = InputCurves.curve_first_points.size();\n\n\tpatch_point_data output_point_data;\n\n\t// Because of the way elevate_curve_degree (and ultimately add_curve) works, the points should be ordered correctly\n\toutput_point_data.points.insert(output_point_data.points.end(), InputMesh.points->begin() + InputCurves.curve_points[InputCurves.curve_first_points.front()], InputMesh.points->end());\n\toutput_point_data.weights = InputCurves.curve_point_weights;\n\toutput_point_data.vertex_attributes = InputCurves.vertex_attributes.clone();\n\toutput_point_data.point_attributes = InputMesh.point_attributes.clone(InputCurves.curve_points[InputCurves.curve_first_points.front()], InputMesh.points->size());\n\tk3d::mesh::knots_t u_knots(InputCurves.curve_knots.begin(), InputCurves.curve_knots.begin() + InputCurves.curve_point_counts.front() + InputCurves.curve_orders.front());\n\n\tk3d::table patch_attributes = InputCurves.curve_attributes.clone(0, 1);\n\tk3d::table parameter_attributes = InputCurves.parameter_attributes.clone_types();\n\tk3d::table_copier parameter_copier(InputCurves.parameter_attributes, parameter_attributes);\n\tparameter_copier.push_back(0);\n\tparameter_copier.push_back(1);\n\tparameter_copier.push_back(2*InputCurves.curve_first_points.size()-2);\n\tparameter_copier.push_back(2*InputCurves.curve_first_points.size()-1);\n\n\tadd_patch(OutputMesh, OutputPatches, output_point_data, u_knots, VKnots, u_order, VOrder, patch_attributes, parameter_attributes);\n\tOutputPatches.patch_materials.push_back(InputCurves.material.back());\n\tOutputPatches.patch_selections.back() = 1.0;\n}\n\nvoid sweep(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& SweptCurves, const k3d::nurbs_curve::const_primitive& Paths, const k3d::uint_t Samples, const k3d::bool_t AlignNormal)\n{\n\tconst k3d::uint_t paths_count = Paths.curve_first_points.size();\n\tconst k3d::uint_t swept_curves_count = SweptCurves.curve_first_points.size();\n\tfor(k3d::uint_t path = 0; path != paths_count; ++path)\n\t{\n\t\tcurve_arrays path_arrays(InputMesh, Paths, path, true);\n\t\tconst k3d::uint_t path_point_count = path_arrays.points.size();\n\t\tconst k3d::uint_t order = path_arrays.order;\n\n\t\t// Unique knot values\n\t\tk3d::mesh::knots_t unique_knots;\n\t\tfor(k3d::uint_t i = 0; i < path_arrays.knots.size();)\n\t\t{\n\t\t\tconst k3d::double_t u = path_arrays.knots[i];\n\t\t\tunique_knots.push_back(u);\n\t\t\ti += multiplicity(path_arrays.knots, u, i, path_arrays.knots.size());\n\t\t}\n\n\t\t// Construct a local coordinate system around each sample point\n\t\tpoints4_t origins;\n\t\tk3d::mesh::vectors_t x_vecs, y_vecs, z_vecs;\n\t\tk3d::mesh::knots_t samples_u;\n\t\t{\n\t\t\torigins.push_back(path_arrays.points.front());\n\t\t\tconst k3d::point3 p0 = dehomogenize(path_arrays.points[0]);\n\t\t\tconst k3d::point3 p1 = dehomogenize(path_arrays.points[1]);\n\t\t\tconst k3d::point3 p2 = dehomogenize(path_arrays.points[2]);\n\t\t\tconst k3d::vector3 z = k3d::normalize(p1 - p0);\n\t\t\tconst k3d::double_t step = (path_arrays.knots[order] - path_arrays.knots[0]) / static_cast<k3d::double_t>(Samples+1);\n\t\t\tk3d::vector3 next_tangent = path_arrays.tangent(0.5*step);\n\t\t\tif(std::abs(z*next_tangent) > 0.999999)\n\t\t\t{\n\t\t\t\tnext_tangent = path_point_count > 2 ? k3d::normalize(p2 - p1) : z;\n\t\t\t\tif(std::abs(z*next_tangent) > 0.999999) // Choose a random vector that is not parallel to z to make a cross product with\n\t\t\t\t{\n\t\t\t\t\tif(z[0] != 0)\n\t\t\t\t\t\tnext_tangent[1] += 1;\n\t\t\t\t\telse\n\t\t\t\t\t\tnext_tangent[0] += 1;\n\t\t\t\t\tnext_tangent  = k3d::normalize(next_tangent);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst k3d::vector3 y = k3d::normalize(z ^ next_tangent);\n\t\t\tx_vecs.push_back(k3d::normalize(y ^ z));\n\t\t\ty_vecs.push_back(y);\n\t\t\tz_vecs.push_back(z);\n\t\t\tsamples_u.push_back(0);\n\t\t}\n\t\tconst k3d::uint_t unique_knots_end = unique_knots.size() - 1;\n\t\tfor(k3d::uint_t i = 0; i != unique_knots_end; ++i)\n\t\t{\n\t\t\tconst k3d::double_t start_u = unique_knots[i];\n\t\t\tconst k3d::double_t step = (unique_knots[i+1] - start_u) / static_cast<k3d::double_t>(Samples + 1);\n\t\t\tfor(k3d::uint_t sample = 1; sample <= (Samples+1); ++sample)\n\t\t\t{\n\t\t\t\tconst k3d::double_t u = start_u + static_cast<k3d::double_t>(sample) * step;\n\t\t\t\tsamples_u.push_back(u);\n\t\t\t\tconst k3d::point4 origin = path_arrays.evaluate(u).weighted_position;\n\t\t\t\tk3d::vector3 z = path_arrays.tangent(u, 0.5*step);\n\t\t\t\tconst k3d::uint_t mul = multiplicity(path_arrays.knots, u, 0, path_arrays.knots.size());\n\t\t\t\tk3d::double_t scaling = 1.0;\n\t\t\t\tif(mul == order-1)\n\t\t\t\t{\n\t\t\t\t\tz = k3d::normalize(0.5*(z + z_vecs.back()));\n\t\t\t\t\tscaling = std::abs(z_vecs.back() * z);\n\t\t\t\t}\n\t\t\t\tconst k3d::vector3& last_z = z_vecs.back(); // We project the coordinate system along the last z axis\n\t\t\t\tconst k3d::point3 last_y_point = dehomogenize(origins.back()) + y_vecs.back();\n\t\t\t\tconst k3d::double_t d = -((last_y_point - dehomogenize(origin))*z) / (last_z * z); // Projection distance\n\t\t\t\tconst k3d::vector3 y = k3d::normalize((last_y_point + d*last_z) - dehomogenize(origin));\n\t\t\t\tconst k3d::vector3 x = k3d::normalize(y ^ z) / scaling;\n\t\t\t\torigins.push_back(origin);\n\t\t\t\tx_vecs.push_back(x);\n\t\t\t\ty_vecs.push_back(y);\n\t\t\t\tz_vecs.push_back(z);\n\t\t\t}\n\t\t}\n\t\t// Closed curve, make sure the vectors are the same\n\t\tif(origins.front() == origins.back())\n\t\t{\n\t\t\tconst k3d::vector3 y = k3d::normalize(y_vecs.front() + y_vecs.back());\n\t\t\tconst k3d::vector3 z = k3d::normalize(z_vecs.front() + z_vecs.back());\n\t\t\tconst k3d::double_t scaling = std::abs(z * z_vecs.front());\n\t\t\tconst k3d::vector3 x = k3d::normalize(x_vecs.front() + x_vecs.back()) / scaling;\n\t\t\tx_vecs.front() = x;\n\t\t\tx_vecs.back() = x;\n\t\t\ty_vecs.front() = y;\n\t\t\ty_vecs.back() = y;\n\t\t\tz_vecs.front() = z;\n\t\t\tz_vecs.back() = z;\n\t\t}\n\n\t\tfor(k3d::uint_t swept_curve = 0; swept_curve != swept_curves_count; ++swept_curve)\n\t\t{\n\t\t\t// Store the control points of the curve to sweep in a format relative to the coordinat system around the path's first point\n\t\t\tk3d::mesh::points_t relative_points;\n\t\t\tk3d::vector3 x,y,z;\n\t\t\tk3d::point4 p = origins.front();\n\t\t\tk3d::double_t w = p[3];\n\t\t\tk3d::point3 origin(p[0]/w, p[1]/w, p[2]/w);\n\t\t\tx = k3d::normalize(x_vecs.front());\n\t\t\ty = y_vecs.front();\n\t\t\tz = z_vecs.front();\n\t\t\tk3d::mesh::points_t swept_points;\n\t\t\tk3d::mesh::weights_t swept_weights;\n\t\t\tcurve_arrays swept_arrays(InputMesh, SweptCurves, swept_curve, true);\n\t\t\tswept_arrays.points3(swept_points);\n\t\t\tswept_arrays.weights(swept_weights);\n\t\t\tconst k3d::uint_t swept_point_count = swept_arrays.points.size();\n\t\t\tif(AlignNormal)\n\t\t\t{\n\t\t\t\tk3d::point3 center(0,0,0);\n\t\t\t\tfor(k3d::uint_t i = 0; i != (swept_point_count-1); ++i)\n\t\t\t\t{\n\t\t\t\t\tcenter += k3d::to_vector(swept_points[i]);\n\t\t\t\t}\n\t\t\t\tcenter /= (swept_point_count-1);\n\t\t\t\tk3d::normal3 normal(0,0,0); // Normal calculation from polyhedron.cpp\n\t\t\t\tfor(k3d::uint_t point = 0; point != swept_point_count; ++point)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::point3& i = swept_points[point];\n\t\t\t\t\tconst k3d::point3& j = swept_points[point == (swept_point_count-1) ? 0 : point + 1];\n\n\t\t\t\t\tnormal[0] += (i[1] + j[1]) * (j[2] - i[2]);\n\t\t\t\t\tnormal[1] += (i[2] + j[2]) * (j[0] - i[0]);\n\t\t\t\t\tnormal[2] += (i[0] + j[0]) * (j[1] - i[1]);\n\t\t\t\t}\n\t\t\t\tnormal = normal.length2() ? k3d::normalize(normal) : k3d::normal3(0,0,1);\n\t\t\t\tconst k3d::vector3& path_tangent = z_vecs.front();\n\t\t\t\tconst k3d::vector3& axis = normal ^ path_tangent;\n\t\t\t\tconst k3d::double_t angle = acos(path_tangent*normal);\n\t\t\t\tk3d::matrix4 rotation = std::isnan(angle) ? k3d::identity3() : k3d::rotate3(angle, axis);\n\t\t\t\tfor(k3d::uint_t i = 0; i != swept_point_count; ++i)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::vector3 vec = rotation * (swept_points[i] - center);\n\t\t\t\t\trelative_points.push_back(k3d::point3(vec*x, vec*y, vec*z));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor(k3d::uint_t i = 0; i != swept_point_count; ++i)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::vector3 vec = swept_points[i] - origin;\n\t\t\t\t\trelative_points.push_back(k3d::point3(vec*x, vec*y, vec*z));\n\t\t\t\t}\n\t\t\t}\n\t\t\tk3d::mesh curves_mesh;\n\t\t\tcurves_mesh.points.create();\n\t\t\tcurves_mesh.point_selection.create();\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curves_prim(k3d::nurbs_curve::create(curves_mesh));\n\t\t\tcurves_prim->material = SweptCurves.material;\n\t\t\tfor(k3d::uint_t j = 0; j != relative_points.size(); ++j)\n\t\t\t{\n\t\t\t\tconst k3d::point3& rel_point = relative_points[j];\n\t\t\t\tpoints4_t samples;\n\t\t\t\tfor(k3d::uint_t i = 0; i != origins.size(); ++i)\n\t\t\t\t{\n\t\t\t\t\tp = origins[i];\n\t\t\t\t\tw = p[3];\n\t\t\t\t\torigin = k3d::point3(p[0]/w, p[1]/w, p[2]/w);\n\t\t\t\t\tx = x_vecs[i];\n\t\t\t\t\ty = y_vecs[i];\n\t\t\t\t\tz = z_vecs[i];\n\t\t\t\t\tconst k3d::vector3 vec = x*rel_point[0] + y*rel_point[1] + z*rel_point[2];\n\t\t\t\t\tconst k3d::point3 out = origin + vec;\n\t\t\t\t\tsamples.push_back(k3d::point4(out[0]*w, out[1]*w, out[2]*w, w));\n\t\t\t\t}\n\t\t\t\tk3d::mesh::points_t points_out;\n\t\t\t\tk3d::mesh::weights_t weights_out;\n\t\t\t\tapproximate(points_out, weights_out, samples_u, samples, order, path_arrays.knots);\n\t\t\t\tconst k3d::double_t swept_w = swept_weights[j];\n\t\t\t\tfor(k3d::uint_t i = 0; i != weights_out.size(); ++i)\n\t\t\t\t\tweights_out[i] *= swept_w;\n\t\t\t\treturn_if_fail(points_out.size());\n\t\t\t\tk3d::nurbs_curve::add_curve(curves_mesh, *curves_prim, order, points_out, weights_out, path_arrays.knots);\n\t\t\t}\n\t\t\tskin_curves(OutputMesh, OutputPatches, curves_mesh, *curves_prim, swept_arrays.knots, SweptCurves.curve_orders[swept_curve]);\n\t\t}\n\t}\n}\n\nvoid polygonize(k3d::mesh::points_t& Vertices, k3d::mesh::counts_t& VertexCounts, k3d::mesh::indices_t& VertexIndices, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch, const k3d::uint_t USamples, const k3d::uint_t VSamples)\n{\n\tconst k3d::uint_t u_order = InputPatches.patch_u_orders[Patch];\n\tconst k3d::uint_t u_knots_begin = InputPatches.patch_u_first_knots[Patch];\n\tconst k3d::uint_t u_knots_end = u_knots_begin + InputPatches.patch_u_point_counts[Patch] + u_order;\n\tconst k3d::mesh::knots_t::const_iterator u_it = InputPatches.patch_u_knots.begin();\n\tk3d::mesh::knots_t u_knots(u_it + u_knots_begin, u_it + u_knots_end);\n\tk3d::mesh::knots_t u_samples;\n\tsample(u_samples, u_knots, USamples);\n\n\tconst k3d::uint_t v_order = InputPatches.patch_v_orders[Patch];\n\tconst k3d::uint_t v_knots_begin = InputPatches.patch_v_first_knots[Patch];\n\tconst k3d::uint_t v_knots_end = v_knots_begin + InputPatches.patch_v_point_counts[Patch] + v_order;\n\tconst k3d::mesh::knots_t::const_iterator v_it = InputPatches.patch_v_knots.begin();\n\tk3d::mesh::knots_t v_knots(v_it + v_knots_begin, v_it + v_knots_end);\n\tstd::transform(v_knots.begin(), v_knots.end(), v_knots.begin(), knot_normalizer(v_knots.front(), v_knots.back()));\n\tk3d::mesh::knots_t v_samples;\n\tsample(v_samples, v_knots, VSamples);\n\n\tconst k3d::uint_t u_sample_count = u_samples.size();\n\tconst k3d::uint_t v_sample_count = v_samples.size();\n\n\tfor(k3d::uint_t j = 0; j != v_sample_count; ++j)\n\t{\n\t\tconst k3d::double_t v = v_samples[j];\n\t\tk3d::mesh curve_mesh;\n\t\tcurve_mesh.points.create();\n\t\tcurve_mesh.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curve(k3d::nurbs_curve::create(curve_mesh));\n\t\textract_patch_curve_by_parameter(curve_mesh, *curve, InputMesh, InputPatches, Patch, v, true);\n\t\tcurve_arrays curve_arr(curve_mesh, *curve, 0);\n\t\tfor(k3d::uint_t i = 0; i != u_sample_count; ++i)\n\t\t{\n\t\t\tconst k3d::double_t u = u_samples[i];\n\t\t\tVertices.push_back(curve_arr.evaluate(u).position());\n\t\t}\n\t}\n\tfor(k3d::uint_t j = 0; j != v_sample_count-1; ++j)\n\t{\n\t\tfor(k3d::uint_t i = 0; i != u_sample_count-1; ++i)\n\t\t{\n\t\t\tVertexIndices.push_back(j*u_sample_count+i);\n\t\t\tVertexIndices.push_back(j*u_sample_count+i+1);\n\t\t\tVertexIndices.push_back((j+1)*u_sample_count+i+1);\n\t\t\tVertexIndices.push_back((j+1)*u_sample_count+i);\n\t\t\tVertexCounts.push_back(4);\n\t\t}\n\t}\n}\n\nvoid extract_trim_curve(k3d::mesh::points_t& Points, k3d::mesh::weights_t& Weights, k3d::mesh::knots_t& Knots, const k3d::nurbs_patch::const_primitive& NurbsPatches, const k3d::uint_t Patch, const k3d::uint_t Curve)\n{\n\tconst k3d::uint_t points_begin = NurbsPatches.curve_first_points[Curve];\n\tconst k3d::uint_t points_count = NurbsPatches.curve_point_counts[Curve];\n\tconst k3d::uint_t points_end = points_begin + points_count;\n\tfor(k3d::uint_t point = points_begin; point != points_end; ++point)\n\t{\n\t\tconst k3d::point2& p = NurbsPatches.points[NurbsPatches.curve_points[point]];\n\t\tPoints.push_back(k3d::point3(p[0], p[1], 0));\n\t\tWeights.push_back(NurbsPatches.curve_point_weights[point]);\n\t}\n\tconst k3d::uint_t knots_begin = NurbsPatches.curve_first_knots[Curve];\n\tconst k3d::uint_t knots_end = knots_begin + points_count + NurbsPatches.curve_orders[Curve];\n\tfor(k3d::uint_t k = knots_begin; k != knots_end; ++k)\n\t{\n\t\tKnots.push_back(NurbsPatches.curve_knots[k]);\n\t}\n}\n\nconst k3d::point4 evaluate_position(const k3d::mesh& Mesh, const k3d::nurbs_patch::const_primitive& Patches, const k3d::uint_t Patch, const k3d::double_t U, const k3d::double_t V)\n{\n\tk3d::mesh curve_mesh;\n\tcurve_mesh.points.create();\n\tcurve_mesh.point_selection.create();\n\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curve_prim(k3d::nurbs_curve::create(curve_mesh));\n\textract_patch_curve_by_parameter(curve_mesh, *curve_prim, Mesh, Patches, Patch, U, false);\n\tk3d::mesh::points_t curve_points;\n\tk3d::mesh::weights_t curve_weights;\n\tk3d::mesh::knots_t curve_knots;\n\tk3d::table curve_point_attributes;\n\tcurve_arrays curve(curve_mesh, *curve_prim, 0, true);\n\treturn curve.evaluate(V).weighted_position;\n}\n\nvoid trim_to_nurbs(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch, const k3d::uint_t Samples)\n{\n\tconst k3d::uint_t loops_begin = InputPatches.patch_first_trim_loops[Patch];\n\tconst k3d::uint_t loops_end = InputPatches.patch_trim_loop_counts[Patch] + loops_begin;\n\tconst k3d::uint_t u_order = InputPatches.patch_u_orders[Patch];\n\tconst k3d::uint_t v_order = InputPatches.patch_v_orders[Patch];\n\tconst k3d::double_t umin = InputPatches.patch_u_knots[InputPatches.patch_u_first_knots[Patch]];\n\tconst k3d::double_t urange = InputPatches.patch_u_knots[InputPatches.patch_u_first_knots[Patch] + InputPatches.patch_u_point_counts[Patch] + u_order - 1] - umin;\n\tconst k3d::double_t vmin = InputPatches.patch_v_knots[InputPatches.patch_v_first_knots[Patch]];\n\tconst k3d::double_t vrange = InputPatches.patch_v_knots[InputPatches.patch_v_first_knots[Patch] + InputPatches.patch_v_point_counts[Patch] + v_order - 1] - vmin;\n\tfor(k3d::uint_t loop = loops_begin; loop != loops_end; ++loop)\n\t{\n\t\tconst k3d::uint_t curves_begin = InputPatches.trim_loop_first_curves[loop];\n\t\tconst k3d::uint_t curves_end = curves_begin + InputPatches.trim_loop_curve_counts[loop];\n\t\tfor(k3d::uint_t curve = curves_begin; curve != curves_end; ++curve)\n\t\t{\n\t\t\tk3d::mesh::points_t trim_points;\n\t\t\tk3d::mesh::weights_t trim_weights;\n\t\t\tk3d::mesh::knots_t trim_knots;\n\t\t\tconst k3d::uint_t order = InputPatches.curve_orders[curve];\n\t\t\textract_trim_curve(trim_points, trim_weights, trim_knots, InputPatches, Patch, curve);\n\t\t\tk3d::mesh tmp_mesh;\n\t\t\ttmp_mesh.points.create();\n\t\t\ttmp_mesh.point_selection.create();\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> tmp_curve(k3d::nurbs_curve::create(tmp_mesh));\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> elevated_curves(k3d::nurbs_curve::create(tmp_mesh));\n\t\t\ttmp_curve->material.push_back(0);\n\t\t\televated_curves->material.push_back(0);\n\t\t\tk3d::nurbs_curve::add_curve(tmp_mesh, *tmp_curve, order, trim_points, trim_weights, trim_knots);\n\t\t\tconst k3d::uint_t max_order = std::max(u_order,v_order);\n\t\t\tconst k3d::uint_t elevations = order < max_order ? max_order - order : 0;\n\t\t\televate_curve_degree(tmp_mesh, *elevated_curves, tmp_mesh, *tmp_curve, 0, elevations);\n\t\t\tcurve_arrays el_curve(tmp_mesh, *elevated_curves, 0, true);\n\t\t\tk3d::mesh::knots_t u_samples;\n\t\t\tsample(u_samples, el_curve.knots, Samples);\n\t\t\tconst k3d::uint_t samples_end = u_samples.size();\n\t\t\tpoints4_t sample_points;\n\t\t\tfor(k3d::uint_t sample = 0; sample != samples_end; ++sample)\n\t\t\t{\n\t\t\t\tcurve_arrays::curve_value val = el_curve.evaluate(u_samples[sample]);\n\t\t\t\tconst k3d::point3 p = val.position();\n\t\t\t\tsample_points.push_back(val.weight() * evaluate_position(InputMesh, InputPatches, Patch, (p[0]-umin)/urange, (p[1]-vmin)/vrange));\n\t\t\t}\n\t\t\tk3d::mesh::points_t curve_points;\n\t\t\tk3d::mesh::weights_t curve_weights;\n\t\t\tapproximate(curve_points, curve_weights, u_samples, sample_points, max_order, el_curve.knots);\n\t\t\treturn_if_fail(curve_points.size());\n\t\t\tk3d::nurbs_curve::add_curve(OutputMesh, OutputCurves, max_order, curve_points, curve_weights, el_curve.knots);\n\t\t\tif(OutputCurves.material.empty())\n\t\t\t\tOutputCurves.material.push_back(InputPatches.patch_materials[Patch]);\n\t\t}\n\t}\n}\n\n} //namespace nurbs\n\n} //namespace module\n"
  },
  {
    "path": "modules/nurbs/nurbs_patches.h",
    "content": "#ifndef MODULES_NURBS_NURBS_PATCHES_H\n#define MODULES_NURBS_NURBS_PATCHES_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n  \\author Carsten Haubold (CarstenHaubold@web.de)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/table.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n#include <stdexcept>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\n// forward declarations\nclass curve_arrays;\n\n/// Encapsulates the control point positions, weights and attributes for a single patch\nstruct patch_point_data\n{\n\tpatch_point_data() {}\n\tpatch_point_data(const k3d::mesh& Mesh, const k3d::nurbs_patch::const_primitive& Primitive, const k3d::uint_t Patch);\n\tpatch_point_data(const k3d::uint_t Size);\n\tconst k3d::bool_t validate() const;\n\n\tk3d::mesh::points_t points;\n\tk3d::mesh::weights_t weights;\n\tk3d::table point_attributes;\n\tk3d::table vertex_attributes;\n};\n\n/// Copy structure and attributes between patch point data structures\n/**\n * Convenient copying class that treats points, weights point attributes and vertex attributes in one go.\n */\nclass point_data_copier\n{\npublic:\n\tpoint_data_copier(const patch_point_data& Source, patch_point_data& Destination);\n\t/// Appends the given index value from each source array to each corresponding target array.\n\tvoid push_back(const k3d::uint_t Index);\n\t/// Computes a weighted sum of N values from each source array and appends the result to the corresponding target array.\n\tvoid push_back(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights);\n\t/// Copies the given source index value from each source array to the TargetIndex in each corresponding target array.\n\tvoid copy(const k3d::uint_t SourceIndex, const k3d::uint_t TargetIndex);\n\t/// Computes a weighted sum of N values from each source array and copies the result to the corresponding target array at the given TargetIndex.\n\tvoid copy(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights, const k3d::uint_t TargetIndex);\nprivate:\n\tconst patch_point_data& m_source;\n\tpatch_point_data& m_destination;\n\tboost::scoped_ptr<k3d::table_copier> m_point_attribute_copier;\n\tboost::scoped_ptr<k3d::table_copier> m_vertex_attribute_copier;\n};\n\n/// Copy from curve data to patch data\nclass curve_point_data_copier\n{\npublic:\n\tcurve_point_data_copier(const curve_arrays& Source, patch_point_data& Destination);\n\t/// Appends the given index value from each source array to each corresponding target array.\n\tvoid push_back(const k3d::uint_t Index);\n\t/// Computes a weighted sum of N values from each source array and appends the result to the corresponding target array.\n\tvoid push_back(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights);\n\t/// Copies the given source index value from each source array to the TargetIndex in each corresponding target array.\n\tvoid copy(const k3d::uint_t SourceIndex, const k3d::uint_t TargetIndex);\n\t/// Computes a weighted sum of N values from each source array and copies the result to the corresponding target array at the given TargetIndex.\n\tvoid copy(const k3d::uint_t Count, const k3d::uint_t* Indices, const k3d::double_t* Weights, const k3d::uint_t TargetIndex);\nprivate:\n\tconst curve_arrays& m_source;\n\tpatch_point_data& m_destination;\n\tboost::scoped_ptr<k3d::table_copier> m_point_attribute_copier;\n\tboost::scoped_ptr<k3d::table_copier> m_vertex_attribute_copier;\n};\n\n/// Extract and store patch and parameter attributes for a single patch\nstruct patch_attribute_tables\n{\n\tpatch_attribute_tables(const k3d::nurbs_patch::const_primitive& Primitive, const k3d::uint_t Patch);\n\tk3d::table patch_attributes;\n\tk3d::table parameter_attributes;\n};\n\n/// Adds a patch with the given points, weights and knots\nvoid add_patch(k3d::mesh& Mesh,\n\t\tk3d::nurbs_patch::primitive& NurbsPatches,\n\t\tconst patch_point_data& PointData,\n\t\tconst k3d::mesh::knots_t& UKnots,\n\t\tconst k3d::mesh::knots_t& VKnots,\n\t\tconst k3d::uint_t UOrder,\n\t\tconst k3d::uint_t VOrder,\n\t\tconst k3d::table& PatchAttributes = k3d::table(),\n\t\tconst k3d::table& ParameterAttributes = k3d::table());\n\n/// Copies a patch from one primitive to another\nvoid copy_patch(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch);\n\nvoid add_trim_curve(k3d::nurbs_patch::primitive& OutputPatches, const k3d::uint_t Patch, const k3d::mesh::points_2d_t& Points, const k3d::mesh::weights_t& Weights, const k3d::mesh::knots_t& Knots, const k3d::uint_t Order, const k3d::double_t UOffset = 0, const k3d::double_t VOffset = 0, const k3d::double_t UScale = 1, const k3d::double_t VScale = 1);\n\n/// Creates a bilinear patch between the given corner points (in counter-clockwise order)\nvoid create_bilinear_patch(k3d::mesh& OutputMesh,\n\t\tk3d::nurbs_patch::primitive& OutputPatches,\n\t\tconst patch_point_data& PointData,\n\t\tconst k3d::table& PatchAttributes,\n\t\tconst k3d::table& ParameterAttributes);\n\n/// Traverse each selected curve in SourceCurves along each selected curve in CurvesToTraverse\nvoid traverse_curve(const k3d::mesh& SourceCurves, const k3d::mesh& CurvesToTraverse, k3d::mesh& OutputMesh);\n\n/// Traverse curves in the source mesh stored in the primitive given by SourcePrimIdx, storing the resulting patches in the given patch primitives\nvoid traverse_curve(const k3d::mesh& SourceCurves, const k3d::uint_t SourcePrimIdx, const k3d::mesh& CurvesToTraverse, k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches);\n\n/// Extract a curve by curve number from the given patch, appending it to the output structures.\n/**\n * \\param Curve The number of the curve to extract, where the numbering goes by the control point count in the specified direction\n */\nvoid extract_patch_curve_by_number(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurve, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch, const k3d::uint_t Curve, const k3d::bool_t UDirection);\n\n/// Extract a curve by parameter from the given patch\n/**\n * \\param U The parameter value in the normalized interval [0, 1], U or V depending on the specified direction\n */\nvoid extract_patch_curve_by_parameter(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurve, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch, const k3d::double_t U, const k3d::bool_t UDirection);\n\n/// Elevate patch degree by the requested number of elevations\nvoid elevate_patch_degree(const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::uint_t Patch, const k3d::uint_t Elevations, const k3d::bool_t UDirection);\n\n/// Insert a knot in one directrion of the patch\nvoid insert_knot(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, k3d::uint_t Patch, const k3d::double_t u, const k3d::uint_t r, const k3d::bool_t UDirection);\n\n/// Splits the patch at the requested parameter value u\nvoid split_patch(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, k3d::uint_t Patch, const k3d::double_t u, const k3d::bool_t UDirection);\n\n/// Revolves a curve around an axis\nvoid revolve_curve(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Curve, const k3d::axis Axis, const k3d::double_t Angle, const k3d::uint_t Segments);\n\n/// Creates a ruled surface between two curves.\n/**\n * Prerequisites: - NurbsCurves must contain exactly two curves\n *                - The curves must be compatible, i.e. have the same knot vector and order\n */\nvoid ruled_surface(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t Order, const k3d::uint_t Segments);\n\n/// Creates a Coons surface between 4 curves\n/**\n * InputCurves must contain 4 curves, and the parameters U1, U2, V1, V2 indicate which curves\n * span the patch in the U and V direction. Each U and V curve must have a common endpoint\n */\nvoid coons_patch(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t U1 = 0, const k3d::uint_t V1 = 1, const k3d::uint_t U2 = 2, const k3d::uint_t V2 = 3);\n\n/// Extracts a coordinate system and the points parametric coordinates from a point cloud, based on the \"mean\" normal of the points\nvoid extract_plane(k3d::point3& Origin, k3d::normal3& Normal, k3d::vector3& U, k3d::vector3& V, k3d::mesh::points_2d_t& ParameterPoints, const k3d::mesh::points_t& Points, const k3d::double_t UOffset = 0.0);\n\n/// Helper function to extract a 2D bounding box\nvoid bbox2(k3d::point2& Min, k3d::point2& Max, const k3d::mesh::points_2d_t& Points);\n\n/// Skinned surface between the curves in the given primitive\nvoid skin_curves(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_curve::primitive& InputCurves, const k3d::mesh::knots_t VKnots, const k3d::uint_t VOrder);\n\n/// Sweeps the curves in SweepedCurves along the curves in Paths\n/**\n * Algorithm: Each control point on the curve to sweep is traced along the convex hull of the path.\n * This is done by projecting the control points on planes that bisect the convex hull of the path,\n * or planes normal to the path in the case of the start and end points.\n */\nvoid sweep(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& SweptCurves, const k3d::nurbs_curve::const_primitive& Paths, const k3d::uint_t Samples, const k3d::bool_t AlignNormal);\n\n/// Store a polygon apprimation of a NURBS patch\nvoid polygonize(k3d::mesh::points_t& Vertices, k3d::mesh::counts_t& VertexCounts, k3d::mesh::indices_t& VertexIndices, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch, const k3d::uint_t USamples, const k3d::uint_t VSamples);\n\n/// Extract the trim curve with the given number into the supplied arrays, where the 2D UV points are stored in the X and Y coordinates of the output point array\nvoid extract_trim_curve(k3d::mesh::points_t& Points, k3d::mesh::weights_t& Weights, k3d::mesh::knots_t& Knots, const k3d::nurbs_patch::const_primitive& NurbsPatches, const k3d::uint_t Patch, const k3d::uint_t Curve);\n\n/// Converts the trim curves in a patch to 3D NURBS curves\nvoid trim_to_nurbs(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t Patch, const k3d::uint_t Samples);\n\n} //namespace nurbs\n\n} //namespace module\n\n#endif // !MODULES_NURBS_NURBS_PATCHES_H\n"
  },
  {
    "path": "modules/nurbs/patch_degree_elevation.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass patch_degree_elevation :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tpatch_degree_elevation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_degree(init_owner(*this) + init_name(_(\"degree\")) + init_label(_(\"Degree\")) + init_description(_(\"The current degree will be increased by the amount you specified here\")) + init_constraint(constraint::minimum(1 , constraint::maximum(3))) + init_value(1)),\n\t\tm_insert_to_v(init_owner(*this) + init_name(_(\"insert_to_v\")) + init_label(_(\"Elevate v? Otherwise u\")) + init_description(_(\"By default the u direction gets elevated, by checking this box you choose to elevate v\")) + init_value(false))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_degree.changed_signal().connect(make_update_mesh_slot());\n\t\tm_insert_to_v.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tmodify_selected_patches(Input, Output, degree_elevator(m_degree.pipeline_value(), !m_insert_to_v.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<patch_degree_elevation, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0xe7f334cc, 0x55483bfc, 0x5f2ed290, 0xa0009176),\n\t\t  \"NurbsPatchDegreeElevation\",\n\t\t  _(\"Elevates the selected patches in either u or v direction\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprivate:\n\tstruct degree_elevator\n\t{\n\t\tdegree_elevator(const k3d::uint_t Elevations, const k3d::bool_t UDirection) : elevations(Elevations), u_direction(UDirection) {}\n\t\tvoid operator()(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t& Patch)\n\t\t{\n\t\t\televate_patch_degree(InputMesh, InputPatches, OutputMesh, OutputPatches, Patch, elevations, u_direction);\n\t\t}\n\t\tconst k3d::uint_t elevations;\n\t\tconst k3d::bool_t u_direction;\n\t};\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_degree;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_insert_to_v;\n};\n\nk3d::iplugin_factory& patch_degree_elevation_factory()\n{\n\treturn patch_degree_elevation::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/patch_insert_knot.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass patch_insert_knot :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tpatch_insert_knot(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_u_value(init_owner(*this) + init_name(_(\"u_value\")) + init_label(_(\"u/v value of new knot\")) + init_description(_(\"Insert knot at [0,1]\")) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(0.0 , constraint::maximum(1.0))) + init_value(0.5)),\n\t\tm_multiplicity(init_owner(*this) + init_name(_(\"multiplicity\")) + init_label(_(\"Multiplicity\")) + init_description(_(\"Multiplicity\")) + init_constraint(constraint::minimum(1 , constraint::maximum(3))) + init_value(1)),\n\t\tm_insert_to_v(init_owner(*this) + init_name(_(\"insert_to_v\")) + init_label(_(\"Insert knot in v? Otherwise u\")) + init_description(_(\"By default the knot gets inserted into the patch in u direction, by checking this box you choose to insert it to v\")) + init_value(false))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_u_value.changed_signal().connect(make_update_mesh_slot());\n\t\tm_multiplicity.changed_signal().connect(make_update_mesh_slot());\n\t\tm_insert_to_v.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tmodify_selected_patches(Input, Output, knot_inserter(m_u_value.pipeline_value(), m_multiplicity.pipeline_value(), !m_insert_to_v.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<patch_insert_knot, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0xc250f185, 0xff4ac282, 0xd9b60c8a, 0x15c58b1c),\n\t\t  \"NurbsPatchInsertKnot\",\n\t\t  _(\"Adds a new knot in either u or v direction to all selected patches\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprivate:\n\tstruct knot_inserter\n\t{\n\t\tknot_inserter(const k3d::double_t Parameter, const k3d::uint_t Multiplicity, const k3d::bool_t UDirection) : parameter(Parameter), multiplicity(Multiplicity), u_direction(UDirection) {}\n\t\tvoid operator()(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t& Patch)\n\t\t{\n\t\t\tinsert_knot(OutputMesh, OutputPatches, InputMesh, InputPatches, Patch, parameter, multiplicity, u_direction);\n\t\t}\n\t\tconst k3d::double_t parameter;\n\t\tconst k3d::uint_t multiplicity;\n\t\tconst k3d::bool_t u_direction;\n\t};\n\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_value;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_multiplicity;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_insert_to_v;\n};\n\nk3d::iplugin_factory& patch_insert_knot_factory()\n{\n\treturn patch_insert_knot::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/polygonize_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass polygonize_curve :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tpolygonize_curve(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_segments(init_owner(*this) + init_name(_(\"segments\")) + init_label(_(\"Segments\")) + init_description(_(\"Segments per knot interval. The more segments the better the result\")) + init_value(10) + init_constraint(constraint::minimum(1))),\n\t\tm_delete_original(init_owner(*this) + init_name(_(\"delete_original\")) + init_label(_(\"Delete original?\")) + init_description(_(\"Delete original NURBS curve?\")) + init_value(true))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_segments.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_delete_original.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tif(!Output.points.get())\n\t\t\treturn;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tboost::scoped_ptr<k3d::linear_curve::primitive> curves(k3d::linear_curve::create(Output));\n\t\tvisit_selected_curves(Output, curve_polygonizer(Output, *curves, m_segments.pipeline_value()));\n\n\t\tif(m_delete_original.pipeline_value())\n\t\t{\n\t\t\tdelete_selected_curves(Output);\n\t\t}\n\t\tdelete_empty_primitives(Output);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<polygonize_curve, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x24074c75, 0x8d45f52f, 0xbd470ea5, 0x05bc9752),\n\t\t  \"NurbsPolygonizeCurve\",\n\t\t  _(\"Creates a LinearCurve representation of the selected NURBS curve\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tstruct curve_polygonizer\n\t{\n\t\tcurve_polygonizer(k3d::mesh& Mesh, k3d::linear_curve::primitive& Curves, const k3d::uint_t Samples) : mesh(Mesh), curves(Curves), samples(Samples) {}\n\t\tk3d::mesh& mesh;\n\t\tk3d::linear_curve::primitive& curves;\n\t\tconst k3d::uint_t samples;\n\t\tvoid operator()(const k3d::mesh& Mesh, const k3d::nurbs_curve::const_primitive& Curves, const k3d::uint_t& Curve)\n\t\t{\n\t\t\tpolygonize(mesh, curves, Mesh, Curves, Curve, samples);\n\t\t\tcurves.material.back() = Curves.material.back();\n\t\t}\n\n\t};\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_segments;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_delete_original;\n};\n\nk3d::iplugin_factory& polygonize_curve_factory()\n{\n\treturn polygonize_curve::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/polygonize_patch.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass polygonize_patch :\n\t\t\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tpolygonize_patch(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\t\tbase(Factory, Document),\n\t\t\tm_u_samples(init_owner(*this) + init_name(_(\"u_samples\")) + init_label(_(\"U Samples\")) + init_description(_(\"Samples per knot interval in the U direction. More is better\")) + init_value(5) + init_constraint(constraint::minimum(1))),\n\t\t\tm_v_samples(init_owner(*this) + init_name(_(\"v_samples\")) + init_label(_(\"V Samples\")) + init_description(_(\"Samples per knot interval in the V direction. More is better\")) + init_value(5) + init_constraint(constraint::minimum(1))),\n\t\t\tm_delete_orig(init_owner(*this) + init_name(_(\"delete_orig\")) + init_label(_(\"Delete original?\")) + init_description(_(\"Delete original NURBS curve?\")) + init_value(true))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_u_samples.changed_signal().connect(make_update_mesh_slot());\n\t\tm_v_samples.changed_signal().connect(make_update_mesh_slot());\n\t\tm_delete_orig.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tk3d::mesh temp = Input;\n\t\tif(!temp.points.get())\n\t\t\treturn;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), temp);\n\t\tOutput = temp;\n\t\tOutput.primitives.clear();\n\n\t\tconst k3d::uint_t u_samples = m_u_samples.pipeline_value();\n\t\tconst k3d::uint_t v_samples = m_v_samples.pipeline_value();\n\n\t\tconst k3d::uint_t prim_count = temp.primitives.size();\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != prim_count; ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> patches(k3d::nurbs_patch::validate(temp, *temp.primitives[prim_idx]));\n\t\t\tif(patches)\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> output_patches(k3d::nurbs_patch::create(Output));\n\t\t\t\tk3d::mesh::points_t vertices;\n\t\t\t\tk3d::mesh::counts_t vertex_counts;\n\t\t\t\tk3d::mesh::indices_t vertex_indices;\n\t\t\t\tfor(k3d::uint_t patch = 0; patch != patches->patch_first_points.size(); ++patch)\n\t\t\t\t{\n\t\t\t\t\t// Copy existing patches, if required\n\t\t\t\t\tif(!patches->patch_selections[patch] || !m_delete_orig.pipeline_value())\n\t\t\t\t\t\tcopy_patch(Output, *output_patches, temp, *patches, patch);\n\t\t\t\t\tif(patches->patch_selections[patch])\n\t\t\t\t\t{\n\t\t\t\t\t\tpolygonize(vertices, vertex_counts, vertex_indices, temp, *patches, patch, u_samples, v_samples);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(!vertices.empty())\n\t\t\t\t{\n\t\t\t\t\treturn_if_fail(patches->patch_materials.size());\n\t\t\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output, vertices, vertex_counts, vertex_indices, patches->patch_materials.front()));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tOutput.primitives.push_back(temp.primitives[prim_idx]);\n\t\t\t}\n\t\t}\n\t\tdelete_empty_primitives(Output);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<polygonize_patch, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x84f89545, 0x2746be1b, 0x045df3b0, 0x539eee95),\n\t\t  \"NurbsPolygonizePatch\",\n\t\t  _(\"Creates a Polyhedron representation of the selected NURBS patch\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_u_samples;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_v_samples;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_delete_orig;\n};\n\nk3d::iplugin_factory& polygonize_patch_factory()\n{\n\treturn polygonize_patch::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/revolve_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass revolve_curve :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\trevolve_curve(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_angle(init_owner(*this) + init_name(\"angle\") + init_label(_(\"angle\")) + init_description(_(\"The curve will be rotated to this angle, specify 360 for a closed shape\")) + init_value(k3d::radians(360.0)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_segments(init_owner(*this) + init_name(\"segments\") + init_label(_(\"segments\")) + init_description(_(\"Segments\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_around(init_owner(*this) + init_name(\"around\") + init_label(_(\"Around\")) + init_description(_(\"Axis to revolve around\")) + init_value(k3d::Z) + init_enumeration(k3d::axis_values())),\n\t\tm_delete_original(init_owner(*this) + init_name(_(\"delete_original\")) + init_label(_(\"Delete the Curve\")) + init_description(_(\"Delete the original curve\")) + init_value(true))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_angle.changed_signal().connect(make_update_mesh_slot());\n\t\tm_segments.changed_signal().connect(make_update_mesh_slot());\n\t\tm_around.changed_signal().connect(make_update_mesh_slot());\n\t\tm_delete_original.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != Input.primitives.size(); ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> curves_prim(k3d::nurbs_curve::validate(Output, *Output.primitives[prim_idx]));\n\t\t\tif(!curves_prim)\n\t\t\t\tcontinue;\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> patches_prim;\n\t\t\tfor(k3d::uint_t curve = 0; curve != curves_prim->curve_first_points.size(); ++curve)\n\t\t\t{\n\t\t\t\tif(curves_prim->curve_selections[curve])\n\t\t\t\t{\n\t\t\t\t\tpatches_prim.reset(k3d::nurbs_patch::create(Output));\n\t\t\t\t\tmodule::nurbs::revolve_curve(Output, *patches_prim, Input, *curves_prim, curve, m_around.pipeline_value(), m_angle.pipeline_value(), m_segments.pipeline_value());\n\t\t\t\t\tpatches_prim->constant_attributes = curves_prim->constant_attributes.clone();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(m_delete_original.pipeline_value())\n\t\t{\n\t\t\tdelete_selected_curves(Output);\n\t\t\tdelete_empty_primitives(Output);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<revolve_curve, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x973e535d, 0x434f2e26, 0x0f41d280, 0x2b79350b),\n\t\t  \"NurbsRevolveCurve\",\n\t\t  _(\"Take a NURBS curve and rotate it around one of the coordinate system axis\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_angle;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_segments;\n\tk3d_data(k3d::axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_around;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_delete_original;\n};\n\n//Create connect_curve factory\nk3d::iplugin_factory& revolve_curve_factory()\n{\n\treturn revolve_curve::get_factory();\n}\n\n} // namespace nurbs\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/nurbs/ruled_surface.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass ruled_surface :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\truled_surface(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_flip(init_owner(*this) + init_name(_(\"flip\")) + init_label(_(\"flip\")) + init_description(_(\"Flip one of the curves before creating the surface\")) + init_value(false)),\n\t\tm_delete_original(init_owner(*this) + init_name(_(\"delete_original\")) + init_label(_(\"Delete the Curves\")) + init_description(_(\"Delete the original curves\")) + init_value(true)),\n\t\tm_order(init_owner(*this) + init_name(\"order\") + init_label(_(\"Order\")) + init_description(_(\"Order in the linear direction\")) + init_value(2) + init_constraint(constraint::minimum(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_segments(init_owner(*this) + init_name(\"segments\") + init_label(_(\"Segments\")) + init_description(_(\"Number of segments for the linear direction\")) + init_value(1) + init_constraint(constraint::minimum(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_flip.changed_signal().connect(make_update_mesh_slot());\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_delete_original.changed_signal().connect(make_update_mesh_slot());\n\t\tm_order.changed_signal().connect(make_update_mesh_slot());\n\t\tm_segments.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\treturn_if_fail(m_order.pipeline_value() <= (m_segments.pipeline_value() + 1));\n\n\t\t// Make sure the curves are compatible first\n\t\tk3d::double_t order;\n\t\tvisit_selected_curves(Output, max_order_calculator(order));\n\t\tk3d::mesh elevated_mesh = Output;\n\t\tmodify_selected_curves(Input, elevated_mesh, degree_elevator(order));\n\t\tk3d::mesh::knots_t knots;\n\t\tvisit_selected_curves(elevated_mesh, knot_vector_calculator(knots));\n\t\tk3d::mesh compatible_mesh;\n\t\tcompatible_mesh.points.create();\n\t\tcompatible_mesh.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> compatible_curves(k3d::nurbs_curve::create(compatible_mesh));\n\t\tknot_vector_merger merger(knots, order);\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != elevated_mesh.primitives.size(); ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> input_curves(k3d::nurbs_curve::validate(elevated_mesh, *elevated_mesh.primitives[prim_idx]));\n\t\t\tif(!input_curves)\n\t\t\t\tcontinue;\n\t\t\tif(compatible_curves->material.empty())\n\t\t\t\tcompatible_curves->material.push_back(input_curves->material.back());\n\t\t\tfor(k3d::uint_t curve = 0; curve != input_curves->curve_first_points.size(); ++curve)\n\t\t\t{\n\t\t\t\tif(input_curves->curve_selections[curve])\n\t\t\t\t\tmerger(compatible_mesh, *compatible_curves, elevated_mesh, *input_curves, curve);\n\t\t\t}\n\t\t}\n\t\tif(compatible_curves->curve_first_points.size() != 2)\n\t\t{\n\t\t\tk3d::log() << error << \"You must select exactly 2 curves. Number of selected curves: \" << compatible_curves->curve_first_points.size() << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tif(m_flip.pipeline_value())\n\t\t{\n\t\t\tflip_curve(*compatible_curves, 1);\n\t\t}\n\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> output_patches(k3d::nurbs_patch::create(Output));\n\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_compatible_curves(k3d::nurbs_curve::validate(compatible_mesh, *compatible_mesh.primitives.front()));\n\t\tmodule::nurbs::ruled_surface(Output, *output_patches, compatible_mesh, *const_compatible_curves, m_order.pipeline_value(), m_segments.pipeline_value());\n\n\t\tif(m_delete_original.pipeline_value())\n\t\t{\n\t\t\tdelete_selected_curves(Output);\n\t\t\tdelete_empty_primitives(Output);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<ruled_surface, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x8114ebd9, 0xe74aa420, 0xf7503b98, 0x640f7e0d),\n\t\t  \"NurbsRuledSurface\",\n\t\t  _(\"Creates a NURBS surface stretched between the 2 curves\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_flip;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_delete_original;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_order;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_segments;\n};\n\nk3d::iplugin_factory& ruled_surface_factory()\n{\n\treturn ruled_surface::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/set_weight.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass set_weight :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tset_weight(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_weight(init_owner(*this) + init_name(\"weight\") + init_label(_(\"Weight\")) + init_description(_(\"The new weight for the selected points\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_weight.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tif(!Output.points.get())\n\t\t\treturn;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tconst k3d::double_t weight = m_weight.pipeline_value();\n\t\tconst k3d::uint_t primitives_count = Output.primitives.size();\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != primitives_count; ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> patch_prim(k3d::nurbs_patch::validate(Output, Output.primitives[prim_idx]));\n\t\t\tif(patch_prim)\n\t\t\t{\n\t\t\t\tfor(k3d::uint_t patch = 0; patch != patch_prim->patch_first_points.size(); ++patch)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t points_begin = patch_prim->patch_first_points[patch];\n\t\t\t\t\tconst k3d::uint_t points_end = points_begin + patch_prim->patch_u_point_counts[patch] * patch_prim->patch_v_point_counts[patch];\n\t\t\t\t\tfor(k3d::uint_t i = points_begin; i != points_end; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tpatch_prim->patch_point_weights[i] = k3d::mix(patch_prim->patch_point_weights[i], weight, Output.point_selection->at(patch_prim->patch_points[i]));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curve_prim(k3d::nurbs_curve::validate(Output, Output.primitives[prim_idx]));\n\t\t\t\tif(curve_prim)\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::uint_t curve = 0; curve != curve_prim->curve_first_points.size(); ++curve)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t points_begin = curve_prim->curve_first_points[curve];\n\t\t\t\t\t\tconst k3d::uint_t points_end = points_begin + curve_prim->curve_point_counts[curve];\n\t\t\t\t\t\tfor(k3d::uint_t i = points_begin; i != points_end; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcurve_prim->curve_point_weights[i] = k3d::mix(curve_prim->curve_point_weights[i], weight, Output.point_selection->at(curve_prim->curve_points[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<set_weight, k3d::interface_list<k3d::imesh_source , k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x6e08996d, 0xde494dd8, 0xb80bc3b0, 0x4d029bad),\n\t\t  \"NurbsSetWeight\",\n\t\t  _(\"Sets the weight of the selected Control Points\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, no_serialization) m_weight;\n};\n\nk3d::iplugin_factory& set_weight_factory()\n{\n\treturn set_weight::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/skinned_surface.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass skinned_surface :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tskinned_surface(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_delete_original(init_owner(*this) + init_name(_(\"delete_original\")) + init_label(_(\"Delete the Curves\")) + init_description(_(\"Delete the original curves\")) + init_value(true)),\n\t\tm_order(init_owner(*this) + init_name(\"order\") + init_label(_(\"Order\")) + init_description(_(\"Order in the direction normal to the curves (V)\")) + init_value(3) + init_constraint(constraint::minimum(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_delete_original.changed_signal().connect(make_update_mesh_slot());\n\t\tm_order.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tif(!Output.points.get())\n\t\t\treturn;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> output_patches(k3d::nurbs_patch::create(Output));\n\n\t\t// Get the selected curves\n\t\tk3d::mesh selected_curves_mesh;\n\t\tselected_curves_mesh.points.create();\n\t\tselected_curves_mesh.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> selected_curves(k3d::nurbs_curve::create(selected_curves_mesh));\n\t\tselected_curves->material.push_back(0);\n\t\tvisit_selected_curves(Output, selected_curve_extractor(selected_curves_mesh, *selected_curves));\n\n\t\t// Make them compatible\n\t\tk3d::double_t order;\n\t\tvisit_selected_curves(selected_curves_mesh, max_order_calculator(order));\n\t\tk3d::mesh elevated_mesh = selected_curves_mesh;\n\t\tmodify_selected_curves(selected_curves_mesh, elevated_mesh, degree_elevator(order));\n\t\tk3d::mesh::knots_t knots;\n\t\tvisit_selected_curves(elevated_mesh, knot_vector_calculator(knots));\n\t\tk3d::mesh compatible_mesh;\n\t\tcompatible_mesh.points.create();\n\t\tcompatible_mesh.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> compatible_curves(k3d::nurbs_curve::create(compatible_mesh));\n\t\tknot_vector_merger merger(knots, order);\n\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> input_curves(k3d::nurbs_curve::validate(elevated_mesh, *elevated_mesh.primitives.back()));\n\t\tcompatible_curves->material = input_curves->material;\n\t\tconst k3d::uint_t curve_count = input_curves->curve_first_points.size();\n\t\tfor(k3d::uint_t curve = 0; curve != curve_count; ++curve)\n\t\t{\n\t\t\tmerger(compatible_mesh, *compatible_curves, elevated_mesh, *input_curves, curve);\n\t\t}\n\n\t\tconst k3d::uint_t v_order = m_order.pipeline_value();\n\t\treturn_if_fail(curve_count >= v_order);\n\t\tk3d::mesh::knots_t v_knots;\n\t\tk3d::nurbs_curve::add_open_uniform_knots(v_order, curve_count, v_knots);\n\t\tskin_curves(Output, *output_patches, compatible_mesh, *compatible_curves, v_knots, v_order);\n\n\t\tif(m_delete_original.pipeline_value())\n\t\t{\n\t\t\tdelete_selected_curves(Output);\n\t\t}\n\t\tdelete_empty_primitives(Output);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<skinned_surface, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0xe6e5899a, 0x9c445204, 0xa7758297, 0x86cd38e4),\n\t\t  \"NurbsSkinnedSurface\",\n\t\t  _(\"Creates a NURBS surface stretched along all selected curves\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_delete_original;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_order;\n};\n\nk3d::iplugin_factory& skinned_surface_factory()\n{\n\treturn skinned_surface::get_factory();\n}\n\n} // namespace nurbs\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/nurbs/split_curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/point4.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass split_curve :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tsplit_curve(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_u_value(init_owner(*this) + init_name(_(\"u_value\")) + init_label(_(\"U value (in [0,1])\")) + init_description(_(\"Split Curve at u in ]0,1[\")) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(0.0 , constraint::maximum(1.0))) + init_value(0.5))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_u_value.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tmodify_selected_curves(Input, Output, curve_splitter(m_u_value.pipeline_value()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<split_curve, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x9f5aa916, 0x8248cdec, 0x6cfbab9d, 0xd7f5f46f),\n\t\t  \"NurbsSplitCurve\",\n\t\t  _(\"Breaks a NURBS curve at a given u value (0...1)\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_value;\n\n\tstruct curve_splitter\n\t{\n\t\tcurve_splitter(const k3d::double_t UValue) : u(UValue) {}\n\t\tconst k3d::double_t u;\n\t\tvoid operator()(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t& Curve)\n\t\t{\n\t\t\tmodule::nurbs::split_curve(OutputMesh, OutputCurves, InputMesh, InputCurves, Curve, u);\n\t\t}\n\t};\n};\n\nk3d::iplugin_factory& split_curve_factory()\n{\n\treturn split_curve::get_factory();\n}\n\n} // namespace nurbs\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/nurbs/split_patch.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nclass split_patch :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tsplit_patch(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_u_value(init_owner(*this) + init_name(_(\"u_value\")) + init_label(_(\"u/v value of new knot\")) + init_description(_(\"Insert knot at [0,1]\")) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(0.0 , constraint::maximum(1.0))) + init_value(0.5)),\n\t\tm_insert_to_v(init_owner(*this) + init_name(_(\"insert_to_v\")) + init_label(_(\"Insert knot in v? Otherwise u\")) + init_description(_(\"By default the knot gets inserted into the patch in u direction, by checking this box you choose to insert it to v\")) + init_value(false))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_u_value.changed_signal().connect(make_update_mesh_slot());\n\t\tm_insert_to_v.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tmodify_selected_patches(Input, Output, patch_splitter(m_u_value.pipeline_value(), !m_insert_to_v.pipeline_value()));\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<split_patch, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0xfd41c726, 0x494878e7, 0xee521a94, 0x0e807cef),\n\t\t  \"NurbsSplitPatch\",\n\t\t  _(\"Splits a patch at the selected u/v value\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprivate:\n\tstruct patch_splitter\n\t{\n\t\tpatch_splitter(const k3d::double_t Parameter, const k3d::bool_t UDirection) : parameter(Parameter), u_direction(UDirection) {}\n\t\tvoid operator()(k3d::mesh& OutputMesh, k3d::nurbs_patch::primitive& OutputPatches, const k3d::mesh& InputMesh, const k3d::nurbs_patch::const_primitive& InputPatches, const k3d::uint_t& Patch)\n\t\t{\n\t\t\tmodule::nurbs::split_patch(OutputMesh, OutputPatches, InputMesh, InputPatches, Patch, parameter, u_direction);\n\t\t}\n\t\tconst k3d::double_t parameter;\n\t\tconst k3d::bool_t u_direction;\n\t};\n\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_value;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_insert_to_v;\n};\n\nk3d::iplugin_factory& split_patch_factory()\n{\n\treturn split_patch::get_factory();\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n"
  },
  {
    "path": "modules/nurbs/sweep_surface.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n#include \"utility.h\"\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <vector>\n\nnamespace module\n{\n\nnamespace nurbs\n{\nclass sweep_surface :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\npublic:\n\tsweep_surface(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_delete_original(init_owner(*this) + init_name(_(\"delete_original\")) + init_label(_(\"Delete the Curve\")) + init_description(_(\"Delete the original curves\")) + init_value(true)),\n\t\tm_samples(init_owner(*this) + init_name(\"samples\") + init_label(_(\"Samples\")) + init_description(_(\"The number of samples per span\")) + init_value(200) + init_constraint(constraint::minimum(10)) + init_step_increment(50) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_align_normal(init_owner(*this) + init_name(_(\"align_normal\")) + init_label(_(\"Align Normal\")) + init_description(_(\"Align the curve normal, insted of preserving the start alignment\")) + init_value(true))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_update_mesh_slot());\n\t\tm_delete_original.changed_signal().connect(make_update_mesh_slot());\n\t\tm_samples.changed_signal().connect(make_update_mesh_slot());\n\t\tm_align_normal.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tif(!Output.points.get())\n\t\t\treturn;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> output_patches(k3d::nurbs_patch::create(Output));\n\n\t\tk3d::mesh selected_curves_mesh;\n\t\tselected_curves_mesh.points.create();\n\t\tselected_curves_mesh.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> paths(k3d::nurbs_curve::create(selected_curves_mesh));\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> sweep_curves(k3d::nurbs_curve::create(selected_curves_mesh));\n\t\tvisit_selected_curves(Output, curve_extractor(selected_curves_mesh, *paths, *sweep_curves));\n\n\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_paths(k3d::nurbs_curve::validate(selected_curves_mesh, *selected_curves_mesh.primitives.front()));\n\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> const_sweep_curves(k3d::nurbs_curve::validate(selected_curves_mesh, *selected_curves_mesh.primitives.back()));\n\n\t\treturn_if_fail(const_paths);\n\t\treturn_if_fail(const_sweep_curves);\n\n\t\tsweep(Output, *output_patches, selected_curves_mesh, *const_sweep_curves, *const_paths, m_samples.pipeline_value(), m_align_normal.pipeline_value());\n\n\t\tif(m_delete_original.pipeline_value())\n\t\t{\n\t\t\tdelete_selected_curves(Output);\n\t\t}\n\t\tdelete_empty_primitives(Output);\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sweep_surface, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t  k3d::uuid(0x20e5032b, 0x0344e9da, 0x39b3318e, 0x2507c6c2),\n\t\t  \"NurbsSweepSurface\",\n\t\t  _(\"Create a Surface by traversing one curve along another and orienting it tangential to the traverse curve\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t/// Extracts the first curve as a path, and the rest as curves that sweep it\n\tstruct curve_extractor\n\t{\n\t\tk3d::mesh& mesh;\n\t\tk3d::nurbs_curve::primitive& paths;\n\t\tk3d::nurbs_curve::primitive& sweep_curves;\n\t\tcurve_extractor(k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Paths, k3d::nurbs_curve::primitive& SweepCurves) : mesh(Mesh), paths(Paths), sweep_curves(SweepCurves) {}\n\t\tvoid operator()(const k3d::mesh& Mesh, const k3d::nurbs_curve::const_primitive& Curves, const k3d::uint_t& Curve)\n\t\t{\n\t\t\tif(paths.curve_first_points.empty())\n\t\t\t{\n\t\t\t\tcopy_curve(mesh, paths, Mesh, Curves, Curve);\n\t\t\t\tpaths.material = Curves.material;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcopy_curve(mesh, sweep_curves, Mesh, Curves, Curve);\n\t\t\t\tsweep_curves.material = Curves.material;\n\t\t\t}\n\t\t}\n\t};\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_delete_original;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_samples;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_align_normal;\n\n};\n\nk3d::iplugin_factory& sweep_surface_factory()\n{\n\treturn sweep_surface::get_factory();\n}\n\n} // namespace nurbs\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/nurbs/utility.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"utility.h\"\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nvoid delete_empty_primitives(k3d::mesh& Mesh)\n{\n\tfor(k3d::mesh::primitives_t::iterator prim = Mesh.primitives.begin(); prim != Mesh.primitives.end();)\n\t{\n\t\tbool erase = false;\n\t\tfor(k3d::mesh::named_tables_t::const_iterator structure = (*prim)->structure.begin(); structure != (*prim)->structure.end(); ++structure)\n\t\t{\n\t\t\tfor(k3d::mesh::named_arrays_t::const_iterator array = structure->second.begin(); array != structure->second.end(); ++array)\n\t\t\t{\n\t\t\t\tif(array->second->get_metadata_value(k3d::metadata::key::domain()) == k3d::metadata::value::point_indices_domain())\n\t\t\t\t\tif(array->second->empty())\n\t\t\t\t\t\terase = true;\n\t\t\t}\n\t\t}\n\t\tprim = erase ? Mesh.primitives.erase(prim) : prim + 1;\n\t}\n}\n\nknot_vector_merger::knot_vector_merger(const k3d::mesh::knots_t& UnifiedKnots, const k3d::uint_t Order) : unified_knots(UnifiedKnots), order(Order)\n{\n\tstd::transform(unified_knots.begin(), unified_knots.end(), unified_knots.begin(), knot_normalizer(unified_knots.front(), unified_knots.back()));\n}\n\nvoid knot_vector_merger::operator()(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t& Curve)\n{\n\tcurve_arrays curve(InputMesh, InputCurves, Curve, true);\n\tk3d::mesh::knots_t& knots = curve.knots;\n\tif(unified_knots.size() < knots.size())\n\t\tthrow std::runtime_error(\"Unified knot vector is too short\");\n\t// First, we check if the old knot vector has knots that are not in the common knot vector (i.e. knots that were added manually using knot vector editing)\n\tk3d::uint_t i = 0;\n\tfor(k3d::uint_t knot_idx = 0; knot_idx != knots.size(); ++knot_idx)\n\t{\n\t\tconst k3d::double_t old_knot = knots[knot_idx];\n\t\tconst k3d::uint_t new_mul = multiplicity(unified_knots, old_knot, 0, unified_knots.size());\n\t\tconst k3d::uint_t old_mul = multiplicity(knots, old_knot, 0, knots.size());\n\t\tif(new_mul < old_mul && std::abs(unified_knots[i] - knots[knot_idx]) > 0.000001)\n\t\t{\n\t\t\tconst k3d::double_t previous_knot = knot_idx == 0 ? knots.front() : knots[knot_idx - 1];\n\t\t\tconst k3d::double_t next_knot = knot_idx == knots.size() - 1 ? knots.back() : knots[knot_idx - 1];\n\t\t\tk3d::uint_t i = knot_idx;\n\t\t\twhile(unified_knots[i] < previous_knot || multiplicity(knots, unified_knots[i], 0, knots.size()) >= multiplicity(unified_knots, unified_knots[i], 0, unified_knots.size()))\n\t\t\t\t++i;\n\t\t\tknots[knot_idx] = unified_knots[i];\n\t\t}\n\t\t++i;\n\t}\n\t// Next, add the missing knots\n\tfor(k3d::uint_t knot_idx = 0; knot_idx != unified_knots.size(); ++knot_idx)\n\t{\n\t\tconst k3d::double_t u = unified_knots[knot_idx];\n\t\tconst k3d::uint_t old_mul = multiplicity(knots, u, 0, knots.size());\n\t\tconst k3d::uint_t new_mul = multiplicity(unified_knots, u, 0, unified_knots.size());\n\t\tif(old_mul > new_mul)\n\t\t\tthrow std::runtime_error(\"Error inserting knots when creating a common knot vector\");\n\t\tif(old_mul < new_mul)\n\t\t\tinsert_knot(curve, u, 1);\n\t}\n\tcurve.add_curve(OutputMesh, OutputCurves);\n}\n\n} //namespace nurbs\n\n} //namespace module\n"
  },
  {
    "path": "modules/nurbs/utility.h",
    "content": "#ifndef MODULES_NURBS_UTILITY_H\n#define MODULES_NURBS_UTILITY_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Defines some functions to visit curves and patches in a mesh\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/types.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/metadata.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n#include <stdexcept>\n\n#include \"nurbs_curves.h\"\n#include \"nurbs_patches.h\"\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\n/// TODO: Move to SDK\nvoid delete_empty_primitives(k3d::mesh& Mesh);\n\n/// Visitor to get the selected components\nstruct selected_component_extractor\n{\n\tselected_component_extractor(k3d::mesh::indices_t& SelectedCurves, const k3d::string_t& ComponentName) : selected_curves(SelectedCurves), component_name(ComponentName) {}\n\tvoid operator()(const k3d::string_t& StructureName, const k3d::table& Structure, const k3d::string_t& ArrayName, const k3d::pipeline_data<k3d::array>& Array)\n\t{\n\t\tif(StructureName == component_name && Array->get_metadata_value(k3d::metadata::key::role()) == k3d::metadata::value::selection_role())\n\t\t{\n\t\t\tconst k3d::mesh::selection_t* curve_selections = dynamic_cast<const k3d::mesh::selection_t*>(Array.get());\n\t\t\tfor(k3d::uint_t curve = 0; curve != curve_selections->size(); ++curve)\n\t\t\t{\n\t\t\t\tif(curve_selections->at(curve))\n\t\t\t\t\tselected_curves.push_back(curve);\n\t\t\t}\n\t\t}\n\t}\n\tk3d::mesh::indices_t& selected_curves;\n\tconst k3d::string_t component_name;\n};\n\n//////////////////////////////////////////////////////////////////\n// Curve visiting functions\n//////////////////////////////////////////////////////////////////\n\n/// Visit all selected curves\ntemplate <typename FunctorT>\nvoid visit_selected_curves(const k3d::mesh& Mesh, FunctorT Modifier)\n{\n\tconst k3d::uint_t prims_end = Mesh.primitives.size();\n\tfor(k3d::uint_t prim_idx = 0; prim_idx != prims_end; ++prim_idx)\n\t{\n\t\tk3d::mesh::indices_t selected_curves;\n\t\tk3d::mesh::visit_arrays(*Mesh.primitives[prim_idx], selected_component_extractor(selected_curves, \"curve\"));\n\t\tif(selected_curves.size())\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> curves(k3d::nurbs_curve::validate(Mesh, *Mesh.primitives[prim_idx]));\n\t\t\tif(!curves)\n\t\t\t\tcontinue;\n\t\t\tfor(k3d::uint_t i = 0; i != selected_curves.size(); ++i)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve = selected_curves[i];\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tModifier(Mesh, *curves, curve);\n\t\t\t\t}\n\t\t\t\tcatch(std::runtime_error& E)\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"Error visiting curve \" << curve << \" of primitive \" << prim_idx << \": \" << E.what() << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/// Apply a modifier to the selected curves in OutputMesh\ntemplate <typename FunctorT>\nvoid modify_selected_curves(const k3d::mesh& InputMesh, k3d::mesh& OutputMesh, FunctorT Modifier)\n{\n\tfor(k3d::uint_t prim_idx = 0; prim_idx != InputMesh.primitives.size(); ++prim_idx)\n\t{\n\t\tk3d::mesh::indices_t selected_curves;\n\t\tk3d::mesh::visit_arrays(*OutputMesh.primitives[prim_idx], selected_component_extractor(selected_curves, \"curve\"));\n\t\tif(selected_curves.size())\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> input_curves(k3d::nurbs_curve::validate(InputMesh, *InputMesh.primitives[prim_idx]));\n\t\t\tconst k3d::uint_t curve_count = input_curves->curve_first_points.size();\n\t\t\tk3d::mesh::bools_t curve_selections(curve_count, false);\n\t\t\tfor(k3d::uint_t i = 0; i != selected_curves.size(); ++i) curve_selections[selected_curves[i]] = true;\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> output_curves(k3d::nurbs_curve::create(OutputMesh.primitives[prim_idx].create(new k3d::mesh::primitive(\"nurbs_curve\"))));\n\t\t\tfor(k3d::uint_t curve = 0; curve != curve_count; ++curve)\n\t\t\t{\n\t\t\t\tif(curve_selections[curve])\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tModifier(OutputMesh, *output_curves, InputMesh, *input_curves, curve);\n\t\t\t\t\t}\n\t\t\t\t\tcatch(std::runtime_error& E)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"Error modifiying curve \" << curve << \" of primitive \" << prim_idx << \": \" << E.what() << std::endl;\n\t\t\t\t\t\tcopy_curve(OutputMesh, *output_curves, InputMesh, *input_curves, curve);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcopy_curve(OutputMesh, *output_curves, InputMesh, *input_curves, curve);\n\t\t\t\t}\n\t\t\t\toutput_curves->curve_selections.back() = curve_selections[curve];\n\t\t\t}\n\t\t\tif(output_curves->material.empty())\n\t\t\t\toutput_curves->material = input_curves->material;\n\t\t}\n\t}\n\tif(OutputMesh.points)\n\t{\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(OutputMesh, unused_points);\n\t\tk3d::mesh::delete_points(OutputMesh, unused_points);\n\t}\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n// shared functors\n//////////////////////////////////////////////////////////////////////////////////////////////\n\n/// Calculates the maximum order of all visited curves\nstruct max_order_calculator\n{\n\tmax_order_calculator(k3d::double_t& Order) : order(Order)\n\t{\n\t\torder = 0;\n\t}\n\tvoid operator()(const k3d::mesh& Mesh, const k3d::nurbs_curve::const_primitive& Curves, const k3d::uint_t& Curve)\n\t{\n\t\torder = Curves.curve_orders[Curve] > order ? Curves.curve_orders[Curve] : order;\n\t}\n\t/// The maximum order of all curves visited\n\tk3d::double_t& order;\n};\n\n/// Calculates a common knot vector among the visited curves\nstruct knot_vector_calculator\n{\n\tknot_vector_calculator(k3d::mesh::knots_t& Knots) : knots(Knots) {}\n\tvoid operator()(const k3d::mesh& Mesh, const k3d::nurbs_curve::const_primitive& Curves, const k3d::uint_t& Curve)\n\t{\n\t\tappend_common_knot_vector(knots, Curves, Curve);\n\t}\n\t/// The common knot vector for the visited curves\n\tk3d::mesh::knots_t& knots;\n};\n\n/// Applies NURBS curve degree elevation to reach the given order\nstruct degree_elevator\n{\n\tdegree_elevator(const k3d::uint_t Order) : order(Order) {}\n\tconst k3d::double_t order;\n\tvoid operator()(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t& Curve)\n\t{\n\t\televate_curve_degree(OutputMesh, OutputCurves, InputMesh, InputCurves, Curve, order - InputCurves.curve_orders[Curve]);\n\t}\n};\n\n/// Makes UnifiedKnots the knot vector of all given curves\nstruct knot_vector_merger\n{\n\tknot_vector_merger(const k3d::mesh::knots_t& UnifiedKnots, const k3d::uint_t Order);\n\tvoid operator()(k3d::mesh& OutputMesh, k3d::nurbs_curve::primitive& OutputCurves, const k3d::mesh& InputMesh, const k3d::nurbs_curve::const_primitive& InputCurves, const k3d::uint_t& Curve);\n\tk3d::mesh::knots_t unified_knots;\n\tconst k3d::uint_t order;\n};\n\n//////////////////////////////////////////////////////////////////\n// Patch visiting functions\n//////////////////////////////////////////////////////////////////\n\n/// Apply a modifier to the selected patches in OutputMesh\ntemplate <typename FunctorT>\nvoid modify_selected_patches(const k3d::mesh& InputMesh, k3d::mesh& OutputMesh, FunctorT Modifier)\n{\n\tfor(k3d::uint_t prim_idx = 0; prim_idx != InputMesh.primitives.size(); ++prim_idx)\n\t{\n\t\tk3d::mesh::indices_t selected_patches;\n\t\tk3d::mesh::visit_arrays(*OutputMesh.primitives[prim_idx], selected_component_extractor(selected_patches, \"patch\"));\n\t\tif(selected_patches.size())\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> input_patches(k3d::nurbs_patch::validate(InputMesh, *InputMesh.primitives[prim_idx]));\n\t\t\tconst k3d::uint_t patch_count = input_patches->patch_first_points.size();\n\t\t\tk3d::mesh::bools_t patch_selections(patch_count, false);\n\t\t\tfor(k3d::uint_t i = 0; i != selected_patches.size(); ++i) patch_selections[selected_patches[i]] = true;\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> output_patches(k3d::nurbs_patch::create(OutputMesh.primitives[prim_idx].create(new k3d::mesh::primitive(\"nurbs_patch\"))));\n\t\t\tfor(k3d::uint_t patch = 0; patch != patch_count; ++patch)\n\t\t\t{\n\t\t\t\tif(patch_selections[patch])\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tModifier(OutputMesh, *output_patches, InputMesh, *input_patches, patch);\n\t\t\t\t\t\toutput_patches->patch_selections.back() = patch_selections[patch];\n\t\t\t\t\t\toutput_patches->constant_attributes = input_patches->constant_attributes.clone();\n\t\t\t\t\t}\n\t\t\t\t\tcatch(std::runtime_error& E)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"Error modifying patch \" << patch << \" of primitive \" << prim_idx << \": \" << E.what() << std::endl;\n\t\t\t\t\t\tcopy_patch(OutputMesh, *output_patches, InputMesh, *input_patches, patch);\n\t\t\t\t\t\toutput_patches->patch_materials[patch] = input_patches->patch_materials[patch];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcopy_patch(OutputMesh, *output_patches, InputMesh, *input_patches, patch);\n\t\t\t\t\toutput_patches->patch_materials[patch] = input_patches->patch_materials[patch];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif(OutputMesh.points)\n\t{\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(OutputMesh, unused_points);\n\t\tk3d::mesh::delete_points(OutputMesh, unused_points);\n\t}\n}\n\n/// Use with std::transform to normalize a knot vector\nstruct knot_normalizer\n{\n\tknot_normalizer(const k3d::double_t Min, const k3d::double_t Max) : min(Min), max(Max) {}\n\tk3d::double_t min, max;\n\tconst k3d::double_t operator()(const k3d::double_t Knot)\n\t{\n\t\treturn (Knot - min) / (max - min);\n\t}\n};\n\n// Extracts all selected curves from a mesh and stores them in the primitive supplied at construction\nstruct selected_curve_extractor\n{\n\tselected_curve_extractor(k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Curves) : mesh(Mesh), curves(Curves) {}\n\tvoid operator()(const k3d::mesh& Mesh, const k3d::nurbs_curve::const_primitive& Curves, const k3d::uint_t& Curve)\n\t{\n\t\tcopy_curve(mesh, curves, Mesh, Curves, Curve);\n\t}\n\tk3d::mesh& mesh;\n\tk3d::nurbs_curve::primitive& curves;\n};\n\n/// Predicate to find the first knot greater than the value given in the constructor\nstruct find_first_knot_after\n{\n\tfind_first_knot_after(const k3d::double_t KnotValue) : knot_value(KnotValue) {}\n\tk3d::bool_t operator()(const k3d::double_t TestKnot)\n\t{\n\t\treturn TestKnot > knot_value;\n\t}\n\tconst k3d::double_t knot_value;\n};\n\ninline const k3d::point3 dehomogenize(const k3d::point4 P)\n{\n\tconst k3d::double_t w = P[3];\n\treturn k3d::point3(P[0]/w, P[1]/w, P[2]/w);\n}\n\n} //namespace nurbs\n\n} //namespace module\n\n#endif // !MODULES_NURBS_UTILITY_H\n"
  },
  {
    "path": "modules/nurbs_sources/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-nurbs-sources)\nK3D_CREATE_MODULE_PROXY(k3d-nurbs-sources)\n\n"
  },
  {
    "path": "modules/nurbs_sources/circle.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// circle\n\nclass circle :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tcircle(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"radius\")) + init_description(_(\"Radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_thetamax(init_owner(*this) + init_name(\"thetamax\") + init_label(_(\"thetamax\")) + init_description(_(\"End angle\")) + init_value(k3d::radians(360.0)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"u_segments\")) + init_description(_(\"Segments\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_thetamax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tconst k3d::double_t thetamax = m_thetamax.pipeline_value();\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\n\t\t// Compute NURBS control points ...\n\t\tk3d::mesh::knots_t knots;\n\t\tk3d::mesh::weights_t weights;\n\t\tk3d::mesh::points_t control_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(radius, 0, 0), k3d::vector3(0, radius, 0), 0, thetamax, u_segments, knots, weights, control_points);\n\n\t\t// Create a NURBS curve primitive, and add a single curve ...\n\t\tOutput.points.create();\n\t\tOutput.point_selection.create();\n\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> primitive(k3d::nurbs_curve::create(Output));\n\t\tprimitive->material.push_back(material);\n\n\t\tk3d::nurbs_curve::add_curve(Output, *primitive, 3, control_points, weights, knots);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<circle, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t  k3d::uuid(0x82c3a0ef, 0x4e074f5c, 0xb3926e7f, 0xb725b571),\n\t\t  \"NurbsCircle\",\n\t\t  _(\"Generates a NURBS circle\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_thetamax;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// circle_factory\n\nk3d::iplugin_factory& circle_factory()\n{\n\treturn circle::get_factory();\n}\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/nurbs_sources/cone.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cone\n\nclass cone :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tcone(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"radius\")) + init_description(_(\"Radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"height\")) + init_description(_(\"Height\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_thetamax(init_owner(*this) + init_name(\"thetamax\") + init_label(_(\"thetamax\")) + init_description(_(\"End angle\")) + init_value(k3d::radians(360.0)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"u_segments\")) + init_description(_(\"Radial Segments\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_segments(init_owner(*this) + init_name(\"v_segments\") + init_label(_(\"v_segments\")) + init_description(_(\"Radial Segments\")) + init_value(2) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_thetamax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_v_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tconst k3d::double_t height = m_height.pipeline_value();\n\t\tconst k3d::double_t thetamax = m_thetamax.pipeline_value();\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\n\t\t// Compute NURBS control points ...\n\t\tk3d::mesh::knots_t u_knots;\n\t\tk3d::mesh::weights_t weights;\n\t\tk3d::mesh::points_t control_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, thetamax, u_segments, u_knots, weights, control_points);\n\n\t\t// Create patch ...\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> primitive(k3d::nurbs_patch::create(Output));\n\n\t\tprimitive->patch_first_points.push_back(primitive->patch_points.size());\n\t\tprimitive->patch_u_point_counts.push_back(control_points.size());\n\t\tprimitive->patch_v_point_counts.push_back(v_segments + 1);\n\t\tprimitive->patch_u_orders.push_back(3);\n\t\tprimitive->patch_v_orders.push_back(2);\n\t\tprimitive->patch_u_first_knots.push_back(primitive->patch_u_knots.size());\n\t\tprimitive->patch_v_first_knots.push_back(primitive->patch_v_knots.size());\n\t\tprimitive->patch_selections.push_back(0);\n\t\tprimitive->patch_materials.push_back(material);\n\n\t\tfor(k3d::int32_t i = 0; i <= v_segments; ++i)\n\t\t{\n\t\t\tconst k3d::double_t radius2 = k3d::mix(radius, 0.0, static_cast<k3d::double_t>(i) / static_cast<k3d::double_t>(v_segments));\n\t\t\tconst k3d::vector3 offset = k3d::mix(0.0, height, static_cast<k3d::double_t>(i) / static_cast<k3d::double_t>(v_segments)) * k3d::vector3(0, 0, 1);\n\n\t\t\tfor(k3d::uint_t j = 0; j != control_points.size(); ++j)\n\t\t\t{\n\t\t\t\tprimitive->patch_points.push_back(points.size());\n\t\t\t\tprimitive->patch_point_weights.push_back(weights[j]);\n\n\t\t\t\tpoints.push_back((radius2 * control_points[j]) + offset);\n\t\t\t\tpoint_selection.push_back(0);\n\t\t\t}\n\t\t}\n\n\t\tprimitive->patch_u_knots.assign(u_knots.begin(), u_knots.end());\n\n\t\tprimitive->patch_v_knots.push_back(0);\n\t\tprimitive->patch_v_knots.push_back(0);\n\t\tfor(k3d::int32_t i = 1; i != v_segments; ++i)\n\t\t\tprimitive->patch_v_knots.push_back(i);\n\t\tprimitive->patch_v_knots.push_back(v_segments);\n\t\tprimitive->patch_v_knots.push_back(v_segments);\n\n\t\tprimitive->patch_trim_loop_counts.push_back(0);\n\t\tprimitive->patch_first_trim_loops.push_back(0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cone, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t  k3d::uuid(0x5c7b8a12, 0xbbb5477f, 0xb1428844, 0x894f550b),\n\t\t  \"NurbsCone\",\n\t\t  _(\"Generates a NURBS cone\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_thetamax;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_segments;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cone_factory\n\nk3d::iplugin_factory& cone_factory()\n{\n\treturn cone::get_factory();\n}\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\n\n\n"
  },
  {
    "path": "modules/nurbs_sources/curve.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Carsten Haubold (CarstenHaubold@web.de)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\nclass curve :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tcurve(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_order(init_owner(*this) + init_name(\"order\") + init_label(_(\"Order\")) + init_description(_(\"Order of the curve (2-linear - 4-cubic)\")) + init_value(3) + init_constraint(constraint::minimum(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_point_count(init_owner(*this) + init_name(\"point_count\") + init_label(_(\"Point Count\")) + init_description(_(\"Number of control points\")) + init_value(4) + init_constraint(constraint::minimum(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_point_spacing(init_owner(*this) + init_name(\"point_spacing\") + init_label(_(\"Point Spacing\")) + init_description(_(\"Space between points\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_order.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_point_count.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_point_spacing.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::int32_t order = m_order.pipeline_value();\n\t\tconst k3d::int32_t point_count = m_point_count.pipeline_value();\n\t\tconst k3d::double_t point_spacing = m_point_spacing.pipeline_value();\n\n\t\treturn_if_fail(point_count >= order);\n\n\t\t// Create a NURBS curve primitive, and add a single curve ...\n\t\tOutput.points.create();\n\t\tOutput.point_selection.create();\n\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> primitive(k3d::nurbs_curve::create(Output));\n\t\tprimitive->material.push_back(material);\n\n\t\tk3d::mesh::points_t points;\n\t\tfor(k3d::uint_t i = 0; i != point_count; ++i)\n\t\t\tpoints.push_back(k3d::point3(i * point_spacing, 0.0, 0.0)); //store the point (a straight line along x-axis)\n\n\t\tk3d::nurbs_curve::add_curve(Output, *primitive, order, points);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<curve, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t  k3d::uuid(0x13c474c8, 0x5c4e278f, 0x70eb8c8c, 0xabe8bd2a),\n\t\t  \"NurbsCurve\",\n\t\t  _(\"Generates a NURBS curve\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_order;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_point_count;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_point_spacing;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// curve_factory\n\nk3d::iplugin_factory& curve_factory()\n{\n\treturn curve::get_factory();\n}\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/nurbs_sources/cylinder.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cylinder\n\nclass cylinder :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tcylinder(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"radius\")) + init_description(_(\"Radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_zmax(init_owner(*this) + init_name(\"zmax\") + init_label(_(\"zmax\")) + init_description(_(\"ZMax\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_zmin(init_owner(*this) + init_name(\"zmin\") + init_label(_(\"zmin\")) + init_description(_(\"ZMin\")) + init_value(-5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_thetamax(init_owner(*this) + init_name(\"thetamax\") + init_label(_(\"thetamax\")) + init_description(_(\"End angle\")) + init_value(k3d::radians(360.0)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"u_segments\")) + init_description(_(\"Radial Segments\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_segments(init_owner(*this) + init_name(\"v_segments\") + init_label(_(\"v_segments\")) + init_description(_(\"Radial Segments\")) + init_value(2) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_zmax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_zmin.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_thetamax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_v_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tconst k3d::double_t zmax = m_zmax.pipeline_value();\n\t\tconst k3d::double_t zmin = m_zmin.pipeline_value();\n\t\tconst k3d::double_t thetamax = m_thetamax.pipeline_value();\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\n\t\t// Compute NURBS control points ...\n\t\tk3d::mesh::knots_t u_knots;\n\t\tk3d::mesh::weights_t weights;\n\t\tk3d::mesh::points_t control_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, thetamax, u_segments, u_knots, weights, control_points);\n\n\t\t// Create patch ...\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> primitive(k3d::nurbs_patch::create(Output));\n\n\t\tprimitive->patch_first_points.push_back(primitive->patch_points.size());\n\t\tprimitive->patch_u_point_counts.push_back(control_points.size());\n\t\tprimitive->patch_v_point_counts.push_back(v_segments + 1);\n\t\tprimitive->patch_u_orders.push_back(3);\n\t\tprimitive->patch_v_orders.push_back(2);\n\t\tprimitive->patch_u_first_knots.push_back(primitive->patch_u_knots.size());\n\t\tprimitive->patch_v_first_knots.push_back(primitive->patch_v_knots.size());\n\t\tprimitive->patch_selections.push_back(0);\n\t\tprimitive->patch_materials.push_back(material);\n\n\t\tfor(k3d::int32_t i = 0; i <= v_segments; ++i)\n\t\t{\n\t\t\tconst k3d::vector3 offset = k3d::mix(zmin, zmax, static_cast<k3d::double_t>(i) / static_cast<k3d::double_t>(v_segments)) * k3d::vector3(0, 0, 1);\n\n\t\t\tfor(k3d::uint_t j = 0; j != control_points.size(); ++j)\n\t\t\t{\n\t\t\t\tprimitive->patch_points.push_back(points.size());\n\t\t\t\tprimitive->patch_point_weights.push_back(weights[j]);\n\n\t\t\t\tpoints.push_back((radius * control_points[j]) + offset);\n\t\t\t\tpoint_selection.push_back(0);\n\t\t\t}\n\t\t}\n\n\t\tprimitive->patch_u_knots.assign(u_knots.begin(), u_knots.end());\n\n\t\tprimitive->patch_v_knots.push_back(0);\n\t\tprimitive->patch_v_knots.push_back(0);\n\t\tfor(k3d::int32_t i = 1; i != v_segments; ++i)\n\t\t\tprimitive->patch_v_knots.push_back(i);\n\t\tprimitive->patch_v_knots.push_back(v_segments);\n\t\tprimitive->patch_v_knots.push_back(v_segments);\n\n\t\tprimitive->patch_trim_loop_counts.push_back(0);\n\t\tprimitive->patch_first_trim_loops.push_back(0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cylinder, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t  k3d::uuid(0x756958ae, 0x6932432f, 0x854adf09, 0x262c2da2),\n\t\t  \"NurbsCylinder\",\n\t\t  _(\"Generates a NURBS cylinder\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_zmax;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_zmin;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_thetamax;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_segments;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cylinder_factory\n\nk3d::iplugin_factory& cylinder_factory()\n{\n\treturn cylinder::get_factory();\n}\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/nurbs_sources/disk.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// disk\n\nclass disk :\n\t\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tdisk(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"radius\")) + init_description(_(\"Radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"height\")) + init_description(_(\"Height\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_thetamax(init_owner(*this) + init_name(\"thetamax\") + init_label(_(\"thetamax\")) + init_description(_(\"End angle\")) + init_value(k3d::radians(360.0)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"u_segments\")) + init_description(_(\"Radial Segments\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_segments(init_owner(*this) + init_name(\"v_segments\") + init_label(_(\"v_segments\")) + init_description(_(\"Radial Segments\")) + init_value(2) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_thetamax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_v_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tconst k3d::double_t height = m_height.pipeline_value();\n\t\tconst k3d::double_t thetamax = m_thetamax.pipeline_value();\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\n\t\t// Compute NURBS control points ...\n\t\tk3d::mesh::knots_t u_knots;\n\t\tk3d::mesh::weights_t weights;\n\t\tk3d::mesh::points_t control_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, thetamax, u_segments, u_knots, weights, control_points);\n\n\t\t// Create patch ...\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> primitive(k3d::nurbs_patch::create(Output));\n\n\t\tprimitive->patch_first_points.push_back(primitive->patch_points.size());\n\t\tprimitive->patch_u_point_counts.push_back(control_points.size());\n\t\tprimitive->patch_v_point_counts.push_back(v_segments + 1);\n\t\tprimitive->patch_u_orders.push_back(3);\n\t\tprimitive->patch_v_orders.push_back(2);\n\t\tprimitive->patch_u_first_knots.push_back(primitive->patch_u_knots.size());\n\t\tprimitive->patch_v_first_knots.push_back(primitive->patch_v_knots.size());\n\t\tprimitive->patch_selections.push_back(0);\n\t\tprimitive->patch_materials.push_back(material);\n\n\t\tconst k3d::vector3 offset = height * k3d::vector3(0, 0, 1);\n\n\t\tfor(k3d::int32_t i = 0; i <= v_segments; ++i)\n\t\t{\n\t\t\tconst k3d::double_t radius2 = k3d::mix(radius, 0.0, static_cast<k3d::double_t>(i) / static_cast<k3d::double_t>(v_segments));\n\n\t\t\tfor(k3d::uint_t j = 0; j != control_points.size(); ++j)\n\t\t\t{\n\t\t\t\tprimitive->patch_points.push_back(points.size());\n\t\t\t\tprimitive->patch_point_weights.push_back(weights[j]);\n\n\t\t\t\tpoints.push_back((radius2 * control_points[j]) + offset);\n\t\t\t\tpoint_selection.push_back(0);\n\t\t\t}\n\t\t}\n\n\t\tprimitive->patch_u_knots.assign(u_knots.begin(), u_knots.end());\n\n\t\tprimitive->patch_v_knots.push_back(0);\n\t\tprimitive->patch_v_knots.push_back(0);\n\t\tfor(k3d::int32_t i = 1; i != v_segments; ++i)\n\t\t\tprimitive->patch_v_knots.push_back(i);\n\t\tprimitive->patch_v_knots.push_back(v_segments);\n\t\tprimitive->patch_v_knots.push_back(v_segments);\n\n\t\tprimitive->patch_trim_loop_counts.push_back(0);\n\t\tprimitive->patch_first_trim_loops.push_back(0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<disk, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t  k3d::uuid(0x86471cfb, 0x7b5742bb, 0x96bccf97, 0xcbb126e6),\n\t\t  \"NurbsDisk\",\n\t\t  _(\"Generates a NURBS disk\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_thetamax;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_segments;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// disk_factory\n\nk3d::iplugin_factory& disk_factory()\n{\n\treturn disk::get_factory();\n}\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/nurbs_sources/grid.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// grid\n\nclass grid :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tgrid(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_u_order(init_owner(*this) + init_name(\"u_order\") + init_label(_(\"u_order\")) + init_description(_(\"U Order\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_order(init_owner(*this) + init_name(\"v_order\") + init_label(_(\"v_order\")) + init_description(_(\"V Order\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"u_segments\")) + init_description(_(\"Columns\")) + init_value(1) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_segments(init_owner(*this) + init_name(\"v_segments\") + init_label(_(\"v_segments\")) + init_description(_(\"Rows\")) + init_value(1) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"width\")) + init_description(_(\"Width\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"height\")) + init_description(_(\"Height\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_order.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_v_order.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_v_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::int32_t u_order = m_u_order.pipeline_value();\n\t\tconst k3d::int32_t v_order = m_v_order.pipeline_value();\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\t\tconst k3d::double_t width = m_width.pipeline_value();\n\t\tconst k3d::double_t height = m_height.pipeline_value();\n\n\t\tconst k3d::int32_t u_degree = u_order - 1;\n\t\tconst k3d::int32_t v_degree = v_order - 1;\n\t\tconst k3d::int32_t u_points = (u_segments * u_degree) + 1;\n\t\tconst k3d::int32_t v_points = (v_segments * v_degree) + 1;\n\n\t\t// Create patch ...\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> primitive(k3d::nurbs_patch::create(Output));\n\t\t\n\t\tprimitive->patch_first_points.push_back(primitive->patch_points.size());\n\t\tprimitive->patch_u_point_counts.push_back(u_points);\n\t\tprimitive->patch_v_point_counts.push_back(v_points);\n\t\tprimitive->patch_u_orders.push_back(u_order);\n\t\tprimitive->patch_v_orders.push_back(v_order);\n\t\tprimitive->patch_u_first_knots.push_back(primitive->patch_u_knots.size());\n\t\tprimitive->patch_v_first_knots.push_back(primitive->patch_v_knots.size());\n\t\tprimitive->patch_selections.push_back(0);\n\t\tprimitive->patch_materials.push_back(material);\n\n\t\tfor(k3d::int32_t row = 0; row != v_points; ++row)\n\t\t{\n\t\t\tconst k3d::double_t row_percent = 0.5 - (static_cast<k3d::double_t>(row) / static_cast<k3d::double_t>(v_points - 1));\n\n\t\t\tfor(k3d::int32_t column = 0; column != u_points; ++column)\n\t\t\t{\n\t\t\t\tconst k3d::double_t column_percent = (static_cast<k3d::double_t>(column) / static_cast<k3d::double_t>(u_points - 1)) - 0.5;\n\n\t\t\t\tprimitive->patch_points.push_back(points.size());\n\t\t\t\tprimitive->patch_point_weights.push_back(1);\n\n\t\t\t\tpoints.push_back(k3d::point3(width * column_percent, height * row_percent, 0));\n\t\t\t\tpoint_selection.push_back(0);\n\t\t\t}\n\t\t}\n\n\t\tprimitive->patch_u_knots.insert(primitive->patch_u_knots.end(), u_order, 0);\n\t\tfor(k3d::int32_t i = 1; i != u_segments; ++i)\n\t\t\tprimitive->patch_u_knots.insert(primitive->patch_u_knots.end(), u_order - 1, i);\n\t\tprimitive->patch_u_knots.insert(primitive->patch_u_knots.end(), u_order, u_segments);\n\n\t\tprimitive->patch_v_knots.insert(primitive->patch_v_knots.end(), v_order, 0);\n\t\tfor(k3d::int32_t i = 1; i != v_segments; ++i)\n\t\t\tprimitive->patch_v_knots.insert(primitive->patch_v_knots.end(), v_order - 1, i);\n\t\tprimitive->patch_v_knots.insert(primitive->patch_v_knots.end(), v_order, v_segments);\n\n\t\tprimitive->patch_trim_loop_counts.push_back(0);\n\t\tprimitive->patch_first_trim_loops.push_back(0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<grid, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t  k3d::uuid(0x5aac4e72, 0xf9b04b61, 0xf8b1bdbc, 0x851cf62e),\n\t\t  \"NurbsGrid\",\n\t\t  _(\"Generates a NURBS grid\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_order;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_order;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_segments;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// grid_factory\n\nk3d::iplugin_factory& grid_factory()\n{\n\treturn grid::get_factory();\n}\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/nurbs_sources/hyperboloid.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// hyperboloid\n\nclass hyperboloid :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\thyperboloid(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_x1(init_owner(*this) + init_name(\"x1\") + init_label(_(\"x1\")) + init_description(_(\"x1\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_y1(init_owner(*this) + init_name(\"y1\") + init_label(_(\"y1\")) + init_description(_(\"y1\")) + init_value(-5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z1(init_owner(*this) + init_name(\"z1\") + init_label(_(\"z1\")) + init_description(_(\"z1\")) + init_value(-5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_x2(init_owner(*this) + init_name(\"x2\") + init_label(_(\"x2\")) + init_description(_(\"x2\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_y2(init_owner(*this) + init_name(\"y2\") + init_label(_(\"y2\")) + init_description(_(\"y2\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z2(init_owner(*this) + init_name(\"z2\") + init_label(_(\"z2\")) + init_description(_(\"z2\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_thetamax(init_owner(*this) + init_name(\"thetamax\") + init_label(_(\"thetamax\")) + init_description(_(\"thetamax\")) + init_value(k3d::radians(360.0)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_x1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_y1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_z1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_x2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_y2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_z2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_thetamax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t x1 = m_x1.pipeline_value();\n\t\tconst k3d::double_t y1 = m_y1.pipeline_value();\n\t\tconst k3d::double_t z1 = m_z1.pipeline_value();\n\t\tconst k3d::double_t x2 = m_x2.pipeline_value();\n\t\tconst k3d::double_t y2 = m_y2.pipeline_value();\n\t\tconst k3d::double_t z2 = m_z2.pipeline_value();\n\t\tconst k3d::double_t thetamax = m_thetamax.pipeline_value();\n\n\t\tconst k3d::double_t thetamin1 = atan2(y1, x1);\n\t\tconst k3d::double_t thetamin2 = atan2(y2, x2);\n\n\t\tconst k3d::double_t radius1 = sqrt(x1 * x1 + y1 * y1);\n\t\tconst k3d::double_t radius2 = sqrt(x2 * x2 + y2 * y2);\n\n\t\tconst k3d::vector3 offset1 = z1 * k3d::vector3(0, 0, 1);\n\t\tconst k3d::vector3 offset2 = z2 * k3d::vector3(0, 0, 1);\n\n\t\t// Compute NURBS control points ...\n\t\tk3d::mesh::knots_t knots1;\n\t\tk3d::mesh::weights_t weights1;\n\t\tk3d::mesh::points_t control_points1;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), thetamin1, thetamin1 + thetamax, 4, knots1, weights1, control_points1);\n\n\t\tk3d::mesh::knots_t knots2;\n\t\tk3d::mesh::weights_t weights2;\n\t\tk3d::mesh::points_t control_points2;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), thetamin2, thetamin2 + thetamax, 4, knots2, weights2, control_points2);\n\n\t\t// Create patch ...\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> primitive(k3d::nurbs_patch::create(Output));\n\n\t\tprimitive->patch_first_points.push_back(primitive->patch_points.size());\n\t\tprimitive->patch_u_point_counts.push_back(control_points1.size());\n\t\tprimitive->patch_v_point_counts.push_back(2);\n\t\tprimitive->patch_u_orders.push_back(3);\n\t\tprimitive->patch_v_orders.push_back(2);\n\t\tprimitive->patch_u_first_knots.push_back(primitive->patch_u_knots.size());\n\t\tprimitive->patch_v_first_knots.push_back(primitive->patch_v_knots.size());\n\t\tprimitive->patch_selections.push_back(0);\n\t\tprimitive->patch_materials.push_back(material);\n\n\t\tfor(k3d::uint_t j = 0; j != control_points1.size(); ++j)\n\t\t{\n\t\t\tprimitive->patch_points.push_back(points.size());\n\t\t\tprimitive->patch_point_weights.push_back(weights1[j]);\n\n\t\t\tpoints.push_back((radius1 * control_points1[j]) + offset1);\n\t\t\tpoint_selection.push_back(0);\n\t\t}\n\n\t\tfor(k3d::uint_t j = 0; j != control_points2.size(); ++j)\n\t\t{\n\t\t\tprimitive->patch_points.push_back(points.size());\n\t\t\tprimitive->patch_point_weights.push_back(weights2[j]);\n\n\t\t\tpoints.push_back((radius2 * control_points2[j]) + offset2);\n\t\t\tpoint_selection.push_back(0);\n\t\t}\n\n\t\tprimitive->patch_u_knots.assign(knots1.begin(), knots1.end());\n\n\t\tprimitive->patch_v_knots.push_back(0);\n\t\tprimitive->patch_v_knots.push_back(0);\n\t\tprimitive->patch_v_knots.push_back(1);\n\t\tprimitive->patch_v_knots.push_back(1);\n\n\t\tprimitive->patch_trim_loop_counts.push_back(0);\n\t\tprimitive->patch_first_trim_loops.push_back(0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<hyperboloid, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t  k3d::uuid(0xb653277c, 0x7bba4505, 0xbabcd65d, 0x591ecedf),\n\t\t  \"NurbsHyperboloid\",\n\t\t  _(\"Generates a NURBS hyperboloid\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x1;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y1;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z1;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x2;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y2;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z2;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_thetamax;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// hyperboloid_factory\n\nk3d::iplugin_factory& hyperboloid_factory()\n{\n\treturn hyperboloid::get_factory();\n}\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/nurbs_sources/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\nextern k3d::iplugin_factory& circle_factory();\nextern k3d::iplugin_factory& cone_factory();\nextern k3d::iplugin_factory& curve_factory();\nextern k3d::iplugin_factory& cylinder_factory();\nextern k3d::iplugin_factory& disk_factory();\nextern k3d::iplugin_factory& grid_factory();\nextern k3d::iplugin_factory& hyperboloid_factory();\nextern k3d::iplugin_factory& paraboloid_factory();\nextern k3d::iplugin_factory& polygon_factory();\nextern k3d::iplugin_factory& sphere_factory();\nextern k3d::iplugin_factory& torus_factory();\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::nurbs::source::circle_factory());\n\tRegistry.register_factory(module::nurbs::source::cone_factory());\n\tRegistry.register_factory(module::nurbs::source::curve_factory());\n\tRegistry.register_factory(module::nurbs::source::cylinder_factory());\n\tRegistry.register_factory(module::nurbs::source::disk_factory());\n\tRegistry.register_factory(module::nurbs::source::grid_factory());\n\tRegistry.register_factory(module::nurbs::source::hyperboloid_factory());\n\tRegistry.register_factory(module::nurbs::source::paraboloid_factory());\n\tRegistry.register_factory(module::nurbs::source::polygon_factory());\n\tRegistry.register_factory(module::nurbs::source::sphere_factory());\n\tRegistry.register_factory(module::nurbs::source::torus_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/nurbs_sources/paraboloid.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometric_operations.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// paraboloid\n\nclass paraboloid :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tparaboloid(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_zmax(init_owner(*this) + init_name(\"zmax\") + init_label(_(\"Z max\")) + init_description(_(\"Maximum point position\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_zmin(init_owner(*this) + init_name(\"zmin\") + init_label(_(\"Z min\")) + init_description(_(\"Origin position\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_thetamax(init_owner(*this) + init_name(\"thetamax\") + init_label(_(\"Theta max\")) + init_description(_(\"From RenderMan specification\")) + init_value(k3d::radians(360.0)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_zmax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_zmin.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_thetamax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tconst k3d::double_t zmax = m_zmax.pipeline_value();\n\t\tconst k3d::double_t zmin = std::max(0.0, std::min(zmax, m_zmin.pipeline_value()));\n\t\tconst k3d::double_t thetamax = m_thetamax.pipeline_value();\n\n\t\tconst k3d::double_t z1 = zmax ? zmin / zmax : 0.0;\n\t\tconst k3d::double_t z3 = 1.0;\n\n\t\tconst k3d::double_t r1 = std::sqrt(z1);\n\t\tconst k3d::double_t r3 = 1.0;\n\n\t\tconst k3d::point3 p1(r1, z1, 0);\n\t\tconst k3d::point3 p3(r3, z3, 0);\n\n\t\tconst k3d::vector3 t1(1, 2 * std::sqrt(z1), 0);\n\t\tconst k3d::vector3 t3(1, 2, 0);\n\n\t\tk3d::point3 p2;\n\t\tk3d::intersect_lines(p1, t1, p3, t3, p2);\n\n\t\tconst k3d::double_t z2 = p2[1];\n\t\tconst k3d::double_t r2 = p2[0];\n\n\t\t// Compute NURBS control points ...\n\t\tk3d::mesh::knots_t u_knots;\n\t\tk3d::mesh::weights_t weights;\n\t\tk3d::mesh::points_t control_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, thetamax, 4, u_knots, weights, control_points);\n\n\t\t// Create patch ...\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> primitive(k3d::nurbs_patch::create(Output));\n\n\t\tprimitive->patch_first_points.push_back(primitive->patch_points.size());\n\t\tprimitive->patch_u_point_counts.push_back(control_points.size());\n\t\tprimitive->patch_v_point_counts.push_back(3);\n\t\tprimitive->patch_u_orders.push_back(3);\n\t\tprimitive->patch_v_orders.push_back(3);\n\t\tprimitive->patch_u_first_knots.push_back(primitive->patch_u_knots.size());\n\t\tprimitive->patch_v_first_knots.push_back(primitive->patch_v_knots.size());\n\t\tprimitive->patch_selections.push_back(0);\n\t\tprimitive->patch_materials.push_back(material);\n\n\t\tfor(k3d::uint_t j = 0; j != control_points.size(); ++j)\n\t\t{\n\t\t\tprimitive->patch_points.push_back(points.size());\n\t\t\tprimitive->patch_point_weights.push_back(weights[j]);\n\n\t\t\tpoints.push_back((r1 * radius * control_points[j] + z1 * zmax * k3d::point3(0, 0, 1)));\n\t\t\tpoint_selection.push_back(0);\n\t\t}\n\n\t\tfor(k3d::uint_t j = 0; j != control_points.size(); ++j)\n\t\t{\n\t\t\tprimitive->patch_points.push_back(points.size());\n\t\t\tprimitive->patch_point_weights.push_back(weights[j]);\n\n\t\t\tpoints.push_back((r2 * radius * control_points[j] + z2 * zmax * k3d::point3(0, 0, 1)));\n\t\t\tpoint_selection.push_back(0);\n\t\t}\n\n\t\tfor(k3d::uint_t j = 0; j != control_points.size(); ++j)\n\t\t{\n\t\t\tprimitive->patch_points.push_back(points.size());\n\t\t\tprimitive->patch_point_weights.push_back(weights[j]);\n\n\t\t\tpoints.push_back((r3 * radius * control_points[j] + z3 * zmax * k3d::point3(0, 0, 1)));\n\t\t\tpoint_selection.push_back(0);\n\t\t}\n\n\t\tprimitive->patch_u_knots.assign(u_knots.begin(), u_knots.end());\n\n\t\tprimitive->patch_v_knots.push_back(0);\n\t\tprimitive->patch_v_knots.push_back(0);\n\t\tprimitive->patch_v_knots.push_back(0);\n\t\tprimitive->patch_v_knots.push_back(1);\n\t\tprimitive->patch_v_knots.push_back(1);\n\t\tprimitive->patch_v_knots.push_back(1);\n\n\t\tprimitive->patch_trim_loop_counts.push_back(0);\n\t\tprimitive->patch_first_trim_loops.push_back(0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<paraboloid, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t  k3d::uuid(0x571a61d0, 0x272349da, 0xb4460a4f, 0x025378a6),\n\t\t  \"NurbsParaboloid\",\n\t\t  _(\"Generates a NURBS paraboloid\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_zmax;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_zmin;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_thetamax;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// paraboloid_factory\n\nk3d::iplugin_factory& paraboloid_factory()\n{\n\treturn paraboloid::get_factory();\n}\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/nurbs_sources/polygon.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// polygon\n\nclass polygon :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tpolygon(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"radius\")) + init_description(_(\"Radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"u_segments\")) + init_description(_(\"Sides\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\n\t\t// Compute control points ...\n\t\tk3d::mesh::points_t control_points;\n\t\tfor(k3d::int32_t i = 0; i != u_segments; ++i)\n\t\t{\n\t\t\tconst k3d::double_t angle = k3d::pi_over_2() + k3d::pi_times_2() / static_cast<k3d::double_t>(u_segments) * static_cast<k3d::double_t>(i);\n\n\t\t\tcontrol_points.push_back(radius * k3d::point3(std::cos(angle), std::sin(angle), 0));\n\t\t}\n\n\t\t// Create curve ...\n\t\tOutput.points.create();\n\t\tOutput.point_selection.create();\t\n\t\t\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> primitive(k3d::nurbs_curve::create(Output));\n\t\tprimitive->material.push_back(material);\n\n\t\tk3d::nurbs_curve::add_curve(Output, *primitive, 2, control_points, 1);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<polygon, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t  k3d::uuid(0x49796f52, 0x2e29f346, 0xbd47e3c9, 0xfb899a81),\n\t\t  \"NurbsPolygon\",\n\t\t  _(\"Generates a NURBS polygon\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// polygon_factory\n\nk3d::iplugin_factory& polygon_factory()\n{\n\treturn polygon::get_factory();\n}\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/nurbs_sources/sphere.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sphere\n\nclass sphere :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tsphere(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"radius\")) + init_description(_(\"Radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_zmax(init_owner(*this) + init_name(\"zmax\") + init_label(_(\"zmax\")) + init_description(_(\"ZMax\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_zmin(init_owner(*this) + init_name(\"zmin\") + init_label(_(\"zmin\")) + init_description(_(\"ZMin\")) + init_value(-1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_thetamax(init_owner(*this) + init_name(\"thetamax\") + init_label(_(\"thetamax\")) + init_description(_(\"thetamax\")) + init_value(k3d::radians(360.0)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"u_segments\")) + init_description(_(\"Radial Segments\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_segments(init_owner(*this) + init_name(\"v_segments\") + init_label(_(\"v_segments\")) + init_description(_(\"Radial Segments\")) + init_value(2) + init_constraint(constraint::minimum<k3d::int32_t>(2)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_zmax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_zmin.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_thetamax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_v_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tconst k3d::double_t zmax = m_zmax.pipeline_value();\n\t\tconst k3d::double_t zmin = m_zmin.pipeline_value();\n\t\tconst k3d::double_t thetamax = m_thetamax.pipeline_value();\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\n\t\tconst k3d::double_t phimin = (zmin > -1) ? asin(zmin) : -k3d::pi_over_2();\n\t\tconst k3d::double_t phimax = (zmax < 1) ? asin(zmax) : k3d::pi_over_2();\n\n\t\t// Compute NURBS control points ...\n\t\tk3d::mesh::knots_t v_knots;\n\t\tk3d::mesh::weights_t v_weights;\n\t\tk3d::mesh::points_t v_control_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(0, 1, 0), k3d::vector3(0, 0, 1), phimin, phimax, v_segments, v_knots, v_weights, v_control_points);\n\n\t\tk3d::mesh::knots_t u_knots;\n\t\tk3d::mesh::weights_t u_weights;\n\t\tk3d::mesh::points_t u_control_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, thetamax, u_segments, u_knots, u_weights, u_control_points);\n\n\t\t// Create patch ...\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> primitive(k3d::nurbs_patch::create(Output));\n\n\t\tprimitive->patch_first_points.push_back(primitive->patch_points.size());\n\t\tprimitive->patch_u_point_counts.push_back(u_control_points.size());\n\t\tprimitive->patch_v_point_counts.push_back(v_control_points.size());\n\t\tprimitive->patch_u_orders.push_back(3);\n\t\tprimitive->patch_v_orders.push_back(3);\n\t\tprimitive->patch_u_first_knots.push_back(primitive->patch_u_knots.size());\n\t\tprimitive->patch_v_first_knots.push_back(primitive->patch_v_knots.size());\n\t\tprimitive->patch_selections.push_back(0);\n\t\tprimitive->patch_materials.push_back(material);\n\n\t\tfor(k3d::uint_t v = 0; v != v_control_points.size(); ++v)\n\t\t{\n\t\t\tconst k3d::point3 offset = radius * v_control_points[v][2] * k3d::point3(0, 0, 1);\n\t\t\tconst k3d::double_t radius2 = radius * v_control_points[v][1];\n\t\t\tconst k3d::double_t v_weight = v_weights[v];\n\n\t\t\tfor(k3d::uint_t u = 0; u != u_control_points.size(); ++u)\n\t\t\t{\n\t\t\t\tprimitive->patch_points.push_back(points.size());\n\t\t\t\tprimitive->patch_point_weights.push_back(v_weight * u_weights[u]);\n\n\t\t\t\tpoints.push_back((radius2 * u_control_points[u]) + offset);\n\t\t\t\tpoint_selection.push_back(0);\n\t\t\t}\n\t\t}\n\n\t\tprimitive->patch_u_knots.assign(u_knots.begin(), u_knots.end());\n\t\tprimitive->patch_v_knots.assign(v_knots.begin(), v_knots.end());\n\n\t\tprimitive->patch_trim_loop_counts.push_back(0);\n\t\tprimitive->patch_first_trim_loops.push_back(0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sphere, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t  k3d::uuid(0x082eeef0, 0x837f4277, 0xa7c21ff1, 0x839b286e),\n\t\t  \"NurbsSphere\",\n\t\t  _(\"Generates a NURBS sphere\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_zmax;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_zmin;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_thetamax;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_segments;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// sphere_factory\n\nk3d::iplugin_factory& sphere_factory()\n{\n\treturn sphere::get_factory();\n}\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\n\n\n"
  },
  {
    "path": "modules/nurbs_sources/torus.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace nurbs\n{\n\nnamespace source\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// torus\n\nclass torus :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\ttorus(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_majorradius(init_owner(*this) + init_name(\"majorradius\") + init_label(_(\"majorradius\")) + init_description(_(\"Major Radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_minorradius(init_owner(*this) + init_name(\"minorradius\") + init_label(_(\"minorradius\")) + init_description(_(\"Minor Radius\")) + init_value(2.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_phimin(init_owner(*this) + init_name(\"phimin\") + init_label(_(\"phimin\")) + init_description(_(\"Phi Minimum\")) + init_value(0.0) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_phimax(init_owner(*this) + init_name(\"phimax\") + init_label(_(\"phimax\")) + init_description(_(\"Phi Maximum\")) + init_value(k3d::radians(360.0)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_thetamax(init_owner(*this) + init_name(\"thetamax\") + init_label(_(\"thetamax\")) + init_description(_(\"Theta Maximum\")) + init_value(k3d::radians(360.0)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"u_segments\")) + init_description(_(\"U Segments\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_segments(init_owner(*this) + init_name(\"v_segments\") + init_label(_(\"v_segments\")) + init_description(_(\"V Segments\")) + init_value(4) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_majorradius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_minorradius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_phimin.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_phimax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_thetamax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_v_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t majorradius = m_majorradius.pipeline_value();\n\t\tconst k3d::double_t minorradius = m_minorradius.pipeline_value();\n\t\tconst k3d::double_t phimin = m_phimin.pipeline_value();\n\t\tconst k3d::double_t phimax = m_phimax.pipeline_value();\n\t\tconst k3d::double_t thetamax = m_thetamax.pipeline_value();\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\n\t\t// Compute NURBS control points ...\n\t\tk3d::mesh::knots_t v_knots;\n\t\tk3d::mesh::weights_t v_weights;\n\t\tk3d::mesh::points_t v_control_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(0, 1, 0), k3d::vector3(0, 0, 1), phimin, phimax, v_segments, v_knots, v_weights, v_control_points);\n\n\t\tk3d::mesh::knots_t u_knots;\n\t\tk3d::mesh::weights_t u_weights;\n\t\tk3d::mesh::points_t u_control_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, thetamax, u_segments, u_knots, u_weights, u_control_points);\n\n\t\t// Create patch ...\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> primitive(k3d::nurbs_patch::create(Output));\n\n\t\tprimitive->patch_first_points.push_back(primitive->patch_points.size());\n\t\tprimitive->patch_u_point_counts.push_back(u_control_points.size());\n\t\tprimitive->patch_v_point_counts.push_back(v_control_points.size());\n\t\tprimitive->patch_u_orders.push_back(3);\n\t\tprimitive->patch_v_orders.push_back(3);\n\t\tprimitive->patch_u_first_knots.push_back(primitive->patch_u_knots.size());\n\t\tprimitive->patch_v_first_knots.push_back(primitive->patch_v_knots.size());\n\t\tprimitive->patch_selections.push_back(0);\n\t\tprimitive->patch_materials.push_back(material);\n\n\t\tfor(k3d::uint_t v = 0; v != v_control_points.size(); ++v)\n\t\t{\n\t\t\tconst k3d::point3 offset = minorradius * v_control_points[v][2] * k3d::point3(0, 0, 1);\n\t\t\tconst double radius2 = majorradius + (minorradius * v_control_points[v][1]);\n\t\t\tconst double v_weight = v_weights[v];\n\n\t\t\tfor(k3d::uint_t u = 0; u != u_control_points.size(); ++u)\n\t\t\t{\n\t\t\t\tprimitive->patch_points.push_back(points.size());\n\t\t\t\tprimitive->patch_point_weights.push_back(v_weight * u_weights[u]);\n\n\t\t\t\tpoints.push_back((radius2 * u_control_points[u]) + offset);\n\t\t\t\tpoint_selection.push_back(0);\n\t\t\t}\n\t\t}\n\n\t\tprimitive->patch_u_knots.assign(u_knots.begin(), u_knots.end());\n\t\tprimitive->patch_v_knots.assign(v_knots.begin(), v_knots.end());\n\n\t\tprimitive->patch_trim_loop_counts.push_back(0);\n\t\tprimitive->patch_first_trim_loops.push_back(0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<torus, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t  k3d::uuid(0xc6cb880c, 0x4e4d4028, 0x8c77305f, 0x4b8f05a2),\n\t\t  \"NurbsTorus\",\n\t\t  _(\"Generates a NURBS torus\"),\n\t\t  \"NURBS\",\n\t\t  k3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_majorradius;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_minorradius;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_phimin;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_phimax;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_thetamax;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_segments;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// torus_factory\n\nk3d::iplugin_factory& torus_factory()\n{\n\treturn torus::get_factory();\n}\n\n} // namespace source\n\n} // namespace nurbs\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/obj_io/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-obj-io)\nK3D_CREATE_MODULE_PROXY(k3d-obj-io)\n\n"
  },
  {
    "path": "modules/obj_io/mesh_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"obj_parser.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_reader.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace obj\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_reader\n\nclass mesh_reader :\n\tpublic k3d::material_sink<k3d::mesh_reader<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_reader<k3d::node > > base;\n\npublic:\n\tmesh_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reload_mesh_slot()));\n\t}\n\n\tvoid on_load_mesh(const k3d::filesystem::path& Path, k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::filesystem::ifstream file(Path);\n\t\tif(!file)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << Path.native_console_string() << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tmy_parser parser(Output, m_material.pipeline_value());\n\t\tparser.parse(file);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_reader,\n                k3d::interface_list<k3d::imesh_source,\n                k3d::interface_list<k3d::imesh_storage> > > factory(\n\t\t\tk3d::uuid(0x650f96b9, 0xe1c145d5, 0x9eda410d, 0x13f4e98f),\n\t\t\t\"OBJMeshReader\",\n\t\t\t_(\"Mesh reader that loads external Wavefront (.obj) files into the document by reference\"),\n\t\t\t\"MeshReader\");\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t/// Implementation of obj_parser that instantiates just points and faces to start ...\n\tclass my_parser :\n\t\tpublic obj_parser\n\t{\n\tpublic:\n\t\tmy_parser(k3d::mesh& Mesh, k3d::imaterial* const Material) :\n\t\t\tmesh(Mesh),\n\t\t\tmaterial(Material),\n\t\t\tpoints(0),\n\t\t\tpoint_selection(0),\n\t\t\tu_order(0),\n\t\t\tv_order(0),\n\t\t\ts0(0),\n\t\t\ts1(0),\n\t\t\tt0(0),\n\t\t\tt1(0)\n\t\t{\n\t\t}\n\n\tprivate:\n\t\tk3d::mesh& mesh;\n\t\tk3d::imaterial* const material;\n\t\tk3d::mesh::points_t* points;\n\t\tk3d::mesh::selection_t* point_selection;\n\t\tboost::scoped_ptr<k3d::mesh::weights_t> point_weights; // Note: *not* part of the mesh!\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron;\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> nurbs_patch;\n\n\t\tk3d::string_t curve_surface_type;\n\t\tk3d::uint_t u_order;\n\t\tk3d::uint_t v_order;\n\t\tk3d::double_t s0;\n\t\tk3d::double_t s1;\n\t\tk3d::double_t t0;\n\t\tk3d::double_t t1;\n\t\tk3d::mesh::indices_t vertex_coordinates;\n\t\tk3d::mesh::indices_t texture_coordinates;\n\t\tk3d::mesh::indices_t normal_coordinates;\n\t\tk3d::mesh::knots_t u_knots;\n\t\tk3d::mesh::knots_t v_knots;\n\n\t\tvoid on_vertex_coordinates(const k3d::point4& Vertex)\n\t\t{\n\t\t\tif(!points)\n\t\t\t\tpoints = &mesh.points.create();\n\n\t\t\tif(!point_selection)\n\t\t\t\tpoint_selection = &mesh.point_selection.create();\n\n\t\t\tif(!point_weights)\n\t\t\t\tpoint_weights.reset(new k3d::mesh::weights_t()); // Note: *not* part of the mesh!\n\n\t\t\tpoints->push_back(k3d::point3(Vertex[0], Vertex[1], Vertex[2]));\n\t\t\tpoint_selection->push_back(0.0);\n\t\t\tpoint_weights->push_back(Vertex[3]);\n\t\t}\n\n\t\tvoid on_face(const k3d::mesh::indices_t& Points, const k3d::mesh::indices_t& TexturePoints, const k3d::mesh::indices_t& Normals)\n\t\t{\n\t\t\tif(!polyhedron)\n\t\t\t{\n\t\t\t\tpolyhedron.reset(k3d::polyhedron::create(mesh));\n\t\t\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t\t\t}\n\n\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\tpolyhedron->face_selections.push_back(0.0);\n\t\t\tpolyhedron->face_materials.push_back(material);\n\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\tconst k3d::uint_t point_begin = 0;\n\t\t\tconst k3d::uint_t point_end = point_begin + Points.size();\n\t\t\tconst k3d::uint_t first_edge = polyhedron->clockwise_edges.size();\n\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t{\n\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\tpolyhedron->edge_selections.push_back(0.0);\n\t\t\t\tpolyhedron->vertex_points.push_back(Points[point]);\n\t\t\t\tpolyhedron->vertex_selections.push_back(0.0);\n\t\t\t}\n\t\t\tpolyhedron->clockwise_edges.back() = first_edge;\n\t\t}\n\n\t\tvoid on_curve_surface_type(const k3d::string_t& Type)\n\t\t{\n\t\t\tcurve_surface_type = Type;\n\t\t}\n\n\t\tvoid on_degree(const k3d::uint_t& UDegree, const k3d::uint_t& VDegree)\n\t\t{\n\t\t\tu_order = UDegree + 1;\n\t\t\tv_order = VDegree + 1;\n\t\t}\n\n\t\tvoid on_surface(const k3d::double_t& S0, const k3d::double_t& S1, const k3d::double_t& T0, const k3d::double_t& T1, const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates, const k3d::mesh::indices_t& NormalCoordinates)\n\t\t{\n\t\t\ts0 = S0;\n\t\t\ts1 = S1;\n\t\t\tt0 = T0;\n\t\t\tt1 = T1;\n\t\t\tvertex_coordinates = VertexCoordinates;\n\t\t\ttexture_coordinates = TextureCoordinates;\n\t\t\tnormal_coordinates = NormalCoordinates;\n\t\t}\n\n\t\tvoid on_parameter(const k3d::string_t& Direction, const k3d::mesh::knots_t& Knots)\n\t\t{\n\t\t\tif(Direction == \"u\")\n\t\t\t{\n\t\t\t\tu_knots = Knots;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if(Direction == \"v\")\n\t\t\t{\n\t\t\t\tv_knots = Knots;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthrow std::runtime_error(\"unknown knot direction: \" + Direction);\n\t\t}\n\n\t\tvoid on_curve_surface_end()\n\t\t{\n\t\t\tif(curve_surface_type != \"bspline\")\n\t\t\t\tthrow std::runtime_error(\"unknown surface type [\" + curve_surface_type + \"] will be ignored\");\n\t\t\t\n\t\t\tconst k3d::uint_t expected_vertex_count = (u_knots.size() - u_order) * (v_knots.size() - v_order);\n\t\t\tif(expected_vertex_count != vertex_coordinates.size())\n\t\t\t\tthrow std::runtime_error(\"invalid vertex count for bspline surface\");\n\n\t\t\tif(!nurbs_patch)\n\t\t\t\tnurbs_patch.reset(k3d::nurbs_patch::create(mesh));\n\n\t\t\tnurbs_patch->patch_first_points.push_back(nurbs_patch->patch_points.size());\n\t\t\tnurbs_patch->patch_u_point_counts.push_back(u_knots.size() - u_order);\n\t\t\tnurbs_patch->patch_v_point_counts.push_back(v_knots.size() - v_order);\n\t\t\tnurbs_patch->patch_u_orders.push_back(u_order);\n\t\t\tnurbs_patch->patch_v_orders.push_back(v_order);\n\t\t\tnurbs_patch->patch_u_first_knots.push_back(nurbs_patch->patch_u_knots.size());\n\t\t\tnurbs_patch->patch_v_first_knots.push_back(nurbs_patch->patch_v_knots.size());\n\t\t\tnurbs_patch->patch_selections.push_back(0);\n\t\t\tnurbs_patch->patch_materials.push_back(static_cast<k3d::imaterial*>(0));\n\t\t\tnurbs_patch->patch_points.insert(nurbs_patch->patch_points.end(), vertex_coordinates.begin(), vertex_coordinates.end());\n\n\t\t\tfor(k3d::uint_t i = 0; i != vertex_coordinates.size(); ++i)\n\t\t\t\tnurbs_patch->patch_point_weights.push_back((*point_weights)[vertex_coordinates[i]]);\n\n\t\t\tnurbs_patch->patch_u_knots.insert(nurbs_patch->patch_u_knots.end(), u_knots.begin(), u_knots.end());\n\t\t\tnurbs_patch->patch_v_knots.insert(nurbs_patch->patch_v_knots.end(), v_knots.begin(), v_knots.end());\n\n\t\t\tnurbs_patch->patch_trim_loop_counts.push_back(0);\n\t\t\tnurbs_patch->patch_first_trim_loops.push_back(0);\n\n\t\t\tcurve_surface_type.clear();\n\t\t\tu_order = 0;\n\t\t\tv_order = 0;\n\t\t\ts0 = 0;\n\t\t\ts1 = 0;\n\t\t\tt0 = 0;\n\t\t\tt1 = 0;\n\t\t\tvertex_coordinates.clear();\n\t\t\ttexture_coordinates.clear();\n\t\t\tnormal_coordinates.clear();\n\t\t\tu_knots.clear();\n\t\t\tv_knots.clear();\n\t\t}\n\t};\n};\n\nk3d::iplugin_factory& mesh_reader_factory()\n{\n\treturn mesh_reader::get_factory();\n}\n\n} // namespace io\n\n} // namespace obj\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/obj_io/mesh_writer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Wladyslaw Strugala (fizws@julia.univ.gda.pl)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/mesh_writer.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace obj\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_writer\n\nclass mesh_writer :\n\tpublic k3d::mesh_writer<k3d::node >\n{\n\ttypedef k3d::mesh_writer<k3d::node > base;\n\npublic:\n\tmesh_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_writer, k3d::interface_list<k3d::imesh_sink > > factory(\n\t\t\tk3d::uuid(0x32120889, 0x85964fd3, 0x8dac7deb, 0xe3fc9676),\n\t\t\t\"OBJMeshWriter\",\n\t\t\t_(\"Mesh writer that saves external Wavefront (.obj) files\"),\n\t\t\t\"MeshWriter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_write_mesh(const k3d::mesh& Input, const k3d::filesystem::path& OutputPath, std::ostream& Output)\n\t{\n\t\tOutput << \"# Written by K-3D \" << K3D_VERSION << \"\\n\\n\";\n\n\t\t// Store points ...\n\t\tif(Input.points)\n\t\t{\n\t\t\tconst k3d::mesh::points_t& points = *Input.points;\n\t\t\t\n\t\t\tconst k3d::uint_t point_begin = 0;\n\t\t\tconst k3d::uint_t point_end = point_begin + points.size();\n\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\tOutput << \"v \" << points[point][0] << \" \" << points[point][1] << \" \" << points[point][2] << \"\\n\";\t\n\t\t}\n\n\t\t// Store polyhedra ...\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Input, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tOutput << \"f\";\n\n\t\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\tconst k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t{\n\t\t\t\t\t\tOutput << \" \" << polyhedron->vertex_points[edge] + 1; //specs want indices starting with 1\n\n\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\t/** \\todo Support faces with holes */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tOutput << \"\\n\";\n\t\t\t}\n\t\t}\n\t}\n};\n\nk3d::iplugin_factory& mesh_writer_factory()\n{\n\treturn mesh_writer::get_factory();\n}\n\n} // namespace io\n\n} // namespace obj\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/obj_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace obj\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& mesh_reader_factory();\nextern k3d::iplugin_factory& mesh_writer_factory();\n\n} // namespace io\n\n} // namespace obj\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::obj::io::mesh_reader_factory());\n\tRegistry.register_factory(module::obj::io::mesh_writer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/obj_io/obj_parser.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Wladyslaw Strugala (fizws@julia.univ.gda.pl)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"obj_parser.h\"\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/file_helpers.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/texture3.h>\n\n#include <iostream>\n#include <iterator>\n#include <stdexcept>\n\nnamespace module\n{\n\nnamespace obj\n{\n\nnamespace io\n{\n\nnamespace detail\n{\n\n/// Converts one-based indices and negative indices to zero-based indices\nk3d::uint_t zero_based_index(const int Index, const k3d::uint_t& CurrentCount)\n{\n\tif(Index > 0)\n\t\treturn Index - 1;\n\t\n\tif(Index < 0)\n\t\treturn CurrentCount + Index;\n\n\tk3d::log() << error << \"Invalid zero index\" << std::endl;\n\treturn 0;\n}\n\nvoid read_vertices(std::istream& Stream, k3d::mesh::indices_t& VertexCoordinates, const k3d::uint_t& VertexCount)\n{\n\tint vertex_coordinate;\n\tfor(Stream >> vertex_coordinate; Stream; Stream >> vertex_coordinate)\n\t\tVertexCoordinates.push_back(zero_based_index(vertex_coordinate, VertexCount));\n}\n\nvoid read_vertices(std::istream& Stream, k3d::mesh::indices_t& VertexCoordinates, k3d::mesh::indices_t& TextureCoordinates, const k3d::uint_t& VertexCount, const k3d::uint_t& TextureCount)\n{\n\tint vertex_coordinate;\n\tfor(Stream >> vertex_coordinate; Stream; Stream >> vertex_coordinate)\n\t{\n\t\tVertexCoordinates.push_back(zero_based_index(vertex_coordinate, VertexCount));\n\t\tif(Stream.peek() == '/')\n\t\t{\n\t\t\tchar separator;\n\t\t\tint texture_coordinate;\n\t\t\tStream >> separator >> texture_coordinate;\n\t\t\tif(Stream)\n\t\t\t\tTextureCoordinates.push_back(zero_based_index(texture_coordinate, TextureCount));\n\t\t}\n\t}\n\n\t// Sanity check - the number of texture coordinates must equal the number of vertices if nonzero\n\tif(TextureCoordinates.size() && TextureCoordinates.size() != VertexCoordinates.size())\n\t\tthrow std::runtime_error(\"inconsistent use of texture coordinates\");\n}\n\nvoid read_vertices(std::istream& Stream, k3d::mesh::indices_t& VertexCoordinates, k3d::mesh::indices_t& TextureCoordinates, k3d::mesh::indices_t& NormalCoordinates, const k3d::uint_t& VertexCount, const k3d::uint_t& TextureCount, const k3d::uint_t& NormalCount)\n{\n\tint vertex_coordinate;\n\tfor(Stream >> vertex_coordinate; Stream; Stream >> vertex_coordinate)\n\t{\n\t\tVertexCoordinates.push_back(zero_based_index(vertex_coordinate, VertexCount));\n\t\tif(Stream.peek() == '/')\n\t\t{\n\t\t\tchar separator;\n\t\t\tint texture_coordinate;\n\t\t\tStream >> separator >> texture_coordinate;\n\t\t\tif(Stream)\n\t\t\t{\n\t\t\t\tTextureCoordinates.push_back(zero_based_index(texture_coordinate, TextureCount));\n\t\t\t\tif(Stream.peek() == '/')\n\t\t\t\t{\n\t\t\t\t\tchar separator;\n\t\t\t\t\tint normal_coordinate;\n\t\t\t\t\tStream >> separator >> normal_coordinate;\n\t\t\t\t\tif(Stream)\n\t\t\t\t\t\tNormalCoordinates.push_back(zero_based_index(normal_coordinate, NormalCount));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Sanity check - the number of texture coordinates must equal the number of vertices if nonzero\n\tif(TextureCoordinates.size() && TextureCoordinates.size() != VertexCoordinates.size())\n\t\tthrow std::runtime_error(\"inconsistent use of texture coordinates\");\n\n\t// Sanity check - the number of normal coordinates must equal the number of vertices if nonzero\n\tif(NormalCoordinates.size() && NormalCoordinates.size() != VertexCoordinates.size())\n\t\tthrow std::runtime_error(\"inconsistent use of normal coordinates\");\n}\n\n} // namespace detail\n\n//////////////////////////////////////////////////////////////////////////////////////////\n// obj_parser\n\nvoid obj_parser::parse(std::istream& Stream)\n{\n\tk3d::uint_t line_count = 0; // Track the number of lines parsed\n\tk3d::uint_t v_count = 0; // Track the number of vertex coordinates parsed\n\tk3d::uint_t vn_count = 0; // Track the number of vertex normal coordinates parsed\n\tk3d::uint_t vt_count = 0; // Track the number of vertex texture coordinates parsed\n\n\ttry\n\t{\n\t\tk3d::string_t line_buffer;\n\t\tfor(k3d::getline(Stream, line_buffer); Stream; k3d::getline(Stream, line_buffer))\n\t\t{\n\t\t\t++line_count;\n\n\t\t\t// Skip blank lines ...\n\t\t\tif(line_buffer.empty())\n\t\t\t\tcontinue;\n\n\t\t\t// Skip comments ...\n\t\t\tif(line_buffer[0] == '#')\n\t\t\t\tcontinue;\n\n\t\t\t// Start looking for keywords ...\n\t\t\tk3d::string_t keyword;\n\t\t\tstd::istringstream line_stream(line_buffer);\n\t\t\tline_stream >> keyword;\n\n\t\t\tif(keyword == \"cstype\")\n\t\t\t{\n\t\t\t\tk3d::string_t type;\n\t\t\t\tline_stream >> type;\n\n\t\t\t\ton_curve_surface_type(type);\n\t\t\t}\n\t\t\telse if(keyword == \"deg\")\n\t\t\t{\n\t\t\t\tk3d::uint_t u_degree = 0;\n\t\t\t\tk3d::uint_t v_degree = 0;\n\t\t\t\tline_stream >> u_degree >> v_degree;\n\n\t\t\t\ton_degree(u_degree, v_degree);\n\t\t\t}\n\t\t\telse if(keyword == \"end\")\n\t\t\t{\n\t\t\t\ton_curve_surface_end();\n\t\t\t}\n\t\t\telse if(keyword == \"f\")\n\t\t\t{\n\t\t\t\tk3d::mesh::indices_t vertex_coordinates;\n\t\t\t\tk3d::mesh::indices_t texture_coordinates;\n\t\t\t\tk3d::mesh::indices_t normal_coordinates; \n\t\t\t\tdetail::read_vertices(line_stream, vertex_coordinates, texture_coordinates, normal_coordinates, v_count, vt_count, vn_count);\n\t\t\t\n\t\t\t\tif(vertex_coordinates.size() < 3)\n\t\t\t\t\tthrow std::runtime_error(\"face contains less than three vertices\");\n\n\t\t\t\ton_face(vertex_coordinates, texture_coordinates, normal_coordinates);\n\t\t\t}\n\t\t\telse if(keyword == \"g\")\n\t\t\t{\n\t\t\t\tk3d::string_t name;\n\t\t\t\tline_stream >> name;\n\n\t\t\t\ton_group(name);\n\t\t\t}\n\t\t\telse if(keyword == \"l\")\n\t\t\t{\n\t\t\t\tk3d::mesh::indices_t vertex_coordinates;\n\t\t\t\tk3d::mesh::indices_t texture_coordinates;\n\t\t\t\tdetail::read_vertices(line_stream, vertex_coordinates, texture_coordinates, v_count, vt_count);\n\n\t\t\t\ton_line(vertex_coordinates, texture_coordinates);\n\t\t\t}\n\t\t\telse if(keyword == \"mtllib\")\n\t\t\t{\n\t\t\t\tk3d::string_t name;\n\t\t\t\tline_stream >> name;\n\n\t\t\t\ton_material_library(name);\n\t\t\t}\n\t\t\telse if(keyword == \"o\")\n\t\t\t{\n\t\t\t\tk3d::string_t name;\n\t\t\t\tline_stream >> name;\n\n\t\t\t\ton_object(name);\n\t\t\t}\n\t\t\telse if(keyword == \"p\")\n\t\t\t{\n\t\t\t\tk3d::mesh::indices_t vertex_coordinates;\n\t\t\t\tdetail::read_vertices(line_stream, vertex_coordinates, v_count);\n\n\t\t\t\ton_points(vertex_coordinates);\n\t\t\t}\n\t\t\telse if(keyword == \"parm\")\n\t\t\t{\n\t\t\t\tk3d::string_t direction;\n\t\t\t\tline_stream >> direction;\n\n\t\t\t\tk3d::double_t knot;\n\t\t\t\tk3d::mesh::knots_t knots;\n\t\t\t\tfor(line_stream >> knot; line_stream; line_stream >> knot)\n\t\t\t\t\tknots.push_back(knot);\n\n\t\t\t\ton_parameter(direction, knots);\n\t\t\t}\n\t\t\telse if(keyword == \"surf\")\n\t\t\t{\n\t\t\t\tk3d::double_t s0, s1, t0, t1;\n\t\t\t\tline_stream >> s0 >> s1 >> t0 >> t1;\n\n\t\t\t\tk3d::mesh::indices_t vertex_coordinates;\n\t\t\t\tk3d::mesh::indices_t texture_coordinates;\n\t\t\t\tk3d::mesh::indices_t normal_coordinates; \n\t\t\t\tdetail::read_vertices(line_stream, vertex_coordinates, texture_coordinates, normal_coordinates, v_count, vt_count, vn_count);\n\n\t\t\t\ton_surface(s0, s1, t0, t1, vertex_coordinates, texture_coordinates, normal_coordinates);\n\t\t\t}\n\t\t\telse if(keyword == \"usemtl\")\n\t\t\t{\n\t\t\t\tk3d::string_t name;\n\t\t\t\tline_stream >> name;\n\n\t\t\t\ton_use_material(name);\n\t\t\t}\n\t\t\telse if(keyword == \"v\")\n\t\t\t{\n\t\t\t\t++v_count;\n\n\t\t\t\tk3d::point4 v(0, 0, 0, 1);\n\t\t\t\tline_stream >> v[0] >> v[1] >> v[2] >> v[3];\n\n\t\t\t\ton_vertex_coordinates(v);\n\t\t\t}\n\t\t\telse if(keyword == \"vn\")\n\t\t\t{\n\t\t\t\t++vn_count;\n\n\t\t\t\tk3d::normal3 vn(0, 0, 0);\n\t\t\t\tline_stream >> vn[0] >> vn[1] >> vn[2];\n\n\t\t\t\ton_normal_coordinates(vn);\n\t\t\t}\n\t\t\telse if(keyword == \"vt\")\n\t\t\t{\n\t\t\t\t++vt_count;\n\n\t\t\t\tk3d::texture3 vt(0, 0, 0);\n\t\t\t\tline_stream >> vt[0] >> vt[1] >> vt[2];\n\n\t\t\t\ton_texture_coordinates(vt);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"unsupported keyword [\" << keyword << \"] at line \" << line_count << \" will be ignored\" << std::endl;\n\t\t\t}\n\t\t}\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tk3d::log() << error << \"error parsing wavefront obj at line \" << line_count << \": \" << e.what() << std::endl;\n\t}\n\tcatch(...)\n\t{\n\t\tk3d::log() << error << \"error parsing wavefront obj at line \" << line_count << \": unknown exception\" << std::endl;\n\t}\n}\n\nvoid obj_parser::on_curve_surface_end()\n{\n}\n\nvoid obj_parser::on_curve_surface_type(const k3d::string_t& Type)\n{\n}\n\nvoid obj_parser::on_degree(const k3d::uint_t& UDegree, const k3d::uint_t& VDegree)\n{\n}\n\nvoid obj_parser::on_face(const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates, const k3d::mesh::indices_t& NormalCoordinates)\n{\n}\n\nvoid obj_parser::on_group(const k3d::string_t& Name)\n{\n}\n\nvoid obj_parser::on_line(const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates)\n{\n}\n\nvoid obj_parser::on_material_library(const k3d::string_t& Name)\n{\n}\n\nvoid obj_parser::on_normal_coordinates(const k3d::normal3& Normal)\n{\n}\n\nvoid obj_parser::on_object(const k3d::string_t& Name)\n{\n}\n\nvoid obj_parser::on_parameter(const k3d::string_t& Direction, const k3d::mesh::knots_t& Knots)\n{\n}\n\nvoid obj_parser::on_points(const k3d::mesh::indices_t& VertexCoordinates)\n{\n}\n\nvoid obj_parser::on_surface(const k3d::double_t& S0, const k3d::double_t& S1, const k3d::double_t& T0, const k3d::double_t& T1, const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates, const k3d::mesh::indices_t& NormalCoordinates)\n{\n}\n\nvoid obj_parser::on_texture_coordinates(const k3d::texture3& Texture)\n{\n}\n\nvoid obj_parser::on_use_material(const k3d::string_t& Name)\n{\n}\n\nvoid obj_parser::on_vertex_coordinates(const k3d::point4& Vertex)\n{\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////\n// print_obj\n\nvoid print_obj::on_curve_surface_end()\n{\n\tk3d::log() << info << \"on_curve_surface_end\" << std::endl;\n}\n\nvoid print_obj::on_curve_surface_type(const k3d::string_t& Type)\n{\n\tk3d::log() << info << \"on_curve_surface_type \" << Type << std::endl;\n}\n\nvoid print_obj::on_degree(const k3d::uint_t& UDegree, const k3d::uint_t& VDegree)\n{\n\tk3d::log() << info << \"on_degree \" << UDegree << \" \" << VDegree << std::endl;\n}\n\nvoid print_obj::on_face(const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates, const k3d::mesh::indices_t& NormalCoordinates)\n{\n\tk3d::log() << info << \"on_face \";\n\tstd::copy(VertexCoordinates.begin(), VertexCoordinates.end(), std::ostream_iterator<k3d::uint_t>(k3d::log(), \" \"));\n\tk3d::log() << std::endl;\n}\n\nvoid print_obj::on_group(const k3d::string_t& Name)\n{\n\tk3d::log() << info << \"on_group \" << Name << std::endl;\n}\n\nvoid print_obj::on_line(const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates)\n{\n\tk3d::log() << info << \"on_line \";\n\tstd::copy(VertexCoordinates.begin(), VertexCoordinates.end(), std::ostream_iterator<k3d::uint_t>(k3d::log(), \" \"));\n\tk3d::log() << std::endl;\n}\n\nvoid print_obj::on_material_library(const k3d::string_t& Name)\n{\n\tk3d::log() << info << \"on_material_library \" << Name << std::endl;\n}\n\nvoid print_obj::on_normal_coordinates(const k3d::normal3& Normal)\n{\n\tk3d::log() << info << \"on_normal_coordinates \" << Normal << std::endl;\n}\n\nvoid print_obj::on_object(const k3d::string_t& Name)\n{\n\tk3d::log() << info << \"on_object \" << Name << std::endl;\n}\n\nvoid print_obj::on_parameter(const k3d::string_t& Direction, const k3d::mesh::knots_t& Knots)\n{\n\tk3d::log() << info << \"on_parameter \" << Direction << \" \" << std::endl;\n\tstd::copy(Knots.begin(), Knots.end(), std::ostream_iterator<k3d::double_t>(k3d::log(), \" \"));\n\tk3d::log() << std::endl;\n}\n\nvoid print_obj::on_points(const k3d::mesh::indices_t& VertexCoordinates)\n{\n\tk3d::log() << info << \"on_points \";\n\tstd::copy(VertexCoordinates.begin(), VertexCoordinates.end(), std::ostream_iterator<k3d::uint_t>(k3d::log(), \" \"));\n\tk3d::log() << std::endl;\n}\n\nvoid print_obj::on_surface(const k3d::double_t& S0, const k3d::double_t& S1, const k3d::double_t& T0, const k3d::double_t& T1, const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates, const k3d::mesh::indices_t& NormalCoordinates)\n{\n\tk3d::log() << info << \"on_surface \" << S0 << \" \" << S1 << \" \" << T0 << \" \" << T1 << \" \";\n\tstd::copy(VertexCoordinates.begin(), VertexCoordinates.end(), std::ostream_iterator<k3d::uint_t>(k3d::log(), \" \"));\n\tk3d::log() << std::endl;\n}\n\nvoid print_obj::on_texture_coordinates(const k3d::texture3& Texture)\n{\n\tk3d::log() << info << \"on_texture_coordinates \" << Texture << std::endl;\n}\n\nvoid print_obj::on_use_material(const k3d::string_t& Name)\n{\n\tk3d::log() << info << \"on_use_material \" << Name << std::endl;\n}\n\nvoid print_obj::on_vertex_coordinates(const k3d::point4& Vertex)\n{\n\tk3d::log() << info << \"on_vertex_coordinates \" << Vertex << std::endl;\n}\n\n} // namespace io\n\n} // namespace obj\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/obj_io/obj_parser.h",
    "content": "#ifndef MODULES_OBJ_IO_OBJ_PARSER_H\n#define MODULES_OBJ_IO_OBJ_PARSER_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Wladyslaw Strugala (fizws@julia.univ.gda.pl)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <iosfwd>\n#include <k3dsdk/mesh.h>\n\nnamespace k3d { class normal3; }\nnamespace k3d { class point4; }\nnamespace k3d { class texture3; }\n\nnamespace module\n{\n\nnamespace obj\n{\n\nnamespace io\n{\n\n/// Template design pattern class for parsing Wavefront (.obj) files\nclass obj_parser\n{\npublic:\n\t/// Parse an input stream as an OBJ file, executing events based on the file contents\n\tvoid parse(std::istream& Stream);\n\nprivate:\n\t/// @{\n\t/// @name Override these methods in a derived class to handle the given parsing events\n\n\t/// \\note All indices are zero-based, regardless of the contents of the OBJ file\n\n\tvirtual void on_curve_surface_end();\n\tvirtual void on_curve_surface_type(const k3d::string_t& Type);\n\tvirtual void on_degree(const k3d::uint_t& UDegree, const k3d::uint_t& VDegree);\n\tvirtual void on_face(const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates, const k3d::mesh::indices_t& NormalCoordinates);\n\tvirtual void on_group(const k3d::string_t& Name);\n\tvirtual void on_line(const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates);\n\tvirtual void on_material_library(const k3d::string_t& Name);\n\tvirtual void on_normal_coordinates(const k3d::normal3& Normal);\n\tvirtual void on_object(const k3d::string_t& Name);\n\tvirtual void on_parameter(const k3d::string_t& Direction, const k3d::mesh::knots_t& Knots);\n\tvirtual void on_points(const k3d::mesh::indices_t& VertexCoordinates);\n\tvirtual void on_surface(const k3d::double_t& S0, const k3d::double_t& S1, const k3d::double_t& T0, const k3d::double_t& T1, const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates, const k3d::mesh::indices_t& NormalCoordinates);\n\tvirtual void on_texture_coordinates(const k3d::texture3& Texture);\n\tvirtual void on_use_material(const k3d::string_t& Name);\n\tvirtual void on_vertex_coordinates(const k3d::point4& Vertex);\n\n\t/// @}\n};\n\n/// Concrete implementation of obj_parser that does pretty-printing of the file contents for debugging\nclass print_obj :\n\tpublic obj_parser\n{\nprivate:\n\tvoid on_curve_surface_end();\n\tvoid on_curve_surface_type(const k3d::string_t& Type);\n\tvoid on_degree(const k3d::uint_t& UDegree, const k3d::uint_t& VDegree);\n\tvoid on_face(const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates, const k3d::mesh::indices_t& NormalCoordinates);\n\tvoid on_group(const k3d::string_t& Name);\n\tvoid on_line(const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates);\n\tvoid on_material_library(const k3d::string_t& Name);\n\tvoid on_normal_coordinates(const k3d::normal3& Normal);\n\tvoid on_object(const k3d::string_t& Name);\n\tvoid on_parameter(const k3d::string_t& Direction, const k3d::mesh::knots_t& Knots);\n\tvoid on_points(const k3d::mesh::indices_t& VertexCoordinates);\n\tvoid on_surface(const k3d::double_t& S0, const k3d::double_t& S1, const k3d::double_t& T0, const k3d::double_t& T1, const k3d::mesh::indices_t& VertexCoordinates, const k3d::mesh::indices_t& TextureCoordinates, const k3d::mesh::indices_t& NormalCoordinates);\n\tvoid on_texture_coordinates(const k3d::texture3& Texture);\n\tvoid on_use_material(const k3d::string_t& Name);\n\tvoid on_vertex_coordinates(const k3d::point4& Vertex);\n};\n\n} // namespace io\n\n} // namespace obj\n\n} // namespace module\n\n#endif // !MODULES_OBJ_IO_OBJ_PARSER_H\n\n"
  },
  {
    "path": "modules/obj_io/obj_specification.txt",
    "content": "B1. Object Files (.obj)\n\nObject files define the geometry and other properties for objects in\nWavefront's Advanced Visualizer. Object files can also be used to\ntransfer geometric data back and forth between the Advanced Visualizer\nand other applications.\n\nObject files can be in ASCII format (.obj) or binary format (.mod).\nThis appendix describes the ASCII format for object files. These files\nmust have the extension .obj.\n\nIn this release, the .obj file format supports both polygonal objects\nand free-form objects. Polygonal geometry uses points, lines, and faces\nto define objects while free-form geometry uses curves and surfaces.\n\nAbout this section\n\nThe .obj appendix is for those who want to use the .obj format to\ntranslate geometric data from other software applications to Wavefront\nproducts. It also provides information for Advanced Visualizer users\nwho want detailed information on the Wavefront .obj file format.\n\nIf you are a 2.11 user and want to understand the significance of the\n3.0 release and how it affects your existing files, you may be\nespecially interested in the section called \"Superseded statements\" at\nthe end of the appendix. The section, \"Patches and free-form surfaces,\"\ngives examples of how 2.11 patches look in 3.0.\n\nHow this section is organized\n\nMost of this appendix describes the different parts of an .obj file and\nhow those parts are arranged in the file. The three sections at the end\nof the appendix provide background information on the 3.0 release of\nthe .obj format.\n\nThe .obj appendix includes the following sections:\n\no       File structure\n\no       General statement\n\no       Vertex data\n\no       Specifying free-form curves/surfaces\n\no       Free-form curve/surface attributes\n\no       Elements\n\no       Free-form curve/surface body statements\n\no       Connectivity between free-form surfaces\n\no       Grouping\n\no       Display/render attributes\n\no       Comments\n\no       Mathematics for free-form curves/surfaces\n\no       Superseded statements\n\no       Patches and free-form surfaces\n\n---------------\n\n    The curve and surface extensions to the .obj file format were\n    developed in conjunction with mental images GmbH&Co.KG, Berlin,\n    Germany, as part of a joint development project to incorporate\n    free-form surfaces into Wavefront's Advanced Visualizer.\n\nFile structure\n\nThe following types of data may be included in an .obj file. In this\nlist, the keyword (in parentheses) follows the data type.\n\nVertex data\n\no       geometric vertices (v)\n\no       texture vertices (vt)\n\no       vertex normals (vn)\n\no       parameter space vertices (vp)\n\tFree-form curve/surface attributes\n\no       rational or non-rational forms of curve or surface type:\n\tbasis matrix, Bezier, B-spline, Cardinal, Taylor (cstype)\n\no       degree (deg)\n\no       basis matrix (bmat)\n\no       step size (step)\n\nElements\n\no       point (p)\n\no       line (l)\n\no       face (f)\n\no       curve (curv)\n\no       2D curve (curv2)\n\no       surface (surf)\n\nFree-form curve/surface body statements\n\no       parameter values (parm)\n\no       outer trimming loop (trim)\n\no       inner trimming loop (hole)\n\no       special curve (scrv)\n\no       special point (sp)\n\no       end statement (end)\n\nConnectivity between free-form surfaces\n\n\no       connect (con)\n\nGrouping\n\no       group name (g)\n\no       smoothing group (s)\n\no       merging group (mg)\n\no       object name (o)\n\nDisplay/render attributes\n\no       bevel interpolation (bevel)\n\no       color interpolation (c_interp)\n\no       dissolve interpolation (d_interp)\n\no       level of detail (lod)\n\no       material name (usemtl)\n\no       material library (mtllib)\n\no       shadow casting (shadow_obj)\n\no       ray tracing (trace_obj)\n\no       curve approximation technique (ctech)\n\no       surface approximation technique (stech)\n\n\nThe following diagram shows how these parts fit together in a typical\n.obj file.\n\nFigure  B1-1.   Typical .obj file structure\n\nGeneral statement\n\ncall  filename.ext arg1 arg2 . . .\n\n    Reads the contents of the specified .obj or .mod file at this\n    location.  The call statement can be inserted into .obj files using\n    a text editor.\n\n    filename.ext is the name of the .obj or .mod file to be read. You\n    must include the extension with the filename.\n\n    arg1  arg2 . . .  specifies a series of optional integer arguments\n    that are passed to the called file. There is no limit to the number\n    of nested calls that can be made.\n\n    Arguments passed to the called file are substituted in the same way\n    as in UNIX scripts; for example, $1 in the called file is replaced\n    by arg1,  $2 in the called file is replaced by arg2, and so on.\n\n    If the frame number is needed in the called file for variable\n    substitution, \"$1\" must be used as the first argument in the call\n    statement. For example:\n\n\tcall filename.obj $1\n\n    Then the statement in the called file,\n\n\tscmp filename.pv $1\n\n    will work as expected. For more information on the scmp statement,\n    see appendix C, Variable Substitution for more information.\n\n    Another method to do the same thing is:\n\n\tscmp filename.pv $1\n\n\tcall filename.obj\n\n    Using this method, the scmp statement provides the .pv file for all\n    subsequently called .obj or .mod files.\n\ncsh command\n\ncsh -command\n\n    Executes the requested UNIX command. If the UNIX command returns an\n    error, the parser flags an error during parsing.\n\n    If a dash (-) precedes the UNIX command, the error is ignored.\n\n    command is the UNIX command.\n\nVertex data\n\nVertex data provides coordinates for:\n\no        geometric vertices\n\no        texture vertices\n\no        vertex normals\n\nFor free-form objects, the vertex data also provides:\n\no        parameter space vertices\n\nThe vertex data is represented by four vertex lists; one for each type\nof vertex coordinate. A right-hand coordinate system is used to specify\nthe coordinate locations.\n\nThe following sample is a portion of an .obj file that contains the\nfour types of vertex information.\n\n    v      -5.000000       5.000000       0.000000\n    v      -5.000000      -5.000000       0.000000\n    v       5.000000      -5.000000       0.000000\n    v       5.000000       5.000000       0.000000\n    vt     -5.000000       5.000000       0.000000\n    vt     -5.000000      -5.000000       0.000000\n    vt      5.000000      -5.000000       0.000000\n    vt      5.000000       5.000000       0.000000\n    vn      0.000000       0.000000       1.000000\n    vn      0.000000       0.000000       1.000000\n    vn      0.000000       0.000000       1.000000\n    vn      0.000000       0.000000       1.000000\n    vp      0.210000       3.590000\n    vp      0.000000       0.000000\n    vp      1.000000       0.000000\n    vp      0.500000       0.500000\n\n\n\nWhen vertices are loaded into the Advanced Visualizer, they are\nsequentially numbered, starting with 1. These reference numbers are\nused in element statements.\n\nSyntax\n\nThe following syntax statements are listed in order of complexity.\n\nv x y z w\n\n    Polygonal and free-form geometry statement.\n\n    Specifies a geometric vertex and its x y z coordinates. Rational\n    curves and surfaces require a fourth homogeneous coordinate, also\n    called the weight.\n\n    x y z are the x, y, and z coordinates for the vertex. These are\n    floating point numbers that define the position of the vertex in\n    three dimensions.\n\n    w is the weight required for rational curves and surfaces. It is\n    not required for non-rational curves and surfaces. If you do not\n    specify a value for w, the default is 1.0.\n\n    NOTE: A positive weight value is recommended. Using zero or\n    negative values may result in an undefined point in a curve or\n    surface.\n\nvp u v w\n\n    Free-form geometry statement.\n\n    Specifies a point in the parameter space of a curve or surface.\n\n    The usage determines how many coordinates are required. Special\n    points for curves require a 1D control point (u only) in the\n    parameter space of the curve. Special points for surfaces require a\n    2D point (u and v) in the parameter space of the surface. Control\n    points for non-rational trimming curves require u and v\n    coordinates. Control points for rational trimming curves require u,\n    v, and w (weight) coordinates.\n\n    u is the point in the parameter space of a curve or the first\n    coordinate in the parameter space of a surface.\n\n    v is the second coordinate in the parameter space of a surface.\n\n    w is the weight required for rational trimming curves. If you do\n    not specify a value for w, it defaults to 1.0.\n\n    NOTE: For additional information on parameter vertices, see the\n    curv2 and sp statements\n\nvn i j k\n\n    Polygonal and free-form geometry statement.\n\n    Specifies a normal vector with components i, j, and k.\n\n    Vertex normals affect the smooth-shading and rendering of geometry.\n    For polygons, vertex normals are used in place of the actual facet\n    normals.  For surfaces, vertex normals are interpolated over the\n    entire surface and replace the actual analytic surface normal.\n\n    When vertex normals are present, they supersede smoothing groups.\n\n    i j k are the i, j, and k coordinates for the vertex normal. They\n    are floating point numbers.\n\nvt u v w\n\n    Vertex statement for both polygonal and free-form geometry.\n\n    Specifies a texture vertex and its coordinates. A 1D texture\n    requires only u texture coordinates, a 2D texture requires both u\n    and v texture coordinates, and a 3D texture requires all three\n    coordinates.\n\n    u is the value for the horizontal direction of the texture.\n\n    v is an optional argument.\n\n    v is the value for the vertical direction of the texture. The\n    default is 0.\n\n    w is an optional argument.\n\n    w is a value for the depth of the texture. The default is 0.\n\nSpecifying free-form curves/surfaces\n\nThere are three steps involved in specifying a free-form curve or\nsurface element.\n\no       Specify the type of curve or surface (basis matrix, Bezier,\n\tB-spline, Cardinal, or Taylor) using free-form curve/surface\n\tattributes.\n\no       Describe the curve or surface with element statements.\n\no       Supply additional information, using free-form curve/surface\n\tbody statements\n\nThe next three sections of this appendix provide detailed information\non each of these steps.\n\nData requirements for curves and surfaces\n\nAll curves and surfaces require a certain set of data. This consists of\nthe following:\n\nFree-form curve/surface attributes\n\no       All curves and surfaces require type data, which is given with\n\tthe cstype statement.\n\no       All curves and surfaces require degree data, which is given\n\twith the deg statement.\n\no       Basis matrix curves or surfaces require a bmat statement.\n\no       Basis matrix curves or surfaces also require a step size, which\n\tis given with the step statement.\n\nElements\n\no       All curves and surfaces require control points, which are\n\treferenced in the curv, curv2, or surf statements.\n\no       3D curves and surfaces require a parameter range, which is\n\tgiven in the curv and surf statements, respectively.\n\nFree-form curve/surface body statements\n\no       All curves and surfaces require a set of global parameters or a\n\tknot vector, both of which are given with the parm statement.\n\no       All curves and surfaces body statements require an explicit end\n\tstatement.\n\nError checks\n\nThe above set of data starts out empty with no default values when\nreading of an .obj file begins. While the file is being read,\nstatements are encountered, information is accumulated, and some errors\nmay be reported.\n\nWhen the end statement is encountered, the following error checks,\nwhich involve consistency between various statements, are performed:\n\no       All required information is present.\n\no       The number of control points, number of parameter values\n\t(knots), and degree are consistent with the curve or surface\n\ttype. If the type is bmatrix, the step size is also consistent.\n\t(For more information, refer to the parameter vector equations\n\tin the section, \"Mathematics of free-form curves/ surfaces\" at\n\tthe end of appendix B1.)\n\no       If the type is bmatrix and the degree is n, the size of the\n\tbasis matrix is (n + 1) x (n + 1).\n\nNote that any information given by the state-setting statements remains\nin effect from one curve or surface to the next. Information given\nwithin a curve or surface body is only effective for the curve or\nsurface it is given with.\n\n\n\nFree-form curve/surface attributes\n\nFive types of free-form geometry are available in the .obj file\nformat:\n\no       Bezier\n\no       basis matrix\n\no       B-spline\n\no       Cardinal\n\no       Taylor\n\nYou can apply these types only to curves and surfaces. Each of these\nfive types can be rational or non-rational.\n\nIn addition to specifying the type, you must define the degree for the\ncurve or surface. For basis matrix curve and surface elements, you must\nalso specify the basis matrix and step size.\n\nAll free-form curve and surface attribute statements are state-setting.\nThis means that once an attribute statement is set, it applies to all\nelements that follow until it is reset to a different value.\n\nSyntax\n\nThe following syntax statements are listed in order of use.\n\ncstype rat type\n\n    Free-form geometry statement.\n\n    Specifies the type of curve or surface and indicates a rational or\n    non-rational form.\n\n    rat is an optional argument.\n\n    rat specifies a rational form for the curve or surface type. If rat\n    is not included, the curve or surface is non-rational\n\n    type specifies the curve or surface type. Allowed types are:\n\n\tbmatrix\t\tbasis matrix\n\n\tbezier\t\tBezier\n\n\tbspline\t\tB-spline\n\n\tcardinal        Cardinal\n\n\ttaylor\t\tTaylor\n\n    There is no default. A value must be supplied.\n\ndeg degu degv\n\n    Free-form geometry statement.\n\n    Sets the polynomial degree for curves and surfaces.\n\n    degu is the degree in the u direction. It is required for both\n    curves and surfaces.\n\n    degv is the degree in the v direction. It is required only for\n    surfaces. For Bezier, B-spline, Taylor, and basis matrix, there is\n    no default; a value must be supplied. For Cardinal, the degree is\n    always 3. If some other value is given for Cardinal, it will be\n    ignored.\n\nbmat u matrix\n\nbmat v matrix\n\n    Free-form geometry statement.\n\n    Sets the basis matrices used for basis matrix curves and surfaces.\n    The u and v values must be specified in separate bmat statements.\n\n    NOTE: The deg statement must be given before the bmat statements\n    and the size of the matrix must be appropriate for the degree.\n\n    u specifies that the basis matrix is applied in the u direction.\n\n    v specifies that the basis matrix is applied in the v direction.\n\n    matrix lists the contents of the basis matrix with column subscript\n    j varying the fastest. If n is the degree in the given u or v\n    direction, the matrix (i,j) should be of size (n + 1) x (n + 1).\n\n    There is no default. A value must be supplied.\n\n    NOTE: The arrangement of the matrix is different from that commonly\n    found in other references. For more information, see the examples\n    at the end of this section and also the section, \"Mathematics for\n    free-form curves and surfaces.\"\n\nstep stepu stepv\n\n    Free-form geometry statement.\n\n    Sets the step size for curves and surfaces that use a basis\n    matrix.\n\n    stepu is the step size in the u direction. It is required for both\n    curves and surfaces that use a basis matrix.\n\n    stepv is the step size in the v direction. It is required only for\n    surfaces that use a basis matrix. There is no default. A value must\n    be supplied.\n\n    When a curve or surface is being evaluated and a transition from\n    one segment or patch to the next occurs, the set of control points\n    used is incremented by the step size. The appropriate step size\n    depends on the representation type, which is expressed through the\n    basis matrix, and on the degree.\n\n    That is, suppose we are given a curve with k control points:\n\t\t\t{v , ... v }\n\t\t\t  1       k\n\n    If the curve is of degree n, then n + 1 control points are needed\n    for each polynomial segment. If the step size is given as s, then\n    the ith polynomial segment, where i = 0 is the first segment, will\n    use the control points:\n\t\t\t{v    ,...,v      }\n\t\t\t  is+1      is+n+1\n\n    For example, for Bezier curves, s = n .\n\n    For surfaces, the above description applies independently to each\n    parametric direction.\n\n    When you create a file which uses the basis matrix type, be sure to\n    specify a step size appropriate for the current curve or surface\n    representation.\n\nExamples\n\n1.      Cubic Bezier surface made with a basis matrix\n\n    To create a cubic Bezier surface:\n\n\tcstype bmatrix\n\tdeg 3 3\n\tstep 3 3\n\tbmat u  1       -3      3       -1      \\\n\t\t0       3       -6      3       \\\n\t\t0       0       3       -3      \\\n\t\t0       0       0       1\n\tbmat v  1       -3      3       -1      \\\n\t\t0       3       -6      3       \\\n\t\t0       0       3       -3      \\\n\t\t0       0       0       1\n\n2.      Hermite curve made with a basis matrix\n\n    To create a Hermite curve:\n\n\tcstype bmatrix\n\tdeg 3\n\tstep 2\n\tbmat u  1     0     -3      2      0       0       3      -2 \\\n\t\t0     1     -2      1      0       0      -1       1\n\n3.      Bezier in u direction with B-spline in v direction;\n\tmade with a basis matrix\n\n    To create a surface with a cubic Bezier in the u direction and\n    cubic uniform B-spline in the v direction:\n\n\tcstype bmatrix\n\tdeg 3 3\n\tstep 3 1\n\tbmat u  1      -3       3      -1 \\\n\t\t0       3      -6       3 \\\n\t\t0       0       3      -3 \\\n\t\t0       0       0       1\n\tbmat v  0.16666 -0.50000  0.50000 -0.16666 \\\n\t\t0.66666  0.00000 -1.00000  0.50000 \\\n\t\t0.16666  0.50000  0.50000 -0.50000 \\\n\t\t0.00000  0.00000  0.00000  0.16666\n\n\n\nElements\n\nFor polygonal geometry, the element types available in the .obj file\nare:\n\no       points\n\no       lines\n\no       faces\n\nFor free-form geometry, the element types available in the .obj file\nare:\n\no       curve\n\no       2D curve on a surface\n\no       surface\n\nAll elements can be freely intermixed in the file.\n\nReferencing vertex data\n\nFor all elements, reference numbers are used to identify geometric\nvertices, texture vertices, vertex normals, and parameter space\nvertices.\n\nEach of these types of vertices is numbered separately, starting with\n1. This means that the first geometric vertex in the file is 1, the\nsecond is 2, and so on. The first texture vertex in the file is 1, the\nsecond is 2, and so on. The numbering continues sequentially throughout\nthe entire file. Frequently, files have multiple lists of vertex data.\nThis numbering sequence continues even when vertex data is separated by\nother data.\n\nIn addition to counting vertices down from the top of the first list in\nthe file, you can also count vertices back up the list from an\nelement's position in the file. When you count up the list from an\nelement, the reference numbers are negative. A reference number of -1\nindicates the vertex immediately above the element. A reference number\nof -2 indicates two references above and so on.\n\nReferencing groups of vertices\n\nSome elements, such as faces and surfaces, may have a triplet of\nnumbers that reference vertex data.These numbers are the reference\nnumbers for a geometric vertex, a texture vertex, and a vertex normal.\n\nEach triplet of numbers specifies a geometric vertex, texture vertex,\nand vertex normal. The reference numbers must be in order and must\nseparated by slashes (/).\n\no       The first reference number is the geometric vertex.\n\no       The second reference number is the texture vertex. It follows\n\tthe first slash.\n\no       The third reference number is the vertex normal. It follows the\n\tsecond slash.\n\nThere is no space between numbers and the slashes. There may be more\nthan one series of geometric vertex/texture vertex/vertex normal\nnumbers on a line.\n\nThe following is a portion of a sample file for a four-sided face\nelement:\n\n    f 1/1/1 2/2/2 3/3/3 4/4/4\n\nUsing v, vt, and vn to represent geometric vertices, texture vertices,\nand vertex normals, the statement would read:\n\n    f v/vt/vn v/vt/vn v/vt/vn v/vt/vn\n\nIf there are only vertices and vertex normals for a face element (no\ntexture vertices), you would enter two slashes (//). For example, to\nspecify only the vertex and vertex normal reference numbers, you would\nenter:\n\n    f 1//1 2//2 3//3 4//4\n\nWhen you are using a series of triplets, you must be consistent in the\nway you reference the vertex data. For example, it is illegal to give\nvertex normals for some vertices, but not all.\n\nThe following is an example of an illegal statement.\n\n    f 1/1/1 2/2/2 3//3 4//4\n\nSyntax\n\nThe following syntax statements are listed in order of complexity of\ngeometry.\n\np  v1 v2 v3 . . .\n\n    Polygonal geometry statement.\n\n    Specifies a point element and its vertex. You can specify multiple\n    points with this statement. Although points cannot be shaded or\n    rendered, they are used by other Advanced Visualizer programs.\n\n    v is the vertex reference number for a point element. Each point\n    element requires one vertex. Positive values indicate absolute\n    vertex numbers. Negative values indicate relative vertex numbers.\n\nl  v1/vt1   v2/vt2   v3/vt3 . . .\n\n    Polygonal geometry statement.\n\n    Specifies a line and its vertex reference numbers. You can\n    optionally include the texture vertex reference numbers. Although\n    lines cannot be shaded or rendered, they are used by other Advanced\n    Visualizer programs.\n\n    The reference numbers for the vertices and texture vertices must be\n    separated by a slash (/). There is no space between the number and\n    the slash.\n\n    v is a reference number for a vertex on the line. A minimum of two\n    vertex numbers are required. There is no limit on the maximum.\n    Positive values indicate absolute vertex numbers. Negative values\n    indicate relative vertex numbers.\n\n    vt is an optional argument.\n\n    vt is the reference number for a texture vertex in the line\n    element. It must always follow the first slash.\n\nf  v1/vt1/vn1   v2/vt2/vn2   v3/vt3/vn3 . . .\n\n    Polygonal geometry statement.\n\n    Specifies a face element and its vertex reference number. You can\n    optionally include the texture vertex and vertex normal reference\n    numbers.\n\n    The reference numbers for the vertices, texture vertices, and\n    vertex normals must be separated by slashes (/). There is no space\n    between the number and the slash.\n\n    v is the reference number for a vertex in the face element. A\n    minimum of three vertices are required.\n\n    vt is an optional argument.\n\n    vt is the reference number for a texture vertex in the face\n    element. It always follows the first slash.\n\n    vn is an optional argument.\n\n    vn is the reference number for a vertex normal in the face element.\n    It must always follow the second slash.\n\n    Face elements use surface normals to indicate their orientation. If\n    vertices are ordered counterclockwise around the face, both the\n    face and the normal will point toward the viewer. If the vertex\n    ordering is clockwise, both will point away from the viewer. If\n    vertex normals are assigned, they should point in the general\n    direction of the surface normal, otherwise unpredictable results\n    may occur.\n\n    If a face has a texture map assigned to it and no texture vertices\n    are assigned in the f statement, the texture map is ignored when\n    the element is rendered.\n\n    NOTE: Any references to fo (face outline) are no longer valid as of\n    version 2.11. You can use f (face) to get the same results.\n    References to fo in existing .obj files will still be read,\n    however, they will be written out as f when the file is saved.\n\ncurv u0 u1 v1 v2 . . .\n\n    Element statement for free-form geometry.\n\n    Specifies a curve, its parameter range, and its control vertices.\n    Although curves cannot be shaded or rendered, they are used by\n    other Advanced Visualizer programs.\n\n    u0 is the starting parameter value for the curve. This is a\n    floating point number.\n\n    u1 is the ending parameter value for the curve. This is a floating\n    point number.\n\n    v is the vertex reference number for a control point. You can\n    specify multiple control points. A minimum of two control points\n    are required for a curve.\n\n    For a non-rational curve, the control points must be 3D. For a\n    rational curve, the control points are 3D or 4D. The fourth\n    coordinate (weight) defaults to 1.0 if omitted.\n\ncurv2  vp1  vp2   vp3. . .\n\n    Free-form geometry statement.\n\n    Specifies a 2D curve on a surface and its control points. A 2D\n    curve is used as an outer or inner trimming curve, as a special\n    curve, or for connectivity.\n\n    vp is the parameter vertex reference number for the control point.\n    You can specify multiple control points. A minimum of two control\n    points is required for a 2D curve.\n\n    The control points are parameter vertices because the curve must\n    lie in the parameter space of some surface. For a non-rational\n    curve, the control vertices can be 2D. For a rational curve, the\n    control vertices can be 2D or 3D. The third coordinate (weight)\n    defaults to 1.0 if omitted.\n\nsurf  s0  s1  t0  t1  v1/vt1/vn1   v2/vt2/vn2 . . .\n\n    Element statement for free-form geometry.\n\n    Specifies a surface, its parameter range, and its control vertices.\n    The surface is evaluated within the global parameter range from s0\n    to s1 in the u direction and t0 to t1 in the v direction.\n\n    s0 is the starting parameter value for the surface in the u\n    direction.\n\n    s1 is the ending parameter value for the surface in the u\n    direction.\n\n    t0 is the starting parameter value for the surface in the v\n    direction.\n\n    t1 is the ending parameter value for the surface in the v\n    direction.\n\n    v is the reference number for a control vertex in the surface.\n\n    vt is an optional argument.\n\n    vt is the reference number for a texture vertex in the surface.  It\n    must always follow the first slash.\n\n    vn is an optional argument.\n\n    vn is the reference number for a vertex normal in the surface.  It\n    must always follow the second slash.\n\n    For a non-rational surface, the control vertices are 3D.  For a\n    rational surface the control vertices can be 3D or 4D.  The fourth\n    coordinate (weight) defaults to 1.0 if ommitted.\n\n    NOTE: For more information on the ordering of control points for\n    survaces, refer to the section on surfaces and control points in\n    \"mathematics of free-form curves/surfaces\" at the end of this\n    appendix.\n\n\n\n\nExamples\n\nThese are examples for polygonal geometry.\n\nFor examples using free-form geometry, see the examples at the end of\nthe next section, \"Free-form curve/surface body statements.\"\n\n1.\tSquare\n\nThis example shows a square that measures two units on each side and\nfaces in the positive direction (toward the camera).  Note that the\nordering of the vertices is counterclockwise. This ordering determines\nthat the square is facing forward.\n\n    v 0.000000 2.000000 0.000000\n    v 0.000000 0.000000 0.000000\n    v 2.000000 0.000000 0.000000\n    v 2.000000 2.000000 0.000000\n    f 1 2 3 4\n\n2.      Cube\n\nThis is a cube that measures two units on each side. Each vertex is\nshared by three different faces.\n\n    v 0.000000 2.000000 2.000000\n    v 0.000000 0.000000 2.000000\n    v 2.000000 0.000000 2.000000\n    v 2.000000 2.000000 2.000000\n    v 0.000000 2.000000 0.000000\n    v 0.000000 0.000000 0.000000\n    v 2.000000 0.000000 0.000000\n    v 2.000000 2.000000 0.000000\n    f 1 2 3 4\n    f 8 7 6 5\n    f 4 3 7 8\n    f 5 1 4 8\n    f 5 6 2 1\n    f 2 6 7 3\n\n3.      Cube with negative reference numbers\n\nThis is a cube with negative vertex reference numbers. Each element\nreferences the vertices stored immediately above it in the file. Note\nthat vertices are not shared.\n\nv 0.000000 2.000000 2.000000\nv 0.000000 0.000000 2.000000\nv 2.000000 0.000000 2.000000\nv 2.000000 2.000000 2.000000\nf -4 -3 -2 -1\n\nv 2.000000 2.000000 0.000000\nv 2.000000 0.000000 0.000000\nv 0.000000 0.000000 0.000000\nv 0.000000 2.000000 0.000000\nf -4 -3 -2 -1\n\nv 2.000000 2.000000 2.000000\nv 2.000000 0.000000 2.000000\nv 2.000000 0.000000 0.000000\nv 2.000000 2.000000 0.000000\nf -4 -3 -2 -1\n\nv 0.000000 2.000000 0.000000\nv 0.000000 2.000000 2.000000\nv 2.000000 2.000000 2.000000\nv 2.000000 2.000000 0.000000\nf -4 -3 -2 -1\n\nv 0.000000 2.000000 0.000000\nv 0.000000 0.000000 0.000000\nv 0.000000 0.000000 2.000000\nv 0.000000 2.000000 2.000000\nf -4 -3 -2 -1\n\nv 0.000000 0.000000 2.000000\nv 0.000000 0.000000 0.000000\nv 2.000000 0.000000 0.000000\nv 2.000000 0.000000 2.000000\nf -4 -3 -2 -1\n\n\n\nFree-form curve/surface body statements\n\nYou can specify additional information for free-form curve and surface\nelements using a series of statements called body statements. The\nseries is concluded by an end statement.\n\nBody statements are valid only when they appear between the free-form\nelement statement (curv, curv2, surf) and the end statement. If they\nare anywhere else in the .obj file, they do not have any effect.\n\nYou can use body statements to specify the following values:\n\no       parameter\n\no       knot vector\n\no       trimming loop\n\no       hole\n\no       special curve\n\no       special point\n\nYou cannot use any other statements between the free-form curve or\nsurface statement and the end statement. Using any other of type of\nstatement may cause unpredictable results.\n\nThis portion of a sample file shows the knot vector values for a\nrational B-spline surface with a trimming loop. Notice the end\nstatement to conclude the body statements.\n\n    cstype rat bspline\n    deg 2 2\n    surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1\n    parm u -1.00 -1.00 -1.00 2.50 2.50 2.50\n    parm v -2.00 -2.00 -2.00 -2.00 -2.00 -2.00\n    trim 0.0 2.0 1\n    end\n\nParameter values and knot vectors\n\nAll curve and surface elements require a set of parameter values.\n\nFor polynomial curves and surfaces, this specifies global parameter\nvalues. For B-spline curves and surfaces, this specifies the knot\nvectors.\n\nFor surfaces, the parameter values must be specified for both the u and\nv directions. For curves, the parameter values must be specified for\nonly the u direction.\n\nIf multiple parameter value statements for the same parametric\ndirection are used inside a single curve or surface body, the last\nstatement is used.\n\nTrimming loops and holes\n\nThe trimming loop statement builds a single outer trimming loop as a\nsequence of curves which lie on a given surface.\n\nThe hole statement builds a single inner trimming loop as a sequence of\ncurves which lie on a given surface. The inner loop creates a hole.\n\nThe curves are referenced by number in the same way vertices are\nreferenced by face elements.\n\nThe individual curves must lie end-to-end to form a closed loop which\ndoes not intersect itself and which lies within the parameter range\nspecified for the surface. The loop as a whole may be oriented in\neither direction (clockwise or counterclockwise).\n\nTo cut one or more holes in a region, use a trim statement followed by\none or more hole statements. To introduce another trimmed region in the\nsame surface, use another trim statement followed by one or more hole\nstatements. The ordering that associates holes and the regions they cut\nis important and must be maintained.\n\nIf the first trim statement in the sequence is omitted, the enclosing\nouter trimming loop is taken to be the parameter range of the surface.\nIf no trim or hole statements are specified, then the surface is\ntrimmed at its parameter range.\n\nThis portion of a sample file shows a non-rational Bezier surface with\ntwo regions, each with a single hole:\n\n    cstype bezier\n    deg 1 1\n    surf 0.0 2.0 0.0 2.0 1 2 3 4\n    parm u 0.00 2.00\n    parm v 0.00 2.00\n    trim 0.0 4.0 1\n    hole 0.0 4.0 2\n    trim 0.0 4.0 3\n    hole 0.0 4.0 4\n    end\n\nSpecial curve\n\nA special curve statement builds a single special curve as a sequence\nof curves which lie on a given surface.\n\nThe curves are referenced by number in the same way vertices are\nreferenced by face elements.\n\nA special curve is guaranteed to be included in any triangulation of\nthe surface. This means that the line formed by approximating the\nspecial curve with a sequence of straight line segments will actually\nappear as a sequence of triangle edges in the final triangulation.\n\nSpecial point\n\nA special point statement specifies that special geometric points are\nto be associated with a curve or surface. For space curves and trimming\ncurves, the parameter vertices must be 1D. For surfaces, the parameter\nvertices must be 2D.\n\nThese special points will be included in any linear approximation of\nthe curve or surface.\n\nFor space curves, this means that the point corresponding to the given\ncurve parameter is included as one of the vertices in an approximation\nconsisting of a sequence of line segments.\n\nFor surfaces, this means that the point corresponding to the given\nsurface parameters is included as a triangle vertex in the\ntriangulation.\n\nFor trimming curves, the treatment is slightly different: a special\npoint on a trimming curve is essentially the same as a special point on\nthe surface it trims.\n\nThe following portion of a sample files shows special points for a\nrational Bezier 2D curve on a surface.\n\n    vp -0.675  1.850  3.000\n    vp  0.915  1.930\n    vp  2.485  0.470  2.000\n    vp  2.485 -1.030\n    vp  1.605 -1.890 10.700\n    vp -0.745 -0.654  0.500\n    cstype rat bezier\n    curv2 -6 -5 -4 -3 -2 -1 -6\n    parm u 0.00 1.00 2.00\n    sp 2 3\n    end\n\nSyntax\n\nThe following syntax statement are listed in order of normal use.\n\nparm u p1 p2 p3. . .\n\nparm v p1 p2 p3 . . .\n\n    Body statement for free-form geometry.\n\n    Specifies global parameter values. For B-spline curves and\n    surfaces, this specifies the knot vectors.\n\n    u is the u direction for the parameter values.\n\n    v is the v direction for the parameter values.\n\n    To set u and v values, use separate command lines.\n\n    p is the global parameter or knot value. You can specify multiple\n    values. A minimum of two parameter values are required. Parameter\n    values must increase monotonically. The type of surface and the\n    degree dictate the number of values required.\n\ntrim  u0  u1  curv2d  u0  u1  curv2d . . .\n\n    Body statement for free-form geometry.\n\n    Specifies a sequence of curves to build a single outer trimming\n    loop.\n\n    u0 is the starting parameter value for the trimming curve curv2d.\n\n    u1 is the ending parameter value for the trimming curve curv2d.\n\n    curv2d is the index of the trimming curve lying in the parameter\n    space of the surface. This curve must have been previously defined\n    with the curv2 statement.\n\nhole  u0  u1  curv2d  u0  u1  curv2d . . .\n\n    Body statement for free-form geometry.\n\n    Specifies a sequence of curves to build a single inner trimming\n    loop (hole).\n\n    u0 is the starting parameter value for the trimming curve curv2d.\n\n    u1 is the ending parameter value for the trimming curve curv2d.\n\n    curv2d is the index of the trimming curve lying in the parameter\n    space of the surface. This curve must have been previously defined\n    with the curv2 statement.\n\nscrv u0 u1 curv2d u0 u1 curv2d . . .\n\n    Body statement for free-form geometry.\n\n    Specifies a sequence of curves which lie on the given surface to\n    build a single special curve.\n\n    u0 is the starting parameter value for the special curve curv2d.\n\n    u1 is the ending parameter value for the special curve curv2d.\n\n    curv2d is the index of the special curve lying in the parameter\n    space of the surface. This curve must have been previously defined\n    with the curv2 statement.\n\nsp vp1  vp. . .\n\n    Body statement for free-form geometry.\n\n    Specifies special geometric points to be associated with a curve or\n    surface. For space curves and trimming curves, the parameter\n    vertices must be 1D. For surfaces, the parameter vertices must be\n    2D.\n\n    vp is the reference number for the parameter vertex of a special\n    point to be associated with the parameter space point of the curve\n    or surface.\n\nend\n\n    Body statement for free-form geometry.\n\n    Specifies the end of a curve or surface body begun by a curv,\n    curv2, or surf statement.\n\nExamples\n\n1.      Taylor curve\n\n    For creating a single-segment Taylor polynomial curve of the form:\n\n                                   2         3         4\n\tx =  3.00 +  2.30t +  7.98t  +  8.30t  +  6.34t \n\n                                   2         3         4\n\ty =  1.00 - 10.10t +  5.40t  -  4.70t  +  2.03t \n\n                                   2         3         4\n\tz = -2.50 +  0.50t -  7.00t  + 18.10t  +  0.08t \n\n\nand evaluated between the global parameters 0.5 and 1.6:\n\n\tv       3.000    1.000   -2.500\n\tv       2.300  -10.100    0.500\n\tv       7.980    5.400   -7.000\n\tv       8.300   -4.700   18.100\n\tv       6.340    2.030    0.080\n\tcstype taylor\n\tdeg 4\n\tcurv 0.500 1.600 1 2 3 4 5\n\tparm u 0.000 2.000\n\tend\n\n2.      Bezier curve\n\nThis example shows a non-rational Bezier curve with 13 control points.\n\n    v -2.300000 1.950000 0.000000\n    v -2.200000 0.790000 0.000000\n    v -2.340000 -1.510000 0.000000\n    v -1.530000 -1.490000 0.000000\n    v -0.720000 -1.470000 0.000000\n    v -0.780000 0.230000 0.000000\n    v 0.070000 0.250000 0.000000\n    v 0.920000 0.270000 0.000000\n    v 0.800000 -1.610000 0.000000\n    v 1.620000 -1.590000 0.000000\n    v 2.440000 -1.570000 0.000000\n    v 2.690000 0.670000 0.000000\n    v 2.900000 1.980000 0.000000\n    # 13 vertices\n\n    cstype bezier\n    ctech cparm 1.000000\n    deg 3\n    curv 0.000000 4.000000 1 2 3 4 5 6 7 8 9 10 \\\n    11 12 13\n    parm u 0.000000 1.000000 2.000000 3.000000  \\\n    4.000000\n    end\n    # 1 element\n\n\n\n3.      B-spline surface\n\nThis is an example of a cubic B-spline surface.\n\n    g bspatch\n    v -5.000000 -5.000000 -7.808327\n    v -5.000000 -1.666667 -7.808327\n    v -5.000000 1.666667 -7.808327\n    v -5.000000 5.000000 -7.808327\n    v -1.666667 -5.000000 -7.808327\n    v -1.666667 -1.666667 11.977780\n    v -1.666667 1.666667 11.977780\n    v -1.666667 5.000000 -7.808327\n    v 1.666667 -5.000000 -7.808327\n    v 1.666667 -1.666667 11.977780\n    v 1.666667 1.666667 11.977780\n    v 1.666667 5.000000 -7.808327\n    v 5.000000 -5.000000 -7.808327\n    v 5.000000 -1.666667 -7.808327\n    v 5.000000 1.666667 -7.808327\n    v 5.000000 5.000000 -7.808327\n    # 16 vertices\n\n    cstype bspline\n    stech curv 0.5 10.000000\n    deg 3 3\n    8surf 0.000000 1.000000 0.000000 1.000000 13 14 \\ 15 16 9 10 11 12 5 6\n    7 8 1 2 3 4\n    parm u -3.000000 -2.000000 -1.000000 0.000000  \\\n    1.000000 2.000000 3.000000 4.000000\n    parm v -3.000000 -2.000000 -1.000000 0.000000  \\\n    1.000000 2.000000 3.000000 4.000000\n    end\n    # 1 element\n\n\n4.      Cardinal surface\n\nThis example shows a Cardinal surface.\n\n    v -5.000000 -5.000000 0.000000\n    v -5.000000 -1.666667 0.000000\n    v -5.000000 1.666667 0.000000\n    v -5.000000 5.000000 0.000000\n    v -1.666667 -5.000000 0.000000\n    v -1.666667 -1.666667 0.000000\n    v -1.666667 1.666667 0.000000\n    v -1.666667 5.000000 0.000000\n    v 1.666667 -5.000000 0.000000\n    v 1.666667 -1.666667 0.000000\n    v 1.666667 1.666667 0.000000\n    v 1.666667 5.000000 0.000000\n    v 5.000000 -5.000000 0.000000\n    v 5.000000 -1.666667 0.000000\n    v 5.000000 1.666667 0.000000\n    v 5.000000 5.000000 0.000000\n    # 16 vertices\n\n    cstype cardinal\n    stech cparma 1.000000 1.000000\n    deg 3 3\n    surf 0.000000 1.000000 0.000000 1.000000 13 14 \\\n    15 16 9 10 11 12 5 6 7 8 1 2 3 4\n    parm u 0.000000 1.000000\n    parm v 0.000000 1.000000\n    end\n    # 1 element\n\n\n5.      Rational B-spline surface\n\nThis example creates a second-degree, rational B-spline surface using\nopen, uniform knot vectors. A texture map is applied to the surface.\n\n    v -1.3 -1.0  0.0\n    v  0.1 -1.0  0.4  7.6\n    v  1.4 -1.0  0.0  2.3\n    v -1.4  0.0  0.2\n    v  0.1  0.0  0.9  0.5\n    v  1.3  0.0  0.4  1.5\n    v -1.4  1.0  0.0  2.3\n    v  0.1  1.0  0.3  6.1\n    v  1.1  1.0  0.0  3.3\n    vt 0.0  0.0\n    vt 0.5  0.0\n    vt 1.0  0.0\n    vt 0.0  0.5\n    vt 0.5  0.5\n    vt 1.0  0.5\n    vt 0.0  1.0\n    vt 0.5  1.0\n    vt 1.0  1.0\n    cstype rat bspline\n    deg 2 2\n    surf 0.0 1.0 0.0 1.0 1/1 2/2 3/3 4/4 5/5 6/6 \\\n    7/7 8/8 9/9\n    parm u 0.0 0.0 0.0 1.0 1.0 1.0\n    parm v 0.0 0.0 0.0 1.0 1.0 1.0\n    end\n\n\n6.      Trimmed NURB surface\n\nThis is a complete example of a file containing a trimmed NURB surface\nwith negative reference numbers for vertices.\n\n    # trimming curve\n    vp -0.675  1.850  3.000\n    vp  0.915  1.930\n    vp  2.485  0.470  2.000\n    vp  2.485 -1.030\n    vp  1.605 -1.890 10.700\n    vp -0.745 -0.654  0.500\n    cstype rat bezier\n    deg 3\n    curv2 -6 -5 -4 -3 -2 -1 -6\n    parm u 0.00 1.00 2.00\n    end\n    # surface\n    v -1.350 -1.030 0.000\n    v  0.130 -1.030 0.432 7.600\n    v  1.480 -1.030 0.000 2.300\n    v -1.460  0.060 0.201\n    v  0.120  0.060 0.915 0.500\n    v  1.380  0.060 0.454 1.500\n    v -1.480  1.030 0.000 2.300\n    v  0.120  1.030 0.394 6.100\n    v  1.170  1.030 0.000 3.300\n    cstype rat bspline\n    deg 2 2\n    surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1\n    parm u -1.00 -1.00 -1.00 2.50 2.50 2.50\n    parm v -2.00 -2.00 -2.00 -2.00 -2.00 -2.00\n    trim 0.0 2.0 1\n    end\n\n\n7.      Two trimming regions with a hole\n\nThis example shows a Bezier surface with two trimming regions, each\nwith a hole in them.\n\n    # outer loop of first region\n    deg 1\n    cstype bezier\n    vp 0.100 0.100\n    vp 0.900 0.100\n    vp 0.900 0.900\n    vp 0.100 0.900\n    curv2 1 2 3 4 1\n    parm u 0.00 1.00 2.00 3.00 4.00\n    end\n    # hole in first region\n    vp 0.300 0.300\n    vp 0.700 0.300\n    vp 0.700 0.700\n    vp 0.300 0.700\n    curv2 5 6 7 8 5\n    parm u 0.00 1.00 2.00 3.00 4.00\n    end\n    # outer loop of second region\n    vp 1.100 1.100\n    vp 1.900 1.100\n    vp 1.900 1.900\n    vp 1.100 1.900\n    curv2 9 10 11 12 9\n    parm u 0.00 1.00 2.00 3.00 4.00\n    end\n    # hole in second region\n    vp 1.300 1.300\n    vp 1.700 1.300\n    vp 1.700 1.700\n    vp 1.300 1.700\n    curv2 13 14 15 16 13\n    parm u 0.00 1.00 2.00 3.00 4.00\n    end\n    # surface\n    v 0.000 0.000 0.000\n    v 1.000 0.000 0.000\n    v 0.000 1.000 0.000\n    v 1.000 1.000 0.000\n    deg 1 1\n    cstype bezier\n    surf 0.0 2.0 0.0 2.0 1 2 3 4\n    parm u 0.00 2.00\n    parm v 0.00 2.00\n    trim 0.0 4.0 1\n    hole 0.0 4.0 2\n    trim 0.0 4.0 3\n    hole 0.0 4.0 4\n    end\n\n\n8.      Trimming with a special curve\nThis example is similar to the trimmed NURB surface example (6), except\nthere is a special curve on the surface. This example uses negative\nvertex numbers.\n\n    # trimming curve\n    vp -0.675  1.850  3.000\n    vp  0.915  1.930\n    vp  2.485  0.470  2.000\n    vp  2.485 -1.030\n    vp  1.605 -1.890 10.700\n    vp -0.745 -0.654  0.500\n    cstype rat bezier\n    deg 3\n    curv2 -6 -5 -4 -3 -2 -1 -6\n    parm u 0.00 1.00 2.00\n    end\n    # special curve\n    vp -0.185  0.322\n    vp  0.214  0.818\n    vp  1.652  0.207\n    vp  1.652 -0.455\n    curv2 -4 -3 -2 -1\n    parm u 2.00 10.00\n    end\n    # surface\n    v -1.350 -1.030 0.000\n    v  0.130 -1.030 0.432 7.600\n    v  1.480 -1.030 0.000 2.300\n    v -1.460  0.060 0.201\n    v  0.120  0.060 0.915 0.500\n    v  1.380  0.060 0.454 1.500\n    v -1.480  1.030 0.000 2.300\n    v  0.120  1.030 0.394 6.100\n    v  1.170  1.030 0.000 3.300\n    cstype rat bspline\n    deg 2 2\n    surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1\n    parm u -1.00 -1.00 -1.00 2.50 2.50 2.50\n    parm v -2.00 -2.00 -2.00 2.00 2.00 2.00\n    trim 0.0 2.0 1\n    scrv 4.2 9.7 2\n    end\n\n\n9.      Trimming with special points\n\nThis example extends the trimmed NURB surface example (6) to include\nspecial points on both the trimming curve and surface. A space curve\nwith a special point is also included. This example uses negative\nvertex numbers.\n\n    # special point and space curve data\n    vp 0.500\n    vp 0.700\n    vp 1.100\n    vp 0.200 0.950\n    v  0.300 1.500 0.100\n    v  0.000  0.000  0.000\n    v  1.000  1.000  0.000\n    v  2.000  1.000  0.000\n    v  3.000  0.000  0.000\n    cstype bezier\n    deg 3\n    curv 0.2 0.9 -4 -3 -2 -1\n    sp 1\n    parm u 0.00 1.00\n    end\n    # trimming curve\n    vp -0.675  1.850  3.000\n    vp  0.915  1.930\n    vp  2.485  0.470  2.000\n    vp  2.485 -1.030\n    vp  1.605 -1.890 10.700\n    vp -0.745 -0.654  0.500\n    cstype rat bezier\n    curv2 -6 -5 -4 -3 -2 -1 -6\n    parm u 0.00 1.00 2.00\n    sp 2 3\n    end\n    # surface\n    v -1.350 -1.030 0.000\n    v  0.130 -1.030 0.432 7.600\n    v  1.480 -1.030 0.000 2.300\n    v -1.460  0.060 0.201\n    v  0.120  0.060 0.915 0.500\n    v  1.380  0.060 0.454 1.500\n    v -1.480  1.030 0.000 2.300\n    v  0.120  1.030 0.394 6.100\n    v  1.170  1.030 0.000 3.300\n    cstype rat bspline\n    deg 2 2\n    surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1\n    parm u -1.00 -1.00 -1.00 2.50 2.50 2.50\n    parm v -2.00 -2.00 -2.00 2.00 2.00 2.00\n    trim 0.0 2.0 1\n    sp 4\n    end\n\nConnectivity between free-form surfaces\n\nConnectivity connects two surfaces along their trimming curves.\n\nThe con statement specifies the first surface with its trimming curve\nand the second surface with its trimming curve. This information is\nuseful for edge merging. Without this surface and curve data,\nconnectivity must be determined numerically at greater expense and with\nreduced accuracy using the mg statement.\n\nConnectivity between surfaces in different merging groups is ignored.\nAlso, although connectivity which crosses points of C1discontinuity in\ntrimming curves is legal, it is not recommended. Instead, use two\nconnectivity statements which meet at the point of discontinuity.\n\nThe two curves and their starting and ending parameters should all map\nto the same curve and starting and ending points in object space.\n\nSyntax\n\ncon  surf_1  q0_1  q1_1   curv2d_1   surf_2  q0_2  q1_2  curv2d_2\n\n    Free-form geometry statement.\n\n    Specifies connectivity between two surfaces.\n\n    surf_1 is the index of the first surface.\n\n    q0_1 is the starting parameter for the curve referenced by\n    curv2d_1.\n\n    q1_1 is the ending parameter for the curve referenced by curv2d_1.\n\n    curv2d_1 is the index of a curve on the first surface. This curve\n    must have been previously defined with the curv2 statement.\n\n    surf_2 is the index of the second surface.\n\n    q0_2 is the starting parameter for the curve referenced by\n    curv2d_2.\n\n    q1_2 is the ending parameter for the curve referenced by curv2d_2.\n\n    curv2d_2 is the index of a curve on the second surface. This curve\n    must have been previously defined with the curv2 statement.\n\nExample\n\n1.      Connectivity between two surfaces\n\nThis example shows the connectivity between two surfaces with trimming\ncurves.\n\n    cstype bezier\n    deg 1 1\n\n    v 0 0 0\n    v 1 0 0\n    v 0 1 0\n    v 1 1 0\n\n    vp 0 0\n    vp 1 0\n    vp 1 1\n    vp 0 1\n\n    curv2 1 2 3 4 1\n    parm u 0.0 1.0 2.0 3.0 4.0\n    end\n\n    surf 0.0 1.0 0.0 1.0 1 2 3 4\n    parm u 0.0 1.0\n    parm v 0.0 1.0\n    trim 0.0 4.0 1\n    end\n\n    v 1 0 0\n    v 2 0 0\n    v 1 1 0\n    v 2 1 0\n\n    surf 0.0 1.0 0.0 1.0 5 6 7 8\n    parm u 0.0 1.0\n    parm v 0.0 1.0\n    trim 0.0 4.0 1\n    end\n\n    con 1 2.0 2.0 1 2 4.0 3.0 1\n\n\nGrouping\n\nThere are four statements in the .obj file to help you manipulate groups\nof elements:\n\no\tGropu name statements are used to organize collections of\n\telements and simplify data manipulation for operations in\n\tModel.\n\no\tSmoothing group statements let you identify elements over which\n\tnormals are to be interpolated to give those elements a smooth,\n\tnon-faceted appearance.  This is a quick way to specify vertex\n\tnormals.\n\no\tMerging group statements are used to ideneify free-form elements\n\tthat should be inspected for adjacency detection.  You can also\n\tuse merging groups to exclude surfaces which are close enough to\n\tbe considered adjacent but should not be merged.\n\no\tObject name statements let you assign a name to an entire object\n\tin a single file.\n\nAll grouping statements are state-setting.  This means that once a\ngroup statement is set, it alpplies to all elements that follow\nuntil the next group statement.\n\nThis portion of a sample file shows a single element which belongs to\nthree groups.  The smoothing group is turned off.\n\n    g square thing all\n    s off\n    f 1 2 3 4\n\nThis example shows two surfaces in merging group 1 with a merge\nresolution of 0.5.\n\n    mg 1 .5\n    surf 0.0 1.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\n    surf 0.0 1.0 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32\n\nSyntax\n\ng group_name1 group_name2 . . .\n\n    Polygonal and free-form geometry statement.\n\n    Specifies the group name for the elements that follow it. You can\n    have multiple group names. If there are multiple groups on one\n    line, the data that follows belong to all groups. Group information\n    is optional.\n\n    group_name is the name for the group. Letters, numbers, and\n    combinations of letters and numbers are accepted for group names.\n    The default group name is default.\n\ns group_number\n\n    Polygonal and free-form geometry statement.\n\n    Sets the smoothing group for the elements that follow it. If you do\n    not want to use a smoothing group, specify off or a value of 0.\n\n    To display with smooth shading in Model and PreView, you must\n    create vertex normals after you have assigned the smoothing groups.\n    You can create vertex normals with the vn statement or with the\n    Model program.\n\n    To smooth polygonal geometry for rendering with Image, it is\n    sufficient to put elements in some smoothing group. However, vertex\n    normals override smoothing information for Image.\n\n    group_number is the smoothing group number. To turn off smoothing\n    groups, use a value of 0 or off. Polygonal elements use group\n    numbers to put elements in different smoothing groups. For\n    free-form surfaces, smoothing groups are either turned on or off;\n    there is no difference between values greater than 0.\n\nmg group_number res\n\n    Free-form geometry statement.\n\n    Sets the merging group and merge resolution for the free-form\n    surfaces that follow it. If you do not want to use a merging group,\n    specify off or a value of 0.\n\n    Adjacency detection is performed only within groups, never between\n    groups. Connectivity between surfaces in different merging groups\n    is not allowed. Surfaces in the same merging group are merged\n    together along edges that are within the distance res apart.\n\n    NOTE: Adjacency detection is an expensive numerical comparison\n    process.  It is best to restrict this process to as small a domain\n    as possible by using small merging groups.\n\n    group_number is the merging group number. To turn off adjacency\n    detection, use a value of 0 or off.\n\n    res is the maximum distance between two surfaces that will be\n    merged together. The resolution must be a value greater than 0.\n    This is a required argument only when using merging groups.\n\no object_name\n\n    Polygonal and free-form geometry statement.\n\n    Optional statement; it is not processed by any Wavefront programs.\n    It specifies a user-defined object name for the elements defined\n    after this statement.\n\n    object_name is the user-defined object name. There is no default.\n\nExamples\n\n1.      Cube with group names\n\nThe following example is a cube with each of its faces placed in a\nseparate group. In addition, all elements belong to the group cube.\n\n    v 0.000000 2.000000 2.000000\n    v 0.000000 0.000000 2.000000\n    v 2.000000 0.000000 2.000000\n    v 2.000000 2.000000 2.000000\n    v 0.000000 2.000000 0.000000\n    v 0.000000 0.000000 0.000000\n    v 2.000000 0.000000 0.000000\n    v 2.000000 2.000000 0.000000\n    # 8 vertices\n\n    g front cube\n    f 1 2 3 4\n    g back cube\n    f 8 7 6 5\n    g right cube\n    f 4 3 7 8\n    g top cube\n    f 5 1 4 8\n    g left cube\n    f 5 6 2 1\n    g bottom cube\n    f 2 6 7 3\n    # 6 elements\n\n\n2.      Two adjoining squares with a smoothing group\n\nThis example shows two adjoining squares that share a common edge. The\nsquares are placed in a smoothing group to ensure that their common\nedge will be smoothed when rendered with Image.\n\n    v 0.000000 2.000000 0.000000\n    v 0.000000 0.000000 0.000000\n    v 2.000000 0.000000 0.000000\n    v 2.000000 2.000000 0.000000\n    v 4.000000 0.000000 -1.255298\n    v 4.000000 2.000000 -1.255298\n    # 6 vertices\n\n    g all\n    s 1\n    f 1 2 3 4\n    f 4 3 5 6\n    # 2 elements\n\n\n3.      Two adjoining squares with vertex normals\n\nThis example also shows two squares that share a common edge. Vertex\nnormals have been added to the corners of each square to ensure that\ntheir common edge will be smoothed during display in Model and PreView\nand when rendered with Image.\n\n    v 0.000000 2.000000 0.000000\n    v 0.000000 0.000000 0.000000\n    v 2.000000 0.000000 0.000000\n    v 2.000000 2.000000 0.000000\n    v 4.000000 0.000000 -1.255298\n    v 4.000000 2.000000 -1.255298\n    vn 0.000000 0.000000 1.000000\n    vn 0.000000 0.000000 1.000000\n    vn 0.276597 0.000000 0.960986\n    vn 0.276597 0.000000 0.960986\n    vn 0.531611 0.000000 0.846988\n    vn 0.531611 0.000000 0.846988\n    # 6 vertices\n\n    # 6 normals\n\n    g all\n    s 1\n    f 1//1 2//2 3//3 4//4\n    f 4//4 3//3 5//5 6//6\n    # 2 elements\n\n\n4.      Merging group\n\nThis example shows two Bezier surfaces that meet at a common edge. They\nhave both been placed in the same merging group to ensure continuity at\nthe edge where they meet. This prevents \"cracks\" from appearing along\nthe seam between the two surfaces during rendering. Merging groups will\nbe ignored during flat-shading, smooth-shading, and material shading of\nthe surface.\n\n    v -4.949854 -5.000000 0.000000\n    v -4.949854 -1.666667 0.000000\n    v -4.949854 1.666667 0.000000\n    v -4.949854 5.000000 0.000000\n    v -1.616521 -5.000000 0.000000\n    v -1.616521 -1.666667 0.000000\n    v -1.616521 1.666667 0.000000\n    v -1.616521 5.000000 0.000000\n    v 1.716813 -5.000000 0.000000\n    v 1.716813 -1.666667 0.000000\n    v 1.716813 1.666667 0.000000\n    v 1.716813 5.000000 0.000000\n    v 5.050146 -5.000000 0.000000\n    v 5.050146 -1.666667 0.000000\n    v 5.050146 1.666667 0.000000\n    v 5.050146 5.000000 0.000000\n    v -15.015566 -4.974991 0.000000\n    v -15.015566 -1.641658 0.000000\n    v -15.015566 1.691675 0.000000\n    v -15.015566 5.025009 0.000000\n    v -11.682233 -4.974991 0.000000\n    v -11.682233 -1.641658 0.000000\n    v -11.682233 1.691675 0.000000\n    v -11.682233 5.025009 0.000000\n    v -8.348900 -4.974991 0.000000\n    v -8.348900 -1.641658 0.000000\n    v -8.348900 1.691675 0.000000\n    v -8.348900 5.025009 0.000000\n    v -5.015566 -4.974991 0.000000\n    v -5.015566 -1.641658 0.000000\n    v -5.015566 1.691675 0.000000\n    v -5.015566 5.025009 0.000000\n\n    mg 1 0.500000\n\n    cstype bezier\n    deg 3 3\n    surf 0.000000 1.000000 0.000000 1.000000 13 14 \\\n    15 16 9 10 11 12 5 6 7 8 1 2 3 4\n    parm u 0.000000 1.000000\n    parm v 0.000000 1.000000\n    end\n    surf 0.000000 1.000000 0.000000 1.000000 29 30 31 32 25 26 27 28 21 22 \\\n    23 24 17 18 19 20\n    parm u 0.000000 1.000000\n    parm v 0.000000 1.000000\n    end\n\n\nDisplay/render attributes\n\nDisplay and render attributes describe how an object looks when\ndisplayed in Model and PreView or when rendered with Image.\n\nSome attributes apply to both free-form and polygonal geometry, such as\nmaterial name and library, ray tracing, and shadow casting.\nInterpolation attributes apply only to polygonal geometry. Curve and\nsurface resolutions are used for only free-form geometry.\n\nThe following chart shows the display and render statements available\nfor polygonal and free-form geometry.\n\nTable B1-1.     Display and render attributes\n\npolygonal only\t\tpolygonal or free-form\tfree-form only\n--------------\t\t----------------------\t--------------\nbevel\t\t\tlod\t\t\tctech\nc_interp\t\tusemtl\t\t\tstech\nd_interp\t\tmtllib\n\t\t\tshadow_obj\n\t\t\ttrace_obj\n\nAll display and render attribute statements are state-setting. This\nmeans that once an attribute statement is set, it applies to all\nelements that follow until it is reset to a different value.\n\nThe following sample shows rendering and display statements for a face\nelement.:\n\n    s 1\n    usemtl blue\n    usemap marble\n    f 1 2 3 4\n\nSyntax\n\nThe following syntax statements are listed by the type of geometry.\nFirst are statements for polygonal geometry. Second are statements for\nboth free-form and polygonal geometry. Third are statements for\nfree-form geometry only.\n\nbevel on/off\n\n    Polygonal geometry statement.\n\n    Sets bevel interpolation on or off. It works only with beveled\n    objects, that is, objects with sides separated by beveled faces.\n\n    Bevel interpolation uses normal vector interpolation to give an\n    illusion of roundness to a flat bevel. It does not affect the\n    smoothing of non-bevelled faces.\n\n    Bevel interpolation does not alter the geometry of the original\n    object.\n\n    on turns on bevel interpolation.\n\n    off turns off bevel interpolation. The default is off.\n\n    NOTE: Image cannot render bevel-interpolated elements that have\n    vertex normals.\n\nc_interp on/off\n\n    Polygonal geometry statement.\n\n    Sets color interpolation on or off.\n\n    Color interpolation creates a blend across the surface of a polygon\n    between the materials assigned to its vertices. This creates a\n    blending of colors across a face element.\n\n    To support color interpolation, materials must be assigned per\n    vertex, not per element. The illumination models for all materials\n    of vertices attached to the polygon must be the same. Color\n    interpolation applies to the values for ambient (Ka), diffuse (Kd),\n    specular (Ks), and specular highlight (Ns) material properties.\n\n    on turns on color interpolation.\n\n    off turns off color interpolation. The default is off.\n\nd_interp on/off\n\n    Polygonal geometry statement.\n\n    Sets dissolve interpolation on or off.\n\n    Dissolve interpolation creates an interpolation or blend across a\n    polygon between the dissolve (d) values of the materials assigned\n    to its vertices. This feature is used to create effects exhibiting\n    varying degrees of apparent transparency, as in glass or clouds.\n\n    To support dissolve interpolation, materials must be assigned per\n    vertex, not per element. All the materials assigned to the vertices\n    involved in the dissolve interpolation must contain a dissolve\n    factor command to specify a dissolve.\n\n    on turns on dissolve interpolation.\n\n    off turns off dissolve interpolation. The default is off.\n\nlod level\n\n    Polygonal and free-form geometry statement.\n\n    Sets the level of detail to be displayed in a PreView animation.\n    The level of detail feature lets you control which elements of an\n    object are displayed while working in PreView.\n\n    level is the level of detail to be displayed. When you set the\n    level of detail to 0 or omit the lod statement, all elements are\n    displayed.  Specifying an integer between 1 and 100 sets the level\n    of detail to be displayed when reading the .obj file.\n\nmaplib filename1 filename2 . . .\n\n    This is a rendering identifier that specifies the map library file\n    for the texture map definitions set with the usemap identifier. You\n    can specify multiple filenames with maplib. If multiple filenames\n    are specified, the first file listed is searched first for the map\n    definition, the second file is searched next, and so on.\n\n    When you assign a map library using the Model program, Model allows\n    only one map library per .obj file. You can assign multiple\n    libraries using a text editor.\n\n    filename is the name of the library file where the texture maps are\n    defined. There is no default.\n\nusemap map_name/off\n\n    This is a rendering identifier that specifies the texture map name\n    for the element following it. To turn off texture mapping, specify\n    off instead of the map name.\n\n    If you specify texture mapping for a face without texture vertices,\n    the texture map will be ignored.\n\n    map_name is the name of the texture map.\n\n    off turns off texture mapping. The default is off.\n\nusemtl material_name\n\n    Polygonal and free-form geometry statement.\n\n    Specifies the material name for the element following it. Once a\n    material is assigned, it cannot be turned off; it can only be\n    changed.\n\n    material_name is the name of the material. If a material name is\n    not specified, a white material is used.\n\nmtllib filename1 filename2 . . .\n\n    Polygonal and free-form geometry statement.\n\n    Specifies the material library file for the material definitions\n    set with the usemtl statement. You can specify multiple filenames\n    with mtllib. If multiple filenames are specified, the first file\n    listed is searched first for the material definition, the second\n    file is searched next, and so on.\n\n    When you assign a material library using the Model program, only\n    one map library per .obj file is allowed. You can assign multiple\n    libraries using a text editor.\n\n    filename is the name of the library file that defines the\n    materials.  There is no default.\n\nshadow_obj filename\n\n    Polygonal and free-form geometry statement.\n\n    Specifies the shadow object filename. This object is used to cast\n    shadows for the current object. Shadows are only visible in a\n    rendered image; they cannot be seen using hardware shading. The\n    shadow object is invisible except for its shadow.\n\n    An object will cast shadows only if it has a shadow object. You can\n    use an object as its own shadow object. However, a simplified\n    version of the original object is usually preferable for shadow\n    objects, since shadow casting can greatly increase rendering time.\n\n    filename is the filename for the shadow object. You can enter any\n    valid object filename for the shadow object. The object file can be\n    an .obj or .mod file. If a filename is given without an extension,\n    an extension of .obj is assumed.\n\n    Only one shadow object can be stored in a file. If more than one\n    shadow object is specified, the last one specified will be used.\n\ntrace_obj filename\n\n    Polygonal and free-form geometry statement.\n\n    Specifies the ray tracing object filename. This object will be used\n    in generating reflections of the current object on reflective\n    surfaces.  Reflections are only visible in a rendered image; they\n    cannot be seen using hardware shading.\n\n    An object will appear in reflections only if it has a trace object.\n    You can use an object as its own trace object. However, a\n    simplified version of the original object is usually preferable for\n    trace objects, since ray tracing can greatly increase rendering\n    time.\n\n    filename is the filename for the ray tracing object. You can enter\n    any valid object filename for the trace object. You can enter any\n    valid object filename for the shadow object. The object file can be\n    an .obj or .mod file. If a filename is given without an extension,\n    an extension of .obj is assumed.\n\n    Only one trace object can be stored in a file. If more than one is\n    specified, the last one is used.\n\nctech  technique  resolution\n\n    Free-form geometry statement.\n\n    Specifies a curve approximation technique. The arguments specify\n    the technique and resolution for the curve.\n\n    You must select from one of the following three techniques.\n\n    ctech cparm res\n\n\tSpecifies a curve with constant parametric subdivision using\n\tone resolution parameter. Each polynomial segment of the curve\n\tis subdivided n times in parameter space, where n is the\n\tresolution parameter multiplied by the degree of the curve.\n\n\tres is the resolution parameter. The larger the value, the\n\tfiner the resolution. If res has a value of 0, each polynomial\n\tcurve segment is represented by a single line segment.\n\n    ctech cspace maxlength\n\n\tSpecifies a curve with constant spatial subdivision. The curve\n\tis approximated by a series of line segments whose lengths in\n\treal space are less than or equal to the maxlength.\n\n\tmaxlength is the maximum length of the line segments. The\n\tsmaller the value, the finer the resolution.\n\n    ctech curv maxdist maxangle\n\n\tSpecifies curvature-dependent subdivision using separate\n\tresolution parameters for the maximum distance and the maximum\n\tangle.\n\n\tThe curve is approximated by a series of line segments in which\n\t1) the distance in object space between a line segment and the\n\tactual curve must be less than the maxdist parameter and 2) the\n\tangle in degrees between tangent vectors at the ends of a line\n\tsegment must be less than the maxangle parameter.\n\n\tmaxdist is the distance in real space between a line segment\n\tand the actual curve.\n\n\tmaxangle is the angle (in degrees) between tangent vectors at\n\tthe ends of a line segment.\n\n\tThe smaller the values for maxdist and maxangle, the finer the\n\tresolution.\n\n    NOTE: Approximation information for trimming, hole, and special\n    curves is stored in the corresponding surface. The ctech statement\n    for the surface is used, not the ctech statement applied to the\n    curv2 statement. Although untrimmed surfaces have no explicit\n    trimming loop, a loop is constructed which bounds the legal\n    parameter range. This implicit loop follows the same rules as any\n    other loop and is approximated according to the ctech information\n    for the surface.\n\nstech  technique  resolution\n\n    Free-form geometry statement.\n\n    Specifies a surface approximation technique. The arguments specify\n    the technique and resolution for the surface.\n\n    You must select from one of the following techniques:\n\n    stech cparma ures vres\n\n\tSpecifies a surface with constant parametric subdivision using\n\tseparate resolution parameters for the u and v directions. Each\n\tpatch of the surface is subdivided n times in parameter space,\n\twhere n is the resolution parameter multiplied by the degree of\n\tthe surface.\n\n\tures is the resolution parameter for the u direction.\n\n\tvres is the resolution parameter for the v direction.\n\n\tThe larger the values for ures and vres, the finer the\n\tresolution.  If you enter a value of 0 for both ures and vres,\n\teach patch is approximated by two triangles.\n\n    stech cparmb uvres\n\n\tSpecifies a surface with constant parametric subdivision, with\n\trefinement using one resolution parameter for both the u and v\n\tdirections.\n\n\tAn initial triangulation is performed using only the points on\n\tthe trimming curves. This triangulation is then refined until\n\tall edges are of an appropriate length. The resulting triangles\n\tare not oriented along isoparametric lines as they are in the\n\tcparma technique.\n\n\tuvres is the resolution parameter for both the u and v\n\tdirections.  The larger the value, the finer the resolution.\n\n    stech cspace maxlength\n\n\tSpecifies a surface with constant spatial subdivision.\n\n\tThe surface is subdivided in rectangular regions until the\n\tlength in real space of any rectangle edge is less than the\n\tmaxlength.  These rectangular regions are then triangulated.\n\n\tmaxlength is the length in real space of any rectangle edge.\n\tThe smaller the value, the finer the resolution.\n\n    stech curv maxdist maxangle\n\n\tSpecifies a surface with curvature-dependent subdivision using\n\tseparate resolution parameters for the maximum distance and the\n\tmaximum angle.\n\n\tThe surface is subdivided in rectangular regions until 1) the\n\tdistance in real space between the approximating rectangle and\n\tthe actual surface is less than the maxdist (approximately) and\n\t2) the angle in degrees between surface normals at the corners\n\tof the rectangle is less than the maxangle. Following\n\tsubdivision, the regions are triangulated.\n\n\tmaxdist is the distance in real space between the approximating\n\trectangle and the actual surface.\n\n\tmaxangle is the angle in degrees between surface normals at the\n\tcorners of the rectangle.\n\n\tThe smaller the values for maxdist and maxangle, the finer the\n\tresolution.\n\nExamples\n\n1.      Cube with materials\n\nThis cube has a different material applied to each of its faces.\n\n    mtllib master.mtl\n\n    v 0.000000 2.000000 2.000000\n    v 0.000000 0.000000 2.000000\n    v 2.000000 0.000000 2.000000\n    v 2.000000 2.000000 2.000000\n    v 0.000000 2.000000 0.000000\n    v 0.000000 0.000000 0.000000\n    v 2.000000 0.000000 0.000000\n    v 2.000000 2.000000 0.000000\n    # 8 vertices\n\n    g front\n    usemtl red\n    f 1 2 3 4\n    g back\n    usemtl blue\n    f 8 7 6 5\n    g right\n    usemtl green\n    f 4 3 7 8\n    g top\n    usemtl gold\n    f 5 1 4 8\n    g left\n    usemtl orange\n    f 5 6 2 1\n    g bottom\n    usemtl purple\n    f 2 6 7 3\n    # 6 elements\n\n\n2.      Cube casting a shadow\n\nIn this example, the cube casts a shadow on the other objects when it\nis rendered with Image. The cube, which is stored in the file cube.obj,\nreferences itself as the shadow object.\n\n    mtllib master.mtl\n    shadow_obj cube.obj\n\n    v 0.000000 2.000000 2.000000\n    v 0.000000 0.000000 2.000000\n    v 2.000000 0.000000 2.000000\n    v 2.000000 2.000000 2.000000\n    v 0.000000 2.000000 0.000000\n    v 0.000000 0.000000 0.000000\n    v 2.000000 0.000000 0.000000\n    v 2.000000 2.000000 0.000000\n    # 8 vertices\n\n    g front\n    usemtl red\n    f 1 2 3 4\n    g back\n    usemtl blue\n    f 8 7 6 5\n    g right\n    usemtl green\n    f 4 3 7 8\n    g top\n    usemtl gold\n    f 5 1 4 8\n    g left\n    usemtl orange\n    f 5 6 2 1\n    g bottom\n    usemtl purple\n    f 2 6 7 3\n    # 6 elements\n\n\n3.      Cube casting a reflection\n\nThis cube casts its reflection on any reflective objects when it is\nrendered with Image. The cube, which is stored in the file cube.obj,\nreferences itself as the trace object.\n\n    mtllib master.mtl\n    trace_obj cube.obj\n\n    v 0.000000 2.000000 2.000000\n    v 0.000000 0.000000 2.000000\n    v 2.000000 0.000000 2.000000\n    v 2.000000 2.000000 2.000000\n    v 0.000000 2.000000 0.000000\n    v 0.000000 0.000000 0.000000\n    v 2.000000 0.000000 0.000000\n    v 2.000000 2.000000 0.000000\n    # 8 vertices\n\n    g front\n    usemtl red\n    f 1 2 3 4\n    g back\n    usemtl blue\n    f 8 7 6 5\n    g right\n    usemtl green\n    f 4 3 7 8\n    g top\n    usemtl gold\n    f 5 1 4 8\n    g left\n    usemtl orange\n    f 5 6 2 1\n    g bottom\n    usemtl purple\n    f 2 6 7 3\n    # 6 elements\n\n\n\n4.      Texture-mapped square\n\nThis example describes a 2 x 2 square. It is mapped with a 1 x 1 square\ntexture. The texture is stretched to fit the square exactly.\n\nmtllib master.mtl\n\nv 0.000000 2.000000 0.000000\nv 0.000000 0.000000 0.000000\nv 2.000000 0.000000 0.000000\nv 2.000000 2.000000 0.000000\nvt 0.000000 1.000000 0.000000\nvt 0.000000 0.000000 0.000000\nvt 1.000000 0.000000 0.000000\nvt 1.000000 1.000000 0.000000\n# 4 vertices\n\nusemtl wood\nf 1/1 2/2 3/3 4/4\n# 1 element\n\n5.      Approximation technique for a surface\n\nThis example shows a B-spline surface which will be approximated using\ncurvature-dependent subdivision specified by the stech command.\n\n    g bspatch\n    v -5.000000 -5.000000 -7.808327\n    v -5.000000 -1.666667 -7.808327\n    v -5.000000 1.666667 -7.808327\n    v -5.000000 5.000000 -7.808327\n    v -1.666667 -5.000000 -7.808327\n    v -1.666667 -1.666667 11.977780\n    v -1.666667 1.666667 11.977780\n    v -1.666667 5.000000 -7.808327\n    v 1.666667 -5.000000 -7.808327\n    v 1.666667 -1.666667 11.977780\n    v 1.666667 1.666667 11.977780\n    v 1.666667 5.000000 -7.808327\n    v 5.000000 -5.000000 -7.808327\n    v 5.000000 -1.666667 -7.808327\n    v 5.000000 1.666667 -7.808327\n    v 5.000000 5.000000 -7.808327\n    # 16 vertices\n\n    g bspatch\n    cstype bspline\n    stech curv 0.5 10.000000\n    deg 3 3\n    surf 0.000000 1.000000 0.000000 1.000000 13 14 \\ 15 16 9 10 11 12 5 6 7\n    8 1 2 3 4\n    parm u -3.000000 -2.000000 -1.000000 0.000000  \\\n    1.000000 2.000000 3.000000 4.000000\n    parm v -3.000000 -2.000000 -1.000000 0.000000  \\\n    1.000000 2.000000 3.000000 4.000000\n    end\n    # 1 element\n\n\n\n6.      Approximation technique for a curve\n\nThis example shows a Bezier curve which will be approximated using\nconstant parametric subdivision specified by the ctech command.\n\n    v -2.300000 1.950000 0.000000\n    v -2.200000 0.790000 0.000000\n    v -2.340000 -1.510000 0.000000\n    v -1.530000 -1.490000 0.000000\n    v -0.720000 -1.470000 0.000000\n    v -0.780000 0.230000 0.000000\n    v 0.070000 0.250000 0.000000\n    v 0.920000 0.270000 0.000000\n    v 0.800000 -1.610000 0.000000\n    v 1.620000 -1.590000 0.000000\n    v 2.440000 -1.570000 0.000000\n    v 2.690000 0.670000 0.000000\n    v 2.900000 1.980000 0.000000\n    # 13 vertices\n\n    g default\n    cstype bezier\n    ctech cparm 1.000000\n    deg 3\n    curv 0.000000 4.000000 1 2 3 4 5 6 7 8 9 10 \\\n    11 12 13\n    parm u 0.000000 1.000000 2.000000 3.000000  \\\n    4.000000\n    end\n    # 1 element\n\n\n\nComments\n\nComments can appear anywhere in an .obj file. They are used to annotate\nthe file; they are not processed.\n\nHere is an example:\n\n    # this is a comment\n\nThe Model program automatically inserts comments when it creates .obj\nfiles. For example, it reports the number of geometric vertices,\ntexture vertices, and vertex normals in a file.\n\n    # 4 vertices\n    # 4 texture vertices\n    # 4 normals\n\nMathematics for free-form curves/surfaces\n\n[I apologize but this section will make absolutely no sense whatsoever\n without the equations and diagrams and there was just no easy way to\n include them in a pure ASCII document.  You should probably just skip\n ahead to the section \"Superseded statements.\"  -Jim]\n\nGeneral forms\n\nRational and non-rational curves and surfaces\n\nIn general, any non-rational curve segment may be written as:\n\nwhere\n\nK + 1    is the number of control points\n\ndi       are the control points\n\nn        is the degree of the curve\n\nNi,n(t)          are the degree n basis functions\n\nExtending this to the bivariate case, any non-rational surface patch\nmay be written as:\n\nwhere:\n\nK1 + 1   is the number of control points in the u direction\n\nK2 + 1   is the number of control points in the v direction\n\ndi,j     are the control points\n\nm        is the degree of the surface in the u direction\n\nn        is the degree of the surface in the v direction\n\nNi,m(u)          are the degree m basis functions in the u direction\n\nNj,n(v)          are the degree n basis functions in the v direction\n\nNOTE: The front of the surface is defined as the side where the u\nparameter increases to the right and the v parameter increases upward.\n\nWe may extend this curve to the rational case as:\n\n\n\nwhere wi are the weights associated with the control points di.\nSimilarly, a rational surface may be expressed as:\n\nwhere wi,j  are the weights associated with the control points di,j.\n\nNOTE: If a curve or surface in an .obj file is rational, it must use\nthe rat option with the cstype statement and it requires some weight\nvalues for each control point.\n\n\n\nThe weights for the rational form are given as a third control point\ncoordinate (for trimming curves) or fourth coordinate (for space curves\nand surfaces). These weights are optional and default to 1.0 if not\ngiven.\n\n\n\nThis default weight is only reasonable for curves and surfaces whose\nbasis functions sum to 1.0, such as Bezier, Cardinal, and NURB. It does\nnot make sense for Taylor and may or may not make sense for a\nrepresentation given in basis-matrix form.\n\nFor all forms other than B-spline, the final curve or surface is\nconstructed by piecing together the individual curve segments or\nsurface patches. A global parameter space is then defined over the\nentire composite curve or surface using the parameter vector given with\nthe parm statement.\n\nThe parameter vector for a curve is a list of p global parameter values\n{t1, . . . , tp}. If t1  t < ti+1 is a point in global parameter space,\nthen:\n\nis the corresponding point in local parameter space for the ith\npolynomial segment. It is this t which is used when evaluating a given\nsegment of the piecewise curve. For surfaces, this mapping from global\nto local parameter space is applied independently in both the u and v\nparametric directions.\n\nB-splines require a knot vector rather than a parameter vector,\nalthough this is also given with the parm statement. Refer to the\ndescription of B-splines below.\n\nThe following discussion of each type is expressed in terms of the\nabove definitions.\n\nNOTE: The maximum degree for all curve and surface types is currently\nset at 20, which is high enough for most purposes.\n\n\n\nFree-form curve and surface types\n\nB-spline\n\nType bspline specifies arbitrary degree non-uniform B-splines which are\ncommonly referred to as NURBs in their rational form. The basis\nfunctions are defined by the Cox-deBoor recursion formulas as:\n\nand:\n\nwhere, by convention, 0/0 = 0.\n\nThe xi  {x0, . . . ,xq} form a set known as the knot vector which is\ngiven by the parm statement. It is required that\n\n1.      xi  xi + 1,\n\n2.      x0 < xn + 1,\n\n3.      xq -n -1 < xq,\n\n4.      xi < xi + n for 0 < i < q - n - 1,\n\n5.      xn  t min < tmax  xK+ 1, where [tmin, tmax] is the parameter\nover which the B-spline is to be evaluated, and\n\n6.      K = q - n - 1.\n\nA knot is said to be of multiplicity r if its value is repeated r times\nin the knot vector. The second through fourth conditions above restrict\nknots to be of at most multiplicity n + 1 at the ends of the vector and\nat most n everywhere else.\n\nThe last condition requires that the number of control points is equal\nto one less than the number of knots minus the degree. For surfaces,\nall of the above conditions apply independently for the u and v\nparametric directions.\n\nBezier\n\nType bezier specifies arbitrary degree Bezier curves and surfaces. This\nbasis function is defined as:\n\nwhere:\n\nWhen using type bezier, the number of global parameter values given\nwith the parm statement must be K/n + 1, where K is the number of\ncontrol points. For surfaces, this requirement applies independently\nfor the u and v parametric directions.\n\nCardinal\n\nType cardinal specifies a cubic, first derivative, continuous curve or\nsurface. For curves, this interpolates all but the first and last\ncontrol points. For surfaces, all but the first and last row and column\nof control points are interpolated.\n\nCardinal splines, also known as Catmull-Rom splines, are best\nunderstood by considering the conversion from Cardinal to Bezier\ncontrol points for a single curve segment:\n\nHere, the ci variables are the Cardinal control points and the bi\nvariables are the Bezier control points. We see that the second and\nthird Cardinal points are the beginning and ending points for the\nsegment, respectively. Also, the beginning tangent lies along the\nvector from the first to the third point, and the ending tangent along\nthe vector from the second to the last point.\n\nIf we let Bi(t) be the cubic Bezier basis functions (i.e. what was\ngiven above for Bezier as Ni,n(t) with n = 3), then we may write the\nCardinal basis functions as:\n\nNote that Cardinal splines are only defined for the cubic case.\n\nWhen using type cardinal, the number of global parameter values given\nwith the parm statement must be K - n + 2, where K is the number of\ncontrol points. For surfaces, this requirement applies independently\nfor the u and v parametric directions.\n\nTaylor\n\nType taylor specifies arbitrary degree Taylor polynomial curves and\nsurfaces. The basis function is simply:\n\nNOTE: The control points in this case are the polynomial coefficients\nand have no obvious geometric significance.\n\nWhen using type taylor, the number of global parameter values given\nwith the parm statement must be (K + 1)/(n + 1) + 1, where K is the\nnumber of control points. For surfaces, this requirement applies\nindependently for the u and v parametric directions.\n\nBasis matrix\n\nType bmatrix specifies general, arbitrary-degree curves defined through\nthe use of a basis matrix rather than an explicit type such as Bezier.\nThe basis functions are defined as:\n\nwhere the basis matrix is the bi,j. In order to make the matrix nature\nof this more obvious, we may also write:\n\nWhen constructing basis matrices, you should keep this definition in\nmind, as different authors write this in different ways. A more common\nmatrix representation is:\n\nTo use such matrices in the .obj file, simply transpose the matrix and\nreverse the column ordering.\n\nWhen using type basis, the number of global parameter values given with\nthe parm statement must be (K - n)/s + 2, where K is the number of\ncontrol points and s is the step size given with the step statement.\nFor surfaces, this requirement applies independently for the u and v\nparametric directions.\n\nSurface vertex data\n\nControl points\n\nThe control points for a surface consisting of a single patch are\nlisted in the order i = 0 to K1 for j = 0, followed by i = 0 to K1 for\nj = 1, and so on until j = K2.\n\nFor surfaces made up of many patches, which is the usual case, the\ncontrol points are ordered as if the surface were a single large patch.\nFor example, the control points for a bicubic Bezier surface consisting\nof four patches would be arranged as follows:\n\nwhere (m, n) is the global parameter space of the surface and the\nnumbers indicate the ordering of the vertex indices in the surf\nstatement.\n\nTexture vertices and texture mapping\n\nWhen texture vertices are not supplied, the original surface\nparameterization is used for texture mapping. However, if texture\nvertices are supplied, they are interpreted as additional information\nto be interpolated or approximated separately from, but using the same\ninterpolation functions as the control vertices.\n\nThat is, whereas the surface itself, in the non-rational case, was\ngiven in the section \"Rational and non-rational curves and surfaces\"\nas:\n\n\n\nthe texture vertices are interpolated or approximated by:\n\nwhere ti,j are the texture vertices and the basis functions are the\nsame as for S(u,v). It is T(u,v), rather than the surface\nparameterization (u,v), which is used when a texture map is applied.\n\nVertex normals and normal mapping\n\nVertex normals are treated exactly like texture vertices. When vertex\nnormals are not supplied, the true surface normals are used. If vertex\nnormals are supplied, they are calculated as:\n\nwhere qi,j are the vertex normals and the basis functions are the same\nas for S(u,v) and T(u,v).\n\nNOTE: Vertex normals do not affect the shape of the surface; they are\nsimply associated with the triangle vertices in the final\ntriangulation. As with faces, supplying vertex normals only affects\nlighting calculations for the surface.\n\nThe treatment of both texture vertices and vertex normals in the case\nof rational surfaces is identical. It is important to notice that even\nwhen the surface S(u,v) is rational, the texture and normal surfaces,\nT(u,v) and Q(u,v), are not rational. This is because the control points\n(the texture vertices and vertex normals) are never rational.\n\nCurve and surface operations\n\nSpecial points\n\nThe following equations give a more precise description of special\npoints for space curves and discuss the extension to trimming curves\nand surfaces.\n\nLet C(t) be a space curve with the global parameter t. We can\napproximate this curve by a set of k-1 line segments which connect the\npoints:\n\nfor some set of k global parameter values {t1,...,tk}\n\nGiven a special point ts in the parameter space of the curve\n(referenced by vp), we guarantee that ts  {t1, . . . ,tk}. More\nspecifically, we approximate the curve by:\n\nwhere, at the point i where ts is inserted, we have ti  ts < ti+1.\n\nSpecial curves\n\nThe following equations give a more precise description of a special\ncurve.\n\nLet T(t) be a special curve with the global parameter t. We have:\n\nwhere (m,n) is a point in the global parameter space of a surface. We\ncan approximate this curve by a set of k-1 line segments which connect\nthe points:\n\nfor some set of k global parameter values.\n\nLet S(m,n) be a surface with the global parameters m and n. We can\napproximate this surface by a triangulation of a set of p points.\n\nwhich lie on the surface. We further define E as the set of all edges\nsuch that ei,j  E implies that S(mi,ni) and S(mj,nj) are connected in\nthe triangulation. Finally, we guarantee that there exists some subset\nof E:\n\nsuch that the points:\n\nare connected in the triangulation.\n\nConnectivity\n\nRecall that the syntax of the con statement is:\n\ncon surf_1 q0_1 q1_1 curv2d_1 surf_2 q0_2 q1_2 curv2d_2\n\nIf we let:\n\nT1(t1)  be the curve referenced by curv2d_1\n\nS1(m1, n1)      be the surface referenced by surf1 on which T1(t1) lies\n\nT2(t2)  be the curve referenced by curv2d_2\n\nS2(m2, n2)      be the surface referenced by surf2 on which T2(t2) lies\n\nthen S1(T1(t1)), S2(T2(t2)) must be identical up to reparameterization.\nMoreover, it must be the case that:\n\nS1(T1(q0_1)) = S2(T2(q0_2))\n\nand:\n\nS1(T1(q1_1)) = S2(T2(q1_2))\n\nIt is along the curve S1(T1(t1)) between t1 = q0_1 and t1 = q1_1, and\nthe curve S2(T2(t2)) between t2 = q0_2 and t2 = q1_2 that the surface\nS1(m1, n1) is connected to the surface S2(m2, n2).\n\n\n\nSuperseded statements\n\nThe new .obj file format has eliminated the need for several patch and\ncurve statements. These statements have been replaced by free-form\ngeometry statements.\n\nIn the 3.0 release, the following keywords have been superseded:\n\no       bsp\n\no       bzp\n\no       cdc\n\no       cdp\n\no       res\n\nYou can still read these statements in this version 3.0, however, the\nsystem will no longer write files in this format.\n\nThis release is the last release that will read these statements. If\nyou want to save any data from this format, read in the file and write\nit out. The system will convert the data to the new .obj format.\n\nFor more information on the new syntax statements, see \"Specifying\nfree-form curves and surfaces.\"\n\nSyntax\n\nThe following syntax statements are for the superseded keywords.\n\nbsp v1 v2 . . . v16\n\n    Specifies a B-spline patch. B-spline patches have sixteen control\n    points, defined as vertices. Only four of the control points are\n    distributed over the surface of the patch; the remainder are\n    distributed around the perimeter of the patch.\n\n    Patches must be tessellated in Model before they can be correctly\n    shaded or rendered.\n\n    v is the vertex number for a control point. Sixteen vertex numbers\n    are required. Positive values indicate absolute vertex numbers.\n    Negative values indicate relative vertex numbers.\n\nbzp v1 v2 . . . v16\n\n    Specifies a Bezier patch. Bezier patches have sixteen control\n    points, defined as vertices. The control points are distributed\n    uniformly over its surface.\n\n    Patches must be tessellated in Model before they can be correctly\n    shaded or rendered.\n\n    v is the vertex number for a control point. Sixteen vertex numbers\n    are required. Positive values indicate absolute vertex numbers.\n    Negative values indicate relative vertex numbers.\n\ncdc v1 v2 v3 v4 v5 . . .\n\n    Specifies a Cardinal curve. Cardinal curves have a minimum of four\n    control points, defined as vertices.\n\n    Cardinal curves cannot be correctly shaded or rendered. They can be\n    tessellated and then extruded in Model to create 3D shapes.\n\n    v is the vertex number for a control point. A minimum of four\n    vertex numbers are required. There is no limit on the maximum.\n    Positive values indicate absolute vertex numbers. Negative values\n    indicate relative vertex numbers.\n\ncdp v1 v2 v3 . . . v16\n\n    Specifies a Cardinal patch. Cardinal patches have sixteen control\n    points, defined as vertices. Four of the control points are\n    attached to the corners of the patch.\n\n    Patches must be tessellated in Model before they can be correctly\n    shaded or rendered.\n\n    v is the vertex number for a control point. Sixteen vertex numbers\n    are required. Positive values indicate absolute vertex numbers.\n    Negative values indicate relative vertex numbers.\n\nres useg vseg\n\n    Reference and display statement.\n\n    Sets the number of segments for Bezier, B-spline and Cardinal\n    patches that follow it.\n\n    useg is the number of segments in the u direction (horizontal or x\n    direction). The minimum setting is 3 and the maximum setting is\n    120.  The default is 4.\n\n    vseg is the number of segments in the v direction (vertical or y\n    direction). The minimum setting is 3 and the maximum setting is\n    120.  The default is 4.\n\nComparison of 2.11 and 3.0 syntax\n\nCardinal curve\n\nThe following example shows the 2.11 syntax and the 3.0 syntax for the\nsame Cardinal curve.\n\n2.11 Cardinal curve\n\n    # 2.11 Cardinal Curve\n\n    v 2.570000 1.280000 0.000000\n    v 0.940000 1.340000 0.000000\n    v -0.670000 0.820000 0.000000\n    v -0.770000 -0.940000 0.000000\n    v 1.030000 -1.350000 0.000000\n    v 3.070000 -1.310000 0.000000\n    # 6 vertices\n\n    cdc 1 2 3 4 5 6\n\n\n3.0 Cardinal curve\n\n    # 3.0 Cardinal curve\n\n    v 2.570000 1.280000 0.000000\n    v 0.940000 1.340000 0.000000\n    v -0.670000 0.820000 0.000000\n    v -0.770000 -0.940000 0.000000\n    v 1.030000 -1.350000 0.000000\n    v 3.070000 -1.310000 0.000000\n    # 6 vertices\n\n    cstype cardinal\n    deg 3\n    curv 0.000000 3.000000 1 2 3 4 5 6\n    parm u 0.000000 1.000000 2.000000 3.000000\n    end\n    # 1 element\n\nBezier patch\n\n The following example shows the 2.11 syntax and the 3.0 syntax for the\n same Bezier patch.\n\n2.11 Bezier patch\n\n    # 2.11 Bezier Patch\n    v -5.000000 -5.000000 0.000000\n    v -5.000000 -1.666667 0.000000\n    v -5.000000 1.666667 0.000000\n    v -5.000000 5.000000 0.000000\n    v -1.666667 -5.000000 0.000000\n    v -1.666667 -1.666667 0.000000\n    v -1.666667 1.666667 0.000000\n    v -1.666667 5.000000 0.000000\n    v 1.666667 -5.000000 0.000000\n    v 1.666667 -1.666667 0.000000\n    v 1.666667 1.666667 0.000000\n    v 1.666667 5.000000 0.000000\n    v 5.000000 -5.000000 0.000000\n    v 5.000000 -1.666667 0.000000\n    v 5.000000 1.666667 0.000000\n    v 5.000000 5.000000 0.000000\n    # 16 vertices\n\n    bzp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\n    # 1 element\n\n3.0 Bezier patch\n\n    #   3.0 Bezier patch\n\n    v -5.000000 -5.000000 0.000000\n    v -5.000000 -1.666667 0.000000\n    v -5.000000 1.666667 0.000000\n    v -5.000000 5.000000 0.000000\n    v -1.666667 -5.000000 0.000000\n    v -1.666667 -1.666667 0.000000\n    v -1.666667 1.666667 0.000000\n    v -1.666667 5.000000 0.000000\n    v 1.666667 -5.000000 0.000000\n    v 1.666667 -1.666667 0.000000\n    v 1.666667 1.666667 0.000000\n    v 1.666667 5.000000 0.000000\n    v 5.000000 -5.000000 0.000000\n    v 5.000000 -1.666667 0.000000\n    v 5.000000 1.666667 0.000000\n    v 5.000000 5.000000 0.000000\n    # 16 vertices\n\n    cstype bezier\n    deg 3 3\n    surf 0.000000 1.000000 0.000000 1.000000 13 14 \\\n    15 16 9 10 11 12 5 6 7 8 1 2 3 4\n    parm u 0.000000 1.000000\n    parm v 0.000000 1.000000\n    end\n    # 1 element\n\n"
  },
  {
    "path": "modules/ode/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_ODE_INCLUDE_DIR})\n\nK3D_BUILD_MODULE(k3d-ode)\nK3D_CREATE_MODULE_PROXY(k3d-ode)\n\nTARGET_LINK_LIBRARIES(k3d-ode ${K3D_ODE_LIBRARY})\n\n"
  },
  {
    "path": "modules/ode/isimulation.h",
    "content": "#ifndef MODULES_ODE_ISIMULATION_H\n#define MODULES_ODE_ISIMULATION_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/signal_system.h>\n\n#include <ode/ode.h>\n\nnamespace module\n{\n\nnamespace ode\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// isimulation\n\nclass isimulation :\n\tpublic k3d::iunknown\n{\npublic:\n\tvirtual const dWorldID world() = 0;\n\tvirtual const dSpaceID space() = 0;\n\n\tvirtual sigc::connection connect_simulation_changed_signal(const sigc::slot<void>& Slot) = 0;\n\tvirtual sigc::connection connect_initial_state_signal(const sigc::slot<void>& Slot) = 0;\n\tvirtual sigc::connection connect_update_state_signal(const sigc::slot<void>& Slot) = 0;\n\n\tvirtual void simulation_changed() = 0;\n\tvirtual void update() = 0;\n};\n\n} // namespace ode\n\n} // namespace module\n\n#endif // !MODULES_ODE_ISIMULATION_H\n\n"
  },
  {
    "path": "modules/ode/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace ode\n{\n\nextern k3d::iplugin_factory& node_factory();\nextern k3d::iplugin_factory& simulation_factory();\n\n} // namespace ode\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ode::node_factory());\n\tRegistry.register_factory(module::ode::simulation_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/ode/node.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include \"isimulation.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/value_demand_storage.h>\n\nnamespace module\n{\n\nnamespace ode\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// node\n\nclass node :\n\tpublic k3d::node,\n\tpublic k3d::imatrix_source,\n\tpublic k3d::imatrix_sink\n{\n\ttypedef k3d::node base;\n\npublic:\n\tnode(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_simulation(init_owner(*this) + init_name(\"simulation\") + init_label(_(\"Simulation\")) + init_description(_(\"ODE simulation node.\")) + init_value<ode::isimulation*>(0)),\n\t\tm_input(init_owner(*this) + init_name(\"input_matrix\") + init_label(_(\"Input matrix\")) + init_description(_(\"Input matrix\")) + init_value(k3d::identity3())),\n\t\tm_mass(init_owner(*this) + init_name(\"mass\") + init_label(_(\"Mass\")) + init_description(_(\"Mass.\")) + init_value(1.0)),\n\t\tm_linear_velocity(init_owner(*this) + init_name(\"linear_velocity\") + init_label(_(\"Linear Velocity\")) + init_description(_(\"Defines the initial linear velocity (if any).\")) + init_value(k3d::vector3(0, 0, 0))),\n\t\tm_output(init_owner(*this) + init_name(\"output_matrix\") + init_label(_(\"Output Matrix\")) + init_description(_(\"Output matrix (read only)\")) + init_value(k3d::identity3())),\n\t\tm_body_id(0)\n\t{\n\t\tm_simulation.changed_signal().connect(sigc::mem_fun(*this, &node::new_simulation));\n\n\t\tm_input.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(sigc::mem_fun(*this, &node::state_changed)));\n\t\tm_mass.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(sigc::mem_fun(*this, &node::state_changed)));\n\t\tm_linear_velocity.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(sigc::mem_fun(*this, &node::state_changed)));\n\n\t\tm_output.set_update_slot(sigc::mem_fun(*this, &node::execute));\n\t}\n\n\tk3d::iproperty& matrix_source_output()\n\t{\n\t\treturn m_output;\n\t}\n\n\tk3d::iproperty& matrix_sink_input()\n\t{\n\t\treturn m_input;\n\t}\n\n\tvoid new_simulation(k3d::ihint*)\n\t{\n\t\tif(m_body_id)\n\t\t{\n\t\t\tdBodyDestroy(m_body_id);\n\t\t\tm_body_id = 0;\n\t\t}\n\n\t\tm_simulation_changed_connection.disconnect();\n\t\tm_initial_state_connection.disconnect();\n\t\tm_update_state_connection.disconnect();\n\n\t\tif(ode::isimulation* const simulation = m_simulation.pipeline_value())\n\t\t{\n\t\t\tm_body_id = dBodyCreate(simulation->world());\n\t\t\tdGeomID geometry_id = dCreateBox(simulation->space(), 5, 5, 5);\n\t\t\tdGeomSetBody(geometry_id, m_body_id);\n\n\t\t\tm_simulation_changed_connection = simulation->connect_simulation_changed_signal(sigc::mem_fun(*this, &node::simulation_changed));\n\t\t\tm_initial_state_connection = simulation->connect_initial_state_signal(sigc::mem_fun(*this, &node::initial_state));\n\t\t\tm_update_state_connection = simulation->connect_update_state_signal(sigc::mem_fun(*this, &node::update_state));\n\n\t\t\tsimulation->simulation_changed();\n\t\t}\n\t}\n\n\tvoid state_changed(k3d::ihint*)\n\t{\n\t\tif(ode::isimulation* const simulation = m_simulation.pipeline_value())\n\t\t\tsimulation->simulation_changed();\n\t}\n\n\tvoid simulation_changed()\n\t{\n\t\tm_output.update(0);\n\t}\n\n\tvoid initial_state()\n\t{\n\t\tif(!m_body_id)\n\t\t\treturn;\n\n\t\tconst k3d::matrix4 resting = m_input.pipeline_value();\n\t\tconst k3d::vector3 linear_velocity = m_linear_velocity.pipeline_value();\n\n\t\tdReal p[] = { resting[0][3], resting[1][3], resting[2][3] };\n\t\tdReal r[] = { resting[0][0], resting[1][0], resting[2][0], 0, resting[0][1], resting[1][1], resting[2][1], 0, resting[0][2], resting[1][2], resting[2][2] };\n\n\t\tdBodySetPosition(m_body_id, p[0], p[1], p[2]);\n\t\tdBodySetRotation(m_body_id, r);\n\t\tdBodySetLinearVel(m_body_id, linear_velocity[0], linear_velocity[1], linear_velocity[2]);\n\t\tdBodySetAngularVel(m_body_id, 0, 0, 0);\n\t}\n\n\tvoid update_state()\n\t{\n\t\tif(!m_body_id)\n\t\t\treturn;\n\t\t\n\t\tdMass mass;\n\t\tdMassSetBoxTotal(&mass, m_mass.pipeline_value(), 5, 5, 5);\n\t\tdBodySetMass(m_body_id, &mass);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<node,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::uuid(0x8d0deddb, 0x10409128, 0x04d1b2b1, 0x62c4cda1),\n\t\t\t\t\"ODEPhysicalNode\",\n\t\t\t\t_(\"Rigid-body dynamics object.\"),\n\t\t\t\t\"Simulation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(ode::isimulation*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_simulation;\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_mass;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_linear_velocity;\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_output;\n\n\tsigc::connection m_simulation_changed_connection;\n\tsigc::connection m_initial_state_connection;\n\tsigc::connection m_update_state_connection;\n\n\tdBodyID m_body_id;\n\n\t/// Called whenever the output matrix has been modified and needs to be updated.\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::matrix4& Matrix)\n\t{\n\t\tif(m_body_id)\n\t\t{\n\t\t\tif(ode::isimulation* const simulation = m_simulation.pipeline_value())\n\t\t\t{\n\t\t\t\tsimulation->update();\n\n\t\t\t\tconst dReal* const p = dBodyGetPosition(m_body_id);\n\t\t\t\tconst dReal* const r = dBodyGetRotation(m_body_id);\n\n\t\t\t\tMatrix = k3d::matrix4(\n\t\t\t\t\t\tk3d::vector4(r[0], r[4], r[8], p[0]),\n\t\t\t\t\t\tk3d::vector4(r[1], r[5], r[9], p[1]),\n\t\t\t\t\t\tk3d::vector4(r[2], r[6], r[10], p[2]),\n\t\t\t\t\t\tk3d::vector4(0, 0, 0, 1));\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tMatrix = m_input.pipeline_value();\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// node_factory\n\nk3d::iplugin_factory& node_factory()\n{\n\treturn node::get_factory();\n}\n\n} // namespace ode\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/ode/simulation.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include \"isimulation.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/time_sink.h>\n#include <k3dsdk/vector3.h>\n\nnamespace module\n{\n\nnamespace ode\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// simulation\n\nclass simulation :\n\tpublic k3d::time_sink<k3d::node>,\n\tpublic isimulation\n{\n\ttypedef k3d::time_sink<k3d::node> base;\n\npublic:\n\tsimulation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_world_id(dWorldCreate()),\n\t\tm_space_id(dSimpleSpaceCreate(0)),\n\t\tm_plane_id(dCreatePlane(m_space_id, 0, 0, 1, 0)),\n\t\tm_contact_joint_group_id(dJointGroupCreate(0)),\n\t\tm_last_time(0.0),\n\t\tm_modified(false),\n\t\tm_gravity(init_owner(*this) + init_name(\"gravity\") + init_label(_(\"Gravity\")) + init_description(_(\"Defines the gravity direction and magnitude (if any).\")) + init_value(k3d::vector3(0, 0, -9.81)))\n\t{\n\t\tdInitODE();\n\n\t\tm_time.changed_signal().connect(sigc::mem_fun(*this, &simulation::time_changed));\n\t}\n\n\t~simulation()\n\t{\n\t\tdJointGroupDestroy(m_contact_joint_group_id);\n\t\tdGeomDestroy(m_plane_id);\n\t\tdSpaceDestroy(m_space_id);\n\t\tdWorldDestroy(m_world_id);\n\t}\n\n\tconst dWorldID world()\n\t{\n\t\treturn m_world_id;\n\t}\n\n\tconst dSpaceID space()\n\t{\n\t\treturn m_space_id;\n\t}\n\n\tsigc::connection connect_simulation_changed_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_simulation_changed_signal.connect(Slot);\n\t}\n\n\tsigc::connection connect_initial_state_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_initial_state_signal.connect(Slot);\n\t}\n\n\tsigc::connection connect_update_state_signal(const sigc::slot<void>& Slot)\n\t{\n\t\treturn m_update_state_signal.connect(Slot);\n\t}\n\n\tvoid simulation_changed()\n\t{\n\t\tm_modified = true;\n\t\tm_simulation_changed_signal.emit();\n\t}\n\n\tvoid update()\n\t{\n\t\tif(!m_modified)\n\t\t\treturn;\n\n\t\tm_modified = false;\n\n\t\tconst k3d::double_t current_time = m_time.pipeline_value();\n\t\tconst k3d::double_t delta_time = current_time - m_last_time;\n\t\tm_last_time = current_time;\n\n\t\tif(delta_time > 0.0)\n\t\t{\n\t\t\t// Setup the world state ...\n\t\t\tconst k3d::vector3 gravity = m_gravity.pipeline_value();\n\t\t\tdWorldSetGravity(m_world_id, gravity[0], gravity[1], gravity[2]);\n\n\t\t\t// Set body states ...\n\t\t\tm_update_state_signal.emit();\n\n\t\t\t// Detect collisions ...\n\t\t\tdSpaceCollide(m_space_id, this, raw_collision_callback);\n\n\t\t\t// Step the simulation ...\n\t\t\tdWorldStep(m_world_id, delta_time);\n\n\t\t\t// Reset collisions ...\n\t\t\tdJointGroupEmpty(m_contact_joint_group_id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Set initial body states ...\n\t\t\tm_initial_state_signal.emit();\n\t\t}\n\t}\n\n\tvoid time_changed(k3d::ihint*)\n\t{\n\t\tm_modified = true;\n\t\tm_simulation_changed_signal.emit();\n\t}\n\n\tstatic void raw_collision_callback(void* Data, dGeomID Geometry1, dGeomID Geometry2)\n\t{\n\t\treinterpret_cast<simulation*>(Data)->collision_callback(Geometry1, Geometry2);\n\t}\n\t\n\tvoid collision_callback(dGeomID Geometry1, dGeomID Geometry2)\n\t{\n\t\tconst int max_contact_count = 64;\n\t\tdContact contacts[max_contact_count];\n\n\t\tdContact* const contact_begin = contacts;\n\t\tdContact* const contact_end = contact_begin + dCollide(Geometry1, Geometry2, max_contact_count, &contacts[0].geom, sizeof(dContact));\n\t\tfor(dContact* contact = contact_begin; contact != contact_end; ++contact)\n\t\t{\n//\t\t\tcontact->surface.mode = dContactBounce | dContactSoftCFM;\n\t\t\tcontact->surface.mode = 0;\n//\t\t\tcontact->surface.mu = dInfinity;\n\t\t\tcontact->surface.mu = 0;\n\t\t\tcontact->surface.mu2 = 0;\n\t\t\tcontact->surface.bounce = 0.0;\n\t\t\tcontact->surface.bounce_vel = 0.0;\n\t\t\tcontact->surface.soft_cfm = 0.00;\n\n\t\t\tconst dJointID joint_id = dJointCreateContact(m_world_id, m_contact_joint_group_id, contact);\n\t\t\tdJointAttach(joint_id, dGeomGetBody(Geometry1), dGeomGetBody(Geometry2));\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<simulation,\n\t\t\tk3d::interface_list<k3d::itime_sink> > factory(\n\t\t\t\tk3d::uuid(0x0df159e6, 0x4d49063c, 0x391217b5, 0x8079599e),\n\t\t\t\t\"ODESimulation\",\n\t\t\t\t_(\"Rigid-body dynamics simulation.\"),\n\t\t\t\t\"Simulation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tdWorldID m_world_id;\n\tdSpaceID m_space_id;\n\tdGeomID m_plane_id;\n\tdJointGroupID m_contact_joint_group_id;\n\n\tk3d::bool_t m_modified;\n\tsigc::signal<void> m_simulation_changed_signal;\n\tsigc::signal<void> m_initial_state_signal;\n\tsigc::signal<void> m_update_state_signal;\n\n\tk3d::double_t m_last_time;\n\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_gravity;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// simulation_factory\n\nk3d::iplugin_factory& simulation_factory()\n{\n\treturn simulation::get_factory();\n}\n\n} // namespace ode\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/ogre_io/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-ogre-io)\nK3D_CREATE_MODULE_PROXY(k3d-ogre-io)\n\n"
  },
  {
    "path": "modules/ogre_io/mesh_writer.cpp",
    "content": "#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/mesh_writer.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace ogre\n{\n\nnamespace io\n{\n\t\nclass mesh_writer :\n\tpublic k3d::mesh_writer<k3d::node>\n{\n\ttypedef k3d::mesh_writer<k3d::node> base;\n\t\npublic:\n\tmesh_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_writer, k3d::interface_list<k3d::imesh_sink > > factory(\n\t\t\tk3d::uuid(0x1f8118fa, 0x4341982b, 0x642d068f, 0x0d3c70e4),\n\t\t\t\"OgreXmlMeshWriter\",\n\t\t\t_(\"Mesh writer that saves external Ogre XML Mesh files\"),\n\t\t\t\"MeshWriter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_write_mesh(const k3d::mesh& Input, const k3d::filesystem::path& OutputPath, std::ostream& Output)\n\t{\n\t\tstd::stringstream sstream;\n\t\n\t\tk3d::xml::element top(\"mesh\");\n\t\t\n\t\t// Store points ...\n\t\tif(Input.points)\n\t\t{\n\t\t\tconst k3d::mesh::points_t& points = *Input.points;\n\t\t\t\n\t\t\tk3d::xml::element shared_geom(\"sharedgeometry\");\n\t\t\tsstream << points.size();\n\t\t\tshared_geom.append(k3d::xml::attribute(\"vertexcount\", sstream.str()));\n\t\t\tsstream.str(\"\");\n\t\t\t\n\t\t\tk3d::xml::element vertexbuffer(\"vertexbuffer\");\n\t\t\tvertexbuffer.append(k3d::xml::attribute(\"positions\", \"true\"));\n\t\t\t\n\t\t\tconst size_t point_begin = 0;\n\t\t\tconst size_t point_end = point_begin + points.size();\n\t\t\tfor(size_t point = point_begin; point != point_end; ++point) {\n\t\t\t\tk3d::xml::element vertex(\"vertex\");\n\t\t\t\tk3d::xml::element position(\"position\");\n\t\t\t\t\n\t\t\t\tsstream << points[point][0];\n\t\t\t\tposition.append(k3d::xml::attribute(\"x\", sstream.str()));\n\t\t\t\tsstream.str(\"\");\n\t\t\t\t\n\t\t\t\tsstream << points[point][1];\n\t\t\t\tposition.append(k3d::xml::attribute(\"y\", sstream.str()));\n\t\t\t\tsstream.str(\"\");\n\t\t\t\t\n\t\t\t\tsstream << points[point][2];\n\t\t\t\tposition.append(k3d::xml::attribute(\"z\", sstream.str()));\n\t\t\t\tsstream.str(\"\");\n\t\t\t\t\n\t\t\t\tvertex.append(position);\n\t\t\t\tvertexbuffer.append(vertex);\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\tshared_geom.append(vertexbuffer);\n\t\t\ttop.append(shared_geom);\n\t\t}\n\t\t\n\t\t// Store polyhedra ...\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Input, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tif(!k3d::polyhedron::is_triangles(*polyhedron))\n\t\t\t{\n\t\t\t\tk3d::log() << warning << factory().name() << \" cannot export polyhedron containing non-triangles.\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst k3d::mesh::indices_t& face_first_loops = polyhedron->face_first_loops;\n\t\t\tconst k3d::mesh::indices_t& loop_first_edges = polyhedron->loop_first_edges;\n\t\t\tconst k3d::mesh::indices_t& clockwise_edges = polyhedron->clockwise_edges;\n\t\t\tconst k3d::mesh::indices_t& vertex_points = polyhedron->vertex_points;\n\n\t\t\tk3d::xml::element submeshes(\"submeshes\");\n\t\t\tk3d::xml::element submesh(\"submesh\");\n\t\t\tk3d::xml::element faces(\"faces\");\n\t\t\t\n\t\t\tsstream << face_first_loops.size();\n\t\t\tfaces.append(k3d::xml::attribute(\"count\", sstream.str()));\n\t\t\tsstream.str(\"\");\n\t\t\t\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + face_first_loops.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tk3d::uint_t first_edge = loop_first_edges[face_first_loops[face]];\n\t\t\t\tk3d::uint_t edge = first_edge;\n\t\t\t\tk3d::xml::element face_xml(\"face\");\n\t\t\t\tfor(k3d::uint_t i = 1; i < 4; i++) {\n\t\t\t\t\tsstream << 'v' << i;\n\t\t\t\t\tstd::string name(sstream.str());\n\t\t\t\t\tsstream.str(\"\");\n\t\t\t\t\tsstream << vertex_points[edge];\n\t\t\t\t\tstd::string value(sstream.str());\n\t\t\t\t\tsstream.str(\"\");\n\t\t\t\t\tface_xml.append(k3d::xml::attribute(name, value));\n\t\t\t\t\tedge = clockwise_edges[edge];\n\t\t\t\t}\n\t\t\t\tfaces.append(face_xml);\n\t\t\t}\n\t\t\t\n\t\t\tsubmesh.append(faces);\n\t\t\tsubmeshes.append(submesh);\n\t\t\ttop.append(submeshes);\n\t\t\t\n\t\t}\n\t\t\n\t\tOutput << k3d::xml::declaration() <<  top;\n\t}\n};\n\nk3d::iplugin_factory& mesh_writer_factory()\n{\n\treturn mesh_writer::get_factory();\n}\n\n} // namespace io\n\n} // namespace ogre\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/ogre_io/module.cpp",
    "content": "#include <k3dsdk/module.h>\n\nnamespace module\n{\n\t\nnamespace ogre\n{\n\nnamespace io\n{\n\t\nextern k3d::iplugin_factory& mesh_writer_factory();\n\n} // namespace io\n\n} // namespace ogre\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ogre::io::mesh_writer_factory());\nK3D_MODULE_END\n"
  },
  {
    "path": "modules/openexr_io/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_OPENEXR_INCLUDE_DIRS})\nLINK_DIRECTORIES(${K3D_OPENEXR_LIB_DIRS})\n\nK3D_BUILD_MODULE(k3d-openexr-io)\nK3D_CREATE_MODULE_PROXY(k3d-openexr-io)\n\nTARGET_LINK_LIBRARIES(k3d-openexr-io ${K3D_OPENEXR_LIBS})\n\n"
  },
  {
    "path": "modules/openexr_io/bitmap_importer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/ibitmap_importer.h>\n#include <k3dsdk/path.h>\n\n#include <ImfInputFile.h>\n\nnamespace module\n{\n\nnamespace openexr\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_importer\n\nclass bitmap_importer :\n\tpublic k3d::ibitmap_importer\n{\npublic:\n\tbitmap_importer()\n\t{\n\t}\n\n\tbool read_file(const k3d::filesystem::path& File, k3d::bitmap& Bitmap)\n\t{\n\t\ttry \n\t\t{\n\t\t\tk3d::log() << info << \"Reading \" << File.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\n \t\t\tImf::InputFile file(File.native_filesystem_string().c_str());\n\n \t\t\tImath::Box2i dw = file.header().dataWindow();\n   \t\t\tconst int width  = dw.max.x - dw.min.x + 1;\n   \t\t\tconst int height = dw.max.y - dw.min.y + 1;\n\t\n\t\t\tBitmap.recreate(width, height);\n\n  \t\t\tImf::FrameBuffer frameBuffer;\n\n\t\t\tframeBuffer.insert(\"R\",\n\t\t\t\t\t   Imf::Slice(Imf::HALF,\n\t\t\t\t\t\t      (char *) &view(Bitmap)[0] + 0 * sizeof(half),\n\t\t\t\t\t\t      sizeof(half) * 4,\n\t\t\t\t\t\t      sizeof(half) * 4 * width,\n\t\t\t\t\t\t      1, 1,\n\t\t\t\t\t\t      0.0));\n\t\t\t\n\t\t\tframeBuffer.insert(\"G\",\n\t\t\t\t\t   Imf::Slice(Imf::HALF,\n\t\t\t\t\t\t      (char *) &view(Bitmap)[0] + 1 * sizeof(half),\n\t\t\t\t\t\t      sizeof(half) * 4,\n\t\t\t\t\t\t      sizeof(half) * 4 * width,\n\t\t\t\t\t\t      1, 1,\n\t\t\t\t\t\t      0.0));\n\t\t\t\n\t\t\tframeBuffer.insert(\"B\",\n\t\t\t\t\t   Imf::Slice(Imf::HALF,\n\t\t\t\t\t\t      (char *) &view(Bitmap)[0] + 2 * sizeof(half),\n\t\t\t\t\t\t      sizeof(half) * 4,\n\t\t\t\t\t\t      sizeof(half) * 4 * width,\n\t\t\t\t\t\t      1, 1,\n\t\t\t\t\t\t      0.0));\n\t\t\t\n\t\t\tframeBuffer.insert(\"A\",\n\t\t\t\t\t   Imf::Slice(Imf::HALF,\n\t\t\t\t\t\t      (char *) &view(Bitmap)[0] + 3 * sizeof(half),\n\t\t\t\t\t\t      sizeof(half) * 4,\n\t\t\t\t\t\t      sizeof(half) * 4 * width,\n\t\t\t\t\t\t      1, 1,\n\t\t\t\t\t\t      0.0));\n\n\t\t\tfile.setFrameBuffer(frameBuffer);\n \t\t\tfile.readPixels(dw.min.y, dw.max.y);\n\t\t\treturn true;\n\t\t}\n\t\tcatch(const std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t\treturn false;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<bitmap_importer,\n\t\t\tk3d::interface_list<k3d::ibitmap_importer> > factory(\n\t\t\t\tk3d::uuid(0xdb5255b7, 0xb9c243a4, 0x81eb2645, 0x1d80ecac),\n\t\t\t\t\"EXRBitmapImporter\",\n\t\t\t\t_(\"OpenEXR (*.exr)\"),\n\t\t\t\t\"Bitmap BitmapImporter\");\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_importer_factory\n\nk3d::iplugin_factory& bitmap_importer_factory()\n{\n\treturn bitmap_importer::get_factory();\n}\n\n} // namespace io\n\n} // namespace openexr\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/openexr_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace openexr\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& bitmap_importer_factory();\n\n} // namespace io\n\n} // namespace openexr\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::openexr::io::bitmap_importer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/opengl/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-opengl)\nK3D_CREATE_MODULE_PROXY(k3d-opengl)\nTARGET_LINK_LIBRARIES(k3d-opengl k3dsdk-opengl)\n"
  },
  {
    "path": "modules/opengl/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nextern k3d::iplugin_factory& render_engine_factory();\nextern k3d::iplugin_factory& version_check_factory();\n\n} // namespace opengl\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::opengl::render_engine_factory());\n\tRegistry.register_factory(module::opengl::version_check_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/opengl/render_engine.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/icrop_window.h>\n#include <k3dsdk/ilight_gl.h>\n#include <k3dsdk/inode_selection.h>\n#include <k3dsdk/iparentable.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/irender_viewport_gl.h>\n#include <k3dsdk/irenderable_gl.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/property_group_collection.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/render_state_gl.h>\n#include <k3dsdk/selection_state_gl.h>\n#include <k3dsdk/time_source.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <iostream>\n\n#ifdef\tWIN32\n#ifdef\tnear\n#undef\tnear\n#endif\t//near\n#ifdef\tfar\n#undef\tfar\n#endif\t//far\n#endif\t//WIN32\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace detail\n{\n\n/// Functor object for initializing light sources during OpenGL drawing\nclass light_setup\n{\npublic:\n\tlight_setup() :\n\t\tm_light_number(0)\n\t{\n\t}\n\n\tvoid operator()(k3d::inode* const Object)\n\t{\n\t\tk3d::gl::ilight* const light = dynamic_cast<k3d::gl::ilight*>(Object);\n\t\tif(light)\n\t\t\tlight->setup_gl_light(++m_light_number);\n\t}\n\nprivate:\n\tunsigned long m_light_number;\n};\n\n/// Sorts drawables so they can be rendered.  Currently, drawables are sorted by-layer, but\n/// this could be extended to to sort based on selection-state, depth (for transparency), etc.\nstruct render_order\n{\n\tbool operator()(k3d::gl::irenderable* const A, k3d::gl::irenderable* const B) const\n\t{\n\t\treturn A->gl_layer() < B->gl_layer();\n\t}\n};\n\n/// Functor for drawing objects during OpenGL drawing\nclass draw\n{\npublic:\n\tdraw(k3d::gl::render_state& State, k3d::inode_selection* NodeSelection) :\n\t\tm_state(State),\n\t\tm_node_selection(NodeSelection)\n\t{\n\t}\n\n\tvoid operator()(k3d::gl::irenderable* const Renderable)\n\t{\n\t\tif(m_node_selection)\n\t\t{\n\t\t\tm_state.node_selection = m_node_selection->selection_weight(*dynamic_cast<k3d::inode*>(Renderable));\n\t\t\tk3d::node* parent = 0;\n\t\t\tk3d::iparentable* const parentable = dynamic_cast<k3d::iparentable*>(Renderable);\n\t\t\tif(parentable)\n\t\t\t\tk3d::node* parent = dynamic_cast<k3d::node*>(k3d::property::pipeline_value<k3d::inode*>(parentable->parent()));\n\t\t\tm_state.parent_selection = parent ? m_node_selection->selection_weight(*parent) : 0.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_state.node_selection = 0.0;\n\t\t\tm_state.parent_selection = 0.0;\n\t\t}\n\t\t\n\t\tRenderable->gl_draw(m_state);\n\t}\n\nprivate:\n\tk3d::gl::render_state& m_state; // Note: no longer const, so selection weights can be set\n\tk3d::inode_selection* m_node_selection;\n};\n\n/// Functor for selecting objects during OpenGL drawing\nclass draw_selection\n{\npublic:\n\tdraw_selection(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState, k3d::inode_selection* NodeSelection) :\n\t\tm_state(State),\n\t\tm_selection_state(SelectState),\n\t\tm_node_selection(NodeSelection)\n\t{\n\t}\n\n\tvoid operator()(k3d::gl::irenderable* const Renderable)\n\t{\n\t\tk3d::double_t selection_weight = 0.0;\n\t\tif(m_node_selection)\n\t\t\tselection_weight = m_node_selection->selection_weight(*dynamic_cast<k3d::inode*>(Renderable));\n\t\tif(m_selection_state.exclude_unselected_nodes && !selection_weight)\n\t\t\treturn;\n\t\tRenderable->gl_select(m_state, m_selection_state);\n\t}\n\nprivate:\n\tconst k3d::gl::render_state& m_state;\n\tconst k3d::gl::selection_state& m_selection_state;\n\tk3d::inode_selection* m_node_selection;\n};\n\nvoid gl_reset(const k3d::color BackgroundColor, const double PointSize)\n{\n\t// Clear background ...\n\tglClearDepth(1.0);\n\tglClearColor(\n\t\tstatic_cast<GLfloat>(BackgroundColor.red),\n\t\tstatic_cast<GLfloat>(BackgroundColor.green),\n\t\tstatic_cast<GLfloat>(BackgroundColor.blue),\n\t\t0.0f);\n\tglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n\t// Set point size ...\n\tglPointSize(static_cast<GLfloat>(PointSize));\n\n\t// Setup stippling for path normals / bezier control lines ...\n\tglLineStipple(2, 0xaaaa);\n\tglDisable(GL_LINE_STIPPLE);\n\tglDisable(GL_POLYGON_STIPPLE);\n}\n\nvoid gl_setup_textures()\n{\n\t// Setup texture matrix\n\tglMatrixMode(GL_TEXTURE);\n\tglLoadIdentity();\n}\n\nvoid gl_draw_2d_widgets(k3d::icamera& Camera, const k3d::rectangle& WindowRect, const k3d::rectangle& CameraRect, const bool DrawFrustum, const bool DrawCropWindow, const bool DrawSafeZone, const bool DrawAimPoint, k3d::idocument& Document)\n{\n\t// Set ourselves up to draw 2D overlays ...\n\tglMatrixMode(GL_PROJECTION);\n\tglLoadIdentity();\n\tglOrtho(WindowRect.x1, WindowRect.x2, WindowRect.y2, WindowRect.y1, -1, 1);\n\n\tglMatrixMode(GL_MODELVIEW);\n\tglLoadIdentity();\n\n\tif(DrawFrustum)\n\t{\n\t\tglColor4d(0, 0, 0, 1);\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglBegin(GL_LINE_LOOP);\n\t\t\tglVertex2d(CameraRect.x1, CameraRect.y1);\n\t\t\tglVertex2d(CameraRect.x2, CameraRect.y1);\n\t\t\tglVertex2d(CameraRect.x2, CameraRect.y2);\n\t\t\tglVertex2d(CameraRect.x1, CameraRect.y2);\n\t\tglEnd();\n\t}\n\n\t// Optionally show the extents of the crop window\n\tif(DrawCropWindow)\n\t{\n\t\tconst double left = k3d::property::pipeline_value<double>(Camera.crop_window().crop_left());\n\t\tconst double right = k3d::property::pipeline_value<double>(Camera.crop_window().crop_right());\n\t\tconst double bottom = k3d::property::pipeline_value<double>(Camera.crop_window().crop_bottom());\n\t\tconst double top = k3d::property::pipeline_value<double>(Camera.crop_window().crop_top());\n\n\t\tglColor4d(0, 0, 0.5, 1);\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglBegin(GL_LINE_LOOP);\n\t\t\tglVertex2d(k3d::mix(CameraRect.x1, CameraRect.x2, left), k3d::mix(CameraRect.y1, CameraRect.y2, top));\n\t\t\tglVertex2d(k3d::mix(CameraRect.x1, CameraRect.x2, right), k3d::mix(CameraRect.y1, CameraRect.y2, top));\n\t\t\tglVertex2d(k3d::mix(CameraRect.x1, CameraRect.x2, right), k3d::mix(CameraRect.y1, CameraRect.y2, bottom));\n\t\t\tglVertex2d(k3d::mix(CameraRect.x1, CameraRect.x2, left), k3d::mix(CameraRect.y1, CameraRect.y2, bottom));\n\t\tglEnd();\n\t}\n\n\t// Optionally draw a safe zone for video ...\n\tif(DrawSafeZone)\n\t{\n\t\tglColor4d(0, 0, 0, 1);\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglBegin(GL_LINE_LOOP);\n\t\t\tglVertex2d(CameraRect.x1 * 0.9, CameraRect.y1 * 0.9);\n\t\t\tglVertex2d(CameraRect.x2 * 0.9, CameraRect.y1 * 0.9);\n\t\t\tglVertex2d(CameraRect.x2 * 0.9, CameraRect.y2 * 0.9);\n\t\t\tglVertex2d(CameraRect.x1 * 0.9, CameraRect.y2 * 0.9);\n\t\tglEnd();\n\t}\n\n\t// Optionally draw the \"aimpoint\" (crosshairs aligned with the center of the viewport)\n\tif(DrawAimPoint)\n\t{\n\t\tglColor4d(0, 0, 0, 1);\n\t\tglDisable(GL_LIGHTING);\n\n\t\tglBegin(GL_LINES);\n\t\t\tglVertex2d(CameraRect.x1 * 0.05, 0);\n\t\t\tglVertex2d(CameraRect.x2 * 0.05, 0);\n\t\t\tglVertex2d(0, CameraRect.y1 * 0.05);\n\t\t\tglVertex2d(0, CameraRect.y2 * 0.05);\n\t\tglEnd();\n\t}\n}\n\nvoid gl_setup_lights(const bool Headlight)\n{\n\t// Setup lights ...\n\tglEnable(GL_LIGHTING);\n\tglLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);\n\tglLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);\n\n\t// Make sure all lights are turned off initially ...\n\tGLint maxlights = 0;\n\tglGetIntegerv(GL_MAX_LIGHTS, &maxlights);\n\tfor(GLint i = 0; i < maxlights; ++i)\n\t\tglDisable(GLenum(GL_LIGHT0 + i));\n\n\t// Setup the headlight ...\n\tif(Headlight)\n\t{\n\t\t// Enable the light ...\n\t\tglEnable(GL_LIGHT0);\n\n\t\t// Setup color ...\n\t\tconst GLfloat color[4] = { 1.0f, 1.0f, 1.0f, 1.0f };\n\t\tglLightfv(GL_LIGHT0, GL_AMBIENT, color);\n\t\tglLightfv(GL_LIGHT0, GL_DIFFUSE, color);\n\t\tglLightfv(GL_LIGHT0, GL_SPECULAR, color);\n\n\t\t// Setup light direction ...\n\t\tconst GLfloat position[4] = { 0.0f, 0.0f, 1.0f, 0.0f };\n\t\tglLightfv(GL_LIGHT0, GL_POSITION, position);\n\t}\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// render_engine\n\nclass render_engine :\n\tpublic k3d::node,\n\tpublic k3d::gl::irender_viewport,\n\tpublic k3d::property_group_collection\n{\n\ttypedef k3d::node base;\n\npublic:\n\trender_engine(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_point_size(init_owner(*this) + init_name(\"point_size\") + init_label(_(\"Point Size\")) + init_description(_(\"OpengGL point size\")) + init_value(4) + init_constraint(constraint::minimum<double>(0.0)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_background_color(init_owner(*this) + init_name(\"background_color\") + init_label(_(\"Background Color\")) + init_description(_(\"Background color\")) + init_value(k3d::color(0.8, 0.8, 0.8))),\n\t\tm_fog(init_owner(*this) + init_name(\"fog\") + init_label(_(\"Fog\")) + init_description(_(\"Fog\")) + init_value(false)),\n\t\tm_fog_near(init_owner(*this) + init_name(\"fog_near\") + init_label(_(\"Fog Near\")) + init_description(_(\"Fog near distance\")) + init_value(0.0) + init_constraint(constraint::minimum<double>(0.0)) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_fog_far(init_owner(*this) + init_name(\"fog_far\") + init_label(_(\"Fog Far\")) + init_description(_(\"Fog far distance\")) + init_value(100.0) + init_constraint(constraint::minimum<double>(0.0)) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_headlight(init_owner(*this) + init_name(\"headlight\") + init_label(_(\"Headlight\")) + init_description(_(\"Headlight\")) + init_value(true)),\n\t\tm_show_lights(init_owner(*this) + init_name(\"show_lights\") + init_label(_(\"Show Lights\")) + init_description(_(\"Show lights (on/off)\")) + init_value(false)),\n\t\tm_draw_two_sided(init_owner(*this) + init_name(\"draw_two_sided\") + init_label(_(\"Draw Two Sided\")) + init_description(_(\"Draw two sided\")) + init_value(true)),\n\t\tm_draw_safe_zone(init_owner(*this) + init_name(\"draw_safe_zone\") + init_label(_(\"Draw Safe Zone\")) + init_description(_(\"Draw Safe Zone\")) + init_value(false)),\n\t\tm_draw_aimpoint(init_owner(*this) + init_name(\"draw_aimpoint\") + init_label(_(\"Draw Aim Point\")) + init_description(_(\"Draw center screen cross\")) + init_value(true)),\n\t\tm_draw_crop_window(init_owner(*this) + init_name(\"draw_crop_window\") + init_label(_(\"Draw Crop Window\")) + init_description(_(\"Draw bounding rectangle for output rendering\")) + init_value(true)),\n\t\tm_draw_frustum(init_owner(*this) + init_name(\"draw_frustum\") + init_label(_(\"Draw Frustum\")) + init_description(_(\"Draw Camera Frustum\")) + init_value(true)),\n\t\tm_node_selection(init_owner(*this) + init_name(\"node_selection\") + init_label(_(\"Node Selection\")) + init_description(_(\"Node storing the currently selected nodes\")) + init_value(static_cast<k3d::inode_selection*>(0)))\n\t{\n\t\tk3d::iproperty_group_collection::group visibility_group(\"Visibility\");\n\t\tvisibility_group.properties.push_back(&static_cast<k3d::iproperty&>(m_draw_two_sided));\n\t\tvisibility_group.properties.push_back(&static_cast<k3d::iproperty&>(m_draw_safe_zone));\n\t\tvisibility_group.properties.push_back(&static_cast<k3d::iproperty&>(m_draw_aimpoint));\n\t\tvisibility_group.properties.push_back(&static_cast<k3d::iproperty&>(m_draw_crop_window));\n\t\tvisibility_group.properties.push_back(&static_cast<k3d::iproperty&>(m_draw_frustum));\n\n\t\tregister_property_group(visibility_group);\n\t\t\n\t\tm_point_size.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_background_color.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_fog.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_fog_near.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_fog_far.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_headlight.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_show_lights.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_draw_two_sided.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_draw_safe_zone.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_draw_aimpoint.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_draw_crop_window.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_draw_frustum.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\tm_node_selection.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_node_selection_changed));\n\t}\n\t\n\t~render_engine()\n\t{\n\t\tm_selection_changed_connection.disconnect();\n\t}\n\n\tvoid on_redraw(k3d::iunknown*)\n\t{\n\t\tm_redraw_request_signal.emit(k3d::gl::irender_viewport::ASYNCHRONOUS);\n\t}\n\t\n\tvoid on_node_selection_changed(k3d::iunknown*)\n\t{\n\t\tk3d::inode_selection* node_selection = m_node_selection.pipeline_value();\n\t\tif(node_selection)\n\t\t{\n\t\t\tm_selection_changed_connection = node_selection->selection_changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_redraw));\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<render_engine > factory(\n\t\t\tk3d::classes::OpenGLEngine(),\n\t\t\t\"OpenGLEngine\",\n\t\t\t_(\"OpenGL Render Engine\"),\n\t\t\t\"OpenGL RenderEngine\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\n\tbool get_ndc(k3d::icamera& Camera, const unsigned long PixelWidth, const unsigned long PixelHeight, k3d::rectangle& CameraRect, k3d::rectangle& WindowRect)\n\t{\n\t\treturn_val_if_fail(PixelWidth && PixelHeight, false);\n\n\t\tdouble near = 0;\n\t\tdouble far = 0;\n\t\tbool orthographic = false;\n\t\tk3d::gl::calculate_projection(Camera, PixelWidth, PixelHeight, WindowRect, CameraRect, near, far, orthographic);\n\n\t\treturn true;\n\t}\n\n\tvoid render_viewport(k3d::icamera& Camera, const unsigned long PixelWidth, const unsigned long PixelHeight, GLdouble ViewMatrix[16], GLdouble ProjectionMatrix[16], GLint Viewport[4])\n\t{\n\t\tk3d::ipipeline_profiler::profile profile(document().pipeline_profiler(), *this, \"Render Viewport\");\n\t\tk3d::gl::render_state state(Camera);\n\t\tk3d::rectangle unused(0, 0, 0, 0);\n\t\tif(!draw_scene(Camera, PixelWidth, PixelHeight, ViewMatrix, ProjectionMatrix, Viewport, false, unused, state))\n\t\t\treturn;\n\n\t\t// Setup fog ...\n\t\tif(m_fog.pipeline_value())\n\t\t{\n\t\t\tconst k3d::color background_color(m_background_color.pipeline_value());\n\n\t\t\tGLfloat fogdata[4];\n\t\t\tfogdata[0] = background_color.red;\n\t\t\tfogdata[1] = background_color.green;\n\t\t\tfogdata[2] = background_color.blue;\n\t\t\tfogdata[3] = 1.0f;\n\n\t\t\tglFogfv(GL_FOG_COLOR, fogdata);\n\t\t\tglFogf(GL_FOG_START, static_cast<GLfloat>(m_fog_near.pipeline_value()));\n\t\t\tglFogf(GL_FOG_END, static_cast<GLfloat>(m_fog_far.pipeline_value()));\n\t\t\tglHint(GL_FOG_HINT, GL_NICEST);\n\t\t\tglFogi(GL_FOG_MODE, GL_LINEAR);\n\t\t\tglEnable(GL_FOG);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tglDisable(GL_FOG);\n\t\t}\n\n\t\tif(m_show_lights.pipeline_value())\n\t\t\tstd::for_each(document().nodes().collection().begin(), document().nodes().collection().end(), detail::light_setup());\n\n\t\tk3d::inode_selection* const node_selection = m_node_selection.pipeline_value();\n\t\tstd::vector<k3d::gl::irenderable*> renderable_nodes = k3d::node::lookup<k3d::gl::irenderable>(document());\n\t\tstd::sort(renderable_nodes.begin(), renderable_nodes.end(), detail::render_order());\n\t\tstd::for_each(renderable_nodes.begin(), renderable_nodes.end(), detail::draw(state, node_selection));\n\n/* I really hate to lose this feedback, but the GLU NURBS routines generate large numbers of errors, which ruins its utility :-(\n\t\tfor(GLenum gl_error = glGetError(); gl_error != GL_NO_ERROR; gl_error = glGetError())\n\t\t\tk3d::log() << error << \"OpenGL error: \" << reinterpret_cast<const char*>(gluErrorString(gl_error)) << std::endl;\n*/\n\t}\n\n\tvoid render_viewport_selection(const k3d::gl::selection_state& SelectState, k3d::icamera& Camera, const unsigned long PixelWidth, const unsigned long PixelHeight, const k3d::rectangle& Region, GLdouble ViewMatrix[16], GLdouble ProjectionMatrix[16], GLint Viewport[4])\n\t{\n\t\tk3d::gl::render_state state(Camera);\n\t\tif(!draw_scene(Camera, PixelWidth, PixelHeight, ViewMatrix, ProjectionMatrix, Viewport, true, Region, state))\n\t\t\treturn;\n\n\t\tglClear(GL_DEPTH_BUFFER_BIT);\n\t\tglDisable(GL_LIGHTING);\n\n\t\tk3d::inode_selection* const node_selection = m_node_selection.pipeline_value();\n\t\tstd::vector<k3d::gl::irenderable*> renderable_nodes = k3d::node::lookup<k3d::gl::irenderable>(document());\n\t\tstd::sort(renderable_nodes.begin(), renderable_nodes.end(), detail::render_order());\n\t\tstd::for_each(renderable_nodes.begin(), renderable_nodes.end(), detail::draw_selection(state, SelectState, node_selection));\n\t}\n\n\tredraw_request_signal_t& redraw_request_signal()\n\t{\n\t\treturn m_redraw_request_signal;\n\t}\n\nprivate:\n\tbool draw_scene(k3d::icamera& Camera, const unsigned long PixelWidth, const unsigned long PixelHeight, GLdouble ViewMatrix[16], GLdouble ProjectionMatrix[16], GLint Viewport[4], const bool Select, const k3d::rectangle& SelectionRegion, k3d::gl::render_state& RenderState)\n\t{\n\t\t// If width or height are zero, we're done ...\n\t\tif(!PixelWidth || !PixelHeight)\n\t\t\treturn false;\n\n\t\tif(!Select)\n\t\t\tdetail::gl_reset(m_background_color.pipeline_value(), m_point_size.pipeline_value());\n\n\t\t// Setup culling ...\n\t\tglFrontFace(GL_CW);\n\t\tglCullFace(GL_BACK);\n\n\t\t// Setup dithering ...\n\t\tglDisable(GL_DITHER);\n\n\t\t// Setup antialiasing ...\n\t\tglDisable(GL_LINE_SMOOTH);\n\t\tglDisable(GL_BLEND);\n\t\tglLineWidth(1.0f);\n\n\t\t// Disable stencil ...\n\t\tglDisable(GL_STENCIL_TEST);\n\t\tglStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);\n\t\tglStencilMask(0x00);\n\n\t\t// Set Z buffer options ...\n\t\tglDepthMask(GL_TRUE);\n\t\tglDepthFunc(GL_LESS);\n\t\tglEnable(GL_DEPTH_TEST);\n\n\t\t// Normalization ...\n\t\tglShadeModel(Select ? GL_FLAT : GL_SMOOTH);\n\t\tglEnable(GL_NORMALIZE);\n\t\tglEnable(GL_AUTO_NORMAL);\n\n\t\t// Prepare texture options ...\n\t\tglDisable(GL_TEXTURE_2D);\n\n\t\tif(!Select)\n\t\t\tdetail::gl_setup_textures();\n\n\t\t// Setup viewport ...\n\t\tglViewport(0, 0, PixelWidth, PixelHeight);\n\t\tglGetIntegerv(GL_VIEWPORT, static_cast<GLint*>(RenderState.gl_viewport));\n\t\tglGetIntegerv(GL_VIEWPORT, Viewport);\n\n\t\tk3d::rectangle window_rect(0, 0, 0, 0);\n\t\tk3d::rectangle camera_rect(0, 0, 0, 0);\n\t\tdouble near = 0;\n\t\tdouble far = 0;\n\t\tbool orthographic = false;\n\t\tk3d::gl::calculate_projection(Camera, PixelWidth, PixelHeight, window_rect, camera_rect, near, far, orthographic);\n\n\t\tif(!Select)\n\t\t\tdetail::gl_draw_2d_widgets(Camera, window_rect, camera_rect, m_draw_frustum.pipeline_value(), m_draw_crop_window.pipeline_value(), m_draw_safe_zone.pipeline_value(), m_draw_aimpoint.pipeline_value(), document());\n\n\t\t// Setup projection ...\n\t\tglMatrixMode(GL_PROJECTION);\n\t\tglLoadIdentity();\n\t\tif(orthographic)\n\t\t{\n\t\t\tconst k3d::matrix4 transform_matrix = k3d::property::pipeline_value<k3d::matrix4>(Camera.transformation().matrix_source_output());\n\t\t\tconst k3d::point3 world_position = transform_matrix * k3d::point3(0, 0, 0);\n\t\t\tconst k3d::point3 world_target = boost::any_cast<k3d::point3>(Camera.world_target().property_internal_value());\n\t\t\tconst double distance = k3d::distance(world_position, world_target);\n\n\t\t\tconst double window_aspect = (window_rect.x2 - window_rect.x1) / (window_rect.y1 - window_rect.y2);\n\t\t\tconst double window_tan_fov = (window_rect.y1 - window_rect.y2) * 0.5 / near;\n\t\t\tconst double window_size = distance * window_tan_fov;\n\n\t\t\tRenderState.orthographic = true;\n\t\t\tRenderState.draw_two_sided = m_draw_two_sided.pipeline_value();\n\t\t\t\n\t\t\tRenderState.gl_window_frustum_left = -window_size * window_aspect;\n\t\t\tRenderState.gl_window_frustum_right = window_size * window_aspect;\n\t\t\tRenderState.gl_window_frustum_top = window_size;\n\t\t\tRenderState.gl_window_frustum_bottom = -window_size;\n\t\t\tRenderState.gl_window_frustum_near = near;\n\t\t\tRenderState.gl_window_frustum_far = far;\n\t\t\t\n\t\t\tconst double camera_aspect = (camera_rect.x2 - camera_rect.x1) / (camera_rect.y1 - camera_rect.y2);\n\n\t\t\tif(camera_aspect > window_aspect)\n\t\t\t{\n\t\t\t\tRenderState.gl_camera_frustum_left = RenderState.gl_window_frustum_left;\n\t\t\t\tRenderState.gl_camera_frustum_right = RenderState.gl_window_frustum_right;\n\t\t\t\tRenderState.gl_camera_frustum_top = RenderState.gl_window_frustum_top * window_aspect / camera_aspect;\n\t\t\t\tRenderState.gl_camera_frustum_bottom = RenderState.gl_window_frustum_bottom * window_aspect / camera_aspect;\n\t\t\t\tRenderState.gl_camera_frustum_near = near;\n\t\t\t\tRenderState.gl_camera_frustum_far = far;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRenderState.gl_camera_frustum_left = RenderState.gl_window_frustum_left * camera_aspect / window_aspect;\n\t\t\t\tRenderState.gl_camera_frustum_right = RenderState.gl_window_frustum_right * camera_aspect / window_aspect;\n\t\t\t\tRenderState.gl_camera_frustum_top = RenderState.gl_window_frustum_top;\n\t\t\t\tRenderState.gl_camera_frustum_bottom = RenderState.gl_window_frustum_bottom;\n\t\t\t\tRenderState.gl_camera_frustum_near = near;\n\t\t\t\tRenderState.gl_camera_frustum_far = far;\n\t\t\t}\n\n\t\t\tglOrtho(-window_size * window_aspect, window_size * window_aspect, -window_size, window_size, near, far);\n\n\t\t\tif(Select)\n\t\t\t{\n\t\t\t\t// Setup the projection matrix with the pick matrix ...\n\t\t\t\tglLoadIdentity();\n\n\t\t\t\tconst double width  = SelectionRegion.width();\n\t\t\t\tconst double height = SelectionRegion.height();\n\t\t\t\tgluPickMatrix(SelectionRegion.x1 + (width * 0.5), RenderState.gl_viewport[3] - (SelectionRegion.y1 + (height * 0.5)), width, height, static_cast<GLint*>(RenderState.gl_viewport));\n\n\t\t\t\tglOrtho(-window_size * window_aspect, window_size * window_aspect, -window_size, window_size, near, far);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRenderState.orthographic = false;\n\t\t\t\n\t\t\tRenderState.gl_window_frustum_left = window_rect.x1;\n\t\t\tRenderState.gl_window_frustum_right = window_rect.x2;\n\t\t\tRenderState.gl_window_frustum_top = window_rect.y1;\n\t\t\tRenderState.gl_window_frustum_bottom = window_rect.y2;\n\t\t\tRenderState.gl_window_frustum_near = near;\n\t\t\tRenderState.gl_window_frustum_far = far;\n\n\t\t\tRenderState.gl_camera_frustum_left = camera_rect.x1;\n\t\t\tRenderState.gl_camera_frustum_right = camera_rect.x2;\n\t\t\tRenderState.gl_camera_frustum_top = camera_rect.y1;\n\t\t\tRenderState.gl_camera_frustum_bottom = camera_rect.y2;\n\t\t\tRenderState.gl_camera_frustum_near = near;\n\t\t\tRenderState.gl_camera_frustum_far = far;\n\n\t\t\tglFrustum(window_rect.x1, window_rect.x2, window_rect.y2, window_rect.y1, near, far);\n\n\t\t\tif(Select)\n\t\t\t{\n\t\t\t\t// Setup the projection matrix with the pick matrix ...\n\t\t\t\tglLoadIdentity();\n\n\t\t\t\tconst double width  = SelectionRegion.width();\n\t\t\t\tconst double height = SelectionRegion.height();\n\t\t\t\tgluPickMatrix(SelectionRegion.x1 + (width * 0.5), RenderState.gl_viewport[3] - (SelectionRegion.y1 + (height * 0.5)), width, height, static_cast<GLint*>(RenderState.gl_viewport));\n\n\t\t\t\tglFrustum(window_rect.x1, window_rect.x2, window_rect.y2, window_rect.y1, near, far);\n\t\t\t}\n\t\t}\n\n\t\tglGetFloatv(GL_PROJECTION_MATRIX, RenderState.gl_projection_matrix);\n\t\tglGetDoublev(GL_PROJECTION_MATRIX, ProjectionMatrix);\n\n\t\t// Setup modelview matrix\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglLoadIdentity();\n\n\t\tif(!Select)\n\t\t\tdetail::gl_setup_lights(m_headlight.pipeline_value());\n\n\t\tconst k3d::matrix4 transform_matrix = k3d::property::pipeline_value<k3d::matrix4>(Camera.transformation().matrix_source_output());\n\t\tconst k3d::angle_axis orientation(k3d::euler_angles(transform_matrix, k3d::euler_angles::ZXYstatic));\n\t\tconst k3d::point3 position(k3d::position(transform_matrix));\n\n\t\tglScaled(1.0, 1.0, -1.0);\n\t\tglRotated(-k3d::degrees(orientation.angle), orientation.axis[0], orientation.axis[1], orientation.axis[2]);\n\t\tglTranslated(-position[0], -position[1], -position[2]);\n\n\t\tglGetDoublev(GL_MODELVIEW_MATRIX, ViewMatrix);\n\n\t\treturn true;\n\t}\n\n\tredraw_request_signal_t m_redraw_request_signal;\n\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_point_size;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_background_color;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_fog;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_fog_near;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_fog_far;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_headlight;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_show_lights;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_two_sided;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_safe_zone;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_aimpoint;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_crop_window;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_frustum;\n\tk3d_data(k3d::inode_selection*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::with_undo, k3d::data::node_storage, k3d::data::no_constraint, k3d::data::node_property, k3d::data::node_serialization) m_node_selection;\n\tsigc::connection m_selection_changed_connection;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// render_engine_factory\n\nk3d::iplugin_factory& render_engine_factory()\n{\n\treturn render_engine::get_factory();\n}\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/opengl/version_check.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/gl/context.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/user_interface.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/assign/list_of.hpp>\n#include <boost/lexical_cast.hpp>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nclass version_check : public k3d::iunknown\n{\npublic:\n\tversion_check()\n\t{\n\t\tif(!glewGetContext())\n\t\t{\n\t\t\tk3d::log() << warning << \"No context defined to determine Mesa version\" << std::endl;\n\t\t\treturn;\n\t\t}\n\t\n\t\tconst k3d::string_t version(reinterpret_cast<const char*>(glGetString(GL_VERSION)));\n\t\tconst k3d::string_t vendor(reinterpret_cast<const char*>(glGetString(GL_VENDOR)));\n\t\tk3d::log() << info << \"OpenGL version: \" << version << \", vendor: \" << vendor << std::endl;\n\n\t\ttry\n\t\t{\n\t\t\tif(vendor == \"Tungsten Graphics, Inc\" || vendor == \"Mesa Project\")\n\t\t\t{\n\t\t\t\tstd::vector<k3d::string_t> tokens;\n\t\t\t\tboost::split(tokens, version, boost::is_any_of(\" \"));\n\t\t\t\tif(tokens.size() > 2 && tokens[1] == \"Mesa\")\n\t\t\t\t{\n\t\t\t\t\tconst k3d::string_t version_number = tokens[2];\n\t\t\t\t\tstd::vector<k3d::string_t> bad_tokens; // Strip off any trailing '-devel' and so on\n\t\t\t\t\tboost::split(bad_tokens, version_number, boost::is_any_of(\"-\"));\n\t\t\t\t\tstd::vector<k3d::string_t> version_tokens;\n\t\t\t\t\tboost::split(version_tokens, bad_tokens[0], boost::is_any_of(\".\"));\n\t\t\t\t\tif(version_tokens.size() > 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t min_major = 7; // minimal major version\n\t\t\t\t\t\tconst k3d::uint_t min_minor = 5; // minimal minor version\n\t\t\t\t\t\tconst k3d::uint_t min_patch = 1; // minimal patch version\n\t\t\t\t\t\tconst k3d::uint_t major = boost::lexical_cast<k3d::uint_t>(version_tokens[0]);\n\t\t\t\t\t\tconst k3d::uint_t minor = boost::lexical_cast<k3d::uint_t>(version_tokens[1]);\n\t\t\t\t\t\tif(major < min_major || (major == min_major && minor < min_minor) || (major == min_major && minor == min_minor && (version_tokens.size() == 2 || boost::lexical_cast<k3d::uint_t>(version_tokens[2]) < min_patch)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::user_interface().nag_message(\n\t\t\t\t\t\t\t\t\"MesaVersionCheck/1\",\n\t\t\t\t\t\t\t\tk3d::ustring::from_utf8(k3d::string_cast(boost::format(_(\"Your OpenGL version is %1%.\")) % version)),\n\t\t\t\t\t\t\t\tk3d::ustring::from_utf8(_(\"On your platform, Mesa versions earlier than 7.5.1 are known to cause problems with face selection. If you experience this, please upgrade your Mesa library. See http://bugs.freedesktop.org/show_bug.cgi?id=16866 for detailed information.\")));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch(std::runtime_error& E)\n\t\t{\n\t\t\tk3d::log() << warning << \"error parsing mesa version: \" << E.what() << std::endl;\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<version_check,\n\t\t\tk3d::interface_list<k3d::iunknown> > factory(\n\t\t\t\tk3d::uuid(0xaf73ea67, 0x444f8519, 0x9bddf492, 0x305853a8),\n\t\t\t\t\"OpenGLVersionCheck\",\n\t\t\t\t_(\"Checks OpenGL version and warns if it is known to contain bugs affecting K-3D\"),\n\t\t\t\t\"Desktop\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tboost::assign::map_list_of(\"ngui:opengl-start\", \"true\"));\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& version_check_factory()\n{\n\treturn version_check::get_factory();\n}\n\n} // namespace opengl\n\n} // namespace module\n"
  },
  {
    "path": "modules/osmesa/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_OSMESA_INCLUDE_DIRECTORIES})\n\nK3D_BUILD_MODULE(k3d-osmesa)\nK3D_CREATE_MODULE_PROXY(k3d-osmesa)\n\nTARGET_LINK_LIBRARIES(k3d-osmesa k3dsdk-opengl)\n\n"
  },
  {
    "path": "modules/osmesa/context_factory.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/gl/offscreen_context_factory.h>\n#include <k3dsdk/gl/offscreen_context.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/result.h>\n\n#include <boost/optional.hpp>\n\n#include <iterator>\n#include <stdexcept>\n\n// Needed when NVIDIA OpenGL is installed, since OSMesa needs this defined\n#ifndef GLAPIENTRY\n#define GLAPIENTRY\n#endif\n\n#ifndef GLAPI\n#define GLAPI\n#endif\n\n#include <GL/osmesa.h>\n\n#include <dlfcn.h>\n\nnamespace module\n{\n\nnamespace osmesa\n{\n\ntypedef OSMesaContext (*OSMesaCreateContext)(GLenum, OSMesaContext);\ntypedef void (*OSMesaDestroyContext)(OSMesaContext);\ntypedef GLboolean (*OSMesaMakeCurrent)(OSMesaContext, void*, GLenum, GLsizei, GLsizei);\n\nclass context :\n\tpublic k3d::gl::offscreen_context\n{\npublic:\n\tcontext(OSMesaContext Context, OSMesaMakeCurrent MakeCurrent, OSMesaDestroyContext DestroyContext, const k3d::uint_t Width, const k3d::uint_t Height) :\n\t\tosmesa_context(Context),\n\t\tosmesa_make_current(MakeCurrent),\n\t\tosmesa_destroy_context(DestroyContext),\n\t\twidth(Width),\n\t\theight(Height),\n\t\tbuffer(Width * Height * 4, 0)\n\t{\n\t}\n\n\t~context()\n\t{\n\t\tosmesa_destroy_context(osmesa_context);\n\t}\n\n\tvoid on_begin()\n\t{\n\t\tosmesa_make_current(osmesa_context, &buffer[0], GL_UNSIGNED_BYTE, width, height);\n\t}\n\n\tvoid on_end()\n\t{\n\t}\n\n\tconst k3d::uint8_t* buffer_begin()\n\t{\n\t\treturn &buffer[0];\n\t}\n\n\tconst k3d::uint8_t* buffer_end()\n\t{\n\t\treturn &buffer[0] + buffer.size();\n\t}\n\n\tOSMesaContext osmesa_context;\n\tOSMesaMakeCurrent osmesa_make_current;\n\tOSMesaDestroyContext osmesa_destroy_context;\n\tconst k3d::uint_t width;\n\tconst k3d::uint_t height;\n\tstd::vector<GLubyte> buffer;\n};\n\nclass context_factory :\n\tpublic k3d::gl::offscreen_context_factory\n{\npublic:\n\tcontext_factory()\n\t{\n\t}\n\n\tk3d::gl::offscreen_context* create(const k3d::uint_t Width, const k3d::uint_t Height)\n\t{\n\t\ttry\n\t\t{\n\t\t\tif(!module)\n\t\t\t{\n\t\t\t\tmodule = dlopen(\"/opt/local/lib/libOSMesa.dylib\", RTLD_LAZY | RTLD_LOCAL);\n\t\t\t\tif(!module.get())\n\t\t\t\t\tthrow std::runtime_error(dlerror());\n\t\t\t}\n\n\t\t\tif(!osmesa_create_context)\n\t\t\t\tosmesa_create_context = OSMesaCreateContext(dlsym(module.get(), \"OSMesaCreateContext\"));\n\t\t\tif(!osmesa_create_context.get())\n\t\t\t\tthrow std::runtime_error(\"Missing OSMesaCreateContext function.\");\n\n\t\t\tif(!osmesa_make_current)\n\t\t\t\tosmesa_make_current = OSMesaMakeCurrent(dlsym(module.get(), \"OSMesaMakeCurrent\"));\n\t\t\tif(!osmesa_make_current.get())\n\t\t\t\tthrow std::runtime_error(\"Missing OSMesaMakeCurrent function.\");\n\n\t\t\tif(!osmesa_destroy_context)\n\t\t\t\tosmesa_destroy_context = OSMesaDestroyContext(dlsym(module.get(), \"OSMesaDestroyContext\"));\n\t\t\tif(!osmesa_destroy_context.get())\n\t\t\t\tthrow std::runtime_error(\"Missing OSMesaDestroyContext function.\");\n\n\t\t\tconst OSMesaContext osmesa_context = osmesa_create_context.get()(OSMESA_RGBA, NULL);\n\t\t\tif(!osmesa_context)\n\t\t\t\tthrow std::runtime_error(\"Error creating OSMesa context.\");\n\n\t\t\treturn new context(osmesa_context, osmesa_make_current.get(), osmesa_destroy_context.get(), Width, Height);\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<context_factory,\n\t\t\tk3d::interface_list<k3d::gl::offscreen_context_factory> > factory(\n\t\t\t\tk3d::uuid(0xaf052636, 0xf74eeed2, 0xa1ed9cb4, 0x9f88cc5c),\n\t\t\t\t\"OSMesaContextFactory\",\n\t\t\t\t_(\"Creates OSMesa graphics contexts.\"),\n\t\t\t\t\"OpenGL\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tstatic boost::optional<void*> module;\n\tstatic boost::optional<OSMesaCreateContext> osmesa_create_context;\n\tstatic boost::optional<OSMesaMakeCurrent> osmesa_make_current;\n\tstatic boost::optional<OSMesaDestroyContext> osmesa_destroy_context;\n};\n\nboost::optional<void*> context_factory::module;\nboost::optional<OSMesaCreateContext> context_factory::osmesa_create_context;\nboost::optional<OSMesaMakeCurrent> context_factory::osmesa_make_current;\nboost::optional<OSMesaDestroyContext> context_factory::osmesa_destroy_context;\n\n/////////////////////////////////////////////////////////////////////////////\n// context_factory_factory\n\nk3d::iplugin_factory& context_factory_factory()\n{\n\treturn context_factory::get_factory();\n}\n\n} // namespace osmesa\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/osmesa/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace osmesa\n{\n\nextern k3d::iplugin_factory& context_factory_factory();\n\n} // namespace osmesa\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::osmesa::context_factory_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/osx/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-osx)\nK3D_CREATE_MODULE_PROXY(k3d-osx)\n\n"
  },
  {
    "path": "modules/osx/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the osx plugin module, to protect public symbols from name clashes with other modules\nnamespace osx\n{\n\nextern k3d::iplugin_factory& uri_handler_factory();\n\n} // namespace osx\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::osx::uri_handler_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/osx/uri_handler.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/iuri_handler.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/system.h>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace osx\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// uri_handler\n\n/// Uses the Mac OSX API to open a URI in the user's preferred application\nclass uri_handler :\n\tpublic k3d::iuri_handler\n{\npublic:\n\turi_handler()\n\t{\n\t}\n\n\tvirtual ~uri_handler()\n\t{\n\t}\n\n\tbool open_uri(const std::string& URI)\n\t{\n\t\tk3d::log() << info << \"URI: \" << URI << std::endl;\n\t\treturn_val_if_fail(k3d::system::spawn_async(\"open \" + URI), false);\n\t\treturn true;\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<uri_handler,\n\t\t\tk3d::interface_list<k3d::iuri_handler> > factory(\n\t\t\t\tk3d::uuid(0xf1c1780a, 0xc0e54c8f, 0x9d4aff60, 0xe9a6ac22),\n\t\t\t\t\"OSXURIHandler\",\n\t\t\t\t_(\"Opens a URI using the Mac OSX API\"),\n\t\t\t\t\"Desktop\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// uri_handler_factory\n\nk3d::iplugin_factory& uri_handler_factory()\n{\n\treturn uri_handler::get_factory();\n}\n\n} // namespace osx\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/particle/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-particle)\nK3D_CREATE_MODULE_PROXY(k3d-particle)\n\n"
  },
  {
    "path": "modules/particle/make_particles.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/particle.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace particle\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// points_to_particles\n\nclass points_to_particles :\n\tpublic k3d::material_sink<k3d::mesh_modifier<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_modifier<k3d::node> > base;\n\npublic:\n\tpoints_to_particles(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Controls the width of the output points.\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_material.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_width.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tif(!Input.points)\n\t\t\treturn;\n\n\t\tconst k3d::uint_t point_count = Input.points->size();\n\n\t\tOutput.points = Input.points;\n\t\tOutput.point_selection = Input.point_selection;\n\t\tOutput.point_attributes = Input.point_attributes;\n\n\t\tboost::scoped_ptr<k3d::particle::primitive> primitive(k3d::particle::create(Output));\n\t\tk3d::typed_array<k3d::double_t>& width = primitive->constant_attributes.create<k3d::typed_array<k3d::double_t> >(\"constantwidth\");\n\n\t\tprimitive->material.push_back(m_material.pipeline_value());\n\t\tprimitive->points.assign(point_count, 0);\n\t\tfor(k3d::uint_t i = 0; i != point_count; ++i)\n\t\t\tprimitive->points[i] = i;\n\t\twidth.push_back(m_width.pipeline_value());\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<points_to_particles,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0x3e4086fe, 0x0246f9ab, 0xeef01f8a, 0xf5cf5cff),\n\t\t\t\t\"PointsToParticles\",\n\t\t\t\t_(\"Converts input geometric points into a single group of particles.\"),\n\t\t\t\t\"Particles\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_width;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// points_to_particles_factory\n\nk3d::iplugin_factory& points_to_particles_factory()\n{\n\treturn points_to_particles::get_factory();\n}\n\n} // namespace particle\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/particle/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace particle\n{\n\nextern k3d::iplugin_factory& points_to_particles_factory();\n\n} // namespace particle\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::particle::points_to_particles_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/pdiff/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-pdiff)\nK3D_CREATE_MODULE_PROXY(k3d-pdiff)\n\n"
  },
  {
    "path": "modules/pdiff/CompareArgs.cpp",
    "content": "/*\nComapre Args\nCopyright (C) 2006 Yangli Hector Yee\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the\nGNU General Public License as published by the Free Software Foundation; either version 2 of the License,\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program;\nif not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n*/\n\n#include \"CompareArgs.h\"\n#include \"RGBAImage.h\"\n#include <stdio.h>\n\nstatic const char* copyright = \n\"PerceptualDiff version 1.0, Copyright (C) 2006 Yangli Hector Yee\\n\\\nPerceptualDiff comes with ABSOLUTELY NO WARRANTY;\\n\\\nThis is free software, and you are welcome\\n\\\nto redistribute it under certain conditions;\\n\\\nSee the GPL page for details: http://www.gnu.org/copyleft/gpl.html\\n\\n\";\n\nstatic const char *usage =\n\"PeceptualDiff image1.tif image2.tif\\n\\n\\\n   Compares image1.tif and image2.tif using a perceptually based image metric\\n\\\n   Options:\\n\\\n\\t-verbose       : Turns on verbose mode\\n\\\n\\t-fov deg       : Field of view in degrees (0.1 to 89.9)\\n\\\n\\t-threshold p\t : #pixels p below which differences are ignored\\n\\\n\\t-gamma g       : Value to convert rgb into linear space (default 2.2)\\n\\\n\\t-luminance l   : White luminance (default 100.0 cdm^-2)\\n\\\n\\t-output o.ppm  : Write difference to the file o.ppm\\n\\\n\\n\\\n\\n Note: Input files can also be in the PNG format\\\n\\n\";\n\nCompareArgs::CompareArgs()\n{\n\tImgA = NULL;\n\tImgB = NULL;\n\tImgDiff = NULL;\n\tVerbose = false;\n\tFieldOfView = 45.0f;\n\tGamma = 2.2f;\n\tThresholdPixels = 100;\n\tLuminance = 100.0f;\n\tFailedPixels = 0;\n}\n\nCompareArgs::~CompareArgs()\n{\n\tif (ImgA) delete ImgA;\n\tif (ImgB) delete ImgB;\n\tif (ImgDiff) delete ImgDiff;\n}\n\nvoid CompareArgs::Print_Args()\n{\n\tprintf(\"Field of view is %f degrees\\n\", FieldOfView);\n\tprintf(\"Threshold pixels is %u pixels\\n\", ThresholdPixels);\n\tprintf(\"The Gamma is %f\\n\", Gamma);\n\tprintf(\"The Display's luminance is %f candela per meter squared\\n\", Luminance);\n}\n\n"
  },
  {
    "path": "modules/pdiff/CompareArgs.h",
    "content": "/*\nComapre Args\nCopyright (C) 2006 Yangli Hector Yee\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the\nGNU General Public License as published by the Free Software Foundation; either version 2 of the License,\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program;\nif not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n*/\n\n#ifndef _COMPAREARGS_H\n#define _COMPAREARGS_H\n\n#include <string>\n\nclass RGBAImage;\n\n// Args to pass into the comparison function\nclass CompareArgs\n{\npublic:\n\tCompareArgs();\n\t~CompareArgs();\n\tvoid Print_Args();\n\t\n\tRGBAImage\t\t*ImgA;\t\t\t\t// Image A\n\tRGBAImage\t\t*ImgB;\t\t\t\t// Image B\n\tRGBAImage\t\t*ImgDiff;\t\t\t// Diff image\n\tbool\t\t\tVerbose;\t\t\t// Print lots of text or not\n\tfloat\t\t\tFieldOfView;\t\t// Field of view in degrees\n\tfloat\t\t\tGamma;\t\t\t\t// The gamma to convert to linear color space\n\tfloat\t\t\tLuminance;\t\t\t// the display's luminance\n\tunsigned int\t\tThresholdPixels;\t// How many pixels different to ignore\n\n\tstd::string\t\tErrorStr;\t\t\t// Result: Error string\n\tunsigned int\t\tFailedPixels;\t\t// Result: How many pixels are different\n};\n\n#endif\n\n"
  },
  {
    "path": "modules/pdiff/LPyramid.cpp",
    "content": "/*\nLaplacian Pyramid\nCopyright (C) 2006 Yangli Hector Yee\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the\nGNU General Public License as published by the Free Software Foundation; either version 2 of the License,\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program;\nif not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n*/\n\n#include \"LPyramid.h\"\n\n\n//////////////////////////////////////////////////////////////////////\n// Construction/Destruction\n//////////////////////////////////////////////////////////////////////\n\nLPyramid::LPyramid(float *image, int width, int height) :\n\tWidth(width),\n\tHeight(height)\n{\n\t// Make the Laplacian pyramid by successively\n\t// copying the earlier levels and blurring them\n\tfor (int i=0; i<MAX_PYR_LEVELS; i++) {\n\t\tif (i == 0) {\n\t\t\tLevels[i] = Copy(image);\n\t\t} else {\n\t\t\tLevels[i] = new float[Width * Height];\n\t\t\tConvolve(Levels[i], Levels[i - 1]);\n\t\t}\n\t}\n}\n\nLPyramid::~LPyramid()\n{\n\tfor (int i=0; i<MAX_PYR_LEVELS; i++) {\n\t\tif (Levels[i]) delete Levels[i];\n\t}\n}\n\nfloat *LPyramid::Copy(float *img)\n{\n\tint max = Width * Height;\n\tfloat *out = new float[max];\n\tfor (int i = 0; i < max; i++) out[i] = img[i];\n\t\n\treturn out;\n}\n\nvoid LPyramid::Convolve(float *a, float *b)\n// convolves image b with the filter kernel and stores it in a\n{\n\tint y,x,i,j,nx,ny;\n\tconst float Kernel[] = {0.05f, 0.25f, 0.4f, 0.25f, 0.05f};\n\n\tfor (y=0; y<Height; y++) {\n\t\tfor (x=0; x<Width; x++) {\n\t\t\tint index = y * Width + x;\n\t\t\ta[index] = 0.0f;\n\t\t\tfor (i=-2; i<=2; i++) {\n\t\t\t\tfor (j=-2; j<=2; j++) {\n\t\t\t\t\tnx=x+i;\n\t\t\t\t\tny=y+j;\n\t\t\t\t\tif (nx<0) nx=-nx;\n\t\t\t\t\tif (ny<0) ny=-ny;\n\t\t\t\t\tif (nx>=Width) nx=2*(Width-1)-nx;\n\t\t\t\t\tif (ny>=Height) ny=2*(Height-1)-ny;\n\t\t\t\t\ta[index] += Kernel[i+2] * Kernel[j+2] * b[ny * Width + nx];\n\t\t\t\t} \n\t\t\t}\n\t\t}\n\t}\n}\n\nfloat LPyramid::Get_Value(int x, int y, int level)\n{\n\tint index = x + y * Width;\n\tint l = level;\n\tif (l > MAX_PYR_LEVELS) l = MAX_PYR_LEVELS;\n\treturn Levels[level][index];\n}\n\n"
  },
  {
    "path": "modules/pdiff/LPyramid.h",
    "content": "/*\nLaplacian Pyramid\nCopyright (C) 2006 Yangli Hector Yee\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the\nGNU General Public License as published by the Free Software Foundation; either version 2 of the License,\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program;\nif not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n*/\n#ifndef _LPYRAMID_H\n#define _LPYRAMID_H\n\n#define MAX_PYR_LEVELS 8\n\nclass LPyramid\n{\npublic:\t\n\tLPyramid(float *image, int width, int height);\n\tvirtual ~LPyramid();\n\tfloat Get_Value(int x, int y, int level);\nprotected:\n\tfloat *Copy(float *img);\n\tvoid Convolve(float *a, float *b);\n\t\n\t// Succesively blurred versions of the original image\n\tfloat *Levels[MAX_PYR_LEVELS];\n\n\tint Width;\n\tint Height;\n};\n\n#endif // _LPYRAMID_H\n\n"
  },
  {
    "path": "modules/pdiff/Metric.cpp",
    "content": "/*\nMetric\nCopyright (C) 2006 Yangli Hector Yee\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the\nGNU General Public License as published by the Free Software Foundation; either version 2 of the License,\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program;\nif not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n*/\n\n#include \"Metric.h\"\n#include \"CompareArgs.h\"\n#include \"RGBAImage.h\"\n#include \"LPyramid.h\"\n#include <math.h>\n\n#include <cstdio>\n\n#ifndef M_PI\n#define M_PI 3.14159265f\n#endif\n\n/*\n* Given the adaptation luminance, this function returns the\n* threshold of visibility in cd per m^2\n* TVI means Threshold vs Intensity function\n* This version comes from Ward Larson Siggraph 1997\n*/ \n\nfloat tvi(float adaptation_luminance)\n{\n      // returns the threshold luminance given the adaptation luminance\n      // units are candelas per meter squared\n\n      float log_a, r, result; \n      log_a = log10f(adaptation_luminance);\n\n      if (log_a < -3.94f) {\n            r = -2.86f;\n      } else if (log_a < -1.44f) {\n            r = powf(0.405f * log_a + 1.6f , 2.18f) - 2.86f;\n      } else if (log_a < -0.0184f) {\n            r = log_a - 0.395f;\n      } else if (log_a < 1.9f) {\n            r = powf(0.249f * log_a + 0.65f, 2.7f) - 0.72f;\n      } else {\n            r = log_a - 1.255f;\n      }\n\n      result = powf(10.0f , r); \n\n      return result;\n\n} \n\n// computes the contrast sensitivity function (Barten SPIE 1989)\n// given the cycles per degree (cpd) and luminance (lum)\nfloat csf(float cpd, float lum)\n{\n\tfloat a, b, result; \n\t\n\ta = 440.0f * powf((1.0f + 0.7f / lum), -0.2f);\n\tb = 0.3f * powf((1.0f + 100.0f / lum), 0.15f);\n\t\t\n\tresult = a * cpd * expf(-b * cpd) * sqrtf(1.0f + 0.06f * expf(b * cpd)); \n\t\n\treturn result;\t\n}\n\n/*\n* Visual Masking Function\n* from Daly 1993\n*/\nfloat mask(float contrast)\n{\n      float a, b, result;\n      a = powf(392.498f * contrast,  0.7f);\n      b = powf(0.0153f * a, 4.0f);\n      result = powf(1.0f + b, 0.25f); \n\n      return result;\n} \n\n// convert Adobe RGB (1998) with reference white D65 to XYZ\nvoid AdobeRGBToXYZ(float r, float g, float b, float &x, float &y, float &z)\n{\n\t// matrix is from http://www.brucelindbloom.com/\n\tx = r * 0.576700f + g * 0.185556f + b * 0.188212f;\n\ty = r * 0.297361f + g * 0.627355f + b * 0.0752847f;\n\tz = r * 0.0270328f + g * 0.0706879f + b * 0.991248f;\n}\n\nvoid XYZToLAB(float x, float y, float z, float &L, float &A, float &B)\n{\n\tstatic float xw = -1;\n\tstatic float yw;\n\tstatic float zw;\n\t// reference white\n\tif (xw < 0) {\n\t\tAdobeRGBToXYZ(1, 1, 1, xw, yw, zw);\n\t}\n\tconst float epsilon  = 216.0f / 24389.0f;\n\tconst float kappa = 24389.0f / 27.0f;\n\tfloat f[3];\n\tfloat r[3];\n\tr[0] = x / xw;\n\tr[1] = y / yw;\n\tr[2] = z / zw;\n\tfor (int i = 0; i < 3; i++) {\n\t\tif (r[i] > epsilon) {\n\t\t\tf[i] = powf(r[i], 1.0f / 3.0f);\n\t\t} else {\n\t\t\tf[i] = (kappa * r[i] + 16.0f) / 116.0f;\n\t\t}\n\t}\n\tL = 116.0f * f[1] - 16.0f;\n\tA = 500.0f * (f[0] - f[1]);\n\tB = 200.0f * (f[1] - f[2]);\n}\n\nbool Yee_Compare(CompareArgs &args)\n{\n\targs.FailedPixels = 0;\n\n\tif ((args.ImgA->Get_Width() != args.ImgB->Get_Width()) ||\n\t\t(args.ImgA->Get_Height() != args.ImgB->Get_Height())) {\n\t\targs.ErrorStr = \"Image dimensions do not match\\n\";\n\t\treturn false;\n\t}\n\t\n\tunsigned int i, dim;\n\tdim = args.ImgA->Get_Width() * args.ImgA->Get_Height();\n\tbool identical = true;\n\tfor (i = 0; i < dim; i++) {\n\t\tif (args.ImgA->Get(i) != args.ImgB->Get(i)) {\n\t\t  identical = false;\n\t\t  break;\n\t\t}\n\t}\n\tif (identical) {\n\t\targs.ErrorStr = \"Images are binary identical\\n\";\n\t\treturn true;\n\t}\n\t\n\t// assuming colorspaces are in Adobe RGB (1998) convert to XYZ\n\tfloat *aX = new float[dim];\n\tfloat *aY = new float[dim];\n\tfloat *aZ = new float[dim];\n\tfloat *bX = new float[dim];\n\tfloat *bY = new float[dim];\n\tfloat *bZ = new float[dim];\n\tfloat *aLum = new float[dim];\n\tfloat *bLum = new float[dim];\n\t\n\tfloat *aA = new float[dim];\n\tfloat *bA = new float[dim];\n\tfloat *aB = new float[dim];\n\tfloat *bB = new float[dim];\n\n\tif (args.Verbose) printf(\"Converting RGB to XYZ\\n\");\n\t\n\tunsigned int x, y, w, h;\n\tw = args.ImgA->Get_Width();\n\th = args.ImgA->Get_Height();\n\tfor (y = 0; y < h; y++) {\n\t\tfor (x = 0; x < w; x++) {\n\t\t\tfloat r, g, b, l;\n\t\t\ti = x + y * w;\n\t\t\tr = powf(args.ImgA->Get_Red(i) / 255.0f, args.Gamma);\n\t\t\tg = powf(args.ImgA->Get_Green(i) / 255.0f, args.Gamma);\n\t\t\tb = powf(args.ImgA->Get_Blue(i) / 255.0f, args.Gamma);\t\t\t\t\t\t\n\t\t\tAdobeRGBToXYZ(r,g,b,aX[i],aY[i],aZ[i]);\t\t\t\n\t\t\tXYZToLAB(aX[i], aY[i], aZ[i], l, aA[i], aB[i]);\n\t\t\tr = powf(args.ImgB->Get_Red(i) / 255.0f, args.Gamma);\n\t\t\tg = powf(args.ImgB->Get_Green(i) / 255.0f, args.Gamma);\n\t\t\tb = powf(args.ImgB->Get_Blue(i) / 255.0f, args.Gamma);\t\t\t\t\t\t\n\t\t\tAdobeRGBToXYZ(r,g,b,bX[i],bY[i],bZ[i]);\n\t\t\tXYZToLAB(bX[i], bY[i], bZ[i], l, bA[i], bB[i]);\n\t\t\taLum[i] = aY[i] * args.Luminance;\n\t\t\tbLum[i] = bY[i] * args.Luminance;\n\t\t}\n\t}\n\t\n\tif (args.Verbose) printf(\"Constructing Laplacian Pyramids\\n\");\n\t\n\tLPyramid *la = new LPyramid(aLum, w, h);\n\tLPyramid *lb = new LPyramid(bLum, w, h);\n\t\n\tfloat num_one_degree_pixels = (float) (2 * tan( args.FieldOfView * 0.5 * M_PI / 180) * 180 / M_PI);\n\tfloat pixels_per_degree = w / num_one_degree_pixels;\n\t\n\tif (args.Verbose) printf(\"Performing test\\n\");\n\t\n\tfloat num_pixels = 1;\n\tunsigned int adaptation_level = 0;\n\tfor (i = 0; i < MAX_PYR_LEVELS; i++) {\n\t\tadaptation_level = i;\n\t\tif (num_pixels > num_one_degree_pixels) break;\n\t\tnum_pixels *= 2;\n\t}\n\t\n\tfloat cpd[MAX_PYR_LEVELS];\n\tcpd[0] = 0.5f * pixels_per_degree;\n\tfor (i = 1; i < MAX_PYR_LEVELS; i++) cpd[i] = 0.5f * cpd[i - 1];\n\tfloat csf_max = csf(3.248f, 100.0f);\n\t\n\tfloat F_freq[MAX_PYR_LEVELS - 2];\n\tfor (i = 0; i < MAX_PYR_LEVELS - 2; i++) F_freq[i] = csf_max / csf( cpd[i], 100.0f);\n\t\n\tfor (y = 0; y < h; y++) {\n\t  for (x = 0; x < w; x++) {\n\t\tint index = x + y * w;\n\t\tfloat contrast[MAX_PYR_LEVELS - 2];\n\t\tfloat sum_contrast = 0;\n\t\tfor (i = 0; i < MAX_PYR_LEVELS - 2; i++) {\n\t\t\tfloat n1 = fabsf(la->Get_Value(x,y,i) - la->Get_Value(x,y,i + 1));\n\t\t\tfloat n2 = fabsf(lb->Get_Value(x,y,i) - lb->Get_Value(x,y,i + 1));\n\t\t\tfloat numerator = (n1 > n2) ? n1 : n2;\n\t\t\tfloat d1 = fabsf(la->Get_Value(x,y,i+2));\n\t\t\tfloat d2 = fabsf(lb->Get_Value(x,y,i+2));\n\t\t\tfloat denominator = (d1 > d2) ? d1 : d2;\n\t\t\tif (denominator < 1e-5f) denominator = 1e-5f;\n\t\t\tcontrast[i] = numerator / denominator;\n\t\t\tsum_contrast += contrast[i];\n\t\t}\n\t\tif (sum_contrast < 1e-5) sum_contrast = 1e-5f;\n\t\tfloat F_mask[MAX_PYR_LEVELS - 2];\n\t\tfloat adapt = la->Get_Value(x,y,adaptation_level) + lb->Get_Value(x,y,adaptation_level);\n\t\tadapt *= 0.5f;\n\t\tif (adapt < 1e-5) adapt = 1e-5f;\n\t\tfor (i = 0; i < MAX_PYR_LEVELS - 2; i++) {\n\t\t\tF_mask[i] = mask(contrast[i] * csf(cpd[i], adapt)); \n\t\t}\n\t\tfloat factor = 0;\n\t\tfor (i = 0; i < MAX_PYR_LEVELS - 2; i++) {\n\t\t\tfactor += contrast[i] * F_freq[i] * F_mask[i] / sum_contrast;\n\t\t}\n\t\tif (factor < 1) factor = 1;\n\t\tif (factor > 10) factor = 10;\n\t\tfloat delta = fabsf(la->Get_Value(x,y,0) - lb->Get_Value(x,y,0));\n\t\tbool pass = true;\n\t\t// pure luminance test\n\t\tif (delta > factor * tvi(adapt)) {\n\t\t\tpass = false;\n\t\t} else {\n\t\t\t// CIE delta E test with modifications\n\t\t\tfloat color_scale = 1.0f;\n\t\t\t// ramp down the color test in scotopic regions\n\t\t\tif (adapt < 10.0f) {\n\t\t\t\tcolor_scale = 1.0f - (10.0f - color_scale) / 10.0f;\n\t\t\t\tcolor_scale = color_scale * color_scale;\n\t\t\t}\n\t\t\tfloat da = aA[index] - bA[index];\n\t\t\tfloat db = aB[index] - bB[index];\n\t\t\tda = da * da;\n\t\t\tdb = db * db;\n\t\t\tfloat delta_e = (da + db) * color_scale;\n\t\t\tif (delta_e > factor) {\n\t\t\t\tpass = false;\n\t\t\t}\n\t\t}\n\t\tif (!pass) {\n\t\t\targs.FailedPixels++;\n\t\t\tif (args.ImgDiff) {\n\t\t\t\targs.ImgDiff->Set(255, 0, 0, 255, index);\n\t\t\t}\n\t\t} else {\n\t\t\tif (args.ImgDiff) {\n\t\t\t\targs.ImgDiff->Set(0, 0, 0, 255, index);\n\t\t\t}\n\t\t}\n\t  }\n\t}\n\t\n\tif (aX) delete[] aX;\n\tif (aY) delete[] aY;\n\tif (aZ) delete[] aZ;\n\tif (bX) delete[] bX;\n\tif (bY) delete[] bY;\n\tif (bZ) delete[] bZ;\n\tif (aLum) delete[] aLum;\n\tif (bLum) delete[] bLum;\n\tif (la) delete la;\n\tif (lb) delete lb;\n\tif (aA) delete[] aA;\n\tif (bA) delete[] bA;\n\tif (aB) delete[] aB;\n\tif (bB) delete[] bB;\n\t\n\tif (args.FailedPixels < args.ThresholdPixels) {\n\t\targs.ErrorStr = \"Images are perceptually indistinguishable\\n\";\n\t\treturn true;\n\t}\n\t\n\tchar different[100];\n\tsprintf(different, \"%u pixels are different\\n\", args.FailedPixels);\n\n\targs.ErrorStr = \"Images are visibly different\\n\";\n\targs.ErrorStr += different;\n\n/*\n\tif (args.ImgDiff) {\n\t\tif (args.ImgDiff->WritePPM()) {\n\t\t\targs.ErrorStr += \"Wrote difference image to \";\n\t\t\targs.ErrorStr+= args.ImgDiff->Get_Name();\n\t\t\targs.ErrorStr += \"\\n\";\n\t\t} else {\n\t\t\targs.ErrorStr += \"Could not write difference image to \";\n\t\t\targs.ErrorStr+= args.ImgDiff->Get_Name();\n\t\t\targs.ErrorStr += \"\\n\";\n\t\t}\n\t}\n*/\n\n\treturn false;\n}\n\n"
  },
  {
    "path": "modules/pdiff/Metric.h",
    "content": "/*\nMetric\nCopyright (C) 2006 Yangli Hector Yee\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the\nGNU General Public License as published by the Free Software Foundation; either version 2 of the License,\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program;\nif not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n*/\n\n#ifndef _METRIC_H\n#define _METRIC_H\n\nclass CompareArgs;\n\n// Image comparison metric using Yee's method\n// References: A Perceptual Metric for Production Testing, Hector Yee, Journal of Graphics Tools 2004\nbool Yee_Compare(CompareArgs &args);\n\n#endif\n\n"
  },
  {
    "path": "modules/pdiff/README.txt",
    "content": "perceptualdiff - a program that compares two images using\na perceptually based image metric.\nCopyright (C) 2006 Yangli Hector Yee\nyeehector@users.sourceforge.net\nhttp://pdiff.sourceforge.net/\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License,\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\nor FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details in the file gpl.txt.\n\nBuild Instructions\n1. Download cross platform make from http://www.cmake.org\n2. Download libtiff from http://www.libtiff.org. Download libpng from http://www.libpng.org\n3. Edit CMakeLists.txt to tell it where to find your libtiff and libpng library\n4. Type cmake .\n5. Type make . (or on Windows systems cmake makes a Visual Studio\nProject file)\n6. To specify the install directory, use make install DESTDIR=\"/home/me/mydist\"\n\nUsage\n\nperceptualdiff image1.(tif | png) image2.(tif | png) [options]\n-verbose : Turns on verbose mode\n-fov deg: field of view, deg, in degrees. Usually between 10.0 to 85.0. \nThis controls how much of the screen the oberserver is seeing. Front row of \na theatre has a field of view of around 25 degrees. Back row has a field of\n view of around 60 degrees.\n-threshold p : Sets the number of pixels, p, to reject. For example if p is\n 100, then the test fails if 100 or more pixels are perceptably different.\n-gamma g : The gamma to use to convert to RGB linear space. Default is 2.2\n-luminance l: The luminance of the display the observer is seeing. Default\n is 100 candela per meter squared\n-output foo.ppm : Saves the difference image to foo.ppm\n\nCredits\n\nHector Yee, project administrator and originator - hectorgon.blogspot.com\nScott Corley, for png file IO code\nTobias Sauerwein, for make install, package_source Cmake configuration"
  },
  {
    "path": "modules/pdiff/RGBAImage.cpp",
    "content": "/*\nRGBAImage.cpp\nCopyright (C) 2006 Yangli Hector Yee\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the\nGNU General Public License as published by the Free Software Foundation; either version 2 of the License,\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program;\nif not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n*/\n\n#include \"RGBAImage.h\"\n\n"
  },
  {
    "path": "modules/pdiff/RGBAImage.h",
    "content": "/*\nRGBAImage.h\nCopyright (C) 2006 Yangli Hector Yee\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the\nGNU General Public License as published by the Free Software Foundation; either version 2 of the License,\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program;\nif not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n*/\n\n#ifndef _RGAIMAGE_H\n#define _RGBAIMAGE_H\n\n#include<string>\n\n// assumes data is in the ABGR format\nclass RGBAImage\n{\npublic:\n\tRGBAImage(int w, int h, const char *name = 0)\n\t{\n\t\tWidth = w;\n\t\tHeight = h;\n\t\tif (name) Name = name;\n\t\tData = new unsigned int[w * h];\n\t};\n\t~RGBAImage() { if (Data) delete[] Data; }\n\tunsigned char Get_Red(unsigned int i) { return (Data[i] & 0xFF); }\n\tunsigned char Get_Green(unsigned int i) { return ((Data[i]>>8) & 0xFF); }\n\tunsigned char Get_Blue(unsigned int i) { return ((Data[i]>>16) & 0xFF); }\n\tunsigned char Get_Alpha(unsigned int i) { return ((Data[i]>>24) & 0xFF); }\n\tvoid Set(unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned int i)\n\t{ Data[i] = r | (g << 8) | (b << 16) | (a << 24); }\n\tint Get_Width(void) const { return Width; }\n\tint Get_Height(void) const { return Height; }\n\tvoid Set(int x, int y, unsigned int d) { Data[x + y * Width] = d; }\n\tunsigned int Get(int x, int y) const { return Data[x + y * Width]; }\n\tunsigned int Get(int i) const { return Data[i]; }\n\tconst std::string &Get_Name(void) const { return Name; }\n\t\nprotected:\n\tint Width;\n\tint Height;\n\tstd::string Name;\n\tunsigned int *Data;\n};\n\n#endif\n\n"
  },
  {
    "path": "modules/pdiff/gpl.txt",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n\t    How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "modules/pdiff/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace pdiff\n{\n\nextern k3d::iplugin_factory& perceptual_difference_factory();\n\n} // namespace pdiff\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::pdiff::perceptual_difference_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/pdiff/perceptual_difference.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n          \\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"CompareArgs.h\"\n#include \"Metric.h\"\n#include \"RGBAImage.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/ibitmap_source.h>\n#include <k3dsdk/pointer_demand_storage.h>\n#include <k3dsdk/value_demand_storage.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace pdiff\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// perceptual_difference\n\n/// Computes the a difference metric between two images based on the physiology of human vision.\nclass perceptual_difference :\n\tpublic k3d::node,\n\tpublic k3d::ibitmap_source\n{\n\ttypedef k3d::node base;\n\npublic:\n\tperceptual_difference(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_bitmap_a(init_owner(*this) + init_name(\"input_a\") + init_label(_(\"Input A\")) + init_description(_(\"A input bitmap\")) + init_value<k3d::bitmap*>(0)),\n\t\tm_bitmap_b(init_owner(*this) + init_name(\"input_b\") + init_label(_(\"Input B\")) + init_description(_(\"B input bitmap\")) + init_value<k3d::bitmap*>(0)),\n\t\tm_field_of_view(init_owner(*this) + init_name(\"field_of_view\") + init_label(_(\"Field-of-view\")) + init_description(_(\"Field-of-view (degrees)\")) + init_value(45.0) + init_step_increment(0.01)),\n\t\tm_gamma(init_owner(*this) + init_name(\"gamma\") + init_label(_(\"Gamma\")) + init_description(_(\"Gamma\")) + init_value(2.2) + init_step_increment(0.01)),\n\t\tm_luminance(init_owner(*this) + init_name(\"luminance\") + init_label(_(\"Luminance\")) + init_description(_(\"Display Luminance (candela per square meter)\")) + init_value(100.0) + init_step_increment(1.0)),\n\t\tm_difference(init_owner(*this) + init_name(\"difference\") + init_label(_(\"Difference\")) + init_description(_(\"The count of perceivably-different pixels\")) + init_value(std::numeric_limits<k3d::uint32_t>::max())),\n\t\tm_output_bitmap(init_owner(*this) + init_name(\"output_bitmap\") + init_label(_(\"Output Bitmap\")) + init_description(_(\"Output bitmap\")))\n\t{\n\t\tm_difference.set_update_slot(sigc::mem_fun(*this, &perceptual_difference::difference_execute));\n\t\tm_output_bitmap.set_update_slot(sigc::mem_fun(*this, &perceptual_difference::bitmap_execute));\n\n\t\tm_bitmap_a.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_difference.make_slot()));\n\t\tm_bitmap_b.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_difference.make_slot()));\n\t\tm_field_of_view.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_difference.make_slot()));\n\t\tm_gamma.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_difference.make_slot()));\n\t\tm_luminance.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_difference.make_slot()));\n\n\t\tm_bitmap_a.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_output_bitmap.make_slot()));\n\t\tm_bitmap_b.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_output_bitmap.make_slot()));\n\t\tm_field_of_view.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_output_bitmap.make_slot()));\n\t\tm_gamma.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_output_bitmap.make_slot()));\n\t\tm_luminance.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_output_bitmap.make_slot()));\n\n\t}\n\n\tk3d::iproperty& bitmap_source_output()\n\t{\n\t\treturn m_output_bitmap;\n\t}\n\n\tvoid difference_execute(const std::vector<k3d::ihint*>& Hints, k3d::uint32_t& Difference)\n\t{\n\t\tDifference = std::numeric_limits<k3d::uint32_t>::max();\n\n\t\tk3d::bitmap* const bitmap_a = m_bitmap_a.pipeline_value();\n\t\tif(!bitmap_a)\n\t\t\treturn;\n\n\t\tk3d::bitmap* const bitmap_b = m_bitmap_b.pipeline_value();\n\t\tif(!bitmap_b)\n\t\t\treturn;\n\n\t\tif(bitmap_a->width() != bitmap_b->width() || bitmap_a->height() != bitmap_b->height())\n\t\t\treturn;\n\n\t\tCompareArgs args;\n\t\targs.ImgA = convert(*bitmap_a);\n\t\targs.ImgB = convert(*bitmap_b);\n\t\targs.ImgDiff = new RGBAImage(bitmap_a->width(), bitmap_a->height());\n\t\targs.Verbose = false;\n\t\targs.FieldOfView = m_field_of_view.pipeline_value();\n\t\targs.Gamma = m_gamma.pipeline_value();\n\t\targs.Luminance = m_luminance.pipeline_value();\n\t\targs.ThresholdPixels = 0;\n\n\t\tYee_Compare(args);\n\t\n\t\tDifference = args.FailedPixels;\n\t}\n\n\tvoid bitmap_execute(const std::vector<k3d::ihint*>& Hints, k3d::bitmap& Bitmap)\n\t{\n\t\tk3d::bitmap* const bitmap_a = m_bitmap_a.pipeline_value();\n\t\tif(!bitmap_a)\n\t\t\treturn;\n\n\t\tk3d::bitmap* const bitmap_b = m_bitmap_b.pipeline_value();\n\t\tif(!bitmap_b)\n\t\t\treturn;\n\n\t\tif(bitmap_a->width() != bitmap_b->width() || bitmap_a->height() != bitmap_b->height())\n\t\t\treturn;\n\n\t\tCompareArgs args;\n\t\targs.ImgA = convert(*bitmap_a);\n\t\targs.ImgB = convert(*bitmap_b);\n\t\targs.ImgDiff = new RGBAImage(bitmap_a->width(), bitmap_a->height());\n\t\targs.Verbose = false;\n\t\targs.FieldOfView = m_field_of_view.pipeline_value();\n\t\targs.Gamma = m_gamma.pipeline_value();\n\t\targs.Luminance = m_luminance.pipeline_value();\n\t\targs.ThresholdPixels = 0;\n\n\t\tYee_Compare(args);\n\n\t\tconvert(*args.ImgDiff, Bitmap);\n\t}\n\n\tstatic RGBAImage* convert(k3d::bitmap& Source)\n\t{\n\t\tRGBAImage* const result = new RGBAImage(Source.width(), Source.height());\n\n\t\tconst k3d::bitmap::view_t& source = view(Source);\n\n\t\tunsigned int i = 0;\n\t\tconst k3d::bitmap::view_t::iterator begin = source.begin();\n\t\tconst k3d::bitmap::view_t::iterator end = source.end();\n\t\tfor(k3d::bitmap::view_t::iterator pixel = begin; pixel != end; ++pixel, ++i)\n\t\t{\n\t\t\tresult->Set(\n\t\t\t\tboost::gil::channel_convert<boost::gil::bits8>(get_color(*pixel, boost::gil::red_t())),\n\t\t\t\tboost::gil::channel_convert<boost::gil::bits8>(get_color(*pixel, boost::gil::green_t())),\n\t\t\t\tboost::gil::channel_convert<boost::gil::bits8>(get_color(*pixel, boost::gil::blue_t())),\n\t\t\t\tboost::gil::channel_convert<boost::gil::bits8>(get_color(*pixel, boost::gil::alpha_t())),\n\t\t\t\ti\n\t\t\t\t);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tstatic void convert(RGBAImage& Source, k3d::bitmap& Destination)\n\t{\n\t\tDestination.recreate(Source.Get_Width(), Source.Get_Height());\n\n\t\tconst k3d::bitmap::view_t& destination = view(Destination);\n\n\t\tunsigned int i = 0;\n\t\tconst k3d::bitmap::view_t::iterator begin = destination.begin();\n\t\tconst k3d::bitmap::view_t::iterator end = destination.end();\n\t\tfor(k3d::bitmap::view_t::iterator pixel = begin; pixel != end; ++pixel, ++i)\n\t\t{\n\t\t\tget_color(*pixel, boost::gil::red_t()) = boost::gil::channel_convert<half>(Source.Get_Red(i));\n\t\t\tget_color(*pixel, boost::gil::green_t()) = boost::gil::channel_convert<half>(Source.Get_Green(i));\n\t\t\tget_color(*pixel, boost::gil::blue_t()) = boost::gil::channel_convert<half>(Source.Get_Blue(i));\n\t\t\tget_color(*pixel, boost::gil::alpha_t()) = boost::gil::channel_convert<half>(Source.Get_Alpha(i));\n\t\t}\n\t\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<perceptual_difference,\n\t\t\t\tk3d::interface_list<k3d::ibitmap_source > > factory(\n\t\t\t\t\tk3d::uuid(0x2f0ffccf, 0xaa40e2f3, 0xb5221a9f, 0x20131d9f),\n\t\t\t\t\t\"BitmapPerceptualDifference\",\n\t\t\t\t\t_(\"Calculate a perceptual difference metric between two bitmap images\"),\n\t\t\t\t\t\"Bitmap Test\",\n\t\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bitmap*, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) m_bitmap_a;\n\tk3d_data(k3d::bitmap*, immutable_name, change_signal, no_undo, local_storage, no_constraint, writable_property, no_serialization) m_bitmap_b;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_field_of_view;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_gamma;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_luminance;\n\tk3d_data(k3d::uint32_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_difference;\n\tk3d_data(k3d::bitmap*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_output_bitmap;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// perceptual_difference_factory\n\nk3d::iplugin_factory& perceptual_difference_factory()\n{\n\treturn perceptual_difference::get_factory();\n}\n\n} // namespace pdiff\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/pixie/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-pixie)\nK3D_CREATE_MODULE_PROXY(k3d-pixie)\n\n"
  },
  {
    "path": "modules/pixie/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements procedures required to export K-3D objects from the core module\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the Pixie plugin module, to protect public symbols from name clashes with other modules\nnamespace pixie\n{\n\nextern k3d::iplugin_factory& raytrace_map_factory();\n\n} // namespace pixie\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::pixie::raytrace_map_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/pixie/raytrace_map.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/istream_ri.h>\n#include <k3dsdk/itexture_ri.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace pixie\n{\n\nclass raytrace_map :\n\tpublic k3d::node,\n\tpublic k3d::ri::itexture\n{\n\ttypedef k3d::node base;\n\npublic:\n\traytrace_map(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid setup_renderman_texture(k3d::inetwork_render_frame& Frame, k3d::ri::istream& Stream, k3d::ri::ishader_collection& Shaders)\n\t{\n\t}\n\n\tconst k3d::filesystem::path renderman_texture_path(const k3d::ri::render_state& State)\n\t{\n\t\treturn k3d::filesystem::generic_path(\"raytrace\");\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<raytrace_map,\n\t\t\tk3d::interface_list<k3d::ri::itexture> > factory(\n\t\t\t\tk3d::uuid(0x896ac401, 0x5fae47ce, 0x92836627, 0x934dacdc),\n\t\t\t\t\"PixieRaytraceMap\",\n\t\t\t\t_(\"Dummy shadow map source for raytracing with Pixie\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// raytrace_map_factory\n\nk3d::iplugin_factory& raytrace_map_factory()\n{\n\treturn raytrace_map::get_factory();\n}\n\n} // namespace pixie\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/plot/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-plot)\nK3D_CREATE_MODULE_PROXY(k3d-plot)\n\nTARGET_LINK_LIBRARIES(k3d-plot k3dsdk-expression)\n"
  },
  {
    "path": "modules/plot/least_squares_plot.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Implements the a Least Squares Approximation solver and plotter.\n\t\\author Timothy M. Shead (tshead@k-3d.com) \n\t\\author Joaquín Duo (joaduo@lugmen.org.ar) \n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/expression/parser.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\n#include <boost/multi_array.hpp>\n\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/lu.hpp>\n\n\nnamespace module\n{\n\nnamespace plot\n{\n\nnamespace detail\n{\n\nclass least_squares_solver_plotter\n{\nprivate:\n\tstd::vector<k3d::expression::parser*> function_parsers;\n\tstd::vector<k3d::double_t> coefficients;\npublic:\n\tleast_squares_solver_plotter()\n\t{\n\t\t\n\t}\n\n\t~least_squares_solver_plotter()\n\t{\n\t\t// Free parsers' memory\n\t\tfor(k3d::uint32_t func_index=0; func_index< function_parsers.size(); ++func_index)\n\t\t{\n\t\t\tdelete function_parsers[func_index];\n\t\t}\n\t}\n\n\t//solve the linear system for the Least Square Approximation and return the coefficients\n\tstd::vector<k3d::double_t> solve(const k3d::mesh::points_t& input_points, std::vector<k3d::double_t> values)\n\t{\n\t\t// Evaluate each function on every point and create a new array for accesing the z values of input_points\n\t\tk3d::uint64_t points_size = input_points.size();\n\n\t\tboost::multi_array<k3d::double_t,1> points_z_value(boost::extents[points_size]);\n\t\tboost::multi_array<k3d::double_t, 2> function_eval_on_points(boost::extents[function_parsers.size()][points_size]);\n\t\tfor(k3d::uint64_t point_index=0; point_index< points_size; ++point_index)\n\t\t{\n\t\t\tvalues[0] = input_points[point_index][0];\n\t\t\tvalues[1] = input_points[point_index][1];\n\t\t\tfor(k3d::uint32_t func_index=0; func_index < function_parsers.size(); ++func_index)\n\t\t\t{\n\t\t\t\tfunction_eval_on_points[func_index][point_index] = function_parsers[func_index]->evaluate(&values[0]);\n\t\t\t}\n\t\t\tpoints_z_value[point_index] = input_points[point_index][2];\n\t\t}\n\t\t\n\t\t//Create the linear system for least squares\n\t\t\t//Create the matrix A\n\t\t\tboost::numeric::ublas::matrix<k3d::double_t> matrix_A(function_parsers.size(),function_parsers.size());\n\t\t\tfor(k3d::uint32_t j_index = 0; j_index < function_parsers.size(); ++j_index)\n\t\t\t{\n\t\t\t\tfor(k3d::uint32_t i_index = 0; i_index < function_parsers.size(); ++i_index)\n\t\t\t\t{\n\t\t\t\t\tk3d::double_t scalar_product = 0;\n\t\t\t\t\tfor(k3d::uint64_t point_index=0; point_index < points_size; ++point_index)\n\t\t\t\t\t{\n\t\t\t\t\t\tscalar_product += function_eval_on_points[i_index][point_index]*\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfunction_eval_on_points[j_index][point_index];\n\t\t\t\t\t}\n\t\t\t\t\tmatrix_A(j_index,i_index) = scalar_product;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//Create the vector b\n\t\t\tboost::numeric::ublas::vector<k3d::double_t> vector_b(function_parsers.size());\n\t\t\tfor(k3d::uint32_t j_index=0; j_index < function_parsers.size(); ++j_index)\n\t\t\t{\n\t\t\t\tk3d::double_t scalar_product = 0;\n\t\t\t\tfor(k3d::uint64_t point_index=0; point_index < points_size; ++point_index)\n\t\t\t\t{\n\t\t\t\t\tscalar_product +=                   points_z_value[point_index]*\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfunction_eval_on_points[j_index][point_index];\n\t\t\t\t}\n\t\t\t\tvector_b(j_index) = scalar_product;\n\t\t\t}\n\t\t// Solve the linear system\n\t\t\tboost::numeric::ublas::permutation_matrix<> piv(function_parsers.size());\n\t\t\tboost::numeric::ublas::lu_factorize(matrix_A, piv);\n\t\t\tboost::numeric::ublas::lu_substitute(matrix_A, piv, vector_b);\n\t\t\tboost::numeric::ublas::vector<k3d::double_t> & vector_x = vector_b;\n\t\t\n\t\t//Save the result\n\t\tfor(k3d::uint32_t func_index=0; func_index < function_parsers.size() ; ++func_index)\n\t\t{\n\t\t\tcoefficients.push_back(vector_x(func_index));\n\t\t}\n\t\t//return it\n\t\treturn coefficients;\n\t}\n\n\t//Plot the function given a grid.\n\tvoid plot(\n\t\tk3d::mesh::points_t::iterator point,\n\t\tk3d::int32_t point_rows,\n\t\tk3d::int32_t point_columns,\n\t\tk3d::double_t width,\n\t\tk3d::double_t height,\n\t\tstd::vector<k3d::double_t> values\n\t\t)\n\t{\n\t\tk3d::vector3 i, j, k;\n\t\t// Orientation k3d::PZ:\n\t\ti = k3d::vector3(1, 0, 0);\n\t\tj = k3d::vector3(0, 1, 0);\n\t\tk = k3d::vector3(0, 0, 1);\n\t\t\n// \t\t\t\tk3d::mesh::points_t::iterator point = output_points.begin();\n\t\tfor(k3d::uint64_t row = 0; row != point_rows; ++row)\n\t\t{\n\t\t\tconst k3d::double_t row_percent = static_cast<k3d::double_t>(row) / static_cast<k3d::double_t>(point_rows - 1);\n\n\t\t\tfor(k3d::uint64_t column = 0; column != point_columns; ++column)\n\t\t\t{\n\t\t\t\tconst k3d::double_t column_percent = static_cast<k3d::double_t>(column) / static_cast<k3d::double_t>(point_columns - 1);\n\n\t\t\t\tconst k3d::double_t u = k3d::mix(-0.5 * width, 0.5 * width, column_percent);\n\t\t\t\tconst k3d::double_t v = k3d::mix(-0.5 * height, 0.5 * height, row_percent);\n\n\t\t\t\tvalues[0] = u;\n\t\t\t\tvalues[1] = v;\n\t\t\t\tk3d::double_t w = 0;\n\t\t\t\tfor(k3d::uint32_t func_index=0; func_index < function_parsers.size(); ++func_index)\n\t\t\t\t{\n\t\t\t\t\tw += coefficients[func_index] *\n\t\t\t\t\t\t\t\t\t\t function_parsers[func_index]->evaluate(&values[0]);\n\t\t\t\t}\n\t\t\t\t*point++ = k3d::to_point((u * i) + (v * j) + (w * k));\n\t\t\t}\n\t\t}\t\t\t\t\n\t}\n\t\n\t// Function Parsers for the Leat Square Approximation\n\tvoid create_function_parsers(std::vector<k3d::string_t> functions, k3d::string_t variables, k3d::string_t factory)\n\t{\n\t\tfor(k3d::uint32_t func_index=0; func_index< functions.size(); ++func_index)\n\t\t{\n\t\t\tk3d::expression::parser * temp_parser =  new k3d::expression::parser();\n\t\t\tfunction_parsers.push_back(temp_parser);\n\t\t\tif( !function_parsers[func_index]->parse(functions[func_index],variables) )\n\t\t\t{\n\t\t\t\tk3d::log() << error << factory << \": function [\" << functions[func_index] << \" ] parsing failed: \" << function_parsers[func_index]->last_parse_error() << std::endl;\n\t\t\t\tthrow std::exception();\n\t\t\t}\n\t\t}\n\t}\n};\n\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// least_squares_plot\n\nclass least_squares_plot :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\t\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tleast_squares_plot(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input_mesh(init_owner(*this) + init_name(\"input_mesh\") + init_label(_(\"Input Mesh\")) + init_description(_(\"Points to approximate\")) + init_value<k3d::mesh*>(0)),\n\t\tm_uv_rename(init_owner(*this) + init_name(\"uv_rename\") + init_label(_(\"Rename u v\")) + init_description(_(\"Renames the u,v variables to suit the variables from your function. Could be x,y for example\")) + init_value(k3d::string_t(_(\"u,v\")))),\n\t\tm_columns(init_owner(*this) + init_name(\"columns\") + init_label(_(\"Columns\")) + init_description(_(\"Column number\")) + init_value(15) + init_constraint(constraint::minimum(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_rows(init_owner(*this) + init_name(\"rows\") + init_label(_(\"Rows\")) + init_description(_(\"Row number\")) + init_value(15) + init_constraint(constraint::minimum(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Grid width\")) + init_value(20.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Grid height\")) + init_value(20.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_output_coefficients(init_owner(*this) + init_name(\"output_coefficients\") + init_label(_(\"Coefficients\")) + init_description(_(\"Output Values of the coficients\")) + init_value<k3d::string_t>(\"No values yet\")),\n\t\tm_user_property_changed_signal(*this)\n\t{\n\t\tm_columns.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_rows.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_input_mesh.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_user_property_changed_signal.connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n  \t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t\tk3d::polyhedron::add_grid(Output, *polyhedron, 0, m_rows.pipeline_value(), m_columns.pipeline_value(), m_material.pipeline_value());\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tconst k3d::mesh* const input_mesh = m_input_mesh.pipeline_value();\n\t\tif(!input_mesh)\n\t\t\treturn;\n\t\t\n\t\tk3d::string_t variables = m_uv_rename.pipeline_value();\n\t\tstd::vector<k3d::string_t> functions;\n\t\tstd::vector<k3d::double_t> values(2, 0.0);\n\t\t\n\t//Collect functions and variables\n\t\tconst k3d::iproperty_collection::properties_t& properties = k3d::node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t{\n\t\t\tif(!dynamic_cast<k3d::iuser_property*>(*property))\n\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\tif((**property).property_type() == typeid(k3d::double_t))\n\t\t\t{\n\t\t\t\tvariables += \",\" + (**property).property_name();\n\t\t\t\tvalues.push_back(k3d::property::pipeline_value<k3d::double_t>(**property));\n\t\t\t}\n\t\t\telse if((**property).property_type() == typeid(k3d::string_t))\n\t\t\t{\n\t\t\t\tfunctions.push_back(k3d::property::pipeline_value<k3d::string_t>(**property));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tk3d::log() << warning << factory().name() << \": user property [\" << (**property).property_name() << \"] with unsupported type [\" << k3d::demangle((**property).property_type()) << \"] will be ignored\" << std::endl;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(!functions.size())\n\t\t\treturn;\n\t\t\n\t\tdetail::least_squares_solver_plotter solver_and_plotter;\n\t\ttry\n\t\t{ //Create the Solver and Parser the Functions\n\t\t\tsolver_and_plotter.create_function_parsers(functions, variables, factory().name());\n\t\t}\n\t\tcatch(...)\n\t\t{ //Couldn't parse the functions\n\t\t\treturn;\n\t\t}\n\t\tstd::vector<k3d::double_t> coefficients;\n\t\ttry\n\t\t{ // Solve the linear system for Least Squares Approximation\n\t\t\tcoefficients = solver_and_plotter.solve(*input_mesh->points.get(), values);\n\t\t}\n\t\tcatch(...)\n\t\t{ // Singular Matrix\n\t\t\tk3d::log() << warning << factory().name() << \": Couldn't solve the system singular matrix.\" << std::endl;\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t//Plot the result\n\t\tsolver_and_plotter.plot(const_cast<k3d::mesh::points_t&> (*Output.points).begin(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tm_rows.pipeline_value() + 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tm_columns.pipeline_value() + 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tm_width.pipeline_value(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tm_height.pipeline_value(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalues\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\n\t// Print the functions' coefficients\n\t\tk3d::string_t output_coefficients;\n\t\tfor(k3d::uint32_t func_index=0; func_index < functions.size() ; ++func_index)\n\t\t{\n\t\t\tstd::ostringstream o;\n\t\t\tif (!(o << coefficients[func_index] ))\n\t\t\t\tk3d::log() << error <<\"Could Convert it \" << std::endl;\n\t\t\t// Add every value\n\t\t\toutput_coefficients += o.str() + \" \";\n\t\t}\n\t\tm_output_coefficients.set_value(output_coefficients);\n\t\t\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<least_squares_plot, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0x0368fa56, 0xf1cb4ab7, 0xac1c22b3, 0xbbe53330),\n\t\t\t\"LeastSquaresPlot\",\n\t\t\t_(\"Aproximates points with a surface given a set of equations.\"),\n\t\t\t\"Math\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::mesh*, immutable_name, change_signal, no_undo, local_storage, no_constraint, read_only_property, no_serialization) m_input_mesh;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_uv_rename;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_columns;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_rows;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, read_only_property, no_serialization) m_output_coefficients;\n\t\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n\t\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// least_squares_plot_factory\n\nk3d::iplugin_factory& least_squares_plot_factory()\n{\n\treturn least_squares_plot::get_factory();\n}\n\n} // namespace plot\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/plot/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace plot\n{\n\nextern k3d::iplugin_factory& surface_plot_factory();\nextern k3d::iplugin_factory& least_squares_plot_factory();\n\n} // namespace plot\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::plot::surface_plot_factory());\n\tRegistry.register_factory(module::plot::least_squares_plot_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/plot/surface_plot.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com) Most of the code used for poly_grid\n\t\\author Joaquín Duo (joaduo@lugmen.org.ar) Adaptation to the function parser\n*/\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/expression/parser.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/iuser_property.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/user_property_changed_signal.h>\n\nnamespace module\n{\n\nnamespace plot\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// surface_plot\n\nclass surface_plot :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tsurface_plot(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_function(init_owner(*this) + init_name(\"function\") + init_label(_(\"Function\")) + init_description(_(\"Function to be plotted, in terms of u, v, and any scalar user properties added to the node.\")) + init_value(k3d::string_t(_(\"cos(sqrt(u^2+v^2))\")))),\n\t\tm_u_samples(init_owner(*this) + init_name(\"u_samples\") + init_label(_(\"U Samples\")) + init_description(_(\"Number of samples along the u dimension.\")) + init_value(15) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_samples(init_owner(*this) + init_name(\"v_samples\") + init_label(_(\"V Samples\")) + init_description(_(\"Number of samples along the v dimension.\")) + init_value(15) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_u_size(init_owner(*this) + init_name(\"u_size\") + init_label(_(\"U Size\")) + init_description(_(\"Plot size along the u dimension.\")) + init_value(20.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_v_size(init_owner(*this) + init_name(\"v_size\") + init_label(_(\"V Size\")) + init_description(_(\"Plot size along the v dimension.\")) + init_value(20.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_orientation(init_owner(*this) + init_name(\"orientation\") + init_label(_(\"Orientation\")) + init_description(_(\"Plot orientation (positive or negative along the X, Y or Z axis).\")) + init_value(k3d::PZ) + init_enumeration(k3d::signed_axis_values())),\n\t\tm_user_property_changed_signal(*this)\n\t{\n\t\tm_u_samples.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_v_samples.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\t\n\t\tm_function.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_u_size.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_v_size.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_orientation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\n\t\tm_user_property_changed_signal.connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t\tk3d::polyhedron::add_grid(Output, *polyhedron, 0, m_v_samples.pipeline_value(), m_u_samples.pipeline_value(), m_material.pipeline_value());\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tconst k3d::string_t function = m_function.pipeline_value();\n\n\t\tk3d::string_t variables(\"u,v\");\n\t\tstd::vector<k3d::double_t> values(2, 0.0);\n\n\t\tconst k3d::iproperty_collection::properties_t& properties = k3d::node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator property = properties.begin(); property != properties.end(); ++property)\n\t\t{\n\t\t\tif(!dynamic_cast<k3d::iuser_property*>(*property))\n\t\t\t\tcontinue;\n\n\t\t\tif((**property).property_type() != typeid(k3d::double_t))\n\t\t\t{\n\t\t\t\tk3d::log() << warning << factory().name() << \": user property [\" << (**property).property_name() << \"] with unsupported type [\" << k3d::demangle((**property).property_type()) << \"] will be ignored\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvariables += \",\" + (**property).property_name();\n\t\t\tvalues.push_back(k3d::property::pipeline_value<k3d::double_t>(**property));\n\t\t}\n\n\t\tk3d::expression::parser parser;\n\t\tif(!parser.parse(function, variables))\n\t\t{\n\t\t\tk3d::log() << error << factory().name() << \": function parsing failed: \" << parser.last_parse_error() << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::int32_t point_v_samples = m_v_samples.pipeline_value() + 1;\n\t\tconst k3d::int32_t point_u_samples = m_u_samples.pipeline_value() + 1;\n\t\tconst k3d::double_t u_size = m_u_size.pipeline_value();\n\t\tconst k3d::double_t v_size = m_v_size.pipeline_value();\n\t\tconst k3d::signed_axis orientation = m_orientation.pipeline_value();\n\n\t\tk3d::vector3 i, j, k;\n\t\tswitch(orientation)\n\t\t{\n\t\t\tcase k3d::PX:\n\t\t\t\ti = k3d::vector3(0, 1, 0);\n\t\t\t\tj = k3d::vector3(0, 0, 1);\n\t\t\t\tk = k3d::vector3(1, 0, 0);\n\t\t\t\tbreak;\n\t\t\tcase k3d::NX:\n\t\t\t\ti = k3d::vector3(0, 1, 0);\n\t\t\t\tj = k3d::vector3(0, 0, -1);\n\t\t\t\tk = k3d::vector3(-1, 0, 0);\n\t\t\t\tbreak;\n\t\t\tcase k3d::PY:\n\t\t\t\ti = k3d::vector3(0, 0, 1);\n\t\t\t\tj = k3d::vector3(1, 0, 0);\n\t\t\t\tk = k3d::vector3(0, 1, 0);\n\t\t\t\tbreak;\n\t\t\tcase k3d::NY:\n\t\t\t\ti = k3d::vector3(0, 0, 1);\n\t\t\t\tj = k3d::vector3(-1, 0, 0);\n\t\t\t\tk = k3d::vector3(0, -1, 0);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase k3d::PZ:\n\t\t\t\ti = k3d::vector3(1, 0, 0);\n\t\t\t\tj = k3d::vector3(0, 1, 0);\n\t\t\t\tk = k3d::vector3(0, 0, 1);\n\t\t\t\tbreak;\n\t\t\tcase k3d::NZ:\n\t\t\t\ti = k3d::vector3(1, 0, 0);\n\t\t\t\tj = k3d::vector3(0, -1, 0);\n\t\t\t\tk = k3d::vector3(0, 0, -1);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tk3d::mesh::points_t::iterator point = const_cast<k3d::mesh::points_t&>(*Output.points).begin();\n\t\tfor(k3d::int32_t row = 0; row != point_v_samples; ++row)\n\t\t{\n\t\t\tconst k3d::double_t row_percent = k3d::ratio(row, point_v_samples - 1);\n\t\t\t\n\t\t\tfor(k3d::int32_t column = 0; column != point_u_samples; ++column)\n\t\t\t{\n\t\t\t\tconst k3d::double_t column_percent = k3d::ratio(column, point_u_samples - 1);\n\n\t\t\t\tconst k3d::double_t u = k3d::mix(-0.5 * u_size, 0.5 * u_size, column_percent);\n\t\t\t\tconst k3d::double_t v = k3d::mix(-0.5 * v_size, 0.5 * v_size, row_percent);\n\n\t\t\t\tvalues[0] = u;\n\t\t\t\tvalues[1] = v;\n\t\t\t\tconst k3d::double_t w = parser.evaluate(&values[0]);\n\n\t\t\t\t*point++ = k3d::to_point((u * i) + (v * j) + (w * k));\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<surface_plot, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0xf2434d00, 0xd54a4482, 0xaea14eb6, 0x40a967d3),\n\t\t\t\"SurfacePlot\",\n\t\t\t_(\"Creates a 3D surface plot.\"),\n\t\t\t\"Math\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_function;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_samples;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_samples;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_u_size;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_v_size;\n\tk3d_data(k3d::signed_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_orientation;\n\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// surface_plot_factory\n\nk3d::iplugin_factory& surface_plot_factory()\n{\n\treturn surface_plot::get_factory();\n}\n\n} // namespace plot\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/ply_io/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-ply-io)\nK3D_CREATE_MODULE_PROXY(k3d-ply-io)\n\n"
  },
  {
    "path": "modules/ply_io/mesh_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/file_helpers.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_reader.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace ply\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_reader\n\nclass mesh_reader :\n\tpublic k3d::material_sink<k3d::mesh_reader<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_reader<k3d::node > > base;\n\npublic:\n\tmesh_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_load_mesh(const k3d::filesystem::path& Path, k3d::mesh& Output)\n\t{\n\t\tk3d::filesystem::ifstream file(Path);\n\t\tif(!file)\n\t\t\treturn;\n\n\t\tk3d::string_t magic_number;\n\t\tk3d::getline(file, magic_number);\n\t\tif(magic_number != \"ply\")\n\t\t{\n\t\t\tk3d::log() << error << \"Not a Stanford PLY file: \" << Path.native_console_string() << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::string_t format;\n\t\tk3d::getline(file, format);\n\t\tif(format != \"format ascii 1.0\")\n\t\t{\n\t\t\tk3d::log() << error << \"Not an ascii format PLY file: \" << Path.native_console_string() << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tstd::vector<k3d::string_t> element_types;\n\t\tstd::vector<k3d::uint_t> element_counts;\n\t\n\t\twhile(true)\n\t\t{\n\t\t\tstd::stringstream line_buffer;\n\t\t\tk3d::getline(file, line_buffer);\n\t\t\tif(!file)\n\t\t\t\tbreak;\n\n\t\t\tk3d::string_t keyword;\n\t\t\tline_buffer >> keyword;\n\n\t\t\tif(keyword == \"comment\")\n\t\t\t{\n\t\t\t}\n\t\t\telse if(keyword == \"element\")\n\t\t\t{\n\t\t\t\tk3d::string_t element_type;\n\t\t\t\tsize_t element_count = 0;\n\t\t\t\tline_buffer >> element_type >> element_count;\n\n\t\t\t\telement_types.push_back(element_type);\n\t\t\t\telement_counts.push_back(element_count);\n\t\t\t}\n\t\t\telse if(keyword == \"property\")\n\t\t\t{\n\t\t\t}\n\t\t\telse if(keyword == \"end_header\")\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor(k3d::uint_t i = 0; i != element_types.size(); ++i)\n\t\t{\n\t\t\tconst k3d::string_t element_type = element_types[i];\n\t\t\tconst k3d::uint_t element_count = element_counts[i];\n\t\t\t\n\t\t\tk3d::log() << info << \"Reading \" << element_count << \" elements of type: \" << element_type << std::endl;\n\n\t\t\tif(element_type == \"vertex\")\n\t\t\t{\n\t\t\t\tk3d::mesh::points_t& points = Output.points.create(new k3d::mesh::points_t(element_count));\n\t\t\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create(new k3d::mesh::selection_t(element_count, 0.0));\n\n\t\t\t\tfor(k3d::uint_t j = 0; j != element_count; ++j)\n\t\t\t\t{\n\t\t\t\t\tstd::stringstream line_buffer;\n\t\t\t\t\tk3d::getline(file, line_buffer);\n\t\t\t\t\tif(!file)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"Unexpected end-of-file: \" << Path.native_console_string() << std::endl;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tk3d::point3 point;\n\t\t\t\t\tline_buffer >> point[0] >> point[1] >> point[2];\n\t\t\t\t\t\n\t\t\t\t\tpoints[j] = point;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(element_type == \"face\")\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\t\n\t\t\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\t\t\tpolyhedron->face_shells.reserve(element_count);\n\t\t\t\tpolyhedron->face_first_loops.reserve(element_count);\n\t\t\t\tpolyhedron->face_loop_counts.reserve(element_count);\n\t\t\t\tpolyhedron->face_selections.reserve(element_count);\n\t\t\t\tpolyhedron->face_materials.reserve(element_count);\n\t\t\t\tpolyhedron->loop_first_edges.reserve(element_count);\n\t\t\t\tpolyhedron->clockwise_edges.reserve(3 * element_count);\n\t\t\t\tpolyhedron->edge_selections.reserve(3 * element_count);\n\t\t\t\tpolyhedron->vertex_points.reserve(3 * element_count);\n\t\t\t\tpolyhedron->vertex_selections.reserve(3 * element_count);\n\t\t\t\t\n\t\t\t\tfor(k3d::uint_t j = 0; j != element_count; ++j)\n\t\t\t\t{\n\t\t\t\t\tstd::stringstream line_buffer;\n\t\t\t\t\tk3d::getline(file, line_buffer);\n\t\t\t\t\tif(!file)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << \"Unexpected end-of-file: \" << Path.native_console_string() << std::endl;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tk3d::uint_t point_count = 0;\n\t\t\t\t\tline_buffer >> point_count;\n\n\t\t\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\t\tpolyhedron->face_selections.push_back(0.0);\n\t\t\t\t\tpolyhedron->face_materials.push_back(0);\n\t\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\t\t\t\t\t\n\t\t\t\t\tfor(k3d::uint_t k = 0; k != point_count; ++k)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::uint_t point = 0;\n\t\t\t\t\t\tline_buffer >> point;\n\n\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0.0);\n\t\t\t\t\t\tpolyhedron->vertex_points.push_back(point);\n\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0.0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif(polyhedron->loop_first_edges.size() && polyhedron->clockwise_edges.size())\n\t\t\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_reader, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0x6b0ac805, 0xc3094636, 0x972b80aa, 0x61437211),\n\t\t\t\"PLYMeshReader\",\n\t\t\t_(\"Mesh source that reads external Stanford PLY (.ply) files\"),\n\t\t\t\"MeshReader\");\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& mesh_reader_factory()\n{\n\treturn mesh_reader::get_factory();\n}\n\n} // namespace io\n\n} // namespace ply\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/ply_io/mesh_writer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/mesh_writer.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/triangulator.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace ply\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_writer\n\nclass mesh_writer :\n\tpublic k3d::mesh_writer<k3d::node >\n{\n\ttypedef k3d::mesh_writer<k3d::node > base;\n\npublic:\n\tmesh_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_writer, k3d::interface_list<k3d::imesh_sink > > factory(\n\t\t\tk3d::uuid(0x3b1829f4, 0xbc428bad, 0xa991e8b1, 0xcaaee7a5),\n\t\t\t\"PLYMeshWriter\",\n\t\t\t_(\"Mesh writer that saves external Stanford PLY (.ply) files\"),\n\t\t\t\"MeshWriter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tclass triangulator :\n\t\tpublic k3d::triangulator\n\t{\n\t\ttypedef k3d::triangulator base;\n\n\tpublic:\n\t\ttriangulator(k3d::mesh::points_t& Points, k3d::mesh::indices_t& Vertices) :\n\t\t\tpoints(Points),\n\t\t\tvertices(Vertices)\n\t\t{\n\t\t}\n\n\t\tvoid process(const k3d::mesh& Mesh, const k3d::polyhedron::const_primitive& Polyhedron)\n\t\t{\n\t\t\tbase::process(Mesh, Polyhedron);\n\t\t}\n\n\tprivate:\n\t\tvoid add_vertex(const k3d::point3& Coordinates, k3d::uint_t Vertices[4], k3d::uint_t Edges[4], double Weights[4], k3d::uint_t& NewVertex)\n\t\t{\n\t\t\tNewVertex = points.size();\n\t\t\tpoints.push_back(Coordinates);\n\t\t}\n\n\t\tvoid add_triangle(k3d::uint_t Vertices[3], k3d::uint_t Edges[3])\n\t\t{\n\t\t\tvertices.push_back(Vertices[0]);\n\t\t\tvertices.push_back(Vertices[1]);\n\t\t\tvertices.push_back(Vertices[2]);\n\t\t}\n\n\t\tk3d::mesh::points_t& points;\n\t\tk3d::mesh::indices_t& vertices;\n\t};\n\n\tvoid on_write_mesh(const k3d::mesh& Input, const k3d::filesystem::path& OutputPath, std::ostream& Output)\n\t{\n\t\t// Convert input polyhedra to triangles ...\n\t\tk3d::mesh::points_t points;\n\t\tk3d::mesh::indices_t vertices;\n\n\t\tif(Input.points)\n\t\t\tpoints = *Input.points;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Input, **primitive));\n\t\t\tif(polyhedron)\n\t\t\t\ttriangulator(points, vertices).process(Input, *polyhedron);\n\t\t}\n\n\t\t// Write header data ...\n\t\tOutput << \"ply\\n\";\n\t\tOutput << \"format ascii 1.0\\n\";\n\t\tOutput << \"comment Written by K-3D \" << K3D_VERSION << \"\\n\";\n\n\t\tOutput << \"element vertex \" << points.size() << \"\\n\";\n\t\tOutput << \"property float x\\n\";\n\t\tOutput << \"property float y\\n\";\n\t\tOutput << \"property float z\\n\";\n\n\t\tOutput << \"element face \" << vertices.size() / 3 << \"\\n\";\n\t\tOutput << \"property list uchar int vertex_indices\\n\";\n\t\t\n\t\tOutput << \"end_header\\n\";\n\n\t\t// Write vertex data ...\n\t\tstd::copy(points.begin(), points.end(), std::ostream_iterator<k3d::point3>(Output, \"\\n\"));\n\n\t\t// Write face data ...\n\t\tconst k3d::uint_t vertex_begin = 0;\n\t\tconst k3d::uint_t vertex_end = vertex_begin + vertices.size();\n\t\tfor(k3d::uint_t vertex = vertex_begin; vertex != vertex_end; ++vertex)\n\t\t{\n\t\t\tswitch(vertex % 3)\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\tOutput << \"3 \" << vertices[vertex];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\tOutput << \" \" << vertices[vertex];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tOutput << \" \" << vertices[vertex] << \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n};\n\nk3d::iplugin_factory& mesh_writer_factory()\n{\n\treturn mesh_writer::get_factory();\n}\n\n} // namespace io\n\n} // namespace ply\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/ply_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace ply\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& mesh_reader_factory();\nextern k3d::iplugin_factory& mesh_writer_factory();\n\n} // namespace io\n\n} // namespace ply\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::ply::io::mesh_reader_factory());\n\tRegistry.register_factory(module::ply::io::mesh_writer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/png_io/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_ZLIB_INCLUDE_DIRS}) # Seems to be needed on MinGW\nINCLUDE_DIRECTORIES(${K3D_PNG_INCLUDE_DIRS})\n\nK3D_BUILD_MODULE(k3d-png-io)\nK3D_CREATE_MODULE_PROXY(k3d-png-io)\n\nTARGET_LINK_LIBRARIES(k3d-png-io ${K3D_PNG_LIBS})\n\n"
  },
  {
    "path": "modules/png_io/bitmap_importer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/ibitmap_importer.h>\n#include <k3dsdk/path.h>\n\n#define png_infopp_NULL (png_infopp)NULL\n#define int_p_NULL (int*)NULL\n\n#include <boost/assign/list_of.hpp>\n#include <boost/gil/extension/io/png.hpp>\n\nnamespace module\n{\n\nnamespace png\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_importer\n\nclass bitmap_importer :\n\tpublic k3d::ibitmap_importer\n{\npublic:\n\tbitmap_importer()\n\t{\n\t}\n\n\tbool read_file(const k3d::filesystem::path& File, k3d::bitmap& Bitmap)\n\t{\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Reading \" << File.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\t\t\tboost::gil::read_and_convert_image(File.native_filesystem_string(), Bitmap, boost::gil::png_tag());\n\t\t\treturn true;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t\treturn false;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<bitmap_importer,\n\t\t\tk3d::interface_list<k3d::ibitmap_importer> > factory(\n\t\t\t\tk3d::uuid(0xac17627d, 0xaa8848fd, 0xb621bd81, 0x4ba02136),\n\t\t\t\t\"PNGBitmapImporter\",\n\t\t\t\t_(\"PNG (*.png)\"),\n\t\t\t\t\"Bitmap BitmapImporter\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tboost::assign::map_list_of(\"k3d:load-order\", \"8\")(\"k3d:mime-types\", \"image/png\"));\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_importer_factory\n\nk3d::iplugin_factory& bitmap_importer_factory()\n{\n\treturn bitmap_importer::get_factory();\n}\n\n} // namespace io\n\n} // namespace png\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/png_io/bitmap_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_source.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/path.h>\n\n#define png_infopp_NULL (png_infopp)NULL\n#define int_p_NULL (int*)NULL\n\n#include <boost/gil/extension/io/png.hpp>\n\nnamespace module\n{\n\nnamespace png\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_reader\n\nclass bitmap_reader :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_source<bitmap_reader>\n{\n\ttypedef k3d::node base;\n\npublic:\n\tbitmap_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Browse for an input bitmap\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::bitmaps()))\n\t{\n\t\tm_file.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_bitmap_slot()));\n\t}\n\n\tvoid on_resize_bitmap(k3d::bitmap& Output)\n\t{\n\t\tconst k3d::filesystem::path file = m_file.pipeline_value();\n\t\tif(file.empty())\n\t\t\treturn;\n\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Reading \" << file.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\t\t\tboost::gil::read_and_convert_image(file.native_filesystem_string(), Output, boost::gil::png_tag());\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t}\n\t}\n\n\tvoid on_assign_pixels(k3d::bitmap& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bitmap_reader,\n\t\t\tk3d::interface_list<k3d::ibitmap_source> > factory(\n\t\t\t\tk3d::uuid(0x20fb9aae, 0x1e4fb977, 0xc4dbcfad, 0x9d66568e),\n\t\t\t\t\"PNGBitmapReader\",\n\t\t\t\t_(\"Loads a PNG (*.png) bitmap from the filesystem\"),\n\t\t\t\t\"Bitmap BitmapReader\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_reader_factory\n\nk3d::iplugin_factory& bitmap_reader_factory()\n{\n\treturn bitmap_reader::get_factory();\n}\n\n} // namespace io\n\n} // namespace png\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/png_io/bitmap_writer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_sink.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n\n#define png_infopp_NULL (png_infopp)NULL\n#define int_p_NULL (int*)NULL\n\n#include <boost/gil/extension/io/png.hpp>\n\nnamespace module\n{\n\nnamespace png\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_writer\n\nclass bitmap_writer :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_sink<bitmap_writer>\n{\n\ttypedef k3d::node base;\n\npublic:\n\tbitmap_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Output file\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::WRITE) + init_path_type(\"png_files\"))\n\t{\n\t\tm_file.changed_signal().connect(make_input_changed_slot());\n\t}\n\n\tvoid on_input_changed(k3d::ihint*)\n\t{\n\t\ttry\n\t\t{\n\t\t\tconst k3d::filesystem::path file = m_file.pipeline_value();\n\t\t\tif(file.empty())\n\t\t\t\treturn;\n\n\t\t\tk3d::bitmap* const bitmap = m_input_bitmap.pipeline_value();\n\t\t\tif(!bitmap)\n\t\t\t\treturn;\n\n\t\t\tif(!bitmap->width())\n\t\t\t\tthrow std::runtime_error(\"bitmap with zero width\");\n\n\t\t\tif(!bitmap->height())\n\t\t\t\tthrow std::runtime_error(\"bitmap with zero height\");\n\n\t\t\tk3d::log() << info << \"Writing \" << file.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\t\t\tboost::gil::write_view(file.native_filesystem_string(), boost::gil::color_converted_view<boost::gil::rgba8_pixel_t>(view(*bitmap)), boost::gil::png_tag());\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bitmap_writer,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink > > factory(\n\t\t\t\tk3d::uuid(0x3bf6aa31, 0xb944432c, 0xca32a681, 0x8c6e07e8),\n\t\t\t\t\"PNGBitmapWriter\",\n\t\t\t\t_(\"Bitmap writer that saves PNG (*.png) files\"),\n\t\t\t\t\"Bitmap BitmapWriter\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n};\n\nk3d::iplugin_factory& bitmap_writer_factory()\n{\n\treturn bitmap_writer::get_factory();\n}\n\n} // namespace io\n\n} // namespace png\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/png_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace png\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& bitmap_importer_factory();\nextern k3d::iplugin_factory& bitmap_reader_factory();\nextern k3d::iplugin_factory& bitmap_writer_factory();\n\n} // namespace io\n\n} // namespace png\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::png::io::bitmap_importer_factory());\n\tRegistry.register_factory(module::png::io::bitmap_reader_factory());\n\tRegistry.register_factory(module::png::io::bitmap_writer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/polyhedron/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-polyhedron EXCLUDE_SOURCES bevel_faces.cpp fillet_edges.cpp)\nK3D_CREATE_MODULE_PROXY(k3d-polyhedron)\n\n"
  },
  {
    "path": "modules/polyhedron/bevel_faces.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/legacy_mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility.h>\n\n#include \"helpers.h\"\n\n#include <set>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace detail\n{\n\n/// Caches new geometry for better interactive performance\nclass bevel_edge\n{\npublic:\n\tbevel_edge(const k3d::point3& StartPosition, const k3d::point3& EndPosition, k3d::legacy::point* Point) :\n\t\tstart_position(StartPosition),\n\t\tend_position(EndPosition),\n\t\tpoint(Point)\n\t{\n\t}\n\n\tvoid update(const double Offset, const bool Length)\n\t{\n\t\tdouble edge_offset = Offset;\n\t\tif(!Length)\n\t\t{\n\t\t\t// Offset gives position on the edge\n\t\t\tif(Offset > 1)\n\t\t\t\tedge_offset = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Offset is a length from start_position\n\t\t\tconst double length = k3d::distance(end_position, start_position);\n\t\t\tif(length)\n\t\t\t\tedge_offset = Offset / length;\n\t\t}\n\n\t\tpoint->position = start_position + (end_position - start_position) * edge_offset;\n\t}\n\nprivate:\n\tk3d::point3 start_position;\n\tk3d::point3 end_position;\n\tk3d::legacy::point* point;\n};\n\ntypedef std::vector<bevel_edge> bevel_edges_t;\n\nclass face_point\n{\npublic:\n\tface_point(const k3d::point3& OldPosition, const k3d::vector3& InsetDirection, k3d::legacy::point& Point) :\n\t\told_position(OldPosition),\n\t\tinset_direction(InsetDirection),\n\t\tpoint(&Point)\n\t{\n\t}\n\n\tvoid update(const double Inset)\n\t{\n\t\tpoint->position = old_position + (Inset * inset_direction);\n\t}\n\nprivate:\n\tk3d::point3 old_position;\n\tk3d::vector3 inset_direction;\n\tk3d::legacy::point* point;\n};\n\ntypedef std::vector<face_point> face_points_t;\n\n/// Bevel point function\ntypedef std::vector<k3d::legacy::split_edge*> edges_t;\ntypedef std::map<k3d::legacy::point*, edges_t> points_and_edges_t;\ntypedef std::map<k3d::legacy::point*, k3d::imaterial*> point_materials_t;\ntypedef std::vector<k3d::legacy::face*> faces_t;\n\ntypedef std::vector<edges_t> edge_lists_t;\nedge_lists_t link_edges;\n\ntypedef std::map<k3d::legacy::split_edge*, k3d::legacy::face*> edge_to_face_t;\n\n// Subdivide edges\nbool subdivide_edges(k3d::legacy::face& Face, k3d::legacy::mesh& Mesh, bevel_edges_t& BevelEdges, face_points_t& FacePoints, edge_to_face_t& EdgeToFace)\n{\n\t// Calculate the face normal\n\tk3d::normal3 face_normal = k3d::legacy::normal(Face);\n\tif(0.0 == face_normal.length2())\n\t\treturn false;\n\n\tface_normal = k3d::normalize(face_normal);\n\n\t// Store face edges\n\tedges_t face_edges;\n\tk3d::legacy::split_edge* edge = Face.first_edge;\n\tdo\n\t{\n\t\tface_edges.push_back(edge);\n\n\t\tedge = edge->face_clockwise;\n\t}\n\twhile(edge != Face.first_edge);\n\n\t// Offset face points\n\tconst unsigned long n = face_edges.size();\n\tfor(unsigned long i = 0; i < n; ++i)\n\t{\n\t\tedge = face_edges[i];\n\t\tk3d::legacy::split_edge* previous_edge = face_edges[(i + n-1) % n];\n\n\t\tconst k3d::vector3 e1 = edge->vertex->position - previous_edge->vertex->position;\n\t\tconst k3d::vector3 e2 = edge->face_clockwise->vertex->position - edge->vertex->position;\n\t\tconst k3d::vector3 e3 = k3d::normalize(e1 ^ face_normal);\n\t\tconst k3d::vector3 e4 = k3d::normalize(e2 ^ face_normal);\n\n\t\tconst k3d::vector3 inset_direction = (-1 / cos(acos(e3 * e4) / 2)) * k3d::normalize(e3 + e4);\n\t\tFacePoints.push_back(face_point(edge->vertex->position, inset_direction, *edge->vertex));\n\t}\n\n\t// Make sure it's an interior face\n\tfor(edges_t::reverse_iterator edge_i = face_edges.rbegin(); edge_i != face_edges.rend(); ++edge_i)\n\t{\n\t\tedge = *edge_i;\n\n\t\tif(!edge->companion)\n\t\t\treturn false;\n\n\t\tk3d::legacy::split_edge* stop = k3d::legacy::face_anticlockwise(edge);\n\n\t\t// Get subdivided edge\n\t\tk3d::legacy::split_edge* subdivided_edge = edge->companion->face_clockwise;\n\n\t\tdo\n\t\t{\n\t\t\tif(!subdivided_edge->companion)\n\t\t\t\treturn false;\n\n\t\t\tk3d::legacy::split_edge* next_edge = subdivided_edge->companion->face_clockwise;\n\n\t\t\t// Next edge\n\t\t\tsubdivided_edge = next_edge;\n\t\t}\n\t\twhile(subdivided_edge->companion != stop);\n\t}\n\n\tedges_t bevel_edges;\n\n\tfor(edges_t::reverse_iterator edge_i = face_edges.rbegin(); edge_i != face_edges.rend(); ++edge_i)\n\t{\n\t\tedge = *edge_i;\n\n\t\tif(!edge->companion)\n\t\t\treturn false;\n\n\t\tk3d::legacy::split_edge* stop = k3d::legacy::face_anticlockwise(edge);\n\n\t\t// Get subdivided edge\n\t\tk3d::legacy::split_edge* subdivided_edge = edge->companion->face_clockwise;\n\n\t\tdo\n\t\t{\n\t\t\tk3d::legacy::split_edge* next_edge = subdivided_edge->companion->face_clockwise;\n\n\t\t\t// Save original values\n\t\t\tconst k3d::point3& start_position = subdivided_edge->vertex->position;\n\t\t\tconst k3d::point3& end_position = subdivided_edge->face_clockwise->vertex->position;\n\n\t\t\t// Create new point\n\t\t\tk3d::legacy::point* new_point = helpers::append_edge(subdivided_edge);\n\t\t\tMesh.points.push_back(new_point);\n\n\t\t\t// Cache edge\n\t\t\tBevelEdges.push_back(bevel_edge(start_position, end_position, new_point));\n\n\t\t\t// Save new edges' faces\n\t\t\tEdgeToFace.insert(std::make_pair(subdivided_edge->face_clockwise, EdgeToFace[subdivided_edge]));\n\t\t\tEdgeToFace.insert(std::make_pair(subdivided_edge->companion, EdgeToFace[subdivided_edge->face_clockwise->companion]));\n\n\t\t\t// Save vertices to be connected\n\t\t\tbevel_edges.push_back(subdivided_edge->face_clockwise);\n\t\t\tbevel_edges.push_back(subdivided_edge->companion);\n\n\t\t\t// Next edge\n\t\t\tsubdivided_edge = next_edge;\n\t\t}\n\t\twhile(subdivided_edge->companion != stop);\n\t}\n\n\tlink_edges.push_back(bevel_edges);\n\n\treturn true;\n}\n\n/// Connects two vertices belonging to the same face\nk3d::legacy::face* connect_vertices(k3d::legacy::face* Face, k3d::legacy::split_edge* Edge1, k3d::legacy::split_edge* Edge2, edge_to_face_t& EdgeToFace, faces_t& SideFaces)\n{\n\t// Make new edge loops\n\tk3d::legacy::split_edge* new_edge1 = new k3d::legacy::split_edge(Edge1->vertex, Edge2);\n\tk3d::legacy::split_edge* new_edge2 = new k3d::legacy::split_edge(Edge2->vertex, Edge1);\n\n\tk3d::legacy::split_edge* anti_edge1 = k3d::legacy::face_anticlockwise(Edge1);\n\tk3d::legacy::split_edge* anti_edge2 = k3d::legacy::face_anticlockwise(Edge2);\n\n\tanti_edge1->face_clockwise = new_edge1;\n\tanti_edge2->face_clockwise = new_edge2;\n\n\tk3d::legacy::join_edges(*new_edge1, *new_edge2);\n\n\t// Create a second face for ear cut\n\tk3d::legacy::face* new_face = 0;\n\tif(helpers::edge_in_face(Face->first_edge, Edge1))\n\t{\n\t\tnew_face = new k3d::legacy::face(Edge2, Face->material);\n\t\tSideFaces.push_back(Face);\n\t}\n\telse\n\t{\n\t\tnew_face = new k3d::legacy::face(Edge1, Face->material);\n\t\tSideFaces.push_back(new_face);\n\t}\n\n\t// Assign new face to edges\n\tk3d::legacy::split_edge* edge = new_face->first_edge;\n\tdo\n\t{\n\t\tEdgeToFace[edge] = new_face;\n\n\t\tedge = edge->face_clockwise;\n\t}\n\twhile(edge != new_face->first_edge);\n\n\treturn new_face;\n}\n\n// Connect subdivision vertices\nvoid bevel_faces(edge_to_face_t& EdgeToFace, faces_t& NewFaces, faces_t& SideFaces)\n{\n\tfor(edge_lists_t::iterator list = link_edges.begin(); list != link_edges.end(); ++list)\n\t{\n\t\tedges_t& edges = *list;\n\t\tconst unsigned long n = edges.size();\n\t\tfor(unsigned long i = 1; i < n; i += 2)\n\t\t{\n\t\t\tk3d::legacy::split_edge* edge1 = edges[i];\n\t\t\tk3d::legacy::split_edge* edge2 = edges[(i + 1) % n];\n\t\t\tk3d::legacy::face* face = connect_vertices(EdgeToFace[edge1], edge1, edge2, EdgeToFace, SideFaces);\n\t\t\tif(face)\n\t\t\t{\n\t\t\t\tNewFaces.push_back(face);\n\t\t\t}\n\t\t}\n\t}\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// bevel_faces_implementation\n\nclass bevel_faces_implementation :\n\tpublic k3d::mesh_selection_sink<k3d::legacy::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::legacy::mesh_modifier<k3d::node > > base;\n\npublic:\n\tbevel_faces_implementation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_offset(init_owner(*this) + init_name(\"offset\") + init_label(_(\"Offset\")) + init_description(_(\"Offset along external edges\")) + init_value(0.3) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_inset(init_owner(*this) + init_name(\"inset\") + init_label(_(\"Inset\")) + init_description(_(\"Inset of bevelled face\")) + init_value(0.3) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_distance(init_owner(*this) + init_name(\"distance\") + init_label(_(\"Distance\")) + init_description(_(\"Use distance instead of edge offset\")) + init_value(false)),\n\t\tm_select_side_faces(init_owner(*this) + init_name(\"select_side_faces\") + init_label(_(\"Select side faces\")) + init_description(_(\"Select side faces on output, doesn't change selection if off\")) + init_value(true))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\n\t\tm_offset.changed_signal().connect(make_update_mesh_slot());\n\t\tm_inset.changed_signal().connect(make_update_mesh_slot());\n\t\tm_distance.changed_signal().connect(make_update_mesh_slot());\n\t\tm_select_side_faces.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\t/** \\todo Improve the implementation so we don't have to do this */\n\tk3d::iunknown* on_rewrite_hint(iunknown* const Hint)\n\t{\n\t\t// Force updates to re-allocate our mesh, for simplicity\n\t\treturn 0;\n\t}\n\n\tvoid on_initialize_mesh(const k3d::legacy::mesh& InputMesh, k3d::legacy::mesh& Mesh)\n\t{\n\t\t// Clear previously cached data\n\t\tm_bevel_edges.clear();\n\t\tm_face_points.clear();\n\t\tm_new_faces.clear();\n\t\tm_side_faces.clear();\n\n\t\tdetail::link_edges.clear();\n\n\t\t// Create output geometry\n\t\tk3d::legacy::deep_copy(InputMesh, Mesh);\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Mesh);\n\n\t\tfor(k3d::legacy::mesh::polyhedra_t::iterator polyhedron_i = Mesh.polyhedra.begin(); polyhedron_i != Mesh.polyhedra.end(); ++polyhedron_i)\n\t\t{\n\t\t\tk3d::legacy::polyhedron& polyhedron = **polyhedron_i;\n\n\t\t\t// Get the set of all selected faces ...\n\t\t\tk3d::legacy::polyhedron::faces_t selected_faces;\n\t\t\tk3d::copy_if(polyhedron.faces.begin(), polyhedron.faces.end(), std::inserter(selected_faces, selected_faces.end()), k3d::is_selected());\n\n\t\t\tif(selected_faces.empty())\n\t\t\t\tselected_faces = polyhedron.faces;\n\n\t\t\t// Create an edge-to-face map\n\t\t\tdetail::edge_to_face_t edge_to_face;\n\t\t\tfor(k3d::legacy::polyhedron::faces_t::iterator face = polyhedron.faces.begin(); face != polyhedron.faces.end(); ++face)\n\t\t\t{\n\t\t\t\tk3d::legacy::split_edge* edge = (*face)->first_edge;\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tedge_to_face.insert(std::make_pair(edge, *face));\n\n\t\t\t\t\tedge = edge->face_clockwise;\n\t\t\t\t}\n\t\t\t\twhile(edge != (*face)->first_edge);\n\t\t\t}\n\n\t\t\t// For each face ...\n\t\t\tfor(k3d::legacy::polyhedron::faces_t::iterator selected_face = selected_faces.begin(); selected_face != selected_faces.end(); ++selected_face)\n\t\t\t{\n\t\t\t\t// Save original edges and create new points\n\t\t\t\tif(detail::subdivide_edges(**selected_face, Mesh, m_bevel_edges, m_face_points, edge_to_face))\n\t\t\t\t{\n\t\t\t\t\tm_new_faces.push_back(*selected_face);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Join new points\n\t\t\tdetail::faces_t new_faces;\n\t\t\tdetail::bevel_faces(edge_to_face, new_faces, m_side_faces);\n\t\t\tpolyhedron.faces.insert(polyhedron.faces.end(), new_faces.begin(), new_faces.end());\n\t\t\tm_new_faces.insert(m_new_faces.end(), new_faces.begin(), new_faces.end());\n\n\t\t\tassert_warning(k3d::legacy::is_valid(polyhedron));\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::legacy::mesh& InputMesh, k3d::legacy::mesh& Mesh)\n\t{\n\t\tconst double offset = m_offset.pipeline_value();\n\t\tconst bool distance = m_distance.pipeline_value();\n\n\t\tfor(detail::bevel_edges_t::iterator point = m_bevel_edges.begin(); point != m_bevel_edges.end(); ++point)\n\t\t\tpoint->update(offset, distance);\n\n\t\tconst double inset = m_inset.pipeline_value();\n\t\tfor(detail::face_points_t::iterator face_point = m_face_points.begin(); face_point != m_face_points.end(); ++face_point)\n\t\t\tface_point->update(inset);\n\n\t\tconst double weight = m_select_side_faces.pipeline_value() ? 1.0 : 0.0;\n\t\tfor(detail::faces_t::iterator face = m_side_faces.begin(); face != m_side_faces.end(); ++face)\n\t\t\t(*face)->selection_weight = weight;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bevel_faces_implementation,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xc3ca122a, 0x9e8b46dc, 0xa6649135, 0xd68ac1a6),\n\t\t\t\t\"BevelFaces\",\n\t\t\t\t\"Bevels each selected face\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tdetail::bevel_edges_t m_bevel_edges;\n\tdetail::face_points_t m_face_points;\n\tdetail::faces_t m_new_faces;\n\tdetail::faces_t m_side_faces;\n\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_offset;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_inset;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_distance;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_select_side_faces;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bevel_faces_factory\n\nk3d::iplugin_factory& bevel_faces_factory()\n{\n\treturn bevel_faces_implementation::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/bevel_points.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar <romainbehar@yahoo.com>\n\t\\author Timothy M. Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/optional.hpp>\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bevel_points\n\nclass bevel_points :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::material_sink<k3d::node > > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::material_sink<k3d::node > > > base;\n\npublic:\n\tbevel_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_distance(init_owner(*this) + init_name(\"distance\") + init_label(_(\"Distance\")) + init_description(_(\"Offset distance along edges.\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_fraction(init_owner(*this) + init_name(\"fraction\") + init_label(_(\"Fraction\")) + init_description(_(\"Offset position as a fraction of edge length.\")) + init_value(0.1) + init_step_increment(0.05) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_cap(init_owner(*this) + init_name(\"cap\") + init_label(_(\"Cap\")) + init_description(_(\"Cap each bevelled point with a new face.\")) + init_value(true))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_distance.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_fraction.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_cap.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\t// Create output geometry\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\n\t\t// Clear previously cached data\n\t\tbevel_vertices.clear();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::bool_t cap = m_cap.pipeline_value();\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Identify face \"corners\" to be bevelled ...\n\t\t\tbevel_corners corners;\n\n\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\tconst k3d::uint_t edge_end = edge_begin + polyhedron->clockwise_edges.size();\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(!point_selection[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]])\n\t\t\t\t\tcontinue;\n\n\t\t\t\tcorners.push_back(bevel_corner(edge, polyhedron->clockwise_edges[edge]));\n\t\t\t}\n\n\t\t\t// Create a mapping from edges to adjacent edges ...\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::mesh::indices_t adjacent_edges;\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\n\t\t\t// Create a mapping from edges to faces ...\n\t\t\tk3d::mesh::indices_t edge_faces;\n\t\t\tk3d::polyhedron::create_edge_face_lookup(*polyhedron, edge_faces);\n\n\t\t\t// Create mappings from edges to corners ...\n\t\t\tk3d::mesh::indices_t edge1_corners(polyhedron->clockwise_edges.size(), corners.size());\n\t\t\tk3d::mesh::indices_t edge2_corners(polyhedron->clockwise_edges.size(), corners.size());\n\t\t\tfor(k3d::uint_t corner = 0; corner != corners.size(); ++corner)\n\t\t\t{\n\t\t\t\tedge1_corners[corners[corner].edge1] = corner;\n\t\t\t\tedge2_corners[corners[corner].edge2] = corner;\n\t\t\t}\n\n\t\t\t// Get ready to copy attributes ...\n\t\t\tk3d::table_copier point_attributes(Output.point_attributes);\n\t\t\tk3d::table_copier edge_attributes(polyhedron->edge_attributes);\n\t\t\tk3d::table_copier vertex_attributes(polyhedron->vertex_attributes);\n\t\t\tk3d::table_copier face_attributes(polyhedron->face_attributes);\n\n\t\t\t// Create new bevel points, being careful to avoid duplicating adjacent points ...\n\t\t\tfor(bevel_corners::iterator corner = corners.begin(); corner != corners.end(); ++corner)\n\t\t\t{\n\t\t\t\tif(!corner->point1)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t new_point = points.size();\n\n\t\t\t\t\tcorner->point1 = new_point;\n\n\t\t\t\t\tif(!boundary_edges[corner->edge1])\n\t\t\t\t\t\tcorners[edge2_corners[adjacent_edges[corner->edge1]]].point2 = new_point;\n\n\t\t\t\t\tbevel_vertices.push_back(\n\t\t\t\t\t\tbevel_vertex(\n\t\t\t\t\t\t\tnew_point,\n\t\t\t\t\t\t\tpoints[polyhedron->vertex_points[corner->edge2]],\n\t\t\t\t\t\t\tpoints[polyhedron->vertex_points[corner->edge1]]));\n\t\t\t\t\tpoints.push_back(k3d::point3());\n\t\t\t\t\tpoint_selection.push_back(1);\n\n\t\t\t\t\tpoint_attributes.push_back(polyhedron->vertex_points[corner->edge2]);\n\t\t\t\t}\n\n\t\t\t\tif(!corner->point2)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t new_point = points.size();\n\n\t\t\t\t\tcorner->point2 = new_point;\n\n\t\t\t\t\tif(!boundary_edges[corner->edge2])\n\t\t\t\t\t\tcorners[edge1_corners[adjacent_edges[corner->edge2]]].point1 = new_point;\n\n\t\t\t\t\tbevel_vertices.push_back(\n\t\t\t\t\t\tbevel_vertex(\n\t\t\t\t\t\t\tnew_point,\n\t\t\t\t\t\t\tpoints[polyhedron->vertex_points[corner->edge2]],\n\t\t\t\t\t\t\tpoints[polyhedron->vertex_points[polyhedron->clockwise_edges[corner->edge2]]]));\n\t\t\t\t\tpoints.push_back(k3d::point3());\n\t\t\t\t\tpoint_selection.push_back(1);\n\n\t\t\t\t\tpoint_attributes.push_back(polyhedron->vertex_points[corner->edge2]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create a bevel edge for each face corner ...\n\t\t\tfor(bevel_corners::iterator corner = corners.begin(); corner != corners.end(); ++corner)\n\t\t\t{\n\t\t\t\tcorner->new_edge = polyhedron->clockwise_edges.size();\n\n\t\t\t\tpolyhedron->clockwise_edges[corner->edge1] = *corner->new_edge;\n\n\t\t\t\tpolyhedron->clockwise_edges.push_back(corner->edge2);\n\t\t\t\tpolyhedron->edge_selections.push_back(1);\n\t\t\t\tpolyhedron->vertex_points.push_back(*corner->point1);\n\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\tk3d::uint_t edge_indices[2] = { corner->edge1, corner->edge2 };\n\t\t\t\tk3d::double_t edge_weights[2] = { 0.5, 0.5 };\n\t\t\t\tedge_attributes.push_back(2, edge_indices, edge_weights);\n\n\t\t\t\tvertex_attributes.push_back(corner->edge2);\n\n\t\t\t\tpolyhedron->vertex_points[corner->edge2] = *corner->point2;\n\t\t\t}\n\n\t\t\t// Optionally create bevel faces ...\n\t\t\tif(cap)\n\t\t\t{\n\t\t\t\t// Create a face for each group of adjacent corners ...\n\t\t\t\tk3d::mesh::bools_t used_corners(corners.size(), false);\n\t\t\t\tfor(k3d::uint_t start_corner = 0; start_corner != corners.size(); ++start_corner)\n\t\t\t\t{\n\t\t\t\t\tif(used_corners[start_corner])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tk3d::bool_t loop = false;\n\t\t\t\t\tk3d::mesh::indices_t clockwise_corners;\n\n\t\t\t\t\t// Follow adjacent corners in the clockwise direction until we either hit\n\t\t\t\t\t// the polyhedron boundary or create a loop ...\n\t\t\t\t\tfor(k3d::uint_t adjacent_corner = start_corner; ;)\n\t\t\t\t\t{\n\t\t\t\t\t\tclockwise_corners.push_back(adjacent_corner);\n\t\t\t\t\t\tused_corners[adjacent_corner] = true;\n\n\t\t\t\t\t\tif(boundary_edges[corners[adjacent_corner].edge1])\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tadjacent_corner = edge2_corners[adjacent_edges[corners[adjacent_corner].edge1]];\n\t\t\t\t\t\tif(adjacent_corner == start_corner)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we didn't create a loop, follow adjacent corners in the counter-clockwise\n\t\t\t\t\t// direction until we hit the polyhedron boundary ...\n\t\t\t\t\tif(!loop)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(k3d::uint_t adjacent_corner = start_corner; ;)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(boundary_edges[corners[adjacent_corner].edge2])\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tadjacent_corner = edge1_corners[adjacent_edges[corners[adjacent_corner].edge2]];\n\n\t\t\t\t\t\t\tclockwise_corners.insert(clockwise_corners.begin(), adjacent_corner);\n\t\t\t\t\t\t\tused_corners[adjacent_corner] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Create a new face ...\n\t\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[edge_faces[corners[clockwise_corners[0]].edge1]]);\n\t\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\t\tpolyhedron->face_selections.push_back(1);\n\t\t\t\t\tpolyhedron->face_materials.push_back(material);\n\n\t\t\t\t\t// Create new face attributes ...\n\t\t\t\t\tk3d::mesh::indices_t face_indices(clockwise_corners.size());\n\t\t\t\t\tfor(k3d::uint_t corner = 0; corner != clockwise_corners.size(); ++corner)\n\t\t\t\t\t\tface_indices[corner] = edge_faces[corners[clockwise_corners[corner]].edge1];\n\t\t\t\t\tk3d::mesh::weights_t face_weights(clockwise_corners.size(), 1.0 / clockwise_corners.size());\n\t\t\t\t\tface_attributes.push_back(clockwise_corners.size(), &face_indices[0], &face_weights[0]);\n\n\t\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->clockwise_edges.size();\n\t\t\t\t\tfor(k3d::uint_t corner = 0; corner != clockwise_corners.size(); ++corner)\n\t\t\t\t\t{\n\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\tpolyhedron->edge_selections.push_back(1);\n\t\t\t\t\t\tpolyhedron->vertex_points.push_back(*corners[clockwise_corners[corner]].point2);\n\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\t\t\tk3d::uint_t edge_indices[2] = { corners[clockwise_corners[corner]].edge1, corners[clockwise_corners[corner]].edge2 };\n\t\t\t\t\t\tk3d::double_t edge_weights[2] = { 0.5, 0.5 };\n\t\t\t\t\t\tedge_attributes.push_back(2, edge_indices, edge_weights);\n\n\t\t\t\t\t\tvertex_attributes.push_back(corners[clockwise_corners[corner]].edge2);\n\t\t\t\t\t}\n\t\t\t\t\tif(loop)\n\t\t\t\t\t{\n\t\t\t\t\t\tpolyhedron->clockwise_edges.back() = first_edge;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(first_edge);\n\t\t\t\t\t\tpolyhedron->edge_selections.push_back(1);\n\t\t\t\t\t\tpolyhedron->vertex_points.push_back(*corners[clockwise_corners.back()].point1);\n\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\t\t\tk3d::uint_t edge_indices[2] = { corners[clockwise_corners.front()].edge2, corners[clockwise_corners.back()].edge1 };\n\t\t\t\t\t\tk3d::double_t edge_weights[2] = { 0.5, 0.5 };\n\t\t\t\t\t\tedge_attributes.push_back(2, edge_indices, edge_weights);\n\n\t\t\t\t\t\tvertex_attributes.push_back(corners[clockwise_corners.back()].edge2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points, point_map);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::double_t distance = m_distance.pipeline_value();\n\t\tconst k3d::double_t fraction = m_fraction.pipeline_value();\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\n\t\tconst k3d::uint_t vertex_begin = 0;\n\t\tconst k3d::uint_t vertex_end = vertex_begin + bevel_vertices.size();\n\t\tfor(k3d::uint_t vertex_index = vertex_begin; vertex_index != vertex_end; ++vertex_index)\n\t\t{\n\t\t\tconst bevel_vertex& vertex = bevel_vertices[vertex_index];\n\n\t\t\tpoints[point_map[vertex.point]] =\n\t\t\t\tk3d::mix(vertex.start, vertex.end, fraction)\n\t\t\t\t+ (k3d::normalize(vertex.end - vertex.start) * distance);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bevel_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x5a578576, 0xc207453f, 0xa7a2b9ae, 0xfb1ad739),\n\t\t\t\t\"BevelPoints\",\n\t\t\t\t\"Bevels a surface at each selected point\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t/// Caches polyhedron \"corners\" that are to be bevelled\n\tstruct bevel_corner\n\t{\n\t\tbevel_corner(const k3d::uint_t Edge1, const k3d::uint_t Edge2) :\n\t\t\tedge1(Edge1),\n\t\t\tedge2(Edge2)\n\t\t{\n\t\t}\n\n\t\tk3d::uint_t edge1;\n\t\tboost::optional<k3d::uint_t> point1;\n\t\tboost::optional<k3d::uint_t> new_edge;\n\t\tboost::optional<k3d::uint_t> point2;\n\t\tk3d::uint_t edge2;\n\t};\n\n\ttypedef std::vector<bevel_corner> bevel_corners;\n\n\t/// Caches new points for better interactive performance\n\tstruct bevel_vertex\n\t{\n\t\tbevel_vertex(const k3d::uint_t Point, const k3d::point3& Start, const k3d::point3& End) :\n\t\t\tpoint(Point),\n\t\t\tstart(Start),\n\t\t\tend(End)\n\t\t{\n\t\t}\n\n\t\tk3d::uint_t point;\n\t\tk3d::point3 start;\n\t\tk3d::point3 end;\n\t};\n\n\t/// Caches new points for better interactive performance\n\tstd::vector<bevel_vertex> bevel_vertices;\n\t/// Caches a mapping from the original input point indices to the new output point indices (because we delete existing points)\n\tk3d::mesh::indices_t point_map;\n\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_distance;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_fraction;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_cap;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bevel_points_factory\n\nk3d::iplugin_factory& bevel_points_factory()\n{\n\treturn bevel_points::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/polyhedron/bridge_edges.cpp",
    "content": "// K-3D\n// Copyright (c) 2005, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar <romainbehar@yahoo.com>\n\t\\author Timothy M. Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bridge_edges\n\nclass bridge_edges :\n\tpublic k3d::mesh_selection_sink<k3d::material_sink<k3d::mesh_modifier<k3d::node > > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::material_sink<k3d::mesh_modifier<k3d::node > > > base;\n\npublic:\n\tbridge_edges(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tstruct adjacency_edge\n\t{\n\t\tadjacency_edge(const k3d::uint_t StartPoint, const k3d::uint_t Edge, const k3d::uint_t EndPoint) :\n\t\t\tstart_point(StartPoint),\n\t\t\tedge(Edge),\n\t\t\tend_point(EndPoint)\n\t\t{\n\t\t}\n\n\t\tk3d::uint_t start_point;\n\t\tk3d::uint_t edge;\n\t\tk3d::uint_t end_point;\n\t};\n\n\ttypedef std::vector<adjacency_edge> adjacency_list;\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Lookup edges on the boundary of the polyhedron ...\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::mesh::indices_t adjacent_edges;\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\n\t\t\t// Create a lookup from edges to their adjacent faces ...\n\t\t\tk3d::mesh::indices_t edge_faces;\n\t\t\tk3d::polyhedron::create_edge_face_lookup(*polyhedron, edge_faces);\n\n\t\t\t// Get the set of selected boundary edges (excluding polygon holes) ...\n\t\t\tk3d::mesh::indices_t edges;\n\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[polyhedron->face_first_loops[face]];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tif(boundary_edges[edge] && polyhedron->edge_selections[edge])\n\t\t\t\t\t\tedges.push_back(edge);\n\n\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Locate the start and end vertices for each edge ...\n\t\t\tadjacency_list ungrouped_edges;\n\t\t\tfor(k3d::uint_t i = 0; i != edges.size(); ++i)\n\t\t\t{\n\t\t\t\tungrouped_edges.push_back(\n\t\t\t\t\tadjacency_edge(\n\t\t\t\t\t\tpolyhedron->vertex_points[edges[i]],\n\t\t\t\t\t\tedges[i],\n\t\t\t\t\t\tpolyhedron->vertex_points[polyhedron->clockwise_edges[edges[i]]]\n\t\t\t\t\t\t));\n\t\t\t}\n\n\t\t\t// Partition selected boundary edges into groups of contiguous edges ...\n\t\t\tstd::vector<adjacency_list> grouped_edges;\n\n\t\t\twhile(ungrouped_edges.size())\n\t\t\t{\n\t\t\t\tadjacency_list current;\n\t\t\t\tcurrent.push_back(ungrouped_edges.back());\n\t\t\t\tungrouped_edges.pop_back();\n\n\t\t\t\twhile(ungrouped_edges.size())\n\t\t\t\t{\n\t\t\t\t\tk3d::uint_t matched = 0;\n\t\t\t\t\tfor(adjacency_list::iterator edge = ungrouped_edges.begin(); edge != ungrouped_edges.end(); ++edge)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(edge->end_point == current.front().start_point)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcurrent.insert(current.begin(), *edge);\n\t\t\t\t\t\t\tungrouped_edges.erase(edge);\n\t\t\t\t\t\t\t++matched;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(current.back().end_point == edge->start_point)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcurrent.insert(current.end(), *edge);\n\t\t\t\t\t\t\tungrouped_edges.erase(edge);\n\t\t\t\t\t\t\t++matched;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(!matched)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tgrouped_edges.push_back(current);\n\t\t\t}\n\n\t\t\t// We need exactly two sets of edges ...\n\t\t\tif(grouped_edges.size() != 2)\n\t\t\t{\n\t\t\t\tk3d::log() << warning << \"To bridge, two sets of contiguously connected edges must be selected.\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Both groups of edges must be members of the same shell ...\n\t\t\tif(polyhedron->face_shells[edge_faces[grouped_edges.front().front().edge]] != polyhedron->face_shells[edge_faces[grouped_edges.back().front().edge]])\n\t\t\t{\n\t\t\t\tk3d::log() << warning << \"Cannot bridge across polyhedron shells.\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get ready to copy attributes ...\n\t\t\tk3d::table_copier face_attributes(polyhedron->face_attributes);\n\t\t\tk3d::table_copier edge_attributes(polyhedron->edge_attributes);\n\t\t\tk3d::table_copier vertex_attributes(polyhedron->vertex_attributes);\n\n\t\t\tk3d::mesh::indices_t cross_edges(2);\n\t\t\tk3d::mesh::weights_t cross_edge_weights(2, 0.5);\n\n\t\t\t// Create a new polygon bridge ...\n\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[edge_faces[grouped_edges.front().front().edge]]);\n\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->face_loop_counts.size());\n\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\tpolyhedron->face_selections.push_back(1);\n\t\t\tpolyhedron->face_materials.push_back(material);\n\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\tk3d::mesh::indices_t face_indices;\n\t\t\tfor(adjacency_list::iterator edge = grouped_edges.front().begin(); edge != grouped_edges.front().end(); ++edge)\n\t\t\t\tface_indices.push_back(edge_faces[edge->edge]);\n\t\t\tfor(adjacency_list::iterator edge = grouped_edges.back().begin(); edge != grouped_edges.back().end(); ++edge)\n\t\t\t\tface_indices.push_back(edge_faces[edge->edge]);\n\t\t\tk3d::mesh::weights_t face_weights(face_indices.size(), 1.0 / face_indices.size());\n\t\t\tface_attributes.push_back(face_indices.size(), &face_indices[0], &face_weights[0]);\n\n\t\t\t// Create the first cross edge ...\n\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\tpolyhedron->vertex_points.push_back(grouped_edges.front().front().start_point);\n\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\tcross_edges[0] = grouped_edges.front().front().edge;\n\t\t\tcross_edges[1] = grouped_edges.back().back().edge;\n\t\t\tedge_attributes.push_back(2, &cross_edges[0], &cross_edge_weights[0]);\n\t\t\tvertex_attributes.push_back(grouped_edges.front().front().edge);\n\n\t\t\t// Create the first set of parallel edges ...\n\t\t\tfor(adjacency_list::reverse_iterator edge = grouped_edges.back().rbegin(); edge != grouped_edges.back().rend(); ++edge)\n\t\t\t{\n\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\tpolyhedron->vertex_points.push_back(edge->end_point);\n\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\tedge_attributes.push_back(edge->edge);\n\t\t\t\tvertex_attributes.push_back(polyhedron->clockwise_edges[edge->edge]);\n\t\t\t}\n\n\t\t\t// Create the second cross edge ...\n\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\tpolyhedron->vertex_points.push_back(grouped_edges.back().front().start_point);\n\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\tcross_edges[0] = grouped_edges.back().front().edge;\n\t\t\tcross_edges[1] = grouped_edges.front().back().edge;\n\t\t\tedge_attributes.push_back(2, &cross_edges[0], &cross_edge_weights[0]);\n\t\t\tvertex_attributes.push_back(grouped_edges.back().front().edge);\n\n\t\t\t// Create the second set of parallel edges ...\n\t\t\tfor(adjacency_list::reverse_iterator edge = grouped_edges.front().rbegin(); edge != grouped_edges.front().rend(); ++edge)\n\t\t\t{\n\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\tpolyhedron->vertex_points.push_back(edge->end_point);\n\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\tedge_attributes.push_back(edge->edge);\n\t\t\t\tvertex_attributes.push_back(polyhedron->clockwise_edges[edge->edge]);\n\t\t\t}\n\n\t\t\t// Close the edge loop ...\n\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bridge_edges,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xa360bb82, 0x223a46df, 0x91e4b594, 0xf9b6b7a3),\n\t\t\t\t\"BridgeEdges\",\n\t\t\t\t\"Creates new polygons bridging two sets of connected border edges\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bridge_edges_factory\n\nk3d::iplugin_factory& bridge_edges_factory()\n{\n\treturn bridge_edges::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/bridge_faces.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar <romainbehar@yahoo.com>\n\t\\author Timothy M. Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bridge_faces\n\nclass bridge_faces :\n\tpublic k3d::mesh_selection_sink<k3d::material_sink<k3d::mesh_modifier<k3d::node > > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::material_sink<k3d::mesh_modifier<k3d::node > > > base;\n\npublic:\n\tbridge_faces(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\n\t\tconst k3d::mesh::points_t& points = *Output.points;\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\n\t\t// Don't explicitly remove any points ...\n\t\tk3d::mesh::bools_t remove_points(points.size(), false);\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Get the set of selected faces ...\n\t\t\tk3d::mesh::indices_t selected_faces;\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tif(polyhedron->face_selections[face])\n\t\t\t\t\tselected_faces.push_back(face);\n\t\t\t}\n\n\t\t\t// We need exactly two faces ...\n\t\t\tif(selected_faces.size() != 2)\n\t\t\t{\n\t\t\t\tk3d::log() << warning << \"To bridge, exactly two faces must be selected.\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\t// Both faces must be members of the same shell ...\n\t\t\tif(polyhedron->face_shells[selected_faces[0]] != polyhedron->face_shells[selected_faces[1]])\n\t\t\t{\n\t\t\t\tk3d::log() << warning << \"Cannot bridge across polyhedron shells.\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Lookup loop lengths ...\n\t\t\tk3d::mesh::counts_t loop_edge_counts;\n\t\t\tk3d::polyhedron::create_loop_edge_count_lookup(*polyhedron, loop_edge_counts);\n\n\t\t\t// Both faces must have the same number of edges ...\n\t\t\tif(loop_edge_counts[polyhedron->face_first_loops[selected_faces[0]]] != loop_edge_counts[polyhedron->face_first_loops[selected_faces[1]]])\n\t\t\t{\n\t\t\t\tk3d::log() << warning << \"Cannot bridge faces with different edge counts.\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We will explicitly delete the originally selected faces ...\n\t\t\tk3d::mesh::bools_t remove_faces(polyhedron->face_selections.begin(), polyhedron->face_selections.end());\n\n\t\t\t// We will need to traverse edges in counterclockwise order for the second face ...\n\t\t\tk3d::mesh::indices_t counterclockwise_edges;\n\t\t\tk3d::polyhedron::create_counterclockwise_edge_lookup(*polyhedron, counterclockwise_edges);\n\n\t\t\t// Find the best starting-vertex for the second face ...\n\t\t\tconst k3d::uint_t first_edge_1 = polyhedron->loop_first_edges[polyhedron->face_first_loops[selected_faces[0]]];\n\n\t\t\tk3d::uint_t first_edge_2 = polyhedron->loop_first_edges[polyhedron->face_first_loops[selected_faces[1]]];\n\t\t\tk3d::double_t distance = std::numeric_limits<double>::max();\n\t\t\tfor(k3d::uint_t edge = first_edge_2; ;)\n\t\t\t{\n\t\t\t\tconst k3d::double_t d = k3d::length(points[polyhedron->vertex_points[first_edge_1]] - points[polyhedron->vertex_points[edge]]);\n\t\t\t\tif(d < distance)\n\t\t\t\t{\n\t\t\t\t\tdistance = d;\n\t\t\t\t\tfirst_edge_2 = edge;\n\t\t\t\t}\n\n\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge_2)\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Get ready to copy attributes ...\n\t\t\tk3d::table_copier face_attributes(polyhedron->face_attributes);\n\t\t\tk3d::table_copier edge_attributes(polyhedron->edge_attributes);\n\t\t\tk3d::table_copier vertex_attributes(polyhedron->vertex_attributes);\n\n\t\t\t// For each edge in the first face ...\n\t\t\tfor(k3d::uint_t edge1 = first_edge_1, edge2 = first_edge_2; ;)\n\t\t\t{\n\t\t\t\t// Create a new bridge face ...\n\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[selected_faces[0]]);\n\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->face_loop_counts.size());\n\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\tpolyhedron->face_selections.push_back(1);\n\t\t\t\tpolyhedron->face_materials.push_back(material);\n\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\tk3d::double_t face_weights[2] = { 0.5, 0.5 };\n\t\t\t\tface_attributes.push_back(2, &selected_faces[0], face_weights);\n\n\t\t\t\tremove_faces.push_back(false);\n\n\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\tpolyhedron->vertex_points.push_back(polyhedron->vertex_points[edge1]);\n\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\tedge_attributes.push_back(edge1);\n\t\t\t\tvertex_attributes.push_back(edge1);\n\n\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\tpolyhedron->vertex_points.push_back(polyhedron->vertex_points[polyhedron->clockwise_edges[edge1]]);\n\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\tedge_attributes.push_back(polyhedron->clockwise_edges[edge1]);\n\t\t\t\tvertex_attributes.push_back(polyhedron->clockwise_edges[edge1]);\n\n\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\tpolyhedron->vertex_points.push_back(polyhedron->vertex_points[counterclockwise_edges[edge2]]);\n\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\tedge_attributes.push_back(counterclockwise_edges[edge2]);\n\t\t\t\tvertex_attributes.push_back(counterclockwise_edges[edge2]);\n\n\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\tpolyhedron->vertex_points.push_back(polyhedron->vertex_points[edge2]);\n\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\tedge_attributes.push_back(edge2);\n\t\t\t\tvertex_attributes.push_back(edge2);\n\n\t\t\t\t// Close the edge loop ...\n\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\n\t\t\t\tedge1 = polyhedron->clockwise_edges[edge1];\n\t\t\t\tif(edge1 == first_edge_1)\n\t\t\t\t\tbreak;\n\n\t\t\t\tedge2 = counterclockwise_edges[edge2];\n\t\t\t}\n\n\t\t\t// Don't explicitly delete any edges ...\n\t\t\tk3d::mesh::bools_t remove_edges(polyhedron->clockwise_edges.size(), false);\n\n\t\t\t// Don't explicitly delete any loops ...\n\t\t\tk3d::mesh::bools_t remove_loops(polyhedron->loop_first_edges.size(), false);\n\t\t\t\n\t\t\t// Make it happen ...\n\t\t\tk3d::polyhedron::delete_components(Output, *polyhedron, remove_points, remove_edges, remove_loops, remove_faces);\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bridge_faces,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x8e744389, 0x5d284d38, 0x95bb89cc, 0x1b9e528e),\n\t\t\t\t\"BridgeFaces\",\n\t\t\t\t\"Creates new polygons forming a bridge between two selected polygons\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bridge_faces_factory\n\nk3d::iplugin_factory& bridge_faces_factory()\n{\n\treturn bridge_faces::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/cap_holes.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cap_holes\n\nclass cap_holes :\n\tpublic k3d::mesh_selection_sink<k3d::material_sink<k3d::mesh_modifier<k3d::node > > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::material_sink<k3d::mesh_modifier<k3d::node > > > base;\n\npublic:\n\tcap_holes(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_cap_polyhedra(init_owner(*this) + init_name(\"cap_polyhedra\") + init_label(_(\"Cap polyhedra\")) + init_description(_(\"Cap holes (missing faces) in polyhedra\")) + init_value(true)),\n\t\tm_cap_faces(init_owner(*this) + init_name(\"cap_faces\") + init_label(_(\"Cap faces\")) + init_description(_(\"Cap holes in faces\")) + init_value(true))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_cap_polyhedra.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_cap_faces.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::bool_t cap_polyhedra = m_cap_polyhedra.pipeline_value();\n\t\tconst k3d::bool_t cap_faces = m_cap_faces.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Create a lookup so we can detect boundary edges ...\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::mesh::indices_t adjacent_edges;\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\n\t\t\t// Create a lookup from edges to faces ...\n\t\t\tk3d::mesh::indices_t edge_faces;\n\t\t\tk3d::polyhedron::create_edge_face_lookup(*polyhedron, edge_faces);\t\n\n\t\t\t// Begin with the set of selected edges ...\n\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\tconst k3d::uint_t edge_end = edge_begin + polyhedron->clockwise_edges.size();\n\t\t\tk3d::mesh::bools_t cap_edges(polyhedron->clockwise_edges.size(), false);\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\tcap_edges[edge] = polyhedron->edge_selections[edge] ? true : false;\n\n\t\t\t// Remove interior edges ...\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(!boundary_edges[edge])\n\t\t\t\t\tcap_edges[edge] = false;\n\t\t\t}\n\n\t\t\t// If we aren't going to cap polyhedra, remove all face loops from the edge list ...\n\t\t\tif(!cap_polyhedra)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t loop_first_edge = polyhedron->loop_first_edges[polyhedron->face_first_loops[face]];\n\t\t\t\t\tfor(k3d::uint_t edge = loop_first_edge; ;)\n\t\t\t\t\t{\n\t\t\t\t\t\tcap_edges[edge] = false;\n\n\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\tif(edge == loop_first_edge)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we aren't going to cap faces, remove all face holes from the edge list ...\n\t\t\tif(!cap_faces)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t loop_end = polyhedron->face_loop_counts[face];\n\t\t\t\t\tfor(k3d::uint_t loop = 1; loop < loop_end; ++loop)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t loop_first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\t\tfor(k3d::uint_t edge = loop_first_edge; ;)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcap_edges[edge] = false;\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == loop_first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get ready to copy attributes ...\n\t\t\tk3d::table_copier face_copier(polyhedron->face_attributes);\n\t\t\tk3d::table_copier edge_copier(polyhedron->edge_attributes);\n\t\t\tk3d::table_copier vertex_copier(polyhedron->vertex_attributes);\n\n\t\t\t// For each remaining cap edge ...\n\t\t\tfor(k3d::uint_t loop_first_edge = edge_begin; loop_first_edge != edge_end; ++loop_first_edge)\n\t\t\t{\n\t\t\t\tif(!cap_edges[loop_first_edge])\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// Get the entire boundary loop ...\n\t\t\t\tk3d::mesh::indices_t loop;\n\t\t\t\tfor(k3d::uint_t edge = loop_first_edge; ;)\n\t\t\t\t{\n\t\t\t\t\tcap_edges[edge] = false;\n\t\t\t\t\tloop.push_back(edge);\n\n\t\t\t\t\t// Get the next boundary edge in *counterclockwise* order ...\n\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\twhile(!boundary_edges[edge])\n\t\t\t\t\t\tedge = polyhedron->clockwise_edges[adjacent_edges[edge]];\n\t\t\t\t\t\n\t\t\t\t\tif(edge == loop_first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Reverse the loop so it's clockwise ...\n\t\t\t\tstd::reverse(loop.begin(), loop.end());\n\n\t\t\t\t// Create a new face ...\n\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[edge_faces[loop_first_edge]]);\n\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\tpolyhedron->face_selections.push_back(1);\n\t\t\t\tpolyhedron->face_materials.push_back(material);\n\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\tface_copier.push_back(edge_faces[loop_first_edge]);\n\n\t\t\t\tfor(k3d::uint_t edge = 0; edge != loop.size(); ++edge)\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(1);\n\t\t\t\t\tpolyhedron->vertex_points.push_back(polyhedron->vertex_points[loop[edge]]);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\t\tedge_copier.push_back(loop[edge]);\n\t\t\t\t\tvertex_copier.push_back(loop[edge]);\n\t\t\t\t}\n\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cap_holes,\n\t\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xd9900dbf, 0x3d854a36, 0xbd05a3eb, 0x1379a89a),\n\t\t\t\t\"CapHoles\",\n\t\t\t\t_(\"Caps (fills) holes in a polyhedron\"),\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_cap_polyhedra;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_cap_faces;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cap_holes_factory\n\nk3d::iplugin_factory& cap_holes_factory()\n{\n\treturn cap_holes::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/collapse_edges.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// collapse_edges\n\nclass collapse_edges :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tcollapse_edges(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tstatic void expand_edge_group(\n\t\tconst k3d::polyhedron::primitive& Polyhedron,\n\t\tconst std::vector<k3d::mesh::indices_t>& AdjacencyList,\n\t\tconst k3d::uint_t Edge,\n\t\tconst k3d::uint_t EdgeGroup,\n\t\tstd::vector<boost::optional<k3d::uint_t> >& EdgeGroups\n\t\t)\n\t{\n\t\t{\n\t\t\tconst k3d::mesh::indices_t& neighbors = AdjacencyList[Polyhedron.vertex_points[Edge]];\n\t\t\tfor(k3d::uint_t i = 0; i != neighbors.size(); ++i)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t neighbor = neighbors[i];\n\t\t\t\tif(!EdgeGroups[neighbor] && Polyhedron.edge_selections[neighbor])\n\t\t\t\t{\n\t\t\t\t\tEdgeGroups[neighbor] = EdgeGroup;\n\t\t\t\t\texpand_edge_group(Polyhedron, AdjacencyList, neighbor, EdgeGroup, EdgeGroups);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tconst k3d::mesh::indices_t& neighbors = AdjacencyList[Polyhedron.vertex_points[Polyhedron.clockwise_edges[Edge]]];\n\t\t\tfor(k3d::uint_t i = 0; i != neighbors.size(); ++i)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t neighbor = neighbors[i];\n\t\t\t\tif(!EdgeGroups[neighbor] && Polyhedron.edge_selections[neighbor])\n\t\t\t\t{\n\t\t\t\t\tEdgeGroups[neighbor] = EdgeGroup;\n\t\t\t\t\texpand_edge_group(Polyhedron, AdjacencyList, neighbor, EdgeGroup, EdgeGroups);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\t\tk3d::table_copier point_attributes(Output.point_attributes);\n\n\t\t// Don't explicitly remove any points ...\n\t\tk3d::mesh::bools_t remove_points(points.size(), false);\n\n\t\t// Create a mapping from old points to new points ...\n\t\tconst k3d::uint_t point_begin = 0;\n\t\tconst k3d::uint_t point_end = point_begin + points.size();\n\t\tk3d::mesh::indices_t point_map(points.size());\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\tpoint_map[point] = point;\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Compute a vertex-edge adjacency list ...\n\t\t\tstd::vector<k3d::mesh::indices_t> adjacency_list;\n\t\t\tk3d::polyhedron::create_point_edge_lookup(Output, *polyhedron, adjacency_list);\n\n\t\t\t// Label groups of selected, adjacent edges ...\n\t\t\tstd::vector<boost::optional<k3d::uint_t> > edge_groups(polyhedron->clockwise_edges.size());\n\t\t\tk3d::uint_t edge_group_count = 0;\n\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\tconst k3d::uint_t edge_end = edge_begin + polyhedron->clockwise_edges.size();\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(edge_groups[edge])\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif(polyhedron->edge_selections[edge])\n\t\t\t\t{\n\t\t\t\t\tedge_groups[edge] = ++edge_group_count;\n\t\t\t\t\texpand_edge_group(*polyhedron, adjacency_list, edge, edge_group_count, edge_groups);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tedge_groups[edge] = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Keep track of edges to be deleted ...\n\t\t\tk3d::mesh::bools_t remove_edges(polyhedron->clockwise_edges.size(), false);\n\n\t\t\t// For each edge group ...\n\t\t\tfor(k3d::uint_t edge_group = 1; edge_group <= edge_group_count; ++edge_group)\n\t\t\t{\n\t\t\t\t// Prepare to create a new point, based on an average of all the points in the edge group ...\n\t\t\t\tconst k3d::uint_t new_point = points.size();\n\n\t\t\t\tk3d::mesh::indices_t point_indices;\n\t\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(edge_groups[edge] != edge_group)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tpoint_indices.push_back(polyhedron->vertex_points[edge]);\n\t\t\t\t\tpoint_indices.push_back(polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]);\n\n\t\t\t\t\tpoint_map[polyhedron->vertex_points[edge]] = new_point;\n\t\t\t\t\tpoint_map[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]] = new_point;\n\n\t\t\t\t\tremove_edges[edge] = true;\n\t\t\t\t}\n\t\t\t\tk3d::mesh::weights_t point_weights(point_indices.size(), 1.0 / point_indices.size());\n\n\t\t\t\t// Compute the new point position ...\n\t\t\t\tk3d::point3 average(0, 0, 0);\n\t\t\t\tfor(k3d::uint_t i = 0; i != point_indices.size(); ++i)\n\t\t\t\t\taverage += k3d::to_vector(point_weights[i] * points[point_indices[i]]);\n\n\t\t\t\t// Create the new point ...\n\t\t\t\tpoints.push_back(average);\n\t\t\t\tpoint_selection.push_back(1);\n\t\t\t\tremove_points.push_back(false);\n\t\t\t\tpoint_attributes.push_back(point_indices.size(), &point_indices[0], &point_weights[0]);\n\t\t\t}\n\n\t\t\t// Implicitly delete edges that have been collapsed onto a single point ...\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(point_map[polyhedron->vertex_points[edge]] != point_map[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]])\n\t\t\t\t\tcontinue;\n\t\t\t\tremove_edges[edge] = true;\n\t\t\t}\n\n\t\t\t// Don't explicitly delete any loops ...\n\t\t\tk3d::mesh::bools_t remove_loops(polyhedron->loop_first_edges.size(), false);\n\n\t\t\t// Don't explicitly delete any faces ...\n\t\t\tk3d::mesh::bools_t remove_faces(polyhedron->face_shells.size(), false);\n\t\t\t\n\t\t\t// Make it happen ...\n\t\t\tk3d::polyhedron::delete_components(Output, *polyhedron, remove_points, remove_edges, remove_loops, remove_faces);\n\t\t}\n\n\t\t// Map old points to new points ...\n\t\tk3d::mesh::remap_points(Output, point_map);\n\n\t\t// Remove unused points ...\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<collapse_edges,\n\t\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\t\tk3d::uuid(0xa5252071, 0xa3484315, 0x9c9daf1c, 0x786042a3),\n\t\t\t\t\t\"CollapseEdges\",\n\t\t\t\t\t\"For each selected edge, collapses its two vertices into one\",\n\t\t\t\t\t\"Polyhedron\",\n\t\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// factories\n\nk3d::iplugin_factory& collapse_edges_factory()\n{\n\treturn collapse_edges::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/collapse_faces.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// collapse_faces\n\nclass collapse_faces :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tcollapse_faces(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tstatic void expand_face_group(\n\t\tconst k3d::polyhedron::primitive& Polyhedron,\n\t\tconst std::vector<k3d::mesh::indices_t>& AdjacencyList,\n\t\tconst k3d::uint_t Face,\n\t\tconst k3d::uint_t FaceGroup,\n\t\tstd::vector<boost::optional<k3d::uint_t> >& FaceGroups\n\t\t)\n\t{\n\t\tconst k3d::uint_t first_edge = Polyhedron.loop_first_edges[Polyhedron.face_first_loops[Face]];\n\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t{\n\t\t\tconst k3d::mesh::indices_t& neighbors = AdjacencyList[Polyhedron.vertex_points[edge]];\n\t\t\tfor(k3d::uint_t i = 0; i != neighbors.size(); ++i)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t neighbor = neighbors[i];\n\t\t\t\tif(!FaceGroups[neighbor] && Polyhedron.face_selections[neighbor])\n\t\t\t\t{\n\t\t\t\t\tFaceGroups[neighbor] = FaceGroup;\n\t\t\t\t\texpand_face_group(Polyhedron, AdjacencyList, neighbor, FaceGroup, FaceGroups);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\tif(edge == first_edge)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\t\tk3d::table_copier point_attributes(Output.point_attributes);\n\n\t\t// Don't explicitly remove any points ...\n\t\tk3d::mesh::bools_t remove_points(points.size(), false);\n\n\t\t// Create a mapping from old points to new points ...\n\t\tconst k3d::uint_t point_begin = 0;\n\t\tconst k3d::uint_t point_end = point_begin + points.size();\n\t\tk3d::mesh::indices_t point_map(points.size());\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\tpoint_map[point] = point;\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Keep track of faces to be deleted ...\n\t\t\tk3d::mesh::bools_t remove_faces(polyhedron->face_shells.size(), false);\n\t\t\t\n\t\t\t// Compute a point-face adjacency list ...\n\t\t\tstd::vector<k3d::mesh::indices_t> adjacency_list;\n\t\t\tk3d::polyhedron::create_point_face_lookup(Output, *polyhedron, adjacency_list);\n\n\t\t\t// Label groups of selected, adjacent faces ...\n\t\t\tstd::vector<boost::optional<k3d::uint_t> > face_groups(polyhedron->face_shells.size());\n\t\t\tk3d::uint_t face_group_count = 0;\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tif(face_groups[face])\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif(polyhedron->face_selections[face])\n\t\t\t\t{\n\t\t\t\t\tface_groups[face] = ++face_group_count;\n\t\t\t\t\texpand_face_group(*polyhedron, adjacency_list, face, face_group_count, face_groups);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tface_groups[face] = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// For each face group ...\n\t\t\tfor(k3d::uint_t face_group = 1; face_group <= face_group_count; ++face_group)\n\t\t\t{\n\t\t\t\t// Prepare to create a new point, based on an average of all the points in the group ...\n\t\t\t\tconst k3d::uint_t new_point = points.size();\n\n\t\t\t\tk3d::mesh::indices_t point_indices;\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tif(face_groups[face] != face_group)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[polyhedron->face_first_loops[face]];\n\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t{\n\t\t\t\t\t\tpoint_indices.push_back(polyhedron->vertex_points[edge]);\n\t\t\t\t\t\tpoint_map[polyhedron->vertex_points[edge]] = new_point;\n\n\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tremove_faces[face] = true;\n\t\t\t\t}\n\t\t\t\tk3d::mesh::weights_t point_weights(point_indices.size(), 1.0 / point_indices.size());\n\n\t\t\t\t// Compute the new point position ...\n\t\t\t\tk3d::point3 average(0, 0, 0);\n\t\t\t\tfor(k3d::uint_t i = 0; i != point_indices.size(); ++i)\n\t\t\t\t\taverage += k3d::to_vector(point_weights[i] * points[point_indices[i]]);\n\n\t\t\t\t// Create the new point ...\n\t\t\t\tpoints.push_back(average);\n\t\t\t\tpoint_selection.push_back(1);\n\t\t\t\tremove_points.push_back(false);\n\t\t\t\tpoint_attributes.push_back(point_indices.size(), &point_indices[0], &point_weights[0]);\n\t\t\t}\n\n\t\t\t// Implicitly delete edges that have been collapsed onto a single point ...\n\t\t\tk3d::mesh::bools_t remove_edges(polyhedron->clockwise_edges.size(), false);\n\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\tconst k3d::uint_t edge_end = edge_begin + polyhedron->clockwise_edges.size();\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(point_map[polyhedron->vertex_points[edge]] != point_map[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]])\n\t\t\t\t\tcontinue;\n\t\t\t\tremove_edges[edge] = true;\n\t\t\t}\n\n\t\t\t// Don't explicitly delete any loops ...\n\t\t\tk3d::mesh::bools_t remove_loops(polyhedron->loop_first_edges.size(), false);\n\n\t\t\t// Make it happen ...\n\t\t\tk3d::polyhedron::delete_components(Output, *polyhedron, remove_points, remove_edges, remove_loops, remove_faces);\n\t\t}\n\n\t\t// Map old points to new points ...\n\t\tk3d::mesh::remap_points(Output, point_map);\n\n\t\t// Remove unused points ...\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<collapse_faces,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x13f8a224, 0x5e284ac4, 0xb5b58ebd, 0x10f65bb6),\n\t\t\t\t\"CollapseFaces\",\n\t\t\t\t\"For each selected face, collapses its vertices to the centroid\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// factories\n\nk3d::iplugin_factory& collapse_faces_factory()\n{\n\treturn collapse_faces::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/collapse_points.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens <bart.janssens@lid.kviv.be>\n\t\\author Timothy M. Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/utility.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// collapse_points\n\nclass collapse_points :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tcollapse_points(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\n\t\t// Mark points explicitly chosen by the user ...\n\t\tk3d::mesh::bools_t remove_points(Output.point_selection->begin(), Output.point_selection->end());\n\t\tconst k3d::uint_t selected_point_count = std::count(remove_points.begin(), remove_points.end(), true);\n\t\tif(selected_point_count < 2)\n\t\t\treturn;\n\n\t\t// Compute the average position of the selected points ...\n\t\tk3d::point3 average(0, 0, 0);\n\t\tconst k3d::uint_t point_begin = 0;\n\t\tconst k3d::uint_t point_end = point_begin + points.size();\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tif(!remove_points[point])\n\t\t\t\tcontinue;\n\t\t\taverage += k3d::to_vector(points[point]);\n\t\t}\n\t\taverage /= selected_point_count;\n\n\t\t// Create a new point based on the average position ...\n\t\tconst k3d::uint_t new_point = points.size();\n\t\tpoints.push_back(average);\n\t\tpoint_selection.push_back(1);\n\t\tremove_points.push_back(false);\n\n\t\tk3d::mesh::indices_t point_indices;\n\t\tk3d::mesh::create_index_list(remove_points, point_indices);\n\t\tconst k3d::mesh::weights_t point_weights(selected_point_count, 1.0 / selected_point_count);\n\t\tk3d::table_copier point_copier(Output.point_attributes);\n\t\tpoint_copier.push_back(selected_point_count, &point_indices[0], &point_weights[0]);\n\n\t\t// Map old point references to the new point ...\n\t\tk3d::mesh::indices_t point_map(points.size());\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\tpoint_map[point] = remove_points[point] ? new_point : point;\n\t\tpoint_map[new_point] = new_point;\n\t\tk3d::mesh::remap_points(Output, point_map);\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Delete any edges that have been \"collapsed\" onto the new point ...\n\t\t\tk3d::mesh::bools_t remove_edges(polyhedron->clockwise_edges.size(), false);\n\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\tconst k3d::uint_t edge_end = edge_begin + polyhedron->clockwise_edges.size();\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(polyhedron->vertex_points[edge] != new_point)\n\t\t\t\t\tcontinue;\n\t\t\t\tif(polyhedron->vertex_points[polyhedron->clockwise_edges[edge]] != new_point)\n\t\t\t\t\tcontinue;\n\t\t\t\tremove_edges[edge] = true;\n\t\t\t}\n\t\n\t\t\t// Don't explicitly delete any loops ...\n\t\t\tk3d::mesh::bools_t remove_loops(polyhedron->loop_first_edges.size(), false);\n\n\t\t\t// Don't explicitly delete any faces ...\n\t\t\tk3d::mesh::bools_t remove_faces(polyhedron->face_shells.size(), false);\n\t\t\t\n\t\t\t// Make it happen ...\n\t\t\tk3d::polyhedron::delete_components(Output, *polyhedron, remove_points, remove_edges, remove_loops, remove_faces);\n\t\t}\n\n\t\t// Mark points to be implicitly removed because they're no-longer used ...\n\t\tk3d::mesh::bools_t unused_point;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_point);\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tif(!unused_point[point])\n\t\t\t\tcontinue;\n\n\t\t\tremove_points[point] = true;\n\t\t}\t\n\n\t\t// Delete points ...\n\t\tk3d::mesh::delete_points(Output, remove_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<collapse_points,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x915ba4d4, 0xd4154a12, 0x938bec97, 0x60f819f3),\n\t\t\t\t\"CollapsePoints\",\n\t\t\t\t\"Merge selected points into one point, positioned at the average position of the selected points.\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// collapse_points_factory\n\nk3d::iplugin_factory& collapse_points_factory()\n{\n\treturn collapse_points::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/connect_vertices.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar <romainbehar@yahoo.com>\n\t\\author Timothy M. Shead <tshead@k-3d.com>\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// connect_vertices\n\nclass connect_vertices :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tconnect_vertices(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// For each face ...\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\t// Organize the face edges into groups of alternating selected and unselected edges ...\n\t\t\t\tconst edge_groups_t edge_groups = get_edge_groups(point_selection, *polyhedron, face);\n\n\t\t\t\t// If we can't figure-out unambiguously which edges to connect, skip this face ...\n\t\t\t\tif(4 != edge_groups.size())\n\t\t\t\t\tcontinue;\n\t\t\t\tif(edge_groups[0].size() != edge_groups[2].size())\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// Get ready to update face attributes ...\n\t\t\t\tk3d::table_copier face_attributes(polyhedron->face_attributes);\n\t\t\t\tk3d::table_copier edge_attributes(polyhedron->edge_attributes);\n\t\t\t\tk3d::table_copier vertex_attributes(polyhedron->vertex_attributes);\n\n\t\t\t\t// Lookup counterclockwise edges ...\n\t\t\t\tk3d::mesh::indices_t counterclockwise_edges;\n\t\t\t\tk3d::polyhedron::create_counterclockwise_edge_lookup(*polyhedron, counterclockwise_edges);\n\n\t\t\t\t// Split the face ...\n\t\t\t\tconst k3d::uint_t split_count = edge_groups[0].size();\n\t\t\t\tfor(k3d::uint_t i = 0; i != split_count; ++i)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t edge1 = edge_groups[0][split_count - i - 1];\n\t\t\t\t\tconst k3d::uint_t edge2 = edge_groups[2][i];\n\n\t\t\t\t\tconst k3d::uint_t ccw_edge1 = counterclockwise_edges[edge1];\n\t\t\t\t\tconst k3d::uint_t ccw_edge2 = counterclockwise_edges[edge2];\n\n\t\t\t\t\tconst k3d::uint_t new_edge1 = polyhedron->clockwise_edges.size();\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(edge2);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(1);\n\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t edge_indices[2] = { ccw_edge1, edge2 };\n\t\t\t\t\t\tconst k3d::double_t edge_weights[2] = { 0.5, 0.5 };\n\t\t\t\t\t\tedge_attributes.push_back(2, edge_indices, edge_weights);\n\t\t\t\t\t}\n\n\t\t\t\t\tpolyhedron->vertex_points.push_back(polyhedron->vertex_points[edge1]);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\tvertex_attributes.push_back(edge1);\n\n\t\t\t\t\tconst k3d::uint_t new_edge2 = polyhedron->clockwise_edges.size();\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(edge1);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(1);\n\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t edge_indices[2] = { ccw_edge2, edge1 };\n\t\t\t\t\t\tconst k3d::double_t edge_weights[2] = { 0.5, 0.5 };\n\t\t\t\t\t\tedge_attributes.push_back(2, edge_indices, edge_weights);\n\t\t\t\t\t}\n\n\t\t\t\t\tpolyhedron->vertex_points.push_back(polyhedron->vertex_points[edge2]);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\tvertex_attributes.push_back(edge2);\n\n\t\t\t\t\tpolyhedron->clockwise_edges[ccw_edge1] = new_edge1;\n\t\t\t\t\tpolyhedron->clockwise_edges[ccw_edge2] = new_edge2;\n\n\t\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[face]);\n\t\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\t\tpolyhedron->face_selections.push_back(0);\n\t\t\t\t\tpolyhedron->face_materials.push_back(polyhedron->face_materials[face]);\n\t\t\t\t\tface_attributes.push_back(face);\n\n\t\t\t\t\tpolyhedron->loop_first_edges.push_back(edge1);\n\n\t\t\t\t\tpolyhedron->loop_first_edges[polyhedron->face_first_loops[face]] = ccw_edge1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Deselect output points ...\n\t\tstd::fill(point_selection.begin(), point_selection.end(), 0);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<connect_vertices,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xbbe1c426, 0x07a54105, 0xbbdb5e49, 0xcaf1825e),\n\t\t\t\t\"ConnectVertices\",\n\t\t\t\t\"Creates edges between selected vertices\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttypedef k3d::mesh::indices_t edge_group_t;\n\ttypedef std::vector<edge_group_t> edge_groups_t;\n\n\tconst edge_groups_t get_edge_groups(const k3d::mesh::selection_t& PointSelection, const k3d::polyhedron::primitive& Polyhedron, const k3d::uint_t Face)\n\t{\n\t\tedge_groups_t edge_groups;\n\n\t\tconst k3d::uint_t face_first_edge = Polyhedron.loop_first_edges[Polyhedron.face_first_loops[Face]];\n\t\tfor(k3d::uint_t edge = face_first_edge; ;)\n\t\t{\n\t\t\tif(edge_groups.empty())\n\t\t\t{\n\t\t\t\tedge_groups.push_back(edge_group_t(1, edge));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst k3d::bool_t group_selected = PointSelection[Polyhedron.vertex_points[edge_groups.back().back()]];\n\t\t\t\tconst k3d::bool_t edge_selected = PointSelection[Polyhedron.vertex_points[edge]];\n\n\t\t\t\tif(group_selected != edge_selected)\n\t\t\t\t{\n\t\t\t\t\tedge_groups.push_back(edge_group_t(1, edge));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tedge_groups.back().push_back(edge);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\tif(edge == face_first_edge)\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// If the first and last groups have the same selection-state, they should be one big group ...\n\t\tif(edge_groups.size() > 1)\n\t\t{\n\t\t\tconst k3d::bool_t first_selected = PointSelection[Polyhedron.vertex_points[edge_groups.front().front()]];\n\t\t\tconst k3d::bool_t last_selected = PointSelection[Polyhedron.vertex_points[edge_groups.back().back()]];\n\t\t\tif(first_selected == last_selected)\n\t\t\t{\n\t\t\t\tedge_groups.back().insert(edge_groups.back().end(), edge_groups.front().begin(), edge_groups.front().end());\n\t\t\t\tedge_groups.erase(edge_groups.begin());\n\t\t\t}\n\t\t}\n\n\t\t// If there is more tnan one group, see to it that the first group is selected ...\n\t\tif(edge_groups.size() > 1)\n\t\t{\n\t\t\tconst k3d::bool_t first_selected = PointSelection[Polyhedron.vertex_points[edge_groups.front().front()]];\n\t\t\tif(!first_selected)\n\t\t\t{\n\t\t\t\tedge_groups.insert(edge_groups.end(), edge_groups.front());\n\t\t\t\tedge_groups.erase(edge_groups.begin());\n\t\t\t}\n\t\t}\n\n\t\treturn edge_groups;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// connect_vertices_factory\n\nk3d::iplugin_factory& connect_vertices_factory()\n{\n\treturn connect_vertices::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/delete_components.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/table.h>\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/utility.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// delete_components\n\nclass delete_components :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tdelete_components(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\n\t\t// Mark points to be explicitly removed by the user ...\n\t\tk3d::mesh::bools_t remove_points(Output.point_selection->begin(), Output.point_selection->end());\n\t\tconst k3d::uint_t point_begin = 0;\n\t\tconst k3d::uint_t point_end = point_begin + Output.point_selection->size();\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Mark edges to be explicitly removed by the user ...\n\t\t\tk3d::mesh::bools_t remove_edges(polyhedron->edge_selections.begin(), polyhedron->edge_selections.end());\n\n\t\t\t// Keep track of loops to be deleted ...\n\t\t\tk3d::mesh::bools_t remove_loops(polyhedron->loop_first_edges.size(), false);\n\n\t\t\t// Mark faces to be explicitly removed by the user ...\n\t\t\tk3d::mesh::bools_t remove_faces(polyhedron->face_selections.begin(), polyhedron->face_selections.end());\n\n\t\t\t// Make it happen ...\n\t\t\tk3d::polyhedron::delete_components(Output, *polyhedron, remove_points, remove_edges, remove_loops, remove_faces);\n\t\t}\n\n\t\t// Mark points to be implicitly removed because they're no-longer used ...\n\t\tk3d::mesh::bools_t unused_point;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_point);\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tif(!unused_point[point])\n\t\t\t\tcontinue;\n\n\t\t\tremove_points[point] = true;\n\t\t}\t\n\n\t\t// Delete points ...\n\t\tk3d::mesh::delete_points(Output, remove_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<delete_components,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x2d738b7a, 0x6f473349, 0x53a066ad, 0xa857f734),\n\t\t\t\t\"DeleteComponents\",\n\t\t\t\t\"Deletes selected faces, edges and vertices\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// delete_components_factory\n\nk3d::iplugin_factory& delete_components_factory()\n{\n\treturn delete_components::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/dissolve_faces.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dissolve_faces\n\nclass dissolve_faces :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tdissolve_faces(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tstatic void expand_face_group(\n\t\tconst k3d::polyhedron::primitive& Polyhedron,\n\t\tconst std::vector<k3d::mesh::indices_t>& AdjacencyList,\n\t\tconst k3d::uint_t Face,\n\t\tconst k3d::uint_t FaceGroup,\n\t\tstd::vector<boost::optional<k3d::uint_t> >& FaceGroups\n\t\t)\n\t{\n\t\tconst k3d::uint_t first_edge = Polyhedron.loop_first_edges[Polyhedron.face_first_loops[Face]];\n\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t{\n\t\t\tconst k3d::mesh::indices_t& neighbors = AdjacencyList[Polyhedron.vertex_points[edge]];\n\t\t\tfor(k3d::uint_t i = 0; i != neighbors.size(); ++i)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t neighbor = neighbors[i];\n\t\t\t\tif(!FaceGroups[neighbor] && Polyhedron.face_selections[neighbor])\n\t\t\t\t{\n\t\t\t\t\tFaceGroups[neighbor] = FaceGroup;\n\t\t\t\t\texpand_face_group(Polyhedron, AdjacencyList, neighbor, FaceGroup, FaceGroups);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\tif(edge == first_edge)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tstruct adjacency_edge\n\t{\n\t\tadjacency_edge(const k3d::uint_t StartPoint, const k3d::uint_t Edge, const k3d::uint_t EndPoint) :\n\t\t\tstart_point(StartPoint),\n\t\t\tedge(Edge),\n\t\t\tend_point(EndPoint)\n\t\t{\n\t\t}\n\n\t\tk3d::uint_t start_point;\n\t\tk3d::uint_t edge;\n\t\tk3d::uint_t end_point;\n\t};\n\n\ttypedef std::vector<adjacency_edge> adjacency_edges;\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\t\tk3d::table_copier point_attributes(Output.point_attributes);\n\n\t\t// Don't explicitly remove any points ...\n\t\tk3d::mesh::bools_t remove_points(points.size(), false);\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Keep track of faces to be deleted ...\n\t\t\tk3d::mesh::bools_t remove_faces(polyhedron->face_shells.size(), false);\n\n\t\t\t// Don't explicitly delete any edges ...\n\t\t\tk3d::mesh::bools_t remove_edges(polyhedron->clockwise_edges.size(), false);\n\n\t\t\t// Don't explicitly delete any loops ...\n\t\t\tk3d::mesh::bools_t remove_loops(polyhedron->loop_first_edges.size(), false);\n\t\t\t\n\t\t\t// Get ready to copy attributes ...\n\t\t\tk3d::table_copier face_attributes(polyhedron->face_attributes);\n\t\t\tk3d::table_copier edge_attributes(polyhedron->edge_attributes);\n\t\t\tk3d::table_copier vertex_attributes(polyhedron->vertex_attributes);\n\n\t\t\t// Compute a point-face adjacency list ...\n\t\t\tstd::vector<k3d::mesh::indices_t> adjacency_list;\n\t\t\tk3d::polyhedron::create_point_face_lookup(Output, *polyhedron, adjacency_list);\n\n\t\t\t// Compute edge-neighbor lookups ...\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::mesh::indices_t adjacent_edges;\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\n\t\t\t// Compute edge-face lookups ...\n\t\t\tk3d::mesh::indices_t edge_faces;\n\t\t\tk3d::polyhedron::create_edge_face_lookup(*polyhedron, edge_faces);\n\n\t\t\t// Label groups of selected, adjacent faces ...\n\t\t\tstd::vector<boost::optional<k3d::uint_t> > face_groups(polyhedron->face_shells.size());\n\t\t\tk3d::uint_t face_group_count = 0;\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tif(face_groups[face])\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif(polyhedron->face_selections[face])\n\t\t\t\t{\n\t\t\t\t\tface_groups[face] = ++face_group_count;\n\t\t\t\t\texpand_face_group(*polyhedron, adjacency_list, face, face_group_count, face_groups);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tface_groups[face] = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// For each face group ...\n\t\t\tfor(k3d::uint_t face_group = 1; face_group <= face_group_count; ++face_group)\n\t\t\t{\n\t\t\t\t// Keep track of faces in the group ...\n\t\t\t\tk3d::mesh::indices_t face_indices;\n\n\t\t\t\t// Keep track of edges to be retained ...\n\t\t\t\tadjacency_edges unsorted_edges;\n\n\t\t\t\t// For each face in the group ...\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tif(face_groups[face] != face_group)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tface_indices.push_back(face);\n\n\t\t\t\t\t// The original face will be removed ...\n\t\t\t\t\tremove_faces[face] = true;\n\n\t\t\t\t\t// Identify edges (if any) that are on the border of the group ...\n\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[polyhedron->face_first_loops[face]];\n\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t{\n\t\t\t\t\t\tif(boundary_edges[edge] || face_groups[edge_faces[adjacent_edges[edge]]] != face_group)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tunsorted_edges.push_back(\n\t\t\t\t\t\t\t\tadjacency_edge(\n\t\t\t\t\t\t\t\t\tpolyhedron->vertex_points[edge],\n\t\t\t\t\t\t\t\t\tedge,\n\t\t\t\t\t\t\t\t\tpolyhedron->vertex_points[polyhedron->clockwise_edges[edge]]\n\t\t\t\t\t\t\t\t\t));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(unsorted_edges.empty())\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"Can't dissolve all faces in a solid shape\" << std::endl;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Sort the edges into order so they form a continuous loop around the combined faces ...\n\t\t\t\tadjacency_edges sorted_edges;\n\t\t\t\tsorted_edges.push_back(unsorted_edges.back());\n\t\t\t\tunsorted_edges.pop_back();\n\n\t\t\t\twhile(unsorted_edges.size())\n\t\t\t\t{\n\t\t\t\t\tk3d::uint_t matched = 0;\n\t\t\t\t\tfor(adjacency_edges::iterator edge = unsorted_edges.begin(); edge != unsorted_edges.end(); ++edge)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(edge->end_point == sorted_edges.front().start_point)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsorted_edges.insert(sorted_edges.begin(), *edge);\n\t\t\t\t\t\t\tunsorted_edges.erase(edge);\n\t\t\t\t\t\t\t++matched;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(sorted_edges.back().end_point == edge->start_point)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsorted_edges.insert(sorted_edges.end(), *edge);\n\t\t\t\t\t\t\tunsorted_edges.erase(edge);\n\t\t\t\t\t\t\t++matched;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!matched)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Should never happen ...\n\t\t\t\tif(face_indices.empty())\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// Create a new face ...\n\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[face_indices.front()]);\n\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\tpolyhedron->face_selections.push_back(1);\n\t\t\t\tpolyhedron->face_materials.push_back(polyhedron->face_materials[face_indices.front()]);\n\n\t\t\t\tk3d::mesh::weights_t face_weights(face_indices.size(), 1.0 / face_indices.size());\n\t\t\t\tface_attributes.push_back(face_indices.size(), &face_indices[0], &face_weights[0]);\n\t\t\t\tremove_faces.push_back(false);\n\n\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\t\t\t\tremove_loops.push_back(false);\n\n\t\t\t\tfor(k3d::uint_t i = 0; i != sorted_edges.size(); ++i)\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\tpolyhedron->vertex_points.push_back(sorted_edges[i].start_point);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\t\tedge_attributes.push_back(sorted_edges[i].edge);\n\t\t\t\t\tvertex_attributes.push_back(sorted_edges[i].edge);\n\t\t\t\t\tremove_edges.push_back(false);\n\t\t\t\t}\n\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\t\t\t}\n\n\t\t\t// Make it happen ...\n\t\t\tk3d::polyhedron::delete_components(Output, *polyhedron, remove_points, remove_edges, remove_loops, remove_faces);\n\t\t}\n\n\t\t// Remove unused points ...\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<dissolve_faces,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x964fdfc2, 0x464d30e6, 0x4585c999, 0x4fea50cf),\n\t\t\t\t\"DissolveFaces\",\n\t\t\t\t\"Merges adjacent faces into a single large face.\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// factories\n\nk3d::iplugin_factory& dissolve_faces_factory()\n{\n\treturn dissolve_faces::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/extrude_faces.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/optional.hpp>\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// extrude_faces\n\nclass extrude_faces :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\textrude_faces(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_segments(init_owner(*this) + init_name(\"segments\") + init_label(_(\"Segments\")) + init_description(_(\"Segment number between original and new faces.\")) + init_value(1) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n                m_group_faces(init_owner(*this) + init_name(\"group_faces\") + init_label(_(\"Group Faces\")) + init_description(_(\"Group neighboring faces together.\")) + init_value(true)),\n\t\tm_group_normals(init_owner(*this) + init_name(\"group_normals\") + init_label(_(\"Group Normals\")) + init_description(_(\"When grouping neighboring faces together, use the same (averaged) normal vector for every face in the group.\")) + init_value(false)),\n\t\tm_select_new_faces(init_owner(*this) + init_name(\"select_new_faces\") + init_label(_(\"Select New Faces\")) + init_description(_(\"Select newly-created faces.\")) + init_value(false)),\n\t\tm_distance(init_owner(*this) + init_name(\"distance\") + init_label(_(\"Distance\")) + init_description(_(\"Distance between original and new faces\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_inset(init_owner(*this) + init_name(\"inset\") + init_label(_(\"Inset\")) + init_description(_(\"Inset value for the new faces\")) + init_value(0.0) + init_step_increment(0.02) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_group_faces.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_group_normals.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_select_new_faces.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\t\n\t\tm_distance.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_inset.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\t// Create output geometry ...\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\n\t\tconst k3d::int32_t segments = m_segments.pipeline_value();\n\t\tconst k3d::bool_t group_faces = m_group_faces.pipeline_value();\n\t\tconst k3d::bool_t group_normals = m_group_normals.pipeline_value();\n\t\tconst k3d::bool_t select_new_faces = m_select_new_faces.pipeline_value();\n\n\t\t// Clear previously cached data ...\n\t\textrude_vertices.clear();\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Get ready to copy attributes ...\n\t\t\tk3d::table_copier point_attributes(Output.point_attributes);\n\t\t\tk3d::table_copier edge_attributes(polyhedron->edge_attributes);\n\t\t\tk3d::table_copier vertex_attributes(polyhedron->vertex_attributes);\n\t\t\tk3d::table_copier face_attributes(polyhedron->face_attributes);\n\n\t\t\t// Compute a mapping from edges to faces ...\n\t\t\tk3d::mesh::indices_t edge_faces;\n\t\t\tk3d::polyhedron::create_edge_face_lookup(*polyhedron, edge_faces);\n\n\t\t\t// Compute links to adjacent edges ...\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::mesh::indices_t adjacent_edges;\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\n\t\t\t// Identify edges that will be extruded ...\n\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\tconst k3d::uint_t edge_end = edge_begin + polyhedron->clockwise_edges.size();\n\t\t\tk3d::mesh::bools_t extrusion_edges(polyhedron->clockwise_edges.size(), false);\n\t\t\tk3d::mesh::bools_t border_edges(polyhedron->clockwise_edges.size(), false);\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\t// Every edge that's adjacent to a selected face will be an extrusion edge ...\n\t\t\t\tif(!polyhedron->face_selections[edge_faces[edge]])\n\t\t\t\t\tcontinue;\n\n\t\t\t\textrusion_edges[edge] = true;\n\n\t\t\t\t// Identify edges on the extrusion boundary ...\n\t\t\t\tif(group_faces && !boundary_edges[edge] && polyhedron->face_selections[edge_faces[adjacent_edges[edge]]])\n\t\t\t\t\tcontinue;\n\n\t\t\t\tborder_edges[edge] = true;\n\t\t\t}\n\n\t\t\t// Identify clockwise boundary edges ...\n\t\t\tk3d::mesh::indices_t clockwise_border_edges(polyhedron->clockwise_edges.size(), k3d::uint_t(-1));\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(!border_edges[edge])\n\t\t\t\t\tcontinue;\n\n\t\t\t\tk3d::uint_t clockwise_edge = polyhedron->clockwise_edges[edge];\n\t\t\t\twhile(!border_edges[clockwise_edge])\n\t\t\t\t\tclockwise_edge = polyhedron->clockwise_edges[adjacent_edges[clockwise_edge]];\n\t\t\t\tclockwise_border_edges[edge] = clockwise_edge;\n\t\t\t}\n\n\t\t\t// Identify counterclockwise boundary edges ...\n\t\t\tk3d::mesh::indices_t counterclockwise_border_edges(polyhedron->clockwise_edges.size());\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(!border_edges[edge])\n\t\t\t\t\tcontinue;\n\n\t\t\t\tcounterclockwise_border_edges[clockwise_border_edges[edge]] = edge;\n\t\t\t}\n\n\t\t\t// Compute face normal vectors ...\n\t\t\tk3d::mesh::normals_t face_normals;\n\t\t\tk3d::polyhedron::create_face_normal_lookup(Output, *polyhedron, face_normals);\n\n\t\t\t// Compute the normal vector for each vertex ...\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\tk3d::mesh::vectors_t vertex_normals(polyhedron->clockwise_edges.size(), k3d::vector3(0, 0, 0));\n\t\t\tk3d::mesh::vectors_t point_normals(points.size(), k3d::vector3(0, 0, 0));\n\t\t\tif(group_faces)\n\t\t\t{\n\t\t\t\tif(group_normals)\n\t\t\t\t{\n\t\t\t\t\tk3d::normal3 normal(0, 0, 0);\n\t\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!polyhedron->face_selections[face])\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tnormal += face_normals[face];\n\t\t\t\t\t}\n\t\t\t\t\tstd::fill(vertex_normals.begin(), vertex_normals.end(), k3d::to_vector(k3d::normalize(normal)));\n\t\t\t\t\tstd::fill(point_normals.begin(), point_normals.end(), k3d::to_vector(k3d::normalize(normal)));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t\n\t\t\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t\t\tpoint_normals[polyhedron->vertex_points[edge]] += k3d::to_vector(face_normals[edge_faces[edge]]);\n\t\t\t\t\tfor(k3d::uint_t i = 0; i != points.size(); ++i)\n\t\t\t\t\t\tpoint_normals[i] = k3d::normalize(point_normals[i]);\n\t\t\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t\t\tvertex_normals[edge] = point_normals[polyhedron->vertex_points[edge]];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tvertex_normals[edge] = k3d::to_vector(k3d::normalize(face_normals[edge_faces[edge]]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Compute the inset direction for each edge ...\n\t\t\tk3d::mesh::vectors_t edge_insets(polyhedron->clockwise_edges.size());\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tedge_insets[edge] = k3d::normalize((points[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]] - points[polyhedron->vertex_points[edge]]) ^ face_normals[edge_faces[edge]]);\n\t\t\t}\n\n\t\t\t// Keep track of a mapping from old vertex points to new vertex points ...\n\t\t\tk3d::mesh::indices_t vertex_point_map(polyhedron->vertex_points.size());\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\tvertex_point_map[edge] = polyhedron->vertex_points[edge];\n\n\t\t\t// For each segment ...\n\t\t\tstd::vector<k3d::mesh::indices_t> layer_vertex_points(segments + 1, polyhedron->vertex_points);\n\t\t\tfor(k3d::int32_t segment = 0; segment != segments; ++segment)\n\t\t\t{\n\t\t\t\tstd::vector<boost::optional<k3d::uint_t> > layer_points(points.size());\n\n\t\t\t\t// Create border-edge vertices ...\n\t\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(!border_edges[edge])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t old_point = polyhedron->vertex_points[edge];\n\t\t\t\t\tconst k3d::uint_t new_point = points.size();\n\n\t\t\t\t\tlayer_points[old_point] = new_point;\n\t\t\t\t\tvertex_point_map[edge] = new_point;\n\t\t\t\t\tlayer_vertex_points[segment + 1][edge] = new_point;\n\n\t\t\t\t\tconst k3d::vector3 inset1 = edge_insets[edge];\n\t\t\t\t\tconst k3d::vector3 inset2 = edge_insets[counterclockwise_border_edges[edge]];\n\n\t\t\t\t\textrude_vertices.push_back(\n\t\t\t\t\t\textrude_vertex(\n\t\t\t\t\t\t\tnew_point,\n\t\t\t\t\t\t\tpoints[old_point],\n\t\t\t\t\t\t\tvertex_normals[edge],\n\t\t\t\t\t\t\t(-1 / std::cos(std::acos(inset1 * inset2) / 2)) * k3d::normalize(inset1 + inset2),\n\t\t\t\t\t\t\tk3d::ratio(segment + 1, segments)));\n\n\t\t\t\t\tpoints.push_back(k3d::point3());\n\t\t\t\t\tpoint_selection.push_back(0);\n\t\t\t\t\tpoint_attributes.push_back(polyhedron->vertex_points[edge]);\n\t\t\t\t}\n\n\t\t\t\t// Create interior extrusion-edge vertices ...\n\t\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(!extrusion_edges[edge])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tif(border_edges[edge])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t old_point = polyhedron->vertex_points[edge];\n\t\t\t\t\tif(group_faces && layer_points[old_point])\n\t\t\t\t\t{\n\t\t\t\t\t\tvertex_point_map[edge] = *layer_points[old_point];\n\t\t\t\t\t\tlayer_vertex_points[segment + 1][edge] = *layer_points[old_point];\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst k3d::uint_t new_point = points.size();\n\n\t\t\t\t\tlayer_points[old_point] = new_point;\n\t\t\t\t\tvertex_point_map[edge] = new_point;\n\t\t\t\t\tlayer_vertex_points[segment + 1][edge] = new_point;\n\n\t\t\t\t\textrude_vertices.push_back(\n\t\t\t\t\t\textrude_vertex(\n\t\t\t\t\t\t\tnew_point,\n\t\t\t\t\t\t\tpoints[old_point],\n\t\t\t\t\t\t\tvertex_normals[edge],\n\t\t\t\t\t\t\tk3d::vector3(0, 0, 0),\n\t\t\t\t\t\t\tk3d::ratio(segment + 1, segments)));\n\n\t\t\t\t\tpoints.push_back(k3d::point3());\n\t\t\t\t\tpoint_selection.push_back(0);\n\t\t\t\t\tpoint_attributes.push_back(polyhedron->vertex_points[edge]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remap vertices to newly-created points ...\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\tpolyhedron->vertex_points[edge] = vertex_point_map[edge];\n\n\t\t\t// For each extrusion edge, create bevel faces ...\n\t\t\tfor(k3d::int32_t segment = 0; segment != segments; ++segment)\n\t\t\t{\n\t\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(!border_edges[edge])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t new_first_edge = polyhedron->clockwise_edges.size();\n\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() - 3);\n\n\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\n\t\t\t\t\tedge_attributes.push_back(edge);\n\t\t\t\t\tedge_attributes.push_back(edge);\n\t\t\t\t\tedge_attributes.push_back(edge);\n\t\t\t\t\tedge_attributes.push_back(edge);\n\n\t\t\t\t\tpolyhedron->vertex_points.push_back(layer_vertex_points[segment + 1][clockwise_border_edges[edge]]);\n\t\t\t\t\tpolyhedron->vertex_points.push_back(layer_vertex_points[segment + 1][edge]);\n\t\t\t\t\tpolyhedron->vertex_points.push_back(layer_vertex_points[segment][edge]);\n\t\t\t\t\tpolyhedron->vertex_points.push_back(layer_vertex_points[segment][clockwise_border_edges[edge]]);\n\n\t\t\t\t\tvertex_attributes.push_back(clockwise_border_edges[edge]);\n\t\t\t\t\tvertex_attributes.push_back(edge);\n\t\t\t\t\tvertex_attributes.push_back(edge);\n\t\t\t\t\tvertex_attributes.push_back(clockwise_border_edges[edge]);\n\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[edge_faces[edge]]);\n\t\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\t\tpolyhedron->face_selections.push_back(select_new_faces ? 1 : 0);\n\t\t\t\t\tpolyhedron->face_materials.push_back(polyhedron->face_materials[edge_faces[edge]]);\n\n\t\t\t\t\tface_attributes.push_back(edge_faces[edge]);\n\n\t\t\t\t\tpolyhedron->loop_first_edges.push_back(new_first_edge);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points, point_map);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::double_t distance = m_distance.pipeline_value();\n\t\tconst k3d::double_t inset = m_inset.pipeline_value();\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\n\t\tconst k3d::uint_t vertex_begin = 0;\n\t\tconst k3d::uint_t vertex_end = vertex_begin + extrude_vertices.size();\n\t\tfor(k3d::uint_t vertex_index = vertex_begin; vertex_index != vertex_end; ++vertex_index)\n\t\t{\n\t\t\tconst extrude_vertex& vertex = extrude_vertices[vertex_index];\n\n\t\t\tpoints[point_map[vertex.point]] =\n\t\t\t\tk3d::mix(vertex.start, vertex.start + (distance * vertex.extrude_direction) + (inset * vertex.inset_direction), vertex.ratio);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<extrude_faces,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xdbd23c4e, 0x7119478c, 0x9ab2ee83, 0x5b56d527),\n\t\t\t\t\"ExtrudeFaces\",\n\t\t\t\t_(\"Extrudes selected faces along their normals\"),\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_segments;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_group_faces;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_group_normals;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_select_new_faces;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_distance;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_inset;\n\n\t/// Caches new points for better interactive performance\n\tclass extrude_vertex\n\t{\n\tpublic:\n\t\textrude_vertex(const k3d::uint_t Point, const k3d::point3& Start, const k3d::vector3& ExtrudeDirection, const k3d::vector3& InsetDirection, const k3d::double_t Ratio) :\n\t\t\tpoint(Point),\n\t\t\tstart(Start),\n\t\t\textrude_direction(ExtrudeDirection),\n\t\t\tinset_direction(InsetDirection),\n\t\t\tratio(Ratio)\n\t\t{\n\t\t}\n\n\t\tfriend std::ostream& operator<<(std::ostream& Stream, const extrude_vertex& Value)\n\t\t{\n\t\t\tStream << Value.point << \" | \" << Value.start << \" | \" << Value.extrude_direction << \" | \" << Value.inset_direction << \" | \" << Value.ratio;\n\t\t\treturn Stream;\n\t\t}\n\n\t\tk3d::uint_t point;\n\t\tk3d::point3 start;\n\t\tk3d::vector3 extrude_direction;\n\t\tk3d::vector3 inset_direction;\n\t\tk3d::double_t ratio;\n\t};\n\n\t/// Caches new points for better interactive performance\n\tstd::vector<extrude_vertex> extrude_vertices;\n\t/// Caches a mapping from the original input point indices to the new output point indices (because we delete existing points)\n\tk3d::mesh::indices_t point_map;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// extrude_faces_factory\n\nk3d::iplugin_factory& extrude_faces_factory()\n{\n\treturn extrude_faces::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/fillet_edges.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/legacy_mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/vectors.h>\n\n#include \"helpers.h\"\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace detail\n{\n\n/// Seth Teller's algorithm to find the shortest path between two lines\ndouble point_plane_distance(const k3d::point3& a, const k3d::point4& P)\n{\n\treturn (a[0] * P[0] + a[1] * P[1] + a[2] * P[2] + P[3]);\n}\n\n// Intersect line (a, b) and plane\nk3d::point3 intersect_line_plane(const k3d::point3& a, const k3d::point3& b, const k3d::point4& Plane)\n{\n\tdouble Mdota = point_plane_distance(a, Plane);\n\tdouble Mdotb = point_plane_distance(b, Plane);\n\n\tdouble denom = Mdota - Mdotb;\n\tif(std::abs(denom / (std::abs(Mdota) + std::abs(Mdotb))) < 1.0e-6)\n\t{\n\t\tk3d::log() << \"int_line_plane(): no intersection?\" << std::endl;\n\t\treturn k3d::point3(0, 0, 0);\n\t}\n\n\tdouble t = Mdota / denom;\n\n\t// Lerp\n\treturn (1 - t) * a + t * b;\n}\n\nk3d::point4 plane_from_two_vectors_and_point(const k3d::vector3& u, const k3d::vector3 v, const k3d::point3& p)\n{\n\tconst k3d::point3 temp(k3d::to_point(k3d::normalize(u ^ v)));\n\tk3d::point4 plane(temp[0], temp[1], temp[2], 1);\n\n\t// Plane contains p\n\tplane[3] = -(plane[0] * p[0] + plane[1] * p[1] + plane[2] * p[2]);\n\n\treturn plane;\n}\n\n// Computes closest point on line A to line B, and on line B to line A\nbool line_line_closest_points(\n\tconst k3d::point3& a, const k3d::vector3& adir,\n\tconst k3d::point3& b, const k3d::vector3& bdir,\n\tk3d::point3& a_closest, k3d::point3& b_closest)\n{\n\t// Connecting line is perpendicular to both\n\tk3d::vector3 cdir = k3d::normalize(adir ^ bdir);\n\n\t// Lines are near-parallel -- all points are closest\n\tif(!cdir.length2())\n\t{\n\t\ta_closest = a;\n\t\tb_closest = b;\n\n\t\treturn false;\n\t}\n\n\t// Form plane containing line A, parallel to cdir\n\tk3d::point4 ac = plane_from_two_vectors_and_point(cdir, adir, a);\n\t// Form plane containing line B, parallel to cdir\n\tk3d::point4 bc = plane_from_two_vectors_and_point(cdir, bdir, b);\n\n\t// Closest point on A is line A ^ bc\n\ta_closest = intersect_line_plane(a, a + adir, bc);\n\t// Closest point on B is line B ^ ac\n\tb_closest = intersect_line_plane(b, b + bdir, ac);\n\n\treturn true;\n}\n\n} // namespace detail\n\nnamespace detail\n{\n\ntypedef std::map<k3d::legacy::split_edge*, unsigned long> edge_set_t;\ntypedef std::map<k3d::legacy::split_edge*, k3d::legacy::face*> edge_face_map_t;\n\n/// Functor that gets selected edges\nstruct get_edges\n{\n\tget_edges(edge_set_t& Edges, edge_face_map_t& EdgeFaceMap) :\n\t\tedges(Edges), edge_face_map(EdgeFaceMap), index(0)\n\t{\n\t}\n\n\tvoid operator()(k3d::legacy::split_edge* Edge, k3d::legacy::face* Face)\n\t{\n\t\t// Can't fillet border edges\n\t\tif(!Edge->companion)\n\t\t\treturn;\n\n\t\tif(Edge->selection_weight || Edge->companion->selection_weight)\n\t\t{\n\t\t\t// Save edge\n\t\t\tedges.insert(std::make_pair(Edge, index++));\n\t\t\tedge_face_map.insert(std::make_pair(Edge, Face));\n\t\t}\n\t}\n\n\tedge_set_t& edges;\n\tedge_face_map_t& edge_face_map;\n\n\t// Index edges to always process them in the same order (procedural modeling)\n\tunsigned long index;\n};\n\n/// Function template in the spirit of std::for_each that applies a functor to every edge in a polyhedron\ntemplate<typename T>\nvoid for_each_edge_face(k3d::legacy::polyhedron& Polyhedron, T Functor)\n{\n\tfor(k3d::legacy::polyhedron::faces_t::const_iterator face = Polyhedron.faces.begin(); face != Polyhedron.faces.end(); ++face)\n\t{\n\t\tk3d::legacy::split_edge* edge = (*face)->first_edge;\n\t\tdo\n\t\t{\n\t\t\tFunctor(edge, *face);\n\n\t\t\tedge = edge->face_clockwise;\n\t\t}\n\t\twhile(edge != (*face)->first_edge);\n\n\t\t// Face holes\n\t\tfor(k3d::legacy::face::holes_t::iterator hole = (*face)->holes.begin(); hole != (*face)->holes.end(); ++hole)\n\t\t{\n\t\t\tfor(k3d::legacy::split_edge* edge = *hole; edge; edge = edge->face_clockwise)\n\t\t\t{\n\t\t\t\tFunctor(edge, *face);\n\n\t\t\t\tif(edge->face_clockwise == (*hole))\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nstruct border_point\n{\n\tborder_point(k3d::legacy::point* Vertex, k3d::vector3& Direction) :\n\t\tvertex(Vertex), direction(Direction), start_position(Vertex->position)\n\t{\n\t}\n\n\tvoid update(const double Radius)\n\t{\n\t\tvertex->position = start_position + Radius * direction;\n\t}\n\n\tk3d::legacy::point* vertex;\n\tk3d::vector3 direction;\n\tk3d::point3 start_position;\n};\n\ntypedef std::map<k3d::legacy::point*, border_point*> border_points_t;\ntypedef std::vector<border_point*> border_point_list_t;\ntypedef std::map<k3d::legacy::face*, border_point_list_t> face_points_t;\ntypedef std::map<k3d::legacy::point*, k3d::legacy::point*> point_map_t;\ntypedef std::vector<k3d::legacy::split_edge*> edges_t;\n\n// Returns edge with smallest index in edge_set_t\nk3d::legacy::split_edge* smallest_index_edge(edge_set_t& EdgeSet)\n{\n\treturn_val_if_fail(EdgeSet.size(), 0);\n\n\tedge_set_t::iterator edge = EdgeSet.begin();\n\tk3d::legacy::split_edge* min_edge = edge->first;\n\tunsigned long min_index = edge->second;\n\n\twhile(++edge != EdgeSet.end())\n\t{\n\t\tif(edge->second < min_index)\n\t\t{\n\t\t\tmin_index = edge->second;\n\t\t\tmin_edge = edge->first;\n\t\t}\n\t}\n\n\treturn min_edge;\n}\n\n/// Unwelds edges where a fillet will be inserted\nvoid unweld_edges(edge_set_t& Edges, const edge_face_map_t& EdgeFaceMap, const double Radius, k3d::legacy::polyhedron& Polyhedron, k3d::legacy::mesh& Mesh, border_points_t& BorderPoints, point_map_t& OldPointsMap, edge_set_t& LoopEnds)\n{\n\t// Make a copy of the edge set\n\tedge_set_t edges = Edges;\n\n\t// For each face, save its belonging unwelded points\n\tface_points_t face_points;\n\n\tunsigned long edge_set_index = Edges.size();\n\twhile(edges.size())\n\t{\n\t\t// Save edge number for later sanity check\n\t\tconst unsigned long previous_border_edge_number = edges.size();\n\n\t\t// Find a region border from first border edge\n\t\tedges_t edge_loop;\n\t\tk3d::legacy::split_edge* edge = smallest_index_edge(edges);\n\n\t\tk3d::legacy::split_edge* first_edge = edge;\n\t\tdo\n\t\t{\n\t\t\treturn_if_fail(edges.size());\n\n\t\t\t// Add edge to loop\n\t\t\tedge_loop.push_back(edge);\n\n\t\t\tk3d::legacy::split_edge* next_edge = edge->face_clockwise;\n\t\t\twhile(edges.find(next_edge) == edges.end())\n\t\t\t{\n\t\t\t\tif(next_edge->companion)\n\t\t\t\t\t// Turn around next_edge->vertex to find next edge to fillet\n\t\t\t\t\tnext_edge = next_edge->companion->face_clockwise;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Reached a border edge, turn back\n\t\t\t\t\tnext_edge = edge->companion;\n\t\t\t\t\t//assert_warning(edges.find(next_edge) == edges.end());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\treturn_if_fail(next_edge != edge->face_clockwise);\n\t\t\t}\n\n\t\t\tedge = next_edge;\n\t\t}\n\t\twhile(edge != first_edge);\n\n\t\t// Remove region edges\n\t\tfor(edges_t::iterator edge_i = edge_loop.begin(); edge_i != edge_loop.end(); ++edge_i)\n\t\t{\n\t\t\tedges.erase(*edge_i);\n\t\t}\n\n\t\t// Sanity checks\n\t\treturn_if_fail(edge_loop.size());\n\t\treturn_if_fail(edges.size() < previous_border_edge_number);\n\n\t\t// Unweld loop points and calculate their moving direction\n\t\tfor(edges_t::iterator edge_i = edge_loop.begin(); edge_i != edge_loop.end(); ++edge_i)\n\t\t{\n\t\t\tedge = *edge_i;\n\t\t\tk3d::legacy::split_edge* next_loop_edge = (edge_i + 1 != edge_loop.end()) ? *(edge_i + 1) : *edge_loop.begin();\n\t\t\tk3d::legacy::split_edge* next_edge = edge->face_clockwise;\n\n\t\t\tif(edge->companion == next_loop_edge)\n\t\t\t{\n\t\t\t\t// It's a non-loop end\n\t\t\t\tLoopEnds.insert(std::make_pair(edge, ++edge_set_index));\n\n\t\t\t\tk3d::legacy::point* old_point = next_edge->vertex;\n\t\t\t\tk3d::legacy::point* new_point = new k3d::legacy::point(old_point->position);\n\t\t\t\tMesh.points.push_back(new_point);\n\t\t\t\tOldPointsMap.insert(std::make_pair(new_point, old_point));\n\n\t\t\t\tnext_edge->vertex = new_point;\n\n\t\t\t\tk3d::vector3 direction = k3d::normalize(next_edge->face_clockwise->vertex->position - next_edge->vertex->position);\n\t\t\t\tborder_point* b_point = new border_point(new_point, direction);\n\t\t\t\tBorderPoints.insert(std::make_pair(new_point, b_point));\n\n\t\t\t\t// Assign point to face\n\t\t\t\tedge_face_map_t::const_iterator edge_face = EdgeFaceMap.find(edge);\n\t\t\t\treturn_if_fail(edge_face != EdgeFaceMap.end());\n\t\t\t\tface_points_t::iterator face_i = face_points.find(edge_face->second);\n\t\t\t\tif(face_i == face_points.end())\n\t\t\t\t{\n\t\t\t\t\tstd::vector<border_point*> points;\n\t\t\t\t\tpoints.push_back(b_point);\n\t\t\t\t\tface_points.insert(std::make_pair(edge_face->second, points));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tface_i->second.push_back(b_point);\n\t\t\t\t}\n\n\t\t\t\t// Second edge\n\t\t\t\tk3d::legacy::point* old_point2 = next_loop_edge->vertex;\n\t\t\t\tk3d::legacy::point* new_point2 = new k3d::legacy::point(old_point2->position);\n\t\t\t\tMesh.points.push_back(new_point2);\n\t\t\t\tOldPointsMap.insert(std::make_pair(new_point2, old_point2));\n\n\t\t\t\tnext_loop_edge->vertex = new_point2;\n\n\t\t\t\tk3d::vector3 direction2 = k3d::normalize(k3d::legacy::face_anticlockwise(next_loop_edge)->vertex->position - next_loop_edge->vertex->position);\n\t\t\t\tborder_point* b_point2 = new border_point(new_point2, direction2);\n\t\t\t\tBorderPoints.insert(std::make_pair(new_point2, b_point2));\n\n\t\t\t\t// Assign point to face\n\t\t\t\tedge_face_map_t::const_iterator edge_face2 = EdgeFaceMap.find(next_loop_edge);\n\t\t\t\treturn_if_fail(edge_face2 != EdgeFaceMap.end());\n\t\t\t\tface_points_t::iterator face_i2 = face_points.find(edge_face2->second);\n\t\t\t\tif(face_i2 == face_points.end())\n\t\t\t\t{\n\t\t\t\t\tstd::vector<border_point*> points;\n\t\t\t\t\tpoints.push_back(b_point2);\n\t\t\t\t\tface_points.insert(std::make_pair(edge_face2->second, points));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tface_i2->second.push_back(b_point2);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tk3d::vector3 direction(0, 0, 0);\n\n\t\t\t\tk3d::legacy::point* old_point = next_edge->vertex;\n\t\t\t\tk3d::legacy::point* new_point = new k3d::legacy::point(old_point->position);\n\t\t\t\tMesh.points.push_back(new_point);\n\t\t\t\tOldPointsMap.insert(std::make_pair(new_point, old_point));\n\n\t\t\t\tif(next_edge == next_loop_edge)\n\t\t\t\t{\n\t\t\t\t\t// Point moves previous and next edge normals (in their face's plane)\n\t\t\t\t\tnext_edge->vertex = new_point;\n\n\t\t\t\t\tk3d::vector3 edge_direction = edge->face_clockwise->vertex->position - edge->vertex->position;\n\t\t\t\t\tk3d::vector3 next_edge_direction = next_edge->face_clockwise->vertex->position - next_edge->vertex->position;\n\n\t\t\t\t\tedge_face_map_t::const_iterator face = EdgeFaceMap.find(edge);\n\t\t\t\t\treturn_if_fail(face != EdgeFaceMap.end());\n\t\t\t\t\tk3d::normal3 normal = k3d::legacy::normal(*face->second);\n\n\t\t\t\t\tedge_face_map_t::const_iterator next_face = EdgeFaceMap.find(next_edge);\n\t\t\t\t\treturn_if_fail(next_face != EdgeFaceMap.end());\n\t\t\t\t\tk3d::normal3 next_normal = k3d::legacy::normal(*next_face->second);\n\n\t\t\t\t\t// Edge normal in face\n\t\t\t\t\tk3d::vector3 dir = k3d::normalize(normal ^ edge_direction);\n\t\t\t\t\tk3d::vector3 next_dir = k3d::normalize(next_normal ^ next_edge_direction);\n\n\t\t\t\t\tdirection = dir + next_dir;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Point moves along sum of interior edge directions\n\t\t\t\t\tdo\n\t\t\t\t\t{\n\t\t\t\t\t\tnext_edge->vertex = new_point;\n\n\t\t\t\t\t\tk3d::vector3 edge_direction = k3d::normalize(next_edge->face_clockwise->vertex->position - next_edge->vertex->position);\n\t\t\t\t\t\tdirection += edge_direction;\n\n\t\t\t\t\t\tnext_edge = next_edge->companion->face_clockwise;\n\t\t\t\t\t}\n\t\t\t\t\twhile(next_edge != next_loop_edge);\n\n\t\t\t\t\tnext_edge->vertex = new_point;\n\t\t\t\t}\n\n\t\t\t\t// Save point\n\t\t\t\tborder_point* b_point = new border_point(new_point, direction);\n\t\t\t\tBorderPoints.insert(std::make_pair(new_point, b_point));\n\n\t\t\t\t// Assign point to face\n\t\t\t\tedge_face_map_t::const_iterator edge_face = EdgeFaceMap.find(edge);\n\t\t\t\treturn_if_fail(edge_face != EdgeFaceMap.end());\n\t\t\t\tface_points_t::iterator face_i = face_points.find(edge_face->second);\n\t\t\t\tif(face_i == face_points.end())\n\t\t\t\t{\n\t\t\t\t\tstd::vector<border_point*> points;\n\t\t\t\t\tpoints.push_back(b_point);\n\t\t\t\t\tface_points.insert(std::make_pair(edge_face->second, points));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tface_i->second.push_back(b_point);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Move away edges according to fillet radius\n\tfor(face_points_t::iterator fp_i = face_points.begin(); fp_i != face_points.end(); ++fp_i)\n\t{\n\t\tk3d::legacy::face* face = fp_i->first;\n\n\t\tborder_point_list_t& border_points = fp_i->second;\n\t\tfor(border_point_list_t::iterator point = border_points.begin(); point != border_points.end(); ++point)\n\t\t{\n\t\t\t(*point)->update(Radius);\n\t\t}\n\n\t\t// Detect face flip\n\t\tk3d::vector3 edge1_dir1 = k3d::normalize(face->first_edge->face_clockwise->vertex->position - face->first_edge->vertex->position);\n\t\tk3d::vector3 edge1_dir2 = k3d::normalize(face->first_edge->face_clockwise->vertex->position - face->first_edge->vertex->position);\n\n\t\tif(edge1_dir1 * edge1_dir2 < 0)\n\t\t{\n\t\t\t// Remove edges\n\t\t\tfor(border_point_list_t::iterator point = border_points.begin(); point != border_points.end(); ++point)\n\t\t\t{\n\t\t\t\tBorderPoints.erase((*point)->vertex);\n\t\t\t\tdelete *point;\n\t\t\t}\n\n\t\t\tk3d::legacy::split_edge* edge = face->first_edge;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tEdges.erase(edge);\n\n\t\t\t\tedge = edge->face_clockwise;\n\t\t\t}\n\t\t\twhile(edge != face->first_edge);\n\n\t\t\tPolyhedron.faces.erase(std::remove(Polyhedron.faces.begin(), Polyhedron.faces.end(), face), Polyhedron.faces.end());\n\t\t\tdelete face;\n\t\t}\n\t}\n}\n\n/// Calculates triangle normal using summation method\nk3d::vector3 summation_normal(const k3d::point3& p1, const k3d::point3& p2, const k3d::point3& p3)\n{\n\tdouble x = 0;\n\tdouble y = 0;\n\tdouble z = 0;\n\n\tx += (p1[1] - p2[1]) * (p1[2] + p2[2]);\n\ty += (p1[2] - p2[2]) * (p1[0] + p2[0]);\n\tz += (p1[0] - p2[0]) * (p1[1] + p2[1]);\n\n\tx += (p2[1] - p3[1]) * (p2[2] + p3[2]);\n\ty += (p2[2] - p3[2]) * (p2[0] + p3[0]);\n\tz += (p2[0] - p3[0]) * (p2[1] + p3[1]);\n\n\tx += (p3[1] - p1[1]) * (p3[2] + p1[2]);\n\ty += (p3[2] - p1[2]) * (p3[0] + p1[0]);\n\tz += (p3[0] - p1[0]) * (p3[1] + p1[1]);\n\n\treturn k3d::vector3(x, y, z);\n}\n\ntypedef std::vector<k3d::point3> points_t;\nk3d::point3 slerp_points(const unsigned long SegmentNumber, const k3d::point3& Vertex1, const k3d::vector3& Normal1, const k3d::point3& Vertex2, const k3d::vector3& Normal2, points_t& NewPoints)\n{\n\tk3d::point3 intersection1;\n\tk3d::point3 intersection2;\n\tline_line_closest_points(Vertex1, Normal1, Vertex2, Normal2, intersection1, intersection2);\n\n\t// The two points should be identical but get the average\n\tk3d::point3 rotation_center = 0.5 * (intersection1 + intersection2);\n\n\t// Get start and end vectors for Slerp\n\tk3d::vector3 orientation1 = Vertex1 - rotation_center;\n\tconst double length1 = orientation1.length();\n\treturn_val_if_fail(length1 > 0, rotation_center);\n\torientation1 /= length1;\n\n\tk3d::vector3 orientation2 = Vertex2 - rotation_center;\n\tconst double length2 = orientation2.length();\n\treturn_val_if_fail(length2 > 0, rotation_center);\n\torientation2 /= length2;\n\n\t// Slerp vectors\n\tk3d::quaternion qrot1(0, orientation1);\n\tk3d::quaternion qrot2(0, orientation2);\n\n\tconst double segment_number = static_cast<double>(SegmentNumber);\n\tfor(unsigned long n = 1; n < SegmentNumber; ++n)\n\t{\n\t\tconst double t = static_cast<double>(n) / segment_number;\n\n\t\tk3d::quaternion rotation = k3d::Slerp(qrot1, qrot2, t * 0.5);\n\t\tk3d::vector3 new_orientation = k3d::rotate3(rotation) * orientation1;\n\t\tconst double length_lerp = length1 + t * (length2 - length1);\n\t\tk3d::point3 new_position = rotation_center + length_lerp * new_orientation;\n\n\t\tNewPoints.push_back(new_position);\n\t}\n\n\treturn rotation_center;\n}\n\nk3d::point3 lerp_points(const unsigned long SegmentNumber, const k3d::point3& Vertex1, const k3d::vector3& Normal1, const k3d::point3& Vertex2, const k3d::vector3& Normal2, points_t& NewPoints)\n{\n\tconst k3d::vector3 direction = Vertex2 - Vertex1;\n\n\tconst double segment_number = static_cast<double>(SegmentNumber);\n\tfor(unsigned long n = 1; n < SegmentNumber; ++n)\n\t{\n\t\tconst double t = static_cast<double>(n) / segment_number;\n\n\t\tNewPoints.push_back(Vertex1 + t * direction);\n\t}\n\n\treturn (Vertex1 + Vertex2) / 2;\n}\n\nk3d::legacy::face* add_quad(k3d::legacy::point* P1, k3d::legacy::point* P2, k3d::legacy::point* P3, k3d::legacy::point* P4, k3d::imaterial* Material)\n{\n\treturn_val_if_fail(P1, 0);\n\treturn_val_if_fail(P2, 0);\n\treturn_val_if_fail(P3, 0);\n\treturn_val_if_fail(P4, 0);\n\n\tk3d::legacy::split_edge* edge1 = new k3d::legacy::split_edge(P1);\n\tk3d::legacy::split_edge* edge2 = new k3d::legacy::split_edge(P2);\n\tk3d::legacy::split_edge* edge3 = new k3d::legacy::split_edge(P3);\n\tk3d::legacy::split_edge* edge4 = new k3d::legacy::split_edge(P4);\n\n\tedge1->face_clockwise = edge2;\n\tedge2->face_clockwise = edge3;\n\tedge3->face_clockwise = edge4;\n\tedge4->face_clockwise = edge1;\n\n\tk3d::legacy::face* new_face = new k3d::legacy::face(edge1, Material);\n\tassert_warning(new_face);\n\n\treturn new_face;\n}\n\nk3d::legacy::face* add_triangle(k3d::legacy::point* P1, k3d::legacy::point* P2, k3d::legacy::point* P3, k3d::imaterial* Material)\n{\n\treturn_val_if_fail(P1, 0);\n\treturn_val_if_fail(P2, 0);\n\treturn_val_if_fail(P3, 0);\n\n\tk3d::legacy::split_edge* edge1 = new k3d::legacy::split_edge(P1);\n\tk3d::legacy::split_edge* edge2 = new k3d::legacy::split_edge(P2);\n\tk3d::legacy::split_edge* edge3 = new k3d::legacy::split_edge(P3);\n\n\tedge1->face_clockwise = edge2;\n\tedge2->face_clockwise = edge3;\n\tedge3->face_clockwise = edge1;\n\n\tk3d::legacy::face* new_face = new k3d::legacy::face(edge1, Material);\n\tassert_warning(new_face);\n\n\treturn new_face;\n}\n\ntypedef std::vector<k3d::legacy::point*> vertices_t;\nstruct border_t\n{\n\tk3d::legacy::point* start;\n\tk3d::legacy::point* end;\n\tvertices_t vertices;\n\tedges_t edge_list;\n\tbool flat;\n};\ntypedef std::vector<border_t> borders_t;\n\nstruct border_info_t\n{\n\tborder_info_t(const unsigned long Index) :\n\t\tindex(Index)\n\t{\n\t}\n\n\t/// Stores middle points for lerp\n\tpoints_t flat_centers;\n\t/// Stores center points for slerp\n\tpoints_t rotation_centers;\n\tborders_t borders;\n\n\t// Index edges to always process them in the same order (procedural modeling)\n\tunsigned long index;\n};\ntypedef std::map<k3d::legacy::point*, border_info_t> intersection_edges_t;\n\n/// Fills the space created between unwelded edges using SegmentNumber segments\nvoid fillet_edges(const edge_set_t& Edges, border_points_t& BorderPoints, const unsigned long SegmentNumber, k3d::imaterial* Material, point_map_t& OldPointsMap, edge_set_t& LoopEnds, k3d::legacy::polyhedron& Polyhedron, k3d::legacy::mesh& Mesh, intersection_edges_t& IntersectionEdges)\n{\n\t// Make a copy of the edge set\n\tedge_set_t edges = Edges;\n\n\tunsigned long intersection_index = 0;\n\twhile(edges.size())\n\t{\n\t\t// Get an edge and its companion\n\t\tk3d::legacy::split_edge* edge = smallest_index_edge(edges);\n\t\tedges.erase(edge);\n\t\tk3d::legacy::split_edge* companion = edge->companion;\n\t\treturn_if_fail(companion);\n\n\t\tedges.erase(companion);\n\n\t\t// Compute plane normals\n\t\tconst k3d::point3 edge1_vertex1 = edge->vertex->position;\n\t\tconst k3d::point3 edge1_vertex2 = edge->face_clockwise->vertex->position;\n\t\tborder_points_t::const_iterator vertex = BorderPoints.find(edge->vertex);\n\t\treturn_if_fail(vertex != BorderPoints.end());\n\t\tconst k3d::vector3 edge1_dir1 = vertex->second->direction;\n\t\tvertex = BorderPoints.find(edge->face_clockwise->vertex);\n\t\treturn_if_fail(vertex != BorderPoints.end());\n\t\tconst k3d::vector3 edge1_dir2 = vertex->second->direction;\n\t\tconst k3d::point3 plane1_point = 0.5 * (edge1_vertex1 + edge1_dir1 + edge1_vertex2 + edge1_dir2);\n\t\tk3d::vector3 plane1_normal = summation_normal(edge1_vertex1, edge1_vertex2, plane1_point);\n\n\t\tconst k3d::point3 edge2_vertex1 = companion->vertex->position;\n\t\tconst k3d::point3 edge2_vertex2 = companion->face_clockwise->vertex->position;\n\t\tvertex = BorderPoints.find(companion->vertex);\n\t\treturn_if_fail(vertex != BorderPoints.end());\n\t\tconst k3d::vector3 edge2_dir1 = vertex->second->direction;\n\t\tvertex = BorderPoints.find(companion->face_clockwise->vertex);\n\t\treturn_if_fail(vertex != BorderPoints.end());\n\t\tconst k3d::vector3 edge2_dir2 = vertex->second->direction;\n\t\tconst k3d::point3 plane2_point = 0.5 * (edge2_vertex1 + edge2_dir1 + edge2_vertex2 + edge2_dir2);\n\t\tk3d::vector3 plane2_normal = summation_normal(edge2_vertex1, edge2_vertex2, plane2_point);\n\n\t\tpoints_t points1;\n\t\tpoints_t points2;\n\t\tk3d::point3 rotation_center1(0, 0, 0);\n\t\tk3d::point3 rotation_center2(0, 0, 0);\n\t\tconst bool flat = (k3d::normalize(plane1_normal) * k3d::normalize(plane2_normal) > 0.9);\n\t\tif(!flat)\n\t\t{\n\t\t\t// Slerp endpoints\n\t\t\trotation_center1 = slerp_points(SegmentNumber, edge1_vertex1, plane1_normal, edge2_vertex2, plane2_normal, points1);\n\t\t\trotation_center2 = slerp_points(SegmentNumber, edge1_vertex2, plane1_normal, edge2_vertex1, plane2_normal, points2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Coplanar faces : just lerp\n\t\t\trotation_center1 = lerp_points(SegmentNumber, edge1_vertex1, plane1_normal, edge2_vertex2, plane2_normal, points1);\n\t\t\trotation_center2 = lerp_points(SegmentNumber, edge1_vertex2, plane1_normal, edge2_vertex1, plane2_normal, points2);\n\t\t}\n\n\t\treturn_if_fail(points1.size() == points2.size());\n\n\t\t// Create faces\n\t\tk3d::legacy::point* previous_point1 = edge->vertex;\n\t\tk3d::legacy::point* previous_point2 = edge->face_clockwise->vertex;\n\n\t\tvertices_t vertices1;\n\t\tvertices_t vertices2;\n\t\tedges_t edges1;\n\t\tedges_t edges2;\n\n\t\tpoints_t::const_iterator point1 = points1.begin();\n\t\tpoints_t::const_iterator point2 = points2.begin();\n\t\tfor(; point1 != points1.end(); ++point1, ++point2)\n\t\t{\n\t\t\t// Create mesh points\n\t\t\tk3d::legacy::point* mesh_point1 = new k3d::legacy::point(*point1);\n\t\t\tvertices1.push_back(mesh_point1);\n\t\t\tMesh.points.push_back(mesh_point1);\n\n\t\t\tk3d::legacy::point* mesh_point2 = new k3d::legacy::point(*point2);\n\t\t\tvertices2.push_back(mesh_point2);\n\t\t\tMesh.points.push_back(mesh_point2);\n\n\t\t\tk3d::legacy::face* face = add_quad(previous_point1, mesh_point1, mesh_point2, previous_point2, Material);\n\t\t\tPolyhedron.faces.push_back(face);\n\n\t\t\t// Save border edges\n\t\t\tedges1.push_back(face->first_edge);\n\t\t\tedges2.push_back(face->first_edge->face_clockwise->face_clockwise);\n\n\t\t\tprevious_point1 = mesh_point1;\n\t\t\tprevious_point2 = mesh_point2;\n\t\t}\n\n\t\tk3d::legacy::face* face = add_quad(companion->vertex, previous_point2, previous_point1, companion->face_clockwise->vertex, Material);\n\t\tPolyhedron.faces.push_back(face);\n\t\tedges1.push_back(face->first_edge->face_clockwise->face_clockwise);\n\t\tedges2.push_back(face->first_edge);\n\n\t\t// Process loop ends\n\t\tbool first = (LoopEnds.find(edge) != LoopEnds.end());\n\t\tbool second = (LoopEnds.find(companion) != LoopEnds.end());\n\t\tif(first)\n\t\t{\n\t\t\tk3d::legacy::split_edge* next_edge = edge;\n\n\t\t\t// Count edges at this end\n\t\t\tunsigned long n = 0;\n\t\t\twhile(next_edge->face_clockwise != companion)\n\t\t\t{\n\t\t\t\tnext_edge = next_edge->face_clockwise->companion;\n\n\t\t\t\tif(!next_edge)\n\t\t\t\t{\n\t\t\t\t\t// 'border' point\n\t\t\t\t\tn = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t++n;\n\n\t\t\t\t// Infinite loop\n\t\t\t\treturn_if_fail(n < 1000);\n\t\t\t}\n\n\t\t\tif(n == 0)\n\t\t\t{\n\t\t\t}\n\t\t\telse if(n == 2)\n\t\t\t{\n\t\t\t\t// Two edges leave from edge's end\n\t\t\t\tk3d::legacy::split_edge* edge_start = edge->face_clockwise->companion;\n\t\t\t\tk3d::legacy::split_edge* edge_end = edge_start->face_clockwise;\n\n\t\t\t\tk3d::legacy::split_edge* new_edge = 0;\n\t\t\t\tfor(edges_t::iterator edge = edges2.begin(); edge != edges2.end(); ++edge)\n\t\t\t\t{\n\t\t\t\t\tnew_edge = new k3d::legacy::split_edge((*edge)->face_clockwise->vertex);\n\t\t\t\t\tedge_start->face_clockwise = new_edge;\n\t\t\t\t\tedge_start = new_edge;\n\t\t\t\t}\n\n\t\t\t\tedge_start->face_clockwise = edge_end;\n\t\t\t\tedge_end->vertex = (*edges2.rbegin())->vertex;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Find some middle edge\n\t\t\t\tnext_edge = edge;\n\t\t\t\tfor(unsigned long i = 0; i < n / 2 + 1; ++i)\n\t\t\t\t\tnext_edge = next_edge->face_clockwise->companion;\n\n\t\t\t\t// Subdivide edge\n\t\t\t\tk3d::point3 new_position = (next_edge->vertex->position + next_edge->face_clockwise->vertex->position) / 2;\n\t\t\t\tk3d::legacy::point* new_point = helpers::append_edge(next_edge);\n\t\t\t\tnew_point->position = new_position;\n\t\t\t\tMesh.points.push_back(new_point);\n\n\t\t\t\t// Set border edge vertices\n\t\t\t\tnext_edge->face_clockwise->face_clockwise->vertex = (*edges2.rbegin())->vertex;\n\t\t\t\tnext_edge->face_clockwise->companion->vertex = (*edges2.begin())->face_clockwise->vertex;\n\n\t\t\t\t// Fill with triangles\n\t\t\t\tfor(edges_t::reverse_iterator edge_i = edges2.rbegin(); edge_i != edges2.rend(); ++edge_i)\n\t\t\t\t{\n\t\t\t\t\tk3d::legacy::face* new_face = add_triangle(new_point, (*edge_i)->face_clockwise->vertex, (*edge_i)->vertex, Material);\n\t\t\t\t\tPolyhedron.faces.push_back(new_face);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(second)\n\t\t{\n\t\t\tk3d::legacy::split_edge* next_edge = companion;\n\n\t\t\t// Count edges at this end\n\t\t\tunsigned long n = 0;\n\t\t\twhile(next_edge->face_clockwise != edge)\n\t\t\t{\n\t\t\t\tnext_edge = next_edge->face_clockwise->companion;\n\n\t\t\t\tif(!next_edge)\n\t\t\t\t{\n\t\t\t\t\t// 'border' point\n\t\t\t\t\tn = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t++n;\n\n\t\t\t\treturn_if_fail(n < 1000);\n\t\t\t}\n\n\t\t\tif(n == 0)\n\t\t\t{\n\t\t\t}\n\t\t\telse if(n == 2)\n\t\t\t{\n\t\t\t\tk3d::legacy::split_edge* edge_start = companion->face_clockwise->companion;\n\t\t\t\tk3d::legacy::split_edge* edge_end = edge_start->face_clockwise;\n\n\t\t\t\tk3d::legacy::split_edge* new_edge = 0;\n\t\t\t\tfor(edges_t::reverse_iterator edge = edges1.rbegin(); edge != edges1.rend(); ++edge)\n\t\t\t\t{\n\t\t\t\t\tnew_edge = new k3d::legacy::split_edge((*edge)->face_clockwise->vertex);\n\t\t\t\t\tedge_start->face_clockwise = new_edge;\n\t\t\t\t\tedge_start = new_edge;\n\t\t\t\t}\n\n\t\t\t\tedge_start->face_clockwise = edge_end;\n\t\t\t\tedge_end->vertex = (*edges1.begin())->vertex;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Find some middle edge\n\t\t\t\tnext_edge = companion;\n\t\t\t\tfor(unsigned long i = 0; i < n / 2 + 1; ++i)\n\t\t\t\t\tnext_edge = next_edge->face_clockwise->companion;\n\n\t\t\t\t// Subdivide edge\n\t\t\t\tk3d::point3 new_position = (next_edge->vertex->position + next_edge->face_clockwise->vertex->position) / 2;\n\t\t\t\tk3d::legacy::point* new_point = helpers::append_edge(next_edge);\n\t\t\t\tnew_point->position = new_position;\n\t\t\t\tMesh.points.push_back(new_point);\n\n\t\t\t\t// Set border edge vertices\n\t\t\t\tnext_edge->face_clockwise->face_clockwise->vertex = (*edges1.begin())->vertex;\n\t\t\t\tnext_edge->face_clockwise->companion->vertex = (*edges1.rbegin())->face_clockwise->vertex;\n\n\t\t\t\t// Fill with triangles\n\t\t\t\tfor(edges_t::iterator edge_i = edges1.begin(); edge_i != edges1.end(); ++edge_i)\n\t\t\t\t{\n\t\t\t\t\tk3d::legacy::face* new_face = add_triangle(new_point, (*edge_i)->face_clockwise->vertex, (*edge_i)->vertex, Material);\n\t\t\t\t\tPolyhedron.faces.push_back(new_face);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Save edge lists (to fill intersections later)\n\t\tif(second)\n\t\t{\n\t\t\t// Insert empty structure to remember deleting original point\n\t\t\tpoint_map_t::const_iterator old_point = OldPointsMap.find(edge->vertex);\n\t\t\treturn_if_fail(old_point != OldPointsMap.end());\n\t\t\tborder_info_t info(++intersection_index);\n\t\t\tIntersectionEdges.insert(std::make_pair(old_point->second, info));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpoint_map_t::const_iterator old_point = OldPointsMap.find(edge->vertex);\n\t\t\treturn_if_fail(old_point != OldPointsMap.end());\n\n\t\t\tborder_t border;\n\t\t\tborder.start = edge->vertex;\n\t\t\tborder.end = companion->face_clockwise->vertex;\n\t\t\tborder.vertices = vertices1;\n\t\t\tborder.edge_list = edges1;\n\t\t\tborder.flat = flat;\n\n\t\t\tintersection_edges_t::iterator edge_i = IntersectionEdges.find(old_point->second);\n\t\t\tif(edge_i == IntersectionEdges.end())\n\t\t\t{\n\t\t\t\tborder_info_t info(++intersection_index);\n\t\t\t\tif(flat)\n\t\t\t\t\tinfo.flat_centers.push_back(rotation_center1);\n\t\t\t\telse\n\t\t\t\t\tinfo.rotation_centers.push_back(rotation_center1);\n\n\t\t\t\tinfo.borders.push_back(border);\n\t\t\t\tIntersectionEdges.insert(std::make_pair(old_point->second, info));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(flat)\n\t\t\t\t\tedge_i->second.flat_centers.push_back(rotation_center1);\n\t\t\t\telse\n\t\t\t\t\tedge_i->second.rotation_centers.push_back(rotation_center1);\n\n\t\t\t\tedge_i->second.borders.push_back(border);\n\t\t\t}\n\t\t}\n\n\t\tif(first)\n\t\t{\n\t\t\t// Insert empty structure to remember deleting original point\n\t\t\tpoint_map_t::const_iterator old_point = OldPointsMap.find(edge->face_clockwise->vertex);\n\t\t\treturn_if_fail(old_point != OldPointsMap.end());\n\t\t\tborder_info_t info(++intersection_index);\n\t\t\tIntersectionEdges.insert(std::make_pair(old_point->second, info));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpoint_map_t::const_iterator old_point = OldPointsMap.find(edge->face_clockwise->vertex);\n\t\t\treturn_if_fail(old_point != OldPointsMap.end());\n\n\t\t\tborder_t border;\n\t\t\tborder.start = companion->vertex;\n\t\t\tborder.end = edge->face_clockwise->vertex;\n\t\t\tstd::reverse(vertices2.begin(), vertices2.end());\n\t\t\tborder.vertices = vertices2;\n\t\t\tstd::reverse(edges2.begin(), edges2.end());\n\t\t\tborder.edge_list = edges2;\n\t\t\tborder.flat = flat;\n\n\t\t\tintersection_edges_t::iterator edge2_i = IntersectionEdges.find(old_point->second);\n\t\t\tif(edge2_i == IntersectionEdges.end())\n\t\t\t{\n\t\t\t\tborder_info_t info(++intersection_index);\n\t\t\t\tif(flat)\n\t\t\t\t\tinfo.flat_centers.push_back(rotation_center2);\n\t\t\t\telse\n\t\t\t\t\tinfo.rotation_centers.push_back(rotation_center2);\n\n\t\t\t\tinfo.borders.push_back(border);\n\t\t\t\tIntersectionEdges.insert(std::make_pair(old_point->second, info));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(flat)\n\t\t\t\t\tedge2_i->second.flat_centers.push_back(rotation_center2);\n\t\t\t\telse\n\t\t\t\t\tedge2_i->second.rotation_centers.push_back(rotation_center2);\n\n\t\t\t\tedge2_i->second.borders.push_back(border);\n\t\t\t}\n\t\t}\n\t}\n}\n\nk3d::point3 slerp_orientations(const k3d::point3& Point1, const k3d::point3& Point2, const k3d::point3& Center, const double t)\n{\n\tk3d::vector3 orientation1 = Point1 - Center;\n\tconst double length1 = orientation1.length();\n\treturn_val_if_fail(length1 > 0, k3d::point3(0, 0, 0));\n\torientation1 /= length1;\n\n\tk3d::vector3 orientation2 = Point2 - Center;\n\tconst double length2 = orientation2.length();\n\treturn_val_if_fail(length2 > 0, k3d::point3(0, 0, 0));\n\torientation2 /= length2;\n\n\tk3d::quaternion qrot1(0, orientation1);\n\tk3d::quaternion qrot2(0, orientation2);\n\n\tk3d::quaternion rotation = k3d::Slerp(qrot1, qrot2, t * 0.5);\n\tk3d::vector3 new_orientation = k3d::rotate3(rotation) * orientation1;\n\tconst double length_lerp = length1 + t * (length2 - length1);\n\n\treturn Center + length_lerp * new_orientation;\n}\n\nvoid fill_intersections(intersection_edges_t& IntersectionEdges, k3d::imaterial* Material, k3d::legacy::polyhedron& Polyhedron, k3d::legacy::mesh& Mesh)\n{\n\t// Create a new map to sort by index\n\ttypedef std::map<unsigned long, k3d::legacy::point*> indexed_points_t;\n\tindexed_points_t indexed_points;\n\tfor(detail::intersection_edges_t::iterator edges = IntersectionEdges.begin(); edges != IntersectionEdges.end(); ++edges)\n\t{\n\t\tk3d::legacy::point* point = edges->first;\n\t\tunsigned long index = edges->second.index;\n\n\t\tindexed_points.insert(std::make_pair(index, point));\n\t}\n\n\tfor(indexed_points_t::iterator point = indexed_points.begin(); point != indexed_points.end(); ++point)\n\t{\n\t\tintersection_edges_t::iterator intersection = IntersectionEdges.find(point->second);\n\t\treturn_if_fail(intersection != IntersectionEdges.end());\n\t\tdetail::points_t flat_points = intersection->second.flat_centers;\n\t\tdetail::points_t rotation_points = intersection->second.rotation_centers;\n\t\tborders_t borders = intersection->second.borders;\n\t\tconst unsigned long border_number = borders.size();\n\n\t\t// Skip non-loop ends\n\t\tif(!flat_points.size() && !rotation_points.size())\n\t\t\tcontinue;\n\n\t\t// Process special cases\n\t\tif(rotation_points.size() == 2 && !flat_points.size())\n\t\t{\n\t\t\t// Merge the two borders\n\t\t\tborder_t& border1 = borders[0];\n\t\t\tborder_t& border2 = borders[1];\n\n\t\t\tedges_t::iterator edge1 = border1.edge_list.begin();\n\t\t\tedges_t::reverse_iterator edge2 = border2.edge_list.rbegin();\n\t\t\tk3d::legacy::point* previous_point = 0;\n\t\t\tfor(; edge1 + 1 != border1.edge_list.end(); ++edge1, ++edge2)\n\t\t\t{\n\t\t\t\tif(previous_point)\n\t\t\t\t\t(*edge1)->vertex = previous_point;\n\n\t\t\t\tconst k3d::point3 mean = ((*edge1)->face_clockwise->vertex->position + (*edge2)->vertex->position) / 2;\n\t\t\t\tk3d::legacy::point* point = (*edge2)->vertex;\n\t\t\t\tpoint->position = mean;\n\n\t\t\t\tMesh.points.erase(std::remove(Mesh.points.begin(), Mesh.points.end(), (*edge1)->face_clockwise->vertex), Mesh.points.end());\n\t\t\t\tdelete (*edge1)->face_clockwise->vertex;\n\n\t\t\t\t(*edge1)->face_clockwise->vertex = point;\n\n\t\t\t\tprevious_point = point;\n\t\t\t}\n\t\t\tif(previous_point)\n\t\t\t\t(*edge1)->vertex = previous_point;\n\n\t\t\tcontinue;\n\t\t}\n\n\t\t// General case\n\t\tconst bool flat = (flat_points.size() && !rotation_points.size());\n\n\t\t// Find filling center\n\t\tk3d::point3 center_position(0, 0, 0);\n\t\tk3d::point3 rotation_center(0, 0, 0);\n\t\tif(flat)\n\t\t{\n\t\t\t// Get average flat center\n\t\t\tk3d::point3 flat_center(0, 0, 0);\n\t\t\tfor(detail::points_t::iterator center = flat_points.begin(); center != flat_points.end(); ++center)\n\t\t\t{\n\t\t\t\tflat_center += k3d::to_vector(*center);\n\t\t\t}\n\t\t\tflat_center /= static_cast<double>(flat_points.size());\n\n\t\t\tcenter_position = flat_center;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Get average rotation center\n\t\t\tfor(detail::points_t::iterator center = rotation_points.begin(); center != rotation_points.end(); ++center)\n\t\t\t{\n\t\t\t\trotation_center += k3d::to_vector(*center);\n\t\t\t}\n\t\t\trotation_center /= static_cast<double>(rotation_points.size());\n\n\t\t\tcenter_position = rotation_center;\n\t\t}\n\n\t\t// Check for concave intersections\n\t\tbool convex = false;\n\t\tif(!flat)\n\t\t{\n\t\t\ttypedef std::vector<k3d::vector3> normals_t;\n\t\t\tnormals_t normals;\n\t\t\tk3d::vector3 average(0, 0, 0);\n\t\t\tfor(unsigned long n = 0; n < border_number; ++n)\n\t\t\t{\n\t\t\t\tborder_t& border = borders[n];\n\t\t\t\tif(border.flat)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst k3d::vector3 normal = (border.start->position + border.end->position) / 2 - center_position;\n\t\t\t\tnormals.push_back(normal);\n\t\t\t\taverage += normal;\n\t\t\t}\n\n\t\t\tconvex = true;\n\t\t\tif(normals.size() > 2)\n\t\t\t{\n\t\t\t\taverage /= static_cast<double>(normals.size());\n\n\t\t\t\t// Check that every normal is on the same side of the plane defined by average normal\n\t\t\t\tfor(normals_t::const_iterator normal = normals.begin(); normal != normals.end(); ++normal)\n\t\t\t\t{\n\t\t\t\t\tif(*normal * average < 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tconvex = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find round part center\n\t\tif(convex)\n\t\t{\n\t\t\tk3d::vector3 average_direction(0, 0, 0);\n\t\t\tdouble average_length = 0;\n\n\t\t\tfor(unsigned long m = 0; m < border_number; ++m)\n\t\t\t{\n\t\t\t\tconst k3d::vector3 vector = borders[m].start->position - rotation_center;\n\t\t\t\taverage_direction += vector;\n\t\t\t\taverage_length += vector.length();\n\t\t\t}\n\n\t\t\taverage_length /= static_cast<double>(border_number);\n\n\t\t\tcenter_position += average_length * k3d::normalize(average_direction);\n\t\t}\n\n\t\t// Sort border_t structures to form a loop (bubble sort)\n\t\tfor(unsigned long m = 0; m < border_number - 1; ++m)\n\t\t{\n\t\t\tk3d::legacy::point* search = borders[m].end;\n\t\t\tbool found = false;\n\t\t\tfor(unsigned long n = m + 1; n < border_number; ++n)\n\t\t\t{\n\t\t\t\tif(borders[n].start == search)\n\t\t\t\t{\n\t\t\t\t\tfound = true;\n\t\t\t\t\tif(n > m + 1)\n\t\t\t\t\t\tstd::swap(borders[n], borders[m + 1]);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tassert_warning(found);\n\t\t}\n\n\t\t// Fill intersections on even segment number\n\t\tunsigned long segments = borders[0].vertices.size();\n\t\tif((segments + 1) % 2 == 0)\n\t\t{\n\t\t\twhile(segments > 1)\n\t\t\t{\n\t\t\t\tborders_t new_borders;\n\n\t\t\t\t// Create next vertex row\n\t\t\t\tfor(unsigned long m = 0; m < border_number; ++m)\n\t\t\t\t{\n\t\t\t\t\tborder_t new_border;\n\n\t\t\t\t\tconst k3d::point3 start = borders[m].start->position;\n\t\t\t\t\tconst k3d::point3 end = center_position;\n\t\t\t\t\tconst double ratio = 1 / static_cast<double>(segments - 1);\n\n\t\t\t\t\tconst k3d::point3 start_pos = convex ? slerp_orientations(start, end, rotation_center, ratio) : (start + ratio * (end - start));\n\t\t\t\t\tk3d::legacy::point* start_point = new k3d::legacy::point(start_pos);\n\t\t\t\t\tMesh.points.push_back(start_point);\n\n\t\t\t\t\tnew_border.start = start_point;\n\n\t\t\t\t\tconst unsigned long vertex_number = borders[m].vertices.size();\n\t\t\t\t\tfor(unsigned long v = 1; v < vertex_number - 1; ++v)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::point3 start = borders[m].vertices[v]->position;\n\t\t\t\t\t\tconst k3d::point3 end = center_position;\n\t\t\t\t\t\tk3d::point3 position = convex ? slerp_orientations(start, end, rotation_center, ratio) : (start + ratio * (end - start));\n\n\t\t\t\t\t\tk3d::legacy::point* new_point = new k3d::legacy::point(position);\n\t\t\t\t\t\tMesh.points.push_back(new_point);\n\t\t\t\t\t\tnew_border.vertices.push_back(new_point);\n\t\t\t\t\t}\n\n\t\t\t\t\tnew_borders.push_back(new_border);\n\t\t\t\t}\n\n\t\t\t\t// Copy new_border.start to next border's new_border.end\n\t\t\t\tfor(unsigned long m = 0; m < border_number; ++m)\n\t\t\t\t{\n\t\t\t\t\tnew_borders[m].end = new_borders[(m + 1) % border_number].start;\n\t\t\t\t}\n\n\t\t\t\t// Link original and new row\n\t\t\t\tfor(unsigned long m = 0; m < border_number; ++m)\n\t\t\t\t{\n\t\t\t\t\t// Row\n\t\t\t\t\tconst unsigned long vertex_number = new_borders[m].vertices.size();\n\n\t\t\t\t\tk3d::legacy::face* face = add_quad(new_borders[m].start, new_borders[m].vertices[0], borders[m].vertices[1], borders[m].vertices[0], Material);\n\t\t\t\t\treturn_if_fail(face);\n\n\t\t\t\t\tPolyhedron.faces.push_back(face);\n\n\t\t\t\t\tfor(unsigned long v = 0; v < vertex_number - 1; ++v)\n\t\t\t\t\t{\n\t\t\t\t\t\tface = add_quad(new_borders[m].vertices[v], new_borders[m].vertices[v + 1], borders[m].vertices[1 + v + 1], borders[m].vertices[1 + v], Material);\n\t\t\t\t\t\treturn_if_fail(face);\n\n\t\t\t\t\t\tPolyhedron.faces.push_back(face);\n\t\t\t\t\t}\n\n\t\t\t\t\tface = add_quad(new_borders[m].vertices[vertex_number - 1], new_borders[m].end, borders[m].vertices[vertex_number + 1], borders[m].vertices[vertex_number], Material);\n\t\t\t\t\treturn_if_fail(face);\n\n\t\t\t\t\tPolyhedron.faces.push_back(face);\n\n\t\t\t\t\t// End corner\n\t\t\t\t\tface = add_quad(new_borders[m].end, borders[(m + 1) % border_number].vertices[0], borders[m].end, borders[m].vertices[vertex_number + 1], Material);\n\t\t\t\t\treturn_if_fail(face);\n\n\t\t\t\t\tPolyhedron.faces.push_back(face);\n\t\t\t\t}\n\n\t\t\t\t// Replace old borders with new ones\n\t\t\t\tstd::swap(borders, new_borders);\n\n\t\t\t\t// Next iteration\n\t\t\t\tsegments -= 2;\n\t\t\t}\n\n\t\t\tif(segments == 1)\n\t\t\t{\n\t\t\t\tk3d::legacy::point* center_point = new k3d::legacy::point(center_position);\n\t\t\t\tMesh.points.push_back(center_point);\n\n\t\t\t\t// Link faces to center\n\t\t\t\tfor(unsigned long m = 0; m < border_number; ++m)\n\t\t\t\t{\n\t\t\t\t\treturn_if_fail(borders[m].vertices.size());\n\t\t\t\t\tk3d::legacy::face* face = add_quad(borders[(m + 1) % border_number].vertices[0], borders[m].end, borders[m].vertices[0], center_point, Material);\n\t\t\t\t\treturn_if_fail(face);\n\n\t\t\t\t\tPolyhedron.faces.push_back(face);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\t//if(segments % 2 == 0)\n\t\t{\n\t\t\t// Fill intersections on odd segment number\n\t\t\twhile(segments > 2)\n\t\t\t{\n\t\t\t\tborders_t new_borders;\n\n\t\t\t\t// Create next vertex row\n\t\t\t\tfor(unsigned long m = 0; m < border_number; ++m)\n\t\t\t\t{\n\t\t\t\t\tborder_t new_border;\n\n\t\t\t\t\tconst k3d::point3 start = borders[m].start->position;\n\t\t\t\t\tconst k3d::point3 end = center_position;\n\t\t\t\t\tconst double ratio = 1 / static_cast<double>(segments);\n\n\t\t\t\t\tconst k3d::point3 start_pos = convex ? slerp_orientations(start, end, rotation_center, ratio) : (start + ratio * (end - start));\n\t\t\t\t\tk3d::legacy::point* start_point = new k3d::legacy::point(start_pos);\n\t\t\t\t\tMesh.points.push_back(start_point);\n\n\t\t\t\t\tnew_border.start = start_point;\n\n\t\t\t\t\tconst unsigned long vertex_number = borders[m].vertices.size();\n\t\t\t\t\tfor(unsigned long v = 1; v < vertex_number - 1; ++v)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::point3 start = borders[m].vertices[v]->position;\n\t\t\t\t\t\tconst k3d::point3 end = center_position;\n\t\t\t\t\t\tk3d::point3 position = convex ? slerp_orientations(start, end, rotation_center, ratio) : (start + ratio * (end - start));\n\n\t\t\t\t\t\tk3d::legacy::point* new_point = new k3d::legacy::point(position);\n\t\t\t\t\t\tMesh.points.push_back(new_point);\n\t\t\t\t\t\tnew_border.vertices.push_back(new_point);\n\t\t\t\t\t}\n\n\t\t\t\t\tnew_borders.push_back(new_border);\n\t\t\t\t}\n\n\t\t\t\t// Copy new_border.start to next border's new_border.end\n\t\t\t\tfor(unsigned long m = 0; m < border_number; ++m)\n\t\t\t\t{\n\t\t\t\t\tnew_borders[m].end = new_borders[(m + 1) % border_number].start;\n\t\t\t\t}\n\n\t\t\t\t// Link original and new row\n\t\t\t\tfor(unsigned long m = 0; m < border_number; ++m)\n\t\t\t\t{\n\t\t\t\t\t// Row\n\t\t\t\t\tconst unsigned long vertex_number = new_borders[m].vertices.size();\n\n\t\t\t\t\tk3d::legacy::face* face = add_quad(new_borders[m].start, new_borders[m].vertices[0], borders[m].vertices[1], borders[m].vertices[0], Material);\n\t\t\t\t\treturn_if_fail(face);\n\n\t\t\t\t\tPolyhedron.faces.push_back(face);\n\n\t\t\t\t\tfor(unsigned long v = 0; v < vertex_number - 1; ++v)\n\t\t\t\t\t{\n\t\t\t\t\t\tface = add_quad(new_borders[m].vertices[v], new_borders[m].vertices[v + 1], borders[m].vertices[1 + v + 1], borders[m].vertices[1 + v], Material);\n\t\t\t\t\t\treturn_if_fail(face);\n\n\t\t\t\t\t\tPolyhedron.faces.push_back(face);\n\t\t\t\t\t}\n\n\t\t\t\t\tface = add_quad(new_borders[m].vertices[vertex_number - 1], new_borders[m].end, borders[m].vertices[vertex_number + 1], borders[m].vertices[vertex_number], Material);\n\t\t\t\t\treturn_if_fail(face);\n\n\t\t\t\t\tPolyhedron.faces.push_back(face);\n\n\t\t\t\t\t// End corner\n\t\t\t\t\tface = add_quad(new_borders[m].end, borders[(m + 1) % border_number].vertices[0], borders[m].end, borders[m].vertices[vertex_number + 1], Material);\n\t\t\t\t\treturn_if_fail(face);\n\n\t\t\t\t\tPolyhedron.faces.push_back(face);\n\t\t\t\t}\n\n\t\t\t\t// Replace old borders with new ones\n\t\t\t\tstd::swap(borders, new_borders);\n\n\t\t\t\t// Next iteration\n\t\t\t\tsegments -= 2;\n\t\t\t}\n\n\t\t\tif(segments == 2)\n\t\t\t{\n\t\t\t\tborders_t new_borders;\n\n\t\t\t\t// Create next vertex row\n\t\t\t\tfor(unsigned long m = 0; m < border_number; ++m)\n\t\t\t\t{\n\t\t\t\t\tborder_t new_border;\n\n\t\t\t\t\tconst k3d::point3 start = borders[m].start->position;\n\t\t\t\t\tconst k3d::point3 end = center_position;\n\t\t\t\t\tconst double ratio = 1 / static_cast<double>(segments);\n\n\t\t\t\t\tconst k3d::point3 start_pos = convex ? slerp_orientations(borders[m].start->position, center_position, rotation_center, ratio) : (start + ratio * (end - start));\n\t\t\t\t\tk3d::legacy::point* start_point = new k3d::legacy::point(start_pos);\n\t\t\t\t\tMesh.points.push_back(start_point);\n\n\t\t\t\t\tnew_border.start = start_point;\n\n\t\t\t\t\tnew_borders.push_back(new_border);\n\t\t\t\t}\n\n\t\t\t\t// Copy new_border.start to next border's new_border.end\n\t\t\t\tfor(unsigned long m = 0; m < border_number; ++m)\n\t\t\t\t{\n\t\t\t\t\tnew_borders[m].end = new_borders[(m + 1) % border_number].start;\n\t\t\t\t}\n\n\t\t\t\t// Link original and new row\n\t\t\t\tfor(unsigned long m = 0; m < border_number; ++m)\n\t\t\t\t{\n\t\t\t\t\tk3d::legacy::face* face = add_quad(new_borders[m].start, new_borders[m].end, borders[m].vertices[1], borders[m].vertices[0], Material);\n\t\t\t\t\treturn_if_fail(face);\n\n\t\t\t\t\tPolyhedron.faces.push_back(face);\n\n\t\t\t\t\t// End corner\n\t\t\t\t\tface = add_quad(new_borders[m].end, borders[(m + 1) % border_number].vertices[0], borders[m].end, borders[m].vertices[1], Material);\n\t\t\t\t\treturn_if_fail(face);\n\n\t\t\t\t\tPolyhedron.faces.push_back(face);\n\t\t\t\t}\n\n\t\t\t\t// Replace old borders with new ones\n\t\t\t\tstd::swap(borders, new_borders);\n\n\t\t\t\t// Next iteration\n\t\t\t\tsegments -= 2;\n\t\t\t}\n\n\t\t\tif(segments == 0)\n\t\t\t{\n\t\t\t\t// Link all edges\n\t\t\t\tstd::vector<k3d::legacy::split_edge*> edges;\n\t\t\t\tfor(unsigned long m = border_number; m > 0; --m)\n\t\t\t\t{\n\t\t\t\t\tk3d::legacy::point* point = borders[m - 1].start;\n\n\t\t\t\t\tk3d::legacy::split_edge* edge = new k3d::legacy::split_edge(point);\n\t\t\t\t\tedges.push_back(edge);\n\t\t\t\t}\n\n\t\t\t\tk3d::legacy::loop_edges(edges.begin(), edges.end());\n\n\t\t\t\tk3d::legacy::face* const face = new k3d::legacy::face(*edges.begin(), Material);\n\t\t\t\treturn_if_fail(face);\n\n\t\t\t\tPolyhedron.faces.push_back(face);\n\t\t\t}\n\t\t}\n\t}\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// fillet_edges_implementation\n\nclass fillet_edges_implementation :\n\tpublic k3d::mesh_selection_sink<k3d::legacy::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::legacy::mesh_modifier<k3d::node > > base;\n\npublic:\n\tfillet_edges_implementation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_segments(init_owner(*this) + init_name(\"segments\") + init_label(_(\"Segments\")) + init_description(_(\"Segment number\")) + init_value(4L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Fillet radius\")) + init_value(0.3) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_segments.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_radius.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\t/** \\todo Improve the implementation so we don't have to do this */\n\tk3d::iunknown* on_rewrite_hint(iunknown* const Hint)\n\t{\n\t\t// Force updates to re-allocate our mesh, for simplicity\n\t\treturn 0;\n\t}\n\n\tvoid on_initialize_mesh(const k3d::legacy::mesh& InputMesh, k3d::legacy::mesh& Mesh)\n\t{\n\t\tk3d::legacy::deep_copy(InputMesh, Mesh);\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Mesh);\n\n\t\t// Clear previous caches\n\t\tm_border_points.clear();\n\n\t\tconst unsigned long segment_number = m_segments.pipeline_value();\n\t\tconst double radius = m_radius.pipeline_value();\n\n\t\tfor(k3d::legacy::mesh::polyhedra_t::iterator polyhedron = Mesh.polyhedra.begin(); polyhedron != Mesh.polyhedra.end(); ++polyhedron)\n\t\t{\n\t\t\tif(!(*polyhedron)->faces.size())\n\t\t\t\tcontinue;\n\n\t\t\t// Get selected edges\n\t\t\tdetail::edge_set_t selected_edges;\n\t\t\tdetail::edge_face_map_t edge_face_map;\n\t\t\tdetail::for_each_edge_face(**polyhedron, detail::get_edges(selected_edges, edge_face_map));\n\n\t\t\t// Unweld selected edges\n\t\t\tdetail::point_map_t old_points_map;\n\t\t\tdetail::edge_set_t loop_ends;\n\t\t\tdetail::unweld_edges(selected_edges, edge_face_map, radius, **polyhedron, Mesh, m_border_points, old_points_map, loop_ends);\n\n\t\t\t// Fillet edges\n\t\t\tdetail::intersection_edges_t intersection_edges;\n\t\t\tdetail::fillet_edges(selected_edges, m_border_points, segment_number, (*polyhedron)->faces[0]->material, old_points_map, loop_ends, **polyhedron, Mesh, intersection_edges);\n\n\t\t\t// Fill intersections\n\t\t\tdetail::fill_intersections(intersection_edges, (*polyhedron)->faces[0]->material, **polyhedron, Mesh);\n\n\t\t\t// Remove and delete old points\n\t\t\tfor(detail::intersection_edges_t::iterator point = intersection_edges.begin(); point != intersection_edges.end(); ++point)\n\t\t\t{\n\t\t\t\tk3d::legacy::point* old_point = point->first;\n\t\t\t\tMesh.points.erase(std::remove(Mesh.points.begin(), Mesh.points.end(), old_point), Mesh.points.end());\n\t\t\t\tdelete old_point;\n\t\t\t}\n\n\t\t\t// Set companions\n\t\t\tk3d::legacy::set_companions(**polyhedron);\n\t\t\tassert_warning(k3d::legacy::is_valid(**polyhedron));\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::legacy::mesh& MeshInput, k3d::legacy::mesh& Mesh)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<fillet_edges_implementation,\n\t\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\t\tk3d::uuid(0x29672638, 0x932544bb, 0xa6b229a9, 0xca30dfc2),\n\t\t\t\t\t\"FilletEdges\",\n\t\t\t\t\t\"Creates rounded surfaces along selected edges\",\n\t\t\t\t\t\"Polyhedron\",\n\t\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tdetail::border_points_t m_border_points;\n\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_segments;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// fillet_edges_factory\n\nk3d::iplugin_factory& fillet_edges_factory()\n{\n\treturn fillet_edges_implementation::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/flip_orientation.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/vectors.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace detail\n{\n\nvoid flip_polyhedron(k3d::polyhedron::primitive& Output, const k3d::polyhedron::const_primitive& Input)\n{\n\tconst k3d::uint_t edge_count = Input.clockwise_edges.size();\n\tk3d::mesh::indices_t counter_clockwise_edges(edge_count);\n\tfor(k3d::uint_t edge = 0; edge != edge_count; ++edge)\n\t{\n\t\tcounter_clockwise_edges[Input.clockwise_edges[edge]] = edge;\n\t}\n\tfor(k3d::uint_t face = 0; face != Input.face_first_loops.size(); ++face)\n\t{\n\t\tif(!Output.face_selections[face])\n\t\t\tcontinue;\n\t\tconst k3d::uint_t loop_begin = Input.face_first_loops[face];\n\t\tconst k3d::uint_t loop_end = loop_begin + Input.face_loop_counts[face];\n\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t{\n\t\t\tconst k3d::uint_t first_edge = Input.loop_first_edges[loop];\n\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t{\n\t\t\t\tOutput.vertex_points[edge] = Input.vertex_points[Input.clockwise_edges[edge]];\n\t\t\t\tOutput.clockwise_edges[edge] = counter_clockwise_edges[edge];\n\n\t\t\t\tedge = Input.clockwise_edges[edge];\n\t\t\t\tif(edge == first_edge)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid flip_bilinear_patch(k3d::bilinear_patch::primitive& Output)\n{\n\tfor(k3d::uint_t patch = 0; patch != Output.patch_selections.size(); ++patch)\n\t{\n\t\tif(!Output.patch_selections[patch])\n\t\t\tcontinue;\n\t\tconst k3d::uint_t patch_start = 4*patch;\n\t\tstd::swap(Output.patch_points[patch_start], Output.patch_points[patch_start + 1]);\n\t\tstd::swap(Output.patch_points[patch_start + 2], Output.patch_points[patch_start + 3]);\n\t}\n}\n\nvoid flip_bicubic_patch(k3d::bicubic_patch::primitive& Output)\n{\n\tfor(k3d::uint_t patch = 0; patch != Output.patch_selections.size(); ++patch)\n\t{\n\t\tif(!Output.patch_selections[patch])\n\t\t\tcontinue;\n\t\tconst k3d::uint_t patch_start = 16*patch;\n\t\tstd::swap(Output.patch_points[patch_start], Output.patch_points[patch_start + 3]);\n\t\tstd::swap(Output.patch_points[patch_start + 1], Output.patch_points[patch_start + 2]);\n\t\tstd::swap(Output.patch_points[patch_start + 4], Output.patch_points[patch_start + 7]);\n\t\tstd::swap(Output.patch_points[patch_start + 5], Output.patch_points[patch_start + 6]);\n\t\tstd::swap(Output.patch_points[patch_start + 8], Output.patch_points[patch_start + 11]);\n\t\tstd::swap(Output.patch_points[patch_start + 9], Output.patch_points[patch_start + 10]);\n\t\tstd::swap(Output.patch_points[patch_start + 12], Output.patch_points[patch_start + 15]);\n\t\tstd::swap(Output.patch_points[patch_start + 13], Output.patch_points[patch_start + 14]);\n\t}\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// flip_orientation_implementation\n\nclass flip_orientation_implementation :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tflip_orientation_implementation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output); // Merges the current document selection with the mesh\n\t\tfor(k3d::uint_t i = 0; i != Input.primitives.size(); ++i)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> input_polyhedron(k3d::polyhedron::validate(Input, *Input.primitives[i]));\n\t\t\tboost::scoped_ptr<k3d::bilinear_patch::const_primitive> input_bilinear_patch(k3d::bilinear_patch::validate(Input, *Input.primitives[i]));\n\t\t\tboost::scoped_ptr<k3d::bicubic_patch::const_primitive> input_bicubic_patch(k3d::bicubic_patch::validate(Input, *Input.primitives[i]));\n\t\t\tif(input_polyhedron)\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> output_polyhedron(k3d::polyhedron::validate(Output, Output.primitives[i]));\n\t\t\t\treturn_if_fail(output_polyhedron);\n\t\t\t\tdetail::flip_polyhedron(*output_polyhedron, *input_polyhedron);\n\t\t\t}\n\t\t\telse if(input_bilinear_patch)\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::bilinear_patch::primitive> output_patch(k3d::bilinear_patch::validate(Output, Output.primitives[i]));\n\t\t\t\treturn_if_fail(output_patch);\n\t\t\t\tdetail::flip_bilinear_patch(*output_patch);\n\t\t\t}\n\t\t\telse if(input_bicubic_patch)\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::bicubic_patch::primitive> output_patch(k3d::bicubic_patch::validate(Output, Output.primitives[i]));\n\t\t\t\treturn_if_fail(output_patch);\n\t\t\t\tdetail::flip_bicubic_patch(*output_patch);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<flip_orientation_implementation,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid( 0x7d95cd84, 0xee5a4ad6, 0x86feab94, 0xcbea91ca),\n\t\t\t\t\"FlipOrientation\",\n\t\t\t\t_(\"Reverses the orientation of selected polygons and bicubic or bilinear patches\"),\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// flip_orientation_factory\n\nk3d::iplugin_factory& flip_orientation_factory()\n{\n\treturn flip_orientation_implementation::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/polyhedron/make_hole.cpp",
    "content": "// K-3D\n// Copyright (c) 2004-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// make_hole\n\nclass make_hole :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tmake_hole(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_scaling(init_owner(*this) + init_name(\"scaling\") + init_label(_(\"Scaling\")) + init_description(_(\"Scaling factor by which to scale the hole relative to the original face\")) + init_value(0.5) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_add_face(init_owner(*this) + init_name(\"add_face\") + init_label(_(\"Add Face\")) + init_description(_(\"Add a face, so the new hole is capped\")) + init_value(false))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_scaling.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_add_face.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\t\tk3d::table_copier point_attributes(Output.point_attributes);\n\n\t\tconst k3d::double_t scaling = m_scaling.pipeline_value();\n\t\tconst bool add_face = m_add_face.pipeline_value();\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh::indices_t input_loop_first_edges = polyhedron->loop_first_edges;\n\t\t\tpolyhedron->loop_first_edges.clear();\n\n\t\t\t// For each selected face ...\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_loop = polyhedron->face_first_loops[face];\n\t\t\t\tconst k3d::uint_t loop_count = polyhedron->face_loop_counts[face];\n\t\t\t\tconst k3d::uint_t first_edge = input_loop_first_edges[first_loop];\n\n\t\t\t\tconst k3d::mesh::indices_t::const_iterator face_loops_begin = input_loop_first_edges.begin()+first_loop;\n\t\t\t\tconst k3d::mesh::indices_t::const_iterator face_loops_end = face_loops_begin + loop_count;\n\t\t\t\tpolyhedron->face_first_loops[face] = polyhedron->loop_first_edges.size();\n\t\t\t\tpolyhedron->loop_first_edges.insert(polyhedron->loop_first_edges.end(), face_loops_begin, face_loops_end);\n\n\t\t\t\tif(!polyhedron->face_selections[face])\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// Deselect the face, making it easier to move the new hole around\n\t\t\t\tpolyhedron->face_selections[face] = 0.;\n\n\t\t\t\t// Get ready to copy attributes ...\n\t\t\t\tk3d::table_copier edge_attributes(polyhedron->edge_attributes);\n\t\t\t\tk3d::table_copier vertex_attributes(polyhedron->vertex_attributes);\n\t\t\t\tk3d::table_copier face_attributes(polyhedron->face_attributes);\n\n\t\t\t\t// Add a new loop\n\t\t\t\tpolyhedron->face_loop_counts[face]++;\n\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->vertex_points.size());\n\n\t\t\t\t// Generate points and edges  for each corner of the hole, and calculate the face centroid position as scaling reference\n\t\t\t\tk3d::point3 centroid(0, 0, 0);\n\t\t\t\tconst k3d::uint_t hole_begin = points.size();\n\t\t\t\tconst k3d::uint_t first_new_edge = polyhedron->vertex_points.size();\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t old_point_idx = polyhedron->vertex_points[edge];\n\t\t\t\t\tconst k3d::uint_t new_point_idx = points.size();\n\t\t\t\t\tconst k3d::uint_t new_edge = polyhedron->vertex_points.size();\n\t\t\t\t\t// Add new edge\n\t\t\t\t\tpolyhedron->vertex_points.push_back(new_point_idx);\n\t\t\t\t\tedge_attributes.push_back(edge);\n\t\t\t\t\tvertex_attributes.push_back(edge);\n          polyhedron->edge_selections.push_back(1.);\n          polyhedron->vertex_selections.push_back(1.);\n\n\t\t\t\t\t// clockwise edges\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(new_edge-1);\n\n\t\t\t\t\tpoints.push_back(points[old_point_idx]);\n\t\t\t\t\tpoint_selection.push_back(1.);\n\t\t\t\t\tpoint_attributes.push_back(old_point_idx);\n\t\t\t\t\tcentroid += k3d::to_vector(points.back());\n\n\n\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t{\n\t\t\t\t\t\tpolyhedron->clockwise_edges[first_new_edge] = new_edge;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tconst k3d::uint_t hole_end = points.size();\n\n\t\t\t\t// Adjust point positions by scaling around the center\n\t\t\t\tcentroid /= static_cast<k3d::double_t>(hole_end-hole_begin);\n\t\t\t\tconst k3d::vector3 translation_vec = k3d::to_vector(centroid);\n\t\t\t\tconst k3d::matrix4 scaling_mat = k3d::scale3(scaling, scaling, scaling);\n\t\t\t\tfor(k3d::uint_t point_idx = hole_begin; point_idx != hole_end; ++point_idx)\n\t\t\t\t{\n\t\t\t\t\tk3d::point3& p = points[point_idx];\n\t\t\t\t\tp = scaling_mat*(p - translation_vec) + translation_vec;\n\t\t\t\t}\n\n\t\t\t\t// Add a new face if requested\n\t\t\t\tif(add_face)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t new_face_idx = polyhedron->face_shells.size();\n\t\t\t\t\tconst k3d::uint_t new_loop_idx = polyhedron->loop_first_edges.size();\n\n\t\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[face]);\n\t\t\t\t\tpolyhedron->face_first_loops.push_back(new_loop_idx);\n\t\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\t\tpolyhedron->face_selections.push_back(1.);\n\t\t\t\t\tpolyhedron->face_materials.push_back(polyhedron->face_materials[face]);\n\t\t\t\t\tface_attributes.push_back(face);\n\t\t\t\t\tfor(k3d::uint_t point_idx = hole_begin; point_idx != hole_end; ++point_idx)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t new_edge_idx = polyhedron->vertex_points.size();\n\n\t\t\t\t\t\tif(point_idx == hole_begin)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpolyhedron->loop_first_edges.push_back(new_edge_idx);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpolyhedron->vertex_points.push_back(point_idx);\n\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(new_edge_idx+1);\n\n\t\t\t\t\t\tpolyhedron->edge_selections.push_back(1.);\n\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(1.);\n\t\t\t\t\t\tedge_attributes.push_back(first_edge + point_idx - hole_begin);\n\t\t\t\t\t\tvertex_attributes.push_back(first_edge + point_idx - hole_begin);\n\t\t\t\t\t}\n\t\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<make_hole,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x9b86ef8b, 0xdc31444a, 0xbf56a318, 0xfe3e11d2),\n\t\t\t\t\"MakeHole\",\n\t\t\t\t\"Creates a hole in each selected face, using the face outer loop as basis and scaling it by the specified factor.\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_scaling;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_add_face;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// make_hole_factory\n\nk3d::iplugin_factory& make_hole_factory()\n{\n\treturn make_hole::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n"
  },
  {
    "path": "modules/polyhedron/make_sds.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// make_sds_implementation\n\nclass make_sds_implementation :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\ttypedef k3d::typed_array<std::string> tags_t;\n\npublic:\n\tmake_sds_implementation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_interpolateboundary(init_owner(*this) + init_name(\"interpolateboundary\") + init_label(_(\"Interpolate boundary\")) + init_description(_(\"Render sharp boundaries on the resulting subdivision surface\")) + init_value(true))\n\t{\n\t\tm_interpolateboundary.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tconst k3d::bool_t interpolateboundary = m_interpolateboundary.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tstd::fill(polyhedron->shell_types.begin(), polyhedron->shell_types.end(), k3d::polyhedron::CATMULL_CLARK);\n\t\t\t\n\t\t\tif(interpolateboundary)\n\t\t\t\tpolyhedron->constant_attributes.create(\"interpolateboundary\", new k3d::typed_array<k3d::string_t>(polyhedron->shell_types.size(), \"interpolateboundary\"));\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<make_sds_implementation,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x6550aef5, 0xefd24248, 0x8833eeab, 0xa267191e),\n\t\t\t\t\"MakeSDS\",\n\t\t\t\t_(\"Converts input polyhedra to SDS surfaces\"),\n\t\t\t\t\"Subdivision\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_interpolateboundary;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// make_sds_factory\n\nk3d::iplugin_factory& make_sds_factory()\n{\n\treturn make_sds_implementation::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/polyhedron/merge_collinear_edges.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2009 Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/euler_operations.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/vectors.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// merge_collinear_edges\n\nclass merge_collinear_edges :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tmerge_collinear_edges(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_threshold(init_owner(*this) + init_name(\"threshold\") + init_label(_(\"Threshold\")) + init_description(_(\"Controls the sensitivity for deciding when two edges are collinear.\")) + init_value(1e-8) + init_step_increment(1e-8) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_threshold.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tk3d::mesh::primitives_t::iterator output_primitive = Output.primitives.begin();\n\t\tfor(k3d::mesh::primitives_t::const_iterator input_primitive = Input.primitives.begin(); input_primitive != Input.primitives.end(); ++input_primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> input_polyhedron(k3d::polyhedron::validate(Input, **input_primitive));\n\t\t\tif(!input_polyhedron)\n\t\t\t{\n\t\t\t\t++output_primitive;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> output_polyhedron(k3d::polyhedron::validate(Output, *output_primitive));\n\t\t\t++output_primitive;\n\t\t\tk3d::mesh::selection_t input_edge_selection = output_polyhedron->edge_selections;\n\t\t\n\t\t\tconst k3d::mesh::points_t& points = *Input.points;\n\t\t\t\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = input_polyhedron->face_first_loops.size();\n\t\t\t\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::mesh::indices_t companions;\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(input_polyhedron->vertex_points, input_polyhedron->clockwise_edges, boundary_edges, companions);\n\t\t\t\n\t\t\tk3d::mesh::counts_t vertex_valences;\n\t\t\tk3d::polyhedron::create_point_valence_lookup(Output.points->size(), output_polyhedron->vertex_points, vertex_valences);\n\t\t\tk3d::mesh::indices_t redundant_edges;\n\t\t\tk3d::polyhedron::mark_collinear_edges(redundant_edges, input_edge_selection, points, input_polyhedron->vertex_points, input_polyhedron->clockwise_edges, vertex_valences, boundary_edges, companions, m_threshold.pipeline_value());\n\t\t\t\n\t\t\tk3d::euler::kill_edge_and_vertex(*output_polyhedron, redundant_edges, boundary_edges, companions, points.size());\n\t\t}\n\t\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\t\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<merge_collinear_edges,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x8b4b5184, 0x42454f3d, 0x227bbf86, 0x72f2b933),\n\t\t\t\t\"MergeCollinearEdges\",\n\t\t\t\t_(\"Merges edges that are collinear, up to a threshold\"),\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_threshold;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// merge_collinear_edges_factory\n\nk3d::iplugin_factory& merge_collinear_edges_factory()\n{\n\treturn merge_collinear_edges::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/merge_coplanar_faces.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2009 Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/euler_operations.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/vectors.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// merge_coplanar_faces\n\nclass merge_coplanar_faces :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tmerge_coplanar_faces(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_threshold(init_owner(*this) + init_name(\"threshold\") + init_label(_(\"Threshold\")) + init_description(_(\"Controls the sensitivity for deciding when two edges are collinear.\")) + init_value(1e-8) + init_step_increment(1e-8) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_threshold.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tk3d::mesh::primitives_t::iterator output_primitive = Output.primitives.begin();\n\t\tfor(k3d::mesh::primitives_t::const_iterator input_primitive = Input.primitives.begin(); input_primitive != Input.primitives.end(); ++input_primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> input_polyhedron(k3d::polyhedron::validate(Input, **input_primitive));\n\t\t\tif(!input_polyhedron)\n\t\t\t{\n\t\t\t\t++output_primitive;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> output_polyhedron(k3d::polyhedron::validate(Output, *output_primitive));\n\t\t\t++output_primitive;\n\t\t\t\n\t\t\tk3d::mesh::selection_t input_face_selection = output_polyhedron->face_selections;\n\t\t\tconst k3d::mesh::points_t& points = *Input.points;\n\t\t\t\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + input_polyhedron->face_first_loops.size();\n\t\t\t\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::mesh::indices_t companions;\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(input_polyhedron->vertex_points, input_polyhedron->clockwise_edges, boundary_edges, companions);\n\t\t\t\n\t\t\t// Calculate the face normals\n\t\t\tk3d::mesh::normals_t face_normals(input_polyhedron->face_first_loops.size());\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tface_normals[face] = k3d::normalize(k3d::polyhedron::normal(input_polyhedron->vertex_points, input_polyhedron->clockwise_edges, points, input_polyhedron->loop_first_edges[input_polyhedron->face_first_loops[face]]));\n\t\t\t}\n\t\t\t\n\t\t\tk3d::mesh::indices_t edge_faces;\n\t\t\tk3d::polyhedron::create_edge_face_lookup(*input_polyhedron, edge_faces);\n\t\t\tk3d::mesh::indices_t redundant_edges;\n\t\t\tk3d::polyhedron::mark_coplanar_edges(companions, boundary_edges, face_normals, edge_faces, input_face_selection, redundant_edges, m_threshold.pipeline_value());\n\t\t\n\t\t\tk3d::euler::kill_edge_make_loop(*output_polyhedron, redundant_edges, boundary_edges, companions, points, face_normals);\n\t\t}\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<merge_coplanar_faces,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xba2b777f, 0xad4d6bbb, 0x04277595, 0x88105177),\n\t\t\t\t\"MergeCoplanarFaces\",\n\t\t\t\t_(\"Merges faces that are coplanar, up to a given threshold\"),\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_threshold;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// merge_coplanar_faces_factory\n\nk3d::iplugin_factory& merge_coplanar_faces_factory()\n{\n\treturn merge_coplanar_faces::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n"
  },
  {
    "path": "modules/polyhedron/merge_polyhedra.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/vectors.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace detail\n{\n\ntemplate<typename ArrayT>\nvoid append_array(const ArrayT& source, ArrayT& destination)\n{\n\tdestination.insert(destination.end(), source.begin(), source.end());\n}\n\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// merge_polyhedra_implementation\n\nclass merge_polyhedra_implementation :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tmerge_polyhedra_implementation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput.points = Input.points;\n\t\tOutput.point_selection = Input.point_selection;\n\t\tOutput.point_attributes = Input.point_attributes;\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> output_polyhedron(k3d::polyhedron::create(Output));\n\n\t\tfor(k3d::uint_t i = 0; i != Input.primitives.size(); ++i)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> input_polyhedron(k3d::polyhedron::validate(Input, *Input.primitives[i]));\n\t\t\tif(input_polyhedron)\n\t\t\t{\n\t\t\t\tk3d::table_copier face_attributes(input_polyhedron->face_attributes, output_polyhedron->face_attributes);\n\t\t\t\tk3d::table_copier edge_attributes(input_polyhedron->edge_attributes, output_polyhedron->edge_attributes);\n\t\t\t\tk3d::table_copier vertex_attributes(input_polyhedron->vertex_attributes, output_polyhedron->vertex_attributes);\n\t\t\t\tk3d::table_copier constant_attributes(input_polyhedron->constant_attributes, output_polyhedron->constant_attributes);\n\n\t\t\t\tconst k3d::uint_t face_offset = output_polyhedron->face_selections.size();\n\t\t\t\tconst k3d::uint_t edge_offset = output_polyhedron->edge_selections.size();\n\t\t\t\tconst k3d::uint_t vertex_offset = output_polyhedron->vertex_selections.size();\n\t\t\t\tconst k3d::uint_t loop_offset = output_polyhedron->loop_first_edges.size();\n\t\t\t\tconst k3d::uint_t shell_offset = output_polyhedron->shell_types.size();\n\n\t\t\t\tdetail::append_array(input_polyhedron->shell_types, output_polyhedron->shell_types);\n\t\t\t\tconst k3d::uint_t nb_shells = input_polyhedron->shell_types.size();\n\t\t\t\tfor(k3d::uint_t shell_idx = 0; shell_idx != nb_shells; ++shell_idx)\n\t\t\t\t{\n\t\t\t\t\tconstant_attributes.push_back(shell_idx);\n\t\t\t\t}\n\n\n\t\t\t\tconst k3d::uint_t nb_faces = input_polyhedron->face_selections.size();\n\t\t\t\tfor(k3d::uint_t face_idx = 0; face_idx != nb_faces; ++face_idx)\n\t\t\t\t{\n\t\t\t\t\toutput_polyhedron->face_shells.push_back(input_polyhedron->face_shells[face_idx]+shell_offset);\n\t\t\t\t\toutput_polyhedron->face_first_loops.push_back(input_polyhedron->face_first_loops[face_idx] + loop_offset);\n\t\t\t\t\tface_attributes.push_back(face_idx);\n\t\t\t\t}\n\t\t\t\tdetail::append_array(input_polyhedron->face_loop_counts, output_polyhedron->face_loop_counts);\n\t\t\t\tdetail::append_array(input_polyhedron->face_selections, output_polyhedron->face_selections);\n\t\t\t\tdetail::append_array(input_polyhedron->face_materials, output_polyhedron->face_materials);\n\n\t\t\t\tconst k3d::uint_t nb_loops = input_polyhedron->loop_first_edges.size();\n\t\t\t\tfor(k3d::uint_t loop_idx = 0; loop_idx != nb_loops; ++loop_idx)\n\t\t\t\t{\n\t\t\t\t\toutput_polyhedron->loop_first_edges.push_back(input_polyhedron->loop_first_edges[loop_idx] + edge_offset);\n\t\t\t\t}\n\n\t\t\t\tconst k3d::uint_t nb_edges = input_polyhedron->edge_selections.size();\n\t\t\t\tfor(k3d::uint_t edge_idx = 0; edge_idx != nb_edges; ++edge_idx)\n\t\t\t\t{\n\t\t\t\t\toutput_polyhedron->clockwise_edges.push_back(input_polyhedron->clockwise_edges[edge_idx] + edge_offset);\n\t\t\t\t\tedge_attributes.push_back(edge_idx);\n\t\t\t\t\tvertex_attributes.push_back(edge_idx);\n\t\t\t\t}\n\n\t\t\t\tdetail::append_array(input_polyhedron->edge_selections, output_polyhedron->edge_selections);\n\t\t\t\tdetail::append_array(input_polyhedron->vertex_points, output_polyhedron->vertex_points);\n\t\t\t\tdetail::append_array(input_polyhedron->vertex_selections, output_polyhedron->vertex_selections);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tOutput.primitives.push_back(Input.primitives[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<merge_polyhedra_implementation,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x6e7b898a, 0xc1554b80, 0xaaca338d, 0xffe04907),\n\t\t\t\t\"MergePolyhedra\",\n\t\t\t\t_(\"Merges all polyhedra in a mesh into a single polyhedron\"),\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// merge_polyhedra_factory\n\nk3d::iplugin_factory& merge_polyhedra_factory()\n{\n\treturn merge_polyhedra_implementation::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/polyhedron/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n//extern k3d::iplugin_factory& bevel_faces_factory();\nextern k3d::iplugin_factory& bevel_points_factory();\nextern k3d::iplugin_factory& bridge_edges_factory();\nextern k3d::iplugin_factory& bridge_faces_factory();\nextern k3d::iplugin_factory& cap_holes_factory();\nextern k3d::iplugin_factory& collapse_edges_factory();\nextern k3d::iplugin_factory& collapse_faces_factory();\nextern k3d::iplugin_factory& collapse_points_factory();\nextern k3d::iplugin_factory& connect_vertices_factory();\nextern k3d::iplugin_factory& delete_components_factory();\nextern k3d::iplugin_factory& dissolve_faces_factory();\nextern k3d::iplugin_factory& extrude_faces_factory();\n//extern k3d::iplugin_factory& fillet_edges_factory();\nextern k3d::iplugin_factory& flip_orientation_factory();\nextern k3d::iplugin_factory& make_hole_factory();\nextern k3d::iplugin_factory& make_sds_factory();\nextern k3d::iplugin_factory& merge_collinear_edges_factory();\nextern k3d::iplugin_factory& merge_coplanar_faces_factory();\nextern k3d::iplugin_factory& merge_polyhedra_factory();\nextern k3d::iplugin_factory& move_first_edge_factory();\nextern k3d::iplugin_factory& reshape_face_to_circle_factory();\nextern k3d::iplugin_factory& sds_corner_factory();\nextern k3d::iplugin_factory& sds_crease_factory();\nextern k3d::iplugin_factory& sds_hole_factory();\nextern k3d::iplugin_factory& selected_faces_to_polyhedron_factory();\nextern k3d::iplugin_factory& subdivide_edges_factory();\nextern k3d::iplugin_factory& subdivide_faces_factory();\nextern k3d::iplugin_factory& triangulate_faces_factory();\n\n} // namespace polyhedron\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n//\tRegistry.register_factory(module::polyhedron::bevel_faces_factory());\n\tRegistry.register_factory(module::polyhedron::bevel_points_factory());\n\tRegistry.register_factory(module::polyhedron::bridge_edges_factory());\n\tRegistry.register_factory(module::polyhedron::bridge_faces_factory());\n\tRegistry.register_factory(module::polyhedron::cap_holes_factory());\n\tRegistry.register_factory(module::polyhedron::collapse_edges_factory());\n\tRegistry.register_factory(module::polyhedron::collapse_faces_factory());\n\tRegistry.register_factory(module::polyhedron::collapse_points_factory());\n\tRegistry.register_factory(module::polyhedron::connect_vertices_factory());\n\tRegistry.register_factory(module::polyhedron::delete_components_factory());\n\tRegistry.register_factory(module::polyhedron::dissolve_faces_factory());\n\tRegistry.register_factory(module::polyhedron::extrude_faces_factory());\n//\tRegistry.register_factory(module::polyhedron::fillet_edges_factory());\n\tRegistry.register_factory(module::polyhedron::flip_orientation_factory());\n\tRegistry.register_factory(module::polyhedron::make_hole_factory());\n\tRegistry.register_factory(module::polyhedron::make_sds_factory());\n\tRegistry.register_factory(module::polyhedron::merge_collinear_edges_factory());\n\tRegistry.register_factory(module::polyhedron::merge_coplanar_faces_factory());\n\tRegistry.register_factory(module::polyhedron::merge_polyhedra_factory());\n\tRegistry.register_factory(module::polyhedron::move_first_edge_factory());\n\tRegistry.register_factory(module::polyhedron::reshape_face_to_circle_factory());\n\tRegistry.register_factory(module::polyhedron::sds_corner_factory());\n\tRegistry.register_factory(module::polyhedron::sds_crease_factory());\n\tRegistry.register_factory(module::polyhedron::sds_hole_factory());\n\tRegistry.register_factory(module::polyhedron::selected_faces_to_polyhedron_factory());\n\tRegistry.register_factory(module::polyhedron::subdivide_edges_factory());\n\tRegistry.register_factory(module::polyhedron::subdivide_faces_factory());\n\tRegistry.register_factory(module::polyhedron::triangulate_faces_factory());\nK3D_MODULE_END\n"
  },
  {
    "path": "modules/polyhedron/move_first_edge.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/// Handles negative numbers the way I'd expect it to\nstatic k3d::int32_t mymod(const k3d::int32_t a, const k3d::int32_t b)\n{\n\tk3d::int32_t result = a;\n\n\twhile(result < 0)\n\t\tresult += b;\n\twhile(result >= b)\n\t\tresult -= b;\n\n\treturn result;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// move_first_edge_implementation\n\nclass move_first_edge_implementation :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tmove_first_edge_implementation(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_distance(init_owner(*this) + init_name(\"distance\") + init_label(_(\"distance\")) + init_description(_(\"Face distance\")) + init_value(0UL) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_distance.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tconst k3d::int32_t distance = m_distance.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::mesh::counts_t counts;\n\t\t\tk3d::polyhedron::create_loop_edge_count_lookup(*polyhedron, counts);\n\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tif(!polyhedron->face_selections[face])\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst k3d::uint_t loop = polyhedron->face_first_loops[face];\n\t\t\t\tconst k3d::uint_t loop_distance = mymod(distance, counts[loop]);\n\n\t\t\t\tfor(k3d::uint_t i = 0; i != loop_distance; ++i)\n\t\t\t\t\tpolyhedron->loop_first_edges[loop] = polyhedron->clockwise_edges[polyhedron->loop_first_edges[loop]];\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<move_first_edge_implementation,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x81c766ed, 0x2cb943c7, 0x91e9e680, 0xeba9bc4b),\n\t\t\t\t\"MoveFirstEdge\",\n\t\t\t\t_(\"Changes the first edge for selected polygons\"),\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_distance;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// move_first_edge_factory\n\nk3d::iplugin_factory& move_first_edge_factory()\n{\n\treturn move_first_edge_implementation::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/polyhedron/reshape_face_to_circle.cpp",
    "content": "// K-3D\n// Copyright (c) 2004-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// reshape_face_to_circle\n\nclass reshape_face_to_circle :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\treshape_face_to_circle(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"radius\")) + init_description(_(\"Radius\")) + init_value(0.5) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_reset_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// For each selected face ...\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tif(!polyhedron->face_selections[face])\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// first compute the centroid\n\t\t\t\tk3d::point3 centroid(0, 0, 0);\n\t\t\t\tk3d::uint_t npoints = 0;\n\t\t\t\tconst k3d::uint_t first_loop = polyhedron->face_first_loops[face];\n\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[first_loop];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tcentroid += k3d::to_vector(points[polyhedron->vertex_points[edge]]);\n\t\t\t\t\t++npoints;\n\n\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcentroid /= k3d::double_t(npoints);\n\t\t\t\tconst k3d::double_t angle_step = 2.*k3d::pi() / k3d::double_t(npoints);\n\t\t\t\tconst k3d::point3& first_point = points[polyhedron->vertex_points[first_edge]];\n\t\t\t\tconst k3d::normal3 normal = k3d::polyhedron::normal(polyhedron->vertex_points, polyhedron->clockwise_edges, points, first_edge);\n\t\t\t\tconst k3d::vector3 first_vector = radius * (first_point - centroid) / (first_point - centroid).length();\n\t\t\t\tk3d::double_t angle = 0;\n\n\t\t\t\t// Move the points\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tpoints[polyhedron->vertex_points[edge]] = centroid + k3d::rotate3(k3d::angle_axis(angle, k3d::to_vector(normal))) * first_vector;\n\t\t\t\t\tangle += angle_step;\n\n\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<reshape_face_to_circle,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x7adb5e69, 0xec6e447f, 0x93070dd8, 0xf78f2f65),\n\t\t\t\t\"ReshapeFaceToCircle\",\n\t\t\t\t\"Reshapes the first edge loop of the face to a circle.\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// reshape_face_to_circle_factory\n\nk3d::iplugin_factory& reshape_face_to_circle_factory()\n{\n\treturn reshape_face_to_circle::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n"
  },
  {
    "path": "modules/polyhedron/sds_corner.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sds_corner\n\nclass sds_corner :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tsds_corner(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_sharpness(init_owner(*this) + init_name(\"sharpness\") + init_label(_(\"Sharpness\")) + init_description(_(\"Controls the sharpness of subdivision surface corners\")) + init_value(0.0))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_sharpness.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tconst k3d::double_t sharpness = m_sharpness.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::uint_t edge_count = polyhedron->edge_selections.size();\n\t\t\tk3d::mesh::doubles_t* corners_ptr = polyhedron->vertex_attributes.writable<k3d::mesh::doubles_t>(\"corner\");\n\t\t\tk3d::mesh::doubles_t& corners = corners_ptr ? *corners_ptr : polyhedron->vertex_attributes.create<k3d::mesh::doubles_t>(\"corner\", new k3d::mesh::doubles_t(edge_count, 0));\n\n\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\tconst k3d::uint_t edge_end = edge_begin + edge_count;\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(Output.point_selection->at(polyhedron->vertex_points[edge]))\n\t\t\t\t\tcorners[edge] = sharpness;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sds_corner,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xded03869, 0x283e4531, 0x9de22a9c, 0xe763d7c6),\n\t\t\t\t\"SDSCorner\",\n\t\t\t\t_(\"Adds variable-sharpness corners to SDS surfaces\"),\n\t\t\t\t\"Subdivision\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_sharpness;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// sds_corner_factory\n\nk3d::iplugin_factory& sds_corner_factory()\n{\n\treturn sds_corner::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/polyhedron/sds_crease.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sds_crease\n\nclass sds_crease :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tsds_crease(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_sharpness(init_owner(*this) + init_name(\"sharpness\") + init_label(_(\"Sharpness\")) + init_description(_(\"Controls the sharpness of subdivision surface creases\")) + init_value(0.0))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_sharpness.changed_signal().connect(make_update_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tconst k3d::double_t sharpness = m_sharpness.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::uint_t edge_count = polyhedron->edge_selections.size();\n\t\t\tk3d::mesh::doubles_t* creases_ptr = polyhedron->edge_attributes.writable<k3d::mesh::doubles_t>(\"crease\");\n\t\t\tk3d::mesh::doubles_t& creases = creases_ptr ? *creases_ptr : polyhedron->edge_attributes.create<k3d::mesh::doubles_t>(\"crease\", new k3d::mesh::doubles_t(edge_count, 0));\n\n\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\tconst k3d::uint_t edge_end = edge_begin + edge_count;\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(polyhedron->edge_selections[edge])\n\t\t\t\t\tcreases[edge] = sharpness;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sds_crease,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x78b79c12, 0x4c174732, 0xa67d6317, 0x6dbec1fb),\n\t\t\t\t\"SDSCrease\",\n\t\t\t\t_(\"Adds variable-sharpness creases to SDS surfaces\"),\n\t\t\t\t\"Subdivision\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_sharpness;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// sds_crease_factory\n\nk3d::iplugin_factory& sds_crease_factory()\n{\n\treturn sds_crease::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/sds_hole.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sds_hole\n\nclass sds_hole :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tsds_hole(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::uint_t face_count = polyhedron->face_first_loops.size();\n\t\t\tk3d::mesh::bools_t* holes_ptr = polyhedron->face_attributes.writable<k3d::mesh::bools_t>(\"hole\");\n\t\t\tk3d::mesh::bools_t& holes = holes_ptr ? *holes_ptr : polyhedron->face_attributes.create<k3d::mesh::bools_t>(\"hole\", new k3d::mesh::bools_t(face_count, false));\n\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + face_count;\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tif(polyhedron->face_selections[face])\n\t\t\t\t\tholes[face] = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sds_hole,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xe2e8a116, 0x38d44227, 0x90ae28bf, 0x271ab0be),\n\t\t\t\t\"SDSHole\",\n\t\t\t\t_(\"Inserts holes into a subdivision surface mesh\"),\n\t\t\t\t\"Subdivision\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// sds_hole_factory\n\nk3d::iplugin_factory& sds_hole_factory()\n{\n\treturn sds_hole::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/polyhedron/selected_faces_to_polyhedron.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2010 Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// selected_faces_to_polyhedron\n\nclass selected_faces_to_polyhedron :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tselected_faces_to_polyhedron(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tk3d::mesh tmp = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), tmp);\n\n\t\tOutput.points = Input.points;\n\t\tOutput.point_attributes = Input.point_attributes;\n\t\tOutput.point_selection = Input.point_selection;\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> output_polyhedron(k3d::polyhedron::create(Output));\n\n\t\toutput_polyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\tfor(k3d::uint_t i = 0; i != Input.primitives.size(); ++i)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(tmp, *tmp.primitives[i]));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = polyhedron->face_selections.size();\n\t\t\tk3d::mesh::selection_t input_selected_faces(face_end - face_begin, 0.0);\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tif(polyhedron->face_selections[face])\n\t\t\t\t{\n\t\t\t\t\toutput_polyhedron->face_materials.push_back(polyhedron->face_materials[face]);\n\t\t\t\t\toutput_polyhedron->face_selections.push_back(polyhedron->face_selections[face]);\n\t\t\t\t\toutput_polyhedron->face_first_loops.push_back(output_polyhedron->loop_first_edges.size());\n\t\t\t\t\toutput_polyhedron->face_loop_counts.push_back(polyhedron->face_loop_counts[face]);\n\t\t\t\t\toutput_polyhedron->face_shells.push_back(0);\n\t\t\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\t\tconst k3d::uint_t loop_end = polyhedron->face_loop_counts[face] + loop_begin;\n\t\t\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t\t\t{\n\t\t\t\t\t\toutput_polyhedron->loop_first_edges.push_back(output_polyhedron->vertex_points.size());\n\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\t\tconst k3d::uint_t new_first_edge = output_polyhedron->vertex_points.size();\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toutput_polyhedron->vertex_points.push_back(polyhedron->vertex_points[edge]);\n\t\t\t\t\t\t\toutput_polyhedron->vertex_selections.push_back(polyhedron->vertex_selections[edge]);\n\t\t\t\t\t\t\toutput_polyhedron->edge_selections.push_back(polyhedron->edge_selections[edge]);\n\t\t\t\t\t\t\toutput_polyhedron->clockwise_edges.push_back(output_polyhedron->vertex_points.size());\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toutput_polyhedron->clockwise_edges.back() = new_first_edge;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<selected_faces_to_polyhedron,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x335179a6, 0x1d42d12a, 0x4e5b8aac, 0x22ce5792),\n\t\t\t\t\"SelectedFacesToPolyhedron\",\n\t\t\t\t\"Outputs all selected faces to a single polyhedron.\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// selected_faces_to_polyhedron_factory\n\nk3d::iplugin_factory& selected_faces_to_polyhedron_factory()\n{\n\treturn selected_faces_to_polyhedron::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/subdivide_edges.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2010 Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// subdivide_edges\n\nclass subdivide_edges :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tsubdivide_edges(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_vertices(init_owner(*this) + init_name(\"vertices\") + init_label(_(\"Vertices\")) + init_description(_(\"Number of vertices to insert in each selected edge\")) + init_value(1L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_vertices.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tconst k3d::int32_t vertices = m_vertices.pipeline_value();\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\n\t\t\t// Compute adjacent edges ...\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::mesh::indices_t adjacent_edges;\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\n\t\t\t// While building new edges, we will map from each edge to any points that are created for it ...\n\t\t\tk3d::mesh::indices_t edge_first_points(polyhedron->clockwise_edges.size());\n\n\t\t\t// Get ready to copy attributes ...\n\t\t\tk3d::table_copier point_attributes(Output.point_attributes);\n\t\t\tk3d::table_copier edge_attributes(polyhedron->edge_attributes);\n\t\t\tk3d::table_copier vertex_attributes(polyhedron->vertex_attributes);\n\n\t\t\t// For each edge ...\n\t\t\tconst k3d::uint_t begin_edge = 0;\n\t\t\tconst k3d::uint_t end_edge = begin_edge + polyhedron->clockwise_edges.size();\n\t\t\tfor(k3d::uint_t edge = begin_edge; edge != end_edge; ++edge)\n\t\t\t{\n\t\t\t\tif(!polyhedron->edge_selections[edge])\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// Keep track of the points that will be used, in clockwise order, to create new edges ...\n\t\t\t\tk3d::mesh::indices_t clockwise_points(vertices);\n\n\t\t\t\t// If this edge has a companion, and the companion has already created points, use them ...\n\t\t\t\tif(!boundary_edges[edge] && polyhedron->edge_selections[adjacent_edges[edge]] && adjacent_edges[edge] < edge)\n\t\t\t\t{\n\t\t\t\t\tedge_first_points[edge] = edge_first_points[adjacent_edges[edge]];\n\n\t\t\t\t\tfor(k3d::uint_t vertex = 0; vertex != vertices; ++vertex)\n\t\t\t\t\t\tclockwise_points[vertex] = edge_first_points[edge] + vertex;\n\t\t\t\t\tstd::reverse(clockwise_points.begin(), clockwise_points.end());\n\t\t\t\t}\n\t\t\t\t// Otherwise, create new points for this edge ...\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tedge_first_points[edge] = points.size();\n\n\t\t\t\t\tconst k3d::point3 start_point = points[polyhedron->vertex_points[edge]];\n\t\t\t\t\tconst k3d::point3 end_point = points[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]];\n\n\t\t\t\t\tfor(k3d::uint_t vertex = 0; vertex != vertices; ++vertex)\n\t\t\t\t\t{\n\t\t\t\t\t\tclockwise_points[vertex] = points.size();\n\n\t\t\t\t\t\tpoints.push_back(k3d::mix(start_point, end_point, k3d::ratio(static_cast<k3d::int32_t>(vertex + 1), vertices + 1)));\n\t\t\t\t\t\tpoint_selection.push_back(1);\n\t\t\t\t\t\tpoint_attributes.push_back(polyhedron->vertex_points[edge]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Using the new points, create new edges ...\n\t\t\t\tconst k3d::uint_t clockwise_edge = polyhedron->clockwise_edges[edge];\n\t\t\t\tpolyhedron->clockwise_edges[edge] = polyhedron->clockwise_edges.size();\n\t\t\t\tfor(k3d::uint_t vertex = 0; vertex != vertices; ++vertex)\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(1);\n\t\t\t\t\tedge_attributes.push_back(edge);\n\t\t\t\t\tpolyhedron->vertex_points.push_back(clockwise_points[vertex]);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\tvertex_attributes.push_back(edge);\n\t\t\t\t}\n\t\t\t\tpolyhedron->clockwise_edges.back() = clockwise_edge;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<subdivide_edges,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x62de51ff, 0xe70f423a, 0x953d899a, 0x1dbf5c38),\n\t\t\t\t\"SubdivideEdges\",\n\t\t\t\t\"Subdivides selected edges by adding points.\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_vertices;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// subdivide_edges_factory\n\nk3d::iplugin_factory& subdivide_edges_factory()\n{\n\treturn subdivide_edges::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/subdivide_faces.cpp",
    "content": "// K-3D\n// Copyright (c) 2004-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/table_copier.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// subdivide_faces\n\nclass subdivide_faces :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tsubdivide_faces(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_subdivision_type(init_owner(*this) + init_name(\"subdivision_type\") + init_label(_(\"Subdivision type\")) + init_description(_(\"Join : center to midpoints, midpoints, center to points\")) + init_value(CENTER_MIDPOINTS) + init_enumeration(subdivision_values()))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_subdivision_type.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tif(!Output.points)\n\t\t\treturn;\n\t\tif(!Output.point_selection)\n\t\t\treturn;\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\t\tk3d::table_copier point_attributes(Output.point_attributes);\n\n\t\tconst subdivision_t subdivision_type = m_subdivision_type.pipeline_value();\n\n\t\t// Don't explicitly remove any points ...\n\t\tk3d::mesh::bools_t remove_points(points.size(), false);\n\n\t\t// For each polyhedron ...\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Get ready to copy attributes ...\n\t\t\tk3d::table_copier face_attributes(polyhedron->face_attributes);\n\t\t\tk3d::table_copier edge_attributes(polyhedron->edge_attributes);\n\t\t\tk3d::table_copier vertex_attributes(polyhedron->vertex_attributes);\n\n\t\t\t// Don't explicitly delete any edges ...\n\t\t\tk3d::mesh::bools_t remove_edges(polyhedron->clockwise_edges.size(), false);\n\n\t\t\t// Don't explicitly delete any loops ...\n\t\t\tk3d::mesh::bools_t remove_loops(polyhedron->loop_first_edges.size(), false);\n\n\t\t\t// Keep track of faces to be deleted ...\n\t\t\tk3d::mesh::bools_t remove_faces(polyhedron->face_shells.size(), false);\n\n\t\t\t// Subdivide the faces ...\n\t\t\tswitch(subdivision_type)\n\t\t\t{\n\t\t\t\tcase CENTER:\n\t\t\t\t{\n\t\t\t\t\t// For each selected face ...\n\t\t\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!polyhedron->face_selections[face])\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[polyhedron->face_first_loops[face]];\n\n\t\t\t\t\t\t// Generate a center point ...\n\t\t\t\t\t\tk3d::mesh::indices_t center_point_indices;\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcenter_point_indices.push_back(polyhedron->vertex_points[edge]);\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst k3d::uint_t center_point = points.size();\n\t\t\t\t\t\tk3d::mesh::weights_t center_point_weights(center_point_indices.size(), 1.0 / center_point_indices.size());\n\n\t\t\t\t\t\tk3d::point3 average(0, 0, 0);\n\t\t\t\t\t\tfor(k3d::uint_t i = 0; i != center_point_indices.size(); ++i)\n\t\t\t\t\t\t\taverage += k3d::to_vector(center_point_weights[i] * points[center_point_indices[i]]);\n\t\t\t\t\t\tpoints.push_back(average);\n\t\t\t\t\t\tpoint_selection.push_back(0);\n\t\t\t\t\t\tpoint_attributes.push_back(center_point_indices.size(), &center_point_indices[0], &center_point_weights[0]);\n\t\t\t\t\t\tremove_points.push_back(false);\n\n\t\t\t\t\t\t// Generate new faces ...\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[face]);\n\t\t\t\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\t\t\t\tpolyhedron->face_selections.push_back(1);\n\t\t\t\t\t\t\tpolyhedron->face_materials.push_back(polyhedron->face_materials[face]);\n\t\t\t\t\t\t\tface_attributes.push_back(face);\n\n\t\t\t\t\t\t\tremove_faces.push_back(false);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\t\t\t\tremove_loops.push_back(false);\n\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() - 2);\n\n\t\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\n\t\t\t\t\t\t\tedge_attributes.push_back(edge);\n\t\t\t\t\t\t\tedge_attributes.push_back(edge);\n\t\t\t\t\t\t\tedge_attributes.push_back(edge);\n\n\t\t\t\t\t\t\tremove_edges.push_back(false);\n\t\t\t\t\t\t\tremove_edges.push_back(false);\n\t\t\t\t\t\t\tremove_edges.push_back(false);\n\n\t\t\t\t\t\t\tpolyhedron->vertex_points.push_back(polyhedron->vertex_points[edge]);\n\t\t\t\t\t\t\tpolyhedron->vertex_points.push_back(polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]);\n\t\t\t\t\t\t\tpolyhedron->vertex_points.push_back(center_point);\n\n\t\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\t\t\t\tvertex_attributes.push_back(edge);\n\t\t\t\t\t\t\tvertex_attributes.push_back(polyhedron->clockwise_edges[edge]);\n\n\t\t\t\t\t\t\tconst k3d::uint_t vertex_indices[2] = { edge, polyhedron->clockwise_edges[edge] };\n\t\t\t\t\t\t\tconst k3d::double_t vertex_weights[2] = { 0.5, 0.5 };\n\t\t\t\t\t\t\tvertex_attributes.push_back(2, vertex_indices, vertex_weights);\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tremove_faces[face] = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase CENTER_MIDPOINTS:\n\t\t\t\t{\n\t\t\t\t\t// Generate adjacent-edge lookups ...\n\t\t\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\t\t\tk3d::mesh::indices_t adjacent_edges;\n\t\t\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\n\t\t\t\t\t// Keep track of newly-created edge midpoints ...\n\t\t\t\t\tstd::vector<boost::optional<k3d::uint_t> > edge_midpoints(polyhedron->clockwise_edges.size());\n\t\n\t\t\t\t\t// For each selected face ...\n\t\t\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!polyhedron->face_selections[face])\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[polyhedron->face_first_loops[face]];\n\n\t\t\t\t\t\t// Generate a center point ...\n\t\t\t\t\t\tk3d::mesh::indices_t center_point_indices;\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcenter_point_indices.push_back(polyhedron->vertex_points[edge]);\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst k3d::uint_t center_point = points.size();\n\t\t\t\t\t\tk3d::mesh::weights_t center_point_weights(center_point_indices.size(), 1.0 / center_point_indices.size());\n\n\t\t\t\t\t\tk3d::point3 average(0, 0, 0);\n\t\t\t\t\t\tfor(k3d::uint_t i = 0; i != center_point_indices.size(); ++i)\n\t\t\t\t\t\t\taverage += k3d::to_vector(center_point_weights[i] * points[center_point_indices[i]]);\n\t\t\t\t\t\tpoints.push_back(average);\n\t\t\t\t\t\tpoint_selection.push_back(0);\n\t\t\t\t\t\tpoint_attributes.push_back(center_point_indices.size(), &center_point_indices[0], &center_point_weights[0]);\n\t\t\t\t\t\tremove_points.push_back(false);\n\n\t\t\t\t\t\t// Generate midpoints ...\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Don't create duplicate midpoints for adjacent edges ...\n\t\t\t\t\t\t\tif(!boundary_edges[edge] && edge_midpoints[adjacent_edges[edge]])\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tedge_midpoints[edge] = edge_midpoints[adjacent_edges[edge]];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tedge_midpoints[edge] = points.size();\n\n\t\t\t\t\t\t\t\tpoints.push_back(k3d::mix(points[polyhedron->vertex_points[edge]], points[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]], 0.5));\n\t\t\t\t\t\t\t\tpoint_selection.push_back(0);\n\t\t\t\t\t\t\t\tconst k3d::uint_t point_indices[2] = { polyhedron->vertex_points[edge], polyhedron->vertex_points[polyhedron->clockwise_edges[edge]] };\n\t\t\t\t\t\t\t\tconst k3d::double_t point_weights[2] = { 0.5, 0.5 };\n\t\t\t\t\t\t\t\tpoint_attributes.push_back(2, point_indices, point_weights);\n\t\t\t\t\t\t\t\tremove_points.push_back(false);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Generate new faces ...\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[face]);\n\t\t\t\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\t\t\t\tpolyhedron->face_selections.push_back(1);\n\t\t\t\t\t\t\tpolyhedron->face_materials.push_back(polyhedron->face_materials[face]);\n\t\t\t\t\t\t\tface_attributes.push_back(face);\n\n\t\t\t\t\t\t\tremove_faces.push_back(false);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\t\t\t\tremove_loops.push_back(false);\n\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() - 3);\n\n\t\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\n\t\t\t\t\t\t\tedge_attributes.push_back(edge);\n\t\t\t\t\t\t\tedge_attributes.push_back(polyhedron->clockwise_edges[edge]);\n\t\t\t\t\t\t\tedge_attributes.push_back(polyhedron->clockwise_edges[edge]);\n\t\t\t\t\t\t\tedge_attributes.push_back(edge);\n\n\t\t\t\t\t\t\tremove_edges.push_back(false);\n\t\t\t\t\t\t\tremove_edges.push_back(false);\n\t\t\t\t\t\t\tremove_edges.push_back(false);\n\t\t\t\t\t\t\tremove_edges.push_back(false);\n\n\t\t\t\t\t\t\tpolyhedron->vertex_points.push_back(*edge_midpoints[edge]);\n\t\t\t\t\t\t\tpolyhedron->vertex_points.push_back(polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]);\n\t\t\t\t\t\t\tpolyhedron->vertex_points.push_back(*edge_midpoints[polyhedron->clockwise_edges[edge]]);\n\t\t\t\t\t\t\tpolyhedron->vertex_points.push_back(center_point);\n\n\t\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\n\t\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\t\tconst k3d::uint_t vertex_indices[2] = { edge, polyhedron->clockwise_edges[edge] };\n\t\t\t\t\t\t\t\tconst k3d::double_t vertex_weights[2] = { 0.5, 0.5 };\t\n\t\t\t\t\t\t\t\tvertex_attributes.push_back(2, vertex_indices, vertex_weights);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\t\tvertex_attributes.push_back(polyhedron->clockwise_edges[edge]);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\t\tconst k3d::uint_t vertex_indices[2] = { polyhedron->clockwise_edges[edge], polyhedron->clockwise_edges[polyhedron->clockwise_edges[edge]] };\n\t\t\t\t\t\t\t\tconst k3d::double_t vertex_weights[2] = { 0.5, 0.5 };\n\t\t\t\t\t\t\t\tvertex_attributes.push_back(2, vertex_indices, vertex_weights);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\t\tconst k3d::uint_t vertex_indices[3] = { edge, polyhedron->clockwise_edges[edge], polyhedron->clockwise_edges[polyhedron->clockwise_edges[edge]] };\n\t\t\t\t\t\t\t\tconst k3d::double_t vertex_weights[3] = { 0.25, 0.5, 0.25 };\n\t\t\t\t\t\t\t\tvertex_attributes.push_back(3, vertex_indices, vertex_weights);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tremove_faces[face] = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MIDPOINTS:\n\t\t\t\t{\n\t\t\t\t\t// Generate adjacent-edge lookups ...\n\t\t\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\t\t\tk3d::mesh::indices_t adjacent_edges;\n\t\t\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\n\t\t\t\t\t// Keep track of newly-created edge midpoints ...\n\t\t\t\t\tstd::vector<boost::optional<k3d::uint_t> > edge_midpoints(polyhedron->clockwise_edges.size());\n\t\n\t\t\t\t\t// For each selected face ...\n\t\t\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!polyhedron->face_selections[face])\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[polyhedron->face_first_loops[face]];\n\n\t\t\t\t\t\t// Generate midpoints ...\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Don't create duplicate midpoints for adjacent edges ...\n\t\t\t\t\t\t\tif(!boundary_edges[edge] && edge_midpoints[adjacent_edges[edge]])\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tedge_midpoints[edge] = edge_midpoints[adjacent_edges[edge]];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tedge_midpoints[edge] = points.size();\n\n\t\t\t\t\t\t\t\tpoints.push_back(k3d::mix(points[polyhedron->vertex_points[edge]], points[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]], 0.5));\n\t\t\t\t\t\t\t\tpoint_selection.push_back(0);\n\t\t\t\t\t\t\t\tconst k3d::uint_t point_indices[2] = { polyhedron->vertex_points[edge], polyhedron->vertex_points[polyhedron->clockwise_edges[edge]] };\n\t\t\t\t\t\t\t\tconst k3d::double_t point_weights[2] = { 0.5, 0.5 };\n\t\t\t\t\t\t\t\tpoint_attributes.push_back(2, point_indices, point_weights);\n\t\t\t\t\t\t\t\tremove_points.push_back(false);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Generate new \"corner\" faces ...\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[face]);\n\t\t\t\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\t\t\t\tpolyhedron->face_selections.push_back(1);\n\t\t\t\t\t\t\tpolyhedron->face_materials.push_back(polyhedron->face_materials[face]);\n\t\t\t\t\t\t\tface_attributes.push_back(face);\n\n\t\t\t\t\t\t\tremove_faces.push_back(false);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\t\t\t\tremove_loops.push_back(false);\n\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() - 2);\n\n\t\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\n\t\t\t\t\t\t\tedge_attributes.push_back(edge);\n\t\t\t\t\t\t\tedge_attributes.push_back(polyhedron->clockwise_edges[edge]);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tconst k3d::uint_t edge_indices[2] = { edge, polyhedron->clockwise_edges[edge] };\n\t\t\t\t\t\t\tconst k3d::double_t edge_weights[2] = { 0.5, 0.5 };\n\t\t\t\t\t\t\tedge_attributes.push_back(2, edge_indices, edge_weights);\n\n\t\t\t\t\t\t\tremove_edges.push_back(false);\n\t\t\t\t\t\t\tremove_edges.push_back(false);\n\t\t\t\t\t\t\tremove_edges.push_back(false);\n\n\t\t\t\t\t\t\tpolyhedron->vertex_points.push_back(*edge_midpoints[edge]);\n\t\t\t\t\t\t\tpolyhedron->vertex_points.push_back(polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]);\n\t\t\t\t\t\t\tpolyhedron->vertex_points.push_back(*edge_midpoints[polyhedron->clockwise_edges[edge]]);\n\n\t\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\t\tconst k3d::uint_t vertex_indices[2] = { edge, polyhedron->clockwise_edges[edge] };\n\t\t\t\t\t\t\t\tconst k3d::double_t vertex_weights[2] = { 0.5, 0.5 };\t\n\t\t\t\t\t\t\t\tvertex_attributes.push_back(2, vertex_indices, vertex_weights);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\t\tvertex_attributes.push_back(polyhedron->clockwise_edges[edge]);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\t\tconst k3d::uint_t vertex_indices[2] = { polyhedron->clockwise_edges[edge], polyhedron->clockwise_edges[polyhedron->clockwise_edges[edge]] };\n\t\t\t\t\t\t\t\tconst k3d::double_t vertex_weights[2] = { 0.5, 0.5 };\n\t\t\t\t\t\t\t\tvertex_attributes.push_back(2, vertex_indices, vertex_weights);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Generate a new \"center\" face ...\n\t\t\t\t\t\tpolyhedron->face_shells.push_back(polyhedron->face_shells[face]);\n\t\t\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\t\t\tpolyhedron->face_selections.push_back(1);\n\t\t\t\t\t\tpolyhedron->face_materials.push_back(polyhedron->face_materials[face]);\n\t\t\t\t\t\tface_attributes.push_back(face);\n\n\t\t\t\t\t\tremove_faces.push_back(false);\n\t\t\t\t\t\n\t\t\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\t\t\tremove_loops.push_back(false);\n\n\t\t\t\t\t\tconst k3d::uint_t new_first_edge = polyhedron->clockwise_edges.size();\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\n\t\t\t\t\t\t\tconst k3d::uint_t edge_indices[2] = { edge, polyhedron->clockwise_edges[edge] };\n\t\t\t\t\t\t\tconst k3d::double_t edge_weights[2] = { 0.5, 0.5 };\n\t\t\t\t\t\t\tedge_attributes.push_back(2, edge_indices, edge_weights);\n\n\t\t\t\t\t\t\tremove_edges.push_back(false);\n\n\t\t\t\t\t\t\tpolyhedron->vertex_points.push_back(*edge_midpoints[edge]);\n\t\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\t\t\t\t\tconst k3d::uint_t vertex_indices[2] = { edge, polyhedron->clockwise_edges[edge] };\n\t\t\t\t\t\t\tconst k3d::double_t vertex_weights[2] = { 0.5, 0.5 };\t\n\t\t\t\t\t\t\tvertex_attributes.push_back(2, vertex_indices, vertex_weights);\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpolyhedron->clockwise_edges.back() = new_first_edge;\n\t\t\n\t\t\t\t\t\tremove_faces[face] = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Make it happen ...\n\t\t\tk3d::polyhedron::delete_components(Output, *polyhedron, remove_points, remove_edges, remove_loops, remove_faces);\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<subdivide_faces,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xb9d4d815, 0x241c473d, 0xa22d3523, 0x406fa390),\n\t\t\t\t\"SubdivideFaces\",\n\t\t\t\t\"Subdivides faces by creating new center / midpoints.\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttypedef enum\n\t{\n\t\tCENTER,\n\t\tCENTER_MIDPOINTS,\n\t\tMIDPOINTS,\n\t} subdivision_t;\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const subdivision_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase CENTER:\n\t\t\t\tStream << \"center\";\n\t\t\t\tbreak;\n\t\t\tcase CENTER_MIDPOINTS:\n\t\t\t\tStream << \"centermidpoints\";\n\t\t\t\tbreak;\n\t\t\tcase MIDPOINTS:\n\t\t\t\tStream << \"midpoints\";\n\t\t\t\tbreak;\n\t\t}\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator >> (std::istream& Stream, subdivision_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"center\")\n\t\t\tValue = CENTER;\n\t\telse if(text == \"centermidpoints\")\n\t\t\tValue = CENTER_MIDPOINTS;\n\t\telse if(text == \"midpoints\")\n\t\t\tValue = MIDPOINTS;\n\t\telse\n\t\t\tk3d::log() << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& subdivision_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Center\", \"center\", \"Joins each face vertex to face center; fun fact: produces triangles only\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Center-Midpoints\", \"centermidpoints\", \"Joins face center to each edge middle; innovative info: produces quads only\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Midpoints\", \"midpoints\", \"Joins contiguous edge midpoints; amusing anecdote: produces one triangle per original vertex, plus a polygon in the middle with as many edges as the original\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\nprivate:\n\tk3d_data(subdivision_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_subdivision_type;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// subdivide_faces_factory\n\nk3d::iplugin_factory& subdivide_faces_factory()\n{\n\treturn subdivide_faces::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron/triangulate_faces.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n */\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/table_copier.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nclass triangulate_faces :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\ttriangulate_faces(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t}\n\t\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Output, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\t\n\t\t\tprimitive->create(k3d::polyhedron::triangulate(Input, *polyhedron, Output));\n\t\t}\n\t}\n\t\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<triangulate_faces, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\tk3d::uuid(0x871ccafd, 0xc944da92, 0xcdf9f2b4, 0xcbc40cd8),\n\t\t\t\"TriangulateFaces\",\n\t\t\t_(\"Converts input faces into triangles\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// triangulate_faces_factory\n\nk3d::iplugin_factory& triangulate_faces_factory()\n{\n\treturn triangulate_faces::get_factory();\n}\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron_sources/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-polyhedron-sources)\nK3D_CREATE_MODULE_PROXY(k3d-polyhedron-sources)\n\n"
  },
  {
    "path": "modules/polyhedron_sources/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace sources\n{\n\nextern k3d::iplugin_factory& poly_cone_factory();\nextern k3d::iplugin_factory& poly_cube_factory();\nextern k3d::iplugin_factory& poly_cushion_factory();\nextern k3d::iplugin_factory& poly_cylinder_factory();\nextern k3d::iplugin_factory& poly_disk_factory();\nextern k3d::iplugin_factory& poly_grid_factory();\nextern k3d::iplugin_factory& poly_icosahedron_factory();\nextern k3d::iplugin_factory& poly_sphere_factory();\nextern k3d::iplugin_factory& poly_torus_factory();\n\n} // namespace sources\n\n} // namespace polyhedron\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::polyhedron::sources::poly_cone_factory());\n\tRegistry.register_factory(module::polyhedron::sources::poly_cube_factory());\n\tRegistry.register_factory(module::polyhedron::sources::poly_cushion_factory());\n\tRegistry.register_factory(module::polyhedron::sources::poly_cylinder_factory());\n\tRegistry.register_factory(module::polyhedron::sources::poly_disk_factory());\n\tRegistry.register_factory(module::polyhedron::sources::poly_grid_factory());\n\tRegistry.register_factory(module::polyhedron::sources::poly_icosahedron_factory());\n\tRegistry.register_factory(module::polyhedron::sources::poly_sphere_factory());\n\tRegistry.register_factory(module::polyhedron::sources::poly_torus_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/polyhedron_sources/poly_cone.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace sources\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_cone\n\nclass poly_cone :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tpoly_cone(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"U segments\")) + init_description(_(\"Columns\")) + init_value(32) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_segments(init_owner(*this) + init_name(\"v_segments\") + init_label(_(\"V segments\")) + init_description(_(\"Rows\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_bottom(init_owner(*this) + init_name(\"bottom\") + init_label(_(\"Bottom\")) + init_description(_(\"Cap cone bottom\")) + init_value(true)),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Bottom radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Z Max (RenderMan convention)\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_u_power(init_owner(*this) + init_name(\"u_power\") + init_label(_(\"U power\")) + init_description(_(\"Radial power\")) + init_value(1.0) + init_step_increment(0.1)),\n\t\tm_v_power(init_owner(*this) + init_name(\"v_power\") + init_label(_(\"V power\")) + init_description(_(\"Length power\")) + init_value(1.0) + init_step_increment(0.1))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_v_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_bottom.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_u_power.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_v_power.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\t\tconst k3d::bool_t bottom = m_bottom.pipeline_value();\n\n\t\t// Create the cone topology ...\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t\tk3d::polyhedron::add_cylinder(Output, *polyhedron, 0, v_segments, u_segments, material);\n\n\t\t// Ensure that the top of the cone is \"closed\" topologically ...\n\t\tpolyhedron->face_shells.push_back(0);\n\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\tpolyhedron->face_selections.push_back(0);\n\t\tpolyhedron->face_materials.push_back(material);\n\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\tfor(k3d::int32_t u = u_segments; u != 0; --u)\n\t\t{\n\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\tpolyhedron->vertex_points.push_back(u % u_segments);\n\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t}\n\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\n\t\t// Optionally close the bottom of the cone ...\n\t\tif(bottom)\n\t\t{\n\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\tpolyhedron->face_selections.push_back(0);\n\t\t\tpolyhedron->face_materials.push_back(material);\n\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\tconst k3d::uint_t offset = v_segments * u_segments;\n\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t{\n\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\t\tpolyhedron->vertex_points.push_back(offset + u);\n\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t}\n\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\t\t}\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tconst k3d::double_t height = m_height.pipeline_value();\n\t\tconst k3d::double_t u_power = m_u_power.pipeline_value();\n\t\tconst k3d::double_t v_power = m_v_power.pipeline_value();\n\t\tconst k3d::double_t inv_u_power = u_power ? 1.0 / u_power : 1.0;\n\n\t\tconst k3d::int32_t point_u_segments = u_segments;\n\t\tconst k3d::int32_t point_v_segments = v_segments + 1;\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\n\t\tk3d::uint_t point = 0;\n\t\tfor(k3d::int32_t v = 0; v != point_v_segments; ++v)\n\t\t{\n\t\t\tconst k3d::double_t percent = k3d::ratio(v, point_v_segments - 1);\n\t\t\tconst k3d::double_t varying_radius = k3d::mix(0.001 * radius, radius, percent);\n\n\t\t\tfor(k3d::int32_t u = 0; u != point_u_segments; ++u, ++point)\n\t\t\t{\n\t\t\t\tconst k3d::double_t theta = k3d::pi_times_2() * k3d::ratio(u, point_u_segments);\n\n\t\t\t\tk3d::double_t x = cos(theta);\n\t\t\t\tk3d::double_t y = -sin(theta);\n\t\t\t\tk3d::double_t z = k3d::mix(height, 0.0, std::pow(percent, v_power));\n\n\t\t\t\tx = varying_radius * k3d::sign(x) * std::pow(std::abs(x), inv_u_power);\n\t\t\t\ty = varying_radius * k3d::sign(y) * std::pow(std::abs(y), inv_u_power);\n\n\t\t\t\tpoints[point] = k3d::point3(x, y, z);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<poly_cone, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0x7c41b43f, 0x385143ab, 0x86969795, 0x368d6199),\n\t\t\t\"PolyCone\",\n\t\t\t_(\"Generates a polygonal cone with optional endcap\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_segments;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_bottom;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_u_power;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_v_power;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_cone_factory\n\nk3d::iplugin_factory& poly_cone_factory()\n{\n\treturn poly_cone::get_factory();\n}\n\n} // namespace sources\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron_sources/poly_cube.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@polytechnic.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace sources\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_cube\n\nclass poly_cube :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tpoly_cube(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_columns(init_owner(*this) + init_name(\"columns\") + init_label(_(\"Columns\")) + init_description(_(\"Column number (X axis)\")) + init_value(1) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_rows(init_owner(*this) + init_name(\"rows\") + init_label(_(\"Rows\")) + init_description(_(\"Row number (Y axis)\")) + init_value(1) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_slices(init_owner(*this) + init_name(\"slices\") + init_label(_(\"Slices\")) + init_description(_(\"Slice number (Z axis)\")) + init_value(1) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Cube width\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Cube height\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_depth(init_owner(*this) + init_name(\"depth\") + init_label(_(\"Depth\")) + init_description(_(\"Cube depth\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_rows.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_columns.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_slices.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_depth.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::int32_t rows = m_rows.pipeline_value();\n\t\tconst k3d::int32_t columns = m_columns.pipeline_value();\n\t\tconst k3d::int32_t slices = m_slices.pipeline_value();\n\n\t\tconst k3d::int32_t point_columns = columns + 1;\n\t\tconst k3d::int32_t point_slices = slices + 1;\n\n\t\tconst k3d::int32_t circumference = 2 * (rows + columns);\n\t\tconst k3d::int32_t cylinder_point_count = point_slices * circumference;\n\t\tconst k3d::int32_t cap_point_count = (rows - 1) * (columns - 1);\n\n\t\t// We model a cube as a cylinder ...\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t\tk3d::polyhedron::add_cylinder(Output, *polyhedron, 0, slices, circumference, material);\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\n\t\t// Create the cube \"top\" points ...\n\t\tpoints.insert(points.end(), cap_point_count, k3d::point3());\n\t\tpoint_selection.insert(point_selection.end(), cap_point_count, 0);\n\n\t\t// Create a lookup table to simplify creating the \"top\" faces ...\n\t\tk3d::mesh::indices_t top_map;\n\t\tfor(k3d::int32_t column = 0; column != point_columns; ++column)\n\t\t\ttop_map.push_back(columns - column);\n\n\t\tfor(k3d::int32_t row = 1; row != rows; ++row)\n\t\t{\n\t\t\ttop_map.push_back(columns + row);\n\n\t\t\tfor(k3d::int32_t column = 1; column != columns; ++column)\n\t\t\t\ttop_map.push_back(cylinder_point_count + ((row - 1) * (columns - 1)) + (column - 1));\n\n\t\t\ttop_map.push_back(circumference - row);\n\t\t}\n\n\t\tfor(k3d::int32_t column = 0; column != point_columns; ++column)\n\t\t\ttop_map.push_back(column + columns + rows);\n\n\t\t// Create the \"top\" faces ...\n\t\tfor(k3d::int32_t row = 0; row != rows; ++row)\n\t\t{\n\t\t\tfor(k3d::int32_t column = 0; column != columns; ++column)\n\t\t\t{\n\t\t\t\tk3d::polyhedron::add_quadrilateral(\n\t\t\t\t\tOutput,\n\t\t\t\t\t*polyhedron,\n\t\t\t\t\t0,\n\t\t\t\t\ttop_map[(row + 0) * point_columns + (column + 0)],\n\t\t\t\t\ttop_map[(row + 0) * point_columns + (column + 1)],\n\t\t\t\t\ttop_map[(row + 1) * point_columns + (column + 1)],\n\t\t\t\t\ttop_map[(row + 1) * point_columns + (column + 0)],\n\t\t\t\t\tmaterial);\n\t\t\t}\n\t\t}\n\n\t\t// Create the cube \"bottom\" points ...\n\t\tpoints.insert(points.end(), cap_point_count, k3d::point3());\n\t\tpoint_selection.insert(point_selection.end(), cap_point_count, 0);\n\n\t\t// Create a lookup table to simplify creating the \"bottom\" faces ...\n\t\tk3d::mesh::indices_t bottom_map;\n\t\tfor(k3d::int32_t column = 0; column != point_columns; ++column)\n\t\t\tbottom_map.push_back((slices * circumference) + column);\n\n\t\tfor(k3d::int32_t row = 1; row != rows; ++row)\n\t\t{\n\t\t\tbottom_map.push_back((slices * circumference) + circumference - row);\n\n\t\t\tfor(k3d::int32_t column = 1; column != columns; ++column)\n\t\t\t\tbottom_map.push_back(cylinder_point_count + cap_point_count + ((row - 1) * (columns - 1)) + (column - 1));\n\n\t\t\tbottom_map.push_back((slices * circumference) + columns + row);\n\t\t}\n\n\t\tfor(k3d::int32_t column = 0; column != point_columns; ++column)\n\t\t\tbottom_map.push_back((slices * circumference) + columns + rows + columns - column);\n\n\t\t// Create the \"bottom\" faces ...\n\t\tfor(k3d::int32_t row = 0; row != rows; ++row)\n\t\t{\n\t\t\tfor(k3d::int32_t column = 0; column != columns; ++column)\n\t\t\t{\n\t\t\t\tk3d::polyhedron::add_quadrilateral(\n\t\t\t\t\tOutput,\n\t\t\t\t\t*polyhedron,\n\t\t\t\t\t0,\n\t\t\t\t\tbottom_map[(row + 0) * point_columns + (column + 0)],\n\t\t\t\t\tbottom_map[(row + 0) * point_columns + (column + 1)],\n\t\t\t\t\tbottom_map[(row + 1) * point_columns + (column + 1)],\n\t\t\t\t\tbottom_map[(row + 1) * point_columns + (column + 0)],\n\t\t\t\t\tmaterial);\n\t\t\t}\n\t\t}\n\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t rows = m_rows.pipeline_value();\n\t\tconst k3d::int32_t columns = m_columns.pipeline_value();\n\t\tconst k3d::int32_t slices = m_slices.pipeline_value();\n\t\tconst k3d::double_t width = m_width.pipeline_value();\n\t\tconst k3d::double_t height = m_height.pipeline_value();\n\t\tconst k3d::double_t depth = m_depth.pipeline_value();\n\n\t\tconst k3d::int32_t circumference = 2 * (rows + columns);\n\t\tconst k3d::int32_t cylinder_point_count = (slices + 1) * circumference;\n\t\tconst k3d::int32_t cap_point_count = (rows - 1) * (columns - 1);\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\n\t\t// Create a mapping from an index around the \"circumference\" of the cube to point coordinates\n\t\tk3d::mesh::points_t square_map;\n\t\tfor(k3d::int32_t i = 0; i != columns; ++i)\n\t\t{\n\t\t\tsquare_map.push_back(\n\t\t\t\tk3d::point3(k3d::mix(-width/2, width/2, k3d::ratio(i, columns)), height/2, 0));\n\t\t}\n\t\tfor(k3d::int32_t i = 0; i != rows; ++i)\n\t\t{\n\t\t\tsquare_map.push_back(\n\t\t\t\tk3d::point3(width/2, k3d::mix(height/2, -height/2, k3d::ratio(i, rows)), 0));\n\t\t}\n\t\tfor(k3d::int32_t i = 0; i != columns; ++i)\n\t\t{\n\t\t\tsquare_map.push_back(\n\t\t\t\tk3d::point3(k3d::mix(width/2, -width/2, k3d::ratio(i, columns)), -height/2, 0));\n\t\t}\n\t\tfor(k3d::int32_t i = 0; i != rows; ++i)\n\t\t{\n\t\t\tsquare_map.push_back(\n\t\t\t\tk3d::point3(-width/2, k3d::mix(-height/2, height/2, k3d::ratio(i, rows)), 0));\n\t\t}\n\n\t\t// Assign coordinates to the \"body\" of the cube ...\n\t\tfor(k3d::int32_t i = 0; i <= slices; ++i)\n\t\t{\n\t\t\tconst k3d::vector3 offset(0, 0, k3d::mix(depth/2, -depth/2, k3d::ratio(i, slices)));\n\t\t\tfor(k3d::int32_t j = 0; j != circumference; ++j)\n\t\t\t{\n\t\t\t\tpoints[(i * circumference) + j] = offset + square_map[j];\n\t\t\t}\n\t\t}\n\n\t\t// Assign coordinates to the top of the cube ...\n\t\tfor(k3d::int32_t row = 1; row < rows; ++row)\n\t\t{\n\t\t\tfor(k3d::int32_t column = 1; column < columns; ++column)\n\t\t\t{\n\t\t\t\tpoints[cylinder_point_count + ((row - 1) * (columns - 1)) + (column - 1)] =\n\t\t\t\t\tk3d::point3(\n\t\t\t\t\t\tk3d::mix(width/2, -width/2, k3d::ratio(column, columns)),\n\t\t\t\t\t\tk3d::mix(height/2, -height/2, k3d::ratio(row, rows)),\n\t\t\t\t\t\tdepth/2);\n\t\t\t}\n\t\t}\n\n\t\t// Assign coordinates to the bottom of the cube ...\n\t\tfor(k3d::int32_t row = 1; row < rows; ++row)\n\t\t{\n\t\t\tfor(k3d::int32_t column = 1; column < columns; ++column)\n\t\t\t{\n\t\t\t\tpoints[cylinder_point_count + cap_point_count + ((row - 1) * (columns - 1)) + (column - 1)] =\n\t\t\t\t\tk3d::point3(\n\t\t\t\t\t\tk3d::mix(-width/2, width/2, k3d::ratio(column, columns)),\n\t\t\t\t\t\tk3d::mix(height/2, -height/2, k3d::ratio(row, rows)),\n\t\t\t\t\t\t-depth/2);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<poly_cube, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0x7ec966d1, 0xd78a445c, 0x8806b8a3, 0x5593f241),\n\t\t\t\"PolyCube\",\n\t\t\t_(\"Generates a polygonal cube\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_columns;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_rows;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_slices;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_depth;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_cube_factory\n\nk3d::iplugin_factory& poly_cube_factory()\n{\n\treturn poly_cube::get_factory();\n}\n\n} // namespace sources\n\n} // namespace polyhedron\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/polyhedron_sources/poly_cushion.cpp",
    "content": "// K-3D\n// Copyright (c) 2002-2005, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace sources\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_cushion\n\nclass poly_cushion :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tpoly_cushion(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_length_segments(init_owner(*this) + init_name(\"length_segments\") + init_label(_(\"Length segments\")) + init_description(_(\"Length segments\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_radial_segments(init_owner(*this) + init_name(\"radial_segments\") + init_label(_(\"Radial segments\")) + init_description(_(\"Radial segments\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_diameter(init_owner(*this) + init_name(\"diameter\") + init_label(_(\"Diameter\")) + init_description(_(\"Rounded parts diameter\")) + init_value(4.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Original cube width\")) + init_value(8.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Original cube height\")) + init_value(8.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_depth(init_owner(*this) + init_name(\"depth\") + init_label(_(\"Depth\")) + init_description(_(\"Original cube depth\")) + init_value(8.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_length_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_radial_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_diameter.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_depth.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid add_point(k3d::mesh::points_t& Points, k3d::mesh::selection_t& PointSelection, const k3d::point3& Position)\n\t{\n\t\tPoints.push_back(Position);\n\t\tPointSelection.push_back(0);\n\t}\n\n\tvoid add_face(k3d::mesh& Mesh, k3d::polyhedron::primitive& Polyhedron, const unsigned long v1, const unsigned long v2, const unsigned long v3, k3d::imaterial* const Material)\n\t{\n\t\tk3d::polyhedron::add_triangle(Mesh, Polyhedron, 0, v1, v2, v3, Material);\n\t}\n\n\tvoid add_face(k3d::mesh& Mesh, k3d::polyhedron::primitive& Polyhedron, const unsigned long v1, const unsigned long v2, const unsigned long v3, const unsigned long v4, k3d::imaterial* const Material)\n\t{\n\t\tk3d::polyhedron::add_quadrilateral(Mesh, Polyhedron, 0, v1, v2, v3, v4, Material);\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst unsigned long length_segments = m_length_segments.pipeline_value();\n\t\tconst unsigned long radial_segments = m_radial_segments.pipeline_value();\n\t\tconst k3d::double_t diameter = m_diameter.pipeline_value();\n\t\tconst k3d::double_t width = m_width.pipeline_value();\n\t\tconst k3d::double_t height = m_height.pipeline_value();\n\t\tconst k3d::double_t depth = m_depth.pipeline_value();\n\n\t\t// Build a sphere\n\t\ttypedef std::vector<k3d::point3> points_t;\n\t\tpoints_t sphere_points;\n\n\t\tconst unsigned long N = length_segments*4;\n\t\tconst unsigned long R = radial_segments*2-1;\n\n\t\tunsigned long i, j;\n\n\t\tfor(j = 0; j < N; j++)\n\t\t\tfor(i = 0; i < R; i++)\n\t\t\t{\n\t\t\t\tk3d::double_t l = sin(k3d::pi()/2 -(k3d::double_t)(i+1)*k3d::pi() / (k3d::double_t)(R+1))*diameter/2;\n\t\t\t\tk3d::double_t r = sqrt(diameter*diameter/4 - l*l);\n\n\t\t\t\tsphere_points.push_back(k3d::point3( r*sin((k3d::double_t)j*2*k3d::pi() / (k3d::double_t)N), l, r*cos((k3d::double_t)j*2*k3d::pi() / (k3d::double_t)N)));\n\t\t\t}\n\t\tsphere_points.push_back(k3d::point3(0, diameter/2, 0));\n\t\tsphere_points.push_back(k3d::point3(0, -diameter/2, 0));\n\n\t\t// Cut sphere into 8 parts (cushion corners)\n\t\tconst unsigned long c = (R+1)/2;\n\n\t\tk3d::point3 tP = k3d::point3(width / 2.0, height / 2.0, depth / 2.0);\n\t\tfor(j = 0; j < N / 4+1; j++)\n\t\t\tfor(i = 0; i < c; i++)\n\t\t\t\tadd_point(points, point_selection, sphere_points[R == 1 ? j : j*R+i] + tP);\n\n\t\tadd_point(points, point_selection, sphere_points[N*R] + tP);\n\n\t\ttP = k3d::point3(width / 2.0, -height / 2.0, depth / 2.0);\n\t\tfor(j = 0; j < N / 4+1; j++)\n\t\t\tfor(i = 0; i < c; i++)\n\t\t\t\tadd_point(points, point_selection, sphere_points[R / 2 +(R == 1 ? j : j*R+i)] + tP);\n\n\t\tadd_point(points, point_selection, sphere_points[N*R+1] + tP);\n\n\t\ttP = k3d::point3(width / 2.0, height / 2.0, -depth / 2.0);\n\t\tfor(j = N / 4; j < N / 2+1; j++)\n\t\t\tfor(i = 0; i < c; i++)\n\t\t\t\tadd_point(points, point_selection, sphere_points[R == 1 ? j : j*R+i] + tP);\n\n\t\tadd_point(points, point_selection, sphere_points[N*R] + tP);\n\n\t\ttP = k3d::point3(width / 2.0, -height / 2.0, -depth / 2.0);\n\t\tfor(j = N / 4; j < N / 2+1; j++)\n\t\t\tfor(i = 0; i < c; i++)\n\t\t\t\tadd_point(points, point_selection, sphere_points[R / 2 +(R == 1 ? j : j*R+i)] + tP);\n\n\t\tadd_point(points, point_selection, sphere_points[N*R+1] + tP);\n\n\t\ttP = k3d::point3(-width / 2.0, height / 2.0, -depth / 2.0);\n\t\tfor(j = N / 2; j < 3*N / 4+1; j++)\n\t\t\tfor(i = 0; i < c; i++)\n\t\t\t\tadd_point(points, point_selection, sphere_points[R == 1 ? j : j*R+i] + tP);\n\n\t\tadd_point(points, point_selection, sphere_points[N*R] + tP);\n\n\t\ttP = k3d::point3(-width / 2.0, -height / 2.0, -depth / 2.0);\n\t\tfor(j = N / 2; j < 3*N / 4+1; j++)\n\t\t\tfor(i = 0; i < c; i++)\n\t\t\t\tadd_point(points, point_selection, sphere_points[R / 2 +(R == 1 ? j : j*R+i)] + tP);\n\n\t\tadd_point(points, point_selection, sphere_points[N*R+1] + tP);\n\n\t\ttP = k3d::point3(-width / 2.0, height / 2.0, depth / 2.0);\n\t\tfor(j = 3*N / 4; j <= N; j++)\n\t\t\tfor(i = 0; i < c; i++)\n\t\t\t\tadd_point(points, point_selection, sphere_points[R == 1 ? j % N :(j % N)*R+i] + tP);\n\n\t\tadd_point(points, point_selection, sphere_points[N*R] + tP);\n\n\t\ttP = k3d::point3(-width / 2.0, -height / 2.0, depth / 2.0);\n\t\tfor(j = 3*N / 4; j <= N; j++)\n\t\t\tfor(i = 0; i < c; i++)\n\t\t\t\tadd_point(points, point_selection, sphere_points[R / 2 +(R == 1 ? j % N :(j % N)*R+i)] + tP);\n\n\t\tadd_point(points, point_selection, sphere_points[N*R+1] + tP);\n\n\t\t// Make faces for sphere parts\n\t\tconst unsigned long d = c*(N/4+1)+1;\n\n\t\tfor(unsigned long n = 0; n < 8; n++)\n\t\t{\n\t\t\tfor(j = 0; j < N / 4; j++)\n\t\t\t\tfor(i = 0; i < c-1; i++)\n\t\t\t\t\tadd_face(Output, *polyhedron, n*d + c*j + i, n*d + c*j + i+1, n*d + c*(j+1) + i+1, n*d + c*(j+1) + i, material);\n\n\t\t\tfor(j = 0; j < N / 4; j ++)\n\t\t\t\tif(n % 2 == 0)\n\t\t\t\t\tadd_face(Output, *polyhedron, n*d + c*j, n*d + c*(j+1), (n+1) * d - 1, material);\n\t\t\t\telse\n\t\t\t\t\tadd_face(Output, *polyhedron, n*d + c*(j+1) - 1, (n+1) * d - 1, n*d + c*(j+2) - 1, material);\n\t\t}\n\n\t\t// Link parts\n\t\tfor(unsigned long n = 0; n < 8; n++)\n\t\t{\n\t\t\tconst unsigned long e = (n+1)*d - c-1;\n\t\t\tconst unsigned long f = ((n+2) % 8)*d;\n\n\t\t\tfor(j = 0; j < c-1; j++)\n\t\t\t\tadd_face(Output, *polyhedron, e+j, e+j+1, f+j+1, f+j, material);\n\t\t}\n\n\t\tadd_face(Output, *polyhedron, 0, d - 1, 7*d - 1, 7*d - c-1, material);\n\t\tadd_face(Output, *polyhedron, d - c-1, 2*d, 3*d - 1, d - 1, material);\n\t\tadd_face(Output, *polyhedron, 3*d - c-1, 4*d, 5*d - 1, 3*d - 1, material);\n\t\tadd_face(Output, *polyhedron, 5*d - c-1, 6*d, 7*d - 1, 5*d - 1, material);\n\n\t\tadd_face(Output, *polyhedron, d + c-1, 8*d - 2, 8*d - 1, 2*d - 1, material);\n\t\tadd_face(Output, *polyhedron, 2*d - 2, 2*d - 1, 4*d - 1, 3*d + c-1, material);\n\t\tadd_face(Output, *polyhedron, 4*d - 2, 4*d - 1, 6*d - 1, 5*d + c-1, material);\n\t\tadd_face(Output, *polyhedron, 6*d - 2, 6*d - 1, 8*d - 1, 7*d + c-1, material);\n\n\n\t\tfor(unsigned long n = 0; n < 4; n++)\n\t\t{\n\t\t\tconst unsigned long e = d*(n*2) + c-1;\n\t\t\tconst unsigned long f = d*(n*2+1);\n\n\t\t\tfor(j = 0; j < N / 4; j++)\n\t\t\t\tadd_face(Output, *polyhedron, e+j*c, f+j*c, f+(j+1)*c, e+(j+1)*c, material);\n\t\t}\n\n\t\tadd_face(Output, *polyhedron, c-1, d*7 - 2, d*8 - c-1, d, material);\n\t\tadd_face(Output, *polyhedron, d-2, d*2 - c-1, d*3, d*2 + c-1, material);\n\t\tadd_face(Output, *polyhedron, d*3 - 2, d*4 - c-1, d*5, d*4 + c-1, material);\n\t\tadd_face(Output, *polyhedron, d*5 - 2, d*6 - c-1, d*7, d*6 + c-1, material);\n\n\t\tadd_face(Output, *polyhedron, d-1, d*3 - 1, d*5 - 1, d*7 - 1, material);\n\t\tadd_face(Output, *polyhedron, d*2 - 1, d*8 - 1, d*6 - 1, d*4 - 1, material);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<poly_cushion, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0xc11b963d, 0x108d471c, 0xa3826195, 0x821116b0),\n\t\t\t\"PolyCushion\",\n\t\t\t_(\"Generates a polygonal cushion (a cube with rounded edges)\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_length_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_radial_segments;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_diameter;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_depth;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_cushion_factory\n\nk3d::iplugin_factory& poly_cushion_factory()\n{\n\treturn poly_cushion::get_factory();\n}\n\n} // namespace sources\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron_sources/poly_cylinder.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace sources\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_cylinder\n\nclass poly_cylinder :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tpoly_cylinder(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"U segments\")) + init_description(_(\"Columns\")) + init_value(32) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_segments(init_owner(*this) + init_name(\"v_segments\") + init_label(_(\"V segments\")) + init_description(_(\"Rows\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_top(init_owner(*this) + init_name(\"top\") + init_label(_(\"Top\")) + init_description(_(\"Cap cylinder top\")) + init_value(true)),\n\t\tm_bottom(init_owner(*this) + init_name(\"bottom\") + init_label(_(\"Bottom\")) + init_description(_(\"Cap cylinder bottom\")) + init_value(true)),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Cylinder radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_zmax(init_owner(*this) + init_name(\"zmax\") + init_label(_(\"Z max\")) + init_description(_(\"Z max (RenderMan convention)\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_zmin(init_owner(*this) + init_name(\"zmin\") + init_label(_(\"Z min\")) + init_description(_(\"Z min (RenderMan convention)\")) + init_value(-5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_u_power(init_owner(*this) + init_name(\"u_power\") + init_label(_(\"U power\")) + init_description(_(\"Radial power\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_top_segments(init_owner(*this) + init_name(\"top_segments\") + init_label(_(\"Top segments\")) + init_description(_(\"0 : single face, >= 1 : segments\")) + init_value(0) + init_constraint(constraint::minimum<k3d::int32_t>(0)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_bottom_segments(init_owner(*this) + init_name(\"bottom_segments\") + init_label(_(\"Bottom segments\")) + init_description(_(\"0 : single face, >= 1 : segments\")) + init_value(0) + init_constraint(constraint::minimum<k3d::int32_t>(0)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_v_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_top.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_bottom.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_zmax.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_zmin.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_power.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_top_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_bottom_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tconst k3d::double_t zmax = m_zmax.pipeline_value();\n\t\tconst k3d::double_t zmin = m_zmin.pipeline_value();\n\t\tconst k3d::double_t u_power = m_u_power.pipeline_value();\n\t\tconst k3d::double_t inv_u_power = u_power ? 1.0 / u_power : 1.0;\n\t\tconst k3d::bool_t top = m_top.pipeline_value();\n\t\tconst k3d::bool_t bottom = m_bottom.pipeline_value();\n\t\tconst k3d::int32_t top_segments = m_top_segments.pipeline_value();\n\t\tconst k3d::int32_t bottom_segments = m_bottom_segments.pipeline_value();\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t\tk3d::polyhedron::add_cylinder(Output, *polyhedron, 0, v_segments, u_segments, material);\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\n\t\t// Shape the cylinder points\n\t\tfor(k3d::int32_t v = 0; v <= v_segments; ++v)\n\t\t{\n\t\t\tconst k3d::double_t height = k3d::ratio(v, v_segments);\n\n\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t{\n\t\t\t\tconst k3d::double_t theta = k3d::pi_times_2() * k3d::ratio(u, u_segments);\n\n\t\t\t\tk3d::double_t x = cos(theta);\n\t\t\t\tk3d::double_t y = -sin(theta);\n\t\t\t\tk3d::double_t z = k3d::mix(zmax, zmin, height);\n\n\t\t\t\tx = radius * k3d::sign(x) * std::pow(std::abs(x), inv_u_power);\n\t\t\t\ty = radius * k3d::sign(y) * std::pow(std::abs(y), inv_u_power);\n\n\t\t\t\tpoints[v * u_segments + u] = k3d::point3(x, y, z);\n\t\t\t}\n\t\t}\n\n\t\tconst k3d::uint_t top_rim_offset = 0;\n\t\tconst k3d::uint_t bottom_rim_offset = v_segments * u_segments;\n\n\t\t// Optionally cap the top of the cylinder ...\n\t\tif(top)\n\t\t{\n\t\t\tif(!top_segments)\n\t\t\t{\n\t\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\tpolyhedron->face_selections.push_back(0);\n\t\t\t\tpolyhedron->face_materials.push_back(material);\n\n\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\n\t\t\t\t\tpolyhedron->vertex_points.push_back((u_segments - u) % u_segments);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t}\n\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst k3d::uint_t middle_point_index = points.size();\n\t\t\t\tconst k3d::point3 middle_point(0, 0, zmax);\n\t\t\t\tpoints.push_back(middle_point);\n\t\t\t\tpoint_selection.push_back(0);\n\n\t\t\t\t// Create segment quads\n\t\t\t\tk3d::uint_t last_ring_point_offset = 0;\n\t\t\t\tk3d::uint_t current_ring_point_offset = 0;\n\t\t\t\tfor(k3d::int32_t n = top_segments; n > 1; --n)\n\t\t\t\t{\n\t\t\t\t\tcurrent_ring_point_offset = points.size();\n\t\t\t\t\tconst k3d::double_t factor = k3d::ratio(n - 1, top_segments);\n\t\t\t\t\tfor(k3d::int32_t u = 0; u < u_segments; ++u)\n\t\t\t\t\t{\n\t\t\t\t\t\tpoints.push_back(middle_point + factor * (points[u] - middle_point));\n\t\t\t\t\t\tpoint_selection.push_back(0);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor(k3d::int32_t u = 0; u < u_segments; ++u)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::polyhedron::add_quadrilateral(\n\t\t\t\t\t\t\tOutput,\n\t\t\t\t\t\t\t*polyhedron,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tlast_ring_point_offset + (u + 1) % u_segments,\n\t\t\t\t\t\t\tlast_ring_point_offset + (u + 0) % u_segments,\n\t\t\t\t\t\t\tcurrent_ring_point_offset + (u + 0) % u_segments,\n\t\t\t\t\t\t\tcurrent_ring_point_offset + (u + 1) % u_segments,\n\t\t\t\t\t\t\tmaterial);\n\t\t\t\t\t}\n\n\t\t\t\t\tlast_ring_point_offset = current_ring_point_offset;\n\t\t\t\t}\n\n\t\t\t\t// Create middle triangle fan\n\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t{\n\t\t\t\t\tk3d::polyhedron::add_triangle(\n\t\t\t\t\t\tOutput,\n\t\t\t\t\t\t*polyhedron,\n\t\t\t\t\t\t0, \n\t\t\t\t\t\tcurrent_ring_point_offset + (u + 1) % u_segments,\n\t\t\t\t\t\tcurrent_ring_point_offset + (u + 0) % u_segments,\n\t\t\t\t\t\tmiddle_point_index,\n\t\t\t\t\t\tmaterial);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Optionally cap the bottom of the cylinder ...\n\t\tif(bottom)\n\t\t{\n\t\t\tif(!bottom_segments)\n\t\t\t{\n\t\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\tpolyhedron->face_selections.push_back(0);\n\t\t\t\tpolyhedron->face_materials.push_back(material);\n\n\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\n\t\t\t\t\tpolyhedron->vertex_points.push_back(bottom_rim_offset + u);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t}\n\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst k3d::uint_t middle_point_index = points.size();\n\t\t\t\tconst k3d::point3 middle_point(0, 0, zmin);\n\t\t\t\tpoints.push_back(middle_point);\n\t\t\t\tpoint_selection.push_back(0);\n\n\t\t\t\t// Create segment quads\n\t\t\t\tk3d::uint_t last_ring_point_offset = v_segments * u_segments;\n\t\t\t\tk3d::uint_t current_ring_point_offset = v_segments * u_segments;\n\t\t\t\tfor(k3d::int32_t n = bottom_segments; n > 1; --n)\n\t\t\t\t{\n\t\t\t\t\tcurrent_ring_point_offset = points.size();\n\t\t\t\t\tconst k3d::double_t factor = k3d::ratio(n - 1, bottom_segments);\n\t\t\t\t\tfor(k3d::int32_t u = 0; u < u_segments; ++u)\n\t\t\t\t\t{\n\t\t\t\t\t\tpoints.push_back(middle_point + factor * (points[(v_segments * u_segments) + u] - middle_point));\n\t\t\t\t\t\tpoint_selection.push_back(0);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor(k3d::int32_t u = 0; u < u_segments; ++u)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::polyhedron::add_quadrilateral(\n\t\t\t\t\t\t\tOutput,\n\t\t\t\t\t\t\t*polyhedron,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tlast_ring_point_offset + (u + 0) % u_segments,\n\t\t\t\t\t\t\tlast_ring_point_offset + (u + 1) % u_segments,\n\t\t\t\t\t\t\tcurrent_ring_point_offset + (u + 1) % u_segments,\n\t\t\t\t\t\t\tcurrent_ring_point_offset + (u + 0) % u_segments,\n\t\t\t\t\t\t\tmaterial);\n\t\t\t\t\t}\n\n\t\t\t\t\tlast_ring_point_offset = current_ring_point_offset;\n\t\t\t\t}\n\n\t\t\t\t// Create middle triangle fan\n\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t{\n\t\t\t\t\tk3d::polyhedron::add_triangle(\n\t\t\t\t\t\tOutput,\n\t\t\t\t\t\t*polyhedron,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tcurrent_ring_point_offset + (u + 0) % u_segments,\n\t\t\t\t\t\tcurrent_ring_point_offset + (u + 1) % u_segments,\n\t\t\t\t\t\tmiddle_point_index,\n\t\t\t\t\t\tmaterial);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<poly_cylinder, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0xd8c4d9fd, 0x42334a54, 0xa4b48185, 0xd8506489),\n\t\t\t\"PolyCylinder\",\n\t\t\t_(\"Generates a polygonal cylinder with optional endcaps\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_segments;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_top;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_bottom;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_zmax;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_zmin;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_u_power;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_top_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_bottom_segments;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_cylinder_factory\n\nk3d::iplugin_factory& poly_cylinder_factory()\n{\n\treturn poly_cylinder::get_factory();\n}\n\n} // namespace sources\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron_sources/poly_disk.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace sources\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_disk\n\nclass poly_disk :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tpoly_disk(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"u_segments\")) + init_description(_(\"Radial Segments\")) + init_value(16) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_segments(init_owner(*this) + init_name(\"v_segments\") + init_label(_(\"v_segments\")) + init_description(_(\"Radial Segments\")) + init_value(2) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"radius\")) + init_description(_(\"Radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"height\")) + init_description(_(\"Height\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_v_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t\tk3d::polyhedron::add_cylinder(Output, *polyhedron, 0, v_segments, u_segments, material);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tconst k3d::double_t height = m_height.pipeline_value();\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\n\t\tk3d::uint_t point = 0;\n\t\tfor(k3d::int32_t v = 0; v <= v_segments; ++v)\n\t\t{\n\t\t\tconst k3d::double_t ring = k3d::ratio(v, v_segments);\n\n\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u, ++point)\n\t\t\t{\n\t\t\t\tconst k3d::double_t theta = k3d::pi_times_2() * k3d::ratio(u, u_segments);\n\n\t\t\t\tk3d::double_t x = cos(theta);\n\t\t\t\tk3d::double_t y = -sin(theta);\n\t\t\t\tk3d::double_t z = height;\n\n\t\t\t\tx = radius * ring * x;\n\t\t\t\ty = radius * ring * y;\n\n\t\t\t\tpoints[point] = k3d::point3(x, y, z);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<poly_disk, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0xbfe3e783, 0x2a7a4f51, 0xb696858a, 0xb41d794f),\n\t\t\t\"PolyDisk\",\n\t\t\t_(\"Generates a polygonal disk\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_segments;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_disk_factory\n\nk3d::iplugin_factory& poly_disk_factory()\n{\n\treturn poly_disk::get_factory();\n}\n\n} // namespace sources\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron_sources/poly_grid.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/axis.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <iterator>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace sources\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_grid\n\nclass poly_grid :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tpoly_grid(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_columns(init_owner(*this) + init_name(\"columns\") + init_label(_(\"Columns\")) + init_description(_(\"Column number\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_rows(init_owner(*this) + init_name(\"rows\") + init_label(_(\"Rows\")) + init_description(_(\"Row number\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Grid width\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Grid height\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_orientation(init_owner(*this) + init_name(\"orientation\") + init_label(_(\"Orientation\")) + init_description(_(\"Orientation type (forward or backward along X, Y or Z axis)\")) + init_value(k3d::PZ) + init_enumeration(k3d::signed_axis_values()))\n\t{\n\t\tm_columns.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_rows.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_orientation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t\tk3d::polyhedron::add_grid(Output, *polyhedron, 0, m_rows.pipeline_value(), m_columns.pipeline_value(), m_material.pipeline_value());\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t point_rows = m_rows.pipeline_value() + 1;\n\t\tconst k3d::int32_t point_columns = m_columns.pipeline_value() + 1;\n\t\tconst k3d::double_t width = m_width.pipeline_value();\n\t\tconst k3d::double_t height = m_height.pipeline_value();\n\t\tconst k3d::signed_axis orientation = m_orientation.pipeline_value();\n\n\t\tk3d::vector3 x, y;\n\t\tswitch(orientation)\n\t\t{\n\t\t\tcase k3d::PX:\n\t\t\t\tx = k3d::vector3(0, -width, 0);\n\t\t\t\ty = k3d::vector3(0, 0, height);\n\t\t\t\tbreak;\n\t\t\tcase k3d::NX:\n\t\t\t\tx = k3d::vector3(0, width, 0);\n\t\t\t\ty = k3d::vector3(0, 0, height);\n\t\t\t\tbreak;\n\t\t\tcase k3d::NY:\n\t\t\t\tx = k3d::vector3(-width, 0, 0);\n\t\t\t\ty = k3d::vector3(0, 0, height);\n\t\t\t\tbreak;\n\t\t\tcase k3d::PY:\n\t\t\t\tx = k3d::vector3(width, 0, 0);\n\t\t\t\ty = k3d::vector3(0, 0, height);\n\t\t\t\tbreak;\n\t\t\tcase k3d::PZ:\n\t\t\t\tx = k3d::vector3(-width, 0, 0);\n\t\t\t\ty = k3d::vector3(0, height, 0);\n\t\t\t\tbreak;\n\t\t\tcase k3d::NZ:\n\t\t\t\tx = k3d::vector3(width, 0, 0);\n\t\t\t\ty = k3d::vector3(0, height, 0);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tk3d::mesh::points_t::iterator point = const_cast<k3d::mesh::points_t&>(*Output.points).begin();\n\t\tfor(k3d::int32_t row = 0; row != point_rows; ++row)\n\t\t{\n\t\t\tconst k3d::double_t row_percent = 0.5 - k3d::ratio(row, point_rows-1);\n\n\t\t\tfor(k3d::int32_t column = 0; column != point_columns; ++column)\n\t\t\t{\n\t\t\t\tconst k3d::double_t column_percent = k3d::ratio(column, point_columns-1) - 0.5;\n\n\t\t\t\t*point++ = k3d::to_point((column_percent * x) + (row_percent * y));\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<poly_grid, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0xacb3b4f8, 0x5cd6471c, 0xaed72686, 0xc576987c),\n\t\t\t\"PolyGrid\",\n\t\t\t_(\"Generates a polygonal grid\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_columns;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_rows;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::signed_axis, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_orientation;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_grid_factory\n\nk3d::iplugin_factory& poly_grid_factory()\n{\n\treturn poly_grid::get_factory();\n}\n\n} // namespace sources\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron_sources/poly_icosahedron.cpp",
    "content": "// K-3D\n// Copyright (c) 2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace sources\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_icosahedron\n\nclass poly_icosahedron :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tpoly_icosahedron(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Sphere radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\n\t\t// Create points ...\n\t\tconst k3d::uint_t point_count = 12;\n\t\tk3d::mesh::points_t& points = Output.points.create(new k3d::mesh::points_t(point_count));\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create(new k3d::mesh::selection_t(point_count, 0.0));\n\t\tfor(k3d::uint_t i = 0; i != point_count; ++i)\n\t\t\tpoints[i] = radius * k3d::point3(vdata[i][0], vdata[i][1], vdata[i][2]);\n\n\t\t// Create triangles ...\n\t\tconst k3d::uint_t triangle_count = 20;\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\tpolyhedron->face_shells.reserve(triangle_count);\n\t\tpolyhedron->face_first_loops.reserve(triangle_count);\n\t\tpolyhedron->face_loop_counts.reserve(triangle_count);\n\t\tpolyhedron->face_selections.reserve(triangle_count);\n\t\tpolyhedron->face_materials.reserve(triangle_count);\n\t\tpolyhedron->loop_first_edges.reserve(triangle_count);\n\t\tpolyhedron->clockwise_edges.reserve(3 * triangle_count);\n\t\tpolyhedron->edge_selections.reserve(3 * triangle_count);\n\t\tpolyhedron->vertex_points.reserve(3 * triangle_count);\n\t\tpolyhedron->vertex_selections.reserve(3 * triangle_count);\n\t\t\n\t\tfor(k3d::uint_t i = 0; i != triangle_count; ++i)\n\t\t{\n\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\tpolyhedron->face_selections.push_back(0.0);\n\t\t\tpolyhedron->face_materials.push_back(material);\n\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\t\t\t\n\t\t\tfor(k3d::uint_t j = 0; j != 3; ++j)\n\t\t\t{\n\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\tpolyhedron->edge_selections.push_back(0.0);\n\t\t\t\tpolyhedron->vertex_points.push_back(tindices[i][j]);\n\t\t\t\tpolyhedron->vertex_selections.push_back(0.0);\n\t\t\t}\n\n\t\t\tif(polyhedron->loop_first_edges.size() && polyhedron->clockwise_edges.size())\n\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\t\t}\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<poly_icosahedron, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0x100dff7b, 0x94410b60, 0x4989f4a9, 0x75f6c1bf),\n\t\t\t\"PolyIcosahedron\",\n\t\t\t_(\"Generates a polygonal sphere by recursive subdivision of an isocahedron\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\n\tstatic k3d::double_t vdata[12][3];\n\tstatic k3d::uint_t tindices[20][3];\n};\n\n#define X .525731112119133606\n#define Z .850650808352039932\n\nk3d::double_t poly_icosahedron::vdata[12][3] = {\n\t{-X, 0, Z},\n\t{X, 0, Z},\n\t{-X, 0, -Z},\n\t{X, 0, -Z},\n\t{0, Z, X},\n\t{0, Z, -X},\n\t{0, -Z, X},\n\t{0, -Z, -X},\n\t{Z, X, 0},\n\t{-Z, X, 0},\n\t{Z, -X, 0},\n\t{-Z, -X, 0}};\n\nk3d::uint_t poly_icosahedron::tindices[20][3] = {\n\t{1, 4, 0},\n\t{4, 9, 0},\n\t{4, 5, 9},\n\t{8, 5, 4},\n\t{1, 8, 4},\n\t{1, 10, 8},\n\t{10, 3, 8},\n\t{8, 3, 5},\n\t{3, 2, 5},\n\t{3, 7, 2},\n\t{3, 10, 7},\n\t{10, 6, 7},\n\t{6, 11, 7},\n\t{6, 0, 11},\n\t{6, 1, 0},\n\t{10, 1, 6},\n\t{11, 0, 9},\n\t{2, 11, 9},\n\t{5, 2, 9},\n\t{11, 2, 7}};\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_icosahedron_factory\n\nk3d::iplugin_factory& poly_icosahedron_factory()\n{\n\treturn poly_icosahedron::get_factory();\n}\n\n} // namespace sources\n\n} // namespace polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/polyhedron_sources/poly_sphere.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace sources\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_sphere\n\nclass poly_sphere :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tpoly_sphere(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"U segments\")) + init_description(_(\"Columns\")) + init_value(32) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_segments(init_owner(*this) + init_name(\"v_segments\") + init_label(_(\"V segments\")) + init_description(_(\"Rows\")) + init_value(16) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Sphere radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_u_power(init_owner(*this) + init_name(\"u_power\") + init_label(_(\"U power\")) + init_description(_(\"Radial Power\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_power(init_owner(*this) + init_name(\"v_power\") + init_label(_(\"V power\")) + init_description(_(\"Length Power\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_type(init_owner(*this) + init_name(\"type\") + init_label(_(\"Primitive\")) + init_description(_(\"Primitive type (sphere, quad only sphere or sphereized cylinder\")) + init_value(SPHERE) + init_enumeration(type_values()))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_v_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_u_power.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_v_power.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_type.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\n\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\n\t\tswitch(m_type.pipeline_value())\n\t\t{\n\t\t\tcase SPHERE:\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\t\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\t\t\t// Cap the top of the cylinder with a triangle fan ...\n\t\t\t\tpoints.push_back(k3d::point3());\n\t\t\t\tpoint_selection.push_back(0);\n\n\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t{\n\t\t\t\t\tk3d::polyhedron::add_triangle(\n\t\t\t\t\t\tOutput,\n\t\t\t\t\t\t*polyhedron,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t((u + 1) % u_segments) + 1,\n\t\t\t\t\t\t((u + 0) % u_segments) + 1,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tmaterial\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Create a cylinder ...\n\t\t\t\tk3d::polyhedron::add_cylinder(Output, *polyhedron, 0, v_segments - 2, u_segments, material);\n\n\t\t\t\t// Cap the bottom of the cylinder with a triangle fan ...\n\t\t\t\tpoints.push_back(k3d::point3());\n\t\t\t\tpoint_selection.push_back(0);\n\n\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t{\n\t\t\t\t\tk3d::polyhedron::add_triangle(\n\t\t\t\t\t\tOutput,\n\t\t\t\t\t\t*polyhedron,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t(((v_segments - 2) * u_segments) + (u + 0) % u_segments) + 1,\n\t\t\t\t\t\t(((v_segments - 2) * u_segments) + (u + 1) % u_segments) + 1,\n\t\t\t\t\t\tpoints.size() - 1,\n\t\t\t\t\t\tmaterial\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase QUAD_ONLY_SPHERE:\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\t\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\t\t\t// Cap the top of the cylinder with quads / a triangle fan ...\n\t\t\t\tpoints.push_back(k3d::point3());\n\t\t\t\tpoint_selection.push_back(0);\n\n\t\t\t\tif(u_segments & 1)\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::polyhedron::add_triangle(\n\t\t\t\t\t\t\tOutput,\n\t\t\t\t\t\t\t*polyhedron,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t((u + 1) % u_segments) + 1,\n\t\t\t\t\t\t\t((u + 0) % u_segments) + 1,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tmaterial\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; u += 2)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::polyhedron::add_quadrilateral(\n\t\t\t\t\t\t\tOutput,\n\t\t\t\t\t\t\t*polyhedron,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t((u + 2) % u_segments) + 1,\n\t\t\t\t\t\t\t((u + 1) % u_segments) + 1,\n\t\t\t\t\t\t\t((u + 0) % u_segments) + 1,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tmaterial\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Create a cylinder ...\n\t\t\t\tk3d::polyhedron::add_cylinder(Output, *polyhedron, 0, v_segments - 2, u_segments, material);\n\n\t\t\t\t// Cap the bottom of the cylinder with quads / a triangle fan ...\n\t\t\t\tpoints.push_back(k3d::point3());\n\t\t\t\tpoint_selection.push_back(0);\n\n\t\t\t\tif(u_segments & 1)\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::polyhedron::add_triangle(\n\t\t\t\t\t\t\tOutput,\n\t\t\t\t\t\t\t*polyhedron,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t(((v_segments - 2) * u_segments) + (u + 0) % u_segments) + 1,\n\t\t\t\t\t\t\t(((v_segments - 2) * u_segments) + (u + 1) % u_segments) + 1,\n\t\t\t\t\t\t\tpoints.size() - 1,\n\t\t\t\t\t\t\tmaterial\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; u += 2)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::polyhedron::add_quadrilateral(\n\t\t\t\t\t\t\tOutput,\n\t\t\t\t\t\t\t*polyhedron,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t(((v_segments - 2) * u_segments) + (u + 0) % u_segments) + 1,\n\t\t\t\t\t\t\t(((v_segments - 2) * u_segments) + (u + 1) % u_segments) + 1,\n\t\t\t\t\t\t\t(((v_segments - 2) * u_segments) + (u + 2) % u_segments) + 1,\n\t\t\t\t\t\t\tpoints.size() - 1,\n\t\t\t\t\t\t\tmaterial\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SPHEREIZED_CYLINDER:\n\t\t\t{\n\t\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\t\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\t\t\t// Create a cylinder ...\n\t\t\t\tk3d::polyhedron::add_cylinder(Output, *polyhedron, 0, v_segments, u_segments, material);\n\n\t\t\t\t// Cap the top of the cylinder with a single polygon ...\n\t\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\tpolyhedron->face_selections.push_back(0);\n\t\t\t\tpolyhedron->face_materials.push_back(material);\n\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\n\t\t\t\t\tpolyhedron->vertex_points.push_back(u_segments - u - 1);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t}\n\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\n\t\t\t\t// Cap the bottom of the cylinder with a single polygon ...\n\t\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\tpolyhedron->face_selections.push_back(0);\n\t\t\t\tpolyhedron->face_materials.push_back(material);\n\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\n\t\t\t\t\tpolyhedron->vertex_points.push_back((v_segments * u_segments) + u);\n\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t}\n\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\t\tconst k3d::double_t u_power = m_u_power.pipeline_value();\n\t\tconst k3d::double_t v_power = m_v_power.pipeline_value();\n\t\tconst k3d::double_t inv_u_power = u_power ? 1.0 / u_power : 1.0;\n\t\tconst k3d::double_t inv_v_power = v_power ? 1.0 / v_power : 1.0;\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\n\t\tswitch(m_type.pipeline_value())\n\t\t{\n\t\t\tcase SPHERE:\n\t\t\tcase QUAD_ONLY_SPHERE:\n\t\t\t{\n\t\t\t\tpoints[0] = k3d::point3(0, 0, radius);\n\n\t\t\t\tfor(k3d::int32_t v = 1; v < v_segments; ++v)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::double_t phi = k3d::pi() * k3d::ratio(v, v_segments);\n\t\t\t\t\tconst k3d::double_t varying_radius = k3d::mix(radius * 0.001, radius, sin(phi));\n\n\t\t\t\t\tk3d::double_t z = cos(phi);\n\t\t\t\t\tz = radius * k3d::sign(z) * std::pow(std::abs(z), inv_v_power);\n\n\t\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::double_t theta = k3d::pi_times_2() * k3d::ratio(u, u_segments);\n\n\t\t\t\t\t\tk3d::double_t x = cos(theta);\n\t\t\t\t\t\tk3d::double_t y = -sin(theta);\n\n\t\t\t\t\t\tx = varying_radius * k3d::sign(x) * std::pow(std::abs(x), inv_u_power);\n\t\t\t\t\t\ty = varying_radius * k3d::sign(y) * std::pow(std::abs(y), inv_u_power);\n\n\t\t\t\t\t\tpoints[((v - 1) * u_segments) + u + 1] = k3d::point3(x, y, z);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpoints[points.size() - 1] = k3d::point3(0, 0, -radius);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SPHEREIZED_CYLINDER:\n\t\t\t{\n\t\t\t\tfor(k3d::int32_t v = 0; v <= v_segments; ++v)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::double_t phi = k3d::pi() * k3d::ratio(v, v_segments);\n\t\t\t\t\tconst k3d::double_t varying_radius = k3d::mix(radius * 0.001, radius, sin(phi));\n\n\t\t\t\t\tk3d::double_t z = cos(phi);\n\t\t\t\t\tz = radius * k3d::sign(z) * std::pow(std::abs(z), inv_v_power);\n\n\t\t\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::double_t theta = k3d::pi_times_2() * k3d::ratio(u, u_segments);\n\n\t\t\t\t\t\tk3d::double_t x = cos(theta);\n\t\t\t\t\t\tk3d::double_t y = -sin(theta);\n\n\t\t\t\t\t\tx = varying_radius * k3d::sign(x) * std::pow(std::abs(x), inv_u_power);\n\t\t\t\t\t\ty = varying_radius * k3d::sign(y) * std::pow(std::abs(y), inv_u_power);\n\n\t\t\t\t\t\tpoints[(v * u_segments) + u] = k3d::point3(x, y, z);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<poly_sphere, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0x919c3786, 0x619e4e84, 0xb4ad868f, 0x1e77e67c),\n\t\t\t\"PolySphere\",\n\t\t\t_(\"Generates a polygonal sphere\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_segments;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_u_power;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_v_power;\n\n\t/// Enumerates supported primitive types\n\ttypedef enum\n\t{\n\t\tSPHERE,\n\t\tQUAD_ONLY_SPHERE,\n\t\tSPHEREIZED_CYLINDER\n\t} primitive_t;\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const primitive_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t\t{\n\t\t\t\tcase SPHERE:\n\t\t\t\t\tStream << \"sphere\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase QUAD_ONLY_SPHERE:\n\t\t\t\t\tStream << \"quad_only_sphere\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase SPHEREIZED_CYLINDER:\n\t\t\t\t\tStream << \"sphereized_cylinder\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator >> (std::istream& Stream, primitive_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"sphere\")\n\t\t\tValue = SPHERE;\n\t\telse if(text == \"quad_only_sphere\")\n\t\t\tValue = QUAD_ONLY_SPHERE;\n\t\telse if(text == \"sphereized_cylinder\")\n\t\t\tValue = SPHEREIZED_CYLINDER;\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& type_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Sphere\", \"sphere\", \"Creates a polygonal sphere\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Quadrilateral Only Sphere\", \"quad_only_sphere\", \"Creates a polygonal sphere with quads whenever possible (doesn't work with odd u_segments values\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Sphereized Cylinder\", \"sphereized_cylinder\", \"Creates a sphere topologically equivalent to a capped cylinder (there are u_segments top points and u_segments bottom points each linked by a face)\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\t/// Controls the type of primitive to be created\n\tk3d_data(primitive_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_type;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_sphere_factory\n\nk3d::iplugin_factory& poly_sphere_factory()\n{\n\treturn poly_sphere::get_factory();\n}\n\n} // namespace sources\n\n} // namespace polyhedron\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/polyhedron_sources/poly_torus.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <iterator>\n\nnamespace module\n{\n\nnamespace polyhedron\n{\n\nnamespace sources\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_torus\n\nclass poly_torus :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tpoly_torus(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_u_segments(init_owner(*this) + init_name(\"u_segments\") + init_label(_(\"U segments\")) + init_description(_(\"Columns\")) + init_value(32) + init_constraint(constraint::minimum<k3d::int32_t>(3)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_segments(init_owner(*this) + init_name(\"v_segments\") + init_label(_(\"V segments\")) + init_description(_(\"Rows\")) + init_value(16) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_majorradius(init_owner(*this) + init_name(\"majorradius\") + init_label(_(\"Major radius\")) + init_description(_(\"Major Radius\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_minorradius(init_owner(*this) + init_name(\"minorradius\") + init_label(_(\"Minor radius\")) + init_description(_(\"Minor Radius\")) + init_value(2.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_u_power(init_owner(*this) + init_name(\"u_power\") + init_label(_(\"U power\")) + init_description(_(\"Major Power\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_v_power(init_owner(*this) + init_name(\"v_power\") + init_label(_(\"V power\")) + init_description(_(\"Minor Power\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_u_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_v_segments.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_update_mesh_slot()));\n\t\tm_majorradius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_minorradius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_u_power.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t\tm_v_power.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_geometry_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t\tk3d::polyhedron::add_torus(Output, *polyhedron, 0, v_segments, u_segments, material);;\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t u_segments = m_u_segments.pipeline_value();\n\t\tconst k3d::int32_t v_segments = m_v_segments.pipeline_value();\n\t\tconst k3d::double_t majorradius = m_majorradius.pipeline_value();\n\t\tconst k3d::double_t minorradius = m_minorradius.pipeline_value();\n\t\tconst k3d::double_t u_power = m_u_power.pipeline_value();\n\t\tconst k3d::double_t v_power = m_v_power.pipeline_value();\n\t\tconst k3d::double_t inv_u_power = u_power ? 1.0 / u_power : 1.0;\n\t\tconst k3d::double_t inv_v_power = v_power ? 1.0 / v_power : 1.0;\n\n\t\tk3d::mesh::points_t& points = Output.points.writable();\n\n\t\t// Shape the torus points\n\t\tfor(k3d::int32_t v = 0; v != v_segments; ++v)\n\t\t{\n\t\t\tconst k3d::double_t phi = k3d::pi_times_2() * k3d::ratio(v, v_segments);\n\t\t\tk3d::double_t minor_x = cos(phi);\n\t\t\tk3d::double_t minor_y = sin(phi);\n\t\t\tminor_x = k3d::sign(minor_x) * std::pow(std::abs(minor_x), inv_v_power);\n\t\t\tminor_y = k3d::sign(minor_y) * std::pow(std::abs(minor_y), inv_v_power);\n\n\t\t\tconst k3d::double_t radius = majorradius - (minorradius * minor_x);\n\n\t\t\tfor(k3d::int32_t u = 0; u != u_segments; ++u)\n\t\t\t{\n\t\t\t\tconst k3d::double_t theta = k3d::pi_times_2() * k3d::ratio(u, u_segments);\n\n\t\t\t\tk3d::double_t x = -sin(theta);\n\t\t\t\tk3d::double_t y = -cos(theta);\n\t\t\t\tk3d::double_t z = minorradius * minor_y;\n\n\t\t\t\tx = radius * k3d::sign(x) * std::pow(std::abs(x), inv_u_power);\n\t\t\t\ty = radius * k3d::sign(y) * std::pow(std::abs(y), inv_u_power);\n\n\t\t\t\tpoints[v * u_segments + u] = k3d::point3(x, y, z);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<poly_torus, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0x9a5ea45b, 0xebc64e37, 0xa50b287a, 0x89e18b71),\n\t\t\t\"PolyTorus\",\n\t\t\t_(\"Generates a polygonal torus\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_u_segments;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_v_segments;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_majorradius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_minorradius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_u_power;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_v_power;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// poly_torus_factory\n\nk3d::iplugin_factory& poly_torus_factory()\n{\n\treturn poly_torus::get_factory();\n}\n\n} // namespace sources\n\n} // namespace polyhedron\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/python/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})\n\nK3D_BUILD_MODULE(k3d-python)\nK3D_CREATE_MODULE_PROXY(k3d-python)\n\nTARGET_LINK_LIBRARIES(k3d-python k3dsdk-python)\nTARGET_LINK_LIBRARIES(k3d-python ${PYTHON_LIBRARIES})\n\n"
  },
  {
    "path": "modules/python/engine.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\brief Implements Python engine, an implementation of k3d::iscript_engine that supports the Python language\n\t\\author Anders Dahnielson (anders@dahnielson.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Adam Hupp (hupp@cs.wisc.edu)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <boost/python.hpp>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/file_helpers.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/python/file_signal_python.h>\n#include <k3dsdk/python/object_model_python.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/string_modifiers.h>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n#include <boost/algorithm/string.hpp>\n\nnamespace module\n{\n\nnamespace python\n{\n\n/// Magic token used to identify Python scripts\nconst k3d::string_t magic_token(\"#python\");\n\n/// Ensures that Py_Initialize() is called before any other Python API functions\nclass initialize_python\n{\npublic:\n\tinitialize_python()\n\t{\n\t\tif(!Py_IsInitialized())\n\t\t{\n\t\t\tPy_Initialize();\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tinitk3d();\n\t\t\t}\n\t\t\tcatch(std::exception& e)\n\t\t\t{\n\t\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\t}\n\t\t\tcatch(...)\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Unknown exception\" << std::endl;\n\t\t\t}\n\t\t}\n\t}\n};\n\nclass engine :\n\tpublic k3d::iscript_engine\n{\npublic:\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<engine, k3d::interface_list<k3d::iscript_engine> > factory(\n\t\t\tk3d::classes::PythonEngine(),\n\t\t\t\"Python\",\n\t\t\t_(\"Python scripting engine\"),\n\t\t\t\"ScriptEngine\",\n\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\tboost::assign::map_list_of(\"k3d:mime-types\", \"text/x-python\"));\n\n\t\treturn factory;\n\t}\n\n\tconst k3d::string_t language()\n\t{\n\t\treturn \"Python\";\n\t}\n\n\tk3d::bool_t execute(const k3d::string_t& ScriptName, const k3d::string_t& Script, context& Context, output_t* Stdout, output_t* Stderr)\n\t{\n\t\tk3d::bool_t succeeded = true;\n\n\t\ttry\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::python::file_signal> stdout_signal;\n\t\t\tboost::scoped_ptr<k3d::python::file_signal> stderr_signal;\n\n\t\t\tif(Stdout)\n\t\t\t{\n\t\t\t\tstdout_signal.reset(new k3d::python::file_signal());\n\t\t\t\tstdout_signal->connect_output_signal(*Stdout);\n\t\t\t\tPySys_SetObject(const_cast<char*>(\"stdout\"), boost::python::object(*stdout_signal).ptr());\n\t\t\t}\n\n\t\t\tif(Stderr)\n\t\t\t{\n\t\t\t\tstderr_signal.reset(new k3d::python::file_signal());\n\t\t\t\tstderr_signal->connect_output_signal(*Stderr);\n\t\t\t\tPySys_SetObject(const_cast<char*>(\"stderr\"), boost::python::object(*stderr_signal).ptr());\n\t\t\t}\n\n\t\t\tm_local_dict[\"context\"] = Context;\n\n\t\t\t// The embedded python interpreter cannot handle DOS line-endings, see http://sourceforge.net/tracker/?group_id=5470&atid=105470&func=detail&aid=1167922\n\t\t\tk3d::string_t script = Script;\n\t\t\tscript.erase(std::remove(script.begin(), script.end(), '\\r'), script.end());\n\n\t\t\tPyDict_Update(m_local_dict.ptr(), PyObject_GetAttrString(PyImport_AddModule(\"__main__\"), \"__dict__\"));\n\t\t\t\n\t\t\tPyObject* const result = PyRun_String(const_cast<char*>(script.c_str()), Py_file_input, m_local_dict.ptr(), m_local_dict.ptr());\n\t\t\tif(result)\n\t\t\t{\n\t\t\t\tPy_DECREF(result);\n\t\t\t\tif(Py_FlushLine())\n\t\t\t\t\tPyErr_Clear();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tPyErr_Print();\n\t\t\t}\n\n\t\t\tContext = boost::python::extract<k3d::iscript_engine::context>(m_local_dict[\"context\"])();\n\n\t\t\tsucceeded = result ? true : false;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": \" << e.what() << std::endl;\n\t\t\tsucceeded = false;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": \" << \"Unknown exception\" << std::endl;\n\t\t\tsucceeded = false;\n\t\t}\n\n\t\tif(Stdout)\n\t\t      PySys_SetObject(const_cast<char*>(\"stdout\"), PySys_GetObject(const_cast<char*>(\"__stdout__\")));\n\n\t\tif(Stderr)\n\t\t      PySys_SetObject(const_cast<char*>(\"stderr\"), PySys_GetObject(const_cast<char*>(\"__stderr__\")));\n\n\t\treturn succeeded;\n\t}\n\n\tk3d::bool_t halt()\n\t{\n\t\treturn false;\n\t}\n\n\tinitialize_python m_initialize_python;\n\tboost::python::dict m_local_dict;\n};\n\n} // namespace python\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::python::engine::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/pyui/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_SIGC_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})\n\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nK3D_BUILD_MODULE(k3d-pyui)\nK3D_CREATE_MODULE_PROXY(k3d-pyui)\n\nTARGET_LINK_LIBRARIES(k3d-pyui k3dsdk)\nTARGET_LINK_LIBRARIES(k3d-pyui k3dsdk-python)\nTARGET_LINK_LIBRARIES(k3d-pyui ${PYTHON_LIBRARIES})\n\n"
  },
  {
    "path": "modules/pyui/user_interface.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <Python.h>\n\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/ievent_loop.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/python/object_model_python.h>\n#include <k3dsdk/result.h>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace pyui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// user_interface\n\n/// Provides an interactive python shell user interface to K-3D, useful for prototyping and executing scripts when a graphical UI isn't needed\nclass user_interface :\n\tpublic k3d::ievent_loop,\n\tpublic k3d::iuser_interface\n{\npublic:\n\tvoid get_command_line_arguments(boost::program_options::options_description& Description)\n\t{\n\t}\n\n\tconst arguments_t parse_startup_arguments(const arguments_t& Arguments, k3d::bool_t& Quit, k3d::bool_t& Error)\n\t{\n\t\treturn Arguments;\n\t}\n\n\tconst arguments_t parse_runtime_arguments(const arguments_t& Arguments, k3d::bool_t& Quit, k3d::bool_t& Error)\n\t{\n\t\treturn Arguments;\n\t}\n\n\tvoid startup_message_handler(const k3d::string_t& Message)\n\t{\n\t}\n\n\tvoid display_user_interface()\n\t{\n\t}\n\n\tvoid start_event_loop()\n\t{\n\t\tstd::vector<char*> argv_buffer;\n\t\targv_buffer.push_back(const_cast<char*>(\"k3d\"));\n\t\tint argc = argv_buffer.size();\n\t\tchar** argv = &argv_buffer[0];\n\n\t\ttry\n\t\t{\n\t\t\tPy_Initialize();\n\n\t\t\tinitk3d();\n\n\t\t\tPy_Main(argc, argv);\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << \"Unknown exception\" << std::endl;\n\t\t}\n\n\t}\n\n\tvoid stop_event_loop()\n\t{\n\t\tassert_not_implemented();\n\t}\n\n\tvoid open_uri(const k3d::string_t& URI)\n\t{\n\t}\n\n\tvoid message(const k3d::string_t& Message)\n\t{\n\t\tstd::cout << \"MESSAGE: \" << Message << std::endl;\n\t}\n\n\tvoid warning_message(const k3d::string_t& Message)\n\t{\n\t\tstd::cout << \"WARNING: \" << Message << std::endl;\n\t}\n\n\tvoid error_message(const k3d::string_t& Message)\n\t{\n\t\tstd::cout << \"ERROR: \" << Message << std::endl;\n\t}\n\n\tk3d::uint_t query_message(const k3d::string_t& Message, const k3d::uint_t DefaultOption, const std::vector<k3d::string_t>& Options)\n\t{\n\t\treturn 0;\n\t}\n\n\tvoid nag_message(const k3d::string_t& Type, const k3d::ustring& Message, const k3d::ustring& SecondaryMessage)\n\t{\n\t\tstd::cout << \"MESSAGE: \" << Message.utf8_str() << \" \" << SecondaryMessage.utf8_str() << std::endl;\n\t}\n\n\tk3d::bool_t get_file_path(const k3d::ipath_property::mode_t Mode, const k3d::string_t& Type, const k3d::string_t& Prompt, const k3d::filesystem::path& OldPath, k3d::filesystem::path& Result)\n\t{\n\t\treturn false;\n\t}\n\n\tk3d::bool_t show(iunknown& Object)\n\t{\n\t\treturn false;\n\t}\n\n\tvoid synchronize()\n\t{\n\t}\n\n\tsigc::connection get_timer(const k3d::double_t FrameRate, sigc::slot<void> Slot)\n\t{\n\t\treturn sigc::connection();\n\t}\n\t\n\tk3d::uint_t watch_path(const k3d::filesystem::path& Path, const sigc::slot<void>& Slot)\n\t{\n\t\treturn 0;\n\t}\n\n\tvoid unwatch_path(const k3d::uint_t WatchID)\n\t{\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<user_interface,\n\t\t\tk3d::interface_list<k3d::ievent_loop> > factory(\n\t\t\tk3d::uuid(0x337facd7, 0xbd1645b6, 0x86957382, 0xcb2d53cb),\n\t\t\t\"PyUI\",\n\t\t\t\"Python User Interface (PyUI)\",\n\t\t\t\"Interface\");\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace pyui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::pyui::user_interface::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qslim/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-qslim)\nK3D_CREATE_MODULE_PROXY(k3d-qslim)\n\n"
  },
  {
    "path": "modules/qslim/MxBlockModel.cpp",
    "content": "// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief MxBlockModel\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"MxBlockModel.h\"\n\n////////////////////////////////////////////////////////////////////////\n//\n// Basic allocation routines\n//\n\nMxFaceID MxBlockModel::alloc_face(MxVertexID v1, MxVertexID v2, MxVertexID v3)\n{\n\tMxFaceID id = faces.size();\n\tfaces.push_back(MxFace(v1,v2,v3));\n\treturn id;\n}\n\nMxVertexID MxBlockModel::alloc_vertex(double x, double y, double z)\n{\n\tMxVertexID id = vertices.size();\n\tvertices.push_back(MxVertex(x,y,z));\n\treturn id;\n}\n\nMxVertexID MxBlockModel::add_vertex(double x, double y, double z)\n{\n\tMxVertexID id = alloc_vertex(x,y,z);\n\tinit_vertex(id);\n\treturn id;\n}\n\nvoid MxBlockModel::remove_vertex(MxVertexID v)\n{\n\tassert_warning(v < vertices.size());\n\n\tfree_vertex(v);\n\tvertices.erase(vertices.begin() + v);\n}\n\nvoid MxBlockModel::remove_face(MxFaceID f)\n{\n\tassert_warning(f < faces.size());\n\n\tfree_face(f);\n\tfaces.erase(faces.begin() + f);\n}\n\nMxFaceID MxBlockModel::add_face(unsigned long v1, unsigned long v2, unsigned long v3, bool will_link)\n{\n\tMxFaceID id = alloc_face(v1, v2, v3);\n\tif(will_link)\n\t\tinit_face(id);\n\n\treturn id;\n}\n\n////////////////////////////////////////////////////////////////////////\n//\n// Utility methods for computing characteristics of faces.\n//\n\nVec3 MxBlockModel::compute_face_normal(MxFaceID f, bool will_unitize)\n{\n\tVec3 v1 = vertex(face(f)[0]).pos;\n\tVec3 v2 = vertex(face(f)[1]).pos;\n\tVec3 v3 = vertex(face(f)[2]).pos;\n\n\tVec3 a = v2 - v1;\n\tVec3 b = v3 - v1;\n\n\tVec3 n = a ^ b;\n\n\tif(will_unitize)\n\t\tn.Normalize();\n\n\treturn n;\n}\n\ndouble MxBlockModel::compute_face_area(MxFaceID f)\n{\n\tVec3 n = compute_face_normal(f, false);\n\treturn 0.5 * n.Length();\n}\n\ndouble MxBlockModel::compute_corner_angle(MxFaceID f, unsigned long i)\n{\n\tunsigned long i_prev = (i==0)?2:i-1;\n\tunsigned long i_next = (i==2)?0:i+1;\n\n\tVec3 e_prev = corner(f, i_prev) - corner(f, i);\n\te_prev.Normalize();\n\tVec3 e_next = corner(f, i_next) - corner(f, i);\n\te_next.Normalize();\n\n\treturn acos(e_prev * e_next);\n}\n\n\n"
  },
  {
    "path": "modules/qslim/MxBlockModel.h",
    "content": "#ifndef MXBLOCKMODEL_INCLUDED\n#define MXBLOCKMODEL_INCLUDED\n\n// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief MxBlockModel\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/result.h>\n\n#include \"MxMesh.h\"\n\n#include <vector>\n\nclass MxBlockModel\n{\nprivate:\n\tstd::vector<MxVertex> vertices;\n\tstd::vector<MxFace> faces;\n\nprotected:\n\tvirtual MxVertexID alloc_vertex(double, double, double);\n\tvirtual void init_vertex(MxVertexID) {}\n\tvirtual void free_vertex(MxVertexID) {}\n\tvirtual MxFaceID alloc_face(MxVertexID, MxVertexID, MxVertexID);\n\tvirtual void init_face(MxFaceID) {}\n\tvirtual void free_face(MxFaceID) {}\n\npublic:\n\tMxBlockModel(int nvert, int nface)\n\t{\n\t\tvertices.reserve(nvert);\n\t\tfaces.reserve(nface);\n\t}\n\n\tvirtual ~MxBlockModel()\n\t{\n\t}\n\n\tunsigned long vert_count() const { return vertices.size(); }\n\tunsigned long face_count() const { return faces.size(); }\n\n\tMxVertexID add_vertex(double, double, double);\n\tMxFaceID add_face(unsigned long, unsigned long, unsigned long, bool will_link=true);\n\n\tMxVertexID add_vertex(double *v) { return add_vertex(v[0], v[1], v[2]); }\n\tMxFaceID add_face(unsigned int *f) { return add_face(f[0], f[1], f[2]); }\n\n\tvoid remove_vertex(MxVertexID v);\n\tvoid remove_face(MxFaceID f);\n\n\tMxVertex& vertex(unsigned int i) { return vertices[i]; }\n\tMxFace& face(unsigned int i) { return faces[i]; }\n\tMxVertex& corner(MxFaceID f, short i) { return vertex(face(f)[i]); }\n\n\tVec3 compute_face_normal(MxFaceID, bool will_unitize=true);\n\tdouble compute_face_area(MxFaceID);\n\n\tdouble compute_corner_angle(MxFaceID, unsigned long);\n};\n\n#endif // MXBLOCKMODEL_INCLUDED\n\n"
  },
  {
    "path": "modules/qslim/MxHeap.cpp",
    "content": "// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Heap data structure\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/result.h>\n\n#include \"MxHeap.h\"\n\nvoid Heap::place(Heapable* x, int i)\n{\n\tarray[i] = x;\n\tx->set_heap_pos(i);\n}\n\nvoid Heap::swap(int i,int j)\n{\n\tHeapable* tmp = array[i];\n\n\tplace(array[j], i);\n\tplace(tmp, j);\n}\n\nvoid Heap::upheap(int i)\n{\n\tHeapable* moving = array[i];\n\tint index = i;\n\tint p = parent(i);\n\n\twhile(index > 0 && moving->heap_key() > array[p]->heap_key())\n\t\t{\n\t\t\tplace(array[p], index);\n\t\t\tindex = p;\n\t\t\tp = parent(p);\n\t\t}\n\n\tif(index != i)\n\t\tplace(moving, index);\n}\n\nvoid Heap::downheap(int i)\n{\n\tHeapable* moving = array[i];\n\tint index = i;\n\tint l = left(i);\n\tint r = right(i);\n\tint largest;\n\n\twhile(l < array.size())\n\t\t{\n\t\t\tif(r < array.size() && array[l]->heap_key() < array[r]->heap_key())\n\t\t\t\tlargest = r;\n\t\t\telse\n\t\t\t\tlargest = l;\n\n\t\t\tif(moving->heap_key() < array[largest]->heap_key())\n\t\t\t\t{\n\t\t\t\t\tplace(array[largest], index);\n\t\t\t\t\tindex = largest;\n\t\t\t\t\tl = left(index);\n\t\t\t\t\tr = right(index);\n\t\t\t\t}\n\t\t\telse\n\t\t\t\tbreak;\n\t\t}\n\n\tif(index != i)\n\t\tplace(moving, index);\n}\n\nvoid Heap::insert(Heapable* t, double v)\n{\n\tt->heap_key(v);\n\n\tint i = array.size();\n\tarray.push_back(t);\n\tt->set_heap_pos(i);\n\n\tupheap(i);\n}\n\nvoid Heap::update(Heapable* t, double v)\n{\n\tassert_warning(t->is_in_heap());\n\tt->heap_key(v);\n\n\tint i = t->get_heap_pos();\n\n\tif(i > 0 && v > array[parent(i)] ->heap_key())\n\t\tupheap(i);\n\telse\n\t\tdownheap(i);\n}\n\nHeapable* Heap::extract()\n{\n\tif(array.size() < 1)\n\t\treturn 0;\n\n\tswap(0, array.size()-1);\n\tHeapable* dead = array.back();\n\tarray.pop_back();\n\n\tdownheap(0);\n\n\tdead->not_in_heap();\n\n\treturn dead;\n}\n\nHeapable* Heap::remove(Heapable* t)\n{\n\tif(!t->is_in_heap())\n\t\treturn 0;\n\n\tint i = t->get_heap_pos();\n\tswap(i, array.size()-1);\n\tarray.pop_back();\n\tt->not_in_heap();\n\n\tif(array[i]->heap_key() < t->heap_key())\n\t\tdownheap(i);\n\telse\n\t\tupheap(i);\n\n\treturn t;\n}\n\n\n"
  },
  {
    "path": "modules/qslim/MxHeap.h",
    "content": "#ifndef GFXTOOLS_HEAP_INCLUDED\n#define GFXTOOLS_HEAP_INCLUDED\n\n// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Heap data structure\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#define NOT_IN_HEAP -47\n\n#include <vector>\n\nclass Heapable\n{\nprivate:\n\tdouble import;\n\tint token;\n\npublic:\n\tHeapable() { not_in_heap(); }\n\n\tinline int is_in_heap() { return token != NOT_IN_HEAP; }\n\tinline void not_in_heap() { token = NOT_IN_HEAP; }\n\tinline int get_heap_pos() { return token; }\n\tinline void set_heap_pos(int t) { token=t; }\n\n\tinline void heap_key(double k) { import = k; }\n\tinline double heap_key() const { return import; }\n};\n\nclass Heap\n{\n\tstd::vector<Heapable*> array;\n\n\tvoid place(Heapable* x, int i);\n\tvoid swap(int i, int j);\n\n\tint parent(int i) { return (i-1)/2; }\n\tint left(int i) { return 2*i+1; }\n\tint right(int i) { return 2*i+2; }\n\n\tvoid upheap(int i);\n\tvoid downheap(int i);\n\n\tvoid insert(Heapable*, double);\n\tvoid update(Heapable*, double);\n\npublic:\n\tHeap() {}\n\tHeap(int s) {}\n\n\tHeapable* ref(unsigned long i) { return array[i]; }\n\n\tvoid insert(Heapable* t) { insert(t, t->heap_key()); }\n\tvoid update(Heapable* t) { update(t, t->heap_key()); }\n\n\tHeapable* item(unsigned long i) { return ref(i); }\n\n\tHeapable* extract();\n\tHeapable* remove(Heapable*);\n};\n\n#endif // GFXTOOLS_HEAP_INCLUDED\n\n"
  },
  {
    "path": "modules/qslim/MxMath.cpp",
    "content": "// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Vectors and Matrices\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"MxMath.h\"\n\ndouble Mat3::det()\n{\n\treturn row[0] * (row[1] ^ row[2]);\n}\n\nMat3 Mat3::transpose()\n{\n\treturn Mat3(col(0), col(1), col(2));\n}\n\nMat3 Mat3::adjoint()\n{\n\treturn Mat3(row[1]^row[2],\n\t\trow[2]^row[0],\n\t\trow[0]^row[1]);\n}\n\ndouble Mat3::invert(Mat3& inv)\n{\n\tMat3 A = adjoint();\n\tdouble d = A.row[0] * row[0];\n\n\tif(d == 0)\n\t\treturn 0;\n\n\tinv = A.transpose() / d;\n\treturn d;\n}\n\n\n"
  },
  {
    "path": "modules/qslim/MxMath.h",
    "content": "#ifndef MXVEC3_INCLUDED\n#define MXVEC3_INCLUDED\n\n// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Vectors and Matrices\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <cmath>\n#include <iostream>\n\n#ifndef FEQ_EPS2\n#define FEQ_EPS2 1e-12\n#endif\n\nenum Axis {X=0, Y=1, Z=2, W=3};\n\n\nclass Vec3 {\nprivate:\n\tdouble elt[3];\n\nprotected:\n\tinline void copy(const Vec3& v);\n\npublic:\n\tVec3(double x=0, double y=0, double z=0) { elt[0]=x; elt[1]=y; elt[2]=z; }\n\tVec3(const Vec3& v) { copy(v); }\n\tVec3(const double *v) { elt[0]=v[0]; elt[1]=v[1]; elt[2]=v[2]; }\n\n\t// Access methods\n\toperator double*() { return elt; }\n\toperator const double*() const { return elt; }\n\n\t// Comparison operators\n\tinline bool operator==(const Vec3& v) const;\n\tinline bool operator!=(const Vec3& v) const;\n\n\t// Assignment and in-place arithmetic methods\n\tinline Vec3& operator=(const Vec3& v);\n\tinline Vec3& operator+=(const Vec3& v);\n\tinline Vec3& operator-=(const Vec3& v);\n\tinline Vec3& operator*=(double s);\n\tinline Vec3& operator/=(double s);\n\n\t// Binary arithmetic methods\n\tinline Vec3 operator+(const Vec3& v) const;\n\tinline Vec3 operator-(const Vec3& v) const;\n\tinline Vec3 operator-() const;\n\n\tinline Vec3 operator*(double s) const;\n\tinline Vec3 operator/(double s) const;\n\tinline double operator*(const Vec3& v) const;\n\tinline Vec3 operator^(const Vec3& v) const;\n\n\t// Other\n\tVec3& Normalize();\n\tdouble Length()\n\t{\n\t\treturn std::sqrt(elt[0]*elt[0]+elt[1]*elt[1]+elt[2]*elt[2]);\n\t}\n};\n\nclass Vec4\n{\nprivate:\n\tdouble elt[4];\n\npublic:\n\tVec4(double x=0, double y=0, double z=0, double w=0)\n\t{\n\t\telt[0]=x; elt[1]=y; elt[2]=z; elt[3]=w;\n\t}\n\tVec4(const Vec3& v,double w)\n\t{\n\t\telt[0]=v[0];elt[1]=v[1];elt[2]=v[2];elt[3]=w;\n\t}\n\n\t// Access methods\n\toperator double*() { return elt; }\n\toperator const double*() const { return elt; }\n\n\t// Assignment and in-place arithmetic methods\n\tinline Vec4& operator=(const Vec4& v);\n};\n\nclass Mat3\n{\nprivate:\n\tVec3 row[3];\n\tinline Vec3 col(int i) const {return Vec3(row[0][i],row[1][i],row[2][i]);}\n\npublic:\n\tMat3()\n\t{\n\t\trow[0] = Vec3(0, 0, 0);\n\t\trow[1] = Vec3(0, 0, 0);\n\t\trow[2] = Vec3(0, 0, 0);\n\t}\n\n\tMat3(const Vec3& r0,const Vec3& r1,const Vec3& r2)\n\t{\n\t\trow[0] = r0;\n\t\trow[1] = r1;\n\t\trow[2] = r2;\n\t}\n\n\tinline Mat3 operator/(double s) const;\n\tinline Vec3 operator*(const Vec3& v) const;\n\n\t// Matrix operations\n\tdouble det();\n\tMat3 transpose();\n\tMat3 adjoint();\n\tdouble invert(Mat3&);\n};\n\n\n////////////////////////////////////////////////////////////////////////\n//\n// Method definitions\n//\n\ninline void Vec3::copy(const Vec3& v)\n{\n\telt[0]=v.elt[0]; elt[1]=v.elt[1]; elt[2]=v.elt[2];\n}\n\ninline bool Vec3::operator==(const Vec3& v) const\n{\n\tdouble dx=elt[X]-v[X],  dy=elt[Y]-v[Y],  dz=elt[Z]-v[Z];\n\treturn (dx*dx + dy*dy + dz*dz) < FEQ_EPS2;\n}\n\ninline bool Vec3::operator!=(const Vec3& v) const\n{\n\tdouble dx=elt[X]-v[X],  dy=elt[Y]-v[Y],  dz=elt[Z]-v[Z];\n\treturn (dx*dx + dy*dy + dz*dz) > FEQ_EPS2;\n}\n\ninline Vec3& Vec3::operator=(const Vec3& v)\n{\n\tcopy(v);\n\treturn *this;\n}\n\ninline Vec3& Vec3::operator+=(const Vec3& v)\n{\n\telt[0] += v[0];   elt[1] += v[1];   elt[2] += v[2];\n\treturn *this;\n}\n\ninline Vec3& Vec3::operator-=(const Vec3& v)\n{\n\telt[0] -= v[0];   elt[1] -= v[1];   elt[2] -= v[2];\n\treturn *this;\n}\n\ninline Vec3& Vec3::operator*=(double s)\n{\n\telt[0] *= s;   elt[1] *= s;   elt[2] *= s;\n\treturn *this;\n}\n\ninline Vec3& Vec3::operator/=(double s)\n{\n\telt[0] /= s;   elt[1] /= s;   elt[2] /= s;\n\treturn *this;\n}\n\n\ninline Vec3 Vec3::operator+(const Vec3& v) const\n{\n\treturn Vec3(elt[0]+v[0], elt[1]+v[1], elt[2]+v[2]);\n}\n\ninline Vec3 Vec3::operator-(const Vec3& v) const\n{\n\treturn Vec3(elt[0]-v[0], elt[1]-v[1], elt[2]-v[2]);\n}\n\ninline Vec3 Vec3::operator-() const\n{\n\treturn Vec3(-elt[0], -elt[1], -elt[2]);\n}\n\ninline Vec3 Vec3::operator*(double s) const\n{\n\treturn Vec3(elt[0]*s, elt[1]*s, elt[2]*s);\n}\n\ninline Vec3 Vec3::operator/(double s) const\n{\n\treturn Vec3(elt[0]/s, elt[1]/s, elt[2]/s);\n}\n\ninline double Vec3::operator*(const Vec3& v) const\n{\n\treturn elt[0]*v[0] + elt[1]*v[1] + elt[2]*v[2];\n}\n\ninline Vec3 Vec3::operator^(const Vec3& v) const\n{\n\tVec3 w( elt[1]*v[2] - v[1]*elt[2],\n\t   -elt[0]*v[2] + v[0]*elt[2],\n\t    elt[0]*v[1] - v[0]*elt[1] );\n\treturn w;\n}\n\n// Make scalar multiplication commutative\ninline Vec3 operator*(double s, const Vec3& v) { return v*s; }\n\n\n////////////////////////////////////////////////////////////////////////\n//\n// Primitive function definitions\n//\n\ninline double norm(const Vec3& v)\n{\n\treturn std::sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);\n}\n\ninline double norm2(const Vec3& v)\n{\n\treturn v[0]*v[0] + v[1]*v[1] + v[2]*v[2];\n}\n\ninline Vec3& Vec3::Normalize()\n{\n\tif(const double length = norm(*this))\n\t\t*this /= length;\n\n\treturn *this;\n}\n\n////////////////////////////////////////////////////////////////////////\n//\n// Misc. function definitions\n//\n\ninline std::ostream& operator<<(std::ostream& out, const Vec3& v)\n{\n\treturn out << v[0] << \" \" << v[1] << \" \" << v[2];\n}\n\ninline std::istream& operator>>(std::istream& in, Vec3& v)\n{\n\treturn in >> v[0] >> v[1] >> v[2];\n}\n\n////////////////////////////////////////////////////////////////////////\n//\n// Vec4\n//\n\ninline Vec4& Vec4::operator=(const Vec4& v)\n{\n\telt[0]=v.elt[0]; elt[1]=v.elt[1]; elt[2]=v.elt[2]; elt[3]=v.elt[3];\n\treturn *this;\n}\n\n////////////////////////////////////////////////////////////////////////\n//\n// Mat3\n//\n\ninline Mat3 Mat3::operator/(double s) const\n{\n\treturn Mat3(row[0]/s, row[1]/s, row[2]/s);\n}\n\ninline Vec3 Mat3::operator*(const Vec3& v) const\n{\n\treturn Vec3(row[0]*v, row[1]*v, row[2]*v);\n}\n\n#endif // MXVEC3_INCLUDED\n\n"
  },
  {
    "path": "modules/qslim/MxMesh.h",
    "content": "#ifndef MXGEOPRIMS_INCLUDED\n#define MXGEOPRIMS_INCLUDED\n\n// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief MxMesh\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/result.h>\n\n#include \"MxMath.h\"\n\ntypedef unsigned int ID;\ntypedef ID MxVertexID;\ntypedef ID MxFaceID;\n\nclass MxVertex\n{\npublic:\n\tVec3 pos;\n\n\tMxVertex() {}\n\tMxVertex(double x, double y, double z)\n\t{\n\t\tpos[0]=x;\n\t\tpos[1]=y;\n\t\tpos[2]=z;\n\t}\n\n\tMxVertex(const MxVertex& v) { *this = v; }\n\n\tMxVertex& operator=(const MxVertex& v)\n\t{\n\t\tpos[0]=v.pos[0];\n\t\tpos[1]=v.pos[1];\n\t\tpos[2]=v.pos[2];\n\t\treturn *this;\n\t}\n\n\toperator const double*() const { return pos; }\n\toperator double*() { return pos; }\n\n\tdouble& operator[](int i)       { return pos[i]; }\n\tdouble  operator[](int i) const { return pos[i]; }\n};\n\nclass MxEdge\n{\npublic:\n\tMxVertexID v1, v2;\n\n\tMxEdge() { }\n\tMxEdge(MxVertexID a, MxVertexID b) { v1=a; v2=b; }\n\tMxEdge(const MxEdge& e) { v1=e.v1;  v2=e.v2; }\n\n\tMxVertexID opposite_vertex(MxVertexID v)\n\t\t{\n\t\t\tif(v == v1)\n\t\t\t\treturn v2;\n\n\t\t\tassert_warning(v==v2);\n\t\t\treturn v1;\n\t\t}\n};\n\nclass MxFace\n{\npublic:\n\tMxVertexID v[3];\n\n\tMxFace() {}\n\n\tMxFace(MxVertexID v0, MxVertexID v1, MxVertexID v2)\n\t{ v[0]=v0;  v[1]=v1;  v[2]=v2; }\n\tMxFace(const MxFace& f) { v[0]=f.v[0]; v[1]=f.v[1]; v[2]=f.v[2]; }\n\n\tMxVertexID& operator[](int i)       { return v[i]; }\n\tMxVertexID  operator[](int i) const { return v[i]; }\n\n\tint remap_vertex(MxVertexID from, MxVertexID to)\n\t{\n\t\tint nmapped = 0;\n\t\tfor(int i = 0; i < 3; i++)\n\t\t\tif(v[i] == from)\n\t\t\t\t{\n\t\t\t\t\tv[i]=to;\n\t\t\t\t\tnmapped++;\n\t\t\t\t}\n\n\t\treturn nmapped;\n\t}\n\n\tunsigned long find_vertex(MxVertexID i)\n\t{\n\t\tif(v[0]==i) return 0;\n\t\telse if(v[1]==i) return 1;\n\t\telse { assert_warning(v[2]==i); return 2; }\n\t}\n\n\tMxVertexID opposite_vertex(MxVertexID v0, MxVertexID v1)\n\t{\n\t\tif(v[0]!=v0 && v[0]!=v1) return v[0];\n\t\telse if(v[1]!=v0 && v[1]!=v1) return v[1];\n\t\telse { assert_warning(v[2]!=v0 && v[2]!=v1); return v[2]; }\n\t}\n\n\tbool is_inorder(MxVertexID v0, MxVertexID v1)\n\t{\n\t\tif(v[0]==v0) return v[1]==v1;\n\t\telse if(v[1]==v0) return v[2]==v1;\n\t\telse { assert_warning(v[2]==v0); return v[0]==v1; }\n\t}\n};\n\ninline std::ostream& operator<<(std::ostream& out, const MxVertex& v)\n{\n\treturn out << \"v \" << v[0] << \" \" << v[1] << \" \" << v[2];\n}\n\ninline std::ostream& operator<<(std::ostream& out, const MxFace& f)\n{\n\treturn out << \"f \" << f[0]+1 << \" \" <<  f[1]+1 << \" \" <<  f[2]+1;\n}\n\n#endif // MXGEOPRIMS_INCLUDED\n\n"
  },
  {
    "path": "modules/qslim/MxQMetric3.cpp",
    "content": "// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief 3D Quadric Error Metrics\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"MxQMetric3.h\"\n\ninline bool FEQ(double a,double b,double eps=FEQ_EPS2) { return fabs(a-b)<eps; }\n\nvoid MxQuadric3::init(double a, double b, double c, double d, double area)\n{\n\ta2 = a*a;  ab = a*b;  ac = a*c;  ad = a*d;\n\t           b2 = b*b;  bc = b*c;  bd = b*d;\n\t                  c2 = c*c;  cd = c*d;\n\t\t\t             d2 = d*d;\n\n\tr = area;\n}\n\nMat3 MxQuadric3::tensor() const\n{\n\treturn Mat3(Vec3(a2, ab, ac),\n\t\tVec3(ab, b2, bc),\n\t\tVec3(ac, bc, c2));\n}\n\nvoid MxQuadric3::set_coefficients(const double *v)\n{\n\ta2 = v[0];  ab = v[1];  ac = v[2];  ad = v[3];\n\t            b2 = v[4];  bc = v[5];  bd = v[6];\n\t\t            c2 = v[7];  cd = v[8];\n\t                                    d2 = v[9];\n}\n\nMxQuadric3& MxQuadric3::operator=(const MxQuadric3& Q)\n{\n\tr = Q.r;\n\n\ta2 = Q.a2;  ab = Q.ab;  ac = Q.ac;  ad = Q.ad;\n\t            b2 = Q.b2;  bc = Q.bc;  bd = Q.bd;\n\t\t            c2 = Q.c2;  cd = Q.cd;\n\t                                    d2 = Q.d2;\n\n\treturn *this;\n}\n\nMxQuadric3& MxQuadric3::operator+=(const MxQuadric3& Q)\n{\n\t// Accumulate area\n\tr += Q.r;\n\n\t// Accumulate coefficients\n\ta2 += Q.a2;  ab += Q.ab;  ac += Q.ac;  ad += Q.ad;\n\t             b2 += Q.b2;  bc += Q.bc;  bd += Q.bd;\n\t\t              c2 += Q.c2;  cd += Q.cd;\n\t\t\t                   d2 += Q.d2;\n\n\treturn *this;\n}\n\nMxQuadric3& MxQuadric3::operator-=(const MxQuadric3& Q)\n{\n\tr -= Q.r;\n\n\ta2 -= Q.a2;  ab -= Q.ab;  ac -= Q.ac;  ad -= Q.ad;\n\t             b2 -= Q.b2;  bc -= Q.bc;  bd -= Q.bd;\n\t\t              c2 -= Q.c2;  cd -= Q.cd;\n\t\t\t                   d2 -= Q.d2;\n\n\treturn *this;\n}\n\nMxQuadric3& MxQuadric3::operator*=(double s)\n{\n\t// Scale coefficients\n\ta2 *= s;  ab *= s;  ac *= s;  ad *= s;\n\t          b2 *= s;  bc *= s;  bd *= s;\n\t                    c2 *= s;  cd *= s;\n\t\t\t          d2 *= s;\n\n\treturn *this;\n}\n\ndouble MxQuadric3::evaluate(double x, double y, double z) const\n{\n\t// Evaluate vAv + 2bv + c\n\treturn x*x*a2 + 2*x*y*ab + 2*x*z*ac + 2*x*ad\n\t          + y*y*b2   + 2*y*z*bc + 2*y*bd\n\t                     + z*z*c2   + 2*z*cd\n\t                                + d2;\n}\n\nbool MxQuadric3::optimize(Vec3& v) const\n{\n\tMat3 Ainv;\n\tdouble det = tensor().invert(Ainv);\n\tif(FEQ(det, 0.0, 1e-12))\n\t\treturn false;\n\n\tv = -(Ainv*vector());\n\n\treturn true;\n}\n\nbool MxQuadric3::optimize(double *x, double *y, double *z) const\n{\n\tVec3 v;\n\n\tbool success = optimize(v);\n\tif(success)\n\t{\n\t\t*x = (double)v[X];\n\t\t*y = (double)v[Y];\n\t\t*z = (double)v[Z];\n\t}\n\treturn success;\n}\n\nbool MxQuadric3::optimize(Vec3& v, const Vec3& v1, const Vec3& v2) const\n{\n\tVec3 d = v1 - v2;\n\tMat3 A = tensor();\n\n\tVec3 Av2 = A*v2;\n\tVec3 Ad  = A*d;\n\n\tdouble denom = 2*d*Ad;\n\tif(FEQ(denom, 0.0, 1e-12))\n\treturn false;\n\n\tdouble a =  (-2*(vector()*d) - (d*Av2) - (v2*Ad)) / (2*(d*Ad));\n\n\tif(a<0.0) a=0.0; else if(a>1.0) a=1.0;\n\n\tv = a*d + v2;\n\treturn true;\n}\n\nbool MxQuadric3::optimize(Vec3& v, const Vec3& v1, const Vec3& v2, const Vec3& v3) const\n{\n\tVec3 d13 = v1 - v3;\n\tVec3 d23 = v2 - v3;\n\tMat3 A = tensor();\n\tVec3 B = vector();\n\n\tVec3 Ad13 = A*d13;\n\tVec3 Ad23 = A*d23;\n\tVec3 Av3  = A*v3;\n\n\tdouble d13_d23 = (d13*Ad23) + (d23*Ad13);\n\tdouble v3_d13  = (d13*Av3) + (v3*Ad13);\n\tdouble v3_d23  = (d23*Av3) + (v3*Ad23);\n\n\tdouble d23Ad23 = d23*Ad23;\n\tdouble d13Ad13 = d13*Ad13;\n\n\tdouble denom = d13Ad13*d23Ad23 - 2*d13_d23;\n\tif(FEQ(denom, 0.0, 1e-12))\n\treturn false;\n\n\tdouble a = (d23Ad23*(2*(B*d13) + v3_d13) -\n\t\t  d13_d23*(2*(B*d23) + v3_d23)) / -denom;\n\n\tdouble b = (d13Ad13*(2*(B*d23) + v3_d23) -\n\t\t  d13_d23*(2*(B*d13) + v3_d13)) / -denom;\n\n\tif(a<0.0) a=0.0; else if(a>1.0) a=1.0;\n\tif(b<0.0) b=0.0; else if(b>1.0) b=1.0;\n\n\tv = a*d13 + b*d23 + v3;\n\treturn true;\n}\n\n\n"
  },
  {
    "path": "modules/qslim/MxQMetric3.h",
    "content": "#ifndef MXQMETRIC3_INCLUDED\n#define MXQMETRIC3_INCLUDED\n\n// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief 3D Quadric Error Metric\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"MxMath.h\"\n\nclass MxQuadric3\n{\nprivate:\n\tdouble a2, ab, ac, ad;\n\tdouble     b2, bc, bd;\n\tdouble         c2, cd;\n\tdouble             d2;\n\n\tdouble r;\n\n\tvoid init(double a, double b, double c, double d, double area);\n\npublic:\n\tMxQuadric3() { clear(); }\n\tMxQuadric3(double a, double b, double c, double d, double area=1.0)\n\t{ init(a, b, c, d, area); }\n\tMxQuadric3(const double *n, double d, double area=1.0)\n\t{ init(n[X], n[Y], n[Z], d, area); }\n\tMxQuadric3(const MxQuadric3& Q) { *this = Q; }\n\n\tMat3 tensor() const;\n\tVec3 vector() const { return Vec3(ad, bd, cd); }\n\tdouble offset() const { return d2; }\n\tdouble area() const { return r; }\n\n\tvoid set_coefficients(const double *);\n\tvoid set_area(double a) { r=a; }\n\n\tvoid clear(double val=0.0) { a2=ab=ac=ad=b2=bc=bd=c2=cd=d2=r=val; }\n\tMxQuadric3& operator=(const MxQuadric3& Q);\n\tMxQuadric3& operator+=(const MxQuadric3& Q);\n\tMxQuadric3& operator-=(const MxQuadric3& Q);\n\tMxQuadric3& operator*=(double s);\n\n\tdouble evaluate(double x, double y, double z) const;\n\tdouble evaluate(const double *v) const {return evaluate(v[X], v[Y], v[Z]);}\n\n\tbool optimize(Vec3& v) const;\n\tbool optimize(double *x, double *y, double *z) const;\n\n\tbool optimize(Vec3& v, const Vec3& v1, const Vec3& v2) const;\n\tbool optimize(Vec3& v,const Vec3& v1,const Vec3& v2,const Vec3& v3) const;\n};\n\n#endif // MXQMETRIC3_INCLUDED\n\n"
  },
  {
    "path": "modules/qslim/MxQSlim.cpp",
    "content": "// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Surface simplification using quadric error metrics\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/result.h>\n\n#include \"MxQSlim.h\"\n#include \"MxTriangle.h\"\n\n#include <algorithm>\n\ntypedef MxQuadric3 Quadric;\n\nvoid MxQSlim::initialize()\n{\n\tcollect_quadrics();\n\tif(boundary_weight > 0)\n\t\tconstrain_boundaries();\n}\n\nvoid MxQSlim::collect_quadrics()\n{\n\tquadrics.resize(m->vert_count());\n\tfor(unsigned long j = 0; j < quadrics.size(); j++)\n\t\tquadrics[j].clear();\n\n\tfor(MxFaceID i=0; i<m->face_count(); i++)\n\t\t{\n\t\t\tMxFace& f = m->face(i);\n\n\t\t\tVec3 v1(m->vertex(f[0]));\n\t\t\tVec3 v2(m->vertex(f[1]));\n\t\t\tVec3 v3(m->vertex(f[2]));\n\n\t\t\tVec4 p = (weighting_policy==MX_WEIGHT_RAWNORMALS) ?\n\t\t\ttriangle_raw_plane(v1, v2, v3):\n\t\t\ttriangle_plane(v1, v2, v3);\n\t\t\tQuadric Q(p[X], p[Y], p[Z], p[W], m->compute_face_area(i));\n\n\t\t\tswitch(weighting_policy)\n\t\t\t\t{\n\t\t\t\t\tcase MX_WEIGHT_ANGLE:\n\t\t\t\t\t\tfor(unsigned long j = 0; j < 3; j++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tQuadric Q_j = Q;\n\t\t\t\t\t\t\t\tQ_j *= m->compute_corner_angle(i, j);\n\t\t\t\t\t\t\t\tquadrics[f[j]] += Q_j;\n\t\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase MX_WEIGHT_AREA:\n\t\t\t\t\tcase MX_WEIGHT_AREA_AVG:\n\t\t\t\t\t\tQ *= Q.area();\n\t\t\t\t\t\t// no break: fallthrough\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tquadrics[f[0]] += Q;\n\t\t\t\t\t\tquadrics[f[1]] += Q;\n\t\t\t\t\t\tquadrics[f[2]] += Q;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t}\n}\n\nvoid MxQSlim::discontinuity_constraint(MxVertexID i, MxVertexID j, const face_list_t& faces)\n{\n\tfor(unsigned long f = 0; f < faces.size(); ++f)\n\t\t{\n\tVec3 org(m->vertex(i)), dest(m->vertex(j));\n\tVec3 e = dest - org;\n\n\tVec3 n;\n\tm->compute_face_normal(faces[f], n);\n\n\tVec3 n2 = e ^ n;\n\tn2.Normalize();\n\n\tMxQuadric3 Q(n2, -(n2*org));\n\tQ *= boundary_weight;\n\n\tif(weighting_policy == MX_WEIGHT_AREA ||\n\t\tweighting_policy == MX_WEIGHT_AREA_AVG)\n\t{\n\t\tQ.set_area(norm2(e));\n\t\tQ *= Q.area();\n\t}\n\n\tquadrics[i] += Q;\n\tquadrics[j] += Q;\n\t\t}\n}\n\nvoid MxQSlim::constrain_boundaries()\n{\n\tfor(MxVertexID i = 0; i < m->vert_count(); ++i)\n\t{\n\t\tvertex_list_t star;\n\t\tm->collect_vertex_star(i, star);\n\n\t\tfor(unsigned long j = 0; j < star.size(); j++)\n\t\t\tif(i < star[j])\n\t\t\t{\n\t\t\t\tface_list_t faces;\n\t\t\t\tm->collect_edge_neighbors(i, star[j], faces);\n\t\t\t\tif(faces.size() == 1)\n\t\t\t\t\tdiscontinuity_constraint(i, star[j], faces);\n\t\t\t}\n\t}\n}\n\n///////////////////////////////////////////////////////////////////////////\n//\n// IMPORTANT NOTE:  The check_xxx functions assume that the local\n//                  neighborhoods have been marked so that each face\n//                  is marked with the number of involved vertices it has.\n//\n\nMxEdgeQSlim::MxEdgeQSlim(MxStdModel& _m) :\n\tMxQSlim(_m)\n{\n\tedge_links.resize(_m.vert_count());\n}\n\nMxEdgeQSlim::~MxEdgeQSlim()\n{\n\t// Delete everything remaining in the heap\n\t//for(unsigned long i = 0; i < heap->size(); ++i)\n\t//\tdelete (edge_info*)heap->item(i);\n}\n\ndouble MxEdgeQSlim::check_local_compactness(unsigned long v1, unsigned long/*v2*/,\n\t\t\t\t\t    const double *vnew)\n{\n\tconst face_list_t& N1 = m->neighbors(v1);\n\tdouble c_min = 1.0;\n\n\tfor(unsigned long i = 0; i < N1.size(); ++i)\n\tif( m->face_mark(N1[i]) == 1 )\n\t{\n\t    const MxFace& f = m->face(N1[i]);\n\t    Vec3 f_after[3];\n\t    for(unsigned long j=0; j<3; j++)\n\t\tf_after[j] = (f[j]==v1)?Vec3(vnew):Vec3(m->vertex(f[j]));\n\n\t    double c=triangle_compactness(f_after[0], f_after[1], f_after[2]);\n\n\t    if( c < c_min ) c_min = c;\n\t}\n\n\treturn c_min;\n}\n\ndouble MxEdgeQSlim::check_local_inversion(unsigned long v1,unsigned long/*v2*/,const double *vnew)\n{\n\tdouble Nmin = 1.0;\n\tconst face_list_t& N1 = m->neighbors(v1);\n\n\tfor(unsigned long i = 0; i < N1.size(); ++i)\n\tif( m->face_mark(N1[i]) == 1 )\n\t{\n\t    const MxFace& f = m->face(N1[i]);\n\t    Vec3 n_before;\n\t    m->compute_face_normal(N1[i], n_before);\n\n\t    Vec3 f_after[3];\n\t    for(unsigned long j=0; j<3; j++)\n\t\tf_after[j] = (f[j]==v1)?Vec3(vnew):Vec3(m->vertex(f[j]));\n\n\t    double delta = n_before *\n\t\ttriangle_normal(f_after[0], f_after[1], f_after[2]);\n\n\t    if( delta < Nmin ) Nmin = delta;\n\t}\n\n\treturn Nmin;\n}\n\nunsigned long MxEdgeQSlim::check_local_validity(unsigned long v1, unsigned long /*v2*/, const double *vnew)\n\n{\n\tconst face_list_t& N1 = m->neighbors(v1);\n\tunsigned long nfailed = 0;\n\n\tfor(unsigned long i = 0; i < N1.size(); ++i)\n\tif( m->face_mark(N1[i]) == 1 )\n\t{\n\t    MxFace& f = m->face(N1[i]);\n\t    unsigned long k = f.find_vertex(v1);\n\t    unsigned long x = f[(k+1)%3];\n\t    unsigned long y = f[(k+2)%3];\n\n\t\tVec3 d_yx = m->vertex(y) - m->vertex(x); // d_yx = y-x\n\t\tVec3 d_vx = m->vertex(v1) - m->vertex(x); // d_vx = v-x\n\t\tVec3 d_vnew = vnew - m->vertex(x); // d_vnew = vnew-x\n\n\t\tVec3 f_n = d_yx ^ d_vx;\n\t\tVec3 n = f_n ^ d_yx; // n = ((y-x)^(v-x))^(y-x)\n\t\tn.Normalize();\n\n\t    // assert(d_vx * n > -FEQ_EPS );\n\t    if(d_vnew * n < local_validity_threshold * (d_vx * n))\n\t\tnfailed++;\n\t}\n\n\treturn nfailed;\n}\n\nunsigned long MxEdgeQSlim::check_local_degree(unsigned long v1, unsigned long v2, const double *)\n{\n\tconst face_list_t& N1 = m->neighbors(v1);\n\tconst face_list_t& N2 = m->neighbors(v2);\n\tunsigned long i;\n\tunsigned long degree = 0;\n\n\t// Compute the degree of the vertex after contraction\n\tfor(i=0; i<N1.size(); i++)\n\tif( m->face_mark(N1[i]) == 1 )\n\t    degree++;\n\n\tfor(i=0; i<N2.size(); i++)\n\tif( m->face_mark(N2[i]) == 1 )\n\t    degree++;\n\n\n\tif( degree > vertex_degree_limit )\n\treturn degree - vertex_degree_limit;\n\telse\n\treturn 0;\n}\n\nvoid MxEdgeQSlim::apply_mesh_penalties(edge_info* info)\n{\n\tunsigned long i;\n\n\tconst face_list_t& N1 = m->neighbors(info->v1);\n\tconst face_list_t& N2 = m->neighbors(info->v2);\n\n\t// Set up the face marks as the check_xxx() functions expect.\n\tfor(i=0; i<N2.size(); i++) m->face_mark(N2[i], 0);\n\tfor(i=0; i<N1.size(); i++) m->face_mark(N1[i], 1);\n\tfor(i=0; i<N2.size(); i++) m->face_mark(N2[i], m->face_mark(N2[i])+1);\n\n\tdouble base_error = info->heap_key();\n\tdouble bias = 0.0;\n\n\t// Check for excess over degree bounds.\n\tunsigned long max_degree = std::max(N1.size(), N2.size());\n\tif( max_degree > vertex_degree_limit )\n\tbias += (max_degree-vertex_degree_limit) * meshing_penalty * 0.001;\n\n#if ALTERNATE_DEGREE_BIAS\n\t// ??BUG:  This code was supposed to be a slight improvement over\n\t//         the earlier version above.  But it performs worse.\n\t//         Should check into why sometime.\n\t//\n\tunsigned long degree_excess = check_local_degree(info->v1, info->v2, info->vnew);\n\tif( degree_excess )\n\tbias += degree_excess * meshing_penalty;\n#endif\n\n\t// Local validity checks\n\t//\n\tunsigned long nfailed = check_local_validity(info->v1, info->v2, info->vnew);\n\tnfailed += check_local_validity(info->v2, info->v1, info->vnew);\n\tif( nfailed )\n\tbias += nfailed*meshing_penalty;\n\n\tif( compactness_ratio > 0.0 )\n\t{\n\tdouble c1_min=check_local_compactness(info->v1, info->v2, info->vnew);\n\tdouble c2_min=check_local_compactness(info->v2, info->v1, info->vnew);\n\tdouble c_min = std::min(c1_min, c2_min);\n\n\t// !!BUG: There's a small problem with this: it ignores the scale\n\t//        of the errors when adding the bias.  For instance, enabling\n\t//        this on the cow produces bad results.  I also tried\n\t//        += (base_error + FEQ_EPS) * (2-c_min), but that works\n\t//        poorly on the flat planar thing.  A better solution is\n\t//        clearly needed.\n\t//\n\t//  NOTE: The prior heuristic was\n\t//        if( ratio*cmin_before > cmin_after ) apply penalty;\n\t//\n\tif( c_min < compactness_ratio )\n\t    bias += (1-c_min);\n\t}\n\n#if USE_OLD_INVERSION_CHECK\n\tdouble Nmin1 = check_local_inversion(info->v1, info->v2, info->vnew);\n\tdouble Nmin2 = check_local_inversion(info->v2, info->v1, info->vnew);\n\tif( std::min(Nmin1, Nmin2) < 0.0 )\n\tbias += meshing_penalty;\n#endif\n\n\tinfo->heap_key(base_error - bias);\n}\n\nvoid MxEdgeQSlim::compute_target_placement(edge_info* info)\n{\n\tMxVertexID i=info->v1, j=info->v2;\n\n\tconst Quadric &Qi=quadrics[i], &Qj=quadrics[j];\n\n\tQuadric Q = Qi;  Q += Qj;\n\tdouble e_min;\n\n\tif( placement_policy==MX_PLACE_OPTIMAL &&\n\tQ.optimize(&info->vnew[X], &info->vnew[Y], &info->vnew[Z]) )\n\t{\n\te_min = Q.evaluate(info->vnew);\n\t}\n\telse\n\t{\n\tVec3 vi(m->vertex(i)), vj(m->vertex(j));\n\tVec3 best;\n\n\tif( placement_policy>=MX_PLACE_LINE && Q.optimize(best, vi, vj) )\n\t    e_min = Q.evaluate(best);\n\telse\n\t{\n\t    double ei = Q.evaluate(vi), ej = Q.evaluate(vj);\n\n\t    if( ei < ej ) { e_min = ei; best = vi; }\n\t    else          { e_min = ej; best = vj; }\n\n\t    if( placement_policy>=MX_PLACE_ENDORMID )\n\t    {\n\t\tVec3 mid = (vi+vj)/2;\n\t\tdouble e_mid = Q.evaluate(mid);\n\n\t\tif( e_mid < e_min ) { e_min = e_mid; best = mid; }\n\t    }\n\t}\n\n\tinfo->vnew[X] = best[X];\n\tinfo->vnew[Y] = best[Y];\n\tinfo->vnew[Z] = best[Z];\n\t}\n\n\tif( weighting_policy == MX_WEIGHT_AREA_AVG )\n\te_min /= Q.area();\n\n\tinfo->heap_key(-e_min);\n}\n\nvoid MxEdgeQSlim::finalize_edge_update(edge_info* info)\n{\n\tif(meshing_penalty > 1)\n\t\tapply_mesh_penalties(info);\n\n\tif(info->is_in_heap())\n\t\theap->update(info);\n\telse\n\t\theap->insert(info);\n}\n\n\nvoid MxEdgeQSlim::compute_edge_info(edge_info* info)\n{\n\tcompute_target_placement(info);\n\n\tfinalize_edge_update(info);\n}\n\nvoid MxEdgeQSlim::create_edge(MxVertexID i, MxVertexID j)\n{\n\tedge_info* info = new edge_info;\n\n\tedge_links[i].push_back(info);\n\tedge_links[j].push_back(info);\n\n\tinfo->v1 = i;\n\tinfo->v2 = j;\n\n\tcompute_edge_info(info);\n}\n\nvoid MxEdgeQSlim::collect_edges()\n{\n\n\tfor(MxVertexID i = 0; i < m->vert_count(); ++i)\n\t{\n\t\tvertex_list_t star;\n\t\tm->collect_vertex_star(i, star);\n\n\t\tfor(unsigned long j = 0; j < star.size(); ++j)\n\t\tif(i < star[j])\n\t\t\t// Only add particular edge once\n\t\t\tcreate_edge(i, star[j]);\n\t}\n}\n\nvoid MxEdgeQSlim::initialize()\n{\n\tMxQSlim::initialize();\n\tcollect_edges();\n}\n\nvoid MxEdgeQSlim::initialize(const std::vector<MxEdge>& edges, unsigned long count)\n{\n\tMxQSlim::initialize();\n\tfor(unsigned long i=0; i<count; i++)\n\tcreate_edge(edges[i].v1, edges[i].v2);\n}\n\nvoid MxEdgeQSlim::update_pre_contract(const MxPairContraction& conx)\n{\n\tMxVertexID v1=conx.v1, v2=conx.v2;\n\tstar.clear();\n\n\t// Before, I was gathering the vertex \"star\" using:\n\t//      m->collect_vertex_star(v1, star);\n\t// This doesn't work when we initially begin with a subset of\n\t// the total edges.  Instead, we need to collect the \"star\"\n\t// from the edge links maintained at v1.\n\tfor(unsigned long i = 0; i < edge_links[v1].size(); ++i)\n\t\tstar.push_back(edge_links[v1][i]->opposite_vertex(v1));\n\n\tfor(unsigned long i = 0; i < edge_links[v2].size(); ++i)\n\t{\n\tedge_info* e = edge_links[v2][i];\n\tMxVertexID u = (e->v1==v2)?e->v2:e->v1;\n\tassert_warning( e->v1==v2 || e->v2==v2 );\n\tassert_warning( u!=v2 );\n\n\tif( u==v1 || (std::find(star.begin(), star.end(), u) != star.end()) )\n\t{\n\t\t// This is a useless link --- kill it\n\t\tedge_list::iterator edge = std::find(edge_links[u].begin(), edge_links[u].end(), e);\n\t\tbool found = edge != edge_links[u].end();\n\t\tassert_warning(found);\n\t\tedge_links[u].erase(edge);\n\n\t\theap->remove(e);\n\t\tif(u != v1) delete e; // (v1,v2) will be deleted later\n\t}\n\telse\n\t{\n\t    // Relink this to v1\n\t    e->v1 = v1;\n\t    e->v2 = u;\n\t    edge_links[v1].push_back(e);\n\t}\n\t}\n\n\tedge_links[v2].clear();\n}\n\nvoid MxEdgeQSlim::update_post_contract(const MxPairContraction& conx)\n{\n}\n\nvoid MxEdgeQSlim::apply_contraction(const MxPairContraction& conx)\n{\n\t// Pre-contraction update\n\tvalid_verts--;\n\tvalid_faces -= conx.dead_faces.size();\n\tquadrics[conx.v1] += quadrics[conx.v2];\n\n\tupdate_pre_contract(conx);\n\n\tm->apply_contraction(conx);\n\n\tupdate_post_contract(conx);\n\n\t// Must update edge info here so that the meshing penalties\n\t// will be computed with respect to the new mesh rather than the old\n\tfor(unsigned long i = 0; i < edge_links[conx.v1].size(); ++i)\n\t\tcompute_edge_info(edge_links[conx.v1][i]);\n}\n\nvoid MxEdgeQSlim::update_pre_expand(const MxPairContraction&)\n{\n}\n\nvoid MxEdgeQSlim::update_post_expand(const MxPairContraction& conx)\n{\n\tMxVertexID v1=conx.v1, v2=conx.v2;\n\n\tstar.clear(); star2.clear();\n\tedge_links[conx.v2].clear();\n\tm->collect_vertex_star(conx.v1, star);\n\tm->collect_vertex_star(conx.v2, star2);\n\n\tunsigned long i = 0;\n\twhile(i < edge_links[v1].size())\n\t{\n\tedge_info *e = edge_links[v1][i];\n\tMxVertexID u = (e->v1==v1)?e->v2:e->v1;\n\tassert_warning( e->v1==v1 || e->v2==v1 );\n\tassert_warning( u!=v1 && u!=v2 );\n\n\tbool v1_linked = std::find(star.begin(), star.end(), u) == star.end();\n\tbool v2_linked = std::find(star2.begin(), star2.end(), u) == star2.end();\n\n\tif( v1_linked )\n\t{\n\t    if( v2_linked )  create_edge(v2, u);\n\t    i++;\n\t}\n\telse\n\t{\n\t    // !! BUG: I expected this to be true, but it's not.\n\t    //         Need to find out why, and whether it's my\n\t    //         expectation or the code that's wrong.\n\t    // assert_warning(v2_linked);\n\t    e->v1 = v2;\n\t    e->v2 = u;\n\t    edge_links[v2].push_back(e);\n\t    edge_links[v1].erase(edge_links[v1].begin() + i);\n\t}\n\n\tcompute_edge_info(e);\n\t}\n\n\tif(std::find(star.begin(), star.end(), v2) != star.end())\n\t\t// ?? BUG: Is it legitimate for there not to be an edge here ??\n\t\tcreate_edge(v1, v2);\n}\n\n\nvoid MxEdgeQSlim::apply_expansion(const MxPairContraction& conx)\n{\n\tupdate_pre_expand(conx);\n\n\tm->apply_expansion(conx);\n\n\t//\n\t// Post-expansion update\n\tvalid_verts++;\n\tvalid_faces += conx.dead_faces.size();\n\tquadrics[conx.v1] -= quadrics[conx.v2];\n\n\tupdate_post_expand(conx);\n}\n\nbool MxEdgeQSlim::decimate(unsigned long target)\n{\n\tMxPairContraction local_conx;\n\n\twhile(valid_faces > target)\n\t\t{\n\t\t\tedge_info* info = (edge_info*)heap->extract();\n\t\t\tif(!info)\n\t\t\t\treturn false;\n\n\t\t\tMxVertexID v1=info->v1;\n\t\t\tMxVertexID v2=info->v2;\n\n\tif( m->vertex_is_valid(v1) && m->vertex_is_valid(v2) )\n\t{\n\t    MxPairContraction& conx = local_conx;\n\n\t    m->compute_contraction(v1, v2, &conx, info->vnew);\n\n\t    if( will_join_only && conx.dead_faces.size() > 0 )\n\t\t\tcontinue;\n\n\t    apply_contraction(conx);\n\t}\n\n\tdelete info;\n\t\t}\n\n\treturn true;\n}\n\n\nMxFaceQSlim::MxFaceQSlim(MxStdModel& _m) :\n\tMxQSlim(_m)\n{\n}\n\nvoid MxFaceQSlim::initialize()\n{\n\tMxQSlim::initialize();\n\n\tf_info.resize(m->face_count());\n\tfor(MxFaceID f = 0; f < m->face_count(); ++f)\n\t\tcompute_face_info(f);\n}\n\nvoid MxFaceQSlim::compute_face_info(MxFaceID f)\n{\n\ttri_info& info = f_info[f];\n\tinfo.f = f;\n\n\tMxVertexID i = m->face(f)[0];\n\tMxVertexID j = m->face(f)[1];\n\tMxVertexID k = m->face(f)[2];\n\n\tconst Quadric& Qi = quadrics[i];\n\tconst Quadric& Qj = quadrics[j];\n\tconst Quadric& Qk = quadrics[k];\n\n\tQuadric Q = Qi;\n\tQ += Qj;\n\tQ += Qk;\n\n\tif( placement_policy == MX_PLACE_OPTIMAL &&\n\t\tQ.optimize(&info.vnew[X], &info.vnew[Y], &info.vnew[Z]) )\n\t\t{\n\t\t\tinfo.heap_key(-Q.evaluate(info.vnew));\n\t\t}\n\t\telse\n\t\t{\n\t  Vec3 v1(m->vertex(i)), v2(m->vertex(j)), v3(m->vertex(k));\n\t  double e1 = Q.evaluate(v1), e2 = Q.evaluate(v2), e3 = Q.evaluate(v3);\n\n\t  Vec3 best;\n\t  double e_min;\n\n\t  if( e1<=e2 && e1<=e3 ) { e_min=e1; best=v1; }\n\t  else if( e2<=e1 && e2<=e3 ) { e_min=e2; best=v2; }\n\t  else { e_min=e3; best=v3; }\n\n\t\t\tinfo.vnew[X] = best[X];\n\t\t\tinfo.vnew[Y] = best[Y];\n\t\t\tinfo.vnew[Z] = best[Z];\n\t\t\tinfo.heap_key(-e_min);\n\t\t}\n\n\tif(weighting_policy == MX_WEIGHT_AREA_AVG)\n\t\tinfo.heap_key(info.heap_key() / Q.area());\n\n\tif(info.is_in_heap())\n\t\theap->update(&info);\n\telse\n\t\theap->insert(&info);\n}\n\nbool MxFaceQSlim::decimate(unsigned long target)\n{\n\tface_list_t changed;\n\twhile(valid_faces > target)\n\t\t{\n\t\t\ttri_info* info = (tri_info*)heap->extract();\n\t\t\tif(!info)\n\t\t\t\treturn false;\n\n\t\t\tMxFaceID f = info->f;\n\t\t\tMxVertexID v1 = m->face(f)[0],\n\t\t\tv2 = m->face(f)[1],\n\t\t\tv3 = m->face(f)[2];\n\n\t\t\tif(m->face_is_valid(f))\n\t\t\t\t{\n\t\t\t\t\t// Perform the actual contractions\n\t\t\t\t\tm->contract(v1, v2, v3, info->vnew, changed);\n\n\t\t\t\t\t// Update quadric of v1\n\t\t\t\t\tquadrics[v1] += quadrics[v2];\n\t\t\t\t\tquadrics[v1] += quadrics[v3];\n\n\t\t\t\t\t// Update valid counts\n\t\t\t\t\tvalid_verts -= 2;\n\t\t\t\t\tfor(unsigned long i=0; i<changed.size(); i++)\n\t\t\t\t\t\tif(!m->face_is_valid(changed[i]))\n\t\t\t\t\t\t\tvalid_faces--;\n\n\t\t\t\t\tfor(unsigned long i=0; i<changed.size(); i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(m->face_is_valid(changed[i]))\n\t\t\t\t\t\t\t\tcompute_face_info(changed[i]);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\theap->remove(&f_info[changed[i]]);\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\n\treturn true;\n}\n\n\n"
  },
  {
    "path": "modules/qslim/MxQSlim.h",
    "content": "#ifndef MXQSLIM_INCLUDED\n#define MXQSLIM_INCLUDED\n\n// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Surface simplification using quadric error metrics\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"MxStdSlim.h\"\n#include \"MxQMetric3.h\"\n\n#include \"MxHeap.h\"\n\n#include <vector>\n\nclass MxQSlim :\n\tpublic MxStdSlim\n{\nprotected:\n\tHeap* heap;\n\tstd::vector<MxQuadric3> quadrics;\n\n\tvoid discontinuity_constraint(MxVertexID, MxVertexID, const face_list_t&);\n\tvoid collect_quadrics();\n\tvoid constrain_boundaries();\n\npublic:\n\tMxQSlim(MxStdModel& _m) :\n\t\tMxStdSlim(&_m)\n\t{\n\t\theap = new Heap(64);\n\t\tquadrics.resize(_m.vert_count());\n\t}\n\n\tvirtual ~MxQSlim() {}\n\n\tvirtual void initialize();\n\n\tconst MxQuadric3& vertex_quadric(MxVertexID v) { return quadrics[v]; }\n};\n\nclass MxEdgeQSlim :\n\tpublic MxQSlim\n{\nprivate:\n\tclass edge_info :\n\t\tpublic MxEdge, public Heapable\n\t{\n\tpublic:\n\t\tdouble vnew[3];\n\t};\n\n\ttypedef std::vector<edge_info*> edge_list;\n\tstd::vector<edge_list> edge_links;\n\n\t// Temporary variables used by methods\n\tvertex_list_t star, star2;\n\nprotected:\n\tdouble check_local_compactness(unsigned long v1, unsigned long v2, const double *vnew);\n\tdouble check_local_inversion(unsigned long v1, unsigned long v2, const double *vnew);\n\tunsigned long check_local_validity(unsigned long v1, unsigned long v2, const double *vnew);\n\tunsigned long check_local_degree(unsigned long v1, unsigned long v2, const double *vnew);\n\tvoid apply_mesh_penalties(edge_info*);\n\tvoid create_edge(MxVertexID i, MxVertexID j);\n\tvoid collect_edges();\n\n\tvoid compute_target_placement(edge_info*);\n\tvoid finalize_edge_update(edge_info*);\n\n\tvirtual void compute_edge_info(edge_info*);\n\tvirtual void update_pre_contract(const MxPairContraction&);\n\tvirtual void update_post_contract(const MxPairContraction&);\n\tvirtual void update_pre_expand(const MxPairContraction&);\n\tvirtual void update_post_expand(const MxPairContraction&);\n\npublic:\n\tMxEdgeQSlim(MxStdModel&);\n\tvirtual ~MxEdgeQSlim();\n\n\tvoid initialize();\n\tvoid initialize(const std::vector<MxEdge>& edges, unsigned long count);\n\tbool decimate(unsigned long target);\n\n\tvoid apply_contraction(const MxPairContraction& conx);\n\tvoid apply_expansion(const MxPairContraction& conx);\n};\n\nclass MxFaceQSlim :\n\tpublic MxQSlim\n{\nprivate:\n\tclass tri_info :\n\t\tpublic Heapable\n\t{\n\tpublic:\n\t\tMxFaceID f;\n\t\tdouble vnew[3];\n\t};\n\n\tstd::vector<tri_info> f_info;\n\n\tvoid compute_face_info(MxFaceID);\n\npublic:\n\tMxFaceQSlim(MxStdModel&);\n\n\tvoid initialize();\n\tbool decimate(unsigned long target);\n};\n\n#endif // MXQSLIM_INCLUDED\n\n"
  },
  {
    "path": "modules/qslim/MxStdModel.cpp",
    "content": "// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief MStdModel\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3dsdk/result.h>\n\n#include \"MxStdModel.h\"\n\n#include <algorithm>\n\nMxPairContraction& MxPairContraction::operator=(const MxPairContraction& c)\n{\n\tv1 = c.v1;\n\tv2 = c.v2;\n\tdv1 = c.dv1;\n\tdv2 = c.dv2;\n\n\tdelta_faces.clear();\n\tdead_faces.clear();\n\n\tfor(unsigned long i=0; i<c.delta_faces.size(); i++)\n\t\tdelta_faces.push_back(c.delta_faces[i]);\n\tfor(unsigned long j=0; j<c.dead_faces.size(); j++)\n\t\tdead_faces.push_back(c.dead_faces[j]);\n\n\tdelta_pivot = c.delta_pivot;\n\n\treturn *this;\n}\n\nMxVertexID MxStdModel::alloc_vertex(double x, double y, double z)\n{\n\tMxVertexID id = MxBlockModel::alloc_vertex(x,y,z);\n\t// !!\n\tvertex_data new_v;\n\tnew_v.tag = 0x0;\n\tnew_v.user_tag = 0x0;\n\tv_data.push_back(new_v);\n\n\tvertex_mark_valid(id);\n\n\tunsigned long l = face_links.size();\n\tface_links.push_back(face_list_t());\n\tassert_warning( l == id );\n\tassert_warning( neighbors(id).size() == 0 );\n\n\treturn id;\n}\n\nvoid MxStdModel::free_vertex(MxVertexID v)\n{\n\tface_links.erase(face_links.begin() + v);\n\tv_data.erase(v_data.begin() + v);\n}\n\nMxFaceID MxStdModel::alloc_face(MxVertexID v1, MxVertexID v2, MxVertexID v3)\n{\n\tMxFaceID id = MxBlockModel::alloc_face(v1,v2,v3);\n\tface_data new_data;\n\tnew_data.tag = 0x0;\n\tnew_data.user_tag = 0x0;\n\tf_data.push_back(new_data);\n\tface_mark_valid(id);\n\n\treturn id;\n}\n\nvoid MxStdModel::free_face(MxFaceID f)\n{\n\tf_data.erase(f_data.begin() + f);\n}\n\nvoid MxStdModel::init_face(MxFaceID id)\n{\n\tneighbors(face(id).v[0]).push_back(id);\n\tneighbors(face(id).v[1]).push_back(id);\n\tneighbors(face(id).v[2]).push_back(id);\n}\n\nvoid MxStdModel::mark_neighborhood(MxVertexID vid, unsigned short mark)\n{\n\tassert_warning(vid < vert_count());\n\n\tfor(unsigned long i = 0; i < neighbors(vid).size(); ++i)\n\t{\n\t\tunsigned int f = neighbors(vid)[i];\n\t\tfmark(f, mark);\n\t}\n}\n\nvoid MxStdModel::collect_unmarked_neighbors(MxVertexID vid, face_list_t& faces)\n{\n\tassert_warning(vid < vert_count());\n\n\tfor(unsigned long i = 0; i < neighbors(vid).size(); ++i)\n\t{\n\tunsigned int fid = neighbors(vid)[i];\n\tif( !fmark(fid) )\n\t{\n\t    faces.push_back(fid);\n\t    fmark(fid, 1);\n\t}\n\t}\n}\n\nvoid MxStdModel::mark_neighborhood_delta(MxVertexID vid, short delta)\n{\n\tassert_warning( vid < vert_count() );\n\tfor(unsigned long i=0; i<neighbors(vid).size(); i++)\n\t{\n\tunsigned long f = neighbors(vid)[i];\n\tfmark(f, fmark(f)+delta);\n\t}\n}\n\nvoid MxStdModel::partition_marked_neighbors(MxVertexID v, unsigned short pivot,\n\t\t\t\t\t    face_list_t& lo, face_list_t& hi)\n{\n\tassert_warning(v < vert_count());\n\tfor(unsigned long i=0; i<neighbors(v).size(); i++)\n\t{\n\tunsigned long f = neighbors(v)[i];\n\tif( fmark(f) )\n\t{\n\t    if( fmark(f) < pivot )  lo.push_back(f);\n\t    else  hi.push_back(f);\n\t    fmark(f, 0);\n\t}\n\t}\n}\n\nvoid MxStdModel::mark_corners(const face_list_t& faces, unsigned short mark)\n{\n\tfor(unsigned long i = 0; i < faces.size(); ++i)\n\t\tfor(unsigned long j = 0; j < 3; ++j)\n\t\t\tvmark(face(faces[i])[j], mark);\n}\n\nvoid MxStdModel::collect_unmarked_corners(const face_list_t& faces, vertex_list_t& verts)\n{\n\tfor(unsigned long i = 0; i < faces.size(); ++i)\n\tfor(unsigned long j = 0; j < 3; ++j)\n\t{\n\t    MxVertexID v = face(faces[i])[j];\n\t    if( !vmark(v) )\n\t    {\n\t\tverts.push_back(v);\n\t\tvmark(v, 1);\n\t    }\n\t}\n}\n\nvoid MxStdModel::collect_edge_neighbors(unsigned int v1, unsigned int v2, face_list_t& faces)\n{\n\tmark_neighborhood(v1, 1);\n\tmark_neighborhood(v2, 0);\n\tcollect_unmarked_neighbors(v1, faces);\n}\n\nvoid MxStdModel::collect_vertex_star(unsigned int v, vertex_list_t& verts)\n{\n\tconst face_list_t& N = neighbors(v);\n\n\tmark_corners(N, 0);\n\tvmark(v, 1); // Don't want to include v in the star\n\tcollect_unmarked_corners(N, verts);\n}\n\n\nvoid MxStdModel::remap_vertex(unsigned int from, unsigned int to)\n{\n\tassert_warning( from < vert_count() );\n\tassert_warning( to < vert_count() );\n\tassert_warning( vertex_is_valid(from) );\n\tassert_warning( vertex_is_valid(to) );\n\n\tfor(unsigned int i=0; i<neighbors(from).size(); i++)\n\tface(neighbors(from)[i]).remap_vertex(from, to);\n\n\tmark_neighborhood(from, 0);\n\tmark_neighborhood(to, 1);\n\tcollect_unmarked_neighbors(from, neighbors(to));\n\n\tvertex_mark_invalid(from);\n\t// Remove links in old vertex\n\tneighbors(from).clear();\n}\n\nunsigned int MxStdModel::split_edge(unsigned int a, unsigned int b)\n{\n\tdouble *v1 = vertex(a), *v2 = vertex(b);\n\n\treturn split_edge(a, b,\n\t                  (v1[X] + v2[X])/2.0f,\n\t                  (v1[Y] + v2[Y])/2.0f,\n\t                  (v1[Z] + v2[Z])/2.0f);\n}\n\nstatic\nvoid remove_neighbor(face_list_t& faces, unsigned long f)\n{\n\tface_list_t::iterator face = std::find(faces.begin(), faces.end(), f);\n\tif(face != faces.end())\n\t\tfaces.erase(face);\n}\n\nunsigned int MxStdModel::split_edge(unsigned int v1, unsigned int v2,\n\t\t\t    double x, double y, double z)\n{\n\tassert_warning( v1 < vert_count() );   assert_warning( v2 < vert_count() );\n\tassert_warning( vertex_is_valid(v1) ); assert_warning( vertex_is_valid(v2) );\n\tassert_warning( v1 != v2 );\n\n\tface_list_t faces;\n\tcollect_edge_neighbors(v1, v2, faces);\n\tassert_warning(faces.size() > 0);\n\n\tunsigned int vnew = add_vertex(x,y,z);\n\n\tfor(unsigned long i = 0; i < faces.size(); ++i)\n\t{\n\tunsigned int f = faces[i];\n\tunsigned int v3 = face(f).opposite_vertex(v1, v2);\n\tassert_warning( v3!=v1 && v3!=v2 );\n\tassert_warning( vertex_is_valid(v3) );\n\n\t// in f, remap v2-->vnew\n\tface(f).remap_vertex(v2, vnew);\n\tneighbors(vnew).push_back(f);\n\n\t// remove f from neighbors(v2)\n\tremove_neighbor(neighbors(v2), f);\n\n\t// assure orientation is consistent\n\tif( face(f).is_inorder(vnew, v3) )\n\t    add_face(vnew, v2, v3);\n\telse\n\t    add_face(vnew, v3, v2);\n\t}\n\n\treturn vnew;\n}\n\nvoid MxStdModel::flip_edge(unsigned int v1, unsigned int v2)\n{\n\tface_list_t faces;\n\tcollect_edge_neighbors(v1, v2, faces);\n\tif(faces.size() != 2 )\n\t\treturn;\n\n\tunsigned int f1 = faces[0];\n\tunsigned int f2 = faces[1];\n\tunsigned int v3 = face(f1).opposite_vertex(v1, v2);\n\tunsigned int v4 = face(f2).opposite_vertex(v1, v2);\n\n\t// ?? Should we check for convexity or assume thats been taken care of?\n\n\tremove_neighbor(neighbors(v1), f2);\n\tremove_neighbor(neighbors(v2), f1);\n\tneighbors(v3).push_back(f2);\n\tneighbors(v4).push_back(f1);\n\n\tface(f1).remap_vertex(v2, v4);\n\tface(f2).remap_vertex(v1, v3);\n}\n\nvoid MxStdModel::split_face4(unsigned int f, unsigned int *newverts)\n{\n\tunsigned int v0 = face(f).v[0];\n\tunsigned int v1 = face(f).v[1];\n\tunsigned int v2 = face(f).v[2];\n\n\tunsigned int pivot = split_edge(v0, v1);\n\tunsigned int new1 = split_edge(v1, v2);\n\tunsigned int new2 = split_edge(v0, v2);\n\n\tif( newverts )\n\t{\n\tnewverts[0] = pivot;\n\tnewverts[1] = new1;\n\tnewverts[2] = new2;\n\t}\n\n\tflip_edge(pivot, v2);\n}\n\nvoid MxStdModel::compact_vertices()\n{\n\tMxVertexID oldID;\n\tMxVertexID newID = 0;\n\n\tfor(oldID=0; oldID<vert_count(); oldID++)\n\t{\n\tif( vertex_is_valid(oldID) )\n\t{\n\t    if( newID != oldID )\n\t    {\n\t\tvertex(newID) = vertex(oldID);\n\n\t\t// Because we'll be freeing the link lists for the\n\t\t// old vertices, we actually have to swap values instead\n\t\t// of the simple copying in the block above.\n\t\t//\n\t\tface_list_t t = face_links[newID];\n\t\tface_links[newID] = face_links[oldID];\n\t\tface_links[oldID] = t;\n\n\t\tvertex_mark_valid(newID);\n\n\t\tfor(unsigned int i=0; i<neighbors(newID).size(); i++)\n\t\t    face(neighbors(newID)[i]).remap_vertex(oldID, newID);\n\t    }\n\t    newID++;\n\t}\n\t}\n\n\tfor(oldID = newID; newID < vert_count(); )\n\tremove_vertex(oldID);\n}\n\nvoid MxStdModel::unlink_face(MxFaceID fid)\n{\n\tMxFace& f = face(fid);\n\tface_mark_invalid(fid);\n\n\tint found = 0;\n\tface_list_t::iterator face;\n\n\tfor(unsigned long n = 0; n < 3; n++)\n\t\t{\n\t\t\tface = std::find(neighbors(f[n]).begin(), neighbors(f[n]).end(), fid);\n\t\t\tif(face != neighbors(f[n]).end())\n\t\t\t\t{\n\t\t\t\t\tfound++;\n\t\t\t\t\tneighbors(f[n]).erase(face);\n\t\t\t\t}\n\t\t}\n\n\tassert_warning( found > 0 );\n\n\tfor(unsigned long n = 0; n < 3; n++)\n\t\tassert_warning(std::find(neighbors(f[n]).begin(), neighbors(f[n]).end(), fid) == neighbors(f[n]).end());\n}\n\nvoid MxStdModel::remove_degeneracy(face_list_t& faces)\n{\n\tfor(unsigned long i = 0; i < faces.size(); ++i)\n\t{\n\tassert_warning( face_is_valid(faces[i]) );\n\tMxFace& f = face(faces[i]);\n\n\tif( f[0]==f[1] || f[1]==f[2] || f[0]==f[2] )\n\t    unlink_face(faces[i]);\n\t}\n}\n\ninline double* mxv_sub(double* r, const double* u, const double* v, const unsigned int N)\n{\n\tfor(unsigned int i = 0; i < 3; i++)\n\t\tr[i] = u[i] - v[i];\n\n\treturn r;\n}\n\nvoid MxStdModel::compute_contraction(MxVertexID v1, MxVertexID v2,\n\t\t\t\t     MxPairContraction *conx,\n\t\t\t\t     const double *vnew)\n{\n\tconx->v1 = v1;\n\tconx->v2 = v2;\n\n\tif( vnew )\n\t{\n\tmxv_sub(conx->dv1, vnew, vertex(v1), 3);\n\tmxv_sub(conx->dv2, vnew, vertex(v2), 3);\n\t}\n\telse\n\t{\n\tconx->dv1[X] = conx->dv1[Y] = conx->dv1[Z] = 0.0;\n\tconx->dv2[X] = conx->dv2[Y] = conx->dv2[Z] = 0.0;\n\t}\n\n\tconx->delta_faces.clear();\n\tconx->dead_faces.clear();\n\n\n\t// Mark the neighborhood of (v1,v2) such that each face is\n\t// tagged with the number of times the vertices v1,v2 occur\n\t// in it.  Possible values are 1 or 2.\n\t//\n\tmark_neighborhood(v2, 0);\n\tmark_neighborhood(v1, 1);\n\tmark_neighborhood_delta(v2, 1);\n\n\n\t// Now partition the neighborhood of (v1,v2) into those faces\n\t// which degenerate during contraction and those which are merely\n\t// reshaped.\n\t//\n\tpartition_marked_neighbors(v1, 2, conx->delta_faces, conx->dead_faces);\n\tconx->delta_pivot = conx->delta_faces.size();\n\tpartition_marked_neighbors(v2, 2, conx->delta_faces, conx->dead_faces);\n}\n\nvoid MxStdModel::apply_contraction(const MxPairContraction& conx)\n{\n\tMxVertexID v1=conx.v1, v2=conx.v2;\n\n\t// Move v1 to new position\n\tvertex(v1).pos += conx.dv1;\n\n\t// Remove dead faces\n\tfor(unsigned long i = 0; i < conx.dead_faces.size(); ++i)\n\t\tunlink_face(conx.dead_faces[i]);\n\n\t// Update changed faces\n\tfor(unsigned long i = conx.delta_pivot; i < conx.delta_faces.size(); ++i)\n\t\t{\n\t\t\tMxFaceID fid = conx.delta_faces[i];\n\t\t\tface(fid).remap_vertex(v2, v1);\n\t\t\tneighbors(v1).push_back(fid);\n\t\t}\n\n\t// Kill v2\n\tvertex_mark_invalid(v2);\n\tneighbors(v2).clear();\n}\n\nvoid MxStdModel::apply_expansion(const MxPairExpansion& conx)\n{\n\tMxVertexID v1=conx.v1, v2=conx.v2;\n\n\tvertex(v2).pos = vertex(v1).pos - conx.dv2;\n\tvertex(v1).pos -= conx.dv1;\n\n\tfor(unsigned long i = 0; i < conx.dead_faces.size(); ++i)\n\t{\n\tMxFaceID fid = conx.dead_faces[i];\n\tface_mark_valid(fid);\n\tneighbors(face(fid)[0]).push_back(fid);\n\tneighbors(face(fid)[1]).push_back(fid);\n\tneighbors(face(fid)[2]).push_back(fid);\n\t}\n\n\tfor(unsigned long i = conx.delta_pivot; i < conx.delta_faces.size(); ++i)\n\t\t{\n\tMxFaceID fid = conx.delta_faces[i];\n\tface(fid).remap_vertex(v1, v2);\n\tneighbors(v2).push_back(fid);\n\t\t\tface_list_t::iterator f = std::find(neighbors(v1).begin(), neighbors(v1).end(), fid);\n\t\t\tbool found = f != neighbors(v1).end();\n\t\t\tassert_warning(found);\n\t\t\tneighbors(v1).erase(f);\n\t\t}\n\n\tvertex_mark_valid(v2);\n}\n\n\nvoid MxStdModel::contract(MxVertexID v1, MxVertexID v2,\n\t\t\t  const double *vnew, MxPairContraction *conx)\n{\n\tcompute_contraction(v1, v2, conx);\n\tconx->dv1 = vnew - vertex(v1).pos;\n\tconx->dv2 = vnew - vertex(v2).pos;\n\tapply_contraction(*conx);\n}\n\nvoid MxStdModel::compute_contraction(MxFaceID fid, MxFaceContraction *conx)\n{\n\tconst MxFace& f = face(fid);\n\n\tconx->f = fid;\n\tconx->dv1[X] = conx->dv1[Y] = conx->dv1[Z] = 0.0;\n\tconx->dv2[X] = conx->dv2[Y] = conx->dv2[Z] = 0.0;\n\tconx->dv3[X] = conx->dv3[Y] = conx->dv3[Z] = 0.0;\n\n\tconx->delta_faces.clear();\n\tconx->dead_faces.clear();\n\n\n\tmark_neighborhood(f[0], 0);\n\tmark_neighborhood(f[1], 0);\n\tmark_neighborhood(f[2], 0);\n\n\tmark_neighborhood(f[0], 1);\n\tmark_neighborhood_delta(f[1], +1);\n\tmark_neighborhood_delta(f[2], +1);\n\n\tfmark(fid, 0);\t\t// don't include f in dead_faces\n\n\tpartition_marked_neighbors(f[0], 2, conx->delta_faces, conx->dead_faces);\n\tpartition_marked_neighbors(f[1], 2, conx->delta_faces, conx->dead_faces);\n\tpartition_marked_neighbors(f[2], 2, conx->delta_faces, conx->dead_faces);\n}\n\nvoid MxStdModel::contract(MxVertexID v1, MxVertexID v2, MxVertexID v3,\n\t\t\t  const double *vnew,\n\t\t\t  face_list_t& changed)\n{\n\tmark_neighborhood(v1, 0);\n\tmark_neighborhood(v2, 0);\n\tmark_neighborhood(v3, 0);\n\tchanged.clear();\n\tcollect_unmarked_neighbors(v1, changed);\n\tcollect_unmarked_neighbors(v2, changed);\n\tcollect_unmarked_neighbors(v3, changed);\n\n\t// Move v1 to vnew\n\tvertex(v1)[0] = vnew[X];\n\tvertex(v1)[1] = vnew[Y];\n\tvertex(v1)[2] = vnew[Z];\n\n\t// Replace occurrences of v2 & v3 with v1\n\tremap_vertex(v2, v1);\n\tremap_vertex(v3, v1);\n\n\tremove_degeneracy(changed);\n}\n\nvoid MxStdModel::contract(MxVertexID v1, const vertex_list_t& rest,\n\t\t\t  const double *vnew, face_list_t& changed)\n{\n\t// Collect all effected faces\n\tmark_neighborhood(v1, 0);\n\tfor(unsigned long i = 0; i < rest.size(); ++i)\n\t\tmark_neighborhood(rest[i], 0);\n\n\tchanged.clear();\n\n\tcollect_unmarked_neighbors(v1, changed);\n\tfor(unsigned long i = 0; i < rest.size(); ++i)\n\t\tcollect_unmarked_neighbors(rest[i], changed);\n\n\t// Move v1 to vnew\n\tvertex(v1)[0] = vnew[X];\n\tvertex(v1)[1] = vnew[Y];\n\tvertex(v1)[2] = vnew[Z];\n\n\t// Replace all occurrences of vi with v1\n\tfor(unsigned long i = 0; i < rest.size(); ++i)\n\t\tremap_vertex(rest[i], v1);\n\n\tremove_degeneracy(changed);\n}\n\n\n"
  },
  {
    "path": "modules/qslim/MxStdModel.h",
    "content": "#ifndef MXSTDMODEL_INCLUDED\n#define MXSTDMODEL_INCLUDED\n\n// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief MxStdModel\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"MxBlockModel.h\"\n\ntypedef std::vector<unsigned long> vertex_list_t;\ntypedef std::vector<unsigned long> face_list_t;\n\nclass MxPairContraction\n{\npublic:\n\tMxPairContraction() {}\n\tMxPairContraction(const MxPairContraction& c) { *this = c; }\n\n\tMxPairContraction& operator=(const MxPairContraction& c);\n\n\tMxVertexID v1, v2;\n\tVec3 dv1;\n\tVec3 dv2; // dv2 is not really necessary\n\n\tunsigned long delta_pivot;\n\tface_list_t delta_faces;\n\tface_list_t dead_faces;\n};\n\nclass MxFaceContraction\n{\npublic:\n\tMxFaceID f;\n\tdouble dv1[3], dv2[3], dv3[3];\n\n\tface_list_t delta_faces;\n\tface_list_t dead_faces;\n};\n\ntypedef MxPairContraction MxPairExpansion;\n\n// Masks for internal tag bits\n#define MX_VALID_FLAG 0x01\n#define MX_PROXY_FLAG 0x02\n#define MX_TOUCHED_FLAG 0x04\n\nclass MxStdModel : public MxBlockModel\n{\nprivate:\n\tstruct vertex_data {\n\t    unsigned char mark, tag;             // Internal tag bits\n\t    unsigned char user_mark, user_tag;   // External tag bits\n\t};\n\tstruct face_data {\n\t    unsigned char mark, tag;             // Internal tag bits\n\t    unsigned char user_mark, user_tag;   // External tag bits\n\t};\n\n\tstd::vector<vertex_data> v_data;\n\tstd::vector<face_data> f_data;\n\tstd::vector<face_list_t> face_links;\n\nprotected:\n\n\t// Accessors for internal tag and mark bits\n\tunsigned long v_check_tag(MxVertexID i, unsigned long tag) const {return v_data[i].tag&tag;}\n\tvoid v_set_tag(MxVertexID i, unsigned long tag) { v_data[i].tag |= tag; }\n\tvoid v_unset_tag(MxVertexID i, unsigned long tag) { v_data[i].tag &= ~tag; }\n\tunsigned char vmark(MxVertexID i) const { return v_data[i].mark; }\n\tvoid vmark(MxVertexID i, unsigned char m) { v_data[i].mark = m; }\n\n\tunsigned long f_check_tag(MxFaceID i, unsigned long tag) const { return f_data[i].tag&tag; }\n\tvoid f_set_tag(MxFaceID i, unsigned long tag) { f_data[i].tag |= tag; }\n\tvoid f_unset_tag(MxFaceID i, unsigned long tag) { f_data[i].tag &= ~tag; }\n\tunsigned char fmark(MxFaceID i) const { return f_data[i].mark; }\n\tvoid fmark(MxFaceID i, unsigned char m) { f_data[i].mark = m; }\n\nprotected:\n\tMxVertexID alloc_vertex(double, double, double);\n\tvoid free_vertex(MxVertexID);\n\tvoid free_face(MxFaceID);\n\tMxFaceID alloc_face(MxVertexID, MxVertexID, MxVertexID);\n\tvoid init_face(MxFaceID);\n\npublic:\n\tMxStdModel(unsigned int nvert, unsigned int nface) :\n\t\tMxBlockModel(nvert,nface)\n\t{\n\t\tv_data.reserve(nvert);\n\t\tf_data.reserve(nface);\n\t\tface_links.reserve(nvert);\n\t}\n\n\tvirtual ~MxStdModel() {}\n\n\t////////////////////////////////////////////////////////////////////////\n\t// Tagging and marking\n\tunsigned long vertex_is_valid(MxVertexID i) const\n\t{ return v_check_tag(i,MX_VALID_FLAG); }\n\tvoid vertex_mark_valid(MxVertexID i) { v_set_tag(i,MX_VALID_FLAG); }\n\tvoid vertex_mark_invalid(MxVertexID i) { v_unset_tag(i,MX_VALID_FLAG); }\n\n\tunsigned long face_is_valid(MxFaceID i) const {return f_check_tag(i,MX_VALID_FLAG);}\n\tvoid face_mark_valid(MxFaceID i) { f_set_tag(i,MX_VALID_FLAG); }\n\tvoid face_mark_invalid(MxFaceID i) { f_unset_tag(i,MX_VALID_FLAG); }\n\n\t// Accessors for external tag and mark bits\n\tunsigned long vertex_check_tag(MxVertexID i, unsigned long tag) const\n\t{ return v_data[i].user_tag&tag; }\n\tvoid vertex_set_tag(MxVertexID i, unsigned long tag) { v_data[i].user_tag|=tag; }\n\tvoid vertex_unset_tag(MxVertexID i, unsigned long tag) {v_data[i].user_tag&= ~tag;}\n\tunsigned char vertex_mark(MxVertexID i) { return v_data[i].user_mark; }\n\tvoid vertex_mark(MxVertexID i, unsigned char m) { v_data[i].user_mark=m; }\n\n\tunsigned long face_check_tag(MxFaceID i, unsigned long tag) const\n\t{ return f_data[i].user_tag&tag; }\n\tvoid face_set_tag(MxFaceID i, unsigned long tag) { f_data[i].user_tag|=tag; }\n\tvoid face_unset_tag(MxFaceID i, unsigned long tag) {f_data[i].user_tag&= ~tag;}\n\tunsigned char face_mark(MxFaceID i) { return f_data[i].user_mark; }\n\tvoid face_mark(MxFaceID i, unsigned char m) { f_data[i].user_mark = m; }\n\n\t////////////////////////////////////////////////////////////////////////\n\t// Neighborhood collection and management\n\tvoid mark_neighborhood(MxVertexID, unsigned short mark=0);\n\tvoid collect_unmarked_neighbors(MxVertexID, face_list_t& faces);\n\tvoid mark_neighborhood_delta(MxVertexID, short delta);\n\tvoid partition_marked_neighbors(MxVertexID, unsigned short pivot,\n\t\tface_list_t& below, face_list_t& above);\n\n\tvoid mark_corners(const face_list_t& faces, unsigned short mark=0);\n\tvoid collect_unmarked_corners(const face_list_t& faces, vertex_list_t& verts);\n\n\tvoid collect_edge_neighbors(MxVertexID, MxVertexID, face_list_t&);\n\tvoid collect_vertex_star(MxVertexID v, vertex_list_t& verts);\n\n\tface_list_t& neighbors(MxVertexID v) { return face_links[v]; }\n\tconst face_list_t& neighbors(MxVertexID v) const { return face_links[v]; }\n\n\t////////////////////////////////////////////////////////////////////////\n\t// Primitive transformation operations\n\tvoid remap_vertex(MxVertexID from, MxVertexID to);\n\tMxVertexID split_edge(MxVertexID v1,MxVertexID v2,double x,double y,double z);\n\tMxVertexID split_edge(MxVertexID v1, MxVertexID v2);\n\n\tvoid flip_edge(MxVertexID v1, MxVertexID v2);\n\n\t// split_face3\n\tvoid split_face4(MxFaceID f, MxVertexID *newverts=0);\n\n\tvoid unlink_face(MxFaceID f);\n\n\t////////////////////////////////////////////////////////////////////////\n\t// Contraction and related operations\n\tvoid compact_vertices();\n\tvoid remove_degeneracy(face_list_t&);\n\n\t// Pair contraction interface\n\tvoid compute_contraction(MxVertexID, MxVertexID,\n\t\tMxPairContraction *, const double *vnew=0);\n\tvoid apply_contraction(const MxPairContraction&);\n\tvoid apply_expansion(const MxPairExpansion&);\n\tvoid contract(MxVertexID v1, MxVertexID v2,\n\t\tconst double *, MxPairContraction *);\n\n\t// Triple contraction interface\n\tvoid compute_contraction(MxFaceID, MxFaceContraction *);\n\tvoid contract(MxVertexID v1, MxVertexID v2, MxVertexID v3,\n\t\tconst double *vnew, face_list_t& changed);\n\n\t// Generalized contraction interface\n\tvoid contract(MxVertexID v1, const vertex_list_t& rest,\n\t\tconst double *vnew, face_list_t& changed);\n};\n\n#endif // MXSTDMODEL_INCLUDED\n\n"
  },
  {
    "path": "modules/qslim/MxStdSlim.cpp",
    "content": "// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Surface simplification using quadric error metrics\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"MxStdSlim.h\"\n\nMxStdSlim::MxStdSlim(MxStdModel *m0)\n{\n\tm = m0;\n\n\t// Externally visible variables\n\tplacement_policy = MX_PLACE_OPTIMAL;\n\tweighting_policy = MX_WEIGHT_AREA;\n\tboundary_weight = 1000.0;\n\tcompactness_ratio = 0.0;\n\tmeshing_penalty = 1.0;\n\tlocal_validity_threshold = 0.0;\n\tvertex_degree_limit = 24;\n\twill_join_only = false;\n\n\tvalid_faces = 0;\n\tvalid_verts = 0;\n\n\tfor(unsigned long i = 0; i < m->face_count(); ++i)\n\t\tif(m->face_is_valid(i))\n\t\t\tvalid_faces++;\n\n\tfor(unsigned long i = 0; i < m->vert_count(); ++i)\n\t\tif(m->vertex_is_valid(i))\n\t\t\tvalid_verts++;\n}\n\n\n"
  },
  {
    "path": "modules/qslim/MxStdSlim.h",
    "content": "#ifndef MXSTDSLIM_INCLUDED\n#define MXSTDSLIM_INCLUDED\n\n// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Core simplification interface\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"MxStdModel.h\"\n\n#define MX_PLACE_ENDPOINTS 0\n#define MX_PLACE_ENDORMID  1\n#define MX_PLACE_LINE      2\n#define MX_PLACE_OPTIMAL   3\n\n#define MX_WEIGHT_UNIFORM       0\n#define MX_WEIGHT_AREA          1\n#define MX_WEIGHT_ANGLE         2\n#define MX_WEIGHT_AVERAGE       3\n#define MX_WEIGHT_AREA_AVG      4\n#define MX_WEIGHT_RAWNORMALS    5\n\nclass MxStdSlim\n{\nprotected:\n\tMxStdModel *m;\n\npublic:\n\tunsigned int valid_verts;\n\tunsigned int valid_faces;\n\n\tint placement_policy;\n\tint weighting_policy;\n\tbool will_join_only;\n\n\tdouble boundary_weight;\n\tdouble compactness_ratio;\n\tdouble meshing_penalty;\n\tdouble local_validity_threshold;\n\tunsigned long vertex_degree_limit;\n\npublic:\n\tMxStdSlim(MxStdModel *m0);\n\tvirtual ~MxStdSlim() {}\n\n\tvirtual void initialize() = 0;\n\tvirtual bool decimate(unsigned long) = 0;\n\n\tMxStdModel& model() { return *m; }\n};\n\n#endif // MXSTDSLIM_INCLUDED\n\n"
  },
  {
    "path": "modules/qslim/MxTriangle.cpp",
    "content": "// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Handy 3D geometrical primitives\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"MxTriangle.h\"\n\nVec3 triangle_raw_normal(const Vec3& v1, const Vec3& v2, const Vec3& v3)\n{\n\tVec3 a = v2 - v1;\n\tVec3 b = v3 - v1;\n\treturn a^b;\n}\n\ndouble triangle_area(const Vec3& v1, const Vec3& v2, const Vec3& v3)\n{\n\treturn 0.5 * norm(triangle_raw_normal(v1, v2, v3));\n}\n\nVec3 triangle_normal(const Vec3& v1, const Vec3& v2, const Vec3& v3)\n{\n\tVec3 n = triangle_raw_normal(v1, v2, v3);\n\tn.Normalize();\n\n\treturn n;\n}\n\nVec4 triangle_plane(const Vec3& v1, const Vec3& v2, const Vec3& v3)\n{\n\tVec3 n = triangle_normal(v1, v2, v3);\n\n\treturn Vec4(n, -(n*v1));\n}\n\nVec4 triangle_raw_plane(const Vec3& v1, const Vec3& v2, const Vec3& v3)\n{\n\tVec3 n = triangle_raw_normal(v1, v2, v3);\n\n\treturn Vec4(n, -(n*v1));\n}\n\nconst double FOUR_ROOT3 = 6.928203230275509;\n\ndouble triangle_compactness(const Vec3& v1, const Vec3& v2, const Vec3& v3)\n{\n\tdouble L1 = norm2(v2 - v1);\n\tdouble L2 = norm2(v3 - v2);\n\tdouble L3 = norm2(v1 - v3);\n\n\treturn FOUR_ROOT3 * triangle_area(v1, v2, v3) / (L1+L2+L3);\n}\n\n\n"
  },
  {
    "path": "modules/qslim/MxTriangle.h",
    "content": "#ifndef MXGEOM3D_H\n#define MXGEOM3D_H\n\n// MixKit -- Code library for multiresolution surface modeling\n// Copyright (c) 1998, Michael Garland\n//\n// Contact: http://graphics.cs.uiuc.edu/~garland/software/qslim.html\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Library General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Library General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Handy 3D geometrical primitives\n\t\t\\author Adapted for K-3D: Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include \"MxMath.h\"\n\ndouble triangle_area(const Vec3&, const Vec3&, const Vec3&);\nVec3 triangle_raw_normal(const Vec3&, const Vec3&, const Vec3&);\nVec3 triangle_normal(const Vec3&, const Vec3&, const Vec3&);\nVec4 triangle_plane(const Vec3&, const Vec3&, const Vec3&);\nVec4 triangle_raw_plane(const Vec3&, const Vec3&, const Vec3&);\ndouble triangle_compactness(const Vec3&, const Vec3&, const Vec3&);\n\n#endif // MXGEOM3D_INCLUDED\n\n"
  },
  {
    "path": "modules/qslim/qslim.cpp",
    "content": "// K-3D\n// Copyright (c) 2004-2006, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"MxQSlim.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/triangulator.h>\n#include <k3dsdk/utility.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace qslim\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// qslim\n\nclass qslim :\n\tpublic k3d::material_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tqslim(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_face_count(init_owner(*this) + init_name(\"face_count\") + init_label(_(\"Face Count\")) + init_description(_(\"Desired number of outputs faces.\")) + init_value(1000) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_contraction_type(init_owner(*this) + init_name(\"contraction_type\") + init_label(_(\"Contraction type\")) + init_description(_(\"Stop function\")) + init_value(EDGE) + init_enumeration(contraction_values())),\n\t\tm_placement_policy(init_owner(*this) + init_name(\"placement_policy\") + init_label(_(\"Placement policy\")) + init_description(_(\"Placement policy (optimal, line, endpoint or midpoint, endpoints)\")) + init_value(OPTIMAL) + init_enumeration(placement_values())),\n\t\tm_quadric_weighting(init_owner(*this) + init_name(\"quadric_weighting\") + init_label(_(\"Quadric weighting\")) + init_description(_(\"Quadric weighting policy (uniform, area, angle)\")) + init_value(AREA) + init_enumeration(quadric_weighting_values())),\n\t\tm_boundary_weight(init_owner(*this) + init_name(\"boundary_weight\") + init_label(_(\"Boundary weight\")) + init_description(_(\"Use boundary preservation planes with given weight\")) + init_value(1000.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_compactness_ratio(init_owner(*this) + init_name(\"compactness_ratio\") + init_label(_(\"Compactness ratio\")) + init_description(_(\"Compactness ratio\")) + init_value(k3d::radians(0.0)) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_meshing_penalty(init_owner(*this) + init_name(\"meshing_penalty\") + init_label(_(\"Meshing penalty\")) + init_description(_(\"Penalty for bad meshes\")) + init_value(1.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_face_count.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_contraction_type.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_placement_policy.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_quadric_weighting.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_boundary_weight.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_compactness_ratio.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t\tm_meshing_penalty.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::mesh_topology_changed> >(make_reset_mesh_slot()));\n\t}\n\n\tclass qslim_convert :\n\t\tpublic k3d::triangulator\n\t{\n\tpublic:\n\t\tqslim_convert(MxStdModel& Model) :\n\t\t\tmodel(Model)\n\t\t{\n\t\t}\n\n\tprivate:\n\t\tvoid add_vertex(const k3d::point3& Coordinates, k3d::uint_t Vertices[4], k3d::uint_t Edges[4], k3d::double_t Weights[4], k3d::uint_t NewVertex)\n\t\t{\n\t\t\tNewVertex = model.vert_count();\n\t\t\tmodel.add_vertex(-Coordinates[0], Coordinates[1], Coordinates[2]);\n\t\t}\n\n\t\tvoid add_triangle(k3d::uint_t Vertices[3], k3d::uint_t Edges[3])\n\t\t{\n\t\t\tmodel.add_face(Vertices[0], Vertices[1], Vertices[2]);\n\t\t}\n\n\t\tMxStdModel& model;\n\t};\n\n\t/// Converts a K-3D polyhedron to a QSlim model\n\tstatic MxStdModel* convert(const k3d::mesh& Mesh, const k3d::polyhedron::const_primitive& Primitive)\n\t{\n\t\t// Create a new QSlim model ...\n\t\tMxStdModel* const model = new MxStdModel(100, 100);\n\n\t\t// Add mesh points to the model ...\n\t\treturn_val_if_fail(Mesh.points, model);\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\tconst k3d::uint_t point_begin = 0;\n\t\tconst k3d::uint_t point_end = point_begin + points.size();\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\tmodel->add_vertex(-points[point][0], points[point][1], points[point][2]);\n\n\t\t// Convert polygons to triangles ...\n\t\tqslim_convert(*model).process(Mesh, Primitive);\n\t\t\n\t\treturn model;\n\t}\n\n\t/// Appends a QSlim model to a K-3D mesh as a polyhedron primitive.\n\tstatic void append(const k3d::polyhedron::const_primitive& InputPolyhedron, MxStdModel& Model, k3d::mesh& Mesh, k3d::imaterial* const Material)\n\t{\n\t\tk3d::mesh::points_t& points = Mesh.points.writable();\n\t\tk3d::mesh::selection_t& point_selection = Mesh.point_selection.writable();\n\t\tconst k3d::uint_t point_offset = points.size();\n\t\tfor(unsigned int v = 0; v < Model.vert_count(); ++v)\n\t\t{\n\t\t\tk3d::point3 position(Model.vertex(v));\n\t\t\tposition[0] = -position[0];\n\t\t\tpoints.push_back(position);\n\t\t\tpoint_selection.push_back(0);\n\t\t}\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Mesh));\n\t\tpolyhedron->constant_attributes = InputPolyhedron.constant_attributes;\n\n\t\tfor(unsigned int f = 0; f != Model.face_count(); ++f)\n\t\t{\n\t\t\tif(!Model.face_is_valid(f))\n\t\t\t\tcontinue;\n\n\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\tpolyhedron->face_selections.push_back(0);\n\t\t\tpolyhedron->face_materials.push_back(Material);\n\n\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\tpolyhedron->vertex_points.push_back(point_offset + Model.face(f).v[0]);\n\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\tpolyhedron->vertex_points.push_back(point_offset + Model.face(f).v[1]);\n\t\t\tpolyhedron->vertex_selections.push_back(0);\n\n\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->loop_first_edges.back());\n\t\t\tpolyhedron->edge_selections.push_back(0);\n\t\t\tpolyhedron->vertex_points.push_back(point_offset + Model.face(f).v[2]);\n\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t}\n\n\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput.points = Input.points;\n\t\tOutput.point_selection = Input.point_selection;\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\n\t\t// For each primitive ...\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Input, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t{\n\t\t\t\tOutput.primitives.push_back(*primitive);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert polyhedron to a QSlim model ... \n\t\t\tboost::scoped_ptr<MxStdModel> model(convert(Output, *polyhedron));\n\n\t\t\tconst k3d::int32_t face_number = std::max(0, std::min(static_cast<k3d::int32_t>(model->face_count()), m_face_count.pipeline_value()));\n\t\t\t\n\t\t\tboost::scoped_ptr<MxQSlim> slim;\n\t\t\tswitch(m_contraction_type.pipeline_value())\n\t\t\t{\n\t\t\t\tcase EDGE:\n\t\t\t\t\tslim.reset(new MxEdgeQSlim(*model));\n\t\t\t\t\tbreak;\n\t\t\t\tcase FACE:\n\t\t\t\t\tslim.reset(new MxFaceQSlim(*model));\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tswitch(m_placement_policy.pipeline_value())\n\t\t\t{\n\t\t\t\tcase ENDPOINTS:\n\t\t\t\t\tslim->placement_policy = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ENDORMID:\n\t\t\t\t\tslim->placement_policy = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase LINE:\n\t\t\t\t\tslim->placement_policy = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase OPTIMAL:\n\t\t\t\t\tslim->placement_policy = 3;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tslim->boundary_weight = m_boundary_weight.pipeline_value();\n\n\t\t\tswitch(m_quadric_weighting.pipeline_value())\n\t\t\t{\n\t\t\t\tcase UNIFORM:\n\t\t\t\t\tslim->weighting_policy = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase AREA:\n\t\t\t\t\tslim->weighting_policy = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ANGLE:\n\t\t\t\t\tslim->weighting_policy = 2;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tslim->compactness_ratio = m_compactness_ratio.pipeline_value();\n\t\t\tslim->meshing_penalty = m_meshing_penalty.pipeline_value();\n\t\t\tslim->will_join_only = false;\n\n\t\t\t// Make it happen ...\n\t\t\tslim->initialize();\n\t\t\tslim->decimate(m_face_count.pipeline_value());\n\n\t\t\tappend(*polyhedron, *model, Output, material);\n\t\t}\n\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<qslim,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x9bfe8fce, 0x3c7c4b00, 0x9e050d1e, 0x062059fa),\n\t\t\t\t\"QSlim\",\n\t\t\t\t\"Surface simplification using quadric error metrics\",\n\t\t\t\t\"Polyhedron\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t/// Enumerates contraction functions\n\ttypedef enum\n\t{\n\t\tEDGE,\n\t\tFACE\n\t} contraction_t;\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const contraction_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase EDGE:\n\t\t\t\tStream << \"edge\";\n\t\t\tbreak;\n\t\t\tcase FACE:\n\t\t\t\tStream << \"face\";\n\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator >> (std::istream& Stream, contraction_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"edge\")\n\t\t\tValue = EDGE;\n\t\telse if(text == \"face\")\n\t\t\tValue = FACE;\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& contraction_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Edge\", \"edge\", \"Use edge contraction\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Face\", \"face\", \"Use face contraction\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\t/// Enumerates placement policies\n\ttypedef enum\n\t{\n\t\tOPTIMAL,\n\t\tLINE,\n\t\tENDORMID,\n\t\tENDPOINTS\n\t} placement_policy_t;\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const placement_policy_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase OPTIMAL:\n\t\t\t\tStream << \"optimal\";\n\t\t\t\tbreak;\n\t\t\tcase LINE:\n\t\t\t\tStream << \"line\";\n\t\t\t\tbreak;\n\t\t\tcase ENDORMID:\n\t\t\t\tStream << \"endormid\";\n\t\t\t\tbreak;\n\t\t\tcase ENDPOINTS:\n\t\t\t\tStream << \"endpoints\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator >> (std::istream& Stream, placement_policy_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"optimal\")\n\t\t\tValue = OPTIMAL;\n\t\telse if(text == \"line\")\n\t\t\tValue = LINE;\n\t\telse if(text == \"endormid\")\n\t\t\tValue = ENDORMID;\n\t\telse if(text == \"endpoints\")\n\t\t\tValue = ENDPOINTS;\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tconst k3d::ienumeration_property::enumeration_values_t& placement_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Optimal\", \"optimal\", \"Use optimal placement policy\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Line\", \"line\", \"Use line placement policy\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Endormid\", \"endormid\", \"Use end-point or mid-point placement policy\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Endpoints\", \"endpoints\", \"Use end-points placement policy\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\t/// Enumerates quadric weighting policies\n\ttypedef enum\n\t{\n\t\tUNIFORM,\n\t\tAREA,\n\t\tANGLE\n\t} quadric_weighting_t;\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const quadric_weighting_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase UNIFORM:\n\t\t\t\tStream << \"uniform\";\n\t\t\t\tbreak;\n\t\t\tcase AREA:\n\t\t\t\tStream << \"area\";\n\t\t\t\tbreak;\n\t\t\tcase ANGLE:\n\t\t\t\tStream << \"angle\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator >> (std::istream& Stream, quadric_weighting_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"uniform\")\n\t\t\tValue = UNIFORM;\n\t\telse if(text == \"area\")\n\t\t\tValue = AREA;\n\t\telse if(text == \"angle\")\n\t\t\tValue = ANGLE;\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tconst k3d::ienumeration_property::enumeration_values_t& quadric_weighting_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Uniform\", \"uniform\", \"Use uniform quadric weighting\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Area\", \"area\", \"Use area quadric weighting\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Angle\", \"angle\", \"Use angle quadric weighting\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_face_count;\n\tk3d_data(contraction_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_contraction_type;\n\tk3d_data(placement_policy_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_placement_policy;\n\tk3d_data(quadric_weighting_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_quadric_weighting;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_boundary_weight;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_compactness_ratio;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_meshing_penalty;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// qslim_factory\n\nk3d::iplugin_factory& qslim_factory()\n{\n\treturn qslim::get_factory();\n}\n\n} // namespace qslim\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qslim::qslim_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui/CMakeLists.txt",
    "content": "FIND_PROGRAM(ASSISTANT_COMMAND NAMES assistant assistant-mac)\n\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)\n\nQT4_ADD_RESOURCES(RESOURCES user_interface.qrc)\nQT4_WRAP_CPP(MOC_BUILT_SOURCES viewport.h scene.h main_window.h)\nQT4_WRAP_UI(UI_BUILT_SOURCES extrude_faces.ui main_window.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})\n\nADD_DEFINITIONS(-DQT_NO_KEYWORDS)\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui EXTRA_SOURCES ${RESOURCES} ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui)\n\nTARGET_LINK_LIBRARIES(k3d-qtui ${K3D_BOOST_PROGRAM_OPTIONS_LIBS})\n\n"
  },
  {
    "path": "modules/qtui/config.h.in",
    "content": "#ifndef K3DSDK_QTUI_CONFIG_H\n#define K3DSDK_QTUI_CONFIG_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#define K3D_EXTRA_QT_PLUGINS \"@K3D_EXTRA_QT_PLUGINS@\"\n#define K3D_ASSISTANT_COMMAND \"@ASSISTANT_COMMAND@\"\n\n#endif // !K3DSDK_QTUI_CONFIG_H\n\n"
  },
  {
    "path": "modules/qtui/extrude_faces.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ExtrudeFaces</class>\n <widget class=\"QDialog\" name=\"ExtrudeFaces\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>335</width>\n    <height>83</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>ExtrudeFaces</string>\n  </property>\n  <layout class=\"QGridLayout\" name=\"gridLayout\">\n   <item row=\"0\" column=\"0\">\n    <widget class=\"QLabel\" name=\"label\">\n     <property name=\"text\">\n      <string>Property A</string>\n     </property>\n     <property name=\"buddy\">\n      <cstring>checkBox</cstring>\n     </property>\n    </widget>\n   </item>\n   <item row=\"0\" column=\"1\">\n    <widget class=\"QCheckBox\" name=\"checkBox\">\n     <property name=\"text\">\n      <string>CheckBox</string>\n     </property>\n     <property name=\"shortcut\">\n      <string>Ctrl+G</string>\n     </property>\n    </widget>\n   </item>\n   <item row=\"1\" column=\"0\">\n    <widget class=\"QLabel\" name=\"label_2\">\n     <property name=\"text\">\n      <string>Property B</string>\n     </property>\n    </widget>\n   </item>\n   <item row=\"1\" column=\"1\">\n    <widget class=\"QLineEdit\" name=\"lineEdit\"/>\n   </item>\n   <item row=\"2\" column=\"1\">\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>40</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "modules/qtui/main_window.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"config.h\"\n#include \"main_window.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/gzstream.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/qtui/action.h>\n#include <k3dsdk/qtui/application.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/document.h>\n#include <k3dsdk/qtui/file_dialog.h>\n#include <k3dsdk/qtui/panel.h>\n#include <k3dsdk/qtui/script.h>\n#include <k3dsdk/qtui/uri.h>\n#include <k3dsdk/share.h>\n\n#include <QAction>\n#include <QDialog>\n#include <QDockWidget>\n#include <QFileDialog>\n#include <QMenuBar>\n#include <QMessageBox>\n#include <QProcess>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iomanip>\n#include <map>\n#include <set>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\n//////////////////////////////////////////////////////////////////////////\n// main_window\n\nmain_window::main_window(k3d::idocument& Document) :\n\tdocument_widget(*this, Document)\n{\n\tinitialize(Document);\n}\n\nmain_window::main_window(const k3d::filesystem::path& DocumentPath, k3d::idocument& Document) :\n\tdocument_widget(*this, Document)\n{\n\tinitialize(Document);\n\tsetWindowTitle((\"K-3D - \" + DocumentPath.leaf().raw()).c_str());\n}\n\nvoid main_window::on_file_new_activated()\n{\n\tk3d::idocument* const document = k3d::application().create_document();\n\treturn_if_fail(document);\n\n\tk3d::qtui::populate_new_document(*document);\n\n\tmain_window* const window = new main_window(*document);\n\twindow->show();\n}\n\nvoid main_window::on_file_open_activated()\n{\n\tboost::scoped_ptr<k3d::idocument_importer> importer(k3d::plugin::create<k3d::idocument_importer>(k3d::classes::DocumentImporter()));\n\tif(!importer.get())\n\t{\n\t\tQMessageBox::warning(this, _(\"Open K-3D Document:\"), _(\"Document reader plugin not installed.\"), QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton);\n\t\treturn;\n\t}\n\n\tconst k3d::filesystem::path document_path = k3d::qtui::file_dialog::get_open_filename(this, tr(\"Choose a file to open:\"), k3d::options::path::documents(), tr(\"K-3D Documents (*.k3d)\"));\n\tif(document_path.empty())\n\t\treturn;\n\n\tk3d::idocument* const document = k3d::application().create_document();\n\treturn_if_fail(document);\n\n\tif(!importer->read_file(document_path, *document))\n\t{\n\t\tQMessageBox::warning(this, _(\"Open K-3D Document:\"), _(\"Error reading document.\"), QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton);\n\t\treturn;\n\t}\n\n\tmain_window* const window = new main_window(document_path, *document);\n\twindow->show();\n}\n\nvoid main_window::on_file_quit_activated()\n{\n\tk3d::qtui::application::instance().close();\n}\n\nvoid main_window::on_script_play_activated()\n{\n\tconst k3d::filesystem::path script_path = k3d::qtui::file_dialog::get_open_filename(this, tr(\"Play Script:\"), k3d::options::path::scripts());\n\tif(script_path.empty())\n\t\treturn;\n\n\tk3d::filesystem::igzstream stream(script_path);\n\tk3d::iscript_engine::context context;\n\tcontext[\"document\"] = &document_widget.document();\n\tk3d::qtui::script::execute(stream, script_path.native_utf8_string().raw(), context);\n}\n\nvoid main_window::on_help_k3d_guide_activated()\n{\n\tif(!m_assistant)\n\t{\n\t\tm_assistant = new QProcess();\n\t\tm_assistant->setWorkingDirectory(k3d::convert<QString>((k3d::share_path() / k3d::filesystem::generic_path(\"guide\")).native_filesystem_string()));\n\t\tm_assistant->start(K3D_ASSISTANT_COMMAND, QStringList() << \"-collectionFile\" << \"guide.qhc\" << \"-enableRemoteControl\");\n\t\tif(!m_assistant->waitForStarted())\n\t\t{\n\t\t\tdelete m_assistant;\n\t\t\tm_assistant = 0;\n\t\t\treturn;\n\t\t}\n\n\t\tQObject::connect(m_assistant, SIGNAL(finished(int, QProcess::ExitStatus)), m_assistant, SLOT(deleteLater()));\n\t}\n}\n\nvoid main_window::on_help_k3d_online_activated()\n{\n\tk3d::qtui::uri::open(\"http://www.k-3d.org\");\n}\n\nvoid main_window::on_help_file_bug_report_activated()\n{\n\tk3d::qtui::uri::open(\"http://www.k-3d.org/wiki/Reporting_Bugs\");\n}\n\nvoid main_window::on_help_about_activated()\n{\n\tQDialog* const dialog = k3d::plugin::create<QDialog>(\"QTUIAboutDialog\");\n\treturn_if_fail(dialog);\n\tdialog->show();\n}\n\nvoid main_window::initialize(k3d::idocument& Document)\n{\n\tui.setupUi(this);\n\tui.file_new->setIcon(QIcon::fromTheme(\"document-new\"));\n\tui.file_open->setIcon(QIcon::fromTheme(\"document-open\"));\n\tui.file_close->setIcon(QIcon::fromTheme(\"window-close\"));\n\tui.file_quit->setIcon(QIcon::fromTheme(\"application-exit\"));\n\tui.help_about->setIcon(QIcon::fromTheme(\"help-about\"));\n\n\tstatusBar()->setVisible(false);\n\tsetAttribute(Qt::WA_DeleteOnClose);\n\n\tm_scene.reset(new scene(Document));\n\tui.viewport->setScene(m_scene.get());\n\n\t// Setup manual access to edit modes ...\n\tQMenu* const mode_menu = ui.menuEdit->addMenu(tr(\"Mode\"));\n\tmode_menu->addAction(new k3d::qtui::action(tr(\"-- None --\"), mode_menu, sigc::bind(sigc::mem_fun(*this, &main_window::on_edit_mode), static_cast<k3d::iplugin_factory*>(0))));\n\tmode_menu->addSeparator();\n\tstd::vector<k3d::iplugin_factory*> modes = k3d::plugin::factory::lookup(\"qtui:component-type\", \"mode\");\n\tstd::sort(modes.begin(), modes.end(), k3d::sort_by_name());\n\tfor(int i = 0; i != modes.size(); ++i)\n\t\tmode_menu->addAction(k3d::qtui::action::create(*modes[i], mode_menu, sigc::bind(sigc::mem_fun(*this, &main_window::on_edit_mode), modes[i])));\n\n\t// Group node factories by category ...\n\tstd::vector<k3d::iplugin_factory*> factories = k3d::plugin::factory::lookup();\n\ttypedef std::set<k3d::iplugin_factory*, k3d::sort_by_name> sorted_factories_t;\n\ttypedef std::map<std::string, sorted_factories_t> grouped_factories_t;\n\tgrouped_factories_t grouped_factories;\n\n\tfor(std::vector<k3d::iplugin_factory*>::const_iterator f = factories.begin(); f != factories.end(); ++f)\n\t{\n\t\tk3d::iplugin_factory& factory = **f;\n\n\t\t// If it isn't a document plugin factory, skip it ...\n\t\tif(!dynamic_cast<k3d::idocument_plugin_factory*>(&factory))\n\t\t\tcontinue;\n\n\t\tfor(k3d::iplugin_factory::categories_t::const_iterator category = factory.categories().begin(); category != factory.categories().end(); ++category)\n\t\t\tgrouped_factories[*category].insert(&factory);\n\n\t\tif(factory.categories().empty())\n\t\t\tgrouped_factories[\"<Uncategorized>\"].insert(&factory);\n\t}\n\n\t// Setup manual create menu with factories grouped by category ...\n\tQMenu* const create_menu = ui.menuAdvanced->addMenu(tr(\"Create\"));\n\tfor(grouped_factories_t::const_iterator group = grouped_factories.begin(); group != grouped_factories.end(); ++group)\n\t{\n\t\tQMenu* const category_create_menu = create_menu->addMenu(k3d::convert<QString>(group->first));\n\n\t\tconst sorted_factories_t& sorted_factories = group->second;\n\t\tfor(sorted_factories_t::const_iterator factory = sorted_factories.begin(); factory != sorted_factories.end(); ++factory)\n\t\t{\n\t\t\tcategory_create_menu->addAction(k3d::qtui::action::create(**factory, category_create_menu, sigc::bind(sigc::mem_fun(*this, &main_window::on_advanced_create), *factory)));\n\t\t}\n\t}\n\n\t// Setup manual access to panel plugins ...\n\tQMenu* const panel_menu = ui.menuAdvanced->addMenu(tr(\"Panels\"));\n\tstd::vector<k3d::iplugin_factory*> panels = k3d::plugin::factory::lookup(\"qtui:component-type\", \"panel\");\n\tstd::sort(panels.begin(), panels.end(), k3d::sort_by_name());\n\tfor(int i = 0; i != panels.size(); ++i)\n\t\tpanel_menu->addAction(k3d::qtui::action::create(*panels[i], panel_menu, sigc::bind(sigc::mem_fun(*this, &main_window::on_advanced_panel), panels[i])));\n\n\t// Setup manual access to window plugins ...\n\tQMenu* const window_menu = ui.menuAdvanced->addMenu(tr(\"Windows\"));\n\tstd::vector<k3d::iplugin_factory*> windows = k3d::plugin::factory::lookup(\"qtui:component-type\", \"window\");\n\tstd::sort(windows.begin(), windows.end(), k3d::sort_by_name());\n\tfor(int i = 0; i != windows.size(); ++i)\n\t\twindow_menu->addAction(k3d::qtui::action::create(*windows[i], window_menu, sigc::bind(sigc::mem_fun(*this, &main_window::on_advanced_window), windows[i])));\n}\n\nvoid main_window::on_edit_mode(k3d::iplugin_factory* const Mode)\n{\n\tm_scene->set_active_mode(Mode ? k3d::plugin::create<k3d::qtui::mode>(*Mode) : static_cast<k3d::qtui::mode*>(0));\n}\n\nstatic void create_node(k3d::idocument& Document, k3d::iplugin_factory& Factory)\n{\n\t// Create the requested node ...\n\tk3d::record_state_change_set changeset(Document, k3d::string_cast(boost::format(_(\"Create %1%\")) % Factory.name()), K3D_CHANGE_SET_CONTEXT);\n\tconst std::string node_name = k3d::unique_name(Document.nodes(), Factory.name());\n\treturn_if_fail(k3d::plugin::create<k3d::inode>(Factory, Document, node_name));\n}\n\nvoid main_window::on_advanced_create(k3d::iplugin_factory* const Factory)\n{\n//\tif(cancel_plugin(*Factory))\n//\t\treturn;\n\n\tcreate_node(document_widget.document(), *Factory);\n}\n\nvoid main_window::on_advanced_panel(k3d::iplugin_factory* const Panel)\n{\n\tk3d::qtui::panel* const panel = Panel ? k3d::plugin::create<k3d::qtui::panel>(*Panel) : static_cast<k3d::qtui::panel*>(0);\n\treturn_if_fail(panel);\n\tpanel->initialize(document_widget.document());\n\n\tQWidget* const widget = dynamic_cast<QWidget*>(panel);\n\treturn_if_fail(widget);\n\n\tQDockWidget* const dock = new QDockWidget(k3d::convert<QString>(Panel->name()));\n\tdock->setWidget(widget);\n\n\taddDockWidget(Qt::LeftDockWidgetArea, dock);\n}\n\nvoid main_window::on_advanced_window(k3d::iplugin_factory* const Window)\n{\n\tQWidget* const window = Window ? k3d::plugin::create<QWidget>(*Window) : static_cast<QWidget*>(0);\n\treturn_if_fail(window);\n\twindow->show();\n}\n\n} // namespace qtui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/qtui/main_window.h",
    "content": "#ifndef MODULES_QTUI_MAIN_WINDOW_H\n#define MODULES_QTUI_MAIN_WINDOW_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"scene.h\"\n#include \"ui_main_window.h\"\n\n#include <k3dsdk/qtui/document_widget.h>\n#include <boost/scoped_ptr.hpp>\n\n#include <QMainWindow>\n#include <QPointer>\n\nnamespace k3d { class idocument; }\nnamespace k3d { class iplugin_factory; }\nnamespace k3d { namespace filesystem { class path; } }\n\nclass QProcess;\n\nnamespace module\n{\n\nnamespace qtui\n{\n\n//////////////////////////////////////////////////////////////////////////\n// main_window\n\nclass main_window :\n\tpublic QMainWindow\n{\n\tQ_OBJECT;\n\npublic:\n\tmain_window(k3d::idocument& Document);\n\tmain_window(const k3d::filesystem::path& DocumentPath, k3d::idocument& Document);\n\nprivate Q_SLOTS:\n\tvoid on_file_new_activated();\n\tvoid on_file_open_activated();\n\tvoid on_file_quit_activated();\n\tvoid on_script_play_activated();\n\tvoid on_help_k3d_guide_activated();\n\tvoid on_help_k3d_online_activated();\n\tvoid on_help_file_bug_report_activated();\n\tvoid on_help_about_activated();\n\nprivate:\n\tvoid initialize(k3d::idocument& Document);\n\n\tvoid on_edit_mode(k3d::iplugin_factory* const Mode);\n\tvoid on_advanced_create(k3d::iplugin_factory* const Factory);\n\tvoid on_advanced_panel(k3d::iplugin_factory* const Panel);\n\tvoid on_advanced_window(k3d::iplugin_factory* const Window);\n\n\tUi::main_window ui;\n\tk3d::qtui::document_widget document_widget;\n\tboost::scoped_ptr<scene> m_scene;\n\n\tQPointer<QProcess> m_assistant;\n};\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_MAIN_WINDOW_H\n\n"
  },
  {
    "path": "modules/qtui/main_window.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>main_window</class>\n <widget class=\"QMainWindow\" name=\"main_window\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>800</width>\n    <height>600</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>K-3D</string>\n  </property>\n  <widget class=\"QWidget\" name=\"centralwidget\">\n   <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n    <property name=\"spacing\">\n     <number>0</number>\n    </property>\n    <property name=\"margin\">\n     <number>0</number>\n    </property>\n    <item>\n     <widget class=\"module::qtui::viewport\" name=\"viewport\">\n      <property name=\"frameShape\">\n       <enum>QFrame::NoFrame</enum>\n      </property>\n      <property name=\"frameShadow\">\n       <enum>QFrame::Plain</enum>\n      </property>\n      <property name=\"lineWidth\">\n       <number>0</number>\n      </property>\n      <property name=\"midLineWidth\">\n       <number>0</number>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n  <widget class=\"QMenuBar\" name=\"menubar\">\n   <property name=\"geometry\">\n    <rect>\n     <x>0</x>\n     <y>0</y>\n     <width>800</width>\n     <height>23</height>\n    </rect>\n   </property>\n   <widget class=\"QMenu\" name=\"menuFile\">\n    <property name=\"title\">\n     <string>File</string>\n    </property>\n    <addaction name=\"file_new\"/>\n    <addaction name=\"file_open\"/>\n    <addaction name=\"file_close\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"file_quit\"/>\n   </widget>\n   <widget class=\"QMenu\" name=\"menuEdit\">\n    <property name=\"title\">\n     <string>Edit</string>\n    </property>\n   </widget>\n   <widget class=\"QMenu\" name=\"menuHelp\">\n    <property name=\"title\">\n     <string>Help</string>\n    </property>\n    <addaction name=\"help_k3d_guide\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"help_k3d_online\"/>\n    <addaction name=\"help_file_bug_report\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"help_about\"/>\n   </widget>\n   <widget class=\"QMenu\" name=\"menuAdvanced\">\n    <property name=\"title\">\n     <string>Advanced</string>\n    </property>\n   </widget>\n   <widget class=\"QMenu\" name=\"menuScripting\">\n    <property name=\"title\">\n     <string>Scripting</string>\n    </property>\n    <addaction name=\"script_play\"/>\n   </widget>\n   <addaction name=\"menuFile\"/>\n   <addaction name=\"menuEdit\"/>\n   <addaction name=\"menuScripting\"/>\n   <addaction name=\"menuAdvanced\"/>\n   <addaction name=\"menuHelp\"/>\n  </widget>\n  <widget class=\"QStatusBar\" name=\"statusbar\">\n   <property name=\"enabled\">\n    <bool>true</bool>\n   </property>\n  </widget>\n  <action name=\"file_open\">\n   <property name=\"text\">\n    <string>Open</string>\n   </property>\n   <property name=\"shortcut\">\n    <string>Ctrl+O</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"file_quit\">\n   <property name=\"text\">\n    <string>Quit</string>\n   </property>\n   <property name=\"shortcut\">\n    <string>Ctrl+Q</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"file_new\">\n   <property name=\"text\">\n    <string>New</string>\n   </property>\n   <property name=\"shortcut\">\n    <string>Ctrl+N</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"file_close\">\n   <property name=\"text\">\n    <string>Close</string>\n   </property>\n   <property name=\"shortcut\">\n    <string>Ctrl+W</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"help_about\">\n   <property name=\"text\">\n    <string>About K-3D</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"script_play\">\n   <property name=\"text\">\n    <string>Play</string>\n   </property>\n  </action>\n  <action name=\"help_k3d_online\">\n   <property name=\"text\">\n    <string>K-3D Online</string>\n   </property>\n  </action>\n  <action name=\"help_file_bug_report\">\n   <property name=\"text\">\n    <string>File Bug Report</string>\n   </property>\n  </action>\n  <action name=\"help_k3d_guide\">\n   <property name=\"text\">\n    <string>K-3D Guide</string>\n   </property>\n  </action>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>module::qtui::viewport</class>\n   <extends>QGraphicsView</extends>\n   <header>viewport.h</header>\n  </customwidget>\n </customwidgets>\n <resources/>\n <connections>\n  <connection>\n   <sender>file_close</sender>\n   <signal>triggered()</signal>\n   <receiver>main_window</receiver>\n   <slot>close()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>399</x>\n     <y>299</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "modules/qtui/scene.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"scene.h\"\n#include <ui_extrude_faces.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/high_res_timer.h>\n#include <k3dsdk/selection_state_gl.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/plugin.h>\n#include<k3dsdk/rectangle.h>\n#include <k3dsdk/share.h>\n\n#include <boost/scoped_ptr.hpp>\n#include <iomanip>\n\n#include <QGraphicsItem>\n#include <QGraphicsSceneMouseEvent>\n#include <QTimer>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\n//////////////////////////////////////////////////////////////////////////\n// scene\n\nscene::scene(k3d::idocument& Document) :\n\tm_document(Document),\n\tm_camera(init_value<k3d::icamera*>(0)),\n\tm_gl_engine(init_value<k3d::gl::irender_viewport*>(0))\n{\n\tm_cameras = k3d::node::lookup<k3d::icamera>(Document);\n\tm_render_engines = k3d::node::lookup<k3d::gl::irender_viewport>(Document);\n\n\tm_camera.set_value(m_cameras.size() ? m_cameras[0] : 0);\n\tm_gl_engine.set_value(m_render_engines.size() ? m_render_engines[0] : 0);\n\n\tif(m_gl_engine.internal_value())\n\t\tm_gl_engine.internal_value()->redraw_request_signal().connect(sigc::mem_fun(*this, &scene::on_redraw_pipeline));\n\n\tset_active_mode(k3d::plugin::create<k3d::qtui::mode>(\"QTUIDefaultMode\"));\n\n\tupdate();\n}\n\nvoid scene::drawBackground(QPainter *painter, const QRectF &rect)\n{\n\tglPushAttrib(GL_ALL_ATTRIB_BITS);\n\tglMatrixMode(GL_PROJECTION);\n\tglPushMatrix();\n\tglMatrixMode(GL_MODELVIEW);\n\tglPushMatrix();\n\n\tif(m_gl_engine.internal_value() && m_camera.internal_value())\n\t{\n\t\tk3d::timer timer;\n\n\t\tm_gl_engine.internal_value()->render_viewport(*m_camera.internal_value(), width(), height(), m_gl_view_matrix, m_gl_projection_matrix, m_gl_viewport);\n\n\t\tconst k3d::double_t elapsed = timer.elapsed();\n\t\tstd::stringstream buffer;\n\t\tif(elapsed)\n\t\t\tbuffer << std::fixed << std::setprecision(1) << 1.0 / elapsed << \"fps\";\n\t}\n\telse\n\t{\n\t\tglClearColor(0.6f, 0.6f, 0.6f, 0.0f);\n\t\tglClear(GL_COLOR_BUFFER_BIT);\n\t}\n\n\tglMatrixMode(GL_MODELVIEW);\n\tglPopMatrix();\n\tglMatrixMode(GL_PROJECTION);\n\tglPopMatrix();\n\tglPopAttrib();\n}\n\nvoid scene::set_active_mode(k3d::qtui::mode* const Mode)\n{\n\tm_next_mode.reset(Mode);\n\tQTimer::singleShot(0, this, SLOT(on_set_active_mode()));\n}\n\nvoid scene::set_active_mode(const QString& Mode)\n{\n\tset_active_mode(k3d::plugin::create<k3d::qtui::mode>(Mode.toAscii().data()));\n}\n\nvoid scene::on_set_active_mode()\n{\n\tm_active_mode.swap(m_next_mode);\n\tm_next_mode.reset();\n\n\tQList<QGraphicsItem*> all_items = items();\n\tfor(int i = 0; i != all_items.size(); ++i)\n\t\tdelete all_items[i];\n\n\tif(m_active_mode)\n\t\tm_active_mode->enable(m_document, *this);\n}\n\nvoid scene::on_camera_changed(int Index)\n{\n\tm_camera.set_value(m_cameras[Index]);\n\tupdate();\n}\n\nvoid scene::on_render_engine_changed(int Index)\n{\n\tm_gl_engine.set_value(m_render_engines[Index]);\n\tupdate();\n}\n\nvoid scene::on_redraw_pipeline(k3d::gl::irender_viewport::redraw_type_t RedrawType)\n{\n\tupdate();\n}\n\n} // namespace qtui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/qtui/scene.h",
    "content": "#ifndef MODULES_QTUI_SCENE_H\n#define MODULES_QTUI_SCENE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/irender_viewport_gl.h>\n#include <k3dsdk/qtui/mode.h>\n#include <k3dsdk/signal_system.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <QGraphicsScene>\n\nnamespace k3d { class idocument; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\n//////////////////////////////////////////////////////////////////////////\n// scene\n\nclass scene :\n\tpublic QGraphicsScene,\n\tpublic sigc::trackable\n{\n\tQ_OBJECT;\n\npublic:\n\tscene(k3d::idocument& Document);\n\n\tvirtual void drawBackground(QPainter *painter, const QRectF &rect);\n\n\tvoid set_active_mode(k3d::qtui::mode* const Mode);\n\npublic Q_SLOTS:\n\tvoid set_active_mode(const QString& Mode);\n\nprivate Q_SLOTS:\n\tvoid on_set_active_mode();\n\tvoid on_camera_changed(int Index);\n\tvoid on_render_engine_changed(int Index);\n\nprivate:\n\t/// Called when the pipeline needs to be rendered.\n\tvoid on_redraw_pipeline(k3d::gl::irender_viewport::redraw_type_t RedrawType);\n\n\tk3d::idocument& m_document;\n\t/// Stores the document camera for drawing\n\tk3d_data(k3d::icamera*, no_name, change_signal, no_undo, node_storage, no_constraint, no_property, no_serialization) m_camera;\n\t/// Stores the document OpenGL render engine for drawing\n\tk3d_data(k3d::gl::irender_viewport*, no_name, change_signal, no_undo, node_storage, no_constraint, no_property, no_serialization) m_gl_engine;\n\t// Buffers parameters from the most-recent render\n\tGLdouble m_gl_view_matrix[16];\n\tGLdouble m_gl_projection_matrix[16];\n\tGLint m_gl_viewport[4];\n\tstd::vector<k3d::icamera*> m_cameras;\n\tstd::vector<k3d::gl::irender_viewport*> m_render_engines;\n\tboost::scoped_ptr<k3d::qtui::mode> m_active_mode;\n\tboost::scoped_ptr<k3d::qtui::mode> m_next_mode;\n};\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_SCENE_H\n\n"
  },
  {
    "path": "modules/qtui/stylesheet.css",
    "content": "\n"
  },
  {
    "path": "modules/qtui/user_interface.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"config.h\"\n#include \"main_window.h\"\n#include \"user_interface.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/application.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/high_res_timer.h>\n#include <k3dsdk/iapplication.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/iscripted_action.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/document.h>\n#include <k3dsdk/qtui/message.h>\n#include <k3dsdk/qtui/nag_message_dialog.h>\n#include <k3dsdk/share.h>\n\n#include <QAction>\n#include <QApplication>\n#include <QComboBox>\n#include <QFileDialog>\n#include <QMenuBar>\n#include <QMessageBox>\n#include <QStatusBar>\n#include <QToolBar>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iomanip>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// user_interface\n\nvoid qt_message_output(QtMsgType Type, const char* Message)\n{\n\tswitch(Type)\n\t{\n\tcase QtDebugMsg:\n\t\tk3d::log() << debug << Message << std::endl;\n\t\tbreak;\n\tcase QtWarningMsg:\n\t\tk3d::log() << warning << Message << std::endl;\n\t\tbreak;\n\tcase QtCriticalMsg:\n\t\tk3d::log() << error << Message << std::endl;\n\t\tbreak;\n\tcase QtFatalMsg:\n\t\tk3d::log() << critical << Message << std::endl;\n\t\tabort();\n\t}\n}\n\nuser_interface::user_interface()\n{\n\tqInstallMsgHandler(qt_message_output);\n}\n\nuser_interface::~user_interface()\n{\n\tfor(std::vector<k3d::iunknown*>::iterator plugin = m_auto_start_plugins.begin(); plugin != m_auto_start_plugins.end(); ++plugin)\n\t{\n\t\tif(k3d::iscripted_action* const scripted_action = dynamic_cast<k3d::iscripted_action*>(*plugin))\n\t\t{\n\t\t\tk3d::iscript_engine::context context;\n\t\t\tcontext[\"command\"] = k3d::string_t(\"shutdown\");\n\t\t\tscripted_action->execute(context);\n\t\t}\n\t}\n\n\tfor(std::vector<k3d::iunknown*>::iterator plugin = m_auto_start_plugins.begin(); plugin != m_auto_start_plugins.end(); ++plugin)\n\t\tdelete *plugin;\n\n\tm_auto_start_plugins.clear();\n}\n\nvoid user_interface::get_command_line_arguments(boost::program_options::options_description& Description)\n{\n\tDescription.add_options()\n\t\t(\"no-splash\", \"Disables the startup splash screen.\")\n\t\t;\n}\n\nconst k3d::ievent_loop::arguments_t user_interface::parse_startup_arguments(const arguments_t& Arguments, bool& Quit, bool& Error)\n{\n\t// Keep track of whether to display a splash screen or not ...\n\tbool show_splash = true;\n\n\t// Qt expects to parse and modify argc / argv, so create some temporary storage for it to fiddle with ...\n\tstatic std::vector<char*> argv_buffer;\n\targv_buffer.push_back(const_cast<char*>(\"k3d\"));\n\tstatic int argc = argv_buffer.size();\n\tstatic char** argv = &argv_buffer[0];\n\n\t// We return any \"unused\" arguments ...\n\targuments_t unused;\n\n\t// For each command-line argument ...\n\tfor(arguments_t::const_iterator argument = Arguments.begin(); argument != Arguments.end(); ++argument)\n\t{\n\t\tif(argument->string_key == \"no-splash\")\n\t\t{\n\t\t\tshow_splash = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tunused.push_back(*argument);\n\t\t}\n\t}\n\n\tm_application.reset(new QApplication(argc, argv));\n\tm_application->setApplicationName(\"K-3D\");\n\tm_application->setApplicationVersion(K3D_VERSION);\n\tm_application->setOrganizationDomain(\"k-3d.org\");\n\tm_application->setOrganizationName(\"k-3d.org\");\n\n\tQFile stylesheet(\":/QTUI/stylesheet.css\");\n\tstylesheet.open(QIODevice::ReadOnly);\n\tm_application->setStyleSheet(stylesheet.readAll());\n\n\tm_application->setWindowIcon(QIcon(\":/QTUI/window_icon.png\"));\n\tm_application->addLibraryPath(K3D_EXTRA_QT_PLUGINS);\n\n\tk3d::log() << info << \"Loading Qt plugins from \" << m_application->libraryPaths().join(\", \").toAscii().data() << std::endl;\n\t\n\tif(show_splash)\n\t{\n\t\tm_splash_box.reset(new QSplashScreen(QPixmap(\":/QTUI/splash.png\")));\n\t\tm_splash_box->show();\n\t\tm_application->processEvents();\n\t}\n\n\treturn unused;\n}\n\nvoid user_interface::startup_message_handler(const k3d::string_t& Message)\n{\n\tif(m_splash_box.get())\n\t{\n\t\tm_splash_box->showMessage(Message.c_str());\n\t\tm_application->processEvents();\n\t}\n}\n\nvoid user_interface::display_user_interface()\n{\n\tk3d::idocument* const document = k3d::application().create_document();\n\treturn_if_fail(document);\n\n\tk3d::qtui::populate_new_document(*document);\n\n\tmain_window* const window = new main_window(*document);\n\twindow->show();\n\n\tm_splash_box.reset();\n\n\t// Setup auto-start plugins ...\n\tconst k3d::plugin::factory::collection_t factories = k3d::plugin::factory::lookup(\"qtui:application-start\", \"true\");\n\tfor(k3d::plugin::factory::collection_t::const_iterator factory = factories.begin(); factory != factories.end(); ++factory)\n\t{\n\t\tk3d::log() << info << \"Creating plugin [\" << (**factory).name() << \"] via qtui:application-start\" << std::endl;\n\n\t\tk3d::iunknown* const plugin = k3d::plugin::create(**factory);\n\t\tif(!plugin)\n\t\t{\n\t\t\tk3d::log() << error << \"Error creating plugin [\" << (**factory).name() << \"] via qtui:application-start\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\t\tm_auto_start_plugins.push_back(plugin);\n\n\t\tif(k3d::iscripted_action* const scripted_action = dynamic_cast<k3d::iscripted_action*>(plugin))\n\t\t{\n\t\t\tk3d::iscript_engine::context context;\n\t\t\tcontext[\"command\"] = k3d::string_t(\"startup\");\n\t\t\tscripted_action->execute(context);\n\t\t}\n\t}\n}\n\nconst k3d::ievent_loop::arguments_t user_interface::parse_runtime_arguments(const arguments_t& Arguments, bool& Quit, bool& Error)\n{\n\treturn Arguments;\n}\n\nvoid user_interface::start_event_loop()\n{\n\tm_application->exec();\n}\n\nvoid user_interface::stop_event_loop()\n{\n\tm_application->quit();\n}\n\nvoid user_interface::open_uri(const k3d::string_t& URI)\n{\n\tassert_not_reached();\n}\n\nvoid user_interface::message(const k3d::string_t& Message)\n{\n\tk3d::qtui::message(k3d::convert<QString>(Message), \"\");\n}\n\nvoid user_interface::warning_message(const k3d::string_t& Message)\n{\n\tk3d::qtui::warning_message(k3d::convert<QString>(Message), \"\");\n}\n\nvoid user_interface::error_message(const k3d::string_t& Message)\n{\n\tk3d::qtui::error_message(k3d::convert<QString>(Message), \"\");\n}\n\nk3d::uint_t user_interface::query_message(const k3d::string_t& Message, const k3d::uint_t DefaultOption, const std::vector<k3d::string_t>& Options)\n{\n\tassert_not_implemented();\n\treturn 0;\n}\n\nvoid user_interface::nag_message(const k3d::string_t& Type, const k3d::ustring& Message, const k3d::ustring& SecondaryMessage)\n{\n\tk3d::qtui::nag_message_dialog::nag(Type, Message, SecondaryMessage);\n}\n\nbool user_interface::get_file_path(const k3d::ipath_property::mode_t Mode, const k3d::string_t& Type, const k3d::string_t& Prompt, const k3d::filesystem::path& OldPath, k3d::filesystem::path& Result)\n{\n\tassert_not_implemented();\n\treturn false;\n}\n\nbool user_interface::show(iunknown& Object)\n{\n\tassert_not_implemented();\n\treturn false;\n}\n\nvoid user_interface::synchronize()\n{\n\tassert_not_implemented();\n}\n\nsigc::connection user_interface::get_timer(const double FrameRate, sigc::slot<void> Slot)\n{\n\tassert_not_implemented();\n\treturn sigc::connection();\n}\n\nk3d::uint_t user_interface::watch_path(const k3d::filesystem::path& Path, const sigc::slot<void>& Slot)\n{\n\tassert_not_implemented();\n\treturn 0;\n}\n\nvoid user_interface::unwatch_path(const k3d::uint_t WatchID)\n{\n\tassert_not_implemented();\n}\n\nk3d::iplugin_factory& user_interface::get_factory()\n{\n\tstatic k3d::application_plugin_factory<user_interface,\n\t\tk3d::interface_list<k3d::ievent_loop> > factory(\n\t\tk3d::uuid(0xc7c652c7, 0xfb4349fe, 0x9c7d52c4, 0x9f9e9d3f),\n\t\t\"QtUI\",\n\t\t\"Qt User Interface (QtUI)\",\n\t\t\"Interface\");\n\n\treturn factory;\n}\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::user_interface::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui/user_interface.h",
    "content": "#ifndef MODULES_QTUI_USER_INTERFACE_H\n#define MODULES_QTUI_USER_INTERFACE_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/ievent_loop.h>\n\n#include <QComboBox>\n#include <QMainWindow>\n#include <QSplashScreen>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d { class iplugin_factory; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// user_interface\n\n/// Implements the Qt User Interface plugin\nclass user_interface :\n\tpublic k3d::ievent_loop,\n\tpublic k3d::iuser_interface\n{\npublic:\t\n\tuser_interface();\n\t~user_interface();\n\n\tvoid get_command_line_arguments(boost::program_options::options_description& Description);\n\tconst arguments_t parse_startup_arguments(const arguments_t& Arguments, bool& Quit, bool& Error);\n\tvoid startup_message_handler(const k3d::string_t& Message);\n\tvoid display_user_interface();\n\tconst arguments_t parse_runtime_arguments(const arguments_t& Arguments, bool& Quit, bool& Error);\n\tvoid start_event_loop();\n\tvoid stop_event_loop();\n\n\tvoid open_uri(const k3d::string_t& URI);\n\tvoid message(const k3d::string_t& Message);\n\tvoid warning_message(const k3d::string_t& Message);\n\tvoid error_message(const k3d::string_t& Message);\n\tk3d::uint_t query_message(const k3d::string_t& Message, const k3d::uint_t DefaultOption, const std::vector<k3d::string_t>& Options);\n\tvoid nag_message(const k3d::string_t& Type, const k3d::ustring& Message, const k3d::ustring& SecondaryMessage);\n\tbool get_file_path(const k3d::ipath_property::mode_t Mode, const k3d::string_t& Type, const k3d::string_t& Prompt, const k3d::filesystem::path& OldPath, k3d::filesystem::path& Result);\n\tbool show(iunknown& Object);\n\tvoid synchronize();\n\tsigc::connection get_timer(const double FrameRate, sigc::slot<void> Slot);\n\tk3d::uint_t watch_path(const k3d::filesystem::path& Path, const sigc::slot<void>& Slot);\n\tvoid unwatch_path(const k3d::uint_t WatchID);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\nprivate:\n\tboost::scoped_ptr<QApplication> m_application;\n\tboost::scoped_ptr<QSplashScreen> m_splash_box;\n\t/// Keeps track of auto-start plugins\n\tstd::vector<k3d::iunknown*> m_auto_start_plugins;\n};\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_USER_INTERFACE_H\n\n"
  },
  {
    "path": "modules/qtui/user_interface.qrc",
    "content": "<RCC>\n  <qresource prefix=\"QTUI\">\n    <file>splash.png</file>\n    <file>stylesheet.css</file>\n    <file>window_icon.png</file>\n  </qresource>\n</RCC>\n"
  },
  {
    "path": "modules/qtui/viewport.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"viewport.h\"\n\n#include <QGLWidget>\n#include <QResizeEvent>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\n//////////////////////////////////////////////////////////////////////////\n// viewport\n\nviewport::viewport(QWidget* parent) :\n\tQGraphicsView(parent)\n{\n//\tsetRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);\n\tsetViewport(new QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer)));\n\tsetViewportUpdateMode(QGraphicsView::FullViewportUpdate);\n}\n\nviewport::~viewport()\n{\n}\n\nvoid viewport::resizeEvent(QResizeEvent *event)\n{\n\tif(scene())\n\t\tscene()->setSceneRect(QRect(QPoint(0, 0), event->size()));\n\tQGraphicsView::resizeEvent(event);\n}\n\n} // namespace qtui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/qtui/viewport.h",
    "content": "#ifndef MODULES_QTUI_VIEWPORT_H\n#define MODULES_QTUI_VIEWPORT_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your argument) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <QGraphicsView>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\n//////////////////////////////////////////////////////////////////////////\n// viewport\n\nclass viewport :\n\tpublic QGraphicsView\n{\n\tQ_OBJECT;\n\npublic:\n\tviewport(QWidget* parent = 0);\n\t~viewport();\n\nprotected:\n\tvoid resizeEvent(QResizeEvent *event);\n};\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_VIEWPORT_H\n\n"
  },
  {
    "path": "modules/qtui_about_dialog/CMakeLists.txt",
    "content": "QT4_ADD_RESOURCES(RESOURCES dialog.qrc)\nQT4_WRAP_UI(UI_BUILT_SOURCES dialog.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-about-dialog EXTRA_SOURCES ${RESOURCES} ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-about-dialog)\n"
  },
  {
    "path": "modules/qtui_about_dialog/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <ui_dialog.h>\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/contributors.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/qtui/application_widget.h>\n\n#include <QDialog>\n\n#include <boost/assign/list_of.hpp>\n#include <sstream>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace about\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dialog\n\n/// Creates an \"about\" box that displays program version and copyright\nclass dialog :\n\tpublic QDialog,\n\tpublic k3d::iunknown\n{\npublic:\n\tdialog() :\n\t\tapplication_widget(*this)\n\t{\n\t\tui.setupUi(this);\n\n\t\tui.version->setText(\"K-3D Version \" K3D_VERSION);\n\t\tui.copyright->setText(K3D_COPYRIGHT);\n\n\t\tstd::ostringstream buffer;\n\t\tbuffer << \"<html>\";\n\t\tbuffer << \"<body>\";\n\t\tbuffer << \"<br/><br/><br/>\";\n\t\tconst k3d::contributors_t& contributors = k3d::contributors();\n\t\tfor(k3d::contributors_t::const_iterator contributor = contributors.begin(); contributor != contributors.end(); ++contributor)\n\t\t{\n\t\t\tif(contributor->category.size())\n\t\t\t{\n\t\t\t\tbuffer << \"<br/><div align='center' style='color: #5555ff; font-size: 18px;'>\" << contributor->category << \"</div><br/><br/>\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbuffer << \"<div align='center' style='color: #000000; font-size: 16px; font-weight: bold;'>\" << contributor->name.raw() << \"</div>\";\n\t\t\t\tbuffer << \"<div align='center' style='color: #555555; font-size: 10px;'>\" << contributor->description << \"</div><br/>\";\n\t\t\t}\n\t\t}\n\t\tbuffer << \"</body>\";\n\t\tbuffer << \"</html>\";\n\t\tui.contributors->setHtml(QString::fromUtf8(buffer.str().c_str()));\n\n\t\tthis->setAttribute(Qt::WA_DeleteOnClose);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<dialog> factory(\n\t\t\tk3d::uuid(0x9914fe3d, 0xf8402979, 0x22b7769e, 0xbeea9df1),\n\t\t\t\"QTUIAboutDialog\",\n\t\t\t_(\"Displays the current K-3D version and credits contributors\"),\n\t\t\t\"QTUI Dialog\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\tboost::assign::map_list_of(\"qtui:component-type\", \"window\"));\n\n\t\treturn factory;\n\t}\n\n\tUi::QTUIAboutDialog ui;\n\tk3d::qtui::application_widget application_widget;\n};\n\n} // namespace about\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::about::dialog::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_about_dialog/dialog.qrc",
    "content": "<RCC>\n  <qresource prefix=\"QTUIAboutDialog\">\n    <file>about.png</file>\n  </qresource>\n</RCC>\n"
  },
  {
    "path": "modules/qtui_about_dialog/dialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QTUIAboutDialog</class>\n <widget class=\"QDialog\" name=\"QTUIAboutDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>370</width>\n    <height>557</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>About K-3D</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QTabWidget\" name=\"tabWidget\">\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <widget class=\"QWidget\" name=\"tab\">\n      <attribute name=\"title\">\n       <string>Copyright</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n       <item>\n        <widget class=\"QLabel\" name=\"label\">\n         <property name=\"text\">\n          <string/>\n         </property>\n         <property name=\"pixmap\">\n          <pixmap resource=\"dialog.qrc\">:/QTUIAboutDialog/about.png</pixmap>\n         </property>\n         <property name=\"alignment\">\n          <set>Qt::AlignCenter</set>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"version\">\n         <property name=\"font\">\n          <font>\n           <pointsize>18</pointsize>\n           <weight>75</weight>\n           <bold>true</bold>\n          </font>\n         </property>\n         <property name=\"text\">\n          <string/>\n         </property>\n         <property name=\"alignment\">\n          <set>Qt::AlignCenter</set>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"copyright\">\n         <property name=\"text\">\n          <string/>\n         </property>\n         <property name=\"alignment\">\n          <set>Qt::AlignCenter</set>\n         </property>\n         <property name=\"wordWrap\">\n          <bool>true</bool>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"additionalCopyright\">\n         <property name=\"text\">\n          <string>Portions copyright (c) 2002, Industrial Light &amp; Magic, a division of Lucas Digital Ltd. LLC</string>\n         </property>\n         <property name=\"alignment\">\n          <set>Qt::AlignCenter</set>\n         </property>\n         <property name=\"wordWrap\">\n          <bool>true</bool>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"tab_2\">\n      <attribute name=\"title\">\n       <string>License</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n       <item>\n        <widget class=\"QTextBrowser\" name=\"textBrowser\">\n         <property name=\"html\">\n          <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;GNU GENERAL PUBLIC LICENSE&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Version 2, June 1991 &lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Copyright (C) 1989, 1991 Free Software Foundation, Inc.  &lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Courier New,courier';&quot;&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Everyone is permitted to copy and distribute verbatim copies&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;of this license document, but changing it is not allowed. &lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Preamble &lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The precise terms and conditions for copying, distribution and modification follow. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION&lt;/span&gt; &lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;0.&lt;/span&gt; This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The &amp;quot;Program&amp;quot;, below, refers to any such program or work, and a &amp;quot;work based on the Program&amp;quot; means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term &amp;quot;modification&amp;quot;.) Each licensee is addressed as &amp;quot;you&amp;quot;. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;1.&lt;/span&gt; You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;2.&lt;/span&gt; You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: &lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:30px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;a)&lt;/span&gt; You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. &lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:30px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;b)&lt;/span&gt; You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. &lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:8px; margin-left:30px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;c)&lt;/span&gt; If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;3.&lt;/span&gt; You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: &lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:30px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;a)&lt;/span&gt; Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, &lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:30px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;b)&lt;/span&gt; Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, &lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:8px; margin-left:30px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;c)&lt;/span&gt; Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;4.&lt;/span&gt; You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;5.&lt;/span&gt; You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;6.&lt;/span&gt; Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;7.&lt;/span&gt; If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;8.&lt;/span&gt; If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;9.&lt;/span&gt; The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and &amp;quot;any later version&amp;quot;, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;10.&lt;/span&gt; If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;NO WARRANTY&lt;/span&gt; &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;11.&lt;/span&gt; BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &amp;quot;AS IS&amp;quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;12.&lt;/span&gt; IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. &lt;/p&gt;\n&lt;p style=&quot; margin-top:14px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:large; font-weight:600;&quot;&gt;END OF TERMS AND CONDITIONS&lt;/span&gt; &lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;How to Apply These Terms to Your New Programs &lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the &amp;quot;copyright&amp;quot; line and a pointer to where the full notice is found. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-style:italic;&quot;&gt;one line to give the program's name and an idea of what it does.&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Copyright (C) &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-style:italic;&quot;&gt;yyyy&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;  &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-style:italic;&quot;&gt;name of author&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Courier New,courier'; font-style:italic;&quot;&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;This program is free software; you can redistribute it and/or&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;modify it under the terms of the GNU General Public License&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;as published by the Free Software Foundation; either version 2&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;of the License, or (at your option) any later version.&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Courier New,courier';&quot;&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;This program is distributed in the hope that it will be useful,&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;GNU General Public License for more details.&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Courier New,courier';&quot;&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;You should have received a copy of the GNU General Public License&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;along with this program; if not, write to the Free Software&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. &lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Also add information on how to contact you by electronic and paper mail. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;If the program is interactive, make it output a short notice like this when it starts in an interactive mode: &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Gnomovision version 69, Copyright (C) &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-style:italic;&quot;&gt;year&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt; &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-style:italic;&quot;&gt;name of author&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Gnomovision comes with ABSOLUTELY NO WARRANTY; for details&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;type `show w'.  This is free software, and you are welcome&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;to redistribute it under certain conditions; type `show c' &lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;for details. &lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The hypothetical commands &lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;`show w'&lt;/span&gt; and &lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;`show c'&lt;/span&gt; should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than &lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;`show w'&lt;/span&gt; and &lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;`show c'&lt;/span&gt;; they could even be mouse-clicks or menu items--whatever suits your program. &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;You should also get your employer (if you work as a programmer) or your school, if any, to sign a &amp;quot;copyright disclaimer&amp;quot; for the program, if necessary. Here is a sample; alter the names: &lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Yoyodyne, Inc., hereby disclaims all copyright&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;interest in the program `Gnomovision'&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;(which makes passes at compilers) written &lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;by James Hacker.&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Courier New,courier';&quot;&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-style:italic;&quot;&gt;signature of Ty Coon&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;, 1 April 1989&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Ty Coon, President of Vice &lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the &lt;span style=&quot; font-weight:600;&quot;&gt;GNU Lesser General Public License&lt;/span&gt; instead of this License. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"tab_3\">\n      <attribute name=\"title\">\n       <string>Credits</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <item>\n        <widget class=\"QTextBrowser\" name=\"contributors\"/>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources>\n  <include location=\"dialog.qrc\"/>\n </resources>\n <connections/>\n</ui>\n"
  },
  {
    "path": "modules/qtui_aqsis/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES dialog.h thread.h)\nQT4_WRAP_UI(UI_BUILT_SOURCES dialog.ui)\n\nINCLUDE_DIRECTORIES(\n\t${CMAKE_CURRENT_BINARY_DIR}\n#\t${Aqsis_INCLUDE_DIRECTORIES}\n#\t${Aqsis_SOURCE_DIR}\n#\t${Aqsis_SOURCE_DIR}/libs/core\n#\t${Aqsis_SOURCE_DIR}/libs/core/api\n#\t${Aqsis_SOURCE_DIR}/libs/core/ddmanager\n#\t${Aqsis_SOURCE_DIR}/libs/core/geometry\n#\t${Aqsis_SOURCE_DIR}/libs/core/raytrace\n\t)\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-aqsis EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-aqsis)\n#TARGET_LINK_LIBRARIES(k3d-qtui-aqsis aqsis_core)\n"
  },
  {
    "path": "modules/qtui_aqsis/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"dialog.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/qtui/application_widget.h>\n#include <k3dsdk/signal_system.h>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n#include <sstream>\n\n#include <QPainter>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace aqsis\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dialog\n\ndialog::dialog() :\n\tapplication_widget(*this)\n{\n\tui.setupUi(this);\n\tthis->setAttribute(Qt::WA_DeleteOnClose);\n\n\trender_engine.reset(new module::qtui::aqsis::thread(k3d::plugin::create<k3d::istreaming_bitmap_source>(\"EmbeddedAqsisRenderManEngine\")));\n\tQObject::connect(render_engine.get(), SIGNAL(bitmap_start(int, int)), this, SLOT(on_bitmap_start(int, int)), Qt::BlockingQueuedConnection);\n\tQObject::connect(render_engine.get(), SIGNAL(bitmap_bucket(int, int, const k3d::istreaming_bitmap_source::bucket*)), this, SLOT(on_bitmap_bucket(int, int, const k3d::istreaming_bitmap_source::bucket*)), Qt::BlockingQueuedConnection);\n\tQObject::connect(render_engine.get(), SIGNAL(bitmap_finish()), this, SLOT(on_bitmap_finish()), Qt::BlockingQueuedConnection);\n\trender_engine->start();\n}\n\nvoid dialog::on_cancel_render_clicked()\n{\n\trender_engine->cancel();\n}\n\nvoid dialog::on_bitmap_start(int Width, int Height)\n{\n\timage = QPixmap(Width, Height);\n\timage.fill(QColor(128, 128, 128));\n\tui.image->setPixmap(image);\n}\n\nvoid dialog::on_bitmap_bucket(int XOffset, int YOffset, const k3d::istreaming_bitmap_source::bucket* Bucket)\n{\n\tQPainter painter(&image);\n\tfor(int y = 0; y != Bucket->height(); ++y)\n\t{\n\t\tfor(int x = 0; x != Bucket->width(); ++x)\n\t\t{\n\t\t\tdouble red = get_color(*Bucket->at(x, y), boost::gil::red_t());\n\t\t\tdouble green = get_color(*Bucket->at(x, y), boost::gil::green_t());\n\t\t\tdouble blue = get_color(*Bucket->at(x, y), boost::gil::blue_t());\n\t\t\tpainter.setPen(QColor::fromRgbF(red, green, blue));\n\t\t\tpainter.drawPoint(x + XOffset, y + YOffset);\n\t\t}\n\t}\n\n\tui.image->setPixmap(image);\n}\n\nvoid dialog::on_bitmap_finish()\n{\n}\n\nk3d::iplugin_factory& dialog::get_factory()\n{\n\tstatic k3d::application_plugin_factory<dialog> factory(\n\t\tk3d::uuid(0xa467cfdd, 0x2545d997, 0x07ecf8a2, 0x042455fb),\n\t\t\"QTUIAqsisDialog\",\n\t\t_(\"Displays output from an embedded Aqsis RenderMan engine.\"),\n\t\t\"QTUI Dialog\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"window\"));\n\n\treturn factory;\n}\n\n} // namespace aqsis\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::aqsis::dialog::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_aqsis/dialog.h",
    "content": "#ifndef MODULES_QTUI_AQSIS_DIALOG_H\n#define MODULES_QTUI_AQSIS_DIALOG_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"thread.h\"\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/qtui/application_widget.h>\n\n#include <ui_dialog.h>\n\n#include <QMainWindow>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d { class iplugin_factory; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace aqsis\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dialog\n\n/// Displays output from an embedded Aqsis render engine\nclass dialog :\n\tpublic QMainWindow,\n\tpublic k3d::iunknown\n{\n\tQ_OBJECT;\n\npublic:\n\tdialog();\n\n\tstatic k3d::iplugin_factory& get_factory();\n\npublic Q_SLOTS:\n\tvoid on_cancel_render_clicked();\n\tvoid on_bitmap_start(int Width, int Height);\n\tvoid on_bitmap_bucket(int XOffset, int YOffset, const k3d::istreaming_bitmap_source::bucket* Bucket);\n\tvoid on_bitmap_finish();\n\nprivate:\n\tUi::QTUIAqsisDialog ui;\n\tk3d::qtui::application_widget application_widget;\n\tQPixmap image;\n\tboost::scoped_ptr<module::qtui::aqsis::thread> render_engine;\n};\n\n} // namespace aqsis\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_AQSIS_DIALOG_H\n"
  },
  {
    "path": "modules/qtui_aqsis/dialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QTUIAqsisDialog</class>\n <widget class=\"QMainWindow\" name=\"QTUIAqsisDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>512</width>\n    <height>512</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Aqsis Testing</string>\n  </property>\n  <widget class=\"QWidget\" name=\"centralwidget\">\n   <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n    <item>\n     <widget class=\"QPushButton\" name=\"cancel_render\">\n      <property name=\"text\">\n       <string>Cancel Render</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QLabel\" name=\"image\">\n      <property name=\"text\">\n       <string>Aqsis Output</string>\n      </property>\n      <property name=\"alignment\">\n       <set>Qt::AlignCenter</set>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n  <action name=\"edit_quit\">\n   <property name=\"text\">\n    <string>Quit</string>\n   </property>\n  </action>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "modules/qtui_aqsis/thread.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"thread.h\"\n\n#include <k3dsdk/imeta_object.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/signal_system.h>\n#include <vector>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace aqsis\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// thread\n\nthread::thread(k3d::istreaming_bitmap_source* Source) :\n\tsource(Source),\n\tcancelled(false)\n{\n}\n\nvoid thread::cancel()\n{\n\tcancelled = true;\n}\n\nvoid thread::run()\n{\n\tsource->connect_bitmap_start_signal(sigc::mem_fun(*this, &thread::on_bitmap_start));\n\tsource->connect_bitmap_bucket_signal(sigc::mem_fun(*this, &thread::on_bitmap_bucket));\n\tsource->connect_bitmap_finish_signal(sigc::mem_fun(*this, &thread::on_bitmap_finish));\n\n\tk3d::imeta_object* const meta_object = dynamic_cast<k3d::imeta_object*>(source);\n\treturn_if_fail(meta_object);\n\tmeta_object->execute(\"render\");\n}\n\nvoid thread::process_cancellation()\n{\n\tif(!cancelled)\n\t\treturn;\n\n\tk3d::imeta_object* const meta_object = dynamic_cast<k3d::imeta_object*>(source);\n\treturn_if_fail(meta_object);\n\tmeta_object->execute(\"cancel\");\n}\n\nvoid thread::on_bitmap_start(k3d::istreaming_bitmap_source::coordinate Width, k3d::istreaming_bitmap_source::coordinate Height)\n{\n\tQ_EMIT bitmap_start(Width, Height);\n\tprocess_cancellation();\n}\n\nvoid thread::on_bitmap_bucket(k3d::istreaming_bitmap_source::coordinate XOffset, k3d::istreaming_bitmap_source::coordinate YOffset, const k3d::istreaming_bitmap_source::bucket& Bucket)\n{\n\tQ_EMIT bitmap_bucket(XOffset, YOffset, &Bucket);\n\tprocess_cancellation();\n}\n\nvoid thread::on_bitmap_finish()\n{\n\tQ_EMIT bitmap_finish();\n\tprocess_cancellation();\n}\n\n} // namespace aqsis\n\n} // namespace qtui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/qtui_aqsis/thread.h",
    "content": "#ifndef MODULES_QTUI_AQSIS_THREAD_H\n#define MODULES_QTUI_AQSIS_THREAD_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <QThread>\n\n#include <k3dsdk/istreaming_bitmap_source.h>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace aqsis\n{\n\nclass thread :\n\tpublic QThread\n{\n\tQ_OBJECT;\n\npublic:\n\tthread(k3d::istreaming_bitmap_source* Source);\n\tvoid cancel();\n\nQ_SIGNALS:\n\tvoid bitmap_start(int Width, int Height);\n\tvoid bitmap_bucket(int XOffset, int YOffset, const k3d::istreaming_bitmap_source::bucket* Bucket);\n\tvoid bitmap_finish();\n\nprivate:\n\tvirtual void run();\n\n\tvoid process_cancellation();\n\n\tvoid on_bitmap_start(k3d::istreaming_bitmap_source::coordinate Width, k3d::istreaming_bitmap_source::coordinate Height);\n\tvoid on_bitmap_bucket(k3d::istreaming_bitmap_source::coordinate XOffset, k3d::istreaming_bitmap_source::coordinate YOffset, const k3d::istreaming_bitmap_source::bucket& Bucket);\n\tvoid on_bitmap_finish();\n\n\tk3d::istreaming_bitmap_source* const source;\n\tbool cancelled;\n};\n\n} // namespace aqsis\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_AQSIS_THREAD_H\n"
  },
  {
    "path": "modules/qtui_aqsis_mode/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES mode.h thread.h)\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-aqsis-mode EXTRA_SOURCES ${MOC_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-aqsis-mode)\n\n"
  },
  {
    "path": "modules/qtui_aqsis_mode/mode.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"mode.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/plugin.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <QGraphicsPixmapItem>\n#include <QGraphicsScene>\n#include <QPainter>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace aqsis\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mode\n\nmode::mode() :\n\tpixmap_item(0)\n{\n}\n\nvoid mode::enable(k3d::idocument& Document, QGraphicsScene& Scene)\n{\n\tpixmap_item = new QGraphicsPixmapItem();\n\tScene.addItem(pixmap_item);\n\n\trender_engine.reset(new module::qtui::aqsis::thread(k3d::plugin::create<k3d::istreaming_bitmap_source>(\"EmbeddedAqsisRenderManEngine\")));\n\tQObject::connect(render_engine.get(), SIGNAL(bitmap_start(int, int)), this, SLOT(on_bitmap_start(int, int)), Qt::BlockingQueuedConnection);\n\tQObject::connect(render_engine.get(), SIGNAL(bitmap_bucket(int, int, const k3d::istreaming_bitmap_source::bucket*)), this, SLOT(on_bitmap_bucket(int, int, const k3d::istreaming_bitmap_source::bucket*)), Qt::BlockingQueuedConnection);\n\tQObject::connect(render_engine.get(), SIGNAL(bitmap_finish()), this, SLOT(on_bitmap_finish()), Qt::BlockingQueuedConnection);\n\trender_engine->start();\n}\n\nk3d::iplugin_factory& mode::get_factory()\n{\n\tstatic k3d::application_plugin_factory<mode> factory(\n\t\tk3d::uuid(0x119ce863, 0x55493089, 0x49eb2f87, 0xb9a59431),\n\t\t\"QTUIAqsisMode\",\n\t\t_(\"Provides an edit mode that automatically previews using the Aqsis render engine.\"),\n\t\t\"QTUI Mode\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"mode\"));\n\n\treturn factory;\n}\n\nvoid mode::on_bitmap_start(int Width, int Height)\n{\n\timage = QImage(Width, Height, QImage::Format_ARGB32);\n\timage.fill(QColor(255, 255, 255, 64).rgba());\n\tpixmap_item->setPixmap(QPixmap::fromImage(image));\n}\n\nvoid mode::on_bitmap_bucket(int XOffset, int YOffset, const k3d::istreaming_bitmap_source::bucket* Bucket)\n{\n\tfor(int y = 0; y != Bucket->height(); ++y)\n\t{\n\t\tfor(int x = 0; x != Bucket->width(); ++x)\n\t\t{\n\t\t\tdouble red = get_color(*Bucket->at(x, y), boost::gil::red_t());\n\t\t\tdouble green = get_color(*Bucket->at(x, y), boost::gil::green_t());\n\t\t\tdouble blue = get_color(*Bucket->at(x, y), boost::gil::blue_t());\n\t\t\tdouble alpha = get_color(*Bucket->at(x, y), boost::gil::alpha_t());\n\t\t\timage.setPixel(x + XOffset, y + YOffset, QColor::fromRgbF(red, green, blue, alpha).rgba());\n\t\t}\n\t}\n\n\tpixmap_item->setPixmap(QPixmap::fromImage(image));\n}\n\nvoid mode::on_bitmap_finish()\n{\n}\n\n} // namespace aqsis\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::aqsis::mode::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_aqsis_mode/mode.h",
    "content": "#ifndef MODULES_QTUI_AQSIS_MODE_MODE_H\n#define MODULES_QTUI_AQSIS_MODE_MODE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"thread.h\"\n\n#include <k3dsdk/module.h>\n#include <k3dsdk/qtui/mode.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <QImage>\n\nclass QGraphicsPixmapItem;\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace aqsis\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mode\n\n/// Sets-up a default mode for use when no other mode is in-effect.\nclass mode :\n\tpublic k3d::qtui::mode,\n\tpublic k3d::iunknown\n{\n\tQ_OBJECT;\n\n\ttypedef k3d::qtui::mode base;\n\npublic:\n\tmode();\n\n\tvoid enable(k3d::idocument& Document, QGraphicsScene& Scene);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\npublic Q_SLOTS:\n\tvoid on_bitmap_start(int Width, int Height);\n\tvoid on_bitmap_bucket(int XOffset, int YOffset, const k3d::istreaming_bitmap_source::bucket* Bucket);\n\tvoid on_bitmap_finish();\n\nprivate:\n\tQImage image;\n\tQGraphicsPixmapItem* pixmap_item;\n\tboost::scoped_ptr<module::qtui::aqsis::thread> render_engine;\n};\n\n} // namespace aqsis\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_AQSIS_MODE_MODE_H\n"
  },
  {
    "path": "modules/qtui_aqsis_mode/thread.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"thread.h\"\n\n#include <k3dsdk/imeta_object.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/signal_system.h>\n#include <vector>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace aqsis\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// thread\n\nthread::thread(k3d::istreaming_bitmap_source* Source) :\n\tsource(Source)\n{\n}\n\nvoid thread::run()\n{\n\tsource->connect_bitmap_start_signal(sigc::mem_fun(*this, &thread::on_bitmap_start));\n\tsource->connect_bitmap_bucket_signal(sigc::mem_fun(*this, &thread::on_bitmap_bucket));\n\tsource->connect_bitmap_finish_signal(sigc::mem_fun(*this, &thread::on_bitmap_finish));\n\n\tk3d::imeta_object* const meta_object = dynamic_cast<k3d::imeta_object*>(source);\n\treturn_if_fail(meta_object);\n\tmeta_object->execute(\"render\");\n}\n\nvoid thread::on_bitmap_start(k3d::istreaming_bitmap_source::coordinate Width, k3d::istreaming_bitmap_source::coordinate Height)\n{\n\tQ_EMIT bitmap_start(Width, Height);\n}\n\nvoid thread::on_bitmap_bucket(k3d::istreaming_bitmap_source::coordinate XOffset, k3d::istreaming_bitmap_source::coordinate YOffset, const k3d::istreaming_bitmap_source::bucket& Bucket)\n{\n\tQ_EMIT bitmap_bucket(XOffset, YOffset, &Bucket);\n}\n\nvoid thread::on_bitmap_finish()\n{\n\tQ_EMIT bitmap_finish();\n}\n\n} // namespace aqsis\n\n} // namespace qtui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/qtui_aqsis_mode/thread.h",
    "content": "#ifndef MODULES_QTUI_AQSIS_MODE_THREAD_H\n#define MODULES_QTUI_AQSIS_MODE_THREAD_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <QThread>\n\n#include <k3dsdk/istreaming_bitmap_source.h>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace aqsis\n{\n\nclass thread :\n\tpublic QThread\n{\n\tQ_OBJECT;\n\npublic:\n\tthread(k3d::istreaming_bitmap_source* Source);\n\nQ_SIGNALS:\n\tvoid bitmap_start(int Width, int Height);\n\tvoid bitmap_bucket(int XOffset, int YOffset, const k3d::istreaming_bitmap_source::bucket* Bucket);\n\tvoid bitmap_finish();\n\nprivate:\n\tvirtual void run();\n\n\tvoid on_bitmap_start(k3d::istreaming_bitmap_source::coordinate Width, k3d::istreaming_bitmap_source::coordinate Height);\n\tvoid on_bitmap_bucket(k3d::istreaming_bitmap_source::coordinate XOffset, k3d::istreaming_bitmap_source::coordinate YOffset, const k3d::istreaming_bitmap_source::bucket& Bucket);\n\tvoid on_bitmap_finish();\n\n\tk3d::istreaming_bitmap_source* const source;\n};\n\n} // namespace aqsis\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_AQSIS_MODE_THREAD_H\n"
  },
  {
    "path": "modules/qtui_boolean/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES widget.h)\n#QT4_WRAP_UI(UI_BUILT_SOURCES widget.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-boolean EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-boolean)\n"
  },
  {
    "path": "modules/qtui_boolean/widget.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"widget.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/type_registry.h>\n\n#include <boost/assign/list_of.hpp>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace boolean\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\nwidget::widget() :\n\tproperty(0),\n\twritable_property(0),\n\tstate_recorder(0)\n{\n}\n\nvoid widget::initialize(k3d::idocument& Document, k3d::iproperty& Property, k3d::istate_recorder* StateRecorder)\n{\n\tproperty = 0;\n\twritable_property = 0;\n\tstate_recorder = 0;\n\tchange_connection.disconnect();\n\tsetEnabled(false);\n\n\treturn_if_fail(Property.property_type() == typeid(k3d::bool_t));\n\n\tproperty = &Property;\n\twritable_property = dynamic_cast<k3d::iwritable_property*>(&Property);\n\tstate_recorder = StateRecorder;\n\tchange_connection = property->property_changed_signal().connect(sigc::hide(sigc::mem_fun(*this, &widget::on_property_changed)));\n\tsetEnabled(writable_property);\n\n\ton_property_changed();\n\tQObject::connect(this, SIGNAL(clicked(bool)), this, SLOT(on_clicked(bool)));\n}\n\nvoid widget::on_clicked(bool Checked)\n{\n\treturn_if_fail(writable_property);\n\n\tconst k3d::bool_t new_value = Checked;\n\tif(new_value == boost::any_cast<k3d::bool_t>(property->property_internal_value()))\n\t\treturn;\n\n\tif(state_recorder)\n\t\tstate_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\twritable_property->property_set_value(new_value);\n\n\tif(state_recorder)\n\t\tstate_recorder->commit_change_set(state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), Checked ? property->property_label() + \" \\\"On\\\"\" : property->property_label() + \" \\\"Off\\\"\", K3D_CHANGE_SET_CONTEXT);\n}\n\nvoid widget::on_property_changed()\n{\n\tsetChecked(boost::any_cast<k3d::bool_t>(property->property_internal_value()));\n}\n\nk3d::iplugin_factory& widget::get_factory()\n{\n\tstatic k3d::application_plugin_factory<widget> factory(\n\t\tk3d::uuid(0x4b5f1aab, 0x948840f9, 0x8dcf2996, 0x2ad15be9),\n\t\t\"QTUIBooleanWidget\",\n\t\t_(\"Provides a custom property widget for k3d::bool_t properties.\"),\n\t\t\"QTUI Widget\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"property-widget\")(\"qtui:property-type\", \"k3d::bool_t\"));\n\n\treturn factory;\n}\n\n} // namespace boolean\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::boolean::widget::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_boolean/widget.h",
    "content": "#ifndef MODULES_QTUI_BOOLEAN_WIDGET_H\n#define MODULES_QTUI_BOOLEAN_WIDGET_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/qtui/property_widget.h>\n#include <k3dsdk/signal_system.h>\n#include <QCheckBox>\n\nnamespace k3d { class iplugin_factory; }\nnamespace k3d { class iwritable_property; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace boolean\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\n/// Provides a widget for k3d::bool_t properties.\nclass widget :\n  public QCheckBox,\n\tpublic k3d::qtui::property_widget,\n\tpublic k3d::iunknown\n{\n  Q_OBJECT;\n\npublic:\n  widget();\n\n\tvoid initialize(k3d::idocument& Document, k3d::iproperty& Property, k3d::istate_recorder* StateRecorder);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\npublic Q_SLOTS:\n  void on_clicked(bool Checked);\n\nprivate:\n  void on_property_changed();\n\n  k3d::iproperty* property;\n  k3d::iwritable_property* writable_property;\n  k3d::istate_recorder* state_recorder;\n\n  sigc::connection change_connection;\n};\n\n} // namespace boolean\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_BOOLEAN_WIDGET_H\n"
  },
  {
    "path": "modules/qtui_color/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES widget.h)\n#QT4_WRAP_UI(UI_BUILT_SOURCES widget.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-color EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-color)\n"
  },
  {
    "path": "modules/qtui_color/widget.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"widget.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/type_registry.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <QColorDialog>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace color\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\nwidget::widget() :\n\tproperty(0),\n\twritable_property(0),\n\tstate_recorder(0)\n{\n}\n\nvoid widget::initialize(k3d::idocument& Document, k3d::iproperty& Property, k3d::istate_recorder* StateRecorder)\n{\n\tproperty = 0;\n\twritable_property = 0;\n\tstate_recorder = 0;\n\tchange_connection.disconnect();\n\tsetEnabled(false);\n\n\treturn_if_fail(Property.property_type() == typeid(k3d::color));\n\n\tproperty = &Property;\n\twritable_property = dynamic_cast<k3d::iwritable_property*>(&Property);\n\tstate_recorder = StateRecorder;\n\tchange_connection = property->property_changed_signal().connect(sigc::hide(sigc::mem_fun(*this, &widget::on_property_changed)));\n\tsetEnabled(writable_property);\n\n\ton_property_changed();\n\tQObject::connect(this, SIGNAL(clicked(bool)), this, SLOT(on_clicked(bool)));\n}\n\nvoid widget::on_clicked(bool Checked)\n{\n\treturn_if_fail(writable_property);\n\n\tconst QColor new_color = QColorDialog::getColor(\n\t\tk3d::convert<QColor>(boost::any_cast<k3d::color>(property->property_internal_value())),\n\t\tthis,\n\t\tQString(tr(\"Select %1\")).arg(k3d::convert<QString>(property->property_label())),\n\t\t0);\n\n\tif(!new_color.isValid())\n\t\treturn;\n\n\tconst k3d::color new_value = k3d::convert<k3d::color>(new_color);\n\tif(new_value == boost::any_cast<k3d::color>(property->property_internal_value()))\n\t\treturn;\n\n\tif(state_recorder)\n\t\tstate_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\twritable_property->property_set_value(new_value);\n\n\tif(state_recorder)\n\t\tstate_recorder->commit_change_set(state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), \"Change \" + property->property_label(), K3D_CHANGE_SET_CONTEXT);\n}\n\nvoid widget::on_property_changed()\n{\n\tQPixmap pixmap(40, 40);\n\tpixmap.fill(k3d::convert<QColor>(boost::any_cast<k3d::color>(property->property_internal_value())));\n\tsetIcon(pixmap);\n}\n\nk3d::iplugin_factory& widget::get_factory()\n{\n\tstatic k3d::application_plugin_factory<widget> factory(\n\t\tk3d::uuid(0xaefddea7, 0x64e447db, 0x84976766, 0x0683062b),\n\t\t\"QTUIColorWidget\",\n\t\t_(\"Provides a custom property widget for k3d::color properties.\"),\n\t\t\"QTUI Widget\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"property-widget\")(\"qtui:property-type\", \"k3d::color\"));\n\n\treturn factory;\n}\n\n} // namespace color\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::color::widget::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_color/widget.h",
    "content": "#ifndef MODULES_QTUI_COLOR_WIDGET_H\n#define MODULES_QTUI_COLOR_WIDGET_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/qtui/property_widget.h>\n#include <k3dsdk/signal_system.h>\n#include <QToolButton>\n\nnamespace k3d { class iplugin_factory; }\nnamespace k3d { class iwritable_property; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace color\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\n/// Provides a widget for k3d::bool_t properties.\nclass widget :\n  public QToolButton,\n\tpublic k3d::qtui::property_widget,\n\tpublic k3d::iunknown\n{\n  Q_OBJECT;\n\npublic:\n  widget();\n\n\tvoid initialize(k3d::idocument& Document, k3d::iproperty& Property, k3d::istate_recorder* StateRecorder);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\npublic Q_SLOTS:\n  void on_clicked(bool Checked);\n\nprivate:\n  void on_property_changed();\n\n  k3d::iproperty* property;\n  k3d::iwritable_property* writable_property;\n  k3d::istate_recorder* state_recorder;\n  sigc::connection change_connection;\n};\n\n} // namespace color\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_COLOR_WIDGET_H\n"
  },
  {
    "path": "modules/qtui_default_mode/CMakeLists.txt",
    "content": "K3D_BUILD_QTUI_MODULE(k3d-qtui-default-mode)\nK3D_CREATE_MODULE_PROXY(k3d-qtui-default-mode)\n\n"
  },
  {
    "path": "modules/qtui_default_mode/mode.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/qtui/mode.h>\n\n#include <boost/assign/list_of.hpp>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace def\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mode\n\n/// Sets-up a default mode for use when no other mode is in-effect.\nclass mode :\n\tpublic k3d::qtui::mode,\n\tpublic k3d::iunknown\n{\n\ttypedef k3d::qtui::mode base;\n\npublic:\n\tmode()\n\t{\n\t}\n\n\tvoid enable(k3d::idocument& Document, QGraphicsScene& Scene)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<mode> factory(\n\t\t\tk3d::uuid(0x6b5cbfd7, 0x8742246c, 0x5345988d, 0x2e14ecf7),\n\t\t\t\"QTUIDefaultMode\",\n\t\t\t_(\"Provides default behavior when no other mode is in-use.\"),\n\t\t\t\"QTUI Mode\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\tboost::assign::map_list_of(\"qtui:component-type\", \"mode\"));\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace def\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::def::mode::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_javascript_shell/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES shell.h)\nQT4_WRAP_UI(UI_BUILT_SOURCES shell.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-javascript-shell EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-javascript-shell)\nTARGET_LINK_LIBRARIES(k3d-qtui-javascript-shell k3dsdk-qtui-script)\n"
  },
  {
    "path": "modules/qtui_javascript_shell/shell.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"shell.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/script/engine.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <QDateTime>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace javascript\n{\n\nshell::shell() :\n\tapplication_widget(*this)\n{\n\tui.setupUi(this);\n\tthis->setAttribute(Qt::WA_DeleteOnClose);\n\n\tscript_engine.reset(k3d::qtui::script::engine());\n\n\t// Redirect script output to the console ...\n\tQScriptValue custom_print = script_engine->newFunction(&shell::print, 1);\n\tcustom_print.setData(script_engine->newQObject(this));\n\tscript_engine->globalObject().setProperty(\"print\", custom_print);\n\n\tprompt();\n}\n\nk3d::iplugin_factory& shell::get_factory()\n{\n\tstatic k3d::application_plugin_factory<shell> factory(\n\t\tk3d::uuid(0x36e6340d, 0x36456f5f, 0x2e68eeb8, 0x970050e5),\n\t\t\"QTUIJavaScriptShell\",\n\t\t_(\"Provides an interactive JavaScript shell.\"),\n\t\t\"QTUI\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"window\")\n\t\t);\n\n\treturn factory;\n}\n\nvoid shell::on_console_execute(const QString& Command)\n{\n\tQScriptValue result = script_engine->evaluate(Command);\n\n\tif(result.isError())\n\t\tui.console->print_html(\"<span style='color: #f00'>\" + result.toString() + \"</span>\");\n\telse if(!result.isUndefined())\n\t\tui.console->print_html(\"<span style='color: #00f'>\" + result.toString() + \"</span>\");\n\t\n\tprompt();\n}\n\nvoid shell::on_shell_clear_activated()\n{\n\tui.console->clear();\n\tprompt();\n}\n\nvoid shell::prompt()\n{\n\tui.console->print_html(\"<span style='color: #ccc'>&gt;&gt;&gt;</span> \");\n}\n\nQScriptValue shell::print(QScriptContext* Context, QScriptEngine* Engine)\n{\n\tqobject_cast<shell*>(Context->callee().data().toQObject())->ui.console->print_html(\"<span style='color: #00f'>\" + Context->argument(0).toString() + \"</span>\");\n\treturn QScriptValue();\n}\n\n} // namespace javascript\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::javascript::shell::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_javascript_shell/shell.h",
    "content": "#ifndef MODULES_QTUI_JAVASCRIPT_SHELL_SHELL_H\n#define MODULES_QTUI_JAVASCRIPT_SHELL_SHELL_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"ui_shell.h\"\n\n#include <k3dsdk/log_control.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/qtui/application_widget.h>\n#include <k3dsdk/signal_system.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <QMainWindow>\n#include <QScriptEngine>\n\nnamespace k3d { class iplugin_factory; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace javascript\n{\n\nclass shell :\n\tpublic QMainWindow,\n\tpublic k3d::iunknown,\n\tpublic sigc::trackable\n{\n\tQ_OBJECT;\n\n\ttypedef QMainWindow base;\n\npublic:\n\tshell();\n\n\tstatic k3d::iplugin_factory& get_factory();\n\npublic Q_SLOTS:\n\tvoid on_console_execute(const QString& Command);\n\tvoid on_shell_clear_activated();\n\nprivate:\n\tstatic QScriptValue print(QScriptContext* Context, QScriptEngine* Engine);\n\tvoid prompt();\n\n\tUi::QTUIJavaScriptShell ui;\n\tk3d::qtui::application_widget application_widget;\n\tboost::scoped_ptr<QScriptEngine> script_engine;\n};\n\n} // namespace javascript\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_JAVASCRIPT_SHELL_SHELL_H\n\n"
  },
  {
    "path": "modules/qtui_javascript_shell/shell.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QTUIJavaScriptShell</class>\n <widget class=\"QMainWindow\" name=\"QTUIJavaScriptShell\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>600</width>\n    <height>400</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>K-3D JavaScript Shell</string>\n  </property>\n  <widget class=\"QWidget\" name=\"centralwidget\">\n   <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n    <item>\n     <widget class=\"k3d::qtui::console::widget\" name=\"console\">\n      <property name=\"undoRedoEnabled\">\n       <bool>false</bool>\n      </property>\n      <property name=\"lineWrapMode\">\n       <enum>QPlainTextEdit::NoWrap</enum>\n      </property>\n      <property name=\"readOnly\">\n       <bool>false</bool>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n  <widget class=\"QMenuBar\" name=\"menuBar\">\n   <property name=\"geometry\">\n    <rect>\n     <x>0</x>\n     <y>0</y>\n     <width>600</width>\n     <height>23</height>\n    </rect>\n   </property>\n   <widget class=\"QMenu\" name=\"menuShell\">\n    <property name=\"title\">\n     <string>Shell</string>\n    </property>\n    <addaction name=\"shell_clear\"/>\n   </widget>\n   <addaction name=\"menuShell\"/>\n  </widget>\n  <action name=\"shell_clear\">\n   <property name=\"text\">\n    <string>Clear</string>\n   </property>\n  </action>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>k3d::qtui::console::widget</class>\n   <extends>QPlainTextEdit</extends>\n   <header location=\"global\">k3dsdk/qtui/console.h</header>\n  </customwidget>\n </customwidgets>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "modules/qtui_log/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES window.h)\nQT4_WRAP_UI(UI_BUILT_SOURCES window.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-log EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-log)\n"
  },
  {
    "path": "modules/qtui_log/window.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"window.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/qtui/convert.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <QDateTime>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace log\n{\n\nwindow::window() :\n\tapplication_widget(*this)\n{\n\tui.setupUi(this);\n\n\tk3d::get_log_cache(sigc::mem_fun(*this, &window::on_log_message));\n\tk3d::connect_log_message(sigc::mem_fun(*this, &window::on_log_message));\n\n\tthis->setAttribute(Qt::WA_DeleteOnClose);\n}\n\nvoid window::on_log_message(const time_t Timestamp, const k3d::log_level_t Level, const std::string& Message)\n{\n\tQString buffer;\n\n\tbuffer += \"<span style='color: grey; font-size: small;'>\";\n\tbuffer += QDateTime::fromTime_t(Timestamp).toString(Qt::ISODate);\n\tbuffer += \"</span>\";\n\n\tswitch(Level)\n\t{\n\tcase k3d::K3D_LOG_LEVEL_CRITICAL:\n\t\tbuffer += \"<span style='color: darkred; font-weight:bold;'>\";\n\t\tbreak;\n\tcase k3d::K3D_LOG_LEVEL_ERROR:\n\t\tbuffer += \"<span style='color: red; font-weight:bold;'>\";\n\t\tbreak;\n\tcase k3d::K3D_LOG_LEVEL_WARNING:\n\t\tbuffer += \"<span style='color: orange;'>\";\n\t\tbreak;\n\tcase k3d::K3D_LOG_LEVEL_INFO:\n\t\tbuffer += \"<span>\";\n\t\tbreak;\n\tcase k3d::K3D_LOG_LEVEL_DEBUG:\n\t\tbuffer += \"<span style='color: green;'>\";\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tswitch(Level)\n\t{\n\tcase k3d::K3D_LOG_LEVEL_CRITICAL:\n\t\tbuffer += \" CRITICAL: \";\n\t\tbreak;\n\tcase k3d::K3D_LOG_LEVEL_ERROR:\n\t\tbuffer += \" ERROR: \";\n\t\tbreak;\n\tcase k3d::K3D_LOG_LEVEL_WARNING:\n\t\tbuffer += \" WARNING: \";\n\t\tbreak;\n\tcase k3d::K3D_LOG_LEVEL_INFO:\n\t\tbuffer += \" INFO: \";\n\t\tbreak;\n\tcase k3d::K3D_LOG_LEVEL_DEBUG:\n\t\tbuffer += \" DEBUG: \";\n\t\tbreak;\n\t}\n\n\tbuffer += k3d::convert<QString>(Message);\n\n\tbuffer += \"</span>\";\n\n\tui.console->print_html(buffer);\n}\n\nk3d::iplugin_factory& window::get_factory()\n{\n\tstatic k3d::application_plugin_factory<window> factory(\n\t\tk3d::uuid(0xb7ca1696, 0x3d4c5f65, 0xf379149e, 0xd3412d61),\n\t\t\"QTUILog\",\n\t\t_(\"Displays the contents of the K-3D log\"),\n\t\t\"QTUI\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"window\")\n\t\t);\n\n\treturn factory;\n}\n\n} // namespace log\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::log::window::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_log/window.h",
    "content": "#ifndef MODULES_QTUI_LOG_WINDOW_H\n#define MODULES_QTUI_LOG_WINDOW_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"ui_window.h\"\n\n#include <k3dsdk/log_control.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/qtui/application_widget.h>\n#include <k3dsdk/signal_system.h>\n\n#include <QMainWindow>\n\nnamespace k3d { class iplugin_factory; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace log\n{\n\nclass window :\n\tpublic QMainWindow,\n\tpublic k3d::iunknown,\n\tpublic sigc::trackable\n{\n\tQ_OBJECT;\n\n\ttypedef QMainWindow base;\n\npublic:\n\twindow();\n\n\tvoid on_log_message(const time_t Timestamp, const k3d::log_level_t Level, const std::string& Message);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\nprivate:\n\tUi::QTUILog ui;\n\tk3d::qtui::application_widget application_widget;\n};\n\n} // namespace log\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_LOG_WINDOW_H\n\n"
  },
  {
    "path": "modules/qtui_log/window.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QTUILog</class>\n <widget class=\"QMainWindow\" name=\"QTUILog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>600</width>\n    <height>400</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>K-3D Log Window</string>\n  </property>\n  <widget class=\"QWidget\" name=\"centralwidget\">\n   <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n    <item>\n     <widget class=\"k3d::qtui::console::widget\" name=\"console\">\n      <property name=\"undoRedoEnabled\">\n       <bool>false</bool>\n      </property>\n      <property name=\"lineWrapMode\">\n       <enum>QPlainTextEdit::NoWrap</enum>\n      </property>\n      <property name=\"readOnly\">\n       <bool>true</bool>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>k3d::qtui::console::widget</class>\n   <extends>QPlainTextEdit</extends>\n   <header location=\"global\">k3dsdk/qtui/console.h</header>\n  </customwidget>\n </customwidgets>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "modules/qtui_matrix/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES dialog.h widget.h)\nQT4_WRAP_UI(UI_BUILT_SOURCES dialog.ui widget.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-matrix EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-matrix)\n"
  },
  {
    "path": "modules/qtui_matrix/dialog.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n#include \"dialog.h\"\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dialog\n\ndialog::dialog(const k3d::matrix4& Value) :\n\tvalue(Value)\n{\n\tui.setupUi(this);\n\n\tfor(int i = 0; i != 4; ++i)\n\t{\n\t\tfor(int j = 0; j != 4; ++j)\n\t\t{\n\t\t\tui.matrix->setItem(i, j, new QTableWidgetItem(QString::number(value[i][j])));\n\t\t}\n\t}\n\n\tQObject::connect(this, SIGNAL(accepted()), this, SLOT(on_accepted()));\n}\n\nvoid dialog::on_accepted()\n{\n\tfor(int i = 0; i != 4; ++i)\n\t{\n\t\tfor(int j = 0; j != 4; ++j)\n\t\t{\n\t\t\tvalue[i][j] = ui.matrix->item(i, j)->text().toDouble();\n\t\t}\n\t}\n}\n\n} // namespace matrix\n\n} // namespace qtui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/qtui_matrix/dialog.h",
    "content": "#ifndef MODULES_QTUI_MATRIX_DIALOG_H\n#define MODULES_QTUI_MATRIX_DIALOG_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n#include \"ui_dialog.h\"\n#include <k3dsdk/algebra.h>\n#include <QDialog>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// dialog\n\n/// Provides a dialog for k3d::matrix4 properties.\nclass dialog :\n\tpublic QDialog\n{\n\tQ_OBJECT;\n\npublic:\n\tdialog(const k3d::matrix4& Value);\n\n\tk3d::matrix4 value;\n\nprivate Q_SLOTS:\n\tvoid on_accepted();\n\nprivate:\n\tUi::QTUIMatrixDialog ui;\n};\n\n} // namespace matrix\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_MATRIX_DIALOG_H\n"
  },
  {
    "path": "modules/qtui_matrix/dialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QTUIMatrixDialog</class>\n <widget class=\"QDialog\" name=\"QTUIMatrixDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>371</width>\n    <height>218</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Dialog</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QTableWidget\" name=\"matrix\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Expanding\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"verticalScrollBarPolicy\">\n      <enum>Qt::ScrollBarAlwaysOff</enum>\n     </property>\n     <property name=\"horizontalScrollBarPolicy\">\n      <enum>Qt::ScrollBarAlwaysOff</enum>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>false</bool>\n     </property>\n     <property name=\"cornerButtonEnabled\">\n      <bool>false</bool>\n     </property>\n     <property name=\"rowCount\">\n      <number>4</number>\n     </property>\n     <property name=\"columnCount\">\n      <number>4</number>\n     </property>\n     <attribute name=\"horizontalHeaderDefaultSectionSize\">\n      <number>80</number>\n     </attribute>\n     <attribute name=\"horizontalHeaderDefaultSectionSize\">\n      <number>80</number>\n     </attribute>\n     <row/>\n     <row/>\n     <row/>\n     <row/>\n     <column/>\n     <column/>\n     <column/>\n     <column/>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>QTUIMatrixDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>QTUIMatrixDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "modules/qtui_matrix/widget.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n#include \"dialog.h\"\n#include \"widget.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/type_registry.h>\n\n#include <boost/assign/list_of.hpp>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\nwidget::widget() :\n\tproperty(0),\n\twritable_property(0),\n\tstate_recorder(0)\n{\n\tui.setupUi(this);\n}\n\nvoid widget::initialize(k3d::idocument& Document, k3d::iproperty& Property, k3d::istate_recorder* StateRecorder)\n{\n\tproperty = 0;\n\twritable_property = 0;\n\tstate_recorder = 0;\n\tchange_connection.disconnect();\n\tsetEnabled(false);\n\n\treturn_if_fail(Property.property_type() == typeid(k3d::matrix4));\n\n\tproperty = &Property;\n\twritable_property = dynamic_cast<k3d::iwritable_property*>(&Property);\n\tstate_recorder = StateRecorder;\n\tchange_connection = property->property_changed_signal().connect(sigc::hide(sigc::mem_fun(*this, &widget::on_property_changed)));\n\tsetEnabled(writable_property);\n\n\ton_property_changed();\n}\n\nvoid widget::on_browse_clicked()\n{\n\treturn_if_fail(writable_property);\n\n\tmatrix::dialog dialog(boost::any_cast<k3d::matrix4>(property->property_internal_value()));\n\tif(QDialog::Rejected == dialog.exec())\n\t\treturn;\n\n\tconst k3d::matrix4 new_value = dialog.value;\n\tif(new_value == boost::any_cast<k3d::matrix4>(property->property_internal_value()))\n\t\treturn;\n\n\tif(state_recorder)\n\t\tstate_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\twritable_property->property_set_value(new_value);\n\n\tif(state_recorder)\n\t\tstate_recorder->commit_change_set(state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), \"Change \" + property->property_label(), K3D_CHANGE_SET_CONTEXT);\n}\n\nvoid widget::on_property_changed()\n{\n\tstd::ostringstream buffer;\n\tbuffer << boost::any_cast<k3d::matrix4>(property->property_internal_value());\n\tui.matrix->setText(k3d::convert<QString>(buffer.str()));\n}\n\nk3d::iplugin_factory& widget::get_factory()\n{\n\tstatic k3d::application_plugin_factory<widget> factory(\n\t k3d::uuid(0x389157f9, 0x317e4c5d, 0xac3bfc9e, 0x1452f1aa),\n\t\t\"QTUIMatrixWidget\",\n\t\t_(\"Provides a custom property widget for k3d::matrix4 properties.\"),\n\t\t\"QTUI Widget\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"property-widget\")(\"qtui:property-type\", \"k3d::matrix4\"));\n\n\treturn factory;\n}\n\n} // namespace matrix\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::matrix::widget::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_matrix/widget.h",
    "content": "#ifndef MODULES_QTUI_MATRIX_WIDGET_H\n#define MODULES_QTUI_MATRIX_WIDGET_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n#include \"ui_widget.h\"\n\n#include <k3dsdk/qtui/property_widget.h>\n#include <k3dsdk/signal_system.h>\n#include <QWidget>\n\nnamespace k3d { class iplugin_factory; }\nnamespace k3d { class iwritable_property; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace matrix\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\n/// Provides a widget for k3d::bool_t properties.\nclass widget :\n\tpublic QWidget,\n\tpublic k3d::qtui::property_widget,\n\tpublic k3d::iunknown\n{\n\tQ_OBJECT;\n\npublic:\n\twidget();\n\n\tvoid initialize(k3d::idocument& Document, k3d::iproperty& Property, k3d::istate_recorder* StateRecorder);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\npublic Q_SLOTS:\n\tvoid on_browse_clicked();\n\nprivate:\n\tvoid on_property_changed();\n\n\tUi::QTUIMatrixWidget ui;\n\n\tk3d::iproperty* property;\n\tk3d::iwritable_property* writable_property;\n\tk3d::istate_recorder* state_recorder;\n\tsigc::connection change_connection;\n};\n\n} // namespace matrix\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_MATRIX_WIDGET_H\n"
  },
  {
    "path": "modules/qtui_matrix/widget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QTUIMatrixWidget</class>\n <widget class=\"QWidget\" name=\"QTUIMatrixWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>211</width>\n    <height>27</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n   <property name=\"spacing\">\n    <number>2</number>\n   </property>\n   <property name=\"margin\">\n    <number>0</number>\n   </property>\n   <item>\n    <widget class=\"QLineEdit\" name=\"matrix\">\n     <property name=\"alignment\">\n      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>\n     </property>\n     <property name=\"readOnly\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QToolButton\" name=\"browse\">\n     <property name=\"toolTip\">\n      <string>Browse for a file ...</string>\n     </property>\n     <property name=\"text\">\n      <string>...</string>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "modules/qtui_move_mode/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES mode.h)\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-move-mode EXTRA_SOURCES ${MOC_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-move-mode)\n\n\n"
  },
  {
    "path": "modules/qtui_move_mode/mode.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"mode.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/imatrix_sink.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/irenderable_gl.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/qtui/file_dialog.h>\n#include <k3dsdk/qtui/modal_text_editor.h>\n#include <k3dsdk/qtui/script/engine.h>\n#include <k3dsdk/rectangle.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/selection_state_gl.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <QGraphicsScene>\n#include <QGraphicsSceneMouseEvent>\n#include <QMenu>\n#include <QMetaType>\n#include <QTimer>\n#include <QToolButton>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <sstream>\n\nQ_DECLARE_METATYPE(k3d::iunknown*);\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace move\n{\n\nnamespace detail\n{\n/// Adapted from render_engine.cpp\n/// TODO: Do we need some convention on what light is used for the 3D scene and the UI modes?\n/// We use LIGHT1 here.\nvoid gl_setup_headlight()\n{\n\t// Setup lights ...\n\tglEnable(GL_LIGHTING);\n\tglLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);\n\tglLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);\n\n\t// Make sure all lights are turned off initially ...\n\tGLint maxlights = 0;\n\tglGetIntegerv(GL_MAX_LIGHTS, &maxlights);\n\tfor(GLint i = 0; i < maxlights; ++i)\n\t\tglDisable(GLenum(GL_LIGHT0 + i));\n\n\t// Setup the headlight ...\n\tglEnable(GL_LIGHT1);\n\n\t// Setup color ...\n\tconst GLfloat color[4] = { 1.0f, 1.0f, 1.0f, 1.0f };\n\tglLightfv(GL_LIGHT1, GL_AMBIENT, color);\n\tglLightfv(GL_LIGHT1, GL_DIFFUSE, color);\n\tglLightfv(GL_LIGHT1, GL_SPECULAR, color);\n\n\t// Setup light direction ...\n\tconst GLfloat position[4] = { 0.0f, 0.0f, 1.0f, 0.0f };\n\tglLightfv(GL_LIGHT1, GL_POSITION, position);\n}\n\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// mode\n\nmode::mode() :\n\tm_document(0),\n\tm_scene(0)\n{\n}\n\nvoid mode::enable(k3d::idocument& Document, QGraphicsScene& Scene)\n{\n\tif(m_scene)\n\t\tdisconnect(m_scene, 0, this, 0);\n\n\tm_document = &Document;\n\tm_scene = &Scene;\n\t\n\t\n\t\n\tstd::vector<k3d::icamera*> cameras = k3d::node::lookup<k3d::icamera>(Document);\n\treturn_if_fail(cameras.size());\n\tm_move_manipulators.set_camera(cameras.front());\n\tm_camera = cameras.front();\n\n\tconnect(m_scene, SIGNAL(sceneRectChanged(const QRectF&)), this, SLOT(on_scene_rect_changed(const QRectF&)));\n\n\ton_reload();\n}\n\nvoid mode::on_reload()\n{\n\treturn_if_fail(m_scene);\n\n\tQList<QGraphicsItem*> all_items = m_scene->items();\n\tfor(int i = 0; i != all_items.size(); ++i)\n\t\tdelete all_items[i];\n\t\n\tsetAcceptedMouseButtons(Qt::LeftButton);\n\tm_scene->addItem(this);\n\t\n\ton_scene_rect_changed(m_scene->sceneRect());\n}\n\nvoid mode::on_scene_rect_changed(const QRectF& Rect)\n{\n\tm_rect = Rect;\n\tredraw();\n}\n\nvoid mode::redraw()\n{\n\n}\n\n\nk3d::iplugin_factory& mode::get_factory()\n{\n\tstatic k3d::application_plugin_factory<mode> factory(\n\t\tk3d::uuid(0x5155a2c8, 0x5af54dc7, 0xa9efcc88, 0xd7239206),\n\t\t\"QTUIMoveMode\",\n\t\t_(\"Provides an edit-mode to interactively move items in the viewport.\"),\n\t\t\"QTUI Mode\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"mode\"));\n\n\treturn factory;\n}\n\nk3d::iplugin_factory& mode_factory()\n{\n\treturn mode::get_factory();\n}\n\nQRectF mode::boundingRect() const\n{\n\treturn m_rect;\n}\n\nvoid mode::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)\n{\n\tk3d::gl::store_attributes attributes;\n\t\n\t// Setup the projection\n\tglMatrixMode(GL_PROJECTION);\n\tglPushMatrix();\n\tglLoadIdentity();\n\t\n\tk3d::rectangle window_rect, cam_rect;\n\tk3d::double_t near, far;\n\tk3d::bool_t ortho;\n\tk3d::gl::calculate_projection(*m_camera, m_rect.width(), m_rect.height(), window_rect, cam_rect, near, far, ortho);\n\tif(ortho)\n\t{\n\t\tconst k3d::matrix4 transform_matrix = k3d::property::pipeline_value<k3d::matrix4>(m_camera->transformation().matrix_source_output());\n\t\tconst k3d::point3 world_position = transform_matrix * k3d::point3(0, 0, 0);\n\t\tconst k3d::point3 world_target = boost::any_cast<k3d::point3>(m_camera->world_target().property_internal_value());\n\t\tconst double distance = k3d::distance(world_position, world_target);\n\t\tconst double window_aspect = (window_rect.x2 - window_rect.x1) / (window_rect.y1 - window_rect.y2);\n\t\tconst double window_tan_fov = (window_rect.y1 - window_rect.y2) * 0.5 / near;\n\t\tconst double window_size = distance * window_tan_fov;\n\t\tglOrtho(-window_size * window_aspect, window_size * window_aspect, -window_size, window_size, near, far);\n\t}\n\telse\n\t{\n\t\tglFrustum(window_rect.x1, window_rect.x2, window_rect.y2, window_rect.y1, near, far);\n\t}\n\t\n\t// Setup the light\n\tdetail::gl_setup_headlight();\n\t\n\t// Setup modelview matrix\n\tglMatrixMode(GL_MODELVIEW);\n\tglPushMatrix();\n\tglLoadIdentity();\n\n\tconst k3d::matrix4 transform_matrix = k3d::property::pipeline_value<k3d::matrix4>(m_camera->transformation().matrix_source_output());\n\tconst k3d::angle_axis orientation(k3d::euler_angles(transform_matrix, k3d::euler_angles::ZXYstatic));\n\tconst k3d::point3 position(k3d::position(transform_matrix));\n\n\tglScaled(1.0, 1.0, -1.0);\n\tglRotated(-k3d::degrees(orientation.angle), orientation.axis[0], orientation.axis[1], orientation.axis[2]);\n\tglTranslated(-position[0], -position[1], -position[2]);\n\t\n\t// Draw the manipulators\n\tm_move_manipulators.draw(move_manipulators::NO);\n\t\n\tglMatrixMode(GL_PROJECTION);\n\tglPopMatrix();\n\tglMatrixMode(GL_MODELVIEW);\n\tglPopMatrix();\n}\n\nvoid mode::mousePressEvent(QGraphicsSceneMouseEvent* event)\n{\n\tQGraphicsItem::mousePressEvent(event);\n}\n\n\n} // namespace move\n\n} // namespace qtui\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/qtui_move_mode/mode.h",
    "content": "#ifndef MODULES_QTUI_PROGRAMMABLE_MODE_MODE_H\n#define MODULES_QTUI_PROGRAMMABLE_MODE_MODE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/irender_viewport_gl.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/qtui/mode.h>\n#include <k3dsdk/types.h>\n\n#include <QGraphicsItem>\n#include <QGraphicsProxyWidget>\n#include <QScriptEngine>\n\n#include <boost/scoped_ptr.hpp>\n\n#include \"move_manipulators.h\"\n\nnamespace k3d\n{ \n\nclass iplugin_factory;\nclass imatrix_sink;\n\n}\n\nclass QGraphicsProxyWidget;\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace move\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mode\n\n/// Provides a move edit mode\nclass mode :\n\tpublic k3d::qtui::mode,\n\tpublic QGraphicsItem,\n\tpublic k3d::iunknown\n{\n\tQ_OBJECT;\n\n\ttypedef k3d::qtui::mode base;\n\npublic:\n\tmode();\n\n\tvoid enable(k3d::idocument& Document, QGraphicsScene& Scene);\n\t\n\tvirtual QRectF boundingRect() const;\n\t\n\tvirtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\nprivate Q_SLOTS:\n\tvoid on_reload();\n\tvoid on_scene_rect_changed(const QRectF& Rect);\n\nprivate:\n\tvoid redraw();\n\tvoid render_selection(const k3d::rectangle& Region);\n\tvirtual void mousePressEvent(QGraphicsSceneMouseEvent* event);\n\tk3d::idocument* m_document;\n\tQGraphicsScene* m_scene;\n\tQRectF m_rect;\n\tk3d::icamera* m_camera;\n\t\n\tmove_manipulators m_move_manipulators;\n};\n\n} // namespace move\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_PROGRAMMABLE_MODE_MODE_H\n"
  },
  {
    "path": "modules/qtui_move_mode/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace move\n{\n\nextern k3d::iplugin_factory& mode_factory();\n\n} // namespace move\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::move::mode_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_move_mode/move_manipulators.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/utility_gl.h>\n#include <k3dsdk/vectors.h>\n\n#include \"move_manipulators.h\"\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace move\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// move_manipulators\n\nmove_manipulators::move_manipulators() :\n\t\tm_position(init_value(k3d::point3(0, 0, 0))),\n\t\tm_size(init_value(10.)),\n\t\tm_x_axis(init_value(k3d::vector3(1.,0.,0.))),\n\t\tm_y_axis(init_value(k3d::vector3(0.,1.,0.))),\n\t\tm_z_axis(init_value(k3d::vector3(0.,0.,1.))),\n\t\tm_x_color(init_value(k3d::color(1.,0.,0.))),\n\t\tm_y_color(init_value(k3d::color(0.,1.,0.))),\n\t\tm_z_color(init_value(k3d::color(0.,0.,1.))),\n\t\tm_selected_color(init_value(k3d::color(1.,1.,0.))),\n\t\tm_camera(init_value(static_cast<k3d::icamera*>(0))),\n\t\tm_quadric(gluNewQuadric()),\n\t\tm_axis_arrow_radius(0.5),\n\t\tm_axis_arrow_length(2.),\n\t\tm_axis_arrow_slices(8),\n\t\tm_axis_line_width(1.)\n{\n}\n\nmove_manipulators::~move_manipulators()\n{\n\tgluDeleteQuadric(m_quadric);\n}\n\nvoid move_manipulators::draw(const constraints_t Constraints)\n{\n\tk3d::gl::store_attributes attributes;\n\t\t\n\tconst k3d::point3 position = m_position.internal_value();\n\t\n\t// Update constraints\n\tconst k3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*m_camera.internal_value());\n\tconst k3d::vector3 screen_normal = screen_matrix * k3d::vector3(0, 0, 1);\n\n\tglMatrixMode(GL_MODELVIEW);\n\tglPushMatrix();\n\tk3d::gl::push_matrix(k3d::translate3(k3d::to_vector(position)));\n\n\tglClear(GL_DEPTH_BUFFER_BIT);\n\n\t// Scale manipulators to show them at constant size (except on mouse drag)\n\t//if(tool_selection::MOTION_NONE == Motion)\n\tconst k3d::double_t scale_factor = scale(position);\n\n\tglScaled(scale_factor, scale_factor, scale_factor);\n\n\t// Draw manipulators\n\tconst k3d::vector3 px = k3d::normalize(m_x_axis.internal_value());\n\tconst k3d::vector3 py = k3d::normalize(m_y_axis.internal_value());\n\tconst k3d::vector3 pz = k3d::normalize(m_z_axis.internal_value());\n\n\t//const bool motion = (tool_selection::MOTION_DRAG == Motion) || (tool_selection::MOTION_CLICK_DRAG == Motion);\n\tconst k3d::bool_t motion = false;\n\t\n\tif(!motion || Constraints == XX)\n\t{\n\t\tdraw_axis(m_x_color.internal_value(), px, false);\n\t}\n\n\tif(!motion || Constraints == YY)\n\t{\n\t\tdraw_axis(m_y_color.internal_value(), py, false);\n\t}\n\n\tif(!motion || Constraints == ZZ)\n\t{\n\t\tdraw_axis(m_z_color.internal_value(), pz, false);\n\t}\n\n// \t\tif(!motion || (m_y_constraint.internal_value() && m_z_constraint.internal_value()))\n// \t\t\tdraw_plane(m_current_constraint == &m_yz_constraint ? m_current_color : m_x_color, py, py + pz, pz);\n// \t\tif(!motion || (m_x_constraint.internal_value() && m_z_constraint.internal_value()))\n// \t\t\tdraw_plane(m_current_constraint == &m_xz_constraint ? m_current_color : m_y_color, px, px + pz, pz);\n// \t\tif(!motion || (m_x_constraint.internal_value() && m_y_constraint.internal_value()))\n// \t\t\tdraw_plane(m_current_constraint == &m_xy_constraint ? m_current_color : m_z_color, px, px + py, py);\n\n\t//if(!motion || &m_screen_xy_constraint == m_current_constraint)\n\t//\tdraw_screen_xy(Viewport, m_current_constraint == &m_screen_xy_constraint ? m_current_color : m_screen_xy_color);\n\n\tglMatrixMode(GL_MODELVIEW);\n\tglPopMatrix();\n}\n\nvoid move_manipulators::set_camera(k3d::icamera* Camera)\n{\n\tm_camera.set_value(Camera);\n}\n\n\nk3d::double_t move_manipulators::scale(const k3d::point3& Origin)\n{\n\t// Project unit axis on screen space\n\tconst k3d::matrix4 screen_matrix = k3d::node_to_world_matrix(*m_camera.internal_value());\n\tconst k3d::vector3 screen_parallel = screen_matrix * k3d::vector3(1, 0, 0);\n\tconst k3d::point3 position = k3d::gl::project(Origin);\n\tconst k3d::point3 x_axis = k3d::gl::project(Origin + screen_parallel);\n\tconst k3d::vector2 vec(x_axis[0] - position[0], x_axis[1] - position[1]);\n\tconst k3d::double_t length = vec.length();\n\n\treturn_val_if_fail(length, 0);\n\n\treturn m_size.internal_value() / length;\n}\n\nvoid move_manipulators::draw_axis(const k3d::color& Color, const k3d::vector3& Vector, const k3d::bool_t Selected)\n{\n\tk3d::gl::store_attributes attributes;\n\n\tconst k3d::vector3 axis_vector = Vector * m_size.internal_value();\n\tconst k3d::point3 position = m_position.internal_value();\n\n\t// Draw the arrow head\n\tglMatrixMode(GL_MODELVIEW);\n\t\n\t// Translation of the head\n\tglPushMatrix();\n\tk3d::gl::push_matrix(k3d::translate3(axis_vector - (0.5 * m_axis_arrow_length * Vector)));\n\t\n\t// Orientation for the head\n\tconst k3d::vector3 head_rotation_axis = (Vector[0] || Vector[1]) ? k3d::vector3(0., 0., 1.) ^ Vector : k3d::vector3(0., 0., 1.);\n\tconst k3d::double_t head_rotation_angle = (Vector[0] || Vector[1]) ? asin(head_rotation_axis.length()) : 0.;\n\tglPushMatrix();\n\tk3d::gl::push_matrix(k3d::rotate3(head_rotation_angle, head_rotation_axis));\n\n\tglEnable(GL_LIGHTING);\n\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, Color);\n\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n\tgluQuadricDrawStyle(m_quadric, GLU_FILL);\n\tgluQuadricNormals(m_quadric, GLU_SMOOTH);\n\t\n\tgluCylinder(m_quadric, m_axis_arrow_radius, m_axis_arrow_radius * 0.001, m_axis_arrow_length, m_axis_arrow_slices, 1);\n\t\n\tglPopMatrix();\n\tglPopMatrix();\n\n\tglDisable(GL_LIGHTING);\n\tglHint(GL_LINE_SMOOTH_HINT, GL_NICEST);\n\tglEnable(GL_LINE_SMOOTH);\n\tglLineWidth(m_axis_line_width);\n\t\t\n\tk3d::gl::color3d(Selected ? m_selected_color.internal_value() : Color);\n\t\n\tglBegin(GL_LINES);\n\t\tk3d::gl::vertex3d(position);\n\t\tk3d::gl::vertex3d(position + axis_vector);\n\tglEnd();\n}\n\n} // namespace move\n\n} // namespace qtui\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/qtui_move_mode/move_manipulators.h",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/color.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/point3.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/vector3.h>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace move\n{\n\nclass move_manipulators\n{\npublic:\n\tenum constraints_t {NO, XX, YY, ZZ, XY, XZ, YZ, SC};\n\t\n\tmove_manipulators();\n\t~move_manipulators();\n\t\n\tvoid draw(const constraints_t Constraints);\n\t\n\tvoid set_camera(k3d::icamera* Camera);\n\t\nprivate:\n\t/// Calculate scaling factor for constant size\n\tk3d::double_t scale(const k3d::point3& Position);\n\t\n\t/// Draws a single axis along the given vector\n\tvoid draw_axis(const k3d::color& Color, const k3d::vector3& Vector, const k3d::bool_t Selected);\n\t\n\tk3d_data(k3d::point3, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_position;\n\tk3d_data(k3d::double_t, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_size;\n\t\n\tk3d_data(k3d::vector3, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_x_axis;\n\tk3d_data(k3d::vector3, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_y_axis;\n\tk3d_data(k3d::vector3, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_z_axis;\n\t\n\tk3d_data(k3d::color, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_x_color;\n\tk3d_data(k3d::color, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_y_color;\n\tk3d_data(k3d::color, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_z_color;\n\tk3d_data(k3d::color, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) m_selected_color;\n\t\n\tk3d_data(k3d::icamera*, no_name, change_signal, no_undo, node_storage, no_constraint, no_property, no_serialization) m_camera;\n\t\n\tGLUquadric* m_quadric;\n\t\n\t// TODO: These should be properties\n\tk3d::double_t m_axis_arrow_radius;\n\tk3d::double_t m_axis_arrow_length;\n\tk3d::int32_t m_axis_arrow_slices;\n\tk3d::double_t m_axis_line_width;\n};\n\n} // namespace move\n\n} // namespace qtui\n\n} // namespace module\n"
  },
  {
    "path": "modules/qtui_node_list/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES panel.h)\nQT4_WRAP_UI(UI_BUILT_SOURCES panel.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-node-list-panel EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-node-list-panel)\n"
  },
  {
    "path": "modules/qtui_node_list/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"panel.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/qtui/focus.h>\n#include <k3dsdk/result.h>\n\n#include <boost/assign/list_of.hpp>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace node_list\n{\n\npanel::panel() :\n\tdocument(0)\n{\n\tui.setupUi(this);\n\tui.list->setModel(&model);\n}\n\nvoid panel::initialize(k3d::idocument& Document)\n{\n\tdocument = &Document;\n\n\tmodel.add_nodes(Document.nodes().collection());\n\n\tDocument.nodes().add_nodes_signal().connect(sigc::mem_fun(model, &k3d::qtui::node_list_model::add_nodes));\n\tDocument.nodes().remove_nodes_signal().connect(sigc::mem_fun(model, &k3d::qtui::node_list_model::remove_nodes));\n\n  QObject::connect(ui.list->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(on_selection_changed(const QModelIndex&, const QModelIndex&)));\n}\n\nvoid panel::on_selection_changed(const QModelIndex& Current, const QModelIndex& Previous)\n{\n  k3d::inode* const node = model.node(Current);\n  return_if_fail(node);\n\tk3d::qtui::focus::mediator(*document).set_focus(*node, *this);\n}\n\nk3d::iplugin_factory& panel::get_factory()\n{\n\tstatic k3d::application_plugin_factory<panel> factory(\n\t\tk3d::uuid(0x460f8377, 0xe5034177, 0xb7080ea4, 0xbc23bf0a),\n\t\t\"QTUINodeListPanel\",\n\t\t_(\"Displays document nodes as a flat list.\"),\n\t\t\"QTUI Panel\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"panel\")(\"qtui:panel-label\", \"Node List\")\n\t\t);\n\n\treturn factory;\n}\n\n} // namespace node_list\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::node_list::panel::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_node_list/panel.h",
    "content": "#ifndef MODULES_QTUI_NODE_LIST_PANEL_H\n#define MODULES_QTUI_NODE_LIST_PANEL_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"ui_panel.h\"\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/qtui/node_list_model.h>\n#include <k3dsdk/qtui/panel.h>\n#include <k3dsdk/signal_system.h>\n\n#include <QWidget>\n\nnamespace k3d { class iplugin_factory; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace node_list\n{\n\nclass panel :\n\tpublic QWidget,\n\tpublic k3d::qtui::panel,\n\tpublic k3d::iunknown,\n\tpublic sigc::trackable\n{\n\tQ_OBJECT;\n\n\ttypedef QWidget base;\n\npublic:\n\tpanel();\n\n\tvoid initialize(k3d::idocument& Document);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\npublic Q_SLOTS:\n  void on_selection_changed(const QModelIndex& Current, const QModelIndex& Previous);\n\nprivate:\n\tUi::QTUINodeListPanel ui;\n\tk3d::idocument* document;\n\tk3d::qtui::node_list_model model;\n};\n\n} // namespace node_list\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_NODE_LIST_PANEL_H\n\n"
  },
  {
    "path": "modules/qtui_node_list/panel.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QTUINodeListPanel</class>\n <widget class=\"QWidget\" name=\"QTUINodeListPanel\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"margin\">\n    <number>0</number>\n   </property>\n   <item>\n    <widget class=\"QComboBox\" name=\"filter\"/>\n   </item>\n   <item>\n    <widget class=\"QListView\" name=\"list\"/>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "modules/qtui_node_properties/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES panel.h)\nQT4_WRAP_UI(UI_BUILT_SOURCES panel.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-node-properties-panel EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-node-properties-panel)\n"
  },
  {
    "path": "modules/qtui_node_properties/panel.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"panel.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/idocument.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/inode_collection.h>\n#include <k3dsdk/iproperty_collection.h>\n#include <k3dsdk/iproperty.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/focus.h>\n#include <k3dsdk/qtui/property_widget_factory.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <QFormLayout>\n#include <QLabel>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace node_properties\n{\n\npanel::panel() :\n\tdocument(0)\n{\n\tui.setupUi(this);\n}\n\nvoid panel::initialize(k3d::idocument& Document)\n{\n\tdocument = &Document;\n  k3d::qtui::focus::mediator(Document).connect_focus_node_signal(sigc::mem_fun(*this, &panel::on_view_node_properties));\n}\n\nvoid panel::on_view_node_properties(k3d::inode* const Node, k3d::iunknown* const Sender)\n{\n  QObjectList children = ui.properties->children();\n  for(int i = 0; i != children.size(); ++i)\n    delete children[i];\n\n  QFormLayout* const layout = new QFormLayout(ui.properties);\n\n\tif(k3d::iproperty_collection* const property_collection = dynamic_cast<k3d::iproperty_collection*>(Node))\n  {\n    const k3d::iproperty_collection::properties_t& properties = property_collection->properties();\n    k3d::qtui::property_widget_factory property_widget_factory;\n\n    for(int i = 0; i != properties.size(); ++i)\n    {\n      k3d::iproperty* const property = properties[i];\n\n      QLabel* const property_label = new QLabel(k3d::convert<QString>(property->property_label()));\n      property_label->setToolTip(k3d::convert<QString>(property->property_description()));\n\n      QWidget* const property_widget = property_widget_factory.create(*document, *property);\n      property_widget->setToolTip(k3d::convert<QString>(property->property_description()));\n\n      layout->addRow(property_label, property_widget);\n    }\n  }\n}\n\nk3d::iplugin_factory& panel::get_factory()\n{\n\tstatic k3d::application_plugin_factory<panel> factory(\n\t\tk3d::uuid(0x765f717b, 0xf73a425e, 0xa83d927b, 0x4f27ccdc),\n\t\t\"QTUINodePropertiesPanel\",\n\t\t_(\"Displays document node properties.\"),\n\t\t\"QTUI Panel\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"panel\")(\"qtui:panel-label\", \"Node Properties\")\n\t\t);\n\n\treturn factory;\n}\n\n} // namespace node_properties\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::node_properties::panel::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_node_properties/panel.h",
    "content": "#ifndef MODULES_QTUI_NODE_PROPERTIES_PANEL_H\n#define MODULES_QTUI_NODE_PROPERTIES_PANEL_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"ui_panel.h\"\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/qtui/panel.h>\n#include <k3dsdk/signal_system.h>\n\n#include <QWidget>\n\nnamespace k3d { class inode; }\nnamespace k3d { class iplugin_factory; }\nnamespace k3d { class iunknown; }\n\nclass QFormLayout;\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace node_properties\n{\n\nclass panel :\n\tpublic QWidget,\n\tpublic k3d::qtui::panel,\n\tpublic k3d::iunknown,\n\tpublic sigc::trackable\n{\n\tQ_OBJECT;\n\n\ttypedef QWidget base;\n\npublic:\n\tpanel();\n\n\tvoid initialize(k3d::idocument& Document);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\npublic Q_SLOTS:\n\nprivate:\n\tvoid on_view_node_properties(k3d::inode* const Node, k3d::iunknown* const Sender);\n\n\tUi::QTUINodePropertiesPanel ui;\n\tk3d::idocument* document;\n};\n\n} // namespace node_properties\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_NODE_PROPERTIES_PANEL_H\n\n"
  },
  {
    "path": "modules/qtui_node_properties/panel.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QTUINodePropertiesPanel</class>\n <widget class=\"QWidget\" name=\"QTUINodePropertiesPanel\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>246</width>\n    <height>367</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"spacing\">\n    <number>0</number>\n   </property>\n   <property name=\"margin\">\n    <number>0</number>\n   </property>\n   <item>\n    <widget class=\"QScrollArea\" name=\"property_scroll_area\">\n     <property name=\"frameShape\">\n      <enum>QFrame::NoFrame</enum>\n     </property>\n     <property name=\"widgetResizable\">\n      <bool>true</bool>\n     </property>\n     <widget class=\"QWidget\" name=\"properties\">\n      <property name=\"geometry\">\n       <rect>\n        <x>0</x>\n        <y>0</y>\n        <width>246</width>\n        <height>367</height>\n       </rect>\n      </property>\n     </widget>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "modules/qtui_opengl/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES window.h)\nQT4_WRAP_UI(UI_BUILT_SOURCES window.ui)\n\nINCLUDE_DIRECTORIES(\n\t${CMAKE_CURRENT_BINARY_DIR}\n\t)\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-opengl EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-opengl)\nTARGET_LINK_LIBRARIES(k3d-qtui-opengl k3dsdk-opengl)\n"
  },
  {
    "path": "modules/qtui_opengl/window.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"window.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/gl/context_factory.h>\n#include <k3dsdk/gl/offscreen_context_factory.h>\n#include <k3dsdk/gl/offscreen_context.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/qtui/application_widget.h>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n#include <sstream>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace opengl\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// window\n\nwindow::window() :\n\tapplication_widget(*this)\n{\n\tui.setupUi(this);\n\tthis->setAttribute(Qt::WA_DeleteOnClose);\n}\n\nvoid window::on_render_offscreen_clicked()\n{\n\ttry\n\t{\n\t\tconst boost::scoped_ptr<k3d::gl::offscreen_context_factory> factory(k3d::plugin::create<k3d::gl::offscreen_context_factory>(\"OSMesaContextFactory\"));\n\t\tif(!factory)\n\t\t\tthrow std::runtime_error(\"Error creating context factory\");\n\n\t\tconst boost::scoped_ptr<k3d::gl::offscreen_context> context(factory->create(5, 5));\n\t\tif(!context)\n\t\t\tthrow std::runtime_error(\"Error creating context\");\n\n\t\tk3d::log() << debug;\n\t\tstd::copy(context->buffer_begin(), context->buffer_end(), std::ostream_iterator<int>(k3d::log(), \" \"));\n\t\tk3d::log() << std::endl;\n\n\t\tcontext->begin();\n\t\tglClearColor(1.0, 0.5, 0.25, 0.125);\n\t\tglClear(gl.GL_COLOR_BUFFER_BIT);\n\t\tglFlush();\n\t\tcontext->end();\n\n\t\tk3d::log() << debug;\n\t\tstd::copy(context->buffer_begin(), context->buffer_end(), std::ostream_iterator<int>(k3d::log(), \" \"));\n\t\tk3d::log() << std::endl;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tk3d::log() << error << e.what() << std::endl;\n\t}\n}\n\nk3d::iplugin_factory& window::get_factory()\n{\n\tstatic k3d::application_plugin_factory<window> factory(\n\t\tk3d::uuid(0x9704d807, 0xec420781, 0x96396b9e, 0xfe8f786e),\n\t\t\"QTUIOpenGLWindow\",\n\t\t_(\"Used to test OpenGL development.\"),\n\t\t\"QTUI Dialog\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"window\"));\n\n\treturn factory;\n}\n\n} // namespace opengl\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::opengl::window::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_opengl/window.h",
    "content": "#ifndef MODULES_QTUI_OPENGL_WINDOW_H\n#define MODULES_QTUI_OPENGL_WINDOW_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/qtui/application_widget.h>\n\n#include <ui_window.h>\n\n#include <QMainWindow>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d { class iplugin_factory; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace opengl\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// window\n\n/// Displays output from an embedded Aqsis render engine\nclass window :\n\tpublic QMainWindow,\n\tpublic k3d::iunknown\n{\n\tQ_OBJECT;\n\npublic:\n\twindow();\n\n\tstatic k3d::iplugin_factory& get_factory();\n\npublic Q_SLOTS:\n\tvoid on_render_offscreen_clicked();\n\nprivate:\n\tUi::QTUIOpenGLWindow ui;\n\tk3d::qtui::application_widget application_widget;\n};\n\n} // namespace opengl\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_OPENGL_WINDOW_H\n"
  },
  {
    "path": "modules/qtui_opengl/window.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QTUIOpenGLWindow</class>\n <widget class=\"QMainWindow\" name=\"QTUIOpenGLWindow\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>314</width>\n    <height>118</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Aqsis Testing</string>\n  </property>\n  <widget class=\"QWidget\" name=\"centralwidget\">\n   <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n    <item>\n     <widget class=\"QPushButton\" name=\"render_offscreen\">\n      <property name=\"text\">\n       <string>Render Offscreen</string>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n  <action name=\"edit_quit\">\n   <property name=\"text\">\n    <string>Quit</string>\n   </property>\n  </action>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "modules/qtui_path/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES widget.h)\nQT4_WRAP_UI(UI_BUILT_SOURCES widget.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-path EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-path)\n"
  },
  {
    "path": "modules/qtui_path/widget.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n#include \"widget.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/ipath_property.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/qtui/file_dialog.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/type_registry.h>\n\n#include <boost/assign/list_of.hpp>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace path\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\nwidget::widget() :\n\tproperty(0),\n\tpath_property(0),\n\twritable_property(0),\n\tstate_recorder(0)\n{\n\tui.setupUi(this);\n}\n\nvoid widget::initialize(k3d::idocument& Document, k3d::iproperty& Property, k3d::istate_recorder* StateRecorder)\n{\n\tproperty = 0;\n\tpath_property = 0;\n\twritable_property = 0;\n\tstate_recorder = 0;\n\tchange_connection.disconnect();\n\tsetEnabled(false);\n\n\treturn_if_fail(Property.property_type() == typeid(k3d::filesystem::path));\n\n\tproperty = &Property;\n\tpath_property = dynamic_cast<k3d::ipath_property*>(&Property);\n\twritable_property = dynamic_cast<k3d::iwritable_property*>(&Property);\n\tstate_recorder = StateRecorder;\n\tchange_connection = property->property_changed_signal().connect(sigc::hide(sigc::mem_fun(*this, &widget::on_property_changed)));\n\tsetEnabled(writable_property);\n\n\ton_property_changed();\n}\n\nvoid widget::on_path_editingFinished()\n{\n\treturn_if_fail(writable_property);\n\n\tconst k3d::filesystem::path new_value = k3d::filesystem::native_path(k3d::convert<k3d::ustring>(ui.path->text()));\n\tif(new_value == boost::any_cast<k3d::filesystem::path>(property->property_internal_value()))\n\t\treturn;\n\n\tif(state_recorder)\n\t\tstate_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\twritable_property->property_set_value(new_value);\n\n\tif(state_recorder)\n\t\tstate_recorder->commit_change_set(state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), \"Change \" + property->property_label(), K3D_CHANGE_SET_CONTEXT);\n}\n\nvoid widget::on_browse_clicked()\n{\n\tconst k3d::ipath_property::mode_t path_mode = path_property ? path_property->property_path_mode() : k3d::ipath_property::READ;\n\tconst k3d::string_t path_type = path_property ? path_property->property_path_type() : \"\";\n\n\tk3d::filesystem::path new_path;\n\tswitch(path_mode)\n\t{\n\t\tcase k3d::ipath_property::READ:\n\t\t{\n\t\t\tnew_path = k3d::qtui::file_dialog::get_open_filename(\n\t\t\t\tthis,\n\t\t\t\tQString(tr(\"Select %1\")).arg(k3d::convert<QString>(property->property_label())),\n\t\t\t\tpath_type\n\t\t\t\t); \n\t\t\tbreak;\n\t\t}\n\t\tcase k3d::ipath_property::WRITE:\n\t\t{\n\t\t\tnew_path = k3d::qtui::file_dialog::get_save_filename(\n\t\t\t\tthis,\n\t\t\t\tQString(tr(\"Select %1\")).arg(k3d::convert<QString>(property->property_label())),\n\t\t\t\tpath_type\n\t\t\t\t); \n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif(new_path.empty())\n\t\treturn;\n\n\tui.path->setText(k3d::convert<QString>(new_path.native_utf8_string()));\n\ton_path_editingFinished();\n}\n\nvoid widget::on_property_changed()\n{\n\tui.path->setText(k3d::convert<QString>(boost::any_cast<k3d::filesystem::path>(property->property_internal_value()).native_utf8_string()));\n}\n\nk3d::iplugin_factory& widget::get_factory()\n{\n\tstatic k3d::application_plugin_factory<widget> factory(\n\t k3d::uuid(0xafec343d, 0x804e4218, 0x85ec4130, 0x291c4ae1),\n\t\t\"QTUIPathWidget\",\n\t\t_(\"Provides a custom property widget for k3d::filesystem::path properties.\"),\n\t\t\"QTUI Widget\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"property-widget\")(\"qtui:property-type\", \"k3d::filesystem::path\"));\n\n\treturn factory;\n}\n\n} // namespace path\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::path::widget::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_path/widget.h",
    "content": "#ifndef MODULES_QTUI_PATH_WIDGET_H\n#define MODULES_QTUI_PATH_WIDGET_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n#include \"ui_widget.h\"\n\n#include <k3dsdk/qtui/property_widget.h>\n#include <k3dsdk/signal_system.h>\n#include <QWidget>\n\nnamespace k3d { class ipath_property; }\nnamespace k3d { class iplugin_factory; }\nnamespace k3d { class iwritable_property; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace path\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\n/// Provides a widget for k3d::bool_t properties.\nclass widget :\n\tpublic QWidget,\n\tpublic k3d::qtui::property_widget,\n\tpublic k3d::iunknown\n{\n\tQ_OBJECT;\n\npublic:\n\twidget();\n\n\tvoid initialize(k3d::idocument& Document, k3d::iproperty& Property, k3d::istate_recorder* StateRecorder);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\npublic Q_SLOTS:\n\tvoid on_path_editingFinished();\n\tvoid on_browse_clicked();\n\nprivate:\n\tvoid on_property_changed();\n\n\tUi::QTUIPathWidget ui;\n\n\tk3d::iproperty* property;\n\tk3d::ipath_property* path_property;\n\tk3d::iwritable_property* writable_property;\n\tk3d::istate_recorder* state_recorder;\n\tsigc::connection change_connection;\n};\n\n} // namespace path\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_PATH_WIDGET_H\n"
  },
  {
    "path": "modules/qtui_path/widget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QTUIPathWidget</class>\n <widget class=\"QWidget\" name=\"QTUIPathWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>211</width>\n    <height>27</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n   <property name=\"spacing\">\n    <number>2</number>\n   </property>\n   <property name=\"margin\">\n    <number>0</number>\n   </property>\n   <item>\n    <widget class=\"QLineEdit\" name=\"path\">\n     <property name=\"alignment\">\n      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QToolButton\" name=\"browse\">\n     <property name=\"toolTip\">\n      <string>Browse for a file ...</string>\n     </property>\n     <property name=\"text\">\n      <string>...</string>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "modules/qtui_programmable_mode/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES mode.h)\nK3D_COMPILE_RESOURCE(K3D_RESOURCES default_script.js \"/QTUIProgrammableMode/default_script.js\")\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-programmable-mode EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${K3D_RESOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-programmable-mode)\nTARGET_LINK_LIBRARIES(k3d-qtui-programmable-mode k3dsdk-qtui-script)\nTARGET_LINK_LIBRARIES(k3d-qtui-programmable-mode k3dsdk-resource)\n\n"
  },
  {
    "path": "modules/qtui_programmable_mode/default_script.js",
    "content": "button = new QPushButton(\"Hello, World!\");\nbutton.clicked.connect(function() { print(\"Hello, World!\"); });\nproxy = scene.addWidget(button);\nproxy.setGeometry(20, 20, 100, 30);\n\n"
  },
  {
    "path": "modules/qtui_programmable_mode/mode.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include \"mode.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/qtui/file_dialog.h>\n#include <k3dsdk/qtui/modal_text_editor.h>\n#include <k3dsdk/qtui/script/engine.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/types.h>\n\n#include <QGraphicsScene>\n#include <QMenu>\n#include <QMetaType>\n#include <QTimer>\n#include <QToolButton>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <sstream>\n\nQ_DECLARE_METATYPE(k3d::iunknown*);\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace programmable\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mode\n\nmode::mode() :\n\tdocument(0),\n\tscene(0),\n\tscript(init_owner(*this) + init_name(\"script\") + init_label(_(\"Script\")) + init_description(_(\"Script source code\")) + init_value<k3d::string_t>(\"\")),\n\tedit_menu_proxy(0)\n{\n\tscript.changed_signal().connect(sigc::hide(sigc::mem_fun(*this, &mode::on_script_changed)));\n}\n\nvoid mode::enable(k3d::idocument& Document, QGraphicsScene& Scene)\n{\n\tif(scene)\n\t\tdisconnect(scene, 0, this, 0);\n\n\tdocument = &Document;\n\tscene = &Scene;\n\n\tconnect(scene, SIGNAL(sceneRectChanged(const QRectF&)), this, SLOT(on_scene_rect_changed(const QRectF&)));\n\n\ton_reload();\n}\n\nvoid mode::on_script_changed()\n{\n\tif(!scene)\n\t\treturn;\n\n\tQTimer::singleShot(0, this, SLOT(on_reload()));\n}\n\nvoid mode::on_load()\n{\n\tconst k3d::filesystem::path path = k3d::qtui::file_dialog::get_open_filename(0, tr(\"Load Mode Script\"), \"qtui_mode_script\", tr(\"Mode Scripts (*.js)\"));\n\tif(path.empty())\n\t\treturn;\n\n\tk3d::filesystem::ifstream stream(path);\n\tstd::stringstream buffer;\n\tbuffer << stream.rdbuf();\n\tk3d::property::set_internal_value(script, buffer.str());\n}\n\nvoid mode::on_edit()\n{\n\tboost::scoped_ptr<k3d::qtui::modal_text_editor> editor(k3d::plugin::create<k3d::qtui::modal_text_editor>(\"QTUITextEditor\"));\n\treturn_if_fail(editor);\n\n\tQString program = script.pipeline_value().c_str();\n\tif(!editor->modal_edit(tr(\"Edit Mode Script\"), program))\n\t\treturn;\n\n\tk3d::property::set_internal_value(script, program.toStdString());\n}\n\nvoid mode::on_save()\n{\n\tconst k3d::filesystem::path path = k3d::qtui::file_dialog::get_save_filename(0, tr(\"Save Mode Script\"), \"qtui_mode_script\", tr(\"Mode Scripts (*.js)\"));\n\tif(path.empty())\n\t\treturn;\n\n\tk3d::filesystem::ofstream stream(path);\n\tstream << script.internal_value();\n}\n\nvoid mode::on_reload()\n{\n\treturn_if_fail(scene);\n\n\tQList<QGraphicsItem*> all_items = scene->items();\n\tfor(int i = 0; i != all_items.size(); ++i)\n\t\tdelete all_items[i];\n\n\tQToolButton* const edit_menu_button = new QToolButton();\n\tedit_menu_button->setText(\"Edit\");\n\tedit_menu_button->setPopupMode(QToolButton::MenuButtonPopup);\n\tconnect(edit_menu_button, SIGNAL(clicked()), this, SLOT(on_edit()));\n\n\tQMenu* const edit_menu = new QMenu(edit_menu_button);\n\tconnect(edit_menu->addAction(\"Load\"), SIGNAL(activated()), this, SLOT(on_load()));\n\tconnect(edit_menu->addAction(\"Edit\"), SIGNAL(activated()), this, SLOT(on_edit()));\n\tconnect(edit_menu->addAction(\"Save\"), SIGNAL(activated()), this, SLOT(on_save()));\n\n\tedit_menu_button->setMenu(edit_menu);\n\n\tedit_menu_proxy = scene->addWidget(edit_menu_button);\n\n\tscript_engine.reset(k3d::qtui::script::engine());\n\tscript_engine->globalObject().setProperty(\"mode\", script_engine->newQObject(this));\n\tscript_engine->globalObject().setProperty(\"scene\", script_engine->newQObject(scene));\n\tscript_engine->globalObject().setProperty(\"document\", script_engine->toScriptValue(static_cast<k3d::iunknown*>(document)));\n\tQScriptValue result = script_engine->evaluate(script.pipeline_value().c_str());\n\tif(result.isError())\n\t{\n\t\tk3d::log() << error << result.toString().toAscii().data();\n\t\tk3d::log() << \" at line \" << result.property(\"lineNumber\").toString().toAscii().data() << std::endl;\n\t}\n\n\ton_scene_rect_changed(scene->sceneRect());\n}\n\nvoid mode::on_scene_rect_changed(const QRectF& Rect)\n{\n\tif(!edit_menu_proxy)\n\t\treturn;\n\n\tconst QRectF proxy_rect = edit_menu_proxy->geometry();\n\tedit_menu_proxy->setPos(Rect.right() - proxy_rect.width() - 20, Rect.top() + 20);\n}\n\nk3d::iplugin_factory& mode::get_factory()\n{\n\tstatic k3d::application_plugin_factory<mode> factory(\n\t\tk3d::uuid(0xccadd74f, 0xf44ad6e9, 0x12eeefa4, 0xde50723a),\n\t\t\"QTUIProgrammableMode\",\n\t\t_(\"Provides an edit-mode with programmable behavior.\"),\n\t\t\"QTUI Mode\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"mode\"));\n\n\treturn factory;\n}\n\n} // namespace programmable\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::programmable::mode::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_programmable_mode/mode.h",
    "content": "#ifndef MODULES_QTUI_PROGRAMMABLE_MODE_MODE_H\n#define MODULES_QTUI_PROGRAMMABLE_MODE_MODE_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/data.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/qtui/mode.h>\n#include <k3dsdk/types.h>\n\n#include <QGraphicsProxyWidget>\n#include <QScriptEngine>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d { class iplugin_factory; }\nclass QGraphicsProxyWidget;\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace programmable\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mode\n\n/// Provides a programmable edit mode, mainly intended for development.\nclass mode :\n\tpublic k3d::qtui::mode,\n\tpublic k3d::property_collection\n{\n\tQ_OBJECT;\n\n\ttypedef k3d::qtui::mode base;\n\npublic:\n\tmode();\n\n\tvoid enable(k3d::idocument& Document, QGraphicsScene& Scene);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\nprivate Q_SLOTS:\n\tvoid on_script_changed();\n\tvoid on_load();\n\tvoid on_edit();\n\tvoid on_save();\n\tvoid on_reload();\n\tvoid on_scene_rect_changed(const QRectF& Rect);\n\nprivate:\n\tk3d::idocument* document;\n\tQGraphicsScene* scene;\n\tk3d_data(k3d::string_t, k3d::data::immutable_name, change_signal, no_undo, local_storage, no_constraint, script_property, no_serialization) script;\n\tboost::scoped_ptr<QScriptEngine> script_engine;\n\tQGraphicsProxyWidget* edit_menu_proxy;\n};\n\n} // namespace programmable\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_PROGRAMMABLE_MODE_MODE_H\n"
  },
  {
    "path": "modules/qtui_string/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES widget.h)\n#QT4_WRAP_UI(UI_BUILT_SOURCES widget.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-string EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-string)\n"
  },
  {
    "path": "modules/qtui_string/widget.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n#include \"widget.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/istate_recorder.h>\n#include <k3dsdk/iwritable_property.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/qtui/convert.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/state_change_set.h>\n#include <k3dsdk/type_registry.h>\n\n#include <boost/assign/list_of.hpp>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace string\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\nwidget::widget() :\n\tproperty(0),\n\twritable_property(0),\n\tstate_recorder(0)\n{\n}\n\nvoid widget::initialize(k3d::idocument& Document, k3d::iproperty& Property, k3d::istate_recorder* StateRecorder)\n{\n\tproperty = 0;\n\twritable_property = 0;\n\tstate_recorder = 0;\n\tchange_connection.disconnect();\n\tsetEnabled(false);\n\n\treturn_if_fail(Property.property_type() == typeid(k3d::string_t));\n\n\tproperty = &Property;\n\twritable_property = dynamic_cast<k3d::iwritable_property*>(&Property);\n\tstate_recorder = StateRecorder;\n\tchange_connection = property->property_changed_signal().connect(sigc::hide(sigc::mem_fun(*this, &widget::on_property_changed)));\n\tsetEnabled(writable_property);\n\n\ton_property_changed();\n\tQObject::connect(this, SIGNAL(editingFinished()), this, SLOT(on_editing_finished()));\n}\n\nvoid widget::on_editing_finished()\n{\n\treturn_if_fail(writable_property);\n\n\tconst k3d::string_t new_value = k3d::convert<k3d::string_t>(text());\n\tif(new_value == boost::any_cast<k3d::string_t>(property->property_internal_value()))\n\t\treturn;\n\n\tif(state_recorder)\n\t\tstate_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\twritable_property->property_set_value(new_value);\n\n\tif(state_recorder)\n\t\tstate_recorder->commit_change_set(state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), \"Change \" + property->property_label(), K3D_CHANGE_SET_CONTEXT);\n}\n\nvoid widget::on_property_changed()\n{\n\tsetText(k3d::convert<QString>(boost::any_cast<k3d::string_t>(property->property_internal_value())));\n}\n\nk3d::iplugin_factory& widget::get_factory()\n{\n\tstatic k3d::application_plugin_factory<widget> factory(\n\t k3d::uuid(0x4f137967, 0xe5434075, 0x88743f39, 0xe83be9c2),\n\t\t\"QTUIStringWidget\",\n\t\t_(\"Provides a custom property widget for k3d::string_t properties.\"),\n\t\t\"QTUI Widget\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"property-widget\")(\"qtui:property-type\", \"k3d::string_t\"));\n\n\treturn factory;\n}\n\n} // namespace string\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::string::widget::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_string/widget.h",
    "content": "#ifndef MODULES_QTUI_STRING_WIDGET_H\n#define MODULES_QTUI_STRING_WIDGET_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/qtui/property_widget.h>\n#include <k3dsdk/signal_system.h>\n#include <QLineEdit>\n\nnamespace k3d { class iplugin_factory; }\nnamespace k3d { class iwritable_property; }\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace string\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// widget\n\n/// Provides a widget for k3d::bool_t properties.\nclass widget :\n  public QLineEdit,\n\tpublic k3d::qtui::property_widget,\n\tpublic k3d::iunknown\n{\n  Q_OBJECT;\n\npublic:\n  widget();\n\n\tvoid initialize(k3d::idocument& Document, k3d::iproperty& Property, k3d::istate_recorder* StateRecorder);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\npublic Q_SLOTS:\n  void on_editing_finished();\n\nprivate:\n  void on_property_changed();\n\n  k3d::iproperty* property;\n  k3d::iwritable_property* writable_property;\n  k3d::istate_recorder* state_recorder;\n  sigc::connection change_connection;\n};\n\n} // namespace string\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_STRING_WIDGET_H\n"
  },
  {
    "path": "modules/qtui_text_editor/CMakeLists.txt",
    "content": "QT4_WRAP_CPP(MOC_BUILT_SOURCES window.h)\nQT4_WRAP_UI(UI_BUILT_SOURCES window.ui)\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\n\nK3D_BUILD_QTUI_MODULE(k3d-qtui-text-editor EXTRA_SOURCES ${MOC_BUILT_SOURCES} ${UI_BUILT_SOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-qtui-text-editor)\n\n"
  },
  {
    "path": "modules/qtui_text_editor/window.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"window.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gzstream.h>\n#include <k3dsdk/idocument_sink.h>\n#include <k3dsdk/iproperty_sink.h>\n#include <k3dsdk/iscript_engine.h>\n#include <k3dsdk/istate_recorder_sink.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/mime_types.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/state_change_set.h>\n\n#include <QEventLoop>\n#include <QLabel>\n\n#include <boost/assign/list_of.hpp>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace text_editor\n{\n\nwindow::window() :\n\tcursor_position(0),\n\tapplication_widget(*this)\n{\n\tui.setupUi(this);\n\tui.file_new->setIcon(QIcon::fromTheme(\"document-new\"));\n\tui.file_open->setIcon(QIcon::fromTheme(\"document-open\"));\n\tui.file_save->setIcon(QIcon::fromTheme(\"document-save\"));\n\tui.file_revert->setIcon(QIcon::fromTheme(\"document-revert\"));\n\tui.file_close->setIcon(QIcon::fromTheme(\"window-close\"));\n\tui.edit_undo->setIcon(QIcon::fromTheme(\"edit-undo\"));\n\tui.edit_redo->setIcon(QIcon::fromTheme(\"edit-redo\"));\n\n\tcursor_position = new QLabel();\n\tstatusBar()->addPermanentWidget(cursor_position);\n\n\tupdate_title();\n\tupdate_widgets();\n\tupdate_cursor_position();\n\n\tconnect(ui.file_close, SIGNAL(activated()), this, SLOT(close()));\n\tconnect(ui.file_ok, SIGNAL(activated()), this, SLOT(modal_accept()));\n\tconnect(ui.file_cancel, SIGNAL(activated()), this, SLOT(modal_reject()));\n\tconnect(ui.edit_undo, SIGNAL(activated()), ui.text_edit, SLOT(undo()));\n\tconnect(ui.edit_redo, SIGNAL(activated()), ui.text_edit, SLOT(redo()));\n\tconnect(ui.text_edit, SIGNAL(undoAvailable(bool)), ui.edit_undo, SLOT(setEnabled(bool)));\n\tconnect(ui.text_edit, SIGNAL(redoAvailable(bool)), ui.edit_redo, SLOT(setEnabled(bool)));\n\tconnect(ui.text_edit->document(), SIGNAL(modificationChanged(bool)), this, SLOT(update_title()));\n\tconnect(ui.text_edit, SIGNAL(cursorPositionChanged()), this, SLOT(update_cursor_position()));\n\tconnect(ui.modal_controls, SIGNAL(accepted()), this, SLOT(modal_accept()));\n\tconnect(ui.modal_controls, SIGNAL(rejected()), this, SLOT(modal_reject()));\n}\n\nk3d::bool_t window::modal_edit(const QString& Label, QString& Text)\n{\n\tQEventLoop event_loop;\n\tmodal = &event_loop;\n\tmodal_label = Label;\n\n\tui.text_edit->setPlainText(Text);\n\n\tupdate_title();\n\tupdate_widgets();\n\tupdate_cursor_position();\n\n\tsetWindowFlags(Qt::Dialog);\n\tsetWindowModality(Qt::ApplicationModal);\n\tshow();\n\n\tif(0 == event_loop.exec())\n\t{\n\t\tText = ui.text_edit->toPlainText();\n\t\treturn true;\n\t}\n\t\n\n\treturn false;\n}\n\n/*\nvoid window::set_text(const k3d::string_t& Text)\n{\n\tconst k3d::mime::type mime_type = k3d::mime::type::lookup(Text);\n\n#ifdef K3D_GTKSOURCEVIEW_FOUND\n\tGtkSourceLanguageManager* const language_manager =  gtk_source_language_manager_get_default();\n\tGtkSourceLanguage* const language = gtk_source_language_manager_guess_language(language_manager, 0, mime_type.str().c_str());\n\tGtkSourceBuffer* const buffer = GTK_SOURCE_BUFFER(m_view->get_buffer()->gobj());\n\tgtk_source_buffer_set_language(buffer, language);\n\tgtk_source_buffer_set_highlight_syntax(buffer, true);\n#endif // K3D_GTKSOURCEVIEW_FOUND\n\n\tm_view->get_buffer()->set_text(Text);\n\tm_view->get_buffer()->set_modified(false);\n}\n\nvoid window::set_text(const k3d::filesystem::path& Path)\n{\n\tconst k3d::mime::type mime_type = k3d::mime::type::lookup(Path);\n\n#ifdef K3D_GTKSOURCEVIEW_FOUND\n\tGtkSourceLanguageManager* const language_manager =  gtk_source_language_manager_get_default();\n\tGtkSourceLanguage* const language = gtk_source_language_manager_guess_language(language_manager, 0, mime_type.str().c_str());\n\tGtkSourceBuffer* const buffer = GTK_SOURCE_BUFFER(m_view->get_buffer()->gobj());\n\tgtk_source_buffer_set_language(buffer, language);\n\tgtk_source_buffer_set_highlight_syntax(buffer, true);\n#endif // K3D_GTKSOURCEVIEW_FOUND\n\n\tk3d::filesystem::igzstream stream(Path);\n\tstd::stringstream text;\n\tstream.get(*text.rdbuf(), '\\0');\n\n\tm_view->get_buffer()->set_text(text.str().c_str());\n\tm_view->get_buffer()->set_modified(false);\n}\n\nvoid window::set_path(const k3d::filesystem::path& Path)\n{\n\tm_path = Path;\n\tupdate_title();\n}\n\nvoid window::on_new()\n{\n\tset_text(\"\");\n\tupdate_title();\n}\n\nvoid window::on_open()\n{\n\tk3d::filesystem::path filepath;\n\t{\n\t\tk3d::qtui::file_chooser_dialog dialog(_(\"Open File:\"), k3d::options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_OPEN);\n\t\tif(!dialog.get_file_path(filepath))\n\t\t\treturn;\n\t}\n\n\tset_text(filepath);\n\tset_path(filepath);\n}\n\nvoid window::on_save()\n{\n\tif(m_path.empty())\n\t{\n\t\ton_save_as();\n\t\treturn;\n\t}\n\n\tk3d::filesystem::ofstream stream(m_path);\n\tstream << m_view->get_buffer()->get_text();\n\n\tm_view->get_buffer()->set_modified(false);\n\tupdate_title();\n}\n\nbool window::on_save_as()\n{\n\t{\n\t\tk3d::qtui::file_chooser_dialog dialog(_(\"Save Script As::\"), k3d::options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\tif(!dialog.get_file_path(m_path))\n\t\t\treturn false;\n\t}\n\n\tk3d::filesystem::ofstream stream(m_path);\n\tstream << m_view->get_buffer()->get_text();\n\n\tm_view->get_buffer()->set_modified(false);\n\tset_path(m_path);\n\n\treturn true;\n}\n\nvoid window::on_revert()\n{\n\tif(m_property)\n\t{\n\t\tset_text(m_property ? k3d::property::internal_value<k3d::string_t>(*m_property) : \"\");\n\t}\n\telse if(m_path.empty())\n\t{\n\t\tset_text(\"\");\n\t}\n\telse\n\t{\n\t\tset_text(m_path);\n\t}\n}\n\nvoid window::on_import()\n{\n\tk3d::filesystem::path path;\n\t{\n\t\tk3d::qtui::file_chooser_dialog dialog(_(\"Import File:\"), k3d::options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_OPEN);\n\t\tif(!dialog.get_file_path(path))\n\t\t\treturn;\n\t}\n\n\tset_text(path);\n}\n\nvoid window::on_export()\n{\n\tk3d::filesystem::path path;\n\t{\n\t\tk3d::qtui::file_chooser_dialog dialog(_(\"Export File:\"), k3d::options::path::scripts(), Gtk::FILE_CHOOSER_ACTION_SAVE);\n\t\tif(!dialog.get_file_path(path))\n\t\t\treturn;\n\t}\n\n\tk3d::filesystem::ofstream stream(path);\n\tstream << m_view->get_buffer()->get_text();\n}\n\nvoid window::on_file_commit()\n{\n\treturn_if_fail(property);\n\n\tif(state_recorder)\n\t\tstate_recorder->start_recording(k3d::create_state_change_set(K3D_CHANGE_SET_CONTEXT), K3D_CHANGE_SET_CONTEXT);\n\n\tk3d::property::set_internal_value(*property, ui.text_edit->toPlainText().toAscii().data());\n\n\tif(state_recorder)\n\t\tstate_recorder->commit_change_set(state_recorder->stop_recording(K3D_CHANGE_SET_CONTEXT), property->property_name(), K3D_CHANGE_SET_CONTEXT);\n}\n\nvoid window::on_execute()\n{\n\tconst k3d::script::code code(m_view->get_buffer()->get_text());\n\tconst k3d::mime::type mime_type = k3d::mime::type::lookup(code.source());\n\n\tif(mime_type.empty())\n\t{\n\t\tk3d::qtui::error_message(\n\t\t\t_(\"Unknown script language\"),\n\t\t\t_(\"Could not identify the MIME-type for this script. \"\n\t\t\t\" K-3D supports multiple scripting languages, and the MIME-type is used to \"\n\t\t\t\"match scripts to the correct script engines. \"\n\t\t\t\"You can add a \\\"magic token\\\" at the beginning of a script to \"\n\t\t\t\"force identification of its MIME-type - for example, add \\\"#python\\\" at the \"\n\t\t\t\"beginning of a Python script.\"\n\t\t\t)); \n\t\treturn;\n\t}\n\n\tconst k3d::string_t name = get_title();\n\n\tk3d::iscript_engine::context context;\n\tif(m_document)\n\t\tcontext[\"document\"] = m_document;\n\n\tm_running = true;\n\tupdate_title();\n\n\tk3d::ngui::execute_script(code, name, context);\n\n\tm_running = false;\n\tupdate_title();\n}\n*/\n\nvoid window::update_title()\n{\n\tQString title;\n\n\tif(modal)\n\t{\n\t\ttitle = modal_label;\n\t}\n\n/*\n\tif(property)\n\t{\n\t\tif(property->property_node())\n\t\t{\n\t\t\ttitle = tr(\"%1 \\\"%2\\\" property\").arg(property->property_node()->name().c_str()).arg(property->property_name().c_str());\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttitle = tr(\"%1\").arg(property->property_name().c_str());\n\t\t}\n\t}\n\telse if(!path.empty())\n\t{\n\t\ttitle = path.leaf().raw().c_str();\n\t}\n\telse\n\t{\n\t\ttitle = tr(\"Untitled\");\n\t}\n*/\n\n\tif(ui.text_edit->document()->isModified())\n\t\ttitle += _(\" [changed]\");\n\n\tsetWindowTitle(title);\n}\n\nvoid window::update_widgets()\n{\n\tui.file_close->setVisible(!modal);\n\tui.modal_controls->setVisible(modal);\n}\n\nvoid window::update_cursor_position()\n{\n\tQTextCursor cursor = ui.text_edit->textCursor();\n\tcursor_position->setText(tr(\"Line: %1 Column: %2\")\n\t\t.arg(ui.text_edit->toPlainText().left(cursor.position()).count(\"\\n\") + 1)\n\t\t.arg(cursor.columnNumber() + 1));\n}\n\nvoid window::modal_accept()\n{\n\treturn_if_fail(modal);\n\tmodal->exit(0);\n}\n\nvoid window::modal_reject()\n{\n\treturn_if_fail(modal);\n\tmodal->exit(1);\n}\n\nk3d::iplugin_factory& window::get_factory()\n{\n\tstatic k3d::application_plugin_factory<window> factory(\n\t\tk3d::uuid(0x484be321, 0x754dfc58, 0x44260385, 0x37c8b30a),\n\t\t\"QTUITextEditor\",\n\t\t_(\"Provides a general-purpose editor for editing source-code, text, scripts, and shaders.\"),\n\t\t\"QTUI\",\n\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\tboost::assign::map_list_of(\"qtui:component-type\", \"window\")\n\t\t);\n\n\treturn factory;\n}\n\nvoid window::closeEvent(QCloseEvent* Event)\n{\n\tif(modal)\n\t{\n\t\tmodal_reject();\n\t}\n\n\tbase::closeEvent(Event);\n}\n\n} // namespace text_editor\n\n} // namespace qtui\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::qtui::text_editor::window::get_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/qtui_text_editor/window.h",
    "content": "#ifndef MODULES_QTUI_TEXT_EDITOR_WINDOW_H\n#define MODULES_QTUI_TEXT_EDITOR_WINDOW_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"ui_window.h\"\n\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/qtui/application_widget.h>\n#include <k3dsdk/qtui/modal_text_editor.h>\n\n#include <QMainWindow>\n#include <QPointer>\n\nnamespace k3d { class iplugin_factory; }\n\nclass QEventLoop;\nclass QLabel;\n\nnamespace module\n{\n\nnamespace qtui\n{\n\nnamespace text_editor\n{\n\nclass window :\n\tpublic QMainWindow,\n\tpublic k3d::qtui::modal_text_editor,\n\tpublic k3d::iunknown\n{\n\tQ_OBJECT;\n\n\ttypedef QMainWindow base;\n\npublic:\n\twindow();\n\n\tk3d::bool_t modal_edit(const QString& Label, QString& Text);\n\n\tstatic k3d::iplugin_factory& get_factory();\n\nprivate Q_SLOTS:\n/*\n\tvoid on_file_commit();\n\tvoid set_text(const k3d::string_t& Text);\n\tvoid set_text(const k3d::filesystem::path& Path);\n\tvoid set_path(const k3d::filesystem::path& Path);\n\tvoid on_new();\n\tvoid on_open();\n\tvoid on_save();\n\tbool on_save_as();\n\tvoid on_revert();\n\tvoid on_file_import();\n\tvoid on_file_export();\n\tvoid on_execute();\n*/\n\tvoid update_title();\n\tvoid update_widgets();\n\tvoid update_cursor_position();\n\n\tvoid modal_accept();\n\tvoid modal_reject();\n\nprivate:\n\tvoid closeEvent(QCloseEvent* Event);\n\n\tUi::QTUITextEditor ui;\n\tQLabel* cursor_position;\n\tk3d::qtui::application_widget application_widget;\n\n\tQPointer<QEventLoop> modal;\n\tQString modal_label;\n};\n\n} // namespace text_editor\n\n} // namespace qtui\n\n} // namespace module\n\n#endif // !MODULES_QTUI_TEXT_EDITOR_WINDOW_H\n\n"
  },
  {
    "path": "modules/qtui_text_editor/window.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QTUITextEditor</class>\n <widget class=\"QMainWindow\" name=\"QTUITextEditor\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>600</width>\n    <height>400</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Text Editor</string>\n  </property>\n  <widget class=\"QWidget\" name=\"centralwidget\">\n   <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n    <item>\n     <widget class=\"QPlainTextEdit\" name=\"text_edit\"/>\n    </item>\n    <item>\n     <widget class=\"QDialogButtonBox\" name=\"modal_controls\">\n      <property name=\"standardButtons\">\n       <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n  <widget class=\"QMenuBar\" name=\"menubar\">\n   <property name=\"geometry\">\n    <rect>\n     <x>0</x>\n     <y>0</y>\n     <width>600</width>\n     <height>23</height>\n    </rect>\n   </property>\n   <widget class=\"QMenu\" name=\"menuFile\">\n    <property name=\"title\">\n     <string>File</string>\n    </property>\n    <addaction name=\"file_new\"/>\n    <addaction name=\"file_open\"/>\n    <addaction name=\"file_save\"/>\n    <addaction name=\"file_revert\"/>\n    <addaction name=\"file_close\"/>\n    <addaction name=\"file_ok\"/>\n    <addaction name=\"file_cancel\"/>\n   </widget>\n   <widget class=\"QMenu\" name=\"menuEdit\">\n    <property name=\"title\">\n     <string>Edit</string>\n    </property>\n    <addaction name=\"edit_undo\"/>\n    <addaction name=\"edit_redo\"/>\n    <addaction name=\"separator\"/>\n   </widget>\n   <addaction name=\"menuFile\"/>\n   <addaction name=\"menuEdit\"/>\n  </widget>\n  <widget class=\"QStatusBar\" name=\"statusbar\"/>\n  <widget class=\"QToolBar\" name=\"toolBar\">\n   <property name=\"windowTitle\">\n    <string>toolBar</string>\n   </property>\n   <attribute name=\"toolBarArea\">\n    <enum>TopToolBarArea</enum>\n   </attribute>\n   <attribute name=\"toolBarBreak\">\n    <bool>false</bool>\n   </attribute>\n   <addaction name=\"file_new\"/>\n   <addaction name=\"file_open\"/>\n   <addaction name=\"file_save\"/>\n  </widget>\n  <action name=\"file_new\">\n   <property name=\"text\">\n    <string>New</string>\n   </property>\n   <property name=\"shortcut\">\n    <string>Ctrl+N</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"file_open\">\n   <property name=\"text\">\n    <string>Open</string>\n   </property>\n   <property name=\"shortcut\">\n    <string>Ctrl+O</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"file_save\">\n   <property name=\"text\">\n    <string>Save</string>\n   </property>\n   <property name=\"shortcut\">\n    <string>Ctrl+S</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"file_revert\">\n   <property name=\"text\">\n    <string>Revert</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"file_close\">\n   <property name=\"text\">\n    <string>Close</string>\n   </property>\n   <property name=\"shortcut\">\n    <string>Ctrl+W</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"edit_undo\">\n   <property name=\"enabled\">\n    <bool>false</bool>\n   </property>\n   <property name=\"text\">\n    <string>Undo</string>\n   </property>\n   <property name=\"shortcut\">\n    <string>Ctrl+Z</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"edit_redo\">\n   <property name=\"enabled\">\n    <bool>false</bool>\n   </property>\n   <property name=\"text\">\n    <string>Redo</string>\n   </property>\n   <property name=\"shortcut\">\n    <string>Ctrl+Shift+Z</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"file_ok\">\n   <property name=\"text\">\n    <string>OK</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"file_cancel\">\n   <property name=\"text\">\n    <string>Cancel</string>\n   </property>\n   <property name=\"iconVisibleInMenu\">\n    <bool>true</bool>\n   </property>\n  </action>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "modules/quadrics/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-quadrics)\nK3D_CREATE_MODULE_PROXY(k3d-quadrics)\n\n"
  },
  {
    "path": "modules/quadrics/cone.cpp",
    "content": "// K-3D\n// Copyright (c) 2008, Timothy M. Shead \n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/cone.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace quadrics\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cone\n\nclass cone :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node> > base;\n\npublic:\n\tcone(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_transformation(init_owner(*this) + init_name(\"transformation\") + init_label(_(\"Transformation\")) + init_description(_(\"Transformation matrix used to position / orient / scale the output cone.\")) + init_value(k3d::identity3())),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Defines the cone height along the +Z axis.\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Controls the radius of the output cone.\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_sweep_angle(init_owner(*this) + init_name(\"sweep_angle\") + init_label(_(\"Sweep Angle\")) + init_description(_(\"Optionally limits the sweep angle of the cone to less-than 360 degrees.\")) + init_value(k3d::pi_times_2()) + init_step_increment(k3d::radians(5.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_transformation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_sweep_angle.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::cone::primitive> primitive(k3d::cone::create(Output));\n\n\t\tprimitive->matrices.push_back(m_transformation.pipeline_value());\n\t\tprimitive->materials.push_back(m_material.pipeline_value());\n\t\tprimitive->heights.push_back(m_height.pipeline_value());\n\t\tprimitive->radii.push_back(m_radius.pipeline_value());\n\t\tprimitive->sweep_angles.push_back(m_sweep_angle.pipeline_value());\n\t\tprimitive->selections.push_back(0.0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cone > factory(\n\t\t\tk3d::uuid(0x61f3952d, 0x294a5474, 0xf8a17585, 0x4cbecead),\n\t\t\t\"QuadricCone\",\n\t\t\t\"Creates a cone primitive\",\n\t\t\t\"Quadric\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_transformation;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_sweep_angle;\n};\n\nk3d::iplugin_factory& cone_factory()\n{\n\treturn cone::get_factory();\n}\n\n} // namespace quadrics\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/quadrics/cylinder.cpp",
    "content": "// K-3D\n// Copyright (c) 2008, Timothy M. Shead \n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/cylinder.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace quadrics\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cylinder\n\nclass cylinder :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node> > base;\n\npublic:\n\tcylinder(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_transformation(init_owner(*this) + init_name(\"transformation\") + init_label(_(\"Transformation\")) + init_description(_(\"Transformation matrix used to position / orient / scale the output cylinder.\")) + init_value(k3d::identity3())),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Controls the radius of the output cylinder.\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z_min(init_owner(*this) + init_name(\"z_min\") + init_label(_(\"Z Min\")) + init_description(_(\"Defines the cylinder length along the -Z axis.\")) + init_value(-5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z_max(init_owner(*this) + init_name(\"z_max\") + init_label(_(\"Z Max\")) + init_description(_(\"Defines the cylinder length along the +Z axis.\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_sweep_angle(init_owner(*this) + init_name(\"sweep_angle\") + init_label(_(\"Sweep Angle\")) + init_description(_(\"Optionally limits the sweep angle of the cylinder to less-than 360 degrees.\")) + init_value(k3d::pi_times_2()) + init_step_increment(k3d::radians(5.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_transformation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_z_min.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_z_max.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_sweep_angle.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::cylinder::primitive> primitive(k3d::cylinder::create(Output));\n\n\t\tprimitive->matrices.push_back(m_transformation.pipeline_value());\n\t\tprimitive->materials.push_back(m_material.pipeline_value());\n\t\tprimitive->radii.push_back(m_radius.pipeline_value());\n\t\tprimitive->z_min.push_back(m_z_min.pipeline_value());\n\t\tprimitive->z_max.push_back(m_z_max.pipeline_value());\n\t\tprimitive->sweep_angles.push_back(m_sweep_angle.pipeline_value());\n\t\tprimitive->selections.push_back(0.0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cylinder > factory(\n\t\t\tk3d::uuid(0x347ffdff, 0x7c4daf2f, 0x8bbce1a4, 0xc5f9af00),\n\t\t\t\"QuadricCylinder\",\n\t\t\t\"Creates a cylinder primitive\",\n\t\t\t\"Quadric\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_transformation;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z_min;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z_max;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_sweep_angle;\n};\n\nk3d::iplugin_factory& cylinder_factory()\n{\n\treturn cylinder::get_factory();\n}\n\n} // namespace quadrics\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/quadrics/detail.h",
    "content": "#ifndef MODULES_QUADRICS_DETAIL_H\n#define MODULES_QUADRICS_DETAIL_H\n\n// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/ibounded.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/node_change_signal.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/snap_source.h>\n#include <k3dsdk/snap_target.h>\n#include <k3dsdk/snappable.h>\n#include <k3dsdk/transformable.h>\n\nnamespace module\n{\n\nnamespace quadrics\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// quadric\n\nclass quadric :\n\tpublic k3d::snappable<k3d::gl::renderable<k3d::ri::renderable<k3d::material_sink<k3d::transformable<k3d::node > > > > >,\n\tpublic k3d::node_change_signal<quadric>,\n\tpublic k3d::ibounded\n{\n\ttypedef k3d::snappable<k3d::gl::renderable<k3d::ri::renderable<k3d::material_sink<k3d::transformable<k3d::node > > > > > base;\n\npublic:\n\tquadric(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tadd_snap_source(new k3d::snap_source(_(\"Center\"), sigc::mem_fun(*this, &quadric::center_source_position), sigc::mem_fun(*this, &quadric::center_source_orientation)));\n\t\tadd_snap_target(new k3d::snap_target(_(\"Center\"), sigc::mem_fun(*this, &quadric::center_target_position), sigc::mem_fun(*this, &quadric::center_target_orientation)));\n\t}\n\nprivate:\n\tconst k3d::point3 center_source_position()\n\t{\n\t\treturn k3d::point3();\n\t}\n\n\tbool center_source_orientation(k3d::vector3& Look, k3d::vector3& Up)\n\t{\n\t\tLook = k3d::vector3(0, 0, 1);\n\t\tUp = k3d::vector3(0, 1, 0);\n\t\treturn true;\n\t}\n\n\tbool center_target_position(const k3d::point3& Position, k3d::point3& TargetPosition)\n\t{\n\t\tTargetPosition = k3d::point3();\n\t\treturn true;\n\t}\n\n\tbool center_target_orientation(const k3d::point3& Position, k3d::vector3& Look, k3d::vector3& Up)\n\t{\n\t\treturn false;\n\t}\n};\n\n} // namespace quadrics\n\n} // namespace module\n\n#endif // !MODULES_QUADRICS_DETAIL_H\n\n"
  },
  {
    "path": "modules/quadrics/disk.cpp",
    "content": "// K-3D\n// Copyright (c) 2008, Timothy M. Shead \n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/disk.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace quadrics\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// disk\n\nclass disk :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node> > base;\n\npublic:\n\tdisk(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_transformation(init_owner(*this) + init_name(\"transformation\") + init_label(_(\"Transformation\")) + init_description(_(\"Transformation matrix used to position / orient / scale the output disk.\")) + init_value(k3d::identity3())),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Defines the disk height along the +Z axis.\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Controls the radius of the output disk.\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_sweep_angle(init_owner(*this) + init_name(\"sweep_angle\") + init_label(_(\"Sweep Angle\")) + init_description(_(\"Optionally limits the sweep angle of the disk to less-than 360 degrees.\")) + init_value(k3d::pi_times_2()) + init_step_increment(k3d::radians(5.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_transformation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_sweep_angle.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::disk::primitive> primitive(k3d::disk::create(Output));\n\n\t\tprimitive->matrices.push_back(m_transformation.pipeline_value());\n\t\tprimitive->materials.push_back(m_material.pipeline_value());\n\t\tprimitive->heights.push_back(m_height.pipeline_value());\n\t\tprimitive->radii.push_back(m_radius.pipeline_value());\n\t\tprimitive->sweep_angles.push_back(m_sweep_angle.pipeline_value());\n\t\tprimitive->selections.push_back(0.0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<disk > factory(\n\t\t\tk3d::uuid(0x63be82ef, 0x184a6396, 0xc34f4988, 0x790b936d),\n\t\t\t\"QuadricDisk\",\n\t\t\t\"Creates a disk primitive\",\n\t\t\t\"Quadric\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_transformation;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_height;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_sweep_angle;\n};\n\nk3d::iplugin_factory& disk_factory()\n{\n\treturn disk::get_factory();\n}\n\n} // namespace quadrics\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/quadrics/hyperboloid.cpp",
    "content": "// K-3D\n// Copyright (c) 2008, Timothy M. Shead \n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/hyperboloid.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace quadrics\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// hyperboloid\n\nclass hyperboloid :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node> > base;\n\npublic:\n\thyperboloid(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_transformation(init_owner(*this) + init_name(\"transformation\") + init_label(_(\"Transformation\")) + init_description(_(\"Transformation matrix used to position / orient / scale the output hyperboloid.\")) + init_value(k3d::identity3())),\n\t\tm_start_point(init_owner(*this) + init_name(\"start_point\") + init_label(_(\"Start Point\")) + init_description(_(\"First point in the swept line segment that defines the output hyperboloid.\")) + init_value(k3d::point3(5, -5, -5))),\n\t\tm_end_point(init_owner(*this) + init_name(\"end_point\") + init_label(_(\"End Point\")) + init_description(_(\"Second point in the swept line segment that defines the output hyperboloid.\")) + init_value(k3d::point3(5, 5, 5))),\n\t\tm_sweep_angle(init_owner(*this) + init_name(\"sweep_angle\") + init_label(_(\"Sweep Angle\")) + init_description(_(\"Optionally limits the sweep angle of the hyperboloid to less-than 360 degrees.\")) + init_value(k3d::pi_times_2()) + init_step_increment(k3d::radians(5.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_transformation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_start_point.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_end_point.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_sweep_angle.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::hyperboloid::primitive> primitive(k3d::hyperboloid::create(Output));\n\n\t\tprimitive->matrices.push_back(m_transformation.pipeline_value());\n\t\tprimitive->materials.push_back(m_material.pipeline_value());\n\t\tprimitive->start_points.push_back(m_start_point.pipeline_value());\n\t\tprimitive->end_points.push_back(m_end_point.pipeline_value());\n\t\tprimitive->sweep_angles.push_back(m_sweep_angle.pipeline_value());\n\t\tprimitive->selections.push_back(0.0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<hyperboloid > factory(\n\t\t\tk3d::uuid(0x78f63f30, 0xf545949b, 0x90c91ba0, 0x76a065c9),\n\t\t\t\"QuadricHyperboloid\",\n\t\t\t\"Creates a hyperboloid primitive\",\n\t\t\t\"Quadric\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_transformation;\n\tk3d_data(k3d::point3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_start_point;\n\tk3d_data(k3d::point3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_end_point;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_sweep_angle;\n};\n\nk3d::iplugin_factory& hyperboloid_factory()\n{\n\treturn hyperboloid::get_factory();\n}\n\n} // namespace quadrics\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/quadrics/logo.cpp",
    "content": "// K-3D\n// Copyright (c) 2008, Timothy M. Shead \n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/cylinder.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/sphere.h>\n#include <k3dsdk/torus.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace quadrics\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// logo\n\nclass logo :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node> > base;\n\npublic:\n\tlogo(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Controls the radius of the output logo.\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tstatic void add_capsule(k3d::cylinder::primitive& Cylinders, k3d::sphere::primitive& Spheres, k3d::imaterial* const Material, const k3d::double_t Radius, const k3d::point3& From, const k3d::point3& To, const k3d::matrix4& Global)\n\t{\n\t\tconst k3d::vector3 look = k3d::normalize(To - From);\n\t\tconst k3d::vector3 right = k3d::vector3(0, -1, 0);\n\t\tconst k3d::vector3 up = look ^ right;\n\n\t\tconst k3d::double_t length = k3d::length(To - From);\n\n\t\tconst k3d::matrix4 place(\n\t\t\tk3d::vector4(right[0], up[0], look[0], From[0]),\n\t\t\tk3d::vector4(right[1], up[1], look[1], From[1]),\n\t\t\tk3d::vector4(right[2], up[2], look[2], From[2]),\n\t\t\tk3d::vector4(0, 0, 0, 1));\n\n\t\tSpheres.matrices.push_back(Global * place * k3d::translate3(0, 0, length));\n\t\tSpheres.materials.push_back(Material);\n\t\tSpheres.radii.push_back(Radius);\n\t\tSpheres.z_min.push_back(0.0);\n\t\tSpheres.z_max.push_back(1.0);\n\t\tSpheres.sweep_angles.push_back(k3d::pi_times_2());\n\t\tSpheres.selections.push_back(0.0);\n\n\t\tCylinders.matrices.push_back(Global * place);\n\t\tCylinders.materials.push_back(Material);\n\t\tCylinders.radii.push_back(Radius);\n\t\tCylinders.z_min.push_back(0.0);\n\t\tCylinders.z_max.push_back(length);\n\t\tCylinders.sweep_angles.push_back(k3d::pi_times_2());\n\t\tCylinders.selections.push_back(0.0);\n\n\t\tSpheres.matrices.push_back(Global * place);\n\t\tSpheres.materials.push_back(Material);\n\t\tSpheres.radii.push_back(Radius);\n\t\tSpheres.z_min.push_back(-1.0);\n\t\tSpheres.z_max.push_back(0.0);\n\t\tSpheres.sweep_angles.push_back(k3d::pi_times_2());\n\t\tSpheres.selections.push_back(0.0);\n\t}\n\n\tstatic void add_sphere(k3d::sphere::primitive& Spheres, k3d::imaterial* const Material, const k3d::double_t Radius, const k3d::point3& Center, const k3d::matrix4& Global)\n\t{\n\t\tconst k3d::matrix4 center = k3d::translate3(Center[0], Center[1], Center[2]);\n\n\t\tSpheres.matrices.push_back(Global * center);\n\t\tSpheres.materials.push_back(Material);\n\t\tSpheres.radii.push_back(Radius);\n\t\tSpheres.z_min.push_back(-1.0);\n\t\tSpheres.z_max.push_back(1.0);\n\t\tSpheres.sweep_angles.push_back(k3d::pi_times_2());\n\t\tSpheres.selections.push_back(0.0);\n\t}\n\n\tstatic void add_torus(k3d::torus::primitive& Tori, k3d::sphere::primitive& Spheres, k3d::imaterial* const Material, const k3d::double_t Radius, const k3d::point3& Center, const k3d::double_t MajorRadius, const k3d::double_t SweepAngle, const k3d::matrix4& Global, const k3d::matrix4& Orientation)\n\t{\n\t\tconst k3d::matrix4 center = k3d::translate3(Center[0], Center[1], Center[2]);\n\n\t\tSpheres.matrices.push_back(Global * center * Orientation * k3d::translate3(MajorRadius, 0, 0) * k3d::rotate3(k3d::pi_over_2(), k3d::vector3(1, 0, 0)));\n\t\tSpheres.materials.push_back(Material);\n\t\tSpheres.radii.push_back(Radius);\n\t\tSpheres.z_min.push_back(0.0);\n\t\tSpheres.z_max.push_back(1.0);\n\t\tSpheres.sweep_angles.push_back(k3d::pi_times_2());\n\t\tSpheres.selections.push_back(0.0);\n\n\t\tTori.matrices.push_back(Global * center * Orientation);\n\t\tTori.materials.push_back(Material);\n\t\tTori.major_radii.push_back(MajorRadius);\n\t\tTori.minor_radii.push_back(Radius);\n\t\tTori.phi_min.push_back(0.0);\n\t\tTori.phi_max.push_back(k3d::pi_times_2());\n\t\tTori.sweep_angles.push_back(SweepAngle);\n\t\tTori.selections.push_back(0.0);\n\n\t\tSpheres.matrices.push_back(Global * center * Orientation * k3d::rotate3(SweepAngle, k3d::vector3(0, 0, 1)) * k3d::translate3(MajorRadius, 0, 0) * k3d::rotate3(k3d::pi_over_2(), k3d::vector3(1, 0, 0)));\n\t\tSpheres.materials.push_back(Material);\n\t\tSpheres.radii.push_back(Radius);\n\t\tSpheres.z_min.push_back(-1.0);\n\t\tSpheres.z_max.push_back(0.0);\n\t\tSpheres.sweep_angles.push_back(k3d::pi_times_2());\n\t\tSpheres.selections.push_back(0.0);\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\tconst k3d::double_t radius = m_radius.pipeline_value();\n\n\t\tboost::scoped_ptr<k3d::cylinder::primitive> cylinders(k3d::cylinder::create(Output));\n\t\tboost::scoped_ptr<k3d::sphere::primitive> spheres(k3d::sphere::create(Output));\n\t\tboost::scoped_ptr<k3d::torus::primitive> tori(k3d::torus::create(Output));\n\n\t\tconst k3d::matrix4 transformation = k3d::scale3(0.1, 0.1, 0.1);\n\n\t\t// Create the \"K\"\n\t\tadd_capsule(*cylinders, *spheres, material, radius, k3d::point3(11.5, 0, -11.5), k3d::point3(11.5, 0, -70), transformation);\n\t\tadd_capsule(*cylinders, *spheres, material, radius, k3d::point3(37.5, 0, -63), k3d::point3(62.917, 0, -88.417), transformation);\n\t\tadd_sphere(*spheres, material, radius, k3d::point3(47, 0, -39), transformation);\n\n\t\t// Create the \"-\"\n\t\tadd_capsule(*cylinders, *spheres, material, radius, k3d::point3(71, 0, -57.5), k3d::point3(90.917, 0, -57.5), transformation);\n\n\t\t// Create the \"3\"\n\t\tadd_capsule(*cylinders, *spheres, material, radius, k3d::point3(145, 0, -30), k3d::point3(100.5, 0, -30), transformation);\n\t\tadd_capsule(*cylinders, *spheres, material, radius, k3d::point3(122.25, 0, -56.5), k3d::point3(145, 0, -30), transformation);\n\t\tadd_torus(*tori, *spheres, material, radius, k3d::point3(122.25, 0, -80.25), 23.75, 3 * k3d::pi_over_2(), transformation, k3d::rotate3(k3d::pi(), k3d::vector3(0, 1, 0)) * k3d::rotate3(k3d::pi_over_2(), k3d::vector3(1, 0, 0)));\n\n\t\t// Create the \"D\"\n\t\tadd_capsule(*cylinders, *spheres, material, radius, k3d::point3(172, 0, -29), k3d::point3(172, 0, -104.5), transformation);\n\t\tadd_torus(*tori, *spheres, material, radius, k3d::point3(197.5, 0, -66.75), 37.75, k3d::pi(), transformation, k3d::rotate3(k3d::pi_over_2(), k3d::vector3(0, 1, 0)) * k3d::rotate3(k3d::pi_over_2(), k3d::vector3(1, 0, 0)));\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<logo > factory(\n\t\t\tk3d::uuid(0xefc80ecb, 0x9340c5b0, 0x0061109e, 0xc97591a3),\n\t\t\t\"QuadricLogo\",\n\t\t\t\"Creates the K-3D logo using quadric primitives.\",\n\t\t\t\"Quadric\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n};\n\nk3d::iplugin_factory& logo_factory()\n{\n\treturn logo::get_factory();\n}\n\n} // namespace quadrics\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/quadrics/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace quadrics\n{\n\nextern k3d::iplugin_factory& cone_factory();\nextern k3d::iplugin_factory& cylinder_factory();\nextern k3d::iplugin_factory& disk_factory();\nextern k3d::iplugin_factory& hyperboloid_factory();\nextern k3d::iplugin_factory& logo_factory();\nextern k3d::iplugin_factory& paraboloid_factory();\nextern k3d::iplugin_factory& sphere_factory();\nextern k3d::iplugin_factory& teapot_factory();\nextern k3d::iplugin_factory& torus_factory();\n\n} // namespace quadrics\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::quadrics::cone_factory());\n\tRegistry.register_factory(module::quadrics::cylinder_factory());\n\tRegistry.register_factory(module::quadrics::disk_factory());\n\tRegistry.register_factory(module::quadrics::hyperboloid_factory());\n\tRegistry.register_factory(module::quadrics::logo_factory());\n\tRegistry.register_factory(module::quadrics::paraboloid_factory());\n\tRegistry.register_factory(module::quadrics::sphere_factory());\n\tRegistry.register_factory(module::quadrics::teapot_factory());\n\tRegistry.register_factory(module::quadrics::torus_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/quadrics/paraboloid.cpp",
    "content": "// K-3D\n// Copyright (c) 2008, Timothy M. Shead \n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/paraboloid.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace quadrics\n{\n\n/////////////////////////////////////////////////////////////////////////////\n//paraboloid \n\nclass paraboloid :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node> > base;\n\npublic:\n\tparaboloid(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_transformation(init_owner(*this) + init_name(\"transformation\") + init_label(_(\"Transformation\")) + init_description(_(\"Transformation matrix used to position / orient / scale the output paraboloid.\")) + init_value(k3d::identity3())),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Controls the radius of the output paraboloid.\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z_min(init_owner(*this) + init_name(\"z_min\") + init_label(_(\"Z Min\")) + init_description(_(\"Defines the paraboloid length along the -Z axis.\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z_max(init_owner(*this) + init_name(\"z_max\") + init_label(_(\"Z Max\")) + init_description(_(\"Defines the paraboloid length along the +Z axis.\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_sweep_angle(init_owner(*this) + init_name(\"sweep_angle\") + init_label(_(\"Sweep Angle\")) + init_description(_(\"Optionally limits the sweep angle of the paraboloid to less-than 360 degrees.\")) + init_value(k3d::pi_times_2()) + init_step_increment(k3d::radians(5.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_transformation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_z_min.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_z_max.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_sweep_angle.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::paraboloid::primitive> primitive(k3d::paraboloid::create(Output));\n\n\t\tprimitive->matrices.push_back(m_transformation.pipeline_value());\n\t\tprimitive->materials.push_back(m_material.pipeline_value());\n\t\tprimitive->radii.push_back(m_radius.pipeline_value());\n\t\tprimitive->z_min.push_back(m_z_min.pipeline_value());\n\t\tprimitive->z_max.push_back(m_z_max.pipeline_value());\n\t\tprimitive->sweep_angles.push_back(m_sweep_angle.pipeline_value());\n\t\tprimitive->selections.push_back(0.0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<paraboloid > factory(\n\t\t\tk3d::uuid(0x12d75d62, 0x574c5065, 0xd670e780, 0x7099afda),\n\t\t\t\"QuadricParaboloid\",\n\t\t\t\"Creates a paraboloid primitive\",\n\t\t\t\"Quadric\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_transformation;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z_min;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z_max;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_sweep_angle;\n};\n\nk3d::iplugin_factory& paraboloid_factory()\n{\n\treturn paraboloid::get_factory();\n}\n\n} // namespace quadrics\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/quadrics/sphere.cpp",
    "content": "// K-3D\n// Copyright (c) 2008, Timothy M. Shead \n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/sphere.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace quadrics\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sphere\n\nclass sphere :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node> > base;\n\npublic:\n\tsphere(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_transformation(init_owner(*this) + init_name(\"transformation\") + init_label(_(\"Transformation\")) + init_description(_(\"Transformation matrix used to position / orient / scale the output sphere.\")) + init_value(k3d::identity3())),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"Radius\")) + init_description(_(\"Controls the radius the output sphere.\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z_min(init_owner(*this) + init_name(\"z_min\") + init_label(_(\"Z Min\")) + init_description(_(\"Optionally truncates the sphere along the -Z axis.\")) + init_value(-1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_z_max(init_owner(*this) + init_name(\"z_max\") + init_label(_(\"Z Max\")) + init_description(_(\"Optionally truncates the sphere along the +Z axis.\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_sweep_angle(init_owner(*this) + init_name(\"sweep_angle\") + init_label(_(\"Sweep Angle\")) + init_description(_(\"Optionally limits the sweep angle of the sphere to less-than 360 degrees.\")) + init_value(k3d::pi_times_2()) + init_step_increment(k3d::radians(5.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_transformation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_z_min.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_z_max.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_sweep_angle.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::sphere::primitive> primitive(k3d::sphere::create(Output));\n\n\t\tprimitive->matrices.push_back(m_transformation.pipeline_value());\n\t\tprimitive->materials.push_back(m_material.pipeline_value());\n\t\tprimitive->radii.push_back(m_radius.pipeline_value());\n\t\tprimitive->z_min.push_back(m_z_min.pipeline_value());\n\t\tprimitive->z_max.push_back(m_z_max.pipeline_value());\n\t\tprimitive->sweep_angles.push_back(m_sweep_angle.pipeline_value());\n\t\tprimitive->selections.push_back(0.0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sphere > factory(\n\t\t\tk3d::uuid(0xcaf583f9, 0xdb4579fe, 0xf5be1084, 0x1e5ebc61),\n\t\t\t\"QuadricSphere\",\n\t\t\t\"Creates a sphere primitive\",\n\t\t\t\"Quadric\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_transformation;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z_min;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z_max;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_sweep_angle;\n};\n\nk3d::iplugin_factory& sphere_factory()\n{\n\treturn sphere::get_factory();\n}\n\n} // namespace quadrics\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/quadrics/teapot.cpp",
    "content": "// K-3D\n// Copyright (c) 2008, Timothy M. Shead \n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/teapot.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace quadrics\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// teapot\n\nclass teapot :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node> > base;\n\npublic:\n\tteapot(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_transformation(init_owner(*this) + init_name(\"transformation\") + init_label(_(\"Transformation\")) + init_description(_(\"Transformation matrix used to position / orient / scale the output teapot.\")) + init_value(k3d::identity3()))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_transformation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::teapot::primitive> primitive(k3d::teapot::create(Output));\n\n\t\tprimitive->matrices.push_back(m_transformation.pipeline_value());\n\t\tprimitive->materials.push_back(m_material.pipeline_value());\n\t\tprimitive->selections.push_back(0.0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<teapot > factory(\n\t\t\tk3d::uuid(0xf0df2bd5, 0xd94e10ca, 0x1883899e, 0xd39d0c29),\n\t\t\t\"Teapot\",\n\t\t\t\"Creates a classic teapot primitive\",\n\t\t\t\"Quadric\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_transformation;\n};\n\nk3d::iplugin_factory& teapot_factory()\n{\n\treturn teapot::get_factory();\n}\n\n} // namespace quadrics\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/quadrics/torus.cpp",
    "content": "// K-3D\n// Copyright (c) 2008, Timothy M. Shead \n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/torus.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace quadrics\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// torus\n\nclass torus :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node> >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node> > base;\n\npublic:\n\ttorus(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_transformation(init_owner(*this) + init_name(\"transformation\") + init_label(_(\"Transformation\")) + init_description(_(\"Transformation matrix used to position / orient / scale the output torus.\")) + init_value(k3d::identity3())),\n\t\tm_major_radius(init_owner(*this) + init_name(\"major_radius\") + init_label(_(\"Major Radius\")) + init_description(_(\"Controls the major radius of the output torus.\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_minor_radius(init_owner(*this) + init_name(\"minor_radius\") + init_label(_(\"Minor Radius\")) + init_description(_(\"Controls the minor radius of the output torus.\")) + init_value(2.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_phi_min(init_owner(*this) + init_name(\"phi_min\") + init_label(_(\"Phi Min\")) + init_description(_(\"Phi Min.\")) + init_value(0.0) + init_step_increment(k3d::radians(5.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_phi_max(init_owner(*this) + init_name(\"phi_max\") + init_label(_(\"Phi Max\")) + init_description(_(\"Phi Max.\")) + init_value(k3d::pi_times_2()) + init_step_increment(k3d::radians(5.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_sweep_angle(init_owner(*this) + init_name(\"sweep_angle\") + init_label(_(\"Sweep Angle\")) + init_description(_(\"Optionally limits the sweep angle of the torus to less-than 360 degrees.\")) + init_value(k3d::pi_times_2()) + init_step_increment(k3d::radians(5.0)) + init_units(typeid(k3d::measurement::angle)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_transformation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_major_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_minor_radius.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_phi_min.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_phi_max.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_sweep_angle.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tboost::scoped_ptr<k3d::torus::primitive> primitive(k3d::torus::create(Output));\n\n\t\tprimitive->matrices.push_back(m_transformation.pipeline_value());\n\t\tprimitive->materials.push_back(m_material.pipeline_value());\n\t\tprimitive->major_radii.push_back(m_major_radius.pipeline_value());\n\t\tprimitive->minor_radii.push_back(m_minor_radius.pipeline_value());\n\t\tprimitive->phi_min.push_back(m_phi_min.pipeline_value());\n\t\tprimitive->phi_max.push_back(m_phi_max.pipeline_value());\n\t\tprimitive->sweep_angles.push_back(m_sweep_angle.pipeline_value());\n\t\tprimitive->selections.push_back(0.0);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<torus > factory(\n\t\t\tk3d::uuid(0xecc68314, 0x004e8d14, 0xd1571fb6, 0x247612b3),\n\t\t\t\"QuadricTorus\",\n\t\t\t\"Creates a torus primitive\",\n\t\t\t\"Quadric\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::matrix4, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_transformation;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_major_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_minor_radius;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_phi_min;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_phi_max;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_sweep_angle;\n};\n\nk3d::iplugin_factory& torus_factory()\n{\n\treturn torus::get_factory();\n}\n\n} // namespace quadrics\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_FTGL_INCLUDE_DIR})\nINCLUDE_DIRECTORIES(${K3D_FREETYPE2_INCLUDE_DIRS})\nLINK_DIRECTORIES(${K3D_FREETYPE2_LIB_DIRS})\n\nK3D_BUILD_MODULE(k3d-reference-opengl-painters)\nK3D_CREATE_MODULE_PROXY(k3d-reference-opengl-painters)\n\nTARGET_LINK_LIBRARIES(k3d-reference-opengl-painters ${K3D_FTGL_LIBRARY})\nTARGET_LINK_LIBRARIES(k3d-reference-opengl-painters ${K3D_FREETYPE2_LIBS})\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/bezier_triangle_patch_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Ashish Myles (marcianx@gmail.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bezier_triangle_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/basic_math.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <vector>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bezier_triangle_patch_painter\n\nclass bezier_triangle_patch_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tbezier_triangle_patch_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\textract_and_render_bezier_triangle(Mesh, RenderState, false);\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::PATCH))\n\t\t\treturn;\n\n\t\textract_and_render_bezier_triangle(Mesh, RenderState, true);\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bezier_triangle_patch_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x8d38bda1, 0xdf47e212, 0x1e06bfb8, 0xa8f440c5),\n\t\t\t\"OpenGLBezierTrianglePatchPainter\",\n\t\t\t_(\"Renders Bezier triangle patches\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\n\t/// Render a rational triangle Bezier patch.\n\tstatic void gl_render_bezier_triangle(const std::vector<k3d::point4 > &control_points, k3d::uint_t order, k3d::bool_t select_mode)\n\t{\n\t\tassert(order > 0);\n\t\tassert(control_points.size() == ( order * (order + 1) / 2 ));\n\n\t\tif (!select_mode) {\n\t\t\t// TODO\n\t\t\t// - Should probably be moved into a separate painter at some point.\n\n\t\t\t// Display control mesh.\n\t\t\t//    0\n\t\t\t//   1 2\n\t\t\t//  3 4 5\n\t\t\t// 6 7 8 9\n\t\t\tfor(k3d::uint_t i = 1; i < order; ++i) {\n\t\t\t\tfor(k3d::uint_t j = 0; j < i; ++j) {\n\t\t\t\t\tk3d::uint_t beg = i * (i - 1) / 2;\n\t\t\t\t\tk3d::point3 p0 = cartesian(control_points[beg     + j  ]);\n\t\t\t\t\tk3d::point3 p1 = cartesian(control_points[beg + i + j  ]);\n\t\t\t\t\tk3d::point3 p2 = cartesian(control_points[beg + i + j+1]);\n\t\t\t\t\tglBegin(GL_LINE_LOOP);\n\t\t\t\t\t\tk3d::gl::vertex3d(p0);\n\t\t\t\t\t\tk3d::gl::vertex3d(p1);\n\t\t\t\t\t\tk3d::gl::vertex3d(p2);\n\t\t\t\t\tglEnd();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// The selection mode is passed in so that it may be\n\t\t// (eventually) used to render a lower-resolution patch on\n\t\t// selection for performance.\n\n\t\t// For now, use a power-of-two EVALUATION DENSITY at least as large\n\t\t// as the number of control points.\n\t\t// (Powers of two avoid errors related to evaluation\n\t\t// watertightness along the boundary.)\n\t\tk3d::uint_t num_segments = 1;\n\t\twhile (num_segments < order)\n\t\t\tnum_segments *= 2;\n  \t\tnum_segments *= 4;\n\n\t\t// Pre-tabulate the factorials\n\t\tstd::vector<k3d::double_t > fact_inv_tab(order);\n\t\tconst k3d::double_t deg_fact  = k3d::factorial(order - 1);\n\t\tconst k3d::double_t degm_fact = k3d::factorial(order - 2);\n\t\tfor(k3d::uint_t n = 0; n < order; ++n)\n\t\t\tfact_inv_tab[n] = k3d::double_t(1.0) / k3d::factorial(k3d::double_t(n));\n\n\t\t// BEZIER TRIANGLES:\n\t\t//     http://en.wikipedia.org/wiki/B%C3%A9zier_triangle\n\t\t//\n\t\t// Triple-index notation with indices adding up to degree = order-1.\n\t\t// E.g. For deg 3, the control points c are labeled:\n\t\t// \t          (w=1)\n\t\t//             003\n\t\t//      c    102 012\n\t\t//         201 111 021\n\t\t// (u=1) 300 210 120 030 (v=1)\n\t\t//\n\t\t// For index ijk,\n\t\t//     u = i / deg,   v = j / deg,   w = k / deg\n\t\t//     which implies that  u + v + w = 1.\n\t\t//\n\t\t// Then, f(u, v) = Sum_{i,j,k} [ c_{ijk}  * choose(deg, i, j, k) * u^i * v^j * w^k ]\n\t\t// where choose(deg, i, j, k) = deg! / (i! j! k!)\n\t\t//\n\t\tstd::vector<k3d::point4 >  eval_points ((num_segments + 1) * (num_segments + 2) / 2);\n\t\tstd::vector<k3d::vector3 > eval_normals((num_segments + 1) * (num_segments + 2) / 2);\n\n\t\t// Going top-to-down order (decreasing k index) for best cache\n\t\t// coherency (see indexing below).\n\t\t// Indexing of eval_points and control_points.\n\t\t//          003                0\n\t\t//  ijk   102 012      -->    1 2  index\n\t\t//      201 111 021          3 4 5\n\t\t//    300 210 120 030       6 7 8 9\n\t\t// ...\n\t\t// index = (deg-k) * (deg-k+1) / 2 + j\n\t\tfor(k3d::uint_t erow = 0; erow <= num_segments; ++erow)\n\t\t{\n\t\t\t// When  ei  =  num_segments  :=  uvw_count - 1,  then  u = 0.\n\t\t\t// Similarly for v and w.\n\t\t\tconst k3d::uint_t ek = num_segments - erow;\n\t\t\tconst k3d::double_t w = k3d::double_t(ek) / num_segments;\n\t\t\tfor(k3d::uint_t ej = 0; ej <= num_segments - ek; ++ej)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t ei = num_segments - ej - ek;\n\t\t\t\tconst k3d::double_t v = k3d::double_t(ej) / num_segments;\n\t\t\t\tconst k3d::double_t u = k3d::double_t(1.0) - w - v;\n\n\t\t\t\tconst k3d::uint_t eval_i = erow * (erow + 1) / 2 + ej;\n\t\t\t\tk3d::point4 &eval_pt = eval_points[eval_i];\n\t\t\t\tk3d::point4 eval_diff_u_homog; // derivatives of the homogeneous coordinates\n\t\t\t\tk3d::point4 eval_diff_v_homog;\n\n\t\t\t\t// eval_points[eval_i] and eval_normals[eval_i] should already be 0\n\t\t\t\tfor(k3d::uint_t row = 0; row < order; ++row)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t k = order - 1 - row;\n\t\t\t\t\tconst k3d::double_t wpk  = k3d::fast_pow(w, k);\n\t\t\t\t\tconst k3d::double_t wpkm = k3d::fast_pow(w, k - 1);\n\t\t\t\t\tfor(k3d::uint_t j = 0; j < order - k; ++j)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t i = order - 1 - k - j;\n\t\t\t\t\t\tconst k3d::double_t vpjm = k3d::fast_pow(v, j - 1);\n\t\t\t\t\t\tconst k3d::double_t upim = k3d::fast_pow(u, i - 1);\n\t\t\t\t\t\tconst k3d::double_t vpj  = k3d::fast_pow(v, j);\n\t\t\t\t\t\tconst k3d::double_t upi  = k3d::fast_pow(u, i);\n\t\t\t\t\t\tk3d::double_t coeff = deg_fact * fact_inv_tab[i] * fact_inv_tab[j] * fact_inv_tab[k];\n\n\t\t\t\t\t\t//         0\n\t\t\t\t\t\t//   i-,j-   i-,j\n\t\t\t\t\t\t//   3    ij    5\n\t\t\t\t\t\t// 6    7    8    9\n\t\t\t\t\t\t//\n\t\t\t\t\t\tk3d::uint_t cpts_ijk = row * (row + 1) / 2 + j;\n\t\t\t\t\t\teval_pt += (coeff * upi * vpj * wpk) * to_vector(control_points[cpts_ijk]);\n\n\t\t\t\t\t\t// (Homogeneous) derivatives\n\t\t\t\t\t\t//          003                0\n\t\t\t\t\t\t//  ijk   102 012      -->    1 2  index\n\t\t\t\t\t\t//      201 111 021          3 4 5\n\t\t\t\t\t\t//    300 210 120 030       6 7 8 9\n\t\t\t\t\t\tconst k3d::point4 &c_ijk = control_points[cpts_ijk];\n\t\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\t\tassert(int(cpts_ijk) - int(i) >= 0);\n\t\t\t\t\t\t\tk3d::uint_t cpts_imjk = cpts_ijk - row;\n\t\t\t\t\t\t\tconst k3d::point4 &c_imjk = control_points[cpts_imjk];\n\t\t\t\t\t\t\tk3d::double_t coeff_du = degm_fact * fact_inv_tab[i - 1] * fact_inv_tab[j] * fact_inv_tab[k];\n\t\t\t\t\t\t\teval_diff_u_homog += (coeff_du * upim * vpj * wpk) * (\n\t\t\t\t\t\t\t\t\tk3d::vector4( c_ijk[0] - c_imjk[0], c_ijk[1] - c_imjk[1],\n\t\t\t\t\t\t\t\t\t              c_ijk[2] - c_imjk[2], c_ijk[3] - c_imjk[3] ));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (j > 0) {\n\t\t\t\t\t\t\tassert(int(cpts_ijk) - int(i) - 1 >= 0);\n\t\t\t\t\t\t\tk3d::uint_t cpts_ijkm = cpts_ijk - row - 1;\n\t\t\t\t\t\t\tconst k3d::point4 &c_ijkm = control_points[cpts_ijkm];\n\t\t\t\t\t\t\tk3d::double_t coeff_dv = degm_fact * fact_inv_tab[i] * fact_inv_tab[j - 1] * fact_inv_tab[k];\n\t\t\t\t\t\t\teval_diff_v_homog += (coeff_dv * upi * vpjm * wpk) * (\n\t\t\t\t\t\t\t\t\tk3d::vector4( c_ijk[0] - c_ijkm[0], c_ijk[1] - c_ijkm[1],\n\t\t\t\t\t\t\t\t\t              c_ijk[2] - c_ijkm[2], c_ijk[3] - c_ijkm[3] ));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Since we have a rational patch in general, we need\n\t\t\t\t// to use the division rule to compute tangents.\n\t\t\t\t//     diff(a/b) = (b a' - a b') / b^2\n\t\t\t\t// Note that the denominator (b) and its u derivative (b')\n\t\t\t\t// are eval_pt[3] and eval_diff_u_homog[3], respectively\n\t\t\t\t// (eval_diff_v_homog[3] when differentiating w.r.t. v).\n\t\t\t\t//\n\t\t\t\t// Since we don't care about the derivative but the\n\t\t\t\t// normalized normal, there is no need to divide by the\n\t\t\t\t// denominator.\n\t\t\t\t//\n\t\t\t\t//const k3d::double_t denom_inv = (eval_pt[3] == 0.0) ? 1.0 : 1.0 / (eval_pt[3] * eval_pt[3]);\n\t\t\t\tk3d::vector3 eval_diff_u = k3d::vector3(\n\t\t\t\t\t\t(eval_diff_u_homog[0] * eval_pt[3] - eval_pt[0] * eval_diff_u_homog[3]), // * denom_inv,\n\t\t\t\t\t\t(eval_diff_u_homog[1] * eval_pt[3] - eval_pt[1] * eval_diff_u_homog[3]), // * denom_inv,\n\t\t\t\t\t\t(eval_diff_u_homog[2] * eval_pt[3] - eval_pt[2] * eval_diff_u_homog[3])  // * denom_inv\n\t\t\t\t\t\t);\n\t\t\t\tk3d::vector3 eval_diff_v = k3d::vector3(\n\t\t\t\t\t\t(eval_diff_v_homog[0] * eval_pt[3] - eval_pt[0] * eval_diff_v_homog[3]), // * denom_inv,\n\t\t\t\t\t\t(eval_diff_v_homog[1] * eval_pt[3] - eval_pt[1] * eval_diff_v_homog[3]), // * denom_inv,\n\t\t\t\t\t\t(eval_diff_v_homog[2] * eval_pt[3] - eval_pt[2] * eval_diff_v_homog[3])  // * denom_inv\n\t\t\t\t\t\t);\n\n\t\t\t\t// normal = the normalized cross-product of the derivatives.\n\t\t\t\teval_normals[eval_i] = eval_diff_u ^ eval_diff_v;\n\t\t\t\tif (eval_normals[eval_i].length2() > 0)\n\t\t\t\t\tk3d::normalize(eval_normals[eval_i]);\n\t\t\t}\n\t\t}\n\n\t\t// Render using triangle strips\n\t\tfor (k3d::uint_t ei = 1; ei <= num_segments; ++ei)\n\t\t{\n\t\t\tglBegin(GL_TRIANGLE_STRIP);\n\t\t\tk3d::uint_t eval_i  = ei * (ei + 1) / 2;\n\t\t\tk3d::uint_t eval_im = eval_i - ei;\n\t\t\tk3d::gl::normal3d(eval_normals[eval_i]);\n\t\t\tk3d::gl::vertex4d(eval_points [eval_i]);\n\t\t\tfor (k3d::uint_t ej = 0; ej < ei; ++ej)\n\t\t\t{\n\t\t\t\tk3d::gl::normal3d(eval_normals[eval_im + ej]);\n\t\t\t\tk3d::gl::vertex4d(eval_points [eval_im + ej]);\n\t\t\t\tk3d::gl::normal3d(eval_normals[eval_i + ej + 1]);\n\t\t\t\tk3d::gl::vertex4d(eval_points [eval_i + ej + 1]);\n\t\t\t}\n\n\t\t\tglEnd();\n\t\t}\n\t}\n\nprivate:\n\t/// Common computation for bezier_triangle_patch_painter::on_paint_mesh() and bezier_triangle_patch_painter::on_select_mesh().\n\tvoid extract_and_render_bezier_triangle(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::bool_t select_mode)\n\t{\n\t\tk3d::uint_t primitive_index = 0; // Need these indices (OpenGL selection \"names\") only for SELECTION MODE\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::bezier_triangle_patch::const_primitive> bezier_triangle_patch(k3d::bezier_triangle_patch::validate(Mesh, **primitive));\n\t\t\tif (!bezier_triangle_patch)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh::indices_t& patch_first_points = bezier_triangle_patch->patch_first_points;\n\t\t\tconst k3d::mesh::orders_t& patch_orders = bezier_triangle_patch->patch_orders;\n\t\t\tconst k3d::mesh::indices_t& patch_points = bezier_triangle_patch->patch_points;\n\t\t\tconst k3d::mesh::weights_t& patch_point_weights = bezier_triangle_patch->patch_point_weights;\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tconst k3d::uint_t num_patches = patch_orders.size();\n\n\t\t\tk3d::gl::store_attributes attributes;\n\n\t\t\t// Needed only for RENDERING MODE\n\t\t\tconst k3d::mesh::selection_t& patch_selections = bezier_triangle_patch->patch_selections;\n\t\t\tglEnable(GL_LIGHTING);\n\t\t\tconst k3d::color color = k3d::color(0.8, 0.8, 0.8);\n\t\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\t\tglFrontFace(RenderState.inside_out ? GL_CW : GL_CCW);\n\t\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\t\tk3d::gl::set(GL_CULL_FACE, RenderState.draw_two_sided);\n\n\t\t\tif (select_mode) // Tokens are only for SELECTION MODE\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tstd::vector<k3d::point4> weighted_bezier_control_points;\n\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\tconst k3d::uint_t patch_end = patch_begin + num_patches;\n\t\t\tfor(k3d::uint_t patch = patch_begin; patch < patch_end; ++patch)\n\t\t\t{\n\t\t\t\tif (!select_mode) // Material is only for RENDERING MODE\n\t\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, patch_selections[patch] ? selected_color : color);\n\n\t\t\t\tconst k3d::uint_t order = patch_orders[patch];\n\t\t\t\tassert(order > 0);\n\t\t\t\tconst k3d::uint_t patch_size = (order * (order + 1)) / 2;\n\n\t\t\t\t// Convert control points to weighted points (since it is a rational patch in general).\n\t\t\t\tweighted_bezier_control_points.clear();\n\t\t\t\tweighted_bezier_control_points.reserve(patch_size);\n\t\t\t\tconst k3d::uint_t point_begin = patch_first_points[patch];\n\t\t\t\tconst k3d::uint_t point_end = point_begin + patch_size;\n\t\t\t\tassert(point_end <= patch_points.size());\n\n\t\t\t\tfor(k3d::uint_t point = point_begin; point < point_end; ++point)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::double_t weight = patch_point_weights[point];\n\t\t\t\t\tweighted_bezier_control_points.push_back(k3d::point4(\n\t\t\t\t\t\tweight * points[patch_points[point]][0],\n\t\t\t\t\t\tweight * points[patch_points[point]][1],\n\t\t\t\t\t\tweight * points[patch_points[point]][2],\n\t\t\t\t\t\tweight));\n\t\t\t\t}\n\n\t\t\t\tif (select_mode) // Tokens are only for SELECTION MODE\n\t\t\t\t\tk3d::gl::push_selection_token(k3d::selection::PATCH, patch);\n\n\t\t\t\t// Tessellate/evaluate and render the patch.\n\t\t\t\tbezier_triangle_patch_painter::gl_render_bezier_triangle(weighted_bezier_control_points, order, false);\n\n\t\t\t\tif (select_mode) // Tokens are only for SELECTION MODE\n\t\t\t\t\tk3d::gl::pop_selection_token(); // PATCH\n\t\t\t}\n\n\t\t\tif (select_mode) // Tokens are only for SELECTION MODE\n\t\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bezier_triangle_patch_painter_factory\n\nk3d::iplugin_factory& bezier_triangle_patch_painter_factory()\n{\n\treturn bezier_triangle_patch_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/bicubic_patch_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bicubic_patch_painter\n\nclass bicubic_patch_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tbicubic_patch_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::bicubic_patch::const_primitive> bicubic_patch(k3d::bicubic_patch::validate(Mesh, **primitive));\n\t\t\tif(!bicubic_patch)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh::selection_t& patch_selections = bicubic_patch->patch_selections;\n\t\t\tconst k3d::mesh::indices_t& patch_points = bicubic_patch->patch_points;\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglEnable(GL_LIGHTING);\n\n\t\t\tconst k3d::color color = k3d::color(0.8, 0.8, 0.8);\n\t\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\t\tglFrontFace(RenderState.inside_out ? GL_CW : GL_CCW);\n\t\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\t\tk3d::gl::set(GL_CULL_FACE, RenderState.draw_two_sided);\n\n\t\t\tconst unsigned int u_count = 5;\n\t\t\tconst unsigned int v_count = 5;\n\t\t\tconst GLint u_order = 4;\n\t\t\tconst GLint v_order = 4;\n\t\t\tconst GLint u_stride = 3;\n\t\t\tconst GLint v_stride = 4 * u_stride;\n\n\t\t\tglEnable(GL_MAP2_VERTEX_3);\n\t\t\tglEnable(GL_AUTO_NORMAL);\n\t\t\tglMapGrid2d(u_count, 0.0, 1.0, v_count, 0.0, 1.0);\n\n\t\t\tGLdouble gl_patch_points[4 * 4 * 3];\n\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\tconst k3d::uint_t patch_end = patch_begin + (patch_points.size() / 16);\n\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t{\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, patch_selections[patch] ? selected_color : color);\n\n\t\t\t\tGLdouble* gl_patch_point = gl_patch_points;\n\t\t\t\t\n\t\t\t\tconst k3d::uint_t point_begin = patch * 16;\n\t\t\t\tconst k3d::uint_t point_end = point_begin + 16;\n\t\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\t{\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][0];\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][1];\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][2];\n\t\t\t\t}\n\n\t\t\t\tglMap2d(GL_MAP2_VERTEX_3, 0, 1, u_stride, u_order, 0, 1, v_stride, v_order, &gl_patch_points[0]);\n\t\t\t\tglEvalMesh2(GL_FILL, 0, u_count, 0, v_count);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::PATCH))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::bicubic_patch::const_primitive> bicubic_patch(k3d::bicubic_patch::validate(Mesh, **primitive));\n\t\t\tif(!bicubic_patch)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh::indices_t& patch_points = bicubic_patch->patch_points;\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\n\t\t\tglFrontFace(RenderState.inside_out ? GL_CW : GL_CCW);\n\t\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\t\tk3d::gl::set(GL_CULL_FACE, RenderState.draw_two_sided);\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tconst unsigned int u_count = 5;\n\t\t\tconst unsigned int v_count = 5;\n\t\t\tconst GLint u_order = 4;\n\t\t\tconst GLint v_order = 4;\n\t\t\tconst GLint u_stride = 3;\n\t\t\tconst GLint v_stride = 4 * u_stride;\n\n\t\t\tglEnable(GL_MAP2_VERTEX_3);\n\t\t\tglEnable(GL_AUTO_NORMAL);\n\t\t\tglMapGrid2d(u_count, 0.0, 1.0, v_count, 0.0, 1.0);\n\n\t\t\tGLdouble gl_patch_points[4 * 4 * 3];\n\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\tconst k3d::uint_t patch_end = patch_begin + (patch_points.size() / 16);\n\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t{\n\t\t\t\tGLdouble* gl_patch_point = gl_patch_points;\n\t\t\t\t\n\t\t\t\tconst k3d::uint_t point_begin = patch * 16;\n\t\t\t\tconst k3d::uint_t point_end = point_begin + 16;\n\t\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\t{\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][0];\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][1];\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][2];\n\t\t\t\t}\n\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::PATCH, patch);\n\n\t\t\t\tglMap2d(GL_MAP2_VERTEX_3, 0, 1, u_stride, u_order, 0, 1, v_stride, v_order, &gl_patch_points[0]);\n\t\t\t\tglEvalMesh2(GL_FILL, 0, u_count, 0, v_count);\n\n\t\t\t\tk3d::gl::pop_selection_token(); // PATCH\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bicubic_patch_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xe058ab07, 0x44384acd, 0xba321d58, 0xcdb3ef25),\n\t\t\t\"OpenGLBicubicPatchPainter\",\n\t\t\t_(\"Renders bicubic patches\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bicubic_patch_painter_factory\n\nk3d::iplugin_factory& bicubic_patch_painter_factory()\n{\n\treturn bicubic_patch_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/bilinear_patch_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bilinear_patch_painter\n\nclass bilinear_patch_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tbilinear_patch_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::bilinear_patch::const_primitive> bilinear_patch(k3d::bilinear_patch::validate(Mesh, **primitive));\n\t\t\tif(!bilinear_patch)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst k3d::mesh::selection_t& patch_selections = bilinear_patch->patch_selections;\n\t\t\tconst k3d::mesh::indices_t& patch_points = bilinear_patch->patch_points;\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglEnable(GL_LIGHTING);\n\n\t\t\tconst k3d::color color = k3d::color(0.8, 0.8, 0.8);\n\t\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\t\tglFrontFace(RenderState.inside_out ? GL_CW : GL_CCW);\n\t\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\t\tk3d::gl::set(GL_CULL_FACE, RenderState.draw_two_sided);\n\n\t\t\tconst unsigned int u_count = 10;\n\t\t\tconst unsigned int v_count = 10;\n\t\t\tconst GLint u_order = 2;\n\t\t\tconst GLint v_order = 2;\n\t\t\tconst GLint u_stride = 3;\n\t\t\tconst GLint v_stride = 2 * u_stride;\n\n\t\t\tglEnable(GL_MAP2_VERTEX_3);\n\t\t\tglEnable(GL_AUTO_NORMAL);\n\t\t\tglMapGrid2d(u_count, 0.0, 1.0, v_count, 0.0, 1.0);\n\n\t\t\tGLdouble gl_patch_points[2 * 2 * 3];\n\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\tconst k3d::uint_t patch_end = patch_begin + (patch_points.size() / 4);\n\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t{\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, patch_selections[patch] ? selected_color : color);\n\n\t\t\t\tGLdouble* gl_patch_point = gl_patch_points;\n\t\t\t\t\n\t\t\t\tconst k3d::uint_t point_begin = patch * 4;\n\t\t\t\tconst k3d::uint_t point_end = point_begin + 4;\n\t\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\t{\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][0];\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][1];\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][2];\n\t\t\t\t}\n\n\t\t\t\tglMap2d(GL_MAP2_VERTEX_3, 0, 1, u_stride, u_order, 0, 1, v_stride, v_order, &gl_patch_points[0]);\n\t\t\t\tglEvalMesh2(GL_FILL, 0, u_count, 0, v_count);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::PATCH))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::bilinear_patch::const_primitive> bilinear_patch(k3d::bilinear_patch::validate(Mesh, **primitive));\n\t\t\tif(!bilinear_patch)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst k3d::mesh::indices_t& patch_points = bilinear_patch->patch_points;\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\n\t\t\tglFrontFace(RenderState.inside_out ? GL_CW : GL_CCW);\n\t\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\t\tk3d::gl::set(GL_CULL_FACE, RenderState.draw_two_sided);\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tconst unsigned int u_count = 10;\n\t\t\tconst unsigned int v_count = 10;\n\t\t\tconst GLint u_order = 2;\n\t\t\tconst GLint v_order = 2;\n\t\t\tconst GLint u_stride = 3;\n\t\t\tconst GLint v_stride = 2 * u_stride;\n\n\t\t\tglEnable(GL_MAP2_VERTEX_3);\n\t\t\tglEnable(GL_AUTO_NORMAL);\n\t\t\tglMapGrid2d(u_count, 0.0, 1.0, v_count, 0.0, 1.0);\n\n\t\t\tGLdouble gl_patch_points[2 * 2 * 3];\n\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\tconst k3d::uint_t patch_end = patch_begin + (patch_points.size() / 4);\n\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t{\n\t\t\t\tGLdouble* gl_patch_point = gl_patch_points;\n\t\t\t\t\n\t\t\t\tconst k3d::uint_t point_begin = patch * 4;\n\t\t\t\tconst k3d::uint_t point_end = point_begin + 4;\n\t\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\t{\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][0];\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][1];\n\t\t\t\t\t*gl_patch_point++ = points[patch_points[point]][2];\n\t\t\t\t}\n\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::PATCH, patch);\n\n\t\t\t\tglMap2d(GL_MAP2_VERTEX_3, 0, 1, u_stride, u_order, 0, 1, v_stride, v_order, &gl_patch_points[0]);\n\t\t\t\tglEvalMesh2(GL_FILL, 0, u_count, 0, v_count);\n\n\t\t\t\tk3d::gl::pop_selection_token(); // PATCH\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bilinear_patch_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xf172b866, 0xfce74aa8, 0xa9e792ff, 0x630653f3),\n\t\t\t\"OpenGLBilinearPatchPainter\",\n\t\t\t_(\"Renders bilinear patches\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bilinear_patch_painter_factory\n\nk3d::iplugin_factory& bilinear_patch_painter_factory()\n{\n\treturn bilinear_patch_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/blobby_point_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/blobby.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// blobby_point_painter\n\nclass blobby_point_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tblobby_point_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::blobby::const_primitive> blobby(k3d::blobby::validate(Mesh, **primitive));\n\t\t\tif(!blobby)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0, 1, 1);\n\t\t\tk3d::gl::color3d(color);\n\n\t\t\tconst k3d::uint_t primitives_begin = 0;\n\t\t\tconst k3d::uint_t primitives_end = primitives_begin + blobby->primitives.size();\n\t\t\tfor(k3d::uint_t primitive = primitives_begin; primitive != primitives_end; ++primitive)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_float = blobby->primitive_first_floats[primitive];\n\t\t\t\tconst k3d::uint_t float_count = blobby->primitive_float_counts[primitive];\n\n\t\t\t\tswitch(blobby->primitives[primitive])\n\t\t\t\t{\n\t\t\t\t\tcase k3d::blobby::CONSTANT:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase k3d::blobby::ELLIPSOID:\n\t\t\t\t\t{\n\t\t\t\t\t\treturn_if_fail(float_count == 16);\n\n\t\t\t\t\t\tconst k3d::point3 point(0, 0, 0);\n\n\t\t\t\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\t\t\t\tglPushMatrix();\n\t\t\t\t\t\tglMultMatrixd(&blobby->floats[first_float]);\n\n\t\t\t\t\t\tglBegin(GL_POINTS);\n\t\t\t\t\t\tk3d::gl::vertex3d(point);\n\t\t\t\t\t\tglEnd();\n\n\t\t\t\t\t\tglPopMatrix();\n\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase k3d::blobby::SEGMENT:\n\t\t\t\t\t{\n\t\t\t\t\t\treturn_if_fail(float_count == 23);\n\n\t\t\t\t\t\tconst k3d::point3 point1(blobby->floats[first_float + 0], blobby->floats[first_float + 1], blobby->floats[first_float + 2]);\n\t\t\t\t\t\tconst k3d::point3 point2(blobby->floats[first_float + 3], blobby->floats[first_float + 4], blobby->floats[first_float + 5]);\n\n\t\t\t\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\t\t\t\tglPushMatrix();\n\t\t\t\t\t\tglMultMatrixd(&blobby->floats[first_float + 7]);\n\n\t\t\t\t\t\tglBegin(GL_LINES);\n\t\t\t\t\t\tk3d::gl::vertex3d(point1);\n\t\t\t\t\t\tk3d::gl::vertex3d(point2);\n\t\t\t\t\t\tglEnd();\n\n\t\t\t\t\t\tglPopMatrix();\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::blobby::const_primitive> blobby(k3d::blobby::validate(Mesh, **primitive));\n\t\t\tif(!blobby)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\t\t\tk3d::gl::push_selection_token(k3d::selection::CONSTANT, 0);\n\t\t\tk3d::gl::push_selection_token(k3d::selection::SURFACE, 0);\n\n\t\t\tconst k3d::uint_t primitives_begin = 0;\n\t\t\tconst k3d::uint_t primitives_end = primitives_begin + blobby->primitives.size();\n\t\t\tfor(k3d::uint_t primitive = primitives_begin; primitive != primitives_end; ++primitive)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::PARAMETER, primitive);\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::POINT, primitive);\n\n\t\t\t\tconst k3d::uint_t first_float = blobby->primitive_first_floats[primitive];\n\t\t\t\tconst k3d::uint_t float_count = blobby->primitive_float_counts[primitive];\n\n\t\t\t\tswitch(blobby->primitives[primitive])\n\t\t\t\t{\n\t\t\t\t\tcase k3d::blobby::CONSTANT:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase k3d::blobby::ELLIPSOID:\n\t\t\t\t\t{\n\t\t\t\t\t\treturn_if_fail(float_count == 16);\n\n\t\t\t\t\t\tconst k3d::point3 point(0, 0, 0);\n\n\t\t\t\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\t\t\t\tglPushMatrix();\n\t\t\t\t\t\tglMultMatrixd(&blobby->floats[first_float]);\n\n\t\t\t\t\t\tglBegin(GL_POINTS);\n\t\t\t\t\t\tk3d::gl::vertex3d(point);\n\t\t\t\t\t\tglEnd();\n\n\t\t\t\t\t\tglPopMatrix();\n\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase k3d::blobby::SEGMENT:\n\t\t\t\t\t{\n\t\t\t\t\t\treturn_if_fail(float_count == 23);\n\n\t\t\t\t\t\tconst k3d::point3 point1(blobby->floats[first_float + 0], blobby->floats[first_float + 1], blobby->floats[first_float + 2]);\n\t\t\t\t\t\tconst k3d::point3 point2(blobby->floats[first_float + 3], blobby->floats[first_float + 4], blobby->floats[first_float + 5]);\n\n\t\t\t\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\t\t\t\tglPushMatrix();\n\t\t\t\t\t\tglMultMatrixd(&blobby->floats[first_float + 7]);\n\n\t\t\t\t\t\tglBegin(GL_LINES);\n\t\t\t\t\t\tk3d::gl::vertex3d(point1);\n\t\t\t\t\t\tk3d::gl::vertex3d(point2);\n\t\t\t\t\t\tglEnd();\n\n\t\t\t\t\t\tglPopMatrix();\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tk3d::gl::pop_selection_token(); // POINT\n\t\t\t\tk3d::gl::pop_selection_token(); // PARAMETER\n\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // SURFACE\n\t\t\tk3d::gl::pop_selection_token(); // CONSTANT\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<blobby_point_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x06148329, 0xb2264760, 0x84b25aab, 0xf8401c63),\n\t\t\t\"OpenGLBlobbyPointPainter\",\n\t\t\t_(\"Renders blobby primitives using points and lines\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// blobby_point_painter_factory\n\nk3d::iplugin_factory& blobby_point_painter_factory()\n{\n\treturn blobby_point_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/color_face_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// color_face_painter\n\nclass color_face_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tcolor_face_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_color_array(init_owner(*this) + init_name(\"color_array\") + init_label(_(\"Color Array\")) + init_description(_(\"Specifies the array name to be used for face colors\")) + init_value(std::string(\"Cs\"))),\n\t\tm_array_type(init_owner(*this) + init_name(\"array_type\") + init_label(_(\"Array Type\")) + init_description(_(\"Type of array to use\")) + init_value(k3d::string_t(\"face\")) + init_values(component_values()))\n\t{\n\t\tm_color_array.changed_signal().connect(make_async_redraw_slot());\n\t\tm_array_type.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tif(k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\t\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\n\t\t\tconst k3d::uint_t face_count = polyhedron->face_first_loops.size();\n\t\n\t\t\t// Calculate face normals ...\n\t\t\tk3d::typed_array<k3d::normal3> normals(face_count, k3d::normal3(0, 0, 1));\n\t\t\tfor(k3d::uint_t face = 0; face != face_count; ++face)\n\t\t\t\tnormals[face] = k3d::polyhedron::normal(polyhedron->vertex_points, polyhedron->clockwise_edges, points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]);\n\t\n\t\t\t// Define a default face color array (in case the user's choice of color array doesn't exist) ...\n\t\t\tk3d::typed_array<k3d::color> default_color_array;\n\t\n\t\t\t// Get the color array ...\n\t\t\tcolor_array_proxy color(m_array_type.pipeline_value(), m_color_array.pipeline_value(), *polyhedron, Mesh.point_attributes);\n\t\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglEnable(GL_LIGHTING);\n\t\n\t\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\t\tk3d::gl::set(GL_CULL_FACE, RenderState.draw_two_sided);\n\t\n\t\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\t\tglPolygonOffset(1.0, 1.0);\n\t\t\t\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_shells.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tk3d::gl::normal3d(normals[face]);\n\t\n\t\t\t\tglBegin(GL_POLYGON);\n\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[polyhedron->face_first_loops[face]];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, color(face, edge));\n\t\t\t\t\tk3d::gl::vertex3d(points[polyhedron->vertex_points[edge]]);\n\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tglEnd();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::FACE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\n\t\t\tif(k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\t\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\n\t\t\tconst k3d::uint_t face_count = polyhedron->face_first_loops.size();\n\t\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\t\n\t\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\t\tk3d::gl::set(GL_CULL_FACE, RenderState.draw_two_sided);\n\t\n\t\t\tfor(k3d::uint_t face = 0; face != face_count; ++face)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::FACE, face);\n\t\n\t\t\t\tglBegin(GL_POLYGON);\n\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[polyhedron->face_first_loops[face]];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tk3d::gl::vertex3d(points[polyhedron->vertex_points[edge]]);\n\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tglEnd();\n\t\n\t\t\t\tk3d::gl::pop_selection_token(); // FACE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<color_face_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x60b5a9cf, 0xee4fe64c, 0x7559c98f, 0x9ed5b56b),\n\t\t\t\"OpenGLColorFacePainter\",\n\t\t\t_(\"Renders mesh faces using a per-face color array\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tconst k3d::ilist_property<k3d::string_t>::values_t& component_values()\n\t{\n\t\tstatic k3d::ilist_property<k3d::string_t>::values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(\"constant\");\n\t\t\tvalues.push_back(\"edge\");\n\t\t\tvalues.push_back(\"face\");\n\t\t\tvalues.push_back(\"vertex\");\n\t\t\tvalues.push_back(\"point\");\n\t\t}\n\n\t\treturn values;\n\t}\n\t\n\tstruct color_array_proxy\n\t{\n\t\t// Note: we assume the polyhedra are valid here\n\t\tcolor_array_proxy(const k3d::string_t ArrayType,\n\t\t\t\tconst k3d::string_t& ArrayName,\n\t\t\t\tconst k3d::polyhedron::const_primitive& Polyhedron,\n\t\t\t\tconst k3d::table& PointData) :\n\t\t\t\t\tm_array_type(ArrayType),\n\t\t\t\t\tm_vertex_points(Polyhedron.vertex_points)\n\t\t{\n\t\t\tm_color_array = 0;\n\t\t\tif(m_array_type == \"constant\")\n\t\t\t\tm_color_array = Polyhedron.constant_attributes.lookup<k3d::mesh::colors_t>(ArrayName);\n\t\t\telse if(m_array_type == \"face\")\n\t\t\t\tm_color_array = Polyhedron.face_attributes.lookup<k3d::mesh::colors_t>(ArrayName);\n\t\t\telse if(m_array_type == \"edge\")\n\t\t\t\tm_color_array = Polyhedron.edge_attributes.lookup<k3d::mesh::colors_t>(ArrayName);\n\t\t\telse if(m_array_type == \"vertex\")\n\t\t\t\tm_color_array = Polyhedron.vertex_attributes.lookup<k3d::mesh::colors_t>(ArrayName);\n\t\t\telse if(m_array_type == \"point\")\n\t\t\t\tm_color_array = PointData.lookup<k3d::mesh::colors_t>(ArrayName);\n\t\t\t//assert_not_reached();\n\t\t}\n\t\t\n\t\tconst k3d::color operator()(const k3d::uint_t Face, const k3d::uint_t Edge)\n\t\t{\n\t\t\tif(!m_color_array)\n\t\t\t\treturn k3d::color(0.9,0.9,0.9);\n\t\t\tif(m_array_type == \"constant\")\n\t\t\t\treturn m_color_array->at(0);\n\t\t\telse if(m_array_type == \"face\")\n\t\t\t\treturn m_color_array->at(Face);\n\t\t\telse if(m_array_type == \"edge\" || m_array_type == \"vertex\")\n\t\t\t\treturn m_color_array->at(Edge);\n\t\t\telse if(m_array_type == \"point\")\n\t\t\t\treturn m_color_array->at(m_vertex_points[Edge]);\n\t\t\t//assert_not_reached();\n\t\t}\n\t\t\n\tprivate:\n\t\tconst k3d::string_t m_array_type;\n\t\tconst k3d::mesh::colors_t* m_color_array;\n\t\tconst k3d::mesh::indices_t& m_vertex_points;\n\t};\n\t\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color_array;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_array_type;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// color_face_painter_factory\n\nk3d::iplugin_factory& color_face_painter_factory()\n{\n\treturn color_face_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/colored_selection_painter_gl.h",
    "content": "#ifndef MODULES_REFERENCE_OPENGL_PAINTERS_COLORED_SELECTION_PAINTER_GL_H\n#define MODULES_REFERENCE_OPENGL_PAINTERS_COLORED_SELECTION_PAINTER_GL_H\n\n// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Base class for mesh painters that change colors by component- and mesh selection\n */\n\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_painter_gl.h>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nclass colored_selection_painter : \n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\npublic:\n\tcolored_selection_painter(k3d::iplugin_factory& Factory,\n\t\t\tk3d::idocument& Document,\n\t\t\tconst k3d::color UnselectedMeshColor = k3d::color(0.0, 0.0, 0.0),\n\t\t\tconst k3d::color SelectedMeshColor = k3d::color(1.0, 1.0, 1.0),\n\t\t\tconst k3d::color SelectedComponentColor = k3d::color(1.0, 0.0, 0.0),\n\t\t\tconst k3d::color SelectedParentMeshColor = k3d::color(0.5, 0.5, 0.5)) :\n\t\tbase(Factory, Document),\n\t\tm_unselected_mesh_color(init_owner(*this) + init_name(\"unselected_mesh_color\") + init_label(_(\"Unselected Mesh Color\")) + init_description(_(\"Color the mesh is drawn in when it is unselected\")) + init_value(UnselectedMeshColor)),\n\t\tm_parent_selected_mesh_color(init_owner(*this) + init_name(\"child_mesh_color\") + init_label(_(\"Child Mesh Color\")) + init_description(_(\"Color the mesh is drawn in when its parent is selected\")) + init_value(SelectedParentMeshColor)),\n\t\tm_selected_mesh_color(init_owner(*this) + init_name(\"selected_mesh_color\") + init_label(_(\"Selected Mesh Color\")) + init_description(_(\"Color unselected components are drawn in when their mesh is selected\")) + init_value(SelectedMeshColor)),\n\t\tm_selected_component_color(init_owner(*this) + init_name(\"selected_component_color\") + init_label(_(\"Selected Component Color\")) + init_description(_(\"Color selected components are drawn in\")) + init_value(SelectedComponentColor))\n\t{\n\t\tm_unselected_mesh_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_parent_selected_mesh_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_selected_mesh_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_selected_component_color.changed_signal().connect(make_async_redraw_slot());\n\t}\n\t\nprotected:\n\t/// Return the unselected mesh color. May be different if the parent mesh is selected\n\tconst k3d::color unselected_mesh_color(bool ParentSelected)\n\t{\n\t\treturn ParentSelected ? m_parent_selected_mesh_color.pipeline_value() : m_unselected_mesh_color.pipeline_value(); \n\t}\n\t\n\t/// Return the selected mesh color\n\tconst k3d::color selected_mesh_color()\n\t{\n\t\treturn m_selected_mesh_color.pipeline_value();\n\t}\n\t\n\t/// Return the selected component color\n\tconst k3d::color selected_component_color()\n\t{\n\t\treturn m_selected_component_color.pipeline_value();\n\t}\n\t\nprivate:\n\t/// Color used when the mesh is not selected\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_unselected_mesh_color;\n\t\n\t/// Color used when the mesh is not selected, but its parent is\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_parent_selected_mesh_color;\n\t\n\t/// Color used for unselected components on selected mesh\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_mesh_color;\n\t\n\t/// Color used for selected components\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_component_color;\n}; // class colored_selection_painter\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n\n#endif // !MODULES_REFERENCE_OPENGL_PAINTERS_COLORED_SELECTION_PAINTER_GL_H\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/cone_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/cone.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cone_painter\n\nclass cone_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tcone_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.8, 0.8, 0.8);\n\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::cone::const_primitive> cone(k3d::cone::validate(Mesh, **primitive));\n\t\t\tif(!cone)\n\t\t\t\tcontinue;\n\n\t\t\tglPolygonOffset(1.0, 1.0);\n\t\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\t\tglEnable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != cone->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, cone->selections[i] ? selected_color : color);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(cone->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, cone->heights[i], cone->radii[i], cone->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::SURFACE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::cone::const_primitive> cone(k3d::cone::validate(Mesh, **primitive));\n\t\t\tif(!cone)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != cone->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::SURFACE, i);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(cone->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, cone->heights[i], cone->radii[i], cone->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\n\t\t\t\tk3d::gl::pop_selection_token(); // SURFACE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tvoid draw_solid(const k3d::gl::render_state& State, const k3d::double_t Height, const k3d::double_t Radius, const k3d::double_t SweepAngle)\n\t{\n\t\tif(!Radius)\n\t\t\treturn;\n\n\t\tk3d::mesh::knots_t knots;\n\t\tk3d::mesh::weights_t weights;\n\t\tk3d::mesh::points_t arc_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, SweepAngle, 4, knots, weights, arc_points);\n\t\tstd::vector<GLfloat> gl_u_knot_vector(knots.begin(), knots.end());\n\t\tstd::vector<GLfloat> gl_v_knot_vector;\n\t\tstd::vector<GLfloat> gl_control_points;\n\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 2, 0);\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 1);\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 2, 2);\n\n\t\tfor(k3d::uint_t i = 0; i <= 2; ++i)\n\t\t{\n\t\t\tconst k3d::double_t radius2 = k3d::mix(Radius, 0.001, static_cast<k3d::double_t>(i) / static_cast<k3d::double_t>(2));\n\t\t\tconst k3d::point3 offset = k3d::mix(0.0, Height, static_cast<k3d::double_t>(i) / static_cast<k3d::double_t>(2)) * k3d::point3(0, 0, 1);\n\n\t\t\tfor(k3d::uint_t j = 0; j != arc_points.size(); ++j)\n\t\t\t{\n\t\t\t\tgl_control_points.push_back(weights[j] * (radius2 * arc_points[j][0] + offset[0]));\n\t\t\t\tgl_control_points.push_back(weights[j] * (radius2 * arc_points[j][1] + offset[1]));\n\t\t\t\tgl_control_points.push_back(weights[j] * (radius2 * arc_points[j][2] + offset[2]));\n\t\t\t\tgl_control_points.push_back(weights[j]);\n\t\t\t}\n\t\t}\n\n\t\tGLUnurbsObj* const nurbs_renderer = gluNewNurbsRenderer();\n\n\t\t// Important!  We load our own matrices for efficiency (saves round-trips to the server) and to prevent problems with selection\n\t\tgluNurbsProperty(nurbs_renderer, GLU_AUTO_LOAD_MATRIX, GL_FALSE);\n\t\tgluNurbsProperty(nurbs_renderer, GLU_CULLING, GL_TRUE);\n\t\tGLfloat gl_modelview_matrix[16];\n\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\tgluLoadSamplingMatrices(nurbs_renderer, gl_modelview_matrix, State.gl_projection_matrix, State.gl_viewport);\n\n\t\tgluBeginSurface(nurbs_renderer);\n\t\tgluNurbsSurface(nurbs_renderer, gl_u_knot_vector.size(), &gl_u_knot_vector[0], gl_v_knot_vector.size(), &gl_v_knot_vector[0], 4, 36, &gl_control_points[0], 3, 2, GL_MAP2_VERTEX_4);\n\t\tgluEndSurface(nurbs_renderer);\n\n\t\tgluDeleteNurbsRenderer(nurbs_renderer);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cone_painter, k3d::interface_list<k3d::gl::imesh_painter> > factory(\n\t\t\tk3d::uuid(0xae8f0e12, 0x33403c10, 0x04e4998d, 0x17a8ec8c),\n\t\t\t\"OpenGLConePainter\",\n\t\t\t_(\"Renders cone primitives using OpenGL\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cone_painter_factory\n\nk3d::iplugin_factory& cone_painter_factory()\n{\n\treturn cone_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/cubic_curve_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/cubic_curve.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cubic_curve_painter\n\nclass cubic_curve_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tcubic_curve_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::cubic_curve::const_primitive> cubic_curve(k3d::cubic_curve::validate(Mesh, **primitive));\n\t\t\tif(!cubic_curve)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0, 0, 0);\n\t\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\t\tconst unsigned int v_count = 8;\n\t\t\tconst GLint v_order = 4;\n\t\t\tconst GLint v_stride = 3;\n\n\t\t\tglEnable(GL_MAP1_VERTEX_3);\n\t\t\tglDisable(GL_AUTO_NORMAL);\n\t\t\tglMapGrid1d(v_count, 0.0, 1.0);\n\t\t\tGLdouble patch_points[4 * 3];\n\n\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\tconst k3d::uint_t curve_end = curve_begin + cubic_curve->curve_first_points.size();\n\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve_point_begin = cubic_curve->curve_first_points[curve];\n\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + cubic_curve->curve_point_counts[curve];\n\n\t\t\t\tk3d::gl::color3d(cubic_curve->curve_selections[curve] ? selected_color : color);\n\n\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point_end - curve_point >= 4; curve_point += 3)\n\t\t\t\t{\n\t\t\t\t\tGLdouble* pp = patch_points;\n\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point]][0];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point]][1];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point]][2];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+1]][0];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+1]][1];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+1]][2];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+2]][0];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+2]][1];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+2]][2];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+3]][0];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+3]][1];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+3]][2];\n\n\t\t\t\t\tglMap1d(GL_MAP1_VERTEX_3, 0, 1, v_stride, v_order, patch_points);\n\n\t\t\t\t\tglEvalMesh1(GL_LINE, 0, v_count);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::CURVE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::cubic_curve::const_primitive> cubic_curve(k3d::cubic_curve::validate(Mesh, **primitive));\n\t\t\tif(!cubic_curve)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tconst unsigned int v_count = 8;\n\t\t\tconst GLint v_order = 4;\n\t\t\tconst GLint v_stride = 3;\n\n\t\t\tglEnable(GL_MAP1_VERTEX_3);\n\t\t\tglDisable(GL_AUTO_NORMAL);\n\t\t\tglMapGrid1d(v_count, 0.0, 1.0);\n\t\t\tGLdouble patch_points[4 * 3];\n\n\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\tconst k3d::uint_t curve_end = curve_begin + cubic_curve->curve_first_points.size();\n\t\t\tk3d::uint_t curve_index = 0;\n\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve, ++curve_index)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::CURVE, curve_index);\n\n\t\t\t\tconst k3d::uint_t curve_point_begin = cubic_curve->curve_first_points[curve];\n\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + cubic_curve->curve_point_counts[curve];\n\n\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point_end - curve_point >= 4; curve_point += 3)\n\t\t\t\t{\n\t\t\t\t\tGLdouble* pp = patch_points;\n\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point]][0];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point]][1];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point]][2];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+1]][0];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+1]][1];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+1]][2];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+2]][0];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+2]][1];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+2]][2];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+3]][0];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+3]][1];\n\t\t\t\t\t*pp++ = points[cubic_curve->curve_points[curve_point+3]][2];\n\n\t\t\t\t\tglMap1d(GL_MAP1_VERTEX_3, 0, 1, v_stride, v_order, patch_points);\n\n\t\t\t\t\tglEvalMesh1(GL_LINE, 0, v_count);\n\t\t\t\t}\n\n\t\t\t\tk3d::gl::pop_selection_token(); // CURVE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cubic_curve_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xcb30d291, 0x47e146a3, 0xb5167d0f, 0x6f56bd61),\n\t\t\t\"OpenGLCubicCurvePainter\",\n\t\t\t_(\"Renders cubic curves\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cubic_curve_painter_factory\n\nk3d::iplugin_factory& cubic_curve_painter_factory()\n{\n\treturn cubic_curve_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/cylinder_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/cylinder.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cylinder_painter\n\nclass cylinder_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tcylinder_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.8, 0.8, 0.8);\n\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::cylinder::const_primitive> cylinder(k3d::cylinder::validate(Mesh, **primitive));\n\t\t\tif(!cylinder)\n\t\t\t\tcontinue;\n\n\t\t\tglPolygonOffset(1.0, 1.0);\n\t\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\t\tglEnable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != cylinder->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, cylinder->selections[i] ? selected_color : color);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(cylinder->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, cylinder->radii[i], cylinder->z_min[i], cylinder->z_max[i], cylinder->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::SURFACE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::cylinder::const_primitive> cylinder(k3d::cylinder::validate(Mesh, **primitive));\n\t\t\tif(!cylinder)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != cylinder->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::SURFACE, i);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(cylinder->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, cylinder->radii[i], cylinder->z_min[i], cylinder->z_max[i], cylinder->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\n\t\t\t\tk3d::gl::pop_selection_token(); // SURFACE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tvoid draw_solid(const k3d::gl::render_state& State, const k3d::double_t Radius, const k3d::double_t ZMin, const k3d::double_t ZMax, const k3d::double_t SweepAngle)\n\t{\n\t\tif(!Radius)\n\t\t\treturn;\n\n\t\tk3d::mesh::knots_t knots;\n\t\tk3d::mesh::weights_t weights;\n\t\tk3d::mesh::points_t arc_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, SweepAngle, 4, knots, weights, arc_points);\n\n\t\tstd::vector<GLfloat> gl_u_knot_vector(knots.begin(), knots.end());\n\t\tstd::vector<GLfloat> gl_v_knot_vector;\n\t\tstd::vector<GLfloat> gl_control_points;\n\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 2, 0);\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 1);\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 2, 2);\n\n\t\tfor(k3d::uint_t i = 0; i <= 2; ++i)\n\t\t{\n\t\t\tconst k3d::point3 offset = k3d::mix(ZMin, ZMax, static_cast<k3d::double_t>(i) / static_cast<k3d::double_t>(2)) * k3d::point3(0, 0, 1);\n\n\t\t\tfor(k3d::uint_t j = 0; j != arc_points.size(); ++j)\n\t\t\t{\n\t\t\t\tgl_control_points.push_back(weights[j] * (Radius * arc_points[j][0] + offset[0]));\n\t\t\t\tgl_control_points.push_back(weights[j] * (Radius * arc_points[j][1] + offset[1]));\n\t\t\t\tgl_control_points.push_back(weights[j] * (Radius * arc_points[j][2] + offset[2]));\n\t\t\t\tgl_control_points.push_back(weights[j]);\n\t\t\t}\n\t\t}\n\n\t\tGLUnurbsObj* const nurbs_renderer = gluNewNurbsRenderer();\n\n\t\t// Important!  We load our own matrices for efficiency (saves round-trips to the server) and to prevent problems with selection\n\t\tgluNurbsProperty(nurbs_renderer, GLU_AUTO_LOAD_MATRIX, GL_FALSE);\n\t\tgluNurbsProperty(nurbs_renderer, GLU_CULLING, GL_TRUE);\n\t\tGLfloat gl_modelview_matrix[16];\n\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\tgluLoadSamplingMatrices(nurbs_renderer, gl_modelview_matrix, State.gl_projection_matrix, State.gl_viewport);\n\n\t\tgluBeginSurface(nurbs_renderer);\n\t\tgluNurbsSurface(nurbs_renderer, gl_u_knot_vector.size(), &gl_u_knot_vector[0], gl_v_knot_vector.size(), &gl_v_knot_vector[0], 4, 36, &gl_control_points[0], 3, 2, GL_MAP2_VERTEX_4);\n\t\tgluEndSurface(nurbs_renderer);\n\n\t\tgluDeleteNurbsRenderer(nurbs_renderer);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cylinder_painter, k3d::interface_list<k3d::gl::imesh_painter> > factory(\n\t\t\tk3d::uuid(0x311d3fbd, 0x6a46e7b0, 0xccf9af8e, 0xf2daf44a),\n\t\t\t\"OpenGLCylinderPainter\",\n\t\t\t_(\"Renders cylinder primitives using OpoenGL\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cylinder_painter_factory\n\nk3d::iplugin_factory& cylinder_painter_factory()\n{\n\treturn cylinder_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/disk_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/disk.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// disk_painter\n\nclass disk_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tdisk_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.8, 0.8, 0.8);\n\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::disk::const_primitive> disk(k3d::disk::validate(Mesh, **primitive));\n\t\t\tif(!disk)\n\t\t\t\tcontinue;\n\n\t\t\tglPolygonOffset(1.0, 1.0);\n\t\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\t\tglEnable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != disk->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, disk->selections[i] ? selected_color : color);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(disk->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, disk->heights[i], disk->radii[i], disk->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::SURFACE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::disk::const_primitive> disk(k3d::disk::validate(Mesh, **primitive));\n\t\t\tif(!disk)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != disk->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::SURFACE, i);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(disk->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, disk->heights[i], disk->radii[i], disk->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\n\t\t\t\tk3d::gl::pop_selection_token(); // SURFACE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tvoid draw_solid(const k3d::gl::render_state& State, const k3d::double_t Height, const k3d::double_t Radius, const k3d::double_t SweepAngle)\n\t{\n\t\tif(!Radius)\n\t\t\treturn;\n\n\t\tk3d::mesh::knots_t knots;\n\t\tk3d::mesh::weights_t weights;\n\t\tk3d::mesh::points_t arc_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, SweepAngle, 4, knots, weights, arc_points);\n\n\t\tstd::vector<GLfloat> gl_u_knot_vector(knots.begin(), knots.end());\n\t\tstd::vector<GLfloat> gl_v_knot_vector;\n\t\tstd::vector<GLfloat> gl_control_points;\n\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 2, 0);\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 1);\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 2, 2);\n\n\t\tconst k3d::point3 offset = Height * k3d::point3(0, 0, 1);\n\n\t\tfor(k3d::uint_t i = 0; i <= 2; ++i)\n\t\t{\n\t\t\tconst k3d::double_t radius2 = k3d::mix(Radius, 0.001 * Radius, static_cast<k3d::double_t>(i) / static_cast<k3d::double_t>(2));\n\t\t\tfor(k3d::uint_t j = 0; j != arc_points.size(); ++j)\n\t\t\t{\n\t\t\t\tgl_control_points.push_back(weights[j] * (radius2 * arc_points[j][0] + offset[0]));\n\t\t\t\tgl_control_points.push_back(weights[j] * (radius2 * arc_points[j][1] + offset[1]));\n\t\t\t\tgl_control_points.push_back(weights[j] * (radius2 * arc_points[j][2] + offset[2]));\n\t\t\t\tgl_control_points.push_back(weights[j]);\n\t\t\t}\n\t\t}\n\n\t\tGLUnurbsObj* const nurbs_renderer = gluNewNurbsRenderer();\n\n\t\t// Important!  We load our own matrices for efficiency (saves round-trips to the server) and to prevent problems with selection\n\t\tgluNurbsProperty(nurbs_renderer, GLU_AUTO_LOAD_MATRIX, GL_FALSE);\n\t\tgluNurbsProperty(nurbs_renderer, GLU_CULLING, GL_TRUE);\n\t\tGLfloat gl_modelview_matrix[16];\n\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\tgluLoadSamplingMatrices(nurbs_renderer, gl_modelview_matrix, State.gl_projection_matrix, State.gl_viewport);\n\n\t\tgluBeginSurface(nurbs_renderer);\n\t\tgluNurbsSurface(nurbs_renderer, gl_u_knot_vector.size(), &gl_u_knot_vector[0], gl_v_knot_vector.size(), &gl_v_knot_vector[0], 4, 36, &gl_control_points[0], 3, 2, GL_MAP2_VERTEX_4);\n\t\tgluEndSurface(nurbs_renderer);\n\n\t\tgluDeleteNurbsRenderer(nurbs_renderer);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<disk_painter, k3d::interface_list<k3d::gl::imesh_painter> > factory(\n\t\t\tk3d::uuid(0xe30f4079, 0x8a4a030f, 0x5ce166b6, 0x77f324b4),\n\t\t\t\"OpenGLDiskPainter\",\n\t\t\t_(\"Renders disk primitives using OpenGL\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// disk_painter_factory\n\nk3d::iplugin_factory& disk_painter_factory()\n{\n\treturn disk_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/edge_numbering_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/share.h>\n\n#include <FTGL/ftgl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// edge_numbering_painter\n\nclass edge_numbering_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tedge_numbering_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(k3d::share_path() / k3d::filesystem::generic_path(\"fonts/VeraBd.ttf\")) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_font_size(init_owner(*this) + init_name(\"font_size\") + init_label(_(\"Font Size\")) + init_description(_(\"Font size.\")) + init_value(14.0)),\n\t\tm_antialias(init_owner(*this) + init_name(\"antialias\") + init_label(_(\"Font Antialiasing\")) + init_description(_(\"Render antialiased text.\")) + init_value(true)),\n\t\tm_draw_selected(init_owner(*this) + init_name(\"draw_selected\") + init_label(_(\"Draw Selected\")) + init_description(_(\"Draw normals for selected polygons.\")) + init_value(true)),\n\t\tm_draw_unselected(init_owner(*this) + init_name(\"draw_unselected\") + init_label(_(\"Draw Unselected\")) + init_description(_(\"Draw normals for unselected polygons.\")) + init_value(false)),\n\t\tm_selected_color(init_owner(*this) + init_name(\"selected_color\") + init_label(_(\"Selected Color\")) + init_description(_(\"Normal color for selected polygons.\")) + init_value(k3d::color(0, 1, 0))),\n\t\tm_unselected_color(init_owner(*this) + init_name(\"unselected_color\") + init_label(_(\"Unselected Color\")) + init_description(_(\"Normal color for unselected polygons.\")) + init_value(k3d::color(0, 0.5, 0))),\n\t\tm_edge_offset(init_owner(*this) + init_name(\"edge_offset\") + init_label(_(\"Edge Offset\")) + init_description(_(\"Offsets numbers away from their edges.\")) + init_value(0.5)),\n\t\tm_face_offset(init_owner(*this) + init_name(\"face_offset\") + init_label(_(\"Face Offset\")) + init_description(_(\"Offsets numbers away from their polygons.\")) + init_value(0.2))\n\t{\n\t\tm_font_path.changed_signal().connect(sigc::mem_fun(*this, &edge_numbering_painter::on_font_changed));\n\t\tm_font_size.changed_signal().connect(sigc::mem_fun(*this, &edge_numbering_painter::on_font_changed));\n\t\tm_antialias.changed_signal().connect(sigc::mem_fun(*this, &edge_numbering_painter::on_font_changed));\n\t\tm_draw_selected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_draw_unselected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_selected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_unselected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_edge_offset.changed_signal().connect(make_async_redraw_slot());\n\t\tm_face_offset.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_font_changed(k3d::ihint*)\n\t{\n\t\tm_font.reset();\n\t\tasync_redraw(0);\n\t}\n\n\tstatic k3d::bool_t selected(const k3d::mesh::selection_t& Selection, const k3d::uint_t Index)\n\t{\n\t\treturn Selection[Index];\n\t}\n\n\tstatic k3d::bool_t unselected(const k3d::mesh::selection_t& Selection, const k3d::uint_t Index)\n\t{\n\t\treturn !Selection[Index];\n\t}\n\n\ttemplate<typename FunctorT>\n\tstatic void draw(const k3d::polyhedron::const_primitive& Polyhedron, const k3d::mesh::points_t& Points, const k3d::mesh::normals_t& FaceNormals, const k3d::color& Color, const k3d::double_t EdgeOffset, const k3d::double_t FaceOffset, FunctorT EdgeTest, FTFont& Font)\n\t{\n\t\tk3d::gl::color3d(Color);\n\n\t\tconst k3d::uint_t face_begin = 0;\n\t\tconst k3d::uint_t face_end = face_begin + Polyhedron.face_first_loops.size();\n\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t{\n\t\t\tconst k3d::uint_t loop_begin = Polyhedron.face_first_loops[face];\n\t\t\tconst k3d::uint_t loop_end = loop_begin + Polyhedron.face_loop_counts[face];\n\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_edge = Polyhedron.loop_first_edges[loop];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tif(EdgeTest(Polyhedron.edge_selections, edge))\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::point3 vertex1 = Points[Polyhedron.vertex_points[edge]];\n\t\t\t\t\t\tconst k3d::point3 vertex2 = Points[Polyhedron.vertex_points[Polyhedron.clockwise_edges[edge]]];\n\t\t\t\t\t\tconst k3d::vector3 edge_vector = vertex2 - vertex1;\n\n\t\t\t\t\t\tconst k3d::point3 position = vertex1 + (0.5 * edge_vector) + (EdgeOffset * k3d::normalize(FaceNormals[face] ^ edge_vector)) + (FaceOffset * k3d::to_vector(k3d::normalize(FaceNormals[face])));\n\n\t\t\t\t\t\tglRasterPos3d(position[0], position[1], position[2]);\n\t\t\t\t\t\tFont.Render(k3d::string_cast(edge).c_str());\n\t\t\t\t\t}\n\n\t\t\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!Mesh.points)\n\t\t\treturn;\n\t\tconst k3d::bool_t draw_selected = m_draw_selected.pipeline_value();\n\t\tconst k3d::bool_t draw_unselected = m_draw_unselected.pipeline_value();\n\t\tif(!draw_selected && !draw_unselected)\n\t\t\treturn;\n\n\t\tif(!m_font)\n\t\t{\n\t\t\tif(m_antialias.pipeline_value())\n\t\t\t\tm_font.reset(new FTPixmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\t\t\telse\n\t\t\t\tm_font.reset(new FTBitmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\n\t\t\tm_font->FaceSize(static_cast<unsigned int>(m_font_size.pipeline_value()));\n\t\t\tm_font->UseDisplayList(true);\n\t\t\tif(m_font->Error())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"error initializing font\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst k3d::double_t edge_offset = m_edge_offset.pipeline_value();\n\t\tconst k3d::double_t face_offset = m_face_offset.pipeline_value();\n\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\n\t\t\tconst k3d::uint_t face_count = polyhedron->face_first_loops.size();\n\t\n\t\t\t// Calculate face normals ...\n\t\t\tk3d::typed_array<k3d::normal3> normals(face_count);\n\t\t\tfor(k3d::uint_t face = 0; face != face_count; ++face)\n\t\t\t\tnormals[face] = k3d::polyhedron::normal(polyhedron->vertex_points, polyhedron->clockwise_edges, points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]);\n\t\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\t\n\t\t\tif(draw_selected)\n\t\t\t\tdraw(*polyhedron, points, normals, m_selected_color.pipeline_value(), edge_offset, face_offset, selected, *m_font);\n\t\n\t\t\tif(draw_unselected)\n\t\t\t\tdraw(*polyhedron, points, normals, m_unselected_color.pipeline_value(), edge_offset, face_offset, unselected, *m_font);\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<edge_numbering_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xd15d2acb, 0xa647d85b, 0x54dfbbb4, 0x69578f6f),\n\t\t\t\"OpenGLEdgeNumberingPainter\",\n\t\t\t_(\"Numbers polyhedron edges\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_font_size;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_antialias;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_selected;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_unselected;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_unselected_color;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_edge_offset;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_face_offset;\n\n\tboost::scoped_ptr<FTFont> m_font;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// edge_numbering_painter_factory\n\nk3d::iplugin_factory& edge_numbering_painter_factory()\n{\n\treturn edge_numbering_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/edge_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"colored_selection_painter_gl.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// edge_painter\n\nclass edge_painter :\n\tpublic colored_selection_painter\n{\n\ttypedef colored_selection_painter base;\npublic:\n\tedge_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\t\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\t\n\t\t\tconst k3d::color color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\t\tconst k3d::color selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\t\t\tconst k3d::uint_t edge_count = polyhedron->clockwise_edges.size();\n\t\t\t\n\t\t\tglBegin(GL_LINES);\n\n\t\t\t// Render selected split-edges before unselected, so the selection is always visible\n\t\t\tk3d::gl::color3d(selected_color);\n\t\t\tfor(k3d::uint_t edge = 0; edge != edge_count; ++edge)\n\t\t\t{\n\t\t\t\tif(!polyhedron->edge_selections[edge])\n\t\t\t\t\tcontinue;\n\t\t\t\tk3d::gl::vertex3d(points[polyhedron->vertex_points[edge]]);\n\t\t\t\tk3d::gl::vertex3d(points[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]]);\n\t\t\t}\n\n\t\t\tk3d::gl::color3d(color);\n\t\t\tfor(k3d::uint_t edge = 0; edge != edge_count; ++edge)\n\t\t\t{\n\t\t\t\tif(polyhedron->edge_selections[edge])\n\t\t\t\t\tcontinue;\n\t\t\t\tk3d::gl::vertex3d(points[polyhedron->vertex_points[edge]]);\n\t\t\t\tk3d::gl::vertex3d(points[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]]);\n\t\t\t}\n\n\t\t\tglEnd();\n\t\t}\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::EDGE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\t\n\t\t\tconst k3d::uint_t edge_count = polyhedron->clockwise_edges.size();\n\t\t\tfor(k3d::uint_t edge = 0; edge != edge_count; ++edge)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::EDGE, edge);\n\n\t\t\t\tglBegin(GL_LINES);\n\t\t\t\tk3d::gl::vertex3d(points[polyhedron->vertex_points[edge]]);\n\t\t\t\tk3d::gl::vertex3d(points[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]]);\n\t\t\t\tglEnd();\n\n\t\t\t\tk3d::gl::pop_selection_token(); // EDGE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<edge_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xb1260f93, 0xe16e4ab2, 0xbd6a7cbd, 0x85ddca8b),\n\t\t\t\"OpenGLEdgePainter\",\n\t\t\t_(\"Renders mesh edges (OpenGL 1.1)\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// edge_painter_factory\n\nk3d::iplugin_factory& edge_painter_factory()\n{\n\treturn edge_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/face_normal_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// face_normal_painter\n\nclass face_normal_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tface_normal_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_draw_selected(init_owner(*this) + init_name(\"draw_selected\") + init_label(_(\"Draw Selected\")) + init_description(_(\"Draw normals for selected polygons\")) + init_value(true)),\n\t\tm_draw_unselected(init_owner(*this) + init_name(\"draw_unselected\") + init_label(_(\"Draw Unselected\")) + init_description(_(\"Draw normals for unselected polygons\")) + init_value(false)),\n\t\tm_selected_color(init_owner(*this) + init_name(\"selected_color\") + init_label(_(\"Selected Color\")) + init_description(_(\"Normal color for selected polygons\")) + init_value(k3d::color(0, 1, 1))),\n\t\tm_unselected_color(init_owner(*this) + init_name(\"unselected_color\") + init_label(_(\"Unselected Color\")) + init_description(_(\"Normal color for unselected polygons\")) + init_value(k3d::color(0, 0.6, 0.6)))\n\t{\n\t\tm_draw_selected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_draw_unselected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_selected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_unselected_color.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!Mesh.points)\n\t\t\treturn;\n\n\t\tconst k3d::bool_t draw_selected = m_draw_selected.pipeline_value() && RenderState.show_component_selection;\n\t\tconst k3d::bool_t draw_unselected = m_draw_unselected.pipeline_value();\n\n\t\tif(!draw_selected && !draw_unselected)\n\t\t\treturn;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglDisable(GL_LIGHTING);\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\n\t\t\tconst k3d::uint_t face_begin = 0;\t\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\t\n\t\t\tif(draw_selected)\n\t\t\t{\n\t\t\t\tk3d::gl::color3d(m_selected_color.pipeline_value());\n\t\n\t\t\t\tglBegin(GL_LINES);\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tif(!polyhedron->face_selections[face])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tk3d::point3 center = k3d::polyhedron::center(polyhedron->vertex_points, polyhedron->clockwise_edges, *Mesh.points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]);\n\t\t\t\t\tk3d::normal3 normal = k3d::polyhedron::normal(polyhedron->vertex_points, polyhedron->clockwise_edges, *Mesh.points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]);\n\n\t\t\t\t\tk3d::gl::vertex3d(center);\n\t\t\t\t\tk3d::gl::vertex3d(center + normal);\n\t\t\t\t}\n\t\t\t\tglEnd();\n\t\t\t}\n\t\n\t\t\tif(draw_unselected)\n\t\t\t{\n\t\t\t\tk3d::gl::color3d(m_unselected_color.pipeline_value());\n\t\n\t\t\t\tglBegin(GL_LINES);\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tif(polyhedron->face_selections[face])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tk3d::point3 center = k3d::polyhedron::center(polyhedron->vertex_points, polyhedron->clockwise_edges, *Mesh.points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]);\n\t\t\t\t\tk3d::normal3 normal = k3d::polyhedron::normal(polyhedron->vertex_points, polyhedron->clockwise_edges, *Mesh.points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]);\n\n\t\t\t\t\tk3d::gl::vertex3d(center);\n\t\t\t\t\tk3d::gl::vertex3d(center + normal);\n\t\t\t\t}\n\t\t\t\tglEnd();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<face_normal_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x02d092ca, 0x84405ff6, 0x4fe806a9, 0xab886cb1),\n\t\t\t\"OpenGLFaceNormalPainter\",\n\t\t\t_(\"Renders polyhedron face normal vectors\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\t\n\t\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_selected;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_unselected;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_unselected_color;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// face_normal_painter_factory\n\nk3d::iplugin_factory& face_normal_painter_factory()\n{\n\treturn face_normal_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/face_numbering_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/share.h>\n\n#include <FTGL/ftgl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// face_numbering_painter\n\nclass face_numbering_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tface_numbering_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(k3d::share_path() / k3d::filesystem::generic_path(\"fonts/VeraBd.ttf\")) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_font_size(init_owner(*this) + init_name(\"font_size\") + init_label(_(\"Font Size\")) + init_description(_(\"Font size.\")) + init_value(14.0)),\n\t\tm_antialias(init_owner(*this) + init_name(\"antialias\") + init_label(_(\"Font Antialiasing\")) + init_description(_(\"Render antialiased text.\")) + init_value(true)),\n\t\tm_draw_selected(init_owner(*this) + init_name(\"draw_selected\") + init_label(_(\"Draw Selected\")) + init_description(_(\"Draw normals for selected polygons\")) + init_value(true)),\n\t\tm_draw_unselected(init_owner(*this) + init_name(\"draw_unselected\") + init_label(_(\"Draw Unselected\")) + init_description(_(\"Draw normals for unselected polygons\")) + init_value(false)),\n\t\tm_selected_color(init_owner(*this) + init_name(\"selected_color\") + init_label(_(\"Selected Color\")) + init_description(_(\"Normal color for selected polygons\")) + init_value(k3d::color(0, 0, 1))),\n\t\tm_unselected_color(init_owner(*this) + init_name(\"unselected_color\") + init_label(_(\"Unselected Color\")) + init_description(_(\"Normal color for unselected polygons\")) + init_value(k3d::color(0, 0, 0.5))),\n\t\tm_offset(init_owner(*this) + init_name(\"offset\") + init_label(_(\"Offset\")) + init_description(_(\"Offsets numbers away from their polygons\")) + init_value(0.2))\n\t{\n\t\tm_font_path.changed_signal().connect(sigc::mem_fun(*this, &face_numbering_painter::on_font_changed));\n\t\tm_font_size.changed_signal().connect(sigc::mem_fun(*this, &face_numbering_painter::on_font_changed));\n\t\tm_antialias.changed_signal().connect(sigc::mem_fun(*this, &face_numbering_painter::on_font_changed));\n\t\tm_draw_selected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_draw_unselected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_selected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_unselected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_offset.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_font_changed(k3d::ihint*)\n\t{\n\t\tm_font.reset();\n\t\tasync_redraw(0);\n\t}\n\n\tstatic k3d::bool_t selected(const k3d::mesh::selection_t& Selection, const k3d::uint_t Index)\n\t{\n\t\treturn Selection[Index];\n\t}\n\n\tstatic k3d::bool_t unselected(const k3d::mesh::selection_t& Selection, const k3d::uint_t Index)\n\t{\n\t\treturn !Selection[Index];\n\t}\n\n\ttemplate<typename FunctorT>\n\tstatic void draw(const k3d::polyhedron::const_primitive& Polyhedron, const k3d::typed_array<k3d::point3>& Centers, const k3d::typed_array<k3d::normal3>& Normals, const k3d::color& Color, const double Offset, FunctorT FaceTest, FTFont& Font)\n\t{\n\t\tk3d::gl::color3d(Color);\n\n\t\tconst k3d::uint_t face_begin = 0;\n\t\tconst k3d::uint_t face_end = face_begin + Centers.size();\n\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t{\n\t\t\tif(FaceTest(Polyhedron.face_selections, face))\n\t\t\t{\n\t\t\t\tconst k3d::point3 position = Centers[face] + (Offset * k3d::to_vector(k3d::normalize(Normals[face])));\n\t\t\t\tglRasterPos3d(position[0], position[1], position[2]);\n\t\t\t\tFont.Render(k3d::string_cast(face).c_str());\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::bool_t draw_selected = m_draw_selected.pipeline_value();\n\t\tconst k3d::bool_t draw_unselected = m_draw_unselected.pipeline_value();\n\t\tif(!draw_selected && !draw_unselected)\n\t\t\treturn;\n\n\t\tif(!m_font)\n\t\t{\n\t\t\tif(m_antialias.pipeline_value())\n\t\t\t\tm_font.reset(new FTPixmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\t\t\telse\n\t\t\t\tm_font.reset(new FTBitmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\n\t\t\tm_font->FaceSize(static_cast<unsigned int>(m_font_size.pipeline_value()));\n\t\t\tm_font->UseDisplayList(true);\n\t\t\tif(m_font->Error())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"error initializing font\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst k3d::double_t offset = m_offset.pipeline_value();\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\tconst k3d::uint_t face_count = polyhedron->face_first_loops.size();\n\t\n\t\t\t// Calculate face centers and normals ...\n\t\t\tk3d::typed_array<k3d::point3> centers(face_count);\n\t\t\tk3d::typed_array<k3d::normal3> normals(face_count);\n\t\t\tfor(k3d::uint_t face = 0; face != face_count; ++face)\n\t\t\t{\n\t\t\t\tcenters[face] = k3d::polyhedron::center(polyhedron->vertex_points, polyhedron->clockwise_edges, points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]);\n\t\t\t\tnormals[face] = k3d::polyhedron::normal(polyhedron->vertex_points, polyhedron->clockwise_edges, points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]);\n\t\t\t}\n\t\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\t\n\t\t\tif(draw_selected)\n\t\t\t\tdraw(*polyhedron, centers, normals, m_selected_color.pipeline_value(), offset, selected, *m_font);\n\t\n\t\t\tif(draw_unselected)\n\t\t\t\tdraw(*polyhedron, centers, normals, m_unselected_color.pipeline_value(), offset, unselected, *m_font);\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<face_numbering_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xb04f5b7b, 0x4849cb29, 0xdc339ea9, 0xfb22e728),\n\t\t\t\"OpenGLFaceNumberingPainter\",\n\t\t\t_(\"Numbers polyhedron faces\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_font_size;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_antialias;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_selected;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_unselected;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_unselected_color;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_offset;\n\n\tboost::scoped_ptr<FTFont> m_font;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// face_numbering_painter_factory\n\nk3d::iplugin_factory& face_numbering_painter_factory()\n{\n\treturn face_numbering_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/face_orientation_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// face_orientation_painter\n\nclass face_orientation_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tface_orientation_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_draw_selected(init_owner(*this) + init_name(\"draw_selected\") + init_label(_(\"Draw Selected\")) + init_description(_(\"Draw normals for selected polygons\")) + init_value(true)),\n\t\tm_draw_unselected(init_owner(*this) + init_name(\"draw_unselected\") + init_label(_(\"Draw Unselected\")) + init_description(_(\"Draw normals for unselected polygons\")) + init_value(false)),\n\t\tm_selected_color(init_owner(*this) + init_name(\"selected_color\") + init_label(_(\"Selected Color\")) + init_description(_(\"Normal color for selected polygons\")) + init_value(k3d::color(0, 1, 1))),\n\t\tm_unselected_color(init_owner(*this) + init_name(\"unselected_color\") + init_label(_(\"Unselected Color\")) + init_description(_(\"Normal color for unselected polygons\")) + init_value(k3d::color(0, 0.6, 0.6)))\n\t{\n\t\tm_draw_selected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_draw_unselected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_selected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_unselected_color.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tstatic k3d::bool_t selected(const k3d::mesh::selection_t& Selection, const k3d::uint_t Index)\n\t{\n\t\treturn Selection[Index];\n\t}\n\n\tstatic k3d::bool_t unselected(const k3d::mesh::selection_t& Selection, const k3d::uint_t Index)\n\t{\n\t\treturn !Selection[Index];\n\t}\n\n\ttemplate<typename FunctorT>\n\tstatic void draw(const k3d::polyhedron::const_primitive& Polyhedron, const k3d::mesh::points_t& Points, const k3d::typed_array<k3d::point3>& Centers, const k3d::color& Color, FunctorT FaceTest)\n\t{\n\t\tconst k3d::uint_t face_count = Polyhedron.face_first_loops.size();\n\n\t\tk3d::gl::color3d(Color);\n\n\t\tglBegin(GL_LINES);\n\t\tfor(k3d::uint_t face = 0; face != face_count; ++face)\n\t\t{\n\t\t\tif(FaceTest(Polyhedron.face_selections, face))\n\t\t\t{\n\t\t\t\tconst k3d::point3 first_point = Points[Polyhedron.vertex_points[Polyhedron.loop_first_edges[Polyhedron.face_first_loops[face]]]];\n\t\t\t\tconst k3d::point3 second_point = Points[Polyhedron.vertex_points[Polyhedron.clockwise_edges[Polyhedron.loop_first_edges[Polyhedron.face_first_loops[face]]]]];\n\t\t\t\tconst k3d::point3 center_point = Centers[face];\n\n\t\t\t\tconst k3d::point3 glyph_point1 = ((first_point - center_point) * 0.9) + center_point;\n\t\t\t\tconst k3d::point3 glyph_point2 = ((second_point - center_point) * 0.9) + center_point;\n\t\t\t\tconst k3d::point3 glyph_point3 = ((second_point - center_point) * 0.8) + center_point;\n\n\t\t\t\tk3d::gl::vertex3d(glyph_point1);\n\t\t\t\tk3d::gl::vertex3d(glyph_point2);\n\t\t\t\tk3d::gl::vertex3d(glyph_point2);\n\t\t\t\tk3d::gl::vertex3d(glyph_point3);\n\t\t\t}\n\t\t}\n\t\tglEnd();\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::bool_t draw_selected = m_draw_selected.pipeline_value() && RenderState.show_component_selection;\n\t\tconst k3d::bool_t draw_unselected = m_draw_unselected.pipeline_value();\n\t\tif(!draw_selected && !draw_unselected)\n\t\t\treturn;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\t\tconst k3d::uint_t face_count = polyhedron->face_first_loops.size();\n\t\n\t\t\t// Calculate face centers ...\n\t\t\tk3d::typed_array<k3d::point3> centers(face_count);\n\t\t\tfor(k3d::uint_t face = 0; face != face_count; ++face)\n\t\t\t\tcenters[face] = k3d::polyhedron::center(polyhedron->vertex_points, polyhedron->clockwise_edges, points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]);\n\t\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\t\n\t\t\tif(draw_selected)\n\t\t\t\tdraw(*polyhedron, points, centers, m_selected_color.pipeline_value(), selected);\n\t\n\t\t\tif(draw_unselected)\n\t\t\t\tdraw(*polyhedron, points, centers, m_unselected_color.pipeline_value(), unselected);\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<face_orientation_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x7bc1ee5f, 0x45802906, 0x323984bf, 0xcbe858d6),\n\t\t\t\"OpenGLFaceOrientationPainter\",\n\t\t\t_(\"Draws arrows to show polyhedron face orientation\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_selected;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_unselected;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_unselected_color;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// face_orientation_painter_factory\n\nk3d::iplugin_factory& face_orientation_painter_factory()\n{\n\treturn face_orientation_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/face_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Painter that triangulates its input first\n * \t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n#include \"colored_selection_painter_gl.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/triangulator.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// face_painter\n\nclass face_painter :\n\tpublic colored_selection_painter\n{\n\ttypedef colored_selection_painter base;\n\npublic:\n\tface_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::color(0.2, 0.2, 0.2), k3d::color(0.6, 0.6, 0.6))\n\t{\n\t}\n\n\tclass paint_triangles :\n\t\tpublic k3d::triangulator\n\t{\n\tpublic:\n\t\tpaint_triangles(const k3d::mesh::points_t& Points, const k3d::mesh::selection_t& FaceSelections, const k3d::color& Color, const k3d::color& SelectedColor) :\n\t\t\tpoints(Points),\n\t\t\tface_selections(FaceSelections),\n\t\t\tcolor(Color),\n\t\t\tselected_color(SelectedColor)\n\t\t{\n\t\t}\n\n\t\tvoid start_processing(const k3d::mesh& SourceMesh)\n\t\t{\n\t\t\tglBegin(GL_TRIANGLES);\n\t\t}\n\n\t\tvoid start_face(const k3d::uint_t Face)\n\t\t{\n\t\t\tconst k3d::color& face_color = face_selections[Face] ? selected_color : color;\n\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, face_color);\n\t\t}\n\n\t\tvoid add_vertex(const k3d::point3& Coordinates, k3d::uint_t Vertices[4], k3d::uint_t Edges[4], k3d::double_t Weights[4], k3d::uint_t& NewVertex)\n\t\t{\n\t\t\tNewVertex = points.size();\n\t\t\tpoints.push_back(Coordinates);\n\t\t}\n\n\t\tvoid add_triangle(k3d::uint_t Vertices[3], k3d::uint_t Edges[3])\n\t\t{\n\t\t\tk3d::gl::normal3d(k3d::polyhedron::normal(points[Vertices[0]], points[Vertices[1]], points[Vertices[2]]));\n\t\t\tk3d::gl::vertex3d(points[Vertices[0]]);\n\t\t\tk3d::gl::vertex3d(points[Vertices[1]]);\n\t\t\tk3d::gl::vertex3d(points[Vertices[2]]);\n\t\t}\n\n\t\tvoid finish_processing(const k3d::mesh& SourceMesh)\n\t\t{\n\t\t\tglEnd();\n\t\t}\n\n\tprivate:\n\t\tstd::vector<k3d::point3> points;\n\t\tconst k3d::mesh::selection_t& face_selections;\n\t\tconst k3d::color color;\n\t\tconst k3d::color selected_color;\n\t};\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tif(k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\t\t\n\t\t\tk3d::gl::store_attributes attributes;\n\t\n\t\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\t\tk3d::gl::set(GL_CULL_FACE, RenderState.draw_two_sided);\n\t\n\t\t\tglEnable(GL_LIGHTING);\n\t\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\t\tglPolygonOffset(1.0, 1.0);\n\t\t\t\n\t\t\tconst k3d::color color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\t\tconst k3d::color selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\n\t\t\tpaint_triangles painter(*Mesh.points, polyhedron->face_selections, color, selected_color);\n\t\t\tpainter.process(Mesh, *polyhedron);\n\t\t}\n\t}\n\t\n\tclass select_triangles :\n\t\tpublic k3d::triangulator\n\t{\n\tpublic:\n\t\tselect_triangles(const k3d::mesh::points_t& Points) :\n\t\t\tpoints(Points)\n\t\t{\n\t\t}\n\n\t\tvoid start_face(const k3d::uint_t Face)\n\t\t{\n\t\t\tk3d::gl::push_selection_token(k3d::selection::FACE, Face);\n\t\t\tglBegin(GL_TRIANGLES);\n\t\t}\n\n\t\tvoid add_vertex(const k3d::point3& Coordinates, k3d::uint_t Vertices[4], k3d::uint_t Edges[4], k3d::double_t Weights[4], k3d::uint_t& NewVertex)\n\t\t{\n\t\t\tNewVertex = points.size();\n\t\t\tpoints.push_back(Coordinates);\n\t\t}\n\n\t\tvoid add_triangle(k3d::uint_t Vertices[3], k3d::uint_t Edges[3])\n\t\t{\n\t\t\tk3d::gl::vertex3d(points[Vertices[0]]);\n\t\t\tk3d::gl::vertex3d(points[Vertices[1]]);\n\t\t\tk3d::gl::vertex3d(points[Vertices[2]]);\n\t\t}\n\n\t\tvoid finish_face(const k3d::uint_t Face)\n\t\t{\n\t\t\tglEnd(); // GL_TRIANGLES\n\t\t\tk3d::gl::pop_selection_token(); // FACE\n\t\t}\n\n\tprivate:\n\t\tstd::vector<k3d::point3> points;\n\t};\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::FACE))\n\t\t\treturn;\n\t\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tif(k3d::polyhedron::is_sds(*polyhedron))\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\n\t\t\tglFrontFace(RenderState.inside_out ? GL_CCW : GL_CW);\n\t\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\t\tk3d::gl::set(GL_CULL_FACE, !SelectionState.select_backfacing);\n\t\n\t\t\tglDisable(GL_LIGHTING);\n\t\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\t\tglPolygonOffset(1.0, 1.0);\n\t\t\t\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tselect_triangles painter(*Mesh.points);\n\t\t\tpainter.process(Mesh, *polyhedron);\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<face_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xd4abf63c, 0x2242c17e, 0x2afcb18d, 0x0a8ebdd5),\n\t\t\t\"OpenGLFacePainter\",\n\t\t\t_(\"Renders mesh faces, after trianglulating them (OpenGL 1.1)\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// face_painter_factory\n\nk3d::iplugin_factory& face_painter_factory()\n{\n\treturn face_painter::get_factory();\n}\n\n} // namespace opengl\n\n} // namespace painters\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/half_edge_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file Paints oriented half-edges. Based on half_edge_painter\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// half_edge_painter\n\nclass half_edge_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\thalf_edge_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_draw_selected(init_owner(*this) + init_name(\"draw_selected\") + init_label(_(\"Draw Selected\")) + init_description(_(\"Draw normals for selected polygons\")) + init_value(true)),\n\t\tm_draw_unselected(init_owner(*this) + init_name(\"draw_unselected\") + init_label(_(\"Draw Unselected\")) + init_description(_(\"Draw normals for unselected polygons\")) + init_value(false)),\n\t\tm_selected_color(init_owner(*this) + init_name(\"selected_color\") + init_label(_(\"Selected Color\")) + init_description(_(\"Normal color for selected polygons\")) + init_value(k3d::color(0, 1, 1))),\n\t\tm_unselected_color(init_owner(*this) + init_name(\"unselected_color\") + init_label(_(\"Unselected Color\")) + init_description(_(\"Normal color for unselected polygons\")) + init_value(k3d::color(0, 0.6, 0.6))),\n\t\tm_offset(init_owner(*this) + init_name(\"offset\") + init_label(_(\"Offset\")) + init_description(_(\"Offset from edge\")) + init_value(0.1) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_arrow_size(init_owner(*this) + init_name(\"arrow_size\") + init_label(_(\"Arrow size\")) + init_description(_(\"Size for the arrow\")) + init_value(0.1) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_draw_selected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_draw_unselected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_selected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_unselected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_offset.changed_signal().connect(make_async_redraw_slot());\n\t\tm_arrow_size.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tstatic k3d::bool_t selected(const k3d::mesh::selection_t& Selection, const k3d::uint_t Index)\n\t{\n\t\treturn Selection[Index];\n\t}\n\n\tstatic k3d::bool_t unselected(const k3d::mesh::selection_t& Selection, const k3d::uint_t Index)\n\t{\n\t\treturn !Selection[Index];\n\t}\n\n\ttemplate<typename FunctorT>\n\tvoid draw(const k3d::polyhedron::const_primitive& Polyhedron, const k3d::mesh::points_t& Points, const k3d::color& Color, FunctorT EdgeTest)\n\t{\n\t\tconst size_t edge_count = Polyhedron.clockwise_edges.size();\n\n\t\tk3d::gl::color3d(Color);\n\n\t\tglBegin(GL_LINES);\n\t\tfor(size_t edge = 0; edge != edge_count; ++edge)\n\t\t{\n\t\t\tif(EdgeTest(Polyhedron.edge_selections, edge))\n\t\t\t{\n\t\t\t\tconst k3d::point3 first_point = Points[Polyhedron.vertex_points[edge]];\n\t\t\t\tconst k3d::point3 second_point = Points[Polyhedron.vertex_points[Polyhedron.clockwise_edges[edge]]];\n\t\t\t\tk3d::vector3 edge_vector = k3d::normalize(second_point - first_point);\n\t\t\t\tk3d::normal3 normal_vector = k3d::normalize(k3d::polyhedron::normal(Polyhedron.vertex_points, Polyhedron.clockwise_edges, Points, edge));\n\t\t\t\tk3d::vector3 offset_vector = normal_vector ^ edge_vector;\n\n\t\t\t\tconst k3d::point3 glyph_point1 = first_point + (offset_vector + edge_vector) * m_offset.pipeline_value();\n\t\t\t\tconst k3d::point3 glyph_point2 = second_point + (offset_vector - edge_vector) * m_offset.pipeline_value();\n\t\t\t\tconst k3d::point3 glyph_point3 = glyph_point2 + (offset_vector - edge_vector) * m_arrow_size.pipeline_value();\n\n\t\t\t\tk3d::gl::vertex3d(glyph_point1);\n\t\t\t\tk3d::gl::vertex3d(glyph_point2);\n\t\t\t\tk3d::gl::vertex3d(glyph_point2);\n\t\t\t\tk3d::gl::vertex3d(glyph_point3);\n\t\t\t}\n\t\t}\n\t\tglEnd();\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::bool_t draw_selected = m_draw_selected.pipeline_value() && RenderState.show_component_selection;\n\t\tconst k3d::bool_t draw_unselected = m_draw_unselected.pipeline_value();\n\t\tif(!draw_selected && !draw_unselected)\n\t\t\treturn;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglDisable(GL_LIGHTING);\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\n\t\t\tif(draw_selected)\n\t\t\t\tdraw(*polyhedron, *Mesh.points, m_selected_color.pipeline_value(), selected);\n\t\t\tif(draw_unselected)\n\t\t\t\tdraw(*polyhedron, *Mesh.points, m_unselected_color.pipeline_value(), unselected);\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<half_edge_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xf6484bfb, 0xaa46c77c, 0x1ec5f895, 0xee3f6905),\n\t\t\t\"OpenGLHalfEdgePainter\",\n\t\t\t_(\"Draws arrows to show polyhedron half edge orientation\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_selected;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_unselected;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_unselected_color;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_offset;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_arrow_size;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// half_edge_painter_factory\n\nk3d::iplugin_factory& half_edge_painter_factory()\n{\n\treturn half_edge_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/hyperboloid_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hyperboloid.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// hyperboloid_painter\n\nclass hyperboloid_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\thyperboloid_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.8, 0.8, 0.8);\n\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::hyperboloid::const_primitive> hyperboloid(k3d::hyperboloid::validate(Mesh, **primitive));\n\t\t\tif(!hyperboloid)\n\t\t\t\tcontinue;\n\n\t\t\tglPolygonOffset(1.0, 1.0);\n\t\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\t\tglEnable(GL_LIGHTING);\n\n\t\t\tglColor3d(0.8, 0.8, 0.8);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != hyperboloid->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, hyperboloid->selections[i] ? selected_color : color);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(hyperboloid->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, hyperboloid->start_points[i], hyperboloid->end_points[i], hyperboloid->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::SURFACE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::hyperboloid::const_primitive> hyperboloid(k3d::hyperboloid::validate(Mesh, **primitive));\n\t\t\tif(!hyperboloid)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != hyperboloid->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::SURFACE, i);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(hyperboloid->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, hyperboloid->start_points[i], hyperboloid->end_points[i], hyperboloid->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\n\t\t\t\tk3d::gl::pop_selection_token(); // SURFACE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tvoid draw_solid(const k3d::gl::render_state& State, const k3d::point3& StartPoint, const k3d::point3& EndPoint, const k3d::double_t SweepAngle)\n\t{\n\t\tconst k3d::double_t x1 = StartPoint[0];\n\t\tconst k3d::double_t y1 = StartPoint[1];\n\t\tconst k3d::double_t z1 = StartPoint[2];\n\n\t\tconst k3d::double_t x2 = EndPoint[0];\n\t\tconst k3d::double_t y2 = EndPoint[1];\n\t\tconst k3d::double_t z2 = EndPoint[2];\n\n\t\tconst k3d::double_t thetamin1 = atan2(y1, x1);\n\t\tconst k3d::double_t thetamin2 = atan2(y2, x2);\n\n\t\tconst k3d::double_t radius1 = sqrt(x1 * x1 + y1 * y1);\n\t\tconst k3d::double_t radius2 = sqrt(x2 * x2 + y2 * y2);\n\n\t\tconst k3d::point3 offset1 = z1 * k3d::point3(0, 0, 1);\n\t\tconst k3d::point3 offset2 = z2 * k3d::point3(0, 0, 1);\n\n\t\tk3d::mesh::knots_t knots1;\n\t\tk3d::mesh::weights_t weights1;\n\t\tk3d::mesh::points_t arc_points1;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), thetamin1, thetamin1 + SweepAngle, 4, knots1, weights1, arc_points1);\n\n\t\tk3d::mesh::knots_t knots2;\n\t\tk3d::mesh::weights_t weights2;\n\t\tk3d::mesh::points_t arc_points2;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), thetamin2, thetamin2 + SweepAngle, 4, knots2, weights2, arc_points2);\n\n\t\tstd::vector<GLfloat> gl_u_knot_vector(knots2.begin(), knots2.end());\n\t\tstd::vector<GLfloat> gl_v_knot_vector;\n\t\tstd::vector<GLfloat> gl_control_points;\n\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 2, 0);\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 2, 1);\n\n\t\tfor(k3d::uint_t j = 0; j != arc_points1.size(); ++j)\n\t\t{\n\t\t\tgl_control_points.push_back(weights1[j] * (radius1 * arc_points1[j][0] + offset1[0]));\n\t\t\tgl_control_points.push_back(weights1[j] * (radius1 * arc_points1[j][1] + offset1[1]));\n\t\t\tgl_control_points.push_back(weights1[j] * (radius1 * arc_points1[j][2] + offset1[2]));\n\t\t\tgl_control_points.push_back(weights1[j]);\n\t\t}\n\n\t\tfor(k3d::uint_t j = 0; j != arc_points2.size(); ++j)\n\t\t{\n\t\t\tgl_control_points.push_back(weights2[j] * (radius2 * arc_points2[j][0] + offset2[0]));\n\t\t\tgl_control_points.push_back(weights2[j] * (radius2 * arc_points2[j][1] + offset2[1]));\n\t\t\tgl_control_points.push_back(weights2[j] * (radius2 * arc_points2[j][2] + offset2[2]));\n\t\t\tgl_control_points.push_back(weights2[j]);\n\t\t}\n\n\t\tGLUnurbsObj* const nurbs_renderer = gluNewNurbsRenderer();\n\n\t\t// Important!  We load our own matrices for efficiency (saves round-trips to the server) and to prevent problems with selection\n\t\tgluNurbsProperty(nurbs_renderer, GLU_AUTO_LOAD_MATRIX, GL_FALSE);\n\t\tgluNurbsProperty(nurbs_renderer, GLU_CULLING, GL_TRUE);\n\t\tGLfloat gl_modelview_matrix[16];\n\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\tgluLoadSamplingMatrices(nurbs_renderer, gl_modelview_matrix, State.gl_projection_matrix, State.gl_viewport);\n\n\t\tgluBeginSurface(nurbs_renderer);\n\t\tgluNurbsSurface(nurbs_renderer, gl_u_knot_vector.size(), &gl_u_knot_vector[0], gl_v_knot_vector.size(), &gl_v_knot_vector[0], 4, 36, &gl_control_points[0], 3, 2, GL_MAP2_VERTEX_4);\n\t\tgluEndSurface(nurbs_renderer);\n\n\t\tgluDeleteNurbsRenderer(nurbs_renderer);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<hyperboloid_painter, k3d::interface_list<k3d::gl::imesh_painter> > factory(\n\t\t\tk3d::uuid(0x8fc78171, 0x3e49ff1a, 0xa4b6e69d, 0xaa8fafa3),\n\t\t\t\"OpenGLHyperboloidPainter\",\n\t\t\t_(\"Renders hyperboloid primitives using OpenGL\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// hyperboloid_painter_factory\n\nk3d::iplugin_factory& hyperboloid_painter_factory()\n{\n\treturn hyperboloid_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/linear_curve_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// linear_curve_painter\n\nclass linear_curve_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tlinear_curve_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::linear_curve::const_primitive> linear_curve(k3d::linear_curve::validate(Mesh, **primitive));\n\t\t\tif(!linear_curve)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0, 0, 0);\n\t\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\t\tconst GLenum curve_wrap = linear_curve->periodic[0] ? GL_LINE_LOOP : GL_LINE_STRIP;\n\n\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\tconst k3d::uint_t curve_end = curve_begin + linear_curve->curve_first_points.size();\n\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve_point_begin = linear_curve->curve_first_points[curve];\n\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + linear_curve->curve_point_counts[curve];\n\n\t\t\t\tk3d::gl::color3d(linear_curve->curve_selections[curve] ? selected_color : color);\n\n\t\t\t\tglBegin(curve_wrap);\n\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point != curve_point_end; ++curve_point)\n\t\t\t\t\tk3d::gl::vertex3d(points[linear_curve->curve_points[curve_point]]);\n\t\t\t\tglEnd();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::CURVE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::linear_curve::const_primitive> linear_curve(k3d::linear_curve::validate(Mesh, **primitive));\n\t\t\tif(!linear_curve)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tconst GLenum curve_wrap = linear_curve->periodic[0] ? GL_LINE_LOOP : GL_LINE_STRIP;\n\n\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\tconst k3d::uint_t curve_end = curve_begin + linear_curve->curve_first_points.size();\n\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::CURVE, curve);\n\n\t\t\t\tconst k3d::uint_t curve_point_begin = linear_curve->curve_first_points[curve];\n\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + linear_curve->curve_point_counts[curve];\n\n\t\t\t\tglBegin(curve_wrap);\n\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point != curve_point_end; ++curve_point)\n\t\t\t\t\tk3d::gl::vertex3d(points[linear_curve->curve_points[curve_point]]);\n\t\t\t\tglEnd();\n\n\t\t\t\tk3d::gl::pop_selection_token(); // CURVE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<linear_curve_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x6acd1d8e, 0x954f4b3a, 0xbce4c296, 0x523ebacd),\n\t\t\t\"OpenGLLinearCurvePainter\",\n\t\t\t_(\"Renders linear curves\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// linear_curve_painter_factory\n\nk3d::iplugin_factory& linear_curve_painter_factory()\n{\n\treturn linear_curve_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nextern k3d::iplugin_factory& bezier_triangle_patch_painter_factory();\nextern k3d::iplugin_factory& bicubic_patch_painter_factory();\nextern k3d::iplugin_factory& bilinear_patch_painter_factory();\nextern k3d::iplugin_factory& blobby_point_painter_factory();\nextern k3d::iplugin_factory& color_face_painter_factory();\nextern k3d::iplugin_factory& cone_painter_factory();\nextern k3d::iplugin_factory& cubic_curve_painter_factory();\nextern k3d::iplugin_factory& cylinder_painter_factory();\nextern k3d::iplugin_factory& disk_painter_factory();\nextern k3d::iplugin_factory& edge_numbering_painter_factory();\nextern k3d::iplugin_factory& edge_painter_factory();\nextern k3d::iplugin_factory& face_normal_painter_factory();\nextern k3d::iplugin_factory& face_numbering_painter_factory();\nextern k3d::iplugin_factory& face_orientation_painter_factory();\nextern k3d::iplugin_factory& face_painter_factory();\nextern k3d::iplugin_factory& half_edge_painter_factory();\nextern k3d::iplugin_factory& hyperboloid_painter_factory();\nextern k3d::iplugin_factory& linear_curve_painter_factory();\nextern k3d::iplugin_factory& multi_painter_factory();\nextern k3d::iplugin_factory& normal_array_painter_factory();\nextern k3d::iplugin_factory& nurbs_curve_numbering_painter_factory();\nextern k3d::iplugin_factory& nurbs_curve_painter_factory();\nextern k3d::iplugin_factory& nurbs_patch_numbering_painter_factory();\nextern k3d::iplugin_factory& nurbs_patch_painter_factory();\nextern k3d::iplugin_factory& paraboloid_painter_factory();\nextern k3d::iplugin_factory& point_numbering_painter_factory();\nextern k3d::iplugin_factory& point_painter_factory();\nextern k3d::iplugin_factory& sphere_painter_factory();\nextern k3d::iplugin_factory& teapot_painter_factory();\nextern k3d::iplugin_factory& torus_painter_factory();\nextern k3d::iplugin_factory& varying_data_painter_factory();\nextern k3d::iplugin_factory& vertex_data_painter_factory();\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::opengl::painters::bezier_triangle_patch_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::bicubic_patch_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::bilinear_patch_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::blobby_point_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::color_face_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::cone_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::cubic_curve_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::cylinder_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::disk_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::edge_numbering_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::edge_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::face_normal_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::face_numbering_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::face_orientation_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::face_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::half_edge_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::hyperboloid_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::linear_curve_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::multi_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::normal_array_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::nurbs_curve_numbering_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::nurbs_curve_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::nurbs_patch_numbering_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::nurbs_patch_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::paraboloid_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::point_numbering_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::point_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::sphere_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::teapot_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::torus_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::varying_data_painter_factory());\n\tRegistry.register_factory(module::opengl::painters::vertex_data_painter_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/multi_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/property.h>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// multi_painter\n\nclass multi_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tmulti_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::iproperty_collection::properties_t& properties = node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t\t{\n\t\t\tk3d::iproperty& property = **prop;\n\t\t\tif(property.property_type() == typeid(k3d::inode*))\n\t\t\t{\n\t\t\t\tif(k3d::gl::imesh_painter* const painter = dynamic_cast<k3d::gl::imesh_painter*>(boost::any_cast<k3d::inode*>(k3d::property::pipeline_value(property))))\n\t\t\t\t{\n\t\t\t\t\tpainter->paint_mesh(Mesh, RenderState, ChangedSignal);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::iproperty_collection::properties_t& properties = node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t\t{\n\t\t\tk3d::iproperty& property = **prop;\n\t\t\tif(property.property_type() == typeid(k3d::inode*))\n\t\t\t{\n\t\t\t\tif(k3d::gl::imesh_painter* const painter = dynamic_cast<k3d::gl::imesh_painter*>(boost::any_cast<k3d::inode*>(k3d::property::pipeline_value(property))))\n\t\t\t\t{\n\t\t\t\t\tpainter->select_mesh(Mesh, RenderState, SelectionState, ChangedSignal);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<multi_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x6bc7d8a1, 0xbbe7491f, 0xa2405d97, 0x8b136c41),\n\t\t\t\"OpenGLMultiPainter\",\n\t\t\t_(\"Distributes rendering across multiple mesh painters\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// multi_painter_factory\n\nk3d::iplugin_factory& multi_painter_factory()\n{\n\treturn multi_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/normal_array_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace k3d\n{\n\n/// Enumerates mesh storage classes\nenum storage_class_t\n{\n\tSTORAGE_CLASS_CONSTANT,\n\tSTORAGE_CLASS_FACE,\n\tSTORAGE_CLASS_VARYING,\n\tSTORAGE_CLASS_VERTEX,\n};\n\n/// Returns descriptions of allowed mesh storage values, for use with enumeration properties\nconst ienumeration_property::enumeration_values_t& storage_class_values()\n{\n\tstatic ienumeration_property::enumeration_values_t values;\n\tif(values.empty())\n\t{\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"Constant\", \"constant\", \"\"));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"Face\", \"face\", \"\"));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"Varying\", \"varying\", \"\"));\n\t\tvalues.push_back(ienumeration_property::enumeration_value_t(\"Vertex\", \"vertex\", \"\"));\n\t}\n\t\n\treturn values;\n}\n\n/// Serialization\nstd::ostream& operator<<(std::ostream& Stream, const storage_class_t& Value)\n{\n\tswitch(Value)\n\t{\n\t\tcase STORAGE_CLASS_CONSTANT:\n\t\t\tStream << \"constant\";\n\t\t\tbreak;\n\t\tcase STORAGE_CLASS_FACE:\n\t\t\tStream << \"face\";\n\t\t\tbreak;\n\t\tcase STORAGE_CLASS_VARYING:\n\t\t\tStream << \"varying\";\n\t\t\tbreak;\n\t\tcase STORAGE_CLASS_VERTEX:\n\t\t\tStream << \"vertex\";\n\t\t\tbreak;\n\t}\n\n\treturn Stream;\n}\n\n/// Serialization\nstd::istream& operator>>(std::istream& Stream, storage_class_t& Value)\n{\n\tstring_t c;\n\tStream >> c;\n\n\tif(\"constant\" == c)\n\t\tValue = STORAGE_CLASS_CONSTANT;\n\telse if(\"face\" == c)\n\t\tValue = STORAGE_CLASS_FACE;\n\telse if(\"varying\" == c)\n\t\tValue = STORAGE_CLASS_VARYING;\n\telse if(\"vertex\" == c)\n\t\tValue = STORAGE_CLASS_VERTEX;\n\telse\n\t\tlog() << error << k3d_file_reference << \": could not extract value [\" << c << \"]\" << std::endl;\n\n\treturn Stream;\n}\n\n} // namespace k3d\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// face_normal_painter\n\nclass normal_array_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tnormal_array_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_storage_class(init_owner(*this) + init_name(\"storage_class\") + init_label(_(\"Storage Class\")) + init_description(_(\"Array storage class\")) + init_value(k3d::STORAGE_CLASS_VARYING) + init_enumeration(k3d::storage_class_values())),\n\t\tm_array_name(init_owner(*this) + init_name(\"array_name\") + init_label(_(\"Array Name\")) + init_description(_(\"Name of the array to visualize.\")) + init_value(k3d::string_t(\"N\"))),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Color\")) + init_value(k3d::color(1, 0, 0))),\n\t\tm_normalize(init_owner(*this) + init_name(\"normalize\") + init_label(_(\"Normalize\")) + init_description(_(\"Normalize vectors for display\")) + init_value(true)),\n\t\tm_scale(init_owner(*this) + init_name(\"scale\") + init_label(_(\"Scale\")) + init_description(_(\"Scale vectors for display\")) + init_value(1.0))\n\t{\n\t\tm_storage_class.changed_signal().connect(make_async_redraw_slot());\n\t\tm_array_name.changed_signal().connect(make_async_redraw_slot());\n\t\tm_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_normalize.changed_signal().connect(make_async_redraw_slot());\n\t\tm_scale.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tinline static void draw_line(const k3d::point3& Point, const k3d::normal3& Normal, const k3d::bool_t Normalize, const k3d::double_t Scale)\n\t{\n\t\tk3d::gl::vertex3d(Point);\n\t\tif(Normalize)\n\t\t\tk3d::gl::vertex3d(Point + k3d::to_vector(Scale * k3d::normalize(Normal)));\n\t\telse\n\t\t\tk3d::gl::vertex3d(Point + k3d::to_vector(Scale * Normal));\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::storage_class_t storage_class = m_storage_class.pipeline_value();\n\t\tconst k3d::string_t array_name = m_array_name.pipeline_value();\n\t\tconst k3d::color color = m_color.pipeline_value();\n\t\tconst k3d::bool_t normalize = m_normalize.pipeline_value();\n\t\tconst k3d::double_t scale = m_scale.pipeline_value();\n\n\t\tswitch(storage_class)\n\t\t{\n\t\t\tcase k3d::STORAGE_CLASS_FACE:\n\t\t\t{\n\t\t\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t\t\t{\n\t\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\t\t\tif(!polyhedron.get())\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif(const k3d::mesh::normals_t* const array = polyhedron->face_attributes.lookup<k3d::mesh::normals_t>(array_name))\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::gl::store_attributes attributes;\n\t\t\t\t\t\tglDisable(GL_LIGHTING);\n\t\t\t\t\t\tk3d::gl::color3d(color);\n\n\t\t\t\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\t\t\t\tglBegin(GL_LINES);\n\t\t\t\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\t\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t\t\t\tdraw_line(k3d::polyhedron::center(polyhedron->vertex_points, polyhedron->clockwise_edges, points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]), (*array)[face], normalize, scale);\n\t\t\t\t\t\tglEnd();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase k3d::STORAGE_CLASS_VARYING:\n\t\t\t{\n\t\t\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t\t\t{\n\t\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\t\t\tif(!polyhedron.get())\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif(const k3d::mesh::normals_t* const array = polyhedron->edge_attributes.lookup<k3d::mesh::normals_t>(array_name))\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::gl::store_attributes attributes;\n\t\t\t\t\t\tglDisable(GL_LIGHTING);\n\t\t\t\t\t\tk3d::gl::color3d(color);\n\n\t\t\t\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\t\t\t\tglBegin(GL_LINES);\n\t\t\t\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\t\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\t\t\t\tconst k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\t\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdraw_line(points[polyhedron->vertex_points[edge]], (*array)[edge], normalize, scale);\n\n\t\t\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tglEnd();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase k3d::STORAGE_CLASS_VERTEX:\n\t\t\t{\n\t\t\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t\t\t{\n\t\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\t\t\tif(!polyhedron.get())\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif(const k3d::mesh::normals_t* const array = Mesh.point_attributes.lookup<k3d::mesh::normals_t>(array_name))\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::gl::store_attributes attributes;\n\t\t\t\t\t\tglDisable(GL_LIGHTING);\n\t\t\t\t\t\tk3d::gl::color3d(color);\n\n\t\t\t\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\t\t\t\t\tconst k3d::uint_t point_begin = 0;\n\t\t\t\t\t\tconst k3d::uint_t point_end = point_begin + points.size();\n\n\t\t\t\t\t\tglBegin(GL_LINES);\n\t\t\t\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\t\t\t\tdraw_line(points[point], (*array)[point], normalize, scale);\n\t\t\t\t\t\tglEnd();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<normal_array_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x893f3dff, 0x9648bc46, 0x5674c48f, 0x05df5463),\n\t\t\t\"OpenGLNormalArrayPainter\",\n\t\t\t_(\"Visualizes normal-vector arrays\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::storage_class_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_storage_class;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_array_name;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_normalize;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_scale;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// face_normal_painter_factory\n\nk3d::iplugin_factory& normal_array_painter_factory()\n{\n\treturn normal_array_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/nurbs_curve_numbering_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/share.h>\n\n#include <FTGL/ftgl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// nurbs_curve_numbering_painter\n\nclass nurbs_curve_numbering_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tnurbs_curve_numbering_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(k3d::share_path() / k3d::filesystem::generic_path(\"fonts/VeraBd.ttf\")) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_font_size(init_owner(*this) + init_name(\"font_size\") + init_label(_(\"Font Size\")) + init_description(_(\"Font size.\")) + init_value(14.0)),\n\t\tm_antialias(init_owner(*this) + init_name(\"antialias\") + init_label(_(\"Font Antialiasing\")) + init_description(_(\"Render antialiased text.\")) + init_value(true)),\n\t\tm_draw_selected(init_owner(*this) + init_name(\"draw_selected\") + init_label(_(\"Draw Selected\")) + init_description(_(\"Draw normals for selected curves.\")) + init_value(true)),\n\t\tm_draw_unselected(init_owner(*this) + init_name(\"draw_unselected\") + init_label(_(\"Draw Unselected\")) + init_description(_(\"Draw normals for unselected curves.\")) + init_value(false)),\n\t\tm_selected_color(init_owner(*this) + init_name(\"selected_color\") + init_label(_(\"Selected Color\")) + init_description(_(\"Normal color for selected curves.\")) + init_value(k3d::color(0, 1, 0))),\n\t\tm_unselected_color(init_owner(*this) + init_name(\"unselected_color\") + init_label(_(\"Unselected Color\")) + init_description(_(\"Normal color for unselected curves.\")) + init_value(k3d::color(0, 0.5, 0))),\n\t\tm_x_offset(init_owner(*this) + init_name(\"x_offset\") + init_label(_(\"X-Offset\")) + init_description(_(\"Offsets numbers away from their curve.\")) + init_value(0.0)),\n\t\tm_y_offset(init_owner(*this) + init_name(\"y_offset\") + init_label(_(\"Y-Offset\")) + init_description(_(\"Offsets numbers away from their curve.\")) + init_value(0.0)),\n\t\tm_z_offset(init_owner(*this) + init_name(\"z_offset\") + init_label(_(\"Z-Offset\")) + init_description(_(\"Offsets numbers away from their curve.\")) + init_value(0.7))\n\t{\n\t\tm_font_path.changed_signal().connect(sigc::mem_fun(*this, &nurbs_curve_numbering_painter::on_font_changed));\n\t\tm_font_size.changed_signal().connect(sigc::mem_fun(*this, &nurbs_curve_numbering_painter::on_font_changed));\n\t\tm_antialias.changed_signal().connect(sigc::mem_fun(*this, &nurbs_curve_numbering_painter::on_font_changed));\n\t\tm_draw_selected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_draw_unselected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_selected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_unselected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_x_offset.changed_signal().connect(make_async_redraw_slot());\n\t\tm_y_offset.changed_signal().connect(make_async_redraw_slot());\n\t\tm_z_offset.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_font_changed(k3d::ihint*)\n\t{\n\t\tm_font.reset();\n\t\tasync_redraw(0);\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::bool_t draw_selected = m_draw_selected.pipeline_value();\n\t\tconst k3d::bool_t draw_unselected = m_draw_unselected.pipeline_value();\n\t\tif(!draw_selected && !draw_unselected)\n\t\t\treturn;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> nurbs_curve(k3d::nurbs_curve::validate(Mesh, **primitive));\n\t\t\tif(!nurbs_curve)\n\t\t\t\treturn;\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tif(!m_font)\n\t\t\t{\n\t\t\t\tif(m_antialias.pipeline_value())\n\t\t\t\t\tm_font.reset(new FTPixmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\t\t\t\telse\n\t\t\t\t\tm_font.reset(new FTBitmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\n\t\t\t\tm_font->FaceSize(static_cast<unsigned int>(m_font_size.pipeline_value()));\n\t\t\t\tm_font->UseDisplayList(true);\n\t\t\t\tif(m_font->Error())\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"error initializing font\" << std::endl;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst k3d::double_t x_offset = m_x_offset.pipeline_value();\n\t\t\tconst k3d::double_t y_offset = m_y_offset.pipeline_value();\n\t\t\tconst k3d::double_t z_offset = m_z_offset.pipeline_value();\n\n\t\t\tconst k3d::color selected_color = m_selected_color.pipeline_value();\n\t\t\tconst k3d::color unselected_color = m_unselected_color.pipeline_value();\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\tconst k3d::uint_t curve_end = curve_begin + nurbs_curve->curve_first_points.size();\n\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve)\n\t\t\t{\n\t\t\t\tk3d::gl::color3d(nurbs_curve->curve_selections[curve] ? selected_color : unselected_color);\n\n\t\t\t\t//calculate center\n\t\t\t\tk3d::point3 center;\n\t\t\t\tconst k3d::uint_t points_begin = nurbs_curve->curve_first_points[curve];\n\t\t\t\tconst k3d::uint_t points_end = points_begin + nurbs_curve->curve_point_counts[curve];\n\n\t\t\t\tfor(k3d::uint_t point = points_begin; point != points_end; ++point)\n\t\t\t\t\tcenter = center + points[nurbs_curve->curve_points[point]];\n\n\t\t\t\tcenter = center / nurbs_curve->curve_point_counts[curve];\n\n\t\t\t\t//draw the number\n\t\t\t\tconst k3d::point3 position = center + k3d::point3(x_offset, y_offset, z_offset);\n\n\t\t\t\tglRasterPos3d(position[0], position[1], position[2]);\n\t\t\t\tm_font->Render(k3d::string_cast(curve).c_str());\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<nurbs_curve_numbering_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x0bb513e8, 0x704f0d15, 0x22631aa7, 0x996b3548),\n\t\t\t\"OpenGLNURBSCurveNumberingPainter\",\n\t\t\t_(\"Numbers NURBS curves\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_font_size;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_antialias;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_selected;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_unselected;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_unselected_color;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_x_offset;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_y_offset;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_z_offset;\n\n\tboost::scoped_ptr<FTFont> m_font;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// nurbs_curve_numbering_painter_factory\n\nk3d::iplugin_factory& nurbs_curve_numbering_painter_factory()\n{\n\treturn nurbs_curve_numbering_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/nurbs_curve_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#if defined K3D_API_DARWIN\n  #if K3D_OSX_MAJOR_VERSION == 10 & K3D_OSX_MINOR_VERSION > 4 // OSX >= 10.5\n\t  #define GLU_NURBS_CALLBACK(callback) (GLvoid(*)())callback\n  #else // OSX < 10.5\n\t  #define GLU_NURBS_CALLBACK(callback) (GLvoid(*)(...))callback\n  #endif\n#elif defined K3D_API_WIN32\n\t#define GLU_NURBS_CALLBACK(callback) (_GLUfuncptr)callback\n#else\n\t#define GLU_NURBS_CALLBACK(callback) (void(*)())callback\n#endif // !K3D_API_DARWIN\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nstatic void on_nurbs_error(GLenum ErrorCode)\n{\n\tk3d::log() << error << \"NURBS curve error: \" << gluErrorString(ErrorCode) << std::endl;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// nurbs_curve_painter\n\nclass nurbs_curve_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tnurbs_curve_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tnurbs_renderer(0)\n\t{\n\t}\n\n\t~nurbs_curve_painter()\n\t{\n\t\tif(nurbs_renderer)\n                        gluDeleteNurbsRenderer(nurbs_renderer);\n\t}\n\n\tvoid initialize()\n\t{\n\t\tif(nurbs_renderer)\n\t\t\treturn;\n\n\t\tnurbs_renderer = gluNewNurbsRenderer();\n\n\t\t// Important!  We load our own matrices for efficiency (saves round-trips to the server) and to prevent problems with selection\n\t\tgluNurbsProperty(nurbs_renderer, GLU_AUTO_LOAD_MATRIX, GL_FALSE);\n\t\tgluNurbsProperty(nurbs_renderer, GLU_CULLING, GL_FALSE);\n\t\tgluNurbsCallback(nurbs_renderer, GLU_ERROR, GLU_NURBS_CALLBACK(on_nurbs_error));\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> nurbs_curve(k3d::nurbs_curve::validate(Mesh, **primitive));\n\t\t\tif(!nurbs_curve)\n\t\t\t\tcontinue;\n\n\t\t\tinitialize();\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tGLfloat gl_modelview_matrix[16];\n\t\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\t\tgluLoadSamplingMatrices(nurbs_renderer, gl_modelview_matrix, RenderState.gl_projection_matrix, RenderState.gl_viewport);\n\n\t\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0, 0, 0);\n\t\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\tconst k3d::uint_t curve_end = curve_begin + nurbs_curve->curve_first_points.size();\n\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve_point_count = nurbs_curve->curve_point_counts[curve];\n\t\t\t\tconst k3d::uint_t curve_point_begin = nurbs_curve->curve_first_points[curve];\n\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + curve_point_count;\n\t\t\t\tconst k3d::uint_t curve_order = nurbs_curve->curve_orders[curve];\n\t\t\t\tconst k3d::uint_t curve_first_knot = nurbs_curve->curve_first_knots[curve];\n\n\t\t\t\tk3d::gl::color3d(nurbs_curve->curve_selections[curve] ? selected_color : color);\n\n\t\t\t\tstd::vector<GLfloat> gl_knot_vector(&nurbs_curve->curve_knots[curve_first_knot], &nurbs_curve->curve_knots[curve_first_knot + curve_point_count + curve_order]);\n\n\t\t\t\tstd::vector<GLfloat> gl_control_points;\n\t\t\t\tgl_control_points.reserve(4 * curve_point_count);\n\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point != curve_point_end; ++curve_point)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::double_t curve_point_weight = nurbs_curve->curve_point_weights[curve_point];\n\t\t\t\t\tconst k3d::point3 weighted_curve_point = curve_point_weight * points[nurbs_curve->curve_points[curve_point]];\n\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_curve_point[0]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_curve_point[1]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_curve_point[2]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(curve_point_weight));\n\t\t\t\t}\n\n\t\t\t\tgluBeginCurve(nurbs_renderer);\n\t\t\t\tgluNurbsCurve(nurbs_renderer, gl_knot_vector.size(), &gl_knot_vector[0], 4, &gl_control_points[0], curve_order, GL_MAP1_VERTEX_4);\n\t\t\t\tgluEndCurve(nurbs_renderer);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::CURVE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> nurbs_curve(k3d::nurbs_curve::validate(Mesh, **primitive));\n\t\t\tif(!nurbs_curve)\n\t\t\t\tcontinue;\n\n\t\t\tinitialize();\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tGLfloat gl_modelview_matrix[16];\n\t\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\t\tgluLoadSamplingMatrices(nurbs_renderer, gl_modelview_matrix, RenderState.gl_projection_matrix, RenderState.gl_viewport);\n\n\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\tconst k3d::uint_t curve_end = curve_begin + nurbs_curve->curve_first_points.size();\n\t\t\tk3d::uint_t curve_index = 0;\n\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve, ++curve_index)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::CURVE, curve_index);\n\n\t\t\t\tconst k3d::uint_t curve_point_count = nurbs_curve->curve_point_counts[curve];\n\t\t\t\tconst k3d::uint_t curve_point_begin = nurbs_curve->curve_first_points[curve];\n\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + curve_point_count;\n\t\t\t\tconst k3d::uint_t curve_order = nurbs_curve->curve_orders[curve];\n\t\t\t\tconst k3d::uint_t curve_first_knot = nurbs_curve->curve_first_knots[curve];\n\n\t\t\t\tstd::vector<GLfloat> gl_knot_vector(&nurbs_curve->curve_knots[curve_first_knot], &nurbs_curve->curve_knots[curve_first_knot + curve_point_count + curve_order]);\n\n\t\t\t\tstd::vector<GLfloat> gl_control_points;\n\t\t\t\tgl_control_points.reserve(4 * curve_point_count);\n\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point != curve_point_end; ++curve_point)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::double_t curve_point_weight = nurbs_curve->curve_point_weights[curve_point];\n\t\t\t\t\tconst k3d::point3 weighted_curve_point = curve_point_weight * points[nurbs_curve->curve_points[curve_point]];\n\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_curve_point[0]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_curve_point[1]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_curve_point[2]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(curve_point_weight));\n\t\t\t\t}\n\n\t\t\t\tgluBeginCurve(nurbs_renderer);\n\t\t\t\tgluNurbsCurve(nurbs_renderer, gl_knot_vector.size(), &gl_knot_vector[0], 4, &gl_control_points[0], curve_order, GL_MAP1_VERTEX_4);\n\t\t\t\tgluEndCurve(nurbs_renderer);\n\n\t\t\t\tk3d::gl::pop_selection_token(); // CURVE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<nurbs_curve_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x86705b44, 0xef534dc4, 0x86d9fc7a, 0x8709ec59),\n\t\t\t\"OpenGLNURBSCurvePainter\",\n\t\t\t_(\"Renders NURBS curves\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tGLUnurbsObj* nurbs_renderer;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// nurbs_curve_painter_factory\n\nk3d::iplugin_factory& nurbs_curve_painter_factory()\n{\n\treturn nurbs_curve_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/nurbs_patch_numbering_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/share.h>\n\n#include <FTGL/ftgl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// nurbs_patch_numbering_painter\n\nclass nurbs_patch_numbering_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tnurbs_patch_numbering_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(k3d::share_path() / k3d::filesystem::generic_path(\"fonts/VeraBd.ttf\")) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_font_size(init_owner(*this) + init_name(\"font_size\") + init_label(_(\"Font Size\")) + init_description(_(\"Font size.\")) + init_value(14.0)),\n\t\tm_antialias(init_owner(*this) + init_name(\"antialias\") + init_label(_(\"Font Antialiasing\")) + init_description(_(\"Render antialiased text.\")) + init_value(true)),\n\t\tm_draw_selected(init_owner(*this) + init_name(\"draw_selected\") + init_label(_(\"Draw Selected\")) + init_description(_(\"Draw normals for selected patches.\")) + init_value(true)),\n\t\tm_draw_unselected(init_owner(*this) + init_name(\"draw_unselected\") + init_label(_(\"Draw Unselected\")) + init_description(_(\"Draw normals for unselected patches.\")) + init_value(false)),\n\t\tm_selected_color(init_owner(*this) + init_name(\"selected_color\") + init_label(_(\"Selected Color\")) + init_description(_(\"Normal color for selected patches.\")) + init_value(k3d::color(0, 1, 0))),\n\t\tm_unselected_color(init_owner(*this) + init_name(\"unselected_color\") + init_label(_(\"Unselected Color\")) + init_description(_(\"Normal color for unselected patches.\")) + init_value(k3d::color(0, 0.5, 0))),\n\t\tm_x_offset(init_owner(*this) + init_name(\"x_offset\") + init_label(_(\"X-Offset\")) + init_description(_(\"Offsets numbers away from their patches.\")) + init_value(0.0)),\n\t\tm_y_offset(init_owner(*this) + init_name(\"y_offset\") + init_label(_(\"Y-Offset\")) + init_description(_(\"Offsets numbers away from their patches.\")) + init_value(0.0)),\n\t\tm_z_offset(init_owner(*this) + init_name(\"z_offset\") + init_label(_(\"Z-Offset\")) + init_description(_(\"Offsets numbers away from their patches..\")) + init_value(0.7))\n\t{\n\t\tm_font_path.changed_signal().connect(sigc::mem_fun(*this, &nurbs_patch_numbering_painter::on_font_changed));\n\t\tm_font_size.changed_signal().connect(sigc::mem_fun(*this, &nurbs_patch_numbering_painter::on_font_changed));\n\t\tm_antialias.changed_signal().connect(sigc::mem_fun(*this, &nurbs_patch_numbering_painter::on_font_changed));\n\t\tm_draw_selected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_draw_unselected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_selected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_unselected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_x_offset.changed_signal().connect(make_async_redraw_slot());\n\t\tm_y_offset.changed_signal().connect(make_async_redraw_slot());\n\t\tm_z_offset.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_font_changed(k3d::ihint*)\n\t{\n\t\tm_font.reset();\n\t\tasync_redraw(0);\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::bool_t draw_selected = m_draw_selected.pipeline_value();\n\t\tconst k3d::bool_t draw_unselected = m_draw_unselected.pipeline_value();\n\t\tif (!draw_selected && !draw_unselected)\n\t\t\treturn;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs(k3d::nurbs_patch::validate(Mesh, **primitive));\n\t\t\tif(!nurbs)\n\t\t\t\treturn;\n\n\t\t\tif(!m_font)\n\t\t\t{\n\t\t\t\tif (m_antialias.pipeline_value())\n\t\t\t\t\tm_font.reset(new FTPixmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\t\t\t\telse\n\t\t\t\t\tm_font.reset(new FTBitmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\n\t\t\t\tm_font->FaceSize(static_cast<unsigned int>(m_font_size.pipeline_value()));\n\t\t\t\tm_font->UseDisplayList(true);\n\t\t\t\tif (m_font->Error())\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"error initializing font\" << std::endl;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst k3d::double_t x_offset = m_x_offset.pipeline_value();\n\t\t\tconst k3d::double_t y_offset = m_y_offset.pipeline_value();\n\t\t\tconst k3d::double_t z_offset = m_z_offset.pipeline_value();\n\n\t\t\tconst k3d::color selected_color = m_selected_color.pipeline_value();\n\t\t\tconst k3d::color unselected_color = m_unselected_color.pipeline_value();\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tconst k3d::uint_t patches_begin = 0;\n\t\t\tconst k3d::uint_t patches_end = patches_begin + nurbs->patch_first_points.size();\n\t\t\tfor (k3d::uint_t patch = patches_begin; patch < patches_end; patch++)\n\t\t\t{\n\t\t\t\tk3d::gl::color3d(nurbs->patch_selections[patch] ? selected_color : unselected_color);\n\n\t\t\t\t//calculate center\n\t\t\t\tk3d::point3 center;\n\t\t\t\tconst k3d::uint_t points_begin = nurbs->patch_first_points[patch];\n\t\t\t\tconst k3d::uint_t points_end = points_begin + (nurbs->patch_u_point_counts[patch] * nurbs->patch_v_point_counts[patch]);\n\n\t\t\t\tfor (k3d::uint_t point = points_begin; point < points_end; point++)\n\t\t\t\t{\n\t\t\t\t\tcenter = center + points[nurbs->patch_points[point]];\n\t\t\t\t}\n\n\t\t\t\tcenter = center / (nurbs->patch_u_point_counts[patch] * nurbs->patch_v_point_counts[patch]);\n\n\t\t\t\t//draw the number\n\t\t\t\tconst k3d::point3 position = center + k3d::point3(x_offset, y_offset, z_offset);\n\n\t\t\t\tglRasterPos3d(position[0], position[1], position[2]);\n\t\t\t\tm_font->Render(k3d::string_cast(patch).c_str());\n\t\t\t}\n\t\t}\n\t}\n\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<nurbs_patch_numbering_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t    k3d::uuid(0x44c22f9e, 0xbd4b902d, 0x134018ac, 0xe0e64a86),\n\t\t    \"OpenGLNURBSPatchNumberingPainter\",\n\t\t    _(\"Numbers NURBS patches\"),\n\t\t    \"OpenGL Painter\",\n\t\t    k3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_font_size;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_antialias;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_selected;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_unselected;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_unselected_color;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_x_offset;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_y_offset;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_z_offset;\n\n\tboost::scoped_ptr<FTFont> m_font;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// nurbs_patch_numbering_painter_factory\n\nk3d::iplugin_factory& nurbs_patch_numbering_painter_factory()\n{\n\treturn nurbs_patch_numbering_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/nurbs_patch_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-platform-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#if defined K3D_API_DARWIN\n  #if K3D_OSX_MAJOR_VERSION == 10 & K3D_OSX_MINOR_VERSION > 4 // OSX >= 10.5\n\t  #define GLU_NURBS_CALLBACK(callback) (GLvoid(*)())callback\n  #else // OSX < 10.5\n\t  #define GLU_NURBS_CALLBACK(callback) (GLvoid(*)(...))callback\n  #endif\n#elif defined K3D_API_WIN32\n\t#define GLU_NURBS_CALLBACK(callback) (_GLUfuncptr)callback\n#else\n\t#define GLU_NURBS_CALLBACK(callback) (void(*)())callback\n#endif // !K3D_API_DARWIN\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nstatic void on_nurbs_error(GLenum ErrorCode)\n{\n\tk3d::log() << error << \"NURBS patch error: \" << gluErrorString(ErrorCode) << std::endl;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// nurbs_patch_painter\n\nclass nurbs_patch_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tnurbs_patch_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tnurbs_renderer(0)\n\t{\n\t}\n\n\t~nurbs_patch_painter()\n\t{\n\t\tif(nurbs_renderer)\n                        gluDeleteNurbsRenderer(nurbs_renderer);\n\t}\n\n\tvoid initialize()\n\t{\n\t\tif(nurbs_renderer)\n\t\t\treturn;\n\n\t\tnurbs_renderer = gluNewNurbsRenderer();\n\n\t\t// Important!  We load our own matrices for efficiency (saves round-trips to the server) and to prevent problems with selection\n\t\tgluNurbsProperty(nurbs_renderer, GLU_AUTO_LOAD_MATRIX, GL_FALSE);\n\t\tgluNurbsProperty(nurbs_renderer, GLU_CULLING, GL_TRUE);\n\t\tgluNurbsProperty(nurbs_renderer, GLU_DISPLAY_MODE, GLU_FILL);\n\t\tgluNurbsProperty(nurbs_renderer, GLU_SAMPLING_TOLERANCE, 50);\n\t\tgluNurbsCallback(nurbs_renderer, GLU_ERROR, GLU_NURBS_CALLBACK(on_nurbs_error));\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs(k3d::nurbs_patch::validate(Mesh, **primitive));\n\t\t\tif(!nurbs)\n\t\t\t\tcontinue;\n\n\t\t\tinitialize();\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglEnable(GL_LIGHTING);\n\t\t\tglEnable(GL_AUTO_NORMAL);\n\t\t\tglDisable(GL_CULL_FACE);\n\n\t\t\tGLfloat gl_modelview_matrix[16];\n\t\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\t\tgluLoadSamplingMatrices(nurbs_renderer, gl_modelview_matrix, RenderState.gl_projection_matrix, RenderState.gl_viewport);\n\n\t\t\tconst k3d::color color = k3d::color(0.8, 0.8, 0.8);\n\t\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\tconst k3d::uint_t patch_end = patch_begin + nurbs->patch_first_points.size();\n\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t patch_u_point_count = nurbs->patch_u_point_counts[patch];\n\t\t\t\tconst k3d::uint_t patch_v_point_count = nurbs->patch_v_point_counts[patch];\n\t\t\t\tconst k3d::uint_t patch_point_begin = nurbs->patch_first_points[patch];\n\t\t\t\tconst k3d::uint_t patch_point_end = patch_point_begin + (patch_u_point_count * patch_v_point_count);\n\t\t\t\tconst k3d::uint_t patch_u_order = nurbs->patch_u_orders[patch];\n\t\t\t\tconst k3d::uint_t patch_v_order = nurbs->patch_v_orders[patch];\n\t\t\t\tconst k3d::uint_t patch_u_first_knot = nurbs->patch_u_first_knots[patch];\n\t\t\t\tconst k3d::uint_t patch_v_first_knot = nurbs->patch_v_first_knots[patch];\n\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, nurbs->patch_selections[patch] ? selected_color : color);\n\n\t\t\t\tstd::vector<GLfloat> gl_u_knot_vector(&nurbs->patch_u_knots[patch_u_first_knot], &nurbs->patch_u_knots[patch_u_first_knot + patch_u_point_count + patch_u_order]);\n\t\t\t\tstd::vector<GLfloat> gl_v_knot_vector(&nurbs->patch_v_knots[patch_v_first_knot], &nurbs->patch_v_knots[patch_v_first_knot + patch_v_point_count + patch_v_order]);\n\n\t\t\t\tconst GLint gl_u_stride = 4;\n\t\t\t\tconst GLint gl_v_stride = gl_u_stride * patch_u_point_count;\n\n\t\t\t\tstd::vector<GLfloat> gl_control_points;\n\t\t\t\tgl_control_points.reserve(4 * patch_u_point_count * patch_v_point_count);\n\t\t\t\tfor(k3d::uint_t patch_point = patch_point_begin; patch_point != patch_point_end; ++patch_point)\n\t\t\t\t{\n\t\t\t\t\tconst double patch_point_weight = nurbs->patch_point_weights[patch_point];\n\t\t\t\t\tconst k3d::point3 weighted_patch_point = patch_point_weight * points[nurbs->patch_points[patch_point]];\n\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_patch_point[0]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_patch_point[1]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_patch_point[2]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(patch_point_weight));\n\t\t\t\t}\n\n\t\t\t\tgluBeginSurface(nurbs_renderer);\n\t\t\t\tgluNurbsSurface(nurbs_renderer, gl_u_knot_vector.size(), &gl_u_knot_vector[0], gl_v_knot_vector.size(), &gl_v_knot_vector[0], gl_u_stride, gl_v_stride, &gl_control_points[0], patch_u_order, patch_v_order, GL_MAP2_VERTEX_4);\n\n\t\t\t\tif(nurbs->patch_trim_loop_counts[patch])\n\t\t\t\t{\n\t\t\t\t\tk3d::uint_t loops_start = nurbs->patch_first_trim_loops[patch];\n\t\t\t\t\tk3d::uint_t loops_end = loops_start + nurbs->patch_trim_loop_counts[patch];\n\t\t\t\t\tfor (k3d::uint_t loop_index = loops_start; loop_index != loops_end; ++loop_index)\n\t\t\t\t\t{\n\t\t\t\t\t\tgluBeginTrim(nurbs_renderer);\n\t\t\t\t\t\tk3d::uint_t curves_start = nurbs->trim_loop_first_curves[loop_index];\n\t\t\t\t\t\tk3d::uint_t curves_end = curves_start + nurbs->trim_loop_curve_counts[loop_index];\n\t\t\t\t\t\tfor (k3d::uint_t curve = curves_start; curve != curves_end; ++curve)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::uint_t knots_end = nurbs->curve_first_knots[curve] + nurbs->curve_point_counts[curve] + nurbs->curve_orders[curve];\n\t\t\t\t\t\t\treturn_if_fail(knots_end <= nurbs->curve_knots.size());\n\t\t\t\t\t\t\tstd::vector<GLfloat> gl_trim_knot_vector(&nurbs->curve_knots[nurbs->curve_first_knots[curve]], &nurbs->curve_knots[knots_end]);\n\t\t\t\t\t\t\tstd::vector<GLfloat> gl_trim_control_points;\n\t\t\t\t\t\t\tk3d::uint_t points_start = nurbs->curve_first_points[curve];\n\t\t\t\t\t\t\tk3d::uint_t points_end = points_start + nurbs->curve_point_counts[curve];\n\t\t\t\t\t\t\treturn_if_fail(points_end <= nurbs->curve_points.size());\n\t\t\t\t\t\t\tfor (k3d::uint_t point = points_start; point != points_end; ++point)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::point2 control_point = nurbs->points[nurbs->curve_points[point]];\n\t\t\t\t\t\t\t\tdouble weight = nurbs->curve_point_weights[point];\n\t\t\t\t\t\t\t\tgl_trim_control_points.push_back(static_cast<GLfloat>(control_point[0] * weight));\n\t\t\t\t\t\t\t\tgl_trim_control_points.push_back(static_cast<GLfloat>(control_point[1] * weight));\n\t\t\t\t\t\t\t\tgl_trim_control_points.push_back(static_cast<GLfloat>(weight));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tgluNurbsCurve(nurbs_renderer, gl_trim_knot_vector.size(), &gl_trim_knot_vector[0], 3, &gl_trim_control_points[0], static_cast<GLint>(nurbs->curve_orders[curve]), GLU_MAP1_TRIM_3);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgluEndTrim(nurbs_renderer);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tgluEndSurface(nurbs_renderer);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::PATCH))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs(k3d::nurbs_patch::validate(Mesh, **primitive));\n\t\t\tif(!nurbs)\n\t\t\t\tcontinue;\n\n\t\t\tinitialize();\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\t\t\tglDisable(GL_AUTO_NORMAL);\n\t\t\tglDisable(GL_CULL_FACE);\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tGLfloat gl_modelview_matrix[16];\n\t\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\t\tgluLoadSamplingMatrices(nurbs_renderer, gl_modelview_matrix, RenderState.gl_projection_matrix, RenderState.gl_viewport);\n\n\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\tconst k3d::uint_t patch_end = patch_begin + nurbs->patch_first_points.size();\n\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t patch_u_point_count = nurbs->patch_u_point_counts[patch];\n\t\t\t\tconst k3d::uint_t patch_v_point_count = nurbs->patch_v_point_counts[patch];\n\t\t\t\tconst k3d::uint_t patch_point_begin = nurbs->patch_first_points[patch];\n\t\t\t\tconst k3d::uint_t patch_point_end = patch_point_begin + (patch_u_point_count * patch_v_point_count);\n\t\t\t\tconst k3d::uint_t patch_u_order = nurbs->patch_u_orders[patch];\n\t\t\t\tconst k3d::uint_t patch_v_order = nurbs->patch_v_orders[patch];\n\t\t\t\tconst k3d::uint_t patch_u_first_knot = nurbs->patch_u_first_knots[patch];\n\t\t\t\tconst k3d::uint_t patch_v_first_knot = nurbs->patch_v_first_knots[patch];\n\n\t\t\t\tstd::vector<GLfloat> gl_u_knot_vector(&nurbs->patch_u_knots[patch_u_first_knot], &nurbs->patch_u_knots[patch_u_first_knot + patch_u_point_count + patch_u_order]);\n\t\t\t\tstd::vector<GLfloat> gl_v_knot_vector(&nurbs->patch_v_knots[patch_v_first_knot], &nurbs->patch_v_knots[patch_v_first_knot + patch_v_point_count + patch_v_order]);\n\n\t\t\t\tconst GLint gl_u_stride = 4;\n\t\t\t\tconst GLint gl_v_stride = gl_u_stride * patch_u_point_count;\n\n\t\t\t\tstd::vector<GLfloat> gl_control_points;\n\t\t\t\tgl_control_points.reserve(4 * patch_u_point_count * patch_v_point_count);\n\t\t\t\tfor(k3d::uint_t patch_point = patch_point_begin; patch_point != patch_point_end; ++patch_point)\n\t\t\t\t{\n\t\t\t\t\tconst double patch_point_weight = nurbs->patch_point_weights[patch_point];\n\t\t\t\t\tconst k3d::point3 weighted_patch_point = patch_point_weight * points[nurbs->patch_points[patch_point]];\n\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_patch_point[0]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_patch_point[1]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(weighted_patch_point[2]));\n\t\t\t\t\tgl_control_points.push_back(static_cast<GLfloat>(patch_point_weight));\n\t\t\t\t}\n\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::PATCH, patch);\n\n\t\t\t\tgluBeginSurface(nurbs_renderer);\n\t\t\t\tgluNurbsSurface(nurbs_renderer, gl_u_knot_vector.size(), &gl_u_knot_vector[0], gl_v_knot_vector.size(), &gl_v_knot_vector[0], gl_u_stride, gl_v_stride, &gl_control_points[0], patch_u_order, patch_v_order, GL_MAP2_VERTEX_4);\n\n\t\t\t\tif(nurbs->patch_trim_loop_counts[patch])\n\t\t\t\t{\n\t\t\t\t\tk3d::uint_t loops_start = nurbs->patch_first_trim_loops[patch];\n\t\t\t\t\tk3d::uint_t loops_end = loops_start + nurbs->patch_trim_loop_counts[patch];\n\t\t\t\t\tfor (k3d::uint_t loop_index = loops_start; loop_index != loops_end; ++loop_index)\n\t\t\t\t\t{\n\t\t\t\t\t\tgluBeginTrim(nurbs_renderer);\n\t\t\t\t\t\tk3d::uint_t curves_start = nurbs->trim_loop_first_curves[loop_index];\n\t\t\t\t\t\tk3d::uint_t curves_end = curves_start + nurbs->trim_loop_curve_counts[loop_index];\n\t\t\t\t\t\tfor (k3d::uint_t curve = curves_start; curve != curves_end; ++curve)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstd::vector<GLfloat> gl_trim_knot_vector(&nurbs->curve_knots[nurbs->curve_first_knots[curve]], &nurbs->curve_knots[nurbs->curve_first_knots[curve] + nurbs->curve_point_counts[curve] + nurbs->curve_orders[curve]]);\n\t\t\t\t\t\t\tstd::vector<GLfloat> gl_trim_control_points;\n\t\t\t\t\t\t\tk3d::uint_t points_start = nurbs->curve_first_points[curve];\n\t\t\t\t\t\t\tk3d::uint_t points_end = points_start + nurbs->curve_point_counts[curve];\n\t\t\t\t\t\t\tfor (k3d::uint_t point = points_start; point != points_end; ++point)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::point2 control_point = nurbs->points[nurbs->curve_points[point]];\n\t\t\t\t\t\t\t\tdouble weight = nurbs->curve_point_weights[point];\n\t\t\t\t\t\t\t\tgl_trim_control_points.push_back(static_cast<GLfloat>(control_point[0] * weight));\n\t\t\t\t\t\t\t\tgl_trim_control_points.push_back(static_cast<GLfloat>(control_point[1] * weight));\n\t\t\t\t\t\t\t\tgl_trim_control_points.push_back(static_cast<GLfloat>(weight));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tgluNurbsCurve(nurbs_renderer, gl_trim_knot_vector.size(), &gl_trim_knot_vector[0], 3, &gl_trim_control_points[0], static_cast<GLint>(nurbs->curve_orders[curve]), GLU_MAP1_TRIM_3);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgluEndTrim(nurbs_renderer);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tgluEndSurface(nurbs_renderer);\n\n\t\t\t\tk3d::gl::pop_selection_token(); // PATCH\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<nurbs_patch_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x8881a190, 0x9d1c4e6f, 0x8b8c0523, 0x2dc43fda),\n\t\t\t\"OpenGLNURBSPatchPainter\",\n\t\t\t_(\"Renders NURBS patches\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tGLUnurbsObj* nurbs_renderer;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// nurbs_patch_painter_factory\n\nk3d::iplugin_factory& nurbs_patch_painter_factory()\n{\n\treturn nurbs_patch_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/paraboloid_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometric_operations.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/paraboloid.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// paraboloid_painter\n\nclass paraboloid_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tparaboloid_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.8, 0.8, 0.8);\n\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::paraboloid::const_primitive> paraboloid(k3d::paraboloid::validate(Mesh, **primitive));\n\t\t\tif(!paraboloid)\n\t\t\t\tcontinue;\n\n\t\t\tglPolygonOffset(1.0, 1.0);\n\t\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\t\tglEnable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != paraboloid->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, paraboloid->selections[i] ? selected_color : color);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(paraboloid->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, paraboloid->radii[i], paraboloid->z_min[i], paraboloid->z_max[i], paraboloid->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::SURFACE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::paraboloid::const_primitive> paraboloid(k3d::paraboloid::validate(Mesh, **primitive));\n\t\t\tif(!paraboloid)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != paraboloid->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::SURFACE, i);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(paraboloid->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, paraboloid->radii[i], paraboloid->z_min[i], paraboloid->z_max[i], paraboloid->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\n\t\t\t\tk3d::gl::pop_selection_token(); // SURFACE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tvoid draw_solid(const k3d::gl::render_state& State, const k3d::double_t Radius, const k3d::double_t ZMin, const k3d::double_t ZMax, const k3d::double_t SweepAngle)\n\t{\n\t\tif(!Radius)\n\t\t\treturn;\n\n\t\tconst k3d::double_t z1 = ZMax ? ZMin / ZMax : 0.0;\n\t\tconst k3d::double_t z3 = 1.0;\n\n\t\tconst k3d::double_t r1 = std::sqrt(z1);\n\t\tconst k3d::double_t r3 = 1.0;\n\n\t\tconst k3d::point3 p1(r1, z1, 0);\n\t\tconst k3d::point3 p3(r3, z3, 0);\n\n\t\tconst k3d::vector3 t1(1, 2 * std::sqrt(z1), 0);\n\t\tconst k3d::vector3 t3(1, 2, 0);\n\n\t\tk3d::point3 p2;\n\t\tk3d::intersect_lines(p1, t1, p3, t3, p2);\n\n\t\tconst k3d::double_t z2 = p2[1];\n\t\tconst k3d::double_t r2 = p2[0];\n\n\t\tk3d::mesh::knots_t knots;\n\t\tk3d::mesh::weights_t weights;\n\t\tk3d::mesh::points_t arc_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, SweepAngle, 4, knots, weights, arc_points);\n\n\t\tstd::vector<GLfloat> gl_u_knot_vector(knots.begin(), knots.end());\n\t\tstd::vector<GLfloat> gl_v_knot_vector;\n\t\tstd::vector<GLfloat> gl_control_points;\n\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 3, 0);\n\t\tgl_v_knot_vector.insert(gl_v_knot_vector.end(), 3, 1);\n\n\t\tfor(k3d::uint_t j = 0; j != arc_points.size(); ++j)\n\t\t{\n\t\t\tgl_control_points.push_back(weights[j] * r1 * Radius * arc_points[j][0]);\n\t\t\tgl_control_points.push_back(weights[j] * r1 * Radius * arc_points[j][1]);\n\t\t\tgl_control_points.push_back(weights[j] * z1 * ZMax);\n\t\t\tgl_control_points.push_back(weights[j]);\n\t\t}\n\n\t\tfor(k3d::uint_t j = 0; j != arc_points.size(); ++j)\n\t\t{\n\t\t\tgl_control_points.push_back(weights[j] * r2 * Radius * arc_points[j][0]);\n\t\t\tgl_control_points.push_back(weights[j] * r2 * Radius * arc_points[j][1]);\n\t\t\tgl_control_points.push_back(weights[j] * z2 * ZMax);\n\t\t\tgl_control_points.push_back(weights[j]);\n\t\t}\n\n\t\tfor(k3d::uint_t j = 0; j != arc_points.size(); ++j)\n\t\t{\n\t\t\tgl_control_points.push_back(weights[j] * r3 * Radius * arc_points[j][0]);\n\t\t\tgl_control_points.push_back(weights[j] * r3 * Radius * arc_points[j][1]);\n\t\t\tgl_control_points.push_back(weights[j] * z3 * ZMax);\n\t\t\tgl_control_points.push_back(weights[j]);\n\t\t}\n\n\t\tGLUnurbsObj* const nurbs_renderer = gluNewNurbsRenderer();\n\n\t\t// Important!  We load our own matrices for efficiency (saves round-trips to the server) and to prevent problems with selection\n\t\tgluNurbsProperty(nurbs_renderer, GLU_AUTO_LOAD_MATRIX, GL_FALSE);\n\t\tgluNurbsProperty(nurbs_renderer, GLU_CULLING, GL_TRUE);\n\t\tGLfloat gl_modelview_matrix[16];\n\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\tgluLoadSamplingMatrices(nurbs_renderer, gl_modelview_matrix, State.gl_projection_matrix, State.gl_viewport);\n\n\t\tgluBeginSurface(nurbs_renderer);\n\t\tgluNurbsSurface(nurbs_renderer, gl_u_knot_vector.size(), &gl_u_knot_vector[0], gl_v_knot_vector.size(), &gl_v_knot_vector[0], 4, 36, &gl_control_points[0], 3, 3, GL_MAP2_VERTEX_4);\n\t\tgluEndSurface(nurbs_renderer);\n\n\t\tgluDeleteNurbsRenderer(nurbs_renderer);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<paraboloid_painter, k3d::interface_list<k3d::gl::imesh_painter> > factory(\n\t\t\tk3d::uuid(0xa4e66aa9, 0xc34a22ca, 0xc5d3b19e, 0x83c5d0f4),\n\t\t\t\"OpenGLParaboloidPainter\",\n\t\t\t_(\"Renders paraboloid primitives using OpoenGL\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// paraboloid_painter_factory\n\nk3d::iplugin_factory& paraboloid_painter_factory()\n{\n\treturn paraboloid_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/point_numbering_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/share.h>\n\n#include <FTGL/ftgl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// point_numbering_painter\n\nclass point_numbering_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tpoint_numbering_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(k3d::share_path() / k3d::filesystem::generic_path(\"fonts/VeraBd.ttf\")) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_font_size(init_owner(*this) + init_name(\"font_size\") + init_label(_(\"Font Size\")) + init_description(_(\"Font size.\")) + init_value(14.0)),\n\t\tm_antialias(init_owner(*this) + init_name(\"antialias\") + init_label(_(\"Font Antialiasing\")) + init_description(_(\"Render antialiased text.\")) + init_value(true)),\n\t\tm_draw_selected(init_owner(*this) + init_name(\"draw_selected\") + init_label(_(\"Draw Selected\")) + init_description(_(\"Draw normals for selected polygons\")) + init_value(true)),\n\t\tm_draw_unselected(init_owner(*this) + init_name(\"draw_unselected\") + init_label(_(\"Draw Unselected\")) + init_description(_(\"Draw normals for unselected polygons\")) + init_value(false)),\n\t\tm_selected_color(init_owner(*this) + init_name(\"selected_color\") + init_label(_(\"Selected Color\")) + init_description(_(\"Normal color for selected polygons\")) + init_value(k3d::color(1, 0, 0))),\n\t\tm_unselected_color(init_owner(*this) + init_name(\"unselected_color\") + init_label(_(\"Unselected Color\")) + init_description(_(\"Normal color for unselected polygons\")) + init_value(k3d::color(0.5, 0, 0)))\n\t{\n\t\tm_font_path.changed_signal().connect(sigc::mem_fun(*this, &point_numbering_painter::on_font_changed));\n\t\tm_font_size.changed_signal().connect(sigc::mem_fun(*this, &point_numbering_painter::on_font_changed));\n\t\tm_antialias.changed_signal().connect(sigc::mem_fun(*this, &point_numbering_painter::on_font_changed));\n\t\tm_draw_selected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_draw_unselected.changed_signal().connect(make_async_redraw_slot());\n\t\tm_selected_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_unselected_color.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_font_changed(k3d::ihint*)\n\t{\n\t\tm_font.reset();\n\t\tasync_redraw(0);\n\t}\n\n\tstatic k3d::bool_t selected(const k3d::mesh::selection_t& Selection, const k3d::uint_t Index)\n\t{\n\t\treturn Selection[Index];\n\t}\n\n\tstatic k3d::bool_t unselected(const k3d::mesh::selection_t& Selection, const k3d::uint_t Index)\n\t{\n\t\treturn !Selection[Index];\n\t}\n\n\ttemplate<typename FunctorT>\n\tstatic void draw(const k3d::mesh& Mesh, const k3d::typed_array<k3d::point3>& Points, const k3d::color& Color, FunctorT PointTest, FTFont& Font)\n\t{\n\t\tk3d::gl::color3d(Color);\n\n\t\tconst size_t point_begin = 0;\n\t\tconst size_t point_end = point_begin + Points.size();\n\t\tfor(size_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tif(PointTest(*Mesh.point_selection, point))\n\t\t\t{\n\t\t\t\tconst k3d::point3 position = Points[point];\n\t\t\t\tglRasterPos3d(position[0], position[1], position[2]);\n\t\t\t\tFont.Render(k3d::string_cast(point).c_str());\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst bool draw_selected = m_draw_selected.pipeline_value();\n\t\tconst bool draw_unselected = m_draw_unselected.pipeline_value();\n\t\tif(!draw_selected && !draw_unselected)\n\t\t\treturn;\n\n\t\tif(!Mesh.points)\n\t\t\treturn;\n\n\t\tif(!m_font)\n\t\t{\n\t\t\tif(m_antialias.pipeline_value())\n\t\t\t\tm_font.reset(new FTPixmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\t\t\telse\n\t\t\t\tm_font.reset(new FTBitmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\n\t\t\tm_font->FaceSize(static_cast<unsigned int>(m_font_size.pipeline_value()));\n\t\t\tm_font->UseDisplayList(true);\n\t\t\tif(m_font->Error())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"error initializing font\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglDisable(GL_LIGHTING);\n\n\t\tif(draw_selected)\n\t\t\tdraw(Mesh, points, m_selected_color.pipeline_value(), selected, *m_font);\n\n\t\tif(draw_unselected)\n\t\t\tdraw(Mesh, points, m_unselected_color.pipeline_value(), unselected, *m_font);\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<point_numbering_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xeab34a69, 0xca442372, 0x473d7a96, 0xacb45eab),\n\t\t\t\"OpenGLPointNumberingPainter\",\n\t\t\t_(\"Numbers points\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_font_size;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_antialias;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_selected;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_draw_unselected;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_selected_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_unselected_color;\n\n\tboost::scoped_ptr<FTFont> m_font;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// point_numbering_painter_factory\n\nk3d::iplugin_factory& point_numbering_painter_factory()\n{\n\treturn point_numbering_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/point_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"colored_selection_painter_gl.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// point_painter\n\nclass point_painter :\n\tpublic colored_selection_painter\n{\n\ttypedef colored_selection_painter base;\n\npublic:\n\tpoint_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!Mesh.points)\n\t\t\treturn;\n\t\tif(!Mesh.point_selection)\n\t\t\treturn;\n\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\tconst k3d::mesh::selection_t& point_selection = *Mesh.point_selection;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglDisable(GL_LIGHTING);\n\n\t\tconst k3d::color color = RenderState.node_selection ? selected_mesh_color() : unselected_mesh_color(RenderState.parent_selection);\n\t\tconst k3d::color selected_color = RenderState.show_component_selection ? selected_component_color() : color;\n\n\t\tglBegin(GL_POINTS);\n\t\tconst k3d::uint_t point_begin = 0;\n\t\tconst k3d::uint_t point_end = points.size();\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tk3d::gl::color3d(point_selection[point] ? selected_color : color);\n\t\t\tk3d::gl::vertex3d(points[point]);\n\t\t}\n\t\tglEnd();\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::POINT))\n\t\t\treturn;\n\n\t\tif(!Mesh.points)\n\t\t\treturn;\n\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglDisable(GL_LIGHTING);\n\n\t\tconst k3d::uint_t point_begin = 0;\n\t\tconst k3d::uint_t point_end = points.size();\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tk3d::gl::push_selection_token(k3d::selection::POINT, point);\n\n\t\t\tglBegin(GL_POINTS);\n\t\t\tk3d::gl::vertex3d(points[point]);\n\t\t\tglEnd();\n\n\t\t\tk3d::gl::pop_selection_token(); // k3d::selection::POINT\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<point_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xad24a631, 0xacbd4af1, 0xbd6d6362, 0x75c3d5d7),\n\t\t\t\"OpenGLPointPainter\",\n\t\t\t_(\"Renders mesh points\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// point_painter_factory\n\nk3d::iplugin_factory& point_painter_factory()\n{\n\treturn point_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/sphere_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/sphere.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sphere_painter\n\nclass sphere_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tsphere_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.8, 0.8, 0.8);\n\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::sphere::const_primitive> sphere(k3d::sphere::validate(Mesh, **primitive));\n\t\t\tif(!sphere)\n\t\t\t\tcontinue;\n\n\t\t\tglPolygonOffset(1.0, 1.0);\n\t\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\t\tglEnable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != sphere->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, sphere->selections[i] ? selected_color : color);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(sphere->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, sphere->radii[i], sphere->z_min[i], sphere->z_max[i], sphere->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::SURFACE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::sphere::const_primitive> sphere(k3d::sphere::validate(Mesh, **primitive));\n\t\t\tif(!sphere)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != sphere->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::SURFACE, i);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(sphere->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, sphere->radii[i], sphere->z_min[i], sphere->z_max[i], sphere->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\n\t\t\t\tk3d::gl::pop_selection_token(); // SURFACE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tvoid draw_solid(const k3d::gl::render_state& State, const k3d::double_t Radius, const k3d::double_t ZMin, const k3d::double_t ZMax, const k3d::double_t SweepAngle)\n\t{\n\t\tif(!Radius)\n\t\t\treturn;\n\n\t\tconst k3d::double_t zmin = ZMin;\n\t\tconst k3d::double_t zmax = ZMax;\n\t\tconst k3d::double_t thetamax = SweepAngle;\n\n\t\tconst k3d::double_t phimin = (zmin > -1) ? asin(zmin) : -k3d::pi_over_2();\n\t\tconst k3d::double_t phimax = (zmax < 1) ? asin(zmax) : k3d::pi_over_2();\n\n\t\tk3d::mesh::knots_t v_knots;\n\t\tk3d::mesh::weights_t v_weights;\n\t\tk3d::mesh::points_t v_arc_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(0, 1, 0), k3d::vector3(0, 0, 1), phimin, phimax, 2, v_knots, v_weights, v_arc_points);\n\n\t\tk3d::mesh::knots_t u_knots;\n\t\tk3d::mesh::weights_t u_weights;\n\t\tk3d::mesh::points_t u_arc_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, thetamax, 4, u_knots, u_weights, u_arc_points);\n\n\t\tstd::vector<GLfloat> gl_u_knot_vector(u_knots.begin(), u_knots.end());\n\t\tstd::vector<GLfloat> gl_v_knot_vector(v_knots.begin(), v_knots.end());\n\t\tstd::vector<GLfloat> gl_control_points;\n\n\t\tfor(k3d::uint_t v = 0; v != v_arc_points.size(); ++v)\n\t\t{\n\t\t\tconst k3d::point3 offset = v_arc_points[v][2] * k3d::point3(0, 0, 1);\n\t\t\tconst k3d::double_t radius2 = v_arc_points[v][1];\n\t\t\tconst k3d::double_t v_weight = v_weights[v];\n\n\t\t\tfor(k3d::uint_t u = 0; u != u_arc_points.size(); ++u)\n\t\t\t{\n\t\t\t\tgl_control_points.push_back(v_weight * u_weights[u] * (radius2 * u_arc_points[u][0] + offset[0]));\n\t\t\t\tgl_control_points.push_back(v_weight * u_weights[u] * (radius2 * u_arc_points[u][1] + offset[1]));\n\t\t\t\tgl_control_points.push_back(v_weight * u_weights[u] * (radius2 * u_arc_points[u][2] + offset[2]));\n\t\t\t\tgl_control_points.push_back(v_weight * u_weights[u]);\n\t\t\t}\n\t\t}\n\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::scale3(Radius));\n\n\t\tGLUnurbsObj* const nurbs_renderer = gluNewNurbsRenderer();\n\n\t\t// Important!  We load our own matrices for efficiency (saves round-trips to the server) and to prevent problems with selection\n\t\tgluNurbsProperty(nurbs_renderer, GLU_AUTO_LOAD_MATRIX, GL_FALSE);\n\t\tgluNurbsProperty(nurbs_renderer, GLU_CULLING, GL_TRUE);\n\t\tGLfloat gl_modelview_matrix[16];\n\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\tgluLoadSamplingMatrices(nurbs_renderer, gl_modelview_matrix, State.gl_projection_matrix, State.gl_viewport);\n\n\t\tgluBeginSurface(nurbs_renderer);\n\t\tgluNurbsSurface(nurbs_renderer, gl_u_knot_vector.size(), &gl_u_knot_vector[0], gl_v_knot_vector.size(), &gl_v_knot_vector[0], 4, 36, &gl_control_points[0], 3, 3, GL_MAP2_VERTEX_4);\n\t\tgluEndSurface(nurbs_renderer);\n\n\t\tgluDeleteNurbsRenderer(nurbs_renderer);\n\n\t\tglPopMatrix();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sphere_painter, k3d::interface_list<k3d::gl::imesh_painter> > factory(\n\t\t\tk3d::uuid(0xe22923fa, 0x5146fa44, 0x0b6ff7b2, 0x3f71ad6e),\n\t\t\t\"OpenGLSpherePainter\",\n\t\t\t_(\"Renders sphere primitives using OpoenGL\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// sphere_painter_factory\n\nk3d::iplugin_factory& sphere_painter_factory()\n{\n\treturn sphere_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/teapot_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/teapot.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// teapot_painter\n\nclass teapot_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tteapot_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.8, 0.8, 0.8);\n\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::teapot::const_primitive> teapot(k3d::teapot::validate(Mesh, **primitive));\n\t\t\tif(!teapot)\n\t\t\t\tcontinue;\n\n\t\t\tglPolygonOffset(1.0, 1.0);\n\t\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\t\tglEnable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != teapot->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, teapot->selections[i] ? selected_color : color);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(teapot->matrices[i]);\n\t\t\t\tglCallList(get_solid_display_list());\n\t\t\t\tglPopMatrix();\n\t\t\t}\n\n\t\t\tif(RenderState.node_selection)\n\t\t\t{\n\t\t\t\tglDisable(GL_LIGHTING);\n\t\t\t\tglColor3d(1, 1, 1);\n\n\t\t\t\tfor(k3d::uint_t i = 0; i != teapot->matrices.size(); ++i)\n\t\t\t\t{\n\t\t\t\t\tglPushMatrix();\n\t\t\t\t\tk3d::gl::push_matrix(teapot->matrices[i]);\n\t\t\t\t\tglCallList(get_wireframe_display_list());\n\t\t\t\t\tglPopMatrix();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::SURFACE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::teapot::const_primitive> teapot(k3d::teapot::validate(Mesh, **primitive));\n\t\t\tif(!teapot)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != teapot->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::SURFACE, i);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(teapot->matrices[i]);\n\t\t\t\tglCallList(get_solid_display_list());\n\t\t\t\tglPopMatrix();\n\n\t\t\t\tk3d::gl::pop_selection_token(); // SURFACE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tGLuint get_solid_display_list()\n\t{\n\t\tstatic GLuint result = 0;\n\t\tif(!result)\n\t\t{\n\t\t\tresult = glGenLists(1);\n\t\t\tglNewList(result, GL_COMPILE);\n\n\t\t\tglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\t\t\tglDisable(GL_TEXTURE_1D);\n\t\t\tglDisable(GL_TEXTURE_2D);\n\t\t\tfor (int i=0; i<32; i++)\n\t\t\t{\n\t\t\t\tfor (double x=0.0; x<1; x+=0.2)\n\t\t\t\t{\n\t\t\t\t\tfor (double y=0.0; y<1; y+=0.2)\n\t\t\t\t\t{\n\t\t\t\t\t\tglBegin(GL_POLYGON); //triangular polygons, \"top\" row\n\t\t\t\t\t\t\tglNormal3dv(teapotNormal(x,y,i).n);\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x,y,i).n);\n\t\t\t\t\t\t\tglNormal3dv(teapotNormal(x+0.2,y,i).n);\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x+0.2,y,i).n);\n\t\t\t\t\t\t\tglNormal3dv(teapotNormal(x,y+0.2,i).n);\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x,y+0.2,i).n);\n\t\t\t\t\t\tglEnd();\n\n\t\t\t\t\t\tglBegin(GL_POLYGON); //fill up the triangles missed by the other part\n\t\t\t\t\t\t\tglNormal3dv(teapotNormal(x+0.2,y,i).n);\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x+0.2,y,i).n);\n\t\t\t\t\t\t\tglNormal3dv(teapotNormal(x+0.2,y+0.2,i).n);\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x+0.2,y+0.2,i).n);\n\t\t\t\t\t\t\tglNormal3dv(teapotNormal(x,y+0.2,i).n);\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x,y+0.2,i).n);\n\t\t\t\t\t\tglEnd();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tglEndList();\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tGLuint get_wireframe_display_list()\n\t{\n\t\tstatic GLuint result = 0;\n\t\tif(!result)\n\t\t{\n\t\t\tresult = glGenLists(1);\n\t\t\tglNewList(result, GL_COMPILE);\n\n\t\t\tfor (int i=0; i<32; i++)\n\t\t\t{\n\t\t\t\tfor (double x=0.0; x<1; x+=0.2)\n\t\t\t\t{\n\t\t\t\t\tfor (double y=0.0; y<1; y+=0.2)\n\t\t\t\t\t{\n\t\t\t\t\t\tglBegin(GL_LINES); //triangular polygons, \"top\" row\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x,y,i).n);\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x+0.2,y,i).n);\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x,y+0.2,i).n);\n\t\t\t\t\t\tglEnd();\n\n\t\t\t\t\t\tglBegin(GL_LINES); //fill up the triangles missed by the other part\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x+0.2,y,i).n);\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x+0.2,y+0.2,i).n);\n\t\t\t\t\t\t\tglVertex3dv(teapotPoint(x,y+0.2,i).n);\n\t\t\t\t\t\tglEnd();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tglEndList();\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tk3d::point3 bezierInterp(double t, const k3d::point3 &v0, const k3d::point3 &v1, const k3d::point3 &v2, const k3d::point3 &v3)\n\t{\n\t\t//return the coordinates of the point at position t on a bezier curve with 4 control points\n\t\tdouble B0 = (1-t)*(1-t)*(1-t);\n\t\tdouble B1 = 3*t*(1-t)*(1-t);\n\t\tdouble B2 = 3*t*t*(1-t);\n\t\tdouble B3 = t*t*t;\n\t\tk3d::point3 a = v0*B0;\n\t\tk3d::point3 b = v1*B1;\n\t\tk3d::point3 c = v2*B2;\n\t\tk3d::point3 d = v3*B3;\n\t\tk3d::point3 res = a+b;\n\t\tres+=k3d::to_vector(c);\n\t\tres+=k3d::to_vector(d);\n\t\treturn res; //errors if done in one line (?)\n\t}\n\n\tk3d::point3 teapotPoint(double x, double y, int patch)\n\t{\n\t\t//returns a point on the teapot\n\t\tk3d::point3 ypoints[4];\n\t\tfor(int i = 0; i < 4; i++)\n\t\t{\n\t\t\tk3d::point3 v0(teapot_points[teapot_patches[patch][4*i]]);\n\t\t\tk3d::point3 v1(teapot_points[teapot_patches[patch][4*i+1]]);\n\t\t\tk3d::point3 v2(teapot_points[teapot_patches[patch][4*i+2]]);\n\t\t\tk3d::point3 v3(teapot_points[teapot_patches[patch][4*i+3]]);\n\t\t\typoints[i]=bezierInterp(x,v0,v1,v2,v3);\n\t\t}\n\n\t\treturn bezierInterp(y,ypoints[0],ypoints[1],ypoints[2],ypoints[3]);\n\t}\n\n\tk3d::vector3 teapotNormal(double x_in, double y_in, int patch)\n\t{\n\t\t//returns a normal vector on the teapot\n\t\tdouble prec = 0.001; //length of the vectors used to calculate the normals\n\t\tdouble x = x_in;\n\t\tdouble y = y_in;\n\t\t//lid has a path consisting of 4 identical points, so calculating the normal will fail using the standard method:\n\t\tif(teapotPoint(0,y,patch) == teapotPoint(1,y,patch))\n\t\t\treturn k3d::vector3(0,0,1); //normal for the knob on top of the lid\n\t\t//make sure we never go outside [0,1] for x and y:\n\t\tif(x >= 1-prec)\n\t\t\tx -= prec;\n\t\tif(y >= 1-prec)\n\t\t\ty -= prec;\n\t\t//cross product of two short vectors through the point should be a good approximation of the normal:\n\t\treturn (teapotPoint(x+prec,y,patch) - teapotPoint(x,y,patch)) ^ (teapotPoint(x,y+prec,patch) - teapotPoint(x,y,patch));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<teapot_painter, k3d::interface_list<k3d::gl::imesh_painter> > factory(\n\t\t\tk3d::uuid(0xaa87fdcc, 0xfc47c821, 0x87d74dad, 0xf1f9f833),\n\t\t\t\"OpenGLTeapotPainter\",\n\t\t\t_(\"Renders teapot primitives using OpoenGL\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\n\tstatic const k3d::teapot::points_array_t& teapot_points;\n\tstatic const k3d::teapot::patches_array_t& teapot_patches;\n};\n\nconst k3d::teapot::points_array_t& teapot_painter::teapot_points = k3d::teapot::points();\nconst k3d::teapot::patches_array_t& teapot_painter::teapot_patches = k3d::teapot::patches();\n\n/////////////////////////////////////////////////////////////////////////////\n// teapot_painter_factory\n\nk3d::iplugin_factory& teapot_painter_factory()\n{\n\treturn teapot_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/torus_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/painter_selection_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/torus.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// torus_painter\n\nclass torus_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\ttorus_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tconst k3d::color color = RenderState.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.8, 0.8, 0.8);\n\t\tconst k3d::color selected_color = RenderState.show_component_selection ? k3d::color(1, 0, 0) : color;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::torus::const_primitive> torus(k3d::torus::validate(Mesh, **primitive));\n\t\t\tif(!torus)\n\t\t\t\tcontinue;\n\n\t\t\tglPolygonOffset(1.0, 1.0);\n\t\t\tglEnable(GL_POLYGON_OFFSET_FILL);\n\t\t\tglEnable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != torus->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, torus->selections[i] ? selected_color : color);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(torus->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, torus->major_radii[i], torus->minor_radii[i], torus->phi_min[i], torus->phi_max[i], torus->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!SelectionState.select_component.count(k3d::selection::SURFACE))\n\t\t\treturn;\n\n\t\tk3d::uint_t primitive_index = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive, ++primitive_index)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::torus::const_primitive> torus(k3d::torus::validate(Mesh, **primitive));\n\t\t\tif(!torus)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::gl::push_selection_token(k3d::selection::PRIMITIVE, primitive_index);\n\n\t\t\tglDisable(GL_LIGHTING);\n\n\t\t\tglMatrixMode(GL_MODELVIEW);\n\t\t\tfor(k3d::uint_t i = 0; i != torus->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tk3d::gl::push_selection_token(k3d::selection::SURFACE, i);\n\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(torus->matrices[i]);\n\t\t\t\tdraw_solid(RenderState, torus->major_radii[i], torus->minor_radii[i], torus->phi_min[i], torus->phi_max[i], torus->sweep_angles[i]);\n\t\t\t\tglPopMatrix();\n\n\t\t\t\tk3d::gl::pop_selection_token(); // SURFACE\n\t\t\t}\n\n\t\t\tk3d::gl::pop_selection_token(); // PRIMITIVE\n\t\t}\n\t}\n\n\tvoid draw_solid(const k3d::gl::render_state& State, const k3d::double_t MajorRadius, const k3d::double_t MinorRadius, const k3d::double_t PhiMin, const k3d::double_t PhiMax, const k3d::double_t SweepAngle)\n\t{\n\t\tif(!MajorRadius)\n\t\t\treturn;\n\t\tif(!MinorRadius)\n\t\t\treturn;\n\n\t\tk3d::mesh::knots_t v_knots;\n\t\tk3d::mesh::weights_t v_weights;\n\t\tk3d::mesh::points_t v_arc_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(0, 1, 0), k3d::vector3(0, 0, 1), PhiMin, PhiMax, 4, v_knots, v_weights, v_arc_points);\n\n\t\tk3d::mesh::knots_t u_knots;\n\t\tk3d::mesh::weights_t u_weights;\n\t\tk3d::mesh::points_t u_arc_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(1, 0, 0), k3d::vector3(0, 1, 0), 0, SweepAngle, 4, u_knots, u_weights, u_arc_points);\n\n\t\tstd::vector<GLfloat> gl_u_knot_vector(u_knots.begin(), u_knots.end());\n\t\tstd::vector<GLfloat> gl_v_knot_vector(v_knots.begin(), v_knots.end());\n\t\tstd::vector<GLfloat> gl_control_points;\n\n\t\tfor(k3d::uint_t v = 0; v != v_arc_points.size(); ++v)\n\t\t{\n\t\t\tconst k3d::point3 offset = MinorRadius * v_arc_points[v][2] * k3d::point3(0, 0, 1);\n\t\t\tconst k3d::double_t radius2 = MajorRadius + (MinorRadius * v_arc_points[v][1]);\n\t\t\tconst k3d::double_t v_weight = v_weights[v];\n\n\t\t\tfor(k3d::uint_t u = 0; u != u_arc_points.size(); ++u)\n\t\t\t{\n\t\t\t\tgl_control_points.push_back(v_weight * u_weights[u] * (radius2 * u_arc_points[u][0] + offset[0]));\n\t\t\t\tgl_control_points.push_back(v_weight * u_weights[u] * (radius2 * u_arc_points[u][1] + offset[1]));\n\t\t\t\tgl_control_points.push_back(v_weight * u_weights[u] * (radius2 * u_arc_points[u][2] + offset[2]));\n\t\t\t\tgl_control_points.push_back(v_weight * u_weights[u]);\n\t\t\t}\n\t\t}\n\n\t\tGLUnurbsObj* const nurbs_renderer = gluNewNurbsRenderer();\n\n\t\t// Important!  We load our own matrices for efficiency (saves round-trips to the server) and to prevent problems with selection\n\t\tgluNurbsProperty(nurbs_renderer, GLU_AUTO_LOAD_MATRIX, GL_FALSE);\n\t\tgluNurbsProperty(nurbs_renderer, GLU_CULLING, GL_TRUE);\n\t\tGLfloat gl_modelview_matrix[16];\n\t\tglGetFloatv(GL_MODELVIEW_MATRIX, gl_modelview_matrix);\n\t\tgluLoadSamplingMatrices(nurbs_renderer, gl_modelview_matrix, State.gl_projection_matrix, State.gl_viewport);\n\n\t\tgluBeginSurface(nurbs_renderer);\n\t\tgluNurbsSurface(nurbs_renderer, gl_u_knot_vector.size(), &gl_u_knot_vector[0], gl_v_knot_vector.size(), &gl_v_knot_vector[0], 4, 36, &gl_control_points[0], 3, 3, GL_MAP2_VERTEX_4);\n\t\tgluEndSurface(nurbs_renderer);\n\n\t\tgluDeleteNurbsRenderer(nurbs_renderer);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<torus_painter, k3d::interface_list<k3d::gl::imesh_painter> > factory(\n\t\t\tk3d::uuid(0x271118dd, 0x2a47903b, 0xf36b96b8, 0xf6916c27),\n\t\t\t\"OpenGLTorusPainter\",\n\t\t\t_(\"Renders torus primitives using OpenGL\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// torus_painter_factory\n\nk3d::iplugin_factory& torus_painter_factory()\n{\n\treturn torus_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/utility.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file utility.cpp\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n\t\t\\created May 4, 2009\n*/\n\n#include \"utility.h\"\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nk3d::bool_t has_non_empty_polyhedra(const k3d::mesh& Mesh)\n{\n\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t{\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\tif(polyhedron.get() && polyhedron->face_first_loops.size())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nk3d::bool_t has_non_sds_polyhedra(const k3d::mesh& Mesh)\n{\n\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t{\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\tif(polyhedron.get() && !k3d::polyhedron::is_sds(*polyhedron) && polyhedron->face_first_loops.size())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nk3d::bool_t has_sds_polyhedra(const k3d::mesh& Mesh)\n{\n\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t{\n\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\tif(polyhedron.get() && k3d::polyhedron::is_sds(*polyhedron) && polyhedron->face_first_loops.size())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n"
  },
  {
    "path": "modules/reference_opengl_painters/utility.h",
    "content": "#ifndef MODULES_REFERENCE_OPENGL_PAINTERS_UTILITY_H\n#define MODULES_REFERENCE_OPENGL_PAINTERS_UTILITY_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\n/// Returns true if the given mesh contains non-empty polyhedra\nk3d::bool_t has_non_empty_polyhedra(const k3d::mesh& Mesh);\n\n/// Returns true if the given mesh contains non-SDS polyhedra\nk3d::bool_t has_non_sds_polyhedra(const k3d::mesh& Mesh);\n\n/// Returns true if the given mesh contains SDS polyhedra\nk3d::bool_t has_sds_polyhedra(const k3d::mesh& Mesh);\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n#endif // !MODULES_REFERENCE_OPENGL_PAINTERS_UTILITY_H\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/varying_data_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include \"utility.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/named_arrays.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/share.h>\n\n#include <FTGL/ftgl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nnamespace detail\n{\n\ntypedef std::vector<k3d::string_t> strings_t;\n\n/// Converts the named array with the given name to an array of strings\ntemplate<typename ArrayT>\nvoid named_array_to_strings(const k3d::mesh::table_t& Arrays, const k3d::string_t& ArrayName, strings_t& StringArray)\n{\n\tconst ArrayT* array = Arrays.lookup<ArrayT>(ArrayName);\n\tif (!array)\n\t\treturn;\n\t\n\tconst k3d::uint_t array_size = array->size();\n\tStringArray.resize(array_size);\n\tfor(k3d::uint_t i = 0; i != array_size; ++i)\n\t{\n\t\tStringArray[i] = k3d::string_cast(array->at(i));\n\t}\n}\n\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// varying_data_painter\n\nclass varying_data_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tvarying_data_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(k3d::share_path() / k3d::filesystem::generic_path(\"fonts/VeraBd.ttf\")) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_font_size(init_owner(*this) + init_name(\"font_size\") + init_label(_(\"Font Size\")) + init_description(_(\"Font size.\")) + init_value(14.0)),\n\t\tm_antialias(init_owner(*this) + init_name(\"antialias\") + init_label(_(\"Font Antialiasing\")) + init_description(_(\"Render antialiased text.\")) + init_value(true)),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Color of the text\")) + init_value(k3d::color(0, 1, 0))),\n\t\tm_edge_offset(init_owner(*this) + init_name(\"edge_offset\") + init_label(_(\"Edge Offset\")) + init_description(_(\"Offsets numbers away from their edges.\")) + init_value(0.5)),\n\t\tm_face_offset(init_owner(*this) + init_name(\"face_offset\") + init_label(_(\"Face Offset\")) + init_description(_(\"Offsets numbers away from their polygons.\")) + init_value(0.2)),\n\t\tm_array_name(init_owner(*this) + init_name(\"array_name\") + init_label(_(\"Array Name\")) + init_description(_(\"Specifies the array to draw\")) + init_value(std::string(\"Cs\")))\n\t{\n\t\tm_font_path.changed_signal().connect(sigc::mem_fun(*this, &varying_data_painter::on_font_changed));\n\t\tm_font_size.changed_signal().connect(sigc::mem_fun(*this, &varying_data_painter::on_font_changed));\n\t\tm_antialias.changed_signal().connect(sigc::mem_fun(*this, &varying_data_painter::on_font_changed));\n\t\tm_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_edge_offset.changed_signal().connect(make_async_redraw_slot());\n\t\tm_face_offset.changed_signal().connect(make_async_redraw_slot());\n\t\tm_array_name.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_font_changed(k3d::ihint*)\n\t{\n\t\tm_font.reset();\n\t\tasync_redraw(0);\n\t}\n\n\tvoid draw(const k3d::mesh::indices_t& FaceFirstLoops, const k3d::mesh::counts_t& FaceLoopCounts, const k3d::mesh::indices_t& LoopFirstEdges, const k3d::mesh::indices_t& EdgePoints, const k3d::mesh::indices_t& ClockwiseEdges, const k3d::mesh::points_t& Points, const k3d::mesh::normals_t& FaceNormals, const k3d::color& Color, const k3d::double_t EdgeOffset, const k3d::double_t FaceOffset, FTFont& Font, const detail::strings_t StringArray)\n\t{\n\t\tk3d::gl::color3d(Color);\n\n\t\tconst size_t face_begin = 0;\n\t\tconst size_t face_end = face_begin + FaceFirstLoops.size();\n\t\tfor(size_t face = face_begin; face != face_end; ++face)\n\t\t{\n\t\t\tconst size_t loop_begin = FaceFirstLoops[face];\n\t\t\tconst size_t loop_end = loop_begin + FaceLoopCounts[face];\n\t\t\tfor(size_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t{\n\t\t\t\tconst size_t first_edge = LoopFirstEdges[loop];\n\t\t\t\tfor(size_t edge = first_edge; ; )\n\t\t\t\t{\n\t\t\t\t\tconst k3d::point3 vertex1 = Points[EdgePoints[edge]];\n\t\t\t\t\tconst k3d::point3 vertex2 = Points[EdgePoints[ClockwiseEdges[edge]]];\n\t\t\t\t\tconst k3d::vector3 edge_vector = vertex2 - vertex1;\n\n\t\t\t\t\tconst k3d::point3 position = vertex1 + (0.5 * edge_vector) + (EdgeOffset * k3d::normalize(FaceNormals[face] ^ edge_vector)) + (FaceOffset * k3d::to_vector(k3d::normalize(FaceNormals[face])));\n\n\t\t\t\t\tglRasterPos3d(position[0], position[1], position[2]);\n\t\t\t\t\tif(edge < StringArray.size())\n\t\t\t\t\t\tFont.Render(StringArray[edge].c_str());\n\n\t\t\t\t\tedge = ClockwiseEdges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!has_non_empty_polyhedra(Mesh))\n\t\t\treturn;\n\n\t\tif(!m_font)\n\t\t{\n\t\t\tif(m_antialias.pipeline_value())\n\t\t\t\tm_font.reset(new FTPixmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\t\t\telse\n\t\t\t\tm_font.reset(new FTBitmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\n\t\t\tm_font->FaceSize(static_cast<unsigned int>(m_font_size.pipeline_value()));\n\t\t\tm_font->UseDisplayList(true);\n\t\t\tif(m_font->Error())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"error initializing font\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst k3d::double_t edge_offset = m_edge_offset.pipeline_value();\n\t\tconst k3d::double_t face_offset = m_face_offset.pipeline_value();\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\tconst k3d::mesh::indices_t& face_first_loops = polyhedron->face_first_loops;\n\t\t\tconst k3d::mesh::counts_t& face_loop_counts = polyhedron->face_loop_counts;\n\t\t\tconst k3d::mesh::indices_t& loop_first_edges = polyhedron->loop_first_edges;\n\t\t\tconst k3d::mesh::indices_t& clockwise_edges = polyhedron->clockwise_edges;\n\t\t\tconst k3d::mesh::indices_t& vertex_points = polyhedron->vertex_points;\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tconst size_t face_count = face_first_loops.size();\n\t\n\t\t\t// Calculate face normals ...\n\t\t\tk3d::typed_array<k3d::normal3> normals(face_count);\n\t\t\tfor(size_t face = 0; face != face_count; ++face)\n\t\t\t\tnormals[face] = k3d::polyhedron::normal(vertex_points, clockwise_edges, points, loop_first_edges[face_first_loops[face]]);\n\t\n\t\t\tk3d::gl::store_attributes attributes;\n\t\t\tglDisable(GL_LIGHTING);\n\t\t\t\n\t\t\t// Try some different types for the array to print\n\t\t\tconst k3d::string_t array_name = m_array_name.pipeline_value();\n\t\t\tdetail::strings_t string_array;\n\t\t\tdetail::named_array_to_strings<k3d::mesh::colors_t>(polyhedron->edge_attributes, array_name, string_array);\n\t\t\tdetail::named_array_to_strings<k3d::mesh::normals_t>(polyhedron->edge_attributes, array_name, string_array);\n\t\t\tdetail::named_array_to_strings<k3d::mesh::indices_t>(polyhedron->edge_attributes, array_name, string_array);\n\t\t\tdetail::named_array_to_strings<k3d::mesh::weights_t>(polyhedron->edge_attributes, array_name, string_array);\n\t\t\t\n\t\t\tdraw(face_first_loops, face_loop_counts, loop_first_edges, vertex_points, clockwise_edges, points, normals, m_color.pipeline_value(), edge_offset, face_offset, *m_font, string_array);\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<varying_data_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x4a155ddc, 0x55436122, 0xaf1892bb, 0xfc5e8241),\n\t\t\t\"OpenGLVaryingDataPainter\",\n\t\t\t_(\"Prints associated varying data near each edge, for debugging purposes\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_font_size;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_antialias;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_edge_offset;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_face_offset;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_array_name;\n\n\tboost::scoped_ptr<FTFont> m_font;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// varying_data_painter_factory\n\nk3d::iplugin_factory& varying_data_painter_factory()\n{\n\treturn varying_data_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/reference_opengl_painters/vertex_data_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"utility.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_painter_gl.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/painter_render_state_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/share.h>\n\n#include <FTGL/ftgl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace opengl\n{\n\nnamespace painters\n{\n\nnamespace detail\n{\n\ntypedef std::vector<k3d::string_t> strings_t;\n\n/// Converts the named array with the given name to an array of strings\ntemplate<typename ArrayT>\nvoid named_array_to_strings(const k3d::mesh::table_t& Arrays, const k3d::string_t& ArrayName, strings_t& StringArray)\n{\n\tconst ArrayT* array = Arrays.lookup<ArrayT>(ArrayName);\n\tif (!array)\n\t\treturn;\n\t\n\tconst k3d::uint_t array_size = array->size();\n\tStringArray.resize(array_size);\n\tfor(k3d::uint_t i = 0; i != array_size; ++i)\n\t{\n\t\tStringArray[i] = k3d::string_cast(array->at(i));\n\t}\n}\n\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// vertex_data_painter\n\nclass vertex_data_painter :\n\tpublic k3d::gl::mesh_painter\n{\n\ttypedef k3d::gl::mesh_painter base;\n\npublic:\n\tvertex_data_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_font_path(init_owner(*this) + init_name(\"font\") + init_label(_(\"Font\")) + init_description(_(\"Font path\")) + init_value(k3d::share_path() / k3d::filesystem::generic_path(\"fonts/VeraBd.ttf\")) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::fonts())),\n\t\tm_font_size(init_owner(*this) + init_name(\"font_size\") + init_label(_(\"Font Size\")) + init_description(_(\"Font size.\")) + init_value(14.0)),\n\t\tm_antialias(init_owner(*this) + init_name(\"antialias\") + init_label(_(\"Font Antialiasing\")) + init_description(_(\"Render antialiased text.\")) + init_value(true)),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Color of the numbers\")) + init_value(k3d::color(0.5, 0, 0))),\n\t\tm_array_name(init_owner(*this) + init_name(\"array_name\") + init_label(_(\"Array Name\")) + init_description(_(\"Specifies the array to draw\")) + init_value(std::string(\"Cs\")))\n\t{\n\t\tm_font_path.changed_signal().connect(sigc::mem_fun(*this, &vertex_data_painter::on_font_changed));\n\t\tm_font_size.changed_signal().connect(sigc::mem_fun(*this, &vertex_data_painter::on_font_changed));\n\t\tm_antialias.changed_signal().connect(sigc::mem_fun(*this, &vertex_data_painter::on_font_changed));\n\t\tm_color.changed_signal().connect(make_async_redraw_slot());\n\t\tm_array_name.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_font_changed(k3d::ihint*)\n\t{\n\t\tm_font.reset();\n\t\tasync_redraw(0);\n\t}\n\t\n\tvoid draw(const k3d::typed_array<k3d::point3>& Points, const k3d::color& Color, FTFont& Font, const detail::strings_t StringArray)\n\t{\n\t\tk3d::gl::color3d(Color);\n\n\t\tconst size_t point_begin = 0;\n\t\tconst size_t point_end = point_begin + Points.size();\n\t\tfor(size_t point = point_begin; point != point_end; ++point)\n\t\t{\n\t\t\tconst k3d::point3 position = Points[point];\n\t\t\tglRasterPos3d(position[0], position[1], position[2]);\n\t\t\tif(point < StringArray.size())\n\t\t\t\tFont.Render(StringArray[point].c_str());\n\t\t}\n\t}\n\n\tvoid on_paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tif(!Mesh.points)\n\t\t\treturn;\n\n\t\tif(!m_font)\n\t\t{\n\t\t\tif(m_antialias.pipeline_value())\n\t\t\t\tm_font.reset(new FTPixmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\t\t\telse\n\t\t\t\tm_font.reset(new FTBitmapFont(m_font_path.pipeline_value().native_filesystem_string().c_str()));\n\n\t\t\tm_font->FaceSize(static_cast<unsigned int>(m_font_size.pipeline_value()));\n\t\t\tm_font->UseDisplayList(true);\n\t\t\tif(m_font->Error())\n\t\t\t{\n\t\t\t\tk3d::log() << error << \"error initializing font\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\tk3d::gl::store_attributes attributes;\n\t\tglDisable(GL_LIGHTING);\n\t\t\n\t\t// Try some different types for the array to print\n\t\tconst k3d::string_t array_name = m_array_name.pipeline_value();\n\t\tdetail::strings_t string_array;\n\t\tdetail::named_array_to_strings<k3d::mesh::colors_t>(Mesh.point_attributes, array_name, string_array);\n\t\tdetail::named_array_to_strings<k3d::mesh::normals_t>(Mesh.point_attributes, array_name, string_array);\n\t\tdetail::named_array_to_strings<k3d::mesh::indices_t>(Mesh.point_attributes, array_name, string_array);\n\t\tdetail::named_array_to_strings<k3d::mesh::weights_t>(Mesh.point_attributes, array_name, string_array);\n\t\tdetail::named_array_to_strings<k3d::mesh::points_t>(Mesh.point_attributes, array_name, string_array);\n\t\tdraw(points, m_color.pipeline_value(), *m_font, string_array);\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<vertex_data_painter, k3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x40dd537a, 0xe84d0fd8, 0x416941a3, 0x719fab2d),\n\t\t\t\"OpenGLVertexDataPainter\",\n\t\t\t_(\"Prints vertex data near each corresponding vertex\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_font_path;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_font_size;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_antialias;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_array_name;\n\n\tboost::scoped_ptr<FTFont> m_font;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// vertex_data_painter_factory\n\nk3d::iplugin_factory& vertex_data_painter_factory()\n{\n\treturn vertex_data_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace opengl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/release/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-release)\nK3D_CREATE_MODULE_PROXY(k3d-release)\n\n"
  },
  {
    "path": "modules/release/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace release\n{\n\nextern k3d::iplugin_factory& welcome_factory();\n\n} // namespace compiz\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::release::welcome_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/release/welcome.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/user_interface.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <stdexcept>\n\nnamespace module\n{\n\nnamespace release\n{\n\nclass welcome :\n\tpublic k3d::iunknown\n{\npublic:\n\twelcome()\n\t{\n\t\tconst k3d::ustring message = k3d::ustring::from_utf8(_(\"Welcome to K-3D Version 0.8!\"));\n\n\t\tconst k3d::ustring secondary_message = k3d::ustring::from_utf8(\n\t\t\t\"It's been a long time since our last official K-3D release - there have been \"\n\t\t\t\"many significant internal changes to K-3D, so some older documents may no longer \"\n\t\t\t\"work.\\n\\nWe're switching to a six-month release cycle for K-3D, so our next \"\n\t\t\t\"release will be in October, 2010.\\n\\nWe hope you enjoy using K-3D, and would love \"\n\t\t\t\"to see what you create!\");\n\n\t\tk3d::user_interface().nag_message(\"Welcome/0.8\", message, secondary_message);\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<welcome,\n\t\t\tk3d::interface_list<k3d::iunknown> > factory(\n\t\t\t\tk3d::uuid(0x12ebafe1, 0x6a41cf73, 0x076b72b5, 0xfad83322),\n\t\t\t\t\"Welcome\",\n\t\t\t\t_(\"Welcomes users running K-3D for the first time.\"),\n\t\t\t\t\"Desktop\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tboost::assign::map_list_of(\"ngui:application-start\", \"true\")(\"qtui:application-start\", \"true\"));\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& welcome_factory()\n{\n\treturn welcome::get_factory();\n}\n\n} // namespace release\n\n} // namespace module\n"
  },
  {
    "path": "modules/renderman/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-renderman)\nK3D_CREATE_MODULE_PROXY(k3d-renderman)\n\n"
  },
  {
    "path": "modules/renderman/area_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/ilight_ri.h>\n#include <k3dsdk/ilight_shader_ri.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/render_state_ri.h>\n#include <k3dsdk/types_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/vectors.h>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// area_light\n\nclass area_light :\n\tpublic k3d::node,\n\tpublic k3d::ri::ilight\n{\n\ttypedef k3d::node base;\n\npublic:\n\tarea_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_shader(init_owner(*this) + init_name(\"shader\") + init_label(_(\"Shader\")) + init_description(_(\"Light shader\")) + init_value<k3d::ri::ilight_shader*>(0)),\n\t\tm_geometry(init_owner(*this) + init_name(\"geometry\") + init_label(_(\"Geometry\")) + init_description(_(\"Geometry\")) + init_value<k3d::ri::irenderable*>(0))\n\t{\n\t}\n\n\tvoid setup_renderman_light(const k3d::ri::render_state& State)\n\t{\n\t\t// If this is a shadow pass, we're done ...\n\t\tif(k3d::ri::SHADOW_MAP == State.render_context)\n\t\t\treturn;\n\n\t\t// We only generate RIB on the last sample ...\n\t\tif(!k3d::ri::last_sample(State))\n\t\t\treturn;\n\n\t\t// If the user hasn't selected a shader, we're done ...\n\t\tk3d::ri::ilight_shader* const shader = m_shader.pipeline_value();\n\t\tif(!shader)\n\t\t\treturn;\n\n\t\t// If the user hasn't selected some geometry, we're done ...\n\t\tk3d::ri::irenderable* const geometry = m_geometry.pipeline_value();\n\t\tif(!geometry)\n\t\t\treturn;\n\n\t\t// Make it happen ...\n\t\tk3d::ri::set_attributes(*this, State.stream);\n\t\tshader->setup_renderman_area_light_shader(State);\n\t\tgeometry->renderman_render(State);\n\t\tState.stream.RiAreaLightSourceV(k3d::ri::path(), \"null\");\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<area_light,\n\t\t\tk3d::interface_list<k3d::ri::ilight> > factory(\n\t\t\tk3d::uuid(0xd7cab1c3, 0x60214984, 0x995601b5, 0x4dc8d62e),\n\t\t\t\"RenderManAreaLight\",\n\t\t\t_(\"RenderMan area light source\"),\n\t\t\t\"RenderMan Light\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::ri::ilight_shader*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_shader;\n\tk3d_data(k3d::ri::irenderable*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_geometry;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// area_light_factory\n\nk3d::iplugin_factory& area_light_factory()\n{\n\treturn area_light::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/array_1d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/ibounded.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/itransform_array_1d.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transformable.h>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// array_1d\n\nclass array_1d :\n\tpublic k3d::material_sink<k3d::gl::renderable<k3d::ri::renderable<k3d::transformable<k3d::node > > > >\n{\n\ttypedef k3d::material_sink<k3d::gl::renderable<k3d::ri::renderable<k3d::transformable<k3d::node > > > > base;\n\npublic:\n\tarray_1d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_source(init_owner(*this) + init_name(\"source\") + init_label(_(\"Source\")) + init_description(_(\"Source\")) + init_value<k3d::ri::irenderable*>(0)),\n\t\tm_layout(init_owner(*this) + init_name(\"layout\") + init_label(_(\"Layout\")) + init_description(_(\"Layout\")) + init_value<k3d::itransform_array_1d*>(0)),\n\t\tm_count(init_owner(*this) + init_name(\"count\") + init_label(_(\"count\")) + init_description(_(\"Count\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(0)) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_source.changed_signal().connect(make_async_redraw_slot());\n\t\tm_layout.changed_signal().connect(make_async_redraw_slot());\n\t\tm_count.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::ibounded* const bounded = dynamic_cast<k3d::ibounded*>(m_source.pipeline_value());\n\t\tk3d::itransform_array_1d* const layout = m_layout.pipeline_value();\n\t\tconst unsigned long count = m_count.pipeline_value();\n\n\t\tif(!layout)\n\t\t\treturn;\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglColor3d(0, 1, 1);\n\n\t\tglBegin(GL_POINTS);\n\t\tfor(unsigned long i = 0; i != count; ++i)\n\t\t{\n\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) * layout->get_element(i, count));\n\t\t}\n\t\tglEnd();\n\n\t\tif(!bounded)\n\t\t\treturn;\n\n\t\tconst k3d::bounding_box3 bounds = bounded->extents();\n\t\tif(bounds.empty())\n\t\t\treturn;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tfor(unsigned long i = 0; i != count; ++i)\n\t\t{\n\t\t\tglPushMatrix();\n\t\t\tk3d::gl::push_matrix(layout->get_element(i, count));\n\t\t\tk3d::gl::draw_bounding_box(bounds);\n\t\t\tglPopMatrix();\n\t\t}\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tdraw(State);\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw(State);\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid on_renderman_render(const k3d::ri::render_state& State)\n\t{\n\t\tk3d::ri::irenderable* const renderable = m_source.pipeline_value();\n\t\tif(!renderable)\n\t\t\treturn;\n\n\t\tk3d::itransform_array_1d* const layout = m_layout.pipeline_value();\n\t\tif(!layout)\n\t\t\treturn;\n\n\t\tconst unsigned long count = m_count.pipeline_value();\n\n\t\t// Make sure we don't enter an infinite loop trying to render ourself ...\n\t\tif(renderable == this)\n\t\t{\n\t\t\tk3d::log() << error << factory().name() << \" [\" << name() << \"] cannot instance itself\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::ri::object_handle handle = State.stream.RiObjectBegin();\n\t\t\tk3d::ri::render_state state(State);\n\t\t\tstate.render_context = k3d::ri::OBJECT_INSTANCE;\n\t\t\trenderable->renderman_render(state);\n\t\tState.stream.RiObjectEnd();\n\n\t\tk3d::ri::setup_material(m_material.pipeline_value(), State);\n\n\t\tfor(unsigned long i = 0; i != count; ++i)\n\t\t{\n\t\t\tState.stream.RiAttributeBegin();\n\t\t\tState.stream.RiConcatTransform(k3d::ri::convert(layout->get_element(i, count)));\n\t\t\tState.stream.RiObjectInstance(handle);\n\t\t\tState.stream.RiAttributeEnd();\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<array_1d > factory(\n\t\t\t\tk3d::uuid(0x714f0863, 0x6af8447f, 0x9d5a556c, 0x5e2f6940),\n\t\t\t\t\"RenderManArray1D\",\n\t\t\t\t_(\"Renders a one-dimensional array of geometric object instances\"),\n\t\t\t\t\"RenderMan Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::ri::irenderable*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_source;\n\tk3d_data(k3d::itransform_array_1d*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_layout;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// array_1d_factory\n\nk3d::iplugin_factory& array_1d_factory()\n{\n\treturn array_1d::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/array_2d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/ibounded.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/itransform_array_2d.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transformable.h>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// array_2d\n\nclass array_2d :\n\tpublic k3d::material_sink<k3d::gl::renderable<k3d::ri::renderable<k3d::transformable<k3d::node > > > >\n{\n\ttypedef k3d::material_sink<k3d::gl::renderable<k3d::ri::renderable<k3d::transformable<k3d::node > > > > base;\n\npublic:\n\tarray_2d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_source(init_owner(*this) + init_name(\"source\") + init_label(_(\"Source\")) + init_description(_(\"Source\")) + init_value<k3d::ri::irenderable*>(0)),\n\t\tm_layout(init_owner(*this) + init_name(\"layout\") + init_label(_(\"Layout\")) + init_description(_(\"Layout\")) + init_value<k3d::itransform_array_2d*>(0)),\n\t\tm_count1(init_owner(*this) + init_name(\"count1\") + init_label(_(\"Count 1\")) + init_description(_(\"Dimension 1 Count\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(0)) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_count2(init_owner(*this) + init_name(\"count2\") + init_label(_(\"Count 2\")) + init_description(_(\"Dimension 2 Count\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(0)) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_source.changed_signal().connect(make_async_redraw_slot());\n\t\tm_layout.changed_signal().connect(make_async_redraw_slot());\n\t\tm_count1.changed_signal().connect(make_async_redraw_slot());\n\t\tm_count2.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::ibounded* const bounded = dynamic_cast<k3d::ibounded*>(m_source.pipeline_value());\n\t\tk3d::itransform_array_2d* const layout = m_layout.pipeline_value();\n\t\tconst unsigned long count1 = m_count1.pipeline_value();\n\t\tconst unsigned long count2 = m_count2.pipeline_value();\n\n\t\tif(!layout)\n\t\t\treturn;\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglColor3d(0, 1, 1);\n\n\t\tglBegin(GL_POINTS);\n\t\tfor(unsigned long i = 0; i != count1; ++i)\n\t\t{\n\t\t\tfor(unsigned long j = 0; j != count2; ++j)\n\t\t\t{\n\t\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) * layout->get_element(i, count1, j, count2));\n\t\t\t}\n\t\t}\n\t\tglEnd();\n\n\t\tif(!bounded)\n\t\t\treturn;\n\n\t\tconst k3d::bounding_box3 bounds = bounded->extents();\n\t\tif(bounds.empty())\n\t\t\treturn;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tfor(unsigned long i = 0; i != count1; ++i)\n\t\t{\n\t\t\tfor(unsigned long j = 0; j != count2; ++j)\n\t\t\t{\n\t\t\t\tglPushMatrix();\n\t\t\t\tk3d::gl::push_matrix(layout->get_element(i, count1, j, count2));\n\t\t\t\tk3d::gl::draw_bounding_box(bounds);\n\t\t\t\tglPopMatrix();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tdraw(State);\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw(State);\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid on_renderman_render(const k3d::ri::render_state& State)\n\t{\n\t\tk3d::ri::irenderable* const renderable = m_source.pipeline_value();\n\t\tif(!renderable)\n\t\t\treturn;\n\n\t\tk3d::itransform_array_2d* const layout = m_layout.pipeline_value();\n\t\tif(!layout)\n\t\t\treturn;\n\n\t\tconst unsigned long count1 = m_count1.pipeline_value();\n\t\tconst unsigned long count2 = m_count2.pipeline_value();\n\n\t\t// Make sure we don't enter an infinite loop trying to render ourself ...\n\t\tif(renderable == this)\n\t\t{\n\t\t\tk3d::log() << error << factory().name() << \" [\" << name() << \"] cannot instance itself\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::ri::object_handle handle = State.stream.RiObjectBegin();\n\t\t\tk3d::ri::render_state state(State);\n\t\t\tstate.render_context = k3d::ri::OBJECT_INSTANCE;\n\t\t\trenderable->renderman_render(state);\n\t\tState.stream.RiObjectEnd();\n\n\t\tk3d::ri::setup_material(m_material.pipeline_value(), State);\n\n\t\tfor(unsigned long i = 0; i != count1; ++i)\n\t\t{\n\t\t\tfor(unsigned long j = 0; j != count2; ++j)\n\t\t\t{\n\t\t\t\tState.stream.RiAttributeBegin();\n\t\t\t\tState.stream.RiConcatTransform(k3d::ri::convert(layout->get_element(i, count1, j, count2)));\n\t\t\t\tState.stream.RiObjectInstance(handle);\n\t\t\t\tState.stream.RiAttributeEnd();\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<array_2d > factory(\n\t\t\t\tk3d::uuid(0x5a7881eb, 0xf8e14075, 0x977fe1fb, 0x2036f517),\n\t\t\t\t\"RenderManArray2D\",\n\t\t\t\t_(\"Renders a two-dimensional array of geometric object instances\"),\n\t\t\t\t\"RenderMan Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::ri::irenderable*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_source;\n\tk3d_data(k3d::itransform_array_2d*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_layout;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count1;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count2;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// array_2d_factory\n\nk3d::iplugin_factory& array_2d_factory()\n{\n\treturn array_2d::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/array_3d.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/ibounded.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/itransform_array_3d.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transformable.h>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// array_3d\n\nclass array_3d :\n\tpublic k3d::material_sink<k3d::gl::renderable<k3d::ri::renderable<k3d::transformable<k3d::node > > > >\n{\n\ttypedef k3d::material_sink<k3d::gl::renderable<k3d::ri::renderable<k3d::transformable<k3d::node > > > > base;\n\npublic:\n\tarray_3d(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_source(init_owner(*this) + init_name(\"source\") + init_label(_(\"Source\")) + init_description(_(\"Source\")) + init_value<k3d::ri::irenderable*>(0)),\n\t\tm_layout(init_owner(*this) + init_name(\"layout\") + init_label(_(\"Layout\")) + init_description(_(\"Layout\")) + init_value<k3d::itransform_array_3d*>(0)),\n\t\tm_count1(init_owner(*this) + init_name(\"count1\") + init_label(_(\"Count 1\")) + init_description(_(\"Dimension 1 Count\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(0)) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_count2(init_owner(*this) + init_name(\"count2\") + init_label(_(\"Count 2\")) + init_description(_(\"Dimension 2 Count\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(0)) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_count3(init_owner(*this) + init_name(\"count3\") + init_label(_(\"Count 3\")) + init_description(_(\"Dimension 3 Count\")) + init_value(5) + init_constraint(constraint::minimum<k3d::int32_t>(0)) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_source.changed_signal().connect(make_async_redraw_slot());\n\t\tm_layout.changed_signal().connect(make_async_redraw_slot());\n\t\tm_count1.changed_signal().connect(make_async_redraw_slot());\n\t\tm_count2.changed_signal().connect(make_async_redraw_slot());\n\t\tm_count3.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::ibounded* const bounded = dynamic_cast<k3d::ibounded*>(m_source.pipeline_value());\n\t\tk3d::itransform_array_3d* const layout = m_layout.pipeline_value();\n\t\tconst unsigned long count1 = m_count1.pipeline_value();\n\t\tconst unsigned long count2 = m_count2.pipeline_value();\n\t\tconst unsigned long count3 = m_count3.pipeline_value();\n\n\t\tif(!layout)\n\t\t\treturn;\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglColor3d(0, 1, 1);\n\n\t\tglBegin(GL_POINTS);\n\t\tfor(unsigned long i = 0; i != count1; ++i)\n\t\t{\n\t\t\tfor(unsigned long j = 0; j != count2; ++j)\n\t\t\t{\n\t\t\t\tfor(unsigned long k = 0; k != count3; ++k)\n\t\t\t\t{\n\t\t\t\t\tk3d::gl::vertex3d(k3d::point3(0, 0, 0) * layout->get_element(i, count1, j, count2, k, count3));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tglEnd();\n\n\t\tif(!bounded)\n\t\t\treturn;\n\n\t\tconst k3d::bounding_box3 bounds = bounded->extents();\n\t\tif(bounds.empty())\n\t\t\treturn;\n\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tfor(unsigned long i = 0; i != count1; ++i)\n\t\t{\n\t\t\tfor(unsigned long j = 0; j != count2; ++j)\n\t\t\t{\n\t\t\t\tfor(unsigned long k = 0; k != count3; ++k)\n\t\t\t\t{\n\t\t\t\t\tglPushMatrix();\n\t\t\t\t\tk3d::gl::push_matrix(layout->get_element(i, count1, j, count2, k, count3));\n\t\t\t\t\tk3d::gl::draw_bounding_box(bounds);\n\t\t\t\t\tglPopMatrix();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tdraw(State);\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw(State);\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid on_renderman_render(const k3d::ri::render_state& State)\n\t{\n\t\tk3d::ri::irenderable* const renderable = m_source.pipeline_value();\n\t\tif(!renderable)\n\t\t\treturn;\n\n\t\tk3d::itransform_array_3d* const layout = m_layout.pipeline_value();\n\t\tif(!layout)\n\t\t\treturn;\n\n\t\tconst unsigned long count1 = m_count1.pipeline_value();\n\t\tconst unsigned long count2 = m_count2.pipeline_value();\n\t\tconst unsigned long count3 = m_count3.pipeline_value();\n\n\t\t// Make sure we don't enter an infinite loop trying to render ourself ...\n\t\tif(renderable == this)\n\t\t{\n\t\t\tk3d::log() << error << factory().name() << \" [\" << name() << \"] cannot instance itself\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\tconst k3d::ri::object_handle handle = State.stream.RiObjectBegin();\n\t\t\tk3d::ri::render_state state(State);\n\t\t\tstate.render_context = k3d::ri::OBJECT_INSTANCE;\n\t\t\trenderable->renderman_render(state);\n\t\tState.stream.RiObjectEnd();\n\n\t\tk3d::ri::setup_material(m_material.pipeline_value(), State);\n\n\t\tfor(unsigned long i = 0; i != count1; ++i)\n\t\t{\n\t\t\tfor(unsigned long j = 0; j != count2; ++j)\n\t\t\t{\n\t\t\t\tfor(unsigned long k = 0; k != count3; ++k)\n\t\t\t\t{\n\t\t\t\t\tState.stream.RiAttributeBegin();\n\t\t\t\t\tState.stream.RiConcatTransform(k3d::ri::convert(layout->get_element(i, count1, j, count2, k, count3)));\n\t\t\t\t\tState.stream.RiObjectInstance(handle);\n\t\t\t\t\tState.stream.RiAttributeEnd();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<array_3d > factory(\n\t\t\t\tk3d::uuid(0xea6c1213, 0x033d42f5, 0x9146951e, 0x3aee7e95),\n\t\t\t\t\"RenderManArray3D\",\n\t\t\t\t_(\"Renders a three-dimensional array of geometric object instances\"),\n\t\t\t\t\"RenderMan Array\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::ri::irenderable*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_source;\n\tk3d_data(k3d::itransform_array_3d*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_layout;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count1;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count2;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_count3;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// array_3d_factory\n\nk3d::iplugin_factory& array_3d_factory()\n{\n\treturn array_3d::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/background_plane.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the RenderManBackgroundPlane K-3D object, which renders a world-aligned plane, centered at the camera's position, with radius equal to the camera farplane\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/vectors.h>\n\n#ifdef\tWIN32\n#ifdef\tnear\n#undef\tnear\n#endif\t//near\n#ifdef\tfar\n#undef\tfar\n#endif\t//far\n#endif\t//WIN32\nnamespace\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// background_plane\n\nclass background_plane :\n\tpublic k3d::material_sink<k3d::node >,\n\tpublic k3d::ri::irenderable\n{\n\ttypedef k3d::material_sink<k3d::node > base;\n\npublic:\n\tbackground_plane(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_distance(init_owner(*this) + init_name(\"distance\") + init_label(_(\"distance\")) + init_description(_(\"Distance\")) + init_value(1.0) + init_constraint(k3d::data::constraint::minimum<double>(0.0, k3d::data::constraint::maximum<double>(1.0))))\n\t{\n\t}\n\n\tvoid renderman_render(const k3d::ri::render_state& State)\n\t{\n\t\t// We never generate shadows ...\n\t\tif(k3d::ri::SHADOW_MAP == State.render_context)\n\t\t\treturn;\n\t\t// We only generate output for the last sample ...\n\t\tif(!k3d::ri::last_sample(State))\n\t\t\treturn;\n\n\t\tk3d::iperspective* const perspective = dynamic_cast<k3d::iperspective*>(&State.projection);\n\t\tk3d::iorthographic* const orthographic = dynamic_cast<k3d::iorthographic*>(&State.projection);\n\t\tif(!perspective && !orthographic)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown projection type\" << std::endl;\n\t\t\treturn;\n\t\t}\n\t\n\t\tdouble left, right, top, bottom, plane;\n\t\tif(perspective)\n\t\t{\n\t\t\tconst double near = boost::any_cast<double>(k3d::property::pipeline_value(perspective->near()));\n\t\t\tconst double far = boost::any_cast<double>(k3d::property::pipeline_value(perspective->far()));\n\t\t\tplane = k3d::mix(near, far, m_distance.pipeline_value());\n\t\t\tleft = plane * boost::any_cast<double>(k3d::property::pipeline_value(perspective->left()));\n\t\t\tright = plane * boost::any_cast<double>(k3d::property::pipeline_value(perspective->right()));\n\t\t\ttop = plane * boost::any_cast<double>(k3d::property::pipeline_value(perspective->top()));\n\t\t\tbottom = plane * boost::any_cast<double>(k3d::property::pipeline_value(perspective->bottom()));\n\t\t}\n\n\t\tif(orthographic)\n\t\t{\n\t\t\tconst double near = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->near()));\n\t\t\tconst double far = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->far()));\n\t\t\tplane = k3d::mix(near, far, m_distance.pipeline_value());\n\t\t\tleft = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->left()));\n\t\t\tright = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->right()));\n\t\t\ttop = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->top()));\n\t\t\tbottom = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->bottom()));\n\t\t}\n\t\t\n\t\tState.stream.RiAttributeBegin();\n\t\tState.stream.RiAttributeV(\"identifier\", k3d::ri::parameter_list(1, k3d::ri::parameter(\"name\", k3d::ri::UNIFORM, 1, k3d::ri::string(name()))));\n\t\tState.stream.RiIdentity();\n\t\tState.stream.RiCoordSysTransform(k3d::ri::RI_CAMERA());\n\t\t\n\t\tk3d::ri::setup_material(m_material.pipeline_value(), State);\n\n\t\t// Draw a plane ...\n\t\tk3d::ri::points points;\n\t\tpoints.push_back(k3d::ri::point(k3d::point3(left, top, plane)));\n\t\tpoints.push_back(k3d::ri::point(k3d::point3(right, top, plane)));\n\t\tpoints.push_back(k3d::ri::point(k3d::point3(left, bottom, plane)));\n\t\tpoints.push_back(k3d::ri::point(k3d::point3(right, bottom, plane)));\n\t\tState.stream.RiPatchV(\"bilinear\", k3d::ri::parameter_list(1, k3d::ri::parameter(k3d::ri::RI_P(), k3d::ri::VERTEX, 1, points)));\n\n\t\tState.stream.RiAttributeEnd();\n\t}\n\n\tvoid renderman_render_complete(const k3d::ri::render_state& State)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<background_plane >factory(\n\t\t\tk3d::uuid(0x80e1c8eb, 0x001d4342, 0xb401551d, 0xd5c45a3d),\n\t\t\t\"RenderManBackgroundPlane\",\n\t\t\t_(\"Places a shader on a bilinear patch, aligned with the farplane\"),\n\t\t\t\"RenderMan\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_distance;\n};\n\n} // namespace\n\nnamespace libk3drenderman\n{\n\nk3d::iplugin_factory& background_plane_factory()\n{\n\treturn background_plane::get_factory();\n}\n\n} // namespace libk3drenderman\n\n\n\n"
  },
  {
    "path": "modules/renderman/csg_operator.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the CSG Operator K-3D object, which allows geometry to be rendered with boolean effects\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n\n#include <iostream>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// csg_operator\n\n/// Allows geometry to be rendered with boolean effects\nclass csg_operator :\n\tpublic k3d::node ,\n\tpublic k3d::ri::irenderable\n{\n\ttypedef k3d::node  base;\n\npublic:\n\tcsg_operator(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_type(init_owner(*this) + init_name(\"type\") + init_label(_(\"type\")) + init_description(_(\"Operation\")) + init_enumeration(boolean_values()) + init_value(BOOLEAN_INTERSECTION)),\n\t\tm_instance1(init_owner(*this) + init_name(\"instance1\") + init_label(_(\"instance1\")) + init_description(_(\"Instance1\")) + init_value<k3d::ri::irenderable*>(0)),\n\t\tm_instance2(init_owner(*this) + init_name(\"instance2\") + init_label(_(\"instance2\")) + init_description(_(\"Instance2\")) + init_value<k3d::ri::irenderable*>(0))\n\t{\n\t}\n\n\tvoid renderman_render(const k3d::ri::render_state& State)\n\t{\n\t\t// We only generate RIB for the last sample ...\n\t\tif(!k3d::ri::last_sample(State))\n\t\t\treturn;\n\n\t\tk3d::ri::irenderable* const renderable1 = m_instance1.pipeline_value();\n\t\tk3d::ri::irenderable* const renderable2 = m_instance2.pipeline_value();\n\t\tif(!renderable1 || !renderable2)\n\t\t\treturn;\n\n\t\t// Make sure we don't enter an infinite loop trying to render ourself ...\n\t\tif(renderable1 == this || renderable2 == this)\n\t\t{\n\t\t\tk3d::log() << error << factory().name() << \" [\" << name() << \"] cannot instance itself\" << std::endl;\n\t\t\treturn;\n\t\t}\n\n\t\t// Record the type of boolean ...\n\t\tk3d::ri::render_state state(State);\n\t\tstate.render_context = k3d::ri::CSG_SOLID;\n\n\t\tswitch(m_type.pipeline_value())\n\t\t{\n\t\t\tcase BOOLEAN_INTERSECTION:\n\t\t\t\tState.stream.RiSolidBegin(k3d::ri::RI_INTERSECTION());\n\t\t\t\trenderable1->renderman_render(state);\n\t\t\t\trenderable2->renderman_render(state);\n\t\t\t\tbreak;\n\n\t\t\tcase BOOLEAN_UNION:\n\t\t\t\tState.stream.RiSolidBegin(k3d::ri::RI_UNION());\n\t\t\t\trenderable1->renderman_render(state);\n\t\t\t\trenderable2->renderman_render(state);\n\t\t\t\tbreak;\n\n\t\t\tcase BOOLEAN_DIFFERENCE:\n\t\t\t\tState.stream.RiSolidBegin(k3d::ri::RI_DIFFERENCE());\n\t\t\t\trenderable1->renderman_render(state);\n\t\t\t\trenderable2->renderman_render(state);\n\t\t\t\tbreak;\n\n\t\t\tcase BOOLEAN_REVERSE_DIFFERENCE:\n\t\t\t\tState.stream.RiSolidBegin(k3d::ri::RI_DIFFERENCE());\n\t\t\t\trenderable2->renderman_render(state);\n\t\t\t\trenderable1->renderman_render(state);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tState.stream.RiSolidEnd();\n\t}\n\n\tvoid renderman_render_complete(const k3d::ri::render_state& State)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<csg_operator >factory(\n\t\t\tk3d::uuid(0x00000001, 0x00000000, 0x00000000, 0x0000000a),\n\t\t\t\"RenderManCSGOperator\",\n\t\t\t_(\"Combines solids using boolean operators at render-time\"),\n\t\t\t\"RenderMan CSG\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttypedef enum\n\t{\n\t\tBOOLEAN_INTERSECTION,\n\t\tBOOLEAN_UNION,\n\t\tBOOLEAN_DIFFERENCE,\n\t\tBOOLEAN_REVERSE_DIFFERENCE\n\t} boolean_t;\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& boolean_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Intersection\", \"intersection\", \"Render intersecting volumes\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Union\", \"union\", \"Render the union of two volumnes\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Difference\", \"difference\", \"Render the difference of two volumes\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Reverse Difference\", \"reverse_difference\", \"Render the difference of two volumes\"));\n\t\t}\n\t\t\n\t\treturn values;\n\t}\n\t\n\tfriend std::ostream& operator<<(std::ostream& Stream, const boolean_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase BOOLEAN_UNION:\n\t\t\t\tStream << \"union\";\n\t\t\t\tbreak;\n\t\t\tcase BOOLEAN_INTERSECTION:\n\t\t\t\tStream << \"intersection\";\n\t\t\t\tbreak;\n\t\t\tcase BOOLEAN_DIFFERENCE:\n\t\t\t\tStream << \"difference\";\n\t\t\t\tbreak;\n\t\t\tcase BOOLEAN_REVERSE_DIFFERENCE:\n\t\t\t\tStream << \"reverse_difference\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, boolean_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"union\")\n\t\t\tValue = BOOLEAN_UNION;\n\t\telse if(text == \"intersection\")\n\t\t\tValue = BOOLEAN_INTERSECTION;\n\t\telse if(text == \"difference\")\n\t\t\tValue = BOOLEAN_DIFFERENCE;\n\t\telse if(text == \"reverse_difference\")\n\t\t\tValue = BOOLEAN_REVERSE_DIFFERENCE;\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown enumeration [\" << text << \"]\"<< std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tk3d_data(boolean_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_type;\n\tk3d_data(k3d::ri::irenderable*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_instance1;\n\tk3d_data(k3d::ri::irenderable*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_instance2;\n};\n\nk3d::iplugin_factory& csg_operator_factory()\n{\n\treturn csg_operator::get_factory();\n}\n\n} // namespace libk3drenderman\n\n\n\n"
  },
  {
    "path": "modules/renderman/csg_solid.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the csg_solid K-3D object, which allows geometry to be rendered with boolean effects\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n// csg_solid\n\nclass csg_solid :\n\tpublic k3d::node ,\n\tpublic k3d::ri::irenderable\n{\n\ttypedef k3d::node  base;\n\t\npublic:\n\tcsg_solid(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_instance(init_owner(*this) + init_name(\"instance\") + init_label(_(\"instance\")) + init_description(_(\"Instance\")) + init_value<k3d::ri::irenderable*>(0))\n\t{\n\t}\n\n\tvoid renderman_render(const k3d::ri::render_state& State)\n\t{\n\t\t// We only generate RIB during CSG rendering ...\n\t\tif(State.render_context != k3d::ri::CSG_SOLID)\n\t\t\treturn;\n\t\t\t\n\t\t// We only generate RIB on the last sample ...\n\t\tif(!k3d::ri::last_sample(State))\n\t\t\treturn;\n\n\t\tk3d::ri::irenderable* const renderable = m_instance.pipeline_value();\n\t\tif(!renderable)\n\t\t\treturn;\n\n\t\t// Make sure we don't enter an infinite loop trying to render ourself ...\n\t\tif(renderable == this)\n\t\t\t{\n\t\t\t\tk3d::log() << error << factory().name() << \" [\" << name() << \"] cannot instance itself\" << std::endl;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\tState.stream.RiSolidBegin(k3d::ri::RI_PRIMITIVE());\n\t\t\tk3d::ri::render_state state(State);\n\t\t\tstate.render_context = k3d::ri::CSG_SOLID;\n\t\t\trenderable->renderman_render(state);\n\t\tState.stream.RiSolidEnd();\n\t}\n\n\tvoid renderman_render_complete(const k3d::ri::render_state& State)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<csg_solid >factory(\n\t\t\tk3d::uuid(0x00000001, 0x00000000, 0x00000000, 0x0000007b),\n\t\t\t\"RenderManCSGSolid\",\n\t\t\t_(\"Designates a solid volume at render-time\"),\n\t\t\t\"RenderMan CSG\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\t\n\t}\n\nprivate:\n\tk3d_data(k3d::ri::irenderable*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_instance;\n};\n\nk3d::iplugin_factory& csg_solid_factory()\n{\n\treturn csg_solid::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/delayed_read_archive.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the RenderManScript K-3D object, which can insert scripted data into RenderMan output\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bounding_box3.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/transformable.h>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// delayed_read_archive\n\nclass delayed_read_archive :\n\tpublic k3d::gl::renderable<k3d::ri::renderable<k3d::transformable<k3d::node > > >\n{\n\ttypedef k3d::gl::renderable<k3d::ri::renderable<k3d::transformable<k3d::node > > > base;\n\npublic:\n\tdelayed_read_archive(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"file\")) + init_description(_(\"RIB archive to be inserted in output\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(\"rib_archives\")),\n\t\tm_bounding_box(init_owner(*this) + init_name(\"bounding_box\") + init_label(_(\"bounding_box\")) + init_description(_(\"Visibility bounding box\")) + init_value(k3d::bounding_box3(-0.5, 0.5, -0.5, 0.5, -0.5, 0.5)))\n\t{\n\t\tm_bounding_box.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tconst k3d::bounding_box3 bounding_box = m_bounding_box.pipeline_value();\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglColor3d(1, 1, 0);\n\n\t\tk3d::gl::draw_bounding_box(bounding_box);\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t}\n\n\tvoid on_renderman_render(const k3d::ri::render_state& State)\n\t{\n\t\t// We only generate RIB on the last sample ...\n\t\tif(!k3d::ri::last_sample(State))\n\t\t\treturn;\n\n\t\tconst k3d::filesystem::path file = m_file.pipeline_value();\n\t\tif(!k3d::filesystem::exists(file))\n\t\t\treturn;\n\n\t\tconst k3d::bounding_box3 bounding_box = m_bounding_box.pipeline_value();\n\n\t\tState.stream.RiProcDelayedReadArchive(file, bounding_box);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<delayed_read_archive,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\tk3d::uuid(0x65fd1c9e, 0xa18b403a, 0xbccafc19, 0xdf504c75),\n\t\t\t\"RenderManDelayedReadArchive\",\n\t\t\t_(\"Inserts a RenderMan DelayedReadArchive call into rendered output\"),\n\t\t\t\"RenderMan\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n\tk3d_data(k3d::bounding_box3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_bounding_box;\n};\n\nk3d::iplugin_factory& delayed_read_archive_factory()\n{\n\treturn delayed_read_archive::get_factory();\n}\n\n} // namespace libk3drenderman\n\n\n"
  },
  {
    "path": "modules/renderman/direct_texture_map.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/istream_ri.h>\n#include <k3dsdk/itexture_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// direct_texture_map\n\nclass direct_texture_map :\n\tpublic k3d::node,\n\tpublic k3d::ri::itexture\n{\n\ttypedef k3d::node base;\n\npublic:\n\tdirect_texture_map(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Texture File\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::bitmaps()))\n\t{\n\t}\n\n\t~direct_texture_map()\n\t{\n\t}\n\n\tvoid setup_renderman_texture(k3d::inetwork_render_frame& Frame, k3d::ri::istream& Stream, k3d::ri::ishader_collection& Shaders)\n\t{\n\t}\n\n\tconst k3d::filesystem::path renderman_texture_path(const k3d::ri::render_state& State)\n\t{\n\t\treturn m_file.pipeline_value();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<direct_texture_map,\n\t\t\tk3d::interface_list<k3d::ri::itexture> > factory(\n\t\t\t\tk3d::uuid(0x1792bf68, 0x9cbb46f6, 0xaf7d5967, 0x75664ebd),\n\t\t\t\t\"RenderManDirectTextureMap\",\n\t\t\t\t_(\"Links a RenderMan Texture Map directly to a file\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// direct_texture_map_factory\n\nk3d::iplugin_factory& direct_texture_map_factory()\n{\n\treturn direct_texture_map::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/lat_long_environment_map.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-platform-config.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/bitmap_modifier.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/ibitmap_exporter.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/istream_ri.h>\n#include <k3dsdk/itexture_ri.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/types_ri.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iterator>\n\n#ifdef K3D_API_WIN32\n\t#define COPY_COMMAND \"copy\"\n#else\n\t#define COPY_COMMAND \"cp\"\n#endif\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// lat_long_environment_map\n\nclass lat_long_environment_map :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_modifier<lat_long_environment_map>,\n\tpublic k3d::ri::itexture\n{\n\ttypedef k3d::node base;\n\npublic:\n\tlat_long_environment_map(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_filter(init_owner(*this) + init_name(\"filter\") + init_label(_(\"filter\")) + init_description(_(\"Filter\")) + init_value(k3d::ri::RI_GAUSSIAN()) + init_values(filter_values())),\n\t\tm_swidth(init_owner(*this) + init_name(\"swidth\") + init_label(_(\"swidth\")) + init_description(_(\"Filter S Width\")) + init_value(2.0) + init_constraint(constraint::minimum(std::numeric_limits<double>::epsilon())) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_twidth(init_owner(*this) + init_name(\"twidth\") + init_label(_(\"twidth\")) + init_description(_(\"Filter T Width\")) + init_value(2.0) + init_constraint(constraint::minimum(std::numeric_limits<double>::epsilon())) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t}\n\t\n\tvoid setup_renderman_texture(k3d::inetwork_render_frame& Frame, k3d::ri::istream& Stream, k3d::ri::ishader_collection& Shaders)\n\t{\n\t\tm_ri_image_path = k3d::filesystem::path();\n\t\tm_ri_texture_path = k3d::filesystem::path();\n\n\t\t// If we don't have an input bitmap, we're done ...\n\t\tconst k3d::bitmap* const input = m_input_bitmap.pipeline_value();\n\t\tif(!input)\n\t\t\treturn;\n\n\t\tm_ri_image_path = Frame.add_file(\"texture\");\n\t\t\n\t\tm_ri_texture_path = Frame.add_file(\"texture\");\n\n/*\n\t\t// If \"render from source\" is enabled, just copy the source file to the frame directory ...\n\t\tif(m_render_from_source.pipeline_value())\n\t\t{\n\t\t\t// Copy the file ...\n\t\t\tconst std::string copycommand = COPY_COMMAND \" \" + m_image_path.pipeline_value().native_string() + \" \" + m_ri_image_path.native_string();\n\t\t\tk3d::system::run_process(copycommand);\n\n\t\t}\n\t\t// Otherwise, save the in-memory image data as a TIFF file ...\n\t\telse\n*/\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::ibitmap_exporter> exporter(k3d::plugin::create<k3d::ibitmap_exporter>(k3d::classes::TIFFBitmapExporter()));\n\t\t\treturn_if_fail(exporter);\n\t\t\treturn_if_fail(exporter->write_file(m_ri_image_path, *input));\n\t\t}\n\n\t\tStream.RiMakeLatLongEnvironmentV(m_ri_image_path.native_filesystem_string(), m_ri_texture_path.native_filesystem_string(), m_filter.pipeline_value(), m_swidth.pipeline_value(), m_twidth.pipeline_value());\n\t}\n\n\tconst k3d::filesystem::path renderman_texture_path(const k3d::ri::render_state& State)\n\t{\n\t\treturn m_ri_texture_path;\n\t}\n\n\tvoid on_resize_bitmap(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tOutput.recreate(Input.width(), Input.height());\n\t}\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tOutput = Input;\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<lat_long_environment_map,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink,\n\t\t\tk3d::interface_list<k3d::ri::itexture> > > > factory(\n\t\t\t\tk3d::uuid(0x04354dba, 0x91a7411c, 0x88b73725, 0x5808a415),\n\t\t\t\t\"RenderManLatLongEnvironmentMap\",\n\t\t\t\t_(\"Converts a bitmap into a RenderMan LatLong Environment Map\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_filter;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_swidth;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_twidth;\n\n\tconst k3d::ilist_property<std::string>::values_t& filter_values()\n\t{\n\t\tstatic k3d::ilist_property<std::string>::values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ri::RI_GAUSSIAN());\n\t\t\tvalues.push_back(k3d::ri::RI_BOX());\n\t\t\tvalues.push_back(k3d::ri::RI_TRIANGLE());\n\t\t\tvalues.push_back(k3d::ri::RI_CATMULL_ROM());\n\t\t\tvalues.push_back(k3d::ri::RI_SINC());\n\t\t}\n\t\treturn values;\n\t}\n\n\t/// Stores the absolute path to the saved TIFF version of this lat_long_environment_map (for use during RenderMan rendering)\n\tk3d::filesystem::path m_ri_image_path;\n\t/// Stores the absolute path to the version of this lat_long_environment_map converted by the renderer (via RiMakeLatLongEnvironment())\n\tk3d::filesystem::path m_ri_texture_path;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// lat_long_environment_map_factory\n\nk3d::iplugin_factory& lat_long_environment_map_factory()\n{\n\treturn lat_long_environment_map::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/ilight_gl.h>\n#include <k3dsdk/ilight_ri.h>\n#include <k3dsdk/ilight_shader_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/render_state_ri.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transformable.h>\n#include <k3dsdk/vectors.h>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// light\n\nclass light :\n\tpublic k3d::gl::renderable<k3d::transformable<k3d::node > >,\n\tpublic k3d::gl::ilight,\n\tpublic k3d::ri::ilight\n{\n\ttypedef k3d::gl::renderable<k3d::transformable<k3d::node > > base;\n\npublic:\n\tlight(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_shader(init_owner(*this) + init_name(\"shader\") + init_label(_(\"Shader\")) + init_description(_(\"Light shader\")) + init_value<k3d::ri::ilight_shader*>(0))\n\t{\n\t\tm_input_matrix.changed_signal().connect(make_async_redraw_slot());\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\n\t\tk3d::gl::color3d(State.node_selection ? k3d::color(1, 1, 1) : k3d::color(1, 1, 0));\n\t\tglLineWidth(1.0f);\n\t\tglDisable(GL_LINE_STIPPLE);\n\n\t\tdraw();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw();\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid draw()\n\t{\n\t\tglBegin(GL_LINES);\n\n\t\tk3d::point3 coords(0, 0, 0);\n\n\t\tglVertex3d(coords[0] + 1.0, coords[1], coords[2]);\n\t\tglVertex3d(coords[0] - 1.0, coords[1], coords[2]);\n\t\tglVertex3d(coords[0], coords[1] + 1.0, coords[2]);\n\t\tglVertex3d(coords[0], coords[1] - 1.0, coords[2]);\n\t\tglVertex3d(coords[0], coords[1], coords[2] + 1.0);\n\t\tglVertex3d(coords[0], coords[1], coords[2] - 1.0);\n\n\t\tglVertex3d(coords[0] + 0.4, coords[1] + 0.4, coords[2] + 0.4);\n\t\tglVertex3d(coords[0] - 0.4, coords[1] - 0.4, coords[2] - 0.4);\n\t\tglVertex3d(coords[0] - 0.4, coords[1] + 0.4, coords[2] + 0.4);\n\t\tglVertex3d(coords[0] + 0.4, coords[1] - 0.4, coords[2] - 0.4);\n\t\tglVertex3d(coords[0] + 0.4, coords[1] + 0.4, coords[2] - 0.4);\n\t\tglVertex3d(coords[0] - 0.4, coords[1] - 0.4, coords[2] + 0.4);\n\t\tglVertex3d(coords[0] - 0.4, coords[1] + 0.4, coords[2] - 0.4);\n\t\tglVertex3d(coords[0] + 0.4, coords[1] - 0.4, coords[2] + 0.4);\n\n\t\tglEnd();\n\t}\n\n\tvoid setup_gl_light(const unsigned long Light)\n\t{\n\t\t// Setup our own transformation matrix ...\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(matrix());\n\n\t\t// Offset our light index ...\n\t\tGLenum light = GLenum(Light + GL_LIGHT0);\n\n\t\t// Enable the light ...\n\t\tglEnable(light);\n\n\t\t// Setup intensity / attenuation ...\n\t\tdouble intensity = 1.0 / 1200.0;\n\t\tglLightf(light, GL_CONSTANT_ATTENUATION, 0.0f);\n\t\tglLightf(light, GL_LINEAR_ATTENUATION, 0.0f);\n\t\tglLightf(light, GL_QUADRATIC_ATTENUATION, GLfloat(intensity));\n\n\t\t// Setup color ...\n\t\tk3d::point3 color(1.0, 1.0, 1.0);\n\n\t\tGLfloat glcolor[4];\n\t\tglcolor[0] = (GLfloat)color[0];\n\t\tglcolor[1] = (GLfloat)color[1];\n\t\tglcolor[2] = (GLfloat)color[2];\n\t\tglcolor[3] = 1.0f;\n\n\t\tglLightfv(light, GL_AMBIENT, glcolor);\n\t\tglLightfv(light, GL_DIFFUSE, glcolor);\n\t\tglLightfv(light, GL_SPECULAR, glcolor);\n\n\t\tGLfloat gllightpos[4];\n\t\tgllightpos[0] = 0.0f;\n\t\tgllightpos[1] = 0.0f;\n\t\tgllightpos[2] = 0.0f;\n\t\tgllightpos[3] = 1.0f;\n\t\tglLightfv(light, GL_POSITION, gllightpos);\n\n\t\tglLightf(light, GL_SPOT_CUTOFF, 180.0f);\n\n\t\tglPopMatrix();\n\t}\n\n\tvoid setup_renderman_light(const k3d::ri::render_state& State)\n\t{\n\t\t// If this is a shadow pass, we're done ...\n\t\tif(k3d::ri::SHADOW_MAP == State.render_context)\n\t\t\treturn;\n\n\t\t// We only generate RIB on the last sample ...\n\t\tif(!k3d::ri::last_sample(State))\n\t\t\treturn;\n\n\t\t// If the user hasn't selected a shader, we're done ...\n\t\tk3d::ri::ilight_shader* const shader = m_shader.pipeline_value();\n\t\tif(!shader)\n\t\t\treturn;\n\n\t\t// Make it happen ...\n\t\tState.stream.RiTransformBegin();\n\t\tState.stream.RiTransform(k3d::ri::convert(matrix()));\n\t\tk3d::ri::set_attributes(*this, State.stream);\n\t\tshader->setup_renderman_light_shader(State);\n\t\tState.stream.RiTransformEnd();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<light,\n\t\t\tk3d::interface_list<k3d::gl::ilight,\n\t\t\tk3d::interface_list<k3d::ri::ilight,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > > > factory(\n\t\t\tk3d::classes::RenderManLight(),\n\t\t\t\"RenderManLight\",\n\t\t\t_(\"RenderMan light source\"),\n\t\t\t\"RenderMan Light\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::ri::ilight_shader*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_shader;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// light_factory\n\nk3d::iplugin_factory& light_factory()\n{\n\treturn light::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/idisplacement_shader_ri.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imaterial_ri.h>\n#include <k3dsdk/isurface_shader_ri.h>\n#include <k3dsdk/ivolume_shader_ri.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/node_change_signal.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/types_ri.h>\n#include <k3dsdk/vectors.h>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nconst std::string shadowtype_none = \"None\";\nconst std::string shadowtype_opaque = \"Opaque\";\nconst std::string shadowtype_opacity = \"Opacity\";\nconst std::string shadowtype_shaded = \"Shaded\";\n\nclass material :\n\tpublic k3d::node,\n\tpublic k3d::node_change_signal<material>,\n\tpublic k3d::imaterial,\n\tpublic k3d::ri::imaterial\n{\n\ttypedef k3d::node  base;\n\npublic:\n\tmaterial(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_surface_shader(init_owner(*this) + init_name(\"surface_shader\") + init_label(_(\"Surface Shader\")) + init_description(_(\"Surface shader\")) + init_value<k3d::ri::isurface_shader*>(0)),\n\t\tm_displacement_shader(init_owner(*this) + init_name(\"displacement_shader\") + init_label(_(\"Displacement Shader\")) + init_description(_(\"Displacement shader\")) + init_value<k3d::ri::idisplacement_shader*>(0)),\n\t\tm_atmosphere_shader(init_owner(*this) + init_name(\"atmosphere_shader\") + init_label(_(\"Atmosphere Shader\")) + init_description(_(\"Atmosphere shader\")) + init_value<k3d::ri::ivolume_shader*>(0)),\n\t\tm_interior_shader(init_owner(*this) + init_name(\"interior_shader\") + init_label(_(\"Interior Shader\")) + init_description(_(\"Interior shader\")) + init_value<k3d::ri::ivolume_shader*>(0)),\n\t\tm_exterior_shader(init_owner(*this) + init_name(\"exterior_shader\") + init_label(_(\"Exterior Shader\")) + init_description(_(\"Exterior shader\")) + init_value<k3d::ri::ivolume_shader*>(0)),\n\t\tm_matte(init_owner(*this) + init_name(\"matte\") + init_label(_(\"Matte\")) + init_description(_(\"Render geometry as a matte\")) + init_value(false)),\n\t\tm_displacement_bounds(init_owner(*this) + init_name(\"displacement_bounds\") + init_label(_(\"Displacement Bounds\")) + init_description(_(\"Displacement bounds\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"Color\")) + init_description(_(\"Color\")) + init_value(k3d::color(1, 1, 1))),\n\t\tm_opacity(init_owner(*this) + init_name(\"opacity\") + init_label(_(\"Opacity\")) + init_description(_(\"Opacity\")) + init_value(k3d::color(1, 1, 1)))\n\t{\n\t\tm_surface_shader.changed_signal().connect(make_node_change_slot());\n\t\tm_displacement_shader.changed_signal().connect(make_node_change_slot());\n\t\tm_atmosphere_shader.changed_signal().connect(make_node_change_slot());\n\t\tm_interior_shader.changed_signal().connect(make_node_change_slot());\n\t\tm_exterior_shader.changed_signal().connect(make_node_change_slot());\n\t\tm_matte.changed_signal().connect(make_node_change_slot());\n\t\tm_displacement_bounds.changed_signal().connect(make_node_change_slot());\n\t\tm_color.changed_signal().connect(make_node_change_slot());\n\t\tm_opacity.changed_signal().connect(make_node_change_slot());\n\n\t\tdeleted_signal().connect(sigc::mem_fun(*this, &material::on_deleted));\n\t}\n\n\tvoid on_deleted()\n\t{\n\t}\n\n\tvoid setup_renderman_material(const k3d::ri::render_state& State)\n\t{\n\t\t// We only generate RIB on the final sample ...\n\t\tif(!k3d::ri::last_sample(State))\n\t\t\treturn;\n\n\t\t// Setup displacement bounds ...\n\t\tk3d::ri::parameter_list displacement_attributes;\n\t\tdisplacement_attributes.push_back(k3d::ri::parameter(\"sphere\", k3d::ri::UNIFORM, 1, static_cast<k3d::ri::real>(m_displacement_bounds.pipeline_value())));\n\t\tdisplacement_attributes.push_back(k3d::ri::parameter(\"coordinatesystem\", k3d::ri::UNIFORM, 1, k3d::ri::string(\"world\")));\n\t\tState.stream.RiAttributeV(\"displacementbound\", displacement_attributes);\n\n\t\t// Set base color\n\t\tState.stream.RiColor(m_color.pipeline_value());\n\n\t\t// Set opacity\n\t\tState.stream.RiOpacity(m_opacity.pipeline_value());\n\n\t\t// Set the matte attribute\n\t\tState.stream.RiMatte(m_matte.pipeline_value() ? 1 : 0);\n\n\t\t// Setup shaders ...\n\t\tif(m_surface_shader.pipeline_value())\n\t\t\tm_surface_shader.pipeline_value()->setup_renderman_surface_shader(State);\n\t\tif(m_displacement_shader.pipeline_value())\n\t\t\tm_displacement_shader.pipeline_value()->setup_renderman_displacement_shader(State);\n\t\tif(m_atmosphere_shader.pipeline_value())\n\t\t\tm_atmosphere_shader.pipeline_value()->setup_renderman_atmosphere_shader(State);\n\t\tif(m_interior_shader.pipeline_value())\n\t\t\tm_interior_shader.pipeline_value()->setup_renderman_interior_shader(State);\n\t\tif(m_exterior_shader.pipeline_value())\n\t\t\tm_exterior_shader.pipeline_value()->setup_renderman_exterior_shader(State);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<material,\n\t\t\t\tk3d::interface_list<k3d::imaterial,\n\t\t\t\tk3d::interface_list<k3d::ri::imaterial> > > factory(\n\t\t\tk3d::classes::RenderManMaterial(),\n\t\t\t\"RenderManMaterial\",\n\t\t\t_(\"A RenderMan surface / displacement material\"),\n\t\t\t\"RenderMan Material\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::ri::isurface_shader*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_surface_shader;\n\tk3d_data(k3d::ri::idisplacement_shader*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_displacement_shader;\n\tk3d_data(k3d::ri::ivolume_shader*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_atmosphere_shader;\n\tk3d_data(k3d::ri::ivolume_shader*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_interior_shader;\n\tk3d_data(k3d::ri::ivolume_shader*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_exterior_shader;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_matte;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_displacement_bounds;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_opacity;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// material_factory\n\nk3d::iplugin_factory& material_factory()\n{\n\treturn material::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements procedures required to export K-3D objects from the core module\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\n/// Namespace reserved for the renderman plugin module, to protect public symbols from name clashes with other modules\nnamespace libk3drenderman\n{\n\nextern k3d::iplugin_factory& area_light_factory();\nextern k3d::iplugin_factory& array_1d_factory();\nextern k3d::iplugin_factory& array_2d_factory();\nextern k3d::iplugin_factory& array_3d_factory();\nextern k3d::iplugin_factory& background_plane_factory();\nextern k3d::iplugin_factory& csg_operator_factory();\nextern k3d::iplugin_factory& csg_solid_factory();\nextern k3d::iplugin_factory& delayed_read_archive_factory();\nextern k3d::iplugin_factory& direct_texture_map_factory();\nextern k3d::iplugin_factory& displacement_shader_factory();\nextern k3d::iplugin_factory& imager_shader_factory();\nextern k3d::iplugin_factory& lat_long_environment_map_factory();\nextern k3d::iplugin_factory& light_factory();\nextern k3d::iplugin_factory& light_shader_factory();\nextern k3d::iplugin_factory& material_factory();\nextern k3d::iplugin_factory& read_archive_factory();\nextern k3d::iplugin_factory& render_engine_factory();\nextern k3d::iplugin_factory& renderman_script_factory();\nextern k3d::iplugin_factory& shadow_map_factory();\nextern k3d::iplugin_factory& surface_shader_factory();\nextern k3d::iplugin_factory& texture_map_factory();\nextern k3d::iplugin_factory& volume_shader_factory();\n\n} // namespace libk3drenderman\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(libk3drenderman::area_light_factory());\n\tRegistry.register_factory(libk3drenderman::array_1d_factory());\n\tRegistry.register_factory(libk3drenderman::array_2d_factory());\n\tRegistry.register_factory(libk3drenderman::array_3d_factory());\n\tRegistry.register_factory(libk3drenderman::background_plane_factory());\n\tRegistry.register_factory(libk3drenderman::csg_operator_factory());\n\tRegistry.register_factory(libk3drenderman::csg_solid_factory());\n\tRegistry.register_factory(libk3drenderman::delayed_read_archive_factory());\n\tRegistry.register_factory(libk3drenderman::direct_texture_map_factory());\n\tRegistry.register_factory(libk3drenderman::displacement_shader_factory());\n\tRegistry.register_factory(libk3drenderman::imager_shader_factory());\n\tRegistry.register_factory(libk3drenderman::lat_long_environment_map_factory());\n\tRegistry.register_factory(libk3drenderman::light_factory());\n\tRegistry.register_factory(libk3drenderman::light_shader_factory());\n\tRegistry.register_factory(libk3drenderman::material_factory());\n\tRegistry.register_factory(libk3drenderman::read_archive_factory());\n\tRegistry.register_factory(libk3drenderman::render_engine_factory());\n\tRegistry.register_factory(libk3drenderman::renderman_script_factory());\n\tRegistry.register_factory(libk3drenderman::shadow_map_factory());\n\tRegistry.register_factory(libk3drenderman::surface_shader_factory());\n\tRegistry.register_factory(libk3drenderman::texture_map_factory());\n\tRegistry.register_factory(libk3drenderman::volume_shader_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/renderman/read_archive.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the read_archive K-3D object, which allows geometry to be rendered with boolean effects\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/renderable_ri.h>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n// read_archive\n\nclass read_archive :\n\tpublic k3d::node ,\n\tpublic k3d::ri::irenderable\n{\n\ttypedef k3d::node  base;\n\npublic:\n\tread_archive(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"file\")) + init_description(_(\"RIB archive to be inserted in output\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(\"rib_archive\"))\n\t{\n\t}\n\n\tvoid renderman_render(const k3d::ri::render_state& State)\n\t{\n\t\t// We only generate RIB on the last sample ...\n\t\tif(!k3d::ri::last_sample(State))\n\t\t\treturn;\n\n\t\tconst k3d::filesystem::path file = m_file.pipeline_value();\n\t\tif(!k3d::filesystem::exists(file))\n\t\t\treturn;\n\n\t\tState.stream.RiReadArchive(file);\n\t}\n\n\tvoid renderman_render_complete(const k3d::ri::render_state& State)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<read_archive >factory(\n\t\t\tk3d::uuid(0x5dc6fac5, 0xd9a54c79, 0x929f1612, 0x6f83a8b8),\n\t\t\t\"RenderManReadArchive\",\n\t\t\t_(\"Inserts a RenderMan ReadArchive call into rendered output\"),\n\t\t\t\"RenderMan\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n};\n\nk3d::iplugin_factory& read_archive_factory()\n{\n\treturn read_archive::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/render_engine.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/file_range.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/icrop_window.h>\n#include <k3dsdk/iimager_shader_ri.h>\n#include <k3dsdk/ilight_ri.h>\n#include <k3dsdk/inetwork_render_farm.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/inetwork_render_job.h>\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/irender_camera_animation.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/irender_camera_preview.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/istream_ri.h>\n#include <k3dsdk/irenderable_ri.h>\n#include <k3dsdk/itexture_ri.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/ivolume_shader_ri.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/network_render_farm.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/property_group_collection.h>\n#include <k3dsdk/stream_ri.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/resolutions.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/shader_collection_ri.h>\n#include <k3dsdk/string_cast.h>\n#include <k3dsdk/time_source.h>\n#include <k3dsdk/types_ri.h>\n#include <k3dsdk/user_interface.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <iomanip>\n\n#include <boost/scoped_ptr.hpp>\n\n#ifdef\tWIN32\n#ifdef\tnear\n#undef\tnear\n#endif\t//near\n#ifdef\tfar\n#undef\tfar\n#endif\t//far\n#endif\t//WIN32\n\nnamespace libk3drenderman\n{\n\nnamespace detail\n{\n\nclass setup_texture\n{\npublic:\n\texplicit setup_texture(k3d::inetwork_render_frame& Frame, k3d::ri::istream& Stream, k3d::ri::ishader_collection& Shaders) :\n\t\tframe(Frame),\n\t\tstream(Stream),\n\t\tshaders(Shaders)\n\t{\n\t}\n\n\tvoid operator()(k3d::inode* const Node)\n\t{\n\t\tif(k3d::ri::itexture* const texture = dynamic_cast<k3d::ri::itexture*>(Node))\n\t\t\ttexture->setup_renderman_texture(frame, stream, shaders);\n\t}\n\nprivate:\n\tk3d::inetwork_render_frame& frame;\n\tk3d::ri::istream& stream;\n\tk3d::ri::ishader_collection& shaders;\n};\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// render_engine\n\nclass render_engine :\n\tpublic k3d::node,\n\tpublic k3d::inode_collection_sink,\n\tpublic k3d::irender_camera_preview,\n\tpublic k3d::irender_camera_frame,\n\tpublic k3d::irender_camera_animation,\n\tpublic k3d::property_group_collection\n{\n\ttypedef k3d::node base;\n\npublic:\n\trender_engine(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_visible_nodes(init_owner(*this) + init_name(\"visible_nodes\") + init_label(_(\"Visible Nodes\")) + init_description(_(\"A list of nodes that will be visible in the rendered output.\")) + init_value(std::vector<k3d::inode*>())),\n\t\tm_enabled_lights(init_owner(*this) + init_name(\"enabled_lights\") + init_label(_(\"Enabled Lights\")) + init_description(_(\"A list of light sources that will contribute to the rendered output.\")) + init_value(std::vector<k3d::inode*>())),\n\t\tm_render_engine(init_owner(*this) + init_name(\"render_engine\") + init_label(_(\"Render Engine\")) + init_description(_(\"Choose an installed RenderMan engine to be used for rendering.\")) + init_value<k3d::ri::irender_engine*>(0)),\n\t\tm_resolution(init_owner(*this) + init_name(\"resolution\") + init_label(_(\"Resolution\")) + init_description(_(\"Choose a predefined image resolution\")) + init_enumeration(k3d::resolution_values()) + init_value(std::string(\"\"))),\n\t\tm_hider(init_owner(*this) + init_name(\"hider\") + init_label(_(\"Hider\")) + init_description(_(\"Hider Algorithm\")) + init_value(std::string())),\n\t\tm_pixel_width(init_owner(*this) + init_name(\"pixel_width\") + init_label(_(\"Pixel Width\")) + init_description(_(\"Output pixel width\")) + init_value(320) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_pixel_height(init_owner(*this) + init_name(\"pixel_height\") + init_label(_(\"Pixel Height\")) + init_description(_(\"Output pixel height\")) + init_value(240) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_pixel_aspect_ratio(init_owner(*this) + init_name(\"pixel_aspect_ratio\") + init_label(_(\"Pixel Aspect Ratio\")) + init_description(_(\"Output pixel aspect ratio\")) + init_value(1.0) + init_constraint(constraint::minimum(std::numeric_limits<double>::epsilon())) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_default_atmosphere_shader(init_owner(*this) + init_name(\"default_atmosphere_shader\") + init_label(_(\"Default Atmosphere Shader\")) + init_description(_(\"Default atmosphere shader\")) + init_value<k3d::ri::ivolume_shader*>(0)),\n\t\tm_default_interior_shader(init_owner(*this) + init_name(\"default_interior_shader\") + init_label(_(\"Default Interior Shader\")) + init_description(_(\"Default interior shader\")) + init_value<k3d::ri::ivolume_shader*>(0)),\n\t\tm_default_exterior_shader(init_owner(*this) + init_name(\"default_exterior_shader\") + init_label(_(\"Default Exterior Shader\")) + init_description(_(\"Default exterior shader\")) + init_value<k3d::ri::ivolume_shader*>(0)),\n\t\tm_imager_shader(init_owner(*this) + init_name(\"imager_shader\") + init_label(_(\"Imager Shader\")) + init_description(_(\"Imager shader\")) + init_value<k3d::ri::iimager_shader*>(0)),\n\t\tm_bucket_width(init_owner(*this) + init_name(\"bucket_width\") + init_label(_(\"Bucket Width\")) + init_description(_(\"Bucket Width\")) + init_value(16) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_bucket_height(init_owner(*this) + init_name(\"bucket_height\") + init_label(_(\"Bucket Height\")) + init_description(_(\"Bucket Height\")) + init_value(16) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_grid_size(init_owner(*this) + init_name(\"grid_size\") + init_label(_(\"Grid Size\")) + init_description(_(\"Grid Size\")) + init_value(256) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_eye_splits(init_owner(*this) + init_name(\"eye_splits\") + init_label(_(\"Eye Splits\")) + init_description(_(\"Eye Splits\")) + init_value(10) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_texture_memory(init_owner(*this) + init_name(\"texture_memory\") + init_label(_(\"Texture Memory\")) + init_description(_(\"Texture Memory\")) + init_value(1024) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_render_alpha(init_owner(*this) + init_name(\"render_alpha\") + init_label(_(\"Render Alpha\")) + init_description(_(\"Render Alpha\")) + init_value(false)),\n\t\tm_pixel_xsamples(init_owner(*this) + init_name(\"pixel_xsamples\") + init_label(_(\"Pixel X Samples\")) + init_description(_(\"The smaller the faster, the higher the better (anti-aliasing)\")) + init_value(3.0) + init_constraint(constraint::minimum<double>(1.0)) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_pixel_ysamples(init_owner(*this) + init_name(\"pixel_ysamples\") + init_label(_(\"Pixel Y Samples\")) + init_description(_(\"The smaller the faster, the higher the better (anti-aliasing)\")) + init_value(3.0) + init_constraint(constraint::minimum<double>(1.0)) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_pixel_filter(init_owner(*this) + init_name(\"pixel_filter\") + init_label(_(\"Pixel Filter\")) + init_description(_(\"Anti-aliasing type\")) + init_value(k3d::ri::RI_GAUSSIAN()) + init_values(pixel_filter_values())),\n\t\tm_pixel_filter_width(init_owner(*this) + init_name(\"pixel_filter_width\") + init_label(_(\"Pixel Filter Width\")) + init_description(_(\"Filter width in X\")) + init_value(2.0) + init_constraint(constraint::minimum(std::numeric_limits<double>::epsilon())) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_pixel_filter_height(init_owner(*this) + init_name(\"pixel_filter_height\") + init_label(_(\"Pixel Filter Height\")) + init_description(_(\"Filter width in Y\")) + init_value(2.0) + init_constraint(constraint::minimum(std::numeric_limits<double>::epsilon())) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_exposure(init_owner(*this) + init_name(\"exposure\") + init_label(_(\"Exposure\")) + init_description(_(\"Exposure\")) + init_value(1.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_gamma(init_owner(*this) + init_name(\"gamma\") + init_label(_(\"Gamma\")) + init_description(_(\"Gamma\")) + init_value(1.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_dof(init_owner(*this) + init_name(\"dof\") + init_label(_(\"DOF\")) + init_description(_(\"Depth of Field\")) + init_value(false)),\n\t\tm_fstop(init_owner(*this) + init_name(\"fstop\") + init_label(_(\"f-Stop\")) + init_description(_(\"f-Stop\")) + init_value(0.3) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_focal_length(init_owner(*this) + init_name(\"focal_length\") + init_label(_(\"Focal Length\")) + init_description(_(\"Focal Length\")) + init_value(1.6) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_focus_plane(init_owner(*this) + init_name(\"focus_plane\") + init_label(_(\"Focus Plane\")) + init_description(_(\"Focus Plane\")) + init_value(30.0) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_shading_rate(init_owner(*this) + init_name(\"shading_rate\") + init_label(_(\"Shading Rate\")) + init_description(_(\"Shading Rate\")) + init_value(1.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_shading_interpolation(init_owner(*this) + init_name(\"shading_interpolation\") + init_label(_(\"Shading Interpolation\")) + init_description(_(\"Shading Interpolation\")) + init_value(k3d::ri::RI_CONSTANT()) + init_values(shading_interpolation_values())),\n\t\tm_two_sided(init_owner(*this) + init_name(\"two_sided\") + init_label(_(\"Two-Sided\")) + init_description(_(\"Two Sided\")) + init_value(true)),\n\t\tm_motion_blur(init_owner(*this) + init_name(\"motion_blur\") + init_label(_(\"Motion Blur\")) + init_description(_(\"Motion Blur\")) + init_value(false)),\n\t\tm_render_motion_blur(init_owner(*this) + init_name(\"render_motion_blur\") + init_label(_(\"Render Motion Blur\")) + init_description(_(\"Render Motion Blur\")) + init_value(false))\n\t{\n\t\tk3d::iproperty_group_collection::group output_group(\"Output\");\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_resolution));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_hider));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_pixel_width));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_pixel_height));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_pixel_aspect_ratio));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_default_atmosphere_shader));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_default_interior_shader));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_default_exterior_shader));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_imager_shader));\n\t\toutput_group.properties.push_back(&static_cast<k3d::iproperty&>(m_render_alpha));\n\n\t\tk3d::iproperty_group_collection::group sampling_group(\"Sampling\");\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_bucket_width));\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_bucket_height));\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_grid_size));\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_eye_splits));\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_pixel_xsamples));\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_pixel_ysamples));\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_pixel_filter));\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_pixel_filter_width));\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_pixel_filter_height));\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_shading_rate));\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_shading_interpolation));\n\t\tsampling_group.properties.push_back(&static_cast<k3d::iproperty&>(m_render_motion_blur));\n\n\t\tk3d::iproperty_group_collection::group lens_group(\"Lens\");\n\t\tlens_group.properties.push_back(&static_cast<k3d::iproperty&>(m_exposure));\n\t\tlens_group.properties.push_back(&static_cast<k3d::iproperty&>(m_gamma));\n\t\tlens_group.properties.push_back(&static_cast<k3d::iproperty&>(m_dof));\n\t\tlens_group.properties.push_back(&static_cast<k3d::iproperty&>(m_fstop));\n\t\tlens_group.properties.push_back(&static_cast<k3d::iproperty&>(m_focal_length));\n\t\tlens_group.properties.push_back(&static_cast<k3d::iproperty&>(m_focus_plane));\n\n\t\tregister_property_group(output_group);\n\t\tregister_property_group(sampling_group);\n\t\tregister_property_group(lens_group);\n\n\t\tm_resolution.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_resolution_changed));\n\t}\n\n\tconst k3d::inode_collection_sink::properties_t node_collection_properties()\n\t{\n\t\tk3d::inode_collection_sink::properties_t results;\n\t\tresults.push_back(&m_visible_nodes);\n\t\tresults.push_back(&m_enabled_lights);\n\n\t\treturn results;\n\t}\n\n\tvoid on_resolution_changed(k3d::iunknown*)\n\t{\n\t\tconst std::string new_resolution = m_resolution.pipeline_value();\n\n\t\tconst k3d::resolutions_t& resolutions = k3d::resolutions();\n\t\tfor(k3d::resolutions_t::const_iterator resolution = resolutions.begin(); resolution != resolutions.end(); ++resolution)\n\t\t{\n\t\t\tif(resolution->name != new_resolution)\n\t\t\t\tcontinue;\n\n\t\t\tm_pixel_width.set_value(resolution->width);\n\t\t\tm_pixel_height.set_value(resolution->height);\n\t\t\treturn;\n\t\t}\n\n\t\tassert_not_reached();\n\t}\n\n\tbool render_camera_preview(k3d::icamera& Camera)\n\t{\n\t\tk3d::ri::irender_engine* const render_engine = m_render_engine.pipeline_value();\n\t\treturn_val_if_fail(render_engine, false);\n\t\treturn_val_if_fail(render_engine->installed(), false);\n\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-renderman-preview\");\n\t\tk3d::inetwork_render_frame& frame = job.create_frame(\"frame\");\n\t\tconst k3d::filesystem::path output_image = frame.add_file(\"output_image\");\n\n\t\tk3d::ri::shader_collection shaders;\n\t\treturn_val_if_fail(render(Camera, frame, *render_engine, output_image, true, shaders), false);\n\t\tsynchronize_shaders(shaders, *render_engine);\n\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tbool render_camera_frame(k3d::icamera& Camera, const k3d::filesystem::path& OutputImage, const bool ViewImage)\n\t{\n\t\tk3d::ri::irender_engine* const render_engine = m_render_engine.pipeline_value();\n\t\treturn_val_if_fail(render_engine, false);\n\t\treturn_val_if_fail(render_engine->installed(), false);\n\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-renderman-render-frame\");\n\t\tk3d::inetwork_render_frame& frame = job.create_frame(\"frame\");\n\t\tconst k3d::filesystem::path output_image = frame.add_file(\"output_image\");\n\n\t\tk3d::ri::shader_collection shaders;\n\t\treturn_val_if_fail(render(Camera, frame, *render_engine, output_image, false, shaders), false);\n\t\tsynchronize_shaders(shaders, *render_engine);\n\n\t\tframe.add_copy_command(output_image, OutputImage);\n\t\tif(ViewImage)\n\t\t\tframe.add_view_command(OutputImage);\n\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tbool render_camera_animation(k3d::icamera& Camera, k3d::iproperty& Time, const k3d::frames& Frames, const bool ViewCompletedImages)\n\t{\n\t\tk3d::ri::irender_engine* const render_engine = m_render_engine.pipeline_value();\n\t\treturn_val_if_fail(render_engine, false);\n\t\treturn_val_if_fail(render_engine->installed(), false);\n\n\t\tk3d::ri::shader_collection shaders;\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-renderman-render-animation\");\n\n\t\t// For each frame to be rendered ...\n\t\tk3d::uint_t frame_index = 0;\n\t\tfor(k3d::frames::const_iterator frame = Frames.begin(); frame != Frames.end(); ++frame, ++frame_index)\n\t\t{\n\t\t\t// Set the frame time ...\n\t\t\tk3d::property::set_internal_value(Time, frame->begin_time);\n\n\t\t\t// Redraw everything ...\n\t\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::SYNCHRONOUS);\n\n\t\t\t// Add a render frame to the job ...\n\t\t\tstd::stringstream buffer;\n\t\t\tbuffer << \"frame-\" << frame_index;\n\t\t\tk3d::inetwork_render_frame& render_frame = job.create_frame(buffer.str());\n\n\t\t\t// Create an output image path ...\n\t\t\tconst k3d::filesystem::path output_image = render_frame.add_file(\"output_image\");\n\n\t\t\t// Render it (hidden rendering) ...\n\t\t\treturn_val_if_fail(render(Camera, render_frame, *render_engine, output_image, false, shaders), false);\n\n\t\t\t// Copy the output image to its requested destination ...\n\t\t\trender_frame.add_copy_command(output_image, frame->destination);\n\n\t\t\t// View the output image when it's done ...\n\t\t\tif(ViewCompletedImages)\n\t\t\t\trender_frame.add_view_command(frame->destination);\n\t\t}\n\n\t\t// Ensure shaders are up-to-date ...\n\t\tsynchronize_shaders(shaders, *render_engine);\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<render_engine,\n\t\t\t\t k3d::interface_list<k3d::irender_camera_animation,\n\t\t\t\t k3d::interface_list<k3d::irender_camera_frame,\n\t\t\t\t k3d::interface_list<k3d::irender_camera_preview> > > > factory(\n\t\t\t\t\tk3d::classes::RenderManEngine(),\n\t\t\t\t\t\"RenderManEngine\",\n\t\t\t\t\t_(\"RenderMan Render Engine\"),\n\t\t\t\t\t\"RenderMan RenderEngine\",\n\t\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tbool render(k3d::icamera& Camera, k3d::inetwork_render_frame& Frame, k3d::ri::irender_engine& RenderEngine, const k3d::filesystem::path& OutputImagePath, const bool VisibleRender, k3d::ri::shader_collection& Shaders)\n\t{\n\t\t// Sanity checks ...\n\t\treturn_val_if_fail(!OutputImagePath.empty(), false);\n\n\t\t// Setup global time for this frame ...\n\t\tk3d::iproperty* const frame_rate_property = k3d::get_frame_rate(document());\n\t\tk3d::iproperty* const time_property = k3d::get_time(document());\n\t\tk3d::iwritable_property* const writable_time_property = dynamic_cast<k3d::iwritable_property*>(time_property);\n\t\treturn_val_if_fail(frame_rate_property && time_property && writable_time_property, false);\n\n\t\tconst double frame_delta = 1.0 / boost::any_cast<double>(k3d::property::pipeline_value(*frame_rate_property));\n\t\tconst double frame_time = boost::any_cast<double>(k3d::property::pipeline_value(*time_property));\n\n\t\t// Start our RIB file ...\n\t\tconst std::string ribfilename(\"world.rib\");\n\t\tconst k3d::filesystem::path ribfilepath = Frame.add_file(ribfilename);\n\n\t\t// Open the RIB file stream ...\n\t\tk3d::filesystem::ofstream ribfile(ribfilepath);\n\t\treturn_val_if_fail(ribfile.good(), false);\n\n\t\t// Setup the frame for RI rendering with the user's preferred engine ...\n\t\treturn_val_if_fail(RenderEngine.render(Frame, ribfilepath), false);\n\n\t\t// Create the Ri render engine object ...\n\t\tk3d::ri::stream stream(ribfile);\n\n\t\t// Administrivia ...\n\t\tstream.RiNewline();\n\t\tstream.RiComment(\"Created with K-3D Version \" K3D_VERSION \", http://www.k-3d.org\");\n\n\t\t// Set path options ...\n\t\tstream.RiNewline();\n\t\tstream.RiComment(\"Setup file search paths\");\n\n\t\tk3d::ri::parameter_list searchpath_options;\n\t\tsearchpath_options.push_back(\n\t\t\tk3d::ri::parameter(\n\t\t\t\t\"shader\",\n\t\t\t\tk3d::ri::UNIFORM,\n\t\t\t\t1,\n\t\t\t\tk3d::ri::string(k3d::shader_cache_path().native_filesystem_string() + \":&\")));\n\t\tstream.RiOptionV(\"searchpath\", searchpath_options);\n\n\t\t// Perform frame-start operations for textures\n\t\tstd::for_each(document().nodes().collection().begin(), document().nodes().collection().end(), detail::setup_texture(Frame, stream, Shaders));\n\n\t\t// Start the (final output) frame ...\n\t\tstream.RiNewline();\n\t\tstream.RiFrameBegin(1);\n\n\t\tconst std::string hider = m_hider.pipeline_value();\n\t\tif(!hider.empty())\n\t\t    stream.RiHiderV(hider);\n\n\t\t// Set limits options\n\t\tstream.RiNewline();\n\t\tstream.RiComment(\"Setup options\");\n\n\t\tk3d::typed_array<k3d::ri::integer>* const bucketsize = new k3d::typed_array<k3d::ri::integer>();\n\t\tbucketsize->push_back(m_bucket_width.pipeline_value());\n\t\tbucketsize->push_back(m_bucket_height.pipeline_value());\n\n\t\tk3d::ri::parameter_list limits;\n\t\tlimits.push_back(k3d::ri::parameter(\"gridsize\", k3d::ri::UNIFORM, 1, static_cast<k3d::ri::integer>(m_grid_size.pipeline_value())));\n\t\tlimits.push_back(k3d::ri::parameter(\"bucketsize\", k3d::ri::UNIFORM, 2, bucketsize));\n\t\tlimits.push_back(k3d::ri::parameter(\"eyesplits\", k3d::ri::UNIFORM, 1, static_cast<k3d::ri::integer>(m_eye_splits.pipeline_value())));\n\t\tlimits.push_back(k3d::ri::parameter(\"texturememory\", k3d::ri::UNIFORM, 1, static_cast<k3d::ri::integer>(m_texture_memory.pipeline_value())));\n\t\tstream.RiOptionV(\"limits\", limits);\n\n\t\t// Setup custom options ...\n\t\tstream.RiNewline();\n\t\tstream.RiComment(\"Setup user options\");\n\t\tk3d::ri::set_options(*this, stream);\n\n\t\t// Set the display type ...\n\t\tstream.RiNewline();\n\t\tstream.RiComment(\"Setup Display\");\n\n\t\tk3d::filesystem::path outputimage(OutputImagePath);\n\n\t\tif(VisibleRender)\n\t\t\tstream.RiDisplayV(outputimage.leaf().raw(), k3d::ri::RI_FRAMEBUFFER(), k3d::ri::RI_RGB());\n\t\telse\n\t\t{\n\t\t\tif(m_render_alpha.pipeline_value())\n\t\t\t\tstream.RiDisplayV(outputimage.leaf().raw(), k3d::ri::RI_FILE(), k3d::ri::RI_RGBA());\n\t\t\telse\n\t\t\t\tstream.RiDisplayV(outputimage.leaf().raw(), k3d::ri::RI_FILE(), k3d::ri::RI_RGB());\n\t\t}\n\n\t\tconst k3d::ri::unsigned_integer pixel_width = m_pixel_width.pipeline_value();\n\t\tconst k3d::ri::unsigned_integer pixel_height = m_pixel_height.pipeline_value();\n\t\tconst k3d::ri::real pixel_aspect_ratio = m_pixel_aspect_ratio.pipeline_value();\n\n\t\tstream.RiFormat(pixel_width, pixel_height, pixel_aspect_ratio);\n\n\t\t// Set pixel sampling rates ...\n\t\tstream.RiPixelSamples(m_pixel_xsamples.pipeline_value(), m_pixel_ysamples.pipeline_value());\n\t\tstream.RiPixelFilter(m_pixel_filter.pipeline_value(), m_pixel_filter_width.pipeline_value(), m_pixel_filter_height.pipeline_value());\n\n\t\t// Set gain & gamma ...\n\t\tstream.RiExposure(m_exposure.pipeline_value(), m_gamma.pipeline_value());\n\n\t\t// Set depth-of-field options ...\n\t\tif(m_dof.pipeline_value())\n\t\t\tstream.RiDepthOfField(\n\t\t\t\tm_fstop.pipeline_value(),\n\t\t\t\tm_focal_length.pipeline_value(),\n\t\t\t\tm_focus_plane.pipeline_value());\n\n\t\t// Set global shading rate ...\n\t\tstream.RiShadingRate(m_shading_rate.pipeline_value());\n\n\t\t// Set global shading interpolation ...\n\t\tstream.RiShadingInterpolation(m_shading_interpolation.pipeline_value());\n\n\t\t// We use LH orientation, the way Our Lord Who Art In Heaven wants us to ...\n\t\tstream.RiOrientation(k3d::ri::RI_LH());\n\n\t\t// Double-sided surfaces ...\n\t\tstream.RiSides(m_two_sided.pipeline_value() ? 2 : 1);\n\n\t\t// Crop window ...\n\t\tconst double crop_left = boost::any_cast<double>(k3d::property::pipeline_value(Camera.crop_window().crop_left()));\n\t\tconst double crop_right = boost::any_cast<double>(k3d::property::pipeline_value(Camera.crop_window().crop_right()));\n\t\tconst double crop_top = boost::any_cast<double>(k3d::property::pipeline_value(Camera.crop_window().crop_top()));\n\t\tconst double crop_bottom = boost::any_cast<double>(k3d::property::pipeline_value(Camera.crop_window().crop_bottom()));\n\n\t\tif(crop_left >= crop_right || crop_top >= crop_bottom)\n\t\t\tk3d::user_interface().message(\"Current crop window settings will produce an empty image\");\n\n\t\tstream.RiCropWindow(crop_left, crop_right, crop_top, crop_bottom);\n\n\t\t// Setup our motion-blur sampling loop ...\n\t\tk3d::ri::sample_times_t samples(1, 0.0);\n\t\tif(m_render_motion_blur.pipeline_value())\n\t\t\tsamples.push_back(1.0);\n\n\t\tconst bool motion_blur_camera = m_motion_blur.pipeline_value();\n\t\tstd::vector<k3d::point3> motion_blur_camera_position_samples;\n\t\tstd::vector<k3d::angle_axis> motion_blur_camera_orientation_samples;\n\n\t\tfor(boost::uint32_t sample_index = 0; sample_index < samples.size(); ++sample_index)\n\t\t{\n\t\t\t// Calculate the current time and animate the document ...\n\t\t\tconst double sample_delta = (samples.size() > 1) ? frame_delta / static_cast<double>(samples.size() - 1) : frame_delta;\n\t\t\tconst double sample_time = frame_time + (sample_index * sample_delta);\n\n\t\t\twritable_time_property->property_set_value(sample_time);\n\n\t\t\tconst k3d::matrix4 transform_matrix = boost::any_cast<k3d::matrix4>(k3d::property::pipeline_value(Camera.transformation().matrix_source_output()));\n\t\t\tconst k3d::angle_axis orientation(k3d::euler_angles(transform_matrix, k3d::euler_angles::ZXYstatic));\n\t\t\tconst k3d::point3 position(k3d::position(transform_matrix));\n\n\t\t\tmotion_blur_camera_position_samples.push_back(position);\n\t\t\tmotion_blur_camera_orientation_samples.push_back(orientation);\n\n\t\t\t// Setup render state ...\n\t\t\tk3d::ri::render_state state(Frame, stream, Shaders, Camera.projection(), k3d::ri::FINAL_FRAME, samples, sample_index, transform_matrix);\n\n\t\t\tif(k3d::ri::last_sample(state))\n\t\t\t{\n\t\t\t\tstream.RiNewline();\n\t\t\t\tstream.RiComment(\"Setup viewing transformation\");\n\n\t\t\t\tif(k3d::iperspective* const perspective = dynamic_cast<k3d::iperspective*>(&Camera.projection()))\n\t\t\t\t{\n\t\t\t\t\tconst double left = boost::any_cast<double>(k3d::property::pipeline_value(perspective->left()));\n\t\t\t\t\tconst double right = boost::any_cast<double>(k3d::property::pipeline_value(perspective->right()));\n\t\t\t\t\tconst double top = boost::any_cast<double>(k3d::property::pipeline_value(perspective->top()));\n\t\t\t\t\tconst double bottom = boost::any_cast<double>(k3d::property::pipeline_value(perspective->bottom()));\n\t\t\t\t\tconst double near = boost::any_cast<double>(k3d::property::pipeline_value(perspective->near()));\n\t\t\t\t\tconst double far = boost::any_cast<double>(k3d::property::pipeline_value(perspective->far()));\n\t\t\t\t\treturn_val_if_fail(near > 0, false);\n\n\t\t\t\t\tstream.RiProjectionV(\"perspective\");\n\t\t\t\t\tstream.RiScreenWindow(left / near, right / near, bottom / near, top / near);\n\t\t\t\t\tstream.RiClipping(near, far);\n\t\t\t\t}\n\t\t\t\telse if(k3d::iorthographic* const orthographic = dynamic_cast<k3d::iorthographic*>(&Camera.projection()))\n\t\t\t\t{\n\t\t\t\t\tconst double left = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->left()));\n\t\t\t\t\tconst double right = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->right()));\n\t\t\t\t\tconst double top = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->top()));\n\t\t\t\t\tconst double bottom = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->bottom()));\n\t\t\t\t\tconst double near = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->near()));\n\t\t\t\t\tconst double far = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->far()));\n\t\t\t\t\treturn_val_if_fail(near > 0, false);\n\n\t\t\t\t\tconst k3d::matrix4 transform_matrix = boost::any_cast<k3d::matrix4>(k3d::property::pipeline_value(Camera.transformation().matrix_source_output()));\n\t\t\t\t\tconst k3d::point3 world_position = transform_matrix * k3d::point3(0, 0, 0);\n\t\t\t\t\tconst k3d::point3 world_target = boost::any_cast<k3d::point3>(Camera.world_target().property_internal_value());\n\n\t\t\t\t\tconst double distance = k3d::distance(world_position, world_target);\n\t\t\t\t\tconst double height = top - bottom;\n\t\t\t\t\treturn_val_if_fail(height, false);\n\n\t\t\t\t\tconst double aspect = (right - left) / height;\n\t\t\t\t\tconst double tan_fov = height * 0.5 / near;\n\t\t\t\t\tconst double size = distance * tan_fov;\n\n\t\t\t\t\tstream.RiProjectionV(\"orthographic\");\n\t\t\t\t\tstream.RiScreenWindow(-size * aspect, size * aspect, -size, size);\n\t\t\t\t\tstream.RiClipping(near, far);\n\t\t\t\t}\n\n\t\t\t\tif(k3d::ri::motion_blur(state) && motion_blur_camera)\n\t\t\t\t{\n\t\t\t\t\tstream.RiMotionBeginV(state.sample_times);\n\t\t\t\t\tfor(unsigned int i = 0; i < motion_blur_camera_orientation_samples.size(); ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::quaternion q(motion_blur_camera_orientation_samples[i]);\n\t\t\t\t\t\tk3d::euler_angles a(q, k3d::euler_angles::ZXYstatic);\n\t\t\t\t\t\tstream.RiRotate(-k3d::degrees(a[0]), 0.0f, 0.0f, 1.0f);\n\t\t\t\t\t}\n\t\t\t\t\tstream.RiMotionEnd();\n\n\t\t\t\t\tstream.RiMotionBeginV(state.sample_times);\n\t\t\t\t\tfor(unsigned int i = 0; i < motion_blur_camera_orientation_samples.size(); ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::quaternion q(motion_blur_camera_orientation_samples[i]);\n\t\t\t\t\t\tk3d::euler_angles a(q, k3d::euler_angles::ZXYstatic);\n\t\t\t\t\t\tstream.RiRotate(-k3d::degrees(a[1]), 1.0f, 0.0f, 0.0f);\n\t\t\t\t\t}\n\t\t\t\t\tstream.RiMotionEnd();\n\n\t\t\t\t\tstream.RiMotionBeginV(state.sample_times);\n\t\t\t\t\tfor(unsigned int i = 0; i < motion_blur_camera_orientation_samples.size(); ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::quaternion q(motion_blur_camera_orientation_samples[i]);\n\t\t\t\t\t\tk3d::euler_angles a(q, k3d::euler_angles::ZXYstatic);\n\t\t\t\t\t\tstream.RiRotate(-k3d::degrees(a[2]), 0.0f, 1.0f, 0.0f);\n\t\t\t\t\t}\n\t\t\t\t\tstream.RiMotionEnd();\n\n\t\t\t\t\tstream.RiMotionBeginV(state.sample_times);\n\t\t\t\t\tfor(unsigned int i = 0; i < motion_blur_camera_position_samples.size(); ++i)\n\t\t\t\t\t\tstream.RiTranslate(-motion_blur_camera_position_samples[i][0], -motion_blur_camera_position_samples[i][1], -motion_blur_camera_position_samples[i][2]);\n\t\t\t\t\tstream.RiMotionEnd();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tk3d::quaternion q(motion_blur_camera_orientation_samples[0]);\n\t\t\t\t\tk3d::euler_angles a(q, k3d::euler_angles::ZXYstatic);\n\t\t\t\t\tstream.RiRotate(-k3d::degrees(a[0]), 0.0f, 0.0f, 1.0f);\n\n\t\t\t\t\tq = k3d::quaternion(motion_blur_camera_orientation_samples[0]);\n\t\t\t\t\ta = k3d::euler_angles(q, k3d::euler_angles::ZXYstatic);\n\t\t\t\t\tstream.RiRotate(-k3d::degrees(a[1]), 1.0f, 0.0f, 0.0f);\n\n\t\t\t\t\tq = k3d::quaternion(motion_blur_camera_orientation_samples[0]);\n\t\t\t\t\ta = k3d::euler_angles(q, k3d::euler_angles::ZXYstatic);\n\t\t\t\t\tstream.RiRotate(-k3d::degrees(a[2]), 0.0f, 1.0f, 0.0f);\n\n\t\t\t\t\tstream.RiTranslate(-motion_blur_camera_position_samples[0][0], -motion_blur_camera_position_samples[0][1], -motion_blur_camera_position_samples[0][2]);\n\t\t\t\t}\n\n\t\t\t\t// Default shaders ...\n\t\t\t\tif(m_default_atmosphere_shader.pipeline_value())\n\t\t\t\t\tm_default_atmosphere_shader.pipeline_value()->setup_renderman_atmosphere_shader(state);\n\t\t\t\tif(m_default_interior_shader.pipeline_value())\n\t\t\t\t\tm_default_interior_shader.pipeline_value()->setup_renderman_interior_shader(state);\n\t\t\t\tif(m_default_exterior_shader.pipeline_value())\n\t\t\t\t\tm_default_exterior_shader.pipeline_value()->setup_renderman_exterior_shader(state);\n\t\t\t\tif(m_imager_shader.pipeline_value())\n\t\t\t\t\tm_imager_shader.pipeline_value()->setup_renderman_imager_shader(state);\n\n\t\t\t\t// Begin the world ...\n\t\t\t\tstream.RiNewline();\n\t\t\t\tstream.RiWorldBegin();\n\t\t\t}\n\n\t\t\t// Setup lights ...\n\t\t\tconst k3d::inode_collection_property::nodes_t enabled_lights = m_enabled_lights.pipeline_value();\n\t\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = enabled_lights.begin(); node != enabled_lights.end(); ++node)\n\t\t\t{\n\t\t\t\tif(k3d::ri::ilight* const light = dynamic_cast<k3d::ri::ilight*>(*node))\n\t\t\t\t\tlight->setup_renderman_light(state);\n\t\t\t}\n\n\t\t\t// Render nodes ...\n\t\t\tconst k3d::inode_collection_property::nodes_t visible_nodes = m_visible_nodes.pipeline_value();\n\t\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = visible_nodes.begin(); node != visible_nodes.end(); ++node)\n\t\t\t{\n\t\t\t\tif(k3d::ri::irenderable* const renderable = dynamic_cast<k3d::ri::irenderable*>(*node))\n\t\t\t\t\trenderable->renderman_render(state);\n\t\t\t}\n\n\t\t\t// Give nodes a chance to cleanup ...\n\t\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = visible_nodes.begin(); node != visible_nodes.end(); ++node)\n\t\t\t{\n\t\t\t\tif(k3d::ri::irenderable* const renderable = dynamic_cast<k3d::ri::irenderable*>(*node))\n\t\t\t\t\trenderable->renderman_render_complete(state);\n\t\t\t}\n\n\t\t\tif(k3d::ri::last_sample(state))\n\t\t\t{\n\t\t\t\t// Finish the world ...\n\t\t\t\tstream.RiWorldEnd();\n\t\t\t}\n\t\t}\n\n\t\t// Finish the frame ...\n\t\tstream.RiFrameEnd();\n\n\t\t// Reset the time back to the beginning of the frame ...\n\t\twritable_time_property->property_set_value(frame_time);\n\n\t\treturn true;\n\t}\n\n\tvoid synchronize_shaders(const k3d::ri::shader_collection& Shaders, k3d::ri::irender_engine& RenderEngine)\n\t{\n\t\t// Compile each shader in the given collection ...\n\t\tconst k3d::ri::shader_collection::shaders_t& shaders = Shaders.shaders();\n\t\tfor(k3d::ri::shader_collection::shaders_t::const_iterator shader = shaders.begin(); shader != shaders.end(); ++shader)\n\t\t{\n\t\t\tif(!RenderEngine.compile_shader(*shader))\n\t\t\t\tk3d::log() << error << k3d::string_cast(boost::format(_(\"Error compiling shader %1%\")) % shader->native_utf8_string().raw()) << std::endl;\n\t\t}\n\t}\n\n\t/// Helper class that limits the list of visible nodes to those that implement k3d::ri::irenderable\n\ttemplate<typename value_t, class name_policy_t>\n\tclass renderman_visible_nodes_property :\n\t\tpublic k3d::data::writable_property<value_t, name_policy_t>,\n\t\tpublic k3d::inode_collection_property\n\t{\n\t\ttypedef k3d::data::writable_property<value_t, name_policy_t> base;\n\n\tpublic:\n\t\tbool property_allow(k3d::inode& Node)\n\t\t{\n\t\t\treturn dynamic_cast<k3d::ri::irenderable*>(&Node) ? true : false;\n\t\t}\n\n\tprotected:\n\t\ttemplate<typename init_t>\n\t\trenderman_visible_nodes_property(const init_t& Init) :\n\t\t\tbase(Init)\n\t\t{\n\t\t}\n\t};\n\n\t/// Helper class that limits the list of enabled lights to those the implement k3d::ri::ilight\n\ttemplate<typename value_t, class name_policy_t>\n\tclass renderman_enabled_lights_property :\n\t\tpublic k3d::data::writable_property<value_t, name_policy_t>,\n\t\tpublic k3d::inode_collection_property\n\t{\n\t\ttypedef k3d::data::writable_property<value_t, name_policy_t> base;\n\n\tpublic:\n\t\tbool property_allow(k3d::inode& Node)\n\t\t{\n\t\t\treturn dynamic_cast<k3d::ri::ilight*>(&Node) ? true : false;\n\t\t}\n\n\tprotected:\n\t\ttemplate<typename init_t>\n\t\trenderman_enabled_lights_property(const init_t& Init) :\n\t\t\tbase(Init)\n\t\t{\n\t\t}\n\t};\n\n\tk3d_data(k3d::inode_collection_property::nodes_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, renderman_visible_nodes_property, node_collection_serialization) m_visible_nodes;\n\tk3d_data(k3d::inode_collection_property::nodes_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, renderman_enabled_lights_property, node_collection_serialization) m_enabled_lights;\n\tk3d_data(k3d::ri::irender_engine*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_render_engine;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_resolution;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_hider;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_width;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_height;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_aspect_ratio;\n\tk3d_data(k3d::ri::ivolume_shader*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_default_atmosphere_shader;\n\tk3d_data(k3d::ri::ivolume_shader*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_default_interior_shader;\n\tk3d_data(k3d::ri::ivolume_shader*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_default_exterior_shader;\n\tk3d_data(k3d::ri::iimager_shader*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_imager_shader;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_bucket_width;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_bucket_height;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_grid_size;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_eye_splits;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_texture_memory;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_render_alpha;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_xsamples;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_ysamples;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_pixel_filter;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_filter_width;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_filter_height;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_exposure;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_gamma;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_dof;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_fstop;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_focal_length;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_focus_plane;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_shading_rate;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_shading_interpolation;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_two_sided;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_motion_blur;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_render_motion_blur;\n\n\tconst k3d::ilist_property<std::string>::values_t& pixel_filter_values()\n\t{\n\t\tstatic k3d::ilist_property<std::string>::values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ri::RI_GAUSSIAN());\n\t\t\tvalues.push_back(k3d::ri::RI_BOX());\n\t\t\tvalues.push_back(k3d::ri::RI_TRIANGLE());\n\t\t\tvalues.push_back(k3d::ri::RI_CATMULL_ROM());\n\t\t\tvalues.push_back(k3d::ri::RI_SINC());\n\t\t}\n\t\treturn values;\n\t}\n\n\tconst k3d::ilist_property<std::string>::values_t& shading_interpolation_values()\n\t{\n\t\tstatic k3d::ilist_property<std::string>::values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ri::RI_CONSTANT());\n\t\t\tvalues.push_back(k3d::ri::RI_SMOOTH());\n\t\t}\n\t\treturn values;\n\t}\n};\n\nk3d::iplugin_factory& render_engine_factory()\n{\n\treturn render_engine::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/renderman_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the RenderManScript K-3D object, which can insert scripted data into RenderMan output\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/scripted_node.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transformable.h>\n\n#define DEFAULT_SCRIPT \"#python\\n\\n\\\nimport k3d\\n\\\nimport math\\n\\\nimport sys\\n\\\nimport ri\\n\\\nfrom ri import *\\n\\n\\\n# Redirect output to our RIB archive\\n\\\nri._ribout = open(Archive, \\\"w\\\")\\n\\n\\\nRiSphere(5, -5, 5, 360)\\n\\n\\\nri._ribout.flush()\\n\"\n\nnamespace\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// renderman_script\n\nclass renderman_script :\n\tpublic k3d::scripted_node<k3d::gl::renderable<k3d::ri::renderable<k3d::transformable<k3d::node > > > >\n{\n\ttypedef k3d::scripted_node<k3d::gl::renderable<k3d::ri::renderable<k3d::transformable<k3d::node > > > > base;\n\npublic:\n\trenderman_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(DEFAULT_SCRIPT);\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tglDisable(GL_LIGHTING);\n\t\tglColor3d(1, 1, 0);\n\n\t\tglBegin(GL_POINTS);\n\t\tglVertex3d(0, 0, 0);\n\t\tglEnd();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\n\t\tglBegin(GL_POINTS);\n\t\tglVertex3d(0, 0, 0);\n\t\tglEnd();\n\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid on_renderman_render(const k3d::ri::render_state& State)\n\t{\n\t\t// Get a path where we can store the scripted RIB output ...\n\t\tconst k3d::filesystem::path archive_path = State.frame.add_file(\"renderman_script\");\n\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"archive\"] = archive_path;\n\t\tcontext[\"render_state\"] = &State;\n\n\t\treturn_if_fail(execute_script(context));\n\n\t\tState.stream.RiReadArchive(archive_path);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<renderman_script,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\tk3d::uuid(0xded017f6, 0xa08849fd, 0xa9d8dd63, 0xe3cd6f1d),\n\t\t\t\"RenderManScript\",\n\t\t\t_(\"Creates RenderMan output under script control\"),\n\t\t\t\"RenderMan Script\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n} // namespace\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// renderman_script_factory\n\nk3d::iplugin_factory& renderman_script_factory()\n{\n\treturn renderman_script::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/shaders.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/irender_camera_preview.h>\n#include <k3dsdk/idisplacement_shader_ri.h>\n#include <k3dsdk/iimager_shader_ri.h>\n#include <k3dsdk/ilight_shader_ri.h>\n#include <k3dsdk/inetwork_render_farm.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/inetwork_render_job.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/istream_ri.h>\n#include <k3dsdk/irender_preview.h>\n#include <k3dsdk/ishader_collection_ri.h>\n#include <k3dsdk/isurface_shader_ri.h>\n#include <k3dsdk/ivolume_shader_ri.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/network_render_farm.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/property_group_collection.h>\n#include <k3dsdk/stream_ri.h>\n#include <k3dsdk/render_state_ri.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/shader_collection_ri.h>\n#include <k3dsdk/shader_ri.h>\n#include <k3dsdk/share.h>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// displacement_shader\n\n/// Implements a RenderMan displacement shader plugin\nclass displacement_shader :\n\tpublic k3d::ri::shader,\n\tpublic k3d::ri::idisplacement_shader\n{\n\ttypedef k3d::ri::shader base;\n\npublic:\n\tdisplacement_shader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::sl::shader::DISPLACEMENT)\n\t{\n\t}\n\n\tvoid setup_renderman_displacement_shader(const k3d::ri::render_state& State)\n\t{\n\t\tState.shaders.use_shader(shader_path());\n\t\tState.stream.RiDisplacementV(shader_path(), shader_name(), shader_arguments(State));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<displacement_shader,\n\t\t\t\tk3d::interface_list<k3d::ri::idisplacement_shader> > factory(\n\t\t\tk3d::classes::RenderManDisplacementShader(),\n\t\t\t\"RenderManDisplacementShader\",\n\t\t\t_(\"Encapsulates a RenderMan displacement shader instance\"),\n\t\t\t\"RenderMan\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// imager_shader\n\n/// Implements a RenderMan imager shader plugin\nclass imager_shader :\n\tpublic k3d::ri::shader,\n\tpublic k3d::ri::iimager_shader\n{\n\ttypedef k3d::ri::shader base;\n\npublic:\n\timager_shader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::sl::shader::IMAGER)\n\t{\n\t}\n\n\tvoid setup_renderman_imager_shader(const k3d::ri::render_state& State)\n\t{\n\t\tState.shaders.use_shader(shader_path());\n\t\tState.stream.RiImagerV(shader_path(), shader_name(), shader_arguments(State));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<imager_shader,\n\t\t\t\tk3d::interface_list<k3d::ri::iimager_shader> > factory(\n\t\t\tk3d::classes::RenderManImagerShader(),\n\t\t\t\"RenderManImagerShader\",\n\t\t\t\"Encapsulates a RenderMan imager shader instance\",\n\t\t\t\"RenderMan\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// light_shader\n\n/// Implements a RenderMan light shader plugin\nclass light_shader :\n\tpublic k3d::ri::shader,\n\tpublic k3d::ri::ilight_shader\n{\n\ttypedef k3d::ri::shader base;\n\npublic:\n\tlight_shader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::sl::shader::LIGHT)\n\t{\n\t}\n\n\tvoid setup_renderman_light_shader(const k3d::ri::render_state& State)\n\t{\n\t\tState.shaders.use_shader(shader_path());\n\t\tState.stream.RiLightSourceV(shader_path(), shader_name(), shader_arguments(State));\n\t}\n\n\tvoid setup_renderman_area_light_shader(const k3d::ri::render_state& State)\n\t{\n\t\tState.shaders.use_shader(shader_path());\n\t\tState.stream.RiAreaLightSourceV(shader_path(), shader_name(), shader_arguments(State));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<light_shader,\n\t\t\t\tk3d::interface_list<k3d::ri::ilight_shader> > factory(\n\t\t\tk3d::classes::RenderManLightShader(),\n\t\t\t\"RenderManLightShader\",\n\t\t\t\"Encapsulates a RenderMan light shader instance\",\n\t\t\t\"RenderMan\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// surface_shader\n\n/// Implements a RenderMan surface shader plugin\nclass surface_shader :\n\tpublic k3d::ri::shader,\n\tpublic k3d::ri::isurface_shader,\n\tpublic k3d::property_group_collection\n{\n\ttypedef k3d::ri::shader base;\n\npublic:\n\tsurface_shader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::sl::shader::SURFACE)\n\t{\n\t}\n\n\tvoid setup_renderman_surface_shader(const k3d::ri::render_state& State)\n\t{\n\t\tState.shaders.use_shader(shader_path());\n\t\tState.stream.RiSurfaceV(shader_path(), shader_name(), shader_arguments(State));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<surface_shader, k3d::interface_list<k3d::ri::isurface_shader> > factory(\n\t\t\tk3d::classes::RenderManSurfaceShader(),\n\t\t\t\"RenderManSurfaceShader\",\n\t\t\t\"Encapsulates a RenderMan surface shader instance\",\n\t\t\t\"RenderMan\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// volume_shader\n\n/// Implements a RenderMan volume shader plugin\nclass volume_shader :\n\tpublic k3d::ri::shader,\n\tpublic k3d::ri::ivolume_shader\n{\n\ttypedef k3d::ri::shader base;\n\npublic:\n\tvolume_shader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document, k3d::sl::shader::VOLUME)\n\t{\n\t}\n\n\tvoid setup_renderman_atmosphere_shader(const k3d::ri::render_state& State)\n\t{\n\t\tState.shaders.use_shader(shader_path());\n\t\tState.stream.RiAtmosphereV(shader_path(), shader_name(), shader_arguments(State));\n\t}\n\n\tvoid setup_renderman_interior_shader(const k3d::ri::render_state& State)\n\t{\n\t\tState.shaders.use_shader(shader_path());\n\t\tState.stream.RiInteriorV(shader_path(), shader_name(), shader_arguments(State));\n\t}\n\n\tvoid setup_renderman_exterior_shader(const k3d::ri::render_state& State)\n\t{\n\t\tState.shaders.use_shader(shader_path());\n\t\tState.stream.RiExteriorV(shader_path(), shader_name(), shader_arguments(State));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<volume_shader,\n\t\t\t\tk3d::interface_list<k3d::ri::ivolume_shader> > factory(\n\t\t\tk3d::classes::RenderManVolumeShader(),\n\t\t\t\"RenderManVolumeShader\",\n\t\t\t\"Encapsulates a RenderMan volume shader instance\",\n\t\t\t\"RenderMan\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// shader factories\n\nk3d::iplugin_factory& displacement_shader_factory()\n{\n\treturn displacement_shader::get_factory();\n}\n\nk3d::iplugin_factory& imager_shader_factory()\n{\n\treturn imager_shader::get_factory();\n}\n\nk3d::iplugin_factory& light_shader_factory()\n{\n\treturn light_shader::get_factory();\n}\n\nk3d::iplugin_factory& surface_shader_factory()\n{\n\treturn surface_shader::get_factory();\n}\n\nk3d::iplugin_factory& volume_shader_factory()\n{\n\treturn volume_shader::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/shadow_map.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/istream_ri.h>\n#include <k3dsdk/itexture_ri.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/resolutions.h>\n#include <k3dsdk/types_ri.h>\n#include <k3dsdk/vectors.h>\n\nnamespace libk3drenderman\n{\n\n/// Implements the ShadowMap plugin, which is used to generate RenderMan shadow maps for fast rendering\n/////////////////////////////////////////////////////////////////////////////\n// shadow_map\n\nclass shadow_map :\n\tpublic k3d::node,\n\tpublic k3d::ri::itexture\n{\n\ttypedef k3d::node base;\n\npublic:\n\tshadow_map(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_camera(init_owner(*this) + init_name(\"camera\") + init_label(_(\"Camera\")) + init_description(_(\"Shadow Map Camera\")) + init_value<k3d::icamera*>(0)),\n\t\tm_create_shadow_map(init_owner(*this) + init_name(\"create\") + init_label(_(\"create\")) + init_description(_(\"Create shadow map during rendering\")) + init_value(true)),\n\t\tm_view_shadow_map(init_owner(*this) + init_name(\"view\") + init_label(_(\"view\")) + init_description(_(\"View shadow map creation during rendering\")) + init_value(true)),\n\t\tm_resolution(init_owner(*this) + init_name(\"resolution\") + init_label(_(\"Resolution\")) + init_description(_(\"Choose a predefined image resolution\")) + init_enumeration(k3d::resolution_values()) + init_value(std::string(\"\"))),\n\t\tm_pixel_width(init_owner(*this) + init_name(\"pixel_width\") + init_label(_(\"pixel_width\")) + init_description(_(\"Output pixel width\")) + init_value(256) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_pixel_height(init_owner(*this) + init_name(\"pixel_height\") + init_label(_(\"pixel_height\")) + init_description(_(\"Output pixel height\")) + init_value(256) + init_constraint(constraint::minimum<k3d::int32_t>(1)) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_pixel_aspect_ratio(init_owner(*this) + init_name(\"pixel_aspect_ratio\") + init_label(_(\"pixel_aspect_ratio\")) + init_description(_(\"Output pixel aspect ratio\")) + init_value(1.0) + init_constraint(constraint::minimum(std::numeric_limits<double>::epsilon())) + init_step_increment(0.01) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_resolution.changed_signal().connect(sigc::mem_fun(*this, &shadow_map::on_resolution_changed));\n\t}\n\n\tvoid on_resolution_changed(k3d::iunknown*)\n\t{\n\t\tconst std::string new_resolution = m_resolution.pipeline_value();\n\n\t\tconst k3d::resolutions_t& resolutions = k3d::resolutions();\n\t\tfor(k3d::resolutions_t::const_iterator resolution = resolutions.begin(); resolution != resolutions.end(); ++resolution)\n\t\t{\n\t\t\tif(resolution->name != new_resolution)\n\t\t\t\tcontinue;\n\n\t\t\tm_pixel_width.set_value(resolution->width);\n\t\t\tm_pixel_height.set_value(resolution->height);\n\t\t\treturn;\n\t\t}\n\n\t\tassert_not_reached();\n\t}\n\n\tvoid setup_renderman_texture(k3d::inetwork_render_frame& Frame, k3d::ri::istream& Stream, k3d::ri::ishader_collection& Shaders)\n\t{\n\t\tm_shadow_map_path = k3d::filesystem::path();\n\n\t\tif(!m_create_shadow_map.pipeline_value())\n\t\t\treturn;\n\n\t\tk3d::icamera* const camera = m_camera.pipeline_value();\n\t\treturn_if_fail(camera);\n\n\t\tStream.RiFrameBegin(0);\n\n\t\tm_shadow_map_path = Frame.add_file(\"shadowmap.z\");\n\n\t\tStream.RiDisplayV(m_shadow_map_path.native_filesystem_string(), \"shadow\", k3d::ri::RI_Z());\n\n\t\tif(m_view_shadow_map.pipeline_value())\n\t\t\tStream.RiDisplayV(\"+\" + name(), \"zframebuffer\", k3d::ri::RI_Z());\n\n\t\tStream.RiFormat(m_pixel_width.pipeline_value(), m_pixel_height.pipeline_value(), 1);\n\t\tStream.RiPixelSamples(1, 1);\n\t\tStream.RiPixelFilter(k3d::ri::RI_BOX(), 1, 1);\n\n\t\tk3d::ri::parameter_list hider_parameters;\n\t\thider_parameters.push_back(k3d::ri::parameter(\"depthfilter\", k3d::ri::UNIFORM, 1, k3d::ri::string(\"midpoint\")));\n\t\tStream.RiHiderV(\"hidden\", hider_parameters);\n\n\t\t// Setup up viewing transformations\n\t\tStream.RiComment(\"Setup shadowmap viewing transformations\");\n\n\t\tif(k3d::iperspective* const perspective = dynamic_cast<k3d::iperspective*>(&camera->projection()))\n\t\t{\n\t\t\tconst double left = boost::any_cast<double>(k3d::property::pipeline_value(perspective->left()));\n\t\t\tconst double right = boost::any_cast<double>(k3d::property::pipeline_value(perspective->right()));\n\t\t\tconst double top = boost::any_cast<double>(k3d::property::pipeline_value(perspective->top()));\n\t\t\tconst double bottom = boost::any_cast<double>(k3d::property::pipeline_value(perspective->bottom()));\n\t\t\tconst double near = boost::any_cast<double>(k3d::property::pipeline_value(perspective->near()));\n\t\t\tconst double far = boost::any_cast<double>(k3d::property::pipeline_value(perspective->far()));\n\t\t\treturn_if_fail(near > 0);\n\n\t\t\tStream.RiProjectionV(\"perspective\");\n\t\t\tStream.RiScreenWindow(left / near, right / near, bottom / near, top / near);\n\t\t\tStream.RiClipping(near, far);\n\t\t}\n\t\telse if(k3d::iorthographic* const orthographic = dynamic_cast<k3d::iorthographic*>(&camera->projection()))\n\t\t{\n\t\t\tconst double left = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->left()));\n\t\t\tconst double right = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->right()));\n\t\t\tconst double top = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->top()));\n\t\t\tconst double bottom = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->bottom()));\n\t\t\tconst double near = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->near()));\n\t\t\tconst double far = boost::any_cast<double>(k3d::property::pipeline_value(orthographic->far()));\n\t\t\treturn_if_fail(near > 0);\n\n\t\t\tconst k3d::matrix4 transform_matrix = boost::any_cast<k3d::matrix4>(k3d::property::pipeline_value(camera->transformation().matrix_source_output()));\n\t\t\tconst k3d::point3 world_position = transform_matrix * k3d::point3(0, 0, 0);\n\t\t\tconst k3d::point3 world_target = boost::any_cast<k3d::point3>(camera->world_target().property_internal_value());\n\n\t\t\tconst double distance = k3d::distance(world_position, world_target);\n\t\t\tconst double height = top - bottom;\n\t\t\treturn_if_fail(height);\n\n\t\t\tconst double aspect = (right - left) / height;\n\t\t\tconst double tan_fov = height * 0.5 / near;\n\t\t\tconst double size = distance * tan_fov;\n\n\t\t\tStream.RiProjectionV(\"orthographic\");\n\t\t\tStream.RiScreenWindow(-size * aspect, size * aspect, -size, size);\n\t\t\tStream.RiClipping(near, far);\n\t\t}\n\n\t\t// Setup the camera viewing transform ...\n\t\tconst k3d::matrix4 transform_matrix = boost::any_cast<k3d::matrix4>(k3d::property::pipeline_value(camera->transformation().matrix_source_output()));\n\t\tStream.RiTransform(k3d::ri::convert(k3d::inverse(transform_matrix)));\n\n\t\tStream.RiWorldBegin();\n\n\t\t// Render objects ...\n\t\tk3d::ri::render_state state(Frame, Stream, Shaders, camera->projection(), k3d::ri::SHADOW_MAP, k3d::ri::sample_times_t(1, 0.0), 0, transform_matrix);\n\t\tfor(k3d::nodes_t::const_iterator node = document().nodes().collection().begin(); node != document().nodes().collection().end(); ++node)\n\t\t{\n\t\t\tif(k3d::ri::irenderable* const renderable = dynamic_cast<k3d::ri::irenderable*>(*node))\n\t\t\t\trenderable->renderman_render(state);\n\t\t}\n\n\t\tStream.RiWorldEnd();\n\t\tStream.RiFrameEnd();\n\t}\n\n\tconst k3d::filesystem::path renderman_texture_path(const k3d::ri::render_state& State)\n\t{\n\t\treturn m_shadow_map_path;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<shadow_map,\n\t\t\t\tk3d::interface_list<k3d::ri::itexture> > factory(\n\t\t\t\tk3d::uuid(0x9bce6e2b, 0x083c4353, 0x829052e9, 0xf98c7023),\n\t\t\t\t\"RenderManShadowMap\",\n\t\t\t\t_(\"A shadow_map source within the 3D workspace\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::icamera*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_camera;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_create_shadow_map;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_view_shadow_map;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_resolution;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_width;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_height;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_aspect_ratio;\n\n\tk3d::filesystem::path m_shadow_map_path;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// shadow_map_factory\n\nk3d::iplugin_factory& shadow_map_factory()\n{\n\treturn shadow_map::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman/texture_map.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/axis.h>\n#include <k3dsdk/bitmap_modifier.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/ibitmap_exporter.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/istream_ri.h>\n#include <k3dsdk/itexture_ri.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/types_ri.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iterator>\n\nnamespace libk3drenderman\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// texture_map\n\nclass texture_map :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_modifier<texture_map>,\n\tpublic k3d::ri::itexture\n{\n\ttypedef k3d::node base;\n\npublic:\n\ttexture_map(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_cache_path(k3d::system::generate_temp_file()),\n\t\tm_refresh_cache(true),\n\t\tm_swrap(init_owner(*this) + init_name(\"swrap\") + init_label(_(\"swrap\")) + init_description(_(\"S Wrap\")) + init_value(k3d::ri::RI_CLAMP()) + init_values(wrap_values())),\n\t\tm_twrap(init_owner(*this) + init_name(\"twrap\") + init_label(_(\"twrap\")) + init_description(_(\"T Wrap\")) + init_value(k3d::ri::RI_CLAMP()) + init_values(wrap_values())),\n\t\tm_filter(init_owner(*this) + init_name(\"filter\") + init_label(_(\"filter\")) + init_description(_(\"Filter\")) + init_value(k3d::ri::RI_GAUSSIAN()) + init_values(filter_values())),\n\t\tm_swidth(init_owner(*this) + init_name(\"swidth\") + init_label(_(\"swidth\")) + init_description(_(\"Filter S Width\")) + init_value(2.0) + init_constraint(constraint::minimum(std::numeric_limits<double>::epsilon())) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_twidth(init_owner(*this) + init_name(\"twidth\") + init_label(_(\"twidth\")) + init_description(_(\"Filter T Width\")) + init_value(2.0) + init_constraint(constraint::minimum(std::numeric_limits<double>::epsilon())) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t}\n\n\t~texture_map()\n\t{\n\t\tif(!m_cache_path.empty())\n\t\t\tk3d::filesystem::remove(m_cache_path);\n\t}\n\n\tvoid setup_renderman_texture(k3d::inetwork_render_frame& Frame, k3d::ri::istream& Stream, k3d::ri::ishader_collection& Shaders)\n\t{\n\t\treturn_if_fail(!m_cache_path.empty());\n\n\t\tm_ri_image_path = k3d::filesystem::path();\n\t\tm_ri_texture_path = k3d::filesystem::path();\n\n\t\tconst k3d::bitmap* const texture = m_output_bitmap.pipeline_value();\n\t\tif(!texture)\n\t\t\treturn;\n\n\t\tm_ri_image_path = Frame.add_file(\"texture\");\n\t\treturn_if_fail(!m_ri_image_path.empty());\n\n\t\tm_ri_texture_path = Frame.add_file(\"texture\");\n\t\treturn_if_fail(!m_ri_texture_path.empty());\n\n\t\tif(m_refresh_cache || !k3d::filesystem::exists(m_cache_path))\n\t\t{\n\t\t\tm_refresh_cache = false;\n\n\t\t\tboost::scoped_ptr<k3d::ibitmap_exporter> exporter(k3d::plugin::create<k3d::ibitmap_exporter>(k3d::classes::TIFFBitmapExporter()));\n\t\t\treturn_if_fail(exporter);\n\t\t\treturn_if_fail(exporter->write_file(m_cache_path, *texture));\n\t\t}\n\n\t\tk3d::filesystem::copy_file(m_cache_path, m_ri_image_path);\n\t\tStream.RiMakeTextureV(m_ri_image_path.native_filesystem_string(), m_ri_texture_path.native_filesystem_string(), m_swrap.pipeline_value(), m_twrap.pipeline_value(), m_filter.pipeline_value(), m_swidth.pipeline_value(), m_twidth.pipeline_value());\n\t}\n\n\tconst k3d::filesystem::path renderman_texture_path(const k3d::ri::render_state& State)\n\t{\n\t\treturn m_ri_texture_path;\n\t}\n\n\tvoid on_resize_bitmap(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tOutput.recreate(Input.width(), Input.height());\n\t}\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tOutput = Input;\n\t\tm_refresh_cache = true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<texture_map,\n\t\t\tk3d::interface_list<k3d::ibitmap_source,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink,\n\t\t\tk3d::interface_list<k3d::ri::itexture> > > > factory(\n\t\t\t\tk3d::uuid(0x956071b5, 0xb1d0418b, 0x89c5037d, 0xf7618d54),\n\t\t\t\t\"RenderManTextureMap\",\n\t\t\t\t_(\"Converts a bitmap into a RenderMan Texture Map\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t/// Stores the absolute path to a cached TIFF version of our input\n\tk3d::filesystem::path m_cache_path;\n\t/// Set to true iff the cache needs to be refreshed\n\tbool m_refresh_cache;\n\t/// Stores the absolute path to the saved TIFF version of this texture_map (for use during RenderMan rendering)\n\tk3d::filesystem::path m_ri_image_path;\n\t/// Stores the absolute path to the version of this texture_map converted by the renderer (via RiMakeTexture())\n\tk3d::filesystem::path m_ri_texture_path;\n\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_swrap;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_twrap;\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_filter;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_swidth;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_twidth;\n\n\tconst k3d::ilist_property<std::string>::values_t& wrap_values()\n\t{\n\t\tstatic k3d::ilist_property<std::string>::values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ri::RI_BLACK());\n\t\t\tvalues.push_back(k3d::ri::RI_CLAMP());\n\t\t\tvalues.push_back(k3d::ri::RI_PERIODIC());\n\t\t}\n\t\treturn values;\n\t}\n\n\tconst k3d::ilist_property<std::string>::values_t& filter_values()\n\t{\n\t\tstatic k3d::ilist_property<std::string>::values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ri::RI_GAUSSIAN());\n\t\t\tvalues.push_back(k3d::ri::RI_BOX());\n\t\t\tvalues.push_back(k3d::ri::RI_TRIANGLE());\n\t\t\tvalues.push_back(k3d::ri::RI_CATMULL_ROM());\n\t\t\tvalues.push_back(k3d::ri::RI_SINC());\n\t\t}\n\n\t\treturn values;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// texture_map_factory\n\nk3d::iplugin_factory& texture_map_factory()\n{\n\treturn texture_map::get_factory();\n}\n\n} // namespace libk3drenderman\n\n"
  },
  {
    "path": "modules/renderman_engines/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-renderman-engines)\nK3D_CREATE_MODULE_PROXY(k3d-renderman-engines)\n\n"
  },
  {
    "path": "modules/renderman_engines/air.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nclass air :\n\tpublic k3d::node,\n\tpublic k3d::ri::irender_engine\n{\n\ttypedef k3d::node base;\n\npublic:\n\tair(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tk3d::bool_t installed()\n\t{\n\t\treturn true;\n\t}\n\n\tk3d::bool_t compile_shader(const k3d::filesystem::path& Shader)\n\t{\n\t\t// Compute some paths that will be used by the compiler ...\n\t\tconst k3d::filesystem::path shader_source_path = Shader;\n\t\tconst k3d::filesystem::path shader_binary_path = k3d::shader_cache_path() / k3d::filesystem::generic_path(k3d::filesystem::replace_extension(Shader, \".slb\").leaf());\n\t\tconst k3d::filesystem::path shader_source_directory = Shader.branch_path();\n\t\tconst k3d::filesystem::path global_source_directory = k3d::share_path() / k3d::filesystem::generic_path(\"shaders\");\n\n\t\tif(k3d::filesystem::up_to_date(shader_source_path, shader_binary_path))\n\t\t\treturn true;\n\n\t\tstd::ostringstream command_line;\n\t\tcommand_line << \"shaded\";\n\t\tcommand_line << \" -I\\\"\" << shader_source_directory.native_filesystem_string()  << \"\\\"\";\n\t\tcommand_line << \" -I\\\"\" << global_source_directory.native_filesystem_string()  << \"\\\"\";\n\t\tcommand_line << \" -o \\\"\" << shader_binary_path.native_filesystem_string() << \"\\\"\";\n\t\tcommand_line << \" \\\"\" << shader_source_path.native_filesystem_string() << \"\\\"\";\n\n\t\t// Make it happen ...\n\t\treturn_val_if_fail(k3d::system::spawn_sync(command_line.str()), false);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render(k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& RIB)\n\t{\n\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(RIB.native_filesystem_string()));\n\n\t\tFrame.add_exec_command(\"air\", environment, arguments);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<air,\n\t\t\tk3d::interface_list<k3d::ri::irender_engine> > factory(\n\t\t\t\tk3d::uuid(0x1e0db446, 0x2e4126b0, 0xee0b0f99, 0x3dc847c0),\n\t\t\t\t\"AirRenderManEngine\",\n\t\t\t\t_(\"Provides render integration with AIR, http://www.sitexgraphics.com/html/air.html\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// air_factory\n\nk3d::iplugin_factory& air_factory()\n{\n\treturn air::get_factory();\n}\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_engines/aqsis.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nclass aqsis :\n\tpublic k3d::node,\n\tpublic k3d::ri::irender_engine\n{\n\ttypedef k3d::node base;\n\npublic:\n\taqsis(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tk3d::bool_t installed()\n\t{\n\t\tif(k3d::system::find_executable(\"aqsis\").empty())\n\t\t\treturn false;\n\n\t\tif(k3d::system::find_executable(\"aqsl\").empty())\n\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t compile_shader(const k3d::filesystem::path& Shader)\n\t{\n\t\t// Compute some paths that will be used by the compiler ...\n\t\tconst k3d::filesystem::path shader_source_path = Shader;\n\t\tconst k3d::filesystem::path shader_binary_path = k3d::shader_cache_path() / k3d::filesystem::generic_path(k3d::filesystem::replace_extension(Shader, \".slx\").leaf());\n\t\tconst k3d::filesystem::path shader_source_directory = Shader.branch_path();\n\t\tconst k3d::filesystem::path global_source_directory = k3d::share_path() / k3d::filesystem::generic_path(\"shaders\");\n\n\t\tif(k3d::filesystem::up_to_date(shader_source_path, shader_binary_path))\n\t\t\treturn true;\n\n\t\tstd::ostringstream command_line;\n\t\tcommand_line << \"aqsl\";\n\t\tcommand_line << \" -I \\\"\" << shader_source_directory.native_filesystem_string()  << \"\\\"\";\n\t\tcommand_line << \" -I \\\"\" << global_source_directory.native_filesystem_string()  << \"\\\"\";\n\t\tcommand_line << \" -o \\\"\" << shader_binary_path.native_filesystem_string() << \"\\\"\";\n\t\tcommand_line << \" \" << shader_source_path.native_filesystem_string();\n\n\t\t// Make it happen ...\n\t\treturn_val_if_fail(k3d::system::spawn_sync(command_line.str()), false);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render(k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& RIB)\n\t{\n\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"-shaders=\" + k3d::shader_cache_path().native_filesystem_string()));\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(RIB.native_filesystem_string()));\n\t\t\n\t\tFrame.add_exec_command(\"aqsis\", environment, arguments);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<aqsis,\n\t\t\tk3d::interface_list<k3d::ri::irender_engine> > factory(\n\t\t\t\tk3d::uuid(0x8d430069, 0x63404829, 0x053361ad, 0xfc6abda6),\n\t\t\t\t\"AqsisRenderManEngine\",\n\t\t\t\t_(\"Provides render integration with Aqsis, http://www.aqsis.org\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// aqsis_factory\n\nk3d::iplugin_factory& aqsis_factory()\n{\n\treturn aqsis::get_factory();\n}\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_engines/bmrt.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nclass bmrt :\n\tpublic k3d::node,\n\tpublic k3d::ri::irender_engine\n{\n\ttypedef k3d::node base;\n\npublic:\n\tbmrt(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tk3d::bool_t installed()\n\t{\n\t\treturn true;\n\t}\n\n\tk3d::bool_t compile_shader(const k3d::filesystem::path& Shader)\n\t{\n\t\t// Compute some paths that will be used by the compiler ...\n\t\tconst k3d::filesystem::path shader_source_path = Shader;\n\t\tconst k3d::filesystem::path shader_binary_path = k3d::shader_cache_path() / k3d::filesystem::generic_path(k3d::filesystem::replace_extension(Shader, \".slc\").leaf());\n\t\tconst k3d::filesystem::path shader_source_directory = Shader.branch_path();\n\t\tconst k3d::filesystem::path global_source_directory = k3d::share_path() / k3d::filesystem::generic_path(\"shaders\");\n\n\t\tif(k3d::filesystem::up_to_date(shader_source_path, shader_binary_path))\n\t\t\treturn true;\n\n\t\tstd::ostringstream command_line;\n\t\tcommand_line << \"slc\";\n\t\tcommand_line << \" \" << shader_source_path.native_filesystem_string();\n\t\tcommand_line << \" -o \\\"\" << shader_binary_path.native_filesystem_string() << \"\\\"\";\n\n\t\t// Make it happen ...\n\t\treturn_val_if_fail(k3d::system::spawn_sync(command_line.str()), false);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render(k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& RIB)\n\t{\n\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(RIB.native_filesystem_string()));\n\n\t\tFrame.add_exec_command(\"rendrib\", environment, arguments);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bmrt,\n\t\t\tk3d::interface_list<k3d::ri::irender_engine> > factory(\n\t\t\t\tk3d::uuid(0x7f78712e, 0x2246feec, 0xf1738388, 0xe6e7ba17),\n\t\t\t\t\"BMRTRenderManEngine\",\n\t\t\t\t_(\"Provides render integration with BMRT, may it rest in peace.\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bmrt_factory\n\nk3d::iplugin_factory& bmrt_factory()\n{\n\treturn bmrt::get_factory();\n}\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_engines/delight.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nclass delight :\n\tpublic k3d::node,\n\tpublic k3d::ri::irender_engine\n{\n\ttypedef k3d::node base;\n\npublic:\n\tdelight(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tk3d::bool_t installed()\n\t{\n\t\treturn true;\n\t}\n\n\tk3d::bool_t compile_shader(const k3d::filesystem::path& Shader)\n\t{\n\t\t// Compute some paths that will be used by the compiler ...\n\t\tconst k3d::filesystem::path shader_source_path = Shader;\n\t\tconst k3d::filesystem::path shader_binary_path = k3d::shader_cache_path() / k3d::filesystem::generic_path(k3d::filesystem::replace_extension(Shader, \".sdl\").leaf());\n\t\tconst k3d::filesystem::path shader_source_directory = Shader.branch_path();\n\t\tconst k3d::filesystem::path global_source_directory = k3d::share_path() / k3d::filesystem::generic_path(\"shaders\");\n\t\tconst k3d::filesystem::path shader_binary_directory = k3d::shader_cache_path();\n\n\t\tif(k3d::filesystem::up_to_date(shader_source_path, shader_binary_path))\n\t\t\treturn true;\n\n\t\tstd::ostringstream command_line;\n\t\tcommand_line << \"shaderdl\";\n\t\tcommand_line << \"--dont-keep-cpp-file\";\n\t\tcommand_line << \"--dont-keep-c++-file\";\n\t\tcommand_line << \"-d \\\"\" << shader_binary_directory.native_filesystem_string() << \"\\\"\";\n//\t\tcommand_line << \" -I\\\"\" << shader_source_directory.native_filesystem_string()  << \"\\\"\";\n//\t\tcommand_line << \" -I\\\"\" << global_source_directory.native_filesystem_string()  << \"\\\"\";\n//\t\tcommand_line << \" -o \\\"\" << shader_binary_path.native_filesystem_string() << \"\\\"\";\n\t\tcommand_line << \" \" << shader_source_path.native_filesystem_string();\n\n\t\t// Make it happen ...\n\t\treturn_val_if_fail(k3d::system::spawn_sync(command_line.str()), false);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render(k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& RIB)\n\t{\n\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(RIB.native_filesystem_string()));\n\n\t\tFrame.add_exec_command(\"renderdl\", environment, arguments);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<delight,\n\t\t\tk3d::interface_list<k3d::ri::irender_engine> > factory(\n\t\t\t\tk3d::uuid(0xd25a989d, 0x4749e87d, 0x9775219c, 0x67533efc),\n\t\t\t\t\"3DelightRenderManEngine\",\n\t\t\t\t_(\"Provides render integration with 3Delight, http://www.3delight.com/\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// delight_factory\n\nk3d::iplugin_factory& delight_factory()\n{\n\treturn delight::get_factory();\n}\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_engines/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nextern k3d::iplugin_factory& air_factory();\nextern k3d::iplugin_factory& aqsis_factory();\nextern k3d::iplugin_factory& bmrt_factory();\nextern k3d::iplugin_factory& delight_factory();\nextern k3d::iplugin_factory& netprman_factory();\nextern k3d::iplugin_factory& pixie_factory();\nextern k3d::iplugin_factory& povman_factory();\nextern k3d::iplugin_factory& prman_factory();\nextern k3d::iplugin_factory& rdc_factory();\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace modules\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::renderman::engine::air_factory());\n\tRegistry.register_factory(module::renderman::engine::aqsis_factory());\n\tRegistry.register_factory(module::renderman::engine::bmrt_factory());\n\tRegistry.register_factory(module::renderman::engine::delight_factory());\n\tRegistry.register_factory(module::renderman::engine::netprman_factory());\n\tRegistry.register_factory(module::renderman::engine::pixie_factory());\n\tRegistry.register_factory(module::renderman::engine::povman_factory());\n\tRegistry.register_factory(module::renderman::engine::prman_factory());\n\tRegistry.register_factory(module::renderman::engine::rdc_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/renderman_engines/netprman.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nclass netprman :\n\tpublic k3d::node,\n\tpublic k3d::ri::irender_engine\n{\n\ttypedef k3d::node base;\n\npublic:\n\tnetprman(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tk3d::bool_t installed()\n\t{\n\t\treturn true;\n\t}\n\n\tk3d::bool_t compile_shader(const k3d::filesystem::path& Shader)\n\t{\n\t\t// Compute some paths that will be used by the compiler ...\n\t\tconst k3d::filesystem::path shader_source_path = Shader;\n\t\tconst k3d::filesystem::path shader_binary_path = k3d::shader_cache_path() / k3d::filesystem::generic_path(k3d::filesystem::replace_extension(Shader, \".slo\").leaf());\n\t\tconst k3d::filesystem::path shader_source_directory = Shader.branch_path();\n\t\tconst k3d::filesystem::path global_source_directory = k3d::share_path() / k3d::filesystem::generic_path(\"shaders\");\n\n\t\tif(k3d::filesystem::up_to_date(shader_source_path, shader_binary_path))\n\t\t\treturn true;\n\n\t\tstd::ostringstream command_line;\n\t\tcommand_line << \"slcomp\";\n//\t\tcommand_line << \" -I\\\"\" << shader_source_directory.native_filesystem_string()  << \"\\\"\";\n//\t\tcommand_line << \" -I\\\"\" << global_source_directory.native_filesystem_string()  << \"\\\"\";\n//\t\tcommand_line << \" -o \\\"\" << shader_binary_path.native_filesystem_string() << \"\\\"\";\n\t\tcommand_line << \" \\\"\" << shader_source_path.native_filesystem_string() << \"\\\"\";\n\n\t\t// Make it happen ...\n\t\treturn_val_if_fail(k3d::system::spawn_sync(command_line.str()), false);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render(k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& RIB)\n\t{\n\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"-progress\"));\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"-f\"));\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(RIB.native_filesystem_string()));\n\n\t\tFrame.add_exec_command(\"netrender\", environment, arguments);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<netprman,\n\t\t\tk3d::interface_list<k3d::ri::irender_engine> > factory(\n\t\t\t\tk3d::uuid(0x09fcd5f8, 0xa6492c25, 0x6584afac, 0x1e9f8670),\n\t\t\t\t\"NetPRManRenderManEngine\",\n\t\t\t\t_(\"Provides render integration with networked PRMan, https://renderman.pixar.com\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// netprman_factory\n\nk3d::iplugin_factory& netprman_factory()\n{\n\treturn netprman::get_factory();\n}\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_engines/pixie.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nclass pixie :\n\tpublic k3d::node,\n\tpublic k3d::ri::irender_engine\n{\n\ttypedef k3d::node base;\n\npublic:\n\tpixie(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tk3d::bool_t installed()\n\t{\n\t\tif(k3d::system::find_executable(\"rndr\").empty())\n\t\t\treturn false;\n\n\t\tif(k3d::system::find_executable(\"sdrc\").empty())\n\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t compile_shader(const k3d::filesystem::path& Shader)\n\t{\n\t\t// Compute some paths that will be used by the compiler ...\n\t\tconst k3d::filesystem::path shader_source_path = Shader;\n\t\tconst k3d::filesystem::path shader_binary_path = k3d::shader_cache_path() / k3d::filesystem::generic_path(k3d::filesystem::replace_extension(Shader, \".sdr\").leaf());\n\t\tconst k3d::filesystem::path shader_source_directory = Shader.branch_path();\n\t\tconst k3d::filesystem::path global_source_directory = k3d::share_path() / k3d::filesystem::generic_path(\"shaders\");\n\n\t\tif(k3d::filesystem::up_to_date(shader_source_path, shader_binary_path))\n\t\t\treturn true;\n\n\t\tstd::ostringstream command_line;\n\t\tcommand_line << \"sdrc\";\n\t\tcommand_line << \" \\\"-I\" << shader_source_directory.native_filesystem_string()  << \"\\\"\";\n\t\tcommand_line << \" \\\"-I\" << global_source_directory.native_filesystem_string()  << \"\\\"\";\n\t\tcommand_line << \" -o \\\"\" << shader_binary_path.native_filesystem_string() << \"\\\"\";\n\t\tcommand_line << \" \" << shader_source_path.native_filesystem_string();\n\n\t\t// Make it happen ...\n\t\treturn_val_if_fail(k3d::system::spawn_sync(command_line.str()), false);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render(k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& RIB)\n\t{\n\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(RIB.native_filesystem_string()));\n\n\t\tFrame.add_exec_command(\"rndr\", environment, arguments);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<pixie,\n\t\t\tk3d::interface_list<k3d::ri::irender_engine> > factory(\n\t\t\t\tk3d::uuid(0x7a1d773b, 0xa9472dae, 0xa80223ab, 0x59d62f9a),\n\t\t\t\t\"PixieRenderManEngine\",\n\t\t\t\t_(\"Provides render integration with Pixie, http://www.renderpixie.com\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// pixie_factory\n\nk3d::iplugin_factory& pixie_factory()\n{\n\treturn pixie::get_factory();\n}\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_engines/povman.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nclass povman :\n\tpublic k3d::node,\n\tpublic k3d::ri::irender_engine\n{\n\ttypedef k3d::node base;\n\npublic:\n\tpovman(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tk3d::bool_t installed()\n\t{\n\t\treturn true;\n\t}\n\n\tk3d::bool_t compile_shader(const k3d::filesystem::path& Shader)\n\t{\n\t\t// Compute some paths that will be used by the compiler ...\n\t\tconst k3d::filesystem::path shader_source_path = Shader;\n\t\tconst k3d::filesystem::path shader_binary_path = k3d::shader_cache_path() / k3d::filesystem::generic_path(k3d::filesystem::replace_extension(Shader, \".slx\").leaf());\n\t\tconst k3d::filesystem::path shader_source_directory = Shader.branch_path();\n\t\tconst k3d::filesystem::path global_source_directory = k3d::share_path() / k3d::filesystem::generic_path(\"shaders\");\n\n\t\tif(k3d::filesystem::up_to_date(shader_source_path, shader_binary_path))\n\t\t\treturn true;\n\n\t\tstd::ostringstream command_line;\n\t\tcommand_line << \"povslc\";\n//\t\tcommand_line << \" -I\\\"\" << shader_source_directory.native_filesystem_string()  << \"\\\"\";\n//\t\tcommand_line << \" -I\\\"\" << global_source_directory.native_filesystem_string()  << \"\\\"\";\n\t\tcommand_line << \" -o \\\"\" << shader_binary_path.native_filesystem_string() << \"\\\"\";\n\t\tcommand_line << \" \\\"\" << shader_source_path.native_filesystem_string() << \"\\\"\";\n\n\t\t// Make it happen ...\n\t\treturn_val_if_fail(k3d::system::spawn_sync(command_line.str()), false);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render(k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& RIB)\n\t{\n\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(RIB.native_filesystem_string()));\n\n\t\tFrame.add_exec_command(\"povman\", environment, arguments);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<povman,\n\t\t\tk3d::interface_list<k3d::ri::irender_engine> > factory(\n\t\t\t\tk3d::uuid(0xaaaea308, 0x0240fc43, 0x404f3780, 0x63c89573),\n\t\t\t\t\"POVManRenderManEngine\",\n\t\t\t\t_(\"Provides render integration with POVMan\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// povman_factory\n\nk3d::iplugin_factory& povman_factory()\n{\n\treturn povman::get_factory();\n}\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_engines/prman.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nclass prman :\n\tpublic k3d::node,\n\tpublic k3d::ri::irender_engine\n{\n\ttypedef k3d::node base;\n\npublic:\n\tprman(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tk3d::bool_t installed()\n\t{\n\t\treturn true;\n\t}\n\n\tk3d::bool_t compile_shader(const k3d::filesystem::path& Shader)\n\t{\n\t\t// Compute some paths that will be used by the compiler ...\n\t\tconst k3d::filesystem::path shader_source_path = Shader;\n\t\tconst k3d::filesystem::path shader_binary_path = k3d::shader_cache_path() / k3d::filesystem::generic_path(k3d::filesystem::replace_extension(Shader, \".slo\").leaf());\n\t\tconst k3d::filesystem::path shader_source_directory = Shader.branch_path();\n\t\tconst k3d::filesystem::path global_source_directory = k3d::share_path() / k3d::filesystem::generic_path(\"shaders\");\n\n\t\tif(k3d::filesystem::up_to_date(shader_source_path, shader_binary_path))\n\t\t\treturn true;\n\n\t\tstd::ostringstream command_line;\n\t\tcommand_line << \"slcomp\";\n//\t\tcommand_line << \" -I\\\"\" << shader_source_directory.native_filesystem_string()  << \"\\\"\";\n//\t\tcommand_line << \" -I\\\"\" << global_source_directory.native_filesystem_string()  << \"\\\"\";\n//\t\tcommand_line << \" -o \\\"\" << shader_binary_path.native_filesystem_string() << \"\\\"\";\n\t\tcommand_line << \" \\\"\" << shader_source_path.native_filesystem_string() << \"\\\"\";\n\n\t\t// Make it happen ...\n\t\treturn_val_if_fail(k3d::system::spawn_sync(command_line.str()), false);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render(k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& RIB)\n\t{\n\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(\"-progress\"));\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(RIB.native_filesystem_string()));\n\n\t\tFrame.add_exec_command(\"prman\", environment, arguments);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<prman,\n\t\t\tk3d::interface_list<k3d::ri::irender_engine> > factory(\n\t\t\t\tk3d::uuid(0x69186ecd, 0x92440853, 0x24ed05a9, 0xa5a168d3),\n\t\t\t\t\"PRManRenderManEngine\",\n\t\t\t\t_(\"Provides render integration with PRMan, http://renderman.pixar.com\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// prman_factory\n\nk3d::iplugin_factory& prman_factory()\n{\n\treturn prman::get_factory();\n}\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_engines/rdc.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/irender_engine_ri.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/shader_cache.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\n#include <sstream>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace engine\n{\n\nclass rdc :\n\tpublic k3d::node,\n\tpublic k3d::ri::irender_engine\n{\n\ttypedef k3d::node base;\n\npublic:\n\trdc(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tk3d::bool_t installed()\n\t{\n\t\treturn true;\n\t}\n\n\tk3d::bool_t compile_shader(const k3d::filesystem::path& Shader)\n\t{\n\t\t// Compute some paths that will be used by the compiler ...\n\t\tconst k3d::filesystem::path shader_source_path = Shader;\n\t\tconst k3d::filesystem::path shader_binary_path = k3d::shader_cache_path() / k3d::filesystem::generic_path(k3d::filesystem::replace_extension(Shader, \".so\").leaf());\n\t\tconst k3d::filesystem::path shader_source_directory = Shader.branch_path();\n\t\tconst k3d::filesystem::path global_source_directory = k3d::share_path() / k3d::filesystem::generic_path(\"shaders\");\n\n\t\tif(k3d::filesystem::up_to_date(shader_source_path, shader_binary_path))\n\t\t\treturn true;\n\n\t\tstd::ostringstream command_line;\n\t\tcommand_line << \"shaderdc\";\n//\t\tcommand_line << \" -I\\\"\" << shader_source_directory.native_filesystem_string()  << \"\\\"\";\n//\t\tcommand_line << \" -I\\\"\" << global_source_directory.native_filesystem_string()  << \"\\\"\";\n//\t\tcommand_line << \" -o \\\"\" << shader_binary_path.native_filesystem_string() << \"\\\"\";\n\t\tcommand_line << \" \\\"\" << shader_source_path.native_filesystem_string() << \"\\\"\";\n\n\t\t// Make it happen ...\n\t\treturn_val_if_fail(k3d::system::spawn_sync(command_line.str()), false);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render(k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& RIB)\n\t{\n\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\targuments.push_back(k3d::inetwork_render_frame::argument(RIB.native_filesystem_string()));\n\n\t\tFrame.add_exec_command(\"renderdc\", environment, arguments);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<rdc,\n\t\t\tk3d::interface_list<k3d::ri::irender_engine> > factory(\n\t\t\t\tk3d::uuid(0xdc0746e9, 0xa44b687a, 0x7c4d67bd, 0xcc1d806d),\n\t\t\t\t\"RenderDotCRenderManEngine\",\n\t\t\t\t_(\"Provides render integration with RenderDotC, http://www.dotcsw.com/rdc.html\"),\n\t\t\t\t\"RenderMan\",\n\t\t\t\tk3d::iplugin_factory::STABLE\n\t\t\t\t);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// rdc_factory\n\nk3d::iplugin_factory& rdc_factory()\n{\n\treturn rdc::get_factory();\n}\n\n} // namespace engine\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-renderman-painters)\nK3D_CREATE_MODULE_PROXY(k3d-renderman-painters)\n\n"
  },
  {
    "path": "modules/renderman_painters/array_helpers.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3dsdk/utility.h>\n#include <k3dsdk/texture3.h>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// array_copier::implementation\n\nclass array_copier::implementation\n{\npublic:\n\timplementation()\n\t{\n\t}\n\n\t~implementation()\n\t{\n//\t\tstd::for_each(copiers.begin(), copiers.end(), k3d::delete_object());\n//\t\tstd::for_each(destinations.begin(), destinations.end(), k3d::delete_object());\n\t}\n\n\tvoid add_arrays(const k3d::mesh::table_t& Sources)\n\t{\n\t\tfor(k3d::mesh::table_t::const_iterator array_iterator = Sources.begin(); array_iterator != Sources.end(); ++array_iterator)\n\t\t{\n\t\t\tconst std::string name = array_iterator->first;\n\t\t\tconst k3d::array* const source = array_iterator->second.get();\n\n\t\t\tadd_array(name, *source);\n\t\t}\n\t}\n\n\tvoid add_array(const std::string& Name, const k3d::array& Source)\n\t{\n\t\tif(create_copier<k3d::typed_array<double> >(Name, Source))\n\t\t\treturn;\n\t\tif(create_copier<k3d::typed_array<std::string> >(Name, Source))\n\t\t\treturn;\n\t\tif(create_copier<k3d::typed_array<k3d::point3> >(Name, Source))\n\t\t\treturn;\n\t\tif(create_copier<k3d::typed_array<k3d::vector3> >(Name, Source))\n\t\t\treturn;\n\t\tif(create_copier<k3d::typed_array<k3d::normal3> >(Name, Source))\n\t\t\treturn;\n\t\tif(create_copier<k3d::typed_array<k3d::texture3> >(Name, Source))\n\t\t\treturn;\n\t\tif(create_copier<k3d::typed_array<k3d::color> >(Name, Source))\n\t\t\treturn;\n\t\tif(create_copier<k3d::typed_array<k3d::point4> >(Name, Source))\n\t\t\treturn;\n\t\tif(create_copier<k3d::typed_array<k3d::matrix4> >(Name, Source))\n\t\t\treturn;\n\n\t\tk3d::log() << error << k3d_file_reference << \" array [\" << Name << \"] unknown type [\" << typeid(Source).name() << \"]\" << std::endl;\n\t}\n\n\tvoid insert(const size_t Begin, const size_t End)\n\t{\n\t\tfor(size_t i = 0; i != copiers.size(); ++i)\n\t\t\tcopiers[i]->insert(Begin, End);\n\t}\n\n\tvoid copy_to(const k3d::ri::storage_class_t StorageClass, k3d::ri::parameter_list& Destination)\n\t{\n\t\tfor(size_t i = 0; i != names.size(); ++i)\n\t\t\tDestination.push_back(k3d::ri::parameter(names[i], StorageClass, 1, destinations[i]));\n\t}\n\nprivate:\n\tclass copier_interface\n\t{\n\tpublic:\n\t\tvirtual ~copier_interface() {}\n\t\tvirtual void insert(const size_t Begin, const size_t End) = 0;\n\t};\n\n\ttemplate<typename array_type>\n\tclass copier :\n\t\tpublic copier_interface\n\t{\n\tpublic:\n\t\tcopier(const array_type& Source, array_type& Destination) :\n\t\t\tsource(Source),\n\t\t\tdestination(Destination)\n\t\t{\n\t\t}\n\n\t\tvoid insert(const size_t Begin, const size_t End)\n\t\t{\n\t\t\tdestination.insert(destination.end(), source.begin() + Begin, source.begin() + End);\n\t\t}\n\n\tprivate:\n\t\tconst array_type& source;\n\t\tarray_type& destination;\n\t};\n\n\ttemplate<typename array_type>\n\tbool create_copier(const std::string& Name, const k3d::array& Source)\n\t{\n\t\tif(const array_type* const source = dynamic_cast<const array_type*>(&Source))\n\t\t{\n\t\t\tarray_type* const destination = new array_type();\n\n\t\t\tnames.push_back(Name);\n\t\t\tdestinations.push_back(destination);\n\t\t\tcopiers.push_back(new copier<array_type>(*source, *destination));\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tstd::vector<std::string> names;\n\tstd::vector<k3d::array*> destinations;\n\tstd::vector<copier_interface*> copiers;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// array_copier\n\narray_copier::array_copier() :\n\tm_implementation(new implementation())\n{\n}\n\narray_copier::~array_copier()\n{\n\tdelete m_implementation;\n}\n\nvoid array_copier::add_arrays(const k3d::mesh::table_t& Sources)\n{\n\tm_implementation->add_arrays(Sources);\n}\n\nvoid array_copier::add_array(const std::string& Name, const k3d::array& Source)\n{\n\tm_implementation->add_array(Name, Source);\n}\n\nvoid array_copier::insert(const size_t Begin, const size_t End)\n{\n\tm_implementation->insert(Begin, End);\n}\n\nvoid array_copier::push_back(const size_t Index)\n{\n\tm_implementation->insert(Index, Index + 1);\n}\n\nvoid array_copier::copy_to(const k3d::ri::storage_class_t StorageClass, k3d::ri::parameter_list& Destination)\n{\n\tm_implementation->copy_to(StorageClass, Destination);\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/array_helpers.h",
    "content": "#ifndef MODULES_RENDERMAN_PAINTERS_ARRAY_HELPERS_H\n#define MODULES_RENDERMAN_PAINTERS_ARRAY_HELPERS_H\n\n// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/types_ri.h>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/// Makes an internal copy of a set of named mesh arrays\nclass array_copier\n{\npublic:\n\tarray_copier();\n\t~array_copier();\n\n\t/// Adds a collection of named mesh arrays to be copied\n\tvoid add_arrays(const k3d::mesh::table_t& Sources);\n\t/// Adds a single named mesh array to be copied\n\tvoid add_array(const std::string& Name, const k3d::array& Source);\n\n\t/// Copies a half-open range of values from the source arrays into the internal copy\n\tvoid insert(const size_t Begin, const size_t End);\n\t/// Copies an individual set of values from the source arrays into the internal copy\n\tvoid push_back(const size_t Index);\n\n\t/// Assigns the internal copy to the given RenderMan parameter list\n\tvoid copy_to(const k3d::ri::storage_class_t StorageClass, k3d::ri::parameter_list& Destination);\n\nprivate:\n\tclass implementation;\n\timplementation* const m_implementation;\n};\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n#endif // !MODULES_RENDERMAN_PAINTERS_ARRAY_HELPERS_H\n\n"
  },
  {
    "path": "modules/renderman_painters/bicubic_patch_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bicubic_patch_painter\n\nclass bicubic_patch_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tbicubic_patch_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::bicubic_patch::const_primitive> bicubic_patch(k3d::bicubic_patch::validate(Mesh, **primitive));\n\t\t\tif(!bicubic_patch)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh::materials_t& patch_materials = bicubic_patch->patch_materials;\n\t\t\tconst k3d::mesh::indices_t& patch_points = bicubic_patch->patch_points;\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\tconst k3d::uint_t patch_end = patch_begin + (patch_points.size() / 16);\n\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t{\n\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\tri_constant_attributes.add_arrays(bicubic_patch->constant_attributes);\n\n\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\tri_uniform_attributes.add_arrays(bicubic_patch->patch_attributes);\n\n\t\t\t\tarray_copier ri_varying_attributes;\n\t\t\t\tri_varying_attributes.add_arrays(bicubic_patch->parameter_attributes);\n\n\t\t\t\tarray_copier ri_vertex_attributes;\n\t\t\t\tri_vertex_attributes.add_arrays(bicubic_patch->vertex_attributes);\n\t\t\t\tri_vertex_attributes.add_array(k3d::ri::RI_P(), points);\n\n\t\t\t\tconst k3d::uint_t point_begin = patch * 16;\n\t\t\t\tconst k3d::uint_t point_end = point_begin + 16;\n\t\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\t\tri_vertex_attributes.push_back(patch_points[point]);\n\n\t\t\t\tri_constant_attributes.push_back(patch);\n\t\t\t\tri_uniform_attributes.push_back(patch);\n\t\t\t\tri_varying_attributes.insert(4 * patch, 4 * (patch + 1));\n\n\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\t\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\t\tri_vertex_attributes.copy_to(k3d::ri::VERTEX, ri_parameters);\n\n\t\t\t\tk3d::ri::setup_material(patch_materials[patch], RenderState);\n\n\t\t\t\t// At the moment, we force all bicubic patches to be Bezier ...\n\t\t\t\tRenderState.stream.RiBasis(\"bezier\", 3, \"bezier\", 3);\n\t\t\t\tRenderState.stream.RiPatchV(\"bicubic\", ri_parameters);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bicubic_patch_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x64dfefde, 0xeedc4047, 0xb59fc8f6, 0x972a9b86),\n\t\t\t\"RenderManBicubicPatchPainter\",\n\t\t\t_(\"Renders bicubic patches\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bicubic_patch_painter_factory\n\nk3d::iplugin_factory& bicubic_patch_painter_factory()\n{\n\treturn bicubic_patch_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/bilinear_patch_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bilinear_patch_painter\n\nclass bilinear_patch_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tbilinear_patch_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::bilinear_patch::const_primitive> bilinear_patches(k3d::bilinear_patch::validate(Mesh, **primitive));\n\t\t\tif(!bilinear_patches)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\tconst k3d::uint_t patch_end = patch_begin + (bilinear_patches->patch_points.size() / 4);\n\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t{\n\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\tri_constant_attributes.add_arrays(bilinear_patches->constant_attributes);\n\n\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\tri_uniform_attributes.add_arrays(bilinear_patches->patch_attributes);\n\n\t\t\t\tarray_copier ri_varying_attributes;\n\t\t\t\tri_varying_attributes.add_arrays(bilinear_patches->parameter_attributes);\n\n\t\t\t\tarray_copier ri_point_attributes;\n\t\t\t\tri_point_attributes.add_array(k3d::ri::RI_P(), *Mesh.points);\n\n\t\t\t\tarray_copier ri_vertex_attributes;\n\t\t\t\tri_vertex_attributes.add_arrays(bilinear_patches->vertex_attributes);\n\n\t\t\t\tri_constant_attributes.push_back(0);\n\t\t\t\tri_uniform_attributes.push_back(patch);\n\n\t\t\t\tconst k3d::uint_t patch_points_begin = 4 * patch;\n\t\t\t\tconst k3d::uint_t patch_points_end = patch_points_begin + 4;\n\t\t\t\tfor(k3d::uint_t patch_point = patch_points_begin; patch_point != patch_points_end; ++patch_point)\n\t\t\t\t\tri_point_attributes.push_back(bilinear_patches->patch_points[patch_point]);\n\t\t\t\tri_vertex_attributes.insert(patch_points_begin, patch_points_end);\n\t\t\t\tri_varying_attributes.insert(patch_points_begin, patch_points_end);\n\n\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\t\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\t\tri_point_attributes.copy_to(k3d::ri::VERTEX, ri_parameters);\n\t\t\t\tri_vertex_attributes.copy_to(k3d::ri::VERTEX, ri_parameters);\n\n\t\t\t\tk3d::ri::setup_material(bilinear_patches->patch_materials[patch], RenderState);\n\t\t\t\tRenderState.stream.RiPatchV(\"bilinear\", ri_parameters);\n\t\t\t}\n\t\t}\t\t\t\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bilinear_patch_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x3f51b275, 0x5a664903, 0x96ed9168, 0x503e30f0),\n\t\t\t\"RenderManBilinearPatchPainter\",\n\t\t\t_(\"Renders bilinear patches\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bilinear_patch_painter_factory\n\nk3d::iplugin_factory& bilinear_patch_painter_factory()\n{\n\treturn bilinear_patch_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/blobby_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/blobby.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// blobby_painter\n\nclass blobby_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tblobby_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator p = Mesh.primitives.begin(); p != Mesh.primitives.end(); ++p)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::blobby::const_primitive> primitive(k3d::blobby::validate(Mesh, **p));\n\t\t\tif(!primitive)\n\t\t\t\tcontinue;\n\n\t\t\tconst size_t blobby_begin = 0;\n\t\t\tconst size_t blobby_end = blobby_begin + primitive->first_primitives.size();\n\t\t\tfor(size_t blobby = blobby_begin; blobby != blobby_end; ++blobby)\n\t\t\t{\n\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\tri_constant_attributes.add_arrays(primitive->constant_attributes);\n\n\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\tri_uniform_attributes.add_arrays(primitive->surface_attributes);\n\n\t\t\t\tarray_copier ri_varying_attributes;\n\t\t\t\tri_varying_attributes.add_arrays(primitive->parameter_attributes);\n\n\t\t\t\tarray_copier ri_vertex_attributes;\n\t\t\t\tri_vertex_attributes.add_arrays(primitive->vertex_attributes);\n\n\t\t\t\tconst k3d::ri::unsigned_integer ri_nleaf = primitive->primitive_counts[blobby];\n\t\t\t\tk3d::ri::unsigned_integers ri_codes;\n\t\t\t\tk3d::ri::reals ri_floats;\n\t\t\t\tk3d::ri::strings ri_strings;\n\n\t\t\t\tconst size_t primitives_begin = primitive->first_primitives[blobby];\n\t\t\t\tconst size_t primitives_end = primitives_begin + primitive->primitive_counts[blobby];\n\t\t\t\tfor(size_t blobby_primitive = primitives_begin; blobby_primitive != primitives_end; ++blobby_primitive)\n\t\t\t\t{\n\t\t\t\t\tri_codes.push_back(primitive->primitives[blobby_primitive]);\n\t\t\t\t\tri_codes.push_back(ri_floats.size());\n\n\t\t\t\t\tconst size_t floats_begin = primitive->primitive_first_floats[blobby_primitive];\n\t\t\t\t\tconst size_t floats_end = floats_begin + primitive->primitive_float_counts[blobby_primitive];\n\t\t\t\t\tri_floats.insert(ri_floats.end(), &primitive->floats[floats_begin], &primitive->floats[floats_end]);\n\n\t\t\t\t\tri_varying_attributes.push_back(blobby_primitive);\n\t\t\t\t\tri_vertex_attributes.push_back(blobby_primitive);\n\t\t\t\t}\n\n\t\t\t\tconst size_t operators_begin = primitive->first_operators[blobby];\n\t\t\t\tconst size_t operators_end = operators_begin + primitive->operator_counts[blobby];\n\t\t\t\tfor(size_t op = operators_begin; op != operators_end; ++op)\n\t\t\t\t{\n\t\t\t\t\tri_codes.push_back(primitive->operators[op]);\n\n\t\t\t\t\tconst size_t operands_begin = primitive->operator_first_operands[op];\n\t\t\t\t\tconst size_t operands_end = operands_begin + primitive->operator_operand_counts[op];\n\t\t\t\t\tfor(size_t operand = operands_begin; operand != operands_end; ++operand)\n\t\t\t\t\t\tri_codes.push_back(primitive->operands[operand]);\n\t\t\t\t}\n\n\t\t\t\tri_constant_attributes.push_back(blobby);\n\t\t\t\tri_uniform_attributes.push_back(blobby);\n\n\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\t\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\t\tri_vertex_attributes.copy_to(k3d::ri::VERTEX, ri_parameters);\n\n\t\t\t\tk3d::ri::setup_material(primitive->materials[blobby], RenderState);\n\n\t\t\t\t// We always have at least one string?\n\t\t\t\tri_strings.push_back(k3d::ri::string());\n\n\t\t\t\tRenderState.stream.RiBlobbyV(ri_nleaf, ri_codes, ri_floats, ri_strings, ri_parameters);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<blobby_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x0221462c, 0xc3d44a12, 0x97b39425, 0x29774d3f),\n\t\t\t\"RenderManBlobbyPainter\",\n\t\t\t_(\"Renders blobbies (implicit surfaces)\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// blobby_painter_factory\n\nk3d::iplugin_factory& blobby_painter_factory()\n{\n\treturn blobby_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/cone_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/cone.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cone_painter\n\nclass cone_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tcone_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::cone::const_primitive> cone(k3d::cone::validate(Mesh, **primitive));\n\t\t\tif(!cone)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::uint_t i = 0; i != cone->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tRenderState.stream.RiAttributeBegin();\n\t\t\t\tRenderState.stream.RiConcatTransform(k3d::ri::convert(cone->matrices[i]));\n\n\t\t\t\tk3d::ri::setup_material(cone->materials[i], RenderState);\n\n\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\n\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\tri_constant_attributes.add_arrays(cone->constant_attributes);\n\t\t\t\tri_constant_attributes.push_back(0);\n\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\n\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\tri_uniform_attributes.add_arrays(cone->surface_attributes);\n\t\t\t\tri_uniform_attributes.push_back(i);\n\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\n\t\t\t\tarray_copier ri_varying_attributes;\n\t\t\t\tri_varying_attributes.add_arrays(cone->parameter_attributes);\n\t\t\t\tfor(k3d::uint_t j = 0; j != 4; ++j)\n\t\t\t\t\tri_varying_attributes.push_back((i * 4) + j);\n\t\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\t\t\n\t\t\t\tRenderState.stream.RiConeV(\n\t\t\t\t\tcone->heights[i],\n\t\t\t\t\tcone->radii[i],\n\t\t\t\t\tk3d::degrees(cone->sweep_angles[i]),\n\t\t\t\t\tri_parameters);\n\n\t\t\t\tRenderState.stream.RiAttributeEnd();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cone_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x6612c455, 0x774ed5d4, 0x5ff0c495, 0x6d920b8e),\n\t\t\t\"RenderManConePainter\",\n\t\t\t_(\"Renders cone primitives\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cone_painter_factory\n\nk3d::iplugin_factory& cone_painter_factory()\n{\n\treturn cone_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/cubic_curve_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/cubic_curve.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cubic_curve_painter\n\nclass cubic_curve_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tcubic_curve_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::cubic_curve::const_primitive> cubic_curve(k3d::cubic_curve::validate(Mesh, **primitive));\n\t\t\tif(!cubic_curve)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::ri::unsigned_integers ri_point_counts;\n\n\t\t\tarray_copier ri_constant_attributes;\n\t\t\tri_constant_attributes.add_arrays(cubic_curve->constant_attributes);\n\n\t\t\tarray_copier ri_uniform_attributes;\n\t\t\tri_uniform_attributes.add_arrays(cubic_curve->curve_attributes);\n\t\t\t\n\t\t\tarray_copier ri_varying_attributes;\n\t\t\tri_varying_attributes.add_arrays(cubic_curve->parameter_attributes);\n\n\t\t\tarray_copier ri_vertex_attributes;\n\t\t\tri_vertex_attributes.add_arrays(cubic_curve->vertex_attributes);\n\t\t\tri_vertex_attributes.add_array(k3d::ri::RI_P(), points);\n\n\t\t\tconst k3d::uint_t curves_begin = 0;\n\t\t\tconst k3d::uint_t curves_end = curves_begin + cubic_curve->curve_first_points.size();\n\t\t\tfor(k3d::uint_t curve = curves_begin; curve != curves_end; ++curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve_points_begin = cubic_curve->curve_first_points[curve];\n\t\t\t\tconst k3d::uint_t curve_points_end = curve_points_begin + cubic_curve->curve_point_counts[curve];\n\t\t\t\tfor(k3d::uint_t curve_point = curve_points_begin; curve_point != curve_points_end; ++curve_point)\n\t\t\t\t\tri_vertex_attributes.push_back(cubic_curve->curve_points[curve_point]);\n\n\t\t\t\tri_point_counts.push_back(cubic_curve->curve_point_counts[curve]);\n\t\t\t\tri_varying_attributes.insert(curve_points_begin, curve_points_end);\n\t\t\t}\n\n\t\t\tri_constant_attributes.push_back(0);\n\t\t\tri_uniform_attributes.insert(curves_begin, curves_end);\n\n\t\t\tk3d::ri::parameter_list ri_parameters;\n\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\tri_vertex_attributes.copy_to(k3d::ri::VERTEX, ri_parameters);\n\n\t\t\tk3d::ri::setup_material(cubic_curve->material[0], RenderState);\n\t\t\tRenderState.stream.RiCurvesV(\"cubic\", ri_point_counts, cubic_curve->periodic[0] ? \"periodic\" : \"nonperiodic\", ri_parameters);\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cubic_curve_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x8c5be7c4, 0x0e8d43c5, 0xa1daace4, 0xa79275d7),\n\t\t\t\"RenderManCubicCurvePainter\",\n\t\t\t_(\"Renders cubic curves\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cubic_curve_painter_factory\n\nk3d::iplugin_factory& cubic_curve_painter_factory()\n{\n\treturn cubic_curve_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/cylinder_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/cylinder.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// cylinder_painter\n\nclass cylinder_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tcylinder_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::cylinder::const_primitive> cylinder(k3d::cylinder::validate(Mesh, **primitive));\n\t\t\tif(!cylinder)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::uint_t i = 0; i != cylinder->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tRenderState.stream.RiAttributeBegin();\n\t\t\t\tRenderState.stream.RiConcatTransform(k3d::ri::convert(cylinder->matrices[i]));\n\n\t\t\t\tk3d::ri::setup_material(cylinder->materials[i], RenderState);\n\n\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\n\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\tri_constant_attributes.add_arrays(cylinder->constant_attributes);\n\t\t\t\tri_constant_attributes.push_back(0);\n\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\n\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\tri_uniform_attributes.add_arrays(cylinder->surface_attributes);\n\t\t\t\tri_uniform_attributes.push_back(i);\n\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\n\t\t\t\tarray_copier ri_varying_attributes;\n\t\t\t\tri_varying_attributes.add_arrays(cylinder->parameter_attributes);\n\t\t\t\tfor(k3d::uint_t j = 0; j != 4; ++j)\n\t\t\t\t\tri_varying_attributes.push_back((i * 4) + j);\n\t\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\t\t\n\t\t\t\tRenderState.stream.RiCylinderV(\n\t\t\t\t\tcylinder->radii[i],\n\t\t\t\t\tcylinder->z_min[i],\n\t\t\t\t\tcylinder->z_max[i],\n\t\t\t\t\tk3d::degrees(cylinder->sweep_angles[i]),\n\t\t\t\t\tri_parameters);\n\n\t\t\t\tRenderState.stream.RiAttributeEnd();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<cylinder_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x85a1d5ac, 0x224449cf, 0x202911a1, 0xa2434ee8),\n\t\t\t\"RenderManCylinderPainter\",\n\t\t\t_(\"Renders cylinder primitives\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// cylinder_painter_factory\n\nk3d::iplugin_factory& cylinder_painter_factory()\n{\n\treturn cylinder_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/disk_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/disk.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// disk_painter\n\nclass disk_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tdisk_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::disk::const_primitive> disk(k3d::disk::validate(Mesh, **primitive));\n\t\t\tif(!disk)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::uint_t i = 0; i != disk->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tRenderState.stream.RiAttributeBegin();\n\t\t\t\tRenderState.stream.RiConcatTransform(k3d::ri::convert(disk->matrices[i]));\n\n\t\t\t\tk3d::ri::setup_material(disk->materials[i], RenderState);\n\n\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\n\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\tri_constant_attributes.add_arrays(disk->constant_attributes);\n\t\t\t\tri_constant_attributes.push_back(0);\n\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\n\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\tri_uniform_attributes.add_arrays(disk->surface_attributes);\n\t\t\t\tri_uniform_attributes.push_back(i);\n\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\n\t\t\t\tarray_copier ri_varying_attributes;\n\t\t\t\tri_varying_attributes.add_arrays(disk->parameter_attributes);\n\t\t\t\tfor(k3d::uint_t j = 0; j != 4; ++j)\n\t\t\t\t\tri_varying_attributes.push_back((i * 4) + j);\n\t\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\t\t\n\t\t\t\tRenderState.stream.RiDiskV(\n\t\t\t\t\tdisk->heights[i],\n\t\t\t\t\tdisk->radii[i],\n\t\t\t\t\tk3d::degrees(disk->sweep_angles[i]),\n\t\t\t\t\tri_parameters);\n\n\t\t\t\tRenderState.stream.RiAttributeEnd();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<disk_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x6c92b34f, 0x57480914, 0x1708dca6, 0xcc8651cc),\n\t\t\t\"RenderManDiskPainter\",\n\t\t\t_(\"Renders disk primitives\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// disk_painter_factory\n\nk3d::iplugin_factory& disk_painter_factory()\n{\n\treturn disk_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/hyperboloid_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/hyperboloid.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// hyperboloid_painter\n\nclass hyperboloid_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\thyperboloid_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::hyperboloid::const_primitive> hyperboloid(k3d::hyperboloid::validate(Mesh, **primitive));\n\t\t\tif(!hyperboloid)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::uint_t i = 0; i != hyperboloid->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tRenderState.stream.RiAttributeBegin();\n\t\t\t\tRenderState.stream.RiConcatTransform(k3d::ri::convert(hyperboloid->matrices[i]));\n\n\t\t\t\tk3d::ri::setup_material(hyperboloid->materials[i], RenderState);\n\n\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\n\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\tri_constant_attributes.add_arrays(hyperboloid->constant_attributes);\n\t\t\t\tri_constant_attributes.push_back(0);\n\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\n\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\tri_uniform_attributes.add_arrays(hyperboloid->surface_attributes);\n\t\t\t\tri_uniform_attributes.push_back(i);\n\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\n\t\t\t\tarray_copier ri_varying_attributes;\n\t\t\t\tri_varying_attributes.add_arrays(hyperboloid->parameter_attributes);\n\t\t\t\tfor(k3d::uint_t j = 0; j != 4; ++j)\n\t\t\t\t\tri_varying_attributes.push_back((i * 4) + j);\n\t\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\t\t\n\t\t\t\tRenderState.stream.RiHyperboloidV(\n\t\t\t\t\thyperboloid->start_points[i],\n\t\t\t\t\thyperboloid->end_points[i],\n\t\t\t\t\tk3d::degrees(hyperboloid->sweep_angles[i]),\n\t\t\t\t\tri_parameters);\n\n\t\t\t\tRenderState.stream.RiAttributeEnd();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<hyperboloid_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x8f5ac6bd, 0xf84bfac3, 0x8585f08b, 0x953e3df1),\n\t\t\t\"RenderManHyperboloidPainter\",\n\t\t\t_(\"Renders hyperboloid primitives\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// hyperboloid_painter_factory\n\nk3d::iplugin_factory& hyperboloid_painter_factory()\n{\n\treturn hyperboloid_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/linear_curve_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// linear_curve_painter\n\nclass linear_curve_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tlinear_curve_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::linear_curve::const_primitive> linear_curve(k3d::linear_curve::validate(Mesh, **primitive));\n\t\t\tif(!linear_curve)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tk3d::ri::unsigned_integers ri_point_counts;\n\n\t\t\tarray_copier ri_constant_attributes;\n\t\t\tri_constant_attributes.add_arrays(linear_curve->constant_attributes);\n\n\t\t\tarray_copier ri_uniform_attributes;\n\t\t\tri_uniform_attributes.add_arrays(linear_curve->curve_attributes);\n\t\t\t\n\t\t\tarray_copier ri_varying_attributes;\n\t\t\tri_varying_attributes.add_arrays(linear_curve->parameter_attributes);\n\n\t\t\tarray_copier ri_vertex_attributes;\n\t\t\tri_vertex_attributes.add_arrays(linear_curve->vertex_attributes);\n\t\t\tri_vertex_attributes.add_array(k3d::ri::RI_P(), points);\n\n\t\t\tconst k3d::uint_t curves_begin = 0;\n\t\t\tconst k3d::uint_t curves_end = curves_begin + linear_curve->curve_first_points.size();\n\t\t\tfor(k3d::uint_t curve = curves_begin; curve != curves_end; ++curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve_points_begin = linear_curve->curve_first_points[curve];\n\t\t\t\tconst k3d::uint_t curve_points_end = curve_points_begin + linear_curve->curve_point_counts[curve];\n\t\t\t\tfor(k3d::uint_t curve_point = curve_points_begin; curve_point != curve_points_end; ++curve_point)\n\t\t\t\t\tri_vertex_attributes.push_back(linear_curve->curve_points[curve_point]);\n\n\t\t\t\tri_point_counts.push_back(linear_curve->curve_point_counts[curve]);\n\t\t\t\tri_varying_attributes.insert(curve_points_begin, curve_points_end);\n\t\t\t}\n\n\t\t\tri_constant_attributes.push_back(0);\n\t\t\tri_uniform_attributes.insert(curves_begin, curves_end);\n\n\t\t\tk3d::ri::parameter_list ri_parameters;\n\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\tri_vertex_attributes.copy_to(k3d::ri::VERTEX, ri_parameters);\n\n\t\t\tk3d::ri::setup_material(linear_curve->material[0], RenderState);\n\t\t\tRenderState.stream.RiCurvesV(\"linear\", ri_point_counts, linear_curve->periodic[0] ? \"periodic\" : \"nonperiodic\", ri_parameters);\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<linear_curve_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xf8b19206, 0xa0ae4bd1, 0xb3548a15, 0x1209469e),\n\t\t\t\"RenderManLinearCurvePainter\",\n\t\t\t_(\"Renders linear curves\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// linear_curve_painter_factory\n\nk3d::iplugin_factory& linear_curve_painter_factory()\n{\n\treturn linear_curve_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\nextern k3d::iplugin_factory& bicubic_patch_painter_factory();\nextern k3d::iplugin_factory& bilinear_patch_painter_factory();\nextern k3d::iplugin_factory& blobby_painter_factory();\nextern k3d::iplugin_factory& cone_painter_factory();\nextern k3d::iplugin_factory& cubic_curve_painter_factory();\nextern k3d::iplugin_factory& cylinder_painter_factory();\nextern k3d::iplugin_factory& disk_painter_factory();\nextern k3d::iplugin_factory& hyperboloid_painter_factory();\nextern k3d::iplugin_factory& linear_curve_painter_factory();\nextern k3d::iplugin_factory& multi_painter_factory();\nextern k3d::iplugin_factory& multi_painter_factory();\nextern k3d::iplugin_factory& nurbs_patch_painter_factory();\nextern k3d::iplugin_factory& paraboloid_painter_factory();\nextern k3d::iplugin_factory& particle_painter_factory();\nextern k3d::iplugin_factory& polyhedron_painter_factory();\nextern k3d::iplugin_factory& scripted_painter_factory();\nextern k3d::iplugin_factory& sphere_painter_factory();\nextern k3d::iplugin_factory& subdivision_surface_painter_factory();\nextern k3d::iplugin_factory& teapot_painter_factory();\nextern k3d::iplugin_factory& torus_painter_factory();\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::renderman::painters::bicubic_patch_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::bilinear_patch_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::blobby_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::cone_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::cubic_curve_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::cylinder_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::disk_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::hyperboloid_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::linear_curve_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::multi_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::nurbs_patch_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::paraboloid_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::particle_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::polyhedron_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::scripted_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::sphere_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::subdivision_surface_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::teapot_painter_factory());\n\tRegistry.register_factory(module::renderman::painters::torus_painter_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/renderman_painters/multi_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property.h>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// multi_painter\n\nclass multi_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tmulti_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tconst k3d::iproperty_collection::properties_t& properties = node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t\t{\n\t\t\tk3d::iproperty& property = **prop;\n\t\t\tif(property.property_type() == typeid(k3d::inode*))\n\t\t\t{\n\t\t\t\tif(k3d::ri::imesh_painter* const painter = dynamic_cast<k3d::ri::imesh_painter*>(boost::any_cast<k3d::inode*>(k3d::property::pipeline_value(property))))\n\t\t\t\t{\n\t\t\t\t\tpainter->paint_mesh(Mesh, RenderState);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tconst k3d::iproperty_collection::properties_t& properties = node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t\t{\n\t\t\tk3d::iproperty& property = **prop;\n\t\t\tif(property.property_type() == typeid(k3d::inode*))\n\t\t\t{\n\t\t\t\tif(k3d::ri::imesh_painter* const painter = dynamic_cast<k3d::ri::imesh_painter*>(boost::any_cast<k3d::inode*>(k3d::property::pipeline_value(property))))\n\t\t\t\t{\n\t\t\t\t\tpainter->paint_complete(Mesh, RenderState);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<multi_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x243cba5a, 0x13f342fa, 0x8f1a19cd, 0xfaf34169),\n\t\t\t\"RenderManMultiPainter\",\n\t\t\t_(\"Distributes rendering across multiple mesh painters\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// multi_painter_factory\n\nk3d::iplugin_factory& multi_painter_factory()\n{\n\treturn multi_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/nurbs_patch_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// nurbs_patch_painter\n\nclass nurbs_patch_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tnurbs_patch_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\t~nurbs_patch_painter()\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs(k3d::nurbs_patch::validate(Mesh, **primitive));\n\t\t\tif(!nurbs)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\n\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\tconst k3d::uint_t patch_end = patch_begin + nurbs->patch_first_points.size();\n\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t{\n\t\t\t\tk3d::ri::reals u_knots(nurbs->patch_u_knots.begin() + nurbs->patch_u_first_knots[patch], nurbs->patch_u_knots.begin() + nurbs->patch_u_first_knots[patch] + nurbs->patch_u_point_counts[patch] + nurbs->patch_u_orders[patch]);\n\t\t\t\tk3d::ri::reals v_knots(nurbs->patch_v_knots.begin() + nurbs->patch_v_first_knots[patch], nurbs->patch_v_knots.begin() + nurbs->patch_v_first_knots[patch] + nurbs->patch_v_point_counts[patch] + nurbs->patch_v_orders[patch]);\n\n\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\tri_constant_attributes.add_arrays(nurbs->constant_attributes);\n\n\t\t\t\tarray_copier ri_uniform_attributes;\n        // K-3D NURBS patch attributes do not have the same cardinality as RenderMan NURBS uniform attributes!\n//\t\t\t\tri_uniform_attributes.add_arrays(nurbs->uniform_attributes);\n\n\t\t\t\tarray_copier ri_varying_attributes;\n\t\t\t\tri_varying_attributes.add_arrays(nurbs->parameter_attributes);\n\n\t\t\t\tarray_copier ri_vertex_attributes;\n\t\t\t\tri_vertex_attributes.add_arrays(Mesh.point_attributes);\n\n\t\t\t\tk3d::typed_array<k3d::ri::hpoint>* const ri_points = new k3d::typed_array<k3d::ri::hpoint>();\n\n\t\t\t\tconst k3d::uint_t point_begin = nurbs->patch_first_points[patch];\n\t\t\t\tconst k3d::uint_t point_end = point_begin + (nurbs->patch_u_point_counts[patch] * nurbs->patch_v_point_counts[patch]);\n\t\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\t{\n\t\t\t\t\tri_points->push_back(k3d::ri::hpoint(\n\t\t\t\t\t\tnurbs->patch_point_weights[point] * points[nurbs->patch_points[point]][0],\n\t\t\t\t\t\tnurbs->patch_point_weights[point] * points[nurbs->patch_points[point]][1],\n\t\t\t\t\t\tnurbs->patch_point_weights[point] * points[nurbs->patch_points[point]][2],\n\t\t\t\t\t\tnurbs->patch_point_weights[point]));\n\n\t\t\t\t\tri_vertex_attributes.push_back(nurbs->patch_points[point]);\n\t\t\t\t}\n\n\t\t\t\tri_constant_attributes.push_back(patch);\n\t\t\t\tri_uniform_attributes.push_back(patch);\n\t\t\t\tri_varying_attributes.insert(4 * patch, 4 * (patch + 1));\n\n\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\t\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\t\tri_vertex_attributes.copy_to(k3d::ri::VERTEX, ri_parameters);\n\t\t\t\tri_parameters.push_back(k3d::ri::parameter(k3d::ri::RI_PW(), k3d::ri::VERTEX, 1, ri_points));\n\n\t\t\t\tk3d::ri::setup_material(nurbs->patch_materials[patch], RenderState);\n\t\t\t\t\n\t\t\t\tif(nurbs->patch_trim_loop_counts[patch])\n\t\t\t\t{\n\t\t\t\t\tk3d::ri::unsigned_integers ri_curve_counts;\n\t\t\t\t\tk3d::ri::unsigned_integers ri_trim_orders;\n\t\t\t\t\tk3d::ri::reals ri_trim_knots;\n\t\t\t\t\tk3d::ri::reals ri_trim_mins;\n\t\t\t\t\tk3d::ri::reals ri_trim_maxs;\n\t\t\t\t\tk3d::ri::unsigned_integers ri_trim_point_counts;\n\t\t\t\t\tk3d::ri::reals ri_trim_u;\n\t\t\t\t\tk3d::ri::reals ri_trim_v;\n\t\t\t\t\tk3d::ri::reals ri_trim_w;\n\t\t\t\t\t\n\t\t\t\t\tk3d::uint_t loops_start = nurbs->patch_first_trim_loops[patch];\n\t\t\t\t\tk3d::uint_t loops_end = loops_start + nurbs->patch_trim_loop_counts[patch];\n\t\t\t\t\tfor (k3d::uint_t loop_index = loops_start; loop_index != loops_end; ++loop_index)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::uint_t curves_start = nurbs->trim_loop_first_curves[loop_index];\n\t\t\t\t\t\tk3d::uint_t curves_end = curves_start + nurbs->trim_loop_curve_counts[loop_index];\n\t\t\t\t\t\tri_curve_counts.push_back(nurbs->trim_loop_curve_counts[loop_index]);\n\t\t\t\t\t\tfor (k3d::uint_t curve = curves_start; curve != curves_end; ++curve)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tri_trim_orders.push_back(nurbs->curve_orders[curve]);\n\t\t\t\t\t\t\tri_trim_knots.insert(ri_trim_knots.end(), nurbs->curve_knots.begin() + nurbs->curve_first_knots[curve], nurbs->curve_knots.begin() + nurbs->curve_first_knots[curve] + nurbs->curve_point_counts[curve] + nurbs->curve_orders[curve]);\n\t\t\t\t\t\t\tri_trim_mins.push_back(nurbs->curve_knots[nurbs->curve_orders[curve] - 1]);\n\t\t\t\t\t\t\tri_trim_maxs.push_back(nurbs->curve_knots[nurbs->curve_point_counts[curve]]);\n\t\t\t\t\t\t\tri_trim_point_counts.push_back(nurbs->curve_point_counts[curve]);\n\t\t\t\t\t\t\tk3d::uint_t points_start = nurbs->curve_first_points[curve];\n\t\t\t\t\t\t\tk3d::uint_t points_end = points_start + nurbs->curve_point_counts[curve];\n\t\t\t\t\t\t\tfor (k3d::uint_t point = points_start; point != points_end; ++point)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::point2 control_point = nurbs->points[nurbs->curve_points[point]];\n\t\t\t\t\t\t\t\tdouble weight = nurbs->curve_point_weights[point];\n\t\t\t\t\t\t\t\tri_trim_u.push_back(static_cast<k3d::ri::real>(control_point[0] * weight));\n\t\t\t\t\t\t\t\tri_trim_v.push_back(static_cast<k3d::ri::real>(control_point[1] * weight));\n\t\t\t\t\t\t\t\tri_trim_w.push_back(static_cast<k3d::ri::real>(weight));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tRenderState.stream.RiTrimCurve(\n\t\t\t\t\t\tri_curve_counts,\n\t\t\t\t\t\tri_trim_orders,\n\t\t\t\t\t\tri_trim_knots,\n\t\t\t\t\t\tri_trim_mins,\n\t\t\t\t\t\tri_trim_maxs,\n\t\t\t\t\t\tri_trim_point_counts,\n\t\t\t\t\t\tri_trim_u,\n\t\t\t\t\t\tri_trim_v,\n\t\t\t\t\t\tri_trim_w\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tRenderState.stream.RiNuPatchV(\n\t\t\t\t\tnurbs->patch_u_point_counts[patch],\n\t\t\t\t\tnurbs->patch_u_orders[patch],\n\t\t\t\t\tu_knots,\n\t\t\t\t\tu_knots[nurbs->patch_u_orders[patch] - 1],\n\t\t\t\t\tu_knots[nurbs->patch_u_point_counts[patch]],\n\t\t\t\t\tnurbs->patch_v_point_counts[patch],\n\t\t\t\t\tnurbs->patch_v_orders[patch],\n\t\t\t\t\tv_knots,\n\t\t\t\t\tv_knots[nurbs->patch_v_orders[patch] - 1],\n\t\t\t\t\tv_knots[nurbs->patch_v_point_counts[patch]],\n\t\t\t\t\tri_parameters\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<nurbs_patch_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x120d87f0, 0xfe05419f, 0xae2d14ce, 0xea9c32b4),\n\t\t\t\"RenderManNURBSPatchPainter\",\n\t\t\t_(\"Renders NURBS patches\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// nurbs_patch_painter_factory\n\nk3d::iplugin_factory& nurbs_patch_painter_factory()\n{\n\treturn nurbs_patch_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/paraboloid_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/paraboloid.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// paraboloid_painter\n\nclass paraboloid_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tparaboloid_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::paraboloid::const_primitive> paraboloid(k3d::paraboloid::validate(Mesh, **primitive));\n\t\t\tif(!paraboloid)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::uint_t i = 0; i != paraboloid->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tRenderState.stream.RiAttributeBegin();\n\t\t\t\tRenderState.stream.RiConcatTransform(k3d::ri::convert(paraboloid->matrices[i]));\n\n\t\t\t\tk3d::ri::setup_material(paraboloid->materials[i], RenderState);\n\n\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\n\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\tri_constant_attributes.add_arrays(paraboloid->constant_attributes);\n\t\t\t\tri_constant_attributes.push_back(0);\n\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\n\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\tri_uniform_attributes.add_arrays(paraboloid->surface_attributes);\n\t\t\t\tri_uniform_attributes.push_back(i);\n\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\n\t\t\t\tarray_copier ri_varying_attributes;\n\t\t\t\tri_varying_attributes.add_arrays(paraboloid->parameter_attributes);\n\t\t\t\tfor(k3d::uint_t j = 0; j != 4; ++j)\n\t\t\t\t\tri_varying_attributes.push_back((i * 4) + j);\n\t\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\t\t\n\t\t\t\tRenderState.stream.RiParaboloidV(\n\t\t\t\t\tparaboloid->radii[i],\n\t\t\t\t\tparaboloid->z_min[i],\n\t\t\t\t\tparaboloid->z_max[i],\n\t\t\t\t\tk3d::degrees(paraboloid->sweep_angles[i]),\n\t\t\t\t\tri_parameters);\n\n\t\t\t\tRenderState.stream.RiAttributeEnd();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<paraboloid_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x49dafd22, 0xd34c22e6, 0xcb8e30b3, 0x0f74f5ef),\n\t\t\t\"RenderManParaboloidPainter\",\n\t\t\t_(\"Renders paraboloid primitives\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// paraboloid_painter_factory\n\nk3d::iplugin_factory& paraboloid_painter_factory()\n{\n\treturn paraboloid_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/particle_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/particle.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// particle_painter\n\nclass particle_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tparticle_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tif(!Mesh.points)\n\t\t\treturn;\n\n\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\tconst k3d::mesh::table_t& vertex_attributes = Mesh.point_attributes;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::particle::const_primitive> particle(k3d::particle::validate(Mesh, **primitive));\n\t\t\tif(!particle)\n\t\t\t\tcontinue;\n\n\t\t\tarray_copier ri_constant_attributes;\n\t\t\tri_constant_attributes.add_arrays(particle->constant_attributes);\n\n\t\t\tarray_copier ri_varying_attributes;\n\t\t\tri_varying_attributes.add_arrays(particle->vertex_attributes);\n\n\t\t\tarray_copier ri_vertex_attributes;\n\t\t\tri_vertex_attributes.add_arrays(vertex_attributes);\n\t\t\tri_vertex_attributes.add_array(k3d::ri::RI_P(), points);\n\n\t\t\tconst k3d::uint_t point_begin = 0;\n\t\t\tconst k3d::uint_t point_end = point_begin + particle->points.size();\n\t\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\t\tri_vertex_attributes.push_back(particle->points[point]);\n\n\t\t\tri_constant_attributes.push_back(0);\n\t\t\tri_varying_attributes.insert(point_begin, point_end);\n\n\t\t\tk3d::ri::parameter_list ri_parameters;\n\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\tri_vertex_attributes.copy_to(k3d::ri::VERTEX, ri_parameters);\n\n\t\t\tk3d::ri::setup_material(particle->material[0], RenderState);\n\t\t\tRenderState.stream.RiPointsV(particle->points.size(), ri_parameters);\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<particle_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x06fab90b, 0x2f034d69, 0xb4a1cb9f, 0xb9864144),\n\t\t\t\"RenderManParticlePainter\",\n\t\t\t_(\"Renders particle primitives.\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// particle_painter_factory\n\nk3d::iplugin_factory& particle_painter_factory()\n{\n\treturn particle_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/polyhedron_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <set>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// polyhedron_painter\n\nclass polyhedron_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tpolyhedron_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\t\tconst k3d::mesh::table_t& point_attributes = Mesh.point_attributes;\n\n\t\t\tconst k3d::uint_t shell_begin = 0;\n\t\t\tconst k3d::uint_t shell_end = shell_begin + polyhedron->shell_types.size();\n\t\t\tfor(k3d::uint_t shell = shell_begin; shell != shell_end; ++shell)\n\t\t\t{\n\t\t\t\tif(polyhedron->shell_types[shell] != k3d::polyhedron::POLYGONS)\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// Get the set of all materials used in this polyhedron ...\n\t\t\t\ttypedef std::set<k3d::imaterial*> materials_t;\n\t\t\t\tmaterials_t materials;\n\n\t\t\t\tconst k3d::uint_t faces_begin = 0;\n\t\t\t\tconst k3d::uint_t faces_end = faces_begin + polyhedron->face_shells.size();\n\t\t\t\tfor(k3d::uint_t face = faces_begin; face != faces_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tif(polyhedron->face_shells[face] != shell)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tmaterials.insert(polyhedron->face_materials[face]);\n\t\t\t\t}\n\n\t\t\t\t// Iterate over each material, rendering all the faces that use that material in a single pass\n\t\t\t\tfor(materials_t::iterator m = materials.begin(); m != materials.end(); ++m)\n\t\t\t\t{\n\t\t\t\t\tk3d::imaterial* const material = *m;\n\n\t\t\t\t\tk3d::ri::unsigned_integers loop_counts;\n\t\t\t\t\tk3d::ri::unsigned_integers vertex_counts;\n\t\t\t\t\tk3d::ri::unsigned_integers vertex_ids;\n\n\t\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\t\tri_constant_attributes.add_arrays(polyhedron->constant_attributes);\n\n\t\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\t\tri_uniform_attributes.add_arrays(polyhedron->face_attributes);\n\n\t\t\t\t\tarray_copier ri_facevarying_attributes;\n\t\t\t\t\tri_facevarying_attributes.add_arrays(polyhedron->vertex_attributes);\n\n\t\t\t\t\tarray_copier ri_vertex_attributes;\n\t\t\t\t\tri_vertex_attributes.add_array(k3d::ri::RI_P(), points);\n\t\t\t\t\tri_vertex_attributes.add_arrays(point_attributes);\n\n\t\t\t\t\tri_constant_attributes.push_back(0);\n\n\t\t\t\t\tfor(k3d::uint_t face = faces_begin; face != faces_end; ++face)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(polyhedron->face_shells[face] != shell)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tif(polyhedron->face_materials[face] != material)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tloop_counts.push_back(polyhedron->face_loop_counts[face]);\n\n\t\t\t\t\t\tri_uniform_attributes.push_back(face);\n\n\t\t\t\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\t\t\tconst k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::uint_t vertex_count = 0;\n\n\t\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tri_facevarying_attributes.push_back(edge);\n\n\t\t\t\t\t\t\t\t++vertex_count;\n\t\t\t\t\t\t\t\tvertex_ids.push_back(polyhedron->vertex_points[edge]);\n\n\t\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvertex_counts.push_back(vertex_count);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tri_vertex_attributes.insert(0, points.size());\n\n\t\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\t\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\t\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\t\t\t\t\tri_facevarying_attributes.copy_to(k3d::ri::FACEVARYING, ri_parameters);\n\t\t\t\t\tri_vertex_attributes.copy_to(k3d::ri::VERTEX, ri_parameters);\n\n\t\t\t\t\tk3d::ri::setup_material(material, RenderState);\n\t\t\t\t\tRenderState.stream.RiPointsGeneralPolygonsV(loop_counts, vertex_counts, vertex_ids, ri_parameters);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<polyhedron_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x0771ea79, 0x6c8c4c6d, 0x8bab8c83, 0x42fc73e9),\n\t\t\t\"RenderManPolyhedronPainter\",\n\t\t\t_(\"Renders mesh polyhedra\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// polyhedron_painter_factory\n\nk3d::iplugin_factory& polyhedron_painter_factory()\n{\n\treturn polyhedron_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/scripted_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/scripted_node.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// scripted_painter\n\nclass scripted_painter :\n\tpublic k3d::scripted_node<k3d::node>,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::scripted_node<k3d::node> base;\n\npublic:\n\tscripted_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\t// Get a path where we can store the scripted RIB output ...\n\t\tconst k3d::filesystem::path archive_path = RenderState.frame.add_file(\"scripted_painter\");\n\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"input\"] = const_cast<k3d::mesh*>(&Mesh);\n\t\tcontext[\"archive\"] = archive_path;\n\t\tcontext[\"render_state\"] = &RenderState;\n\n\t\treturn_if_fail(execute_script(context));\n\n\t\tRenderState.stream.RiReadArchive(archive_path);\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<scripted_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x211913e0, 0xa54aec62, 0x938b32a0, 0x0e5858d9),\n\t\t\t\"RenderManScriptedPainter\",\n\t\t\t_(\"Uses a script to render meshes\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// scripted_painter.cpp_factory\n\nk3d::iplugin_factory& scripted_painter_factory()\n{\n\treturn scripted_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/sphere_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/sphere.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sphere_painter\n\nclass sphere_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tsphere_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::sphere::const_primitive> sphere(k3d::sphere::validate(Mesh, **primitive));\n\t\t\tif(!sphere)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::uint_t i = 0; i != sphere->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tRenderState.stream.RiAttributeBegin();\n\t\t\t\tRenderState.stream.RiConcatTransform(k3d::ri::convert(sphere->matrices[i]));\n\n\t\t\t\tk3d::ri::setup_material(sphere->materials[i], RenderState);\n\n\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\n\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\tri_constant_attributes.add_arrays(sphere->constant_attributes);\n\t\t\t\tri_constant_attributes.push_back(0);\n\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\n\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\tri_uniform_attributes.add_arrays(sphere->surface_attributes);\n\t\t\t\tri_uniform_attributes.push_back(i);\n\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\n\t\t\t\tarray_copier ri_varying_attributes;\n\t\t\t\tri_varying_attributes.add_arrays(sphere->parameter_attributes);\n\t\t\t\tfor(k3d::uint_t j = 0; j != 4; ++j)\n\t\t\t\t\tri_varying_attributes.push_back((i * 4) + j);\n\t\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\t\t\n\t\t\t\tRenderState.stream.RiSphereV(\n\t\t\t\t\tsphere->radii[i],\n\t\t\t\t\tstd::max(-sphere->radii[i], sphere->radii[i] * sphere->z_min[i]),\n\t\t\t\t\tstd::min(sphere->radii[i], sphere->radii[i] * sphere->z_max[i]),\n\t\t\t\t\tk3d::degrees(sphere->sweep_angles[i]),\n\t\t\t\t\tri_parameters);\n\n\t\t\t\tRenderState.stream.RiAttributeEnd();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sphere_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xa07012c4, 0xce4b11f4, 0x92d5f48d, 0x8f3751c0),\n\t\t\t\"RenderManSpherePainter\",\n\t\t\t_(\"Renders sphere primitives\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// sphere_painter_factory\n\nk3d::iplugin_factory& sphere_painter_factory()\n{\n\treturn sphere_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/subdivision_surface_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <set>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// subdivision_surface_painter\n\nclass subdivision_surface_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\ttypedef k3d::typed_array<k3d::string_t> strings_t;\npublic:\n\tsubdivision_surface_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh::points_t& points = *Mesh.points;\n\t\t\n\t\t\tconst strings_t* const interpolateboundary_tags = polyhedron->constant_attributes.lookup<strings_t>(\"interpolateboundary\");\n\t\t\tconst k3d::mesh::doubles_t* const creases = polyhedron->edge_attributes.lookup<k3d::mesh::doubles_t>(\"crease\");\n\t\t\tconst k3d::mesh::doubles_t* const corners = polyhedron->vertex_attributes.lookup<k3d::mesh::doubles_t>(\"corner\");\n\t\t\tconst k3d::mesh::bools_t* const holes = polyhedron->face_attributes.lookup<k3d::mesh::bools_t>(\"hole\");\n\n\t\t\tconst k3d::uint_t shell_begin = 0;\n\t\t\tconst k3d::uint_t shell_end = shell_begin + polyhedron->shell_types.size();\n\t\t\tfor(k3d::uint_t shell = shell_begin; shell != shell_end; ++shell)\n\t\t\t{\n\t\t\t\tif(polyhedron->shell_types[shell] != k3d::polyhedron::CATMULL_CLARK)\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// Get the set of all materials used in this polyhedron ...\n\t\t\t\ttypedef std::set<k3d::imaterial*> materials_t;\n\t\t\t\tmaterials_t materials;\n\n\t\t\t\tconst k3d::uint_t faces_begin = 0;\n\t\t\t\tconst k3d::uint_t faces_end = faces_begin + polyhedron->face_shells.size();\n\t\t\t\tfor(k3d::uint_t face = faces_begin; face != faces_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tif(polyhedron->face_shells[face] != shell)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tmaterials.insert(polyhedron->face_materials[face]);\n\t\t\t\t}\n\n\t\t\t\t// Iterate over each material, rendering all the faces that use that material in a single pass\n\t\t\t\tfor(materials_t::iterator m = materials.begin(); m != materials.end(); ++m)\n\t\t\t\t{\n\t\t\t\t\tk3d::imaterial* const material = *m;\n\n\t\t\t\t\tk3d::ri::unsigned_integers vertex_counts;\n\t\t\t\t\tk3d::ri::unsigned_integers vertex_ids;\n\n\t\t\t\t\tk3d::typed_array<k3d::ri::point>* const ri_points = new k3d::typed_array<k3d::ri::point>(points);\n\n\t\t\t\t\tk3d::ri::strings tags;\n\t\t\t\t\tk3d::ri::unsigned_integers tag_counts;\n\t\t\t\t\tk3d::ri::integers tag_integers;\n\t\t\t\t\tk3d::ri::reals tag_reals;\n\n\t\t\t\t\ttypedef std::map<k3d::uint_t, k3d::double_t> corners_t;\n\t\t\t\t\tcorners_t corner_values;\n\n\t\t\t\t\tk3d::mesh::indices_t hole_indices;\n\n\t\t\t\t\tfor(k3d::uint_t face = faces_begin; face != faces_end; ++face)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(polyhedron->face_shells[face] != shell)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tif(polyhedron->face_materials[face] != material)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tk3d::uint_t vertex_count = 0;\n\n\t\t\t\t\t\tconst k3d::uint_t loop = polyhedron->face_first_loops[face];\n\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t++vertex_count;\n\t\t\t\t\t\t\tvertex_ids.push_back(polyhedron->vertex_points[edge]);\n\t\t\t\t\t\t\tif(creases)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst k3d::double_t crease_value = creases->at(edge);\n\t\t\t\t\t\t\t\tif(crease_value)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttags.push_back(\"crease\");\n\t\t\t\t\t\t\t\t\ttag_counts.push_back(2);\n\t\t\t\t\t\t\t\t\ttag_counts.push_back(1);\n\t\t\t\t\t\t\t\t\ttag_integers.push_back(polyhedron->vertex_points[edge]);\n\t\t\t\t\t\t\t\t\ttag_integers.push_back(polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]);\n\t\t\t\t\t\t\t\t\ttag_reals.push_back(crease_value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif(corners)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst k3d::double_t corner_value = corners->at(edge);\n\t\t\t\t\t\t\t\tif(corner_value)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcorner_values[polyhedron->vertex_points[edge]] = corner_value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(holes && holes->at(face))\n\t\t\t\t\t\t\thole_indices.push_back(vertex_counts.size());\n\t\t\t\t\t\tvertex_counts.push_back(vertex_count);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (interpolateboundary_tags)\n\t\t\t\t\t{\n\t\t\t\t\t\ttags.push_back(interpolateboundary_tags->at(shell));\n\t\t\t\t\t\ttag_counts.push_back(0);\n\t\t\t\t\t\ttag_counts.push_back(0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif(corners)\n\t\t\t\t\t{\n\t\t\t\t\t\ttags.push_back(\"corner\");\n\t\t\t\t\t\ttag_counts.push_back(corner_values.size());\n\t\t\t\t\t\ttag_counts.push_back(corner_values.size());\n\t\t\t\t\t}\n\t\t\t\t\tfor(corners_t::const_iterator corner = corner_values.begin(); corner != corner_values.end(); ++corner)\n\t\t\t\t\t{\n\t\t\t\t\t\ttag_integers.push_back(corner->first);\n\t\t\t\t\t\ttag_reals.push_back(corner->second);\n\t\t\t\t\t}\n\n\t\t\t\t\tif(holes)\n\t\t\t\t\t{\n\t\t\t\t\t\ttags.push_back(\"hole\");\n\t\t\t\t\t\ttag_counts.push_back(hole_indices.size());\n\t\t\t\t\t\ttag_counts.push_back(0);\n\t\t\t\t\t\ttag_integers.insert(tag_integers.end(), hole_indices.begin(), hole_indices.end());\n\t\t\t\t\t}\n\n\t\t\t\t\tk3d::ri::parameter_list parameters;\n\t\t\t\t\tparameters.push_back(k3d::ri::parameter(k3d::ri::RI_P(), k3d::ri::VERTEX, 1, ri_points));\n\n\t\t\t\t\tk3d::ri::setup_material(material, RenderState);\n\t\t\t\t\tRenderState.stream.RiSubdivisionMeshV(\"catmull-clark\", vertex_counts, vertex_ids, tags, tag_counts, tag_integers, tag_reals, parameters);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<subdivision_surface_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0x4d6fae39, 0x723e4ed3, 0xbc5735c5, 0x3b75edc0),\n\t\t\t\"RenderManSubdivisionSurfacePainter\",\n\t\t\t_(\"Renders mesh subdivision surfaces\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// subdivision_surface_painter_factory\n\nk3d::iplugin_factory& subdivision_surface_painter_factory()\n{\n\treturn subdivision_surface_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/teapot_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/teapot.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// teapot_painter\n\nclass teapot_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\tteapot_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::teapot::const_primitive> teapot(k3d::teapot::validate(Mesh, **primitive));\n\t\t\tif(!teapot)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::uint_t i = 0; i != teapot->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tRenderState.stream.RiAttributeBegin();\n\t\t\t\tRenderState.stream.RiConcatTransform(k3d::ri::convert(teapot->matrices[i]));\n\n\t\t\t\tk3d::ri::setup_material(teapot->materials[i], RenderState);\n\n\t\t\t\tfor(k3d::uint_t patch = 0; patch != 32; ++patch)\n\t\t\t\t{\n\t\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\n\t\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\t\tri_constant_attributes.add_arrays(teapot->constant_attributes);\n\t\t\t\t\tri_constant_attributes.push_back(0);\n\t\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\n\t\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\t\tri_uniform_attributes.add_arrays(teapot->surface_attributes);\n\t\t\t\t\tri_uniform_attributes.push_back(i);\n\t\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\n\t\t\t\t\tk3d::typed_array<k3d::point3>* const ri_points = new k3d::typed_array<k3d::point3>(16);\n\t\t\t\t\tfor(k3d::uint_t vertex = 0; vertex != 16; ++vertex)\n\t\t\t\t\t{\n\t\t\t\t\t\t(*ri_points)[vertex] = k3d::point3(\n\t\t\t\t\t\t\tteapot_points[teapot_patches[patch][vertex]][0],\n\t\t\t\t\t\t\tteapot_points[teapot_patches[patch][vertex]][1],\n\t\t\t\t\t\t\tteapot_points[teapot_patches[patch][vertex]][2]);\n\t\t\t\t\t}\n\t\t\t\t\tri_parameters.push_back(k3d::ri::parameter(k3d::ri::RI_P(), k3d::ri::VERTEX, 1, ri_points));\n\t\t\t\t\t\n\t\t\t\t\tRenderState.stream.RiBasis(\"bezier\", 3, \"bezier\", 3);\n\t\t\t\t\tRenderState.stream.RiPatchV(\"bicubic\", ri_parameters);\n\t\t\t\t}\n\n\t\t\t\tRenderState.stream.RiAttributeEnd();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<teapot_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xcf54aa9b, 0x9c4e886c, 0xa8cf2fa2, 0x470d44ed),\n\t\t\t\"RenderManTeapotPainter\",\n\t\t\t_(\"Renders teapot primitives\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\n\tstatic const k3d::teapot::points_array_t& teapot_points;\n\tstatic const k3d::teapot::patches_array_t& teapot_patches;\n};\n\nconst k3d::teapot::points_array_t& teapot_painter::teapot_points = k3d::teapot::points();\nconst k3d::teapot::patches_array_t& teapot_painter::teapot_patches = k3d::teapot::patches();\n\n/////////////////////////////////////////////////////////////////////////////\n// teapot_painter_factory\n\nk3d::iplugin_factory& teapot_painter_factory()\n{\n\treturn teapot_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/renderman_painters/torus_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include \"array_helpers.h\"\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imesh_painter_ri.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_ri.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/torus.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace renderman\n{\n\nnamespace painters\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// torus_painter\n\nclass torus_painter :\n\tpublic k3d::node,\n\tpublic k3d::ri::imesh_painter\n{\n\ttypedef k3d::node base;\n\npublic:\n\ttorus_painter(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Mesh.primitives.begin(); primitive != Mesh.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::torus::const_primitive> torus(k3d::torus::validate(Mesh, **primitive));\n\t\t\tif(!torus)\n\t\t\t\tcontinue;\n\n\t\t\tfor(k3d::uint_t i = 0; i != torus->matrices.size(); ++i)\n\t\t\t{\n\t\t\t\tRenderState.stream.RiAttributeBegin();\n\t\t\t\tRenderState.stream.RiConcatTransform(k3d::ri::convert(torus->matrices[i]));\n\n\t\t\t\tk3d::ri::setup_material(torus->materials[i], RenderState);\n\n\t\t\t\tk3d::ri::parameter_list ri_parameters;\n\n\t\t\t\tarray_copier ri_constant_attributes;\n\t\t\t\tri_constant_attributes.add_arrays(torus->constant_attributes);\n\t\t\t\tri_constant_attributes.push_back(0);\n\t\t\t\tri_constant_attributes.copy_to(k3d::ri::CONSTANT, ri_parameters);\n\n\t\t\t\tarray_copier ri_uniform_attributes;\n\t\t\t\tri_uniform_attributes.add_arrays(torus->surface_attributes);\n\t\t\t\tri_uniform_attributes.push_back(i);\n\t\t\t\tri_uniform_attributes.copy_to(k3d::ri::UNIFORM, ri_parameters);\n\n\t\t\t\tarray_copier ri_varying_attributes;\n\t\t\t\tri_varying_attributes.add_arrays(torus->parameter_attributes);\n\t\t\t\tfor(k3d::uint_t j = 0; j != 4; ++j)\n\t\t\t\t\tri_varying_attributes.push_back((i * 4) + j);\n\t\t\t\tri_varying_attributes.copy_to(k3d::ri::VARYING, ri_parameters);\n\t\t\t\t\n\t\t\t\tRenderState.stream.RiTorusV(\n\t\t\t\t\ttorus->major_radii[i],\n\t\t\t\t\ttorus->minor_radii[i],\n\t\t\t\t\tk3d::degrees(torus->phi_min[i]),\n\t\t\t\t\tk3d::degrees(torus->phi_max[i]),\n\t\t\t\t\tk3d::degrees(torus->sweep_angles[i]),\n\t\t\t\t\tri_parameters);\n\n\t\t\t\tRenderState.stream.RiAttributeEnd();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid paint_complete(const k3d::mesh& Mesh, const k3d::ri::render_state& RenderState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<torus_painter, k3d::interface_list<k3d::ri::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xd3865bdb, 0x69469c71, 0x2cc55a8b, 0x420de184),\n\t\t\t\"RenderManTorusPainter\",\n\t\t\t_(\"Renders torus primitives\"),\n\t\t\t\"RenderMan Painter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// torus_painter_factory\n\nk3d::iplugin_factory& torus_painter_factory()\n{\n\treturn torus_painter::get_factory();\n}\n\n} // namespace painters\n\n} // namespace renderman\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/scripted_plugins/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-scripted-plugins)\nTARGET_LINK_LIBRARIES(k3d-scripted-plugins\n\t${Boost_REGEX_LIBRARY}\n\t)\n# We explicitly do-not create a module proxy for this module,\n# since it produces a dynamic list of plugins at runtime\n\n"
  },
  {
    "path": "modules/scripted_plugins/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/iapplication_plugin_factory.h>\n#include <k3dsdk/idocument_plugin_factory.h>\n#include <k3dsdk/interface_list.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/plugin_factory.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/share.h>\n#include <k3dsdk/system.h>\n\n#include <boost/regex.hpp>\n\n#include <sstream>\n\nnamespace module\n{\n\n/// Namespace reserved for the scripted_plugins plugin module, to protect public symbols from name clashes with other modules\nnamespace scripted_plugins\n{\n\n/// k3d::iapplication_plugin_factory implementation that creates a scripted plugin instance\nclass application_factory :\n\tpublic k3d::plugin_factory,\n\tpublic k3d::iapplication_plugin_factory\n{\npublic:\n\tapplication_factory(const k3d::filesystem::path& ScriptPath, const k3d::string_t& DelegateFactoryName, const k3d::uuid& FactoryID, const k3d::string_t& Name, const k3d::string_t& ShortDescription, const k3d::string_t& Categories, const quality_t Quality = STABLE, const metadata_t& Metadata = metadata_t()) :\n\t\tplugin_factory(FactoryID, Name, ShortDescription, Categories, Quality, Metadata),\n\t\tscript_path(ScriptPath),\n\t\tdelegate_factory_name(DelegateFactoryName),\n\t\tdelegate_factory(0)\n\t{\n\t}\n\n\tk3d::iunknown* create_plugin()\n\t{\n\t\tif(!delegate_factory)\n\t\t\tdelegate_factory = dynamic_cast<k3d::iapplication_plugin_factory*>(k3d::plugin::factory::lookup(delegate_factory_name));\n\n\t\tif(!delegate_factory)\n\t\t{\n\t\t\tk3d::log() << error << \"Couldn't locate delegate factory [\" << delegate_factory_name << \"]\" << std::endl;\n\t\t\treturn 0;\n\t\t}\n\n\t\tk3d::iunknown* const plugin = delegate_factory->create_plugin();\n\t\treturn_val_if_fail(plugin, 0);\n\n\t\tk3d::filesystem::ifstream script_file(script_path);\n\t\tstd::stringstream script_stream;\n\t\tscript_stream << script_file.rdbuf();\n\n\t\tk3d::property::set_internal_value(*plugin, \"script\", script_stream.str());\n\n\t\treturn plugin;\n\t}\n\n\tbool implements(const std::type_info& InterfaceType)\n\t{\n\t\treturn false;\n\t}\n\n\tconst interfaces_t interfaces()\n\t{\n\t\tinterfaces_t results;\n\t\treturn results;\n\t}\n\nprivate:\n\tconst k3d::filesystem::path script_path;\n\tconst k3d::string_t delegate_factory_name;\n\tk3d::iapplication_plugin_factory* delegate_factory;\n};\n\n/// k3d::idocument_plugin_factory implementation that creates a scripted document node\nclass document_factory :\n\tpublic k3d::plugin_factory,\n\tpublic k3d::idocument_plugin_factory\n{\npublic:\n\tdocument_factory(const k3d::filesystem::path& ScriptPath, const k3d::string_t& DelegateFactoryName, const k3d::uuid& FactoryID, const k3d::string_t& Name, const k3d::string_t& ShortDescription, const k3d::string_t& Categories, const quality_t Quality = STABLE, const metadata_t& Metadata = metadata_t()) :\n\t\tplugin_factory(FactoryID, Name, ShortDescription, Categories, Quality, Metadata),\n\t\tscript_path(ScriptPath),\n\t\tdelegate_factory_name(DelegateFactoryName),\n\t\tdelegate_factory(0)\n\t{\n\t}\n\n\tk3d::inode* create_plugin(k3d::iplugin_factory& Factory, k3d::idocument& Document)\n\t{\n\t\tif(&Factory != this)\n\t\t{\n\t\t\tk3d::log() << error << \"Cannot use factory [\" << name() << \"] from within a virtual plugin factory\" << std::endl;\n\t\t\treturn 0;\n\t\t}\n\n\t\tif(!delegate_factory)\n\t\t\tdelegate_factory = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(delegate_factory_name));\n\n\t\tif(!delegate_factory)\n\t\t{\n\t\t\tk3d::log() << error << \"Couldn't locate delegate factory [\" << delegate_factory_name << \"]\" << std::endl;\n\t\t\treturn 0;\n\t\t}\n\n\t\tk3d::inode* const node = delegate_factory->create_plugin(*dynamic_cast<k3d::iplugin_factory*>(delegate_factory), Document);\n\t\treturn_val_if_fail(node, 0);\n\n\t\tk3d::filesystem::ifstream script_file(script_path);\n\t\tstd::stringstream script_stream;\n\t\tscript_stream << script_file.rdbuf();\n\n\t\tk3d::property::set_internal_value(*node, \"script\", script_stream.str());\n\n\t\treturn node;\n\t}\n\n\tbool implements(const std::type_info& InterfaceType)\n\t{\n\t\treturn false;\n\t}\n\n\tconst interfaces_t interfaces()\n\t{\n\t\tinterfaces_t results;\n\t\treturn results;\n\t}\n\nprivate:\n\tconst k3d::filesystem::path script_path;\n\tconst k3d::string_t delegate_factory_name;\n\tk3d::idocument_plugin_factory* delegate_factory;\n};\n\n/// Creates plugin factories at runtime based on the contents of a directory\nvoid register_plugins(const k3d::filesystem::path& Path, k3d::iplugin_registry& Registry)\n{\n\tk3d::log() << info << \"Loading scripts from \" << Path.native_console_string() << std::endl;\n\n\tboost::regex metadata_expression(\"((k3d|ngui|qtui):[^=]*)=\\\"([^\\\"]*)\\\"\");\n\n\t// There are very few SDK functions that can be safely called at this point in execution, but k3d::share_path() happens to be one of them ...\n\tfor(k3d::filesystem::directory_iterator script_path(Path); script_path != k3d::filesystem::directory_iterator(); ++script_path)\n\t{\n\t\tif(k3d::filesystem::is_directory(*script_path))\n\t\t\tcontinue;\n\n\t\tk3d::filesystem::ifstream script_file(*script_path);\n\t\tstd::stringstream script_stream;\n\t\tscript_stream << script_file.rdbuf();\n\t\tk3d::string_t script = script_stream.str();\n\n\t\tk3d::string_t plugin_class;\n\t\tk3d::string_t plugin_type;\n\t\tk3d::string_t plugin_name;\n\t\tk3d::string_t plugin_description = _(\"Scripted Plugin.\");\n\t\tk3d::iplugin_factory::metadata_t plugin_metadata;\n\n\t\tfor(boost::sregex_iterator metadata(script.begin(), script.end(), metadata_expression); metadata != boost::sregex_iterator(); ++metadata)\n\t\t{\n\t\t\tconst k3d::string_t name = (*metadata)[1].str();\n\t\t\tconst k3d::string_t value = (*metadata)[3].str();\n\n\t\t\tif(name == \"k3d:plugin-class\")\n\t\t\t\tplugin_class = value;\n\t\t\telse if(name == \"k3d:plugin-type\")\n\t\t\t{\n\t\t\t\tplugin_type = value;\n\t\t\t\tplugin_metadata.insert(std::make_pair(name, value));\n\t\t\t}\n\t\t\telse if(name == \"k3d:plugin-name\")\n\t\t\t\tplugin_name = value;\n\t\t\telse if(name == \"k3d:plugin-description\")\n\t\t\t\tplugin_description = value;\n\t\t\telse\n\t\t\t\tplugin_metadata.insert(std::make_pair(name, value));\n\t\t}\n\n\t\t// Automatically disable documentation for all scripted plugins ...\n\t\tplugin_metadata.insert(std::make_pair(\"k3d:disable-documentation\", \"\"));\n\n\t\tif(plugin_class.empty())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(plugin_class != \"application\" && plugin_class != \"document\")\n\t\t{\n\t\t\tk3d::log() << error << \"Script [\" << script_path->native_console_string() << \"] using unknown plugin class [\" << plugin_class << \"] will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(plugin_type.empty())\n\t\t{\n\t\t\tk3d::log() << error << \"Script [\" << script_path->native_console_string() << \"] without k3d:plugin-type property will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(plugin_name.empty())\n\t\t{\n\t\t\tk3d::log() << error << \"Script [\" << script_path->native_console_string() << \"] without k3d:plugin-name property will not be loaded\" << std::endl;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(plugin_class == \"application\")\n\t\t{\n\t\t\tk3d::iplugin_factory* const factory = new application_factory(\n\t\t\t\t*script_path,\n\t\t\t\tplugin_type,\n\t\t\t\tk3d::uuid::random(),\n\t\t\t\tplugin_name,\n\t\t\t\tplugin_description,\n\t\t\t\t\"Scripts\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tplugin_metadata);\n\n\t\t\tRegistry.register_factory(*factory);\n\t\t}\n\t\telse if(plugin_class == \"document\")\n\t\t{\n\t\t\tk3d::iplugin_factory* const factory = new document_factory(\n\t\t\t\t*script_path,\n\t\t\t\tplugin_type,\n\t\t\t\tk3d::uuid::random(),\n\t\t\t\tplugin_name,\n\t\t\t\tplugin_description,\n\t\t\t\t\"Scripts\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tplugin_metadata);\n\n\t\t\tRegistry.register_factory(*factory);\n\t\t}\n\t}\n}\n\n/// Creates plugin factories at runtime\nvoid register_plugins(k3d::iplugin_registry& Registry)\n{\n\tregister_plugins(k3d::share_path() / k3d::filesystem::generic_path(\"scripts/scripted_plugins\"), Registry);\n\tregister_plugins(k3d::share_path() / k3d::filesystem::generic_path(\"qtui/scripted_modes\"), Registry);\n\tregister_plugins(k3d::system::get_home_directory() / k3d::filesystem::generic_path(\".k3d/scripted_plugins\"), Registry);\n}\n\n} // namespace scripted_plugins\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tmodule::scripted_plugins::register_plugins(Registry);\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/scripting/CMakeLists.txt",
    "content": "K3D_COMPILE_RESOURCE(RESOURCES action_script.py \"/module/scripting/action_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES bitmap_modifier_script.py \"/module/scripting/bitmap_modifier_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES bitmap_source_script.py \"/module/scripting/bitmap_source_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES color_source_script.py \"/module/scripting/color_source_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES meta_object_script.py \"/module/scripting/meta_object_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES double_source_script.py \"/module/scripting/double_source_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES int32_source_script.py \"/module/scripting/int32_source_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES matrix_modifier_script.py \"/module/scripting/matrix_modifier_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES matrix_source_script.py \"/module/scripting/matrix_source_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES mesh_modifier_script.py \"/module/scripting/mesh_modifier_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES mesh_source_script.py \"/module/scripting/mesh_source_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES null_output_script.py \"/module/scripting/null_output_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES opengl_painter_script.py \"/module/scripting/opengl_painter_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES opengl_renderable_script.py \"/module/scripting/opengl_renderable_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES render_engine_script.py \"/module/scripting/render_engine_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES string_source_script.py \"/module/scripting/string_source_script.py\")\nK3D_COMPILE_RESOURCE(RESOURCES vector3_source_script.py \"/module/scripting/vector3_source_script.py\")\n\nK3D_BUILD_MODULE(k3d-scripting EXTRA_SOURCES ${RESOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-scripting)\nTARGET_LINK_LIBRARIES(k3d-scripting k3dsdk-resource)\n\n"
  },
  {
    "path": "modules/scripting/action_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/iscripted_action.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_plugin.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// action_script\n\nclass action_script :\n\tpublic k3d::scripted_plugin<k3d::property_collection>,\n\tpublic k3d::iscripted_action\n{\npublic:\n\taction_script()\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/action_script.py\"));\n\t}\n\n\tk3d::bool_t execute(k3d::iscript_engine::context& Context)\n\t{\n\t\treturn execute_script(Context);\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<action_script > factory(\n\t\t\tk3d::uuid(0x479bc86c, 0xe4428a92, 0x9fabc692, 0xad655ebb),\n\t\t\t\"ActionScript\",\n\t\t\t_(\"Executes a script on-demand\"),\n\t\t\t\"Script\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// action_script_factory\n\nk3d::iplugin_factory& action_script_factory()\n{\n\treturn action_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/scripting/action_script.py",
    "content": "#python\n\n"
  },
  {
    "path": "modules/scripting/bitmap_modifier_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_modifier.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_modifier_script\n\nclass bitmap_modifier_script :\n\tpublic k3d::scripted_node<k3d::node >,\n\tpublic k3d::bitmap_modifier<bitmap_modifier_script>\n{\n\ttypedef k3d::scripted_node<k3d::node > base;\n\npublic:\n\tbitmap_modifier_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/bitmap_modifier_script.py\"));\n\n\t\tconnect_script_changed_signal(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_bitmap_slot()));\n\t}\n\n\tvoid on_resize_bitmap(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"input\"] = &Input;\n\t\tcontext[\"output\"] = &Output;\n\n\t\texecute_script(context);\n\t}\n\n\tvoid on_assign_pixels(const k3d::bitmap& Input, k3d::bitmap& Output)\n\t{\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bitmap_modifier_script,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink, k3d::interface_list<k3d::ibitmap_source> > > factory(\n\t\t\tk3d::uuid(0xe6ca5ca4, 0xcfa8452f, 0x8318b2aa, 0xe253956e),\n\t\t\t\"BitmapModifierScript\",\n\t\t\t_(\"Bitmap modifier that uses a script to modify an input bitmap\"),\n\t\t\t\"Script Bitmap\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_modifier_script_factory\n\nk3d::iplugin_factory& bitmap_modifier_script_factory()\n{\n\treturn bitmap_modifier_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n\n"
  },
  {
    "path": "modules/scripting/bitmap_modifier_script.py",
    "content": "#python\n\nimport k3d\n\ncontext.output.assign(context.input)\n\n\n"
  },
  {
    "path": "modules/scripting/bitmap_source_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_source.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_source_script\n\nclass bitmap_source_script :\n\tpublic k3d::scripted_node<k3d::node >,\n\tpublic k3d::bitmap_source<bitmap_source_script>\n{\n\ttypedef k3d::scripted_node<k3d::node > base;\n\npublic:\n\tbitmap_source_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/bitmap_source_script.py\"));\n\n\t\tconnect_script_changed_signal(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_bitmap_slot()));\n\t}\n\n\tvoid on_resize_bitmap(k3d::bitmap& Output)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"output\"] = &Output;\n\n\t\texecute_script(context);\n\t}\n\n\tvoid on_assign_pixels(k3d::bitmap& Output)\n\t{\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bitmap_source_script, k3d::interface_list<k3d::ibitmap_source> > factory(\n\t\t\tk3d::uuid(0x98f6e0b6, 0x8423400b, 0xa5ae9144, 0x50e1c3cd),\n\t\t\t\"BitmapSourceScript\",\n\t\t\t_(\"Bitmap source that uses a script to generate images\"),\n\t\t\t\"Script Bitmap\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_source_script_factory\n\nk3d::iplugin_factory& bitmap_source_script_factory()\n{\n\treturn bitmap_source_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n\n"
  },
  {
    "path": "modules/scripting/bitmap_source_script.py",
    "content": "#python\n\nimport k3d\n\ncontext.output.reset(64, 64)\n\nfor x in range(64):\n\tfor y in range(64):\n\t\tif x < 32:\n\t\t\tif y < 32:\n\t\t\t\tcontext.output.set_pixel(x, y, (1, 0, 0, 1))\n\t\t\telse:\n\t\t\t\tcontext.output.set_pixel(x, y, (0, 0, 1, 1))\n\t\telse:\n\t\t\tif y < 32:\n\t\t\t\tcontext.output.set_pixel(x, y, (0, 1, 0, 1))\n\t\t\telse:\n\t\t\t\tcontext.output.set_pixel(x, y, (1, 1, 1, 1))\n\n"
  },
  {
    "path": "modules/scripting/color_source_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color_source.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n#include <k3dsdk/type_registry.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// color_source_script\n\nclass color_source_script :\n\tpublic k3d::scripted_node<k3d::node >,\n\tpublic k3d::color_source<color_source_script>\n{\n\ttypedef k3d::scripted_node<k3d::node > base;\n\npublic:\n\tcolor_source_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/color_source_script.py\"));\n\n\t\tconnect_script_changed_signal(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_color_slot()));\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory< color_source_script, k3d::interface_list<k3d::icolor_source> > factory(\n\t\t\tk3d::uuid(0x24568302, 0x346e4e58, 0xbb700f09, 0x5dc96245),\n\t\t\t\"ColorSourceScript\",\n\t\t\t_(\"Color source that uses a script to create the output value\"),\n\t\t\t\"Script Color\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_update_color(k3d::color& Output)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"output\"] = k3d::color(1, 1, 1);\n\n\t\texecute_script(context);\n\n\t\tif(context[\"output\"].type() == typeid(k3d::color))\n\t\t{\n\t\t\tOutput = boost::any_cast<k3d::color>(context[\"output\"]);\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::log() << error << \"unsupported output type: \" << k3d::demangle(context[\"output\"].type()) << std::endl;\n\t\tOutput = k3d::color(1, 1, 1);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// color_source_script_factory\n\nk3d::iplugin_factory& color_source_script_factory()\n{\n\treturn color_source_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/scripting/color_source_script.py",
    "content": "#python\n\nimport k3d\n\ncontext.output = k3d.color(1, 0.5, 0.25)\n\n"
  },
  {
    "path": "modules/scripting/double_source_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/double_source.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n#include <k3dsdk/type_registry.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// double_source_script\n\nclass double_source_script :\n\tpublic k3d::scripted_node<k3d::node >,\n\tpublic k3d::double_source<double_source_script>\n{\n\ttypedef k3d::scripted_node<k3d::node > base;\n\npublic:\n\tdouble_source_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/double_source_script.py\"));\n\n\t\tconnect_script_changed_signal(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_double_slot()));\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<double_source_script, k3d::interface_list<k3d::idouble_source> > factory(\n\t\t\tk3d::uuid(0xed110740, 0x7c2e4215, 0xbc8a4c1a, 0x3c1736ba),\n\t\t\t\"DoubleSourceScript\",\n\t\t\t_(\"Data source that uses a script to create a k3d::double_t output value\"),\n\t\t\t\"Script Double\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_update_double(k3d::double_t& Output)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"output\"] = 0.0;\n\n\t\texecute_script(context);\n\n\t\tif(context[\"output\"].type() == typeid(k3d::double_t))\n\t\t{\n\t\t\tOutput = boost::any_cast<k3d::double_t>(context[\"output\"]);\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::log() << error << \"unsupported output type: \" << k3d::demangle(context[\"output\"].type()) << std::endl;\n\t\tOutput = 0.0;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// double_source_script_factory\n\nk3d::iplugin_factory& double_source_script_factory()\n{\n\treturn double_source_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/scripting/double_source_script.py",
    "content": "#python\n\ncontext.output = 1.0\n\n"
  },
  {
    "path": "modules/scripting/int32_source_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/int32_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n#include <k3dsdk/type_registry.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// int32_source_script\n\nclass int32_source_script :\n\tpublic k3d::scripted_node<k3d::node >,\n\tpublic k3d::int32_source<int32_source_script>\n{\n\ttypedef k3d::scripted_node<k3d::node > base;\n\npublic:\n\tint32_source_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/int32_source_script.py\"));\n\n\t\tconnect_script_changed_signal(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_int32_slot()));\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<int32_source_script, k3d::interface_list<k3d::iint32_source> > factory(\n\t\t\tk3d::uuid(0x024b737a, 0xdf144dca, 0xb29e32b4, 0x319e5466),\n\t\t\t\"Int32SourceScript\",\n\t\t\t_(\"Uses a script to generate an output k3d::int32_t value.\"),\n\t\t\t\"Script\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_update_int32(k3d::int32_t& Output)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"output\"] = 0;\n\n\t\texecute_script(context);\n\n\t\tif(context[\"output\"].type() == typeid(k3d::int32_t))\n\t\t{\n\t\t\tOutput = boost::any_cast<k3d::int32_t>(context[\"output\"]);\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::log() << error << \"unsupported output type: \" << k3d::demangle(context[\"output\"].type()) << std::endl;\n\t\tOutput = 0;\n\t}\n\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// int32_source_script_factory\n\nk3d::iplugin_factory& int32_source_script_factory()\n{\n\treturn int32_source_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/scripting/int32_source_script.py",
    "content": "#python\n\ncontext.output = 1\n\n"
  },
  {
    "path": "modules/scripting/matrix_modifier_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n#include <k3dsdk/transformable.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// matrix_modifier_script\n\nclass matrix_modifier_script :\n\tpublic k3d::scripted_node<k3d::transformable<k3d::node > >\n{\n\ttypedef k3d::scripted_node<k3d::transformable<k3d::node > > base;\n\npublic:\n\tmatrix_modifier_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/matrix_modifier_script.py\"));\n\t\t\n\t\tconnect_script_changed_signal(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<matrix_modifier_script,\n\t\t\tk3d::interface_list<k3d::imatrix_sink, k3d::interface_list<k3d::imatrix_source> > > factory(\n\t\t\tk3d::uuid(0xacafcc85, 0xa0bf4d69, 0x99592c4f, 0x7cf9b35c),\n\t\t\t\"MatrixModifierScript\",\n\t\t\t_(\"Matrix modifier that uses a script to modify a transformation matrix\"),\n\t\t\t\"Script Matrix\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_update_matrix(const k3d::matrix4& Input, k3d::matrix4& Output)\n\t{\t\t\n\t\t// Create a new output matrix, ready for modification by the script ...\n\t\tOutput = Input;\n\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"input\"] = Input;\n\t\tcontext[\"output\"] = Output;\n\n\t\texecute_script(context);\n\n\t\treturn_if_fail(context[\"output\"].type() == typeid(k3d::matrix4));\n\t\tOutput = boost::any_cast<k3d::matrix4>(context[\"output\"]);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// matrix_modifier_script_factory\n\nk3d::iplugin_factory& matrix_modifier_script_factory()\n{\n\treturn matrix_modifier_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/scripting/matrix_modifier_script.py",
    "content": "#python\n\ncontext.output = context.input\n\n"
  },
  {
    "path": "modules/scripting/matrix_source_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n#include <k3dsdk/matrix_source.h>\n#include <k3dsdk/type_registry.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// matrix_source_script\n\nclass matrix_source_script :\n\tpublic k3d::scripted_node<k3d::matrix_source<k3d::node > >\n{\n\ttypedef k3d::scripted_node<k3d::matrix_source<k3d::node > > base;\n\npublic:\n\tmatrix_source_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/matrix_source_script.py\"));\n\n\t\tconnect_script_changed_signal(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_matrix_slot()));\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<matrix_source_script, k3d::interface_list<k3d::imatrix_source> > factory(\n\t\t\tk3d::uuid(0x59da7a41, 0xe08c4704, 0xbf75055f, 0x043628cc),\n\t\t\t\"MatrixSourceScript\",\n\t\t\t_(\"Matrix source that uses a script to create the output value\"),\n\t\t\t\"Script Matrix\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_update_matrix(k3d::matrix4& Output)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"output\"] = k3d::identity3();\n\n\t\texecute_script(context);\n\n\t\tif(context[\"output\"].type() == typeid(k3d::matrix4))\n\t\t{\n\t\t\tOutput = boost::any_cast<k3d::matrix4>(context[\"output\"]);\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::log() << error << \"unsupported output type: \" << k3d::demangle(context[\"output\"].type()) << std::endl;\n\t\tOutput = k3d::identity3();\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// matrix_source_script_factory\n\nk3d::iplugin_factory& matrix_source_script_factory()\n{\n\treturn matrix_source_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/scripting/matrix_source_script.py",
    "content": "#python\n\nimport k3d\n\ncontext.output = k3d.identity3()\n\n"
  },
  {
    "path": "modules/scripting/mesh_modifier_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_modifier_script\n\nclass mesh_modifier_script :\n\tpublic k3d::scripted_node<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::scripted_node<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tmesh_modifier_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/mesh_modifier_script.py\"));\n\n\t\tconnect_script_changed_signal(make_reset_mesh_slot());\n\t}\n\n\t/** \\todo Improve the implementation so we don't have to do this */\n\tk3d::iunknown* on_rewrite_hint(iunknown* const Hint)\n\t{\n\t\t// Force updates to re-allocate our mesh, for simplicity\n\t\treturn 0;\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"input\"] = &Input;\n\t\tcontext[\"output\"] = &Output;\n\n\t\texecute_script(context);\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_modifier_script,\n\t\t\tk3d::interface_list<k3d::imesh_sink, k3d::interface_list<k3d::imesh_source> > > factory(\n\t\t\tk3d::uuid(0xd51fe8e4, 0x5aad4790, 0x82957933, 0xb22c1c1c),\n\t\t\t\"MeshModifierScript\",\n\t\t\t_(\"Mesh modifier that uses a script to modify geometry\"),\n\t\t\t\"Mesh Script\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_modifier_script_factory\n\nk3d::iplugin_factory& mesh_modifier_script_factory()\n{\n\treturn mesh_modifier_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/scripting/mesh_modifier_script.py",
    "content": "#python\n\nimport k3d\n\ncontext.output.copy(context.input)\n\nscale = 1.5\n\ninput_points = context.input.points()\noutput_points = context.output.points()\n\nfor i in range(len(output_points)):\n\toutput_points[i] = input_points[i] * scale\n\n"
  },
  {
    "path": "modules/scripting/mesh_source_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_source_script\n\nclass mesh_source_script :\n\tpublic k3d::scripted_node<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::scripted_node<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tmesh_source_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/mesh_source_script.py\"));\n\n\t\tconnect_script_changed_signal(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"output\"] = &Output;\n\n\t\texecute_script(context);\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_source_script, k3d::interface_list<k3d::imesh_source> > factory(\n\t\t\tk3d::uuid(0xc68d0187, 0xbb334026, 0xb4ca6a9f, 0x0d980cc9),\n\t\t\t\"MeshSourceScript\",\n\t\t\t_(\"Mesh source that uses a script to create geometry\"),\n\t\t\t\"Script Mesh\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_source_script_factory\n\nk3d::iplugin_factory& mesh_source_script_factory()\n{\n\treturn mesh_source_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/scripting/mesh_source_script.py",
    "content": "#python\n\nimport k3d\n\npositions = [(-5, -5, 0), (5, -5, 0), (5, 5, 0), (-5, 5, 0)]\n\npoints = context.output.create_points()\npoint_selection = context.output.create_point_selection()\nfor position in positions:\n\tpoints.append(k3d.point3(position[0], position[1], position[2]))\n\tpoint_selection.append(0.0)\n\npolyhedron = k3d.polyhedron.create(context.output)\npolyhedron.shell_types().append(k3d.polyhedron.shell_type.POLYGONS)\npolyhedron.face_shells().append(0)\npolyhedron.face_first_loops().append(0)\npolyhedron.face_loop_counts().append(1)\npolyhedron.face_materials().append(None)\npolyhedron.face_selections().append(0.0)\npolyhedron.loop_first_edges().append(0)\npolyhedron.clockwise_edges().assign([1, 2, 3, 0])\npolyhedron.edge_selections().assign([0, 0, 0, 0])\npolyhedron.vertex_points().assign([0, 1, 2, 3])\npolyhedron.vertex_selections().assign([0, 0, 0, 0])\n\n"
  },
  {
    "path": "modules/scripting/meta_object_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/imeta_object.h>\n#include <k3dsdk/property_collection.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_plugin.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// meta_object_script\n\nclass meta_object_script :\n\tpublic k3d::scripted_plugin<k3d::property_collection>,\n\tpublic k3d::imeta_object\n{\npublic:\n\tmeta_object_script()\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/meta_object_script.py\"));\n\t}\n\n\tvirtual const boost::any execute(const k3d::string_t& Command, const std::vector<boost::any>& Arguments)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"command\"] = Command;\n//\t\tcontext[\"arguments\"] = Arguments;\n\t\texecute_script(context);\n\n\t\treturn boost::any();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<meta_object_script > factory(\n\t\t\tk3d::uuid(0xb754daf5, 0x3a401b87, 0xdd144ba2, 0x00395dde),\n\t\t\t\"MetaObjectScript\",\n\t\t\t_(\"Scripted node that acts as a meta-object (provides dynamic runtime execution of arbitrary commands).\"),\n\t\t\t\"Script\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// meta_object_script_factory\n\nk3d::iplugin_factory& meta_object_script_factory()\n{\n\treturn meta_object_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/scripting/meta_object_script.py",
    "content": "#python\n\nprint \"command: \" + context.command\n#print \"arguments: \" + context.arguments\n\n"
  },
  {
    "path": "modules/scripting/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the scripting plugin module, to protect public symbols from name clashes with other modules\nnamespace scripting\n{\n\nextern k3d::iplugin_factory& action_script_factory();\nextern k3d::iplugin_factory& bitmap_modifier_script_factory();\nextern k3d::iplugin_factory& bitmap_source_script_factory();\nextern k3d::iplugin_factory& color_source_script_factory();\nextern k3d::iplugin_factory& meta_object_script_factory();\nextern k3d::iplugin_factory& double_source_script_factory();\nextern k3d::iplugin_factory& int32_source_script_factory();\nextern k3d::iplugin_factory& matrix_modifier_script_factory();\nextern k3d::iplugin_factory& matrix_source_script_factory();\nextern k3d::iplugin_factory& mesh_modifier_script_factory();\nextern k3d::iplugin_factory& mesh_source_script_factory();\nextern k3d::iplugin_factory& null_output_script_factory();\nextern k3d::iplugin_factory& opengl_painter_script_factory();\nextern k3d::iplugin_factory& opengl_renderable_script_factory();\nextern k3d::iplugin_factory& render_engine_script_factory();\nextern k3d::iplugin_factory& string_source_script_factory();\nextern k3d::iplugin_factory& vector3_source_script_factory();\n\n} // namespace scripting\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::scripting::action_script_factory());\n\tRegistry.register_factory(module::scripting::bitmap_modifier_script_factory());\n\tRegistry.register_factory(module::scripting::bitmap_source_script_factory());\n\tRegistry.register_factory(module::scripting::color_source_script_factory());\n\tRegistry.register_factory(module::scripting::meta_object_script_factory());\n\tRegistry.register_factory(module::scripting::double_source_script_factory());\n\tRegistry.register_factory(module::scripting::int32_source_script_factory());\n\tRegistry.register_factory(module::scripting::matrix_modifier_script_factory());\n\tRegistry.register_factory(module::scripting::matrix_source_script_factory());\n\tRegistry.register_factory(module::scripting::mesh_modifier_script_factory());\n\tRegistry.register_factory(module::scripting::mesh_source_script_factory());\n\tRegistry.register_factory(module::scripting::null_output_script_factory());\n\tRegistry.register_factory(module::scripting::opengl_painter_script_factory());\n\tRegistry.register_factory(module::scripting::opengl_renderable_script_factory());\n\tRegistry.register_factory(module::scripting::render_engine_script_factory());\n\tRegistry.register_factory(module::scripting::string_source_script_factory());\n\tRegistry.register_factory(module::scripting::vector3_source_script_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/scripting/null_output_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// null_output_script\n\nclass null_output_script :\n\tpublic k3d::scripted_node<k3d::node >\n{\n\ttypedef k3d::scripted_node<k3d::node > base;\n\npublic:\n\tnull_output_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/null_output_script.py\"));\n\n\t\tconnect_script_changed_signal(sigc::mem_fun(*this, &null_output_script::on_execute));\n\t}\n\n\tvoid on_execute(k3d::iunknown*)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\n\t\texecute_script(context);\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<null_output_script > factory(\n\t\t\tk3d::uuid(0x16b6b2f1, 0x383d4d2c, 0x9bea5eb3, 0x94a8783f),\n\t\t\t\"NullOutputScript\",\n\t\t\t_(\"Script node that executes whenever one of its inputs changes\"),\n\t\t\t\"Script\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// null_output_script_factory\n\nk3d::iplugin_factory& null_output_script_factory()\n{\n\treturn null_output_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/scripting/null_output_script.py",
    "content": "#python\n\n\n"
  },
  {
    "path": "modules/scripting/opengl_painter_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n#include <k3dsdk/selection.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// opengl_painter_script\n\nclass opengl_painter_script :\n\tpublic k3d::scripted_node<k3d::node >,\n\tpublic k3d::gl::imesh_painter\n{\n\ttypedef k3d::scripted_node<k3d::node > base;\n\npublic:\n\topengl_painter_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/opengl_painter_script.py\"));\n\t}\n\n\tvoid paint_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"mesh\"] = &Mesh;\n\t\tcontext[\"paint\"] = true;\n\t\tcontext[\"select\"] = false;\n\t\texecute_script(context);\n\t}\n\n\tvoid select_mesh(const k3d::mesh& Mesh, const k3d::gl::painter_render_state& RenderState, const k3d::gl::painter_selection_state& SelectionState, k3d::iproperty::changed_signal_t& ChangedSignal)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"mesh\"] = &Mesh;\n\t\tcontext[\"paint\"] = false;\n\t\tcontext[\"select\"] = true;\n\t\texecute_script(context);\n\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tvoid mesh_changed(const k3d::mesh& Mesh, k3d::ihint* Hint)\n\t{\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<opengl_painter_script,\n\t\t\tk3d::interface_list<k3d::gl::imesh_painter > > factory(\n\t\t\tk3d::uuid(0xd841c417, 0x889a44d7, 0x8fe520eb, 0xf26dc650),\n\t\t\t\"OpenGLPainterScript\",\n\t\t\t_(\"Scripted Mesh Painter\"),\n\t\t\t\"OpenGL Painter Script\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// opengl_painter_script_factory\n\nk3d::iplugin_factory& opengl_painter_script_factory()\n{\n\treturn opengl_painter_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/scripting/opengl_painter_script.py",
    "content": "#python\nfrom OpenGL.GL import *\n\nglPushAttrib(GL_ALL_ATTRIB_BITS)\nglDisable(GL_LIGHTING)\nglPointSize(5)\nglColor3d(0, 0, 1)\n\nglBegin(GL_POINTS)\nfor point in context.mesh.points():\n\tglVertex3d(point[0], point[1], point[2])\nglEnd()\n\nglPopAttrib()\n\n"
  },
  {
    "path": "modules/scripting/opengl_renderable_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transformable.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// opengl_renderable_script\n\nclass opengl_renderable_script :\n\tpublic k3d::scripted_node<k3d::gl::renderable<k3d::transformable<k3d::node > > >\n{\n\ttypedef k3d::scripted_node<k3d::gl::renderable<k3d::transformable<k3d::node > > > base;\n\npublic:\n\topengl_renderable_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/opengl_renderable_script.py\"));\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"draw\"] = true;\n\t\tcontext[\"select\"] = false;\n\t\texecute_script(context);\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"draw\"] = false;\n\t\tcontext[\"select\"] = true;\n\t\texecute_script(context);\n\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<opengl_renderable_script,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\tk3d::uuid(0xd57c84cc, 0xa9474b12, 0xa344763c, 0x8f4e7c8e),\n\t\t\t\"OpenGLRenderableScript\",\n\t\t\t_(\"Scriped node that can do arbitrary rendering using OpenGL.\"),\n\t\t\t\"OpenGL Script\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// opengl_renderable_script_factory\n\nk3d::iplugin_factory& opengl_renderable_script_factory()\n{\n\treturn opengl_renderable_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/scripting/opengl_renderable_script.py",
    "content": "#python\n\ntry:\n  from OpenGL.GL import *\n\n  glDisable(GL_LIGHTING)\n  glColor3f(1, 1, 0)\n  glBegin(GL_POLYGON)\n  glVertex3f(-1, -1, 0)\n  glVertex3f(1, -1, 0)\n  glVertex3f(1, 1, 0)\n  glVertex3f(-1, 1, 0)\n  glEnd()\n\nexcept:\n  print \"Couldn't load OpenGL module\"\n\n"
  },
  {
    "path": "modules/scripting/render_engine_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/irender_frame.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// render_engine_script\\n\\\n\nclass render_engine_script :\n\tpublic k3d::scripted_node<k3d::node >,\n\tpublic k3d::inode_collection_sink,\n\tpublic k3d::irender_frame\n{\n\ttypedef k3d::scripted_node<k3d::node > base;\n\npublic:\n\trender_engine_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_visible_nodes(init_owner(*this) + init_name(\"visible_nodes\") + init_label(_(\"Visible Nodes\")) + init_description(_(\"Visible Nodes\")) + init_value(std::vector<k3d::inode*>()))\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/render_engine_script.py\"));\n\t}\n\n\tconst k3d::inode_collection_sink::properties_t node_collection_properties()\n\t{\n\t\treturn k3d::inode_collection_sink::properties_t(1, &m_visible_nodes);\n\t}\n\n\tbool render_frame(const k3d::filesystem::path& OutputImage, const bool ViewImage)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"visible_nodes\"] = m_visible_nodes.property_internal_value();\n\t\tcontext[\"output_image\"] = OutputImage;\n\t\tcontext[\"view_image\"] = ViewImage;\n\n\t\texecute_script(context);\n\n\t\treturn true;\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<render_engine_script > factory(\n\t\t\tk3d::uuid(0x1f85ec59, 0xb348e0d0, 0x6381b4a6, 0x938947f0),\n\t\t\t\"RenderEngineScript\",\n\t\t\t_(\"Script node that acts as a render engine\"),\n\t\t\t\"Script\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::inode_collection_property::nodes_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, node_collection_serialization) m_visible_nodes;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// render_engine_script_factory\n\nk3d::iplugin_factory& render_engine_script_factory()\n{\n\treturn render_engine_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/scripting/render_engine_script.py",
    "content": "#python\n# Sample RenderEngineScript input\n#\n# Use the following context variables for rendering:\n#\n# \"context.document\" - a reference to the owning document.\n# \"context.node\" - a reference to the owning node.\n# \"context.visible_nodes\" - the collection of nodes that should be\n#                           rendered, if possible.\n# \"context.output_image\" - path to the user-selected output file.\n# \"context.view_image\" - boolean indicating whether the output should\n#                        be displayed after rendering is complete.\n\n# This trivial example \"renders\" the document by writing\n# the name of each visible node to a text file.  The set of\n# visible nodes is chosen by the user at runtime via the\n# \"Visible Nodes\" property.\n\nimport k3d\n\nk3d.check_node_environment(locals(), \"RenderEngineScript\")\n\noutput = open(str(context.output_image), \"w\")\n\nfor node in context.visible_nodes:\n\toutput.write(node.name + \"\\n\")\n\noutput.close()\n\n"
  },
  {
    "path": "modules/scripting/string_source_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n#include <k3dsdk/string_source.h>\n#include <k3dsdk/type_registry.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// string_source_script\n\nclass string_source_script :\n\tpublic k3d::scripted_node<k3d::node >,\n\tpublic k3d::string_source<string_source_script>\n{\n\ttypedef k3d::scripted_node<k3d::node > base;\n\npublic:\n\tstring_source_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/string_source_script.py\"));\n\n\t\tconnect_script_changed_signal(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_string_slot()));\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<string_source_script, k3d::interface_list<k3d::istring_source> > factory(\n\t\t\tk3d::uuid(0x44a411be, 0x60a24d0d, 0x9b9c7d8b, 0xb050835b),\n\t\t\t\"StringSourceScript\",\n\t\t\t_(\"String source that uses a script to create the output value\"),\n\t\t\t\"Script String\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_update_string(k3d::string_t& Output)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"output\"] = std::string(\"\");\n\n\t\texecute_script(context);\n\n\t\tif(context[\"output\"].type() == typeid(k3d::string_t))\n\t\t{\n\t\t\tOutput = boost::any_cast<k3d::string_t>(context[\"output\"]);\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::log() << error << \"unsupported output type: \" << k3d::demangle(context[\"output\"].type()) << std::endl;\n\t\tOutput = k3d::string_t(\"\");\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// string_source_script_factory\n\nk3d::iplugin_factory& string_source_script_factory()\n{\n\treturn string_source_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/scripting/string_source_script.py",
    "content": "#python\n\ncontext.output = \"K-3D\"\n\n"
  },
  {
    "path": "modules/scripting/vector3_source_script.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/resource/resource.h>\n#include <k3dsdk/scripted_node.h>\n#include <k3dsdk/vector3_source.h>\n#include <k3dsdk/type_registry.h>\n\nnamespace module\n{\n\nnamespace scripting\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// vector3_source_script\n\nclass vector3_source_script :\n\tpublic k3d::scripted_node<k3d::node >,\n\tpublic k3d::vector3_source<vector3_source_script>\n{\n\ttypedef k3d::scripted_node<k3d::node > base;\n\npublic:\n\tvector3_source_script(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tset_script(k3d::resource::get_string(\"/module/scripting/vector3_source_script.py\"));\n\n\t\tconnect_script_changed_signal(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_vector3_slot()));\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<vector3_source_script, k3d::interface_list<k3d::ivector3_source> > factory(\n\t\t\tk3d::uuid(0xa4535c6e, 0xe19f4d7d, 0x8af30edb, 0x6e194f78),\n\t\t\t\"Vector3SourceScript\",\n\t\t\t_(\"Vector3 source that uses a script to create the output value\"),\n\t\t\t\"Script\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid on_update_vector3(k3d::vector3& Output)\n\t{\n\t\tk3d::iscript_engine::context context;\n\t\tcontext[\"document\"] = &document();\n\t\tcontext[\"node\"] = static_cast<k3d::inode*>(this);\n\t\tcontext[\"output\"] = k3d::vector3(0, 0, 0);\n\n\t\texecute_script(context);\n\n\t\tif(context[\"output\"].type() == typeid(k3d::vector3))\n\t\t{\n\t\t\tOutput = boost::any_cast<k3d::vector3>(context[\"output\"]);\n\t\t\treturn;\n\t\t}\n\n\t\tk3d::log() << error << \"unsupported output type: \" << k3d::demangle(context[\"output\"].type()) << std::endl;\n\t\tOutput = k3d::vector3(0, 0, 0);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// vector3_source_script_factory\n\nk3d::iplugin_factory& vector3_source_script_factory()\n{\n\treturn vector3_source_script::get_factory();\n}\n\n} // namespace scripting\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/scripting/vector3_source_script.py",
    "content": "#python\n\nimport k3d\n\ncontext.output = k3d.vector3(1, 2, 3)\n\n"
  },
  {
    "path": "modules/selection/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-selection)\nK3D_CREATE_MODULE_PROXY(k3d-selection)\n\n"
  },
  {
    "path": "modules/selection/face_to_point_selections.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// face_to_point_selections\n\nclass face_to_point_selections :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tface_to_point_selections(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_keep_point_selection(init_owner(*this) + init_name(\"keep_point_selection\") + init_label(_(\"Keep Point Selection\")) + init_description(_(\"Keep the original point selection, just adding points of selected faces.\")) + init_value(false)),\n\t\tm_keep_face_selection(init_owner(*this) + init_name(\"keep_face_selection\") + init_label(_(\"Keep Face Selection\")) + init_description(_(\"Keep the original face selection.\")) + init_value(false))\n\t{\n\t\tm_keep_point_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\n\t\tm_keep_face_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\t\tif(!m_keep_point_selection.pipeline_value())\n\t\t\tpoint_selection.assign(point_selection.size(), 0.0);\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tif((*primitive)->type != \"polyhedron\")\n\t\t\t\tcontinue;\n\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = polyhedron->face_selections.size();\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tif(!polyhedron->face_selections[face])\n\t\t\t\t\tcontinue;\n\t\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\tconst k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t\t{\n\t\t\t\t\t\tpoint_selection[polyhedron->vertex_points[edge]] = polyhedron->face_selections[face];\n\n\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!m_keep_face_selection.pipeline_value())\n\t\t\t\tpolyhedron->face_selections.assign(face_end, 0.0);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<face_to_point_selections,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0x7a01c414, 0x834071c5, 0xae544194, 0x2861defc),\n\t\t\t\t\"FaceToPointSelections\",\n\t\t\t\t_(\"Selects the points belonging to selected faces\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_keep_point_selection;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_keep_face_selection;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// face_to_point_selections_factory\n\nk3d::iplugin_factory& face_to_point_selections_factory()\n{\n\treturn face_to_point_selections::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/grow_selection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/vectors.h>\n\n#include <list>\n#include <set>\n\nnamespace module\n{\n\nnamespace selection\n{\n\nnamespace detail\n{\n\n// Selects all edges adjacent to the given point\nvoid select_adjacent_edges(k3d::mesh::selection_t& OutputEdgeSelections, const k3d::mesh::indices_t& PointEdges, const k3d::mesh::indices_t& PointFirstEdges, const k3d::mesh::counts_t& PointEdgeCounts, const k3d::uint_t Point, const k3d::double_t EdgeSelection)\n{\n\tconst k3d::uint_t first_idx = PointFirstEdges[Point];\n\tconst k3d::uint_t last_idx = first_idx + PointEdgeCounts[Point];\n\tfor(k3d::uint_t i = first_idx; i != last_idx; ++i)\n\t{\n\t\tconst k3d::uint_t point_edge = PointEdges[i];\n\t\tOutputEdgeSelections[point_edge] = EdgeSelection;\n\t}\n}\n\nvoid select_adjacent_points(k3d::mesh::selection_t& PointSelections, const k3d::mesh::indices_t& ClockwiseEdges, const k3d::mesh::indices_t& EdgePoints, const k3d::mesh::indices_t& PointEdges, const k3d::mesh::indices_t& PointFirstEdges, const k3d::mesh::counts_t& PointEdgeCounts, const k3d::uint_t Point, const k3d::double_t PointSelection)\n{\n\tconst k3d::uint_t first_idx = PointFirstEdges[Point];\n\tconst k3d::uint_t last_idx = first_idx + PointEdgeCounts[Point];\n\tfor(k3d::uint_t i = first_idx; i != last_idx; ++i)\n\t{\n\t\tconst k3d::uint_t edge = PointEdges[i];\n\t\tPointSelections[EdgePoints[ClockwiseEdges[edge]]] = PointSelection;\n\t\tPointSelections[EdgePoints[edge]] = PointSelection;\n\t}\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// grow_selection\n\nclass grow_selection :\n\tpublic k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node > > base;\n\npublic:\n\tgrow_selection(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output); // Merges the current document selection with the mesh\n\n\t\tfor(k3d::uint_t i = 0; i != Output.primitives.size(); ++i)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> output_polyhedron(k3d::polyhedron::validate(Output, Output.primitives[i]));\n\t\t\tif(!output_polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::uint_t edge_count = output_polyhedron->clockwise_edges.size();\n\n\t\t\t// Get point-to-edge lookup data for outgoing edges\n\t\t\tk3d::mesh::indices_t point_edges_out;\n\t\t\tk3d::mesh::indices_t point_first_edges_out;\n\t\t\tk3d::mesh::indices_t point_edge_counts_out;\n\t\t\tk3d::polyhedron::create_point_edge_lookup(output_polyhedron->vertex_points, point_edges_out, point_first_edges_out, point_edge_counts_out);\n\n\t\t\t// Get point-to-edge lookup data for incoming edges\n\t\t\tk3d::mesh::indices_t vertex_points_in(edge_count);\n\t\t\tfor(k3d::uint_t edge = 0; edge != edge_count; ++edge)\n\t\t\t{\n\t\t\t\tvertex_points_in[edge] = output_polyhedron->vertex_points[output_polyhedron->clockwise_edges[edge]];\n\t\t\t}\n\t\t\tk3d::mesh::indices_t point_edges_in;\n\t\t\tk3d::mesh::indices_t point_first_edges_in;\n\t\t\tk3d::mesh::indices_t point_edge_counts_in;\n\t\t\tk3d::polyhedron::create_point_edge_lookup(vertex_points_in, point_edges_in, point_first_edges_in, point_edge_counts_in);\n\n\t\t\t// Get face-to-edge data\n\t\t\tk3d::mesh::indices_t edge_faces;\n\t\t\tk3d::polyhedron::create_edge_face_lookup(*output_polyhedron, edge_faces);\n\n\t\t\t// Get edge companions\n\t\t\tk3d::mesh::indices_t adjacent_edges;\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(output_polyhedron->vertex_points, output_polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\n\t\t\t// copies, since we're modifying these in the output. They don't exist in Input since the selection was not merged\n\t\t\tconst k3d::mesh::selection_t input_point_selections = *Output.point_selection;\n\t\t\tconst k3d::mesh::selection_t input_edge_selections = output_polyhedron->edge_selections;\n\t\t\tconst k3d::mesh::selection_t input_face_selections = output_polyhedron->face_selections;\n\n\t\t\tfor(k3d::uint_t edge = 0; edge != edge_count; ++edge)\n\t\t\t{\n\t\t\t\t// Grow edge selections\n\t\t\t\tconst k3d::double_t edge_selection = input_edge_selections[edge];\n\t\t\t\tif(edge_selection)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t start_point = output_polyhedron->vertex_points[edge];\n\t\t\t\t\tconst k3d::uint_t end_point = output_polyhedron->vertex_points[output_polyhedron->clockwise_edges[edge]];\n\t\t\t\t\tdetail::select_adjacent_edges(output_polyhedron->edge_selections, point_edges_out, point_first_edges_out, point_edge_counts_out, start_point, edge_selection);\n\t\t\t\t\tdetail::select_adjacent_edges(output_polyhedron->edge_selections, point_edges_out, point_first_edges_out, point_edge_counts_out, end_point, edge_selection);\n\t\t\t\t\tdetail::select_adjacent_edges(output_polyhedron->edge_selections, point_edges_in, point_first_edges_in, point_edge_counts_in, start_point, edge_selection);\n\t\t\t\t\tdetail::select_adjacent_edges(output_polyhedron->edge_selections, point_edges_in, point_first_edges_in, point_edge_counts_in, end_point, edge_selection);\n\t\t\t\t}\n\n\t\t\t\t// Grow face selections\n\t\t\t\tif(input_face_selections[edge_faces[edge]])\n\t\t\t\t{\n\t\t\t\t\toutput_polyhedron->face_selections[edge_faces[adjacent_edges[edge]]] = input_face_selections[edge_faces[edge]];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Grow point selections\n\t\t\tfor(k3d::uint_t point = 0; point != input_point_selections.size(); ++point)\n\t\t\t{\n\t\t\t\tif(input_point_selections[point])\n\t\t\t\t{\n\t\t\t\t\tdetail::select_adjacent_points(Output.point_selection.writable(), output_polyhedron->clockwise_edges, output_polyhedron->vertex_points, point_edges_out, point_first_edges_out, point_edge_counts_out, point, input_point_selections[point]);\n\t\t\t\t\tdetail::select_adjacent_points(Output.point_selection.writable(), output_polyhedron->clockwise_edges, output_polyhedron->vertex_points, point_edges_in, point_first_edges_in, point_edge_counts_in, point, input_point_selections[point]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<grow_selection,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0xff5b603d, 0x176a4def, 0xa4f195fd, 0x30a7ec15),\n\t\t\t\t\"GrowSelection\",\n\t\t\t\t_(\"Grows the selection to include adjacent vertices, edges and faces\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// grow_selection_factory\n\nk3d::iplugin_factory& grow_selection_factory()\n{\n\treturn grow_selection::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/make_curve_selection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/cubic_curve.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imesh_selection_algorithm.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/nurbs_curve.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// make_curve_selection\n\nclass make_curve_selection :\n\tpublic k3d::imesh_selection_algorithm\n{\n\ttypedef k3d::imesh_selection_algorithm base;\n\npublic:\n\tconst k3d::selection::set create_mesh_selection(const k3d::mesh& Mesh)\n\t{\n\t\tk3d::selection::set results;\n\n\t\tboost::scoped_ptr<k3d::geometry::primitive_selection::storage> primitive_selection(k3d::geometry::primitive_selection::create(results));\n\n\t\t// For each primitive in the mesh ...\n\t\tk3d::uint_t primitive = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator p = Mesh.primitives.begin(); p != Mesh.primitives.end(); ++p, ++primitive)\n\t\t{\n\t\t\t// Convert point selections to linear curve selections ...\n\t\t\tboost::scoped_ptr<k3d::linear_curve::const_primitive> linear_curve(k3d::linear_curve::validate(Mesh, **p));\n\t\t\tif(linear_curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\t\tconst k3d::uint_t curve_end = curve_begin + linear_curve->curve_first_points.size();\n\t\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t curve_point_begin = linear_curve->curve_first_points[curve];\n\t\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + linear_curve->curve_point_counts[curve];\n\t\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point != curve_point_end; ++curve_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!(*Mesh.point_selection)[linear_curve->curve_points[curve_point]])\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tk3d::geometry::primitive_selection::append(*primitive_selection, primitive, primitive+1, k3d::selection::CURVE, curve, curve+1, 1.0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert point selections to cubic curve selections ...\n\t\t\tboost::scoped_ptr<k3d::cubic_curve::const_primitive> cubic_curve(k3d::cubic_curve::validate(Mesh, **p));\n\t\t\tif(cubic_curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\t\tconst k3d::uint_t curve_end = curve_begin + cubic_curve->curve_first_points.size();\n\t\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t curve_point_begin = cubic_curve->curve_first_points[curve];\n\t\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + cubic_curve->curve_point_counts[curve];\n\t\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point != curve_point_end; ++curve_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!(*Mesh.point_selection)[cubic_curve->curve_points[curve_point]])\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\n\t\t\t\t\t\tk3d::geometry::primitive_selection::append(*primitive_selection, primitive, primitive+1, k3d::selection::CURVE, curve, curve+1, 1.0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert point selections to nurbs curve selections ...\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> nurbs_curve(k3d::nurbs_curve::validate(Mesh, **p));\n\t\t\tif(nurbs_curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\t\tconst k3d::uint_t curve_end = curve_begin + nurbs_curve->curve_first_points.size();\n\t\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t curve_point_begin = nurbs_curve->curve_first_points[curve];\n\t\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + nurbs_curve->curve_point_counts[curve];\n\t\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point != curve_point_end; ++curve_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!(*Mesh.point_selection)[nurbs_curve->curve_points[curve_point]])\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\n\t\t\t\t\t\tk3d::geometry::primitive_selection::append(*primitive_selection, primitive, primitive+1, k3d::selection::CURVE, curve, curve+1, 1.0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<make_curve_selection,\n\t\t\tk3d::interface_list<k3d::imesh_selection_algorithm> > factory(\n\t\t\t\tk3d::uuid(0x75b8aec4, 0xdc47b9f6, 0x799d8896, 0x16930c05),\n\t\t\t\t\"MakeCurveSelection\",\n\t\t\t\t_(\"Converts primitive selections to curve selections.\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// make_curve_selection_factory\n\nk3d::iplugin_factory& make_curve_selection_factory()\n{\n\treturn make_curve_selection::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/make_edge_selection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imesh_selection_algorithm.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// make_edge_selection\n\nclass make_edge_selection :\n\tpublic k3d::imesh_selection_algorithm\n{\n\ttypedef k3d::imesh_selection_algorithm base;\n\npublic:\n\tconst k3d::selection::set create_mesh_selection(const k3d::mesh& Mesh)\n\t{\n\t\tk3d::selection::set results;\n\n\t\tboost::scoped_ptr<k3d::geometry::primitive_selection::storage> primitive_selection(k3d::geometry::primitive_selection::create(results));\n\n\t\t// For each primitive in the mesh ...\n\t\tk3d::uint_t primitive = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator p = Mesh.primitives.begin(); p != Mesh.primitives.end(); ++p, ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **p));\n\t\t\tif(polyhedron)\n\t\t\t{\n\t\t\t\t// Convert point and face selections to edge selections ...\n\t\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t face_loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\t\tconst k3d::uint_t face_loop_end = face_loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\t\tfor(k3d::uint_t face_loop = face_loop_begin; face_loop != face_loop_end; ++face_loop)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[face_loop];\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(polyhedron->face_selections[face])\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::geometry::primitive_selection::append(*primitive_selection, primitive, primitive+1, k3d::selection::EDGE, edge, edge+1, 1.0);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if((*Mesh.point_selection)[polyhedron->vertex_points[edge]] || (*Mesh.point_selection)[polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]])\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::geometry::primitive_selection::append(*primitive_selection, primitive, primitive+1, k3d::selection::EDGE, edge, edge+1, 1.0);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} \n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<make_edge_selection,\n\t\t\tk3d::interface_list<k3d::imesh_selection_algorithm> > factory(\n\t\t\t\tk3d::uuid(0x5ad75f8f, 0x294732de, 0xd793dfae, 0x230175a9),\n\t\t\t\t\"MakeEdgeSelection\",\n\t\t\t\t_(\"Converts primitive selections to edge selections.\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// make_edge_selection_factory\n\nk3d::iplugin_factory& make_edge_selection_factory()\n{\n\treturn make_edge_selection::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/make_face_selection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imesh_selection_algorithm.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// make_face_selection\n\nclass make_face_selection :\n\tpublic k3d::imesh_selection_algorithm\n{\n\ttypedef k3d::imesh_selection_algorithm base;\n\npublic:\n\tconst k3d::selection::set create_mesh_selection(const k3d::mesh& Mesh)\n\t{\n\t\tk3d::selection::set results;\n\n\t\tboost::scoped_ptr<k3d::geometry::primitive_selection::storage> primitive_selection(k3d::geometry::primitive_selection::create(results));\n\n\t\t// For each primitive in the mesh ...\n\t\tk3d::uint_t primitive = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator p = Mesh.primitives.begin(); p != Mesh.primitives.end(); ++p, ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **p));\n\t\t\tif(polyhedron)\n\t\t\t{\n\t\t\t\t// Convert point and edge selections to face selections ...\n\t\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t face_loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\t\tconst k3d::uint_t face_loop_end = face_loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\t\tfor(k3d::uint_t face_loop = face_loop_begin; face_loop != face_loop_end; ++face_loop)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[face_loop];\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(polyhedron->edge_selections[edge])\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::geometry::primitive_selection::append(*primitive_selection, primitive, primitive+1, k3d::selection::FACE, face, face+1, 1.0);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if((*Mesh.point_selection)[polyhedron->vertex_points[edge]])\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tk3d::geometry::primitive_selection::append(*primitive_selection, primitive, primitive+1, k3d::selection::FACE, face, face+1, 1.0);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} \n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<make_face_selection,\n\t\t\tk3d::interface_list<k3d::imesh_selection_algorithm> > factory(\n\t\t\t\tk3d::uuid(0xa9255e35, 0x3547771f, 0x745f0d99, 0xa3cb04fa),\n\t\t\t\t\"MakeFaceSelection\",\n\t\t\t\t_(\"Converts primitive selections to face selections.\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// make_face_selection_factory\n\nk3d::iplugin_factory& make_face_selection_factory()\n{\n\treturn make_face_selection::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/make_patch_selection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imesh_selection_algorithm.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// make_patch_selection\n\nclass make_patch_selection :\n\tpublic k3d::imesh_selection_algorithm\n{\n\ttypedef k3d::imesh_selection_algorithm base;\n\npublic:\n\tconst k3d::selection::set create_mesh_selection(const k3d::mesh& Mesh)\n\t{\n\t\tk3d::selection::set results;\n\n\t\tboost::scoped_ptr<k3d::geometry::primitive_selection::storage> primitive_selection(k3d::geometry::primitive_selection::create(results));\n\n\t\t// For each primitive in the mesh ...\n\t\tk3d::uint_t primitive = 0;\n\t\tfor(k3d::mesh::primitives_t::const_iterator p = Mesh.primitives.begin(); p != Mesh.primitives.end(); ++p, ++primitive)\n\t\t{\n\t\t\t// Convert point selections to bilinear patch selections ...\n\t\t\tboost::scoped_ptr<k3d::bilinear_patch::const_primitive> bilinear_patch(k3d::bilinear_patch::validate(Mesh, **p));\n\t\t\tif(bilinear_patch)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\t\tconst k3d::uint_t patch_end = patch_begin + bilinear_patch->patch_selections.size();\n\t\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t patch_point_begin = patch * 4;\n\t\t\t\t\tconst k3d::uint_t patch_point_end = patch_point_begin + 4;\n\t\t\t\t\tfor(k3d::uint_t patch_point = patch_point_begin; patch_point != patch_point_end; ++patch_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!(*Mesh.point_selection)[bilinear_patch->patch_points[patch_point]])\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tk3d::geometry::primitive_selection::append(*primitive_selection, primitive, primitive+1, k3d::selection::PATCH, patch, patch+1, 1.0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert point selections to cubic patch selections ...\n\t\t\tboost::scoped_ptr<k3d::bicubic_patch::const_primitive> bicubic_patch(k3d::bicubic_patch::validate(Mesh, **p));\n\t\t\tif(bicubic_patch)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\t\tconst k3d::uint_t patch_end = patch_begin + bicubic_patch->patch_selections.size();\n\t\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t patch_point_begin = patch * 16;\n\t\t\t\t\tconst k3d::uint_t patch_point_end = patch_point_begin + 16;\n\t\t\t\t\tfor(k3d::uint_t patch_point = patch_point_begin; patch_point != patch_point_end; ++patch_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!(*Mesh.point_selection)[bicubic_patch->patch_points[patch_point]])\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\n\t\t\t\t\t\tk3d::geometry::primitive_selection::append(*primitive_selection, primitive, primitive+1, k3d::selection::PATCH, patch, patch+1, 1.0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert point selections to nurbs patch selections ...\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs_patch(k3d::nurbs_patch::validate(Mesh, **p));\n\t\t\tif(nurbs_patch)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\t\tconst k3d::uint_t patch_end = patch_begin + nurbs_patch->patch_first_points.size();\n\t\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t patch_point_begin = nurbs_patch->patch_first_points[patch];\n\t\t\t\t\tconst k3d::uint_t patch_point_end = patch_point_begin + (nurbs_patch->patch_u_point_counts[patch] * nurbs_patch->patch_v_point_counts[patch]);\n\t\t\t\t\tfor(k3d::uint_t patch_point = patch_point_begin; patch_point != patch_point_end; ++patch_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!(*Mesh.point_selection)[nurbs_patch->patch_points[patch_point]])\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\n\t\t\t\t\t\tk3d::geometry::primitive_selection::append(*primitive_selection, primitive, primitive+1, k3d::selection::PATCH, patch, patch+1, 1.0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<make_patch_selection,\n\t\t\tk3d::interface_list<k3d::imesh_selection_algorithm> > factory(\n\t\t\t\tk3d::uuid(0x80b8e0f2, 0x394b9d2f, 0x6a21da90, 0x4399215e),\n\t\t\t\t\"MakePatchSelection\",\n\t\t\t\t_(\"Converts point selections to patch selections.\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// make_patch_selection_factory\n\nk3d::iplugin_factory& make_patch_selection_factory()\n{\n\treturn make_patch_selection::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/make_point_selection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/cubic_curve.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imesh_selection_algorithm.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// make_point_selection\n\nclass make_point_selection :\n\tpublic k3d::imesh_selection_algorithm\n{\n\ttypedef k3d::imesh_selection_algorithm base;\n\npublic:\n\tconst k3d::selection::set create_mesh_selection(const k3d::mesh& Mesh)\n\t{\n\t\tk3d::selection::set results;\n\n\t\tboost::scoped_ptr<k3d::geometry::point_selection::storage> point_selection(k3d::geometry::point_selection::create(results));\n\n\t\t// For each primitive in the mesh ...\n\t\tfor(k3d::mesh::primitives_t::const_iterator p = Mesh.primitives.begin(); p != Mesh.primitives.end(); ++p)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Mesh, **p));\n\t\t\tif(polyhedron)\n\t\t\t{\n\t\t\t\t// Convert edge selections to point selections ...\n\t\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\t\tconst k3d::uint_t edge_end = edge_begin + polyhedron->edge_selections.size();\n\t\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(!polyhedron->edge_selections[edge])\n\t\t\t\t\t\tcontinue;\n\n\t \t\t\t\tk3d::geometry::point_selection::append(*point_selection, polyhedron->vertex_points[edge], polyhedron->vertex_points[edge]+1, 1.0);\n\t \t\t\t\tk3d::geometry::point_selection::append(*point_selection, polyhedron->vertex_points[polyhedron->clockwise_edges[edge]], polyhedron->vertex_points[polyhedron->clockwise_edges[edge]]+1, 1.0);\n\t\t\t\t}\n\n\t\t\t\t// Convert face selections to point selections ...\n\t\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tif(!polyhedron->face_selections[face])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t face_loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\t\tconst k3d::uint_t face_loop_end = face_loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\t\tfor(k3d::uint_t face_loop = face_loop_begin; face_loop != face_loop_end; ++face_loop)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[face_loop];\n\t\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ; )\n\t\t\t\t\t\t{\n\t \t\t\t\t\t\tk3d::geometry::point_selection::append(*point_selection, polyhedron->vertex_points[edge], polyhedron->vertex_points[edge]+1, 1.0);\n\n\t\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} \n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert linear curve selections to point selections ...\n\t\t\tboost::scoped_ptr<k3d::linear_curve::const_primitive> linear_curve(k3d::linear_curve::validate(Mesh, **p));\n\t\t\tif(linear_curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\t\tconst k3d::uint_t curve_end = curve_begin + linear_curve->curve_first_points.size();\n\t\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve)\n\t\t\t\t{\n\t\t\t\t\tif(!linear_curve->curve_selections[curve])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t curve_point_begin = linear_curve->curve_first_points[curve];\n\t\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + linear_curve->curve_point_counts[curve];\n\t\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point != curve_point_end; ++curve_point)\n \t\t\t\t\t\tk3d::geometry::point_selection::append(*point_selection, linear_curve->curve_points[curve_point], linear_curve->curve_points[curve_point]+1, 1.0);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert cubic curve selections to point selections ...\n\t\t\tboost::scoped_ptr<k3d::cubic_curve::const_primitive> cubic_curve(k3d::cubic_curve::validate(Mesh, **p));\n\t\t\tif(cubic_curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\t\tconst k3d::uint_t curve_end = curve_begin + cubic_curve->curve_first_points.size();\n\t\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve)\n\t\t\t\t{\n\t\t\t\t\tif(!cubic_curve->curve_selections[curve])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t curve_point_begin = cubic_curve->curve_first_points[curve];\n\t\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + cubic_curve->curve_point_counts[curve];\n\t\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point != curve_point_end; ++curve_point)\n \t\t\t\t\t\tk3d::geometry::point_selection::append(*point_selection, cubic_curve->curve_points[curve_point], cubic_curve->curve_points[curve_point]+1, 1.0);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert nurbs curve selections to point selections ...\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> nurbs_curve(k3d::nurbs_curve::validate(Mesh, **p));\n\t\t\tif(nurbs_curve)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t curve_begin = 0;\n\t\t\t\tconst k3d::uint_t curve_end = curve_begin + nurbs_curve->curve_first_points.size();\n\t\t\t\tfor(k3d::uint_t curve = curve_begin; curve != curve_end; ++curve)\n\t\t\t\t{\n\t\t\t\t\tif(!nurbs_curve->curve_selections[curve])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t curve_point_begin = nurbs_curve->curve_first_points[curve];\n\t\t\t\t\tconst k3d::uint_t curve_point_end = curve_point_begin + nurbs_curve->curve_point_counts[curve];\n\t\t\t\t\tfor(k3d::uint_t curve_point = curve_point_begin; curve_point != curve_point_end; ++curve_point)\n \t\t\t\t\t\tk3d::geometry::point_selection::append(*point_selection, nurbs_curve->curve_points[curve_point], nurbs_curve->curve_points[curve_point]+1, 1.0);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert bilinear patch selections to point selections ...\n\t\t\tboost::scoped_ptr<k3d::bilinear_patch::const_primitive> bilinear_patch(k3d::bilinear_patch::validate(Mesh, **p));\n\t\t\tif(bilinear_patch)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\t\tconst k3d::uint_t patch_end = patch_begin + bilinear_patch->patch_points.size() / 4;\n\t\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t\t{\n\t\t\t\t\tif(!bilinear_patch->patch_selections[patch])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t patch_point_begin = patch * 4;\n\t\t\t\t\tconst k3d::uint_t patch_point_end = patch_point_begin + 4;\n\t\t\t\t\tfor(k3d::uint_t patch_point = patch_point_begin; patch_point != patch_point_end; ++patch_point)\n \t\t\t\t\t\tk3d::geometry::point_selection::append(*point_selection, bilinear_patch->patch_points[patch_point], bilinear_patch->patch_points[patch_point]+1, 1.0);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert bicubic patch selections to point selections ...\n\t\t\tboost::scoped_ptr<k3d::bicubic_patch::const_primitive> bicubic_patch(k3d::bicubic_patch::validate(Mesh, **p));\n\t\t\tif(bicubic_patch)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\t\tconst k3d::uint_t patch_end = patch_begin + bicubic_patch->patch_points.size() / 16;\n\t\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t\t{\n\t\t\t\t\tif(!bicubic_patch->patch_selections[patch])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t patch_point_begin = patch * 16;\n\t\t\t\t\tconst k3d::uint_t patch_point_end = patch_point_begin + 16;\n\t\t\t\t\tfor(k3d::uint_t patch_point = patch_point_begin; patch_point != patch_point_end; ++patch_point)\n \t\t\t\t\t\tk3d::geometry::point_selection::append(*point_selection, bicubic_patch->patch_points[patch_point], bicubic_patch->patch_points[patch_point]+1, 1.0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Convert nurbs patch selections to point selections ...\n\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs_patch(k3d::nurbs_patch::validate(Mesh, **p));\n\t\t\tif(nurbs_patch)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t patch_begin = 0;\n\t\t\t\tconst k3d::uint_t patch_end = patch_begin + nurbs_patch->patch_first_points.size();\n\t\t\t\tfor(k3d::uint_t patch = patch_begin; patch != patch_end; ++patch)\n\t\t\t\t{\n\t\t\t\t\tif(!nurbs_patch->patch_selections[patch])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t patch_point_begin = nurbs_patch->patch_first_points[patch];\n\t\t\t\t\tconst k3d::uint_t patch_point_end = patch_point_begin + (nurbs_patch->patch_u_point_counts[patch] * nurbs_patch->patch_v_point_counts[patch]);\n\t\t\t\t\tfor(k3d::uint_t patch_point = patch_point_begin; patch_point != patch_point_end; ++patch_point)\n \t\t\t\t\t\tk3d::geometry::point_selection::append(*point_selection, nurbs_patch->patch_points[patch_point], nurbs_patch->patch_points[patch_point]+1, 1.0);\n\t\t\t\t}\n\t\t\t}\n\n/*\n\t\t\t// Perform automatic conversion\n\t\t\tfor(k3d::mesh::named_tables_t::const_iterator s = (**p).structure.begin(); s != (**p).structure.end(); ++s)\n\t\t\t{\n\t\t\t\tconst k3d::mesh::selection_t* selection = 0;\n\t\t\t\tconst k3d::mesh::indices_t* points = 0;\n\n\t\t\t\tfor(k3d::mesh::named_arrays_t::const_iterator array = s->second.begin(); array != s->second.end(); ++array)\n\t\t\t\t{\n\t\t\t\t\tif(!selection)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(array->second->get_metadata_value(k3d::metadata::key::role()) == k3d::metadata::value::selection_role())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tselection = dynamic_cast<const k3d::mesh::selection_t*>(array->second.get());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(!points)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(array->second->get_metadata_value(k3d::metadata::key::domain()) == k3d::metadata::value::point_indices_domain())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpoints = dynamic_cast<const k3d::mesh::indices_t*>(array->second.get());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Select referenced points\n\t\t\t\tif(selection && points)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t begin = 0;\n\t\t\t\t\tconst k3d::uint_t end = begin + selection->size();\n\t\t\t\t\tfor(k3d::uint_t i = begin; i != end; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((*selection)[i])\n\t\t\t\t\t\t\tk3d::geometry::point_selection::append(*point_selection, (*points)[i], (*points)[i]+1, 1.0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n*/\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<make_point_selection,\n\t\t\tk3d::interface_list<k3d::imesh_selection_algorithm> > factory(\n\t\t\t\tk3d::uuid(0x0d1fd128, 0xf24f51c9, 0x175b158c, 0xf0a00996),\n\t\t\t\t\"MakePointSelection\",\n\t\t\t\t_(\"Converts primitive selections to point selections.\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// make_point_selection_factory\n\nk3d::iplugin_factory& make_point_selection_factory()\n{\n\treturn make_point_selection::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/mesh_selection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_selection\n\nclass mesh_selection :\n\tpublic k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node> >\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node> > base;\n\npublic:\n\tmesh_selection(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.property_changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\t\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_selection,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0x8e7ee49b, 0x0c40f479, 0x4c90abb0, 0x784c36c1),\n\t\t\t\t\"MeshSelection\",\n\t\t\t\t_(\"Applies a selection to a mesh.\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_selection_factory\n\nk3d::iplugin_factory& mesh_selection_factory()\n{\n\treturn mesh_selection::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\n/// Namespace reserved for the selection plugin module, to protect public symbols from name clashes with other modules\nnamespace module\n{\n\nnamespace selection\n{\n\nextern k3d::iplugin_factory& face_to_point_selections_factory();\nextern k3d::iplugin_factory& grow_selection_factory();\nextern k3d::iplugin_factory& make_curve_selection_factory();\nextern k3d::iplugin_factory& make_edge_selection_factory();\nextern k3d::iplugin_factory& make_face_selection_factory();\nextern k3d::iplugin_factory& make_patch_selection_factory();\nextern k3d::iplugin_factory& make_point_selection_factory();\nextern k3d::iplugin_factory& mesh_selection_factory();\nextern k3d::iplugin_factory& node_selection_factory();\nextern k3d::iplugin_factory& select_bicubic_patch_by_number_factory();\nextern k3d::iplugin_factory& select_bilinear_patch_by_number_factory();\nextern k3d::iplugin_factory& select_boundary_edges_factory();\nextern k3d::iplugin_factory& select_clockwise_factory();\nextern k3d::iplugin_factory& select_companion_factory();\nextern k3d::iplugin_factory& select_connected_components_factory();\nextern k3d::iplugin_factory& select_cube_factory();\nextern k3d::iplugin_factory& select_cubic_curve_by_number_factory();\nextern k3d::iplugin_factory& select_degenerate_faces_factory();\nextern k3d::iplugin_factory& select_edge_by_number_factory();\nextern k3d::iplugin_factory& select_edgeloops_factory();\nextern k3d::iplugin_factory& select_edgerings_factory();\nextern k3d::iplugin_factory& select_face_by_number_factory();\nextern k3d::iplugin_factory& select_linear_curve_by_number_factory();\nextern k3d::iplugin_factory& select_n_sided_factory();\nextern k3d::iplugin_factory& select_nurbs_curve_by_number_factory();\nextern k3d::iplugin_factory& select_nurbs_patch_by_number_factory();\nextern k3d::iplugin_factory& select_point_by_number_factory();\nextern k3d::iplugin_factory &select_points_above_number_factory();\n\n} // namespace selection\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::selection::face_to_point_selections_factory());\n\tRegistry.register_factory(module::selection::grow_selection_factory());\n\tRegistry.register_factory(module::selection::make_curve_selection_factory());\n\tRegistry.register_factory(module::selection::make_edge_selection_factory());\n\tRegistry.register_factory(module::selection::make_face_selection_factory());\n\tRegistry.register_factory(module::selection::make_patch_selection_factory());\n\tRegistry.register_factory(module::selection::make_point_selection_factory());\n\tRegistry.register_factory(module::selection::mesh_selection_factory());\n\tRegistry.register_factory(module::selection::node_selection_factory());\n\tRegistry.register_factory(module::selection::select_bicubic_patch_by_number_factory());\n\tRegistry.register_factory(module::selection::select_bilinear_patch_by_number_factory());\n\tRegistry.register_factory(module::selection::select_boundary_edges_factory());\n\tRegistry.register_factory(module::selection::select_clockwise_factory());\n\tRegistry.register_factory(module::selection::select_companion_factory());\n\tRegistry.register_factory(module::selection::select_connected_components_factory());\n\tRegistry.register_factory(module::selection::select_cube_factory());\n\tRegistry.register_factory(module::selection::select_cubic_curve_by_number_factory());\n\tRegistry.register_factory(module::selection::select_degenerate_faces_factory());\n\tRegistry.register_factory(module::selection::select_edge_by_number_factory());\n\tRegistry.register_factory(module::selection::select_edgeloops_factory());\n\tRegistry.register_factory(module::selection::select_edgerings_factory());\n\tRegistry.register_factory(module::selection::select_face_by_number_factory());\n\tRegistry.register_factory(module::selection::select_linear_curve_by_number_factory());\n\tRegistry.register_factory(module::selection::select_n_sided_factory());\n\tRegistry.register_factory(module::selection::select_nurbs_curve_by_number_factory());\n\tRegistry.register_factory(module::selection::select_nurbs_patch_by_number_factory());\n\tRegistry.register_factory(module::selection::select_point_by_number_factory());\n\tRegistry.register_factory(module::selection::select_points_above_number_factory());\nK3D_MODULE_END\n"
  },
  {
    "path": "modules/selection/node_selection.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n */\n\n#include <map>\n#include <vector>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/inode_selection.h>\n#include <k3dsdk/ipipeline.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace selection\n{\n\nclass node_selection :\n\tpublic k3d::node,\n\tpublic k3d::inode_selection\n{\n\ttypedef k3d::node base;\n\ttypedef std::map<k3d::inode*, k3d::double_t> selection_t;\npublic:\n\tnode_selection(k3d::iplugin_factory& Factory, k3d::idocument& Document) : base(Factory, Document),\n\t\tm_selection_weights((init_owner(*this) + init_name(\"selection_weights\") + init_label(_(\"Selection Weights\")) + init_description(_(\"Selection weight for all nodes\")) + init_value(selection_t())))\n\t{\n\t\tm_selection_weights.changed_signal().connect(sigc::mem_fun(*this, &node_selection::on_weights_changed));\n\t}\n\n\tvoid select(k3d::inode& Node, const k3d::double_t Weight)\n\t{ \n\t\tk3d::ipipeline_profiler::profile profile(document().pipeline_profiler(), *this, \"Set Node Selection\");\n\t\tselection_t selection_weights = m_selection_weights.pipeline_value();\n\t\tif(Weight == 0.0) // deselect a node\n\t\t{\n\t\t\tif(selection_weights.erase(&Node)) // Only signal if something actually changed\n\t\t\t\tm_selection_weights.set_value(selection_weights);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(!selection_weights.count(&Node) || selection_weights[&Node] != Weight)\n\t\t\t{\n\t\t\t\tselection_weights[&Node] = Weight;\n\t\t\t\tm_selection_weights.set_value(selection_weights);\n\t\t\t}\n\t\t}\n\t\tk3d::log() << debug << \"--------------------------- begin document selection state --------------------------------\" << std::endl;\n    for(selection_t::const_iterator it = selection_weights.begin(); it != selection_weights.end(); ++it)\n      k3d::log() << debug << it->first->name() << std::endl;\n    k3d::log() << debug << \"--------------------------- begin document selection state --------------------------------\" << std::endl;\n\t}\n\n\tk3d::double_t selection_weight(k3d::inode& Node)\n\t{ \n\t\tk3d::ipipeline_profiler::profile profile(document().pipeline_profiler(), *this, \"Get Node Selection\");\n\t\tselection_t selection_weights = m_selection_weights.pipeline_value();\n\t\tselection_t::const_iterator node_weight = selection_weights.find(&Node);\n\t\tif(node_weight != selection_weights.end())\n\t\t{\n\t\t\treturn node_weight->second;\n\t\t}\n\t\treturn 0.0;\n\t}\n\n\tconst selected_nodes_t selected_nodes()\n\t{\n\t\treturn m_selected_nodes;\n\t}\n\t\n\tvoid deselect_all()\n\t{\n\t\tm_selected_nodes.clear();\n\t\tselection_t empty_weights;\n\t\tm_selection_weights.set_value(empty_weights);\n\t}\n\t\n\tchanged_signal_t& selection_changed_signal()\n\t{\n\t\treturn m_selection_weights.changed_signal();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<node_selection,\n\t\t\tk3d::interface_list<k3d::inode_selection> >factory(\n\t\t\tk3d::uuid(0x5d305922, 0xd2442343, 0x077956b6, 0xb112b9b3),\n\t\t\t\"NodeSelection\",\n\t\t\t_(\"Stores the document node selection state\"),\n\t\t\t\"Selection\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\n\t/// Adapts the internal ordered list of selections based on changes to the weights array\n\t// TODO: Use Hints to directly supply the node that was added / deleted\n\tvoid on_weights_changed(k3d::ihint* Hint)\n\t{\n\t\tselection_t selection_weights = m_selection_weights.pipeline_value();\n\t\tfor(k3d::inode_selection::selected_nodes_t::iterator node = m_selected_nodes.begin(); node != m_selected_nodes.end(); )\n\t\t{\n\t\t\tif(!selection_weights.erase(*node)) // peel off all nodes that are already in the selection list\n\t\t\t{\n\t\t\t\t// if no node was removed, remove it from the stored list\n\t\t\t\tnode = m_selected_nodes.erase(node);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Just leave it in, otherwise\n\t\t\t\t++node;\n\t\t\t}\n\t\t}\n\t\t// All remaining nodes need to be appended to the list\n\t\tfor(selection_t::const_iterator node_weight = selection_weights.begin(); node_weight != selection_weights.end(); ++node_weight)\n\t\t{\n\t\t\tm_selected_nodes.push_back(node_weight->first);\n\t\t}\n\t}\n\n\ttemplate<typename value_t, class property_policy_t>\n\tclass selection_weight_serialization :\n\t\tpublic property_policy_t,\n\t\tpublic ipersistent\n\t{\n\tpublic:\n\t\tvoid save(k3d::xml::element& Element, const k3d::ipersistent::save_context& Context)\n\t\t{\n\t\t\tstd::stringstream buffer;\n\n\t\t\tconst selection_t& selection = property_policy_t::internal_value();\n\t\t\tfor(selection_t::const_iterator selection_pair = selection.begin(); selection_pair != selection.end(); ++selection_pair)\n\t\t\t{\n\t\t\t\tk3d::inode* node = selection_pair->first;\n\t\t\t\tk3d::double_t weight = selection_pair->second;\n\t\t\t\tif(node)\n\t\t\t\t\tbuffer << \" \" << k3d::string_cast(Context.lookup.lookup_id(node));\n\n\t\t\t\tbuffer << \" \" << weight;\n\t\t\t}\n\n\t\t\tElement.append(k3d::xml::element(\"property\", buffer.str(), k3d::xml::attribute(\"name\", property_policy_t::name())));\n\t\t}\n\n\t\tvoid load(k3d::xml::element& Element, const ipersistent::load_context& Context)\n\t\t{\n\t\t\tselection_t selection;\n\n\t\t\tstd::stringstream buffer(Element.text);\n\t\t\tstd::string node;\n\t\t\tstd::string weight;\n\t\t\twhile(buffer >> node)\n\t\t\t{\n\t\t\t\treturn_if_fail(buffer >> weight);\n\t\t\t\tselection[dynamic_cast<inode*>(Context.lookup.lookup_object(k3d::from_string(node, static_cast<k3d::ipersistent_lookup::id_type>(0))))] = boost::lexical_cast<k3d::double_t>(weight);\n\t\t\t}\n\n\t\t\tproperty_policy_t::set_value(selection);\n\t\t}\n\n\tprotected:\n\t\ttemplate<typename init_t>\n\t\tselection_weight_serialization(const init_t& Init) :\n\t\t\tproperty_policy_t(Init)\n\t\t{\n\t\t\tInit.persistent_collection().enable_serialization(Init.name(), *this);\n\t\t}\n\t};\n\n\tk3d_data(selection_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, selection_weight_serialization) m_selection_weights;\n\tk3d::inode_selection::selected_nodes_t m_selected_nodes;\n};\n\nk3d::iplugin_factory& node_selection_factory()\n{\n\treturn node_selection::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n"
  },
  {
    "path": "modules/selection/select_bicubic_patch_by_number.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_bicubic_patch_by_number\n\nclass select_bicubic_patch_by_number :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tselect_bicubic_patch_by_number(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_primitive(init_owner(*this) + init_name(\"primitive\") + init_label(_(\"Primitive Number\")) + init_description(_(\"Primitive Number.\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_index(init_owner(*this) + init_name(\"index\") + init_label(_(\"Patch Number\")) + init_description(_(\"Patch Number\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t\tm_primitive.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\n\t\tm_index.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t primitive = m_primitive.pipeline_value();\n\t\tif(primitive >= Output.primitives.size())\n\t\t\treturn;\n\n\t\tboost::scoped_ptr<k3d::bicubic_patch::primitive> patches(k3d::bicubic_patch::validate(Output, Output.primitives[primitive]));\n\t\tif(!patches)\n\t\t\treturn;\n\t\t\n\t\tstd::fill(patches->patch_selections.begin(), patches->patch_selections.end(), 0.0);\n\n\t\tconst k3d::int32_t index = m_index.pipeline_value();\n\t\tif(index < patches->patch_selections.size())\n\t\t\tpatches->patch_selections[index] = 1.0;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_bicubic_patch_by_number,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0xa39d78b4, 0x3b49654d, 0xee092481, 0xc911387b),\n\t\t\t\t\"SelectBicubicPatchByNumber\",\n\t\t\t\t_(\"Selects a bicubic patch from the input mesh by its index number\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_primitive;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_bicubic_patch_by_number_factory\n\nk3d::iplugin_factory& select_bicubic_patch_by_number_factory()\n{\n\treturn select_bicubic_patch_by_number::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_bilinear_patch_by_number.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_bilinear_patch_by_number\n\nclass select_bilinear_patch_by_number :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tselect_bilinear_patch_by_number(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_primitive(init_owner(*this) + init_name(\"primitive\") + init_label(_(\"Primitive Number\")) + init_description(_(\"Primitive Number.\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_index(init_owner(*this) + init_name(\"index\") + init_label(_(\"Patch Number\")) + init_description(_(\"Patch Number\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t\tm_primitive.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\n\t\tm_index.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t primitive = m_primitive.pipeline_value();\n\t\tif(primitive >= Output.primitives.size())\n\t\t\treturn;\n\n\t\tboost::scoped_ptr<k3d::bilinear_patch::primitive> patches(k3d::bilinear_patch::validate(Output, Output.primitives[primitive]));\n\t\tif(!patches)\n\t\t\treturn;\n\t\t\n\t\tstd::fill(patches->patch_selections.begin(), patches->patch_selections.end(), 0.0);\n\n\t\tconst k3d::int32_t index = m_index.pipeline_value();\n\t\tif(index < patches->patch_selections.size())\n\t\t\tpatches->patch_selections[index] = 1.0;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_bilinear_patch_by_number,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0x38e04517, 0xe44a9c51, 0x6b507492, 0x3ca3e527),\n\t\t\t\t\"SelectBilinearPatchByNumber\",\n\t\t\t\t_(\"Selects a bilinear patch from the input mesh by its index number\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_primitive;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_bilinear_patch_by_number_factory\n\nk3d::iplugin_factory& select_bilinear_patch_by_number_factory()\n{\n\treturn select_bilinear_patch_by_number::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_boundary_edges.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_boundary_edges\n\nclass select_boundary_edges :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_selection_modifier<k3d::node> >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_selection_modifier<k3d::node> > base;\n\npublic:\n\tselect_boundary_edges(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.property_changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_boundary_edges,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0xfdc48d90, 0x2c442a36, 0x9f399c88, 0x88a4e27f),\n\t\t\t\t\"SelectBoundaryEdges\",\n\t\t\t\t_(\"Selects edges that are on the boundary of the mesh\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\t\nprivate:\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\t// Merge with the desired input selection\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(polyhedron)\n\t\t\t{\n\t\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\t\tk3d::mesh::indices_t adjacent_edges;\n\t\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, adjacent_edges);\n\t\t\t\tconst k3d::uint_t edge_count = boundary_edges.size();\n\t\t\t\tfor(k3d::uint_t edge = 0; edge != edge_count; ++edge)\n\t\t\t\t{\n\t\t\t\t\tif(boundary_edges[edge])\n\t\t\t\t\t\tpolyhedron->edge_selections[edge] = 1.0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_boundary_edges_factory\n\nk3d::iplugin_factory& select_boundary_edges_factory()\n{\n\treturn select_boundary_edges::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_clockwise.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\t\\author Bart Janssens <bart.janssens@lid.kviv.be>\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/utility.h>\n\n#include <iomanip>\n#include <iterator>\n#include <set>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_clockwise\n\nclass select_clockwise :\n\tpublic k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node> >\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node> > base;\npublic:\n\tselect_clockwise(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n      k3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n    k3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n      boost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n      if(!polyhedron)\n        continue;\n\n      k3d::mesh::selection_t original_edge_selections = polyhedron->edge_selections;\n\t\t\tstd::fill(polyhedron->edge_selections.begin(), polyhedron->edge_selections.end(), 0.0);\n\t\t\n      const k3d::uint_t edge_begin = 0;\n      const k3d::uint_t edge_end = edge_begin + original_edge_selections.size();\t\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(original_edge_selections[edge])\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->edge_selections[polyhedron->clockwise_edges[edge]] = 1.0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n    }\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_clockwise,\n      k3d::interface_list<k3d::imesh_source,\n      k3d::interface_list<k3d::imesh_sink> > > factory(\n      k3d::uuid(0xea623f75, 0x19264b07, 0xbfa105a4, 0xba070bed),\n      \"SelectClockwise\",\n      \"Select the clockwise edge of an edge. If multiple edges are selected the first one in the list is selected and all others are deselected\",\n      \"Selection\",\n      k3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_clockwise_factory\n\nk3d::iplugin_factory& select_clockwise_factory()\n{\n\treturn select_clockwise::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_companion.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens <bart.janssens@lid.kviv.be>\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/utility.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iomanip>\n#include <iterator>\n#include <set>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_companion\n\n/** \\todo Decide whether this plugin is needed at all */\nclass select_companion :\n\tpublic k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node > > base;\n\npublic:\n\tselect_companion(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_keep_original_selection(init_owner(*this) + init_name(\"keep_original_selection\") + init_label(_(\"Keep Original Selection\")) + init_description(_(\"Keep the original selection, rather than selecting only the companions\")) + init_value(false))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_keep_original_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::bool_t keep_selection = m_keep_original_selection.pipeline_value();\n      \n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::mesh::selection_t original_edge_selections = polyhedron->edge_selections;\n\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::mesh::indices_t companions;\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, companions);\n\n\t\t\tstd::fill(polyhedron->edge_selections.begin(), polyhedron->edge_selections.end(), 0.0);\n\n\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\tconst k3d::uint_t edge_end = edge_begin + polyhedron->edge_selections.size(); \n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tif(original_edge_selections[edge])\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->edge_selections[companions[edge]] = original_edge_selections[edge];\n\n\t\t\t\t\tif(keep_selection)\n\t\t\t\t\t\tpolyhedron->edge_selections[edge] = original_edge_selections[edge];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_companion,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\tk3d::uuid(0x636a062d, 0x80fc4b53, 0x8f0149e8, 0x4de9c520),\n\t\t\t\"SelectCompanion\",\n\t\t\t\"Select the companion of an edge. If multiple edges are selected the first one in the list is selected and all others are deselected\",\n\t\t\t\"Selection\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_keep_original_selection;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_companion_factory\n\nk3d::iplugin_factory& select_companion_factory()\n{\n\treturn select_companion::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_connected_components.cpp",
    "content": "// K-3D\n// Copyright (c) 2005-2008 Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/basic_math.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/utility.h>\n#include <k3dsdk/vectors.h>\n\n#include <boost/scoped_ptr.hpp>\n#include <boost/mpl/for_each.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\nnamespace detail\n{\n\t/// Interface for an array wrapper, providing a means to compare data\nstruct iarray_wrapper\n{\n\tvirtual ~iarray_wrapper() {}\n\t\n\t/// Compare the data values at the two indices\n\tvirtual k3d::bool_t compare(const k3d::uint_t a, const k3d::uint_t b) const = 0;\n};\n\t\n/// Wraps a named array of type T\ntemplate<typename T>\nstruct array_wrapper : iarray_wrapper\n{\n\tarray_wrapper(const k3d::typed_array<T>& Array) : m_array(Array)\n\t{\n\t}\n\t\n\tvirtual k3d::bool_t compare(const k3d::uint_t a, const k3d::uint_t b) const\n\t{\n\t\treturn m_array[a] == m_array[b];\n\t}\n\t\nprivate:\n\tconst k3d::typed_array<T>& m_array;\n};\n\n/// MPL functor to wrap an array\nstruct wrap_array_ftor\n{\n\twrap_array_ftor(const k3d::array* Array, boost::shared_ptr<iarray_wrapper>& Result) : m_array(Array), m_result(Result)\n\t{\n\t}\n\t\n\ttemplate<typename T>\n\tvoid operator()(const T&)\n\t{\n\t\tk3d::typed_array<T> const * const arr_ptr = dynamic_cast<k3d::typed_array<T> const *>(m_array);\n\t\tif(arr_ptr)\n\t\t\tm_result.reset(new array_wrapper<T>(*arr_ptr));\n\t}\n\t\nprivate:\n\tconst k3d::array* m_array;\n\tboost::shared_ptr<iarray_wrapper>& m_result;\n};\n\nboost::shared_ptr<iarray_wrapper> wrap_array(const k3d::array* Array)\n{\n\tboost::shared_ptr<iarray_wrapper> result;\n\tboost::mpl::for_each<k3d::named_array_types>(wrap_array_ftor(Array, result));\n\treturn result;\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// select_connected_components\n\nclass select_connected_components :\n\tpublic k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node > > base;\n\npublic:\n\tselect_connected_components(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_select_faces(init_owner(*this) + init_name(\"select_faces\") + init_label(_(\"Select Faces\")) + init_description(_(\"Select connected faces\")) + init_value(true)),\n\t\tm_select_edges(init_owner(*this) + init_name(\"select_edges\") + init_label(_(\"Select Edges\")) + init_description(_(\"Select connected edges\")) + init_value(true)),\n\t\tm_select_vertices(init_owner(*this) + init_name(\"select_vertices\") + init_label(_(\"Select Vertices\")) + init_description(_(\"Select connected vertices\")) + init_value(true)),\n\t\tm_select_points(init_owner(*this) + init_name(\"select_points\") + init_label(_(\"Select Points\")) + init_description(_(\"Select connected points\")) + init_value(true)),\n\t\tm_same_attributes(init_owner(*this) + init_name(\"same_attributes\") + init_label(_(\"Same Attributes\")) + init_description(_(\"Only selects components where the face attributes in the supplied array are the same\")) + init_value(false)),\n\t\tm_array(init_owner(*this) + init_name(\"array\") + init_label(_(\"Array\")) + init_description(_(\"Specifies the array name for the attributes that must match when growing the selection (if Same Attributes is on)\")) + init_value(std::string(\"Cs\")))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\n\t\tm_select_faces.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_select_edges.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_select_vertices.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_select_points.changed_signal().connect(k3d::hint::converter<\n\t\t\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_same_attributes.changed_signal().connect(k3d::hint::converter<\n\t\t\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_array.changed_signal().connect(k3d::hint::converter<\n\t\t\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\t// Shallow copy of the input (no data is copied, only shared pointers are)\n\t\tOutput = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output); // Merges the current document selection with the mesh\n\n\t\tconst k3d::bool_t select_faces = m_select_faces.pipeline_value();\n\t\tconst k3d::bool_t select_edges = m_select_edges.pipeline_value();\n\t\tconst k3d::bool_t select_vertices = m_select_vertices.pipeline_value();\n\t\tconst k3d::bool_t select_points = m_select_points.pipeline_value();\n\t\t\n\t\tconst k3d::string_t array_name = m_array.pipeline_value();\n\n\t\tk3d::mesh::selection_t& output_point_selection = Output.point_selection.writable();\n\n\t\tfor(k3d::uint_t i = 0; i != Input.primitives.size(); ++i)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, Output.primitives[i]));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = polyhedron->face_selections.size();\n\t\t\tk3d::mesh::selection_t input_selected_faces(face_end - face_begin, 0.0);\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tif(polyhedron->face_selections[face])\n\t\t\t\t{\n\t\t\t\t\tinput_selected_faces[face] = 1.;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst k3d::uint_t loop_begin = polyhedron->face_first_loops[face];\n\t\t\t\tconst k3d::uint_t loop_end = loop_begin + polyhedron->face_loop_counts[face];\n\t\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t first_edge = polyhedron->loop_first_edges[loop];\n\t\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(polyhedron->edge_selections[edge] || polyhedron->vertex_selections[edge] || output_point_selection[polyhedron->vertex_points[edge]])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinput_selected_faces[face] = 1.;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tedge = polyhedron->clockwise_edges[edge];\n\t\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tk3d::mesh::selection_t output_selection(face_end - face_begin, 0.0);\n\t\t\tconnected_faces_selector selector(*polyhedron, output_selection, array_name, m_same_attributes.pipeline_value());\n\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t{\n\t\t\t\tif(input_selected_faces[face])\n\t\t\t\t\tselector.select_connected_faces(face);\n\t\t\t}\n\n\t\t\tif(select_faces)\n\t\t\t\tpolyhedron->face_selections.assign(output_selection.begin(), output_selection.end());\n\t\t\tadd_selections(output_selection, select_edges, select_vertices, select_points, *polyhedron, output_point_selection);\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_connected_components,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xe54a08e3, 0x014445d3, 0x5395c8a6, 0xb3bfaae3),\n\t\t\t\t\"SelectConnectedComponents\",\n\t\t\t\t_(\"Select all components that are directly or indirectly connected to the selected component\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t/// Recurse through faces, selecting all connected faces\n\tstruct connected_faces_selector\n\t{\n\t\tconst k3d::polyhedron::const_primitive& m_polyhedron;\n\t\tk3d::mesh::selection_t& m_output_selection;\n\t\tk3d::mesh::bools_t m_boundary_edges;\n\t\tk3d::mesh::indices_t m_adjacent_edges;\n\t\tk3d::mesh::indices_t m_edge_faces;\n\t\tboost::shared_ptr<detail::iarray_wrapper> m_face_array_wrapper;\n\t\tconst k3d::bool_t m_use_attributes;\n\t\tconnected_faces_selector(const k3d::polyhedron::const_primitive& Polyhedron, k3d::mesh::selection_t& OutputFaceSelection, const std::string& ArrayName, const k3d::bool_t UseAttributes) : m_polyhedron(Polyhedron), m_output_selection(OutputFaceSelection), m_use_attributes(UseAttributes)\n\t\t{\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(m_polyhedron.vertex_points, m_polyhedron.clockwise_edges, m_boundary_edges, m_adjacent_edges);\n\t\t\tk3d::polyhedron::create_edge_face_lookup(m_polyhedron, m_edge_faces);\n\t\t\tm_face_array_wrapper = detail::wrap_array(Polyhedron.face_attributes.lookup(ArrayName));\n\t\t}\n\n\t\tvoid select_connected_faces(const k3d::uint_t Face)\n\t\t{\n\t\t\tif(m_output_selection[Face])\n\t\t\t\treturn;\n\t\t\tm_output_selection[Face] = 1.0;\n\t\t\tconst k3d::uint_t loop_begin = m_polyhedron.face_first_loops[Face];\n\t\t\tconst k3d::uint_t loop_end = m_polyhedron.face_loop_counts[Face] + loop_begin;\n\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_edge = m_polyhedron.loop_first_edges[loop];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t{\n\t\t\t\t\tif(!m_boundary_edges[edge])\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t companion_face = m_edge_faces[m_adjacent_edges[edge]];\n\t\t\t\t\t\tif(!m_output_selection[companion_face] && (!m_use_attributes || (m_face_array_wrapper && m_face_array_wrapper->compare(Face, companion_face))))\n\t\t\t\t\t\t\tselect_connected_faces(companion_face);\n\t\t\t\t\t}\n\n\t\t\t\t\tedge = m_polyhedron.clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tvoid add_selections(const k3d::mesh::selection_t FaceSelection, const k3d::bool_t SelectEdges, const k3d::bool_t SelectVertices, const k3d::bool_t SelectPoints, k3d::polyhedron::primitive& Polyhedron, k3d::mesh::selection_t& PointSelection)\n\t{\n\t\tconst k3d::uint_t face_begin = 0;\n\t\tconst k3d::uint_t face_end = Polyhedron.face_selections.size();\n\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t{\n\t\t\tif(!FaceSelection[face])\n\t\t\t\tcontinue;\n\n\t\t\tconst k3d::uint_t loop_begin = Polyhedron.face_first_loops[face];\n\t\t\tconst k3d::uint_t loop_end = loop_begin + Polyhedron.face_loop_counts[face];\n\t\t\tfor(k3d::uint_t loop = loop_begin; loop != loop_end; ++loop)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t first_edge = Polyhedron.loop_first_edges[loop];\n\t\t\t\tfor(k3d::uint_t edge = first_edge; ;)\n\t\t\t\t{\n\t\t\t\t\tPolyhedron.edge_selections[edge] = SelectEdges ? 1.0 : 0.0;\n\t\t\t\t\tPolyhedron.vertex_selections[edge] = SelectVertices ? 1.0 : 0.0;\n\t\t\t\t\tPointSelection[Polyhedron.vertex_points[edge]] = SelectPoints ? 1.0 : 0.0;\n\n\t\t\t\t\tedge = Polyhedron.clockwise_edges[edge];\n\t\t\t\t\tif(edge == first_edge)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_select_faces;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_select_edges;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_select_vertices;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_select_points;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_same_attributes;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_array;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_connected_components_factory\n\nk3d::iplugin_factory& select_connected_components_factory()\n{\n\treturn select_connected_components::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_cube.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n  \\author Timothy M. Shead (tshead@k-3d.com)\n  \\author Romain Behar (romainbehar@yahoo.com)\n  */\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/transformable.h>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_cube\n\nclass select_cube :\n\tpublic k3d::gl::renderable<k3d::transformable<k3d::mesh_selection_modifier<k3d::node > > >\n{\n\ttypedef k3d::gl::renderable<k3d::transformable<k3d::mesh_selection_modifier<k3d::node > > > base;\n\npublic:\n\tselect_cube(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_x1(init_owner(*this) + init_name(\"x1\") + init_label(_(\"X1\")) + init_description(_(\"X coordinate of cube's min corner\")) + init_value(-10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_y1(init_owner(*this) + init_name(\"y1\") + init_label(_(\"Y1\")) + init_description(_(\"Y coordinate of cube's min corner\")) + init_value(-10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z1(init_owner(*this) + init_name(\"z1\") + init_label(_(\"Z1\")) + init_description(_(\"Z coordinate of cube's min corner\")) + init_value(-10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_x2(init_owner(*this) + init_name(\"x2\") + init_label(_(\"X2\")) + init_description(_(\"X coordinate of cube's max corner\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_y2(init_owner(*this) + init_name(\"y2\") + init_label(_(\"Y2\")) + init_description(_(\"Y coordinate of cube's max corner\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance))),\n\t\tm_z2(init_owner(*this) + init_name(\"z2\") + init_label(_(\"Z2\")) + init_description(_(\"Z coordinate of cube's max corner\")) + init_value(10.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::distance)))\n\t{\n\t\tm_x1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t\tm_y1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t\tm_z1.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t\tm_x2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t\tm_y2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t\tm_z2.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::bounding_box3 cube(\n\t\t\t\tm_x1.pipeline_value(),\n\t\t\t\tm_x2.pipeline_value(),\n\t\t\t\tm_y1.pipeline_value(),\n\t\t\t\tm_y2.pipeline_value(),\n\t\t\t\tm_z1.pipeline_value(),\n\t\t\t\tm_z2.pipeline_value());\n\n\t\tif(!Input.points)\n\t\t\treturn;\n\t\tif(!Input.point_selection)\n\t\t\treturn;\n\n\t\tconst k3d::mesh::points_t& points = *Output.points;\n\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\n\t\tconst k3d::uint_t point_begin = 0;\n\t\tconst k3d::uint_t point_end = point_begin + points.size();\n\t\tfor(k3d::uint_t point = point_begin; point != point_end; ++point)\n\t\t\tpoint_selection[point] = cube.contains(points[point]);\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tglDisable(GL_LIGHTING);\n\t\tglColor3d(1, 0, 0);\n\n\t\tconst k3d::bounding_box3 cube(m_x1.pipeline_value(), m_x2.pipeline_value(), m_y1.pipeline_value(), m_y2.pipeline_value(), m_z1.pipeline_value(), m_z2.pipeline_value());\n\t\tif(cube.empty())\n\t\t\treturn;\n\n\t\tk3d::gl::draw_bounding_box(cube);\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_cube,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\t\tk3d::uuid(0xd4d45c53, 0x7dd84306, 0x909462d9, 0xa45b7f4f),\n\t\t\t\t\t\"SelectCube\",\n\t\t\t\t\t_(\"Selects portions of the input mesh that intersect a cube\"),\n\t\t\t\t\t\"Selection\",\n\t\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x1;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y1;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z1;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_x2;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_y2;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_z2;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_cube_factory\n\nk3d::iplugin_factory& select_cube_factory()\n{\n\treturn select_cube::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_cubic_curve_by_number.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/cubic_curve.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_cubic_curve_by_number\n\nclass select_cubic_curve_by_number :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tselect_cubic_curve_by_number(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_primitive(init_owner(*this) + init_name(\"primitive\") + init_label(_(\"Primitive Number\")) + init_description(_(\"Primitive Number.\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_index(init_owner(*this) + init_name(\"index\") + init_label(_(\"Curve Number\")) + init_description(_(\"Curve Number.\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t\tm_primitive.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\n\t\tm_index.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t primitive = m_primitive.pipeline_value();\n\t\tif(primitive >= Output.primitives.size())\n\t\t\treturn;\n\n\t\tboost::scoped_ptr<k3d::cubic_curve::primitive> curves(k3d::cubic_curve::validate(Output, Output.primitives[primitive]));\n\t\tif(!curves)\n\t\t\treturn;\n\t\t\n\t\tstd::fill(curves->curve_selections.begin(), curves->curve_selections.end(), 0.0);\n\n\t\tconst k3d::int32_t index = m_index.pipeline_value();\n\t\tif(index < curves->curve_selections.size())\n\t\t\tcurves->curve_selections[index] = 1.0;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_cubic_curve_by_number,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0x71ade41f, 0xb041bcaa, 0x303f68ad, 0x5bac6d66),\n\t\t\t\t\"SelectCubicCurveByNumber\",\n\t\t\t\t_(\"Selects a cubic curve from based on its index number.\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_primitive;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_cubic_curve_by_number_factory\n\nk3d::iplugin_factory& select_cubic_curve_by_number_factory()\n{\n\treturn select_cubic_curve_by_number::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_degenerate_faces.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_degenerate_faces\n\nclass select_degenerate_faces :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tselect_degenerate_faces(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(polyhedron)\n\t\t\t{\n\t\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\t\tconst k3d::uint_t face_end = polyhedron->face_first_loops.size();\n\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::normal3 normal = k3d::polyhedron::normal(polyhedron->vertex_points, polyhedron->clockwise_edges, *Output.points, polyhedron->loop_first_edges[polyhedron->face_first_loops[face]]);\n\t\t\t\t\tpolyhedron->face_selections[face] = normal.length2() ? 0.0 : 1.0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_degenerate_faces,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0xeb11cc78, 0xd345dad0, 0xc87e38b1, 0xe87b09a6),\n\t\t\t\t\"SelectDegenerateFaces\",\n\t\t\t\t_(\"Selects all faces with a zero-length normal\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_degenerate_faces_factory\n\nk3d::iplugin_factory& select_degenerate_faces_factory()\n{\n\treturn select_degenerate_faces::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_edge_by_number.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_edge_by_number\n\nclass select_edge_by_number :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tselect_edge_by_number(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_primitive(init_owner(*this) + init_name(\"primitive\") + init_label(_(\"Primitive Number\")) + init_description(_(\"Primitive Number.\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_index(init_owner(*this) + init_name(\"index\") + init_label(_(\"Face Index\")) + init_description(_(\"Face Index\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t\tm_primitive.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\n\t\tm_index.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t primitive = m_primitive.pipeline_value();\n\t\tif(primitive >= Output.primitives.size())\n\t\t\treturn;\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, Output.primitives[primitive]));\n\t\tif(!polyhedron)\n\t\t\treturn;\n\t\t\n\t\tstd::fill(polyhedron->edge_selections.begin(), polyhedron->edge_selections.end(), 0.0);\n\n\t\tconst k3d::int32_t index = m_index.pipeline_value();\n\t\tif(index < polyhedron->edge_selections.size())\n\t\t\tpolyhedron->edge_selections[index] = 1.0;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_edge_by_number,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0xbd824e9e, 0xe6440236, 0x9bb4bc9a, 0x7348e267),\n\t\t\t\t\"SelectEdgeByNumber\",\n\t\t\t\t_(\"Selects an edge from the input mesh by its index number\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_primitive;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_edge_by_number_factory\n\nk3d::iplugin_factory& select_edge_by_number_factory()\n{\n\treturn select_edge_by_number::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_edgeloops.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_edge_loops\n\nclass select_edge_loops :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_selection_modifier<k3d::node> >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_selection_modifier<k3d::node> > base;\n\npublic:\n\tselect_edge_loops(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_ring_side_a(init_owner(*this) + init_name(\"ring_side_a\") + init_label(_(\"Ring Side A\")) + init_description(_(\"Find loop using the edgering on one side of the selected edge(s)\")) + init_value(false)),\n\t\tm_ring_side_b(init_owner(*this) + init_name(\"ring_side_b\") + init_label(_(\"Ring Side B\")) + init_description(_(\"Find loop using the edgering on the other side of the selected edge(s)\")) + init_value(false))\n\t{\n\t\tm_mesh_selection.property_changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\n\t\tm_ring_side_a.property_changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\n\t\tm_ring_side_b.property_changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_edge_loops,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0x6f42e16a, 0x99804f99, 0xa00528d3, 0x702f015c),\n\t\t\t\t\"SelectEdgeLoops\",\n\t\t\t\t_(\"Selects edge loops containing selected edges\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\t\nprivate:\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::bool_t a_side = m_ring_side_a.pipeline_value();\n\t\tconst k3d::bool_t b_side = m_ring_side_b.pipeline_value();\n\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tm_companions.clear();\n\t\t\tm_valences.clear();\n\t\t\tm_boundary_edges.clear();\n\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, m_boundary_edges, m_companions);\n\t\t\tk3d::polyhedron::create_point_valence_lookup(Output.points->size(), polyhedron->vertex_points, m_valences);\n\t\t\t\n\t\t\tconst k3d::mesh::selection_t original_edge_selections = polyhedron->edge_selections;\n\t\t\n\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\tconst k3d::uint_t edge_end = edge_begin + original_edge_selections.size();\n\t\n\t\t\tif(!a_side && !b_side) // Use the classical algorithm\n\t\t\t{\n\t\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::double_t selection_weight = original_edge_selections[edge];\n\t\t\t\t\tif(selection_weight)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(k3d::uint_t loopedge = edge; ; )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpolyhedron->edge_selections[loopedge] = selection_weight;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(m_valences[polyhedron->vertex_points[polyhedron->clockwise_edges[loopedge]]] != 4) // Next edge in loop is ambiguous\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(m_boundary_edges[polyhedron->clockwise_edges[loopedge]]) // No companion\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tloopedge = polyhedron->clockwise_edges[m_companions[polyhedron->clockwise_edges[loopedge]]];\n\t\t\t\t\t\t\tif(loopedge == edge) // loop complete\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // Use the edgerings on either side of the edge\n\t\t\t{\n\t\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t\t{\n\t\t\t\t\tk3d::double_t selection_weight = polyhedron->edge_selections[edge];\n\t\t\t\t\tif(selection_weight)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!m_boundary_edges[edge] && polyhedron->edge_selections[m_companions[edge]] && m_companions[edge] > edge)\n\t\t\t\t\t\t\tcontinue; // we'll catch this one when we reach its companion\n\t\t\t\t\t\tif(a_side)\n\t\t\t\t\t\t\tselect_with_edgering(selection_weight, polyhedron->clockwise_edges[edge], polyhedron->clockwise_edges, polyhedron->edge_selections);\n\t\t\t\t\t\tif(b_side && !m_boundary_edges[edge])\n\t\t\t\t\t\t\tselect_with_edgering(selection_weight, polyhedron->clockwise_edges[m_companions[edge]], polyhedron->clockwise_edges, polyhedron->edge_selections);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// Select an edge loop at the side of an edgering starting at Edge\n\tvoid select_with_edgering(const k3d::double_t SelectionWeight, const k3d::uint_t Edge, const k3d::mesh::indices_t& ClockwiseEdges, k3d::mesh::selection_t& TargetSelection)\n\t{\n\t\tfor (k3d::uint_t ringedge = Edge; ; )\n\t\t{\n\t\t\t\n\t\t\tif (ClockwiseEdges[ClockwiseEdges[ClockwiseEdges[ClockwiseEdges[ringedge]]]] != ringedge) // Not a quad\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tk3d::uint_t transverse_edge = ClockwiseEdges[ClockwiseEdges[ringedge]];\n\t\t\tk3d::uint_t loopedge = ClockwiseEdges[transverse_edge];\n\t\t\tTargetSelection[loopedge] = SelectionWeight;\n\t\t\tif (!m_boundary_edges[loopedge])\n\t\t\t\tTargetSelection[m_companions[loopedge]] = SelectionWeight;\n\t\t\t\n\t\t\tif (m_boundary_edges[transverse_edge]) // No companion\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tringedge = m_companions[transverse_edge];\n\t\t\t\n\t\t\tif (ringedge == Edge) // loop complete\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tk3d::mesh::indices_t m_companions;\n\tk3d::mesh::bools_t m_boundary_edges;\n\tk3d::mesh::counts_t m_valences;\n\t\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_ring_side_a;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_ring_side_b;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_edgeloops_factory\n\nk3d::iplugin_factory& select_edgeloops_factory()\n{\n\treturn select_edge_loops::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_edgerings.cpp",
    "content": "// K-3D\n// Copyright (c) 2005, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_edge_rings\n\nclass select_edge_rings :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_selection_modifier<k3d::node> >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_selection_modifier<k3d::node> > base;\npublic:\n\tselect_edge_rings(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.property_changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_edge_rings,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0x7e34dbd5, 0xbe9847b2, 0xac9f313e, 0xe1dcbb68),\n\t\t\t\t\"SelectEdgeRings\",\n\t\t\t\t_(\"Selects edge rings containing selected edges\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\t\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\t\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\t\n\t\t\tk3d::mesh::indices_t companions;\n\t\t\tk3d::mesh::bools_t boundary_edges;\n\t\t\tk3d::mesh::counts_t valences;\n\n\t\t\tk3d::polyhedron::create_edge_adjacency_lookup(polyhedron->vertex_points, polyhedron->clockwise_edges, boundary_edges, companions);\n\t\t\tk3d::polyhedron::create_point_valence_lookup(Output.points->size(), polyhedron->vertex_points, valences);\n\t\t\t\n\t\t\tconst k3d::mesh::selection_t original_edge_selections = polyhedron->edge_selections;\n\n\t\t\tconst k3d::uint_t edge_begin = 0;\n\t\t\tconst k3d::uint_t edge_end = edge_begin + original_edge_selections.size();\n\t\t\tfor(k3d::uint_t edge = edge_begin; edge != edge_end; ++edge)\n\t\t\t{\n\t\t\t\tconst k3d::double_t selection_weight = original_edge_selections[edge];\n\t\t\t\tif(selection_weight)\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::uint_t ringedge = edge; ; )\n\t\t\t\t\t{\n\t\t\t\t\t\tpolyhedron->edge_selections[ringedge] = selection_weight;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(polyhedron->clockwise_edges[polyhedron->clockwise_edges[polyhedron->clockwise_edges[polyhedron->clockwise_edges[ringedge]]]] != ringedge) // Not a quad\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tk3d::uint_t transverse_edge = polyhedron->clockwise_edges[polyhedron->clockwise_edges[ringedge]];\n\t\t\t\t\t\tpolyhedron->edge_selections[transverse_edge] = selection_weight;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(boundary_edges[transverse_edge]) // No companion\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tringedge = companions[transverse_edge];\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(ringedge == edge) // loop complete\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_edgerings_factory\n\nk3d::iplugin_factory& select_edgerings_factory()\n{\n\treturn select_edge_rings::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_face_by_number.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_face_by_number\n\nclass select_face_by_number :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tselect_face_by_number(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_primitive(init_owner(*this) + init_name(\"primitive\") + init_label(_(\"Primitive Number\")) + init_description(_(\"Primitive Number.\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_index(init_owner(*this) + init_name(\"index\") + init_label(_(\"Face Index\")) + init_description(_(\"Face Index\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t\tm_primitive.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\n\t\tm_index.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t primitive = m_primitive.pipeline_value();\n\t\tif(primitive >= Output.primitives.size())\n\t\t\treturn;\n\n\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, Output.primitives[primitive]));\n\t\tif(!polyhedron)\n\t\t\treturn;\n\t\t\n    std::fill(polyhedron->face_selections.begin(), polyhedron->face_selections.end(), 0.0);\n\n    const k3d::int32_t index = m_index.pipeline_value();\n    if(index < polyhedron->face_selections.size())\n      polyhedron->face_selections[index] = 1.0;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_face_by_number,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0xe6925525, 0xe5aa4bb2, 0xb6e0d3d0, 0xb01d7e91),\n\t\t\t\t\"SelectFaceByNumber\",\n\t\t\t\t_(\"Selects a face from the input mesh by its index number\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_primitive;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_face_by_number_factory\n\nk3d::iplugin_factory& select_face_by_number_factory()\n{\n\treturn select_face_by_number::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_linear_curve_by_number.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_linear_curve_by_number\n\nclass select_linear_curve_by_number :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tselect_linear_curve_by_number(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_primitive(init_owner(*this) + init_name(\"primitive\") + init_label(_(\"Primitive Number\")) + init_description(_(\"Primitive Number.\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_index(init_owner(*this) + init_name(\"index\") + init_label(_(\"Curve Number\")) + init_description(_(\"Curve Number.\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t\tm_primitive.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\n\t\tm_index.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t primitive = m_primitive.pipeline_value();\n\t\tif(primitive >= Output.primitives.size())\n\t\t\treturn;\n\n\t\tboost::scoped_ptr<k3d::linear_curve::primitive> curves(k3d::linear_curve::validate(Output, Output.primitives[primitive]));\n\t\tif(!curves)\n\t\t\treturn;\n\t\t\n\t\tstd::fill(curves->curve_selections.begin(), curves->curve_selections.end(), 0.0);\n\n\t\tconst k3d::int32_t index = m_index.pipeline_value();\n\t\tif(index < curves->curve_selections.size())\n\t\t\tcurves->curve_selections[index] = 1.0;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_linear_curve_by_number,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0x13bc71da, 0x6a4cbbae, 0xcefc039b, 0xae2a18c7),\n\t\t\t\t\"SelectLinearCurveByNumber\",\n\t\t\t\t_(\"Selects a linear curve from the input mesh by its index number\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_primitive;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_linear_curve_by_number_factory\n\nk3d::iplugin_factory& select_linear_curve_by_number_factory()\n{\n\treturn select_linear_curve_by_number::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_n_sided.cpp",
    "content": "// K-3D\n// Copyright (c) 2005, Romain Behar\n//\n// Contact: romainbehar@yahoo.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/selection.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_n_sided\n\nclass select_n_sided :\n\tpublic k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::mesh_selection_sink<k3d::node > > base;\n\npublic:\n\tselect_n_sided(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_sides(init_owner(*this) + init_name(\"sides\") + init_label(_(\"Side number\")) + init_description(_(\"Gives chosen side number\")) + init_value(5L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_operation(init_owner(*this) + init_name(\"operator\") + init_label(_(\"Operator\")) + init_description(_(\"Selection operator comparing with side number\")) + init_value(EQUAL) + init_enumeration(operator_values()))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t\tm_sides.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t\tm_operation.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t sides = m_sides.pipeline_value();\n\t\tconst operation_t operation = m_operation.pipeline_value();\n\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\n\t\tfor(k3d::mesh::primitives_t::iterator primitive = Output.primitives.begin(); primitive != Output.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::validate(Output, *primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\tk3d::mesh::counts_t counts;\n\t\t\tk3d::polyhedron::create_loop_edge_count_lookup(*polyhedron, counts);\n\n\t\t\tconst k3d::uint_t face_begin = 0;\n\t\t\tconst k3d::uint_t face_end = face_begin + polyhedron->face_first_loops.size();\n\n\t\t\tswitch(operation)\n\t\t\t{\n\t\t\t\tcase LESS_OR_EQUAL:\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(counts[polyhedron->face_first_loops[face]] <= sides)\n\t\t\t\t\t\t\tpolyhedron->face_selections[face] = 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase EQUAL:\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(counts[polyhedron->face_first_loops[face]] == sides)\n\t\t\t\t\t\t\tpolyhedron->face_selections[face] = 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase GREATER_OR_EQUAL:\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::uint_t face = face_begin; face != face_end; ++face)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(counts[polyhedron->face_first_loops[face]] >= sides)\n\t\t\t\t\t\t\tpolyhedron->face_selections[face] = 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_n_sided,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0x129039f9, 0x7a6d49fc, 0x92c14587, 0x764a8cc3),\n\t\t\t\t\"SelectNSided\",\n\t\t\t\t_(\"Selects points or faces that have numbers of sides within a specified range\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttypedef enum\n\t{\n\t\tLESS_OR_EQUAL,\n\t\tEQUAL,\n\t\tGREATER_OR_EQUAL\n\t} operation_t;\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const operation_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase LESS_OR_EQUAL:\n\t\t\t\tStream << \"less_or_equal\";\n\t\t\t\tbreak;\n\t\t\tcase EQUAL:\n\t\t\t\tStream << \"equal\";\n\t\t\t\tbreak;\n\t\t\tcase GREATER_OR_EQUAL:\n\t\t\t\tStream << \"greater_or_equal\";\n\t\t\t\tbreak;\n\t\t}\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator>>(std::istream& Stream, operation_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"less_or_equal\")\n\t\t\tValue = LESS_OR_EQUAL;\n\t\telse if(text == \"equal\")\n\t\t\tValue = EQUAL;\n\t\telse if(text == \"greater_or_equal\")\n\t\t\tValue = GREATER_OR_EQUAL;\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& operator_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"<= Less-than-or-equal\", \"less_or_equal\", \"Selects components with N or less than N sides\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"= Equal\", \"equal\", \"Selects components with N sides \"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\">= Greater-than-or-equal\", \"greater_or_equal\", \"Selects components with N or greater than N sides \"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tconst k3d::ienumeration_property::enumeration_values_t& component_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Faces\", \"faces\", \"Selects faces\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Points\", \"points\", \"Selects points\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_sides;\n\tk3d_data(operation_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_operation;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_n_sided_factory\n\nk3d::iplugin_factory& select_n_sided_factory()\n{\n\treturn select_n_sided::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_nurbs_curve_by_number.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_nurbs_curve_by_number\n\nclass select_nurbs_curve_by_number :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tselect_nurbs_curve_by_number(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_primitive(init_owner(*this) + init_name(\"primitive\") + init_label(_(\"Primitive Number\")) + init_description(_(\"Primitive Number.\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_index(init_owner(*this) + init_name(\"index\") + init_label(_(\"Curve Index\")) + init_description(_(\"Controls the curve to be selected.\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t\tm_primitive.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\n\t\tm_index.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t primitive = m_primitive.pipeline_value();\n\t\tif(primitive >= Output.primitives.size())\n\t\t\treturn;\n\n\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> nurbs_curve(k3d::nurbs_curve::validate(Output, Output.primitives[primitive]));\n\t\tif(!nurbs_curve)\n\t\t\treturn;\n\n\t\tstd::fill(nurbs_curve->curve_selections.begin(), nurbs_curve->curve_selections.end(), 0.0);\n\n\t\tconst k3d::int32_t index = m_index.pipeline_value();\n\t\tif(index < nurbs_curve->curve_selections.size())\n\t\t\tnurbs_curve->curve_selections[index] = 1.0;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_nurbs_curve_by_number,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0x1acfb17b, 0x024564ec, 0xcbb422b3, 0xddb3ec08),\n\t\t\t\t\"SelectNurbsCurveByNumber\",\n\t\t\t\t_(\"Selects a NURBS curve from the input mesh by its index number\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_primitive;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_nurbs_curve_by_number_factory\n\nk3d::iplugin_factory& select_nurbs_curve_by_number_factory()\n{\n\treturn select_nurbs_curve_by_number::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_nurbs_patch_by_number.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_nurbs_patch_by_number\n\nclass select_nurbs_patch_by_number :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tselect_nurbs_patch_by_number(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_primitive(init_owner(*this) + init_name(\"primitive\") + init_label(_(\"Primitive Number\")) + init_description(_(\"Primitive Number.\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_index(init_owner(*this) + init_name(\"index\") + init_label(_(\"Patch Index\")) + init_description(_(\"Patch Index\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t\tm_primitive.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\n\t\tm_index.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst k3d::int32_t primitive = m_primitive.pipeline_value();\n\t\tif(primitive >= Output.primitives.size())\n\t\t\treturn;\n\n\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> nurbs_patch(k3d::nurbs_patch::validate(Output, Output.primitives[primitive]));\n\t\tif(!nurbs_patch)\n\t\t\treturn;\n\n\t\tstd::fill(nurbs_patch->patch_selections.begin(), nurbs_patch->patch_selections.end(), 0.0);\n\n\t\tconst k3d::int32_t index = m_index.pipeline_value();\n\t\tif(index < nurbs_patch->patch_selections.size())\n\t\t\tnurbs_patch->patch_selections[index] = 1.0;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_nurbs_patch_by_number,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0xf458eedc, 0xab49ab44, 0xefccd384, 0x4c594b19),\n\t\t\t\t\"SelectNurbsPatchByNumber\",\n\t\t\t\t_(\"Selects a NURBS patch from the input mesh by its index number\"),\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_primitive;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_nurbs_patch_by_number_factory\n\nk3d::iplugin_factory& select_nurbs_patch_by_number_factory()\n{\n\treturn select_nurbs_patch_by_number::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_point_by_number.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_point_by_number\n\nclass select_point_by_number :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tselect_point_by_number(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_index(init_owner(*this) + init_name(\"index\") + init_label(_(\"Point Index\")) + init_description(_(\"Point Index\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_index.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tif(Output.point_selection)\n\t\t{\n\t\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\t\t\tstd::fill(point_selection.begin(), point_selection.end(), 0.0);\n\n\t\t\tconst k3d::int32_t index = m_index.pipeline_value();\n\t\t\tif(index < point_selection.size())\n\t\t\t\tpoint_selection[index] = 1.0;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_point_by_number,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0xded6d3a7, 0x65fc4d6d, 0x8b7afff7, 0xdd0785ad),\n\t\t\t\t\"SelectPointByNumber\",\n\t\t\t\t\"Selects a point from the input mesh by its index number\",\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_point_by_number_factory\n\nk3d::iplugin_factory& select_point_by_number_factory()\n{\n\treturn select_point_by_number::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/selection/select_points_above_number.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_selection_modifier.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace selection\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// select_points_above_number\n\nclass select_points_above_number :\n\tpublic k3d::mesh_selection_modifier<k3d::node>\n{\n\ttypedef k3d::mesh_selection_modifier<k3d::node> base;\n\npublic:\n\tselect_points_above_number(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_index(init_owner(*this) + init_name(\"index\") + init_label(_(\"Point Index\")) + init_description(_(\"Point Index\")) + init_value(0L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_index.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::selection_changed> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_selection(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tif(Output.point_selection)\n\t\t{\n\t\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.writable();\n\t\t\tstd::fill(point_selection.begin(), point_selection.end(), 0.0);\n\n\t\t\tconst k3d::int32_t index = m_index.pipeline_value();\n      const k3d::int32_t npoints = point_selection.size();\n      for(k3d::int32_t pt_idx = 0; pt_idx != npoints; ++pt_idx)\n      {\n        if(pt_idx >= index)\n          point_selection[pt_idx] = 1.0;\n      }\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<select_points_above_number,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > > factory(\n\t\t\t\tk3d::uuid(0x01c131dc, 0x821c4bf1, 0xba13bb1e, 0xc73af3a5),\n\t\t\t\t\"SelectPointsAboveNumber\",\n\t\t\t\t\"Selects all points with an index above or equal to the given number\",\n\t\t\t\t\"Selection\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_index;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// select_points_above_number_factory\n\nk3d::iplugin_factory& select_points_above_number_factory()\n{\n\treturn select_points_above_number::get_factory();\n}\n\n} // namespace selection\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/solar/CMakeLists.txt",
    "content": "ADD_SUBDIRECTORY(solpos)\n\nINCLUDE_DIRECTORIES(${solpos_SOURCE_DIR})\n\nK3D_BUILD_MODULE(k3d-solar)\nK3D_CREATE_MODULE_PROXY(k3d-solar)\n\nTARGET_LINK_LIBRARIES(k3d-solar k3d-solar-solpos)\n\n"
  },
  {
    "path": "modules/solar/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Romain Behar (romainbehar@yahoo.com)\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the solar plugin module, to protect public symbols from name clashes with other modules\nnamespace solar\n{\n\nextern k3d::iplugin_factory& position_factory();\n\n} // namespace solar\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::solar::position_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/solar/position.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <solpos.h>\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/value_demand_storage.h>\n#include <k3dsdk/vector3.h>\n\n#include <boost/date_time/posix_time/posix_time.hpp>\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace solar\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// position\n\nclass position :\n\tpublic k3d::node\n{\n\ttypedef k3d::node base;\n\npublic:\n\tposition(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_latitude(init_owner(*this) + init_name(\"latitude\") + init_label(_(\"Latitude\")) + init_description(_(\"Observer latitude (decimal degrees).\")) + init_value(k3d::radians(35.110703)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_longitude(init_owner(*this) + init_name(\"longitude\") + init_label(_(\"Longitude\")) + init_description(_(\"Observer longitude (decimal degrees).\")) + init_value(k3d::radians(-106.609991)) + init_step_increment(k3d::radians(1.0)) + init_units(typeid(k3d::measurement::angle))),\n\t\tm_time(init_owner(*this) + init_name(\"time\") + init_label(_(\"Time\")) + init_description(_(\"Time since 1970-1-1, in seconds.\")) + init_value(0.0) + init_step_increment(1.0) + init_units(typeid(k3d::measurement::time))),\n\t\tm_time_zone_offset(init_owner(*this) + init_name(\"time_zone_offset\") + init_label(_(\"Time Zone Offset\")) + init_description(_(\"Time zone offset in minutes, [-720, +720].  Note that you must adjust the timezone manually to account for daylight savings time.\")) + init_value(-7 * 60)),\n\t\tm_north(init_owner(*this) + init_name(\"north\") + init_label(_(\"North\")) + init_description(_(\"Specifies which direction will be treated as 'North'.\")) + init_value(k3d::vector3(0, -1, 0))),\n\t\tm_east(init_owner(*this) + init_name(\"east\") + init_label(_(\"East\")) + init_description(_(\"Specifies which direction will be treated as 'East'.\")) + init_value(k3d::vector3(1, 0, 0))),\n\t\tm_up(init_owner(*this) + init_name(\"up\") + init_label(_(\"Up\")) + init_description(_(\"Specifies which direction will be treated as 'up'.\")) + init_value(k3d::vector3(0, 0, 1))),\n\t\tm_position(init_owner(*this) + init_name(\"position\") + init_label(_(\"Solar Position\")) + init_description(_(\"Solar position.\")) + init_value(k3d::vector3(0, 0, 1)))\n\t{\n\t\t// Note: all input change events pass through our own on_input_changed() method,\n\t\t// instead of routing directly to the position property.  This gives us a chance\n\t\t// to reset any cached data, and reduces the number of hint mappings if we provide\n\t\t// additional outputs in the future.\n\t\tm_latitude.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_slot()));\n\t\tm_longitude.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_slot()));\n\t\tm_time.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_slot()));\n\t\tm_time_zone_offset.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_slot()));\n\t\tm_north.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_slot()));\n\t\tm_east.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_slot()));\n\t\tm_up.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_slot()));\n\n\t\tm_position.set_update_slot(sigc::mem_fun(*this, &position::compute_position));\n\t}\n\n\tsigc::slot<void, k3d::ihint*> make_slot()\n\t{\n\t\treturn sigc::mem_fun(*this, &position::on_input_changed);\n\t}\n\n\tvoid on_input_changed(k3d::ihint*)\n\t{\n\t\tm_computed_data.reset();\n\t\tm_position.update();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<position> factory(\n\t\t\t\tk3d::uuid(0xc96348f9, 0xc842a921, 0x9389f091, 0xa0c4c1dd),\n\t\t\t\t\"SolarPosition\",\n\t\t\t\t_(\"Calculates the position of the Sun based on observer position, date, and time.\"),\n\t\t\t\t\"Simulation\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_latitude;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_longitude;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_time;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_time_zone_offset;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_north;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_east;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_up;\n\tk3d_data(k3d::vector3, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_position;\n\n\tboost::scoped_ptr<posdata> m_computed_data;\n\n\tposdata& computed_data()\n\t{\n\t\t// Compute solar position using SOLPOS 2.0, developed by the National Renewable Energy Laboratory, http://www.nrel.gov\n\t\t// See http://rredc.nrel.gov/solar/codes_algs/solpos/ for details.\n\n\t\tif(!m_computed_data)\n\t\t{\n\t\t\tm_computed_data.reset(new posdata);\n\t\t\tS_init(m_computed_data.get());\n\n\t\t\tm_computed_data->function &= ~S_DOY;\n\n\t\t\tm_computed_data->latitude = k3d::degrees(m_latitude.pipeline_value());\n\t\t\tm_computed_data->longitude = k3d::degrees(m_longitude.pipeline_value());\n\n\t\t\tconst k3d::double_t input_seconds = m_time.pipeline_value();\n\t\t\tconst k3d::double_t input_whole_seconds = std::floor(input_seconds);\n\t\t\tconst k3d::double_t input_fractional_seconds = input_seconds - input_whole_seconds;\n\n\t\t\tboost::posix_time::ptime input_time = boost::posix_time::from_time_t(static_cast<time_t>(input_whole_seconds));\n\t\t\tinput_time += boost::posix_time::time_duration(0, 0, 0, input_fractional_seconds * boost::posix_time::time_duration::ticks_per_second());\n\t\t\tinput_time -= boost::posix_time::time_duration(0, m_time_zone_offset.pipeline_value(), 0, 0);\n\n\t\t\tm_computed_data->timezone = 0;\n\t\t\tm_computed_data->year = input_time.date().year();\n\t\t\tm_computed_data->month = input_time.date().month();\n\t\t\tm_computed_data->day = input_time.date().day();\n\t\t\tm_computed_data->hour = input_time.time_of_day().hours();\n\t\t\tm_computed_data->minute = input_time.time_of_day().minutes();\n\t\t\tm_computed_data->second = input_time.time_of_day().seconds();\n\n\t\t\tlong result = S_solpos(m_computed_data.get());\n\t\t\tS_decode(result, m_computed_data.get());\n\t\t}\n\n\t\treturn *m_computed_data;\n\t}\n\n\tvoid compute_position(const std::vector<k3d::ihint*>& Hints, k3d::vector3& Position)\n\t{\n\t\tposdata& data = computed_data();\n\n\t\tconst k3d::double_t cos_azimuth = std::cos(k3d::radians(data.azim));\n\t\tconst k3d::double_t sin_azimuth = std::sin(k3d::radians(data.azim));\n\n\t\tconst k3d::double_t cos_elevation = std::cos(k3d::radians(data.elevetr));\n\t\tconst k3d::double_t sin_elevation = std::sin(k3d::radians(data.elevetr));\n\n\t\tPosition = k3d::vector3(0, 0, 0);\n\t\tPosition += cos_elevation * cos_azimuth * k3d::normalize(m_north.pipeline_value());\n\t\tPosition += cos_elevation * sin_azimuth * k3d::normalize(m_east.pipeline_value());\n\t\tPosition += sin_elevation * k3d::normalize(m_up.pipeline_value());\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// position\n\nk3d::iplugin_factory& position_factory()\n{\n\treturn position::get_factory();\n}\n\n} // namespace solar\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/solar/solpos/CMakeLists.txt",
    "content": "# Computes solar position using SOLPOS 2.0, developed by the National Renewable Energy Laboratory, http://www.nrel.gov\n# See http://rredc.nrel.gov/solar/codes_algs/solpos/ for details.\n\nPROJECT(solpos)\n\nK3D_ADD_LIBRARY(k3d-solar-solpos SHARED solpos.cpp solpos.h)\n\nINSTALL(TARGETS k3d-solar-solpos\n\tRUNTIME DESTINATION bin\n\tLIBRARY DESTINATION ${K3D_LIBDIR}\n\tARCHIVE DESTINATION ${K3D_LIBDIR}\n\t)\n\n"
  },
  {
    "path": "modules/solar/solpos/aboutsolpos.html",
    "content": "<HTML>\n<head>\n<title>Solpos: Documentation</title>\n\n<LINK REL=STYLESHEET TYPE=\"TEXT/CSS\" HREF=\"/css/style1.css\"> \n\n</head>\n<body bgcolor=\"#ffffFF\">\n<HR>\n<TABLE BORDER=\"0\" CELLPADDING=\"5\" WIDTH=\"725\">\n  <TD VALIGN=CENTER> &#160 <!IMG SRC=\"/images/sol.gif\"><IMG SRC=\"/images/icons/sol_code.jpg\"></TD>\n    <TD ALIGN=\"LEFT\"><H4 CLASS=\"header1\"><B>NREL's SOLPOS 2.0: Documentation</H4></TD>\n </TR><TR>\n  <TD COLSPAN=\"2\"><HR></TD>\n </TR><TR>\n</TABLE>\n</P><P>\n<FONT SIZE=5>SOLPOS.C</FONT>\n</P><P>\nDistributed by the National Renewable Energy Laboratory\n<BR>\nCenter for Renewable Energy Resources\n<BR>\nRenewable Resource Data Center\n<BR>\nFebruary 2000\n<P>\n<CENTER>\n\n<TABLE BORDER=0 CELLPADDING=2 WIDTH=500>\n<TD ALIGN=\"CENTER\">\n<FONT SIZE=5>NOTICE</FONT>\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP>\nThis report was prepared as an account of work sponsored by an agency of the \nUnited States government. Neither the United States government nor any agency \nthereof, nor any of their employees, makes any warranty, express or implied, or \nassumes an legal liability or responsibility for the accuracy, completeness, or \nusefulness of any information, apparatus, product, or process disclosed, or \nrepresents that its use would not infringe privately owned rights.  Reference \nherein to any specific commercial produce, process or service by trade name, \ntrademark, manufacturer, or otherwise does not necessarily constitute or imply \nits endorsement, recommendation or favoring by the United States government or \nany agency thereof.  The view and opinions of authors expressed herein do not \nnecessarily state or reflect those of the United States government or any agency \nthereof.\n</FONT></TD>\n<TR>\n</TABLE>\n</CENTER>\n \n</P>\n<BR>\n<P>\nThis C function calculates the apparent solar position and intensity \n(theoretical maximum solar energy) based on the date, time, and location on \nEarth.  The software has been tested on a variety of platforms, but as noted \nabove, is not guaranteed to work on yours.  It is provided here as a convenience.\n</P>\n\n<P>This document provides only a general overview of the software functionality.  \nThe accompanying sample program <A HREF=\"stest00.c\">stest00.c</A> provides \nadditional information by \nexample on how the function is set up and called from an application program.  \nThat program serves as the only tutorial for the use of S_solpos.</P>\n\n<P>The module contains three functions:</P>\n<P>\n<TABLE BORDER=0 CELLPADDING=2>\n<TD VALIGN=TOP> &#160 </FONT></TD><TD VALIGN=TOP>S_solpos</FONT></TD><TD VALIGN=TOP> &#160 &#160 &#160 </FONT></TD><TD VALIGN=TOP>Performs calculations</FONT></TD><TR>\n<TD VALIGN=TOP> &#160 </FONT></TD><TD VALIGN=TOP>S_init</FONT></TD><TD VALIGN=TOP> &#160 &#160 &#160 </FONT></TD><TD VALIGN=TOP>Initializes S_solpos</FONT></TD><TR>\n<TD VALIGN=TOP> &#160 </FONT></TD><TD VALIGN=TOP>S_decode</FONT></TD><TD VALIGN=TOP> &#160 &#160 &#160 </FONT></TD><TD VALIGN=TOP>Decodes the return value from S_solpos</FONT></TD><TR>\n</TABLE>\n<P>\nTo obtain references for the algorithms see the <A HREF=\"#refs\">REFERENCES</A> \nsection below.  Comments in the source code specify references for each function.</P>\n\n<P>====================================</P>\n<P>\n<FONT FACE=\"Courier New\" SIZE=2>\nS_solpos &#160&#160 (computes solar position and intensity from time and place)\n<DIR>\n  <DIR>INPUTS: &#160&#160 (via posdata struct defined in solpos00.h) \n       <DIR>\n    \t  <DIR>year, daynum, hour, minute, second, latitude, \n    \t\t\t\tlongitude, timezone, interval \n    \t  </DIR>\n       </DIR>\n\t\n       OPTIONAL: &#160(via posdata struct) \n       <DIR>\n    \t  <DIR>month, day, press, temp, tilt, aspect, function\n    \t  </DIR>\n       </DIR>\n       OUTPUTS: &#160 EVERY variable in the struct posdata (defined in solpos00.h)\n  </DIR>\n</DIR>\n\n<P>\n<BR>\nS_init  &#160 &#160 (optional initialization for all input parameters in the posdata struct)\n<DIR>\n  <DIR>INPUTS: &#160&#160 struct posdata*</DIR>\n  <DIR>OUTPUTS: &#160 struct posdata*\n         <DIR>Initializes the required S_solpos INPUTS above to out-of-bounds \n         \tconditions, forcing the user to supply the parameters; initializes the \n         \tOPTIONAL S_solpos inputs above to nominal values.  See listing below \n         \tfor default values provided by S_init.\n         </DIR>\n  </DIR>\n</DIR>\n<P>\n<BR>\nS_decode &#160&#160 (optional utility for decoding the S_solpos return code)\n<DIR>\n  <DIR>INPUTS: &#160&#160 long int S_solpos return value, struct posdata*\n  </DIR>\n  <DIR>OUTOUTS: &#160 Text to stderr\n  </DIR>\n</DIR>\n\n</FONT><P>\n<BR>\n<P>ALPHABETICAL LIST OF COMMON VARIABLES</P>\n<DIR>The I/O column contains a letter code:\n  <DIR>I:  INPUT variable</DIR>\n  <DIR>O:  OUTPUT variabl</DIR>\n  <DIR>T:  TRANSITIONAL variable used in the algorithm, of \n  \t\t\tinterest only to the solar radiation modelers and \n  \t\t\tavailable to you because you may be one of them.\n  </DIR>\n\n\n  <P>\n  The FUNCTION column indicates which sub-function within solpos must be switched \n  on using the \"function\" parameter to calculate the target output variable.  All \n  function codes are defined in the solpos00.h file.  The default S_ALL mask calculates \n  all output variables. Multiple function masks may be ORed to create a composite \n  function switch.  For example, (S_TST | S_SBCF) will force the calculation of the \n  shadow band correction factor as well as all variables required for S_TST (true \n  solar time). Specifying only the functions necessary for required output variables \n  might allow solpos to execute more quickly.\n  <P>\n  The S_DOY mask works as a toggle \n  between the input date represented as a day of year number (daynum) and an input \n  date represented by month and day of month.  To set the switch (to use daynum input), \n  the mask is ORed with the function variable; to clear the switch (to use month and \n  day input), the mask is inverted and ANDed.\n  <P>\n  For example:\n\n  <DIR>&#9;<FONT FACE=\"Courier New\" SIZE=2>pdat-&gt;function |= S_DOY /* \n  \t(sets daynum input) */</DIR>\n  <DIR>&#9;pdat-&gt;function &amp;= ~S_DOY /* (sets month and day input) */</DIR>\n  </FONT>\n<P>\n Whichever date form is used, S_solpos will calculate and return the variables(s) \n \tof the other form.  See the sample program <A HREF=\"stest00.c\">stest00.c</A> \n \tfor other examples.\n</DIR>\n\n\n<TABLE BORDER=0 CELLPADDING=2 WIDTH=440>\n<FONT FACE=\"Courier New\" SIZE=2>\n<TH VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>VARIABLE</FONT></TD>\n  <TH VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I/O</FONT></TD>\n    <TH VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Function</FONT></TD>\n      <TH VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Description</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>--------------------</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>-------</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>----------------</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>--------------------------------------------------------</FONT></TD>\n<TR>\n<TD COLSPAN=2 ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>/**** INTEGERS ****/</FONT></TD>\n  <TD VALIGN=TOP> </FONT></TD>\n    <TD VALIGN=TOP> </FONT></TD>\n      <TD VALIGN=TOP> </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>int   day</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I/O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_DOY </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> Day of month (May 27 = 27, etc.)\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>solpos will CALCULATE this by default, \n            \tor will optionally require it as input depending on the setting \n            \tof the S_DOY function switch.\n              </FONT></TD>\n              <TR>\n          </TABLE>\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>int   daynum</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I/O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_DOY</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Day number (day of year; Feb 1 = 32 )\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>solpos REQUIRES this by default, but will optionally calculate \n                it from year, month, and day depending on the setting of the \n                S_DOY function switch.\n              </FONT></TD>\n              <TR>\n          </TABLE>\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>int   function</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Bit-oriented switch to choose function)\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>for desired output..</FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>int   hour</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Hour of day, 0 &#151; 24. (Time 24:00:00 is \n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>treated internally as time \n              00:00:00 of the following day.)</FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>int   interval</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Interval of a measurement period in seconds.\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Forces solpos to use the \n                time and date \n              \tfrom the interval midpoint. The INPUT time (hour, minute, and \n              \tsecond) is assumed to be the END of the measurement interval.</FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>int   minute</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Minute of hour, 0 - 59. </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>int   month</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I/O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_DOY</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Month number (Jan = 1, Feb = 2, etc.)\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>solpos will CALCULATE this \n                by default or will optionally \n               require it as input depending on the setting of the S_DOY \n               function switch.</FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>int   second</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I: </FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Second of minute, 0 - 59. </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>int   year</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>4-digit year (2-digit years NOT allowed)</FONT></TD>\n\n<TR>\n<TD COLSPAN=2 ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>/**** FLOATS ****/</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n<TR>\n\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float amass</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_AMASS</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Relative optical airmass</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float ampress</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_AMASS</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> Pressure-corrected airmass  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float aspect</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Azimuth of panel surface\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>(direction it faces) N=0, E=90, S=180, W=270, DEFAULT = 180\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float azim</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_SOLAZM</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Solar azimuth angle:\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>N=0, E=90, S=180,W=270\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float cosinc</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_TILT</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Cosine of solar incidence angle on panel </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float coszen</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_REFRAC</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> Cosine of refraction corrected solar zenith angle</FONT></TD>\n<TR>\n\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float dayang</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> Day angle (daynum*360/year-length) degrees</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float declin</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Declination--zenith angle of solar noon\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>at equator, degrees NORTH\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float eclong</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Ecliptic longitude, degrees  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float ecobli</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Obliquity of ecliptic  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float ectime</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Time of ecliptic calculations</FONT></TD>  \n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float elevetr</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_REFRAC</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Solar elevation, no atmospheric \n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>correction (= ETR)\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float elevref</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_REFRAC</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Solar elevation angle, degrees from \n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>horizon, refracted\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float eqntim</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_TST</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Equation of time (TST - LMT), minutes  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float erv </FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Earth radius vector(multiplied to solar constant)</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float etr</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_ETR</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Extraterrestrial (top-of-atmosphere)\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>W/sq m global horizontal solar irradiance\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float etrn</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_ETR</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Extraterrestrial (top-of-atmosphere)\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>W/sq m direct normal solar irradiance\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float etrtilt</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_TILT </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> Extraterrestrial (top-of-atmosphere)\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>W/sq m global irradiance on a tilted surface\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float gmst</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Greenwich mean sidereal time, hours  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float hrang</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> Hour angle--hour of sun from solar noon\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>degrees WEST \n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float julday</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Julian Day of 1 JAN 2000 minusn\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>2,400,000 days (in order to regain single precision)\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float latitude</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>  </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Latitude, degrees north (south negative)</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float longitude</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>  </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Longitude, degrees east (west negative)</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float lmst</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> Local mean sidereal time, degrees</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float mnanom</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> Mean anomaly, degrees</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float mnlong</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> Mean longitude, degrees</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float rascen</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> Right ascension, degrees</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float press</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>  </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Surface pressure, millibars, used for\n        <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>refraction correction and ampress\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float prime</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_PRIME</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Factor that normalizes Kt, Kn, etc.</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float sbcf</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_SBCF</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Shadow-band correction factor  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float sbwid</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>  </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Shadow-band width (cm)  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float sbrad</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>  </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Shadow-band radius (cm)  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float  sbsky</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>  </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Shadow-band sky facto  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float solcon</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>  </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Solar constant (NREL uses 1367 W/sq m)</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float ssha</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> S_SRHA</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Sunset(/rise) hour angle, degrees  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float sretr</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_SRSS</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Sunrise time, minutes from midnight,\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>local, WITHOUT refraction\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float ssetr</TS>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_SRSS </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Sunset time, minutes from midnight,\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>local, WITHOUT refraction\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float temp</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>  </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Ambient dry-bulb temperature, degrees C,\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>used for refraction correction\n              </FONT></TD>\n              <TR>\n          </TABLE>\n\n     </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float tilt</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>  </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> Degrees tilt from horizontal of panel</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float timezone</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>I:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>  </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Time zone, east (west negative).,\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2><TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>USA:  Mountain = -7, Central = -6, etc.\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float tst</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_TST </FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>True solar time, minutes from midnight</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>floattstfix</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_TST</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>True solar time - local standard time  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float unprime</FONT></TD>\n <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>O:</FONT></TD>\n   <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_PRIME</FONT></TD>\n     <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Factor that denormalizes Kt', Kn', etc. </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float utime</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_GEOM</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Universal (Greenwich) standard time  </FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float zenetr</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>T:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_ZENETR</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Solar zenith angle, no atmospheric\n          <TABLE BORDER=0 CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>correction (= ETR)\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n<TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>float zenref</FONT></TD>\n  <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2> O:</FONT></TD>\n    <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>S_REFRAC</FONT></TD>\n      <TD VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>Solar zenith angle, deg. from zenith,\n          <TABLE \n           CELLPADDING=2>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n              <TD ALIGN=LEFT VALIGN=TOP><FONT FACE=\"Courier New\" SIZE=2>refracted.\n                        </FONT></TD>\n              <TR>\n          </TABLE>\n\n</FONT></TD>\n<TR>\n</FONT>\n</TABLE>\n\n<P>\n<BR>\n<P>All functions require the input parameters for time, date, latitude, longitude, \ntime zone, and measurement interval.  Some functions may require additional input \nparameters. The table below indicates with an &quot;X&quot; which, if any, additional \ninput parameters are required for each function. After determining the output \nvariables you require from the above list, make note of the required functions, \nthen determine the required inputs from the table:\n<P>\n\n<TABLE BORDER=0 CELLPADDING=2>\n<FONT FACE=\"Courier New\" SIZE=2>\n<TH>Function</TH>\n  <TH> &#160 </TH>\n    <TH COLSPAN=8>-------------------- Required Inputs ------------------</TH>\n    <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>solcon</FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>press</FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>sbwid</FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>sbrad</FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>sbsky</FONT></TD>\n              <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>temp</FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>tilt</FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>aspect</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_AMASS</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>--</FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X</FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n              <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_DOY</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n              <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>-- </FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_ETR</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X </FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n              <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_GEOM</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n              <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_REFRAC</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X </FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n              <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_PRIME</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  -- </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X </FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X </FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  -- </FONT></TD>\n                    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_SOLAZM</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>   -- </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  -- </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_SRSS</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  -- </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  -- </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>-- </FONT></TD>\n                    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_SSHA</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  -- </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  -- </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_SBCF</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  -- </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  X </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  X </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_TILT</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>    X </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X </FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  -- </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  X </FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X </FONT></TD>\n                    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> X</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_TST</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>   -- </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>  -- </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TR>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>S_ZENETR</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>   -- </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n            <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> -- </FONT></TD>\n                    <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> --</FONT></TD>\n                    </TR>\n</FONT>\n</TABLE>\n<P>\n<BR>\n\nThe S_init function provides nominal values for the above inputs.  \nThe values are listed below (note that time and location variables \nare initialized out of bounds to force the user to provide valid inputs):\n<P>\n<BR>\n\n<TABLE BORDER=0 CELLPADDING=1>\n<FONT FACE=\"Courier New\" SIZE=2>\n<TD><FONT FACE=\"Courier New\" SIZE=2>day      </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>   -99</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* undefined */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>daynum   </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>  -999</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* undefined */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>hour     </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>   -99</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* undefined */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>minute   </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>   -99</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* undefined */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>month    </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>   -99</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* undefined */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>second   </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>   -99</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* undefined */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>year     </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>   -99</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* undefined */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>interval </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>     0</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* instantaneous */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>aspect   </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> 180.0</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* south */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>latitude </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> -99.0</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* undefined */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>longitude</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>-999.0</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* undefined */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>press    </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>1013.0</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* standard pressure */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>solcon   </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>1367.0</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* NREL uses this */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>temp     </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>  15.0</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* Temperature of the standard atmosphere */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>tilt     </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>   0.0</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* horizontal */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>timezone </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> -99.0</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* undefined */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>sbwid    </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>   7.6</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* Eppley shadowband */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>sbrad    </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>  31.7</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* Eppley shadowband */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>sbsky    </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>  0.04</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* Eppley shadowband */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>function </FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2> = </FONT></TD>\n    <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> S_ALL</FONT></TD>\n      <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /* calculate ALL output parameters */</FONT></TD>\n<TR>\n</FONT>\n</TABLE>\n\n<P>\nCertain conditions exist during which some of the output variables \nare undefined or cannot be calculated.  In these cases, the variables \nare returned with flag values indicating such.  In other cases, the \nvariables may return a realistic, though invalid, value. These variables \nand the flag values or invalid conditions are listed below:\n<P>\n<BR>\n\n<TABLE BORDER=0 CELLPADDING=1>\n<FONT FACE=\"Courier New\" SIZE=2>\n<TD><FONT FACE=\"Courier New\" SIZE=2>amass</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>-1.0 at zenetr angles greater than 93.0 degrees</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>ampress</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>-1.0 at zenetr angles greater than 93.0 degrees<</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>azim</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>invalid at zenetr angle 0.0 or latitude +/-90.0 or at night</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>elevetr</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>limited to &#151;9 degrees at night</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>etr</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>0.0 at night</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>etrn</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>0.0 at night</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>etrtilt</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>0.0 when cosinc is less than 0</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>prime</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>invalid at zenetr angles greater than 93.0 degrees</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>sretr</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>+/- 2999.0 during periods of 24 hour sunup or sundown</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>ssetr</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>+/- 2999.0 during periods of 24 hour sunup or sundown</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>ssha</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>invalid at the North and South Poles</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>unprime</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>invalid at zenetr angles greater than 93.0 degrees</FONT></TD>\n    <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2>zenetr</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> &#160 &#160 </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>limited to 99.0 degrees at night </FONT></TD>\n    <TR>\n</FONT>\n</TABLE>\n\n<P>\n<BR>\nS_solpos returns a long integer error code.  Each bit position in the long \nint represents an error in the range of a particular input parameter.  \nThe S_decode function in solpos.c examines the return code for errors and can \nbe used as is or as a template for building an application-specific function.\n</P>\n<P>\nThe bit positions for each error are defined in solpos00.h, and are listed below. \n(Bit positions are from least significant to most significant.)\n<P>\n<TABLE BORDER=0 CELLPADDING=1>\n<FONT FACE=\"Courier New\" SIZE=2>\n<TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>/*</FONT></TD>\n  <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>Code</FONT></TD>\n    <TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n      <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>Bit</FONT></TD>\n        <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>Parameter</FONT></TD>\n          <TD ALIGN=CENTER><FONT FACE=\"Courier New\" SIZE=2>Range</FONT></TD>\n            <TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n          <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2> ===============</FONT></TD>\n    <TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n      <TD><FONT FACE=\"Courier New\" SIZE=2> ===</FONT></TD>\n        <TD><FONT FACE=\"Courier New\" SIZE=2> ===================</FONT></TD>\n          <TD><FONT FACE=\"Courier New\" SIZE=2> ========= </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> */</FONT></TD>\n<TR>\n\n<TD><FONT FACE=\"Courier New\" SIZE=2>enum</FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>{S_YEAR_ERROR,  </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>0 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>year </FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>1950 -  2050</FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>S_MONTH_ERROR, </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>1 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2> month </FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>1 -    12   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_DAY_ERROR,   </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>2  &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>day-of-month </FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>1 -    31   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_DOY_ERROR,   </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>3 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>day-of-year </FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>1 -   366   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_HOUR_ERROR,  </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>4 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>hour</FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> 0 -    24   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_MINUTE_ERROR,</FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>5 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2> minute </FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> 0 -    59   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_SECOND_ERROR,</FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>6 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>second </FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>0 -    59   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_TZONE_ERROR, </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>7 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>time zone</FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>-12 -    12   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_INTRVL_ERROR,</FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>8 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>interval (seconds)</FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>0 - 28800   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_LAT_ERROR,   </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>9 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>latitude</FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>-90 -    90   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_LON_ERROR,   </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>10 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>longitude </FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>-180 -   180   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_TEMP_ERROR,  </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>11 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>temperature (deg. C)</FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>-100 -   100   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_PRESS_ERROR, </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>12 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>pressure (millibars)</FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> 0 -  2000   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_TILT_ERROR,  </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>13 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>tilt </FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> -90 -    90   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_ASPECT_ERROR,</FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>14 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>aspect </FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> -360 -   360   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_SBWID_ERROR, </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>15 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2> shadow band width (cm)</FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> 1 -   100   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_SBRAD_ERROR, </FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>16 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2> shadow band radius (cm)</FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>1 -   100   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n            <TR>\n<TD><FONT FACE=\"Courier New\" SIZE=2> </FONT></TD>\n  <TD><FONT FACE=\"Courier New\" SIZE=2>    S_SBSKY_ERROR};</FONT></TD>\n    <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2>  &#160 &#160 /*  </FONT></TD>\n      <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>17 &#160 </FONT></TD>\n        <TD ALIGN=LEFT><FONT FACE=\"Courier New\" SIZE=2> shadow band sky factor</FONT></TD>\n          <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2>-1 -     1   </FONT></TD>\n            <TD ALIGN=RIGHT><FONT FACE=\"Courier New\" SIZE=2> &#160 */</FONT></TD>\n <TR>\n </FONT>\n</TABLE>\n<P>\n<A NAME=\"refs\">\n<HR>\n<P>\n<P>R E F E R E N C E S</P>\n</A>\n\n<P>ASTRONOMICAL SOLAR POSITION:</P>\n<P>\n<TABLE BORDER=0 CELLPADDING=0 WIDTH=450>\n  <TD COLSPAN=2>Michalsky, J. 1988. The Astronomical Almanac's algorithm for approximate solar</TD>\n  <TR>\n  <TD> &#160 &#160 </TD>\n    <TD>position (1950-2050). Solar Energy 40 (3), 227-235.</TD>\n    <TR>\n  <TD COLSPAN=2> Michalsky, J. 1988. ERRATA: The atronomical almanac's algorithm for approximate</TD>\n  <TR>\n  <TD> &#160 &#160 </TD>\n    <TD>solar position (1950-2050). Solar Energy 41 (1), 113.</TD>\n    <TR>\n</TABLE>\n\n<P>\n\n DISTANCE FROM SUN TO EARTH</P>\n\n<TABLE BORDER=0 CELLPADDING=0 WIDTH=450>\n  <TD COLSPAN=2>Spencer, J. W. 1971. Fourier series representation of \n  \tthe position of the sun. Search 2</TD>\n  <TR>\n  <TD> &#160 &#160 </TD>\n    <TD>(5), 172.</TD>\n      <TR>\n      <TD COLSPAN=2> &#160 </TD>\n      <TR>\n   <TD> &#160 &#160 </TD>\n    <TD>NOTE: This paper gives solar position algorithms as well, but \n    \tthe Michalsky/Almanac algorithm above is more accurate.</TD>\n    <TR>\n</TABLE>\n\n<P>\n\nATMOSPHERIC REFRACTION CORRECTION</P>\n<P>\n<TABLE BORDER=0 CELLPADDING=1 WIDTH=450>\n  <TD COLSPAN=2> Zimmerman, John C. 1981. Sun-pointing programs and \n  \ttheir accuracy. SAND81-0761,</TD>\n  <TR>\n  <TD> &#160 &#160 </TD>\n    <TD>Experimental Systems Operation Division 4721, Sandia National \n    \tLaboratories, Albuquerque, NM.</TD>\n    <TR>\n</TABLE>\n\n<P>\n\nSHADOW BAND CORRECTION FACTOR</P>\n<P>\n<TABLE BORDER=0 CELLPADDING=1 WIDTH=450>\n  <TD COLSPAN=2>Drummond, A. J. 1956. A contribution to absolute pyrheliometry. \n  \tQ. J. R. Meteorol.2</TD>\n  <TR>\n  <TD> &#160 &#160 </TD>\n    <TD>Soc. 82, 481-493..</TD>\n    <TR>\n</TABLE>\n\n<P>\n\nRELATIVE OPTICAL AIR MASS</P>\n<P>\n\n<TABLE BORDER=0 CELLPADDING=1 WIDTH=450>\n  <TD COLSPAN=2>Kasten, F. and Young, A. 1989. Revised optical air mass \n  tables and approximation</TD>\n  <TR>\n  <TD> &#160 &#160 </TD>\n    <TD>formula. Applied Optics 28 (22), 4735-4738.</TD>\n    <TR>\n</TABLE>\n\n<P>\n\nRENORMALIZATION OF KT (\"PRIME\")</P>\n<P>\n<TABLE BORDER=0 CELLPADDING=1 WIDTH=450>\n  <TD COLSPAN=2> Perez, R., P. Ineichen, Seals, R., &amp; Zelenka, A. 1990. \n  Making full use of the clearness</TD>\n  <TR>\n  <TD> &#160 &#160 </TD>\n    <TD>index for parameterizing hourly insolation \n  conditions. Solar Energy 45 (2),</TD>\n  <TR>\n  <TD> &#160 &#160 </TD>\n    <TD>111-114.</TD>\n    <TR>\n</TABLE>\n\n\n<P>\n\nSOLAR POSITION RELATIVE TO EARTH</P>\n\n<P>\n<TABLE BORDER=0 CELLPADDING=1 WIDTH=450>\n  <TD COLSPAN=2> Iqbal, M. 1983. An Introduction to Solar Radiation. Academic Press, NY.</TD>\n  <TR>\n  <TD COLSPAN=2> &#160 </TD>\n  <TR>\n  <TD> &#160 &#160 </TD>\n    <TD>\n<P>NOTE: The 1983 edition contains typographic errors in coefficients of some \nequations. Further, many algorithms given in this book are no longer the best. \nHowever, this book gives a complete overview of the issues and methods of measuring \nand modeling solar radiation</P></DIR>\n</TD>\n    <TR>\n</TABLE>\n\n<P>\n<BR>\n\n\n<hr>\n\n<a href =\"http://www.nrel.gov/rredc\" CLASS=\"hide\"><img src=\"/gifs/homepg.gif\" align=center></A>\n<a href =\"http://www.nrel.gov/rredc\" CLASS=\"hide\"><FONT SIZE=\"2\" FACE=\"PAPYRUS\">Return to RReDC home page \n(<em> http://www.nrel.gov/rredc</em>)</FONT></a>\n\n<hr>\n</body>\n\n</HTML>\n"
  },
  {
    "path": "modules/solar/solpos/solpos.cpp",
    "content": "/*============================================================================\n*    Contains:\n*        S_solpos     (computes solar position and intensity\n*                      from time and place)\n*\n*            INPUTS:     (via posdata struct) year, daynum, hour,\n*                        minute, second, latitude, longitude, timezone,\n*                        intervl\n*            OPTIONAL:   (via posdata struct) month, day, press, temp, tilt,\n*                        aspect, function\n*            OUTPUTS:    EVERY variable in the struct posdata\n*                            (defined in solpos.h)\n*\n*                       NOTE: Certain conditions exist during which some of\n*                       the output variables are undefined or cannot be\n*                       calculated.  In these cases, the variables are\n*                       returned with flag values indicating such.  In other\n*                       cases, the variables may return a realistic, though\n*                       invalid, value. These variables and the flag values\n*                       or invalid conditions are listed below:\n*\n*                       amass     -1.0 at zenetr angles greater than 93.0\n*                                 degrees\n*                       ampress   -1.0 at zenetr angles greater than 93.0\n*                                 degrees\n*                       azim      invalid at zenetr angle 0.0 or latitude\n*                                 +/-90.0 or at night\n*                       elevetr   limited to -9 degrees at night\n*                       etr       0.0 at night\n*                       etrn      0.0 at night\n*                       etrtilt   0.0 when cosinc is less than 0\n*                       prime     invalid at zenetr angles greater than 93.0\n*                                 degrees\n*                       sretr     +/- 2999.0 during periods of 24 hour sunup or\n*                                 sundown\n*                       ssetr     +/- 2999.0 during periods of 24 hour sunup or\n*                                 sundown\n*                       ssha      invalid at the North and South Poles\n*                       unprime   invalid at zenetr angles greater than 93.0\n*                                 degrees\n*                       zenetr    limited to 99.0 degrees at night\n*\n*        S_init       (optional initialization for all input parameters in\n*                      the posdata struct)\n*           INPUTS:     struct posdata*\n*           OUTPUTS:    struct posdata*\n*\n*                     (Note: initializes the required S_solpos INPUTS above\n*                      to out-of-bounds conditions, forcing the user to\n*                      supply the parameters; initializes the OPTIONAL\n*                      S_solpos inputs above to nominal values.)\n*\n*       S_decode      (optional utility for decoding the S_solpos return code)\n*           INPUTS:     long integer S_solpos return value, struct posdata*\n*           OUTPUTS:    text to stderr\n*\n*    Usage:\n*         In calling program, just after other 'includes', insert:\n*\n*              #include \"solpos00.h\"\n*\n*         Function calls:\n*              S_init(struct posdata*)  [optional]\n*              .\n*              .\n*              [set time and location parameters before S_solpos call]\n*              .\n*              .\n*              int retval = S_solpos(struct posdata*)\n*              S_decode(int retval, struct posdata*) [optional]\n*                  (Note: you should always look at the S_solpos return\n*                   value, which contains error codes. S_decode is one option\n*                   for examining these codes.  It can also serve as a\n*                   template for building your own application-specific\n*                   decoder.)\n*\n*    Martin Rymes\n*    National Renewable Energy Laboratory\n*    25 March 1998\n*\n*    27 April 1999 REVISION:  Corrected leap year in S_date.\n*    13 January 2000 REVISION:  SMW converted to structure posdata parameter\n*                               and subdivided into functions.\n*    01 February 2001 REVISION: SMW corrected ecobli calculation \n*                               (changed sign). Error is small (max 0.015 deg\n*                               in calculation of declination angle)\n*----------------------------------------------------------------------------*/\n#include <math.h>\n#include <string.h>\n#include <stdio.h>\n#include \"solpos.h\"\n\n/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n*\n* Structures defined for this module\n*\n*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/\nstruct trigdata /* used to pass calculated values locally */\n{\n    float cd;       /* cosine of the declination */\n    float ch;       /* cosine of the hour angle */\n    float cl;       /* cosine of the latitude */\n    float sd;       /* sine of the declination */\n    float sl;       /* sine of the latitude */\n};\n\n\n/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n*\n* Temporary global variables used only in this file:\n*\n*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/\n  static int  month_days[2][13] = { { 0,   0,  31,  59,  90, 120, 151,\n                                       181, 212, 243, 273, 304, 334 },\n                                    { 0,   0,  31,  60,  91, 121, 152,\n                                       182, 213, 244, 274, 305, 335 } };\n                   /* cumulative number of days prior to beginning of month */\n\n  static float degrad = 57.295779513; /* converts from radians to degrees */\n  static float raddeg = 0.0174532925; /* converts from degrees to radians */\n\n/*============================================================================\n*    Local function prototypes\n============================================================================*/\nstatic long int validate ( struct posdata *pdat);\nstatic void dom2doy( struct posdata *pdat );\nstatic void doy2dom( struct posdata *pdat );\nstatic void geometry ( struct posdata *pdat );\nstatic void zen_no_ref ( struct posdata *pdat, struct trigdata *tdat );\nstatic void ssha( struct posdata *pdat, struct trigdata *tdat );\nstatic void sbcf( struct posdata *pdat, struct trigdata *tdat );\nstatic void tst( struct posdata *pdat );\nstatic void srss( struct posdata *pdat );\nstatic void sazm( struct posdata *pdat, struct trigdata *tdat );\nstatic void refrac( struct posdata *pdat );\nstatic void amass( struct posdata *pdat );\nstatic void prime( struct posdata *pdat );\nstatic void etr( struct posdata *pdat );\nstatic void tilt( struct posdata *pdat );\nstatic void localtrig( struct posdata *pdat, struct trigdata *tdat );\n\n/*============================================================================\n*    Long integer function S_solpos, adapted from the VAX solar libraries\n*\n*    This function calculates the apparent solar position and the\n*    intensity of the sun (theoretical maximum solar energy) from\n*    time and place on Earth.\n*\n*    Requires (from the struct posdata parameter):\n*        Date and time:\n*            year\n*            daynum   (requirement depends on the S_DOY switch)\n*            month    (requirement depends on the S_DOY switch)\n*            day      (requirement depends on the S_DOY switch)\n*            hour\n*            minute\n*            second\n*            interval  DEFAULT 0\n*        Location:\n*            latitude\n*            longitude\n*        Location/time adjuster:\n*            timezone\n*        Atmospheric pressure and temperature:\n*            press     DEFAULT 1013.0 mb\n*            temp      DEFAULT 10.0 degrees C\n*        Tilt of flat surface that receives solar energy:\n*            aspect    DEFAULT 180 (South)\n*            tilt      DEFAULT 0 (Horizontal)\n*        Function Switch (codes defined in solpos.h)\n*            function  DEFAULT S_ALL\n*\n*    Returns (via the struct posdata parameter):\n*        everything defined in the struct posdata in solpos.h.\n*----------------------------------------------------------------------------*/\nlong S_solpos (struct posdata *pdat)\n{\n  long int retval;\n\n  struct trigdata trigdat, *tdat;\n\n  tdat = &trigdat;   /* point to the structure */\n\n  /* initialize the trig structure */\n  tdat->sd = -999.0; /* flag to force calculation of trig data */\n  tdat->cd =    1.0;\n  tdat->ch =    1.0; /* set the rest of these to something safe */\n  tdat->cl =    1.0;\n  tdat->sl =    1.0;\n\n  if ((retval = validate ( pdat )) != 0) /* validate the inputs */\n    return retval;\n\n\n  if ( pdat->function & L_DOY )\n    doy2dom( pdat );                /* convert input doy to month-day */\n  else\n    dom2doy( pdat );                /* convert input month-day to doy */\n\n  if ( pdat->function & L_GEOM )\n    geometry( pdat );               /* do basic geometry calculations */\n\n  if ( pdat->function & L_ZENETR )  /* etr at non-refracted zenith angle */\n    zen_no_ref( pdat, tdat );\n\n  if ( pdat->function & L_SSHA )    /* Sunset hour calculation */\n    ssha( pdat, tdat );\n\n  if ( pdat->function & L_SBCF )    /* Shadowband correction factor */\n    sbcf( pdat, tdat );\n\n  if ( pdat->function & L_TST )     /* true solar time */\n    tst( pdat );\n\n  if ( pdat->function & L_SRSS )    /* sunrise/sunset calculations */\n    srss( pdat );\n\n  if ( pdat->function & L_SOLAZM )  /* solar azimuth calculations */\n    sazm( pdat, tdat );\n\n  if ( pdat->function & L_REFRAC )  /* atmospheric refraction calculations */\n    refrac( pdat );\n\n  if ( pdat->function & L_AMASS )   /* airmass calculations */\n    amass( pdat );\n\n  if ( pdat->function & L_PRIME )   /* kt-prime/unprime calculations */\n    prime( pdat );\n\n  if ( pdat->function & L_ETR )     /* ETR and ETRN (refracted) */\n    etr( pdat );\n\n  if ( pdat->function & L_TILT )    /* tilt calculations */\n    tilt( pdat );\n\n    return 0;\n}\n\n\n/*============================================================================\n*    Void function S_init\n*\n*    This function initiates all of the input parameters in the struct\n*    posdata passed to S_solpos().  Initialization is either to nominal\n*    values or to out of range values, which forces the calling program to\n*    specify parameters.\n*\n*    NOTE: This function is optional if you initialize ALL input parameters\n*          in your calling code.  Note that the required parameters of date\n*          and location are deliberately initialized out of bounds to force\n*          the user to enter real-world values.\n*\n*    Requires: Pointer to a posdata structure, members of which are\n*           initialized.\n*\n*    Returns: Void\n*----------------------------------------------------------------------------*/\nvoid S_init(struct posdata *pdat)\n{\n  pdat->day       =    -99;   /* Day of month (May 27 = 27, etc.) */\n  pdat->daynum    =   -999;   /* Day number (day of year; Feb 1 = 32 ) */\n  pdat->hour      =    -99;   /* Hour of day, 0 - 23 */\n  pdat->minute    =    -99;   /* Minute of hour, 0 - 59 */\n  pdat->month     =    -99;   /* Month number (Jan = 1, Feb = 2, etc.) */\n  pdat->second    =    -99;   /* Second of minute, 0 - 59 */\n  pdat->year      =    -99;   /* 4-digit year */\n  pdat->interval  =      0;   /* instantaneous measurement interval */\n  pdat->aspect    =  180.0;   /* Azimuth of panel surface (direction it\n                                    faces) N=0, E=90, S=180, W=270 */\n  pdat->latitude  =  -99.0;   /* Latitude, degrees north (south negative) */\n  pdat->longitude = -999.0;   /* Longitude, degrees east (west negative) */\n  pdat->press     = 1013.0;   /* Surface pressure, millibars */\n  pdat->solcon    = 1367.0;   /* Solar constant, 1367 W/sq m */\n  pdat->temp      =   15.0;   /* Ambient dry-bulb temperature, degrees C */\n  pdat->tilt      =    0.0;   /* Degrees tilt from horizontal of panel */\n  pdat->timezone  =  -99.0;   /* Time zone, east (west negative). */\n  pdat->sbwid     =    7.6;   /* Eppley shadow band width */\n  pdat->sbrad     =   31.7;   /* Eppley shadow band radius */\n  pdat->sbsky     =   0.04;   /* Drummond factor for partly cloudy skies */\n  pdat->function  =  S_ALL;   /* compute all parameters */\n}\n\n\n/*============================================================================\n*    Local long int function validate\n*\n*    Validates the input parameters\n*----------------------------------------------------------------------------*/\nstatic long int validate ( struct posdata *pdat)\n{\n\n  long int retval = 0;  /* start with no errors */\n\n  /* No absurd dates, please. */\n  if ( pdat->function & L_GEOM )\n  {\n    if ( (pdat->year < 1950) || (pdat->year > 2050) ) /* limits of algoritm */\n      retval |= (1L << S_YEAR_ERROR);\n    if ( !(pdat->function & S_DOY) && ((pdat->month < 1) || (pdat->month > 12)))\n      retval |= (1L << S_MONTH_ERROR);\n    if ( !(pdat->function & S_DOY) && ((pdat->day < 1) || (pdat->day > 31)) )\n      retval |= (1L << S_DAY_ERROR);\n    if ( (pdat->function & S_DOY) && ((pdat->daynum < 1) || (pdat->daynum > 366)) )\n      retval |= (1L << S_DOY_ERROR);\n\n    /* No absurd times, please. */\n    if ( (pdat->hour < 0) || (pdat->hour > 24) )\n      retval |= (1L << S_HOUR_ERROR);\n    if ( (pdat->minute < 0) || (pdat->minute > 59) )\n      retval |= (1L << S_MINUTE_ERROR);\n    if ( (pdat->second < 0) || (pdat->second > 59) )\n      retval |= (1L << S_SECOND_ERROR);\n    if ( (pdat->hour == 24) && (pdat->minute > 0) ) /* no more than 24 hrs */\n      retval |= ( (1L << S_HOUR_ERROR) | (1L << S_MINUTE_ERROR) );\n    if ( (pdat->hour == 24) && (pdat->second > 0) ) /* no more than 24 hrs */\n      retval |= ( (1L << S_HOUR_ERROR) | (1L << S_SECOND_ERROR) );\n    if ( fabs (pdat->timezone) > 12.0 )\n      retval |= (1L << S_TZONE_ERROR);\n    if ( (pdat->interval < 0) || (pdat->interval > 28800) )\n      retval |= (1L << S_INTRVL_ERROR);\n\n    /* No absurd locations, please. */\n    if ( fabs (pdat->longitude) > 180.0 )\n      retval |= (1L << S_LON_ERROR);\n    if ( fabs (pdat->latitude) > 90.0 )\n      retval |= (1L << S_LAT_ERROR);\n  }\n\n  /* No silly temperatures or pressures, please. */\n  if ( (pdat->function & L_REFRAC) && (fabs (pdat->temp) > 100.0) )\n    retval |= (1L << S_TEMP_ERROR);\n  if ( (pdat->function & L_REFRAC) &&\n    (pdat->press < 0.0) || (pdat->press > 2000.0) )\n    retval |= (1L << S_PRESS_ERROR);\n\n  /* No out of bounds tilts, please */\n  if ( (pdat->function & L_TILT) && (fabs (pdat->tilt) > 180.0) )\n    retval |= (1L << S_TILT_ERROR);\n  if ( (pdat->function & L_TILT) && (fabs (pdat->aspect) > 360.0) )\n    retval |= (1L << S_ASPECT_ERROR);\n\n  /* No oddball shadowbands, please */\n  if ( (pdat->function & L_SBCF) &&\n       (pdat->sbwid < 1.0) || (pdat->sbwid > 100.0) )\n    retval |= (1L << S_SBWID_ERROR);\n  if ( (pdat->function & L_SBCF) &&\n       (pdat->sbrad < 1.0) || (pdat->sbrad > 100.0) )\n    retval |= (1L << S_SBRAD_ERROR);\n  if ( (pdat->function & L_SBCF) && ( fabs (pdat->sbsky) > 1.0) )\n    retval |= (1L << S_SBSKY_ERROR);\n\n  return retval;\n}\n\n\n/*============================================================================\n*    Local Void function dom2doy\n*\n*    Converts day-of-month to day-of-year\n*\n*    Requires (from struct posdata parameter):\n*            year\n*            month\n*            day\n*\n*    Returns (via the struct posdata parameter):\n*            year\n*            daynum\n*----------------------------------------------------------------------------*/\nstatic void dom2doy( struct posdata *pdat )\n{\n  pdat->daynum = pdat->day + month_days[0][pdat->month];\n\n  /* (adjust for leap year) */\n  if ( ((pdat->year % 4) == 0) &&\n         ( ((pdat->year % 100) != 0) || ((pdat->year % 400) == 0) ) &&\n         (pdat->month > 2) )\n      pdat->daynum += 1;\n}\n\n\n/*============================================================================\n*    Local void function doy2dom\n*\n*    This function computes the month/day from the day number.\n*\n*    Requires (from struct posdata parameter):\n*        Year and day number:\n*            year\n*            daynum\n*\n*    Returns (via the struct posdata parameter):\n*            year\n*            month\n*            day\n*----------------------------------------------------------------------------*/\nstatic void doy2dom(struct posdata *pdat)\n{\n  int  imon;  /* Month (month_days) array counter */\n  int  leap;  /* leap year switch */\n\n    /* Set the leap year switch */\n    if ( ((pdat->year % 4) == 0) &&\n         ( ((pdat->year % 100) != 0) || ((pdat->year % 400) == 0) ) )\n        leap = 1;\n    else\n        leap = 0;\n\n    /* Find the month */\n    imon = 12;\n    while ( pdat->daynum <= month_days [leap][imon] )\n        --imon;\n\n    /* Set the month and day of month */\n    pdat->month = imon;\n    pdat->day   = pdat->daynum - month_days[leap][imon];\n}\n\n\n/*============================================================================\n*    Local Void function geometry\n*\n*    Does the underlying geometry for a given time and location\n*----------------------------------------------------------------------------*/\nstatic void geometry ( struct posdata *pdat )\n{\n  float bottom;      /* denominator (bottom) of the fraction */\n  float c2;          /* cosine of d2 */\n  float cd;          /* cosine of the day angle or delination */\n  float d2;          /* pdat->dayang times two */\n  float delta;       /* difference between current year and 1949 */\n  float s2;          /* sine of d2 */\n  float sd;          /* sine of the day angle */\n  float top;         /* numerator (top) of the fraction */\n  int   leap;        /* leap year counter */\n\n  /* Day angle */\n      /*  Iqbal, M.  1983.  An Introduction to Solar Radiation.\n            Academic Press, NY., page 3 */\n     pdat->dayang = 360.0 * ( pdat->daynum - 1 ) / 365.0;\n\n    /* Earth radius vector * solar constant = solar energy */\n        /*  Spencer, J. W.  1971.  Fourier series representation of the\n            position of the sun.  Search 2 (5), page 172 */\n    sd     = sin (raddeg * pdat->dayang);\n    cd     = cos (raddeg * pdat->dayang);\n    d2     = 2.0 * pdat->dayang;\n    c2     = cos (raddeg * d2);\n    s2     = sin (raddeg * d2);\n\n    pdat->erv  = 1.000110 + 0.034221 * cd + 0.001280 * sd;\n    pdat->erv  += 0.000719 * c2 + 0.000077 * s2;\n\n    /* Universal Coordinated (Greenwich standard) time */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n    pdat->utime =\n        pdat->hour * 3600.0 +\n        pdat->minute * 60.0 +\n        pdat->second -\n        (float)pdat->interval / 2.0;\n    pdat->utime = pdat->utime / 3600.0 - pdat->timezone;\n\n    /* Julian Day minus 2,400,000 days (to eliminate roundoff errors) */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n\n    /* No adjustment for century non-leap years since this function is\n       bounded by 1950 - 2050 */\n    delta    = pdat->year - 1949;\n    leap     = (int) ( delta / 4.0 );\n    pdat->julday =\n        32916.5 + delta * 365.0 + leap + pdat->daynum + pdat->utime / 24.0;\n\n    /* Time used in the calculation of ecliptic coordinates */\n    /* Noon 1 JAN 2000 = 2,400,000 + 51,545 days Julian Date */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n    pdat->ectime = pdat->julday - 51545.0;\n\n    /* Mean longitude */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n    pdat->mnlong  = 280.460 + 0.9856474 * pdat->ectime;\n\n    /* (dump the multiples of 360, so the answer is between 0 and 360) */\n    pdat->mnlong -= 360.0 * (int) ( pdat->mnlong / 360.0 );\n    if ( pdat->mnlong < 0.0 )\n        pdat->mnlong += 360.0;\n\n    /* Mean anomaly */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n    pdat->mnanom  = 357.528 + 0.9856003 * pdat->ectime;\n\n    /* (dump the multiples of 360, so the answer is between 0 and 360) */\n    pdat->mnanom -= 360.0 * (int) ( pdat->mnanom / 360.0 );\n    if ( pdat->mnanom < 0.0 )\n        pdat->mnanom += 360.0;\n\n    /* Ecliptic longitude */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n    pdat->eclong  = pdat->mnlong + 1.915 * sin ( pdat->mnanom * raddeg ) +\n                    0.020 * sin ( 2.0 * pdat->mnanom * raddeg );\n\n    /* (dump the multiples of 360, so the answer is between 0 and 360) */\n    pdat->eclong -= 360.0 * (int) ( pdat->eclong / 360.0 );\n    if ( pdat->eclong < 0.0 )\n        pdat->eclong += 360.0;\n\n    /* Obliquity of the ecliptic */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n\n    /* 02 Feb 2001 SMW corrected sign in the following line */\n/*  pdat->ecobli = 23.439 + 4.0e-07 * pdat->ectime;     */\n    pdat->ecobli = 23.439 - 4.0e-07 * pdat->ectime;\n\n    /* Declination */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n    pdat->declin = degrad * asin ( sin (pdat->ecobli * raddeg) *\n                               sin (pdat->eclong * raddeg) );\n\n    /* Right ascension */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n    top      =  cos ( raddeg * pdat->ecobli ) * sin ( raddeg * pdat->eclong );\n    bottom   =  cos ( raddeg * pdat->eclong );\n\n    pdat->rascen =  degrad * atan2 ( top, bottom );\n\n    /* (make it a positive angle) */\n    if ( pdat->rascen < 0.0 )\n        pdat->rascen += 360.0;\n\n    /* Greenwich mean sidereal time */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n    pdat->gmst  = 6.697375 + 0.0657098242 * pdat->ectime + pdat->utime;\n\n    /* (dump the multiples of 24, so the answer is between 0 and 24) */\n    pdat->gmst -= 24.0 * (int) ( pdat->gmst / 24.0 );\n    if ( pdat->gmst < 0.0 )\n        pdat->gmst += 24.0;\n\n    /* Local mean sidereal time */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n    pdat->lmst  = pdat->gmst * 15.0 + pdat->longitude;\n\n    /* (dump the multiples of 360, so the answer is between 0 and 360) */\n    pdat->lmst -= 360.0 * (int) ( pdat->lmst / 360.0 );\n    if ( pdat->lmst < 0.)\n        pdat->lmst += 360.0;\n\n    /* Hour angle */\n        /*  Michalsky, J.  1988.  The Astronomical Almanac's algorithm for\n            approximate solar position (1950-2050).  Solar Energy 40 (3),\n            pp. 227-235. */\n    pdat->hrang = pdat->lmst - pdat->rascen;\n\n    /* (force it between -180 and 180 degrees) */\n    if ( pdat->hrang < -180.0 )\n        pdat->hrang += 360.0;\n    else if ( pdat->hrang > 180.0 )\n        pdat->hrang -= 360.0;\n}\n\n\n/*============================================================================\n*    Local Void function zen_no_ref\n*\n*    ETR solar zenith angle\n*       Iqbal, M.  1983.  An Introduction to Solar Radiation.\n*            Academic Press, NY., page 15\n*----------------------------------------------------------------------------*/\nstatic void zen_no_ref ( struct posdata *pdat, struct trigdata *tdat )\n{\n  float cz;          /* cosine of the solar zenith angle */\n\n    localtrig( pdat, tdat );\n    cz = tdat->sd * tdat->sl + tdat->cd * tdat->cl * tdat->ch;\n\n    /* (watch out for the roundoff errors) */\n    if ( fabs (cz) > 1.0 ) {\n        if ( cz >= 0.0 )\n            cz =  1.0;\n        else\n            cz = -1.0;\n    }\n\n    pdat->zenetr   = acos ( cz ) * degrad;\n\n    /* (limit the degrees below the horizon to 9 [+90 -> 99]) */\n    if ( pdat->zenetr > 99.0 )\n        pdat->zenetr = 99.0;\n\n    pdat->elevetr = 90.0 - pdat->zenetr;\n}\n\n\n/*============================================================================\n*    Local Void function ssha\n*\n*    Sunset hour angle, degrees\n*       Iqbal, M.  1983.  An Introduction to Solar Radiation.\n*            Academic Press, NY., page 16\n*----------------------------------------------------------------------------*/\nstatic void ssha( struct posdata *pdat, struct trigdata *tdat )\n{\n  float cssha;       /* cosine of the sunset hour angle */\n  float cdcl;        /* ( cd * cl ) */\n\n    localtrig( pdat, tdat );\n    cdcl    = tdat->cd * tdat->cl;\n\n    if ( fabs ( cdcl ) >= 0.001 ) {\n        cssha = -tdat->sl * tdat->sd / cdcl;\n\n        /* This keeps the cosine from blowing on roundoff */\n        if ( cssha < -1.0  )\n            pdat->ssha = 180.0;\n        else if ( cssha > 1.0 )\n            pdat->ssha = 0.0;\n        else\n            pdat->ssha = degrad * acos ( cssha );\n    }\n    else if ( ((pdat->declin >= 0.0) && (pdat->latitude > 0.0 )) ||\n              ((pdat->declin <  0.0) && (pdat->latitude < 0.0 )) )\n        pdat->ssha = 180.0;\n    else\n        pdat->ssha = 0.0;\n}\n\n\n/*============================================================================\n*    Local Void function sbcf\n*\n*    Shadowband correction factor\n*       Drummond, A. J.  1956.  A contribution to absolute pyrheliometry.\n*            Q. J. R. Meteorol. Soc. 82, pp. 481-493\n*----------------------------------------------------------------------------*/\nstatic void sbcf( struct posdata *pdat, struct trigdata *tdat )\n{\n  float p, t1, t2;   /* used to compute sbcf */\n\n    localtrig( pdat, tdat );\n    p       = 0.6366198 * pdat->sbwid / pdat->sbrad * pow (tdat->cd,3);\n    t1      = tdat->sl * tdat->sd * pdat->ssha * raddeg;\n    t2      = tdat->cl * tdat->cd * sin ( pdat->ssha * raddeg );\n    pdat->sbcf = pdat->sbsky + 1.0 / ( 1.0 - p * ( t1 + t2 ) );\n\n}\n\n\n/*============================================================================\n*    Local Void function tst\n*\n*    TST -> True Solar Time = local standard time + TSTfix, time\n*      in minutes from midnight.\n*        Iqbal, M.  1983.  An Introduction to Solar Radiation.\n*            Academic Press, NY., page 13\n*----------------------------------------------------------------------------*/\nstatic void tst( struct posdata *pdat )\n{\n    pdat->tst    = ( 180.0 + pdat->hrang ) * 4.0;\n    pdat->tstfix =\n        pdat->tst -\n        (float)pdat->hour * 60.0 -\n        pdat->minute -\n        (float)pdat->second / 60.0 +\n        (float)pdat->interval / 120.0; /* add back half of the interval */\n\n    /* bound tstfix to this day */\n    while ( pdat->tstfix >  720.0 )\n        pdat->tstfix -= 1440.0;\n    while ( pdat->tstfix < -720.0 )\n        pdat->tstfix += 1440.0;\n\n    pdat->eqntim =\n        pdat->tstfix + 60.0 * pdat->timezone - 4.0 * pdat->longitude;\n\n}\n\n\n/*============================================================================\n*    Local Void function srss\n*\n*    Sunrise and sunset times (minutes from midnight)\n*----------------------------------------------------------------------------*/\nstatic void srss( struct posdata *pdat )\n{\n    if ( pdat->ssha <= 1.0 ) {\n        pdat->sretr   =  2999.0;\n        pdat->ssetr   = -2999.0;\n    }\n    else if ( pdat->ssha >= 179.0 ) {\n        pdat->sretr   = -2999.0;\n        pdat->ssetr   =  2999.0;\n    }\n    else {\n        pdat->sretr   = 720.0 - 4.0 * pdat->ssha - pdat->tstfix;\n        pdat->ssetr   = 720.0 + 4.0 * pdat->ssha - pdat->tstfix;\n    }\n}\n\n\n/*============================================================================\n*    Local Void function sazm\n*\n*    Solar azimuth angle\n*       Iqbal, M.  1983.  An Introduction to Solar Radiation.\n*            Academic Press, NY., page 15\n*----------------------------------------------------------------------------*/\nstatic void sazm( struct posdata *pdat, struct trigdata *tdat )\n{\n  float ca;          /* cosine of the solar azimuth angle */\n  float ce;          /* cosine of the solar elevation */\n  float cecl;        /* ( ce * cl ) */\n  float se;          /* sine of the solar elevation */\n\n    localtrig( pdat, tdat );\n    ce         = cos ( raddeg * pdat->elevetr );\n    se         = sin ( raddeg * pdat->elevetr );\n\n    pdat->azim     = 180.0;\n    cecl       = ce * tdat->cl;\n    if ( fabs ( cecl ) >= 0.001 ) {\n        ca     = ( se * tdat->sl - tdat->sd ) / cecl;\n        if ( ca > 1.0 )\n            ca = 1.0;\n        else if ( ca < -1.0 )\n            ca = -1.0;\n\n        pdat->azim = 180.0 - acos ( ca ) * degrad;\n        if ( pdat->hrang > 0 )\n            pdat->azim  = 360.0 - pdat->azim;\n    }\n}\n\n\n/*============================================================================\n*    Local Int function refrac\n*\n*    Refraction correction, degrees\n*        Zimmerman, John C.  1981.  Sun-pointing programs and their\n*            accuracy.\n*            SAND81-0761, Experimental Systems Operation Division 4721,\n*            Sandia National Laboratories, Albuquerque, NM.\n*----------------------------------------------------------------------------*/\nstatic void refrac( struct posdata *pdat )\n{\n  float prestemp;    /* temporary pressure/temperature correction */\n  float refcor;      /* temporary refraction correction */\n  float tanelev;     /* tangent of the solar elevation angle */\n\n    /* If the sun is near zenith, the algorithm bombs; refraction near 0 */\n    if ( pdat->elevetr > 85.0 )\n        refcor = 0.0;\n\n    /* Otherwise, we have refraction */\n    else {\n        tanelev = tan ( raddeg * pdat->elevetr );\n        if ( pdat->elevetr >= 5.0 )\n            refcor  = 58.1 / tanelev -\n                      0.07 / ( pow (tanelev,3) ) +\n                      0.000086 / ( pow (tanelev,5) );\n        else if ( pdat->elevetr >= -0.575 )\n            refcor  = 1735.0 +\n                      pdat->elevetr * ( -518.2 + pdat->elevetr * ( 103.4 +\n                      pdat->elevetr * ( -12.79 + pdat->elevetr * 0.711 ) ) );\n        else\n            refcor  = -20.774 / tanelev;\n\n        prestemp    =\n            ( pdat->press * 283.0 ) / ( 1013.0 * ( 273.0 + pdat->temp ) );\n        refcor     *= prestemp / 3600.0;\n    }\n\n    /* Refracted solar elevation angle */\n    pdat->elevref = pdat->elevetr + refcor;\n\n    /* (limit the degrees below the horizon to 9) */\n    if ( pdat->elevref < -9.0 )\n        pdat->elevref = -9.0;\n\n    /* Refracted solar zenith angle */\n    pdat->zenref  = 90.0 - pdat->elevref;\n    pdat->coszen  = cos( raddeg * pdat->zenref );\n}\n\n\n/*============================================================================\n*    Local Void function  amass\n*\n*    Airmass\n*       Kasten, F. and Young, A.  1989.  Revised optical air mass\n*            tables and approximation formula.  Applied Optics 28 (22),\n*            pp. 4735-4738\n*----------------------------------------------------------------------------*/\nstatic void amass( struct posdata *pdat )\n{\n    if ( pdat->zenref > 93.0 )\n    {\n        pdat->amass   = -1.0;\n        pdat->ampress = -1.0;\n    }\n    else\n    {\n        pdat->amass =\n            1.0 / ( cos (raddeg * pdat->zenref) + 0.50572 *\n            pow ((96.07995 - pdat->zenref),-1.6364) );\n\n        pdat->ampress   = pdat->amass * pdat->press / 1013.0;\n    }\n}\n\n\n/*============================================================================\n*    Local Void function prime\n*\n*    Prime and Unprime\n*    Prime  converts Kt to normalized Kt', etc.\n*       Unprime deconverts Kt' to Kt, etc.\n*            Perez, R., P. Ineichen, Seals, R., & Zelenka, A.  1990.  Making\n*            full use of the clearness index for parameterizing hourly\n*            insolation conditions. Solar Energy 45 (2), pp. 111-114\n*----------------------------------------------------------------------------*/\nstatic void prime( struct posdata *pdat )\n{\n    pdat->unprime = 1.031 * exp ( -1.4 / ( 0.9 + 9.4 / pdat->amass ) ) + 0.1;\n    pdat->prime   = 1.0 / pdat->unprime;\n}\n\n\n/*============================================================================\n*    Local Void function etr\n*\n*    Extraterrestrial (top-of-atmosphere) solar irradiance\n*----------------------------------------------------------------------------*/\nstatic void etr( struct posdata *pdat )\n{\n    if ( pdat->coszen > 0.0 ) {\n        pdat->etrn = pdat->solcon * pdat->erv;\n        pdat->etr  = pdat->etrn * pdat->coszen;\n    }\n    else {\n        pdat->etrn = 0.0;\n        pdat->etr  = 0.0;\n    }\n}\n\n\n/*============================================================================\n*    Local Void function localtrig\n*\n*    Does trig on internal variable used by several functions\n*----------------------------------------------------------------------------*/\nstatic void localtrig( struct posdata *pdat, struct trigdata *tdat )\n{\n/* define masks to prevent calculation of uninitialized variables */\n#define SD_MASK ( L_ZENETR | L_SSHA | S_SBCF | S_SOLAZM )\n#define SL_MASK ( L_ZENETR | L_SSHA | S_SBCF | S_SOLAZM )\n#define CL_MASK ( L_ZENETR | L_SSHA | S_SBCF | S_SOLAZM )\n#define CD_MASK ( L_ZENETR | L_SSHA | S_SBCF )\n#define CH_MASK ( L_ZENETR )\n\n    if ( tdat->sd < -900.0 )  /* sd was initialized -999 as flag */\n    {\n      tdat->sd = 1.0;  /* reflag as having completed calculations */\n      if ( pdat->function & CD_MASK )\n        tdat->cd = cos ( raddeg * pdat->declin );\n      if ( pdat->function & CH_MASK )\n        tdat->ch = cos ( raddeg * pdat->hrang );\n      if ( pdat->function & CL_MASK )\n        tdat->cl = cos ( raddeg * pdat->latitude );\n      if ( pdat->function & SD_MASK )\n        tdat->sd = sin ( raddeg * pdat->declin );\n      if ( pdat->function & SL_MASK )\n        tdat->sl = sin ( raddeg * pdat->latitude );\n    }\n}\n\n\n/*============================================================================\n*    Local Void function tilt\n*\n*    ETR on a tilted surface\n*----------------------------------------------------------------------------*/\nstatic void tilt( struct posdata *pdat )\n{\n  float ca;          /* cosine of the solar azimuth angle */\n  float cp;          /* cosine of the panel aspect */\n  float ct;          /* cosine of the panel tilt */\n  float sa;          /* sine of the solar azimuth angle */\n  float sp;          /* sine of the panel aspect */\n  float st;          /* sine of the panel tilt */\n  float sz;          /* sine of the refraction corrected solar zenith angle */\n\n\n    /* Cosine of the angle between the sun and a tipped flat surface,\n       useful for calculating solar energy on tilted surfaces */\n    ca      = cos ( raddeg * pdat->azim );\n    cp      = cos ( raddeg * pdat->aspect );\n    ct      = cos ( raddeg * pdat->tilt );\n    sa      = sin ( raddeg * pdat->azim );\n    sp      = sin ( raddeg * pdat->aspect );\n    st      = sin ( raddeg * pdat->tilt );\n    sz      = sin ( raddeg * pdat->zenref );\n    pdat->cosinc  = pdat->coszen * ct + sz * st * ( ca * cp + sa * sp );\n\n    if ( pdat->cosinc > 0.0 )\n        pdat->etrtilt = pdat->etrn * pdat->cosinc;\n    else\n        pdat->etrtilt = 0.0;\n\n}\n\n\n/*============================================================================\n*    Void function S_decode\n*\n*    This function decodes the error codes from S_solpos return value\n*\n*    Requires the long integer return value from S_solpos\n*\n*    Returns descriptive text to stderr\n*----------------------------------------------------------------------------*/\nvoid S_decode(long code, struct posdata *pdat)\n{\n  if ( code & (1L << S_YEAR_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the year: %d [1950-2050]\\n\",\n      pdat->year);\n  if ( code & (1L << S_MONTH_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the month: %d\\n\",\n      pdat->month);\n  if ( code & (1L << S_DAY_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the day-of-month: %d\\n\",\n      pdat->day);\n  if ( code & (1L << S_DOY_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the day-of-year: %d\\n\",\n      pdat->daynum);\n  if ( code & (1L << S_HOUR_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the hour: %d\\n\",\n      pdat->hour);\n  if ( code & (1L << S_MINUTE_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the minute: %d\\n\",\n      pdat->minute);\n  if ( code & (1L << S_SECOND_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the second: %d\\n\",\n      pdat->second);\n  if ( code & (1L << S_TZONE_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the time zone: %f\\n\",\n      pdat->timezone);\n  if ( code & (1L << S_INTRVL_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the interval: %d\\n\",\n      pdat->interval);\n  if ( code & (1L << S_LAT_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the latitude: %f\\n\",\n      pdat->latitude);\n  if ( code & (1L << S_LON_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the longitude: %f\\n\",\n      pdat->longitude);\n  if ( code & (1L << S_TEMP_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the temperature: %f\\n\",\n      pdat->temp);\n  if ( code & (1L << S_PRESS_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the pressure: %f\\n\",\n      pdat->press);\n  if ( code & (1L << S_TILT_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the tilt: %f\\n\",\n      pdat->tilt);\n  if ( code & (1L << S_ASPECT_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the aspect: %f\\n\",\n      pdat->aspect);\n  if ( code & (1L << S_SBWID_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the shadowband width: %f\\n\",\n      pdat->sbwid);\n  if ( code & (1L << S_SBRAD_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the shadowband radius: %f\\n\",\n      pdat->sbrad);\n  if ( code & (1L << S_SBSKY_ERROR) )\n    fprintf(stderr, \"S_decode ==> Please fix the shadowband sky factor: %f\\n\",\n      pdat->sbsky);\n}\n\n"
  },
  {
    "path": "modules/solar/solpos/solpos.h",
    "content": " /*============================================================================\n*\n*    NAME:  solpos00.h\n*\n*    Contains:\n*        S_solpos     (computes the solar position and intensity\n*                      from time and place)\n*            INPUTS:     (from posdata)\n*                          year, month, day, hour, minute, second,\n*                          latitude, longitude, timezone, interval\n*            OPTIONAL:   (from posdata; defaults from S_init function)\n*                            press   DEFAULT 1013.0 (standard pressure)\n*                            temp    DEFAULT   10.0 (standard temperature)\n*                            tilt    DEFAULT    0.0 (horizontal panel)\n*                            aspect  DEFAULT  180.0 (South-facing panel)\n*                            sbwid   DEFAULT    7.6 (shadowband width)\n*                            sbrad   DEFAULT   31.7 (shadowband radius)\n*                            sbsky   DEFAULT   0.04 (shadowband sky factor)\n*\n*            OUTPUTS:    (posdata) daynum, amass, ampress, azim, cosinc,\n*                        elevref, etr, etrn, etrtilt, prime,\n*                        sbcf, sretr, ssetr, unprime, zenref\n*\n*            RETURNS:   Long int status code (defined in solpos.h)\n*\n*    Usage:\n*         In calling program, along with other 'includes', insert:\n*\n*              #include \"solpos.h\"\n*\n*    Martin Rymes\n*    National Renewable Energy Laboratory\n*    25 March 1998\n*----------------------------------------------------------------------------*/\n\n/*============================================================================\n*\n*     Define the function codes\n*\n*----------------------------------------------------------------------------*/\n#define L_DOY    0x0001\n#define L_GEOM   0x0002\n#define L_ZENETR 0x0004\n#define L_SSHA   0x0008\n#define L_SBCF   0x0010\n#define L_TST    0x0020\n#define L_SRSS   0x0040\n#define L_SOLAZM 0x0080\n#define L_REFRAC 0x0100\n#define L_AMASS  0x0200\n#define L_PRIME  0x0400\n#define L_TILT   0x0800\n#define L_ETR    0x1000\n#define L_ALL    0xFFFF\n\n/*============================================================================\n*\n*     Define the bit-wise masks for each function\n*\n*----------------------------------------------------------------------------*/\n#define S_DOY    ( L_DOY                          )\n#define S_GEOM   ( L_GEOM   | S_DOY               )\n#define S_ZENETR ( L_ZENETR | S_GEOM              )\n#define S_SSHA   ( L_SSHA   | S_GEOM              )\n#define S_SBCF   ( L_SBCF   | S_SSHA              )\n#define S_TST    ( L_TST    | S_GEOM              )\n#define S_SRSS   ( L_SRSS   | S_SSHA   | S_TST    )\n#define S_SOLAZM ( L_SOLAZM | S_ZENETR            )\n#define S_REFRAC ( L_REFRAC | S_ZENETR            )\n#define S_AMASS  ( L_AMASS  | S_REFRAC            )\n#define S_PRIME  ( L_PRIME  | S_AMASS             )\n#define S_TILT   ( L_TILT   | S_SOLAZM | S_REFRAC )\n#define S_ETR    ( L_ETR    | S_REFRAC            )\n#define S_ALL    ( L_ALL                          )\n\n\n/*============================================================================\n*\n*     Enumerate the error codes\n*     (Bit positions are from least significant to most significant)\n*\n*----------------------------------------------------------------------------*/\n/*          Code          Bit       Parameter            Range\n      ===============     ===  ===================  =============   */\nenum {S_YEAR_ERROR,    /*  0   year                  1950 -  2050   */\n      S_MONTH_ERROR,   /*  1   month                    1 -    12   */\n      S_DAY_ERROR,     /*  2   day-of-month             1 -    31   */\n      S_DOY_ERROR,     /*  3   day-of-year              1 -   366   */\n      S_HOUR_ERROR,    /*  4   hour                     0 -    24   */\n      S_MINUTE_ERROR,  /*  5   minute                   0 -    59   */\n      S_SECOND_ERROR,  /*  6   second                   0 -    59   */\n      S_TZONE_ERROR,   /*  7   time zone              -12 -    12   */\n      S_INTRVL_ERROR,  /*  8   interval (seconds)       0 - 28800   */\n      S_LAT_ERROR,     /*  9   latitude               -90 -    90   */\n      S_LON_ERROR,     /* 10   longitude             -180 -   180   */\n      S_TEMP_ERROR,    /* 11   temperature (deg. C)  -100 -   100   */\n      S_PRESS_ERROR,   /* 12   pressure (millibars)     0 -  2000   */\n      S_TILT_ERROR,    /* 13   tilt                   -90 -    90   */\n      S_ASPECT_ERROR,  /* 14   aspect                -360 -   360   */\n      S_SBWID_ERROR,   /* 15   shadow band width (cm)   1 -   100   */\n      S_SBRAD_ERROR,   /* 16   shadow band radius (cm)  1 -   100   */\n      S_SBSKY_ERROR};  /* 17   shadow band sky factor  -1 -     1   */\n\nstruct posdata\n{\n  /***** ALPHABETICAL LIST OF COMMON VARIABLES *****/\n                           /* Each comment begins with a 1-column letter code:\n                              I:  INPUT variable\n                              O:  OUTPUT variable\n                              T:  TRANSITIONAL variable used in the algorithm,\n                                  of interest only to the solar radiation\n                                  modelers, and available to you because you\n                                  may be one of them.\n\n                              The FUNCTION column indicates which sub-function\n                              within solpos must be switched on using the\n                              \"function\" parameter to calculate the desired\n                              output variable.  All function codes are\n                              defined in the solpos.h file.  The default\n                              S_ALL switch calculates all output variables.\n                              Multiple functions may be or'd to create a\n                              composite function switch.  For example,\n                              (S_TST | S_SBCF). Specifying only the functions\n                              for required output variables may allow solpos\n                              to execute more quickly.\n\n                              The S_DOY mask works as a toggle between the\n                              input date represented as a day number (daynum)\n                              or as month and day.  To set the switch (to\n                              use daynum input), the function is or'd; to\n                              clear the switch (to use month and day input),\n                              the function is inverted and and'd.\n\n                              For example:\n                                  pdat->function |= S_DOY (sets daynum input)\n                                  pdat->function &= ~S_DOY (sets month and day input)\n\n                              Whichever date form is used, S_solpos will\n                              calculate and return the variables(s) of the\n                              other form.  See the soltest.c program for\n                              other examples. */\n\n  /* VARIABLE        I/O  Function    Description */\n  /* -------------  ----  ----------  ---------------------------------------*/\n\n  int   day;       /* I/O: S_DOY      Day of month (May 27 = 27, etc.)\n                                        solpos will CALCULATE this by default,\n                                        or will optionally require it as input\n                                        depending on the setting of the S_DOY\n                                        function switch. */\n  int   daynum;    /* I/O: S_DOY      Day number (day of year; Feb 1 = 32 )\n                                        solpos REQUIRES this by default, but\n                                        will optionally calculate it from\n                                        month and day depending on the setting\n                                        of the S_DOY function switch. */\n  int   function;  /* I:              Switch to choose functions for desired\n                                        output. */\n  int   hour;      /* I:              Hour of day, 0 - 23, DEFAULT = 12 */\n  int   interval;  /* I:              Interval of a measurement period in\n                                        seconds.  Forces solpos to use the\n                                        time and date from the interval\n                                        midpoint. The INPUT time (hour,\n                                        minute, and second) is assumed to\n                                        be the END of the measurement\n                                        interval. */\n  int   minute;    /* I:              Minute of hour, 0 - 59, DEFAULT = 0 */\n  int   month;     /* I/O: S_DOY      Month number (Jan = 1, Feb = 2, etc.)\n                                        solpos will CALCULATE this by default,\n                                        or will optionally require it as input\n                                        depending on the setting of the S_DOY\n                                        function switch. */\n  int   second;    /* I:              Second of minute, 0 - 59, DEFAULT = 0 */\n  int   year;      /* I:              4-digit year (2-digit year is NOT\n                                       allowed */\n\n  /***** FLOATS *****/\n\n  float amass;      /* O:  S_AMASS    Relative optical airmass */\n  float ampress;    /* O:  S_AMASS    Pressure-corrected airmass */\n  float aspect;     /* I:             Azimuth of panel surface (direction it\n                                        faces) N=0, E=90, S=180, W=270,\n                                        DEFAULT = 180 */\n  float azim;       /* O:  S_SOLAZM   Solar azimuth angle:  N=0, E=90, S=180,\n                                        W=270 */\n  float cosinc;     /* O:  S_TILT     Cosine of solar incidence angle on\n                                        panel */\n  float coszen;     /* O:  S_REFRAC   Cosine of refraction corrected solar\n                                        zenith angle */\n  float dayang;     /* T:  S_GEOM     Day angle (daynum*360/year-length)\n                                        degrees */\n  float declin;     /* T:  S_GEOM     Declination--zenith angle of solar noon\n                                        at equator, degrees NORTH */\n  float eclong;     /* T:  S_GEOM     Ecliptic longitude, degrees */\n  float ecobli;     /* T:  S_GEOM     Obliquity of ecliptic */\n  float ectime;     /* T:  S_GEOM     Time of ecliptic calculations */\n  float elevetr;    /* O:  S_ZENETR   Solar elevation, no atmospheric\n                                        correction (= ETR) */\n  float elevref;    /* O:  S_REFRAC   Solar elevation angle,\n                                        deg. from horizon, refracted */\n  float eqntim;     /* T:  S_TST      Equation of time (TST - LMT), minutes */\n  float erv;        /* T:  S_GEOM     Earth radius vector\n                                        (multiplied to solar constant) */\n  float etr;        /* O:  S_ETR      Extraterrestrial (top-of-atmosphere)\n                                        W/sq m global horizontal solar\n                                        irradiance */\n  float etrn;       /* O:  S_ETR      Extraterrestrial (top-of-atmosphere)\n                                        W/sq m direct normal solar\n                                        irradiance */\n  float etrtilt;    /* O:  S_TILT     Extraterrestrial (top-of-atmosphere)\n                                        W/sq m global irradiance on a tilted\n                                        surface */\n  float gmst;       /* T:  S_GEOM     Greenwich mean sidereal time, hours */\n  float hrang;      /* T:  S_GEOM     Hour angle--hour of sun from solar noon,\n                                        degrees WEST */\n  float julday;     /* T:  S_GEOM     Julian Day of 1 JAN 2000 minus\n                                        2,400,000 days (in order to regain\n                                        single precision) */\n  float latitude;   /* I:             Latitude, degrees north (south negative) */\n  float longitude;  /* I:             Longitude, degrees east (west negative) */\n  float lmst;       /* T:  S_GEOM     Local mean sidereal time, degrees */\n  float mnanom;     /* T:  S_GEOM     Mean anomaly, degrees */\n  float mnlong;     /* T:  S_GEOM     Mean longitude, degrees */\n  float rascen;     /* T:  S_GEOM     Right ascension, degrees */\n  float press;      /* I:             Surface pressure, millibars, used for\n                                        refraction correction and ampress */\n  float prime;      /* O:  S_PRIME    Factor that normalizes Kt, Kn, etc. */\n  float sbcf;       /* O:  S_SBCF     Shadow-band correction factor */\n  float sbwid;      /* I:             Shadow-band width (cm) */\n  float sbrad;      /* I:             Shadow-band radius (cm) */\n  float sbsky;      /* I:             Shadow-band sky factor */\n  float solcon;     /* I:             Solar constant (NREL uses 1367 W/sq m) */\n  float ssha;       /* T:  S_SRHA     Sunset(/rise) hour angle, degrees */\n  float sretr;      /* O:  S_SRSS     Sunrise time, minutes from midnight,\n                                        local, WITHOUT refraction */\n  float ssetr;      /* O:  S_SRSS     Sunset time, minutes from midnight,\n                                        local, WITHOUT refraction */\n  float temp;       /* I:             Ambient dry-bulb temperature, degrees C,\n                                        used for refraction correction */\n  float tilt;       /* I:             Degrees tilt from horizontal of panel */\n  float timezone;   /* I:             Time zone, east (west negative).\n                                      USA:  Mountain = -7, Central = -6, etc. */\n  float tst;        /* T:  S_TST      True solar time, minutes from midnight */\n  float tstfix;     /* T:  S_TST      True solar time - local standard time */\n  float unprime;    /* O:  S_PRIME    Factor that denormalizes Kt', Kn', etc. */\n  float utime;      /* T:  S_GEOM     Universal (Greenwich) standard time */\n  float zenetr;     /* T:  S_ZENETR   Solar zenith angle, no atmospheric\n                                        correction (= ETR) */\n  float zenref;     /* O:  S_REFRAC   Solar zenith angle, deg. from zenith,\n                                        refracted */\n};\n\n/* For users that wish to access individual functions, the following table\nlists all output and transition variables, the L_ mask for the function\nthat calculates them, and all the input variables required by that function.\nThe function variable is set to the L_ mask, which will force S_solpos to\nonly call the required function.  L_ masks may be ORed as desired.\n\nVARIABLE      Mask       Required Variables\n---------  ----------  ---------------------------------------\n amass      L_AMASS    zenref, press\n ampress    L_AMASS    zenref, press\n azim       L_SOLAZM   elevetr, declin, latitude, hrang\n cosinc     L_TILT     azim, aspect, tilt, zenref, coszen,etrn\n coszen     L_REFRAC   elevetr, press, temp\n dayang     L_GEOM     All date, time, and location inputs\n declin     L_GEOM     All date, time, and location inputs\n eclong     L_GEOM     All date, time, and location inputs\n ecobli     L_GEOM     All date, time, and location inputs\n ectime     L_GEOM     All date, time, and location inputs\n elevetr    L_ZENETR   declin, latitude, hrang\n elevref    L_REFRAC   elevetr, press, temp\n eqntim     L_TST      hrang, hour, minute, second, interval\n erv        L_GEOM     All date, time, and location inputs\n etr        L_ETR      coszen, solcon, erv\n etrn       L_ETR      coszen, solcon, erv\n etrtilt    L_TILT     azim, aspect, tilt, zenref, coszen, etrn\n gmst       L_GEOM     All date, time, and location inputs\n hrang      L_GEOM     All date, time, and location inputs\n julday     L_GEOM     All date, time, and location inputs\n lmst       L_GEOM     All date, time, and location inputs\n mnanom     L_GEOM     All date, time, and location inputs\n mnlong     L_GEOM     All date, time, and location inputs\n rascen     L_GEOM     All date, time, and location inputs\n prime      L_PRIME    amass\n sbcf       L_SBCF     latitude, declin, ssha, sbwid, sbrad, sbsky\n ssha       L_SRHA     latitude, declin\n sretr      L_SRSS     ssha, tstfix\n ssetr      L_SRSS     ssha, tstfix\n tst        L_TST      hrang, hour, minute, second, interval\n tstfix     L_TST      hrang, hour, minute, second, interval\n unprime    L_PRIME    amass\n utime      L_GEOM     All date, time, and location inputs\n zenetr     L_ZENETR   declination, latitude, hrang\n zenref     L_REFRAC   elevetr, press, temp\n/*\n\n\n/*============================================================================\n*    Long int function S_solpos, adapted from the NREL VAX solar libraries\n*\n*    This function calculates the apparent solar position and intensity\n*    (theoretical maximum solar energy) based on the date, time, and\n*    location on Earth. (DEFAULT values are from the optional S_posinit\n*    function.)\n*\n*    Requires:\n*        Date and time:\n*            year\n*            month  (optional without daynum)\n*            day    (optional without daynum)\n*            daynum\n*            hour\n*            minute\n*            second\n*        Location:\n*            latitude\n*            longitude\n*        Location/time adjuster:\n*            timezone\n*        Atmospheric pressure and temperature:\n*            press     DEFAULT 1013.0 mb\n*            temp      DEFAULT 10.0 degrees C\n*        Tilt of flat surface that receives solar energy:\n*            aspect    DEFAULT 180 (South)\n*            tilt      DEFAULT 0 (Horizontal)\n*        Shadow band parameters:\n*            sbwid     DEFAULT 7.6 cm\n*            sbrad     DEFAULT 31.7 cm\n*            sbsky     DEFAULT 0.04\n*        Functionality\n*            function  DEFAULT S_ALL (all output parameters computed)\n*\n*    Returns:\n*        everything defined at the top of this listing.\n*----------------------------------------------------------------------------*/\nlong S_solpos (struct posdata *pdat);\n\n/*============================================================================\n*    Void function S_init\n*\n*    This function initiates all of the input functions to S_Solpos().\n*    NOTE: This function is optional if you initialize all input parameters\n*          in your calling code.\n*\n*    Requires: Pointer to a posdata structure, members of which are\n*           initialized.\n*\n*    Returns: Void\n*\n*----------------------------------------------------------------------------*/\nvoid S_init(struct posdata *pdat);\n\n\n/*============================================================================\n*    Void function S_decode\n*\n*    This function decodes the error codes from S_solpos return value\n*\n*    INPUTS: Long integer S_solpos return value, struct posdata*\n*\n*    OUTPUTS: Descriptive text of errors to stderr\n*----------------------------------------------------------------------------*/\nvoid S_decode(long code, struct posdata *pdat);\n\n"
  },
  {
    "path": "modules/stl_io/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-stl-io)\nK3D_CREATE_MODULE_PROXY(k3d-stl-io)\n\n"
  },
  {
    "path": "modules/stl_io/binary_stl.h",
    "content": "#ifndef MODULES_STL_IO_BINARY_STL_H\n#define MODULES_STL_IO_BINARY_STL_H\n\n// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-version-config.h>\n#include <k3dsdk/types.h>\n\n#include <fstream>\n\nnamespace module\n{\n\nnamespace stl\n{\n\nnamespace io\n{\n\n/// Binary encapsulation of a single facet\nstruct facet\n{\n\tk3d::float_t normal[3];\n\tk3d::float_t v0[3];\n\tk3d::float_t v1[3];\n\tk3d::float_t v2[3];\n\tk3d::uint16_t color;\n\n\t/// Sort using colors, to support the Hexpress mesher from Numeca\n\tbool operator<(const facet& b) const\n\t{\n\t\treturn color < b.color;\n\t}\n};\n\n/// Encapsulates the STL binary data format\nstruct binary_stl\n{\n\t/// Default constructor, write K-3D version info into the header\n\tbinary_stl()\n\t{\n\t\tk3d::string_t headstr =  k3d::string_t(\"K-3D \") + k3d::string_t(K3D_VERSION) + k3d::string_t(\" STL writer\");\n\t\tfor(k3d::uint_t i = 0 ; i != headstr.size(); ++i)\n\t\t\theader[i] = headstr[i];\n\t}\n\n\t/// Magics format constructor, writes material info into the header\n\tbinary_stl(const k3d::color& Color, const k3d::color& Diffuse, const k3d::color& Specular, const k3d::color& Ambient)\n\t{\n\t\tconst k3d::uint8_t color[] = {static_cast<k3d::uint8_t>(Color.red*255), static_cast<k3d::uint8_t>(Color.green*255), static_cast<k3d::uint8_t>(Color.blue*255), 0};\n\t\tconst k3d::uint8_t diffuse[] = {static_cast<k3d::uint8_t>(Diffuse.red*255), static_cast<k3d::uint8_t>(Diffuse.green*255), static_cast<k3d::uint8_t>(Diffuse.blue*255), 0};\n\t\tconst k3d::uint8_t specular[] = {static_cast<k3d::uint8_t>(Specular.red*255), static_cast<k3d::uint8_t>(Specular.green*255), static_cast<k3d::uint8_t>(Specular.blue*255), 0};\n\t\tconst k3d::uint8_t ambient[] = {static_cast<k3d::uint8_t>(Ambient.red*255), static_cast<k3d::uint8_t>(Ambient.green*255), static_cast<k3d::uint8_t>(Ambient.blue*255), 0};\n\t\tconst k3d::string_t color_str(reinterpret_cast<const char*>(color));\n\t\tconst k3d::string_t diffuse_str(reinterpret_cast<const char*>(diffuse));\n\t\tconst k3d::string_t specular_str(reinterpret_cast<const char*>(specular));\n\t\tconst k3d::string_t ambient_str(reinterpret_cast<const char*>(ambient));\n\t\tk3d::string_t headstr =  k3d::string_t(\"K-3D \") + k3d::string_t(K3D_VERSION) + k3d::string_t(\" STL writer COLOR=\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ color_str\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ \",MATERIAL=\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ diffuse_str\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ specular_str\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t+ ambient_str;\n\t\tstd::copy(headstr.begin(), headstr.end(), header);\n\t}\n\n\t/// Header containing file comment\n\tchar header[80];\n\tstd::vector<facet> facets;\n\n\tvoid write(std::ostream& Output)\n\t{\n\t\tOutput.write(header, 80);\n\t\tconst k3d::int32_t nfacets = facets.size();\n\t\tOutput.write(reinterpret_cast<const char*>(&nfacets), sizeof(k3d::int32_t));\n\t\tfor(k3d::uint_t triangle = 0; triangle != nfacets; ++triangle)\n\t\t{\n\t\t\tOutput.write(reinterpret_cast<char*>(&facets[triangle]), 50);\n\t\t}\n\t}\n\n\tvoid read(std::istream& Input)\n\t{\n\t\tInput.read(header, 80);\n\t\tk3d::int32_t nfacets = facets.size();\n\t\tInput.read(reinterpret_cast<char*>(&nfacets), sizeof(k3d::int32_t));\n\t\tfacets.resize(nfacets);\n\t\tfor(k3d::uint_t triangle = 0; triangle != nfacets; ++triangle)\n\t\t{\n\t\t\tInput.read(reinterpret_cast<char*>(&facets[triangle]), 50);\n\t\t}\n\t}\n};\n\n/// Switches the order of the two bytes that make up N\ninline k3d::uint16_t switch_bytes(k3d::uint16_t N)\n{\n\t// switch byte order\n\tk3d::uint8_t* result_array = reinterpret_cast<k3d::uint8_t*>(&N);\n\tk3d::uint8_t a = result_array[0];\n\tresult_array[0] = result_array[1];\n\tresult_array[1] = a;\n\treturn N;\n}\n\n} // namespace io\n\n} // namespace stl\n\n} // namespace module\n\n\n#endif // !MODULES_STL_IO_BINARY_STL_H\n"
  },
  {
    "path": "modules/stl_io/mesh_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/file_helpers.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/mesh_reader.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <set>\n\n#include \"binary_stl.h\"\n\nnamespace module\n{\n\nnamespace stl\n{\n\nnamespace io\n{\n\nnamespace detail\n{\n\n/// True if the supplied file is an ASCII STL file\nk3d::bool_t is_ascii(std::istream& Stream)\n{\n\tchar buffer[80];\n\tStream.read(buffer, 80);\n\tStream.seekg(0, std::ios::beg);\n\treturn (boost::algorithm::starts_with(buffer, \"solid\"));\n}\n\nstruct compare_points\n{\n\tbool operator()(const k3d::point3& A, const k3d::point3& B) const\n\t{\n\t\tif (A[0] != B[0])\n\t\t{\n\t\t\treturn A[0] < B[0];\n\t\t}\n\t\tif (A[1] != B[1])\n\t\t{\n\t\t\treturn A[1] < B[1];\n\t\t}\n\t\treturn A[2] < B[2];\n\t}\n};\n\ntypedef std::map<k3d::point3, k3d::uint_t, compare_points> point_map_t;\n\nvoid fill_points(const point_map_t& PointMap, k3d::mesh::points_t& Points)\n{\n\tPoints.resize(PointMap.size());\n\tfor(point_map_t::const_iterator it = PointMap.begin(); it != PointMap.end(); ++it)\n\t{\n\t\tPoints[it->second] = it->first;\n\t}\n}\n\n/// Adds a point without introducing duplicates\nk3d::uint_t add_point(point_map_t &PointMap, const k3d::point3 &Point)\n{\n\treturn PointMap.insert(std::make_pair(Point, PointMap.size())).first->second;\n}\n\n/// Extracts the STL topology information, merging points that are less than threshold apart\nvoid get_stl_topology(std::istream& Stream, k3d::mesh::points_t& Points, k3d::mesh::counts_t& VertexCounts, k3d::mesh::indices_t& VertexIndices, k3d::mesh::normals_t& Normals, const k3d::double_t Threshold = 1e-12)\n{\n\tconst k3d::double_t threshold = Threshold*Threshold;\n\n\tdetail::point_map_t point_map;\n\n\tk3d::string_t line_buffer;\n\tk3d::uint_t line_number = 0;\n\tk3d::mesh::indices_t face_points;\n\tk3d::normal3 face_normal;\n\tstd::set<k3d::string_t> added_faces; // stores a unique ID for each added face\n\tfor(k3d::getline(Stream, line_buffer); Stream; k3d::getline(Stream, line_buffer))\n\t{\n\t\t++line_number;\n\t\tk3d::string_t keyword;\n\t\tstd::istringstream line_stream(line_buffer);\n\t\tline_stream >> keyword;\n\n\t\tif(keyword == \"facet\")\n\t\t{\n\t\t\tk3d::string_t keyword2;\n\t\t\tline_stream >> keyword2;\n\t\t\tassert_warning(keyword2 == \"normal\");\n\t\t\tk3d::double_t x, y, z;\n\t\t\tline_stream >> x;\n\t\t\tline_stream >> y;\n\t\t\tline_stream >> z;\n\t\t\tface_normal = k3d::normalize(k3d::normal3(x,y,z));\n\t\t}\n\t\tif(keyword == \"vertex\")\n\t\t{\n\t\t\tk3d::double_t x, y, z;\n\t\t\tline_stream >> x;\n\t\t\tline_stream >> y;\n\t\t\tline_stream >> z;\n\t\t\tk3d::point3 new_point(x, y, z);\n\n\t\t\tface_points.push_back(detail::add_point(point_map, new_point));\n\t\t\tif(face_points.size() == 3)\n\t\t\t{\n\t\t\t\tstd::stringstream face_id_stream;\n\t\t\t\tface_id_stream << face_points[0] << face_points[1] << face_points[2];\n\t\t\t\tk3d::string_t face_id = face_id_stream.str();\n\t\t\t\tif(added_faces.count(face_id))\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << warning << \"Skipping duplicate face on line \" << line_number - 4 << std::endl;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tVertexIndices.insert(VertexIndices.end(), face_points.begin(), face_points.end());\n\t\t\t\t\tVertexCounts.push_back(3);\n\t\t\t\t\tNormals.push_back(face_normal);\n\t\t\t\t\tadded_faces.insert(face_id);\n\t\t\t\t}\n\t\t\t\tface_points.clear();\n\t\t\t}\n\t\t}\n\t\tif(keyword == \"endfacet\")\n\t\t{\n\t\t\tif(face_points.size())\n\t\t\t{\n\t\t\t\tstd::stringstream error_stream;\n\t\t\t\terror_stream << \"Error: STL file had less than 3 vertices for face ending on line \" << line_number;\n\t\t\t\tthrow std::runtime_error(error_stream.str());\n\t\t\t}\n\t\t}\n\t}\n\tdetail::fill_points(point_map, Points);\n}\n\nconst k3d::normal3 normal(const k3d::mesh::points_t Points, k3d::mesh::indices_t& VertexIndices, const k3d::uint_t FaceIndex)\n{\n\t// Calculates the normal for an edge loop using the summation method, which is more robust than the three-point methods (handles zero-length edges)\n\tk3d::normal3 result(0, 0, 0);\n\n\tconst k3d::uint_t face_start = 3*FaceIndex;\n\tconst k3d::uint_t face_end = face_start + 3;\n\tfor(k3d::uint_t point = face_start; point != face_end; ++point)\n\t{\n\t\tconst k3d::point3& i = Points[VertexIndices[point]];\n\t\tconst k3d::point3& j = Points[VertexIndices[(point+1) == face_end ? face_start : point + 1]];\n\n\t\tresult[0] += (i[1] + j[1]) * (j[2] - i[2]);\n\t\tresult[1] += (i[2] + j[2]) * (j[0] - i[0]);\n\t\tresult[2] += (i[0] + j[0]) * (j[1] - i[1]);\n\t}\n\n\treturn 0.5 * result;\n}\n\n/// Make the face orientation consistent with the normal stored on file\nvoid adjust_orientation(const k3d::mesh::points_t Points, k3d::mesh::indices_t& VertexIndices, const k3d::mesh::normals_t& Normals)\n{\n\tfor(k3d::uint_t face = 0; face != Normals.size(); ++face)\n\t{\n\t\tconst k3d::normal3 calculated_normal = k3d::normalize(normal(Points, VertexIndices, face));\n\t\tconst k3d::normal3& stored_normal = Normals[face];\n\t\tconst k3d::uint_t face_start = face * 3;\n\t\tif((calculated_normal * stored_normal) < 0)\n\t\t{\n\t\t\t// stored normal is opposite to face rientation, so we flip face orientation\n\t\t\tconst k3d::uint_t old_first_point = VertexIndices[face_start];\n\t\t\tVertexIndices[face_start] = VertexIndices[face_start + 1];\n\t\t\tVertexIndices[face_start + 1] = old_first_point;\n\t\t}\n\t}\n}\n\n/// 2-byte integer value to a K-3D color\nk3d::color convert_color_viscam(const k3d::uint16_t Color, const k3d::color& BaseColor)\n{\n\tk3d::uint16_t color = switch_bytes(Color);\n\tconst k3d::uint16_t blue = color >> 11;\n\tconst k3d::uint16_t green = (color - (blue << 11)) >> 6;\n\tconst k3d::uint16_t red = (color - (blue << 11) - (green << 6)) >> 1;\n\tconst k3d::uint16_t use_color = (color - (blue << 11) - (green << 6) - (red << 1));\n\tconst k3d::color result = use_color ? k3d::color(static_cast<k3d::double_t>(red)/31., static_cast<k3d::double_t>(green)/31., static_cast<k3d::double_t>(blue)/31.) : BaseColor;\n\treturn result;\n}\n\n/// 2-byte integer value to a K-3D color\nk3d::color convert_color_magics(const k3d::uint16_t Color, const k3d::color& BaseColor)\n{\n\tk3d::uint16_t color = switch_bytes(Color);\n\tconst k3d::uint16_t red = color >> 11;\n\tconst k3d::uint16_t green = (color - (red << 11)) >> 6;\n\tconst k3d::uint16_t blue = (color - (red << 11) - (green << 6)) >> 1;\n\tconst k3d::uint16_t use_color = (color - (red << 11) - (green << 6) - (blue << 1));\n\tconst k3d::color result = !use_color ? k3d::color(static_cast<k3d::double_t>(red)/31., static_cast<k3d::double_t>(green)/31., static_cast<k3d::double_t>(blue)/31.) : BaseColor;\n\treturn result;\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_reader\n\nclass mesh_reader :\n\tpublic k3d::mesh_reader<k3d::node >\n{\n\ttypedef k3d::mesh_reader<k3d::node > base;\n\npublic:\n\tmesh_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_threshold(init_owner(*this) + init_name(\"threshold\") + init_label(_(\"Threshold\")) + init_description(_(\"Controls the sensitivity for deciding when two edges are collinear.\")) + init_value(1e-8) + init_step_increment(1e-8) + init_units(typeid(k3d::measurement::scalar))),\n\t\tm_store_normals(init_owner(*this) + init_name(\"store_normals\") + init_label(_(\"Store Normals\")) + init_description(_(\"If true, the normals from the STL file are read into a face attribute array\")) + init_value(false)),\n\t\tm_color_array(init_owner(*this) + init_name(\"color_array\") + init_label(_(\"Color Array\")) + init_description(_(\"Name of the array containing face colors (for binary, colored STL only)\")) + init_value(std::string(\"Cs\")))\n\t{\n\t\tm_threshold.changed_signal().connect(k3d::hint::converter<\n\t\t\t\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reload_mesh_slot()));\n\t\tm_store_normals.changed_signal().connect(k3d::hint::converter<\n\t\t\t\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reload_mesh_slot()));\n\t}\n\n\tvoid on_load_mesh(const k3d::filesystem::path& Path, k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\tk3d::filesystem::ifstream file(Path);\n\t\tif(!file)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": error opening [\" << Path.native_console_string() << \"]\" << std::endl;\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tk3d::mesh::points_t points;\n\t\tk3d::mesh::counts_t vertex_counts;\n\t\tk3d::mesh::indices_t vertex_indices;\n\t\tk3d::mesh::normals_t face_normals;\n\t\t\n\t\tdetail::point_map_t point_map;\n\t\t\n\t\ttry\n\t\t{\n\t\t\tif(detail::is_ascii(file))\n\t\t\t{\n\t\t\t\tdetail::get_stl_topology(file, points, vertex_counts, vertex_indices, face_normals, m_threshold.pipeline_value());\n\t\t\t\tdetail::adjust_orientation(points, vertex_indices, face_normals);\n\t\t\t\tk3d::polyhedron::primitive* polyhedron = k3d::polyhedron::create(Output, points, vertex_counts, vertex_indices, static_cast<k3d::imaterial*>(0));\n\t\t\t\tif(m_store_normals.pipeline_value())\n\t\t\t\t\tpolyhedron->face_attributes.create(\"N\", new k3d::mesh::normals_t(face_normals));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst k3d::double_t threshold = m_threshold.pipeline_value();\n\t\t\t\tk3d::mesh::colors_t face_colors;\n\t\t\t\tbinary_stl stl;\n\t\t\t\tstl.read(file);\n\t\t\t\tk3d::color base_color(0.8, 0.8, 0.8);\n\t\t\t\tk3d::bool_t is_magics = false;\n\t\t\t\tif(boost::algorithm::contains(stl.header, \"COLOR=\"))\n\t\t\t\t{\n\t\t\t\t\tk3d::uint8_t* color = reinterpret_cast<k3d::uint8_t*>(boost::algorithm::find_first(stl.header, \"COLOR=\").end());\n\t\t\t\t\tbase_color = k3d::color(static_cast<k3d::double_t>(color[0]/255.), static_cast<k3d::double_t>(color[1]/255.), static_cast<k3d::double_t>(color[2]/255.));\n\t\t\t\t\tis_magics = true;\n\t\t\t\t} else if(boost::algorithm::contains(stl.header, \"MATERIAL=\"))\n\t\t\t\t{\n\t\t\t\t\tk3d::uint8_t* color = reinterpret_cast<k3d::uint8_t*>(boost::algorithm::find_first(stl.header, \"MATERIAL=\").end());\n\t\t\t\t\tbase_color = k3d::color(static_cast<k3d::double_t>(color[0]/255.), static_cast<k3d::double_t>(color[1]/255.), static_cast<k3d::double_t>(color[2]/255.));\n\t\t\t\t\tis_magics = true;\n\t\t\t\t}\n\t\t\t\tconst k3d::uint_t nfacets = stl.facets.size();\n\t\t\t\tvertex_counts.reserve(nfacets);\n\t\t\t\tface_normals.reserve(nfacets);\n\t\t\t\tface_colors.reserve(nfacets);\n\t\t\t\tvertex_indices.reserve(3*nfacets);\n\t\t\t\tfor(k3d::uint_t f = 0; f != nfacets; ++f)\n\t\t\t\t{\n\t\t\t\t\tvertex_counts.push_back(3);\n\t\t\t\t\tk3d::point3 p0(stl.facets[f].v0[0], stl.facets[f].v0[1], stl.facets[f].v0[2]);\n\t\t\t\t\tk3d::point3 p1(stl.facets[f].v1[0], stl.facets[f].v1[1], stl.facets[f].v1[2]);\n\t\t\t\t\tk3d::point3 p2(stl.facets[f].v2[0], stl.facets[f].v2[1], stl.facets[f].v2[2]);\n\t\t\t\t\tvertex_indices.push_back(detail::add_point(point_map, p0));\n\t\t\t\t\tvertex_indices.push_back(detail::add_point(point_map, p1));\n\t\t\t\t\tvertex_indices.push_back(detail::add_point(point_map, p2));\n\t\t\t\t\tface_normals.push_back(k3d::normal3(stl.facets[f].normal[0], stl.facets[f].normal[1], stl.facets[f].normal[2]));\n\t\t\t\t\tface_colors.push_back(is_magics ? detail::convert_color_magics(stl.facets[f].color, base_color) : detail::convert_color_viscam(stl.facets[f].color, base_color));\n\t\t\t\t}\n\t\t\t\tdetail::fill_points(point_map, points);\n\t\t\t\tk3d::polyhedron::primitive* polyhedron = k3d::polyhedron::create(Output, points, vertex_counts, vertex_indices, static_cast<k3d::imaterial*>(0));\n\t\t\t\tpolyhedron->face_attributes.create(m_color_array.pipeline_value(), new k3d::mesh::colors_t(face_colors));\n\t\t\t}\n\t\t}\n\t\tcatch(std::runtime_error& E)\n\t\t{\n\t\t\tk3d::log() << error << \"STLMeshReader: \" << E.what() << std::endl;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_reader,\n                k3d::interface_list<k3d::imesh_source,\n                k3d::interface_list<k3d::imesh_storage> > > factory(\n\t\t\tk3d::uuid(0x6518a3a6, 0x8147c354, 0x82bbc381, 0x82077bf8),\n\t\t\t\"STLMeshReader\",\n\t\t\t_(\"Mesh reader that loads external Wavefront (.stl) files into the document by reference\"),\n\t\t\t\"MeshReader\");\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_threshold;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_store_normals;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color_array;\n};\n\nk3d::iplugin_factory& mesh_reader_factory()\n{\n\treturn mesh_reader::get_factory();\n}\n\n} // namespace io\n\n} // namespace stl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/stl_io/mesh_writer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\t02111-1307\tUSA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/ihint.h>\n#include <k3dsdk/mesh_writer.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/triangulator.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <set>\n\n#include \"binary_stl.h\"\n\nnamespace module\n{\n\nnamespace stl\n{\n\nnamespace io\n{\n\nnamespace detail\n{\n\n/// Convert the given color to a 2-byte sized integer. VisCAM/SolidView format.\nk3d::uint16_t convert_color_viscam(const k3d::color& Color)\n{\n\tconst k3d::uint16_t red = static_cast<k3d::uint16_t>(Color.red*31);\n\tconst k3d::uint16_t green = static_cast<k3d::uint16_t>(Color.green*31);\n\tconst k3d::uint16_t blue = static_cast<k3d::uint16_t>(Color.blue*31);\n\treturn switch_bytes((blue << 11) + (green << 6) + (red << 1) + 1); // last bit should be 1\n\n}\n\n/// Convert the given color to a 2-byte sized integer. Magics format.\nk3d::uint16_t convert_color_magics(const k3d::color& Color)\n{\n\tconst k3d::uint16_t red = static_cast<k3d::uint16_t>(Color.red*31);\n\tconst k3d::uint16_t green = static_cast<k3d::uint16_t>(Color.green*31);\n\tconst k3d::uint16_t blue = static_cast<k3d::uint16_t>(Color.blue*31);\n\treturn switch_bytes((red << 11) + (green << 6) + (blue << 1)); // last bit should be 0\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_writerio\n\nclass mesh_writer :\n\tpublic k3d::mesh_writer<k3d::node >\n{\n\ttypedef k3d::mesh_writer<k3d::node > base;\n\npublic:\n\tmesh_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_group_solids(init_owner(*this) + init_name(\"group_solids\") + init_label(_(\"Group Solids\")) + init_description(_(\"Group solids using a per-face array.\")) + init_value(false)),\n\t\tm_group_array(init_owner(*this) + init_name(\"group_array\") + init_label(_(\"Group Array\")) + init_description(_(\"Name of a per-face array containing solid labels (as used in OpenFOAM).\")) + init_value(std::string(\"solids\"))),\n\t\tm_color_array(init_owner(*this) + init_name(\"color_array\") + init_label(_(\"Color Array\")) + init_description(_(\"Name of the array containing face colors (for binary, colored STL only)\")) + init_value(std::string(\"Cs\"))),\n\t\tm_file_type(init_owner(*this) + init_name(\"file_type\") + init_label(_(\"File Type\")) + init_description(_(\"STL file type\")) + init_value(ASCII) + init_enumeration(type_values()))\n\t{\n\t\tm_group_solids.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_write_file_slot()));\n\t\tm_group_array.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_write_file_slot()));\n\t\tm_color_array.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_write_file_slot()));\n\t\tm_file_type.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_write_file_slot()));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_writer, k3d::interface_list<k3d::imesh_sink > > factory(\n\t\t\tk3d::uuid(0x1de22bd7, 0xee49eca0, 0x827240b3, 0xaf18e521),\n\t\t\t\"STLMeshWriter\",\n\t\t\t_(\"Mesh writer that saves external Stereo Triangulation Lithograph (.stl) files\"),\n\t\t\t\"MeshWriter\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tclass triangulator :\n\t\tpublic k3d::triangulator\n\t{\n\t\ttypedef k3d::triangulator base;\n\n\tpublic:\n\t\ttriangulator(const k3d::mesh::strings_t* const FaceGroups, const k3d::mesh::colors_t* const FaceColors, k3d::mesh::points_t& TrianglePoints, k3d::mesh::indices_t& TriangleIndices, k3d::mesh::strings_t& TriangleGroups, k3d::mesh::colors_t& TriangleColors) :\n\t\t\tface_groups(FaceGroups),\n\t\t\tface_colors(FaceColors),\n\t\t\ttriangle_points(TrianglePoints),\n\t\t\ttriangle_indices(TriangleIndices),\n\t\t\ttriangle_groups(TriangleGroups),\n\t\t\ttriangle_colors(TriangleColors)\n\t\t{\n\t\t}\n\n\tprivate:\n\t\tvoid start_face(const k3d::uint_t Face)\n\t\t{\n\t\t\tcurrent_face = Face;\n\t\t}\n\n\t\tvoid add_vertex(const k3d::point3& Coordinates, k3d::uint_t Vertices[4], k3d::uint_t Edges[4], double Weights[4], k3d::uint_t& NewVertex)\n\t\t{\n\t\t\tNewVertex = triangle_points.size();\n\t\t\ttriangle_points.push_back(Coordinates);\n\t\t}\n\n\t\tvoid add_triangle(k3d::uint_t Vertices[3], k3d::uint_t Edges[3])\n\t\t{\n\t\t\ttriangle_indices.push_back(Vertices[0]);\n\t\t\ttriangle_indices.push_back(Vertices[1]);\n\t\t\ttriangle_indices.push_back(Vertices[2]);\n\n\t\t\ttriangle_groups.push_back(face_groups ? face_groups->at(current_face) : \"default\");\n\t\t\ttriangle_colors.push_back(face_colors ? face_colors->at(current_face) : k3d::color(1., 0., 0.));\n\t\t}\n\n\t\tconst k3d::mesh::strings_t* const face_groups;\n\t\tconst k3d::mesh::colors_t* const face_colors;\n\t\tk3d::mesh::points_t& triangle_points;\n\t\tk3d::mesh::indices_t& triangle_indices;\n\t\tk3d::mesh::strings_t& triangle_groups;\n\t\tk3d::mesh::colors_t& triangle_colors;\n\t\tk3d::uint_t current_face;\n\t};\n\n\tvoid on_write_mesh(const k3d::mesh& Input, const k3d::filesystem::path& OutputPath, std::ostream& Output)\n\t{\n\t\tstl_t type = m_file_type.pipeline_value();\n\t\tconst k3d::bool_t ascii = (type == ASCII);\n\t\tk3d::color base_color(0.8,0.8,0.8); // TODO: look this up from material\n\t\tbinary_stl stl = (type == MAGICS) ? binary_stl(base_color, base_color, base_color, base_color) : binary_stl();\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = Input.primitives.begin(); primitive != Input.primitives.end(); ++primitive)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(Input, **primitive));\n\t\t\tif(!polyhedron)\n\t\t\t\tcontinue;\n\n\t\t\t// Setup our inputs and outputs ...\n\t\t\tconst k3d::mesh::strings_t* const face_groups = m_group_solids.pipeline_value() ? polyhedron->face_attributes.lookup<k3d::mesh::strings_t>(m_group_array.pipeline_value()) : 0;\n\t\t\tconst k3d::mesh::colors_t* face_colors = polyhedron->face_attributes.lookup<k3d::mesh::colors_t>(m_color_array.pipeline_value());\n\n\t\t\tk3d::mesh::points_t triangle_points = *Input.points;\n\t\t\tk3d::mesh::indices_t triangle_indices;\n\t\t\tk3d::mesh::strings_t triangle_groups;\n\t\t\tk3d::mesh::colors_t triangle_colors;\n\n\t\t\t// Triangulate the polyhedron ...\n\t\t\ttriangulator(face_groups, face_colors, triangle_points, triangle_indices, triangle_groups, triangle_colors).process(Input, *polyhedron);\n\n\t\t\t// Get the set of unique face group names ...\n\t\t\tstd::set<k3d::string_t> triangle_group_names(triangle_groups.begin(), triangle_groups.end());\n\n\t\t\tconst k3d::uint_t triangle_begin = 0;\n\t\t\tconst k3d::uint_t triangle_end = triangle_begin + triangle_groups.size();\n\t\t\tif(ascii)\n\t\t\t{\n\t\t\t\t// For each group of triangles, write-out an STL solid ...\n\t\t\t\tfor(std::set<k3d::string_t>::const_iterator triangle_group_name = triangle_group_names.begin(); triangle_group_name != triangle_group_names.end(); ++triangle_group_name)\n\t\t\t\t{\n\t\t\t\t\tOutput << \"solid \" << *triangle_group_name << \"\\n\";\n\n\t\t\t\t\tfor(k3d::uint_t triangle = triangle_begin; triangle != triangle_end; ++triangle)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(triangle_groups[triangle] != *triangle_group_name)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tconst k3d::point3 a = triangle_points[triangle_indices[(3 * triangle) + 0]];\n\t\t\t\t\t\tconst k3d::point3 b = triangle_points[triangle_indices[(3 * triangle) + 1]];\n\t\t\t\t\t\tconst k3d::point3 c = triangle_points[triangle_indices[(3 * triangle) + 2]];\n\n\t\t\t\t\t\tOutput << \"facet normal \" << k3d::polyhedron::normal(a, b, c) << \"\\n\";\n\t\t\t\t\t\tOutput << \"  outer loop\\n\";\n\t\t\t\t\t\tOutput << \"    vertex \" << a << \"\\n\";\n\t\t\t\t\t\tOutput << \"    vertex \" << c << \"\\n\"; // Note: STL stores faces with right-hand ordering!\n\t\t\t\t\t\tOutput << \"    vertex \" << b << \"\\n\";\n\t\t\t\t\t\tOutput << \"  endloop\\n\";\n\t\t\t\t\t\tOutput << \"endfacet\\n\";\n\t\t\t\t\t}\n\t\t\t\t\tOutput << \"endsolid\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor(k3d::uint_t triangle = triangle_begin; triangle != triangle_end; ++triangle)\n\t\t\t\t{\n\t\t\t\t\tfacet fct;\n\n\t\t\t\t\tconst k3d::point3 a = triangle_points[triangle_indices[(3 * triangle) + 0]];\n\t\t\t\t\tconst k3d::point3 b = triangle_points[triangle_indices[(3 * triangle) + 1]];\n\t\t\t\t\tconst k3d::point3 c = triangle_points[triangle_indices[(3 * triangle) + 2]];\n\t\t\t\t\tfct.v0[0] = a[0];\n\t\t\t\t\tfct.v0[1] = a[1];\n\t\t\t\t\tfct.v0[2] = a[2];\n\t\t\t\t\tfct.v1[0] = b[0];\n\t\t\t\t\tfct.v1[1] = b[1];\n\t\t\t\t\tfct.v1[2] = b[2];\n\t\t\t\t\tfct.v2[0] = c[0];\n\t\t\t\t\tfct.v2[1] = c[1];\n\t\t\t\t\tfct.v2[2] = c[2];\n\n\t\t\t\t\tconst k3d::normal3 n = k3d::normalize(k3d::polyhedron::normal(a, b, c));\n\t\t\t\t\tfct.normal[0] = n[0];\n\t\t\t\t\tfct.normal[1] = n[1];\n\t\t\t\t\tfct.normal[2] = n[2];\n\n\t\t\t\t\tfct.color = type == VISCAM ? detail::convert_color_viscam(triangle_colors[triangle]) : detail::convert_color_magics(triangle_colors[triangle]);\n\n\t\t\t\t\tstl.facets.push_back(fct);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tstd::sort(stl.facets.begin(), stl.facets.end());\n\t\tif(!ascii)\n\t\t\tstl.write(Output);\n\t}\n\nprivate:\n\n\t/// Enumerates supported STL types\n\ttypedef enum\n\t{\n\t\tASCII,\n\t\tVISCAM,\n\t\tMAGICS\n\t} stl_t;\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const stl_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase ASCII:\n\t\t\t\tStream << \"ascii\";\n\t\t\t\tbreak;\n\t\t\tcase VISCAM:\n\t\t\t\tStream << \"viscam\";\n\t\t\t\tbreak;\n\t\t\tcase MAGICS:\n\t\t\t\tStream << \"magics\";\n\t\t\t\tbreak;\n\t\t}\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator >> (std::istream& Stream, stl_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"ascii\")\n\t\t\tValue = ASCII;\n\t\telse if(text == \"viscam\")\n\t\t\tValue = VISCAM;\n\t\telse if(text == \"magics\")\n\t\t\tValue = MAGICS;\n\t\telse\n\t\t\tk3d::log() << error << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& type_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"ASCII\", \"ascii\", \"ASCII file format\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"VisCAM/SolidView\", \"viscam\", \"Binary STL, VisCAM/SolidView color encoding\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Magics\", \"magics\", \"Binary STL, Materialise Magics color encoding\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_group_solids;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_group_array;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color_array;\n\tk3d_data(stl_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_file_type;\n};\n\nk3d::iplugin_factory& mesh_writer_factory()\n{\n\treturn mesh_writer::get_factory();\n}\n\n} // namespace io\n\n} // namespace stl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/stl_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace stl\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& mesh_reader_factory();\nextern k3d::iplugin_factory& mesh_writer_factory();\n\n} // namespace io\n\n} // namespace obj\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::stl::io::mesh_reader_factory());\n\tRegistry.register_factory(module::stl::io::mesh_writer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/subdivision_surface/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-subdivision-surface)\nK3D_CREATE_MODULE_PROXY(k3d-subdivision-surface)\n\nTARGET_LINK_LIBRARIES(k3d-subdivision-surface k3dsdk-subdivision-surface)\n\n"
  },
  {
    "path": "modules/subdivision_surface/catmull_clark_subdivider.cpp",
    "content": "// K-3D\n// Copyright (c) 2004-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n\n#include <k3dsdk/subdivision_surface/catmull_clark.h>\n\n#include <boost/ptr_container/ptr_map.hpp>\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace subdivision_surface\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// catmull_clark_subdivider\n\nclass catmull_clark_subdivider :\n\tpublic k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > >\n{\n\ttypedef k3d::mesh_selection_sink<k3d::mesh_modifier<k3d::node > > base;\n\npublic:\n\tcatmull_clark_subdivider(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_level(init_owner(*this) + init_name(\"level\") + init_label(_(\"Level\")) + init_description(_(\"Subdivision level\")) + init_constraint(constraint::minimum<k3d::int32_t>(0)) + init_value(1) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_mesh_selection.changed_signal().connect(make_reset_mesh_slot());\n\t\tm_level.changed_signal().connect(make_reset_mesh_slot());\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tm_subdividers.clear();\n\t\tif(m_level.pipeline_value() == 0)\n\t\t{\n\t\t\tOutput = Input;\n\t\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), Output);\n\t\t}\n\n\t\tk3d::mesh mesh_merged_selection = Input;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), mesh_merged_selection);\n\t\tconst k3d::uint_t level = m_level.pipeline_value();\n\t\tconst k3d::uint_t primitive_count = mesh_merged_selection.primitives.size();\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != primitive_count; ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(mesh_merged_selection, *mesh_merged_selection.primitives[prim_idx]));\n\t\t\tif(!polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\tm_subdividers[prim_idx].set_levels(level);\n\t\t\tm_subdividers[prim_idx].create_mesh(*mesh_merged_selection.points, *polyhedron, polyhedron->face_selections, this);\n\t\t}\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tif(m_level.pipeline_value() == 0)\n\t\t\treturn;\n\t\tk3d::mesh mesh_merged_selection = Input;\n\t\tOutput = mesh_merged_selection;\n\t\tk3d::geometry::selection::merge(m_mesh_selection.pipeline_value(), mesh_merged_selection);\n\t\tconst k3d::uint_t primitive_count = mesh_merged_selection.primitives.size();\n\t\tk3d::mesh::points_t& output_points = Output.points.writable();\n\t\tfor(k3d::uint_t prim_idx = 0; prim_idx != primitive_count; ++prim_idx)\n\t\t{\n\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> input_polyhedron(k3d::polyhedron::validate(mesh_merged_selection, *mesh_merged_selection.primitives[prim_idx]));\n\t\t\tif(!input_polyhedron.get())\n\t\t\t\tcontinue;\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> output_polyhedron(k3d::polyhedron::create(Output.primitives[prim_idx].create()));\n\t\t\tm_subdividers[prim_idx].update_mesh(*mesh_merged_selection.points, *input_polyhedron, mesh_merged_selection.point_attributes, input_polyhedron->face_selections, this);\n\t\t\tm_subdividers[prim_idx].copy_output(output_points, *output_polyhedron, Output.point_attributes);\n\t\t}\n\t\tOutput.point_selection.writable().resize(output_points.size(), 0.0);\n\t\tk3d::mesh::bools_t unused_points;\n\t\tk3d::mesh::lookup_unused_points(Output, unused_points);\n\t\tk3d::mesh::delete_points(Output, unused_points);\n\t}\n\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<catmull_clark_subdivider,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xdc73f6e3, 0x744b4b51, 0xac535307, 0xc82d261c),\n\t\t\t\t\"CatmullClark\",\n\t\t\t\t_(\"Generates a Catmull-Clark subdivision mesh\"),\n\t\t\t\t\"Subdivision\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_level;\n\tboost::ptr_map<const k3d::uint_t, k3d::sds::catmull_clark_subdivider> m_subdividers;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// catmull_clark_subdivision_factory\n\nk3d::iplugin_factory& catmull_clark_subdivision_factory()\n{\n\treturn catmull_clark_subdivider::get_factory();\n}\n\n} // namespace subdivision_surface\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/subdivision_surface/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace subdivision_surface\n{\n\nextern k3d::iplugin_factory& catmull_clark_subdivision_factory();\n\n} // namespace subdivision_surface\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::subdivision_surface::catmull_clark_subdivision_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/svg_io/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-svg-io)\nK3D_CREATE_MODULE_PROXY(k3d-svg-io)\n\n"
  },
  {
    "path": "modules/svg_io/mesh_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/mesh_reader.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/xml.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/assign/list_of.hpp>\n#include <boost/lexical_cast.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <stack>\n\nusing namespace boost::assign;\n\nnamespace module\n{\n\nnamespace svg\n{\n\nnamespace io\n{\n\n/// Defines storage for a LIFO collection of transformation matrices.\ntypedef std::stack<k3d::matrix4> transform_stack;\n\n/// Helper function for parse_path to extract a pair (x,y) regardless of the Format i.e. \"x,y\" or \"x y\".\nstatic bool get_pair(std::istream& Stream, k3d::double_t& X, k3d::double_t& Y)\n{\n\tstd::streampos pos = Stream.tellg();\n\t\n\tstd::string input;\n\tStream >> input;\n\tstd::stringstream value_stream(input);\n\t\n\tbool success = true;\n\tif(!(value_stream >> X))\n\t{\n\t\tsuccess = false;\n\t}\n\tif(success && value_stream.eof()) // separator is a space, so we only ate the first number\n\t{\n\t\tif(!(Stream >> Y))\n\t\t{\n\t\t\tsuccess = false;\n\t\t}\n\t}\n\telse if(success)\n\t{\n\t\tchar separator;\n\t\tif(!(value_stream >> separator >> Y))\n\t\t{\n\t\t\tsuccess = false;\n\t\t}\n\t}\n\n\tif(!success)\n\t{\n\t\tStream.seekg(pos);\n\t\tX = 0;\n\t\tY = 0;\n\t}\n\treturn success;\n}\n\n/// Tries to find the color of the given element. Returns true if a color was found\nk3d::bool_t get_color(const k3d::xml::element& SVG, k3d::color& Color)\n{\n\tk3d::string_t style = k3d::xml::attribute_text(SVG, \"style\");\n\tk3d::mesh::strings_t styles;\n\tboost::split(styles, style, boost::is_any_of(\";\"));\n\tfor(k3d::uint_t i = 0; i != styles.size(); ++i)\n\t{\n\t\tif(boost::algorithm::starts_with(styles[i], \"stroke:\"))\n\t\t{\n\t\t\tconst k3d::string_t stroke = boost::trim_copy(boost::erase_head_copy(styles[i], 7));\n\t\t\tif(boost::iequals(stroke, \"none\"))\n\t\t\t{\n\t\t\t\tColor = k3d::color(0., 0., 0.);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tstd::stringstream stream;\n\t\t\tk3d::uint32_t red, green, blue;\n\t\t\tstream << \"0x000000\" << stroke.substr(0, 2);\n\t\t\tstream >> std::hex >> red;\n\t\t\tstream.clear();\n\t\t\tstream << \"0x000000\" << stroke.substr(2, 2);\n\t\t\tstream >> std::hex >> green;\n\t\t\tstream.clear();\n\t\t\tstream << \"0x000000\" << stroke.substr(4, 2);\n\t\t\tstream >> std::hex >> blue;\n\t\t\tColor = k3d::color(static_cast<k3d::double_t>(red)/255.0, static_cast<k3d::double_t>(green)/255.0, static_cast<k3d::double_t>(blue)/255.0);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nstatic void parse_line(const k3d::xml::element& SVG, transform_stack& Transformation, k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Primitive)\n{\n\tconst k3d::double_t x1 = k3d::xml::attribute_value<k3d::double_t>(SVG, \"x1\", 0);\n\tconst k3d::double_t y1 = k3d::xml::attribute_value<k3d::double_t>(SVG, \"y1\", 0);\n\tconst k3d::double_t x2 = k3d::xml::attribute_value<k3d::double_t>(SVG, \"x2\", 1);\n\tconst k3d::double_t y2 = k3d::xml::attribute_value<k3d::double_t>(SVG, \"y2\", 1);\n\n\tk3d::mesh::points_t control_points;\n\tcontrol_points.push_back(Transformation.top() * k3d::point3(x1, y1, 0));\n\tcontrol_points.push_back(Transformation.top() * k3d::point3(x2, y2, 0));\n\n\tk3d::nurbs_curve::add_curve(Mesh, Primitive, 2, control_points);\n}\n\nstatic void parse_rect(const k3d::xml::element& SVG, transform_stack& Transformation, k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Primitive)\n{\n\tconst k3d::double_t x = k3d::xml::attribute_value<k3d::double_t>(SVG, \"x\", 0);\n\tconst k3d::double_t y = k3d::xml::attribute_value<k3d::double_t>(SVG, \"y\", 0);\n\tconst k3d::double_t w = k3d::xml::attribute_value<k3d::double_t>(SVG, \"width\", 1);\n\tconst k3d::double_t h = k3d::xml::attribute_value<k3d::double_t>(SVG, \"height\", 1);\n\tk3d::double_t rx = k3d::xml::attribute_value<k3d::double_t>(SVG, \"rx\", -1);\n\tk3d::double_t ry = k3d::xml::attribute_value<k3d::double_t>(SVG, \"ry\", -1);\n\n\tif(ry == -1)\n\t\try = rx;\n\telse if(rx == -1)\n\t\trx = ry;\n\n\tif(rx <=0 && ry <= 0)\n\t{\n\t\tk3d::mesh::points_t points;\n\t\tpoints.push_back(Transformation.top() * k3d::point3(x, y, 0));\n\t\tpoints.push_back(Transformation.top() * k3d::point3(x + w, y, 0));\n\t\tpoints.push_back(Transformation.top() * k3d::point3(x + w, y + h, 0));\n\t\tpoints.push_back(Transformation.top() * k3d::point3(x, y + h, 0));\n\n\t\tk3d::mesh::orders_t orders(4, 2);\n\t\tk3d::mesh::counts_t control_point_counts(4, 2);\n\n\t\tk3d::mesh::indices_t control_points = boost::assign::list_of(0)(1)(1)(2)(2)(3)(3)(0);\n\n\t\tk3d::nurbs_curve::add_curves(Mesh, Primitive, points, orders, control_point_counts, control_points);\n\t}\n\telse\n\t{\n\n\t\t// Create a circular_arc in the positive quadrant and mirror points to generate corners ...\n\t\tk3d::mesh::knots_t corner_knots;\n\t\tk3d::mesh::weights_t corner_weights;\n\t\tk3d::mesh::points_t corner_control_points;\n\t\tk3d::nurbs_curve::circular_arc(k3d::vector3(rx, 0, 0), k3d::vector3(0, ry, 0), 0, k3d::pi() / 2, 1, corner_knots, corner_weights, corner_control_points);\n\n\t\t// Setup curves ...\n\t\tk3d::mesh::points_t points;\n\t\tk3d::mesh::orders_t orders;\n\t\tk3d::mesh::counts_t control_point_counts;\n\t\tk3d::mesh::indices_t control_points;\n\t\tk3d::mesh::weights_t control_point_weights;\n\t\tk3d::mesh::knots_t knots;\n\n\t\t// Upper left corner ...\n\t\torders.push_back(3);\n\t\tcontrol_point_counts.push_back(corner_control_points.size());\n\t\tknots.insert(knots.end(), corner_knots.begin(), corner_knots.end());\n\t\tfor(k3d::uint_t i = 0; i != corner_control_points.size(); ++i)\n\t\t{\n\t\t\tcontrol_points.push_back(points.size());\n\t\t\tcontrol_point_weights.push_back(corner_weights[i]);\n\t\t\tpoints.push_back(Transformation.top() * k3d::point3(x + rx - corner_control_points[i][0], y + ry - corner_control_points[i][1], 0));\n\t\t}\n\n\t\t// Top side ...\n\t\torders.push_back(2);\n\t\tcontrol_point_counts.push_back(2);\n\t\tk3d::nurbs_curve::add_open_uniform_knots(2, 2, knots);\n\t\tcontrol_points.push_back(control_points.back());\n\t\tcontrol_points.push_back(points.size());\n\t\tcontrol_point_weights.push_back(1);\n\t\tcontrol_point_weights.push_back(1);\n\n\t\t// Upper right corner ...\n\t\torders.push_back(3);\n\t\tcontrol_point_counts.push_back(corner_control_points.size());\n\t\tknots.insert(knots.end(), corner_knots.begin(), corner_knots.end());\n\t\tfor(k3d::uint_t i = corner_control_points.size(); i != 0; --i)\n\t\t{\n\t\t\tcontrol_points.push_back(points.size());\n\t\t\tcontrol_point_weights.push_back(corner_weights[i-1]);\n\t\t\tpoints.push_back(Transformation.top() * k3d::point3(x + w - rx + corner_control_points[i-1][0], y + ry - corner_control_points[i-1][1], 0));\n\t\t}\n\n\t\t// Right side ...\n\t\torders.push_back(2);\n\t\tcontrol_point_counts.push_back(2);\n\t\tk3d::nurbs_curve::add_open_uniform_knots(2, 2, knots);\n\t\tcontrol_points.push_back(control_points.back());\n\t\tcontrol_points.push_back(points.size());\n\t\tcontrol_point_weights.push_back(1);\n\t\tcontrol_point_weights.push_back(1);\n\n\t\t// Lower right corner\n\t\torders.push_back(3);\n\t\tcontrol_point_counts.push_back(corner_control_points.size());\n\t\tknots.insert(knots.end(), corner_knots.begin(), corner_knots.end());\n\t\tfor(k3d::uint_t i = 0; i != corner_control_points.size(); ++i)\n\t\t{\n\t\t\tcontrol_points.push_back(points.size());\n\t\t\tcontrol_point_weights.push_back(corner_weights[i]);\n\t\t\tpoints.push_back(Transformation.top() * k3d::point3(x + w - rx + corner_control_points[i][0], y + h - ry + corner_control_points[i][1], 0));\n\t\t}\n\n\t\t// Bottom side ...\n\t\torders.push_back(2);\n\t\tcontrol_point_counts.push_back(2);\n\t\tk3d::nurbs_curve::add_open_uniform_knots(2, 2, knots);\n\t\tcontrol_points.push_back(control_points.back());\n\t\tcontrol_points.push_back(points.size());\n\t\tcontrol_point_weights.push_back(1);\n\t\tcontrol_point_weights.push_back(1);\n\n\t\t// Lower left corner ...\n\t\torders.push_back(3);\n\t\tcontrol_point_counts.push_back(corner_control_points.size());\n\t\tknots.insert(knots.end(), corner_knots.begin(), corner_knots.end());\n\t\tfor(k3d::uint_t i = corner_control_points.size(); i != 0; --i)\n\t\t{\n\t\t\tcontrol_points.push_back(points.size());\n\t\t\tcontrol_point_weights.push_back(corner_weights[i-1]);\n\t\t\tpoints.push_back(Transformation.top() * k3d::point3(x + rx - corner_control_points[i-1][0], y + h - ry + corner_control_points[i-1][1], 0));\n\t\t}\n\n\t\t// Left side ...\n\t\torders.push_back(2);\n\t\tcontrol_point_counts.push_back(2);\n\t\tk3d::nurbs_curve::add_open_uniform_knots(2, 2, knots);\n\t\tcontrol_points.push_back(control_points.back());\n\t\tcontrol_points.push_back(0);\n\t\tcontrol_point_weights.push_back(1);\n\t\tcontrol_point_weights.push_back(1);\n\n\t\tk3d::nurbs_curve::add_curves(Mesh, Primitive, points, orders, control_point_counts, control_points, control_point_weights, knots);\n\t}\n}\n\nstatic void parse_circle(const k3d::xml::element& SVG, transform_stack& Transformation, k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Primitive)\n{\n\tconst k3d::double_t cx = k3d::xml::attribute_value<k3d::double_t>(SVG, \"cx\", 0);\n\tconst k3d::double_t cy = k3d::xml::attribute_value<k3d::double_t>(SVG, \"cy\", 0);\n\tconst k3d::double_t r = k3d::xml::attribute_value<k3d::double_t>(SVG, \"r\", 1);\n\n\tk3d::mesh::knots_t knots;\n\tk3d::mesh::weights_t weights;\n\tk3d::mesh::points_t control_points;\n\tk3d::nurbs_curve::circular_arc(k3d::vector3(r, 0, 0), k3d::vector3(0, r, 0), 0, k3d::pi_times_2(), 4, knots, weights, control_points);\n\n\tfor(k3d::uint_t i = 0; i != control_points.size(); ++i)\n\t\tcontrol_points[i] = Transformation.top() * (control_points[i] + k3d::vector3(cx, cy, 0));\n\n\tk3d::nurbs_curve::add_curve(Mesh, Primitive, 3, control_points, weights, knots);\n}\n\nstatic void parse_ellipse(const k3d::xml::element& SVG, transform_stack& Transformation, k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Primitive)\n{\n\tconst k3d::double_t cx = k3d::xml::attribute_value<k3d::double_t>(SVG, \"cx\", 0);\n\tconst k3d::double_t cy = k3d::xml::attribute_value<k3d::double_t>(SVG, \"cy\", 0);\n\tconst k3d::double_t rx = k3d::xml::attribute_value<k3d::double_t>(SVG, \"rx\", 1);\n\tconst k3d::double_t ry = k3d::xml::attribute_value<k3d::double_t>(SVG, \"ry\", 1);\n\n\tk3d::mesh::knots_t knots;\n\tk3d::mesh::weights_t weights;\n\tk3d::mesh::points_t control_points;\n\tk3d::nurbs_curve::circular_arc(k3d::vector3(rx, 0, 0), k3d::vector3(0, ry, 0), 0, k3d::pi_times_2(), 4, knots, weights, control_points);\n\n\tfor(k3d::uint_t i = 0; i != control_points.size(); ++i)\n\t\tcontrol_points[i] = Transformation.top() * (control_points[i] + k3d::vector3(cx, cy, 0));\n\n\tk3d::nurbs_curve::add_curve(Mesh, Primitive, 3, control_points, weights, knots);\n}\n\nstatic void parse_polyline(const k3d::xml::element& SVG, transform_stack& Transformation, k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Primitive)\n{\n\tk3d::mesh::points_t control_points;\n\t\n\tstd::istringstream point_stream(k3d::xml::attribute_text(SVG, \"points\"));\n\tfor(k3d::point2 point; ;)\n\t{\n\t\tpoint_stream >> point[0];\n\t\tpoint_stream.ignore(1);\n\t\tpoint_stream >> point[1];\n\n\t\tif(!point_stream)\n\t\t\tbreak;\n\n\t\tcontrol_points.push_back(Transformation.top() * k3d::point3(point[0], point[1], 0));\n\t}\n\n\tif(control_points.size() < 2)\n\t\treturn;\n\n\tk3d::nurbs_curve::add_curve(Mesh, Primitive, 2, control_points);\n}\n\nstatic void parse_polygon(const k3d::xml::element& SVG, transform_stack& Transformation, k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Primitive)\n{\n\tk3d::mesh::points_t control_points;\n\n\tstd::istringstream point_stream(k3d::xml::attribute_text(SVG, \"points\"));\n\tfor(k3d::point2 point; ;)\n\t{\n\t\tpoint_stream >> point[0];\n\t\tpoint_stream.ignore(1);\n\t\tpoint_stream >> point[1];\n\n\t\tif(!point_stream)\n\t\t\tbreak;\n\n\t\tcontrol_points.push_back(Transformation.top() * k3d::point3(point[0], point[1], 0));\n\t}\n\n\tif(control_points.size() < 2)\n\t\treturn;\n\n\tk3d::nurbs_curve::add_curve(Mesh, Primitive, 2, control_points, 1);\n}\n\n/*\nstatic void create_arc(k3d::point4 p1, k3d::point4 p2, k3d::double_t phi, k3d::double_t& cx, k3d::double_t&cy,\n\t\tk3d::double_t rx, k3d::double_t ry, bool large_arc_flag, bool sweep_flag, int segments,\n\t\tstd::vector<k3d::point3>& control_points, k3d::mesh::knots_t& knots, k3d::mesh::weights_t& weights)\n{\n\tk3d::matrix4 T = k3d::identity3();\n\tk3d::point4 xp, cp, c;\n\tk3d::vector3 v1, v2;\n\tk3d::double_t theta_one, theta_two, delta_theta;\n\n\tT[0][0] = cos(phi);\n\tT[0][1] = sin(phi);\n\tT[1][0] = -sin(phi);\n\tT[1][1] = cos(phi);\n\n\txp = T * k3d::to_point((p1 - p2) / 2);\n\n\tcp = std::sqrt(std::abs(rx * rx * ry * ry - rx * rx * xp[1] * xp[1] - ry * ry * xp[0] * xp[0]) / (rx * rx * xp[1] * xp[1] + ry * ry * xp[0] * xp[0])) * k3d::point4((rx / ry) * xp[1], (-ry / rx) * xp[0], 0, 1);\n\n\tif (large_arc_flag == sweep_flag)\n\t\tcp = -cp;\n\n\tcp[3] = 1;\n\n\tT[0][0] = cos(phi);\n\tT[0][1] = -sin(phi);\n\tT[1][0] = sin(phi);\n\tT[1][1] = cos(phi);\n\n\tc = T * cp + (p1 + p2) / 2;\n\n\tv1 = k3d::vector3(1, 0, 0);\n\tv2 = k3d::vector3((xp[0] - cp[0]) / rx, (xp[1] - cp[1]) / ry, 0);\n\n\ttheta_one = acos((v1 * v2) / (k3d::length(v1) * k3d::length(v2)));\n\tif (v1[0]*v2[1] - v1[1]*v2[0] < 0)\n\t\ttheta_one = -theta_one;\n\n\tv1 = v2;\n\tv2 = k3d::vector3((-xp[0] - cp[0]) / rx, (-xp[1] - cp[1]) / ry, 0);\n\tdelta_theta = k3d::radians((int)k3d::degrees((acos((v1 * v2) / (k3d::length(v1) * k3d::length(v2))))) % 360);\n\n\tif (sweep_flag == large_arc_flag)\n\t\tdelta_theta = -delta_theta;\n\n\ttheta_one += k3d::pi_times_2();\n\tif (large_arc_flag == 0)\n\t\ttheta_two = theta_one + delta_theta;\n\telse\n\t\tif (sweep_flag == 0)\n\t\t{\n\t\t\ttheta_two = theta_one + k3d::pi_times_2() - delta_theta;\n\t\t\trx = -rx;\n\t\t}\n\t\telse\n\t\t\ttheta_two = theta_one + k3d::pi_times_2() +  delta_theta;\n\n\n\tk3d::nurbs_curve::circular_arc(k3d::point3(rx, 0, 0), k3d::point3(0, ry, 0), theta_one, theta_two, segments, knots, weights, control_points);\n\tif (theta_two < theta_one)\n\t{\n\t\tstd::vector<k3d::point3> tmp_cp;\n\t\tfor (int i = 0; i < control_points.size(); i++)\n\t\t\ttmp_cp.push_back(control_points[i]);\n\t\tfor (int i = 0; i < control_points.size(); i++)\n\t\t\tcontrol_points[i] = tmp_cp[control_points.size()-1-i];\n\t}\n\tcx = c[0];\n\tcy = c[1];\n\tfor (int i = 0; i < control_points.size(); i++)\n\t{\n\t\tk3d::point4 tmp(control_points[i][0], control_points[i][1], control_points[i][2], 1);\n\t\ttmp = T * tmp;\n\t\tcontrol_points[i] = k3d::point3(tmp[0], tmp[1], tmp[2]);\n\n\t}\n}\n*/\n\nstatic void parse_path(const k3d::xml::element& SVG, transform_stack& Transformation, k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Primitive)\n{\n\t// Setup curves ...\n\tk3d::mesh::points_t points;\n\tk3d::mesh::orders_t orders;\n\tk3d::mesh::counts_t control_point_counts;\n\tk3d::mesh::indices_t control_points;\n\tk3d::mesh::weights_t control_point_weights;\n\tk3d::mesh::knots_t knots;\n\n\tstd::stringstream data(k3d::xml::attribute_text(SVG, \"d\"));\n\n\tk3d::point3 current_point(0, 0, 0);\n\tfor(char token = data.get(); data; token = data.get())\n\t{\n\t\tk3d::bool_t relative = false;\n\t\tswitch(token)\n\t\t{\n\t\t\tcase 'm':\n\t\t\t{\n\t\t\t\trelative = true;\n\t\t\t}\n\t\t\tcase 'M':\n\t\t\t{\n\t\t\t\tk3d::double_t x, y = 0;\n\t\t\t\tif(!get_pair(data, x, y))\n\t\t\t\t\tk3d::log() << error << \"Error getting path starting point after M or m\" << std::endl;\n\t\t\t\tcurrent_point[0] = relative ? current_point[0] + x : x;\n\t\t\t\tcurrent_point[1] = relative ? current_point[1] + y : y;\n\n\t\t\t\tpoints.push_back(current_point);\n\t\t\t\t\n\t\t\t\twhile(get_pair(data, x, y))\n\t\t\t\t{\n\t\t\t\t\tcurrent_point[0] = relative ? current_point[0] + x : x;\n\t\t\t\t\tcurrent_point[1] = relative ? current_point[1] + y : y;\n\n\t\t\t\t\tpoints.push_back(current_point);\n\n\t\t\t\t\torders.push_back(2);\n\t\t\t\t\tcontrol_point_counts.push_back(2);\n\t\t\t\t\tk3d::nurbs_curve::add_open_uniform_knots(2, 2, knots);\n\t\t\t\t\tcontrol_points.push_back(points.size() - 2);\n\t\t\t\t\tcontrol_points.push_back(points.size() - 1);\n\t\t\t\t\tcontrol_point_weights.push_back(1);\n\t\t\t\t\tcontrol_point_weights.push_back(1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'l':\n\t\t\t{\n\t\t\t\trelative = true;\n\t\t\t}\n\t\t\tcase 'L':\n\t\t\t{\n\t\t\t\tk3d::double_t x, y = 0;\n\t\t\t\twhile(get_pair(data, x, y))\n\t\t\t\t{\n\t\t\t\t\tcurrent_point[0] = relative ? current_point[0] + x : x;\n\t\t\t\t\tcurrent_point[1] = relative ? current_point[1] + y : y;\n\n\t\t\t\t\tpoints.push_back(current_point);\n\n\t\t\t\t\torders.push_back(2);\n\t\t\t\t\tcontrol_point_counts.push_back(2);\n\t\t\t\t\tk3d::nurbs_curve::add_open_uniform_knots(2, 2, knots);\n\t\t\t\t\tcontrol_points.push_back(points.size() - 2);\n\t\t\t\t\tcontrol_points.push_back(points.size() - 1);\n\t\t\t\t\tcontrol_point_weights.push_back(1);\n\t\t\t\t\tcontrol_point_weights.push_back(1);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'h':\n\t\t\t{\n\t\t\t\trelative = true;\n\t\t\t}\n\t\t\tcase 'H':\n\t\t\t{\n\t\t\t\tk3d::double_t x = 0;\n\t\t\t\tdata >> x;\n\t\t\t\tcurrent_point[0] = relative ? current_point[0] + x : x;\n\n\t\t\t\tpoints.push_back(current_point);\n\n\t\t\t\torders.push_back(2);\n\t\t\t\tcontrol_point_counts.push_back(2);\n\t\t\t\tk3d::nurbs_curve::add_open_uniform_knots(2, 2, knots);\n\t\t\t\tcontrol_points.push_back(points.size() - 2);\n\t\t\t\tcontrol_points.push_back(points.size() - 1);\n\t\t\t\tcontrol_point_weights.push_back(1);\n\t\t\t\tcontrol_point_weights.push_back(1);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'v':\n\t\t\t{\n\t\t\t\trelative = true;\n\t\t\t}\n\t\t\tcase 'V':\n\t\t\t{\n\t\t\t\tk3d::double_t y = 0;\n\t\t\t\tdata >> y;\n\t\t\t\tcurrent_point[1] = relative ? current_point[1] + y : y;\n\n\t\t\t\tpoints.push_back(current_point);\n\n\t\t\t\torders.push_back(2);\n\t\t\t\tcontrol_point_counts.push_back(2);\n\t\t\t\tk3d::nurbs_curve::add_open_uniform_knots(2, 2, knots);\n\t\t\t\tcontrol_points.push_back(points.size() - 2);\n\t\t\t\tcontrol_points.push_back(points.size() - 1);\n\t\t\t\tcontrol_point_weights.insert(control_point_weights.end(), 2, 1);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'c':\n\t\t\t{\n\t\t\t\trelative = true;\n\t\t\t}\n\t\t\tcase 'C':\n\t\t\t{\n\t\t\t\tk3d::point3 first_point = current_point;\n\t\t\t\tk3d::double_t x, y = 0;\n\t\t\t\tk3d::uint_t nb_points_read = 0;\n\t\t\t\twhile(get_pair(data, x, y))\n\t\t\t\t{\n\t\t\t\t\t++nb_points_read;\n\t\t\t\t\tcurrent_point[0] = relative ? first_point[0] + x : x;\n\t\t\t\t\tcurrent_point[1] = relative ? first_point[1] + y : y;\n\n\t\t\t\t\tpoints.push_back(current_point);\n\t\t\t\t\t\n\t\t\t\t\tif(nb_points_read % 3 == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\torders.push_back(4);\n\t\t\t\t\t\tcontrol_point_counts.push_back(4);\n\t\t\t\t\t\tk3d::nurbs_curve::add_open_uniform_knots(4, 4, knots);\n\t\t\t\t\t\tcontrol_points.push_back(points.size() - 4);\n\t\t\t\t\t\tcontrol_points.push_back(points.size() - 3);\n\t\t\t\t\t\tcontrol_points.push_back(points.size() - 2);\n\t\t\t\t\t\tcontrol_points.push_back(points.size() - 1);\n\t\t\t\t\t\tcontrol_point_weights.insert(control_point_weights.end(), 4, 1);\n\t\t\t\t\t\tfirst_point = current_point;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 's':\n\t\t\t{\n\t\t\t\trelative = true;\n\t\t\t}\n\t\t\tcase 'S':\n\t\t\t{\n\t\t\t\tconst k3d::point3 first_point = current_point;\n\n\t\t\t\tconst k3d::point3 previous_point = points[points.size() - 2];\n\t\t\t\tcurrent_point[0] = first_point[0] + (first_point[0] - previous_point[0]);\n\t\t\t\tcurrent_point[1] = first_point[1] + (first_point[1] - previous_point[1]);\n\n\t\t\t\tpoints.push_back(current_point);\n\n\t\t\t\tfor(int i = 0; i != 2; ++i)\n\t\t\t\t{\n\t\t\t\t\tk3d::double_t x, y = 0;\n\t\t\t\t\tget_pair(data, x, y);\n\t\t\t\t\tcurrent_point[0] = relative ? first_point[0] + x : x;\n\t\t\t\t\tcurrent_point[1] = relative ? first_point[1] + y : y;\n\n\t\t\t\t\tpoints.push_back(current_point);\n\n\t\t\t\t}\n\n\t\t\t\torders.push_back(4);\n\t\t\t\tcontrol_point_counts.push_back(4);\n\t\t\t\tk3d::nurbs_curve::add_open_uniform_knots(4, 4, knots);\n\t\t\t\tcontrol_points.push_back(points.size() - 4);\n\t\t\t\tcontrol_points.push_back(points.size() - 3);\n\t\t\t\tcontrol_points.push_back(points.size() - 2);\n\t\t\t\tcontrol_points.push_back(points.size() - 1);\n\t\t\t\tcontrol_point_weights.insert(control_point_weights.end(), 4, 1);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'q':\n\t\t\t{\n\t\t\t\trelative = true;\n\t\t\t}\n\t\t\tcase 'Q':\n\t\t\t{\n\t\t\t\tconst k3d::point3 first_point = current_point;\n\t\t\t\tfor(int i = 0; i != 2; ++i)\n\t\t\t\t{\n\t\t\t\t\tk3d::double_t x, y = 0;\n\t\t\t\t\tget_pair(data, x, y);\n\t\t\t\t\tcurrent_point[0] = relative ? first_point[0] + x : x;\n\t\t\t\t\tcurrent_point[1] = relative ? first_point[1] + y : y;\n\n\t\t\t\t\tpoints.push_back(current_point);\n\n\t\t\t\t}\n\n\t\t\t\torders.push_back(3);\n\t\t\t\tcontrol_point_counts.push_back(3);\n\t\t\t\tk3d::nurbs_curve::add_open_uniform_knots(3, 3, knots);\n\t\t\t\tcontrol_points.push_back(points.size() - 3);\n\t\t\t\tcontrol_points.push_back(points.size() - 2);\n\t\t\t\tcontrol_points.push_back(points.size() - 1);\n\t\t\t\tcontrol_point_weights.insert(control_point_weights.end(), 3, 1);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 't':\n\t\t\t{\n\t\t\t\trelative = true;\n\t\t\t}\n\t\t\tcase 'T':\n\t\t\t{\n\t\t\t\tconst k3d::point3 first_point = current_point;\n\n\t\t\t\tconst k3d::point3 previous_point = points[points.size() - 2];\n\t\t\t\tcurrent_point[0] = first_point[0] + (first_point[0] - previous_point[0]);\n\t\t\t\tcurrent_point[1] = first_point[1] + (first_point[1] - previous_point[1]);\n\n\t\t\t\tpoints.push_back(current_point);\n\n\t\t\t\tfor(int i = 0; i != 1; ++i)\n\t\t\t\t{\n\t\t\t\t\tk3d::double_t x, y = 0;\n\t\t\t\t\tget_pair(data, x, y);\n\t\t\t\t\tcurrent_point[0] = relative ? first_point[0] + x : x;\n\t\t\t\t\tcurrent_point[1] = relative ? first_point[1] + y : y;\n\n\t\t\t\t\tpoints.push_back(current_point);\n\n\t\t\t\t}\n\n\t\t\t\torders.push_back(3);\n\t\t\t\tcontrol_point_counts.push_back(3);\n\t\t\t\tk3d::nurbs_curve::add_open_uniform_knots(3, 3, knots);\n\t\t\t\tcontrol_points.push_back(points.size() - 3);\n\t\t\t\tcontrol_points.push_back(points.size() - 2);\n\t\t\t\tcontrol_points.push_back(points.size() - 1);\n\t\t\t\tcontrol_point_weights.insert(control_point_weights.end(), 3, 1);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'z':\n\t\t\tcase 'Z':\n\t\t\t{\n\t\t\t\torders.push_back(2);\n\t\t\t\tcontrol_point_counts.push_back(2);\n\t\t\t\tk3d::nurbs_curve::add_open_uniform_knots(2, 2, knots);\n\t\t\t\tcontrol_points.push_back(points.size() - 1);\n\t\t\t\tcontrol_points.push_back(0);\n\t\t\t\tcontrol_point_weights.push_back(1);\n\t\t\t\tcontrol_point_weights.push_back(1);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n/*\n\t\t\t//Arc: creates an arc from current point to (x,y) with the semiaxes radius given by (rx,ry)\n\t\t\t//     fa and fs: are used to choose from the possible 4 arcs created by the two given points\n\t\t\t//     and the given radius\n\t\t\t//     phi is the angle of the x-axis of the ellipse relative to the current x-axis\n\t\tcase 'a':\n\t\t\trelative = true;\n\t\tcase 'A':\n\t\t\torder = 3;\n\t\t\tstd::vector<k3d::point3> control_points;\n\t\t\tk3d::mesh::knots_t tmp_knots;\n\t\t\tk3d::mesh::weights_t tmp_weights;\n\t\t\tk3d::double_t cx, cy, rx, ry, phi, fa, fs;\n\t\t\tk3d::point4 p1 = k3d::point4(x, y, 0, 1);\n\t\t\tget_pair(rx, ry, data);\n\t\t\tdata >> phi;\n\t\t\tget_pair(fa, fs, data);\n\t\t\tget_pair(x, y, data);\n\t\t\tif (relative)\n\t\t\t{\n\t\t\t\tx += lastpoint[0];\n\t\t\t\ty += lastpoint[1];\n\t\t\t}\n\t\t\tcreate_arc(p1, k3d::point4(x, y, 0, 1), k3d::radians(phi), cx, cy, rx, ry, fa, fs, 8, control_points, knots, tmp_weights);\n\t\t\treturn_if_fail(tmp_weights.size() == control_points.size());\n\t\t\tfor (int i = 1; i < control_points.size(); i++)\n\t\t\t{\n\t\t\t\tpoints.push_back(count);\n\t\t\t\tcount++;\n\t\t\t\tadd_point(k3d::point4(control_points[i][0] + cx, control_points[i][1] + cy, control_points[i][2], 1));\n\t\t\t}\n\t\t\tis_arc = true;\n\t\t\tk3d::point3 t_point = control_points.at(control_points.size() - 2);\n\t\t\tslastpoint = k3d::point4(t_point[0], t_point[1], t_point[2], 1);\n\t\t\tt_point = control_points.back();\n\t\t\tlastpoint = k3d::point4(t_point[0], t_point[1], t_point[2], 1);\n\t\t\tlast = points.back();\n\t\t\tbreak;\n\t\t}\n\n\t\tif (!is_arc)\n\t\t{\n\t\t\t//Start knot Vector Definition to be a Bezier curve\n\t\t\t//knots.push_back(0);\n\t\t\t//for(int i=0; i < order-1; i++)\n\t\t\t//\tknots.push_back(1);\n\t\t\t//for(int i=0; i < order-1; i++)\n\t\t\t//\tknots.push_back(2);\n\t\t\t//knots.push_back(3);\n\t\t\tknots.push_back(knots.back());\n\t\t\tknots.push_back(knots.back());\n\t\t\tknots.push_back(knots.back() + 1);\n\t\t\tknots.push_back(knots.back());\n\t\t\t//End knot vector definition\n\n\t\t}\n\t}\n\n\tknots.push_back(knots.back());\n\tknots.push_back(knots.back());\n\n\tfor (k3d::uint_t point = 0; point < points.size(); point++)\n\t\tweights.push_back(1.0);\n\n\tk3d::nurbs_curve::add_curve(order, points, weights, knots, Mesh, Primitive);\n\trelative = false;\n\tis_arc = false;\n*/\n\t}\n\n\tk3d::nurbs_curve::add_curves(Mesh, Primitive, points, orders, control_point_counts, control_points, control_point_weights, knots);\n}\n\n/// Main parsing function, doesn't handle grouping and just traverse the XML tree recursively\nstatic void parse_graphics(const k3d::xml::element& SVG, transform_stack& Transformation, k3d::mesh& Mesh, k3d::nurbs_curve::primitive& Primitive)\n{\n\tk3d::mesh::colors_t colors;\n\tfor(k3d::xml::element::elements_t::const_iterator svg = SVG.children.begin(); svg != SVG.children.end(); ++svg)\n\t{\n\t\tconst k3d::string_t trans = k3d::xml::attribute_text(*svg, \"transform\", \"none\");\n\t\t//If there is a transformation extract matrix from data and push into stack\n\t\tif (trans != \"none\")\n\t\t{\n\t\t\tk3d::matrix4 mat = k3d::identity3();\n\t\t\tstd::istringstream trans_stream(trans);\n\t\t\tk3d::double_t x, y;\n\t\t\tchar token;\n\t\t\twhile (!trans_stream.eof())\n\t\t\t{\n\t\t\t\ttrans_stream >> token;\n\t\t\t\tk3d::matrix4 tmp_mat = k3d::identity3();\n\t\t\t\tswitch (token)\n\t\t\t\t{\n\t\t\t\t\t//Set up translation matrix\n\t\t\t\t\t// (( 1  0 0 0)\n\t\t\t\t\t//  ( 0  1 0 0)\n\t\t\t\t\t//  ( 0  0 1 0)\n\t\t\t\t\t//  (tx ty 0 1))\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\ttrans_stream.ignore(9);\n\t\t\t\t\t\tget_pair(trans_stream, x, y);\n\t\t\t\t\t\ttmp_mat[0][3] = x;\n\t\t\t\t\t\ttmp_mat[1][3] = y;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t//Set up rotation matrix\n\t\t\t\t\t// ((cos(t) -sin(t) 0 0)\n\t\t\t\t\t//  (sin(t)  cos(t) 0 0)\n\t\t\t\t\t//  (     0       0 1 0)\n\t\t\t\t\t//  (     0       0 0 1))\n\t\t\t\t\tcase 'r':\n\t\t\t\t\t\ttrans_stream.ignore(6);\n\t\t\t\t\t\ttrans_stream >> x;\n\t\t\t\t\t\tx = k3d::radians(x);\n\t\t\t\t\t\ttmp_mat[0][0] = cos(x);\n\t\t\t\t\t\ttmp_mat[0][1] = -sin(x);\n\t\t\t\t\t\ttmp_mat[1][0] = sin(x);\n\t\t\t\t\t\ttmp_mat[1][1] = cos(x);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t//Set up scaling matrix\n\t\t\t\t\t// ((cx 0 0 0)\n\t\t\t\t\t//  (0 cy 0 0)\n\t\t\t\t\t//  (0  0 1 0)\n\t\t\t\t\t//  (0  0 0 1))\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\ttrans_stream >> token;\n\t\t\t\t\t\tif (token == 'k')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttrans_stream.ignore(2);\n\t\t\t\t\t\t\ttrans_stream >> token;\n\t\t\t\t\t\t\ttrans_stream.ignore();\n\t\t\t\t\t\t\ttrans_stream >> x;\n\t\t\t\t\t\t\tif (token == 'X')\n\t\t\t\t\t\t\t\ttmp_mat[0][1] = tan(k3d::radians(x));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttmp_mat[1][0] = tan(k3d::radians(x));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttrans_stream.ignore(4);\n\t\t\t\t\t\t\ttrans_stream >> x;\n\t\t\t\t\t\t\ttmp_mat[0][0] = x;\n\t\t\t\t\t\t\ttmp_mat[1][1] = x;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t//Set up custom matrix\n\t\t\t\t\t// ((a00 a01 0 0)\n\t\t\t\t\t//  (a10 a11 0 0)\n\t\t\t\t\t//  (  0   0 1 0)\n\t\t\t\t\t//  (a30 a31 0 1))\n\t\t\t\t\tcase 'm':\n\t\t\t\t\t\ttrans_stream.ignore(6);\n\t\t\t\t\t\ttrans_stream >> tmp_mat[0][0];\n\t\t\t\t\t\ttrans_stream.ignore();\n\t\t\t\t\t\ttrans_stream >> tmp_mat[1][0];\n\t\t\t\t\t\ttrans_stream.ignore();\n\t\t\t\t\t\ttrans_stream >> tmp_mat[0][1];\n\t\t\t\t\t\ttrans_stream.ignore();\n\t\t\t\t\t\ttrans_stream >> tmp_mat[1][1];\n\t\t\t\t\t\ttrans_stream.ignore();\n\t\t\t\t\t\ttrans_stream >> tmp_mat[0][3];\n\t\t\t\t\t\ttrans_stream.ignore();\n\t\t\t\t\t\ttrans_stream >> tmp_mat[1][3];\n\t\t\t\t\t\ttrans_stream.ignore();\n\t\t\t\t}\n\n\t\t\t\ttrans_stream.ignore(2);\n\t\t\t\tmat = mat * tmp_mat;\n\t\t\t}\n\t\t\t//Push the generated matrix into the stack relative to the one in the top\n\t\t\tTransformation.push(Transformation.top() * mat);\n\t\t}\n\n\t\tif(svg->name == \"g\")\n\t\t\tparse_graphics(*svg, Transformation, Mesh, Primitive);\n\t\tif(svg->name == \"line\")\n\t\t\tparse_line(*svg, Transformation, Mesh, Primitive);\n\t\tif(svg->name == \"rect\")\n\t\t\tparse_rect(*svg, Transformation, Mesh, Primitive);\n\t\tif(svg->name == \"circle\")\n\t\t\tparse_circle(*svg, Transformation, Mesh, Primitive);\n\t\tif(svg->name == \"ellipse\")\n\t\t\tparse_ellipse(*svg, Transformation, Mesh, Primitive);\n\t\tif(svg->name == \"polyline\")\n\t\t\tparse_polyline(*svg, Transformation, Mesh, Primitive);\n\t\tif(svg->name == \"polygon\")\n\t\t\tparse_polygon(*svg, Transformation, Mesh, Primitive);\n\t\tif(svg->name == \"path\")\n\t\t\tparse_path(*svg, Transformation, Mesh, Primitive);\n\n\t\tk3d::color color;\n\t\tif(get_color(*svg, color))\n\t\t{\n\t\t\tcolors.resize(Primitive.curve_first_points.size(), color);\n\t\t}\n\n\t\tif(trans != \"none\")\n\t\t\tTransformation.pop();\n\t}\n\tif(colors.size() == Primitive.curve_first_points.size())\n\t\tPrimitive.curve_attributes.create(\"Cs\", new k3d::mesh::colors_t(colors));\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_reader\n\nclass mesh_reader :\n\tpublic k3d::material_sink<k3d::mesh_reader<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_reader<k3d::node > > base;\n\npublic:\n\tmesh_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reload_mesh_slot()));\n\t}\n\n\tvoid on_load_mesh(const k3d::filesystem::path& Path, k3d::mesh& Mesh)\n\t{\n\n\t\ttry\n\t\t{\n\t\t\tk3d::filesystem::ifstream svg_stream(Path);\n\t\t\tk3d::xml::element svg;\n\t\t\tsvg_stream >> svg;\n\n\t\t\tif(svg.name != \"svg\")\n\t\t\t\tthrow std::runtime_error(\"Not an SVG file.\");\n\n\t\t\ttransform_stack transformation;\n\t\t\ttransformation.push(k3d::identity3());\n\n\t\t\tk3d::mesh::points_t& points = Mesh.points.create();\n\t\t\tk3d::mesh::selection_t& point_selection = Mesh.point_selection.create();\n\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> primitive(k3d::nurbs_curve::create(Mesh));\n\t\t\tprimitive->material.push_back(m_material.pipeline_value());\n\n\t\t\tparse_graphics(svg, transformation, Mesh, *primitive);\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << \"Caught exception: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << \"Unknown exception\" << std::endl;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_reader, k3d::interface_list<k3d::imesh_source, k3d::interface_list<k3d::imesh_storage> > > factory(\n\t\t\tk3d::uuid(0xa0149217, 0xf64844bb, 0x4ba01e8f, 0x21d7f651),\n\t\t\t\"SVGMeshReader\",\n\t\t\t_(\"Reader that loads external Scalable Vector Graphics (.svg) files into the document by reference\"),\n\t\t\t\"MeshReader\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL\n\t\t\t);\n\n\t\treturn factory;\n\t}\n\nprivate:\n};\n\nk3d::iplugin_factory& mesh_reader_factory()\n{\n\treturn mesh_reader::get_factory();\n}\n\n} // namespace io\n\n} // namespace svg\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/svg_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Carlos Andres Dominguez Caballero (carlosadc@gmail.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace svg\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& mesh_reader_factory();\n\n} // namespace io\n\n} // namespace svg\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::svg::io::mesh_reader_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/test/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-test)\nK3D_CREATE_MODULE_PROXY(k3d-test)\n\n"
  },
  {
    "path": "modules/test/add_color_attribute.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/component.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/node.h>\n\n#include <boost/assign/list_of.hpp>\n\nnamespace module\n{\n\nnamespace test\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// add_color_attribute\n\nclass add_color_attribute :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tadd_color_attribute(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_component(init_owner(*this) + init_name(\"component\") + init_label(_(\"Component\")) + init_description(_(\"Mesh component to receive a new color attribute.\")) + init_value(k3d::string_t(\"vertex\")) + init_values(k3d::component_values())),\n\t\tm_name(init_owner(*this) + init_name(\"name\") + init_label(_(\"Name\")) + init_description(_(\"New attribute name.\")) + init_value(k3d::string_t(\"Cs\")))\n\t{\n\t\tm_component.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t\tm_name.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tconst std::vector<k3d::color> colors = boost::assign::list_of(k3d::color(1, 0, 0))(k3d::color(0, 1, 0))(k3d::color(0, 0, 1))(k3d::color(1, 1, 1))(k3d::color(1, 1, 0))(k3d::color(0, 1, 1))(k3d::color(1, 0, 1)); \n\n\t\tconst k3d::string_t component = m_component.pipeline_value();\n\t\tconst k3d::string_t name = m_name.pipeline_value();\n\n\t\tOutput = Input;\n\n\t\tfor(k3d::mesh::primitives_t::iterator p = Output.primitives.begin(); p != Output.primitives.end(); ++p)\n\t\t{\n\t\t\tk3d::mesh::primitive& primitive = p->writable();\n\t\t\tfor(k3d::mesh::named_tables_t::iterator attribute = primitive.attributes.begin(); attribute != primitive.attributes.end(); ++attribute)\n\t\t\t{\n\t\t\t\tconst k3d::string_t& attribute_name = attribute->first;\n\t\t\t\tif(attribute_name != component)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst k3d::uint_t attribute_count = k3d::component_size(primitive, attribute_name);\n\t\t\t\tif(0 == attribute_count)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tk3d::table& attribute_table = attribute->second;\n\n\t\t\t\tk3d::mesh::colors_t& array = attribute_table.create(name, new k3d::mesh::colors_t(attribute_count));\n\t\t\t\tfor(k3d::uint_t i = 0; i != attribute_count; ++i)\n\t\t\t\t\tarray[i] = colors[i % colors.size()];\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<add_color_attribute,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x0caae90d, 0x924154b7, 0x5f977ea9, 0x91eec131),\n\t\t\t\t\"AddColorAttribute\",\n\t\t\t\t_(\"Adds a color attribute to a mesh component, primarily for testing purposes.\"),\n\t\t\t\t\"Test\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, list_property, with_serialization) m_component;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_name;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// add_color_attribute_factory\n\nk3d::iplugin_factory& add_color_attribute_factory()\n{\n\treturn add_color_attribute::get_factory();\n}\n\n} // namespace test\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/test/add_color_attributes.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/component.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/node.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace test\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// add_color_attributes\n\nclass add_color_attributes :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tadd_color_attributes(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tk3d::mesh::colors_t colors;\n\t\tcolors.push_back(k3d::color(0.0,0.0,1.0));\n\t\tcolors.push_back(k3d::color(0.0,1.0,0.0));\n\t\tcolors.push_back(k3d::color(1.0,0.0,0.0));\n\t\tcolors.push_back(k3d::color(1.0,0.0,1.0));\n\t\tcolors.push_back(k3d::color(0.0,1.0,1.0));\n\t\tcolors.push_back(k3d::color(1.0,1.0,0.0));\n\n\t\tconst k3d::uint_t colorcount = colors.size();\n\n\t\tconst k3d::uint_t attribute_count = Output.points ? Output.points->size() : 0;\n\t\tk3d::mesh::colors_t& array = Output.point_attributes.create(\"Cs\", new k3d::mesh::colors_t(attribute_count));\n\t\tfor(k3d::uint_t i = 0; i != attribute_count; ++i)\n\t\t\tarray[i] = colors[i % colorcount];\n\n\t\tfor(k3d::mesh::primitives_t::iterator p = Output.primitives.begin(); p != Output.primitives.end(); ++p)\n\t\t{\n\t\t\tk3d::mesh::primitive& primitive = p->writable();\n\t\t\tfor(k3d::mesh::named_tables_t::iterator attribute = primitive.attributes.begin(); attribute != primitive.attributes.end(); ++attribute)\n\t\t\t{\n\t\t\t\tconst k3d::string_t& attribute_name = attribute->first;\n\n\t\t\t\tconst k3d::uint_t attribute_count = k3d::component_size(primitive, attribute_name);\n\t\t\t\tif(0 == attribute_count)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tk3d::table& attribute_table = attribute->second;\n\n\t\t\t\tk3d::mesh::colors_t& array = attribute_table.create(\"Cs\", new k3d::mesh::colors_t(attribute_count));\n\t\t\t\tfor(k3d::uint_t i = 0; i != attribute_count; ++i)\n\t\t\t\t\tarray[i] = colors[i % colorcount];\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<add_color_attributes,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xcc7779e1, 0xbb49401c, 0xf76f5fba, 0x700904ce),\n\t\t\t\t\"AddColorAttributes\",\n\t\t\t\t_(\"Adds an color attribute to every table in a mesh, primarily for testing purposes.\"),\n\t\t\t\t\"Test\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// add_color_attributes_factory\n\nk3d::iplugin_factory& add_color_attributes_factory()\n{\n\treturn add_color_attributes::get_factory();\n}\n\n} // namespace test\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/test/add_index_attributes.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/component.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/node.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace test\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// add_index_attributes\n\nclass add_index_attributes :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tadd_index_attributes(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tconst k3d::uint_t attribute_count = Output.points ? Output.points->size() : 0;\n\t\tk3d::mesh::indices_t& array = Output.point_attributes.create(\"index\", new k3d::mesh::indices_t(attribute_count));\n\t\tfor(k3d::uint_t i = 0; i != attribute_count; ++i)\n\t\t\tarray[i] = i;\n\n\t\tfor(k3d::mesh::primitives_t::iterator p = Output.primitives.begin(); p != Output.primitives.end(); ++p)\n\t\t{\n\t\t\tk3d::mesh::primitive& primitive = p->writable();\n\t\t\tfor(k3d::mesh::named_tables_t::iterator attribute = primitive.attributes.begin(); attribute != primitive.attributes.end(); ++attribute)\n\t\t\t{\n\t\t\t\tconst k3d::string_t& attribute_name = attribute->first;\n\n\t\t\t\tconst k3d::uint_t attribute_count = k3d::component_size(primitive, attribute_name);\n\t\t\t\tif(0 == attribute_count)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tk3d::table& attribute_table = attribute->second;\n\n\t\t\t\tk3d::mesh::indices_t& array = attribute_table.create(\"index\", new k3d::mesh::indices_t(attribute_count));\n\t\t\t\tfor(k3d::uint_t i = 0; i != attribute_count; ++i)\n\t\t\t\t\tarray[i] = i;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<add_index_attributes,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0xea30217d, 0xcf4f180d, 0x2321a39a, 0xc25b8741),\n\t\t\t\t\"AddIndexAttributes\",\n\t\t\t\t_(\"Adds an integer 'index' attribute to every table in a mesh, primarily for testing purposes.\"),\n\t\t\t\t\"Test\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// add_index_attributes_factory\n\nk3d::iplugin_factory& add_index_attributes_factory()\n{\n\treturn add_index_attributes::get_factory();\n}\n\n} // namespace test\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/test/add_point_attributes.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/component.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/mesh_modifier.h>\n#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace test\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// add_point_attributes\n\nclass add_point_attributes :\n\tpublic k3d::mesh_modifier<k3d::node >\n{\n\ttypedef k3d::mesh_modifier<k3d::node > base;\n\npublic:\n\tadd_point_attributes(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_add_point_attributes(init_owner(*this) + init_name(\"add_point_attributes\") + init_label(_(\"Add point attributes\")) + init_description(_(\"Add point data to the points attribute array\")) + init_value(true)),\n\t\tm_add_vertex_attributes(init_owner(*this) + init_name(\"add_vertex_attributes\") + init_label(_(\"Add vertex attributes\")) + init_description(_(\"Add point data to the vertex attribute arrays\")) + init_value(false)),\n\t\tm_add_parameter_attributes(init_owner(*this) + init_name(\"add_parameter_attributes\") + init_label(_(\"Add parameter attributes\")) + init_description(_(\"Add point data to the parameter attribute arrays\")) + init_value(false))\n\t{\n\t\tm_add_point_attributes.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t\tm_add_vertex_attributes.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t\tm_add_parameter_attributes.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_reset_mesh_slot()));\n\t}\n\n\tvoid on_create_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t}\n\n\tvoid on_update_mesh(const k3d::mesh& Input, k3d::mesh& Output)\n\t{\n\t\tOutput = Input;\n\n\t\tconst k3d::string_t table_name = \"points\";\n\n\n\t\tif(m_add_point_attributes.pipeline_value())\n\t\t{\n\t\t\tconst k3d::uint_t attribute_count = Output.points ? Output.points->size() : 0;\n\t\t\tk3d::mesh::points_t& array = Output.point_attributes.create(table_name, new k3d::mesh::points_t(attribute_count));\n\t\t\tfor(k3d::uint_t i = 0; i != attribute_count; ++i)\n\t\t\t\tarray[i] = Output.points->at(i);\n\t\t}\n\n\t\tconst k3d::bool_t add_vertex_attributes = m_add_vertex_attributes.pipeline_value();\n\t\tconst k3d::bool_t add_parameter_attributes = m_add_parameter_attributes.pipeline_value();\n\t\tfor(k3d::mesh::primitives_t::iterator p = Output.primitives.begin(); p != Output.primitives.end(); ++p)\n\t\t{\n\t\t\tif(add_vertex_attributes)\n\t\t\t{\n\t\t\t\tk3d::mesh::primitive& primitive = p->writable();\n\n\t\t\t\tconst k3d::mesh::indices_t* indices = 0;\n\t\t\t\tfor(k3d::mesh::named_tables_t::const_iterator structure = primitive.structure.begin(); structure != primitive.structure.end(); ++structure)\n\t\t\t\t{\n\t\t\t\t\tfor(k3d::mesh::table_t::const_iterator array = structure->second.begin(); array != structure->second.end(); ++array)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(array->second->get_metadata_value(k3d::metadata::key::domain()) == k3d::metadata::value::point_indices_domain())\n\t\t\t\t\t\t\tindices = dynamic_cast<const k3d::mesh::indices_t*>(array->second.get());\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(!indices)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tfor(k3d::mesh::named_tables_t::iterator attribute = primitive.attributes.begin(); attribute != primitive.attributes.end(); ++attribute)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::string_t& attribute_name = attribute->first;\n\t\t\t\t\tif(attribute_name != \"vertex\")\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst k3d::uint_t attribute_count = k3d::component_size(primitive, attribute_name);\n\t\t\t\t\tif(0 == attribute_count)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tk3d::table& attribute_table = attribute->second;\n\n\t\t\t\t\tk3d::mesh::points_t& array = attribute_table.create(table_name, new k3d::mesh::points_t(attribute_count));\n\t\t\t\t\tfor(k3d::uint_t i = 0; i != attribute_count; ++i)\n\t\t\t\t\t\tarray[i] = Output.points->at(indices->at(i));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(add_parameter_attributes)\n\t\t\t{\n\t\t\t\t// Specific cases for NURBS parameter attributes\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curve_prim(k3d::nurbs_curve::validate(Output, *p));\n\t\t\t\tif(curve_prim)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t curves_begin = 0;\n\t\t\t\t\tconst k3d::uint_t curves_end = curve_prim->curve_first_points.size();\n\t\t\t\t\tk3d::mesh::points_t& array = curve_prim->parameter_attributes.create(table_name, new k3d::mesh::points_t());\n\t\t\t\t\tfor(k3d::uint_t curve = curves_begin; curve != curves_end; ++curve)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst k3d::uint_t first_point = curve_prim->curve_first_points[curve];\n\t\t\t\t\t\tconst k3d::uint_t last_point = curve_prim->curve_point_counts[curve] + first_point - 1;\n\t\t\t\t\t\tarray.push_back(Output.points->at(curve_prim->curve_points[first_point]));\n\t\t\t\t\t\tarray.push_back(Output.points->at(curve_prim->curve_points[last_point]));\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tboost::scoped_ptr<k3d::nurbs_patch::primitive> patch_prim(k3d::nurbs_patch::validate(Output, *p));\n\t\t\t\tif(patch_prim)\n\t\t\t\t{\n\t\t\t\t\tconst k3d::uint_t patches_begin = 0;\n\t\t\t\t\tconst k3d::uint_t patches_end = patch_prim->patch_first_points.size();\n\t\t\t\t\tk3d::mesh::points_t& array = patch_prim->parameter_attributes.create(table_name, new k3d::mesh::points_t());\n\t\t\t\t\tfor(k3d::uint_t patch = patches_begin; patch != patches_end; ++patch)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Point indices of the patch corners\n\t\t\t\t\t\tconst k3d::uint_t u_count = patch_prim->patch_u_point_counts[patch];\n\t\t\t\t\t\tconst k3d::uint_t v_count = patch_prim->patch_v_point_counts[patch];\n\t\t\t\t\t\tconst k3d::uint_t c1 = patch_prim->patch_first_points[patch];\n\t\t\t\t\t\tconst k3d::uint_t c2 = c1 + u_count-1;\n\t\t\t\t\t\tconst k3d::uint_t c3 = c1 + u_count*(v_count-1);\n\t\t\t\t\t\tconst k3d::uint_t c4 = c3 + u_count - 1;\n\t\t\t\t\t\tarray.push_back(Output.points->at(c1));\n\t\t\t\t\t\tarray.push_back(Output.points->at(c2));\n\t\t\t\t\t\tarray.push_back(Output.points->at(c3));\n\t\t\t\t\t\tarray.push_back(Output.points->at(c4));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<add_point_attributes,\n\t\t\tk3d::interface_list<k3d::imesh_source,\n\t\t\tk3d::interface_list<k3d::imesh_sink > > > factory(\n\t\t\t\tk3d::uuid(0x4fd40bc0, 0xe740db8c, 0x0566faad, 0x19093e0f),\n\t\t\t\t\"AddPointAttributes\",\n\t\t\t\t_(\"Copies point coordinates to the relevant attribute tables in a mesh, primarily for testing purposes.\"),\n\t\t\t\t\"Test\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_add_point_attributes;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_add_vertex_attributes;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_add_parameter_attributes;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// add_point_attributes_factory\n\nk3d::iplugin_factory& add_point_attributes_factory()\n{\n\treturn add_point_attributes::get_factory();\n}\n\n} // namespace test\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/test/mesh_to_stdout.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace test\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_to_stdout\n\nclass mesh_to_stdout :\n\tpublic k3d::node,\n\tpublic k3d::imesh_sink\n{\n\ttypedef k3d::node base;\n\npublic:\n\tmesh_to_stdout(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input_mesh(init_owner(*this) + init_name(\"input_mesh\") + init_label(_(\"Input Mesh\")) + init_description(_(\"Input mesh\")) + init_value<k3d::mesh*>(0))\n\t{\n\t\tm_input_mesh.changed_signal().connect(sigc::mem_fun(*this, &mesh_to_stdout::mesh_changed));\n\t}\n\n\tvoid mesh_changed(iunknown* const Hint)\n\t{\n\t\tif(const k3d::mesh* const input_mesh = m_input_mesh.pipeline_value())\n\t\t\tstd::cout << *input_mesh << std::endl;\n\t}\n\t\n\tk3d::iproperty& mesh_sink_input()\n\t{\n\t\treturn m_input_mesh;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<mesh_to_stdout,\n\t\t\tk3d::interface_list<k3d::imesh_sink> > factory(\n\t\t\t\tk3d::uuid(0x45ee8c94, 0x223d4ba6, 0xb7eec188, 0xcc9cff65),\n\t\t\t\t\"MeshToStdout\",\n\t\t\t\t_(\"Prints mesh information to stdout\"),\n\t\t\t\t\"Test\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\n\tk3d_data(k3d::mesh*, k3d::data::immutable_name, k3d::data::change_signal, k3d::data::no_undo, k3d::data::local_storage, k3d::data::no_constraint, k3d::data::read_only_property, k3d::data::no_serialization) m_input_mesh;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// mesh_to_stdout_factory\n\nk3d::iplugin_factory& mesh_to_stdout_factory()\n{\n\treturn mesh_to_stdout::get_factory();\n}\n\n} // namespace test\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/test/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace test\n{\n\nextern k3d::iplugin_factory& add_color_attribute_factory();\nextern k3d::iplugin_factory& add_color_attributes_factory();\nextern k3d::iplugin_factory& add_index_attributes_factory();\nextern k3d::iplugin_factory& add_point_attributes_factory();\nextern k3d::iplugin_factory& mesh_to_stdout_factory();\nextern k3d::iplugin_factory& pipeline_profiler_factory();\nextern k3d::iplugin_factory& selection_to_stdout_factory();\nextern k3d::iplugin_factory& string_to_stdout_factory();\nextern k3d::iplugin_factory& valid_meshes_factory();\n\n} // namespace test\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::test::add_color_attribute_factory());\n\tRegistry.register_factory(module::test::add_color_attributes_factory());\n\tRegistry.register_factory(module::test::add_index_attributes_factory());\n\tRegistry.register_factory(module::test::add_point_attributes_factory());\n\tRegistry.register_factory(module::test::mesh_to_stdout_factory());\n\tRegistry.register_factory(module::test::pipeline_profiler_factory());\n\tRegistry.register_factory(module::test::selection_to_stdout_factory());\n\tRegistry.register_factory(module::test::string_to_stdout_factory());\n\tRegistry.register_factory(module::test::valid_meshes_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/test/pipeline_profiler.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/inode.h>\n#include <k3dsdk/ipipeline_profiler.h>\n#include <k3dsdk/module.h>\n#include <k3dsdk/node.h>\n\nnamespace module\n{\n\nnamespace test\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// pipeline_profiler\n\nclass pipeline_profiler :\n\tpublic k3d::node\n{\n\ttypedef k3d::node base;\n\npublic:\n\tpipeline_profiler(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_records(init_owner(*this) + init_name(\"records\") + init_label(_(\"Records\")) + init_description(_(\"Contains records storing the execution time for individual node tasks.\")) + init_value(records_t()))\n\t{\n\t\tDocument.pipeline_profiler().connect_node_execution_signal(sigc::mem_fun(*this, &pipeline_profiler::on_node_execution));\n\t\tDocument.nodes().rename_node_signal().connect(sigc::mem_fun(*this, &pipeline_profiler::on_node_renamed));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<pipeline_profiler> factory(\n\t\t\tk3d::uuid(0x418d0935, 0x12495e73, 0xbcd046a2, 0x92bf7fb1),\n\t\t\t\"PipelineProfiler\",\n\t\t\t_(\"Records data profiling execution of the visualization pipeline\"),\n\t\t\t\"Test\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL\n\t\t\t);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\t/// Called by the signal system when profile data arrives\n\tvoid on_node_execution(k3d::inode& Node, const k3d::string_t& Task, double Time)\n\t{\n\t\trecords_t& records = m_records.internal_value();\n\t\trecords[&Node][Task] = Time;\n\n\t\t// Because we're modifying the internal state of the property by-reference, we have to call the \"changed\" signal explicitly ...\n\t\tm_records.changed_signal().emit(0);\n\t}\n\t\n\t/// Called by the signal system anytime a node is renamed\n\tvoid on_node_renamed(k3d::inode*)\n\t{\n\t}\n\n\t/// Stores profiling events\n\ttypedef std::map<k3d::inode*, std::map<k3d::string_t, k3d::double_t> > records_t;\n\tk3d_data(records_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, read_only_property, no_serialization) m_records;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// pipeline_profiler_factory\n\nk3d::iplugin_factory& pipeline_profiler_factory()\n{\n\treturn pipeline_profiler::get_factory();\n}\n\n} // namespace test\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/test/selection_to_stdout.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Bart Janssens (bart.janssens@lid.kviv.be)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/mesh_selection_sink.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/selection.h>\n\nnamespace module\n{\n\nnamespace test\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// selection_to_stdout\n\nclass selection_to_stdout :\n\tpublic k3d::mesh_selection_sink<k3d::node>\n{\n\ttypedef k3d::mesh_selection_sink<k3d::node> base;\n\npublic:\n\tselection_to_stdout(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t\tm_mesh_selection.changed_signal().connect(sigc::mem_fun(*this, &selection_to_stdout::selection_changed));\n\t}\n\n\tvoid selection_changed(iunknown* const Hint)\n\t{\n\t\tstd::cout << m_mesh_selection.pipeline_value() << std::endl;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<selection_to_stdout,\n\t\t\tk3d::interface_list<k3d::inode> > factory(\n\t\t\t\tk3d::uuid(0x51739d44, 0xc0422e83, 0x6b50ccba, 0x97cad438),\n\t\t\t\t\"SelectionToStdout\",\n\t\t\t\t_(\"Prints selection information to stdout\"),\n\t\t\t\t\"Test\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// selection_to_stdout_factory\n\nk3d::iplugin_factory& selection_to_stdout_factory()\n{\n\treturn selection_to_stdout::get_factory();\n}\n\n} // namespace test\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/test/string_to_stdout.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief An object that converts a scalar to a string using printf() style formatting\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3d-i18n-config.h>\n#include <k3dsdk/node.h>\n\n#include <boost/format.hpp>\n\nnamespace module\n{\n\nnamespace test\n{\n\nclass string_to_stdout :\n\tpublic k3d::node\n{\n\ttypedef k3d::node base;\npublic:\n\tstring_to_stdout(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input(init_owner(*this) + init_name(\"input\") + init_label(_(\"Input\")) + init_description(_(\"Prints input string to console's stdout\")) + init_value(std::string(\"\")))\n\t{\n\t\tm_input.changed_signal().connect(sigc::mem_fun(*this, &string_to_stdout::on_input_changed));\n\t}\n\n\tvoid on_input_changed(k3d::iunknown*)\n\t{\n\t\tstd::cout << m_input.pipeline_value() << std::endl;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<string_to_stdout > factory(\n\t\t\tk3d::uuid(0x9fdbe940, 0x7f394ad7, 0x8654d53c, 0xe33b7a9a),\n\t\t\t\"StringToStdout\",\n\t\t\t_(\"Prints an input string value to stdout\"),\n\t\t\t\"Test\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(std::string, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input;\n};\n\nk3d::iplugin_factory& string_to_stdout_factory()\n{\n\treturn string_to_stdout::get_factory();\n}\n\n} //namespace test\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/test/valid_meshes.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bezier_triangle_patch.h>\n#include <k3dsdk/bicubic_patch.h>\n#include <k3dsdk/bilinear_patch.h>\n#include <k3dsdk/blobby.h>\n#include <k3dsdk/cone.h>\n#include <k3dsdk/cubic_curve.h>\n#include <k3dsdk/cylinder.h>\n#include <k3dsdk/disk.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/hyperboloid.h>\n#include <k3dsdk/linear_curve.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/nurbs_patch.h>\n#include <k3dsdk/paraboloid.h>\n#include <k3dsdk/particle.h>\n#include <k3dsdk/primitive_validation.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/sphere.h>\n#include <k3dsdk/teapot.h>\n#include <k3dsdk/torus.h>\n#include <k3dsdk/user_property_changed_signal.h>\n#include <k3dsdk/value_demand_storage.h>\n\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace test\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// valid_meshes\n\nclass valid_meshes :\n\tpublic k3d::node\n{\n\ttypedef k3d::node base;\n\npublic:\n\tvalid_meshes(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_valid(init_owner(*this) + init_name(\"valid\") + init_label(_(\"Valid\")) + init_description(_(\"True iff every every input mesh can be validated.\")) + init_value(true)),\n\t\tm_user_property_changed_signal(*this)\n\t{\n\t\tm_user_property_changed_signal.connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_valid.make_slot()));\n\n\t\tm_valid.set_update_slot(sigc::mem_fun(*this, &valid_meshes::execute));\n\t}\n\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::bool_t& Output)\n\t{\n\t\tOutput = true;\n\n\t\tconst k3d::iproperty_collection::properties_t& properties = node::properties();\n\t\tfor(k3d::iproperty_collection::properties_t::const_iterator prop = properties.begin(); prop != properties.end(); ++prop)\n\t\t{\n\t\t\tk3d::iproperty& property = **prop;\n\t\t\tif(property.property_type() == typeid(k3d::mesh*))\n\t\t\t{\n\t\t\t\tif(const k3d::mesh* const mesh = boost::any_cast<k3d::mesh*>(k3d::property::pipeline_value(property)))\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::require_valid_points(*mesh);\n\t\t\t\t\t}\n\t\t\t\t\tcatch(std::exception& e)\n\t\t\t\t\t{\n\t\t\t\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\t\t\t\tOutput = false;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = mesh->primitives.begin(); primitive != mesh->primitives.end(); ++primitive)\n\t\t\t\t\t{\n\t\t\t\t\t\tboost::scoped_ptr<k3d::bezier_triangle_patch::const_primitive> bezier_triangle_patch(k3d::bezier_triangle_patch::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(bezier_triangle_patch)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::bicubic_patch::const_primitive> bicubic_patch(k3d::bicubic_patch::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(bicubic_patch)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::bilinear_patch::const_primitive> bilinear_patch(k3d::bilinear_patch::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(bilinear_patch)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::blobby::const_primitive> blobby(k3d::blobby::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(blobby)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::cone::const_primitive> cone(k3d::cone::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(cone)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::cubic_curve::const_primitive> cubic_curve(k3d::cubic_curve::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(cubic_curve)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::cylinder::const_primitive> cylinder(k3d::cylinder::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(cylinder)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::disk::const_primitive> disk(k3d::disk::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(disk)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::hyperboloid::const_primitive> hyperboloid(k3d::hyperboloid::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(hyperboloid)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::linear_curve::const_primitive> linear_curve(k3d::linear_curve::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(linear_curve)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::const_primitive> nurbs_curve(k3d::nurbs_curve::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(nurbs_curve)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::nurbs_patch::const_primitive> nurbs_patch(k3d::nurbs_patch::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(nurbs_patch)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::paraboloid::const_primitive> paraboloid(k3d::paraboloid::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(paraboloid)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::particle::const_primitive> particle(k3d::particle::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(particle)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(polyhedron)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::sphere::const_primitive> sphere(k3d::sphere::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(sphere)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::teapot::const_primitive> teapot(k3d::teapot::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(teapot)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tboost::scoped_ptr<k3d::torus::const_primitive> torus(k3d::torus::validate(*mesh, **primitive));\n\t\t\t\t\t\tif(torus)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tOutput = false;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<valid_meshes >\n\t\t\tfactory(\n\t\t\t\tk3d::uuid(0x55617239, 0x914e0fcf, 0x0d0f9784, 0x899546a4),\n\t\t\t\t\"ValidMeshes\",\n\t\t\t\t_(\"Tests to see that every every primitive and mesh in a collection of meshes can be validated.\"),\n\t\t\t\t\"Test\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_valid;\n\tk3d::user_property_changed_signal m_user_property_changed_signal;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// valid_meshes_factory\n\nk3d::iplugin_factory& valid_meshes_factory()\n{\n\treturn valid_meshes::get_factory();\n}\n\n} // namespace test\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/tiff_io/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${K3D_TIFF_INCLUDE_DIRS})\n\nK3D_BUILD_MODULE(k3d-tiff-io)\nK3D_CREATE_MODULE_PROXY(k3d-tiff-io)\n\nTARGET_LINK_LIBRARIES(k3d-tiff-io ${K3D_TIFF_LIBS})\n\n"
  },
  {
    "path": "modules/tiff_io/bitmap_exporter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/ibitmap_exporter.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/string_modifiers.h>\n\n#include <boost/gil/extension/io/tiff.hpp>\n\nnamespace module\n{\n\nnamespace tiff\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_exporter\n\nclass bitmap_exporter :\n\tpublic k3d::ibitmap_exporter\n{\npublic:\n\tbitmap_exporter()\n\t{\n\t}\n\n\tbool write_file(const k3d::filesystem::path& Path, const k3d::bitmap& Bitmap)\n\t{\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Writing \" << Path.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\t\t\tboost::gil::write_view(Path.native_filesystem_string(), boost::gil::color_converted_view<boost::gil::rgb8_pixel_t>(const_view(Bitmap)), boost::gil::tiff_tag());\n\t\t\treturn true;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t\treturn false;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<bitmap_exporter,\n\t\t\tk3d::interface_list<k3d::ibitmap_exporter> > factory(\n\t\t\t\tk3d::classes::TIFFBitmapExporter(),\n\t\t\t\t\"TIFFBitmapExporter\",\n\t\t\t\t_(\"TIFF (*.tiff)\"),\n\t\t\t\t\"Bitmap BitmapExporter\");\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_exporter_factory\n\nk3d::iplugin_factory& bitmap_exporter_factory()\n{\n\treturn bitmap_exporter::get_factory();\n}\n\n} // namespace io\n\n} // namespace tiff\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/tiff_io/bitmap_importer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/ibitmap_importer.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/string_modifiers.h>\n\n#include <boost/assign/list_of.hpp>\n#include <boost/gil/extension/io/tiff.hpp>\n\nnamespace module\n{\n\nnamespace tiff\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_importer\n\nclass bitmap_importer :\n\tpublic k3d::ibitmap_importer\n{\npublic:\n\tbitmap_importer()\n\t{\n\t}\n\n\tbool read_file(const k3d::filesystem::path& Path, k3d::bitmap& Bitmap)\n\t{\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Reading \" << Path.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\t\t\tboost::gil::read_and_convert_image(Path.native_filesystem_string(), Bitmap, boost::gil::tiff_tag());\n\t\t\treturn true;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t\treturn false;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<bitmap_importer,\n\t\t\tk3d::interface_list<k3d::ibitmap_importer> > factory(\n\t\t\t\tk3d::uuid(0x3cfedd91, 0xd5764d3a, 0x91b15d47, 0xdcdcf962),\n\t\t\t\t\"TIFFBitmapImporter\",\n\t\t\t\t_(\"TIFF (*.tiff)\"),\n\t\t\t\t\"Bitmap BitmapImporter\",\n\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\tboost::assign::map_list_of(\"k3d:load-order\", \"8\")(\"k3d:mime-types\", \"image/tiff\"));\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_importer_factory\n\nk3d::iplugin_factory& bitmap_importer_factory()\n{\n\treturn bitmap_importer::get_factory();\n}\n\n} // namespace io\n\n} // namespace tiff\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/tiff_io/bitmap_reader.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, read to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_source.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/options.h>\n#include <k3dsdk/path.h>\n\n#include <boost/gil/extension/io/tiff.hpp>\n\nnamespace module\n{\n\nnamespace tiff\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_reader\n\nclass bitmap_reader :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_source<bitmap_reader>\n{\n\ttypedef k3d::node base;\n\npublic:\n\tbitmap_reader(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Browse for an input bitmap\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::READ) + init_path_type(k3d::options::path::bitmaps()))\n\t{\n\t\tm_file.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_bitmap_slot()));\n\t}\n\n\tvoid on_resize_bitmap(k3d::bitmap& Output)\n\t{\n\t\tconst k3d::filesystem::path file = m_file.pipeline_value();\n\t\tif(file.empty())\n\t\t\treturn;\n\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Reading \" << file.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\t\t\tboost::gil::read_and_convert_image(file.native_filesystem_string(), Output, boost::gil::tiff_tag());\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t}\n\t}\n\n\tvoid on_assign_pixels(k3d::bitmap& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bitmap_reader,\n\t\t\tk3d::interface_list<k3d::ibitmap_source> > factory(\n\t\t\t\tk3d::uuid(0x1cd9dc05, 0x9b4c9703, 0x97dd6ea6, 0x5bb094c2),\n\t\t\t\t\"TIFFBitmapReader\",\n\t\t\t\t_(\"Loads a TIFF (*.tif) bitmap from the filesystem\"),\n\t\t\t\t\"Bitmap BitmapReader\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_reader_factory\n\nk3d::iplugin_factory& bitmap_reader_factory()\n{\n\treturn bitmap_reader::get_factory();\n}\n\n} // namespace io\n\n} // namespace tiff\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/tiff_io/bitmap_writer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_sink.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/node.h>\n\n#include <boost/gil/extension/io/tiff.hpp>\n\nnamespace module\n{\n\nnamespace tiff\n{\n\nnamespace io\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// bitmap_writer\n\nclass bitmap_writer :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_sink<bitmap_writer>\n{\n\ttypedef k3d::node base;\n\npublic:\n\tbitmap_writer(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_file(init_owner(*this) + init_name(\"file\") + init_label(_(\"File\")) + init_description(_(\"Output file\")) + init_value(k3d::filesystem::path()) + init_path_mode(k3d::ipath_property::WRITE) + init_path_type(\"tiff_files\"))\n\t{\n\t\tm_file.changed_signal().connect(make_input_changed_slot());\n\t}\n\n\tstruct extract_rgb\n\t{\n\t\ttemplate<typename P1, typename P2>\n\t\tvoid operator()(const P1& src, P2& dst) const\n\t\t{\n\t\t\tget_color(dst, boost::gil::red_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::red_t()));\n\t\t\tget_color(dst, boost::gil::green_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::green_t()));\n\t\t\tget_color(dst, boost::gil::blue_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::blue_t()));\n\t\t}\n\t};\n\n\tvoid on_input_changed(k3d::ihint*)\n\t{\n\t\tconst k3d::filesystem::path file = m_file.pipeline_value();\n\t\tif(file.empty())\n\t\t\treturn;\n\n\t\tk3d::bitmap* const bitmap = m_input_bitmap.pipeline_value();\n\t\tif(!bitmap)\n\t\t\treturn;\n\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Writing \" << file.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\t\t\tboost::gil::write_view(file.native_filesystem_string(), boost::gil::color_converted_view<boost::gil::rgb8_pixel_t>(view(*bitmap), extract_rgb()), boost::gil::tiff_tag());\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught exception: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << k3d_file_reference << \": caught unknown exception\" << std::endl;\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<bitmap_writer,\n\t\t\tk3d::interface_list<k3d::ibitmap_sink > > factory(\n\t\t\t\tk3d::uuid(0x70e8b804, 0x8f4fac44, 0x0a7002a3, 0x4dbc8ee7),\n\t\t\t\t\"TIFFBitmapWriter\",\n\t\t\t\t_(\"Bitmap writer that saves TIFF (*.tiff) files\"),\n\t\t\t\t\"Bitmap BitmapWriter\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::filesystem::path, immutable_name, change_signal, with_undo, local_storage, no_constraint, path_property, path_serialization) m_file;\n};\n\nk3d::iplugin_factory& bitmap_writer_factory()\n{\n\treturn bitmap_writer::get_factory();\n}\n\n} // namespace io\n\n} // namespace tiff\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/tiff_io/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace tiff\n{\n\nnamespace io\n{\n\nextern k3d::iplugin_factory& bitmap_exporter_factory();\nextern k3d::iplugin_factory& bitmap_importer_factory();\nextern k3d::iplugin_factory& bitmap_reader_factory();\nextern k3d::iplugin_factory& bitmap_writer_factory();\n\n} // namespace io\n\n} // namespace tiff\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::tiff::io::bitmap_exporter_factory());\n\tRegistry.register_factory(module::tiff::io::bitmap_importer_factory());\n\tRegistry.register_factory(module::tiff::io::bitmap_reader_factory());\n\tRegistry.register_factory(module::tiff::io::bitmap_writer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/time/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-time)\nK3D_CREATE_MODULE_PROXY(k3d-time)\n\n#TARGET_LINK_LIBRARIES(k3d-time)\n\n"
  },
  {
    "path": "modules/time/manual_time_source.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/value_demand_storage.h>\n\n#include <boost/date_time/posix_time/posix_time.hpp>\n\nnamespace module\n{\n\nnamespace time\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// manual_time_source\n\nclass manual_time_source :\n\tpublic k3d::node\n{\n\ttypedef k3d::node base;\n\npublic:\n\tmanual_time_source(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_year(init_owner(*this) + init_name(\"year\") + init_label(_(\"Year\")) + init_description(_(\"Year.\")) + init_value(2009)),\n\t\tm_month(init_owner(*this) + init_name(\"month\") + init_label(_(\"Month\")) + init_description(_(\"Month.\")) + init_value(1)),\n\t\tm_day(init_owner(*this) + init_name(\"day\") + init_label(_(\"Day\")) + init_description(_(\"Day.\")) + init_value(1)),\n\t\tm_hour(init_owner(*this) + init_name(\"hour\") + init_label(_(\"Hour\")) + init_description(_(\"Hour.\")) + init_value(0)),\n\t\tm_minute(init_owner(*this) + init_name(\"minute\") + init_label(_(\"Minute\")) + init_description(_(\"Minute.\")) + init_value(0)),\n\t\tm_second(init_owner(*this) + init_name(\"second\") + init_label(_(\"Second\")) + init_description(_(\"Second.\")) + init_value(0.0)),\n\t\tm_time(init_owner(*this) + init_name(\"time\") + init_label(_(\"Time\")) + init_description(_(\"Time\")) + init_value(0.0))\n\t{\n\t\tm_year.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_time.make_slot()));\n\t\tm_month.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_time.make_slot()));\n\t\tm_day.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_time.make_slot()));\n\t\tm_hour.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_time.make_slot()));\n\t\tm_minute.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_time.make_slot()));\n\t\tm_second.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_time.make_slot()));\n\n\t\tm_time.set_update_slot(sigc::mem_fun(*this, &manual_time_source::execute));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<manual_time_source > factory(\n\t\t\tk3d::uuid(0xa3f7be22, 0x264d44fb, 0x18849fac, 0x8cdc9e37),\n\t\t\t\"ManualTimeSource\",\n\t\t\t_(\"Provides a time source for a K-3D document\"),\n\t\t\t\"Animation\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_year;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_month;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_day;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_hour;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_minute;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_second;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_time;\n\n\t/// Called whenever the output time has been modified and needs to be updated.\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::double_t& Time)\n\t{\n\t\tconst k3d::int32_t year = m_year.pipeline_value();\n\t\tconst k3d::int32_t month = m_month.pipeline_value();\n\t\tconst k3d::int32_t day = m_day.pipeline_value();\n\t\tconst k3d::int32_t hour = m_hour.pipeline_value();\n\t\tconst k3d::int32_t minute = m_minute.pipeline_value();\n\n\t\tconst k3d::double_t second = m_second.pipeline_value();\n\t\tconst k3d::double_t whole_second = std::floor(second);\n\t\tconst k3d::double_t fractional_second = second - whole_second;\t\n\n\t\tconst boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1));\n\t\tconst boost::posix_time::ptime output(\n\t\t\tboost::gregorian::date(year, month, day),\n\t\t\tboost::posix_time::time_duration(hour, minute, second, fractional_second * boost::posix_time::time_duration::ticks_per_second()));\n\t\tconst boost::posix_time::time_duration elapsed = output - epoch;\n\n\t\tTime = elapsed.total_seconds();\n\t\tTime += static_cast<k3d::double_t>(elapsed.fractional_seconds()) / static_cast<k3d::double_t>(elapsed.ticks_per_second());\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// manual_time_source_factory\n\nk3d::iplugin_factory& manual_time_source_factory()\n{\n\treturn manual_time_source::get_factory();\n}\n\n} // namespace time\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/time/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements procedures required to export K-3D objects from the time module\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\n/// Namespace reserved for the time plugin module, to protect public symbols from name clashes with other modules\nnamespace module\n{\n\nnamespace time\n{\n\nextern k3d::iplugin_factory& time_to_string_factory();\nextern k3d::iplugin_factory& manual_time_source_factory();\nextern k3d::iplugin_factory& real_time_source_factory();\nextern k3d::iplugin_factory& time_source_factory();\n\n} // namespace time\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::time::time_to_string_factory());\n\tRegistry.register_factory(module::time::manual_time_source_factory());\n\tRegistry.register_factory(module::time::real_time_source_factory());\n\tRegistry.register_factory(module::time::time_source_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/time/real_time_source.cpp",
    "content": "// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-platform-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/iuser_interface.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/user_interface.h>\n#include <k3dsdk/value_demand_storage.h>\n\n#include <boost/date_time/posix_time/posix_time.hpp>\n\n#include <limits>\n\nnamespace module\n{\n\nnamespace time\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// real_time_source\n\nclass real_time_source :\n\tpublic k3d::node\n{\n\ttypedef k3d::node base;\n\npublic:\n\treal_time_source(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_frame_rate(init_owner(*this) + init_name(\"frame_rate\") + init_label(_(\"Frame rate\")) + init_description(_(\"Frame rate\")) + init_value(1.0) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(std::numeric_limits<k3d::double_t>::epsilon()))),\n\t\tm_time(init_owner(*this) + init_name(\"time\") + init_label(_(\"Time\")) + init_description(_(\"Time\")) + init_value(0.0))\n\t{\n\t\tm_frame_rate.changed_signal().connect(sigc::mem_fun(*this, &real_time_source::on_reset_source));\n\t\tm_time.set_update_slot(sigc::mem_fun(*this, &real_time_source::execute));\n\t\ton_reset_source(0);\n\t}\n\n\t~real_time_source()\n\t{\n\t\tm_timeout_connection.disconnect();\n\t}\n\n\tvoid on_reset_source(k3d::ihint* Hint = 0)\n\t{\n\t\tm_timeout_connection.disconnect();\n\t\tm_timeout_connection = k3d::user_interface().get_timer(m_frame_rate.pipeline_value(), sigc::bind(m_time.make_slot(), static_cast<k3d::ihint*>(0)));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<real_time_source > factory(\n\t\t\tk3d::uuid(0xf7c119e7, 0xd87b465a, 0x9b7e0289, 0x82d91702),\n\t\t\t\"RealTimeSource\",\n\t\t\t_(\"Provides a realtime time source for a K-3D document\"),\n\t\t\t\"Animation\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_frame_rate;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_time;\n\tsigc::connection m_timeout_connection;\n\n\t/// Called whenever the output time has been modified and needs to be updated.\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::double_t& Time)\n\t{\n\t\tconst boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1));\n\t\tconst boost::posix_time::ptime current_time = boost::posix_time::microsec_clock::universal_time();\n\t\tconst boost::posix_time::time_duration elapsed = current_time - epoch;\n\n\t\tTime = elapsed.total_seconds();\n\t\tTime += static_cast<k3d::double_t>(elapsed.fractional_seconds()) / static_cast<k3d::double_t>(elapsed.ticks_per_second());\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// real_time_source_factory\n\nk3d::iplugin_factory& real_time_source_factory()\n{\n\treturn real_time_source::get_factory();\n}\n\n} // namespace time\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/time/time_source.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n\n#include <limits>\n\nnamespace module\n{\n\nnamespace time\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// time_source\n\nclass time_source :\n\tpublic k3d::node\n{\n\ttypedef k3d::node  base;\n\npublic:\n\ttime_source(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_start_time(init_owner(*this) + init_name(\"start_time\") + init_label(_(\"Start Time\")) + init_description(_(\"Controls the start time (in seconds) for rendering animations.\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::time))),\n\t\tm_end_time(init_owner(*this) + init_name(\"end_time\") + init_label(_(\"End Time\")) + init_description(_(\"Controls the end time (in seconds) for rendering animations.\")) + init_value(4.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::time))),\n\t\tm_frame_rate(init_owner(*this) + init_name(\"frame_rate\") + init_label(_(\"Frame Rate\")) + init_description(_(\"Controls the frame rate (in frames-per-second) for rendering animations.\")) + init_value(30.0) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum(std::numeric_limits<k3d::double_t>::epsilon()))),\n\t\tm_time(init_owner(*this) + init_name(\"time\") + init_label(_(\"Time\")) + init_description(_(\"Controls the current time displayed in the viewports.\")) + init_value(0.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::time)))\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<time_source > factory(\n\t\t\tk3d::classes::TimeSource(),\n\t\t\t\"TimeSource\",\n\t\t\t_(\"Provides a time source for a K-3D document\"),\n\t\t\t\"Animation\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_start_time;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_end_time;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_frame_rate;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, measurement_property, with_serialization) m_time;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// time_source_factory\n\nk3d::iplugin_factory& time_source_factory()\n{\n\treturn time_source::get_factory();\n}\n\n} // namespace time\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/time/time_to_string.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-platform-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/value_demand_storage.h>\n\n#include <boost/date_time/posix_time/posix_time.hpp>\n\nnamespace module\n{\n\nnamespace time\n{\n\nclass time_to_string :\n\tpublic k3d::node\n{\n\ttypedef k3d::node base;\npublic:\n\ttime_to_string(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_input(init_owner(*this) + init_name(\"input\") + init_label(_(\"Input\")) + init_description(_(\"Timestamp value, or 0 to use current system time\")) + init_value(0.0)),\n\t\tm_format(init_owner(*this) + init_name(\"format\") + init_label(_(\"Format\")) + init_description(_(\"strftime() time_to_string string\")) + init_value(std::string(\"%H:%M:%S\"))),\n\t\tm_output(init_owner(*this) + init_name(\"output\") + init_label(_(\"Output string\")) + init_description(_(\"strftime() output string (read only)\")) + init_value(k3d::string_t()))\n\t{\n\t\tm_input.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_output.make_slot()));\n\t\tm_format.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(m_output.make_slot()));\n\n\t\tm_output.set_update_slot(sigc::mem_fun(*this, &time_to_string::execute));\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<time_to_string > factory(\n\t\t\tk3d::uuid(0x40d699fb, 0xeb12444f, 0xa84df477, 0x5cca00f9),\n\t\t\t\"TimeToString\",\n\t\t\t_(\"Converts a scalar to a string using strftime()-style formatting\"),\n\t\t\t\"String\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_input;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_format;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, no_undo, value_demand_storage, no_constraint, read_only_property, no_serialization) m_output;\n\n\tvoid execute(const std::vector<k3d::ihint*>& Hints, k3d::string_t& Result)\n\t{\n\t\ttry\n\t\t{\n\t\t\tconst k3d::double_t input_seconds = m_input.pipeline_value();\n\t\t\tconst k3d::double_t input_whole_seconds = std::floor(input_seconds);\n\t\t\tconst k3d::double_t input_fractional_seconds = input_seconds - input_whole_seconds;\n\n\t\t\tboost::posix_time::ptime input_time = boost::posix_time::from_time_t(static_cast<time_t>(input_whole_seconds));\n\t\t\tinput_time += boost::posix_time::time_duration(0, 0, 0, input_fractional_seconds * boost::posix_time::time_duration::ticks_per_second());\n\n\t\t\tstd::locale time_locale(std::locale(), new boost::posix_time::time_facet(m_format.pipeline_value().c_str()));\n\n\t\t\tstd::ostringstream buffer;\n\t\t\tbuffer.imbue(time_locale);\n\t\t\tbuffer << input_time;\n\n\t\t\tResult = buffer.str();\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << \"Caught exception: \" << e.what() << std::endl;\n\t\t\tResult = k3d::string_t();\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << \"Caught unknown exception.\" << std::endl;\n\t\t\tResult = k3d::string_t();\n\t\t}\n\t}\n};\n\nk3d::iplugin_factory& time_to_string_factory()\n{\n\treturn time_to_string::get_factory();\n}\n\n} //namespace time\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/uniform_polyhedron/CMakeLists.txt",
    "content": "FILE(GLOB POLYHEDRA RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} data/*.xml)\nLIST(SORT POLYHEDRA)\nFOREACH(POLYHEDRON ${POLYHEDRA})\n\tK3D_COMPILE_RESOURCE(RESOURCES ${POLYHEDRON} \"/module/uniform_polyhedron/${POLYHEDRON}\")\nENDFOREACH()\n\nK3D_COMPILE_RESOURCE(RESOURCES data/polyhedra.txt \"/module/uniform_polyhedron/data/polyhedra.txt\")\n\nK3D_BUILD_MODULE(k3d-uniform-polyhedron EXTRA_SOURCES ${RESOURCES})\nK3D_CREATE_MODULE_PROXY(k3d-uniform-polyhedron)\nTARGET_LINK_LIBRARIES(k3d-uniform-polyhedron k3dsdk-resource)\n\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/augmented_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.690996698602\" y=\"0.36356007858\" z=\"-0.464001590576\"/>\n <p x=\"0.89396317331\" y=\"-0.188865778474\" z=\"-0.211179563251\"/>\n <p x=\"0.514363338399\" y=\"-0.657053132117\" z=\"-0.427958856824\"/>\n <p x=\"0.0767912635928\" y=\"-0.393982972718\" z=\"-0.814757855635\"/>\n <p x=\"0.185956683745\" y=\"0.23679068086\" z=\"-0.837033490141\"/>\n <p x=\"-0.419267224735\" y=\"-0.805701155172\" z=\"-0.0032383778419\"/>\n <p x=\"-0.50022415736\" y=\"-0.485852503326\" z=\"-0.552266163906\"/>\n <p x=\"0.207782332205\" y=\"-0.91150896266\" z=\"0.0735877629847\"/>\n <p x=\"-0.747673879388\" y=\"0.0881426578049\" z=\"-0.412313011159\"/>\n <p x=\"-0.323590797157\" y=\"0.534760707371\" z=\"-0.588308897658\"/>\n <p x=\"-0.133468444379\" y=\"0.845685709103\" z=\"-0.0615567461011\"/>\n <p x=\"0.493581112561\" y=\"0.739877901615\" z=\"0.0152693947255\"/>\n <p x=\"0.574538045186\" y=\"0.420029249769\" z=\"0.564297180789\"/>\n <p x=\"0.821987767215\" y=\"-0.153965911363\" z=\"0.424344028043\"/>\n <p x=\"0.397904684983\" y=\"-0.600583960928\" z=\"0.600339914542\"/>\n <p x=\"-0.00247737576667\" y=\"0.32815971916\" z=\"0.826788872518\"/>\n <p x=\"-0.111642795919\" y=\"-0.302613934418\" z=\"0.849064507025\"/>\n <p x=\"-0.440049450573\" y=\"0.591229878559\" z=\"0.439989873707\"/>\n <p x=\"-0.616682810776\" y=\"-0.429383332138\" z=\"0.47603260746\"/>\n <p x=\"-0.819649285484\" y=\"0.123042524916\" z=\"0.223210580134\"/>\n <p x=\"-0.743138878261\" y=\"0.658232535577\" z=\"-0.120310168836\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>3</v><v>2</v><v>7</v></f>\n <f><v>8</v><v>9</v><v>4</v><v>3</v><v>6</v></f>\n <f><v>10</v><v>11</v><v>0</v><v>4</v><v>9</v></f>\n <f><v>12</v><v>13</v><v>1</v><v>0</v><v>11</v></f>\n <f><v>14</v><v>7</v><v>2</v><v>1</v><v>13</v></f>\n <f><v>13</v><v>12</v><v>15</v><v>16</v><v>14</v></f>\n <f><v>11</v><v>10</v><v>17</v><v>15</v><v>12</v></f>\n <f><v>6</v><v>5</v><v>18</v><v>19</v><v>8</v></f>\n <f><v>7</v><v>14</v><v>16</v><v>18</v><v>5</v></f>\n <f><v>18</v><v>16</v><v>15</v><v>17</v><v>19</v></f>\n <f><v>20</v><v>19</v><v>17</v></f>\n <f><v>20</v><v>17</v><v>10</v></f>\n <f><v>20</v><v>8</v><v>19</v></f>\n <f><v>20</v><v>9</v><v>8</v></f>\n <f><v>9</v><v>20</v><v>10</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/augmented_hexagonal_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.773033250102\" y=\"0.308428014623\" z=\"-0.0801740279296\"/>\n <p x=\"-0.665188890182\" y=\"-0.36847121549\" z=\"-0.146598564539\"/>\n <p x=\"-0.141299597606\" y=\"-0.667870518853\" z=\"0.185267762508\"/>\n <p x=\"0.27474533505\" y=\"-0.290370592103\" z=\"0.583558626165\"/>\n <p x=\"0.16690097513\" y=\"0.38652863801\" z=\"0.649983162774\"/>\n <p x=\"-0.356988317446\" y=\"0.685927941373\" z=\"0.318116835727\"/>\n <p x=\"0.57691642712\" y=\"0.504889903799\" z=\"0.109508248788\"/>\n <p x=\"0.68476078704\" y=\"-0.172009326314\" z=\"0.0430837121784\"/>\n <p x=\"0.268715854383\" y=\"-0.549509253064\" z=\"-0.355207151478\"/>\n <p x=\"-0.255173438193\" y=\"-0.250109949701\" z=\"-0.687073478526\"/>\n <p x=\"-0.363017798113\" y=\"0.426789280412\" z=\"-0.620648941916\"/>\n <p x=\"0.0530271345435\" y=\"0.804289207162\" z=\"-0.222358078259\"/>\n <p x=\"0.529634778377\" y=\"-0.818512129857\" z=\"0.222541894507\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v></f>\n <f><v>6</v><v>7</v><v>8</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>1</v><v>0</v><v>10</v><v>9</v></f>\n <f><v>2</v><v>1</v><v>9</v><v>8</v></f>\n <f><v>4</v><v>3</v><v>7</v><v>6</v></f>\n <f><v>5</v><v>4</v><v>6</v><v>11</v></f>\n <f><v>0</v><v>5</v><v>11</v><v>10</v></f>\n <f><v>2</v><v>12</v><v>3</v></f>\n <f><v>2</v><v>8</v><v>12</v></f>\n <f><v>3</v><v>12</v><v>7</v></f>\n <f><v>7</v><v>12</v><v>8</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/augmented_pentagonal_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.656972144543\" y=\"0.178609464716\" z=\"-0.534529363931\"/>\n <p x=\"-0.532390056745\" y=\"-0.551113859201\" z=\"-0.26342396816\"/>\n <p x=\"-0.226343567665\" y=\"-0.493002467532\" z=\"0.46078150984\"/>\n <p x=\"-0.161778523075\" y=\"0.272635671571\" z=\"0.637259714312\"/>\n <p x=\"-0.427921620112\" y=\"0.68771467295\" z=\"0.0221237649489\"/>\n <p x=\"0.29792611001\" y=\"0.697387116632\" z=\"-0.285392865813\"/>\n <p x=\"0.564069207048\" y=\"0.282308115252\" z=\"0.329743083551\"/>\n <p x=\"0.499504162457\" y=\"-0.483330023851\" z=\"0.153264879079\"/>\n <p x=\"0.193457673377\" y=\"-0.54144141552\" z=\"-0.570940598922\"/>\n <p x=\"0.0688755855791\" y=\"0.188281908397\" z=\"-0.842045994693\"/>\n <p x=\"0.381573173669\" y=\"-0.238049183415\" z=\"0.893159839789\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>1</v><v>0</v><v>9</v><v>8</v></f>\n <f><v>2</v><v>1</v><v>8</v><v>7</v></f>\n <f><v>4</v><v>3</v><v>6</v><v>5</v></f>\n <f><v>0</v><v>4</v><v>5</v><v>9</v></f>\n <f><v>2</v><v>10</v><v>3</v></f>\n <f><v>2</v><v>7</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>6</v></f>\n <f><v>6</v><v>10</v><v>7</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/augmented_sphenocorona.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.0731066903677\" y=\"-0.60096559282\" z=\"-0.249393141291\"/>\n <p x=\"-0.688960437326\" y=\"-0.636192817593\" z=\"0.347263897696\"/>\n <p x=\"-0.630716662644\" y=\"0.0464957680021\" z=\"-0.169514947642\"/>\n <p x=\"-0.170464830014\" y=\"0.511405750693\" z=\"-0.72498143082\"/>\n <p x=\"0.387145334103\" y=\"-0.136055999201\" z=\"-0.804860116827\"/>\n <p x=\"0.557070195156\" y=\"0.513046287819\" z=\"-0.26978297158\"/>\n <p x=\"-0.184606323721\" y=\"0.725964013906\" z=\"0.10584952556\"/>\n <p x=\"0.406104992113\" y=\"0.282752014172\" z=\"0.543045048286\"/>\n <p x=\"0.129681997293\" y=\"-0.528812929523\" z=\"0.581381893549\"/>\n <p x=\"0.695781821256\" y=\"-0.296286077616\" z=\"-0.0202666530339\"/>\n <p x=\"-0.427929395848\" y=\"0.11864958216\" z=\"0.661258896103\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>0</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>7</v></f>\n <f><v>7</v><v>8</v><v>9</v></f>\n <f><v>7</v><v>6</v><v>10</v></f>\n <f><v>7</v><v>10</v><v>8</v></f>\n <f><v>8</v><v>0</v><v>9</v></f>\n <f><v>9</v><v>0</v><v>4</v></f>\n <f><v>6</v><v>2</v><v>10</v></f>\n <f><v>2</v><v>6</v><v>3</v></f>\n <f><v>4</v><v>5</v><v>9</v></f>\n <f><v>4</v><v>3</v><v>5</v></f>\n <f><v>5</v><v>3</v><v>6</v></f>\n <f><v>9</v><v>5</v><v>7</v></f>\n <f><v>8</v><v>1</v><v>0</v></f>\n <f><v>8</v><v>10</v><v>1</v></f>\n <f><v>1</v><v>10</v><v>2</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/augmented_triangular_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.212341796722\" y=\"0.721424238246\" z=\"-0.336993150441\"/>\n <p x=\"-0.787590703411\" y=\"-0.229587553768\" z=\"-0.0780819611959\"/>\n <p x=\"-0.248845774812\" y=\"-0.281941728392\" z=\"0.926598425506\"/>\n <p x=\"0.326403131876\" y=\"0.669070063622\" z=\"0.667687236261\"/>\n <p x=\"0.196560923136\" y=\"-0.800194628977\" z=\"0.0125981292409\"/>\n <p x=\"0.771809829824\" y=\"0.150817163037\" z=\"-0.246313060004\"/>\n <p x=\"-0.0459956098911\" y=\"-0.229587553768\" z=\"-0.945495619367\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v><v>5</v></f>\n <f><v>5</v><v>6</v><v>0</v></f>\n <f><v>6</v><v>1</v><v>0</v></f>\n <f><v>1</v><v>6</v><v>4</v></f>\n <f><v>0</v><v>3</v><v>5</v></f>\n <f><v>2</v><v>1</v><v>4</v></f>\n <f><v>5</v><v>4</v><v>6</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/augmented_tridiminished_icosahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.644125302624\" y=\"0.226975230392\" z=\"0.175088981414\"/>\n <p x=\"0.099510328171\" y=\"0.322124821519\" z=\"0.572608924893\"/>\n <p x=\"-0.341538094523\" y=\"-0.18184513908\" z=\"0.449435923765\"/>\n <p x=\"-0.0695060359795\" y=\"-0.588465295166\" z=\"-0.0242091209077\"/>\n <p x=\"0.539667444924\" y=\"-0.33580041154\" z=\"-0.19376485599\"/>\n <p x=\"0.442688603123\" y=\"0.277446801742\" z=\"-0.473414601563\"/>\n <p x=\"-0.542974794025\" y=\"-0.131373567729\" z=\"-0.199067659212\"/>\n <p x=\"-0.226421098204\" y=\"0.40378953943\" z=\"-0.476691914189\"/>\n <p x=\"0.170656544579\" y=\"0.684066957829\" z=\"0.000230443109968\"/>\n <p x=\"-0.71620820069\" y=\"-0.676918937396\" z=\"0.16978387868\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>4</v><v>3</v><v>6</v><v>7</v></f>\n <f><v>5</v><v>8</v><v>0</v></f>\n <f><v>8</v><v>1</v><v>0</v></f>\n <f><v>0</v><v>4</v><v>5</v></f>\n <f><v>5</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>1</v><v>8</v><v>7</v><v>6</v></f>\n <f><v>9</v><v>2</v><v>6</v></f>\n <f><v>9</v><v>6</v><v>3</v></f>\n <f><v>9</v><v>3</v><v>2</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/augmented_truncated_cube.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.805570124597\" y=\"0.121703592974\" z=\"-0.393570253788\"/>\n <p x=\"0.757003995945\" y=\"0.492799293416\" z=\"-0.0524055472691\"/>\n <p x=\"0.830786312785\" y=\"0.158979214719\" z=\"0.321204368945\"/>\n <p x=\"0.879352441437\" y=\"-0.212116485723\" z=\"-0.0199603375741\"/>\n <p x=\"0.400792457786\" y=\"0.297267884533\" z=\"-0.642158798763\"/>\n <p x=\"0.352226329134\" y=\"0.668363584975\" z=\"-0.300994092245\"/>\n <p x=\"0.370056866798\" y=\"0.694721429884\" z=\"0.20442789051\"/>\n <p x=\"0.443839183637\" y=\"0.360901351187\" z=\"0.578037806724\"/>\n <p x=\"0.530352599112\" y=\"-0.137549376408\" z=\"0.600980034516\"/>\n <p x=\"0.578918727764\" y=\"-0.50864507685\" z=\"0.259815327997\"/>\n <p x=\"0.5610881901\" y=\"-0.535002921759\" z=\"-0.245606654757\"/>\n <p x=\"0.487305873261\" y=\"-0.201182843062\" z=\"-0.619216570971\"/>\n <p x=\"0.238921131616\" y=\"-0.550489415762\" z=\"0.632796199661\"/>\n <p x=\"-0.259738617695\" y=\"-0.636024092267\" z=\"0.65484882412\"/>\n <p x=\"-0.624952402031\" y=\"-0.715144052924\" z=\"0.313055073052\"/>\n <p x=\"-0.642782939695\" y=\"-0.741501897832\" z=\"-0.192366909703\"/>\n <p x=\"-0.302785343546\" y=\"-0.699657558921\" z=\"-0.565347781367\"/>\n <p x=\"0.195874405764\" y=\"-0.614122882415\" z=\"-0.587400405826\"/>\n <p x=\"-0.716565256534\" y=\"-0.407681819135\" z=\"-0.565976825916\"/>\n <p x=\"-0.803078672009\" y=\"0.0907689084595\" z=\"-0.588919053709\"/>\n <p x=\"-0.511647204513\" y=\"0.503708947813\" z=\"-0.620735218854\"/>\n <p x=\"-0.0129874552021\" y=\"0.589243624319\" z=\"-0.642787843313\"/>\n <p x=\"-0.851644800661\" y=\"0.461864608902\" z=\"-0.24775434719\"/>\n <p x=\"-0.833814262997\" y=\"0.48822245381\" z=\"0.257667635564\"/>\n <p x=\"-0.468600478661\" y=\"0.567342414467\" z=\"0.599461386633\"/>\n <p x=\"0.0300592706493\" y=\"0.652877090972\" z=\"0.577408762174\"/>\n <p x=\"-0.760031946158\" y=\"0.154402375113\" z=\"0.631277551778\"/>\n <p x=\"-0.673518530683\" y=\"-0.344048352482\" z=\"0.654219779571\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>1</v><v>0</v><v>4</v><v>5</v></f>\n <f><v>1</v><v>5</v><v>6</v></f>\n <f><v>2</v><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>7</v><v>8</v></f>\n <f><v>3</v><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>9</v><v>10</v></f>\n <f><v>0</v><v>3</v><v>10</v><v>11</v></f>\n <f><v>0</v><v>11</v><v>4</v></f>\n <f><v>9</v><v>12</v><v>13</v><v>14</v><v>15</v><v>16</v><v>17</v><v>10</v></f>\n <f><v>11</v><v>17</v><v>16</v><v>18</v><v>19</v><v>20</v><v>21</v><v>4</v></f>\n <f><v>5</v><v>21</v><v>20</v><v>22</v><v>23</v><v>24</v><v>25</v><v>6</v></f>\n <f><v>7</v><v>25</v><v>24</v><v>26</v><v>27</v><v>13</v><v>12</v><v>8</v></f>\n <f><v>18</v><v>15</v><v>14</v><v>27</v><v>26</v><v>23</v><v>22</v><v>19</v></f>\n <f><v>8</v><v>12</v><v>9</v></f>\n <f><v>27</v><v>14</v><v>13</v></f>\n <f><v>6</v><v>25</v><v>7</v></f>\n <f><v>23</v><v>26</v><v>24</v></f>\n <f><v>4</v><v>21</v><v>5</v></f>\n <f><v>19</v><v>22</v><v>20</v></f>\n <f><v>10</v><v>17</v><v>11</v></f>\n <f><v>15</v><v>18</v><v>16</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/augmented_truncated_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.0366265956583\" y=\"0.032498678734\" z=\"-0.932860499023\"/>\n <p x=\"-0.176520669436\" y=\"-0.246320482138\" z=\"-0.883624951892\"/>\n <p x=\"-0.426700597828\" y=\"-0.386903483247\" z=\"-0.751787784606\"/>\n <p x=\"-0.691606151491\" y=\"-0.335552396409\" z=\"-0.587706314087\"/>\n <p x=\"-0.870052412735\" y=\"-0.111881591437\" z=\"-0.454054085148\"/>\n <p x=\"-0.893878974929\" y=\"0.198674286461\" z=\"-0.401881706574\"/>\n <p x=\"-0.753984901152\" y=\"0.477493447333\" z=\"-0.451117253704\"/>\n <p x=\"-0.50380497276\" y=\"0.618076448442\" z=\"-0.58295442099\"/>\n <p x=\"-0.238899419097\" y=\"0.566725361604\" z=\"-0.74703589151\"/>\n <p x=\"-0.0604531578529\" y=\"0.343054556631\" z=\"-0.880688120448\"/>\n <p x=\"0.0759579303801\" y=\"0.589282541494\" z=\"-0.7375154627\"/>\n <p x=\"0.778562072341\" y=\"0.00622933584901\" z=\"-0.404204472725\"/>\n <p x=\"0.642150984108\" y=\"-0.239998649013\" z=\"-0.547377130473\"/>\n <p x=\"0.39760664471\" y=\"-0.327848019604\" z=\"-0.726862978394\"/>\n <p x=\"0.138336680041\" y=\"-0.223763302248\" z=\"-0.874104523083\"/>\n <p x=\"0.320502269778\" y=\"0.677131912085\" z=\"-0.558029614778\"/>\n <p x=\"0.579772234448\" y=\"0.573047194729\" z=\"-0.41078807009\"/>\n <p x=\"0.754735510147\" y=\"0.316785213747\" z=\"-0.35203209415\"/>\n <p x=\"0.401325973204\" y=\"0.796717999701\" z=\"-0.277135841152\"/>\n <p x=\"0.162134703974\" y=\"-0.864311705138\" z=\"-0.143466969597\"/>\n <p x=\"-0.152722645502\" y=\"-0.886868885028\" z=\"-0.152987398407\"/>\n <p x=\"-0.411992610172\" y=\"-0.782784167672\" z=\"-0.300228943095\"/>\n <p x=\"-0.516642875792\" y=\"-0.591814377391\" z=\"-0.528950338146\"/>\n <p x=\"0.50225691033\" y=\"-0.518817809885\" z=\"-0.498141583343\"/>\n <p x=\"0.412314632366\" y=\"-0.723728704029\" z=\"-0.275304136883\"/>\n <p x=\"-0.709843300568\" y=\"-0.506202009464\" z=\"0.419756126086\"/>\n <p x=\"-0.884806576267\" y=\"-0.249940028482\" z=\"0.361000150145\"/>\n <p x=\"-0.989456841887\" y=\"-0.0589702382005\" z=\"0.132278755094\"/>\n <p x=\"-0.983821252893\" y=\"-0.00623660768289\" z=\"-0.179044260114\"/>\n <p x=\"-0.417628199165\" y=\"-0.83551779819\" z=\"0.0110940721128\"/>\n <p x=\"-0.531397039324\" y=\"-0.729872814436\" z=\"0.286103897147\"/>\n <p x=\"-0.632327976451\" y=\"0.58566299515\" z=\"0.507109639338\"/>\n <p x=\"-0.542385698487\" y=\"0.790573889294\" z=\"0.284272192878\"/>\n <p x=\"-0.536750109493\" y=\"0.843307519812\" z=\"-0.0270508223292\"/>\n <p x=\"-0.617573812919\" y=\"0.723721432195\" z=\"-0.307944595956\"/>\n <p x=\"-0.908633138462\" y=\"0.0606158494156\" z=\"0.41317252872\"/>\n <p x=\"-0.772222050229\" y=\"0.306843834278\" z=\"0.556345186468\"/>\n <p x=\"0.287557133045\" y=\"0.902362983454\" z=\"-0.00212601611756\"/>\n <p x=\"-0.292205770095\" y=\"0.931156890402\" z=\"0.152435025592\"/>\n <p x=\"0.0226515793819\" y=\"0.953714070293\" z=\"0.161955454402\"/>\n <p x=\"0.561535085371\" y=\"0.402397581673\" z=\"0.596674370082\"/>\n <p x=\"0.296629531707\" y=\"0.453748668511\" z=\"0.760755840601\"/>\n <p x=\"0.0464496033157\" y=\"0.313165667403\" z=\"0.892593007888\"/>\n <p x=\"-0.0934444704621\" y=\"0.0343465065306\" z=\"0.941828555018\"/>\n <p x=\"-0.0696179082674\" y=\"-0.276209371367\" z=\"0.889656176443\"/>\n <p x=\"0.108828352976\" y=\"-0.499880176339\" z=\"0.756003947505\"/>\n <p x=\"0.373733906639\" y=\"-0.551231263177\" z=\"0.591922476985\"/>\n <p x=\"0.623913835031\" y=\"-0.410648262069\" z=\"0.460085309699\"/>\n <p x=\"0.763807908809\" y=\"-0.131829101196\" z=\"0.410849762569\"/>\n <p x=\"0.739981346614\" y=\"0.178726776701\" z=\"0.463022141144\"/>\n <p x=\"0.853750186773\" y=\"0.0730817929475\" z=\"0.188012316109\"/>\n <p x=\"0.281921544051\" y=\"0.849629352937\" z=\"0.30919699909\"/>\n <p x=\"0.386571809672\" y=\"0.658659562655\" z=\"0.537918394142\"/>\n <p x=\"0.859385775767\" y=\"0.125815423465\" z=\"-0.123310699099\"/>\n <p x=\"-0.52767771083\" y=\"0.394693204869\" z=\"0.73583103439\"/>\n <p x=\"-0.268407746161\" y=\"0.290608487513\" z=\"0.883072579078\"/>\n <p x=\"-0.450573335899\" y=\"-0.61028672682\" z=\"0.566997670774\"/>\n <p x=\"-0.2060289965\" y=\"-0.522437356229\" z=\"0.746483518695\"/>\n <p x=\"0.406679043373\" y=\"-0.776462334547\" z=\"0.0360188783245\"/>\n <p x=\"0.487502746798\" y=\"-0.656876246931\" z=\"0.316912651951\"/>\n <p x=\"0.814051543716\" y=\"-0.371173783881\" z=\"0.211039063478\"/>\n <p x=\"0.677640455483\" y=\"-0.617401768743\" z=\"0.0678664057302\"/>\n <p x=\"0.683276044477\" y=\"-0.564668138225\" z=\"-0.243456609477\"/>\n <p x=\"0.823170118255\" y=\"-0.285848977353\" z=\"-0.292692156608\"/>\n <p x=\"0.90399382168\" y=\"-0.166262889737\" z=\"-0.0117983829813\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>9</v><v>8</v></f>\n <f><v>11</v><v>12</v><v>13</v><v>14</v><v>0</v><v>9</v><v>10</v><v>15</v><v>16</v><v>17</v></f>\n <f><v>18</v><v>16</v><v>15</v></f>\n <f><v>14</v><v>1</v><v>0</v></f>\n <f><v>19</v><v>20</v><v>21</v><v>22</v><v>2</v><v>1</v><v>14</v><v>13</v><v>23</v><v>24</v></f>\n <f><v>12</v><v>23</v><v>13</v></f>\n <f><v>22</v><v>3</v><v>2</v></f>\n <f><v>25</v><v>26</v><v>27</v><v>28</v><v>4</v><v>3</v><v>22</v><v>21</v><v>29</v><v>30</v></f>\n <f><v>20</v><v>29</v><v>21</v></f>\n <f><v>28</v><v>5</v><v>4</v></f>\n <f><v>31</v><v>32</v><v>33</v><v>34</v><v>6</v><v>5</v><v>28</v><v>27</v><v>35</v><v>36</v></f>\n <f><v>26</v><v>35</v><v>27</v></f>\n <f><v>34</v><v>7</v><v>6</v></f>\n <f><v>37</v><v>18</v><v>15</v><v>10</v><v>8</v><v>7</v><v>34</v><v>33</v><v>38</v><v>39</v></f>\n <f><v>32</v><v>38</v><v>33</v></f>\n <f><v>40</v><v>41</v><v>42</v><v>43</v><v>44</v><v>45</v><v>46</v><v>47</v><v>48</v><v>49</v></f>\n <f><v>50</v><v>49</v><v>48</v></f>\n <f><v>18</v><v>37</v><v>51</v><v>52</v><v>40</v><v>49</v><v>50</v><v>53</v><v>17</v><v>16</v></f>\n <f><v>11</v><v>17</v><v>53</v></f>\n <f><v>52</v><v>41</v><v>40</v></f>\n <f><v>32</v><v>31</v><v>54</v><v>55</v><v>42</v><v>41</v><v>52</v><v>51</v><v>39</v><v>38</v></f>\n <f><v>37</v><v>39</v><v>51</v></f>\n <f><v>55</v><v>43</v><v>42</v></f>\n <f><v>26</v><v>25</v><v>56</v><v>57</v><v>44</v><v>43</v><v>55</v><v>54</v><v>36</v><v>35</v></f>\n <f><v>31</v><v>36</v><v>54</v></f>\n <f><v>57</v><v>45</v><v>44</v></f>\n <f><v>20</v><v>19</v><v>58</v><v>59</v><v>46</v><v>45</v><v>57</v><v>56</v><v>30</v><v>29</v></f>\n <f><v>25</v><v>30</v><v>56</v></f>\n <f><v>59</v><v>47</v><v>46</v></f>\n <f><v>24</v><v>58</v><v>19</v></f>\n <f><v>60</v><v>61</v><v>62</v><v>63</v><v>64</v></f>\n <f><v>61</v><v>60</v><v>47</v><v>59</v></f>\n <f><v>61</v><v>59</v><v>58</v></f>\n <f><v>62</v><v>61</v><v>58</v><v>24</v></f>\n <f><v>62</v><v>24</v><v>23</v></f>\n <f><v>63</v><v>62</v><v>23</v><v>12</v></f>\n <f><v>63</v><v>12</v><v>11</v></f>\n <f><v>64</v><v>63</v><v>11</v><v>53</v></f>\n <f><v>50</v><v>64</v><v>53</v></f>\n <f><v>60</v><v>64</v><v>50</v><v>48</v></f>\n <f><v>60</v><v>48</v><v>47</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/augmented_truncated_tetrahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.636575398709\" y=\"-0.619045403768\" z=\"-0.124403048434\"/>\n <p x=\"0.215319532818\" y=\"-0.764799906206\" z=\"0.415499904793\"/>\n <p x=\"-0.343903027431\" y=\"-0.651243281971\" z=\"0.00982626794549\"/>\n <p x=\"0.0773528384604\" y=\"-0.505488779534\" z=\"-0.530076685281\"/>\n <p x=\"0.569794549236\" y=\"-0.0118667537947\" z=\"-0.466558690784\"/>\n <p x=\"-0.598559728791\" y=\"-0.324561148345\" z=\"-0.554642355145\"/>\n <p x=\"-0.782030585266\" y=\"0.349988508583\" z=\"-0.515690030511\"/>\n <p x=\"-0.28958887449\" y=\"0.843610534322\" z=\"-0.452172036014\"/>\n <p x=\"0.386323692761\" y=\"0.662682903133\" z=\"-0.42760636615\"/>\n <p x=\"0.640980394121\" y=\"0.336000769507\" z=\"0.13686225694\"/>\n <p x=\"0.707761243594\" y=\"-0.271177880467\" z=\"0.47901789929\"/>\n <p x=\"0.219724528229\" y=\"0.190246267069\" z=\"0.676765210166\"/>\n <p x=\"-0.710844740382\" y=\"0.697856031884\" z=\"0.0877309172125\"/>\n <p x=\"-0.456188039022\" y=\"0.371173898258\" z=\"0.652199540303\"/>\n <p x=\"-0.272717182547\" y=\"-0.30337575867\" z=\"0.613247215669\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>0</v><v>3</v><v>4</v></f>\n <f><v>4</v><v>3</v><v>5</v><v>6</v><v>7</v><v>8</v></f>\n <f><v>8</v><v>9</v><v>4</v></f>\n <f><v>9</v><v>10</v><v>0</v><v>4</v></f>\n <f><v>10</v><v>9</v><v>11</v></f>\n <f><v>9</v><v>8</v><v>7</v><v>12</v><v>13</v><v>11</v></f>\n <f><v>11</v><v>13</v><v>14</v></f>\n <f><v>6</v><v>12</v><v>7</v></f>\n <f><v>13</v><v>12</v><v>6</v><v>5</v><v>2</v><v>14</v></f>\n <f><v>2</v><v>5</v><v>3</v></f>\n <f><v>10</v><v>11</v><v>14</v><v>1</v></f>\n <f><v>14</v><v>2</v><v>1</v></f>\n <f><v>10</v><v>1</v><v>0</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/biaugmented_pentagonal_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.127818701078\" y=\"-0.520648509162\" z=\"0.500430564845\"/>\n <p x=\"-0.0602176188862\" y=\"0.161574976475\" z=\"0.743509973861\"/>\n <p x=\"-0.333218678802\" y=\"0.608225421861\" z=\"0.238475132809\"/>\n <p x=\"-0.569543694987\" y=\"0.202047092563\" z=\"-0.316732973481\"/>\n <p x=\"-0.442599527465\" y=\"-0.495635365823\" z=\"-0.154835612945\"/>\n <p x=\"0.212401292612\" y=\"-0.449059988633\" z=\"-0.467711066908\"/>\n <p x=\"0.0854571250907\" y=\"0.248622469752\" z=\"-0.629608427444\"/>\n <p x=\"0.321782141276\" y=\"0.65480079905\" z=\"-0.0744003211544\"/>\n <p x=\"0.594783201192\" y=\"0.208150353664\" z=\"0.430634519898\"/>\n <p x=\"0.527182118999\" y=\"-0.474073131972\" z=\"0.187555110882\"/>\n <p x=\"-0.272559629047\" y=\"0.853827453552\" z=\"-0.443497382376\"/>\n <p x=\"0.064351971097\" y=\"-0.997831571328\" z=\"-0.0138195179872\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>1</v><v>0</v><v>9</v><v>8</v></f>\n <f><v>2</v><v>1</v><v>8</v><v>7</v></f>\n <f><v>4</v><v>3</v><v>6</v><v>5</v></f>\n <f><v>2</v><v>10</v><v>3</v></f>\n <f><v>2</v><v>7</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>6</v></f>\n <f><v>6</v><v>10</v><v>7</v></f>\n <f><v>4</v><v>11</v><v>0</v></f>\n <f><v>4</v><v>5</v><v>11</v></f>\n <f><v>0</v><v>11</v><v>9</v></f>\n <f><v>9</v><v>11</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/biaugmented_triangular_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.764718676045\" y=\"-0.388566577136\" z=\"0.153855275416\"/>\n <p x=\"0.208885383094\" y=\"-0.802978322367\" z=\"0.266538542563\"/>\n <p x=\"0.557629378894\" y=\"0.122881129093\" z=\"0.658331062642\"/>\n <p x=\"-0.415974680245\" y=\"0.537292874323\" z=\"0.545647795495\"/>\n <p x=\"-0.0608701560516\" y=\"-0.317312409335\" z=\"-0.641040681126\"/>\n <p x=\"-0.74602184858\" y=\"0.477445397764\" z=\"-0.464216860524\"/>\n <p x=\"0.287873839748\" y=\"0.608547042124\" z=\"-0.249248161047\"/>\n <p x=\"0.933196759186\" y=\"-0.237309134466\" z=\"-0.26986697342\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>4</v><v>0</v><v>5</v></f>\n <f><v>5</v><v>0</v><v>3</v></f>\n <f><v>5</v><v>3</v><v>6</v></f>\n <f><v>1</v><v>0</v><v>4</v></f>\n <f><v>3</v><v>2</v><v>6</v></f>\n <f><v>1</v><v>4</v><v>7</v></f>\n <f><v>1</v><v>7</v><v>2</v></f>\n <f><v>2</v><v>7</v><v>6</v></f>\n <f><v>7</v><v>4</v><v>6</v></f>\n <f><v>5</v><v>6</v><v>4</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/biaugmented_truncated_cube.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.60028472212\" y=\"0.733146122614\" z=\"-0.319616982159\"/>\n <p x=\"0.339843983648\" y=\"0.609820016407\" z=\"-0.715978780668\"/>\n <p x=\"-0.0495362759688\" y=\"0.844560511102\" z=\"-0.533163858913\"/>\n <p x=\"0.210904462503\" y=\"0.967886617309\" z=\"-0.136802060404\"/>\n <p x=\"0.773895439684\" y=\"0.275758640138\" z=\"-0.291378857812\"/>\n <p x=\"0.513454701212\" y=\"0.152432533931\" z=\"-0.687740656321\"/>\n <p x=\"0.0539618669058\" y=\"0.231214403552\" z=\"-0.838741100975\"/>\n <p x=\"-0.335418392711\" y=\"0.465954898247\" z=\"-0.65592617922\"/>\n <p x=\"-0.426592402476\" y=\"0.719146219861\" z=\"-0.246386392815\"/>\n <p x=\"-0.166151664004\" y=\"0.842472326068\" z=\"0.149975405694\"/>\n <p x=\"0.293341170302\" y=\"0.763690456447\" z=\"0.300975850347\"/>\n <p x=\"0.682721429919\" y=\"0.528949961752\" z=\"0.118160928592\"/>\n <p x=\"0.0495362759688\" y=\"-0.844560511102\" z=\"0.533163858913\"/>\n <p x=\"-0.339843983648\" y=\"-0.609820016407\" z=\"0.715978780668\"/>\n <p x=\"-0.60028472212\" y=\"-0.733146122614\" z=\"0.319616982159\"/>\n <p x=\"-0.210904462503\" y=\"-0.967886617309\" z=\"0.136802060404\"/>\n <p x=\"0.335418392711\" y=\"-0.465954898247\" z=\"0.65592617922\"/>\n <p x=\"-0.0539618669058\" y=\"-0.231214403552\" z=\"0.838741100975\"/>\n <p x=\"-0.513454701212\" y=\"-0.152432533931\" z=\"0.687740656321\"/>\n <p x=\"-0.773895439684\" y=\"-0.275758640138\" z=\"0.291378857812\"/>\n <p x=\"-0.682721429919\" y=\"-0.528949961752\" z=\"-0.118160928592\"/>\n <p x=\"-0.293341170302\" y=\"-0.763690456447\" z=\"-0.300975850347\"/>\n <p x=\"0.166151664004\" y=\"-0.842472326068\" z=\"-0.149975405694\"/>\n <p x=\"0.426592402476\" y=\"-0.719146219861\" z=\"0.246386392815\"/>\n <p x=\"-0.59278486752\" y=\"0.606778633453\" z=\"0.200709762539\"/>\n <p x=\"-0.736642495785\" y=\"0.194675547171\" z=\"0.423459422722\"/>\n <p x=\"0.37267133661\" y=\"0.00447928906231\" z=\"0.788006744129\"/>\n <p x=\"0.516528964875\" y=\"0.416582375345\" z=\"0.565257083946\"/>\n <p x=\"0.59278486752\" y=\"-0.606778633453\" z=\"-0.200709762539\"/>\n <p x=\"0.736642495785\" y=\"-0.194675547171\" z=\"-0.423459422722\"/>\n <p x=\"-0.516528964875\" y=\"-0.416582375345\" z=\"-0.565257083946\"/>\n <p x=\"-0.37267133661\" y=\"-0.00447928906231\" z=\"-0.788006744129\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>1</v><v>0</v><v>4</v><v>5</v></f>\n <f><v>1</v><v>5</v><v>6</v></f>\n <f><v>2</v><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>7</v><v>8</v></f>\n <f><v>3</v><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>9</v><v>10</v></f>\n <f><v>0</v><v>3</v><v>10</v><v>11</v></f>\n <f><v>0</v><v>11</v><v>4</v></f>\n <f><v>12</v><v>13</v><v>14</v><v>15</v></f>\n <f><v>13</v><v>12</v><v>16</v><v>17</v></f>\n <f><v>13</v><v>17</v><v>18</v></f>\n <f><v>14</v><v>13</v><v>18</v><v>19</v></f>\n <f><v>14</v><v>19</v><v>20</v></f>\n <f><v>15</v><v>14</v><v>20</v><v>21</v></f>\n <f><v>15</v><v>21</v><v>22</v></f>\n <f><v>12</v><v>15</v><v>22</v><v>23</v></f>\n <f><v>12</v><v>23</v><v>16</v></f>\n <f><v>9</v><v>24</v><v>25</v><v>18</v><v>17</v><v>26</v><v>27</v><v>10</v></f>\n <f><v>11</v><v>27</v><v>26</v><v>16</v><v>23</v><v>28</v><v>29</v><v>4</v></f>\n <f><v>5</v><v>29</v><v>28</v><v>22</v><v>21</v><v>30</v><v>31</v><v>6</v></f>\n <f><v>7</v><v>31</v><v>30</v><v>20</v><v>19</v><v>25</v><v>24</v><v>8</v></f>\n <f><v>8</v><v>24</v><v>9</v></f>\n <f><v>19</v><v>18</v><v>25</v></f>\n <f><v>6</v><v>31</v><v>7</v></f>\n <f><v>21</v><v>20</v><v>30</v></f>\n <f><v>4</v><v>29</v><v>5</v></f>\n <f><v>23</v><v>22</v><v>28</v></f>\n <f><v>10</v><v>27</v><v>11</v></f>\n <f><v>17</v><v>16</v><v>26</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/bigyrate_diminished_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.973878024592\" y=\"0.168801106069\" z=\"0.151880807893\"/>\n <p x=\"-0.837952002219\" y=\"0.074138927864\" z=\"0.540684622819\"/>\n <p x=\"-0.64777412953\" y=\"0.450705955427\" z=\"0.565881220474\"/>\n <p x=\"-0.783700151903\" y=\"0.545368133632\" z=\"0.177077405548\"/>\n <p x=\"-0.302998489525\" y=\"0.407059298052\" z=\"0.806359796235\"/>\n <p x=\"-0.320218026865\" y=\"0.71289661599\" z=\"0.515203067768\"/>\n <p x=\"0.118934192124\" y=\"0.431099701131\" z=\"0.806658490458\"/>\n <p x=\"0.101714654783\" y=\"0.736937019069\" z=\"0.515501761991\"/>\n <p x=\"-0.610712751444\" y=\"-0.202238951587\" z=\"0.765590844829\"/>\n <p x=\"-0.280093298197\" y=\"0.00351715273703\" z=\"0.929787131967\"/>\n <p x=\"0.45685997199\" y=\"0.513644547789\" z=\"0.566663212102\"/>\n <p x=\"0.581702687839\" y=\"0.6231645122\" z=\"0.178044000359\"/>\n <p x=\"0.226557370633\" y=\"0.84645698348\" z=\"0.126882550248\"/>\n <p x=\"0.141839383451\" y=\"0.0275575558154\" z=\"0.93008582619\"/>\n <p x=\"-0.0483384892383\" y=\"-0.349009471747\" z=\"0.904889228535\"/>\n <p x=\"0.303743477387\" y=\"-0.515867386787\" z=\"0.741176238802\"/>\n <p x=\"0.493921350076\" y=\"-0.139300359224\" z=\"0.766372836457\"/>\n <p x=\"0.688614780949\" y=\"0.161117923305\" z=\"0.54176530867\"/>\n <p x=\"0.641669257253\" y=\"-0.433322540128\" z=\"0.501180960445\"/>\n <p x=\"0.836362688126\" y=\"-0.132904257599\" z=\"0.276573432659\"/>\n <p x=\"-0.456144049238\" y=\"0.807558794196\" z=\"0.126399252843\"/>\n <p x=\"-0.658857436053\" y=\"0.654888098043\" z=\"-0.211541806195\"/>\n <p x=\"-0.118218269372\" y=\"0.890103640854\" z=\"-0.113596025513\"/>\n <p x=\"-0.320931656187\" y=\"0.737432944702\" z=\"-0.451537084551\"/>\n <p x=\"0.101001025461\" y=\"0.76147334778\" z=\"-0.451238390328\"/>\n <p x=\"0.445776665466\" y=\"0.717826690406\" z=\"-0.210759814567\"/>\n <p x=\"0.593524572643\" y=\"0.423804509501\" z=\"-0.475951690578\"/>\n <p x=\"0.248748932638\" y=\"0.467451166876\" z=\"-0.71643026634\"/>\n <p x=\"0.813457496798\" y=\"0.270637887716\" z=\"0.153146096927\"/>\n <p x=\"0.820763823418\" y=\"0.147426630051\" z=\"-0.251045468568\"/>\n <p x=\"0.843669014745\" y=\"-0.256115515264\" z=\"-0.127618132836\"/>\n <p x=\"-0.433952487233\" y=\"0.428552977592\" z=\"-0.716913563745\"/>\n <p x=\"-0.771878267099\" y=\"0.346008130933\" z=\"-0.476918285388\"/>\n <p x=\"-0.624130359922\" y=\"0.051985950029\" z=\"-0.7421101614\"/>\n <p x=\"-0.0818705206083\" y=\"0.261695062552\" z=\"-0.880626553478\"/>\n <p x=\"-0.272048393297\" y=\"-0.11487196501\" z=\"-0.905823151133\"/>\n <p x=\"0.293829128989\" y=\"0.0701185932343\" z=\"-0.853177550998\"/>\n <p x=\"0.1036512563\" y=\"-0.306448434328\" z=\"-0.878374148653\"/>\n <p x=\"0.638604768995\" y=\"0.02647193586\" z=\"-0.612698975237\"/>\n <p x=\"0.661509960322\" y=\"-0.377070209455\" z=\"-0.489271639505\"/>\n <p x=\"0.330890507076\" y=\"-0.582826313779\" z=\"-0.653467926644\"/>\n <p x=\"0.653491142056\" y=\"-0.632682542827\" z=\"-0.152814730491\"/>\n <p x=\"0.32287168881\" y=\"-0.838438647151\" z=\"-0.31701101763\"/>\n <p x=\"-0.818823790795\" y=\"-0.2484323325\" z=\"-0.517502633613\"/>\n <p x=\"-0.966571697972\" y=\"0.0455898484043\" z=\"-0.252310757601\"/>\n <p x=\"-0.587068981836\" y=\"-0.600958956984\" z=\"-0.542400537045\"/>\n <p x=\"-0.359829731061\" y=\"-0.877336836435\" z=\"-0.317494315035\"/>\n <p x=\"-0.223903708688\" y=\"-0.97199901464\" z=\"0.0713094998905\"/>\n <p x=\"-0.231210035307\" y=\"-0.848787756975\" z=\"0.475501065385\"/>\n <p x=\"-0.378957942484\" y=\"-0.554765576071\" z=\"0.740692941397\"/>\n <p x=\"-0.24914320197\" y=\"-0.518414110326\" z=\"-0.782395815401\"/>\n <p x=\"-0.0219039511949\" y=\"-0.794791989776\" z=\"-0.557489593391\"/>\n <p x=\"0.198028972961\" y=\"-0.947958611562\" z=\"0.0716081941135\"/>\n <p x=\"0.528648426207\" y=\"-0.742202507238\" z=\"0.235804481252\"/>\n <p x=\"0.190722646341\" y=\"-0.824747353897\" z=\"0.475799759608\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>2</v><v>4</v><v>5</v></f>\n <f><v>4</v><v>6</v><v>7</v><v>5</v></f>\n <f><v>1</v><v>8</v><v>9</v><v>4</v><v>2</v></f>\n <f><v>6</v><v>10</v><v>7</v></f>\n <f><v>7</v><v>10</v><v>11</v><v>12</v></f>\n <f><v>9</v><v>13</v><v>6</v><v>4</v></f>\n <f><v>9</v><v>14</v><v>13</v></f>\n <f><v>14</v><v>15</v><v>16</v><v>13</v></f>\n <f><v>13</v><v>16</v><v>17</v><v>10</v><v>6</v></f>\n <f><v>15</v><v>18</v><v>16</v></f>\n <f><v>16</v><v>18</v><v>19</v><v>17</v></f>\n <f><v>2</v><v>5</v><v>20</v><v>3</v></f>\n <f><v>3</v><v>20</v><v>21</v></f>\n <f><v>20</v><v>22</v><v>23</v><v>21</v></f>\n <f><v>5</v><v>7</v><v>12</v><v>22</v><v>20</v></f>\n <f><v>22</v><v>24</v><v>23</v></f>\n <f><v>24</v><v>25</v><v>26</v><v>27</v></f>\n <f><v>12</v><v>25</v><v>24</v><v>22</v></f>\n <f><v>12</v><v>11</v><v>25</v></f>\n <f><v>10</v><v>17</v><v>28</v><v>11</v></f>\n <f><v>11</v><v>28</v><v>29</v><v>26</v><v>25</v></f>\n <f><v>17</v><v>19</v><v>28</v></f>\n <f><v>28</v><v>19</v><v>30</v><v>29</v></f>\n <f><v>21</v><v>23</v><v>31</v><v>32</v></f>\n <f><v>32</v><v>31</v><v>33</v></f>\n <f><v>31</v><v>34</v><v>35</v><v>33</v></f>\n <f><v>23</v><v>24</v><v>27</v><v>34</v><v>31</v></f>\n <f><v>27</v><v>36</v><v>34</v></f>\n <f><v>34</v><v>36</v><v>37</v><v>35</v></f>\n <f><v>26</v><v>38</v><v>36</v><v>27</v></f>\n <f><v>26</v><v>29</v><v>38</v></f>\n <f><v>29</v><v>30</v><v>39</v><v>38</v></f>\n <f><v>38</v><v>39</v><v>40</v><v>37</v><v>36</v></f>\n <f><v>30</v><v>41</v><v>39</v></f>\n <f><v>39</v><v>41</v><v>42</v><v>40</v></f>\n <f><v>32</v><v>33</v><v>43</v><v>44</v></f>\n <f><v>44</v><v>43</v><v>45</v><v>46</v><v>47</v><v>48</v><v>49</v><v>8</v><v>1</v><v>0</v></f>\n <f><v>33</v><v>35</v><v>50</v><v>45</v><v>43</v></f>\n <f><v>50</v><v>51</v><v>46</v><v>45</v></f>\n <f><v>35</v><v>37</v><v>50</v></f>\n <f><v>37</v><v>40</v><v>51</v><v>50</v></f>\n <f><v>51</v><v>42</v><v>52</v><v>47</v><v>46</v></f>\n <f><v>40</v><v>42</v><v>51</v></f>\n <f><v>42</v><v>41</v><v>53</v><v>52</v></f>\n <f><v>8</v><v>49</v><v>14</v><v>9</v></f>\n <f><v>47</v><v>52</v><v>54</v><v>48</v></f>\n <f><v>48</v><v>54</v><v>15</v><v>14</v><v>49</v></f>\n <f><v>52</v><v>53</v><v>54</v></f>\n <f><v>54</v><v>53</v><v>18</v><v>15</v></f>\n <f><v>0</v><v>3</v><v>21</v><v>32</v><v>44</v></f>\n <f><v>53</v><v>41</v><v>30</v><v>19</v><v>18</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/bilunabirotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.7628543936\" y=\"0.0585043942554\" z=\"-0.0510739874145\"/>\n <p x=\"0.395419568615\" y=\"-0.031285906666\" z=\"-0.656233537069\"/>\n <p x=\"0.0251596799606\" y=\"0.56330635711\" z=\"-0.519645162741\"/>\n <p x=\"0.392594504946\" y=\"0.653096658031\" z=\"0.0855143869143\"/>\n <p x=\"0.728185153457\" y=\"-0.586181492693\" z=\"-0.355157660516\"/>\n <p x=\"-0.297260591827\" y=\"-0.072640922222\" z=\"-0.489584072271\"/>\n <p x=\"-0.241167339125\" y=\"0.970480491557\" z=\"0.00243516865725\"/>\n <p x=\"0.297261486101\" y=\"0.0726419817129\" z=\"0.489583774961\"/>\n <p x=\"-0.0251593327561\" y=\"-0.563305275232\" z=\"0.519643285005\"/>\n <p x=\"0.241164733425\" y=\"-0.970479687615\" z=\"-0.00243292769786\"/>\n <p x=\"-0.392594962283\" y=\"-0.65309413714\" z=\"-0.085513668824\"/>\n <p x=\"-0.76285273341\" y=\"-0.0585044228748\" z=\"0.0510738857412\"/>\n <p x=\"-0.7281859194\" y=\"0.586178735901\" z=\"0.355158562206\"/>\n <p x=\"-0.395418641305\" y=\"0.0312832258754\" z=\"0.656231953049\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>1</v><v>0</v><v>4</v></f>\n <f><v>2</v><v>1</v><v>5</v></f>\n <f><v>3</v><v>2</v><v>6</v></f>\n <f><v>0</v><v>3</v><v>7</v></f>\n <f><v>4</v><v>0</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>1</v><v>4</v><v>9</v><v>10</v><v>5</v></f>\n <f><v>6</v><v>2</v><v>5</v><v>11</v><v>12</v></f>\n <f><v>3</v><v>6</v><v>12</v><v>13</v><v>7</v></f>\n <f><v>10</v><v>9</v><v>8</v></f>\n <f><v>5</v><v>10</v><v>11</v></f>\n <f><v>13</v><v>12</v><v>11</v></f>\n <f><v>7</v><v>13</v><v>8</v></f>\n <f><v>8</v><v>13</v><v>11</v><v>10</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/cube.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.57735026919\" y=\"-0.57735026919\" z=\"0.57735026919\"/>\n <p x=\"-0.57735026919\" y=\"-0.57735026919\" z=\"-0.57735026919\"/>\n <p x=\"0.57735026919\" y=\"-0.57735026919\" z=\"-0.57735026919\"/>\n <p x=\"0.57735026919\" y=\"-0.57735026919\" z=\"0.57735026919\"/>\n <p x=\"-0.57735026919\" y=\"0.57735026919\" z=\"0.57735026919\"/>\n <p x=\"0.57735026919\" y=\"0.57735026919\" z=\"0.57735026919\"/>\n <p x=\"-0.57735026919\" y=\"0.57735026919\" z=\"-0.57735026919\"/>\n <p x=\"0.57735026919\" y=\"0.57735026919\" z=\"-0.57735026919\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>4</v><v>0</v><v>3</v><v>5</v></f>\n <f><v>4</v><v>6</v><v>1</v><v>0</v></f>\n <f><v>1</v><v>6</v><v>7</v><v>2</v></f>\n <f><v>3</v><v>2</v><v>7</v><v>5</v></f>\n <f><v>5</v><v>7</v><v>6</v><v>4</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/decagonal_antiprism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"1.37907276755E-14\" y=\"-0.966276145109\" z=\"-0.25750808025\"/>\n <p x=\"-0.567962867737\" y=\"-0.781733822652\" z=\"-0.25750808025\"/>\n <p x=\"-0.918983224346\" y=\"-0.298595750098\" z=\"-0.25750808025\"/>\n <p x=\"-0.918983224346\" y=\"0.298595750098\" z=\"-0.25750808025\"/>\n <p x=\"-0.567962867736\" y=\"0.781733822652\" z=\"-0.25750808025\"/>\n <p x=\"-8.06227156411E-14\" y=\"0.966276145108\" z=\"-0.25750808025\"/>\n <p x=\"0.567962867736\" y=\"0.781733822651\" z=\"-0.25750808025\"/>\n <p x=\"0.918983224345\" y=\"0.298595750098\" z=\"-0.25750808025\"/>\n <p x=\"0.918983224346\" y=\"-0.298595750097\" z=\"-0.25750808025\"/>\n <p x=\"0.567962867736\" y=\"-0.781733822652\" z=\"-0.25750808025\"/>\n <p x=\"-0.298595750098\" y=\"-0.918983224346\" z=\"0.25750808025\"/>\n <p x=\"0.298595750098\" y=\"-0.918983224346\" z=\"0.25750808025\"/>\n <p x=\"0.781733822651\" y=\"-0.567962867737\" z=\"0.25750808025\"/>\n <p x=\"0.966276145109\" y=\"-1.75036158958E-13\" z=\"0.25750808025\"/>\n <p x=\"0.781733822651\" y=\"0.567962867737\" z=\"0.25750808025\"/>\n <p x=\"0.298595750098\" y=\"0.918983224346\" z=\"0.25750808025\"/>\n <p x=\"-0.298595750097\" y=\"0.918983224346\" z=\"0.25750808025\"/>\n <p x=\"-0.781733822651\" y=\"0.567962867737\" z=\"0.25750808025\"/>\n <p x=\"-0.966276145109\" y=\"-1.75831777862E-13\" z=\"0.25750808025\"/>\n <p x=\"-0.781733822651\" y=\"-0.567962867737\" z=\"0.25750808025\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>11</v><v>12</v><v>13</v><v>14</v><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>15</v><v>5</v><v>16</v></f>\n <f><v>16</v><v>5</v><v>4</v></f>\n <f><v>16</v><v>4</v><v>17</v></f>\n <f><v>17</v><v>4</v><v>3</v></f>\n <f><v>17</v><v>3</v><v>18</v></f>\n <f><v>18</v><v>3</v><v>2</v></f>\n <f><v>18</v><v>2</v><v>19</v></f>\n <f><v>19</v><v>2</v><v>1</v></f>\n <f><v>19</v><v>1</v><v>10</v></f>\n <f><v>10</v><v>1</v><v>0</v></f>\n <f><v>10</v><v>0</v><v>11</v></f>\n <f><v>11</v><v>0</v><v>9</v></f>\n <f><v>11</v><v>9</v><v>12</v></f>\n <f><v>12</v><v>9</v><v>8</v></f>\n <f><v>12</v><v>8</v><v>13</v></f>\n <f><v>13</v><v>8</v><v>7</v></f>\n <f><v>13</v><v>7</v><v>14</v></f>\n <f><v>14</v><v>7</v><v>6</v></f>\n <f><v>14</v><v>6</v><v>15</v></f>\n <f><v>15</v><v>6</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/decagonal_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.412394421904\" y=\"-0.908660854565\" z=\"-0.0653168597062\"/>\n <p x=\"-0.0653168597062\" y=\"-0.908660854565\" z=\"-0.412394421904\"/>\n <p x=\"-0.451793404932\" y=\"-0.561583292368\" z=\"-0.693186068087\"/>\n <p x=\"-0.599414309355\" y=\"3.93865559619E-13\" z=\"-0.800438933173\"/>\n <p x=\"-0.451793404932\" y=\"0.561583292367\" z=\"-0.693186068087\"/>\n <p x=\"-0.0653168597062\" y=\"0.908660854566\" z=\"-0.412394421904\"/>\n <p x=\"0.412394421904\" y=\"0.908660854566\" z=\"-0.0653168597062\"/>\n <p x=\"0.79887096713\" y=\"0.561583292367\" z=\"0.215474786477\"/>\n <p x=\"0.946491871553\" y=\"3.93603332216E-13\" z=\"0.322727651563\"/>\n <p x=\"0.79887096713\" y=\"-0.561583292368\" z=\"0.215474786477\"/>\n <p x=\"-0.412394421904\" y=\"-0.908660854565\" z=\"0.0653168597062\"/>\n <p x=\"0.0653168597062\" y=\"-0.908660854565\" z=\"0.412394421904\"/>\n <p x=\"0.451793404932\" y=\"-0.561583292368\" z=\"0.693186068087\"/>\n <p x=\"0.599414309355\" y=\"3.93603332216E-13\" z=\"0.800438933173\"/>\n <p x=\"0.451793404932\" y=\"0.561583292367\" z=\"0.693186068087\"/>\n <p x=\"0.0653168597062\" y=\"0.908660854566\" z=\"0.412394421904\"/>\n <p x=\"-0.412394421904\" y=\"0.908660854566\" z=\"0.0653168597062\"/>\n <p x=\"-0.79887096713\" y=\"0.561583292367\" z=\"-0.215474786477\"/>\n <p x=\"-0.946491871553\" y=\"3.93865559619E-13\" z=\"-0.322727651563\"/>\n <p x=\"-0.79887096713\" y=\"-0.561583292368\" z=\"-0.215474786477\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>11</v><v>12</v><v>13</v><v>14</v><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>16</v><v>5</v><v>4</v><v>17</v></f>\n <f><v>17</v><v>4</v><v>3</v><v>18</v></f>\n <f><v>18</v><v>3</v><v>2</v><v>19</v></f>\n <f><v>19</v><v>2</v><v>1</v><v>10</v></f>\n <f><v>10</v><v>1</v><v>0</v><v>11</v></f>\n <f><v>11</v><v>0</v><v>9</v><v>12</v></f>\n <f><v>12</v><v>9</v><v>8</v><v>13</v></f>\n <f><v>13</v><v>8</v><v>7</v><v>14</v></f>\n <f><v>14</v><v>7</v><v>6</v><v>15</v></f>\n <f><v>15</v><v>6</v><v>5</v><v>16</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/diminished_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.106400676385\" y=\"0.286315418061\" z=\"-0.952209208864\"/>\n <p x=\"-0.278211236851\" y=\"0.111171330498\" z=\"-0.954064695377\"/>\n <p x=\"-0.431676966668\" y=\"0.445982446686\" z=\"-0.746808804532\"/>\n <p x=\"-0.0470650534319\" y=\"0.621126534249\" z=\"-0.744953318019\"/>\n <p x=\"-0.337439396245\" y=\"0.745928073888\" z=\"-0.464395775291\"/>\n <p x=\"-0.748046792983\" y=\"0.313104463482\" z=\"-0.500113055444\"/>\n <p x=\"-0.65380922256\" y=\"0.613050090683\" z=\"-0.217700026203\"/>\n <p x=\"-0.499734026031\" y=\"-0.228631302322\" z=\"-0.8354601312\"/>\n <p x=\"-0.790108368844\" y=\"-0.103829762683\" z=\"-0.554902588473\"/>\n <p x=\"-0.87533201174\" y=\"0.273247457863\" z=\"-0.0990954620265\"/>\n <p x=\"-0.764913995639\" y=\"0.341635451286\" z=\"0.303068885122\"/>\n <p x=\"-0.543391206459\" y=\"0.681438084106\" z=\"0.184464320945\"/>\n <p x=\"-0.917393587601\" y=\"-0.143686768302\" z=\"-0.153884995055\"/>\n <p x=\"-0.763927857785\" y=\"-0.47849788449\" z=\"-0.361140885901\"/>\n <p x=\"-0.679505325186\" y=\"-0.66778941391\" z=\"0.00716166760796\"/>\n <p x=\"-0.832971055003\" y=\"-0.332978297722\" z=\"0.214417558453\"/>\n <p x=\"-0.73873348458\" y=\"-0.0330326705205\" z=\"0.496830587694\"/>\n <p x=\"-0.569087309086\" y=\"-0.599401420486\" z=\"0.409326014756\"/>\n <p x=\"-0.474849738663\" y=\"-0.299455793285\" z=\"0.691739043997\"/>\n <p x=\"-0.0314940744662\" y=\"0.896439177288\" z=\"-0.214697785959\"/>\n <p x=\"0.258880268346\" y=\"0.77163763765\" z=\"-0.495255328687\"/>\n <p x=\"0.369298284447\" y=\"0.840025631073\" z=\"-0.0930909815387\"/>\n <p x=\"-0.158779293223\" y=\"0.856582171669\" z=\"0.186319807458\"/>\n <p x=\"0.24201306569\" y=\"0.800168625454\" z=\"0.307926611879\"/>\n <p x=\"-0.0743567606251\" y=\"0.66729064225\" z=\"0.554622360967\"/>\n <p x=\"0.189526985292\" y=\"0.400867519485\" z=\"0.74953081727\"/>\n <p x=\"0.505896811607\" y=\"0.53374550269\" z=\"0.502835068182\"/>\n <p x=\"-0.458968673861\" y=\"0.492146554687\" z=\"0.552766874454\"/>\n <p x=\"-0.432788162801\" y=\"0.11747843288\" z=\"0.746528577026\"/>\n <p x=\"-0.0319958038881\" y=\"0.0610648866651\" z=\"0.868135381446\"/>\n <p x=\"-0.0740573797493\" y=\"-0.3558693395\" z=\"0.813345848418\"/>\n <p x=\"0.711848621822\" y=\"0.598235492471\" z=\"-0.146025028054\"/>\n <p x=\"0.601430605721\" y=\"0.529847499048\" z=\"-0.548189375203\"/>\n <p x=\"0.865314351638\" y=\"0.263424376283\" z=\"-0.3532809189\"/>\n <p x=\"0.79627115442\" y=\"0.408943963051\" z=\"0.222277525454\"/>\n <p x=\"0.949736884236\" y=\"0.0741328468635\" z=\"0.0150216346089\"/>\n <p x=\"0.822451665479\" y=\"0.0342758412446\" z=\"0.416039228026\"/>\n <p x=\"0.780390089618\" y=\"-0.38265838492\" z=\"0.361249694997\"/>\n <p x=\"0.907675308375\" y=\"-0.342801379302\" z=\"-0.03976789842\"/>\n <p x=\"0.532077322667\" y=\"0.159077380883\" z=\"0.696596770754\"/>\n <p x=\"0.310554533486\" y=\"-0.180725251937\" z=\"0.815201334931\"/>\n <p x=\"0.464020263303\" y=\"-0.515536368125\" z=\"0.607945444085\"/>\n <p x=\"0.0794083500673\" y=\"-0.690680455688\" z=\"0.606089957572\"/>\n <p x=\"0.771076781215\" y=\"-0.0365212509182\" z=\"-0.63569394814\"/>\n <p x=\"0.507193035298\" y=\"0.229901871846\" z=\"-0.830602404443\"/>\n <p x=\"0.797257292275\" y=\"-0.411189372725\" z=\"-0.441932245568\"/>\n <p x=\"0.575734503094\" y=\"-0.750992005545\" z=\"-0.323327681391\"/>\n <p x=\"0.191122589859\" y=\"-0.926136093108\" z=\"-0.325183167905\"/>\n <p x=\"-0.209669769055\" y=\"-0.869722546893\" z=\"-0.446789972325\"/>\n <p x=\"-0.473553514972\" y=\"-0.603299424129\" z=\"-0.641698428628\"/>\n <p x=\"0.686152519195\" y=\"-0.682604012122\" z=\"0.0788366657568\"/>\n <p x=\"0.36978269288\" y=\"-0.815481995326\" z=\"0.325532414845\"/>\n <p x=\"0.0638373711015\" y=\"-0.965993098727\" z=\"0.0758344255129\"/>\n <p x=\"-0.226536971711\" y=\"-0.841191559088\" z=\"0.35639196824\"/>\n <p x=\"-0.336954987812\" y=\"-0.909579552512\" z=\"-0.0457723789078\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>5</v><v>6</v><v>4</v></f>\n <f><v>1</v><v>7</v><v>8</v><v>5</v><v>2</v></f>\n <f><v>5</v><v>9</v><v>6</v></f>\n <f><v>6</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>8</v><v>12</v><v>9</v><v>5</v></f>\n <f><v>8</v><v>13</v><v>12</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>12</v></f>\n <f><v>12</v><v>15</v><v>16</v><v>10</v><v>9</v></f>\n <f><v>14</v><v>17</v><v>15</v></f>\n <f><v>15</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>3</v><v>4</v><v>19</v><v>20</v></f>\n <f><v>20</v><v>19</v><v>21</v></f>\n <f><v>19</v><v>22</v><v>23</v><v>21</v></f>\n <f><v>4</v><v>6</v><v>11</v><v>22</v><v>19</v></f>\n <f><v>22</v><v>24</v><v>23</v></f>\n <f><v>23</v><v>24</v><v>25</v><v>26</v></f>\n <f><v>11</v><v>27</v><v>24</v><v>22</v></f>\n <f><v>11</v><v>10</v><v>27</v></f>\n <f><v>10</v><v>16</v><v>28</v><v>27</v></f>\n <f><v>27</v><v>28</v><v>29</v><v>25</v><v>24</v></f>\n <f><v>16</v><v>18</v><v>28</v></f>\n <f><v>28</v><v>18</v><v>30</v><v>29</v></f>\n <f><v>20</v><v>21</v><v>31</v><v>32</v></f>\n <f><v>32</v><v>31</v><v>33</v></f>\n <f><v>31</v><v>34</v><v>35</v><v>33</v></f>\n <f><v>21</v><v>23</v><v>26</v><v>34</v><v>31</v></f>\n <f><v>34</v><v>36</v><v>35</v></f>\n <f><v>35</v><v>36</v><v>37</v><v>38</v></f>\n <f><v>26</v><v>39</v><v>36</v><v>34</v></f>\n <f><v>26</v><v>25</v><v>39</v></f>\n <f><v>25</v><v>29</v><v>40</v><v>39</v></f>\n <f><v>39</v><v>40</v><v>41</v><v>37</v><v>36</v></f>\n <f><v>29</v><v>30</v><v>40</v></f>\n <f><v>40</v><v>30</v><v>42</v><v>41</v></f>\n <f><v>32</v><v>33</v><v>43</v><v>44</v></f>\n <f><v>44</v><v>43</v><v>45</v><v>46</v><v>47</v><v>48</v><v>49</v><v>7</v><v>1</v><v>0</v></f>\n <f><v>33</v><v>35</v><v>38</v><v>45</v><v>43</v></f>\n <f><v>38</v><v>50</v><v>46</v><v>45</v></f>\n <f><v>38</v><v>37</v><v>50</v></f>\n <f><v>37</v><v>41</v><v>51</v><v>50</v></f>\n <f><v>50</v><v>51</v><v>52</v><v>47</v><v>46</v></f>\n <f><v>41</v><v>42</v><v>51</v></f>\n <f><v>51</v><v>42</v><v>53</v><v>52</v></f>\n <f><v>7</v><v>49</v><v>13</v><v>8</v></f>\n <f><v>47</v><v>52</v><v>54</v><v>48</v></f>\n <f><v>48</v><v>54</v><v>14</v><v>13</v><v>49</v></f>\n <f><v>52</v><v>53</v><v>54</v></f>\n <f><v>54</v><v>53</v><v>17</v><v>14</v></f>\n <f><v>0</v><v>3</v><v>20</v><v>32</v><v>44</v></f>\n <f><v>53</v><v>42</v><v>30</v><v>18</v><v>17</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/disphenocingulum.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.662763543189\" y=\"-0.739805720535\" z=\"-0.115887164442\"/>\n <p x=\"-0.0967272091827\" y=\"-0.817550423601\" z=\"0.196357427825\"/>\n <p x=\"0.00864636793411\" y=\"-0.743489683122\" z=\"-0.618370675736\"/>\n <p x=\"0.0935881724246\" y=\"-0.280676264187\" z=\"0.792945606903\"/>\n <p x=\"0.853077712239\" y=\"-0.202930846461\" z=\"0.480701709921\"/>\n <p x=\"0.437420591624\" y=\"0.466071278658\" z=\"0.725722622902\"/>\n <p x=\"0.541809304244\" y=\"-0.114490652076\" z=\"-0.640028401919\"/>\n <p x=\"0.732124170282\" y=\"0.422383827981\" z=\"-0.0434403469199\"/>\n <p x=\"0.245791619351\" y=\"0.654909001944\" z=\"-0.667767995819\"/>\n <p x=\"-0.255603350417\" y=\"0.0148503305526\" z=\"-0.806690835495\"/>\n <p x=\"-0.549830372219\" y=\"0.700488199725\" z=\"-0.45497565191\"/>\n <p x=\"-0.671787774412\" y=\"-0.443390153804\" z=\"-0.261549952707\"/>\n <p x=\"-0.966014796214\" y=\"0.242247715369\" z=\"0.0901652308791\"/>\n <p x=\"-0.691856970575\" y=\"-0.377490513818\" z=\"0.560414539535\"/>\n <p x=\"-0.379792716131\" y=\"0.380316709508\" z=\"0.653772384886\"/>\n <p x=\"0.0363917078636\" y=\"0.838557193865\" z=\"0.108631502097\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>3</v><v>1</v><v>0</v><v>4</v></f>\n <f><v>3</v><v>4</v><v>5</v></f>\n <f><v>6</v><v>0</v><v>2</v></f>\n <f><v>4</v><v>0</v><v>6</v><v>7</v></f>\n <f><v>4</v><v>7</v><v>5</v></f>\n <f><v>6</v><v>8</v><v>7</v></f>\n <f><v>6</v><v>2</v><v>9</v></f>\n <f><v>6</v><v>9</v><v>8</v></f>\n <f><v>8</v><v>9</v><v>10</v></f>\n <f><v>9</v><v>11</v><v>12</v><v>10</v></f>\n <f><v>2</v><v>1</v><v>11</v></f>\n <f><v>9</v><v>2</v><v>11</v></f>\n <f><v>11</v><v>1</v><v>13</v></f>\n <f><v>11</v><v>13</v><v>12</v></f>\n <f><v>10</v><v>12</v><v>14</v><v>15</v></f>\n <f><v>8</v><v>10</v><v>15</v></f>\n <f><v>8</v><v>15</v><v>7</v></f>\n <f><v>15</v><v>5</v><v>7</v></f>\n <f><v>15</v><v>14</v><v>5</v></f>\n <f><v>5</v><v>14</v><v>3</v></f>\n <f><v>3</v><v>13</v><v>1</v></f>\n <f><v>14</v><v>13</v><v>3</v></f>\n <f><v>12</v><v>13</v><v>14</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/dodecadodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.638733622744\" y=\"-0.707786636293\" z=\"0.301757247891\"/>\n <p x=\"-0.270977480342\" y=\"-0.794016851882\" z=\"0.245031562395\"/>\n <p x=\"-0.24109230376\" y=\"-0.965862664573\" z=\"-0.0947829850151\"/>\n <p x=\"-0.0436916847657\" y=\"-0.847310055972\" z=\"0.209973160724\"/>\n <p x=\"0.324064457637\" y=\"-0.933540271561\" z=\"0.153247475229\"/>\n <p x=\"0.0783086071727\" y=\"-0.774040514401\" z=\"0.398322817072\"/>\n <p x=\"0.275709226166\" y=\"-0.655487905802\" z=\"0.703078962809\"/>\n <p x=\"-0.0735768613483\" y=\"-0.675464243281\" z=\"0.549787708133\"/>\n <p x=\"-0.319332711812\" y=\"-0.515964486122\" z=\"0.794863049976\"/>\n <p x=\"-0.28944753523\" y=\"-0.687810298814\" z=\"0.455048502566\"/>\n <p x=\"-0.744045176128\" y=\"-0.45741253549\" z=\"0.0332049808724\"/>\n <p x=\"-0.376289033725\" y=\"-0.543642751079\" z=\"-0.023520704623\"/>\n <p x=\"-0.119118061567\" y=\"-0.76878176786\" z=\"-0.398393653706\"/>\n <p x=\"0.0782825574253\" y=\"-0.650229159261\" z=\"-0.0936375079653\"/>\n <p x=\"0.568038991766\" y=\"-0.66318983328\" z=\"0.0379864628834\"/>\n <p x=\"0.322283141304\" y=\"-0.503690076122\" z=\"0.283061804725\"/>\n <p x=\"0.367798291776\" y=\"-0.2865611964\" z=\"0.739282841528\"/>\n <p x=\"0.0185122042613\" y=\"-0.306537533879\" z=\"0.585991586851\"/>\n <p x=\"-0.443114320084\" y=\"-0.159383832252\" z=\"0.736327723126\"/>\n <p x=\"-0.413229143502\" y=\"-0.331229644944\" z=\"0.396513175718\"/>\n <p x=\"-0.714159999545\" y=\"-0.629258348179\" z=\"-0.306609566535\"/>\n <p x=\"-0.762515231016\" y=\"-0.351205982423\" z=\"0.243221921043\"/>\n <p x=\"-0.792400407598\" y=\"-0.179360169732\" z=\"0.583036468453\"/>\n <p x=\"-0.839016472111\" y=\"-0.1308270186\" z=\"0.207045099509\"/>\n <p x=\"-0.962798080381\" y=\"0.22575363527\" z=\"0.148509772661\"/>\n <p x=\"-0.8678267844\" y=\"-0.10083188162\" z=\"-0.0253303459755\"/>\n <p x=\"-0.91444284891\" y=\"-0.0522987304889\" z=\"-0.40132171492\"/>\n <p x=\"-0.809131295526\" y=\"-0.30267283129\" z=\"-0.1327694479\"/>\n <p x=\"-0.346403857144\" y=\"-0.715488563768\" z=\"-0.363335252033\"/>\n <p x=\"-0.519615561177\" y=\"0.0609951315698\" z=\"0.700150901593\"/>\n <p x=\"-0.56623162569\" y=\"0.109528282701\" z=\"0.324159532649\"/>\n <p x=\"-0.71882354625\" y=\"0.496104073552\" z=\"0.0332487603173\"/>\n <p x=\"-0.623852250268\" y=\"0.169518556661\" z=\"-0.140591358319\"/>\n <p x=\"-0.611772825906\" y=\"0.0162107581215\" z=\"-0.624021829186\"/>\n <p x=\"-0.506461272524\" y=\"-0.23416334268\" z=\"-0.355469562168\"/>\n <p x=\"0.248638080834\" y=\"-0.855011983449\" z=\"-0.455119339202\"/>\n <p x=\"-0.411489976543\" y=\"-0.560748859569\" z=\"-0.529309680803\"/>\n <p x=\"-0.516801529923\" y=\"-0.310374758767\" z=\"-0.797861947822\"/>\n <p x=\"-0.22442961495\" y=\"-0.518407667055\" z=\"-0.666945920722\"/>\n <p x=\"0.078240408054\" y=\"-0.449898178447\" z=\"-0.88964603499\"/>\n <p x=\"-0.0437338341419\" y=\"-0.646979075158\" z=\"-0.586035366301\"/>\n <p x=\"0.446038699829\" y=\"-0.736459374849\" z=\"-0.150363193462\"/>\n <p x=\"-0.424712464313\" y=\"0.0585519506362\" z=\"-0.761658069102\"/>\n <p x=\"-0.132340549337\" y=\"-0.149480957656\" z=\"-0.630742041999\"/>\n <p x=\"0.351025254474\" y=\"-0.209542877149\" z=\"-0.772531601847\"/>\n <p x=\"0.229051012279\" y=\"-0.40662377386\" z=\"-0.468920933159\"/>\n <p x=\"0.765439610761\" y=\"-0.544637224679\" z=\"0.342742608623\"/>\n <p x=\"0.521422927254\" y=\"-0.614656682149\" z=\"-0.338004906057\"/>\n <p x=\"0.643397169449\" y=\"-0.417575785439\" z=\"-0.641615574746\"/>\n <p x=\"0.69001323396\" y=\"-0.466108936569\" z=\"-0.265624205804\"/>\n <p x=\"0.962798080381\" y=\"-0.225753635268\" z=\"-0.148509772661\"/>\n <p x=\"0.718823546249\" y=\"-0.496104073549\" z=\"-0.0332487603228\"/>\n <p x=\"0.519683760297\" y=\"-0.385137467523\" z=\"0.587817950463\"/>\n <p x=\"0.519615561178\" y=\"-0.0609951315688\" z=\"-0.700150901593\"/>\n <p x=\"0.566231625688\" y=\"-0.109528282701\" z=\"-0.324159532649\"/>\n <p x=\"0.8678267844\" y=\"0.10083188162\" z=\"0.0253303459775\"/>\n <p x=\"0.623852250268\" y=\"-0.169518556659\" z=\"0.140591358317\"/>\n <p x=\"0.122042441313\" y=\"-0.127061439241\" z=\"0.984358183369\"/>\n <p x=\"0.670468314778\" y=\"-0.218051707791\" z=\"0.516582727262\"/>\n <p x=\"0.914442848908\" y=\"0.0522987304881\" z=\"0.40132171492\"/>\n <p x=\"0.611772825906\" y=\"-0.0162107581197\" z=\"0.624021829186\"/>\n <p x=\"0.516801529922\" y=\"0.310374758767\" z=\"0.797861947823\"/>\n <p x=\"0.424712464315\" y=\"-0.0585519506308\" z=\"0.7616580691\"/>\n <p x=\"-0.227243646203\" y=\"-0.14703777672\" z=\"0.831066928693\"/>\n <p x=\"0.809131295525\" y=\"0.302672831292\" z=\"0.132769447902\"/>\n <p x=\"0.506461272523\" y=\"0.234163342681\" z=\"0.355469562169\"/>\n <p x=\"0.224429614946\" y=\"0.518407667054\" z=\"0.666945920722\"/>\n <p x=\"0.13234054934\" y=\"0.149480957655\" z=\"0.630742041997\"/>\n <p x=\"-0.170329473664\" y=\"0.0809714690428\" z=\"0.853442156265\"/>\n <p x=\"-0.0782404080558\" y=\"0.449898178444\" z=\"0.889646034986\"/>\n <p x=\"-0.351025254477\" y=\"0.20954287715\" z=\"0.772531601846\"/>\n <p x=\"-0.643397169451\" y=\"0.41757578544\" z=\"0.641615574745\"/>\n <p x=\"0.0437338341347\" y=\"0.646979075156\" z=\"0.586035366299\"/>\n <p x=\"-0.229051012283\" y=\"0.406623773857\" z=\"0.468920933157\"/>\n <p x=\"-0.690013233962\" y=\"0.466108936571\" z=\"0.265624205801\"/>\n <p x=\"-0.324064457636\" y=\"0.933540271562\" z=\"-0.15324747523\"/>\n <p x=\"0.0436916847676\" y=\"0.847310055972\" z=\"-0.209973160724\"/>\n <p x=\"0.241092303759\" y=\"0.965862664571\" z=\"0.0947829850168\"/>\n <p x=\"0.270977480344\" y=\"0.79401685188\" z=\"-0.245031562394\"/>\n <p x=\"0.638733622746\" y=\"0.707786636291\" z=\"-0.301757247888\"/>\n <p x=\"0.289447535232\" y=\"0.687810298812\" z=\"-0.455048502565\"/>\n <p x=\"0.319332711817\" y=\"0.515964486122\" z=\"-0.794863049974\"/>\n <p x=\"0.0735768613523\" y=\"0.675464243281\" z=\"-0.549787708132\"/>\n <p x=\"-0.275709226162\" y=\"0.655487905804\" z=\"-0.70307896281\"/>\n <p x=\"-0.0783086071708\" y=\"0.774040514404\" z=\"-0.398322817071\"/>\n <p x=\"-0.446038699831\" y=\"0.736459374851\" z=\"0.15036319346\"/>\n <p x=\"-0.0782825574281\" y=\"0.65022915926\" z=\"0.0936375079643\"/>\n <p x=\"0.346403857141\" y=\"0.715488563766\" z=\"0.363335252036\"/>\n <p x=\"0.376289033724\" y=\"0.543642751079\" z=\"0.0235207046248\"/>\n <p x=\"0.762515231017\" y=\"0.351205982423\" z=\"-0.243221921038\"/>\n <p x=\"0.413229143504\" y=\"0.331229644944\" z=\"-0.396513175714\"/>\n <p x=\"0.227243646206\" y=\"0.147037776721\" z=\"-0.831066928694\"/>\n <p x=\"-0.0185122042587\" y=\"0.30653753388\" z=\"-0.585991586852\"/>\n <p x=\"-0.519683760295\" y=\"0.385137467523\" z=\"-0.587817950467\"/>\n <p x=\"-0.322283141303\" y=\"0.503690076123\" z=\"-0.283061804728\"/>\n <p x=\"-0.24863808084\" y=\"0.855011983445\" z=\"0.455119339198\"/>\n <p x=\"-0.568038991768\" y=\"0.663189833282\" z=\"-0.0379864628876\"/>\n <p x=\"-0.76543961076\" y=\"0.544637224681\" z=\"-0.342742608628\"/>\n <p x=\"-0.521422927258\" y=\"0.614656682147\" z=\"0.338004906054\"/>\n <p x=\"0.119118061563\" y=\"0.768781767858\" z=\"0.398393653706\"/>\n <p x=\"-0.670468314778\" y=\"0.218051707792\" z=\"-0.516582727263\"/>\n <p x=\"0.714159999543\" y=\"0.62925834818\" z=\"0.306609566545\"/>\n <p x=\"0.411489976537\" y=\"0.560748859568\" z=\"0.529309680809\"/>\n <p x=\"0.74404517613\" y=\"0.457412535489\" z=\"-0.0332049808684\"/>\n <p x=\"0.792400407601\" y=\"0.179360169729\" z=\"-0.583036468448\"/>\n <p x=\"0.83901647211\" y=\"0.130827018599\" z=\"-0.207045099503\"/>\n <p x=\"0.443114320088\" y=\"0.159383832251\" z=\"-0.736327723125\"/>\n <p x=\"-0.122042441306\" y=\"0.127061439242\" z=\"-0.98435818337\"/>\n <p x=\"0.170329473667\" y=\"-0.0809714690487\" z=\"-0.853442156266\"/>\n <p x=\"-0.367798291772\" y=\"0.2865611964\" z=\"-0.73928284153\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>11</v><v>1</v><v>0</v></f>\n <f><v>12</v><v>13</v><v>3</v><v>2</v></f>\n <f><v>14</v><v>15</v><v>5</v><v>4</v></f>\n <f><v>16</v><v>17</v><v>7</v><v>6</v></f>\n <f><v>18</v><v>19</v><v>9</v><v>8</v></f>\n <f><v>20</v><v>10</v><v>0</v><v>21</v><v>22</v><v>23</v><v>24</v><v>25</v><v>26</v><v>27</v></f>\n <f><v>28</v><v>11</v><v>10</v><v>20</v></f>\n <f><v>9</v><v>19</v><v>21</v><v>0</v></f>\n <f><v>29</v><v>30</v><v>23</v><v>22</v></f>\n <f><v>31</v><v>32</v><v>25</v><v>24</v></f>\n <f><v>33</v><v>34</v><v>27</v><v>26</v></f>\n <f><v>35</v><v>12</v><v>2</v><v>28</v><v>20</v><v>36</v><v>37</v><v>38</v><v>39</v><v>40</v></f>\n <f><v>41</v><v>13</v><v>12</v><v>35</v></f>\n <f><v>1</v><v>11</v><v>28</v><v>2</v></f>\n <f><v>27</v><v>34</v><v>36</v><v>20</v></f>\n <f><v>42</v><v>43</v><v>38</v><v>37</v></f>\n <f><v>44</v><v>45</v><v>40</v><v>39</v></f>\n <f><v>46</v><v>14</v><v>4</v><v>41</v><v>35</v><v>47</v><v>48</v><v>49</v><v>50</v><v>51</v></f>\n <f><v>52</v><v>15</v><v>14</v><v>46</v></f>\n <f><v>3</v><v>13</v><v>41</v><v>4</v></f>\n <f><v>40</v><v>45</v><v>47</v><v>35</v></f>\n <f><v>53</v><v>54</v><v>49</v><v>48</v></f>\n <f><v>55</v><v>56</v><v>51</v><v>50</v></f>\n <f><v>57</v><v>16</v><v>6</v><v>52</v><v>46</v><v>58</v><v>59</v><v>60</v><v>61</v><v>62</v></f>\n <f><v>63</v><v>17</v><v>16</v><v>57</v></f>\n <f><v>5</v><v>15</v><v>52</v><v>6</v></f>\n <f><v>51</v><v>56</v><v>58</v><v>46</v></f>\n <f><v>64</v><v>65</v><v>60</v><v>59</v></f>\n <f><v>66</v><v>67</v><v>62</v><v>61</v></f>\n <f><v>22</v><v>18</v><v>8</v><v>63</v><v>57</v><v>68</v><v>69</v><v>70</v><v>71</v><v>29</v></f>\n <f><v>21</v><v>19</v><v>18</v><v>22</v></f>\n <f><v>7</v><v>17</v><v>63</v><v>8</v></f>\n <f><v>62</v><v>67</v><v>68</v><v>57</v></f>\n <f><v>72</v><v>73</v><v>70</v><v>69</v></f>\n <f><v>74</v><v>30</v><v>29</v><v>71</v></f>\n <f><v>75</v><v>76</v><v>77</v><v>78</v><v>79</v><v>80</v><v>81</v><v>82</v><v>83</v><v>84</v></f>\n <f><v>85</v><v>86</v><v>76</v><v>75</v></f>\n <f><v>87</v><v>88</v><v>78</v><v>77</v></f>\n <f><v>89</v><v>90</v><v>80</v><v>79</v></f>\n <f><v>91</v><v>92</v><v>82</v><v>81</v></f>\n <f><v>93</v><v>94</v><v>84</v><v>83</v></f>\n <f><v>95</v><v>85</v><v>75</v><v>96</v><v>97</v><v>31</v><v>24</v><v>74</v><v>71</v><v>98</v></f>\n <f><v>99</v><v>86</v><v>85</v><v>95</v></f>\n <f><v>84</v><v>94</v><v>96</v><v>75</v></f>\n <f><v>100</v><v>32</v><v>31</v><v>97</v></f>\n <f><v>23</v><v>30</v><v>74</v><v>24</v></f>\n <f><v>70</v><v>73</v><v>98</v><v>71</v></f>\n <f><v>101</v><v>87</v><v>77</v><v>99</v><v>95</v><v>72</v><v>69</v><v>66</v><v>61</v><v>102</v></f>\n <f><v>103</v><v>88</v><v>87</v><v>101</v></f>\n <f><v>76</v><v>86</v><v>99</v><v>77</v></f>\n <f><v>98</v><v>73</v><v>72</v><v>95</v></f>\n <f><v>68</v><v>67</v><v>66</v><v>69</v></f>\n <f><v>60</v><v>65</v><v>102</v><v>61</v></f>\n <f><v>104</v><v>89</v><v>79</v><v>103</v><v>101</v><v>64</v><v>59</v><v>55</v><v>50</v><v>105</v></f>\n <f><v>106</v><v>90</v><v>89</v><v>104</v></f>\n <f><v>78</v><v>88</v><v>103</v><v>79</v></f>\n <f><v>102</v><v>65</v><v>64</v><v>101</v></f>\n <f><v>58</v><v>56</v><v>55</v><v>59</v></f>\n <f><v>49</v><v>54</v><v>105</v><v>50</v></f>\n <f><v>107</v><v>91</v><v>81</v><v>106</v><v>104</v><v>53</v><v>48</v><v>44</v><v>39</v><v>108</v></f>\n <f><v>109</v><v>92</v><v>91</v><v>107</v></f>\n <f><v>80</v><v>90</v><v>106</v><v>81</v></f>\n <f><v>105</v><v>54</v><v>53</v><v>104</v></f>\n <f><v>47</v><v>45</v><v>44</v><v>48</v></f>\n <f><v>38</v><v>43</v><v>108</v><v>39</v></f>\n <f><v>97</v><v>93</v><v>83</v><v>109</v><v>107</v><v>42</v><v>37</v><v>33</v><v>26</v><v>100</v></f>\n <f><v>96</v><v>94</v><v>93</v><v>97</v></f>\n <f><v>82</v><v>92</v><v>109</v><v>83</v></f>\n <f><v>108</v><v>43</v><v>42</v><v>107</v></f>\n <f><v>36</v><v>34</v><v>33</v><v>37</v></f>\n <f><v>25</v><v>32</v><v>100</v><v>26</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.731043780386\" y=\"-0.581893286661\" z=\"-0.356335788404\"/>\n <p x=\"-0.986641484554\" y=\"-0.113148838744\" z=\"0.117200346618\"/>\n <p x=\"-0.831555368422\" y=\"0.543115689198\" z=\"-0.116365877286\"/>\n <p x=\"-0.4801091733\" y=\"0.479965025159\" z=\"-0.734253877304\"/>\n <p x=\"-0.417989595631\" y=\"-0.21532875957\" z=\"-0.882563438652\"/>\n <p x=\"0.230032507287\" y=\"0.972675346311\" z=\"0.0314279536523\"/>\n <p x=\"0.175988215932\" y=\"0.745447493451\" z=\"-0.642912266457\"/>\n <p x=\"-0.392663672991\" y=\"0.847627414277\" z=\"0.356851518813\"/>\n <p x=\"0.643598280077\" y=\"0.214230897543\" z=\"-0.734769607714\"/>\n <p x=\"0.276499803967\" y=\"-0.379561482407\" z=\"-0.882882177574\"/>\n <p x=\"0.392663672991\" y=\"-0.847627414277\" z=\"-0.356851518813\"/>\n <p x=\"-0.230032507287\" y=\"-0.972675346311\" z=\"-0.0314279536523\"/>\n <p x=\"-0.175988215932\" y=\"-0.745447493451\" z=\"0.642912266457\"/>\n <p x=\"-0.643598280077\" y=\"-0.214230897543\" z=\"0.734769607714\"/>\n <p x=\"-0.276499803967\" y=\"0.379561482407\" z=\"0.882882177574\"/>\n <p x=\"0.4801091733\" y=\"-0.479965025159\" z=\"0.734253877304\"/>\n <p x=\"0.417989595631\" y=\"0.21532875957\" z=\"0.882563438652\"/>\n <p x=\"0.831555368422\" y=\"-0.543115689198\" z=\"0.116365877286\"/>\n <p x=\"0.986641484554\" y=\"0.113148838744\" z=\"-0.117200346618\"/>\n <p x=\"0.731043780386\" y=\"0.581893286661\" z=\"0.356335788404\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>3</v><v>2</v><v>7</v></f>\n <f><v>8</v><v>9</v><v>4</v><v>3</v><v>6</v></f>\n <f><v>10</v><v>11</v><v>0</v><v>4</v><v>9</v></f>\n <f><v>12</v><v>13</v><v>1</v><v>0</v><v>11</v></f>\n <f><v>14</v><v>7</v><v>2</v><v>1</v><v>13</v></f>\n <f><v>13</v><v>12</v><v>15</v><v>16</v><v>14</v></f>\n <f><v>11</v><v>10</v><v>17</v><v>15</v><v>12</v></f>\n <f><v>9</v><v>8</v><v>18</v><v>17</v><v>10</v></f>\n <f><v>6</v><v>5</v><v>19</v><v>18</v><v>8</v></f>\n <f><v>7</v><v>14</v><v>16</v><v>19</v><v>5</v></f>\n <f><v>19</v><v>16</v><v>15</v><v>17</v><v>18</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/echidnahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.252944828282\" y=\"-0.0960980595927\" z=\"0.962696253644\"/>\n <p x=\"0.249777280798\" y=\"0.0109422527336\" z=\"0.440759286833\"/>\n <p x=\"-0.0363326935933\" y=\"0.03893855547\" z=\"0.280160286665\"/>\n <p x=\"0.0395002410759\" y=\"-0.145978867799\" z=\"0.241776680146\"/>\n <p x=\"0.504393556168\" y=\"-0.257432388372\" z=\"0.824206106448\"/>\n <p x=\"0.215116034292\" y=\"-0.122395773309\" z=\"0.141670139471\"/>\n <p x=\"0.712712943883\" y=\"-0.0343567166525\" z=\"0.700613927664\"/>\n <p x=\"0.247819628791\" y=\"0.0770968039163\" z=\"0.118184501357\"/>\n <p x=\"0.59001267812\" y=\"0.26484595931\" z=\"0.762719907625\"/>\n <p x=\"0.0924157685305\" y=\"0.176806902653\" z=\"0.203776119429\"/>\n <p x=\"0.305860355733\" y=\"0.226687710863\" z=\"0.924695692931\"/>\n <p x=\"-0.241484533825\" y=\"-0.291177428574\" z=\"0.925689432266\"/>\n <p x=\"-0.24465208131\" y=\"-0.184137116245\" z=\"0.403752465453\"/>\n <p x=\"-0.494143157188\" y=\"-0.0889573386533\" z=\"0.864817398125\"/>\n <p x=\"-0.213158382286\" y=\"0.0562412221213\" z=\"0.180904646002\"/>\n <p x=\"-0.704420196912\" y=\"-0.245878459181\" z=\"0.665834791435\"/>\n <p x=\"-0.246609733316\" y=\"-0.11798256506\" z=\"0.0811776799791\"/>\n <p x=\"-0.581719931155\" y=\"-0.545081135144\" z=\"0.603728811471\"/>\n <p x=\"-0.0904581165272\" y=\"-0.24296145384\" z=\"0.118798666043\"/>\n <p x=\"-0.295609956765\" y=\"-0.573077437885\" z=\"0.764327811639\"/>\n <p x=\"0.416816782207\" y=\"-0.713556184867\" z=\"0.5631175198\"/>\n <p x=\"0.162200506836\" y=\"-0.445181543763\" z=\"0.179670700185\"/>\n <p x=\"0.111242631387\" y=\"-0.834121865398\" z=\"0.540246046375\"/>\n <p x=\"0.0765813848768\" y=\"-0.967459891441\" z=\"0.241156899014\"/>\n <p x=\"0.00483899456889\" y=\"-0.27931689384\" z=\"-0.0573124672157\"/>\n <p x=\"0.360733707262\" y=\"-0.929301642997\" z=\"0.0791811137055\"/>\n <p x=\"0.193694205859\" y=\"-0.204803205396\" z=\"-0.0431771192646\"/>\n <p x=\"0.571010746985\" y=\"-0.772380522466\" z=\"0.278163720394\"/>\n <p x=\"0.962204019762\" y=\"-0.129536494249\" z=\"0.239548994994\"/>\n <p x=\"0.499268356677\" y=\"-0.0842375248633\" z=\"-0.0203056458358\"/>\n <p x=\"0.908078596829\" y=\"-0.411436503562\" z=\"0.0781873743735\"/>\n <p x=\"0.906120944825\" y=\"-0.34528195238\" z=\"-0.244387411102\"/>\n <p x=\"0.213158382286\" y=\"-0.0562412221235\" z=\"-0.180904646002\"/>\n <p x=\"0.959036472281\" y=\"-0.0224961819267\" z=\"-0.282387971812\"/>\n <p x=\"0.246609733314\" y=\"0.117982565059\" z=\"-0.081177679979\"/>\n <p x=\"0.993697718786\" y=\"0.110841844115\" z=\"0.0167011755502\"/>\n <p x=\"0.640970553572\" y=\"0.653786280944\" z=\"0.402144561433\"/>\n <p x=\"0.300735156248\" y=\"0.399882574369\" z=\"0.0801839406429\"/>\n <p x=\"0.795164518357\" y=\"0.594961943348\" z=\"0.117190762023\"/>\n <p x=\"0.637803006091\" y=\"0.76082659327\" z=\"-0.119792405378\"/>\n <p x=\"0.0904581165267\" y=\"0.242961453839\" z=\"-0.118798666042\"/>\n <p x=\"0.386354278206\" y=\"0.922160922048\" z=\"0.0186977418205\"/>\n <p x=\"-0.00483899457076\" y=\"0.279316893837\" z=\"0.057312467215\"/>\n <p x=\"0.388311930209\" y=\"0.856006370863\" z=\"0.341272527295\"/>\n <p x=\"-0.102949884417\" y=\"0.553886689563\" z=\"0.826202672719\"/>\n <p x=\"-0.159032959356\" y=\"0.338141231431\" z=\"0.342266266622\"/>\n <p x=\"-0.0714561853964\" y=\"0.794265027929\" z=\"0.603354853268\"/>\n <p x=\"-0.357566159789\" y=\"0.822261330662\" z=\"0.442755853102\"/>\n <p x=\"-0.193694205859\" y=\"0.204803205392\" z=\"0.0431771192643\"/>\n <p x=\"-0.565885547505\" y=\"0.599185658945\" z=\"0.566348031889\"/>\n <p x=\"-0.40852403524\" y=\"0.433321009021\" z=\"0.803331199291\"/>\n <p x=\"-0.712712943885\" y=\"0.0343567166568\" z=\"-0.700613927662\"/>\n <p x=\"-0.249777280799\" y=\"-0.0109422527319\" z=\"-0.440759286833\"/>\n <p x=\"-0.247819628793\" y=\"-0.0770968039166\" z=\"-0.118184501358\"/>\n <p x=\"-0.215116034292\" y=\"0.122395773308\" z=\"-0.14167013947\"/>\n <p x=\"-0.504393556168\" y=\"0.257432388373\" z=\"-0.824206106449\"/>\n <p x=\"-0.039500241076\" y=\"0.145978867799\" z=\"-0.241776680144\"/>\n <p x=\"-0.252944828282\" y=\"0.0960980595955\" z=\"-0.962696253645\"/>\n <p x=\"0.0363326935922\" y=\"-0.0389385554697\" z=\"-0.280160286665\"/>\n <p x=\"-0.305860355737\" y=\"-0.226687710858\" z=\"-0.924695692932\"/>\n <p x=\"-0.0924157685327\" y=\"-0.176806902654\" z=\"-0.203776119432\"/>\n <p x=\"-0.590012678123\" y=\"-0.264845959305\" z=\"-0.762719907625\"/>\n <p x=\"-0.962204019763\" y=\"0.12953649425\" z=\"-0.239548994991\"/>\n <p x=\"-0.499268356677\" y=\"0.0842375248614\" z=\"0.0203056458369\"/>\n <p x=\"-0.993697718785\" y=\"-0.110841844117\" z=\"-0.0167011755421\"/>\n <p x=\"-0.95903647228\" y=\"0.022496181925\" z=\"0.282387971819\"/>\n <p x=\"-0.906120944824\" y=\"0.345281952379\" z=\"0.244387411103\"/>\n <p x=\"-0.908078596827\" y=\"0.411436503563\" z=\"-0.0781873743717\"/>\n <p x=\"-0.416816782202\" y=\"0.713556184867\" z=\"-0.563117519799\"/>\n <p x=\"-0.162200506834\" y=\"0.445181543762\" z=\"-0.179670700183\"/>\n <p x=\"-0.571010746984\" y=\"0.772380522464\" z=\"-0.278163720388\"/>\n <p x=\"-0.360733707259\" y=\"0.929301642996\" z=\"-0.0791811137017\"/>\n <p x=\"-0.076581384872\" y=\"0.96745989144\" z=\"-0.241156899007\"/>\n <p x=\"-0.111242631373\" y=\"0.8341218654\" z=\"-0.540246046371\"/>\n <p x=\"0.241484533827\" y=\"0.291177428573\" z=\"-0.925689432263\"/>\n <p x=\"0.244652081311\" y=\"0.184137116246\" z=\"-0.403752465451\"/>\n <p x=\"0.295609956764\" y=\"0.573077437884\" z=\"-0.764327811638\"/>\n <p x=\"0.581719931155\" y=\"0.545081135145\" z=\"-0.60372881147\"/>\n <p x=\"0.704420196915\" y=\"0.245878459182\" z=\"-0.665834791431\"/>\n <p x=\"0.494143157193\" y=\"0.0889573386495\" z=\"-0.864817398119\"/>\n <p x=\"0.102949884416\" y=\"-0.553886689557\" z=\"-0.826202672726\"/>\n <p x=\"0.159032959354\" y=\"-0.338141231432\" z=\"-0.342266266627\"/>\n <p x=\"0.408524035235\" y=\"-0.433321009024\" z=\"-0.803331199297\"/>\n <p x=\"0.565885547502\" y=\"-0.599185658946\" z=\"-0.566348031896\"/>\n <p x=\"0.357566159785\" y=\"-0.822261330664\" z=\"-0.44275585311\"/>\n <p x=\"0.0714561853947\" y=\"-0.794265027925\" z=\"-0.603354853278\"/>\n <p x=\"-0.640970553575\" y=\"-0.653786280942\" z=\"-0.402144561437\"/>\n <p x=\"-0.300735156249\" y=\"-0.399882574369\" z=\"-0.0801839406454\"/>\n <p x=\"-0.388311930212\" y=\"-0.856006370863\" z=\"-0.341272527296\"/>\n <p x=\"-0.386354278206\" y=\"-0.922160922048\" z=\"-0.0186977418209\"/>\n <p x=\"-0.637803006091\" y=\"-0.76082659327\" z=\"0.119792405374\"/>\n <p x=\"-0.795164518357\" y=\"-0.594961943349\" z=\"-0.117190762028\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>0</v><v>2</v><v>3</v></f>\n <f><v>0</v><v>3</v><v>1</v></f>\n <f><v>4</v><v>1</v><v>3</v></f>\n <f><v>4</v><v>3</v><v>5</v></f>\n <f><v>4</v><v>5</v><v>1</v></f>\n <f><v>6</v><v>1</v><v>5</v></f>\n <f><v>6</v><v>5</v><v>7</v></f>\n <f><v>6</v><v>7</v><v>1</v></f>\n <f><v>8</v><v>1</v><v>7</v></f>\n <f><v>8</v><v>7</v><v>9</v></f>\n <f><v>8</v><v>9</v><v>1</v></f>\n <f><v>10</v><v>1</v><v>9</v></f>\n <f><v>10</v><v>9</v><v>2</v></f>\n <f><v>10</v><v>2</v><v>1</v></f>\n <f><v>11</v><v>12</v><v>3</v></f>\n <f><v>11</v><v>3</v><v>2</v></f>\n <f><v>11</v><v>2</v><v>12</v></f>\n <f><v>13</v><v>12</v><v>2</v></f>\n <f><v>13</v><v>2</v><v>14</v></f>\n <f><v>13</v><v>14</v><v>12</v></f>\n <f><v>15</v><v>12</v><v>14</v></f>\n <f><v>15</v><v>14</v><v>16</v></f>\n <f><v>15</v><v>16</v><v>12</v></f>\n <f><v>17</v><v>12</v><v>16</v></f>\n <f><v>17</v><v>16</v><v>18</v></f>\n <f><v>17</v><v>18</v><v>12</v></f>\n <f><v>19</v><v>12</v><v>18</v></f>\n <f><v>19</v><v>18</v><v>3</v></f>\n <f><v>19</v><v>3</v><v>12</v></f>\n <f><v>20</v><v>21</v><v>5</v></f>\n <f><v>20</v><v>5</v><v>3</v></f>\n <f><v>20</v><v>3</v><v>21</v></f>\n <f><v>22</v><v>21</v><v>3</v></f>\n <f><v>22</v><v>3</v><v>18</v></f>\n <f><v>22</v><v>18</v><v>21</v></f>\n <f><v>23</v><v>21</v><v>18</v></f>\n <f><v>23</v><v>18</v><v>24</v></f>\n <f><v>23</v><v>24</v><v>21</v></f>\n <f><v>25</v><v>21</v><v>24</v></f>\n <f><v>25</v><v>24</v><v>26</v></f>\n <f><v>25</v><v>26</v><v>21</v></f>\n <f><v>27</v><v>21</v><v>26</v></f>\n <f><v>27</v><v>26</v><v>5</v></f>\n <f><v>27</v><v>5</v><v>21</v></f>\n <f><v>28</v><v>29</v><v>7</v></f>\n <f><v>28</v><v>7</v><v>5</v></f>\n <f><v>28</v><v>5</v><v>29</v></f>\n <f><v>30</v><v>29</v><v>5</v></f>\n <f><v>30</v><v>5</v><v>26</v></f>\n <f><v>30</v><v>26</v><v>29</v></f>\n <f><v>31</v><v>29</v><v>26</v></f>\n <f><v>31</v><v>26</v><v>32</v></f>\n <f><v>31</v><v>32</v><v>29</v></f>\n <f><v>33</v><v>29</v><v>32</v></f>\n <f><v>33</v><v>32</v><v>34</v></f>\n <f><v>33</v><v>34</v><v>29</v></f>\n <f><v>35</v><v>29</v><v>34</v></f>\n <f><v>35</v><v>34</v><v>7</v></f>\n <f><v>35</v><v>7</v><v>29</v></f>\n <f><v>36</v><v>37</v><v>9</v></f>\n <f><v>36</v><v>9</v><v>7</v></f>\n <f><v>36</v><v>7</v><v>37</v></f>\n <f><v>38</v><v>37</v><v>7</v></f>\n <f><v>38</v><v>7</v><v>34</v></f>\n <f><v>38</v><v>34</v><v>37</v></f>\n <f><v>39</v><v>37</v><v>34</v></f>\n <f><v>39</v><v>34</v><v>40</v></f>\n <f><v>39</v><v>40</v><v>37</v></f>\n <f><v>41</v><v>37</v><v>40</v></f>\n <f><v>41</v><v>40</v><v>42</v></f>\n <f><v>41</v><v>42</v><v>37</v></f>\n <f><v>43</v><v>37</v><v>42</v></f>\n <f><v>43</v><v>42</v><v>9</v></f>\n <f><v>43</v><v>9</v><v>37</v></f>\n <f><v>44</v><v>45</v><v>2</v></f>\n <f><v>44</v><v>2</v><v>9</v></f>\n <f><v>44</v><v>9</v><v>45</v></f>\n <f><v>46</v><v>45</v><v>9</v></f>\n <f><v>46</v><v>9</v><v>42</v></f>\n <f><v>46</v><v>42</v><v>45</v></f>\n <f><v>47</v><v>45</v><v>42</v></f>\n <f><v>47</v><v>42</v><v>48</v></f>\n <f><v>47</v><v>48</v><v>45</v></f>\n <f><v>49</v><v>45</v><v>48</v></f>\n <f><v>49</v><v>48</v><v>14</v></f>\n <f><v>49</v><v>14</v><v>45</v></f>\n <f><v>50</v><v>45</v><v>14</v></f>\n <f><v>50</v><v>14</v><v>2</v></f>\n <f><v>50</v><v>2</v><v>45</v></f>\n <f><v>51</v><v>52</v><v>53</v></f>\n <f><v>51</v><v>53</v><v>54</v></f>\n <f><v>51</v><v>54</v><v>52</v></f>\n <f><v>55</v><v>52</v><v>54</v></f>\n <f><v>55</v><v>54</v><v>56</v></f>\n <f><v>55</v><v>56</v><v>52</v></f>\n <f><v>57</v><v>52</v><v>56</v></f>\n <f><v>57</v><v>56</v><v>58</v></f>\n <f><v>57</v><v>58</v><v>52</v></f>\n <f><v>59</v><v>52</v><v>58</v></f>\n <f><v>59</v><v>58</v><v>60</v></f>\n <f><v>59</v><v>60</v><v>52</v></f>\n <f><v>61</v><v>52</v><v>60</v></f>\n <f><v>61</v><v>60</v><v>53</v></f>\n <f><v>61</v><v>53</v><v>52</v></f>\n <f><v>62</v><v>63</v><v>54</v></f>\n <f><v>62</v><v>54</v><v>53</v></f>\n <f><v>62</v><v>53</v><v>63</v></f>\n <f><v>64</v><v>63</v><v>53</v></f>\n <f><v>64</v><v>53</v><v>16</v></f>\n <f><v>64</v><v>16</v><v>63</v></f>\n <f><v>65</v><v>63</v><v>16</v></f>\n <f><v>65</v><v>16</v><v>14</v></f>\n <f><v>65</v><v>14</v><v>63</v></f>\n <f><v>66</v><v>63</v><v>14</v></f>\n <f><v>66</v><v>14</v><v>48</v></f>\n <f><v>66</v><v>48</v><v>63</v></f>\n <f><v>67</v><v>63</v><v>48</v></f>\n <f><v>67</v><v>48</v><v>54</v></f>\n <f><v>67</v><v>54</v><v>63</v></f>\n <f><v>68</v><v>69</v><v>56</v></f>\n <f><v>68</v><v>56</v><v>54</v></f>\n <f><v>68</v><v>54</v><v>69</v></f>\n <f><v>70</v><v>69</v><v>54</v></f>\n <f><v>70</v><v>54</v><v>48</v></f>\n <f><v>70</v><v>48</v><v>69</v></f>\n <f><v>71</v><v>69</v><v>48</v></f>\n <f><v>71</v><v>48</v><v>42</v></f>\n <f><v>71</v><v>42</v><v>69</v></f>\n <f><v>72</v><v>69</v><v>42</v></f>\n <f><v>72</v><v>42</v><v>40</v></f>\n <f><v>72</v><v>40</v><v>69</v></f>\n <f><v>73</v><v>69</v><v>40</v></f>\n <f><v>73</v><v>40</v><v>56</v></f>\n <f><v>73</v><v>56</v><v>69</v></f>\n <f><v>74</v><v>75</v><v>58</v></f>\n <f><v>74</v><v>58</v><v>56</v></f>\n <f><v>74</v><v>56</v><v>75</v></f>\n <f><v>76</v><v>75</v><v>56</v></f>\n <f><v>76</v><v>56</v><v>40</v></f>\n <f><v>76</v><v>40</v><v>75</v></f>\n <f><v>77</v><v>75</v><v>40</v></f>\n <f><v>77</v><v>40</v><v>34</v></f>\n <f><v>77</v><v>34</v><v>75</v></f>\n <f><v>78</v><v>75</v><v>34</v></f>\n <f><v>78</v><v>34</v><v>32</v></f>\n <f><v>78</v><v>32</v><v>75</v></f>\n <f><v>79</v><v>75</v><v>32</v></f>\n <f><v>79</v><v>32</v><v>58</v></f>\n <f><v>79</v><v>58</v><v>75</v></f>\n <f><v>80</v><v>81</v><v>60</v></f>\n <f><v>80</v><v>60</v><v>58</v></f>\n <f><v>80</v><v>58</v><v>81</v></f>\n <f><v>82</v><v>81</v><v>58</v></f>\n <f><v>82</v><v>58</v><v>32</v></f>\n <f><v>82</v><v>32</v><v>81</v></f>\n <f><v>83</v><v>81</v><v>32</v></f>\n <f><v>83</v><v>32</v><v>26</v></f>\n <f><v>83</v><v>26</v><v>81</v></f>\n <f><v>84</v><v>81</v><v>26</v></f>\n <f><v>84</v><v>26</v><v>24</v></f>\n <f><v>84</v><v>24</v><v>81</v></f>\n <f><v>85</v><v>81</v><v>24</v></f>\n <f><v>85</v><v>24</v><v>60</v></f>\n <f><v>85</v><v>60</v><v>81</v></f>\n <f><v>86</v><v>87</v><v>53</v></f>\n <f><v>86</v><v>53</v><v>60</v></f>\n <f><v>86</v><v>60</v><v>87</v></f>\n <f><v>88</v><v>87</v><v>60</v></f>\n <f><v>88</v><v>60</v><v>24</v></f>\n <f><v>88</v><v>24</v><v>87</v></f>\n <f><v>89</v><v>87</v><v>24</v></f>\n <f><v>89</v><v>24</v><v>18</v></f>\n <f><v>89</v><v>18</v><v>87</v></f>\n <f><v>90</v><v>87</v><v>18</v></f>\n <f><v>90</v><v>18</v><v>16</v></f>\n <f><v>90</v><v>16</v><v>87</v></f>\n <f><v>91</v><v>87</v><v>16</v></f>\n <f><v>91</v><v>16</v><v>53</v></f>\n <f><v>91</v><v>53</v><v>87</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_pentagonal_cupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.776462733094\" y=\"-0.560585442477\" z=\"-0.287836039784\"/>\n <p x=\"0.358071880125\" y=\"-0.665116254792\" z=\"-0.655289932988\"/>\n <p x=\"-0.114577941226\" y=\"-0.452625280598\" z=\"-0.884308911381\"/>\n <p x=\"-0.46095056398\" y=\"-0.00427684973499\" z=\"-0.887415509287\"/>\n <p x=\"-0.548743419016\" y=\"0.508675176011\" z=\"-0.663423111895\"/>\n <p x=\"-0.344422619682\" y=\"0.890300557402\" z=\"-0.297889201788\"/>\n <p x=\"0.0739682332873\" y=\"0.994831369717\" z=\"0.0695646914155\"/>\n <p x=\"0.546618054638\" y=\"0.782340395523\" z=\"0.298583669809\"/>\n <p x=\"0.892990677392\" y=\"0.33399196466\" z=\"0.301690267715\"/>\n <p x=\"0.980783532429\" y=\"-0.178960061086\" z=\"0.0776978703232\"/>\n <p x=\"-0.650770508725\" y=\"0.656508540626\" z=\"0.117432630015\"/>\n <p x=\"-0.855091308059\" y=\"0.274883159235\" z=\"-0.248101280092\"/>\n <p x=\"-0.767298453023\" y=\"-0.238068866511\" z=\"-0.472093677484\"/>\n <p x=\"-0.420925830269\" y=\"-0.686417297374\" z=\"-0.468987079578\"/>\n <p x=\"0.0517239910821\" y=\"-0.898908271568\" z=\"-0.239968101185\"/>\n <p x=\"0.470114844051\" y=\"-0.794377459253\" z=\"0.127485792019\"/>\n <p x=\"0.674435643386\" y=\"-0.412752077862\" z=\"0.493019702126\"/>\n <p x=\"0.586642788349\" y=\"0.100199947884\" z=\"0.717012099518\"/>\n <p x=\"0.240270165595\" y=\"0.548548378747\" z=\"0.713905501612\"/>\n <p x=\"-0.232379655756\" y=\"0.761039352941\" z=\"0.484886523219\"/>\n <p x=\"-0.303497329684\" y=\"-0.591913374996\" z=\"0.0771626399195\"/>\n <p x=\"0.114893523284\" y=\"-0.487382562681\" z=\"0.444616533123\"/>\n <p x=\"0.0271006682477\" y=\"0.0255694630643\" z=\"0.668608930514\"/>\n <p x=\"-0.445549153103\" y=\"0.238060437258\" z=\"0.439589952121\"/>\n <p x=\"-0.649869952438\" y=\"-0.143564944133\" z=\"0.0740560420133\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>5</v><v>4</v><v>11</v></f>\n <f><v>11</v><v>4</v><v>3</v><v>12</v></f>\n <f><v>12</v><v>3</v><v>2</v><v>13</v></f>\n <f><v>13</v><v>2</v><v>1</v><v>14</v></f>\n <f><v>14</v><v>1</v><v>0</v><v>15</v></f>\n <f><v>15</v><v>0</v><v>9</v><v>16</v></f>\n <f><v>16</v><v>9</v><v>8</v><v>17</v></f>\n <f><v>17</v><v>8</v><v>7</v><v>18</v></f>\n <f><v>18</v><v>7</v><v>6</v><v>19</v></f>\n <f><v>19</v><v>6</v><v>5</v><v>10</v></f>\n <f><v>20</v><v>21</v><v>22</v><v>23</v><v>24</v></f>\n <f><v>21</v><v>20</v><v>14</v><v>15</v></f>\n <f><v>21</v><v>15</v><v>16</v></f>\n <f><v>22</v><v>21</v><v>16</v><v>17</v></f>\n <f><v>22</v><v>17</v><v>18</v></f>\n <f><v>23</v><v>22</v><v>18</v><v>19</v></f>\n <f><v>23</v><v>19</v><v>10</v></f>\n <f><v>24</v><v>23</v><v>10</v><v>11</v></f>\n <f><v>24</v><v>11</v><v>12</v></f>\n <f><v>20</v><v>24</v><v>12</v><v>13</v></f>\n <f><v>20</v><v>13</v><v>14</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_pentagonal_dipyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.616589985973\" y=\"-0.308294992987\" z=\"0.670927255793\"/>\n <p x=\"0.902395162314\" y=\"-0.213026600873\" z=\"-0.256271407734\"/>\n <p x=\"0.594100169327\" y=\"0.711858378087\" z=\"-0.256271407734\"/>\n <p x=\"0.308294992987\" y=\"0.616589985973\" z=\"0.670927255793\"/>\n <p x=\"0.316227766017\" y=\"-0.948683298051\" z=\"5.47641919344E-16\"/>\n <p x=\"-0.316227766017\" y=\"0.948683298051\" z=\"0\"/>\n <p x=\"0.154147496493\" y=\"-0.46244248948\" z=\"-0.829311696118\"/>\n <p x=\"-0.154147496493\" y=\"0.46244248948\" z=\"-0.829311696118\"/>\n <p x=\"-0.594100169327\" y=\"-0.711858378087\" z=\"-0.256271407734\"/>\n <p x=\"-0.902395162314\" y=\"0.213026600873\" z=\"-0.256271407734\"/>\n <p x=\"-0.308294992987\" y=\"-0.616589985973\" z=\"0.670927255793\"/>\n <p x=\"-0.616589985973\" y=\"0.308294992987\" z=\"0.670927255793\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>1</v><v>0</v><v>4</v></f>\n <f><v>3</v><v>2</v><v>5</v></f>\n <f><v>1</v><v>6</v><v>7</v><v>2</v></f>\n <f><v>6</v><v>1</v><v>4</v></f>\n <f><v>2</v><v>7</v><v>5</v></f>\n <f><v>6</v><v>8</v><v>9</v><v>7</v></f>\n <f><v>8</v><v>6</v><v>4</v></f>\n <f><v>7</v><v>9</v><v>5</v></f>\n <f><v>8</v><v>10</v><v>11</v><v>9</v></f>\n <f><v>10</v><v>8</v><v>4</v></f>\n <f><v>9</v><v>11</v><v>5</v></f>\n <f><v>10</v><v>0</v><v>3</v><v>11</v></f>\n <f><v>0</v><v>10</v><v>4</v></f>\n <f><v>11</v><v>3</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_pentagonal_gyrobicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.51552696145\" y=\"-0.0520105974609\" z=\"-0.592176172848\"/>\n <p x=\"-0.217420610241\" y=\"0.457602842372\" z=\"-0.602057876632\"/>\n <p x=\"0.359238572294\" y=\"0.331419546129\" z=\"-0.616647794563\"/>\n <p x=\"0.417527195817\" y=\"-0.256179459594\" z=\"-0.615783155952\"/>\n <p x=\"-0.123107636224\" y=\"-0.493152320644\" z=\"-0.600658861973\"/>\n <p x=\"-0.940784198686\" y=\"0.202967768684\" z=\"-0.27153117018\"/>\n <p x=\"-0.642677847476\" y=\"0.712581208516\" z=\"-0.281412873964\"/>\n <p x=\"-0.102043015435\" y=\"0.949554069566\" z=\"-0.296537167944\"/>\n <p x=\"0.474616167101\" y=\"0.823370773323\" z=\"-0.311127085874\"/>\n <p x=\"0.867035492327\" y=\"0.38222905014\" z=\"-0.319609774999\"/>\n <p x=\"0.92532411585\" y=\"-0.205369955583\" z=\"-0.318745136388\"/>\n <p x=\"0.62721776464\" y=\"-0.714983395415\" z=\"-0.308863432604\"/>\n <p x=\"0.0865829325992\" y=\"-0.951956256465\" z=\"-0.293739138624\"/>\n <p x=\"-0.490076249937\" y=\"-0.825772960222\" z=\"-0.279149220694\"/>\n <p x=\"-0.882495575163\" y=\"-0.384631237039\" z=\"-0.270666531569\"/>\n <p x=\"0.123107636224\" y=\"0.493152320644\" z=\"0.600658861973\"/>\n <p x=\"-0.417527195817\" y=\"0.256179459594\" z=\"0.615783155952\"/>\n <p x=\"-0.359238572294\" y=\"-0.331419546129\" z=\"0.616647794563\"/>\n <p x=\"0.217420610241\" y=\"-0.457602842372\" z=\"0.602057876632\"/>\n <p x=\"0.51552696145\" y=\"0.0520105974609\" z=\"0.592176172848\"/>\n <p x=\"-0.0865829325992\" y=\"0.951956256465\" z=\"0.293739138624\"/>\n <p x=\"-0.62721776464\" y=\"0.714983395415\" z=\"0.308863432604\"/>\n <p x=\"-0.92532411585\" y=\"0.205369955583\" z=\"0.318745136388\"/>\n <p x=\"-0.867035492327\" y=\"-0.38222905014\" z=\"0.319609774999\"/>\n <p x=\"-0.474616167101\" y=\"-0.823370773323\" z=\"0.311127085874\"/>\n <p x=\"0.102043015435\" y=\"-0.949554069566\" z=\"0.296537167944\"/>\n <p x=\"0.642677847476\" y=\"-0.712581208516\" z=\"0.281412873964\"/>\n <p x=\"0.940784198686\" y=\"-0.202967768684\" z=\"0.27153117018\"/>\n <p x=\"0.882495575163\" y=\"0.384631237039\" z=\"0.270666531569\"/>\n <p x=\"0.490076249937\" y=\"0.825772960222\" z=\"0.279149220694\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v></f>\n <f><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>9</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>11</v></f>\n <f><v>4</v><v>3</v><v>11</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>4</v><v>13</v><v>14</v></f>\n <f><v>0</v><v>14</v><v>5</v></f>\n <f><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>16</v><v>15</v><v>20</v><v>21</v></f>\n <f><v>16</v><v>21</v><v>22</v></f>\n <f><v>17</v><v>16</v><v>22</v><v>23</v></f>\n <f><v>17</v><v>23</v><v>24</v></f>\n <f><v>18</v><v>17</v><v>24</v><v>25</v></f>\n <f><v>18</v><v>25</v><v>26</v></f>\n <f><v>19</v><v>18</v><v>26</v><v>27</v></f>\n <f><v>19</v><v>27</v><v>28</v></f>\n <f><v>15</v><v>19</v><v>28</v><v>29</v></f>\n <f><v>15</v><v>29</v><v>20</v></f>\n <f><v>11</v><v>26</v><v>25</v><v>12</v></f>\n <f><v>12</v><v>25</v><v>24</v><v>13</v></f>\n <f><v>13</v><v>24</v><v>23</v><v>14</v></f>\n <f><v>14</v><v>23</v><v>22</v><v>5</v></f>\n <f><v>5</v><v>22</v><v>21</v><v>6</v></f>\n <f><v>6</v><v>21</v><v>20</v><v>7</v></f>\n <f><v>7</v><v>20</v><v>29</v><v>8</v></f>\n <f><v>8</v><v>29</v><v>28</v><v>9</v></f>\n <f><v>9</v><v>28</v><v>27</v><v>10</v></f>\n <f><v>10</v><v>27</v><v>26</v><v>11</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_pentagonal_gyrobirotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.988030901051\" y=\"-0.153383392816\" z=\"-0.0163851572208\"/>\n <p x=\"-0.912414216982\" y=\"0.165770812839\" z=\"-0.374192910487\"/>\n <p x=\"-0.678020675106\" y=\"-0.0631498664924\" z=\"-0.73232510437\"/>\n <p x=\"-0.608774183551\" y=\"-0.523784832702\" z=\"-0.595855219389\"/>\n <p x=\"-0.800371040045\" y=\"-0.579552218895\" z=\"-0.153379998147\"/>\n <p x=\"-0.767427235712\" y=\"-0.437443802185\" z=\"0.309570951578\"/>\n <p x=\"-0.522526184089\" y=\"-0.151740167668\" z=\"0.616166102114\"/>\n <p x=\"-0.591772675644\" y=\"0.308894798542\" z=\"0.479696217132\"/>\n <p x=\"-0.87947041265\" y=\"0.307879229549\" z=\"0.0887580392371\"/>\n <p x=\"-0.516155991576\" y=\"0.628049004197\" z=\"0.121888463866\"/>\n <p x=\"-0.324559135082\" y=\"0.68381639039\" z=\"-0.320586757377\"/>\n <p x=\"-0.569460186705\" y=\"0.398112755873\" z=\"-0.627181907913\"/>\n <p x=\"-0.0901655932052\" y=\"0.454895711059\" z=\"-0.67871895126\"/>\n <p x=\"0.0974942678007\" y=\"0.0287268849797\" z=\"-0.815713792186\"/>\n <p x=\"-0.265820153273\" y=\"-0.291442889668\" z=\"-0.848844216814\"/>\n <p x=\"0.166740759356\" y=\"-0.43190808123\" z=\"-0.679243907204\"/>\n <p x=\"0.0911240752874\" y=\"-0.751062286885\" z=\"-0.321436153938\"/>\n <p x=\"-0.388170518212\" y=\"-0.807845242071\" z=\"-0.269899110591\"/>\n <p x=\"-0.100472781207\" y=\"-0.806829673078\" z=\"0.121039067305\"/>\n <p x=\"-0.334866323083\" y=\"-0.577908993746\" z=\"0.479171261188\"/>\n <p x=\"0.608774183551\" y=\"0.523784832702\" z=\"0.595855219389\"/>\n <p x=\"0.678020675106\" y=\"0.0631498664924\" z=\"0.73232510437\"/>\n <p x=\"0.912414216982\" y=\"-0.165770812839\" z=\"0.374192910487\"/>\n <p x=\"0.988030901051\" y=\"0.153383392816\" z=\"0.0163851572208\"/>\n <p x=\"0.800371040045\" y=\"0.579552218895\" z=\"0.153379998147\"/>\n <p x=\"0.388170518212\" y=\"0.807845242071\" z=\"0.269899110591\"/>\n <p x=\"-0.0911240752874\" y=\"0.751062286885\" z=\"0.321436153938\"/>\n <p x=\"-0.166740759356\" y=\"0.43190808123\" z=\"0.679243907204\"/>\n <p x=\"0.265820153273\" y=\"0.291442889668\" z=\"0.848844216814\"/>\n <p x=\"-0.0974942678007\" y=\"-0.0287268849797\" z=\"0.815713792186\"/>\n <p x=\"0.0901655932052\" y=\"-0.454895711059\" z=\"0.67871895126\"/>\n <p x=\"0.569460186705\" y=\"-0.398112755873\" z=\"0.627181907913\"/>\n <p x=\"0.324559135082\" y=\"-0.68381639039\" z=\"0.320586757377\"/>\n <p x=\"0.516155991576\" y=\"-0.628049004197\" z=\"-0.121888463866\"/>\n <p x=\"0.87947041265\" y=\"-0.307879229549\" z=\"-0.0887580392371\"/>\n <p x=\"0.591772675644\" y=\"-0.308894798542\" z=\"-0.479696217132\"/>\n <p x=\"0.522526184089\" y=\"0.151740167668\" z=\"-0.616166102114\"/>\n <p x=\"0.767427235712\" y=\"0.437443802185\" z=\"-0.309570951578\"/>\n <p x=\"0.334866323083\" y=\"0.577908993746\" z=\"-0.479171261188\"/>\n <p x=\"0.100472781207\" y=\"0.806829673078\" z=\"-0.121039067305\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>0</v><v>5</v><v>6</v><v>7</v><v>8</v></f>\n <f><v>0</v><v>8</v><v>1</v></f>\n <f><v>8</v><v>7</v><v>9</v></f>\n <f><v>1</v><v>8</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>1</v><v>11</v><v>2</v></f>\n <f><v>11</v><v>10</v><v>12</v></f>\n <f><v>2</v><v>11</v><v>12</v><v>13</v><v>14</v></f>\n <f><v>2</v><v>14</v><v>3</v></f>\n <f><v>14</v><v>13</v><v>15</v></f>\n <f><v>3</v><v>14</v><v>15</v><v>16</v><v>17</v></f>\n <f><v>3</v><v>17</v><v>4</v></f>\n <f><v>17</v><v>16</v><v>18</v></f>\n <f><v>4</v><v>17</v><v>18</v><v>19</v><v>5</v></f>\n <f><v>4</v><v>5</v><v>0</v></f>\n <f><v>5</v><v>19</v><v>6</v></f>\n <f><v>20</v><v>21</v><v>22</v><v>23</v><v>24</v></f>\n <f><v>20</v><v>25</v><v>26</v><v>27</v><v>28</v></f>\n <f><v>20</v><v>28</v><v>21</v></f>\n <f><v>28</v><v>27</v><v>29</v></f>\n <f><v>21</v><v>28</v><v>29</v><v>30</v><v>31</v></f>\n <f><v>21</v><v>31</v><v>22</v></f>\n <f><v>31</v><v>30</v><v>32</v></f>\n <f><v>22</v><v>31</v><v>32</v><v>33</v><v>34</v></f>\n <f><v>22</v><v>34</v><v>23</v></f>\n <f><v>34</v><v>33</v><v>35</v></f>\n <f><v>23</v><v>34</v><v>35</v><v>36</v><v>37</v></f>\n <f><v>23</v><v>37</v><v>24</v></f>\n <f><v>37</v><v>36</v><v>38</v></f>\n <f><v>24</v><v>37</v><v>38</v><v>39</v><v>25</v></f>\n <f><v>24</v><v>25</v><v>20</v></f>\n <f><v>25</v><v>39</v><v>26</v></f>\n <f><v>15</v><v>35</v><v>33</v><v>16</v></f>\n <f><v>16</v><v>33</v><v>32</v><v>18</v></f>\n <f><v>18</v><v>32</v><v>30</v><v>19</v></f>\n <f><v>19</v><v>30</v><v>29</v><v>6</v></f>\n <f><v>6</v><v>29</v><v>27</v><v>7</v></f>\n <f><v>7</v><v>27</v><v>26</v><v>9</v></f>\n <f><v>9</v><v>26</v><v>39</v><v>10</v></f>\n <f><v>10</v><v>39</v><v>38</v><v>12</v></f>\n <f><v>12</v><v>38</v><v>36</v><v>13</v></f>\n <f><v>13</v><v>36</v><v>35</v><v>15</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_pentagonal_gyrocupolarotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.672413153068\" y=\"0.499922122956\" z=\"-0.256569017797\"/>\n <p x=\"-0.469585022809\" y=\"0.708675158804\" z=\"0.212505679875\"/>\n <p x=\"0.0507762201441\" y=\"0.866843038681\" z=\"0.117873491887\"/>\n <p x=\"0.169549024459\" y=\"0.755843128525\" z=\"-0.409687114391\"/>\n <p x=\"-0.277406588489\" y=\"0.529073531424\" z=\"-0.641105312209\"/>\n <p x=\"-0.987703748433\" y=\"0.152512044164\" z=\"0.0343712338425\"/>\n <p x=\"-0.784875618175\" y=\"0.361265080013\" z=\"0.503445931514\"/>\n <p x=\"-0.337920005227\" y=\"0.588034677114\" z=\"0.734864129332\"/>\n <p x=\"0.182441237726\" y=\"0.746202556991\" z=\"0.640231941343\"/>\n <p x=\"0.577447802305\" y=\"0.775353965459\" z=\"0.255695646932\"/>\n <p x=\"0.69622060662\" y=\"0.664354055303\" z=\"-0.271864959346\"/>\n <p x=\"0.493392476361\" y=\"0.455601019455\" z=\"-0.740939657018\"/>\n <p x=\"0.0464368634136\" y=\"0.228831422353\" z=\"-0.972357854835\"/>\n <p x=\"-0.47392437954\" y=\"0.0706635424759\" z=\"-0.877725666847\"/>\n <p x=\"-0.868930944118\" y=\"0.0415121340081\" z=\"-0.493189372436\"/>\n <p x=\"-0.129876683017\" y=\"-0.867022768653\" z=\"0.442011221061\"/>\n <p x=\"-0.0111038787024\" y=\"-0.97802267881\" z=\"-0.0855493852169\"/>\n <p x=\"0.509257364251\" y=\"-0.819854798933\" z=\"-0.180181573205\"/>\n <p x=\"0.712085494509\" y=\"-0.611101763084\" z=\"0.288893124467\"/>\n <p x=\"0.31707892993\" y=\"-0.640253171552\" z=\"0.673429418879\"/>\n <p x=\"-0.186360331527\" y=\"-0.460386557655\" z=\"0.811070486968\"/>\n <p x=\"-0.605935603256\" y=\"-0.14020485446\" z=\"0.649242118972\"/>\n <p x=\"-0.808763733515\" y=\"-0.348957890308\" z=\"0.180167421301\"/>\n <p x=\"-0.514543140159\" y=\"-0.798156064912\" z=\"0.0520916828724\"/>\n <p x=\"-0.6899909292\" y=\"-0.459957800464\" z=\"-0.347393184978\"/>\n <p x=\"-0.294984364621\" y=\"-0.430806391996\" z=\"-0.731929479389\"/>\n <p x=\"0.124590907109\" y=\"-0.750988095191\" z=\"-0.570101111394\"/>\n <p x=\"0.225376878332\" y=\"-0.272638512119\" z=\"-0.826561667377\"/>\n <p x=\"0.67233249128\" y=\"-0.0458689150178\" z=\"-0.59514346956\"/>\n <p x=\"0.84778028032\" y=\"-0.384067179466\" z=\"-0.19565860171\"/>\n <p x=\"0.875160621538\" y=\"0.162884120831\" z=\"-0.126068771888\"/>\n <p x=\"0.756387817223\" y=\"0.273884030987\" z=\"0.40149183439\"/>\n <p x=\"0.655601846\" y=\"-0.204465552085\" z=\"0.657952390373\"/>\n <p x=\"0.361381252644\" y=\"0.244732622519\" z=\"0.786028128802\"/>\n <p x=\"-0.158979990309\" y=\"0.0865647426421\" z=\"0.88066031679\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v></f>\n <f><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>9</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>11</v></f>\n <f><v>4</v><v>3</v><v>11</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>4</v><v>13</v><v>14</v></f>\n <f><v>0</v><v>14</v><v>5</v></f>\n <f><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>15</v><v>20</v><v>21</v><v>22</v><v>23</v></f>\n <f><v>15</v><v>23</v><v>16</v></f>\n <f><v>23</v><v>22</v><v>24</v></f>\n <f><v>16</v><v>23</v><v>24</v><v>25</v><v>26</v></f>\n <f><v>16</v><v>26</v><v>17</v></f>\n <f><v>26</v><v>25</v><v>27</v></f>\n <f><v>17</v><v>26</v><v>27</v><v>28</v><v>29</v></f>\n <f><v>17</v><v>29</v><v>18</v></f>\n <f><v>29</v><v>28</v><v>30</v></f>\n <f><v>18</v><v>29</v><v>30</v><v>31</v><v>32</v></f>\n <f><v>18</v><v>32</v><v>19</v></f>\n <f><v>32</v><v>31</v><v>33</v></f>\n <f><v>19</v><v>32</v><v>33</v><v>34</v><v>20</v></f>\n <f><v>19</v><v>20</v><v>15</v></f>\n <f><v>20</v><v>34</v><v>21</v></f>\n <f><v>11</v><v>28</v><v>27</v><v>12</v></f>\n <f><v>12</v><v>27</v><v>25</v><v>13</v></f>\n <f><v>13</v><v>25</v><v>24</v><v>14</v></f>\n <f><v>14</v><v>24</v><v>22</v><v>5</v></f>\n <f><v>5</v><v>22</v><v>21</v><v>6</v></f>\n <f><v>6</v><v>21</v><v>34</v><v>7</v></f>\n <f><v>7</v><v>34</v><v>33</v><v>8</v></f>\n <f><v>8</v><v>33</v><v>31</v><v>9</v></f>\n <f><v>9</v><v>31</v><v>30</v><v>10</v></f>\n <f><v>10</v><v>30</v><v>28</v><v>11</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_pentagonal_orthobicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.213439121963\" y=\"0.288789271936\" z=\"-0.700135892202\"/>\n <p x=\"0.158451741429\" y=\"0.64883449975\" z=\"-0.415995922446\"/>\n <p x=\"0.646975098527\" y=\"0.342715697474\" z=\"-0.28829662244\"/>\n <p x=\"0.57700827412\" y=\"-0.206521354741\" z=\"-0.493514084452\"/>\n <p x=\"0.0452430414534\" y=\"-0.239849718615\" z=\"-0.748044751067\"/>\n <p x=\"-0.672069487952\" y=\"0.576615403918\" z=\"-0.464582908992\"/>\n <p x=\"-0.30017862456\" y=\"0.936660631732\" z=\"-0.180442939236\"/>\n <p x=\"0.231586608106\" y=\"0.969988995607\" z=\"0.074087727379\"/>\n <p x=\"0.720109965204\" y=\"0.663870193331\" z=\"0.201787027385\"/>\n <p x=\"0.97879212862\" y=\"0.13523120278\" z=\"0.15387816852\"/>\n <p x=\"0.908825304212\" y=\"-0.414005849436\" z=\"-0.0513392934925\"/>\n <p x=\"0.536934440821\" y=\"-0.774051077249\" z=\"-0.335479263249\"/>\n <p x=\"0.00516920815438\" y=\"-0.807379441124\" z=\"-0.590009929864\"/>\n <p x=\"-0.483354148943\" y=\"-0.501260638848\" z=\"-0.71770922987\"/>\n <p x=\"-0.742036312359\" y=\"0.0273783517031\" z=\"-0.669800371005\"/>\n <p x=\"-0.327243871997\" y=\"0.315247141428\" z=\"0.642398986597\"/>\n <p x=\"-0.699134735389\" y=\"-0.0447980863855\" z=\"0.358259016841\"/>\n <p x=\"-0.440452571973\" y=\"-0.573437076937\" z=\"0.310350157976\"/>\n <p x=\"0.0913126606932\" y=\"-0.540108713063\" z=\"0.564880824591\"/>\n <p x=\"0.1612794851\" y=\"0.00912833915275\" z=\"0.770098286603\"/>\n <p x=\"-0.536934440821\" y=\"0.774051077249\" z=\"0.335479263249\"/>\n <p x=\"-0.908825304212\" y=\"0.414005849436\" z=\"0.0513392934925\"/>\n <p x=\"-0.97879212862\" y=\"-0.13523120278\" z=\"-0.15387816852\"/>\n <p x=\"-0.720109965204\" y=\"-0.663870193331\" z=\"-0.201787027385\"/>\n <p x=\"-0.231586608106\" y=\"-0.969988995607\" z=\"-0.074087727379\"/>\n <p x=\"0.30017862456\" y=\"-0.936660631732\" z=\"0.180442939236\"/>\n <p x=\"0.672069487952\" y=\"-0.576615403918\" z=\"0.464582908992\"/>\n <p x=\"0.742036312359\" y=\"-0.0273783517031\" z=\"0.669800371005\"/>\n <p x=\"0.483354148943\" y=\"0.501260638848\" z=\"0.71770922987\"/>\n <p x=\"-0.00516920815438\" y=\"0.807379441124\" z=\"0.590009929864\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v></f>\n <f><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>9</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>11</v></f>\n <f><v>4</v><v>3</v><v>11</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>4</v><v>13</v><v>14</v></f>\n <f><v>0</v><v>14</v><v>5</v></f>\n <f><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>16</v><v>15</v><v>20</v><v>21</v></f>\n <f><v>16</v><v>21</v><v>22</v></f>\n <f><v>17</v><v>16</v><v>22</v><v>23</v></f>\n <f><v>17</v><v>23</v><v>24</v></f>\n <f><v>18</v><v>17</v><v>24</v><v>25</v></f>\n <f><v>18</v><v>25</v><v>26</v></f>\n <f><v>19</v><v>18</v><v>26</v><v>27</v></f>\n <f><v>19</v><v>27</v><v>28</v></f>\n <f><v>15</v><v>19</v><v>28</v><v>29</v></f>\n <f><v>15</v><v>29</v><v>20</v></f>\n <f><v>11</v><v>25</v><v>24</v><v>12</v></f>\n <f><v>12</v><v>24</v><v>23</v><v>13</v></f>\n <f><v>13</v><v>23</v><v>22</v><v>14</v></f>\n <f><v>14</v><v>22</v><v>21</v><v>5</v></f>\n <f><v>5</v><v>21</v><v>20</v><v>6</v></f>\n <f><v>6</v><v>20</v><v>29</v><v>7</v></f>\n <f><v>7</v><v>29</v><v>28</v><v>8</v></f>\n <f><v>8</v><v>28</v><v>27</v><v>9</v></f>\n <f><v>9</v><v>27</v><v>26</v><v>10</v></f>\n <f><v>10</v><v>26</v><v>25</v><v>11</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_pentagonal_orthobirotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.98291548003\" y=\"0.0822623254069\" z=\"-0.164651355707\"/>\n <p x=\"-0.784462313933\" y=\"0.396437323387\" z=\"-0.476923816396\"/>\n <p x=\"-0.554370722303\" y=\"0.141719262237\" z=\"-0.820115085195\"/>\n <p x=\"-0.610619464247\" y=\"-0.329880155081\" z=\"-0.719946493266\"/>\n <p x=\"-0.875474690223\" y=\"-0.366626562909\" z=\"-0.314847630049\"/>\n <p x=\"-0.883442756229\" y=\"-0.264882967647\" z=\"0.159692598953\"/>\n <p x=\"-0.631480131874\" y=\"-0.0635119645477\" z=\"0.522415955292\"/>\n <p x=\"-0.57523138993\" y=\"0.408087452771\" z=\"0.422247363363\"/>\n <p x=\"-0.792430379938\" y=\"0.498180918649\" z=\"-0.00238358739333\"/>\n <p x=\"-0.376778223832\" y=\"0.72226245075\" z=\"0.109974902673\"/>\n <p x=\"-0.111922997856\" y=\"0.759008858579\" z=\"-0.295123960543\"/>\n <p x=\"-0.363885622211\" y=\"0.557637855479\" z=\"-0.657847316882\"/>\n <p x=\"0.118168593774\" y=\"0.504290797429\" z=\"-0.638315229342\"/>\n <p x=\"0.22560938358\" y=\"0.0554019091127\" z=\"-0.788511503685\"/>\n <p x=\"-0.190042772525\" y=\"-0.168679622989\" z=\"-0.900869993752\"/>\n <p x=\"0.169360641636\" y=\"-0.416197508206\" z=\"-0.688342911756\"/>\n <p x=\"-0.0290925244616\" y=\"-0.730372506185\" z=\"-0.376070451067\"/>\n <p x=\"-0.511146740446\" y=\"-0.677025448136\" z=\"-0.395602538606\"/>\n <p x=\"-0.293947750438\" y=\"-0.767118914013\" z=\"0.0290284121501\"/>\n <p x=\"-0.524039342068\" y=\"-0.512400852864\" z=\"0.372219680949\"/>\n <p x=\"0.540221588264\" y=\"0.112697448191\" z=\"0.833942396539\"/>\n <p x=\"0.647662378071\" y=\"-0.336191440125\" z=\"0.683746122196\"/>\n <p x=\"0.912517604047\" y=\"-0.299445032297\" z=\"0.278647258979\"/>\n <p x=\"0.968766345992\" y=\"0.172154385021\" z=\"0.17847866705\"/>\n <p x=\"0.738674754362\" y=\"0.426872446171\" z=\"0.521669935849\"/>\n <p x=\"0.303948928602\" y=\"0.520088624507\" z=\"0.716420747679\"/>\n <p x=\"-0.169360641636\" y=\"0.416197508206\" z=\"0.688342911756\"/>\n <p x=\"-0.22560938358\" y=\"-0.0554019091127\" z=\"0.788511503685\"/>\n <p x=\"0.212936552311\" y=\"-0.242975261789\" z=\"0.878496934025\"/>\n <p x=\"-0.118168593774\" y=\"-0.504290797429\" z=\"0.638315229342\"/>\n <p x=\"0.111922997856\" y=\"-0.759008858579\" z=\"0.295123960543\"/>\n <p x=\"0.585232568094\" y=\"-0.655117742278\" z=\"0.323201796466\"/>\n <p x=\"0.376778223832\" y=\"-0.72226245075\" z=\"-0.109974902673\"/>\n <p x=\"0.57523138993\" y=\"-0.408087452771\" z=\"-0.422247363363\"/>\n <p x=\"0.906336536014\" y=\"-0.146771917131\" z=\"-0.18206565868\"/>\n <p x=\"0.631480131874\" y=\"0.0635119645477\" z=\"-0.522415955292\"/>\n <p x=\"0.524039342068\" y=\"0.512400852864\" z=\"-0.372219680949\"/>\n <p x=\"0.732493686329\" y=\"0.579545561337\" z=\"0.06095701819\"/>\n <p x=\"0.293947750438\" y=\"0.767118914013\" z=\"-0.0290284121501\"/>\n <p x=\"0.0290925244616\" y=\"0.730372506185\" z=\"0.376070451067\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>0</v><v>5</v><v>6</v><v>7</v><v>8</v></f>\n <f><v>0</v><v>8</v><v>1</v></f>\n <f><v>8</v><v>7</v><v>9</v></f>\n <f><v>1</v><v>8</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>1</v><v>11</v><v>2</v></f>\n <f><v>11</v><v>10</v><v>12</v></f>\n <f><v>2</v><v>11</v><v>12</v><v>13</v><v>14</v></f>\n <f><v>2</v><v>14</v><v>3</v></f>\n <f><v>14</v><v>13</v><v>15</v></f>\n <f><v>3</v><v>14</v><v>15</v><v>16</v><v>17</v></f>\n <f><v>3</v><v>17</v><v>4</v></f>\n <f><v>17</v><v>16</v><v>18</v></f>\n <f><v>4</v><v>17</v><v>18</v><v>19</v><v>5</v></f>\n <f><v>4</v><v>5</v><v>0</v></f>\n <f><v>5</v><v>19</v><v>6</v></f>\n <f><v>20</v><v>21</v><v>22</v><v>23</v><v>24</v></f>\n <f><v>20</v><v>25</v><v>26</v><v>27</v><v>28</v></f>\n <f><v>20</v><v>28</v><v>21</v></f>\n <f><v>28</v><v>27</v><v>29</v></f>\n <f><v>21</v><v>28</v><v>29</v><v>30</v><v>31</v></f>\n <f><v>21</v><v>31</v><v>22</v></f>\n <f><v>31</v><v>30</v><v>32</v></f>\n <f><v>22</v><v>31</v><v>32</v><v>33</v><v>34</v></f>\n <f><v>22</v><v>34</v><v>23</v></f>\n <f><v>34</v><v>33</v><v>35</v></f>\n <f><v>23</v><v>34</v><v>35</v><v>36</v><v>37</v></f>\n <f><v>23</v><v>37</v><v>24</v></f>\n <f><v>37</v><v>36</v><v>38</v></f>\n <f><v>24</v><v>37</v><v>38</v><v>39</v><v>25</v></f>\n <f><v>24</v><v>25</v><v>20</v></f>\n <f><v>25</v><v>39</v><v>26</v></f>\n <f><v>15</v><v>33</v><v>32</v><v>16</v></f>\n <f><v>16</v><v>32</v><v>30</v><v>18</v></f>\n <f><v>18</v><v>30</v><v>29</v><v>19</v></f>\n <f><v>19</v><v>29</v><v>27</v><v>6</v></f>\n <f><v>6</v><v>27</v><v>26</v><v>7</v></f>\n <f><v>7</v><v>26</v><v>39</v><v>9</v></f>\n <f><v>9</v><v>39</v><v>38</v><v>10</v></f>\n <f><v>10</v><v>38</v><v>36</v><v>12</v></f>\n <f><v>12</v><v>36</v><v>35</v><v>13</v></f>\n <f><v>13</v><v>35</v><v>33</v><v>15</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_pentagonal_orthocupolarotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.733498559256\" y=\"0.294602586659\" z=\"-0.378257079029\"/>\n <p x=\"-0.61912119874\" y=\"0.617747852281\" z=\"0.0544588891351\"/>\n <p x=\"-0.134735895567\" y=\"0.864923493221\" z=\"-0.0405318103674\"/>\n <p x=\"0.0502533249283\" y=\"0.694541174893\" z=\"-0.531955259439\"/>\n <p x=\"-0.319802352426\" y=\"0.342063470143\" z=\"-0.740680954331\"/>\n <p x=\"-0.99729405877\" y=\"-0.0579270056629\" z=\"-0.0452661281467\"/>\n <p x=\"-0.882916698254\" y=\"0.265218259958\" z=\"0.387449840017\"/>\n <p x=\"-0.5128610209\" y=\"0.617695964708\" z=\"0.59617553491\"/>\n <p x=\"-0.0284757177273\" y=\"0.864871605649\" z=\"0.501184835407\"/>\n <p x=\"0.385220489103\" y=\"0.912332489132\" z=\"0.138760960104\"/>\n <p x=\"0.570209709598\" y=\"0.741950170803\" z=\"-0.352662488967\"/>\n <p x=\"0.455832349082\" y=\"0.418804905182\" z=\"-0.785378457131\"/>\n <p x=\"0.0857766717284\" y=\"0.0663272004323\" z=\"-0.994104152023\"/>\n <p x=\"-0.398608631444\" y=\"-0.180848440508\" z=\"-0.899113452521\"/>\n <p x=\"-0.812304838274\" y=\"-0.228309323992\" z=\"-0.536689577218\"/>\n <p x=\"0.141769030677\" y=\"-0.600902618195\" z=\"0.763405487986\"/>\n <p x=\"0.0273916701612\" y=\"-0.924047883816\" z=\"0.330689519822\"/>\n <p x=\"0.441087876991\" y=\"-0.876587000333\" z=\"-0.0317343554809\"/>\n <p x=\"0.811143554345\" y=\"-0.524109295583\" z=\"0.176991339412\"/>\n <p x=\"0.62615433385\" y=\"-0.353726977254\" z=\"0.668414788483\"/>\n <p x=\"0.220575309696\" y=\"-0.0779907075438\" z=\"0.921837986175\"/>\n <p x=\"-0.250676116014\" y=\"0.19777763045\" z=\"0.840461884507\"/>\n <p x=\"-0.620731793368\" y=\"-0.1547000743\" z=\"0.631736189614\"/>\n <p x=\"-0.378187353993\" y=\"-0.648311614106\" z=\"0.584112717514\"/>\n <p x=\"-0.735109153884\" y=\"-0.477845339921\" z=\"0.199020221451\"/>\n <p x=\"-0.550119933389\" y=\"-0.64822765825\" z=\"-0.292403227621\"/>\n <p x=\"-0.0788685076788\" y=\"-0.923995996244\" z=\"-0.211027125953\"/>\n <p x=\"-0.136423726558\" y=\"-0.600766774767\" z=\"-0.654827102923\"/>\n <p x=\"0.347961576614\" y=\"-0.353591133826\" z=\"-0.749817802426\"/>\n <p x=\"0.704883376505\" y=\"-0.524057408011\" z=\"-0.364725306363\"/>\n <p x=\"0.718017253968\" y=\"-0.00111342907631\" z=\"-0.541092107534\"/>\n <p x=\"0.832394614484\" y=\"0.322031836545\" z=\"-0.10837613937\"/>\n <p x=\"0.889949833364\" y=\"-0.00119738493188\" z=\"0.335423837601\"/>\n <p x=\"0.647405393988\" y=\"0.492414154874\" z=\"0.383047309702\"/>\n <p x=\"0.233709187158\" y=\"0.44495327139\" z=\"0.745471185004\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v></f>\n <f><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>9</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>11</v></f>\n <f><v>4</v><v>3</v><v>11</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>4</v><v>13</v><v>14</v></f>\n <f><v>0</v><v>14</v><v>5</v></f>\n <f><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>15</v><v>20</v><v>21</v><v>22</v><v>23</v></f>\n <f><v>15</v><v>23</v><v>16</v></f>\n <f><v>23</v><v>22</v><v>24</v></f>\n <f><v>16</v><v>23</v><v>24</v><v>25</v><v>26</v></f>\n <f><v>16</v><v>26</v><v>17</v></f>\n <f><v>26</v><v>25</v><v>27</v></f>\n <f><v>17</v><v>26</v><v>27</v><v>28</v><v>29</v></f>\n <f><v>17</v><v>29</v><v>18</v></f>\n <f><v>29</v><v>28</v><v>30</v></f>\n <f><v>18</v><v>29</v><v>30</v><v>31</v><v>32</v></f>\n <f><v>18</v><v>32</v><v>19</v></f>\n <f><v>32</v><v>31</v><v>33</v></f>\n <f><v>19</v><v>32</v><v>33</v><v>34</v><v>20</v></f>\n <f><v>19</v><v>20</v><v>15</v></f>\n <f><v>20</v><v>34</v><v>21</v></f>\n <f><v>11</v><v>30</v><v>28</v><v>12</v></f>\n <f><v>12</v><v>28</v><v>27</v><v>13</v></f>\n <f><v>13</v><v>27</v><v>25</v><v>14</v></f>\n <f><v>14</v><v>25</v><v>24</v><v>5</v></f>\n <f><v>5</v><v>24</v><v>22</v><v>6</v></f>\n <f><v>6</v><v>22</v><v>21</v><v>7</v></f>\n <f><v>7</v><v>21</v><v>34</v><v>8</v></f>\n <f><v>8</v><v>34</v><v>33</v><v>9</v></f>\n <f><v>9</v><v>33</v><v>31</v><v>10</v></f>\n <f><v>10</v><v>31</v><v>30</v><v>11</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_pentagonal_pyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.55296420557\" y=\"-0.669781002172\" z=\"0.495604677628\"/>\n <p x=\"-0.284537545952\" y=\"-0.383838710846\" z=\"0.878468114959\"/>\n <p x=\"-0.931948239693\" y=\"-0.322067110999\" z=\"0.166569068395\"/>\n <p x=\"-0.494568301583\" y=\"-0.56983245408\" z=\"-0.65627217627\"/>\n <p x=\"0.423158059908\" y=\"-0.784731457186\" z=\"-0.452916986255\"/>\n <p x=\"-0.684182896612\" y=\"0.598374064775\" z=\"0.0211147246142\"/>\n <p x=\"-0.0367722028708\" y=\"0.536602464928\" z=\"0.733013771178\"/>\n <p x=\"0.231036928094\" y=\"0.858295591697\" z=\"-0.135633678008\"/>\n <p x=\"0.800729548651\" y=\"0.250660173601\" z=\"0.350150333847\"/>\n <p x=\"0.670923402989\" y=\"0.135709718588\" z=\"-0.598371330036\"/>\n <p x=\"-0.246802958502\" y=\"0.350608721694\" z=\"-0.801726520052\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>2</v><v>1</v><v>6</v></f>\n <f><v>7</v><v>5</v><v>6</v></f>\n <f><v>6</v><v>1</v><v>0</v><v>8</v></f>\n <f><v>7</v><v>6</v><v>8</v></f>\n <f><v>8</v><v>0</v><v>4</v><v>9</v></f>\n <f><v>7</v><v>8</v><v>9</v></f>\n <f><v>9</v><v>4</v><v>3</v><v>10</v></f>\n <f><v>7</v><v>9</v><v>10</v></f>\n <f><v>10</v><v>3</v><v>2</v><v>5</v></f>\n <f><v>7</v><v>10</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_pentagonal_rotunds.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.57151775471\" y=\"-0.803491057782\" z=\"0.166642059862\"/>\n <p x=\"0.134202406402\" y=\"-0.989950803685\" z=\"-0.0445771286466\"/>\n <p x=\"-0.243893133273\" y=\"-0.889085796682\" z=\"-0.387353308597\"/>\n <p x=\"-0.418349219154\" y=\"-0.539423041171\" z=\"-0.730757629784\"/>\n <p x=\"-0.32252955598\" y=\"-0.0745218251579\" z=\"-0.943621313396\"/>\n <p x=\"0.00696600170907\" y=\"0.328041388251\" z=\"-0.944637667264\"/>\n <p x=\"0.444281350017\" y=\"0.514501134154\" z=\"-0.733418478756\"/>\n <p x=\"0.822376889692\" y=\"0.41363612715\" z=\"-0.390642298805\"/>\n <p x=\"0.996832975574\" y=\"0.0639733716395\" z=\"-0.0472379776191\"/>\n <p x=\"0.901013312399\" y=\"-0.400927844373\" z=\"0.165625705993\"/>\n <p x=\"-0.337879802891\" y=\"-0.0576806402032\" z=\"0.750476991806\"/>\n <p x=\"-0.00838424520228\" y=\"0.344882573206\" z=\"0.749460637938\"/>\n <p x=\"-0.182840331084\" y=\"0.694545328717\" z=\"0.406056316752\"/>\n <p x=\"-0.620155679392\" y=\"0.508085582813\" z=\"0.194837128244\"/>\n <p x=\"-0.715975342566\" y=\"0.0431843668006\" z=\"0.407700811856\"/>\n <p x=\"-0.534288725194\" y=\"-0.441522408662\" z=\"0.459419388696\"/>\n <p x=\"-0.144493939808\" y=\"-0.760893229925\" z=\"0.330238120261\"/>\n <p x=\"0.2928214085\" y=\"-0.574433484021\" z=\"0.541457308769\"/>\n <p x=\"0.173302372171\" y=\"-0.139824202257\" z=\"0.801179214778\"/>\n <p x=\"0.622316966188\" y=\"-0.171870270612\" z=\"0.5404409549\"/>\n <p x=\"0.718136629363\" y=\"0.2930309454\" z=\"0.327577271288\"/>\n <p x=\"0.328341843978\" y=\"0.612401766663\" z=\"0.456758539723\"/>\n <p x=\"0.543680543481\" y=\"0.642693700911\" z=\"-0.015827049898\"/>\n <p x=\"0.165585003806\" y=\"0.743558707915\" z=\"-0.358603229849\"/>\n <p x=\"-0.283429590212\" y=\"0.775604776271\" z=\"-0.0978649699711\"/>\n <p x=\"-0.271730344502\" y=\"0.557098962012\" z=\"-0.569822418357\"/>\n <p x=\"-0.601225902191\" y=\"0.154535748603\" z=\"-0.568806064488\"/>\n <p x=\"-0.816564601694\" y=\"0.124243814355\" z=\"-0.0962204748671\"/>\n <p x=\"-0.697045565365\" y=\"-0.31036546741\" z=\"-0.355942380876\"/>\n <p x=\"-0.522589479484\" y=\"-0.660028222921\" z=\"-0.01253805969\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>11</v><v>12</v><v>13</v><v>14</v></f>\n <f><v>10</v><v>15</v><v>16</v><v>17</v><v>18</v></f>\n <f><v>10</v><v>18</v><v>11</v></f>\n <f><v>18</v><v>17</v><v>19</v></f>\n <f><v>11</v><v>18</v><v>19</v><v>20</v><v>21</v></f>\n <f><v>11</v><v>21</v><v>12</v></f>\n <f><v>21</v><v>20</v><v>22</v></f>\n <f><v>12</v><v>21</v><v>22</v><v>23</v><v>24</v></f>\n <f><v>12</v><v>24</v><v>13</v></f>\n <f><v>24</v><v>23</v><v>25</v></f>\n <f><v>13</v><v>24</v><v>25</v><v>26</v><v>27</v></f>\n <f><v>13</v><v>27</v><v>14</v></f>\n <f><v>27</v><v>26</v><v>28</v></f>\n <f><v>14</v><v>27</v><v>28</v><v>29</v><v>15</v></f>\n <f><v>14</v><v>15</v><v>10</v></f>\n <f><v>15</v><v>29</v><v>16</v></f>\n <f><v>25</v><v>5</v><v>4</v><v>26</v></f>\n <f><v>26</v><v>4</v><v>3</v><v>28</v></f>\n <f><v>28</v><v>3</v><v>2</v><v>29</v></f>\n <f><v>29</v><v>2</v><v>1</v><v>16</v></f>\n <f><v>16</v><v>1</v><v>0</v><v>17</v></f>\n <f><v>17</v><v>0</v><v>9</v><v>19</v></f>\n <f><v>19</v><v>9</v><v>8</v><v>20</v></f>\n <f><v>20</v><v>8</v><v>7</v><v>22</v></f>\n <f><v>22</v><v>7</v><v>6</v><v>23</v></f>\n <f><v>23</v><v>6</v><v>5</v><v>25</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_square_cupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.889250511108\" y=\"-0.230200390658\" z=\"-0.395273713565\"/>\n <p x=\"0.425089443056\" y=\"-0.241758379185\" z=\"-0.872268222221\"/>\n <p x=\"-0.141334339513\" y=\"0.0889088437177\" z=\"-0.985961369417\"/>\n <p x=\"-0.478217466821\" y=\"0.568100903506\" z=\"-0.669753251476\"/>\n <p x=\"-0.388218371825\" y=\"0.915113590539\" z=\"-0.108874295354\"/>\n <p x=\"0.0759426962265\" y=\"0.926671579066\" z=\"0.368120213301\"/>\n <p x=\"0.642366478795\" y=\"0.596004356163\" z=\"0.481813360498\"/>\n <p x=\"0.979249606103\" y=\"0.116812296374\" z=\"0.165605242557\"/>\n <p x=\"-0.726104605522\" y=\"0.453221581279\" z=\"0.231113219625\"/>\n <p x=\"-0.816103700517\" y=\"0.106208894247\" z=\"-0.329765736497\"/>\n <p x=\"-0.47922057321\" y=\"-0.372983165542\" z=\"-0.645973854438\"/>\n <p x=\"0.0872032093594\" y=\"-0.703650388445\" z=\"-0.532280707241\"/>\n <p x=\"0.551364277411\" y=\"-0.692092399917\" z=\"-0.0552861985859\"/>\n <p x=\"0.641363372407\" y=\"-0.345079712885\" z=\"0.505592757536\"/>\n <p x=\"0.304480245099\" y=\"0.134112346904\" z=\"0.821800875477\"/>\n <p x=\"-0.26194353747\" y=\"0.464779569806\" z=\"0.708107728281\"/>\n <p x=\"-0.389930781544\" y=\"-0.691417405401\" z=\"-0.0682803254183\"/>\n <p x=\"0.0742302865081\" y=\"-0.679859416873\" z=\"0.408714183237\"/>\n <p x=\"-0.2626528408\" y=\"-0.200667357084\" z=\"0.724922301179\"/>\n <p x=\"-0.726813908852\" y=\"-0.212225345612\" z=\"0.247927792523\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v></f>\n <f><v>8</v><v>4</v><v>3</v><v>9</v></f>\n <f><v>9</v><v>3</v><v>2</v><v>10</v></f>\n <f><v>10</v><v>2</v><v>1</v><v>11</v></f>\n <f><v>11</v><v>1</v><v>0</v><v>12</v></f>\n <f><v>12</v><v>0</v><v>7</v><v>13</v></f>\n <f><v>13</v><v>7</v><v>6</v><v>14</v></f>\n <f><v>14</v><v>6</v><v>5</v><v>15</v></f>\n <f><v>15</v><v>5</v><v>4</v><v>8</v></f>\n <f><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>17</v><v>16</v><v>11</v><v>12</v></f>\n <f><v>17</v><v>12</v><v>13</v></f>\n <f><v>18</v><v>17</v><v>13</v><v>14</v></f>\n <f><v>18</v><v>14</v><v>15</v></f>\n <f><v>19</v><v>18</v><v>15</v><v>8</v></f>\n <f><v>19</v><v>8</v><v>9</v></f>\n <f><v>16</v><v>19</v><v>9</v><v>10</v></f>\n <f><v>16</v><v>10</v><v>11</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_square_dipyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.523943317932\" y=\"-0.261971658966\" z=\"0.414213562373\"/>\n <p x=\"0.523943317932\" y=\"-0.261971658966\" z=\"-0.414213562373\"/>\n <p x=\"0.261971658966\" y=\"0.523943317932\" z=\"-0.414213562373\"/>\n <p x=\"0.261971658966\" y=\"0.523943317932\" z=\"0.414213562373\"/>\n <p x=\"0.316227766017\" y=\"-0.948683298051\" z=\"4.65355148134E-16\"/>\n <p x=\"-0.316227766017\" y=\"0.948683298051\" z=\"0\"/>\n <p x=\"-0.261971658966\" y=\"-0.523943317932\" z=\"-0.414213562373\"/>\n <p x=\"-0.523943317932\" y=\"0.261971658966\" z=\"-0.414213562373\"/>\n <p x=\"-0.261971658966\" y=\"-0.523943317932\" z=\"0.414213562373\"/>\n <p x=\"-0.523943317932\" y=\"0.261971658966\" z=\"0.414213562373\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>1</v><v>0</v><v>4</v></f>\n <f><v>3</v><v>2</v><v>5</v></f>\n <f><v>1</v><v>6</v><v>7</v><v>2</v></f>\n <f><v>6</v><v>1</v><v>4</v></f>\n <f><v>2</v><v>7</v><v>5</v></f>\n <f><v>6</v><v>8</v><v>9</v><v>7</v></f>\n <f><v>8</v><v>6</v><v>4</v></f>\n <f><v>7</v><v>9</v><v>5</v></f>\n <f><v>8</v><v>0</v><v>3</v><v>9</v></f>\n <f><v>0</v><v>8</v><v>4</v></f>\n <f><v>9</v><v>3</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_square_gyrobicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.862856209244\" y=\"0.357406744598\" z=\"-0.357406744598\"/>\n <p x=\"-0.357406744598\" y=\"0.357406744598\" z=\"-0.862856209244\"/>\n <p x=\"-0.357406744598\" y=\"0.862856209244\" z=\"-0.357406744598\"/>\n <p x=\"-0.862856209244\" y=\"-0.357406744598\" z=\"-0.357406744598\"/>\n <p x=\"-0.357406744598\" y=\"-0.357406744598\" z=\"-0.862856209244\"/>\n <p x=\"-0.357406744598\" y=\"-0.862856209244\" z=\"-0.357406744598\"/>\n <p x=\"0.357406744598\" y=\"0.357406744598\" z=\"-0.862856209244\"/>\n <p x=\"0.357406744598\" y=\"0.862856209244\" z=\"-0.357406744598\"/>\n <p x=\"0.357406744598\" y=\"-0.357406744598\" z=\"-0.862856209244\"/>\n <p x=\"0.357406744598\" y=\"-0.862856209244\" z=\"-0.357406744598\"/>\n <p x=\"0.862856209244\" y=\"0.357406744598\" z=\"-0.357406744598\"/>\n <p x=\"0.862856209244\" y=\"-0.357406744598\" z=\"-0.357406744598\"/>\n <p x=\"0.862856209244\" y=\"0.357406744598\" z=\"0.357406744598\"/>\n <p x=\"0.862856209244\" y=\"-0.357406744598\" z=\"0.357406744598\"/>\n <p x=\"0.505449464646\" y=\"-6.61335328349E-18\" z=\"0.862856209244\"/>\n <p x=\"1.3226706567E-17\" y=\"0.505449464646\" z=\"0.862856209244\"/>\n <p x=\"0.357406744598\" y=\"0.862856209244\" z=\"0.357406744598\"/>\n <p x=\"0.357406744598\" y=\"-0.862856209244\" z=\"0.357406744598\"/>\n <p x=\"1.3226706567E-17\" y=\"-0.505449464646\" z=\"0.862856209244\"/>\n <p x=\"-0.357406744598\" y=\"0.862856209244\" z=\"0.357406744598\"/>\n <p x=\"-0.505449464646\" y=\"-6.61335328349E-18\" z=\"0.862856209244\"/>\n <p x=\"-0.357406744598\" y=\"-0.862856209244\" z=\"0.357406744598\"/>\n <p x=\"-0.862856209244\" y=\"0.357406744598\" z=\"0.357406744598\"/>\n <p x=\"-0.862856209244\" y=\"-0.357406744598\" z=\"0.357406744598\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>0</v><v>3</v><v>4</v><v>1</v></f>\n <f><v>3</v><v>5</v><v>4</v></f>\n <f><v>2</v><v>1</v><v>6</v><v>7</v></f>\n <f><v>1</v><v>4</v><v>8</v><v>6</v></f>\n <f><v>4</v><v>5</v><v>9</v><v>8</v></f>\n <f><v>7</v><v>6</v><v>10</v></f>\n <f><v>6</v><v>8</v><v>11</v><v>10</v></f>\n <f><v>8</v><v>9</v><v>11</v></f>\n <f><v>12</v><v>13</v><v>14</v></f>\n <f><v>12</v><v>14</v><v>15</v><v>16</v></f>\n <f><v>13</v><v>17</v><v>18</v><v>14</v></f>\n <f><v>16</v><v>15</v><v>19</v></f>\n <f><v>14</v><v>18</v><v>20</v><v>15</v></f>\n <f><v>17</v><v>21</v><v>18</v></f>\n <f><v>15</v><v>20</v><v>22</v><v>19</v></f>\n <f><v>20</v><v>23</v><v>22</v></f>\n <f><v>18</v><v>21</v><v>23</v><v>20</v></f>\n <f><v>0</v><v>2</v><v>19</v><v>22</v></f>\n <f><v>2</v><v>7</v><v>16</v><v>19</v></f>\n <f><v>7</v><v>10</v><v>12</v><v>16</v></f>\n <f><v>10</v><v>11</v><v>13</v><v>12</v></f>\n <f><v>9</v><v>17</v><v>13</v><v>11</v></f>\n <f><v>5</v><v>21</v><v>17</v><v>9</v></f>\n <f><v>3</v><v>23</v><v>21</v><v>5</v></f>\n <f><v>0</v><v>22</v><v>23</v><v>3</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_square_pyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.712521044308\" y=\"0.520120853441\" z=\"0.0731531570105\"/>\n <p x=\"-0.401860872528\" y=\"0.227227634628\" z=\"-0.755273967736\"/>\n <p x=\"-0.401860872528\" y=\"-0.651452021812\" z=\"-0.444613795956\"/>\n <p x=\"-0.712521044308\" y=\"-0.358558802999\" z=\"0.38381332879\"/>\n <p x=\"0.476818783912\" y=\"0.330781025221\" z=\"-0.462380748922\"/>\n <p x=\"0.166158612133\" y=\"0.623674244035\" z=\"0.366046375824\"/>\n <p x=\"0.942809041582\" y=\"0.111111111111\" z=\"0.314269680527\"/>\n <p x=\"0.166158612133\" y=\"-0.255005412406\" z=\"0.676706547604\"/>\n <p x=\"0.476818783912\" y=\"-0.547898631219\" z=\"-0.151720577142\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>4</v><v>1</v><v>0</v><v>5</v></f>\n <f><v>6</v><v>4</v><v>5</v></f>\n <f><v>5</v><v>0</v><v>3</v><v>7</v></f>\n <f><v>6</v><v>5</v><v>7</v></f>\n <f><v>7</v><v>3</v><v>2</v><v>8</v></f>\n <f><v>6</v><v>7</v><v>8</v></f>\n <f><v>8</v><v>2</v><v>1</v><v>4</v></f>\n <f><v>6</v><v>8</v><v>4</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_triangular_cupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.899608959533\" y=\"0.351507569693\" z=\"-0.259125738545\"/>\n <p x=\"0.324649208201\" y=\"0.545759094447\" z=\"-0.772495891538\"/>\n <p x=\"-0.388533739872\" y=\"0.771564992033\" z=\"-0.503715193388\"/>\n <p x=\"-0.526756936614\" y=\"0.803119364865\" z=\"0.278435657754\"/>\n <p x=\"0.0482028147181\" y=\"0.608867840111\" z=\"0.791805810747\"/>\n <p x=\"0.761385762791\" y=\"0.383061942525\" z=\"0.523025112597\"/>\n <p x=\"-0.770994036669\" y=\"0.0467798070565\" z=\"0.265786675369\"/>\n <p x=\"-0.632770839928\" y=\"0.0152254342247\" z=\"-0.516364175773\"/>\n <p x=\"0.0804121081455\" y=\"-0.210580463361\" z=\"-0.785144873922\"/>\n <p x=\"0.655371859477\" y=\"-0.404831988115\" z=\"-0.271774720929\"/>\n <p x=\"0.517148662736\" y=\"-0.373277615283\" z=\"0.510376130213\"/>\n <p x=\"-0.196034285338\" y=\"-0.147471717697\" z=\"0.779156828362\"/>\n <p x=\"-0.402808697257\" y=\"-0.742342369526\" z=\"-0.445162208361\"/>\n <p x=\"0.172151054074\" y=\"-0.93659389428\" z=\"0.0682079446321\"/>\n <p x=\"-0.541031893999\" y=\"-0.710787996694\" z=\"0.336988642781\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v></f>\n <f><v>6</v><v>3</v><v>2</v><v>7</v></f>\n <f><v>7</v><v>2</v><v>1</v><v>8</v></f>\n <f><v>8</v><v>1</v><v>0</v><v>9</v></f>\n <f><v>9</v><v>0</v><v>5</v><v>10</v></f>\n <f><v>10</v><v>5</v><v>4</v><v>11</v></f>\n <f><v>11</v><v>4</v><v>3</v><v>6</v></f>\n <f><v>12</v><v>13</v><v>14</v></f>\n <f><v>13</v><v>12</v><v>8</v><v>9</v></f>\n <f><v>13</v><v>9</v><v>10</v></f>\n <f><v>14</v><v>13</v><v>10</v><v>11</v></f>\n <f><v>14</v><v>11</v><v>6</v></f>\n <f><v>12</v><v>14</v><v>6</v><v>7</v></f>\n <f><v>12</v><v>7</v><v>8</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_triangular_dipyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.480408032346\" y=\"-0.240204016173\" z=\"0.219275263435\"/>\n <p x=\"0.120102008086\" y=\"-0.360306024259\" z=\"-0.438550526871\"/>\n <p x=\"-0.120102008086\" y=\"0.360306024259\" z=\"-0.438550526871\"/>\n <p x=\"0.240204016173\" y=\"0.480408032346\" z=\"0.219275263435\"/>\n <p x=\"0.316227766017\" y=\"-0.948683298051\" z=\"0\"/>\n <p x=\"-0.316227766017\" y=\"0.948683298051\" z=\"0\"/>\n <p x=\"-0.240204016173\" y=\"-0.480408032346\" z=\"0.219275263435\"/>\n <p x=\"-0.480408032346\" y=\"0.240204016173\" z=\"0.219275263435\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>1</v><v>0</v><v>4</v></f>\n <f><v>3</v><v>2</v><v>5</v></f>\n <f><v>1</v><v>6</v><v>7</v><v>2</v></f>\n <f><v>6</v><v>1</v><v>4</v></f>\n <f><v>2</v><v>7</v><v>5</v></f>\n <f><v>6</v><v>0</v><v>3</v><v>7</v></f>\n <f><v>0</v><v>6</v><v>4</v></f>\n <f><v>7</v><v>3</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_triangular_gyrobicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.495455070411\" y=\"0.173083366756\" z=\"-0.851214674073\"/>\n <p x=\"0.168227163083\" y=\"0.372197127242\" z=\"-0.912780871882\"/>\n <p x=\"0.00221249043393\" y=\"-0.302125427247\" z=\"-0.953265614137\"/>\n <p x=\"-0.538814068123\" y=\"0.505991892908\" z=\"-0.241950606598\"/>\n <p x=\"0.124868165371\" y=\"0.705105653394\" z=\"-0.303516804407\"/>\n <p x=\"0.622535726216\" y=\"0.229896859391\" z=\"-0.405567744472\"/>\n <p x=\"0.456521053566\" y=\"-0.444425695098\" z=\"-0.446052486727\"/>\n <p x=\"-0.207161179927\" y=\"-0.643539455584\" z=\"-0.384486288918\"/>\n <p x=\"-0.704828740772\" y=\"-0.168330661581\" z=\"-0.282435348853\"/>\n <p x=\"0.495455070411\" y=\"-0.173083366756\" z=\"0.851214674073\"/>\n <p x=\"-0.00221249043393\" y=\"0.302125427247\" z=\"0.953265614137\"/>\n <p x=\"-0.168227163083\" y=\"-0.372197127242\" z=\"0.912780871882\"/>\n <p x=\"0.704828740772\" y=\"0.168330661581\" z=\"0.282435348853\"/>\n <p x=\"0.207161179927\" y=\"0.643539455584\" z=\"0.384486288918\"/>\n <p x=\"-0.456521053566\" y=\"0.444425695098\" z=\"0.446052486727\"/>\n <p x=\"-0.622535726216\" y=\"-0.229896859391\" z=\"0.405567744472\"/>\n <p x=\"-0.124868165371\" y=\"-0.705105653394\" z=\"0.303516804407\"/>\n <p x=\"0.538814068123\" y=\"-0.505991892908\" z=\"0.241950606598\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>1</v><v>0</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>4</v><v>5</v></f>\n <f><v>2</v><v>1</v><v>5</v><v>6</v></f>\n <f><v>2</v><v>6</v><v>7</v></f>\n <f><v>0</v><v>2</v><v>7</v><v>8</v></f>\n <f><v>0</v><v>8</v><v>3</v></f>\n <f><v>9</v><v>10</v><v>11</v></f>\n <f><v>10</v><v>9</v><v>12</v><v>13</v></f>\n <f><v>10</v><v>13</v><v>14</v></f>\n <f><v>11</v><v>10</v><v>14</v><v>15</v></f>\n <f><v>11</v><v>15</v><v>16</v></f>\n <f><v>9</v><v>11</v><v>16</v><v>17</v></f>\n <f><v>9</v><v>17</v><v>12</v></f>\n <f><v>7</v><v>16</v><v>15</v><v>8</v></f>\n <f><v>8</v><v>15</v><v>14</v><v>3</v></f>\n <f><v>3</v><v>14</v><v>13</v><v>4</v></f>\n <f><v>4</v><v>13</v><v>12</v><v>5</v></f>\n <f><v>5</v><v>12</v><v>17</v><v>6</v></f>\n <f><v>6</v><v>17</v><v>16</v><v>7</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_triangular_orthobicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.05660096357\" y=\"0.0653594152457\" z=\"-0.996255227219\"/>\n <p x=\"0.685303594807\" y=\"0.153550801757\" z=\"-0.711885618779\"/>\n <p x=\"0.415942531464\" y=\"-0.485262243974\" z=\"-0.769098410538\"/>\n <p x=\"-0.212759709825\" y=\"0.516901856876\" z=\"-0.540771918614\"/>\n <p x=\"0.415942921412\" y=\"0.605093243388\" z=\"-0.256402310174\"/>\n <p x=\"0.775284489305\" y=\"0.0544715841677\" z=\"-0.0292454934936\"/>\n <p x=\"0.505923425962\" y=\"-0.584341461564\" z=\"-0.0864582852527\"/>\n <p x=\"-0.122779205274\" y=\"-0.672532848075\" z=\"-0.370827893693\"/>\n <p x=\"-0.482120773168\" y=\"-0.121911188855\" z=\"-0.597984710373\"/>\n <p x=\"-0.0865944650868\" y=\"0.331118819738\" z=\"0.939607218912\"/>\n <p x=\"-0.715297096323\" y=\"0.242927433227\" z=\"0.655237610472\"/>\n <p x=\"-0.35595552843\" y=\"-0.307694225993\" z=\"0.882394427153\"/>\n <p x=\"0.122779205274\" y=\"0.672532848075\" z=\"0.370827893693\"/>\n <p x=\"-0.505923425962\" y=\"0.584341461564\" z=\"0.0864582852527\"/>\n <p x=\"-0.775284489305\" y=\"-0.0544715841677\" z=\"0.0292454934936\"/>\n <p x=\"-0.415942921412\" y=\"-0.605093243388\" z=\"0.256402310174\"/>\n <p x=\"0.212759709825\" y=\"-0.516901856876\" z=\"0.540771918614\"/>\n <p x=\"0.482120773168\" y=\"0.121911188855\" z=\"0.597984710373\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>1</v><v>0</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>4</v><v>5</v></f>\n <f><v>2</v><v>1</v><v>5</v><v>6</v></f>\n <f><v>2</v><v>6</v><v>7</v></f>\n <f><v>0</v><v>2</v><v>7</v><v>8</v></f>\n <f><v>0</v><v>8</v><v>3</v></f>\n <f><v>9</v><v>10</v><v>11</v></f>\n <f><v>10</v><v>9</v><v>12</v><v>13</v></f>\n <f><v>10</v><v>13</v><v>14</v></f>\n <f><v>11</v><v>10</v><v>14</v><v>15</v></f>\n <f><v>11</v><v>15</v><v>16</v></f>\n <f><v>9</v><v>11</v><v>16</v><v>17</v></f>\n <f><v>9</v><v>17</v><v>12</v></f>\n <f><v>7</v><v>15</v><v>14</v><v>8</v></f>\n <f><v>8</v><v>14</v><v>13</v><v>3</v></f>\n <f><v>3</v><v>13</v><v>12</v><v>4</v></f>\n <f><v>4</v><v>12</v><v>17</v><v>5</v></f>\n <f><v>5</v><v>17</v><v>16</v><v>6</v></f>\n <f><v>6</v><v>16</v><v>15</v><v>7</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/elongated_triangular_pyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.59377726615\" y=\"-0.529962170696\" z=\"0.0124912032399\"/>\n <p x=\"-0.188693612729\" y=\"-0.260347115054\" z=\"-0.72814934905\"/>\n <p x=\"0.25440160057\" y=\"-0.742728083966\" z=\"-0.131233354142\"/>\n <p x=\"0.0671275279454\" y=\"0.482326970955\" z=\"-0.317876003403\"/>\n <p x=\"-0.337956125475\" y=\"0.212711915313\" z=\"0.422764548887\"/>\n <p x=\"0.288675134595\" y=\"0.838052481406\" z=\"0.462962962963\"/>\n <p x=\"0.510222741244\" y=\"-5.39979573207E-05\" z=\"0.279039991505\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>3</v><v>1</v><v>0</v><v>4</v></f>\n <f><v>5</v><v>3</v><v>4</v></f>\n <f><v>4</v><v>0</v><v>2</v><v>6</v></f>\n <f><v>5</v><v>4</v><v>6</v></f>\n <f><v>6</v><v>2</v><v>1</v><v>3</v></f>\n <f><v>5</v><v>6</v><v>3</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/great_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.64255649401\" y=\"0.714757316202\" z=\"-0.276121587229\"/>\n <p x=\"0.35299329878\" y=\"0.935418836572\" z=\"-0.0196807314936\"/>\n <p x=\"0.948967018505\" y=\"0.1137949165\" z=\"-0.29412975837\"/>\n <p x=\"0.321749240909\" y=\"-0.614658112451\" z=\"-0.720189440892\"/>\n <p x=\"-0.661866383725\" y=\"-0.243242923473\" z=\"-0.709059779052\"/>\n <p x=\"-0.948967018507\" y=\"-0.113794916498\" z=\"0.294129758369\"/>\n <p x=\"-0.142789344364\" y=\"-0.405206837394\" z=\"0.903005327813\"/>\n <p x=\"0.661866383725\" y=\"0.24324292347\" z=\"0.709059779052\"/>\n <p x=\"-0.321749240905\" y=\"0.61465811245\" z=\"0.720189440893\"/>\n <p x=\"0.642556494014\" y=\"-0.7147573162\" z=\"0.276121587228\"/>\n <p x=\"-0.352993298782\" y=\"-0.935418836574\" z=\"0.0196807314927\"/>\n <p x=\"0.142789344359\" y=\"0.405206837395\" z=\"-0.903005327812\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>8</v><v>6</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>7</v><v>6</v><v>10</v></f>\n <f><v>4</v><v>3</v><v>9</v><v>6</v><v>5</v></f>\n <f><v>0</v><v>4</v><v>10</v><v>6</v><v>8</v></f>\n <f><v>9</v><v>7</v><v>8</v><v>5</v><v>10</v></f>\n <f><v>7</v><v>9</v><v>3</v><v>11</v><v>1</v></f>\n <f><v>8</v><v>7</v><v>2</v><v>11</v><v>0</v></f>\n <f><v>5</v><v>8</v><v>1</v><v>11</v><v>4</v></f>\n <f><v>10</v><v>5</v><v>0</v><v>11</v><v>3</v></f>\n <f><v>9</v><v>10</v><v>4</v><v>11</v><v>2</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/great_icosahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.706986683415\" y=\"-0.0751949655658\" z=\"-0.703217993674\"/>\n <p x=\"0.407454925284\" y=\"-0.856122563519\" z=\"0.317859465952\"/>\n <p x=\"-0.125593324814\" y=\"0.717122332588\" z=\"0.685537655323\"/>\n <p x=\"-0.939687826386\" y=\"0.182537734629\" z=\"0.289252077567\"/>\n <p x=\"0.250925033734\" y=\"0.300102063657\" z=\"-0.920312652762\"/>\n <p x=\"0.939687826387\" y=\"-0.18253773463\" z=\"-0.289252077566\"/>\n <p x=\"-0.610245890182\" y=\"-0.789781083791\" z=\"0.0620144596134\"/>\n <p x=\"-0.250925033733\" y=\"-0.300102063659\" z=\"0.920312652762\"/>\n <p x=\"-0.407454925283\" y=\"0.856122563519\" z=\"-0.31785946595\"/>\n <p x=\"0.610245890181\" y=\"0.789781083792\" z=\"-0.0620144596113\"/>\n <p x=\"0.125593324816\" y=\"-0.717122332586\" z=\"-0.685537655324\"/>\n <p x=\"0.70698668341\" y=\"0.0751949655653\" z=\"0.703217993669\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>1</v><v>3</v><v>4</v></f>\n <f><v>0</v><v>2</v><v>5</v></f>\n <f><v>2</v><v>4</v><v>6</v></f>\n <f><v>0</v><v>5</v><v>7</v></f>\n <f><v>5</v><v>6</v><v>8</v></f>\n <f><v>0</v><v>7</v><v>9</v></f>\n <f><v>7</v><v>8</v><v>10</v></f>\n <f><v>0</v><v>9</v><v>1</v></f>\n <f><v>9</v><v>10</v><v>3</v></f>\n <f><v>4</v><v>2</v><v>1</v></f>\n <f><v>11</v><v>4</v><v>3</v></f>\n <f><v>6</v><v>5</v><v>2</v></f>\n <f><v>11</v><v>6</v><v>4</v></f>\n <f><v>8</v><v>7</v><v>5</v></f>\n <f><v>11</v><v>8</v><v>6</v></f>\n <f><v>10</v><v>9</v><v>7</v></f>\n <f><v>11</v><v>10</v><v>8</v></f>\n <f><v>3</v><v>1</v><v>9</v></f>\n <f><v>11</v><v>3</v><v>10</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/great_stellated_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.363826353279\" y=\"-0.925945775162\" z=\"0.101266016591\"/>\n <p x=\"0.184017406861\" y=\"0.817604443096\" z=\"-0.54558277887\"/>\n <p x=\"-0.0218551640846\" y=\"-0.263094752303\" z=\"0.964522422295\"/>\n <p x=\"0.491062599475\" y=\"-0.258036940791\" z=\"-0.832030324317\"/>\n <p x=\"-0.132983204452\" y=\"0.814478543672\" z=\"0.564747881118\"/>\n <p x=\"-0.864574660346\" y=\"0.438394709973\" z=\"-0.245602799158\"/>\n <p x=\"0.94321098509\" y=\"-0.0256043489457\" z=\"-0.331206061095\"/>\n <p x=\"-0.753446619978\" y=\"-0.639178586003\" z=\"0.154171742019\"/>\n <p x=\"0.557529467732\" y=\"0.637246673913\" z=\"0.532050344604\"/>\n <p x=\"-0.626210373782\" y=\"0.0287302483685\" z=\"-0.77912459889\"/>\n <p x=\"0.864574660345\" y=\"-0.438394709974\" z=\"0.245602799158\"/>\n <p x=\"-0.943210985096\" y=\"0.0256043489453\" z=\"0.331206061099\"/>\n <p x=\"0.753446619978\" y=\"0.639178586003\" z=\"-0.154171742019\"/>\n <p x=\"-0.557529467731\" y=\"-0.637246673914\" z=\"-0.532050344606\"/>\n <p x=\"0.626210373782\" y=\"-0.0287302483697\" z=\"0.779124598889\"/>\n <p x=\"-0.491062599474\" y=\"0.258036940791\" z=\"0.832030324316\"/>\n <p x=\"0.132983204453\" y=\"-0.814478543674\" z=\"-0.564747881119\"/>\n <p x=\"0.0218551640857\" y=\"0.263094752303\" z=\"-0.964522422297\"/>\n <p x=\"-0.184017406863\" y=\"-0.817604443088\" z=\"0.545582778872\"/>\n <p x=\"-0.363826353274\" y=\"0.925945775161\" z=\"-0.10126601659\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>4</v><v>3</v><v>11</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>4</v><v>13</v><v>14</v><v>5</v></f>\n <f><v>8</v><v>7</v><v>6</v><v>15</v><v>16</v></f>\n <f><v>7</v><v>8</v><v>9</v><v>2</v><v>1</v></f>\n <f><v>6</v><v>7</v><v>1</v><v>0</v><v>5</v></f>\n <f><v>15</v><v>6</v><v>5</v><v>14</v><v>17</v></f>\n <f><v>16</v><v>15</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>8</v><v>16</v><v>19</v><v>10</v><v>9</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyrate_bidiminished_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.413385761895\" y=\"0.812673930644\" z=\"-0.119142063979\"/>\n <p x=\"0.357415266401\" y=\"0.660184384135\" z=\"-0.495444270404\"/>\n <p x=\"-0.0452256891904\" y=\"0.729971976779\" z=\"-0.463836336054\"/>\n <p x=\"0.0107448063034\" y=\"0.882461523287\" z=\"-0.0875341296291\"/>\n <p x=\"-0.359149491892\" y=\"0.747107981794\" z=\"-0.200877570941\"/>\n <p x=\"-0.241086280324\" y=\"0.441177753503\" z=\"-0.678837810848\"/>\n <p x=\"-0.555010083025\" y=\"0.458313758518\" z=\"-0.415879045735\"/>\n <p x=\"0.410400471086\" y=\"0.328259056613\" z=\"-0.729980522941\"/>\n <p x=\"0.0405061728904\" y=\"0.19290551512\" z=\"-0.843323964253\"/>\n <p x=\"-0.337428233376\" y=\"0.0530313966995\" z=\"-0.768558168086\"/>\n <p x=\"-0.651352036078\" y=\"0.0701674017152\" z=\"-0.505599402973\"/>\n <p x=\"0.182208530465\" y=\"-0.19167140003\" z=\"-0.846509386026\"/>\n <p x=\"-0.195725875802\" y=\"-0.331545518451\" z=\"-0.77174358986\"/>\n <p x=\"0.129895308093\" y=\"-0.565657681649\" z=\"-0.68717735332\"/>\n <p x=\"-0.0964516213419\" y=\"-0.786203281484\" z=\"-0.426187287131\"/>\n <p x=\"-0.422072805236\" y=\"-0.552091118286\" z=\"-0.510753523671\"/>\n <p x=\"-0.70366525845\" y=\"-0.303818879904\" z=\"-0.346267370267\"/>\n <p x=\"-0.410375424044\" y=\"-0.769067276469\" z=\"-0.163228522018\"/>\n <p x=\"-0.691967877258\" y=\"-0.520795038086\" z=\"0.00125763138609\"/>\n <p x=\"-0.464447918949\" y=\"0.705047027698\" z=\"0.192990714302\"/>\n <p x=\"-0.094553620754\" y=\"0.84040056919\" z=\"0.306334155614\"/>\n <p x=\"-0.320900550188\" y=\"0.619854969355\" z=\"0.567324221803\"/>\n <p x=\"-0.725386516966\" y=\"0.390257705191\" z=\"0.221413226879\"/>\n <p x=\"-0.581839148205\" y=\"0.305065646848\" z=\"0.595746734379\"/>\n <p x=\"-0.78135701246\" y=\"0.237768158683\" z=\"-0.154888979546\"/>\n <p x=\"-0.777699739339\" y=\"0.0162714235721\" z=\"0.380745259585\"/>\n <p x=\"-0.601405713182\" y=\"-0.274061768907\" z=\"0.610127391423\"/>\n <p x=\"-0.405545122048\" y=\"0.0147324543691\" z=\"0.825128866218\"/>\n <p x=\"-0.833670234833\" y=\"-0.136218122936\" z=\"0.00444305315971\"/>\n <p x=\"-0.548420508497\" y=\"-0.605987096429\" z=\"0.375591138886\"/>\n <p x=\"-0.266828055283\" y=\"-0.854259334812\" z=\"0.211104985482\"/>\n <p x=\"0.0166623985197\" y=\"0.524072277481\" z=\"0.779140274823\"/>\n <p x=\"0.243009327954\" y=\"0.744617877316\" z=\"0.518150208634\"/>\n <p x=\"0.419303354111\" y=\"0.454284684837\" z=\"0.747532340473\"/>\n <p x=\"-0.0356508238528\" y=\"0.150085995862\" z=\"0.938472307529\"/>\n <p x=\"0.366990131739\" y=\"0.0802984032185\" z=\"0.906864373179\"/>\n <p x=\"0.701567789638\" y=\"-0.499899162686\" z=\"0.507841967238\"/>\n <p x=\"0.648582584953\" y=\"-0.167973835164\" z=\"0.742378219775\"/>\n <p x=\"0.135812900309\" y=\"-0.924046927455\" z=\"0.179497051132\"/>\n <p x=\"0.505707198504\" y=\"-0.788693385962\" z=\"0.292840492444\"/>\n <p x=\"0.733227156813\" y=\"0.437148679822\" z=\"0.48457357536\"/>\n <p x=\"0.556933130656\" y=\"0.727481872301\" z=\"0.255191443521\"/>\n <p x=\"0.874929514387\" y=\"0.0525717646717\" z=\"0.481388153586\"/>\n <p x=\"0.927914719072\" y=\"-0.279353562851\" z=\"0.246851901049\"/>\n <p x=\"0.871944223578\" y=\"-0.431843109359\" z=\"-0.129450305376\"/>\n <p x=\"0.728396854817\" y=\"-0.346651051016\" z=\"-0.503783812876\"/>\n <p x=\"0.55210282866\" y=\"-0.0563178585373\" z=\"-0.733165944715\"/>\n <p x=\"0.611005625562\" y=\"-0.746632431866\" z=\"-0.101027792799\"/>\n <p x=\"0.241111327366\" y=\"-0.881985973359\" z=\"-0.214371234111\"/>\n <p x=\"0.467458256801\" y=\"-0.661440373523\" z=\"-0.4753613003\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>5</v><v>6</v><v>4</v></f>\n <f><v>1</v><v>7</v><v>8</v><v>5</v><v>2</v></f>\n <f><v>8</v><v>9</v><v>5</v></f>\n <f><v>5</v><v>9</v><v>10</v><v>6</v></f>\n <f><v>11</v><v>12</v><v>9</v><v>8</v></f>\n <f><v>11</v><v>13</v><v>12</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>12</v></f>\n <f><v>12</v><v>15</v><v>16</v><v>10</v><v>9</v></f>\n <f><v>14</v><v>17</v><v>15</v></f>\n <f><v>15</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>3</v><v>4</v><v>19</v><v>20</v></f>\n <f><v>20</v><v>19</v><v>21</v></f>\n <f><v>19</v><v>22</v><v>23</v><v>21</v></f>\n <f><v>4</v><v>6</v><v>24</v><v>22</v><v>19</v></f>\n <f><v>22</v><v>25</v><v>23</v></f>\n <f><v>23</v><v>25</v><v>26</v><v>27</v></f>\n <f><v>24</v><v>28</v><v>25</v><v>22</v></f>\n <f><v>6</v><v>10</v><v>24</v></f>\n <f><v>10</v><v>16</v><v>28</v><v>24</v></f>\n <f><v>28</v><v>18</v><v>29</v><v>26</v><v>25</v></f>\n <f><v>16</v><v>18</v><v>28</v></f>\n <f><v>18</v><v>17</v><v>30</v><v>29</v></f>\n <f><v>20</v><v>21</v><v>31</v><v>32</v></f>\n <f><v>32</v><v>31</v><v>33</v></f>\n <f><v>31</v><v>34</v><v>35</v><v>33</v></f>\n <f><v>21</v><v>23</v><v>27</v><v>34</v><v>31</v></f>\n <f><v>36</v><v>37</v><v>35</v><v>34</v><v>27</v><v>26</v><v>29</v><v>30</v><v>38</v><v>39</v></f>\n <f><v>32</v><v>33</v><v>40</v><v>41</v></f>\n <f><v>41</v><v>40</v><v>42</v><v>43</v><v>44</v><v>45</v><v>46</v><v>7</v><v>1</v><v>0</v></f>\n <f><v>33</v><v>35</v><v>37</v><v>42</v><v>40</v></f>\n <f><v>37</v><v>36</v><v>43</v><v>42</v></f>\n <f><v>36</v><v>39</v><v>47</v><v>44</v><v>43</v></f>\n <f><v>39</v><v>38</v><v>48</v><v>47</v></f>\n <f><v>7</v><v>46</v><v>11</v><v>8</v></f>\n <f><v>44</v><v>47</v><v>49</v><v>45</v></f>\n <f><v>45</v><v>49</v><v>13</v><v>11</v><v>46</v></f>\n <f><v>47</v><v>48</v><v>49</v></f>\n <f><v>49</v><v>48</v><v>14</v><v>13</v></f>\n <f><v>0</v><v>3</v><v>20</v><v>32</v><v>41</v></f>\n <f><v>48</v><v>38</v><v>30</v><v>17</v><v>14</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyrate_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.169693140154\" y=\"0.437793250754\" z=\"-0.88291627878\"/>\n <p x=\"0.135963941913\" y=\"0.785909158335\" z=\"-0.603208462225\"/>\n <p x=\"0.549041599894\" y=\"0.703654521817\" z=\"-0.451024922332\"/>\n <p x=\"0.582770798135\" y=\"0.355538614236\" z=\"-0.730732738886\"/>\n <p x=\"0.847662051356\" y=\"0.379783676621\" z=\"-0.370450061696\"/>\n <p x=\"0.564566992947\" y=\"0.825138493332\" z=\"-0.0202588449743\"/>\n <p x=\"0.86318744441\" y=\"0.501267648136\" z=\"0.0603160156612\"/>\n <p x=\"-0.103806697659\" y=\"0.95822929095\" z=\"-0.266496985051\"/>\n <p x=\"0.161084555562\" y=\"0.982474353335\" z=\"0.0937856921392\"/>\n <p x=\"0.429360339081\" y=\"0.806590042946\" z=\"0.406278283896\"/>\n <p x=\"0.727980790544\" y=\"0.482719197749\" z=\"0.486853144531\"/>\n <p x=\"-0.193143290527\" y=\"0.913178277272\" z=\"0.358888490056\"/>\n <p x=\"0.075132492991\" y=\"0.737293966883\" z=\"0.671381081812\"/>\n <p x=\"-0.362813547878\" y=\"0.643719010913\" z=\"0.673789290483\"/>\n <p x=\"-0.28311794506\" y=\"0.277020835423\" z=\"0.918206690744\"/>\n <p x=\"0.154828095808\" y=\"0.370595791393\" z=\"0.915798482073\"/>\n <p x=\"0.558310533193\" y=\"0.21325993139\" z=\"0.801753944959\"/>\n <p x=\"0.0155025064024\" y=\"-0.0468500097737\" z=\"0.99878155138\"/>\n <p x=\"0.418984943787\" y=\"-0.204185869776\" z=\"0.884737014266\"/>\n <p x=\"0.917762433578\" y=\"-0.0619957223541\" z=\"-0.392260738443\"/>\n <p x=\"0.652871180356\" y=\"-0.0862407847386\" z=\"-0.752543415632\"/>\n <p x=\"0.732566783174\" y=\"-0.452938960229\" z=\"-0.508126015372\"/>\n <p x=\"0.976612245469\" y=\"-0.213546434935\" z=\"0.0250255993675\"/>\n <p x=\"0.791416595065\" y=\"-0.604489672809\" z=\"-0.0908396775618\"/>\n <p x=\"0.942883047228\" y=\"0.134569472646\" z=\"0.304733415922\"/>\n <p x=\"0.806942020022\" y=\"-0.483005727046\" z=\"0.339926435693\"/>\n <p x=\"0.473559984576\" y=\"-0.767449281935\" z=\"0.432160318246\"/>\n <p x=\"0.458034539901\" y=\"-0.888933211782\" z=\"0.00139418280501\"/>\n <p x=\"0.773212789877\" y=\"-0.134889793713\" z=\"0.61963421635\"/>\n <p x=\"0.233789325287\" y=\"-0.595129133403\" z=\"0.768871773235\"/>\n <p x=\"-0.169693144002\" y=\"-0.437793247648\" z=\"0.88291627445\"/>\n <p x=\"0.36281354403\" y=\"-0.643719007807\" z=\"-0.673789294813\"/>\n <p x=\"0.283117941213\" y=\"-0.277020832317\" z=\"-0.918206695073\"/>\n <p x=\"-0.0502641139509\" y=\"-0.561464371289\" z=\"-0.825972834707\"/>\n <p x=\"0.19314328668\" y=\"-0.913178274166\" z=\"-0.358888494385\"/>\n <p x=\"-0.219934371301\" y=\"-0.830923637648\" z=\"-0.511072034279\"/>\n <p x=\"-0.16108455941\" y=\"-0.982474350229\" z=\"-0.0937856964685\"/>\n <p x=\"-0.564566996795\" y=\"-0.825138490226\" z=\"0.020258840645\"/>\n <p x=\"-0.623416808686\" y=\"-0.673587777646\" z=\"-0.397027497165\"/>\n <p x=\"0.103806693811\" y=\"-0.958229287845\" z=\"0.266496980721\"/>\n <p x=\"-0.13596394576\" y=\"-0.785909155229\" z=\"0.603208457896\"/>\n <p x=\"-0.549041603741\" y=\"-0.703654518711\" z=\"0.451024918002\"/>\n <p x=\"-0.582770801983\" y=\"-0.355538611131\" z=\"0.730732734557\"/>\n <p x=\"-0.348884565414\" y=\"-0.237593526093\" z=\"-0.906547695342\"/>\n <p x=\"-0.01550251025\" y=\"0.0468500128795\" z=\"-0.998781555709\"/>\n <p x=\"-0.418984947635\" y=\"0.204185872882\" z=\"-0.884737018595\"/>\n <p x=\"-0.703112411504\" y=\"-0.306889602156\" z=\"-0.641444897426\"/>\n <p x=\"-0.773212793725\" y=\"0.134889796819\" z=\"-0.619634220679\"/>\n <p x=\"-0.942883051075\" y=\"-0.13456946954\" z=\"-0.304733420251\"/>\n <p x=\"-0.976612249316\" y=\"0.213546438041\" z=\"-0.0250256036968\"/>\n <p x=\"-0.806941991966\" y=\"0.4830057044\" z=\"-0.339926404125\"/>\n <p x=\"-0.863187448258\" y=\"-0.50126764503\" z=\"-0.0603160199906\"/>\n <p x=\"-0.847662055204\" y=\"-0.379783673515\" z=\"0.370450057367\"/>\n <p x=\"-0.917762437425\" y=\"0.0619957254598\" z=\"0.392260734113\"/>\n <p x=\"-0.652871184204\" y=\"0.0862407878443\" z=\"0.752543411303\"/>\n <p x=\"-0.233789297231\" y=\"0.595129110757\" z=\"-0.768871741666\"/>\n <p x=\"-0.473559936803\" y=\"0.767449243372\" z=\"-0.432160264492\"/>\n <p x=\"-0.458034543749\" y=\"0.888933214887\" z=\"-0.00139418713431\"/>\n <p x=\"-0.791416598912\" y=\"0.604489675915\" z=\"0.0908396732325\"/>\n <p x=\"-0.732566787021\" y=\"0.452938963334\" z=\"0.508126011043\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>5</v><v>6</v><v>4</v></f>\n <f><v>1</v><v>7</v><v>8</v><v>5</v><v>2</v></f>\n <f><v>8</v><v>9</v><v>5</v></f>\n <f><v>5</v><v>9</v><v>10</v><v>6</v></f>\n <f><v>11</v><v>12</v><v>9</v><v>8</v></f>\n <f><v>11</v><v>13</v><v>12</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>12</v></f>\n <f><v>12</v><v>15</v><v>16</v><v>10</v><v>9</v></f>\n <f><v>14</v><v>17</v><v>15</v></f>\n <f><v>15</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>3</v><v>4</v><v>19</v><v>20</v></f>\n <f><v>20</v><v>19</v><v>21</v></f>\n <f><v>19</v><v>22</v><v>23</v><v>21</v></f>\n <f><v>4</v><v>6</v><v>24</v><v>22</v><v>19</v></f>\n <f><v>22</v><v>25</v><v>23</v></f>\n <f><v>23</v><v>25</v><v>26</v><v>27</v></f>\n <f><v>24</v><v>28</v><v>25</v><v>22</v></f>\n <f><v>6</v><v>10</v><v>24</v></f>\n <f><v>10</v><v>16</v><v>28</v><v>24</v></f>\n <f><v>28</v><v>18</v><v>29</v><v>26</v><v>25</v></f>\n <f><v>16</v><v>18</v><v>28</v></f>\n <f><v>18</v><v>17</v><v>30</v><v>29</v></f>\n <f><v>20</v><v>21</v><v>31</v><v>32</v></f>\n <f><v>32</v><v>31</v><v>33</v></f>\n <f><v>31</v><v>34</v><v>35</v><v>33</v></f>\n <f><v>21</v><v>23</v><v>27</v><v>34</v><v>31</v></f>\n <f><v>34</v><v>36</v><v>35</v></f>\n <f><v>35</v><v>36</v><v>37</v><v>38</v></f>\n <f><v>27</v><v>39</v><v>36</v><v>34</v></f>\n <f><v>27</v><v>26</v><v>39</v></f>\n <f><v>26</v><v>29</v><v>40</v><v>39</v></f>\n <f><v>39</v><v>40</v><v>41</v><v>37</v><v>36</v></f>\n <f><v>29</v><v>30</v><v>40</v></f>\n <f><v>40</v><v>30</v><v>42</v><v>41</v></f>\n <f><v>32</v><v>33</v><v>43</v><v>44</v></f>\n <f><v>44</v><v>43</v><v>45</v></f>\n <f><v>43</v><v>46</v><v>47</v><v>45</v></f>\n <f><v>33</v><v>35</v><v>38</v><v>46</v><v>43</v></f>\n <f><v>46</v><v>48</v><v>47</v></f>\n <f><v>47</v><v>48</v><v>49</v><v>50</v></f>\n <f><v>38</v><v>51</v><v>48</v><v>46</v></f>\n <f><v>38</v><v>37</v><v>51</v></f>\n <f><v>37</v><v>41</v><v>52</v><v>51</v></f>\n <f><v>51</v><v>52</v><v>53</v><v>49</v><v>48</v></f>\n <f><v>41</v><v>42</v><v>52</v></f>\n <f><v>52</v><v>42</v><v>54</v><v>53</v></f>\n <f><v>44</v><v>45</v><v>55</v><v>0</v></f>\n <f><v>0</v><v>55</v><v>1</v></f>\n <f><v>55</v><v>56</v><v>7</v><v>1</v></f>\n <f><v>45</v><v>47</v><v>50</v><v>56</v><v>55</v></f>\n <f><v>56</v><v>57</v><v>7</v></f>\n <f><v>7</v><v>57</v><v>11</v><v>8</v></f>\n <f><v>50</v><v>58</v><v>57</v><v>56</v></f>\n <f><v>50</v><v>49</v><v>58</v></f>\n <f><v>49</v><v>53</v><v>59</v><v>58</v></f>\n <f><v>58</v><v>59</v><v>13</v><v>11</v><v>57</v></f>\n <f><v>53</v><v>54</v><v>59</v></f>\n <f><v>59</v><v>54</v><v>14</v><v>13</v></f>\n <f><v>0</v><v>3</v><v>20</v><v>32</v><v>44</v></f>\n <f><v>54</v><v>42</v><v>30</v><v>17</v><v>14</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyrobifastigium.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.500000001639\" y=\"0.500000001639\" z=\"0\"/>\n <p x=\"0\" y=\"0.500000001639\" z=\"0.866025402838\"/>\n <p x=\"0\" y=\"-0.500000001639\" z=\"0.866025402838\"/>\n <p x=\"-0.500000001639\" y=\"-0.500000001639\" z=\"0\"/>\n <p x=\"0.500000001639\" y=\"-0.500000001639\" z=\"0\"/>\n <p x=\"0.500000001639\" y=\"0.500000001639\" z=\"0\"/>\n <p x=\"-0.500000001639\" y=\"0\" z=\"-0.866025402838\"/>\n <p x=\"0.500000001639\" y=\"0\" z=\"-0.866025402838\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>4</v><v>2</v><v>1</v><v>5</v></f>\n <f><v>0</v><v>6</v><v>7</v><v>5</v></f>\n <f><v>4</v><v>7</v><v>6</v><v>3</v></f>\n <f><v>1</v><v>0</v><v>5</v></f>\n <f><v>2</v><v>4</v><v>3</v></f>\n <f><v>6</v><v>0</v><v>3</v></f>\n <f><v>7</v><v>4</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_pentagonal_bicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.683816588031\" y=\"0.317684368929\" z=\"-0.126945645071\"/>\n <p x=\"-0.240527583542\" y=\"0.595448548981\" z=\"-0.415007455598\"/>\n <p x=\"0.0524822895404\" y=\"0.188396748943\" z=\"-0.739186008663\"/>\n <p x=\"-0.209716654345\" y=\"-0.340939278716\" z=\"-0.651477562353\"/>\n <p x=\"-0.664774386562\" y=\"-0.26103513524\" z=\"-0.273092208369\"/>\n <p x=\"-0.631483455558\" y=\"0.703644195346\" z=\"0.325750658806\"/>\n <p x=\"-0.188194451069\" y=\"0.981408375398\" z=\"0.0376888482783\"/>\n <p x=\"0.266863281148\" y=\"0.901504231923\" z=\"-0.340696505706\"/>\n <p x=\"0.559873154231\" y=\"0.494452431884\" z=\"-0.664875058771\"/>\n <p x=\"0.5789153557\" y=\"-0.0842670722847\" z=\"-0.811021622069\"/>\n <p x=\"0.316716411815\" y=\"-0.613603099943\" z=\"-0.72331317576\"/>\n <p x=\"-0.126572592674\" y=\"-0.891367279996\" z=\"-0.435251365232\"/>\n <p x=\"-0.581630324892\" y=\"-0.81146313652\" z=\"-0.0568660112475\"/>\n <p x=\"-0.874640197974\" y=\"-0.404411336481\" z=\"0.267312541817\"/>\n <p x=\"-0.893682399443\" y=\"0.174308167687\" z=\"0.413459105115\"/>\n <p x=\"0.572310328153\" y=\"0.350369069238\" z=\"0.366532515258\"/>\n <p x=\"0.100021499195\" y=\"0.246347892165\" z=\"0.716904524226\"/>\n <p x=\"-0.0278135654144\" y=\"-0.336191374872\" z=\"0.686181787991\"/>\n <p x=\"0.36546884866\" y=\"-0.592199264609\" z=\"0.316822083803\"/>\n <p x=\"0.736365812346\" y=\"-0.167881574818\" z=\"0.119267968775\"/>\n <p x=\"0.364225001364\" y=\"0.897547786146\" z=\"0.248491689932\"/>\n <p x=\"-0.108063827593\" y=\"0.793526609073\" z=\"0.598863698899\"/>\n <p x=\"-0.478960791279\" y=\"0.369208919281\" z=\"0.796417813927\"/>\n <p x=\"-0.606795855888\" y=\"-0.213330347756\" z=\"0.765695077693\"/>\n <p x=\"-0.442740371695\" y=\"-0.731580991812\" z=\"0.51843053121\"/>\n <p x=\"-0.0494579576206\" y=\"-0.987588881549\" z=\"0.149070827022\"/>\n <p x=\"0.422830871337\" y=\"-0.883567704475\" z=\"-0.201301181945\"/>\n <p x=\"0.793727835022\" y=\"-0.459250014684\" z=\"-0.398855296974\"/>\n <p x=\"0.921562899632\" y=\"0.123289252353\" z=\"-0.368132560739\"/>\n <p x=\"0.757507415439\" y=\"0.641539896409\" z=\"-0.120868014256\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v></f>\n <f><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>9</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>11</v></f>\n <f><v>4</v><v>3</v><v>11</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>4</v><v>13</v><v>14</v></f>\n <f><v>0</v><v>14</v><v>5</v></f>\n <f><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>16</v><v>15</v><v>20</v><v>21</v></f>\n <f><v>16</v><v>21</v><v>22</v></f>\n <f><v>17</v><v>16</v><v>22</v><v>23</v></f>\n <f><v>17</v><v>23</v><v>24</v></f>\n <f><v>18</v><v>17</v><v>24</v><v>25</v></f>\n <f><v>18</v><v>25</v><v>26</v></f>\n <f><v>19</v><v>18</v><v>26</v><v>27</v></f>\n <f><v>19</v><v>27</v><v>28</v></f>\n <f><v>15</v><v>19</v><v>28</v><v>29</v></f>\n <f><v>15</v><v>29</v><v>20</v></f>\n <f><v>10</v><v>26</v><v>11</v></f>\n <f><v>11</v><v>26</v><v>25</v></f>\n <f><v>11</v><v>25</v><v>12</v></f>\n <f><v>12</v><v>25</v><v>24</v></f>\n <f><v>12</v><v>24</v><v>13</v></f>\n <f><v>13</v><v>24</v><v>23</v></f>\n <f><v>13</v><v>23</v><v>14</v></f>\n <f><v>14</v><v>23</v><v>22</v></f>\n <f><v>14</v><v>22</v><v>5</v></f>\n <f><v>5</v><v>22</v><v>21</v></f>\n <f><v>5</v><v>21</v><v>6</v></f>\n <f><v>6</v><v>21</v><v>20</v></f>\n <f><v>6</v><v>20</v><v>7</v></f>\n <f><v>7</v><v>20</v><v>29</v></f>\n <f><v>7</v><v>29</v><v>8</v></f>\n <f><v>8</v><v>29</v><v>28</v></f>\n <f><v>8</v><v>28</v><v>9</v></f>\n <f><v>9</v><v>28</v><v>27</v></f>\n <f><v>9</v><v>27</v><v>10</v></f>\n <f><v>10</v><v>27</v><v>26</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_pentagonal_birotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.928761427435\" y=\"0.316907212213\" z=\"0.192281121685\"/>\n <p x=\"-0.927850936041\" y=\"0.222509319133\" z=\"-0.299302929133\"/>\n <p x=\"-0.891509813602\" y=\"-0.272830746909\" z=\"-0.361626375963\"/>\n <p x=\"-0.869960256141\" y=\"-0.484569850632\" z=\"0.0914396664177\"/>\n <p x=\"-0.892983019625\" y=\"-0.120091747439\" z=\"0.433773326587\"/>\n <p x=\"-0.65712450278\" y=\"0.284096360907\" z=\"0.611451134247\"/>\n <p x=\"-0.252474642503\" y=\"0.573608354865\" z=\"0.556606205916\"/>\n <p x=\"-0.274024199965\" y=\"0.785347458588\" z=\"0.103540163535\"/>\n <p x=\"-0.691992419195\" y=\"0.626697427478\" z=\"-0.121625121474\"/>\n <p x=\"-0.27311370857\" y=\"0.690949565508\" z=\"-0.388043887283\"/>\n <p x=\"-0.250090945086\" y=\"0.326471462315\" z=\"-0.730377547452\"/>\n <p x=\"-0.654740805362\" y=\"0.0369594683567\" z=\"-0.675532619122\"/>\n <p x=\"-0.213749822648\" y=\"-0.168868603727\" z=\"-0.792700994282\"/>\n <p x=\"-0.177971414838\" y=\"-0.605867563378\" z=\"-0.551208789379\"/>\n <p x=\"-0.596850125462\" y=\"-0.670119701408\" z=\"-0.284790023571\"/>\n <p x=\"-0.156421857376\" y=\"-0.817606667102\" z=\"-0.0981427469984\"/>\n <p x=\"-0.15733234877\" y=\"-0.723208774021\" z=\"0.393441303819\"/>\n <p x=\"-0.598323331485\" y=\"-0.517380701938\" z=\"0.51060967898\"/>\n <p x=\"-0.180355112255\" y=\"-0.358730670828\" z=\"0.735774963989\"/>\n <p x=\"-0.216696234693\" y=\"0.136609395213\" z=\"0.798098410819\"/>\n <p x=\"0.87129948539\" y=\"0.488976590314\" z=\"0.0417025285064\"/>\n <p x=\"0.901438580328\" y=\"0.147914806782\" z=\"0.406853408282\"/>\n <p x=\"0.932648022094\" y=\"-0.30411835555\" z=\"0.194112577393\"/>\n <p x=\"0.921797422937\" y=\"-0.242428430381\" z=\"-0.302519366668\"/>\n <p x=\"0.883881942094\" y=\"0.247731202468\" z=\"-0.396713957107\"/>\n <p x=\"0.590561483204\" y=\"0.64942689665\" z=\"-0.340408114575\"/>\n <p x=\"0.153874491967\" y=\"0.809224550121\" z=\"-0.155108757155\"/>\n <p x=\"0.164725091123\" y=\"0.747534624952\" z=\"0.341523186906\"/>\n <p x=\"0.608118121438\" y=\"0.549610500964\" z=\"0.463159250814\"/>\n <p x=\"0.194864186061\" y=\"0.40647284142\" z=\"0.706674066682\"/>\n <p x=\"0.232779666904\" y=\"-0.0836867914299\" z=\"0.800868657121\"/>\n <p x=\"0.669466658141\" y=\"-0.243484444901\" z=\"0.6155692997\"/>\n <p x=\"0.26398910867\" y=\"-0.535719953762\" z=\"0.588127826231\"/>\n <p x=\"0.276571565374\" y=\"-0.776965341607\" z=\"0.149711340618\"/>\n <p x=\"0.689825500751\" y=\"-0.633827682064\" z=\"-0.0938034752501\"/>\n <p x=\"0.265720966218\" y=\"-0.715275416439\" z=\"-0.346920603443\"/>\n <p x=\"0.23558187128\" y=\"-0.374213632907\" z=\"-0.712071483219\"/>\n <p x=\"0.641059420751\" y=\"-0.0819781240452\" z=\"-0.68463000975\"/>\n <p x=\"0.197666390437\" y=\"0.115945999943\" z=\"-0.806266073658\"/>\n <p x=\"0.166456948671\" y=\"0.567979162275\" z=\"-0.593525242768\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>0</v><v>5</v><v>6</v><v>7</v><v>8</v></f>\n <f><v>0</v><v>8</v><v>1</v></f>\n <f><v>8</v><v>7</v><v>9</v></f>\n <f><v>1</v><v>8</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>1</v><v>11</v><v>2</v></f>\n <f><v>11</v><v>10</v><v>12</v></f>\n <f><v>2</v><v>11</v><v>12</v><v>13</v><v>14</v></f>\n <f><v>2</v><v>14</v><v>3</v></f>\n <f><v>14</v><v>13</v><v>15</v></f>\n <f><v>3</v><v>14</v><v>15</v><v>16</v><v>17</v></f>\n <f><v>3</v><v>17</v><v>4</v></f>\n <f><v>17</v><v>16</v><v>18</v></f>\n <f><v>4</v><v>17</v><v>18</v><v>19</v><v>5</v></f>\n <f><v>4</v><v>5</v><v>0</v></f>\n <f><v>5</v><v>19</v><v>6</v></f>\n <f><v>20</v><v>21</v><v>22</v><v>23</v><v>24</v></f>\n <f><v>20</v><v>25</v><v>26</v><v>27</v><v>28</v></f>\n <f><v>20</v><v>28</v><v>21</v></f>\n <f><v>28</v><v>27</v><v>29</v></f>\n <f><v>21</v><v>28</v><v>29</v><v>30</v><v>31</v></f>\n <f><v>21</v><v>31</v><v>22</v></f>\n <f><v>31</v><v>30</v><v>32</v></f>\n <f><v>22</v><v>31</v><v>32</v><v>33</v><v>34</v></f>\n <f><v>22</v><v>34</v><v>23</v></f>\n <f><v>34</v><v>33</v><v>35</v></f>\n <f><v>23</v><v>34</v><v>35</v><v>36</v><v>37</v></f>\n <f><v>23</v><v>37</v><v>24</v></f>\n <f><v>37</v><v>36</v><v>38</v></f>\n <f><v>24</v><v>37</v><v>38</v><v>39</v><v>25</v></f>\n <f><v>24</v><v>25</v><v>20</v></f>\n <f><v>25</v><v>39</v><v>26</v></f>\n <f><v>13</v><v>35</v><v>15</v></f>\n <f><v>15</v><v>35</v><v>33</v></f>\n <f><v>15</v><v>33</v><v>16</v></f>\n <f><v>16</v><v>33</v><v>32</v></f>\n <f><v>16</v><v>32</v><v>18</v></f>\n <f><v>18</v><v>32</v><v>30</v></f>\n <f><v>18</v><v>30</v><v>19</v></f>\n <f><v>19</v><v>30</v><v>29</v></f>\n <f><v>19</v><v>29</v><v>6</v></f>\n <f><v>6</v><v>29</v><v>27</v></f>\n <f><v>6</v><v>27</v><v>7</v></f>\n <f><v>7</v><v>27</v><v>26</v></f>\n <f><v>7</v><v>26</v><v>9</v></f>\n <f><v>9</v><v>26</v><v>39</v></f>\n <f><v>9</v><v>39</v><v>10</v></f>\n <f><v>10</v><v>39</v><v>38</v></f>\n <f><v>10</v><v>38</v><v>12</v></f>\n <f><v>12</v><v>38</v><v>36</v></f>\n <f><v>12</v><v>36</v><v>13</v></f>\n <f><v>13</v><v>36</v><v>35</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_pentagonal_cupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.694348693548\" y=\"-0.424117268426\" z=\"-0.581381340957\"/>\n <p x=\"0.194107971645\" y=\"-0.684323781794\" z=\"-0.702867603613\"/>\n <p x=\"-0.37937460597\" y=\"-0.626539964853\" z=\"-0.680824801259\"/>\n <p x=\"-0.807048186603\" y=\"-0.272837271677\" z=\"-0.523672535186\"/>\n <p x=\"-0.925555998543\" y=\"0.241681890855\" z=\"-0.291437629626\"/>\n <p x=\"-0.689632085561\" y=\"0.720488690518\" z=\"-0.0728259251286\"/>\n <p x=\"-0.189391363658\" y=\"0.980695203885\" z=\"0.0486603375273\"/>\n <p x=\"0.384091213957\" y=\"0.922911386945\" z=\"0.026617535173\"/>\n <p x=\"0.81176479459\" y=\"0.569208693769\" z=\"-0.1305347309\"/>\n <p x=\"0.93027260653\" y=\"0.0546895312369\" z=\"-0.36276963646\"/>\n <p x=\"-0.914271999029\" y=\"-0.229270423236\" z=\"0.0414049782163\"/>\n <p x=\"-0.627127445595\" y=\"-0.685721508048\" z=\"-0.163308319032\"/>\n <p x=\"-0.100788504371\" y=\"-0.902052721968\" z=\"-0.257516844652\"/>\n <p x=\"0.463701239993\" y=\"-0.795632812657\" z=\"-0.205236323675\"/>\n <p x=\"0.850725891451\" y=\"-0.407110568393\" z=\"-0.0264361381641\"/>\n <p x=\"0.912455187145\" y=\"0.115111688359\" z=\"0.21058818563\"/>\n <p x=\"-0.203588658422\" y=\"-0.589509766178\" z=\"0.216251189914\"/>\n <p x=\"0.360901085942\" y=\"-0.483089856867\" z=\"0.268531710891\"/>\n <p x=\"0.42263038032\" y=\"0.0391323171675\" z=\"0.505556217275\"/>\n <p x=\"-0.103708562018\" y=\"0.255463461089\" z=\"0.599764897409\"/>\n <p x=\"-0.490733212362\" y=\"-0.133058713177\" z=\"0.420964557384\"/>\n <p x=\"0.625310630774\" y=\"0.571562588644\" z=\"0.415301890203\"/>\n <p x=\"0.0989716884368\" y=\"0.787893732565\" z=\"0.509510570337\"/>\n <p x=\"-0.465518055927\" y=\"0.681473823254\" z=\"0.45723004936\"/>\n <p x=\"-0.852542706272\" y=\"0.292951648988\" z=\"0.278429709335\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>3</v><v>11</v></f>\n <f><v>11</v><v>3</v><v>2</v></f>\n <f><v>11</v><v>2</v><v>12</v></f>\n <f><v>12</v><v>2</v><v>1</v></f>\n <f><v>12</v><v>1</v><v>13</v></f>\n <f><v>13</v><v>1</v><v>0</v></f>\n <f><v>13</v><v>0</v><v>14</v></f>\n <f><v>14</v><v>0</v><v>9</v></f>\n <f><v>14</v><v>9</v><v>15</v></f>\n <f><v>15</v><v>9</v><v>8</v></f>\n <f><v>16</v><v>17</v><v>18</v><v>19</v><v>20</v></f>\n <f><v>17</v><v>16</v><v>12</v><v>13</v></f>\n <f><v>17</v><v>13</v><v>14</v></f>\n <f><v>18</v><v>17</v><v>14</v><v>15</v></f>\n <f><v>18</v><v>15</v><v>21</v></f>\n <f><v>19</v><v>18</v><v>21</v><v>22</v></f>\n <f><v>19</v><v>22</v><v>23</v></f>\n <f><v>20</v><v>19</v><v>23</v><v>24</v></f>\n <f><v>20</v><v>24</v><v>10</v></f>\n <f><v>16</v><v>20</v><v>10</v><v>11</v></f>\n <f><v>16</v><v>11</v><v>12</v></f>\n <f><v>15</v><v>8</v><v>21</v></f>\n <f><v>21</v><v>8</v><v>7</v></f>\n <f><v>21</v><v>7</v><v>22</v></f>\n <f><v>22</v><v>7</v><v>6</v></f>\n <f><v>22</v><v>6</v><v>23</v></f>\n <f><v>23</v><v>6</v><v>5</v></f>\n <f><v>23</v><v>5</v><v>24</v></f>\n <f><v>24</v><v>5</v><v>4</v></f>\n <f><v>24</v><v>4</v><v>10</v></f>\n <f><v>10</v><v>4</v><v>3</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_pentagonal_cupolarotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.793068864655\" y=\"0.192963372997\" z=\"0.258017464509\"/>\n <p x=\"-0.466827448835\" y=\"0.648718254305\" z=\"0.306598856716\"/>\n <p x=\"-0.27812208104\" y=\"0.782894446742\" z=\"-0.206132221384\"/>\n <p x=\"-0.487737165703\" y=\"0.41006501284\" z=\"-0.571598846947\"/>\n <p x=\"-0.805991780374\" y=\"0.0454675582459\" z=\"-0.284738565197\"/>\n <p x=\"-0.635668144815\" y=\"0.0255526700901\" z=\"0.77153941618\"/>\n <p x=\"-0.309426728995\" y=\"0.481307551399\" z=\"0.820120808387\"/>\n <p x=\"0.00882788567653\" y=\"0.845905005993\" z=\"0.533260526638\"/>\n <p x=\"0.197533253471\" y=\"0.98008119843\" z=\"0.0205294485372\"/>\n <p x=\"0.184610337752\" y=\"0.832585383679\" z=\"-0.522226581169\"/>\n <p x=\"-0.0250047469116\" y=\"0.459755949777\" z=\"-0.887693206731\"/>\n <p x=\"-0.351246162732\" y=\"0.00400106846868\" z=\"-0.936274598939\"/>\n <p x=\"-0.669500777403\" y=\"-0.360596386126\" z=\"-0.649414317189\"/>\n <p x=\"-0.858206145198\" y=\"-0.494772578562\" z=\"-0.136683239088\"/>\n <p x=\"-0.845283229478\" y=\"-0.347276763812\" z=\"0.406072790618\"/>\n <p x=\"0.685696791259\" y=\"-0.370147905813\" z=\"0.580316456862\"/>\n <p x=\"0.403980357324\" y=\"-0.805760459333\" z=\"0.362638532009\"/>\n <p x=\"0.496394661345\" y=\"-0.812762999185\" z=\"-0.192263879005\"/>\n <p x=\"0.835226276211\" y=\"-0.381478253301\" z=\"-0.317534504599\"/>\n <p x=\"0.952221426641\" y=\"-0.107927081664\" z=\"0.159946402007\"/>\n <p x=\"0.727201293086\" y=\"0.190907771475\" z=\"0.580148490229\"/>\n <p x=\"0.246115918412\" y=\"0.400881549239\" z=\"0.782568844511\"/>\n <p x=\"-0.092715696455\" y=\"-0.0304031966453\" z=\"0.907839470104\"/>\n <p x=\"0.178960223769\" y=\"-0.506925606194\" z=\"0.782840620231\"/>\n <p x=\"-0.37443213039\" y=\"-0.466015750165\" z=\"0.690161545251\"/>\n <p x=\"-0.49142728082\" y=\"-0.739566921803\" z=\"0.212680638645\"/>\n <p x=\"-0.0103419061455\" y=\"-0.949540699567\" z=\"0.010260284364\"/>\n <p x=\"-0.3990129768\" y=\"-0.746569461655\" z=\"-0.342221772369\"/>\n <p x=\"-0.132488341418\" y=\"-0.484348637506\" z=\"-0.762591827224\"/>\n <p x=\"0.420904012741\" y=\"-0.525258493535\" z=\"-0.669912752244\"/>\n <p x=\"0.206343273448\" y=\"-0.0530638916221\" z=\"-0.887862452817\"/>\n <p x=\"0.488059707384\" y=\"0.382548661898\" z=\"-0.670184527965\"/>\n <p x=\"0.876730778038\" y=\"0.179577423987\" z=\"-0.317702471231\"/>\n <p x=\"0.605054857814\" y=\"0.656099833536\" z=\"-0.192703621359\"/>\n <p x=\"0.512640553793\" y=\"0.663102373388\" z=\"0.362198789656\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v></f>\n <f><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>9</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>11</v></f>\n <f><v>4</v><v>3</v><v>11</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>4</v><v>13</v><v>14</v></f>\n <f><v>0</v><v>14</v><v>5</v></f>\n <f><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>15</v><v>20</v><v>21</v><v>22</v><v>23</v></f>\n <f><v>15</v><v>23</v><v>16</v></f>\n <f><v>23</v><v>22</v><v>24</v></f>\n <f><v>16</v><v>23</v><v>24</v><v>25</v><v>26</v></f>\n <f><v>16</v><v>26</v><v>17</v></f>\n <f><v>26</v><v>25</v><v>27</v></f>\n <f><v>17</v><v>26</v><v>27</v><v>28</v><v>29</v></f>\n <f><v>17</v><v>29</v><v>18</v></f>\n <f><v>29</v><v>28</v><v>30</v></f>\n <f><v>18</v><v>29</v><v>30</v><v>31</v><v>32</v></f>\n <f><v>18</v><v>32</v><v>19</v></f>\n <f><v>32</v><v>31</v><v>33</v></f>\n <f><v>19</v><v>32</v><v>33</v><v>34</v><v>20</v></f>\n <f><v>19</v><v>20</v><v>15</v></f>\n <f><v>20</v><v>34</v><v>21</v></f>\n <f><v>10</v><v>30</v><v>11</v></f>\n <f><v>11</v><v>30</v><v>28</v></f>\n <f><v>11</v><v>28</v><v>12</v></f>\n <f><v>12</v><v>28</v><v>27</v></f>\n <f><v>12</v><v>27</v><v>13</v></f>\n <f><v>13</v><v>27</v><v>25</v></f>\n <f><v>13</v><v>25</v><v>14</v></f>\n <f><v>14</v><v>25</v><v>24</v></f>\n <f><v>14</v><v>24</v><v>5</v></f>\n <f><v>5</v><v>24</v><v>22</v></f>\n <f><v>5</v><v>22</v><v>6</v></f>\n <f><v>6</v><v>22</v><v>21</v></f>\n <f><v>6</v><v>21</v><v>7</v></f>\n <f><v>7</v><v>21</v><v>34</v></f>\n <f><v>7</v><v>34</v><v>8</v></f>\n <f><v>8</v><v>34</v><v>33</v></f>\n <f><v>8</v><v>33</v><v>9</v></f>\n <f><v>9</v><v>33</v><v>31</v></f>\n <f><v>9</v><v>31</v><v>10</v></f>\n <f><v>10</v><v>31</v><v>30</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_pentagonal_pyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.227396240317\" y=\"-0.785677630945\" z=\"0.426319161252\"/>\n <p x=\"-0.478964001836\" y=\"-0.828352814921\" z=\"-0.290559974803\"/>\n <p x=\"0.469507142657\" y=\"-0.589655890849\" z=\"-0.531615829815\"/>\n <p x=\"-0.297801795512\" y=\"-0.0891634099866\" z=\"-0.950454615913\"/>\n <p x=\"0.520522847627\" y=\"0.410355950363\" z=\"-0.641412797057\"/>\n <p x=\"-0.396418857235\" y=\"0.789700333312\" z=\"-0.468215199663\"/>\n <p x=\"0.309941384917\" y=\"0.832375517288\" z=\"0.248663936393\"/>\n <p x=\"-0.638529759576\" y=\"0.593678593216\" z=\"0.489719791404\"/>\n <p x=\"0.128779178593\" y=\"0.0931861123539\" z=\"0.908558577502\"/>\n <p x=\"-0.689545464545\" y=\"-0.406333247996\" z=\"0.599516758647\"/>\n <p x=\"0.845113084593\" y=\"-0.0201135118367\" z=\"0.209480192051\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>2</v><v>1</v><v>3</v></f>\n <f><v>2</v><v>3</v><v>4</v></f>\n <f><v>4</v><v>3</v><v>5</v></f>\n <f><v>4</v><v>5</v><v>6</v></f>\n <f><v>6</v><v>5</v><v>7</v></f>\n <f><v>6</v><v>7</v><v>8</v></f>\n <f><v>8</v><v>7</v><v>9</v></f>\n <f><v>8</v><v>9</v><v>0</v></f>\n <f><v>0</v><v>9</v><v>1</v></f>\n <f><v>0</v><v>2</v><v>10</v></f>\n <f><v>2</v><v>4</v><v>10</v></f>\n <f><v>4</v><v>6</v><v>10</v></f>\n <f><v>6</v><v>8</v><v>10</v></f>\n <f><v>8</v><v>0</v><v>10</v></f>\n <f><v>7</v><v>5</v><v>3</v><v>1</v><v>9</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_pentagonal_rotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.931212246207\" y=\"-0.364026772601\" z=\"-0.0181179839731\"/>\n <p x=\"0.626581349213\" y=\"-0.761491202554\" z=\"0.165912510832\"/>\n <p x=\"0.140528868241\" y=\"-0.980033339136\" z=\"0.140663752875\"/>\n <p x=\"-0.341289669294\" y=\"-0.936177514146\" z=\"-0.0842200904782\"/>\n <p x=\"-0.634835958464\" y=\"-0.646675162126\" z=\"-0.422841034587\"/>\n <p x=\"-0.627985294076\" y=\"-0.222106341725\" z=\"-0.745857388104\"/>\n <p x=\"-0.323354397082\" y=\"0.175358088228\" z=\"-0.929887882909\"/>\n <p x=\"0.16269808389\" y=\"0.39390022481\" z=\"-0.904639124952\"/>\n <p x=\"0.644516621425\" y=\"0.35004439982\" z=\"-0.679755281599\"/>\n <p x=\"0.938062910595\" y=\"0.0605420478002\" z=\"-0.34113433749\"/>\n <p x=\"-0.659181460315\" y=\"-0.549935531969\" z=\"0.101271472415\"/>\n <p x=\"-0.251548047673\" y=\"-0.725192297102\" z=\"0.397523471012\"/>\n <p x=\"0.257291859275\" y=\"-0.633354268237\" z=\"0.529025961676\"/>\n <p x=\"0.672978710907\" y=\"-0.30950045094\" z=\"0.445549462578\"/>\n <p x=\"0.836734258576\" y=\"0.122668003968\" z=\"0.178979159114\"/>\n <p x=\"0.68600944892\" y=\"0.498077435577\" z=\"-0.168864153187\"/>\n <p x=\"0.0425536021361\" y=\"0.154155860948\" z=\"0.809963734172\"/>\n <p x=\"0.206309149806\" y=\"0.586324315856\" z=\"0.543393430707\"/>\n <p x=\"-0.201324262836\" y=\"0.761581080989\" z=\"0.24714143211\"/>\n <p x=\"-0.617011114468\" y=\"0.437727263692\" z=\"0.330617931207\"/>\n <p x=\"-0.466286304812\" y=\"0.0623178320828\" z=\"0.678461243508\"/>\n <p x=\"-0.132332285307\" y=\"-0.346798908392\" z=\"0.754246367506\"/>\n <p x=\"0.54026316931\" y=\"0.177207575381\" z=\"0.619178554705\"/>\n <p x=\"0.296385304338\" y=\"0.784632795422\" z=\"0.0563562526434\"/>\n <p x=\"0.278376036278\" y=\"0.67333420071\" z=\"-0.465116151783\"/>\n <p x=\"-0.230463870669\" y=\"0.581496171845\" z=\"-0.596618642447\"/>\n <p x=\"-0.526934959936\" y=\"0.636035743259\" z=\"-0.156419246856\"/>\n <p x=\"-0.646150722302\" y=\"0.257642354548\" z=\"-0.51314214335\"/>\n <p x=\"-0.809906269971\" y=\"-0.17452610036\" z=\"-0.246571839885\"/>\n <p x=\"-0.791897001911\" y=\"-0.0632275056477\" z=\"0.274900564541\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>3</v><v>11</v></f>\n <f><v>11</v><v>3</v><v>2</v></f>\n <f><v>11</v><v>2</v><v>12</v></f>\n <f><v>12</v><v>2</v><v>1</v></f>\n <f><v>12</v><v>1</v><v>13</v></f>\n <f><v>13</v><v>1</v><v>0</v></f>\n <f><v>13</v><v>0</v><v>14</v></f>\n <f><v>14</v><v>0</v><v>9</v></f>\n <f><v>14</v><v>9</v><v>15</v></f>\n <f><v>15</v><v>9</v><v>8</v></f>\n <f><v>16</v><v>17</v><v>18</v><v>19</v><v>20</v></f>\n <f><v>16</v><v>21</v><v>12</v><v>13</v><v>22</v></f>\n <f><v>16</v><v>22</v><v>17</v></f>\n <f><v>22</v><v>13</v><v>14</v></f>\n <f><v>17</v><v>22</v><v>14</v><v>15</v><v>23</v></f>\n <f><v>17</v><v>23</v><v>18</v></f>\n <f><v>23</v><v>15</v><v>24</v></f>\n <f><v>18</v><v>23</v><v>24</v><v>25</v><v>26</v></f>\n <f><v>18</v><v>26</v><v>19</v></f>\n <f><v>26</v><v>25</v><v>27</v></f>\n <f><v>19</v><v>26</v><v>27</v><v>28</v><v>29</v></f>\n <f><v>19</v><v>29</v><v>20</v></f>\n <f><v>29</v><v>28</v><v>10</v></f>\n <f><v>20</v><v>29</v><v>10</v><v>11</v><v>21</v></f>\n <f><v>20</v><v>21</v><v>16</v></f>\n <f><v>21</v><v>11</v><v>12</v></f>\n <f><v>15</v><v>8</v><v>24</v></f>\n <f><v>24</v><v>8</v><v>7</v></f>\n <f><v>24</v><v>7</v><v>25</v></f>\n <f><v>25</v><v>7</v><v>6</v></f>\n <f><v>25</v><v>6</v><v>27</v></f>\n <f><v>27</v><v>6</v><v>5</v></f>\n <f><v>27</v><v>5</v><v>28</v></f>\n <f><v>28</v><v>5</v><v>4</v></f>\n <f><v>28</v><v>4</v><v>10</v></f>\n <f><v>10</v><v>4</v><v>3</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_square_bicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.621615703197\" y=\"0.704914553817\" z=\"-0.253930378458\"/>\n <p x=\"0.00584732729749\" y=\"0.752206639572\" z=\"-0.618014747312\"/>\n <p x=\"-0.142375500973\" y=\"0.125273909919\" z=\"-0.954896283355\"/>\n <p x=\"-0.769838531468\" y=\"0.0779818241638\" z=\"-0.5908119145\"/>\n <p x=\"-0.279294271035\" y=\"0.890131254233\" z=\"0.360084796132\"/>\n <p x=\"0.34816875946\" y=\"0.937423339988\" z=\"-0.00399957272272\"/>\n <p x=\"0.68704275627\" y=\"0.527555510036\" z=\"-0.499657317456\"/>\n <p x=\"0.538819927999\" y=\"-0.0993772196167\" z=\"-0.836538853498\"/>\n <p x=\"-0.00967280280422\" y=\"-0.576126158636\" z=\"-0.817303545949\"/>\n <p x=\"-0.637135833299\" y=\"-0.623418244391\" z=\"-0.453219177095\"/>\n <p x=\"-0.976009830109\" y=\"-0.21355041444\" z=\"0.0424385676383\"/>\n <p x=\"-0.827787001838\" y=\"0.413382315213\" z=\"0.379320103681\"/>\n <p x=\"0.832014389128\" y=\"-0.214552413807\" z=\"0.457723241447\"/>\n <p x=\"0.309036558524\" y=\"-0.0183278350404\" z=\"0.923012320452\"/>\n <p x=\"-0.0680231849579\" y=\"-0.615636049929\" z=\"0.751103420365\"/>\n <p x=\"0.454954645646\" y=\"-0.811860628695\" z=\"0.28581434136\"/>\n <p x=\"0.861123825491\" y=\"0.465899959468\" z=\"0.203477234447\"/>\n <p x=\"0.338145994887\" y=\"0.662124538235\" z=\"0.668766313452\"/>\n <p x=\"-0.298276677072\" y=\"0.378515579311\" z=\"0.876217427431\"/>\n <p x=\"-0.675336420554\" y=\"-0.218792635578\" z=\"0.704308527344\"/>\n <p x=\"-0.572156751652\" y=\"-0.779905055065\" z=\"0.25374151537\"/>\n <p x=\"-0.0491789210482\" y=\"-0.976129633832\" z=\"-0.211547563635\"/>\n <p x=\"0.587243750911\" y=\"-0.692520674907\" z=\"-0.418998677614\"/>\n <p x=\"0.964303494393\" y=\"-0.0952124600189\" z=\"-0.247089777527\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>1</v><v>0</v><v>4</v><v>5</v></f>\n <f><v>1</v><v>5</v><v>6</v></f>\n <f><v>2</v><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>7</v><v>8</v></f>\n <f><v>3</v><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>9</v><v>10</v></f>\n <f><v>0</v><v>3</v><v>10</v><v>11</v></f>\n <f><v>0</v><v>11</v><v>4</v></f>\n <f><v>12</v><v>13</v><v>14</v><v>15</v></f>\n <f><v>13</v><v>12</v><v>16</v><v>17</v></f>\n <f><v>13</v><v>17</v><v>18</v></f>\n <f><v>14</v><v>13</v><v>18</v><v>19</v></f>\n <f><v>14</v><v>19</v><v>20</v></f>\n <f><v>15</v><v>14</v><v>20</v><v>21</v></f>\n <f><v>15</v><v>21</v><v>22</v></f>\n <f><v>12</v><v>15</v><v>22</v><v>23</v></f>\n <f><v>12</v><v>23</v><v>16</v></f>\n <f><v>8</v><v>21</v><v>9</v></f>\n <f><v>9</v><v>21</v><v>20</v></f>\n <f><v>9</v><v>20</v><v>10</v></f>\n <f><v>10</v><v>20</v><v>19</v></f>\n <f><v>10</v><v>19</v><v>11</v></f>\n <f><v>11</v><v>19</v><v>18</v></f>\n <f><v>11</v><v>18</v><v>4</v></f>\n <f><v>4</v><v>18</v><v>17</v></f>\n <f><v>4</v><v>17</v><v>5</v></f>\n <f><v>5</v><v>17</v><v>16</v></f>\n <f><v>5</v><v>16</v><v>6</v></f>\n <f><v>6</v><v>16</v><v>23</v></f>\n <f><v>6</v><v>23</v><v>7</v></f>\n <f><v>7</v><v>23</v><v>22</v></f>\n <f><v>7</v><v>22</v><v>8</v></f>\n <f><v>8</v><v>22</v><v>21</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_square_cupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.0186142094971\" y=\"-0.331071402449\" z=\"-0.943422088826\"/>\n <p x=\"-0.618596280691\" y=\"-0.153700952128\" z=\"-0.770528817651\"/>\n <p x=\"-0.894029295975\" y=\"0.296443043076\" z=\"-0.335906445533\"/>\n <p x=\"-0.646339911526\" y=\"0.755672335792\" z=\"0.10584913645\"/>\n <p x=\"-0.0206212094989\" y=\"0.954976634587\" z=\"0.295963499628\"/>\n <p x=\"0.616589280689\" y=\"0.777606184265\" z=\"0.123070228452\"/>\n <p x=\"0.892022295973\" y=\"0.327462189062\" z=\"-0.311552143665\"/>\n <p x=\"0.644332911524\" y=\"-0.131767103654\" z=\"-0.753307725648\"/>\n <p x=\"-0.832246310532\" y=\"0.135590027971\" z=\"0.325681597672\"/>\n <p x=\"-0.81723156572\" y=\"-0.356559249028\" z=\"-0.148610733341\"/>\n <p x=\"-0.323312459735\" y=\"-0.696167619732\" z=\"-0.477395830269\"/>\n <p x=\"0.360179893852\" y=\"-0.684297106477\" z=\"-0.468075842437\"/>\n <p x=\"0.832864944089\" y=\"-0.327901294936\" z=\"-0.126110292316\"/>\n <p x=\"-0.332850437943\" y=\"-0.6836038603\" z=\"0.20608112442\"/>\n <p x=\"0.350641915644\" y=\"-0.671733347045\" z=\"0.215401112252\"/>\n <p x=\"0.335627170833\" y=\"-0.179584070046\" z=\"0.689693443265\"/>\n <p x=\"-0.347865182755\" y=\"-0.191454583301\" z=\"0.680373455434\"/>\n <p x=\"0.817850199278\" y=\"0.164247982064\" z=\"0.348182038697\"/>\n <p x=\"0.323931093292\" y=\"0.503856352767\" z=\"0.676967135625\"/>\n <p x=\"-0.359561260295\" y=\"0.491985839512\" z=\"0.667647147793\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v></f>\n <f><v>8</v><v>2</v><v>9</v></f>\n <f><v>9</v><v>2</v><v>1</v></f>\n <f><v>9</v><v>1</v><v>10</v></f>\n <f><v>10</v><v>1</v><v>0</v></f>\n <f><v>10</v><v>0</v><v>11</v></f>\n <f><v>11</v><v>0</v><v>7</v></f>\n <f><v>11</v><v>7</v><v>12</v></f>\n <f><v>12</v><v>7</v><v>6</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>16</v></f>\n <f><v>14</v><v>13</v><v>10</v><v>11</v></f>\n <f><v>14</v><v>11</v><v>12</v></f>\n <f><v>15</v><v>14</v><v>12</v><v>17</v></f>\n <f><v>15</v><v>17</v><v>18</v></f>\n <f><v>16</v><v>15</v><v>18</v><v>19</v></f>\n <f><v>16</v><v>19</v><v>8</v></f>\n <f><v>13</v><v>16</v><v>8</v><v>9</v></f>\n <f><v>13</v><v>9</v><v>10</v></f>\n <f><v>12</v><v>6</v><v>17</v></f>\n <f><v>6</v><v>5</v><v>17</v></f>\n <f><v>17</v><v>5</v><v>18</v></f>\n <f><v>18</v><v>5</v><v>4</v></f>\n <f><v>18</v><v>4</v><v>19</v></f>\n <f><v>19</v><v>4</v><v>3</v></f>\n <f><v>19</v><v>3</v><v>8</v></f>\n <f><v>8</v><v>3</v><v>2</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_square_dipyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.155117727174\" y=\"0.503017340336\" z=\"0.505201497507\"/>\n <p x=\"0.554695399658\" y=\"-0.279247849347\" z=\"0.382949290741\"/>\n <p x=\"0.594473049204\" y=\"0.342455303808\" z=\"-0.248279410564\"/>\n <p x=\"0.320883429796\" y=\"-0.476835955455\" z=\"-0.449419406695\"/>\n <p x=\"-0.175542331651\" y=\"0.223585560914\" z=\"-0.671945603301\"/>\n <p x=\"-0.534270795182\" y=\"-0.447355051903\" z=\"-0.216205184947\"/>\n <p x=\"-0.61489765368\" y=\"0.384147597442\" z=\"0.0815353047699\"/>\n <p x=\"-0.300458825319\" y=\"-0.249766945795\" z=\"0.616163512488\"/>\n <p x=\"-0.0273872789254\" y=\"0.974299225599\" z=\"-0.223586573723\"/>\n <p x=\"0.0273872789254\" y=\"-0.974299225599\" z=\"0.223586573723\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>2</v><v>1</v><v>3</v></f>\n <f><v>2</v><v>3</v><v>4</v></f>\n <f><v>4</v><v>3</v><v>5</v></f>\n <f><v>4</v><v>5</v><v>6</v></f>\n <f><v>6</v><v>5</v><v>7</v></f>\n <f><v>6</v><v>7</v><v>0</v></f>\n <f><v>0</v><v>7</v><v>1</v></f>\n <f><v>0</v><v>2</v><v>8</v></f>\n <f><v>2</v><v>4</v><v>8</v></f>\n <f><v>4</v><v>6</v><v>8</v></f>\n <f><v>6</v><v>0</v><v>8</v></f>\n <f><v>3</v><v>1</v><v>9</v></f>\n <f><v>5</v><v>3</v><v>9</v></f>\n <f><v>7</v><v>5</v><v>9</v></f>\n <f><v>1</v><v>7</v><v>9</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_square_pyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.059074875171\" y=\"-0.509662721227\" z=\"0.566761216222\"/>\n <p x=\"0.438447458046\" y=\"-0.699166650643\" z=\"-0.336365534982\"/>\n <p x=\"0.737462952457\" y=\"0.105946879637\" z=\"0.171428874307\"/>\n <p x=\"0.408985969963\" y=\"0.200898284108\" z=\"-0.765886615484\"/>\n <p x=\"0.0174100391566\" y=\"0.763221316514\" z=\"-0.0406733211485\"/>\n <p x=\"-0.57986113757\" y=\"0.230359772191\" z=\"-0.636323336405\"/>\n <p x=\"-0.66097803813\" y=\"0.147611715651\" z=\"0.354659020766\"/>\n <p x=\"-0.550399649487\" y=\"-0.66970516256\" z=\"-0.206802255904\"/>\n <p x=\"0.129857530393\" y=\"0.430496566329\" z=\"0.893201952628\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>2</v><v>1</v><v>3</v></f>\n <f><v>2</v><v>3</v><v>4</v></f>\n <f><v>4</v><v>3</v><v>5</v></f>\n <f><v>4</v><v>5</v><v>6</v></f>\n <f><v>6</v><v>5</v><v>7</v></f>\n <f><v>6</v><v>7</v><v>0</v></f>\n <f><v>0</v><v>7</v><v>1</v></f>\n <f><v>0</v><v>2</v><v>8</v></f>\n <f><v>2</v><v>4</v><v>8</v></f>\n <f><v>4</v><v>6</v><v>8</v></f>\n <f><v>6</v><v>0</v><v>8</v></f>\n <f><v>5</v><v>3</v><v>1</v><v>7</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_triangular_bicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.118475612543\" y=\"0.978759612295\" z=\"-0.167311537475\"/>\n <p x=\"0.47188223182\" y=\"0.579500180997\" z=\"-0.664459704961\"/>\n <p x=\"-0.251391366837\" y=\"0.659541609494\" z=\"-0.708383544435\"/>\n <p x=\"0.408713512006\" y=\"0.573384418253\" z=\"0.364565841471\"/>\n <p x=\"0.762120131283\" y=\"0.174124986956\" z=\"-0.132582326015\"/>\n <p x=\"0.392253151903\" y=\"-0.145093015845\" z=\"-0.673654332975\"/>\n <p x=\"-0.331020446754\" y=\"-0.0650515873483\" z=\"-0.717578172448\"/>\n <p x=\"-0.68442706603\" y=\"0.334207843949\" z=\"-0.220430004962\"/>\n <p x=\"-0.31456008665\" y=\"0.65342584675\" z=\"0.320642001998\"/>\n <p x=\"0.0910505809304\" y=\"-0.969779674399\" z=\"0.226356300631\"/>\n <p x=\"0.100553974267\" y=\"-0.554966534415\" z=\"0.825772997826\"/>\n <p x=\"-0.530571032724\" y=\"-0.693055193973\" z=\"0.488025488413\"/>\n <p x=\"0.582775081029\" y=\"-0.530890895878\" z=\"-0.0851630222929\"/>\n <p x=\"0.592278474365\" y=\"-0.116077755894\" z=\"0.514253674902\"/>\n <p x=\"-0.0293431392893\" y=\"0.160646724531\" z=\"0.775922862683\"/>\n <p x=\"-0.660468146281\" y=\"0.0225580649728\" z=\"0.43817535327\"/>\n <p x=\"-0.669971539618\" y=\"-0.392255075011\" z=\"-0.161241343925\"/>\n <p x=\"-0.0483499259629\" y=\"-0.668979555436\" z=\"-0.422910531706\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>1</v><v>0</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>4</v><v>5</v></f>\n <f><v>2</v><v>1</v><v>5</v><v>6</v></f>\n <f><v>2</v><v>6</v><v>7</v></f>\n <f><v>0</v><v>2</v><v>7</v><v>8</v></f>\n <f><v>0</v><v>8</v><v>3</v></f>\n <f><v>9</v><v>10</v><v>11</v></f>\n <f><v>10</v><v>9</v><v>12</v><v>13</v></f>\n <f><v>10</v><v>13</v><v>14</v></f>\n <f><v>11</v><v>10</v><v>14</v><v>15</v></f>\n <f><v>11</v><v>15</v><v>16</v></f>\n <f><v>9</v><v>11</v><v>16</v><v>17</v></f>\n <f><v>9</v><v>17</v><v>12</v></f>\n <f><v>6</v><v>16</v><v>7</v></f>\n <f><v>7</v><v>16</v><v>15</v></f>\n <f><v>7</v><v>15</v><v>8</v></f>\n <f><v>8</v><v>15</v><v>14</v></f>\n <f><v>8</v><v>14</v><v>3</v></f>\n <f><v>3</v><v>14</v><v>13</v></f>\n <f><v>3</v><v>13</v><v>4</v></f>\n <f><v>4</v><v>13</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>5</v></f>\n <f><v>5</v><v>12</v><v>17</v></f>\n <f><v>5</v><v>17</v><v>6</v></f>\n <f><v>6</v><v>17</v><v>16</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/gyroelongated_triangular_cupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.608677906736\" y=\"0.280548565941\" z=\"-0.742161510724\"/>\n <p x=\"-0.197588807644\" y=\"0.378418526386\" z=\"-0.904299774401\"/>\n <p x=\"-0.712447969213\" y=\"0.631102748716\" z=\"-0.306801583645\"/>\n <p x=\"-0.421040416401\" y=\"0.785917010603\" z=\"0.452834870789\"/>\n <p x=\"0.385226297979\" y=\"0.688047050158\" z=\"0.614973134466\"/>\n <p x=\"0.900085459548\" y=\"0.435362827827\" z=\"0.0174749437094\"/>\n <p x=\"-0.787562476869\" y=\"0.0613806778107\" z=\"0.289610969112\"/>\n <p x=\"-0.658552630402\" y=\"-0.173888681746\" z=\"-0.493931083615\"/>\n <p x=\"0.104199749711\" y=\"-0.376281233537\" z=\"-0.745286254709\"/>\n <p x=\"0.737942283356\" y=\"-0.343404425771\" z=\"-0.213099373075\"/>\n <p x=\"-0.603515601409\" y=\"-0.727936580574\" z=\"0.119204473719\"/>\n <p x=\"0.159236778704\" y=\"-0.930329132365\" z=\"-0.132150697375\"/>\n <p x=\"0.0302269322372\" y=\"-0.695059772808\" z=\"0.651391355352\"/>\n <p x=\"0.60893243689\" y=\"-0.108135066214\" z=\"0.570442679652\"/>\n <p x=\"-0.153819943223\" y=\"0.0942574855767\" z=\"0.821797850745\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v></f>\n <f><v>6</v><v>2</v><v>7</v></f>\n <f><v>7</v><v>2</v><v>1</v></f>\n <f><v>7</v><v>1</v><v>8</v></f>\n <f><v>8</v><v>1</v><v>0</v></f>\n <f><v>8</v><v>0</v><v>9</v></f>\n <f><v>9</v><v>0</v><v>5</v></f>\n <f><v>10</v><v>11</v><v>12</v></f>\n <f><v>11</v><v>10</v><v>7</v><v>8</v></f>\n <f><v>11</v><v>8</v><v>9</v></f>\n <f><v>12</v><v>11</v><v>9</v><v>13</v></f>\n <f><v>12</v><v>13</v><v>14</v></f>\n <f><v>10</v><v>12</v><v>14</v><v>6</v></f>\n <f><v>10</v><v>6</v><v>7</v></f>\n <f><v>9</v><v>5</v><v>13</v></f>\n <f><v>13</v><v>5</v><v>4</v></f>\n <f><v>13</v><v>4</v><v>14</v></f>\n <f><v>14</v><v>4</v><v>3</v></f>\n <f><v>14</v><v>3</v><v>6</v></f>\n <f><v>6</v><v>3</v><v>2</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/hebesphenomegacorona.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.135637470442\" y=\"-0.709444546964\" z=\"0.305660538124\"/>\n <p x=\"0.0980075487997\" y=\"-0.791625908406\" z=\"-0.578462746647\"/>\n <p x=\"0.711623856756\" y=\"-0.154417356834\" z=\"-0.663809441138\"/>\n <p x=\"0.749253778398\" y=\"-0.0722359953921\" z=\"0.220313843633\"/>\n <p x=\"0.21893413677\" y=\"-0.0858170654246\" z=\"0.933348259193\"/>\n <p x=\"-0.652142211405\" y=\"-0.750980200314\" z=\"-0.103630472548\"/>\n <p x=\"-0.587895859167\" y=\"-0.376003165859\" z=\"0.699555382554\"/>\n <p x=\"0.699403847399\" y=\"0.652529933537\" z=\"-0.291614375642\"/>\n <p x=\"0.437651505993\" y=\"0.688974317054\" z=\"0.556914001408\"/>\n <p x=\"-0.536678287958\" y=\"-0.210008235836\" z=\"-0.799230818205\"/>\n <p x=\"0.0769380199979\" y=\"0.427200315735\" z=\"-0.884577512697\"/>\n <p x=\"-0.160685047919\" y=\"0.761619861621\" z=\"-0.0961977724893\"/>\n <p x=\"-0.774301355875\" y=\"0.124411310049\" z=\"-0.0108510779982\"/>\n <p x=\"-0.415747402232\" y=\"0.495796737033\" z=\"0.712582192453\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>4</v><v>0</v><v>3</v></f>\n <f><v>5</v><v>0</v><v>6</v></f>\n <f><v>5</v><v>1</v><v>0</v></f>\n <f><v>3</v><v>7</v><v>8</v></f>\n <f><v>3</v><v>2</v><v>7</v></f>\n <f><v>6</v><v>0</v><v>4</v></f>\n <f><v>4</v><v>3</v><v>8</v></f>\n <f><v>9</v><v>10</v><v>2</v><v>1</v></f>\n <f><v>2</v><v>10</v><v>7</v></f>\n <f><v>9</v><v>1</v><v>5</v></f>\n <f><v>11</v><v>10</v><v>9</v><v>12</v></f>\n <f><v>13</v><v>11</v><v>12</v></f>\n <f><v>7</v><v>11</v><v>8</v></f>\n <f><v>7</v><v>10</v><v>11</v></f>\n <f><v>12</v><v>5</v><v>6</v></f>\n <f><v>12</v><v>9</v><v>5</v></f>\n <f><v>8</v><v>13</v><v>4</v></f>\n <f><v>8</v><v>11</v><v>13</v></f>\n <f><v>13</v><v>6</v><v>4</v></f>\n <f><v>13</v><v>12</v><v>6</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/hexagonal_antiprism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"2.65392639596E-14\" y=\"-0.919401686761\" z=\"-0.39331989319\"/>\n <p x=\"-0.796225217018\" y=\"-0.459700843381\" z=\"-0.39331989319\"/>\n <p x=\"-0.796225217018\" y=\"0.45970084338\" z=\"-0.393319893191\"/>\n <p x=\"3.15204796566E-13\" y=\"0.919401686762\" z=\"-0.393319893191\"/>\n <p x=\"0.796225217018\" y=\"0.459700843381\" z=\"-0.393319893191\"/>\n <p x=\"0.796225217017\" y=\"-0.459700843381\" z=\"-0.39331989319\"/>\n <p x=\"-0.459700843381\" y=\"-0.796225217018\" z=\"0.393319893191\"/>\n <p x=\"0.459700843381\" y=\"-0.796225217018\" z=\"0.393319893191\"/>\n <p x=\"0.919401686762\" y=\"4.75665269429E-13\" z=\"0.39331989319\"/>\n <p x=\"0.459700843381\" y=\"0.796225217017\" z=\"0.39331989319\"/>\n <p x=\"-0.45970084338\" y=\"0.796225217017\" z=\"0.39331989319\"/>\n <p x=\"-0.919401686762\" y=\"4.75869417614E-13\" z=\"0.39331989319\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v></f>\n <f><v>6</v><v>7</v><v>8</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>9</v><v>3</v><v>10</v></f>\n <f><v>10</v><v>3</v><v>2</v></f>\n <f><v>10</v><v>2</v><v>11</v></f>\n <f><v>11</v><v>2</v><v>1</v></f>\n <f><v>11</v><v>1</v><v>6</v></f>\n <f><v>6</v><v>1</v><v>0</v></f>\n <f><v>6</v><v>0</v><v>7</v></f>\n <f><v>7</v><v>0</v><v>5</v></f>\n <f><v>7</v><v>5</v><v>8</v></f>\n <f><v>8</v><v>5</v><v>4</v></f>\n <f><v>8</v><v>4</v><v>9</v></f>\n <f><v>9</v><v>4</v><v>3</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/hexagonal_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.61090513237\" y=\"-0.774596669241\" z=\"0.163691536871\"/>\n <p x=\"0.163691536871\" y=\"-0.774596669241\" z=\"-0.61090513237\"/>\n <p x=\"-0.0599152608792\" y=\"-9.9400667496E-13\" z=\"-0.998203466991\"/>\n <p x=\"0.163691536871\" y=\"0.774596669242\" z=\"-0.61090513237\"/>\n <p x=\"0.61090513237\" y=\"0.774596669242\" z=\"0.163691536871\"/>\n <p x=\"0.83451193012\" y=\"-9.94205277692E-13\" z=\"0.550989871491\"/>\n <p x=\"-0.61090513237\" y=\"-0.774596669241\" z=\"-0.163691536871\"/>\n <p x=\"-0.163691536871\" y=\"-0.774596669241\" z=\"0.61090513237\"/>\n <p x=\"0.0599152608792\" y=\"-9.9400667496E-13\" z=\"0.998203466991\"/>\n <p x=\"-0.163691536871\" y=\"0.774596669242\" z=\"0.61090513237\"/>\n <p x=\"-0.61090513237\" y=\"0.774596669242\" z=\"-0.163691536871\"/>\n <p x=\"-0.83451193012\" y=\"-9.9400667496E-13\" z=\"-0.550989871491\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v></f>\n <f><v>6</v><v>7</v><v>8</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>10</v><v>3</v><v>2</v><v>11</v></f>\n <f><v>11</v><v>2</v><v>1</v><v>6</v></f>\n <f><v>6</v><v>1</v><v>0</v><v>7</v></f>\n <f><v>7</v><v>0</v><v>5</v><v>8</v></f>\n <f><v>8</v><v>5</v><v>4</v><v>9</v></f>\n <f><v>9</v><v>4</v><v>3</v><v>10</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/hexakis_icosahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.0894912969859\" y=\"-0.817129117754\" z=\"0.41539157131\"/>\n <p x=\"-0.408355722122\" y=\"-0.715112141036\" z=\"0.567327268822\"/>\n <p x=\"-0.0299665783371\" y=\"-0.929731243291\" z=\"0.120313040699\"/>\n <p x=\"0.200244769464\" y=\"-0.625048637815\" z=\"0.670066892928\"/>\n <p x=\"-0.0350338419972\" y=\"-0.430025655287\" z=\"0.813701057232\"/>\n <p x=\"-0.266904874352\" y=\"-0.193176074379\" z=\"0.878190298662\"/>\n <p x=\"-0.55327497055\" y=\"-0.222901723329\" z=\"0.701755280372\"/>\n <p x=\"-0.785830579861\" y=\"-0.230946756846\" z=\"0.45706378503\"/>\n <p x=\"-0.749040463378\" y=\"-0.481995555964\" z=\"0.234259499454\"/>\n <p x=\"-0.639394659689\" y=\"-0.686162885823\" z=\"-0.0113301196928\"/>\n <p x=\"-0.35178906322\" y=\"-0.849248282763\" z=\"0.0572769941105\"/>\n <p x=\"0.573665262593\" y=\"-0.794299874558\" z=\"0.199989689158\"/>\n <p x=\"0.179833802218\" y=\"-0.892117030435\" z=\"-0.141583376211\"/>\n <p x=\"0.372142584011\" y=\"-0.767730737167\" z=\"-0.389708635656\"/>\n <p x=\"0.642766267535\" y=\"-0.594227394423\" z=\"-0.286363709063\"/>\n <p x=\"0.850871061329\" y=\"-0.362926312712\" z=\"-0.155165514411\"/>\n <p x=\"0.838531760363\" y=\"-0.33513356179\" z=\"0.181132071856\"/>\n <p x=\"0.744632369348\" y=\"-0.274743925727\" z=\"0.499811782699\"/>\n <p x=\"0.496589023441\" y=\"-0.472894402958\" z=\"0.61484068691\"/>\n <p x=\"0.343640732882\" y=\"-0.0792370958247\" z=\"0.935752386769\"/>\n <p x=\"0.714006621382\" y=\"0.0519699006792\" z=\"0.579441557776\"/>\n <p x=\"0.613932765319\" y=\"0.3736288562\" z=\"0.602711743551\"/>\n <p x=\"0.316755221224\" y=\"0.419222627477\" z=\"0.756424063122\"/>\n <p x=\"-0.0112316321745\" y=\"0.424040560721\" z=\"0.83656252703\"/>\n <p x=\"-0.146177244094\" y=\"0.121332991465\" z=\"0.901204395972\"/>\n <p x=\"-0.613661325523\" y=\"0.30336504724\" z=\"0.728964625797\"/>\n <p x=\"-0.201485907328\" y=\"0.626346559436\" z=\"0.644478286262\"/>\n <p x=\"-0.372142584007\" y=\"0.76773073717\" z=\"0.389708635657\"/>\n <p x=\"-0.642766267533\" y=\"0.594227394425\" z=\"0.286363709063\"/>\n <p x=\"-0.850871061329\" y=\"0.362926312712\" z=\"0.155165514412\"/>\n <p x=\"-0.860183865474\" y=\"0.0693630907872\" z=\"0.321762838194\"/>\n <p x=\"-0.97528200541\" y=\"-0.17523660291\" z=\"-0.134599936556\"/>\n <p x=\"-0.838531760364\" y=\"0.335133561789\" z=\"-0.181132071853\"/>\n <p x=\"-0.744632369349\" y=\"0.274743925726\" z=\"-0.499811782696\"/>\n <p x=\"-0.714006621382\" y=\"-0.0519699006798\" z=\"-0.579441557774\"/>\n <p x=\"-0.613932765316\" y=\"-0.373628856199\" z=\"-0.602711743553\"/>\n <p x=\"-0.658697958148\" y=\"-0.556983468645\" z=\"-0.322715448066\"/>\n <p x=\"-0.241473818207\" y=\"-0.853630832839\" z=\"-0.461524426593\"/>\n <p x=\"-0.316755221224\" y=\"-0.419222627478\" z=\"-0.756424063119\"/>\n <p x=\"0.0112316321765\" y=\"-0.42404056072\" z=\"-0.83656252703\"/>\n <p x=\"0.20148590733\" y=\"-0.626346559433\" z=\"-0.644478286263\"/>\n <p x=\"0.553274970548\" y=\"0.222901723328\" z=\"-0.701755280375\"/>\n <p x=\"0.613661325524\" y=\"-0.303365047241\" z=\"-0.728964625797\"/>\n <p x=\"0.26690487435\" y=\"0.193176074379\" z=\"-0.878190298662\"/>\n <p x=\"0.785830579862\" y=\"0.230946756846\" z=\"-0.457063785032\"/>\n <p x=\"0.860183865474\" y=\"-0.0693630907871\" z=\"-0.321762838198\"/>\n <p x=\"0.146177244093\" y=\"-0.121332991467\" z=\"-0.901204395972\"/>\n <p x=\"0.0350338419962\" y=\"0.430025655286\" z=\"-0.813701057231\"/>\n <p x=\"-0.343640732886\" y=\"0.0792370958246\" z=\"-0.935752386765\"/>\n <p x=\"-0.200244769467\" y=\"0.625048637813\" z=\"-0.670066892928\"/>\n <p x=\"-0.496589023441\" y=\"0.472894402958\" z=\"-0.614840686909\"/>\n <p x=\"-0.089491296985\" y=\"0.817129117752\" z=\"-0.415391571311\"/>\n <p x=\"-0.573665262594\" y=\"0.794299874557\" z=\"-0.199989689153\"/>\n <p x=\"0.029966578335\" y=\"0.929731243292\" z=\"-0.120313040698\"/>\n <p x=\"-0.179833802215\" y=\"0.892117030436\" z=\"0.141583376214\"/>\n <p x=\"0.351789063219\" y=\"0.849248282764\" z=\"-0.0572769941094\"/>\n <p x=\"0.241473818208\" y=\"0.853630832842\" z=\"0.461524426593\"/>\n <p x=\"0.639394659689\" y=\"0.686162885823\" z=\"0.0113301196924\"/>\n <p x=\"0.658697958147\" y=\"0.556983468648\" z=\"0.322715448066\"/>\n <p x=\"0.749040463378\" y=\"0.481995555963\" z=\"-0.234259499458\"/>\n <p x=\"0.97528200541\" y=\"0.175236602911\" z=\"0.134599936551\"/>\n <p x=\"0.408355722121\" y=\"0.715112141034\" z=\"-0.567327268825\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>3</v><v>1</v><v>0</v></f>\n <f><v>4</v><v>1</v><v>3</v></f>\n <f><v>5</v><v>1</v><v>4</v></f>\n <f><v>6</v><v>1</v><v>5</v></f>\n <f><v>7</v><v>1</v><v>6</v></f>\n <f><v>8</v><v>1</v><v>7</v></f>\n <f><v>9</v><v>1</v><v>8</v></f>\n <f><v>10</v><v>1</v><v>9</v></f>\n <f><v>2</v><v>1</v><v>10</v></f>\n <f><v>0</v><v>11</v><v>3</v></f>\n <f><v>2</v><v>11</v><v>0</v></f>\n <f><v>12</v><v>11</v><v>2</v></f>\n <f><v>13</v><v>11</v><v>12</v></f>\n <f><v>14</v><v>11</v><v>13</v></f>\n <f><v>15</v><v>11</v><v>14</v></f>\n <f><v>16</v><v>11</v><v>15</v></f>\n <f><v>17</v><v>11</v><v>16</v></f>\n <f><v>18</v><v>11</v><v>17</v></f>\n <f><v>3</v><v>11</v><v>18</v></f>\n <f><v>4</v><v>19</v><v>5</v></f>\n <f><v>3</v><v>19</v><v>4</v></f>\n <f><v>18</v><v>19</v><v>3</v></f>\n <f><v>17</v><v>19</v><v>18</v></f>\n <f><v>20</v><v>19</v><v>17</v></f>\n <f><v>21</v><v>19</v><v>20</v></f>\n <f><v>22</v><v>19</v><v>21</v></f>\n <f><v>23</v><v>19</v><v>22</v></f>\n <f><v>24</v><v>19</v><v>23</v></f>\n <f><v>5</v><v>19</v><v>24</v></f>\n <f><v>6</v><v>25</v><v>7</v></f>\n <f><v>5</v><v>25</v><v>6</v></f>\n <f><v>24</v><v>25</v><v>5</v></f>\n <f><v>23</v><v>25</v><v>24</v></f>\n <f><v>26</v><v>25</v><v>23</v></f>\n <f><v>27</v><v>25</v><v>26</v></f>\n <f><v>28</v><v>25</v><v>27</v></f>\n <f><v>29</v><v>25</v><v>28</v></f>\n <f><v>30</v><v>25</v><v>29</v></f>\n <f><v>7</v><v>25</v><v>30</v></f>\n <f><v>8</v><v>31</v><v>9</v></f>\n <f><v>7</v><v>31</v><v>8</v></f>\n <f><v>30</v><v>31</v><v>7</v></f>\n <f><v>29</v><v>31</v><v>30</v></f>\n <f><v>32</v><v>31</v><v>29</v></f>\n <f><v>33</v><v>31</v><v>32</v></f>\n <f><v>34</v><v>31</v><v>33</v></f>\n <f><v>35</v><v>31</v><v>34</v></f>\n <f><v>36</v><v>31</v><v>35</v></f>\n <f><v>9</v><v>31</v><v>36</v></f>\n <f><v>10</v><v>37</v><v>2</v></f>\n <f><v>9</v><v>37</v><v>10</v></f>\n <f><v>36</v><v>37</v><v>9</v></f>\n <f><v>35</v><v>37</v><v>36</v></f>\n <f><v>38</v><v>37</v><v>35</v></f>\n <f><v>39</v><v>37</v><v>38</v></f>\n <f><v>40</v><v>37</v><v>39</v></f>\n <f><v>13</v><v>37</v><v>40</v></f>\n <f><v>12</v><v>37</v><v>13</v></f>\n <f><v>2</v><v>37</v><v>12</v></f>\n <f><v>41</v><v>42</v><v>43</v></f>\n <f><v>44</v><v>42</v><v>41</v></f>\n <f><v>45</v><v>42</v><v>44</v></f>\n <f><v>15</v><v>42</v><v>45</v></f>\n <f><v>14</v><v>42</v><v>15</v></f>\n <f><v>13</v><v>42</v><v>14</v></f>\n <f><v>40</v><v>42</v><v>13</v></f>\n <f><v>39</v><v>42</v><v>40</v></f>\n <f><v>46</v><v>42</v><v>39</v></f>\n <f><v>43</v><v>42</v><v>46</v></f>\n <f><v>47</v><v>48</v><v>49</v></f>\n <f><v>43</v><v>48</v><v>47</v></f>\n <f><v>46</v><v>48</v><v>43</v></f>\n <f><v>39</v><v>48</v><v>46</v></f>\n <f><v>38</v><v>48</v><v>39</v></f>\n <f><v>35</v><v>48</v><v>38</v></f>\n <f><v>34</v><v>48</v><v>35</v></f>\n <f><v>33</v><v>48</v><v>34</v></f>\n <f><v>50</v><v>48</v><v>33</v></f>\n <f><v>49</v><v>48</v><v>50</v></f>\n <f><v>51</v><v>52</v><v>53</v></f>\n <f><v>49</v><v>52</v><v>51</v></f>\n <f><v>50</v><v>52</v><v>49</v></f>\n <f><v>33</v><v>52</v><v>50</v></f>\n <f><v>32</v><v>52</v><v>33</v></f>\n <f><v>29</v><v>52</v><v>32</v></f>\n <f><v>28</v><v>52</v><v>29</v></f>\n <f><v>27</v><v>52</v><v>28</v></f>\n <f><v>54</v><v>52</v><v>27</v></f>\n <f><v>53</v><v>52</v><v>54</v></f>\n <f><v>55</v><v>56</v><v>57</v></f>\n <f><v>53</v><v>56</v><v>55</v></f>\n <f><v>54</v><v>56</v><v>53</v></f>\n <f><v>27</v><v>56</v><v>54</v></f>\n <f><v>26</v><v>56</v><v>27</v></f>\n <f><v>23</v><v>56</v><v>26</v></f>\n <f><v>22</v><v>56</v><v>23</v></f>\n <f><v>21</v><v>56</v><v>22</v></f>\n <f><v>58</v><v>56</v><v>21</v></f>\n <f><v>57</v><v>56</v><v>58</v></f>\n <f><v>59</v><v>60</v><v>44</v></f>\n <f><v>57</v><v>60</v><v>59</v></f>\n <f><v>58</v><v>60</v><v>57</v></f>\n <f><v>21</v><v>60</v><v>58</v></f>\n <f><v>20</v><v>60</v><v>21</v></f>\n <f><v>17</v><v>60</v><v>20</v></f>\n <f><v>16</v><v>60</v><v>17</v></f>\n <f><v>15</v><v>60</v><v>16</v></f>\n <f><v>45</v><v>60</v><v>15</v></f>\n <f><v>44</v><v>60</v><v>45</v></f>\n <f><v>41</v><v>61</v><v>44</v></f>\n <f><v>43</v><v>61</v><v>41</v></f>\n <f><v>47</v><v>61</v><v>43</v></f>\n <f><v>49</v><v>61</v><v>47</v></f>\n <f><v>51</v><v>61</v><v>49</v></f>\n <f><v>53</v><v>61</v><v>51</v></f>\n <f><v>55</v><v>61</v><v>53</v></f>\n <f><v>57</v><v>61</v><v>55</v></f>\n <f><v>59</v><v>61</v><v>57</v></f>\n <f><v>44</v><v>61</v><v>59</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/hexakis_octahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.737077368046\" y=\"0.286043495206\" z=\"0.356507203524\"/>\n <p x=\"-0.49719660047\" y=\"0.867629253654\" z=\"-0.00387539463551\"/>\n <p x=\"-0.902872136371\" y=\"0.091306584132\" z=\"-0.121344777316\"/>\n <p x=\"-0.615340598144\" y=\"0.351980756035\" z=\"-0.499666698372\"/>\n <p x=\"-0.506178971068\" y=\"-0.293688750904\" z=\"-0.810882091824\"/>\n <p x=\"-0.742585990593\" y=\"-0.426158531462\" z=\"-0.13840616475\"/>\n <p x=\"-0.70468318394\" y=\"-0.401206176169\" z=\"0.585196731425\"/>\n <p x=\"0.127245392453\" y=\"0.778139287497\" z=\"-0.361260533624\"/>\n <p x=\"0.704683183941\" y=\"0.401206176169\" z=\"-0.585196731426\"/>\n <p x=\"-0.157887445763\" y=\"0.515458126043\" z=\"-0.740009470674\"/>\n <p x=\"0.121736769903\" y=\"0.0659372608342\" z=\"-0.856173901895\"/>\n <p x=\"0.737077368046\" y=\"-0.286043495203\" z=\"-0.356507203523\"/>\n <p x=\"0.497196600472\" y=\"-0.867629253652\" z=\"0.00387539463539\"/>\n <p x=\"0.367744304816\" y=\"-0.401791676176\" z=\"-0.735912438505\"/>\n <p x=\"-0.00550862254362\" y=\"-0.712202026661\" z=\"-0.494913368272\"/>\n <p x=\"-0.127245392454\" y=\"-0.778139287496\" z=\"0.361260533623\"/>\n <p x=\"-0.377240385793\" y=\"-0.825943218087\" z=\"-0.117247745142\"/>\n <p x=\"0.157887445757\" y=\"-0.51545812604\" z=\"0.740009470675\"/>\n <p x=\"0.615340598137\" y=\"-0.351980756041\" z=\"0.499666698374\"/>\n <p x=\"0.506178971068\" y=\"0.293688750904\" z=\"0.810882091823\"/>\n <p x=\"-0.121736769907\" y=\"-0.0659372608333\" z=\"0.856173901894\"/>\n <p x=\"0.902872136369\" y=\"-0.091306584142\" z=\"0.121344777316\"/>\n <p x=\"0.742585990595\" y=\"0.426158531457\" z=\"0.138406164747\"/>\n <p x=\"0.377240385799\" y=\"0.825943218086\" z=\"0.117247745145\"/>\n <p x=\"0.00550862254986\" y=\"0.712202026664\" z=\"0.494913368273\"/>\n <p x=\"-0.367744304812\" y=\"0.401791676185\" z=\"0.735912438505\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>2</v><v>1</v><v>3</v></f>\n <f><v>3</v><v>4</v><v>2</v></f>\n <f><v>2</v><v>4</v><v>5</v></f>\n <f><v>5</v><v>6</v><v>2</v></f>\n <f><v>2</v><v>6</v><v>0</v></f>\n <f><v>7</v><v>8</v><v>9</v></f>\n <f><v>9</v><v>8</v><v>10</v></f>\n <f><v>10</v><v>4</v><v>9</v></f>\n <f><v>9</v><v>4</v><v>3</v></f>\n <f><v>3</v><v>1</v><v>9</v></f>\n <f><v>9</v><v>1</v><v>7</v></f>\n <f><v>11</v><v>12</v><v>13</v></f>\n <f><v>13</v><v>12</v><v>14</v></f>\n <f><v>14</v><v>4</v><v>13</v></f>\n <f><v>13</v><v>4</v><v>10</v></f>\n <f><v>10</v><v>8</v><v>13</v></f>\n <f><v>13</v><v>8</v><v>11</v></f>\n <f><v>15</v><v>6</v><v>16</v></f>\n <f><v>16</v><v>6</v><v>5</v></f>\n <f><v>5</v><v>4</v><v>16</v></f>\n <f><v>16</v><v>4</v><v>14</v></f>\n <f><v>14</v><v>12</v><v>16</v></f>\n <f><v>16</v><v>12</v><v>15</v></f>\n <f><v>15</v><v>12</v><v>17</v></f>\n <f><v>17</v><v>12</v><v>18</v></f>\n <f><v>18</v><v>19</v><v>17</v></f>\n <f><v>17</v><v>19</v><v>20</v></f>\n <f><v>20</v><v>6</v><v>17</v></f>\n <f><v>17</v><v>6</v><v>15</v></f>\n <f><v>11</v><v>8</v><v>21</v></f>\n <f><v>21</v><v>8</v><v>22</v></f>\n <f><v>22</v><v>19</v><v>21</v></f>\n <f><v>21</v><v>19</v><v>18</v></f>\n <f><v>18</v><v>12</v><v>21</v></f>\n <f><v>21</v><v>12</v><v>11</v></f>\n <f><v>7</v><v>1</v><v>23</v></f>\n <f><v>23</v><v>1</v><v>24</v></f>\n <f><v>24</v><v>19</v><v>23</v></f>\n <f><v>23</v><v>19</v><v>22</v></f>\n <f><v>22</v><v>8</v><v>23</v></f>\n <f><v>23</v><v>8</v><v>7</v></f>\n <f><v>0</v><v>6</v><v>25</v></f>\n <f><v>25</v><v>6</v><v>20</v></f>\n <f><v>20</v><v>19</v><v>25</v></f>\n <f><v>25</v><v>19</v><v>24</v></f>\n <f><v>24</v><v>1</v><v>25</v></f>\n <f><v>25</v><v>1</v><v>0</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/icosahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.550563524346\" y=\"0.758024984088\" z=\"-0.349682612032\"/>\n <p x=\"0.62319582135\" y=\"0.436643142534\" z=\"0.648821804759\"/>\n <p x=\"0.975676690271\" y=\"-0.177816333299\" z=\"-0.12820432003\"/>\n <p x=\"-0.32007250628\" y=\"0.0780544757795\" z=\"0.944172171553\"/>\n <p x=\"0.437594031513\" y=\"-0.598061218782\" z=\"0.671441912732\"/>\n <p x=\"0.32007250628\" y=\"-0.0780544757795\" z=\"-0.944172171553\"/>\n <p x=\"0.250253520018\" y=\"-0.916161840828\" z=\"-0.313082508502\"/>\n <p x=\"-0.437594031513\" y=\"0.598061218782\" z=\"-0.671441912732\"/>\n <p x=\"-0.62319582135\" y=\"-0.436643142534\" z=\"-0.648821804759\"/>\n <p x=\"-0.250253520018\" y=\"0.916161840828\" z=\"0.313082508502\"/>\n <p x=\"-0.975676690271\" y=\"0.177816333299\" z=\"0.12820432003\"/>\n <p x=\"-0.550563524346\" y=\"-0.758024984088\" z=\"0.349682612032\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>1</v><v>3</v><v>4</v></f>\n <f><v>0</v><v>2</v><v>5</v></f>\n <f><v>2</v><v>4</v><v>6</v></f>\n <f><v>0</v><v>5</v><v>7</v></f>\n <f><v>5</v><v>6</v><v>8</v></f>\n <f><v>0</v><v>7</v><v>9</v></f>\n <f><v>7</v><v>8</v><v>10</v></f>\n <f><v>0</v><v>9</v><v>1</v></f>\n <f><v>9</v><v>10</v><v>3</v></f>\n <f><v>4</v><v>2</v><v>1</v></f>\n <f><v>11</v><v>4</v><v>3</v></f>\n <f><v>6</v><v>5</v><v>2</v></f>\n <f><v>11</v><v>6</v><v>4</v></f>\n <f><v>8</v><v>7</v><v>5</v></f>\n <f><v>11</v><v>8</v><v>6</v></f>\n <f><v>10</v><v>9</v><v>7</v></f>\n <f><v>11</v><v>10</v><v>8</v></f>\n <f><v>3</v><v>1</v><v>9</v></f>\n <f><v>11</v><v>3</v><v>10</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/metabiaugmented_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.763874911977\" y=\"-0.228354006132\" z=\"-0.32195629394\"/>\n <p x=\"-0.324285657266\" y=\"-0.560681735571\" z=\"-0.617277081656\"/>\n <p x=\"-0.00657296511655\" y=\"-0.885528902836\" z=\"-0.187826544999\"/>\n <p x=\"-0.249804977421\" y=\"-0.753967763916\" z=\"0.372909270857\"/>\n <p x=\"-0.717843320327\" y=\"-0.3478113412\" z=\"0.290012527109\"/>\n <p x=\"0.708517378406\" y=\"-0.430060842576\" z=\"0.364052535788\"/>\n <p x=\"0.192145159903\" y=\"-0.472473021886\" z=\"0.713989300463\"/>\n <p x=\"0.585702822963\" y=\"-0.685343416256\" z=\"-0.193300308301\"/>\n <p x=\"-0.51682291136\" y=\"0.633270476843\" z=\"0.147026043099\"/>\n <p x=\"-0.639637466803\" y=\"0.377987903163\" z=\"-0.41032680099\"/>\n <p x=\"-0.565156786958\" y=\"0.184701874818\" z=\"0.579859551523\"/>\n <p x=\"-0.123265248299\" y=\"0.420400082473\" z=\"-0.760263565666\"/>\n <p x=\"0.071632888408\" y=\"-0.159729658472\" z=\"-0.888165873098\"/>\n <p x=\"0.634036698561\" y=\"-0.236774814231\" z=\"-0.626133816725\"/>\n <p x=\"0.318684889025\" y=\"0.701894824503\" z=\"-0.419183536059\"/>\n <p x=\"0.78672323193\" y=\"0.295738401787\" z=\"-0.336286792311\"/>\n <p x=\"-0.00275297680469\" y=\"0.10765671906\" z=\"0.841891607896\"/>\n <p x=\"0.39316556887\" y=\"0.508608796158\" z=\"0.571002816453\"/>\n <p x=\"0.0754528767199\" y=\"0.833455963423\" z=\"0.141552279797\"/>\n <p x=\"0.83275482358\" y=\"0.176281066719\" z=\"0.275682028738\"/>\n <p x=\"-0.277001487637\" y=\"0.885860952757\" z=\"-0.372183487311\"/>\n <p x=\"-0.411797628396\" y=\"-0.365131558629\" z=\"0.834926139332\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>3</v><v>2</v><v>7</v></f>\n <f><v>8</v><v>9</v><v>0</v><v>4</v><v>10</v></f>\n <f><v>11</v><v>12</v><v>1</v><v>0</v><v>9</v></f>\n <f><v>13</v><v>7</v><v>2</v><v>1</v><v>12</v></f>\n <f><v>12</v><v>11</v><v>14</v><v>15</v><v>13</v></f>\n <f><v>10</v><v>16</v><v>17</v><v>18</v><v>8</v></f>\n <f><v>6</v><v>5</v><v>19</v><v>17</v><v>16</v></f>\n <f><v>7</v><v>13</v><v>15</v><v>19</v><v>5</v></f>\n <f><v>19</v><v>15</v><v>14</v><v>18</v><v>17</v></f>\n <f><v>20</v><v>18</v><v>14</v></f>\n <f><v>20</v><v>14</v><v>11</v></f>\n <f><v>20</v><v>8</v><v>18</v></f>\n <f><v>20</v><v>9</v><v>8</v></f>\n <f><v>9</v><v>20</v><v>11</v></f>\n <f><v>21</v><v>4</v><v>3</v></f>\n <f><v>21</v><v>3</v><v>6</v></f>\n <f><v>21</v><v>10</v><v>4</v></f>\n <f><v>21</v><v>16</v><v>10</v></f>\n <f><v>16</v><v>21</v><v>6</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/metabiaugmented_hexagonal_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.667518933705\" y=\"0.311827737748\" z=\"0.296414691359\"/>\n <p x=\"0.294283738058\" y=\"0.736535814821\" z=\"-0.0398974828551\"/>\n <p x=\"-0.355669656972\" y=\"0.643070626925\" z=\"-0.0800494873507\"/>\n <p x=\"-0.632387856355\" y=\"0.124897361957\" z=\"0.216110682367\"/>\n <p x=\"-0.259152660708\" y=\"-0.299810715115\" z=\"0.552422856581\"/>\n <p x=\"0.390800734322\" y=\"-0.206345527219\" z=\"0.592574861077\"/>\n <p x=\"-0.174048324994\" y=\"-0.657175874936\" z=\"0.00668048593961\"/>\n <p x=\"-0.547283520641\" y=\"-0.232467797863\" z=\"-0.329631688274\"/>\n <p x=\"-0.270565321258\" y=\"0.285705467104\" z=\"-0.625791857992\"/>\n <p x=\"0.379388073772\" y=\"0.379170655\" z=\"-0.585639853496\"/>\n <p x=\"0.752623269419\" y=\"-0.0455374220724\" z=\"-0.249327679283\"/>\n <p x=\"0.475905070036\" y=\"-0.56371068704\" z=\"0.0468324904352\"/>\n <p x=\"-0.869191581773\" y=\"0.340530757766\" z=\"-0.358531445191\"/>\n <p x=\"0.14777910339\" y=\"-0.816690397076\" z=\"0.557833426684\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v></f>\n <f><v>6</v><v>7</v><v>8</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>1</v><v>0</v><v>10</v><v>9</v></f>\n <f><v>2</v><v>1</v><v>9</v><v>8</v></f>\n <f><v>4</v><v>3</v><v>7</v><v>6</v></f>\n <f><v>0</v><v>5</v><v>11</v><v>10</v></f>\n <f><v>2</v><v>12</v><v>3</v></f>\n <f><v>2</v><v>8</v><v>12</v></f>\n <f><v>3</v><v>12</v><v>7</v></f>\n <f><v>7</v><v>12</v><v>8</v></f>\n <f><v>4</v><v>13</v><v>5</v></f>\n <f><v>4</v><v>6</v><v>13</v></f>\n <f><v>5</v><v>13</v><v>11</v></f>\n <f><v>11</v><v>13</v><v>6</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/metabiaugmented_truncated_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.16758640142\" y=\"-0.685802070526\" z=\"0.682381246444\"/>\n <p x=\"0.22171662216\" y=\"-0.846727482433\" z=\"0.419204261958\"/>\n <p x=\"0.401375940851\" y=\"-0.860479277602\" z=\"0.163035154735\"/>\n <p x=\"0.637940604147\" y=\"-0.721804737686\" z=\"0.0117218168675\"/>\n <p x=\"0.841050951207\" y=\"-0.483672823558\" z=\"0.0230608004691\"/>\n <p x=\"0.93312573292\" y=\"-0.237041832609\" z=\"0.192720999202\"/>\n <p x=\"0.878995512179\" y=\"-0.0761164207027\" z=\"0.455897983688\"/>\n <p x=\"0.699336193489\" y=\"-0.0623646255335\" z=\"0.712067090911\"/>\n <p x=\"0.462771530193\" y=\"-0.20103916545\" z=\"0.863380428779\"/>\n <p x=\"0.259661183133\" y=\"-0.439171079577\" z=\"0.852041445177\"/>\n <p x=\"0.169236615785\" y=\"-0.161476283235\" z=\"0.965170538969\"/>\n <p x=\"-0.695917814402\" y=\"-0.276518882895\" z=\"0.556040736861\"/>\n <p x=\"-0.605493247054\" y=\"-0.554213679237\" z=\"0.442911643069\"/>\n <p x=\"-0.367108441953\" y=\"-0.75690230727\" z=\"0.429525122931\"/>\n <p x=\"-0.0718182922474\" y=\"-0.807164600218\" z=\"0.520994372148\"/>\n <p x=\"-0.0691481893157\" y=\"0.0412123447981\" z=\"0.978557059107\"/>\n <p x=\"-0.364438339022\" y=\"0.0914746377455\" z=\"0.88708780989\"/>\n <p x=\"-0.603843032689\" y=\"-0.0298878919459\" z=\"0.725700935594\"/>\n <p x=\"-0.161327991962\" y=\"0.329606551873\" z=\"0.898426793492\"/>\n <p x=\"-0.374543737993\" y=\"-0.711578876088\" z=\"-0.389134660804\"/>\n <p x=\"-0.0810088235856\" y=\"-0.751141758303\" z=\"-0.490924770994\"/>\n <p x=\"0.21428132612\" y=\"-0.801404051251\" z=\"-0.399455521777\"/>\n <p x=\"0.39853591048\" y=\"-0.843167267377\" z=\"-0.149665057429\"/>\n <p x=\"-0.551363026313\" y=\"-0.715139091144\" z=\"0.179734658583\"/>\n <p x=\"-0.554203056684\" y=\"-0.697827080919\" z=\"-0.132965553581\"/>\n <p x=\"0.447900938113\" y=\"-0.110392303086\" z=\"-0.773939138691\"/>\n <p x=\"0.68730563178\" y=\"0.0109702266057\" z=\"-0.612552264395\"/>\n <p x=\"0.871560216139\" y=\"-0.0307929895208\" z=\"-0.362761800047\"/>\n <p x=\"0.930285702549\" y=\"-0.219729822384\" z=\"-0.119979212962\"/>\n <p x=\"0.155555839711\" y=\"-0.612467218387\" z=\"-0.642238108862\"/>\n <p x=\"0.244790591053\" y=\"-0.348524217214\" z=\"-0.785278122293\"/>\n <p x=\"0.634825625404\" y=\"0.696221425804\" z=\"-0.0665859873839\"/>\n <p x=\"0.637665655775\" y=\"0.678909415579\" z=\"0.24611422478\"/>\n <p x=\"0.696391142185\" y=\"0.489972582715\" z=\"0.488896811865\"/>\n <p x=\"0.788570944831\" y=\"0.20157837564\" z=\"0.56902707748\"/>\n <p x=\"0.779380413493\" y=\"0.257601217554\" z=\"-0.442892065662\"/>\n <p x=\"0.688955846145\" y=\"0.535296013897\" z=\"-0.32976297187\"/>\n <p x=\"-0.0720932406195\" y=\"0.593549553047\" z=\"0.755386780061\"/>\n <p x=\"0.458006337084\" y=\"0.692661210748\" z=\"0.502283332003\"/>\n <p x=\"0.164471422677\" y=\"0.732224092963\" z=\"0.604073442193\"/>\n <p x=\"-0.554478005056\" y=\"0.702887072345\" z=\"0.101426854332\"/>\n <p x=\"-0.31791334176\" y=\"0.841561612262\" z=\"-0.049886483536\"/>\n <p x=\"-0.138254023069\" y=\"0.827809817092\" z=\"-0.306055590759\"/>\n <p x=\"-0.0841238023285\" y=\"0.666884405186\" z=\"-0.569232575245\"/>\n <p x=\"-0.176198584042\" y=\"0.420253414237\" z=\"-0.738892773978\"/>\n <p x=\"-0.379308931102\" y=\"0.182121500109\" z=\"-0.75023175758\"/>\n <p x=\"-0.615873594398\" y=\"0.0434469601933\" z=\"-0.598918419712\"/>\n <p x=\"-0.795532913088\" y=\"0.0571987553625\" z=\"-0.342749312489\"/>\n <p x=\"-0.849663133829\" y=\"0.218124167269\" z=\"-0.0795723280028\"/>\n <p x=\"-0.757588352116\" y=\"0.464755158218\" z=\"0.0900878707301\"/>\n <p x=\"-0.846823103458\" y=\"0.200812157044\" z=\"0.233127884161\"/>\n <p x=\"-0.130818727029\" y=\"0.78248638591\" z=\"0.512604192976\"/>\n <p x=\"-0.315073311389\" y=\"0.824249602037\" z=\"0.262813728628\"/>\n <p x=\"-0.788097617048\" y=\"0.0118753241806\" z=\"0.475910471246\"/>\n <p x=\"0.450571041044\" y=\"0.73798464193\" z=\"-0.316376451732\"/>\n <p x=\"0.155280891338\" y=\"0.788246934877\" z=\"-0.407845700949\"/>\n <p x=\"-0.0857740166938\" y=\"0.142558617894\" z=\"-0.85202186777\"/>\n <p x=\"-0.612928543094\" y=\"-0.508890248056\" z=\"-0.375748140666\"/>\n <p x=\"-0.70510834574\" y=\"-0.22049604098\" z=\"-0.455878406281\"/>\n <p x=\"0.152610788407\" y=\"-0.0601300101383\" z=\"-0.865408387908\"/>\n <p x=\"-0.924721625211\" y=\"-0.0855126018815\" z=\"-0.0957008570566\"/>\n <p x=\"-0.834297057863\" y=\"-0.363207398224\" z=\"-0.208829950848\"/>\n <p x=\"-0.775571571453\" y=\"-0.552144231088\" z=\"0.0339526362363\"/>\n <p x=\"-0.829701792194\" y=\"-0.391218819181\" z=\"0.297129620723\"/>\n <p x=\"-0.92188159484\" y=\"-0.102824612106\" z=\"0.216999355108\"/>\n <p x=\"0.117792438399\" y=\"0.525610615394\" z=\"-0.762521846045\"/>\n <p x=\"0.357197132066\" y=\"0.646973145086\" z=\"-0.601134971749\"/>\n <p x=\"0.595581937166\" y=\"0.444284517053\" z=\"-0.614521491887\"/>\n <p x=\"0.503507155453\" y=\"0.197653526104\" z=\"-0.78418169062\"/>\n <p x=\"0.208217005747\" y=\"0.247915819051\" z=\"-0.875650939837\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>9</v><v>8</v></f>\n <f><v>11</v><v>12</v><v>13</v><v>14</v><v>0</v><v>9</v><v>10</v><v>15</v><v>16</v><v>17</v></f>\n <f><v>18</v><v>16</v><v>15</v></f>\n <f><v>14</v><v>1</v><v>0</v></f>\n <f><v>19</v><v>20</v><v>21</v><v>22</v><v>2</v><v>1</v><v>14</v><v>13</v><v>23</v><v>24</v></f>\n <f><v>12</v><v>23</v><v>13</v></f>\n <f><v>22</v><v>3</v><v>2</v></f>\n <f><v>25</v><v>26</v><v>27</v><v>28</v><v>4</v><v>3</v><v>22</v><v>21</v><v>29</v><v>30</v></f>\n <f><v>20</v><v>29</v><v>21</v></f>\n <f><v>28</v><v>5</v><v>4</v></f>\n <f><v>31</v><v>32</v><v>33</v><v>34</v><v>6</v><v>5</v><v>28</v><v>27</v><v>35</v><v>36</v></f>\n <f><v>26</v><v>35</v><v>27</v></f>\n <f><v>34</v><v>7</v><v>6</v></f>\n <f><v>37</v><v>18</v><v>15</v><v>10</v><v>8</v><v>7</v><v>34</v><v>33</v><v>38</v><v>39</v></f>\n <f><v>32</v><v>38</v><v>33</v></f>\n <f><v>40</v><v>41</v><v>42</v><v>43</v><v>44</v><v>45</v><v>46</v><v>47</v><v>48</v><v>49</v></f>\n <f><v>50</v><v>49</v><v>48</v></f>\n <f><v>18</v><v>37</v><v>51</v><v>52</v><v>40</v><v>49</v><v>50</v><v>53</v><v>17</v><v>16</v></f>\n <f><v>11</v><v>17</v><v>53</v></f>\n <f><v>52</v><v>41</v><v>40</v></f>\n <f><v>32</v><v>31</v><v>54</v><v>55</v><v>42</v><v>41</v><v>52</v><v>51</v><v>39</v><v>38</v></f>\n <f><v>37</v><v>39</v><v>51</v></f>\n <f><v>55</v><v>43</v><v>42</v></f>\n <f><v>36</v><v>54</v><v>31</v></f>\n <f><v>56</v><v>45</v><v>44</v></f>\n <f><v>20</v><v>19</v><v>57</v><v>58</v><v>46</v><v>45</v><v>56</v><v>59</v><v>30</v><v>29</v></f>\n <f><v>25</v><v>30</v><v>59</v></f>\n <f><v>58</v><v>47</v><v>46</v></f>\n <f><v>24</v><v>57</v><v>19</v></f>\n <f><v>60</v><v>61</v><v>62</v><v>63</v><v>64</v></f>\n <f><v>61</v><v>60</v><v>47</v><v>58</v></f>\n <f><v>61</v><v>58</v><v>57</v></f>\n <f><v>62</v><v>61</v><v>57</v><v>24</v></f>\n <f><v>62</v><v>24</v><v>23</v></f>\n <f><v>63</v><v>62</v><v>23</v><v>12</v></f>\n <f><v>63</v><v>12</v><v>11</v></f>\n <f><v>64</v><v>63</v><v>11</v><v>53</v></f>\n <f><v>50</v><v>64</v><v>53</v></f>\n <f><v>60</v><v>64</v><v>50</v><v>48</v></f>\n <f><v>60</v><v>48</v><v>47</v></f>\n <f><v>65</v><v>66</v><v>67</v><v>68</v><v>69</v></f>\n <f><v>66</v><v>65</v><v>43</v><v>55</v></f>\n <f><v>66</v><v>55</v><v>54</v></f>\n <f><v>67</v><v>66</v><v>54</v><v>36</v></f>\n <f><v>67</v><v>36</v><v>35</v></f>\n <f><v>68</v><v>67</v><v>35</v><v>26</v></f>\n <f><v>68</v><v>26</v><v>25</v></f>\n <f><v>69</v><v>68</v><v>25</v><v>59</v></f>\n <f><v>56</v><v>69</v><v>59</v></f>\n <f><v>65</v><v>69</v><v>56</v><v>44</v></f>\n <f><v>65</v><v>44</v><v>43</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/metabidiminished_icosahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.647619937451\" y=\"-0.639950425842\" z=\"0.143946306097\"/>\n <p x=\"-0.196636831529\" y=\"-0.486308207161\" z=\"-0.693971960926\"/>\n <p x=\"0.723423622671\" y=\"-0.272291568186\" z=\"-0.502179483865\"/>\n <p x=\"0.84106914915\" y=\"-0.293664229821\" z=\"0.454273052769\"/>\n <p x=\"-0.00628237106232\" y=\"-0.520889900118\" z=\"0.853600751973\"/>\n <p x=\"-0.631589610408\" y=\"0.182683328188\" z=\"0.646057300543\"/>\n <p x=\"0.739453949714\" y=\"0.550342185845\" z=\"-6.84894181854E-05\"/>\n <p x=\"-0.170699217523\" y=\"0.844741167152\" z=\"0.118460694213\"/>\n <p x=\"0.0981163833254\" y=\"0.43128166012\" z=\"-0.709722935295\"/>\n <p x=\"-0.749235136887\" y=\"0.204055989824\" z=\"-0.310395236091\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>4</v><v>3</v><v>6</v><v>7</v></f>\n <f><v>8</v><v>1</v><v>9</v></f>\n <f><v>9</v><v>1</v><v>0</v></f>\n <f><v>0</v><v>4</v><v>5</v></f>\n <f><v>0</v><v>5</v><v>9</v></f>\n <f><v>5</v><v>7</v><v>9</v></f>\n <f><v>7</v><v>6</v><v>8</v></f>\n <f><v>7</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>6</v></f>\n <f><v>2</v><v>8</v><v>6</v></f>\n <f><v>2</v><v>1</v><v>8</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/metabidiminished_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.689021642083\" y=\"0.530414300337\" z=\"-0.29905080477\"/>\n <p x=\"0.504549621715\" y=\"0.387371972486\" z=\"-0.635945558164\"/>\n <p x=\"0.18330807899\" y=\"0.631441295974\" z=\"-0.563674227196\"/>\n <p x=\"0.367780099358\" y=\"0.774483623825\" z=\"-0.226779473802\"/>\n <p x=\"-0.0385455035036\" y=\"0.808771227249\" z=\"-0.268167557002\"/>\n <p x=\"-0.152899014215\" y=\"0.442850480219\" z=\"-0.702912883511\"/>\n <p x=\"-0.374752596708\" y=\"0.620180411494\" z=\"-0.407406213317\"/>\n <p x=\"0.366880720513\" y=\"0.0479380192036\" z=\"-0.81985035343\"/>\n <p x=\"-0.0394448823483\" y=\"0.0822256226277\" z=\"-0.86123843663\"/>\n <p x=\"-0.512421497909\" y=\"0.280746458212\" z=\"-0.591311008582\"/>\n <p x=\"-0.757934003043\" y=\"0.207047456646\" z=\"-0.271496725425\"/>\n <p x=\"-0.620265101841\" y=\"0.546481409928\" z=\"-0.0875919301588\"/>\n <p x=\"-0.398967366043\" y=\"-0.0798783993793\" z=\"-0.749636561701\"/>\n <p x=\"-0.0777258233177\" y=\"-0.323947722867\" z=\"-0.82190789267\"/>\n <p x=\"-0.253119818794\" y=\"-0.620525143612\" z=\"-0.599944182627\"/>\n <p x=\"-0.574361361519\" y=\"-0.376455820124\" z=\"-0.527672851659\"/>\n <p x=\"-0.796214944012\" y=\"-0.199125888849\" z=\"-0.232166181464\"/>\n <p x=\"-0.498632323927\" y=\"-0.694224145177\" z=\"-0.280129899469\"/>\n <p x=\"-0.720485906421\" y=\"-0.516894213902\" z=\"0.0153767707251\"/>\n <p x=\"-0.0762705977782\" y=\"0.851627759786\" z=\"0.137700948307\"/>\n <p x=\"0.330055005083\" y=\"0.817340156362\" z=\"0.179089031507\"/>\n <p x=\"0.0845424999498\" y=\"0.743641154797\" z=\"0.498903314665\"/>\n <p x=\"-0.435793081473\" y=\"0.689523737779\" z=\"0.249302823235\"/>\n <p x=\"-0.274979983745\" y=\"0.58153713279\" z=\"0.610505189593\"/>\n <p x=\"-0.611187076949\" y=\"0.392946317035\" z=\"0.471266533278\"/>\n <p x=\"-0.535458039357\" y=\"0.0751779919815\" z=\"0.718809485468\"/>\n <p x=\"-0.199250946153\" y=\"0.263768807737\" z=\"0.858048141783\"/>\n <p x=\"-0.795659097318\" y=\"0.249903989184\" z=\"0.134371779884\"/>\n <p x=\"-0.833940038287\" y=\"-0.156269356311\" z=\"0.173702323844\"/>\n <p x=\"-0.673126940559\" y=\"-0.264255961301\" z=\"0.534904690202\"/>\n <p x=\"-0.559672808693\" y=\"-0.624880818891\" z=\"0.376579137083\"/>\n <p x=\"0.382468652185\" y=\"0.526058625057\" z=\"0.67747251494\"/>\n <p x=\"0.627981157318\" y=\"0.599757626622\" z=\"0.357658231782\"/>\n <p x=\"0.70371019491\" y=\"0.281989301569\" z=\"0.605201183971\"/>\n <p x=\"0.207074656708\" y=\"0.229481204313\" z=\"0.899436224983\"/>\n <p x=\"0.528316199434\" y=\"-0.0145881191756\" z=\"0.827164894014\"/>\n <p x=\"0.504101430099\" y=\"-0.714646930049\" z=\"0.484934545629\"/>\n <p x=\"0.6417703313\" y=\"-0.375212976767\" z=\"0.668839340895\"/>\n <p x=\"-0.238431265967\" y=\"-0.86895014238\" z=\"0.304307806114\"/>\n <p x=\"0.167894336894\" y=\"-0.903237745804\" z=\"0.345695889314\"/>\n <p x=\"0.925563777403\" y=\"0.104659370294\" z=\"0.309694513777\"/>\n <p x=\"0.849834739811\" y=\"0.422427695347\" z=\"0.0621515615877\"/>\n <p x=\"0.887282836434\" y=\"-0.301513975201\" z=\"0.349025057737\"/>\n <p x=\"0.749613935232\" y=\"-0.640947928483\" z=\"0.165120262472\"/>\n <p x=\"0.565141914864\" y=\"-0.783990256334\" z=\"-0.171774490923\"/>\n <p x=\"0.404328817136\" y=\"-0.676003651345\" z=\"-0.53297685728\"/>\n <p x=\"0.328599779544\" y=\"-0.358235326292\" z=\"-0.78051980947\"/>\n <p x=\"0.205619431169\" y=\"-0.946094278341\" z=\"-0.060172615994\"/>\n <p x=\"-0.200706171693\" y=\"-0.911806674917\" z=\"-0.101560699194\"/>\n <p x=\"0.0448063334409\" y=\"-0.838107673352\" z=\"-0.421374982352\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>5</v><v>6</v><v>4</v></f>\n <f><v>1</v><v>7</v><v>8</v><v>5</v><v>2</v></f>\n <f><v>5</v><v>9</v><v>6</v></f>\n <f><v>6</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>8</v><v>12</v><v>9</v><v>5</v></f>\n <f><v>8</v><v>13</v><v>12</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>12</v></f>\n <f><v>12</v><v>15</v><v>16</v><v>10</v><v>9</v></f>\n <f><v>14</v><v>17</v><v>15</v></f>\n <f><v>15</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>3</v><v>4</v><v>19</v><v>20</v></f>\n <f><v>20</v><v>19</v><v>21</v></f>\n <f><v>19</v><v>22</v><v>23</v><v>21</v></f>\n <f><v>4</v><v>6</v><v>11</v><v>22</v><v>19</v></f>\n <f><v>22</v><v>24</v><v>23</v></f>\n <f><v>23</v><v>24</v><v>25</v><v>26</v></f>\n <f><v>11</v><v>27</v><v>24</v><v>22</v></f>\n <f><v>11</v><v>10</v><v>27</v></f>\n <f><v>10</v><v>16</v><v>28</v><v>27</v></f>\n <f><v>27</v><v>28</v><v>29</v><v>25</v><v>24</v></f>\n <f><v>16</v><v>18</v><v>28</v></f>\n <f><v>28</v><v>18</v><v>30</v><v>29</v></f>\n <f><v>20</v><v>21</v><v>31</v><v>32</v></f>\n <f><v>32</v><v>31</v><v>33</v></f>\n <f><v>31</v><v>34</v><v>35</v><v>33</v></f>\n <f><v>21</v><v>23</v><v>26</v><v>34</v><v>31</v></f>\n <f><v>36</v><v>37</v><v>35</v><v>34</v><v>26</v><v>25</v><v>29</v><v>30</v><v>38</v><v>39</v></f>\n <f><v>32</v><v>33</v><v>40</v><v>41</v></f>\n <f><v>41</v><v>40</v><v>42</v><v>43</v><v>44</v><v>45</v><v>46</v><v>7</v><v>1</v><v>0</v></f>\n <f><v>33</v><v>35</v><v>37</v><v>42</v><v>40</v></f>\n <f><v>37</v><v>36</v><v>43</v><v>42</v></f>\n <f><v>36</v><v>39</v><v>47</v><v>44</v><v>43</v></f>\n <f><v>39</v><v>38</v><v>48</v><v>47</v></f>\n <f><v>7</v><v>46</v><v>13</v><v>8</v></f>\n <f><v>44</v><v>47</v><v>49</v><v>45</v></f>\n <f><v>45</v><v>49</v><v>14</v><v>13</v><v>46</v></f>\n <f><v>47</v><v>48</v><v>49</v></f>\n <f><v>49</v><v>48</v><v>17</v><v>14</v></f>\n <f><v>0</v><v>3</v><v>20</v><v>32</v><v>41</v></f>\n <f><v>48</v><v>38</v><v>30</v><v>18</v><v>17</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/metabigyrate_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.302856741097\" y=\"0.0230348564212\" z=\"-0.952757604746\"/>\n <p x=\"-0.542415920186\" y=\"0.350643474022\" z=\"-0.763435647121\"/>\n <p x=\"-0.181745633413\" y=\"0.616099470772\" z=\"-0.766413612882\"/>\n <p x=\"0.0578135456761\" y=\"0.288490853171\" z=\"-0.955735570508\"/>\n <p x=\"0.265173640553\" y=\"0.620429386561\" z=\"-0.738071989933\"/>\n <p x=\"-0.206900282206\" y=\"0.887731249484\" z=\"-0.411248537615\"/>\n <p x=\"0.240019008353\" y=\"0.892061185798\" z=\"-0.382906929189\"/>\n <p x=\"-0.790477064937\" y=\"0.458214424225\" z=\"-0.406430087795\"/>\n <p x=\"-0.583116996908\" y=\"0.790152924402\" z=\"-0.188766483721\"/>\n <p x=\"-0.235551364213\" y=\"0.971465346413\" z=\"0.0277577570584\"/>\n <p x=\"0.211367882906\" y=\"0.97579522899\" z=\"0.0560994035066\"/>\n <p x=\"-0.744929181313\" y=\"0.636597760432\" z=\"0.199558687814\"/>\n <p x=\"-0.397363548618\" y=\"0.817910182442\" z=\"0.416082928593\"/>\n <p x=\"-0.630530080772\" y=\"0.485718611061\" z=\"0.605399960151\"/>\n <p x=\"-0.28361626341\" y=\"0.395146183156\" z=\"0.873739761295\"/>\n <p x=\"-0.0504497312554\" y=\"0.727337754538\" z=\"0.684422729737\"/>\n <p x=\"0.325766983446\" y=\"0.824916079619\" z=\"0.461940675844\"/>\n <p x=\"0.163302983709\" y=\"0.399476065733\" z=\"0.902081407743\"/>\n <p x=\"0.539519698411\" y=\"0.497054390814\" z=\"0.679599353849\"/>\n <p x=\"0.627633858996\" y=\"0.361979253775\" z=\"-0.689236253422\"/>\n <p x=\"0.420273790967\" y=\"0.0300407535978\" z=\"-0.906899857496\"/>\n <p x=\"0.826491961364\" y=\"0.473880086555\" z=\"-0.303889047648\"/>\n <p x=\"0.879463549258\" y=\"0.0621425002134\" z=\"-0.471891967627\"/>\n <p x=\"0.940891101845\" y=\"0.323000953129\" z=\"0.101952247636\"/>\n <p x=\"0.993862649799\" y=\"-0.0887366491572\" z=\"-0.0660506952897\"/>\n <p x=\"0.586932809123\" y=\"0.801488737367\" z=\"-0.114567113522\"/>\n <p x=\"0.927134657119\" y=\"-0.033027461672\" z=\"0.373270028724\"/>\n <p x=\"0.790477056882\" y=\"-0.458214430153\" z=\"0.406430087862\"/>\n <p x=\"0.857205114186\" y=\"-0.513923591839\" z=\"-0.032890599022\"/>\n <p x=\"0.701331882816\" y=\"0.650609554785\" z=\"0.291274182314\"/>\n <p x=\"0.679073487684\" y=\"0.0745434786766\" z=\"0.730275573867\"/>\n <p x=\"0.302856733042\" y=\"-0.0230348623495\" z=\"0.952757604813\"/>\n <p x=\"0.672103481229\" y=\"-0.269795999964\" z=\"-0.689555571701\"/>\n <p x=\"0.283616255355\" y=\"-0.395146189084\" z=\"-0.873739761228\"/>\n <p x=\"0.658347011818\" y=\"-0.625824424619\" z=\"-0.418237804795\"/>\n <p x=\"0.269859785945\" y=\"-0.751174613739\" z=\"-0.602421994323\"/>\n <p x=\"0.384258886485\" y=\"-0.90205376311\" z=\"-0.196580721986\"/>\n <p x=\"0.583116988853\" y=\"-0.79015293033\" z=\"0.188766483788\"/>\n <p x=\"0.206900274151\" y=\"-0.887731255412\" z=\"0.411248537681\"/>\n <p x=\"0.00804217178341\" y=\"-0.999632088191\" z=\"0.025901331908\"/>\n <p x=\"0.542415912132\" y=\"-0.35064347995\" z=\"0.763435647187\"/>\n <p x=\"0.181745625359\" y=\"-0.6160994767\" z=\"0.766413612949\"/>\n <p x=\"-0.0578135537308\" y=\"-0.288490859099\" z=\"0.955735570574\"/>\n <p x=\"-0.177059461174\" y=\"-0.755504496316\" z=\"-0.630763640771\"/>\n <p x=\"-0.163302991763\" y=\"-0.399476071661\" z=\"-0.902081407676\"/>\n <p x=\"-0.539519706465\" y=\"-0.497054396743\" z=\"-0.679599353783\"/>\n <p x=\"-0.338871645579\" y=\"-0.909059660287\" z=\"-0.242438469236\"/>\n <p x=\"-0.70133189087\" y=\"-0.650609560713\" z=\"-0.291274182248\"/>\n <p x=\"-0.58693279033\" y=\"-0.801488710084\" z=\"0.114567090089\"/>\n <p x=\"-0.826491969419\" y=\"-0.473880092483\" z=\"0.303889047715\"/>\n <p x=\"-0.94089106996\" y=\"-0.323000943113\" z=\"-0.101952224622\"/>\n <p x=\"-0.240018972967\" y=\"-0.892061137989\" z=\"0.382906891233\"/>\n <p x=\"-0.26517362176\" y=\"-0.620429359277\" z=\"0.7380719665\"/>\n <p x=\"-0.627633867051\" y=\"-0.361979259704\" z=\"0.689236253488\"/>\n <p x=\"-0.420273799022\" y=\"-0.0300407595261\" z=\"0.906899857562\"/>\n <p x=\"-0.679073455799\" y=\"-0.0745434686604\" z=\"-0.730275550853\"/>\n <p x=\"-0.927134600549\" y=\"0.0330274815424\" z=\"-0.373269991528\"/>\n <p x=\"-0.952289249342\" y=\"0.304659260254\" z=\"-0.0181049162605\"/>\n <p x=\"-0.966045718753\" y=\"-0.0513691644008\" z=\"0.253212850645\"/>\n <p x=\"-0.767187616385\" y=\"0.0605316683788\" z=\"0.638560056418\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>5</v><v>6</v><v>4</v></f>\n <f><v>1</v><v>7</v><v>8</v><v>5</v><v>2</v></f>\n <f><v>8</v><v>9</v><v>5</v></f>\n <f><v>5</v><v>9</v><v>10</v><v>6</v></f>\n <f><v>11</v><v>12</v><v>9</v><v>8</v></f>\n <f><v>11</v><v>13</v><v>12</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>12</v></f>\n <f><v>12</v><v>15</v><v>16</v><v>10</v><v>9</v></f>\n <f><v>14</v><v>17</v><v>15</v></f>\n <f><v>15</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>3</v><v>4</v><v>19</v><v>20</v></f>\n <f><v>19</v><v>21</v><v>22</v></f>\n <f><v>21</v><v>23</v><v>24</v><v>22</v></f>\n <f><v>4</v><v>6</v><v>25</v><v>21</v><v>19</v></f>\n <f><v>23</v><v>26</v><v>24</v></f>\n <f><v>24</v><v>26</v><v>27</v><v>28</v></f>\n <f><v>25</v><v>29</v><v>23</v><v>21</v></f>\n <f><v>6</v><v>10</v><v>25</v></f>\n <f><v>10</v><v>16</v><v>29</v><v>25</v></f>\n <f><v>29</v><v>18</v><v>30</v><v>26</v><v>23</v></f>\n <f><v>16</v><v>18</v><v>29</v></f>\n <f><v>18</v><v>17</v><v>31</v><v>30</v></f>\n <f><v>19</v><v>22</v><v>32</v><v>20</v></f>\n <f><v>20</v><v>32</v><v>33</v></f>\n <f><v>32</v><v>34</v><v>35</v><v>33</v></f>\n <f><v>22</v><v>24</v><v>28</v><v>34</v><v>32</v></f>\n <f><v>34</v><v>36</v><v>35</v></f>\n <f><v>36</v><v>37</v><v>38</v><v>39</v></f>\n <f><v>28</v><v>37</v><v>36</v><v>34</v></f>\n <f><v>28</v><v>27</v><v>37</v></f>\n <f><v>26</v><v>30</v><v>40</v><v>27</v></f>\n <f><v>27</v><v>40</v><v>41</v><v>38</v><v>37</v></f>\n <f><v>30</v><v>31</v><v>40</v></f>\n <f><v>40</v><v>31</v><v>42</v><v>41</v></f>\n <f><v>33</v><v>35</v><v>43</v><v>44</v></f>\n <f><v>44</v><v>43</v><v>45</v></f>\n <f><v>43</v><v>46</v><v>47</v><v>45</v></f>\n <f><v>35</v><v>36</v><v>39</v><v>46</v><v>43</v></f>\n <f><v>46</v><v>48</v><v>47</v></f>\n <f><v>47</v><v>48</v><v>49</v><v>50</v></f>\n <f><v>39</v><v>51</v><v>48</v><v>46</v></f>\n <f><v>39</v><v>38</v><v>51</v></f>\n <f><v>38</v><v>41</v><v>52</v><v>51</v></f>\n <f><v>51</v><v>52</v><v>53</v><v>49</v><v>48</v></f>\n <f><v>41</v><v>42</v><v>52</v></f>\n <f><v>52</v><v>42</v><v>54</v><v>53</v></f>\n <f><v>44</v><v>45</v><v>55</v><v>0</v></f>\n <f><v>0</v><v>55</v><v>1</v></f>\n <f><v>55</v><v>56</v><v>7</v><v>1</v></f>\n <f><v>45</v><v>47</v><v>50</v><v>56</v><v>55</v></f>\n <f><v>56</v><v>57</v><v>7</v></f>\n <f><v>7</v><v>57</v><v>11</v><v>8</v></f>\n <f><v>50</v><v>58</v><v>57</v><v>56</v></f>\n <f><v>50</v><v>49</v><v>58</v></f>\n <f><v>49</v><v>53</v><v>59</v><v>58</v></f>\n <f><v>58</v><v>59</v><v>13</v><v>11</v><v>57</v></f>\n <f><v>53</v><v>54</v><v>59</v></f>\n <f><v>59</v><v>54</v><v>14</v><v>13</v></f>\n <f><v>0</v><v>3</v><v>20</v><v>33</v><v>44</v></f>\n <f><v>54</v><v>42</v><v>31</v><v>17</v><v>14</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/metagyrate_diminished_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.175010851544\" y=\"0.26510748617\" z=\"-0.948203154719\"/>\n <p x=\"-0.246783958405\" y=\"0.24051071008\" z=\"-0.938750380139\"/>\n <p x=\"-0.262771228253\" y=\"0.599900531261\" z=\"-0.716965390396\"/>\n <p x=\"0.159023581696\" y=\"0.624497307351\" z=\"-0.726418164975\"/>\n <p x=\"-0.0583349151438\" y=\"0.834659913764\" z=\"-0.431134943714\"/>\n <p x=\"-0.598477394035\" y=\"0.58056095042\" z=\"-0.46097209183\"/>\n <p x=\"-0.394041080925\" y=\"0.815320332923\" z=\"-0.175141645148\"/>\n <p x=\"-0.572609448033\" y=\"-0.000943995461789\" z=\"-0.819827743429\"/>\n <p x=\"-0.789967944872\" y=\"0.209218610951\" z=\"-0.524544522168\"/>\n <p x=\"-0.719866570553\" y=\"0.573865627381\" z=\"-0.0562190084386\"/>\n <p x=\"-0.580572218244\" y=\"0.58237194798\" z=\"0.342691938975\"/>\n <p x=\"-0.254746728617\" y=\"0.823826653521\" z=\"0.223769302265\"/>\n <p x=\"-0.91135712139\" y=\"0.202523287912\" z=\"-0.119791438776\"/>\n <p x=\"-0.895369851542\" y=\"-0.156866533269\" z=\"-0.34157642852\"/>\n <p x=\"-0.874423168175\" y=\"-0.377862399924\" z=\"0.0180445961976\"/>\n <p x=\"-0.890410438024\" y=\"-0.0184725787426\" z=\"0.239829585941\"/>\n <p x=\"-0.685974124914\" y=\"0.21628680376\" z=\"0.525660032623\"/>\n <p x=\"-0.735128815867\" y=\"-0.369356079325\" z=\"0.416955543611\"/>\n <p x=\"-0.530692502757\" y=\"-0.134596696822\" z=\"0.702785990293\"/>\n <p x=\"0.288437257851\" y=\"0.85511875265\" z=\"-0.190436555706\"/>\n <p x=\"0.50579575469\" y=\"0.644956146237\" z=\"-0.485719776968\"/>\n <p x=\"0.645090106999\" y=\"0.653462466836\" z=\"-0.0868088295549\"/>\n <p x=\"0.167048081332\" y=\"0.848423429611\" z=\"0.214316527685\"/>\n <p x=\"0.523700930481\" y=\"0.646767143797\" z=\"0.317944253837\"/>\n <p x=\"0.187994764699\" y=\"0.627427562956\" z=\"0.573937552402\"/>\n <p x=\"0.343276386856\" y=\"0.276544062374\" z=\"0.751063510072\"/>\n <p x=\"0.678982552638\" y=\"0.295883643215\" z=\"0.495070211506\"/>\n <p x=\"-0.23380004525\" y=\"0.602830786866\" z=\"0.583390326982\"/>\n <p x=\"-0.33920195192\" y=\"0.236745642647\" z=\"0.76635842063\"/>\n <p x=\"0.0174508972285\" y=\"0.0350893568323\" z=\"0.869986146782\"/>\n <p x=\"-0.174039653609\" y=\"-0.336252982637\" z=\"0.806413716444\"/>\n <p x=\"0.875394366111\" y=\"0.306716903457\" z=\"-0.159834034472\"/>\n <p x=\"0.736100013802\" y=\"0.298210582858\" z=\"-0.558744981885\"/>\n <p x=\"0.891381635959\" y=\"-0.0526729177244\" z=\"-0.381619024216\"/>\n <p x=\"0.896341049477\" y=\"0.0857210368016\" z=\"0.199786990245\"/>\n <p x=\"0.912328319326\" y=\"-0.273668784379\" z=\"-0.0219979994985\"/>\n <p x=\"0.726443959121\" y=\"-0.122943688106\" z=\"0.525669222514\"/>\n <p x=\"0.74243122897\" y=\"-0.482333509287\" z=\"0.303884232771\"/>\n <p x=\"0.39073779334\" y=\"-0.142283268947\" z=\"0.78166252108\"/>\n <p x=\"0.199247242502\" y=\"-0.513625608416\" z=\"0.718090090742\"/>\n <p x=\"0.416605739342\" y=\"-0.723788214829\" z=\"0.422806869481\"/>\n <p x=\"-0.15805238376\" y=\"-0.695642803818\" z=\"0.584628726701\"/>\n <p x=\"0.0593061130792\" y=\"-0.905805410231\" z=\"0.289345505439\"/>\n <p x=\"0.68694532285\" y=\"-0.287432300227\" z=\"-0.667449470897\"/>\n <p x=\"0.531663700692\" y=\"0.0634512003553\" z=\"-0.844575428567\"/>\n <p x=\"0.58154341618\" y=\"-0.653517444447\" z=\"-0.484481377249\"/>\n <p x=\"0.255717926552\" y=\"-0.894972149988\" z=\"-0.36555874054\"/>\n <p x=\"-0.166076883397\" y=\"-0.919568926078\" z=\"-0.35610596596\"/>\n <p x=\"-0.522729732545\" y=\"-0.717912640264\" z=\"-0.459733692111\"/>\n <p x=\"-0.678011354702\" y=\"-0.367029139682\" z=\"-0.636859649781\"/>\n <p x=\"0.720837768488\" y=\"-0.645011123848\" z=\"-0.0855704298361\"/>\n <p x=\"0.395012278861\" y=\"-0.88646582939\" z=\"0.0333522068735\"/>\n <p x=\"-0.287466059915\" y=\"-0.926264249117\" z=\"0.0486471174317\"/>\n <p x=\"-0.504824556755\" y=\"-0.716101642704\" z=\"0.343930338693\"/>\n <p x=\"-0.644118909063\" y=\"-0.724607963303\" z=\"-0.0549806087198\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>5</v><v>6</v><v>4</v></f>\n <f><v>1</v><v>7</v><v>8</v><v>5</v><v>2</v></f>\n <f><v>5</v><v>9</v><v>6</v></f>\n <f><v>6</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>8</v><v>12</v><v>9</v><v>5</v></f>\n <f><v>8</v><v>13</v><v>12</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>12</v></f>\n <f><v>12</v><v>15</v><v>16</v><v>10</v><v>9</v></f>\n <f><v>14</v><v>17</v><v>15</v></f>\n <f><v>15</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>3</v><v>4</v><v>19</v><v>20</v></f>\n <f><v>20</v><v>19</v><v>21</v></f>\n <f><v>19</v><v>22</v><v>23</v><v>21</v></f>\n <f><v>4</v><v>6</v><v>11</v><v>22</v><v>19</v></f>\n <f><v>22</v><v>24</v><v>23</v></f>\n <f><v>23</v><v>24</v><v>25</v><v>26</v></f>\n <f><v>11</v><v>27</v><v>24</v><v>22</v></f>\n <f><v>11</v><v>10</v><v>27</v></f>\n <f><v>10</v><v>16</v><v>28</v><v>27</v></f>\n <f><v>27</v><v>28</v><v>29</v><v>25</v><v>24</v></f>\n <f><v>16</v><v>18</v><v>28</v></f>\n <f><v>28</v><v>18</v><v>30</v><v>29</v></f>\n <f><v>20</v><v>21</v><v>31</v><v>32</v></f>\n <f><v>32</v><v>31</v><v>33</v></f>\n <f><v>31</v><v>34</v><v>35</v><v>33</v></f>\n <f><v>21</v><v>23</v><v>26</v><v>34</v><v>31</v></f>\n <f><v>26</v><v>36</v><v>34</v></f>\n <f><v>34</v><v>36</v><v>37</v><v>35</v></f>\n <f><v>25</v><v>38</v><v>36</v><v>26</v></f>\n <f><v>25</v><v>29</v><v>38</v></f>\n <f><v>29</v><v>30</v><v>39</v><v>38</v></f>\n <f><v>38</v><v>39</v><v>40</v><v>37</v><v>36</v></f>\n <f><v>30</v><v>41</v><v>39</v></f>\n <f><v>39</v><v>41</v><v>42</v><v>40</v></f>\n <f><v>32</v><v>33</v><v>43</v><v>44</v></f>\n <f><v>44</v><v>43</v><v>45</v><v>46</v><v>47</v><v>48</v><v>49</v><v>7</v><v>1</v><v>0</v></f>\n <f><v>33</v><v>35</v><v>50</v><v>45</v><v>43</v></f>\n <f><v>50</v><v>51</v><v>46</v><v>45</v></f>\n <f><v>35</v><v>37</v><v>50</v></f>\n <f><v>37</v><v>40</v><v>51</v><v>50</v></f>\n <f><v>51</v><v>42</v><v>52</v><v>47</v><v>46</v></f>\n <f><v>40</v><v>42</v><v>51</v></f>\n <f><v>42</v><v>41</v><v>53</v><v>52</v></f>\n <f><v>7</v><v>49</v><v>13</v><v>8</v></f>\n <f><v>47</v><v>52</v><v>54</v><v>48</v></f>\n <f><v>48</v><v>54</v><v>14</v><v>13</v><v>49</v></f>\n <f><v>52</v><v>53</v><v>54</v></f>\n <f><v>54</v><v>53</v><v>17</v><v>14</v></f>\n <f><v>0</v><v>3</v><v>20</v><v>32</v><v>44</v></f>\n <f><v>53</v><v>41</v><v>30</v><v>18</v><v>17</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/octagonal_antiprism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-6.19862718649E-14\" y=\"-0.949848651758\" z=\"-0.312709991449\"/>\n <p x=\"-0.671644422759\" y=\"-0.671644422759\" z=\"-0.312709991449\"/>\n <p x=\"-0.949848651758\" y=\"8.15022621473E-13\" z=\"-0.312709991449\"/>\n <p x=\"-0.671644422759\" y=\"0.67164442276\" z=\"-0.312709991449\"/>\n <p x=\"-1.24295388896E-13\" y=\"0.949848651757\" z=\"-0.312709991449\"/>\n <p x=\"0.671644422759\" y=\"0.671644422758\" z=\"-0.312709991449\"/>\n <p x=\"0.949848651759\" y=\"3.04120146337E-13\" z=\"-0.312709991449\"/>\n <p x=\"0.67164442276\" y=\"-0.671644422759\" z=\"-0.312709991449\"/>\n <p x=\"-0.363491342282\" y=\"-0.877545728343\" z=\"0.312709991449\"/>\n <p x=\"0.363491342282\" y=\"-0.877545728343\" z=\"0.312709991449\"/>\n <p x=\"0.877545728343\" y=\"-0.363491342282\" z=\"0.312709991449\"/>\n <p x=\"0.877545728343\" y=\"0.363491342282\" z=\"0.312709991449\"/>\n <p x=\"0.363491342282\" y=\"0.877545728343\" z=\"0.312709991449\"/>\n <p x=\"-0.363491342282\" y=\"0.877545728343\" z=\"0.312709991449\"/>\n <p x=\"-0.877545728343\" y=\"0.363491342282\" z=\"0.312709991449\"/>\n <p x=\"-0.877545728343\" y=\"-0.363491342282\" z=\"0.312709991449\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v></f>\n <f><v>8</v><v>9</v><v>10</v><v>11</v><v>12</v><v>13</v><v>14</v><v>15</v></f>\n <f><v>12</v><v>4</v><v>13</v></f>\n <f><v>13</v><v>4</v><v>3</v></f>\n <f><v>13</v><v>3</v><v>14</v></f>\n <f><v>14</v><v>3</v><v>2</v></f>\n <f><v>14</v><v>2</v><v>15</v></f>\n <f><v>15</v><v>2</v><v>1</v></f>\n <f><v>15</v><v>1</v><v>8</v></f>\n <f><v>8</v><v>1</v><v>0</v></f>\n <f><v>8</v><v>0</v><v>9</v></f>\n <f><v>9</v><v>0</v><v>7</v></f>\n <f><v>9</v><v>7</v><v>10</v></f>\n <f><v>10</v><v>7</v><v>6</v></f>\n <f><v>10</v><v>6</v><v>11</v></f>\n <f><v>11</v><v>6</v><v>5</v></f>\n <f><v>11</v><v>5</v><v>12</v></f>\n <f><v>12</v><v>5</v><v>4</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/octagonal_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.505449465124\" y=\"-0.86285620946\" z=\"3.17440957375E-16\"/>\n <p x=\"-3.17440957375E-16\" y=\"-0.86285620946\" z=\"-0.505449465124\"/>\n <p x=\"-0.357406744337\" y=\"-0.357406744336\" z=\"-0.862856209461\"/>\n <p x=\"-0.357406744337\" y=\"0.357406744337\" z=\"-0.862856209461\"/>\n <p x=\"-3.17440957375E-16\" y=\"0.862856209459\" z=\"-0.505449465124\"/>\n <p x=\"0.505449465124\" y=\"0.862856209459\" z=\"0\"/>\n <p x=\"0.862856209461\" y=\"0.357406744337\" z=\"0.357406744337\"/>\n <p x=\"0.862856209461\" y=\"-0.357406744336\" z=\"0.357406744337\"/>\n <p x=\"-0.505449465124\" y=\"-0.86285620946\" z=\"0\"/>\n <p x=\"-3.17440957375E-16\" y=\"-0.86285620946\" z=\"0.505449465124\"/>\n <p x=\"0.357406744337\" y=\"-0.357406744336\" z=\"0.862856209461\"/>\n <p x=\"0.357406744337\" y=\"0.357406744337\" z=\"0.862856209461\"/>\n <p x=\"-3.17440957375E-16\" y=\"0.862856209459\" z=\"0.505449465124\"/>\n <p x=\"-0.505449465124\" y=\"0.862856209459\" z=\"-3.17440957375E-16\"/>\n <p x=\"-0.862856209461\" y=\"0.357406744337\" z=\"-0.357406744337\"/>\n <p x=\"-0.862856209461\" y=\"-0.357406744336\" z=\"-0.357406744337\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v></f>\n <f><v>8</v><v>9</v><v>10</v><v>11</v><v>12</v><v>13</v><v>14</v><v>15</v></f>\n <f><v>13</v><v>4</v><v>3</v><v>14</v></f>\n <f><v>14</v><v>3</v><v>2</v><v>15</v></f>\n <f><v>15</v><v>2</v><v>1</v><v>8</v></f>\n <f><v>8</v><v>1</v><v>0</v><v>9</v></f>\n <f><v>9</v><v>0</v><v>7</v><v>10</v></f>\n <f><v>10</v><v>7</v><v>6</v><v>11</v></f>\n <f><v>11</v><v>6</v><v>5</v><v>12</v></f>\n <f><v>12</v><v>5</v><v>4</v><v>13</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/octahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.408248290464\" y=\"0.707106781187\" z=\"0.57735026919\"/>\n <p x=\"0.816496580928\" y=\"0\" z=\"0.57735026919\"/>\n <p x=\"0.408248290464\" y=\"0.707106781187\" z=\"-0.57735026919\"/>\n <p x=\"-0.816496580928\" y=\"0\" z=\"-0.57735026919\"/>\n <p x=\"0.408248290464\" y=\"-0.707106781187\" z=\"-0.57735026919\"/>\n <p x=\"-0.408248290464\" y=\"-0.707106781187\" z=\"0.57735026919\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>0</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>1</v><v>4</v></f>\n <f><v>0</v><v>3</v><v>5</v></f>\n <f><v>3</v><v>4</v><v>5</v></f>\n <f><v>5</v><v>4</v><v>1</v></f>\n <f><v>5</v><v>1</v><v>0</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/octahemioctahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.257150840827\" y=\"-0.650490689668\" z=\"0.714657475801\"/>\n <p x=\"-0.681603414116\" y=\"-0.706882291172\" z=\"-0.189034949923\"/>\n <p x=\"0.279301935677\" y=\"-0.95754259323\" z=\"-0.0714325617254\"/>\n <p x=\"-0.536452776504\" y=\"0.307051903563\" z=\"0.786090037524\"/>\n <p x=\"-1.31339383813E-13\" y=\"9.01501095995E-14\" z=\"2.68562949657E-13\"/>\n <p x=\"-0.960905349792\" y=\"0.250660302057\" z=\"-0.117602388197\"/>\n <p x=\"-0.424452573288\" y=\"-0.056391601506\" z=\"-0.903692425721\"/>\n <p x=\"0.960905349793\" y=\"-0.250660302057\" z=\"0.117602388197\"/>\n <p x=\"0.424452573288\" y=\"0.056391601506\" z=\"0.903692425721\"/>\n <p x=\"0.536452776505\" y=\"-0.307051903563\" z=\"-0.786090037526\"/>\n <p x=\"0.257150840827\" y=\"0.650490689667\" z=\"-0.714657475799\"/>\n <p x=\"-0.279301935679\" y=\"0.957542593231\" z=\"0.0714325617251\"/>\n <p x=\"0.681603414115\" y=\"0.706882291172\" z=\"0.189034949923\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>0</v><v>3</v><v>4</v></f>\n <f><v>3</v><v>5</v><v>4</v></f>\n <f><v>4</v><v>5</v><v>1</v></f>\n <f><v>5</v><v>6</v><v>1</v></f>\n <f><v>4</v><v>1</v><v>0</v></f>\n <f><v>2</v><v>7</v><v>4</v></f>\n <f><v>7</v><v>8</v><v>4</v></f>\n <f><v>4</v><v>8</v><v>0</v></f>\n <f><v>8</v><v>3</v><v>0</v></f>\n <f><v>4</v><v>0</v><v>2</v></f>\n <f><v>1</v><v>6</v><v>4</v></f>\n <f><v>6</v><v>9</v><v>4</v></f>\n <f><v>4</v><v>9</v><v>2</v></f>\n <f><v>9</v><v>7</v><v>2</v></f>\n <f><v>4</v><v>2</v><v>1</v></f>\n <f><v>10</v><v>11</v><v>12</v></f>\n <f><v>10</v><v>6</v><v>4</v></f>\n <f><v>6</v><v>5</v><v>4</v></f>\n <f><v>4</v><v>5</v><v>11</v></f>\n <f><v>5</v><v>3</v><v>11</v></f>\n <f><v>4</v><v>11</v><v>10</v></f>\n <f><v>12</v><v>7</v><v>4</v></f>\n <f><v>7</v><v>9</v><v>4</v></f>\n <f><v>4</v><v>9</v><v>10</v></f>\n <f><v>9</v><v>6</v><v>10</v></f>\n <f><v>4</v><v>10</v><v>12</v></f>\n <f><v>11</v><v>3</v><v>4</v></f>\n <f><v>3</v><v>8</v><v>4</v></f>\n <f><v>4</v><v>8</v><v>12</v></f>\n <f><v>8</v><v>7</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>11</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/parabiaugmented_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.427581845359\" y=\"0.709896506672\" z=\"0.20960636899\"/>\n <p x=\"-0.283969225416\" y=\"0.387390818448\" z=\"0.707109572404\"/>\n <p x=\"0.322595346255\" y=\"0.32417690737\" z=\"0.722188126384\"/>\n <p x=\"0.553860247977\" y=\"0.607614249985\" z=\"0.234003981831\"/>\n <p x=\"0.0902252459748\" y=\"0.846002072481\" z=\"-0.0827889662519\"/>\n <p x=\"0.529987992445\" y=\"0.167841210132\" z=\"-0.649350576062\"/>\n <p x=\"0.0754713806681\" y=\"0.574207386516\" z=\"-0.628732107147\"/>\n <p x=\"0.825648572281\" y=\"0.188487787214\" z=\"-0.116150349753\"/>\n <p x=\"-0.45145410089\" y=\"0.270123466819\" z=\"-0.673748188903\"/>\n <p x=\"-0.762358092725\" y=\"0.353983954979\" z=\"-0.155626516574\"/>\n <p x=\"-0.825648572281\" y=\"-0.188487787214\" z=\"0.116150349753\"/>\n <p x=\"-0.529987992445\" y=\"-0.167841210132\" z=\"0.649350576062\"/>\n <p x=\"-0.0754713806681\" y=\"-0.574207386516\" z=\"0.628732107147\"/>\n <p x=\"0.45145410089\" y=\"-0.270123466819\" z=\"0.673748188903\"/>\n <p x=\"-0.553860247977\" y=\"-0.607614249985\" z=\"-0.234003981831\"/>\n <p x=\"-0.0902252459748\" y=\"-0.846002072481\" z=\"0.0827889662519\"/>\n <p x=\"0.283969225416\" y=\"-0.387390818448\" z=\"-0.707109572404\"/>\n <p x=\"-0.322595346255\" y=\"-0.32417690737\" z=\"-0.722188126384\"/>\n <p x=\"0.762358092725\" y=\"-0.353983954979\" z=\"0.155626516574\"/>\n <p x=\"0.427581845359\" y=\"-0.709896506672\" z=\"-0.20960636899\"/>\n <p x=\"-0.858525063103\" y=\"-0.146086387704\" z=\"-0.491521600086\"/>\n <p x=\"0.858525063103\" y=\"0.146086387704\" z=\"0.491521600086\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>4</v><v>3</v><v>7</v></f>\n <f><v>8</v><v>9</v><v>0</v><v>4</v><v>6</v></f>\n <f><v>10</v><v>11</v><v>1</v><v>0</v><v>9</v></f>\n <f><v>12</v><v>13</v><v>2</v><v>1</v><v>11</v></f>\n <f><v>11</v><v>10</v><v>14</v><v>15</v><v>12</v></f>\n <f><v>6</v><v>5</v><v>16</v><v>17</v><v>8</v></f>\n <f><v>7</v><v>18</v><v>19</v><v>16</v><v>5</v></f>\n <f><v>13</v><v>12</v><v>15</v><v>19</v><v>18</v></f>\n <f><v>19</v><v>15</v><v>14</v><v>17</v><v>16</v></f>\n <f><v>20</v><v>17</v><v>14</v></f>\n <f><v>20</v><v>14</v><v>10</v></f>\n <f><v>20</v><v>8</v><v>17</v></f>\n <f><v>20</v><v>9</v><v>8</v></f>\n <f><v>9</v><v>20</v><v>10</v></f>\n <f><v>21</v><v>3</v><v>2</v></f>\n <f><v>21</v><v>2</v><v>13</v></f>\n <f><v>21</v><v>7</v><v>3</v></f>\n <f><v>21</v><v>18</v><v>7</v></f>\n <f><v>18</v><v>21</v><v>13</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/parabiaugmented_hexagonal_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.241726349966\" y=\"0.216051162828\" z=\"0.632449870694\"/>\n <p x=\"0.332473870509\" y=\"-0.0565824718302\" z=\"0.625589419251\"/>\n <p x=\"0.701988969395\" y=\"-0.00645497480375\" z=\"0.110780830092\"/>\n <p x=\"0.497303847806\" y=\"0.316306156881\" z=\"-0.397167307623\"/>\n <p x=\"-0.076896372669\" y=\"0.588939791539\" z=\"-0.39030685618\"/>\n <p x=\"-0.446411471555\" y=\"0.538812294512\" z=\"0.124501732979\"/>\n <p x=\"-0.332473870509\" y=\"0.0565824718302\" z=\"-0.625589419251\"/>\n <p x=\"0.241726349966\" y=\"-0.216051162828\" z=\"-0.632449870694\"/>\n <p x=\"0.446411471555\" y=\"-0.538812294512\" z=\"-0.124501732979\"/>\n <p x=\"0.076896372669\" y=\"-0.588939791539\" z=\"0.39030685618\"/>\n <p x=\"-0.497303847806\" y=\"-0.316306156881\" z=\"0.397167307623\"/>\n <p x=\"-0.701988969395\" y=\"0.00645497480375\" z=\"-0.110780830092\"/>\n <p x=\"0.857127825494\" y=\"-0.202090819122\" z=\"-0.473805014315\"/>\n <p x=\"-0.857127825494\" y=\"0.202090819122\" z=\"0.473805014315\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v></f>\n <f><v>6</v><v>7</v><v>8</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>1</v><v>0</v><v>10</v><v>9</v></f>\n <f><v>2</v><v>1</v><v>9</v><v>8</v></f>\n <f><v>4</v><v>3</v><v>7</v><v>6</v></f>\n <f><v>5</v><v>4</v><v>6</v><v>11</v></f>\n <f><v>2</v><v>12</v><v>3</v></f>\n <f><v>2</v><v>8</v><v>12</v></f>\n <f><v>3</v><v>12</v><v>7</v></f>\n <f><v>7</v><v>12</v><v>8</v></f>\n <f><v>5</v><v>13</v><v>0</v></f>\n <f><v>5</v><v>11</v><v>13</v></f>\n <f><v>0</v><v>13</v><v>10</v></f>\n <f><v>10</v><v>13</v><v>11</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/parabiaugmented_truncated_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.507465427588\" y=\"-0.592471338884\" z=\"0.538143985754\"/>\n <p x=\"-0.238174694683\" y=\"-0.761629939288\" z=\"0.511209396816\"/>\n <p x=\"0.0763101544143\" y=\"-0.75675526894\" z=\"0.565367685905\"/>\n <p x=\"0.315866596296\" y=\"-0.579709286229\" z=\"0.679932227361\"/>\n <p x=\"0.388992212388\" y=\"-0.298117538981\" z=\"0.811143260253\"/>\n <p x=\"0.26775550279\" y=\"-0.0195385036909\" z=\"0.908882629716\"/>\n <p x=\"-0.00153523011439\" y=\"0.149620096712\" z=\"0.935817218653\"/>\n <p x=\"-0.316020079212\" y=\"0.144745426364\" z=\"0.881658929565\"/>\n <p x=\"-0.555576521094\" y=\"-0.0323005563459\" z=\"0.767094388109\"/>\n <p x=\"-0.628702137186\" y=\"-0.313892303595\" z=\"0.635883355217\"/>\n <p x=\"-0.778044468783\" y=\"-0.0490463474794\" z=\"0.538872579925\"/>\n <p x=\"-0.775865084524\" y=\"-0.385799639693\" z=\"-0.383841641345\"/>\n <p x=\"-0.626522752927\" y=\"-0.650645595808\" z=\"-0.286830866053\"/>\n <p x=\"-0.506118494042\" y=\"-0.800596319296\" z=\"-0.032124764894\"/>\n <p x=\"-0.460642642372\" y=\"-0.778375730421\" z=\"0.282987588633\"/>\n <p x=\"-0.898448727668\" y=\"0.100904376008\" z=\"0.284166478766\"/>\n <p x=\"-0.943924579338\" y=\"0.0786837871338\" z=\"-0.0309458747606\"/>\n <p x=\"-0.897101794121\" y=\"-0.107220604403\" z=\"-0.286102271882\"/>\n <p x=\"-0.870798963246\" y=\"0.360275534383\" z=\"0.100265158132\"/>\n <p x=\"0.243632056174\" y=\"-0.82378793469\" z=\"-0.400199021568\"/>\n <p x=\"0.466100003863\" y=\"-0.807042143556\" z=\"-0.171977213385\"/>\n <p x=\"0.511575855532\" y=\"-0.784821554682\" z=\"0.143135140142\"/>\n <p x=\"0.362689381513\" y=\"-0.765613677766\" z=\"0.424775830239\"/>\n <p x=\"-0.357232020022\" y=\"-0.819804196211\" z=\"-0.313765454991\"/>\n <p x=\"-0.0708527929233\" y=\"-0.828662605038\" z=\"-0.454357310657\"/>\n <p x=\"0.943924579338\" y=\"-0.0786837871338\" z=\"0.0309458747605\"/>\n <p x=\"0.897101794121\" y=\"0.107220604403\" z=\"0.286102271882\"/>\n <p x=\"0.748215320102\" y=\"0.126428481318\" z=\"0.567742961979\"/>\n <p x=\"0.554134729889\" y=\"-0.0283969125174\" z=\"0.76829077405\"/>\n <p x=\"0.705656445745\" y=\"-0.629996160846\" z=\"-0.0574126719289\"/>\n <p x=\"0.870798963246\" y=\"-0.360275534383\" z=\"-0.100265158132\"/>\n <p x=\"0.898448727668\" y=\"-0.100904376008\" z=\"-0.284166478766\"/>\n <p x=\"0.778044468783\" y=\"0.0490463474794\" z=\"-0.538872579925\"/>\n <p x=\"0.628702137186\" y=\"0.313892303595\" z=\"-0.635883355217\"/>\n <p x=\"0.507465427588\" y=\"0.592471338884\" z=\"-0.538143985754\"/>\n <p x=\"0.460642642372\" y=\"0.778375730421\" z=\"-0.282987588633\"/>\n <p x=\"0.506118494042\" y=\"0.800596319296\" z=\"0.032124764894\"/>\n <p x=\"0.626522752927\" y=\"0.650645595808\" z=\"0.286830866053\"/>\n <p x=\"0.775865084524\" y=\"0.385799639693\" z=\"0.383841641345\"/>\n <p x=\"-0.150877561711\" y=\"0.414466052828\" z=\"0.838806443362\"/>\n <p x=\"-0.705656445745\" y=\"0.629996160846\" z=\"0.0574126719289\"/>\n <p x=\"-0.123227797289\" y=\"0.673837211202\" z=\"0.654905122728\"/>\n <p x=\"-0.243632056174\" y=\"0.82378793469\" z=\"0.400199021568\"/>\n <p x=\"-0.466100003863\" y=\"0.807042143556\" z=\"0.171977213385\"/>\n <p x=\"0.0708527929233\" y=\"0.828662605038\" z=\"0.454357310657\"/>\n <p x=\"-0.315866596296\" y=\"0.579709286229\" z=\"-0.679932227361\"/>\n <p x=\"-0.0763101544143\" y=\"0.75675526894\" z=\"-0.565367685905\"/>\n <p x=\"0.238174694683\" y=\"0.761629939288\" z=\"-0.511209396816\"/>\n <p x=\"0.555576521094\" y=\"0.0323005563459\" z=\"-0.767094388109\"/>\n <p x=\"0.316020079212\" y=\"-0.144745426364\" z=\"-0.881658929565\"/>\n <p x=\"0.00153523011439\" y=\"-0.149620096712\" z=\"-0.935817218653\"/>\n <p x=\"-0.26775550279\" y=\"0.0195385036909\" z=\"-0.908882629716\"/>\n <p x=\"-0.388992212388\" y=\"0.298117538981\" z=\"-0.811143260253\"/>\n <p x=\"-0.554134729889\" y=\"0.0283969125174\" z=\"-0.76829077405\"/>\n <p x=\"-0.511575855532\" y=\"0.784821554682\" z=\"-0.143135140142\"/>\n <p x=\"-0.362689381513\" y=\"0.765613677766\" z=\"-0.424775830239\"/>\n <p x=\"-0.748215320102\" y=\"-0.126428481318\" z=\"-0.567742961979\"/>\n <p x=\"0.357232020022\" y=\"0.819804196211\" z=\"0.313765454991\"/>\n <p x=\"0.123227797289\" y=\"-0.673837211202\" z=\"-0.654905122728\"/>\n <p x=\"0.150877561711\" y=\"-0.414466052828\" z=\"-0.838806443362\"/>\n <p x=\"-0.279314620652\" y=\"-0.299384814008\" z=\"-0.912333313998\"/>\n <p x=\"-0.129972289055\" y=\"-0.564230770124\" z=\"-0.815322538707\"/>\n <p x=\"-0.324052879268\" y=\"-0.719056163959\" z=\"-0.614774726636\"/>\n <p x=\"-0.593343612172\" y=\"-0.549897563556\" z=\"-0.587840137698\"/>\n <p x=\"-0.56569384775\" y=\"-0.290526405182\" z=\"-0.771741458333\"/>\n <p x=\"0.279314620652\" y=\"0.299384814008\" z=\"0.912333313998\"/>\n <p x=\"0.56569384775\" y=\"0.290526405182\" z=\"0.771741458333\"/>\n <p x=\"0.593343612172\" y=\"0.549897563556\" z=\"0.587840137698\"/>\n <p x=\"0.324052879268\" y=\"0.719056163959\" z=\"0.614774726636\"/>\n <p x=\"0.129972289055\" y=\"0.564230770124\" z=\"0.815322538707\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>9</v><v>8</v></f>\n <f><v>11</v><v>12</v><v>13</v><v>14</v><v>0</v><v>9</v><v>10</v><v>15</v><v>16</v><v>17</v></f>\n <f><v>18</v><v>16</v><v>15</v></f>\n <f><v>14</v><v>1</v><v>0</v></f>\n <f><v>19</v><v>20</v><v>21</v><v>22</v><v>2</v><v>1</v><v>14</v><v>13</v><v>23</v><v>24</v></f>\n <f><v>12</v><v>23</v><v>13</v></f>\n <f><v>22</v><v>3</v><v>2</v></f>\n <f><v>25</v><v>26</v><v>27</v><v>28</v><v>4</v><v>3</v><v>22</v><v>21</v><v>29</v><v>30</v></f>\n <f><v>20</v><v>29</v><v>21</v></f>\n <f><v>28</v><v>5</v><v>4</v></f>\n <f><v>26</v><v>25</v><v>31</v><v>32</v><v>33</v><v>34</v><v>35</v><v>36</v><v>37</v><v>38</v></f>\n <f><v>38</v><v>27</v><v>26</v></f>\n <f><v>39</v><v>7</v><v>6</v></f>\n <f><v>40</v><v>18</v><v>15</v><v>10</v><v>8</v><v>7</v><v>39</v><v>41</v><v>42</v><v>43</v></f>\n <f><v>44</v><v>42</v><v>41</v></f>\n <f><v>45</v><v>46</v><v>47</v><v>34</v><v>33</v><v>48</v><v>49</v><v>50</v><v>51</v><v>52</v></f>\n <f><v>53</v><v>52</v><v>51</v></f>\n <f><v>18</v><v>40</v><v>54</v><v>55</v><v>45</v><v>52</v><v>53</v><v>56</v><v>17</v><v>16</v></f>\n <f><v>11</v><v>17</v><v>56</v></f>\n <f><v>55</v><v>46</v><v>45</v></f>\n <f><v>44</v><v>57</v><v>36</v><v>35</v><v>47</v><v>46</v><v>55</v><v>54</v><v>43</v><v>42</v></f>\n <f><v>40</v><v>43</v><v>54</v></f>\n <f><v>35</v><v>34</v><v>47</v></f>\n <f><v>37</v><v>36</v><v>57</v></f>\n <f><v>32</v><v>48</v><v>33</v></f>\n <f><v>20</v><v>19</v><v>58</v><v>59</v><v>49</v><v>48</v><v>32</v><v>31</v><v>30</v><v>29</v></f>\n <f><v>25</v><v>30</v><v>31</v></f>\n <f><v>59</v><v>50</v><v>49</v></f>\n <f><v>24</v><v>58</v><v>19</v></f>\n <f><v>60</v><v>61</v><v>62</v><v>63</v><v>64</v></f>\n <f><v>61</v><v>60</v><v>50</v><v>59</v></f>\n <f><v>61</v><v>59</v><v>58</v></f>\n <f><v>62</v><v>61</v><v>58</v><v>24</v></f>\n <f><v>62</v><v>24</v><v>23</v></f>\n <f><v>63</v><v>62</v><v>23</v><v>12</v></f>\n <f><v>63</v><v>12</v><v>11</v></f>\n <f><v>64</v><v>63</v><v>11</v><v>56</v></f>\n <f><v>53</v><v>64</v><v>56</v></f>\n <f><v>60</v><v>64</v><v>53</v><v>51</v></f>\n <f><v>60</v><v>51</v><v>50</v></f>\n <f><v>65</v><v>66</v><v>67</v><v>68</v><v>69</v></f>\n <f><v>66</v><v>65</v><v>5</v><v>28</v></f>\n <f><v>66</v><v>28</v><v>27</v></f>\n <f><v>67</v><v>66</v><v>27</v><v>38</v></f>\n <f><v>67</v><v>38</v><v>37</v></f>\n <f><v>68</v><v>67</v><v>37</v><v>57</v></f>\n <f><v>68</v><v>57</v><v>44</v></f>\n <f><v>69</v><v>68</v><v>44</v><v>41</v></f>\n <f><v>39</v><v>69</v><v>41</v></f>\n <f><v>65</v><v>69</v><v>39</v><v>6</v></f>\n <f><v>65</v><v>6</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/parabidiminished_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.112665836784\" y=\"0.992807169933\" z=\"0.0405010191525\"/>\n <p x=\"-0.151947680807\" y=\"0.905187864081\" z=\"-0.396921696331\"/>\n <p x=\"-0.56810691221\" y=\"0.754196906079\" z=\"-0.329304666169\"/>\n <p x=\"-0.528825068187\" y=\"0.84181621193\" z=\"0.108118049315\"/>\n <p x=\"-0.835484178016\" y=\"0.548410078162\" z=\"-0.0348220397963\"/>\n <p x=\"-0.648132543469\" y=\"0.430446767136\" z=\"-0.628203618868\"/>\n <p x=\"-0.915509809274\" y=\"0.224659939219\" z=\"-0.333720992496\"/>\n <p x=\"0.0252272376745\" y=\"0.674755269177\" z=\"-0.73761027189\"/>\n <p x=\"-0.281431872154\" y=\"0.381349135409\" z=\"-0.880550361001\"/>\n <p x=\"-0.738334890793\" y=\"-0.00577265568465\" z=\"-0.674409568055\"/>\n <p x=\"-0.804259723371\" y=\"-0.387840369418\" z=\"-0.450273411621\"/>\n <p x=\"-0.981434641852\" y=\"-0.157407774514\" z=\"-0.109584836062\"/>\n <p x=\"-0.371634219479\" y=\"-0.0548702874118\" z=\"-0.926756310187\"/>\n <p x=\"0.044525011925\" y=\"0.0961206705903\" z=\"-0.99437334035\"/>\n <p x=\"0.205233657917\" y=\"-0.316291048318\" z=\"-0.926196047504\"/>\n <p x=\"-0.210925573487\" y=\"-0.46728200632\" z=\"-0.858579017342\"/>\n <p x=\"-0.478302839292\" y=\"-0.673068834236\" z=\"-0.564096390969\"/>\n <p x=\"0.139308825339\" y=\"-0.698358762051\" z=\"-0.70205989107\"/>\n <p x=\"-0.128068440467\" y=\"-0.904145589968\" z=\"-0.407577264698\"/>\n <p x=\"-0.851950450505\" y=\"0.366430954158\" z=\"0.374043828608\"/>\n <p x=\"-0.545291340676\" y=\"0.659837087926\" z=\"0.516983917719\"/>\n <p x=\"-0.611216173254\" y=\"0.277769374193\" z=\"0.741120074153\"/>\n <p x=\"-0.94215279783\" y=\"-0.0697884686626\" z=\"0.327837879422\"/>\n <p x=\"-0.701418520579\" y=\"-0.158450048628\" z=\"0.694914124967\"/>\n <p x=\"-0.0252272376745\" y=\"-0.674755269177\" z=\"0.73761027189\"/>\n <p x=\"-0.351184121753\" y=\"-0.389526804359\" z=\"0.851433251238\"/>\n <p x=\"0.112665836784\" y=\"-0.992807169933\" z=\"-0.0405010191525\"/>\n <p x=\"0.151947680807\" y=\"-0.905187864081\" z=\"0.396921696331\"/>\n <p x=\"-0.205233657917\" y=\"0.316291048318\" z=\"0.926196047504\"/>\n <p x=\"-0.139308825339\" y=\"0.698358762051\" z=\"0.70205989107\"/>\n <p x=\"0.210925573487\" y=\"0.46728200632\" z=\"0.858579017342\"/>\n <p x=\"-0.044525011925\" y=\"-0.0961206705903\" z=\"0.99437334035\"/>\n <p x=\"0.371634219479\" y=\"0.0548702874118\" z=\"0.926756310187\"/>\n <p x=\"0.281431872154\" y=\"-0.381349135409\" z=\"0.880550361001\"/>\n <p x=\"0.648132543469\" y=\"-0.430446767136\" z=\"0.628203618868\"/>\n <p x=\"0.738334890793\" y=\"0.00577265568465\" z=\"0.674409568055\"/>\n <p x=\"0.56810691221\" y=\"-0.754196906079\" z=\"0.329304666169\"/>\n <p x=\"0.528825068187\" y=\"-0.84181621193\" z=\"-0.108118049315\"/>\n <p x=\"0.478302839292\" y=\"0.673068834236\" z=\"0.564096390969\"/>\n <p x=\"0.128068440467\" y=\"0.904145589968\" z=\"0.407577264698\"/>\n <p x=\"0.804259723371\" y=\"0.387840369418\" z=\"0.450273411621\"/>\n <p x=\"0.981434641852\" y=\"0.157407774514\" z=\"0.109584836062\"/>\n <p x=\"0.94215279783\" y=\"0.0697884686626\" z=\"-0.327837879422\"/>\n <p x=\"0.701418520579\" y=\"0.158450048628\" z=\"-0.694914124967\"/>\n <p x=\"0.351184121753\" y=\"0.389526804359\" z=\"-0.851433251238\"/>\n <p x=\"0.915509809274\" y=\"-0.224659939219\" z=\"0.333720992496\"/>\n <p x=\"0.835484178016\" y=\"-0.548410078162\" z=\"0.0348220397963\"/>\n <p x=\"0.851950450505\" y=\"-0.366430954158\" z=\"-0.374043828608\"/>\n <p x=\"0.545291340676\" y=\"-0.659837087926\" z=\"-0.516983917719\"/>\n <p x=\"0.611216173254\" y=\"-0.277769374193\" z=\"-0.741120074153\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>5</v><v>6</v><v>4</v></f>\n <f><v>1</v><v>7</v><v>8</v><v>5</v><v>2</v></f>\n <f><v>5</v><v>9</v><v>6</v></f>\n <f><v>6</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>8</v><v>12</v><v>9</v><v>5</v></f>\n <f><v>8</v><v>13</v><v>12</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>12</v></f>\n <f><v>12</v><v>15</v><v>16</v><v>10</v><v>9</v></f>\n <f><v>14</v><v>17</v><v>15</v></f>\n <f><v>15</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>3</v><v>4</v><v>19</v><v>20</v></f>\n <f><v>20</v><v>19</v><v>21</v></f>\n <f><v>19</v><v>22</v><v>23</v><v>21</v></f>\n <f><v>4</v><v>6</v><v>11</v><v>22</v><v>19</v></f>\n <f><v>24</v><v>25</v><v>23</v><v>22</v><v>11</v><v>10</v><v>16</v><v>18</v><v>26</v><v>27</v></f>\n <f><v>20</v><v>21</v><v>28</v><v>29</v></f>\n <f><v>29</v><v>28</v><v>30</v></f>\n <f><v>28</v><v>31</v><v>32</v><v>30</v></f>\n <f><v>21</v><v>23</v><v>25</v><v>31</v><v>28</v></f>\n <f><v>31</v><v>33</v><v>32</v></f>\n <f><v>32</v><v>33</v><v>34</v><v>35</v></f>\n <f><v>25</v><v>24</v><v>33</v><v>31</v></f>\n <f><v>24</v><v>27</v><v>36</v><v>34</v><v>33</v></f>\n <f><v>27</v><v>26</v><v>37</v><v>36</v></f>\n <f><v>29</v><v>30</v><v>38</v><v>39</v></f>\n <f><v>39</v><v>38</v><v>40</v><v>41</v><v>42</v><v>43</v><v>44</v><v>7</v><v>1</v><v>0</v></f>\n <f><v>30</v><v>32</v><v>35</v><v>40</v><v>38</v></f>\n <f><v>35</v><v>45</v><v>41</v><v>40</v></f>\n <f><v>35</v><v>34</v><v>45</v></f>\n <f><v>34</v><v>36</v><v>46</v><v>45</v></f>\n <f><v>45</v><v>46</v><v>47</v><v>42</v><v>41</v></f>\n <f><v>36</v><v>37</v><v>46</v></f>\n <f><v>46</v><v>37</v><v>48</v><v>47</v></f>\n <f><v>7</v><v>44</v><v>13</v><v>8</v></f>\n <f><v>42</v><v>47</v><v>49</v><v>43</v></f>\n <f><v>43</v><v>49</v><v>14</v><v>13</v><v>44</v></f>\n <f><v>47</v><v>48</v><v>49</v></f>\n <f><v>49</v><v>48</v><v>17</v><v>14</v></f>\n <f><v>0</v><v>3</v><v>20</v><v>29</v><v>39</v></f>\n <f><v>48</v><v>37</v><v>26</v><v>18</v><v>17</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/parabigyrate_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.134859216644\" y=\"0.264777744489\" z=\"-0.95483276283\"/>\n <p x=\"-0.331332123215\" y=\"0.598272736738\" z=\"-0.729581130585\"/>\n <p x=\"0.0708229296939\" y=\"0.770387548983\" z=\"-0.633630020502\"/>\n <p x=\"0.267295836265\" y=\"0.436892556734\" z=\"-0.858881652747\"/>\n <p x=\"0.499081038637\" y=\"0.667369570654\" z=\"-0.552752959684\"/>\n <p x=\"0.0437042123108\" y=\"0.971192378886\" z=\"-0.234254500276\"/>\n <p x=\"0.471962321253\" y=\"0.868174400557\" z=\"-0.153377439458\"/>\n <p x=\"-0.606996332044\" y=\"0.692704762706\" z=\"-0.389506657648\"/>\n <p x=\"-0.375211129673\" y=\"0.923181776626\" z=\"-0.0833779645844\"/>\n <p x=\"-0.0378548705378\" y=\"0.977810091345\" z=\"0.206044412495\"/>\n <p x=\"0.390403238405\" y=\"0.874792113016\" z=\"0.286921473313\"/>\n <p x=\"-0.624772282468\" y=\"0.742481012021\" z=\"0.241622459088\"/>\n <p x=\"-0.287416023333\" y=\"0.797109326739\" z=\"0.531044836167\"/>\n <p x=\"-0.609655367979\" y=\"0.498111635356\" z=\"0.616607655256\"/>\n <p x=\"-0.335634533735\" y=\"0.283414442708\" z=\"0.898346024263\"/>\n <p x=\"-0.0133951890894\" y=\"0.582412134092\" z=\"0.812783205174\"/>\n <p x=\"0.405520152894\" y=\"0.630422736351\" z=\"0.661906669482\"/>\n <p x=\"0.0926235752076\" y=\"0.18039646438\" z=\"0.979223085081\"/>\n <p x=\"0.511538917191\" y=\"0.228407066639\" z=\"0.828346549389\"/>\n <p x=\"0.789862161954\" y=\"0.328568168021\" z=\"-0.517842236452\"/>\n <p x=\"0.558076959583\" y=\"0.0980911541009\" z=\"-0.823970929515\"/>\n <p x=\"0.83209783503\" y=\"-0.116606059576\" z=\"-0.542232575874\"/>\n <p x=\"0.942456062068\" y=\"0.319982215661\" z=\"-0.0968907026966\"/>\n <p x=\"0.98469176061\" y=\"-0.125192024933\" z=\"-0.121281051615\"/>\n <p x=\"0.745983155497\" y=\"0.653477207909\" z=\"0.128360929549\"/>\n <p x=\"0.957573014657\" y=\"0.0756128409484\" z=\"0.278094523814\"/>\n <p x=\"0.829438819539\" y=\"-0.311199162738\" z=\"0.463881801489\"/>\n <p x=\"0.856557516479\" y=\"-0.512004016829\" z=\"0.0645062168043\"/>\n <p x=\"0.761100069986\" y=\"0.409107831245\" z=\"0.503346125717\"/>\n <p x=\"0.553774587163\" y=\"-0.216767137976\" z=\"0.803956255674\"/>\n <p x=\"0.13485920708\" y=\"-0.264777742188\" z=\"0.954832761024\"/>\n <p x=\"0.609655358415\" y=\"-0.498111633055\" z=\"-0.616607657063\"/>\n <p x=\"0.335634524171\" y=\"-0.283414440408\" z=\"-0.898346026069\"/>\n <p x=\"0.624772272904\" y=\"-0.74248100972\" z=\"-0.241622460894\"/>\n <p x=\"0.287416013769\" y=\"-0.797109324439\" z=\"-0.531044837974\"/>\n <p x=\"0.375211120108\" y=\"-0.923181774326\" z=\"0.0833779627782\"/>\n <p x=\"0.0378548609737\" y=\"-0.977810089044\" z=\"-0.206044414301\"/>\n <p x=\"-0.0437042218749\" y=\"-0.971192376585\" z=\"0.23425449847\"/>\n <p x=\"-0.471962330817\" y=\"-0.868174398257\" z=\"0.153377437651\"/>\n <p x=\"-0.390403247969\" y=\"-0.874792110715\" z=\"-0.28692147512\"/>\n <p x=\"0.60699632248\" y=\"-0.692704760405\" z=\"0.389506655842\"/>\n <p x=\"0.331332113651\" y=\"-0.598272734437\" z=\"0.729581128778\"/>\n <p x=\"-0.070822939258\" y=\"-0.770387546682\" z=\"0.633630018696\"/>\n <p x=\"-0.267295845829\" y=\"-0.436892554433\" z=\"0.858881650941\"/>\n <p x=\"0.0133951795253\" y=\"-0.582412131791\" z=\"-0.81278320698\"/>\n <p x=\"-0.0926235847717\" y=\"-0.180396462079\" z=\"-0.979223086887\"/>\n <p x=\"-0.405520162458\" y=\"-0.630422734051\" z=\"-0.661906671288\"/>\n <p x=\"-0.511538926755\" y=\"-0.228407064339\" z=\"-0.828346551196\"/>\n <p x=\"-0.76110007955\" y=\"-0.409107828944\" z=\"-0.503346127523\"/>\n <p x=\"-0.745983165061\" y=\"-0.653477205609\" z=\"-0.128360931355\"/>\n <p x=\"-0.942456071632\" y=\"-0.31998221336\" z=\"0.0968907008904\"/>\n <p x=\"-0.957572986122\" y=\"-0.0756128366953\" z=\"-0.278094495278\"/>\n <p x=\"-0.499081048201\" y=\"-0.667369568353\" z=\"0.552752957877\"/>\n <p x=\"-0.789862171518\" y=\"-0.32856816572\" z=\"0.517842234645\"/>\n <p x=\"-0.558076969147\" y=\"-0.0980911518003\" z=\"0.823970927709\"/>\n <p x=\"-0.553774558627\" y=\"0.216767142229\" z=\"-0.803956227138\"/>\n <p x=\"-0.829438767456\" y=\"0.311199168198\" z=\"-0.463881754202\"/>\n <p x=\"-0.856557484839\" y=\"0.512003998101\" z=\"-0.0645062339756\"/>\n <p x=\"-0.984691703505\" y=\"0.125191993208\" z=\"0.121281024948\"/>\n <p x=\"-0.832097803391\" y=\"0.116606040848\" z=\"0.542232558703\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>5</v><v>6</v><v>4</v></f>\n <f><v>1</v><v>7</v><v>8</v><v>5</v><v>2</v></f>\n <f><v>8</v><v>9</v><v>5</v></f>\n <f><v>5</v><v>9</v><v>10</v><v>6</v></f>\n <f><v>11</v><v>12</v><v>9</v><v>8</v></f>\n <f><v>11</v><v>13</v><v>12</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>12</v></f>\n <f><v>12</v><v>15</v><v>16</v><v>10</v><v>9</v></f>\n <f><v>14</v><v>17</v><v>15</v></f>\n <f><v>15</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>3</v><v>4</v><v>19</v><v>20</v></f>\n <f><v>20</v><v>19</v><v>21</v></f>\n <f><v>19</v><v>22</v><v>23</v><v>21</v></f>\n <f><v>4</v><v>6</v><v>24</v><v>22</v><v>19</v></f>\n <f><v>22</v><v>25</v><v>23</v></f>\n <f><v>23</v><v>25</v><v>26</v><v>27</v></f>\n <f><v>24</v><v>28</v><v>25</v><v>22</v></f>\n <f><v>6</v><v>10</v><v>24</v></f>\n <f><v>10</v><v>16</v><v>28</v><v>24</v></f>\n <f><v>28</v><v>18</v><v>29</v><v>26</v><v>25</v></f>\n <f><v>16</v><v>18</v><v>28</v></f>\n <f><v>18</v><v>17</v><v>30</v><v>29</v></f>\n <f><v>20</v><v>21</v><v>31</v><v>32</v></f>\n <f><v>31</v><v>33</v><v>34</v></f>\n <f><v>33</v><v>35</v><v>36</v><v>34</v></f>\n <f><v>21</v><v>23</v><v>27</v><v>33</v><v>31</v></f>\n <f><v>35</v><v>37</v><v>36</v></f>\n <f><v>36</v><v>37</v><v>38</v><v>39</v></f>\n <f><v>27</v><v>40</v><v>35</v><v>33</v></f>\n <f><v>27</v><v>26</v><v>40</v></f>\n <f><v>26</v><v>29</v><v>41</v><v>40</v></f>\n <f><v>40</v><v>41</v><v>42</v><v>37</v><v>35</v></f>\n <f><v>29</v><v>30</v><v>41</v></f>\n <f><v>41</v><v>30</v><v>43</v><v>42</v></f>\n <f><v>31</v><v>34</v><v>44</v><v>32</v></f>\n <f><v>32</v><v>44</v><v>45</v></f>\n <f><v>44</v><v>46</v><v>47</v><v>45</v></f>\n <f><v>34</v><v>36</v><v>39</v><v>46</v><v>44</v></f>\n <f><v>46</v><v>48</v><v>47</v></f>\n <f><v>48</v><v>49</v><v>50</v><v>51</v></f>\n <f><v>39</v><v>49</v><v>48</v><v>46</v></f>\n <f><v>39</v><v>38</v><v>49</v></f>\n <f><v>37</v><v>42</v><v>52</v><v>38</v></f>\n <f><v>38</v><v>52</v><v>53</v><v>50</v><v>49</v></f>\n <f><v>42</v><v>43</v><v>52</v></f>\n <f><v>52</v><v>43</v><v>54</v><v>53</v></f>\n <f><v>45</v><v>47</v><v>55</v><v>0</v></f>\n <f><v>0</v><v>55</v><v>1</v></f>\n <f><v>55</v><v>56</v><v>7</v><v>1</v></f>\n <f><v>47</v><v>48</v><v>51</v><v>56</v><v>55</v></f>\n <f><v>56</v><v>57</v><v>7</v></f>\n <f><v>7</v><v>57</v><v>11</v><v>8</v></f>\n <f><v>51</v><v>58</v><v>57</v><v>56</v></f>\n <f><v>51</v><v>50</v><v>58</v></f>\n <f><v>50</v><v>53</v><v>59</v><v>58</v></f>\n <f><v>58</v><v>59</v><v>13</v><v>11</v><v>57</v></f>\n <f><v>53</v><v>54</v><v>59</v></f>\n <f><v>59</v><v>54</v><v>14</v><v>13</v></f>\n <f><v>0</v><v>3</v><v>20</v><v>32</v><v>45</v></f>\n <f><v>54</v><v>43</v><v>30</v><v>17</v><v>14</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/paragyrate_diminished_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.163919272979\" y=\"0.138754373049\" z=\"-0.976666624753\"/>\n <p x=\"-0.221037905262\" y=\"-0.0356273253146\" z=\"-0.974614250937\"/>\n <p x=\"-0.384245944628\" y=\"0.326366060037\" z=\"-0.829945170311\"/>\n <p x=\"0.000711233612048\" y=\"0.5007477584\" z=\"-0.831997544127\"/>\n <p x=\"-0.304815779611\" y=\"0.665939165931\" z=\"-0.591227402477\"/>\n <p x=\"-0.715390997137\" y=\"0.23165798672\" z=\"-0.58503997827\"/>\n <p x=\"-0.635960832119\" y=\"0.571231092614\" z=\"-0.346322210435\"/>\n <p x=\"-0.451314842204\" y=\"-0.354059614482\" z=\"-0.819119467843\"/>\n <p x=\"-0.756841855427\" y=\"-0.188868206951\" z=\"-0.578349326192\"/>\n <p x=\"-0.866237769062\" y=\"0.252798803447\" z=\"-0.190827427342\"/>\n <p x=\"-0.779167920621\" y=\"0.381713436778\" z=\"0.20211668681\"/>\n <p x=\"-0.548890983678\" y=\"0.700145725946\" z=\"0.0466219037168\"/>\n <p x=\"-0.907688627352\" y=\"-0.167727390224\" z=\"-0.184136775264\"/>\n <p x=\"-0.744480587985\" y=\"-0.529720775575\" z=\"-0.32880585589\"/>\n <p x=\"-0.68302877883\" y=\"-0.660705623092\" z=\"0.068273308653\"/>\n <p x=\"-0.846236818197\" y=\"-0.29871223774\" z=\"0.212942389279\"/>\n <p x=\"-0.766806653179\" y=\"0.040860868154\" z=\"0.451660157113\"/>\n <p x=\"-0.595958930389\" y=\"-0.53179098976\" z=\"0.461217422805\"/>\n <p x=\"-0.516528765371\" y=\"-0.192217883866\" z=\"0.699935190639\"/>\n <p x=\"-0.013087033513\" y=\"0.853386607582\" z=\"-0.349643021027\"/>\n <p x=\"0.29243997971\" y=\"0.688195200051\" z=\"-0.590413162678\"/>\n <p x=\"0.379509828151\" y=\"0.817109833383\" z=\"-0.197469048526\"/>\n <p x=\"-0.163933805438\" y=\"0.874527424309\" z=\"0.0445695299006\"/>\n <p x=\"0.228663056226\" y=\"0.83825065011\" z=\"0.196743502402\"/>\n <p x=\"-0.317392647295\" y=\"0.705371314556\" z=\"0.400156105056\"/>\n <p x=\"0.0752042143691\" y=\"0.669094540357\" z=\"0.552330077557\"/>\n <p x=\"-0.547669584237\" y=\"0.386939025389\" z=\"0.555650888149\"/>\n <p x=\"-0.297391696429\" y=\"0.153860273369\" z=\"0.803925921676\"/>\n <p x=\"0.0875654818111\" y=\"0.328241971733\" z=\"0.80187354786\"/>\n <p x=\"-0.123931903708\" y=\"-0.228494658065\" z=\"0.852109163141\"/>\n <p x=\"0.261025274533\" y=\"-0.0541129597016\" z=\"0.850056789325\"/>\n <p x=\"0.723016148101\" y=\"0.570965338076\" z=\"-0.192830770265\"/>\n <p x=\"0.63594629966\" y=\"0.442050704744\" z=\"-0.585774884417\"/>\n <p x=\"0.886224187468\" y=\"0.208971952724\" z=\"-0.33749985089\"/>\n <p x=\"0.784467957256\" y=\"0.439980490559\" z=\"0.204248394278\"/>\n <p x=\"0.947675996623\" y=\"0.0779871052077\" z=\"0.0595793136523\"/>\n <p x=\"0.478940944033\" y=\"0.60517189809\" z=\"0.445018535928\"/>\n <p x=\"0.796829224698\" y=\"0.0991279219348\" z=\"0.45379186458\"/>\n <p x=\"0.755378366408\" y=\"-0.321398271736\" z=\"0.460482516658\"/>\n <p x=\"0.906225138333\" y=\"-0.342539088463\" z=\"0.0662699657297\"/>\n <p x=\"0.491302211475\" y=\"0.264319329466\" z=\"0.694562006231\"/>\n <p x=\"0.4242333139\" y=\"-0.416106345053\" z=\"0.705387708699\"/>\n <p x=\"0.0392761356592\" y=\"-0.590488043417\" z=\"0.707440082515\"/>\n <p x=\"0.80679402245\" y=\"-0.13060115317\" z=\"-0.576217618725\"/>\n <p x=\"0.556516134643\" y=\"0.10247759885\" z=\"-0.824492652251\"/>\n <p x=\"0.819155289892\" y=\"-0.471453721795\" z=\"-0.326674148422\"/>\n <p x=\"0.58887835295\" y=\"-0.789886010962\" z=\"-0.171179365329\"/>\n <p x=\"0.203921174709\" y=\"-0.964267709325\" z=\"-0.169126991513\"/>\n <p x=\"-0.188675686954\" y=\"-0.927990935126\" z=\"-0.321300964014\"/>\n <p x=\"-0.438953574762\" y=\"-0.694912183106\" z=\"-0.56957599754\"/>\n <p x=\"0.675948201391\" y=\"-0.66097137763\" z=\"0.221764748823\"/>\n <p x=\"0.344803148882\" y=\"-0.755679450947\" z=\"0.466669940865\"/>\n <p x=\"0.0530744027842\" y=\"-0.943126892598\" z=\"0.225085559416\"/>\n <p x=\"-0.252452610438\" y=\"-0.777935485067\" z=\"0.465855701066\"/>\n <p x=\"-0.339522458879\" y=\"-0.906850118399\" z=\"0.0729115869142\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>5</v><v>6</v><v>4</v></f>\n <f><v>1</v><v>7</v><v>8</v><v>5</v><v>2</v></f>\n <f><v>5</v><v>9</v><v>6</v></f>\n <f><v>6</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>8</v><v>12</v><v>9</v><v>5</v></f>\n <f><v>8</v><v>13</v><v>12</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>12</v></f>\n <f><v>12</v><v>15</v><v>16</v><v>10</v><v>9</v></f>\n <f><v>14</v><v>17</v><v>15</v></f>\n <f><v>15</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>3</v><v>4</v><v>19</v><v>20</v></f>\n <f><v>20</v><v>19</v><v>21</v></f>\n <f><v>19</v><v>22</v><v>23</v><v>21</v></f>\n <f><v>4</v><v>6</v><v>11</v><v>22</v><v>19</v></f>\n <f><v>11</v><v>24</v><v>22</v></f>\n <f><v>22</v><v>24</v><v>25</v><v>23</v></f>\n <f><v>10</v><v>26</v><v>24</v><v>11</v></f>\n <f><v>10</v><v>16</v><v>26</v></f>\n <f><v>16</v><v>18</v><v>27</v><v>26</v></f>\n <f><v>26</v><v>27</v><v>28</v><v>25</v><v>24</v></f>\n <f><v>18</v><v>29</v><v>27</v></f>\n <f><v>27</v><v>29</v><v>30</v><v>28</v></f>\n <f><v>20</v><v>21</v><v>31</v><v>32</v></f>\n <f><v>32</v><v>31</v><v>33</v></f>\n <f><v>31</v><v>34</v><v>35</v><v>33</v></f>\n <f><v>21</v><v>23</v><v>36</v><v>34</v><v>31</v></f>\n <f><v>34</v><v>37</v><v>35</v></f>\n <f><v>35</v><v>37</v><v>38</v><v>39</v></f>\n <f><v>36</v><v>40</v><v>37</v><v>34</v></f>\n <f><v>23</v><v>25</v><v>36</v></f>\n <f><v>25</v><v>28</v><v>40</v><v>36</v></f>\n <f><v>40</v><v>30</v><v>41</v><v>38</v><v>37</v></f>\n <f><v>28</v><v>30</v><v>40</v></f>\n <f><v>30</v><v>29</v><v>42</v><v>41</v></f>\n <f><v>32</v><v>33</v><v>43</v><v>44</v></f>\n <f><v>44</v><v>43</v><v>45</v><v>46</v><v>47</v><v>48</v><v>49</v><v>7</v><v>1</v><v>0</v></f>\n <f><v>33</v><v>35</v><v>39</v><v>45</v><v>43</v></f>\n <f><v>39</v><v>50</v><v>46</v><v>45</v></f>\n <f><v>39</v><v>38</v><v>50</v></f>\n <f><v>38</v><v>41</v><v>51</v><v>50</v></f>\n <f><v>50</v><v>51</v><v>52</v><v>47</v><v>46</v></f>\n <f><v>41</v><v>42</v><v>51</v></f>\n <f><v>51</v><v>42</v><v>53</v><v>52</v></f>\n <f><v>7</v><v>49</v><v>13</v><v>8</v></f>\n <f><v>47</v><v>52</v><v>54</v><v>48</v></f>\n <f><v>48</v><v>54</v><v>14</v><v>13</v><v>49</v></f>\n <f><v>52</v><v>53</v><v>54</v></f>\n <f><v>54</v><v>53</v><v>17</v><v>14</v></f>\n <f><v>0</v><v>3</v><v>20</v><v>32</v><v>44</v></f>\n <f><v>53</v><v>42</v><v>29</v><v>18</v><v>17</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_antiprism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.850650808351\" y=\"-0.27639320225\" z=\"-0.4472135955\"/>\n <p x=\"-7.98472578476E-14\" y=\"-0.894427190999\" z=\"-0.4472135955\"/>\n <p x=\"-0.85065080835\" y=\"-0.27639320225\" z=\"-0.4472135955\"/>\n <p x=\"-0.525731112119\" y=\"0.72360679775\" z=\"-0.4472135955\"/>\n <p x=\"0.525731112118\" y=\"0.723606797748\" z=\"-0.4472135955\"/>\n <p x=\"-0.525731112119\" y=\"-0.723606797749\" z=\"0.4472135955\"/>\n <p x=\"0.525731112119\" y=\"-0.723606797749\" z=\"0.4472135955\"/>\n <p x=\"0.85065080835\" y=\"0.27639320225\" z=\"0.4472135955\"/>\n <p x=\"-1.9798384402E-13\" y=\"0.894427190999\" z=\"0.4472135955\"/>\n <p x=\"-0.85065080835\" y=\"0.27639320225\" z=\"0.4472135955\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>8</v><v>3</v><v>9</v></f>\n <f><v>9</v><v>3</v><v>2</v></f>\n <f><v>9</v><v>2</v><v>5</v></f>\n <f><v>5</v><v>2</v><v>1</v></f>\n <f><v>5</v><v>1</v><v>6</v></f>\n <f><v>6</v><v>1</v><v>0</v></f>\n <f><v>6</v><v>0</v><v>7</v></f>\n <f><v>7</v><v>0</v><v>4</v></f>\n <f><v>7</v><v>4</v><v>8</v></f>\n <f><v>8</v><v>4</v><v>3</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_cupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.625224569445\" y=\"0.666368714678\" z=\"-0.406259736942\"/>\n <p x=\"-0.138993010203\" y=\"0.972247610723\" z=\"-0.188190134061\"/>\n <p x=\"0.417300814255\" y=\"0.906490875453\" z=\"0.0642987024958\"/>\n <p x=\"0.831171570718\" y=\"0.494215346751\" z=\"0.254764618944\"/>\n <p x=\"0.944534697166\" y=\"-0.107103736148\" z=\"0.310456108898\"/>\n <p x=\"0.714089332368\" y=\"-0.66778292166\" z=\"0.21010091608\"/>\n <p x=\"0.227857773125\" y=\"-0.973661817705\" z=\"-0.00796868680083\"/>\n <p x=\"-0.328436051333\" y=\"-0.907905082435\" z=\"-0.260457523358\"/>\n <p x=\"-0.742306807796\" y=\"-0.495629553733\" z=\"-0.450923439806\"/>\n <p x=\"-0.855669934244\" y=\"0.105689529166\" z=\"-0.50661492976\"/>\n <p x=\"-0.522735553383\" y=\"0.215196734518\" z=\"-0.00193656687316\"/>\n <p x=\"-0.409372426935\" y=\"-0.386122348381\" z=\"0.0537549230811\"/>\n <p x=\"0.146921397524\" y=\"-0.451879083651\" z=\"0.306243759638\"/>\n <p x=\"0.377366762322\" y=\"0.108800101861\" z=\"0.406598952456\"/>\n <p x=\"-0.0365039941405\" y=\"0.521075630563\" z=\"0.216133036008\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>11</v><v>12</v><v>13</v><v>14</v></f>\n <f><v>11</v><v>10</v><v>9</v><v>8</v></f>\n <f><v>11</v><v>8</v><v>7</v></f>\n <f><v>12</v><v>11</v><v>7</v><v>6</v></f>\n <f><v>12</v><v>6</v><v>5</v></f>\n <f><v>13</v><v>12</v><v>5</v><v>4</v></f>\n <f><v>13</v><v>4</v><v>3</v></f>\n <f><v>14</v><v>13</v><v>3</v><v>2</v></f>\n <f><v>14</v><v>2</v><v>1</v></f>\n <f><v>10</v><v>14</v><v>1</v><v>0</v></f>\n <f><v>10</v><v>0</v><v>9</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_dipyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.00424964425241\" y=\"0.806198318557\" z=\"-0.591630130807\"/>\n <p x=\"-0.113574604501\" y=\"-0.359034463686\" z=\"-0.490062316801\"/>\n <p x=\"-0.933537813285\" y=\"0.355734935647\" z=\"-0.0442697044034\"/>\n <p x=\"-0.581207742646\" y=\"-0.586342037342\" z=\"0.564269948814\"/>\n <p x=\"0.574331673805\" y=\"-0.718114243757\" z=\"0.393007711601\"/>\n <p x=\"0.113574604501\" y=\"0.359034463686\" z=\"0.490062316801\"/>\n <p x=\"0.936164237873\" y=\"0.142523026895\" z=\"-0.321377825204\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>1</v><v>3</v><v>2</v></f>\n <f><v>1</v><v>4</v><v>3</v></f>\n <f><v>2</v><v>5</v><v>0</v></f>\n <f><v>2</v><v>3</v><v>5</v></f>\n <f><v>5</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>6</v></f>\n <f><v>0</v><v>5</v><v>6</v></f>\n <f><v>4</v><v>1</v><v>6</v></f>\n <f><v>5</v><v>4</v><v>6</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_gyrobicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.137847507963\" y=\"-0.458604524125\" z=\"-0.390699329729\"/>\n <p x=\"-0.497414543934\" y=\"0.0433685486785\" z=\"-0.364230629847\"/>\n <p x=\"-0.13287797391\" y=\"0.535143243112\" z=\"-0.279161538632\"/>\n <p x=\"0.451985052478\" y=\"0.337103646275\" z=\"-0.253054648751\"/>\n <p x=\"0.448913711525\" y=\"-0.277066250121\" z=\"-0.321988794679\"/>\n <p x=\"-0.589832560441\" y=\"-0.7957081704\" z=\"-0.137644680978\"/>\n <p x=\"-0.949399596412\" y=\"-0.293735097597\" z=\"-0.111175981097\"/>\n <p x=\"-0.946328255459\" y=\"0.3204347988\" z=\"-0.0422418351685\"/>\n <p x=\"-0.581791685435\" y=\"0.812209493233\" z=\"0.0428272560468\"/>\n <p x=\"0.00496953405297\" y=\"0.993747767237\" z=\"0.111537791097\"/>\n <p x=\"0.589832560441\" y=\"0.7957081704\" z=\"0.137644680978\"/>\n <p x=\"0.949399596412\" y=\"0.293735097597\" z=\"0.111175981097\"/>\n <p x=\"0.946328255459\" y=\"-0.3204347988\" z=\"0.0422418351685\"/>\n <p x=\"0.581791685435\" y=\"-0.812209493233\" z=\"-0.0428272560468\"/>\n <p x=\"-0.00496953405298\" y=\"-0.993747767237\" z=\"-0.111537791097\"/>\n <p x=\"-0.448913711525\" y=\"0.277066250121\" z=\"0.321988794679\"/>\n <p x=\"-0.451985052478\" y=\"-0.337103646275\" z=\"0.253054648751\"/>\n <p x=\"0.13287797391\" y=\"-0.535143243112\" z=\"0.279161538632\"/>\n <p x=\"0.497414543934\" y=\"-0.0433685486785\" z=\"0.364230629847\"/>\n <p x=\"0.137847507963\" y=\"0.458604524125\" z=\"0.390699329729\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v></f>\n <f><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>9</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>11</v></f>\n <f><v>4</v><v>3</v><v>11</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>4</v><v>13</v><v>14</v></f>\n <f><v>0</v><v>14</v><v>5</v></f>\n <f><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>16</v><v>15</v><v>7</v><v>6</v></f>\n <f><v>16</v><v>6</v><v>5</v></f>\n <f><v>17</v><v>16</v><v>5</v><v>14</v></f>\n <f><v>17</v><v>14</v><v>13</v></f>\n <f><v>18</v><v>17</v><v>13</v><v>12</v></f>\n <f><v>18</v><v>12</v><v>11</v></f>\n <f><v>19</v><v>18</v><v>11</v><v>10</v></f>\n <f><v>19</v><v>10</v><v>9</v></f>\n <f><v>15</v><v>19</v><v>9</v><v>8</v></f>\n <f><v>15</v><v>8</v><v>7</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_gyrocupolarotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.713731225238\" y=\"0.172030494548\" z=\"0.00139664510805\"/>\n <p x=\"-0.480543950547\" y=\"0.0808087793682\" z=\"-0.549141289944\"/>\n <p x=\"-0.194327027526\" y=\"-0.451968871596\" z=\"-0.544949400433\"/>\n <p x=\"-0.250622515633\" y=\"-0.690021853159\" z=\"0.00817926481257\"/>\n <p x=\"-0.571631963719\" y=\"-0.304369035923\" z=\"0.345839690576\"/>\n <p x=\"-0.636844102104\" y=\"0.768262120665\" z=\"-0.0648298046153\"/>\n <p x=\"-0.403656827413\" y=\"0.677040405485\" z=\"-0.615367739667\"/>\n <p x=\"-0.0826473793279\" y=\"0.29138758825\" z=\"-0.953028165431\"/>\n <p x=\"0.203569543694\" y=\"-0.241390062715\" z=\"-0.948836275921\"/>\n <p x=\"0.345668805213\" y=\"-0.717789593186\" z=\"-0.604393230452\"/>\n <p x=\"0.289373317106\" y=\"-0.955842574748\" z=\"-0.0512645652062\"/>\n <p x=\"0.056186042415\" y=\"-0.864620859568\" z=\"0.499273369845\"/>\n <p x=\"-0.264823405671\" y=\"-0.478968042333\" z=\"0.836933795609\"/>\n <p x=\"-0.551040328692\" y=\"0.0538096086315\" z=\"0.832741906099\"/>\n <p x=\"-0.693139590212\" y=\"0.530209139103\" z=\"0.488298860631\"/>\n <p x=\"0.567411646797\" y=\"-0.0339136658474\" z=\"0.578164882399\"/>\n <p x=\"0.800598921488\" y=\"-0.125135381027\" z=\"0.0276269473473\"/>\n <p x=\"0.658499659968\" y=\"0.351264149444\" z=\"-0.316816098121\"/>\n <p x=\"0.337490211883\" y=\"0.736916966679\" z=\"0.0208443276428\"/>\n <p x=\"0.281194723775\" y=\"0.498863985117\" z=\"0.573972992889\"/>\n <p x=\"0.0511313937567\" y=\"0.0344372380857\" z=\"0.885691431791\"/>\n <p x=\"0.570535591469\" y=\"-0.589562128059\" z=\"0.33934538625\"/>\n <p x=\"0.66162360464\" y=\"-0.204384312767\" z=\"-0.55563559427\"/>\n <p x=\"0.198514895036\" y=\"0.657668034939\" z=\"-0.562418213975\"/>\n <p x=\"-0.178790041158\" y=\"0.805267870613\" z=\"0.328370877035\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v></f>\n <f><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>9</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>11</v></f>\n <f><v>4</v><v>3</v><v>11</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>4</v><v>13</v><v>14</v></f>\n <f><v>0</v><v>14</v><v>5</v></f>\n <f><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>15</v><v>20</v><v>12</v><v>11</v><v>21</v></f>\n <f><v>15</v><v>21</v><v>16</v></f>\n <f><v>21</v><v>11</v><v>10</v></f>\n <f><v>16</v><v>21</v><v>10</v><v>9</v><v>22</v></f>\n <f><v>16</v><v>22</v><v>17</v></f>\n <f><v>22</v><v>9</v><v>8</v></f>\n <f><v>17</v><v>22</v><v>8</v><v>7</v><v>23</v></f>\n <f><v>17</v><v>23</v><v>18</v></f>\n <f><v>23</v><v>7</v><v>6</v></f>\n <f><v>18</v><v>23</v><v>6</v><v>5</v><v>24</v></f>\n <f><v>18</v><v>24</v><v>19</v></f>\n <f><v>24</v><v>5</v><v>14</v></f>\n <f><v>19</v><v>24</v><v>14</v><v>13</v><v>20</v></f>\n <f><v>19</v><v>20</v><v>15</v></f>\n <f><v>20</v><v>13</v><v>12</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_hexecontahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.339478187999\" y=\"-0.659860467811\" z=\"0.670327325152\"/>\n <p x=\"0.696327472581\" y=\"-0.4667185186\" z=\"0.454798272344\"/>\n <p x=\"0.765324567411\" y=\"-0.222894670845\" z=\"0.523579855827\"/>\n <p x=\"0.626468206681\" y=\"-0.103308028845\" z=\"0.711621128411\"/>\n <p x=\"0.426508560375\" y=\"-0.234343584608\" z=\"0.820190907954\"/>\n <p x=\"0.227791796392\" y=\"-0.095561873569\" z=\"0.921150595196\"/>\n <p x=\"-0.00936400127344\" y=\"-0.207842719465\" z=\"0.93072730306\"/>\n <p x=\"-0.0343210264957\" y=\"-0.452522251703\" z=\"0.838799899898\"/>\n <p x=\"-0.268993385341\" y=\"-0.527262180548\" z=\"0.747781214542\"/>\n <p x=\"-0.276707368199\" y=\"-0.716242201598\" z=\"0.565658672918\"/>\n <p x=\"-0.0493104619941\" y=\"-0.819739017577\" z=\"0.484908253806\"/>\n <p x=\"-0.0384907417408\" y=\"-0.921400440491\" z=\"0.243062305319\"/>\n <p x=\"0.19389755233\" y=\"-0.925915670797\" z=\"0.120927676615\"/>\n <p x=\"0.402255144264\" y=\"-0.828512793032\" z=\"0.247582196242\"/>\n <p x=\"0.600752908235\" y=\"-0.733290974423\" z=\"0.10449824531\"/>\n <p x=\"0.752090755415\" y=\"-0.54710151917\" z=\"0.211137435191\"/>\n <p x=\"0.24973438784\" y=\"0.362772986833\" z=\"0.897790897432\"/>\n <p x=\"0.61634363491\" y=\"0.159060031618\" z=\"0.710183091361\"/>\n <p x=\"0.745650993024\" y=\"0.286926156228\" z=\"0.520785532324\"/>\n <p x=\"0.658098741737\" y=\"0.523940463518\" z=\"0.449368479107\"/>\n <p x=\"0.446216367572\" y=\"0.619614681286\" z=\"0.571408954475\"/>\n <p x=\"0.295885192923\" y=\"0.791619318608\" z=\"0.441961989566\"/>\n <p x=\"0.0418152795339\" y=\"0.807066660569\" z=\"0.506393602842\"/>\n <p x=\"-0.0474799045664\" y=\"0.649631203268\" z=\"0.696609324948\"/>\n <p x=\"-0.301227791153\" y=\"0.582267106001\" z=\"0.692651736655\"/>\n <p x=\"-0.370699381862\" y=\"0.354799781086\" z=\"0.803889716832\"/>\n <p x=\"-0.18247371354\" y=\"0.207627784413\" z=\"0.912761546201\"/>\n <p x=\"-0.220498110355\" y=\"-0.0518128393727\" z=\"0.926410063753\"/>\n <p x=\"-0.612619817895\" y=\"-0.222458031824\" z=\"0.758425594742\"/>\n <p x=\"-0.586249054795\" y=\"0.234164611285\" z=\"0.714855631419\"/>\n <p x=\"-0.720073409526\" y=\"0.347854723901\" z=\"0.519645041477\"/>\n <p x=\"-0.861360295335\" y=\"0.194132487801\" z=\"0.360431147353\"/>\n <p x=\"-0.860790844866\" y=\"-0.0645409453616\" z=\"0.40547895256\"/>\n <p x=\"-0.904175606952\" y=\"-0.22563029746\" z=\"0.202724033718\"/>\n <p x=\"-0.803270036219\" y=\"-0.467807860865\" z=\"0.213196265034\"/>\n <p x=\"-0.664716058023\" y=\"-0.535128582656\" z=\"0.425828082028\"/>\n <p x=\"-0.480357326377\" y=\"-0.720290472195\" z=\"0.399972583901\"/>\n <p x=\"-0.41854519886\" y=\"-0.908075808509\" z=\"-0.0147730314045\"/>\n <p x=\"-0.749588663585\" y=\"-0.589476126878\" z=\"-0.0132031990433\"/>\n <p x=\"-0.799864580127\" y=\"-0.462050141758\" z=\"-0.237204369998\"/>\n <p x=\"-0.658098741731\" y=\"-0.523940463519\" z=\"-0.449368479105\"/>\n <p x=\"-0.474116196188\" y=\"-0.709738383544\" z=\"-0.425470154818\"/>\n <p x=\"-0.267985364302\" y=\"-0.701495616359\" z=\"-0.587900789231\"/>\n <p x=\"-0.0418152795295\" y=\"-0.807066660571\" z=\"-0.50639360285\"/>\n <p x=\"-0.0346335111617\" y=\"-0.91487889105\" z=\"-0.267089362969\"/>\n <p x=\"0.195882591097\" y=\"-0.922559499007\" z=\"-0.141610643992\"/>\n <p x=\"0.563753717789\" y=\"-0.746579879135\" z=\"-0.35327075973\"/>\n <p x=\"0.18192732884\" y=\"-0.713064027584\" z=\"-0.606614979047\"/>\n <p x=\"0.166780366898\" y=\"-0.518834281687\" z=\"-0.7826460826\"/>\n <p x=\"0.370699381872\" y=\"-0.354799781083\" z=\"-0.803889716858\"/>\n <p x=\"0.578172819576\" y=\"-0.394320181165\" z=\"-0.647894573708\"/>\n <p x=\"0.728149644771\" y=\"-0.187699154022\" z=\"-0.58660609922\"/>\n <p x=\"0.86136029535\" y=\"-0.194132487812\" z=\"-0.36043114736\"/>\n <p x=\"0.837021262999\" y=\"-0.406821121806\" z=\"-0.2084024312\"/>\n <p x=\"0.873681060667\" y=\"-0.379090999627\" z=\"0.0501099932862\"/>\n <p x=\"0.976773216357\" y=\"0.0388478709469\" z=\"0.210724765197\"/>\n <p x=\"0.920975482022\" y=\"0.0341951873427\" z=\"-0.245304797938\"/>\n <p x=\"0.843990969819\" y=\"0.255976055473\" z=\"-0.362898188367\"/>\n <p x=\"0.803270036223\" y=\"0.467807860864\" z=\"-0.213196265035\"/>\n <p x=\"0.841848548628\" y=\"0.44581642675\" z=\"0.0455886828799\"/>\n <p x=\"0.707604695093\" y=\"0.605709841874\" z=\"0.20481888618\"/>\n <p x=\"-0.339478188012\" y=\"0.659860467808\" z=\"-0.670327325142\"/>\n <p x=\"-0.0867898753919\" y=\"0.880377206112\" z=\"-0.356290731962\"/>\n <p x=\"0.174591079114\" y=\"0.860762251953\" z=\"-0.371679827139\"/>\n <p x=\"0.276707368191\" y=\"0.716242201602\" z=\"-0.565658672914\"/>\n <p x=\"0.11163752032\" y=\"0.59955288829\" z=\"-0.73322097039\"/>\n <p x=\"0.191676891499\" y=\"0.380231543981\" z=\"-0.853360144057\"/>\n <p x=\"0.00936400126359\" y=\"0.207842719477\" z=\"-0.930727303068\"/>\n <p x=\"-0.242624001921\" y=\"0.264575326878\" z=\"-0.883557062852\"/>\n <p x=\"-0.411676354852\" y=\"0.0653301313233\" z=\"-0.857784440291\"/>\n <p x=\"-0.626468206683\" y=\"0.103308028847\" z=\"-0.711621128401\"/>\n <p x=\"-0.659997059282\" y=\"0.338372126278\" z=\"-0.599539639303\"/>\n <p x=\"-0.801654980716\" y=\"0.351241063165\" z=\"-0.378838488844\"/>\n <p x=\"-0.752090755418\" y=\"0.547101519162\" z=\"-0.211137435177\"/>\n <p x=\"-0.563686272473\" y=\"0.718958617992\" z=\"-0.273671125689\"/>\n <p x=\"-0.439321780029\" y=\"0.842845149469\" z=\"-0.078409315833\"/>\n <p x=\"-0.19389755234\" y=\"0.9259156708\" z=\"-0.120927676602\"/>\n <p x=\"0.612619817884\" y=\"0.222458031838\" z=\"-0.758425594773\"/>\n <p x=\"0.512432574261\" y=\"0.606976530092\" z=\"-0.527761254704\"/>\n <p x=\"0.632640810126\" y=\"0.648442524765\" z=\"-0.298039411218\"/>\n <p x=\"0.324997373025\" y=\"-0.110905038838\" z=\"-0.889728258041\"/>\n <p x=\"0.0779744508577\" y=\"-0.0449099061818\" z=\"-0.949443351963\"/>\n <p x=\"-0.249734387845\" y=\"-0.362772986829\" z=\"-0.897790897446\"/>\n <p x=\"-0.62549127936\" y=\"-0.340462154097\" z=\"-0.634338848149\"/>\n <p x=\"-0.73650334856\" y=\"-0.105524033753\" z=\"-0.596629775527\"/>\n <p x=\"-0.976773216351\" y=\"-0.0388478709543\" z=\"-0.210724765189\"/>\n <p x=\"-0.905282135362\" y=\"0.277011309922\" z=\"0.115189334306\"/>\n <p x=\"-0.805420188295\" y=\"0.508900811476\" z=\"0.0431031036376\"/>\n <p x=\"-0.563753717785\" y=\"0.746579879124\" z=\"0.353270759746\"/>\n <p x=\"-0.127713741728\" y=\"0.888188013108\" z=\"0.323033816718\"/>\n <p x=\"-0.0335353382206\" y=\"0.94925037695\" z=\"0.0856661902635\"/>\n <p x=\"0.418545198853\" y=\"0.908075808509\" z=\"0.0147730314187\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>0</v><v>4</v><v>5</v><v>6</v><v>7</v></f>\n <f><v>0</v><v>7</v><v>8</v><v>9</v><v>10</v></f>\n <f><v>0</v><v>10</v><v>11</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>13</v><v>14</v><v>15</v><v>1</v></f>\n <f><v>16</v><v>17</v><v>18</v><v>19</v><v>20</v></f>\n <f><v>16</v><v>20</v><v>21</v><v>22</v><v>23</v></f>\n <f><v>16</v><v>23</v><v>24</v><v>25</v><v>26</v></f>\n <f><v>16</v><v>26</v><v>27</v><v>6</v><v>5</v></f>\n <f><v>16</v><v>5</v><v>4</v><v>3</v><v>17</v></f>\n <f><v>28</v><v>27</v><v>26</v><v>25</v><v>29</v></f>\n <f><v>28</v><v>29</v><v>30</v><v>31</v><v>32</v></f>\n <f><v>28</v><v>32</v><v>33</v><v>34</v><v>35</v></f>\n <f><v>28</v><v>35</v><v>36</v><v>9</v><v>8</v></f>\n <f><v>28</v><v>8</v><v>7</v><v>6</v><v>27</v></f>\n <f><v>37</v><v>36</v><v>35</v><v>34</v><v>38</v></f>\n <f><v>37</v><v>38</v><v>39</v><v>40</v><v>41</v></f>\n <f><v>37</v><v>41</v><v>42</v><v>43</v><v>44</v></f>\n <f><v>37</v><v>44</v><v>45</v><v>12</v><v>11</v></f>\n <f><v>37</v><v>11</v><v>10</v><v>9</v><v>36</v></f>\n <f><v>46</v><v>45</v><v>44</v><v>43</v><v>47</v></f>\n <f><v>46</v><v>47</v><v>48</v><v>49</v><v>50</v></f>\n <f><v>46</v><v>50</v><v>51</v><v>52</v><v>53</v></f>\n <f><v>46</v><v>53</v><v>54</v><v>15</v><v>14</v></f>\n <f><v>46</v><v>14</v><v>13</v><v>12</v><v>45</v></f>\n <f><v>55</v><v>54</v><v>53</v><v>52</v><v>56</v></f>\n <f><v>55</v><v>56</v><v>57</v><v>58</v><v>59</v></f>\n <f><v>55</v><v>59</v><v>60</v><v>19</v><v>18</v></f>\n <f><v>55</v><v>18</v><v>17</v><v>3</v><v>2</v></f>\n <f><v>55</v><v>2</v><v>1</v><v>15</v><v>54</v></f>\n <f><v>61</v><v>62</v><v>63</v><v>64</v><v>65</v></f>\n <f><v>61</v><v>65</v><v>66</v><v>67</v><v>68</v></f>\n <f><v>61</v><v>68</v><v>69</v><v>70</v><v>71</v></f>\n <f><v>61</v><v>71</v><v>72</v><v>73</v><v>74</v></f>\n <f><v>61</v><v>74</v><v>75</v><v>76</v><v>62</v></f>\n <f><v>77</v><v>78</v><v>79</v><v>58</v><v>57</v></f>\n <f><v>77</v><v>57</v><v>56</v><v>52</v><v>51</v></f>\n <f><v>77</v><v>51</v><v>50</v><v>49</v><v>80</v></f>\n <f><v>77</v><v>80</v><v>81</v><v>67</v><v>66</v></f>\n <f><v>77</v><v>66</v><v>65</v><v>64</v><v>78</v></f>\n <f><v>82</v><v>81</v><v>80</v><v>49</v><v>48</v></f>\n <f><v>82</v><v>48</v><v>47</v><v>43</v><v>42</v></f>\n <f><v>82</v><v>42</v><v>41</v><v>40</v><v>83</v></f>\n <f><v>82</v><v>83</v><v>84</v><v>70</v><v>69</v></f>\n <f><v>82</v><v>69</v><v>68</v><v>67</v><v>81</v></f>\n <f><v>85</v><v>84</v><v>83</v><v>40</v><v>39</v></f>\n <f><v>85</v><v>39</v><v>38</v><v>34</v><v>33</v></f>\n <f><v>85</v><v>33</v><v>32</v><v>31</v><v>86</v></f>\n <f><v>85</v><v>86</v><v>87</v><v>73</v><v>72</v></f>\n <f><v>85</v><v>72</v><v>71</v><v>70</v><v>84</v></f>\n <f><v>88</v><v>87</v><v>86</v><v>31</v><v>30</v></f>\n <f><v>88</v><v>30</v><v>29</v><v>25</v><v>24</v></f>\n <f><v>88</v><v>24</v><v>23</v><v>22</v><v>89</v></f>\n <f><v>88</v><v>89</v><v>90</v><v>76</v><v>75</v></f>\n <f><v>88</v><v>75</v><v>74</v><v>73</v><v>87</v></f>\n <f><v>91</v><v>90</v><v>89</v><v>22</v><v>21</v></f>\n <f><v>91</v><v>21</v><v>20</v><v>19</v><v>60</v></f>\n <f><v>91</v><v>60</v><v>59</v><v>58</v><v>79</v></f>\n <f><v>91</v><v>79</v><v>78</v><v>64</v><v>63</v></f>\n <f><v>91</v><v>63</v><v>62</v><v>76</v><v>90</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_icositetrahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.0901145455692\" y=\"0.897162863386\" z=\"-0.432409719167\"/>\n <p x=\"-0.178545630569\" y=\"0.424185153461\" z=\"-0.821572663221\"/>\n <p x=\"-0.539658582967\" y=\"0.1914827141\" z=\"-0.747593613937\"/>\n <p x=\"-0.780444845146\" y=\"0.329345205445\" z=\"-0.411376721392\"/>\n <p x=\"-0.621420613433\" y=\"0.677753807834\" z=\"-0.203173385881\"/>\n <p x=\"-0.991907607271\" y=\"-0.119839022633\" z=\"-0.041927405001\"/>\n <p x=\"-0.80893156313\" y=\"0.285217665001\" z=\"0.388682180331\"/>\n <p x=\"-0.636908529007\" y=\"0.653762148934\" z=\"0.231809848493\"/>\n <p x=\"-0.2756541378\" y=\"0.788178501431\" z=\"0.435410925171\"/>\n <p x=\"0.0430298035743\" y=\"0.924984024657\" z=\"0.171307377811\"/>\n <p x=\"0.441670006353\" y=\"0.784072468735\" z=\"0.27740078735\"/>\n <p x=\"0.682456268526\" y=\"0.646209977388\" z=\"-0.0588161051972\"/>\n <p x=\"0.485904786435\" y=\"0.671415370282\" z=\"-0.447091899529\"/>\n <p x=\"0.99190760727\" y=\"0.119839022635\" z=\"0.041927404999\"/>\n <p x=\"0.77996636109\" y=\"0.00315424475187\" z=\"-0.527670118417\"/>\n <p x=\"0.53891995239\" y=\"0.3217930339\" z=\"-0.702002675074\"/>\n <p x=\"0.177665561183\" y=\"0.187376681409\" z=\"-0.905603751758\"/>\n <p x=\"0.089435268849\" y=\"-0.42513222085\" z=\"-0.900701908225\"/>\n <p x=\"-0.0431712423854\" y=\"-0.826697937787\" z=\"-0.448887503779\"/>\n <p x=\"-0.441670006353\" y=\"-0.784072468732\" z=\"-0.27740078735\"/>\n <p x=\"-0.682716415052\" y=\"-0.465433679587\" z=\"-0.451733344009\"/>\n <p x=\"-0.486524709297\" y=\"-0.240629833213\" z=\"-0.769535066246\"/>\n <p x=\"0.621019028099\" y=\"-0.398691423166\" z=\"-0.584956189295\"/>\n <p x=\"0.809191709653\" y=\"-0.4659939628\" z=\"0.121867268876\"/>\n <p x=\"0.636908529005\" y=\"-0.653762148937\" z=\"-0.231809848492\"/>\n <p x=\"0.275795576604\" y=\"-0.886464588298\" z=\"-0.157830799204\"/>\n <p x=\"0.0901145455658\" y=\"-0.897162863387\" z=\"0.432409719166\"/>\n <p x=\"-0.140279749615\" y=\"-0.462704589821\" z=\"0.808096084615\"/>\n <p x=\"-0.538919952389\" y=\"-0.321793033898\" z=\"0.702002675079\"/>\n <p x=\"-0.711203133036\" y=\"-0.509561220034\" z=\"0.348325557715\"/>\n <p x=\"-0.457157921929\" y=\"-0.808064127632\" z=\"0.157582447021\"/>\n <p x=\"0.59267374892\" y=\"-0.541105050485\" z=\"0.49268283839\"/>\n <p x=\"0.711681617096\" y=\"0.177061769834\" z=\"0.590721282093\"/>\n <p x=\"0.539658582969\" y=\"-0.191482714106\" z=\"0.747593613932\"/>\n <p x=\"0.141159819002\" y=\"-0.148857245052\" z=\"0.919080330363\"/>\n <p x=\"-0.0894352688413\" y=\"0.425132220851\" z=\"0.900701908225\"/>\n <p x=\"-0.592053826055\" y=\"0.110319513417\" z=\"0.723944127388\"/>\n <p x=\"0.457559507262\" y=\"0.529001742965\" z=\"0.630547128154\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>7</v><v>4</v><v>3</v></f>\n <f><v>0</v><v>4</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>0</v><v>9</v><v>10</v><v>11</v><v>12</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>12</v><v>11</v></f>\n <f><v>0</v><v>12</v><v>15</v><v>16</v><v>1</v></f>\n <f><v>17</v><v>18</v><v>19</v><v>20</v><v>21</v></f>\n <f><v>5</v><v>3</v><v>2</v><v>21</v><v>20</v></f>\n <f><v>17</v><v>21</v><v>2</v><v>1</v><v>16</v></f>\n <f><v>17</v><v>16</v><v>15</v><v>14</v><v>22</v></f>\n <f><v>13</v><v>23</v><v>24</v><v>22</v><v>14</v></f>\n <f><v>17</v><v>22</v><v>24</v><v>25</v><v>18</v></f>\n <f><v>26</v><v>27</v><v>28</v><v>29</v><v>30</v></f>\n <f><v>5</v><v>20</v><v>19</v><v>30</v><v>29</v></f>\n <f><v>26</v><v>30</v><v>19</v><v>18</v><v>25</v></f>\n <f><v>26</v><v>25</v><v>24</v><v>23</v><v>31</v></f>\n <f><v>13</v><v>32</v><v>33</v><v>31</v><v>23</v></f>\n <f><v>26</v><v>31</v><v>33</v><v>34</v><v>27</v></f>\n <f><v>35</v><v>8</v><v>7</v><v>6</v><v>36</v></f>\n <f><v>5</v><v>29</v><v>28</v><v>36</v><v>6</v></f>\n <f><v>35</v><v>36</v><v>28</v><v>27</v><v>34</v></f>\n <f><v>35</v><v>34</v><v>33</v><v>32</v><v>37</v></f>\n <f><v>13</v><v>11</v><v>10</v><v>37</v><v>32</v></f>\n <f><v>35</v><v>37</v><v>10</v><v>9</v><v>8</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_orthobicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.264231311969\" y=\"-0.462112731389\" z=\"-0.31400580968\"/>\n <p x=\"-0.512260686794\" y=\"0.103746661986\" z=\"-0.329835762375\"/>\n <p x=\"-0.0505364820654\" y=\"0.51447521324\" z=\"-0.338714230868\"/>\n <p x=\"0.482854144711\" y=\"0.202460024689\" z=\"-0.32837147347\"/>\n <p x=\"0.350783476611\" y=\"-0.401104518096\" z=\"-0.313100829367\"/>\n <p x=\"-0.74708545668\" y=\"-0.664572756078\" z=\"0.0143656637891\"/>\n <p x=\"-0.995114831505\" y=\"-0.0987133627023\" z=\"-0.00146428890596\"/>\n <p x=\"-0.863044163405\" y=\"0.504851180082\" z=\"-0.0167349330082\"/>\n <p x=\"-0.401319958676\" y=\"0.915579731335\" z=\"-0.0256134015008\"/>\n <p x=\"0.213694829904\" y=\"0.976587944629\" z=\"-0.0247084211876\"/>\n <p x=\"0.74708545668\" y=\"0.664572756078\" z=\"-0.0143656637891\"/>\n <p x=\"0.995114831505\" y=\"0.0987133627023\" z=\"0.00146428890596\"/>\n <p x=\"0.863044163405\" y=\"-0.504851180082\" z=\"0.0167349330083\"/>\n <p x=\"0.401319958676\" y=\"-0.915579731335\" z=\"0.0256134015008\"/>\n <p x=\"-0.213694829904\" y=\"-0.976587944629\" z=\"0.0247084211876\"/>\n <p x=\"-0.514904342992\" y=\"0.120760801814\" z=\"0.319775479929\"/>\n <p x=\"-0.266874968166\" y=\"-0.445098591561\" z=\"0.335605432624\"/>\n <p x=\"0.348139820413\" y=\"-0.384090378267\" z=\"0.336510412937\"/>\n <p x=\"0.480210488514\" y=\"0.219474164517\" z=\"0.321239768835\"/>\n <p x=\"-0.0531801382625\" y=\"0.531489353068\" z=\"0.310897011436\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v></f>\n <f><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>9</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>11</v></f>\n <f><v>4</v><v>3</v><v>11</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>4</v><v>13</v><v>14</v></f>\n <f><v>0</v><v>14</v><v>5</v></f>\n <f><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>16</v><v>15</v><v>6</v><v>5</v></f>\n <f><v>16</v><v>5</v><v>14</v></f>\n <f><v>17</v><v>16</v><v>14</v><v>13</v></f>\n <f><v>17</v><v>13</v><v>12</v></f>\n <f><v>18</v><v>17</v><v>12</v><v>11</v></f>\n <f><v>18</v><v>11</v><v>10</v></f>\n <f><v>19</v><v>18</v><v>10</v><v>9</v></f>\n <f><v>19</v><v>9</v><v>8</v></f>\n <f><v>15</v><v>19</v><v>8</v><v>7</v></f>\n <f><v>15</v><v>7</v><v>6</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_orthobirotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.0508328140306\" y=\"-0.996405057988\" z=\"-0.0677715680363\"/>\n <p x=\"-0.0693436793963\" y=\"-0.772544270548\" z=\"-0.631163056723\"/>\n <p x=\"0.411748719964\" y=\"-0.426004692774\" z=\"-0.805594807172\"/>\n <p x=\"0.829256667924\" y=\"-0.435692242703\" z=\"-0.35000806898\"/>\n <p x=\"0.606198370977\" y=\"-0.788219055601\" z=\"0.105991770495\"/>\n <p x=\"0.151592900242\" y=\"-0.839672979839\" z=\"0.521506356169\"/>\n <p x=\"-0.360915905933\" y=\"-0.570400365213\" z=\"0.737823239136\"/>\n <p x=\"-0.778423853894\" y=\"-0.560712815284\" z=\"0.282236500944\"/>\n <p x=\"-0.523949150132\" y=\"-0.823998194786\" z=\"-0.215648471049\"/>\n <p x=\"-0.898600347321\" y=\"-0.336852027844\" z=\"-0.281154987743\"/>\n <p x=\"-0.675542050373\" y=\"0.0156747850529\" z=\"-0.737154827218\"/>\n <p x=\"-0.163033244199\" y=\"-0.253597829572\" z=\"-0.953471710185\"/>\n <p x=\"-0.194449651013\" y=\"0.362214362826\" z=\"-0.911586577667\"/>\n <p x=\"0.360915905933\" y=\"0.570400365213\" z=\"-0.737823239136\"/>\n <p x=\"0.735567103122\" y=\"0.083254198272\" z=\"-0.672316722442\"/>\n <p x=\"0.778423853894\" y=\"0.560712815284\" z=\"-0.282236500944\"/>\n <p x=\"0.898600347321\" y=\"0.336852027844\" z=\"0.281154987743\"/>\n <p x=\"0.930016754135\" y=\"-0.278960164554\" z=\"0.239269855225\"/>\n <p x=\"0.675542050373\" y=\"-0.0156747850529\" z=\"0.737154827218\"/>\n <p x=\"0.194449651013\" y=\"-0.362214362826\" z=\"0.911586577667\"/>\n <p x=\"-0.680644343369\" y=\"0.371141069858\" z=\"0.63164672413\"/>\n <p x=\"-0.125278786423\" y=\"0.579327072245\" z=\"0.805410062662\"/>\n <p x=\"0.0977795105245\" y=\"0.931853885142\" z=\"0.349410223186\"/>\n <p x=\"-0.319728437436\" y=\"0.941541435071\" z=\"-0.106176515006\"/>\n <p x=\"-0.800820836796\" y=\"0.595001857298\" z=\"0.0682552354436\"/>\n <p x=\"-0.976026895399\" y=\"0.0211917934059\" z=\"0.216615805863\"/>\n <p x=\"-0.300484845026\" y=\"0.005517008353\" z=\"0.953770633082\"/>\n <p x=\"0.477939008868\" y=\"0.566229823637\" z=\"0.671534132138\"/>\n <p x=\"0.283489357855\" y=\"0.928444186464\" z=\"-0.24005244553\"/>\n <p x=\"-0.615110989466\" y=\"0.591592158619\" z=\"-0.521207433272\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>0</v><v>5</v><v>6</v><v>7</v><v>8</v></f>\n <f><v>0</v><v>8</v><v>1</v></f>\n <f><v>8</v><v>7</v><v>9</v></f>\n <f><v>1</v><v>8</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>1</v><v>11</v><v>2</v></f>\n <f><v>11</v><v>10</v><v>12</v></f>\n <f><v>2</v><v>11</v><v>12</v><v>13</v><v>14</v></f>\n <f><v>2</v><v>14</v><v>3</v></f>\n <f><v>14</v><v>13</v><v>15</v></f>\n <f><v>3</v><v>14</v><v>15</v><v>16</v><v>17</v></f>\n <f><v>3</v><v>17</v><v>4</v></f>\n <f><v>17</v><v>16</v><v>18</v></f>\n <f><v>4</v><v>17</v><v>18</v><v>19</v><v>5</v></f>\n <f><v>4</v><v>5</v><v>0</v></f>\n <f><v>5</v><v>19</v><v>6</v></f>\n <f><v>20</v><v>21</v><v>22</v><v>23</v><v>24</v></f>\n <f><v>20</v><v>25</v><v>7</v><v>6</v><v>26</v></f>\n <f><v>20</v><v>26</v><v>21</v></f>\n <f><v>26</v><v>6</v><v>19</v></f>\n <f><v>21</v><v>26</v><v>19</v><v>18</v><v>27</v></f>\n <f><v>21</v><v>27</v><v>22</v></f>\n <f><v>27</v><v>18</v><v>16</v></f>\n <f><v>22</v><v>27</v><v>16</v><v>15</v><v>28</v></f>\n <f><v>22</v><v>28</v><v>23</v></f>\n <f><v>28</v><v>15</v><v>13</v></f>\n <f><v>23</v><v>28</v><v>13</v><v>12</v><v>29</v></f>\n <f><v>23</v><v>29</v><v>24</v></f>\n <f><v>29</v><v>12</v><v>10</v></f>\n <f><v>24</v><v>29</v><v>10</v><v>9</v><v>25</v></f>\n <f><v>24</v><v>25</v><v>20</v></f>\n <f><v>25</v><v>9</v><v>7</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_orthocupolarontunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.528890723415\" y=\"-0.430295785322\" z=\"0.272266126006\"/>\n <p x=\"-0.649646892896\" y=\"-0.203175659196\" z=\"-0.275113194182\"/>\n <p x=\"-0.178426549442\" y=\"-0.322362159638\" z=\"-0.635023864149\"/>\n <p x=\"0.233559808483\" y=\"-0.623143594039\" z=\"-0.310081570915\"/>\n <p x=\"0.0169610371283\" y=\"-0.689850243241\" z=\"0.250654480654\"/>\n <p x=\"-0.849397988064\" y=\"0.0145569094729\" z=\"0.527552039386\"/>\n <p x=\"-0.970154157544\" y=\"0.2416770356\" z=\"-0.0198272808021\"/>\n <p x=\"-0.753555386189\" y=\"0.308383684802\" z=\"-0.580563332371\"/>\n <p x=\"-0.282335042735\" y=\"0.189197184359\" z=\"-0.940474002338\"/>\n <p x=\"0.263516717808\" y=\"-0.0703572735596\" z=\"-0.962085647691\"/>\n <p x=\"0.675503075733\" y=\"-0.37113870796\" z=\"-0.637143354457\"/>\n <p x=\"0.796259245214\" y=\"-0.598258834087\" z=\"-0.0897640342686\"/>\n <p x=\"0.579660473859\" y=\"-0.664965483289\" z=\"0.4709720173\"/>\n <p x=\"0.108440130405\" y=\"-0.545778982846\" z=\"0.830882687268\"/>\n <p x=\"-0.437411630138\" y=\"-0.286224524928\" z=\"0.85249433262\"/>\n <p x=\"0.503012093268\" y=\"0.306826182955\" z=\"0.556971518456\"/>\n <p x=\"0.719610864622\" y=\"0.373532832157\" z=\"-0.00376453311283\"/>\n <p x=\"0.307624506697\" y=\"0.674314266558\" z=\"-0.328706826347\"/>\n <p x=\"-0.163595836756\" y=\"0.793500767001\" z=\"0.0312038436204\"/>\n <p x=\"-0.0428396672761\" y=\"0.566380640874\" z=\"0.578583163808\"/>\n <p x=\"0.0610688260172\" y=\"0.0548212968768\" z=\"0.884033301997\"/>\n <p x=\"0.823519357916\" y=\"-0.13802651184\" z=\"0.301685605076\"/>\n <p x=\"0.628131771345\" y=\"0.229461571763\" z=\"-0.583992739727\"/>\n <p x=\"-0.255074930034\" y=\"0.649429506606\" z=\"-0.549024362994\"/>\n <p x=\"-0.605539104007\" y=\"0.541495880922\" z=\"0.358265627162\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v></f>\n <f><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>9</v><v>10</v></f>\n <f><v>3</v><v>10</v><v>11</v></f>\n <f><v>4</v><v>3</v><v>11</v><v>12</v></f>\n <f><v>4</v><v>12</v><v>13</v></f>\n <f><v>0</v><v>4</v><v>13</v><v>14</v></f>\n <f><v>0</v><v>14</v><v>5</v></f>\n <f><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v></f>\n <f><v>15</v><v>20</v><v>13</v><v>12</v><v>21</v></f>\n <f><v>15</v><v>21</v><v>16</v></f>\n <f><v>21</v><v>12</v><v>11</v></f>\n <f><v>16</v><v>21</v><v>11</v><v>10</v><v>22</v></f>\n <f><v>16</v><v>22</v><v>17</v></f>\n <f><v>22</v><v>10</v><v>9</v></f>\n <f><v>17</v><v>22</v><v>9</v><v>8</v><v>23</v></f>\n <f><v>17</v><v>23</v><v>18</v></f>\n <f><v>23</v><v>8</v><v>7</v></f>\n <f><v>18</v><v>23</v><v>7</v><v>6</v><v>24</v></f>\n <f><v>18</v><v>24</v><v>19</v></f>\n <f><v>24</v><v>6</v><v>5</v></f>\n <f><v>19</v><v>24</v><v>5</v><v>14</v><v>20</v></f>\n <f><v>19</v><v>20</v><v>15</v></f>\n <f><v>20</v><v>14</v><v>13</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.506731853971\" y=\"-0.697456562333\" z=\"-0.506731853971\"/>\n <p x=\"-0.506731853971\" y=\"-0.697456562333\" z=\"-0.506731853971\"/>\n <p x=\"-0.819909362906\" y=\"0.266404701135\" z=\"-0.506731853971\"/>\n <p x=\"2.25034148636E-16\" y=\"0.862103722396\" z=\"-0.506731853971\"/>\n <p x=\"0.819909362906\" y=\"0.266404701135\" z=\"-0.506731853971\"/>\n <p x=\"-0.506731853971\" y=\"-0.697456562333\" z=\"0.506731853971\"/>\n <p x=\"0.506731853971\" y=\"-0.697456562333\" z=\"0.506731853971\"/>\n <p x=\"0.819909362906\" y=\"0.266404701135\" z=\"0.506731853971\"/>\n <p x=\"2.25034148636E-16\" y=\"0.862103722396\" z=\"0.506731853971\"/>\n <p x=\"-0.819909362906\" y=\"0.266404701135\" z=\"0.506731853971\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>8</v><v>3</v><v>2</v><v>9</v></f>\n <f><v>9</v><v>2</v><v>1</v><v>5</v></f>\n <f><v>5</v><v>1</v><v>0</v><v>6</v></f>\n <f><v>6</v><v>0</v><v>4</v><v>7</v></f>\n <f><v>7</v><v>4</v><v>3</v><v>8</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_pyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.813698285048\" y=\"-0.0936910403531\" z=\"0.573687275324\"/>\n <p x=\"-0.125419095609\" y=\"-0.968473796112\" z=\"0.215240694809\"/>\n <p x=\"0.80511394129\" y=\"-0.501287627182\" z=\"-0.317020908418\"/>\n <p x=\"0.69193579631\" y=\"0.662232060049\" z=\"-0.287530089604\"/>\n <p x=\"-0.308545180971\" y=\"0.914140604408\" z=\"0.262957842006\"/>\n <p x=\"-0.249387175974\" y=\"-0.0129202008105\" z=\"-0.447334814117\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v></f>\n <f><v>2</v><v>1</v><v>5</v></f>\n <f><v>3</v><v>2</v><v>5</v></f>\n <f><v>4</v><v>3</v><v>5</v></f>\n <f><v>0</v><v>4</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentagonal_rotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.639012187156\" y=\"-0.762892255898\" z=\"-0.0982793495957\"/>\n <p x=\"-0.804111884826\" y=\"-0.351679371951\" z=\"-0.479297085351\"/>\n <p x=\"-0.624738684928\" y=\"0.121705742355\" z=\"-0.771290663649\"/>\n <p x=\"-0.169407053153\" y=\"0.476446063122\" z=\"-0.862728462077\"/>\n <p x=\"0.387961803316\" y=\"0.577042844997\" z=\"-0.718684349492\"/>\n <p x=\"0.834471925576\" y=\"0.385071536464\" z=\"-0.394178281022\"/>\n <p x=\"0.999571623247\" y=\"-0.0261413474831\" z=\"-0.0131605452675\"/>\n <p x=\"0.820198423349\" y=\"-0.499526461789\" z=\"0.278833033031\"/>\n <p x=\"0.364866791573\" y=\"-0.854266782556\" z=\"0.370270831459\"/>\n <p x=\"-0.192502064895\" y=\"-0.954863564431\" z=\"0.226226718874\"/>\n <p x=\"0.129648572273\" y=\"0.00834956134318\" z=\"0.678002129372\"/>\n <p x=\"0.30902177217\" y=\"0.481734675649\" z=\"0.386008551073\"/>\n <p x=\"-0.13748835009\" y=\"0.673705984182\" z=\"0.0615024826036\"/>\n <p x=\"-0.592819981866\" y=\"0.318965663415\" z=\"0.152940281032\"/>\n <p x=\"-0.427720284196\" y=\"-0.0922472205325\" z=\"0.533958016787\"/>\n <p x=\"-0.0619164873183\" y=\"-0.540382138189\" z=\"0.616970900256\"/>\n <p x=\"0.674825569048\" y=\"0.0335997579921\" z=\"0.469021434543\"/>\n <p x=\"0.407688646685\" y=\"0.698956180831\" z=\"-0.147478212225\"/>\n <p x=\"-0.494153107351\" y=\"0.536187168597\" z=\"-0.380546482267\"/>\n <p x=\"-0.784385041457\" y=\"-0.229766036117\" z=\"0.0919090519164\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>11</v><v>12</v><v>13</v><v>14</v></f>\n <f><v>10</v><v>15</v><v>8</v><v>7</v><v>16</v></f>\n <f><v>10</v><v>16</v><v>11</v></f>\n <f><v>16</v><v>7</v><v>6</v></f>\n <f><v>11</v><v>16</v><v>6</v><v>5</v><v>17</v></f>\n <f><v>11</v><v>17</v><v>12</v></f>\n <f><v>17</v><v>5</v><v>4</v></f>\n <f><v>12</v><v>17</v><v>4</v><v>3</v><v>18</v></f>\n <f><v>12</v><v>18</v><v>13</v></f>\n <f><v>18</v><v>3</v><v>2</v></f>\n <f><v>13</v><v>18</v><v>2</v><v>1</v><v>19</v></f>\n <f><v>13</v><v>19</v><v>14</v></f>\n <f><v>19</v><v>1</v><v>0</v></f>\n <f><v>14</v><v>19</v><v>0</v><v>9</v><v>15</v></f>\n <f><v>14</v><v>15</v><v>10</v></f>\n <f><v>15</v><v>9</v><v>8</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/pentakis_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.128722786176\" y=\"-0.470689115479\" z=\"-0.843124319319\"/>\n <p x=\"0.664490836666\" y=\"-0.542720627299\" z=\"-0.513718063425\"/>\n <p x=\"0.067231757421\" y=\"-0.915424296288\" z=\"-0.396835291472\"/>\n <p x=\"-0.477827296216\" y=\"-0.553660898741\" z=\"-0.682012231706\"/>\n <p x=\"-0.217433237995\" y=\"0.0426248458193\" z=\"-0.97514404553\"/>\n <p x=\"0.488558194092\" y=\"0.0493863054159\" z=\"-0.871132529424\"/>\n <p x=\"0.520357593389\" y=\"-0.822770001559\" z=\"0.0354106830462\"/>\n <p x=\"0.930056729699\" y=\"-0.347522224561\" z=\"0.119259309811\"/>\n <p x=\"0.496926398597\" y=\"-0.599586646109\" z=\"0.627343612529\"/>\n <p x=\"-0.0363287606101\" y=\"-0.950569428715\" z=\"0.308379607526\"/>\n <p x=\"-0.492944842901\" y=\"-0.832474656843\" z=\"-0.113876004978\"/>\n <p x=\"-0.645391734284\" y=\"-0.610526917545\" z=\"0.459049444249\"/>\n <p x=\"-0.918252835272\" y=\"-0.365223955596\" z=\"-0.153046374577\"/>\n <p x=\"-0.745459203897\" y=\"0.0173704973555\" z=\"-0.626869410709\"/>\n <p x=\"-0.930056729699\" y=\"0.34752222456\" z=\"-0.119259309809\"/>\n <p x=\"-0.496926398601\" y=\"0.599586646109\" z=\"-0.627343612529\"/>\n <p x=\"0.111780774649\" y=\"0.552308343107\" z=\"-0.794630083428\"/>\n <p x=\"0.0363287606109\" y=\"0.950569428716\" z=\"-0.308379607527\"/>\n <p x=\"0.645391734283\" y=\"0.610526917545\" z=\"-0.459049444251\"/>\n <p x=\"0.894098578903\" y=\"0.0330729594551\" z=\"-0.385318475413\"/>\n <p x=\"0.918252835273\" y=\"0.365223955594\" z=\"0.153046374575\"/>\n <p x=\"0.492944842899\" y=\"0.832474656841\" z=\"0.11387600498\"/>\n <p x=\"-0.0672317574218\" y=\"0.915424296287\" z=\"0.396835291473\"/>\n <p x=\"0.477827296216\" y=\"0.553660898738\" z=\"0.682012231705\"/>\n <p x=\"-0.52035759339\" y=\"0.82277000156\" z=\"-0.0354106830472\"/>\n <p x=\"-0.664490836666\" y=\"0.5427206273\" z=\"0.513718063425\"/>\n <p x=\"-0.894098578901\" y=\"-0.0330729594491\" z=\"0.385318475414\"/>\n <p x=\"-0.488558194091\" y=\"-0.0493863054145\" z=\"0.871132529424\"/>\n <p x=\"-0.111780774649\" y=\"-0.552308343108\" z=\"0.794630083427\"/>\n <p x=\"0.217433237997\" y=\"-0.0426248458174\" z=\"0.97514404553\"/>\n <p x=\"0.745459203899\" y=\"-0.0173704973539\" z=\"0.62686941071\"/>\n <p x=\"-0.128722786178\" y=\"0.470689115477\" z=\"0.843124319319\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>0</v><v>2</v><v>3</v></f>\n <f><v>0</v><v>3</v><v>4</v></f>\n <f><v>0</v><v>4</v><v>5</v></f>\n <f><v>0</v><v>5</v><v>1</v></f>\n <f><v>6</v><v>2</v><v>1</v></f>\n <f><v>6</v><v>1</v><v>7</v></f>\n <f><v>6</v><v>7</v><v>8</v></f>\n <f><v>6</v><v>8</v><v>9</v></f>\n <f><v>6</v><v>9</v><v>2</v></f>\n <f><v>10</v><v>3</v><v>2</v></f>\n <f><v>10</v><v>2</v><v>9</v></f>\n <f><v>10</v><v>9</v><v>11</v></f>\n <f><v>10</v><v>11</v><v>12</v></f>\n <f><v>10</v><v>12</v><v>3</v></f>\n <f><v>13</v><v>4</v><v>3</v></f>\n <f><v>13</v><v>3</v><v>12</v></f>\n <f><v>13</v><v>12</v><v>14</v></f>\n <f><v>13</v><v>14</v><v>15</v></f>\n <f><v>13</v><v>15</v><v>4</v></f>\n <f><v>16</v><v>5</v><v>4</v></f>\n <f><v>16</v><v>4</v><v>15</v></f>\n <f><v>16</v><v>15</v><v>17</v></f>\n <f><v>16</v><v>17</v><v>18</v></f>\n <f><v>16</v><v>18</v><v>5</v></f>\n <f><v>19</v><v>1</v><v>5</v></f>\n <f><v>19</v><v>5</v><v>18</v></f>\n <f><v>19</v><v>18</v><v>20</v></f>\n <f><v>19</v><v>20</v><v>7</v></f>\n <f><v>19</v><v>7</v><v>1</v></f>\n <f><v>21</v><v>22</v><v>23</v></f>\n <f><v>21</v><v>23</v><v>20</v></f>\n <f><v>21</v><v>20</v><v>18</v></f>\n <f><v>21</v><v>18</v><v>17</v></f>\n <f><v>21</v><v>17</v><v>22</v></f>\n <f><v>24</v><v>25</v><v>22</v></f>\n <f><v>24</v><v>22</v><v>17</v></f>\n <f><v>24</v><v>17</v><v>15</v></f>\n <f><v>24</v><v>15</v><v>14</v></f>\n <f><v>24</v><v>14</v><v>25</v></f>\n <f><v>26</v><v>27</v><v>25</v></f>\n <f><v>26</v><v>25</v><v>14</v></f>\n <f><v>26</v><v>14</v><v>12</v></f>\n <f><v>26</v><v>12</v><v>11</v></f>\n <f><v>26</v><v>11</v><v>27</v></f>\n <f><v>28</v><v>29</v><v>27</v></f>\n <f><v>28</v><v>27</v><v>11</v></f>\n <f><v>28</v><v>11</v><v>9</v></f>\n <f><v>28</v><v>9</v><v>8</v></f>\n <f><v>28</v><v>8</v><v>29</v></f>\n <f><v>30</v><v>23</v><v>29</v></f>\n <f><v>30</v><v>29</v><v>8</v></f>\n <f><v>30</v><v>8</v><v>7</v></f>\n <f><v>30</v><v>7</v><v>20</v></f>\n <f><v>30</v><v>20</v><v>23</v></f>\n <f><v>31</v><v>23</v><v>22</v></f>\n <f><v>31</v><v>22</v><v>25</v></f>\n <f><v>31</v><v>25</v><v>27</v></f>\n <f><v>31</v><v>27</v><v>29</v></f>\n <f><v>31</v><v>29</v><v>23</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/polyhedra.txt",
    "content": "tetrahedron Tetrahedron\ncube Cube\noctahedron Octahedron\ndodecahedron Dodecahedron\nicosahedron Icosahedron\nsmall_stellated_dodecahedron Small Stellated Dodecahedron\ngreat_dodecahedron Great Dodecahedron\ngreat_stellated_dodecahedron Great Stellated Dodecahedron\ngreat_icosahedron Great Icosahedron\ntriangular_prism Triangular Prism\npentagonal_prism Pentagonal Prism\nhexagonal_prism Hexagonal Prism\noctagonal_prism Octagonal Prism\ndecagonal_prism Decagonal Prism\nsquare_antiprism Square Antiprism\npentagonal_antiprism Pentagonal Antiprism\nhexagonal_antiprism Hexagonal Antiprism\noctagonal_antiprism Octagonal Antiprism\ndecagonal_antiprism Decagonal Antiprism\nrhombic_dodecahedron Rhombic Dodecahedron\ntriakis_octahedron Triakis Octahedron\ntetrakis_hexahedron Tetrakis Hexahedron\ntrapezoidal_icositetrahedron Trapezoidal Icositetrahedron\nhexakis_octahedron Hexakis Octahedron\npentagonal_icositetrahedron Pentagonal Icositetrahedron\nrhombic_triacontahedron Rhombic Triacontahedron\ntriakis_icosahedron Triakis Icosahedron\npentakis_dodecahedron Pentakis Dodecahedron\ntrapezoidal_hexecontahedron Trapezoidal Hexecontahedron\nhexakis_icosahedron Hexakis Icosahedron\npentagonal_hexecontahedron Pentagonal Hexecontahedron\nsquare_pyramid Square Pyramid\npentagonal_pyramid Pentagonal Pyramid\ntriangular_cupola Triangular Cupola\nsquare_cupola Square Cupola\npentagonal_cupola Pentagonal Cupola\npentagonal_rotunda Pentagonal Rotunda\nelongated_triangular_pyramid Elongated Triangular Pyramid\nelongated_square_pyramid Elongated Square Pyramid\nelongated_pentagonal_pyramid Elongated Pentagonal Pyramid\ngyroelongated_square_pyramid Gyroelongated Square Pyramid\ngyroelongated_pentagonal_pyramid Gyroelongated Pentagonal Pyramid\ntriangular_dipyramid Triangular Dipyramid\npentagonal_dipyramid Pentagonal Dipyramid\nelongated_triangular_dipyramid Elongated Triangular Dipyramid\nelongated_square_dipyramid Elongated Square Dipyramid\nelongated_pentagonal_dipyramid Elongated Pentagonal Dipyramid\ngyroelongated_square_dipyramid Gyroelongated Square Dipyramid\nelongated_triangular_cupola Elongated Triangular Cupola\nelongated_square_cupola Elongated Square Cupola\nelongated_pentagonal_cupola Elongated Pentagonal Cupola\nelongated_pentagonal_rotunds Elongated Pentagonal Rotunds\ngyroelongated_triangular_cupola Gyroelongated Triangular Cupola\ngyroelongated_square_cupola Gyroelongated Square Cupola\ngyroelongated_pentagonal_cupola Gyroelongated Pentagonal Cupola\ngyroelongated_pentagonal_rotunda Gyroelongated Pentagonal Rotunda\ngyrobifastigium Gyrobifastigium\ntriangular_orthobicupola Triangular Orthobicupola\nsquare_orthobicupola Square Orthobicupola\nsquare_gyrobicupola Square Gyrobicupola\npentagonal_orthobicupola Pentagonal Orthobicupola\npentagonal_gyrobicupola Pentagonal Gyrobicupola\npentagonal_orthocupolarontunda Pentagonal Orthocupolarontunda\npentagonal_gyrocupolarotunda Pentagonal Gyrocupolarotunda\npentagonal_orthobirotunda Pentagonal Orthobirotunda\nelongated_triangular_orthobicupola Elongated Triangular Orthobicupola\nelongated_triangular_gyrobicupola Elongated Triangular Gyrobicupola\nelongated_square_gyrobicupola Elongated Square Gyrobicupola\nelongated_pentagonal_orthobicupola Elongated Pentagonal Orthobicupola\nelongated_pentagonal_gyrobicupola Elongated Pentagonal Gyrobicupola\nelongated_pentagonal_orthocupolarotunda Elongated Pentagonal Orthocupolarotunda\nelongated_pentagonal_gyrocupolarotunda Elongated Pentagonal Gyrocupolarotunda\nelongated_pentagonal_orthobirotunda Elongated Pentagonal Orthobirotunda\nelongated_pentagonal_gyrobirotunda Elongated Pentagonal Gyrobirotunda\ngyroelongated_triangular_bicupola Gyroelongated Triangular Bicupola\ngyroelongated_square_bicupola Gyroelongated Square Bicupola\ngyroelongated_pentagonal_bicupola Gyroelongated Pentagonal Bicupola\ngyroelongated_pentagonal_cupolarotunda Gyroelongated Pentagonal Cupolarotunda\ngyroelongated_pentagonal_birotunda Gyroelongated Pentagonal Birotunda\naugmented_triangular_prism Augmented Triangular Prism\nbiaugmented_triangular_prism Biaugmented Triangular Prism\ntriaugmented_triangular_prism Triaugmented Triangular Prism\naugmented_pentagonal_prism Augmented Pentagonal Prism\nbiaugmented_pentagonal_prism Biaugmented Pentagonal Prism\naugmented_hexagonal_prism Augmented Hexagonal Prism\nparabiaugmented_hexagonal_prism Parabiaugmented Hexagonal Prism\nmetabiaugmented_hexagonal_prism Metabiaugmented Hexagonal Prism\ntriaugmented_hexagonal_prism Triaugmented Hexagonal Prism\naugmented_dodecahedron Augmented Dodecahedron\nparabiaugmented_dodecahedron Parabiaugmented Dodecahedron\nmetabiaugmented_dodecahedron Metabiaugmented Dodecahedron\ntriaugmented_dodecahedron Triaugmented Dodecahedron\nmetabidiminished_icosahedron Metabidiminished Icosahedron\ntridiminished_icosahedron Tridiminished Icosahedron\naugmented_tridiminished_icosahedron Augmented Tridiminished Icosahedron\naugmented_truncated_tetrahedron Augmented Truncated Tetrahedron\naugmented_truncated_cube Augmented Truncated Cube\nbiaugmented_truncated_cube Biaugmented Truncated Cube\naugmented_truncated_dodecahedron Augmented Truncated Dodecahedron\nparabiaugmented_truncated_dodecahedron Parabiaugmented Truncated Dodecahedron\nmetabiaugmented_truncated_dodecahedron Metabiaugmented Truncated Dodecahedron\ntriaugmented_truncated_dodecahedron Triaugmented Truncated Dodecahedron\ngyrate_rhombicosidodecahedron Gyrate Rhombicosidodecahedron\nparabigyrate_rhombicosidodecahedron Parabigyrate Rhombicosidodecahedron\nmetabigyrate_rhombicosidodecahedron Metabigyrate Rhombicosidodecahedron\ntrigyrate_rhombicosidodecahedron Trigyrate Rhombicosidodecahedron\ndiminished_rhombicosidodecahedron Diminished Rhombicosidodecahedron\nparagyrate_diminished_rhombicosidodecahedron Paragyrate Diminished Rhombicosidodecahedron\nmetagyrate_diminished_rhombicosidodecahedron Metagyrate Diminished Rhombicosidodecahedron\nbigyrate_diminished_rhombicosidodecahedron Bigyrate Diminished Rhombicosidodecahedron\nparabidiminished_rhombicosidodecahedron Parabidiminished Rhombicosidodecahedron\nmetabidiminished_rhombicosidodecahedron Metabidiminished Rhombicosidodecahedron\ngyrate_bidiminished_rhombicosidodecahedron Gyrate Bidiminished Rhombicosidodecahedron\ntridiminished_rhombicosidodecahedron Tridiminished Rhombicosidodecahedron\nsnub_disphenoid Snub Disphenoid\nsnub_square_antiprism Snub Square Antiprism\nsphenocorona Sphenocorona\naugmented_sphenocorona Augmented Sphenocorona\nsphenomegacorona Sphenomegacorona\nhebesphenomegacorona Hebesphenomegacorona\ndisphenocingulum Disphenocingulum\nbilunabirotunda Bilunabirotunda\ntriangular_hebesphenorotunda Triangular Hebesphenorotunda\ntetrahemihexahedron Tetrahemihexahedron\noctahemioctahedron Octahemioctahedron\nsmall_ditrigonal_icosidodecahedron Small Ditrigonal Icosidodecahedron\ndodecadodecahedron Dodecadodecahedron\nechidnahedron Echidnahedron\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/rhombic_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.70703698856\" y=\"0.00993462638421\" z=\"0.70710678119\"/>\n <p x=\"0.70001214688\" y=\"0.50988527555\" z=\"5.4622716588E-12\"/>\n <p x=\"-0.0140496833673\" y=\"0.999901298328\" z=\"-1.35953461927E-12\"/>\n <p x=\"-0.00702484168915\" y=\"0.49995064916\" z=\"0.707106781184\"/>\n <p x=\"0.70703698857\" y=\"0.00993462638725\" z=\"-0.70710678118\"/>\n <p x=\"-0.00702484167977\" y=\"0.499950649165\" z=\"-0.707106781185\"/>\n <p x=\"0.714061830249\" y=\"-0.490016022775\" z=\"7.16217067356E-12\"/>\n <p x=\"0.0140496833689\" y=\"-0.999901298327\" z=\"-2.64868880422E-12\"/>\n <p x=\"0.00702484167892\" y=\"-0.499950649164\" z=\"0.707106781185\"/>\n <p x=\"0.00702484168617\" y=\"-0.499950649162\" z=\"-0.707106781187\"/>\n <p x=\"-0.707036988561\" y=\"-0.00993462638453\" z=\"-0.70710678119\"/>\n <p x=\"-0.70001214688\" y=\"-0.509885275548\" z=\"-4.83365515662E-12\"/>\n <p x=\"-0.707036988566\" y=\"-0.00993462638874\" z=\"0.707106781182\"/>\n <p x=\"-0.714061830251\" y=\"0.490016022774\" z=\"-2.94049839188E-12\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>4</v><v>5</v><v>2</v><v>1</v></f>\n <f><v>4</v><v>1</v><v>0</v><v>6</v></f>\n <f><v>7</v><v>6</v><v>0</v><v>8</v></f>\n <f><v>4</v><v>6</v><v>7</v><v>9</v></f>\n <f><v>10</v><v>5</v><v>4</v><v>9</v></f>\n <f><v>10</v><v>9</v><v>7</v><v>11</v></f>\n <f><v>12</v><v>11</v><v>7</v><v>8</v></f>\n <f><v>10</v><v>11</v><v>12</v><v>13</v></f>\n <f><v>2</v><v>5</v><v>10</v><v>13</v></f>\n <f><v>2</v><v>13</v><v>12</v><v>3</v></f>\n <f><v>0</v><v>3</v><v>12</v><v>8</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/rhombic_triacontahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.0593443986023\" y=\"0.997584057255\" z=\"0.036114969977\"/>\n <p x=\"0.198959633515\" y=\"0.754205070607\" z=\"-0.469861024609\"/>\n <p x=\"-0.18157601596\" y=\"0.468790069252\" z=\"-0.864445499374\"/>\n <p x=\"-0.439880048081\" y=\"0.7121690559\" z=\"-0.358469504791\"/>\n <p x=\"-0.652396470163\" y=\"0.154729680928\" z=\"-0.616130812659\"/>\n <p x=\"-0.910700502281\" y=\"0.398108667575\" z=\"-0.110154818073\"/>\n <p x=\"-0.144899160579\" y=\"-0.147750784772\" z=\"-0.886765778322\"/>\n <p x=\"-0.615719614781\" y=\"-0.461811173094\" z=\"-0.638451091606\"/>\n <p x=\"-0.874023646903\" y=\"-0.218432186442\" z=\"-0.132475097024\"/>\n <p x=\"-0.50349946538\" y=\"-0.751539369478\" z=\"-0.104194391573\"/>\n <p x=\"-0.761803497497\" y=\"-0.508160382827\" z=\"0.401781603016\"/>\n <p x=\"-0.0528757507988\" y=\"-0.707855860871\" z=\"-0.570371670011\"/>\n <p x=\"0.059344398606\" y=\"-0.997584057256\" z=\"-0.0361149699766\"/>\n <p x=\"-0.530164852805\" y=\"0.683523668932\" z=\"0.284429656693\"/>\n <p x=\"-0.798480352877\" y=\"0.108380471189\" z=\"0.424101881962\"/>\n <p x=\"-0.417944703401\" y=\"0.393795472547\" z=\"0.818686356729\"/>\n <p x=\"-0.381267848023\" y=\"-0.222745381475\" z=\"0.796366077781\"/>\n <p x=\"-0.198959633519\" y=\"-0.754205070605\" z=\"0.469861024608\"/>\n <p x=\"0.181576015956\" y=\"-0.468790069252\" z=\"0.864445499375\"/>\n <p x=\"0.0528757508012\" y=\"0.70785586087\" z=\"0.570371670011\"/>\n <p x=\"0.144899160579\" y=\"0.14775078477\" z=\"0.886765778323\"/>\n <p x=\"0.615719614781\" y=\"0.461811173091\" z=\"0.638451091608\"/>\n <p x=\"0.652396470158\" y=\"-0.154729680925\" z=\"0.616130812659\"/>\n <p x=\"0.439880048079\" y=\"-0.712169055901\" z=\"0.35846950479\"/>\n <p x=\"0.910700502281\" y=\"-0.398108667576\" z=\"0.110154818075\"/>\n <p x=\"0.503499465379\" y=\"0.751539369479\" z=\"0.104194391569\"/>\n <p x=\"0.874023646901\" y=\"0.218432186443\" z=\"0.132475097022\"/>\n <p x=\"0.761803497498\" y=\"0.508160382832\" z=\"-0.401781603012\"/>\n <p x=\"0.798480352878\" y=\"-0.10838047119\" z=\"-0.424101881962\"/>\n <p x=\"0.53016485281\" y=\"-0.683523668933\" z=\"-0.284429656693\"/>\n <p x=\"0.417944703406\" y=\"-0.393795472545\" z=\"-0.818686356729\"/>\n <p x=\"0.381267848023\" y=\"0.222745381471\" z=\"-0.796366077783\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>2</v><v>4</v><v>5</v><v>3</v></f>\n <f><v>2</v><v>6</v><v>7</v><v>4</v></f>\n <f><v>5</v><v>4</v><v>7</v><v>8</v></f>\n <f><v>7</v><v>9</v><v>10</v><v>8</v></f>\n <f><v>7</v><v>11</v><v>12</v><v>9</v></f>\n <f><v>0</v><v>3</v><v>5</v><v>13</v></f>\n <f><v>5</v><v>14</v><v>15</v><v>13</v></f>\n <f><v>5</v><v>8</v><v>10</v><v>14</v></f>\n <f><v>15</v><v>14</v><v>10</v><v>16</v></f>\n <f><v>10</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>10</v><v>9</v><v>12</v><v>17</v></f>\n <f><v>0</v><v>13</v><v>15</v><v>19</v></f>\n <f><v>15</v><v>20</v><v>21</v><v>19</v></f>\n <f><v>15</v><v>16</v><v>18</v><v>20</v></f>\n <f><v>21</v><v>20</v><v>18</v><v>22</v></f>\n <f><v>18</v><v>23</v><v>24</v><v>22</v></f>\n <f><v>18</v><v>17</v><v>12</v><v>23</v></f>\n <f><v>0</v><v>19</v><v>21</v><v>25</v></f>\n <f><v>21</v><v>26</v><v>27</v><v>25</v></f>\n <f><v>21</v><v>22</v><v>24</v><v>26</v></f>\n <f><v>27</v><v>26</v><v>24</v><v>28</v></f>\n <f><v>24</v><v>29</v><v>30</v><v>28</v></f>\n <f><v>24</v><v>23</v><v>12</v><v>29</v></f>\n <f><v>0</v><v>25</v><v>27</v><v>1</v></f>\n <f><v>27</v><v>31</v><v>2</v><v>1</v></f>\n <f><v>27</v><v>28</v><v>30</v><v>31</v></f>\n <f><v>2</v><v>31</v><v>30</v><v>6</v></f>\n <f><v>30</v><v>11</v><v>7</v><v>6</v></f>\n <f><v>30</v><v>29</v><v>12</v><v>11</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/small_ditrigonal_icosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.777919975198\" y=\"0.180287076809\" z=\"0.601944417801\"/>\n <p x=\"0.724214323071\" y=\"0.34871819579\" z=\"0.19786846856\"/>\n <p x=\"0.988662446992\" y=\"0.12837088368\" z=\"-0.07789404424\"/>\n <p x=\"0.691022404667\" y=\"0.452814352085\" z=\"-0.0518642021092\"/>\n <p x=\"0.637316752541\" y=\"0.621245471065\" z=\"-0.455940151346\"/>\n <p x=\"0.507070742098\" y=\"0.653331442984\" z=\"-0.0357768749455\"/>\n <p x=\"0.209430699773\" y=\"0.977774911388\" z=\"-0.00974703281123\"/>\n <p x=\"0.426574280747\" y=\"0.673161664192\" z=\"0.223898310696\"/>\n <p x=\"0.296328270304\" y=\"0.705247636113\" z=\"0.644061587096\"/>\n <p x=\"0.560776394226\" y=\"0.484900324004\" z=\"0.368299074295\"/>\n <p x=\"0.784627197265\" y=\"-0.085092824838\" z=\"0.249723985911\"/>\n <p x=\"0.697729626735\" y=\"0.187434450437\" z=\"-0.404084633996\"/>\n <p x=\"0.216137921839\" y=\"0.712395009742\" z=\"-0.361967464701\"/>\n <p x=\"0.00539545004686\" y=\"0.764311202869\" z=\"0.317870997342\"/>\n <p x=\"0.356741144499\" y=\"0.271436615486\" z=\"0.695917104447\"/>\n <p x=\"0.65852647803\" y=\"-0.217020652066\" z=\"0.452203063873\"/>\n <p x=\"0.454491228302\" y=\"-0.430484360584\" z=\"0.779821094024\"/>\n <p x=\"0.584737238745\" y=\"-0.462570332505\" z=\"0.359657817623\"/>\n <p x=\"0.465343741577\" y=\"-0.859878061379\" z=\"0.209916463694\"/>\n <p x=\"0.665233700097\" y=\"-0.482400553711\" z=\"0.0999826319818\"/>\n <p x=\"0.795479710538\" y=\"-0.514486525631\" z=\"-0.320180644419\"/>\n <p x=\"0.788772488472\" y=\"-0.249106623986\" z=\"0.0320397874703\"/>\n <p x=\"0.394078354108\" y=\"0.00332666004358\" z=\"0.727965576674\"/>\n <p x=\"0.200895617657\" y=\"-0.639530749269\" z=\"0.485678976496\"/>\n <p x=\"0.411638089448\" y=\"-0.691446942396\" z=\"-0.194159485548\"/>\n <p x=\"0.735066836344\" y=\"-0.0806755050049\" z=\"-0.372036161769\"/>\n <p x=\"0.578336129565\" y=\"-0.209873278435\" z=\"-0.553825987927\"/>\n <p x=\"0.324740518918\" y=\"-0.418919667121\" z=\"-0.847968105455\"/>\n <p x=\"0.444134016086\" y=\"-0.0216119382475\" z=\"-0.698226751527\"/>\n <p x=\"0.226990435112\" y=\"0.283001308948\" z=\"-0.931872095033\"/>\n <p x=\"0.517923255372\" y=\"0.22393774219\" z=\"-0.605681505276\"/>\n <p x=\"0.378446171045\" y=\"-0.587350786102\" z=\"-0.443892156214\"/>\n <p x=\"0.0271004765912\" y=\"-0.0944761987172\" z=\"-0.821938263321\"/>\n <p x=\"0.220283213046\" y=\"0.548381210593\" z=\"-0.579651663142\"/>\n <p x=\"-0.037457688812\" y=\"0.503348621054\" z=\"-0.656109582231\"/>\n <p x=\"-0.454491228303\" y=\"0.430484360583\" z=\"-0.779821094024\"/>\n <p x=\"-0.200895617654\" y=\"0.63953074927\" z=\"-0.485678976494\"/>\n <p x=\"-0.465343741577\" y=\"0.859878061378\" z=\"-0.209916463694\"/>\n <p x=\"-0.0441649108766\" y=\"0.768728522701\" z=\"-0.30388915034\"/>\n <p x=\"-0.156851185979\" y=\"0.106040892182\" z=\"-0.805850936159\"/>\n <p x=\"-0.584737238745\" y=\"0.462570332504\" z=\"-0.359657817622\"/>\n <p x=\"-0.174410921316\" y=\"0.800814494622\" z=\"0.116274126062\"/>\n <p x=\"-0.411638089449\" y=\"0.691446942397\" z=\"0.194159485547\"/>\n <p x=\"-0.795479710541\" y=\"0.51448652563\" z=\"0.320180644419\"/>\n <p x=\"-0.378446171047\" y=\"0.587350786104\" z=\"0.443892156216\"/>\n <p x=\"-0.32474051892\" y=\"0.418919667124\" z=\"0.847968105454\"/>\n <p x=\"-0.120705269189\" y=\"0.632383375642\" z=\"0.520350075302\"/>\n <p x=\"-0.665233700097\" y=\"0.482400553713\" z=\"-0.0999826319823\"/>\n <p x=\"-0.578336129571\" y=\"0.209873278437\" z=\"0.553825987925\"/>\n <p x=\"0.0964383117839\" y=\"0.327770128447\" z=\"0.753995418809\"/>\n <p x=\"-0.0271004765946\" y=\"0.0944761987216\" z=\"0.821938263321\"/>\n <p x=\"-0.226990435113\" y=\"-0.283001308946\" z=\"0.931872095032\"/>\n <p x=\"0.156851185979\" y=\"-0.10604089218\" z=\"0.805850936159\"/>\n <p x=\"-0.444134016088\" y=\"0.0216119382498\" z=\"0.698226751527\"/>\n <p x=\"0.0374576888098\" y=\"-0.503348621055\" z=\"0.656109582231\"/>\n <p x=\"-0.209430699769\" y=\"-0.977774911388\" z=\"0.00974703281181\"/>\n <p x=\"-0.507070742096\" y=\"-0.653331442986\" z=\"0.0357768749451\"/>\n <p x=\"-0.637316752539\" y=\"-0.621245471066\" z=\"0.455940151346\"/>\n <p x=\"-0.691022404667\" y=\"-0.452814352085\" z=\"0.0518642021057\"/>\n <p x=\"-0.988662446993\" y=\"-0.128370883685\" z=\"0.0778940442417\"/>\n <p x=\"-0.724214323069\" y=\"-0.348718195793\" z=\"-0.19786846856\"/>\n <p x=\"-0.777919975198\" y=\"-0.180287076811\" z=\"-0.601944417801\"/>\n <p x=\"-0.560776394224\" y=\"-0.484900324005\" z=\"-0.368299074297\"/>\n <p x=\"-0.296328270302\" y=\"-0.705247636113\" z=\"-0.644061587097\"/>\n <p x=\"-0.426574280745\" y=\"-0.673161664193\" z=\"-0.223898310695\"/>\n <p x=\"-0.216137921838\" y=\"-0.712395009742\" z=\"0.361967464701\"/>\n <p x=\"-0.697729626735\" y=\"-0.187434450441\" z=\"0.404084633998\"/>\n <p x=\"-0.784627197266\" y=\"0.0850928248356\" z=\"-0.24972398591\"/>\n <p x=\"-0.3567411445\" y=\"-0.271436615485\" z=\"-0.695917104447\"/>\n <p x=\"-0.00539545004101\" y=\"-0.764311202868\" z=\"-0.317870997341\"/>\n <p x=\"0.0441649108783\" y=\"-0.768728522703\" z=\"0.30388915034\"/>\n <p x=\"-0.220283213045\" y=\"-0.548381210593\" z=\"0.579651663141\"/>\n <p x=\"0.17441092132\" y=\"-0.800814494621\" z=\"-0.116274126061\"/>\n <p x=\"-0.517923255373\" y=\"-0.223937742189\" z=\"0.605681505275\"/>\n <p x=\"-0.735066836346\" y=\"0.0806755050032\" z=\"0.372036161771\"/>\n <p x=\"-0.788772488474\" y=\"0.249106623984\" z=\"-0.0320397874709\"/>\n <p x=\"-0.658526478032\" y=\"0.217020652066\" z=\"-0.452203063873\"/>\n <p x=\"-0.394078354108\" y=\"-0.00332666004287\" z=\"-0.727965576674\"/>\n <p x=\"-0.0964383117841\" y=\"-0.327770128446\" z=\"-0.753995418809\"/>\n <p x=\"0.120705269191\" y=\"-0.63238337564\" z=\"-0.520350075302\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>1</v><v>0</v><v>10</v></f>\n <f><v>3</v><v>2</v><v>11</v></f>\n <f><v>5</v><v>4</v><v>12</v></f>\n <f><v>7</v><v>6</v><v>13</v></f>\n <f><v>9</v><v>8</v><v>14</v></f>\n <f><v>2</v><v>10</v><v>0</v><v>15</v><v>16</v><v>17</v><v>18</v><v>19</v><v>20</v><v>21</v></f>\n <f><v>10</v><v>2</v><v>1</v></f>\n <f><v>15</v><v>0</v><v>22</v></f>\n <f><v>17</v><v>16</v><v>23</v></f>\n <f><v>19</v><v>18</v><v>24</v></f>\n <f><v>21</v><v>20</v><v>25</v></f>\n <f><v>4</v><v>11</v><v>2</v><v>25</v><v>20</v><v>26</v><v>27</v><v>28</v><v>29</v><v>30</v></f>\n <f><v>11</v><v>4</v><v>3</v></f>\n <f><v>25</v><v>2</v><v>21</v></f>\n <f><v>26</v><v>20</v><v>31</v></f>\n <f><v>28</v><v>27</v><v>32</v></f>\n <f><v>30</v><v>29</v><v>33</v></f>\n <f><v>6</v><v>12</v><v>4</v><v>33</v><v>29</v><v>34</v><v>35</v><v>36</v><v>37</v><v>38</v></f>\n <f><v>12</v><v>6</v><v>5</v></f>\n <f><v>33</v><v>4</v><v>30</v></f>\n <f><v>34</v><v>29</v><v>39</v></f>\n <f><v>36</v><v>35</v><v>40</v></f>\n <f><v>38</v><v>37</v><v>41</v></f>\n <f><v>8</v><v>13</v><v>6</v><v>41</v><v>37</v><v>42</v><v>43</v><v>44</v><v>45</v><v>46</v></f>\n <f><v>13</v><v>8</v><v>7</v></f>\n <f><v>41</v><v>6</v><v>38</v></f>\n <f><v>42</v><v>37</v><v>47</v></f>\n <f><v>44</v><v>43</v><v>48</v></f>\n <f><v>46</v><v>45</v><v>49</v></f>\n <f><v>0</v><v>14</v><v>8</v><v>49</v><v>45</v><v>50</v><v>51</v><v>52</v><v>16</v><v>22</v></f>\n <f><v>14</v><v>0</v><v>9</v></f>\n <f><v>49</v><v>8</v><v>46</v></f>\n <f><v>50</v><v>45</v><v>53</v></f>\n <f><v>52</v><v>51</v><v>54</v></f>\n <f><v>22</v><v>16</v><v>15</v></f>\n <f><v>55</v><v>56</v><v>57</v><v>58</v><v>59</v><v>60</v><v>61</v><v>62</v><v>63</v><v>64</v></f>\n <f><v>56</v><v>55</v><v>65</v></f>\n <f><v>58</v><v>57</v><v>66</v></f>\n <f><v>60</v><v>59</v><v>67</v></f>\n <f><v>62</v><v>61</v><v>68</v></f>\n <f><v>64</v><v>63</v><v>69</v></f>\n <f><v>57</v><v>65</v><v>55</v><v>70</v><v>18</v><v>23</v><v>16</v><v>54</v><v>51</v><v>71</v></f>\n <f><v>65</v><v>57</v><v>56</v></f>\n <f><v>70</v><v>55</v><v>72</v></f>\n <f><v>23</v><v>18</v><v>17</v></f>\n <f><v>54</v><v>16</v><v>52</v></f>\n <f><v>71</v><v>51</v><v>73</v></f>\n <f><v>59</v><v>66</v><v>57</v><v>73</v><v>51</v><v>53</v><v>45</v><v>48</v><v>43</v><v>74</v></f>\n <f><v>66</v><v>59</v><v>58</v></f>\n <f><v>73</v><v>57</v><v>71</v></f>\n <f><v>53</v><v>51</v><v>50</v></f>\n <f><v>48</v><v>45</v><v>44</v></f>\n <f><v>74</v><v>43</v><v>75</v></f>\n <f><v>61</v><v>67</v><v>59</v><v>75</v><v>43</v><v>47</v><v>37</v><v>40</v><v>35</v><v>76</v></f>\n <f><v>67</v><v>61</v><v>60</v></f>\n <f><v>75</v><v>59</v><v>74</v></f>\n <f><v>47</v><v>43</v><v>42</v></f>\n <f><v>40</v><v>37</v><v>36</v></f>\n <f><v>76</v><v>35</v><v>77</v></f>\n <f><v>63</v><v>68</v><v>61</v><v>77</v><v>35</v><v>39</v><v>29</v><v>32</v><v>27</v><v>78</v></f>\n <f><v>68</v><v>63</v><v>62</v></f>\n <f><v>77</v><v>61</v><v>76</v></f>\n <f><v>39</v><v>35</v><v>34</v></f>\n <f><v>32</v><v>29</v><v>28</v></f>\n <f><v>78</v><v>27</v><v>79</v></f>\n <f><v>55</v><v>69</v><v>63</v><v>79</v><v>27</v><v>31</v><v>20</v><v>24</v><v>18</v><v>72</v></f>\n <f><v>69</v><v>55</v><v>64</v></f>\n <f><v>79</v><v>63</v><v>78</v></f>\n <f><v>31</v><v>27</v><v>26</v></f>\n <f><v>24</v><v>20</v><v>19</v></f>\n <f><v>72</v><v>18</v><v>70</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/small_stellated_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.642556494013\" y=\"-0.596519554529\" z=\"-0.480921587232\"/>\n <p x=\"0.111393298785\" y=\"0.924208591269\" z=\"-0.365280731504\"/>\n <p x=\"0.39696701851\" y=\"-0.744106119434\" z=\"-0.537329758375\"/>\n <p x=\"-0.819050759096\" y=\"0.434555640618\" z=\"-0.374589440895\"/>\n <p x=\"0.862933616269\" y=\"0.195755562317\" z=\"-0.465859779045\"/>\n <p x=\"-0.396967018509\" y=\"0.744106119434\" z=\"0.537329758374\"/>\n <p x=\"-0.0403893443551\" y=\"0.095656358569\" z=\"-0.994594672179\"/>\n <p x=\"-0.862933616269\" y=\"-0.195755562318\" z=\"0.465859779047\"/>\n <p x=\"0.819050759093\" y=\"-0.434555640615\" z=\"0.374589440895\"/>\n <p x=\"0.642556494013\" y=\"0.596519554528\" z=\"0.480921587232\"/>\n <p x=\"-0.111393298784\" y=\"-0.92420859127\" z=\"0.365280731504\"/>\n <p x=\"0.0403893443556\" y=\"-0.0956563585682\" z=\"0.994594672178\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>1</v><v>8</v><v>6</v><v>9</v></f>\n <f><v>3</v><v>2</v><v>7</v><v>6</v><v>10</v></f>\n <f><v>4</v><v>3</v><v>9</v><v>6</v><v>5</v></f>\n <f><v>0</v><v>4</v><v>10</v><v>6</v><v>8</v></f>\n <f><v>9</v><v>7</v><v>8</v><v>5</v><v>10</v></f>\n <f><v>7</v><v>9</v><v>3</v><v>11</v><v>1</v></f>\n <f><v>8</v><v>7</v><v>2</v><v>11</v><v>0</v></f>\n <f><v>5</v><v>8</v><v>1</v><v>11</v><v>4</v></f>\n <f><v>10</v><v>5</v><v>0</v><v>11</v><v>3</v></f>\n <f><v>9</v><v>10</v><v>4</v><v>11</v><v>2</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/snub_disphenoid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.308110827909\" y=\"0.0580549463976\" z=\"0.656407084915\"/>\n <p x=\"0.977687161474\" y=\"0.0995482570893\" z=\"-0.183752546973\"/>\n <p x=\"0.0861085292516\" y=\"0.700277179991\" z=\"-0.177116099143\"/>\n <p x=\"0.250014154663\" y=\"-0.00932494336038\" z=\"-0.968197277366\"/>\n <p x=\"-0.630172998973\" y=\"-0.0818706887134\" z=\"-0.354419994116\"/>\n <p x=\"0.235720694228\" y=\"-0.676909542604\" z=\"-0.125154208791\"/>\n <p x=\"-0.555930857952\" y=\"-0.579145561421\" z=\"0.596264454637\"/>\n <p x=\"-0.671537510601\" y=\"0.489370352621\" z=\"0.555968586839\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>2</v><v>1</v><v>3</v></f>\n <f><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>1</v><v>0</v></f>\n <f><v>1</v><v>5</v><v>3</v></f>\n <f><v>3</v><v>5</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>4</v></f>\n <f><v>4</v><v>6</v><v>7</v></f>\n <f><v>4</v><v>7</v><v>2</v></f>\n <f><v>0</v><v>6</v><v>5</v></f>\n <f><v>6</v><v>0</v><v>7</v></f>\n <f><v>7</v><v>0</v><v>2</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/snub_square_antiprism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.608912975812\" y=\"0.478852301571\" z=\"-0.189773385029\"/>\n <p x=\"0.473179007146\" y=\"-0.207333518773\" z=\"-0.607620835813\"/>\n <p x=\"-0.296318859641\" y=\"0.0255054111192\" z=\"-0.74002267929\"/>\n <p x=\"-0.160584890974\" y=\"0.711691231463\" z=\"-0.322175228506\"/>\n <p x=\"0.207531517288\" y=\"0.901635017968\" z=\"0.379452757245\"/>\n <p x=\"0.733708109596\" y=\"0.319760316694\" z=\"0.599520605796\"/>\n <p x=\"-0.586543409648\" y=\"0.7192482505\" z=\"0.372355419552\"/>\n <p x=\"0.976417281956\" y=\"-0.213329942506\" z=\"0.0331486669279\"/>\n <p x=\"0.500825520546\" y=\"-0.857550119301\" z=\"-0.117392598283\"/>\n <p x=\"-0.121814361838\" y=\"-0.763333194826\" z=\"-0.634415849932\"/>\n <p x=\"-0.819425998698\" y=\"-0.458062185494\" z=\"-0.344557784527\"/>\n <p x=\"-0.890700126507\" y=\"0.351631765648\" z=\"-0.288111759615\"/>\n <p x=\"-0.700414136267\" y=\"-0.0875375090247\" z=\"0.371276420837\"/>\n <p x=\"-0.252274863067\" y=\"-0.737385732186\" z=\"0.169435738399\"/>\n <p x=\"0.387820753748\" y=\"-0.416820158007\" z=\"0.5585199149\"/>\n <p x=\"-0.0603185194528\" y=\"0.233028065155\" z=\"0.760360597339\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>0</v><v>4</v><v>5</v></f>\n <f><v>4</v><v>0</v><v>3</v></f>\n <f><v>4</v><v>3</v><v>6</v></f>\n <f><v>1</v><v>7</v><v>8</v></f>\n <f><v>7</v><v>1</v><v>0</v></f>\n <f><v>7</v><v>0</v><v>5</v></f>\n <f><v>2</v><v>9</v><v>10</v></f>\n <f><v>9</v><v>2</v><v>1</v></f>\n <f><v>9</v><v>1</v><v>8</v></f>\n <f><v>3</v><v>11</v><v>6</v></f>\n <f><v>11</v><v>3</v><v>2</v></f>\n <f><v>11</v><v>2</v><v>10</v></f>\n <f><v>12</v><v>13</v><v>14</v><v>15</v></f>\n <f><v>12</v><v>6</v><v>11</v></f>\n <f><v>6</v><v>12</v><v>15</v></f>\n <f><v>6</v><v>15</v><v>4</v></f>\n <f><v>13</v><v>10</v><v>9</v></f>\n <f><v>10</v><v>13</v><v>12</v></f>\n <f><v>10</v><v>12</v><v>11</v></f>\n <f><v>14</v><v>8</v><v>7</v></f>\n <f><v>8</v><v>14</v><v>13</v></f>\n <f><v>8</v><v>13</v><v>9</v></f>\n <f><v>15</v><v>5</v><v>4</v></f>\n <f><v>5</v><v>15</v><v>14</v></f>\n <f><v>5</v><v>14</v><v>7</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/sphenocorona.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.578877313275\" y=\"0.745743556472\" z=\"0.32979933923\"/>\n <p x=\"-0.994973149825\" y=\"-0.0996795056375\" z=\"-0.00961391093347\"/>\n <p x=\"-0.286894396359\" y=\"-0.634581595399\" z=\"0.454689795621\"/>\n <p x=\"0.129200702877\" y=\"0.210839968638\" z=\"0.794102444352\"/>\n <p x=\"0.545417983462\" y=\"-0.835652507618\" z=\"-0.064829491144\"/>\n <p x=\"0.961513082699\" y=\"0.00976905641885\" z=\"0.274583157586\"/>\n <p x=\"0.528933026489\" y=\"-0.00798665676286\" z=\"-0.628540650538\"/>\n <p x=\"-0.293497453663\" y=\"-0.573404074173\" z=\"-0.544955225009\"/>\n <p x=\"-0.374280411527\" y=\"0.423554856758\" z=\"-0.596164776112\"/>\n <p x=\"0.363457929122\" y=\"0.761396901305\" z=\"-0.00907068305256\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v><v>5</v></f>\n <f><v>6</v><v>7</v><v>8</v></f>\n <f><v>8</v><v>0</v><v>9</v></f>\n <f><v>8</v><v>7</v><v>1</v></f>\n <f><v>8</v><v>1</v><v>0</v></f>\n <f><v>0</v><v>3</v><v>9</v></f>\n <f><v>9</v><v>3</v><v>5</v></f>\n <f><v>7</v><v>2</v><v>1</v></f>\n <f><v>2</v><v>7</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>9</v></f>\n <f><v>5</v><v>4</v><v>6</v></f>\n <f><v>6</v><v>4</v><v>7</v></f>\n <f><v>9</v><v>6</v><v>8</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/sphenomegacorona.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.171436985421\" y=\"-0.385198187289\" z=\"0.42159663188\"/>\n <p x=\"-0.00156226187172\" y=\"-0.754214321931\" z=\"-0.221369376363\"/>\n <p x=\"0.411584676198\" y=\"-0.254000653415\" z=\"-0.619619082375\"/>\n <p x=\"0.584583923491\" y=\"0.115015481227\" z=\"0.0233469258681\"/>\n <p x=\"0.125971837879\" y=\"0.358225313587\" z=\"0.580625858292\"/>\n <p x=\"-0.466224207179\" y=\"-0.798914708948\" z=\"0.379960888076\"/>\n <p x=\"-0.494303618516\" y=\"-0.0804283716381\" z=\"0.629950676312\"/>\n <p x=\"0.593995069082\" y=\"0.484735548968\" z=\"-0.642029053449\"/>\n <p x=\"0.211964678994\" y=\"0.774679154281\" z=\"-0.0508510335171\"/>\n <p x=\"-0.126315263333\" y=\"0.274247185484\" z=\"-0.51414486421\"/>\n <p x=\"-0.539462201403\" y=\"-0.225966483032\" z=\"-0.115895158198\"/>\n <p x=\"-0.471669618765\" y=\"0.491820042706\" z=\"0.128427587683\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>4</v><v>0</v><v>3</v></f>\n <f><v>5</v><v>0</v><v>6</v></f>\n <f><v>5</v><v>1</v><v>0</v></f>\n <f><v>3</v><v>7</v><v>8</v></f>\n <f><v>3</v><v>2</v><v>7</v></f>\n <f><v>6</v><v>0</v><v>4</v></f>\n <f><v>4</v><v>3</v><v>8</v></f>\n <f><v>9</v><v>2</v><v>1</v><v>10</v></f>\n <f><v>11</v><v>9</v><v>10</v></f>\n <f><v>7</v><v>9</v><v>8</v></f>\n <f><v>7</v><v>2</v><v>9</v></f>\n <f><v>10</v><v>5</v><v>6</v></f>\n <f><v>10</v><v>1</v><v>5</v></f>\n <f><v>8</v><v>11</v><v>4</v></f>\n <f><v>8</v><v>9</v><v>11</v></f>\n <f><v>11</v><v>6</v><v>4</v></f>\n <f><v>11</v><v>10</v><v>6</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/square_antiprism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-4.91234562787E-14\" y=\"-0.859532503769\" z=\"-0.511081084529\"/>\n <p x=\"-0.859532503769\" y=\"4.34283742596E-13\" z=\"-0.51108108453\"/>\n <p x=\"1.23888277098E-13\" y=\"0.859532503769\" z=\"-0.51108108453\"/>\n <p x=\"0.859532503769\" y=\"3.76523195103E-13\" z=\"-0.51108108453\"/>\n <p x=\"-0.607781262065\" y=\"-0.607781262065\" z=\"0.51108108453\"/>\n <p x=\"0.607781262065\" y=\"-0.607781262065\" z=\"0.51108108453\"/>\n <p x=\"0.607781262065\" y=\"0.607781262064\" z=\"0.51108108453\"/>\n <p x=\"-0.607781262065\" y=\"0.607781262064\" z=\"0.51108108453\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>4</v><v>5</v><v>6</v><v>7</v></f>\n <f><v>6</v><v>2</v><v>7</v></f>\n <f><v>7</v><v>2</v><v>1</v></f>\n <f><v>7</v><v>1</v><v>4</v></f>\n <f><v>4</v><v>1</v><v>0</v></f>\n <f><v>4</v><v>0</v><v>5</v></f>\n <f><v>5</v><v>0</v><v>3</v></f>\n <f><v>5</v><v>3</v><v>6</v></f>\n <f><v>6</v><v>3</v><v>2</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/square_cupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.163707268674\" y=\"0.90110715559\" z=\"-0.401504451193\"/>\n <p x=\"0.378509296162\" y=\"0.917649379127\" z=\"0.121038546367\"/>\n <p x=\"0.77116193569\" y=\"0.396877174093\" z=\"0.497792906364\"/>\n <p x=\"0.784240058976\" y=\"-0.35614816471\" z=\"0.508061034395\"/>\n <p x=\"0.41008267877\" y=\"-0.900314606621\" z=\"0.14582800032\"/>\n <p x=\"-0.132133886066\" y=\"-0.916856830158\" z=\"-0.37671499724\"/>\n <p x=\"-0.524786525594\" y=\"-0.396084625124\" z=\"-0.753469357237\"/>\n <p x=\"-0.53786464888\" y=\"0.356940713679\" z=\"-0.763737485268\"/>\n <p x=\"-0.524022754157\" y=\"0.367449008664\" z=\"-0.0107291119227\"/>\n <p x=\"-0.510944630871\" y=\"-0.385576330139\" z=\"-0.000460983891824\"/>\n <p x=\"0.0312719339653\" y=\"-0.369034106602\" z=\"0.522082013668\"/>\n <p x=\"0.0181938106788\" y=\"0.383991232201\" z=\"0.511813885637\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v></f>\n <f><v>8</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>9</v><v>8</v><v>7</v><v>6</v></f>\n <f><v>9</v><v>6</v><v>5</v></f>\n <f><v>10</v><v>9</v><v>5</v><v>4</v></f>\n <f><v>10</v><v>4</v><v>3</v></f>\n <f><v>11</v><v>10</v><v>3</v><v>2</v></f>\n <f><v>11</v><v>2</v><v>1</v></f>\n <f><v>8</v><v>11</v><v>1</v><v>0</v></f>\n <f><v>8</v><v>0</v><v>7</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/square_gyrobicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.0734119261441\" y=\"-0.381374887562\" z=\"-0.65950763594\"/>\n <p x=\"-0.434320783594\" y=\"0.286382798906\" z=\"-0.561370454385\"/>\n <p x=\"0.231310667027\" y=\"0.6201265944\" z=\"-0.384349866482\"/>\n <p x=\"0.592219524476\" y=\"-0.0476310920686\" z=\"-0.482487048038\"/>\n <p x=\"-0.62303380909\" y=\"-0.736743241953\" z=\"-0.262751342845\"/>\n <p x=\"-0.98394266654\" y=\"-0.0689855554848\" z=\"-0.164614161289\"/>\n <p x=\"-0.768471254528\" y=\"0.639182933779\" z=\"0.0299517633912\"/>\n <p x=\"-0.102839803907\" y=\"0.972926729272\" z=\"0.206972351294\"/>\n <p x=\"0.62303380909\" y=\"0.736743241953\" z=\"0.262751342845\"/>\n <p x=\"0.98394266654\" y=\"0.0689855554848\" z=\"0.164614161289\"/>\n <p x=\"0.768471254528\" y=\"-0.639182933779\" z=\"-0.0299517633912\"/>\n <p x=\"0.102839803907\" y=\"-0.972926729272\" z=\"-0.206972351294\"/>\n <p x=\"-0.334150470934\" y=\"0.352800134872\" z=\"0.591322217776\"/>\n <p x=\"-0.549621882946\" y=\"-0.355368354391\" z=\"0.396756293096\"/>\n <p x=\"0.176251730052\" y=\"-0.59155184171\" z=\"0.452535284647\"/>\n <p x=\"0.391723142063\" y=\"0.116616647553\" z=\"0.647101209327\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>1</v><v>0</v><v>4</v><v>5</v></f>\n <f><v>1</v><v>5</v><v>6</v></f>\n <f><v>2</v><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>7</v><v>8</v></f>\n <f><v>3</v><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>9</v><v>10</v></f>\n <f><v>0</v><v>3</v><v>10</v><v>11</v></f>\n <f><v>0</v><v>11</v><v>4</v></f>\n <f><v>12</v><v>13</v><v>14</v><v>15</v></f>\n <f><v>13</v><v>12</v><v>6</v><v>5</v></f>\n <f><v>13</v><v>5</v><v>4</v></f>\n <f><v>14</v><v>13</v><v>4</v><v>11</v></f>\n <f><v>14</v><v>11</v><v>10</v></f>\n <f><v>15</v><v>14</v><v>10</v><v>9</v></f>\n <f><v>15</v><v>9</v><v>8</v></f>\n <f><v>12</v><v>15</v><v>8</v><v>7</v></f>\n <f><v>12</v><v>7</v><v>6</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/square_orthobicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.365551147904\" y=\"-0.399323187975\" z=\"-0.541017363343\"/>\n <p x=\"-0.399127075001\" y=\"0.365306787141\" z=\"-0.541327042459\"/>\n <p x=\"0.365502962066\" y=\"0.398882697638\" z=\"-0.541374746246\"/>\n <p x=\"0.399078889163\" y=\"-0.365747277478\" z=\"-0.54106506713\"/>\n <p x=\"-0.906202139294\" y=\"-0.422844696803\" z=\"0.000212423123298\"/>\n <p x=\"-0.939778066391\" y=\"0.341785278312\" z=\"-9.72559926017E-05\"/>\n <p x=\"-0.422844747817\" y=\"0.906202072812\" z=\"-0.000349963867058\"/>\n <p x=\"0.34178528925\" y=\"0.939777983309\" z=\"-0.000397667654532\"/>\n <p x=\"0.906202139294\" y=\"0.422844696803\" z=\"-0.000212423123298\"/>\n <p x=\"0.939778066391\" y=\"-0.341785278312\" z=\"9.72559926017E-05\"/>\n <p x=\"0.422844747817\" y=\"-0.906202072812\" z=\"0.000349963867058\"/>\n <p x=\"-0.34178528925\" y=\"-0.939777983309\" z=\"0.000397667654532\"/>\n <p x=\"-0.399078889163\" y=\"0.365747277478\" z=\"0.54106506713\"/>\n <p x=\"-0.365502962066\" y=\"-0.398882697638\" z=\"0.541374746246\"/>\n <p x=\"0.399127075001\" y=\"-0.365306787141\" z=\"0.541327042459\"/>\n <p x=\"0.365551147904\" y=\"0.399323187975\" z=\"0.541017363343\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>1</v><v>0</v><v>4</v><v>5</v></f>\n <f><v>1</v><v>5</v><v>6</v></f>\n <f><v>2</v><v>1</v><v>6</v><v>7</v></f>\n <f><v>2</v><v>7</v><v>8</v></f>\n <f><v>3</v><v>2</v><v>8</v><v>9</v></f>\n <f><v>3</v><v>9</v><v>10</v></f>\n <f><v>0</v><v>3</v><v>10</v><v>11</v></f>\n <f><v>0</v><v>11</v><v>4</v></f>\n <f><v>12</v><v>13</v><v>14</v><v>15</v></f>\n <f><v>13</v><v>12</v><v>5</v><v>4</v></f>\n <f><v>13</v><v>4</v><v>11</v></f>\n <f><v>14</v><v>13</v><v>11</v><v>10</v></f>\n <f><v>14</v><v>10</v><v>9</v></f>\n <f><v>15</v><v>14</v><v>9</v><v>8</v></f>\n <f><v>15</v><v>8</v><v>7</v></f>\n <f><v>12</v><v>15</v><v>7</v><v>6</v></f>\n <f><v>12</v><v>6</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/square_pyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.746158448806\" y=\"-0.35217925413\" z=\"-0.564993223178\"/>\n <p x=\"-0.629529352242\" y=\"-0.280668904967\" z=\"-0.724512084406\"/>\n <p x=\"-0.701039701405\" y=\"0.643831422075\" z=\"0.306634044103\"/>\n <p x=\"0.674648099643\" y=\"0.572321072912\" z=\"0.466152905331\"/>\n <p x=\"-0.0902374948012\" y=\"-0.58330433589\" z=\"0.516718358149\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>1</v><v>0</v><v>4</v></f>\n <f><v>2</v><v>1</v><v>4</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>0</v><v>3</v><v>4</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/tetrahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.0907218423253\" y=\"-0.366647960615\" z=\"0.925925925926\"/>\n <p x=\"0.544331053952\" y=\"-0.628539361055\" z=\"-0.555555555556\"/>\n <p x=\"0.453609211627\" y=\"0.890430761494\" z=\"0.037037037037\"/>\n <p x=\"-0.907218423253\" y=\"0.104756560176\" z=\"-0.407407407407\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>3</v><v>0</v><v>2</v></f>\n <f><v>0</v><v>3</v><v>1</v></f>\n <f><v>2</v><v>1</v><v>3</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/tetrahemihexahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.599781689376\" y=\"0.521214269249\" z=\"0.607122401679\"/>\n <p x=\"0.0957666994567\" y=\"-0.80005303715\" z=\"0.592236335438\"/>\n <p x=\"0.794412150186\" y=\"-0.297070401205\" z=\"-0.529772132486\"/>\n <p x=\"-0.794412150185\" y=\"0.297070401206\" z=\"0.529772132486\"/>\n <p x=\"9.20074180786E-13\" y=\"-1.33693372857E-12\" z=\"1.72647366756E-12\"/>\n <p x=\"-0.599781689373\" y=\"-0.521214269247\" z=\"-0.607122401679\"/>\n <p x=\"-0.0957666994619\" y=\"0.800053037149\" z=\"-0.592236335441\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>3</v><v>4</v><v>0</v></f>\n <f><v>0</v><v>4</v><v>1</v></f>\n <f><v>1</v><v>4</v><v>3</v></f>\n <f><v>5</v><v>1</v><v>3</v></f>\n <f><v>2</v><v>4</v><v>5</v></f>\n <f><v>5</v><v>4</v><v>1</v></f>\n <f><v>1</v><v>4</v><v>2</v></f>\n <f><v>0</v><v>6</v><v>3</v></f>\n <f><v>2</v><v>4</v><v>0</v></f>\n <f><v>0</v><v>4</v><v>6</v></f>\n <f><v>6</v><v>4</v><v>2</v></f>\n <f><v>5</v><v>6</v><v>2</v></f>\n <f><v>3</v><v>4</v><v>5</v></f>\n <f><v>5</v><v>4</v><v>6</v></f>\n <f><v>6</v><v>4</v><v>3</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/tetrakis_hexahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.20358354633\" y=\"-0.627565284811\" z=\"0.560995145222\"/>\n <p x=\"-0.859176015473\" y=\"-0.0642261068866\" z=\"0.507633314142\"/>\n <p x=\"-0.461974354029\" y=\"-0.855601655709\" z=\"-0.233506965565\"/>\n <p x=\"0.587731287034\" y=\"-0.772527606195\" z=\"0.240360212819\"/>\n <p x=\"0.190529625591\" y=\"0.0188479426267\" z=\"0.981500492526\"/>\n <p x=\"0.297901246085\" y=\"-0.593531661615\" z=\"-0.555855209785\"/>\n <p x=\"-0.19052962559\" y=\"-0.0188479426322\" z=\"-0.981500492526\"/>\n <p x=\"0.859176015474\" y=\"0.0642261068853\" z=\"-0.50763331414\"/>\n <p x=\"0.787279230799\" y=\"0.0623055371364\" z=\"0.355400383786\"/>\n <p x=\"0.461974354029\" y=\"0.855601655708\" z=\"0.233506965567\"/>\n <p x=\"-0.297901246083\" y=\"0.593531661619\" z=\"0.555855209778\"/>\n <p x=\"-0.587731287037\" y=\"0.772527606194\" z=\"-0.240360212818\"/>\n <p x=\"-0.787279230798\" y=\"-0.0623055371325\" z=\"-0.35540038379\"/>\n <p x=\"0.203583546329\" y=\"0.627565284812\" z=\"-0.560995145217\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>0</v><v>2</v><v>3</v></f>\n <f><v>0</v><v>3</v><v>4</v></f>\n <f><v>0</v><v>4</v><v>1</v></f>\n <f><v>5</v><v>2</v><v>6</v></f>\n <f><v>5</v><v>6</v><v>7</v></f>\n <f><v>5</v><v>7</v><v>3</v></f>\n <f><v>5</v><v>3</v><v>2</v></f>\n <f><v>8</v><v>4</v><v>3</v></f>\n <f><v>8</v><v>3</v><v>7</v></f>\n <f><v>8</v><v>7</v><v>9</v></f>\n <f><v>8</v><v>9</v><v>4</v></f>\n <f><v>10</v><v>11</v><v>1</v></f>\n <f><v>10</v><v>1</v><v>4</v></f>\n <f><v>10</v><v>4</v><v>9</v></f>\n <f><v>10</v><v>9</v><v>11</v></f>\n <f><v>12</v><v>11</v><v>6</v></f>\n <f><v>12</v><v>6</v><v>2</v></f>\n <f><v>12</v><v>2</v><v>1</v></f>\n <f><v>12</v><v>1</v><v>11</v></f>\n <f><v>13</v><v>9</v><v>7</v></f>\n <f><v>13</v><v>7</v><v>6</v></f>\n <f><v>13</v><v>6</v><v>11</v></f>\n <f><v>13</v><v>11</v><v>9</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/trapezoidal_hexecontahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.460361077342\" y=\"-0.255090078669\" z=\"-0.850292144046\"/>\n <p x=\"0.0248550737926\" y=\"-0.0518918107779\" z=\"-0.973059477256\"/>\n <p x=\"0.158817894065\" y=\"-0.3602261002\" z=\"-0.872429702426\"/>\n <p x=\"-0.0619772686007\" y=\"-0.608322809448\" z=\"-0.759116235287\"/>\n <p x=\"-0.272519925488\" y=\"-0.755788541251\" z=\"-0.52022699232\"/>\n <p x=\"-0.590685985659\" y=\"-0.616379581168\" z=\"-0.470448253539\"/>\n <p x=\"-0.811138616092\" y=\"-0.375006863083\" z=\"-0.342846249125\"/>\n <p x=\"-0.830613600556\" y=\"-0.0649279412608\" z=\"-0.505984871324\"/>\n <p x=\"-0.712685454308\" y=\"0.255891597371\" z=\"-0.585421630988\"/>\n <p x=\"-0.450188304344\" y=\"0.283944687074\" z=\"-0.816615690708\"/>\n <p x=\"-0.113219363422\" y=\"0.265026611212\" z=\"-0.912722205008\"/>\n <p x=\"0.503742029331\" y=\"0.164520395767\" z=\"-0.848043045641\"/>\n <p x=\"0.490404658534\" y=\"-0.367907400651\" z=\"-0.757827616566\"/>\n <p x=\"0.102193622791\" y=\"0.524360095872\" z=\"-0.815327071989\"/>\n <p x=\"0.300701367261\" y=\"0.696952021344\" z=\"-0.583057561556\"/>\n <p x=\"0.615541059451\" y=\"0.564487770388\" z=\"-0.502611223718\"/>\n <p x=\"0.828555704957\" y=\"0.338643893998\" z=\"-0.339021104435\"/>\n <p x=\"0.855468674346\" y=\"0.0130361304793\" z=\"-0.467074605933\"/>\n <p x=\"0.740866896081\" y=\"-0.314728117279\" z=\"-0.517862922887\"/>\n <p x=\"0.352188680191\" y=\"-0.806649782174\" z=\"-0.474635926217\"/>\n <p x=\"-0.125136400918\" y=\"-0.932395171038\" z=\"-0.25521639285\"/>\n <p x=\"0.768636331954\" y=\"-0.54339486819\" z=\"-0.253131363961\"/>\n <p x=\"0.669255142892\" y=\"-0.682171258464\" z=\"0.0534741082562\"/>\n <p x=\"0.38821103574\" y=\"-0.892267496522\" z=\"0.0574994554213\"/>\n <p x=\"0.0429476434117\" y=\"-0.95476159157\" z=\"0.0520130329969\"/>\n <p x=\"-0.570596247414\" y=\"-0.820711716975\" z=\"0.0291924655676\"/>\n <p x=\"-0.893772732873\" y=\"-0.389000302853\" z=\"-0.00208502888838\"/>\n <p x=\"-0.140497681317\" y=\"-0.90032426824\" z=\"0.346167437171\"/>\n <p x=\"-0.300701367265\" y=\"-0.696952021343\" z=\"0.583057561558\"/>\n <p x=\"-0.615541059453\" y=\"-0.564487770387\" z=\"0.502611223718\"/>\n <p x=\"-0.82855570496\" y=\"-0.338643893999\" z=\"0.339021104433\"/>\n <p x=\"-0.989355347839\" y=\"0.141767707311\" z=\"-0.0328315832343\"/>\n <p x=\"-0.753275051559\" y=\"0.511323965387\" z=\"-0.348252466057\"/>\n <p x=\"-0.855468674348\" y=\"-0.0130361304794\" z=\"0.467074605933\"/>\n <p x=\"-0.740866896079\" y=\"0.314728117279\" z=\"0.517862922889\"/>\n <p x=\"-0.768636331954\" y=\"0.543394868187\" z=\"0.253131363964\"/>\n <p x=\"-0.669255142892\" y=\"0.682171258464\" z=\"-0.0534741082551\"/>\n <p x=\"-0.325377777398\" y=\"0.750674639791\" z=\"-0.574992945301\"/>\n <p x=\"-0.388211035742\" y=\"0.892267496523\" z=\"-0.0574994554209\"/>\n <p x=\"-0.042947643411\" y=\"0.954761591572\" z=\"-0.0520130329955\"/>\n <p x=\"0.140497681316\" y=\"0.900324268241\" z=\"-0.346167437169\"/>\n <p x=\"-0.352188680189\" y=\"0.806649782177\" z=\"0.474635926216\"/>\n <p x=\"-0.49040465853\" y=\"0.367907400654\" z=\"0.757827616568\"/>\n <p x=\"-0.158817894062\" y=\"0.360226100203\" z=\"0.872429702427\"/>\n <p x=\"0.0619772686032\" y=\"0.608322809449\" z=\"0.759116235286\"/>\n <p x=\"0.272519925491\" y=\"0.755788541252\" z=\"0.520226992318\"/>\n <p x=\"0.125136400921\" y=\"0.932395171041\" z=\"0.25521639285\"/>\n <p x=\"-0.503742029332\" y=\"-0.164520395764\" z=\"0.848043045642\"/>\n <p x=\"-0.102193622792\" y=\"-0.524360095869\" z=\"0.815327071993\"/>\n <p x=\"0.113219363422\" y=\"-0.265026611211\" z=\"0.912722205008\"/>\n <p x=\"-0.0248550737928\" y=\"0.051891810782\" z=\"0.973059477256\"/>\n <p x=\"0.325377777394\" y=\"-0.750674639793\" z=\"0.574992945302\"/>\n <p x=\"0.753275051556\" y=\"-0.511323965392\" z=\"0.348252466058\"/>\n <p x=\"0.712685454307\" y=\"-0.255891597372\" z=\"0.585421630989\"/>\n <p x=\"0.450188304343\" y=\"-0.283944687074\" z=\"0.816615690708\"/>\n <p x=\"0.989355347838\" y=\"-0.141767707314\" z=\"0.0328315832337\"/>\n <p x=\"0.893772732872\" y=\"0.389000302848\" z=\"0.00208502888566\"/>\n <p x=\"0.811138616092\" y=\"0.375006863078\" z=\"0.342846249125\"/>\n <p x=\"0.830613600557\" y=\"0.064927941257\" z=\"0.505984871322\"/>\n <p x=\"0.570596247414\" y=\"0.820711716975\" z=\"-0.0291924655739\"/>\n <p x=\"0.590685985661\" y=\"0.616379581167\" z=\"0.470448253536\"/>\n <p x=\"0.460361077343\" y=\"0.255090078669\" z=\"0.850292144045\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>0</v><v>3</v><v>4</v><v>5</v></f>\n <f><v>0</v><v>5</v><v>6</v><v>7</v></f>\n <f><v>0</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>0</v><v>9</v><v>10</v><v>1</v></f>\n <f><v>11</v><v>12</v><v>2</v><v>1</v></f>\n <f><v>11</v><v>1</v><v>10</v><v>13</v></f>\n <f><v>11</v><v>13</v><v>14</v><v>15</v></f>\n <f><v>11</v><v>15</v><v>16</v><v>17</v></f>\n <f><v>11</v><v>17</v><v>18</v><v>12</v></f>\n <f><v>19</v><v>20</v><v>4</v><v>3</v></f>\n <f><v>19</v><v>3</v><v>2</v><v>12</v></f>\n <f><v>19</v><v>12</v><v>18</v><v>21</v></f>\n <f><v>19</v><v>21</v><v>22</v><v>23</v></f>\n <f><v>19</v><v>23</v><v>24</v><v>20</v></f>\n <f><v>25</v><v>26</v><v>6</v><v>5</v></f>\n <f><v>25</v><v>5</v><v>4</v><v>20</v></f>\n <f><v>25</v><v>20</v><v>24</v><v>27</v></f>\n <f><v>25</v><v>27</v><v>28</v><v>29</v></f>\n <f><v>25</v><v>29</v><v>30</v><v>26</v></f>\n <f><v>31</v><v>32</v><v>8</v><v>7</v></f>\n <f><v>31</v><v>7</v><v>6</v><v>26</v></f>\n <f><v>31</v><v>26</v><v>30</v><v>33</v></f>\n <f><v>31</v><v>33</v><v>34</v><v>35</v></f>\n <f><v>31</v><v>35</v><v>36</v><v>32</v></f>\n <f><v>37</v><v>13</v><v>10</v><v>9</v></f>\n <f><v>37</v><v>9</v><v>8</v><v>32</v></f>\n <f><v>37</v><v>32</v><v>36</v><v>38</v></f>\n <f><v>37</v><v>38</v><v>39</v><v>40</v></f>\n <f><v>37</v><v>40</v><v>14</v><v>13</v></f>\n <f><v>41</v><v>42</v><v>43</v><v>44</v></f>\n <f><v>41</v><v>44</v><v>45</v><v>46</v></f>\n <f><v>41</v><v>46</v><v>39</v><v>38</v></f>\n <f><v>41</v><v>38</v><v>36</v><v>35</v></f>\n <f><v>41</v><v>35</v><v>34</v><v>42</v></f>\n <f><v>47</v><v>48</v><v>49</v><v>50</v></f>\n <f><v>47</v><v>50</v><v>43</v><v>42</v></f>\n <f><v>47</v><v>42</v><v>34</v><v>33</v></f>\n <f><v>47</v><v>33</v><v>30</v><v>29</v></f>\n <f><v>47</v><v>29</v><v>28</v><v>48</v></f>\n <f><v>51</v><v>52</v><v>53</v><v>54</v></f>\n <f><v>51</v><v>54</v><v>49</v><v>48</v></f>\n <f><v>51</v><v>48</v><v>28</v><v>27</v></f>\n <f><v>51</v><v>27</v><v>24</v><v>23</v></f>\n <f><v>51</v><v>23</v><v>22</v><v>52</v></f>\n <f><v>55</v><v>56</v><v>57</v><v>58</v></f>\n <f><v>55</v><v>58</v><v>53</v><v>52</v></f>\n <f><v>55</v><v>52</v><v>22</v><v>21</v></f>\n <f><v>55</v><v>21</v><v>18</v><v>17</v></f>\n <f><v>55</v><v>17</v><v>16</v><v>56</v></f>\n <f><v>59</v><v>46</v><v>45</v><v>60</v></f>\n <f><v>59</v><v>60</v><v>57</v><v>56</v></f>\n <f><v>59</v><v>56</v><v>16</v><v>15</v></f>\n <f><v>59</v><v>15</v><v>14</v><v>40</v></f>\n <f><v>59</v><v>40</v><v>39</v><v>46</v></f>\n <f><v>61</v><v>44</v><v>43</v><v>50</v></f>\n <f><v>61</v><v>50</v><v>49</v><v>54</v></f>\n <f><v>61</v><v>54</v><v>53</v><v>58</v></f>\n <f><v>61</v><v>58</v><v>57</v><v>60</v></f>\n <f><v>61</v><v>60</v><v>45</v><v>44</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/trapezoidal_icositetrahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.568965984636\" y=\"0.675124506255\" z=\"-0.469557887136\"/>\n <p x=\"-0.512151564668\" y=\"0.0185191877532\" z=\"-0.858695414264\"/>\n <p x=\"-0.837796993454\" y=\"-0.177558737402\" z=\"-0.404879631441\"/>\n <p x=\"-0.973350192911\" y=\"0.229301441242\" z=\"0.00320171818413\"/>\n <p x=\"-0.155325704115\" y=\"-0.648934419777\" z=\"-0.744820813662\"/>\n <p x=\"-0.680862345582\" y=\"-0.706949604045\" z=\"-0.191438563776\"/>\n <p x=\"-0.807559059118\" y=\"-0.350843298182\" z=\"0.474085800414\"/>\n <p x=\"0.807559059119\" y=\"0.350843298178\" z=\"-0.474085800411\"/>\n <p x=\"0.461198628245\" y=\"-0.210782253491\" z=\"-0.861897132443\"/>\n <p x=\"0.0455404370496\" y=\"0.206206405255\" z=\"-0.923451899371\"/>\n <p x=\"0.168710780909\" y=\"0.725468791794\" z=\"-0.667256850491\"/>\n <p x=\"0.568965984634\" y=\"-0.675124506257\" z=\"0.469557887139\"/>\n <p x=\"0.292487847329\" y=\"-0.936251045289\" z=\"-0.194640281954\"/>\n <p x=\"0.66789609666\" y=\"-0.53226930113\" z=\"-0.40983242744\"/>\n <p x=\"0.973350192913\" y=\"-0.229301441244\" z=\"-0.00320171817884\"/>\n <p x=\"-0.215441333843\" y=\"-0.916034443783\" z=\"0.108739840486\"/>\n <p x=\"-0.16871078091\" y=\"-0.725468791796\" z=\"0.667256850491\"/>\n <p x=\"0.512151564669\" y=\"-0.0185191877431\" z=\"0.858695414264\"/>\n <p x=\"-0.045540437046\" y=\"-0.20620640525\" z=\"0.923451899372\"/>\n <p x=\"0.15532570411\" y=\"0.64893441978\" z=\"0.744820813658\"/>\n <p x=\"-0.46119862824\" y=\"0.210782253495\" z=\"0.861897132445\"/>\n <p x=\"0.680862345582\" y=\"0.706949604043\" z=\"0.191438563771\"/>\n <p x=\"0.837796993456\" y=\"0.177558737401\" z=\"0.404879631444\"/>\n <p x=\"-0.292487847335\" y=\"0.936251045287\" z=\"0.194640281951\"/>\n <p x=\"0.215441333844\" y=\"0.916034443778\" z=\"-0.108739840497\"/>\n <p x=\"-0.66789609666\" y=\"0.532269301129\" z=\"0.409832427446\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>4</v><v>5</v><v>2</v><v>1</v></f>\n <f><v>6</v><v>3</v><v>2</v><v>5</v></f>\n <f><v>7</v><v>8</v><v>9</v><v>10</v></f>\n <f><v>4</v><v>1</v><v>9</v><v>8</v></f>\n <f><v>0</v><v>10</v><v>9</v><v>1</v></f>\n <f><v>11</v><v>12</v><v>13</v><v>14</v></f>\n <f><v>4</v><v>8</v><v>13</v><v>12</v></f>\n <f><v>7</v><v>14</v><v>13</v><v>8</v></f>\n <f><v>6</v><v>5</v><v>15</v><v>16</v></f>\n <f><v>4</v><v>12</v><v>15</v><v>5</v></f>\n <f><v>11</v><v>16</v><v>15</v><v>12</v></f>\n <f><v>11</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>19</v><v>20</v><v>18</v><v>17</v></f>\n <f><v>6</v><v>16</v><v>18</v><v>20</v></f>\n <f><v>7</v><v>21</v><v>22</v><v>14</v></f>\n <f><v>19</v><v>17</v><v>22</v><v>21</v></f>\n <f><v>11</v><v>14</v><v>22</v><v>17</v></f>\n <f><v>0</v><v>23</v><v>24</v><v>10</v></f>\n <f><v>19</v><v>21</v><v>24</v><v>23</v></f>\n <f><v>7</v><v>10</v><v>24</v><v>21</v></f>\n <f><v>6</v><v>20</v><v>25</v><v>3</v></f>\n <f><v>19</v><v>23</v><v>25</v><v>20</v></f>\n <f><v>0</v><v>3</v><v>25</v><v>23</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/triakis_icosahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.315684953119\" y=\"-0.66201308275\" z=\"-0.439085189025\"/>\n <p x=\"-0.173839828987\" y=\"-0.582197334213\" z=\"-0.794245540049\"/>\n <p x=\"0.800828371747\" y=\"-0.300680520337\" z=\"-0.517943185774\"/>\n <p x=\"0.253410822084\" y=\"-0.963380232221\" z=\"0.08764407233\"/>\n <p x=\"0.272899852917\" y=\"-0.166787533752\" z=\"-0.792730536467\"/>\n <p x=\"0.134089407898\" y=\"0.417731710196\" z=\"-0.898621304546\"/>\n <p x=\"-0.310215517059\" y=\"0.0123956097972\" z=\"-0.796446355015\"/>\n <p x=\"-0.825395483044\" y=\"0.199035174713\" z=\"-0.528306062612\"/>\n <p x=\"-0.627815534877\" y=\"-0.372088666292\" z=\"-0.445097509736\"/>\n <p x=\"-0.751650793499\" y=\"-0.654538947966\" z=\"0.081239462222\"/>\n <p x=\"-0.240987770726\" y=\"-0.788896160587\" z=\"-0.224236162895\"/>\n <p x=\"0.627815534878\" y=\"0.372088666292\" z=\"0.445097509733\"/>\n <p x=\"0.173839828987\" y=\"0.582197334213\" z=\"0.794245540052\"/>\n <p x=\"0.825395483045\" y=\"-0.199035174711\" z=\"0.528306062616\"/>\n <p x=\"0.751650793498\" y=\"0.654538947971\" z=\"-0.0812394622267\"/>\n <p x=\"0.240987770733\" y=\"0.788896160591\" z=\"0.224236162894\"/>\n <p x=\"-0.253410822078\" y=\"0.963380232221\" z=\"-0.0876440723311\"/>\n <p x=\"-0.315684953121\" y=\"0.662013082747\" z=\"0.439085189031\"/>\n <p x=\"-0.80082837175\" y=\"0.300680520335\" z=\"0.517943185775\"/>\n <p x=\"-0.272899852922\" y=\"0.166787533748\" z=\"0.792730536466\"/>\n <p x=\"-0.134089407902\" y=\"-0.417731710197\" z=\"0.898621304544\"/>\n <p x=\"0.31021551706\" y=\"-0.0123956097983\" z=\"0.79644635502\"/>\n <p x=\"0.673980932459\" y=\"-0.524622560686\" z=\"0.0351423687827\"/>\n <p x=\"0.852634925523\" y=\"0.0555150006842\" z=\"-0.0254142295294\"/>\n <p x=\"0.604753186123\" y=\"0.276669209697\" z=\"-0.537067823338\"/>\n <p x=\"0.226734455334\" y=\"0.72992369323\" z=\"-0.382775395515\"/>\n <p x=\"-0.338747301872\" y=\"0.56659362616\" z=\"-0.543080144043\"/>\n <p x=\"-0.673980932459\" y=\"0.524622560686\" z=\"-0.0351423687803\"/>\n <p x=\"-0.852634925524\" y=\"-0.0555150006874\" z=\"0.0254142295307\"/>\n <p x=\"-0.604753186126\" y=\"-0.276669209696\" z=\"0.537067823334\"/>\n <p x=\"-0.226734455336\" y=\"-0.729923693228\" z=\"0.382775395511\"/>\n <p x=\"0.338747301878\" y=\"-0.56659362616\" z=\"0.543080144042\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>0</v><v>2</v><v>3</v></f>\n <f><v>0</v><v>3</v><v>1</v></f>\n <f><v>4</v><v>1</v><v>5</v></f>\n <f><v>4</v><v>5</v><v>2</v></f>\n <f><v>4</v><v>2</v><v>1</v></f>\n <f><v>6</v><v>1</v><v>7</v></f>\n <f><v>6</v><v>7</v><v>5</v></f>\n <f><v>6</v><v>5</v><v>1</v></f>\n <f><v>8</v><v>1</v><v>9</v></f>\n <f><v>8</v><v>9</v><v>7</v></f>\n <f><v>8</v><v>7</v><v>1</v></f>\n <f><v>10</v><v>1</v><v>3</v></f>\n <f><v>10</v><v>3</v><v>9</v></f>\n <f><v>10</v><v>9</v><v>1</v></f>\n <f><v>11</v><v>12</v><v>13</v></f>\n <f><v>11</v><v>13</v><v>14</v></f>\n <f><v>11</v><v>14</v><v>12</v></f>\n <f><v>15</v><v>12</v><v>14</v></f>\n <f><v>15</v><v>14</v><v>16</v></f>\n <f><v>15</v><v>16</v><v>12</v></f>\n <f><v>17</v><v>12</v><v>16</v></f>\n <f><v>17</v><v>16</v><v>18</v></f>\n <f><v>17</v><v>18</v><v>12</v></f>\n <f><v>19</v><v>12</v><v>18</v></f>\n <f><v>19</v><v>18</v><v>20</v></f>\n <f><v>19</v><v>20</v><v>12</v></f>\n <f><v>21</v><v>12</v><v>20</v></f>\n <f><v>21</v><v>20</v><v>13</v></f>\n <f><v>21</v><v>13</v><v>12</v></f>\n <f><v>22</v><v>13</v><v>3</v></f>\n <f><v>22</v><v>3</v><v>2</v></f>\n <f><v>22</v><v>2</v><v>13</v></f>\n <f><v>23</v><v>2</v><v>14</v></f>\n <f><v>23</v><v>14</v><v>13</v></f>\n <f><v>23</v><v>13</v><v>2</v></f>\n <f><v>24</v><v>14</v><v>2</v></f>\n <f><v>24</v><v>2</v><v>5</v></f>\n <f><v>24</v><v>5</v><v>14</v></f>\n <f><v>25</v><v>5</v><v>16</v></f>\n <f><v>25</v><v>16</v><v>14</v></f>\n <f><v>25</v><v>14</v><v>5</v></f>\n <f><v>26</v><v>16</v><v>5</v></f>\n <f><v>26</v><v>5</v><v>7</v></f>\n <f><v>26</v><v>7</v><v>16</v></f>\n <f><v>27</v><v>7</v><v>18</v></f>\n <f><v>27</v><v>18</v><v>16</v></f>\n <f><v>27</v><v>16</v><v>7</v></f>\n <f><v>28</v><v>18</v><v>7</v></f>\n <f><v>28</v><v>7</v><v>9</v></f>\n <f><v>28</v><v>9</v><v>18</v></f>\n <f><v>29</v><v>9</v><v>20</v></f>\n <f><v>29</v><v>20</v><v>18</v></f>\n <f><v>29</v><v>18</v><v>9</v></f>\n <f><v>30</v><v>20</v><v>9</v></f>\n <f><v>30</v><v>9</v><v>3</v></f>\n <f><v>30</v><v>3</v><v>20</v></f>\n <f><v>31</v><v>3</v><v>13</v></f>\n <f><v>31</v><v>13</v><v>20</v></f>\n <f><v>31</v><v>20</v><v>3</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/triakis_octahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.186504874513\" y=\"0.570471649002\" z=\"0.393060625382\"/>\n <p x=\"-0.422744540005\" y=\"-0.0360391884463\" z=\"0.905532015329\"/>\n <p x=\"0.626907979988\" y=\"0.709925416101\" z=\"0.320924115949\"/>\n <p x=\"-0.654426037468\" y=\"0.703354164318\" z=\"-0.277523838644\"/>\n <p x=\"-0.705852449852\" y=\"-0.0176498222428\" z=\"0.127198382744\"/>\n <p x=\"-0.62690797999\" y=\"-0.709925416102\" z=\"-0.32092411595\"/>\n <p x=\"-0.355639406074\" y=\"0.0122060190232\" z=\"-0.622968901075\"/>\n <p x=\"0.422744540009\" y=\"0.0360391884429\" z=\"-0.905532015329\"/>\n <p x=\"0.163708169271\" y=\"0.600327490265\" z=\"-0.357106658439\"/>\n <p x=\"-0.163708169268\" y=\"-0.600327490264\" z=\"0.357106658444\"/>\n <p x=\"0.65442603747\" y=\"-0.703354164317\" z=\"0.277523838642\"/>\n <p x=\"0.186504874503\" y=\"-0.570471649004\" z=\"-0.393060625385\"/>\n <p x=\"0.705852449852\" y=\"0.0176498222431\" z=\"-0.127198382746\"/>\n <p x=\"0.355639406077\" y=\"-0.0122060190201\" z=\"0.622968901079\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>0</v><v>2</v><v>3</v></f>\n <f><v>0</v><v>3</v><v>1</v></f>\n <f><v>4</v><v>3</v><v>5</v></f>\n <f><v>4</v><v>5</v><v>1</v></f>\n <f><v>4</v><v>1</v><v>3</v></f>\n <f><v>6</v><v>5</v><v>3</v></f>\n <f><v>6</v><v>3</v><v>7</v></f>\n <f><v>6</v><v>7</v><v>5</v></f>\n <f><v>8</v><v>2</v><v>7</v></f>\n <f><v>8</v><v>7</v><v>3</v></f>\n <f><v>8</v><v>3</v><v>2</v></f>\n <f><v>9</v><v>1</v><v>5</v></f>\n <f><v>9</v><v>5</v><v>10</v></f>\n <f><v>9</v><v>10</v><v>1</v></f>\n <f><v>11</v><v>7</v><v>10</v></f>\n <f><v>11</v><v>10</v><v>5</v></f>\n <f><v>11</v><v>5</v><v>7</v></f>\n <f><v>12</v><v>10</v><v>7</v></f>\n <f><v>12</v><v>7</v><v>2</v></f>\n <f><v>12</v><v>2</v><v>10</v></f>\n <f><v>13</v><v>2</v><v>1</v></f>\n <f><v>13</v><v>1</v><v>10</v></f>\n <f><v>13</v><v>10</v><v>2</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/triangular_cupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.844675502381\" y=\"0.485670508837\" z=\"0.225049888964\"/>\n <p x=\"-0.106338258151\" y=\"0.523973400558\" z=\"0.845070441065\"/>\n <p x=\"0.782300992749\" y=\"0.288177393491\" z=\"0.552230881629\"/>\n <p x=\"0.932602999418\" y=\"0.0140784947035\" z=\"-0.360629229907\"/>\n <p x=\"0.194265755188\" y=\"-0.0242243970172\" z=\"-0.980649782007\"/>\n <p x=\"-0.694373495712\" y=\"0.21157161005\" z=\"-0.687810222572\"/>\n <p x=\"-0.630252995414\" y=\"-0.433917965092\" z=\"0.026519010054\"/>\n <p x=\"0.258386255486\" y=\"-0.669713972159\" z=\"-0.266320549381\"/>\n <p x=\"0.108084248817\" y=\"-0.395615073371\" z=\"0.646539562154\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v></f>\n <f><v>6</v><v>7</v><v>8</v></f>\n <f><v>7</v><v>6</v><v>5</v><v>4</v></f>\n <f><v>7</v><v>4</v><v>3</v></f>\n <f><v>8</v><v>7</v><v>3</v><v>2</v></f>\n <f><v>8</v><v>2</v><v>1</v></f>\n <f><v>6</v><v>8</v><v>1</v><v>0</v></f>\n <f><v>6</v><v>0</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/triangular_dipyramid.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.157134840264\" y=\"-0.408248290464\" z=\"-0.555555555556\"/>\n <p x=\"0.157134840264\" y=\"-0.816496580928\" z=\"0.555555555556\"/>\n <p x=\"-0.510688230857\" y=\"0.204124145232\" z=\"0.444444444444\"/>\n <p x=\"0.667823071121\" y=\"0.204124145232\" z=\"0.111111111111\"/>\n <p x=\"-0.157134840264\" y=\"0.816496580928\" z=\"-0.555555555556\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>1</v><v>3</v><v>2</v></f>\n <f><v>1</v><v>0</v><v>3</v></f>\n <f><v>2</v><v>4</v><v>0</v></f>\n <f><v>2</v><v>3</v><v>4</v></f>\n <f><v>4</v><v>3</v><v>0</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/triangular_hebesphenorotunda.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.226754953472\" y=\"-0.877587770029\" z=\"-0.422400162135\"/>\n <p x=\"0.256056165849\" y=\"-0.328283925773\" z=\"-0.788201768912\"/>\n <p x=\"0.516195072595\" y=\"0.151344119303\" z=\"-0.415792092156\"/>\n <p x=\"0.647668260375\" y=\"-0.101534092767\" z=\"0.180171619987\"/>\n <p x=\"0.468784534864\" y=\"-0.737448990715\" z=\"0.17608700911\"/>\n <p x=\"-0.316002515134\" y=\"-0.512255585713\" z=\"-0.513780634238\"/>\n <p x=\"-0.184529204672\" y=\"-0.765133329383\" z=\"0.0821818483889\"/>\n <p x=\"0.375371549696\" y=\"-0.371522252974\" z=\"0.71809781177\"/>\n <p x=\"-0.277942304074\" y=\"-0.399206625802\" z=\"0.624192277968\"/>\n <p x=\"-0.0178037762722\" y=\"0.0804210143945\" z=\"0.996601915891\"/>\n <p x=\"0.422781800994\" y=\"0.517271661166\" z=\"0.126219282477\"/>\n <p x=\"0.0114971789085\" y=\"0.629725469433\" z=\"0.630801205692\"/>\n <p x=\"-0.502828713937\" y=\"0.219597821448\" z=\"0.57024022492\"/>\n <p x=\"-0.119976165697\" y=\"0.88260355372\" z=\"0.0348385327517\"/>\n <p x=\"-0.634302024398\" y=\"0.472475565117\" z=\"-0.0257222577063\"/>\n <p x=\"0.0311695692712\" y=\"0.290520800897\" z=\"-0.842153620796\"/>\n <p x=\"-0.362005456846\" y=\"0.742463706142\" z=\"-0.563648505728\"/>\n <p x=\"-0.540888924996\" y=\"0.106548861537\" z=\"-0.567732687285\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>0</v><v>5</v></f>\n <f><v>0</v><v>6</v><v>5</v></f>\n <f><v>6</v><v>0</v><v>4</v></f>\n <f><v>6</v><v>4</v><v>7</v><v>8</v></f>\n <f><v>7</v><v>4</v><v>3</v></f>\n <f><v>9</v><v>7</v><v>3</v><v>10</v><v>11</v></f>\n <f><v>8</v><v>7</v><v>9</v></f>\n <f><v>12</v><v>8</v><v>9</v></f>\n <f><v>12</v><v>9</v><v>11</v></f>\n <f><v>13</v><v>11</v><v>10</v></f>\n <f><v>12</v><v>11</v><v>13</v><v>14</v></f>\n <f><v>2</v><v>10</v><v>3</v></f>\n <f><v>2</v><v>15</v><v>16</v><v>13</v><v>10</v></f>\n <f><v>16</v><v>14</v><v>13</v></f>\n <f><v>16</v><v>17</v><v>14</v></f>\n <f><v>17</v><v>16</v><v>15</v></f>\n <f><v>1</v><v>5</v><v>17</v><v>15</v></f>\n <f><v>1</v><v>15</v><v>2</v></f>\n <f><v>17</v><v>5</v><v>6</v><v>8</v><v>12</v><v>14</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/triangular_orthobicupola.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.623091821106\" y=\"-0.255511043168\" z=\"-0.73923655841\"/>\n <p x=\"0.06003575091\" y=\"0.459901711819\" z=\"-0.885937991103\"/>\n <p x=\"0.346268037586\" y=\"-0.494162351134\" z=\"-0.797434647396\"/>\n <p x=\"-0.969359858692\" y=\"0.238651307966\" z=\"0.0581980889865\"/>\n <p x=\"-0.286232286676\" y=\"0.954064062952\" z=\"-0.0885033437062\"/>\n <p x=\"0.683127572016\" y=\"0.715412754986\" z=\"-0.146701432693\"/>\n <p x=\"0.969359858692\" y=\"-0.238651307966\" z=\"-0.0581980889865\"/>\n <p x=\"0.286232286676\" y=\"-0.954064062952\" z=\"0.0885033437062\"/>\n <p x=\"-0.683127572016\" y=\"-0.715412754986\" z=\"0.146701432693\"/>\n <p x=\"0.204561105984\" y=\"0.653082833474\" z=\"0.729134806837\"/>\n <p x=\"-0.478566466033\" y=\"-0.0623299215124\" z=\"0.875836239529\"/>\n <p x=\"0.49079339266\" y=\"-0.300981229479\" z=\"0.817638150543\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>1</v><v>0</v><v>3</v><v>4</v></f>\n <f><v>1</v><v>4</v><v>5</v></f>\n <f><v>2</v><v>1</v><v>5</v><v>6</v></f>\n <f><v>2</v><v>6</v><v>7</v></f>\n <f><v>0</v><v>2</v><v>7</v><v>8</v></f>\n <f><v>0</v><v>8</v><v>3</v></f>\n <f><v>9</v><v>10</v><v>11</v></f>\n <f><v>10</v><v>9</v><v>4</v><v>3</v></f>\n <f><v>10</v><v>3</v><v>8</v></f>\n <f><v>11</v><v>10</v><v>8</v><v>7</v></f>\n <f><v>11</v><v>7</v><v>6</v></f>\n <f><v>9</v><v>11</v><v>6</v><v>5</v></f>\n <f><v>9</v><v>5</v><v>4</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/triangular_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.654653670708\" y=\"-0.377964473009\" z=\"-0.654653670708\"/>\n <p x=\"-0.654653670708\" y=\"-0.377964473009\" z=\"-0.654653670708\"/>\n <p x=\"-1.45362315675E-16\" y=\"0.755928946017\" z=\"-0.654653670708\"/>\n <p x=\"-0.654653670708\" y=\"-0.377964473009\" z=\"0.654653670708\"/>\n <p x=\"0.654653670708\" y=\"-0.377964473009\" z=\"0.654653670708\"/>\n <p x=\"-1.45362315675E-16\" y=\"0.755928946017\" z=\"0.654653670708\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>3</v><v>4</v><v>5</v></f>\n <f><v>5</v><v>2</v><v>1</v><v>3</v></f>\n <f><v>3</v><v>1</v><v>0</v><v>4</v></f>\n <f><v>4</v><v>0</v><v>2</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/triaugmented_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.674770626776\" y=\"-0.445561288536\" z=\"0.339488697863\"/>\n <p x=\"0.551647901503\" y=\"-0.652188051048\" z=\"-0.223992734644\"/>\n <p x=\"0.600247458023\" y=\"-0.181435426754\" z=\"-0.613088094513\"/>\n <p x=\"0.753406361064\" y=\"0.316132457865\" z=\"-0.29008081927\"/>\n <p x=\"0.799464212302\" y=\"0.152893697976\" z=\"0.298644015313\"/>\n <p x=\"-0.138745840296\" y=\"0.474577659444\" z=\"-0.69217320495\"/>\n <p x=\"0.296683385244\" y=\"0.7215708422\" z=\"-0.338958105524\"/>\n <p x=\"0.0488670744449\" y=\"-0.0835109068237\" z=\"-0.861594855481\"/>\n <p x=\"-0.0181648203042\" y=\"0.047213037773\" z=\"0.849128422008\"/>\n <p x=\"0.169448094436\" y=\"-0.510875528495\" z=\"0.679706771477\"/>\n <p x=\"0.371206553997\" y=\"0.457444980418\" z=\"0.613618686852\"/>\n <p x=\"-0.265981131104\" y=\"-0.757868711251\" z=\"0.326491672051\"/>\n <p x=\"-0.029768659843\" y=\"-0.845204653225\" z=\"-0.232025338349\"/>\n <p x=\"-0.340504299856\" y=\"-0.493742849469\" z=\"-0.626085120325\"/>\n <p x=\"-0.722704106923\" y=\"-0.352430326916\" z=\"0.277614385796\"/>\n <p x=\"-0.768761958161\" y=\"-0.189191567027\" z=\"-0.311110448786\"/>\n <p x=\"0.0604709139837\" y=\"0.808906784174\" z=\"0.219558904876\"/>\n <p x=\"-0.520945647362\" y=\"0.615890181998\" z=\"0.211526301171\"/>\n <p x=\"-0.569545203882\" y=\"0.145137557703\" z=\"0.60062166104\"/>\n <p x=\"-0.644068372635\" y=\"0.409263419485\" z=\"-0.351955131336\"/>\n <p x=\"-0.421491321533\" y=\"-0.412115863735\" z=\"0.807778175448\"/>\n <p x=\"0.664408741912\" y=\"0.731961287147\" z=\"0.150975818554\"/>\n <p x=\"-0.549939961786\" y=\"0.0431332670941\" z=\"-0.83408965927\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>6</v><v>3</v><v>2</v><v>7</v></f>\n <f><v>8</v><v>9</v><v>0</v><v>4</v><v>10</v></f>\n <f><v>11</v><v>12</v><v>1</v><v>0</v><v>9</v></f>\n <f><v>13</v><v>7</v><v>2</v><v>1</v><v>12</v></f>\n <f><v>12</v><v>11</v><v>14</v><v>15</v><v>13</v></f>\n <f><v>10</v><v>16</v><v>17</v><v>18</v><v>8</v></f>\n <f><v>6</v><v>5</v><v>19</v><v>17</v><v>16</v></f>\n <f><v>19</v><v>15</v><v>14</v><v>18</v><v>17</v></f>\n <f><v>20</v><v>18</v><v>14</v></f>\n <f><v>20</v><v>14</v><v>11</v></f>\n <f><v>20</v><v>8</v><v>18</v></f>\n <f><v>20</v><v>9</v><v>8</v></f>\n <f><v>9</v><v>20</v><v>11</v></f>\n <f><v>21</v><v>4</v><v>3</v></f>\n <f><v>21</v><v>3</v><v>6</v></f>\n <f><v>21</v><v>10</v><v>4</v></f>\n <f><v>21</v><v>16</v><v>10</v></f>\n <f><v>16</v><v>21</v><v>6</v></f>\n <f><v>22</v><v>15</v><v>19</v></f>\n <f><v>22</v><v>19</v><v>5</v></f>\n <f><v>22</v><v>13</v><v>15</v></f>\n <f><v>22</v><v>7</v><v>13</v></f>\n <f><v>7</v><v>22</v><v>5</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/triaugmented_hexagonal_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.701194002631\" y=\"-0.0343395669715\" z=\"-0.110681240425\"/>\n <p x=\"-0.35308566332\" y=\"-0.513286548941\" z=\"-0.342008779422\"/>\n <p x=\"0.185624526264\" y=\"-0.684137852494\" z=\"-0.0510049625276\"/>\n <p x=\"0.376226376536\" y=\"-0.376042174077\" z=\"0.471326393365\"/>\n <p x=\"0.0281180372249\" y=\"0.102904807893\" z=\"0.702653932362\"/>\n <p x=\"-0.510592152359\" y=\"0.273756111445\" z=\"0.411650115467\"/>\n <p x=\"0.35308566332\" y=\"0.513286548941\" z=\"0.342008779422\"/>\n <p x=\"0.701194002631\" y=\"0.0343395669715\" z=\"0.110681240425\"/>\n <p x=\"0.510592152359\" y=\"-0.273756111445\" z=\"-0.411650115467\"/>\n <p x=\"-0.0281180372249\" y=\"-0.102904807893\" z=\"-0.702653932362\"/>\n <p x=\"-0.376226376536\" y=\"0.376042174077\" z=\"-0.471326393365\"/>\n <p x=\"-0.185624526264\" y=\"0.684137852494\" z=\"0.0510049625276\"/>\n <p x=\"0.805451412821\" y=\"-0.590178181972\" z=\"0.0542008773818\"/>\n <p x=\"-0.143054999407\" y=\"0.714830150818\" z=\"0.684509402876\"/>\n <p x=\"-0.662396413414\" y=\"-0.124651968846\" z=\"-0.738710280258\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v></f>\n <f><v>6</v><v>7</v><v>8</v><v>9</v><v>10</v><v>11</v></f>\n <f><v>2</v><v>1</v><v>9</v><v>8</v></f>\n <f><v>4</v><v>3</v><v>7</v><v>6</v></f>\n <f><v>0</v><v>5</v><v>11</v><v>10</v></f>\n <f><v>2</v><v>12</v><v>3</v></f>\n <f><v>2</v><v>8</v><v>12</v></f>\n <f><v>3</v><v>12</v><v>7</v></f>\n <f><v>7</v><v>12</v><v>8</v></f>\n <f><v>4</v><v>13</v><v>5</v></f>\n <f><v>4</v><v>6</v><v>13</v></f>\n <f><v>5</v><v>13</v><v>11</v></f>\n <f><v>11</v><v>13</v><v>6</v></f>\n <f><v>0</v><v>14</v><v>1</v></f>\n <f><v>0</v><v>10</v><v>14</v></f>\n <f><v>1</v><v>14</v><v>9</v></f>\n <f><v>9</v><v>14</v><v>10</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/triaugmented_triangular_prism.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.577573241981\" y=\"0.810266672548\" z=\"0.0993834468369\"/>\n <p x=\"0.0269323826832\" y=\"0.452836811218\" z=\"-0.61846520776\"/>\n <p x=\"-0.713563527124\" y=\"-0.119637675921\" z=\"-0.254557779886\"/>\n <p x=\"0.705122550887\" y=\"-0.183552048741\" z=\"-0.239575828654\"/>\n <p x=\"-0.0145585304744\" y=\"-0.52292492267\" z=\"-0.852254407112\"/>\n <p x=\"-0.0353733589202\" y=\"-0.75602653588\" z=\"0.12433159922\"/>\n <p x=\"0.37868893114\" y=\"0.589426968232\" z=\"0.312179894603\"/>\n <p x=\"0.592131772456\" y=\"-0.287341749878\" z=\"0.752870960275\"/>\n <p x=\"-0.361806978666\" y=\"0.0169524810925\" z=\"0.676087322477\"/>\n <f><v>0</v><v>1</v><v>2</v></f>\n <f><v>3</v><v>4</v><v>1</v></f>\n <f><v>4</v><v>2</v><v>1</v></f>\n <f><v>4</v><v>5</v><v>2</v></f>\n <f><v>3</v><v>5</v><v>4</v></f>\n <f><v>1</v><v>6</v><v>3</v></f>\n <f><v>3</v><v>6</v><v>7</v></f>\n <f><v>3</v><v>7</v><v>5</v></f>\n <f><v>5</v><v>7</v><v>8</v></f>\n <f><v>7</v><v>6</v><v>8</v></f>\n <f><v>5</v><v>8</v><v>2</v></f>\n <f><v>2</v><v>8</v><v>0</v></f>\n <f><v>8</v><v>6</v><v>0</v></f>\n <f><v>0</v><v>6</v><v>1</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/triaugmented_truncated_dodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.828464557826\" y=\"-0.351369908141\" z=\"-0.33907473659\"/>\n <p x=\"0.702338540063\" y=\"-0.234979351031\" z=\"-0.606735866924\"/>\n <p x=\"0.597349087732\" y=\"0.0300367895937\" z=\"-0.747592797676\"/>\n <p x=\"0.553598603165\" y=\"0.342451355581\" z=\"-0.707842968849\"/>\n <p x=\"0.587798284441\" y=\"0.582932601305\" z=\"-0.502669464008\"/>\n <p x=\"0.686885015717\" y=\"0.659624864556\" z=\"-0.210441588412\"/>\n <p x=\"0.81301103348\" y=\"0.543234307446\" z=\"0.0572195419221\"/>\n <p x=\"0.91800048581\" y=\"0.278218166821\" z=\"0.198076472674\"/>\n <p x=\"0.961750970378\" y=\"-0.0341963991664\" z=\"0.158326643847\"/>\n <p x=\"0.927551289102\" y=\"-0.27467764489\" z=\"-0.0468468609938\"/>\n <p x=\"0.874846029016\" y=\"-0.321506476877\" z=\"0.263195444002\"/>\n <p x=\"0.13275810389\" y=\"-0.921442496207\" z=\"0.0464307023225\"/>\n <p x=\"0.185463363976\" y=\"-0.87461366422\" z=\"-0.263611602673\"/>\n <p x=\"0.369828997457\" y=\"-0.722150759162\" z=\"-0.47304271451\"/>\n <p x=\"0.615433598701\" y=\"-0.522289428741\" z=\"-0.501867066769\"/>\n <p x=\"0.690480395535\" y=\"-0.473969381935\" z=\"0.472626555839\"/>\n <p x=\"0.444875794291\" y=\"-0.673830712356\" z=\"0.501450908098\"/>\n <p x=\"0.231844835166\" y=\"-0.844750232956\" z=\"0.338658577919\"/>\n <p x=\"0.479075475567\" y=\"-0.433349466632\" z=\"0.706624412938\"/>\n <p x=\"0.760305773394\" y=\"0.49640547546\" z=\"0.367261846918\"/>\n <p x=\"0.548900853426\" y=\"0.537025390763\" z=\"0.601259704017\"/>\n <p x=\"0.364535219945\" y=\"0.384562485705\" z=\"0.810690815854\"/>\n <p x=\"0.277630278583\" y=\"0.0972524079943\" z=\"0.915559616009\"/>\n <p x=\"0.321380763151\" y=\"-0.215162157993\" z=\"0.875809787182\"/>\n <p x=\"0.0593373462129\" y=\"-0.75822310711\" z=\"-0.531272733007\"/>\n <p x=\"0.34056764404\" y=\"0.171531834981\" z=\"-0.870635299028\"/>\n <p x=\"-0.382774124156\" y=\"0.706681276963\" z=\"-0.485932257354\"/>\n <p x=\"-0.169743165031\" y=\"0.877600797563\" z=\"-0.323139927175\"/>\n <p x=\"0.140748486213\" y=\"0.91367314551\" z=\"-0.264909908679\"/>\n <p x=\"0.430103572024\" y=\"0.801119909944\" z=\"-0.333484089764\"/>\n <p x=\"0.0300759927958\" y=\"0.135459487034\" z=\"-0.928865317525\"/>\n <p x=\"-0.259279093016\" y=\"0.2480127226\" z=\"-0.860291136439\"/>\n <p x=\"-0.416973805432\" y=\"0.466200031239\" z=\"-0.691105762195\"/>\n <p x=\"-0.215528608448\" y=\"-0.0644018433876\" z=\"-0.900040965266\"/>\n <p x=\"0.00276432392239\" y=\"0.791073671717\" z=\"0.546791383751\"/>\n <p x=\"0.259545767615\" y=\"0.649578626329\" z=\"0.669833885103\"/>\n <p x=\"-0.0706564337549\" y=\"0.954293060813\" z=\"-0.0309120515792\"/>\n <p x=\"-0.123361693841\" y=\"0.907464228827\" z=\"0.279130253416\"/>\n <p x=\"-0.855898815675\" y=\"-0.245367602215\" z=\"-0.182557821931\"/>\n <p x=\"-0.750909363345\" y=\"-0.510383742839\" z=\"-0.0417008911789\"/>\n <p x=\"-0.624783345582\" y=\"-0.62677429995\" z=\"0.225960239155\"/>\n <p x=\"-0.525696614305\" y=\"-0.550082036699\" z=\"0.518188114751\"/>\n <p x=\"-0.49149693303\" y=\"-0.309600790975\" z=\"0.723361619592\"/>\n <p x=\"-0.535247417597\" y=\"0.00281377501304\" z=\"0.763111448419\"/>\n <p x=\"-0.640236869927\" y=\"0.267829915638\" z=\"0.622254517667\"/>\n <p x=\"-0.766362887691\" y=\"0.384220472748\" z=\"0.354593387333\"/>\n <p x=\"-0.865449618967\" y=\"0.307528209497\" z=\"0.0623655117371\"/>\n <p x=\"-0.899649300243\" y=\"0.0670469637731\" z=\"-0.142807993104\"/>\n <p x=\"-0.812744358881\" y=\"0.354357041483\" z=\"-0.247676793259\"/>\n <p x=\"-0.30243354981\" y=\"-0.351711921098\" z=\"-0.795172165111\"/>\n <p x=\"-0.486799183291\" y=\"-0.504174826156\" z=\"-0.585741053274\"/>\n <p x=\"-0.698204103259\" y=\"-0.463554910853\" z=\"-0.351743196175\"/>\n <p x=\"-0.6283787254\" y=\"0.506819946541\" z=\"-0.457107905096\"/>\n <p x=\"-0.0786468160778\" y=\"-0.880822580904\" z=\"0.280428559422\"/>\n <p x=\"-0.368001901889\" y=\"-0.768269345337\" z=\"0.349002740507\"/>\n <p x=\"-0.197444097479\" y=\"-0.616728061723\" z=\"-0.654315234359\"/>\n <p x=\"-0.278465973905\" y=\"-0.138681270375\" z=\"0.886153949771\"/>\n <p x=\"-0.307727327322\" y=\"0.755001323769\" z=\"0.488561365254\"/>\n <p x=\"-0.553331928566\" y=\"0.555139993348\" z=\"0.517385717512\"/>\n <p x=\"0.0320256773395\" y=\"-0.102608922427\" z=\"0.944383968268\"/>\n <p x=\"-0.765725154258\" y=\"0.603092336605\" z=\"0.123960095416\"/>\n <p x=\"-0.552694195133\" y=\"0.774011857205\" z=\"0.286752425595\"/>\n <p x=\"-0.368328561652\" y=\"0.926474762263\" z=\"0.0773213137574\"/>\n <p x=\"-0.467415292928\" y=\"0.849782499012\" z=\"-0.214906561839\"/>\n <p x=\"-0.713019894172\" y=\"0.649921168591\" z=\"-0.18608220958\"/>\n <p x=\"-0.303048357732\" y=\"-0.564804211575\" z=\"0.744700865485\"/>\n <p x=\"-0.145353645316\" y=\"-0.782991520213\" z=\"0.57551549124\"/>\n <p x=\"0.165138005929\" y=\"-0.746919172265\" z=\"0.633745509737\"/>\n <p x=\"0.199337687204\" y=\"-0.506437926541\" z=\"0.838919014578\"/>\n <p x=\"-0.090017398607\" y=\"-0.393884690975\" z=\"0.907493195664\"/>\n <p x=\"0.397404203678\" y=\"-0.540549737169\" z=\"-0.732576318589\"/>\n <p x=\"0.0869125524342\" y=\"-0.576622085117\" z=\"-0.790806337086\"/>\n <p x=\"-0.0180768998962\" y=\"-0.311605944492\" z=\"-0.931663267837\"/>\n <p x=\"0.227527701348\" y=\"-0.111744614071\" z=\"-0.960487620096\"/>\n <p x=\"0.48430914504\" y=\"-0.253239659459\" z=\"-0.837445118744\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v><v>5</v><v>6</v><v>7</v><v>8</v><v>9</v></f>\n <f><v>10</v><v>9</v><v>8</v></f>\n <f><v>11</v><v>12</v><v>13</v><v>14</v><v>0</v><v>9</v><v>10</v><v>15</v><v>16</v><v>17</v></f>\n <f><v>18</v><v>16</v><v>15</v></f>\n <f><v>14</v><v>1</v><v>0</v></f>\n <f><v>18</v><v>15</v><v>10</v><v>8</v><v>7</v><v>19</v><v>20</v><v>21</v><v>22</v><v>23</v></f>\n <f><v>12</v><v>24</v><v>13</v></f>\n <f><v>25</v><v>3</v><v>2</v></f>\n <f><v>26</v><v>27</v><v>28</v><v>29</v><v>4</v><v>3</v><v>25</v><v>30</v><v>31</v><v>32</v></f>\n <f><v>33</v><v>31</v><v>30</v></f>\n <f><v>29</v><v>5</v><v>4</v></f>\n <f><v>34</v><v>35</v><v>20</v><v>19</v><v>6</v><v>5</v><v>29</v><v>28</v><v>36</v><v>37</v></f>\n <f><v>27</v><v>36</v><v>28</v></f>\n <f><v>19</v><v>7</v><v>6</v></f>\n <f><v>21</v><v>20</v><v>35</v></f>\n <f><v>38</v><v>39</v><v>40</v><v>41</v><v>42</v><v>43</v><v>44</v><v>45</v><v>46</v><v>47</v></f>\n <f><v>48</v><v>47</v><v>46</v></f>\n <f><v>33</v><v>49</v><v>50</v><v>51</v><v>38</v><v>47</v><v>48</v><v>52</v><v>32</v><v>31</v></f>\n <f><v>26</v><v>32</v><v>52</v></f>\n <f><v>51</v><v>39</v><v>38</v></f>\n <f><v>12</v><v>11</v><v>53</v><v>54</v><v>40</v><v>39</v><v>51</v><v>50</v><v>55</v><v>24</v></f>\n <f><v>49</v><v>55</v><v>50</v></f>\n <f><v>54</v><v>41</v><v>40</v></f>\n <f><v>17</v><v>53</v><v>11</v></f>\n <f><v>56</v><v>43</v><v>42</v></f>\n <f><v>35</v><v>34</v><v>57</v><v>58</v><v>44</v><v>43</v><v>56</v><v>59</v><v>22</v><v>21</v></f>\n <f><v>23</v><v>22</v><v>59</v></f>\n <f><v>58</v><v>45</v><v>44</v></f>\n <f><v>37</v><v>57</v><v>34</v></f>\n <f><v>60</v><v>61</v><v>62</v><v>63</v><v>64</v></f>\n <f><v>61</v><v>60</v><v>45</v><v>58</v></f>\n <f><v>61</v><v>58</v><v>57</v></f>\n <f><v>62</v><v>61</v><v>57</v><v>37</v></f>\n <f><v>62</v><v>37</v><v>36</v></f>\n <f><v>63</v><v>62</v><v>36</v><v>27</v></f>\n <f><v>63</v><v>27</v><v>26</v></f>\n <f><v>64</v><v>63</v><v>26</v><v>52</v></f>\n <f><v>48</v><v>64</v><v>52</v></f>\n <f><v>60</v><v>64</v><v>48</v><v>46</v></f>\n <f><v>60</v><v>46</v><v>45</v></f>\n <f><v>65</v><v>66</v><v>67</v><v>68</v><v>69</v></f>\n <f><v>66</v><v>65</v><v>41</v><v>54</v></f>\n <f><v>66</v><v>54</v><v>53</v></f>\n <f><v>67</v><v>66</v><v>53</v><v>17</v></f>\n <f><v>67</v><v>17</v><v>16</v></f>\n <f><v>68</v><v>67</v><v>16</v><v>18</v></f>\n <f><v>68</v><v>18</v><v>23</v></f>\n <f><v>69</v><v>68</v><v>23</v><v>59</v></f>\n <f><v>56</v><v>69</v><v>59</v></f>\n <f><v>65</v><v>69</v><v>56</v><v>42</v></f>\n <f><v>65</v><v>42</v><v>41</v></f>\n <f><v>70</v><v>71</v><v>72</v><v>73</v><v>74</v></f>\n <f><v>71</v><v>70</v><v>13</v><v>24</v></f>\n <f><v>71</v><v>24</v><v>55</v></f>\n <f><v>71</v><v>55</v><v>49</v><v>72</v></f>\n <f><v>72</v><v>49</v><v>33</v></f>\n <f><v>72</v><v>33</v><v>30</v><v>73</v></f>\n <f><v>73</v><v>30</v><v>25</v></f>\n <f><v>73</v><v>25</v><v>2</v><v>74</v></f>\n <f><v>74</v><v>2</v><v>1</v></f>\n <f><v>74</v><v>1</v><v>14</v><v>70</v></f>\n <f><v>70</v><v>14</v><v>13</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/tridiminished_icosahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.146104539632\" y=\"0.778191062918\" z=\"-0.439225160467\"/>\n <p x=\"0.819830917282\" y=\"0.416782101419\" z=\"0.206951752508\"/>\n <p x=\"0.799190540917\" y=\"-0.582351657904\" z=\"0.148865798106\"/>\n <p x=\"0.112707709134\" y=\"-0.838441318974\" z=\"-0.53321020896\"/>\n <p x=\"-0.290921637237\" y=\"0.00242032564005\" z=\"-0.896670409834\"/>\n <p x=\"-0.760044148136\" y=\"0.469942412737\" z=\"-0.146060364539\"/>\n <p x=\"-0.106958146851\" y=\"-0.890600308085\" z=\"0.442030594034\"/>\n <p x=\"-0.646348458389\" y=\"-0.0819746915597\" z=\"0.681302356625\"/>\n <p x=\"-0.0735613163528\" y=\"0.726032073807\" z=\"0.536015642527\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v><v>4</v></f>\n <f><v>5</v><v>4</v><v>3</v><v>6</v><v>7</v></f>\n <f><v>5</v><v>8</v><v>0</v></f>\n <f><v>8</v><v>1</v><v>0</v></f>\n <f><v>0</v><v>4</v><v>5</v></f>\n <f><v>5</v><v>7</v><v>8</v></f>\n <f><v>2</v><v>1</v><v>8</v><v>7</v><v>6</v></f>\n <f><v>3</v><v>2</v><v>6</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/tridiminished_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"0.622866913219\" y=\"0.618689929055\" z=\"0.268875295373\"/>\n <p x=\"0.632830203313\" y=\"0.667979230789\" z=\"-0.15223981211\"/>\n <p x=\"0.260097696343\" y=\"0.86976646536\" z=\"-0.137440272303\"/>\n <p x=\"0.25013440625\" y=\"0.820477163625\" z=\"0.283674835181\"/>\n <p x=\"-0.108878198249\" y=\"0.894110390313\" z=\"0.0702392854136\"/>\n <p x=\"0.051935606844\" y=\"0.787120294271\" z=\"-0.497585786041\"/>\n <p x=\"-0.317040287749\" y=\"0.811464219225\" z=\"-0.289906228324\"/>\n <p x=\"0.655029471832\" y=\"0.46062169024\" z=\"-0.521531944467\"/>\n <p x=\"0.296016867333\" y=\"0.534254916928\" z=\"-0.734967494234\"/>\n <p x=\"-0.87205832873\" y=\"0.228232662749\" z=\"-0.239314442373\"/>\n <p x=\"-0.669974565739\" y=\"0.597988139875\" z=\"-0.191255353363\"/>\n <p x=\"0.32197274823\" y=\"0.149454066762\" z=\"-0.911379608681\"/>\n <p x=\"0.119888985239\" y=\"-0.220301410364\" z=\"-0.959438697691\"/>\n <p x=\"-0.233045292752\" y=\"-0.433777489714\" z=\"-0.86078782273\"/>\n <p x=\"-0.602021187345\" y=\"-0.409433564761\" z=\"-0.653108265014\"/>\n <p x=\"-0.846102447834\" y=\"-0.156568187418\" z=\"-0.415726556821\"/>\n <p x=\"-0.33316122976\" y=\"0.731712453736\" z=\"0.39147232876\"/>\n <p x=\"0.0258513747388\" y=\"0.658079227048\" z=\"0.604907878527\"/>\n <p x=\"-0.327082903252\" y=\"0.444603147699\" z=\"0.703558753488\"/>\n <p x=\"-0.679937855833\" y=\"0.54869883814\" z=\"0.22985975412\"/>\n <p x=\"-0.673859529325\" y=\"0.261589532103\" z=\"0.541946178848\"/>\n <p x=\"-0.882021618824\" y=\"0.178943361014\" z=\"0.18180066511\"/>\n <p x=\"-0.862223389845\" y=\"-0.236319952906\" z=\"0.265652000264\"/>\n <p x=\"-0.654061300346\" y=\"-0.153673781818\" z=\"0.625797514001\"/>\n <p x=\"-0.840024121326\" y=\"-0.443677493455\" z=\"-0.103640132093\"/>\n <p x=\"-0.595942860836\" y=\"-0.696542870798\" z=\"-0.341021840286\"/>\n <p x=\"-0.092964932856\" y=\"0.142448468621\" z=\"0.887292152778\"/>\n <p x=\"0.259969345135\" y=\"0.35592454797\" z=\"0.788641277817\"/>\n <p x=\"0.279767574113\" y=\"-0.0593387659499\" z=\"0.872492612971\"/>\n <p x=\"-0.295048695847\" y=\"-0.227307008505\" z=\"0.839233063768\"/>\n <p x=\"0.0776838111221\" y=\"-0.429094243076\" z=\"0.824433523961\"/>\n <p x=\"0.343964340131\" y=\"-0.889317160968\" z=\"0.217759683411\"/>\n <p x=\"0.321765071612\" y=\"-0.681959620419\" z=\"0.587051815768\"/>\n <p x=\"-0.223210353867\" y=\"-0.898330105369\" z=\"-0.355821380093\"/>\n <p x=\"0.135802250632\" y=\"-0.971963332057\" z=\"-0.142385830326\"/>\n <p x=\"0.648743468706\" y=\"-0.0836826909031\" z=\"0.664813055254\"/>\n <p x=\"0.628945239727\" y=\"0.331580623017\" z=\"0.580961720101\"/>\n <p x=\"0.674699349602\" y=\"-0.46848354107\" z=\"0.488400940807\"/>\n <p x=\"0.696898618122\" y=\"-0.675841081619\" z=\"0.119108808451\"/>\n <p x=\"0.706861908215\" y=\"-0.626551779884\" z=\"-0.302006299033\"/>\n <p x=\"0.700783581707\" y=\"-0.339442473847\" z=\"-0.614092723761\"/>\n <p x=\"0.680985352729\" y=\"0.0758208400738\" z=\"-0.697944058914\"/>\n <p x=\"0.360085282143\" y=\"-0.80956539548\" z=\"-0.463618873673\"/>\n <p x=\"0.00107267764377\" y=\"-0.735932168792\" z=\"-0.67705442344\"/>\n <p x=\"0.354006955634\" y=\"-0.522456089442\" z=\"-0.775705298401\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>5</v><v>6</v><v>4</v></f>\n <f><v>1</v><v>7</v><v>8</v><v>5</v><v>2</v></f>\n <f><v>9</v><v>10</v><v>6</v><v>5</v><v>8</v><v>11</v><v>12</v><v>13</v><v>14</v><v>15</v></f>\n <f><v>3</v><v>4</v><v>16</v><v>17</v></f>\n <f><v>17</v><v>16</v><v>18</v></f>\n <f><v>16</v><v>19</v><v>20</v><v>18</v></f>\n <f><v>4</v><v>6</v><v>10</v><v>19</v><v>16</v></f>\n <f><v>19</v><v>21</v><v>20</v></f>\n <f><v>20</v><v>21</v><v>22</v><v>23</v></f>\n <f><v>10</v><v>9</v><v>21</v><v>19</v></f>\n <f><v>9</v><v>15</v><v>24</v><v>22</v><v>21</v></f>\n <f><v>15</v><v>14</v><v>25</v><v>24</v></f>\n <f><v>17</v><v>18</v><v>26</v><v>27</v></f>\n <f><v>27</v><v>26</v><v>28</v></f>\n <f><v>26</v><v>29</v><v>30</v><v>28</v></f>\n <f><v>18</v><v>20</v><v>23</v><v>29</v><v>26</v></f>\n <f><v>31</v><v>32</v><v>30</v><v>29</v><v>23</v><v>22</v><v>24</v><v>25</v><v>33</v><v>34</v></f>\n <f><v>27</v><v>28</v><v>35</v><v>36</v></f>\n <f><v>36</v><v>35</v><v>37</v><v>38</v><v>39</v><v>40</v><v>41</v><v>7</v><v>1</v><v>0</v></f>\n <f><v>28</v><v>30</v><v>32</v><v>37</v><v>35</v></f>\n <f><v>32</v><v>31</v><v>38</v><v>37</v></f>\n <f><v>31</v><v>34</v><v>42</v><v>39</v><v>38</v></f>\n <f><v>34</v><v>33</v><v>43</v><v>42</v></f>\n <f><v>7</v><v>41</v><v>11</v><v>8</v></f>\n <f><v>39</v><v>42</v><v>44</v><v>40</v></f>\n <f><v>40</v><v>44</v><v>12</v><v>11</v><v>41</v></f>\n <f><v>42</v><v>43</v><v>44</v></f>\n <f><v>44</v><v>43</v><v>13</v><v>12</v></f>\n <f><v>0</v><v>3</v><v>17</v><v>27</v><v>36</v></f>\n <f><v>43</v><v>33</v><v>25</v><v>14</v><v>13</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/trigyrate_rhombicosidodecahedron.xml",
    "content": "<?xml version=\"1.0\"?>\n<m> <p x=\"-0.387010795635\" y=\"0.0515520321691\" z=\"-0.920632875829\"/>\n <p x=\"-0.562586585143\" y=\"0.410158997683\" z=\"-0.717820164535\"/>\n <p x=\"-0.172334816593\" y=\"0.625583716254\" z=\"-0.760884734786\"/>\n <p x=\"0.00324097291584\" y=\"0.26697675074\" z=\"-0.96369744608\"/>\n <p x=\"0.27197713179\" y=\"0.57116613325\" z=\"-0.774466029887\"/>\n <p x=\"-0.127762392317\" y=\"0.902347710526\" z=\"-0.411637258191\"/>\n <p x=\"0.316549573727\" y=\"0.847930145502\" z=\"-0.425218569795\"/>\n <p x=\"-0.759203018002\" y=\"0.553783193861\" z=\"-0.341957319815\"/>\n <p x=\"-0.490466887705\" y=\"0.857972547278\" z=\"-0.15272587692\"/>\n <p x=\"-0.103120756634\" y=\"0.994329959203\" z=\"0.0259594341619\"/>\n <p x=\"0.341191163171\" y=\"0.939912347106\" z=\"0.012378165763\"/>\n <p x=\"-0.633023231745\" y=\"0.731754446565\" z=\"0.252620304022\"/>\n <p x=\"-0.245677038238\" y=\"0.868111824713\" z=\"0.431305580733\"/>\n <p x=\"-0.500979621453\" y=\"0.57190436531\" z=\"0.649572751984\"/>\n <p x=\"-0.1447722904\" y=\"0.439479635225\" z=\"0.886509158132\"/>\n <p x=\"0.110530254227\" y=\"0.735687115504\" z=\"0.668242008124\"/>\n <p x=\"0.473234749614\" y=\"0.780062278752\" z=\"0.409330626853\"/>\n <p x=\"0.299539629405\" y=\"0.385062023128\" z=\"0.872927889733\"/>\n <p x=\"0.662244124792\" y=\"0.429437186376\" z=\"0.614016508463\"/>\n <p x=\"0.600637122515\" y=\"0.267691839625\" z=\"-0.753376386814\"/>\n <p x=\"0.331900992218\" y=\"-0.0364975137913\" z=\"-0.942607829709\"/>\n <p x=\"0.848332609461\" y=\"0.356898423706\" z=\"-0.391094810493\"/>\n <p x=\"0.830846473116\" y=\"-0.0601902600833\" z=\"-0.553236952854\"/>\n <p x=\"0.980376239593\" y=\"0.197048366152\" z=\"0.00585766932506\"/>\n <p x=\"0.962890059559\" y=\"-0.220040328436\" z=\"-0.156284491764\"/>\n <p x=\"0.67275684853\" y=\"0.715505418313\" z=\"-0.188282125901\"/>\n <p x=\"0.946331790509\" y=\"-0.150801054955\" z=\"0.28585867854\"/>\n <p x=\"0.75920301394\" y=\"-0.55378320119\" z=\"0.341957318215\"/>\n <p x=\"0.77576135368\" y=\"-0.623022457199\" z=\"-0.100185821787\"/>\n <p x=\"0.804800406396\" y=\"0.555655320867\" z=\"0.208670361892\"/>\n <p x=\"0.749715330649\" y=\"-0.00717686545015\" z=\"0.661721511686\"/>\n <p x=\"0.387010791573\" y=\"-0.0515520394977\" z=\"0.920632874229\"/>\n <p x=\"0.562110342819\" y=\"-0.3643796135\" z=\"-0.74246839575\"/>\n <p x=\"0.144772286339\" y=\"-0.439479642554\" z=\"-0.886509159732\"/>\n <p x=\"0.528065866733\" y=\"-0.71222904128\" z=\"-0.462467398108\"/>\n <p x=\"0.110727810253\" y=\"-0.787329070334\" z=\"-0.606508162091\"/>\n <p x=\"0.242771396696\" y=\"-0.947179138687\" z=\"-0.209555701001\"/>\n <p x=\"0.490466883643\" y=\"-0.857972554606\" z=\"0.15272587532\"/>\n <p x=\"0.127762388256\" y=\"-0.902347717855\" z=\"0.411637256591\"/>\n <p x=\"-0.119933098691\" y=\"-0.991554301936\" z=\"0.0493556802697\"/>\n <p x=\"0.562586581081\" y=\"-0.410159005012\" z=\"0.717820162935\"/>\n <p x=\"0.172334812531\" y=\"-0.625583723583\" z=\"0.760884733185\"/>\n <p x=\"-0.00324097697746\" y=\"-0.266976758069\" z=\"0.963697444479\"/>\n <p x=\"-0.333584109552\" y=\"-0.732911458237\" z=\"-0.592926893693\"/>\n <p x=\"-0.299539633467\" y=\"-0.385062030456\" z=\"-0.872927891334\"/>\n <p x=\"-0.662244128854\" y=\"-0.429437193705\" z=\"-0.614016510063\"/>\n <p x=\"-0.476140391156\" y=\"-0.859129592727\" z=\"-0.187580747121\"/>\n <p x=\"-0.804800410457\" y=\"-0.555655328195\" z=\"-0.208670363492\"/>\n <p x=\"-0.483464154599\" y=\"-0.835984909758\" z=\"0.259598742098\"/>\n <p x=\"-0.812124173901\" y=\"-0.532510645227\" z=\"0.238509125728\"/>\n <p x=\"-0.235768667652\" y=\"-0.746778325677\" z=\"0.621880318419\"/>\n <p x=\"-0.411344457161\" y=\"-0.388171360163\" z=\"0.824693029713\"/>\n <p x=\"-0.767551749625\" y=\"-0.255746650954\" z=\"0.587756602322\"/>\n <p x=\"-0.331900996279\" y=\"0.0364975064626\" z=\"0.942607828109\"/>\n <p x=\"-0.688108288744\" y=\"0.168922215672\" z=\"0.705671400718\"/>\n <p x=\"-0.749715291022\" y=\"0.00717686892034\" z=\"-0.661721494559\"/>\n <p x=\"-0.94633172388\" y=\"0.150801065099\" z=\"-0.285858649839\"/>\n <p x=\"-0.980376199966\" y=\"-0.197048362682\" z=\"-0.00585765219766\"/>\n <p x=\"-0.901759338193\" y=\"0.427565080247\" z=\"0.0633888479983\"/>\n <p x=\"-0.935803775691\" y=\"0.0797156315908\" z=\"0.343389824397\"/>\n <f><v>0</v><v>1</v><v>2</v><v>3</v></f>\n <f><v>3</v><v>2</v><v>4</v></f>\n <f><v>2</v><v>5</v><v>6</v><v>4</v></f>\n <f><v>1</v><v>7</v><v>8</v><v>5</v><v>2</v></f>\n <f><v>8</v><v>9</v><v>5</v></f>\n <f><v>5</v><v>9</v><v>10</v><v>6</v></f>\n <f><v>11</v><v>12</v><v>9</v><v>8</v></f>\n <f><v>11</v><v>13</v><v>12</v></f>\n <f><v>13</v><v>14</v><v>15</v><v>12</v></f>\n <f><v>12</v><v>15</v><v>16</v><v>10</v><v>9</v></f>\n <f><v>14</v><v>17</v><v>15</v></f>\n <f><v>15</v><v>17</v><v>18</v><v>16</v></f>\n <f><v>3</v><v>4</v><v>19</v><v>20</v></f>\n <f><v>19</v><v>21</v><v>22</v></f>\n <f><v>21</v><v>23</v><v>24</v><v>22</v></f>\n <f><v>4</v><v>6</v><v>25</v><v>21</v><v>19</v></f>\n <f><v>23</v><v>26</v><v>24</v></f>\n <f><v>24</v><v>26</v><v>27</v><v>28</v></f>\n <f><v>25</v><v>29</v><v>23</v><v>21</v></f>\n <f><v>6</v><v>10</v><v>25</v></f>\n <f><v>10</v><v>16</v><v>29</v><v>25</v></f>\n <f><v>29</v><v>18</v><v>30</v><v>26</v><v>23</v></f>\n <f><v>16</v><v>18</v><v>29</v></f>\n <f><v>18</v><v>17</v><v>31</v><v>30</v></f>\n <f><v>19</v><v>22</v><v>32</v><v>20</v></f>\n <f><v>20</v><v>32</v><v>33</v></f>\n <f><v>32</v><v>34</v><v>35</v><v>33</v></f>\n <f><v>22</v><v>24</v><v>28</v><v>34</v><v>32</v></f>\n <f><v>34</v><v>36</v><v>35</v></f>\n <f><v>36</v><v>37</v><v>38</v><v>39</v></f>\n <f><v>28</v><v>37</v><v>36</v><v>34</v></f>\n <f><v>28</v><v>27</v><v>37</v></f>\n <f><v>26</v><v>30</v><v>40</v><v>27</v></f>\n <f><v>27</v><v>40</v><v>41</v><v>38</v><v>37</v></f>\n <f><v>30</v><v>31</v><v>40</v></f>\n <f><v>40</v><v>31</v><v>42</v><v>41</v></f>\n <f><v>33</v><v>35</v><v>43</v><v>44</v></f>\n <f><v>44</v><v>43</v><v>45</v></f>\n <f><v>43</v><v>46</v><v>47</v><v>45</v></f>\n <f><v>35</v><v>36</v><v>39</v><v>46</v><v>43</v></f>\n <f><v>39</v><v>48</v><v>46</v></f>\n <f><v>46</v><v>48</v><v>49</v><v>47</v></f>\n <f><v>38</v><v>50</v><v>48</v><v>39</v></f>\n <f><v>38</v><v>41</v><v>50</v></f>\n <f><v>41</v><v>42</v><v>51</v><v>50</v></f>\n <f><v>50</v><v>51</v><v>52</v><v>49</v><v>48</v></f>\n <f><v>42</v><v>53</v><v>51</v></f>\n <f><v>51</v><v>53</v><v>54</v><v>52</v></f>\n <f><v>44</v><v>45</v><v>55</v><v>0</v></f>\n <f><v>0</v><v>55</v><v>1</v></f>\n <f><v>55</v><v>56</v><v>7</v><v>1</v></f>\n <f><v>45</v><v>47</v><v>57</v><v>56</v><v>55</v></f>\n <f><v>56</v><v>58</v><v>7</v></f>\n <f><v>7</v><v>58</v><v>11</v><v>8</v></f>\n <f><v>57</v><v>59</v><v>58</v><v>56</v></f>\n <f><v>47</v><v>49</v><v>57</v></f>\n <f><v>49</v><v>52</v><v>59</v><v>57</v></f>\n <f><v>59</v><v>54</v><v>13</v><v>11</v><v>58</v></f>\n <f><v>52</v><v>54</v><v>59</v></f>\n <f><v>54</v><v>53</v><v>14</v><v>13</v></f>\n <f><v>0</v><v>3</v><v>20</v><v>33</v><v>44</v></f>\n <f><v>53</v><v>42</v><v>31</v><v>17</v><v>14</v></f>\n</m>\n"
  },
  {
    "path": "modules/uniform_polyhedron/data/vacuum.py",
    "content": "#!/usr/bin/python\n\nimport re\nimport urllib\n\n# For each polyhedron on polyhedra.org ...\nindex_file = open(\"polyhedra.txt\", \"w\")\nfor index in range(142):\n\tprint \"Loading\", index\n\t# Extract metadata from the per-polyhedron HTML page ...\n\tmetadata = urllib.urlopen(\"http://polyhedra.org/poly/show/\" + str(index)).read()\n\tmatch = re.search(\"<h2>(.*)</h2>\", metadata);\n\tif not match:\n\t\tcontinue\n\n\tlabel = match.group(1)\n\tname = label.lower().replace(\" \", \"_\")\n\n\tdata = urllib.urlopen(\"http://polyhedra.org/poly/geometry/\" + str(index) + \".xml\")\n\tif data.getcode() != 200:\n\t\tcontinue\n\n\topen(name + \".xml\", \"w\").write(data.read())\n\tindex_file.write(name + \" \" + label + \"\\n\")\n\n"
  },
  {
    "path": "modules/uniform_polyhedron/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace uniform_polyhedron\n{\n\nextern k3d::iplugin_factory& uniform_polyhedron_factory();\n\n} // namespace uniform_polyhedron\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::uniform_polyhedron::uniform_polyhedron_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/uniform_polyhedron/uniform_polyhedron.cpp",
    "content": "// K-3D\n// Copyright (c) 2010, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n///////////////////////////////////////////////////////////////////////////////\n//\n// Polyhedron data files courtesy of http://polyhedra.org, which is based on\n// the Netlib Polyhedra Database compiled by Andrew Hume at\n// http://netlib.sandia.gov/polyhedra, with corrections pulished by\n// George Hart at http://www.georgehart.com/virtual-polyhedra/netlib-info.html.\n// See http://polyhedra.org/poly/about/ for details.\n//\n// The data files are licensed under the GNU Free Documentation License, see\n// http://polyhedra.org/poly/about/terms for details.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/material_sink.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/mesh_source.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/resource/resource.h>\n\n#include <boost/algorithm/string/find.hpp>\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n\nnamespace module\n{\n\nnamespace uniform_polyhedron\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// uniform_polyhedron\n\nclass uniform_polyhedron :\n\tpublic k3d::material_sink<k3d::mesh_source<k3d::node > >\n{\n\ttypedef k3d::material_sink<k3d::mesh_source<k3d::node > > base;\n\npublic:\n\tuniform_polyhedron(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_document(Document),\n\t\tm_type(init_owner(*this) + init_name(\"type\") + init_label(_(\"Type\")) + init_description(_(\"Polyhedron type.\")) + init_value(k3d::string_t(\"tetrahedron\")) + init_enumeration(polyhedron_values())),\n\t\tm_size(init_owner(*this) + init_name(\"size\") + init_label(_(\"Size\")) + init_description(_(\"Polyhedron size.\")) + init_value(5.0) + init_step_increment(0.1) + init_units(typeid(k3d::measurement::scalar)))\n\t{\n\t\tm_material.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_type.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t\tm_size.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> >(make_update_mesh_slot()));\n\t}\n\n\tvoid on_update_mesh_topology(k3d::mesh& Output)\n\t{\n\t\tOutput = k3d::mesh();\n\n\t\ttry\n\t\t{\n\t\t\tk3d::imaterial* const material = m_material.pipeline_value();\n\t\t\tconst k3d::string_t type = m_type.pipeline_value();\n\t\t\tconst k3d::double_t size = m_size.pipeline_value();\n\n\t\t\tstatic const k3d::mesh::colors_t colors = boost::assign::list_of\n\t\t\t\t(k3d::color(1, 1, 1))\n\t\t\t\t(k3d::color(1, 1, 1))\n\t\t\t\t(k3d::color(1, 1, 1))\n\t\t\t\t(k3d::color(1, 0, 0)) // triangles\n\t\t\t\t(k3d::color(0, 1, 0)) // quads\n\t\t\t\t(k3d::color(0, 0, 1)) // pentagons\n\t\t\t\t(k3d::color(1, 1, 0)) // hexagons\n\t\t\t\t(k3d::color(1, 1, 1))\n\t\t\t\t(k3d::color(1, 0, 1)) // octagons\n\t\t\t\t(k3d::color(1, 1, 1))\n\t\t\t\t(k3d::color(1, 1, 1))\n\t\t\t\t(k3d::color(1, 1, 1))\n\t\t\t\t(k3d::color(0, 1, 1)); // decagons\n\n\t\t\tconst k3d::string_t resource_path = \"/module/uniform_polyhedron/data/\" + type + \".xml\";\n\t\t\tstd::istringstream resource(k3d::resource::get_string(resource_path));\n\t\t\tk3d::xml::element xml_document;\n\t\t\tresource >> xml_document;\n\t\t\tif(xml_document.name != \"m\")\n\t\t\t\tthrow std::runtime_error(\"Unexpected root element: \" + xml_document.name);\n\n\t\t\tk3d::mesh::points_t& points = Output.points.create();\n\t\t\tk3d::mesh::selection_t& point_selection = Output.point_selection.create();\n\n\t\t\tboost::scoped_ptr<k3d::polyhedron::primitive> polyhedron(k3d::polyhedron::create(Output));\n\t\t\tk3d::mesh::colors_t& face_colors = polyhedron->face_attributes.create<k3d::mesh::colors_t>(\"Cs\");\n\t\t\tpolyhedron->shell_types.push_back(k3d::polyhedron::POLYGONS);\n\n\t\t\tfor(k3d::xml::element::elements_t::const_iterator xml_component = xml_document.children.begin(); xml_component != xml_document.children.end(); ++xml_component)\n\t\t\t{\n\t\t\t\tif(xml_component->name == \"p\")\n\t\t\t\t{\n\t\t\t\t\tpoints.push_back(\n\t\t\t\t\t\tsize * k3d::point3(\n\t\t\t\t\t\t\tk3d::xml::attribute_value<k3d::double_t>(*xml_component, \"x\", 0.0),\n\t\t\t\t\t\t\tk3d::xml::attribute_value<k3d::double_t>(*xml_component, \"y\", 0.0),\n\t\t\t\t\t\t\tk3d::xml::attribute_value<k3d::double_t>(*xml_component, \"z\", 0.0)));\n\t\t\t\t\tpoint_selection.push_back(0.0);\n\t\t\t\t}\n\t\t\t\telse if(xml_component->name == \"f\")\n\t\t\t\t{\n\t\t\t\t\tpolyhedron->face_shells.push_back(0);\n\t\t\t\t\tpolyhedron->face_first_loops.push_back(polyhedron->loop_first_edges.size());\n\t\t\t\t\tpolyhedron->face_loop_counts.push_back(1);\n\t\t\t\t\tpolyhedron->face_selections.push_back(0);\n\t\t\t\t\tpolyhedron->face_materials.push_back(material);\n\t\t\t\t\tpolyhedron->loop_first_edges.push_back(polyhedron->clockwise_edges.size());\n\n\t\t\t\t\tk3d::uint_t edge_count = 0;\n\t\t\t\t\tfor(k3d::xml::element::elements_t::const_iterator xml_vertex = xml_component->children.begin(); xml_vertex != xml_component->children.end(); ++xml_vertex)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(xml_vertex->name != \"v\")\n\t\t\t\t\t\t\tthrow std::runtime_error(\"Unexpected element: \" + xml_vertex->name);\n\n\t\t\t\t\t\t++edge_count;\t\t\t\t\n\t\n\t\t\t\t\t\tpolyhedron->clockwise_edges.push_back(polyhedron->clockwise_edges.size() + 1);\n\t\t\t\t\t\tpolyhedron->edge_selections.push_back(0);\n\n\t\t\t\t\t\tpolyhedron->vertex_points.push_back(boost::lexical_cast<k3d::uint_t>(xml_vertex->text));\n\t\t\t\t\t\tpolyhedron->vertex_selections.push_back(0);\n\t\t\t\t\t}\n\n\t\t\t\t\tpolyhedron->clockwise_edges.back() = polyhedron->loop_first_edges.back();\n\n\t\t\t\t\tface_colors.push_back(edge_count < colors.size() ? colors[edge_count] : k3d::color(1, 1, 1));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthrow std::runtime_error(\"Unexpected element: \" + xml_component->name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << e.what() << std::endl;\n\t\t\treturn;\n\t\t}\n\t}\n\n\tvoid on_update_mesh_geometry(k3d::mesh& Output)\n\t{\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<uniform_polyhedron, k3d::interface_list<k3d::imesh_source > > factory(\n\t\t\tk3d::uuid(0x916c98dd, 0x74f24362, 0x98364c94, 0x2a9f9ae7),\n\t\t\t\"UniformPolyhedron\",\n\t\t\t_(\"Generates a uniform polyhedron\"),\n\t\t\t\"Polyhedron\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d::idocument& m_document;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_type;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, measurement_property, with_serialization) m_size;\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& polyhedron_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tk3d::string_t polyhedron;\n\t\t\tstd::istringstream polyhedra(k3d::resource::get_string(\"/module/uniform_polyhedron/data/polyhedra.txt\"));\n\t\t\tfor(std::getline(polyhedra, polyhedron); polyhedra; std::getline(polyhedra, polyhedron))\n\t\t\t{\n\t\t\t\tboost::iterator_range<k3d::string_t::iterator> result = boost::algorithm::find_first(polyhedron, \" \");\n\t\t\t\tif(result)\n\t\t\t\t{\n\t\t\t\t\tvalues.push_back(\n\t\t\t\t\t\tk3d::ienumeration_property::enumeration_value_t(\n\t\t\t\t\t\t\t\"(\" + k3d::string_cast(values.size()) + \") \" + k3d::string_t(result.end(), polyhedron.end()),\n\t\t\t\t\t\t\tk3d::string_t(polyhedron.begin(), result.begin()),\n\t\t\t\t\t\t\t\"\"));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn values;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// uniform_polyhedron_factory\n\nk3d::iplugin_factory& uniform_polyhedron_factory()\n{\n\treturn uniform_polyhedron::get_factory();\n}\n\n} // namespace uniform_polyhedron\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/virtual_offscreen/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-virtual-offscreen)\nK3D_CREATE_MODULE_PROXY(k3d-virtual-offscreen)\n\n"
  },
  {
    "path": "modules/virtual_offscreen/camera_to_bitmap.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/ibitmap_source.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/virtual_document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace virtual_offscreen\n{\n\nclass virtual_camera_to_bitmap_factory:\n\tpublic k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::ibitmap_source> >\n{\n\ttypedef k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::ibitmap_source> > base;\n\npublic:\n\tvirtual_camera_to_bitmap_factory() :\n\t\tbase(k3d::uuid(0xc9a3d742, 0x4646dd3a, 0x95c49480, 0x428e7641),\n\t\t\t\"VirtualCameraToBitmap\",\n\t\t\t_(\"Renders the scene to a bitmap using OpenGL\"),\n\t\t\t\"Bitmap Test\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL),\n\t\tdelegate(0)\n\t{\n\t\t// Note ... this ctor may be executed before k3d::application is initialized, so\n\t\t// we can't do very much here\n\t}\n\n\tk3d::inode* create_plugin(k3d::iplugin_factory& Factory, k3d::idocument& Document)\n\t{\n\t\tif(!delegate)\n\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"GLXCameraToBitmap\"));\n\n\t\tif(!delegate)\n\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"WGLCameraToBitmap\"));\n\n\t\tif(delegate)\n\t\t\tk3d::log() << info << this->name() << \" delegating to \" << dynamic_cast<k3d::iplugin_factory*>(delegate)->name() << std::endl;\n\n\t\treturn_val_if_fail(delegate, 0);\n\t\treturn delegate->create_plugin(*this, Document);\n\t}\n\nprivate:\n\tk3d::idocument_plugin_factory* delegate;\n};\n\nk3d::iplugin_factory& camera_to_bitmap_factory()\n{\n\tstatic virtual_camera_to_bitmap_factory instance;\n\treturn instance;\n}\n\n} // namespace virtual_offscreen\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/virtual_offscreen/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the virtual_offscreen plugin module, to protect public symbols from name clashes with other modules\nnamespace virtual_offscreen\n{\n\nextern k3d::iplugin_factory& camera_to_bitmap_factory();\n\n} // namespace virtual_offscreen\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::virtual_offscreen::camera_to_bitmap_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/virtual_opengl_painters/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-virtual-opengl-painters)\nK3D_CREATE_MODULE_PROXY(k3d-virtual-opengl-painters)\nTARGET_LINK_LIBRARIES(k3d-virtual-opengl-painters k3dsdk-opengl)\n"
  },
  {
    "path": "modules/virtual_opengl_painters/edge_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/virtual_document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace gl\n{\n\nnamespace virtual_painters\n{\n\nclass virtual_edge_painter_factory:\n\tpublic k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> >\n{\n\ttypedef k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> > base;\n\npublic:\n\tvirtual_edge_painter_factory() :\n\t\tbase(k3d::uuid(0x172c1208, 0xd24430f5, 0x63f70388, 0x1945866e),\n\t\t\t\"VirtualOpenGLEdgePainter\",\n\t\t\t_(\"Renders mesh edges\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE),\n\t\tdelegate(0)\n\t{\n\t\t// Note ... this ctor may be executed before k3d::application is initialized, so\n\t\t// we can't do very much here\n\t}\n\n\tk3d::inode* create_plugin(k3d::iplugin_factory& Factory, k3d::idocument& Document)\n\t{\n\t\tif(!delegate)\n\t\t{\n\t\t\tif(k3d::gl::extension::query_vbo())\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLVBOEdgePainter\"));\n\n\t\t\tif(!delegate)\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLEdgePainter\"));\n\n\t\t\tif(delegate)\n\t\t\t\tk3d::log() << info << this->name() << \" delegating to \" << dynamic_cast<k3d::iplugin_factory*>(delegate)->name() << std::endl;\n\t\t}\n\n\t\treturn_val_if_fail(delegate, 0);\n\t\treturn delegate->create_plugin(*this, Document);\n\t}\n\nprivate:\n\tk3d::idocument_plugin_factory* delegate;\n};\n\nk3d::iplugin_factory& edge_painter_factory()\n{\n\tstatic virtual_edge_painter_factory instance;\n\treturn instance;\n}\n\n} // namespace virtual_painters\n\n} // namespace gl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/virtual_opengl_painters/face_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/virtual_document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace gl\n{\n\nnamespace virtual_painters\n{\n\nclass virtual_face_painter_factory:\n\tpublic k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> >\n{\n\ttypedef k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> > base;\n\npublic:\n\tvirtual_face_painter_factory() :\n\t\tbase(k3d::uuid(0x7e6e8354, 0x604f05ae, 0x1d4d658b, 0x96538240),\n\t\t\t\"VirtualOpenGLFacePainter\",\n\t\t\t_(\"Renders mesh faces\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE),\n\t\tdelegate(0)\n\t{\n\t\t// Note ... this ctor may be executed before k3d::application is initialized, so\n\t\t// we can't do very much here\n\t}\n\n\tk3d::inode* create_plugin(k3d::iplugin_factory& Factory, k3d::idocument& Document)\n\t{\n\t\tif(!delegate)\n\t\t{\n\t\t\tif(k3d::gl::extension::query_vbo())\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLVBOFacePainter\"));\n\n\t\t\tif(!delegate)\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLFacePainter\"));\n\n\t\t\tif(delegate)\n\t\t\t\tk3d::log() << info << this->name() << \" delegating to \" << dynamic_cast<k3d::iplugin_factory*>(delegate)->name() << std::endl;\n\t\t}\n\n\t\treturn_val_if_fail(delegate, 0);\n\t\treturn delegate->create_plugin(*this, Document);\n\t}\n\nprivate:\n\tk3d::idocument_plugin_factory* delegate;\n};\n\nk3d::iplugin_factory& face_painter_factory()\n{\n\tstatic virtual_face_painter_factory instance;\n\treturn instance;\n}\n\n} // namespace virtual_painters\n\n} // namespace gl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/virtual_opengl_painters/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace gl\n{\n\nnamespace virtual_painters\n{\n\nextern k3d::iplugin_factory& edge_painter_factory();\nextern k3d::iplugin_factory& face_painter_factory();\nextern k3d::iplugin_factory& point_painter_factory();\nextern k3d::iplugin_factory& sds_edge_painter_factory();\nextern k3d::iplugin_factory& sds_face_painter_factory();\nextern k3d::iplugin_factory& sds_point_painter_factory();\n\n} // namespace virtual_painters\n\n} // namespace gl\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::gl::virtual_painters::edge_painter_factory());\n\tRegistry.register_factory(module::gl::virtual_painters::face_painter_factory());\n\tRegistry.register_factory(module::gl::virtual_painters::point_painter_factory());\n\tRegistry.register_factory(module::gl::virtual_painters::sds_edge_painter_factory());\n\tRegistry.register_factory(module::gl::virtual_painters::sds_face_painter_factory());\n\tRegistry.register_factory(module::gl::virtual_painters::sds_point_painter_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/virtual_opengl_painters/point_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/virtual_document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace gl\n{\n\nnamespace virtual_painters\n{\n\nclass virtual_point_painter_factory:\n\tpublic k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> >\n{\n\ttypedef k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> > base;\n\npublic:\n\tvirtual_point_painter_factory() :\n\t\tbase(k3d::uuid(0x7e376143, 0xb640c3f4, 0x288543a0, 0x57f83514),\n\t\t\t\"VirtualOpenGLPointPainter\",\n\t\t\t_(\"Renders mesh points\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE),\n\t\tdelegate(0)\n\t{\n\t\t// Note ... this ctor may be executed before k3d::application is initialized, so\n\t\t// we can't do very much here\n\t}\n\n\tk3d::inode* create_plugin(k3d::iplugin_factory& Factory, k3d::idocument& Document)\n\t{\n\t\tif(!delegate)\n\t\t{\n\t\t\tif(k3d::gl::extension::query_vbo())\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLVBOPointPainter\"));\n\n\t\t\tif(!delegate)\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLPointPainter\"));\n\n\t\t\tif(delegate)\n\t\t\t\tk3d::log() << info << this->name() << \" delegating to \" << dynamic_cast<k3d::iplugin_factory*>(delegate)->name() << std::endl;\n\t\t}\n\n\t\treturn_val_if_fail(delegate, 0);\n\t\treturn delegate->create_plugin(*this, Document);\n\t}\n\nprivate:\n\tk3d::idocument_plugin_factory* delegate;\n};\n\nk3d::iplugin_factory& point_painter_factory()\n{\n\tstatic virtual_point_painter_factory instance;\n\treturn instance;\n}\n\n} // namespace virtual_painters\n\n} // namespace gl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/virtual_opengl_painters/sds_edge_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/virtual_document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace gl\n{\n\nnamespace virtual_painters\n{\n\nclass virtual_sds_edge_painter_factory:\n\tpublic k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> >\n{\n\ttypedef k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> > base;\n\npublic:\n\tvirtual_sds_edge_painter_factory() :\n\t\tbase(k3d::uuid(0x6c827fec, 0xd74ffc1c, 0x79ba768f, 0xfc8fa4d5),\n\t\t\t\"VirtualOpenGLSDSEdgePainter\",\n\t\t\t_(\"Renders mesh subdivision surface edges\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE),\n\t\tdelegate(0)\n\t{\n\t\t// Note ... this ctor may be executed before k3d::application is initialized, so\n\t\t// we can't do very much here\n\t}\n\n\tk3d::inode* create_plugin(k3d::iplugin_factory& Factory, k3d::idocument& Document)\n\t{\n\t\tif(!delegate)\n\t\t{\n\t\t\tif(k3d::gl::extension::query_vbo())\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLVBOSDSEdgePainter\"));\n\n\t\t\tif(!delegate)\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLSDSEdgePainter\"));\n\n\t\t\tif(delegate)\n\t\t\t\tk3d::log() << info << this->name() << \" delegating to \" << dynamic_cast<k3d::iplugin_factory*>(delegate)->name() << std::endl;\n\t\t}\n\n\t\treturn_val_if_fail(delegate, 0);\n\t\treturn delegate->create_plugin(*this, Document);\n\t}\n\nprivate:\n\tk3d::idocument_plugin_factory* delegate;\n};\n\nk3d::iplugin_factory& sds_edge_painter_factory()\n{\n\tstatic virtual_sds_edge_painter_factory instance;\n\treturn instance;\n}\n\n} // namespace virtual_painters\n\n} // namespace gl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/virtual_opengl_painters/sds_face_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/virtual_document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace gl\n{\n\nnamespace virtual_painters\n{\n\nclass virtual_sds_face_painter_factory:\n\tpublic k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> >\n{\n\ttypedef k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> > base;\n\npublic:\n\tvirtual_sds_face_painter_factory() :\n\t\tbase(k3d::uuid(0x9d4043c8, 0x864fe71b, 0x38706d85, 0x8b60af0c),\n\t\t\t\"VirtualOpenGLSDSFacePainter\",\n\t\t\t_(\"Renders mesh subdivision surface faces\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE),\n\t\tdelegate(0)\n\t{\n\t\t// Note ... this ctor may be executed before k3d::application is initialized, so\n\t\t// we can't do very much here\n\t}\n\n\tk3d::inode* create_plugin(k3d::iplugin_factory& Factory, k3d::idocument& Document)\n\t{\n\t\tif(!delegate)\n\t\t{\n\t\t\tif(k3d::gl::extension::query_vbo())\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLVBOSDSFacePainter\"));\n\n\t\t\tif(!delegate)\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLSDSFacePainter\"));\n\n\t\t\tif(delegate)\n\t\t\t\tk3d::log() << info << this->name() << \" delegating to \" << dynamic_cast<k3d::iplugin_factory*>(delegate)->name() << std::endl;\n\t\t}\n\n\t\treturn_val_if_fail(delegate, 0);\n\t\treturn delegate->create_plugin(*this, Document);\n\t}\n\nprivate:\n\tk3d::idocument_plugin_factory* delegate;\n};\n\nk3d::iplugin_factory& sds_face_painter_factory()\n{\n\tstatic virtual_sds_face_painter_factory instance;\n\treturn instance;\n}\n\n} // namespace virtual_painters\n\n} // namespace gl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/virtual_opengl_painters/sds_point_painter.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/gl/extension.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/imesh_painter_gl.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/virtual_document_plugin_factory.h>\n\nnamespace module\n{\n\nnamespace gl\n{\n\nnamespace virtual_painters\n{\n\nclass virtual_sds_point_painter_factory:\n\tpublic k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> >\n{\n\ttypedef k3d::virtual_document_plugin_factory<k3d::interface_list<k3d::gl::imesh_painter> > base;\n\npublic:\n\tvirtual_sds_point_painter_factory() :\n\t\tbase(k3d::uuid(0x46db8236, 0xa1408c58, 0xd829ceba, 0xffe78fca),\n\t\t\t\"VirtualOpenGLSDSPointPainter\",\n\t\t\t_(\"Renders mesh subdivision surface points\"),\n\t\t\t\"OpenGL Painter\",\n\t\t\tk3d::iplugin_factory::STABLE),\n\t\tdelegate(0)\n\t{\n\t\t// Note ... this ctor may be executed before k3d::application is initialized, so\n\t\t// we can't do very much here\n\t}\n\n\tk3d::inode* create_plugin(k3d::iplugin_factory& Factory, k3d::idocument& Document)\n\t{\n\t\tif(!delegate)\n\t\t{\n\t\t\tif(k3d::gl::extension::query_vbo())\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLVBOSDSPointPainter\"));\n\n\t\t\tif(!delegate)\n\t\t\t\tdelegate = dynamic_cast<k3d::idocument_plugin_factory*>(k3d::plugin::factory::lookup(\"OpenGLSDSPointPainter\"));\n\n\t\t\tif(delegate)\n\t\t\t\tk3d::log() << info << this->name() << \" delegating to \" << dynamic_cast<k3d::iplugin_factory*>(delegate)->name() << std::endl;\n\t\t}\n\n\t\treturn_val_if_fail(delegate, 0);\n\t\treturn delegate->create_plugin(*this, Document);\n\t}\n\nprivate:\n\tk3d::idocument_plugin_factory* delegate;\n};\n\nk3d::iplugin_factory& sds_point_painter_factory()\n{\n\tstatic virtual_sds_point_painter_factory instance;\n\treturn instance;\n}\n\n} // namespace virtual_painters\n\n} // namespace gl\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/wgl/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-wgl)\nK3D_CREATE_MODULE_PROXY(k3d-wgl)\n\nTARGET_LINK_LIBRARIES(k3d-wgl gdi32.lib)\n\n"
  },
  {
    "path": "modules/wgl/camera_to_bitmap.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/bitmap_source.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/irender_viewport_gl.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/win32.h>\n\n#include <iterator>\n\nnamespace module\n{\n\nnamespace wgl\n{\n\nclass CGLBitmapContext\n{\nprotected:\n\tBITMAPINFO m_bmi;\n\tHBITMAP m_hBitmap;\n\tvoid *m_pBits;\n\tHDC m_hDC, m_hOldDC;\n\tHGLRC m_hGLRC, m_hOldGLRC;\n\npublic:\n\tCGLBitmapContext()\n\t{\n\t}\n\n\tint GetWidth()\n\t{\n\t\treturn m_bmi.bmiHeader.biWidth; \n\t}\n\n\tint GetHeight() \n\t{ \n\t\treturn m_bmi.bmiHeader.biHeight; \n\t}\n\n\tbool ChoosePixelFormat()\n\t{\n\t\tint nMaxWeight = 0;\n\t\tint nBestFormat = 0;\n\t\tint nPixelFormat = 1;\n\t\tPIXELFORMATDESCRIPTOR pfdDesc;\n\t\tDWORD dwRequiredFlags = PFD_DRAW_TO_BITMAP | PFD_GENERIC_FORMAT | PFD_SUPPORT_OPENGL | PFD_SUPPORT_GDI;\n\t\tDWORD dwRejectedFlags = PFD_GENERIC_ACCELERATED;\n\t\twhile(DescribePixelFormat(m_hDC, nPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfdDesc))\n\t\t{\n\t\t\tif(pfdDesc.cColorBits == 24 && pfdDesc.iLayerType == PFD_TYPE_RGBA && (pfdDesc.dwFlags & dwRequiredFlags) == dwRequiredFlags && (pfdDesc.dwFlags & dwRejectedFlags) == 0)\n\t\t\t{\n\t\t\t\tint nWeight = pfdDesc.cColorBits * 8 + pfdDesc.cDepthBits * 4 + pfdDesc.cStencilBits + pfdDesc.cAccumBits;\n\t\t\t\tif(nWeight > nMaxWeight)\n\t\t\t\t{\n\t\t\t\t\tnMaxWeight = nWeight;\n\t\t\t\t\tnBestFormat = nPixelFormat;\n\t\t\t\t}\n\t\t\t}\n\t\t\tnPixelFormat++;\n\t\t}\n\t\tif(nBestFormat && ::SetPixelFormat(m_hDC, nBestFormat, &pfdDesc))\n\t\t\treturn true;\n\n\t\treturn false;\n\t}\n\n\tbool Init(HDC hWindowDC, int nWidth, int nHeight)\n\t{\n\t\t// Create the bitmap for this OpenGL context\n\t\tmemset(&m_bmi, 0, sizeof(BITMAPINFO));\n\t\tm_bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\n\t\tm_bmi.bmiHeader.biWidth = nWidth;\n\t\tm_bmi.bmiHeader.biHeight = nHeight;\n\t\tm_bmi.bmiHeader.biPlanes = 1;\n\t\tm_bmi.bmiHeader.biBitCount = 24;\n\t\tm_bmi.bmiHeader.biCompression = BI_RGB;\n\t\tm_bmi.bmiHeader.biSizeImage = nWidth * nHeight * 3;\n\t\tm_hBitmap = ::CreateDIBSection(hWindowDC, &m_bmi, DIB_RGB_COLORS, &m_pBits, NULL, (DWORD)0);\n\n\t\t// Create the memory DC for the OpenGL context\n\t\tm_hDC = ::CreateCompatibleDC(NULL);\n\t\t::SelectObject(m_hDC, ::GetCurrentObject(hWindowDC, OBJ_FONT));\n\t\t::SelectObject(m_hDC, m_hBitmap);\n\n\t\t// Select a software-rendering pixel format that supports drawing to a bitmap\n\t\t// (Must be 24-bit color because the bitmap is 24-bit color)\n\t\tif(!ChoosePixelFormat())\n\t\t\treturn false;\n\n\t\t// Initialize the OpenGL context\n\t\tm_hGLRC = ::wglCreateContext(m_hDC);\n\t\tm_hOldDC = ::wglGetCurrentDC();\n\t\tm_hOldGLRC = ::wglGetCurrentContext();\n\t\t::wglMakeCurrent(m_hDC, m_hGLRC);\n\n/*\n\t\t// Initialize the CGLFont object and set up the viewport\n\t\tglViewport(0, 0, nWidth, nHeight);\n\t\tglMatrixMode(GL_PROJECTION);\n\t\tglLoadIdentity();\n\t\tgluOrtho2D(0, nWidth, 0, nHeight);\n\t\tglMatrixMode(GL_MODELVIEW);\n\t\tglLoadIdentity();\n*/\n\t\treturn true;\n\t}\n\n\tvoid Cleanup()\n\t{\n\t\t::wglMakeCurrent(NULL, NULL);\n\t\t::wglDeleteContext(m_hGLRC);\n\t\t::wglMakeCurrent(m_hOldDC, m_hOldGLRC);\n\t\t::DeleteObject(m_hBitmap);\n\t\t::DeleteDC(m_hDC);\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// camera_to_bitmap\n\nclass camera_to_bitmap :\n\tpublic k3d::node,\n\tpublic k3d::bitmap_source<camera_to_bitmap>\n{\n\ttypedef k3d::node base;\n\npublic:\n\tcamera_to_bitmap(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_camera(init_owner(*this) + init_name(\"camera\") + init_label(_(\"Camera\")) + init_description(_(\"Camera\")) + init_value<k3d::icamera*>(0)),\n\t\tm_render_engine(init_owner(*this) + init_name(\"render_engine\") + init_label(_(\"Render Engine\")) + init_description(_(\"Render Engine\")) + init_value<k3d::gl::irender_viewport*>(0)),\n\t\tm_width(init_owner(*this) + init_name(\"width\") + init_label(_(\"Width\")) + init_description(_(\"Bitmap width\")) + init_value(256L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_height(init_owner(*this) + init_name(\"height\") + init_label(_(\"Height\")) + init_description(_(\"Bitmap height\")) + init_value(256L) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1)))\n\t{\n\t\tm_camera.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\n\t\tm_render_engine.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(make_update_bitmap_slot()));\n\n\t\tm_width.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_dimensions_changed> >(make_update_bitmap_slot()));\n\n\t\tm_height.changed_signal().connect(k3d::hint::converter<\n\t\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_dimensions_changed> >(make_update_bitmap_slot()));\n\t}\n\n\tvoid on_resize_bitmap(k3d::bitmap& Output)\n\t{\n\t\tconst k3d::pixel_size_t width = m_width.pipeline_value();\n\t\tconst k3d::pixel_size_t height = m_height.pipeline_value();\n\t\tOutput.recreate(width, height);\n\t}\n\n\tvoid on_assign_pixels(k3d::bitmap& Output)\n\t{\n\t\tk3d::icamera* const camera = m_camera.pipeline_value();\n\t\tk3d::gl::irender_viewport* const render_engine = m_render_engine.pipeline_value();\n\t\tconst k3d::pixel_size_t width = m_width.pipeline_value();\n\t\tconst k3d::pixel_size_t height = m_height.pipeline_value();\n\n\t\tif(camera && render_engine)\n\t\t{\n\t\t\tCGLBitmapContext voodoo;\n\t\t\treturn_if_fail(voodoo.Init(0, width, height));\n\t\n\t\t\tglViewport(0, 0, width, height);\n\n\t\t\tGLdouble gl_view_matrix[16];\n\t\t\tGLdouble gl_projection_matrix[16];\n\t\t\tGLint gl_viewport[4];\n\n\t\t\trender_engine->render_viewport(*camera, width, height, gl_view_matrix, gl_projection_matrix, gl_viewport);\n\t\t\tglFlush();\n\n\t\t\tboost::gil::image<boost::gil::rgba8_pixel_t, false> buffer(width, height);\n\t\t\tglPixelStorei(GL_PACK_SWAP_BYTES, GL_FALSE);\n\t\t\tglPixelStorei(GL_PACK_LSB_FIRST, GL_FALSE);\n\t\t\tglPixelStorei(GL_PACK_ROW_LENGTH, 0);\n\t\t\tglPixelStorei(GL_PACK_SKIP_ROWS, 0);\n\t\t\tglPixelStorei(GL_PACK_SKIP_PIXELS, 0);\n\t\t\tglPixelStorei(GL_PACK_ALIGNMENT, 1);\n\t\t\tglReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, &view(buffer)[0]);\n\n\t\t\tboost::gil::copy_pixels(boost::gil::flipped_up_down_view(boost::gil::color_converted_view<boost::gil::rgba16_pixel_t>(view(buffer))), view(Output));\n\n\t\t\tvoodoo.Cleanup();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstd::fill(view(Output).begin(), view(Output).end(), k3d::pixel(0.6, 0.6, 0.6, 1.0));\n\t\t}\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<camera_to_bitmap,\n\t\t\tk3d::interface_list<k3d::ibitmap_source> > factory(\n\t\t\t\tk3d::uuid(0x98fe4606, 0x404f2e76, 0xa8836097, 0x26b6be8a),\n\t\t\t\t\"WGLCameraToBitmap\",\n\t\t\t\t_(\"Renders the scene to a bitmap using WGL\"),\n\t\t\t\t\"Bitmap Test\",\n\t\t\t\tk3d::iplugin_factory::EXPERIMENTAL);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::icamera*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_camera;\n\tk3d_data(k3d::gl::irender_viewport*, immutable_name, change_signal, with_undo, node_storage, no_constraint, node_property, node_serialization) m_render_engine;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_width;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_height;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// camera_to_bitmap_factory\n\nk3d::iplugin_factory& camera_to_bitmap_factory()\n{\n\treturn camera_to_bitmap::get_factory();\n}\n\n} // namespace wgl\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/wgl/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for wgl plugin module, to protect public symbols from name clashes with other modules\nnamespace wgl\n{\n\nextern k3d::iplugin_factory& camera_to_bitmap_factory();\n\n} // namespace wgl\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::wgl::camera_to_bitmap_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/windows/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-windows)\nK3D_CREATE_MODULE_PROXY(k3d-windows)\n\n"
  },
  {
    "path": "modules/windows/disable_desktop_composition.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/iunknown.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/win32.h>\n\n#include <boost/assign/list_of.hpp>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace windows\n{\n\n/// Disables desktop composition on Vista when instantiated.\n/// Thanks to Yaroukh from the forum and someone with nick \"Wojta\" for pointing out \"Desktop Composition\" was the problem.\nclass disable_desktop_composition : public k3d::iunknown\n{\n\ttypedef HRESULT (*DwmEnableComposition_t)(k3d::uint_t);\npublic:\n\tdisable_desktop_composition()\n\t{\n\t\tHINSTANCE library = ::LoadLibrary(\"dwmapi.dll\");\n\t\tif (library != 0)\n\t\t{\n\t\t\tDwmEnableComposition_t DwmEnableComposition = DwmEnableComposition_t(::GetProcAddress(library, \"DwmEnableComposition\"));\n\t\t\tif (DwmEnableComposition != 0)\n\t\t\t{\n\t\t\t\tHRESULT result = DwmEnableComposition(0);\n\t\t\t\tif (result != S_OK)\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << error << \"Failed to disable Vista Desktop Composition\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse \n\t\t\t{\n\t\t\t\tk3d::log() << error << \"Failed to find the DwmEnableComposition function\" << std::endl; \n\t\t\t}\n\t\t\t::FreeLibrary(library);\n\t\t}\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t\t{\n\t\t\tstatic k3d::application_plugin_factory<disable_desktop_composition,\n\t\t\t\tk3d::interface_list<k3d::iunknown> > factory(\n\t\t\t\t\tk3d::uuid(0xecd15ac7, 0x4abf42ca, 0x9ec918a4, 0xbdf4b9de),\n\t\t\t\t\t\"WindowsDisableDesktopComposition\",\n\t\t\t\t\t_(\"Disables Desktop Composition on Vista\"),\n\t\t\t\t\t\"Desktop\",\n\t\t\t\t\tk3d::iplugin_factory::STABLE,\n\t\t\t\t\tboost::assign::map_list_of(\"ngui:application-start\", \"true\")(\"qtui:application-start\", \"true\"));\n\n\t\t\treturn factory;\n\t\t}\n};\n\nk3d::iplugin_factory& disable_desktop_composition_factory()\n{\n\treturn disable_desktop_composition::get_factory();\n}\n\n} // namespace windows\n\n} // namespace module\n"
  },
  {
    "path": "modules/windows/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the windows plugin module, to protect public symbols from name clashes with other modules\nnamespace windows\n{\n\nextern k3d::iplugin_factory& uri_handler_factory();\nextern k3d::iplugin_factory& disable_desktop_composition_factory();\n\n} // namespace windows\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::windows::uri_handler_factory());\n\tRegistry.register_factory(module::windows::disable_desktop_composition_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/windows/uri_handler.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/iuri_handler.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/result.h>\n#include <k3dsdk/win32.h>\n\n#include <iostream>\n\nnamespace module\n{\n\nnamespace windows\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// uri_handler\n\n/// Uses the Win32 API to open a URI in the user's preferred application\nclass uri_handler :\n\tpublic k3d::iuri_handler\n{\npublic:\n\turi_handler()\n\t{\n\t}\n\n\tvirtual ~uri_handler()\n\t{\n\t}\n\n\tbool open_uri(const std::string& URI)\n\t{\n\t\tk3d::log() << info << \"URI: \" << URI << std::endl;\n\t\treturn_val_if_fail(reinterpret_cast<int>(ShellExecute(0, \"open\", URI.c_str(), 0, 0, SW_SHOWDEFAULT)) > 32, false);\n\t\treturn true;\n\t}\n\t\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<uri_handler,\n\t\t\tk3d::interface_list<k3d::iuri_handler> > factory(\n\t\t\t\tk3d::uuid(0x35151cfa, 0x104c40df, 0xaef69401, 0xd6bf1754),\n\t\t\t\t\"WindowsURIHandler\",\n\t\t\t\t_(\"Opens a URI using the Windows API\"),\n\t\t\t\t\"Desktop\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// uri_handler_factory\n\nk3d::iplugin_factory& uri_handler_factory()\n{\n\treturn uri_handler::get_factory();\n}\n\n} // namespace windows\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/xtrackcad/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-xtrackcad)\nK3D_CREATE_MODULE_PROXY(k3d-xtrackcad)\n\n"
  },
  {
    "path": "modules/xtrackcad/document_importer.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/application_plugin_factory.h>\n#include <k3dsdk/file_helpers.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/idocument_importer.h>\n#include <k3dsdk/imesh_storage.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/mesh.h>\n#include <k3dsdk/nurbs_curve.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/plugin.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/types.h>\n\n#include <boost/algorithm/string.hpp>\n#include <boost/assign/list_of.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <stack>\n\nnamespace module\n{\n\nnamespace xtrackcad\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// document_importer\n\t\nclass document_importer :\n\tpublic k3d::idocument_importer\n{\npublic:\n\tk3d::imetadata::metadata_t get_file_metadata(const k3d::filesystem::path& File)\n\t{\n\t\treturn k3d::imetadata::metadata_t();\n\t}\n\n\tk3d::bool_t read_file(const k3d::filesystem::path& File, k3d::idocument& Document)\n\t{\n\t\ttry\n\t\t{\n\t\t\tk3d::log() << info << \"Reading \" << File.native_console_string() << \" using \" << get_factory().name() << std::endl;\n\n\t\t\tk3d::imesh_storage* const track_source = k3d::plugin::create<k3d::imesh_storage>(\"FrozenMesh\", Document, \"Track\");\n\t\t\tif(!track_source)\n\t\t\t\tthrow std::runtime_error(\"Error creating track source.\");\n\n\t\t\tk3d::iunknown* const track_instance = k3d::plugin::create(\"MeshInstance\", Document, \"Track Instance\");\n\t\t\tif(!track_instance)\n\t\t\t\tthrow std::runtime_error(\"Error creating track instance.\");\n\n\t\t\tk3d::inode* const track_painter = k3d::plugin::create<k3d::inode>(\"OpenGLNURBSCurvePainter\", Document, \"Track Painter\");\n\t\t\tif(!track_painter)\n\t\t\t\tthrow std::runtime_error(\"Error creating track painter.\");\n\n\t\t\tk3d::property::connect(\n\t\t\t\tDocument,\n\t\t\t\t*k3d::property::get(*track_source, \"output_mesh\"),\n\t\t\t\t*k3d::property::get(*track_instance, \"input_mesh\"));\n\n\t\t\tk3d::property::set_internal_value(*track_instance, \"gl_painter\", track_painter);\n\n\t\t\tk3d::mesh* const track_mesh = new k3d::mesh();\n\t\t\ttrack_source->reset_mesh(track_mesh);\n\t\t\ttrack_mesh->points.create();\n\t\t\ttrack_mesh->point_selection.create();\n\n\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> track_curves(k3d::nurbs_curve::create(*track_mesh));\n\t\t\ttrack_curves->material.push_back(0);\n\n\t\t\tstd::stack<k3d::matrix4> transformation;\n\t\t\ttransformation.push(k3d::scale3(1, -1, 1) * k3d::identity3());\n\n\t\t\tk3d::filesystem::ifstream stream(File);\n\t\t\twhile(true)\n\t\t\t{\n\t\t\t\tstd::stringstream line;\n\t\t\t\tk3d::getline(stream, line);\n\n\t\t\t\tif(!stream)\n\t\t\t\t\tbreak;\n\n\t\t\t\tk3d::string_t token;\n\t\t\t\tline >> std::skipws >> token;\n\n\t\t\t\tif(token.empty())\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif(boost::algorithm::starts_with(token, \"#\"))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif(token == \"TITLE1\")\n\t\t\t\t{\n\t\t\t\t\tk3d::string_t title;\n\t\t\t\t\tk3d::getline(line, title);\n\t\t\t\t\tboost::algorithm::trim(title);\n\n\t\t\t\t\tk3d::iunknown* const annotation = k3d::plugin::create(\"Annotation2D\", Document, \"Layout Title\");\n\t\t\t\t\tif(!annotation)\n\t\t\t\t\t\tthrow std::runtime_error(\"Error creating title annotation.\");\n\n\t\t\t\t\tk3d::property::set_internal_value(*annotation, \"font_size\", 18.0);\n\t\t\t\t\tk3d::property::set_internal_value(*annotation, \"line_width\", 400.0);\n\t\t\t\t\tk3d::property::set_internal_value(*annotation, \"text\", title);\n\t\t\t\t\tk3d::property::set_internal_value(*annotation, \"x\", -0.9);\n\t\t\t\t\tk3d::property::set_internal_value(*annotation, \"y\", 0.9);\n\t\t\t\t}\n\t\t\t\telse if(token == \"TITLE2\")\n\t\t\t\t{\n\t\t\t\t\tk3d::string_t title;\n\t\t\t\t\tk3d::getline(line, title);\n\t\t\t\t\tboost::algorithm::trim(title);\n\n\t\t\t\t\tk3d::iunknown* const annotation = k3d::plugin::create(\"Annotation2D\", Document, \"Layout Secondary Title\");\n\t\t\t\t\tif(!annotation)\n\t\t\t\t\t\tthrow std::runtime_error(\"Error creating secondary title annotation.\");\n\n\t\t\t\t\tk3d::property::set_internal_value(*annotation, \"font_size\", 14.0);\n\t\t\t\t\tk3d::property::set_internal_value(*annotation, \"line_width\", 400.0);\n\t\t\t\t\tk3d::property::set_internal_value(*annotation, \"text\", title);\n\t\t\t\t\tk3d::property::set_internal_value(*annotation, \"x\", -0.9);\n\t\t\t\t\tk3d::property::set_internal_value(*annotation, \"y\", 0.82);\n\t\t\t\t}\n\t\t\t\telse if(token == \"ROOMSIZE\")\n\t\t\t\t{\n\t\t\t\t\tk3d::double_t width = 0;\n\t\t\t\t\tk3d::string_t separator;\n\t\t\t\t\tk3d::double_t height = 0;\t\n\t\t\t\t\tline >> width >> separator >> height;\n\n\t\t\t\t\tk3d::imesh_storage* const source = k3d::plugin::create<k3d::imesh_storage>(\"FrozenMesh\", Document, \"Room\");\n\t\t\t\t\tif(!source)\n\t\t\t\t\t\tthrow std::runtime_error(\"Error creating room source.\");\n\n\t\t\t\t\tk3d::iunknown* const instance = k3d::plugin::create(\"MeshInstance\", Document, \"Room Instance\");\n\t\t\t\t\tif(!instance)\n\t\t\t\t\t\tthrow std::runtime_error(\"Error creating room instance.\");\n\n\t\t\t\t\tk3d::inode* const painter = k3d::plugin::create<k3d::inode>(\"OpenGLNURBSCurvePainter\", Document, \"Room Painter\");\n\t\t\t\t\tif(!painter)\n\t\t\t\t\t\tthrow std::runtime_error(\"Error creating room painter.\");\n\n\t\t\t\t\tk3d::property::connect(\n\t\t\t\t\t\tDocument,\n\t\t\t\t\t\t*k3d::property::get(*source, \"output_mesh\"),\n\t\t\t\t\t\t*k3d::property::get(*instance, \"input_mesh\"));\n\n\t\t\t\t\tk3d::property::set_internal_value(*instance, \"gl_painter\", painter);\n\n\t\t\t\t\tk3d::mesh* const mesh = new k3d::mesh();\n\t\t\t\t\tsource->reset_mesh(mesh);\n\t\t\t\t\tmesh->points.create();\n\t\t\t\t\tmesh->point_selection.create();\n\n\t\t\t\t\tboost::scoped_ptr<k3d::nurbs_curve::primitive> curves(k3d::nurbs_curve::create(*mesh));\n\n\t\t\t\t\tk3d::mesh::points_t points;\n\t\t\t\t\tpoints.push_back(transformation.top() * k3d::point3(0, 0, 0));\n\t\t\t\t\tpoints.push_back(transformation.top() * k3d::point3(width, 0, 0));\n\t\t\t\t\tpoints.push_back(transformation.top() * k3d::point3(width, height, 0));\n\t\t\t\t\tpoints.push_back(transformation.top() * k3d::point3(0, height, 0));\n\t\t\t\t\tk3d::nurbs_curve::add_curve(*mesh, *curves, 2, points, 1);\n\n\t\t\t\t\tcurves->material.push_back(0);\n\t\t\t\t}\n\t\t\t\telse if(token == \"STRAIGHT\" || token == \"JOINT\")\n\t\t\t\t{\n\t\t\t\t\tk3d::mesh::points_t points;\n\n\t\t\t\t\twhile(true)\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::stringstream line;\n\t\t\t\t\t\tk3d::getline(stream, line);\n\n\t\t\t\t\t\tk3d::string_t token;\n\t\t\t\t\t\tline >> std::skipws >> token;\n\n\t\t\t\t\t\tif(token == \"END\")\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tif(!stream)\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tif(token == \"E\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::point3 point(0, 0, 0);\n\t\t\t\t\t\t\tline >> point[0] >> point[1];\n\t\t\t\t\t\t\tpoints.push_back(transformation.top() * point);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(token == \"T\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::uint_t index = 0;\n\t\t\t\t\t\t\tk3d::point3 point(0, 0, 0);\n\t\t\t\t\t\t\tline >> index >> point[0] >> point[1];\n\t\t\t\t\t\t\tpoints.push_back(transformation.top() * point);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::log() << warning << \"Unhandled token: \" << token << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(points.size() < 2)\n\t\t\t\t\t\tthrow std::runtime_error(\"Track section requires at least two points.\");\n\n\t\t\t\t\tk3d::nurbs_curve::add_curve(*track_mesh, *track_curves, 2, points);\n\t\t\t\t}\n\t\t\t\telse if(token == \"CURVE\")\n\t\t\t\t{\n\t\t\t\t\tk3d::uint_t index = 0;\n\t\t\t\t\tk3d::uint_t unused;\n\t\t\t\t\tk3d::string_t scale;\n\t\t\t\t\tk3d::point3 center(0, 0, 0);\n\t\t\t\t\tk3d::double_t radius;\n\t\t\t\t\tline >> index >> unused >> unused >> unused >> unused;\n\t\t\t\t\tline >> scale >> unused >> center[0] >> center[1] >> unused >> radius;\n\t\t\t\t\tcenter = transformation.top() * center;\n\n\t\t\t\t\tk3d::mesh::points_t points;\n\t\t\t\t\tk3d::mesh::doubles_t angles;\n\n\t\t\t\t\twhile(true)\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::stringstream line;\n\t\t\t\t\t\tk3d::getline(stream, line);\n\n\t\t\t\t\t\tk3d::string_t token;\n\t\t\t\t\t\tline >> std::skipws >> token;\n\n\t\t\t\t\t\tif(token == \"END\")\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tif(!stream)\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tif(token == \"E\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::point3 point(0, 0, 0);\n\t\t\t\t\t\t\tk3d::double_t angle = 0;\n\t\t\t\t\t\t\tline >> point[0] >> point[1] >> angle;\n\t\t\t\t\t\t\tpoints.push_back(transformation.top() * point);\n\t\t\t\t\t\t\tangles.push_back(angle);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(token == \"T\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::uint_t index = 0;\n\t\t\t\t\t\t\tk3d::point3 point(0, 0, 0);\n\t\t\t\t\t\t\tk3d::double_t angle = 0;\n\t\t\t\t\t\t\tline >> index >> point[0] >> point[1] >> angle;\n\t\t\t\t\t\t\tpoints.push_back(transformation.top() * point);\n\t\t\t\t\t\t\tangles.push_back(angle);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::log() << warning << \"Unhandled token: \" << token << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(2 != points.size())\n\t\t\t\t\t\tthrow std::runtime_error(\"Curved track section requires exactly two endpoints.\");\n\n\t\t\t\t\tconst k3d::vector3 v0 = points[0] - center;\n\t\t\t\t\tconst k3d::vector3 v1 = points[1] - center;\n\n\t\t\t\t\tconst k3d::double_t angle0 = std::atan2(v0[1], v0[0]);\n\t\t\t\t\tconst k3d::double_t angle1 = std::atan2(v1[1], v1[0]);\n\n\t\t\t\t\tk3d::double_t start_angle = std::min(angle0, angle1);\n\t\t\t\t\tk3d::double_t end_angle = std::max(angle0, angle1);\n\n\t\t\t\t\t// This is a hack ... we assume that all curves are less than 180 degrees, which isn't always the case.\n\t\t\t\t\tif(end_angle - start_angle > k3d::pi())\n\t\t\t\t\t\tend_angle += k3d::pi_times_2();\n\n\t\t\t\t\tk3d::mesh::knots_t arc_knots;\n\t\t\t\t\tk3d::mesh::weights_t arc_weights;\n\t\t\t\t\tk3d::mesh::points_t arc_points;\n\t\t\t\t\tk3d::nurbs_curve::circular_arc(\n\t\t\t\t\t\tk3d::vector3(radius, 0, 0),\n\t\t\t\t\t\tk3d::vector3(0, radius, 0),\n\t\t\t\t\t\tstart_angle,\n\t\t\t\t\t\tend_angle,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\tarc_knots,\n\t\t\t\t\t\tarc_weights,\n\t\t\t\t\t\tarc_points);\n\n\t\t\t\t\tarc_points[0] = points[0];\n\t\t\t\t\tarc_points[1] = arc_points[1] + center;\n\t\t\t\t\tarc_points[2] = points[1];\n \n\t\t\t\t\tk3d::nurbs_curve::add_curve(*track_mesh, *track_curves, 3, arc_points, arc_weights, arc_knots);\n\t\t\t\t}\n\t\t\t\telse if(token == \"TURNOUT\")\n\t\t\t\t{\n\t\t\t\t\tk3d::uint_t index = 0;\n\t\t\t\t\tk3d::uint_t unused;\n\t\t\t\t\tk3d::string_t scale;\n\t\t\t\t\tk3d::vector3 origin(0, 0, 0);\n\t\t\t\t\tk3d::double_t angle = 0;\n\t\t\t\t\tline >> index >> unused >> unused >> unused >> unused;\n\t\t\t\t\tline >> scale >> unused >> origin[0] >> origin[1] >> unused >> angle;\n\n\t\t\t\t\ttransformation.push(transformation.top() * k3d::translate3(origin) * k3d::rotate3(k3d::radians(360.0 - angle), k3d::vector3(0, 0, 1)));\n\n\t\t\t\t\twhile(true)\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::stringstream line;\n\t\t\t\t\t\tk3d::getline(stream, line);\n\n\t\t\t\t\t\tk3d::string_t token;\n\t\t\t\t\t\tline >> std::skipws >> token;\n\n\t\t\t\t\t\tif(token == \"END\")\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tif(!stream)\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tif(token == \"S\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::string_t unused;\n\t\t\t\t\t\t\tk3d::point3 point0(0, 0, 0);\n\t\t\t\t\t\t\tk3d::point3 point1(0, 0, 0);\n\t\t\t\t\t\t\tline >> unused >> unused >> point0[0] >> point0[1] >> point1[0] >> point1[1];\n\n\t\t\t\t\t\t\tk3d::mesh::points_t points;\n\t\t\t\t\t\t\tpoints.push_back(transformation.top() * point0);\n\t\t\t\t\t\t\tpoints.push_back(transformation.top() * point1);\n\t\t\t\t\t\t\tk3d::nurbs_curve::add_curve(*track_mesh, *track_curves, 2, points);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(token == \"C\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::string_t unused;\n\t\t\t\t\t\t\tk3d::double_t radius = 0;\n\t\t\t\t\t\t\tk3d::vector3 center(0, 0, 0);\n\t\t\t\t\t\t\tk3d::double_t start_angle = 0;\n\t\t\t\t\t\t\tk3d::double_t swing_angle = 0;\n\t\t\t\t\t\t\tline >> unused >> unused >> radius >> center[0] >> center[1] >> start_angle >> swing_angle;\n\n\t\t\t\t\t\t\ttransformation.push(transformation.top() * k3d::translate3(center));\n\n\t\t\t\t\t\t\tstart_angle = 90.0 - start_angle;\n\t\t\t\t\t\t\tif(start_angle < 0.0)\n\t\t\t\t\t\t\t\tstart_angle += 180.0;\n\n\t\t\t\t\t\t\tk3d::double_t end_angle = start_angle - swing_angle;\n\n\t\t\t\t\t\t\tk3d::mesh::knots_t arc_knots;\n\t\t\t\t\t\t\tk3d::mesh::weights_t arc_weights;\n\t\t\t\t\t\t\tk3d::mesh::points_t arc_points;\n\t\t\t\t\t\t\tk3d::nurbs_curve::circular_arc(\n\t\t\t\t\t\t\t\tk3d::vector3(radius, 0, 0),\n\t\t\t\t\t\t\t\tk3d::vector3(0, radius, 0),\n\t\t\t\t\t\t\t\tk3d::radians(start_angle),\n\t\t\t\t\t\t\t\tk3d::radians(end_angle),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\tarc_knots,\n\t\t\t\t\t\t\t\tarc_weights,\n\t\t\t\t\t\t\t\tarc_points);\n\n\t\t\t\t\t\t\tarc_points[0] = transformation.top() * arc_points[0];\n\t\t\t\t\t\t\tarc_points[1] = transformation.top() * arc_points[1];\n\t\t\t\t\t\t\tarc_points[2] = transformation.top() * arc_points[2];\n\n\t\t\t\t\t\t\tk3d::nurbs_curve::add_curve(*track_mesh, *track_curves, 3, arc_points, arc_weights, arc_knots);\n\n\t\t\t\t\t\t\ttransformation.pop();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tk3d::log() << warning << \"Unhandled token: \" << token << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttransformation.pop();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tk3d::log() << warning << \"Unhandled token: \" << token << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << \"Caught exception: \" << e.what() << std::endl;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << \"Caught unknown exception.\" << std::endl;\n\t\t}\t\t\t\n\n\t\treturn false;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::application_plugin_factory<document_importer, k3d::interface_list<k3d::idocument_importer> > factory(\n\t\t\tk3d::uuid(0x3a086a52, 0x8d422391, 0x10c482a0, 0x1eafc053),\n\t\t\t\"XTrackCADDocumentImporter\",\n\t\t\t_(\"XTrackCAD Tracks File ( .xtc )\"),\n\t\t\t\"DocumentImporter\",\n\t\t\tk3d::iplugin_factory::EXPERIMENTAL,\n\t\t\tboost::assign::map_list_of(\"k3d:mime-types\", \"application/x-xtrackcad\"));\n\n\t\treturn factory;\n\t}\n};\n\nk3d::iplugin_factory& document_importer_factory()\n{\n\treturn document_importer::get_factory();\n}\n\n} // namespace xtrackcad\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/xtrackcad/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Timothy M. Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\nnamespace xtrackcad\n{\n\nextern k3d::iplugin_factory& document_importer_factory();\n\n} // namespace xtrackcad\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::xtrackcad::document_importer_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/yafray/CMakeLists.txt",
    "content": "K3D_BUILD_MODULE(k3d-yafray)\nK3D_CREATE_MODULE_PROXY(k3d-yafray)\n\n"
  },
  {
    "path": "modules/yafray/area_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead <tshead@k-3d.com>\n\t\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include \"lights.h\"\n\nnamespace module\n{\n\nnamespace yafray\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// area_light\n\nclass area_light :\n\tpublic colored_light<light<k3d::gl::renderable<k3d::transformable<k3d::node > > > >\n{\n\ttypedef colored_light<light<k3d::gl::renderable<k3d::transformable<k3d::node > > > > base;\n\npublic:\n\tarea_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_quadric(gluNewQuadric()),\n\t\tm_power(init_owner(*this) + init_name(\"power\") + init_label(_(\"power\")) + init_description(_(\"Power\")) + init_value(20.0)),\n\t\tm_samples(init_owner(*this) + init_name(\"samples\") + init_label(_(\"samples\")) + init_description(_(\"Samples\")) + init_value(256) + init_constraint(k3d::data::constraint::minimum<k3d::int32_t>(0, k3d::data::constraint::maximum<k3d::int32_t>(1024)))),\n\t\tm_psamples(init_owner(*this) + init_name(\"psamples\") + init_label(_(\"psamples\")) + init_description(_(\"PSamples\")) + init_value(256) + init_constraint(k3d::data::constraint::minimum<k3d::int32_t>(0, k3d::data::constraint::maximum<k3d::int32_t>(1024)))),\n\t\tm_dummy(init_owner(*this) + init_name(\"dummy\") + init_label(_(\"dummy\")) + init_description(_(\"Dummy (global photon)\")) + init_value(false))\n\t{\n\t}\n\n\t~area_light()\n\t{\n\t\tgluDeleteQuadric(m_quadric);\n\t}\n\n\tvoid setup_light(const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tif(!m_emit.pipeline_value())\n\t\t\treturn;\n\n\t\tconst k3d::color color = m_color.pipeline_value();\n\n\t\tconst k3d::matrix4 transformation = k3d::node_to_world_matrix(*this);\n\t\tconst k3d::point3 a = transformation * k3d::point3(-0.5, 0.5, 0);\n\t\tconst k3d::point3 b = transformation * k3d::point3(0.5, 0.5, 0);\n\t\tconst k3d::point3 c = transformation * k3d::point3(0.5, -0.5, 0);\n\t\tconst k3d::point3 d = transformation * k3d::point3(-0.5, -0.5, 0);\n\n\t\tStream << \"<!-- K-3D plugin: \" << factory().name() << \" name: \" << name() << \" -->\\n\";\n\t\tStream << \"<light type=\\\"arealight\\\" name=\\\"\" << Name << \"\\\" power=\\\"\" << m_power.pipeline_value() << \"\\\" samples=\\\"\" << m_samples.pipeline_value() << \"\\\" psamples=\\\"\" << m_psamples.pipeline_value() << \"\\\" dummy=\\\"\" << (m_dummy.pipeline_value() ? \"on\" : \"off\") << \"\\\">\\n\";\n\t\tStream << \"\t<a  x =\\\"\" << -a[0] << \"\\\" y =\\\"\" << a[1] << \"\\\" z =\\\"\" << a[2] << \"\\\"/>\\n\";\n\t\tStream << \"\t<b  x =\\\"\" << -b[0] << \"\\\" y =\\\"\" << b[1] << \"\\\" z =\\\"\" << b[2] << \"\\\"/>\\n\";\n\t\tStream << \"\t<c  x =\\\"\" << -c[0] << \"\\\" y =\\\"\" << c[1] << \"\\\" z =\\\"\" << c[2] << \"\\\"/>\\n\";\n\t\tStream << \"\t<d  x =\\\"\" << -d[0] << \"\\\" y =\\\"\" << d[1] << \"\\\" z =\\\"\" << d[2] << \"\\\"/>\\n\";\n\t\tStream << \"\t<color r=\\\"\" << color.red << \"\\\" g=\\\"\" << color.green << \"\\\" b=\\\"\" << color.blue << \"\\\"/>\\n\";\n\t\tStream << \"</light>\\n\";\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tconst bool emitting = m_emit.pipeline_value();\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\n\t\tif(emitting)\n\t\t\tglColor3d(1, 1, 1);\n\t\telse\n\t\t\tglColor3d(0, 0, 0);\n\n\t\tglLineWidth(1.0f);\n\t\tglDisable(GL_LINE_STIPPLE);\n\n\t\tglEnable(GL_LIGHTING);\n\t\tdraw_geometry(State.node_selection ? k3d::color(1, 0, 0) : k3d::color(0.4, 0.4, 0.4));\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_CULL_FACE);\n\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw_geometry(k3d::color(1, 1, 1));\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<area_light> factory(\n\t\t\tk3d::uuid(0x882e29b9, 0xc62a49da, 0x858cd48c, 0x43815d16),\n\t\t\t\"YafrayAreaLight\",\n\t\t\t_(\"Yafray Area Light\"),\n\t\t\t\"Yafray Light\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid draw_geometry(const k3d::color ArrowColor)\n\t{\n\t\tglBegin(GL_LINES);\n\n\t\tk3d::point3 coords(0, 0, 0);\n\n\t\tglVertex3d(coords[0] - 0.5, coords[1] + 0.5, coords[2]);\n\t\tglVertex3d(coords[0] + 0.5, coords[1] + 0.5, coords[2]);\n\n\t\tglVertex3d(coords[0] + 0.5, coords[1] + 0.5, coords[2]);\n\t\tglVertex3d(coords[0] + 0.5, coords[1] - 0.5, coords[2]);\n\n\t\tglVertex3d(coords[0] + 0.5, coords[1] - 0.5, coords[2]);\n\t\tglVertex3d(coords[0] - 0.5, coords[1] - 0.5, coords[2]);\n\n\t\tglVertex3d(coords[0] - 0.5, coords[1] - 0.5, coords[2]);\n\t\tglVertex3d(coords[0] - 0.5, coords[1] + 0.5, coords[2]);\n\n\t\tglEnd();\n\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, ArrowColor);\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n\t\tgluQuadricDrawStyle(m_quadric, GLU_FILL);\n\t\tgluQuadricNormals(m_quadric, GLU_SMOOTH);\n\t\tgluCylinder(m_quadric, 0.1, 0.001, 1, 8, 1);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(0, 0, 0.5));\n\t\tgluCylinder(m_quadric, 0.3, 0.001, 0.5, 8, 1);\n\t\tglPopMatrix();\n\t}\n\n\t/// Stores a GLU quadric object for drawing the manipulators\n\tGLUquadricObj* const m_quadric;\n\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_power;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_samples;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_psamples;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_dummy;\n};\n\nk3d::iplugin_factory& area_light_factory()\n{\n\treturn area_light::get_factory();\n}\n\n} // namespace yafray\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/yafray/global_photon_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead <tshead@k-3d.com>\n\t\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include \"lights.h\"\n\nnamespace module\n{\n\nnamespace yafray\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// global_photon_light\n\nclass global_photon_light :\n\tpublic photons<light<k3d::node > >\n{\n\ttypedef photons<light<k3d::node > > base;\n\npublic:\n\tglobal_photon_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"radius\")) + init_description(_(\"Radius\")) + init_value(2.0))\n\t{\n\t}\n\n\tvoid setup_light(const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tif(!m_emit.pipeline_value())\n\t\t\treturn;\n\n\t\tStream << \"<!-- K-3D plugin: \" << factory().name() << \" name: \" << name() << \" -->\\n\";\n\t\tStream << \"<light type=\\\"globalphotonlight\\\" name=\\\"\" << Name << \"\\\" photons=\\\"\" << m_photons.pipeline_value() << \"\\\" radius=\\\"\" << m_radius.pipeline_value() << \"\\\" depth=\\\"\" << m_depth.pipeline_value() << \"\\\" search=\\\"\" << m_search.pipeline_value() << \"\\\">\\n\";\n\t\tStream << \"</light>\\n\";\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<global_photon_light> factory(\n\t\t\tk3d::uuid(0x8c651262, 0x2e2d4fcc, 0xbb20f617, 0xf0c56f41),\n\t\t\t\"YafrayGlobalPhotonLight\",\n\t\t\t_(\"Yafray Global Photon Light\"),\n\t\t\t\"Yafray Light\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_radius;\n};\n\nk3d::iplugin_factory& global_photon_light_factory()\n{\n\treturn global_photon_light::get_factory();\n}\n\n} // namespace yafray\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/yafray/hemi_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead <tshead@k-3d.com>\n\t\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include \"lights.h\"\n\nnamespace module\n{\n\nnamespace yafray\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// hemi_light\n\nclass hemi_light :\n\tpublic renderable_light<colored_light<light<k3d::transformable<k3d::node > > > >\n{\n\ttypedef renderable_light<colored_light<light<k3d::transformable<k3d::node > > > > base;\n\npublic:\n\themi_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_quadric(gluNewQuadric()),\n\t\tm_power(init_owner(*this) + init_name(\"power\") + init_label(_(\"power\")) + init_description(_(\"Power\")) + init_value(2.0)),\n\t\tm_samples(init_owner(*this) + init_name(\"samples\") + init_label(_(\"samples\")) + init_description(_(\"Samples\")) + init_value(256) + init_constraint(k3d::data::constraint::minimum<k3d::int32_t>(0, k3d::data::constraint::maximum<k3d::int32_t>(1024)))),\n\t\tm_use_QMC(init_owner(*this) + init_name(\"use_QMC\") + init_label(_(\"use_QMC\")) + init_description(_(\"Use QMC\")) + init_value(false)),\n\t\tm_maxdistance(init_owner(*this) + init_name(\"maxdistance\") + init_label(_(\"maxdistance\")) + init_description(_(\"Max. distance\")) + init_value(-1.0))\n\t{\n\t\t// We override the default white color ...\n\t\tm_color.internal_value() = k3d::color(0.9, 0.9, 1.0);\n\t}\n\n\t~hemi_light()\n\t{\n\t\tgluDeleteQuadric(m_quadric);\n\t}\n\n\tvoid setup_light(const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tif(!m_emit.pipeline_value())\n\t\t\treturn;\n\n\t\tconst k3d::color color = m_color.pipeline_value();\n\n\t\tStream << \"<!-- K-3D plugin: \" << factory().name() << \" name: \" << name() << \" -->\\n\";\n\t\tStream << \"<light type=\\\"hemilight\\\" name=\\\"\" << Name << \"\\\" power=\\\"\" << m_power.pipeline_value() << \"\\\" samples=\\\"\" << m_samples.pipeline_value() << \"\\\" use_QMC=\\\"\" << (m_use_QMC.pipeline_value() ? \"on\" : \"off\") << \"\\\" maxdistance=\\\"\" << m_maxdistance.pipeline_value() << \"\\\">\\n\";\n\t\tStream << \"\t<color r=\\\"\" << color.red << \"\\\" g=\\\"\" << color.green << \"\\\" b=\\\"\" << color.blue << \"\\\"/>\\n\";\n\t\tStream << \"</light>\\n\";\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, State.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.4, 0.4, 0.4));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n\n\t\tglEnable(GL_LIGHTING);\n\t\tdraw_geometry();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_CULL_FACE);\n\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw_geometry();\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<hemi_light > factory(\n\t\t\tk3d::uuid(0xa0661dc7, 0x52cd4990, 0x8e6a0aa8, 0x87bdd89d),\n\t\t\t\"YafrayHemiLight\",\n\t\t\t_(\"Yafray Hemi Light\"),\n\t\t\t\"Yafray Light\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid draw_geometry()\n\t{\n\t\tconst GLdouble radius = 0.5;\n\t\tconst GLint sides = 16;\n\t\tconst double stacks = 4;\n\n\t\tconst double angle = k3d::pi_over_2() / stacks;\n\n\t\tfor(double n = 0; n < stacks; ++n)\n\t\t{\n\t\t\tconst double angle1 = angle * n;\n\t\t\tconst double angle2 = angle * (n + 1);\n\t\t\tconst double z1 = sin(angle1) * radius;\n\t\t\tconst double z2 = sin(angle2) * radius;\n\t\t\tconst double r1 = cos(angle1) * radius;\n\t\t\tconst double r2 = cos(angle2) * radius;\n\n\t\t\tglPushMatrix();\n\t\t\tglTranslated(0, 0, z1);\n\t\t\tgluCylinder(m_quadric, r1, r2 ? r2 : 0.001, z2 - z1, sides, 1);\n\t\t\tglPopMatrix();\n\t\t}\n\t}\n\n\t/// Stores a GLU quadric object for drawing the manipulators\n\tGLUquadricObj* const m_quadric;\n\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_power;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_samples;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_use_QMC;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_maxdistance;\n};\n\nk3d::iplugin_factory& hemi_light_factory()\n{\n\treturn hemi_light::get_factory();\n}\n\n} // namespace yafray\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/yafray/lights.h",
    "content": "#ifndef MODULES_YAFRAY_LIGHTS_H\n#define MODULES_YAFRAY_LIGHTS_H\n\n// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/ilight_yafray.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/renderable_gl.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/transformable.h>\n#include <k3dsdk/vectors.h>\n\nnamespace module\n{\n\nnamespace yafray\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// light\n\ntemplate<typename base_t>\nclass light :\n\tpublic base_t,\n\tpublic k3d::yafray::ilight\n{\npublic:\n\tlight(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_emit(init_owner(*this) + init_name(\"emit\") + init_label(_(\"emit\")) + init_description(_(\"Emit Light\")) + init_value(true))\n\t{\n\t}\n\nprotected:\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_emit;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// colored_light\n\ntemplate<typename base_t>\nclass colored_light :\n\tpublic base_t\n{\npublic:\n\tcolored_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"color\")) + init_description(_(\"Light color\")) + init_value(k3d::color(1, 1, 1)))\n\t{\n\t}\n\nprotected:\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// optional_shadows\n\ntemplate<typename base_t>\nclass optional_shadows :\n\tpublic base_t\n{\npublic:\n\toptional_shadows(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_cast_shadows(init_owner(*this) + init_name(\"cast_shadows\") + init_label(_(\"cast_shadows\")) + init_description(_(\"Cast shadows\")) + init_value(true))\n\t{\n\t}\n\nprotected:\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_cast_shadows;\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// renderable_light\n\ntemplate<typename base_t>\nclass renderable_light :\n\tpublic k3d::gl::renderable<base_t>\n{\n\ttypedef k3d::gl::renderable<base_t> base;\n\npublic:\n\trenderable_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document)\n\t{\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tconst bool emitting = base_t::m_emit.pipeline_value();\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\n\t\tk3d::gl::color3d(State.node_selection ? k3d::color(1, 1, 1) : emitting ? k3d::color(1, 1, 0) : k3d::color(0, 0, 0));\n\t\tglLineWidth(1.0f);\n\t\tglDisable(GL_LINE_STIPPLE);\n\n\t\tdraw();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw();\n\t\tk3d::gl::pop_selection_token();\n\t}\n\nprivate:\n\tvoid draw()\n\t{\n\t\tglBegin(GL_LINES);\n\n\t\tk3d::point3 coords(0, 0, 0);\n\n\t\tglVertex3d(coords[0] + 1.0, coords[1], coords[2]);\n\t\tglVertex3d(coords[0] - 1.0, coords[1], coords[2]);\n\t\tglVertex3d(coords[0], coords[1] + 1.0, coords[2]);\n\t\tglVertex3d(coords[0], coords[1] - 1.0, coords[2]);\n\t\tglVertex3d(coords[0], coords[1], coords[2] + 1.0);\n\t\tglVertex3d(coords[0], coords[1], coords[2] - 1.0);\n\n\t\tglVertex3d(coords[0] + 0.4, coords[1] + 0.4, coords[2] + 0.4);\n\t\tglVertex3d(coords[0] - 0.4, coords[1] - 0.4, coords[2] - 0.4);\n\t\tglVertex3d(coords[0] - 0.4, coords[1] + 0.4, coords[2] + 0.4);\n\t\tglVertex3d(coords[0] + 0.4, coords[1] - 0.4, coords[2] - 0.4);\n\t\tglVertex3d(coords[0] + 0.4, coords[1] + 0.4, coords[2] - 0.4);\n\t\tglVertex3d(coords[0] - 0.4, coords[1] - 0.4, coords[2] + 0.4);\n\t\tglVertex3d(coords[0] - 0.4, coords[1] + 0.4, coords[2] - 0.4);\n\t\tglVertex3d(coords[0] + 0.4, coords[1] - 0.4, coords[2] + 0.4);\n\n\t\tglEnd();\n\t}\n};\n\n/////////////////////////////////////////////////////////////////////////////\n// photons\n\ntemplate<typename base_t>\nclass photons :\n\tpublic base_t\n{\npublic:\n\tphotons(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase_t(Factory, Document),\n\t\tm_photons(init_owner(*this) + init_name(\"photons\") + init_label(_(\"photons\")) + init_description(_(\"Photons\")) + init_value(2000) + init_constraint(k3d::data::constraint::minimum<k3d::int32_t>(0))),\n\t\tm_depth(init_owner(*this) + init_name(\"depth\") + init_label(_(\"depth\")) + init_description(_(\"Depth\")) + init_value(1) + init_constraint(k3d::data::constraint::minimum<k3d::int32_t>(0))),\n\t\tm_search(init_owner(*this) + init_name(\"search\") + init_label(_(\"search\")) + init_description(_(\"Search\")) + init_value(100) + init_constraint(k3d::data::constraint::minimum<k3d::int32_t>(0)))\n\t{\n\t}\n\nprotected:\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_photons;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_depth;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_search;\n};\n\n} // namespace yafray\n\n} // namespace module\n\n#endif // !MODULES_YAFRAY_LIGHTS_H\n\n"
  },
  {
    "path": "modules/yafray/material.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imaterial_yafray.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/property_group_collection.h>\n#include <k3dsdk/vectors.h>\n\nnamespace module\n{\n\nnamespace yafray\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// material\n\nclass material :\n\tpublic k3d::node ,\n\tpublic k3d::imaterial,\n\tpublic k3d::yafray::imaterial,\n\tpublic k3d::property_group_collection\n{\n\ttypedef k3d::node  base;\n\npublic:\n\tmaterial(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_color(init_owner(*this) + init_name(\"color\") + init_label(_(\"color\")) + init_description(_(\"Color\")) + init_value(k3d::color(1, 1, 1))),\n\t\tm_specular_color(init_owner(*this) + init_name(\"specular_color\") + init_label(_(\"specular_color\")) + init_description(_(\"Specular Color\")) + init_value(k3d::color(1, 1, 1))),\n\t\tm_reflected_color(init_owner(*this) + init_name(\"reflected_color\") + init_label(_(\"reflected_color\")) + init_description(_(\"Reflected Color\")) + init_value(k3d::color(0, 0, 0))),\n\t\tm_transmitted_color(init_owner(*this) + init_name(\"transmitted_color\") + init_label(_(\"transmitted_color\")) + init_description(_(\"Transmitted Color\")) + init_value(k3d::color(0, 0, 0))),\n\t\tm_hardness(init_owner(*this) + init_name(\"hardness\") + init_label(_(\"hardness\")) + init_description(_(\"Hardness\")) + init_value(10.0)),\n\t\tm_index_of_refraction(init_owner(*this) + init_name(\"index_of_refraction\") + init_label(_(\"index_of_refraction\")) + init_description(_(\"Index of Refraction\")) + init_value(1.0)),\n\t\tm_minimum_reflection(init_owner(*this) + init_name(\"minimum_reflection\") + init_label(_(\"minimum_reflection\")) + init_description(_(\"Minimum Reflection\")) + init_value(0.0)),\n\t\tm_fast_fresnel(init_owner(*this) + init_name(\"fast_fresnel\") + init_label(_(\"fast_fresnel\")) + init_description(_(\"Fast fresnel\")) + init_value(false)),\n\n\t\tm_shadow(init_owner(*this) + init_name(\"shadow\") + init_label(_(\"shadow\")) + init_description(_(\"Shadow\")) + init_value(true)),\n\t\tm_emit_rad(init_owner(*this) + init_name(\"emit_rad\") + init_label(_(\"emit_rad\")) + init_description(_(\"emit_rad\")) + init_value(true)),\n\t\tm_recv_rad(init_owner(*this) + init_name(\"recv_rad\") + init_label(_(\"recv_rad\")) + init_description(_(\"recv_rad\")) + init_value(true)),\n\t\tm_caustics(init_owner(*this) + init_name(\"caustics\") + init_label(_(\"caustics\")) + init_description(_(\"Caustics\")) + init_value(false)),\n\t\tm_caus_IOR(init_owner(*this) + init_name(\"caus_IOR\") + init_label(_(\"caus_IOR\")) + init_description(_(\"caus_IOR\")) + init_value(1.0)),\n\t\tm_caus_rcolor(init_owner(*this) + init_name(\"caus_rcolor\") + init_label(_(\"caus_rcolor\")) + init_description(_(\"caus_rcolor\")) + init_value(k3d::color(0, 0, 0))),\n\t\tm_caus_tcolor(init_owner(*this) + init_name(\"caus_tcolor\") + init_label(_(\"caus_tcolor\")) + init_description(_(\"caus_tcolor\")) + init_value(k3d::color(0, 0, 0))),\n\n\t\tm_mesh_autosmooth(init_owner(*this) + init_name(\"mesh_autosmooth\") + init_label(_(\"mesh_autosmooth\")) + init_description(_(\"Mesh autosmooth\")) + init_value(false)),\n\t\tm_mesh_autosmooth_value(init_owner(*this) + init_name(\"mesh_autosmooth_value\") + init_label(_(\"mesh_autosmooth_value\")) + init_description(_(\"Mesh autosmooth value\")) + init_value(60.0)),\n\t\tm_has_orco(init_owner(*this) + init_name(\"has_orco\") + init_label(_(\"has_orco\")) + init_description(_(\"Has orco\")) + init_value(false))\n\t{\n\t\tk3d::iproperty_group_collection::group object_attributes(\"Object Attributes\");\n\t\tobject_attributes.properties.push_back(&static_cast<k3d::iproperty&>(m_shadow));\n\t\tobject_attributes.properties.push_back(&static_cast<k3d::iproperty&>(m_emit_rad));\n\t\tobject_attributes.properties.push_back(&static_cast<k3d::iproperty&>(m_recv_rad));\n\t\tobject_attributes.properties.push_back(&static_cast<k3d::iproperty&>(m_caustics));\n\t\tobject_attributes.properties.push_back(&static_cast<k3d::iproperty&>(m_caus_IOR));\n\t\tobject_attributes.properties.push_back(&static_cast<k3d::iproperty&>(m_caus_rcolor));\n\t\tobject_attributes.properties.push_back(&static_cast<k3d::iproperty&>(m_caus_tcolor));\n\n\t\tk3d::iproperty_group_collection::group mesh_attributes(\"Mesh Attributes\");\n\t\tmesh_attributes.properties.push_back(&static_cast<k3d::iproperty&>(m_mesh_autosmooth));\n\t\tmesh_attributes.properties.push_back(&static_cast<k3d::iproperty&>(m_mesh_autosmooth_value));\n\t\tmesh_attributes.properties.push_back(&static_cast<k3d::iproperty&>(m_has_orco));\n\n\t\tregister_property_group(object_attributes);\n\t\tregister_property_group(mesh_attributes);\n\t}\n\n\tvoid setup_material(const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tconst k3d::color color = m_color.pipeline_value();\n\t\tconst k3d::color specular_color = m_specular_color.pipeline_value();\n\t\tconst k3d::color reflected_color = m_reflected_color.pipeline_value();\n\t\tconst k3d::color transmitted_color = m_transmitted_color.pipeline_value();\n\n\t\tconst double hardness = m_hardness.pipeline_value();\n\t\tconst double index_of_refraction = m_index_of_refraction.pipeline_value();\n\t\tconst double minimum_reflection = m_minimum_reflection.pipeline_value();\n\n\t\tStream << \"<!-- K-3D plugin: \" << factory().name() << \" name: \" << name() << \" -->\\n\";\n\t\tStream << \"<shader type=\\\"generic\\\" name=\\\"\" << Name << \"\\\">\\n\";\n\t\tStream << \"\t<attributes>\\n\";\n\t\tStream << \"\t\t<color r=\\\"\" << color.red << \"\\\" g=\\\"\" << color.green << \"\\\" b=\\\"\" << color.blue << \"\\\"/>\\n\";\n\t\tStream << \"\t\t<specular r=\\\"\" << specular_color.red << \"\\\" g=\\\"\" << specular_color.green << \"\\\" b=\\\"\" << specular_color.blue << \"\\\"/>\\n\";\n\t\tStream << \"\t\t<reflected r=\\\"\" << reflected_color.red << \"\\\" g=\\\"\" << reflected_color.green << \"\\\" b=\\\"\" << reflected_color.blue << \"\\\"/>\\n\";\n\t\tStream << \"\t\t<transmitted r=\\\"\" << transmitted_color.red << \"\\\" g=\\\"\" << transmitted_color.green << \"\\\" b=\\\"\" << transmitted_color.blue << \"\\\"/>\\n\";\n\t\tStream << \"\t\t<hard value=\\\"\" << hardness << \"\\\"/>\\n\";\n\t\tStream << \"\t\t<IOR value=\\\"\" << index_of_refraction << \"\\\"/>\\n\";\n\t\tStream << \"\t\t<min_refle value=\\\"\" << minimum_reflection << \"\\\"/>\\n\";\n\t\tStream << \"\t\t<fast_fresnel value=\\\"\" << (m_fast_fresnel.pipeline_value() ? \"on\" : \"off\") << \"\\\"/>\\n\";\n\t\tStream << \"\t</attributes>\\n\";\n\t\tStream << \"</shader>\\n\";\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<material,\n\t\t\t\tk3d::interface_list<k3d::imaterial,\n\t\t\t\tk3d::interface_list<k3d::yafray::imaterial> > > factory(\n\t\t\tk3d::uuid(0x4b767ac5, 0x19ec4182, 0x9883cc81, 0x3f091dea),\n\t\t\t\"YafrayMaterial\",\n\t\t\t_(\"Yafray Material\"),\n\t\t\t\"Yafray Material\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_specular_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_reflected_color;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_transmitted_color;\n\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_hardness;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_index_of_refraction;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_minimum_reflection;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_fast_fresnel;\n\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_shadow;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_emit_rad;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_recv_rad;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_caustics;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_caus_IOR;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_caus_rcolor;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_caus_tcolor;\n\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_mesh_autosmooth;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_mesh_autosmooth_value;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_has_orco;\n};\n\nk3d::iplugin_factory& material_factory()\n{\n\treturn material::get_factory();\n}\n\n} // namespace yafray\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/yafray/module.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2005, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/module.h>\n\nnamespace module\n{\n\n/// Namespace reserved for the yafray plugin module, to protect public symbols from name clashes with other modules\nnamespace yafray\n{\n\nextern k3d::iplugin_factory& area_light_factory();\nextern k3d::iplugin_factory& global_photon_light_factory();\nextern k3d::iplugin_factory& hemi_light_factory();\nextern k3d::iplugin_factory& material_factory();\nextern k3d::iplugin_factory& photon_light_factory();\nextern k3d::iplugin_factory& point_light_factory();\nextern k3d::iplugin_factory& render_engine_factory();\nextern k3d::iplugin_factory& soft_light_factory();\nextern k3d::iplugin_factory& spot_light_factory();\nextern k3d::iplugin_factory& sun_light_factory();\n\n} // namespace yafray\n\n} // namespace module\n\nK3D_MODULE_START(Registry)\n\tRegistry.register_factory(module::yafray::area_light_factory());\n\tRegistry.register_factory(module::yafray::global_photon_light_factory());\n\tRegistry.register_factory(module::yafray::hemi_light_factory());\n\tRegistry.register_factory(module::yafray::material_factory());\n\tRegistry.register_factory(module::yafray::photon_light_factory());\n\tRegistry.register_factory(module::yafray::point_light_factory());\n\tRegistry.register_factory(module::yafray::render_engine_factory());\n\tRegistry.register_factory(module::yafray::soft_light_factory());\n\tRegistry.register_factory(module::yafray::spot_light_factory());\n\tRegistry.register_factory(module::yafray::sun_light_factory());\nK3D_MODULE_END\n\n"
  },
  {
    "path": "modules/yafray/photon_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead <tshead@k-3d.com>\n\t\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include \"lights.h\"\n\nnamespace module\n{\n\nnamespace yafray\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// photon_light\n\nclass photon_light :\n\tpublic colored_light<photons<light<k3d::gl::renderable<k3d::transformable<k3d::node > > > > >\n{\n\ttypedef colored_light<photons<light<k3d::gl::renderable<k3d::transformable<k3d::node > > > > > base;\n\npublic:\n\tphoton_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_power(init_owner(*this) + init_name(\"power\") + init_label(_(\"power\")) + init_description(_(\"Power\")) + init_value(100.0)),\n\t\tm_mode(init_owner(*this) + init_name(\"mode\") + init_label(_(\"mode\")) + init_description(_(\"Mode\")) + init_value(DIFFUSE) + init_enumeration(mode_values())),\n\t\tm_fixedradius(init_owner(*this) + init_name(\"fixedradius\") + init_label(_(\"fixedradius\")) + init_description(_(\"Fixed Radius\")) + init_value(0.1)),\n\t\tm_cluster(init_owner(*this) + init_name(\"cluster\") + init_label(_(\"cluster\")) + init_description(_(\"Cluster\")) + init_value(0.1)),\n\t\tm_use_QMC(init_owner(*this) + init_name(\"use_QMC\") + init_label(_(\"use_QMC\")) + init_description(_(\"Use QMC\")) + init_value(false)),\n\t\tm_angle(init_owner(*this) + init_name(\"angle\") + init_label(_(\"angle\")) + init_description(_(\"Angle\")) + init_value(k3d::radians(30.0))),\n\t\tm_mindepth(init_owner(*this) + init_name(\"mindepth\") + init_label(_(\"mindepth\")) + init_description(_(\"Min. depth\")) + init_value(1)),\n\t\tm_bias(init_owner(*this) + init_name(\"bias\") + init_label(_(\"bias\")) + init_description(_(\"Bias\")) + init_value(0.001))\n\t{\n\t}\n\n\tvoid setup_light(const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tif(!m_emit.pipeline_value())\n\t\t\treturn;\n\n\t\tconst k3d::color color = m_color.pipeline_value();\n\n\t\tconst k3d::point3 from = k3d::world_position(*this);\n\t\tconst k3d::point3 to = from + k3d::node_to_world_matrix(*this) * k3d::vector3(0, 0, 1);\n\n\t\tStream << \"<!-- K-3D plugin: \" << factory().name() << \" name: \" << name() << \" -->\\n\";\n\t\tStream << \"<light type=\\\"photonlight\\\" name=\\\"\" << Name << \"\\\" power=\\\"\" << m_power.pipeline_value() << \"\\\" photons=\\\"\" << m_photons.pipeline_value() << \"\\\" depth=\\\"\" << m_depth.pipeline_value() << \"\\\" mindepth=\\\"\" << m_mindepth.pipeline_value() << \"\\\" bias=\\\"\" << m_bias.pipeline_value() << \"\\\" search=\\\"\" << m_search.pipeline_value() << \"\\\" angle=\\\"\" << m_angle.pipeline_value() << \"\\\" mode=\\\"\" << (m_mode.pipeline_value() == DIFFUSE ? \"diffuse\" : \"caustic\") << \"\\\" fixedradius=\\\"\" << m_fixedradius.pipeline_value() << \"\\\" cluster=\\\"\" << m_cluster.pipeline_value() << \"\\\" use_QMC=\\\"\" << (m_use_QMC.pipeline_value() ? \"on\" : \"off\") << \"\\\">\\n\";\n\t\tStream << \"\t<from  x =\\\"\" << -from[0] << \"\\\" y =\\\"\" << from[1] << \"\\\" z =\\\"\" << from[2] << \"\\\"/>\\n\";\n\t\tStream << \"\t<to  x =\\\"\" << -to[0] << \"\\\" y =\\\"\" << to[1] << \"\\\" z =\\\"\" << to[2] << \"\\\"/>\\n\";\n\t\tStream << \"\t<color r=\\\"\" << color.red << \"\\\" g=\\\"\" << color.green << \"\\\" b=\\\"\" << color.blue << \"\\\"/>\\n\";\n\t\tStream << \"</light>\\n\";\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tconst bool emitting = m_emit.pipeline_value();\n\n\t\tglDisable(GL_LIGHTING);\n\t\tglDisable(GL_TEXTURE_1D);\n\t\tglDisable(GL_TEXTURE_2D);\n\n\t\tif(emitting)\n\t\t\tglColor3d(1, 1, 1);\n\t\telse\n\t\t\tglColor3d(0, 0, 0);\n\n\t\tglLineWidth(1.0f);\n\t\tglDisable(GL_LINE_STIPPLE);\n\n\t\tdraw_geometry();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\t\tdraw_geometry();\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<photon_light> factory(\n\t\t\tk3d::uuid(0x2b90ffa5, 0x9360411b, 0xbd982d69, 0xe3f45f31),\n\t\t\t\"YafrayPhotonLight\",\n\t\t\t_(\"Yafray Photon Light\"),\n\t\t\t\"Yafray Light\",\n\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid draw_geometry()\n\t{\n\t\tglBegin(GL_LINES);\n\n\t\tk3d::point3 coords(0, 0, 0);\n\n\t\tglVertex3d(coords[0], coords[1], coords[2]);\n\t\tglVertex3d(coords[0] - 0.2, coords[1] + 0.2, coords[2] + 1.0);\n\t\tglVertex3d(coords[0], coords[1], coords[2]);\n\t\tglVertex3d(coords[0] + 0.2, coords[1] + 0.2, coords[2] + 1.0);\n\t\tglVertex3d(coords[0], coords[1], coords[2]);\n\t\tglVertex3d(coords[0] + 0.2, coords[1] - 0.2, coords[2] + 1.0);\n\t\tglVertex3d(coords[0], coords[1], coords[2]);\n\t\tglVertex3d(coords[0] - 0.2, coords[1] - 0.2, coords[2] + 1.0);\n\n\t\tglEnd();\n\t}\n\n\ttypedef enum\n\t{\n\t\tDIFFUSE,\n\t\tCAUSTIC,\n\t} mode_t;\n\n\tfriend std::ostream& operator << (std::ostream& Stream, const mode_t& Value)\n\t{\n\t\tswitch(Value)\n\t\t{\n\t\t\tcase DIFFUSE:\n\t\t\t\tStream << \"diffuse\";\n\t\t\t\tbreak;\n\t\t\tcase CAUSTIC:\n\t\t\t\tStream << \"caustic\";\n\t\t\t\tbreak;\n\t\t}\n\t\treturn Stream;\n\t}\n\n\tfriend std::istream& operator >> (std::istream& Stream, mode_t& Value)\n\t{\n\t\tstd::string text;\n\t\tStream >> text;\n\n\t\tif(text == \"diffuse\")\n\t\t\tValue = DIFFUSE;\n\t\telse if(text == \"caustic\")\n\t\t\tValue = CAUSTIC;\n\t\telse\n\t\t\tk3d::log() << k3d_file_reference << \": unknown enumeration [\" << text << \"]\" << std::endl;\n\n\t\treturn Stream;\n\t}\n\n\tstatic const k3d::ienumeration_property::enumeration_values_t& mode_values()\n\t{\n\t\tstatic k3d::ienumeration_property::enumeration_values_t values;\n\t\tif(values.empty())\n\t\t{\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Diffuse\", \"diffuse\", \"Photons are reflected by diffuse surfaces in random directions (for radiosity or global illumination)\"));\n\t\t\tvalues.push_back(k3d::ienumeration_property::enumeration_value_t(\"Caustic\", \"caustic\", \"The light will draw reflected and transmitted photons causing caustic patterns\"));\n\t\t}\n\n\t\treturn values;\n\t}\n\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_power;\n\tk3d_data(mode_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_mode;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_fixedradius;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_cluster;\n\tk3d_data(bool, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_use_QMC;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_angle;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_mindepth;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_bias;\n};\n\nk3d::iplugin_factory& photon_light_factory()\n{\n\treturn photon_light::get_factory();\n}\n\n} // namespace yafray\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/yafray/point_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead <tshead@k-3d.com>\n\t\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include \"lights.h\"\n\nnamespace module\n{\n\nnamespace yafray\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// point_light\n\nclass point_light :\n\tpublic renderable_light<optional_shadows<colored_light<light<k3d::transformable<k3d::node > > > > >\n{\n\ttypedef renderable_light<optional_shadows<colored_light<light<k3d::transformable<k3d::node > > > > > base;\n\npublic:\n\tpoint_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_quadric(gluNewQuadric()),\n\t\tm_power(init_owner(*this) + init_name(\"power\") + init_label(_(\"power\")) + init_description(_(\"Power\")) + init_value(400.0))\n\t{\n\t}\n\n\t~point_light()\n\t{\n\t\tgluDeleteQuadric(m_quadric);\n\t}\n\n\tvoid setup_light(const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tif(!m_emit.pipeline_value())\n\t\t\treturn;\n\n\t\tconst k3d::point3 from = k3d::world_position(*this);\n\t\tconst k3d::color color = m_color.pipeline_value();\n\n\t\tStream << \"<!-- K-3D plugin: \" << factory().name() << \" name: \" << name() << \" -->\\n\";\n\t\tStream << \"<light type=\\\"pointlight\\\" name=\\\"\" << Name << \"\\\" power=\\\"\" << m_power.pipeline_value() << \"\\\" cast_shadows=\\\"\" << (m_cast_shadows.pipeline_value() ? \"yes\" : \"no\") << \"\\\">\\n\";\n\t\tStream << \"\t<from x=\\\"\" << std::fixed << -from[0] << \"\\\" y=\\\"\" << std::fixed << from[1] << \"\\\" z=\\\"\" << std::fixed << from[2] << \"\\\"/>\\n\";\n\t\tStream << \"\t<color r=\\\"\" << color.red << \"\\\" g=\\\"\" << color.green << \"\\\" b=\\\"\" << color.blue << \"\\\"/>\\n\";\n\t\tStream << \"</light>\\n\";\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, State.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.4, 0.4, 0.4));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n\n\t\tglEnable(GL_LIGHTING);\n\t\tdraw_geometry();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglDisable(GL_LIGHTING);\n\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw_geometry();\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<point_light,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::uuid(0xd693bb64, 0xd73943ce, 0x80852061, 0x24fd242e),\n\t\t\t\t\"YafrayPointLight\",\n\t\t\t\t_(\"Yafray Point Light\"),\n\t\t\t\t\"Yafray Light\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid draw_geometry()\n\t{\n\t\tgluSphere(m_quadric, 0.5, 8, 8);\n\t}\n\n\t/// Stores a GLU quadric object for drawing the manipulators\n\tGLUquadricObj* const m_quadric;\n\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_power;\n};\n\nk3d::iplugin_factory& point_light_factory()\n{\n\treturn point_light::get_factory();\n}\n\n} // namespace yafray\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/yafray/render_engine.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2007, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead <tshead@k-3d.com>\n\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include <k3d-i18n-config.h>\n#include <k3d-version-config.h>\n#include <k3dsdk/algebra.h>\n#include <k3dsdk/classes.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/document_plugin_factory.h>\n#include <k3dsdk/file_range.h>\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/gl.h>\n#include <k3dsdk/icamera.h>\n#include <k3dsdk/ilight_yafray.h>\n#include <k3dsdk/imaterial.h>\n#include <k3dsdk/imaterial_yafray.h>\n#include <k3dsdk/imesh_sink.h>\n#include <k3dsdk/imesh_source.h>\n#include <k3dsdk/inetwork_render_farm.h>\n#include <k3dsdk/inetwork_render_frame.h>\n#include <k3dsdk/inetwork_render_job.h>\n#include <k3dsdk/inode_collection_sink.h>\n#include <k3dsdk/iprojection.h>\n#include <k3dsdk/irender_camera_animation.h>\n#include <k3dsdk/irender_camera_frame.h>\n#include <k3dsdk/irender_camera_preview.h>\n#include <k3dsdk/irenderable_gl.h>\n#include <k3dsdk/imatrix_source.h>\n#include <k3dsdk/material.h>\n#include <k3dsdk/measurement.h>\n#include <k3dsdk/network_render_farm.h>\n#include <k3dsdk/node.h>\n#include <k3dsdk/polyhedron.h>\n#include <k3dsdk/property.h>\n#include <k3dsdk/resolutions.h>\n#include <k3dsdk/time_source.h>\n#include <k3dsdk/transform.h>\n#include <k3dsdk/triangulator.h>\n#include <k3dsdk/utility_gl.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iomanip>\n#include <iterator>\n#include <map>\n\nnamespace module\n{\n\nnamespace yafray\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// render_engine\n\nclass render_engine :\n\tpublic k3d::node,\n\tpublic k3d::inode_collection_sink,\n\tpublic k3d::irender_camera_preview,\n\tpublic k3d::irender_camera_frame,\n\tpublic k3d::irender_camera_animation\n{\n\ttypedef k3d::node base;\n\npublic:\n\trender_engine(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_visible_nodes(init_owner(*this) + init_name(\"visible_nodes\") + init_label(_(\"Visible Nodes\")) + init_description(_(\"A list of nodes that will be visible in the rendered output.\")) + init_value(std::vector<k3d::inode*>())),\n\t\tm_enabled_lights(init_owner(*this) + init_name(\"enabled_lights\") + init_label(_(\"Enabled Lights\")) + init_description(_(\"A list of light sources that will contribute to the rendered output.\")) + init_value(std::vector<k3d::inode*>())),\n\t\tm_resolution(init_owner(*this) + init_name(\"resolution\") + init_label(_(\"Resolution\")) + init_description(_(\"Choose a predefined image resolution\")) + init_enumeration(k3d::resolution_values()) + init_value(k3d::string_t(\"\"))),\n\t\tm_pixel_width(init_owner(*this) + init_name(\"pixel_width\") + init_label(_(\"pixel_width\")) + init_description(_(\"The horizontal size in pixels of the rendered output image.\")) + init_value(320) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_pixel_height(init_owner(*this) + init_name(\"pixel_height\") + init_label(_(\"pixel_height\")) + init_description(_(\"The vertical size in pixels of the rendered output image.\")) + init_value(240) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(1))),\n\t\tm_AA_passes(init_owner(*this) + init_name(\"AA_passes\") + init_label(_(\"AA_passes\")) + init_description(_(\"AA passes\")) + init_value(3) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_AA_minsamples(init_owner(*this) + init_name(\"AA_minsamples\") + init_label(_(\"AA_minsamples\")) + init_description(_(\"AA min samples\")) + init_value(2) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_AA_pixelwidth(init_owner(*this) + init_name(\"AA_pixelwidth\") + init_label(_(\"AA_pixelwidth\")) + init_description(_(\"AA pixelwidth\")) + init_value(1.5)),\n\t\tm_AA_threshold(init_owner(*this) + init_name(\"AA_threshold\") + init_label(_(\"AA_threshold\")) + init_description(_(\"AA threshold\")) + init_value(0.05)),\n\t\tm_raydepth(init_owner(*this) + init_name(\"raydepth\") + init_label(_(\"raydepth\")) + init_description(_(\"raydepth\")) + init_value(3) + init_step_increment(1) + init_units(typeid(k3d::measurement::scalar)) + init_constraint(constraint::minimum<k3d::int32_t>(0))),\n\t\tm_bias(init_owner(*this) + init_name(\"bias\") + init_label(_(\"bias\")) + init_description(_(\"bias\")) + init_value(0.1)),\n\t\tm_save_alpha(init_owner(*this) + init_name(\"save_alpha\") + init_label(_(\"save_alpha\")) + init_description(_(\"Save alpha\")) + init_value(false)),\n\t\tm_exposure(init_owner(*this) + init_name(\"exposure\") + init_label(_(\"exposure\")) + init_description(_(\"exposure\")) + init_value(0.0)),\n\t\tm_gamma(init_owner(*this) + init_name(\"gamma\") + init_label(_(\"gamma\")) + init_description(_(\"gamma\")) + init_value(1)),\n\t\tm_fog_density(init_owner(*this) + init_name(\"fog_density\") + init_label(_(\"fog_density\")) + init_description(_(\"fog_density\")) + init_value(0.0)),\n\t\tm_fog_color(init_owner(*this) + init_name(\"fog_color\") + init_label(_(\"fog_color\")) + init_description(_(\"Fog color\")) + init_value(k3d::color(1, 1, 1))),\n\t\tm_preview_sds(init_owner(*this) + init_name(\"preview_sds\") + init_label(_(\"Preview SDS\")) + init_description(_(\"Show SDS Surfaces\")) + init_value(true)),\n\t\tm_executable(init_owner(*this) + init_name(\"executable\") + init_label(_(\"Executable\")) + init_description(_(\"Choose the name of the executable that will be run to render YAFRAY scene files.\")) + init_value(k3d::string_t(\"yafray\")))\n\t{\n\t\tm_resolution.changed_signal().connect(sigc::mem_fun(*this, &render_engine::on_resolution_changed));\n\t}\n\n\tconst k3d::inode_collection_sink::properties_t node_collection_properties()\n\t{\n\t\tk3d::inode_collection_sink::properties_t results;\n\t\tresults.push_back(&m_visible_nodes);\n\t\tresults.push_back(&m_enabled_lights);\n\n\t\treturn results;\n\t}\n\n\tvoid on_resolution_changed(k3d::iunknown*)\n\t{\n\t\tconst k3d::string_t new_resolution = m_resolution.pipeline_value();\n\n\t\tconst k3d::resolutions_t& resolutions = k3d::resolutions();\n\t\tfor(k3d::resolutions_t::const_iterator resolution = resolutions.begin(); resolution != resolutions.end(); ++resolution)\n\t\t{\n\t\t\tif(resolution->name != new_resolution)\n\t\t\t\tcontinue;\n\n\t\t\tm_pixel_width.set_value(resolution->width);\n\t\t\tm_pixel_height.set_value(resolution->height);\n\t\t\treturn;\n\t\t}\n\n\t\tassert_not_reached();\n\t}\n\n\tk3d::bool_t render_camera_preview(k3d::icamera& Camera)\n\t{\n\t\t// Start a new render job ...\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-yafray-preview\");\n\n\t\t// Add a single render frame to the job ...\n\t\tk3d::inetwork_render_frame& frame = job.create_frame(\"frame\");\n\n\t\t// Create an output image path ...\n\t\tconst k3d::filesystem::path output_image = frame.add_file(\"salida.tga\");\n\n\t\t// Render it ...\n\t\treturn_val_if_fail(render(Camera, frame, output_image, true), false);\n\n\t\t// View the output when it's done ...\n\t\tframe.add_view_command(output_image);\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render_camera_frame(k3d::icamera& Camera, const k3d::filesystem::path& OutputImage, const k3d::bool_t ViewImage)\n\t{\n\t\t// Sanity checks ...\n\t\treturn_val_if_fail(!OutputImage.empty(), false);\n\n\t\t// Start a new render job ...\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-yafray-render-frame\");\n\n\t\t// Add a single render frame to the job ...\n\t\tk3d::inetwork_render_frame& frame = job.create_frame(\"frame\");\n\n\t\t// Create an output image path ...\n\t\tconst k3d::filesystem::path output_image = frame.add_file(\"salida.tga\");\n\n\t\t// Render it ...\n\t\treturn_val_if_fail(render(Camera, frame, output_image, false), false);\n\n\t\t// Copy the output image to its requested destination ...\n\t\tframe.add_copy_command(output_image, OutputImage);\n\n\t\t// View the output image when it's done ...\n\t\tif(ViewImage)\n\t\t\tframe.add_view_command(OutputImage);\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tk3d::bool_t render_camera_animation(k3d::icamera& Camera, k3d::iproperty& Time, const k3d::frames& Frames, const k3d::bool_t ViewCompletedImages)\n\t{\n\t\t// Start a new render job ...\n\t\tk3d::inetwork_render_job& job = k3d::get_network_render_farm().create_job(\"k3d-yafray-render-animation\");\n\n\t\t// For each frame to be rendered ...\n\t\tk3d::uint_t frame_index = 0;\n\t\tfor(k3d::frames::const_iterator frame = Frames.begin(); frame != Frames.end(); ++frame, ++frame_index)\n\t\t{\n\t\t\t// Set the frame time ...\n\t\t\tk3d::property::set_internal_value(Time, frame->begin_time);\n\n\t\t\t// Redraw everything ...\n\t\t\tk3d::gl::redraw_all(document(), k3d::gl::irender_viewport::SYNCHRONOUS);\n\n\t\t\t// Add a render frame to the job ...\n\t\t\tstd::stringstream buffer;\n\t\t\tbuffer << \"frame-\" << frame_index;\n\t\t\tk3d::inetwork_render_frame& render_frame = job.create_frame(buffer.str());\n\n\t\t\t// Create an output image path ...\n\t\t\tconst k3d::filesystem::path output_image = render_frame.add_file(\"salida.tga\");\n\n\t\t\t// Render it (hidden rendering) ...\n\t\t\treturn_val_if_fail(render(Camera, render_frame, output_image, false), false);\n\n\t\t\t// Copy the output image to its requested destination ...\n\t\t\trender_frame.add_copy_command(output_image, frame->destination);\n\n\t\t\t// View the output image when it's done ...\n\t\t\tif(ViewCompletedImages)\n\t\t\t\trender_frame.add_view_command(frame->destination);\n\t\t}\n\n\t\t// Start the job running ...\n\t\tk3d::get_network_render_farm().start_job(job);\n\n\t\treturn true;\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<render_engine,\n\t\t\tk3d::interface_list<k3d::irender_camera_animation,\n\t\t\tk3d::interface_list<k3d::irender_camera_frame,\n\t\t\tk3d::interface_list<k3d::irender_camera_preview> > > > factory(\n\t\t\t\tk3d::uuid(0xef38bf93, 0x66654f9f, 0x992ca91b, 0x62bae139),\n\t\t\t\t\"YafrayEngine\",\n\t\t\t\t_(\"Yafray Render Engine\"),\n\t\t\t\t\"Yafray RenderEngine\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\ttypedef std::map<k3d::yafray::imaterial*, k3d::string_t> shader_names_t;\n\n\t/// Helper class used to triangulate faces for Yafray\n\tclass create_triangles :\n\t\tpublic k3d::triangulator\n\t{\n\t\ttypedef k3d::triangulator base;\n\n\tpublic:\n\t\tcreate_triangles(const k3d::mesh::materials_t& OriginalMaterials, k3d::mesh::points_t& Points, k3d::mesh::indices_t& APoints, k3d::mesh::indices_t& BPoints, k3d::mesh::indices_t& CPoints, k3d::mesh::materials_t& Materials) :\n\t\t\tm_original_materials(OriginalMaterials),\n\t\t\tm_points(Points),\n\t\t\tm_a_points(APoints),\n\t\t\tm_b_points(BPoints),\n\t\t\tm_c_points(CPoints),\n\t\t\tm_materials(Materials)\n\t\t{\n\t\t}\n\n\tprivate:\n\t\tvoid start_face(const k3d::uint_t Face)\n\t\t{\n\t\t\tm_current_face = Face;\n\t\t}\n\n\t\tvoid add_vertex(const k3d::point3& Coordinates, k3d::uint_t Vertices[4], k3d::uint_t Edges[4], k3d::double_t Weights[4], k3d::uint_t& NewVertex)\n\t\t{\n\t\t\tNewVertex = m_points.size();\n\t\t\tm_points.push_back(Coordinates);\n\t\t}\n\n\t\tvoid add_triangle(k3d::uint_t Vertices[3], k3d::uint_t Edges[3])\n\t\t{\n\t\t\tm_a_points.push_back(Vertices[0]);\n\t\t\tm_b_points.push_back(Vertices[1]);\n\t\t\tm_c_points.push_back(Vertices[2]);\n\t\t\tm_materials.push_back(m_original_materials[m_current_face]);\n\t\t}\n\n\t\tconst k3d::mesh::materials_t& m_original_materials;\n\t\tk3d::mesh::points_t& m_points;\n\t\tk3d::mesh::indices_t& m_a_points;\n\t\tk3d::mesh::indices_t& m_b_points;\n\t\tk3d::mesh::indices_t& m_c_points;\n\t\tk3d::mesh::materials_t& m_materials;\n\n\t\tk3d::uint_t m_current_face;\n\t};\n\n\tvoid render_mesh_instance(const shader_names_t& ShaderNames, const k3d::string_t& Name, k3d::inode& MeshInstance, std::ostream& Stream)\n\t{\n\t\tconst k3d::mesh* const mesh = k3d::property::pipeline_value<k3d::mesh*>(MeshInstance, \"output_mesh\");\n\t\tif(!mesh)\n\t\t\treturn;\n\n\t\tfor(k3d::mesh::primitives_t::const_iterator primitive = mesh->primitives.begin(); primitive != mesh->primitives.end(); ++primitive)\n\t\t{\n      boost::scoped_ptr<k3d::polyhedron::const_primitive> polyhedron(k3d::polyhedron::validate(*mesh, **primitive));\n      if(!polyhedron)\n        continue;\n\n      // Triangulate the mesh faces ...\n      k3d::mesh::points_t points(*(mesh->points));\n      const k3d::matrix4 transformation = k3d::node_to_world_matrix(MeshInstance); \n      for (k3d::uint_t point = 0; point != points.size(); ++point)\n        points[point] = points[point] * transformation;\n      k3d::mesh::indices_t a_points;\n      k3d::mesh::indices_t b_points;\n      k3d::mesh::indices_t c_points;\n      k3d::mesh::materials_t materials;\n      create_triangles(polyhedron->face_materials, points, a_points, b_points, c_points, materials).process(*mesh, *polyhedron);\n\n      // Sort faces by material ...\n      typedef std::vector<k3d::uint_t> faces_t;\n      typedef std::map<k3d::imaterial*, faces_t> sorted_faces_t;\n      sorted_faces_t sorted_faces;\n      for(k3d::uint_t i = 0; i != a_points.size(); ++i)\n        sorted_faces[materials[i]].push_back(i);\n\n      Stream << \"<!-- K-3D plugin: \" << MeshInstance.factory().name() << \" name: \" << MeshInstance.name() << \" -->\\n\";\n\n      // Write out each group of faces that shares the same material ...\n      k3d::uint_t index = 0;\n      for(sorted_faces_t::const_iterator i = sorted_faces.begin(); i != sorted_faces.end(); ++i, ++index)\n      {\n        const k3d::string_t object_name = Name + \"_\" + k3d::string_cast(index);\n\n        k3d::imaterial* const material = i->first;\n        const faces_t& faces = i->second;\n\n        k3d::string_t shader_name = \"shader_0\";\n        k3d::bool_t shadow = true;\n        k3d::bool_t emit_rad = true;\n        k3d::bool_t recv_rad = true;\n        k3d::bool_t caustics = true;\n        k3d::double_t caus_IOR = 1.0;\n        k3d::color caus_rcolor(0, 0, 0);\n        k3d::color caus_tcolor(0, 0, 0);\n        k3d::double_t autosmooth_value = 89.9;\n        k3d::bool_t has_orco = false;\n\n        if(k3d::yafray::imaterial* const yafray_material = k3d::material::lookup<k3d::yafray::imaterial>(material))\n        {\n          shader_name = ShaderNames.count(yafray_material) ? ShaderNames.find(yafray_material)->second : \"shader_0\";\n\n          shadow = k3d::property::pipeline_value<k3d::bool_t>(*yafray_material, \"shadow\");\n          emit_rad = k3d::property::pipeline_value<k3d::bool_t>(*yafray_material, \"emit_rad\");\n          recv_rad = k3d::property::pipeline_value<k3d::bool_t>(*yafray_material, \"recv_rad\");\n          caustics = k3d::property::pipeline_value<k3d::bool_t>(*yafray_material, \"caustics\");\n          caus_IOR = k3d::property::pipeline_value<k3d::double_t>(*yafray_material, \"caus_IOR\");\n          caus_rcolor = k3d::property::pipeline_value<k3d::color>(*yafray_material, \"caus_rcolor\");\n          caus_tcolor = k3d::property::pipeline_value<k3d::color>(*yafray_material, \"caus_tcolor\");\n          autosmooth_value = k3d::property::pipeline_value<k3d::double_t>(*yafray_material, \"mesh_autosmooth_value\");\n          has_orco = k3d::property::pipeline_value<k3d::bool_t>(*yafray_material, \"has_orco\");\n        }\n\n\n        Stream << \"<object name=\\\"\" << object_name << \"\\\"\";\n        Stream << \" shader_name=\\\"\" << shader_name << \"\\\"\";\n        Stream << \" shadow=\\\"\" << (shadow ? \"on\" : \"off\") << \"\\\"\";\n        Stream << \" emit_rad=\\\"\" << (emit_rad ? \"on\" : \"off\") << \"\\\"\";\n        Stream << \" recv_rad=\\\"\" << (recv_rad ? \"on\" : \"off\") << \"\\\"\";\n        Stream << \" caustics=\\\"\" << (caustics ? \"on\" : \"off\") << \"\\\"\";\n        Stream << \" caus_IOR=\\\"\" << caus_IOR << \"\\\"\";\n        Stream << \">\\n\";\n        Stream << \"\t<attributes>\\n\";\n        Stream << \"\t\t<caus_rcolor r=\\\"\" << caus_rcolor.red << \"\\\" g=\\\"\" << caus_rcolor.green << \"\\\" b=\\\"\" << caus_rcolor.blue << \"\\\"/>\\n\";\n        Stream << \"\t\t<caus_tcolor r=\\\"\" << caus_tcolor.red << \"\\\" g=\\\"\" << caus_tcolor.green << \"\\\" b=\\\"\" << caus_tcolor.blue << \"\\\"/>\\n\";\n        Stream << \"\t</attributes>\\n\";\n        Stream << \"\t<mesh autosmooth=\\\"\" << autosmooth_value << \"\\\">\\n\";\n        Stream << \"\t\t<points>\\n\";\n        // Note: we write out every point here, to keep things simple\n        for(k3d::uint_t i = 0; i != points.size(); ++i)\n          Stream << \"\t\t\t<p x=\\\"\" << points[i][0] << \"\\\" y=\\\"\" << points[i][1] << \"\\\" z=\\\"\" << points[i][2] << \"\\\"/>\\n\";\n        Stream << \"\t\t</points>\\n\";\n        Stream << \"\t\t<faces>\\n\";\n        for(faces_t::const_iterator face = faces.begin(); face != faces.end(); ++face)\n          Stream << \"\t\t\t<f a=\\\"\" << a_points[*face] << \"\\\" b=\\\"\" << b_points[*face] << \"\\\" c=\\\"\" << c_points[*face] << \"\\\"/>\\n\";\n        Stream << \"\t\t</faces>\\n\";\n        Stream << \"\t</mesh>\\n\";\n        Stream << \"</object>\\n\";\n      }\n    }\n\t}\n\n\tk3d::bool_t render(k3d::icamera& Camera, k3d::inetwork_render_frame& Frame, const k3d::filesystem::path& OutputImagePath, const k3d::bool_t VisibleRender)\n\t{\n\t\ttry\n\t\t{\n\t\t\t// Sanity checks ...\n\t\t\treturn_val_if_fail(!OutputImagePath.empty(), false);\n\n\t\t\t// Start our YafRay XML file ...\n\t\t\tconst k3d::filesystem::path filepath = Frame.add_file(\"world.xml\");\n\n\t\t\t// Open the RIB file stream ...\n\t\t\tk3d::filesystem::ofstream stream(filepath);\n\t\t\treturn_val_if_fail(stream.good(), false);\n\n\t\t\t// Setup the frame for YafRay rendering ...\n\t\t\tk3d::inetwork_render_frame::environment environment;\n\n\t\t\tk3d::inetwork_render_frame::arguments arguments;\n\t\t\targuments.push_back(k3d::inetwork_render_frame::argument(filepath.native_filesystem_string()));\n\n\t\t\tFrame.add_exec_command(m_executable.pipeline_value(), environment, arguments);\n\n\t\t\t// Setup a YafRay scene description ...\n\t\t\tstream << \"<!-- Yafray scene generated by K-3D Version \" K3D_VERSION \", http://www.k-3d.org -->\\n\";\n\t\t\tstream << \"<scene>\\n\";\n\n\t\t\t// Get the document contents ...\n\t\t\tconst k3d::nodes_t nodes(document().nodes().collection());\n\n\t\t\t// Setup Yafray shaders, keeping-track of names as-we-go ...\n\t\t\tshader_names_t shader_names;\n\t\t\tfor(k3d::nodes_t::const_iterator node = nodes.begin(); node != nodes.end(); ++node)\n\t\t\t{\n\t\t\t\tif(k3d::yafray::imaterial* const material = dynamic_cast<k3d::yafray::imaterial*>(*node))\n\t\t\t\t{\n\t\t\t\t\tconst k3d::string_t shader_name = \"shader_\" + k3d::string_cast(shader_names.size());\n\t\t\t\t\tshader_names.insert(std::make_pair(material, shader_name));\n\t\t\t\t\tmaterial->setup_material(shader_name, stream);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Render geometry, keeping-track of names as we go ...\n\t\t\tstd::map<k3d::inode*, k3d::string_t> object_names;\n\n\t\t\tconst k3d::inode_collection_property::nodes_t visible_nodes = m_visible_nodes.pipeline_value();\n\t\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = visible_nodes.begin(); node != visible_nodes.end(); ++node)\n\t\t\t{\n\t\t\t\tconst k3d::string_t object_name = \"object_\" + k3d::string_cast(object_names.size());\n\t\t\t\tobject_names.insert(std::make_pair(*node, object_name));\n\n\t\t\t\tif((*node)->factory().factory_id() == k3d::classes::MeshInstance())\n\t\t\t\t\trender_mesh_instance(shader_names, object_name, **node, stream);\n\t\t\t}\n\n\t\t\t// Setup lights, keeping-track of names as we go ...\n\t\t\tstd::map<k3d::yafray::ilight*, k3d::string_t> light_names;\n\n\t\t\tconst k3d::inode_collection_property::nodes_t enabled_lights = m_enabled_lights.pipeline_value();\n\t\t\tfor(k3d::inode_collection_property::nodes_t::const_iterator node = enabled_lights.begin(); node != enabled_lights.end(); ++node)\n\t\t\t{\n\t\t\t\tif(k3d::yafray::ilight* const light = dynamic_cast<k3d::yafray::ilight*>(*node))\n\t\t\t\t{\n\t\t\t\t\tconst k3d::string_t light_name = \"light_\" + k3d::string_cast(light_names.size());\n\t\t\t\t\tlight_names.insert(std::make_pair(light, light_name));\n\t\t\t\t\tlight->setup_light(light_name, stream);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Setup the camera ...\n\t\t\tk3d::inode* const camera_node = dynamic_cast<k3d::inode*>(&Camera);\n\t\t\tif(!camera_node)\n\t\t\t\tthrow std::runtime_error(\"camera not a node\");\n\n\t\t\tconst k3d::matrix4 camera_matrix = k3d::property::pipeline_value<k3d::matrix4>(Camera.transformation().matrix_source_output());\n\t\t\tconst k3d::point3 camera_position = k3d::position(camera_matrix);\n\t\t\tconst k3d::point3 camera_to_vector = camera_matrix * k3d::point3(0, 0, 1);\n\t\t\tconst k3d::point3 camera_up_vector = camera_matrix * k3d::point3(0, 1, 0);\n\n\t\t\tstream << \"<!-- K-3D plugin: \" << camera_node->factory().name() << \" name: \" << camera_node->name() << \" -->\\n\";\n\t\t\tstream << \"<camera name=\\\"camera_0\\\" resx=\\\"\" << m_pixel_width.pipeline_value() << \"\\\" resy=\\\"\" << m_pixel_height.pipeline_value() << \"\\\" focal=\\\"0.7\\\">\\n\";\n\t\t\tstream << \"\t<from x=\\\"\" << -camera_position[0] << \"\\\" y=\\\"\" << camera_position[1] << \"\\\" z=\\\"\" << camera_position[2] << \"\\\"/>\\n\";\n\t\t\tstream << \"\t<to x=\\\"\" << -camera_to_vector[0] << \"\\\" y=\\\"\" << camera_to_vector[1] << \"\\\" z=\\\"\" << camera_to_vector[2] << \"\\\"/>\\n\";\n\t\t\tstream << \"\t<up x=\\\"\" << -camera_up_vector[0] << \"\\\" y=\\\"\" << camera_up_vector[1] << \"\\\" z=\\\"\" << camera_up_vector[2] << \"\\\"/>\\n\";\n\t\t\tstream << \"</camera>\\n\";\n\n\t\t\t// Generate the output file ...\n\t\t\tconst k3d::color fog_color = m_fog_color.pipeline_value();\n\n\t\t\tstream << \"<!-- K-3D plugin: \" << factory().name() << \" name: \" << name() << \" -->\\n\";\n\t\t\tstream << \"<render camera_name=\\\"camera_0\\\" AA_passes=\\\"\" << m_AA_passes.pipeline_value() << \"\\\"\" << \" AA_minsamples=\\\"\" << m_AA_minsamples.pipeline_value() << \"\\\" AA_pixelwidth=\\\"\" << m_AA_pixelwidth.pipeline_value() << \"\\\" AA_threshold=\\\"\" << m_AA_threshold.pipeline_value() << \"\\\" raydepth=\\\"\" << m_raydepth.pipeline_value() << \"\\\" bias=\\\"\" << m_bias.pipeline_value() << \"\\\">\\n\";\n\t\t\tstream << \"\t<outfile value=\\\"\" << OutputImagePath.native_filesystem_string() << \"\\\"/>\\n\";\n\t\t\tstream << \"\t<save_alpha value=\\\"\" << (m_save_alpha.pipeline_value() ? \"on\" : \"off\") << \"\\\"/>\\n\";\n\t\t\tstream << \"\t<exposure value=\\\"\" << m_exposure.pipeline_value() << \"\\\"/>\\n\";\n\t\t\tstream << \"\t<gamma value=\\\"\" << m_gamma.pipeline_value() << \"\\\"/>\\n\";\n\t\t\tstream << \"\t<fog_density value=\\\"\" << m_fog_density.pipeline_value() << \"\\\"/>\\n\";\n\t\t\tstream << \"\t<fog_color r=\\\"\" << fog_color.red << \"\\\" g=\\\"\" << fog_color.green << \"\\\" b=\\\"\" << fog_color.blue << \"\\\"/>\\n\";\n\t\t\tstream << \"</render>\\n\";\n\n\t\t\t// Finish the scene ...\n\t\t\tstream << \"</scene>\\n\";\n\t\t}\n\t\tcatch(std::exception& e)\n\t\t{\n\t\t\tk3d::log() << error << \"exception: \" << e.what() << std::endl;\n\t\t\treturn false;\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t\tk3d::log() << error << \"unknown exception\" << std::endl;\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/// Helper class that limits the list of visible nodes to those that we can render\n\ttemplate<typename value_t, class name_policy_t>\n\tclass yafray_visible_nodes_property :\n\t\tpublic k3d::data::writable_property<value_t, name_policy_t>,\n\t\tpublic k3d::inode_collection_property\n\t{\n\t\ttypedef k3d::data::writable_property<value_t, name_policy_t> base;\n\n\tpublic:\n\t\tk3d::bool_t property_allow(k3d::inode& Node)\n\t\t{\n\t\t\treturn Node.factory().factory_id() == k3d::classes::MeshInstance();\n\t\t}\n\n\tprotected:\n\t\ttemplate<typename init_t>\n\t\tyafray_visible_nodes_property(const init_t& Init) :\n\t\t\tbase(Init)\n\t\t{\n\t\t}\n\t};\n\n\t/// Helper class that limits the list of enabled lights to those the implement k3d::yafray::ilight\n\ttemplate<typename value_t, class name_policy_t>\n\tclass yafray_enabled_lights_property :\n\t\tpublic k3d::data::writable_property<value_t, name_policy_t>,\n\t\tpublic k3d::inode_collection_property\n\t{\n\t\ttypedef k3d::data::writable_property<value_t, name_policy_t> base;\n\n\tpublic:\n\t\tk3d::bool_t property_allow(k3d::inode& Node)\n\t\t{\n\t\t\treturn dynamic_cast<k3d::yafray::ilight*>(&Node) ? true : false;\n\t\t}\n\n\tprotected:\n\t\ttemplate<typename init_t>\n\t\tyafray_enabled_lights_property(const init_t& Init) :\n\t\t\tbase(Init)\n\t\t{\n\t\t}\n\t};\n\n\tk3d_data(k3d::inode_collection_property::nodes_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, yafray_visible_nodes_property, node_collection_serialization) m_visible_nodes;\n\tk3d_data(k3d::inode_collection_property::nodes_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, yafray_enabled_lights_property, node_collection_serialization) m_enabled_lights;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, enumeration_property, with_serialization) m_resolution;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_width;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_pixel_height;\n\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_AA_passes;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_AA_minsamples;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_AA_pixelwidth;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_AA_threshold;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, measurement_property, with_serialization) m_raydepth;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_bias;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_save_alpha;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_exposure;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_gamma;\n\tk3d_data(k3d::double_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_fog_density;\n\tk3d_data(k3d::color, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_fog_color;\n\tk3d_data(k3d::bool_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_preview_sds;\n\tk3d_data(k3d::string_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_executable;\n};\n\nk3d::iplugin_factory& render_engine_factory()\n{\n\treturn render_engine::get_factory();\n}\n\n} // namespace yafray\n\n} // namespace module\n\n"
  },
  {
    "path": "modules/yafray/soft_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead <tshead@k-3d.com>\n\t\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include \"lights.h\"\n\nnamespace module\n{\n\nnamespace yafray\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// soft_light\n\nclass soft_light :\n\tpublic renderable_light<colored_light<light<k3d::transformable<k3d::node > > > >\n{\n\ttypedef renderable_light<colored_light<light<k3d::transformable<k3d::node > > > > base;\n\npublic:\n\tsoft_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_quadric(gluNewQuadric()),\n\t\tm_power(init_owner(*this) + init_name(\"power\") + init_label(_(\"power\")) + init_description(_(\"Power\")) + init_value(400.0)),\n\t\tm_radius(init_owner(*this) + init_name(\"radius\") + init_label(_(\"radius\")) + init_description(_(\"Softness\")) + init_value(5.0)),\n\t\tm_resolution(init_owner(*this) + init_name(\"resolution\") + init_label(_(\"resolution\")) + init_description(_(\"Shadowmap resolution\")) + init_value(256) + init_constraint(k3d::data::constraint::minimum<k3d::int32_t>(0, k3d::data::constraint::maximum<k3d::int32_t>(4096)))),\n\t\tm_bias(init_owner(*this) + init_name(\"bias\") + init_label(_(\"bias\")) + init_description(_(\"Shadowmap bias\")) + init_value(0.01)),\n\t\tm_glow_intensity(init_owner(*this) + init_name(\"glow_intensity\") + init_label(_(\"glow_intensity\")) + init_description(_(\"Glow intensity\")) + init_value(0)),\n\t\tm_glow_type(init_owner(*this) + init_name(\"glow_type\") + init_label(_(\"glow_type\")) + init_description(_(\"Glow type\")) + init_value(0)),\n\t\tm_glow_offset(init_owner(*this) + init_name(\"glow_offset\") + init_label(_(\"glow_offset\")) + init_description(_(\"Glow offset\")) + init_value(0))\n\t{\n\t}\n\n\t~soft_light()\n\t{\n\t\tgluDeleteQuadric(m_quadric);\n\t}\n\n\tvoid setup_light(const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tif(!m_emit.pipeline_value())\n\t\t\treturn;\n\n\t\tconst k3d::point3 from = k3d::world_position(*this);\n\t\tconst k3d::color color = m_color.pipeline_value();\n\n\t\tStream << \"<!-- K-3D plugin: \" << factory().name() << \" name: \" << name() << \" -->\\n\";\n\t\tStream << \"<light type=\\\"softlight\\\" name=\\\"\" << Name << \"\\\" power=\\\"\" << m_power.pipeline_value() << \"\\\" res=\\\"\" << m_resolution.pipeline_value()  << \"\\\" radius=\\\"\" << m_radius.pipeline_value() << \"\\\" bias=\\\"\" << m_bias.pipeline_value() << \"\\\" glow_intensity=\\\"\" << m_glow_intensity.pipeline_value() << \"\\\" glow_type=\\\"\" << m_glow_type.pipeline_value() << \"\\\" glow_offset=\\\"\" << m_glow_offset.pipeline_value() << \"\\\">\\n\";\n\t\tStream << \"\t<from x=\\\"\" << std::fixed << -from[0] << \"\\\" y=\\\"\" << std::fixed << from[1] << \"\\\" z=\\\"\" << std::fixed << from[2] << \"\\\"/>\\n\";\n\t\tStream << \"\t<color r=\\\"\" << color.red << \"\\\" g=\\\"\" << color.green << \"\\\" b=\\\"\" << color.blue << \"\\\"/>\\n\";\n\t\tStream << \"</light>\\n\";\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, State.node_selection ? k3d::color(0, 1, 1) : k3d::color(0.4, 0.4, 0.4));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n\n\t\tglEnable(GL_LIGHTING);\n\t\tdraw_geometry();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglDisable(GL_LIGHTING);\n\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw_geometry();\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<soft_light,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::uuid(0x2fcaffb5, 0xed294a0d, 0x82133a8f, 0x48df4988),\n\t\t\t\t\"YafraySoftLight\",\n\t\t\t\t_(\"Yafray Soft Light\"),\n\t\t\t\t\"Yafray Light\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid draw_geometry()\n\t{\n\t\tgluSphere(m_quadric, 0.5, 8, 8);\n\t}\n\n\t/// Stores a GLU quadric object for drawing the manipulators\n\tGLUquadricObj* const m_quadric;\n\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_power;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_radius;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, with_constraint, writable_property, with_serialization) m_resolution;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_bias;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_glow_intensity;\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_glow_type;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_glow_offset;\n};\n\nk3d::iplugin_factory& soft_light_factory()\n{\n\treturn soft_light::get_factory();\n}\n\n} // namespace yafray\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/yafray/spot_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead <tshead@k-3d.com>\n\t\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include \"lights.h\"\n\nnamespace module\n{\n\nnamespace yafray\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// spot_light\n\nclass spot_light :\n\tpublic colored_light<light<k3d::gl::renderable<k3d::transformable<k3d::node > > > >\n{\n\ttypedef colored_light<light<k3d::gl::renderable<k3d::transformable<k3d::node > > > > base;\n\npublic:\n\tspot_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_quadric(gluNewQuadric()),\n\t\tm_power(init_owner(*this) + init_name(\"power\") + init_label(_(\"power\")) + init_description(_(\"Power\")) + init_value(400.0)),\n\t\tm_size(init_owner(*this) + init_name(\"size\") + init_label(_(\"size\")) + init_description(_(\"Angle\")) + init_value(k3d::radians(30.0))),\n\t\tm_nblend(init_owner(*this) + init_name(\"nblend\") + init_label(_(\"nblend\")) + init_description(_(\"Edge softness\")) + init_value(5.0)),\n\t\tm_beam_falloff(init_owner(*this) + init_name(\"beam_falloff\") + init_label(_(\"beam_falloff\")) + init_description(_(\"Beam falloff\")) + init_value(10.0))\n\t{\n\t}\n\n\t~spot_light()\n\t{\n\t\tgluDeleteQuadric(m_quadric);\n\t}\n\n\tvoid setup_light(const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tif(!m_emit.pipeline_value())\n\t\t\treturn;\n\n\t\tconst k3d::point3 from = k3d::world_position(*this);\n\t\tconst k3d::point3 to = from + k3d::node_to_world_matrix(*this) * k3d::vector3(0, 0, 1);\n\t\tconst k3d::color color = m_color.pipeline_value();\n\t\tconst double power = m_power.pipeline_value();\n\t\tconst double size = k3d::degrees(m_size.pipeline_value());\n\t\tconst double nblend = m_nblend.pipeline_value();\n\t\tconst double beam_falloff = m_beam_falloff.pipeline_value();\n\n\t\tStream << \"<!-- K-3D plugin: \" << factory().name() << \" name: \" << name() << \" -->\\n\";\n\t\tStream << \"<light type=\\\"spotlight\\\" name=\\\"\" << Name << \"\\\" power=\\\"\" << power << \"\\\" size=\\\"\" << size << \"\\\" nblend=\\\"\" << nblend << \"\\\" beam_falloff=\\\"\" << beam_falloff << \"\\\">\\n\";\n\t\tStream << \"\t<from x=\\\"\" << std::fixed << -from[0] << \"\\\" y=\\\"\" << std::fixed << from[1] << \"\\\" z=\\\"\" << std::fixed << from[2] << \"\\\"/>\\n\";\n\t\tStream << \"\t<to x=\\\"\" << std::fixed << -to[0] << \"\\\" y=\\\"\" << std::fixed << to[1] << \"\\\" z=\\\"\" << std::fixed << to[2] << \"\\\"/>\\n\";\n\t\tStream << \"\t<color r=\\\"\" << color.red << \"\\\" g=\\\"\" << color.green << \"\\\" b=\\\"\" << color.blue << \"\\\"/>\\n\";\n\t\tStream << \"</light>\\n\";\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, State.node_selection ? k3d::color(1, 1, 1) : k3d::color(0.4, 0.4, 0.4));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n\n\t\tglEnable(GL_LIGHTING);\n\t\tdraw_geometry();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglDisable(GL_LIGHTING);\n\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw_geometry();\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<spot_light,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::uuid(0x5e363371, 0xf8464895, 0x99f0ddf0, 0x4e26ee4a),\n\t\t\t\t\"YafraySpotLight\",\n\t\t\t\t_(\"Yafray Spot Light\"),\n\t\t\t\t\"Yafray Light\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid draw_geometry()\n\t{\n\t\tgluQuadricDrawStyle(m_quadric, GLU_FILL);\n\t\tgluQuadricNormals(m_quadric, GLU_SMOOTH);\n\t\tgluCylinder(m_quadric, 0.001, 0.2, 1, 8, 1);\n\t}\n\n\t/// Stores a GLU quadric object for drawing the manipulators\n\tGLUquadricObj* const m_quadric;\n\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_power;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_size;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_nblend;\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_beam_falloff;\n};\n\nk3d::iplugin_factory& spot_light_factory()\n{\n\treturn spot_light::get_factory();\n}\n\n} // namespace yafray\n\n} // namespace module\n\n\n"
  },
  {
    "path": "modules/yafray/sun_light.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2006, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead <tshead@k-3d.com>\n\t\t\\author Romain Behar <romainbehar@yahoo.com>\n*/\n\n#include \"lights.h\"\n\nnamespace module\n{\n\nnamespace yafray\n{\n\n/////////////////////////////////////////////////////////////////////////////\n// sun_light\n\nclass sun_light :\n\tpublic renderable_light<optional_shadows<colored_light<light<k3d::transformable<k3d::node > > > > >\n{\n\ttypedef renderable_light<optional_shadows<colored_light<light<k3d::transformable<k3d::node > > > > > base;\n\npublic:\n\tsun_light(k3d::iplugin_factory& Factory, k3d::idocument& Document) :\n\t\tbase(Factory, Document),\n\t\tm_quadric(gluNewQuadric()),\n\t\tm_power(init_owner(*this) + init_name(\"power\") + init_label(_(\"power\")) + init_description(_(\"Power\")) + init_value(40.0))\n\t{\n\t}\n\n\t~sun_light()\n\t{\n\t\tgluDeleteQuadric(m_quadric);\n\t}\n\n\tvoid setup_light(const k3d::string_t& Name, std::ostream& Stream)\n\t{\n\t\tif(!m_emit.pipeline_value())\n\t\t\treturn;\n\n\t\tconst k3d::point3 from = k3d::world_position(*this);\n\t\tconst k3d::color color = m_color.pipeline_value();\n\n\t\tStream << \"<!-- K-3D plugin: \" << factory().name() << \" name: \" << name() << \" -->\\n\";\n\t\tStream << \"<light type=\\\"sunlight\\\" name=\\\"\" << Name << \"\\\" power=\\\"\" << m_power.pipeline_value() << \"\\\" cast_shadows=\\\"\" << (m_cast_shadows.pipeline_value() ? \"yes\" : \"no\") << \"\\\">\\n\";\n\t\tStream << \"\t<from x=\\\"\" << std::fixed << -from[0] << \"\\\" y=\\\"\" << std::fixed << from[1] << \"\\\" z=\\\"\" << std::fixed << from[2] << \"\\\"/>\\n\";\n\t\tStream << \"\t<color r=\\\"\" << color.red << \"\\\" g=\\\"\" << color.green << \"\\\" b=\\\"\" << color.blue << \"\\\"/>\\n\";\n\t\tStream << \"</light>\\n\";\n\t}\n\n\tvoid on_gl_draw(const k3d::gl::render_state& State)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_AMBIENT, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_DIFFUSE, State.node_selection ? k3d::color(1, 1, 0) : k3d::color(0.4, 0.4, 0.4));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_SPECULAR, k3d::color(0, 0, 0));\n\t\tk3d::gl::material(GL_FRONT_AND_BACK, GL_EMISSION, k3d::color(0, 0, 0));\n\n\t\tglEnable(GL_LIGHTING);\n\t\tdraw_geometry();\n\t}\n\n\tvoid on_gl_select(const k3d::gl::render_state& State, const k3d::gl::selection_state& SelectState)\n\t{\n\t\tk3d::gl::store_attributes attributes;\n\n\t\tglDisable(GL_LIGHTING);\n\n\t\tk3d::gl::push_selection_token(this);\n\t\tdraw_geometry();\n\t\tk3d::gl::pop_selection_token();\n\t}\n\n\tk3d::iplugin_factory& factory()\n\t{\n\t\treturn get_factory();\n\t}\n\n\tstatic k3d::iplugin_factory& get_factory()\n\t{\n\t\tstatic k3d::document_plugin_factory<sun_light,\n\t\t\tk3d::interface_list<k3d::imatrix_source,\n\t\t\tk3d::interface_list<k3d::imatrix_sink > > > factory(\n\t\t\t\tk3d::uuid(0x9a48777d, 0xa68345b5, 0xacb9fc07, 0x8af3e7f6),\n\t\t\t\t\"YafraySunLight\",\n\t\t\t\t_(\"Yafray Sun Light\"),\n\t\t\t\t\"Yafray Light\",\n\t\t\t\tk3d::iplugin_factory::STABLE);\n\n\t\treturn factory;\n\t}\n\nprivate:\n\tvoid draw_geometry()\n\t{\n\t\tgluSphere(m_quadric, 0.2, 8, 8);\n\n\t\tconst k3d::matrix4 transform = matrix();\n\t\tconst k3d::point3 from = transform * k3d::point3(0, 0, 0);\n\t\tconst k3d::point3 to = k3d::point3(0, 0, 0);\n\t\tconst k3d::vector3 spherical = k3d::spherical(to - from);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::inverse(k3d::extract_rotation(transform)) * rotate3(k3d::quaternion(k3d::euler_angles(0, -spherical[2], spherical[1], k3d::euler_angles::ZXYstatic))));\n\n\t\tgluQuadricDrawStyle(m_quadric, GLU_FILL);\n\t\tgluQuadricNormals(m_quadric, GLU_SMOOTH);\n\t\tgluCylinder(m_quadric, 0.1, 0.001, 1, 8, 1);\n\t\tglPushMatrix();\n\t\tk3d::gl::push_matrix(k3d::translate3(0, 0, 0.5));\n\t\tgluCylinder(m_quadric, 0.3, 0.001, 0.5, 8, 1);\n\t\tglPopMatrix();\n\n\t\tglPopMatrix();\n\t}\n\n\t/// Stores a GLU quadric object for drawing the manipulators\n\tGLUquadricObj* const m_quadric;\n\n\tk3d_data(double, immutable_name, change_signal, with_undo, local_storage, no_constraint, writable_property, with_serialization) m_power;\n};\n\nk3d::iplugin_factory& sun_light_factory()\n{\n\treturn sun_light::get_factory();\n}\n\n} // namespace yafray\n\n} // namespace module\n\n\n"
  },
  {
    "path": "po/CMakeLists.txt",
    "content": "PROJECT(po)\n\nFIND_PROGRAM(K3D_INTLTOOL_UPDATE intltool-update)\n\nFIND_PROGRAM(K3D_XGETTEXT xgettext)\n\nFIND_PROGRAM(K3D_MSGMERGE msgmerge)\n\nFIND_PROGRAM(K3D_MSGFMT msgfmt)\n\nMESSAGE(STATUS \"generating i18n catalog\")\n\nSET(SKIP_FILES\n\t\"^share/shaders/\"\n\t)\n\nSET(LOCALIZABLE_FILES \"\")\nFILE(GLOB_RECURSE TEMP_FILES \"${k3d_SOURCE_DIR}/*.h\")\nLIST(APPEND LOCALIZABLE_FILES ${TEMP_FILES})\nFILE(GLOB_RECURSE TEMP_FILES \"${k3d_SOURCE_DIR}/*.cpp\")\nLIST(APPEND LOCALIZABLE_FILES ${TEMP_FILES})\nLIST(SORT LOCALIZABLE_FILES)\n\nFILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/POTFILES.in \"\")\nFOREACH(LOCALIZABLE_FILE ${LOCALIZABLE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_LOCALIZABLE_FILE ${k3d_SOURCE_DIR} ${LOCALIZABLE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_LOCALIZABLE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\t\tBREAK()\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\t\tFILE(APPEND ${CMAKE_CURRENT_BINARY_DIR}/POTFILES.in \"${RELATIVE_LOCALIZABLE_FILE}\\n\")\n\tENDIF()\nENDFOREACH()\n\nMESSAGE(STATUS \"  done\")\n\nADD_CUSTOM_COMMAND(\n\tDEPENDS ${CMAKE_CURRENT_BINARY_DIR}/POTFILES.in\n\tCOMMAND ${K3D_XGETTEXT} --files-from ${CMAKE_CURRENT_BINARY_DIR}/POTFILES.in --keyword=_ -o ${CMAKE_CURRENT_BINARY_DIR}/k3d.pot --copyright-holder=\"Timothy M. Shead\" --msgid-bugs-address=\"k3d-development@lists.sourceforge.net\" --no-wrap --no-location\n\tWORKING_DIRECTORY ${k3d_SOURCE_DIR}\n\tOUTPUT ${CMAKE_CURRENT_BINARY_DIR}/k3d.pot\n\t)\n\nSET(K3D_CATALOGS chef)\nSET(K3D_CATALOG_TARGETS \"\")\nFOREACH(catalog ${K3D_CATALOGS})\n\tADD_CUSTOM_TARGET(nls-update-${catalog}.po\n\t\tDEPENDS ${po_SOURCE_DIR}/${catalog}.po\n\t\tCOMMAND ${K3D_MSGMERGE} ${po_SOURCE_DIR}/${catalog}.po ${CMAKE_CURRENT_BINARY_DIR}/k3d.pot -o ${catalog}.po --no-wrap --sort-output\n\t\tWORKING_DIRECTORY ${po_SOURCE_DIR}\n\t\t)\n\n\tFILE(MAKE_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}/${catalog}/LC_MESSAGES\")\n\n\tADD_CUSTOM_COMMAND(\n\t\tDEPENDS ${po_SOURCE_DIR}/${catalog}.po\n\t\tCOMMAND ${K3D_MSGFMT} -c -o ${CMAKE_CURRENT_BINARY_DIR}/${catalog}/LC_MESSAGES/k3d.mo ${po_SOURCE_DIR}/${catalog}.po\n\t\tOUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${catalog}/LC_MESSAGES/k3d.mo\n\t\t)\n\n\tINSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${catalog}/LC_MESSAGES/k3d.mo\n\t\tDESTINATION share/k3d/locale/${catalog}/LC_MESSAGES\n\t\t)\n\n\tLIST(APPEND K3D_CATALOG_TARGETS ${CMAKE_CURRENT_BINARY_DIR}/${catalog}/LC_MESSAGES/k3d.mo)\nENDFOREACH(catalog)\n\nADD_CUSTOM_TARGET(nls ALL\n\tDEPENDS ${CMAKE_CURRENT_BINARY_DIR}/k3d.pot ${K3D_CATALOG_TARGETS}\n\t)\n\n"
  },
  {
    "path": "po/chef.po",
    "content": "# Swedish Chef translation of K-3D HEAD\n# Copyright (C) 2008, Timothy M. Shead\n# This file is distributed under the same license as the K-3D package.\n# Timothy M. Shead <tshead@k-3d.com>, 2008.\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: K-3D 0.7\\n\"\n\"Report-Msgid-Bugs-To: k3d-development@lists.sourceforge.net\\n\"\n\"POT-Creation-Date: 2012-04-28 12:16+0200\\n\"\n\"PO-Revision-Date: 2007-04-21 11:20+7\\n\"\n\"Last-Translator: Timothy M. Shead <tshead@k3d.com>\\n\"\n\"Language-Team: Swedish Chef <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\nmsgid \" [changed]\"\nmsgstr \" [chunged]\"\n\nmsgid \" [running]\"\nmsgstr \" [roonneeng]\"\n\n#, fuzzy\nmsgid \" mouth value.\"\nmsgstr \"Groot felooe-a\"\n\nmsgid \"%\"\nmsgstr \"%\"\n\n#, c-format\nmsgid \"%.2f%%\"\nmsgstr \"%.2f%%\"\n\nmsgid \"%1%\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"%1% \\\"%2%\\\" property\"\nmsgstr \"%1% Pruperteees\"\n\nmsgid \"+_X view\"\nmsgstr \"+_X feeoo\"\n\nmsgid \"+_Y view\"\nmsgstr \"+_Y feeoo\"\n\nmsgid \"+_Z view\"\nmsgstr \"+_Z feeoo\"\n\nmsgid \"--New %1%\"\nmsgstr \"--Noo %1%\"\n\nmsgid \"--None--\"\nmsgstr \"--Nune-a--\"\n\nmsgid \"-X view\"\nmsgstr \"-X feeoo\"\n\nmsgid \"-Y view\"\nmsgstr \"-Y feeoo\"\n\nmsgid \"-Z view\"\nmsgstr \"-Z feeoo\"\n\nmsgid \"0 : single face, >= 1 : segments\"\nmsgstr \"0 : seengle-a fece-a, >= 1 : segments\"\n\nmsgid \"3D mesh boolean operations\"\nmsgstr \"\"\n\nmsgid \"<b><i>Viewport:</i></b>\"\nmsgstr \"<b><i>Feeoopurt:</i></b>\"\n\nmsgid \"<big><b>Assign Hotkeys Mode</b></big>\"\nmsgstr \"<big><b>Esseegn Hutkeys Mude-a</b></big>\"\n\n#, fuzzy\nmsgid \"<big><b>Welcome to K-3D!</b></big>\"\nmsgstr \"Velcume-a tu K-3D!\"\n\nmsgid \"<span color=\\\"blue\\\">%1% (Experimental)</span>\"\nmsgstr \"<span color=\\\"blue\\\">%1% (Ixpereementel)</span>\"\n\nmsgid \"<span color=\\\"blue\\\">Create %1% (Experimental)</span>\"\nmsgstr \"<span color=\\\"blue\\\">Creete-a %1% (Ixpereementel)</span>\"\n\nmsgid \"<span color=\\\"red\\\" strikethrough=\\\"true\\\">%1%</span><span color=\\\"red\\\"> (Deprecated)</span>\"\nmsgstr \"<span color=\\\"red\\\" strikethrough=\\\"true\\\">%1%</span><span color=\\\"red\\\"> (Depreceted)</span>\"\n\nmsgid \"<span color=\\\"red\\\" strikethrough=\\\"true\\\">Create %1%</span><span color=\\\"red\\\"> (Deprecated)</span>\"\nmsgstr \"<span color=\\\"red\\\" strikethrough=\\\"true\\\">Creete-a %1%</span><span color=\\\"red\\\"> (Depreceted)</span>\"\n\nmsgid \"A RenderMan surface / displacement material\"\nmsgstr \"A RenderMun soorffece-a / deesplecement metereeel\"\n\nmsgid \"A file named \\\"%1%\\\" already exists.\"\nmsgstr \"A feele-a nemed \\\"%1%\\\" elreedy ixeests.\"\n\nmsgid \"A input bitmap\"\nmsgstr \"A inpoot beetmep\"\n\nmsgid \"A list of light sources that will contribute to the rendered output.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"A list of nodes that will be visible in the rendered output.\"\nmsgstr \"Cuntruls vhezeer thees nude-a veell be-a feesible-a in zee feenel rendered imege-a.\"\n\nmsgid \"A pair of indices_t and points_t arrays, indicating which positions to set\"\nmsgstr \"\"\n\nmsgid \"A shadow_map source within the 3D workspace\"\nmsgstr \"A shedoo_mep suoorce-a veethin zee 3D vurkspece-a\"\n\nmsgid \"AA min samples\"\nmsgstr \"EA meen semples\"\n\nmsgid \"AA passes\"\nmsgstr \"EA pesses\"\n\nmsgid \"AA pixelwidth\"\nmsgstr \"EA peexelvidt\"\n\nmsgid \"AA threshold\"\nmsgstr \"EA threshuld\"\n\nmsgid \"AA_minsamples\"\nmsgstr \"EA_meensemples\"\n\nmsgid \"AA_passes\"\nmsgstr \"EA_pesses\"\n\nmsgid \"AA_pixelwidth\"\nmsgstr \"EA_peexelvidt\"\n\nmsgid \"AA_threshold\"\nmsgstr \"EA_threshuld\"\n\nmsgid \"About K-3D\"\nmsgstr \"Ebuoot K-3D\"\n\nmsgid \"Absolute\"\nmsgstr \"Ebsuloote-a\"\n\n#, fuzzy\nmsgid \"Absorptive color.\"\nmsgstr \"Unnuteshun culur\"\n\n#, fuzzy\nmsgid \"Actions\"\nmsgstr \"Decureshuns\"\n\nmsgid \"Add\"\nmsgstr \"Edd\"\n\nmsgid \"Add Modifier %1%\"\nmsgstr \"Edd Mudeeffier %1%\"\n\nmsgid \"Add User Property:\"\nmsgstr \"Edd User Pruperty:\"\n\nmsgid \"Add a user property to %1%:\"\nmsgstr \"Edd a user pruperty tu %1%:\"\n\n#, fuzzy\nmsgid \"Add a user property.\"\nmsgstr \"Edd a user pruperty tu %1%:\"\n\nmsgid \"Add noise on X components\"\nmsgstr \"Edd nueese-a oon X cumpunents\"\n\nmsgid \"Add noise on Y components\"\nmsgstr \"Edd nueese-a oon Y cumpunents\"\n\nmsgid \"Add noise on Z components\"\nmsgstr \"Edd nueese-a oon Z cumpunents\"\n\n#, fuzzy\nmsgid \"Add parameter attributes\"\nmsgstr \"Peremeter felooe-a\"\n\nmsgid \"Add point attributes\"\nmsgstr \"\"\n\nmsgid \"Add point data to the parameter attribute arrays\"\nmsgstr \"\"\n\nmsgid \"Add point data to the points attribute array\"\nmsgstr \"\"\n\nmsgid \"Add point data to the vertex attribute arrays\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Add two double inputs and produce their sum as output\"\nmsgstr \"Edd tvu sceler inpoots und prudooce-a zeeur soom es ooootpoot\"\n\nmsgid \"Add value\"\nmsgstr \"Edd felooe-a\"\n\nmsgid \"Add value to each pixel color component\"\nmsgstr \"Edd felooe-a tu iech peexel culur cumpunent\"\n\n#, fuzzy\nmsgid \"Add value to each pixel color component using the CUDA API\"\nmsgstr \"Edd felooe-a tu iech peexel culur cumpunent\"\n\nmsgid \"Add value to each pixel's Red, Green and Blue component\"\nmsgstr \"Edd felooe-a tu iech peexel's Red, Greee und Blooe-a cumpunent\"\n\n#, fuzzy\nmsgid \"Add vertex attributes\"\nmsgstr \"RenderMun Ettreeboote-a\"\n\nmsgid \"Adds a color attribute to a mesh component, primarily for testing purposes.\"\nmsgstr \"\"\n\nmsgid \"Adds a new knot in either u or v direction to all selected patches\"\nmsgstr \"\"\n\nmsgid \"Adds a trimming curve to the selected patch\"\nmsgstr \"\"\n\nmsgid \"Adds an color attribute to every table in a mesh, primarily for testing purposes.\"\nmsgstr \"\"\n\nmsgid \"Adds an integer 'index' attribute to every table in a mesh, primarily for testing purposes.\"\nmsgstr \"\"\n\nmsgid \"Adds variable-sharpness corners to SDS surfaces\"\nmsgstr \"Edds fereeeble-a-sherpness curners tu SDS soorffeces\"\n\nmsgid \"Adds variable-sharpness creases to SDS surfaces\"\nmsgstr \"Edds fereeeble-a-sherpness creeses tu SDS soorffeces\"\n\nmsgid \"Aim Selection\"\nmsgstr \"Eeem Selecshun\"\n\nmsgid \"Aim selection\"\nmsgstr \"Eeem selecshun\"\n\n#, fuzzy\nmsgid \"Align Normal\"\nmsgstr \"Nurmel\"\n\nmsgid \"Align the curve normal, insted of preserving the start alignment\"\nmsgstr \"\"\n\nmsgid \"Alignment\"\nmsgstr \"\"\n\nmsgid \"All Files\"\nmsgstr \"Ell Feeles\"\n\nmsgid \"Allows panel to change depending on active tool\"\nmsgstr \"Elloos punel tu chunge-a dependeeng oon ecteefe-a tuul\"\n\nmsgid \"Along\"\nmsgstr \"Elung\"\n\nmsgid \"Alpha threshold\"\nmsgstr \"Elpha threshuld\"\n\nmsgid \"AlternateArray1D\"\nmsgstr \"ElterneteErrey1D\"\n\nmsgid \"AlternateArray2D\"\nmsgstr \"ElterneteErrey2D\"\n\nmsgid \"AlternateArray3D\"\nmsgstr \"ElterneteErrey3D\"\n\n#, fuzzy\nmsgid \"Amount\"\nmsgstr \"Cuoont\"\n\n#, fuzzy\nmsgid \"Amount Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"Amplitude\"\nmsgstr \"Empleetoode-a\"\n\nmsgid \"Angle\"\nmsgstr \"Ungle-a\"\n\nmsgid \"Angle 1\"\nmsgstr \"Ungle-a 1\"\n\nmsgid \"Angle 2\"\nmsgstr \"Ungle-a 2\"\n\nmsgid \"Angle 3\"\nmsgstr \"Ungle-a 3\"\n\n#, fuzzy\nmsgid \"Animate Transformation\"\nmsgstr \"Trunsffurmeshun\"\n\nmsgid \"Animation start time must be less-than end time.\"\nmsgstr \"\"\n\nmsgid \"Annotation\"\nmsgstr \"Unnuteshun\"\n\nmsgid \"Annotation color\"\nmsgstr \"Unnuteshun culur\"\n\nmsgid \"Annotation text\"\nmsgstr \"Unnuteshun text\"\n\nmsgid \"Anti-aliasing type\"\nmsgstr \"Untee-eleeesing type-a\"\n\nmsgid \"Append filename extension automatically\"\nmsgstr \"Eppend feeleneme-a ixtenseeun ootumeteecelly\"\n\n#, fuzzy\nmsgid \"Applies a gain function to the texture.\"\nmsgstr \"Eppleees a seene-a fooncshun tu its inpoot\"\n\n#, fuzzy\nmsgid \"Applies a gamma function to the texture.\"\nmsgstr \"Eppleees a seene-a fooncshun tu its inpoot\"\n\nmsgid \"Applies a linear noise offset to mesh points\"\nmsgstr \"Eppleees a leeneer nueese-a ooffffset tu mesh pueents\"\n\n#, fuzzy\nmsgid \"Applies a selection to a mesh.\"\nmsgstr \"Eppleees a seene-a fooncshun tu its inpoot\"\n\nmsgid \"Applies a sine function to its input\"\nmsgstr \"Eppleees a seene-a fooncshun tu its inpoot\"\n\nmsgid \"Applies a wave function to points along an axis\"\nmsgstr \"Eppleees a vefe-a fooncshun tu pueents elung un exees\"\n\nmsgid \"Applies an OpenGL shader to downstream painters\"\nmsgstr \"Eppleees un OopenGL sheder tu doonstreem peeenters\"\n\nmsgid \"Applies morph to different targets, interpolating between target and source position\"\nmsgstr \"\"\n\nmsgid \"Apply\"\nmsgstr \"\"\n\nmsgid \"Apply gamma value to each pixel\"\nmsgstr \"Epply gemma felooe-a tu iech peexel\"\n\n#, fuzzy\nmsgid \"Apply gamma value to each pixel using the CUDA API\"\nmsgstr \"Epply gemma felooe-a tu iech peexel\"\n\n#, fuzzy\nmsgid \"Apply gamma value to each pixel.\"\nmsgstr \"Epply gemma felooe-a tu iech peexel\"\n\nmsgid \"Apply modifications.\"\nmsgstr \"\"\n\nmsgid \"Apply offset on X component\"\nmsgstr \"Epply ooffffset oon X cumpunent\"\n\nmsgid \"Apply offset on Y component\"\nmsgstr \"Epply ooffffset oon Y cumpunent\"\n\nmsgid \"Apply offset on Z component\"\nmsgstr \"Epply ooffffset oon Z cumpunent\"\n\nmsgid \"Apply the Kill Edge And Vertex (KEV) Euler operation to the selected edges\"\nmsgstr \"\"\n\nmsgid \"Apply the Kill Edge Make Loop (KEML) Euler operation to the selected edges\"\nmsgstr \"\"\n\nmsgid \"Aproximates points with a surface given a set of equations.\"\nmsgstr \"\"\n\nmsgid \"Around\"\nmsgstr \"Eruoond\"\n\n#, fuzzy\nmsgid \"Array\"\nmsgstr \"Pruperty Type-a\"\n\nmsgid \"Array Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Array Type\"\nmsgstr \"Pruperty Type-a\"\n\nmsgid \"Array storage class\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Arrow size\"\nmsgstr \"Pueent Seeze-a\"\n\nmsgid \"Aspect Ratio\"\nmsgstr \"Espect Reteeu\"\n\nmsgid \"Aspect Ratio Type\"\nmsgstr \"Espect Reteeu Type-a\"\n\nmsgid \"Assign Hotkeys:\"\nmsgstr \"Esseegn Hutkeys:\"\n\nmsgid \"Assign _Hotkeys\"\nmsgstr \"Esseegn _Hutkeys\"\n\nmsgid \"Assign a human-readable name to identify this node.\"\nmsgstr \"Esseegn a hoomun-reedeble-a neme-a tu identeeffy thees nude-a.\"\n\nmsgid \"Atmosphere Shader\"\nmsgstr \"Etmusphere-a Sheder\"\n\nmsgid \"Atmosphere shader\"\nmsgstr \"Etmusphere-a sheder\"\n\nmsgid \"Attribute Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Auto Center\"\nmsgstr \"Center\"\n\nmsgid \"Automagic\"\nmsgstr \"Ootumegeec\"\n\nmsgid \"Automatic file detection\"\nmsgstr \"Ootumeteec feele-a detecshun\"\n\nmsgid \"Axes\"\nmsgstr \"Exes\"\n\nmsgid \"Axis\"\nmsgstr \"Exees\"\n\nmsgid \"Axis along which the curve gets extruded\"\nmsgstr \"\"\n\nmsgid \"Axis to bend along\"\nmsgstr \"Exees tu bend elung\"\n\nmsgid \"Axis to bend around\"\nmsgstr \"Exees tu bend eruoond\"\n\nmsgid \"Axis to bulge along\"\nmsgstr \"Exees tu boolge-a elung\"\n\n#, fuzzy\nmsgid \"Axis to revolve around\"\nmsgstr \"Exees tu bend eruoond\"\n\nmsgid \"Axis1\"\nmsgstr \"Exees1\"\n\nmsgid \"Axis2\"\nmsgstr \"Exees2\"\n\nmsgid \"Axis3\"\nmsgstr \"Exees3\"\n\nmsgid \"B input bitmap\"\nmsgstr \"B inpoot beetmep\"\n\nmsgid \"Background Color\"\nmsgstr \"Beckgruoond Culur\"\n\nmsgid \"Background color\"\nmsgstr \"Beckgruoond culur\"\n\nmsgid \"Basic angle\"\nmsgstr \"Beseec ungle-a\"\n\nmsgid \"Beam falloff\"\nmsgstr \"Beem felluffff\"\n\nmsgid \"\"\n\"Below are example documents you can\\n\"\n\"use to become familiar with K-3D.\"\nmsgstr \"\"\n\nmsgid \"Bend angle\"\nmsgstr \"Bend ungle-a\"\n\nmsgid \"Bend position\"\nmsgstr \"Bend puseeshun\"\n\nmsgid \"Bend tightness\"\nmsgstr \"Bend teeghtness\"\n\nmsgid \"Bends mesh points around an axis\"\nmsgstr \"Bends mesh pueents eruoond un exees\"\n\nmsgid \"Bezier curves subdivision number\"\nmsgstr \"Bezeeer coorfes soobdeefisiun noomber\"\n\nmsgid \"Bias\"\nmsgstr \"Beees\"\n\nmsgid \"Binding plugin module %1%\"\nmsgstr \"Beending ploogeen mudoole-a %1%\"\n\nmsgid \"Bitmap\"\nmsgstr \"Beetmep\"\n\nmsgid \"Bitmap color\"\nmsgstr \"Beetmep culur\"\n\nmsgid \"Bitmap height\"\nmsgstr \"Beetmep heeeght\"\n\nmsgid \"Bitmap modifier that uses a script to modify an input bitmap\"\nmsgstr \"Beetmep mudeeffier thet uses a screept tu mudeeffy un inpoot beetmep\"\n\nmsgid \"Bitmap source that uses a script to generate images\"\nmsgstr \"Beetmep suoorce-a thet uses a screept tu generete-a imeges\"\n\nmsgid \"Bitmap width\"\nmsgstr \"Beetmep veedt\"\n\nmsgid \"Bitmap writer that saves JPEG (*.jpg) files\"\nmsgstr \"Beetmep vreeter thet sefes JPEG (*.jpg) feeles\"\n\nmsgid \"Bitmap writer that saves PNG (*.png) files\"\nmsgstr \"Beetmep vreeter thet sefes PNG (*.png) feeles\"\n\nmsgid \"Bitmap writer that saves TIFF (*.tiff) files\"\nmsgstr \"Beetmep vreeter thet sefes TIFF (*.teeffff) feeles\"\n\nmsgid \"Blackbody Gain\"\nmsgstr \"\"\n\nmsgid \"Blackbody Temperature\"\nmsgstr \"\"\n\nmsgid \"Blackbody Temperature Gain, multiplier.\"\nmsgstr \"\"\n\nmsgid \"Blackbody Temperature of the light source in degrees kelvin.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Blue\"\nmsgstr \"Felooe-a\"\n\nmsgid \"Blue threshold\"\nmsgstr \"Blooe-a threshuld\"\n\nmsgid \"Blue weight\"\nmsgstr \"Blooe-a veeeght\"\n\nmsgid \"Boolean operation (intersection, union, difference, reverse difference)\"\nmsgstr \"Buuleun oopereshun (intersecshun, uneeun, deefffference-a, referse-a deefffference-a)\"\n\n#, fuzzy\nmsgid \"Border Color\"\nmsgstr \"Greed Culur\"\n\n#, fuzzy\nmsgid \"Border Opacity\"\nmsgstr \"Oopeceety\"\n\nmsgid \"Bottom\"\nmsgstr \"Buttum\"\n\nmsgid \"Bottom radius\"\nmsgstr \"Buttum redeeoos\"\n\nmsgid \"Bottom segments\"\nmsgstr \"Buttum segments\"\n\nmsgid \"Boundary weight\"\nmsgstr \"Buoondery veeeght\"\n\nmsgid \"Breaks a NURBS curve at a given u value (0...1)\"\nmsgstr \"\"\n\nmsgid \"Browse for a file ...\"\nmsgstr \"Broose-a fur a feele-a ...\"\n\nmsgid \"Browse for an input bitmap\"\nmsgstr \"Broose-a fur un inpoot beetmep\"\n\nmsgid \"Bucket Height\"\nmsgstr \"Boocket Heeeght\"\n\nmsgid \"Bucket Width\"\nmsgstr \"Boocket Veedt\"\n\n#, fuzzy\nmsgid \"Builtin Properties\"\nmsgstr \"Tuul Pruperteees\"\n\nmsgid \"Bulge amount\"\nmsgstr \"Boolge-a emuoont\"\n\nmsgid \"Bulge factor\"\nmsgstr \"Boolge-a fectur\"\n\nmsgid \"Bulge type\"\nmsgstr \"Boolge-a type-a\"\n\nmsgid \"Bulges mesh points around a point\"\nmsgstr \"Boolges mesh pueents eruoond a pueent\"\n\n#, fuzzy\nmsgid \"Bumpmap\"\nmsgstr \"Beetmep\"\n\nmsgid \"By default the knot gets inserted into the patch in u direction, by checking this box you choose to insert it to v\"\nmsgstr \"\"\n\nmsgid \"By default the u direction gets elevated, by checking this box you choose to elevate v\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Bypass modifier\"\nmsgstr \"Mesh Mudeeffier\"\n\nmsgid \"COLLADA ( .dae )\"\nmsgstr \"\"\n\nmsgid \"Calculate a perceptual difference metric between two bitmap images\"\nmsgstr \"Celcoolete-a a perceptooel deefffference-a metreec betveee tvu beetmep imeges\"\n\nmsgid \"Calculated centroid\"\nmsgstr \"\"\n\nmsgid \"Calculates a C-style expression, returning a double value as output\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Calculates a variety of polygon normals\"\nmsgstr \"Seemooletes smuut geumetry by eferegeeng pulygun nurmels\"\n\nmsgid \"Calculates input mesh area\"\nmsgstr \"\"\n\nmsgid \"Calculates input mesh volume\"\nmsgstr \"\"\n\nmsgid \"Calculates the average position (centroid) of the points, weighted by the selection value\"\nmsgstr \"\"\n\nmsgid \"Calculates the position of the Sun based on observer position, date, and time.\"\nmsgstr \"\"\n\nmsgid \"Camera\"\nmsgstr \"Cemera\"\n\nmsgid \"Can't Redo\"\nmsgstr \"Cun't Redu\"\n\nmsgid \"Can't Undo\"\nmsgstr \"Cun't Undu\"\n\nmsgid \"Can't redo\"\nmsgstr \"Cun't redu\"\n\nmsgid \"Can't redo all\"\nmsgstr \"Cun't redu ell\"\n\nmsgid \"Can't undo\"\nmsgstr \"Cun't undu\"\n\nmsgid \"Can't undo all\"\nmsgstr \"Cun't undu ell\"\n\nmsgid \"Cancel\"\nmsgstr \"Cuncel\"\n\nmsgid \"Cannot render animation with zero frame rate.\"\nmsgstr \"\"\n\nmsgid \"Cap\"\nmsgstr \"\"\n\nmsgid \"Cap cone bottom\"\nmsgstr \"Cep cune-a buttum\"\n\nmsgid \"Cap cylinder bottom\"\nmsgstr \"Cep cyleender buttum\"\n\nmsgid \"Cap cylinder top\"\nmsgstr \"Cep cyleender tup\"\n\nmsgid \"Cap each bevelled point with a new face.\"\nmsgstr \"\"\n\nmsgid \"Cap faces\"\nmsgstr \"Cep feces\"\n\nmsgid \"Cap holes (missing faces) in polyhedra\"\nmsgstr \"Cep hules (meessing feces) in pulyhedra\"\n\nmsgid \"Cap holes in faces\"\nmsgstr \"Cep hules in feces\"\n\nmsgid \"Cap polyhedra\"\nmsgstr \"Cep pulyhedra\"\n\nmsgid \"Caps (fills) holes in a polyhedron\"\nmsgstr \"Ceps (feells) hules in a pulyhedrun\"\n\nmsgid \"Cast shadows\"\nmsgstr \"Cest shedoos\"\n\nmsgid \"Cauchy B\"\nmsgstr \"\"\n\nmsgid \"Cauchy B Texture\"\nmsgstr \"\"\n\nmsgid \"Cauchy B coefficient.\"\nmsgstr \"\"\n\nmsgid \"Caustics\"\nmsgstr \"Coosteecs\"\n\nmsgid \"Center\"\nmsgstr \"Center\"\n\nmsgid \"Center X\"\nmsgstr \"Center X\"\n\nmsgid \"Center X components around origin\"\nmsgstr \"Center X cumpunents eruoond ooreegin\"\n\nmsgid \"Center Y\"\nmsgstr \"Center Y\"\n\nmsgid \"Center Y components around origin\"\nmsgstr \"Center Y cumpunents eruoond ooreegin\"\n\nmsgid \"Center Z\"\nmsgstr \"Center Z\"\n\nmsgid \"Center Z components around origin\"\nmsgstr \"Center Z cumpunents eruoond ooreegin\"\n\n#, fuzzy\nmsgid \"Center on Origin\"\nmsgstr \"Render Ingeene-a\"\n\n#, fuzzy\nmsgid \"Center the output mesh around the origin.\"\nmsgstr \"Centers mesh pueents eruoond zee ooreegin\"\n\nmsgid \"Centers mesh points around the origin\"\nmsgstr \"Centers mesh pueents eruoond zee ooreegin\"\n\n#, fuzzy\nmsgid \"Centroid\"\nmsgstr \"Center\"\n\n#, fuzzy\nmsgid \"Change %1%\"\nmsgstr \"Creete-a %1%\"\n\n#, fuzzy\nmsgid \"Change %1% to %2%\"\nmsgstr \"Leene-a: %1% Culoomn: %2%\"\n\nmsgid \"Changes the first edge for selected polygons\"\nmsgstr \"Chunges zee furst idge-a fur selected pulyguns\"\n\nmsgid \"Check (rectangle) height\"\nmsgstr \"Check (rectungle-a) heeeght\"\n\nmsgid \"Check (rectangle) width\"\nmsgstr \"Check (rectungle-a) veedt\"\n\nmsgid \"Check All\"\nmsgstr \"Check Ell\"\n\nmsgid \"Check height\"\nmsgstr \"Check heeeght\"\n\nmsgid \"Check to ensure that you have Yafray installed, and that the PATH environment variable points to the Yafray installation directory.\"\nmsgstr \"Check tu insoore-a thet yuoo hefe-a Yeffrey instelled, und thet zee PETH infurunment fereeeble-a pueents tu zee Yeffrey instelleshun durectury.\"\n\nmsgid \"Check width\"\nmsgstr \"Check veedt\"\n\nmsgid \"Checks OpenGL version and warns if it is known to contain bugs affecting K-3D\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Child Mesh Color\"\nmsgstr \"Greed Culur\"\n\n#, fuzzy\nmsgid \"Choose RenderMan Implementation\"\nmsgstr \"Frum RenderMun speceefficeshun\"\n\nmsgid \"Choose a camera\"\nmsgstr \"Chuuse-a a cemera\"\n\nmsgid \"Choose a predefined aspect ratio\"\nmsgstr \"Chuuse-a a predeffeened espect reteeu\"\n\nmsgid \"Choose a predefined image resolution\"\nmsgstr \"Chuuse-a a predeffeened imege-a resulooshun\"\n\nmsgid \"Choose a render engine to be used for animation rendering\"\nmsgstr \"Chuuse-a a render ingeene-a tu be-a used fur uneemeshun rendereeng\"\n\nmsgid \"Choose a render engine to be used for preview image rendering\"\nmsgstr \"Chuuse-a a render ingeene-a tu be-a used fur prefeeoo imege-a rendereeng\"\n\nmsgid \"Choose a render engine to be used for still image rendering\"\nmsgstr \"Chuuse-a a render ingeene-a tu be-a used fur steell imege-a rendereeng\"\n\nmsgid \"Choose an OpenGL render engine to be used for drawing\"\nmsgstr \"Chuuse-a un OopenGL render ingeene-a tu be-a used fur dreveeng\"\n\n#, fuzzy\nmsgid \"Choose an installed RenderMan engine to be used for rendering.\"\nmsgstr \"Chuuse-a un OopenGL render ingeene-a tu be-a used fur dreveeng\"\n\nmsgid \"Choose animation output files:\"\nmsgstr \"Chuuse-a uneemeshun ooootpoot feeles:\"\n\nmsgid \"Choose export plugin:\"\nmsgstr \"Chuuse-a ixpurt ploogeen:\"\n\nmsgid \"Choose import plugin:\"\nmsgstr \"Chuuse-a impurt ploogeen:\"\n\nmsgid \"Choose the format for output files:\"\nmsgstr \"Chuuse-a zee furmet fur ooootpoot feeles:\"\n\nmsgid \"Choose the name of the executable that will be run to render YAFRAY scene files.\"\nmsgstr \"\"\n\nmsgid \"Choose whether to store absolute or relative filepaths\"\nmsgstr \"Chuuse-a vhezeer tu sture-a ebsuloote-a oor releteefe-a feelepeths\"\n\nmsgid \"Cl_ose without Saving\"\nmsgstr \"Cl_oose-a veethuoot Sefeeng\"\n\nmsgid \"Clamp Alpha channel to threshold\"\nmsgstr \"Clemp Elpha chunnel tu threshuld\"\n\nmsgid \"Clamp Blue channel to threshold\"\nmsgstr \"Clemp Blooe-a chunnel tu threshuld\"\n\nmsgid \"Clamp Green channel to threshold\"\nmsgstr \"Clemp Greee chunnel tu threshuld\"\n\nmsgid \"Clamp Red channel to threshold\"\nmsgstr \"Clemp Red chunnel tu threshuld\"\n\nmsgid \"Clear Selection\"\nmsgstr \"Cleer Selecshun\"\n\nmsgid \"Closed\"\nmsgstr \"Clused\"\n\nmsgid \"Closed Curve\"\nmsgstr \"Clused Coorfe-a\"\n\nmsgid \"Closed curve (loop)\"\nmsgstr \"Clused coorfe-a (luup)\"\n\nmsgid \"Closed form\"\nmsgstr \"Clused furm\"\n\nmsgid \"Cloth simulation (currently for grids only)\"\nmsgstr \"\"\n\nmsgid \"Cluster\"\nmsgstr \"Clooster\"\n\nmsgid \"Coefficients\"\nmsgstr \"\"\n\nmsgid \"Collapse\"\nmsgstr \"Cullepse-a\"\n\nmsgid \"Collapse All\"\nmsgstr \"Cullepse-a Ell\"\n\nmsgid \"Color\"\nmsgstr \"Culur\"\n\nmsgid \"Color 1\"\nmsgstr \"Culur 1\"\n\nmsgid \"Color 2\"\nmsgstr \"Culur 2\"\n\n#, fuzzy\nmsgid \"Color Array\"\nmsgstr \"Culur 1\"\n\n#, fuzzy\nmsgid \"Color Texture\"\nmsgstr \"Textoore-a U\"\n\n#, fuzzy\nmsgid \"Color of the numbers\"\nmsgstr \"Culoomn noomber\"\n\nmsgid \"Color of the text\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Color selected components are drawn in\"\nmsgstr \"Center X cumpunents eruoond ooreegin\"\n\nmsgid \"Color source that uses a script to create the output value\"\nmsgstr \"Culur suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\nmsgid \"Color the mesh is drawn in when it is unselected\"\nmsgstr \"\"\n\nmsgid \"Color the mesh is drawn in when its parent is selected\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Color to apply to selected faces\"\nmsgstr \"Nurmel culur fur selected pulyguns\"\n\nmsgid \"Color unselected components are drawn in when their mesh is selected\"\nmsgstr \"\"\n\nmsgid \"Color used for unselected faces in case no previous array existed\"\nmsgstr \"\"\n\nmsgid \"Column number\"\nmsgstr \"Culoomn noomber\"\n\nmsgid \"Column number (X axis)\"\nmsgstr \"Culoomn noomber (X exees)\"\n\nmsgid \"Columns\"\nmsgstr \"Culoomns\"\n\n#, fuzzy\nmsgid \"Combines blobbies using the Addition operator.\"\nmsgstr \"Cumbeenes suleeds useeng buuleun oopereturs et render-teeme-a\"\n\n#, fuzzy\nmsgid \"Combines blobbies using the Division operator.\"\nmsgstr \"Cumbeenes suleeds useeng buuleun oopereturs et render-teeme-a\"\n\n#, fuzzy\nmsgid \"Combines blobbies using the Maximum operator.\"\nmsgstr \"Cumbeenes suleeds useeng buuleun oopereturs et render-teeme-a\"\n\n#, fuzzy\nmsgid \"Combines blobbies using the Minimum operator.\"\nmsgstr \"Cumbeenes suleeds useeng buuleun oopereturs et render-teeme-a\"\n\nmsgid \"Combines blobbies using the Multiplication operator.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Combines blobbies using the Negation operator.\"\nmsgstr \"Cumbeenes suleeds useeng buuleun oopereturs et render-teeme-a\"\n\n#, fuzzy\nmsgid \"Combines blobbies using the Subtraction operator.\"\nmsgstr \"Cumbeenes suleeds useeng buuleun oopereturs et render-teeme-a\"\n\nmsgid \"Combines solids using boolean operators at render-time\"\nmsgstr \"Cumbeenes suleeds useeng buuleun oopereturs et render-teeme-a\"\n\n#, fuzzy\nmsgid \"Commit\"\nmsgstr \"imeet\"\n\nmsgid \"Commit modifications to the underlying property.\"\nmsgstr \"\"\n\nmsgid \"Compactness ratio\"\nmsgstr \"Cumpectness reteeu\"\n\n#, fuzzy\nmsgid \"Component\"\nmsgstr \"Cumpunent type-a\"\n\nmsgid \"Component Paint Mode\"\nmsgstr \"Cumpunent Peeent Mude-a\"\n\nmsgid \"Compress output file\"\nmsgstr \"Cumpress ooootpoot feele-a\"\n\nmsgid \"Computes skylight without atmospheric scattering.\"\nmsgstr \"\"\n\nmsgid \"Computes the inverse of a matrix.\"\nmsgstr \"\"\n\nmsgid \"Configurable set of axes to help in visualizing the 3D workspace\"\nmsgstr \"Cunffeegooreble-a set ooff exes tu help in feesooelizing zee 3D vurkspece-a\"\n\nmsgid \"Connect Properties\"\nmsgstr \"Cunnect Pruperteees\"\n\nmsgid \"Connect to ...\"\nmsgstr \"Cunnect tu ...\"\n\n#, fuzzy\nmsgid \"Connects a set of NURBS curves\"\nmsgstr \"Renders NOoRBS coorfes\"\n\nmsgid \"Connects the 2 end points of the selected curve\"\nmsgstr \"\"\n\nmsgid \"Constrains points to the surface of a sphere\"\nmsgstr \"Cunstreeens pueents tu zee soorffece-a ooff a sphere-a\"\n\nmsgid \"Contains records storing the execution time for individual node tasks.\"\nmsgstr \"\"\n\nmsgid \"Continuous playback\"\nmsgstr \"Cunteenoouoos pleybeck\"\n\nmsgid \"Continuous reverse playback\"\nmsgstr \"Cunteenoouoos referse-a pleybeck\"\n\nmsgid \"Contraction type\"\nmsgstr \"Cuntrecshun type-a\"\n\nmsgid \"Control the rendered edge width (in pixels).\"\nmsgstr \"\"\n\nmsgid \"Controls sky clarity / haziness.\"\nmsgstr \"\"\n\nmsgid \"Controls sky_light clarity / haziness.\"\nmsgstr \"\"\n\nmsgid \"Controls sun_light clarity / haziness.\"\nmsgstr \"\"\n\nmsgid \"Controls the alignment of adjacent lines of text.\"\nmsgstr \"\"\n\nmsgid \"Controls the amount of taper, 0 = no taper, 1 = taper to a point.\"\nmsgstr \"Cuntruls zee emuoont ooff teper, 0 = nu teper, 1 = teper tu a pueent.\"\n\nmsgid \"Controls the current time displayed in the viewports.\"\nmsgstr \"Cuntruls zee coorrent teeme-a deespleyed in zee feeoopurts.\"\n\n#, fuzzy\nmsgid \"Controls the curve to be selected.\"\nmsgstr \"Cuntruls zee coorrent teeme-a deespleyed in zee feeoopurts.\"\n\nmsgid \"Controls the end time (in seconds) for rendering animations.\"\nmsgstr \"Cuntruls zee ind teeme-a (in secunds) fur rendereeng uneemeshuns.\"\n\nmsgid \"Controls the frame rate (in frames-per-second) for rendering animations.\"\nmsgstr \"Cuntruls zee freme-a rete-a (in fremes-per-secund) fur rendereeng uneemeshuns.\"\n\n#, fuzzy\nmsgid \"Controls the major radius of the output torus.\"\nmsgstr \"Cuntruls zee emuoont ooff teper, 0 = nu teper, 1 = teper tu a pueent.\"\n\n#, fuzzy\nmsgid \"Controls the minor radius of the output torus.\"\nmsgstr \"Cuntruls zee emuoont ooff teper, 0 = nu teper, 1 = teper tu a pueent.\"\n\nmsgid \"Controls the radius of each blobby segment.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Controls the radius of the output cone.\"\nmsgstr \"Cuntruls zee emuoont ooff teper, 0 = nu teper, 1 = teper tu a pueent.\"\n\n#, fuzzy\nmsgid \"Controls the radius of the output cylinder.\"\nmsgstr \"Cuntruls zee emuoont ooff teper, 0 = nu teper, 1 = teper tu a pueent.\"\n\n#, fuzzy\nmsgid \"Controls the radius of the output disk.\"\nmsgstr \"Cuntruls zee emuoont ooff teper, 0 = nu teper, 1 = teper tu a pueent.\"\n\n#, fuzzy\nmsgid \"Controls the radius of the output logo.\"\nmsgstr \"Cuntruls zee emuoont ooff teper, 0 = nu teper, 1 = teper tu a pueent.\"\n\n#, fuzzy\nmsgid \"Controls the radius of the output paraboloid.\"\nmsgstr \"Cuntruls zee emuoont ooff teper, 0 = nu teper, 1 = teper tu a pueent.\"\n\n#, fuzzy\nmsgid \"Controls the radius the output sphere.\"\nmsgstr \"Cuntruls zee emuoont ooff teper, 0 = nu teper, 1 = teper tu a pueent.\"\n\nmsgid \"Controls the sensitivity for deciding when to simplify coplanar faces or collinear edges.\"\nmsgstr \"\"\n\nmsgid \"Controls the sensitivity for deciding when two edges are collinear.\"\nmsgstr \"\"\n\nmsgid \"Controls the sharpness of subdivision surface corners\"\nmsgstr \"Cuntruls zee sherpness ooff soobdeefisiun soorffece-a curners\"\n\nmsgid \"Controls the sharpness of subdivision surface creases\"\nmsgstr \"Cuntruls zee sherpness ooff soobdeefisiun soorffece-a creeses\"\n\nmsgid \"Controls the spacing between lines of text.\"\nmsgstr \"\"\n\nmsgid \"Controls the start time (in seconds) for rendering animations.\"\nmsgstr \"Cuntruls zee stert teeme-a (in secunds) fur rendereeng uneemeshuns.\"\n\n#, fuzzy\nmsgid \"Controls the width of the output points.\"\nmsgstr \"Cuntruls zee emuoont ooff teper, 0 = nu teper, 1 = teper tu a pueent.\"\n\nmsgid \"Controls whether this node will be visibile in the viewport.\"\nmsgstr \"Cuntruls vhezeer thees nude-a veell be-a feesibile-a in zee feeoopurt.\"\n\nmsgid \"Controls whether this node will be visible during shadow-map render passes.\"\nmsgstr \"Cuntruls vhezeer thees nude-a veell be-a feesible-a dooreeng shedoo-mep render pesses.\"\n\nmsgid \"Controls whether this node will be visible in the final rendered image.\"\nmsgstr \"Cuntruls vhezeer thees nude-a veell be-a feesible-a in zee feenel rendered imege-a.\"\n\n#, fuzzy\nmsgid \"Convert Selection\"\nmsgstr \"Cleer Selecshun\"\n\nmsgid \"Convert a CUDA mesh to a k3d mesh\"\nmsgstr \"\"\n\nmsgid \"Convert a k3d mesh do a CUDA mesh\"\nmsgstr \"\"\n\nmsgid \"Convert the current selection when changing the selection mode.\"\nmsgstr \"\"\n\nmsgid \"Converts a bitmap into a RenderMan LatLong Environment Map\"\nmsgstr \"Cunferts a beetmep intu a RenderMun LetLung Infurunment Mep\"\n\nmsgid \"Converts a bitmap into a RenderMan Texture Map\"\nmsgstr \"Cunferts a beetmep intu a RenderMun Textoore-a Mep\"\n\n#, fuzzy\nmsgid \"Converts a double to a string using printf() style double_to_stringting\"\nmsgstr \"Cunferts a sceler tu a streeng useeng preentff() style-a furmetteeng\"\n\nmsgid \"Converts a scalar to a string using strftime()-style formatting\"\nmsgstr \"Cunferts a sceler tu a streeng useeng strffteeme-a()-style-a furmetteeng\"\n\nmsgid \"Converts input faces into triangles\"\nmsgstr \"Cunferts inpoot feces intu treeungles\"\n\n#, fuzzy\nmsgid \"Converts input geometric points into a single group of particles.\"\nmsgstr \"Cunferts inpoot gpreems intu a seengle-a pueent gruoop\"\n\nmsgid \"Converts input polyhedra to SDS surfaces\"\nmsgstr \"Cunferts inpoot pulyhedra tu SDS soorffeces\"\n\n#, fuzzy\nmsgid \"Converts input quadrilaterals to bilinear patches.\"\nmsgstr \"Cunferts inpoot qooedreeleterels tu beelineer petches\"\n\nmsgid \"Converts point selections to patch selections.\"\nmsgstr \"\"\n\nmsgid \"Converts primitive selections to curve selections.\"\nmsgstr \"\"\n\nmsgid \"Converts primitive selections to edge selections.\"\nmsgstr \"\"\n\nmsgid \"Converts primitive selections to face selections.\"\nmsgstr \"\"\n\nmsgid \"Converts primitive selections to point selections.\"\nmsgstr \"\"\n\nmsgid \"Coons\"\nmsgstr \"\"\n\nmsgid \"Coordinate space\"\nmsgstr \"Cuurdeenete-a spece-a\"\n\nmsgid \"Coordinate space (matrix)\"\nmsgstr \"Cuurdeenete-a spece-a (metreex)\"\n\nmsgid \"Coordinate system\"\nmsgstr \"Cuurdeenete-a system\"\n\nmsgid \"Coordinate system in which the transformation occurs\"\nmsgstr \"Cuurdeenete-a system in vheech zee trunsffurmeshun ooccoors\"\n\nmsgid \"Copies point coordinates to the relevant attribute tables in a mesh, primarily for testing purposes.\"\nmsgstr \"\"\n\nmsgid \"\"\n\"Could not detect filetype automatically.\\n\"\n\"Try choosing a specific filter that matches the file to be imported\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Could not determine scripting language.  K-3D supports multiple scripting languages, but the language for this script was not recognized. Most K-3D script engines use some type of \\\"magic token\\\" at the beginning of a script to recognize it, e.g. \\\"#python\\\" in the first 7 characters of a script for K-3D's Python engine.  If you are writing a K-3D script, check the documentation for the scripting language you're writing in to see how to make it recognizable.\"\nmsgstr \"Cuoold nut determeene-a screepting lungooege-a.  K-3D sooppurts moolteeple-a screepting lungooeges, boot zee lungooege-a fur thees screept ves nut recugneezed. Must K-3D screept ingeenes use-a sume-a type-a ooff \\\"magic tukee\\\" et zee begeenning ooff a screept tu recugneeze-a it, i.g. \\\"#k3dscript\\\" in zee furst 12 cherecters ooff a screept fur K-3D's booeelt-in K3DScreept ingeene-a.  Iff yuoo ere-a vreeting a K-3D screept, check zee ducoomenteshun fur zee screepting lungooege-a yuoo're-a vreeting in tu see-a hoo tu meke-a it recugneezeble-a.\"\n\n#, fuzzy\nmsgid \"Could not identify the MIME-type for this script.  K-3D supports multiple scripting languages, and the MIME-type is used to match scripts to the correct script engines. You can add a \\\"magic token\\\" at the beginning of a script to force identification of its MIME-type - for example, add \\\"#python\\\" at the beginning of a Python script.\"\nmsgstr \"Cuoold nut determeene-a screepting lungooege-a.  K-3D sooppurts moolteeple-a screepting lungooeges, boot zee lungooege-a fur thees screept ves nut recugneezed. Must K-3D screept ingeenes use-a sume-a type-a ooff \\\"magic tukee\\\" et zee begeenning ooff a screept tu recugneeze-a it, i.g. \\\"#k3dscript\\\" in zee furst 12 cherecters ooff a screept fur K-3D's booeelt-in K3DScreept ingeene-a.  Iff yuoo ere-a vreeting a K-3D screept, check zee ducoomenteshun fur zee screepting lungooege-a yuoo're-a vreeting in tu see-a hoo tu meke-a it recugneezeble-a.\"\n\nmsgid \"Could not locate the yafray executable.\"\nmsgstr \"Cuoold nut lucete-a zee yeffrey ixecooteble-a.\"\n\nmsgid \"Couldn't display %1%\"\nmsgstr \"\"\n\nmsgid \"Count\"\nmsgstr \"Cuoont\"\n\nmsgid \"Count 1\"\nmsgstr \"Cuoont 1\"\n\nmsgid \"Count 2\"\nmsgstr \"Cuoont 2\"\n\nmsgid \"Count 3\"\nmsgstr \"Cuoont 3\"\n\nmsgid \"Create\"\nmsgstr \"Creete-a\"\n\nmsgid \"Create %1%\"\nmsgstr \"Creete-a %1%\"\n\nmsgid \"Create a Surface by traversing one curve along another and orienting it tangential to the traverse curve\"\nmsgstr \"\"\n\nmsgid \"Create alpha channel using color difference\"\nmsgstr \"Creete-a elpha chunnel useeng culur deefffference-a\"\n\n#, fuzzy\nmsgid \"Create alpha channel using color difference using the CUDA API\"\nmsgstr \"Creete-a elpha chunnel useeng culur deefffference-a\"\n\nmsgid \"Create shadow map during rendering\"\nmsgstr \"Creete-a shedoo mep dooreeng rendereeng\"\n\nmsgid \"Creates GLX graphics contexts.\"\nmsgstr \"\"\n\nmsgid \"Creates OSMesa graphics contexts.\"\nmsgstr \"\"\n\nmsgid \"Creates RenderMan output under script control\"\nmsgstr \"Creetes RenderMun ooootpoot under screept cuntrul\"\n\nmsgid \"Creates a 3D surface plot.\"\nmsgstr \"\"\n\nmsgid \"Creates a LinearCurve representation of the selected NURBS curve\"\nmsgstr \"\"\n\nmsgid \"Creates a NURBS surface filling out the selected closed curves\"\nmsgstr \"\"\n\nmsgid \"Creates a NURBS surface stretched along all selected curves\"\nmsgstr \"\"\n\nmsgid \"Creates a NURBS surface stretched between the 2 curves\"\nmsgstr \"\"\n\nmsgid \"Creates a NURBS surface while traversing one NURBS curve along another\"\nmsgstr \"\"\n\nmsgid \"Creates a Polyhedron representation of the selected NURBS patch\"\nmsgstr \"\"\n\nmsgid \"Creates a position transform matrix\"\nmsgstr \"Creetes a puseeshun trunsffurm metreex\"\n\nmsgid \"Creates a scale transform matrix\"\nmsgstr \"Creetes a scele-a trunsffurm metreex\"\n\n#, fuzzy\nmsgid \"Creates a transformation matrix that looks from one to another.\"\nmsgstr \"Ooreeents a trunsffurmeshun metreex tu luuk et unuzeer\"\n\nmsgid \"Creates an orientation transform matrix\"\nmsgstr \"Creetes un ooreeenteshun trunsffurm metreex\"\n\nmsgid \"Creates or updates a named array with string data\"\nmsgstr \"\"\n\nmsgid \"Crop Window Bottom\"\nmsgstr \"Crup Veendoo Buttum\"\n\nmsgid \"Crop Window Left\"\nmsgstr \"Crup Veendoo Lefft\"\n\nmsgid \"Crop Window Right\"\nmsgstr \"Crup Veendoo Reeght\"\n\nmsgid \"Crop Window Top\"\nmsgstr \"Crup Veendoo Tup\"\n\nmsgid \"Crop window bottom\"\nmsgstr \"Crup veendoo buttum\"\n\nmsgid \"Crop window left\"\nmsgstr \"Crup veendoo lefft\"\n\nmsgid \"Cube depth\"\nmsgstr \"Coobe-a dept\"\n\nmsgid \"Cube height\"\nmsgstr \"Coobe-a heeeght\"\n\nmsgid \"Cube width\"\nmsgstr \"Coobe-a veedt\"\n\nmsgid \"Current simulation time.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Curve Index\"\nmsgstr \"Idge-a Index\"\n\n#, fuzzy\nmsgid \"Curve Number\"\nmsgstr \"Culur noomber\"\n\n#, fuzzy\nmsgid \"Curve Number.\"\nmsgstr \"Culur noomber\"\n\nmsgid \"Curve subdivisions\"\nmsgstr \"Coorfe-a soobdeefisiuns\"\n\nmsgid \"Curve width\"\nmsgstr \"Coorfe-a veedt\"\n\nmsgid \"Curves\"\nmsgstr \"\"\n\nmsgid \"Cut off chanels at a certain value\"\nmsgstr \"Coot ooffff chunels et a certeeen felooe-a\"\n\n#, fuzzy\nmsgid \"Cut off chanels at a certain value using the CUDA API\"\nmsgstr \"Coot ooffff chunels et a certeeen felooe-a\"\n\nmsgid \"Cylinder radius\"\nmsgstr \"Cyleender redeeoos\"\n\nmsgid \"D\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"D Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"DOF\"\nmsgstr \"DOF\"\n\nmsgid \"D_uplicate\"\nmsgstr \"D_upleecete-a\"\n\nmsgid \"Damping\"\nmsgstr \"\"\n\nmsgid \"Damping of cloth\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Data Type\"\nmsgstr \"Felooe-a Type-a\"\n\n#, fuzzy\nmsgid \"Data source that uses a script to create a k3d::double_t output value\"\nmsgstr \"Sceler suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\nmsgid \"Day\"\nmsgstr \"\"\n\nmsgid \"Day.\"\nmsgstr \"\"\n\nmsgid \"Decorations\"\nmsgstr \"Decureshuns\"\n\nmsgid \"Default Atmosphere Shader\"\nmsgstr \"Deffoolt Etmusphere-a Sheder\"\n\nmsgid \"Default Color\"\nmsgstr \"Deffoolt Culur\"\n\nmsgid \"Default Exterior Shader\"\nmsgstr \"Deffoolt Ixtereeur Sheder\"\n\nmsgid \"Default Interior Shader\"\nmsgstr \"Deffoolt Intereeur Sheder\"\n\n#, fuzzy\nmsgid \"Default Value\"\nmsgstr \"Deffoolt S\"\n\nmsgid \"Default atmosphere shader\"\nmsgstr \"Deffoolt etmusphere-a sheder\"\n\nmsgid \"Default exterior shader\"\nmsgstr \"Deffoolt ixtereeur sheder\"\n\nmsgid \"Default interior shader\"\nmsgstr \"Deffoolt intereeur sheder\"\n\nmsgid \"Default value, associated with unselected items\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Defines the cone height along the +Z axis.\"\nmsgstr \"Ineble-a pueent deesplecement elung zee Z exees.\"\n\n#, fuzzy\nmsgid \"Defines the cylinder length along the +Z axis.\"\nmsgstr \"Ineble-a pueent deesplecement elung zee Z exees.\"\n\n#, fuzzy\nmsgid \"Defines the cylinder length along the -Z axis.\"\nmsgstr \"Ineble-a pueent deesplecement elung zee Z exees.\"\n\n#, fuzzy\nmsgid \"Defines the disk height along the +Z axis.\"\nmsgstr \"Ineble-a pueent deesplecement elung zee Z exees.\"\n\nmsgid \"Defines the gravity direction and magnitude (if any).\"\nmsgstr \"\"\n\nmsgid \"Defines the initial linear velocity (if any).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Defines the paraboloid length along the +Z axis.\"\nmsgstr \"Ineble-a pueent deesplecement elung zee Z exees.\"\n\n#, fuzzy\nmsgid \"Defines the paraboloid length along the -Z axis.\"\nmsgstr \"Ineble-a pueent deesplecement elung zee Z exees.\"\n\n#, fuzzy\nmsgid \"Degree\"\nmsgstr \"Delete-a\"\n\nmsgid \"Delete\"\nmsgstr \"Delete-a\"\n\nmsgid \"Delete nodes\"\nmsgstr \"Delete-a nudes\"\n\n#, fuzzy\nmsgid \"Delete original NURBS curve?\"\nmsgstr \"Renders NOoRBS coorfes\"\n\nmsgid \"Delete original?\"\nmsgstr \"\"\n\nmsgid \"Delete the Curve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Delete the Curves\"\nmsgstr \"Delete-a nudes\"\n\nmsgid \"Delete the curve which was used to create the cap\"\nmsgstr \"\"\n\nmsgid \"Delete the curve which was used to create the trimming curve\"\nmsgstr \"\"\n\nmsgid \"Delete the curves used to construct the surface\"\nmsgstr \"\"\n\nmsgid \"Delete the original curve\"\nmsgstr \"\"\n\nmsgid \"Delete the original curves\"\nmsgstr \"\"\n\nmsgid \"Delete user property (no undo)\"\nmsgstr \"Delete-a user pruperty (nu undu)\"\n\nmsgid \"Depending on your system hardware, Compiz may interfere with rendering in K-3D and other OpenGL applications.  If you have problems (black viewport, problems with viewport updates, etc), try disabling Compiz and re-running K-3D.\"\nmsgstr \"\"\n\nmsgid \"Deprecated plugins are scheduled for removal in future versions of K-3D.  When this happens, documents that include them may become unusable.  We strongly recommend against using deprecated plugins, unless you plan to keep a specific version of K-3D on-hand to maintain them.\"\nmsgstr \"\"\n\nmsgid \"Depth\"\nmsgstr \"Dept\"\n\nmsgid \"Depth of Field\"\nmsgstr \"Dept ooff Feeeld\"\n\nmsgid \"Depth of the coating layer for absorption effects.\"\nmsgstr \"\"\n\nmsgid \"Description\"\nmsgstr \"Descreepshun\"\n\nmsgid \"Deselect\"\nmsgstr \"Deselect\"\n\nmsgid \"Deselect All\"\nmsgstr \"Deselect Ell\"\n\nmsgid \"Designates a solid volume at render-time\"\nmsgstr \"Deseegnetes a suleed fuloome-a et render-teeme-a\"\n\nmsgid \"Desired number of outputs faces.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Device Mesh\"\nmsgstr \"Reset Mesh\"\n\nmsgid \"Device mesh\"\nmsgstr \"\"\n\nmsgid \"Dialogs\"\nmsgstr \"\"\n\nmsgid \"Diameter\"\nmsgstr \"Deeemeter\"\n\nmsgid \"Difference\"\nmsgstr \"Deefffference-a\"\n\n#, fuzzy\nmsgid \"Difference of inputs.\"\nmsgstr \"Deefffference-a ooff inpoots\"\n\nmsgid \"Diffuse Color\"\nmsgstr \"Deeffffoose-a Culur\"\n\n#, fuzzy\nmsgid \"Diffuse Color.\"\nmsgstr \"Deeffffoose-a Culur\"\n\n#, fuzzy\nmsgid \"Diffuse color.\"\nmsgstr \"Deeffffoose-a Culur\"\n\nmsgid \"Dimension 1 Count\"\nmsgstr \"Deemensiun 1 Cuoont\"\n\nmsgid \"Dimension 2 Count\"\nmsgstr \"Deemensiun 2 Cuoont\"\n\nmsgid \"Dimension 3 Count\"\nmsgstr \"Deemensiun 3 Cuoont\"\n\nmsgid \"Direction\"\nmsgstr \"Durecshun\"\n\n#, fuzzy\nmsgid \"Disable\"\nmsgstr \"Deestunce-a\"\n\nmsgid \"Disable / bypass mesh modifier\"\nmsgstr \"\"\n\nmsgid \"Disables Desktop Composition on Vista\"\nmsgstr \"\"\n\nmsgid \"Disconnect\"\nmsgstr \"Deescunnect\"\n\nmsgid \"Displace X\"\nmsgstr \"Deesplece-a X\"\n\nmsgid \"Displace Y\"\nmsgstr \"Deesplece-a Y\"\n\nmsgid \"Displace Z\"\nmsgstr \"Deesplece-a Z\"\n\nmsgid \"Displace a mesh using functional expressions in x, y, and z.\"\nmsgstr \"\"\n\nmsgid \"Displace on X axis\"\nmsgstr \"Deesplece-a oon X exees\"\n\nmsgid \"Displace on Y axis\"\nmsgstr \"Deesplece-a oon Y exees\"\n\nmsgid \"Displace on Z axis\"\nmsgstr \"Deesplece-a oon Z exees\"\n\nmsgid \"Displace x\"\nmsgstr \"Deesplece-a x\"\n\nmsgid \"Displace y\"\nmsgstr \"Deesplece-a y\"\n\nmsgid \"Displace z\"\nmsgstr \"Deesplece-a z\"\n\nmsgid \"Displacement Bounds\"\nmsgstr \"Deesplecement Buoonds\"\n\nmsgid \"Displacement Shader\"\nmsgstr \"Deesplecement Sheder\"\n\nmsgid \"Displacement bounds\"\nmsgstr \"Deesplecement buoonds\"\n\nmsgid \"Displacement shader\"\nmsgstr \"Deesplecement sheder\"\n\nmsgid \"Display Luminance (candela per square meter)\"\nmsgstr \"Deespley Loomeenunce-a (cundela per sqooere-a meter)\"\n\nmsgid \"Display XY plane as a grid\"\nmsgstr \"Deespley XY plune-a es a greed\"\n\nmsgid \"Display XYZ axes\"\nmsgstr \"Deespley XYZ exes\"\n\nmsgid \"Display XZ plane as a grid\"\nmsgstr \"Deespley XZ plune-a es a greed\"\n\nmsgid \"Display YZ plane as a grid\"\nmsgstr \"Deespley YZ plune-a es a greed\"\n\nmsgid \"Display online help.\"\nmsgstr \"\"\n\nmsgid \"Display property connections that originate and terminate on the same node.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Display property labels in the rendered image.\"\nmsgstr \"Feesible-a in zee feenel rendered imege-a\"\n\nmsgid \"Display this message again in the future\"\nmsgstr \"\"\n\nmsgid \"Displays 2D text annotations, primarily for documentation / tutorials\"\nmsgstr \"Deespleys 2D text unnuteshuns, preemerily fur ducoomenteshun / tootureeels\"\n\nmsgid \"Displays a bitmap image in the background of the viewport.\"\nmsgstr \"Deespleys a beetmep imege-a in zee beckgruoond ooff zee feeoopurt.\"\n\nmsgid \"Displays a bitmap image on a resizable plane within the viewport.\"\nmsgstr \"Deespleys a beetmep imege-a oon a reseezeble-a plune-a veethin zee feeoopurt.\"\n\nmsgid \"Displays a menu containing sample documents\"\nmsgstr \"\"\n\nmsgid \"Displays a normal\"\nmsgstr \"Deespleys a nurmel\"\n\n#, fuzzy\nmsgid \"Displays a rubber-band box in the viewport.\"\nmsgstr \"Deespleys a beetmep imege-a in zee beckgruoond ooff zee feeoopurt.\"\n\n#, fuzzy\nmsgid \"Displays document node properties.\"\nmsgstr \"Tuul Pruperteees\"\n\nmsgid \"Displays document nodes as a flat list.\"\nmsgstr \"\"\n\nmsgid \"Displays information about the OpenGL implementation.\"\nmsgstr \"\"\n\nmsgid \"Displays output from an embedded Aqsis RenderMan engine.\"\nmsgstr \"\"\n\nmsgid \"Displays properties for one node\"\nmsgstr \"\"\n\nmsgid \"Displays text annotations in the 3D document, primarily for documentation / tutorials\"\nmsgstr \"Deespleys text unnuteshuns in zee 3D ducooment, preemerily fur ducoomenteshun / tootureeels\"\n\nmsgid \"Displays the contents of the K-3D log\"\nmsgstr \"\"\n\nmsgid \"Displays the current K-3D version and credits contributors\"\nmsgstr \"\"\n\nmsgid \"Displays the document nodes as a flat list\"\nmsgstr \"\"\n\nmsgid \"Displays the visualization pipeline\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Displays tool properties\"\nmsgstr \"Tuul Pruperteees\"\n\nmsgid \"Distance\"\nmsgstr \"Deestunce-a\"\n\nmsgid \"Distance between original and new faces\"\nmsgstr \"Deestunce-a betveee ooreeginel und noo feces\"\n\nmsgid \"Distributes rendering across multiple mesh painters\"\nmsgstr \"Deestribootes rendereeng ecruss moolteeple-a mesh peeenters\"\n\n#, fuzzy\nmsgid \"Divide two double inputs and produce their quotient as output\"\nmsgstr \"Deefide-a tvu sceler inpoots und prudooce-a zeeur qoouteeent es ooootpoot\"\n\nmsgid \"Do you want to replace it with the one you are saving?\"\nmsgstr \"Du yuoo vunt tu replece-a it veet zee oone-a yuoo ere-a sefeeng?\"\n\nmsgid \"Document Path\"\nmsgstr \"Ducooment Pet\"\n\nmsgid \"Document Title\"\nmsgstr \"Ducooment Teetle-a\"\n\nmsgid \"Document does not contain a TimeSource, cannot render animation.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Document importer plugin not installed.\"\nmsgstr \"Ducooment reeder ploogeen nut instelled.\"\n\nmsgid \"Document reader plugin not installed.\"\nmsgstr \"Ducooment reeder ploogeen nut instelled.\"\n\nmsgid \"Documents prior to K-3D 0.8 are unsupported.\"\nmsgstr \"\"\n\nmsgid \"Dolly Backward\"\nmsgstr \"Dully Beckverd\"\n\nmsgid \"Dolly Forward\"\nmsgstr \"Dully Furverd\"\n\nmsgid \"Dolly Viewport\"\nmsgstr \"Dully Feeoopurt\"\n\nmsgid \"Double Click Mode\"\nmsgstr \"Duooble-a Cleeck Mude-a\"\n\nmsgid \"Double click switches back to object selection mode when clicking on nothing\"\nmsgstr \"Duooble-a cleeck sveetches beck tu oobject selecshun mude-a vhee cleecking oon nutheeng\"\n\nmsgid \"Double-click to open an example document:\"\nmsgstr \"\"\n\nmsgid \"Draw Aim Point\"\nmsgstr \"Drev Eeem Pueent\"\n\nmsgid \"Draw Behind\"\nmsgstr \"Drev Beheend\"\n\nmsgid \"Draw Camera Frustum\"\nmsgstr \"Drev Cemera Froostoom\"\n\nmsgid \"Draw Crop Window\"\nmsgstr \"Drev Crup Veendoo\"\n\nmsgid \"Draw Frustum\"\nmsgstr \"Drev Froostoom\"\n\nmsgid \"Draw Safe Zone\"\nmsgstr \"Drev Seffe-a Zune-a\"\n\nmsgid \"Draw Selected\"\nmsgstr \"Drev Selected\"\n\nmsgid \"Draw Two Sided\"\nmsgstr \"Drev Tvu Seeded\"\n\nmsgid \"Draw Unselected\"\nmsgstr \"Drev Unselected\"\n\nmsgid \"Draw bounding rectangle for output rendering\"\nmsgstr \"Drev buoondeeng rectungle-a fur ooootpoot rendereeng\"\n\nmsgid \"Draw center screen cross\"\nmsgstr \"Drev center screee cruss\"\n\n#, fuzzy\nmsgid \"Draw normals for selected curves.\"\nmsgstr \"Drev nurmels fur selected pulyguns\"\n\n#, fuzzy\nmsgid \"Draw normals for selected patches.\"\nmsgstr \"Drev nurmels fur selected pulyguns\"\n\nmsgid \"Draw normals for selected polygons\"\nmsgstr \"Drev nurmels fur selected pulyguns\"\n\n#, fuzzy\nmsgid \"Draw normals for selected polygons.\"\nmsgstr \"Drev nurmels fur selected pulyguns\"\n\n#, fuzzy\nmsgid \"Draw normals for unselected curves.\"\nmsgstr \"Drev nurmels fur unselected pulyguns\"\n\n#, fuzzy\nmsgid \"Draw normals for unselected patches.\"\nmsgstr \"Drev nurmels fur unselected pulyguns\"\n\nmsgid \"Draw normals for unselected polygons\"\nmsgstr \"Drev nurmels fur unselected pulyguns\"\n\n#, fuzzy\nmsgid \"Draw normals for unselected polygons.\"\nmsgstr \"Drev nurmels fur unselected pulyguns\"\n\nmsgid \"Draw the image so that always appears behind geometry\"\nmsgstr \"Drev zee imege-a su thet elveys eppeers beheend geumetry\"\n\nmsgid \"Draw the image with a fixed aspect ratio, ignoring the image aspect ratio\"\nmsgstr \"Drev zee imege-a veet a feexed espect reteeu, ignureeng zee imege-a espect reteeu\"\n\nmsgid \"Draw two sided\"\nmsgstr \"Drev tvu seeded\"\n\nmsgid \"Draws arrows to show polyhedron face orientation\"\nmsgstr \"Drevs erroos tu shoo pulyhedrun fece-a ooreeenteshun\"\n\n#, fuzzy\nmsgid \"Draws arrows to show polyhedron half edge orientation\"\nmsgstr \"Drevs erroos tu shoo pulyhedrun fece-a ooreeenteshun\"\n\nmsgid \"Due to significant changes to K-3D internals, documents from versions prior to 0.8 are unsupported and may not function correctly.\"\nmsgstr \"\"\n\nmsgid \"Dummy (global photon)\"\nmsgstr \"Doommy (glubel phutun)\"\n\nmsgid \"Dummy shadow map source for raytracing with Pixie\"\nmsgstr \"Doommy shedoo mep suoorce-a fur reytreceeng veet Peexie-a\"\n\nmsgid \"Duplicate\"\nmsgstr \"Doopleecete-a\"\n\nmsgid \"Duplicate %1%\"\nmsgstr \"Doopleecete-a %1%\"\n\nmsgid \"East\"\nmsgstr \"\"\n\nmsgid \"Edge Count\"\nmsgstr \"Idge-a Cuoont\"\n\n#, fuzzy\nmsgid \"Edge Offset\"\nmsgstr \"X Ooffffset\"\n\nmsgid \"Edge count\"\nmsgstr \"Idge-a cuoont\"\n\nmsgid \"Edge softness\"\nmsgstr \"Idge-a sufftness\"\n\n#, fuzzy\nmsgid \"Edit\"\nmsgstr \"_Ideet\"\n\nmsgid \"Edit Script\"\nmsgstr \"Ideet Screept\"\n\nmsgid \"Edit the knot vector of a NURBS curve\"\nmsgstr \"\"\n\nmsgid \"Elevate v? Otherwise u\"\nmsgstr \"\"\n\nmsgid \"Elevates the selected patches in either u or v direction\"\nmsgstr \"\"\n\nmsgid \"Eliminates points with duplicate 3D coordinates\"\nmsgstr \"Ileeminetes pueents veet doopleecete-a 3D cuurdeenetes\"\n\nmsgid \"Ellipsoid color\"\nmsgstr \"Illeepsuid culur\"\n\nmsgid \"Emit Light\"\nmsgstr \"Imeet Leeght\"\n\nmsgid \"Empty node\"\nmsgstr \"Impty nude-a\"\n\nmsgid \"Enable / disable drawing for this painter.\"\nmsgstr \"Ineble-a / deeseble-a dreveeng fur thees peeenter.\"\n\nmsgid \"Enable point displacement along the X axis.\"\nmsgstr \"Ineble-a pueent deesplecement elung zee X exees.\"\n\nmsgid \"Enable point displacement along the Y axis.\"\nmsgstr \"Ineble-a pueent deesplecement elung zee Y exees.\"\n\nmsgid \"Enable point displacement along the Z axis.\"\nmsgstr \"Ineble-a pueent deesplecement elung zee Z exees.\"\n\nmsgid \"Enabled\"\nmsgstr \"Inebled\"\n\n#, fuzzy\nmsgid \"Enabled Lights\"\nmsgstr \"Inebled\"\n\nmsgid \"Enables linear interpolation between mouths values.\"\nmsgstr \"\"\n\nmsgid \"Encapsulates a RenderMan displacement shader instance\"\nmsgstr \"Incepsooletes a RenderMun deesplecement sheder instunce-a\"\n\n#, fuzzy\nmsgid \"End Point\"\nmsgstr \"Pueent\"\n\nmsgid \"End Time\"\nmsgstr \"Ind Teeme-a\"\n\nmsgid \"End angle\"\nmsgstr \"Ind ungle-a\"\n\nmsgid \"Enter a new knot vector containing knot values separated with spaces.\"\nmsgstr \"\"\n\nmsgid \"Enter a new value.  Real-world units and simple math expressions are allowed.\"\nmsgstr \"Inter a noo felooe-a.  Reel-vurld uneets und seemple-a met ixpresseeuns ere-a ellooed.\"\n\nmsgid \"Error compiling shader %1%\"\nmsgstr \"Irrur cumpeeling sheder %1%\"\n\n#, fuzzy\nmsgid \"Error creating a plugin to load the document.\"\nmsgstr \"Irrur reedeeng ducooment.\"\n\nmsgid \"Error creating the scripting engine to run this script.  Usually this means that your system is missing appropriate libraries or that there was an error in installation.\"\nmsgstr \"\"\n\nmsgid \"Error executing script\"\nmsgstr \"Irrur ixecooteeng screept\"\n\nmsgid \"Error exporting document\"\nmsgstr \"Irrur ixpurteeng ducooment\"\n\nmsgid \"Error reading document %1%\"\nmsgstr \"Irrur reedeeng ducooment %1%\"\n\nmsgid \"Error reading document.\"\nmsgstr \"Irrur reedeeng ducooment.\"\n\nmsgid \"Error reading document.  The document could not be reverted.\"\nmsgstr \"Irrur reedeeng ducooment.  Zee ducooment cuoold nut be-a referted.\"\n\n#, fuzzy\nmsgid \"Example documents ...\"\nmsgstr \"Unteetled Ducooment %1%\"\n\nmsgid \"Executable\"\nmsgstr \"\"\n\nmsgid \"Executes a script on-demand\"\nmsgstr \"\"\n\nmsgid \"Expand\"\nmsgstr \"Ixpund\"\n\nmsgid \"Expand All\"\nmsgstr \"Ixpund Ell\"\n\nmsgid \"Experimental plugins are still under development and may be modified or removed at any time.  If this happens, documents that include them may become unusable.\"\nmsgstr \"\"\n\nmsgid \"Export Document:\"\nmsgstr \"Ixpurt Ducooment:\"\n\n#, fuzzy\nmsgid \"Export File ...\"\nmsgstr \"_Ixpurt ...\"\n\n#, fuzzy\nmsgid \"Export File:\"\nmsgstr \"Ixpurt Ducooment:\"\n\nmsgid \"Exposure\"\nmsgstr \"Ixpusoore-a\"\n\n#, fuzzy\nmsgid \"Expression\"\nmsgstr \"resulooshun\"\n\nmsgid \"Expression to be evaluated.\"\nmsgstr \"\"\n\nmsgid \"Extended Component Selection Mode\"\nmsgstr \"Ixtended Cumpunent Selecshun Mude-a\"\n\nmsgid \"Extended Selection Mode\"\nmsgstr \"Ixtended Selecshun Mude-a\"\n\nmsgid \"Extended mode adds newly clicked components instead of replacing selection\"\nmsgstr \"Ixtended mude-a edds nooly cleecked cumpunents insteed ooff repleceeng selecshun\"\n\nmsgid \"Extended mode adds newly clicked geometry instead of replacing selection\"\nmsgstr \"Ixtended mude-a edds nooly cleecked geumetry insteed ooff repleceeng selecshun\"\n\nmsgid \"Exterior Shader\"\nmsgstr \"Ixtereeur Sheder\"\n\nmsgid \"Exterior shader\"\nmsgstr \"Ixtereeur sheder\"\n\nmsgid \"Extra-Atmospheric\"\nmsgstr \"\"\n\nmsgid \"Extract V curve\"\nmsgstr \"\"\n\nmsgid \"Extract a curve from a patch at a given parameter in  given direction\"\nmsgstr \"\"\n\nmsgid \"Extract the point at the given parameter value\"\nmsgstr \"\"\n\nmsgid \"Extracts patch trim curves as 3D NURBS curve approximations\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Extrude along\"\nmsgstr \"Exees tu boolge-a elung\"\n\nmsgid \"Extrudes selected faces along their normals\"\nmsgstr \"Ixtroodes selected feces elung zeeur nurmels\"\n\nmsgid \"Extrudes the selected curve along a coordinate axis and lets you create caps if one of the curves is closed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Extrudes the selected patch along a coordinate axis\"\nmsgstr \"Ixtroodes selected feces elung zeeur nurmels\"\n\nmsgid \"Eye Splits\"\nmsgstr \"Iye-a Spleets\"\n\n#, fuzzy\nmsgid \"Face Array Name\"\nmsgstr \"Fertex Sheder\"\n\n#, fuzzy\nmsgid \"Face Count\"\nmsgstr \"Fece-a cuoont\"\n\nmsgid \"Face Index\"\nmsgstr \"Fece-a Index\"\n\n#, fuzzy\nmsgid \"Face Normals\"\nmsgstr \"Scele-a nurmels\"\n\n#, fuzzy\nmsgid \"Face Offset\"\nmsgstr \"X Ooffffset\"\n\nmsgid \"Face distance\"\nmsgstr \"Fece-a deestunce-a\"\n\nmsgid \"Face output array name.\"\nmsgstr \"\"\n\nmsgid \"Faces\"\nmsgstr \"Feces\"\n\nmsgid \"Far\"\nmsgstr \"Fer\"\n\nmsgid \"Far Plane Distance\"\nmsgstr \"Fer Plune-a Deestunce-a\"\n\nmsgid \"Fast Forward\"\nmsgstr \"Fest Furverd\"\n\nmsgid \"Fast fresnel\"\nmsgstr \"Fest fresnel\"\n\nmsgid \"Field-of-view\"\nmsgstr \"Feeeld-ooff-feeoo\"\n\nmsgid \"Field-of-view (degrees)\"\nmsgstr \"Feeeld-ooff-feeoo (degrees)\"\n\nmsgid \"File\"\nmsgstr \"Feele-a\"\n\n#, fuzzy\nmsgid \"File Type\"\nmsgstr \"Feele-a\"\n\nmsgid \"File _Bug Report ...\"\nmsgstr \"Feele-a _Boog Repurt ...\"\n\nmsgid \"File could not be saved\"\nmsgstr \"Feele-a cuoold nut be-a sefed\"\n\nmsgid \"File path for lsystem description\"\nmsgstr \"Feele-a pet fur lsystem descreepshun\"\n\nmsgid \"Fillet radius\"\nmsgstr \"Feellet redeeoos\"\n\n#, fuzzy\nmsgid \"Film\"\nmsgstr \"Feele-a\"\n\n#, fuzzy\nmsgid \"Film Index\"\nmsgstr \"Fece-a Index\"\n\nmsgid \"Film Index Texture\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Film Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"Filter\"\nmsgstr \"Feelter\"\n\nmsgid \"Filter S Width\"\nmsgstr \"Feelter S Veedt\"\n\nmsgid \"Filter T Width\"\nmsgstr \"Feelter T Veedt\"\n\nmsgid \"Filter width in X\"\nmsgstr \"Feelter veedt in X\"\n\nmsgid \"Filter width in Y\"\nmsgstr \"Feelter veedt in Y\"\n\nmsgid \"Find loop using the edgering on one side of the selected edge(s)\"\nmsgstr \"\"\n\nmsgid \"Find loop using the edgering on the other side of the selected edge(s)\"\nmsgstr \"\"\n\nmsgid \"First check color\"\nmsgstr \"Furst check culur\"\n\nmsgid \"First input float\"\nmsgstr \"Furst inpoot fluet\"\n\n#, fuzzy\nmsgid \"First input mesh.\"\nmsgstr \"Furst inpoot fluet\"\n\nmsgid \"First point in the swept line segment that defines the output hyperboloid.\"\nmsgstr \"\"\n\nmsgid \"First segment end X position\"\nmsgstr \"Furst segment ind X puseeshun\"\n\nmsgid \"First segment end Y position\"\nmsgstr \"Furst segment ind Y puseeshun\"\n\nmsgid \"First segment end Z position\"\nmsgstr \"Furst segment ind Z puseeshun\"\n\nmsgid \"Fixed Radius\"\nmsgstr \"Feexed Redeeoos\"\n\nmsgid \"Flip normals\"\nmsgstr \"Fleep nurmels\"\n\nmsgid \"Flip normals in case the faces are reversed\"\nmsgstr \"Fleep nurmels in cese-a zee feces ere-a refersed\"\n\nmsgid \"Flip one of the curves before creating the surface\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Flips the order of the points for the selected curves\"\nmsgstr \"Selects idge-a reengs cunteeening selected igdes\"\n\nmsgid \"Float value\"\nmsgstr \"Fluet felooe-a\"\n\nmsgid \"Focal Length\"\nmsgstr \"Fucel Lengt\"\n\nmsgid \"Focus Plane\"\nmsgstr \"Fucoos Plune-a\"\n\nmsgid \"Fog\"\nmsgstr \"Fug\"\n\nmsgid \"Fog Far\"\nmsgstr \"Fug Fer\"\n\nmsgid \"Fog Near\"\nmsgstr \"Fug Neer\"\n\nmsgid \"Fog color\"\nmsgstr \"Fug culur\"\n\nmsgid \"Fog far distance\"\nmsgstr \"Fug fer deestunce-a\"\n\nmsgid \"Fog near distance\"\nmsgstr \"Fug neer deestunce-a\"\n\nmsgid \"Font\"\nmsgstr \"Funt\"\n\n#, fuzzy\nmsgid \"Font Antialiasing\"\nmsgstr \"Untee-eleeesing type-a\"\n\n#, fuzzy\nmsgid \"Font Size\"\nmsgstr \"Pueent Seeze-a\"\n\nmsgid \"Font height\"\nmsgstr \"Funt heeeght\"\n\nmsgid \"Font path\"\nmsgstr \"Funt pet\"\n\n#, fuzzy\nmsgid \"Font size.\"\nmsgstr \"Pueent Seeze-a\"\n\nmsgid \"Format\"\nmsgstr \"Furmet\"\n\nmsgid \"Found running Compiz window manager.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Fraction\"\nmsgstr \"Cust fooncshun\"\n\nmsgid \"Fraction of light transmitted through the surface.\"\nmsgstr \"\"\n\nmsgid \"Fragment Shader\"\nmsgstr \"Fregment Sheder\"\n\nmsgid \"Fragment shader source code\"\nmsgstr \"Fregment sheder suoorce-a cude-a\"\n\n#, fuzzy\nmsgid \"Frame\"\nmsgstr \"_Freme-a\"\n\nmsgid \"Frame Rate\"\nmsgstr \"Freme-a Rete-a\"\n\nmsgid \"Frame of model\"\nmsgstr \"\"\n\nmsgid \"Frame rate\"\nmsgstr \"Freme-a rete-a\"\n\nmsgid \"Frame rate of the papagayo lipsync file. Frames are converted to time units according to this value.\"\nmsgstr \"\"\n\nmsgid \"Frame selection\"\nmsgstr \"Freme-a selecshun\"\n\nmsgid \"Freezes its input for manual editing\"\nmsgstr \"Freezes its inpoot fur munooel ideeting\"\n\nmsgid \"Fresnel Constant 1\"\nmsgstr \"\"\n\nmsgid \"Fresnel Constant 2\"\nmsgstr \"\"\n\nmsgid \"Fresnel Constant 3\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"From\"\nmsgstr \"_Freme-a\"\n\nmsgid \"From RenderMan specification\"\nmsgstr \"Frum RenderMun speceefficeshun\"\n\nmsgid \"Fullscreen\"\nmsgstr \"Foollscreee\"\n\nmsgid \"Fullscreen mode for main document window\"\nmsgstr \"Foollscreee mude-a fur meeen ducooment veendoo\"\n\n#, fuzzy\nmsgid \"Function\"\nmsgstr \"Cust fooncshun\"\n\nmsgid \"Function to be plotted, in terms of u, v, and any scalar user properties added to the node.\"\nmsgstr \"\"\n\nmsgid \"Gain\"\nmsgstr \"\"\n\nmsgid \"Gamma\"\nmsgstr \"Gemma\"\n\n#, fuzzy\nmsgid \"Gamma Value\"\nmsgstr \"Gemma felooe-a\"\n\nmsgid \"Gamma value\"\nmsgstr \"Gemma felooe-a\"\n\n#, fuzzy\nmsgid \"Generate per-face normals.\"\nmsgstr \"Generetes a uneeffurm pulyhedrun\"\n\n#, fuzzy\nmsgid \"Generate per-point normals.\"\nmsgstr \"Generetes a uneeffurm pulyhedrun\"\n\n#, fuzzy\nmsgid \"Generate per-vertex normals.\"\nmsgstr \"Generetes a uneeffurm pulyhedrun\"\n\nmsgid \"Generated filenames:\"\nmsgstr \"Genereted feelenemes:\"\n\n#, fuzzy\nmsgid \"Generates Newell primitives using bicubic patches.\"\nmsgstr \"Generetes Nooell preemitifes es Bezeeer petches\"\n\nmsgid \"Generates a Catmull-Clark subdivision mesh\"\nmsgstr \"Generetes a Cetmooll-Clerk soobdeefisiun mesh\"\n\nmsgid \"Generates a NURBS circle\"\nmsgstr \"Generetes a NOoRBS curcle-a\"\n\nmsgid \"Generates a NURBS cone\"\nmsgstr \"Generetes a NOoRBS cune-a\"\n\n#, fuzzy\nmsgid \"Generates a NURBS curve\"\nmsgstr \"Generetes a NOoRBS curcle-a\"\n\nmsgid \"Generates a NURBS cylinder\"\nmsgstr \"Generetes a NOoRBS cyleender\"\n\nmsgid \"Generates a NURBS disk\"\nmsgstr \"Generetes a NOoRBS deesk\"\n\nmsgid \"Generates a NURBS grid\"\nmsgstr \"Generetes a NOoRBS greed\"\n\nmsgid \"Generates a NURBS hyperboloid\"\nmsgstr \"Generetes a NOoRBS hyperbulueed\"\n\nmsgid \"Generates a NURBS paraboloid\"\nmsgstr \"Generetes a NOoRBS perebulueed\"\n\nmsgid \"Generates a NURBS polygon\"\nmsgstr \"Generetes a NOoRBS pulygun\"\n\nmsgid \"Generates a NURBS sphere\"\nmsgstr \"Generetes a NOoRBS sphere-a\"\n\nmsgid \"Generates a NURBS torus\"\nmsgstr \"Generetes a NOoRBS turoos\"\n\nmsgid \"Generates a PQ-knot curve\"\nmsgstr \"Generetes a PQ-knut coorfe-a\"\n\nmsgid \"Generates a checker-pattern bitmap\"\nmsgstr \"Generetes a checker-pettern beetmep\"\n\nmsgid \"Generates a lissajous (sine-wave) curve\"\nmsgstr \"Generetes a leessejuoos (seene-a-vefe-a) coorfe-a\"\n\nmsgid \"Generates a polygonal cone with optional endcap\"\nmsgstr \"Generetes a pulygunel cune-a veet oopshunel indcep\"\n\nmsgid \"Generates a polygonal cube\"\nmsgstr \"Generetes a pulygunel coobe-a\"\n\nmsgid \"Generates a polygonal cushion (a cube with rounded edges)\"\nmsgstr \"Generetes a pulygunel coosheeun (a coobe-a veet ruoonded idges)\"\n\nmsgid \"Generates a polygonal cylinder with optional endcaps\"\nmsgstr \"Generetes a pulygunel cyleender veet oopshunel indceps\"\n\nmsgid \"Generates a polygonal disk\"\nmsgstr \"Generetes a pulygunel deesk\"\n\nmsgid \"Generates a polygonal grid\"\nmsgstr \"Generetes a pulygunel greed\"\n\nmsgid \"Generates a polygonal grid and applies a transform points filter using the CUDA API\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Generates a polygonal grid using the CUDA API\"\nmsgstr \"Generetes a pulygunel greed\"\n\nmsgid \"Generates a polygonal sphere\"\nmsgstr \"Generetes a pulygunel sphere-a\"\n\nmsgid \"Generates a polygonal sphere by recursive subdivision of an isocahedron\"\nmsgstr \"Generetes a pulygunel sphere-a by recoorseefe-a soobdeefisiun ooff un isucehedrun\"\n\nmsgid \"Generates a polygonal torus\"\nmsgstr \"Generetes a pulygunel turoos\"\n\nmsgid \"Generates a solid-color bitmap\"\nmsgstr \"Generetes a suleed-culur beetmep\"\n\nmsgid \"Generates a uniform polyhedron\"\nmsgstr \"Generetes a uneeffurm pulyhedrun\"\n\n#, fuzzy\nmsgid \"Generates a viewing matrix from a position, a look vector, and an up vector\"\nmsgstr \"Generetes a trunsffurmeshun metreex frum a puseeshun, a luuk fectur, und un up fectur\"\n\nmsgid \"Generates an L-System object from a configuration file\"\nmsgstr \"Generetes un L-System oobject frum a cunffeegooreshun feele-a\"\n\nmsgid \"Generates polygonal text using Freetype 2\"\nmsgstr \"Generetes pulygunel text useeng Freetype-a 2\"\n\nmsgid \"Geometry\"\nmsgstr \"Geumetry\"\n\nmsgid \"Geometry index from file to extract mesh\"\nmsgstr \"\"\n\nmsgid \"Gives chosen side number\"\nmsgstr \"Geefes chusee seede-a noomber\"\n\n#, fuzzy\nmsgid \"Glossy color.\"\nmsgstr \"Fug culur\"\n\nmsgid \"Glow intensity\"\nmsgstr \"Gloo intenseety\"\n\nmsgid \"Glow offset\"\nmsgstr \"Gloo ooffffset\"\n\nmsgid \"Glow type\"\nmsgstr \"Gloo type-a\"\n\nmsgid \"GraphViz Render Engine\"\nmsgstr \"GrephFeez Render Ingeene-a\"\n\nmsgid \"Gravity\"\nmsgstr \"\"\n\nmsgid \"Gravity to affect the system\"\nmsgstr \"\"\n\nmsgid \"Green\"\nmsgstr \"\"\n\nmsgid \"Green threshold\"\nmsgstr \"Greee threshuld\"\n\nmsgid \"Green weight\"\nmsgstr \"Greee veeeght\"\n\nmsgid \"Grid\"\nmsgstr \"Greed\"\n\nmsgid \"Grid Color\"\nmsgstr \"Greed Culur\"\n\nmsgid \"Grid Count\"\nmsgstr \"Greed Cuoont\"\n\nmsgid \"Grid Size\"\nmsgstr \"Greed Seeze-a\"\n\nmsgid \"Grid color\"\nmsgstr \"Greed culur\"\n\nmsgid \"Grid height\"\nmsgstr \"Greed heeeght\"\n\nmsgid \"Grid width\"\nmsgstr \"Greed veedt\"\n\n#, fuzzy\nmsgid \"Group Array\"\nmsgstr \"Gruoop nurmels\"\n\n#, fuzzy\nmsgid \"Group Faces\"\nmsgstr \"Gruoop nurmels\"\n\n#, fuzzy\nmsgid \"Group Normals\"\nmsgstr \"Gruoop nurmels\"\n\n#, fuzzy\nmsgid \"Group Solids\"\nmsgstr \"Gruoop nurmels\"\n\nmsgid \"Group neighboring faces together.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Group solids using a per-face array.\"\nmsgstr \"Renders mesh feces, useeng smuut nurmels\"\n\nmsgid \"Grows the selection to include adjacent vertices, edges and faces\"\nmsgstr \"Groos zee selecshun tu incloode-a edjecent ferteeces, idges und feces\"\n\nmsgid \"Growth\"\nmsgstr \"Groot\"\n\nmsgid \"Growth value\"\nmsgstr \"Groot felooe-a\"\n\nmsgid \"H_ide Unpinned Panels\"\nmsgstr \"H_ide-a Unpeenned Punels\"\n\n#, fuzzy\nmsgid \"Halt Samples\"\nmsgstr \"Semples\"\n\n#, fuzzy\nmsgid \"Halt Time\"\nmsgstr \"Stert Teeme-a\"\n\nmsgid \"Halt rendering once the number of samples per pixel reaches this value.\"\nmsgstr \"\"\n\nmsgid \"Halt running script?\"\nmsgstr \"Helt roonneeng screept?\"\n\nmsgid \"Hardness\"\nmsgstr \"Herdness\"\n\nmsgid \"Has orco\"\nmsgstr \"Hes oorcu\"\n\nmsgid \"Headlight\"\nmsgstr \"Heedleeght\"\n\nmsgid \"Height\"\nmsgstr \"Heeeght\"\n\nmsgid \"Hide Selection\"\nmsgstr \"Heede-a Selecshun\"\n\nmsgid \"Hide Unselected\"\nmsgstr \"Heede-a Unselected\"\n\nmsgid \"Hide _Unselected\"\nmsgstr \"Heede-a _Unselected\"\n\nmsgid \"Hide selection\"\nmsgstr \"Heede-a selecshun\"\n\nmsgid \"Hide unpinned panels\"\nmsgstr \"Heede-a unpeenned punels\"\n\nmsgid \"Hide unselected\"\nmsgstr \"Heede-a unselected\"\n\nmsgid \"Hide/show unpinned panels in main document window\"\nmsgstr \"Heede-a/shoo unpeenned punels in meeen ducooment veendoo\"\n\nmsgid \"Hider\"\nmsgstr \"Heeder\"\n\nmsgid \"Hider Algorithm\"\nmsgstr \"Heeder Elgureethm\"\n\nmsgid \"Hides/shows decorations\"\nmsgstr \"Heedes/shoos decureshuns\"\n\n#, fuzzy\nmsgid \"Hour\"\nmsgstr \"Suoorce-a\"\n\nmsgid \"Hour.\"\nmsgstr \"\"\n\nmsgid \"How far to extrude the curve\"\nmsgstr \"\"\n\nmsgid \"Identifies a file's MIME Type based on filename extensions\"\nmsgstr \"\"\n\nmsgid \"Identifies a file's MIME Type using the Gnome API\"\nmsgstr \"\"\n\nmsgid \"If enabled, the endpoints will work as CVs and a new endpoint gets added\"\nmsgstr \"\"\n\nmsgid \"If true, a curve in the V direction is extracted (iso-U curve), otherwise it's a U-curve\"\nmsgstr \"\"\n\nmsgid \"If true, the normals from the STL file are read into a face attribute array\"\nmsgstr \"\"\n\nmsgid \"If you don't save, all your changes will be permanently lost (no undo).\"\nmsgstr \"Iff yuoo dun't sefe-a, ell yuoor chunges veell be-a permunently lust (nu undu).\"\n\nmsgid \"If you don't save, changes will be permanently lost (no undo).\"\nmsgstr \"Iff yuoo dun't sefe-a, chunges veell be-a permunently lust (nu undu).\"\n\nmsgid \"Image\"\nmsgstr \"Imege-a\"\n\nmsgid \"ImageMagick Formats ( many )\"\nmsgstr \"ImegeMegeeck Furmets ( muny )\"\n\nmsgid \"Imager Shader\"\nmsgstr \"Imeger Sheder\"\n\nmsgid \"Imager shader\"\nmsgstr \"Imeger sheder\"\n\nmsgid \"Import %1%\"\nmsgstr \"Impurt %1%\"\n\nmsgid \"Import Document:\"\nmsgstr \"Impurt Ducooment:\"\n\n#, fuzzy\nmsgid \"Import File ...\"\nmsgstr \"_Impurt ...\"\n\n#, fuzzy\nmsgid \"Import File:\"\nmsgstr \"Impurt Ducooment:\"\n\n#, fuzzy\nmsgid \"Index\"\nmsgstr \"Idge-a Index\"\n\n#, fuzzy\nmsgid \"Index Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"Index of Refraction\"\nmsgstr \"Index ooff Reffrecshun\"\n\nmsgid \"Index of refraction of the thin film coating.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Index of refraction.\"\nmsgstr \"Index ooff Reffrecshun\"\n\n#, fuzzy\nmsgid \"Indigo Background\"\nmsgstr \"Beckgruoond Culur\"\n\nmsgid \"Indigo Diffuse Material\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Indigo Rectangle Light\"\nmsgstr \"Check (rectungle-a) heeeght\"\n\n#, fuzzy\nmsgid \"Indigo Render Engine\"\nmsgstr \"Render Ingeene-a\"\n\nmsgid \"Indigo Skylight\"\nmsgstr \"\"\n\nmsgid \"Inline\"\nmsgstr \"Inleene-a\"\n\nmsgid \"Input\"\nmsgstr \"Inpoot\"\n\nmsgid \"Input 1\"\nmsgstr \"Inpoot 1\"\n\nmsgid \"Input 2\"\nmsgstr \"Inpoot 2\"\n\nmsgid \"Input A\"\nmsgstr \"Inpoot A\"\n\nmsgid \"Input B\"\nmsgstr \"Inpoot B\"\n\nmsgid \"Input Bitmap\"\nmsgstr \"Inpoot Beetmep\"\n\n#, fuzzy\nmsgid \"Input Device Mesh\"\nmsgstr \"Inpoot Mesh\"\n\n#, fuzzy\nmsgid \"Input Graph\"\nmsgstr \"Inpoot Beetmep\"\n\nmsgid \"Input Matrix\"\nmsgstr \"Inpoot Metreex\"\n\nmsgid \"Input Mesh\"\nmsgstr \"Inpoot Mesh\"\n\nmsgid \"Input Mesh Selection\"\nmsgstr \"Inpoot Mesh Selecshun\"\n\nmsgid \"Input bitmap\"\nmsgstr \"Inpoot beetmep\"\n\n#, fuzzy\nmsgid \"Input file path.\"\nmsgstr \"Inpoot feele-a\"\n\nmsgid \"Input matrix\"\nmsgstr \"Inpoot metreex\"\n\nmsgid \"Input mesh\"\nmsgstr \"Inpoot mesh\"\n\n#, fuzzy\nmsgid \"Input mesh.\"\nmsgstr \"Inpoot mesh\"\n\nmsgid \"Input value\"\nmsgstr \"Inpoot felooe-a\"\n\nmsgid \"Insert knot at [0,1]\"\nmsgstr \"\"\n\nmsgid \"Insert knot in v? Otherwise u\"\nmsgstr \"\"\n\nmsgid \"Inserts a RenderMan DelayedReadArchive call into rendered output\"\nmsgstr \"Inserts a RenderMun DeleyedReedErcheefe-a cell intu rendered ooootpoot\"\n\nmsgid \"Inserts a RenderMan ReadArchive call into rendered output\"\nmsgstr \"Inserts a RenderMun ReedErcheefe-a cell intu rendered ooootpoot\"\n\nmsgid \"Inserts a new Knot with the specified u-value\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Inserts holes into a subdivision surface mesh\"\nmsgstr \"Inserts hules intu a soobdeefisiun mesh\"\n\nmsgid \"Inset\"\nmsgstr \"Inset\"\n\nmsgid \"Inset of bevelled face\"\nmsgstr \"Inset ooff befelled fece-a\"\n\nmsgid \"Inset value for the new faces\"\nmsgstr \"Inset felooe-a fur zee noo feces\"\n\nmsgid \"Instance\"\nmsgstr \"Instunce-a\"\n\nmsgid \"Instance1\"\nmsgstr \"Instunce-a1\"\n\nmsgid \"Instance2\"\nmsgstr \"Instunce-a2\"\n\nmsgid \"Instantiate\"\nmsgstr \"Instunteeete-a\"\n\nmsgid \"Instantiate %1%\"\nmsgstr \"Instunteeete-a %1%\"\n\nmsgid \"Interior Shader\"\nmsgstr \"Intereeur Sheder\"\n\nmsgid \"Interior shader\"\nmsgstr \"Intereeur sheder\"\n\nmsgid \"Internal error creating user property.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Interpolate\"\nmsgstr \"Interpulete-a buoondery\"\n\nmsgid \"Interpolate boundary\"\nmsgstr \"Interpulete-a buoondery\"\n\n#, fuzzy\nmsgid \"Interpolation Time\"\nmsgstr \"Shedeeng Interpuleshun\"\n\nmsgid \"Intersection\"\nmsgstr \"Intersecshun\"\n\nmsgid \"Inverts a bitmap\"\nmsgstr \"Inferts a beetmep\"\n\n#, fuzzy\nmsgid \"Inverts a bitmap using the CUDA API\"\nmsgstr \"Inferts a beetmep\"\n\nmsgid \"Inverts a bitmap's alpha channel\"\nmsgstr \"Inferts a beetmep's elpha chunnel\"\n\n#, fuzzy\nmsgid \"Inverts a bitmap's alpha channel using the CUDA API\"\nmsgstr \"Inferts a beetmep's elpha chunnel\"\n\nmsgid \"JPEG (*.jpeg)\"\nmsgstr \"JPEG (*.jpeg)\"\n\nmsgid \"Join : center to midpoints, midpoints, center to points\"\nmsgstr \"Jueen : center tu meedpuints, meedpuints, center tu pueents\"\n\nmsgid \"Join selected curves with common endpoints into a single NURBS curve\"\nmsgstr \"\"\n\nmsgid \"K-3D Document (*.k3d)\"\nmsgstr \"K-3D Ducooment (*.k3d)\"\n\nmsgid \"K-3D Fatal Error\"\nmsgstr \"K-3D Fetel Irrur\"\n\nmsgid \"K-3D Log Window\"\nmsgstr \"K-3D Lug Veendoo\"\n\nmsgid \"K-3D Native ( .k3d )\"\nmsgstr \"K-3D Neteefe-a ( .k3d )\"\n\nmsgid \"K-3D Python Shell\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"K-3D Tutorials and Examples\"\nmsgstr \"K-3D Tootureeels\"\n\nmsgid \"K-3D _Online\"\nmsgstr \"K-3D _Oonleene-a\"\n\nmsgid \"Ka\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Ka Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"Kd\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Kd Texture\"\nmsgstr \"Textoore-a U\"\n\n#, fuzzy\nmsgid \"Keep Face Selection\"\nmsgstr \"Mesh Selecshun\"\n\n#, fuzzy\nmsgid \"Keep Original Selection\"\nmsgstr \"Mesh Selecshun\"\n\n#, fuzzy\nmsgid \"Keep Point Selection\"\nmsgstr \"Mesh Selecshun\"\n\n#, fuzzy\nmsgid \"Keep Selection\"\nmsgstr \"Mesh Selecshun\"\n\nmsgid \"Keep end points as CVs\"\nmsgstr \"\"\n\nmsgid \"Keep the current selection when changing the selection mode.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Keep the original face selection.\"\nmsgstr \"Replece-a Selecshun\"\n\nmsgid \"Keep the original point selection, just adding points of selected faces.\"\nmsgstr \"\"\n\nmsgid \"Keep the original selection, rather than selecting only the companions\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Knot Vector\"\nmsgstr \"Fectur\"\n\nmsgid \"Knot scale\"\nmsgstr \"Knut scele-a\"\n\nmsgid \"Kr\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Kr Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"Ks\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Ks Texture\"\nmsgstr \"Textoore-a U\"\n\n#, fuzzy\nmsgid \"Ks1\"\nmsgstr \"s1\"\n\n#, fuzzy\nmsgid \"Ks1 Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"Ks2\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Ks2 Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"Ks3\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Ks3 Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"Kt\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Kt Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"LMB-Click to expand/collapse.  RMB-Click for other options.\"\nmsgstr \"LMB-Cleeck tu ixpund/cullepse-a.  RMB-Cleeck fur oozeer oopshuns.\"\n\nmsgid \"LMB-Click to make connections with other properties. RMB-Click for context menu.\"\nmsgstr \"LMB-Cleeck tu meke-a cunnecshuns veet oozeer pruperteees. RMB-Cleeck fur cuntext menoo.\"\n\nmsgid \"LMB-Drag to modify, LMB-Click to step, Tap Shift and Control while dragging to change sensitivity.\"\nmsgstr \"LMB-Dreg tu mudeeffy, LMB-Cleeck tu step, Tep Sheefft und Cuntrul vheele-a dreggeeng tu chunge-a senseetifity.\"\n\nmsgid \"Label\"\nmsgstr \"Lebel\"\n\n#, fuzzy\nmsgid \"Latitude\"\nmsgstr \"X empleetoode-a\"\n\nmsgid \"Layout\"\nmsgstr \"Leyuoot\"\n\nmsgid \"Leader\"\nmsgstr \"Leeder\"\n\nmsgid \"Leader Target\"\nmsgstr \"Leeder Terget\"\n\nmsgid \"Leader line\"\nmsgstr \"Leeder leene-a\"\n\nmsgid \"Leader line target\"\nmsgstr \"Leeder leene-a terget\"\n\nmsgid \"Left\"\nmsgstr \"Lefft\"\n\nmsgid \"Length Power\"\nmsgstr \"Lengt Pooer\"\n\nmsgid \"Length power\"\nmsgstr \"Lengt pooer\"\n\nmsgid \"Length segments\"\nmsgstr \"Lengt segments\"\n\nmsgid \"Level\"\nmsgstr \"Lefel\"\n\nmsgid \"Levels\"\nmsgstr \"Lefels\"\n\n#, fuzzy\nmsgid \"Light Group\"\nmsgstr \"Leeght culur\"\n\nmsgid \"Light color\"\nmsgstr \"Leeght culur\"\n\n#, fuzzy\nmsgid \"Light color.\"\nmsgstr \"Leeght culur\"\n\n#, fuzzy\nmsgid \"Light group.\"\nmsgstr \"Leeght culur\"\n\n#, fuzzy\nmsgid \"Light origin.\"\nmsgstr \"Leeght culur\"\n\nmsgid \"Light shader\"\nmsgstr \"Leeght sheder\"\n\n#, fuzzy\nmsgid \"Light target.\"\nmsgstr \"Leeght sheder\"\n\n#, fuzzy\nmsgid \"Line Spacing\"\nmsgstr \"Gredeeent speceeng\"\n\n#, fuzzy\nmsgid \"Line Width\"\nmsgstr \"Peexel Veedt\"\n\nmsgid \"Line: %1% Column: %2%\"\nmsgstr \"Leene-a: %1% Culoomn: %2%\"\n\n#, fuzzy\nmsgid \"Linear Velocity\"\nmsgstr \"Leeneer coorfe-a cuoont\"\n\nmsgid \"Lines\"\nmsgstr \"Leenes\"\n\nmsgid \"Links a RenderMan Texture Map directly to a file\"\nmsgstr \"Leenks a RenderMun Textoore-a Mep durectly tu a feele-a\"\n\nmsgid \"Load\"\nmsgstr \"Lued\"\n\nmsgid \"Load Script:\"\nmsgstr \"Lued Screept:\"\n\nmsgid \"Load a papagayo lipsync (.dat) file and output its values given a time source\"\nmsgstr \"\"\n\nmsgid \"Load a script from disk, replacing the current script\"\nmsgstr \"Lued a screept frum deesk, repleceeng zee coorrent screept\"\n\nmsgid \"Loading plugin %1%\"\nmsgstr \"Luedeeng ploogeen %1%\"\n\nmsgid \"Loading plugin module %1%\"\nmsgstr \"Luedeeng ploogeen mudoole-a %1%\"\n\nmsgid \"Loads a JPEG (*.jpeg) bitmap from the filesystem\"\nmsgstr \"Lueds a JPEG (*.jpeg) beetmep frum zee feelesystem\"\n\nmsgid \"Loads a PNG (*.png) bitmap from the filesystem\"\nmsgstr \"Lueds a PNG (*.png) beetmep frum zee feelesystem\"\n\nmsgid \"Loads a TIFF (*.tif) bitmap from the filesystem\"\nmsgstr \"Lueds a TIFF (*.teeff) beetmep frum zee feelesystem\"\n\nmsgid \"Loads a bitmap from the filesystem\"\nmsgstr \"Lueds a beetmep frum zee feelesystem\"\n\nmsgid \"\"\n\"Logging SpaceNavigator events to stderr ...\\n\"\n\"Close window to cancel logging.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Longitude\"\nmsgstr \"Lungeetoodinel petches\"\n\nmsgid \"Longitudinal wraps\"\nmsgstr \"Lungeetoodinel vreps\"\n\nmsgid \"Look Position\"\nmsgstr \"Luuk Puseeshun\"\n\nmsgid \"Luminance\"\nmsgstr \"Loomeenunce-a\"\n\nmsgid \"Luminous Efficacy\"\nmsgstr \"\"\n\nmsgid \"Luminous efficacy of the light source in luminous flux per Watt.\"\nmsgstr \"\"\n\nmsgid \"LuxRender Bilinear Interpolation Texture\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"LuxRender Carpaint Material\"\nmsgstr \"RenderMun Metereeel\"\n\nmsgid \"LuxRender Distant Light\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"LuxRender EnvironmentLight\"\nmsgstr \"Render Ingeene-a\"\n\n#, fuzzy\nmsgid \"LuxRender Glass Material\"\nmsgstr \"RenderMun Metereeel\"\n\n#, fuzzy\nmsgid \"LuxRender Glossy Material\"\nmsgstr \"RenderMun Metereeel\"\n\nmsgid \"LuxRender Goniometric Light\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"LuxRender Image Texture\"\nmsgstr \"Render Imege-a\"\n\n#, fuzzy\nmsgid \"LuxRender Matte Material\"\nmsgstr \"RenderMun Metereeel\"\n\n#, fuzzy\nmsgid \"LuxRender Matte Translucent Material\"\nmsgstr \"RenderMun Metereeel\"\n\n#, fuzzy\nmsgid \"LuxRender Metal Material\"\nmsgstr \"RenderMun Metereeel\"\n\n#, fuzzy\nmsgid \"LuxRender Mirror Material\"\nmsgstr \"RenderMun Metereeel\"\n\n#, fuzzy\nmsgid \"LuxRender Mix Material\"\nmsgstr \"RenderMun Metereeel\"\n\n#, fuzzy\nmsgid \"LuxRender Null Material\"\nmsgstr \"RenderMun Metereeel\"\n\n#, fuzzy\nmsgid \"LuxRender Point Light\"\nmsgstr \"Yeffrey Pueent Leeght\"\n\n#, fuzzy\nmsgid \"LuxRender Render Engine\"\nmsgstr \"RenderMun Render Ingeene-a\"\n\n#, fuzzy\nmsgid \"LuxRender Rough Glass Material\"\nmsgstr \"RenderMun Metereeel\"\n\nmsgid \"LuxRender Scalar Image Texture\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"LuxRender Shiny Metal Material\"\nmsgstr \"RenderMun Metereeel\"\n\nmsgid \"LuxRender SkyLight\"\nmsgstr \"\"\n\nmsgid \"LuxRender SunLight\"\nmsgstr \"\"\n\nmsgid \"M1\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"M1 Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"M2\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"M2 Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"M3\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"M3 Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"Maintain the image aspect ratio\"\nmsgstr \"Meeentein zee imege-a espect reteeu\"\n\nmsgid \"Major Power\"\nmsgstr \"Mejur Pooer\"\n\nmsgid \"Major Radius\"\nmsgstr \"Mejur Redeeoos\"\n\nmsgid \"Major radius\"\nmsgstr \"Mejur redeeoos\"\n\nmsgid \"Make any image black and white\"\nmsgstr \"Meke-a uny imege-a bleck und vheete-a\"\n\nmsgid \"Makes copies of a mesh along one dimension\"\nmsgstr \"Mekes cupeees ooff a mesh elung oone-a deemensiun\"\n\nmsgid \"Makes copies of a mesh along three dimensions\"\nmsgstr \"Mekes cupeees ooff a mesh elung three-a deemensiuns\"\n\nmsgid \"Makes copies of a mesh along two dimensions\"\nmsgstr \"Mekes cupeees ooff a mesh elung tvu deemensiuns\"\n\nmsgid \"Manipulators' world position\"\nmsgstr \"Muneepooleturs' vurld puseeshun\"\n\nmsgid \"Map\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Mapping\"\nmsgstr \"Meppeeng Type-a\"\n\nmsgid \"Mass\"\nmsgstr \"\"\n\nmsgid \"Mass.\"\nmsgstr \"\"\n\nmsgid \"Match Groups\"\nmsgstr \"Metch Gruoops\"\n\nmsgid \"Material\"\nmsgstr \"Metereeel\"\n\n#, fuzzy\nmsgid \"Material 1\"\nmsgstr \"Metereeel\"\n\n#, fuzzy\nmsgid \"Material 2\"\nmsgstr \"Metereeel\"\n\nmsgid \"Material Manager Panel\"\nmsgstr \"\"\n\nmsgid \"Matrix\"\nmsgstr \"Metreex\"\n\n#, fuzzy\nmsgid \"Matrix modifier that uses a script to modify a transformation matrix\"\nmsgstr \"Trunsffurm mudeeffier thet uses a screept tu mudeeffy a trunsffurmeshun metreex\"\n\n#, fuzzy\nmsgid \"Matrix source that uses a script to create the output value\"\nmsgstr \"Streeng suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\nmsgid \"Matte\"\nmsgstr \"Mette-a\"\n\nmsgid \"Max stack size\"\nmsgstr \"Mex steck seeze-a\"\n\nmsgid \"Max. distance\"\nmsgstr \"Mex. deestunce-a\"\n\nmsgid \"Maximize active panel\"\nmsgstr \"Mexeemize-a ecteefe-a punel\"\n\nmsgid \"Maximize active panel (make it the only visible one)\"\nmsgstr \"Mexeemize-a ecteefe-a punel (meke-a it zee oonly feesible-a oone-a)\"\n\n#, fuzzy\nmsgid \"Maximum Angle\"\nmsgstr \"Mexeemoom fuld ungle-a\"\n\nmsgid \"Maximum distance between points\"\nmsgstr \"Mexeemoom deestunce-a betveee pueents\"\n\nmsgid \"Maximum number of samples-per-pixel.\"\nmsgstr \"\"\n\nmsgid \"Maximum point position\"\nmsgstr \"Mexeemoom pueent puseeshun\"\n\n#, fuzzy\nmsgid \"Maximum rendering time in seconds.\"\nmsgstr \"Mexeemoom idge-a cust\"\n\nmsgid \"Maximum width of a single line of text..\"\nmsgstr \"\"\n\nmsgid \"Merge K-3D Document:\"\nmsgstr \"Merge-a K-3D Ducooment:\"\n\nmsgid \"Merge?\"\nmsgstr \"Merge-a?\"\n\nmsgid \"Merges edges that are collinear, up to a threshold\"\nmsgstr \"\"\n\nmsgid \"Merges faces that are coplanar, up to a given threshold\"\nmsgstr \"\"\n\nmsgid \"Merges two meshes into one\"\nmsgstr \"Merges tvu meshes intu oone-a\"\n\nmsgid \"Meridian wraps\"\nmsgstr \"Mereediun vreps\"\n\nmsgid \"Mesh\"\nmsgstr \"Mesh\"\n\nmsgid \"Mesh Modifier\"\nmsgstr \"Mesh Mudeeffier\"\n\n#, fuzzy\nmsgid \"Mesh Options\"\nmsgstr \"Mesh Selecshun\"\n\nmsgid \"Mesh Selection\"\nmsgstr \"Mesh Selecshun\"\n\n#, fuzzy\nmsgid \"Mesh Sink\"\nmsgstr \"Mesh Selecshun\"\n\n#, fuzzy\nmsgid \"Mesh area\"\nmsgstr \"Mesh\"\n\nmsgid \"Mesh autosmooth\"\nmsgstr \"Mesh ootusmuut\"\n\nmsgid \"Mesh autosmooth value\"\nmsgstr \"Mesh ootusmuut felooe-a\"\n\nmsgid \"Mesh component to receive a new color attribute.\"\nmsgstr \"\"\n\nmsgid \"Mesh modifier that uses a script to modify geometry\"\nmsgstr \"Mesh mudeeffier thet uses a screept tu mudeeffy geumetry\"\n\n#, fuzzy\nmsgid \"Mesh reader that loads external 3ds (.3ds) files into the document by reference\"\nmsgstr \"Mesh reeder thet lueds ixternel Vefeffrunt (.oobj) feeles intu zee ducooment by refference-a\"\n\n#, fuzzy\nmsgid \"Mesh reader that loads external COLLADA (.dae) files into the document by reference\"\nmsgstr \"Mesh reeder thet lueds ixternel Vefeffrunt (.oobj) feeles intu zee ducooment by refference-a\"\n\nmsgid \"Mesh reader that loads external K-3D XML (.k3d) files\"\nmsgstr \"Mesh reeder thet lueds ixternel K-3D XML (.k3d) feeles\"\n\n#, fuzzy\nmsgid \"Mesh reader that loads external STEP (.stp, .step) files into the document by reference\"\nmsgstr \"Mesh reeder thet lueds ixternel Vefeffrunt (.oobj) feeles intu zee ducooment by refference-a\"\n\nmsgid \"Mesh reader that loads external Wavefront (.obj) files into the document by reference\"\nmsgstr \"Mesh reeder thet lueds ixternel Vefeffrunt (.oobj) feeles intu zee ducooment by refference-a\"\n\n#, fuzzy\nmsgid \"Mesh reader that loads external Wavefront (.stl) files into the document by reference\"\nmsgstr \"Mesh reeder thet lueds ixternel Vefeffrunt (.oobj) feeles intu zee ducooment by refference-a\"\n\n#, fuzzy\nmsgid \"Mesh reader that reads external GNU Triangulated Surface (.gts) files\"\nmsgstr \"Mesh reeder thet lueds ixternel K-3D XML (.k3d) feeles\"\n\nmsgid \"Mesh source that reads external Stanford PLY (.ply) files\"\nmsgstr \"Mesh suoorce-a thet reeds ixternel Stunffurd PLY (.ply) feeles\"\n\nmsgid \"Mesh source that uses a script to create geometry\"\nmsgstr \"Mesh suoorce-a thet uses a screept tu creete-a geumetry\"\n\nmsgid \"Mesh volume\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Mesh writer that saves IGES CAD (.iges) files\"\nmsgstr \"Mesh vreeter thet sefes ixternel Vefeffrunt (.oobj) feeles\"\n\nmsgid \"Mesh writer that saves K-3D XML (.k3d) files\"\nmsgstr \"Mesh vreeter thet sefes K-3D XML (.k3d) feeles\"\n\n#, fuzzy\nmsgid \"Mesh writer that saves external COLLADA (.dae) files\"\nmsgstr \"Mesh vreeter thet sefes ixternel Vefeffrunt (.oobj) feeles\"\n\n#, fuzzy\nmsgid \"Mesh writer that saves external Ogre XML Mesh files\"\nmsgstr \"Mesh vreeter thet sefes ixternel Vefeffrunt (.oobj) feeles\"\n\n#, fuzzy\nmsgid \"Mesh writer that saves external Stanford PLY (.ply) files\"\nmsgstr \"Mesh suoorce-a thet reeds ixternel Stunffurd PLY (.ply) feeles\"\n\n#, fuzzy\nmsgid \"Mesh writer that saves external Stereo Triangulation Lithograph (.stl) files\"\nmsgstr \"Mesh vreeter thet sefes ixternel Vefeffrunt (.oobj) feeles\"\n\nmsgid \"Mesh writer that saves external Wavefront (.obj) files\"\nmsgstr \"Mesh vreeter thet sefes ixternel Vefeffrunt (.oobj) feeles\"\n\n#, fuzzy\nmsgid \"Mesh writer that saves meshes as GraphViz (.dot) files\"\nmsgstr \"Mesh vreeter thet sefes ixternel Vefeffrunt (.oobj) feeles\"\n\nmsgid \"Meshing penalty\"\nmsgstr \"Mesheeng penelty\"\n\nmsgid \"Metal name, or the path to an NK optical properties file.\"\nmsgstr \"\"\n\nmsgid \"Microfacet Roughness 1\"\nmsgstr \"\"\n\nmsgid \"Microfacet Roughness 2\"\nmsgstr \"\"\n\nmsgid \"Microfacet Roughness 3\"\nmsgstr \"\"\n\nmsgid \"Min. depth\"\nmsgstr \"Meen. dept\"\n\nmsgid \"Minimum Reflection\"\nmsgstr \"Meenimoom Refflecshun\"\n\nmsgid \"Minor Power\"\nmsgstr \"Meenur Pooer\"\n\nmsgid \"Minor Radius\"\nmsgstr \"Meenur Redeeoos\"\n\nmsgid \"Minor radius\"\nmsgstr \"Meenur redeeoos\"\n\n#, fuzzy\nmsgid \"Minute\"\nmsgstr \"ZMeen\"\n\nmsgid \"Minute.\"\nmsgstr \"\"\n\nmsgid \"Mode\"\nmsgstr \"Mude-a\"\n\nmsgid \"Modify\"\nmsgstr \"Mudeeffy\"\n\nmsgid \"Modulation Amplitude\"\nmsgstr \"Mudooleshun Empleetoode-a\"\n\nmsgid \"Modulation Frequency\"\nmsgstr \"Mudooleshun Freqooency\"\n\nmsgid \"Modulation Phase\"\nmsgstr \"Mudooleshun Phese-a\"\n\nmsgid \"Modulation amplitude\"\nmsgstr \"Mudooleshun empleetoode-a\"\n\nmsgid \"Modulation frequency\"\nmsgstr \"Mudooleshun freqooency\"\n\nmsgid \"Modulation phase\"\nmsgstr \"Mudooleshun phese-a\"\n\n#, fuzzy\nmsgid \"Modulo two double inputs and produce their remainder as output\"\nmsgstr \"Mudoolu tvu sceler inpoots und prudooce-a zeeur remeeender es ooootpoot\"\n\nmsgid \"Monitors files for changes, using the Linux inotify system\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Month\"\nmsgstr \"Funt\"\n\n#, fuzzy\nmsgid \"Month.\"\nmsgstr \"Funt\"\n\nmsgid \"Motion Blur\"\nmsgstr \"Mushun Bloor\"\n\nmsgid \"Move\"\nmsgstr \"Mufe-a\"\n\nmsgid \"Move Screen XY\"\nmsgstr \"Mufe-a Screee XY\"\n\nmsgid \"Move X\"\nmsgstr \"Mufe-a X\"\n\nmsgid \"Move XY\"\nmsgstr \"Mufe-a XY\"\n\nmsgid \"Move XZ\"\nmsgstr \"Mufe-a XZ\"\n\nmsgid \"Move Y\"\nmsgstr \"Mufe-a Y\"\n\nmsgid \"Move YZ\"\nmsgstr \"Mufe-a YZ\"\n\nmsgid \"Move Z\"\nmsgstr \"Mufe-a Z\"\n\n#, fuzzy\nmsgid \"Multiple Nodes\"\nmsgstr \"Moolteeplicund\"\n\nmsgid \"Multiplicand\"\nmsgstr \"Moolteeplicund\"\n\n#, fuzzy\nmsgid \"Multiplicity\"\nmsgstr \"Moolteeplicund\"\n\n#, fuzzy\nmsgid \"Multiply each each pixel color component by a specified value using the CUDA API\"\nmsgstr \"Moolteeply iech peexel cumpunent veet thees felooe-a\"\n\nmsgid \"Multiply each pixel component with this value\"\nmsgstr \"Moolteeply iech peexel cumpunent veet thees felooe-a\"\n\n#, fuzzy\nmsgid \"Multiply two double inputs and produce their product as output\"\nmsgstr \"Moolteeply tvu sceler inpoots und prudooce-a zeeur prudooct es ooootpoot\"\n\nmsgid \"Multiply value of each pixel\"\nmsgstr \"Moolteeply felooe-a ooff iech peexel\"\n\nmsgid \"Mutation seed\"\nmsgstr \"Mooteshun seed\"\n\nmsgid \"Mutations\"\nmsgstr \"Mooteshuns\"\n\n#, fuzzy\nmsgid \"N_odes\"\nmsgstr \"Nudes\"\n\nmsgid \"Name\"\nmsgstr \"Neme-a\"\n\nmsgid \"Name for the color attribute array\"\nmsgstr \"\"\n\nmsgid \"Name of a per-face array containing solid labels (as used in OpenFOAM).\"\nmsgstr \"\"\n\nmsgid \"Name of the array containing face colors (for binary, colored STL only)\"\nmsgstr \"\"\n\nmsgid \"Name of the array to visualize.\"\nmsgstr \"\"\n\nmsgid \"Name of the output array\"\nmsgstr \"\"\n\nmsgid \"Navigation Target\"\nmsgstr \"Nefeegeshun Terget\"\n\nmsgid \"Near\"\nmsgstr \"Neer\"\n\nmsgid \"Near Plane Distance\"\nmsgstr \"Neer Plune-a Deestunce-a\"\n\n#, fuzzy\nmsgid \"New attribute name.\"\nmsgstr \"Peremeter neme-a\"\n\nmsgid \"No\"\nmsgstr \"Nu\"\n\nmsgid \"No application is configured to handle the given URI.\"\nmsgstr \"\"\n\nmsgid \"No export file filters available\"\nmsgstr \"Nu ixpurt feele-a feelters efeeeleble-a\"\n\nmsgid \"No import file filters available\"\nmsgstr \"Nu impurt feele-a feelters efeeeleble-a\"\n\nmsgid \"No plugin installed that can import documents of type %1%.\"\nmsgstr \"\"\n\nmsgid \"No plugin is available to open URIs.\"\nmsgstr \"\"\n\nmsgid \"Node\"\nmsgstr \"Nude-a\"\n\nmsgid \"Node Selection\"\nmsgstr \"Nude-a Selecshun\"\n\nmsgid \"Node prefix :\"\nmsgstr \"Nude-a preffeex :\"\n\nmsgid \"Node storing the currently selected nodes\"\nmsgstr \"\"\n\nmsgid \"Nodes\"\nmsgstr \"Nudes\"\n\nmsgid \"Normal\"\nmsgstr \"Nurmel\"\n\n#, fuzzy\nmsgid \"Normal color for selected curves.\"\nmsgstr \"Nurmel culur fur selected pulyguns\"\n\n#, fuzzy\nmsgid \"Normal color for selected patches.\"\nmsgstr \"Nurmel culur fur selected pulyguns\"\n\nmsgid \"Normal color for selected polygons\"\nmsgstr \"Nurmel culur fur selected pulyguns\"\n\n#, fuzzy\nmsgid \"Normal color for selected polygons.\"\nmsgstr \"Nurmel culur fur selected pulyguns\"\n\n#, fuzzy\nmsgid \"Normal color for unselected curves.\"\nmsgstr \"Nurmel culur fur unselected pulyguns\"\n\n#, fuzzy\nmsgid \"Normal color for unselected patches.\"\nmsgstr \"Nurmel culur fur unselected pulyguns\"\n\nmsgid \"Normal color for unselected polygons\"\nmsgstr \"Nurmel culur fur unselected pulyguns\"\n\n#, fuzzy\nmsgid \"Normal color for unselected polygons.\"\nmsgstr \"Nurmel culur fur unselected pulyguns\"\n\nmsgid \"Normalize\"\nmsgstr \"Nurmeleeze-a\"\n\n#, fuzzy\nmsgid \"Normalize vectors for display\"\nmsgstr \"Nurmel culur fur selected pulyguns\"\n\nmsgid \"Normals will not be smoothed across points sharper than this angle (only applies to Vertex Normals).\"\nmsgstr \"\"\n\nmsgid \"North\"\nmsgstr \"\"\n\nmsgid \"Number of SDS levels\"\nmsgstr \"Noomber ooff SDS lefels\"\n\n#, fuzzy\nmsgid \"Number of control points\"\nmsgstr \"Noombers pueents\"\n\nmsgid \"Number of edges building up the curve\"\nmsgstr \"Noomber ooff idges booeelding up zee coorfe-a\"\n\nmsgid \"Number of longitudinal wraps\"\nmsgstr \"Noomber ooff lungeetoodinel vreps\"\n\nmsgid \"Number of meridian wraps\"\nmsgstr \"Noomber ooff mereediun vreps\"\n\nmsgid \"Number of mesh copies\"\nmsgstr \"Noomber ooff mesh cupeees\"\n\n#, fuzzy\nmsgid \"Number of samples along the u dimension.\"\nmsgstr \"Mekes cupeees ooff a mesh elung three-a deemensiuns\"\n\n#, fuzzy\nmsgid \"Number of samples along the v dimension.\"\nmsgstr \"Mekes cupeees ooff a mesh elung three-a deemensiuns\"\n\nmsgid \"Number of segments for the linear direction\"\nmsgstr \"\"\n\nmsgid \"Number of squares along each grid\"\nmsgstr \"Noomber ooff sqooeres elung iech greed\"\n\nmsgid \"Number of vertices to insert in each selected edge\"\nmsgstr \"Noomber ooff ferteeces tu insert in iech selected idge-a\"\n\n#, fuzzy\nmsgid \"Numbers NURBS curves\"\nmsgstr \"Renders NOoRBS coorfes\"\n\n#, fuzzy\nmsgid \"Numbers NURBS patches\"\nmsgstr \"Renders NOoRBS petches\"\n\nmsgid \"Numbers points\"\nmsgstr \"Noombers pueents\"\n\n#, fuzzy\nmsgid \"Numbers polyhedron edges\"\nmsgstr \"Noombers pulyhedrun feces\"\n\nmsgid \"Numbers polyhedron faces\"\nmsgstr \"Noombers pulyhedrun feces\"\n\nmsgid \"ODE simulation node.\"\nmsgstr \"\"\n\nmsgid \"Observer latitude (decimal degrees).\"\nmsgstr \"\"\n\nmsgid \"Observer longitude (decimal degrees).\"\nmsgstr \"\"\n\nmsgid \"Offset\"\nmsgstr \"Ooffffset\"\n\nmsgid \"Offset 1\"\nmsgstr \"Ooffffset 1\"\n\nmsgid \"Offset 2\"\nmsgstr \"Ooffffset 2\"\n\nmsgid \"Offset 3\"\nmsgstr \"Ooffffset 3\"\n\nmsgid \"Offset along external edges\"\nmsgstr \"Ooffffset elung ixternel idges\"\n\n#, fuzzy\nmsgid \"Offset distance along edges.\"\nmsgstr \"Ooffffset elung ixternel idges\"\n\nmsgid \"Offset factor for the point, in units of edge length\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Offset from edge\"\nmsgstr \"Ooffffset elung ixternel idges\"\n\nmsgid \"Offset position as a fraction of edge length.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Offsets numbers away from their curve.\"\nmsgstr \"Ooffffsets noombers evey frum zeeur pulyguns\"\n\n#, fuzzy\nmsgid \"Offsets numbers away from their edges.\"\nmsgstr \"Ooffffsets noombers evey frum zeeur pulyguns\"\n\n#, fuzzy\nmsgid \"Offsets numbers away from their patches.\"\nmsgstr \"Ooffffsets noombers evey frum zeeur pulyguns\"\n\n#, fuzzy\nmsgid \"Offsets numbers away from their patches..\"\nmsgstr \"Ooffffsets noombers evey frum zeeur pulyguns\"\n\nmsgid \"Offsets numbers away from their polygons\"\nmsgstr \"Ooffffsets noombers evey frum zeeur pulyguns\"\n\n#, fuzzy\nmsgid \"Offsets numbers away from their polygons.\"\nmsgstr \"Ooffffsets noombers evey frum zeeur pulyguns\"\n\nmsgid \"On your platform, Mesa versions earlier than 7.5.1 are known to cause problems with face selection. If you experience this, please upgrade your Mesa library. See http://bugs.freedesktop.org/show_bug.cgi?id=16866 for detailed information.\"\nmsgstr \"\"\n\nmsgid \"Only selects components where the face attributes in the supplied array are the same\"\nmsgstr \"\"\n\nmsgid \"Opacity\"\nmsgstr \"Oopeceety\"\n\n#, fuzzy\nmsgid \"Open File:\"\nmsgstr \"Oopee Tootureeel:\"\n\nmsgid \"Open K-3D Document:\"\nmsgstr \"Oopee K-3D Ducooment:\"\n\nmsgid \"Open _Log Window ...\"\nmsgstr \"Oopee _Lug Veendoo ...\"\n\n#, fuzzy\nmsgid \"Open example document \\\"%1%\\\"?\"\nmsgstr \"Unteetled Ducooment %1%\"\n\nmsgid \"Open the current script for editing\"\nmsgstr \"Oopee zee coorrent screept fur ideeting\"\n\nmsgid \"OpenEXR (*.exr)\"\nmsgstr \"OopenEXR (*.ixr)\"\n\n#, fuzzy\nmsgid \"OpenGL Information\"\nmsgstr \"Inffurmeshun\"\n\nmsgid \"OpenGL Mesh Painter\"\nmsgstr \"OopenGL Mesh Peeenter\"\n\nmsgid \"OpenGL Render Engine\"\nmsgstr \"OopenGL Render Ingeene-a\"\n\nmsgid \"OpengGL point size\"\nmsgstr \"OopengGL pueent seeze-a\"\n\nmsgid \"Opens a URI using the Gnome libraries\"\nmsgstr \"Oopens a URI useeng zee Gnume-a leebreries\"\n\n#, fuzzy\nmsgid \"Opens a URI using the Mac OSX API\"\nmsgstr \"Oopens a URI useeng zee Veendoos EPI\"\n\nmsgid \"Opens a URI using the Windows API\"\nmsgstr \"Oopens a URI useeng zee Veendoos EPI\"\n\nmsgid \"Operation\"\nmsgstr \"Oopereshun\"\n\nmsgid \"Operator\"\nmsgstr \"Ooperetur\"\n\n#, fuzzy\nmsgid \"Option Name\"\nmsgstr \"Oopereshun\"\n\nmsgid \"Optional bumpmap texture.\"\nmsgstr \"\"\n\nmsgid \"Optionally limits the sweep angle of the cone to less-than 360 degrees.\"\nmsgstr \"\"\n\nmsgid \"Optionally limits the sweep angle of the cylinder to less-than 360 degrees.\"\nmsgstr \"\"\n\nmsgid \"Optionally limits the sweep angle of the disk to less-than 360 degrees.\"\nmsgstr \"\"\n\nmsgid \"Optionally limits the sweep angle of the hyperboloid to less-than 360 degrees.\"\nmsgstr \"\"\n\nmsgid \"Optionally limits the sweep angle of the paraboloid to less-than 360 degrees.\"\nmsgstr \"\"\n\nmsgid \"Optionally limits the sweep angle of the sphere to less-than 360 degrees.\"\nmsgstr \"\"\n\nmsgid \"Optionally limits the sweep angle of the torus to less-than 360 degrees.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Optionally truncates the sphere along the +Z axis.\"\nmsgstr \"Ineble-a pueent deesplecement elung zee Z exees.\"\n\n#, fuzzy\nmsgid \"Optionally truncates the sphere along the -Z axis.\"\nmsgstr \"Ineble-a pueent deesplecement elung zee Z exees.\"\n\nmsgid \"Orbit Viewport\"\nmsgstr \"Oorbeet Feeoopurt\"\n\n#, fuzzy\nmsgid \"Order\"\nmsgstr \"U Oorder\"\n\nmsgid \"Order in the direction normal to the curves (V)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Order in the linear direction\"\nmsgstr \"Sheer durecshun\"\n\nmsgid \"Order of the curve (2-linear - 4-cubic)\"\nmsgstr \"\"\n\nmsgid \"Orientation\"\nmsgstr \"Ooreeenteshun\"\n\nmsgid \"Orientation type (forward or backward along X, Y or Z axis)\"\nmsgstr \"Ooreeenteshun type-a (furverd oor beckverd elung X, Y oor Z exees)\"\n\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgid \"Origin of the bulge.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Origin of the rotation.\"\nmsgstr \"Ooreegin puseeshun\"\n\nmsgid \"Origin position\"\nmsgstr \"Ooreegin puseeshun\"\n\nmsgid \"Original cube depth\"\nmsgstr \"Ooreeginel coobe-a dept\"\n\nmsgid \"Original cube height\"\nmsgstr \"Ooreeginel coobe-a heeeght\"\n\nmsgid \"Original cube width\"\nmsgstr \"Ooreeginel coobe-a veedt\"\n\nmsgid \"Orthographic\"\nmsgstr \"Oorthugrepheec\"\n\nmsgid \"Orthographic projection\"\nmsgstr \"Oorthugrepheec prujecshun\"\n\nmsgid \"Output\"\nmsgstr \"Ooootpoot\"\n\nmsgid \"Output Bitmap\"\nmsgstr \"Ooootpoot Beetmep\"\n\nmsgid \"Output Color\"\nmsgstr \"Ooootpoot Culur\"\n\n#, fuzzy\nmsgid \"Output Device Mesh\"\nmsgstr \"Ooootpoot Mesh\"\n\n#, fuzzy\nmsgid \"Output Double\"\nmsgstr \"Ooootpoot feele-a\"\n\n#, fuzzy\nmsgid \"Output Graph\"\nmsgstr \"Ooootpoot Beetmep\"\n\n#, fuzzy\nmsgid \"Output Int32\"\nmsgstr \"Ooootpoot Lung\"\n\nmsgid \"Output Matrix\"\nmsgstr \"Ooootpoot Metreex\"\n\nmsgid \"Output Mesh\"\nmsgstr \"Ooootpoot Mesh\"\n\nmsgid \"Output String\"\nmsgstr \"Ooootpoot Streeng\"\n\nmsgid \"Output Values of the coficients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Output Vector\"\nmsgstr \"Ooootpoot Fectur3\"\n\nmsgid \"Output X coordinate function, in terms of x, y, z, and any user-defined scalars.\"\nmsgstr \"\"\n\nmsgid \"Output Y coordinate function, in terms of x, y, z, and any user-defined scalars.\"\nmsgstr \"\"\n\nmsgid \"Output Z coordinate function, in terms of x, y, z, and any user-defined scalars.\"\nmsgstr \"\"\n\nmsgid \"Output bitmap\"\nmsgstr \"Ooootpoot beetmep\"\n\nmsgid \"Output color\"\nmsgstr \"Ooootpoot culur\"\n\nmsgid \"Output file\"\nmsgstr \"Ooootpoot feele-a\"\n\n#, fuzzy\nmsgid \"Output file path.\"\nmsgstr \"Ooootpoot feele-a\"\n\nmsgid \"Output matrix (read only)\"\nmsgstr \"Ooootpoot metreex (reed oonly)\"\n\nmsgid \"Output mesh\"\nmsgstr \"Ooootpoot mesh\"\n\nmsgid \"Output mesh size when \\\"Scale to Size\\\" is enabled.\"\nmsgstr \"\"\n\nmsgid \"Output pixel aspect ratio\"\nmsgstr \"Ooootpoot peexel espect reteeu\"\n\nmsgid \"Output pixel height\"\nmsgstr \"Ooootpoot peexel heeeght\"\n\nmsgid \"Output pixel width\"\nmsgstr \"Ooootpoot peexel veedt\"\n\nmsgid \"Output string\"\nmsgstr \"Ooootpoot streeng\"\n\n#, fuzzy\nmsgid \"Output string.\"\nmsgstr \"Ooootpoot streeng\"\n\nmsgid \"Output text\"\nmsgstr \"Ooootpoot text\"\n\n#, fuzzy\nmsgid \"Output value.\"\nmsgstr \"Ooootpoot felooe-a\"\n\n#, fuzzy\nmsgid \"PDF Document (*.pdf)\"\nmsgstr \"K-3D Ducooment (*.k3d)\"\n\nmsgid \"PNG (*.png)\"\nmsgstr \"PNG (*.png)\"\n\n#, fuzzy\nmsgid \"PNG Image (*.png)\"\nmsgstr \"PNM Imege-a (*.pnm)\"\n\nmsgid \"PNM Image (*.pnm)\"\nmsgstr \"PNM Imege-a (*.pnm)\"\n\nmsgid \"PSamples\"\nmsgstr \"PSemples\"\n\n#, fuzzy\nmsgid \"Paint Backfacing\"\nmsgstr \"Gredeeent speceeng\"\n\nmsgid \"Paint Deselect\"\nmsgstr \"Peeent Deselect\"\n\nmsgid \"Paint Select\"\nmsgstr \"Peeent Select\"\n\n#, fuzzy\nmsgid \"Paint name.\"\nmsgstr \"Peremeter neme-a\"\n\nmsgid \"Pan & Tilt Viewport\"\nmsgstr \"Pun & Teelt Feeoopurt\"\n\nmsgid \"Papagayo File\"\nmsgstr \"\"\n\nmsgid \"Papagayo Lipsync File to Load\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Parameter Value\"\nmsgstr \"Peremeter felooe-a\"\n\nmsgid \"Parameter value (u or v) for which a curve will be extracted\"\nmsgstr \"\"\n\nmsgid \"Parameter value at which the point will be extracted\"\nmsgstr \"\"\n\nmsgid \"Parent\"\nmsgstr \"Perent\"\n\nmsgid \"Patch Index\"\nmsgstr \"Petch Index\"\n\n#, fuzzy\nmsgid \"Patch Number\"\nmsgstr \"Fece-a noomber\"\n\nmsgid \"Patch subdivision number\"\nmsgstr \"Petch soobdeefisiun noomber\"\n\n#, fuzzy\nmsgid \"Patches\"\nmsgstr \"Petch Index\"\n\nmsgid \"Path to a bitmap image.\"\nmsgstr \"\"\n\nmsgid \"Path to an HDR environment map.\"\nmsgstr \"\"\n\nmsgid \"Path to goniometric file.\"\nmsgstr \"\"\n\nmsgid \"Penalty for bad meshes\"\nmsgstr \"Penelty fur bed meshes\"\n\nmsgid \"Phase\"\nmsgstr \"Phese-a\"\n\n#, fuzzy\nmsgid \"Phi Max\"\nmsgstr \"Phee mex\"\n\n#, fuzzy\nmsgid \"Phi Max.\"\nmsgstr \"Phee mex\"\n\nmsgid \"Phi Maximum\"\nmsgstr \"Phee Mexeemoom\"\n\n#, fuzzy\nmsgid \"Phi Min\"\nmsgstr \"Phee meen\"\n\n#, fuzzy\nmsgid \"Phi Min.\"\nmsgstr \"Phee meen\"\n\nmsgid \"Phi Minimum\"\nmsgstr \"Phee Meenimoom\"\n\nmsgid \"Photons\"\nmsgstr \"Phutuns\"\n\nmsgid \"Pick Animation Render Engine:\"\nmsgstr \"Peeck Uneemeshun Render Ingeene-a:\"\n\nmsgid \"Pick Backfacing\"\nmsgstr \"\"\n\nmsgid \"Pick Camera:\"\nmsgstr \"Peeck Cemera:\"\n\nmsgid \"Pick OpenGL Render Engine:\"\nmsgstr \"Peeck OopenGL Render Ingeene-a:\"\n\nmsgid \"Pick Preview Render Engine:\"\nmsgstr \"Peeck Prefeeoo Render Ingeene-a:\"\n\nmsgid \"Pick Still Render Engine:\"\nmsgstr \"Peeck Steell Render Ingeene-a:\"\n\nmsgid \"Pick Target\"\nmsgstr \"Peeck Terget\"\n\nmsgid \"Pin Panel\"\nmsgstr \"Peen Punel\"\n\nmsgid \"Pinned Panel\"\nmsgstr \"Peenned Punel\"\n\nmsgid \"Pixel Aspect Ratio\"\nmsgstr \"Peexel Espect Reteeu\"\n\nmsgid \"Pixel Filter\"\nmsgstr \"Peexel Feelter\"\n\nmsgid \"Pixel Filter Height\"\nmsgstr \"Peexel Feelter Heeeght\"\n\nmsgid \"Pixel Filter Width\"\nmsgstr \"Peexel Feelter Veedt\"\n\nmsgid \"Pixel Height\"\nmsgstr \"Peexel Heeeght\"\n\nmsgid \"Pixel Width\"\nmsgstr \"Peexel Veedt\"\n\nmsgid \"Pixel X Samples\"\nmsgstr \"Peexel X Semples\"\n\nmsgid \"Pixel Y Samples\"\nmsgstr \"Peexel Y Semples\"\n\nmsgid \"Placement policy\"\nmsgstr \"Plecement puleecy\"\n\nmsgid \"Placement policy (optimal, line, endpoint or midpoint, endpoints)\"\nmsgstr \"Plecement puleecy (oopteemel, leene-a, indpueent oor meedpuint, indpueents)\"\n\nmsgid \"Places a shader on a bilinear patch, aligned with the farplane\"\nmsgstr \"Pleces a sheder oon a beelineer petch, eleegned veet zee ferplune-a\"\n\nmsgid \"Play\"\nmsgstr \"Pley\"\n\nmsgid \"Play Script:\"\nmsgstr \"Pley Screept:\"\n\nmsgid \"Playback Mode\"\nmsgstr \"Pleybeck Mude-a\"\n\n#, fuzzy\nmsgid \"Plot orientation (positive or negative along the X, Y or Z axis).\"\nmsgstr \"Ooreeenteshun type-a (furverd oor beckverd elung X, Y oor Z exees)\"\n\nmsgid \"Plot size along the u dimension.\"\nmsgstr \"\"\n\nmsgid \"Plot size along the v dimension.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Poin_ts\"\nmsgstr \"Pueents\"\n\n#, fuzzy\nmsgid \"Point Array Name\"\nmsgstr \"Fertex Sheder\"\n\n#, fuzzy\nmsgid \"Point Count\"\nmsgstr \"Pueent cuoont\"\n\nmsgid \"Point Index\"\nmsgstr \"Pueent Index\"\n\n#, fuzzy\nmsgid \"Point Normals\"\nmsgstr \"Nurmel\"\n\nmsgid \"Point Size\"\nmsgstr \"Pueent Seeze-a\"\n\n#, fuzzy\nmsgid \"Point Spacing\"\nmsgstr \"Gredeeent speceeng\"\n\nmsgid \"Point output array name.\"\nmsgstr \"\"\n\nmsgid \"Pointer to device mesh\"\nmsgstr \"\"\n\nmsgid \"Points\"\nmsgstr \"Pueents\"\n\nmsgid \"Points radius\"\nmsgstr \"Pueents redeeoos\"\n\nmsgid \"Points to approximate\"\nmsgstr \"\"\n\nmsgid \"Polygonizes bicubic patches\"\nmsgstr \"Pulyguneezes beecoobic petches\"\n\n#, fuzzy\nmsgid \"Polyhedron size.\"\nmsgstr \"Pulyhedrun seeze-a (scele-a)\"\n\n#, fuzzy\nmsgid \"Polyhedron type.\"\nmsgstr \"Pulyhedrun Cuoont\"\n\nmsgid \"Position\"\nmsgstr \"Puseeshun\"\n\nmsgid \"Position on X axis\"\nmsgstr \"Puseeshun oon X exees\"\n\nmsgid \"Position on Y axis\"\nmsgstr \"Puseeshun oon Y exees\"\n\nmsgid \"Position on Z axis\"\nmsgstr \"Puseeshun oon Z exees\"\n\nmsgid \"Postscript Document (*.ps)\"\nmsgstr \"\"\n\nmsgid \"Power\"\nmsgstr \"Pooer\"\n\nmsgid \"Power-drawn by the light source in Watts.\"\nmsgstr \"\"\n\nmsgid \"Preview SDS\"\nmsgstr \"Prefeeoo SDS\"\n\nmsgid \"Primitive\"\nmsgstr \"Preemitife-a\"\n\n#, fuzzy\nmsgid \"Primitive Number\"\nmsgstr \"Preemitife-a\"\n\n#, fuzzy\nmsgid \"Primitive Number.\"\nmsgstr \"Preemitife-a\"\n\nmsgid \"Primitive size (scale)\"\nmsgstr \"Preemitife-a seeze-a (scele-a)\"\n\nmsgid \"Primitive type (sphere, quad only sphere or sphereized cylinder\"\nmsgstr \"Preemitife-a type-a (sphere-a, qooed oonly sphere-a oor sphereeezed cyleender\"\n\nmsgid \"Primitive type (teapot, teacup or teaspoon\"\nmsgstr \"Preemitife-a type-a (teeput, teecoop oor teespuun\"\n\nmsgid \"Prints an input string value to stdout\"\nmsgstr \"Preents un inpoot streeng felooe-a tu stduoot\"\n\nmsgid \"Prints associated varying data near each edge, for debugging purposes\"\nmsgstr \"\"\n\nmsgid \"Prints input string to console's stdout\"\nmsgstr \"Preents inpoot streeng tu cunsule's stduoot\"\n\nmsgid \"Prints mesh information to stdout\"\nmsgstr \"Preents mesh inffurmeshun tu stduoot\"\n\n#, fuzzy\nmsgid \"Prints selection information to stdout\"\nmsgstr \"Preents mesh inffurmeshun tu stduoot\"\n\nmsgid \"Prints vertex data near each corresponding vertex\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Product of inputs.\"\nmsgstr \"Prudooct ooff inpoots\"\n\n#, fuzzy\nmsgid \"Projection mapping.\"\nmsgstr \"Prujecshun Exees\"\n\nmsgid \"Property Type\"\nmsgstr \"Pruperty Type-a\"\n\nmsgid \"Provides a custom property control for NURBS knot vectors.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Provides a custom property control for k3d::rectangle properties.\"\nmsgstr \"Prufeedes a suoorce-a oobject tu leenk culur pruperteees tu\"\n\nmsgid \"Provides a custom property page for the MorphPoints modifier.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Provides a custom property widget for k3d::bool_t properties.\"\nmsgstr \"Prufeedes a suoorce-a oobject tu leenk culur pruperteees tu\"\n\n#, fuzzy\nmsgid \"Provides a custom property widget for k3d::color properties.\"\nmsgstr \"Prufeedes a suoorce-a oobject tu leenk culur pruperteees tu\"\n\n#, fuzzy\nmsgid \"Provides a custom property widget for k3d::filesystem::path properties.\"\nmsgstr \"Prufeedes a suoorce-a oobject tu leenk culur pruperteees tu\"\n\n#, fuzzy\nmsgid \"Provides a custom property widget for k3d::matrix4 properties.\"\nmsgstr \"Prufeedes a suoorce-a oobject tu leenk culur pruperteees tu\"\n\n#, fuzzy\nmsgid \"Provides a custom property widget for k3d::string_t properties.\"\nmsgstr \"Prufeedes a suoorce-a oobject tu leenk culur pruperteees tu\"\n\nmsgid \"Provides a general-purpose dialog for editing source-code, text, scripts, and shaders.\"\nmsgstr \"\"\n\nmsgid \"Provides a general-purpose editor for editing source-code, text, scripts, and shaders.\"\nmsgstr \"\"\n\nmsgid \"Provides a panel for displaying the undo tree\"\nmsgstr \"\"\n\nmsgid \"Provides a panel for manipulating the current animation time\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Provides a panel for manipulating the current time\"\nmsgstr \"Lued a screept frum deesk, repleceeng zee coorrent screept\"\n\nmsgid \"Provides a panel for profiling execution of the visualization pipeline\"\nmsgstr \"\"\n\nmsgid \"Provides a realtime time source for a K-3D document\"\nmsgstr \"Prufeedes a reelteeme-a teeme-a suoorce-a fur a K-3D ducooment\"\n\n#, fuzzy\nmsgid \"Provides a standard control for mesh properties.\"\nmsgstr \"Prufeedes a suoorce-a oobject tu leenk culur pruperteees tu\"\n\n#, fuzzy\nmsgid \"Provides a standard control for selection properties.\"\nmsgstr \"Prufeedes a suoorce-a oobject tu leenk culur pruperteees tu\"\n\nmsgid \"Provides a time source for a K-3D document\"\nmsgstr \"Prufeedes a teeme-a suoorce-a fur a K-3D ducooment\"\n\nmsgid \"Provides a user-interface for assigning menu hotkeys.\"\nmsgstr \"\"\n\nmsgid \"Provides an edit mode that automatically previews using the Aqsis render engine.\"\nmsgstr \"\"\n\nmsgid \"Provides an edit-mode to interactively move items in the viewport.\"\nmsgstr \"\"\n\nmsgid \"Provides an edit-mode with programmable behavior.\"\nmsgstr \"\"\n\nmsgid \"Provides an embedded Aqsis RenderMan engine.\"\nmsgstr \"\"\n\nmsgid \"Provides an interactive JavaScript shell.\"\nmsgstr \"\"\n\nmsgid \"Provides an interactive Python shell window\"\nmsgstr \"\"\n\nmsgid \"Provides default behavior when no other mode is in-use.\"\nmsgstr \"\"\n\nmsgid \"Provides interactive controls for 'snapping' nodes.\"\nmsgstr \"\"\n\nmsgid \"Provides interactive controls for cropped rendering.\"\nmsgstr \"\"\n\nmsgid \"Provides interactive controls for reparenting nodes.\"\nmsgstr \"\"\n\nmsgid \"Provides render integration with 3Delight, http://www.3delight.com/\"\nmsgstr \"\"\n\nmsgid \"Provides render integration with AIR, http://www.sitexgraphics.com/html/air.html\"\nmsgstr \"\"\n\nmsgid \"Provides render integration with Aqsis, http://www.aqsis.org\"\nmsgstr \"\"\n\nmsgid \"Provides render integration with BMRT, may it rest in peace.\"\nmsgstr \"\"\n\nmsgid \"Provides render integration with POVMan\"\nmsgstr \"\"\n\nmsgid \"Provides render integration with PRMan, http://renderman.pixar.com\"\nmsgstr \"\"\n\nmsgid \"Provides render integration with Pixie, http://www.renderpixie.com\"\nmsgstr \"\"\n\nmsgid \"Provides render integration with RenderDotC, http://www.dotcsw.com/rdc.html\"\nmsgstr \"\"\n\nmsgid \"Provides render integration with a bundled copy of Aqsis, http://www.aqsis.org\"\nmsgstr \"\"\n\nmsgid \"Provides render integration with networked PRMan, https://renderman.pixar.com\"\nmsgstr \"\"\n\nmsgid \"Provides the standard toolbar\"\nmsgstr \"\"\n\nmsgid \"Proxying plugin %1%\"\nmsgstr \"Pruxyeeng ploogeen %1%\"\n\nmsgid \"Proxying plugin module %1%\"\nmsgstr \"Pruxyeeng ploogeen mudoole-a %1%\"\n\nmsgid \"Python _Shell ...\"\nmsgstr \"\"\n\nmsgid \"Python scripting engine\"\nmsgstr \"Pythun screepting ingeene-a\"\n\nmsgid \"Quadric weighting\"\nmsgstr \"Qooedreec veeeghting\"\n\nmsgid \"Quadric weighting policy (uniform, area, angle)\"\nmsgstr \"Qooedreec veeeghting puleecy (uneeffurm, erea, ungle-a)\"\n\nmsgid \"Quotient of inputs\"\nmsgstr \"Qoouteeent ooff inpoots\"\n\nmsgid \"R1\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"R1 Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"R2\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"R2 Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"R3\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"R3 Texture\"\nmsgstr \"Textoore-a U\"\n\nmsgid \"RIB archive to be inserted in output\"\nmsgstr \"RIB ercheefe-a tu be-a inserted in ooootpoot\"\n\nmsgid \"Radial Power\"\nmsgstr \"Redeeel Pooer\"\n\nmsgid \"Radial Segments\"\nmsgstr \"Redeeel Segments\"\n\nmsgid \"Radial power\"\nmsgstr \"Redeeel pooer\"\n\nmsgid \"Radial segments\"\nmsgstr \"Redeeel segments\"\n\nmsgid \"Radius\"\nmsgstr \"Redeeoos\"\n\nmsgid \"Random seed\"\nmsgstr \"Rundum seed\"\n\n#, fuzzy\nmsgid \"Reader that loads external MD2 (.md2) files into the document by reference\"\nmsgstr \"Mesh reeder thet lueds ixternel Vefeffrunt (.oobj) feeles intu zee ducooment by refference-a\"\n\n#, fuzzy\nmsgid \"Reader that loads external Scalable Vector Graphics (.svg) files into the document by reference\"\nmsgstr \"Mesh reeder thet lueds ixternel Vefeffrunt (.oobj) feeles intu zee ducooment by refference-a\"\n\n#, fuzzy\nmsgid \"Record\"\nmsgstr \"Recurdeeng\"\n\n#, fuzzy\nmsgid \"Records\"\nmsgstr \"Recurdeeng\"\n\nmsgid \"Records data profiling execution of the visualization pipeline\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Rectangle\"\nmsgstr \"ungle-a\"\n\n#, fuzzy\nmsgid \"Red\"\nmsgstr \"_Redu\"\n\nmsgid \"Red threshold\"\nmsgstr \"Red threshuld\"\n\nmsgid \"Red weight\"\nmsgstr \"Red veeeght\"\n\nmsgid \"Redo %1%\"\nmsgstr \"Redu %1%\"\n\nmsgid \"Redo All\"\nmsgstr \"Redu Ell\"\n\nmsgid \"Redo all %1%\"\nmsgstr \"Redu ell %1%\"\n\nmsgid \"Reference Plane\"\nmsgstr \"Refference-a Plune-a\"\n\nmsgid \"Reference Plane Color\"\nmsgstr \"Refference-a Plune-a Culur\"\n\nmsgid \"Reference Plane Distance\"\nmsgstr \"Refference-a Plune-a Deestunce-a\"\n\nmsgid \"Reflected Color\"\nmsgstr \"Refflected Culur\"\n\nmsgid \"Relative\"\nmsgstr \"Releteefe-a\"\n\n#, fuzzy\nmsgid \"Relative size.\"\nmsgstr \"Releteefe-a\"\n\n#, fuzzy\nmsgid \"Remainder of inputs.\"\nmsgstr \"Remeeender ooff inpoots\"\n\nmsgid \"Rename node %1%\"\nmsgstr \"Reneme-a nude-a %1%\"\n\n#, fuzzy\nmsgid \"Rename u v\"\nmsgstr \"Reneme-a nude-a %1%\"\n\nmsgid \"Renames the u,v variables to suit the variables from your function. Could be x,y for example\"\nmsgstr \"\"\n\nmsgid \"Render\"\nmsgstr \"Render\"\n\nmsgid \"Render Alpha\"\nmsgstr \"Render Elpha\"\n\nmsgid \"Render Animation\"\nmsgstr \"Render Uneemeshun\"\n\n#, fuzzy\nmsgid \"Render Command\"\nmsgstr \"Render Imege-a\"\n\nmsgid \"Render Engine\"\nmsgstr \"Render Ingeene-a\"\n\nmsgid \"Render Frame\"\nmsgstr \"Render Freme-a\"\n\nmsgid \"Render Frame:\"\nmsgstr \"Render Freme-a:\"\n\nmsgid \"Render Image\"\nmsgstr \"Render Imege-a\"\n\nmsgid \"Render Motion Blur\"\nmsgstr \"Render Mushun Bloor\"\n\nmsgid \"Render Preview\"\nmsgstr \"Render Prefeeoo\"\n\nmsgid \"Render R_egion\"\nmsgstr \"Render R_igeeun\"\n\nmsgid \"Render Region\"\nmsgstr \"Render Regeeun\"\n\nmsgid \"Render Shadows\"\nmsgstr \"Render Shedoos\"\n\nmsgid \"Render antialiased text.\"\nmsgstr \"\"\n\nmsgid \"Render geometry as a matte\"\nmsgstr \"Render geumetry es a mette-a\"\n\nmsgid \"Render intersecting volumes\"\nmsgstr \"Render intersecteeng fuloomes\"\n\nmsgid \"Render sharp boundaries on the resulting subdivision surface\"\nmsgstr \"Render sherp buoondereees oon zee resoolteeng soobdeefisiun soorffece-a\"\n\nmsgid \"Render the difference of two volumes\"\nmsgstr \"Render zee deefffference-a ooff tvu fuloomes\"\n\nmsgid \"Render the union of two volumnes\"\nmsgstr \"Render zee uneeun ooff tvu fuloomnes\"\n\nmsgid \"RenderMan Implementation Unavailable\"\nmsgstr \"\"\n\nmsgid \"RenderMan Mesh Painter\"\nmsgstr \"RenderMun Mesh Peeenter\"\n\nmsgid \"RenderMan Render Engine\"\nmsgstr \"RenderMun Render Ingeene-a\"\n\nmsgid \"RenderMan area light source\"\nmsgstr \"RenderMun erea leeght suoorce-a\"\n\nmsgid \"RenderMan light source\"\nmsgstr \"RenderMun leeght suoorce-a\"\n\nmsgid \"RenderMan shader (*.sl)\"\nmsgstr \"RenderMun sheder (*.sl)\"\n\n#, fuzzy\nmsgid \"Renders Bezier triangle patches\"\nmsgstr \"Renders beelineer petches\"\n\nmsgid \"Renders NURBS curves\"\nmsgstr \"Renders NOoRBS coorfes\"\n\nmsgid \"Renders NURBS patches\"\nmsgstr \"Renders NOoRBS petches\"\n\nmsgid \"Renders a one-dimensional array of geometric object instances\"\nmsgstr \"Renders a oone-a-deemensiunel errey ooff geumetreec oobject instunces\"\n\nmsgid \"Renders a three-dimensional array of geometric object instances\"\nmsgstr \"Renders a three-a-deemensiunel errey ooff geumetreec oobject instunces\"\n\nmsgid \"Renders a two-dimensional array of geometric object instances\"\nmsgstr \"Renders a tvu-deemensiunel errey ooff geumetreec oobject instunces\"\n\nmsgid \"Renders an instance of a geometric mesh\"\nmsgstr \"Renders un instunce-a ooff a geumetreec mesh\"\n\nmsgid \"Renders bicubic patches\"\nmsgstr \"Renders beecoobic petches\"\n\nmsgid \"Renders bilinear patches\"\nmsgstr \"Renders beelineer petches\"\n\nmsgid \"Renders blobbies (implicit surfaces)\"\nmsgstr \"Renders blubbeees (impleecit soorffeces)\"\n\nmsgid \"Renders blobby primitives using points and lines\"\nmsgstr \"Renders blubby preemitifes useeng pueents und leenes\"\n\n#, fuzzy\nmsgid \"Renders cone primitives\"\nmsgstr \"Cune-a preemitife-a\"\n\n#, fuzzy\nmsgid \"Renders cone primitives using OpenGL\"\nmsgstr \"Renders blubby preemitifes useeng pueents und leenes\"\n\nmsgid \"Renders cubic curves\"\nmsgstr \"Renders coobeec coorfes\"\n\n#, fuzzy\nmsgid \"Renders cylinder primitives\"\nmsgstr \"Cyleender preemitife-a\"\n\n#, fuzzy\nmsgid \"Renders cylinder primitives using OpoenGL\"\nmsgstr \"Renders blubby preemitifes useeng pueents und leenes\"\n\n#, fuzzy\nmsgid \"Renders disk primitives\"\nmsgstr \"Deesk preemitife-a\"\n\n#, fuzzy\nmsgid \"Renders disk primitives using OpenGL\"\nmsgstr \"Renders blubby preemitifes useeng pueents und leenes\"\n\n#, fuzzy\nmsgid \"Renders hyperboloid primitives\"\nmsgstr \"Hyperbulueed preemitife-a\"\n\n#, fuzzy\nmsgid \"Renders hyperboloid primitives using OpenGL\"\nmsgstr \"Renders blubby preemitifes useeng pueents und leenes\"\n\nmsgid \"Renders linear curves\"\nmsgstr \"Renders leeneer coorfes\"\n\n#, fuzzy\nmsgid \"Renders mesh as SDS faces using OpenGL 1.1\"\nmsgstr \"Renders mesh es SDS feces\"\n\n#, fuzzy\nmsgid \"Renders mesh as SDS faces using OpenGL VBOs\"\nmsgstr \"Renders mesh es SDS feces\"\n\n#, fuzzy\nmsgid \"Renders mesh as SDS patch borders using OpenGL 1.1\"\nmsgstr \"Renders mesh es SDS petch burders\"\n\n#, fuzzy\nmsgid \"Renders mesh as SDS patch borders using OpenGL VBOs\"\nmsgstr \"Renders mesh es SDS petch burders\"\n\n#, fuzzy\nmsgid \"Renders mesh as SDS patch corners using OpenGL 1.1\"\nmsgstr \"Renders mesh es SDS petch curners\"\n\n#, fuzzy\nmsgid \"Renders mesh as SDS patch corners using OpenGL VBOs\"\nmsgstr \"Renders mesh es SDS petch curners\"\n\nmsgid \"Renders mesh edges\"\nmsgstr \"Renders mesh idges\"\n\n#, fuzzy\nmsgid \"Renders mesh edges (OpenGL 1.1)\"\nmsgstr \"Renders mesh idges\"\n\n#, fuzzy\nmsgid \"Renders mesh edges (OpenGL VBOs)\"\nmsgstr \"Renders mesh idges\"\n\nmsgid \"Renders mesh faces\"\nmsgstr \"Renders mesh feces\"\n\n#, fuzzy\nmsgid \"Renders mesh faces using a per-face color array\"\nmsgstr \"Renders mesh feces, useeng smuut nurmels\"\n\n#, fuzzy\nmsgid \"Renders mesh faces, after trianglulating them (OpenGL 1.1)\"\nmsgstr \"Renders mesh feces, useeng flet shedeeng\"\n\n#, fuzzy\nmsgid \"Renders mesh faces, after trianglulating them (OpenGL VBOs)\"\nmsgstr \"Renders mesh feces, useeng smuut nurmels\"\n\nmsgid \"Renders mesh points\"\nmsgstr \"Renders mesh pueents\"\n\n#, fuzzy\nmsgid \"Renders mesh points (OpenGL VBOs)\"\nmsgstr \"Renders mesh pueents\"\n\nmsgid \"Renders mesh polyhedra\"\nmsgstr \"Renders mesh pulyhedra\"\n\nmsgid \"Renders mesh subdivision surface edges\"\nmsgstr \"Renders mesh soobdeefisiun soorffece-a idges\"\n\nmsgid \"Renders mesh subdivision surface faces\"\nmsgstr \"Renders mesh soobdeefisiun soorffece-a feces\"\n\nmsgid \"Renders mesh subdivision surface points\"\nmsgstr \"Renders mesh soobdeefisiun soorffece-a pueents\"\n\nmsgid \"Renders mesh subdivision surfaces\"\nmsgstr \"Renders mesh soobdeefisiun soorffeces\"\n\n#, fuzzy\nmsgid \"Renders meshes using a classic hidden-line effect.\"\nmsgstr \"Renders mesh feces, useeng flet shedeeng\"\n\n#, fuzzy\nmsgid \"Renders paraboloid primitives\"\nmsgstr \"Perebulueed preemitife-a\"\n\n#, fuzzy\nmsgid \"Renders paraboloid primitives using OpoenGL\"\nmsgstr \"Renders blubby preemitifes useeng pueents und leenes\"\n\n#, fuzzy\nmsgid \"Renders particle primitives.\"\nmsgstr \"Renders blubby preemitifes useeng pueents und leenes\"\n\nmsgid \"Renders polyhedron face normal vectors\"\nmsgstr \"Renders pulyhedrun fece-a nurmel fecturs\"\n\n#, fuzzy\nmsgid \"Renders polyhedron point normal vectors\"\nmsgstr \"Renders pulyhedrun fece-a nurmel fecturs\"\n\nmsgid \"Renders selection hooks for facevarying data\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Renders sphere primitives\"\nmsgstr \"Sphere-a preemitife-a\"\n\n#, fuzzy\nmsgid \"Renders sphere primitives using OpoenGL\"\nmsgstr \"Renders blubby preemitifes useeng pueents und leenes\"\n\n#, fuzzy\nmsgid \"Renders teapot primitives\"\nmsgstr \"Renders blubby preemitifes useeng pueents und leenes\"\n\n#, fuzzy\nmsgid \"Renders teapot primitives using OpoenGL\"\nmsgstr \"Renders blubby preemitifes useeng pueents und leenes\"\n\nmsgid \"Renders textured mesh faces, after triangulating them (OpenGL 1.1)\"\nmsgstr \"\"\n\nmsgid \"Renders the scene to a bitmap using OpenGL\"\nmsgstr \"Renders zee scene-a tu a beetmep useeng OopenGL\"\n\nmsgid \"Renders the scene to a bitmap using WGL\"\nmsgstr \"Renders zee scene-a tu a beetmep useeng VGL\"\n\n#, fuzzy\nmsgid \"Renders torus primitives\"\nmsgstr \"Turoos preemitife-a\"\n\n#, fuzzy\nmsgid \"Renders torus primitives using OpenGL\"\nmsgstr \"Renders blubby preemitifes useeng pueents und leenes\"\n\nmsgid \"Replace\"\nmsgstr \"Replece-a\"\n\nmsgid \"Requested script file %1% doesn't exist.\"\nmsgstr \"Reqooested screept feele-a %1% duesn't ixeest.\"\n\nmsgid \"Reset\"\nmsgstr \"Reset\"\n\nmsgid \"Reset / Reload Mesh\"\nmsgstr \"Reset / Relued Mesh\"\n\nmsgid \"Reset Camera Crop Window\"\nmsgstr \"Reset Cemera Crup Veendoo\"\n\nmsgid \"Reset Mesh\"\nmsgstr \"Reset Mesh\"\n\n#, fuzzy\nmsgid \"Reset Selection\"\nmsgstr \"Mesh Selecshun\"\n\nmsgid \"Reset modifications.\"\nmsgstr \"\"\n\nmsgid \"Resolution\"\nmsgstr \"Resulooshun\"\n\nmsgid \"Reverse Difference\"\nmsgstr \"Referse-a Deefffference-a\"\n\nmsgid \"Reverse playback\"\nmsgstr \"Referse-a pleybeck\"\n\n#, fuzzy\nmsgid \"Reverses the orientation of selected polygons and bicubic or bilinear patches\"\nmsgstr \"Referses zee ooreeenteshun ooff selected pulyguns\"\n\nmsgid \"Revert\"\nmsgstr \"Refert\"\n\nmsgid \"Revert %1% to last-saved version? Unsaved changes will be lost (No Undo)\"\nmsgstr \"Refert %1% tu lest-sefed ferseeun? Unsefed chunges veell be-a lust (Nu Undu)\"\n\nmsgid \"Rewind\"\nmsgstr \"Rooeend\"\n\nmsgid \"Right\"\nmsgstr \"Reeght\"\n\nmsgid \"Rigid-body dynamics object.\"\nmsgstr \"\"\n\nmsgid \"Rigid-body dynamics simulation.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Ring Side A\"\nmsgstr \"Meen index\"\n\n#, fuzzy\nmsgid \"Ring Side B\"\nmsgstr \"Meen index\"\n\nmsgid \"Roll Viewport\"\nmsgstr \"Rull Feeoopurt\"\n\nmsgid \"Rotate\"\nmsgstr \"Rutete-a\"\n\nmsgid \"Rotate Screen Z\"\nmsgstr \"Rutete-a Screee Z\"\n\nmsgid \"Rotate X\"\nmsgstr \"Rutete-a X\"\n\nmsgid \"Rotate Y\"\nmsgstr \"Rutete-a Y\"\n\nmsgid \"Rotate Z\"\nmsgstr \"Rutete-a Z\"\n\nmsgid \"RotateArray1D\"\nmsgstr \"RuteteErrey1D\"\n\nmsgid \"RotateArray2D\"\nmsgstr \"RuteteErrey2D\"\n\nmsgid \"RotateArray3D\"\nmsgstr \"RuteteErrey3D\"\n\nmsgid \"Rotates mesh points\"\nmsgstr \"Rutetes mesh pueents\"\n\nmsgid \"Rotation\"\nmsgstr \"Ruteshun\"\n\nmsgid \"Roughness of the surface in the u direction.\"\nmsgstr \"\"\n\nmsgid \"Roughness of the surface in the v direction.\"\nmsgstr \"\"\n\nmsgid \"Rounded parts diameter\"\nmsgstr \"Ruoonded perts deeemeter\"\n\nmsgid \"Row number\"\nmsgstr \"Roo noomber\"\n\nmsgid \"Row number (Y axis)\"\nmsgstr \"Roo noomber (Y exees)\"\n\nmsgid \"Rows\"\nmsgstr \"Roos\"\n\n#, fuzzy\nmsgid \"Rubber Band Backfacing\"\nmsgstr \"Roobber Bund Replece-a\"\n\nmsgid \"Rubber Band Deselect\"\nmsgstr \"Roobber Bund Deselect\"\n\nmsgid \"Rubber Band Replace\"\nmsgstr \"Roobber Bund Replece-a\"\n\nmsgid \"Rubber Band Select\"\nmsgstr \"Roobber Bund Select\"\n\nmsgid \"S Wrap\"\nmsgstr \"S Vrep\"\n\n#, fuzzy\nmsgid \"STL file type\"\nmsgstr \"Boolge-a type-a\"\n\n#, fuzzy\nmsgid \"SVG Document (*.svg)\"\nmsgstr \"K-3D Ducooment (*.k3d)\"\n\nmsgid \"S_cripting\"\nmsgstr \"S_creepting\"\n\nmsgid \"S_nap Tool\"\nmsgstr \"S_nep Tuul\"\n\n#, fuzzy\nmsgid \"Same Attributes\"\nmsgstr \"RenderMun Ettreeboote-a\"\n\nmsgid \"Samples\"\nmsgstr \"Semples\"\n\nmsgid \"Samples per knot interval in the U direction. More is better\"\nmsgstr \"\"\n\nmsgid \"Samples per knot interval in the V direction. More is better\"\nmsgstr \"\"\n\nmsgid \"Samples per knot interval of the trim curves. More is better\"\nmsgstr \"\"\n\nmsgid \"Save\"\nmsgstr \"Sefe-a\"\n\nmsgid \"Save GraphViz (.dot) file ...\"\nmsgstr \"\"\n\nmsgid \"Save K-3D Document As:\"\nmsgstr \"Sefe-a K-3D Ducooment Es:\"\n\n#, fuzzy\nmsgid \"Save Mesh ...\"\nmsgstr \"Sefe-a _Es...\"\n\nmsgid \"Save Mesh as GraphViz .dot file:\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Save PDF Document:\"\nmsgstr \"Sefe-a K-3D Ducooment Es:\"\n\nmsgid \"Save PNG Image:\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Save Postscript Document:\"\nmsgstr \"Sefe-a K-3D Ducooment Es:\"\n\n#, fuzzy\nmsgid \"Save SVG Document:\"\nmsgstr \"Sefe-a K-3D Ducooment Es:\"\n\nmsgid \"Save Script As::\"\nmsgstr \"Sefe-a Screept Es::\"\n\nmsgid \"Save Script:\"\nmsgstr \"Sefe-a Screept:\"\n\nmsgid \"Save _As...\"\nmsgstr \"Sefe-a _Es...\"\n\nmsgid \"Save alpha\"\nmsgstr \"Sefe-a elpha\"\n\n#, fuzzy\nmsgid \"Save mesh file:\"\nmsgstr \"Sefe-a Test Cese-a Es:\"\n\n#, fuzzy\nmsgid \"Save selection ...\"\nmsgstr \"Freme-a selecshun\"\n\n#, fuzzy\nmsgid \"Save selection file:\"\nmsgstr \"Freme-a selecshun\"\n\nmsgid \"Save the changes to document \\\"%1%\\\" before closing?\"\nmsgstr \"Sefe-a zee chunges tu ducooment \\\"%1%\\\" beffure-a cluseeng?\"\n\nmsgid \"Save the current script to disk\"\nmsgstr \"Sefe-a zee coorrent screept tu deesk\"\n\nmsgid \"Scale\"\nmsgstr \"Scele-a\"\n\nmsgid \"Scale Blue component value\"\nmsgstr \"Scele-a Blooe-a cumpunent felooe-a\"\n\nmsgid \"Scale Green component value\"\nmsgstr \"Scele-a Greee cumpunent felooe-a\"\n\nmsgid \"Scale Red componnt value\"\nmsgstr \"Scele-a Red cumpunnt felooe-a\"\n\nmsgid \"Scale X\"\nmsgstr \"Scele-a X\"\n\nmsgid \"Scale XY\"\nmsgstr \"Scele-a XY\"\n\nmsgid \"Scale XYZ\"\nmsgstr \"Scele-a XYZ\"\n\nmsgid \"Scale XZ\"\nmsgstr \"Scele-a XZ\"\n\nmsgid \"Scale Y\"\nmsgstr \"Scele-a Y\"\n\nmsgid \"Scale YZ\"\nmsgstr \"Scele-a YZ\"\n\nmsgid \"Scale Z\"\nmsgstr \"Scele-a Z\"\n\n#, fuzzy\nmsgid \"Scale factor in the U direction\"\nmsgstr \"Sheer durecshun\"\n\n#, fuzzy\nmsgid \"Scale factor in the V direction\"\nmsgstr \"Sheer durecshun\"\n\nmsgid \"Scale the output mesh to fit within a fixed-size bounding-box.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Scale to Size\"\nmsgstr \"Scele-a X\"\n\nmsgid \"Scale vectors for display\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Scales light intensity.\"\nmsgstr \"Sceles mesh pueents\"\n\nmsgid \"Scales mesh points\"\nmsgstr \"Sceles mesh pueents\"\n\nmsgid \"Scaling\"\nmsgstr \"Sceleeng\"\n\nmsgid \"Scaling factor by which to scale the hole relative to the original face\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Scriped node that can do arbitrary rendering using OpenGL.\"\nmsgstr \"Screept nude-a thet ects es a render ingeene-a\"\n\nmsgid \"Script\"\nmsgstr \"Screept\"\n\nmsgid \"Script node that acts as a render engine\"\nmsgstr \"Screept nude-a thet ects es a render ingeene-a\"\n\nmsgid \"Script node that executes whenever one of its inputs changes\"\nmsgstr \"Screept nude-a thet ixecootes vhenefer oone-a ooff its inpoots chunges\"\n\nmsgid \"Script source code\"\nmsgstr \"Screept suoorce-a cude-a\"\n\nmsgid \"Scripted Mesh Painter\"\nmsgstr \"Screepted Mesh Peeenter\"\n\n#, fuzzy\nmsgid \"Scripted Plugin.\"\nmsgstr \"Screepted Mesh Peeenter\"\n\nmsgid \"Scripted node that acts as a meta-object (provides dynamic runtime execution of arbitrary commands).\"\nmsgstr \"\"\n\nmsgid \"Search\"\nmsgstr \"Seerch\"\n\nmsgid \"Searching for plugins in %1%\"\nmsgstr \"Seercheeng fur ploogeens in %1%\"\n\n#, fuzzy\nmsgid \"Second\"\nmsgstr \"Send\"\n\nmsgid \"Second check color\"\nmsgstr \"Secund check culur\"\n\nmsgid \"Second input float\"\nmsgstr \"Secund inpoot fluet\"\n\n#, fuzzy\nmsgid \"Second input mesh.\"\nmsgstr \"Secund inpoot fluet\"\n\nmsgid \"Second point in the swept line segment that defines the output hyperboloid.\"\nmsgstr \"\"\n\nmsgid \"Second segment end X position\"\nmsgstr \"Secund segment ind X puseeshun\"\n\nmsgid \"Second segment end Y position\"\nmsgstr \"Secund segment ind Y puseeshun\"\n\nmsgid \"Second segment end Z position\"\nmsgstr \"Secund segment ind Z puseeshun\"\n\n#, fuzzy\nmsgid \"Second.\"\nmsgstr \"Send\"\n\nmsgid \"Segment color\"\nmsgstr \"Segment culur\"\n\nmsgid \"Segment number\"\nmsgstr \"Segment noomber\"\n\n#, fuzzy\nmsgid \"Segment number between original and new faces.\"\nmsgstr \"Segment noomber betveee ooreeginel und noo feces\"\n\nmsgid \"Segment radius\"\nmsgstr \"Segment redeeoos\"\n\nmsgid \"Segments\"\nmsgstr \"Segments\"\n\nmsgid \"Segments per knot interval. The more segments the better the result\"\nmsgstr \"\"\n\nmsgid \"Select\"\nmsgstr \"Select\"\n\nmsgid \"Select %1%\"\nmsgstr \"Select %1%\"\n\n#, fuzzy\nmsgid \"Select Adjacent Edges\"\nmsgstr \"Select Leenes\"\n\nmsgid \"Select All\"\nmsgstr \"Select Ell\"\n\n#, fuzzy\nmsgid \"Select Curves\"\nmsgstr \"Delete-a nudes\"\n\n#, fuzzy\nmsgid \"Select Edges\"\nmsgstr \"Select Nudes\"\n\nmsgid \"Select Faces\"\nmsgstr \"Select Feces\"\n\nmsgid \"Select Invert\"\nmsgstr \"Select Infert\"\n\nmsgid \"Select Lines\"\nmsgstr \"Select Leenes\"\n\n#, fuzzy\nmsgid \"Select New Faces\"\nmsgstr \"Select Feces\"\n\nmsgid \"Select Nodes\"\nmsgstr \"Select Nudes\"\n\nmsgid \"Select None\"\nmsgstr \"Select Nune-a\"\n\n#, fuzzy\nmsgid \"Select Patches\"\nmsgstr \"Select Feces\"\n\nmsgid \"Select Points\"\nmsgstr \"Select Pueents\"\n\n#, fuzzy\nmsgid \"Select Polygon Edges\"\nmsgstr \"Select Nudes\"\n\n#, fuzzy\nmsgid \"Select Polygon Faces\"\nmsgstr \"Select Feces\"\n\n#, fuzzy\nmsgid \"Select Polygons\"\nmsgstr \"Select Pueents\"\n\n#, fuzzy\nmsgid \"Select Split Edges\"\nmsgstr \"Select Leenes\"\n\n#, fuzzy\nmsgid \"Select Surface\"\nmsgstr \"Select Feces\"\n\n#, fuzzy\nmsgid \"Select Uniform\"\nmsgstr \"Select nudes\"\n\n#, fuzzy\nmsgid \"Select Vertices\"\nmsgstr \"Select Feces\"\n\nmsgid \"Select all components that are directly or indirectly connected to the selected component\"\nmsgstr \"\"\n\nmsgid \"Select backfacing components when painting a selection\"\nmsgstr \"\"\n\nmsgid \"Select backfacing components when picking (clicking)\"\nmsgstr \"\"\n\nmsgid \"Select backfacing components when rubber band selecting\"\nmsgstr \"\"\n\nmsgid \"Select child\"\nmsgstr \"Select cheeld\"\n\n#, fuzzy\nmsgid \"Select connected edges\"\nmsgstr \"Select Nudes\"\n\n#, fuzzy\nmsgid \"Select connected faces\"\nmsgstr \"Select seede-a feces\"\n\n#, fuzzy\nmsgid \"Select connected points\"\nmsgstr \"Selected pueents\"\n\n#, fuzzy\nmsgid \"Select connected vertices\"\nmsgstr \"Select Infert\"\n\n#, fuzzy\nmsgid \"Select newly-created faces.\"\nmsgstr \"Select seede-a feces\"\n\nmsgid \"Select parent\"\nmsgstr \"Select perent\"\n\nmsgid \"Select sibling\"\nmsgstr \"Select seebling\"\n\nmsgid \"Select side faces\"\nmsgstr \"Select seede-a feces\"\n\nmsgid \"Select side faces on output, doesn't change selection if off\"\nmsgstr \"Select seede-a feces oon ooootpoot, duesn't chunge-a selecshun iff ooffff\"\n\nmsgid \"Select the documents you want to save:\"\nmsgstr \"Select zee ducooments yuoo vunt tu sefe-a:\"\n\n#, fuzzy\nmsgid \"Selected\"\nmsgstr \"Select\"\n\nmsgid \"Selected Color\"\nmsgstr \"Selected Culur\"\n\n#, fuzzy\nmsgid \"Selected Component Color\"\nmsgstr \"Selected Culur\"\n\n#, fuzzy\nmsgid \"Selected Mesh Color\"\nmsgstr \"Selected Culur\"\n\n#, fuzzy\nmsgid \"Selection Options\"\nmsgstr \"Selecshun Type-a\"\n\nmsgid \"Selection Type\"\nmsgstr \"Selecshun Type-a\"\n\n#, fuzzy\nmsgid \"Selection Weights\"\nmsgstr \"Selecshun Veeeght\"\n\nmsgid \"Selection operator comparing with side number\"\nmsgstr \"Selecshun ooperetur cumpereeng veet seede-a noomber\"\n\n#, fuzzy\nmsgid \"Selection weight for all nodes\"\nmsgstr \"Selecshun Veeeght\"\n\nmsgid \"Selects a NURBS curve from the input mesh by its index number\"\nmsgstr \"Selects a NOoRBS coorfe-a frum zee inpoot mesh by its index noomber\"\n\nmsgid \"Selects a NURBS patch from the input mesh by its index number\"\nmsgstr \"Selects a NOoRBS petch frum zee inpoot mesh by its index noomber\"\n\nmsgid \"Selects a bicubic patch from the input mesh by its index number\"\nmsgstr \"Selects a beecoobic petch frum zee inpoot mesh by its index noomber\"\n\nmsgid \"Selects a bilinear patch from the input mesh by its index number\"\nmsgstr \"Selects a beelineer petch frum zee inpoot mesh by its index noomber\"\n\n#, fuzzy\nmsgid \"Selects a cubic curve from based on its index number.\"\nmsgstr \"Selects a coobeec coorfe-a frum zee inpoot mesh by its index noomber\"\n\nmsgid \"Selects a face from the input mesh by its index number\"\nmsgstr \"Selects a fece-a frum zee inpoot mesh by its index noomber\"\n\nmsgid \"Selects a linear curve from the input mesh by its index number\"\nmsgstr \"Selects a leeneer coorfe-a frum zee inpoot mesh by its index noomber\"\n\nmsgid \"Selects all faces with a zero-length normal\"\nmsgstr \"\"\n\nmsgid \"Selects an edge from the input mesh by its index number\"\nmsgstr \"Selects un idge-a frum zee inpoot mesh by its index noomber\"\n\nmsgid \"Selects edge loops containing selected edges\"\nmsgstr \"Selects idge-a luups cunteeening selected igdes\"\n\nmsgid \"Selects edge rings containing selected edges\"\nmsgstr \"Selects idge-a reengs cunteeening selected igdes\"\n\nmsgid \"Selects edges that are on the boundary of the mesh\"\nmsgstr \"\"\n\nmsgid \"Selects points or faces that have numbers of sides within a specified range\"\nmsgstr \"Selects pueents oor feces thet hefe-a noombers ooff seedes veethin a speceeffied runge-a\"\n\nmsgid \"Selects portions of the input mesh that intersect a cube\"\nmsgstr \"Selects purshuns ooff zee inpoot mesh thet intersect a coobe-a\"\n\n#, fuzzy\nmsgid \"Selects the points belonging to selected faces\"\nmsgstr \"Selects idge-a reengs cunteeening selected igdes\"\n\nmsgid \"Sends a stream of ATK user interface events to stderr, primarily intended for troubleshooting\"\nmsgstr \"\"\n\nmsgid \"Sends a stream of SpaceNavigator events to stderr, intended mainly for debugging.\"\nmsgstr \"\"\n\nmsgid \"Set Animation Engine ...\"\nmsgstr \"Set Uneemeshun Ingeene-a ...\"\n\nmsgid \"Set Camera ...\"\nmsgstr \"Set Cemera ...\"\n\nmsgid \"Set Camera Crop Window\"\nmsgstr \"Set Cemera Crup Veendoo\"\n\nmsgid \"Set OpenGL Engine ...\"\nmsgstr \"Set OopenGL Ingeene-a ...\"\n\nmsgid \"Set Parent\"\nmsgstr \"Set Perent\"\n\nmsgid \"Set Preview Engine ...\"\nmsgstr \"Set Prefeeoo Ingeene-a ...\"\n\nmsgid \"Set Still Engine ...\"\nmsgstr \"Set Steell Ingeene-a ...\"\n\nmsgid \"Set _Camera ...\"\nmsgstr \"Set _Cemera ...\"\n\nmsgid \"Set alpha channel using color difference\"\nmsgstr \"Set elpha chunnel useeng culur deefffference-a\"\n\n#, fuzzy\nmsgid \"Set points positions\"\nmsgstr \"Mexeemoom pueent puseeshun\"\n\n#, fuzzy\nmsgid \"Set position on X components\"\nmsgstr \"Edd nueese-a oon X cumpunents\"\n\n#, fuzzy\nmsgid \"Set position on Y components\"\nmsgstr \"Edd nueese-a oon Y cumpunents\"\n\n#, fuzzy\nmsgid \"Set position on Z components\"\nmsgstr \"Edd nueese-a oon Z cumpunents\"\n\nmsgid \"Set view\"\nmsgstr \"Set feeoo\"\n\n#, fuzzy\nmsgid \"Sets geometry color\"\nmsgstr \"Segment culur\"\n\nmsgid \"Sets geometry materials\"\nmsgstr \"Sets geumetry metereeels\"\n\nmsgid \"Sets selection mode (nodes, faces, edges, points, etc)\"\nmsgstr \"Sets selecshun mude-a (nudes, feces, idges, pueents, itc)\"\n\n#, fuzzy\nmsgid \"Sets the point positions at the given indices\"\nmsgstr \"Tveeks selected pueents useeng zee geefee metreex\"\n\nmsgid \"Sets the weight of the selected Control Points\"\nmsgstr \"\"\n\nmsgid \"Shader\"\nmsgstr \"Sheder\"\n\nmsgid \"Shader Path\"\nmsgstr \"Sheder Pet\"\n\nmsgid \"Shading Interpolation\"\nmsgstr \"Shedeeng Interpuleshun\"\n\nmsgid \"Shading Rate\"\nmsgstr \"Shedeeng Rete-a\"\n\nmsgid \"Shadow\"\nmsgstr \"Shedoo\"\n\nmsgid \"Shadow Map Camera\"\nmsgstr \"Shedoo Mep Cemera\"\n\n#, fuzzy\nmsgid \"Shadow samples.\"\nmsgstr \"Semples\"\n\nmsgid \"Shadowmap bias\"\nmsgstr \"Shedoomep beees\"\n\nmsgid \"Shadowmap resolution\"\nmsgstr \"Shedoomep resulooshun\"\n\nmsgid \"Sharpness\"\nmsgstr \"Sherpness\"\n\nmsgid \"Shear axis\"\nmsgstr \"Sheer exees\"\n\nmsgid \"Shear direction\"\nmsgstr \"Sheer durecshun\"\n\nmsgid \"Shear factor\"\nmsgstr \"Sheer fectur\"\n\nmsgid \"Shears mesh points along an axis\"\nmsgstr \"Sheers mesh pueents elung un exees\"\n\nmsgid \"Shift the capped curve U range by this amount, useful to rotate the UV-system on the cap\"\nmsgstr \"\"\n\nmsgid \"Show All\"\nmsgstr \"Shoo Ell\"\n\nmsgid \"Show Component Selection\"\nmsgstr \"Shoo Cumpunent Selecshun\"\n\nmsgid \"Show Connected\"\nmsgstr \"Shoo Cunnected\"\n\nmsgid \"Show Lights\"\nmsgstr \"Shoo Leeghts\"\n\nmsgid \"Show Projection\"\nmsgstr \"Shoo Prujecshun\"\n\n#, fuzzy\nmsgid \"Show Property Labels\"\nmsgstr \"Nude-a Pruperteees\"\n\n#, fuzzy\nmsgid \"Show Property Loops\"\nmsgstr \"Shoo Prujecshun\"\n\nmsgid \"Show Reference Plane\"\nmsgstr \"Shoo Refference-a Plune-a\"\n\nmsgid \"Show SDS Surfaces\"\nmsgstr \"Shoo SDS Soorffeces\"\n\nmsgid \"Show Selection\"\nmsgstr \"Shoo Selecshun\"\n\nmsgid \"Show _All\"\nmsgstr \"Shoo _Ell\"\n\nmsgid \"Show all\"\nmsgstr \"Shoo ell\"\n\nmsgid \"Show component selection\"\nmsgstr \"Shoo cumpunent selecshun\"\n\n#, fuzzy\nmsgid \"Show examples at startup\"\nmsgstr \"Shoo tootureeels et stertoop\"\n\nmsgid \"Show lights (on/off)\"\nmsgstr \"Shoo leeghts (oon/ooffff)\"\n\nmsgid \"Show selection\"\nmsgstr \"Shoo selecshun\"\n\nmsgid \"Show viewing projection\"\nmsgstr \"Shoo feeooing prujecshun\"\n\nmsgid \"Shows/hides manipulators\"\nmsgstr \"Shoos/heedes muneepooleturs\"\n\nmsgid \"Side number\"\nmsgstr \"Seede-a noomber\"\n\nmsgid \"Sides\"\nmsgstr \"Seedes\"\n\n#, fuzzy\nmsgid \"Sigma\"\nmsgstr \"gemma\"\n\n#, fuzzy\nmsgid \"Sigma Texture\"\nmsgstr \"Textoore-a U\"\n\n#, fuzzy\nmsgid \"Simulation\"\nmsgstr \"_Uneemeshun\"\n\n#, fuzzy\nmsgid \"Sine wave function applied to input.\"\nmsgstr \"Seene-a vefe-a fooncshun eppleeed oon inpoot\"\n\nmsgid \"Size\"\nmsgstr \"Seeze-a\"\n\n#, fuzzy\nmsgid \"Size for the arrow\"\nmsgstr \"Selected pueents\"\n\n#, fuzzy\nmsgid \"Size for the points\"\nmsgstr \"Selected pueents\"\n\nmsgid \"Size on X axis\"\nmsgstr \"Seeze-a oon X exees\"\n\nmsgid \"Size on Y axis\"\nmsgstr \"Seeze-a oon Y exees\"\n\nmsgid \"Size on Z axis\"\nmsgstr \"Seeze-a oon Z exees\"\n\nmsgid \"Slice number (Z axis)\"\nmsgstr \"Sleece-a noomber (Z exees)\"\n\nmsgid \"Slices\"\nmsgstr \"Sleeces\"\n\nmsgid \"Smoothing\"\nmsgstr \"Smuutheeng\"\n\nmsgid \"Smoothing factor\"\nmsgstr \"Smuutheeng fectur\"\n\nmsgid \"Smooths mesh points by averaging their positions with their neighbors'\"\nmsgstr \"Smuuths mesh pueents by eferegeeng zeeur puseeshuns veet zeeur neeeghburs'\"\n\nmsgid \"Snap\"\nmsgstr \"Snep\"\n\nmsgid \"Snap Distance\"\nmsgstr \"Snep Deestunce-a\"\n\nmsgid \"Snap Orientation\"\nmsgstr \"Snep Ooreeenteshun\"\n\nmsgid \"Snap Source\"\nmsgstr \"Snep Suoorce-a\"\n\nmsgid \"Snap Target\"\nmsgstr \"Snep Terget\"\n\nmsgid \"Snaps one node to another\"\nmsgstr \"Sneps oone-a nude-a tu unuzeer\"\n\nmsgid \"Softness\"\nmsgstr \"Sufftness\"\n\n#, fuzzy\nmsgid \"Solar Position\"\nmsgstr \"X Puseeshun\"\n\n#, fuzzy\nmsgid \"Solar position.\"\nmsgstr \"Vurld puseeshun\"\n\nmsgid \"Source\"\nmsgstr \"Suoorce-a\"\n\nmsgid \"Source Node\"\nmsgstr \"Suoorce-a Nude-a\"\n\n#, fuzzy\nmsgid \"Space between points\"\nmsgstr \"Mexeemoom deestunce-a betveee pueents\"\n\nmsgid \"Specifies how to filter the texture.\"\nmsgstr \"\"\n\nmsgid \"Specifies how to wrap the texture.\"\nmsgstr \"\"\n\nmsgid \"Specifies the array name for the attributes that must match when growing the selection (if Same Attributes is on)\"\nmsgstr \"\"\n\nmsgid \"Specifies the array name to be used for face colors\"\nmsgstr \"\"\n\nmsgid \"Specifies the array to draw\"\nmsgstr \"\"\n\nmsgid \"Specifies which direction will be treated as 'East'.\"\nmsgstr \"\"\n\nmsgid \"Specifies which direction will be treated as 'North'.\"\nmsgstr \"\"\n\nmsgid \"Specifies which direction will be treated as 'up'.\"\nmsgstr \"\"\n\nmsgid \"Specify the GraphViz command to use for rendering.\"\nmsgstr \"\"\n\nmsgid \"Specify the U axis for planar mapping.\"\nmsgstr \"\"\n\nmsgid \"Specify the V axis for planar mapping.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Specify the mathematical operator to merge segments: addition, multiplication, minimum or maximum.\"\nmsgstr \"Eddeeshun, moolteepliceshun, meenimoom oor mexeemoom\"\n\n#, fuzzy\nmsgid \"Spectrum Type\"\nmsgstr \"Selecshun Type-a\"\n\n#, fuzzy\nmsgid \"Spectrum type.\"\nmsgstr \"Ooperetur type-a\"\n\nmsgid \"Specular Color\"\nmsgstr \"Specooler Culur\"\n\n#, fuzzy\nmsgid \"Specular Color 1\"\nmsgstr \"Specooler Culur\"\n\n#, fuzzy\nmsgid \"Specular Color 2\"\nmsgstr \"Specooler Culur\"\n\n#, fuzzy\nmsgid \"Specular Color 3\"\nmsgstr \"Specooler Culur\"\n\n#, fuzzy\nmsgid \"Specular color.\"\nmsgstr \"Specooler Culur\"\n\nmsgid \"Sphere factor\"\nmsgstr \"Sphere-a fectur\"\n\nmsgid \"Sphere radius\"\nmsgstr \"Sphere-a redeeoos\"\n\nmsgid \"Split Curve at u in ]0,1[\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Split Edges\"\nmsgstr \"Sherp idges\"\n\nmsgid \"Split Panel _Horizontally\"\nmsgstr \"Spleet Punel _Hureezuntelly\"\n\nmsgid \"Split Panel _Vertically\"\nmsgstr \"Spleet Punel _Ferteecelly\"\n\nmsgid \"Splits a patch at the selected u/v value\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Start Point\"\nmsgstr \"Select Pueents\"\n\nmsgid \"Start Time\"\nmsgstr \"Stert Teeme-a\"\n\nmsgid \"Starting K-3D ...\"\nmsgstr \"Sterteeng K-3D ...\"\n\nmsgid \"Starting user interface\"\nmsgstr \"Sterteeng user interffece-a\"\n\nmsgid \"Starts CPU profiling using GPerftools\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Stiffness\"\nmsgstr \"Sufftness\"\n\nmsgid \"Stiffness of cloth (k constant for spring structure)\"\nmsgstr \"\"\n\nmsgid \"Stop\"\nmsgstr \"Stup\"\n\nmsgid \"Stop function\"\nmsgstr \"Stup fooncshun\"\n\nmsgid \"Storage Class\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Store Normals\"\nmsgstr \"Nurmel\"\n\nmsgid \"Stores an arbitrary transformation matrix\"\nmsgstr \"Stures un erbeetrery trunsffurmeshun metreex\"\n\n#, fuzzy\nmsgid \"Stores the document node selection state\"\nmsgstr \"Select zee ducooments yuoo vunt tu sefe-a:\"\n\nmsgid \"Stretch the image to fill the camera aspect ratio\"\nmsgstr \"Stretch zee imege-a tu feell zee cemera espect reteeu\"\n\nmsgid \"String source that uses a script to create the output value\"\nmsgstr \"Streeng suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\nmsgid \"Subdivision level\"\nmsgstr \"Soobdeefisiun lefel\"\n\nmsgid \"Subdivision type\"\nmsgstr \"Soobdeefisiun type-a\"\n\nmsgid \"Subdivisions\"\nmsgstr \"Soobdeefisiuns\"\n\n#, fuzzy\nmsgid \"Subtract two double inputs and produce their difference as output\"\nmsgstr \"Soobtrect tvu sceler inpoots und prudooce-a zeeur deefffference-a es ooootpoot\"\n\nmsgid \"Subtract value\"\nmsgstr \"Soobtrect felooe-a\"\n\nmsgid \"Subtract value from each pixel\"\nmsgstr \"Soobtrect felooe-a frum iech peexel\"\n\n#, fuzzy\nmsgid \"Subtract value from each pixel color component using the CUDA API\"\nmsgstr \"Soobtrect felooe-a tu iech peexel culur cumpunent\"\n\nmsgid \"Subtract value to each pixel color component\"\nmsgstr \"Soobtrect felooe-a tu iech peexel culur cumpunent\"\n\n#, fuzzy\nmsgid \"Sum of inputs.\"\nmsgstr \"Soom ooff inpoots\"\n\nmsgid \"Surface Material\"\nmsgstr \"Soorffece-a Metereeel\"\n\nmsgid \"Surface Shader\"\nmsgstr \"Soorffece-a Sheder\"\n\nmsgid \"Surface material\"\nmsgstr \"Soorffece-a metereeel\"\n\nmsgid \"Surface reflectivity.\"\nmsgstr \"\"\n\nmsgid \"Surface roughness along the u direction.\"\nmsgstr \"\"\n\nmsgid \"Surface roughness along the v direction.\"\nmsgstr \"\"\n\nmsgid \"Surface shader\"\nmsgstr \"Soorffece-a sheder\"\n\n#, fuzzy\nmsgid \"Sweep Angle\"\nmsgstr \"Ungle-a\"\n\nmsgid \"T Wrap\"\nmsgstr \"T Vrep\"\n\nmsgid \"TIFF (*.tiff)\"\nmsgstr \"TIFF (*.teeffff)\"\n\nmsgid \"TIFF Image (*.tiff)\"\nmsgstr \"TIFF Imege-a (*.teeffff)\"\n\nmsgid \"Take a NURBS curve and rotate it around one of the coordinate system axis\"\nmsgstr \"\"\n\nmsgid \"Takes a curve of degree p and turns it into a curve with degree p+degree\"\nmsgstr \"\"\n\nmsgid \"Taper Factor\"\nmsgstr \"Teper Fectur\"\n\nmsgid \"Taper points along this axis.\"\nmsgstr \"Teper pueents elung thees exees.\"\n\nmsgid \"Tapers mesh points along an axis\"\nmsgstr \"Tepers mesh pueents elung un exees\"\n\nmsgid \"Targa Image (*.tga)\"\nmsgstr \"Terga Imege-a (*.tga)\"\n\nmsgid \"Target\"\nmsgstr \"Terget\"\n\nmsgid \"Target Node\"\nmsgstr \"Terget Nude-a\"\n\nmsgid \"Target distance\"\nmsgstr \"Terget deestunce-a\"\n\nmsgid \"Target distance from camera position\"\nmsgstr \"Terget deestunce-a frum cemera puseeshun\"\n\nmsgid \"Target matrix\"\nmsgstr \"Terget metreex\"\n\nmsgid \"Task\"\nmsgstr \"Tesk\"\n\nmsgid \"Tests to see that every every primitive and mesh in a collection of meshes can be validated.\"\nmsgstr \"\"\n\nmsgid \"Text\"\nmsgstr \"Text\"\n\nmsgid \"Texture File\"\nmsgstr \"Textoore-a Feele-a\"\n\nmsgid \"Texture Memory\"\nmsgstr \"Textoore-a Memury\"\n\nmsgid \"The color of the light.\"\nmsgstr \"\"\n\nmsgid \"The count of perceivably-different pixels\"\nmsgstr \"Zee cuoont ooff perceeefebly-deefffferent peexels\"\n\nmsgid \"The current degree will be increased by the amount you specified here\"\nmsgstr \"\"\n\nmsgid \"The curve degree gets elevated by the amount you specify here\"\nmsgstr \"\"\n\nmsgid \"The curve will be rotated to this angle, specify 360 for a closed shape\"\nmsgstr \"\"\n\nmsgid \"The degree which will be added to the curve\"\nmsgstr \"\"\n\nmsgid \"The horizontal size in pixels of the rendered output image.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"The new weight for the selected points\"\nmsgstr \"Chunges zee furst idge-a fur selected pulyguns\"\n\n#, fuzzy\nmsgid \"The number of samples per span\"\nmsgstr \"Noomber ooff mesh cupeees\"\n\nmsgid \"The requested RenderMan implementation could not be found.  Check to ensure that you have it installed and your PATH is up-to-date.\"\nmsgstr \"\"\n\nmsgid \"The sigma parameter in the Oren-Nayer shader in degrees.  Zero for pure Lambertian reflection.\"\nmsgstr \"\"\n\nmsgid \"The size of each grid square\"\nmsgstr \"Zee seeze-a ooff iech greed sqooere-a\"\n\nmsgid \"The smaller the faster, the higher the better (anti-aliasing)\"\nmsgstr \"Zee smeller zee fester, zee heegher zee better (untee-eleeesing)\"\n\nmsgid \"The vertical size in pixels of the rendered output image.\"\nmsgstr \"\"\n\nmsgid \"There are %1% documents with unsaved changes. Save changes before closing?\"\nmsgstr \"Zeere-a ere-a %1% ducooments veet unsefed chunges. Sefe-a chunges beffure-a cluseeng?\"\n\nmsgid \"Theta Maximum\"\nmsgstr \"Zeeta Mexeemoom\"\n\nmsgid \"Theta max\"\nmsgstr \"Zeeta mex\"\n\nmsgid \"Thickness\"\nmsgstr \"Theeckness\"\n\nmsgid \"Thin film coating thickness (nanometers).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Threshold\"\nmsgstr \"EA_threshuld\"\n\nmsgid \"Threshold Value\"\nmsgstr \"Threshuld Felooe-a\"\n\nmsgid \"Tightness\"\nmsgstr \"Teeghtness\"\n\nmsgid \"Time\"\nmsgstr \"Teeme-a\"\n\n#, fuzzy\nmsgid \"Time Zone Offset\"\nmsgstr \"Z Ooffffset\"\n\nmsgid \"Time for the current mouths' values(should be connected to a time source)\"\nmsgstr \"\"\n\nmsgid \"Time for the transition from mouth to mouth\"\nmsgstr \"\"\n\nmsgid \"Time since 1970-1-1, in seconds.\"\nmsgstr \"\"\n\nmsgid \"Time zone offset in minutes, [-720, +720].  Note that you must adjust the timezone manually to account for daylight savings time.\"\nmsgstr \"\"\n\nmsgid \"Timestamp value, or 0 to use current system time\"\nmsgstr \"Teemestemp felooe-a, oor 0 tu use-a coorrent system teeme-a\"\n\n#, fuzzy\nmsgid \"To\"\nmsgstr \"Tup\"\n\nmsgid \"To assign hotkeys, hover the mouse over a menu item, and hit the desired hotkey combination.  Use \\\"delete\\\" to remove hotkeys.  Close this window to turn-off Assign Hotkeys Mode.\"\nmsgstr \"Tu esseegn hutkeys, hufer zee muoose-a oofer a menoo item, und heet zee desured hutkey cumbeeneshun.  Use-a \\\"delete\\\" tu remufe-a hutkeys.  Cluse-a thees veendoo tu toorn-ooffff Esseegn Hutkeys Mude-a.\"\n\n#, fuzzy\nmsgid \"Toggle Selected\"\nmsgstr \"Drev Selected\"\n\n#, fuzzy\nmsgid \"Toggle Selected %1%\"\nmsgstr \"Select %1%\"\n\nmsgid \"Toggle the recording of actions\"\nmsgstr \"\"\n\nmsgid \"Top\"\nmsgstr \"Tup\"\n\nmsgid \"Top segments\"\nmsgstr \"Tup segments\"\n\nmsgid \"Track Viewport\"\nmsgstr \"Treck Feeoopurt\"\n\nmsgid \"Transform\"\nmsgstr \"Trunsffurm\"\n\nmsgid \"Transform Modifier\"\nmsgstr \"Trunsffurm Mudeeffier\"\n\nmsgid \"Transform mesh points using input matrix\"\nmsgstr \"Trunsffurm mesh pueents useeng inpoot metreex\"\n\n#, fuzzy\nmsgid \"Transform mesh points using input matrix using a device mesh\"\nmsgstr \"Trunsffurm mesh pueents useeng inpoot metreex\"\n\nmsgid \"Transformation\"\nmsgstr \"Trunsffurmeshun\"\n\nmsgid \"Transformation matrix\"\nmsgstr \"Trunsffurmeshun metreex\"\n\n#, fuzzy\nmsgid \"Transformation matrix used to position / orient / scale the output cone.\"\nmsgstr \"Trunsffurm suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\n#, fuzzy\nmsgid \"Transformation matrix used to position / orient / scale the output cylinder.\"\nmsgstr \"Trunsffurm suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\n#, fuzzy\nmsgid \"Transformation matrix used to position / orient / scale the output disk.\"\nmsgstr \"Trunsffurm suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\n#, fuzzy\nmsgid \"Transformation matrix used to position / orient / scale the output hyperboloid.\"\nmsgstr \"Trunsffurm suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\n#, fuzzy\nmsgid \"Transformation matrix used to position / orient / scale the output paraboloid.\"\nmsgstr \"Trunsffurm suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\n#, fuzzy\nmsgid \"Transformation matrix used to position / orient / scale the output sphere.\"\nmsgstr \"Trunsffurm suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\n#, fuzzy\nmsgid \"Transformation matrix used to position / orient / scale the output teapot.\"\nmsgstr \"Trunsffurm suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\n#, fuzzy\nmsgid \"Transformation matrix used to position / orient / scale the output torus.\"\nmsgstr \"Trunsffurm suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\nmsgid \"TranslateArray1D\"\nmsgstr \"TrunsleteErrey1D\"\n\nmsgid \"TranslateArray2D\"\nmsgstr \"TrunsleteErrey2D\"\n\nmsgid \"TranslateArray3D\"\nmsgstr \"TrunsleteErrey3D\"\n\nmsgid \"Translates mesh points\"\nmsgstr \"Trunsletes mesh pueents\"\n\nmsgid \"Transmitted Color\"\nmsgstr \"Trunsmeetted Culur\"\n\n#, fuzzy\nmsgid \"Transparent Color.\"\nmsgstr \"Trunsmeetted Culur\"\n\nmsgid \"True iff every every input mesh can be validated.\"\nmsgstr \"\"\n\nmsgid \"Turbidity\"\nmsgstr \"\"\n\nmsgid \"Tweaks\"\nmsgstr \"Tveeks\"\n\nmsgid \"Twist angle\"\nmsgstr \"Tveest ungle-a\"\n\nmsgid \"Twist around given axis\"\nmsgstr \"Tveest eruoond geefee exees\"\n\nmsgid \"Twists mesh points along an axis\"\nmsgstr \"Tveests mesh pueents elung un exees\"\n\nmsgid \"Two Sided\"\nmsgstr \"Tvu Seeded\"\n\nmsgid \"Two-Sided\"\nmsgstr \"Tvu-Seeded\"\n\nmsgid \"Type\"\nmsgstr \"Type-a\"\n\nmsgid \"Type of array to use\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"U Axis\"\nmsgstr \"Exees\"\n\n#, fuzzy\nmsgid \"U Delta\"\nmsgstr \"Delete-a\"\n\nmsgid \"U Delta.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"U Offset\"\nmsgstr \"X Ooffffset\"\n\nmsgid \"U Order\"\nmsgstr \"U Oorder\"\n\n#, fuzzy\nmsgid \"U Roughness\"\nmsgstr \"Teeghtness\"\n\nmsgid \"U Roughness Texture\"\nmsgstr \"\"\n\nmsgid \"U Roughness.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"U Samples\"\nmsgstr \"Semples\"\n\n#, fuzzy\nmsgid \"U Scale\"\nmsgstr \"Scele-a\"\n\n#, fuzzy\nmsgid \"U Scale.\"\nmsgstr \"Scele-a\"\n\nmsgid \"U Segments\"\nmsgstr \"U Segments\"\n\n#, fuzzy\nmsgid \"U Size\"\nmsgstr \"X Seeze-a\"\n\nmsgid \"U position offset on the surface\"\nmsgstr \"\"\n\nmsgid \"U power\"\nmsgstr \"U pooer\"\n\nmsgid \"U segments\"\nmsgstr \"U segments\"\n\nmsgid \"U value (in [0,1])\"\nmsgstr \"\"\n\nmsgid \"U_ndecorate Selected Panel\"\nmsgstr \"U_ndecurete-a Selected Punel\"\n\nmsgid \"Unattached\"\nmsgstr \"Unetteched\"\n\nmsgid \"Undo %1%\"\nmsgstr \"Undu %1%\"\n\nmsgid \"Undo All\"\nmsgstr \"Undu Ell\"\n\nmsgid \"Undo all %1%\"\nmsgstr \"Undu ell %1%\"\n\n#, fuzzy\nmsgid \"Uniform\"\nmsgstr \"Uneeun\"\n\nmsgid \"Union\"\nmsgstr \"Uneeun\"\n\nmsgid \"Unknown object type\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Unknown script language\"\nmsgstr \"Screept Lungooege-a\"\n\nmsgid \"Unparent\"\nmsgstr \"Unperent\"\n\nmsgid \"Unparent selected\"\nmsgstr \"Unperent selected\"\n\nmsgid \"Unselected Color\"\nmsgstr \"Unselected Culur\"\n\n#, fuzzy\nmsgid \"Unselected Mesh Color\"\nmsgstr \"Unselected Culur\"\n\n#, fuzzy\nmsgid \"Untitled\"\nmsgstr \"Unteetled Screept\"\n\nmsgid \"Untitled Document %1%\"\nmsgstr \"Unteetled Ducooment %1%\"\n\nmsgid \"Up\"\nmsgstr \"\"\n\nmsgid \"Up Position\"\nmsgstr \"Up Puseeshun\"\n\n#, fuzzy\nmsgid \"Use Deprecated Plugin?\"\nmsgstr \"Chuuse-a ixpurt ploogeen:\"\n\nmsgid \"Use Experimental Plugin?\"\nmsgstr \"\"\n\nmsgid \"Use QMC\"\nmsgstr \"Use-a QMC\"\n\nmsgid \"Use X\"\nmsgstr \"Use-a X\"\n\nmsgid \"Use Y\"\nmsgstr \"Use-a Y\"\n\nmsgid \"Use Z\"\nmsgstr \"Use-a Z\"\n\nmsgid \"Use a Coons surface to fill the curve if true, use a trimmed bilinear patch otherwise\"\nmsgstr \"\"\n\nmsgid \"Use boundary preservation planes with given weight\"\nmsgstr \"Use-a buoondery preserfeshun plunes veet geefee veeeght\"\n\nmsgid \"Use distance instead of edge offset\"\nmsgstr \"Use-a deestunce-a insteed ooff idge-a ooffffset\"\n\nmsgid \"Use mouse pointer to paint-select geometry components\"\nmsgstr \"Use-a muoose-a pueenter tu peeent-select geumetry cumpunents\"\n\nmsgid \"Used for editing of UV coordinates\"\nmsgstr \"\"\n\nmsgid \"Used to do linear interpolation between Material 1 and Material 2.\"\nmsgstr \"\"\n\nmsgid \"Used to test OpenGL development.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"User Properties\"\nmsgstr \"Nude-a Pruperteees\"\n\n#, fuzzy\nmsgid \"Uses a script to generate an output k3d::int32_t value.\"\nmsgstr \"Lung suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\nmsgid \"Uses a script to render meshes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"V Axis\"\nmsgstr \"Exees\"\n\n#, fuzzy\nmsgid \"V Delta\"\nmsgstr \"Delete-a\"\n\nmsgid \"V Delta.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"V Offset\"\nmsgstr \"X Ooffffset\"\n\nmsgid \"V Order\"\nmsgstr \"F Oorder\"\n\n#, fuzzy\nmsgid \"V Roughness\"\nmsgstr \"Teeghtness\"\n\nmsgid \"V Roughness Texture\"\nmsgstr \"\"\n\nmsgid \"V Roughness.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"V Samples\"\nmsgstr \"Semples\"\n\n#, fuzzy\nmsgid \"V Scale\"\nmsgstr \"Scele-a\"\n\n#, fuzzy\nmsgid \"V Scale.\"\nmsgstr \"Scele-a\"\n\nmsgid \"V Segments\"\nmsgstr \"F Segments\"\n\n#, fuzzy\nmsgid \"V Size\"\nmsgstr \"X Seeze-a\"\n\nmsgid \"V position offset on the surface\"\nmsgstr \"\"\n\nmsgid \"V power\"\nmsgstr \"F pooer\"\n\nmsgid \"V segments\"\nmsgstr \"F segments\"\n\nmsgid \"V00\"\nmsgstr \"\"\n\nmsgid \"V01\"\nmsgstr \"\"\n\nmsgid \"V10\"\nmsgstr \"\"\n\nmsgid \"V11\"\nmsgstr \"\"\n\nmsgid \"Valid\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Value\"\nmsgstr \"Felooe-a\"\n\nmsgid \"Value, associated with selected items\"\nmsgstr \"\"\n\nmsgid \"Vector pointing to the sun.\"\nmsgstr \"\"\n\nmsgid \"Vector3 source that uses a script to create the output value\"\nmsgstr \"Fectur3 suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\n#, fuzzy\nmsgid \"Vertex Array Name\"\nmsgstr \"Fertex Sheder\"\n\n#, fuzzy\nmsgid \"Vertex Normals\"\nmsgstr \"Nurmel\"\n\nmsgid \"Vertex Shader\"\nmsgstr \"Fertex Sheder\"\n\nmsgid \"Vertex output array name.\"\nmsgstr \"\"\n\nmsgid \"Vertex shader source code\"\nmsgstr \"Fertex sheder suoorce-a cude-a\"\n\nmsgid \"Vertices\"\nmsgstr \"Ferteeces\"\n\nmsgid \"View shadow map creation during rendering\"\nmsgstr \"Feeoo shedoo mep creeshun dooreeng rendereeng\"\n\nmsgid \"Viewport\"\nmsgstr \"Feeoopurt\"\n\nmsgid \"Viewport A_nimation\"\nmsgstr \"Feeoopurt A_neemeshun\"\n\nmsgid \"Viewport Visible\"\nmsgstr \"Feeoopurt Feesible-a\"\n\nmsgid \"Visibility bounding box\"\nmsgstr \"Feesibility buoondeeng bux\"\n\n#, fuzzy\nmsgid \"Visible Nodes\"\nmsgstr \"Select Nudes\"\n\nmsgid \"Visible manipulators\"\nmsgstr \"Feesible-a muneepooleturs\"\n\nmsgid \"Visualizes normal-vector arrays\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Volume\"\nmsgstr \"Felooe-a\"\n\nmsgid \"Warns users that the Compiz window manager may interfere with OpenGL rendering in K-3D\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"Watch\"\nmsgstr \"Veedt\"\n\nmsgid \"Watch/unwatch file for changes\"\nmsgstr \"\"\n\nmsgid \"Wave amplitude\"\nmsgstr \"Vefe-a empleetoode-a\"\n\nmsgid \"Wave phase\"\nmsgstr \"Vefe-a phese-a\"\n\nmsgid \"Wave points along given axis\"\nmsgstr \"Vefe-a pueents elung geefee exees\"\n\nmsgid \"Wavelength\"\nmsgstr \"Vefelengt\"\n\n#, fuzzy\nmsgid \"Weight\"\nmsgstr \"Heeeght\"\n\n#, fuzzy\nmsgid \"Welcome to K-3D Version 0.8!\"\nmsgstr \"Velcume-a tu K-3D!\"\n\nmsgid \"Welcomes users running K-3D for the first time.\"\nmsgstr \"\"\n\nmsgid \"When grouping neighboring faces together, use the same (averaged) normal vector for every face in the group.\"\nmsgstr \"\"\n\nmsgid \"When on, plays animation\"\nmsgstr \"Vhee oon, pleys uneemeshun\"\n\nmsgid \"When selecting edges, automatically expand the selection to include adjacent edges.\"\nmsgstr \"\"\n\nmsgid \"Width\"\nmsgstr \"Veedt\"\n\nmsgid \"Window layout reset.  The default layout will be used the next time you open a document.\"\nmsgstr \"Veendoo leyuoot reset.  Zee deffoolt leyuoot veell be-a used zee next teeme-a yuoo oopee a ducooment.\"\n\nmsgid \"Window layout saved.  Your custom layout will be used whenever you open a document.\"\nmsgstr \"Veendoo leyuoot sefed.  Yuoor coostum leyuoot veell be-a used vhenefer yuoo oopee a ducooment.\"\n\nmsgid \"Works with 'Hide Unpinned Panels' action\"\nmsgstr \"Vurks veet 'Heede-a Unpeenned Punels' ecshun\"\n\nmsgid \"World position\"\nmsgstr \"Vurld puseeshun\"\n\nmsgid \"World target\"\nmsgstr \"Vurld terget\"\n\n#, fuzzy\nmsgid \"Wrap\"\nmsgstr \"S Vrep\"\n\nmsgid \"X\"\nmsgstr \"X\"\n\nmsgid \"X Amplitude\"\nmsgstr \"X Empleetoode-a\"\n\nmsgid \"X Color\"\nmsgstr \"X Culur\"\n\nmsgid \"X Frequency\"\nmsgstr \"X Freqooency\"\n\n#, fuzzy\nmsgid \"X Function\"\nmsgstr \"Cust fooncshun\"\n\nmsgid \"X Offset\"\nmsgstr \"X Ooffffset\"\n\nmsgid \"X Phase\"\nmsgstr \"X Phese-a\"\n\nmsgid \"X Position\"\nmsgstr \"X Puseeshun\"\n\nmsgid \"X Size\"\nmsgstr \"X Seeze-a\"\n\nmsgid \"X amplitude\"\nmsgstr \"X empleetoode-a\"\n\nmsgid \"X axis color\"\nmsgstr \"X exees culur\"\n\nmsgid \"X coordinate of cube's max corner\"\nmsgstr \"X cuurdeenete-a ooff coobe's mex curner\"\n\nmsgid \"X coordinate of cube's min corner\"\nmsgstr \"X cuurdeenete-a ooff coobe's meen curner\"\n\nmsgid \"X frequency\"\nmsgstr \"X freqooency\"\n\nmsgid \"X offset\"\nmsgstr \"X ooffffset\"\n\nmsgid \"X phase\"\nmsgstr \"X phese-a\"\n\n#, fuzzy\nmsgid \"X position\"\nmsgstr \"X Puseeshun\"\n\nmsgid \"X rotation angle\"\nmsgstr \"X ruteshun ungle-a\"\n\nmsgid \"X scale\"\nmsgstr \"X scele-a\"\n\nmsgid \"X scaling\"\nmsgstr \"X sceleeng\"\n\nmsgid \"X translation\"\nmsgstr \"X trunsleshun\"\n\n#, fuzzy\nmsgid \"X-Offset\"\nmsgstr \"X Ooffffset\"\n\nmsgid \"X1\"\nmsgstr \"X1\"\n\nmsgid \"X1 Position\"\nmsgstr \"X1 Puseeshun\"\n\nmsgid \"X2\"\nmsgstr \"X2\"\n\nmsgid \"X2 Position\"\nmsgstr \"X2 Puseeshun\"\n\nmsgid \"XTrackCAD Tracks File ( .xtc )\"\nmsgstr \"\"\n\nmsgid \"XY Plane\"\nmsgstr \"XY Plune-a\"\n\nmsgid \"XZ Plane\"\nmsgstr \"XZ Plune-a\"\n\nmsgid \"Y\"\nmsgstr \"Y\"\n\nmsgid \"Y Amplitude\"\nmsgstr \"Y Empleetoode-a\"\n\nmsgid \"Y Color\"\nmsgstr \"Y Culur\"\n\nmsgid \"Y Frequency\"\nmsgstr \"Y Freqooency\"\n\n#, fuzzy\nmsgid \"Y Function\"\nmsgstr \"Cust fooncshun\"\n\nmsgid \"Y Offset\"\nmsgstr \"Y Ooffffset\"\n\nmsgid \"Y Phase\"\nmsgstr \"Y Phese-a\"\n\nmsgid \"Y Position\"\nmsgstr \"Y Puseeshun\"\n\nmsgid \"Y Size\"\nmsgstr \"Y Seeze-a\"\n\nmsgid \"Y amplitude\"\nmsgstr \"Y empleetoode-a\"\n\nmsgid \"Y axis color\"\nmsgstr \"Y exees culur\"\n\nmsgid \"Y coordinate of cube's max corner\"\nmsgstr \"Y cuurdeenete-a ooff coobe's mex curner\"\n\nmsgid \"Y coordinate of cube's min corner\"\nmsgstr \"Y cuurdeenete-a ooff coobe's meen curner\"\n\nmsgid \"Y frequency\"\nmsgstr \"Y freqooency\"\n\nmsgid \"Y offset\"\nmsgstr \"Y ooffffset\"\n\nmsgid \"Y phase\"\nmsgstr \"Y phese-a\"\n\n#, fuzzy\nmsgid \"Y position\"\nmsgstr \"Y Puseeshun\"\n\nmsgid \"Y rotation angle\"\nmsgstr \"Y ruteshun ungle-a\"\n\nmsgid \"Y scale\"\nmsgstr \"Y scele-a\"\n\nmsgid \"Y scaling\"\nmsgstr \"Y sceleeng\"\n\nmsgid \"Y translation\"\nmsgstr \"Y trunsleshun\"\n\n#, fuzzy\nmsgid \"Y-Offset\"\nmsgstr \"Y Ooffffset\"\n\nmsgid \"Y1\"\nmsgstr \"Y1\"\n\nmsgid \"Y1 Position\"\nmsgstr \"Y1 Puseeshun\"\n\nmsgid \"Y2\"\nmsgstr \"Y2\"\n\nmsgid \"Y2 Position\"\nmsgstr \"Y2 Puseeshun\"\n\nmsgid \"YZ Plane\"\nmsgstr \"YZ Plune-a\"\n\nmsgid \"Yafray Area Light\"\nmsgstr \"Yeffrey Erea Leeght\"\n\nmsgid \"Yafray Global Photon Light\"\nmsgstr \"Yeffrey Glubel Phutun Leeght\"\n\nmsgid \"Yafray Hemi Light\"\nmsgstr \"Yeffrey Hemee Leeght\"\n\nmsgid \"Yafray Material\"\nmsgstr \"Yeffrey Metereeel\"\n\nmsgid \"Yafray Photon Light\"\nmsgstr \"Yeffrey Phutun Leeght\"\n\nmsgid \"Yafray Point Light\"\nmsgstr \"Yeffrey Pueent Leeght\"\n\nmsgid \"Yafray Render Engine\"\nmsgstr \"Yeffrey Render Ingeene-a\"\n\nmsgid \"Yafray Soft Light\"\nmsgstr \"Yeffrey Sufft Leeght\"\n\nmsgid \"Yafray Spot Light\"\nmsgstr \"Yeffrey Sput Leeght\"\n\nmsgid \"Yafray Sun Light\"\nmsgstr \"Yeffrey Soon Leeght\"\n\n#, fuzzy\nmsgid \"Year\"\nmsgstr \"Neer\"\n\n#, fuzzy\nmsgid \"Year.\"\nmsgstr \"Neer\"\n\nmsgid \"Yes\"\nmsgstr \"Yes\"\n\nmsgid \"You must choose the specific RenderMan implementation to use with this render engine.\"\nmsgstr \"\"\n\nmsgid \"You must provide a Label to create a property.\"\nmsgstr \"\"\n\nmsgid \"You must provide a Name to create a property.\"\nmsgstr \"\"\n\nmsgid \"You must provide an Attribute Name to create a RenderMan Attribute.\"\nmsgstr \"\"\n\nmsgid \"You must provide an Option Name to create a RenderMan Option.\"\nmsgstr \"\"\n\nmsgid \"Your OpenGL version is %1%.\"\nmsgstr \"\"\n\nmsgid \"Z\"\nmsgstr \"Z\"\n\nmsgid \"Z Amplitude\"\nmsgstr \"Z Empleetoode-a\"\n\nmsgid \"Z Color\"\nmsgstr \"Z Culur\"\n\nmsgid \"Z Frequency\"\nmsgstr \"Z Freqooency\"\n\n#, fuzzy\nmsgid \"Z Function\"\nmsgstr \"Cust fooncshun\"\n\n#, fuzzy\nmsgid \"Z Max\"\nmsgstr \"ZMex\"\n\nmsgid \"Z Max (RenderMan convention)\"\nmsgstr \"Z Mex (RenderMun cunfenshun)\"\n\n#, fuzzy\nmsgid \"Z Min\"\nmsgstr \"ZMeen\"\n\nmsgid \"Z Offset\"\nmsgstr \"Z Ooffffset\"\n\nmsgid \"Z Phase\"\nmsgstr \"Z Phese-a\"\n\nmsgid \"Z Position\"\nmsgstr \"Z Puseeshun\"\n\nmsgid \"Z Size\"\nmsgstr \"Z Seeze-a\"\n\nmsgid \"Z amplitude\"\nmsgstr \"Z empleetoode-a\"\n\nmsgid \"Z axis color\"\nmsgstr \"Z exees culur\"\n\nmsgid \"Z coordinate of cube's max corner\"\nmsgstr \"Z cuurdeenete-a ooff coobe's mex curner\"\n\nmsgid \"Z coordinate of cube's min corner\"\nmsgstr \"Z cuurdeenete-a ooff coobe's meen curner\"\n\nmsgid \"Z frequency\"\nmsgstr \"Z freqooency\"\n\nmsgid \"Z max\"\nmsgstr \"Z mex\"\n\nmsgid \"Z max (RenderMan convention)\"\nmsgstr \"Z mex (RenderMun cunfenshun)\"\n\nmsgid \"Z min\"\nmsgstr \"Z meen\"\n\nmsgid \"Z min (RenderMan convention)\"\nmsgstr \"Z meen (RenderMun cunfenshun)\"\n\nmsgid \"Z offset\"\nmsgstr \"Z ooffffset\"\n\nmsgid \"Z phase\"\nmsgstr \"Z phese-a\"\n\n#, fuzzy\nmsgid \"Z position\"\nmsgstr \"Z Puseeshun\"\n\nmsgid \"Z rotation angle\"\nmsgstr \"Z ruteshun ungle-a\"\n\nmsgid \"Z scale\"\nmsgstr \"Z scele-a\"\n\nmsgid \"Z scaling\"\nmsgstr \"Z sceleeng\"\n\nmsgid \"Z translation\"\nmsgstr \"Z trunsleshun\"\n\n#, fuzzy\nmsgid \"Z-Offset\"\nmsgstr \"Z Ooffffset\"\n\nmsgid \"Z1\"\nmsgstr \"Z1\"\n\nmsgid \"Z1 Position\"\nmsgstr \"Z1 Puseeshun\"\n\nmsgid \"Z2\"\nmsgstr \"Z2\"\n\nmsgid \"Z2 Position\"\nmsgstr \"Z2 Puseeshun\"\n\nmsgid \"ZMax\"\nmsgstr \"ZMex\"\n\nmsgid \"ZMin\"\nmsgstr \"ZMeen\"\n\nmsgid \"Zoom Viewport\"\nmsgstr \"Zuum Feeoopurt\"\n\nmsgid \"_About K-3D ...\"\nmsgstr \"_Ebuoot K-3D ...\"\n\nmsgid \"_Advanced\"\nmsgstr \"\"\n\nmsgid \"_All\"\nmsgstr \"_Ell\"\n\nmsgid \"_Animation\"\nmsgstr \"_Uneemeshun\"\n\nmsgid \"_Child\"\nmsgstr \"_Cheeld\"\n\nmsgid \"_Close\"\nmsgstr \"_Cluse-a\"\n\nmsgid \"_Decorate Selected Panel\"\nmsgstr \"_Decurete-a Selected Punel\"\n\nmsgid \"_Delete\"\nmsgstr \"_Delete-a\"\n\n#, fuzzy\nmsgid \"_Edges\"\nmsgstr \"Nudes\"\n\nmsgid \"_Edit\"\nmsgstr \"_Ideet\"\n\nmsgid \"_Editor ...\"\nmsgstr \"_Ideetur ...\"\n\nmsgid \"_Export ...\"\nmsgstr \"_Ixpurt ...\"\n\nmsgid \"_File\"\nmsgstr \"_Feele-a\"\n\nmsgid \"_Frame\"\nmsgstr \"_Freme-a\"\n\nmsgid \"_Frame Selection\"\nmsgstr \"_Freme-a Selecshun\"\n\nmsgid \"_Fullscreen\"\nmsgstr \"_Foollscreee\"\n\nmsgid \"_Help\"\nmsgstr \"_Help\"\n\nmsgid \"_Hide Selection\"\nmsgstr \"_Heede-a Selecshun\"\n\nmsgid \"_Import ...\"\nmsgstr \"_Impurt ...\"\n\nmsgid \"_Instantiate\"\nmsgstr \"_Instunteeete-a\"\n\nmsgid \"_Invert\"\nmsgstr \"_Infert\"\n\n#, fuzzy\nmsgid \"_K-3D Guide\"\nmsgstr \"K-3D _Oonleene-a\"\n\nmsgid \"_Kill Panel\"\nmsgstr \"_Keell Punel\"\n\nmsgid \"_Layout\"\nmsgstr \"_Leyuoot\"\n\nmsgid \"_Maximize Panel\"\nmsgstr \"_Mexeemize-a Punel\"\n\nmsgid \"_Merge Nodes...\"\nmsgstr \"_Merge-a Nudes...\"\n\nmsgid \"_Move\"\nmsgstr \"_Mufe-a\"\n\nmsgid \"_New\"\nmsgstr \"_Noo\"\n\nmsgid \"_None\"\nmsgstr \"_Nune-a\"\n\nmsgid \"_Open...\"\nmsgstr \"_Oopee...\"\n\nmsgid \"_Orthographic toggle\"\nmsgstr \"_Oorthugrepheec tuggle-a\"\n\nmsgid \"_Parent\"\nmsgstr \"_Perent\"\n\nmsgid \"_Pin All Panels\"\nmsgstr \"_Peen Ell Punels\"\n\nmsgid \"_Play ...\"\nmsgstr \"_Pley ...\"\n\nmsgid \"_Preview\"\nmsgstr \"_Prefeeoo\"\n\nmsgid \"_Quit\"\nmsgstr \"_Qooeet\"\n\nmsgid \"_Redo\"\nmsgstr \"_Redu\"\n\nmsgid \"_Region\"\nmsgstr \"_Regeeun\"\n\n#, fuzzy\nmsgid \"_Release Notes\"\nmsgstr \"Delete-a nudes\"\n\nmsgid \"_Render\"\nmsgstr \"_Render\"\n\nmsgid \"_Reset layout\"\nmsgstr \"_Reset leyuoot\"\n\nmsgid \"_Revert\"\nmsgstr \"_Refert\"\n\nmsgid \"_Rotate\"\nmsgstr \"_Rutete-a\"\n\nmsgid \"_Save\"\nmsgstr \"_Sefe-a\"\n\nmsgid \"_Save layout\"\nmsgstr \"_Sefe-a leyuoot\"\n\nmsgid \"_Scale\"\nmsgstr \"_Scele-a\"\n\nmsgid \"_Select\"\nmsgstr \"_Select\"\n\nmsgid \"_Show Selection\"\nmsgstr \"_Shoo Selecshun\"\n\nmsgid \"_Sibling\"\nmsgstr \"_Seebling\"\n\nmsgid \"_Tools\"\nmsgstr \"_Tuuls\"\n\nmsgid \"_Undo\"\nmsgstr \"_Undu\"\n\n#, fuzzy\nmsgid \"_Uniform\"\nmsgstr \"Uneeun\"\n\nmsgid \"_Unparent\"\nmsgstr \"_Unperent\"\n\nmsgid \"_Unpin All Panels\"\nmsgstr \"_Unpeen Ell Punels\"\n\nmsgid \"_View\"\nmsgstr \"_Feeoo\"\n\nmsgid \"_Viewport Frame\"\nmsgstr \"_Feeoopurt Freme-a\"\n\n#, fuzzy\nmsgid \"align_normal\"\nmsgstr \"Fleep nurmels\"\n\nmsgid \"angle\"\nmsgstr \"ungle-a\"\n\nmsgid \"beam_falloff\"\nmsgstr \"beem_felluffff\"\n\nmsgid \"bias\"\nmsgstr \"beees\"\n\nmsgid \"bounding_box\"\nmsgstr \"buoondeeng_bux\"\n\nmsgid \"cast_shadows\"\nmsgstr \"cest_shedoos\"\n\nmsgid \"caus_IOR\"\nmsgstr \"coos_IOR\"\n\nmsgid \"caus_rcolor\"\nmsgstr \"coos_rculur\"\n\nmsgid \"caus_tcolor\"\nmsgstr \"coos_tculur\"\n\nmsgid \"caustics\"\nmsgstr \"coosteecs\"\n\nmsgid \"cluster\"\nmsgstr \"clooster\"\n\nmsgid \"color\"\nmsgstr \"culur\"\n\nmsgid \"coons\"\nmsgstr \"\"\n\nmsgid \"cos(pi/2)\"\nmsgstr \"\"\n\nmsgid \"cos(sqrt(u^2+v^2))\"\nmsgstr \"\"\n\nmsgid \"count\"\nmsgstr \"cuoont\"\n\nmsgid \"create\"\nmsgstr \"creete-a\"\n\nmsgid \"degree\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"delete_curve\"\nmsgstr \"refflected_culur\"\n\n#, fuzzy\nmsgid \"delete_orig\"\nmsgstr \"refflected_culur\"\n\nmsgid \"delete_original\"\nmsgstr \"\"\n\nmsgid \"depth\"\nmsgstr \"dept\"\n\nmsgid \"distance\"\nmsgstr \"deestunce-a\"\n\nmsgid \"dummy\"\nmsgstr \"doommy\"\n\nmsgid \"emit\"\nmsgstr \"imeet\"\n\nmsgid \"emit_rad\"\nmsgstr \"imeet_red\"\n\nmsgid \"exposure\"\nmsgstr \"ixpusoore-a\"\n\nmsgid \"extract_v_curve\"\nmsgstr \"\"\n\nmsgid \"f-Stop\"\nmsgstr \"f-Stup\"\n\nmsgid \"fast_fresnel\"\nmsgstr \"fest_fresnel\"\n\nmsgid \"file\"\nmsgstr \"feele-a\"\n\nmsgid \"filter\"\nmsgstr \"feelter\"\n\nmsgid \"fixedradius\"\nmsgstr \"feexedredioos\"\n\nmsgid \"flip\"\nmsgstr \"\"\n\nmsgid \"fog_color\"\nmsgstr \"fug_culur\"\n\nmsgid \"fog_density\"\nmsgstr \"fug_denseety\"\n\nmsgid \"gamma\"\nmsgstr \"gemma\"\n\nmsgid \"glow_intensity\"\nmsgstr \"gloo_intenseety\"\n\nmsgid \"glow_offset\"\nmsgstr \"gloo_ooffffset\"\n\nmsgid \"glow_type\"\nmsgstr \"gloo_type-a\"\n\nmsgid \"hardness\"\nmsgstr \"herdness\"\n\nmsgid \"has_orco\"\nmsgstr \"hes_oorcu\"\n\nmsgid \"height\"\nmsgstr \"heeeght\"\n\nmsgid \"index_of_refraction\"\nmsgstr \"index_ooff_reffrecshun\"\n\nmsgid \"insert_to_v\"\nmsgstr \"\"\n\nmsgid \"instance\"\nmsgstr \"instunce-a\"\n\nmsgid \"instance1\"\nmsgstr \"instunce-a1\"\n\nmsgid \"instance2\"\nmsgstr \"instunce-a2\"\n\nmsgid \"majorradius\"\nmsgstr \"mejurredeeoos\"\n\nmsgid \"maxdistance\"\nmsgstr \"mexdeestunce-a\"\n\nmsgid \"mesh_autosmooth\"\nmsgstr \"mesh_ootusmuut\"\n\nmsgid \"mesh_autosmooth_value\"\nmsgstr \"mesh_ootusmuut_felooe-a\"\n\nmsgid \"mindepth\"\nmsgstr \"meendept\"\n\nmsgid \"minimum_reflection\"\nmsgstr \"meenimoom_refflecshun\"\n\nmsgid \"minorradius\"\nmsgstr \"meenurredioos\"\n\nmsgid \"mode\"\nmsgstr \"mude-a\"\n\n#, fuzzy\nmsgid \"multiplicity\"\nmsgstr \"Moolteeplicund\"\n\nmsgid \"nblend\"\nmsgstr \"nblend\"\n\n#, fuzzy\nmsgid \"offset_u\"\nmsgstr \"X ooffffset\"\n\n#, fuzzy\nmsgid \"offset_v\"\nmsgstr \"X ooffffset\"\n\n#, fuzzy\nmsgid \"parameter\"\nmsgstr \"Deeemeter\"\n\nmsgid \"phimax\"\nmsgstr \"pheemex\"\n\nmsgid \"phimin\"\nmsgstr \"pheemin\"\n\nmsgid \"photons\"\nmsgstr \"phutuns\"\n\nmsgid \"pixel_aspect_ratio\"\nmsgstr \"peexel_espect_reteeu\"\n\nmsgid \"pixel_height\"\nmsgstr \"peexel_heeeght\"\n\nmsgid \"pixel_width\"\nmsgstr \"peexel_veedt\"\n\nmsgid \"power\"\nmsgstr \"pooer\"\n\n#, fuzzy\nmsgid \"printf()-style format string.\"\nmsgstr \"strffteeme-a() furmet streeng\"\n\nmsgid \"psamples\"\nmsgstr \"psemples\"\n\nmsgid \"radius\"\nmsgstr \"redeeoos\"\n\nmsgid \"raydepth\"\nmsgstr \"reydept\"\n\nmsgid \"recv_rad\"\nmsgstr \"recf_red\"\n\nmsgid \"reflected_color\"\nmsgstr \"refflected_culur\"\n\nmsgid \"resolution\"\nmsgstr \"resulooshun\"\n\nmsgid \"samples\"\nmsgstr \"semples\"\n\nmsgid \"save_alpha\"\nmsgstr \"sefe-a_elpha\"\n\n#, fuzzy\nmsgid \"scale-V\"\nmsgstr \"X scele-a\"\n\n#, fuzzy\nmsgid \"scale_u\"\nmsgstr \"X scele-a\"\n\nmsgid \"search\"\nmsgstr \"seerch\"\n\n#, fuzzy\nmsgid \"segments\"\nmsgstr \"u_segments\"\n\nmsgid \"shadow\"\nmsgstr \"shedoo\"\n\nmsgid \"size\"\nmsgstr \"seeze-a\"\n\nmsgid \"specular_color\"\nmsgstr \"specooler_culur\"\n\nmsgid \"strftime() output string (read only)\"\nmsgstr \"strffteeme-a() ooootpoot streeng (reed oonly)\"\n\n#, fuzzy\nmsgid \"strftime() time_to_string string\"\nmsgstr \"strffteeme-a() furmet streeng\"\n\nmsgid \"swidth\"\nmsgstr \"sveedt\"\n\nmsgid \"swrap\"\nmsgstr \"svrep\"\n\nmsgid \"thetamax\"\nmsgstr \"zeetemex\"\n\nmsgid \"transmitted_color\"\nmsgstr \"trunsmeetted_culur\"\n\nmsgid \"twidth\"\nmsgstr \"tveedt\"\n\nmsgid \"twrap\"\nmsgstr \"tvrep\"\n\nmsgid \"type\"\nmsgstr \"type-a\"\n\nmsgid \"u,v\"\nmsgstr \"\"\n\nmsgid \"u/v value of new knot\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"u_offset\"\nmsgstr \"X ooffffset\"\n\nmsgid \"u_order\"\nmsgstr \"u_oorder\"\n\n#, fuzzy\nmsgid \"u_samples\"\nmsgstr \"semples\"\n\nmsgid \"u_segments\"\nmsgstr \"u_segments\"\n\n#, fuzzy\nmsgid \"u_value\"\nmsgstr \"Inpoot felooe-a\"\n\nmsgid \"use_QMC\"\nmsgstr \"use-a_QMC\"\n\nmsgid \"v_order\"\nmsgstr \"f_oorder\"\n\n#, fuzzy\nmsgid \"v_samples\"\nmsgstr \"semples\"\n\nmsgid \"v_segments\"\nmsgstr \"f_segments\"\n\nmsgid \"view\"\nmsgstr \"feeoo\"\n\nmsgid \"width\"\nmsgstr \"veedt\"\n\n#, fuzzy\nmsgid \"x\"\nmsgstr \"x1\"\n\nmsgid \"x1\"\nmsgstr \"x1\"\n\nmsgid \"x2\"\nmsgstr \"x2\"\n\n#, fuzzy\nmsgid \"y\"\nmsgstr \"y1\"\n\nmsgid \"y1\"\nmsgstr \"y1\"\n\nmsgid \"y2\"\nmsgstr \"y2\"\n\nmsgid \"z + sin(x)\"\nmsgstr \"\"\n\nmsgid \"z1\"\nmsgstr \"z1\"\n\nmsgid \"z2\"\nmsgstr \"z2\"\n\nmsgid \"zmax\"\nmsgstr \"zmex\"\n\nmsgid \"zmin\"\nmsgstr \"zmeen\"\n\n#~ msgid \" [recording]\"\n#~ msgstr \" [recurdeeng]\"\n\n#~ msgid \"-- Enter a message to be recorded --\"\n#~ msgstr \"-- Inter a messege-a tu be-a recurded --\"\n\n#~ msgid \"3D Studio Max ( .3ds )\"\n#~ msgstr \"3D Stoodeeu Mex ( .3ds )\"\n\n#~ msgid \"<span size=\\\"xx-large\\\" weight=\\\"heavy\\\">Welcome to K-3D Bug Buddy</span>\"\n#~ msgstr \"<span size=\\\"xx-large\\\" weight=\\\"heavy\\\">Velcume-a tu K-3D Boog Booddy</span>\"\n\n#~ msgid \"<span weight=\\\"bold\\\">Required</span> - describe what happened in detail:\"\n#~ msgstr \"<span weight=\\\"bold\\\">Reqooured</span> - descreebe-a vhet heppened in deteeel:\"\n\n#~ msgid \"<span weight=\\\"bold\\\">Required</span> - enter a one-line summary of what happened:\"\n#~ msgstr \"<span weight=\\\"bold\\\">Reqooured</span> - inter a oone-a-leene-a soommery ooff vhet heppened:\"\n\n#~ msgid \"<span weight=\\\"bold\\\">Required</span> - enter your contact <span weight=\\\"bold\\\">e-mail</span> address:\"\n#~ msgstr \"<span weight=\\\"bold\\\">Reqooured</span> - inter yuoor cuntect <span weight=\\\"bold\\\">i-meeel</span> eddress:\"\n\n#, fuzzy\n#~ msgid \"Active Tool\"\n#~ msgstr \"_Kneeffe-a Tuul\"\n\n#~ msgid \"Add a user property to this node\"\n#~ msgstr \"Edd a user pruperty tu thees nude-a\"\n\n#~ msgid \"Add back face when possible\"\n#~ msgstr \"Edd beck fece-a vhee pusseeble-a\"\n\n#~ msgid \"All components are deselected\"\n#~ msgstr \"Ell cumpunents ere-a deselected\"\n\n#~ msgid \"All components are selected\"\n#~ msgstr \"Ell cumpunents ere-a selected\"\n\n#~ msgid \"Ambient Color\"\n#~ msgstr \"Embeeent Culur\"\n\n#~ msgid \"Aqsis Displacement Layer\"\n#~ msgstr \"Eqsees Deesplecement Leyer\"\n\n#~ msgid \"Aqsis Surface Layer\"\n#~ msgstr \"Eqsees Soorffece-a Leyer\"\n\n#~ msgid \"Are you sure?  The only way to get a bug fixed is to report it ...\"\n#~ msgstr \"Ere-a yuoo soore-a?  Zee oonly vey tu get a boog feexed is tu repurt it ...\"\n\n#, fuzzy\n#~ msgid \"Axis along which the curves are ordered\"\n#~ msgstr \"Fleep nurmels in cese-a zee feces ere-a refersed\"\n\n#~ msgid \"Back face\"\n#~ msgstr \"Beck fece-a\"\n\n#~ msgid \"Base radius\"\n#~ msgstr \"Bese-a redeeoos\"\n\n#~ msgid \"Bicubic Patch Count\"\n#~ msgstr \"Beecoobic Petch Cuoont\"\n\n#~ msgid \"Bilinear patch count\"\n#~ msgstr \"Beelineer petch cuoont\"\n\n#~ msgid \"Blobby dividend\"\n#~ msgstr \"Blubby deefidend\"\n\n#~ msgid \"Blobby divisor\"\n#~ msgstr \"Blubby deefisur\"\n\n#~ msgid \"Blobby minuend\"\n#~ msgstr \"Blubby meenooend\"\n\n#~ msgid \"Blobby subtrahend\"\n#~ msgstr \"Blubby soobtrehend\"\n\n#~ msgid \"Bottom cap position\"\n#~ msgstr \"Buttum cep puseeshun\"\n\n#~ msgid \"Cancel Tutorial\"\n#~ msgstr \"Cuncel Tootureeel\"\n\n#~ msgid \"Center around which scaling or rotation happen\"\n#~ msgstr \"Center eruoond vheech sceleeng oor ruteshun heppee\"\n\n#~ msgid \"Choose a file to open:\"\n#~ msgstr \"Chuuse-a a feele-a tu oopee:\"\n\n#~ msgid \"Choose property type\"\n#~ msgstr \"Chuuse-a pruperty type-a\"\n\n#~ msgid \"Choose value type\"\n#~ msgstr \"Chuuse-a felooe-a type-a\"\n\n#~ msgid \"Clear\"\n#~ msgstr \"Cleer\"\n\n#~ msgid \"Close\"\n#~ msgstr \"Cluse-a\"\n\n#~ msgid \"Coarsens polygonal surfaces\"\n#~ msgstr \"Cuersens pulygunel soorffeces\"\n\n#~ msgid \"Collapse destination : first or second vertex, or middle\"\n#~ msgstr \"Cullepse-a desteeneshun : furst oor secund fertex, oor meeddle-a\"\n\n#~ msgid \"Color number in the virtual color list\"\n#~ msgstr \"Culur noomber in zee furtooel culur leest\"\n\n#~ msgid \"Command Node Inspector\"\n#~ msgstr \"Cummund Nude-a Inspectur\"\n\n#~ msgid \"Command Node Inspector ...\"\n#~ msgstr \"Cummund Nude-a Inspectur ...\"\n\n#~ msgid \"Compares meshes for equivalence\"\n#~ msgstr \"Cumperes meshes fur iqooeefelence-a\"\n\n#~ msgid \"Components to be selected (faces or edges)\"\n#~ msgstr \"Cumpunents tu be-a selected (feces oor idges)\"\n\n#~ msgid \"Cone height\"\n#~ msgstr \"Cune-a heeeght\"\n\n#, fuzzy\n#~ msgid \"Constant\"\n#~ msgstr \"Instunteeete-a\"\n\n#~ msgid \"Continue Tutorial\"\n#~ msgstr \"Cunteenooe-a Tootureeel\"\n\n#~ msgid \"Converts an input mesh to the legacy mesh format, then back, for regression testing\"\n#~ msgstr \"Cunferts un inpoot mesh tu zee legecy mesh furmet, zeen beck, fur regresseeun testeeng\"\n\n#~ msgid \"Cost function (length, optimized, angle)\"\n#~ msgstr \"Cust fooncshun (lengt, oopteemized, ungle-a)\"\n\n#~ msgid \"Could not locate the aqsis executable.\"\n#~ msgstr \"Cuoold nut lucete-a zee eqsees ixecooteble-a.\"\n\n#~ msgid \"Could not locate the aqsl executable.\"\n#~ msgstr \"Cuoold nut lucete-a zee eqsl ixecooteble-a.\"\n\n#~ msgid \"Could not locate the rndr executable.\"\n#~ msgstr \"Cuoold nut lucete-a zee rndr ixecooteble-a.\"\n\n#~ msgid \"Could not locate the sdrc executable.\"\n#~ msgstr \"Cuoold nut lucete-a zee sdrc ixecooteble-a.\"\n\n#, fuzzy\n#~ msgid \"Create Cap?\"\n#~ msgstr \"Creete-a\"\n\n#, fuzzy\n#~ msgid \"Create Caps?\"\n#~ msgstr \"Creete-a\"\n\n#, fuzzy\n#~ msgid \"Create caps?\"\n#~ msgstr \"Creete-a\"\n\n#~ msgid \"Cubic curve count\"\n#~ msgstr \"Coobeec coorfe-a cuoont\"\n\n#~ msgid \"Cubic curve group count\"\n#~ msgstr \"Coobeec coorfe-a gruoop cuoont\"\n\n#~ msgid \"Cylinder bending into sphere\"\n#~ msgstr \"Cyleender bendeeng intu sphere-a\"\n\n#~ msgid \"Cylinder test\"\n#~ msgstr \"Cyleender test\"\n\n#~ msgid \"Cylindrical projection map\"\n#~ msgstr \"Cyleendricel prujecshun mep\"\n\n#~ msgid \"Default T\"\n#~ msgstr \"Deffoolt T\"\n\n#~ msgid \"Default color\"\n#~ msgstr \"Deffoolt culur\"\n\n#~ msgid \"Default s\"\n#~ msgstr \"Deffoolt s\"\n\n#~ msgid \"Default t\"\n#~ msgstr \"Deffoolt t\"\n\n#~ msgid \"Dimension\"\n#~ msgstr \"Deemensiun\"\n\n#~ msgid \"Disk position\"\n#~ msgstr \"Deesk puseeshun\"\n\n#~ msgid \"Disk radius\"\n#~ msgstr \"Deesk redeeoos\"\n\n#~ msgid \"Display strip Number\"\n#~ msgstr \"Deespley streep Noomber\"\n\n#~ msgid \"Display strips\"\n#~ msgstr \"Deespley streeps\"\n\n#, fuzzy\n#~ msgid \"Displays a hierarchical list of node inputs\"\n#~ msgstr \"Deespleys steteestics ebuoot zee inpoot mesh\"\n\n#~ msgid \"Displays input matrix values\"\n#~ msgstr \"Deespleys inpoot metreex felooes\"\n\n#~ msgid \"Displays statistics about the input mesh\"\n#~ msgstr \"Deespleys steteestics ebuoot zee inpoot mesh\"\n\n#~ msgid \"Division type\"\n#~ msgstr \"Deefisiun type-a\"\n\n#, fuzzy\n#~ msgid \"Double-click to play a tutorial:\"\n#~ msgstr \"Duooble-a-cleeck a tootureeel tu begeen:\"\n\n#~ msgid \"Dual\"\n#~ msgstr \"Dooel\"\n\n#~ msgid \"Edge number\"\n#~ msgstr \"Idge-a noomber\"\n\n#~ msgid \"Emission Color\"\n#~ msgstr \"Imeessiun Culur\"\n\n#~ msgid \"Equal\"\n#~ msgstr \"Iqooel\"\n\n#~ msgid \"Error\"\n#~ msgstr \"Irrur\"\n\n#~ msgid \"Event Recorder ...\"\n#~ msgstr \"Ifent Recurder ...\"\n\n#~ msgid \"Eversion Time : between 0 and 1\"\n#~ msgstr \"Iferseeun Teeme-a : betveee 0 und 1\"\n\n#~ msgid \"Extended mode\"\n#~ msgstr \"Ixtended mude-a\"\n\n#~ msgid \"Extended mode follows quads instead of edgeloops\"\n#~ msgstr \"Ixtended mude-a fulloos qooeds insteed ooff idgeluups\"\n\n#~ msgid \"Extrude neighbour faces as a single one (named a region)\"\n#~ msgstr \"Ixtroode-a neeeghbuoor feces es a seengle-a oone-a (nemed a regeeun)\"\n\n#~ msgid \"Extrusion direction : inside / outside\"\n#~ msgstr \"Ixtrooseeun durecshun : inseede-a / ooootseede-a\"\n\n#, fuzzy\n#~ msgid \"Face\"\n#~ msgstr \"Feces\"\n\n#~ msgid \"Face number\"\n#~ msgstr \"Fece-a noomber\"\n\n#~ msgid \"Filter faces by color\"\n#~ msgstr \"Feelter feces by culur\"\n\n#~ msgid \"Final edge number\"\n#~ msgstr \"Feenel idge-a noomber\"\n\n#~ msgid \"First addition operand (should be a blobby)\"\n#~ msgstr \"Furst eddeeshun ooperund (shuoold be-a a blubby)\"\n\n#~ msgid \"First matrix line or row\"\n#~ msgstr \"Furst metreex leene-a oor roo\"\n\n#~ msgid \"First maximum operand (should be a blobby)\"\n#~ msgstr \"Furst mexeemoom ooperund (shuoold be-a a blubby)\"\n\n#~ msgid \"First mesh to merge\"\n#~ msgstr \"Furst mesh tu merge-a\"\n\n#~ msgid \"First minimum operand (should be a blobby)\"\n#~ msgstr \"Furst meenimoom ooperund (shuoold be-a a blubby)\"\n\n#~ msgid \"First multiplication operand (should be a blobby)\"\n#~ msgstr \"Furst moolteepliceshun ooperund (shuoold be-a a blubby)\"\n\n#, fuzzy\n#~ msgid \"Flip Vertex order?\"\n#~ msgstr \"Fertex Sheder\"\n\n#~ msgid \"For region extrusion use the average normal; else each face is extrude along its own normal\"\n#~ msgstr \"Fur regeeun ixtrooseeun use-a zee eferege-a nurmel; ilse-a iech fece-a is ixtroode-a elung its oovn nurmel\"\n\n#~ msgid \"Format string, printf() like\"\n#~ msgstr \"Furmet streeng, preentff() leeke-a\"\n\n#~ msgid \"Fourth matrix line or row\"\n#~ msgstr \"Fuoort metreex leene-a oor roo\"\n\n#~ msgid \"Fractal dimension\"\n#~ msgstr \"Frectel deemensiun\"\n\n#~ msgid \"Freezes the defined parameter\"\n#~ msgstr \"Freezes zee deffeened peremeter\"\n\n#~ msgid \"Frequency\"\n#~ msgstr \"Freqooency\"\n\n#~ msgid \"GL Material\"\n#~ msgstr \"GL Metereeel\"\n\n#~ msgid \"GNU Triangulated Surface ( .gts )\"\n#~ msgstr \"GNOo Treeungooleted Soorffece-a ( .gts )\"\n\n#, fuzzy\n#~ msgid \"Generate varying (per-vertex) normals.\"\n#~ msgstr \"Generetes a uneeffurm pulyhedrun\"\n\n#~ msgid \"Generates an FFT-based fractal terrain\"\n#~ msgstr \"Generetes un FFT-besed frectel terreeen\"\n\n#~ msgid \"Generates an HfBM-based fractal terrain\"\n#~ msgstr \"Generetes un HffBM-besed frectel terreeen\"\n\n#~ msgid \"Generates sphere eversion at any stage\"\n#~ msgstr \"Generetes sphere-a iferseeun et uny stege-a\"\n\n#~ msgid \"Gradient spacing\"\n#~ msgstr \"Gredeeent speceeng\"\n\n#~ msgid \"HPoint\"\n#~ msgstr \"HPueent\"\n\n#~ msgid \"Half strips\"\n#~ msgstr \"Helff streeps\"\n\n#~ msgid \"Holes only\"\n#~ msgstr \"Hules oonly\"\n\n#~ msgid \"Indices of points being transformed\"\n#~ msgstr \"Indeeces ooff pueents beeeng trunsffurmed\"\n\n#~ msgid \"Input mesh 1\"\n#~ msgstr \"Inpoot mesh 1\"\n\n#~ msgid \"Input mesh 2\"\n#~ msgstr \"Inpoot mesh 2\"\n\n#~ msgid \"Input transformation matrix\"\n#~ msgstr \"Inpoot trunsffurmeshun metreex\"\n\n#~ msgid \"Integer\"\n#~ msgstr \"Integer\"\n\n#, fuzzy\n#~ msgid \"Iso line divisions\"\n#~ msgstr \"Coorfe-a soobdeefisiuns\"\n\n#~ msgid \"Iso spacing\"\n#~ msgstr \"Isu speceeng\"\n\n#~ msgid \"Iterations\"\n#~ msgstr \"Itereshuns\"\n\n#~ msgid \"K-3D Bug Buddy\"\n#~ msgstr \"K-3D Boog Booddy\"\n\n#~ msgid \"K-3D Documents (*.k3d)\"\n#~ msgstr \"K-3D Ducooments (*.k3d)\"\n\n#~ msgid \"K-3D Script (*.k3dscript)\"\n#~ msgstr \"K-3D Screept (*.k3dscreept)\"\n\n#~ msgid \"K3DScript scripting engine\"\n#~ msgstr \"K3DScreept screepting ingeene-a\"\n\n#~ msgid \"Lacunarity\"\n#~ msgstr \"Lecoonereety\"\n\n#~ msgid \"Latitudinal Patches Per Hemisphere\"\n#~ msgstr \"Leteetoodinel Petches Per Hemeesphere-a\"\n\n#~ msgid \"Latitudinal patches\"\n#~ msgstr \"Leteetoodinel petches\"\n\n#~ msgid \"LightWave 6 ( .lwo )\"\n#~ msgstr \"LeeghtVefe-a 6 ( .lvu )\"\n\n#~ msgid \"Line1\"\n#~ msgstr \"Leene-a1\"\n\n#~ msgid \"Line2\"\n#~ msgstr \"Leene-a2\"\n\n#~ msgid \"Line3\"\n#~ msgstr \"Leene-a3\"\n\n#~ msgid \"Line4\"\n#~ msgstr \"Leene-a4\"\n\n#~ msgid \"Linear curve group count\"\n#~ msgstr \"Leeneer coorfe-a gruoop cuoont\"\n\n#~ msgid \"List with edge indices that are marked as sharp by this node\"\n#~ msgstr \"Leest veet idge-a indeeces thet ere-a merked es sherp by thees nude-a\"\n\n#, fuzzy\n#~ msgid \"Local X component function\"\n#~ msgstr \"Shoo cumpunent selecshun\"\n\n#, fuzzy\n#~ msgid \"Local Y component function\"\n#~ msgstr \"Shoo cumpunent selecshun\"\n\n#, fuzzy\n#~ msgid \"Local Z component function\"\n#~ msgstr \"Shoo cumpunent selecshun\"\n\n#~ msgid \"Longitudinal Patches Per Strip\"\n#~ msgstr \"Lungeetoodinel Petches Per Streep\"\n\n#~ msgid \"Low-level control of memory pools, primarily for testing\"\n#~ msgstr \"Loo-lefel cuntrul ooff memury puuls, preemerily fur testeeng\"\n\n#~ msgid \"Lower hemisphere\"\n#~ msgstr \"Looer hemeesphere-a\"\n\n#, fuzzy\n#~ msgid \"Major Color\"\n#~ msgstr \"Mejur Pooer\"\n\n#, fuzzy\n#~ msgid \"Major color\"\n#~ msgstr \"Mejur Pooer\"\n\n#~ msgid \"Make selected edges sharp\"\n#~ msgstr \"Meke-a selected idges sherp\"\n\n#~ msgid \"Map containing the difference vectors for all transformations performed by this node\"\n#~ msgstr \"Mep cunteeening zee deefffference-a fecturs fur ell trunsffurmeshuns perffurmed by thees nude-a\"\n\n#~ msgid \"Maps texture values to geometry using an external texture mapping transformation\"\n#~ msgstr \"Meps textoore-a felooes tu geumetry useeng un ixternel textoore-a meppeeng trunsffurmeshun\"\n\n#~ msgid \"Maps values to geometry using a planar projection map\"\n#~ msgstr \"Meps felooes tu geumetry useeng a pluner prujecshun mep\"\n\n#~ msgid \"Max edge cost\"\n#~ msgstr \"Mex idge-a cust\"\n\n#~ msgid \"Max fold angle\"\n#~ msgstr \"Mex fuld ungle-a\"\n\n#~ msgid \"Max index\"\n#~ msgstr \"Mex index\"\n\n#~ msgid \"Maxima Selection\"\n#~ msgstr \"Mexeema Selecshun\"\n\n#~ msgid \"Maxima selection\"\n#~ msgstr \"Mexeema selecshun\"\n\n#~ msgid \"Maxima value\"\n#~ msgstr \"Mexeema felooe-a\"\n\n#~ msgid \"Merge meshes in a single polyhedron\"\n#~ msgstr \"Merge-a meshes in a seengle-a pulyhedrun\"\n\n#~ msgid \"Merges polygonal surfaces using boolean operations\"\n#~ msgstr \"Merges pulygunel soorffeces useeng buuleun oopereshuns\"\n\n#~ msgid \"Mid-vertex  or volume optimized\"\n#~ msgstr \"Meed-fertex  oor fuloome-a oopteemized\"\n\n#~ msgid \"Mid-vertex function\"\n#~ msgstr \"Meed-fertex fooncshun\"\n\n#~ msgid \"Middle offset\"\n#~ msgstr \"Meeddle-a ooffffset\"\n\n#~ msgid \"Middle offset, for midpoints only\"\n#~ msgstr \"Meeddle-a ooffffset, fur meedpuints oonly\"\n\n#~ msgid \"Min index\"\n#~ msgstr \"Meen index\"\n\n#~ msgid \"Minima Selection\"\n#~ msgstr \"Meenima Selecshun\"\n\n#~ msgid \"Minima selection\"\n#~ msgstr \"Meenima selecshun\"\n\n#~ msgid \"Minima value\"\n#~ msgstr \"Meenima felooe-a\"\n\n#, fuzzy\n#~ msgid \"Minor Color\"\n#~ msgstr \"Meenur Pooer\"\n\n#, fuzzy\n#~ msgid \"Minor color\"\n#~ msgstr \"Meenur Pooer\"\n\n#~ msgid \"New Color\"\n#~ msgstr \"Noo Culur\"\n\n#~ msgid \"New color\"\n#~ msgstr \"Noo culur\"\n\n#~ msgid \"Node History\"\n#~ msgstr \"Nude-a Heestury\"\n\n#~ msgid \"Node List\"\n#~ msgstr \"Nude-a Leest\"\n\n#~ msgid \"Node selection state, 1 = selected, 0 = unselected.\"\n#~ msgstr \"Nude-a selecshun stete-a, 1 = selected, 0 = unselected.\"\n\n#~ msgid \"Noise offset\"\n#~ msgstr \"Nueese-a ooffffset\"\n\n#~ msgid \"Normalize normals\"\n#~ msgstr \"Nurmeleeze-a nurmels\"\n\n#~ msgid \"Normals scale\"\n#~ msgstr \"Nurmels scele-a\"\n\n#~ msgid \"Nucurve count\"\n#~ msgstr \"Noocoorfe-a cuoont\"\n\n#~ msgid \"Nucurve group count\"\n#~ msgstr \"Noocoorfe-a gruoop cuoont\"\n\n#~ msgid \"Number\"\n#~ msgstr \"Noomber\"\n\n#~ msgid \"Nupatch Count\"\n#~ msgstr \"Noopetch Cuoont\"\n\n#~ msgid \"Octaves\"\n#~ msgstr \"Ooctefes\"\n\n#~ msgid \"Open Script:\"\n#~ msgstr \"Oopee Screept:\"\n\n#~ msgid \"OpenGL Material\"\n#~ msgstr \"OopenGL Metereeel\"\n\n#~ msgid \"Output Scalar\"\n#~ msgstr \"Ooootpoot Sceler\"\n\n#~ msgid \"Output Value\"\n#~ msgstr \"Ooootpoot Felooe-a\"\n\n#~ msgid \"Output half strips\"\n#~ msgstr \"Ooootpoot helff streeps\"\n\n#~ msgid \"Output lower hemisphere\"\n#~ msgstr \"Ooootpoot looer hemeesphere-a\"\n\n#~ msgid \"Output matrix\"\n#~ msgstr \"Ooootpoot metreex\"\n\n#~ msgid \"Output matrix generated by the script\"\n#~ msgstr \"Ooootpoot metreex genereted by zee screept\"\n\n#~ msgid \"Output polygons (true) or patches (false)\"\n#~ msgstr \"Ooootpoot pulyguns (trooe-a) oor petches (felse-a)\"\n\n#~ msgid \"Output string (read only)\"\n#~ msgstr \"Ooootpoot streeng (reed oonly)\"\n\n#~ msgid \"Output value\"\n#~ msgstr \"Ooootpoot felooe-a\"\n\n#~ msgid \"Outputs the value exposed by this property\"\n#~ msgstr \"Ooootpoots zee felooe-a ixpused by thees pruperty\"\n\n#~ msgid \"P_lug\"\n#~ msgstr \"P_loog\"\n\n#~ msgid \"Parameter List\"\n#~ msgstr \"Peremeter Leest\"\n\n#~ msgid \"Partial selection\"\n#~ msgstr \"Perteeel selecshun\"\n\n#~ msgid \"Pipeline Profiler\"\n#~ msgstr \"Peepeline-a Pruffeeler\"\n\n#~ msgid \"Places a shader on a sphere, centered on the camera and aligned with world coordinates\"\n#~ msgstr \"Pleces a sheder oon a sphere-a, centered oon zee cemera und eleegned veet vurld cuurdeenetes\"\n\n#~ msgid \"Planar projection map\"\n#~ msgstr \"Pluner prujecshun mep\"\n\n#~ msgid \"Play From Cursor\"\n#~ msgstr \"Pley Frum Coorsur\"\n\n#~ msgid \"Please include a contact email address\"\n#~ msgstr \"Pleese-a incloode-a a cuntect imeeel eddress\"\n\n#~ msgid \"Please include a summary for this bug report\"\n#~ msgstr \"Pleese-a incloode-a a soommery fur thees boog repurt\"\n\n#~ msgid \"Plug\"\n#~ msgstr \"Ploog\"\n\n#~ msgid \"Polygonal\"\n#~ msgstr \"Pulygunel\"\n\n#~ msgid \"Polyhedron Number\"\n#~ msgstr \"Pulyhedrun Noomber\"\n\n#~ msgid \"Polyhedron count\"\n#~ msgstr \"Pulyhedrun cuoont\"\n\n#~ msgid \"Polyhedron's dual\"\n#~ msgstr \"Pulyhedrun's dooel\"\n\n#~ msgid \"Provides a source object to link scalar properties to\"\n#~ msgstr \"Prufeedes a suoorce-a oobject tu leenk sceler pruperteees tu\"\n\n#~ msgid \"Python Script (*.py)\"\n#~ msgstr \"Pythun Screept (*.py)\"\n\n#~ msgid \"Raw ( .raw )\"\n#~ msgstr \"Rev ( .rev )\"\n\n#~ msgid \"Read only\"\n#~ msgstr \"Reed oonly\"\n\n#~ msgid \"Real\"\n#~ msgstr \"Reel\"\n\n#~ msgid \"Record Message\"\n#~ msgstr \"Recurd Messege-a\"\n\n#~ msgid \"Record _Test Case...\"\n#~ msgstr \"Recurd _Test Cese-a...\"\n\n#~ msgid \"Recording\"\n#~ msgstr \"Recurdeeng\"\n\n#~ msgid \"Region\"\n#~ msgstr \"Regeeun\"\n\n#~ msgid \"Render engine\"\n#~ msgstr \"Render ingeene-a\"\n\n#~ msgid \"Render engine name\"\n#~ msgstr \"Render ingeene-a neme-a\"\n\n#~ msgid \"RenderMan Option\"\n#~ msgstr \"RenderMun Oopshun\"\n\n#~ msgid \"Renders a teapot primitive in render engines that support one (Aqsis!)\"\n#~ msgstr \"Renders a teeput preemitife-a in render ingeenes thet sooppurt oone-a (Eqsees!)\"\n\n#, fuzzy\n#~ msgid \"Renders mean curvature normal vector at each vertex\"\n#~ msgstr \"Renders pulyhedrun fece-a nurmel fecturs\"\n\n#, fuzzy\n#~ msgid \"Renders mesh faces using a face-varying color array\"\n#~ msgstr \"Renders mesh feces, useeng flet shedeeng\"\n\n#, fuzzy\n#~ msgid \"Renders mesh faces with PGP\"\n#~ msgstr \"Renders mesh feces\"\n\n#~ msgid \"Renders mesh faces, determining flat or smooth shading based on edge sharpness\"\n#~ msgstr \"Renders mesh feces, determeening flet oor smuut shedeeng besed oon idge-a sherpness\"\n\n#~ msgid \"Renders mesh point groups\"\n#~ msgstr \"Renders mesh pueent gruoops\"\n\n#~ msgid \"S0\"\n#~ msgstr \"S0\"\n\n#~ msgid \"S1\"\n#~ msgstr \"S1\"\n\n#~ msgid \"Same polyhedron\"\n#~ msgstr \"Seme-a pulyhedrun\"\n\n#~ msgid \"Save Tutorial As:\"\n#~ msgstr \"Sefe-a Tootureeel Es:\"\n\n#~ msgid \"Scale normals\"\n#~ msgstr \"Scele-a nurmels\"\n\n#, fuzzy\n#~ msgid \"Script node that executes a script in response to command-node commands\"\n#~ msgstr \"Screept nude-a thet ixecootes vhenefer oone-a ooff its inpoots chunges\"\n\n#~ msgid \"Scripted OpenGL Drawable\"\n#~ msgstr \"Screepted OopenGL Dreveble-a\"\n\n#~ msgid \"Second addition operand (should be a blobby)\"\n#~ msgstr \"Secund eddeeshun ooperund (shuoold be-a a blubby)\"\n\n#~ msgid \"Second matrix line or row\"\n#~ msgstr \"Secund metreex leene-a oor roo\"\n\n#~ msgid \"Second maximum operand (should be a blobby)\"\n#~ msgstr \"Secund mexeemoom ooperund (shuoold be-a a blubby)\"\n\n#~ msgid \"Second mesh to merge\"\n#~ msgstr \"Secund mesh tu merge-a\"\n\n#~ msgid \"Second minimum operand (should be a blobby)\"\n#~ msgstr \"Secund meenimoom ooperund (shuoold be-a a blubby)\"\n\n#~ msgid \"Second multiplication operand (should be a blobby)\"\n#~ msgstr \"Secund moolteepliceshun ooperund (shuoold be-a a blubby)\"\n\n#~ msgid \"Segments radius\"\n#~ msgstr \"Segments redeeoos\"\n\n#~ msgid \"Select Faces mode\"\n#~ msgstr \"Select Feces mude-a\"\n\n#~ msgid \"Select Lines mode\"\n#~ msgstr \"Select Leenes mude-a\"\n\n#~ msgid \"Select Nodes mode\"\n#~ msgstr \"Select Nudes mude-a\"\n\n#~ msgid \"Select Objects\"\n#~ msgstr \"Select Oobjects\"\n\n#~ msgid \"Select Points mode\"\n#~ msgstr \"Select Pueents mude-a\"\n\n#~ msgid \"Select nodes\"\n#~ msgstr \"Select nudes\"\n\n#~ msgid \"Select side faces on output\"\n#~ msgstr \"Select seede-a feces oon ooootpoot\"\n\n#~ msgid \"Shape weight\"\n#~ msgstr \"Shepe-a veeeght\"\n\n#~ msgid \"Shininess\"\n#~ msgstr \"Sheeniness\"\n\n#~ msgid \"Simulates smooth geometry by averaging polygon normals\"\n#~ msgstr \"Seemooletes smuut geumetry by eferegeeng pulygun nurmels\"\n\n#, fuzzy\n#~ msgid \"Smooth Curvature\"\n#~ msgstr \"Smuutheeng fectur\"\n\n#, fuzzy\n#~ msgid \"Smoothing steps\"\n#~ msgstr \"Smuutheeng\"\n\n#, fuzzy\n#~ msgid \"Smoothing timestep\"\n#~ msgstr \"Smuutheeng\"\n\n#, fuzzy\n#~ msgid \"Smoothing timesteps\"\n#~ msgstr \"Smuutheeng\"\n\n#~ msgid \"Spherical projection map\"\n#~ msgstr \"Sphereecel prujecshun mep\"\n\n#~ msgid \"Stop Recording\"\n#~ msgstr \"Stup Recurdeeng\"\n\n#~ msgid \"Stop function (edge number or cost)\"\n#~ msgstr \"Stup fooncshun (idge-a noomber oor cust)\"\n\n#~ msgid \"String\"\n#~ msgstr \"Streeng\"\n\n#~ msgid \"Strip Number\"\n#~ msgstr \"Streep Noomber\"\n\n#~ msgid \"Strips\"\n#~ msgstr \"Streeps\"\n\n#~ msgid \"Subdivision iterations\"\n#~ msgstr \"Soobdeefisiun itereshuns\"\n\n#~ msgid \"Subtraction type\"\n#~ msgstr \"Soobtrecshun type-a\"\n\n#~ msgid \"Surface\"\n#~ msgstr \"Soorffece-a\"\n\n#~ msgid \"Swap dividend and divisor\"\n#~ msgstr \"Svep deefidend und deefisur\"\n\n#~ msgid \"Swap subtrahend and minuend\"\n#~ msgstr \"Svep soobtrehend und meenooend\"\n\n#~ msgid \"T0\"\n#~ msgstr \"T0\"\n\n#~ msgid \"T1\"\n#~ msgstr \"T1\"\n\n#~ msgid \"Tag Bicubic Patches\"\n#~ msgstr \"Teg Beecoobic Petches\"\n\n#~ msgid \"Tag Bilinear Patches\"\n#~ msgstr \"Teg Beelineer Petches\"\n\n#~ msgid \"Tag Cubic Curve Groups\"\n#~ msgstr \"Teg Coobeec Coorfe-a Gruoops\"\n\n#~ msgid \"Tag Edges\"\n#~ msgstr \"Teg Idges\"\n\n#~ msgid \"Tag Faces\"\n#~ msgstr \"Teg Feces\"\n\n#~ msgid \"Tag Linear Groups\"\n#~ msgstr \"Teg Leeneer Gruoops\"\n\n#~ msgid \"Tag Point Groups\"\n#~ msgstr \"Teg Pueent Gruoops\"\n\n#~ msgid \"Tag Points\"\n#~ msgstr \"Teg Pueents\"\n\n#~ msgid \"Tag Polyhedra\"\n#~ msgstr \"Teg Pulyhedra\"\n\n#~ msgid \"Tag bicubic patches\"\n#~ msgstr \"Teg beecoobic petches\"\n\n#~ msgid \"Tag bilinear patches\"\n#~ msgstr \"Teg beelineer petches\"\n\n#~ msgid \"Tag cubic curve groups\"\n#~ msgstr \"Teg coobeec coorfe-a gruoops\"\n\n#~ msgid \"Tag edges\"\n#~ msgstr \"Teg idges\"\n\n#~ msgid \"Tag faces\"\n#~ msgstr \"Teg feces\"\n\n#~ msgid \"Tag linear curve groups\"\n#~ msgstr \"Teg leeneer coorfe-a gruoops\"\n\n#~ msgid \"Tag point groups\"\n#~ msgstr \"Teg pueent gruoops\"\n\n#~ msgid \"Tag points\"\n#~ msgstr \"Teg pueents\"\n\n#~ msgid \"Tag polyhedra\"\n#~ msgstr \"Teg pulyhedra\"\n\n#~ msgid \"Tags geometry with a color\"\n#~ msgstr \"Tegs geumetry veet a culur\"\n\n#~ msgid \"Target face number\"\n#~ msgstr \"Terget fece-a noomber\"\n\n#~ msgid \"Tells whether the tutorial recorder records user actions\"\n#~ msgstr \"Tells vhezeer zee tootureeel recurder recurds user ecshuns\"\n\n#~ msgid \"Tessellation Level\"\n#~ msgstr \"Tesselleshun Lefel\"\n\n#~ msgid \"Tessellation level\"\n#~ msgstr \"Tesselleshun lefel\"\n\n#, fuzzy\n#~ msgid \"Texture Coordinate Set\"\n#~ msgstr \"Cuurdeenete-a spece-a\"\n\n#, fuzzy\n#~ msgid \"Texture Mapping Set\"\n#~ msgstr \"Textoore-a Meppeeng Type-a\"\n\n#~ msgid \"Texture Mapping Type\"\n#~ msgstr \"Textoore-a Meppeeng Type-a\"\n\n#, fuzzy\n#~ msgid \"Texture Scaling\"\n#~ msgstr \"Textoore-a Meppeeng Type-a\"\n\n#~ msgid \"Texture V\"\n#~ msgstr \"Textoore-a F\"\n\n#~ msgid \"Texture W\"\n#~ msgstr \"Textoore-a V\"\n\n#~ msgid \"Third matrix line or row\"\n#~ msgstr \"Thurd metreex leene-a oor roo\"\n\n#~ msgid \"Timeline\"\n#~ msgstr \"Teemeline-a\"\n\n#~ msgid \"Tip\"\n#~ msgstr \"Teep\"\n\n#~ msgid \"Toolbar\"\n#~ msgstr \"Tuulber\"\n\n#~ msgid \"Top cap position\"\n#~ msgstr \"Tup cep puseeshun\"\n\n#~ msgid \"Torus major radius\"\n#~ msgstr \"Turoos mejur redeeoos\"\n\n#~ msgid \"Torus minor radius\"\n#~ msgstr \"Turoos meenur redeeoos\"\n\n#~ msgid \"Transform source that uses a script to create the output value\"\n#~ msgstr \"Trunsffurm suoorce-a thet uses a screept tu creete-a zee ooootpoot felooe-a\"\n\n#~ msgid \"Transformation Center\"\n#~ msgstr \"Trunsffurmeshun Center\"\n\n#~ msgid \"Translates each mesh point with custom vector\"\n#~ msgstr \"Trunsletes iech mesh pueent veet coostum fectur\"\n\n#~ msgid \"Transpose\"\n#~ msgstr \"Trunspuse-a\"\n\n#~ msgid \"Transpose shown matrix\"\n#~ msgstr \"Trunspuse-a shoon metreex\"\n\n#~ msgid \"Triangulate only faces that contain holes\"\n#~ msgstr \"Treeungoolete-a oonly feces thet cunteeen hules\"\n\n#, fuzzy\n#~ msgid \"Triangulates faces with more than 4 edges\"\n#~ msgstr \"Treeungoolete-a oonly feces thet cunteeen hules\"\n\n#~ msgid \"True iff all input meshes are completely equivalent\"\n#~ msgstr \"Trooe-a iffff ell inpoot meshes ere-a cumpletely iqooeefelent\"\n\n#~ msgid \"Tweak array translates each point in a custom diretion, those values are set by the application\"\n#~ msgstr \"Tveek errey trunsletes iech pueent in a coostum dureshun, thuse-a felooes ere-a set by zee eppleeceshun\"\n\n#~ msgid \"Tweaks matrix\"\n#~ msgstr \"Tveeks metreex\"\n\n#~ msgid \"Undo Tree\"\n#~ msgstr \"Undu Tree-a\"\n\n#, fuzzy\n#~ msgid \"Uniform Normals\"\n#~ msgstr \"Nurmeleeze-a nurmels\"\n\n#~ msgid \"Untitled Tutorial\"\n#~ msgstr \"Unteetled Tootureeel\"\n\n#~ msgid \"Use File > Open to load a document\"\n#~ msgstr \"Use-a Feele-a > Oopee tu lued a ducooment\"\n\n#~ msgid \"User\"\n#~ msgstr \"User\"\n\n#~ msgid \"Using upstream component selection\"\n#~ msgstr \"Useeng upstreem cumpunent selecshun\"\n\n#, fuzzy\n#~ msgid \"Varying\"\n#~ msgstr \"Verneeng\"\n\n#~ msgid \"Vertex\"\n#~ msgstr \"Fertex\"\n\n#~ msgid \"Volume weight\"\n#~ msgstr \"Fuloome-a veeeght\"\n\n#~ msgid \"Voxel subdivisions along blobby's bounding-box width, height and depth \"\n#~ msgstr \"Fuxel soobdeefisiuns elung blubby's buoondeeng-bux veedt, heeeght und dept \"\n\n#~ msgid \"Voxels\"\n#~ msgstr \"Fuxels\"\n\n#~ msgid \"Weight used for boundary optimization\"\n#~ msgstr \"Veeeght used fur buoondery oopteemizeshun\"\n\n#~ msgid \"Weight used for shape optimization\"\n#~ msgstr \"Veeeght used fur shepe-a oopteemizeshun\"\n\n#~ msgid \"Weight used for volume optimization\"\n#~ msgstr \"Veeeght used fur fuloome-a oopteemizeshun\"\n\n#~ msgid \"Without it, RIB files cannot be rendered.  Check to ensure that you have Aqsis installed, and that the PATH envrionment variable points to the Aqsis binary installation directory.\"\n#~ msgstr \"Veethuoot it, RIB feeles cunnut be-a rendered.  Check tu insoore-a thet yuoo hefe-a Eqsees instelled, und thet zee PETH infreeunment fereeeble-a pueents tu zee Eqsees beenery instelleshun durectury.\"\n\n#~ msgid \"Without it, RIB files cannot be rendered.  Check to ensure that you have Pixie installed, and that the PATH environment variable points to the Pixie binary installation directory.\"\n#~ msgstr \"Veethuoot it, RIB feeles cunnut be-a rendered.  Check tu insoore-a thet yuoo hefe-a Peexie-a instelled, und thet zee PETH infurunment fereeeble-a pueents tu zee Peexie-a beenery instelleshun durectury.\"\n\n#~ msgid \"Without it, shaders cannot be compiled.  Check to ensure that you have Aqsis installed, and that the PATH envrionment variable points to the Aqsis binary installation directory.\"\n#~ msgstr \"Veethuoot it, sheders cunnut be-a cumpeeled.  Check tu insoore-a thet yuoo hefe-a Eqsees instelled, und thet zee PETH infreeunment fereeeble-a pueents tu zee Eqsees beenery instelleshun durectury.\"\n\n#~ msgid \"Without it, shaders cannot be compiled.  Check to ensure that you have Pixie installed, and that the PATH environment variable points to the Pixie binary installation directory.\"\n#~ msgstr \"Veethuoot it, sheders cunnut be-a cumpeeled.  Check tu insoore-a thet yuoo hefe-a Peexie-a instelled, und thet zee PETH infurunment fereeeble-a pueents tu zee Peexie-a beenery instelleshun durectury.\"\n\n#~ msgid \"_Faces\"\n#~ msgstr \"_Feces\"\n\n#~ msgid \"_Knife Tool\"\n#~ msgstr \"_Kneeffe-a Tuul\"\n\n#~ msgid \"_Lines\"\n#~ msgstr \"_Leenes\"\n\n#~ msgid \"_Manual\"\n#~ msgstr \"_Munooel\"\n\n#~ msgid \"_Nodes\"\n#~ msgstr \"_Nudes\"\n\n#~ msgid \"_Points\"\n#~ msgstr \"_Pueents\"\n\n#~ msgid \"_Record Tutorial...\"\n#~ msgstr \"_Recurd Tootureeel...\"\n\n#, fuzzy\n#~ msgid \"_Tutorials and Examples ...\"\n#~ msgstr \"_Tootureeels ...\"\n\n#~ msgid \"axis\"\n#~ msgstr \"exees\"\n\n#, fuzzy\n#~ msgid \"control_points\"\n#~ msgstr \"teg_pueents\"\n\n#, fuzzy\n#~ msgid \"create_caps\"\n#~ msgstr \"creete-a\"\n\n#~ msgid \"default_s\"\n#~ msgstr \"deffoolt_s\"\n\n#~ msgid \"default_t\"\n#~ msgstr \"deffoolt_t\"\n\n#, fuzzy\n#~ msgid \"normalize_all\"\n#~ msgstr \"Nurmeleeze-a\"\n\n#~ msgid \"number\"\n#~ msgstr \"noomber\"\n\n#, fuzzy\n#~ msgid \"order\"\n#~ msgstr \"u_oorder\"\n\n#, fuzzy\n#~ msgid \"point_spacing\"\n#~ msgstr \"Gredeeent speceeng\"\n\n#~ msgid \"raw ASCII format ( .raw )\"\n#~ msgstr \"rev ESCII furmet ( .rev )\"\n\n#~ msgid \"render_final\"\n#~ msgstr \"render_feenel\"\n\n#~ msgid \"s0\"\n#~ msgstr \"s0\"\n\n#, fuzzy\n#~ msgid \"swap\"\n#~ msgstr \"svrep\"\n\n#~ msgid \"t0\"\n#~ msgstr \"t0\"\n\n#~ msgid \"t1\"\n#~ msgstr \"t1\"\n\n#~ msgid \"tag_edges\"\n#~ msgstr \"teg_idges\"\n"
  },
  {
    "path": "renderframe/CMakeLists.txt",
    "content": "PROJECT(renderframe)\n\nINCLUDE_DIRECTORIES(\n\t${k3d_SOURCE_DIR}\n\t${k3dsdk_BINARY_DIR}\n\t${Boost_INCLUDE_DIRS}\n\t${K3D_GLIBMM_INCLUDE_DIRS}\n\t${K3D_SIGC_INCLUDE_DIRS}\n\t)\n\nLINK_DIRECTORIES(\n\t${K3D_GLIBMM_LIB_DIRS}\n\t${K3D_SIGC_LIB_DIRS}\n\t)\n\nIF(WIN32 AND K3D_COMPILER_GCC)\n\t# For some reason, building with optimizations enabled causes link problems with boost::regex and auto-import\n\tSET_SOURCE_FILES_PROPERTIES(main.cpp PROPERTIES COMPILE_FLAGS -O0)\nENDIF()\n\nADD_EXECUTABLE(k3d-renderframe\n\tmain.cpp\n\t)\n\nSET_TARGET_PROPERTIES(k3d-renderframe PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY ${K3D_RUNTIME_OUTPUT_DIRECTORY}\n  )\n\nTARGET_LINK_LIBRARIES(k3d-renderframe\n\tk3dsdk\n\t${Boost_REGEX_LIBRARY}\n\t)\nIF(WIN32 AND K3D_COMPILER_GCC)\n\tSET_TARGET_PROPERTIES(k3d-renderframe PROPERTIES LINK_FLAGS -mwindows)\nENDIF()\n\nINSTALL(TARGETS k3d-renderframe DESTINATION bin)\n\n"
  },
  {
    "path": "renderframe/main.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-platform-config.h>\n#include <k3d-version-config.h>\n\n#include <k3dsdk/fstream.h>\n#include <k3dsdk/log.h>\n#include <k3dsdk/log_control.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/types.h>\n#include <k3dsdk/utility.h>\n\n#include <k3dsdk/xml.h>\nusing namespace k3d::xml;\n\n#ifdef K3D_API_WIN32\n\n\t#include <k3dsdk/win32.h>\n\t#include <direct.h>\n\t#define chdir _chdir\n\n#endif // K3D_API_WIN32\n\n#include <glibmm/spawn.h>\n\n#include <boost/algorithm/string/replace.hpp>\n#include <boost/format.hpp>\n#include <boost/regex.hpp>\n\n#include <cassert>\n#include <ctime>\n#include <iostream>\n#include <vector>\n\nextern char** environ;\n\nnamespace detail\n{\n\ntypedef std::vector<k3d::string_t> string_array;\n\nbool g_show_timestamps = false;\nbool g_show_process = true;\nbool g_syslog = false;\nbool g_color_level = true;\nk3d::log_level_t g_minimum_log_level = k3d::K3D_LOG_LEVEL_DEBUG;\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// expand\n\nconst k3d::string_t expand(const k3d::string_t& Value)\n{\n\tstatic boost::regex variable_regex(\"[$]([^$].*)[$]\");\n\tstatic std::map<k3d::string_t, k3d::string_t> builtin_variables;\n\n\tk3d::string_t value = Value;\n\tfor(boost::sregex_iterator variable(value.begin(), value.end(), variable_regex); variable != boost::sregex_iterator(); ++variable)\n\t{\n\t\tconst k3d::string_t variable_expression = (*variable)[0].str();\n\t\tconst k3d::string_t variable_name = (*variable)[1].str();\n\n\t\tk3d::string_t variable_value;\n\t\tif(builtin_variables.count(variable_name))\n\t\t{\n\t\t\tvariable_value = builtin_variables[variable_name];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvariable_value = k3d::system::getenv(variable_name);\n\t\t}\n\n\t\tboost::algorithm::replace_first(value, variable_expression, variable_value);\n\t}\n\treturn value;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// exec_command\n\nbool exec_command(const element& XMLCommand, const k3d::filesystem::path& FrameDirectory)\n{\n\tk3d::string_t working_directory = FrameDirectory.native_filesystem_string();\n\tstd::vector<k3d::string_t> arguments;\n\tstd::vector<k3d::string_t> environment;\n\tk3d::string_t standard_output;\n\tk3d::string_t standard_error;\n\tint exit_status = 0;\n\n\t// Setup program arguments ...\n\targuments.push_back(attribute_text(XMLCommand, \"binary\"));\n\tif(const element* const xml_arguments = find_element(XMLCommand, \"arguments\"))\n\t{\n\t\tfor(element::elements_t::const_iterator xml_argument = xml_arguments->children.begin(); xml_argument != xml_arguments->children.end(); ++xml_argument)\n\t\t{\n\t\t\tk3d::string_t value = expand(attribute_text(*xml_argument, \"value\"));\n\t\t\targuments.push_back(value);\n\t\t}\n\t}\n\n\t// Setup the application environment ...\n\tfor(int i = 0; environ[i]; ++i)\n\t\tenvironment.push_back(environ[i]);\n\n\tif(const element* const xml_environment = find_element(XMLCommand, \"environment\"))\n\t{\n\t\tfor(element::elements_t::const_iterator xml_variable = xml_environment->children.begin(); xml_variable != xml_environment->children.end(); ++xml_variable)\n\t\t{\n\t\t\tk3d::string_t name = attribute_text(*xml_variable, \"name\");\n\t\t\tk3d::string_t value = expand(attribute_text(*xml_variable, \"value\"));\n\n\t\t\t// Ensure that duplicates don't creep in ...\n\t\t\tfor(int i = 0; i != environment.size(); ++i)\n\t\t\t{\n\t\t\t\tif(0 == environment[i].find(name + \"=\"))\n\t\t\t\t{\n\t\t\t\t\tenvironment.erase(environment.begin() + i);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tenvironment.push_back(name + \"=\" + value);\n\t\t}\n\t}\n\n#ifdef K3D_API_WIN32\n  STARTUPINFO si;\n  PROCESS_INFORMATION pi;\n\n  ZeroMemory( &si, sizeof(si) );\n  si.cb = sizeof(si);\n  ZeroMemory( &pi, sizeof(pi) );\n  \n  k3d::string_t command_line;\n  for(std::vector<k3d::string_t>::const_iterator argument = arguments.begin(); argument != arguments.end(); ++argument)\n  \tcommand_line += *argument + \" \";\n  \n  k3d::log() << info << \"Executing \" << command_line << std::endl;\n  \n  std::vector<char> env;\n  for(std::vector<k3d::string_t>::const_iterator el = environment.begin(); el != environment.end(); ++el)\n  {\n  \tfor(k3d::uint_t i = 0; i != el->size(); ++i)\n  \t\tenv.push_back(el->at(i));\n  \tenv.push_back('\\0');\n  }\n  env.push_back('\\0');\n  \n  // Start the child process. \n  if( !CreateProcess( NULL,   // No module name (use command line)\n  \t\tconst_cast<char*>(command_line.c_str()),        // Command line\n      NULL,           // Process handle not inheritable\n      NULL,           // Thread handle not inheritable\n      FALSE,          // Set handle inheritance to FALSE\n      CREATE_NO_WINDOW,              // Don't create a DOS window\n      &env[0],\n      const_cast<char*>(working_directory.c_str()),            \n      &si,            // Pointer to STARTUPINFO structure\n      &pi )           // Pointer to PROCESS_INFORMATION structure\n  ) \n  {\n      k3d::log() << error << \"CreateProcess failed \" << GetLastError() << std::endl;\n      return false;\n  }\n\n  // Wait until child process exits.\n  WaitForSingleObject( pi.hProcess, INFINITE );\n\n  // Close process and thread handles. \n  CloseHandle( pi.hProcess );\n  CloseHandle( pi.hThread );\n  \n  return true;\n#else\n\t\n\ttry\n\t{\n\t\tk3d::log() << info;\n\t\tstd::copy(environment.begin(), environment.end(), std::ostream_iterator<k3d::string_t>(k3d::log(), \" \"));\n\t\tstd::copy(arguments.begin(), arguments.end(), std::ostream_iterator<k3d::string_t>(k3d::log(), \" \"));\n\t\tk3d::log() << std::endl;\n\n\t\tGlib::spawn_sync(working_directory, arguments, environment, Glib::SPAWN_SEARCH_PATH, sigc::slot<void>(), &standard_output, &standard_error, &exit_status);\n\n\t\tif(!standard_output.empty())\n\t\t\tk3d::log() << info << \"stdout: \" << standard_output << std::endl;\n\n\t\tif(!standard_error.empty())\n\t\t\tk3d::log() << error << \"stderr: \" << standard_error << std::endl;\n\n\t\treturn true;\n\t}\n\tcatch(Glib::SpawnError& e)\n\t{\n\t\tk3d::log() << error << e.what().raw() << std::endl;\n\t}\n\tcatch(...)\n\t{\n\t\tk3d::log() << error << \"caught unknown exception spawning process\" << std::endl;\n\t}\n\n\treturn false;\n#endif\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// copy_command\n\nbool copy_command(const element& XMLCommand, const k3d::filesystem::path& FrameDirectory)\n{\n\ttry\n\t{\n\t\tconst k3d::filesystem::path source = k3d::filesystem::native_path(k3d::ustring::from_utf8(attribute_text(XMLCommand, \"source\")));\n\t\tconst k3d::filesystem::path target = k3d::filesystem::native_path(k3d::ustring::from_utf8(attribute_text(XMLCommand, \"target\")));\n\n\t\tk3d::filesystem::remove(target);\n\t\tk3d::filesystem::copy_file(source, target);\n\n\t\treturn true;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tk3d::log() << error << \"exception copying file: \" << e.what();\n\t}\n\n\treturn false;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// view_command\n\nbool view_command(const element& XMLCommand, const k3d::filesystem::path& FrameDirectory)\n{\n\tconst k3d::string_t path = attribute_text(XMLCommand, \"file\");\n\n#ifndef K3D_API_WIN32\n\n/*\n\t// View the image ...\n\tboost::format command_line(k3d::options::get_command(k3d::options::command::bitmap_viewer()));\n\tcommand_line % path;\n\n\t// Execute the command ...\n\tk3d::system::spawn_async(command_line.str());\n*/\n\n#else // !K3D_API_WIN32\n\n\tShellExecute(0, \"open\", path.c_str(), 0, 0, SW_SHOWDEFAULT);\n\n#endif // K3D_API_WIN32\n\n\treturn true;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// execute_command\n\n/// Handles a single command during processing for the frame ...\nbool execute_command(const element& XMLCommand, const k3d::filesystem::path& FrameDirectory)\n{\n\tfor(element::elements_t::const_iterator xml_command = XMLCommand.children.begin(); xml_command != XMLCommand.children.end(); ++xml_command)\n\t{\n\t\tif(xml_command->name == \"exec\")\n\t\t\treturn exec_command(*xml_command, FrameDirectory);\n\t\telse if(xml_command->name == \"copy\")\n\t\t\treturn copy_command(*xml_command, FrameDirectory);\n\t\telse if(xml_command->name == \"view\")\n\t\t\treturn view_command(*xml_command, FrameDirectory);\n\t}\n\n\treturn false;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// render_frame\n\n/// Handles all processing for the given frame\nbool render_frame(const k3d::filesystem::path& FrameDirectory)\n{\n\tif(!k3d::filesystem::exists(FrameDirectory))\n\t{\n\t\tk3d::log() << error << \"Frame directory \" << FrameDirectory.native_console_string() << \" does not exist\" << std::endl;\n\t\treturn false;\n\t}\n\n\tif(!k3d::filesystem::is_directory(FrameDirectory))\n\t{\n\t\tk3d::log() << error << \"Frame directory \" << FrameDirectory.native_console_string() << \" is not a directory\" << std::endl;\n\t\treturn false;\n\t}\n\n\t// Skip the frame if it's complete ...\n\tif(k3d::filesystem::exists(FrameDirectory / k3d::filesystem::generic_path(\"complete\")))\n\t\treturn true;\n\n\t// Skip the frame if it errored out ...\n\tif(k3d::filesystem::exists(FrameDirectory / k3d::filesystem::generic_path(\"error\")))\n\t\treturn true;\n\n\t// Skip the frame if it's running ...\n\tif(k3d::filesystem::exists(FrameDirectory / k3d::filesystem::generic_path(\"running\")))\n\t\treturn true;\n\n\t// Make sure the frame is ready ...\n\tif(!k3d::filesystem::exists(FrameDirectory / k3d::filesystem::generic_path(\"ready\")))\n\t{\n\t\tk3d::log() << error << \"Frame \" << FrameDirectory.native_console_string() << \" is not ready\" << std::endl;\n\t\treturn false;\n\t}\n\n\t// Standard logging ...\n\tk3d::log() << info << \"Starting Frame \" << FrameDirectory.native_console_string() << std::endl;\n\n\t// Switch the frame status to running ...\n\tk3d::filesystem::rename(FrameDirectory / k3d::filesystem::generic_path(\"ready\"), FrameDirectory / k3d::filesystem::generic_path(\"running\"));\n\n\t// Load the frame options file ...\n\telement xml_frame_options(\"empty\");\n\tconst k3d::filesystem::path control_file_path = FrameDirectory / k3d::filesystem::generic_path(\"control.k3d\");\n\ttry\n\t{\n\t\tk3d::filesystem::ifstream stream(control_file_path);\n\t\thide_progress progress;\n\t\tparse(xml_frame_options, stream, control_file_path.native_console_string(), progress);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tk3d::log() << error << \"Frame \" << FrameDirectory.native_console_string() << \" error parsing control file \" << control_file_path.native_console_string() << \" \" << e.what() << std::endl;\n\t\treturn false;\n\t}\n\n\t// Get the frame data ...\n\telement* const xml_frame = find_element(xml_frame_options, \"frame\");\n\tif(!xml_frame)\n\t{\n\t\tk3d::log() << error << \"Missing <frame> data in control file \" << control_file_path.native_console_string() << std::endl;\n\t\treturn false;\n\t}\n\n\t// Setup our execution environment ...\n\tchdir(FrameDirectory.native_filesystem_string().c_str());\n\n\tfor(element::elements_t::iterator xml_command = xml_frame->children.begin(); xml_command != xml_frame->children.end(); ++xml_command)\n\t\texecute_command(*xml_command, FrameDirectory);\n\n\t// Switch the frame status to complete ...\n\tk3d::filesystem::rename(FrameDirectory / k3d::filesystem::generic_path(\"running\"), FrameDirectory / k3d::filesystem::generic_path(\"complete\"));\n\n\t// Standard logging ...\n\tk3d::log() << info << \"Completed Frame \" << FrameDirectory.native_console_string() << std::endl;\n\n\treturn true;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// usage\n\n/// Prints usage info\nvoid usage(const k3d::string_t& Name, std::ostream& Stream)\n{\n\tStream << \"usage: \" << Name << \" [options]\" << std::endl;\n\tStream << \"       \" << Name << \" [directory ...]\" << std::endl;\n\tStream << std::endl;\n\tStream << \"  -h, --help               prints this help information and exits\" << std::endl;\n\tStream << \"      --version            prints program version information and exits\" << std::endl;\n\tStream << std::endl;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// version\n\n/// Prints version info\nvoid print_version(std::ostream& Stream)\n{\n\tStream << \"K-3D version \" << K3D_VERSION << std::endl;\n\tStream << K3D_COPYRIGHT << \"  See the AUTHORS file for contributors.\" << std::endl;\n\tStream << \"Licensed by the GNU General Public License.  See the COPYING file for details.\" << std::endl;\n\tStream << \"K-3D Home Page: http://www.k-3d.org\" << std::endl;\n\tStream << std::endl;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup_logging\n\n/// Sets-up options for logging our output\nvoid setup_logging(const k3d::string_t& ProcessName)\n{\n\tk3d::log_show_timestamps(g_show_timestamps);\n\tk3d::log_set_tag(g_show_process ? \"[\" + ProcessName + \"]\" : k3d::string_t());\n\tk3d::log_color_level(g_color_level);\n\tk3d::log_show_level(true);\n\tk3d::log_syslog(g_syslog);\n\tk3d::log_minimum_level(g_minimum_log_level);\n}\n\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// main\n\n/// Program main\nint main(int argc, char* argv[])\n{\n\tconst k3d::string_t program_name = k3d::filesystem::native_path(k3d::ustring::from_utf8(k3d::string_t(argv[0]))).leaf().raw();\n\n\t// Put our arguments in a more useable form ...\n\tdetail::string_array options(&argv[1], &argv[argc]);\n\n\t// Print a \"help\" message ...\n\tif(std::count(options.begin(), options.end(), \"-h\") || std::count(options.begin(), options.end(), \"--help\"))\n\t{\n\t\tdetail::usage(program_name, std::cout);\n\t\treturn 0;\n\t}\n\n\t// Print version data ...\n\tif(options.end() != std::find(options.begin(), options.end(), \"--version\"))\n\t{\n\t\tdetail::print_version(std::cout);\n\t\treturn 0;\n\t}\n\n\t// Otherwise we should have a minimum of two arguments ...\n\tif(options.size() < 1)\n\t{\n\t\tdetail::usage(program_name, k3d::log());\n\t\treturn 1;\n\t}\n\n\t// Setup logging right away ...\n\tdetail::setup_logging(program_name);\n\n\t// Each remaining argument should be a frame path to render ...\n\tint result = 0;\n\tfor(unsigned long j = 0; j < options.size(); j++)\n\t{\n\t\tif(!detail::render_frame(k3d::filesystem::native_path(k3d::ustring::from_utf8(options[j]))))\n\t\t    result = 1;\n\t}\n\n\treturn result;\n}\n\n"
  },
  {
    "path": "renderjob/CMakeLists.txt",
    "content": "PROJECT(renderjob)\n\nINCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GLIBMM_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_SIGC_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${K3D_GLIBMM_LIB_DIRS})\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nADD_EXECUTABLE(k3d-renderjob\n  main.cpp\n  )\n\nSET_TARGET_PROPERTIES(k3d-renderjob PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY ${K3D_RUNTIME_OUTPUT_DIRECTORY}\n  )\n\nTARGET_LINK_LIBRARIES(k3d-renderjob\n  k3dsdk\n  )\n\nIF(WIN32 AND K3D_COMPILER_GCC)\n\tSET_TARGET_PROPERTIES(k3d-renderjob PROPERTIES LINK_FLAGS -mwindows)\nENDIF()\n\nINSTALL(TARGETS k3d-renderjob DESTINATION bin)\n\n"
  },
  {
    "path": "renderjob/main.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2008, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n\t\\author Romain Behar (romainbehar@yahoo.com)\n*/\n\n#include <k3d-platform-config.h>\n#include <k3d-version-config.h>\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/log_control.h>\n#include <k3dsdk/path.h>\n#include <k3dsdk/system.h>\n#include <k3dsdk/utility.h>\n\n#include <algorithm>\n#include <iostream>\n#include <vector>\n\nnamespace detail\n{\n\ntypedef std::vector<std::string> string_array;\n\nbool g_show_timestamps = false;\nbool g_show_process = true;\nbool g_syslog = false;\nbool g_color_level = false;\nk3d::log_level_t g_minimum_log_level = k3d::K3D_LOG_LEVEL_DEBUG;\n\n/////////////////////////////////////////////////////////////////////////////\n// render_job\n\nbool render_job(const k3d::filesystem::path& JobDirectory)\n{\n\t// Sanity checks ...\n\tif(!k3d::filesystem::exists(JobDirectory))\n\t{\n\t\tk3d::log() << error << \"Job directory \" << JobDirectory.native_console_string() << \" does not exist\" << std::endl;\n\t\treturn false;\n\t}\n\n\tif(!k3d::filesystem::is_directory(JobDirectory))\n\t{\n\t\tk3d::log() << error << \"Job directory \" << JobDirectory.native_console_string() << \" is not a directory\" << std::endl;\n\t\treturn false;\n\t}\n\n\t// Skip the job if it's complete ...\n\tif(k3d::filesystem::exists(JobDirectory / k3d::filesystem::generic_path(\"complete\")))\n\t\treturn true;\n\n\t// Skip the job if it errored out ...\n\tif(k3d::filesystem::exists(JobDirectory / k3d::filesystem::generic_path(\"error\")))\n\t\treturn true;\n\n\t// Skip the job if it's running ...\n\tif(k3d::filesystem::exists(JobDirectory / k3d::filesystem::generic_path(\"running\")))\n\t\treturn true;\n\n\t// Make sure the job is ready ...\n\tif(!k3d::filesystem::exists(JobDirectory / k3d::filesystem::generic_path(\"ready\")))\n\t{\n\t\tk3d::log() << error << \"Job \" << JobDirectory.native_console_string() << \" is not ready\" << std::endl;\n\t\treturn false;\n\t}\n\n\t// Standard logging ...\n\tk3d::log() << info << \"Starting Job \" << JobDirectory.native_console_string() << std::endl;\n\n\t// Switch the job status to running ...\n\tk3d::filesystem::rename(JobDirectory / k3d::filesystem::generic_path(\"ready\"), JobDirectory / k3d::filesystem::generic_path(\"running\"));\n\n\t// For each directory in the job directory (non-recursive) ...\n\tfor(k3d::filesystem::directory_iterator frame(JobDirectory); frame != k3d::filesystem::directory_iterator(); ++frame)\n\t{\n\t\tif(!k3d::filesystem::is_directory(*frame))\n\t\t\tcontinue;\n\n\t\tconst std::string commandline(\"k3d-renderframe \\\"\" + frame->native_filesystem_string() + \"\\\"\");\n\t\tk3d::system::spawn_sync(commandline);\n\t}\n\n\t// Switch the job status to complete ...\n\tk3d::filesystem::rename(JobDirectory / k3d::filesystem::generic_path(\"running\"), JobDirectory / k3d::filesystem::generic_path(\"complete\"));\n\n\t// Standard logging ...\n\tk3d::log() << info << \"Completed Job \" << JobDirectory.native_console_string() << std::endl;\n\n\treturn true;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n// usage\n\n/// Prints usage info\nvoid usage(const std::string& Name, std::ostream& Stream)\n{\n\tStream << \"usage: \" << Name << \" [options]\" << std::endl;\n\tStream << \"       \" << Name << \" [directory ...]\" << std::endl;\n\tStream << std::endl;\n\tStream << \"  -h, --help               prints this help information and exits\" << std::endl;\n\tStream << \"      --version            prints program version information and exits\" << std::endl;\n\tStream << std::endl;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n// version\n\n/// Prints version info\nvoid print_version(std::ostream& Stream)\n{\n\tStream << \"K-3D Version \" << K3D_VERSION << std::endl;\n\tStream << K3D_COPYRIGHT << \"  See the AUTHORS file for contributors.\" << std::endl;\n\tStream << \"Licensed by the GNU General Public License.  See the COPYING file for details.\" << std::endl;\n\tStream << \"K-3D Home Page: http://www.k-3d.org\" << std::endl;\n\tStream << std::endl;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// setup_logging\n\n/// Sets-up options for logging our output\nvoid setup_logging(const std::string& ProcessName)\n{\n\tk3d::log_show_timestamps(g_show_timestamps);\n\tk3d::log_set_tag(g_show_process ? \"[\" + ProcessName + \"]\" : std::string());\n\tk3d::log_color_level(g_color_level);\n\tk3d::log_show_level(true);\n\tk3d::log_syslog(g_syslog);\n\tk3d::log_minimum_level(g_minimum_log_level);\n}\n\n} // namespace detail\n\n/// Program main\nint main(int argc, char* argv[])\n{\n#ifndef K3D_API_WIN32\n\t// Fork ourselves so we don't become a zombie of the K-3D executable\n\tconst int fork_result = fork();\n\tif(fork_result < 0)\n\t\treturn 1;\n\telse if(fork_result > 0)\n\t\treturn 0;\n#endif // !K3D_API_WIN32\n\n\tconst std::string program_name = k3d::filesystem::native_path(k3d::ustring::from_utf8(std::string(argv[0]))).leaf().raw();\n\n\t// Put our command-line arguments in a more useable form ...\n\tdetail::string_array options(&argv[1], &argv[argc]);\n\n\t// Print a \"help\" message ...\n\tif(std::count(options.begin(), options.end(), \"-h\") || std::count(options.begin(), options.end(), \"--help\"))\n\t{\n\t\tdetail::usage(program_name, std::cout);\n\t\treturn 0;\n\t}\n\n\t// Print version data ...\n\tif(std::count(options.begin(), options.end(), \"--version\"))\n\t{\n\t\tdetail::print_version(std::cout);\n\t\treturn 0;\n\t}\n\n\t// Otherwise we should have a minimum of one argument ...\n\tif(options.size() < 1)\n\t{\n\t\tdetail::usage(program_name, k3d::log());\n\t\treturn 1;\n\t}\n\n\t// Setup logging right away ...\n\tdetail::setup_logging(program_name);\n\n\t// Each remaining argument should be a job path to render ...\n\tint result = 0;\n\tfor(unsigned long j = 0; j < options.size(); j++)\n\t{\n\t\tif(!detail::render_job(k3d::filesystem::native_path(k3d::ustring::from_utf8(options[j]))))\n\t\t\tresult = 1;\n\t}\n\n\treturn result;\n}\n\n"
  },
  {
    "path": "resource-compiler/CMakeLists.txt",
    "content": "PROJECT(k3d-resource-compiler)\n\nINCLUDE_DIRECTORIES(\n\t${Boost_INCLUDE_DIRS}\n\t)\n\nADD_EXECUTABLE(k3d-resource-compiler\n\tmain.cpp\n\t)\n\nSET_TARGET_PROPERTIES(k3d-resource-compiler PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY ${K3D_RUNTIME_OUTPUT_DIRECTORY}\n  )\n\nTARGET_LINK_LIBRARIES(k3d-resource-compiler\n\t${Boost_PROGRAM_OPTIONS_LIBRARY}\n\t)\n\n"
  },
  {
    "path": "resource-compiler/main.cpp",
    "content": "#include <boost/algorithm/string.hpp>\n#include <boost/cstdint.hpp>\n#include <boost/program_options.hpp>\n\n#include <fstream>\n#include <iomanip>\n#include <iostream>\n\nnamespace po = boost::program_options;\n\nvoid generate_resource(const std::string& InputPath, std::istream& Input, const std::string& ResourcePath, std::ostream& Output)\n{\n\tOutput << \"//////////////////////////////////////////\\n\";\n\tOutput << \"// Generated file, do not edit by hand! //\\n\";\n\tOutput << \"//////////////////////////////////////////\\n\\n\";\n\n\tOutput << \"#include <k3dsdk/resource/resource.h>\\n\\n\";\n\n\tOutput << \"// Resource compiled from \" << InputPath << \"\\n\\n\";\n\n\tOutput << \"static unsigned char resource_data[] = {\";\n\tint64_t byte_count = 0;\n\tOutput << std::hex << std::setfill('0');\n\tfor(int c = Input.get(); Input; c = Input.get(), ++byte_count)\n\t{\n\t\tif(0 != byte_count)\n\t\t\tOutput << \", \";\n\n\t\tif(0 == byte_count % 8)\n\t\t\tOutput << \"\\n\\t\";\n\n\t\tOutput << \"0x\" << std::setw(2) << c;\n\t}\n\tOutput << std::dec << \"\\n};\\n\\n\";\n\n\tOutput << \"static bool success = k3d::resource::initialize(\\\"\" << ResourcePath << \"\\\", &resource_data[0], \" << byte_count << \");\\n\\n\";\n}\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\tpo::options_description visible_options(\"Usage: k3d-resource-compiler [OPTIONS] --input FILE --path RESOURCE --output FILE\");\n\t\tvisible_options.add_options()\n\t\t\t(\"help,h\", \"Prints this help message and exits.\")\n\t\t\t(\"input\", po::value<std::string>(), \"Input file to be compiled.\")\n\t\t\t(\"path\", po::value<std::string>(), \"Output resource path.\")\n\t\t\t(\"output\", po::value<std::string>(), \"Output resource file. Use \\\"-\\\" for stdout.\")\n\t\t\t;\n\n\t\tpo::variables_map options;\n\t\tpo::store(po::parse_command_line(argc, argv, visible_options), options);\n\t\tpo::notify(options);\n\n\t\tif(options.count(\"help\"))\n\t\t{\n\t\t\tstd::cout << visible_options << \"\\n\";\n\t\t\treturn 0;\n\t\t}\n\n\t\tif(!options.count(\"input\"))\n\t\t\tthrow std::runtime_error(\"missing input file\");\n\t\tstd::string input_path = options[\"input\"].as<std::string>();\n\t\tstd::ifstream input_stream(input_path.c_str());\n\n\t\tif(!options.count(\"path\"))\n\t\t\tthrow std::runtime_error(\"missing output path\");\n\t\tstd::string resource_path = options[\"path\"].as<std::string>();\n\n\t\t// This is a lousy damn hack, but the !@#$! msys shell automatically converts relative paths into\n\t\t// absolute paths, so we wrap the resource path in XML-style <path>...</path> \n\t\tboost::replace_first(resource_path, \"<path>\", \"\");\n\t\tboost::replace_last(resource_path, \"</path>\", \"\");\n\n\t\tstd::string output_path = \"-\";\n\t\tif(options.count(\"output\"))\n\t\t\toutput_path = options[\"output\"].as<std::string>();\n\n\t\tif(output_path == \"-\")\n\t\t{\n\t\t\tgenerate_resource(input_path, input_stream, resource_path, std::cout);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstd::ofstream output_stream(output_path.c_str());\n\t\t\tgenerate_resource(input_path, input_stream, resource_path, output_stream);\n\t\t}\n\n\t\treturn 0;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << \"K-3D Resource Compiler: \" << e.what() << std::endl;\n\t}\n\tcatch(...)\n\t{\n\t\tstd::cerr << \"K-3D Resource Compiler: unknown exception\" << std::endl;\n\t}\n\n\treturn 1;\n}\n\n"
  },
  {
    "path": "share/CMakeLists.txt",
    "content": "PROJECT(share)\n\nFUNCTION(K3D_ADD_SHARE_FILES PATTERN TARGET)\n\tFILE(GLOB FILE_LIST ${PATTERN})\n\n\tFILE(MAKE_DIRECTORY ${K3D_SHARE_OUTPUT_DIRECTORY}/${TARGET})\n\tFOREACH(FILE ${FILE_LIST})\n\t\tCONFIGURE_FILE(${FILE} ${K3D_SHARE_OUTPUT_DIRECTORY}/${TARGET} COPYONLY)\n\tENDFOREACH()\n\n\tINSTALL(FILES ${FILE_LIST} DESTINATION share/${TARGET})\nENDFUNCTION()\n\nK3D_ADD_SUBDIRECTORY(man REQUIRES K3D_BUILD_DOCS)\nADD_SUBDIRECTORY(k3d)\n"
  },
  {
    "path": "share/k3d/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.k3d \"k3d\")\n\nADD_SUBDIRECTORY(documents)\nADD_SUBDIRECTORY(fonts)\nADD_SUBDIRECTORY(geometry)\nK3D_ADD_SUBDIRECTORY(guide REQUIRES K3D_BUILD_GUIDE)\nADD_SUBDIRECTORY(icons)\nADD_SUBDIRECTORY(logo)\nADD_SUBDIRECTORY(lsystem)\nADD_SUBDIRECTORY(ngui)\nADD_SUBDIRECTORY(qtui)\nADD_SUBDIRECTORY(scripts)\nADD_SUBDIRECTORY(shaders)\nADD_SUBDIRECTORY(textures)\n\n"
  },
  {
    "path": "share/k3d/aspect_ratios.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<application>\n\t\t<aspectratios>\n\t\t\t<aspectratio name=\"NTSC\" description=\"\" value=\"1.33\"/>\n\t\t\t<aspectratio name=\"Square\" description=\"\" value=\"1\"/>\n\t\t\t<aspectratio name=\"Full Camera Aperture\" description=\"\" value=\"1.33\"/>\n\t\t\t<aspectratio name=\"Academy Full Frame\" description=\"\" value=\"1.37\"/>\n\t\t\t<aspectratio name=\"Academy Projection\" description=\"\" value=\"1.66\"/>\n\t\t\t<aspectratio name=\"Academy Projection\" description=\"\" value=\"1.85\"/>\n\t\t\t<aspectratio name=\"Anamorphic Squeezed\" description=\"\" value=\"1.18\"/>\n\t\t\t<aspectratio name=\"Anamorphic Unsqueezed\" description=\"\" value=\"2.35\"/>\n\t\t</aspectratios>\n\t</application>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/documents/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.k3d k3d/documents)\n\nADD_SUBDIRECTORY(animation)\n\n"
  },
  {
    "path": "share/k3d/documents/animation/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.k3d k3d/documents/animation)\n\n"
  },
  {
    "path": "share/k3d/documents/animation/arc_length.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml package=\"k3d\" version=\"0.8.0.0\" host=\"Linux-2.6.31-14-generic;i686\">\n\t<document>\n\t\t<nodes>\n\t\t\t<node name=\"Axes\" factory=\"00000001 00000000 00000000 00000001\" id=\"2\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"axes\">true</property>\n\t\t\t\t\t<property name=\"xyplane\">false</property>\n\t\t\t\t\t<property name=\"yzplane\">false</property>\n\t\t\t\t\t<property name=\"xzplane\">true</property>\n\t\t\t\t\t<property name=\"gridsize\">2</property>\n\t\t\t\t\t<property name=\"gridcount\">5</property>\n\t\t\t\t\t<property name=\"xcolor\">1 0 0</property>\n\t\t\t\t\t<property name=\"ycolor\">0 0.69999999999999996 0</property>\n\t\t\t\t\t<property name=\"zcolor\">0 0 0.69999999999999996</property>\n\t\t\t\t\t<property name=\"gridcolor\">0.40000000000000002 0.40000000000000002 0.40000000000000002</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/Vera.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"font_size\">12</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera\" factory=\"45ce1872 af184b6d b391e136 0dcfe8b5\" id=\"3\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"navigation_target\">3</property>\n\t\t\t\t\t<property name=\"world_target\">0 -5 0</property>\n\t\t\t\t\t<property name=\"aspect_ratio\"/>\n\t\t\t\t\t<property name=\"show_projection\">false</property>\n\t\t\t\t\t<property name=\"orthographic\">false</property>\n\t\t\t\t\t<property name=\"left\">-0.106255705250553</property>\n\t\t\t\t\t<property name=\"right\">0.106255705250553</property>\n\t\t\t\t\t<property name=\"top\">0.07969177893791476</property>\n\t\t\t\t\t<property name=\"bottom\">-0.07969177893791476</property>\n\t\t\t\t\t<property name=\"near\">1</property>\n\t\t\t\t\t<property name=\"far\">1000</property>\n\t\t\t\t\t<property name=\"crop_window_left\">0</property>\n\t\t\t\t\t<property name=\"crop_window_right\">1</property>\n\t\t\t\t\t<property name=\"crop_window_top\">0</property>\n\t\t\t\t\t<property name=\"crop_window_bottom\">1</property>\n\t\t\t\t\t<property name=\"show_reference_plane\">false</property>\n\t\t\t\t\t<property name=\"reference_plane\">0</property>\n\t\t\t\t\t<property name=\"reference_plane_color\">0 0 0.69999999999999996</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"CameraViewport\" factory=\"0059ba47 7bf740f3 93fb523d 5899f22c\" id=\"4\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"point_size\">4</property>\n\t\t\t\t\t<property name=\"background_color\">0.80000000000000004 0.80000000000000004 0.80000000000000004</property>\n\t\t\t\t\t<property name=\"fog\">false</property>\n\t\t\t\t\t<property name=\"fog_near\">0</property>\n\t\t\t\t\t<property name=\"fog_far\">100</property>\n\t\t\t\t\t<property name=\"headlight\">true</property>\n\t\t\t\t\t<property name=\"show_lights\">false</property>\n\t\t\t\t\t<property name=\"draw_two_sided\">false</property>\n\t\t\t\t\t<property name=\"draw_safe_zone\">false</property>\n\t\t\t\t\t<property name=\"draw_aimpoint\">true</property>\n\t\t\t\t\t<property name=\"draw_crop_window\">true</property>\n\t\t\t\t\t<property name=\"draw_frustum\">true</property>\n\t\t\t\t\t<property name=\"node_selection\">5</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light\" factory=\"00000001 00000000 00000000 0000001d\" id=\"6\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"shader\">7</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"LightShader\" factory=\"830e867b 7bc94c6c 8d5087ee 8aa35db2\" id=\"7\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/light/k3d_pointlight.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"from\" label=\"\" description=\"\" type=\"k3d::point3\" user_property=\"generic\">0 0 0</property>\n\t\t\t\t\t<property name=\"intensity\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">3000</property>\n\t\t\t\t\t<property name=\"lightcolor\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Material\" factory=\"00000001 00000000 00000000 00000024\" id=\"8\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"surface_shader\">9</property>\n\t\t\t\t\t<property name=\"displacement_shader\">0</property>\n\t\t\t\t\t<property name=\"atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"interior_shader\">0</property>\n\t\t\t\t\t<property name=\"exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"matte\">false</property>\n\t\t\t\t\t<property name=\"displacement_bounds\">1</property>\n\t\t\t\t\t<property name=\"color\">1 1 1</property>\n\t\t\t\t\t<property name=\"opacity\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"MaterialShader\" factory=\"b553a3bd d1044c6e b3f21e07 87132c31\" id=\"9\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/surface/k3d_paintedplastic.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"Ka\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">1</property>\n\t\t\t\t\t<property name=\"Kd\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t\t<property name=\"Ks\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t\t<property name=\"roughness\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0.1</property>\n\t\t\t\t\t<property name=\"specularcolor\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t\t<property name=\"texturename\" label=\"\" description=\"\" type=\"k3d::ri::itexture*\" user_property=\"generic\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyCube\" factory=\"7ec966d1 d78a445c 8806b8a3 5593f241\" id=\"10\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">8</property>\n\t\t\t\t\t<property name=\"columns\">1</property>\n\t\t\t\t\t<property name=\"rows\">1</property>\n\t\t\t\t\t<property name=\"slices\">1</property>\n\t\t\t\t\t<property name=\"width\">5</property>\n\t\t\t\t\t<property name=\"height\">5</property>\n\t\t\t\t\t<property name=\"depth\">5</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyCube Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"11\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">12</property>\n\t\t\t\t\t<property name=\"ri_painter\">13</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyCube Instance 2\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"14\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">12</property>\n\t\t\t\t\t<property name=\"ri_painter\">13</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TimeSource\" factory=\"1978f1f7 4a864c99 8caf7cfc d2591baf\" id=\"15\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"start_time\">0</property>\n\t\t\t\t\t<property name=\"end_time\">4.03</property>\n\t\t\t\t\t<property name=\"frame_rate\">30</property>\n\t\t\t\t\t<property name=\"time\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TransformFilterScript\" factory=\"acafcc85 a0bf4d69 99592c4f 7cf9b35c\" id=\"16\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"script\">#python\n\nimport k3d\n\nimport sys\nimport os\nsys.path.append(os.path.join(str(k3d.share_path()), &quot;scripts&quot;, &quot;animation&quot;))\n\nfrom keyframes import *\n\n# Duration of the move\nd = 4\n\ncurve = nucurve(4)\ncurve.control_points.append(control_point(k3d.vector3(-13, 0, 0), 1.0)) # First keyframe\ncurve.control_points.append(control_point(k3d.vector3(-13, -10, 0), 1.0)) # Tangent\ncurve.control_points.append(control_point(k3d.vector3(13, 10, 0), 1.0))   # Tangent\ncurve.control_points.append(control_point(k3d.vector3(13, 0, 0), 1.0))   # Second keyframe\ncurve.knots = [0, 0, 0, 0, d, d, d, d] # Bezier knots\n\narcs = get_arc_lengths(curve, 0.001)\n\nt = mix(0, arcs[len(arcs)-1].length, Node.time / d)\nOutput = k3d.translate3(get_uniform_arc_length_position(arcs, t))</property>\n\t\t\t\t\t<property name=\"time\" label=\"Time\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TransformFilterScript 2\" factory=\"acafcc85 a0bf4d69 99592c4f 7cf9b35c\" id=\"17\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"script\">#python\n\nimport k3d\n\nimport sys\nimport os\nsys.path.append(os.path.join(str(k3d.share_path()), &quot;scripts&quot;, &quot;animation&quot;))\n\nfrom keyframes import *\n\n# Duration of the move\nd = 4\n\ncurve = nucurve(4)\ncurve.control_points.append(control_point(k3d.vector3(-13, 0, 0), 1.0)) # First keyframe\ncurve.control_points.append(control_point(k3d.vector3(-13, -10, 0), 1.0)) # Tangent\ncurve.control_points.append(control_point(k3d.vector3(13, 10, 0), 1.0))   # Tangent\ncurve.control_points.append(control_point(k3d.vector3(13, 0, 0), 1.0))   # Second keyframe\ncurve.knots = [0, 0, 0, 0, d, d, d, d] # Bezier knots\n\nOutput = k3d.translate3(evaluate(curve, Node.time))</property>\n\t\t\t\t\t<property name=\"time\" label=\"Time\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"With annotation\" factory=\"951d3c20 e2f74d6d 8bc90ef8 9a8967b6\" id=\"18\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/VeraBd.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"font_size\">14</property>\n\t\t\t\t\t<property name=\"line_width\">200</property>\n\t\t\t\t\t<property name=\"line_spacing\">1</property>\n\t\t\t\t\t<property name=\"alignment\">left</property>\n\t\t\t\t\t<property name=\"text\">With arc-length parameterization</property>\n\t\t\t\t\t<property name=\"color\">0 0.49193599999999998 0</property>\n\t\t\t\t\t<property name=\"leader\">false</property>\n\t\t\t\t\t<property name=\"leader_target\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<metadata name=\"text\">\n\t\t\t\t\t\t<pair name=\"k3d:property-type\">k3d:multi-line-text</pair>\n\t\t\t\t\t</metadata>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Without annotation\" factory=\"951d3c20 e2f74d6d 8bc90ef8 9a8967b6\" id=\"19\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/VeraBd.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"font_size\">14</property>\n\t\t\t\t\t<property name=\"line_width\">200</property>\n\t\t\t\t\t<property name=\"line_spacing\">1</property>\n\t\t\t\t\t<property name=\"alignment\">left</property>\n\t\t\t\t\t<property name=\"text\">Without arc-length parameterization</property>\n\t\t\t\t\t<property name=\"color\">0.64705900000000005 0.16470599999999999 0.16470599999999999</property>\n\t\t\t\t\t<property name=\"leader\">false</property>\n\t\t\t\t\t<property name=\"leader_target\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<metadata name=\"text\">\n\t\t\t\t\t\t<pair name=\"k3d:property-type\">k3d:multi-line-text</pair>\n\t\t\t\t\t</metadata>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"20\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 0 0 1 0 0 0 0 1 -172.649 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"21\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -20 0 1 0 20 0 0 1 -30 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"22\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">0.20000000000000001 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"23\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">0.20000000000000001 0 0 0 0 1 0 -3 0 0 1 0 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"24\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -16.164000000000001 0 1 0 -3.3588300000000002 0 0 1 0 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"25\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -19.356999999999999 0 1 0 3.14357 0 0 1 0 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Default Painter\" factory=\"6bc7d8a1 bbe7491f a2405d97 8b136c41\" id=\"12\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">26</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">27</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">28</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">29</property>\n\t\t\t\t\t<property name=\"edges\" label=\"Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">30</property>\n\t\t\t\t\t<property name=\"face_normals\" label=\"Face Normals\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">31</property>\n\t\t\t\t\t<property name=\"face_orientation\" label=\"Face Orientation\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">32</property>\n\t\t\t\t\t<property name=\"faces\" label=\"Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">33</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">34</property>\n\t\t\t\t\t<property name=\"nurbs_curves\" label=\"NURBS Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">35</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">36</property>\n\t\t\t\t\t<property name=\"points\" label=\"Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">37</property>\n\t\t\t\t\t<property name=\"sds_edges\" label=\"SDS Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">0</property>\n\t\t\t\t\t<property name=\"sds_faces\" label=\"SDS Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">38</property>\n\t\t\t\t\t<property name=\"sds_points\" label=\"SDS Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Point Painter\" factory=\"ad24a631 acbd4af1 bd6d6362 75c3d5d7\" id=\"37\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Edge Painter\" factory=\"172c1208 d24430f5 63f70388 1945866e\" id=\"30\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Painter\" factory=\"7e6e8354 604f05ae 1d4d658b 96538240\" id=\"33\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Face Painter\" factory=\"9d4043c8 864fe71b 38706d85 8b60af0c\" id=\"38\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Linear Curve Painter\" factory=\"6acd1d8e 954f4b3a bce4c296 523ebacd\" id=\"34\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cubic Curve Painter\" factory=\"cb30d291 47e146a3 b5167d0f 6f56bd61\" id=\"29\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Curve Painter\" factory=\"86705b44 ef534dc4 86d9fc7a 8709ec59\" id=\"35\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bilinear Patch Painter\" factory=\"f172b866 fce74aa8 a9e792ff 630653f3\" id=\"27\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bicubic Patch Painter\" factory=\"e058ab07 44384acd ba321d58 cdb3ef25\" id=\"26\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Patch Painter\" factory=\"8881a190 9d1c4e6f 8b8c0523 2dc43fda\" id=\"36\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Blobby Point Painter\" factory=\"06148329 b2264760 84b25aab f8401c63\" id=\"28\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Normal Painter\" factory=\"02d092ca 84405ff6 4fe806a9 ab886cb1\" id=\"31\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Orientation Painter\" factory=\"7bc1ee5f 45802906 323984bf cbe858d6\" id=\"32\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Renderman Default Painter\" factory=\"243cba5a 13f342fa 8f1a19cd faf34169\" id=\"13\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">39</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">40</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">41</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">42</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">43</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">44</property>\n\t\t\t\t\t<property name=\"point_groups\" label=\"Point Groups\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">45</property>\n\t\t\t\t\t<property name=\"polyhedra\" label=\"Polyhedra\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">46</property>\n\t\t\t\t\t<property name=\"subdivision_surfaces\" label=\"Subdivision Surfaces\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">47</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Point Group Painter\" factory=\"06fab90b 2f034d69 b4a1cb9f b9864144\" id=\"45\"/>\n\t\t\t<node name=\"RenderMan Polyhedron Painter\" factory=\"0771ea79 6c8c4c6d 8bab8c83 42fc73e9\" id=\"46\"/>\n\t\t\t<node name=\"RenderMan Subdivision Surface Painter\" factory=\"4d6fae39 723e4ed3 bc5735c5 3b75edc0\" id=\"47\"/>\n\t\t\t<node name=\"RenderMan Linear Curve Painter\" factory=\"f8b19206 a0ae4bd1 b3548a15 1209469e\" id=\"43\"/>\n\t\t\t<node name=\"RenderMan Cubic Curve Painter\" factory=\"8c5be7c4 0e8d43c5 a1daace4 a79275d7\" id=\"42\"/>\n\t\t\t<node name=\"RenderMan Bilinear Patch Painter\" factory=\"3f51b275 5a664903 96ed9168 503e30f0\" id=\"40\"/>\n\t\t\t<node name=\"RenderMan Bicubic Patch Painter\" factory=\"64dfefde eedc4047 b59fc8f6 972a9b86\" id=\"39\"/>\n\t\t\t<node name=\"RenderMan NURBS Patch Painter\" factory=\"120d87f0 fe05419f ae2d14ce ea9c32b4\" id=\"44\"/>\n\t\t\t<node name=\"RenderMan Blobby Painter\" factory=\"0221462c c3d44a12 97b39425 29774d3f\" id=\"41\"/>\n\t\t\t<node name=\"Node Selection\" factory=\"5d305922 d2442343 077956b6 b112b9b3\" id=\"5\">\n\t\t\t\t<metadata>\n\t\t\t\t\t<pair name=\"ngui:unique_node\">node_selection</pair>\n\t\t\t\t</metadata>\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"selection_weights\"> 17 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t</nodes>\n\t\t<dependencies>\n\t\t\t<dependency from_node=\"20\" from_property=\"output_matrix\" to_node=\"3\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"22\" from_property=\"output_matrix\" to_node=\"11\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"10\" from_property=\"output_mesh\" to_node=\"11\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"21\" from_property=\"output_matrix\" to_node=\"6\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"25\" from_property=\"output_matrix\" to_node=\"19\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"24\" from_property=\"output_matrix\" to_node=\"18\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"23\" from_property=\"output_matrix\" to_node=\"14\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"10\" from_property=\"output_mesh\" to_node=\"14\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"15\" from_property=\"time\" to_node=\"16\" to_property=\"time\"/>\n\t\t\t<dependency from_node=\"15\" from_property=\"time\" to_node=\"17\" to_property=\"time\"/>\n\t\t\t<dependency from_node=\"17\" from_property=\"output_matrix\" to_node=\"23\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"16\" from_property=\"output_matrix\" to_node=\"22\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"11\" from_property=\"output_matrix\" to_node=\"25\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"14\" from_property=\"output_matrix\" to_node=\"24\" to_property=\"input_matrix\"/>\n\t\t</dependencies>\n\t</document>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/documents/animation/digital_clock.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml package=\"k3d\" version=\"0.8.0.0\" host=\"Linux-2.6.31-14-generic;i686\">\n\t<document>\n\t\t<nodes>\n\t\t\t<node name=\"Axes\" factory=\"00000001 00000000 00000000 00000001\" id=\"2\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"axes\">true</property>\n\t\t\t\t\t<property name=\"xyplane\">true</property>\n\t\t\t\t\t<property name=\"yzplane\">false</property>\n\t\t\t\t\t<property name=\"xzplane\">false</property>\n\t\t\t\t\t<property name=\"gridsize\">2</property>\n\t\t\t\t\t<property name=\"gridcount\">5</property>\n\t\t\t\t\t<property name=\"xcolor\">1 0 0</property>\n\t\t\t\t\t<property name=\"ycolor\">0 0.69999999999999996 0</property>\n\t\t\t\t\t<property name=\"zcolor\">0 0 0.69999999999999996</property>\n\t\t\t\t\t<property name=\"gridcolor\">0.40000000000000002 0.40000000000000002 0.40000000000000002</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/Vera.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"font_size\">12</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Engine\" factory=\"0059ba47 7bf740f3 93fb523d 5899f22c\" id=\"3\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"point_size\">4</property>\n\t\t\t\t\t<property name=\"background_color\">0.80000000000000004 0.80000000000000004 0.80000000000000004</property>\n\t\t\t\t\t<property name=\"fog\">false</property>\n\t\t\t\t\t<property name=\"fog_near\">0</property>\n\t\t\t\t\t<property name=\"fog_far\">100</property>\n\t\t\t\t\t<property name=\"headlight\">true</property>\n\t\t\t\t\t<property name=\"show_lights\">false</property>\n\t\t\t\t\t<property name=\"draw_two_sided\">true</property>\n\t\t\t\t\t<property name=\"draw_safe_zone\">false</property>\n\t\t\t\t\t<property name=\"draw_aimpoint\">true</property>\n\t\t\t\t\t<property name=\"draw_crop_window\">true</property>\n\t\t\t\t\t<property name=\"draw_frustum\">true</property>\n\t\t\t\t\t<property name=\"node_selection\">4</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TimeSource\" factory=\"1978f1f7 4a864c99 8caf7cfc d2591baf\" id=\"5\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"start_time\">0</property>\n\t\t\t\t\t<property name=\"end_time\">4</property>\n\t\t\t\t\t<property name=\"frame_rate\">30</property>\n\t\t\t\t\t<property name=\"time\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera\" factory=\"45ce1872 af184b6d b391e136 0dcfe8b5\" id=\"6\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"navigation_target\">6</property>\n\t\t\t\t\t<property name=\"world_target\">1.4061307478654061 0.49132219883008843 1.1265517241379308</property>\n\t\t\t\t\t<property name=\"aspect_ratio\"/>\n\t\t\t\t\t<property name=\"show_projection\">false</property>\n\t\t\t\t\t<property name=\"orthographic\">false</property>\n\t\t\t\t\t<property name=\"left\">-0.6666666666666666</property>\n\t\t\t\t\t<property name=\"right\">0.6666666666666666</property>\n\t\t\t\t\t<property name=\"top\">0.5</property>\n\t\t\t\t\t<property name=\"bottom\">-0.5</property>\n\t\t\t\t\t<property name=\"near\">1</property>\n\t\t\t\t\t<property name=\"far\">1000</property>\n\t\t\t\t\t<property name=\"crop_window_left\">0</property>\n\t\t\t\t\t<property name=\"crop_window_right\">1</property>\n\t\t\t\t\t<property name=\"crop_window_top\">0</property>\n\t\t\t\t\t<property name=\"crop_window_bottom\">1</property>\n\t\t\t\t\t<property name=\"show_reference_plane\">false</property>\n\t\t\t\t\t<property name=\"reference_plane\">0</property>\n\t\t\t\t\t<property name=\"reference_plane_color\">0 0 0.69999999999999996</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"7\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">0.78210947412841769 0.27459565712481632 0.55937643458297415 -14.996029458226156 0.62314105183222368 -0.34464727425735531 -0.70207797705696851 21.077808766576524 -1.3492896036582103e-16 0.8976722572493625 -0.44066372503853135 14.047791462246893 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Default Painter\" factory=\"243cba5a 13f342fa 8f1a19cd faf34169\" id=\"8\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"particles\" label=\"Particles\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">9</property>\n\t\t\t\t\t<property name=\"polyhedra\" label=\"Polyhedra\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">10</property>\n\t\t\t\t\t<property name=\"subdivision_surfaces\" label=\"Subdivision Surfaces\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">11</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">12</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">13</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">14</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">15</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">16</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">17</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">18</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">19</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">20</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">21</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">22</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">23</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">24</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">25</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Particle Painter\" factory=\"06fab90b 2f034d69 b4a1cb9f b9864144\" id=\"9\"/>\n\t\t\t<node name=\"RenderMan Polyhedron Painter\" factory=\"0771ea79 6c8c4c6d 8bab8c83 42fc73e9\" id=\"10\"/>\n\t\t\t<node name=\"RenderMan Subdivision Surface Painter\" factory=\"4d6fae39 723e4ed3 bc5735c5 3b75edc0\" id=\"11\"/>\n\t\t\t<node name=\"RenderMan Linear Curve Painter\" factory=\"f8b19206 a0ae4bd1 b3548a15 1209469e\" id=\"12\"/>\n\t\t\t<node name=\"RenderMan Cubic Curve Painter\" factory=\"8c5be7c4 0e8d43c5 a1daace4 a79275d7\" id=\"13\"/>\n\t\t\t<node name=\"RenderMan Bilinear Patch Painter\" factory=\"3f51b275 5a664903 96ed9168 503e30f0\" id=\"14\"/>\n\t\t\t<node name=\"RenderMan Bicubic Patch Painter\" factory=\"64dfefde eedc4047 b59fc8f6 972a9b86\" id=\"15\"/>\n\t\t\t<node name=\"RenderMan NURBS Patch Painter\" factory=\"120d87f0 fe05419f ae2d14ce ea9c32b4\" id=\"16\"/>\n\t\t\t<node name=\"RenderMan Blobby Painter\" factory=\"0221462c c3d44a12 97b39425 29774d3f\" id=\"17\"/>\n\t\t\t<node name=\"RenderMan Cone Painter\" factory=\"6612c455 774ed5d4 5ff0c495 6d920b8e\" id=\"18\"/>\n\t\t\t<node name=\"RenderMan Cylinder Painter\" factory=\"85a1d5ac 224449cf 202911a1 a2434ee8\" id=\"19\"/>\n\t\t\t<node name=\"RenderMan Disk Painter\" factory=\"6c92b34f 57480914 1708dca6 cc8651cc\" id=\"20\"/>\n\t\t\t<node name=\"RenderMan Hyperboloid Painter\" factory=\"8f5ac6bd f84bfac3 8585f08b 953e3df1\" id=\"21\"/>\n\t\t\t<node name=\"RenderMan Paraboloid Painter\" factory=\"49dafd22 d34c22e6 cb8e30b3 0f74f5ef\" id=\"22\"/>\n\t\t\t<node name=\"RenderMan Sphere Painter\" factory=\"a07012c4 ce4b11f4 92d5f48d 8f3751c0\" id=\"23\"/>\n\t\t\t<node name=\"RenderMan Teapot Painter\" factory=\"cf54aa9b 9c4e886c a8cf2fa2 470d44ed\" id=\"24\"/>\n\t\t\t<node name=\"RenderMan Torus Painter\" factory=\"d3865bdb 69469c71 2cc55a8b 420de184\" id=\"25\"/>\n\t\t\t<node name=\"Surface Shader\" factory=\"b553a3bd d1044c6e b3f21e07 87132c31\" id=\"26\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/surface/k3d_plastic.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"Ka\" label=\"Ambient\" description=\"Ambient Amount\" type=\"k3d::double_t\" user_property=\"generic\">1</property>\n\t\t\t\t\t<property name=\"Kd\" label=\"Diffuse\" description=\"Diffuse Amount\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t\t<property name=\"Ks\" label=\"Specular\" description=\"Specular Amount\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t\t<property name=\"roughness\" label=\"Roughness\" description=\"Surface Roughness (affects specular reflection size)\" type=\"k3d::double_t\" user_property=\"generic\">0.1</property>\n\t\t\t\t\t<property name=\"specularcolor\" label=\"Specular Color\" description=\"Specular Reflection Color\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManMaterial\" factory=\"00000001 00000000 00000000 00000024\" id=\"27\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"surface_shader\">26</property>\n\t\t\t\t\t<property name=\"displacement_shader\">0</property>\n\t\t\t\t\t<property name=\"atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"interior_shader\">0</property>\n\t\t\t\t\t<property name=\"exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"matte\">false</property>\n\t\t\t\t\t<property name=\"displacement_bounds\">1</property>\n\t\t\t\t\t<property name=\"color\">1 1 1</property>\n\t\t\t\t\t<property name=\"opacity\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Shader\" factory=\"830e867b 7bc94c6c 8d5087ee 8aa35db2\" id=\"28\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/light/k3d_pointlight.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"intensity\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">3000</property>\n\t\t\t\t\t<property name=\"lightcolor\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t\t<property name=\"from\" label=\"\" description=\"\" type=\"k3d::point3\" user_property=\"generic\">0 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light\" factory=\"00000001 00000000 00000000 0000001d\" id=\"29\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"shader\">28</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"30\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -20 0 1 0 20 0 0 1 30 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Material\" factory=\"00000001 00000002 00000003 00000004\" id=\"31\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"renderman_material\" label=\"RenderMan Material\" description=\"\" type=\"k3d::imaterial*\" user_property=\"generic\">27</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Aqsis\" factory=\"8d430069 63404829 053361ad fc6abda6\" id=\"32\"/>\n\t\t\t<node name=\"Pixie\" factory=\"7a1d773b a9472dae a80223ab 59d62f9a\" id=\"33\"/>\n\t\t\t<node name=\"RenderMan Engine\" factory=\"0dc5e733 fa684e05 86a3865f 42f7a99d\" id=\"34\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"visible_nodes\"> 35</property>\n\t\t\t\t\t<property name=\"enabled_lights\"> 29</property>\n\t\t\t\t\t<property name=\"render_engine\">32</property>\n\t\t\t\t\t<property name=\"resolution\"/>\n\t\t\t\t\t<property name=\"hider\"/>\n\t\t\t\t\t<property name=\"pixel_width\">320</property>\n\t\t\t\t\t<property name=\"pixel_height\">240</property>\n\t\t\t\t\t<property name=\"pixel_aspect_ratio\">1</property>\n\t\t\t\t\t<property name=\"default_atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"default_interior_shader\">0</property>\n\t\t\t\t\t<property name=\"default_exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"imager_shader\">0</property>\n\t\t\t\t\t<property name=\"bucket_width\">16</property>\n\t\t\t\t\t<property name=\"bucket_height\">16</property>\n\t\t\t\t\t<property name=\"grid_size\">256</property>\n\t\t\t\t\t<property name=\"eye_splits\">10</property>\n\t\t\t\t\t<property name=\"texture_memory\">1024</property>\n\t\t\t\t\t<property name=\"render_alpha\">false</property>\n\t\t\t\t\t<property name=\"pixel_xsamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_ysamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_filter\">gaussian</property>\n\t\t\t\t\t<property name=\"pixel_filter_width\">2</property>\n\t\t\t\t\t<property name=\"pixel_filter_height\">2</property>\n\t\t\t\t\t<property name=\"exposure\">1</property>\n\t\t\t\t\t<property name=\"gamma\">1</property>\n\t\t\t\t\t<property name=\"dof\">false</property>\n\t\t\t\t\t<property name=\"fstop\">0.3</property>\n\t\t\t\t\t<property name=\"focal_length\">1.6</property>\n\t\t\t\t\t<property name=\"focus_plane\">30</property>\n\t\t\t\t\t<property name=\"shading_rate\">1</property>\n\t\t\t\t\t<property name=\"shading_interpolation\">constant</property>\n\t\t\t\t\t<property name=\"two_sided\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"render_motion_blur\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Node Selection\" factory=\"5d305922 d2442343 077956b6 b112b9b3\" id=\"4\">\n\t\t\t\t<metadata>\n\t\t\t\t\t<pair name=\"ngui:unique_node\">node_selection</pair>\n\t\t\t\t</metadata>\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"selection_weights\"> 36 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Default Painter\" factory=\"6bc7d8a1 bbe7491f a2405d97 8b136c41\" id=\"37\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"points\" label=\"Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">38</property>\n\t\t\t\t\t<property name=\"edges\" label=\"Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">39</property>\n\t\t\t\t\t<property name=\"faces\" label=\"Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">40</property>\n\t\t\t\t\t<property name=\"sds_points\" label=\"SDS Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">41</property>\n\t\t\t\t\t<property name=\"sds_edges\" label=\"SDS Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">42</property>\n\t\t\t\t\t<property name=\"sds_faces\" label=\"SDS Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">43</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">44</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">45</property>\n\t\t\t\t\t<property name=\"nurbs_curves\" label=\"NURBS Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">46</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">47</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">48</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">49</property>\n\t\t\t\t\t<property name=\"bezier_triangle_patches\" label=\"Bezier Triangle Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">50</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">51</property>\n\t\t\t\t\t<property name=\"face_normals\" label=\"Face Normals\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">52</property>\n\t\t\t\t\t<property name=\"face_orientation\" label=\"Face Orientation\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">53</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">54</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">55</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">56</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">57</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">58</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">59</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">60</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">61</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Point Painter\" factory=\"7e376143 b640c3f4 288543a0 57f83514\" id=\"38\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Edge Painter\" factory=\"172c1208 d24430f5 63f70388 1945866e\" id=\"39\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Painter\" factory=\"7e6e8354 604f05ae 1d4d658b 96538240\" id=\"40\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Point Painter\" factory=\"46db8236 a1408c58 d829ceba ffe78fca\" id=\"41\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Edge Painter\" factory=\"6c827fec d74ffc1c 79ba768f fc8fa4d5\" id=\"42\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Face Painter\" factory=\"9d4043c8 864fe71b 38706d85 8b60af0c\" id=\"43\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Linear Curve Painter\" factory=\"6acd1d8e 954f4b3a bce4c296 523ebacd\" id=\"44\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cubic Curve Painter\" factory=\"cb30d291 47e146a3 b5167d0f 6f56bd61\" id=\"45\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Curve Painter\" factory=\"86705b44 ef534dc4 86d9fc7a 8709ec59\" id=\"46\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bilinear Patch Painter\" factory=\"f172b866 fce74aa8 a9e792ff 630653f3\" id=\"47\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bicubic Patch Painter\" factory=\"e058ab07 44384acd ba321d58 cdb3ef25\" id=\"48\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Patch Painter\" factory=\"8881a190 9d1c4e6f 8b8c0523 2dc43fda\" id=\"49\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bezier Triangle Patch Painter\" factory=\"8d38bda1 df47e212 1e06bfb8 a8f440c5\" id=\"50\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Blobby Point Painter\" factory=\"06148329 b2264760 84b25aab f8401c63\" id=\"51\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Normal Painter\" factory=\"02d092ca 84405ff6 4fe806a9 ab886cb1\" id=\"52\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Orientation Painter\" factory=\"7bc1ee5f 45802906 323984bf cbe858d6\" id=\"53\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cone Painter\" factory=\"ae8f0e12 33403c10 04e4998d 17a8ec8c\" id=\"54\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cylinder Painter\" factory=\"311d3fbd 6a46e7b0 ccf9af8e f2daf44a\" id=\"55\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Disk Painter\" factory=\"e30f4079 8a4a030f 5ce166b6 77f324b4\" id=\"56\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Hyperboloid Painter\" factory=\"8fc78171 3e49ff1a a4b6e69d aa8fafa3\" id=\"57\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Paraboloid Painter\" factory=\"a4e66aa9 c34a22ca c5d3b19e 83c5d0f4\" id=\"58\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Sphere Painter\" factory=\"e22923fa 5146fa44 0b6ff7b2 3f71ad6e\" id=\"59\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Teapot Painter\" factory=\"aa87fdcc fc47c821 87d74dad f1f9f833\" id=\"60\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Torus Painter\" factory=\"271118dd 2a47903b f36b96b8 f6916c27\" id=\"61\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RealtimeSource\" factory=\"f7c119e7 d87b465a 9b7e0289 82d91702\" id=\"62\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"frame_rate\">1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TimeToString\" factory=\"40d699fb eb12444f a84df477 5cca00f9\" id=\"63\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input\">0</property>\n\t\t\t\t\t<property name=\"format\">%H:%M:%S Z</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyText\" factory=\"9acaeaf1 1fe74387 ae71cbb3 9b5e33fd\" id=\"36\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">31</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/VeraBd.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"text\">Text!</property>\n\t\t\t\t\t<property name=\"curve_divisions\">3</property>\n\t\t\t\t\t<property name=\"height\">10</property>\n\t\t\t\t\t<property name=\"orientation\">+y</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyText Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"35\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">37</property>\n\t\t\t\t\t<property name=\"ri_painter\">8</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Move PolyText Instance\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"64\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -14.619818345819411 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"ExtrudeFaces\" factory=\"dbd23c4e 7119478c 9ab2ee83 5b56d527\" id=\"65\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set>\n\t\t\t\t\t\t\t<storage type=\"point\">\n\t\t\t\t\t\t\t\t<structure>\n\t\t\t\t\t\t\t\t\t<array name=\"index_begin\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"index_end\" type=\"k3d::uint_t\">4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"weight\" type=\"k3d::double_t\">1</array>\n\t\t\t\t\t\t\t\t</structure>\n\t\t\t\t\t\t\t</storage>\n\t\t\t\t\t\t\t<storage type=\"primitive\">\n\t\t\t\t\t\t\t\t<structure>\n\t\t\t\t\t\t\t\t\t<array name=\"index_begin\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"index_end\" type=\"k3d::uint_t\">4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_begin\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_end\" type=\"k3d::uint_t\">4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_first_range\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_range_count\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_selection_type\" type=\"k3d::int32_t\">26 32 30 33 28 34 27 35</array>\n\t\t\t\t\t\t\t\t\t<array name=\"weight\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t\t\t</structure>\n\t\t\t\t\t\t\t</storage>\n\t\t\t\t\t\t</set>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"segments\">1</property>\n\t\t\t\t\t<property name=\"group_faces\">true</property>\n\t\t\t\t\t<property name=\"group_normals\">false</property>\n\t\t\t\t\t<property name=\"select_new_faces\">false</property>\n\t\t\t\t\t<property name=\"distance\">2.110000000000001</property>\n\t\t\t\t\t<property name=\"inset\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t</nodes>\n\t\t<dependencies>\n\t\t\t<dependency from_node=\"7\" from_property=\"output_matrix\" to_node=\"6\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"30\" from_property=\"output_matrix\" to_node=\"29\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"62\" from_property=\"time\" to_node=\"63\" to_property=\"input\"/>\n\t\t\t<dependency from_node=\"63\" from_property=\"output\" to_node=\"36\" to_property=\"text\"/>\n\t\t\t<dependency from_node=\"64\" from_property=\"output_matrix\" to_node=\"35\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"65\" from_property=\"output_mesh\" to_node=\"35\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"36\" from_property=\"output_mesh\" to_node=\"65\" to_property=\"input_mesh\"/>\n\t\t</dependencies>\n\t</document>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/documents/animation/euler_angles.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml package=\"k3d\" version=\"0.8.0.0\" host=\"Linux-2.6.31-14-generic;i686\">\n\t<document>\n\t\t<nodes>\n\t\t\t<node name=\"Axes\" factory=\"00000001 00000000 00000000 00000001\" id=\"2\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"axes\">true</property>\n\t\t\t\t\t<property name=\"xyplane\">false</property>\n\t\t\t\t\t<property name=\"yzplane\">false</property>\n\t\t\t\t\t<property name=\"xzplane\">true</property>\n\t\t\t\t\t<property name=\"gridsize\">2</property>\n\t\t\t\t\t<property name=\"gridcount\">5</property>\n\t\t\t\t\t<property name=\"xcolor\">1 0 0</property>\n\t\t\t\t\t<property name=\"ycolor\">0 0.69999999999999996 0</property>\n\t\t\t\t\t<property name=\"zcolor\">0 0 0.69999999999999996</property>\n\t\t\t\t\t<property name=\"gridcolor\">0.40000000000000002 0.40000000000000002 0.40000000000000002</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/Vera.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"font_size\">12</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera\" factory=\"45ce1872 af184b6d b391e136 0dcfe8b5\" id=\"3\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"navigation_target\">3</property>\n\t\t\t\t\t<property name=\"world_target\">0 -5 0</property>\n\t\t\t\t\t<property name=\"aspect_ratio\"/>\n\t\t\t\t\t<property name=\"show_projection\">false</property>\n\t\t\t\t\t<property name=\"orthographic\">false</property>\n\t\t\t\t\t<property name=\"left\">-0.6666666666666666</property>\n\t\t\t\t\t<property name=\"right\">0.6666666666666666</property>\n\t\t\t\t\t<property name=\"top\">0.5</property>\n\t\t\t\t\t<property name=\"bottom\">-0.5</property>\n\t\t\t\t\t<property name=\"near\">1</property>\n\t\t\t\t\t<property name=\"far\">1000</property>\n\t\t\t\t\t<property name=\"crop_window_left\">0</property>\n\t\t\t\t\t<property name=\"crop_window_right\">1</property>\n\t\t\t\t\t<property name=\"crop_window_top\">0</property>\n\t\t\t\t\t<property name=\"crop_window_bottom\">1</property>\n\t\t\t\t\t<property name=\"show_reference_plane\">false</property>\n\t\t\t\t\t<property name=\"reference_plane\">0</property>\n\t\t\t\t\t<property name=\"reference_plane_color\">0 0 0.69999999999999996</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"CameraViewport\" factory=\"0059ba47 7bf740f3 93fb523d 5899f22c\" id=\"4\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"point_size\">4</property>\n\t\t\t\t\t<property name=\"background_color\">0.80000000000000004 0.80000000000000004 0.80000000000000004</property>\n\t\t\t\t\t<property name=\"fog\">false</property>\n\t\t\t\t\t<property name=\"fog_near\">0</property>\n\t\t\t\t\t<property name=\"fog_far\">100</property>\n\t\t\t\t\t<property name=\"headlight\">true</property>\n\t\t\t\t\t<property name=\"show_lights\">false</property>\n\t\t\t\t\t<property name=\"draw_two_sided\">false</property>\n\t\t\t\t\t<property name=\"draw_safe_zone\">false</property>\n\t\t\t\t\t<property name=\"draw_aimpoint\">true</property>\n\t\t\t\t\t<property name=\"draw_crop_window\">true</property>\n\t\t\t\t\t<property name=\"draw_frustum\">true</property>\n\t\t\t\t\t<property name=\"node_selection\">5</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light\" factory=\"00000001 00000000 00000000 0000001d\" id=\"6\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"shader\">7</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"LightShader\" factory=\"830e867b 7bc94c6c 8d5087ee 8aa35db2\" id=\"7\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/light/k3d_pointlight.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"from\" label=\"\" description=\"\" type=\"k3d::point3\" user_property=\"generic\">0 0 0</property>\n\t\t\t\t\t<property name=\"intensity\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">3000</property>\n\t\t\t\t\t<property name=\"lightcolor\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Material\" factory=\"00000001 00000000 00000000 00000024\" id=\"8\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"surface_shader\">9</property>\n\t\t\t\t\t<property name=\"displacement_shader\">0</property>\n\t\t\t\t\t<property name=\"atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"interior_shader\">0</property>\n\t\t\t\t\t<property name=\"exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"matte\">false</property>\n\t\t\t\t\t<property name=\"displacement_bounds\">1</property>\n\t\t\t\t\t<property name=\"color\">1 1 1</property>\n\t\t\t\t\t<property name=\"opacity\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"MaterialShader\" factory=\"b553a3bd d1044c6e b3f21e07 87132c31\" id=\"9\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/surface/k3d_plastic.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"Ka\" label=\"Ambient\" description=\"Ambient Amount\" type=\"k3d::double_t\" user_property=\"generic\">1</property>\n\t\t\t\t\t<property name=\"Kd\" label=\"Diffuse\" description=\"Diffuse Amount\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t\t<property name=\"Ks\" label=\"Specular\" description=\"Specular Amount\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t\t<property name=\"roughness\" label=\"Roughness\" description=\"Surface Roughness (affects specular reflection size)\" type=\"k3d::double_t\" user_property=\"generic\">0.1</property>\n\t\t\t\t\t<property name=\"specularcolor\" label=\"Specular Color\" description=\"Specular Reflection Color\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyText\" factory=\"9acaeaf1 1fe74387 ae71cbb3 9b5e33fd\" id=\"10\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">8</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/VeraBd.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"text\">R</property>\n\t\t\t\t\t<property name=\"curve_divisions\">3</property>\n\t\t\t\t\t<property name=\"height\">10</property>\n\t\t\t\t\t<property name=\"orientation\">-z</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TimeSource\" factory=\"1978f1f7 4a864c99 8caf7cfc d2591baf\" id=\"11\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"start_time\">0</property>\n\t\t\t\t\t<property name=\"end_time\">4.03</property>\n\t\t\t\t\t<property name=\"frame_rate\">30</property>\n\t\t\t\t\t<property name=\"time\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TranslatePoints\" factory=\"460b8dac 780240a3 a2f87b5b ba0272cd\" id=\"12\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"x\">-3.226000000000003</property>\n\t\t\t\t\t<property name=\"y\">5</property>\n\t\t\t\t\t<property name=\"z\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"X Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"13\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">14</property>\n\t\t\t\t\t<property name=\"ri_painter\">15</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"X Script\" factory=\"acafcc85 a0bf4d69 99592c4f 7cf9b35c\" id=\"16\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"script\">#python\n\nimport k3d\n\nimport math\nimport sys\nimport os\nsys.path.append(os.path.join(str(k3d.share_path()), &quot;scripts&quot;, &quot;animation&quot;))\nfrom keyframes import *\n\nfirst = k3d.euler_angles(0, 0, 0, k3d.euler_angles.angle_order.xyz)\nlast = k3d.euler_angles(math.radians(-45), 0, 0, k3d.euler_angles.angle_order.xyz)\ncurrent = mix(first, last, Node.time)\n\nOutput = k3d.rotate3(current)</property>\n\t\t\t\t\t<property name=\"time\" label=\"Time\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"YZ Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"17\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">14</property>\n\t\t\t\t\t<property name=\"ri_painter\">15</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"YZ Script\" factory=\"acafcc85 a0bf4d69 99592c4f 7cf9b35c\" id=\"18\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"script\">#python\n\nimport k3d\n\nimport math\nimport sys\nimport os\nsys.path.append(os.path.join(str(k3d.share_path()), &quot;scripts&quot;, &quot;animation&quot;))\nfrom keyframes import *\n\nfirst = k3d.euler_angles(0, 0, 0, k3d.euler_angles.angle_order.yzx)\nlast = k3d.euler_angles(math.radians(45), math.radians(45), 0, k3d.euler_angles.angle_order.yzx)\ncurrent = mix(first, last, Node.time)\n\nOutput = k3d.rotate3(current)</property>\n\t\t\t\t\t<property name=\"time\" label=\"Time\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"19\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">0.70485699999999996 0.51037999999999994 0.49263400000000002 -15.709099999999999 9.50134e-07 0.69448699999999997 -0.71950499999999995 22.9436 -0.70934900000000001 0.50714899999999996 0.48951299999999998 -15.6097 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"20\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -20 0 1 0 20 0 0 1 -30 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Default Painter\" factory=\"6bc7d8a1 bbe7491f a2405d97 8b136c41\" id=\"14\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">21</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">22</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">23</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">24</property>\n\t\t\t\t\t<property name=\"edges\" label=\"Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">25</property>\n\t\t\t\t\t<property name=\"face_normals\" label=\"Face Normals\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">26</property>\n\t\t\t\t\t<property name=\"face_orientation\" label=\"Face Orientation\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">27</property>\n\t\t\t\t\t<property name=\"faces\" label=\"Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">28</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">29</property>\n\t\t\t\t\t<property name=\"nurbs_curves\" label=\"NURBS Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">30</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">31</property>\n\t\t\t\t\t<property name=\"points\" label=\"Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">32</property>\n\t\t\t\t\t<property name=\"sds_edges\" label=\"SDS Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">0</property>\n\t\t\t\t\t<property name=\"sds_faces\" label=\"SDS Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">33</property>\n\t\t\t\t\t<property name=\"sds_points\" label=\"SDS Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Point Painter\" factory=\"ad24a631 acbd4af1 bd6d6362 75c3d5d7\" id=\"32\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Edge Painter\" factory=\"172c1208 d24430f5 63f70388 1945866e\" id=\"25\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Painter\" factory=\"7e6e8354 604f05ae 1d4d658b 96538240\" id=\"28\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Face Painter\" factory=\"9d4043c8 864fe71b 38706d85 8b60af0c\" id=\"33\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Linear Curve Painter\" factory=\"6acd1d8e 954f4b3a bce4c296 523ebacd\" id=\"29\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cubic Curve Painter\" factory=\"cb30d291 47e146a3 b5167d0f 6f56bd61\" id=\"24\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Curve Painter\" factory=\"86705b44 ef534dc4 86d9fc7a 8709ec59\" id=\"30\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bilinear Patch Painter\" factory=\"f172b866 fce74aa8 a9e792ff 630653f3\" id=\"22\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bicubic Patch Painter\" factory=\"e058ab07 44384acd ba321d58 cdb3ef25\" id=\"21\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Patch Painter\" factory=\"8881a190 9d1c4e6f 8b8c0523 2dc43fda\" id=\"31\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Blobby Point Painter\" factory=\"06148329 b2264760 84b25aab f8401c63\" id=\"23\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Normal Painter\" factory=\"02d092ca 84405ff6 4fe806a9 ab886cb1\" id=\"26\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Orientation Painter\" factory=\"7bc1ee5f 45802906 323984bf cbe858d6\" id=\"27\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Renderman Default Painter\" factory=\"243cba5a 13f342fa 8f1a19cd faf34169\" id=\"15\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">34</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">35</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">36</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">37</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">38</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">39</property>\n\t\t\t\t\t<property name=\"point_groups\" label=\"Point Groups\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">40</property>\n\t\t\t\t\t<property name=\"polyhedra\" label=\"Polyhedra\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">41</property>\n\t\t\t\t\t<property name=\"subdivision_surfaces\" label=\"Subdivision Surfaces\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">42</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Point Group Painter\" factory=\"06fab90b 2f034d69 b4a1cb9f b9864144\" id=\"40\"/>\n\t\t\t<node name=\"RenderMan Polyhedron Painter\" factory=\"0771ea79 6c8c4c6d 8bab8c83 42fc73e9\" id=\"41\"/>\n\t\t\t<node name=\"RenderMan Subdivision Surface Painter\" factory=\"4d6fae39 723e4ed3 bc5735c5 3b75edc0\" id=\"42\"/>\n\t\t\t<node name=\"RenderMan Linear Curve Painter\" factory=\"f8b19206 a0ae4bd1 b3548a15 1209469e\" id=\"38\"/>\n\t\t\t<node name=\"RenderMan Cubic Curve Painter\" factory=\"8c5be7c4 0e8d43c5 a1daace4 a79275d7\" id=\"37\"/>\n\t\t\t<node name=\"RenderMan Bilinear Patch Painter\" factory=\"3f51b275 5a664903 96ed9168 503e30f0\" id=\"35\"/>\n\t\t\t<node name=\"RenderMan Bicubic Patch Painter\" factory=\"64dfefde eedc4047 b59fc8f6 972a9b86\" id=\"34\"/>\n\t\t\t<node name=\"RenderMan NURBS Patch Painter\" factory=\"120d87f0 fe05419f ae2d14ce ea9c32b4\" id=\"39\"/>\n\t\t\t<node name=\"RenderMan Blobby Painter\" factory=\"0221462c c3d44a12 97b39425 29774d3f\" id=\"36\"/>\n\t\t\t<node name=\"Node Selection\" factory=\"5d305922 d2442343 077956b6 b112b9b3\" id=\"5\">\n\t\t\t\t<metadata>\n\t\t\t\t\t<pair name=\"ngui:unique_node\">node_selection</pair>\n\t\t\t\t</metadata>\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"selection_weights\"> 16 1 18 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t</nodes>\n\t\t<dependencies>\n\t\t\t<dependency from_node=\"19\" from_property=\"output_matrix\" to_node=\"3\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"20\" from_property=\"output_matrix\" to_node=\"6\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"10\" from_property=\"output_mesh\" to_node=\"12\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"16\" from_property=\"output_matrix\" to_node=\"13\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"12\" from_property=\"output_mesh\" to_node=\"13\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"18\" from_property=\"output_matrix\" to_node=\"17\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"12\" from_property=\"output_mesh\" to_node=\"17\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"11\" from_property=\"time\" to_node=\"18\" to_property=\"time\"/>\n\t\t\t<dependency from_node=\"11\" from_property=\"time\" to_node=\"16\" to_property=\"time\"/>\n\t\t</dependencies>\n\t</document>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/documents/index.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<application>\n\t\t<examples>\n\t\t\t<example title=\"K-3D Logo\" path=\"logo.k3d\">\n\t\t\t\t<description>This example contains the K-3D logo, created using quadric primitives.  You can see it rendered as \"concrete\" using a RenderMan engine such as Aqsis, or rendered as shiny copper using LuxRender.</description>\n\t\t\t</example>\n\t\t\t<example title=\"Digital Clock\" path=\"animation/digital_clock.k3d\">\n\t\t\t\t<description>This example uses the realtime source to create a live, 3D digital clock.</description>\n\t\t\t</example>\n\t\t\t<example title=\"Arc Length\" path=\"animation/arc_length.k3d\">\n\t\t\t\t<description>This example uses Python to animate two objects along a path, comparing the results with-and-without arc-length paramaterization.</description>\n\t\t\t</example>\n\t\t\t<example title=\"Euler Angles\" path=\"animation/euler_angles.k3d\">\n\t\t\t\t<description>This example uses Python to rotate two objects using different Euler angles, yet producing identical results!</description>\n\t\t\t</example>\n<!--\n\t\t\t<example title=\"Old SDP Logo\" path=\"old_logo.k3d\">\n\t\t\t\t<description>This example reproduces the old Shead Data Processing logo, implemented using a displacement map on a textured concrete cube.  Render it using a RenderMan engine such as Aqsis or Pixie to see the results.</description>\n\t\t\t</example>\n-->\n\t\t</examples>\n\t</application>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/documents/logo.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml package=\"k3d\" version=\"0.8.0.0\" host=\"Linux-2.6.31-14-generic;i686\">\n\t<document>\n\t\t<nodes>\n\t\t\t<node name=\"Axes\" factory=\"00000001 00000000 00000000 00000001\" id=\"2\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"axes\">true</property>\n\t\t\t\t\t<property name=\"xyplane\">true</property>\n\t\t\t\t\t<property name=\"yzplane\">false</property>\n\t\t\t\t\t<property name=\"xzplane\">false</property>\n\t\t\t\t\t<property name=\"gridsize\">2</property>\n\t\t\t\t\t<property name=\"gridcount\">5</property>\n\t\t\t\t\t<property name=\"xcolor\">1 0 0</property>\n\t\t\t\t\t<property name=\"ycolor\">0 0.69999999999999996 0</property>\n\t\t\t\t\t<property name=\"zcolor\">0 0 0.69999999999999996</property>\n\t\t\t\t\t<property name=\"gridcolor\">0.40000000000000002 0.40000000000000002 0.40000000000000002</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/Vera.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"font_size\">12</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Engine\" factory=\"0059ba47 7bf740f3 93fb523d 5899f22c\" id=\"3\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"point_size\">4</property>\n\t\t\t\t\t<property name=\"background_color\">0.80000000000000004 0.80000000000000004 0.80000000000000004</property>\n\t\t\t\t\t<property name=\"fog\">false</property>\n\t\t\t\t\t<property name=\"fog_near\">0</property>\n\t\t\t\t\t<property name=\"fog_far\">100</property>\n\t\t\t\t\t<property name=\"headlight\">true</property>\n\t\t\t\t\t<property name=\"show_lights\">false</property>\n\t\t\t\t\t<property name=\"draw_two_sided\">true</property>\n\t\t\t\t\t<property name=\"draw_safe_zone\">false</property>\n\t\t\t\t\t<property name=\"draw_aimpoint\">true</property>\n\t\t\t\t\t<property name=\"draw_crop_window\">true</property>\n\t\t\t\t\t<property name=\"draw_frustum\">true</property>\n\t\t\t\t\t<property name=\"node_selection\">4</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TimeSource\" factory=\"1978f1f7 4a864c99 8caf7cfc d2591baf\" id=\"5\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"start_time\">0</property>\n\t\t\t\t\t<property name=\"end_time\">4</property>\n\t\t\t\t\t<property name=\"frame_rate\">30</property>\n\t\t\t\t\t<property name=\"time\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera\" factory=\"45ce1872 af184b6d b391e136 0dcfe8b5\" id=\"6\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"navigation_target\">6</property>\n\t\t\t\t\t<property name=\"world_target\">7.521868652843672 2.5835606697655358 -6.3324016693563836</property>\n\t\t\t\t\t<property name=\"aspect_ratio\"/>\n\t\t\t\t\t<property name=\"show_projection\">false</property>\n\t\t\t\t\t<property name=\"orthographic\">false</property>\n\t\t\t\t\t<property name=\"left\">-0.6666666666666666</property>\n\t\t\t\t\t<property name=\"right\">0.6666666666666666</property>\n\t\t\t\t\t<property name=\"top\">0.5</property>\n\t\t\t\t\t<property name=\"bottom\">-0.5</property>\n\t\t\t\t\t<property name=\"near\">1</property>\n\t\t\t\t\t<property name=\"far\">1000</property>\n\t\t\t\t\t<property name=\"crop_window_left\">0</property>\n\t\t\t\t\t<property name=\"crop_window_right\">1</property>\n\t\t\t\t\t<property name=\"crop_window_top\">0</property>\n\t\t\t\t\t<property name=\"crop_window_bottom\">1</property>\n\t\t\t\t\t<property name=\"show_reference_plane\">false</property>\n\t\t\t\t\t<property name=\"reference_plane\">0</property>\n\t\t\t\t\t<property name=\"reference_plane_color\">0 0 0.69999999999999996</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"7\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">0.87411118297006951 0.2053972134070812 0.44016090754549264 -0.20336122259568956 0.4857258895783359 -0.36963234828994362 -0.79211254711120205 16.485866414673577 4.6987248618866884e-14 0.9061919839759498 -0.42286651342679316 1.0892956391665605 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Default Painter\" factory=\"243cba5a 13f342fa 8f1a19cd faf34169\" id=\"8\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"particles\" label=\"Particles\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">9</property>\n\t\t\t\t\t<property name=\"polyhedra\" label=\"Polyhedra\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">10</property>\n\t\t\t\t\t<property name=\"subdivision_surfaces\" label=\"Subdivision Surfaces\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">11</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">12</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">13</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">14</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">15</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">16</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">17</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">18</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">19</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">20</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">21</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">22</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">23</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">24</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">25</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Particle Painter\" factory=\"06fab90b 2f034d69 b4a1cb9f b9864144\" id=\"9\"/>\n\t\t\t<node name=\"RenderMan Polyhedron Painter\" factory=\"0771ea79 6c8c4c6d 8bab8c83 42fc73e9\" id=\"10\"/>\n\t\t\t<node name=\"RenderMan Subdivision Surface Painter\" factory=\"4d6fae39 723e4ed3 bc5735c5 3b75edc0\" id=\"11\"/>\n\t\t\t<node name=\"RenderMan Linear Curve Painter\" factory=\"f8b19206 a0ae4bd1 b3548a15 1209469e\" id=\"12\"/>\n\t\t\t<node name=\"RenderMan Cubic Curve Painter\" factory=\"8c5be7c4 0e8d43c5 a1daace4 a79275d7\" id=\"13\"/>\n\t\t\t<node name=\"RenderMan Bilinear Patch Painter\" factory=\"3f51b275 5a664903 96ed9168 503e30f0\" id=\"14\"/>\n\t\t\t<node name=\"RenderMan Bicubic Patch Painter\" factory=\"64dfefde eedc4047 b59fc8f6 972a9b86\" id=\"15\"/>\n\t\t\t<node name=\"RenderMan NURBS Patch Painter\" factory=\"120d87f0 fe05419f ae2d14ce ea9c32b4\" id=\"16\"/>\n\t\t\t<node name=\"RenderMan Blobby Painter\" factory=\"0221462c c3d44a12 97b39425 29774d3f\" id=\"17\"/>\n\t\t\t<node name=\"RenderMan Cone Painter\" factory=\"6612c455 774ed5d4 5ff0c495 6d920b8e\" id=\"18\"/>\n\t\t\t<node name=\"RenderMan Cylinder Painter\" factory=\"85a1d5ac 224449cf 202911a1 a2434ee8\" id=\"19\"/>\n\t\t\t<node name=\"RenderMan Disk Painter\" factory=\"6c92b34f 57480914 1708dca6 cc8651cc\" id=\"20\"/>\n\t\t\t<node name=\"RenderMan Hyperboloid Painter\" factory=\"8f5ac6bd f84bfac3 8585f08b 953e3df1\" id=\"21\"/>\n\t\t\t<node name=\"RenderMan Paraboloid Painter\" factory=\"49dafd22 d34c22e6 cb8e30b3 0f74f5ef\" id=\"22\"/>\n\t\t\t<node name=\"RenderMan Sphere Painter\" factory=\"a07012c4 ce4b11f4 92d5f48d 8f3751c0\" id=\"23\"/>\n\t\t\t<node name=\"RenderMan Teapot Painter\" factory=\"cf54aa9b 9c4e886c a8cf2fa2 470d44ed\" id=\"24\"/>\n\t\t\t<node name=\"RenderMan Torus Painter\" factory=\"d3865bdb 69469c71 2cc55a8b 420de184\" id=\"25\"/>\n\t\t\t<node name=\"Surface Shader\" factory=\"b553a3bd d1044c6e b3f21e07 87132c31\" id=\"26\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/surface/k3d_matte.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"Ka\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">1</property>\n\t\t\t\t\t<property name=\"Kd\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManMaterial\" factory=\"00000001 00000000 00000000 00000024\" id=\"27\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"surface_shader\">26</property>\n\t\t\t\t\t<property name=\"displacement_shader\">28</property>\n\t\t\t\t\t<property name=\"atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"interior_shader\">0</property>\n\t\t\t\t\t<property name=\"exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"matte\">false</property>\n\t\t\t\t\t<property name=\"displacement_bounds\">1</property>\n\t\t\t\t\t<property name=\"color\">1 1 1</property>\n\t\t\t\t\t<property name=\"opacity\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Shader\" factory=\"830e867b 7bc94c6c 8d5087ee 8aa35db2\" id=\"29\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/light/k3d_pointlight.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"intensity\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">3000</property>\n\t\t\t\t\t<property name=\"lightcolor\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t\t<property name=\"from\" label=\"\" description=\"\" type=\"k3d::point3\" user_property=\"generic\">0 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light\" factory=\"00000001 00000000 00000000 0000001d\" id=\"30\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"shader\">29</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"31\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -20 0 1 0 20 0 0 1 30 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Material\" factory=\"00000001 00000002 00000003 00000004\" id=\"32\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"renderman_material\" label=\"RenderMan Material\" description=\"\" type=\"k3d::imaterial*\" user_property=\"generic\">27</property>\n\t\t\t\t\t<property name=\"LuxRenderMaterial\" label=\"LuxRender Material\" description=\"\" type=\"k3d::imaterial*\" user_property=\"generic\">33</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Aqsis\" factory=\"8d430069 63404829 053361ad fc6abda6\" id=\"34\"/>\n\t\t\t<node name=\"Pixie\" factory=\"7a1d773b a9472dae a80223ab 59d62f9a\" id=\"35\"/>\n\t\t\t<node name=\"RenderMan Engine\" factory=\"0dc5e733 fa684e05 86a3865f 42f7a99d\" id=\"36\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"visible_nodes\"> 37</property>\n\t\t\t\t\t<property name=\"enabled_lights\"> 30</property>\n\t\t\t\t\t<property name=\"render_engine\">34</property>\n\t\t\t\t\t<property name=\"resolution\"/>\n\t\t\t\t\t<property name=\"hider\"/>\n\t\t\t\t\t<property name=\"pixel_width\">320</property>\n\t\t\t\t\t<property name=\"pixel_height\">240</property>\n\t\t\t\t\t<property name=\"pixel_aspect_ratio\">1</property>\n\t\t\t\t\t<property name=\"default_atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"default_interior_shader\">0</property>\n\t\t\t\t\t<property name=\"default_exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"imager_shader\">0</property>\n\t\t\t\t\t<property name=\"bucket_width\">16</property>\n\t\t\t\t\t<property name=\"bucket_height\">16</property>\n\t\t\t\t\t<property name=\"grid_size\">256</property>\n\t\t\t\t\t<property name=\"eye_splits\">10</property>\n\t\t\t\t\t<property name=\"texture_memory\">1024</property>\n\t\t\t\t\t<property name=\"render_alpha\">false</property>\n\t\t\t\t\t<property name=\"pixel_xsamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_ysamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_filter\">gaussian</property>\n\t\t\t\t\t<property name=\"pixel_filter_width\">2</property>\n\t\t\t\t\t<property name=\"pixel_filter_height\">2</property>\n\t\t\t\t\t<property name=\"exposure\">1</property>\n\t\t\t\t\t<property name=\"gamma\">1</property>\n\t\t\t\t\t<property name=\"dof\">false</property>\n\t\t\t\t\t<property name=\"fstop\">0.3</property>\n\t\t\t\t\t<property name=\"focal_length\">1.6</property>\n\t\t\t\t\t<property name=\"focus_plane\">30</property>\n\t\t\t\t\t<property name=\"shading_rate\">1</property>\n\t\t\t\t\t<property name=\"shading_interpolation\">constant</property>\n\t\t\t\t\t<property name=\"two_sided\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"render_motion_blur\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Node Selection\" factory=\"5d305922 d2442343 077956b6 b112b9b3\" id=\"4\">\n\t\t\t\t<metadata>\n\t\t\t\t\t<pair name=\"ngui:unique_node\">node_selection</pair>\n\t\t\t\t</metadata>\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"selection_weights\"> 38 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Default Painter\" factory=\"6bc7d8a1 bbe7491f a2405d97 8b136c41\" id=\"39\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"points\" label=\"Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">40</property>\n\t\t\t\t\t<property name=\"edges\" label=\"Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">41</property>\n\t\t\t\t\t<property name=\"faces\" label=\"Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">42</property>\n\t\t\t\t\t<property name=\"sds_points\" label=\"SDS Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">0</property>\n\t\t\t\t\t<property name=\"sds_edges\" label=\"SDS Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">0</property>\n\t\t\t\t\t<property name=\"sds_faces\" label=\"SDS Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">0</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">43</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">44</property>\n\t\t\t\t\t<property name=\"nurbs_curves\" label=\"NURBS Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">45</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">46</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">47</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">48</property>\n\t\t\t\t\t<property name=\"bezier_triangle_patches\" label=\"Bezier Triangle Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">49</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">38</property>\n\t\t\t\t\t<property name=\"face_normals\" label=\"Face Normals\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">50</property>\n\t\t\t\t\t<property name=\"face_orientation\" label=\"Face Orientation\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">51</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">52</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">53</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">54</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">55</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">56</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">57</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">58</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">59</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Point Painter\" factory=\"7e376143 b640c3f4 288543a0 57f83514\" id=\"40\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Edge Painter\" factory=\"172c1208 d24430f5 63f70388 1945866e\" id=\"41\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Painter\" factory=\"7e6e8354 604f05ae 1d4d658b 96538240\" id=\"42\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Linear Curve Painter\" factory=\"6acd1d8e 954f4b3a bce4c296 523ebacd\" id=\"43\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cubic Curve Painter\" factory=\"cb30d291 47e146a3 b5167d0f 6f56bd61\" id=\"44\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Curve Painter\" factory=\"86705b44 ef534dc4 86d9fc7a 8709ec59\" id=\"45\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bilinear Patch Painter\" factory=\"f172b866 fce74aa8 a9e792ff 630653f3\" id=\"46\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bicubic Patch Painter\" factory=\"e058ab07 44384acd ba321d58 cdb3ef25\" id=\"47\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Patch Painter\" factory=\"8881a190 9d1c4e6f 8b8c0523 2dc43fda\" id=\"48\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bezier Triangle Patch Painter\" factory=\"8d38bda1 df47e212 1e06bfb8 a8f440c5\" id=\"49\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Blobby Point Painter\" factory=\"06148329 b2264760 84b25aab f8401c63\" id=\"38\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Normal Painter\" factory=\"02d092ca 84405ff6 4fe806a9 ab886cb1\" id=\"50\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Orientation Painter\" factory=\"7bc1ee5f 45802906 323984bf cbe858d6\" id=\"51\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cone Painter\" factory=\"ae8f0e12 33403c10 04e4998d 17a8ec8c\" id=\"52\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cylinder Painter\" factory=\"311d3fbd 6a46e7b0 ccf9af8e f2daf44a\" id=\"53\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Disk Painter\" factory=\"e30f4079 8a4a030f 5ce166b6 77f324b4\" id=\"54\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Hyperboloid Painter\" factory=\"8fc78171 3e49ff1a a4b6e69d aa8fafa3\" id=\"55\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Paraboloid Painter\" factory=\"a4e66aa9 c34a22ca c5d3b19e 83c5d0f4\" id=\"56\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Sphere Painter\" factory=\"e22923fa 5146fa44 0b6ff7b2 3f71ad6e\" id=\"57\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Teapot Painter\" factory=\"aa87fdcc fc47c821 87d74dad f1f9f833\" id=\"58\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Torus Painter\" factory=\"271118dd 2a47903b f36b96b8 f6916c27\" id=\"59\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Logo\" factory=\"efc80ecb 9340c5b0 0061109e c97591a3\" id=\"60\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">32</property>\n\t\t\t\t\t<property name=\"radius\">10.822</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Logo Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"37\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">39</property>\n\t\t\t\t\t<property name=\"ri_painter\">8</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"LuxRenderMetalMaterial\" factory=\"7bb2bd65 764ec9c7 dd52c5a2 8a7048e9\" id=\"33\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"bumpmap\">0</property>\n\t\t\t\t\t<property name=\"name\">copper</property>\n\t\t\t\t\t<property name=\"u_roughness\">0.001</property>\n\t\t\t\t\t<property name=\"u_roughness_texture\">0</property>\n\t\t\t\t\t<property name=\"v_roughness\">0.001</property>\n\t\t\t\t\t<property name=\"v_roughness_texture\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"LuxRenderSkyLight\" factory=\"0d372c47 ca43956e 128aed90 b2fb05f2\" id=\"61\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"group\">default</property>\n\t\t\t\t\t<property name=\"gain\">0.005</property>\n\t\t\t\t\t<property name=\"samples\">1</property>\n\t\t\t\t\t<property name=\"direction\">0 0 1</property>\n\t\t\t\t\t<property name=\"turbidity\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"LuxRenderSunLight\" factory=\"31a4dc66 ba47822e fa07b286 c4534449\" id=\"62\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"group\">default</property>\n\t\t\t\t\t<property name=\"gain\">0.005</property>\n\t\t\t\t\t<property name=\"samples\">1</property>\n\t\t\t\t\t<property name=\"direction\">0 0 1</property>\n\t\t\t\t\t<property name=\"turbidity\">2</property>\n\t\t\t\t\t<property name=\"size\">1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"LuxRenderEngine\" factory=\"e28cbcb2 1940a2f6 5a8228ba df1cd742\" id=\"63\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"visible_nodes\"> 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 34 35 36 4 39 40 41 42 43 44 45 46 47 48 49 38 50 51 52 53 54 55 56 57 58 59 60 37 33 61 62 63</property>\n\t\t\t\t\t<property name=\"enabled_lights\"> 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 34 35 36 4 39 40 41 42 43 44 45 46 47 48 49 38 50 51 52 53 54 55 56 57 58 59 60 37 33 61 62 63</property>\n\t\t\t\t\t<property name=\"resolution\"/>\n\t\t\t\t\t<property name=\"pixel_width\">320</property>\n\t\t\t\t\t<property name=\"pixel_height\">240</property>\n\t\t\t\t\t<property name=\"halt_samples\">200</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManDisplacementShader\" factory=\"62827bb7 4cb64427 a9eadbc8 62e1a3f2\" id=\"28\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/displacement/k3d_dented.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"Km\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0.03</property>\n\t\t\t\t\t<property name=\"power\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">3</property>\n\t\t\t\t\t<property name=\"frequency\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0.4</property>\n\t\t\t\t\t<property name=\"maxoctaves\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">6</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t</nodes>\n\t\t<dependencies>\n\t\t\t<dependency from_node=\"7\" from_property=\"output_matrix\" to_node=\"6\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"31\" from_property=\"output_matrix\" to_node=\"30\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"60\" from_property=\"output_mesh\" to_node=\"37\" to_property=\"input_mesh\"/>\n\t\t</dependencies>\n\t</document>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/fonts/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.ttf k3d/fonts)\n\n"
  },
  {
    "path": "share/k3d/geometry/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.obj k3d/geometry)\n\n"
  },
  {
    "path": "share/k3d/geometry/knot.obj",
    "content": "# file generated by UVMapper\r\n# NumVerts/NumTVerts/NumVNormals/NumFacets   1589/1491/1589/2880\r\n# NumGroups/NumMaterials/NumRegions   0/1/0\r\n# x/y/color/ppu   1024/512/0/50.00000000\r\n\r\nv  0.26343101  0.37266999  0.00003487\r\nv  0.27461901  0.39713699  0.02430460\r\nv  0.26954600  0.42831099  0.04206150\r\nv  0.24957301  0.45783800  0.04854770\r\nv  0.22005101  0.47780699  0.04202500\r\nv  0.18889000  0.48286599  0.02424140\r\nv  0.16444001  0.47166100 -0.00003815\r\nv  0.15325300  0.44719300 -0.02430790\r\nv  0.15832500  0.41601899 -0.04206480\r\nv  0.17829800  0.38649201 -0.04855100\r\nv  0.20782100  0.36652401 -0.04202830\r\nv  0.23898099  0.36146399 -0.02424470\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.27516100  0.38359299 -0.01231960\r\nv  0.28721100  0.41164500  0.00719260\r\nv  0.28278100  0.44534099  0.01975390\r\nv  0.26305801  0.47565299  0.02199840\r\nv  0.23332600  0.49445799  0.01332480\r\nv  0.20155300  0.49671799 -0.00394284\r\nv  0.17625099  0.48182699 -0.02517770\r\nv  0.16419999  0.45377499 -0.04468990\r\nv  0.16863000  0.42007899 -0.05725120\r\nv  0.18835400  0.38976699 -0.05949580\r\nv  0.21808501  0.37096199 -0.05082220\r\nv  0.24985901  0.36870199 -0.03355450\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.28628701  0.39183000 -0.02797070\r\nv  0.29981101  0.42275199 -0.01478820\r\nv  0.29648399  0.45827001 -0.00844130\r\nv  0.27719900  0.48886600 -0.01063070\r\nv  0.24712200  0.50634301 -0.02076970\r\nv  0.21431300  0.50601703 -0.03614160\r\nv  0.18756300  0.48797601 -0.05262750\r\nv  0.17403901  0.45705399 -0.06581000\r\nv  0.17736501  0.42153701 -0.07215690\r\nv  0.19665000  0.39094001 -0.06996750\r\nv  0.22672699  0.37346399 -0.05982850\r\nv  0.25953600  0.37378901 -0.04445660\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.29625899  0.39602801 -0.04749350\r\nv  0.31162599  0.42839500 -0.04209840\r\nv  0.30967200  0.46456799 -0.04280450\r\nv  0.29091901  0.49485701 -0.04942260\r\nv  0.26039201  0.51114398 -0.06017940\r\nv  0.22627100  0.50906497 -0.07219260\r\nv  0.19769900  0.48917899 -0.08224330\r\nv  0.18233199  0.45681199 -0.08763830\r\nv  0.18428700  0.42063901 -0.08693220\r\nv  0.20304000  0.39035100 -0.08031410\r\nv  0.23356600  0.37406400 -0.06955740\r\nv  0.26768699  0.37614200 -0.05754420\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.30429000  0.39460999 -0.07106350\r\nv  0.32134300  0.42641401 -0.07430450\r\nv  0.32062501  0.46172199 -0.08241190\r\nv  0.30232799  0.49107099 -0.09321350\r\nv  0.27135399  0.50659800 -0.10381500\r\nv  0.23600399  0.50414300 -0.11137600\r\nv  0.20574801  0.48436299 -0.11386900\r\nv  0.18869500  0.45255801 -0.11062900\r\nv  0.18941399  0.41725099 -0.10252100\r\nv  0.20771100  0.38790199 -0.09171950\r\nv  0.23868500  0.37237400 -0.08111810\r\nv  0.27403501  0.37483001 -0.07355750\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.30932200  0.38597399 -0.09832630\r\nv  0.32734001  0.41515300 -0.11002200\r\nv  0.32730201  0.44808599 -0.12512900\r\nv  0.30921799  0.47595099 -0.13959999\r\nv  0.27793300  0.49127901 -0.14955600\r\nv  0.24183001  0.48996401 -0.15233099\r\nv  0.21058300  0.47235900 -0.14718001\r\nv  0.19256400  0.44318101 -0.13548499\r\nv  0.19260199  0.41024700 -0.12037800\r\nv  0.21068700  0.38238299 -0.10590700\r\nv  0.24197200  0.36705399 -0.09595060\r\nv  0.27807501  0.36836901 -0.09317580\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.31007901  0.36875701 -0.12833700\r\nv  0.32808000  0.39379701 -0.14735900\r\nv  0.32797399  0.42329699 -0.16839600\r\nv  0.30979100  0.44935399 -0.18581100\r\nv  0.27840301  0.46498501 -0.19493701\r\nv  0.24222000  0.46600300 -0.19332901\r\nv  0.21093699  0.45213300 -0.18141800\r\nv  0.19293600  0.42709401 -0.16239500\r\nv  0.19304200  0.39759299 -0.14135800\r\nv  0.21122500  0.37153599 -0.12394400\r\nv  0.24261300  0.35590500 -0.11481800\r\nv  0.27879599  0.35488799 -0.11642600\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.30525699  0.34222800 -0.15944900\r\nv  0.32233199  0.36237901 -0.18425301\r\nv  0.32147601  0.38797101 -0.20988800\r\nv  0.30291900  0.41214600 -0.22948501\r\nv  0.27163401  0.42842701 -0.23779400\r\nv  0.23600399  0.43245199 -0.23258699\r\nv  0.20557500  0.42314100 -0.21526000\r\nv  0.18850100  0.40299001 -0.19045500\r\nv  0.18935600  0.37739801 -0.16482000\r\nv  0.20791300  0.35322201 -0.14522301\r\nv  0.23919800  0.33694100 -0.13691500\r\nv  0.27482799  0.33291700 -0.14212200\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.29382300  0.30669600 -0.18940100\r\nv  0.30927700  0.32177499 -0.21849801\r\nv  0.30715999  0.34341300 -0.24748300\r\nv  0.28803900  0.36581099 -0.26859099\r\nv  0.25703800  0.38296899 -0.27616501\r\nv  0.22246300  0.39028901 -0.26817599\r\nv  0.19357800  0.38580900 -0.24676400\r\nv  0.17812400  0.37073001 -0.21766700\r\nv  0.18024100  0.34909299 -0.18868101\r\nv  0.19936199  0.32669401 -0.16757300\r\nv  0.23036300  0.30953601 -0.15999900\r\nv  0.26493800  0.30221599 -0.16798900\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.27538800  0.26385400 -0.21555100\r\nv  0.28870100  0.27392700 -0.24770901\r\nv  0.28495601  0.29175299 -0.27903000\r\nv  0.26515800  0.31255701 -0.30112299\r\nv  0.23461001  0.33076301 -0.30806601\r\nv  0.20149800  0.34149399 -0.29800001\r\nv  0.17469500  0.34187299 -0.27362201\r\nv  0.16138200  0.33180001 -0.24146400\r\nv  0.16512600  0.31397301 -0.21014300\r\nv  0.18492500  0.29317001 -0.18805000\r\nv  0.21547300  0.27496400 -0.18110700\r\nv  0.24858400  0.26423299 -0.19117300\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.25049001  0.21674100 -0.23538700\r\nv  0.26121601  0.22191399 -0.26960799\r\nv  0.25555199  0.23610500 -0.30246201\r\nv  0.23501800  0.25551200 -0.32514599\r\nv  0.20511501  0.27493399 -0.33158201\r\nv  0.17385501  0.28916699 -0.32004601\r\nv  0.14961500  0.29439801 -0.29362801\r\nv  0.13889000  0.28922501 -0.25940701\r\nv  0.14455301  0.27503401 -0.22655299\r\nv  0.16508700  0.25562701 -0.20386900\r\nv  0.19499101  0.23620500 -0.19743299\r\nv  0.22624999  0.22197200 -0.20896900\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.22062300  0.16926301 -0.24710500\r\nv  0.22829300  0.16958401 -0.28251499\r\nv  0.22042599  0.18027300 -0.31623101\r\nv  0.19912900  0.19846500 -0.33921599\r\nv  0.17010900  0.21928599 -0.34531400\r\nv  0.14114200  0.23715700 -0.33288899\r\nv  0.11998900  0.24728900 -0.30527100\r\nv  0.11231900  0.24696800 -0.26986000\r\nv  0.12018600  0.23627900 -0.23614500\r\nv  0.14148299  0.21808700 -0.21315999\r\nv  0.17050301  0.19726600 -0.20706201\r\nv  0.19947000  0.17939501 -0.21948700\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.18791699  0.12532300 -0.25002801\r\nv  0.19197100  0.12078400 -0.28574699\r\nv  0.18156900  0.12806299 -0.31968299\r\nv  0.15949900  0.14520800 -0.34274399\r\nv  0.13167401  0.16762701 -0.34875000\r\nv  0.10555100  0.18931100 -0.33609200\r\nv  0.08812850  0.20445000 -0.30816200\r\nv  0.08407520  0.20898899 -0.27244300\r\nv  0.09447720  0.20171000 -0.23850700\r\nv  0.11654700  0.18456499 -0.21544600\r\nv  0.14437200  0.16214700 -0.20943999\r\nv  0.17049500  0.14046299 -0.22209799\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.15462500  0.08798140 -0.24466200\r\nv  0.15435800  0.07861200 -0.27966201\r\nv  0.14101399  0.08259800 -0.31311101\r\nv  0.11816900  0.09887140 -0.33604899\r\nv  0.09194320  0.12307200 -0.34232700\r\nv  0.06936460  0.14871401 -0.33026400\r\nv  0.05648300  0.16892800 -0.30309299\r\nv  0.05674990  0.17829800 -0.26809299\r\nv  0.07009380  0.17431200 -0.23464300\r\nv  0.09293920  0.15803900 -0.21170600\r\nv  0.11916500  0.13383800 -0.20542701\r\nv  0.14174300  0.10819600 -0.21749000\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.12263300  0.05898890 -0.23238100\r\nv  0.11724100  0.04506940 -0.26539600\r\nv  0.10050000  0.04605440 -0.29751500\r\nv  0.07689380  0.06168000 -0.32012999\r\nv  0.05274890  0.08775940 -0.32718199\r\nv  0.03453450  0.11730500 -0.31678200\r\nv  0.02713130  0.14239900 -0.29171601\r\nv  0.03252290  0.15631901 -0.25870001\r\nv  0.04926460  0.15533400 -0.22658201\r\nv  0.07287060  0.13970800 -0.20396701\r\nv  0.09701550  0.11362900 -0.19691400\r\nv  0.11523000  0.08408340 -0.20731500\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.09315110  0.03876020 -0.21494900\r\nv  0.08191600  0.02111880 -0.24453600\r\nv  0.06141630  0.01978300 -0.27438301\r\nv  0.03714480  0.03511090 -0.29649201\r\nv  0.01560510  0.06299530 -0.30493900\r\nv  0.00256875  0.09596460 -0.29745999\r\nv  0.00152880  0.12518500 -0.27606100\r\nv  0.01276390  0.14282601 -0.24647400\r\nv  0.03326370  0.14416200 -0.21662700\r\nv  0.05753510  0.12883399 -0.19451800\r\nv  0.07907480  0.10095000 -0.18607099\r\nv  0.09211120  0.06798040 -0.19355001\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.06671240  0.02675630 -0.19410101\r\nv  0.04935180  0.00696193 -0.21899401\r\nv  0.02508490  0.00450140 -0.24578799\r\nv  0.00041404  0.02003400 -0.26730299\r\nv -0.01805030  0.04939800 -0.27777600\r\nv -0.02536060  0.08472510 -0.27439901\r\nv -0.01955810  0.11655000 -0.25807801\r\nv -0.00219748  0.13634400 -0.23318601\r\nv  0.02206940  0.13880500 -0.20639201\r\nv  0.04674030  0.12327200 -0.18487599\r\nv  0.06520460  0.09390800 -0.17440300\r\nv  0.07251490  0.05858090 -0.17778000\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04333270  0.02193930 -0.17130700\r\nv  0.02027950  0.00206506 -0.19096500\r\nv -0.00721708  0.00000158 -0.21447100\r\nv -0.03178940  0.01630170 -0.23552699\r\nv -0.04685320  0.04659790 -0.24849100\r\nv -0.04837230  0.08277220 -0.24989000\r\nv -0.03593960  0.11513200 -0.23934799\r\nv -0.01288640  0.13500600 -0.21969000\r\nv  0.01461020  0.13707000 -0.19618499\r\nv  0.03918250  0.12076900 -0.17512900\r\nv  0.05424640  0.09047340 -0.16216400\r\nv  0.05576550  0.05429900 -0.16076601\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.02274440  0.02314630 -0.14771500\r\nv -0.00495701  0.00513801 -0.16258700\r\nv -0.03469400  0.00484061 -0.18328699\r\nv -0.05849840  0.02233370 -0.20426700\r\nv -0.06999210  0.05293010 -0.21990700\r\nv -0.06609510  0.08843150 -0.22601600\r\nv -0.04785180  0.11932500 -0.22095600\r\nv -0.02015040  0.13733400 -0.20608400\r\nv  0.00958654  0.13763100 -0.18538401\r\nv  0.03339100  0.12013800 -0.16440400\r\nv  0.04488470  0.08954160 -0.14876400\r\nv  0.04098780  0.05404010 -0.14265500\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.00462627  0.02930390 -0.12419300\r\nv -0.02644730  0.01445420 -0.13545200\r\nv -0.05729590  0.01674660 -0.15431900\r\nv -0.07965360  0.03556680 -0.17573801\r\nv -0.08752970  0.06587200 -0.19397099\r\nv -0.07881390  0.09954180 -0.20413101\r\nv -0.05584150  0.12755500 -0.20349599\r\nv -0.02476790  0.14240400 -0.19223700\r\nv  0.00608064  0.14011200 -0.17337000\r\nv  0.02843840  0.12129200 -0.15195100\r\nv  0.03631450  0.09098650 -0.13371900\r\nv  0.02759870  0.05731660 -0.12355900\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.01124450  0.03947850 -0.10139300\r\nv -0.04451630  0.02831740 -0.11040800\r\nv -0.07549490  0.03340930 -0.12849800\r\nv -0.09587960  0.05338970 -0.15081599\r\nv -0.10020800  0.08290480 -0.17138200\r\nv -0.08732110  0.11404600 -0.18468601\r\nv -0.06067120  0.13846900 -0.18716200\r\nv -0.02739930  0.14963099 -0.17814700\r\nv  0.00357928  0.14453900 -0.16005699\r\nv  0.02396400  0.12455800 -0.13773900\r\nv  0.02829260  0.09504320 -0.11717300\r\nv  0.01540550  0.06390180 -0.10387000\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.02492100  0.05283150 -0.07978950\r\nv -0.05946040  0.04528540 -0.08772240\r\nv -0.08987920  0.05292220 -0.10586700\r\nv -0.10802700  0.07369550 -0.12936200\r\nv -0.10904000  0.10203900 -0.15191001\r\nv -0.09264790  0.13035899 -0.16747200\r\nv -0.06324250  0.15106601 -0.17187600\r\nv -0.02870310  0.15861200 -0.16394299\r\nv  0.00171563  0.15097500 -0.14579900\r\nv  0.01986300  0.13020100 -0.12230400\r\nv  0.02087640  0.10185800 -0.09975530\r\nv  0.00448436  0.07353840 -0.08419380\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.03640150  0.06856910 -0.05964470\r\nv -0.07154870  0.06420510 -0.06729160\r\nv -0.10103000  0.07389140 -0.08599600\r\nv -0.11694700  0.09503260 -0.11074600\r\nv -0.11503400  0.12196400 -0.13491000\r\nv -0.09580310  0.14746900 -0.15201201\r\nv -0.06440800  0.16471501 -0.15747200\r\nv -0.02926080  0.16907901 -0.14982501\r\nv  0.00022087  0.15939200 -0.13112099\r\nv  0.01613750  0.13825101 -0.10637100\r\nv  0.01422420  0.11132000 -0.08220690\r\nv -0.00500642  0.08581420 -0.06510410\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.04568940  0.08594650 -0.04104480\r\nv -0.08103250  0.08417460 -0.04882790\r\nv -0.10947700  0.09535770 -0.06828800\r\nv -0.12340100  0.11649900 -0.09421080\r\nv -0.11907400  0.14193501 -0.11965000\r\nv -0.09765550  0.16484800 -0.13778999\r\nv -0.06488400  0.17910001 -0.14376999\r\nv -0.02954100  0.18087199 -0.13598600\r\nv -0.00109646  0.16968900 -0.11652600\r\nv  0.01282780  0.14854801 -0.09060350\r\nv  0.00850088  0.12311200 -0.06516400\r\nv -0.01291790  0.10019900 -0.04702420\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.05292450  0.10433300 -0.02390480\r\nv -0.08824660  0.10456200 -0.03197600\r\nv -0.11573800  0.11675400 -0.05218570\r\nv -0.12803200  0.13764200 -0.07911900\r\nv -0.12183500  0.16162901 -0.10555900\r\nv -0.09880700  0.18228801 -0.12442100\r\nv -0.06511860  0.19408301 -0.13065100\r\nv -0.02979650  0.19385400 -0.12258000\r\nv -0.00230519  0.18166199 -0.10237000\r\nv  0.00998899  0.16077401 -0.07543680\r\nv  0.00379187  0.13678700 -0.04899690\r\nv -0.01923600  0.11612800 -0.03013490\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.05830970  0.12322700 -0.00807210\r\nv -0.09353060  0.12494200 -0.01640210\r\nv -0.12026100  0.13777199 -0.03722830\r\nv -0.13133800  0.15827800 -0.06497040\r\nv -0.12379500  0.18096700 -0.09219490\r\nv -0.09965090  0.19975799 -0.11160700\r\nv -0.06537680  0.20961700 -0.11800500\r\nv -0.03015580  0.20790100 -0.10967500\r\nv -0.00342548  0.19507200 -0.08884900\r\nv  0.00765189  0.17456500 -0.06110690\r\nv  0.00010812  0.15187700 -0.03388250\r\nv -0.02403550  0.13308500 -0.01447040\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06213670  0.14229099  0.00665937\r\nv -0.09725210  0.14509100 -0.00182052\r\nv -0.12344000  0.15831000 -0.02308780\r\nv -0.13368300  0.17840600 -0.05144400\r\nv -0.12523700  0.19999400 -0.07929110\r\nv -0.10036400  0.21729000 -0.09916740\r\nv -0.06573040  0.22565900 -0.10574700\r\nv -0.03061490  0.22285900 -0.09726720\r\nv -0.00442708  0.20964000 -0.07599990\r\nv  0.00581602  0.18954299 -0.04764370\r\nv -0.00263020  0.16795500 -0.01979670\r\nv -0.02750260  0.15065999  0.00007963\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06467370  0.16127899  0.02047150\r\nv -0.09971620  0.16487400  0.01198920\r\nv -0.12557200  0.17834701 -0.00952413\r\nv -0.13531201  0.19808801 -0.03830390\r\nv -0.12632801  0.21880700 -0.06663850\r\nv -0.10102600  0.23495200 -0.08693590\r\nv -0.06618580  0.24219801 -0.09375720\r\nv -0.03114340  0.23860300 -0.08527490\r\nv -0.00528798  0.22513001 -0.06376160\r\nv  0.00445250  0.20538899 -0.03498190\r\nv -0.00453192  0.18467000 -0.00664722\r\nv -0.02983380  0.16852500  0.01365010\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06620900  0.18006800  0.03356230\r\nv -0.10121500  0.18427400  0.02521100\r\nv -0.12690100  0.19795200  0.00362411\r\nv -0.13638400  0.21743800 -0.02541410\r\nv -0.12712300  0.23751000 -0.05412290\r\nv -0.10160100  0.25279099 -0.07480980\r\nv -0.06665450  0.25918499 -0.08193170\r\nv -0.03164850  0.25497901 -0.07358040\r\nv -0.00596273  0.24130100 -0.05199350\r\nv  0.00352047  0.22181500 -0.02295530\r\nv -0.00573998  0.20174301  0.00575352\r\nv -0.03126270  0.18646300  0.02644040\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06697920  0.19857199  0.04609830\r\nv -0.10197600  0.20328800  0.03798630\r\nv -0.12760299  0.21719401  0.01647500\r\nv -0.13699400  0.23656300 -0.01267150\r\nv -0.12763099  0.25620499 -0.04164340\r\nv -0.10202400  0.27085799 -0.06267780\r\nv -0.06703480  0.27659401 -0.07013850\r\nv -0.03203770  0.27187800 -0.06202650\r\nv -0.00641058  0.25797200 -0.04051530\r\nv  0.00297978  0.23860300 -0.01136880\r\nv -0.00638275  0.21896100  0.01760310\r\nv -0.03198950  0.20430900  0.03863760\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06719450  0.21674700  0.05824280\r\nv -0.10219300  0.22195099  0.05044170\r\nv -0.12781399  0.23616400  0.02912430\r\nv -0.13719200  0.25557601  0.00000257\r\nv -0.12781399  0.27498600 -0.02912030\r\nv -0.10219300  0.28919399 -0.05044090\r\nv -0.06719450  0.29439199 -0.05824640\r\nv -0.03219590  0.28918701 -0.05044530\r\nv -0.00657512  0.27497500 -0.02912790\r\nv  0.00280275  0.25556299 -0.00000614\r\nv -0.00657508  0.23615301  0.02911670\r\nv -0.03219580  0.22194500  0.05043740\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06703580  0.23454000  0.07013200\r\nv -0.10202500  0.24028400  0.06267570\r\nv -0.12763201  0.25494301  0.04164520\r\nv -0.13699301  0.27458900  0.01267580\r\nv -0.12760299  0.29395899 -0.01647020\r\nv -0.10197500  0.30786100 -0.03798330\r\nv -0.06697820  0.31257099 -0.04609890\r\nv -0.03198880  0.30682701 -0.03864250\r\nv -0.00638252  0.29216799 -0.01761210\r\nv  0.00297951  0.27252200  0.01135730\r\nv -0.00641128  0.25315300  0.04050330\r\nv -0.03203860  0.23925100  0.06201640\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06665850  0.25194499  0.08192220\r\nv -0.10160400  0.25834799  0.07480390\r\nv -0.12712499  0.27363700  0.05412130\r\nv -0.13638300  0.29371601  0.02541620\r\nv -0.12689801  0.31320399 -0.00361976\r\nv -0.10121100  0.32688001 -0.02520650\r\nv -0.06620500  0.33107901 -0.03355990\r\nv -0.03125960  0.32467601 -0.02644170\r\nv -0.00573850  0.30938801 -0.00575906\r\nv  0.00351989  0.28930900  0.02294600\r\nv -0.00596520  0.26982099  0.05198200\r\nv -0.03165230  0.25614500  0.07356880\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06619460  0.26892799  0.09374480\r\nv -0.10103300  0.27618501  0.08692650\r\nv -0.12633100  0.29234201  0.06663380\r\nv -0.13531099  0.31307000  0.03830410\r\nv -0.12556601  0.33281401  0.00952832\r\nv -0.09970800  0.34628499 -0.01198310\r\nv -0.06466500  0.34987199 -0.02046620\r\nv -0.02982690  0.34261501 -0.01364800\r\nv -0.00452854  0.32645899  0.00664474\r\nv  0.00445138  0.30573100  0.03497440\r\nv -0.00529330  0.28598601  0.06375020\r\nv -0.03115150  0.27251601  0.08526170\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06574630  0.28546301  0.10573100\r\nv -0.10037700  0.29384801  0.09915410\r\nv -0.12524299  0.31115901  0.07928310\r\nv -0.13368100  0.33275899  0.05144260\r\nv -0.12343000  0.35286000  0.02309230\r\nv -0.09723730  0.36607501  0.00182881\r\nv -0.06212080  0.36886400 -0.00665046\r\nv -0.02749000  0.36048001 -0.00007346\r\nv -0.00262421  0.34316799  0.01979750\r\nv  0.00581379  0.32156900  0.04763800\r\nv -0.00443695  0.30146801  0.07598830\r\nv -0.03062970  0.28825301  0.09725180\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06540300  0.30150199  0.11798400\r\nv -0.09967140  0.31138301  0.11158900\r\nv -0.12380400  0.33019501  0.09218330\r\nv -0.13133401  0.35289800  0.06496760\r\nv -0.12024400  0.37340999  0.03723400\r\nv -0.09350570  0.38623300  0.01641390\r\nv -0.05828350  0.38793200  0.00808581\r\nv -0.02401510  0.37805101  0.01448140\r\nv  0.00011722  0.35923901  0.03388680\r\nv  0.00764734  0.33653599  0.06110250\r\nv -0.00344250  0.31602401  0.08883610\r\nv -0.03018080  0.30320099  0.10965600\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06515820  0.31703299  0.13062400\r\nv -0.09883730  0.32885599  0.12439500\r\nv -0.12184800  0.34954101  0.10554000\r\nv -0.12802400  0.37354499  0.07911160\r\nv -0.11571100  0.39443800  0.05219060\r\nv -0.08820830  0.40662000  0.03199080\r\nv -0.05288500  0.40682799  0.02392470\r\nv -0.01920590  0.39500600  0.03015350\r\nv  0.00380461  0.37432101  0.04900830\r\nv  0.00998088  0.35031599  0.07543690\r\nv -0.00233201  0.32942399  0.10235800\r\nv -0.02983480  0.31724101  0.12255800\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06492950  0.33202001  0.14374000\r\nv -0.09768780  0.34630400  0.13776600\r\nv -0.11908500  0.36924601  0.11963600\r\nv -0.12338700  0.39469901  0.09420990\r\nv -0.10944200  0.41584200  0.06829950\r\nv -0.08098630  0.42701000  0.04884770\r\nv -0.04564410  0.42521101  0.04106660\r\nv -0.01288570  0.41092700  0.04704130\r\nv  0.00851134  0.38798499  0.06517070\r\nv  0.01281380  0.36253199  0.09059720\r\nv -0.00113130  0.34138900  0.11650800\r\nv -0.02958730  0.33022100  0.13595900\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06446360  0.34640899  0.15743700\r\nv -0.09583950  0.36369199  0.15198700\r\nv -0.11504100  0.38922900  0.13489801\r\nv -0.11692400  0.41617700  0.11075100\r\nv -0.10098300  0.43731600  0.08601560\r\nv -0.07148910  0.44698200  0.06731910\r\nv -0.03634620  0.44258499  0.05967170\r\nv -0.00497027  0.42530200  0.06512240\r\nv  0.01423150  0.39976501  0.08221070\r\nv  0.01611400  0.37281701  0.10635800\r\nv  0.00017280  0.35167801  0.13109399\r\nv -0.02932060  0.34201199  0.14979000\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06330780  0.36006501  0.17183600\r\nv -0.09268490  0.38081500  0.16744900\r\nv -0.10903900  0.40916899  0.15191001\r\nv -0.10798800  0.43752801  0.12938300\r\nv -0.08981290  0.45829499  0.10590300\r\nv -0.05938460  0.46590400  0.08776290\r\nv -0.02485600  0.45831600  0.07982240\r\nv  0.00452107  0.43756601  0.08420940\r\nv  0.02087500  0.40921199  0.09974840\r\nv  0.01982380  0.38085201  0.12227600\r\nv  0.00164913  0.36008599  0.14575499\r\nv -0.02877910  0.35247701  0.16389599\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06074210  0.37266901  0.18711700\r\nv -0.08735250  0.39713901  0.18467100\r\nv -0.10019200  0.42831400  0.17140000\r\nv -0.09581960  0.45784101  0.15086100\r\nv -0.07540760  0.47780901  0.12855700\r\nv -0.04442520  0.48286799  0.11046400\r\nv -0.01117390  0.47165999  0.10143100\r\nv  0.01543640  0.44719100  0.10387700\r\nv  0.02827570  0.41601601  0.11714800\r\nv  0.02390360  0.38648799  0.13768700\r\nv  0.00349165  0.36651999  0.15999100\r\nv -0.02749080  0.36146200  0.17808400\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.05590570  0.38359299  0.20345400\r\nv -0.07882730  0.41164601  0.20413500\r\nv -0.08748880  0.44534400  0.19402000\r\nv -0.07956940  0.47565499  0.17581700\r\nv -0.05719100  0.49445999  0.15440600\r\nv -0.02634990  0.49671900  0.13552301\r\nv  0.00468992  0.48182601  0.12422700\r\nv  0.02761150  0.45377299  0.12354600\r\nv  0.03627300  0.42007601  0.13366200\r\nv  0.02835360  0.38976401  0.15186401\r\nv  0.00597528  0.37095901  0.17327601\r\nv -0.02486570  0.36870101  0.19215900\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.04791060  0.39183000  0.22091700\r\nv -0.06608970  0.42275199  0.22603700\r\nv -0.06992400  0.45826900  0.21998300\r\nv -0.05838610  0.48886499  0.20437500\r\nv -0.03456750  0.50634199  0.18339700\r\nv -0.00485038  0.50601703  0.16267000\r\nv  0.02280250  0.48797700  0.14774600\r\nv  0.04098170  0.45705500  0.14262600\r\nv  0.04481600  0.42153800  0.14868100\r\nv  0.03327800  0.39094099  0.16428800\r\nv  0.00945944  0.37346399  0.18526600\r\nv -0.02025760  0.37378901  0.20599400\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.03598530  0.39602599  0.23931700\r\nv -0.04834470  0.42839199  0.24992600\r\nv -0.04675980  0.46456599  0.24858500\r\nv -0.03165530  0.49485499  0.23565100\r\nv -0.00707834  0.51114303  0.21459100\r\nv  0.02038560  0.50906599  0.19104800\r\nv  0.04337760  0.48918101  0.17133100\r\nv  0.05573700  0.45681500  0.16072100\r\nv  0.05415210  0.42064199  0.16206300\r\nv  0.03904760  0.39035299  0.17499700\r\nv  0.01447070  0.37406400  0.19605701\r\nv -0.01299330  0.37614101  0.21959899\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.01959270  0.39460900  0.25805500\r\nv -0.02531500  0.42641401  0.27444199\r\nv -0.01793680  0.46172199  0.27787200\r\nv  0.00056487  0.49107200  0.26742601\r\nv  0.02523250  0.50659901  0.24590300\r\nv  0.04945640  0.50414401  0.21907000\r\nv  0.06674590  0.48436400  0.19411699\r\nv  0.07246820  0.45255899  0.17772900\r\nv  0.06509000  0.41725099  0.17429900\r\nv  0.04658840  0.38790101  0.18474600\r\nv  0.02192070  0.37237301  0.20626900\r\nv -0.00230319  0.37482899  0.23310199\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.00149892  0.38597500  0.27604201\r\nv  0.00262010  0.41515300  0.29749599\r\nv  0.01572380  0.44808599  0.30501699\r\nv  0.03729880  0.47595000  0.29659101\r\nv  0.06156410  0.49127799  0.27447599\r\nv  0.08201790  0.48996300  0.24459700\r\nv  0.09317970  0.47235900  0.21495999\r\nv  0.09205850  0.44318101  0.19350700\r\nv  0.07895480  0.41024801  0.18598500\r\nv  0.05737980  0.38238499  0.19441099\r\nv  0.03311450  0.36705601  0.21652600\r\nv  0.01266070  0.36837101  0.24640501\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.02710830  0.36875999  0.29170299\r\nv  0.03458480  0.39379701  0.31680399\r\nv  0.05285880  0.42329600  0.32723299\r\nv  0.07703370  0.44935101  0.32019401\r\nv  0.10063200  0.46498200  0.29757401\r\nv  0.11733000  0.46599999  0.26543400\r\nv  0.12265400  0.45213199  0.23238599\r\nv  0.11517800  0.42709401  0.20728500\r\nv  0.09690400  0.39759600  0.19685601\r\nv  0.07272910  0.37154099  0.20389500\r\nv  0.04913090  0.35591000  0.22651500\r\nv  0.03243250  0.35489199  0.25865501\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.05647010  0.34222400  0.30308601\r\nv  0.06941130  0.36237800  0.33027399\r\nv  0.09203670  0.38797301  0.34235001\r\nv  0.11828400  0.41215199  0.33607700\r\nv  0.14112000  0.42843401  0.31313699\r\nv  0.15442599  0.43245900  0.27967700\r\nv  0.15463600  0.42314601  0.24466100\r\nv  0.14169499  0.40299201  0.21747300\r\nv  0.11906900  0.37739700  0.20539799\r\nv  0.09282240  0.35321900  0.21167000\r\nv  0.06998650  0.33693600  0.23461001\r\nv  0.05668060  0.33291101  0.26807001\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.08812420  0.30669400  0.30815801\r\nv  0.10559500  0.32177401  0.33609101\r\nv  0.13175499  0.34341300  0.34875000\r\nv  0.15959400  0.36581400  0.34274501\r\nv  0.18165199  0.38297299  0.31968400\r\nv  0.19202100  0.39029300  0.28574601\r\nv  0.18792000  0.38581300  0.25002500\r\nv  0.17044900  0.37073299  0.22209300\r\nv  0.14428900  0.34909400  0.20943400\r\nv  0.11645000  0.32669401  0.21543901\r\nv  0.09439150  0.30953401  0.23850000\r\nv  0.08402340  0.30221400  0.27243799\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.11998300  0.26385900  0.30526900\r\nv  0.14117700  0.27393100  0.33287701\r\nv  0.17017600  0.29175499  0.34529501\r\nv  0.19920900  0.31255701  0.33919400\r\nv  0.22049800  0.33076200  0.31621099\r\nv  0.22833700  0.34149101  0.28250200\r\nv  0.22062699  0.34187099  0.24710099\r\nv  0.19943300  0.33179900  0.21949300\r\nv  0.17043400  0.31397399  0.20707500\r\nv  0.14140099  0.29317299  0.21317500\r\nv  0.12011200  0.27496800  0.23615900\r\nv  0.11227300  0.26423800  0.26986700\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.14961100  0.21674700  0.29362699\r\nv  0.17388500  0.22191900  0.32002500\r\nv  0.20517100  0.23610801  0.33154699\r\nv  0.23508400  0.25551301  0.32510501\r\nv  0.25561100  0.27493200  0.30242500\r\nv  0.26125100  0.28916499  0.26958501\r\nv  0.25049201  0.29439500  0.23538300\r\nv  0.22621800  0.28922299  0.20898500\r\nv  0.19493300  0.27503401  0.19746301\r\nv  0.16501901  0.25562999  0.20390500\r\nv  0.14449300  0.23621000  0.22658500\r\nv  0.13885300  0.22197799  0.25942501\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.17469800  0.16926000  0.27361599\r\nv  0.20152800  0.16958199  0.29796401\r\nv  0.23465900  0.18027200  0.30801001\r\nv  0.26521301  0.19846700  0.30105999\r\nv  0.28500199  0.21929000  0.27897799\r\nv  0.28872499  0.23716199  0.24767999\r\nv  0.27538300  0.24729501  0.21555200\r\nv  0.24855299  0.24697299  0.19120400\r\nv  0.21542200  0.23628300  0.18115801\r\nv  0.18486799  0.21808800  0.18810800\r\nv  0.16507900  0.19726500  0.21019000\r\nv  0.16135600  0.17939200  0.24148799\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.19358200  0.12532000  0.24675301\r\nv  0.22248800  0.12078100  0.26812300\r\nv  0.25707901  0.12806100  0.27608299\r\nv  0.28808400  0.14520800  0.26850200\r\nv  0.30719700  0.16762900  0.24741000\r\nv  0.30929601  0.18931501  0.21845900\r\nv  0.29381800  0.20445600  0.18940599\r\nv  0.26491201  0.20899400  0.16803700\r\nv  0.23032100  0.20171501  0.16007601\r\nv  0.19931599  0.18456800  0.16765800\r\nv  0.18020301  0.16214700  0.18875000\r\nv  0.17810400  0.14046100  0.21770100\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.20557600  0.08799390  0.21525200\r\nv  0.23601900  0.07862810  0.23252399\r\nv  0.27166000  0.08261370  0.23769300\r\nv  0.30294800  0.09888270  0.22937299\r\nv  0.32150000  0.12307600  0.20979300\r\nv  0.32234401  0.14871100  0.18420000\r\nv  0.30525601  0.16891900  0.15945201\r\nv  0.27481201  0.17828400  0.14218000\r\nv  0.23917200  0.17429900  0.13701101\r\nv  0.20788400  0.15803000  0.14533100\r\nv  0.18933199  0.13383700  0.16491100\r\nv  0.18848699  0.10820200  0.19050400\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.21094000  0.05898840  0.18139300\r\nv  0.24222800  0.04506700  0.19322900\r\nv  0.27841499  0.04605110  0.19478799\r\nv  0.30980301  0.06167690  0.18565200\r\nv  0.32798299  0.08775750  0.16827001\r\nv  0.32808200  0.11730500  0.14729799\r\nv  0.31007600  0.14240099  0.12835699\r\nv  0.27878800  0.15632300  0.11652100\r\nv  0.24260101  0.15533900  0.11496300\r\nv  0.21121299  0.13971300  0.12409800\r\nv  0.19303299  0.11363200  0.14148000\r\nv  0.19293299  0.08408500  0.16245200\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.21058500  0.03875780  0.14714199\r\nv  0.24182600  0.02111550  0.15220299\r\nv  0.27792400  0.01977990  0.14937200\r\nv  0.30920601  0.03510900  0.13940801\r\nv  0.32729101  0.06299520  0.12498100\r\nv  0.32733199  0.09596650  0.10995600\r\nv  0.30932000  0.12518799  0.09836010\r\nv  0.27807900  0.14283100  0.09329950\r\nv  0.24198100  0.14416599  0.09613040\r\nv  0.21069901  0.12883700  0.10609400\r\nv  0.19261400  0.10095100  0.12052200\r\nv  0.19257200  0.06797960  0.13554600\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.20574901  0.02675460  0.11382200\r\nv  0.23598699  0.00696048  0.11123200\r\nv  0.27132499  0.00450072  0.10361300\r\nv  0.30229399  0.02003440  0.09300710\r\nv  0.32059500  0.04939930  0.08225550\r\nv  0.32132599  0.08472710  0.07423920\r\nv  0.30429000  0.11655200  0.07110640\r\nv  0.27405199  0.13634600  0.07369640\r\nv  0.23871499  0.13880600  0.08131530\r\nv  0.20774600  0.12327200  0.09192150\r\nv  0.18944401  0.09390710  0.10267300\r\nv  0.18871300  0.05857930  0.11068900\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.19769900  0.02193900  0.08218130\r\nv  0.22624899  0.00206494  0.07204300\r\nv  0.26035300  0.00000164  0.05998170\r\nv  0.29087400  0.01630190  0.04922920\r\nv  0.30963400  0.04659820  0.04266660\r\nv  0.31160501  0.08277250  0.04205230\r\nv  0.29626000  0.11513200  0.04755100\r\nv  0.26771000  0.13500600  0.05768920\r\nv  0.23360600  0.13706900  0.06975050\r\nv  0.20308501  0.12076900  0.08050300\r\nv  0.18432499  0.09047300  0.08706570\r\nv  0.18235400  0.05429860  0.08767990\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.18756200  0.02314800  0.05256340\r\nv  0.21429300  0.00513691  0.03601300\r\nv  0.24708800  0.00483695  0.02061040\r\nv  0.27715999  0.02232850  0.01048280\r\nv  0.29645100  0.05292460  0.00834373\r\nv  0.29979199  0.08842710  0.01476650\r\nv  0.28628799  0.11932300  0.02803010\r\nv  0.25955701  0.13733400  0.04458050\r\nv  0.22676200  0.13763399  0.05998310\r\nv  0.19668999  0.12014300  0.07011070\r\nv  0.17739899  0.08954670  0.07224980\r\nv  0.17405801  0.05404410  0.06582700\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.17625000  0.02930310  0.02510090\r\nv  0.20153800  0.01445440  0.00381987\r\nv  0.23330200  0.01674760 -0.01346160\r\nv  0.26303101  0.03556820 -0.02211310\r\nv  0.28275800  0.06587330 -0.01981630\r\nv  0.28719899  0.09954260 -0.00718671\r\nv  0.27516201  0.12755500  0.01239160\r\nv  0.24987499  0.14240301  0.03367260\r\nv  0.21811099  0.14011000  0.05095410\r\nv  0.18838200  0.12128900  0.05960550\r\nv  0.16865499  0.09098440  0.05730880\r\nv  0.16421400  0.05731510  0.04467920\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.16444100  0.03947790 -0.00003746\r\nv  0.18888301  0.02831560 -0.02434410\r\nv  0.22003900  0.03340650 -0.04212790\r\nv  0.24955900  0.05338650 -0.04862390\r\nv  0.26953399  0.08290200 -0.04209130\r\nv  0.27461201  0.11404400 -0.02428070\r\nv  0.26343200  0.13846900  0.00003569\r\nv  0.23898900  0.14963099  0.02434230\r\nv  0.20783401  0.14454000  0.04212610\r\nv  0.17831300  0.12456000  0.04862210\r\nv  0.15833800  0.09504490  0.04208960\r\nv  0.15325999  0.06390260  0.02427900\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.15256900  0.05283160 -0.02269310\r\nv  0.17670999  0.04528750 -0.04863810\r\nv  0.20763400  0.05292550 -0.06590710\r\nv  0.23705500  0.07369900 -0.06987300\r\nv  0.25708899  0.10204200 -0.05947300\r\nv  0.26236901  0.13035899 -0.03749380\r\nv  0.25148001  0.15106399 -0.00982476\r\nv  0.22733900  0.15860800  0.01612030\r\nv  0.19641501  0.15097000  0.03338930\r\nv  0.16699401  0.13019700  0.03735520\r\nv  0.14696001  0.10185400  0.02695520\r\nv  0.14168000  0.07353640  0.00497604\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.14086300  0.06856670 -0.04269470\r\nv  0.16505700  0.06420170 -0.06931150\r\nv  0.19599500  0.07388770 -0.08549460\r\nv  0.22538701  0.09502950 -0.08690760\r\nv  0.24535701  0.12196200 -0.07317210\r\nv  0.25055501  0.14746900 -0.04796830\r\nv  0.23958801  0.16471601 -0.01804970\r\nv  0.21539401  0.16908100  0.00856710\r\nv  0.18445601  0.15939499  0.02475020\r\nv  0.15506500  0.13825300  0.02616320\r\nv  0.13509400  0.11132000  0.01242770\r\nv  0.12989600  0.08581330 -0.01277610\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.12940000  0.08594520 -0.06004360\r\nv  0.15381099  0.08417270 -0.08676030\r\nv  0.18488599  0.09535550 -0.10166500\r\nv  0.21429799  0.11649700 -0.10076300\r\nv  0.23416600  0.14193299 -0.08429670\r\nv  0.23916601  0.16484700 -0.05667820\r\nv  0.22795901  0.17910001 -0.02530780\r\nv  0.20354800  0.18087301  0.00140894\r\nv  0.17247300  0.16969000  0.01631320\r\nv  0.14306100  0.14854801  0.01541150\r\nv  0.12319300  0.12311200 -0.00105467\r\nv  0.11819200  0.10019800 -0.02867310\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.11817400  0.10432900 -0.07487530\r\nv  0.14282300  0.10455700 -0.10143100\r\nv  0.17407000  0.11674900 -0.11513700\r\nv  0.20354100  0.13763800 -0.11232000\r\nv  0.22334100  0.16162699 -0.09373620\r\nv  0.22816300  0.18228801 -0.06436420\r\nv  0.21671499  0.19408500 -0.03207440\r\nv  0.19206600  0.19385700 -0.00551889\r\nv  0.16081899  0.18166600  0.00818690\r\nv  0.13134800  0.16077700  0.00537049\r\nv  0.11154800  0.13678800 -0.01321350\r\nv  0.10672600  0.11612700 -0.04258540\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.10715500  0.12322500 -0.08746030\r\nv  0.13197900  0.12494000 -0.11379700\r\nv  0.16338100  0.13776900 -0.12653300\r\nv  0.19294500  0.15827499 -0.12225600\r\nv  0.21275000  0.18096501 -0.10211100\r\nv  0.21748900  0.19975699 -0.07149700\r\nv  0.20589299  0.20961700 -0.03861610\r\nv  0.18106800  0.20790200 -0.01227900\r\nv  0.14966699  0.19507299  0.00045714\r\nv  0.12010300  0.17456700 -0.00382021\r\nv  0.10029800  0.15187800 -0.02396490\r\nv  0.09555820  0.13308500 -0.05457930\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.09630940  0.14229400 -0.09814680\r\nv  0.12121200  0.14509501 -0.12431600\r\nv  0.15272500  0.15831400 -0.13635901\r\nv  0.18240499  0.17840800 -0.13104901\r\nv  0.20229800  0.19999400 -0.10980900\r\nv  0.20707500  0.21728700 -0.07832880\r\nv  0.19545500  0.22565401 -0.04504490\r\nv  0.17055200  0.22285300 -0.01887530\r\nv  0.13903899  0.20963401 -0.00683216\r\nv  0.10935900  0.18954000 -0.01214240\r\nv  0.08946600  0.16795400 -0.03338310\r\nv  0.08468940  0.15066101 -0.06486290\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.08561710  0.16127799 -0.10724400\r\nv  0.11048400  0.16487300 -0.13335100\r\nv  0.14204299  0.17834599 -0.14498600\r\nv  0.17183700  0.19808599 -0.13903099\r\nv  0.19188400  0.21880600 -0.11708300\r\nv  0.19681001  0.23495100 -0.08502270\r\nv  0.18529800  0.24219801 -0.05144000\r\nv  0.16043100  0.23860300 -0.02533360\r\nv  0.12887201  0.22513001 -0.01369870\r\nv  0.09907780  0.20538899 -0.01965300\r\nv  0.07903150  0.18467000 -0.04160090\r\nv  0.07410450  0.16852400 -0.07366160\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.07504830  0.18006600 -0.11511800\r\nv  0.09978390  0.18427099 -0.14125900\r\nv  0.13132200  0.19794901 -0.15271001\r\nv  0.16121100  0.21743500 -0.14640400\r\nv  0.18144301  0.23750800 -0.12403100\r\nv  0.18659601  0.25279000 -0.09158460\r\nv  0.17529100  0.25918600 -0.05775970\r\nv  0.15055500  0.25498101 -0.03161930\r\nv  0.11901700  0.24130300 -0.02016790\r\nv  0.08912800  0.22181700 -0.02647380\r\nv  0.06889610  0.20174301 -0.04884730\r\nv  0.06374250  0.18646100 -0.08129350\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.06457060  0.19858301 -0.12206100\r\nv  0.08909640  0.20329800 -0.14831200\r\nv  0.12054200  0.21719900 -0.15974700\r\nv  0.15048200  0.23656200 -0.15330300\r\nv  0.17089400  0.25619799 -0.13070500\r\nv  0.17630801  0.27084601 -0.09801030\r\nv  0.16527399  0.27658099 -0.06397790\r\nv  0.14074799  0.27186599 -0.03772720\r\nv  0.10930200  0.25796500 -0.02629190\r\nv  0.07936230  0.23860200 -0.03273630\r\nv  0.05895060  0.21896601 -0.05533350\r\nv  0.05353640  0.20431800 -0.08802870\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.05417120  0.21673800 -0.12831099\r\nv  0.07842560  0.22194400 -0.15471999\r\nv  0.10969500  0.23616000 -0.16625100\r\nv  0.13960201  0.25557601 -0.15981300\r\nv  0.16013201  0.27498999 -0.13713101\r\nv  0.16578400  0.28920099 -0.10428400\r\nv  0.15504400  0.29439899 -0.07007150\r\nv  0.13079000  0.28919300 -0.04366190\r\nv  0.09952020  0.27497700 -0.03213120\r\nv  0.06961350  0.25556099 -0.03856920\r\nv  0.04908360  0.23614700 -0.06125070\r\nv  0.04343130  0.22193700 -0.09409840\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04379200  0.23453800 -0.13412000\r\nv  0.06774400  0.24028200 -0.16069400\r\nv  0.09875950  0.25494200 -0.17235400\r\nv  0.12852800  0.27458900 -0.16597800\r\nv  0.14907300  0.29395899 -0.14327200\r\nv  0.15489000  0.30786201 -0.11032200\r\nv  0.14442000  0.31257200 -0.07595550\r\nv  0.12046800  0.30682799 -0.04938190\r\nv  0.08945220  0.29216799 -0.03772130\r\nv  0.05968360  0.27252099 -0.04409820\r\nv  0.03913840  0.25315100 -0.06680370\r\nv  0.03332160  0.23924799 -0.09975410\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.03339250  0.25194401 -0.13968900\r\nv  0.05702910  0.25834799 -0.16639400\r\nv  0.08770050  0.27363801 -0.17815500\r\nv  0.11718800  0.29371700 -0.17182000\r\nv  0.13759100  0.31320599 -0.14908800\r\nv  0.14344300  0.32688099 -0.11604800\r\nv  0.13317400  0.33107901 -0.08155510\r\nv  0.10953800  0.32467499 -0.05485030\r\nv  0.07886640  0.30938500 -0.04308950\r\nv  0.04937850  0.28930500 -0.04942400\r\nv  0.02897540  0.26981699 -0.07215640\r\nv  0.02312410  0.25614199 -0.10519600\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.02292310  0.26892501 -0.14519900\r\nv  0.04624700  0.27618301 -0.17196000\r\nv  0.07646950  0.29234201 -0.18372300\r\nv  0.10549300  0.31307101 -0.17733400\r\nv  0.12554000  0.33281600 -0.15450700\r\nv  0.13123900  0.34628701 -0.12135700\r\nv  0.12106400  0.34987399 -0.08676770\r\nv  0.09773980  0.34261599 -0.06000640\r\nv  0.06751730  0.32645801 -0.04824410\r\nv  0.03849410  0.30572900 -0.05463250\r\nv  0.01844700  0.28598300 -0.07745970\r\nv  0.01274760  0.27251199 -0.11060900\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.01231180  0.28546700 -0.15080100\r\nv  0.03532310  0.29384899 -0.17750500\r\nv  0.06496610  0.31115699 -0.18910500\r\nv  0.09329790  0.33275399 -0.18249300\r\nv  0.11272700  0.35285300 -0.15944099\r\nv  0.11804700  0.36606899 -0.12612601\r\nv  0.10783400  0.36886001 -0.09147470\r\nv  0.08482230  0.36047801 -0.06477130\r\nv  0.05517930  0.34316900 -0.05317140\r\nv  0.02684750  0.32157201 -0.05978310\r\nv  0.00741839  0.30147299 -0.08283480\r\nv  0.00209794  0.28825700 -0.11615000\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.00153440  0.30150101 -0.15663300\r\nv  0.02420810  0.31138101 -0.18311200\r\nv  0.05308010  0.33019301 -0.19430800\r\nv  0.08041440  0.35289699 -0.18722101\r\nv  0.09888650  0.37340900 -0.16374999\r\nv  0.10354700  0.38623199 -0.13018399\r\nv  0.09314720  0.38793200 -0.09551720\r\nv  0.07047350  0.37805200 -0.06903820\r\nv  0.04160140  0.35924000 -0.05784220\r\nv  0.01426720  0.33653599 -0.06492920\r\nv -0.00420495  0.31602401 -0.08840030\r\nv -0.00886550  0.30320001 -0.12196600\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.00953276  0.31703100 -0.16274200\r\nv  0.01270140  0.32885501 -0.18879400\r\nv  0.04053500  0.34954000 -0.19929300\r\nv  0.06650990  0.37354600 -0.19142701\r\nv  0.08366630  0.39443901 -0.16730200\r\nv  0.08740700  0.40662199 -0.13338400\r\nv  0.07672980  0.40682900 -0.09876050\r\nv  0.05449560  0.39500600 -0.07270870\r\nv  0.02666200  0.37432000 -0.06220930\r\nv  0.00068711  0.35031399 -0.07007570\r\nv -0.01646920  0.32942101 -0.09420000\r\nv -0.02021000  0.31723899 -0.12811799\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.02102090  0.33202401 -0.16909400\r\nv  0.00053234  0.34630299 -0.19447900\r\nv  0.02693450  0.36923999 -0.20394900\r\nv  0.05111120  0.39468801 -0.19496600\r\nv  0.06658420  0.41582999 -0.16993700\r\nv  0.06920760  0.42699999 -0.13556799\r\nv  0.05827850  0.42520499 -0.10106900\r\nv  0.03672530  0.41092601 -0.07568380\r\nv  0.01032310  0.38799000 -0.06621390\r\nv -0.01385350  0.36254099 -0.07519700\r\nv -0.02932660  0.34139901 -0.10022600\r\nv -0.03195000  0.33022901 -0.13459501\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.03309980  0.34640801 -0.17554800\r\nv -0.01269130  0.36369199 -0.19999400\r\nv  0.01170750  0.38923001 -0.20807800\r\nv  0.03355890  0.41617900 -0.19763300\r\nv  0.04700790  0.43731901 -0.17145801\r\nv  0.04845080  0.44698399 -0.13656799\r\nv  0.03750110  0.44258499 -0.10231000\r\nv  0.01709260  0.42530099 -0.07786430\r\nv -0.00730613  0.39976299 -0.06978080\r\nv -0.02915760  0.37281299 -0.08022550\r\nv -0.04260660  0.35167399 -0.10640000\r\nv -0.04404950  0.34200901 -0.14128999\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.04614590  0.36006299 -0.18174700\r\nv -0.02765900  0.38081601 -0.20499399\r\nv -0.00602690  0.40917200 -0.21138500\r\nv  0.01295400  0.43753299 -0.19920900\r\nv  0.02419790  0.45829901 -0.17172800\r\nv  0.02469190  0.46590599 -0.13630600\r\nv  0.01430370  0.45831600 -0.10243400\r\nv -0.00418324  0.43756300 -0.07918770\r\nv -0.02581530  0.40920800 -0.07279620\r\nv -0.04479630  0.38084701 -0.08497220\r\nv -0.05604020  0.36008099 -0.11245300\r\nv -0.05653420  0.35247400 -0.14787500\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06066970  0.37266901 -0.18716200\r\nv -0.04524570  0.39713800 -0.20898500\r\nv -0.02733280  0.42831299 -0.21346900\r\nv -0.01173070  0.45784000 -0.19941400\r\nv -0.00261986  0.47780800 -0.17058399\r\nv -0.00244164  0.48286700 -0.13470700\r\nv -0.01124380  0.47165999 -0.10139300\r\nv -0.02666770  0.44719100 -0.07957060\r\nv -0.04458060  0.41601601 -0.07508620\r\nv -0.06018270  0.38648900 -0.08914160\r\nv -0.06929360  0.36652100 -0.11797100\r\nv -0.06947180  0.36146200 -0.15384901\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.07723240  0.38359299 -0.19114400\r\nv -0.06636100  0.41164699 -0.21133500\r\nv -0.05326990  0.44534400 -0.21377701\r\nv -0.04146700  0.47565600 -0.19781700\r\nv -0.03411480  0.49445999 -0.16773100\r\nv -0.03318330  0.49671900 -0.13158000\r\nv -0.03892210  0.48182601 -0.09905100\r\nv -0.04979360  0.45377201 -0.07886050\r\nv -0.06288460  0.42007500 -0.07641810\r\nv -0.07468750  0.38976300 -0.09237830\r\nv -0.08203980  0.37095901 -0.12246500\r\nv -0.08297120  0.36870000 -0.15861499\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.09635540  0.39183000 -0.19295000\r\nv -0.09170110  0.42275199 -0.21125400\r\nv -0.08454110  0.45826900 -0.21154700\r\nv -0.07679400  0.48886600 -0.19375201\r\nv -0.07053550  0.50634199 -0.16263500\r\nv -0.06744260  0.50601703 -0.12653600\r\nv -0.06834410  0.48797601 -0.09512580\r\nv -0.07299840  0.45705500 -0.07682210\r\nv -0.08015840  0.42153701 -0.07652880\r\nv -0.08790550  0.39094099 -0.09432460\r\nv -0.09416400  0.37346399 -0.12544100\r\nv -0.09725690  0.37378901 -0.16154100\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.11826400  0.39602199 -0.19181700\r\nv -0.12126500  0.42838600 -0.20782900\r\nv -0.12088800  0.46456000 -0.20579000\r\nv -0.11723200  0.49485099 -0.18624599\r\nv -0.11127900  0.51114202 -0.15443400\r\nv -0.10462200  0.50906801 -0.11887800\r\nv -0.09904590  0.48918501 -0.08910520\r\nv -0.09604440  0.45682099 -0.07309310\r\nv -0.09642190  0.42064700 -0.07513210\r\nv -0.10007700  0.39035600 -0.09467600\r\nv -0.10603100  0.37406501 -0.12648800\r\nv -0.11268700  0.37613899 -0.16204400\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.14267500  0.39460999 -0.18699700\r\nv -0.15400800  0.42641500 -0.20014501\r\nv -0.16067000  0.46172199 -0.19546901\r\nv -0.16087601  0.49107200 -0.17422201\r\nv -0.15457100  0.50659800 -0.14209700\r\nv -0.14344400  0.50414300 -0.10770200\r\nv -0.13047600  0.48436201 -0.08025330\r\nv -0.11914300  0.45255801 -0.06710550\r\nv -0.11248100  0.41725099 -0.07178150\r\nv -0.11227500  0.38790101 -0.09302850\r\nv -0.11858000  0.37237400 -0.12515301\r\nv -0.12970699  0.37483001 -0.15954800\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.16879000  0.38598400 -0.17772999\r\nv -0.18793800  0.41515800 -0.18748100\r\nv -0.20101200  0.44808599 -0.17988800\r\nv -0.20451000  0.47594401 -0.15698600\r\nv -0.19749400  0.49126899 -0.12491100\r\nv -0.18184300  0.48995399 -0.09225860\r\nv -0.16175300  0.47235101 -0.06777730\r\nv -0.14260501  0.44317701 -0.05802690\r\nv -0.12953000  0.41024899 -0.06562000\r\nv -0.12603199  0.38238999 -0.08852200\r\nv -0.13304900  0.36706501 -0.12059600\r\nv -0.14869900  0.36838099 -0.15324900\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.19517000  0.36875799 -0.16337401\r\nv -0.22064500  0.39379701 -0.16945100\r\nv -0.23881100  0.42329699 -0.15884100\r\nv -0.24480100  0.44935399 -0.13438700\r\nv -0.23701000  0.46498501 -0.10264100\r\nv -0.21752600  0.46600300 -0.07210910\r\nv -0.19156900  0.45213401 -0.05097300\r\nv -0.16609401  0.42709500 -0.04489580\r\nv -0.14792800  0.39759499 -0.05550570\r\nv -0.14193800  0.37153801 -0.07996000\r\nv -0.14972900  0.35590699 -0.11170600\r\nv -0.16921300  0.35488901 -0.14223801\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.21971300  0.34221399 -0.14363199\r\nv -0.24972600  0.36237299 -0.14602201\r\nv -0.27149200  0.38797399 -0.13247000\r\nv -0.27917999  0.41215801 -0.10660700\r\nv -0.27072901  0.42844501 -0.07536300\r\nv -0.24840300  0.43246999 -0.04711020\r\nv -0.21818601  0.42315501 -0.02941860\r\nv -0.18817300  0.40299699 -0.02702860\r\nv -0.16640700  0.37739599 -0.04058070\r\nv -0.15871900  0.35321200 -0.06644360\r\nv -0.16717000  0.33692500 -0.09768730\r\nv -0.18949600  0.33289999 -0.12594000\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.23992500  0.30669701 -0.11876400\r\nv -0.27285099  0.32177600 -0.11759900\r\nv -0.29689500  0.34341300 -0.10127200\r\nv -0.30561501  0.36581099 -0.07415870\r\nv -0.29667300  0.38296899 -0.04352360\r\nv -0.27246699  0.39028901 -0.01757550\r\nv -0.23948100  0.38580999 -0.00326694\r\nv -0.20655499  0.37073100 -0.00443206\r\nv -0.18251100  0.34909400 -0.02075860\r\nv -0.17379101  0.32669601 -0.04787190\r\nv -0.18273300  0.30953801 -0.07850700\r\nv -0.20693900  0.30221799 -0.10445500\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.25335199  0.26386899 -0.08973240\r\nv -0.28785899  0.27393800 -0.08518010\r\nv -0.31311300  0.29175699 -0.06627200\r\nv -0.32234800  0.31255299 -0.03807460\r\nv -0.31308901  0.33075300 -0.00814333\r\nv -0.28781700  0.34147999  0.01550170\r\nv -0.25330299  0.34186000  0.02652500\r\nv -0.21879600  0.33179101  0.02197260\r\nv -0.19354101  0.31397200  0.00306458\r\nv -0.18430600  0.29317600 -0.02513280\r\nv -0.19356599  0.27497599 -0.05506410\r\nv -0.21883801  0.26424900 -0.07870920\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.25808501  0.21674301 -0.05824340\r\nv -0.29308400  0.22191601 -0.05042110\r\nv -0.31870499  0.23610599 -0.02908900\r\nv -0.32808200  0.25551200  0.00003681\r\nv -0.31870499  0.27493301  0.02915220\r\nv -0.29308400  0.28916699  0.05045570\r\nv -0.25808501  0.29439801  0.05823900\r\nv -0.22308700  0.28922501  0.05041670\r\nv -0.19746600  0.27503499  0.02908460\r\nv -0.18808800  0.25562900 -0.00004122\r\nv -0.19746600  0.23620699 -0.02915660\r\nv -0.22308700  0.22197400 -0.05046010\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.25329599  0.16924900 -0.02650820\r\nv -0.28779799  0.16957100 -0.01544630\r\nv -0.31306300  0.18026400  0.00822143\r\nv -0.32232299  0.19846199  0.03815330\r\nv -0.31309500  0.21929100  0.06632900\r\nv -0.28785199  0.23716800  0.08519890\r\nv -0.25335899  0.24730401  0.08970690\r\nv -0.21885701  0.24698199  0.07864500\r\nv -0.19359200  0.23628899  0.05497720\r\nv -0.18433200  0.21809000  0.02504540\r\nv -0.19356000  0.19726200 -0.00313033\r\nv -0.21880300  0.17938501 -0.02200030\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.23947801  0.12532200  0.00326882\r\nv -0.27243799  0.12078400  0.01761750\r\nv -0.29662701  0.12806299  0.04359340\r\nv -0.30556300  0.14521000  0.07423630\r\nv -0.29685301  0.16762801  0.10133600\r\nv -0.27282900  0.18931299  0.11763000\r\nv -0.23993000  0.20445199  0.11875300\r\nv -0.20697001  0.20898999  0.10440500\r\nv -0.18278100  0.20171100  0.07842870\r\nv -0.17384399  0.18456499  0.04778580\r\nv -0.18255500  0.16214600  0.02068650\r\nv -0.20657800  0.14046100  0.00439217\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.21819501  0.08799590  0.02940650\r\nv -0.24837400  0.07862990  0.04713500\r\nv -0.27067000  0.08261450  0.07541700\r\nv -0.27910700  0.09888210  0.10667400\r\nv -0.27142599  0.12307400  0.13253200\r\nv -0.24968299  0.14870800  0.14606000\r\nv -0.21970600  0.16891500  0.14363600\r\nv -0.18952601  0.17828099  0.12590700\r\nv -0.16723099  0.17429601  0.09762510\r\nv -0.15879300  0.15802900  0.06636780\r\nv -0.16647500  0.13383700  0.04051050\r\nv -0.18821700  0.10820300  0.02698170\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.19155300  0.05898920  0.05098200\r\nv -0.21744999  0.04506960  0.07215910\r\nv -0.23689400  0.04605450  0.10271700\r\nv -0.24467599  0.06168000  0.13446800\r\nv -0.23871100  0.08775940  0.15890400\r\nv -0.22059700  0.11730500  0.16947800\r\nv -0.19518700  0.14239900  0.16335700\r\nv -0.16929100  0.15631901  0.14218000\r\nv -0.14984700  0.15533400  0.11162200\r\nv -0.14206401  0.13970800  0.07987070\r\nv -0.14802900  0.11362900  0.05543430\r\nv -0.16614400  0.08408360  0.04486040\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.16170201  0.03875000  0.06780730\r\nv -0.18170100  0.02110670  0.09233510\r\nv -0.19729801  0.01977230  0.12501200\r\nv -0.20431300  0.03510430  0.15708400\r\nv -0.20086800  0.06299460  0.17995501\r\nv -0.18788400  0.09597000  0.18749900\r\nv -0.16884200  0.12519500  0.17769299\r\nv -0.14884301  0.14283800  0.15316500\r\nv -0.13324700  0.14417300  0.12048800\r\nv -0.12623100  0.12884000  0.08841640\r\nv -0.12967700  0.10095000  0.06554490\r\nv -0.14266001  0.06797480  0.05800150\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.13044301  0.02675710  0.08027040\r\nv -0.14332099  0.00696260  0.10775100\r\nv -0.15439200  0.00450185  0.14216401\r\nv -0.16068900  0.02003420  0.17428701\r\nv -0.16052601  0.04939770  0.19551501\r\nv -0.15394500  0.08472450  0.20015800\r\nv -0.14271000  0.11654900  0.18697301\r\nv -0.12983200  0.13634300  0.15949200\r\nv -0.11876100  0.13880400  0.12508000\r\nv -0.11246400  0.12327200  0.09295590\r\nv -0.11262800  0.09390830  0.07172850\r\nv -0.11920800  0.05858150  0.06708520\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.09902570  0.02194530  0.08911360\r\nv -0.10452700  0.00206760  0.11890400\r\nv -0.11113500  0.00000000  0.15447000\r\nv -0.11707800  0.01629650  0.18628100\r\nv -0.12076500  0.04659040  0.20581400\r\nv -0.12120700  0.08276460  0.20783401\r\nv -0.11828600  0.11512600  0.19180200\r\nv -0.11278400  0.13500400  0.16201100\r\nv -0.10617700  0.13707100  0.12644599\r\nv -0.10023300  0.12077500  0.09463470\r\nv -0.09654680  0.09048100  0.07510180\r\nv -0.09610470  0.05430680  0.07308090\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.06828600  0.02314650  0.09515520\r\nv -0.06731460  0.00513813  0.12658100\r\nv -0.07037220  0.00484058  0.16268399\r\nv -0.07663940  0.02233360  0.19379000\r\nv -0.08443690  0.05293000  0.21156400\r\nv -0.09167540  0.08843130  0.21124300\r\nv -0.09641540  0.11932500  0.19291399\r\nv -0.09738670  0.13733400  0.16148800\r\nv -0.09432910  0.13763100  0.12538500\r\nv -0.08806200  0.12013800  0.09427970\r\nv -0.08026440  0.08954180  0.07650580\r\nv -0.07302590  0.05404040  0.07682620\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.03884530  0.02930250  0.09909140\r\nv -0.03305910  0.01445690  0.13163300\r\nv -0.03397670  0.01675270  0.16778199\r\nv -0.04135230  0.03557460  0.19785200\r\nv -0.05320960  0.06587940  0.21378499\r\nv -0.06637130  0.09954700  0.21131299\r\nv -0.07731090  0.12755600  0.19109701\r\nv -0.08309710  0.14240199  0.15855500\r\nv -0.08217940  0.14010599  0.12240700\r\nv -0.07480380  0.12128400  0.09233690\r\nv -0.06294660  0.09097920  0.07640360\r\nv -0.04978490  0.05731160  0.07887590\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.01117690  0.03947870  0.10142900\r\nv -0.00234817  0.02831680  0.13474999\r\nv -0.00252500  0.03340800  0.17062400\r\nv -0.01166000  0.05338810  0.19943701\r\nv -0.02730550  0.08290350  0.21346900\r\nv -0.04526930  0.11404600  0.20896100\r\nv -0.06073800  0.13846999  0.18712001\r\nv -0.06956680  0.14963201  0.15379800\r\nv -0.06938990  0.14454000  0.11792500\r\nv -0.06025490  0.12456000  0.08911210\r\nv -0.04460940  0.09504490  0.07507970\r\nv -0.02664560  0.06390290  0.07958790\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.01437750  0.05283240  0.10247500\r\nv  0.02477690  0.04528880  0.13635400\r\nv  0.02427120  0.05292720  0.17176899\r\nv  0.01299570  0.07370080  0.19923200\r\nv -0.00602819  0.10204400  0.21138200\r\nv -0.02770310  0.13036101  0.20496500\r\nv -0.04622120  0.15106501  0.18170001\r\nv -0.05662060  0.15860900  0.14782099\r\nv -0.05611480  0.15097000  0.11240600\r\nv -0.04483930  0.13019700  0.08494340\r\nv -0.02581550  0.10185400  0.07279300\r\nv -0.00414058  0.07353680  0.07921000\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.03756240  0.06857040  0.10234400\r\nv  0.04851430  0.06420910  0.13660599\r\nv  0.04705630  0.07389720  0.17149000\r\nv  0.03357900  0.09503870  0.19764800\r\nv  0.01169390  0.12196900  0.20807201\r\nv -0.01273520  0.14747199  0.19996800\r\nv -0.03316240  0.16471399  0.17550801\r\nv -0.04411420  0.16907500  0.14124601\r\nv -0.04265620  0.15938701  0.10636200\r\nv -0.02917900  0.13824600  0.08020410\r\nv -0.00729382  0.11131500  0.06978040\r\nv  0.01713520  0.08581260  0.07788430\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.05830150  0.08594320  0.10108000\r\nv  0.06923500  0.08416780  0.13557900\r\nv  0.06660840  0.09534930  0.16994300\r\nv  0.05112550  0.11649200  0.19496600\r\nv  0.02693510  0.14193000  0.20394100\r\nv  0.00051880  0.16484800  0.19446500\r\nv -0.02104500  0.17910500  0.16907600\r\nv -0.03197850  0.18088000  0.13457800\r\nv -0.02935190  0.16969900  0.10021300\r\nv -0.01386900  0.14855599  0.07519080\r\nv  0.01032140  0.12311800  0.06621510\r\nv  0.03673770  0.10020000  0.07569130\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.07678370  0.10434000  0.09878790\r\nv  0.08745150  0.10457300  0.13341400\r\nv  0.08368930  0.11676600  0.16732600\r\nv  0.06650530  0.13765199  0.19143701\r\nv  0.04050370  0.16163500  0.19928700\r\nv  0.01265180  0.18228699  0.18877099\r\nv -0.00958757  0.19407700  0.16270800\r\nv -0.02025540  0.19384401  0.12808201\r\nv -0.01649320  0.18165100  0.09416980\r\nv  0.00069083  0.16076501  0.07005890\r\nv  0.02669240  0.13678300  0.06220960\r\nv  0.05454430  0.11613000  0.07272510\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.09319210  0.12323900  0.09553660\r\nv  0.10358300  0.12495800  0.13020501\r\nv  0.09890340  0.13778700  0.16376700\r\nv  0.08040780  0.15828900  0.18722799\r\nv  0.05305180  0.18097100  0.19430199\r\nv  0.02416540  0.19975400  0.18309399\r\nv  0.00148879  0.20960601  0.15660800\r\nv -0.00890194  0.20788699  0.12193900\r\nv -0.00422257  0.19505800  0.08837750\r\nv  0.01427300  0.17455600  0.06491650\r\nv  0.04162900  0.15187401  0.05784200\r\nv  0.07051540  0.13309100  0.06904980\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.10783000  0.14227600  0.09147020\r\nv  0.11805000  0.14507399  0.12611900\r\nv  0.11273500  0.15829501  0.15943301\r\nv  0.09330900  0.17839700  0.18248500\r\nv  0.06497740  0.19999400  0.18909800\r\nv  0.03533150  0.21729900  0.17749999\r\nv  0.01231490  0.22567500  0.15080000\r\nv  0.00209487  0.22287799  0.11615000\r\nv  0.00740992  0.20965700  0.08283670\r\nv  0.02683580  0.18955500  0.05978490\r\nv  0.05516750  0.16795699  0.05317190\r\nv  0.08481340  0.15065201  0.06476950\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.12106700  0.16126899  0.08676540\r\nv  0.13124600  0.16486301  0.12135300\r\nv  0.12554900  0.17833900  0.15450101\r\nv  0.10550100  0.19808500  0.17732801\r\nv  0.07647480  0.21881001  0.18371600\r\nv  0.04624790  0.23496100  0.17195500\r\nv  0.02291950  0.24221000  0.14519501\r\nv  0.01274030  0.23861501  0.11060700\r\nv  0.01843780  0.22514001  0.07745920\r\nv  0.03848550  0.20539400  0.05463280\r\nv  0.06751160  0.18466900  0.04824440\r\nv  0.09773840  0.16851801  0.06000580\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.13317300  0.18005800  0.08155180\r\nv  0.14344600  0.18426301  0.11604300\r\nv  0.13759799  0.19794300  0.14908101\r\nv  0.11719700  0.21743400  0.17181300\r\nv  0.08770800  0.23751201  0.17814800\r\nv  0.05703390  0.25279900  0.16638900\r\nv  0.03339330  0.25919700  0.13968600\r\nv  0.02312070  0.25499201  0.10519500\r\nv  0.02896860  0.24131200  0.07215680\r\nv  0.04937000  0.22182100  0.04942490\r\nv  0.07885850  0.20174301  0.04308980\r\nv  0.10953300  0.18645599  0.05484900\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.14443401  0.19858700  0.07594940\r\nv  0.15490501  0.20330299  0.11031500\r\nv  0.14908500  0.21720301  0.14326499\r\nv  0.12853301  0.23656499  0.16597199\r\nv  0.09875660  0.25619999  0.17235000\r\nv  0.06773400  0.27084699  0.16069201\r\nv  0.04377780  0.27658099  0.13412000\r\nv  0.03330680  0.27186599  0.09975460\r\nv  0.03912690  0.25796500  0.06680410\r\nv  0.05967860  0.23860300  0.04409740\r\nv  0.08945490  0.21896800  0.03771880\r\nv  0.12047800  0.20432100  0.04937740\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.15505400  0.21675700  0.07006260\r\nv  0.16579600  0.22195899  0.10427300\r\nv  0.16014300  0.23616800  0.13712201\r\nv  0.13961001  0.25557601  0.15980500\r\nv  0.10969700  0.27498201  0.16624700\r\nv  0.07842090  0.28918701  0.15471999\r\nv  0.05416150  0.29438400  0.12831300\r\nv  0.04341910  0.28918099  0.09410220\r\nv  0.04907220  0.27497301  0.06125410\r\nv  0.06960600  0.25556499  0.03857020\r\nv  0.09951840  0.23615900  0.03212880\r\nv  0.13079500  0.22195400  0.04365580\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.16526000  0.23452900  0.06399000\r\nv  0.17629801  0.24027599  0.09801940\r\nv  0.17088901  0.25494000  0.13070799\r\nv  0.15048499  0.27459300  0.15329801\r\nv  0.12055100  0.29396799  0.15973499\r\nv  0.08910940  0.30787399  0.14829400\r\nv  0.06458410  0.31258500  0.12204300\r\nv  0.05354680  0.30683801  0.08801310\r\nv  0.05895500  0.29217401  0.05532420\r\nv  0.07935960  0.27252099  0.03273490\r\nv  0.10929300  0.25314599  0.02629790\r\nv  0.14073500  0.23924001  0.03773800\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.17529400  0.25196201  0.05775010\r\nv  0.18660299  0.25836101  0.09157310\r\nv  0.18145201  0.27364299  0.12402000\r\nv  0.16122000  0.29371300  0.14639500\r\nv  0.13132800  0.31319401  0.15270500\r\nv  0.09978570  0.32686600  0.14125800\r\nv  0.07504530  0.33106500  0.11512100\r\nv  0.06373560  0.32466599  0.08129840\r\nv  0.06888710  0.30938399  0.04885190\r\nv  0.08911940  0.28931400  0.02647600\r\nv  0.11901100  0.26983300  0.02016630\r\nv  0.15055300  0.25616100  0.03161340\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.18529899  0.26894400  0.05143480\r\nv  0.19681600  0.27619600  0.08501460\r\nv  0.19189200  0.29234600  0.11707400\r\nv  0.17184700  0.31306601  0.13902199\r\nv  0.14205100  0.33280501  0.14497800\r\nv  0.11048900  0.34627199  0.13334601\r\nv  0.08561670  0.34986001  0.10724300\r\nv  0.07409970  0.34260699  0.07366300\r\nv  0.07902340  0.32645699  0.04160410\r\nv  0.09906870  0.30573699  0.01965610\r\nv  0.12886401  0.28599900  0.01370000\r\nv  0.16042700  0.27253199  0.02533180\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.19544899  0.28545001  0.04508570\r\nv  0.20706400  0.29384100  0.07836490\r\nv  0.20228601  0.31116199  0.10982900\r\nv  0.18239500  0.33276999  0.13104799\r\nv  0.15272000  0.35287699  0.13633600\r\nv  0.12121300  0.36609501  0.12427600\r\nv  0.09631580  0.36888099  0.09809920\r\nv  0.08470010  0.36048999  0.06482000\r\nv  0.08947810  0.34316900  0.03335540\r\nv  0.10936900  0.32156000  0.01213640\r\nv  0.13904400  0.30145401  0.00684859\r\nv  0.17055200  0.28823599  0.01890880\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.20589100  0.30149701  0.03865300\r\nv  0.21748400  0.31138101  0.07152770\r\nv  0.21274300  0.33019799  0.10212700\r\nv  0.19293800  0.35290599  0.12225100\r\nv  0.16337600  0.37341899  0.12650800\r\nv  0.13197801  0.38624299  0.11375800\r\nv  0.10715700  0.38793999  0.08741640\r\nv  0.09556390  0.37805599  0.05454170\r\nv  0.10030500  0.35923901  0.02394260\r\nv  0.12011000  0.33653101  0.00381827\r\nv  0.14967200  0.31601799 -0.00043911\r\nv  0.18107000  0.30319399  0.01231130\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.21671499  0.31702900  0.03212380\r\nv  0.22815800  0.32885599  0.06440390\r\nv  0.22333300  0.34954700  0.09375480\r\nv  0.20353200  0.37355599  0.11231200\r\nv  0.17406200  0.39445099  0.11510200\r\nv  0.14281900  0.40663201  0.10137900\r\nv  0.11817400  0.40683600  0.07481890\r\nv  0.10673200  0.39500800  0.04253870\r\nv  0.11155700  0.37431800  0.01318790\r\nv  0.13135700  0.35030901 -0.00536900\r\nv  0.16082700  0.32941401 -0.00815970\r\nv  0.19207001  0.31723300  0.00556359\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.22796001  0.33202600  0.02534110\r\nv  0.23916800  0.34630501  0.05669950\r\nv  0.23416799  0.36924201  0.08429920\r\nv  0.21430001  0.39469099  0.10074500\r\nv  0.18488701  0.41583300  0.10163000\r\nv  0.15381201  0.42700300  0.08671760\r\nv  0.12939900  0.42520800  0.06000300\r\nv  0.11819200  0.41092899  0.02864460\r\nv  0.12319200  0.38799199  0.00104491\r\nv  0.14306000  0.36254299 -0.01540090\r\nv  0.17247200  0.34140101 -0.01628600\r\nv  0.20354800  0.33023101 -0.00137346\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.23958901  0.34641099  0.01809910\r\nv  0.25055701  0.36369300  0.04799720\r\nv  0.24536000  0.38922900  0.07317170\r\nv  0.22538900  0.41617700  0.08687710\r\nv  0.19599700  0.43731600  0.08544100\r\nv  0.16505800  0.44698200  0.06924840\r\nv  0.14086300  0.44258499  0.04263790\r\nv  0.12989500  0.42530400  0.01273980\r\nv  0.13509201  0.39976799 -0.01243470\r\nv  0.15506300  0.37281999 -0.02614010\r\nv  0.18445501  0.35168099 -0.02470410\r\nv  0.21539401  0.34201500 -0.00851140\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.25148100  0.36006600  0.00990450\r\nv  0.26236999  0.38081801  0.03753810\r\nv  0.25709000  0.40917301  0.05946880\r\nv  0.23705500  0.43753299  0.06982050\r\nv  0.20763400  0.45829901  0.06581940\r\nv  0.17670999  0.46590701  0.04853750\r\nv  0.15256900  0.45831800  0.02260560\r\nv  0.14167900  0.43756601 -0.00502793\r\nv  0.14696001  0.40921101 -0.02695870\r\nv  0.16699401  0.38085100 -0.03731040\r\nv  0.19641601  0.36008400 -0.03330930\r\nv  0.22734000  0.35247701 -0.01602750\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv  0.04734000  0.25556999 -0.00000165\r\nv -0.02983380  0.16852500  0.01365010\r\nv -0.02983380  0.16852500  0.01365010\r\nv -0.03126270  0.18646300  0.02644040\r\nv -0.02983380  0.16852500  0.01365010\r\nv -0.00573998  0.20174301  0.00575352\r\nv -0.00638275  0.21896100  0.01760310\r\nv -0.00573998  0.20174301  0.00575352\r\nv -0.03126270  0.18646300  0.02644040\r\nv -0.03126270  0.18646300  0.02644040\r\nv -0.03126270  0.18646300  0.02644040\r\nv -0.00638275  0.21896100  0.01760310\r\nv -0.00657508  0.23615301  0.02911670\r\nv -0.00638275  0.21896100  0.01760310\r\nv -0.00657508  0.23615301  0.02911670\r\nv -0.00657508  0.23615301  0.02911670\r\nv -0.00657508  0.23615301  0.02911670\r\n\r\nvt  0.78206700  0.66213876\r\nvt  0.77500039  0.72643310\r\nvt  0.76184696  0.71895528\r\nvt  0.76226056  0.75459003\r\nvt  0.77819347  0.75947022\r\nvt  0.78746390  0.78493160\r\nvt  0.76965070  0.78457123\r\nvt  0.80226797  0.79457337\r\nvt  0.78512496  0.79985487\r\nvt  0.80413294  0.79002255\r\nvt  0.81652302  0.75251228\r\nvt  0.82212210  0.69443202\r\nvt  0.81726968  0.70083302\r\nvt  0.79733211  0.63528049\r\nvt  0.79106116  0.66556621\r\nvt  0.77665699  0.69220918\r\nvt  0.78854150  0.69532681\r\nvt  0.79524398  0.75771374\r\nvt  0.81725448  0.78064388\r\nvt  0.82470495  0.74299353\r\nvt  0.83185464  0.73267961\r\nvt  0.82646364  0.68745983\r\nvt  0.81631869  0.65178353\r\nvt  0.81280369  0.65502721\r\nvt  0.80125189  0.63743258\r\nvt  0.79688287  0.64413494\r\nvt  0.79051143  0.64175832\r\nvt  0.80134684  0.66373301\r\nvt  0.78973562  0.72782713\r\nvt  0.80531466  0.77892011\r\nvt  0.81820089  0.78450060\r\nvt  0.82884580  0.76885319\r\nvt  0.82012397  0.64745075\r\nvt  0.81072140  0.63514936\r\nvt  0.80562675  0.63748902\r\nvt  0.80433333  0.64264905\r\nvt  0.81259614  0.65571755\r\nvt  0.81554306  0.68146735\r\nvt  0.80171901  0.69200408\r\nvt  0.82128918  0.70848900\r\nvt  0.80546111  0.72199726\r\nvt  0.81258231  0.74861908\r\nvt  0.82247186  0.76650256\r\nvt  0.84926820  0.73886931\r\nvt  0.83280420  0.77006894\r\nvt  0.83931786  0.75504297\r\nvt  0.84513307  0.70980507\r\nvt  0.83843690  0.72184026\r\nvt  0.83067995  0.68018401\r\nvt  0.82474250  0.64136600\r\nvt  0.81683224  0.62963986\r\nvt  0.81286108  0.63640219\r\nvt  0.82433581  0.64103723\r\nvt  0.82928681  0.66368586\r\nvt  0.84483755  0.70899993\r\nvt  0.85312229  0.72379869\r\nvt  0.82931602  0.73217082\r\nvt  0.83845699  0.74797547\r\nvt  0.85891610  0.72836131\r\nvt  0.84626776  0.75142920\r\nvt  0.83541799  0.67192560\r\nvt  0.83078223  0.63183945\r\nvt  0.82422322  0.61963093\r\nvt  0.83618379  0.61954844\r\nvt  0.83641571  0.68769485\r\nvt  0.85902017  0.67992336\r\nvt  0.86661470  0.69434810\r\nvt  0.87105465  0.70040154\r\nvt  0.86976629  0.69460440\r\nvt  0.85929477  0.71920872\r\nvt  0.86158514  0.67453456\r\nvt  0.85269684  0.69479603\r\nvt  0.83858860  0.61655051\r\nvt  0.84146404  0.66076052\r\nvt  0.83296919  0.60347533\r\nvt  0.82234251  0.62446940\r\nvt  0.83258557  0.60598415\r\nvt  0.84334916  0.58031231\r\nvt  0.84793943  0.59126264\r\nvt  0.84249985  0.63910699\r\nvt  0.85509259  0.60819685\r\nvt  0.85047770  0.66042143\r\nvt  0.88076615  0.66386932\r\nvt  0.87177205  0.64720565\r\nvt  0.84931338  0.64408547\r\nvt  0.85888058  0.61975110\r\nvt  0.84800941  0.59353220\r\nvt  0.85438746  0.54731005\r\nvt  0.85952884  0.55638891\r\nvt  0.87591577  0.58892149\r\nvt  0.86355531  0.62733191\r\nvt  0.87211519  0.64549237\r\nvt  0.87925971  0.65975779\r\nvt  0.89468843  0.62823641\r\nvt  0.88292670  0.66706067\r\nvt  0.89219266  0.62661618\r\nvt  0.88291025  0.61212647\r\nvt  0.85348201  0.54808855\r\nvt  0.84285247  0.57981038\r\nvt  0.87091219  0.51570427\r\nvt  0.86717135  0.57138819\r\nvt  0.88781768  0.54596359\r\nvt  0.88448143  0.60610229\r\nvt  0.90323758  0.57638800\r\nvt  0.89138478  0.62020242\r\nvt  0.90388936  0.58362740\r\nvt  0.89459008  0.57009268\r\nvt  0.86968160  0.52240705\r\nvt  0.86968428  0.58685714\r\nvt  0.85856050  0.56192774\r\nvt  0.87638175  0.46334204\r\nvt  0.87887067  0.52947330\r\nvt  0.89944762  0.49994618\r\nvt  0.89642370  0.56248546\r\nvt  0.90642458  0.58465499\r\nvt  0.91569924  0.53709835\r\nvt  0.90645903  0.52354991\r\nvt  0.88115609  0.54613256\r\nvt  0.87533963  0.46458882\r\nvt  0.86443228  0.50899142\r\nvt  0.86546487  0.50770968\r\nvt  0.88205522  0.47085911\r\nvt  0.89029163  0.48398909\r\nvt  0.91094935  0.45301846\r\nvt  0.90814728  0.51616198\r\nvt  0.91496754  0.52996391\r\nvt  0.92665839  0.48341483\r\nvt  0.92986631  0.49176866\r\nvt  0.91815901  0.53820634\r\nvt  0.89281589  0.50006324\r\nvt  0.89182347  0.43025306\r\nvt  0.88089520  0.47729117\r\nvt  0.88698655  0.41694853\r\nvt  0.89719135  0.37142593\r\nvt  0.91267920  0.39121974\r\nvt  0.89293998  0.42425460\r\nvt  0.90152085  0.43713874\r\nvt  0.93149930  0.42450699\r\nvt  0.91979545  0.46937159\r\nvt  0.93836248  0.43941662\r\nvt  0.92745852  0.49040681\r\nvt  0.92954570  0.43256444\r\nvt  0.91821557  0.47631255\r\nvt  0.90427554  0.45259303\r\nvt  0.90215164  0.38531196\r\nvt  0.88591969  0.41807789\r\nvt  0.91415513  0.33516034\r\nvt  0.90359920  0.37839660\r\nvt  0.92247880  0.40744543\r\nvt  0.95013505  0.40007785\r\nvt  0.95289135  0.41073072\r\nvt  0.94147903  0.44845983\r\nvt  0.93896443  0.44722745\r\nvt  0.92512703  0.36992723\r\nvt  0.91517907  0.40806246\r\nvt  0.89595801  0.37290576\r\nvt  0.90698165  0.32897913\r\nvt  0.92484754  0.29548880\r\nvt  0.92397898  0.34796011\r\nvt  0.94666052  0.32657987\r\nvt  0.93426770  0.36496502\r\nvt  0.94343418  0.38343796\r\nvt  0.96005321  0.38148257\r\nvt  0.94994360  0.41044104\r\nvt  0.94927895  0.36704737\r\nvt  0.94005829  0.39560249\r\nvt  0.91978979  0.31297168\r\nvt  0.91157609  0.34566060\r\nvt  0.90529084  0.33175999\r\nvt  0.91379619  0.29602578\r\nvt  0.91642481  0.29070795\r\nvt  0.93607080  0.25959021\r\nvt  0.93576503  0.30829003\r\nvt  0.96010512  0.29288411\r\nvt  0.96899998  0.31665584\r\nvt  0.97414243  0.33953911\r\nvt  0.95584357  0.34727111\r\nvt  0.96204668  0.36660534\r\nvt  0.96396464  0.37988484\r\nvt  0.97451729  0.35622448\r\nvt  0.94038546  0.31803688\r\nvt  0.93366301  0.33994660\r\nvt  0.93512517  0.22641517\r\nvt  0.92570025  0.25669158\r\nvt  0.94836396  0.22749051\r\nvt  0.94853932  0.27262157\r\nvt  0.96287936  0.24147052\r\nvt  0.97500002  0.26464641\r\nvt  0.21463786  0.26464641\r\nvt  0.22267802  0.29227915\r\nvt  0.19974299  0.29288411\r\nvt  0.20863785  0.31665584\r\nvt  0.22597814  0.31916684\r\nvt  0.21378030  0.33953911\r\nvt  0.21415515  0.35622448\r\nvt  0.20856401  0.36037335\r\nvt  0.21596567  0.34599951\r\nvt  0.96892613  0.36037335\r\nvt  0.95674920  0.34676015\r\nvt  0.96229631  0.33303285\r\nvt  0.92655790  0.28726268\r\nvt  0.92143416  0.26575026\r\nvt  0.96238416  0.19942102\r\nvt  0.18800178  0.22749051\r\nvt  0.20251724  0.24147052\r\nvt  0.23106080  0.24299237\r\nvt  0.23796459  0.30566341\r\nvt  0.23286176  0.32868299\r\nvt  0.22397879  0.33938882\r\nvt  0.20582975  0.32334569\r\nvt  0.20193417  0.33303285\r\nvt  0.94855076  0.29008195\r\nvt  0.94522029  0.30236655\r\nvt  0.93612194  0.24980791\r\nvt  0.93189025  0.26702878\r\nvt  0.93478203  0.21686438\r\nvt  0.92831933  0.23991057\r\nvt  0.94520515  0.19917201\r\nvt  0.21851371  0.17587590\r\nvt  0.18484299  0.19917201\r\nvt  0.20202211  0.19942102\r\nvt  0.21889600  0.21576408\r\nvt  0.23746419  0.19659987\r\nvt  0.25211528  0.26521185\r\nvt  0.23737809  0.27496582\r\nvt  0.24925448  0.29887477\r\nvt  0.22191560  0.33669090\r\nvt  0.20857298  0.31557432\r\nvt  0.96619189  0.32334569\r\nvt  0.95093864  0.27869967\r\nvt  0.95669931  0.17438278\r\nvt  0.19633719  0.17438278\r\nvt  0.23816024  0.15757082\r\nvt  0.26632398  0.22277169\r\nvt  0.24857853  0.22892575\r\nvt  0.25941485  0.29816508\r\nvt  0.24063468  0.32327625\r\nvt  0.23033154  0.32780483\r\nvt  0.22662039  0.33094475\r\nvt  0.21058266  0.30865613\r\nvt  0.96893513  0.31557432\r\nvt  0.94309682  0.21618900\r\nvt  0.93972611  0.23330601\r\nvt  0.94859344  0.17335798\r\nvt  0.94132918  0.19502155\r\nvt  0.97068167  0.15184040\r\nvt  0.22819130  0.13189836\r\nvt  0.21031953  0.15184040\r\nvt  0.26120570  0.14540982\r\nvt  0.28335443  0.22403987\r\nvt  0.25784713  0.18481670\r\nvt  0.26612303  0.26277405\r\nvt  0.24723545  0.32232010\r\nvt  0.23329294  0.32685685\r\nvt  0.21211955  0.30242154\r\nvt  0.97094476  0.30865613\r\nvt  0.97248167  0.30242154\r\nvt  0.95434171  0.25466719\r\nvt  0.95279777  0.26696074\r\nvt  0.94651586  0.19804341\r\nvt  0.18823133  0.17335798\r\nvt  0.30000839  0.18393925\r\nvt  0.27910760  0.18071201\r\nvt  0.29016563  0.27600393\r\nvt  0.27885425  0.26675424\r\nvt  0.26827282  0.30258915\r\nvt  0.25276068  0.32506710\r\nvt  0.25749281  0.33103949\r\nvt  0.23580004  0.32812092\r\nvt  0.21340141  0.29723924\r\nvt  0.95570379  0.24217640\r\nvt  0.95022213  0.17895113\r\nvt  0.96874797  0.12951566\r\nvt  0.95736897  0.15148781\r\nvt  0.20838585  0.12951566\r\nvt  0.19700682  0.15148781\r\nvt  0.28113723  0.10470051\r\nvt  0.31357995  0.14269367\r\nvt  0.25146076  0.11560723\r\nvt  0.28691268  0.14028518\r\nvt  0.29902363  0.23169209\r\nvt  0.31316549  0.24462113\r\nvt  0.30026740  0.28957704\r\nvt  0.28287879  0.32352057\r\nvt  0.27597532  0.31122991\r\nvt  0.97376353  0.29723924\r\nvt  0.95696723  0.22999941\r\nvt  0.18986000  0.17895113\r\nvt  0.31634471  0.10137784\r\nvt  0.33928818  0.15251966\r\nvt  0.33742419  0.20909609\r\nvt  0.31957746  0.19370106\r\nvt  0.30957860  0.30694059\r\nvt  0.28943846  0.33937690\r\nvt  0.26612833  0.35290697\r\nvt  0.24071194  0.33947498\r\nvt  0.26180971  0.34017676\r\nvt  0.23816578  0.33203405\r\nvt  0.21462150  0.29378846\r\nvt  0.19780488  0.21867615\r\nvt  0.97498363  0.29378846\r\nvt  0.95948923  0.13824277\r\nvt  0.95445353  0.15903392\r\nvt  0.19409139  0.15903392\r\nvt  0.19912708  0.13824277\r\nvt  0.22411294  0.10782985\r\nvt  0.35357529  0.10764131\r\nvt  0.35365394  0.22956206\r\nvt  0.33793104  0.28343883\r\nvt  0.32600710  0.26198438\r\nvt  0.27078038  0.37010029\r\nvt  0.24368182  0.35174125\r\nvt  0.21596396  0.29305333\r\nvt  0.19889371  0.20857319\r\nvt  0.95925587  0.20857319\r\nvt  0.95816696  0.21867615\r\nvt  0.96584064  0.11600052\r\nvt  0.20547855  0.11600052\r\nvt  0.28357744  0.06996157\r\nvt  0.24726883  0.08727988\r\nvt  0.38826889  0.12454950\r\nvt  0.38390747  0.19299090\r\nvt  0.36284691  0.16938525\r\nvt  0.36858624  0.25490537\r\nvt  0.34932339  0.30901203\r\nvt  0.32745084  0.35329798\r\nvt  0.31851766  0.32807288\r\nvt  0.29604527  0.35918245\r\nvt  0.21948861  0.30532372\r\nvt  0.21754989  0.29628390\r\nvt  0.96011227  0.19997999\r\nvt  0.97480130  0.09108821\r\nvt  0.41783607  0.15244137\r\nvt  0.40265074  0.22339757\r\nvt  0.36046049  0.33899021\r\nvt  0.31059629  0.41366798\r\nvt  0.28212649  0.42317259\r\nvt  0.30302900  0.38365898\r\nvt  0.27604967  0.39301965\r\nvt  0.24729678  0.37068528\r\nvt  0.22186662  0.32311088\r\nvt  0.19975010  0.19997999\r\nvt  0.21443918  0.09108821\r\nvt  0.33933514  0.06155070\r\nvt  0.41939640  0.26067412\r\nvt  0.38254005  0.28527567\r\nvt  0.33661196  0.38311166\r\nvt  0.25172698  0.39884719\r\nvt  0.22483863  0.35529441\r\nvt  0.19950487  0.18776964\r\nvt  0.20012532  0.19298895\r\nvt  0.23080985  0.06120527\r\nvt  0.28723976  0.02500000\r\nvt  0.45684412  0.10562691\r\nvt  0.44201395  0.19138592\r\nvt  0.40526623  0.07172246\r\nvt  0.40837091  0.36117050\r\nvt  0.39575481  0.32076159\r\nvt  0.37153241  0.37356147\r\nvt  0.34617403  0.41790581\r\nvt  0.32810959  0.49281436\r\nvt  0.31892523  0.44998282\r\nvt  0.28921261  0.46219549\r\nvt  0.25720024  0.43978721\r\nvt  0.19640967  0.18453139\r\nvt  0.46169186  0.24131800\r\nvt  0.44806740  0.35405949\r\nvt  0.43445763  0.30463183\r\nvt  0.42045432  0.40554318\r\nvt  0.39375407  0.45525917\r\nvt  0.38262126  0.41259143\r\nvt  0.35620621  0.45764038\r\nvt  0.30713293  0.56951880\r\nvt  0.29747170  0.51113629\r\nvt  0.27252218  0.57475829\r\nvt  0.26398182  0.49758279\r\nvt  0.23381566  0.51903707\r\nvt  0.22864324  0.41325426\r\nvt  0.95677179  0.18453139\r\nvt  0.55291134  0.14222538\r\nvt  0.50010365  0.03701133\r\nvt  0.48987117  0.16245808\r\nvt  0.49133959  0.36586297\r\nvt  0.46040240  0.40652263\r\nvt  0.43202806  0.45210382\r\nvt  0.40491810  0.50000447\r\nvt  0.37780720  0.54790092\r\nvt  0.36674893  0.50153118\r\nvt  0.33824849  0.54136664\r\nvt  0.31848839  0.63410825\r\nvt  0.28356922  0.66675001\r\nvt  0.02500000  0.49894860\r\nvt  0.18380478  0.18555504\r\nvt  0.94416690  0.18555504\r\nvt  0.56812972  0.31206891\r\nvt  0.51131874  0.24055277\r\nvt  0.47786334  0.30077997\r\nvt  0.47158083  0.45861778\r\nvt  0.44308400  0.49846843\r\nvt  0.41608146  0.54474938\r\nvt  0.38938180  0.59446794\r\nvt  0.36176702  0.64594483\r\nvt  0.33196679  0.69920802\r\nvt  0.34942999  0.59347004\r\nvt  0.25689912  0.85765111\r\nvt  0.24169213  0.68774384\r\nvt  0.78536212  0.49894860\r\nvt  0.62605429  0.81440932\r\nvt  0.57600844  0.48079690\r\nvt  0.53730011  0.42515641\r\nvt  0.52625400  0.33317465\r\nvt  0.50269228  0.43043619\r\nvt  0.48171580  0.50716251\r\nvt  0.42721239  0.58742064\r\nvt  0.40146479  0.63884783\r\nvt  0.29850405  0.75940084\r\nvt  0.30965415  0.96294981\r\nvt  0.58117968  0.58662564\r\nvt  0.45362347  0.54235595\r\nvt  0.39044139  0.73935676\r\nvt  0.37537795  0.69538653\r\nvt  0.34814033  0.75868851\r\nvt  0.31995165  0.83752674\r\nvt  0.61342639  0.81542909\r\nvt  0.61032629  0.81217980\r\nvt  0.58498126  0.64460081\r\nvt  0.54583764  0.50232607\r\nvt  0.51234955  0.48880982\r\nvt  0.52060390  0.53774559\r\nvt  0.49089578  0.54999065\r\nvt  0.49921945  0.58630902\r\nvt  0.47321159  0.61689490\r\nvt  0.46365294  0.58209449\r\nvt  0.44937071  0.66103888\r\nvt  0.43829966  0.62645686\r\nvt  0.41408125  0.67926669\r\nvt  0.40719160  0.77664876\r\nvt  0.36782208  0.80863780\r\nvt  0.39200947  0.84759873\r\nvt  0.35298401  0.89438140\r\nvt  0.52261293  0.97500002\r\nvt  0.58794832  0.67678684\r\nvt  0.55261523  0.56012219\r\nvt  0.50678062  0.61632496\r\nvt  0.52768385  0.57676589\r\nvt  0.48236933  0.64672244\r\nvt  0.46050766  0.69103205\r\nvt  0.44125551  0.74515563\r\nvt  0.42729765  0.71476758\r\nvt  0.42594454  0.80707240\r\nvt  0.40459245  0.92830098\r\nvt  0.47058260  0.93846428\r\nvt  0.61007386  0.79993898\r\nvt  0.57905841  0.93876755\r\nvt  0.60970253  0.80694485\r\nvt  0.59031922  0.69456667\r\nvt  0.55808246  0.60105938\r\nvt  0.53375226  0.60692024\r\nvt  0.47189891  0.71661985\r\nvt  0.45619255  0.77051270\r\nvt  0.44701955  0.83068943\r\nvt  0.52637398  0.93002367\r\nvt  0.42159814  0.87550348\r\nvt  0.60438222  0.88392544\r\nvt  0.59542501  0.90886331\r\nvt  0.61092520  0.79132795\r\nvt  0.59224975  0.70360172\r\nvt  0.56610918  0.64815903\r\nvt  0.56250381  0.62921405\r\nvt  0.53901190  0.62984157\r\nvt  0.52036440  0.66062564\r\nvt  0.51375598  0.64080846\r\nvt  0.48383063  0.73808050\r\nvt  0.49129686  0.67195851\r\nvt  0.47243401  0.79097813\r\nvt  0.49357855  0.89865273\r\nvt  0.45632809  0.89241290\r\nvt  0.61200964  0.78123182\r\nvt  0.50024045  0.69310027\r\nvt  0.49632671  0.85735905\r\nvt  0.47059575  0.84754556\r\nvt  0.56265110  0.91268390\r\nvt  0.58578807  0.89211619\r\nvt  0.61574984  0.84088963\r\nvt  0.61072212  0.86168522\r\nvt  0.61320275  0.76990986\r\nvt  0.59383136  0.70684046\r\nvt  0.56907541  0.66043824\r\nvt  0.54366207  0.64704967\r\nvt  0.54797596  0.65979224\r\nvt  0.53382885  0.68879741\r\nvt  0.52692318  0.67649323\r\nvt  0.50955534  0.71047425\r\nvt  0.51083922  0.76837730\r\nvt  0.49668080  0.75544864\r\nvt  0.49029562  0.80636990\r\nvt  0.52880061  0.89530379\r\nvt  0.61997175  0.82097673\r\nvt  0.61445659  0.75773972\r\nvt  0.59637552  0.70267540\r\nvt  0.59516591  0.70611382\r\nvt  0.57161403  0.66789103\r\nvt  0.55228925  0.66894430\r\nvt  0.55702096  0.67493063\r\nvt  0.53099138  0.73329931\r\nvt  0.51966655  0.72405297\r\nvt  0.50988764  0.81612229\r\nvt  0.54873312  0.85458422\r\nvt  0.52301663  0.85974395\r\nvt  0.55847496  0.88436800\r\nvt  0.61285895  0.84845024\r\nvt  0.60149729  0.87042129\r\nvt  0.59764701  0.69751608\r\nvt  0.57397127  0.67181677\r\nvt  0.55041069  0.70186198\r\nvt  0.54153824  0.69744498\r\nvt  0.54374129  0.73725599\r\nvt  0.52652788  0.77601397\r\nvt  0.54357624  0.77724403\r\nvt  0.55207908  0.81517124\r\nvt  0.53080946  0.81932145\r\nvt  0.57176715  0.84238398\r\nvt  0.59957290  0.84810060\r\nvt  0.58172858  0.86805123\r\nvt  0.62707496  0.78379762\r\nvt  0.62366736  0.80190039\r\nvt  0.61580831  0.74527258\r\nvt  0.61734325  0.73302889\r\nvt  0.59917784  0.69132322\r\nvt  0.57647157  0.67310256\r\nvt  0.56916177  0.67674154\r\nvt  0.56255436  0.67769033\r\nvt  0.55776250  0.73478562\r\nvt  0.56133157  0.77104640\r\nvt  0.61353713  0.82555467\r\nvt  0.62886637  0.80496150\r\nvt  0.62161505  0.82660282\r\nvt  0.57943326  0.67218357\r\nvt  0.58314377  0.66907376\r\nvt  0.56058288  0.70113921\r\nvt  0.57250583  0.72499168\r\nvt  0.57246137  0.80334318\r\nvt  0.59139913  0.82404745\r\nvt  0.63403124  0.75027341\r\nvt  0.63043517  0.76672465\r\nvt  0.61919188  0.72134298\r\nvt  0.62157369  0.71002036\r\nvt  0.60117990  0.68445301\r\nvt  0.60392219  0.67673302\r\nvt  0.58387518  0.68079835\r\nvt  0.57188320  0.69432622\r\nvt  0.58720559  0.70764297\r\nvt  0.59526199  0.73524278\r\nvt  0.57884693  0.75693411\r\nvt  0.59101611  0.78413987\r\nvt  0.60738069  0.75840569\r\nvt  0.62187588  0.77240431\r\nvt  0.63508421  0.77353728\r\nvt  0.60787052  0.80048424\r\nvt  0.62501448  0.80077142\r\nvt  0.64185941  0.76013082\r\nvt  0.63540316  0.78315043\r\nvt  0.63825738  0.73309511\r\nvt  0.62490022  0.69778734\r\nvt  0.60781890  0.66709018\r\nvt  0.58785444  0.66335511\r\nvt  0.59381074  0.65406942\r\nvt  0.58583593  0.66062629\r\nvt  0.57694501  0.67133486\r\nvt  0.59607214  0.66041160\r\nvt  0.62170786  0.72724152\r\nvt  0.64450490  0.74326473\r\nvt  0.64874321  0.73430085\r\nvt  0.62973762  0.68214542\r\nvt  0.61337167  0.65339065\r\nvt  0.60121894  0.63971138\r\nvt  0.59566349  0.64378941\r\nvt  0.60816526  0.63333815\r\nvt  0.61438692  0.65262246\r\nvt  0.60123926  0.68324560\r\nvt  0.62357777  0.67328590\r\nvt  0.61014557  0.70698583\r\nvt  0.63415927  0.74029982\r\nvt  0.64537382  0.70440829\r\nvt  0.65036309  0.68717146\r\nvt  0.63646990  0.66023827\r\nvt  0.64358991  0.71288007\r\nvt  0.61010164  0.61860359\r\nvt  0.62678844  0.61645794\r\nvt  0.63446969  0.69157553\r\nvt  0.64624518  0.65191931\r\nvt  0.65377653  0.70925498\r\nvt  0.65638185  0.70402771\r\nvt  0.65858287  0.65446883\r\nvt  0.64501834  0.63023925\r\nvt  0.62085414  0.63310885\r\nvt  0.60622025  0.62012506\r\nvt  0.63184589  0.56051844\r\nvt  0.62007451  0.59986097\r\nvt  0.63871908  0.57539111\r\nvt  0.63595986  0.63491052\r\nvt  0.64774239  0.59243792\r\nvt  0.66660941  0.62152946\r\nvt  0.65605849  0.66475266\r\nvt  0.66321635  0.67099422\r\nvt  0.66488856  0.66829336\r\nvt  0.66801125  0.61480886\r\nvt  0.64061171  0.56755680\r\nvt  0.63008940  0.60453677\r\nvt  0.63120896  0.55283165\r\nvt  0.62871361  0.55153078\r\nvt  0.62022239  0.58963180\r\nvt  0.61729801  0.58926946\r\nvt  0.64354783  0.51652455\r\nvt  0.65926915  0.54686981\r\nvt  0.66869509  0.56275839\r\nvt  0.65753829  0.60867310\r\nvt  0.67726791  0.57567310\r\nvt  0.68320930  0.58303219\r\nvt  0.67300409  0.62855703\r\nvt  0.67422140  0.62714881\r\nvt  0.67834252  0.56985664\r\nvt  0.66588199  0.54754740\r\nvt  0.65497422  0.59208715\r\nvt  0.65194523  0.52380514\r\nvt  0.64032573  0.50822520\r\nvt  0.65523845  0.46997407\r\nvt  0.67076957  0.49994701\r\nvt  0.65041995  0.53053075\r\nvt  0.67992336  0.51591247\r\nvt  0.69381356  0.53664041\r\nvt  0.68426132  0.58196884\r\nvt  0.64271659  0.50965244\r\nvt  0.65203369  0.46178409\r\nvt  0.66206706  0.48374274\r\nvt  0.67379290  0.43741366\r\nvt  0.69929355  0.48423848\r\nvt  0.68815190  0.52907407\r\nvt  0.69484103  0.53545570\r\nvt  0.68927139  0.52281123\r\nvt  0.68900037  0.45399547\r\nvt  0.67557389  0.43000856\r\nvt  0.67734307  0.50006694\r\nvt  0.66370422  0.47656006\r\nvt  0.66628999  0.41641429\r\nvt  0.65447760  0.46295580\r\nvt  0.67882746  0.37971944\r\nvt  0.66377133  0.41532359\r\nvt  0.66697139  0.42354089\r\nvt  0.68573999  0.39379069\r\nvt  0.68240118  0.45392948\r\nvt  0.70304698  0.42851830\r\nvt  0.69134420  0.47043443\r\nvt  0.71067864  0.44355479\r\nvt  0.71580404  0.45268679\r\nvt  0.71669084  0.45196882\r\nvt  0.70472759  0.49228466\r\nvt  0.70574480  0.49106249\r\nvt  0.70048130  0.47770089\r\nvt  0.67550927  0.37173784\r\nvt  0.68726969  0.33291921\r\nvt  0.69095427  0.34016940\r\nvt  0.70667255  0.37255993\r\nvt  0.69430751  0.41096643\r\nvt  0.71513045  0.39171103\r\nvt  0.71159571  0.43818396\r\nvt  0.70046562  0.41327623\r\nvt  0.71126306  0.38037595\r\nvt  0.69838107  0.35290101\r\nvt  0.68724877  0.38797891\r\nvt  0.68940759  0.33617815\r\nvt  0.67798519  0.37342578\r\nvt  0.70361167  0.30556104\r\nvt  0.71121961  0.31995910\r\nvt  0.69810987  0.35440508\r\nvt  0.71976382  0.33946231\r\nvt  0.73402911  0.38040116\r\nvt  0.72227126  0.40867969\r\nvt  0.72684360  0.41968024\r\nvt  0.73760110  0.39401928\r\nvt  0.72731829  0.42023897\r\nvt  0.72214216  0.40657008\r\nvt  0.72081184  0.35605320\r\nvt  0.70855618  0.32557556\r\nvt  0.70040566  0.30543703\r\nvt  0.69914830  0.29956284\r\nvt  0.72541672  0.29088640\r\nvt  0.72773212  0.36080071\r\nvt  0.74587911  0.35892320\r\nvt  0.74592268  0.38042912\r\nvt  0.73718828  0.39658901\r\nvt  0.73933542  0.36826450\r\nvt  0.73154378  0.38356623\r\nvt  0.72864681  0.33936533\r\nvt  0.71743530  0.30530447\r\nvt  0.71711648  0.27610710\r\nvt  0.74897629  0.29142925\r\nvt  0.73383880  0.31219870\r\nvt  0.74095339  0.33623439\r\nvt  0.75761962  0.34425735\r\nvt  0.75731659  0.36360705\r\nvt  0.75330627  0.37040263\r\nvt  0.74783903  0.37553883\r\nvt  0.74536639  0.35870740\r\nvt  0.72499371  0.29027006\r\nvt  0.72090203  0.26114899\r\nvt  0.71087575  0.28082320\r\nvt  0.71129292  0.27159578\r\nvt  0.72394747  0.24852660\r\nvt  0.73179388  0.25193986\r\nvt  0.74095213  0.26773486\r\nvt  0.75769484  0.25132152\r\nvt  0.76480782  0.27796108\r\nvt  0.76852578  0.30797446\r\nvt  0.75470346  0.31847629\r\nvt  0.75941187  0.36486775\r\nvt  0.73468494  0.32816729\r\nvt  0.73742199  0.22988471\r\nvt  0.76494795  0.22104557\r\nvt  0.74779123  0.23343277\r\nvt  0.77502596  0.24226846\r\nvt  0.78052199  0.27217156\r\nvt  0.78169179  0.30468261\r\nvt  0.76886350  0.33626372\r\nvt  0.76583767  0.35735923\r\nvt  0.76451260  0.36249846\r\nvt  0.74365985  0.31252408\r\nvt  0.74998367  0.35257632\r\nvt  0.73942578  0.31985408\r\nvt  0.73829299  0.26730764\r\nvt  0.73169488  0.27819008\r\nvt  0.74134201  0.23112035\r\nvt  0.73085922  0.24495028\r\nvt  0.75203115  0.21546035\r\nvt  0.78280348  0.21506320\r\nvt  0.79524684  0.27360243\r\nvt  0.79356414  0.30782649\r\nvt  0.78812450  0.33788347\r\nvt  0.77914101  0.33444342\r\nvt  0.77965081  0.35823736\r\nvt  0.77328604  0.35586610\r\nvt  0.75380266  0.34819609\r\nvt  0.79207182  0.24055037\r\nvt  0.80838370  0.28109819\r\nvt  0.79576910  0.34545904\r\nvt  0.78508049  0.36370313\r\nvt  0.76888680  0.36253050\r\nvt  0.75732392  0.34491253\r\nvt  0.76089603  0.34283581\r\nvt  0.74801284  0.30550423\r\nvt  0.75365555  0.24741507\r\nvt  0.74545729  0.25695515\r\nvt  0.76608402  0.20992942\r\nvt  0.75294936  0.21931218\r\nvt  0.76797748  0.20539610\r\nvt  0.81760061  0.22177023\r\nvt  0.80060840  0.21545029\r\nvt  0.82229227  0.25586104\r\nvt  0.80798906  0.24545619\r\nvt  0.80384368  0.31613120\r\nvt  0.81260777  0.32830164\r\nvt  0.77281320  0.36466256\r\nvt  0.77653027  0.36893055\r\nvt  0.76471984  0.34246850\r\nvt  0.75846517  0.29396892\r\nvt  0.76314443  0.23946214\r\nvt  0.75288182  0.29907641\r\nvt  0.78084844  0.20377764\r\nvt  0.80296576  0.20009980\r\nvt  0.78512448  0.20013216\r\nvt  0.81978446  0.29328147\r\nvt  0.82017076  0.34328243\r\nvt  0.80798811  0.36939731\r\nvt  0.80227429  0.35618842\r\nvt  0.79419655  0.38219985\r\nvt  0.78982234  0.37175325\r\nvt  0.76486921  0.29115304\r\nvt  0.77399558  0.23409772\r\nvt  0.79696143  0.20175669\r\nvt  0.82071090  0.20545562\r\nvt  0.83320826  0.23322965\r\nvt  0.83487362  0.27051461\r\nvt  0.82963359  0.30887386\r\nvt  0.82691306  0.36043158\r\nvt  0.78028613  0.37567002\r\nvt  0.78425932  0.38539577\r\nvt  0.76895553  0.34458193\r\nvt  0.81389850  0.20458110\r\nvt  0.83767182  0.21601523\r\nvt  0.84724826  0.24895342\r\nvt  0.84593743  0.28838563\r\nvt  0.85581541  0.30874527\r\nvt  0.83828622  0.32697201\r\nvt  0.83318514  0.37943986\r\nvt  0.80287844  0.41084015\r\nvt  0.81325597  0.38478172\r\nvt  0.79847711  0.39513570\r\nvt  0.77894157  0.35979635\r\nvt  0.77368474  0.35004017\r\nvt  0.77211040  0.29162198\r\nvt  0.78613287  0.23229110\r\nvt  0.83104140  0.21275628\r\nvt  0.85982758  0.26818082\r\nvt  0.86484313  0.33117864\r\nvt  0.84611857  0.34702930\r\nvt  0.83924955  0.40022421\r\nvt  0.81837040  0.40230900\r\nvt  0.80753320  0.42963165\r\nvt  0.79329097  0.41630107\r\nvt  0.78857327  0.39873379\r\nvt  0.78894484  0.30673164\r\nvt  0.78015167  0.29643387\r\nvt  0.79936540  0.23499103\r\nvt  0.86793721  0.25127587\r\nvt  0.85344172  0.23140027\r\nvt  0.87329841  0.35549921\r\nvt  0.87120599  0.29040432\r\nvt  0.86048973  0.39216980\r\nvt  0.85344422  0.36878899\r\nvt  0.84527844  0.42279971\r\nvt  0.82353258  0.42207882\r\nvt  0.79843563  0.43860388\r\nvt  0.79103869  0.39613870\r\nvt  0.79847872  0.32388231\r\nvt  0.78472733  0.37483129\r\nvt  0.81347978  0.24318844\r\nvt  0.86419189  0.24680659\r\nvt  0.88128561  0.27547285\r\nvt  0.84789735  0.22667582\r\nvt  0.89365608  0.30383438\r\nvt  0.89145797  0.34279531\r\nvt  0.88167197  0.31535742\r\nvt  0.88138294  0.38153547\r\nvt  0.83444560  0.46875146\r\nvt  0.82885951  0.44420242\r\nvt  0.81786644  0.47737148\r\nvt  0.81250775  0.45175064\r\nvt  0.84373266  0.28136742\r\nvt  0.82831591  0.25809202\r\nvt  0.87977946  0.27367505\r\nvt  0.90076286  0.37258399\r\nvt  0.88923770  0.40920147\r\nvt  0.87432164  0.44350678\r\nvt  0.85766029  0.47327533\r\nvt  0.86741847  0.41709238\r\nvt  0.85139740  0.44716987\r\nvt  0.81014830  0.49874324\r\nvt  0.80404991  0.46607655\r\nvt  0.79791236  0.42482233\r\nvt  0.80879384  0.34975547\r\nvt  0.82003778  0.38652512\r\nvt  0.89471555  0.30788061\r\nvt  0.90972292  0.40439290\r\nvt  0.89695996  0.43826786\r\nvt  0.88126594  0.47123617\r\nvt  0.84031320  0.49563432\r\nvt  0.82979250  0.53844047\r\nvt  0.82361650  0.50637424\r\nvt  0.81678981  0.53627813\r\nvt  0.81366366  0.50692952\r\nvt  0.80541050  0.46165824\r\nvt  0.83244157  0.43640745\r\nvt  0.85973203  0.31510687\r\nvt  0.91630387  0.37246367\r\nvt  0.90527356  0.33629191\r\nvt  0.91841400  0.43760249\r\nvt  0.86411095  0.50094289\r\nvt  0.87079716  0.52992076\r\nvt  0.85304660  0.55540013\r\nvt  0.84649587  0.52461934\r\nvt  0.83646446  0.57309759\r\nvt  0.82288957  0.55977362\r\nvt  0.84632409  0.49994987\r\nvt  0.87631333  0.36147159\r\nvt  0.90906405  0.34958693\r\nvt  0.92684358  0.41139644\r\nvt  0.90460587  0.46833974\r\nvt  0.91221923  0.49896157\r\nvt  0.89544857  0.52943122\r\nvt  0.88829857  0.50000107\r\nvt  0.85999417  0.58742845\r\nvt  0.83217508  0.62219578\r\nvt  0.82408804  0.57792175\r\nvt  0.86210352  0.57315868\r\nvt  0.91105336  0.48980990\r\nvt  0.89343345  0.42094731\r\nvt  0.92285806  0.39774400\r\nvt  0.93699497  0.45177442\r\nvt  0.93522954  0.50513667\r\nvt  0.92690670  0.47150013\r\nvt  0.91982955  0.52955729\r\nvt  0.88499278  0.59018165\r\nvt  0.87774116  0.55980694\r\nvt  0.86741346  0.62015986\r\nvt  0.84369010  0.60949427\r\nvt  0.84127718  0.66733855\r\nvt  0.83339000  0.61745346\r\nvt  0.84561002  0.67578763\r\nvt  0.88019794  0.64656007\r\nvt  0.92897725  0.55903161\r\nvt  0.93617398  0.44982290\r\nvt  0.94679171  0.49176618\r\nvt  0.90275127  0.55909747\r\nvt  0.91024470  0.58854413\r\nvt  0.89261520  0.62059134\r\nvt  0.87541026  0.65301293\r\nvt  0.85159290  0.64673930\r\nvt  0.94900239  0.50171918\r\nvt  0.96130174  0.54919058\r\nvt  0.95623875  0.52951157\r\nvt  0.94339383  0.53754121\r\nvt  0.95141619  0.56790411\r\nvt  0.92745757  0.55952728\r\nvt  0.88414478  0.68540764\r\nvt  0.87023139  0.72007257\r\nvt  0.86035061  0.68389875\r\nvt  0.85172880  0.71152329\r\nvt  0.86017734  0.73033673\r\nvt  0.90090734  0.70976835\r\nvt  0.92410809  0.75705159\r\nvt  0.94689471  0.61886531\r\nvt  0.96437854  0.66431439\r\nvt  0.97300190  0.58935863\r\nvt  0.96532929  0.56355453\r\nvt  0.95928103  0.59560233\r\nvt  0.93514192  0.58834100\r\nvt  0.91799557  0.61734128\r\nvt  0.90071243  0.65059382\r\nvt  0.88166231  0.75460404\r\nvt  0.86401784  0.75309926\r\nvt  0.87789989  0.77762824\r\nvt  0.94901210  0.78780830\r\nvt  0.16374592  0.75705159\r\nvt  0.18865001  0.78780830\r\nvt  0.22057731  0.69525480\r\nvt  0.20401645  0.66431439\r\nvt  0.22360624  0.62100720\r\nvt  0.21263975  0.58935863\r\nvt  0.21363990  0.59292686\r\nvt  0.20669611  0.62038821\r\nvt  0.97400200  0.59292686\r\nvt  0.96705824  0.62038821\r\nvt  0.95090491  0.64102161\r\nvt  0.94291645  0.61559361\r\nvt  0.93472052  0.67176831\r\nvt  0.92609280  0.64518493\r\nvt  0.90944308  0.67988604\r\nvt  0.91907007  0.70807064\r\nvt  0.89387435  0.71694016\r\nvt  0.89735216  0.82362330\r\nvt  0.92618787  0.84301138\r\nvt  0.87889719  0.79086888\r\nvt  0.89973307  0.81561047\r\nvt  0.97400087  0.80429506\r\nvt  0.23577099  0.71425486\r\nvt  0.22190578  0.61746335\r\nvt  0.90498710  0.74706429\r\nvt  0.91806656  0.77522272\r\nvt  0.89525515  0.78669244\r\nvt  0.92051566  0.85009813\r\nvt  0.95647120  0.85915393\r\nvt  0.19610906  0.85915393\r\nvt  0.16582575  0.84301138\r\nvt  0.21363877  0.80429506\r\nvt  0.23687269  0.80959606\r\nvt  0.24927334  0.72414368\r\nvt  0.23375888  0.64460230\r\nvt  0.22979252  0.63741273\r\nvt  0.22249445  0.66120452\r\nvt  0.21449406  0.64222389\r\nvt  0.20802356  0.68580025\r\nvt  0.97485620  0.64222389\r\nvt  0.96838570  0.68580025\r\nvt  0.95929754  0.66446918\r\nvt  0.94416094  0.69683689\r\nvt  0.92999637  0.73477131\r\nvt  0.93267035  0.83990419\r\nvt  0.94903719  0.86873299\r\nvt  0.91189015  0.81550306\r\nvt  0.16015354  0.85009813\r\nvt  0.22744974  0.86424780\r\nvt  0.25701156  0.80675423\r\nvt  0.26091811  0.72734809\r\nvt  0.24302976  0.66124272\r\nvt  0.23737812  0.65326762\r\nvt  0.21827470  0.70467526\r\nvt  0.96732920  0.74082309\r\nvt  0.95483273  0.72007912\r\nvt  0.95824689  0.78123021\r\nvt  0.94280487  0.75948936\r\nvt  0.93393064  0.80066848\r\nvt  0.95350069  0.82204407\r\nvt  0.95839769  0.85810179\r\nvt  0.17230821  0.83990419\r\nvt  0.18867508  0.86873299\r\nvt  0.27353719  0.79866397\r\nvt  0.25139815  0.67222881\r\nvt  0.24491549  0.66564167\r\nvt  0.24062717  0.69054067\r\nvt  0.23105539  0.67738754\r\nvt  0.20696709  0.74082309\r\nvt  0.22193593  0.75793272\r\nvt  0.19788478  0.78123021\r\nvt  0.21701851  0.83746237\r\nvt  0.19313852  0.82204407\r\nvt  0.22819048  0.86808830\r\nvt  0.19803551  0.85810179\r\nvt  0.25395930  0.87730432\r\nvt  0.22121222  0.87791431\r\nvt  0.25606596  0.86002237\r\nvt  0.28668943  0.78771669\r\nvt  0.27077332  0.72606319\r\nvt  0.27909499  0.72200447\r\nvt  0.25901586  0.67895943\r\nvt  0.25275978  0.67491573\r\nvt  0.26129469  0.68105978\r\nvt  0.23023638  0.72037095\r\nvt  0.23983084  0.76975697\r\nvt  0.21668373  0.79847926\r\nvt  0.24472091  0.84479678\r\nvt  0.26013517  0.86854798\r\nvt  0.28298095  0.86849791\r\nvt  0.27966452  0.84940249\r\nvt  0.29815051  0.83533591\r\nvt  0.29710370  0.77570522\r\nvt  0.26615387  0.68253642\r\nvt  0.27314928  0.68363237\r\nvt  0.26438549  0.70458710\r\nvt  0.25164527  0.69998962\r\nvt  0.24437858  0.73167711\r\nvt  0.26049137  0.77423120\r\nvt  0.26434723  0.81130570\r\nvt  0.23910740  0.80923015\r\nvt  0.27408546  0.84238106\r\nvt  0.31267333  0.81997013\r\nvt  0.29275021  0.71000206\r\nvt  0.28625348  0.71639585\r\nvt  0.27087379  0.68358696\r\nvt  0.28168595  0.68159568\r\nvt  0.27874407  0.70293260\r\nvt  0.26083410  0.73691094\r\nvt  0.31625831  0.84292972\r\nvt  0.29021886  0.85969323\r\nvt  0.32619220  0.83578539\r\nvt  0.30678269  0.85403591\r\nvt  0.30560952  0.76382792\r\nvt  0.28835893  0.67866641\r\nvt  0.28040725  0.68245846\r\nvt  0.27910000  0.73432660\r\nvt  0.30505341  0.75476992\r\nvt  0.28281063  0.76951635\r\nvt  0.29038635  0.80321950\r\nvt  0.30216199  0.82986611\r\nvt  0.33818373  0.81957120\r\nvt  0.32481214  0.80412376\r\nvt  0.32118228  0.74012130\r\nvt  0.31322578  0.75233656\r\nvt  0.29925099  0.70287150\r\nvt  0.29369789  0.67394280\r\nvt  0.31001788  0.67635715\r\nvt  0.29419369  0.69379002\r\nvt  0.29808334  0.72275013\r\nvt  0.33666798  0.75729877\r\nvt  0.31495589  0.78484738\r\nvt  0.34809756  0.77851713\r\nvt  0.32697809  0.80812991\r\nvt  0.35814992  0.78789198\r\nvt  0.34284130  0.81409091\r\nvt  0.34816998  0.76618904\r\nvt  0.33081573  0.72444409\r\nvt  0.33617780  0.78698939\r\nvt  0.31580719  0.68103671\r\nvt  0.30660781  0.69400811\r\nvt  0.29743001  0.67124283\r\nvt  0.32566169  0.65024096\r\nvt  0.31657499  0.70195705\r\nvt  0.33388707  0.67241001\r\nvt  0.32568911  0.73043770\r\nvt  0.34416032  0.69764990\r\nvt  0.37344503  0.75451881\r\nvt  0.37296841  0.75539476\r\nvt  0.35689786  0.79016966\r\nvt  0.36147559  0.73856574\r\nvt  0.34283122  0.70156014\r\nvt  0.32734844  0.66059136\r\nvt  0.32032570  0.63757968\r\nvt  0.30804715  0.65835589\r\nvt  0.30674914  0.65931296\r\nvt  0.32057431  0.63633251\r\nvt  0.34088477  0.61522937\r\nvt  0.35545892  0.72197765\r\nvt  0.36617926  0.74202091\r\nvt  0.38223436  0.69891387\r\nvt  0.34091812  0.62959975\r\nvt  0.33393136  0.60674000\r\nvt  0.33484915  0.60387224\r\nvt  0.35566953  0.57142979\r\nvt  0.34998119  0.63458598\r\nvt  0.37610778  0.60984933\r\nvt  0.38728794  0.63089979\r\nvt  0.36077315  0.65725344\r\nvt  0.37206048  0.67968535\r\nvt  0.39712054  0.64934140\r\nvt  0.38869682  0.71198535\r\nvt  0.40231961  0.66567886\r\nvt  0.38765162  0.71491700\r\nvt  0.39121059  0.65343660\r\nvt  0.37596953  0.70143139\r\nvt  0.35693833  0.66817021\r\nvt  0.35580984  0.58632761\r\nvt  0.34834716  0.56469625\r\nvt  0.34929192  0.56147826\r\nvt  0.37009978  0.51990408\r\nvt  0.36513475  0.58895552\r\nvt  0.39068785  0.55661637\r\nvt  0.40176898  0.57675588\r\nvt  0.41142738  0.59437609\r\nvt  0.40326509  0.66227591\r\nvt  0.41754213  0.60643017\r\nvt  0.37238804  0.62244201\r\nvt  0.37137631  0.53131413\r\nvt  0.36372286  0.51005000\r\nvt  0.39390096  0.48020062\r\nvt  0.37967482  0.53667736\r\nvt  0.41595447  0.51968229\r\nvt  0.41702819  0.60870856\r\nvt  0.40683186  0.59546953\r\nvt  0.38851479  0.56498802\r\nvt  0.38717562  0.46848315\r\nvt  0.37799630  0.45247263\r\nvt  0.36313379  0.51214606\r\nvt  0.39229715  0.39351609\r\nvt  0.38429859  0.46327680\r\nvt  0.41917405  0.44324508\r\nvt  0.40492943  0.49993530\r\nvt  0.43017936  0.46321526\r\nvt  0.43974000  0.48004451\r\nvt  0.42554694  0.53664637\r\nvt  0.43177411  0.54747087\r\nvt  0.44666311  0.48796532\r\nvt  0.43181294  0.54759580\r\nvt  0.42261285  0.53166676\r\nvt  0.40488932  0.50009364\r\nvt  0.37805563  0.45251554\r\nvt  0.40656757  0.33769962\r\nvt  0.41273054  0.35056788\r\nvt  0.39842707  0.40551037\r\nvt  0.43375763  0.39001653\r\nvt  0.40809312  0.42310330\r\nvt  0.44609693  0.48997492\r\nvt  0.45396653  0.41382787\r\nvt  0.43737850  0.37774819\r\nvt  0.43840080  0.46886989\r\nvt  0.42125827  0.43521187\r\nvt  0.40295890  0.40466848\r\nvt  0.39278871  0.39132801\r\nvt  0.42257431  0.36897311\r\nvt  0.44909438  0.34262761\r\nvt  0.44472551  0.41092986\r\nvt  0.46896970  0.38469136\r\nvt  0.45417726  0.42850074\r\nvt  0.47498584  0.39609942\r\nvt  0.46053430  0.43851733\r\nvt  0.47587687  0.39330021\r\nvt  0.46886075  0.37051299\r\nvt  0.46145391  0.43538138\r\nvt  0.45282409  0.33199027\r\nvt  0.41857064  0.34671396\r\nvt  0.40748844  0.33438355\r\nvt  0.42761156  0.30102336\r\nvt  0.43780041  0.32021153\r\nvt  0.45442703  0.27788559\r\nvt  0.45988441  0.36530423\r\nvt  0.48419201  0.34969932\r\nvt  0.48924598  0.36367214\r\nvt  0.43380260  0.29871526\r\nvt  0.44827774  0.26158661\r\nvt  0.42214650  0.28516331\r\nvt  0.42112759  0.28801614\r\nvt  0.44369015  0.25787392\r\nvt  0.47326219  0.24254222\r\nvt  0.46572819  0.30221468\r\nvt  0.49332216  0.29794630\r\nvt  0.47599009  0.32748163\r\nvt  0.48945418  0.36250100\r\nvt  0.50169283  0.34174863\r\nvt  0.49388099  0.31913662\r\nvt  0.48239392  0.33956197\r\nvt  0.46689677  0.29862747\r\nvt  0.46155056  0.23396741\r\nvt  0.43683007  0.24466482\r\nvt  0.45296651  0.20975631\r\nvt  0.43639445  0.24544299\r\nvt  0.48292989  0.19177659\r\nvt  0.46181276  0.22134252\r\nvt  0.50487089  0.24513936\r\nvt  0.48423541  0.26942199\r\nvt  0.49983701  0.32360438\r\nvt  0.50305134  0.34071806\r\nvt  0.51611197  0.32606363\r\nvt  0.51232380  0.32880577\r\nvt  0.50309646  0.30608857\r\nvt  0.47885826  0.27576023\r\nvt  0.48850301  0.26001447\r\nvt  0.47354171  0.21312995\r\nvt  0.45164698  0.21214740\r\nvt  0.47167310  0.18038337\r\nvt  0.49359131  0.15704194\r\nvt  0.50773734  0.17007884\r\nvt  0.51953298  0.19672406\r\nvt  0.49497408  0.21504827\r\nvt  0.51181549  0.27718565\r\nvt  0.51566571  0.30617896\r\nvt  0.52141237  0.32134295\r\nvt  0.51047891  0.29716551\r\nvt  0.48359314  0.16424116\r\nvt  0.46694651  0.18594746\r\nvt  0.51967925  0.14027332\r\nvt  0.53585947  0.15759493\r\nvt  0.52710301  0.23043713\r\nvt  0.53079164  0.26564002\r\nvt  0.54545629  0.29542539\r\nvt  0.53111404  0.29704711\r\nvt  0.52813148  0.31839743\r\nvt  0.52933550  0.31752208\r\nvt  0.49648544  0.24773800\r\nvt  0.48491994  0.19595279\r\nvt  0.57082713  0.19082433\r\nvt  0.54560006  0.18869044\r\nvt  0.57007229  0.23030539\r\nvt  0.54943186  0.22578047\r\nvt  0.54905230  0.26310650\r\nvt  0.55817741  0.30003697\r\nvt  0.53891873  0.31641105\r\nvt  0.54848391  0.31892565\r\nvt  0.53658819  0.31630713\r\nvt  0.52345651  0.28351745\r\nvt  0.51695371  0.28997698\r\nvt  0.50408602  0.23617707\r\nvt  0.51161140  0.16461641\r\nvt  0.49706030  0.18004309\r\nvt  0.52687097  0.13146485\r\nvt  0.50302947  0.14594923\r\nvt  0.59289777  0.16259630\r\nvt  0.54979461  0.13144453\r\nvt  0.56522965  0.15523306\r\nvt  0.59321564  0.20159708\r\nvt  0.56548631  0.26837510\r\nvt  0.57961053  0.27968305\r\nvt  0.55702394  0.32505426\r\nvt  0.54360068  0.31737772\r\nvt  0.53064263  0.27787673\r\nvt  0.52305633  0.21218094\r\nvt  0.51260942  0.22422352\r\nvt  0.53012818  0.15053077\r\nvt  0.55591053  0.12266754\r\nvt  0.58172476  0.13193345\r\nvt  0.61675876  0.17804931\r\nvt  0.58793932  0.24214014\r\nvt  0.56918859  0.30947852\r\nvt  0.55073941  0.32092118\r\nvt  0.55376375  0.13989267\r\nvt  0.58868623  0.12207660\r\nvt  0.63630247  0.19942324\r\nvt  0.61199349  0.21887204\r\nvt  0.60288894  0.25926757\r\nvt  0.59155619  0.29538497\r\nvt  0.58730972  0.33879471\r\nvt  0.57874840  0.32262436\r\nvt  0.55837232  0.32764074\r\nvt  0.56486160  0.33430699\r\nvt  0.54885000  0.27247968\r\nvt  0.53897387  0.27377295\r\nvt  0.53622967  0.20119146\r\nvt  0.58240294  0.13568024\r\nvt  0.62121326  0.13127945\r\nvt  0.61187500  0.14195561\r\nvt  0.63757437  0.16016321\r\nvt  0.65214264  0.22481319\r\nvt  0.62741494  0.24060515\r\nvt  0.62604123  0.30319515\r\nvt  0.61537164  0.27999803\r\nvt  0.60180044  0.31424564\r\nvt  0.58002061  0.36254260\r\nvt  0.57240683  0.34666988\r\nvt  0.56052595  0.27575234\r\nvt  0.55278128  0.19310002\r\nvt  0.61371928  0.14080200\r\nvt  0.65831864  0.18451788\r\nvt  0.66522253  0.25303087\r\nvt  0.64021093  0.26526681\r\nvt  0.61927140  0.35900173\r\nvt  0.61089724  0.33554697\r\nvt  0.60310495  0.37958336\r\nvt  0.58788377  0.38244322\r\nvt  0.59532923  0.35776648\r\nvt  0.56677425  0.33867350\r\nvt  0.57402420  0.28553912\r\nvt  0.57293308  0.19031937\r\nvt  0.64405566  0.15695542\r\nvt  0.67288047  0.17642735\r\nvt  0.64968944  0.14989559\r\nvt  0.67633045  0.28314233\r\nvt  0.65113008  0.29201415\r\nvt  0.63546878  0.32829186\r\nvt  0.62726194  0.38441771\r\nvt  0.61088663  0.40436152\r\nvt  0.59615672  0.40697777\r\nvt  0.57602566  0.35523480\r\nvt  0.59619963  0.19555064\r\nvt  0.67496359  0.21339381\r\nvt  0.69996315  0.27989927\r\nvt  0.68605393  0.31457815\r\nvt  0.65220624  0.38265720\r\nvt  0.66075432  0.32018569\r\nvt  0.64409584  0.35486189\r\nvt  0.61878383  0.43209139\r\nvt  0.58618748  0.37882885\r\nvt  0.58922881  0.30454183\r\nvt  0.64606470  0.24288850\r\nvt  0.62119699  0.21205208\r\nvt  0.67049903  0.18436933\r\nvt  0.69132239  0.20918097\r\nvt  0.68854839  0.24547426\r\nvt  0.66948831  0.34940013\r\nvt  0.65995491  0.41146284\r\nvt  0.63505977  0.41165814\r\nvt  0.62680149  0.46244764\r\nvt  0.60486704  0.43643087\r\nvt  0.59718877  0.41060776\r\nvt  0.60580271  0.33563524\r\nvt  0.71001130  0.26960588\r\nvt  0.69228047  0.22231120\r\nvt  0.70617151  0.24685638\r\nvt  0.70984608  0.31609055\r\nvt  0.69478875  0.34698737\r\nvt  0.67758512  0.37941468\r\nvt  0.66744918  0.44090277\r\nvt  0.65037024  0.47044188\r\nvt  0.64274085  0.44047388\r\nvt  0.63496846  0.49485856\r\nvt  0.62118793  0.49824038\r\nvt  0.61395270  0.47045761\r\nvt  0.60888445  0.45074934\r\nvt  0.62328571  0.38104600\r\nvt  0.68998438  0.35335192\r\nvt  0.66927350  0.29014501\r\nvt  0.72457838  0.32414865\r\nvt  0.71846479  0.28844640\r\nvt  0.70278406  0.37982941\r\nvt  0.71020877  0.41259843\r\nvt  0.68520689  0.40981543\r\nvt  0.67474961  0.47057372\r\nvt  0.64328122  0.52846277\r\nvt  0.63318729  0.54816031\r\nvt  0.62340331  0.50821698\r\nvt  0.63400346  0.55007803\r\nvt  0.64120650  0.44089577\r\nvt  0.73680806  0.38251451\r\nvt  0.72891551  0.33261922\r\nvt  0.73802608  0.37781125\r\nvt  0.72651255  0.39052817\r\nvt  0.71860272  0.35323659\r\nvt  0.71715701  0.44461671\r\nvt  0.69940472  0.47009087\r\nvt  0.69246042  0.44021136\r\nvt  0.68190175  0.50000107\r\nvt  0.65797436  0.50102496\r\nvt  0.64334184  0.58854675\r\nvt  0.64732093  0.60217339\r\nvt  0.65912461  0.51006293\r\nvt  0.72386289  0.49996623\r\nvt  0.70808649  0.42674336\r\nvt  0.74730635  0.44019067\r\nvt  0.70607978  0.49903777\r\nvt  0.66559029  0.53164715\r\nvt  0.67324263  0.56175929\r\nvt  0.65177685  0.56236452\r\nvt  0.65390784  0.62758249\r\nvt  0.67674345  0.57895303\r\nvt  0.75652158  0.49296421\r\nvt  0.74611229  0.42207631\r\nvt  0.73373812  0.42691633\r\nvt  0.72988844  0.50436646\r\nvt  0.72369027  0.47533464\r\nvt  0.68893111  0.52877033\r\nvt  0.66943240  0.62739438\r\nvt  0.66048527  0.59564972\r\nvt  0.66491663  0.66367340\r\nvt  0.67546833  0.69207281\r\nvt  0.66114980  0.65044332\r\nvt  0.71044898  0.68484449\r\nvt  0.69389516  0.63850969\r\nvt  0.73775262  0.56350780\r\nvt  0.75339252  0.46362537\r\nvt  0.76004976  0.50124240\r\nvt  0.74658388  0.49362263\r\nvt  0.74039018  0.46148583\r\nvt  0.75233066  0.52261502\r\nvt  0.73575383  0.53124249\r\nvt  0.71254134  0.52672458\r\nvt  0.69587922  0.55648869\r\nvt  0.68096083  0.59078676\r\nvt  0.69040930  0.72629452\r\nvt  0.72645223  0.71859449\r\nvt  0.76139426  0.65019840\r\nvt  0.75015014  0.61343300\r\nvt  0.77227944  0.57513613\r\nvt  0.76478398  0.53831220\r\nvt  0.74131376  0.55576396\r\nvt  0.72490311  0.57720649\r\nvt  0.71880281  0.55283070\r\nvt  0.70970136  0.60786796\r\nvt  0.70278263  0.58290774\r\nvt  0.68881762  0.61846423\r\nvt  0.68854177  0.68471760\r\nvt  0.67874074  0.65719652\r\nvt  0.68894154  0.72459501\r\nvt  0.67653805  0.69614691\r\nvt  0.74191612  0.74185610\r\nvt  0.77914113  0.60372889\r\nvt  0.77173471  0.56128383\r\nvt  0.76614481  0.53389627\r\nvt  0.75766128  0.54817486\r\nvt  0.74664503  0.57790136\r\nvt  0.73093528  0.59978920\r\nvt  0.71674985  0.63124990\r\nvt  0.69690359  0.64456332\r\nvt  0.70604795  0.75322098\r\nvt  0.75674134  0.75675637\r\nvt  0.78125113  0.69316363\r\nvt  0.77172291  0.67599952\r\nvt  0.78545195  0.62505555\r\nvt  0.76263946  0.57031208\r\nvt  0.76728839  0.58910555\r\nvt  0.73699856  0.62058508\r\nvt  0.72407669  0.65302289\r\nvt  0.70536041  0.66887653\r\nvt  0.71439278  0.69132388\r\nvt  0.71039397  0.73188770\r\nvt  0.69900793  0.70965570\r\nvt  0.70228750  0.74877059\r\nvt  0.72233552  0.77333009\r\nvt  0.77085698  0.76493818\r\nvt  0.79004049  0.70345092\r\nvt  0.78159249  0.60117030\r\nvt  0.77688146  0.58360624\r\nvt  0.77169925  0.60482913\r\nvt  0.75692785  0.61521441\r\nvt  0.75180322  0.59767854\r\nvt  0.72427416  0.71165967\r\nvt  0.73255289  0.78400350\r\nvt  0.71679330  0.76864713\r\nvt  0.73920047  0.78723955\r\nvt  0.79807466  0.70829284\r\nvt  0.79123145  0.64008141\r\nvt  0.76219243  0.63060856\r\nvt  0.75002366  0.65675288\r\nvt  0.74327993  0.63959044\r\nvt  0.73191637  0.67306632\r\nvt  0.73702514  0.76681525\r\nvt  0.72297144  0.75108504\r\nvt  0.74952763  0.79455841\r\nvt  0.79620463  0.76583052\r\nvt  0.75632286  0.79540008\r\nvt  0.78407049  0.76765102\r\nvt  0.80530733  0.70874798\r\nvt  0.79649025  0.64987224\r\nvt  0.78591347  0.61453778\r\nvt  0.75043404  0.70679289\r\nvt  0.74057490  0.69118005\r\nvt  0.74794799  0.74421304\r\nvt  0.73534846  0.72954273\r\nvt  0.77326584  0.79821384\r\nvt  0.80705214  0.76044327\r\nvt  0.81169772  0.70591074\r\nvt  0.80120862  0.65531898\r\nvt  0.79361439  0.63099074\r\nvt  0.78987646  0.62425846\r\nvt  0.77597243  0.61776769\r\nvt  0.78033322  0.62821919\r\nvt  0.76789963  0.64383107\r\nvt  0.77441454  0.65456098\r\nvt  0.76636404  0.68391347\r\nvt  0.75758803  0.67175359\r\nvt  0.75265723  0.77828181\r\nvt  0.76729602  0.79990739\r\nvt  0.78938973  0.79617518\r\nvt  0.80924457  0.65707779\r\nvt  0.80542594  0.65741420\r\nvt  0.78508091  0.63628191\r\n\r\nvn  0.70785600 -0.70635200  0.00261280\r\nvn  0.86868697 -0.35453001  0.34596500\r\nvn  0.79714900  0.09160940  0.59679198\r\nvn  0.51224899  0.51282197  0.68892300\r\nvn  0.09001330  0.79673600  0.59758598\r\nvn -0.35646001  0.86759001  0.34673300\r\nvn -0.70738000  0.70682800  0.00292415\r\nvn -0.86862200  0.35788301 -0.34265900\r\nvn -0.79690099 -0.08635420 -0.59790599\r\nvn -0.51146603 -0.50861800 -0.69261098\r\nvn -0.08884850 -0.79593700 -0.59882402\r\nvn  0.35750899 -0.86857700 -0.34316400\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70705301 -0.70099199  0.09319560\r\nvn  0.88091701 -0.29859799  0.36718500\r\nvn  0.81901699  0.18293200  0.54382598\r\nvn  0.53772902  0.61525100  0.57646698\r\nvn  0.11210900  0.88293999  0.45590401\r\nvn -0.34370199  0.91441202  0.21382400\r\nvn -0.70731699  0.70169199 -0.08562030\r\nvn -0.88126898  0.30217600 -0.36339301\r\nvn -0.81895101 -0.17790100 -0.54559201\r\nvn -0.53726602 -0.61198503 -0.58036202\r\nvn -0.11161900 -0.88336003 -0.45521000\r\nvn  0.34386599 -0.91586697 -0.20722900\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70612800 -0.68609399  0.17509601\r\nvn  0.90122002 -0.24400100  0.35814101\r\nvn  0.85505402  0.26284000  0.44698799\r\nvn  0.57976598  0.69948500  0.41784200\r\nvn  0.14879200  0.94903803  0.27782500\r\nvn -0.32214299  0.94452798  0.06396040\r\nvn -0.70656902  0.68764299 -0.16705599\r\nvn -0.90166998  0.24752900 -0.35457101\r\nvn -0.85534501 -0.25889999 -0.44872600\r\nvn -0.58004200 -0.69765699 -0.42050600\r\nvn -0.14905700 -0.94992799 -0.27462301\r\nvn  0.32178599 -0.94519198 -0.05537730\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70549601 -0.66558599  0.24345399\r\nvn  0.92636901 -0.20420100  0.31645200\r\nvn  0.89933503  0.31182501  0.30653101\r\nvn  0.63129997  0.74491501  0.21578400\r\nvn  0.19374500  0.97869802  0.06792280\r\nvn -0.29568699  0.95028299 -0.09762420\r\nvn -0.70560902  0.66783398 -0.23688500\r\nvn -0.92673999  0.20721300 -0.31339401\r\nvn -0.90022600 -0.30924100 -0.30653301\r\nvn -0.63254601 -0.74402499 -0.21520101\r\nvn -0.19454500 -0.97889900 -0.06252890\r\nvn  0.29538399 -0.94948798  0.10592600\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70522201 -0.64346701  0.29767901\r\nvn  0.94937098 -0.19044399  0.24985200\r\nvn  0.93956602  0.31400099  0.13645300\r\nvn  0.67793202  0.73501199 -0.01288380\r\nvn  0.23428500  0.95917302 -0.15842400\r\nvn -0.27195701  0.92620897 -0.26110399\r\nvn -0.70497000  0.64560097 -0.29362601\r\nvn -0.94952500  0.19270000 -0.24752700\r\nvn -0.94049603 -0.31203300 -0.13454300\r\nvn -0.67924500 -0.73373002  0.01634420\r\nvn -0.23495901 -0.95802599  0.16425800\r\nvn  0.27200601 -0.92448801  0.26708499\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70562398 -0.62191498  0.33958101\r\nvn  0.96318400 -0.20559900  0.17322300\r\nvn  0.96309102  0.26636899 -0.03878070\r\nvn  0.70477903  0.66750699 -0.24025300\r\nvn  0.25728199  0.88968301 -0.37718701\r\nvn -0.25888899  0.87326902 -0.41276801\r\nvn -0.70531100  0.62332600 -0.33763999\r\nvn -0.96313000  0.20703800 -0.17180400\r\nvn -0.96347201 -0.26463899  0.04107210\r\nvn -0.70530301 -0.66553301  0.24415900\r\nvn -0.25744101 -0.88768601  0.38175800\r\nvn  0.25911799 -0.87155098  0.41624099\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70724398 -0.60206902  0.37056601\r\nvn  0.96460003 -0.24381600  0.10050300\r\nvn  0.96385598  0.18027900 -0.19616400\r\nvn  0.70463800  0.55641502 -0.44032601\r\nvn  0.25631899  0.78327203 -0.56638002\r\nvn -0.26041901  0.80002898 -0.54049498\r\nvn -0.70704901  0.60275698 -0.36981899\r\nvn -0.96448302  0.24454799 -0.09984120\r\nvn -0.96377999 -0.17895900  0.19774100\r\nvn -0.70448399 -0.55448800  0.44299501\r\nvn -0.25607699 -0.78135800  0.56912601\r\nvn  0.26066399 -0.79876900  0.54223901\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.71004999 -0.58515197  0.39169601\r\nvn  0.95437300 -0.29605100  0.03905480\r\nvn  0.94325799  0.07273980 -0.32399601\r\nvn  0.67918801  0.42226201 -0.60033202\r\nvn  0.23289400  0.65846598 -0.71566999\r\nvn -0.27558500  0.71803302 -0.63912600\r\nvn -0.70997000  0.58540899 -0.39145699\r\nvn -0.95429403  0.29633701 -0.03881830\r\nvn -0.94305402 -0.07194270  0.32476801\r\nvn -0.67883599 -0.42094001  0.60165697\r\nvn -0.23255500 -0.65715998  0.71697903\r\nvn  0.27577901 -0.71728098  0.63988602\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.71327901 -0.57235903  0.40452200\r\nvn  0.93461698 -0.35552001 -0.00982542\r\nvn  0.90573901 -0.04321100 -0.42162800\r\nvn  0.63398403  0.28083301 -0.72055399\r\nvn  0.19217101  0.52951699 -0.82624501\r\nvn -0.30095401  0.63615000 -0.71044999\r\nvn -0.71325999  0.57242399 -0.40446299\r\nvn -0.93459702  0.35556999  0.00986982\r\nvn -0.90560198  0.04355000  0.42188600\r\nvn -0.63372499 -0.28017300  0.72103798\r\nvn -0.19192401 -0.52883798  0.82673800\r\nvn  0.30107701 -0.63577801  0.71073103\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.71581799 -0.56444901  0.41109800\r\nvn  0.90667099 -0.41916999 -0.04737070\r\nvn  0.85473800 -0.16148999 -0.49329999\r\nvn  0.57361698  0.13959400 -0.80714101\r\nvn  0.13866100  0.40323400 -0.90453100\r\nvn -0.33329299  0.55868900 -0.75946200\r\nvn -0.71582198  0.56444901 -0.41109100\r\nvn -0.90671098  0.41908699  0.04733740\r\nvn -0.85474402  0.16146401  0.49329701\r\nvn -0.57355499 -0.13947000  0.80720699\r\nvn -0.13856900 -0.40302300  0.90463901\r\nvn  0.33335200 -0.55854398  0.75954300\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.71645200 -0.56178200  0.41363901\r\nvn  0.87040800 -0.48664600 -0.07460630\r\nvn  0.79124600 -0.28112301 -0.54304701\r\nvn  0.49992499 -0.00014078 -0.86606902\r\nvn  0.07455430  0.28090701 -0.95683497\r\nvn -0.37064400  0.48656499 -0.79112399\r\nvn -0.71646500  0.56176502 -0.41363999\r\nvn -0.87052602  0.48644400  0.07454810\r\nvn -0.79145598  0.28075600  0.54293102\r\nvn -0.50012600 -0.00019873  0.86595201\r\nvn -0.07465030 -0.28105700  0.95678300\r\nvn  0.37064400 -0.48655701  0.79112899\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.71391898 -0.56446999  0.41435999\r\nvn  0.82429200 -0.55878597 -0.09110980\r\nvn  0.71385902 -0.40347001 -0.57237798\r\nvn  0.41200799 -0.13989100 -0.90037799\r\nvn -0.00029692  0.16126999 -0.98690999\r\nvn -0.41236699  0.41909501 -0.80889702\r\nvn -0.71394998  0.56443101 -0.41435799\r\nvn -0.82455403  0.55840701  0.09106840\r\nvn -0.71439999  0.40267801  0.57226098\r\nvn -0.41260400  0.13904200  0.90023601\r\nvn -0.00006071 -0.16176800  0.98682898\r\nvn  0.41229400 -0.41919300  0.80888200\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70689100 -0.57245201  0.41545600\r\nvn  0.76563799 -0.63628000 -0.09458960\r\nvn  0.61923897 -0.52980298 -0.57952702\r\nvn  0.30676800 -0.28117499 -0.90930402\r\nvn -0.08791070  0.04296950 -0.99520099\r\nvn -0.45886499  0.35544401 -0.81431103\r\nvn -0.70699501  0.57233602 -0.41543999\r\nvn -0.76620698  0.63558602  0.09464610\r\nvn -0.62039101  0.52838600  0.57958800\r\nvn -0.30804101  0.27964601  0.90934497\r\nvn  0.08713060 -0.04389540  0.99522901\r\nvn  0.45866901 -0.35568100  0.81431800\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.69396800 -0.58545297  0.41910899\r\nvn  0.69112003 -0.71820199 -0.08086290\r\nvn  0.50300300 -0.65880901 -0.55942702\r\nvn  0.17993300 -0.42265499 -0.88824898\r\nvn -0.19129699 -0.07300330 -0.97881401\r\nvn -0.51109499  0.29598099 -0.80695599\r\nvn -0.69429201  0.58512300 -0.41903400\r\nvn -0.69232100  0.71700501  0.08121750\r\nvn -0.50527298  0.65653002  0.56006002\r\nvn -0.18236500  0.42023799  0.88889998\r\nvn  0.18982500  0.07151300  0.97921002\r\nvn  0.51065803 -0.29646701  0.80705398\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.67374700 -0.60283101  0.42738599\r\nvn  0.59802997 -0.80023003 -0.04463140\r\nvn  0.36184901 -0.78364098 -0.50494802\r\nvn  0.02847910 -0.55681598 -0.83014703\r\nvn -0.31240699 -0.18052800 -0.93263698\r\nvn -0.56945598  0.24377500 -0.78504401\r\nvn -0.67462200  0.60204703 -0.42711300\r\nvn -0.60038501  0.79840499  0.04568030\r\nvn -0.36588499  0.78051502  0.50687701\r\nvn -0.03257260  0.55357498  0.83216202\r\nvn  0.30998999  0.17842101  0.93384802\r\nvn  0.56856799 -0.24472000  0.78539300\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.64496899 -0.62345302  0.44195101\r\nvn  0.48652899 -0.87348002  0.01796590\r\nvn  0.19734401 -0.89000100 -0.41103899\r\nvn -0.14503101 -0.66781503 -0.73006099\r\nvn -0.44842800 -0.26651901 -0.85315901\r\nvn -0.63174897  0.20564000 -0.74739897\r\nvn -0.64700598  0.62194300 -0.44110200\r\nvn -0.49074200  0.87116498 -0.01560960\r\nvn -0.20351800  0.88672602  0.41508800\r\nvn  0.13944700  0.66450500  0.73415798\r\nvn  0.44526899  0.26403201  0.85558301\r\nvn  0.63017398 -0.20727400  0.74827701\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.60659999 -0.64580899  0.46364501\r\nvn  0.36158299 -0.92638999  0.10516600\r\nvn  0.01923810 -0.95933300 -0.28162101\r\nvn -0.32863301 -0.73509198 -0.59299201\r\nvn -0.58847499 -0.31393600 -0.74507803\r\nvn -0.69119197  0.19063599 -0.69707298\r\nvn -0.61050600  0.64361000 -0.46157199\r\nvn -0.36817700  0.92426699 -0.10087700\r\nvn -0.02683490  0.95732099  0.28777999\r\nvn  0.32330999  0.73292899  0.59856999\r\nvn  0.58572698  0.31147301  0.74826998\r\nvn  0.68890798 -0.19302499  0.69867498\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.55765402 -0.66814703  0.49254701\r\nvn  0.23173600 -0.95040298  0.20744200\r\nvn -0.15659100 -0.97861898 -0.13335800\r\nvn -0.50335002 -0.74466503 -0.43830800\r\nvn -0.71558899 -0.31145301 -0.62524402\r\nvn -0.73726398  0.20461400 -0.64387500\r\nvn -0.56354600  0.66592002 -0.48884100\r\nvn -0.24011500  0.94961798 -0.20142300\r\nvn  0.14960800  0.97880203  0.13987499\r\nvn  0.50077200  0.74374700  0.44279400\r\nvn  0.71469897  0.30880901  0.62756902\r\nvn  0.73453701 -0.20765500  0.64601398\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.49751100 -0.68801701  0.52831399\r\nvn  0.10493400 -0.94456798  0.31109500\r\nvn -0.31587800 -0.94874299  0.01038580\r\nvn -0.65246099 -0.69895899 -0.29283300\r\nvn -0.81493503 -0.26222599 -0.51683497\r\nvn -0.76063198  0.24457701 -0.60134900\r\nvn -0.50444603  0.68656701 -0.52360201\r\nvn -0.11318600  0.94559300 -0.30502799\r\nvn  0.31131801  0.95028800 -0.00582312\r\nvn  0.65307999  0.69773698  0.29436401\r\nvn  0.81571698  0.25853601  0.51746100\r\nvn  0.75761998 -0.24806701  0.60371703\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.42723000 -0.70205098  0.56973499\r\nvn -0.01410740 -0.91436899  0.40463701\r\nvn -0.45167300 -0.88251197  0.13101199\r\nvn -0.76865500 -0.61458600 -0.17735200\r\nvn -0.88061100 -0.18221501 -0.43740401\r\nvn -0.75816798  0.29922900 -0.57934701\r\nvn -0.43380699  0.70150602 -0.56542099\r\nvn  0.00767524  0.91634202 -0.40032300\r\nvn  0.44971201  0.88379002 -0.12913100\r\nvn  0.77078998  0.61207300  0.17677701\r\nvn  0.88163698  0.17750700  0.43727201\r\nvn  0.75498098 -0.30274600  0.58167702\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.35047200 -0.70714903  0.61409199\r\nvn -0.12285700 -0.86748397  0.48205501\r\nvn -0.56324899 -0.79624301  0.22078800\r\nvn -0.85316199 -0.51210803 -0.09930080\r\nvn -0.91538900 -0.09087260 -0.39218101\r\nvn -0.73353499  0.35515401 -0.57947600\r\nvn -0.35559899  0.70683801 -0.61149800\r\nvn  0.11887700  0.86897600 -0.48036399\r\nvn  0.56316799  0.79619098 -0.22118200\r\nvn  0.85548699  0.50850499  0.09780160\r\nvn  0.91602498  0.08585050  0.39182600\r\nvn  0.73061401 -0.35846800  0.58112198\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.27292901 -0.70189601  0.65791398\r\nvn -0.21903400 -0.81108999  0.54236197\r\nvn -0.65230501 -0.70377100  0.28143299\r\nvn -0.91118997 -0.40834099 -0.05469160\r\nvn -0.92666602 -0.00358666 -0.37586799\r\nvn -0.69458503  0.40248099 -0.59628803\r\nvn -0.27633899  0.70109302 -0.65734702\r\nvn  0.21709500  0.81123501 -0.54292500\r\nvn  0.65316999  0.70224398 -0.28323400\r\nvn  0.91314399  0.40419701  0.05284600\r\nvn  0.92693198 -0.00124052  0.37522700\r\nvn  0.69228399 -0.40565100  0.59681702\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.20065600 -0.68736202  0.69804698\r\nvn -0.30046800 -0.75139898  0.58746803\r\nvn -0.72109097 -0.61483502  0.31938401\r\nvn -0.94880801 -0.31399101 -0.03423630\r\nvn -0.92280900  0.07082750 -0.37869099\r\nvn -0.64991403  0.43677801 -0.62196201\r\nvn -0.20259701  0.68567002 -0.69915098\r\nvn  0.29983699  0.75005698 -0.58950198\r\nvn  0.72223598  0.61215597 -0.32193199\r\nvn  0.95029998  0.30967200  0.03213130\r\nvn  0.92292899 -0.07536360  0.37752199\r\nvn  0.64837402 -0.44002599  0.62128001\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.13846201 -0.66628402  0.73273098\r\nvn -0.36585999 -0.69336700  0.62079698\r\nvn -0.77216297 -0.53528798  0.34239101\r\nvn -0.97178501 -0.23421900 -0.02784330\r\nvn -0.91133702  0.12937200 -0.39080301\r\nvn -0.60684502  0.45819601 -0.64945799\r\nvn -0.13945700  0.66398501 -0.73462600\r\nvn  0.36582199  0.69113302 -0.62330502\r\nvn  0.77315599  0.53217202 -0.34499601\r\nvn  0.97280502  0.23018900  0.02575720\r\nvn  0.91139001 -0.13341300  0.38931999\r\nvn  0.60591298 -0.46138799  0.64806700\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.08881530 -0.64223802  0.76134199\r\nvn -0.41551700 -0.64064097  0.64569801\r\nvn -0.80852002 -0.46790501  0.35687500\r\nvn -0.98501801 -0.17020801 -0.02773590\r\nvn -0.89775902  0.17280200 -0.40517700\r\nvn -0.56998599  0.46927199 -0.67446297\r\nvn -0.08926000  0.63964403 -0.76347101\r\nvn  0.41568500  0.63802099 -0.64817899\r\nvn  0.80925298  0.46478000 -0.35928899\r\nvn  0.98568600  0.16661701  0.02573800\r\nvn  0.89781398 -0.17634800  0.40352401\r\nvn  0.56949300 -0.47232699  0.67274398\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.05211900 -0.61825597  0.78424698\r\nvn -0.45096400 -0.59520799  0.66510099\r\nvn -0.83321601 -0.41308299  0.36757600\r\nvn -0.99228603 -0.12062600 -0.02861620\r\nvn -0.88556498  0.20386000 -0.41739100\r\nvn -0.54156202  0.47345001 -0.69466299\r\nvn -0.05230530  0.61584002 -0.78613299\r\nvn  0.45113000  0.59275901 -0.66717201\r\nvn  0.83367699  0.41037899 -0.36955601\r\nvn  0.99268401  0.11770400  0.02691250\r\nvn  0.88561302 -0.20674300  0.41586801\r\nvn  0.54132003 -0.47608301  0.69305003\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.02712900 -0.59671998  0.80199099\r\nvn -0.47456500 -0.55789298  0.68084002\r\nvn -0.84909898 -0.36989701  0.37710401\r\nvn -0.99615401 -0.08308090 -0.02784470\r\nvn -0.87633300  0.22572701 -0.42554301\r\nvn -0.52169597  0.47378799 -0.70947701\r\nvn -0.02719120  0.59460700 -0.80355698\r\nvn  0.47468400  0.55575901 -0.68250000\r\nvn  0.84936500  0.36765200 -0.37869599\r\nvn  0.99638498  0.08074800  0.02641350\r\nvn  0.87638402 -0.22803700  0.42420501\r\nvn  0.52160001 -0.47599000  0.70807201\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.01188700 -0.57896900  0.81526297\r\nvn -0.48880401 -0.52848500  0.69410002\r\nvn -0.85851699 -0.33661500  0.38683200\r\nvn -0.99820602 -0.05476180 -0.02421520\r\nvn -0.87044501  0.24155501 -0.42892501\r\nvn -0.50944698  0.47294101 -0.71888202\r\nvn -0.01190770  0.57738602 -0.81638402\r\nvn  0.48886201  0.52689201 -0.69526899\r\nvn  0.85864300  0.33498701 -0.38796300\r\nvn  0.99831998  0.05311100  0.02316970\r\nvn  0.87048000 -0.24319500  0.42792699\r\nvn  0.71650100 -0.36852899  0.59229499\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00391705 -0.56588602  0.82447398\r\nvn -0.49625400 -0.50640398  0.70518601\r\nvn -0.86345297 -0.31136999  0.39686000\r\nvn -0.99929398 -0.03304640 -0.01789230\r\nvn -0.86738098  0.25398701 -0.42794999\r\nvn -0.50305498  0.47281700 -0.72345001\r\nvn -0.00392330  0.56481099 -0.82521099\r\nvn  0.49627599  0.50531900 -0.70594800\r\nvn  0.86350203  0.31028399 -0.39760399\r\nvn  0.99934101  0.03196810  0.01719160\r\nvn  0.92595500 -0.18392301  0.32981801\r\nvn  0.71120399 -0.37460399  0.59486198\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00076214 -0.55781800  0.82996303\r\nvn -0.49925700 -0.49074900  0.71407801\r\nvn -0.86550099 -0.29224899  0.40681601\r\nvn -0.99983501 -0.01550690 -0.00949567\r\nvn -0.86626500  0.26531601 -0.42331100\r\nvn -0.50058103  0.47497001 -0.72375500\r\nvn -0.00076553  0.55728197 -0.83032298\r\nvn  0.49925900  0.49020201 -0.71445298\r\nvn  0.86551100  0.29170799 -0.40718299\r\nvn  0.99984598  0.01498410  0.00915037\r\nvn  0.96604902 -0.12746000  0.22473000\r\nvn  0.50057900 -0.47548801  0.72341698\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.00000375 -0.55493402  0.83189499\r\nvn -0.50000203 -0.48059401  0.72043598\r\nvn -0.86602598 -0.27747101  0.41594300\r\nvn -1.00000000  0.00000750  0.00000235\r\nvn -0.86602402  0.27748299 -0.41593900\r\nvn -0.49999800  0.48060101 -0.72043300\r\nvn  0.00000037  0.55493701 -0.83189201\r\nvn  0.49999899  0.48058200 -0.72044599\r\nvn  0.86602497  0.27746400 -0.41595000\r\nvn  1.00000000  0.00000638  0.00000621\r\nvn  0.96594203 -0.13671800  0.21969201\r\nvn  0.49999601 -0.48057699  0.72045100\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.00078275 -0.55727500  0.83032697\r\nvn -0.50059599 -0.47496101  0.72375101\r\nvn -0.86627299 -0.26529899  0.42330399\r\nvn -0.99983400  0.01552960  0.00949004\r\nvn -0.86549199  0.29227000 -0.40682000\r\nvn -0.49924201  0.49076200 -0.71407998\r\nvn  0.00077934  0.55782098 -0.82996100\r\nvn  0.50059402  0.47548601 -0.72340798\r\nvn  0.86627799  0.26582801 -0.42296299\r\nvn  0.99984598 -0.01497820 -0.00912663\r\nvn  0.86550301 -0.29169899  0.40720600\r\nvn  0.49924499 -0.49019399  0.71446800\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.00397852 -0.56480002  0.82521802\r\nvn -0.50310302 -0.47279701  0.72342998\r\nvn -0.86740899 -0.25395200  0.42791399\r\nvn -0.99929303  0.03309160  0.01785540\r\nvn -0.86342400  0.31141400 -0.39688799\r\nvn -0.49620599  0.50643301 -0.70519900\r\nvn  0.00397276  0.56589198 -0.82446998\r\nvn  0.50309497  0.47387099 -0.72273201\r\nvn  0.86742800  0.25503600 -0.42723000\r\nvn  0.99934202 -0.03198210 -0.01713470\r\nvn  0.86347502 -0.31028801  0.39765900\r\nvn  0.49622899 -0.50531501  0.70598400\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.01202470 -0.57736498  0.81639701\r\nvn -0.50954902 -0.47289699  0.71883798\r\nvn -0.87050200 -0.24148600  0.42884699\r\nvn -0.99820298  0.05484760  0.02413100\r\nvn -0.85845602  0.33669701 -0.38689700\r\nvn -0.48870000  0.52853900 -0.69413197\r\nvn  0.01200470  0.57897800 -0.81525499\r\nvn  0.50951600  0.47451401 -0.71779603\r\nvn  0.87053698  0.24314301 -0.42783901\r\nvn  0.99831998 -0.05315530 -0.02305770\r\nvn  0.85858601 -0.33500800  0.38807100\r\nvn  0.48876199 -0.52689099  0.69533998\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.02739830 -0.59456301  0.80358201\r\nvn -0.52187502 -0.47370401  0.70940202\r\nvn -0.87643301 -0.22560100  0.42540500\r\nvn -0.99614501  0.08323020  0.02769380\r\nvn -0.84898603  0.37003499 -0.37722200\r\nvn -0.47437900  0.55797797 -0.68089998\r\nvn  0.02733850  0.59672600 -0.80197901\r\nvn  0.52177799  0.47592300 -0.70798600\r\nvn  0.87648499  0.22793500 -0.42405301\r\nvn  0.99638200 -0.08083670 -0.02621910\r\nvn  0.84926200 -0.36769700  0.37888500\r\nvn  0.47450599 -0.55575597  0.68262702\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.05263650 -0.61575699  0.78617603\r\nvn -0.54184502 -0.47330001  0.69454402\r\nvn -0.88571799 -0.20364800  0.41717100\r\nvn -0.99226302  0.12086900  0.02837830\r\nvn -0.83302599  0.41330099 -0.36776301\r\nvn -0.45065901  0.59533399 -0.66519397\r\nvn  0.05245650  0.61825001 -0.78422898\r\nvn  0.54160202  0.47595701 -0.69291598\r\nvn  0.88576800  0.20656100 -0.41563001\r\nvn  0.99267399 -0.11786000 -0.02660650\r\nvn  0.83350599 -0.41045499  0.36985600\r\nvn  0.45084199 -0.59274900  0.66737598\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.08972950 -0.63952601  0.76351500\r\nvn -0.57037902 -0.46905300  0.67428303\r\nvn -0.89796001 -0.17249800  0.40486100\r\nvn -0.98496801  0.17054801  0.02740020\r\nvn -0.80823600  0.46819699 -0.35713699\r\nvn -0.41507700  0.64078999 -0.64583200\r\nvn  0.08929090  0.64219201 -0.76132601\r\nvn  0.56988001  0.47210601 -0.67257202\r\nvn  0.89801502  0.17605001 -0.40320501\r\nvn  0.98565400 -0.16686700 -0.02532130\r\nvn  0.80900002 -0.46490300  0.35970101\r\nvn  0.41527101 -0.63801199  0.64845300\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.13999701 -0.66377997  0.73470801\r\nvn -0.60728699 -0.45787701  0.64927000\r\nvn -0.91154099 -0.12895399  0.39046699\r\nvn -0.97168702  0.23466800  0.02749720\r\nvn -0.77179199  0.53565699 -0.34264901\r\nvn -0.36532000  0.69354397 -0.62091702\r\nvn  0.13902500  0.66621000 -0.73269200\r\nvn  0.60635602  0.46110401 -0.64785397\r\nvn  0.91160899  0.13305900 -0.38892701\r\nvn  0.97275698 -0.23045100 -0.02522500\r\nvn  0.77285701 -0.53225499  0.34553799\r\nvn  0.36534101 -0.69105297  0.62367600\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.20321999 -0.68538201  0.69925201\r\nvn -0.65040702 -0.43635601  0.62174302\r\nvn -0.92300200 -0.07029160  0.37832099\r\nvn -0.94863600  0.31454900  0.03387720\r\nvn -0.72060698  0.61527097 -0.31963700\r\nvn -0.29981199  0.75157303 -0.58758003\r\nvn  0.20130999  0.68721497 -0.69800401\r\nvn  0.64886397  0.43963301 -0.62104601\r\nvn  0.92315602  0.07492050 -0.37705499\r\nvn  0.95023203 -0.30995101 -0.03145610\r\nvn  0.72189301 -0.61218899  0.32263899\r\nvn  0.29928401 -0.74990201  0.58997899\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.27701300 -0.70069301  0.65748900\r\nvn -0.69509602 -0.40193200  0.59606397\r\nvn -0.92680800  0.00426019  0.37551099\r\nvn -0.91090500  0.40901700  0.05437780\r\nvn -0.65168399  0.70426601 -0.28163299\r\nvn -0.21825799  0.81124401 -0.54244500\r\nvn  0.27365199  0.70165300 -0.65787399\r\nvn  0.69279301  0.40513000 -0.59658003\r\nvn  0.92715698  0.00071878 -0.37467301\r\nvn  0.91308397 -0.40444699 -0.05196000\r\nvn  0.65283400 -0.70217001  0.28419101\r\nvn  0.21651401 -0.81096500  0.54356003\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.35623100 -0.70634300  0.61170298\r\nvn -0.73398799 -0.35451099  0.57929599\r\nvn -0.91542399  0.09163330  0.39192200\r\nvn -0.85274100  0.51284200  0.09912730\r\nvn -0.56250697  0.79674602 -0.22086599\r\nvn -0.12202000  0.86758298 -0.48208901\r\nvn  0.35118300  0.70680600 -0.61408198\r\nvn  0.73107702  0.35784900 -0.58092201\r\nvn  0.91625297 -0.08638860 -0.39117301\r\nvn  0.85553998 -0.50864297 -0.09661410\r\nvn  0.56299502 -0.79594898  0.22248900\r\nvn  0.11839600 -0.86857802  0.48120099\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.43424901 -0.70097297  0.56574202\r\nvn -0.75845897 -0.29857701  0.57930303\r\nvn -0.88047498  0.18295400  0.43736801\r\nvn -0.76808602  0.61527002  0.17744499\r\nvn -0.45085701  0.88295001 -0.13086900\r\nvn -0.01330080  0.91440898 -0.40457201\r\nvn  0.42782801  0.70167601 -0.56974900\r\nvn  0.75535202  0.30215001 -0.58150601\r\nvn  0.88196898 -0.17792900 -0.43643001\r\nvn  0.77123302 -0.61200100 -0.17508399\r\nvn  0.45002699 -0.88335800  0.13097601\r\nvn  0.00752370 -0.91585302  0.40144300\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.50468701 -0.68610102  0.52398098\r\nvn -0.76076198 -0.24401399  0.60141301\r\nvn -0.81463301  0.26282600  0.51700598\r\nvn -0.65175599  0.69947499  0.29316899\r\nvn -0.31501499  0.94903302 -0.01005750\r\nvn  0.10566700  0.94452798 -0.31096700\r\nvn  0.49795100  0.68764800 -0.52837998\r\nvn  0.75789899  0.24753600 -0.60358500\r\nvn  0.81627399 -0.25889400 -0.51640099\r\nvn  0.65417898 -0.69765598 -0.29210600\r\nvn  0.31235701 -0.94992900  0.00820298\r\nvn -0.11292300 -0.94519401  0.30636099\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.56356603 -0.66561198  0.48923799\r\nvn -0.73722899 -0.20423500  0.64403498\r\nvn -0.71514201  0.31179300  0.62558502\r\nvn -0.50255603  0.74489301  0.43883100\r\nvn -0.15573700  0.97869098  0.13382700\r\nvn  0.23235300  0.95029300 -0.20725501\r\nvn  0.55793500  0.66785800 -0.49261901\r\nvn  0.73477799  0.20724601 -0.64587200\r\nvn  0.71558100 -0.30920899 -0.62636602\r\nvn  0.50262803 -0.74400300 -0.44025499\r\nvn  0.15140601 -0.97889203 -0.13728400\r\nvn -0.23942100 -0.94949901  0.20280600\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.61041498 -0.64347398  0.46188301\r\nvn -0.69106698 -0.19045401  0.69724703\r\nvn -0.58796602  0.31399301  0.74545503\r\nvn -0.32782999  0.73500901  0.59354001\r\nvn  0.02003000  0.95917600  0.28210101\r\nvn  0.36207899  0.92621797 -0.10497300\r\nvn  0.60676199  0.64561301 -0.46370599\r\nvn  0.68912899  0.19271401 -0.69854403\r\nvn  0.58676499 -0.31202000 -0.74722803\r\nvn  0.32544601 -0.73371398 -0.59644699\r\nvn -0.02480720 -0.95801002 -0.28565899\r\nvn -0.36732799 -0.92448401  0.10198200\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.64689898 -0.62191403  0.44129899\r\nvn -0.63160801 -0.20559500  0.74753100\r\nvn -0.44795799  0.26637200  0.85345203\r\nvn -0.14432000  0.66750699  0.73048300\r\nvn  0.19801600  0.88968199  0.41140601\r\nvn  0.48691201  0.87326902 -0.01782160\r\nvn  0.64505899  0.62332600 -0.44199899\r\nvn  0.63035399  0.20703401 -0.74819100\r\nvn  0.44617999 -0.26465100 -0.85491699\r\nvn  0.14122500 -0.66554898 -0.73287100\r\nvn -0.20187400 -0.88769603 -0.41381600\r\nvn -0.49002799 -0.87155402  0.01628650\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.67453802 -0.60206902  0.42721301\r\nvn -0.56933802 -0.24381299  0.78511697\r\nvn -0.31204399  0.18028000  0.93280602\r\nvn  0.02901880  0.55641401  0.83039802\r\nvn  0.36234599  0.78326899  0.50516802\r\nvn  0.59829599  0.80002600  0.04471570\r\nvn  0.67379802  0.60275501 -0.42741501\r\nvn  0.56870902  0.24454400 -0.78534597\r\nvn  0.31065300 -0.17896800 -0.93352300\r\nvn -0.03137910 -0.55450797 -0.83158702\r\nvn -0.36481601 -0.78137898 -0.50631702\r\nvn -0.59991097 -0.79878002 -0.04536570\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.69424301 -0.58515197  0.41907400\r\nvn -0.51100898 -0.29605201  0.80698401\r\nvn -0.19104400  0.07274130  0.97888201\r\nvn  0.18030100  0.42226800  0.88835901\r\nvn  0.50333202  0.65847403  0.55952501\r\nvn  0.69128603  0.71803802  0.08089770\r\nvn  0.69399703  0.58540899 -0.41912401\r\nvn  0.51076901  0.29633299 -0.80703300\r\nvn  0.19027400 -0.07194430 -0.97909099\r\nvn -0.18163200 -0.42093700 -0.88871902\r\nvn -0.50464898 -0.65715599 -0.55988902\r\nvn -0.69204998 -0.71727800 -0.08111150\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70696700 -0.57235801  0.41545600\r\nvn -0.45879900 -0.35551801  0.81431597\r\nvn -0.08772960 -0.04320660  0.99520701\r\nvn  0.30702201  0.28084099  0.90932202\r\nvn  0.61945701  0.52952802  0.57954597\r\nvn  0.76573801  0.63615799  0.09459000\r\nvn  0.70690399  0.57242602 -0.41547000\r\nvn  0.45875299  0.35556599 -0.81432098\r\nvn  0.08743840  0.04354390 -0.99521798\r\nvn -0.30757701 -0.28017399 -0.90934002\r\nvn -0.62001801 -0.52883297 -0.57958001\r\nvn -0.76605397 -0.63577300 -0.09462540\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.71393102 -0.56445003  0.41436699\r\nvn -0.41231301 -0.41916701  0.80888599\r\nvn -0.00016010 -0.16148500  0.98687500\r\nvn  0.41219500  0.13959700  0.90033799\r\nvn  0.71401602  0.40323400  0.57234901\r\nvn  0.82436001  0.55868900  0.09109060\r\nvn  0.71392602  0.56445003 -0.41437399\r\nvn  0.41236001  0.41908699 -0.80890399\r\nvn  0.00016632  0.16145900 -0.98687899\r\nvn -0.41227800 -0.13947999 -0.90031803\r\nvn -0.71414900 -0.40303299 -0.57232499\r\nvn -0.82445502 -0.55855000 -0.09108100\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.71644801 -0.56178200  0.41364601\r\nvn -0.37059599 -0.48664299  0.79109901\r\nvn  0.07466470 -0.28112000  0.95676398\r\nvn  0.50007099 -0.00013946  0.86598498\r\nvn  0.79136503  0.28090799  0.54298401\r\nvn  0.87045598  0.48656401  0.07457500\r\nvn  0.71645600  0.56176400 -0.41365701\r\nvn  0.37070301  0.48644301 -0.79117101\r\nvn -0.07446010  0.28075400 -0.95688701\r\nvn -0.49986801 -0.00020429 -0.86610198\r\nvn -0.79126799 -0.28106499 -0.54304498\r\nvn -0.87045699 -0.48656300 -0.07457910\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.71580601 -0.56446999  0.41109100\r\nvn -0.33324400 -0.55878699  0.75941098\r\nvn  0.13876200 -0.40347099  0.90441000\r\nvn  0.57374102 -0.13989000  0.80700201\r\nvn  0.85483402  0.16127400  0.49320301\r\nvn  0.90670699  0.41909799  0.04733120\r\nvn  0.71582103  0.56442899 -0.41112101\r\nvn  0.33341399  0.55839902 -0.75962198\r\nvn -0.13838600  0.40267000 -0.90482402\r\nvn -0.57331997  0.13903700 -0.80744898\r\nvn -0.85458702 -0.16176800 -0.49347001\r\nvn -0.90666002 -0.41919199 -0.04738560\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.71324301 -0.57244998  0.40445700\r\nvn -0.30090499 -0.63627398  0.71036100\r\nvn  0.19226401 -0.52979398  0.82604700\r\nvn  0.63409501 -0.28116500  0.72032601\r\nvn  0.90582299  0.04297720  0.42147100\r\nvn  0.93464500  0.35544801  0.00976925\r\nvn  0.71327901  0.57233799 -0.40455201\r\nvn  0.30113801  0.63559097 -0.71087301\r\nvn -0.19174600  0.52839202 -0.82706398\r\nvn -0.63349998  0.27964699 -0.72144002\r\nvn -0.90546000 -0.04389850 -0.42215601\r\nvn -0.93455398 -0.35568199 -0.00994245\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70994300 -0.58545101  0.39144200\r\nvn -0.27553400 -0.71819001  0.63897097\r\nvn  0.23297000 -0.65879202  0.71534503\r\nvn  0.67927498 -0.42264199  0.59996599\r\nvn  0.94332403 -0.07299990  0.32374501\r\nvn  0.95439202  0.29597899 -0.03914360\r\nvn  0.71003997  0.58512503 -0.39175501\r\nvn  0.27582201  0.71701699 -0.64016402\r\nvn -0.23239399  0.65654802 -0.71759200\r\nvn -0.67862898  0.42025101 -0.60237199\r\nvn -0.94293302  0.07151360 -0.32521299\r\nvn -0.95425701 -0.29647100  0.03871100\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70699799 -0.60283399  0.36978999\r\nvn -0.26035899 -0.80023098  0.54022598\r\nvn  0.25637501 -0.78364003  0.56584400\r\nvn  0.70468801 -0.55681700  0.43973801\r\nvn  0.96389002 -0.18052800  0.19576800\r\nvn  0.96459597  0.24377500 -0.10064100\r\nvn  0.70719898  0.60204500 -0.37069201\r\nvn  0.26062700  0.79839200 -0.54281199\r\nvn -0.25602800  0.78049099 -0.57033700\r\nvn -0.70438403  0.55355501 -0.44431999\r\nvn -0.96372902  0.17841201 -0.19848301\r\nvn -0.96445400 -0.24472600  0.09969210\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70521599 -0.62346399  0.33758399\r\nvn -0.25881201 -0.87348998  0.41234800\r\nvn  0.25730801 -0.89000899  0.37639901\r\nvn  0.70477402 -0.66781700  0.23940501\r\nvn  0.96307403 -0.26651099  0.03821660\r\nvn  0.96313798  0.20565400 -0.17341501\r\nvn  0.70549601  0.62194800 -0.33978701\r\nvn  0.25887001  0.87114501 -0.41724399\r\nvn -0.25773701  0.88668001 -0.38388801\r\nvn -0.70553797  0.66445798 -0.24639501\r\nvn -0.96359801  0.26400200 -0.04220920\r\nvn -0.96311003 -0.20728999  0.17160800\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70481700 -0.64582199  0.29350701\r\nvn -0.27185500 -0.92639798  0.26054099\r\nvn  0.23428400 -0.95933402  0.15744600\r\nvn  0.67787200 -0.73508400  0.01186990\r\nvn  0.93949801 -0.31391999 -0.13710400\r\nvn  0.94927597  0.19065601 -0.25005201\r\nvn  0.70497102  0.64362299 -0.29793501\r\nvn  0.27142099  0.92426097 -0.26846200\r\nvn -0.23584500  0.95729399 -0.16722900\r\nvn -0.68006402  0.73289698 -0.01938190\r\nvn -0.94089800  0.31144699  0.13308500\r\nvn -0.94952101 -0.19304299  0.24727400\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70538598 -0.66814202  0.23667900\r\nvn -0.29551899 -0.95040202  0.09697900\r\nvn  0.19378600 -0.97861999 -0.06892680\r\nvn  0.63126099 -0.74466503 -0.21675800\r\nvn  0.89927202 -0.31145301 -0.30709299\r\nvn  0.92624801  0.20461400 -0.31654200\r\nvn  0.70513099  0.66591901 -0.24360099\r\nvn  0.29450899  0.94961703 -0.10720200\r\nvn -0.19593400  0.97880203  0.05962960\r\nvn -0.63386500  0.74374998  0.21225201\r\nvn -0.90084702  0.30881399  0.30513701\r\nvn -0.92673600 -0.20764799  0.31311899\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70631599 -0.68798798  0.16670500\r\nvn -0.32191399 -0.94455898 -0.06464820\r\nvn  0.14891399 -0.94875598 -0.27872500\r\nvn  0.57980603 -0.69898802 -0.41861799\r\nvn  0.85504299 -0.26226100 -0.44734800\r\nvn  0.90109497  0.24454500 -0.35808700\r\nvn  0.70568401  0.68654698 -0.17511199\r\nvn  0.32077700  0.94558799  0.05444840\r\nvn -0.15058701  0.95029998  0.27249601\r\nvn -0.58145100  0.69776702  0.41837201\r\nvn -0.85599899  0.25857899  0.44766399\r\nvn -0.90166402 -0.24802500  0.35424000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70700699 -0.70206302  0.08514200\r\nvn -0.34335500 -0.91438001 -0.21451600\r\nvn  0.11239500 -0.88252199 -0.45664299\r\nvn  0.53793502 -0.61459500 -0.57697397\r\nvn  0.81912202 -0.18222401 -0.54390597\r\nvn  0.88082600  0.29922000 -0.36689699\r\nvn  0.70658702  0.70149499 -0.09295040\r\nvn  0.34287500  0.91632402  0.20685001\r\nvn -0.11299300  0.88376302  0.45408800\r\nvn -0.53845298  0.61204100  0.57920098\r\nvn -0.81948203  0.17748301  0.54493099\r\nvn -0.88122201 -0.30276099  0.36301899\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70706701 -0.70713800 -0.00353704\r\nvn -0.35605499 -0.86747700 -0.34742999\r\nvn  0.09040530 -0.79624099 -0.59818703\r\nvn  0.51256698 -0.51210701 -0.68921798\r\nvn  0.79732102 -0.09086940 -0.59667599\r\nvn  0.86859399  0.35516399 -0.34554800\r\nvn  0.70735300  0.70685703 -0.00224634\r\nvn  0.35654700  0.86900198  0.34308800\r\nvn -0.09005650  0.79622000  0.59826702\r\nvn -0.51246101  0.50853097  0.69193900\r\nvn -0.79735899  0.08587290  0.59736401\r\nvn -0.86858600 -0.35845199  0.34215501\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70620602 -0.70192599 -0.09259350\r\nvn -0.36014599 -0.81110698 -0.46086901\r\nvn  0.08246220 -0.70377702 -0.70561898\r\nvn  0.50299400 -0.40834200 -0.76174402\r\nvn  0.78887397 -0.00358910 -0.61454499\r\nvn  0.86371499  0.40247199 -0.30333599\r\nvn  0.70746100  0.70107502  0.08940790\r\nvn  0.36164299  0.81120700  0.45951799\r\nvn -0.08129540  0.70220703  0.70731598\r\nvn -0.50233299  0.40415201  0.76441002\r\nvn -0.78841001 -0.00128715  0.61514902\r\nvn -0.86298001 -0.40569100  0.30113199\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70488799 -0.68733501 -0.17522600\r\nvn -0.35857099 -0.75138998 -0.55393100\r\nvn  0.08390300 -0.61483997 -0.78417599\r\nvn  0.50401098 -0.31400201 -0.80459702\r\nvn  0.78933001  0.07081670 -0.60987198\r\nvn  0.86357802  0.43677500 -0.25191200\r\nvn  0.70678300  0.68568099  0.17406701\r\nvn  0.36061600  0.75009000  0.55436498\r\nvn -0.08230640  0.61221200  0.78639799\r\nvn -0.50297302  0.30974001  0.80689502\r\nvn -0.78841400 -0.07530040  0.61051899\r\nvn -0.86224902 -0.43997899  0.25088701\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70380300 -0.66628897 -0.24641401\r\nvn -0.35471401 -0.69338697 -0.62721002\r\nvn  0.08954090 -0.53531802 -0.83989102\r\nvn  0.50998801 -0.23425500 -0.82766902\r\nvn  0.79410899  0.12933500 -0.59385401\r\nvn  0.86588198  0.45816201 -0.20083500\r\nvn  0.70596498  0.66395801  0.24652401\r\nvn  0.35692999  0.69111699  0.62845701\r\nvn -0.08775990  0.53217101  0.84207600\r\nvn -0.50867498  0.23019999  0.82961297\r\nvn -0.79283601 -0.13339899  0.59465599\r\nvn -0.86419398 -0.46138000  0.20073999\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70377803 -0.64222503 -0.30371699\r\nvn -0.35147300 -0.64064598 -0.68267101\r\nvn  0.09515350 -0.46792400 -0.87863201\r\nvn  0.51648998 -0.17023000 -0.83920199\r\nvn  0.79974902  0.17278300 -0.57493198\r\nvn  0.86909199  0.46926099 -0.15643901\r\nvn  0.70583302  0.63964599  0.30438799\r\nvn  0.35352901  0.63803798  0.68405002\r\nvn -0.09343840  0.46481299  0.88046497\r\nvn -0.51510698  0.16666099  0.84076703\r\nvn -0.79835999 -0.17630500  0.57579303\r\nvn -0.86737102 -0.47229600  0.15685900\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70524102 -0.61825502 -0.34698001\r\nvn -0.35051799 -0.59521198 -0.72309101\r\nvn  0.09827100 -0.41308999 -0.90537202\r\nvn  0.52091902 -0.12063300 -0.84503901\r\nvn  0.80424899  0.20385601 -0.55823499\r\nvn  0.87237501  0.47345001 -0.12168600\r\nvn  0.70696700  0.61584198  0.34775901\r\nvn  0.35222900  0.59276199  0.72426999\r\nvn -0.09678640  0.41038200  0.90676302\r\nvn -0.51964301  0.11770800  0.84623599\r\nvn -0.80295700 -0.20673899  0.55903500\r\nvn -0.87085998 -0.47607899  0.12227900\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70808297 -0.59673500 -0.37752500\r\nvn -0.35230699 -0.55789602 -0.75142002\r\nvn  0.09800640 -0.36989301 -0.92389101\r\nvn  0.52222401 -0.08307470 -0.84875202\r\nvn  0.80671901  0.22573100 -0.54612303\r\nvn  0.87527800  0.47378701 -0.09702450\r\nvn  0.70948601  0.59459698  0.37826499\r\nvn  0.35370001  0.55573797  0.75236398\r\nvn -0.09674420  0.36762100  0.92492998\r\nvn -0.52108198  0.08071070  0.84968197\r\nvn -0.80556703 -0.22807300  0.54684901\r\nvn -0.87399697 -0.47601801  0.09765720\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.71198201 -0.57896399 -0.39734399\r\nvn -0.35670400 -0.52847898 -0.77037197\r\nvn  0.09425560 -0.33660701 -0.93691599\r\nvn  0.52007598 -0.05475370 -0.85236299\r\nvn  0.80668199  0.24156401 -0.53936201\r\nvn  0.87728900  0.47294900 -0.08175000\r\nvn  0.71295500  0.57739502  0.39788201\r\nvn  0.35767901  0.52689898  0.77100098\r\nvn -0.09334650  0.33499300  0.93758500\r\nvn -0.51923400  0.05311550  0.85298002\r\nvn -0.80584198 -0.24319100  0.53988701\r\nvn -0.87638301 -0.47454199  0.08223550\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.71597803 -0.56588000 -0.40884599\r\nvn -0.36258599 -0.50639898 -0.78236300\r\nvn  0.08803200 -0.31136701 -0.94620401\r\nvn  0.51513898 -0.03304360 -0.85646999\r\nvn  0.80430299  0.25399101 -0.53720200\r\nvn  0.87804902  0.47282401 -0.07393730\r\nvn  0.71661103  0.56481999  0.40920299\r\nvn  0.36322701  0.50532800  0.78275800\r\nvn -0.08741850  0.31029201  0.94661301\r\nvn -0.51456100  0.03197430  0.85685700\r\nvn -0.80373299 -0.25505000  0.53755301\r\nvn -0.87745202 -0.47387800  0.07427290\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.71913397 -0.55782700 -0.41433799\r\nvn -0.36875901 -0.49075201 -0.78941703\r\nvn  0.08046200 -0.29224700 -0.95295203\r\nvn  0.50816298 -0.01550470 -0.86112201\r\nvn  0.79974502  0.26531601 -0.53852999\r\nvn  0.87708497  0.47496599 -0.07161340\r\nvn  0.71945798  0.55727297  0.41452101\r\nvn  0.36909100  0.49018800  0.78961200\r\nvn -0.08013930  0.29168800  0.95314997\r\nvn -0.50785798  0.01496150  0.86131102\r\nvn -0.79944903 -0.26584899  0.53870797\r\nvn -0.87677902 -0.47550499  0.07178800\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.72043997 -0.55492800 -0.41595799\r\nvn -0.37391201 -0.48058701 -0.79323798\r\nvn  0.07279970 -0.27746299 -0.95797402\r\nvn  0.50000101  0.00001597 -0.86602497\r\nvn  0.79322600  0.27749199 -0.54202503\r\nvn  0.87390900  0.48060799 -0.07278940\r\nvn  0.72043300  0.55494201  0.41595101\r\nvn  0.37391600  0.48058501  0.79323697\r\nvn -0.07279920  0.27746600  0.95797300\r\nvn -0.50001502  0.00000917  0.86601698\r\nvn -0.79325098 -0.27745000  0.54201001\r\nvn -0.87393099 -0.48057100  0.07277480\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.71869099 -0.55727500 -0.41584599\r\nvn -0.37648499 -0.47496000 -0.79540700\r\nvn  0.06654860 -0.26529801 -0.96186697\r\nvn  0.49170199  0.01553130 -0.87062502\r\nvn  0.78506303  0.29227301 -0.54612499\r\nvn  0.86803102  0.49076399 -0.07531210\r\nvn  0.71837598  0.55782098  0.41565901\r\nvn  0.37619001  0.47548401  0.79523301\r\nvn -0.06684620  0.26582500  0.96170098\r\nvn -0.49202299 -0.01497960  0.87045300\r\nvn -0.78540498 -0.29169899  0.54593998\r\nvn -0.86837101 -0.49019301  0.07512050\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.71266800 -0.56479698 -0.41606301\r\nvn -0.37495100 -0.47279200 -0.79742098\r\nvn  0.06312610 -0.25394601 -0.96515602\r\nvn  0.48418799  0.03309850 -0.87433797\r\nvn  0.77542901  0.31142101 -0.54929698\r\nvn  0.85882097  0.50643700 -0.07711940\r\nvn  0.71202099  0.56589299  0.41568199\r\nvn  0.37434900  0.47387001  0.79706401\r\nvn -0.06373060  0.25503299  0.96482998\r\nvn -0.48484001 -0.03198300  0.87401801\r\nvn -0.77612698 -0.31028599  0.54895300\r\nvn -0.85951698 -0.50531203  0.07674530\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.70099902 -0.57737499 -0.41861501\r\nvn -0.36774701 -0.47290501 -0.80070198\r\nvn  0.06387050 -0.24149400 -0.96829802\r\nvn  0.47821400  0.05484090 -0.87652898\r\nvn  0.76429898  0.33669001 -0.54998797\r\nvn  0.84549201  0.52853101 -0.07615140\r\nvn  0.70003200  0.57896698  0.41803300\r\nvn  0.36687300  0.47450101  0.80015802\r\nvn -0.06474800  0.24312900  0.96783102\r\nvn -0.47918901 -0.05317020  0.87610000\r\nvn -0.76536697 -0.33502200  0.54952002\r\nvn -0.84655601 -0.52690297  0.07560800\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.68224901 -0.59454697 -0.42549899\r\nvn -0.35345599 -0.47369599 -0.80664802\r\nvn  0.06977150 -0.22560100 -0.97171801\r\nvn  0.47406101  0.08322630 -0.87655002\r\nvn  0.75116003  0.37003201 -0.54665798\r\nvn  0.82686102  0.55798203 -0.07040460\r\nvn  0.68087000  0.59674102  0.42463699\r\nvn  0.35225600  0.47594801  0.80584699\r\nvn -0.07099010  0.22796801  0.97107702\r\nvn -0.47547799 -0.08080240  0.87600899\r\nvn -0.75275701 -0.36766601  0.54605800\r\nvn -0.82843900 -0.55573201  0.06964270\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.65452200 -0.61576301 -0.43867701\r\nvn -0.33056000 -0.47330400 -0.81652498\r\nvn  0.08158960 -0.20365199 -0.97563797\r\nvn  0.47156599  0.12086600 -0.87350798\r\nvn  0.73501402  0.41329601 -0.53753197\r\nvn  0.80141002  0.59532797 -0.05767670\r\nvn  0.65293598  0.61824399  0.43755001\r\nvn  0.32928199  0.47595000  0.81550300\r\nvn -0.08293830  0.20655300  0.97491401\r\nvn -0.47329500 -0.11786800  0.87298298\r\nvn -0.73705602 -0.41046301  0.53690600\r\nvn -0.80338001 -0.59275597  0.05674780\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.61633700 -0.63955402 -0.45945501\r\nvn -0.29874000 -0.46907800 -0.83109599\r\nvn  0.09837460 -0.17252199 -0.98008102\r\nvn  0.46877101  0.17052400 -0.86670399\r\nvn  0.71342599  0.46817300 -0.52138001\r\nvn  0.76686502  0.64076698 -0.03654620\r\nvn  0.61470097  0.64216900  0.45799801\r\nvn  0.29754400  0.47208199  0.82982302\r\nvn -0.09979840  0.17602199  0.97931403\r\nvn -0.47086900 -0.16690101  0.86627102\r\nvn -0.71597898 -0.46494001  0.52077401\r\nvn -0.76918399 -0.63804603  0.03541990\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.56636697 -0.66374898 -0.48853400\r\nvn -0.25874701 -0.45787501 -0.85053003\r\nvn  0.11751300 -0.12897301 -0.98466098\r\nvn  0.46195000  0.23464300 -0.85530400\r\nvn  0.68259102  0.53564298 -0.49714801\r\nvn  0.72037703  0.69355601 -0.00601100\r\nvn  0.56502998  0.66625899  0.48666200\r\nvn  0.25790301  0.46119100  0.84899300\r\nvn -0.11896700  0.13316999  0.98392701\r\nvn -0.46453601 -0.23033600  0.85507399\r\nvn -0.68570399 -0.53215802  0.49660599\r\nvn -0.72285098 -0.69098902  0.00462898\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.50391603 -0.68540502 -0.52563202\r\nvn -0.21319400 -0.43637100 -0.87414497\r\nvn  0.13390800 -0.07029790 -0.98849702\r\nvn  0.44501299  0.31454599 -0.83846599\r\nvn  0.63714099  0.61526400 -0.46422201\r\nvn  0.65877998  0.75155902  0.03416920\r\nvn  0.50384402  0.68719399  0.52336001\r\nvn  0.21341600  0.43960801  0.87246698\r\nvn -0.13503300  0.07489520  0.98800600\r\nvn -0.44786799 -0.30997500  0.83864701\r\nvn -0.64034402 -0.61221403  0.46384600\r\nvn -0.66054797 -0.74992901 -0.03581720\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.43087000 -0.70067900 -0.56868303\r\nvn -0.16862001 -0.40190601 -0.90002102\r\nvn  0.13823999  0.00429040 -0.99039000\r\nvn  0.40838701  0.40904400 -0.81602800\r\nvn  0.56975502  0.70428300 -0.42351499\r\nvn  0.57889801  0.81124097  0.08225450\r\nvn  0.43289599  0.70162702  0.56596798\r\nvn  0.17024200  0.40508401  0.89828998\r\nvn -0.13911401  0.00066451  0.99027598\r\nvn -0.41154900 -0.40449399  0.81670803\r\nvn -0.57253498 -0.70219499  0.42323300\r\nvn -0.57898402 -0.81096703 -0.08432030\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.35166800 -0.70632201 -0.61435997\r\nvn -0.13471200 -0.35449699 -0.92530203\r\nvn  0.11828400  0.09164280 -0.98874199\r\nvn  0.34051299  0.51284897 -0.78805900\r\nvn  0.47251800  0.79675299 -0.37671199\r\nvn  0.47849900  0.86759001  0.13537300\r\nvn  0.35620499  0.70681101  0.61117601\r\nvn  0.13753800  0.35785499  0.92359298\r\nvn -0.11938200 -0.08638060  0.98908401\r\nvn -0.34413001 -0.50862902  0.78922200\r\nvn -0.47421801 -0.79592800  0.37631801\r\nvn -0.47597200 -0.86855501 -0.13807200\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.27280799 -0.70096999 -0.65895098\r\nvn -0.12244400 -0.29857001 -0.94650102\r\nvn  0.06148250  0.18296100 -0.98119599\r\nvn  0.23038501  0.61527401 -0.75389600\r\nvn  0.33877501  0.88295102 -0.32500699\r\nvn  0.35702699  0.91440398  0.19078000\r\nvn  0.27950701  0.70166600  0.65539300\r\nvn  0.12592600  0.30213699  0.94491100\r\nvn -0.06302370 -0.17794199  0.98202097\r\nvn -0.23399000 -0.61201000  0.75544202\r\nvn -0.33843899 -0.88336301  0.32423499\r\nvn -0.35141200 -0.91585398 -0.19421799\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.20143101 -0.68611300 -0.69905198\r\nvn -0.14045700 -0.24403100 -0.95954198\r\nvn -0.04041670  0.26280901 -0.96400100\r\nvn  0.07200230  0.69946200 -0.71103400\r\nvn  0.16623800  0.94902599 -0.26779500\r\nvn  0.21649000  0.94452697  0.24698301\r\nvn  0.20862700  0.68765098  0.69542199\r\nvn  0.14378899  0.24754100  0.95814800\r\nvn  0.03913080 -0.25889501  0.96511298\r\nvn -0.07403030 -0.69766498  0.71258903\r\nvn -0.16320799 -0.94994098  0.26641300\r\nvn -0.20882200 -0.94520402 -0.25096399\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.14192601 -0.66565299 -0.73264098\r\nvn -0.18916100 -0.20428699 -0.96046102\r\nvn -0.18421599  0.31174299 -0.93213803\r\nvn -0.12875900  0.74485701 -0.65468198\r\nvn -0.03801880  0.97868001 -0.20184100\r\nvn  0.06331540  0.95030999  0.30479899\r\nvn  0.14763799  0.66789699  0.72946298\r\nvn  0.19191600  0.20729600  0.95926899\r\nvn  0.18462400 -0.30916101  0.93291700\r\nvn  0.12996900 -0.74396998  0.65545201\r\nvn  0.04323000 -0.97888100  0.19980700\r\nvn -0.05591150 -0.94951600 -0.30869699\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.09477520 -0.64346403 -0.75958699\r\nvn -0.25829399 -0.19044100 -0.94711000\r\nvn -0.35160601  0.31400299 -0.88191599\r\nvn -0.35011801  0.73501301 -0.58066702\r\nvn -0.25433099  0.95917398 -0.12369400\r\nvn -0.09012960  0.92621702  0.36605901\r\nvn  0.09820970  0.64561498  0.75732201\r\nvn  0.26039401  0.19271199  0.94607502\r\nvn  0.35370100 -0.31203499  0.88177699\r\nvn  0.35375401 -0.73373199  0.58008200\r\nvn  0.25976500 -0.95801699  0.12135200\r\nvn  0.09536180 -0.92447901 -0.36911300\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.05875210 -0.62189698 -0.78089201\r\nvn -0.33158001 -0.20556501 -0.92075902\r\nvn -0.51514202  0.26639500 -0.81465501\r\nvn -0.56048203  0.66751200 -0.49019200\r\nvn -0.45532301  0.88967001 -0.03417300\r\nvn -0.22803301  0.87324798  0.43062499\r\nvn  0.06026490  0.62330502  0.77965301\r\nvn  0.33279499  0.20701300  0.91999602\r\nvn  0.51727700 -0.26468301  0.81386000\r\nvn  0.56399399 -0.66560298  0.48875701\r\nvn  0.45919999 -0.88775301  0.03210000\r\nvn  0.23083401 -0.87157500 -0.43252000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.03271750 -0.60207200 -0.79777098\r\nvn -0.39526299 -0.24381401 -0.88561898\r\nvn -0.65180999  0.18027800 -0.73664403\r\nvn -0.73365402  0.55641299 -0.39007100\r\nvn -0.61866301  0.78326797  0.06121750\r\nvn -0.33787599  0.80002099  0.49578801\r\nvn  0.03325070  0.60274601  0.79724002\r\nvn  0.39577401  0.24454001  0.88519102\r\nvn  0.65312898 -0.17896400  0.73579502\r\nvn  0.73586398 -0.55450600  0.38862199\r\nvn  0.62088102 -0.78138697 -0.06277720\r\nvn  0.33922800 -0.79878801 -0.49685201\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.01580120 -0.58514899 -0.81077200\r\nvn -0.44336501 -0.29605600 -0.84603697\r\nvn -0.75221300  0.07274250 -0.65489203\r\nvn -0.85948300  0.42227799 -0.28804401\r\nvn -0.73621702  0.65849102  0.15612200\r\nvn -0.41569400  0.71805203  0.55821103\r\nvn  0.01597510  0.58541399  0.81057698\r\nvn  0.44352400  0.29633200  0.84585702\r\nvn  0.75278401 -0.07193910  0.65432400\r\nvn  0.86048597 -0.42091501  0.28704599\r\nvn  0.73722601 -0.65712398 -0.15711500\r\nvn  0.41628799 -0.71725798 -0.55878901\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.00631017 -0.57235700 -0.81998003\r\nvn -0.47581899 -0.35551801 -0.80448902\r\nvn -0.81801200 -0.04320510 -0.57357699\r\nvn -0.94100702  0.28084201 -0.18876800\r\nvn -0.81163001  0.52952701  0.24669500\r\nvn -0.46478701  0.63615900  0.61585301\r\nvn  0.00635508  0.57242900  0.81992900\r\nvn  0.47584701  0.35556901  0.80444998\r\nvn  0.81816697  0.04354190  0.57332999\r\nvn  0.94129902 -0.28017899  0.18829800\r\nvn  0.81193900 -0.52883500 -0.24716200\r\nvn  0.46497700 -0.63577300 -0.61610800\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.00188561 -0.56445098 -0.82546401\r\nvn -0.49435601 -0.41916400 -0.76152003\r\nvn -0.85457700 -0.16148600 -0.49358001\r\nvn -0.98581398  0.13958800 -0.09319620\r\nvn -0.85268098  0.40322101  0.33218700\r\nvn -0.49107099  0.55867898  0.66837603\r\nvn  0.00189244  0.56444800  0.82546598\r\nvn  0.49434900  0.41909301  0.76156402\r\nvn  0.85457802  0.16146500  0.49358401\r\nvn  0.98583603 -0.13948300  0.09312200\r\nvn  0.85272098 -0.40304399 -0.33229801\r\nvn  0.49110600 -0.55856001 -0.66845000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn -0.00000296 -0.56178302 -0.82728499\r\nvn -0.49981099 -0.48664701 -0.71649402\r\nvn -0.86591101 -0.28112599 -0.41372201\r\nvn -1.00000000 -0.00014545  0.00007918\r\nvn -0.86592299  0.28090400  0.41384801\r\nvn -0.49981400  0.48656201  0.71654898\r\nvn  0.00000771  0.56176102  0.82729900\r\nvn  0.49982101  0.48644000  0.71662802\r\nvn  0.86591601  0.28075400  0.41396400\r\nvn  1.00000000 -0.00020000  0.00015706\r\nvn  0.86592698 -0.28105900 -0.41373500\r\nvn  0.49981701 -0.48655999 -0.71654898\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00189050 -0.56446999 -0.82545102\r\nvn -0.49104401 -0.55879599 -0.66829801\r\nvn -0.85262001 -0.40348199 -0.33202800\r\nvn -0.98575300 -0.13989601  0.09337690\r\nvn -0.85454398  0.16127500  0.49370599\r\nvn -0.49434599  0.41909999  0.76156199\r\nvn -0.00187164  0.56442899  0.82547998\r\nvn  0.49114400  0.55839401  0.66856098\r\nvn  0.85279399  0.40266401  0.33257201\r\nvn  0.98593098  0.13903700 -0.09278460\r\nvn  0.85465002 -0.16176200 -0.49336201\r\nvn  0.49436799 -0.41918600 -0.76150101\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00635098 -0.57244903 -0.81991601\r\nvn -0.46473899 -0.63627398 -0.61576998\r\nvn -0.81151003 -0.52979499 -0.24651401\r\nvn -0.94086701 -0.28116599  0.18898401\r\nvn -0.81791300  0.04297640  0.57373399\r\nvn -0.47578201  0.35544801  0.80454302\r\nvn -0.00628844  0.57234001  0.81999201\r\nvn  0.46506199  0.63559699  0.61622500\r\nvn  0.81212902  0.52839798  0.24747001\r\nvn  0.94153303  0.27965000 -0.18791300\r\nvn  0.81832498 -0.04389670 -0.57307702\r\nvn  0.47588500 -0.35567999 -0.80437797\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.01597280 -0.58544898 -0.81055200\r\nvn -0.41560200 -0.71818399 -0.55811000\r\nvn -0.73599601 -0.65878499 -0.15592000\r\nvn -0.85922599 -0.42263800  0.28828299\r\nvn -0.75203300 -0.07300160  0.65507102\r\nvn -0.44329500  0.29597500  0.84610200\r\nvn -0.01575450  0.58512598  0.81079000\r\nvn  0.41647601  0.71702999  0.55894202\r\nvn  0.73763299  0.65657002  0.15752199\r\nvn  0.86097097  0.42026800 -0.28653699\r\nvn  0.75310498  0.07152030 -0.65400201\r\nvn  0.44360399 -0.29646999 -0.84576601\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.03325370 -0.60284197 -0.79716802\r\nvn -0.33766401 -0.80023801 -0.49558201\r\nvn -0.61821699 -0.78364497 -0.06089040\r\nvn -0.73316503 -0.55681998  0.39041001\r\nvn -0.65148401 -0.18053000  0.73686999\r\nvn -0.39513701  0.24377400  0.88568699\r\nvn -0.03256130  0.60204101  0.79780102\r\nvn  0.33978999  0.79838300  0.49711901\r\nvn  0.62194800  0.78048402  0.06344470\r\nvn  0.73698002  0.55356002 -0.38785601\r\nvn  0.65374601  0.17841899 -0.73537898\r\nvn  0.39588600 -0.24472700 -0.88508898\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.06024040 -0.62347400 -0.77951998\r\nvn -0.22769400 -0.87350202 -0.43029001\r\nvn -0.45461199 -0.89001501  0.03466500\r\nvn -0.55970597 -0.66781002  0.49067301\r\nvn -0.51462901 -0.26649201  0.81494701\r\nvn -0.33138901  0.20567600  0.92080301\r\nvn -0.05848270  0.62196600  0.78085703\r\nvn  0.23192100  0.87115002  0.43279400\r\nvn  0.46134499  0.88666898 -0.03127530\r\nvn  0.56616098  0.66444403 -0.48782799\r\nvn  0.51833802  0.26399401 -0.81340802\r\nvn  0.33291599 -0.20729700 -0.91988897\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.09822580 -0.64579302 -0.75716799\r\nvn -0.08971720 -0.92638302 -0.36574000\r\nvn -0.25350699 -0.95933503  0.12413900\r\nvn -0.34922299 -0.73509800  0.58109701\r\nvn -0.35101300 -0.31394199  0.88217402\r\nvn -0.25809401  0.19063200  0.94712597\r\nvn -0.09451880  0.64360899  0.75949597\r\nvn  0.09665590  0.92427599  0.36928400\r\nvn  0.26258901  0.95733500 -0.12065100\r\nvn  0.35672900  0.73293298 -0.57927001\r\nvn  0.35518301  0.31147701 -0.88137800\r\nvn  0.26062500 -0.19300900 -0.94594997\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.14774901 -0.66808999 -0.72926402\r\nvn  0.06377170 -0.95037901 -0.30448800\r\nvn -0.03721590 -0.97863501  0.20220800\r\nvn -0.12791701 -0.74471700  0.65500700\r\nvn -0.18366399 -0.31152800  0.93231899\r\nvn -0.18894701  0.20453499  0.96044999\r\nvn -0.14156400  0.66585898  0.73252398\r\nvn -0.05443230  0.94959301  0.30872399\r\nvn  0.04621490  0.97881800 -0.19944900\r\nvn  0.13300700  0.74379802 -0.65503800\r\nvn  0.18615100  0.30888101 -0.93270600\r\nvn  0.19223399 -0.20758100 -0.95914400\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.20877500 -0.68801898 -0.69501299\r\nvn  0.21694200 -0.94456899 -0.24642500\r\nvn  0.16692300 -0.94874698  0.26835901\r\nvn  0.07262200 -0.69896698  0.71145701\r\nvn -0.04012170 -0.26223701  0.96416903\r\nvn -0.14045000  0.24456701  0.95940602\r\nvn -0.20119999  0.68656498  0.69867498\r\nvn -0.20755500  0.94559401  0.25054601\r\nvn -0.16074800  0.95028001 -0.26669699\r\nvn -0.07169760  0.69772100 -0.71277303\r\nvn  0.04022300  0.25852299 -0.96516699\r\nvn  0.14401200 -0.24807300 -0.95797700\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.27978799 -0.70210397 -0.65480500\r\nvn  0.35747999 -0.91438401 -0.19002900\r\nvn  0.33928400 -0.88249099  0.32572401\r\nvn  0.23070300 -0.61453903  0.75439900\r\nvn  0.06144650 -0.18215901  0.98134702\r\nvn -0.12271500  0.29927701  0.94624197\r\nvn -0.27283001  0.70153302  0.65834200\r\nvn -0.35056800  0.91634101  0.19344400\r\nvn -0.33670700  0.88375700 -0.32496500\r\nvn -0.23232700  0.61200398 -0.75595999\r\nvn -0.06215800  0.17741901 -0.98216999\r\nvn  0.12624100 -0.30282500 -0.94464803\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.35661799 -0.70714003 -0.61055398\r\nvn  0.47893199 -0.86746901 -0.13461800\r\nvn  0.47286001 -0.79622102  0.37740600\r\nvn  0.34060499 -0.51208103  0.78851801\r\nvn  0.11807300 -0.09084260  0.98884100\r\nvn -0.13505100  0.35518599  0.92498899\r\nvn -0.35173199  0.70687401  0.61368799\r\nvn -0.47538000  0.86901498  0.13720900\r\nvn -0.47305101  0.79623002 -0.37714800\r\nvn -0.34296700  0.50853503 -0.78978801\r\nvn -0.11862500  0.08586610 -0.98921901\r\nvn  0.13800000 -0.35846001 -0.92328900\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.43331900 -0.70191997 -0.56528199\r\nvn  0.57922298 -0.81108999 -0.08144620\r\nvn  0.56987500 -0.70375103  0.42423600\r\nvn  0.40821001 -0.40831199  0.81648397\r\nvn  0.13778900 -0.00355731  0.99045497\r\nvn -0.16914199  0.40250400  0.89965600\r\nvn -0.43113300  0.70110703  0.56795597\r\nvn -0.57874298  0.81123400  0.08340950\r\nvn -0.57187200  0.70222098 -0.42408401\r\nvn -0.41080201  0.40415299 -0.81725299\r\nvn -0.13850200 -0.00129366 -0.99036098\r\nvn  0.17072900 -0.40569499 -0.89792198\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.50419700 -0.68737799 -0.52277797\r\nvn  0.65899199 -0.75140297 -0.03349780\r\nvn  0.63713002 -0.61482900  0.46481201\r\nvn  0.44473401 -0.31398201  0.83882499\r\nvn  0.13341500  0.07083130  0.98852599\r\nvn -0.21371999  0.43676999  0.87381703\r\nvn -0.50422502  0.68564999  0.52501500\r\nvn -0.66047001  0.75003302  0.03506730\r\nvn -0.63993001  0.61213398 -0.46452299\r\nvn -0.44732499  0.30964899 -0.83905798\r\nvn -0.13452099 -0.07538870 -0.98803902\r\nvn  0.21385500 -0.44005001 -0.87213600\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.56534803 -0.66623300 -0.48632699\r\nvn  0.72058600 -0.69333601  0.00638834\r\nvn  0.68265003 -0.53527200  0.49746701\r\nvn  0.46184799 -0.23420900  0.85547799\r\nvn  0.11730400  0.12938800  0.98463100\r\nvn -0.25893900  0.45822701  0.85028100\r\nvn -0.56639701  0.66403502  0.48811001\r\nvn -0.72264200  0.69120300 -0.00512925\r\nvn -0.68530399  0.53225702 -0.49705201\r\nvn -0.46406400  0.23028000 -0.85534501\r\nvn -0.11851600 -0.13332900 -0.98395997\r\nvn  0.25829801 -0.46131799 -0.84880400\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.61497402 -0.64227098 -0.45748699\r\nvn  0.76695198 -0.64063001  0.03710820\r\nvn  0.71328199 -0.46786600  0.52185303\r\nvn  0.46841100 -0.17015700  0.86697102\r\nvn  0.09788900  0.17284900  0.98007202\r\nvn -0.29920000  0.46930200  0.83080399\r\nvn -0.61662000  0.63964403  0.45895001\r\nvn -0.76921099  0.63797897 -0.03600470\r\nvn -0.71577400  0.46469501 -0.52127302\r\nvn -0.47051701  0.16650499 -0.86653900\r\nvn -0.09938810 -0.17645800 -0.97927803\r\nvn  0.29792699 -0.47240499 -0.82950097\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.65314901 -0.61830300 -0.43714800\r\nvn  0.80146301 -0.59521300  0.05812130\r\nvn  0.73487300 -0.41306001  0.53790700\r\nvn  0.47124699 -0.12059500  0.87371802\r\nvn  0.08117230  0.20387800  0.97562498\r\nvn -0.33094901  0.47343999  0.81628901\r\nvn -0.65476000  0.61579603  0.43827501\r\nvn -0.80340201  0.59268200 -0.05720600\r\nvn -0.73688102  0.41027400 -0.53729099\r\nvn -0.47299501  0.11758300 -0.87318403\r\nvn -0.08259560 -0.20685899 -0.97487801\r\nvn  0.32959399 -0.47617099 -0.81524801\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.68095702 -0.59666598 -0.42460200\r\nvn  0.82692897 -0.55787599  0.07044550\r\nvn  0.75120097 -0.36990401  0.54668897\r\nvn  0.47407201 -0.08309470  0.87655598\r\nvn  0.06976300  0.22572100  0.97169101\r\nvn -0.35345799  0.47380301  0.80658501\r\nvn -0.68221599  0.59465098  0.42540801\r\nvn -0.82835799  0.55584002 -0.06974610\r\nvn -0.75263900  0.36776799 -0.54615098\r\nvn -0.47534901  0.08088190 -0.87607098\r\nvn -0.07087120 -0.22791100 -0.97109902\r\nvn  0.35235900 -0.47589499 -0.80583298\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70003200 -0.57898003 -0.41801599\r\nvn  0.84548998 -0.52853101  0.07616680\r\nvn  0.76429600 -0.33668000  0.54999900\r\nvn  0.47820500 -0.05483180  0.87653500\r\nvn  0.06385360  0.24149400  0.96829897\r\nvn -0.36776701  0.47289601  0.80069798\r\nvn -0.70101398  0.57736301  0.41860601\r\nvn -0.84656000  0.52689499 -0.07562000\r\nvn -0.76536101  0.33501899 -0.54953200\r\nvn -0.47917801  0.05316260 -0.87610602\r\nvn -0.06474090 -0.24314401 -0.96782702\r\nvn  0.36687499 -0.47452000 -0.80014598\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.71203399 -0.56588000 -0.41567701\r\nvn  0.85883403 -0.50641501  0.07712310\r\nvn  0.77543998 -0.31139201  0.54929799\r\nvn  0.48419499 -0.03307020  0.87433499\r\nvn  0.06312790  0.25396901  0.96515000\r\nvn -0.37495100  0.47281000  0.79741001\r\nvn -0.71266198  0.56481600  0.41604799\r\nvn -0.85950202  0.50533599 -0.07676250\r\nvn -0.77610397  0.31031299 -0.54896998\r\nvn -0.48481700  0.03200400 -0.87402999\r\nvn -0.06371140 -0.25502101 -0.96483397\r\nvn  0.37436399 -0.47386199 -0.79706103\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.71838701 -0.55783498 -0.41562101\r\nvn  0.86803102 -0.49075899  0.07535070\r\nvn  0.78504801 -0.29225600  0.54615498\r\nvn  0.49167201 -0.01551510  0.87064201\r\nvn  0.06650880  0.26530501  0.96186799\r\nvn -0.37652400  0.47495699  0.79539001\r\nvn -0.71871698  0.55726498  0.41581500\r\nvn -0.86837500  0.49017999 -0.07515580\r\nvn -0.78539097  0.29168099 -0.54597002\r\nvn -0.49199900  0.01495310 -0.87046701\r\nvn -0.06682170 -0.26585799 -0.96169299\r\nvn  0.37620899 -0.47551301 -0.79520702\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.72045702 -0.55492198 -0.41593701\r\nvn  0.87392497 -0.48057801  0.07280500\r\nvn  0.79323202 -0.27745199  0.54203600\r\nvn  0.49999899  0.00002539  0.86602598\r\nvn  0.07279170  0.27749801  0.95796502\r\nvn -0.37391999  0.48061299  0.79321802\r\nvn -0.72044098  0.55494702  0.41593200\r\nvn -0.87391800  0.48058900 -0.07280510\r\nvn -0.79322398  0.27746901 -0.54203898\r\nvn -0.49997899  0.00000917 -0.86603802\r\nvn -0.07276290 -0.27745101 -0.95798099\r\nvn  0.37394699 -0.48056999 -0.79323101\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.71946901 -0.55729598 -0.41447100\r\nvn  0.87707502 -0.47497699  0.07166840\r\nvn  0.79971600 -0.26531401  0.53857499\r\nvn  0.50811899  0.01551590  0.86114699\r\nvn  0.08041200  0.29225600  0.95295298\r\nvn -0.36880800  0.49074599  0.78939801\r\nvn -0.71917301  0.55780101  0.41430500\r\nvn -0.87679899  0.47546300 -0.07182410\r\nvn -0.79944497  0.26580101 -0.53873700\r\nvn -0.50783402 -0.01500610 -0.86132401\r\nvn -0.08010630 -0.29172599 -0.95314199\r\nvn  0.36911899 -0.49021801 -0.78958100\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.71661198 -0.56479901 -0.40923101\r\nvn  0.87805903 -0.47281101  0.07390850\r\nvn  0.80432397 -0.25397900  0.53717601\r\nvn  0.51517099  0.03305850  0.85644901\r\nvn  0.08806870  0.31138399  0.94619399\r\nvn -0.36255300  0.50641799  0.78236598\r\nvn -0.71595502  0.56590098  0.40885699\r\nvn -0.87743902  0.47390500 -0.07425940\r\nvn -0.80372697  0.25508600 -0.53754401\r\nvn -0.51455998 -0.03192990 -0.85685998\r\nvn -0.08742100 -0.31024799 -0.94662797\r\nvn  0.36322400 -0.50529402 -0.78278100\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.71302199 -0.57732701 -0.39785999\r\nvn  0.87732500 -0.47287601  0.08178240\r\nvn  0.80669200 -0.24147800  0.53938502\r\nvn  0.52007002  0.05485020  0.85236001\r\nvn  0.09424450  0.33670101  0.93688297\r\nvn -0.35671100  0.52855498  0.77031600\r\nvn -0.71197802  0.57901597  0.39727601\r\nvn -0.87635702  0.47457701 -0.08230560\r\nvn -0.80578601  0.24322701 -0.53995299\r\nvn -0.51915002 -0.05306460 -0.85303497\r\nvn -0.09324700 -0.33492699 -0.93761897\r\nvn  0.35777101 -0.52683002 -0.77100599\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70965803 -0.59460098 -0.37793499\r\nvn  0.87527901 -0.47370899  0.09739480\r\nvn  0.80655402 -0.22558101  0.54642802\r\nvn  0.52194297  0.08326360  0.84890699\r\nvn  0.09767980  0.37006101  0.92385799\r\nvn -0.35260499  0.55797601  0.75121999\r\nvn -0.70828801  0.59668201  0.37722400\r\nvn -0.87405998  0.47583601 -0.09797450\r\nvn -0.80546802  0.22781800 -0.54710197\r\nvn -0.52083999 -0.08095970 -0.84980702\r\nvn -0.09642680 -0.36780301 -0.92489100\r\nvn  0.35399199 -0.55583000 -0.75215799\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70724899 -0.61571503 -0.34741101\r\nvn  0.87243903 -0.47323000  0.12208400\r\nvn  0.80410397 -0.20355999  0.55855203\r\nvn  0.52063000  0.12096400  0.84517002\r\nvn  0.09792820  0.41338599  0.90527499\r\nvn -0.35082701  0.59538901  0.72279400\r\nvn -0.70543897  0.61826199  0.34656599\r\nvn -0.87088501  0.47592300 -0.12270600\r\nvn -0.80277801  0.20649800 -0.55937999\r\nvn -0.51928002 -0.11792200 -0.84642899\r\nvn -0.09632240 -0.41048899 -0.90676397\r\nvn  0.35266399 -0.59274298 -0.72407401\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70610601 -0.63955098 -0.30395699\r\nvn  0.86912000 -0.46905100  0.15691499\r\nvn  0.79955101 -0.17247701  0.57529998\r\nvn  0.51613897  0.17057601  0.83934802\r\nvn  0.09474260  0.46821699  0.87852001\r\nvn -0.35185000  0.64078701  0.68234402\r\nvn -0.70403397  0.64215398  0.30327401\r\nvn -0.86743498  0.47203001 -0.15730301\r\nvn -0.79819298  0.17594600 -0.57613498\r\nvn -0.51472902 -0.16697900 -0.84093601\r\nvn -0.09294770 -0.46499699 -0.88041902\r\nvn  0.35397899 -0.63807201 -0.68378597\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70626998 -0.66374701 -0.24621700\r\nvn  0.86595798 -0.45786700  0.20118400\r\nvn  0.79398698 -0.12896299  0.59409797\r\nvn  0.50974101  0.23465399  0.82770801\r\nvn  0.08924710  0.53565401  0.83970797\r\nvn -0.35498399  0.69356501  0.62686002\r\nvn -0.70397800  0.66626197  0.24598800\r\nvn -0.86420202  0.46118501 -0.20115501\r\nvn -0.79262203  0.13315500 -0.59499502\r\nvn -0.50824797 -0.23035400 -0.82983202\r\nvn -0.08722080 -0.53217399 -0.84213001\r\nvn  0.35741901 -0.69099498 -0.62831402\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70714402 -0.68541503 -0.17364401\r\nvn  0.86363500 -0.43639299  0.25237900\r\nvn  0.78914601 -0.07032560  0.61016601\r\nvn  0.50368202  0.31452101  0.80460000\r\nvn  0.08352100  0.61524999  0.78389502\r\nvn -0.35892501  0.75156599  0.55346400\r\nvn -0.70512497  0.68722498  0.17470001\r\nvn -0.86227101  0.43965900 -0.25137401\r\nvn -0.78813398  0.07495380 -0.61092299\r\nvn -0.50239301 -0.30992499 -0.80718499\r\nvn -0.08158090 -0.61218601 -0.78649402\r\nvn  0.36124599 -0.74992299 -0.55418199\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.70789200 -0.70071501 -0.08881630\r\nvn  0.86374199 -0.40194401  0.30395800\r\nvn  0.78859699  0.00425480  0.61489499\r\nvn  0.50253803  0.40901500  0.76168400\r\nvn  0.08193240  0.70426500  0.70519400\r\nvn -0.36065200  0.81123799  0.46024299\r\nvn -0.70657301  0.70164102  0.09195230\r\nvn -0.86306202  0.40511200 -0.30167499\r\nvn -0.78807002  0.00069405 -0.61558598\r\nvn -0.50155997 -0.40447801 -0.76474601\r\nvn -0.08032180 -0.70220202 -0.70743299\r\nvn  0.36245900 -0.81099302 -0.45925301\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.00000000  0.00000000  1.00000000\r\nvn  0.26982701 -0.55987799  0.78340900\r\nvn  0.26208401 -0.54633802  0.79550397\r\nvn  0.26208401 -0.54633802  0.79550397\r\nvn  0.26819301 -0.53585100  0.80058497\r\nvn  0.70725900 -0.38268200  0.59442401\r\nvn  0.70725900 -0.38268200  0.59442401\r\nvn  0.70892602 -0.37806001  0.59539402\r\nvn  0.70892602 -0.37806001  0.59539402\r\nvn  0.25922900 -0.53775799  0.80225801\r\nvn  0.26155400 -0.53387803  0.80409199\r\nvn  0.70709902 -0.38800299  0.59115601\r\nvn  0.70709902 -0.38800299  0.59115601\r\nvn  0.70735002 -0.38733599  0.59129202\r\nvn  0.96589297 -0.15046000  0.21074501\r\nvn  0.70681900 -0.39835000  0.58457202\r\nvn  0.70709199 -0.39765200  0.58471698\r\n\r\ng Figure 1\r\nusemtl Preview\r\nf 1/1491/1 14/27/14 15/1/15\r\nf 1/1491/1 15/1/15 2/1483/2\r\nf 2/1483/2 15/1/15 16/16/16\r\nf 2/1483/2 16/16/16 3/1484/3\r\nf 3/1484/3 16/16/16 17/2/17\r\nf 3/1484/3 17/2/17 4/3/4\r\nf 4/3/4 17/2/17 18/5/18\r\nf 4/3/4 18/5/18 5/4/5\r\nf 5/4/5 18/5/18 19/6/19\r\nf 5/4/5 19/6/19 6/7/6\r\nf 6/7/6 19/6/19 20/8/20\r\nf 6/7/6 20/8/20 7/9/7\r\nf 7/9/7 20/8/20 21/19/21\r\nf 7/9/7 21/19/21 8/10/8\r\nf 8/10/8 21/19/21 22/20/22\r\nf 8/10/8 22/20/22 9/11/9\r\nf 9/11/9 22/20/22 23/12/23\r\nf 9/11/9 23/12/23 10/13/10\r\nf 10/13/10 23/12/23 24/24/24\r\nf 10/13/10 24/24/24 11/1489/11\r\nf 11/1489/11 24/24/24 25/25/25\r\nf 11/1489/11 25/25/25 12/14/12\r\nf 12/14/12 25/25/25 14/27/14\r\nf 12/14/12 14/27/14 1/1491/1\r\nf 14/27/14 27/26/27 28/15/28\r\nf 14/27/14 28/15/28 15/1/15\r\nf 15/1/15 28/15/28 29/17/29\r\nf 15/1/15 29/17/29 16/16/16\r\nf 16/16/16 29/17/29 30/29/30\r\nf 16/16/16 30/29/30 17/2/17\r\nf 17/2/17 30/29/30 31/18/31\r\nf 17/2/17 31/18/31 18/5/18\r\nf 18/5/18 31/18/31 32/30/32\r\nf 18/5/18 32/30/32 19/6/19\r\nf 19/6/19 32/30/32 33/31/33\r\nf 19/6/19 33/31/33 20/8/20\r\nf 20/8/20 33/31/33 34/32/34\r\nf 20/8/20 34/32/34 21/19/21\r\nf 21/19/21 34/32/34 35/21/35\r\nf 21/19/21 35/21/35 22/20/22\r\nf 22/20/22 35/21/35 36/22/36\r\nf 22/20/22 36/22/36 23/12/23\r\nf 23/12/23 36/22/36 37/23/37\r\nf 23/12/23 37/23/37 24/24/24\r\nf 24/24/24 37/23/37 38/35/38\r\nf 24/24/24 38/35/38 25/25/25\r\nf 25/25/25 38/35/38 27/26/27\r\nf 25/25/25 27/26/27 14/27/14\r\nf 27/26/27 40/36/40 41/28/41\r\nf 27/26/27 41/28/41 28/15/28\r\nf 28/15/28 41/28/41 42/39/42\r\nf 28/15/28 42/39/42 29/17/29\r\nf 29/17/29 42/39/42 43/41/43\r\nf 29/17/29 43/41/43 30/29/30\r\nf 30/29/30 43/41/43 44/42/44\r\nf 30/29/30 44/42/44 31/18/31\r\nf 31/18/31 44/42/44 45/43/45\r\nf 31/18/31 45/43/45 32/30/32\r\nf 32/30/32 45/43/45 46/45/46\r\nf 32/30/32 46/45/46 33/31/33\r\nf 33/31/33 46/45/46 47/46/47\r\nf 33/31/33 47/46/47 34/32/34\r\nf 34/32/34 47/46/47 48/48/48\r\nf 34/32/34 48/48/48 35/21/35\r\nf 35/21/35 48/48/48 49/49/49\r\nf 35/21/35 49/49/49 36/22/36\r\nf 36/22/36 49/49/49 50/33/50\r\nf 36/22/36 50/33/50 37/23/37\r\nf 37/23/37 50/33/50 51/34/51\r\nf 37/23/37 51/34/51 38/35/38\r\nf 38/35/38 51/34/51 40/36/40\r\nf 38/35/38 40/36/40 27/26/27\r\nf 40/36/40 53/52/53 54/37/54\r\nf 40/36/40 54/37/54 41/28/41\r\nf 41/28/41 54/37/54 55/38/55\r\nf 41/28/41 55/38/55 42/39/42\r\nf 42/39/42 55/38/55 56/40/56\r\nf 42/39/42 56/40/56 43/41/43\r\nf 43/41/43 56/40/56 57/57/57\r\nf 43/41/43 57/57/57 44/42/44\r\nf 44/42/44 57/57/57 58/58/58\r\nf 44/42/44 58/58/58 45/43/45\r\nf 45/43/45 58/58/58 59/60/59\r\nf 45/43/45 59/60/59 46/45/46\r\nf 46/45/46 59/60/59 60/44/60\r\nf 46/45/46 60/44/60 47/46/47\r\nf 47/46/47 60/44/60 61/47/61\r\nf 47/46/47 61/47/61 48/48/48\r\nf 48/48/48 61/47/61 62/61/62\r\nf 48/48/48 62/61/62 49/49/49\r\nf 49/49/49 62/61/62 63/50/63\r\nf 49/49/49 63/50/63 50/33/50\r\nf 50/33/50 63/50/63 64/51/64\r\nf 50/33/50 64/51/64 51/34/51\r\nf 51/34/51 64/51/64 53/52/53\r\nf 51/34/51 53/52/53 40/36/40\r\nf 53/52/53 66/76/66 67/53/67\r\nf 53/52/53 67/53/67 54/37/54\r\nf 54/37/54 67/53/67 68/54/68\r\nf 54/37/54 68/54/68 55/38/55\r\nf 55/38/55 68/54/68 69/65/69\r\nf 55/38/55 69/65/69 56/40/56\r\nf 56/40/56 69/65/69 70/55/70\r\nf 56/40/56 70/55/70 57/57/57\r\nf 57/57/57 70/55/70 71/56/71\r\nf 57/57/57 71/56/71 58/58/58\r\nf 58/58/58 71/56/71 72/59/72\r\nf 58/58/58 72/59/72 59/60/59\r\nf 59/60/59 72/59/72 73/70/73\r\nf 59/60/59 73/70/73 60/44/60\r\nf 60/44/60 73/70/73 74/72/74\r\nf 60/44/60 74/72/74 61/47/61\r\nf 61/47/61 74/72/74 75/74/75\r\nf 61/47/61 75/74/75 62/61/62\r\nf 62/61/62 75/74/75 76/62/76\r\nf 62/61/62 76/62/76 63/50/63\r\nf 63/50/63 76/62/76 77/63/77\r\nf 63/50/63 77/63/77 64/51/64\r\nf 64/51/64 77/63/77 66/76/66\r\nf 64/51/64 66/76/66 53/52/53\r\nf 66/76/66 79/77/79 80/64/80\r\nf 66/76/66 80/64/80 67/53/67\r\nf 67/53/67 80/64/80 81/80/81\r\nf 67/53/67 81/80/81 68/54/68\r\nf 68/54/68 81/80/81 82/82/82\r\nf 68/54/68 82/82/82 69/65/69\r\nf 69/65/69 82/82/82 83/66/83\r\nf 69/65/69 83/66/83 70/55/70\r\nf 70/55/70 83/66/83 84/67/84\r\nf 70/55/70 84/67/84 71/56/71\r\nf 71/56/71 84/67/84 85/68/85\r\nf 71/56/71 85/68/85 72/59/72\r\nf 72/59/72 85/68/85 86/69/86\r\nf 72/59/72 86/69/86 73/70/73\r\nf 73/70/73 86/69/86 87/71/87\r\nf 73/70/73 87/71/87 74/72/74\r\nf 74/72/74 87/71/87 88/85/88\r\nf 74/72/74 88/85/88 75/74/75\r\nf 75/74/75 88/85/88 89/73/89\r\nf 75/74/75 89/73/89 76/62/76\r\nf 76/62/76 89/73/89 90/75/90\r\nf 76/62/76 90/75/90 77/63/77\r\nf 77/63/77 90/75/90 79/77/79\r\nf 77/63/77 79/77/79 66/76/66\r\nf 79/77/79 92/78/92 93/79/93\r\nf 79/77/79 93/79/93 80/64/80\r\nf 80/64/80 93/79/93 94/81/94\r\nf 80/64/80 94/81/94 81/80/81\r\nf 81/80/81 94/81/94 95/91/95\r\nf 81/80/81 95/91/95 82/82/82\r\nf 82/82/82 95/91/95 96/92/96\r\nf 82/82/82 96/92/96 83/66/83\r\nf 83/66/83 96/92/96 97/93/97\r\nf 83/66/83 97/93/97 84/67/84\r\nf 84/67/84 97/93/97 98/95/98\r\nf 84/67/84 98/95/98 85/68/85\r\nf 85/68/85 98/95/98 99/83/99\r\nf 85/68/85 99/83/99 86/69/86\r\nf 86/69/86 99/83/99 100/84/100\r\nf 86/69/86 100/84/100 87/71/87\r\nf 87/71/87 100/84/100 101/86/101\r\nf 87/71/87 101/86/101 88/85/88\r\nf 88/85/88 101/86/101 102/87/102\r\nf 88/85/88 102/87/102 89/73/89\r\nf 89/73/89 102/87/102 103/99/103\r\nf 89/73/89 103/99/103 90/75/90\r\nf 90/75/90 103/99/103 92/78/92\r\nf 90/75/90 92/78/92 79/77/79\r\nf 92/78/92 105/88/105 106/89/106\r\nf 92/78/92 106/89/106 93/79/93\r\nf 93/79/93 106/89/106 107/101/107\r\nf 93/79/93 107/101/107 94/81/94\r\nf 94/81/94 107/101/107 108/90/108\r\nf 94/81/94 108/90/108 95/91/95\r\nf 95/91/95 108/90/108 109/103/109\r\nf 95/91/95 109/103/109 96/92/96\r\nf 96/92/96 109/103/109 110/105/110\r\nf 96/92/96 110/105/110 97/93/97\r\nf 97/93/97 110/105/110 111/94/111\r\nf 97/93/97 111/94/111 98/95/98\r\nf 98/95/98 111/94/111 112/96/112\r\nf 98/95/98 112/96/112 99/83/99\r\nf 99/83/99 112/96/112 113/97/113\r\nf 99/83/99 113/97/113 100/84/100\r\nf 100/84/100 113/97/113 114/109/114\r\nf 100/84/100 114/109/114 101/86/101\r\nf 101/86/101 114/109/114 115/110/115\r\nf 101/86/101 115/110/115 102/87/102\r\nf 102/87/102 115/110/115 116/98/116\r\nf 102/87/102 116/98/116 103/99/103\r\nf 103/99/103 116/98/116 105/88/105\r\nf 103/99/103 105/88/105 92/78/92\r\nf 105/88/105 118/121/118 119/100/119\r\nf 105/88/105 119/100/119 106/89/106\r\nf 106/89/106 119/100/119 120/112/120\r\nf 106/89/106 120/112/120 107/101/107\r\nf 107/101/107 120/112/120 121/102/121\r\nf 107/101/107 121/102/121 108/90/108\r\nf 108/90/108 121/102/121 122/114/122\r\nf 108/90/108 122/114/122 109/103/109\r\nf 109/103/109 122/114/122 123/104/123\r\nf 109/103/109 123/104/123 110/105/110\r\nf 110/105/110 123/104/123 124/115/124\r\nf 110/105/110 124/115/124 111/94/111\r\nf 111/94/111 124/115/124 125/106/125\r\nf 111/94/111 125/106/125 112/96/112\r\nf 112/96/112 125/106/125 126/107/126\r\nf 112/96/112 126/107/126 113/97/113\r\nf 113/97/113 126/107/126 127/118/127\r\nf 113/97/113 127/118/127 114/109/114\r\nf 114/109/114 127/118/127 128/108/128\r\nf 114/109/114 128/108/128 115/110/115\r\nf 115/110/115 128/108/128 129/120/129\r\nf 115/110/115 129/120/129 116/98/116\r\nf 116/98/116 129/120/129 118/121/118\r\nf 116/98/116 118/121/118 105/88/105\r\nf 118/121/118 131/111/131 132/122/132\r\nf 118/121/118 132/122/132 119/100/119\r\nf 119/100/119 132/122/132 133/123/133\r\nf 119/100/119 133/123/133 120/112/120\r\nf 120/112/120 133/123/133 134/113/134\r\nf 120/112/120 134/113/134 121/102/121\r\nf 121/102/121 134/113/134 135/125/135\r\nf 121/102/121 135/125/135 122/114/122\r\nf 122/114/122 135/125/135 136/126/136\r\nf 122/114/122 136/126/136 123/104/123\r\nf 123/104/123 136/126/136 137/129/137\r\nf 123/104/123 137/129/137 124/115/124\r\nf 124/115/124 137/129/137 138/116/138\r\nf 124/115/124 138/116/138 125/106/125\r\nf 125/106/125 138/116/138 139/117/139\r\nf 125/106/125 139/117/139 126/107/126\r\nf 126/107/126 139/117/139 140/130/140\r\nf 126/107/126 140/130/140 127/118/127\r\nf 127/118/127 140/130/140 141/132/141\r\nf 127/118/127 141/132/141 128/108/128\r\nf 128/108/128 141/132/141 142/119/142\r\nf 128/108/128 142/119/142 129/120/129\r\nf 129/120/129 142/119/142 131/111/131\r\nf 129/120/129 131/111/131 118/121/118\r\nf 131/111/131 144/133/144 145/136/145\r\nf 131/111/131 145/136/145 132/122/132\r\nf 132/122/132 145/136/145 146/137/146\r\nf 132/122/132 146/137/146 133/123/133\r\nf 133/123/133 146/137/146 147/124/147\r\nf 133/123/133 147/124/147 134/113/134\r\nf 134/113/134 147/124/147 148/139/148\r\nf 134/113/134 148/139/148 135/125/135\r\nf 135/125/135 148/139/148 149/127/149\r\nf 135/125/135 149/127/149 136/126/136\r\nf 136/126/136 149/127/149 150/128/150\r\nf 136/126/136 150/128/150 137/129/137\r\nf 137/129/137 150/128/150 151/141/151\r\nf 137/129/137 151/141/151 138/116/138\r\nf 138/116/138 151/141/151 152/143/152\r\nf 138/116/138 152/143/152 139/117/139\r\nf 139/117/139 152/143/152 153/144/153\r\nf 139/117/139 153/144/153 140/130/140\r\nf 140/130/140 153/144/153 154/131/154\r\nf 140/130/140 154/131/154 141/132/141\r\nf 141/132/141 154/131/154 155/146/155\r\nf 141/132/141 155/146/155 142/119/142\r\nf 142/119/142 155/146/155 144/133/144\r\nf 142/119/142 144/133/144 131/111/131\r\nf 144/133/144 157/134/157 158/148/158\r\nf 144/133/144 158/148/158 145/136/145\r\nf 145/136/145 158/148/158 159/135/159\r\nf 145/136/145 159/135/159 146/137/146\r\nf 146/137/146 159/135/159 160/149/160\r\nf 146/137/146 160/149/160 147/124/147\r\nf 147/124/147 160/149/160 161/138/161\r\nf 147/124/147 161/138/161 148/139/148\r\nf 148/139/148 161/138/161 162/140/162\r\nf 148/139/148 162/140/162 149/127/149\r\nf 149/127/149 162/140/162 163/152/163\r\nf 149/127/149 163/152/163 150/128/150\r\nf 150/128/150 163/152/163 164/153/164\r\nf 150/128/150 164/153/164 151/141/151\r\nf 151/141/151 164/153/164 165/142/165\r\nf 151/141/151 165/142/165 152/143/152\r\nf 152/143/152 165/142/165 166/155/166\r\nf 152/143/152 166/155/166 153/144/153\r\nf 153/144/153 166/155/166 167/145/167\r\nf 153/144/153 167/145/167 154/131/154\r\nf 154/131/154 167/145/167 168/156/168\r\nf 154/131/154 168/156/168 155/146/155\r\nf 155/146/155 168/156/168 157/134/157\r\nf 155/146/155 157/134/157 144/133/144\r\nf 157/134/157 170/157/170 171/147/171\r\nf 157/134/157 171/147/171 158/148/158\r\nf 158/148/158 171/147/171 172/159/172\r\nf 158/148/158 172/159/172 159/135/159\r\nf 159/135/159 172/159/172 173/161/173\r\nf 159/135/159 173/161/173 160/149/160\r\nf 160/149/160 173/161/173 174/162/174\r\nf 160/149/160 174/162/174 161/138/161\r\nf 161/138/161 174/162/174 175/150/175\r\nf 161/138/161 175/150/175 162/140/162\r\nf 162/140/162 175/150/175 176/151/176\r\nf 162/140/162 176/151/176 163/152/163\r\nf 163/152/163 176/151/176 177/164/177\r\nf 163/152/163 177/164/177 164/153/164\r\nf 164/153/164 177/164/177 178/166/178\r\nf 164/153/164 178/166/178 165/142/165\r\nf 165/142/165 178/166/178 179/154/179\r\nf 165/142/165 179/154/179 166/155/166\r\nf 166/155/166 179/154/179 180/168/180\r\nf 166/155/166 180/168/180 167/145/167\r\nf 167/145/167 180/168/180 181/169/181\r\nf 167/145/167 181/169/181 168/156/168\r\nf 168/156/168 181/169/181 170/157/170\r\nf 168/156/168 170/157/170 157/134/157\r\nf 170/157/170 183/171/183 184/158/184\r\nf 170/157/170 184/158/184 171/147/171\r\nf 171/147/171 184/158/184 185/173/185\r\nf 171/147/171 185/173/185 172/159/172\r\nf 172/159/172 185/173/185 186/160/186\r\nf 172/159/172 186/160/186 173/161/173\r\nf 173/161/173 186/160/186 187/177/187\r\nf 173/161/173 187/177/187 174/162/174\r\nf 174/162/174 187/177/187 188/178/188\r\nf 174/162/174 188/178/188 175/150/175\r\nf 175/150/175 188/178/188 189/179/189\r\nf 175/150/175 189/179/189 176/151/176\r\nf 176/151/176 189/179/189 190/163/190\r\nf 176/151/176 190/163/190 177/164/177\r\nf 177/164/177 190/163/190 191/165/191\r\nf 177/164/177 191/165/191 178/166/178\r\nf 178/166/178 191/165/191 192/182/192\r\nf 178/166/178 192/182/192 179/154/179\r\nf 179/154/179 192/182/192 193/167/193\r\nf 179/154/179 193/167/193 180/168/180\r\nf 180/168/180 193/167/193 194/170/194\r\nf 180/168/180 194/170/194 181/169/181\r\nf 181/169/181 194/170/194 183/171/183\r\nf 181/169/181 183/171/183 170/157/170\r\nf 183/171/183 196/184/196 197/172/197\r\nf 183/171/183 197/172/197 184/158/184\r\nf 184/158/184 197/172/197 198/186/198\r\nf 184/158/184 198/186/198 185/173/185\r\nf 185/173/185 198/186/198 199/174/199\r\nf 185/173/185 199/174/199 186/160/186\r\nf 186/160/186 199/174/199 200/175/200\r\nf 186/160/186 200/175/200 187/177/187\r\nf 187/177/187 200/175/200 201/176/201\r\nf 187/177/187 201/176/201 188/178/188\r\nf 188/178/188 201/176/201 202/180/202\r\nf 188/178/188 202/180/202 189/179/189\r\nf 189/179/189 202/180/202 203/198/203\r\nf 189/179/189 203/198/203 190/163/190\r\nf 190/163/190 203/198/203 204/199/204\r\nf 190/163/190 204/199/204 191/165/191\r\nf 191/165/191 204/199/204 205/181/205\r\nf 191/165/191 205/181/205 192/182/192\r\nf 192/182/192 205/181/205 206/201/206\r\nf 192/182/192 206/201/206 193/167/193\r\nf 193/167/193 206/201/206 207/202/207\r\nf 193/167/193 207/202/207 194/170/194\r\nf 194/170/194 207/202/207 196/184/196\r\nf 194/170/194 196/184/196 183/171/183\r\nf 196/184/196 209/183/209 210/185/210\r\nf 196/184/196 210/185/210 197/172/197\r\nf 197/172/197 210/185/210 211/187/211\r\nf 197/172/197 211/187/211 198/186/198\r\nf 198/186/198 211/187/211 212/188/212\r\nf 198/186/198 212/188/212 199/174/199\r\nf 199/191/199 212/189/212 213/190/213\r\nf 199/191/199 213/190/213 200/192/200\r\nf 200/192/200 213/190/213 214/193/214\r\nf 200/192/200 214/193/214 201/194/201\r\nf 201/194/201 214/193/214 215/209/215\r\nf 201/194/201 215/209/215 202/195/202\r\nf 202/195/202 215/209/215 216/197/216\r\nf 202/195/202 216/197/216 203/196/203\r\nf 203/196/203 216/197/216 217/211/217\r\nf 203/198/203 217/200/217 204/199/204\r\nf 204/199/204 217/200/217 218/213/218\r\nf 204/199/204 218/213/218 205/181/205\r\nf 205/181/205 218/213/218 219/215/219\r\nf 205/181/205 219/215/219 206/201/206\r\nf 206/201/206 219/215/219 220/217/220\r\nf 206/201/206 220/217/220 207/202/207\r\nf 207/202/207 220/217/220 209/183/209\r\nf 207/202/207 209/183/209 196/184/196\r\nf 209/183/209 222/218/222 223/203/223\r\nf 209/183/209 223/203/223 210/185/210\r\nf 210/204/210 223/221/223 224/222/224\r\nf 210/204/210 224/222/224 211/205/211\r\nf 211/205/211 224/222/224 225/206/225\r\nf 211/205/211 225/206/225 212/189/212\r\nf 212/189/212 225/206/225 226/225/226\r\nf 212/189/212 226/225/226 213/190/213\r\nf 213/190/213 226/225/226 227/207/227\r\nf 213/190/213 227/207/227 214/193/214\r\nf 214/193/214 227/207/227 228/208/228\r\nf 214/193/214 228/208/228 215/209/215\r\nf 215/209/215 228/208/228 229/227/229\r\nf 215/209/215 229/227/229 216/197/216\r\nf 216/197/216 229/227/229 230/210/230\r\nf 216/197/216 230/210/230 217/211/217\r\nf 217/200/217 230/229/230 231/212/231\r\nf 217/200/217 231/212/231 218/213/218\r\nf 218/213/218 231/212/231 232/214/232\r\nf 218/213/218 232/214/232 219/215/219\r\nf 219/215/219 232/214/232 233/216/233\r\nf 219/215/219 233/216/233 220/217/220\r\nf 220/217/220 233/216/233 222/218/222\r\nf 220/217/220 222/218/222 209/183/209\r\nf 222/220/222 235/232/235 236/219/236\r\nf 222/220/222 236/219/236 223/221/223\r\nf 223/221/223 236/219/236 237/223/237\r\nf 223/221/223 237/223/237 224/222/224\r\nf 224/222/224 237/223/237 238/235/238\r\nf 224/222/224 238/235/238 225/206/225\r\nf 225/206/225 238/235/238 239/224/239\r\nf 225/206/225 239/224/239 226/225/226\r\nf 226/225/226 239/224/239 240/226/240\r\nf 226/225/226 240/226/240 227/207/227\r\nf 227/207/227 240/226/240 241/237/241\r\nf 227/207/227 241/237/241 228/208/228\r\nf 228/208/228 241/237/241 242/239/242\r\nf 228/208/228 242/239/242 229/227/229\r\nf 229/227/229 242/239/242 243/228/243\r\nf 229/227/229 243/228/243 230/210/230\r\nf 230/229/230 243/241/243 244/230/244\r\nf 230/229/230 244/230/244 231/212/231\r\nf 231/212/231 244/230/244 245/243/245\r\nf 231/212/231 245/243/245 232/214/232\r\nf 232/214/232 245/243/245 246/245/246\r\nf 232/214/232 246/245/246 233/216/233\r\nf 233/216/233 246/245/246 235/231/235\r\nf 233/216/233 235/231/235 222/218/222\r\nf 235/232/235 248/248/248 249/233/249\r\nf 235/232/235 249/233/249 236/219/236\r\nf 236/219/236 249/233/249 250/251/250\r\nf 236/219/236 250/251/250 237/223/237\r\nf 237/223/237 250/251/250 251/234/251\r\nf 237/223/237 251/234/251 238/235/238\r\nf 238/235/238 251/234/251 252/252/252\r\nf 238/235/238 252/252/252 239/224/239\r\nf 239/224/239 252/252/252 253/236/253\r\nf 239/224/239 253/236/253 240/226/240\r\nf 240/226/240 253/236/253 254/253/254\r\nf 240/226/240 254/253/254 241/237/241\r\nf 241/237/241 254/253/254 255/238/255\r\nf 241/237/241 255/238/255 242/239/242\r\nf 242/239/242 255/238/255 256/240/256\r\nf 242/239/242 256/240/256 243/228/243\r\nf 243/241/243 256/256/256 257/259/257\r\nf 243/241/243 257/259/257 244/230/244\r\nf 244/230/244 257/259/257 258/242/258\r\nf 244/230/244 258/242/258 245/243/245\r\nf 245/243/245 258/242/258 259/244/259\r\nf 245/243/245 259/244/259 246/245/246\r\nf 246/245/246 259/244/259 248/246/248\r\nf 246/245/246 248/246/248 235/231/235\r\nf 248/248/248 261/247/261 262/249/262\r\nf 248/248/248 262/249/262 249/233/249\r\nf 249/233/249 262/249/262 263/263/263\r\nf 249/233/249 263/263/263 250/251/250\r\nf 250/251/250 263/263/263 264/250/264\r\nf 250/251/250 264/250/264 251/234/251\r\nf 251/234/251 264/250/264 265/265/265\r\nf 251/234/251 265/265/265 252/252/252\r\nf 252/252/252 265/265/265 266/266/266\r\nf 252/252/252 266/266/266 253/236/253\r\nf 253/236/253 266/266/266 267/267/267\r\nf 253/236/253 267/267/267 254/253/254\r\nf 254/253/254 267/267/267 268/254/268\r\nf 254/253/254 268/254/268 255/238/255\r\nf 255/238/255 268/254/268 269/255/269\r\nf 255/238/255 269/255/269 256/240/256\r\nf 256/256/256 269/257/269 270/258/270\r\nf 256/256/256 270/258/270 257/259/257\r\nf 257/259/257 270/258/270 271/260/271\r\nf 257/259/257 271/260/271 258/242/258\r\nf 258/242/258 271/260/271 272/274/272\r\nf 258/242/258 272/274/272 259/244/259\r\nf 259/261/259 272/276/272 261/247/261\r\nf 259/261/259 261/247/261 248/248/248\r\nf 261/247/261 274/279/274 275/280/275\r\nf 261/247/261 275/280/275 262/249/262\r\nf 262/249/262 275/280/275 276/262/276\r\nf 262/249/262 276/262/276 263/263/263\r\nf 263/263/263 276/262/276 277/281/277\r\nf 263/263/263 277/281/277 264/250/264\r\nf 264/250/264 277/281/277 278/264/278\r\nf 264/250/264 278/264/278 265/265/265\r\nf 265/265/265 278/264/278 279/285/279\r\nf 265/265/265 279/285/279 266/266/266\r\nf 266/266/266 279/285/279 280/268/280\r\nf 266/266/266 280/268/280 267/267/267\r\nf 267/267/267 280/268/280 281/269/281\r\nf 267/267/267 281/269/281 268/254/268\r\nf 268/254/268 281/269/281 282/270/282\r\nf 268/254/268 282/270/282 269/255/269\r\nf 269/257/269 282/286/282 283/271/283\r\nf 269/257/269 283/271/283 270/258/270\r\nf 270/258/270 283/271/283 284/272/284\r\nf 270/258/270 284/272/284 271/260/271\r\nf 271/260/271 284/272/284 285/273/285\r\nf 271/260/271 285/273/285 272/274/272\r\nf 272/276/272 285/275/285 274/279/274\r\nf 272/276/272 274/279/274 261/247/261\r\nf 274/279/274 287/277/287 288/278/288\r\nf 274/279/274 288/278/288 275/280/275\r\nf 275/280/275 288/278/288 289/292/289\r\nf 275/280/275 289/292/289 276/262/276\r\nf 276/262/276 289/292/289 290/282/290\r\nf 276/262/276 290/282/290 277/281/277\r\nf 277/281/277 290/282/290 291/283/291\r\nf 277/281/277 291/283/291 278/264/278\r\nf 278/264/278 291/283/291 292/284/292\r\nf 278/264/278 292/284/292 279/285/279\r\nf 279/285/279 292/284/292 293/297/293\r\nf 279/285/279 293/297/293 280/268/280\r\nf 280/268/280 293/297/293 294/298/294\r\nf 280/268/280 294/298/294 281/269/281\r\nf 281/269/281 294/298/294 295/299/295\r\nf 281/269/281 295/299/295 282/270/282\r\nf 282/286/282 295/301/295 296/287/296\r\nf 282/286/282 296/287/296 283/271/283\r\nf 283/271/283 296/287/296 297/303/297\r\nf 283/271/283 297/303/297 284/272/284\r\nf 284/288/284 297/304/297 298/306/298\r\nf 284/288/284 298/306/298 285/275/285\r\nf 285/275/285 298/306/298 287/277/287\r\nf 285/275/285 287/277/287 274/279/274\r\nf 287/277/287 300/289/300 301/290/301\r\nf 287/277/287 301/290/301 288/278/288\r\nf 288/278/288 301/290/301 302/291/302\r\nf 288/278/288 302/291/302 289/292/289\r\nf 289/292/289 302/291/302 303/310/303\r\nf 289/292/289 303/310/303 290/282/290\r\nf 290/282/290 303/310/303 304/293/304\r\nf 290/282/290 304/293/304 291/283/291\r\nf 291/283/291 304/293/304 305/294/305\r\nf 291/283/291 305/294/305 292/284/292\r\nf 292/284/292 305/294/305 306/295/306\r\nf 292/284/292 306/295/306 293/297/293\r\nf 293/297/293 306/295/306 307/296/307\r\nf 293/297/293 307/296/307 294/298/294\r\nf 294/298/294 307/296/307 308/313/308\r\nf 294/298/294 308/313/308 295/299/295\r\nf 295/299/295 308/313/308 309/300/309\r\nf 295/301/295 309/316/309 296/287/296\r\nf 296/287/296 309/316/309 310/302/310\r\nf 296/287/296 310/302/310 297/303/297\r\nf 297/304/297 310/305/310 311/320/311\r\nf 297/304/297 311/320/311 298/306/298\r\nf 298/306/298 311/320/311 300/289/300\r\nf 298/306/298 300/289/300 287/277/287\r\nf 300/289/300 313/307/313 314/323/314\r\nf 300/289/300 314/323/314 301/290/301\r\nf 301/290/301 314/323/314 315/308/315\r\nf 301/290/301 315/308/315 302/291/302\r\nf 302/291/302 315/308/315 316/309/316\r\nf 302/291/302 316/309/316 303/310/303\r\nf 303/310/303 316/309/316 317/327/317\r\nf 303/310/303 317/327/317 304/293/304\r\nf 304/293/304 317/327/317 318/328/318\r\nf 304/293/304 318/328/318 305/294/305\r\nf 305/294/305 318/328/318 319/311/319\r\nf 305/294/305 319/311/319 306/295/306\r\nf 306/295/306 319/311/319 320/312/320\r\nf 306/295/306 320/312/320 307/296/307\r\nf 307/296/307 320/312/320 321/330/321\r\nf 307/296/307 321/330/321 308/313/308\r\nf 308/313/308 321/330/321 322/314/322\r\nf 308/313/308 322/314/322 309/300/309\r\nf 309/316/309 322/315/322 323/317/323\r\nf 309/316/309 323/317/323 310/302/310\r\nf 310/305/310 323/318/323 324/319/324\r\nf 310/305/310 324/319/324 311/320/311\r\nf 311/320/311 324/319/324 313/307/313\r\nf 311/320/311 313/307/313 300/289/300\r\nf 313/307/313 326/321/326 327/322/327\r\nf 313/307/313 327/322/327 314/323/314\r\nf 314/323/314 327/322/327 328/324/328\r\nf 314/323/314 328/324/328 315/308/315\r\nf 315/308/315 328/324/328 329/325/329\r\nf 315/308/315 329/325/329 316/309/316\r\nf 316/309/316 329/325/329 330/326/330\r\nf 316/309/316 330/326/330 317/327/317\r\nf 317/327/317 330/326/330 331/338/331\r\nf 317/327/317 331/338/331 318/328/318\r\nf 318/328/318 331/338/331 332/339/332\r\nf 318/328/318 332/339/332 319/311/319\r\nf 319/311/319 332/339/332 333/340/333\r\nf 319/311/319 333/340/333 320/312/320\r\nf 320/312/320 333/340/333 334/329/334\r\nf 320/312/320 334/329/334 321/330/321\r\nf 321/330/321 334/329/334 335/342/335\r\nf 321/330/321 335/342/335 322/314/322\r\nf 322/315/322 335/331/335 336/332/336\r\nf 322/315/322 336/332/336 323/317/323\r\nf 323/318/323 336/343/336 337/344/337\r\nf 323/318/323 337/344/337 324/319/324\r\nf 324/319/324 337/344/337 326/321/326\r\nf 324/319/324 326/321/326 313/307/313\r\nf 326/321/326 339/333/339 340/334/340\r\nf 326/321/326 340/334/340 327/322/327\r\nf 327/322/327 340/334/340 341/346/341\r\nf 327/322/327 341/346/341 328/324/328\r\nf 328/324/328 341/346/341 342/335/342\r\nf 328/324/328 342/335/342 329/325/329\r\nf 329/325/329 342/335/342 343/347/343\r\nf 329/325/329 343/347/343 330/326/330\r\nf 330/326/330 343/347/343 344/336/344\r\nf 330/326/330 344/336/344 331/338/331\r\nf 331/338/331 344/336/344 345/337/345\r\nf 331/338/331 345/337/345 332/339/332\r\nf 332/339/332 345/337/345 346/348/346\r\nf 332/339/332 346/348/346 333/340/333\r\nf 333/340/333 346/348/346 347/341/347\r\nf 333/340/333 347/341/347 334/329/334\r\nf 334/329/334 347/341/347 348/351/348\r\nf 334/329/334 348/351/348 335/342/335\r\nf 335/342/335 348/351/348 349/352/349\r\nf 335/342/335 349/352/349 336/343/336\r\nf 336/343/336 349/352/349 350/356/350\r\nf 336/343/336 350/356/350 337/344/337\r\nf 337/344/337 350/356/350 339/333/339\r\nf 337/344/337 339/333/339 326/321/326\r\nf 339/333/339 352/355/352 353/345/353\r\nf 339/333/339 353/345/353 340/334/340\r\nf 340/334/340 353/345/353 354/358/354\r\nf 340/334/340 354/358/354 341/346/341\r\nf 341/346/341 354/358/354 355/359/355\r\nf 341/346/341 355/359/355 342/335/342\r\nf 342/335/342 355/359/355 356/360/356\r\nf 342/335/342 356/360/356 343/347/343\r\nf 343/347/343 356/360/356 357/362/357\r\nf 343/347/343 357/362/357 344/336/344\r\nf 344/336/344 357/362/357 358/363/358\r\nf 344/336/344 358/363/358 345/337/345\r\nf 345/337/345 358/363/358 359/364/359\r\nf 345/337/345 359/364/359 346/348/346\r\nf 346/348/346 359/364/359 360/349/360\r\nf 346/348/346 360/349/360 347/341/347\r\nf 347/341/347 360/349/360 361/350/361\r\nf 347/341/347 361/350/361 348/351/348\r\nf 348/351/348 361/350/361 362/353/362\r\nf 348/351/348 362/353/362 349/352/349\r\nf 349/352/349 362/353/362 363/354/363\r\nf 349/352/349 363/354/363 350/356/350\r\nf 350/356/350 1574/354/1574 352/355/352\r\nf 350/356/350 352/355/352 339/333/339\r\nf 352/355/352 365/366/365 366/368/366\r\nf 352/355/352 366/368/366 353/345/353\r\nf 353/345/353 366/368/366 367/357/367\r\nf 353/345/353 367/357/367 354/358/354\r\nf 354/358/354 367/357/367 368/371/368\r\nf 354/358/354 368/371/368 355/359/355\r\nf 355/359/355 368/371/368 369/372/369\r\nf 355/359/355 369/372/369 356/360/356\r\nf 356/360/356 369/372/369 370/361/370\r\nf 356/360/356 370/361/370 357/362/357\r\nf 357/362/357 370/361/370 371/374/371\r\nf 357/362/357 371/374/371 358/363/358\r\nf 358/363/358 371/374/371 372/376/372\r\nf 358/363/358 372/376/372 359/364/359\r\nf 359/364/359 372/376/372 373/378/373\r\nf 359/364/359 373/378/373 360/349/360\r\nf 360/349/360 373/378/373 374/365/374\r\nf 360/349/360 374/365/374 361/350/361\r\nf 361/350/361 374/365/374 375/381/375\r\nf 361/350/361 375/381/375 362/353/362\r\nf 362/353/362 375/381/375 376/382/376\r\nf 362/353/362 376/382/376 363/354/363\r\nf 1575/354/1575 1576/382/1576 365/366/365\r\nf 1577/354/1577 365/366/365 352/355/352\r\nf 365/366/365 378/397/378 379/367/379\r\nf 365/366/365 379/367/379 366/368/366\r\nf 366/368/366 379/367/379 380/369/380\r\nf 366/368/366 380/369/380 367/357/367\r\nf 367/357/367 380/369/380 381/370/381\r\nf 367/357/367 381/370/381 368/371/368\r\nf 368/371/368 381/370/381 382/388/382\r\nf 368/371/368 382/388/382 369/372/369\r\nf 369/372/369 382/388/382 383/389/383\r\nf 369/372/369 383/389/383 370/361/370\r\nf 370/361/370 383/389/383 384/373/384\r\nf 370/361/370 384/373/384 371/374/371\r\nf 371/374/371 384/373/384 385/375/385\r\nf 371/374/371 385/375/385 372/376/372\r\nf 372/376/372 385/375/385 386/377/386\r\nf 372/376/372 386/377/386 373/378/373\r\nf 373/378/373 386/377/386 387/393/387\r\nf 373/378/373 387/393/387 374/365/374\r\nf 374/379/374 387/394/387 388/380/388\r\nf 374/365/374 388/380/388 375/381/375\r\nf 1578/381/1578 1579/380/1579 389/396/389\r\nf 1580/381/1580 389/396/389 1581/382/1581\r\nf 1582/382/1582 389/396/389 378/397/378\r\nf 1583/382/1583 378/397/378 365/366/365\r\nf 378/397/378 391/383/391 392/384/392\r\nf 378/397/378 392/384/392 379/367/379\r\nf 379/367/379 392/384/392 393/385/393\r\nf 379/367/379 393/385/393 380/369/380\r\nf 380/369/380 393/385/393 394/386/394\r\nf 380/369/380 394/386/394 381/370/381\r\nf 381/370/381 394/386/394 395/387/395\r\nf 381/370/381 395/387/395 382/388/382\r\nf 382/388/382 395/387/395 396/404/396\r\nf 382/388/382 396/404/396 383/389/383\r\nf 383/389/383 396/404/396 397/390/397\r\nf 383/389/383 397/390/397 384/373/384\r\nf 384/373/384 397/390/397 398/391/398\r\nf 384/373/384 398/391/398 385/375/385\r\nf 385/375/385 398/391/398 399/406/399\r\nf 385/375/385 399/406/399 386/377/386\r\nf 386/377/386 399/406/399 400/392/400\r\nf 386/377/386 400/392/400 387/393/387\r\nf 387/394/387 400/407/400 401/395/401\r\nf 387/394/387 401/395/401 388/380/388\r\nf 1584/380/1584 1585/395/1585 402/411/402\r\nf 1586/380/1586 402/411/402 389/396/389\r\nf 389/396/389 402/411/402 391/383/391\r\nf 389/396/389 391/383/391 378/397/378\r\nf 391/383/391 404/412/404 405/398/405\r\nf 391/383/391 405/398/405 392/384/392\r\nf 392/384/392 405/398/405 406/399/406\r\nf 392/384/392 406/399/406 393/385/393\r\nf 393/385/393 406/399/406 407/400/407\r\nf 393/385/393 407/400/407 394/386/394\r\nf 394/386/394 407/400/407 408/401/408\r\nf 394/386/394 408/401/408 395/387/395\r\nf 395/387/395 408/401/408 409/402/409\r\nf 395/387/395 409/402/409 396/404/396\r\nf 396/404/396 409/402/409 410/403/410\r\nf 396/404/396 410/403/410 397/390/397\r\nf 397/390/397 410/403/410 411/416/411\r\nf 397/390/397 411/416/411 398/391/398\r\nf 398/391/398 411/416/411 412/405/412\r\nf 398/391/398 412/405/412 399/406/399\r\nf 399/406/399 412/405/412 413/408/413\r\nf 399/406/399 413/408/413 400/392/400\r\nf 400/407/400 413/408/413 414/409/414\r\nf 400/407/400 414/409/414 1587/395/1587\r\nf 1588/395/1588 414/409/414 415/410/415\r\nf 1589/395/1589 415/410/415 402/411/402\r\nf 402/411/402 415/410/415 404/412/404\r\nf 402/411/402 404/412/404 391/383/391\r\nf 404/412/404 417/428/417 418/413/418\r\nf 404/412/404 418/413/418 405/398/405\r\nf 405/398/405 418/413/418 419/419/419\r\nf 405/398/405 419/419/419 406/399/406\r\nf 406/399/406 419/419/419 420/414/420\r\nf 406/399/406 420/414/420 407/400/407\r\nf 407/400/407 420/414/420 421/415/421\r\nf 407/400/407 421/415/421 408/401/408\r\nf 408/401/408 421/415/421 422/421/422\r\nf 408/401/408 422/421/422 409/402/409\r\nf 409/402/409 422/421/422 423/422/423\r\nf 409/402/409 423/422/423 410/403/410\r\nf 410/403/410 423/422/423 424/423/424\r\nf 410/403/410 424/423/424 411/416/411\r\nf 411/416/411 424/423/424 425/417/425\r\nf 411/416/411 425/417/425 412/405/412\r\nf 412/405/412 425/417/425 426/424/426\r\nf 412/405/412 426/424/426 413/408/413\r\nf 413/408/413 426/424/426 427/418/427\r\nf 413/408/413 427/418/427 414/409/414\r\nf 414/409/414 427/418/427 428/427/428\r\nf 414/409/414 428/427/428 415/410/415\r\nf 415/410/415 428/427/428 417/428/417\r\nf 415/410/415 417/428/417 404/412/404\r\nf 417/428/417 430/429/430 431/430/431\r\nf 417/428/417 431/430/431 418/413/418\r\nf 418/413/418 431/430/431 432/433/432\r\nf 418/413/418 432/433/432 419/419/419\r\nf 419/419/419 432/433/432 433/435/433\r\nf 419/419/419 433/435/433 420/414/420\r\nf 420/414/420 433/435/433 434/436/434\r\nf 420/414/420 434/436/434 421/415/421\r\nf 421/415/421 434/436/434 435/420/435\r\nf 421/415/421 435/420/435 422/421/422\r\nf 422/421/422 435/420/435 436/438/436\r\nf 422/421/422 436/438/436 423/422/423\r\nf 423/422/423 436/438/436 437/440/437\r\nf 423/422/423 437/440/437 424/423/424\r\nf 424/423/424 437/440/437 438/441/438\r\nf 424/423/424 438/441/438 425/417/425\r\nf 425/417/425 438/441/438 439/425/439\r\nf 425/417/425 439/425/439 426/424/426\r\nf 426/424/426 439/425/439 440/426/440\r\nf 426/424/426 440/426/440 427/418/427\r\nf 427/418/427 440/426/440 441/443/441\r\nf 427/418/427 441/443/441 428/427/428\r\nf 428/427/428 441/443/441 430/429/430\r\nf 428/427/428 430/429/430 417/428/417\r\nf 430/429/430 443/445/443 444/431/444\r\nf 430/429/430 444/431/444 431/430/431\r\nf 431/430/431 444/431/444 445/432/445\r\nf 431/430/431 445/432/445 432/433/432\r\nf 432/433/432 445/432/445 446/434/446\r\nf 432/433/432 446/434/446 433/435/433\r\nf 433/435/433 446/434/446 447/449/447\r\nf 433/435/433 447/449/447 434/436/434\r\nf 434/436/434 447/449/447 448/437/448\r\nf 434/436/434 448/437/448 435/420/435\r\nf 435/420/435 448/437/448 449/439/449\r\nf 435/420/435 449/439/449 436/438/436\r\nf 436/438/436 449/439/449 450/451/450\r\nf 436/438/436 450/451/450 437/440/437\r\nf 437/440/437 450/451/450 451/454/451\r\nf 437/440/437 451/454/451 438/441/438\r\nf 438/441/438 451/454/451 452/455/452\r\nf 438/441/438 452/455/452 439/425/439\r\nf 439/425/439 452/455/452 453/442/453\r\nf 439/425/439 453/442/453 440/426/440\r\nf 440/426/440 453/442/453 454/457/454\r\nf 440/426/440 454/457/454 441/443/441\r\nf 441/443/441 454/457/454 443/445/443\r\nf 441/443/441 443/445/443 430/429/430\r\nf 443/445/443 456/458/456 457/444/457\r\nf 443/445/443 457/444/457 444/431/444\r\nf 444/431/444 457/444/457 458/446/458\r\nf 444/431/444 458/446/458 445/432/445\r\nf 445/432/445 458/446/458 459/447/459\r\nf 445/432/445 459/447/459 446/434/446\r\nf 446/434/446 459/447/459 460/448/460\r\nf 446/434/446 460/448/460 447/449/447\r\nf 447/449/447 460/448/460 461/450/461\r\nf 447/449/447 461/450/461 448/437/448\r\nf 448/437/448 461/450/461 462/463/462\r\nf 448/437/448 462/463/462 449/439/449\r\nf 449/439/449 462/463/462 463/452/463\r\nf 449/439/449 463/452/463 450/451/450\r\nf 450/451/450 463/452/463 464/465/464\r\nf 450/451/450 464/465/464 451/454/451\r\nf 451/454/451 464/465/464 465/453/465\r\nf 451/454/451 465/453/465 452/455/452\r\nf 452/455/452 465/453/465 466/456/466\r\nf 452/455/452 466/456/466 453/442/453\r\nf 453/442/453 466/456/466 467/469/467\r\nf 453/442/453 467/469/467 454/457/454\r\nf 454/457/454 467/469/467 456/458/456\r\nf 454/457/454 456/458/456 443/445/443\r\nf 456/458/456 469/470/469 470/472/470\r\nf 456/458/456 470/472/470 457/444/457\r\nf 457/444/457 470/472/470 471/474/471\r\nf 457/444/457 471/474/471 458/446/458\r\nf 458/446/458 471/474/471 472/459/472\r\nf 458/446/458 472/459/472 459/447/459\r\nf 459/447/459 472/459/472 473/460/473\r\nf 459/447/459 473/460/473 460/448/460\r\nf 460/448/460 473/460/473 474/461/474\r\nf 460/448/460 474/461/474 461/450/461\r\nf 461/450/461 474/461/474 475/477/475\r\nf 461/450/461 475/477/475 462/463/462\r\nf 462/463/462 475/477/475 476/462/476\r\nf 462/463/462 476/462/476 463/452/463\r\nf 463/452/463 476/462/476 477/464/477\r\nf 463/452/463 477/464/477 464/465/464\r\nf 464/465/464 477/464/477 478/466/478\r\nf 464/465/464 478/466/478 465/453/465\r\nf 465/453/465 478/466/478 479/467/479\r\nf 465/453/465 479/467/479 466/456/466\r\nf 466/456/466 479/467/479 480/468/480\r\nf 466/456/466 480/468/480 467/469/467\r\nf 467/469/467 480/468/480 469/470/469\r\nf 467/469/467 469/470/469 456/458/456\r\nf 469/470/469 482/489/482 483/471/483\r\nf 469/470/469 483/471/483 470/472/470\r\nf 470/472/470 483/471/483 484/479/484\r\nf 470/472/470 484/479/484 471/474/471\r\nf 471/474/471 484/479/484 485/473/485\r\nf 471/474/471 485/473/485 472/459/472\r\nf 472/459/472 485/473/485 486/475/486\r\nf 472/459/472 486/475/486 473/460/473\r\nf 473/460/473 486/475/486 487/481/487\r\nf 473/460/473 487/481/487 474/461/474\r\nf 474/461/474 487/481/487 488/476/488\r\nf 474/461/474 488/476/488 475/477/475\r\nf 475/477/475 488/476/488 489/482/489\r\nf 475/477/475 489/482/489 476/462/476\r\nf 476/462/476 489/482/489 490/485/490\r\nf 476/462/476 490/485/490 477/464/477\r\nf 477/464/477 490/485/490 491/478/491\r\nf 477/464/477 491/478/491 478/466/478\r\nf 478/466/478 491/478/491 492/487/492\r\nf 478/466/478 492/487/492 479/467/479\r\nf 479/467/479 492/487/492 493/488/493\r\nf 479/467/479 493/488/493 480/468/480\r\nf 480/468/480 493/488/493 482/489/482\r\nf 480/468/480 482/489/482 469/470/469\r\nf 482/489/482 495/490/495 496/492/496\r\nf 482/489/482 496/492/496 483/471/483\r\nf 483/471/483 496/492/496 497/493/497\r\nf 483/471/483 497/493/497 484/479/484\r\nf 484/479/484 497/493/497 498/495/498\r\nf 484/479/484 498/495/498 485/473/485\r\nf 485/473/485 498/495/498 499/496/499\r\nf 485/473/485 499/496/499 486/475/486\r\nf 486/475/486 499/496/499 500/480/500\r\nf 486/475/486 500/480/500 487/481/487\r\nf 487/481/487 500/480/500 501/497/501\r\nf 487/481/487 501/497/501 488/476/488\r\nf 488/476/488 501/497/501 502/483/502\r\nf 488/476/488 502/483/502 489/482/489\r\nf 489/482/489 502/483/502 503/484/503\r\nf 489/482/489 503/484/503 490/485/490\r\nf 490/485/490 503/484/503 504/486/504\r\nf 490/485/490 504/486/504 491/478/491\r\nf 491/478/491 504/486/504 505/501/505\r\nf 491/478/491 505/501/505 492/487/492\r\nf 492/487/492 505/501/505 506/502/506\r\nf 492/487/492 506/502/506 493/488/493\r\nf 493/488/493 506/502/506 495/490/495\r\nf 493/488/493 495/490/495 482/489/482\r\nf 495/490/495 508/503/508 509/491/509\r\nf 495/490/495 509/491/509 496/492/496\r\nf 496/492/496 509/491/509 510/506/510\r\nf 496/492/496 510/506/510 497/493/497\r\nf 497/493/497 510/506/510 511/494/511\r\nf 497/493/497 511/494/511 498/495/498\r\nf 498/495/498 511/494/511 512/507/512\r\nf 498/495/498 512/507/512 499/496/499\r\nf 499/496/499 512/507/512 513/509/513\r\nf 499/496/499 513/509/513 500/480/500\r\nf 500/480/500 513/509/513 514/510/514\r\nf 500/480/500 514/510/514 501/497/501\r\nf 501/497/501 514/510/514 515/512/515\r\nf 501/497/501 515/512/515 502/483/502\r\nf 502/483/502 515/512/515 516/498/516\r\nf 502/483/502 516/498/516 503/484/503\r\nf 503/484/503 516/498/516 517/499/517\r\nf 503/484/503 517/499/517 504/486/504\r\nf 504/486/504 517/499/517 518/500/518\r\nf 504/486/504 518/500/518 505/501/505\r\nf 505/501/505 518/500/518 519/514/519\r\nf 505/501/505 519/514/519 506/502/506\r\nf 506/502/506 519/514/519 508/503/508\r\nf 506/502/506 508/503/508 495/490/495\r\nf 508/503/508 521/504/521 522/516/522\r\nf 508/503/508 522/516/522 509/491/509\r\nf 509/491/509 522/516/522 523/505/523\r\nf 509/491/509 523/505/523 510/506/510\r\nf 510/506/510 523/505/523 524/518/524\r\nf 510/506/510 524/518/524 511/494/511\r\nf 511/494/511 524/518/524 525/521/525\r\nf 511/494/511 525/521/525 512/507/512\r\nf 512/507/512 525/521/525 526/508/526\r\nf 512/507/512 526/508/526 513/509/513\r\nf 513/509/513 526/508/526 527/524/527\r\nf 513/509/513 527/524/527 514/510/514\r\nf 514/510/514 527/524/527 528/511/528\r\nf 514/510/514 528/511/528 515/512/515\r\nf 515/512/515 528/511/528 529/526/529\r\nf 515/512/515 529/526/529 516/498/516\r\nf 516/498/516 529/526/529 530/527/530\r\nf 516/498/516 530/527/530 517/499/517\r\nf 517/499/517 530/527/530 531/513/531\r\nf 517/499/517 531/513/531 518/500/518\r\nf 518/500/518 531/513/531 532/530/532\r\nf 518/500/518 532/530/532 519/514/519\r\nf 519/514/519 532/530/532 521/504/521\r\nf 519/514/519 521/504/521 508/503/508\r\nf 521/504/521 534/532/534 535/515/535\r\nf 521/504/521 535/515/535 522/516/522\r\nf 522/516/522 535/515/535 536/517/536\r\nf 522/516/522 536/517/536 523/505/523\r\nf 523/505/523 536/517/536 537/519/537\r\nf 523/505/523 537/519/537 524/518/524\r\nf 524/518/524 537/519/537 538/520/538\r\nf 524/518/524 538/520/538 525/521/525\r\nf 525/521/525 538/520/538 539/522/539\r\nf 525/521/525 539/522/539 526/508/526\r\nf 526/508/526 539/522/539 540/523/540\r\nf 526/508/526 540/523/540 527/524/527\r\nf 527/524/527 540/523/540 541/537/541\r\nf 527/524/527 541/537/541 528/511/528\r\nf 528/511/528 541/537/541 542/525/542\r\nf 528/511/528 542/525/542 529/526/529\r\nf 529/526/529 542/525/542 543/528/543\r\nf 529/526/529 543/528/543 530/527/530\r\nf 530/527/530 543/528/543 544/529/544\r\nf 530/527/530 544/529/544 531/513/531\r\nf 531/513/531 544/529/544 545/538/545\r\nf 531/513/531 545/538/545 532/530/532\r\nf 532/530/532 545/538/545 534/532/534\r\nf 532/530/532 534/532/534 521/504/521\r\nf 534/532/534 547/531/547 548/540/548\r\nf 534/532/534 548/540/548 535/515/535\r\nf 535/515/535 548/540/548 549/533/549\r\nf 535/515/535 549/533/549 536/517/536\r\nf 536/517/536 549/533/549 550/534/550\r\nf 536/517/536 550/534/550 537/519/537\r\nf 537/519/537 550/534/550 551/542/551\r\nf 537/519/537 551/542/551 538/520/538\r\nf 538/520/538 551/542/551 552/543/552\r\nf 538/520/538 552/543/552 539/522/539\r\nf 539/522/539 552/543/552 553/535/553\r\nf 539/522/539 553/535/553 540/523/540\r\nf 540/523/540 553/535/553 554/536/554\r\nf 540/523/540 554/536/554 541/537/541\r\nf 541/537/541 554/536/554 555/545/555\r\nf 541/537/541 555/545/555 542/525/542\r\nf 542/525/542 555/545/555 556/546/556\r\nf 542/525/542 556/546/556 543/528/543\r\nf 543/528/543 556/546/556 557/548/557\r\nf 543/528/543 557/548/557 544/529/544\r\nf 544/529/544 557/548/557 558/539/558\r\nf 544/529/544 558/539/558 545/538/545\r\nf 545/538/545 558/539/558 547/531/547\r\nf 545/538/545 547/531/547 534/532/534\r\nf 547/531/547 560/569/560 561/551/561\r\nf 547/531/547 561/551/561 548/540/548\r\nf 548/540/548 561/551/561 562/541/562\r\nf 548/540/548 562/541/562 549/533/549\r\nf 549/533/549 562/541/562 563/554/563\r\nf 549/533/549 563/554/563 550/534/550\r\nf 550/534/550 563/554/563 564/555/564\r\nf 550/534/550 564/555/564 551/542/551\r\nf 551/542/551 564/555/564 565/559/565\r\nf 551/542/551 565/559/565 552/543/552\r\nf 552/543/552 565/559/565 566/560/566\r\nf 552/543/552 566/560/566 553/535/553\r\nf 553/535/553 566/560/566 567/562/567\r\nf 553/535/553 567/562/567 554/536/554\r\nf 554/536/554 567/562/567 568/544/568\r\nf 554/536/554 568/544/568 555/545/555\r\nf 555/545/555 568/544/568 569/547/569\r\nf 555/545/555 569/547/569 556/546/556\r\nf 556/546/556 569/547/569 570/549/570\r\nf 556/546/556 570/549/570 557/548/557\r\nf 557/548/557 570/549/570 571/566/571\r\nf 557/548/557 571/566/571 558/539/558\r\nf 558/539/558 571/566/571 560/569/560\r\nf 558/539/558 560/569/560 547/531/547\r\nf 560/569/560 573/568/573 574/550/574\r\nf 560/569/560 574/550/574 561/551/561\r\nf 561/551/561 574/550/574 575/552/575\r\nf 561/551/561 575/552/575 562/541/562\r\nf 562/541/562 575/552/575 576/553/576\r\nf 562/541/562 576/553/576 563/554/563\r\nf 563/554/563 576/553/576 577/556/577\r\nf 563/554/563 577/556/577 564/555/564\r\nf 564/555/564 577/556/577 578/557/578\r\nf 564/555/564 578/557/578 565/559/565\r\nf 565/559/565 578/557/578 579/558/579\r\nf 565/559/565 579/558/579 566/560/566\r\nf 566/560/566 579/558/579 580/561/580\r\nf 566/560/566 580/561/580 567/562/567\r\nf 567/562/567 580/561/580 581/563/581\r\nf 567/562/567 581/563/581 568/544/568\r\nf 568/544/568 581/563/581 582/564/582\r\nf 568/544/568 582/564/582 569/547/569\r\nf 569/547/569 582/564/582 583/565/583\r\nf 569/547/569 583/565/583 570/549/570\r\nf 570/549/570 583/565/583 584/567/584\r\nf 570/549/570 584/567/584 571/566/571\r\nf 571/566/571 584/567/584 573/568/573\r\nf 571/566/571 573/568/573 560/569/560\r\nf 573/568/573 586/577/586 587/570/587\r\nf 573/568/573 587/570/587 574/550/574\r\nf 574/550/574 587/570/587 588/580/588\r\nf 574/550/574 588/580/588 575/552/575\r\nf 575/552/575 588/580/588 589/582/589\r\nf 575/552/575 589/582/589 576/553/576\r\nf 576/553/576 589/582/589 590/571/590\r\nf 576/553/576 590/571/590 577/556/577\r\nf 577/556/577 590/571/590 591/583/591\r\nf 577/556/577 591/583/591 578/557/578\r\nf 578/557/578 591/583/591 592/572/592\r\nf 578/557/578 592/572/592 579/558/579\r\nf 579/558/579 592/572/592 593/573/593\r\nf 579/558/579 593/573/593 580/561/580\r\nf 580/561/580 593/573/593 594/587/594\r\nf 580/561/580 594/587/594 581/563/581\r\nf 581/563/581 594/587/594 595/574/595\r\nf 581/563/581 595/574/595 582/564/582\r\nf 582/564/582 595/574/595 596/575/596\r\nf 582/564/582 596/575/596 583/565/583\r\nf 583/565/583 596/575/596 597/576/597\r\nf 583/565/583 597/576/597 584/567/584\r\nf 584/567/584 597/576/597 586/577/586\r\nf 584/567/584 586/577/586 573/568/573\r\nf 586/577/586 599/597/599 600/578/600\r\nf 586/577/586 600/578/600 587/570/587\r\nf 587/570/587 600/578/600 601/579/601\r\nf 587/570/587 601/579/601 588/580/588\r\nf 588/580/588 601/579/601 602/581/602\r\nf 588/580/588 602/581/602 589/582/589\r\nf 589/582/589 602/581/602 603/590/603\r\nf 589/582/589 603/590/603 590/571/590\r\nf 590/571/590 603/590/603 604/584/604\r\nf 590/571/590 604/584/604 591/583/591\r\nf 591/583/591 604/584/604 605/592/605\r\nf 591/583/591 605/592/605 592/572/592\r\nf 592/572/592 605/592/605 606/593/606\r\nf 592/572/592 606/593/606 593/573/593\r\nf 593/573/593 606/593/606 607/585/607\r\nf 593/573/593 607/585/607 594/587/594\r\nf 594/587/594 607/585/607 608/586/608\r\nf 594/587/594 608/586/608 595/574/595\r\nf 595/574/595 608/586/608 609/596/609\r\nf 595/574/595 609/596/609 596/575/596\r\nf 596/575/596 609/596/609 610/588/610\r\nf 596/575/596 610/588/610 597/576/597\r\nf 597/576/597 610/588/610 599/597/599\r\nf 597/576/597 599/597/599 586/577/586\r\nf 599/597/599 612/613/612 613/599/613\r\nf 599/597/599 613/599/613 600/578/600\r\nf 600/578/600 613/599/613 614/589/614\r\nf 600/578/600 614/589/614 601/579/601\r\nf 601/579/601 614/589/614 615/601/615\r\nf 601/579/601 615/601/615 602/581/602\r\nf 602/581/602 615/601/615 616/591/616\r\nf 602/581/602 616/591/616 603/590/603\r\nf 603/590/603 616/591/616 617/604/617\r\nf 603/590/603 617/604/617 604/584/604\r\nf 604/584/604 617/604/617 618/605/618\r\nf 604/584/604 618/605/618 605/592/605\r\nf 605/592/605 618/605/618 619/606/619\r\nf 605/592/605 619/606/619 606/593/606\r\nf 606/593/606 619/606/619 620/594/620\r\nf 606/593/606 620/594/620 607/585/607\r\nf 607/585/607 620/594/620 621/595/621\r\nf 607/585/607 621/595/621 608/586/608\r\nf 608/586/608 621/595/621 622/609/622\r\nf 608/586/608 622/609/622 609/596/609\r\nf 609/596/609 622/609/622 623/612/623\r\nf 609/596/609 623/612/623 610/588/610\r\nf 610/588/610 623/612/623 612/613/612\r\nf 610/588/610 612/613/612 599/597/599\r\nf 612/613/612 625/611/625 626/598/626\r\nf 612/613/612 626/598/626 613/599/613\r\nf 613/599/613 626/598/626 627/600/627\r\nf 613/599/613 627/600/627 614/589/614\r\nf 614/589/614 627/600/627 628/602/628\r\nf 614/589/614 628/602/628 615/601/615\r\nf 615/601/615 628/602/628 629/617/629\r\nf 615/601/615 629/617/629 616/591/616\r\nf 616/591/616 629/617/629 630/603/630\r\nf 616/591/616 630/603/630 617/604/617\r\nf 617/604/617 630/603/630 631/620/631\r\nf 617/604/617 631/620/631 618/605/618\r\nf 618/605/618 631/620/631 632/621/632\r\nf 618/605/618 632/621/632 619/606/619\r\nf 619/606/619 632/621/632 633/607/633\r\nf 619/606/619 633/607/633 620/594/620\r\nf 620/594/620 633/607/633 634/624/634\r\nf 620/594/620 634/624/634 621/595/621\r\nf 621/595/621 634/624/634 635/608/635\r\nf 621/595/621 635/608/635 622/609/622\r\nf 622/609/622 635/608/635 636/610/636\r\nf 622/609/622 636/610/636 623/612/623\r\nf 623/612/623 636/610/636 625/611/625\r\nf 623/612/623 625/611/625 612/613/612\r\nf 625/611/625 638/626/638 639/614/639\r\nf 625/611/625 639/614/639 626/598/626\r\nf 626/598/626 639/614/639 640/629/640\r\nf 626/598/626 640/629/640 627/600/627\r\nf 627/600/627 640/629/640 641/615/641\r\nf 627/600/627 641/615/641 628/602/628\r\nf 628/602/628 641/615/641 642/616/642\r\nf 628/602/628 642/616/642 629/617/629\r\nf 629/617/629 642/616/642 643/618/643\r\nf 629/617/629 643/618/643 630/603/630\r\nf 630/603/630 643/618/643 644/619/644\r\nf 630/603/630 644/619/644 631/620/631\r\nf 631/620/631 644/619/644 645/632/645\r\nf 631/620/631 645/632/645 632/621/632\r\nf 632/621/632 645/632/645 646/622/646\r\nf 632/621/632 646/622/646 633/607/633\r\nf 633/607/633 646/622/646 647/623/647\r\nf 633/607/633 647/623/647 634/624/634\r\nf 634/624/634 647/623/647 648/625/648\r\nf 634/624/634 648/625/648 635/608/635\r\nf 635/608/635 648/625/648 649/633/649\r\nf 635/608/635 649/633/649 636/610/636\r\nf 636/610/636 649/633/649 638/626/638\r\nf 636/610/636 638/626/638 625/611/625\r\nf 638/626/638 651/634/651 652/627/652\r\nf 638/626/638 652/627/652 639/614/639\r\nf 639/614/639 652/627/652 653/635/653\r\nf 639/614/639 653/635/653 640/629/640\r\nf 640/629/640 653/635/653 654/628/654\r\nf 640/629/640 654/628/654 641/615/641\r\nf 641/615/641 654/628/654 655/630/655\r\nf 641/615/641 655/630/655 642/616/642\r\nf 642/616/642 655/630/655 656/638/656\r\nf 642/616/642 656/638/656 643/618/643\r\nf 643/618/643 656/638/656 657/631/657\r\nf 643/618/643 657/631/657 644/619/644\r\nf 644/619/644 657/631/657 658/639/658\r\nf 644/619/644 658/639/658 645/632/645\r\nf 645/632/645 658/639/658 659/640/659\r\nf 645/632/645 659/640/659 646/622/646\r\nf 646/622/646 659/640/659 660/643/660\r\nf 646/622/646 660/643/660 647/623/647\r\nf 647/623/647 660/643/660 661/644/661\r\nf 647/623/647 661/644/661 648/625/648\r\nf 648/625/648 661/644/661 662/646/662\r\nf 648/625/648 662/646/662 649/633/649\r\nf 649/633/649 662/646/662 651/634/651\r\nf 649/633/649 651/634/651 638/626/638\r\nf 651/634/651 664/648/664 665/649/665\r\nf 651/634/651 665/649/665 652/627/652\r\nf 652/627/652 665/649/665 666/636/666\r\nf 652/627/652 666/636/666 653/635/653\r\nf 653/635/653 666/636/666 667/651/667\r\nf 653/635/653 667/651/667 654/628/654\r\nf 654/628/654 667/651/667 668/653/668\r\nf 654/628/654 668/653/668 655/630/655\r\nf 655/630/655 668/653/668 669/637/669\r\nf 655/630/655 669/637/669 656/638/656\r\nf 656/638/656 669/637/669 670/657/670\r\nf 656/638/656 670/657/670 657/631/657\r\nf 657/631/657 670/657/670 671/658/671\r\nf 657/631/657 671/658/671 658/639/658\r\nf 658/639/658 671/658/671 672/659/672\r\nf 658/639/658 672/659/672 659/640/659\r\nf 659/640/659 672/659/672 673/641/673\r\nf 659/640/659 673/641/673 660/643/660\r\nf 660/643/660 673/641/673 674/642/674\r\nf 660/643/660 674/642/674 661/644/661\r\nf 661/644/661 674/642/674 675/645/675\r\nf 661/644/661 675/645/675 662/646/662\r\nf 662/646/662 675/645/675 664/648/664\r\nf 662/646/662 664/648/664 651/634/651\r\nf 664/648/664 677/660/677 678/647/678\r\nf 664/648/664 678/647/678 665/649/665\r\nf 665/649/665 678/647/678 679/650/679\r\nf 665/649/665 679/650/679 666/636/666\r\nf 666/636/666 679/650/679 680/664/680\r\nf 666/636/666 680/664/680 667/651/667\r\nf 667/651/667 680/664/680 681/652/681\r\nf 667/651/667 681/652/681 668/653/668\r\nf 668/653/668 681/652/681 682/654/682\r\nf 668/653/668 682/654/682 669/637/669\r\nf 669/637/669 682/654/682 683/655/683\r\nf 669/637/669 683/655/683 670/657/670\r\nf 670/657/670 683/655/683 684/656/684\r\nf 670/657/670 684/656/684 671/658/671\r\nf 671/658/671 684/656/684 685/666/685\r\nf 671/658/671 685/666/685 672/659/672\r\nf 672/659/672 685/666/685 686/667/686\r\nf 672/659/672 686/667/686 673/641/673\r\nf 673/641/673 686/667/686 687/670/687\r\nf 673/641/673 687/670/687 674/642/674\r\nf 674/642/674 687/670/687 688/672/688\r\nf 674/642/674 688/672/688 675/645/675\r\nf 675/645/675 688/672/688 677/660/677\r\nf 675/645/675 677/660/677 664/648/664\r\nf 677/660/677 690/661/690 691/662/691\r\nf 677/660/677 691/662/691 678/647/678\r\nf 678/647/678 691/662/691 692/675/692\r\nf 678/647/678 692/675/692 679/650/679\r\nf 679/650/679 692/675/692 693/663/693\r\nf 679/650/679 693/663/693 680/664/680\r\nf 680/664/680 693/663/693 694/665/694\r\nf 680/664/680 694/665/694 681/652/681\r\nf 681/652/681 694/665/694 695/678/695\r\nf 681/652/681 695/678/695 682/654/682\r\nf 682/654/682 695/678/695 696/679/696\r\nf 682/654/682 696/679/696 683/655/683\r\nf 683/655/683 696/679/696 697/681/697\r\nf 683/655/683 697/681/697 684/656/684\r\nf 684/656/684 697/681/697 698/682/698\r\nf 684/656/684 698/682/698 685/666/685\r\nf 685/666/685 698/682/698 699/668/699\r\nf 685/666/685 699/668/699 686/667/686\r\nf 686/667/686 699/668/699 700/669/700\r\nf 686/667/686 700/669/700 687/670/687\r\nf 687/670/687 700/669/700 701/671/701\r\nf 687/670/687 701/671/701 688/672/688\r\nf 688/672/688 701/671/701 690/661/690\r\nf 688/672/688 690/661/690 677/660/677\r\nf 690/661/690 703/686/703 704/673/704\r\nf 690/661/690 704/673/704 691/662/691\r\nf 691/662/691 704/673/704 705/674/705\r\nf 691/662/691 705/674/705 692/675/692\r\nf 692/675/692 705/674/705 706/676/706\r\nf 692/675/692 706/676/706 693/663/693\r\nf 693/663/693 706/676/706 707/688/707\r\nf 693/663/693 707/688/707 694/665/694\r\nf 694/665/694 707/688/707 708/677/708\r\nf 694/665/694 708/677/708 695/678/695\r\nf 695/678/695 708/677/708 709/680/709\r\nf 695/678/695 709/680/709 696/679/696\r\nf 696/679/696 709/680/709 710/691/710\r\nf 696/679/696 710/691/710 697/681/697\r\nf 697/681/697 710/691/710 711/693/711\r\nf 697/681/697 711/693/711 698/682/698\r\nf 698/682/698 711/693/711 712/683/712\r\nf 698/682/698 712/683/712 699/668/699\r\nf 699/668/699 712/683/712 713/684/713\r\nf 699/668/699 713/684/713 700/669/700\r\nf 700/669/700 713/684/713 714/685/714\r\nf 700/669/700 714/685/714 701/671/701\r\nf 701/671/701 714/685/714 703/686/703\r\nf 701/671/701 703/686/703 690/661/690\r\nf 703/686/703 716/708/716 717/696/717\r\nf 703/686/703 717/696/717 704/673/704\r\nf 704/673/704 717/696/717 718/687/718\r\nf 704/673/704 718/687/718 705/674/705\r\nf 705/674/705 718/687/718 719/698/719\r\nf 705/674/705 719/698/719 706/676/706\r\nf 706/676/706 719/698/719 720/699/720\r\nf 706/676/706 720/699/720 707/688/707\r\nf 707/688/707 720/699/720 721/689/721\r\nf 707/688/707 721/689/721 708/677/708\r\nf 708/677/708 721/689/721 722/703/722\r\nf 708/677/708 722/703/722 709/680/709\r\nf 709/680/709 722/703/722 723/690/723\r\nf 709/680/709 723/690/723 710/691/710\r\nf 710/691/710 723/690/723 724/692/724\r\nf 710/691/710 724/692/724 711/693/711\r\nf 711/693/711 724/692/724 725/694/725\r\nf 711/693/711 725/694/725 712/683/712\r\nf 712/683/712 725/694/725 726/695/726\r\nf 712/683/712 726/695/726 713/684/713\r\nf 713/684/713 726/695/726 727/707/727\r\nf 713/684/713 727/707/727 714/685/714\r\nf 714/685/714 727/707/727 716/708/716\r\nf 714/685/714 716/708/716 703/686/703\r\nf 716/708/716 729/709/729 730/710/730\r\nf 716/708/716 730/710/730 717/696/717\r\nf 717/696/717 730/710/730 731/711/731\r\nf 717/696/717 731/711/731 718/687/718\r\nf 718/687/718 731/711/731 732/697/732\r\nf 718/687/718 732/697/732 719/698/719\r\nf 719/698/719 732/697/732 733/715/733\r\nf 719/698/719 733/715/733 720/699/720\r\nf 720/699/720 733/715/733 734/700/734\r\nf 720/699/720 734/700/734 721/689/721\r\nf 721/689/721 734/700/734 735/701/735\r\nf 721/689/721 735/701/735 722/703/722\r\nf 722/703/722 735/701/735 736/702/736\r\nf 722/703/722 736/702/736 723/690/723\r\nf 723/690/723 736/702/736 737/704/737\r\nf 723/690/723 737/704/737 724/692/724\r\nf 724/692/724 737/704/737 738/717/738\r\nf 724/692/724 738/717/738 725/694/725\r\nf 725/694/725 738/717/738 739/705/739\r\nf 725/694/725 739/705/739 726/695/726\r\nf 726/695/726 739/705/739 740/706/740\r\nf 726/695/726 740/706/740 727/707/727\r\nf 727/707/727 740/706/740 729/709/729\r\nf 727/707/727 729/709/729 716/708/716\r\nf 729/709/729 742/718/742 743/720/743\r\nf 729/709/729 743/720/743 730/710/730\r\nf 730/710/730 743/720/743 744/712/744\r\nf 730/710/730 744/712/744 731/711/731\r\nf 731/711/731 744/712/744 745/713/745\r\nf 731/711/731 745/713/745 732/697/732\r\nf 732/697/732 745/713/745 746/714/746\r\nf 732/697/732 746/714/746 733/715/733\r\nf 733/715/733 746/714/746 747/724/747\r\nf 733/715/733 747/724/747 734/700/734\r\nf 734/700/734 747/724/747 748/725/748\r\nf 734/700/734 748/725/748 735/701/735\r\nf 735/701/735 748/725/748 749/716/749\r\nf 735/701/735 749/716/749 736/702/736\r\nf 736/702/736 749/716/749 750/728/750\r\nf 736/702/736 750/728/750 737/704/737\r\nf 737/704/737 750/728/750 751/729/751\r\nf 737/704/737 751/729/751 738/717/738\r\nf 738/717/738 751/729/751 752/731/752\r\nf 738/717/738 752/731/752 739/705/739\r\nf 739/705/739 752/731/752 753/733/753\r\nf 739/705/739 753/733/753 740/706/740\r\nf 740/706/740 753/733/753 742/718/742\r\nf 740/706/740 742/718/742 729/709/729\r\nf 742/718/742 755/734/755 756/719/756\r\nf 742/718/742 756/719/756 743/720/743\r\nf 743/720/743 756/719/756 757/721/757\r\nf 743/720/743 757/721/757 744/712/744\r\nf 744/712/744 757/721/757 758/722/758\r\nf 744/712/744 758/722/758 745/713/745\r\nf 745/713/745 758/722/758 759/723/759\r\nf 745/713/745 759/723/759 746/714/746\r\nf 746/714/746 759/723/759 760/739/760\r\nf 746/714/746 760/739/760 747/724/747\r\nf 747/724/747 760/739/760 761/741/761\r\nf 747/724/747 761/741/761 748/725/748\r\nf 748/725/748 761/741/761 762/726/762\r\nf 748/725/748 762/726/762 749/716/749\r\nf 749/716/749 762/726/762 763/742/763\r\nf 749/716/749 763/742/763 750/728/750\r\nf 750/728/750 763/742/763 764/727/764\r\nf 750/728/750 764/727/764 751/729/751\r\nf 751/729/751 764/727/764 765/730/765\r\nf 751/729/751 765/730/765 752/731/752\r\nf 752/731/752 765/730/765 766/732/766\r\nf 752/731/752 766/732/766 753/733/753\r\nf 753/733/753 766/732/766 755/734/755\r\nf 753/733/753 755/734/755 742/718/742\r\nf 755/734/755 768/755/768 769/735/769\r\nf 755/734/755 769/735/769 756/719/756\r\nf 756/719/756 769/735/769 770/743/770\r\nf 756/719/756 770/743/770 757/721/757\r\nf 757/721/757 770/743/770 771/736/771\r\nf 757/721/757 771/736/771 758/722/758\r\nf 758/722/758 771/736/771 772/737/772\r\nf 758/722/758 772/737/772 759/723/759\r\nf 759/723/759 772/737/772 773/738/773\r\nf 759/723/759 773/738/773 760/739/760\r\nf 760/739/760 773/738/773 774/740/774\r\nf 760/739/760 774/740/774 761/741/761\r\nf 761/741/761 774/740/774 775/747/775\r\nf 761/741/761 775/747/775 762/726/762\r\nf 762/726/762 775/747/775 776/748/776\r\nf 762/726/762 776/748/776 763/742/763\r\nf 763/742/763 776/748/776 777/750/777\r\nf 763/742/763 777/750/777 764/727/764\r\nf 764/727/764 777/750/777 778/752/778\r\nf 764/727/764 778/752/778 765/730/765\r\nf 765/730/765 778/752/778 779/754/779\r\nf 765/730/765 779/754/779 766/732/766\r\nf 766/732/766 779/754/779 768/755/768\r\nf 766/732/766 768/755/768 755/734/755\r\nf 768/755/768 781/770/781 782/757/782\r\nf 768/755/768 782/757/782 769/735/769\r\nf 769/735/769 782/757/782 783/759/783\r\nf 769/735/769 783/759/783 770/743/770\r\nf 770/743/770 783/759/783 784/744/784\r\nf 770/743/770 784/744/784 771/736/771\r\nf 771/736/771 784/744/784 785/760/785\r\nf 771/736/771 785/760/785 772/737/772\r\nf 772/737/772 785/760/785 786/745/786\r\nf 772/737/772 786/745/786 773/738/773\r\nf 773/738/773 786/745/786 787/746/787\r\nf 773/738/773 787/746/787 774/740/774\r\nf 774/740/774 787/746/787 788/762/788\r\nf 774/740/774 788/762/788 775/747/775\r\nf 775/747/775 788/762/788 789/749/789\r\nf 775/747/775 789/749/789 776/748/776\r\nf 776/748/776 789/749/789 790/767/790\r\nf 776/748/776 790/767/790 777/750/777\r\nf 777/750/777 790/767/790 791/751/791\r\nf 777/750/777 791/751/791 778/752/778\r\nf 778/752/778 791/751/791 792/753/792\r\nf 778/752/778 792/753/792 779/754/779\r\nf 779/754/779 792/753/792 781/770/781\r\nf 779/754/779 781/770/781 768/755/768\r\nf 781/770/781 794/769/794 795/756/795\r\nf 781/770/781 795/756/795 782/757/782\r\nf 782/757/782 795/756/795 796/758/796\r\nf 782/757/782 796/758/796 783/759/783\r\nf 783/759/783 796/758/796 797/771/797\r\nf 783/759/783 797/771/797 784/744/784\r\nf 784/744/784 797/771/797 798/761/798\r\nf 784/744/784 798/761/798 785/760/785\r\nf 785/760/785 798/761/798 799/774/799\r\nf 785/760/785 799/774/799 786/745/786\r\nf 786/745/786 799/774/799 800/776/800\r\nf 786/745/786 800/776/800 787/746/787\r\nf 787/746/787 800/776/800 801/763/801\r\nf 787/746/787 801/763/801 788/762/788\r\nf 788/762/788 801/763/801 802/764/802\r\nf 788/762/788 802/764/802 789/749/789\r\nf 789/749/789 802/764/802 803/765/803\r\nf 789/749/789 803/765/803 790/767/790\r\nf 790/767/790 803/765/803 804/766/804\r\nf 790/767/790 804/766/804 791/751/791\r\nf 791/751/791 804/766/804 805/768/805\r\nf 791/751/791 805/768/805 792/753/792\r\nf 792/753/792 805/768/805 794/769/794\r\nf 792/753/792 794/769/794 781/770/781\r\nf 794/769/794 807/780/807 808/781/808\r\nf 794/769/794 808/781/808 795/756/795\r\nf 795/756/795 808/781/808 809/782/809\r\nf 795/756/795 809/782/809 796/758/796\r\nf 796/758/796 809/782/809 810/783/810\r\nf 796/758/796 810/783/810 797/771/797\r\nf 797/771/797 810/783/810 811/772/811\r\nf 797/771/797 811/772/811 798/761/798\r\nf 798/761/798 811/772/811 812/773/812\r\nf 798/761/798 812/773/812 799/774/799\r\nf 799/774/799 812/773/812 813/775/813\r\nf 799/774/799 813/775/813 800/776/800\r\nf 800/776/800 813/775/813 814/785/814\r\nf 800/776/800 814/785/814 801/763/801\r\nf 801/763/801 814/785/814 815/787/815\r\nf 801/763/801 815/787/815 802/764/802\r\nf 802/764/802 815/787/815 816/777/816\r\nf 802/764/802 816/777/816 803/765/803\r\nf 803/765/803 816/777/816 817/778/817\r\nf 803/765/803 817/778/817 804/766/804\r\nf 804/766/804 817/778/817 818/779/818\r\nf 804/766/804 818/779/818 805/768/805\r\nf 805/768/805 818/779/818 807/780/807\r\nf 805/768/805 807/780/807 794/769/794\r\nf 807/780/807 820/789/820 821/790/821\r\nf 807/780/807 821/790/821 808/781/808\r\nf 808/781/808 821/790/821 822/791/822\r\nf 808/781/808 822/791/822 809/782/809\r\nf 809/782/809 822/791/822 823/793/823\r\nf 809/782/809 823/793/823 810/783/810\r\nf 810/783/810 823/793/823 824/784/824\r\nf 810/783/810 824/784/824 811/772/811\r\nf 811/772/811 824/784/824 825/796/825\r\nf 811/772/811 825/796/825 812/773/812\r\nf 812/773/812 825/796/825 826/797/826\r\nf 812/773/812 826/797/826 813/775/813\r\nf 813/775/813 826/797/826 827/786/827\r\nf 813/775/813 827/786/827 814/785/814\r\nf 814/785/814 827/786/827 828/799/828\r\nf 814/785/814 828/799/828 815/787/815\r\nf 815/787/815 828/799/828 829/800/829\r\nf 815/787/815 829/800/829 816/777/816\r\nf 816/777/816 829/800/829 830/801/830\r\nf 816/777/816 830/801/830 817/778/817\r\nf 817/778/817 830/801/830 831/788/831\r\nf 817/778/817 831/788/831 818/779/818\r\nf 818/779/818 831/788/831 820/789/820\r\nf 818/779/818 820/789/820 807/780/807\r\nf 820/789/820 833/815/833 834/803/834\r\nf 820/789/820 834/803/834 821/790/821\r\nf 821/790/821 834/803/834 835/792/835\r\nf 821/790/821 835/792/835 822/791/822\r\nf 822/791/822 835/792/835 836/805/836\r\nf 822/791/822 836/805/836 823/793/823\r\nf 823/793/823 836/805/836 837/794/837\r\nf 823/793/823 837/794/837 824/784/824\r\nf 824/784/824 837/794/837 838/807/838\r\nf 824/784/824 838/807/838 825/796/825\r\nf 825/796/825 838/807/838 839/795/839\r\nf 825/796/825 839/795/839 826/797/826\r\nf 826/797/826 839/795/839 840/810/840\r\nf 826/797/826 840/810/840 827/786/827\r\nf 827/786/827 840/810/840 841/798/841\r\nf 827/786/827 841/798/841 828/799/828\r\nf 828/799/828 841/798/841 842/812/842\r\nf 828/799/828 842/812/842 829/800/829\r\nf 829/800/829 842/812/842 843/813/843\r\nf 829/800/829 843/813/843 830/801/830\r\nf 830/801/830 843/813/843 844/802/844\r\nf 830/801/830 844/802/844 831/788/831\r\nf 831/788/831 844/802/844 833/815/833\r\nf 831/788/831 833/815/833 820/789/820\r\nf 833/815/833 846/814/846 847/817/847\r\nf 833/815/833 847/817/847 834/803/834\r\nf 834/803/834 847/817/847 848/804/848\r\nf 834/803/834 848/804/848 835/792/835\r\nf 835/792/835 848/804/848 849/819/849\r\nf 835/792/835 849/819/849 836/805/836\r\nf 836/805/836 849/819/849 850/806/850\r\nf 836/805/836 850/806/850 837/794/837\r\nf 837/794/837 850/806/850 851/821/851\r\nf 837/794/837 851/821/851 838/807/838\r\nf 838/807/838 851/821/851 852/808/852\r\nf 838/807/838 852/808/852 839/795/839\r\nf 839/795/839 852/808/852 853/809/853\r\nf 839/795/839 853/809/853 840/810/840\r\nf 840/810/840 853/809/853 854/825/854\r\nf 840/810/840 854/825/854 841/798/841\r\nf 841/798/841 854/825/854 855/811/855\r\nf 841/798/841 855/811/855 842/812/842\r\nf 842/812/842 855/811/855 856/826/856\r\nf 842/812/842 856/826/856 843/813/843\r\nf 843/813/843 856/826/856 857/829/857\r\nf 843/813/843 857/829/857 844/802/844\r\nf 844/802/844 857/829/857 846/814/846\r\nf 844/802/844 846/814/846 833/815/833\r\nf 846/814/846 859/828/859 860/832/860\r\nf 846/814/846 860/832/860 847/817/847\r\nf 847/817/847 860/832/860 861/816/861\r\nf 847/817/847 861/816/861 848/804/848\r\nf 848/804/848 861/816/861 862/818/862\r\nf 848/804/848 862/818/862 849/819/849\r\nf 849/819/849 862/818/862 863/820/863\r\nf 849/819/849 863/820/863 850/806/850\r\nf 850/806/850 863/820/863 864/835/864\r\nf 850/806/850 864/835/864 851/821/851\r\nf 851/821/851 864/835/864 865/837/865\r\nf 851/821/851 865/837/865 852/808/852\r\nf 852/808/852 865/837/865 866/822/866\r\nf 852/808/852 866/822/866 853/809/853\r\nf 853/809/853 866/822/866 867/823/867\r\nf 853/809/853 867/823/867 854/825/854\r\nf 854/825/854 867/823/867 868/824/868\r\nf 854/825/854 868/824/868 855/811/855\r\nf 855/811/855 868/824/868 869/839/869\r\nf 855/811/855 869/839/869 856/826/856\r\nf 856/826/856 869/839/869 870/827/870\r\nf 856/826/856 870/827/870 857/829/857\r\nf 857/829/857 870/827/870 859/828/859\r\nf 857/829/857 859/828/859 846/814/846\r\nf 859/828/859 872/830/872 873/831/873\r\nf 859/828/859 873/831/873 860/832/860\r\nf 860/832/860 873/831/873 874/833/874\r\nf 860/832/860 874/833/874 861/816/861\r\nf 861/816/861 874/833/874 875/845/875\r\nf 861/816/861 875/845/875 862/818/862\r\nf 862/818/862 875/845/875 876/846/876\r\nf 862/818/862 876/846/876 863/820/863\r\nf 863/820/863 876/846/876 877/834/877\r\nf 863/820/863 877/834/877 864/835/864\r\nf 864/835/864 877/834/877 878/836/878\r\nf 864/835/864 878/836/878 865/837/865\r\nf 865/837/865 878/836/878 879/848/879\r\nf 865/837/865 879/848/879 866/822/866\r\nf 866/822/866 879/848/879 880/849/880\r\nf 866/822/866 880/849/880 867/823/867\r\nf 867/823/867 880/849/880 881/850/881\r\nf 867/823/867 881/850/881 868/824/868\r\nf 868/824/868 881/850/881 882/838/882\r\nf 868/824/868 882/838/882 869/839/869\r\nf 869/839/869 882/838/882 883/840/883\r\nf 869/839/869 883/840/883 870/827/870\r\nf 870/827/870 883/840/883 872/830/872\r\nf 870/827/870 872/830/872 859/828/859\r\nf 872/830/872 885/865/885 886/841/886\r\nf 872/830/872 886/841/886 873/831/873\r\nf 873/831/873 886/841/886 887/842/887\r\nf 873/831/873 887/842/887 874/833/874\r\nf 874/833/874 887/842/887 888/843/888\r\nf 874/833/874 888/843/888 875/845/875\r\nf 875/845/875 888/843/888 889/844/889\r\nf 875/845/875 889/844/889 876/846/876\r\nf 876/846/876 889/844/889 890/856/890\r\nf 876/846/876 890/856/890 877/834/877\r\nf 877/834/877 890/856/890 891/858/891\r\nf 877/834/877 891/858/891 878/836/878\r\nf 878/836/878 891/858/891 892/847/892\r\nf 878/836/878 892/847/892 879/848/879\r\nf 879/848/879 892/847/892 893/861/893\r\nf 879/848/879 893/861/893 880/849/880\r\nf 880/849/880 893/861/893 894/851/894\r\nf 880/849/880 894/851/894 881/850/881\r\nf 881/850/881 894/851/894 895/863/895\r\nf 881/850/881 895/863/895 882/838/882\r\nf 882/838/882 895/863/895 896/852/896\r\nf 882/838/882 896/852/896 883/840/883\r\nf 883/840/883 896/852/896 885/865/885\r\nf 883/840/883 885/865/885 872/830/872\r\nf 885/865/885 898/864/898 899/853/899\r\nf 885/865/885 899/853/899 886/841/886\r\nf 886/841/886 899/853/899 900/854/900\r\nf 886/841/886 900/854/900 887/842/887\r\nf 887/842/887 900/854/900 901/855/901\r\nf 887/842/887 901/855/901 888/843/888\r\nf 888/843/888 901/855/901 902/867/902\r\nf 888/843/888 902/867/902 889/844/889\r\nf 889/844/889 902/867/902 903/870/903\r\nf 889/844/889 903/870/903 890/856/890\r\nf 890/856/890 903/870/903 904/857/904\r\nf 890/856/890 904/857/904 891/858/891\r\nf 891/858/891 904/857/904 905/859/905\r\nf 891/858/891 905/859/905 892/847/892\r\nf 892/847/892 905/859/905 906/860/906\r\nf 892/847/892 906/860/906 893/861/893\r\nf 893/861/893 906/860/906 907/862/907\r\nf 893/861/893 907/862/907 894/851/894\r\nf 894/851/894 907/862/907 908/874/908\r\nf 894/851/894 908/874/908 895/863/895\r\nf 895/863/895 908/874/908 909/875/909\r\nf 895/863/895 909/875/909 896/852/896\r\nf 896/852/896 909/875/909 898/864/898\r\nf 896/852/896 898/864/898 885/865/885\r\nf 898/864/898 911/876/911 912/866/912\r\nf 898/864/898 912/866/912 899/853/899\r\nf 899/853/899 912/866/912 913/877/913\r\nf 899/853/899 913/877/913 900/854/900\r\nf 900/854/900 913/877/913 914/880/914\r\nf 900/854/900 914/880/914 901/855/901\r\nf 901/855/901 914/880/914 915/868/915\r\nf 901/855/901 915/868/915 902/867/902\r\nf 902/867/902 915/868/915 916/869/916\r\nf 902/867/902 916/869/916 903/870/903\r\nf 903/870/903 916/869/916 917/871/917\r\nf 903/870/903 917/871/917 904/857/904\r\nf 904/857/904 917/871/917 918/883/918\r\nf 904/857/904 918/883/918 905/859/905\r\nf 905/859/905 918/883/918 919/872/919\r\nf 905/859/905 919/872/919 906/860/906\r\nf 906/860/906 919/872/919 920/873/920\r\nf 906/860/906 920/873/920 907/862/907\r\nf 907/862/907 920/873/920 921/886/921\r\nf 907/862/907 921/886/921 908/874/908\r\nf 908/874/908 921/886/921 922/887/922\r\nf 908/874/908 922/887/922 909/875/909\r\nf 909/875/909 922/887/922 911/876/911\r\nf 909/875/909 911/876/911 898/864/898\r\nf 911/876/911 924/888/924 925/890/925\r\nf 911/876/911 925/890/925 912/866/912\r\nf 912/866/912 925/890/925 926/878/926\r\nf 912/866/912 926/878/926 913/877/913\r\nf 913/877/913 926/878/926 927/879/927\r\nf 913/877/913 927/879/927 914/880/914\r\nf 914/880/914 927/879/927 928/893/928\r\nf 914/880/914 928/893/928 915/868/915\r\nf 915/868/915 928/893/928 929/881/929\r\nf 915/868/915 929/881/929 916/869/916\r\nf 916/869/916 929/881/929 930/895/930\r\nf 916/869/916 930/895/930 917/871/917\r\nf 917/871/917 930/895/930 931/882/931\r\nf 917/871/917 931/882/931 918/883/918\r\nf 918/883/918 931/882/931 932/897/932\r\nf 918/883/918 932/897/932 919/872/919\r\nf 919/872/919 932/897/932 933/884/933\r\nf 919/872/919 933/884/933 920/873/920\r\nf 920/873/920 933/884/933 934/885/934\r\nf 920/873/920 934/885/934 921/886/921\r\nf 921/886/921 934/885/934 935/901/935\r\nf 921/886/921 935/901/935 922/887/922\r\nf 922/887/922 935/901/935 924/888/924\r\nf 922/887/922 924/888/924 911/876/911\r\nf 924/888/924 937/902/937 938/889/938\r\nf 924/888/924 938/889/938 925/890/925\r\nf 925/890/925 938/889/938 939/891/939\r\nf 925/890/925 939/891/939 926/878/926\r\nf 926/878/926 939/891/939 940/903/940\r\nf 926/878/926 940/903/940 927/879/927\r\nf 927/879/927 940/903/940 941/892/941\r\nf 927/879/927 941/892/941 928/893/928\r\nf 928/893/928 941/892/941 942/894/942\r\nf 928/893/928 942/894/942 929/881/929\r\nf 929/881/929 942/894/942 943/907/943\r\nf 929/881/929 943/907/943 930/895/930\r\nf 930/895/930 943/907/943 944/896/944\r\nf 930/895/930 944/896/944 931/882/931\r\nf 931/882/931 944/896/944 945/898/945\r\nf 931/882/931 945/898/945 932/897/932\r\nf 932/897/932 945/898/945 946/899/946\r\nf 932/897/932 946/899/946 933/884/933\r\nf 933/884/933 946/899/946 947/900/947\r\nf 933/884/933 947/900/947 934/885/934\r\nf 934/885/934 947/900/947 948/908/948\r\nf 934/885/934 948/908/948 935/901/935\r\nf 935/901/935 948/908/948 937/902/937\r\nf 935/901/935 937/902/937 924/888/924\r\nf 937/902/937 950/910/950 951/911/951\r\nf 937/902/937 951/911/951 938/889/938\r\nf 938/889/938 951/911/951 952/913/952\r\nf 938/889/938 952/913/952 939/891/939\r\nf 939/891/939 952/913/952 953/904/953\r\nf 939/891/939 953/904/953 940/903/940\r\nf 940/903/940 953/904/953 954/905/954\r\nf 940/903/940 954/905/954 941/892/941\r\nf 941/892/941 954/905/954 955/906/955\r\nf 941/892/941 955/906/955 942/894/942\r\nf 942/894/942 955/906/955 956/916/956\r\nf 942/894/942 956/916/956 943/907/943\r\nf 943/907/943 956/916/956 957/917/957\r\nf 943/907/943 957/917/957 944/896/944\r\nf 944/896/944 957/917/957 958/918/958\r\nf 944/896/944 958/918/958 945/898/945\r\nf 945/898/945 958/918/958 959/919/959\r\nf 945/898/945 959/919/959 946/899/946\r\nf 946/899/946 959/919/959 960/921/960\r\nf 946/899/946 960/921/960 947/900/947\r\nf 947/900/947 960/921/960 961/909/961\r\nf 947/900/947 961/909/961 948/908/948\r\nf 948/908/948 961/909/961 950/910/950\r\nf 948/908/948 950/910/950 937/902/937\r\nf 950/910/950 963/924/963 964/912/964\r\nf 950/910/950 964/912/964 951/911/951\r\nf 951/911/951 964/912/964 965/926/965\r\nf 951/911/951 965/926/965 952/913/952\r\nf 952/913/952 965/926/965 966/927/966\r\nf 952/913/952 966/927/966 953/904/953\r\nf 953/904/953 966/927/966 967/928/967\r\nf 953/904/953 967/928/967 954/905/954\r\nf 954/905/954 967/928/967 968/914/968\r\nf 954/905/954 968/914/968 955/906/955\r\nf 955/906/955 968/914/968 969/915/969\r\nf 955/906/955 969/915/969 956/916/956\r\nf 956/916/956 969/915/969 970/930/970\r\nf 956/916/956 970/930/970 957/917/957\r\nf 957/917/957 970/930/970 971/931/971\r\nf 957/917/957 971/931/971 958/918/958\r\nf 958/918/958 971/931/971 972/920/972\r\nf 958/918/958 972/920/972 959/919/959\r\nf 959/919/959 972/920/972 973/922/973\r\nf 959/919/959 973/922/973 960/921/960\r\nf 960/921/960 973/922/973 974/923/974\r\nf 960/921/960 974/923/974 961/909/961\r\nf 961/909/961 974/923/974 963/924/963\r\nf 961/909/961 963/924/963 950/910/950\r\nf 963/924/963 976/941/976 977/925/977\r\nf 963/924/963 977/925/977 964/912/964\r\nf 964/912/964 977/925/977 978/944/978\r\nf 964/912/964 978/944/978 965/926/965\r\nf 965/926/965 978/944/978 979/946/979\r\nf 965/926/965 979/946/979 966/927/966\r\nf 966/927/966 979/946/979 980/947/980\r\nf 966/927/966 980/947/980 967/928/967\r\nf 967/928/967 980/947/980 981/949/981\r\nf 967/928/967 981/949/981 968/914/968\r\nf 968/914/968 981/949/981 982/929/982\r\nf 968/914/968 982/929/982 969/915/969\r\nf 969/915/969 982/929/982 983/952/983\r\nf 969/915/969 983/952/983 970/930/970\r\nf 970/930/970 983/952/983 984/953/984\r\nf 970/930/970 984/953/984 971/931/971\r\nf 971/931/971 984/953/984 985/932/985\r\nf 971/931/971 985/932/985 972/920/972\r\nf 972/933/972 985/934/985 986/935/986\r\nf 972/933/972 986/935/986 973/936/973\r\nf 973/936/973 986/935/986 987/937/987\r\nf 973/936/973 987/937/987 974/938/974\r\nf 974/938/974 987/937/987 976/939/976\r\nf 974/923/974 976/941/976 963/924/963\r\nf 976/939/976 989/956/989 990/940/990\r\nf 976/941/976 990/942/990 977/925/977\r\nf 977/925/977 990/942/990 991/943/991\r\nf 977/925/977 991/943/991 978/944/978\r\nf 978/944/978 991/943/991 992/945/992\r\nf 978/944/978 992/945/992 979/946/979\r\nf 979/946/979 992/945/992 993/948/993\r\nf 979/946/979 993/948/993 980/947/980\r\nf 980/947/980 993/948/993 994/957/994\r\nf 980/947/980 994/957/994 981/949/981\r\nf 981/949/981 994/957/994 995/959/995\r\nf 981/949/981 995/959/995 982/929/982\r\nf 982/929/982 995/959/995 996/950/996\r\nf 982/929/982 996/950/996 983/952/983\r\nf 983/952/983 996/950/996 997/951/997\r\nf 983/952/983 997/951/997 984/953/984\r\nf 984/953/984 997/951/997 998/954/998\r\nf 984/953/984 998/954/998 985/932/985\r\nf 985/934/985 998/964/998 999/955/999\r\nf 985/934/985 999/955/999 986/935/986\r\nf 986/935/986 999/955/999 1000/967/1000\r\nf 986/935/986 1000/967/1000 987/937/987\r\nf 987/937/987 1000/967/1000 989/956/989\r\nf 987/937/987 989/956/989 976/939/976\r\nf 989/956/989 1002/968/1002 1003/970/1003\r\nf 989/956/989 1003/970/1003 990/940/990\r\nf 990/942/990 1003/972/1003 1004/974/1004\r\nf 990/942/990 1004/974/1004 991/943/991\r\nf 991/943/991 1004/974/1004 1005/975/1005\r\nf 991/943/991 1005/975/1005 992/945/992\r\nf 992/945/992 1005/975/1005 1006/976/1006\r\nf 992/945/992 1006/976/1006 993/948/993\r\nf 993/948/993 1006/976/1006 1007/958/1007\r\nf 993/948/993 1007/958/1007 994/957/994\r\nf 994/957/994 1007/958/1007 1008/979/1008\r\nf 994/957/994 1008/979/1008 995/959/995\r\nf 995/959/995 1008/979/1008 1009/960/1009\r\nf 995/959/995 1009/960/1009 996/950/996\r\nf 996/950/996 1009/960/1009 1010/961/1010\r\nf 996/950/996 1010/961/1010 997/951/997\r\nf 997/963/997 1010/962/1010 1011/965/1011\r\nf 997/963/997 1011/965/1011 998/964/998\r\nf 998/964/998 1011/965/1011 1012/966/1012\r\nf 998/964/998 1012/966/1012 999/955/999\r\nf 999/955/999 1012/966/1012 1013/984/1013\r\nf 999/955/999 1013/984/1013 1000/967/1000\r\nf 1000/967/1000 1013/984/1013 1002/968/1002\r\nf 1000/967/1000 1002/968/1002 989/956/989\r\nf 1002/968/1002 1015/985/1015 1016/969/1016\r\nf 1002/968/1002 1016/969/1016 1003/970/1003\r\nf 1003/970/1003 1016/969/1016 1017/971/1017\r\nf 1003/972/1003 1017/973/1017 1004/974/1004\r\nf 1004/974/1004 1017/973/1017 1018/988/1018\r\nf 1004/974/1004 1018/988/1018 1005/975/1005\r\nf 1005/975/1005 1018/988/1018 1019/990/1019\r\nf 1005/975/1005 1019/990/1019 1006/976/1006\r\nf 1006/976/1006 1019/990/1019 1020/991/1020\r\nf 1006/976/1006 1020/991/1020 1007/958/1007\r\nf 1007/958/1007 1020/991/1020 1021/977/1021\r\nf 1007/958/1007 1021/977/1021 1008/979/1008\r\nf 1008/979/1008 1021/977/1021 1022/978/1022\r\nf 1008/979/1008 1022/978/1022 1009/960/1009\r\nf 1009/980/1009 1022/995/1022 1023/981/1023\r\nf 1009/980/1009 1023/981/1023 1010/962/1010\r\nf 1010/962/1010 1023/981/1023 1024/982/1024\r\nf 1010/962/1010 1024/982/1024 1011/965/1011\r\nf 1011/965/1011 1024/982/1024 1025/983/1025\r\nf 1011/965/1011 1025/983/1025 1012/966/1012\r\nf 1012/966/1012 1025/983/1025 1026/997/1026\r\nf 1012/966/1012 1026/997/1026 1013/984/1013\r\nf 1013/984/1013 1026/997/1026 1015/985/1015\r\nf 1013/984/1013 1015/985/1015 1002/968/1002\r\nf 1015/985/1015 1028/998/1028 1029/1000/1029\r\nf 1015/985/1015 1029/1000/1029 1016/969/1016\r\nf 1016/969/1016 1029/1000/1029 1030/986/1030\r\nf 1016/969/1016 1030/986/1030 1017/971/1017\r\nf 1017/971/1017 1030/986/1030 1031/1001/1031\r\nf 1017/973/1017 1031/987/1031 1018/988/1018\r\nf 1018/988/1018 1031/987/1031 1032/989/1032\r\nf 1018/988/1018 1032/989/1032 1019/990/1019\r\nf 1019/990/1019 1032/989/1032 1033/992/1033\r\nf 1019/990/1019 1033/992/1033 1020/991/1020\r\nf 1020/991/1020 1033/992/1033 1034/993/1034\r\nf 1020/991/1020 1034/993/1034 1021/977/1021\r\nf 1021/994/1021 1034/1007/1034 1035/1009/1035\r\nf 1021/994/1021 1035/1009/1035 1022/995/1022\r\nf 1022/995/1022 1035/1009/1035 1036/1010/1036\r\nf 1022/995/1022 1036/1010/1036 1023/981/1023\r\nf 1023/981/1023 1036/1010/1036 1037/996/1037\r\nf 1023/981/1023 1037/996/1037 1024/982/1024\r\nf 1024/982/1024 1037/996/1037 1038/1012/1038\r\nf 1024/982/1024 1038/1012/1038 1025/983/1025\r\nf 1025/983/1025 1038/1012/1038 1039/1014/1039\r\nf 1025/983/1025 1039/1014/1039 1026/997/1026\r\nf 1026/997/1026 1039/1014/1039 1028/998/1028\r\nf 1026/997/1026 1028/998/1028 1015/985/1015\r\nf 1028/998/1028 1041/1015/1041 1042/999/1042\r\nf 1028/998/1028 1042/999/1042 1029/1000/1029\r\nf 1029/1000/1029 1042/999/1042 1043/1017/1043\r\nf 1029/1000/1029 1043/1017/1043 1030/986/1030\r\nf 1030/986/1030 1043/1017/1043 1044/1002/1044\r\nf 1030/986/1030 1044/1002/1044 1031/1001/1031\r\nf 1031/1001/1031 1044/1002/1044 1045/1019/1045\r\nf 1031/1001/1031 1045/1019/1045 1032/1003/1032\r\nf 1032/1003/1032 1045/1019/1045 1046/1004/1046\r\nf 1032/1003/1032 1046/1004/1046 1033/1005/1033\r\nf 1033/1005/1033 1046/1004/1046 1047/1006/1047\r\nf 1033/1005/1033 1047/1006/1047 1034/1007/1034\r\nf 1034/1007/1034 1047/1006/1047 1048/1008/1048\r\nf 1034/1007/1034 1048/1008/1048 1035/1009/1035\r\nf 1035/1009/1035 1048/1008/1048 1049/1023/1049\r\nf 1035/1009/1035 1049/1023/1049 1036/1010/1036\r\nf 1036/1010/1036 1049/1023/1049 1050/1011/1050\r\nf 1036/1010/1036 1050/1011/1050 1037/996/1037\r\nf 1037/996/1037 1050/1011/1050 1051/1013/1051\r\nf 1037/996/1037 1051/1013/1051 1038/1012/1038\r\nf 1038/1012/1038 1051/1013/1051 1052/1026/1052\r\nf 1038/1012/1038 1052/1026/1052 1039/1014/1039\r\nf 1039/1014/1039 1052/1026/1052 1041/1015/1041\r\nf 1039/1014/1039 1041/1015/1041 1028/998/1028\r\nf 1041/1015/1041 1054/1016/1054 1055/1029/1055\r\nf 1041/1015/1041 1055/1029/1055 1042/999/1042\r\nf 1042/999/1042 1055/1029/1055 1056/1030/1056\r\nf 1042/999/1042 1056/1030/1056 1043/1017/1043\r\nf 1043/1017/1043 1056/1030/1056 1057/1018/1057\r\nf 1043/1017/1043 1057/1018/1057 1044/1002/1044\r\nf 1044/1002/1044 1057/1018/1057 1058/1033/1058\r\nf 1044/1002/1044 1058/1033/1058 1045/1019/1045\r\nf 1045/1019/1045 1058/1033/1058 1059/1020/1059\r\nf 1045/1019/1045 1059/1020/1059 1046/1004/1046\r\nf 1046/1004/1046 1059/1020/1059 1060/1021/1060\r\nf 1046/1004/1046 1060/1021/1060 1047/1006/1047\r\nf 1047/1006/1047 1060/1021/1060 1061/1022/1061\r\nf 1047/1006/1047 1061/1022/1061 1048/1008/1048\r\nf 1048/1008/1048 1061/1022/1061 1062/1024/1062\r\nf 1048/1008/1048 1062/1024/1062 1049/1023/1049\r\nf 1049/1023/1049 1062/1024/1062 1063/1025/1063\r\nf 1049/1023/1049 1063/1025/1063 1050/1011/1050\r\nf 1050/1011/1050 1063/1025/1063 1064/1037/1064\r\nf 1050/1011/1050 1064/1037/1064 1051/1013/1051\r\nf 1051/1013/1051 1064/1037/1064 1065/1027/1065\r\nf 1051/1013/1051 1065/1027/1065 1052/1026/1052\r\nf 1052/1026/1052 1065/1027/1065 1054/1016/1054\r\nf 1052/1026/1052 1054/1016/1054 1041/1015/1041\r\nf 1054/1016/1054 1067/1038/1067 1068/1028/1068\r\nf 1054/1016/1054 1068/1028/1068 1055/1029/1055\r\nf 1055/1029/1055 1068/1028/1068 1069/1041/1069\r\nf 1055/1029/1055 1069/1041/1069 1056/1030/1056\r\nf 1056/1030/1056 1069/1041/1069 1070/1031/1070\r\nf 1056/1030/1056 1070/1031/1070 1057/1018/1057\r\nf 1057/1018/1057 1070/1031/1070 1071/1032/1071\r\nf 1057/1018/1057 1071/1032/1071 1058/1033/1058\r\nf 1058/1033/1058 1071/1032/1071 1072/1034/1072\r\nf 1058/1033/1058 1072/1034/1072 1059/1020/1059\r\nf 1059/1020/1059 1072/1034/1072 1073/1043/1073\r\nf 1059/1020/1059 1073/1043/1073 1060/1021/1060\r\nf 1060/1021/1060 1073/1043/1073 1074/1045/1074\r\nf 1060/1021/1060 1074/1045/1074 1061/1022/1061\r\nf 1061/1022/1061 1074/1045/1074 1075/1035/1075\r\nf 1061/1022/1061 1075/1035/1075 1062/1024/1062\r\nf 1062/1024/1062 1075/1035/1075 1076/1046/1076\r\nf 1062/1024/1062 1076/1046/1076 1063/1025/1063\r\nf 1063/1025/1063 1076/1046/1076 1077/1036/1077\r\nf 1063/1025/1063 1077/1036/1077 1064/1037/1064\r\nf 1064/1037/1064 1077/1036/1077 1078/1048/1078\r\nf 1064/1037/1064 1078/1048/1078 1065/1027/1065\r\nf 1065/1027/1065 1078/1048/1078 1067/1038/1067\r\nf 1065/1027/1065 1067/1038/1067 1054/1016/1054\r\nf 1067/1038/1067 1080/1039/1080 1081/1040/1081\r\nf 1067/1038/1067 1081/1040/1081 1068/1028/1068\r\nf 1068/1028/1068 1081/1040/1081 1082/1049/1082\r\nf 1068/1028/1068 1082/1049/1082 1069/1041/1069\r\nf 1069/1041/1069 1082/1049/1082 1083/1051/1083\r\nf 1069/1041/1069 1083/1051/1083 1070/1031/1070\r\nf 1070/1031/1070 1083/1051/1083 1084/1052/1084\r\nf 1070/1031/1070 1084/1052/1084 1071/1032/1071\r\nf 1071/1032/1071 1084/1052/1084 1085/1053/1085\r\nf 1071/1032/1071 1085/1053/1085 1072/1034/1072\r\nf 1072/1034/1072 1085/1053/1085 1086/1042/1086\r\nf 1072/1034/1072 1086/1042/1086 1073/1043/1073\r\nf 1073/1043/1073 1086/1042/1086 1087/1044/1087\r\nf 1073/1043/1073 1087/1044/1087 1074/1045/1074\r\nf 1074/1045/1074 1087/1044/1087 1088/1055/1088\r\nf 1074/1045/1074 1088/1055/1088 1075/1035/1075\r\nf 1075/1035/1075 1088/1055/1088 1089/1057/1089\r\nf 1075/1035/1075 1089/1057/1089 1076/1046/1076\r\nf 1076/1046/1076 1089/1057/1089 1090/1058/1090\r\nf 1076/1046/1076 1090/1058/1090 1077/1036/1077\r\nf 1077/1036/1077 1090/1058/1090 1091/1047/1091\r\nf 1077/1036/1077 1091/1047/1091 1078/1048/1078\r\nf 1078/1048/1078 1091/1047/1091 1080/1039/1080\r\nf 1078/1048/1078 1080/1039/1080 1067/1038/1067\r\nf 1080/1039/1080 1093/1059/1093 1094/1061/1094\r\nf 1080/1039/1080 1094/1061/1094 1081/1040/1081\r\nf 1081/1040/1081 1094/1061/1094 1095/1062/1095\r\nf 1081/1040/1081 1095/1062/1095 1082/1049/1082\r\nf 1082/1049/1082 1095/1062/1095 1096/1050/1096\r\nf 1082/1049/1082 1096/1050/1096 1083/1051/1083\r\nf 1083/1051/1083 1096/1050/1096 1097/1064/1097\r\nf 1083/1051/1083 1097/1064/1097 1084/1052/1084\r\nf 1084/1052/1084 1097/1064/1097 1098/1066/1098\r\nf 1084/1052/1084 1098/1066/1098 1085/1053/1085\r\nf 1085/1053/1085 1098/1066/1098 1099/1054/1099\r\nf 1085/1053/1085 1099/1054/1099 1086/1042/1086\r\nf 1086/1042/1086 1099/1054/1099 1100/1068/1100\r\nf 1086/1042/1086 1100/1068/1100 1087/1044/1087\r\nf 1087/1044/1087 1100/1068/1100 1101/1071/1101\r\nf 1087/1044/1087 1101/1071/1101 1088/1055/1088\r\nf 1088/1055/1088 1101/1071/1101 1102/1056/1102\r\nf 1088/1055/1088 1102/1056/1102 1089/1057/1089\r\nf 1089/1057/1089 1102/1056/1102 1103/1073/1103\r\nf 1089/1057/1089 1103/1073/1103 1090/1058/1090\r\nf 1090/1058/1090 1103/1073/1103 1104/1074/1104\r\nf 1090/1058/1090 1104/1074/1104 1091/1047/1091\r\nf 1091/1047/1091 1104/1074/1104 1093/1059/1093\r\nf 1091/1047/1091 1093/1059/1093 1080/1039/1080\r\nf 1093/1059/1093 1106/1088/1106 1107/1060/1107\r\nf 1093/1059/1093 1107/1060/1107 1094/1061/1094\r\nf 1094/1061/1094 1107/1060/1107 1108/1076/1108\r\nf 1094/1061/1094 1108/1076/1108 1095/1062/1095\r\nf 1095/1062/1095 1108/1076/1108 1109/1078/1109\r\nf 1095/1062/1095 1109/1078/1109 1096/1050/1096\r\nf 1096/1050/1096 1109/1078/1109 1110/1063/1110\r\nf 1096/1050/1096 1110/1063/1110 1097/1064/1097\r\nf 1097/1064/1097 1110/1063/1110 1111/1065/1111\r\nf 1097/1064/1097 1111/1065/1111 1098/1066/1098\r\nf 1098/1066/1098 1111/1065/1111 1112/1082/1112\r\nf 1098/1066/1098 1112/1082/1112 1099/1054/1099\r\nf 1099/1054/1099 1112/1082/1112 1113/1067/1113\r\nf 1099/1054/1099 1113/1067/1113 1100/1068/1100\r\nf 1100/1068/1100 1113/1067/1113 1114/1069/1114\r\nf 1100/1068/1100 1114/1069/1114 1101/1071/1101\r\nf 1101/1071/1101 1114/1069/1114 1115/1070/1115\r\nf 1101/1071/1101 1115/1070/1115 1102/1056/1102\r\nf 1102/1056/1102 1115/1070/1115 1116/1072/1116\r\nf 1102/1056/1102 1116/1072/1116 1103/1073/1103\r\nf 1103/1073/1103 1116/1072/1116 1117/1087/1117\r\nf 1103/1073/1103 1117/1087/1117 1104/1074/1104\r\nf 1104/1074/1104 1117/1087/1117 1106/1088/1106\r\nf 1104/1074/1104 1106/1088/1106 1093/1059/1093\r\nf 1106/1088/1106 1119/1089/1119 1120/1075/1120\r\nf 1106/1088/1106 1120/1075/1120 1107/1060/1107\r\nf 1107/1060/1107 1120/1075/1120 1121/1077/1121\r\nf 1107/1060/1107 1121/1077/1121 1108/1076/1108\r\nf 1108/1076/1108 1121/1077/1121 1122/1079/1122\r\nf 1108/1076/1108 1122/1079/1122 1109/1078/1109\r\nf 1109/1078/1109 1122/1079/1122 1123/1091/1123\r\nf 1109/1078/1109 1123/1091/1123 1110/1063/1110\r\nf 1110/1063/1110 1123/1091/1123 1124/1092/1124\r\nf 1110/1063/1110 1124/1092/1124 1111/1065/1111\r\nf 1111/1065/1111 1124/1092/1124 1125/1080/1125\r\nf 1111/1065/1111 1125/1080/1125 1112/1082/1112\r\nf 1112/1082/1112 1125/1080/1125 1126/1081/1126\r\nf 1112/1082/1112 1126/1081/1126 1113/1067/1113\r\nf 1113/1067/1113 1126/1081/1126 1127/1083/1127\r\nf 1113/1067/1113 1127/1083/1127 1114/1069/1114\r\nf 1114/1069/1114 1127/1083/1127 1128/1084/1128\r\nf 1114/1069/1114 1128/1084/1128 1115/1070/1115\r\nf 1115/1070/1115 1128/1084/1128 1129/1085/1129\r\nf 1115/1070/1115 1129/1085/1129 1116/1072/1116\r\nf 1116/1072/1116 1129/1085/1129 1130/1086/1130\r\nf 1116/1072/1116 1130/1086/1130 1117/1087/1117\r\nf 1117/1087/1117 1130/1086/1130 1119/1089/1119\r\nf 1117/1087/1117 1119/1089/1119 1106/1088/1106\r\nf 1119/1089/1119 1132/1096/1132 1133/1090/1133\r\nf 1119/1089/1119 1133/1090/1133 1120/1075/1120\r\nf 1120/1075/1120 1133/1090/1133 1134/1098/1134\r\nf 1120/1075/1120 1134/1098/1134 1121/1077/1121\r\nf 1121/1077/1121 1134/1098/1134 1135/1101/1135\r\nf 1121/1077/1121 1135/1101/1135 1122/1079/1122\r\nf 1122/1079/1122 1135/1101/1135 1136/1102/1136\r\nf 1122/1079/1122 1136/1102/1136 1123/1091/1123\r\nf 1123/1091/1123 1136/1102/1136 1137/1093/1137\r\nf 1123/1091/1123 1137/1093/1137 1124/1092/1124\r\nf 1124/1092/1124 1137/1093/1137 1138/1104/1138\r\nf 1124/1092/1124 1138/1104/1138 1125/1080/1125\r\nf 1125/1080/1125 1138/1104/1138 1139/1106/1139\r\nf 1125/1080/1125 1139/1106/1139 1126/1081/1126\r\nf 1126/1081/1126 1139/1106/1139 1140/1108/1140\r\nf 1126/1081/1126 1140/1108/1140 1127/1083/1127\r\nf 1127/1083/1127 1140/1108/1140 1141/1109/1141\r\nf 1127/1083/1127 1141/1109/1141 1128/1084/1128\r\nf 1128/1084/1128 1141/1109/1141 1142/1094/1142\r\nf 1128/1084/1128 1142/1094/1142 1129/1085/1129\r\nf 1129/1085/1129 1142/1094/1142 1143/1095/1143\r\nf 1129/1085/1129 1143/1095/1143 1130/1086/1130\r\nf 1130/1086/1130 1143/1095/1143 1132/1096/1132\r\nf 1130/1086/1130 1132/1096/1132 1119/1089/1119\r\nf 1132/1096/1132 1145/1112/1145 1146/1097/1146\r\nf 1132/1096/1132 1146/1097/1146 1133/1090/1133\r\nf 1133/1090/1133 1146/1097/1146 1147/1114/1147\r\nf 1133/1090/1133 1147/1114/1147 1134/1098/1134\r\nf 1134/1098/1134 1147/1114/1147 1148/1099/1148\r\nf 1134/1098/1134 1148/1099/1148 1135/1101/1135\r\nf 1135/1101/1135 1148/1099/1148 1149/1100/1149\r\nf 1135/1101/1135 1149/1100/1149 1136/1102/1136\r\nf 1136/1102/1136 1149/1100/1149 1150/1103/1150\r\nf 1136/1102/1136 1150/1103/1150 1137/1093/1137\r\nf 1137/1093/1137 1150/1103/1150 1151/1118/1151\r\nf 1137/1093/1137 1151/1118/1151 1138/1104/1138\r\nf 1138/1104/1138 1151/1118/1151 1152/1105/1152\r\nf 1138/1104/1138 1152/1105/1152 1139/1106/1139\r\nf 1139/1106/1139 1152/1105/1152 1153/1107/1153\r\nf 1139/1106/1139 1153/1107/1153 1140/1108/1140\r\nf 1140/1108/1140 1153/1107/1153 1154/1120/1154\r\nf 1140/1108/1140 1154/1120/1154 1141/1109/1141\r\nf 1141/1109/1141 1154/1120/1154 1155/1110/1155\r\nf 1141/1109/1141 1155/1110/1155 1142/1094/1142\r\nf 1142/1094/1142 1155/1110/1155 1156/1111/1156\r\nf 1142/1094/1142 1156/1111/1156 1143/1095/1143\r\nf 1143/1095/1143 1156/1111/1156 1145/1112/1145\r\nf 1143/1095/1143 1145/1112/1145 1132/1096/1132\r\nf 1145/1112/1145 1158/1122/1158 1159/1113/1159\r\nf 1145/1112/1145 1159/1113/1159 1146/1097/1146\r\nf 1146/1097/1146 1159/1113/1159 1160/1124/1160\r\nf 1146/1097/1146 1160/1124/1160 1147/1114/1147\r\nf 1147/1114/1147 1160/1124/1160 1161/1115/1161\r\nf 1147/1114/1147 1161/1115/1161 1148/1099/1148\r\nf 1148/1099/1148 1161/1115/1161 1162/1116/1162\r\nf 1148/1099/1148 1162/1116/1162 1149/1100/1149\r\nf 1149/1100/1149 1162/1116/1162 1163/1117/1163\r\nf 1149/1100/1149 1163/1117/1163 1150/1103/1150\r\nf 1150/1103/1150 1163/1117/1163 1164/1119/1164\r\nf 1150/1103/1150 1164/1119/1164 1151/1118/1151\r\nf 1151/1118/1151 1164/1119/1164 1165/1126/1165\r\nf 1151/1118/1151 1165/1126/1165 1152/1105/1152\r\nf 1152/1105/1152 1165/1126/1165 1166/1127/1166\r\nf 1152/1105/1152 1166/1127/1166 1153/1107/1153\r\nf 1153/1107/1153 1166/1127/1166 1167/1128/1167\r\nf 1153/1107/1153 1167/1128/1167 1154/1120/1154\r\nf 1154/1120/1154 1167/1128/1167 1168/1121/1168\r\nf 1154/1120/1154 1168/1121/1168 1155/1110/1155\r\nf 1155/1110/1155 1168/1121/1168 1169/1131/1169\r\nf 1155/1110/1155 1169/1131/1169 1156/1111/1156\r\nf 1156/1111/1156 1169/1131/1169 1158/1122/1158\r\nf 1156/1111/1156 1158/1122/1158 1145/1112/1145\r\nf 1158/1122/1158 1171/1144/1171 1172/1133/1172\r\nf 1158/1122/1158 1172/1133/1172 1159/1113/1159\r\nf 1159/1113/1159 1172/1133/1172 1173/1123/1173\r\nf 1159/1113/1159 1173/1123/1173 1160/1124/1160\r\nf 1160/1124/1160 1173/1123/1173 1174/1135/1174\r\nf 1160/1124/1160 1174/1135/1174 1161/1115/1161\r\nf 1161/1115/1161 1174/1135/1174 1175/1125/1175\r\nf 1161/1115/1161 1175/1125/1175 1162/1116/1162\r\nf 1162/1116/1162 1175/1125/1175 1176/1138/1176\r\nf 1162/1116/1162 1176/1138/1176 1163/1117/1163\r\nf 1163/1117/1163 1176/1138/1176 1177/1139/1177\r\nf 1163/1117/1163 1177/1139/1177 1164/1119/1164\r\nf 1164/1119/1164 1177/1139/1177 1178/1141/1178\r\nf 1164/1119/1164 1178/1141/1178 1165/1126/1165\r\nf 1165/1126/1165 1178/1141/1178 1179/1142/1179\r\nf 1165/1126/1165 1179/1142/1179 1166/1127/1166\r\nf 1166/1127/1166 1179/1142/1179 1180/1143/1180\r\nf 1166/1127/1166 1180/1143/1180 1167/1128/1167\r\nf 1167/1128/1167 1180/1143/1180 1181/1129/1181\r\nf 1167/1128/1167 1181/1129/1181 1168/1121/1168\r\nf 1168/1121/1168 1181/1129/1181 1182/1130/1182\r\nf 1168/1121/1168 1182/1130/1182 1169/1131/1169\r\nf 1169/1131/1169 1182/1130/1182 1171/1144/1171\r\nf 1169/1131/1169 1171/1144/1171 1158/1122/1158\r\nf 1171/1144/1171 1184/1132/1184 1185/1147/1185\r\nf 1171/1144/1171 1185/1147/1185 1172/1133/1172\r\nf 1172/1133/1172 1185/1147/1185 1186/1149/1186\r\nf 1172/1133/1172 1186/1149/1186 1173/1123/1173\r\nf 1173/1123/1173 1186/1149/1186 1187/1134/1187\r\nf 1173/1123/1173 1187/1134/1187 1174/1135/1174\r\nf 1174/1135/1174 1187/1134/1187 1188/1136/1188\r\nf 1174/1135/1174 1188/1136/1188 1175/1125/1175\r\nf 1175/1125/1175 1188/1136/1188 1189/1137/1189\r\nf 1175/1125/1175 1189/1137/1189 1176/1138/1176\r\nf 1176/1138/1176 1189/1137/1189 1190/1150/1190\r\nf 1176/1138/1176 1190/1150/1190 1177/1139/1177\r\nf 1177/1139/1177 1190/1150/1190 1191/1140/1191\r\nf 1177/1139/1177 1191/1140/1191 1178/1141/1178\r\nf 1178/1141/1178 1191/1140/1191 1192/1153/1192\r\nf 1178/1141/1178 1192/1153/1192 1179/1142/1179\r\nf 1179/1142/1179 1192/1153/1192 1193/1154/1193\r\nf 1179/1142/1179 1193/1154/1193 1180/1143/1180\r\nf 1180/1143/1180 1193/1154/1193 1194/1155/1194\r\nf 1180/1143/1180 1194/1155/1194 1181/1129/1181\r\nf 1181/1129/1181 1194/1155/1194 1195/1156/1195\r\nf 1181/1129/1181 1195/1156/1195 1182/1130/1182\r\nf 1182/1130/1182 1195/1156/1195 1184/1132/1184\r\nf 1182/1130/1182 1184/1132/1184 1171/1144/1171\r\nf 1184/1132/1184 1197/1145/1197 1198/1146/1198\r\nf 1184/1132/1184 1198/1146/1198 1185/1147/1185\r\nf 1185/1147/1185 1198/1146/1198 1199/1157/1199\r\nf 1185/1147/1185 1199/1157/1199 1186/1149/1186\r\nf 1186/1149/1186 1199/1157/1199 1200/1148/1200\r\nf 1186/1149/1186 1200/1148/1200 1187/1134/1187\r\nf 1187/1134/1187 1200/1148/1200 1201/1159/1201\r\nf 1187/1134/1187 1201/1159/1201 1188/1136/1188\r\nf 1188/1136/1188 1201/1159/1201 1202/1161/1202\r\nf 1188/1136/1188 1202/1161/1202 1189/1137/1189\r\nf 1189/1137/1189 1202/1161/1202 1203/1163/1203\r\nf 1189/1137/1189 1203/1163/1203 1190/1150/1190\r\nf 1190/1150/1190 1203/1163/1203 1204/1166/1204\r\nf 1190/1150/1190 1204/1166/1204 1191/1140/1191\r\nf 1191/1140/1191 1204/1166/1204 1205/1151/1205\r\nf 1191/1140/1191 1205/1151/1205 1192/1153/1192\r\nf 1192/1153/1192 1205/1151/1205 1206/1152/1206\r\nf 1192/1153/1192 1206/1152/1206 1193/1154/1193\r\nf 1193/1154/1193 1206/1152/1206 1207/1168/1207\r\nf 1193/1154/1193 1207/1168/1207 1194/1155/1194\r\nf 1194/1155/1194 1207/1168/1207 1208/1169/1208\r\nf 1194/1155/1194 1208/1169/1208 1195/1156/1195\r\nf 1195/1156/1195 1208/1169/1208 1197/1145/1197\r\nf 1195/1156/1195 1197/1145/1197 1184/1132/1184\r\nf 1197/1145/1197 1210/1179/1210 1211/1170/1211\r\nf 1197/1145/1197 1211/1170/1211 1198/1146/1198\r\nf 1198/1146/1198 1211/1170/1211 1212/1171/1212\r\nf 1198/1146/1198 1212/1171/1212 1199/1157/1199\r\nf 1199/1157/1199 1212/1171/1212 1213/1158/1213\r\nf 1199/1157/1199 1213/1158/1213 1200/1148/1200\r\nf 1200/1148/1200 1213/1158/1213 1214/1173/1214\r\nf 1200/1148/1200 1214/1173/1214 1201/1159/1201\r\nf 1201/1159/1201 1214/1173/1214 1215/1160/1215\r\nf 1201/1159/1201 1215/1160/1215 1202/1161/1202\r\nf 1202/1161/1202 1215/1160/1215 1216/1162/1216\r\nf 1202/1161/1202 1216/1162/1216 1203/1163/1203\r\nf 1203/1163/1203 1216/1162/1216 1217/1164/1217\r\nf 1203/1163/1203 1217/1164/1217 1204/1166/1204\r\nf 1204/1166/1204 1217/1164/1217 1218/1165/1218\r\nf 1204/1166/1204 1218/1165/1218 1205/1151/1205\r\nf 1205/1151/1205 1218/1165/1218 1219/1167/1219\r\nf 1205/1151/1205 1219/1167/1219 1206/1152/1206\r\nf 1206/1152/1206 1219/1167/1219 1220/1176/1220\r\nf 1206/1152/1206 1220/1176/1220 1207/1168/1207\r\nf 1207/1168/1207 1220/1176/1220 1221/1178/1221\r\nf 1207/1168/1207 1221/1178/1221 1208/1169/1208\r\nf 1208/1169/1208 1221/1178/1221 1210/1179/1210\r\nf 1208/1169/1208 1210/1179/1210 1197/1145/1197\r\nf 1210/1179/1210 1223/1193/1223 1224/1180/1224\r\nf 1210/1179/1210 1224/1180/1224 1211/1170/1211\r\nf 1211/1170/1211 1224/1180/1224 1225/1172/1225\r\nf 1211/1170/1211 1225/1172/1225 1212/1171/1212\r\nf 1212/1171/1212 1225/1172/1225 1226/1182/1226\r\nf 1212/1171/1212 1226/1182/1226 1213/1158/1213\r\nf 1213/1158/1213 1226/1182/1226 1227/1184/1227\r\nf 1213/1158/1213 1227/1184/1227 1214/1173/1214\r\nf 1214/1173/1214 1227/1184/1227 1228/1174/1228\r\nf 1214/1173/1214 1228/1174/1228 1215/1160/1215\r\nf 1215/1160/1215 1228/1174/1228 1229/1175/1229\r\nf 1215/1160/1215 1229/1175/1229 1216/1162/1216\r\nf 1216/1162/1216 1229/1175/1229 1230/1185/1230\r\nf 1216/1162/1216 1230/1185/1230 1217/1164/1217\r\nf 1217/1164/1217 1230/1185/1230 1231/1188/1231\r\nf 1217/1164/1217 1231/1188/1231 1218/1165/1218\r\nf 1218/1165/1218 1231/1188/1231 1232/1189/1232\r\nf 1218/1165/1218 1232/1189/1232 1219/1167/1219\r\nf 1219/1167/1219 1232/1189/1232 1233/1177/1233\r\nf 1219/1167/1219 1233/1177/1233 1220/1176/1220\r\nf 1220/1176/1220 1233/1177/1233 1234/1191/1234\r\nf 1220/1176/1220 1234/1191/1234 1221/1178/1221\r\nf 1221/1178/1221 1234/1191/1234 1223/1193/1223\r\nf 1221/1178/1221 1223/1193/1223 1210/1179/1210\r\nf 1223/1193/1223 1236/1192/1236 1237/1195/1237\r\nf 1223/1193/1223 1237/1195/1237 1224/1180/1224\r\nf 1224/1180/1224 1237/1195/1237 1238/1181/1238\r\nf 1224/1180/1224 1238/1181/1238 1225/1172/1225\r\nf 1225/1172/1225 1238/1181/1238 1239/1197/1239\r\nf 1225/1172/1225 1239/1197/1239 1226/1182/1226\r\nf 1226/1182/1226 1239/1197/1239 1240/1183/1240\r\nf 1226/1182/1226 1240/1183/1240 1227/1184/1227\r\nf 1227/1184/1227 1240/1183/1240 1241/1198/1241\r\nf 1227/1184/1227 1241/1198/1241 1228/1174/1228\r\nf 1228/1174/1228 1241/1198/1241 1242/1199/1242\r\nf 1228/1174/1228 1242/1199/1242 1229/1175/1229\r\nf 1229/1175/1229 1242/1199/1242 1243/1186/1243\r\nf 1229/1175/1229 1243/1186/1243 1230/1185/1230\r\nf 1230/1185/1230 1243/1186/1243 1244/1187/1244\r\nf 1230/1185/1230 1244/1187/1244 1231/1188/1231\r\nf 1231/1188/1231 1244/1187/1244 1245/1203/1245\r\nf 1231/1188/1231 1245/1203/1245 1232/1189/1232\r\nf 1232/1189/1232 1245/1203/1245 1246/1190/1246\r\nf 1232/1189/1232 1246/1190/1246 1233/1177/1233\r\nf 1233/1177/1233 1246/1190/1246 1247/1206/1247\r\nf 1233/1177/1233 1247/1206/1247 1234/1191/1234\r\nf 1234/1191/1234 1247/1206/1247 1236/1192/1236\r\nf 1234/1191/1234 1236/1192/1236 1223/1193/1223\r\nf 1236/1192/1236 1249/1207/1249 1250/1194/1250\r\nf 1236/1192/1236 1250/1194/1250 1237/1195/1237\r\nf 1237/1195/1237 1250/1194/1250 1251/1211/1251\r\nf 1237/1195/1237 1251/1211/1251 1238/1181/1238\r\nf 1238/1181/1238 1251/1211/1251 1252/1196/1252\r\nf 1238/1181/1238 1252/1196/1252 1239/1197/1239\r\nf 1239/1197/1239 1252/1196/1252 1253/1212/1253\r\nf 1239/1197/1239 1253/1212/1253 1240/1183/1240\r\nf 1240/1183/1240 1253/1212/1253 1254/1213/1254\r\nf 1240/1183/1240 1254/1213/1254 1241/1198/1241\r\nf 1241/1198/1241 1254/1213/1254 1255/1200/1255\r\nf 1241/1198/1241 1255/1200/1255 1242/1199/1242\r\nf 1242/1199/1242 1255/1200/1255 1256/1201/1256\r\nf 1242/1199/1242 1256/1201/1256 1243/1186/1243\r\nf 1243/1186/1243 1256/1201/1256 1257/1202/1257\r\nf 1243/1186/1243 1257/1202/1257 1244/1187/1244\r\nf 1244/1187/1244 1257/1202/1257 1258/1204/1258\r\nf 1244/1187/1244 1258/1204/1258 1245/1203/1245\r\nf 1245/1203/1245 1258/1204/1258 1259/1205/1259\r\nf 1245/1203/1245 1259/1205/1259 1246/1190/1246\r\nf 1246/1190/1246 1259/1205/1259 1260/1217/1260\r\nf 1246/1190/1246 1260/1217/1260 1247/1206/1247\r\nf 1247/1206/1247 1260/1217/1260 1249/1207/1249\r\nf 1247/1206/1247 1249/1207/1249 1236/1192/1236\r\nf 1249/1207/1249 1262/1208/1262 1263/1209/1263\r\nf 1249/1207/1249 1263/1209/1263 1250/1194/1250\r\nf 1250/1194/1250 1263/1209/1263 1264/1210/1264\r\nf 1250/1194/1250 1264/1210/1264 1251/1211/1251\r\nf 1251/1211/1251 1264/1210/1264 1265/1220/1265\r\nf 1251/1211/1251 1265/1220/1265 1252/1196/1252\r\nf 1252/1196/1252 1265/1220/1265 1266/1221/1266\r\nf 1252/1196/1252 1266/1221/1266 1253/1212/1253\r\nf 1253/1212/1253 1266/1221/1266 1267/1223/1267\r\nf 1253/1212/1253 1267/1223/1267 1254/1213/1254\r\nf 1254/1213/1254 1267/1223/1267 1268/1224/1268\r\nf 1254/1213/1254 1268/1224/1268 1255/1200/1255\r\nf 1255/1200/1255 1268/1224/1268 1269/1214/1269\r\nf 1255/1200/1255 1269/1214/1269 1256/1201/1256\r\nf 1256/1201/1256 1269/1214/1269 1270/1215/1270\r\nf 1256/1201/1256 1270/1215/1270 1257/1202/1257\r\nf 1257/1202/1257 1270/1215/1270 1271/1226/1271\r\nf 1257/1202/1257 1271/1226/1271 1258/1204/1258\r\nf 1258/1204/1258 1271/1226/1271 1272/1227/1272\r\nf 1258/1204/1258 1272/1227/1272 1259/1205/1259\r\nf 1259/1205/1259 1272/1227/1272 1273/1216/1273\r\nf 1259/1205/1259 1273/1216/1273 1260/1217/1260\r\nf 1260/1217/1260 1273/1216/1273 1262/1208/1262\r\nf 1260/1217/1260 1262/1208/1262 1249/1207/1249\r\nf 1262/1208/1262 1275/1218/1275 1276/1219/1276\r\nf 1262/1208/1262 1276/1219/1276 1263/1209/1263\r\nf 1263/1209/1263 1276/1219/1276 1277/1229/1277\r\nf 1263/1209/1263 1277/1229/1277 1264/1210/1264\r\nf 1264/1210/1264 1277/1229/1277 1278/1231/1278\r\nf 1264/1210/1264 1278/1231/1278 1265/1220/1265\r\nf 1265/1220/1265 1278/1231/1278 1279/1232/1279\r\nf 1265/1220/1265 1279/1232/1279 1266/1221/1266\r\nf 1266/1221/1266 1279/1232/1279 1280/1222/1280\r\nf 1266/1221/1266 1280/1222/1280 1267/1223/1267\r\nf 1267/1223/1267 1280/1222/1280 1281/1234/1281\r\nf 1267/1223/1267 1281/1234/1281 1268/1224/1268\r\nf 1268/1224/1268 1281/1234/1281 1282/1225/1282\r\nf 1268/1224/1268 1282/1225/1282 1269/1214/1269\r\nf 1269/1214/1269 1282/1225/1282 1283/1238/1283\r\nf 1269/1214/1269 1283/1238/1283 1270/1215/1270\r\nf 1270/1215/1270 1283/1238/1283 1284/1239/1284\r\nf 1270/1215/1270 1284/1239/1284 1271/1226/1271\r\nf 1271/1226/1271 1284/1239/1284 1285/1241/1285\r\nf 1271/1226/1271 1285/1241/1285 1272/1227/1272\r\nf 1272/1227/1272 1285/1241/1285 1286/1243/1286\r\nf 1272/1227/1272 1286/1243/1286 1273/1216/1273\r\nf 1273/1216/1273 1286/1243/1286 1275/1218/1275\r\nf 1273/1216/1273 1275/1218/1275 1262/1208/1262\r\nf 1275/1218/1275 1288/1245/1288 1289/1246/1289\r\nf 1275/1218/1275 1289/1246/1289 1276/1219/1276\r\nf 1276/1219/1276 1289/1246/1289 1290/1228/1290\r\nf 1276/1219/1276 1290/1228/1290 1277/1229/1277\r\nf 1277/1229/1277 1290/1228/1290 1291/1230/1291\r\nf 1277/1229/1277 1291/1230/1291 1278/1231/1278\r\nf 1278/1231/1278 1291/1230/1291 1292/1248/1292\r\nf 1278/1231/1278 1292/1248/1292 1279/1232/1279\r\nf 1279/1232/1279 1292/1248/1292 1293/1233/1293\r\nf 1279/1232/1279 1293/1233/1293 1280/1222/1280\r\nf 1280/1222/1280 1293/1233/1293 1294/1235/1294\r\nf 1280/1222/1280 1294/1235/1294 1281/1234/1281\r\nf 1281/1234/1281 1294/1235/1294 1295/1236/1295\r\nf 1281/1234/1281 1295/1236/1295 1282/1225/1282\r\nf 1282/1225/1282 1295/1236/1295 1296/1237/1296\r\nf 1282/1225/1282 1296/1237/1296 1283/1238/1283\r\nf 1283/1238/1283 1296/1237/1296 1297/1254/1297\r\nf 1283/1238/1283 1297/1254/1297 1284/1239/1284\r\nf 1284/1239/1284 1297/1254/1297 1298/1240/1298\r\nf 1284/1239/1284 1298/1240/1298 1285/1241/1285\r\nf 1285/1241/1285 1298/1240/1298 1299/1242/1299\r\nf 1285/1241/1285 1299/1242/1299 1286/1243/1286\r\nf 1286/1243/1286 1299/1242/1299 1288/1245/1288\r\nf 1286/1243/1286 1288/1245/1288 1275/1218/1275\r\nf 1288/1245/1288 1301/1257/1301 1302/1244/1302\r\nf 1288/1245/1288 1302/1244/1302 1289/1246/1289\r\nf 1289/1246/1289 1302/1244/1302 1303/1247/1303\r\nf 1289/1246/1289 1303/1247/1303 1290/1228/1290\r\nf 1290/1228/1290 1303/1247/1303 1304/1259/1304\r\nf 1290/1228/1290 1304/1259/1304 1291/1230/1291\r\nf 1291/1230/1291 1304/1259/1304 1305/1249/1305\r\nf 1291/1230/1291 1305/1249/1305 1292/1248/1292\r\nf 1292/1248/1292 1305/1249/1305 1306/1260/1306\r\nf 1292/1248/1292 1306/1260/1306 1293/1233/1293\r\nf 1293/1233/1293 1306/1260/1306 1307/1250/1307\r\nf 1293/1233/1293 1307/1250/1307 1294/1235/1294\r\nf 1294/1235/1294 1307/1250/1307 1308/1251/1308\r\nf 1294/1235/1294 1308/1251/1308 1295/1236/1295\r\nf 1295/1236/1295 1308/1251/1308 1309/1252/1309\r\nf 1295/1236/1295 1309/1252/1309 1296/1237/1296\r\nf 1296/1237/1296 1309/1252/1309 1310/1253/1310\r\nf 1296/1237/1296 1310/1253/1310 1297/1254/1297\r\nf 1297/1254/1297 1310/1253/1310 1311/1255/1311\r\nf 1297/1254/1297 1311/1255/1311 1298/1240/1298\r\nf 1298/1240/1298 1311/1255/1311 1312/1256/1312\r\nf 1298/1240/1298 1312/1256/1312 1299/1242/1299\r\nf 1299/1242/1299 1312/1256/1312 1301/1257/1301\r\nf 1299/1242/1299 1301/1257/1301 1288/1245/1288\r\nf 1301/1257/1301 1314/1277/1314 1315/1258/1315\r\nf 1301/1257/1301 1315/1258/1315 1302/1244/1302\r\nf 1302/1244/1302 1315/1258/1315 1316/1265/1316\r\nf 1302/1244/1302 1316/1265/1316 1303/1247/1303\r\nf 1303/1247/1303 1316/1265/1316 1317/1266/1317\r\nf 1303/1247/1303 1317/1266/1317 1304/1259/1304\r\nf 1304/1259/1304 1317/1266/1317 1318/1267/1318\r\nf 1304/1259/1304 1318/1267/1318 1305/1249/1305\r\nf 1305/1249/1305 1318/1267/1318 1319/1269/1319\r\nf 1305/1249/1305 1319/1269/1319 1306/1260/1306\r\nf 1306/1260/1306 1319/1269/1319 1320/1271/1320\r\nf 1306/1260/1306 1320/1271/1320 1307/1250/1307\r\nf 1307/1250/1307 1320/1271/1320 1321/1261/1321\r\nf 1307/1250/1307 1321/1261/1321 1308/1251/1308\r\nf 1308/1251/1308 1321/1261/1321 1322/1273/1322\r\nf 1308/1251/1308 1322/1273/1322 1309/1252/1309\r\nf 1309/1252/1309 1322/1273/1322 1323/1274/1323\r\nf 1309/1252/1309 1323/1274/1323 1310/1253/1310\r\nf 1310/1253/1310 1323/1274/1323 1324/1262/1324\r\nf 1310/1253/1310 1324/1262/1324 1311/1255/1311\r\nf 1311/1255/1311 1324/1262/1324 1325/1263/1325\r\nf 1311/1255/1311 1325/1263/1325 1312/1256/1312\r\nf 1312/1256/1312 1325/1263/1325 1314/1277/1314\r\nf 1312/1256/1312 1314/1277/1314 1301/1257/1301\r\nf 1314/1277/1314 1327/1278/1327 1328/1264/1328\r\nf 1314/1277/1314 1328/1264/1328 1315/1258/1315\r\nf 1315/1258/1315 1328/1264/1328 1329/1280/1329\r\nf 1315/1258/1315 1329/1280/1329 1316/1265/1316\r\nf 1316/1265/1316 1329/1280/1329 1330/1282/1330\r\nf 1316/1265/1316 1330/1282/1330 1317/1266/1317\r\nf 1317/1266/1317 1330/1282/1330 1331/1283/1331\r\nf 1317/1266/1317 1331/1283/1331 1318/1267/1318\r\nf 1318/1267/1318 1331/1283/1331 1332/1268/1332\r\nf 1318/1267/1318 1332/1268/1332 1319/1269/1319\r\nf 1319/1269/1319 1332/1268/1332 1333/1285/1333\r\nf 1319/1269/1319 1333/1285/1333 1320/1271/1320\r\nf 1320/1271/1320 1333/1285/1333 1334/1270/1334\r\nf 1320/1271/1320 1334/1270/1334 1321/1261/1321\r\nf 1321/1261/1321 1334/1270/1334 1335/1272/1335\r\nf 1321/1261/1321 1335/1272/1335 1322/1273/1322\r\nf 1322/1273/1322 1335/1272/1335 1336/1287/1336\r\nf 1322/1273/1322 1336/1287/1336 1323/1274/1323\r\nf 1323/1274/1323 1336/1287/1336 1337/1275/1337\r\nf 1323/1274/1323 1337/1275/1337 1324/1262/1324\r\nf 1324/1262/1324 1337/1275/1337 1338/1276/1338\r\nf 1324/1262/1324 1338/1276/1338 1325/1263/1325\r\nf 1325/1263/1325 1338/1276/1338 1327/1278/1327\r\nf 1325/1263/1325 1327/1278/1327 1314/1277/1314\r\nf 1327/1278/1327 1340/1289/1340 1341/1279/1341\r\nf 1327/1278/1327 1341/1279/1341 1328/1264/1328\r\nf 1328/1264/1328 1341/1279/1341 1342/1291/1342\r\nf 1328/1264/1328 1342/1291/1342 1329/1280/1329\r\nf 1329/1280/1329 1342/1291/1342 1343/1281/1343\r\nf 1329/1280/1329 1343/1281/1343 1330/1282/1330\r\nf 1330/1282/1330 1343/1281/1343 1344/1293/1344\r\nf 1330/1282/1330 1344/1293/1344 1331/1283/1331\r\nf 1331/1283/1331 1344/1293/1344 1345/1296/1345\r\nf 1331/1283/1331 1345/1296/1345 1332/1268/1332\r\nf 1332/1268/1332 1345/1296/1345 1346/1284/1346\r\nf 1332/1268/1332 1346/1284/1346 1333/1285/1333\r\nf 1333/1285/1333 1346/1284/1346 1347/1297/1347\r\nf 1333/1285/1333 1347/1297/1347 1334/1270/1334\r\nf 1334/1270/1334 1347/1297/1347 1348/1286/1348\r\nf 1334/1270/1334 1348/1286/1348 1335/1272/1335\r\nf 1335/1272/1335 1348/1286/1348 1349/1299/1349\r\nf 1335/1272/1335 1349/1299/1349 1336/1287/1336\r\nf 1336/1287/1336 1349/1299/1349 1350/1288/1350\r\nf 1336/1287/1336 1350/1288/1350 1337/1275/1337\r\nf 1337/1275/1337 1350/1288/1350 1351/1302/1351\r\nf 1337/1275/1337 1351/1302/1351 1338/1276/1338\r\nf 1338/1276/1338 1351/1302/1351 1340/1289/1340\r\nf 1338/1276/1338 1340/1289/1340 1327/1278/1327\r\nf 1340/1289/1340 1353/1311/1353 1354/1290/1354\r\nf 1340/1289/1340 1354/1290/1354 1341/1279/1341\r\nf 1341/1279/1341 1354/1290/1354 1355/1304/1355\r\nf 1341/1279/1341 1355/1304/1355 1342/1291/1342\r\nf 1342/1291/1342 1355/1304/1355 1356/1305/1356\r\nf 1342/1291/1342 1356/1305/1356 1343/1281/1343\r\nf 1343/1281/1343 1356/1305/1356 1357/1292/1357\r\nf 1343/1281/1343 1357/1292/1357 1344/1293/1344\r\nf 1344/1293/1344 1357/1292/1357 1358/1294/1358\r\nf 1344/1293/1344 1358/1294/1358 1345/1296/1345\r\nf 1345/1296/1345 1358/1294/1358 1359/1295/1359\r\nf 1345/1296/1345 1359/1295/1359 1346/1284/1346\r\nf 1346/1284/1346 1359/1295/1359 1360/1309/1360\r\nf 1346/1284/1346 1360/1309/1360 1347/1297/1347\r\nf 1347/1297/1347 1360/1309/1360 1361/1298/1361\r\nf 1347/1297/1347 1361/1298/1361 1348/1286/1348\r\nf 1348/1286/1348 1361/1298/1361 1362/1310/1362\r\nf 1348/1286/1348 1362/1310/1362 1349/1299/1349\r\nf 1349/1299/1349 1362/1310/1362 1363/1300/1363\r\nf 1349/1299/1349 1363/1300/1363 1350/1288/1350\r\nf 1350/1288/1350 1363/1300/1363 1364/1301/1364\r\nf 1350/1288/1350 1364/1301/1364 1351/1302/1351\r\nf 1351/1302/1351 1364/1301/1364 1353/1311/1353\r\nf 1351/1302/1351 1353/1311/1353 1340/1289/1340\r\nf 1353/1311/1353 1366/1324/1366 1367/1303/1367\r\nf 1353/1311/1353 1367/1303/1367 1354/1290/1354\r\nf 1354/1290/1354 1367/1303/1367 1368/1315/1368\r\nf 1354/1290/1354 1368/1315/1368 1355/1304/1355\r\nf 1355/1304/1355 1368/1315/1368 1369/1316/1369\r\nf 1355/1304/1355 1369/1316/1369 1356/1305/1356\r\nf 1356/1305/1356 1369/1316/1369 1370/1306/1370\r\nf 1356/1305/1356 1370/1306/1370 1357/1292/1357\r\nf 1357/1292/1357 1370/1306/1370 1371/1307/1371\r\nf 1357/1292/1357 1371/1307/1371 1358/1294/1358\r\nf 1358/1294/1358 1371/1307/1371 1372/1308/1372\r\nf 1358/1294/1358 1372/1308/1372 1359/1295/1359\r\nf 1359/1295/1359 1372/1308/1372 1373/1318/1373\r\nf 1359/1295/1359 1373/1318/1373 1360/1309/1360\r\nf 1360/1309/1360 1373/1318/1373 1374/1319/1374\r\nf 1360/1309/1360 1374/1319/1374 1361/1298/1361\r\nf 1361/1298/1361 1374/1319/1374 1375/1321/1375\r\nf 1361/1298/1361 1375/1321/1375 1362/1310/1362\r\nf 1362/1310/1362 1375/1321/1375 1376/1322/1376\r\nf 1362/1310/1362 1376/1322/1376 1363/1300/1363\r\nf 1363/1300/1363 1376/1322/1376 1377/1323/1377\r\nf 1363/1300/1363 1377/1323/1377 1364/1301/1364\r\nf 1364/1301/1364 1377/1323/1377 1366/1324/1366\r\nf 1364/1301/1364 1366/1324/1366 1353/1311/1353\r\nf 1366/1324/1366 1379/1312/1379 1380/1313/1380\r\nf 1366/1324/1366 1380/1313/1380 1367/1303/1367\r\nf 1367/1303/1367 1380/1313/1380 1381/1325/1381\r\nf 1367/1303/1367 1381/1325/1381 1368/1315/1368\r\nf 1368/1315/1368 1381/1325/1381 1382/1314/1382\r\nf 1368/1315/1368 1382/1314/1382 1369/1316/1369\r\nf 1369/1316/1369 1382/1314/1382 1383/1327/1383\r\nf 1369/1316/1369 1383/1327/1383 1370/1306/1370\r\nf 1370/1306/1370 1383/1327/1383 1384/1317/1384\r\nf 1370/1306/1370 1384/1317/1384 1371/1307/1371\r\nf 1371/1307/1371 1384/1317/1384 1385/1329/1385\r\nf 1371/1307/1371 1385/1329/1385 1372/1308/1372\r\nf 1372/1308/1372 1385/1329/1385 1386/1330/1386\r\nf 1372/1308/1372 1386/1330/1386 1373/1318/1373\r\nf 1373/1318/1373 1386/1330/1386 1387/1331/1387\r\nf 1373/1318/1373 1387/1331/1387 1374/1319/1374\r\nf 1374/1319/1374 1387/1331/1387 1388/1320/1388\r\nf 1374/1319/1374 1388/1320/1388 1375/1321/1375\r\nf 1375/1321/1375 1388/1320/1388 1389/1333/1389\r\nf 1375/1321/1375 1389/1333/1389 1376/1322/1376\r\nf 1376/1322/1376 1389/1333/1389 1390/1334/1390\r\nf 1376/1322/1376 1390/1334/1390 1377/1323/1377\r\nf 1377/1323/1377 1390/1334/1390 1379/1312/1379\r\nf 1377/1323/1377 1379/1312/1379 1366/1324/1366\r\nf 1379/1312/1379 1392/1335/1392 1393/1336/1393\r\nf 1379/1312/1379 1393/1336/1393 1380/1313/1380\r\nf 1380/1313/1380 1393/1336/1393 1394/1337/1394\r\nf 1380/1313/1380 1394/1337/1394 1381/1325/1381\r\nf 1381/1325/1381 1394/1337/1394 1395/1326/1395\r\nf 1381/1325/1381 1395/1326/1395 1382/1314/1382\r\nf 1382/1314/1382 1395/1326/1395 1396/1340/1396\r\nf 1382/1314/1382 1396/1340/1396 1383/1327/1383\r\nf 1383/1327/1383 1396/1340/1396 1397/1328/1397\r\nf 1383/1327/1383 1397/1328/1397 1384/1317/1384\r\nf 1384/1317/1384 1397/1328/1397 1398/1343/1398\r\nf 1384/1317/1384 1398/1343/1398 1385/1329/1385\r\nf 1385/1329/1385 1398/1343/1398 1399/1344/1399\r\nf 1385/1329/1385 1399/1344/1399 1386/1330/1386\r\nf 1386/1330/1386 1399/1344/1399 1400/1345/1400\r\nf 1386/1330/1386 1400/1345/1400 1387/1331/1387\r\nf 1387/1331/1387 1400/1345/1400 1401/1347/1401\r\nf 1387/1331/1387 1401/1347/1401 1388/1320/1388\r\nf 1388/1320/1388 1401/1347/1401 1402/1332/1402\r\nf 1388/1320/1388 1402/1332/1402 1389/1333/1389\r\nf 1389/1333/1389 1402/1332/1402 1403/1349/1403\r\nf 1389/1333/1389 1403/1349/1403 1390/1334/1390\r\nf 1390/1334/1390 1403/1349/1403 1392/1335/1392\r\nf 1390/1334/1390 1392/1335/1392 1379/1312/1379\r\nf 1392/1335/1392 1405/1363/1405 1406/1350/1406\r\nf 1392/1335/1392 1406/1350/1406 1393/1336/1393\r\nf 1393/1336/1393 1406/1350/1406 1407/1352/1407\r\nf 1393/1336/1393 1407/1352/1407 1394/1337/1394\r\nf 1394/1337/1394 1407/1352/1407 1408/1338/1408\r\nf 1394/1337/1394 1408/1338/1408 1395/1326/1395\r\nf 1395/1326/1395 1408/1338/1408 1409/1339/1409\r\nf 1395/1326/1395 1409/1339/1409 1396/1340/1396\r\nf 1396/1340/1396 1409/1339/1409 1410/1341/1410\r\nf 1396/1340/1396 1410/1341/1410 1397/1328/1397\r\nf 1397/1328/1397 1410/1341/1410 1411/1356/1411\r\nf 1397/1328/1397 1411/1356/1411 1398/1343/1398\r\nf 1398/1343/1398 1411/1356/1411 1412/1342/1412\r\nf 1398/1343/1398 1412/1342/1412 1399/1344/1399\r\nf 1399/1344/1399 1412/1342/1412 1413/1358/1413\r\nf 1399/1344/1399 1413/1358/1413 1400/1345/1400\r\nf 1400/1345/1400 1413/1358/1413 1414/1346/1414\r\nf 1400/1345/1400 1414/1346/1414 1401/1347/1401\r\nf 1401/1347/1401 1414/1346/1414 1415/1348/1415\r\nf 1401/1347/1401 1415/1348/1415 1402/1332/1402\r\nf 1402/1332/1402 1415/1348/1415 1416/1360/1416\r\nf 1402/1332/1402 1416/1360/1416 1403/1349/1403\r\nf 1403/1349/1403 1416/1360/1416 1405/1363/1405\r\nf 1403/1349/1403 1405/1363/1405 1392/1335/1392\r\nf 1405/1363/1405 1418/1362/1418 1419/1351/1419\r\nf 1405/1363/1405 1419/1351/1419 1406/1350/1406\r\nf 1406/1350/1406 1419/1351/1419 1420/1366/1420\r\nf 1406/1350/1406 1420/1366/1420 1407/1352/1407\r\nf 1407/1352/1407 1420/1366/1420 1421/1353/1421\r\nf 1407/1352/1407 1421/1353/1421 1408/1338/1408\r\nf 1408/1338/1408 1421/1353/1421 1422/1368/1422\r\nf 1408/1338/1408 1422/1368/1422 1409/1339/1409\r\nf 1409/1339/1409 1422/1368/1422 1423/1354/1423\r\nf 1409/1339/1409 1423/1354/1423 1410/1341/1410\r\nf 1410/1341/1410 1423/1354/1423 1424/1355/1424\r\nf 1410/1341/1410 1424/1355/1424 1411/1356/1411\r\nf 1411/1356/1411 1424/1355/1424 1425/1357/1425\r\nf 1411/1356/1411 1425/1357/1425 1412/1342/1412\r\nf 1412/1342/1412 1425/1357/1425 1426/1371/1426\r\nf 1412/1342/1412 1426/1371/1426 1413/1358/1413\r\nf 1413/1358/1413 1426/1371/1426 1427/1373/1427\r\nf 1413/1358/1413 1427/1373/1427 1414/1346/1414\r\nf 1414/1346/1414 1427/1373/1427 1428/1359/1428\r\nf 1414/1346/1414 1428/1359/1428 1415/1348/1415\r\nf 1415/1348/1415 1428/1359/1428 1429/1361/1429\r\nf 1415/1348/1415 1429/1361/1429 1416/1360/1416\r\nf 1416/1360/1416 1429/1361/1429 1418/1362/1418\r\nf 1416/1360/1416 1418/1362/1418 1405/1363/1405\r\nf 1418/1362/1418 1431/1383/1431 1432/1364/1432\r\nf 1418/1362/1418 1432/1364/1432 1419/1351/1419\r\nf 1419/1351/1419 1432/1364/1432 1433/1365/1433\r\nf 1419/1351/1419 1433/1365/1433 1420/1366/1420\r\nf 1420/1366/1420 1433/1365/1433 1434/1367/1434\r\nf 1420/1366/1420 1434/1367/1434 1421/1353/1421\r\nf 1421/1353/1421 1434/1367/1434 1435/1376/1435\r\nf 1421/1353/1421 1435/1376/1435 1422/1368/1422\r\nf 1422/1368/1422 1435/1376/1435 1436/1378/1436\r\nf 1422/1368/1422 1436/1378/1436 1423/1354/1423\r\nf 1423/1354/1423 1436/1378/1436 1437/1369/1437\r\nf 1423/1354/1423 1437/1369/1437 1424/1355/1424\r\nf 1424/1355/1424 1437/1369/1437 1438/1370/1438\r\nf 1424/1355/1424 1438/1370/1438 1425/1357/1425\r\nf 1425/1357/1425 1438/1370/1438 1439/1380/1439\r\nf 1425/1357/1425 1439/1380/1439 1426/1371/1426\r\nf 1426/1371/1426 1439/1380/1439 1440/1372/1440\r\nf 1426/1371/1426 1440/1372/1440 1427/1373/1427\r\nf 1427/1373/1427 1440/1372/1440 1441/1374/1441\r\nf 1427/1373/1427 1441/1374/1441 1428/1359/1428\r\nf 1428/1359/1428 1441/1374/1441 1442/1382/1442\r\nf 1428/1359/1428 1442/1382/1442 1429/1361/1429\r\nf 1429/1361/1429 1442/1382/1442 1431/1383/1431\r\nf 1429/1361/1429 1431/1383/1431 1418/1362/1418\r\nf 1431/1383/1431 1444/1398/1444 1445/1385/1445\r\nf 1431/1383/1431 1445/1385/1445 1432/1364/1432\r\nf 1432/1364/1432 1445/1385/1445 1446/1375/1446\r\nf 1432/1364/1432 1446/1375/1446 1433/1365/1433\r\nf 1433/1365/1433 1446/1375/1446 1447/1386/1447\r\nf 1433/1365/1433 1447/1386/1447 1434/1367/1434\r\nf 1434/1367/1434 1447/1386/1447 1448/1377/1448\r\nf 1434/1367/1434 1448/1377/1448 1435/1376/1435\r\nf 1435/1376/1435 1448/1377/1448 1449/1388/1449\r\nf 1435/1376/1435 1449/1388/1449 1436/1378/1436\r\nf 1436/1378/1436 1449/1388/1449 1450/1379/1450\r\nf 1436/1378/1436 1450/1379/1450 1437/1369/1437\r\nf 1437/1369/1437 1450/1379/1450 1451/1391/1451\r\nf 1437/1369/1437 1451/1391/1451 1438/1370/1438\r\nf 1438/1370/1438 1451/1391/1451 1452/1393/1452\r\nf 1438/1370/1438 1452/1393/1452 1439/1380/1439\r\nf 1439/1380/1439 1452/1393/1452 1453/1394/1453\r\nf 1439/1380/1439 1453/1394/1453 1440/1372/1440\r\nf 1440/1372/1440 1453/1394/1453 1454/1381/1454\r\nf 1440/1372/1440 1454/1381/1454 1441/1374/1441\r\nf 1441/1374/1441 1454/1381/1454 1455/1395/1455\r\nf 1441/1374/1441 1455/1395/1455 1442/1382/1442\r\nf 1442/1382/1442 1455/1395/1455 1444/1398/1444\r\nf 1442/1382/1442 1444/1398/1444 1431/1383/1431\r\nf 1444/1398/1444 1457/1397/1457 1458/1384/1458\r\nf 1444/1398/1444 1458/1384/1458 1445/1385/1445\r\nf 1445/1385/1445 1458/1384/1458 1459/1401/1459\r\nf 1445/1385/1445 1459/1401/1459 1446/1375/1446\r\nf 1446/1375/1446 1459/1401/1459 1460/1402/1460\r\nf 1446/1375/1446 1460/1402/1460 1447/1386/1447\r\nf 1447/1386/1447 1460/1402/1460 1461/1403/1461\r\nf 1447/1386/1447 1461/1403/1461 1448/1377/1448\r\nf 1448/1377/1448 1461/1403/1461 1462/1387/1462\r\nf 1448/1377/1448 1462/1387/1462 1449/1388/1449\r\nf 1449/1388/1449 1462/1387/1462 1463/1389/1463\r\nf 1449/1388/1449 1463/1389/1463 1450/1379/1450\r\nf 1450/1379/1450 1463/1389/1463 1464/1390/1464\r\nf 1450/1379/1450 1464/1390/1464 1451/1391/1451\r\nf 1451/1391/1451 1464/1390/1464 1465/1392/1465\r\nf 1451/1391/1451 1465/1392/1465 1452/1393/1452\r\nf 1452/1393/1452 1465/1392/1465 1466/1407/1466\r\nf 1452/1393/1452 1466/1407/1466 1453/1394/1453\r\nf 1453/1394/1453 1466/1407/1466 1467/1409/1467\r\nf 1453/1394/1453 1467/1409/1467 1454/1381/1454\r\nf 1454/1381/1454 1467/1409/1467 1468/1396/1468\r\nf 1454/1381/1454 1468/1396/1468 1455/1395/1455\r\nf 1455/1395/1455 1468/1396/1468 1457/1397/1457\r\nf 1455/1395/1455 1457/1397/1457 1444/1398/1444\r\nf 1457/1397/1457 1470/1399/1470 1471/1400/1471\r\nf 1457/1397/1457 1471/1400/1471 1458/1384/1458\r\nf 1458/1384/1458 1471/1400/1471 1472/1412/1472\r\nf 1458/1384/1458 1472/1412/1472 1459/1401/1459\r\nf 1459/1401/1459 1472/1412/1472 1473/1414/1473\r\nf 1459/1401/1459 1473/1414/1473 1460/1402/1460\r\nf 1460/1402/1460 1473/1414/1473 1474/1415/1474\r\nf 1460/1402/1460 1474/1415/1474 1461/1403/1461\r\nf 1461/1403/1461 1474/1415/1474 1475/1417/1475\r\nf 1461/1403/1461 1475/1417/1475 1462/1387/1462\r\nf 1462/1387/1462 1475/1417/1475 1476/1419/1476\r\nf 1462/1387/1462 1476/1419/1476 1463/1389/1463\r\nf 1463/1389/1463 1476/1419/1476 1477/1404/1477\r\nf 1463/1389/1463 1477/1404/1477 1464/1390/1464\r\nf 1464/1390/1464 1477/1404/1477 1478/1405/1478\r\nf 1464/1390/1464 1478/1405/1478 1465/1392/1465\r\nf 1465/1392/1465 1478/1405/1478 1479/1406/1479\r\nf 1465/1392/1465 1479/1406/1479 1466/1407/1466\r\nf 1466/1407/1466 1479/1406/1479 1480/1408/1480\r\nf 1466/1407/1466 1480/1408/1480 1467/1409/1467\r\nf 1467/1409/1467 1480/1408/1480 1481/1423/1481\r\nf 1467/1409/1467 1481/1423/1481 1468/1396/1468\r\nf 1468/1396/1468 1481/1423/1481 1470/1399/1470\r\nf 1468/1396/1468 1470/1399/1470 1457/1397/1457\r\nf 1470/1399/1470 1483/1424/1483 1484/1410/1484\r\nf 1470/1399/1470 1484/1410/1484 1471/1400/1471\r\nf 1471/1400/1471 1484/1410/1484 1485/1411/1485\r\nf 1471/1400/1471 1485/1411/1485 1472/1412/1472\r\nf 1472/1412/1472 1485/1411/1485 1486/1413/1486\r\nf 1472/1412/1472 1486/1413/1486 1473/1414/1473\r\nf 1473/1414/1473 1486/1413/1486 1487/1428/1487\r\nf 1473/1414/1473 1487/1428/1487 1474/1415/1474\r\nf 1474/1415/1474 1487/1428/1487 1488/1416/1488\r\nf 1474/1415/1474 1488/1416/1488 1475/1417/1475\r\nf 1475/1417/1475 1488/1416/1488 1489/1418/1489\r\nf 1475/1417/1475 1489/1418/1489 1476/1419/1476\r\nf 1476/1419/1476 1489/1418/1489 1490/1429/1490\r\nf 1476/1419/1476 1490/1429/1490 1477/1404/1477\r\nf 1477/1404/1477 1490/1429/1490 1491/1420/1491\r\nf 1477/1404/1477 1491/1420/1491 1478/1405/1478\r\nf 1478/1405/1478 1491/1420/1491 1492/1432/1492\r\nf 1478/1405/1478 1492/1432/1492 1479/1406/1479\r\nf 1479/1406/1479 1492/1432/1492 1493/1421/1493\r\nf 1479/1406/1479 1493/1421/1493 1480/1408/1480\r\nf 1480/1408/1480 1493/1421/1493 1494/1422/1494\r\nf 1480/1408/1480 1494/1422/1494 1481/1423/1481\r\nf 1481/1423/1481 1494/1422/1494 1483/1424/1483\r\nf 1481/1423/1481 1483/1424/1483 1470/1399/1470\r\nf 1483/1424/1483 1496/1434/1496 1497/1425/1497\r\nf 1483/1424/1483 1497/1425/1497 1484/1410/1484\r\nf 1484/1410/1484 1497/1425/1497 1498/1426/1498\r\nf 1484/1410/1484 1498/1426/1498 1485/1411/1485\r\nf 1485/1411/1485 1498/1426/1498 1499/1427/1499\r\nf 1485/1411/1485 1499/1427/1499 1486/1413/1486\r\nf 1486/1413/1486 1499/1427/1499 1500/1438/1500\r\nf 1486/1413/1486 1500/1438/1500 1487/1428/1487\r\nf 1487/1428/1487 1500/1438/1500 1501/1441/1501\r\nf 1487/1428/1487 1501/1441/1501 1488/1416/1488\r\nf 1488/1416/1488 1501/1441/1501 1502/1442/1502\r\nf 1488/1416/1488 1502/1442/1502 1489/1418/1489\r\nf 1489/1418/1489 1502/1442/1502 1503/1443/1503\r\nf 1489/1418/1489 1503/1443/1503 1490/1429/1490\r\nf 1490/1429/1490 1503/1443/1503 1504/1430/1504\r\nf 1490/1429/1490 1504/1430/1504 1491/1420/1491\r\nf 1491/1420/1491 1504/1430/1504 1505/1431/1505\r\nf 1491/1420/1491 1505/1431/1505 1492/1432/1492\r\nf 1492/1432/1492 1505/1431/1505 1506/1433/1506\r\nf 1492/1432/1492 1506/1433/1506 1493/1421/1493\r\nf 1493/1421/1493 1506/1433/1506 1507/1447/1507\r\nf 1493/1421/1493 1507/1447/1507 1494/1422/1494\r\nf 1494/1422/1494 1507/1447/1507 1496/1434/1496\r\nf 1494/1422/1494 1496/1434/1496 1483/1424/1483\r\nf 1496/1434/1496 1509/1435/1509 1510/1450/1510\r\nf 1496/1434/1496 1510/1450/1510 1497/1425/1497\r\nf 1497/1425/1497 1510/1450/1510 1511/1436/1511\r\nf 1497/1425/1497 1511/1436/1511 1498/1426/1498\r\nf 1498/1426/1498 1511/1436/1511 1512/1437/1512\r\nf 1498/1426/1498 1512/1437/1512 1499/1427/1499\r\nf 1499/1427/1499 1512/1437/1512 1513/1439/1513\r\nf 1499/1427/1499 1513/1439/1513 1500/1438/1500\r\nf 1500/1438/1500 1513/1439/1513 1514/1440/1514\r\nf 1500/1438/1500 1514/1440/1514 1501/1441/1501\r\nf 1501/1441/1501 1514/1440/1514 1515/1453/1515\r\nf 1501/1441/1501 1515/1453/1515 1502/1442/1502\r\nf 1502/1442/1502 1515/1453/1515 1516/1454/1516\r\nf 1502/1442/1502 1516/1454/1516 1503/1443/1503\r\nf 1503/1443/1503 1516/1454/1516 1517/1444/1517\r\nf 1503/1443/1503 1517/1444/1517 1504/1430/1504\r\nf 1504/1430/1504 1517/1444/1517 1518/1445/1518\r\nf 1504/1430/1504 1518/1445/1518 1505/1431/1505\r\nf 1505/1431/1505 1518/1445/1518 1519/1456/1519\r\nf 1505/1431/1505 1519/1456/1519 1506/1433/1506\r\nf 1506/1433/1506 1519/1456/1519 1520/1446/1520\r\nf 1506/1433/1506 1520/1446/1520 1507/1447/1507\r\nf 1507/1447/1507 1520/1446/1520 1509/1435/1509\r\nf 1507/1447/1507 1509/1435/1509 1496/1434/1496\r\nf 1509/1435/1509 1522/1448/1522 1523/1449/1523\r\nf 1509/1435/1509 1523/1449/1523 1510/1450/1510\r\nf 1510/1450/1510 1523/1449/1523 1524/1459/1524\r\nf 1510/1450/1510 1524/1459/1524 1511/1436/1511\r\nf 1511/1436/1511 1524/1459/1524 1525/1460/1525\r\nf 1511/1436/1511 1525/1460/1525 1512/1437/1512\r\nf 1512/1437/1512 1525/1460/1525 1526/1451/1526\r\nf 1512/1437/1512 1526/1451/1526 1513/1439/1513\r\nf 1513/1439/1513 1526/1451/1526 1527/1462/1527\r\nf 1513/1439/1513 1527/1462/1527 1514/1440/1514\r\nf 1514/1440/1514 1527/1462/1527 1528/1452/1528\r\nf 1514/1440/1514 1528/1452/1528 1515/1453/1515\r\nf 1515/1453/1515 1528/1452/1528 1529/1465/1529\r\nf 1515/1453/1515 1529/1465/1529 1516/1454/1516\r\nf 1516/1454/1516 1529/1465/1529 1530/1466/1530\r\nf 1516/1454/1516 1530/1466/1530 1517/1444/1517\r\nf 1517/1444/1517 1530/1466/1530 1531/1455/1531\r\nf 1517/1444/1517 1531/1455/1531 1518/1445/1518\r\nf 1518/1445/1518 1531/1455/1531 1532/1468/1532\r\nf 1518/1445/1518 1532/1468/1532 1519/1456/1519\r\nf 1519/1456/1519 1532/1468/1532 1533/1469/1533\r\nf 1519/1456/1519 1533/1469/1533 1520/1446/1520\r\nf 1520/1446/1520 1533/1469/1533 1522/1448/1522\r\nf 1520/1446/1520 1522/1448/1522 1509/1435/1509\r\nf 1522/1448/1522 1535/1480/1535 1536/1457/1536\r\nf 1522/1448/1522 1536/1457/1536 1523/1449/1523\r\nf 1523/1449/1523 1536/1457/1536 1537/1458/1537\r\nf 1523/1449/1523 1537/1458/1537 1524/1459/1524\r\nf 1524/1459/1524 1537/1458/1537 1538/1471/1538\r\nf 1524/1459/1524 1538/1471/1538 1525/1460/1525\r\nf 1525/1460/1525 1538/1471/1538 1539/1473/1539\r\nf 1525/1460/1525 1539/1473/1539 1526/1451/1526\r\nf 1526/1451/1526 1539/1473/1539 1540/1461/1540\r\nf 1526/1451/1526 1540/1461/1540 1527/1462/1527\r\nf 1527/1462/1527 1540/1461/1540 1541/1463/1541\r\nf 1527/1462/1527 1541/1463/1541 1528/1452/1528\r\nf 1528/1452/1528 1541/1463/1541 1542/1474/1542\r\nf 1528/1452/1528 1542/1474/1542 1529/1465/1529\r\nf 1529/1465/1529 1542/1474/1542 1543/1464/1543\r\nf 1529/1465/1529 1543/1464/1543 1530/1466/1530\r\nf 1530/1466/1530 1543/1464/1543 1544/1467/1544\r\nf 1530/1466/1530 1544/1467/1544 1531/1455/1531\r\nf 1531/1455/1531 1544/1467/1544 1545/1477/1545\r\nf 1531/1455/1531 1545/1477/1545 1532/1468/1532\r\nf 1532/1468/1532 1545/1477/1545 1546/1479/1546\r\nf 1532/1468/1532 1546/1479/1546 1533/1469/1533\r\nf 1533/1469/1533 1546/1479/1546 1535/1480/1535\r\nf 1533/1469/1533 1535/1480/1535 1522/1448/1522\r\nf 1535/1480/1535 1548/1481/1548 1549/1482/1549\r\nf 1535/1480/1535 1549/1482/1549 1536/1457/1536\r\nf 1536/1457/1536 1549/1482/1549 1550/1485/1550\r\nf 1536/1457/1536 1550/1485/1550 1537/1458/1537\r\nf 1537/1458/1537 1550/1485/1550 1551/1470/1551\r\nf 1537/1458/1537 1551/1470/1551 1538/1471/1538\r\nf 1538/1471/1538 1551/1470/1551 1552/1472/1552\r\nf 1538/1471/1538 1552/1472/1552 1539/1473/1539\r\nf 1539/1473/1539 1552/1472/1552 1553/1486/1553\r\nf 1539/1473/1539 1553/1486/1553 1540/1461/1540\r\nf 1540/1461/1540 1553/1486/1553 1554/1487/1554\r\nf 1540/1461/1540 1554/1487/1554 1541/1463/1541\r\nf 1541/1463/1541 1554/1487/1554 1555/1488/1555\r\nf 1541/1463/1541 1555/1488/1555 1542/1474/1542\r\nf 1542/1474/1542 1555/1488/1555 1556/1475/1556\r\nf 1542/1474/1542 1556/1475/1556 1543/1464/1543\r\nf 1543/1464/1543 1556/1475/1556 1557/1476/1557\r\nf 1543/1464/1543 1557/1476/1557 1544/1467/1544\r\nf 1544/1467/1544 1557/1476/1557 1558/1490/1558\r\nf 1544/1467/1544 1558/1490/1558 1545/1477/1545\r\nf 1545/1477/1545 1558/1490/1558 1559/1478/1559\r\nf 1545/1477/1545 1559/1478/1559 1546/1479/1546\r\nf 1546/1479/1546 1559/1478/1559 1548/1481/1548\r\nf 1546/1479/1546 1548/1481/1548 1535/1480/1535\r\nf 1548/1481/1548 1/1491/1 2/1483/2\r\nf 1548/1481/1548 2/1483/2 1549/1482/1549\r\nf 1549/1482/1549 2/1483/2 3/1484/3\r\nf 1549/1482/1549 3/1484/3 1550/1485/1550\r\nf 1550/1485/1550 3/1484/3 4/3/4\r\nf 1550/1485/1550 4/3/4 1551/1470/1551\r\nf 1551/1470/1551 4/3/4 5/4/5\r\nf 1551/1470/1551 5/4/5 1552/1472/1552\r\nf 1552/1472/1552 5/4/5 6/7/6\r\nf 1552/1472/1552 6/7/6 1553/1486/1553\r\nf 1553/1486/1553 6/7/6 7/9/7\r\nf 1553/1486/1553 7/9/7 1554/1487/1554\r\nf 1554/1487/1554 7/9/7 8/10/8\r\nf 1554/1487/1554 8/10/8 1555/1488/1555\r\nf 1555/1488/1555 8/10/8 9/11/9\r\nf 1555/1488/1555 9/11/9 1556/1475/1556\r\nf 1556/1475/1556 9/11/9 10/13/10\r\nf 1556/1475/1556 10/13/10 1557/1476/1557\r\nf 1557/1476/1557 10/13/10 11/1489/11\r\nf 1557/1476/1557 11/1489/11 1558/1490/1558\r\nf 1558/1490/1558 11/1489/11 12/14/12\r\nf 1558/1490/1558 12/14/12 1559/1478/1559\r\nf 1559/1478/1559 12/14/12 1/1491/1\r\nf 1559/1478/1559 1/1491/1 1548/1481/1548\r\n"
  },
  {
    "path": "share/k3d/guide/CMakeLists.txt",
    "content": "PROJECT(guide)\n\n# Note - we build all of the guide-related targets from this one listfile because\n# it makes it much easier to handle custom command dependencies.\n\nSET(CONTENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/content)\nSET(CONTENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/content)\nFILE(MAKE_DIRECTORY ${CONTENT_BINARY_DIR})\n\nSET(DOCBOOK_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/docbook)\nFILE(MAKE_DIRECTORY ${DOCBOOK_BINARY_DIR})\n\nSET(CHUNKED_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/chunked)\nFILE(MAKE_DIRECTORY ${CHUNKED_BINARY_DIR})\n\nSET(HTML_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/html)\nFILE(MAKE_DIRECTORY ${HTML_BINARY_DIR})\n\nSET(PDF_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/pdf)\nFILE(MAKE_DIRECTORY ${PDF_BINARY_DIR})\n\nSET(QT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/qt)\nSET(QT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/qt)\nFILE(MAKE_DIRECTORY ${CONTENT_BINARY_DIR})\n\nCONFIGURE_FILE(${CONTENT_SOURCE_DIR}/guide-docinfo.xml.in ${CONTENT_BINARY_DIR}/guide-docinfo.xml @ONLY)\nCONFIGURE_FILE(${CONTENT_SOURCE_DIR}/guide.txt.in ${CONTENT_BINARY_DIR}/guide.txt @ONLY)\nCONFIGURE_FILE(${CONTENT_SOURCE_DIR}/plugins.py.in ${CONTENT_BINARY_DIR}/plugins.py @ONLY)\n\nCONFIGURE_FILE(${QT_SOURCE_DIR}/about.txt.in ${QT_BINARY_DIR}/about.txt @ONLY)\nCONFIGURE_FILE(${QT_SOURCE_DIR}/guide.qhcp.in ${QT_BINARY_DIR}/guide.qhcp @ONLY)\nCONFIGURE_FILE(${QT_SOURCE_DIR}/guide.qhp.in ${QT_BINARY_DIR}/guide.qhp @ONLY)\nCONFIGURE_FILE(${share_SOURCE_DIR}/k3d/icons/k3d.png ${QT_BINARY_DIR}/k3d.png COPYONLY)\n\nFILE(GLOB GUIDE_CONTENT ${CONTENT_SOURCE_DIR}/*.txt)\nLIST(APPEND GUIDE_CONTENT ${CONTENT_BINARY_DIR}/guide.txt)\nLIST(APPEND GUIDE_CONTENT ${CONTENT_BINARY_DIR}/guide-docinfo.xml)\nLIST(APPEND GUIDE_CONTENT ${CONTENT_BINARY_DIR}/plugins.txt)\nLIST(SORT GUIDE_CONTENT)\n\n# Setup generation of the reference documentation ...\nGET_TARGET_PROPERTY(K3D_COMMAND k3d LOCATION)\n\nADD_CUSTOM_COMMAND(\n\tDEPENDS k3d k3d-python ${CONTENT_BINARY_DIR}/plugins.py\n\tWORKING_DIRECTORY ${CONTENT_BINARY_DIR}\n\tCOMMAND ${K3D_COMMAND} --log-level=debug --color --script-file=${CONTENT_BINARY_DIR}/plugins.py --ui=nui\n\tOUTPUT ${CONTENT_BINARY_DIR}/plugins.txt\n\t)\n\nADD_CUSTOM_COMMAND(\n\tDEPENDS ${GUIDE_CONTENT}\n\tCOMMAND ${ASCIIDOC_COMMAND} --attribute docinfo --doctype book --backend docbook --out-file ${DOCBOOK_BINARY_DIR}/guide.xml ${CONTENT_BINARY_DIR}/guide.txt\n\tOUTPUT ${DOCBOOK_BINARY_DIR}/guide.xml\n\t)\n\nADD_CUSTOM_TARGET(docs-guide-docbook\n\tDEPENDS ${DOCBOOK_BINARY_DIR}/guide.xml\n\t)\n\nADD_CUSTOM_COMMAND(\n\tDEPENDS ${DOCBOOK_BINARY_DIR}/guide.xml\n\tCOMMAND ${CMAKE_COMMAND} -E copy_directory ${DOCBOOK_BINARY_DIR} ${CHUNKED_BINARY_DIR}\n\tCOMMAND ${A2X_COMMAND} -v --format chunked ${CHUNKED_BINARY_DIR}/guide.xml\n\tOUTPUT ${CHUNKED_BINARY_DIR}/guide.chunked/index.html\n\t)\n\n# Setup optional generation of a standalone HTML version of the guide ...\nADD_CUSTOM_TARGET(docs-guide-html\n\tDEPENDS ${CHUNKED_BINARY_DIR}/guide.chunked/index.html\n\tCOMMAND ${CMAKE_COMMAND} -E copy_directory ${CHUNKED_BINARY_DIR}/guide.chunked ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/html\n\t)\n\n# Setup optional generation of a standalone PDF version of the guide ...\nADD_CUSTOM_TARGET(docs-guide-pdf\n\tDEPENDS ${DOCBOOK_BINARY_DIR}/guide.xml\n\tCOMMAND ${CMAKE_COMMAND} -E copy_directory ${DOCBOOK_BINARY_DIR} ${PDF_BINARY_DIR}\n\tCOMMAND ${A2X_COMMAND} -v --format pdf ${PDF_BINARY_DIR}/guide.xml\n\t)\n\n# Setup generation of an HTML version of the guide for use with the NGUI ...\nIF(K3D_BUILD_NGUI_MODULE)\n\tADD_CUSTOM_COMMAND(\n\t\tDEPENDS ${CHUNKED_BINARY_DIR}/guide.chunked/index.html\n\t\tCOMMAND ${CMAKE_COMMAND} -E copy_directory ${CHUNKED_BINARY_DIR}/guide.chunked ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/html\n\t\tOUTPUT ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/html/index.html\n\t\t)\n\n\tADD_CUSTOM_TARGET(docs-guide-ngui ALL\n\t\tDEPENDS ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/html/index.html\n\t\t)\n\n\tINSTALL(DIRECTORY ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/html DESTINATION share/k3d/guide)\nENDIF()\n\n# Setup generation of a Qt Assistant version of the guide for use with the QTUI ...\nIF(K3D_BUILD_QTUI_MODULE)\n\tFIND_PROGRAM(QHELPGENERATOR_COMMAND NAMES qhelpgenerator qhelpgenerator-mac)\n\tFIND_PROGRAM(QCOLLECTIONGENERATOR_COMMAND NAMES qcollectiongenerator qcollectiongenerator-mac)\n\n\tADD_CUSTOM_COMMAND(\n\t\tDEPENDS\n\t\t\t${CHUNKED_BINARY_DIR}/guide.chunked/index.html\n\t\t\t${QT_BINARY_DIR}/guide.qhp\n\t\tCOMMAND ${CMAKE_COMMAND} -E copy_directory ${CHUNKED_BINARY_DIR}/guide.chunked ${QT_BINARY_DIR}\n\t\tCOMMAND ${QHELPGENERATOR_COMMAND} ${QT_BINARY_DIR}/guide.qhp -o ${QT_BINARY_DIR}/guide.qch\n\t\tOUTPUT ${QT_BINARY_DIR}/guide.qch\n\t\t)\n\n\tADD_CUSTOM_COMMAND(\n\t\tDEPENDS\n\t\t\t${QT_BINARY_DIR}/about.txt\n\t\t\t${QT_BINARY_DIR}/guide.qhcp\n\t\t\t${QT_BINARY_DIR}/guide.qch\n\t\t\t${QT_BINARY_DIR}/k3d.png\n\t\tCOMMAND ${QCOLLECTIONGENERATOR_COMMAND} ${QT_BINARY_DIR}/guide.qhcp -o ${QT_BINARY_DIR}/guide.qhc\n\t\tOUTPUT ${QT_BINARY_DIR}/guide.qhc\n\t\t)\n\n\tADD_CUSTOM_COMMAND(\n\t\tDEPENDS ${QT_BINARY_DIR}/guide.qch\n\t\tCOMMAND ${CMAKE_COMMAND} -E copy ${QT_BINARY_DIR}/guide.qch ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/guide.qch\n\t\tOUTPUT ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/guide.qch\n\t\t)\n\n\tADD_CUSTOM_COMMAND(\n\t\tDEPENDS ${QT_BINARY_DIR}/guide.qhc\n\t\tCOMMAND ${CMAKE_COMMAND} -E copy ${QT_BINARY_DIR}/guide.qhc ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/guide.qhc\n\t\tOUTPUT ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/guide.qhc\n\t\t)\n\n\tADD_CUSTOM_TARGET(docs-guide-qtui ALL\n\t\tDEPENDS ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/guide.qch\n\t\tDEPENDS ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/guide.qhc\n\t\t)\n\n\tINSTALL(FILES ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/guide.qch DESTINATION share/k3d/guide)\n\tINSTALL(FILES ${K3D_SHARE_OUTPUT_DIRECTORY}/k3d/guide/guide.qhc DESTINATION share/k3d/guide)\nENDIF()\n"
  },
  {
    "path": "share/k3d/guide/content/building_plugins.txt",
    "content": "= Building Plugins =\n\n== Out-of-Source Plugins ==\n\nA K-3D plugin module is simply a shared library (DLL) that is automatically loaded by K-3D runtime.  Although you could create your own private makefiles or IDE project files to build a plugin module, K-3D provides an innovative way to integrate out-of-source plugins into the K-3D build, instead.  By incorporating your module into K-3D's build you save time and effort, and your binary module can be automatically packaged and installed along with the rest of K-3D, making it easy to create your own \"custom\" K-3D distribution to share with colleagues.\n\nTo make it happen, create a directory to hold your plugin module sources, and add a 'CMakeLists.txt' file:\n\n------------------------------------------------\nK3D_BUILD_MODULE(sample-module)\nK3D_CREATE_MODULE_PROXY(sample-module)\n------------------------------------------------\n\nFor many plugins, no further configuration is required ... create the plugin sources in your new directory, and you're ready to include your module in the K-3D build.  To do so, cd into your K-3D build directory and run cmake:\n\n------------------------------------------------\n$ cd ~/k3d-build\n$ make edit_cache\n------------------------------------------------\n\nUsing the cmake UI, add 'sample_module' to the K3D_EXTERNAL_MODULES variable, and configure.  CMake will display a harmless error that we will correct in the next step:\n\n------------------------------------------------\nCMake Error: The \"sample_module\" module source directory \"sample_module_EXTERNAL_SOURCE_DIR-NOTFOUND\" does not exist.\nSpecify a different directory using sample_module_EXTERNAL_SOURCE_DIR\n------------------------------------------------\n\nYou will see that two new cmake variables have been created:\n\n* K3D_BUILD_sample_module - Enables / disables compilation of your module.\n* sample_module_EXTERNAL_SOURCE_DIR - Points to the directory containing your module.\n\nK3D_BUILD_sample_module will already be \"ON\" by default, but you must specify the path to your module sources in sample_module_EXTERNAL_SOURCE_DIR.  Once you've set the path, configure; generate; and you'll be ready to build K-3D, including your new module:\n\n------------------------------------------------\n$ make\n------------------------------------------------\n\nYou will see your module built along with the rest of K-3D:\n\n------------------------------------------------\n...\n[100%] Built target k3d-yafray-proxy\n[100%] Building CXX object modules/external/sample_module/CMakeFiles/sample-module.dir/module.cpp.o\nLinking CXX shared library ../../../lib/k3d/plugins/sample-module.module\n[100%] Built target sample-module\n[100%] Generating ../../../lib/k3d/plugins/sample-module.module.proxy\nLoading plugin module /home/tshead/build/k3d/lib/k3d/plugins/sample-module.module\nLoading plugin SamplePlugin\n[100%] Built target sample-module-proxy\n------------------------------------------------\n\nNote that your module binary will be located alongside the rest of the standard K-3D plugins:\n\n------------------------------------------------\n$ ls lib/k3d/plugins/\n...\nsample-module.module\nsample-module.module.proxy\n------------------------------------------------\n\nNow, run K-3D and see that the module is successfully loaded:\n\n------------------------------------------------\n$ make run\n------------------------------------------------\n\nIn the console output, you will see:\n\n------------------------------------------------\nINFO: Proxying plugin module /home/user/k3d-build/lib/k3d/plugins/sample-module.module\n------------------------------------------------\n\nwhich indicates that your new module was successfully loaded.  Even though your plugin sources are outside the K-3D source tree, in all other respects your plugin will be built and treated as a \"normal\" K-3D plugin.\n\nIf your plugin has external dependencies, you will provide additional logic in your plugin's 'CMakeLists.txt' file to locate header file paths and link libraries, for example:\n\n------------------------------------------------\nFIND_PATH(FOO_HEADERS foo.h)\nFIND_LIBRARY(FOO_LIBRARY foo)\n\nINCLUDE_DIRECTORIES(${FOO_HEADERS})\nK3D_BUILD_MODULE(sample-module)\nK3D_CREATE_MODULE_PROXY(sample-module)\nTARGET_LINK_LIBRARIES(sample-module ${FOO_LIBRARY})\n------------------------------------------------\n\nSee 'k3d/docs/sample_module' for a working example of an out-of-source plugin.\n\n== Within-Source Plugins ==\n\nIf you're a member of the K-3D development team creating a plugin that will become part of the \"official\" K-3D sources, creating an in-source plugin \"foo\" is the same as creating an out-of-source plugin, with just a few extra steps.\n\n* Create a plugin module directory 'k3d/modules/foo'.\n* Add a 'k3d/modules/foo/CMakeLists.txt' and source code to your new directory.\n* In the top-level 'k3d/CMakeLists.txt', add a CMake variable that will control whether your plugin module will be built:\n\n------------------------------------------------\nOPTION(K3D_BUILD_FOO_MODULE \"Build the foo plugin module\" ON)\n------------------------------------------------\n\n* In the 'k3d/module/CMakeLists.txt' file, add your module to the build:\n\n------------------------------------------------\nK3D_ADD_SUBDIRECTORY(foo REQUIRES K3D_BUILD_FOO_MODULE)\n------------------------------------------------\n\n* If your plugin has a dependency on a third-party library \"libfoo\", you will need to create a special CMake file that will test to see if the libfoo is installed, and where its header files and link libraries are located:\n** Create a \"K3DFindFoo.cmake\" file in the 'k3d/cmake/modules' directory.  Use the other files in the directory as a guide.\n** Add 'INCLUDE(K3DFindFoo)' to the top-level 'k3d/CMakeLists.txt'.  Test whether libfoo is found before using it.\n\nAnd you're done!\n\n== Alternatives ==\n\nOf-course, it is completely practical to build K-3D plugin modules using any development environment that suits you, including autotools, Eclipse, XCode, MSVC, etc.  In these cases you will want to study the CMake files included in the K-3D sources to see how plugin modules are normally built, along with their header-file and link dependencies.  In particular, you will need to become familiar with the K3D_BUILD_MODULE, K3D_BUILD_NGUI_MODULE, and K3D_CREATE_MODULE_PROXY CMake macros in 'k3d/modules/CMakeLists.txt'.\n\nNote that the binary name for a K-3D plugin module \"foo\" will always be \"foo.module\", regardless of platform (i.e. there is no \".so\", \".dylib\", or \".dll\" extension).\n\nWhen creating plugin modules in this fashion you will have to provide your own mechanism to install your modules to the directory from which K-3D loads plugins.\n\n"
  },
  {
    "path": "share/k3d/guide/content/debugging.txt",
    "content": "[[Debugging]]\n= Debugging =\n\n== Overview ==\n\n* Build K-3D with 'CMAKE_BUILD_TYPE' set to 'Debug'.\n* If you have a consistent way of crashing K-3D, start K-3D from the build dir using 'make run-gdb/fast'\n* At the gdb prompt, type 'run'\n* Do what is needed to provoke the crash\n* Switch back to the terminal where you started K-3D, and type 'bt'\n* You should now get a trace, showing the files and lines of source code that led to the crash\n\n== Exceptions ==\n\nDebugging thrown exceptions can be tricky, because the backtrace at the point where an exception is 'caught' often provides little information on where the exception was 'thrown'.  To get around this, you simply run K-3D in the debugger, and set a ``catchpoint'' (a kind of specialized breakpoint) that will stop execution whenever 'any' exception is thrown.  See the gdb documentation at http://sourceware.org/gdb/current/onlinedocs/gdb/Set-Catchpoints.html#Set-Catchpoints for details.\n"
  },
  {
    "path": "share/k3d/guide/content/guide-docinfo.xml.in",
    "content": "<subtitle>A Guide to Professional 3D Graphics Using K-3D</subtitle>\n<copyright>\n  <year>2010</year>\n  <holder>Timothy M. Shead</holder>\n</copyright>\n\n"
  },
  {
    "path": "share/k3d/guide/content/guide.txt.in",
    "content": "Seven Degrees of Freedom\n========================\nTimothy M. Shead <tshead@k-3d.com>\nJune, 2010\n\nK-3D Users' Guide\n=================\n\n:leveloffset: 1\ninclude::@CONTENT_SOURCE_DIR@/pipeline.txt[]\ninclude::@CONTENT_SOURCE_DIR@/importing_exporting.txt[]\ninclude::@CONTENT_SOURCE_DIR@/scripting.txt[]\ninclude::@CONTENT_SOURCE_DIR@/render_models.txt[]\ninclude::@CONTENT_SOURCE_DIR@/luxrender.txt[]\ninclude::@CONTENT_SOURCE_DIR@/time.txt[]\n:leveloffset: 0\n\nK-3D Developers' Guide\n======================\n\n:leveloffset: 1\ninclude::@CONTENT_SOURCE_DIR@/debugging.txt[]\ninclude::@CONTENT_SOURCE_DIR@/logging.txt[]\ninclude::@CONTENT_SOURCE_DIR@/plugin_design.txt[]\ninclude::@CONTENT_SOURCE_DIR@/on_demand_modules.txt[]\ninclude::@CONTENT_SOURCE_DIR@/building_plugins.txt[]\ninclude::@CONTENT_SOURCE_DIR@/pipeline_hints.txt[]\ninclude::@CONTENT_SOURCE_DIR@/resources.txt[]\n:leveloffset: 0\n\nK-3D Reference Manual\n=====================\n\n:leveloffset: 1\ninclude::@CONTENT_BINARY_DIR@/plugins.txt[]\n\n[appendix]\nK-3D Commands\n=============\n:leveloffset: 2\ninclude::@man_BINARY_DIR@/k3d.1.txt[]\ninclude::@man_BINARY_DIR@/k3d-renderframe.1.txt[]\ninclude::@man_BINARY_DIR@/k3d-renderjob.1.txt[]\ninclude::@man_BINARY_DIR@/k3d-sl2xml.1.txt[]\ninclude::@man_BINARY_DIR@/k3d-uuidgen.1.txt[]\n:leveloffset: 1\n\n:leveloffset: 0\n\n[index]\nIndex\n-----\n\n"
  },
  {
    "path": "share/k3d/guide/content/importing_exporting.txt",
    "content": "= Importing and Exporting Data =\n\n== Overview ==\n\nUsers often wish to load and save data (usually-but-not-necessarily mesh data)\nusing file formats specific to other applications.  This is commonly referred\nto as \"importing\" and \"exporting\" data.   K-3D provides four types of plugins\nrelated to the task:\n\n* Importers\n* Exporters\n* Readers\n* Writers\n\nImporters and Exporters work to load and save entire documents (or subsets of\ndocuments) in a single pass.  As an example, when you save a K-3D document\nusing K-3D's native .k3d file format, you are using the <<K3DDocumentExporter,K3DDocumentExporter>>\nplugin.  When you reload the document from disk, you are using the\n<<K3DDocumentImporter,K3DDocumentImporter>> plugin.\n\nReaders and Writers are individual nodes that become part of a document and the\n[[Visualization Pipeline]].  A Reader is a data source, and a Writer is a data\nsink.  Once a Reader or Writer is created and hooked into the pipeline, you can\nmodify its properties (such as pointing it to a different data file) and the\npipeline will automatically update with the new data.\n\nNote the dualities among the different plugin types.  An Importer ''creates''\nnodes based on the contents of an external file, while a Reader ''is-a'' node\nthat reads data from an external file.  An exporter ''copies'' nodes to an\nexternal file, whereas a Writer ''is-a'' node that writes data to an external\nfile.  Stated differently: an Importer copies data from an external file into\nyour document, so that the data becomes part of the document and is stored and\nloaded along with the rest of its contents.  A Reader \"references\" data in an\nexternal file, loading it into memory when needed, but the data remains\nexternal to the document.\n\nUnderstanding the distinctions among the external file plugin types is\nimportant because there may be more than one type implemented for a given file\nformat.  In this case, you will have to choose the correct plugin for your\nneeds.  As an example, file format \"foo\" might eventually have both \"FooReader\"\nand \"FooDocumentImporter\" plugins.\n\n== Usage ==\n\n=== Importers ===\n\n* Select the ''File > Import'' menu item.\n* A file dialog will appear allowing you to choose a file to be imported.\n* The file dialog will also contain a dropdown list of available Importers.\n* You may explicitly choose the Importer you want to use, or you may use automatic detection, which will attempt to choose the correct Importer for the file you selected.\n\n=== Exporters ===\n\n* Select the ''File > Export'' menu item.\n* A file dialog will appear allowing you to choose a file to be exported.\n* The file dialog will also contain a dropdown list of available Exporters.\n* You may explicitly choose the Exporter you want to use, or you may use automatic detection, which will attempt to choose the correct Exporter for the file you selected.\n\n=== Readers ===\n\n* Use the ''Create'' menu to create a Reader node.\n* Check the Reader's properties in the [[Node Properties Panel]].\n* Choose a filename that will become the Reader's input.\n* See [[Managing External Files]] for details on how paths to external files are stored.\n\n=== Writers ===\n\n* Use the ''Create'' menu to create a Writer node.\n* Check the Writer's properties in the [[Node Properties Panel]].\n* Choose a filename where the Writer will save its output.\n* You must manually make a connection from the [[Visualization Pipeline]] into the Writer's input.\n* See [[Managing External Files]] for details on how paths to external files are stored.\n\n"
  },
  {
    "path": "share/k3d/guide/content/logging.txt",
    "content": "[[logging]]\n= Logging =\n\nAll error, information, and debugging messages must be logged to the k3d::log() stream using the K-3D logging interface, without exception - 'printf()' and other mechanisms for logging must not be used.  This ensures that log messages can be displayed and controlled by end-users via the mechanisms that K-3D provides for that purpose.  You should also specify the log level of every message, using the iostream-compatible manipulators defined in 'k3dsdk/log.h':\n\n-------------------------\n#include <k3dsdk/log.h>\n \nk3d::log() << debug << \"This is an internal debugging message\" << std::endl;\nk3d::log() << info << \"This is an informational message\" << std::endl;\nk3d::log() << warning << \"Recoverable unexpected input or behavior has occurred\" << std::endl;\nk3d::log() << error << \"Current operation cannot complete due to unexpected input or behavior\" << std::endl;\nk3d::log() << critical << \"Application will shut down due to an unrecoverable condition\" << std::endl;\n-------------------------\n\nEach message should be written to a single line of output, and you should terminate messages with std::endl instead of ``\\n'' to ensure that they are flushed immediately.\n\nBy default, K-3D normally outputs warning messages and above.  To print information and debug messages too, use the '--log-level debug' command-line option.  For developers, the 'make run' target sets 'log-level debug' by default.\n\nUsers can customize log output using a variety of runtime arguments.  See 'k3dsdk/log_control.h' and 'k3dsdk/log.cpp' for details on how we tailor console output.\n\nYou are strongly encouraged to use the macros defined in <k3dsdk/result.h> to test for preconditions and other runtime problems in your code.  Note that these are not ``debug'' macros ... they are always compiled into every build, so you may use them with expressions that have side effects:\n\n-------------------------\n#include <k3dsdk/result.h>\n \nassert_not_implemented(); // This code hasn't been implemented yet\nassert_not_reached(); // This code should never be executed.\nassert_warning(Expression); // Generates a warning message if Expression evaluates false.\nreturn_if_fail(Expression); // Generates an error message and returns from the enclosing function if Expression evaluates false.\nreturn_val_if_fail(Expression, Val); // Generates an error message and returns Val from the enclosing function if Expression evaluates false.\n-------------------------\n\n\n"
  },
  {
    "path": "share/k3d/guide/content/luxrender.txt",
    "content": "= LuxRender =\n\nThe experimental new <<LuxRenderPlugins>>\nallow K-3D scenes to be rendered using http://www.luxrender.net LuxRender - ``a\nnew, open-source, free software rendering system for physically correct,\nunbiased image synthesis.''\n\n== Usage ==\n\nAs with all render engines, the key to using LuxRender in a K-3D scene is to:\n\n* Assign LuxRender materials to your geometry.\n* Use LuxRender lights to light the scene.\n* Use <<LuxRenderEngine>> to render the scene.\n\nFor example:\n\n* Start a new K-3D scene.\n* Add a <<LuxRenderSunLight>> and <<LuxRenderSkyLight>> to provide physically-based lighting.\n* Create some new geometry for the scene, such as a small <<PolyCube>> sitting on top of a large, flat <<PolyCube>>.\n* Create a new <<LuxRenderEngine>>.\n* Choose Render > Frame from the menus, and pick the <<LuxRenderEngine>> when prompted.  Supply an output image, and wait for the render to complete.\n\n== Caveats ==\n\n<<LuxRenderEngine>> renders images by executing the \"luxconsole\" command (note:\nlower-case).  This should work out-of-the-box on GNU/Linux and Windows.  On\nMacOSX, the luxconsole executable is distributed in an application bundle which\nthe user could put anywhere.  In this case, you will either have to adjust your\nPATH to point to the interior of the bundle, or create a shell script wrapper\nto start the render engine, something along the lines of:\n\n--------------------------------------------------------\n#!/bin/sh\ncd /Applications/LuxRender.app/Contents/MacOS\n./luxrender $*\n--------------------------------------------------------\n\n... and ensure that the wrapper script can be found on your PATH.\n\n"
  },
  {
    "path": "share/k3d/guide/content/on_demand_modules.txt",
    "content": "= On-Demand Modules =\n\n== Overview ==\n\nIn K-3D, most functionality is implemented as 'plugins'.  Plugins are stored in shared libraries called 'modules', and dynamically loaded at runtime.  Significant effort has been expended to develop the infrastructure to accomplish this.  Modules are located and loaded at program startup time, so that the complete set of available plugins is always in memory and ready for use.  As each module is loaded, it registers a set of 'plugin factories' with the application.  Each plugin factory can be queried for metadata describing the plugin type it represents, and is used to create instances of that plugin type.  The set of available plugins and their capabilities is generated from the set of registered plugin factories.  Great care has been taken to ensure that application code does not assume the availability of specific plugins or capabilities, and fails gracefully in their absence.\n\nAlthough this system worked well for K-3D over many years, some drawbacks became obvious as the program grew.  As plugin modules increased in size and number, application startup time increased.  This was compounded by the growing number of plugin modules that had external dependencies on \"third party\" libraries.  These dependencies were also loaded at startup, increasing the size of the application working-set and slowing startup further.  The expanding set of runtime libraries became an even greater liability during debugging, when the debugger must load both dependent libraries and their debugging symbols before debugging can start.  These issues finally reached a point where a system with 512Mb real and 512Mb virtual memory could not load a K-3D core dump into gdb.\n\n== Design ==\n\nThe set of plugins actually used by a given document is usually a very narrow subset of all available plugins.  For example, it would be very rare to have a document that contained readers and writers for every external file format supported by K-3D.  Many features such as NURBS and image processing are not heavily used at the current time.  'On Demand Modules' take advantage of this by loading a set of 'module proxies' at startup, instead of loading the modules themselves.  Each module proxy is an XML file that describes all of the plugin factories for a given module:\n\n---------------------------------------------------------\n <?xml version=\"1.0\" ?>\n <k3dml package=\"k3d\" version=\"0.5.0.37\" host=\"i686-pc-mingw32\">\n   <module name=\"libk3daqsis.dll\" class=\"00000000 00000000 00000000 00000000\">\n     <plugins>\n       <plugin name=\"AqsisSurfaceShaderLayer\" class=\"261e244e d82947ba 9e56a9af 03d4cc0f\" quality=\"experimental\" type=\"document\">\n         <short_description>Encapsulates an Aqsis surface shader layer</short_description>\n         <categories>\n           <category>Aqsis</category>\n         </categories>\n         <interfaces>\n           <interface>k3d::ri::isurface_shader</interface>\n           <interface>k3d::aqsis::isurface_layer</interface>\n         </interfaces>\n       </plugin>\n       <plugin name=\"AqsisDisplacementShaderLayer\" class=\"1802dce3 71004329 80cbdf0e bc7f142c\" quality=\"experimental\" type=\"document\">\n         <short_description>Encapsulates an Aqsis displacement shader layer</short_description>\n         <categories>\n           <category>Aqsis</category>\n         </categories>\n         <interfaces>\n           <interface>k3d::ri::idisplacement_shader</interface>\n           <interface>k3d::aqsis::idisplacement_layer</interface>\n         </interfaces>\n       </plugin>\n       <plugin name=\"Teapot\" class=\"b761f071 f7ed4297 9449028d 2f6236f0\" quality=\"stable\" type=\"document\">\n         <short_description>Renders a teapot primitive in render engines that support one (Aqsis!)</short_description>\n         <categories>\n           <category>Aqsis</category>\n         </categories>\n         <interfaces>\n           <interface>k3d::itransform_source</interface>\n           <interface>k3d::itransform_sink</interface>\n         </interfaces>\n       </plugin>\n     </plugins>\n   </module>\n </k3dml>\n---------------------------------------------------------\n\nModule proxies are automatically generated by the build system using the 'k3d-make-module-proxy' executable.\n\nEach module proxy has the same path and name as the corresponding module, with \".proxy\" appended, so a module \"k3d-foo.module\" will have a proxy \"k3d-foo.module.proxy\".\n\nBefore loading a module at runtime, K-3D checks for the existence of a corresponding proxy file.  If the proxy file exists, the application uses it to register a set of 'plugin factory proxies', which use the serialized XML data to mimic the behavior of the loaded module's plugin factories.  When a caller requests metadata from a plugin factory proxy, it receives the same results it would have received from the \"real\" plugin factory.  When a caller requests instantiation of a plugin, the plugin factory proxy checks to see if the corresponding module has been loaded or not.  If not, the module is loaded and the \"real\" plugin factory is used to complete the request.\n\nThus, only those plugins that get used have their plugin modules loaded into the application working set - \"you don't pay for what you don't use\".  The proxying is transparent to calling code, which does not need to be modified to benefit from the new behavior.\n\nIf a proxy isn't available for a given module, the module is immediately loaded, as has been done in the past.  This is useful for a narrow-class of special modules whose capabilities are determined at runtime instead of compile-time.\n\n== Benefits ==\n\n* Faster application startup.\n* More memory available for your work.\n* Faster debugging for developers.\n\n== Drawbacks ==\n\n* There may be a noticable pause the first time a given plugin is used.\n* There is potential for a binary module and the corresponding proxy to get out-of-sync, causing \"missing\" plugins, missing functionality, or segfaults.  This risk is minimized by the fact that proxies are automatically generated by the build process, are automatically installed, and automatically packaged.\n\n== Developer Notes ==\n\nFor a given plugin type, developers should not assume that the plugin factory returned from k3d::application::plugins() is the same object as the factory returned by k3d::inode::factory().  To compare factory instances for equivalence, compare the results of their class_id() methods.\n\n== Future Exploration ==\n\n* As further experience is accumulated with On Demand Modules, we will likely want to \"tune\" the set of modules and proxies to further improve our management of the application working set.\n** As an example, we might want to \"split\" an existing module into two-or-more smaller modules, so oft-used plugins don't cause rarely-used plugins to be loaded.\n** Conversely, it may make sense to merge a set of ubiquitously-used plugins into a single module.\n** For some ubiquitously-used modules it may make sense to avoid proxying altogether.  As an example, proxying is disabled when loading user-interface modules, since the user-interface module is always loaded, or the program exits.\n* The current design still assumes that the set of available plugins remains static once application startup is complete.  Allowing plugin modules to be loaded or unloaded while the application is running may be worth considering.\n\n"
  },
  {
    "path": "share/k3d/guide/content/pipeline.txt",
    "content": "[[VisualizationPipeline]]\nPipeline Basics\n===============\n\n== Overview ==\n\nThe fundamental organizing structure of K-3D is the 'Visualization Pipeline': K-3D user documents are made up of 'Nodes'.  When you use a plugin, you are usually adding a new node to the document.  Each node created is a new instance of a specific plugin type.  We represent nodes diagrammatically as boxes, and label them based on either the node's type or its purpose:\n\n(((Visualization Pipeline)))\n(((Pipeline)))\n(((Nodes)))\n\n[\"graphviz\", \"pipeline2.png\"]\n------------------------------------\n\ndigraph\n{\ngraph [rankdir=\"LR\"]\nnode [shape=\"box\",fontname=\"Helvetica\"]\nA [label=\"Node\"]\n}\n\n------------------------------------\n\nAlthough there are exceptions, most nodes can be categorized as 'Sources' 'Modifiers' or 'Sinks' of data.  Sources create data, modifiers process data, and sinks consume data.  Thus, data ``flows'' from sources, is altered by modifiers, and terminates at sinks.  We can represent this flow using arrows:\n\n(((Sources)))\n(((Modifiers)))\n(((Sinks)))\n\n[\"graphviz\", \"pipeline3.png\"]\n------------------------------------\n\ndigraph\n{\ngraph [rankdir=\"LR\"]\nnode [shape=\"box\",fontname=\"Helvetica\"]\nSource -> Modifier -> Sink\n}\n\n------------------------------------\n\nThis is where the term 'Pipeline' originates - connections between nodes act as ``pipes'' and data flows through them like water.  Though it may not be obvious to the casual observer, all K-3D operations are performed using the pipeline, with human interaction converted into pipeline manipulations by the user interface layer.\n\nAs a concrete example, here is a typical example of a ``real'' pipeline:\n\n[\"graphviz\", \"pipeline4.png\"]\n------------------------------------\n\ndigraph\n{\ngraph [rankdir=\"LR\"]\nnode [shape=\"box\",fontname=\"Helvetica\"]\nPolyGrid [URL=\"http://www.k-3d.org/wiki/PolyGrid\"]\nScalePoints [URL=\"http://www.k-3d.org/wiki/ScalePoints\"]\nMeshInstance [URL=\"http://www.k-3d.org/wiki/MeshInstance\"]\nPolyGrid -> ScalePoints -> MeshInstance\n}\n\n------------------------------------\n\nIn this example, the <<PolyGrid,PolyGrid>> plugin acts as a source, producing geometric data (in this case, a regular polygon grid).  The <<ScalePoints,ScalePoints>> plugin acts as a modifier, applying a scaling transformation to any geometry that passes through it.  Finally, the <<MeshInstance,MeshInstance>> plugin is a consumer of data, rendering geometric input to the screen as a 2D image.\n\nOf course, the pipeline can grow to be as complex as needed ... for example, a pipeline can contain multiple modifiers:\n\n[\"graphviz\", \"pipeline5.png\"]\n------------------------------------\n\ndigraph\n{\ngraph [rankdir=\"LR\"]\nnode [shape=\"box\",fontname=\"Helvetica\"]\nPolyGrid [URL=\"http://www.k-3d.org/wiki/PolyGrid\"]\nRotatePoints [URL=\"http://www.k-3d.org/wiki/RotatePoints\"]\nScalePoints [URL=\"http://www.k-3d.org/wiki/ScalePoints\"]\nMeshInstance [URL=\"http://www.k-3d.org/wiki/MeshInstance\"]\nPolyGrid -> ScalePoints -> RotatePoints ->MeshInstance\n}\n\n------------------------------------\n\nHere, a second modifier - <<RotatePoints,RotatePoints>> - is added to the pipeline, further altering data after it is modified by <<ScalePoints,ScalePoints>>.  As you might imagine, you are free to chain-together modifiers in any number and combination desired.\n\n== Fan-Out ==\n\nThe flexibility of the pipeline doesn't end there, however.  Pipelines can ``fan-out'', sending data to multiple destinations:\n\n[\"graphviz\", \"pipeline6.png\"]\n------------------------------------\n\ndigraph\n{\ngraph [rankdir=\"LR\"]\nnode [shape=\"box\",fontname=\"Helvetica\"]\nPolyGrid [URL=\"http://www.k-3d.org/wiki/PolyGrid\"]\nScalePoints [URL=\"http://www.k-3d.org/wiki/ScalePoints\"]\nMeshInstance1 [URL=\"http://www.k-3d.org/wiki/MeshInstance\"]\nMeshInstance2 [URL=\"http://www.k-3d.org/wiki/MeshInstance\"]\nPolyGrid -> ScalePoints -> MeshInstance1\nScalePoints -> MeshInstance2\n}\n\n------------------------------------\n\nIn this case, the fan-out sends the scaled polygon data to two separate <<MeshInstance,MeshInstance>> nodes.  That means that the scene will contain two identical copies of the scaled data.\n\nNote that there is no requirement that you fan-out to a data sink - the pipeline can be arbitrarily complex after the fan-out as-well-as before it:\n\n[\"graphviz\", \"pipeline7.png\"]\n------------------------------------\n\ndigraph\n{\ngraph [rankdir=\"LR\"]\nnode [shape=\"box\",fontname=\"Helvetica\"]\nPolyGrid [URL=\"http://www.k-3d.org/wiki/PolyGrid\"]\nRotatePoints [URL=\"http://www.k-3d.org/wiki/RotatePoints\"]\nScalePoints [URL=\"http://www.k-3d.org/wiki/ScalePoints\"]\nMeshInstance1 [URL=\"http://www.k-3d.org/wiki/MeshInstance\"]\nMeshInstance2 [URL=\"http://www.k-3d.org/wiki/MeshInstance\"]\nPolyGrid -> ScalePoints -> MeshInstance1\nScalePoints -> RotatePoints -> MeshInstance2\n}\n\n------------------------------------\n\nIn this case, the output of the <<ScalePoints,ScalePoints>> node splits into two separate ``branches'' of the pipeline, but is further modified by <<RotatePoints,RotatePoints>> in the second branch.  Again, the pipeline could become arbitrarily complex, including further branches and modifiers.\n\n== Fan-In ==\n\nThis is not the end of the story however, as pipelines can also ``fan-in'', merging two-or-more pipeline branches into a single branch:\n\n[\"graphviz\", \"pipeline8.png\"]\n------------------------------------\n\ndigraph\n{\ngraph [rankdir=\"LR\"]\nnode [shape=\"box\",fontname=\"Helvetica\"]\nPolyGrid [URL=\"http://www.k-3d.org/wiki/PolyGrid\"]\nPolySphere [URL=\"http://www.k-3d.org/wiki/PolySphere\"]\nMergeMesh [URL=\"http://www.k-3d.org/wiki/MergeMesh\"]\nScalePoints [URL=\"http://www.k-3d.org/wiki/ScalePoints\"]\nMeshInstance [URL=\"http://www.k-3d.org/wiki/MeshInstance\"]\nPolyGrid -> MergeMesh -> ScalePoints -> MeshInstance\nPolySphere -> MergeMesh\n}\n\n------------------------------------\n\nIn this case, the output of a second source - <<PolySphere,PolySphere>> - is merged with the output of <<PolyGrid,PolyGrid>> before their combined data is modified by <<ScalePoints,ScalePoints>> and displayed by the <<MeshInstance,MeshInstance>>.\n\n== Properties ==\n\nNext, we look at nodes in greater detail.  The vast majority of nodes contain 'Properties' which are the user-modifiable values that control a node's behavior.  Properties are displayed to the user in the <<Node Properties Panel>>, which lists a node's properties and provides controls for altering their values.\n\nProperties can be connected to one another, and *those connections are what form the pipeline* - when you connect property ``A'' to property ``B'', changes to the value of property ``A'' are mirrored by property ``B'', as if the user had changed property ``B'' manually.\n\nNow that we can see that connections among nodes are made via properties, we can provide additional detail in our diagrams by labeling properties that are connected:\n\n[\"graphviz\", \"pipeline9.png\"]\n------------------------------------\n\ndigraph\n{\ngraph [rankdir=\"LR\"]\nnode [shape=\"box\",fontname=\"Helvetica\"]\nedge [fontname=\"Helvetica\",fontsize=10]\nPolyGrid [URL=\"http://www.k-3d.org/wiki/PolyGrid\"]\nMeshInstance [URL=\"http://www.k-3d.org/wiki/MeshInstance\"]\nPolyGrid -> MeshInstance [ label=\"output_mesh > input_mesh\" ]\n}\n\n------------------------------------\n\nNote that we often leave-out details of which properties are connected, so long as the meaning of the diagram is unambiguous.\n\n== Property Types ==\n\nNote that K-3D properties are 'strongly typed' - that is to say that every property stores a specific type of data: a string, an integer number, a floating-point number, a boolean value, a bitmap image, geometry, etc.  The controls that are displayed by the user interface vary based on the property type.\n\nAlthough the preceeding examples have focused on the flow of geometric data, there is nothing preventing other property types from being interconnected - in other words, any data type can move through the pipeline, so long as there are nodes that provide inputs and/or outputs for that type.  K-3D includes a number of image processing nodes that work with bitmap image data in the same way that other nodes work with geometric mesh data.  Strings, matrices, vectors, scalars, colors, etc. - all can flow through the visualization pipeline, affecting and being-affected-by the nodes they flow through.\n\nThe only limitation on property connections is that properties can only be connected to properties that share the same type - i.e. geometry properties can only be connected to other geometry properties, string properties can only be connected to string properties, etc.\n\n== Property Roles ==\n\nWith our more detailed understanding of how properties are connected, we can adopt a more nuanced view of how the pipeline functions.  For example, we could connect the ``radius'' properties of two <<PolySphere,PolySphere>> sources:\n\n[\"graphviz\", \"pipeline10.png\"]\n------------------------------------\n\ndigraph\n{\ngraph [rankdir=\"TB\"]\nnode [shape=\"box\",fontname=\"Helvetica\"]\nedge [fontname=\"Helvetica\",fontsize=10]\nPolySphere1 [URL=\"http://www.k-3d.org/wiki/PolySphere\"]\nPolySphere2 [URL=\"http://www.k-3d.org/wiki/PolySphere\"]\nPolySphere1 -> PolySphere2 [ label=\"radius > radius\"]\n}\n\n------------------------------------\n\nHere, the primary function of the <<PolySphere,PolySphere>> nodes as mesh sources is unchanged, and we would likely connect their mesh outputs to other sink objects, but we have also introduced a ``constraint'' that the radius property of PolySphere2 will always ``follow'' the radius property of PolySphere1.\n\n== Guidelines ==\n\nThe flexibility of the pipeline architecture exerts a strong influence on how components are designed and deployed in K-3D.  In particular, the pipeline places a strong premium on creating small, generic components instead of large, specialized components.  If a process can be broken-down into smaller steps, it should be - this makes it possible to substitute different components for individual steps in the process.  In this way users often come-up with surprising new ways of combining components to achieve interesting effects, something we wish to encourage.\n\nIn general, you should not be concerned about the user complexity of ``hooking up'' a pipeline composed of simple components - if a particular combination of components becomes ubiquitous, we will add logic to K-3D's user interface layer to simplify creating it.  Many complex pipeline-manipulation operations are \"hidden\" from users by the UI layer, but we always want to provide \"power\" users with the flexibility to setup the pipeline themselves.\n\n== Property Loops ==\n\nIn K-3D 0.4, the Visualization Pipeline was called the 'Directed Acyclic Graph' or 'DAG', because it did not allow for circular dependencies among properties.  This limitation was removed in K-3D 0.5, leading to use of the term 'Directed Graph' or 'DG'.  See <<Visualization Pipeline Loops>> for a discussion on how loops in the pipeline behave.\n\n\n== References ==\n\n* See <<Pipeline Execution>> for a more in-depth discussion of how pipeline computation is controlled.\n* http://en.wikipedia.org/wiki/Pipeline_%28software%29 - A generic description of software pipelines.\n\n"
  },
  {
    "path": "share/k3d/guide/content/pipeline_hints.txt",
    "content": "[[PipelineHints]]\n= Pipeline Hints =\n\n== Overview ==\n\nWhenever the value of a node property changes, a ``change'' signal is emitted.  This signal is used for two main purposes:\n\n* Notify the user interface that the property value has changed, so the UI can be updated - see http://en.wikipedia.org/wiki/Model_view_controller.\n\n* Notify downstream nodes that one of their inputs has changed.  The downstream node will reset its internal state so that it gets re-calculated the next time it is accessed, and emits its own change signal(s).  This process cascades down the pipeline until every node affected (directly or indirectly) by the original change has been notified.\n\nOriginally, change signals in K-3D were empty notifications that a change occurred without providing any additional data:\n\n------------------------------------------------------\nsigc::signal<void> foo_changed_signal;\n------------------------------------------------------\n\nThese notifications had correspondingly-simple signal handlers:\n\n------------------------------------------------------\nvoid on_foo_changed()\n{\n  // Deal with the change here ...\n}\n------------------------------------------------------\n\nAlthough trivial to understand and implement, this approach missed-out on a key optimization - for certain complex data types, downstream nodes may be able to significantly reduce their computational costs if they have additional information about 'what exactly' changed.\n\nAs an example, a bitmap modifier cannot alter its input bitmap - it must make a copy of its input, then change the copy.  If the input bitmap changes, a naive modifier starts over from scratch, deleting the old copy, creating a new copy, then reapplying its changes.  Depending on what changed in the input bitmap, this can lead to unnecessary, time-wasting heap allocations.  If the 'dimensions' of the input bitmap changed, then reallocation is required, but if the dimensions of the input bitmap 'didn't' change (e.g. only pixel values changed), then most modifiers don't need to reallocate anything - they could simply reapply their changes, 'if only they knew for certain that the dimensions didn't change'.\n\nIn a nutshell, whenever a property changes, we want upstream nodes to be able to pass ``hints'' to downstream nodes to provide more information about what changed.\n\n== Requirements ==\n\nBecause the visualization pipeline carries many different types of data, and because the set of potential changes that could apply to a given type is large, a flexible hinting mechanism is necessary:\n\n* A hint can be a simple identifier that classifies the nature of a change, e.g: ``bitmap pixels changed'', ``bitmap dimensions changed'', ``selection changed'', etc.\n* Or, a hint can include arbitrary amounts of metadata describing the change to varying levels of detail, e.g: a hint can provide bounding-box data, ranges of indices that changed, etc.\n* Finally, a hint can be NULL, meaning ``no hint'' ... the receiver cannot infer anything about the nature of a change, and must ``assume the worst''.\n* The hinting system must allow for any combination of ``smart'' nodes (nodes that alter their behavior based on hints), and ``dumb'' nodes (nodes that ignore hints).\n* Nodes must be able to implement sensible ``fallback'' behavior that produces correct results if they receive no hint, or a hint that they don't recognize.\n* Nodes must be able to ``translate'' hints as they travel down the pipeline, e.g. a node that receives a ``color changed'' hint as an input may need to produce a ``bitmap pixels changed'' hint as an output, depending on how the node works.\n\n== Design ==\n\nTo support our requirements, change signals are actually implemented as follows:\n\n------------------------------------------------------\nsigc::signal<void, k3d::ihint*> bitmap_changed_signal;\n------------------------------------------------------\n\nWith corresponding signal handlers:\n\n------------------------------------------------------\nvoid on_bitmap_changed(k3d::ihint* Hint)\n{\n  if(dynamic_cast<k3d::hint::bitmap_pixels_changed*>(Hint))\n  {\n    // We know that only pixel values changed,\n    // so we can perform efficient computation here.\n  }\n  else\n  {\n    // We didn't get a hint, or we got a hint that we don't\n    // recognize, so we don't know what changed and have to\n    // start-over from scratch, \"assuming the worst\".\n  }\n}\n------------------------------------------------------\n\nNow, whenever emitting a change signal, the emitter can provide a hint object:\n\n------------------------------------------------------\nm_output_property.changed_signal().emit(k3d::hint::bitmap_pixels_changed::instance());\n------------------------------------------------------\n\nor not:\n\n------------------------------------------------------\nm_output_property.changed_signal().emit(0);\n------------------------------------------------------\n\n== Hint Lifetimes ==\n\nAn important subtlety about the lifetime of hints: hints are created by the 'emitter' of a signal, but the emitter has no way of knowing (nor should it care) how many observers will ``see'' the hint, nor what they will do with the information it contains.  For this reason, observers of a hint cannot store any pointers or references to it - they 'must' assume that the hint object will go out-of-scope as soon as the signal emission returns.  If a hint observer needs to retain any of the data associated with a hint, it must make a copy of that data before returning.\n\n== Further Reading ==\n\nPlugin developers will need to understand <<Hint Mapping,Hint Mapping>> for details on how hints travel between node inputs and outputs.  For one significant use of the hinting mechanism, see <<Painter Cache,Painter Cache>>.\n\n\n"
  },
  {
    "path": "share/k3d/guide/content/plugin_design.txt",
    "content": "= Plugins =\n\n== Overview ==\n\nK-3D is designed around an extensive and flexible system of plugins, shared\nlibrary components that are dynamically loaded at runtime.  The K-3D\napplication is little more than a \"container\" that knows how to load plugins at\nstartup and manage their interactions.  All of the real functionality in K-3D -\nfrom pipeline sources, modifiers, and sinks to the user interface - is provided\nby plugins.  The plugin mechanism simplifies both building and distribution of\nthe program - developers can easily disable plugins that they can't compile or\ndon't want, and distributors can ship binary plugins to users, secure in the\nknowledge that plugins with missing dependencies will be quietly ignored at\nruntime.  This article presents an overview for developers of how the plugin\nsystem works.\n\n== Modules ==\n\n(((Plugin,Module)))\n\nThe first level of organization in the plugin system is 'Modules', which are\nshared libraries (DLLs on Win32) that can be loaded into the application\nworking set at runtime.  Each module includes zero-to-many plugins, and is\nloaded by the K-3D application at startup (this is a simplification - see <<On\nDemand Modules>> for more details on how modules are loaded).  Every K-3D\nmodule contains a known entry-point function that is called when the module is\nfirst loaded by the application.\n\n== Plugin Factories ==\n\n(((Plugin,Factory)))\n\nWhen its entry-point function is called, a module ``registers'' zero-to-many\nplugin factories with the application.  A 'Plugin Factory' is a C++ class that\nperforms two tasks - it provides metadata that describes a plugin type, and it\nis used to create instances of that plugin type.  Each plugin factory must\nimplement the 'k3d::iplugin_factory' interface, which is used to retrieve\nplugin metadata (unique identifier, human-readable name, human-readable\ndescription, etc), and either the 'k3d::iapplication_plugin_factory' or\n'k3d::idocument_plugin_factory' interfaces, which are used to instantiate\nplugins.\n\nFollowing is a list of plugin metadata provided via 'k3d::iplugin_factory':\n\n* factory_id - Universally-unique identifier for the factory.\n* name - Human-readable plugin name, displayed in the user interface and used to instantiate plugins from scripts.\n* short_description - Short human-readable description of what the plugin does, displayed in the application user interface and in automatically-generated documentation.\n* categories - Arbitrary list of human-readable categories that are used to group plugins in the user interface.\n* quality - Special enumerated value that describes a plugin as \"Stable\", \"Experimental\", or \"Deprecated\" in the user interface.  See <<Plugin Status>> for details.\n* interfaces - Provides a list of interfaces supported by the plugin type.  Used in special circumstances by code that needs to determine the capabilities of a plugin before instantiating it.\n* metadata - Provides a collection of arbitrary name-value pairs that can be set by a plugin author and used by the user interface or other layers.\n\n== Plugins ==\n\n(((Plugin)))\n\n'Plugins' are also C++ classes, and fall into two categories: 'Document\nPlugins' and 'Application Plugins'.\n\nDocument plugins are the type users are most aware of - a document plugin is\nlinked with a specific user document at the time of its creation, saving and\nrestoring its state along with the containing document.  Pipeline components -\nsources, modifiers, sinks - are all document plugins, as are render model\ncomponents - cameras, render engines, lights, materials, etc.  It is not\npossible to create a document plugin without a valid open document.\n\n(((Plugin,Document)))\n\nApplication plugins, in contrast, are not associated with any document, and do\nnot save or restore any state.  These plugins are usually created \"behind the\nscenes\" to perform a specific task, then destroyed, without any user\nintervention.  Thus, application plugins often take on the role of strategy\nobjects (as-in Strategy Design Pattern).  Examples of application plugins\ninclude user interface plugins, scripting engines, and file format importers\nand exporters.\n\n(((Plugin,Application)))\n\nAs you might expect, there are two types of plugin factory corresponding to the\ntwo types of plugin - the 'k3d::iapplication_plugin_factory' and\n'k3d::idocument_plugin_factory' interfaces are used to instantiate application\nplugins and document plugins, respectively.\n\n== Interfaces ==\n\n(((Plugin,Interface)))\n \nBecause plugins play an endless number of different roles in K-3D, a\nsophisticated mechanism is needed to determine the capabilities and purpose of\nan individual plugin after it is created.  K-3D defines formal 'Interface'\nclasses that correspond to capabilities, plugin classes ``Implement''\ninterfaces by deriving from them, and callers ``Query'' a plugin instance for\nits capabilities using 'dynamic_cast'.  See\nhttp://www.ddj.com/dept/cpp/184401608[Contract Programming and RTTI] for a\ndiscussion of this technique.\n\n== Instantiating Plugins ==\n\nThere are many possible ways to instantiate plugins, but it is highly\nrecommended that you use the 'k3d::plugin::create()' convenience functions\nprovided in 'k3dsdk/plugins.h'.  This will eliminate repetitive code and subtle\nerrors.  Overloaded and templated versions of k3d::plugin::create() are\nprovided to handle the creation of application and document plugins and\nautomatically query new plugins for particular interfaces (a very common\nuse-case).\n\n"
  },
  {
    "path": "share/k3d/guide/content/plugins.py.in",
    "content": "#python\n\nimport k3d\nimport sys\nimport os\n\ndoc = k3d.new_document()\n\n# Used to sort plugins by-name ...\ndef plugin_sort(lhs, rhs):\n\tif lhs.name() < rhs.name():\n\t\treturn -1\n\telif lhs.name() == rhs.name():\n\t\treturn 0\n\treturn 1\n\n# Generate a mapping of categories to plugins ...\ncategories = { \"All\" : [], \"Stable\" : [], \"Experimental\" : [], \"Deprecated\" : [] }\n\nfor plugin in k3d.plugin.factory.lookup():\n\tif plugin.metadata().has_key(\"k3d:disable-documentation\"):\n\t\tcontinue\n\n\tcategories[\"All\"].append(plugin)\n\n\tif plugin.quality() == \"stable\":\n\t\tcategories[\"Stable\"].append(plugin)\n\telif plugin.quality() == \"experimental\":\n\t\tcategories[\"Experimental\"].append(plugin)\n\telif plugin.quality() == \"deprecated\":\n\t\tcategories[\"Deprecated\"].append(plugin)\n\n\tfor category in plugin.categories():\n\t\tif category not in categories:\n\t\t\tcategories[category] = []\n\t\tcategories[category].append(plugin)\n\n# Create reference documentation for all plugins ...\nprint \"\"\"Generating plugin reference documentation ...\"\"\"\nreference = file(\"@CONTENT_BINARY_DIR@/plugins.txt\", \"w\")\nreference.write(\"\"\"// Machine-generated file, do not edit by hand!\\n\\n\\n\"\"\")\n\n# Create an article for each plugin category ...\nreference.write(\"\"\"[appendix]\\n\"\"\")\nreference.write(\"\"\"Plugin Categories\\n\"\"\")\nreference.write(\"\"\"=================\\n\"\"\")\n\nfor category in sorted(categories.keys()):\n\tif len(categories[category]) == 0:\n\t\tcontinue\n\n\tprint \"\"\"Creating plugin category documentation for \"\"\" + category + \"\"\" ...\"\"\"\n\n\treference.write(\"\"\"\\n[[\"\"\" + category + \"\"\"Plugins]]\\n\"\"\")\n\treference.write(\"\"\"\\n== \"\"\" + category + \"\"\" Plugins ==\\n\"\"\")\n\n\tfor plugin in sorted(categories[category], plugin_sort):\n\t\treference.write(\"\"\"\\n\"\"\")\n\n#\t\tif os.path.exists(\"@share_SOURCE_DIR@/ngui/rasterized/\" + plugin.name() + \".png\"):\n#\t\t\tarticle.write(\"\"\"<td>[[Image:\"\"\" + plugin.name() + \"\"\".png]]</td>\"\"\")\n#\t\telse:\n#\t\t\tarticle.write(\"\"\"<td>&nbsp;</td>\"\"\")\n\t\treference.write(\"\"\"<<\"\"\" + plugin.name() + \"\"\",\"\"\" + plugin.name() + \"\"\">>:: \"\"\" + plugin.short_description() + \"\"\"\\n\"\"\")\n\n\treference.write(\"\"\"\\n\"\"\")\n\n# Create an article for each plugin ...\nreference.write(\"\"\"[appendix]\\n\"\"\")\nreference.write(\"\"\"Plugin Reference\\n\"\"\")\nreference.write(\"\"\"================\\n\"\"\")\n\nfor plugin in sorted(k3d.plugin.factory.lookup(), plugin_sort):\n\tif plugin.metadata().has_key(\"k3d:disable-documentation\"):\n\t\tcontinue\n\n\tprint \"\"\"Creating reference documentation for \"\"\" + plugin.name() + \"\"\" ...\"\"\"\n\n\treference.write(\"\"\"\\n[[\"\"\" + plugin.name() + \"\"\"]]\\n\"\"\")\n\treference.write(\"\"\"\\n== \"\"\" + plugin.name() + \"\"\" ==\\n\"\"\")\n\n\tplugin_quality = \"\"\n\tif plugin.quality() == \"stable\":\n\t\tplugin_quality = \"Stable\"\n\telif plugin.quality() == \"experimental\":\n\t\tplugin_quality = \"Experimental\"\n\telif plugin.quality() == \"deprecated\":\n\t\tplugin_quality = \"Deprecated\"\n\n\treference.write(\"\\n.Description\\n\")\n\treference.write(plugin.short_description() + \"\\n\")\n\t\n#\tif os.path.exists(\"@share_SOURCE_DIR@/ngui/rasterized/\" + plugin.name() + \".png\"):\n#\t\treference.write(\"|[[Image:\" + plugin.name() + \".png]]\\n\")\n\n\treference.write(\"\"\"\\n.Plugin Status\\n\"\"\")\n\treference.write(plugin_quality + \"\\n\")\n\n\treference.write(\"\"\"\\n.Categories\\n\"\"\")\n\treference.write(\"\"\"<<AllPlugins,All Plugins>>\"\"\")\n\treference.write(\"\"\", <<\"\"\" + plugin_quality + \"Plugins,\"\"\" + plugin_quality + \"\"\" Plugins>>\"\"\")\n\tfor category in plugin.categories():\n\t\treference.write(\"\"\", <<\"\"\" + category + \"Plugins,\"\"\" + category + \"\"\" Plugins>>\"\"\")\n\treference.write(\"\"\"\\n\"\"\")\n\n\tif plugin.is_document_plugin():\n\t\tnode = k3d.plugin.create(plugin, doc)\n\n\t\tif node:\n\t\t\tif len(node.properties()) > 1:\n\t\t\t\treference.write(\"\\n.\" + plugin.name() + \" Properties\\n\")\n\n\t\t\t\treference.write(\"\"\"[width=\"80%\",options=\"header\"]\\n\"\"\")\n\t\t\t\treference.write(\"\"\"|=========================================================\\n\"\"\")\n\t\t\t\treference.write(\"\"\"|Label |Description |Type |Script Name\\n\"\"\")\n\n\t\t\t\tfor property in node.properties():\n\t\t\t\t\t# Skip the \"name\" property, which is a special-case ...\n\t\t\t\t\tif property.name() == \"name\":\n\t\t\t\t\t\tcontinue\n\n\t\t\t\t\treference.write(\"|\" + property.label() + \" \")\n\t\t\t\t\treference.write(\"|\" + property.description() + \" \")\n\t\t\t\t\treference.write(\"|\" + property.type() + \" \")\n\t\t\t\t\treference.write(\"|\" + property.name() + \" \")\n\t\t\t\t\treference.write(\"\\n\")\n\n\t\t\t\treference.write(\"\"\"|=========================================================\\n\"\"\")\n\n\tif len(plugin.metadata()):\n\t\treference.write(\"\\n.\" + plugin.name() + \" Metadata\\n\")\n\t\treference.write(\"\"\"[width=\"80%\",options=\"header\"]\\n\"\"\")\n\t\treference.write(\"\"\"|=========================================================\\n\"\"\")\n\t\treference.write(\"\"\"|Name |Value\\n\"\"\")\n\n\t\tfor name in plugin.metadata():\n\t\t\treference.write(\"|\" + name + \" \")\n\t\t\treference.write(\"|\" + plugin.metadata()[name] + \" \\n\")\n\n\t\treference.write(\"\"\"|=========================================================\\n\"\"\")\n\nreference.write(\"\"\"// Machine-generated file, do not edit by hand!\\n\\n\\n\"\"\")\n\nk3d.close_document(doc)\n\nsys.stdout.flush()\n\n"
  },
  {
    "path": "share/k3d/guide/content/render_models.txt",
    "content": "= Render Models =\n\n== Overview ==\n\nA render engine is an object that can save a representation of a K-3D document to a file, or a series of files that represent the document over a range of time (an animation). Most often a render engine converts the 3D scene to a 2D bitmap image using the properties of a physical camera (position, orientation, viewing frustum, etc).  Examples include [[RenderManEngine]] and [[YafrayEngine]], but this is not set in stone - the [[GraphVizEngine]] is a render engine that saves graphs of the nodes and edges in a document's [[Visualization Pipeline]] to help understand their (otherwise completely non-visual) relationships.\n\n== Lights and Materials ==\n\nUnlike the majority of 3D software, K-3D makes a clean distinction between the editing system and the back-end render system used to create output images.  Users are able to pick-and-choose render engines for the job-at-hand, and developers can integrate K-3D with a wide variety of rendering technologies.  This affects the user interface in that K-3D does not have one-size-fits-all Material or Light nodes, because the features of different render engines vary widely.\n\n== Plugins ==\n\nSee <<RenderEnginePlugins>>, <<MaterialPlugins>>, and <<LightPlugins>> for related K-3D plugins.\n\n== Overview ==\n\nIn K-3D we use the term \"render model\" to describe the components that must work-together to produce a rendered image.  Current render models normally include:\n\n* A <<Camera>> node that describes an observer within a scene.\n* A set of \"Light\" nodes that provide illumination to the scene.\n* A set of \"Material\" nodes that control the visible attributes of rendered objects.\n* A \"Render Engine\" node that coordinates among the other components to produce the final output image(s).\n\nNote that, unlike other 3D applications, K-3D is designed to be \"render model agnostic\" - it supports multiple models and does not \"prefer\" any one model over the others.  This differs from applications such as Blender or Maya that have built-in render models and use \"export\" operations for everything else.  Currently, K-3D supports three main render models:\n\n* [[OpenGL]] - used to draw realtime previews and designed around the needs of editing and illustration over final rendering (this could change).\n* [[RenderMan]] - the film-industry standard for high-quality rendering.\n* [[Yafray]] - a fantastic free-as-in-freedom renderer with strong global illumination features.\n\n... of course, artists, researchers and developers can use K-3D's plugin system to introduce new render models as-needed.  Candidates for alternate render models would include other rendering APIs such as POVRAY, or game-engines such as Ogre.\n\nAn important characteristic of render models is the strong coupling amongst their components - virtually all current render models require strong coordination among lights, materials, and the render engine to produce an output image.  The capabilities of these components vary widely from model-to-model, which is why K-3D provides \"matched sets\" of components for each render model.  For example:\n\n* The [[RenderMan]] model includes [[RenderManEngine]], [[RenderManMaterial]], and [[RenderManLight]].\n* The [[Yafray]] model includes [[YafrayEngine]], [[YafrayMaterial]], and eight different Yafray lights - see [[Yafray Plugins]].\n* The [[OpenGL]] model is a little different: there is an [[OpenGLEngine]], but [[OpenGLMaterial]] is currently ignored, and there is no \"OpenGLLight\".\n\nA key observation is that there is very little commonality between components from the different render models - [[RenderManEngine]] provides a different set of options than [[YafrayEngine]].  [[RenderManMaterial]] is completely programmable through shaders while [[YafrayMaterial]] provides a limited pipeline for combining preset shading functions.  [[RenderManLight]] is similarly programmable via shaders while Yafray provides multiple light types, including global illumination capabilities not found in RenderMan.\n\nIt is because these render models are so different that K-3D makes no attempt to provide \"generic\" render model components.  There is no such thing as a \"generic light\" in K-3D - there are RenderMan lights, and there are Yafray lights, but the two do not interact.  If you create a scene intended for rendering via Yafray, you will need to populate your scene with Yafray lights and materials.  Similarly, a scene intended for RenderMan will need to contain RenderMan lights and materials.\n\nOf-course, you are free to create a scene that contains multiple render engines of different types, but a Yafray light won't show up in images rendered using [[RenderManEngine]] and a [[RenderManLight]] won't show up in images rendered with [[YafrayEngine]].\n\nSimilarly, your scene will need to contain materials appropriate for the render model in-use.  Because you can only assign one material to a geometric primitives at-a-time, a special material node - [[MultiMaterial]] - acts as a \"container\" of materials so you can add multiple render-model-specific materials to your scene.\n\nNote that the OpenGL render model is special, because it serves the needs of <b>editing</b>, where trying to maximize realism is actually counterproductive - you don't want to have to squint while selecting geometry just because you happen to be setting-up a low-key scene.  As alluded to above, there are no OpenGL light source, and all normal OpenGL lighting is via a \"headlight\" - a distant light source that always shines in the direction the [[Camera]] is pointing - so you can always see what you're looking at.\n\nYou have the option of allowing other light sources to contribute to the OpenGL scene, but this is necessarily a low-fidelity simulation, as the OpenGL shading model is the simplest of any that we support.  There simply isn't any realistic way to \"translate\" a RenderMan light shader or a Yafray Hemilight (for example) into something that fits the OpenGL model.\n\n\n"
  },
  {
    "path": "share/k3d/guide/content/resources.txt",
    "content": "[[BinaryResources]]\n= Binary Resources =\n\n== Overview ==\n\nUnder certain circumstances you may wish to store binary files within an executable.  This can be useful in several circumstances:\n\n* To simplify distribution by putting all resources into a single file.\n* Eliminates any chance of ``misplaced'' files.\n* If an executable always relies on the same set of inputs to function.\n* May provide performance benefits by eliminating filesystem latency.\n** Be careful on this one - you may cause performance 'problems' if your binary becomes significantly larger.\n\nFor example, scripted plugins such as <<BitmapSourceScript,BitmapSourceScript>> need a ``default'' script when they are first instantiated.  These ``default'' scripts could be ``embedded'' in the plugin source code as multiline strings, but the necessary escaping makes authoring and modification difficult.  Ideally, programmers should be able to edit such resources as external files, using tools specific to the filetype, then ``embed'' the files in an executable directly without manual modification, and access them at runtime.  The K-3D resource mechanism provides just such functionality.\n\n== Design ==\n\n* A special executable - the 'k3d-resource-compiler' - converts each binary resource file into C++ source code.\n* At compile time, the C++ resource code is compiled and linked along with the rest of the project.\n* At program startup, the C++ resource code is executed, and each resource is ``registered'' with a central repository of resources.  Each resource is identified by a unique key, which is a string.\n* Code that needs to use a resource retrieves it using its string identifier.\n\nResource identifiers are hierarchical, using notation similar to a Posix filesystem: e.g. ``/foo/bar.py'' to represent a text file containing Python source code.  Because resources are registered with a central repository, this hierarchical ``filesystem'' should be used to avoid name clashes.  For example, every resource used in a shared library ``foo'' might receive a common prefix ``/foo'' to avoid clashes with other libraries.  Note that the identifier need not follow the layout of a physical filesystem or incorporate the name of the original resource file - it is simply a ``handle'' that will be used by code that needs to access the resource.  Similarly, file extensions have no meaning to the resource system, but are encouraged to improve code clarity.\n\n== Usage ==\n\n* At configure-time, programmers use the K3D_COMPILE_RESOURCE macro to identify each external resource to be embedded in a binary.  The macro takes three arguments: an output variable, the name of the external resource file, and the runtime resource identifier.  The macro output will be a list of C++ resource files that should be added to the executable or library build:\n\n------------------------------------------------------\nK3D_COMPILE_RESOURCE(RESOURCES bar.py \"/foo/bar.py\")\nK3D_COMPILE_RESOURCE(RESOURCES baz.py \"/foo/baz.py\")\n...\nADD_EXECUTABLE(foobar ${HEADERS} ${SOURCES} ${RESOURCES})\n------------------------------------------------------\n\n* At compile-time, the 'k3d-resource-compiler' executable will be invoked for each binary resource file, converting it into C++ source code located in the build directory.\n* The resources will be compiled and linked along with ``normal'' code.\n* At runtime, programmers can retrieve resources using their identifiers.  For example:\n\n------------------------------------------------------\n#include <k3dsdk/resource/resource.h>\n\nstd::string = k3d::resource::get_string(\"/foo/bar.py\");\n------------------------------------------------------\n\n== TODO ==\n\n* Currently, there is only one way to retrieve a resource - using 'k3d::resource::get_string()' - which assumes that the resource can be safely represented as a string (so far, this is true for all our use-cases).  Provide stream-based functionality for retrieving binary resources.\n* Provide functionality for iterating over the set of available resources.\n"
  },
  {
    "path": "share/k3d/guide/content/scripting.txt",
    "content": "= Scripting =\n\n== Overview ==\n\nSimple user-created scripts can be used to extend K-3D at runtime in an amazing variety of ways:\n\n* Scripts can be run from the command-line to peform ``batch'' processing.\n* Scripts can be run from within the graphical user interface to automate repetitive tasks.\n* Special scripted plugins can be used to provide scripted data sources, data modifiers, and data sinks that function as part of the <<VisualizationPipeline,Visualization Pipeline>>.\n* Scripts can be integrated with K-3D's plugin system so that they are indistinguishable from compiled C++ plugins within the user interface.\n* Scripts can be run automatically when K-3D starts and when it shuts-down.\n* Scripts can be run automatically when a document is created and when it closed.\n* Scripts are used for most of the regression tests in the K-3D Quality Dashboard.\n\n== Scripting Languages ==\n\nIn K-3D, scripting engines are another type of plugin, so K-3D is capable of using any scripting language for which a plugin has been written.  Currently there is one scripting engine plugin included with K-3D:\n\n* <<Python>> - The preferred script engine for all new development, combining the power and flexibility of the Python language and libraries with K-3D.\n\n== Using Scripts ==\n\n=== At the Command-Line ===\n\nYou can run scripts from the command-line when starting K-3D, using the '--script' option:\n\n--------------------------------\n$ k3d --script=my_script.py\n--------------------------------\n\nWhen running scripts in this fashion you will often want to exit the program once the script has completed.  To do so, use the '--exit' option:\n\n--------------------------------\n $ k3d --script=my_script.py --exit\n--------------------------------\n\nIt is also typical to run K-3D as a strictly command-line application in this case, so you can perform batch processing on a headless server.  Because user interfaces are a type of plugin in K-3D, it's easy to substitute the <<NUI, Null User Interface>> plugin, which will consume fewer resources, startup faster, and avoid ``flashing'' windows as the program quickly runs and exits:\n\n--------------------------------\n $ k3d --script-my_script.py --ui=none --exit\n--------------------------------\n\nYou can use the '--script' option multiple times, to run more-than-one script in-order:\n\n--------------------------------\n $ k3d --script=first_script.py --script=second_script.py  --ui=none --exit\n--------------------------------\n\nUse a dash (``-'') as the script name to read the script source from stdin, allowing you to dynamically-generate scripts and pipe them into K-3D:\n\n--------------------------------\n $ script_generator | k3d --script=-  --ui=none --exit\n--------------------------------\n\nYou can combine scripting with the other command-line options such as '--open', which you could use to open a K-3D file before running the script.  For example you might create a ``template'' scene for rendering, then run a script that modifies the template, renders, then exits:\n\n--------------------------------\n $ k3d --open=template_scene.k3d --script=modify_template.py  --ui=none --exit\n--------------------------------\n\nSee <<k3d-man,Command Line Options>> for other useful options you can use with scripting.\n\n=== From the User Interface ===\n\nTo run a script from K-3D user interface, choose 'Scripting > Play' - you will be prompted for the filename of the script to be run.\n\n=== Scripted Nodes ===\n\nK-3D provides a wide variety of scripted nodes that allow scripts to become data sources, data modifiers, and data consumers within the <<VisualizationPipeline,Visualization Pipeline>>.  To use these nodes, you simply create an instance of the node and modify its ``Script'' property to implement the desired behavior.  The node's inputs and outputs can be connected with the rest of the <<VisualizationPipeline,Visualization Pipeline>> in the normal way, and your script will be executed whenever the node needs to refresh its outputs.  See <<ScriptPlugins>> for a list of scripted node types.\n\n=== Plugin Scripts ===\n\nScripts can be loaded by K-3D at startup and integrated into the plugin system so that - from the perspective of the end user - they are indistinguishable from ``normal'' C++ document plugins.  To do this, script authors simply embed a few lines of plugin-related metadata into their script, and place the script in a known-location where it will be loaded by K-3D at startup.\n\nThe required plugin metadata is composed of name-value pairs that follow the syntax of an XML attribute and are embedded into the script source using whichever comment syntax is appropriate to the scripting language.  See <<Plugin Metadata>> for a detailed description of allowed metadata.  As an example, the following lines define the beginning of a script that will appear as ``MyCoffeeMugMeshSource'' in the 'Create > Scripts' menu, and will be executed by a <<MeshSourceScript>> plugin when selected by the user.\n\n-----------------------------------------\n#python\n\n# k3d:plugin-class=\"document\"\n# k3d:plugin-type=\"MeshSourceScript\"\n# k3d:plugin-name=\"MyCoffeeMugMeshSource\"\n# k3d:plugin-description=\"Creates a polygonal mesh shaped like a coffee mug\"\n\n...\n-----------------------------------------\n\nOnce the metadata is in place, the script can be put in one of two locations, and it will be automatically loaded when K-3D starts:\n\n* 'k3d/share/scripts/scripted_plugins'\n* '~/.k3d/scripted_plugins'\n\nOnce loaded, the script will appear in the 'Create > Scripts' menu as a normal item that the user can click to create.\n\n=== ``Action'' Scripts ===\n\nIn addition to scripted document plugins that are created by the user and become part of a document, you can create \"action\" scripts that simply run and exit when selected.  The following complete example will appear in the 'Scripting > Actions' menu and creates a <<QuadricCone>> when run:\n\n-----------------------------------------\n#python         \n\n# k3d:plugin-class=\"application\"\n# k3d:plugin-type=\"ActionScript\"\n# k3d:plugin-name=\"Create Cone\"\n# ngui:action=\"\"\n        \nimport k3d\n\n# Create a cone primitive source\ncone = k3d.plugin.create(\"QuadricCone\", context.document)\ncone.height = 1\ncone.radius = 0.5\n# Create a mesh instance that will place the cone primitive into the scene\nmesh_instance = k3d.plugin.create(\"MeshInstance\", context.document)\n# Specify OpenGL and RenderMan painters for rendering the cone primitive\nmesh_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\nmesh_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n# Connect the cone source to the mesh instance\nk3d.property.connect(context.document, cone.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n# Ensure that the mesh instance will be visible for every render engine in the scene\nk3d.node.show(context.document, mesh_instance) \n-----------------------------------------\n\n=== Auto-Start Scripts ===\n\nYou can also designate plugin scripts as ``auto-start'' scripts that will be automatically-run in response to certain events.  Currently there are several categories of event, which are described in greater detail under <<PluginMetadata>>:\n\n* k3d:application-start\n* k3d:document-start\n* ngui:application-start\n* ngui:document-start\n\nHere is an example of an auto-start plugin that writes to a log file when the program is run:\n\n-----------------------------------------\n#python\n\n# k3d:plugin-class=\"application\"\n# k3d:plugin-type=\"ActionScript\"\n# k3d:plugin-name=\"ApplicationLog\"\n# k3d:application-start=\"\"\n\nfrom datetime import datetime\n\nlog = open(\"k3d.usage_log\", \"a\")\n\nif context.command == \"startup\":\n        log.write(\"K-3D started at \" + str(datetime.now()) + \"\\n\")\nelif context.command == \"shutdown\":\n        log.write(\"K-3D closed at \" + str(datetime.now()) + \"\\n\")\n-----------------------------------------\n\nSimilarly, here is an example that displays time spent working with a document whenever the document is closed (but only if the normal graphical user interface is in use):\n\n-----------------------------------------\n#python\n\n# k3d:plugin-class=\"application\"\n# k3d:plugin-type=\"ActionScript\"\n# k3d:plugin-name=\"DisplayBillingTime\"\n# ngui:document-start=\"\"\n\nimport k3d\nfrom datetime import datetime\n\nif context.command == \"startup\":\n        start_time = datetime.now()\nelif context.command == \"shutdown\":\n        elapsed = datetime.now() - start_time\n        k3d.ui().message(\"You worked on this document for \" + str(elapsed.days) + \" days, \" + str(elapsed.seconds) + \" seconds\")\n-----------------------------------------\n\n== Sample Scripts ==\n\nA variety of sample scripts are included with K-3D in the share directory:\n\n* k3d/share/scripts - Contains scripts that can be run ``standalone'' from the graphical user interface using the 'Scripting > Play' menu item.\n* k3d/share/scripts/MeshModifierScript - Contains scripts designed for use with the <<MeshModifierScript>> plugin.\n* k3d/share/scripts/MeshSourceScript - Contains scripts designed for use with the <<MeshSourceScript>> plugin.\n* k3d/share/scripts/RenderManScript - Contains scripts designed for use with the <<RenderManScript>> plugin, which can ``inject'' custom RenderMan API calls into a rendered scene under script control.\n* k3d/share/scripts/MeshPainterScript - Contains scripts designed for use with the <<MeshPainterScript>> plugin, which can draw in the viewport under script control.\n* k3d/share/scripts/RenderEngineScript - Contains scripts designed for use with the <<RenderEngineScript>> plugin, which can integrate with external render engines under script control.\n* k3d/share/scripts/scripted_plugins - Contains scripts that are automatically integrated into the rest of the user interface as if they were ``normal'' C++ plugins.\n"
  },
  {
    "path": "share/k3d/guide/content/time.txt",
    "content": "[[Time]]\n= Time =\n\n== Definitions ==\n\nTime is defined in K-3D as a continuously-varying quantity represented using signed double-precision floating-point numbers (k3d::double_t).  Time is measured in seconds.  There is no ``epoch'' per-se, but by default most animations start at time = 0.0.\n\n== Time Sources ==\n\nBy default, a newly-created K-3D document contains an instance of the <<TimeSource,TimeSource>> plugin.  <<TimeSource,TimeSource>> provides storage for several time-related parameters:\n\n* A ``time'' property that stores the ``current'' document time (in seconds).\n* A ``start_time'' property that stores the start-time for document animation (in seconds).\n* An ``end_time'' property that stores the end-time for document animation (in seconds).\n* A ``frame_rate'' property that stores the rate at which the range [start_time, end_time) will be sampled (frames-per-second).\n\nTime-varying behavior is introduced into a document by connecting the <<TimeSource,TimeSource>> ``time'' property to input properties on other nodes using the <<Visualization Pipeline,Visualization Pipeline>>.  Since ``time'' is a k3d::double_t, it can be connected directly to any other k3d::double_t property.  For example, the following pipeline connects the radius of a <<Sphere,Sphere>> to the current time:\n\n[\"graphviz\", \"edf08405-7911-4218-876e-646503ba5f08.png\"]\n------------------------------------------------------------------\ndigraph\n{\ngraph [ rankdir=\"LR\" ranksep=\"1.5\" ]\nnode [ shape=\"box\",fontname=\"Helvetica\"]\nedge [fontname=\"Helvetica\",fontsize=10]\nTimeSource -> Sphere [ taillabel=\"time\" headlabel=\"radius\" labelangle=\"15\" labeldistance=\"3\" ]\n}\n------------------------------------------------------------------\n\nIn this scenario, the radius of the sphere will always be equal to the current time.  If an animation is rendered from time t = 0 to t = 4, the radius of the sphere will smoothly change from 0 to 4 over the course of the animation.\n\nOf course, you may add nodes to the pipeline to manipulate the time value prior to use.  For example, you might want the <<Sphere,Sphere>> radius to change at a different rate than time:\n\n[\"graphviz\", \"2318eb76-ed7b-4b40-ac6a-5876a287c349.png\"]\n------------------------------------------------------------------\ndigraph\n{\ngraph [ rankdir=\"LR\" ]\nnode [ shape=\"box\",fontname=\"Helvetica\"]\nedge [fontname=\"Helvetica\",fontsize=10]\nTimeSource -> ScalarMultiply [ label=\"time\" ]\nScalarMultiply -> Sphere [ label=\"fast time\" ]\n}\n------------------------------------------------------------------\n\nHere, the <<ScalarMultiply,ScalarMultiply>> node applies a scaling factor to the current time value before it's used by the <<Sphere,Sphere>>.  Many other plugins are available to manipulate scalars - for example you might combine <<ScalarAdd,ScalarAdd>> to offset time, <<ScalarModulo,ScalarModulo>> and <<ScalarSine,ScalarSine>> to provide repetitive behavior, and <<ScalarSourceScript,ScalarSourceScript>> for fully-generic scripted behavior.\n\n=== Notes ===\n\n* Although it's possible to add more-than-one <<TimeSource,TimeSource>> to a document, the graphical user interface will only manipulate one of them.\n* The start_time, end_time, and frame_rate properties will likely be moved out of <<TimeSource,TimeSource>> at some point, since it is reasonable to want to render multiple animations from a single document (e.g: to render the animation at different frame rates for different target media).\n\n== Realtime Sources ==\n\nK-3D also provides the <<RealtimeSource,RealtimeSource>> node, which also provides a ``time'' property as output.  Unlike <<TimeSource,TimeSource>>, <<RealtimeSource,RealtimeSource>> represents a time value that stores the number of seconds since the Unix epoch, and is always changing.  This source could form the basis for a simple game.  Note that <<RealtimeSource,RealtimeSource>> also has a ``frame rate'' property, which controls how often its ``time'' property is updated.\n\n== User Interface ==\n\nThe standard K-3D user interface provides the <<Timeline Panel,Timeline Panel>> for manipulating the current time within a document.\n\n== Sampling Issues ==\n\nUnlike games or simulations, K-3D is a content-creation tool, which has a significant impact on how time behaves.  Using the controls provided by the <<Timeline Panel,Timeline Panel>>, users can pause, rewind, skip-ahead, and even ``scrub'' time back-and-forth in arbitrary ways.  An object that takes time as an input cannot assume that time will monotonically increase.  Even when rendering an animation, there is no guarantee that frames will be rendered in any particular order, nor that the time delta between frames will be constant - for example, when rendering a scene with motion-blur it is typical to set the current time to the beginning and end of each frame, and possibly to multiple times within each frame, if temporal sub-sampling is enabled.  These sub-samples may not be evenly spaced.  When rendering the effects of physical shutters on cameras, time-samples may be further offset.\n"
  },
  {
    "path": "share/k3d/guide/content/wiki2asciidoc.py",
    "content": "from optparse import OptionParser\nfrom uuid import uuid4\nimport re\n\ndef main():\n\tparser = OptionParser()\n\t#parser.add_option(\"--skip-rows\", type=\"int\", dest=\"skip_rows\", default=\"0\", help=\"Number of lines/rows to skip when using --lines or --csv.\tDefault: %default\")\n\t(options, arguments) = parser.parse_args()\n\n\tlisting_markup = \"------------------------------------------------------------------\\n\"\n\n\tfor path in arguments:\n\t\ttag_listing = False\n\t\tblock_listing = False\n\t\tgraphviz_listing = False\n\t\tfor markup in open(path, \"r\"):\n\t\t\tif re.search(\"<pre>\", markup):\n\t\t\t\ttag_listing = True\n\t\t\t\tmarkup = listing_markup\n\t\t\telif re.search(\"</pre>\", markup):\n\t\t\t\ttag_listing = False\n\t\t\t\tmarkup = listing_markup\n\t\t\telif re.search(\"<graphviz>\", markup):\n\t\t\t\tgraphviz_listing = True\n\t\t\t\tprint \"[\\\"graphviz\\\", \\\"%s.png\\\"]\" % str(uuid4())\n\t\t\t\tmarkup = listing_markup\n\t\t\telif re.search(\"</graphviz>\", markup):\n\t\t\t\tgraphviz_listing = False\n\t\t\t\tmarkup = listing_markup\n\t\t\telif markup.startswith(\" \") and not block_listing and not tag_listing:\n\t\t\t\tprint listing_markup\n\t\t\t\tblock_listing = True\n\t\t\t\tmarkup = markup[1:]\n\t\t\telif not markup.startswith(\" \") and block_listing:\n\t\t\t\tprint listing_markup\n\t\t\t\tblock_listing = False\n\n\t\t\tif not tag_listing and not block_listing and not graphviz_listing:\n\t\t\t\t# Convert varying numbers of single-quotes to Asciidoc \"emphasis\"\n\t\t\t\tmarkup = re.sub(\"('{2,5})([^']+('[^']+)*)\\\\1\", \"'\\\\2'\", markup)\n\t\t\t\t# Markup double-quotes\n\t\t\t\tmarkup = re.sub(\"\\\"([^\\\"]*)\\\"\", \"``\\\\1''\", markup)\n\t\t\t\t# Eliminate article categories\n\t\t\t\tmarkup = re.sub(\"\\\\[\\\\[Category:[^\\]]*\\\\]\\\\]\", \"\", markup)\n\t\t\t\t# Convert wiki links to Asciidoc links\n\t\t\t\tmarkup = re.sub(\"\\\\[\\\\[([^\\]]*)\\\\]\\\\]\", \"<<\\\\1,\\\\1>>\", markup)\n\n\t\t\tprint markup,\n\t\t\nif __name__ == \"__main__\":\n\tmain()\n"
  },
  {
    "path": "share/k3d/guide/qt/about.txt.in",
    "content": "K-3D @K3D_VERSION@ Help\n\n@K3D_COPYRIGHT@\n"
  },
  {
    "path": "share/k3d/guide/qt/guide.qhcp.in",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<QHelpCollectionProject version=\"1.0\">\n\t<assistant>\n\t\t<title>K-3D Help</title>\n\t\t<homePage>qthelp://org.k-3d/doc/index.html</homePage>\n\t\t<startPage>qthelp://org.k-3d/doc/index.html</startPage>\n\t\t<applicationIcon>k3d.png</applicationIcon>\n\t\t<enableFilterFunctionality>false</enableFilterFunctionality>\n\t\t<enableDocumentationManager>false</enableDocumentationManager>\n\t\t<enableAddressBar visible=\"false\">false</enableAddressBar>\n\t\t<cacheDirectory>k-3d.org/K-3D</cacheDirectory>\n\t\t<aboutMenuText>\n\t\t\t<text>About K-3D</text>\n\t\t</aboutMenuText>\n\t\t<aboutDialog>\n\t\t\t<file>about.txt</file>\n\t\t\t<icon>k3d.png</icon>\n\t\t</aboutDialog>\n\t</assistant>\n\t<docFiles>\n\t\t<register>\n\t\t\t<file>guide.qch</file>\n\t\t</register>\n\t</docFiles>\n</QHelpCollectionProject>\n"
  },
  {
    "path": "share/k3d/guide/qt/guide.qhp.in",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<QtHelpProject version=\"1.0\">\n\t<namespace>org.k-3d</namespace>\n\t<virtualFolder>doc</virtualFolder>\n\t<filterSection>\n\t\t<toc>\n\t\t\t<section title=\"K-3D\" ref=\"index.html\">\n\t\t\t\t<section title=\"K-3D Users' Guide\" ref=\"pt01.html\"/>\n\t\t\t\t<section title=\"K-3D Developers' Guide\" ref=\"pt02.html\"/>\n\t\t\t\t<section title=\"K-3D Reference Manual\" ref=\"pt03.html\"/>\n\t\t\t</section>\n\t\t</toc>\n\t\t<files>\n\t\t\t<file>*.html</file>\n\t\t\t<file>*.css</file>\n\t\t\t<file>*.png</file>\n\t\t</files>\n\t</filterSection>\n</QtHelpProject>\n"
  },
  {
    "path": "share/k3d/icons/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.ico k3d/icons)\nK3D_ADD_SHARE_FILES(*.png k3d/icons)\n\n"
  },
  {
    "path": "share/k3d/logo/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.svg k3d/logo)\n\n"
  },
  {
    "path": "share/k3d/lsystem/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.ls k3d/lsystem)\n\n"
  },
  {
    "path": "share/k3d/lsystem/abop-2d-form.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n4\t# recursion depth\n20\t# angle\n100\t# thickness as % of length\nX\nX=F[+X]F[-X]+X\nF=FF\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-block-form.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n3\t# recursion depth\n90\t# angle\n10\t# thickness as % of length\nA\nA=B-F+CFC+F-D&F^D-F+&&CFC+F+B>>\nB=A&F^CFB^F^D^^-F-D^|F^B|FC^F^A>>\nC=|D^|F^B-F+C^F^A&&FA&F^C+F+B^F^D>>\nD=|CFB-F+B|FA&F^A&&FB-F+B|FC>>\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-bush.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n7       # recursion depth\n22.5    # angle\n80      # thickness as % of length\n#\nc(12)A\n#\nA=[&FL!A]>>>>>[&FL!A]>>>>>>>[&FL!A]\nF=S>>>>>F\nS=FL\nL=[c(8)^^{-f+f+f-|-f+f+f}]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-compound-leave-3d.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n29\n5\n10\n#\n&(90)+(90)a\n#\na=F[+(45)l][-(45)l]^;a\n#\t\t\tapical delay\nl=j\nj=h\nh=s\ns=d\nd=x\nx=a\n#\nF='(1.17)F'(.855)\t# internode elongation rate\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-compound-leave.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n#\n# The elongation rule from page 130 of ABOP :\n#\n# F(a) : * -> F(a*R)\n#\n# translates into :\n#\n# F='(R)F'(1/R)\n#\n15\n45\n20\n#\n&(90)+(90)a\n#\na=F[+cx]Fb\nb=F[-cy]Fa\n#\t\t\tapical delay\nx=a\ny=b\n#\nF='(1.36)F'(.735)\t# internode elongation rate\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-cordate-leave.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n18      # recursion depth\n10      # angle\n10      # thickness as % of length\n#\nc(12)FFFFFFc(8)[A][B]\n#\nA=[+A{.].C.}\nB=[-B{.].C.}\nC=gC\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-dragon-curves.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n3\t# recursion depth\n90\t# angle\n20\t# thickness as % of length\nX+cX+cX+cX\nX=^F+F+F+F+&f\nF=F-F+F+FF-F-F+F\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-fractal.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n2\t# recursion depth\n90\t# angle\n20\t# thickness as % of length\nX+cX+cX+cX\nX=^F+F+F+F+&f\nF=F+f-FF+F+FF+Ff+FF-f+FF-F-FF-Ff-FFF\nf=ffff\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-lychnis-structure.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n31\n18\n100\n#\n# axiom\n#\nc(12)N\n#\n# rules\n#\nN=FII[&(60)Y]>(90)[&(45)'(0.8)A]>(90)[&(60)Y]>(90)[&(45)'(0.8)D]FIK\n#\n# forms substitutes, leaves from bop01.ls\n#\nY=[c(4){++l.--l.--l.++|++l.--l.--l.}]\nl=g(20)l # leaves grow in size with recursion level\n#\n# forms substitutes, flowers from bop01.ls\n#\nK=[!c(2)FF>w>(72)w>(72)w>(72)w>(72)w]\nw=[c(2)^!F][c(5)&(72){-(54)f(300)+(54)f(300)|-(54)f(300)+(54)f(300)}]\nf=_  # removes all flower leaves except those of the last recursion\n#\n# 7 step delay for A(i)\n#\nA=B\nB=C\nC=D\nD=E\nE=G\nG=H\nH=N\n#\n# 10 delay for I(i)\n#\nI=FO\nO=FP\nP=FQ\nQ=FR\nR=FS\nS=FT\nT=FU\nU=FV\nV=FW\nW=FX\nX=_\n#\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-maple-like-leave.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n10\n5\n20\n#\n&(90)+(90)FFF[-(120)'(.6)x][-(60)'(.8)x][+(120)'(.6)x][+(60)'(.8)x]x\n#\na=F[cdx][cex]F!(.9)a\nx=a\n#\nd=+d\ne=-e\n#\nF='(1.25)F'(.8)\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-monopodial-tree.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n#\n# Monopodial skeleton\n#\n# Here is how to read the formulas on page 56 into\n# lparser syntax. The values can be input from page 57,\n# the strings colapsed and used.\n#\n# A = F[ &( a0 ) '( r2 ) !( wr ) BL  ] >( c ) '( r1 ) !( wr ) A\n# B = F[ -( a2 ) '( r2 ) !( wr ) $CL ]        '( r1 ) !( wr ) C\n# C = F[ +( a2 ) '( r2 ) !( wr ) $BL ]        '( r1 ) !( wr ) B\n#\n10\n45\n15\n#\nc(12)FFAL\n#\nA=F[&'(.8)!BL]>(137)'!(.9)A\nB=F[-'(.8)!(.9)$CL]'!(.9)C\nC=F[+'(.8)!(.9)$BL]'!(.9)B\n#\nL=~c(8){+(30)f(20)-(120)f(20)-(120)f(20)}\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-monopodial-tree2.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n#\n# Elaboration of example d on page 56\n# with double the amount of branches\n#\n10\n30\n20\n#\nc(12)FAL\n#\nA=F[&'(.7)!BL]>(137)[&'(.6)!BL]>(137)'(.9)!(.9)A\nB=F[-'(.7)!(.9)$CL]'(.9)!(.9)C\nC=F[+'(.7)!(.9)$BL]'(.9)!(.9)B\n#\nL=~c(8){+(45)f(10)-(45)f(20)-(45)f(10)+(45)|+(45)f(10)-(45)f(20)-(45)f(10)}\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-nested-polygon-leaves.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n20\n7\n50\n#\n&(10)c(4)Dc(6)[p>(72)p>(72)p>(72)p>(72)p]c(7)E\t# 5 petal elements on a branch\n#\np=[&(90)[A]+(72)[B]]\t\t\t\t# one petal\n#\nA=[^gA{.].\t\t\t\t\t# first 'curved line'\nB=B^.g.}\t\t\t\t\t# second 'curved line'\n#\nD=t(.1)Ft(.1)FD\t\t\t\t\t# branch\nE=FE\t\t\t\t\t\t# stem\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-plant.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n5       # recursion depth\n18      # angle\n50      # thickness as % of length\n#\nc(12)p\n#\np=i++[p+o]--->>[--l]i[++l]--[po]+++po\ni=Fs[>>&&l][>>^^l]Fs\ns=sFs\nl=[c(8){++f--ff--f++|++f--ff--f}]\no=[&!c(12)e>w>>>>w>>>>w>>>>w>>>>w]\ne=FF\nw=[c(3)^!F][c(5)&&&&{---f+++f|---f+++f}]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/abop-ternary-tree.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n#\n# Ternary skeleton\n#\n15\n30\n20\n#\nc(12)FA\n#\nA=!(.9)t(.4)FB>(94)B>(132)B\nB=[&t(.4)F$A]\nF='(1.25)F'(.8)\n@\n"
  },
  {
    "path": "share/k3d/lsystem/airhorse.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n18\t\t\t\t\t# recursion level\n10\t\t\t\t\t# basic angle\n200\t\t\t\t\t# starting thickness\nC\t\t\t\t\t# axiom\n#-------------------------------------- Creature\nC=LBW\n#-------------------------------------- Body\nB=[[''aH]|[g]]\na=Fs+;'a \t\t\t\t# upper part\ng=Ft+;'g\t\t\t\t# lower part\ns=[::cc!!!!&&[FFcccZ]^^^^FFcccZ]\t# upper spikes\nt=[c!!!!&[FF]^^FF]\t\t\t# lower spikes\n#-------------------------------------- Lungs\nL=O\t\t\t\t\t# 8 recursions delay\nO=P\nP=Q\nQ=R\nR=U\nU=X\nX=Y\nY=V\nV=[cc!!!&&&&&&&&&[Zp]|[Zp]]\np=h>>>>>>>>>>>>h>>>>>>>>>>>>h\nh=[++++!F'''p]\n#-------------------------------------- Head\nH=[cccci[>>>>>dcFFF][<<<<<ecFFF]]\nd=Z!&Z!&:'d\t\t\t\t# left\ne=Z!^Z!^:'e\t\t\t\t# right\ni=-:\"i\n#-------------------------------------- Wing\nW=[%[!!cb][<<<!!cb][>>>!!cb]]\nb=Fl!+Fl+;'b\t\t\t\t# arc\nl=[-cc{--z++z++z--|--z++z++z}]\n#-------------------------------------- End\n@\n"
  },
  {
    "path": "share/k3d/lsystem/axis.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n#\n#---------------------------------------------------------------------------\n#\n# This file is to show the starting orientation of the turtle\n# and the basic directions. The colors are as they will appear in\n# the lviewer. This file will generate three blocks. Red is the current\n# forward direction, yellow is the current left direction and green\n# is the current up direction.\n#\n# By replacing rule 2 with the one of the following alternatives\n# you can get a better grip on the turtle movement through space :\n#\n# T=^f\t\t\t# pitch up and go forward\n# T=&f\t\t\t# pitch down and go forward\n# T=+f\t\t\t# turn left and go forward\n# T=-f\t\t\t# turn right and go forward\n# T=>f\t\t\t# roll right (= clockwise) and go forward\n# T=<f\t\t\t# roll left (= counter clockwise) and go forward\n#\n# Run these alternatives at a recursion level of 50.\n#\n# T=^+>f\t\t# cylindrical motion\n# T=+;'fff\t\t# spiral motion\n# T=+:f\t\t\t# 'inverse' spiral motion\n#\n#---------------------------------------------------------------------------\n#\n5\t\t\t# recursion level\n20\t\t\t# basic angle\n5\t\t\t# thickness\n&(90)s\t\t\t#0 axiom\ns=aTs\t\t\t#1 do axis, change orientation and recurse\nT=f\t\t\t#2 go forward (REPLACE THIS RULE)\na=[ABC]\t\t\t#3 draw an axis\nA=[c(2)Z]\t\t#4 forward = red\nB=[c(3)+(90)Z]\t\t#5 left    = yellow\nC=[c(4)^(90)Z]\t\t#6 up      = green\n#\n#---------------------------------------------------------------------------\n#\n@\t\t\t# end of ls\n\n"
  },
  {
    "path": "share/k3d/lsystem/best-tree.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n13\n30\n50\n#\nc(12)FFFFFA\n#\nA=!(.8)tFB>(94)C>(132)D\nB=[&'t(.5)!(.9)F$AL|zL]\nC=[&'t(.4)!(.8)F$AL|zL]\nD=[&'t(.3)!(.7)F$AL|zL]\n#\nL=[~c(8){+(30)f(40)-(120)f(40)-(120)f(40)}]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-3dartist.ls",
    "content": "#ͻ\n# 3D-Artist.ls       (c) C.J. van der Mark       \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#ͼ\n#\n#\n10\n20\n10\nX\nX=DArTisT\n=[\"\"\n=]c-(135)zzzzzzzc-(135)>(140)PZZZZZZZZZZ(20)Pw\nw=-(180)zzzzzzzz+(180)czzz-(90)czz^(90)<(-180)zz-(90)???ZpZZpZZpZZpZZZZZZZZZpZZpZZpZZqZZqZZqqqqZq?Zq?Zq?Z!!!\n=+(90)uu+(45)u+(45)u+(90)uu+(180)zz+(90)u+(45)u+(45)uu\nD=-(180)''zzzzz\"\"-(90)\"(1.2)xuuu'(.87)+(90)u+(45)u+(45)uu+(45)u+(45)u\nA=-(180)\"zzzz'u-(66)uuuu-(114)u''-(22.5)u-(22.5)u-(180)u+(22.5)u+(22.5)\"\"u+(66)uu+(114)''uu-(180)zz\"\"+(66)uu\nr=-(66)''''''''''zz\"\"\"\"\"\"\"\"\"\"-(90)xuu+(70)''''''''''u+(20)u+(20)u-(180)z-(20)z-(20)z\"\"\"\"\"\"\"\"\"\"-(70)zx\"\nT=-(90)z''''''''''z''''''u-(45)u-(180)z+(45)\"\"z\"\"\"\"\"\"\"\"\"\"+(90)uu[-(100)'''''''''''''u][+(90)''''u]u\"\"\ni=-(180)zzz-(90)z-(90)xxx'uu''''''''''''z[-(90)?????''''''u][+(90)?????''''''u]-(180)z\"\"\"\"\"\"\"\"\"\"\"\"zz\ns=-(90)''''z\"''-(90)xx+(90)u''''-(45)u-(45)u-(45)u-(45)u+(45)u+(45)u+(45)u+(45)\"\"\"\"u+(90)''zzz+(90)zz-(180)'''''''z+(90)\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\nx=''''''''''''''z\"\"\"\"\"\"\"\"\"\"\"\"\"\"\np=t(0.03)\nq=t(-0.05)\nP=[ZZZZZZZZZZ[E][B][e][b]]\nE=[+RE{.][+RG{.].C.}}\nB=[-RB{.][-RG{.].C.}}\nC=t(0.05)ff(0.95)C\nG=t(0.05)gg(0.52)G\ne=[+Re{.][+Rd{.].h.}}\nb=[-Rb{.][-Rd{.].h.}}\nh=t!(0.8)F(0.95)h\nd=t!(0.8)F(0.72)d\nR=(10)\n#\n#k=[K]$''''''''''!!!!Z{[+++l.][++ll.][+lll.][llll.][-lll.][--ll.][---l.]}\n#K=$''''''''''!!!!Z[+++L.][++LL.][+LLL.][LLLL.][-LLL.][--LL.][---L.]\n#l=t!''''''''''''g\n#L=t!''''''''''''F\n#\n#__Turn and twist the spiral to the correct position so they'll fit together.\n#__Then place the Z in the center of it as the axis.\n#\nu=[v]+(90)^(105)''''''''''z-(90)\"\"\"\"\"\"\"\"\"\"??????>(-15)Z>(15)!!!!!!-(90)''''''''''z\"\"\"\"\"\"\"\"\"\"+(90)<(105)\n#\n#__create the spiral and decrease size until\n#__it is as big as a normal Z\n#\nv='''''''''''&(45)+(72)kkkkkkk[-(54)o]kkkkkkk[-(54)o]\n#\n#__One block to build the spiral with.\n#__With 'Z' at the end of the 'k' definition, the spiral\n#__becomes visible, with 'z' at the end only flowers are visible.\n#\nk=+(36.57)^(36.8)Z\n#\n#---------------------------------------------------------------------------\n#__Flower section__\n#\n# whole flower\no='''''''''''''''''''''[[-(180)Z]&!ccZ>y>>y>>y>>y>>y>>y>>y>>y>>y>]\n# petals\ny=[[ZZccc&(80)'''{-ff+ff|-ff+ff}]>(20)[ZZ&(60)'c(3){-f+f|-f+f}]] #[ZZcccccc&(35)''''{-f+f|-f+f}]]\n#\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-crystal-with-leaves.ls",
    "content": "#ͻ\n#  Hangpl1.ls         (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#           PCG       9:526/464.3                 \n#ͼ\n10\n20\n20\nG\nG=^(180){[A]+(90)g-(90)>(90)[A]+(90)g-(90)>(90)[A]+(90)g-(90)>(90)[A]}\nA=[C][a]\nC={[s+(90)Fs+(90)Fs+(90)Fs<(+35)-(120)Fs-(120)Fs][f^(15)+(15)FFss+(150)FFss]}\na={[d]}{[e]}\nd=[f+(90)f+(90)f+(90)f<(+35)-(120)f-(120)f][f^(15)+(15)ff+(150)ff]\nq=[p][>(90)-(90)g(50).+(90)c(2)?(1)[x]]>(90)-(90)g(100).+(90)[p]\np=sp\ns={ij[+Zh]<(90)ij[-Zh]}\ni=Z+(5)i\nj=Z-(5)j\nk=ccZ{[+++l.][++ll.][+lll.][llll.][-lll.][--ll.][---l.]}\nh=ZZZt(3.2)$[++[++ZZk]ZZk][--[--ZZk]ZZk]ZZk\nx=Z(60)!(0.90)x\nl=t!g\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-crystal-with-leaves2.ls",
    "content": "#ͻ\n#    Hangpl2.ls       (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#           PCG       9:526/464.3                 \n#ͼ\n10\n20\n20\nG\nG=[As]e[A]e[A]e[A]e[A]e[A]e[A]e[A]\ne=+(90)f-(90)>(-45)\nC={c(4)[F+(90)F+(90)F+(90)F>(+38)-(105)FF-(151)FF][f&(38)+(15)FF+(151)FF]}\ns={ij[+ZZtZtZtZG[h]]<(90)ij[-ZZtZtZtZG]}\nA={[C][d]}\nd={[f+(90)f+(90)f+(90)f>(+38)-(105)ff-(151)ff][f&(38)+(15)ff+(151)ff]}\ni=Z+(5)i\nj=Z-(5)j\nk=Z{[+++l.][++ll.][+lll.][llll.][-lll.][--ll.][---l.]}\nh=ZZZt(3.2)$[++[++ZZk]ZZk][--[--ZZk]ZZk]ZZk\nl=t!g\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-crystal.ls",
    "content": "#ͻ\n#   Crystal.ls        (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#           PCG       9:526/464.3                 \n#ͼ\n15\n20\n20\nH\nI=+(40)ffHI\nH=[+fffG][-fffG][^fffG][&fffG]G\nG=[AFFh]e[A]e[A]e[A]e[A]e[A]e[A]e[A]\ne=+(90)f-(90)>(-45)\nC={[F+(90)F+(90)F+(90)F>(+38)-(105)FF-(151)FF][f&(38)+(15)FF+(151)FF]}\ns={ij[+ZZtZtZtZG[H]]<(90)ij[-ZZtZtZtZG]}\nA={[d]}\nd={[f+(90)f+(90)f+(90)f>(+38)-(105)ff-(151)ff][f&(38)+(15)ff+(151)ff]}\ni=Z+(5)i\nj=Z-(5)j\nk=Z{[+++l.][++ll.][+lll.][llll.][-lll.][--ll.][---l.]}\nh=c(4)ZZZt(3.2)$[++[++ZZk]ZZk][--[--ZZk]ZZk]ZZk\nl=t!g\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-crystals.ls",
    "content": "#ͻ\n#  Crystals.ls        (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#           PCG       9:526/464.3                 \n#ͼ\n15\n20\n20\nI\nI=+(40)ffHccI\nH=[+fffG]c[-fffG]c[^fffG]c[&fffG]G\nG=[dS]e[d]e[d]e[d]e[d]e[d]e[d]e[d]\ne=+(90)f-(90)>(-45)\nd={[f+(90)f+(90)f+(90)f>(+38)-(105)ff-(151)ff][f&(38)+(15)ff+(151)ff]}\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-koch.ls",
    "content": "#ͻ\n#   Koch1.ls          (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#           PCG       9:526/464.3                 \n#ͼ\n#   This file produces 3D Koch flakes\n#    in different state of forming.\n7\n30\n1\nD\nD=CzfBzzhzizl\nC=B+++&'(.5773503)f'(1.732051)---'(.450694)f'(2.218801)<|B\nB=c[[^e[lh]^(70.528779)[li]]>>&e[li]^e+++f---<<<<&e[li]]\nl={[+f++++f++++f]}\ne=(19.47122)\nm=+(54.73561)'(.30618255)f'(3.2660254)-\nh=m(54.73561)&&&'(.5)B'(2)\ni=m(114.73561)^^^'(.5)B'(2)\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-koch2.ls",
    "content": "#ͻ\n#     Koch2.ls        (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#           PCG       9:526/464.3                 \n#ͼ\n#      This file produces the 3D Koch flake!\n8\n30\n1\nC\nC=B+++&'(.5773503)f'(1.732051)---'(.450694)f'(2.218801)<|B\nB=[[^(19.47122)[{[+f++++f++++f]}h]^(70.528779)[{[+f++++f++++f]}i]]>>&(19.47122)[{[+f++++f++++f]}i]^(19.47122)+++f---<<<<&(19.47122)[{[+f++++f++++f]}i]]\nh=+(54.73561)'(.3061862)f'(3.265986)-(54.73561)&(90)'(.5)C'(2)\ni=+(54.73561)'(.3061862)f'(3.265986)-(114.73561)^(90)'(.5)C'(2)\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-pascal-cube.ls",
    "content": "#ͻ\n#   Pascal1.ls        (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#ͼ\n# Only even recursion levels will produce an object.\n7\n45\n3\nC\nC=[[Bff|B]ff<<--ff|B]++ff^^ff|B\nA=c(2){[[++f][^^f]f[+++\"(1.4142)f]{[^^^\"(1.4142)f&+++f]}]}['(0.5)B]++f--\nB=[[AA++^^^\"(1.4142)f\"(.7071)^f|&&A]fA]++ff--\n{=_\n}=_\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-pascal-cube2.ls",
    "content": "#ͻ\n#   Pascal2.ls        (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#ͼ\n#      This file produces a Pascal diamond\n6\n45\n1\nD\nD=C>>C>>C>>C\nC=[[B]<<|[B]]\nA={[[++f][^^f]f[+++\"(1.4142)f]{[^^^\"(1.4142)f&+++f]}]}['(0.5)B]++f--\nB=[[AA++^^^\"(1.4142)f\"(.7071)^f|&&A]fA]++ff--\n#\n{=_\n}=_\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-passion-flower.ls",
    "content": "# --- Passie.ls  C.J.van der Mark jr.--------------------------\n#\n10    \t\t            # recursion\n20                          # angle\n20                          # thickness\n#\n#---------------------------------------- axioms\n#o                                # the flower\n#L                                # a single leaf\n#&(60)C                           # the middle stem of the plant\n#k                                # middle flower branch\n#b                                # the side branches of the plant, with flower\nk\"b>(55)\"b>(60)'b>(65)b>(55)''b>(80)b   # the whole passieflora like plant\n#\n#---------------------------------------- rules\nb=['Ao]\nk=[''''C^(90)o]\nA=$t(.2)F''[+(55)$L][-(55)$L]t(-.1)FA\nC=$F'[+(55)$L][-(55)$L]FC\n#\n#\n#----------------------------------------Plant Leaf\nL=F&(30)&(10)cc[D][E]\nD=[+D{.].X.}\nE=[^(5)-E{.].X.}\nX=^(5)ggggX\n#\n#----------------------------------------Flower leaf\nd=[+d{.].x.}\nh=[-h{.].x.}\nx=gggx\n#\n#----------------------------------------Whole flower\no=[&!ce>(90)w>(90)w>(90)w>(90)w>vy>vy>vy>vy>vy>vy>vy>vy>vy>yv>vy>vy>vy>vy>vy>vy>vy>vy]\n#----------------------------------------Flower stem\ne=Z\n#----------------------------------------Spikes in the flower\nv=[ZZc\"\"\"\"\"&(90){'''F!!''F!!''F!!''F}]\n#----------------------------------------Flower female stem and male stems\nw=[[sc??c'!!Ft(-.1)F<<''''!!^^^s]&(100)'(0.5)ZZZ[d][h]]\n#----------------------------------------Colored flower leafs\ny=[[ZZcccc&(80)'''{-ff+ff|-ff+ff}][ZZccccc&(60)'''{-f+f|-f+f}][ZZcccccc&(35)''''{-f+f|-f+f}]]\n#----------------------------------------Singel male/female stem\ns=[c^(8)!Ft(-.2)Ft(-.2)Ft(-.2)Fu]\n#----------------------------------------Pollen holder on male stem\nu=[???F]\n#\nF='(1.3)F'(.77)\nf='(1.3)f'(.77)\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-plant-kwal.ls",
    "content": "#ͻ\n# bekerplant.ls       (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#           PCG       9:526/464.3                 \n#ͼ\n6\n17\n300\nQ\nQ=X>(45)X>(45)X>(45)X>(45)X>(45)X>(45)X>(45)X\nX=[c(2)FFFFFF&(30)c(2)FFAYZ]\nY=[h+B[+EEEEEE[h+CiDiD][h-CiDiD]][h-EEEEEE[h+CiDiD][h-CiDiD]]]\nZ=[h-B[+EEEEEE[h+CiDiD][h-CiDiD]][h-EEEEEE[h+CiDiD][h-CiDiD]]]\nA=aEA\nB=EbEbB\nC=aGaGaGaGaGaGaGatGtGC\nD=bHD\na=&(6)\nb=^(9)\nF=?(0.98)'(0.995)F\nh=~(6)\ni=?(0.94)i\nE=c(1)F[+(40)^(60)?(0.05)'(4)c(8)F][-(40)^(60)?(0.05)'(4)c(8)F]\nG=c(1)F[+(40)^(60)?(0.03)'(2)c(8)F][-(40)^(60)?(0.03)'(2)c(8)F]\nH=c(1)F[+(40)^(60)?(0.02)'(1)c(8)F][-(40)^(60)?(0.02)'(1)c(8)F]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-plant.ls",
    "content": "# --- plant01.ls ------C.J. van der Mark jr. ----------------------------------\n10\n20\n20\nq\nq=[p][>(90)-(90)g(50).+(90)c(4)?(1)[x]]>(90)-(90)g(100).+(90)[p]\np=sp\ns={ab[+Zh]<(90)ab[-Zh]}\na=Z+(5)a\nb=Z-(5)b\nd=Z{[+++e.][++ee.][+eee.][eeee.][-eee.][--ee.][---e.]}\nh=cZZZt(3.2)$[++[++ZZd]ZZd][--[--ZZd]ZZd]ZZd\nx=Z(60)!(0.90)x\ne=t!g\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-plant2.ls",
    "content": "# --- plant02.ls ------C.J. van der Mark jr. ----------------------------------\n9\n25\n50\nE\nE=[A][B][C][D]\nA=c+FAE\nB=c-FBE\nC=c^FCE\nD=c&FDE\nF=FF\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-sierpinski-gasket.ls",
    "content": "#ͻ\n#   Sierpins.ls       (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#͹\n#  This file produces a 3D Sierpinski gasket.     \n# Only uneven rec.levels will produce objects.    \n#ͼ\n9\n30\n1\nC\nA={[+f++++f++++f]}\nB=[[^(19.5)A^(70)A]>>&(19.5)A^(19.5)---&&&&f&&&&<(19.5)-A][\"(.5)C]+++f---\nC=[BB+++^^^^f---B'(0.82)f'(1.22)---^'(0.574)f'(1.74)+++>>>>>B]+++ff---\n#\n{=_\n}=_\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cees-sierpinski-gasket2.ls",
    "content": "#ͻ\n#  Sierpin2.ls        (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#ͻ\n# This ls produces the 3D Sierpinski gaskets, \"wire-form\".    \n# Recursionlevel 4 will produce the 1th order gasket, 5 the   \n# 2th etc.                                                    \n#                                                             \n# To close the bottom of the tetraeders,                      \n# replace b by b=[[+F++++F++++f]{+f++++f++++f]}]              \n#ͼ\n8\n30\n1\nC\nB=[[^ea^(70)b]>>&ed]['(.5)C]+++f---\nC=[BB+++^^^^f---B'(.82)f'(1.22)---^'(.574)f'(1.74)+++>>>>>B]+++ff---\na=[+F++++F++++F]\nb=[[+F++++F++++F]{[+F++++F++++F]}]\n# b=[[+F++++F++++f]{+f++++f++++f]}]\nd=[+f++++F++++f]\ne=(19.5)\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cello-plant.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n10\n10\n80\nFS\nS=WZ'!cS\nW=R%R>>>>>>>>>R%R>>>>\nR=[da%a%g%g]\na=[{nmmn}]\ng=[NMMNL]\nm=+zm\nn=-zn\nM=+ZM\nN=-ZoN\nd=^d\nL=Z';+Z';+Z';+Z';+[&&&l]L\nl=[c{--z++z++z--|--z++z++z}]\no=[---------!!!'''cZl]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/circle-form.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n15\n10\n80\n^^^^^^^^^[CL]|[CL]\nC=FR&!C\nR=[^^^^^^^^^ca%a|L]\na=[nmmn]\nm=+Zm\nn=-Zon\nL=[>>>>>>>>>c{--z++z++z--|--z++z++z}]\no=[---------!!!'''cZl]\nl=[c{--z++z++z--|--z++z++z}]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/conifer-type-tree.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n10\n30\n40\n#\nc(12)A\n#\nA=aaSaaSA\nS='(.8)!(.9)\na=tF[&'(.8)!LBL]>(137)[z&'(.7)!LBL]>(137)\nB=tF[-'(.8)!(.9)$LCL]'!(.9)C\nC=tF[+'(.8)!(.9)$LBL]'!(.9)B\n#\nL=[~c(8){+(30)f(20)-(120)f(20)-(120)f(20)}]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/conifer-type-tree2.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n8\n30\n40\n#\nc(12)A\n#\nA=aaSaaSaaSaaSaaSaaSaaSaaSaaSaaB\nS='(.9)!(.9)\na=tF[&'(.8)!LBL|zL]>(137)[z&'(.7)!LBL|zL]>(137)\nB=tFL[-'(.8)!(.9)$LCL|zL]'(.9)!(.9)C\nC=tFL[+'(.8)!(.9)$LBL|zL]'(.9)!(.9)B\n#\nL=[~c(8){+(30)f(20)-(120)f(20)-(120)f(20)}]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cordate-leave-arrangement.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n20\n10\n100\nP>(90)'P>(90)'P>(90)'P\nP=[&&&FFFFFFFFFD]\nD=FtFtFtFtFtF[L]%'!(.9)D\nL=[&[ccA][ccB]]\nA=[+tA{.].C.}\nB=[-tB{.].C.}\nC=gC\n@\n"
  },
  {
    "path": "share/k3d/lsystem/cordate-leaves.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n18\t# recursion depth\n10\t# angle\n10\t# thickness as % of length\n#\n#P\t\t\t\t\t# one leave\n[|FFFFFFFFFFF]P>(90)'P>(90)'P>(90)'P\t# plant\n#\nP=[&(10)G[ccA][ccB][a][b]]\nG=tFtFtFtFtFtFtFtFtFtFtFtFtF\n#\nA=[+A{.].C.}\nB=[-B{.].C.}\nC=tfC\n#\na=[+a]d\nb=[-b]d\nd=tFd\n@\n"
  },
  {
    "path": "share/k3d/lsystem/dasysiphonia-rigidula.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n9\n19\n25\n#\nA\n#\nA=U[---P]A\nB=U[+++P]B\nC=V[-D][+D]\nD=V[-E][+E]\nE=VV[-G][+G]\nG=V-VV\nP=WV[-C][+C]\nU=f[---f+++X][+++f---Y]FFFFF\nV=fFF\nW=f[---F++++++F]F\nX=FFFF\nY=X\n@\n"
  },
  {
    "path": "share/k3d/lsystem/daysa-rigidula.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n9\n19\n25\n#\nA\n#\nA=U[---P]a\na=U[-P]B\nB=U[+++P]b\nb=U[+P]A\nC=V[-D][+D]\nD=V[-E][+E]\nE=VV[-G][+G]\nG=V-VV\nP=WV[-C][+C]\nU=f[---f+++X][+++f---Y]FFFFF\nV=fFF\nW=f[---F++++++F]F\nX=FFFF\nY=X\n@\n"
  },
  {
    "path": "share/k3d/lsystem/fern-plant.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n#\n20                                      # recursion\n20                                      # angle\n15                                      # thickness\n#\n#---------------------------------------- axioms\n#\n#c(12)&(60)C                            # use this as axiom to test a leave\n#c(12)b                                 # use this as axiom to test a branch\nc(12)b>(60)b>(60)b>(60)b>(60)b>(60)b    # the whole thing\n#\n# ---------------------------------------- rules\n#\nb=[&(30)A]\n#\nA=~(7)$t(.1)F[+(40)C][-(40)C]!(.95)~(7)t(.1)FA\n#\nC=~(10)$tF[+(60)L][-(60)L]C\n#\nL=[~(15)c(4){-f+f+f-|-f+f}]\n#\nF='(1.3)F'(.77)\nf='(1.3)f'(.77)\n#\n#~=_                                    # uncomment to remove random efx\n@\n"
  },
  {
    "path": "share/k3d/lsystem/flower.ls",
    "content": "#ͻ\n#    Flower1.ls       (c) C.J. van der Mark      \n#Ķ\n#      Questions about Lparser files to:          \n#        Internet  cvdmark@xs4all.nl              \n#           Fido      2:283/203.11                \n#           PCG       9:526/464.3                 \n#ͼ\n11\n20\n10\nq\nq=&(30)p^(30)p^(10)p\np=[t(-0.2)!Ft(-0.2)!Ft(-0.2)!FFFo]\no=>y>(60)y>(60)y>(60)y>(60)y>(60)>y\na=[&(10)s]a\ny=[a&(125)w]\nw=Z[d][h]'^(30)cw\nd=[+d{.].x.}\nh=[^(5)-h{.].x.}\nx=^(5)ggx\ns=[c(5)^(60)!'Ft(0.6)ZZt(0.6)?(10)ZZ]\nF='(1.3)F'(.77)\nf='(1.3)f'(.77)\n#g='(1.3)f'(.77)  # uncomment to get weird leafs\n~=_               # uncomment to remove random efx\n@\n"
  },
  {
    "path": "share/k3d/lsystem/fractint.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n# CircularTile\n3\n15\n10\n&(90)+(90)X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X\nX=[F+F+F+F[---X-Y]+++++F++++++++F-F-F-F]\nY=[F+F+F+F[---Y]+++++F++++++++F-F-F-F]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/fractint2.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n# PentaPlexity\n3\n36\n10\n&(90)+(90)F++F++F++F++Fabxjeabxykabxyelbxyeahxyeabiye\nF=_\na=Fabxjea\nb=++F--bxykab\nx=++++F----xyelbx\ny=----F++++yeahxy\ne=--F++eabiye\nh=+++++F-----hijxlh\ni=---F+++ijkyhi\nj=-F+jkleij\nk=+F-klhajk\nl=+++F---lhibkl\n@\n"
  },
  {
    "path": "share/k3d/lsystem/fractint3.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n# Sierpinski1\n5\n120\n10\n&(90)+(90)F\nF=FXF\nX=+FXF-FXF-FXF+\n@\n"
  },
  {
    "path": "share/k3d/lsystem/fractint4.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n# Koch1\n4\n60\n10\n&(90)+(90)F--F--F\nF=F+F--F+F\n@\n"
  },
  {
    "path": "share/k3d/lsystem/half-cycle.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n9\n10\n80\nC\nC=FR&C\nR=[^^^^^^^^^ca%a|L]\na=[nmmn]\nm=+[cZ-----L]zm\nn=-Zn\nL=[>>>>>>>>>cc{--z++z++z--|--z++z++z}]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/half-cycle2.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n9\n10\n80\nC\nC=FR&FR&FR&FR&FR&FR&FR&FR&FR&FR&FR&FR&FR&FR&FR&FR&FR&FR&F\nR=[^^^^^^^^^ca%a|L]\na=[nmmn]\nm=+[Z-----L]zm\nn=-Zn\nL=[>>>>>>>>>cc{--z++z++z--|--z++z++z}]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/higgs-butterfly.ls",
    "content": "#------Lparser/Mutator------Martin Higgs--------\n# This file produces a butterfly. (not yet finalised)\n10\n20\n80\nL\nL=[A][B][C][T][H] # axiom - butterfly\n# --- thorax / abdomen\nA=[cc^(90)f(-2)FcccaFaFaFaFaFaF]\na='(.75)&(5)\n# --- head --- eyes --- /   --- tongue - atennae ---\nH=[cccc&(90)'F[f(-4)c+(90)''Z][f(-4)c-(90)''Z][J][K][M]]\n# --- tongue ---\nJ=ccccccjF''F''&F''&&F''&&F''&&F''&&F''&&F''&&F\nj=!!!!'''''''\n# --- antenae ---\nK=ccc+<<j^^F''F''F''F''F''F''^F''^F''^F\nM=ccc->>j^^F''F''F''F''F''F''^F''^F''^F\nk=!!!!''''''''\n# --- wings ---\nB=+(25)[{-(90)&&fff^^f^^^z^^f^^f}][c{+(-90)^(5)ff^^^f^^f^^z^^^f)}]\nC=|-(25)[{-(90)&&fff^^f^^^z^^f^^f}][c{+(-90)^(5)ff^^^f^^f^^z^^^f)}]\n# --- legs ---\nN=|[ccc!!!!!!!!!!!!^^F^Z^Z]         # leg 1\nO=|[ccc!!!!!!!!!!!!^^F^Z^^Z]         # leg 2\nP=|[ccc!!!!!!!!!!!!^^F^^^Z^^^Z]       # leg 2\nT=[-N][+N][-^O][+^O][<-^^^P][>+^^^P]  # six legs\n@\n"
  },
  {
    "path": "share/k3d/lsystem/higgs-copepoda-crustacean-mutated.ls",
    "content": "# --- L-System Parser/Mutator --- Martin Higgs-------------------------\n# --- This file produces a crustacean of the subclass Copepoda.\n# --- Mutated relative.\n15\n20 # try 60\n80\nA\nA=[H][[I]T][B]\nT=c(1)+(90)^(5)[F--[v]++[m]++[m]++[o]]|^(10)>(180)[F--[q]++[p]++[p]++[r]]\nm=!!!F'^(5)F--c(3){f++f++f--|--f++f++f}\nn=!!!F'^(5)F'^(5)F--''c(3){f++f++f--|--f++f++f}j\no=!![W]!F-c(3){f+f+f-|-f+f+f}\np=!!!F'&(5)F--c(3){f++f++f--|--f++f++f}\nq=!!!F\"&(5)F'&(5)F--''c(3){z++f++f--|--f++f++f}\nr=!!!Z-c(3){f+f+f-|-f+f+f}\n#\nB=ccc'''''''!?bFbFbFFbFbF[[D][e]]F'F'''F[[D][E]]F'F''F[[D][E]]FF'[X][Y]\nb=^(1)?(1.3)x\n#\nD=^^!!?!c(6)-(85)FF'F[---'(.275)T]dddddd!!!c(4)F+'F+'F+(10)'F'F'+F\nE=^^!!!!c(6)+(85)FF'Z[+++'(.275)Q]eeeeee!!!c(4)F-'F-'F+-10)'F'F'-F\nd=+(10)'F[++++!!c(4)'''F''F''F''F]\ne=-(10)'F[+---!!c(4)'''F''F''F''F]\n#\nX=^-(90)fc(2)!(.2)\"+++F[q]FF[-H]xxx[W]xxx[[s]\"W]xxx[+'(.5)W]xxxllllllll\"s\nx=-(10)F!(.96)\nl=+(10)F!(.96)\nY=^+(90)zc(2)!(.2)\"---F[I]FF[+I]lll[Q]lll['Q]lll[-'(.5)Q]lllxxxxxxxx\"v\nH=c(7)\"\"\"++!!!!FFF--c(3){f+f+f-|-f+f+f}\nI=c(7)\"\"\"--!!!!FFFc(3){f+f+f-|-f+f+f}\ns=c(7)!!!FF+FF+F'^(5)F--c(3)\"\"{f++f++f--|--f++f++f}o\nv=c(7)!?!FF-FF-F'^(5)F--c(3)\"\"{f++f++f--|--f++f++f}\nW=+[E]c(7)!!aaaaaaaaaaaaar\na=FF[Y]'-(5)\nQ=-c(7)!!jjjjjjjjjjjjjv\nj=FF'+(5)\n@\n"
  },
  {
    "path": "share/k3d/lsystem/higgs-copepoda-crustacean.ls",
    "content": "# --- L-System Parser/Mutator --- Martin Higgs-------------------------\n# --- This file produces a crustacean of the subclass Copepoda.\n15\n20\n80\n#\nA\n#\nA=[T][B]\n#\n# --- tail --------------------------------------------------------------\n#\nT=c(1)+(90)^(5)[F--[n]++[m]++[m]++[o]]|^(10)>(180)[F--[q]++[p]++[p]++[r]]\nm=!!!F'^(5)F--c(3){f++f++f--|--f++f++f}         # tail feather m\nn=!!!F'^(5)F'^(5)F--''c(3){f++f++f--|--f++f++f} # tail feather n\no=!!!F-c(3){f+f+f-|-f+f+f}     \t\t\t# tail feather o\np=!!!F'&(5)F--c(3){f++f++f--|--f++f++f}         # tail feather p\nq=!!!F'&(5)F'&(5)F--''c(3){f++f++f--|--f++f++f} # tail feather q\nr=!!!F-c(3){f+f+f-|-f+f+f}     \t\t\t# tail feather r\n#\n# --- body ------------------------------------------------------------\n#\nB=ccc'''''''??bFbFbFFbFbF[[D][E]]F'F'''F[[D][E]]F'F''F[[D][E]]FF'[X][Y]\nb=^(1)?(1.3)\n#\n# --- legs -------------------------------------------------------\n#\nD=^^!!!!c(6)-(85)FF'F[---'(.275)W]dddddd!!!c(4)F+'F+'F+(10)'F'F'+F\nE=^^!!!!c(6)+(85)FF'F[+++'(.275)Q]eeeeee!!!c(4)F-'F-'F+-10)'F'F'-F\nd=+(10)'F[++++!!c(4)'''F''F''F''F]\ne=-(10)'F[----!!c(4)'''F''F''F''F]\n#\n# --- antenna --------------------------------------------------------\n#\nX=^-(90)fc(2)!(.2)\"+++F[H]FF[-H]xxx[W]xxx['W]xxx[+'(.5)W]xxxllllllll\"s\nx=-(10)F!(.96)\nl=+(10)F!(.96)\nY=^+(90)fc(2)!(.2)\"---F[I]FF[+I]lll[Q]lll['Q]lll[-'(.5)Q]lllxxxxxxxx\"v\nH=c(7)\"\"\"++!!!!FFF--c(3){f+f+f-|-f+f+f}\nI=c(7)\"\"\"--!!!!FFFc(3){f+f+f-|-f+f+f}\ns=c(7)!!!FF+FF+F'^(5)F--c(3)\"\"{f++f++f--|--f++f++f}\nv=c(7)!!!FF-FF-F'^(5)F--c(3)\"\"{f++f++f--|--f++f++f}\nW=+c(7)!!aaaaaaaaaaaaa\na=FF'-(5)\nQ=-c(7)!!jjjjjjjjjjjjj\nj=FF'+(5)\n#\n@\n\n\n\n"
  },
  {
    "path": "share/k3d/lsystem/higgs-lobster.ls",
    "content": "# --- L-System Parser/Mutator --- Martin Higgs -----------\n# --- This file produces a crustation like form.\n13  # recursion\n20  # angle\n30  # thickness\nA\nA=|[B][[C][P]][M]['''&M][''''&&M] # --- The complete crustation ---\n# --- body\nB=[+(80)[aaaaa]][-(80)[bbbbb]]&'[B]\na=>-\"[F'''c(14)Fc(5)D[c(4)'''''''{-f+f+f-|-f+f+f}]]\nb=<+\"[F'''c(14)Fc(5)E[c(4)'''''''{-f+f+f-|-f+f+f}]]\nD=!!!!!''''''dddd\nE=!!!!!''''''eeee\nd=$tZ++Z-     \t\t# tropism added to tendrils\ne=$tZ--Z+          \t#    \"      \"   \"     \"\n#\n# --- complete claw\nM=^[[NZ][OZ]]\nN=++<<'''^^???????!!!c(11)-(85)FF'F[---'(.275)W]nnnnnn\nO=-->>'''^^???????!!!c(11)+(85)FF'F[+++'(.275)Q]oooooo\n#\n# --- claw teeth\nn=+(10)'F[++++!!!c(10)'''F''F''F''F]\no=-(10)'F[----!!!c(10)'''F''F''F''F]\n#\n# --- claw whiskers\nW=+c(7)&(7)!wwwwwwwwwwwww\nw=+(10)FF'\nQ=-c(7)&(7)!qqqqqqqqqqqqq\nq=-(10)FF'\n#\n# --- antenna\nC=+(65)'''''''''c(9)F>>>>>>&&&wlwlwlwl\nP=-(65)'''''''''c(9)F<<<<<<&&&qsqsqsqs\nr=c(3)[{-f+f+f-|-f+f+f}]\ns=[+r][w'r]\nl=[-r][q'r]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/higgs-sierpinski-variants.ls",
    "content": "#------Lparser/Mutator------C.J.van der Mark--------\n#-- This file produces the 3D Sierpinski gasket.----\n#-- Only uneven rec.levels will produce objects.----\n7\n30\n1\n#\n#C  \t\t\t\t\t\t\t# 3D Sierpinsky gasket\n#\n# --- plug in AXIOM lines for new forms --- Martin Higgs ---\n#\n#C|C                                               \t# diamond\n#C|>>cC|>>ccC|>>cccC|>>ccccC|>>cccccC              \t# Rubric snake\n#C>>cC>>ccC>>cccC>>ccccC>>cccccC                   \t# hexagon\n#C'>>|C'>>|C'>>|C'>>|C'>>|C                        \t# snake 1\n#C'|>>C'|>>C'|>>C|'>>C'|>>C                        \t# snake 2\nC|C'>>|cC'>>|C'>>|C'>>|C'>>|C'>>|C'>>|C'>>|C'>>|C \t# snake 3\n#C'>>C'>>C'>>C'>>C''>>C                            \t# ammonite 1\n#Ce<<Ce<<Ce<<Ce<<Ce<<Ce<<Ce<<Ce<<Ce<<Ce<<C         \t# ammonite 2\n#e='(.885)                                         \t#    \"\n#C<<C<<C<<C<<C<<C                                  \t# star\n#\nA={[+f++++f++++f]}\nB=[[^(19.5)A^(70)A]>>&(19.5)A^(19.5)---&&&&f&&&&<(19.5)-A][\"(.5)C]+++f---\nC=[BB+++^^^^f---B'(0.82)f'(1.22)---^'(0.574)f'(1.74)+++>>>>>B]+++ff---\n#\n{=_\n}=_\n#\n@\n"
  },
  {
    "path": "share/k3d/lsystem/large-spiral-plant.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n11\n30\n100\n&&&^D\nD=AB!'DcZO\nB=[c---'''!:D]\nA=&+^FLA\nL=[---c{-f+f+f-|-f+f+f}]\nO=[!iw>>w>>w>>w>>w>>w]\nw=[c&{-f+f|-f+f}]\ni=;i\n@\n"
  },
  {
    "path": "share/k3d/lsystem/large-spiral-plant2.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n12\n30\n100\n[|ffff|?FFFF]&&&^D\nD=AB!'DcZO\nB=[---'''!:D]\nA=&+^FLA\nO=[!iw>>w>>w>>w>>w>>w]\nw=[ccccc&{-f+f|-f+f}]\ni=;i\nL=[--->c!!!!!!!1cl[a][b]]\na=[+a{.].C.}\nb=[-b{.].C.}\nC=gC\nl='l\n1=2\n2=3\n3=F\n@\n"
  },
  {
    "path": "share/k3d/lsystem/leavy-ternary-tree-type.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n15\n20\n50\n#\nc(12)T\n#\nT=CCA\nA=CBD>(94)CBD>(132)BD\nB=[&CDCD$A]\nD=[g(50)Lg(50)Lg(50)Lg(50)Lg(50)Lg(50)L]\n#\nC=!(.95)~(5)tF\n#\nF='(1.25)F'(.8)\n#\nL=[~f(200)c(8){+(30)f(200)-(120)f(200)-(120)f(200)}]\nf=z\nz=_\n@\n"
  },
  {
    "path": "share/k3d/lsystem/lobster-form.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n15\n10\n100\n[c|H]C[ccc>>>>>>>>>[TccF][OccF]]\nC=FR-C\nR=[cc^^^^^^^^^BL][cc&&&&&&&&&BL]\nB=:F++!B\nL=[cc{--z++z++z--|--z++z++z}]\nH=[^^^S]%[^^^S]>>>H\nS=Z!S\nT=Z+^!:T\nO=Z-^!:O\n@\n"
  },
  {
    "path": "share/k3d/lsystem/lobster-form2.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n12\n10\n80\n[c|H]C[ccc>>>>>>>>>[TcccF][OcccF]]\nC=FR-C\nR=[cc^^^^^^^^^BcH][cc&&&&&&&&&BcH]\nB=F++!B\nL=[c{--z++z++z--|--z++z++z}]\nH=[^^^SL]%[^^^SL]>>>H\nS=Z!S\nT=Z+^![&&&&&&&&&L]:T\nO=Z-^![&&&&&&&&&L]:O\n@\n"
  },
  {
    "path": "share/k3d/lsystem/lobster-form3.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n10\n10\n80\n[c|H]C[ccc>>>>>>>>>[GcL]]\nC=FR-C\nR=[cc^^^^^^^^^BL][cc&&&&&&&&&BL]\nB=F!<+F<+;'[&&&L]B\nG=F!^+F^+;'[&&&L]G\nL=[cc{--z++z++z--|--z++z++z}]\nH=[^^^G]%[^^^G]>>>H\n@\n"
  },
  {
    "path": "share/k3d/lsystem/lobster-form4.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n10\n10\n80\n[c|H]C[ccc>>>>>>>>>[GL]]\nC=FR-C\nR=[cc^^^^^^^^^B][cc&&&&&&&&&B]\nB=[|H]\nL=[cc{--z++z++z--|--z++z++z}]\nH=[^^^D]%[^^^D]>>>H\nS=Z!S\nG=:Z++!G\nD=F!^+F^+;'[&&&L]D\n@\n"
  },
  {
    "path": "share/k3d/lsystem/lobster-form5.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n10\n10\n80\nC[c;;;;;''''''H]\nC=FR--C\nR=[c^^^^^^^^^p][c&&&&&&&&&p]\nH=[^^^G]%[^^^G]>>>H\nG=F!^+F^+;'[&&&L]G\nL=[c{--z++z++z--|--z++z++z}]\np=++F[cag]>>>>>>>>>>>>[cag]>>>>>>>>>>>>[cag]>>>>>!'p\ng=!'F[cmb][cnb]^g\nb=!'F^b\na=&a\nm=+m\nn=-n\n@\n"
  },
  {
    "path": "share/k3d/lsystem/menger-cube.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n#\n# This ls produces menger cubes. Recursion level 0 will produce a\n# 0th order cube, 2 a 1th, 4 a 3th, and 6 a 4th. Level 8 will\n# produce a 5th order menger with a total off 960.000 polygons !\n#\n# Change F= ... to F=[~(5)\"(.333333)[-f+&f^B]]f add randomness.\n#\n# One can replace B= ... with a number of alternatives:\n#\n# B=[fz+zF]^f&[FFF|z|+zFF|z|+zFF|z|+zF]^f&[fz+zF]\n# B=[fz+zF]^f&[FFF|z|+zFF|z|+zFF|z|+zF|z|+zF]^f&[fz+zF]\n# B=[FFF|z|+zFF|z|+zFF|z|+zF]^f&[FfF|z|+zfF|z|+zfF]^f&[FFF|z|+zFF|z|+zFF|z|+zF]\n#\n4\n90\n142.857\n#\nF\n#\nF=[\"(.333333)[-f+&f^B]]f\n#\nB=[FFF|z|+zFF|z|+zFF|z|+zF]^f&[FfF|z|+zfF|z|+zfF]^f&[FFF|z|+zFF|z|+zFF|z|+zF]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/octo-spider.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n18\t\t\t\t\t# recursion level\n10\t\t\t\t\t# basic angle\n80\t\t\t\t\t# starting thickness\n%C\t\t\t\t\t# axiom\n#-------------------------------------- Creature\nC=%LABHT\n#-------------------------------------- Body\nB=[???????zZZZ]\n#-------------------------------------- Arms\nA=[zf&&&&&&&&&\"\"\"[pj>>>>>>>>>S]|[qj<<<<<<<<<S]]\np=Ft+:'p\t\t\t\t# left\nq=Ft-:'q\t\t\t\t# right\nj=;\"j\n#-------------------------------------- Scorpers\nS=['''!!r%^^r]\nr=[Z?Z?Zu]\t\t\t\t# jaw assembly\nu=Z[co]!'^::u\t\t\t\t# jaw and tooth\n#-------------------------------------- Legs\nL=[c\">>>>[s]>>>>[s]>>>>[s]>>>[s]>>>>>>[s]>>>[s]>>>>[s]>>>>[s]]\ns=+++li+++dccc??\"\"FF\t\t\t# down legs\nl=Ft+:'l\t\t\t\t# upper leg\nd=FFF'd\t\t\t\t\t# lower leg\ni=;i\n#-------------------------------------- Head\nH=[\"\">>>>>>>>>&&&&&&??FFFF!![???h][???k]%^^[??k]]\nk=[Z?Z?Za]\t\t\t\t# jaw assembly\na=Z[co]!'a\t\t\t\t# jaw\no=&&&&&&&&&!!!!!F\t\t\t# teeth\nh=[^^gcccc\"Z][^^ecccc\"Z]\t\t# eyes\ng=z!+z!+z!+z\t\t\t\t# left eye\ne=z!-z!-z!-z\t\t\t\t# right eye\n#-------------------------------------- Tail\nT=[f---------??\"\"\"\"\"\"mccccF]\nm=Ft+;'m\t\t\t\t# curl\nt=['::c!!!&&[f<<<n]^^^^f>>>n]\t\t# spikes\nn=[c{--z++z++z--|--z++z++z}]\t\t# leaf\n#-------------------------------------- End\n@\n"
  },
  {
    "path": "share/k3d/lsystem/palm-tree.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n12\n5\n30\n#\nc(4)FFS                                         # the actual tree\n#\nS=FFR>(60)R>(60)R>(60)R>(60)R>(60)R>(30)S       # six branches per segment\nR=[Ba]                                          # a single branch\n#\na=$tF[Cx]Fb                                     # see bop08.ls\nb=$tF[Dy]Fa\n#\nB=&B                                            # angle increments\nC=+C\nD=-D\n#\nx=a                                             # apical elay\ny=b\n#\nF='(1.25)F'(.8)                                 # elongation rate\n@\n"
  },
  {
    "path": "share/k3d/lsystem/shell.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n19\n10\n10\n#\nPPPPPPPPPPPPPPPPPPPPPP\n#\nP=S>(20)gg'\nS=[&(90)[A]+(20)^(90)gg'&(90)[B]]\n#\nA=[^gA{.].\nB=B^.g.}\n@\n"
  },
  {
    "path": "share/k3d/lsystem/shell2.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n19\n10\n10\n#\n>(20)PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP\n#\nP=S>(40)g'\nS=[&(90)[cD][A]+(20)^(90)g'&(90)[B][cD]]\n#\nD=^FD                           # show stalks\n#\nA=[^gA{.].                      # put polygons on them\nB=B^.g.}\n@\n"
  },
  {
    "path": "share/k3d/lsystem/shell3.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n24\n10\n10\n#\nPPPPPPPPPPPPPPPPPPP\n#\nP=S>(20)g'(.8)\nS=[[&(120)[A]]>(20)g'(.8)[&(120)[B]]]\n#\nA=[^gA{.].\nB=B^.g.}\n@\n"
  },
  {
    "path": "share/k3d/lsystem/shell4.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n38\n10\n10\n#\nPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP\n#\nP=S>(20)gg'\nS=[&(90)[A]+(20)^(90)gg'&(90)[B][cD]]\n#\nD=^FD                           # show stalks\n#\nA=[^gA{.].                      # put polygons on them\nB=B^.g.}\n@\n"
  },
  {
    "path": "share/k3d/lsystem/spiral-bush.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n10\n10\n80\nC\nC=[cH]z!>C\nH=[^^^G]%[^^^G]>>>H\nG=F!^+F^+;'[&&&L]G\nL=[c{--z++z++z--|--z++z++z}]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/spiral-design.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n18\n20\n25\n#\nA\n#\nA=[-A]F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F\n@\n"
  },
  {
    "path": "share/k3d/lsystem/spiral-form.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n20\n10\n100\na\na=Fs+;'a\ns=[::c!!!!&&[b]^^^^[b]]\nb=F!+F+;'b\n@\n"
  },
  {
    "path": "share/k3d/lsystem/spiral-tree.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n8\n10\n80\nFFFF[C]>>>>>>>>>[C]>>>>>>>>>[C]>>>>>>>>>[C]\nC=F!^+F^+;'[c---C]C\n@\n"
  },
  {
    "path": "share/k3d/lsystem/spiral-types.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n20\n10\n80\n[P]|[P]\nP=[A]>>>>>>>>>[cB]>>>>>>>>>[ccC]>>>>>>>>>[cccD]\nA=F+;'A\nB=F!+F+;'B\nC=F!^+F^+;'C\nD=F!>^+F>^+;'D\n@\n"
  },
  {
    "path": "share/k3d/lsystem/tree-base.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n10\n10\n50\np\np=FF[cag]>(120)[cag]>(120)[cag]>(50)!(0.9)'~(3)p\ng=~(3)!'F[cmb][cnb]^(5)g\nb=~(3)!'F[cmF][cnF]^(3)b\na=&a\nm=+m\nn=-n\n@\n"
  },
  {
    "path": "share/k3d/lsystem/tree.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n12\n5\n30\n#\nc(12)T\n#\nT=[F~(5)FSd]\nS=~(5)FRR[Ba]d>(30)~(5)FRR[Ba]d>(30)!(.8)S\nR=[Ba]d>(120)\n#\na=~(10)$F[Cxd]~(10)$Fd!(.8)b\nb=~(10)$F[Dyd]~(10)$Fd!(.8)a\nd=[g(300)g(40)Lg(40)Lg(40)Lg(40)Lg(40)Lg(40)L]\n#\nB=&B\nC=+C\nD=-D\n#\nx=a\ny=b\n#\nF='(1.25)F'(.8)\n#\nL=[~f(7)c(8){+(30)f(200)-(120)f(200)-(120)f(200)}]\nf=z\nz=_\n@\n"
  },
  {
    "path": "share/k3d/lsystem/tree2.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n10\n45\n15\n#\nc(12)FFAL\n#\nA=F[&'(.9)!BL]>(137)'(.9)!A\nB=F[-'(.9)!$CL]'(.9)!C\nC=F[+'(.9)!$BL]'(.9)!B\n#\nL=~c(8){+(30)f(20)-(120)f(20)-(120)f(20)}\n@\n"
  },
  {
    "path": "share/k3d/lsystem/tree3.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n10\n45\n15\n#\nc(12)FFAL\n#\nA=F[&'(.8)!BL]>(137)'!(.9)A\nB=F[-'(.8)!(.9)$CL]'!(.9)C\nC=F[+'(.8)!(.9)$BL]'!(.9)B\n#\nL=~c(8){+(30)f(20)-(120)f(20)-(120)f(20)}\n@\n"
  },
  {
    "path": "share/k3d/lsystem/trees.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n12\n20\n50\n#\nc(12)&(90)Tg(7500)Tg(7500)T\n#\nT=[^(90)CCA]\nA=CBD>(94)CBD>(132)BD\nB=[&CDCD$A]\nD=[g(50)Lg(50)Lg(50)Lg(50)Lg(50)Lg(50)L]\n#\nC=!(.95)~(5)tF\n#\nF='(1.25)F'(.8)\n#\nL=[~f(200)c(8){+(30)f(200)-(120)f(200)-(120)f(200)}]\nf=z\nz=_\n@\n"
  },
  {
    "path": "share/k3d/lsystem/trees2.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n#\n# 'Trail off Trees'. This is a setup to get all development\n#                    stages of a tree together in one image.\n#\n14\n5\n30\n#\n&(90)H\n#\nH=f(1500)TcH                                    # move forward and plant a tree\n#\nT=[^(90)FFS]                                    # the actual tree\nS=FFR>(120)R>(120)R>(60)S                       # three branches per segment\nR=[Ba]                                          # a single branch\n#\na=$tF[Cx]Fb                                     # see bop08.ls\nb=$tF[Dy]Fa\n#\nB=&B                                            # angle increments\nC=+C\nD=-D\n#\nx=a                                             # apical elay\ny=b\n#\nF='(1.25)F'(.8)                                 # elongation rate\n@\n"
  },
  {
    "path": "share/k3d/lsystem/trees3.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n14\n20\n50\n#\nc(12)&(90)H\n#\nH=g(4500)TH\n#\nT=[^(90)CCA]\nA=CBD>(94)CBD>(132)BD\nB=[&CDCD$A]\nD=[g(50)Lg(50)Lg(50)Lg(50)Lg(50)Lg(50)L]\n#\nC=!(.95)~(5)tF\n#\nF='(1.25)F'(.8)\n#\nL=[~f(200)c(8){+(30)f(200)-(120)f(200)-(120)f(200)}]\nf=z\nz=_\n@\n"
  },
  {
    "path": "share/k3d/lsystem/tropism-experimental-tree.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n#\n# Try this tree with tropism factors from\n# .2 to .9\n#\n12\n30\n50\n#\nc(12)FFFFFA\n#\nA=!(.8)t(.3)FB>>>B>>>>B\nB=[&'!(.8)t(.3)F$A]\n@\n"
  },
  {
    "path": "share/k3d/lsystem/tropism.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n#\n# This file is to show the effect of gravity on a form.\n# By the use of the new tropism command. First try it\n# with the current rules. Then try C=tFC for rule 3.\n#                                    ^\n#\n36                      # recursion\n10                      # basic angle\n100                     # thickness\n#\nA                       # axiom\n#\nA=B>(10)A               # rule 1 : add a branch and roll 10 deg right\nB=[&(45)C]              # rule 2 : pitch down 45 deg and start a branch\nC=FC                    # rule 3 : expand a branch with a forward element\n@                       # end of ls\n"
  },
  {
    "path": "share/k3d/lsystem/willow-tree.ls",
    "content": "# --- L-System Parser/Mutator --- Lj Lapre ----------------------------------\n13\n10\n100\n#\nc(12)FFFFFFFFFF>(1)&(1)A\n#\nA=!(.75)t(.9)FB>(94)B>(132)B\nB=[&\"t(.9)!(.75)FL[|zL]$AL[|zL]]\n#\nL=[~c(8)f(40)|{+(30)f(80)-(120)f(80)-(120)f(80)}]\n@\n"
  },
  {
    "path": "share/k3d/ngui/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.k3d k3d/ngui)\n\nADD_SUBDIRECTORY(pixmap)\nADD_SUBDIRECTORY(rasterized)\nADD_SUBDIRECTORY(scalable)\n\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.png k3d/ngui/pixmap)\nK3D_ADD_SHARE_FILES(*.xpm k3d/ngui/pixmap)\n\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/about.xpm",
    "content": "/* XPM */\nstatic char * splash_xpm[] = {\n\"300 350 256 2\",\n\"  \tc None\",\n\". \tc #020202\",\n\"+ \tc #2166BE\",\n\"@ \tc #888341\",\n\"# \tc #B49D25\",\n\"$ \tc #7DBBD6\",\n\"% \tc #ACCFDE\",\n\"& \tc #77430B\",\n\"* \tc #B9D7DF\",\n\"= \tc #8D6619\",\n\"- \tc #124D9C\",\n\"; \tc #DADEDB\",\n\"> \tc #3D83D4\",\n\", \tc #402509\",\n\"' \tc #619FD5\",\n\") \tc #2F66AF\",\n\"! \tc #434241\",\n\"~ \tc #E8E8E8\",\n\"{ \tc #A38411\",\n\"] \tc #986516\",\n\"^ \tc #282828\",\n\"/ \tc #4E8ED2\",\n\"( \tc #3A6395\",\n\"_ \tc #B29E39\",\n\": \tc #B58216\",\n\"< \tc #F0F0F0\",\n\"[ \tc #9D5507\",\n\"} \tc #A79F54\",\n\"| \tc #62390D\",\n\"1 \tc #C16806\",\n\"2 \tc #5B4326\",\n\"3 \tc #E6B70D\",\n\"4 \tc #292E32\",\n\"5 \tc #98BACF\",\n\"6 \tc #5F83A1\",\n\"7 \tc #504435\",\n\"8 \tc #5B6465\",\n\"9 \tc #7B7979\",\n\"0 \tc #F6F6F6\",\n\"a \tc #55300A\",\n\"b \tc #7A5119\",\n\"c \tc #78A3A3\",\n\"d \tc #E0B728\",\n\"e \tc #A19D68\",\n\"f \tc #C08213\",\n\"g \tc #4A75A4\",\n\"h \tc #ECBE22\",\n\"i \tc #5B5342\",\n\"j \tc #885009\",\n\"k \tc #B56408\",\n\"l \tc #353433\",\n\"m \tc #355988\",\n\"n \tc #6F8499\",\n\"o \tc #C89C0C\",\n\"p \tc #988C75\",\n\"q \tc #C88A11\",\n\"r \tc #84B1C9\",\n\"s \tc #9B771C\",\n\"t \tc #7F6753\",\n\"u \tc #1C4370\",\n\"v \tc #FAFAFA\",\n\"w \tc #D2B636\",\n\"x \tc #726344\",\n\"y \tc #DEB010\",\n\"z \tc #080808\",\n\"A \tc #1A5EB6\",\n\"B \tc #38547A\",\n\"C \tc #6896B0\",\n\"D \tc #9E8349\",\n\"E \tc #4E3820\",\n\"F \tc #875A28\",\n\"G \tc #6A5740\",\n\"H \tc #C9CECC\",\n\"I \tc #726B4B\",\n\"J \tc #C5C6C6\",\n\"K \tc #C5700B\",\n\"L \tc #4C2C0A\",\n\"M \tc #D6B63A\",\n\"N \tc #ACA569\",\n\"O \tc #A47211\",\n\"P \tc #B6781D\",\n\"Q \tc #D9911E\",\n\"R \tc #19539E\",\n\"S \tc #D09C06\",\n\"T \tc #483826\",\n\"U \tc #5B5A58\",\n\"V \tc #141312\",\n\"W \tc #D6B640\",\n\"X \tc #B58E0E\",\n\"Y \tc #868687\",\n\"Z \tc #8E5E16\",\n\"` \tc #28476F\",\n\" .\tc #AC660B\",\n\"..\tc #A69323\",\n\"+.\tc #7C6639\",\n\"@.\tc #3B5270\",\n\"#.\tc #884906\",\n\"$.\tc #694D31\",\n\"%.\tc #587594\",\n\"&.\tc #3E3E3E\",\n\"*.\tc #D98213\",\n\"=.\tc #FEFEFE\",\n\"-.\tc #8CAFCD\",\n\";.\tc #775C42\",\n\">.\tc #29589A\",\n\",.\tc #372717\",\n\"'.\tc #925209\",\n\").\tc #C6902A\",\n\"!.\tc #919293\",\n\"~.\tc #D4D6D5\",\n\"{.\tc #A0A3A3\",\n\"].\tc #D7AA1E\",\n\"^.\tc #CECECE\",\n\"/.\tc #B05E06\",\n\"(.\tc #D4780B\",\n\"_.\tc #504D4A\",\n\":.\tc #9D6627\",\n\"<.\tc #21538F\",\n\"[.\tc #978032\",\n\"}.\tc #43505E\",\n\"|.\tc #2973D1\",\n\"1.\tc #C8832B\",\n\"2.\tc #9F783C\",\n\"3.\tc #8C7838\",\n\"4.\tc #3074CA\",\n\"5.\tc #636261\",\n\"6.\tc #14447F\",\n\"7.\tc #1F1F1E\",\n\"8.\tc #1C3657\",\n\"9.\tc #B67219\",\n\"0.\tc #C8A539\",\n\"a.\tc #1352AA\",\n\"b.\tc #B39041\",\n\"c.\tc #85845A\",\n\"d.\tc #6B4312\",\n\"e.\tc #C3920B\",\n\"f.\tc #D4B846\",\n\"g.\tc #D7A127\",\n\"h.\tc #7B5E2D\",\n\"i.\tc #4A6994\",\n\"j.\tc #74745C\",\n\"k.\tc #B1A575\",\n\"l.\tc #563A1C\",\n\"m.\tc #C37725\",\n\"n.\tc #746457\",\n\"o.\tc #3866A7\",\n\"p.\tc #324862\",\n\"q.\tc #C8780B\",\n\"r.\tc #462D15\",\n\"s.\tc #DFD9D9\",\n\"t.\tc #C0C0C0\",\n\"u.\tc #824708\",\n\"v.\tc #3A3A39\",\n\"w.\tc #CE930B\",\n\"x.\tc #9B9C9C\",\n\"y.\tc #CACACA\",\n\"z.\tc #925A16\",\n\"A.\tc #B5AF6B\",\n\"B.\tc #8B6531\",\n\"C.\tc #775328\",\n\"D.\tc #C7AA23\",\n\"E.\tc #CD820C\",\n\"F.\tc #AA5C08\",\n\"G.\tc #6C5324\",\n\"H.\tc #8C8C8C\",\n\"I.\tc #6A6A69\",\n\"J.\tc #305E9C\",\n\"K.\tc #DADADA\",\n\"L.\tc #B28231\",\n\"M.\tc #286EC7\",\n\"N.\tc #B8B8B8\",\n\"O.\tc #A05C0D\",\n\"P.\tc #784A16\",\n\"Q.\tc #1C4E8C\",\n\"R.\tc #6BAFD9\",\n\"S.\tc #9F6E17\",\n\"T.\tc #A2892B\",\n\"U.\tc #A8AFAC\",\n\"V.\tc #C69C21\",\n\"W.\tc #B49025\",\n\"X.\tc #133C70\",\n\"Y.\tc #B66C14\",\n\"Z.\tc #8F7236\",\n\"`.\tc #A87709\",\n\" +\tc #857358\",\n\".+\tc #625444\",\n\"++\tc #D1D2D1\",\n\"@+\tc #422C16\",\n\"#+\tc #E0E0E0\",\n\"$+\tc #875A18\",\n\"%+\tc #6A817A\",\n\"&+\tc #685E58\",\n\"*+\tc #6E655D\",\n\"=+\tc #D8A614\",\n\"-+\tc #6C4E24\",\n\";+\tc #1F59AB\",\n\">+\tc #CD8120\",\n\",+\tc #D7B029\",\n\"'+\tc #667580\",\n\")+\tc #6C3C08\",\n\"!+\tc #917517\",\n\"~+\tc #AB691D\",\n\"{+\tc #CE9320\",\n\"]+\tc #1558B2\",\n\"^+\tc #4490D7\",\n\"/+\tc #935D25\",\n\"(+\tc #80807F\",\n\"_+\tc #A17228\",\n\":+\tc #9B5E20\",\n\"<+\tc #865318\",\n\"[+\tc #747474\",\n\"}+\tc #736C66\",\n\"|+\tc #5C4934\",\n\"1+\tc #959696\",\n\"2+\tc #A79D8F\",\n\"3+\tc #77ACCF\",\n\"4+\tc #2A67B8\",\n\"5+\tc #423424\",\n\"6+\tc #828E73\",\n\"7+\tc #A36515\",\n\"8+\tc #D1B23A\",\n\"9+\tc #9E8F4A\",\n\"0+\tc #684621\",\n\"a+\tc #8B6E37\",\n\"b+\tc #C6CAC9\",\n\"c+\tc #3875C4\",\n\"d+\tc #D39E17\",\n\"e+\tc #13478C\",\n\"f+\tc #9E6E2B\",\n\"g+\tc #666666\",\n\"h+\tc #A9A8A8\",\n\"i+\tc #B0B0AF\",\n\"j+\tc #D6DAD8\",\n\"k+\tc #905519\",\n\"l+\tc #484848\",\n\"m+\tc #285288\",\n\"n+\tc #C1A744\",\n\"o+\tc #6AAAD7\",\n\"p+\tc #7A5A2E\",\n\"q+\tc #A87820\",\n\"r+\tc #302D2B\",\n\"s+\tc #9FC6DB\",\n\"t+\tc #5B90C8\",\n\"u+\tc #C5A421\",\n\"v+\tc #5E4D3F\",\n\"w+\tc #C6781C\",\n\"x+\tc #A58E16\",\n\"y+\tc #545453\",\n\"z+\tc #275EA8\",\n\"A+\tc #556880\",\n\"B+\tc #5E5E5F\",\n\"C+\tc #603D1D\",\n\"D+\tc #8CBFD8\",\n\"E+\tc #A48028\",\n\"F+\tc #6E6E6E\",\n\"G+\tc #C3921D\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.v =.v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v =.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.v =.=.v v =.=.v =.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.=.=.=.v =.=.v v v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v 0 0 0 v v v v v v 0 v 0 =.v 0 v =.v v =.v v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 =.=.v v v 0 v v < 0 0 < v < < < v 0 v 0 0 < 0 0 0 0 < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.=.v 0 =.< ~ K.t.i+1+(+n.I .+.+|+v.T l i i j.(+2+i+^.#+~ < v v 0 < 0 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v < ~ j+U.p I._.! &.v.l 5+T r+r+l ,.r+,.v.r+r+,.5+r+7 .+9 H.i+++#+< < 0 0 0 v 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v =.=.=.v =.=.=.0 v v =.=.< b+{.9 U 5+&.,.5+l.7 7 T E $.2 2 a 5+, @+5+, T 7.@+E v+7 |+7 _.&+9 1+N.~ ~ < v 0 < v =.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.=.=.=.=.=.=.v v =.v 0 v =.0 =.~.h+Y &+7 5+5+@+,.T ,.V 5+5+,.,.T , ,.T C+7 C+.+l.|+G.l.l.2 5+,.l.,.@+2 T $.&+2+t.#+v 0 0 v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v =.=.=.=.0 =.0 j+1+g+7 &.T 5+@+@+T 5+@+@+L E @+L l.r., , 2 @+@+L l., ,.2 @+,.L E @+,.l.5+,.T E 5+@+G p t.~ < < 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.v =.v ~ ^.H.l+|+7 T T E T T ,.a l., 5+d., , l.E , , l.2 , , @+2 , , E l., r.2 r.@+r.l.@+, l.r.5+T @+7 p H #+0 0 < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.0 ++!.&+7 _.5+,.@+5+@+, L l., , a C+L , L )+L , L d.L , , a 2 a , a -+L , a | E , a 2 , , l.C+L E E @+7 !.b+< < < < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v 0 v =.0 ; h+g+|+7 &.,.r.7 l., , C+l., , a C+a , L d.a L L l.-+, L a a 0+, a , P.a L , | a L , a C+L a L l., @+2 5+@+U 1+H 0 v < < < v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< ^.(+i .+i T 5+7 E , 7.L E L , , a C+L , a | $.a L L | d.a L a | b a a L | C+| L | P.| a L l.$., L a C+r., l.-+, ,.I h+#+0 0 < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.; i+j.&+v+i |+|+2 r.@+E 0+2 , , L a 2 a a L | 0+L a L | b a a a a | P.a a a )+b a L a 2 d.l.a a a -+a r.a l.a , , l.T a $.p ^.~ ~ 0 < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v =.=.v =.=.=.=.0 s.1+&+G .+7 @+T l.@+5+l.|+T C+l.C+0+C.C+| L | b | a a a | b | a | a C+b | | | | P.& a a a & b a C+| | 0+a a a C+$.| C+G..+2 a t N.s.< ~ v < =.=.0 =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 J p &+G .+7 E T l.5+, ,.l.r., a E 0+0+C+0+C.C.C.F <+F <+C.F F <+P.)+| d.P.| | | | & 0+)+)+& C.F <+b b C.F h.-+C.$.d.0+l.a 0+, @+E $.i+#+~ ~ 0 0 =.=.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.~ N. +G .+*+C+T l.7 E @+, E 2 @+, L L 0+| L a )+b P.C+)+)+& d.F P.& & P.F F :.F <+F F B.B.F <+b P.b C.)+)+d.| P.d.C+a a C+| a L P.a L C+2 p s.~ < ~ < 0 =.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v 0 v v 0 ~ N.9 .+&+G 7 T l.|+l.@+, 5+2 @+, , L C+d.a | | | b b )+)+)+)+P.<+& | )+)+P.d.F & d.& )+b b )+d.& )+)+F d.C+)+)+& b )+| C+d.b a )+a d.d.a 2 0+c.s.~ ~ v 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 < k.;.|+v+.+2 E |+2 l.@+L l.l.L L a a d.C+| a )+)+)+b j )+& & & <+P.)+& u.)+)+b b & )+& & #.<+& & )+& & k+j )+d.)+& <+P.)+| | & b | a | d.C+a 0+|+9 ++< < < < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 s.p G 7 G G 2 l.l.$.l.L , l.d.l., L a a 0+| | )+| | b <+& )+& & & /+& u.)+& u.& :.& & & u.& P.k+#.#.& & & b j & & )+& & <+j )+)+d.j u.)+)+& & C+a 0+2 p ++#+< < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v ~.1+.+v+.+|+E 5+2 2 E L L r.2 l.L L L | C+d.a )+)+)+& k+b & )+& )+#.k+#.u.& & & u.k+& )+& u.& u./+<+& & u.u.u.k+j & & & & j j )+& )+& F & | )+P.C.| a 0+2 c.s.< ~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 0 < h+_.7 $..+l., l.0+a , r.L C+d.a , a a d.& )+a )+| )+u.k+)+& u.u.& '.F #.& u.#.& u.:.#.u.& u.& u./+#.u.#.& u.& k+z.& u.& P.j <+#.)+P.)+<+u.u.)+d.b d.l.| |+$.Y s.~ ~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v =.=.< v 0 A.;.|+v+5+r., C+0+L a , a C+d.a L L a | -+)+| )+)+& )+/+u.& u.& u.& k+k+u.u.& #.u.u.:+u.#.& #.u.#.:+j #.u.u.#.& j z.u.u.u.& u.k+j & & & u.u.<+)+)+& b d.| L 0+$.p #+#+~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.0 v < =.0 h+&+v+v+|+E 5+2 l.r.a , a l.C+a L a a a 0+)+a | )+)+)+k+[ & u.#.u.u.#./+[ #.#.u.u.u.#.:.#.#.u.#.#.#.k+k+u.u.#.#.u.j :+<+u.#.u.u.k+k+#.& & & j z.u.& | )+P.)+a l.C+G 2+J ~.~ 0 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.< 0 y.&+T 7 E l.E l.0+E , a , C+C+a L L L a | b | | )+)+& & /+j & u.#.#.#.'./+j #.#.#.#.u.j ~+#.#.#.j j j '.:+'.j #.#.u.u.z.Z j #.#.#.k+:+'.u.#.u.u.k+<+j & )+& C.P.a a l.n.N.^.~ ~ 0 v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.v v 0 =.#+Y 7 7 v+5+, L |+l.l.|+2 2 d.l.L , L L | 0+)+a | )+)+& j /+#.#.#.'.#.'.z.:.#.#.#.#.#.u.j :.#.#.#.u.#.u.u.:.j #.#.#.#.#.k+:.j u.j u.#.k+k+j #.#.u.j k+k+u.& & P.P.)+$.G.$.t N.s.#+~ v 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v v v 0 #+p l.T 2 E , , a C+, , a @+l.$.0+)+| a | d.)+| a | | )+u.z.<+#.#.#.'.#.#.O.:+#.#.'.#.#.#.k+~+#.'.'.#.'.j #.~+'.j '.'.'.j j :+] j k+j u.'.O.:.#.#.#.#.'.z.k+j P.<+F F & l.0+G.H.^.~ ~ < 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.=.=.v v v ~ 1+7 l 7 l., @+r.$.r., r., a 2 , L l.d.0+C.C.P.& u.u.#.<+k+:.'.'.[ [ [ '.[ 7+7+k+'.[ '.'.#.k+f+'.#.'.#.j '.j 7+k+#.#.#.j #.j ] k+#.'.j j u.'.:+O.7+O.k+:+f+~+:.:.j u.F & | -+$.v+k.#+~ ~ 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v ~ * b+N.Y y+! _.y+! T 7 E |+r.r.r.r.d.d.L , L a | C+C+| )+P.C.F /+] :.:+:+7+F.7+7+~+Y.~+7+7+O.[ [ k+'.:.'.'.'.#.[ '.k+:+:+'.'.'.[ [ /+~+S.:+7+7+7+] 7+7+Y.~+~+~+7+7+~+:.#.u.u.k+u.a )+C.C+t t.~ ; ~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.~ b+N.{.n 8 m p.` 8.p.p.l ! l+v..+7 2 a L C+0+a L a L , | $.)+L )+| & )+u.k+k+k+:+~+7+7+k ~+P :.~+7+~+~+9.Y.f+9. . .~+~+~+~+:.~+9.7+~+~+7+~+7+f+~+7+:.:+:+7+:.~+~+[ [ [ k+[ 7+:+'.z.u.j :.<+)+P.F d.9+; ; ~ 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.~ c m B B ` ( p.u u 8.8.8.8.8.4 p.&.&.p._..+|+l.a a a a a & d.a | | )+& )+k+:.'.'.[ [ F.[ /.F.m.F.[ F.F.[ O.F.:+Y.F.F.:+F.O.F.O.O.9.:+F.F.F.O.[ O.Y.[ [ [ [ [ [ O.:.~+[ F.F.[ O.P k+'.[ #.j :+& & F -+$.J s.#+< < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.=.=.~ U.B+8.` u p.@.8.u u X.8.8.8.8.8.@.8.4 4 r+v.7 $..+0+C+C+C+P.)+| )+)+d.& & '.z.#.[ [ [ F./.O.k Y.F./.F.F.F./.:+F.9.O.O.O.O.O.[ [ :+9.O.[ O.[ [ [ [ ~+7+[ O.[ [ [ F.~+Y.[ [ /.[ O.~+7+[ [ '.'.:+j & & F $. +s.j+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v b+'+u u u 8.m u X.8.u X.X.X.8.u p.@.8.8.8.8.v.l v.v.$.|+$.$.;.C+| | | & & u.:+:+#.F.[ F./.F.F.m.Y. ./.F.F.F./.F.F.m.F.[ F.[ F.[ F.[ 9.:+[ F.[ F.F.O.~+~+O.O.F.F.F.F.~+Y.F././.F.O.O.Y.[ [ '.#.O.:+u.& k+P.|+N.s.#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v 0 i+}.8.u u u m+X.X.u 6.u X.X.X.u m u u X.` u 8.8.4 8.v.5+7 |+G $.C.C.d.0+)+k+:+[ '.[ [ F.k /.F.w+ .k /./.k  . .O.Y.Y././.F./.F./.F.F.P O.O.F.F.F.F.F. .Y.F.[ /.[ /.F.~+K /././.F./.[ 9.~+[ [ '.[ :.#.& j b $. +; ; #+< 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v ~ x.p.8.8.8.m+u X.6.X.6.6.X.X.X.` >.X.u u X.u X.u ` ` v.v.v.v.v+v+.+C.p+C.C.F k+u.'.[ F.[ k F.~+w+k k k /.k /.k k m.k  ././././.F.F./.m.O.F./.F.F. .F. .m.k F.k /././.F.Y.1 /./.F. .F.~+Y.[ [ [ [ :+k+#.& #.B.|+N.#+; < < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 * '+8.X.X.X.m X.X.6.X.X.X.6.X.6.Q.m+6.6.6.u 6.u ` u u u ` ` p.y+_.7 ! .+G ;.t F P.k+<+[ [ O. .k m./.k 1 k 1 k 1 k w+/.k k k k /.k /./.m. .F././././.F.F.m.k F./././././.K Y.k F././. .F.Y. .[ [ '.:+:.#.u.& <+0+ +K.#+#+< < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 #+h+B 8.8.8.u ` X.X.X.6.6.X.X.X.Q.m+` X.6.6.6.6.6.e+6.u u ` ` p.U p.&.&.p._.B+n.n.;.h.C.F /+z.:+Y.1 k /.1 /.1 1 1 Y.>+k 1 k 1 k k 1 k k m. ./.k /././././.Y.1 k /./.k k /.k m.k /.k /.k O.Y.k [ [ [ '.:+'.u.& P.b |+N.#+#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.< ~.Y u X.8.X.m X.X.X.X.X.6.6.X.X.Q.m+X.e+X.e+e+e+6.u e+6.u u u ` ( ` u }.p.l+! l+v+n.t t F F k+:+m./.k k 1 k k 1 K /.>+1 1 1 k 1 1 k 1 k 1.k k 1 k 1 k k k Y.K 1 k 1 /.1 k k w+k  .k /./.F.m.Y./.[ [ '.:+:+u.u.& <+0+p s.s.~ < < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < U.8 u 8.X.Q.u X.8.X.6.X.X.6.X.Q.J.e+6.6.6.e+u e+e+- 6.e+e+u Q.m m u ` ` ` p.p.@.l+_.y+U t t t F f+:+/.k /.1 1 1 1 1 (.1 1 1 1 1 1 1 1 1 >+k 1 1 /.1 1 k k 1 m.F.k k 1 /.1 /.m.k k F././.F./.k Y.[ [ [ '.~+<+u.& P.b  +^.^.; < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< ++1+8 m m+B B u X.X.X.X.6.6.X.X.<.>.e+6.6.e+e+e+e+e+e+e+Q.e+e+>.>.Q.Q.m+e+m+m+B ` @.p.}.}._..+n.t 2.:+:+[ /./.k k Y.1 >+1 1 1 1 1 1 1 1 1 >+k 1 1 1 1 k Y.1 1 >+k k 1 k 1 k k K K Y.k k k /.k Y.k [ F.[ [ O.z.b u.k+F C.i+~.; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.~ N.'+p.` u m+m+` m+J.m+u X.6.X.u <.6.X.e+e+e+6.6.e+e+Q.- 6.e+Q.J.>.e+Q.Q.m+R Q.R m+m+` B m+}.}.y+&+n.;.:./+k+:+7+k k k >+9.1 1 1 1 1 1 1 1 *.Y.1 1 1 1 1 1 1 1 m.1 k k 1 k 1 1 Y.m.k k /.k k  .Y.Y.[ [ [ '.'.:.k+k+j k+2 D ++~.#+~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 j+x.U 8.8.8.B u 8.X.` Q.>.( m+u J.J.6.6.6.6.e+6.Q.Q.6.6.e+e+e+<.J.<.- e+- - a.R - R <.<.Q.Q.` m+p.}.5.&+n.t t /+k+O.k k w+~+1 1 1 1 1 1 1 1 >+1 1 1 1 k k 1 /.1 m.1 1 k 1 1 k k k w+Y.1 k k  .F.1 Y.~+7+O.7+/.~+:.F u.<+$.t y.s.#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< b+n @.8.8.X.Q.u X.X.X.X.X.6.Q.m+( J.<.<.Q.e+e+6.e+e+e+e+- e+Q.4+R e+- Q.- Q.a.Q.- Q.Q.m+<.<.<.m+Q.B i.}.y+U t t B./+:+F.9.~+1 1 1 1 1 1 1 1 w+(.1 1 1 1 1 K 1 1 (.m.1 1 1 /.1 k Y.Y.w+k 1 1  . .Y.m.m.9.9.P /.:+:.j & u.a+F t.~.#+~ < < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < t.'+u X.8.X.` X.X.X.6.6.X.X.X.u m+Q.m+>.>.J.>.Q.6.e+e+- - 6.;+J.- e+a.- a.a.Q.<.Q.Q.R Q.Q.Q.;+>.Q.J.i.m m+m y+&+t t /+/+_+:+/./.1 1 1 K 1 1 m.(.K 1 1 1 1 1 1 1 K w+Y.K 1 1 K k K Y.1.K w+K >+w+m.m.m.~+ .O.F.O.~+j j u.:.b h+++s.#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 j+-.B+8.8.X.u m+X.X.8.X.X.X.6.X.Q.Q.X.X.e+Q.<.>.z+J.<.- 6.e+- J.;+e+- Q.- - - a.Q.- a.R R a.Q.- R >.o.) m+m+>.B B }.B+}+t 2.F :+/.7+Y.Y.1 1 1 Y.m.K 1 K K Y.K Y.Y.Y.w+Y.w+>+w+*.>+>+w+>+>+w+K w+w+1 Y.w+k  .F.F.7+~+:+'.u./+P.p ^.s.s.< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< b+Y @.8.X.8.u ` X.X.X.X.6.X.X.6.>.m+X.6.6.6.e+6.R Q.>.J.) ;+R ( e+Q.- e+- e+a.- - - a.- a.a.]+Q.a.z+) ;+- z+;+;+>.m B }.U  +t 2.2.2.L.1.1.1.1.1.Q >+>+*.>+>+>+>+>+>+Q >+E.w+m.K K K >+w+>+1 K 1 K 1 k >+Y.k k /. .~+~+j k+:.u. +t.s.s.~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< b+%+` 8.X.X.m+X.X.X.X.X.X.X.X.Q.m 6.6.e+6.e+e+e+- e+- e+Q.) o.z+>.R Q.- a.Q.a.- - - a.a.- - a.- R 4+z+a.;+a.]+A ;+;+>.m @.y+}.t n.;./+=  .Y.1 K *.K K K 1 K (.1 K m.>+K 1 K K K K K (.(.*.K K K K K 1 >+1 /./.F.F.O.~+[ #.#.B.2.t.++#+~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v ~ N.A+X.8.8.u >.X.X.X.X.6.6.X.6.Q.z+X.6.6.e+e+e+e+e+e+- e+e+- z+) 4+) ) z+R - e+- a.- - - a.- a.R 4+4+A ]+]+]+]+]+A ;+>.>.m @.@.B+&+}+a+B.:. .Y.m.>+1 K K K 1 K q.K K *.K K (.K K K K w+(.*.K (.K K 1 1 w+Y.k k /.F.7+Y.#.'.#.B.F N.^.K.#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v #+H.B 8.8.X.X.` X.X.X.X.X.X.6.X.Q.>.e+6.6.e+e+e+e+e+e+e+e+a.Q.) - a.R ;+z+) ) ) a.a.R - - a.R R R 4+z+;+]+a.;+]+]+]+]+;+;+>.>.B @.@.B+*+t B.:.:+~+1.9.m.K q.K K (.q.q.Q K K (.K (.(.(.(.(.Q (.(.K (.K 1 K w+/./.F.'.:+~+'.#.#./+$.k.y.~.~ ~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 #+6+p.X.8.X.m+6.X.X.6.6.X.6.6.6.>.;+6.e+6.e+- e+- - e+e+Q.a.z+) R - - a.a.R ;+;+) 4+z+R - - a.a.;+4+]+a.]+]+]+]+]+]+]+]+a.;+;+>.>.m B @.5.}+t  +B.L.9.P K q.q.q.(.(.(.*.*.K (.(.(.(.(.(.*.*.(.(.(.(.1 1 k m. .F.[ j <+:+#.u.u.C.C.p ++~.~ ~ 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 J n @.` 8.X.m+X.X.X.X.6.6.6.6.6.J.e+X.e+e+e+- e+e+- e+a.e+a.) R - a.a.- a.a.a.R ]+A 4+4+4+z+]+e+4+]+a.a.]+]+]+]+]+]+]+A ]+]+]+]+R ;+m+B m g+g+F+ +2.f+_+9.q.q.q.q.(.>+*.*.(.(.(.(.*.*.*.*.Q (.(.1 K 1 1 /.m.:.k+:./+p+b P.& )+P.;. +y.++#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < {.'+p.` u u m X.X.6.X.X.X.X.X.Q.;+e+e+e+e+e+e+e+e+- e+- e+R o.R - a.a.R a.a.a.a.- a.a.]+z++ 4+M.c+;+]+a.a.]+a.]+]+]+]+]+A A ]+]+;+;+;+J.o.A+m A+}+9 t a+:.q+P m.q.E.>+Q Q *.*.*.(.*.*.*.*.Q *.(.(.1 1 7+:+_+:.F B.B.p+C.b P.)+2 C.G.h+++s.~ ~ v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < U.A+` u ` m ( ` X.6.X.X.6.6.e+J.Q.6.6.e+e+e+- e+a.e+- - - z+4+a.a.a.- a.a.- - ]+a.a.a.a.a.]+z+M.4++ z+A ]+]+a.]+]+]+]+]+]+]+A ]+]+]+R z+o.o.m m i.A+I.j.t f+f+q+P m.f >+Q (.*.*.*.*.*.*.*.Q *.(.1 Y.m.P _+:.p+a C+$..+G $.$.C+l.C+C+9 J #+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < {.U 8.8.X.m+` Q.<.<.e+X.6.X.6.) X.6.- e+e+e+- e+e+e+a.- a.) ;+- a.a.a.a.a.a.a.- a.- a.]+a.- A M.;+M.M.M.M.]+]+]+]+]+]+]+]+]+]+;+]+;+;+) o.>.Q.J.>.( i.[+9  +a+Z.9.9.m.1.*.(.*.(.*.*.*.*.*.Q (.(.1.m.P :+F 0+2 , ,.5+|+v+0+$.0+C+C+2 *+J K.; ~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < -.@.u X.8.m 8.X.6.e+J.>.<.6.e+>.e+e+- e+- - - - - e+a.- R M.R - a.a.a.a.a.a.]+a.a.a.a.a.]+a.+ M.]+a.]+A + M.|.|.]+]+]+]+]+]+]+a.]+]++ M.A a.;+;+>.J.m ( %.F+[+[+ + +3.L.L.K (.(.(.(.*.*.*.*.Q m.1.2.B.0+L r.E @+V V ,.! 7 7 _.|+&.5+&+t.K.; ~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < ~ {.p.X.8.8.m X.X.6.X.6.6.<.>.J.<.- - e+e+e+e+e+e+a.e+e+- z+M.a.a.a.a.]+]+a.]+a.a.]+a.]+]+]+]+M.+ ]+]+]+]+A + + A |.|.+ A ]+]+]+]+]+]++ M.;+;+;+z+A ;+z+J.J.i.%.'+j.*+n.2.L._+Y.q.*.(.(.(.*.*.>+~+:.f+F C+L 7.V , @+7.7.l v+T 7.7 &.T 7 J H ; ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< #+{.@.` X.8.B X.X.X.X.6.X.6.u J.>.J.;+R - - - e+e+- a.a.- ) ;+- a.a.a.- ]+a.a.]+a.]+a.]+]+A A M.+ A A A A ]+A A A ]++ + M.+ A A ]+- + M.+ a.]+]+A A + A + z+z+( ( %.'+A+[+ +t :.:.~+q.(.(.*.*.9.O.F )+l.E @+, 7.z ,.r+5+V ^ l V r+^ 5+7 t.++; ~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < j+6+p.X.8.X.m X.X.X.6.X.6.X.e+J.m+e+<.z+) z+z+]+- e+e+e+- M.;+a.a.a.a.a.a.a.a.a.a.]+]+]+]+]+4+|.A A A A A ]+A A A ]+]++ + |.|.M.M.+ ) 4+a.]++ A ]+A A A A + + z+4+o.i.%.'+I.&+;.x ] 9.w+w+w+m.~+/+d.L 7.,.,.r+,.^ 7.^ 5+V 7.v.7.7.^ r+_.h+K.j+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < y.(+B u X.u m+X.X.X.6.X.X.X.Q.>.Q.6.6.e+Q.Q.>.z+) + z+;+;+) - ;+- a.]+a.a.a.]+]+]+a.a.]+]+A M.M.]+A ]+A A A A A + + A A ]+]+A + M.4.c+M.;+]+]+]+A A A A A A + A + ]+z+o.g %.i.y+U ;.+.= ] :.:.F C.2 , 7.V z 7.v.r+7.7.v.v.^ l r+7.7.7.^ B+h+~.~ ~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < J %+}.u X.B u X.X.X.X.6.6.X.<.>.- X.6.e+e+- - Q.e+;+;+4+o.;+a.a.- a.- a.a.a.a.]+a.]+]+]+A A M.+ A A A A A + A + A A + A A A A A A 4.c+4.M.+ A A A A A A A A ]+A A A + ;+) i.i.m U U .+G C.h.C.C+E 5+7 ,.7.^ r+r+&.l 4 v.l+l ^ ^ l 7.^ 7.v.I.H #+< 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 < t.'+@.u X.B u X.6.e+X.X.e+6.>.Q.6.e+e+- e+e+e+- - - e+R 4.c+o.M.4+A ]+]+a.a.a.a.a.]+A ]+A + c++ A + A A + + A + A + + + M.+ + + + 4.M.A M.4.4.M.+ A A A A + A ]+A ]+A R >.o.i.i.i.B }.y+G .+7 r+,.7.^ r+r+l ^ ^ l y+&.r+! l+l ^ v.l v.4 ! _.h+s.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 ~ N.n @.u u m+X.X.X.e+X.X.X.6.J.e+e+e+e+e+e+e+- - - e+- - >.R R - ;+) 4++ A A ]+]+a.]+A ]+A + |.A A + A + + + |.+ + + + + A + + + + > M.A + + + M.> |.M.A A A + A ]+]+]+]+4+) <.<.g A+( B+U 7 r+^ ^ ,.7.^ ! }.v.l &.v.U _.r+v._.v.^ l ^ 7.l ! (+K.#+< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < i+'+8 @.u B X.X.X.X.e+X.X.e+;+<.X.e+e+e+- e+- - - - R z+4+- a.]+]+a.;++ 4+4++ M.M.A A 4+;+> A + + + + + + |.+ + + |.|.+ M.M.+ + M.4.|.+ + + + + + |.|.|.|.+ A A ]+;+]+R 4++ - R - m m m p.@._.l+^ ^ l &.v.&.y+y+! l+&.y+! l+&.l 4 l 7.&.V &.l+h+#+< < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < U.A+B @.` m+X.X.6.X.X.e+6.X.>.- e+e+e+e+e+- e+- - - - ;+) - - ]+a.R ]+;+]+;+A z+4+4.4.M.+ c++ + A |.+ |.+ + + |.|.+ + |.+ M.|.M.> c+M.M.M.M.M.+ + M.|.4.4.4.M.+ ;+]+a.+ 4+;+R - - R >.i.m p.8.! }.p.v.! l+! l+U &+l+_.y+y+&.r+l+7.l ^ 4 7.l ! 9 ^.~ < 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v < ~ U.'+B p.` m X.X.X.X.e+X.e+e+;+e+e+X.e+e+e+- e+- - - - ;+) R - ]+]+]+a.]+a.R ]+A A ;+A 4+> > > |.|.+ + |.|.|.|.M.|.|.M.|.|.|.4.|.^+|.M.M.M.|.|.M.M.M.M.M.+ M.4.4.c+A ]+4+z+a.R a.R - - >.m B u v.8.l+}.U }.l+y+5.B+U B+v.l+! 7.v.l ^ ^ 7.^ 4 ^ ! t.#+< < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 ~ i+'+@.p.B ( m+- X.6.X.6.X.>.>.e+X.e+e+e+e+e+- - - - - z+4+a.a.a.a.a.]+]+]+]+]+]+]+A A + 4.M.|.|.> > > 4.|.|.|.|.|.> |.4.4.4.> > / 4.4.|.4.4.|.|.|.|.M.M.4++ 4+4+4+M.4.c+A a.]+a.a.;+a.R e+m+B @.4 }.l+U F+g+U y+y+g+U r+^ l+v.7.&.^ ^ 7.v.v.4 ! N.; ~ < < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < ~ N.n @.p.B ` u m+>.a.e+6.X.R <.e+e+e+e+e+- e+- - - - - z+;+a.a.a.a.]+]+]+]+]+]+]+A ]+]++ > 4++ M.|.|.|.> ^+/ / > c+> > > > 4.c+^+> > > > > > > > > |.4.M.M.M.+ + ;+4+> 4.4++ ;+]+]+a.a.;+- >.>.( @.}.}.B+[+9 g+U l+_.y+l+4 l ! 7.^ r+4 l l r+l l y+~.~ < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < ~ t.H.B p.m ` X.X.6.<.R <.e+m+Q.X.X.e+e+e+e+- - - - - - 4+;+- a.a.]+]+]+]+]+]+]+A A A ]+A c+M.+ M.|.|.|.|.4.c+> ^+^+> ^+^+^+^+> ' > > > > > > > > > > > 4.4.4.M.M.4+A M.+ + M.+ M.M.a.- ]+- Q.` m A+y+B+8 I.I.}+&+_.&.l l+_.7.4 l ^ l ^ &.v.^ l &.v.y.; ~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < < H -.B p.B ` X.X.X.u e+m >.J.>.- X.e+e+e+- e+- - - - a.) R - ]+a.a.]+]+]+]+]+]+]+A A A M.c+M.+ |.+ |.|.|.4.> > > > ^+' / t+' ^+' / ^+^+^+^+> > > > > ^+> > > |.M.4+4.4+A ]+]++ + + M.;+;+- Q.m+A+'+I.'+F+F+g+y+y+y+_.l v.l+^ ^ v.v.l ^ v.&.7.4 v.l+J s.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v 0 < ~.x.U ` B m+X.X.6.6.6.6.e+J.( ) + e+e+e+e+- - - - a.;+4+- - a.]+]+]+]+]+]+]+]+]+]+A + M.4.+ + |.|.|.|.> |.> > > > ^+^+^+^+' o+' ' o+o+' ' ^+' ^+^+^+^+> > > c+4.M.> 4+A ]+]+A ]+A z+4+4.z+m+m+A+A+9 !.!.9 B+y+y+l+U l+l ^ ! v.7.l r+^ l ! 7.v.l l+J j+~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < ~.x.B ` m+m+8.X.X.X.6.6.6.<.>.6.6.4++ A ]+- - - e+- R 4.- - a.a.a.]+]+]+]+]+]+A A A + c+M.M.M.M.|.|.|.> > > > > ^+^+^+/ / ' ' ' ' ^+' ' R.R.R.o+' ' ' ^+> > > c+> 4.4+A A ]+A ]+A ;+a.;+) i.i.A+[+(+Y 1+(+g+U l+_.! B+l+l l &.7.4 v.l ! l+r+r+v._.t.++; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~.x.y+` u B u 6.6.6.6.X.e+<.;+e+e+6.e+<.z+z+z+R R - R 4+- - a.]+]+a.a.]+]+]+]+]+]+]++ 4.M.M.M.M.> 4.4.|.> > ^+/ ^+^+^+' ^+' R.' ' o+o+' o+' o+R.R.o+o+o+' t+/ > > c+M.A A A ]+]+]+;+]+>.) i.'+'+n !.!.Y 9 I.B+U _.! l l+l ^ l _.^ ^ ^ &.! v.l v.l+t.++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < ++1+i.` X.m ` X.X.X.6.6.e+<.<.e+e+- e+- a.R A z+z+) 4+4+a.a.- a.- ]+]+]+]+]+]+A ]+]++ 4.M.+ M.M.|.|.> > > > > ^+^+' ' ' ' o+R.o+o+R.R.R.R.R.R.R.R.o+o+R.o+' t+t+' > c++ + A A A ;+a.;+>.J.g n H.H.1+x.Y [+B+y+5.5.y+&.^ v.! v.4 &.^ 4 v.v.v.v.&._.t.++; ~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < ~.x.A+B u m 6.X.e+6.X.6.6.>.;+e+e+- e+e+e+e+- R ;+;+) z+4+M.+ + ]+a.a.a.]+]+A ]+]+;+M.4.M.+ |.|.|.|.|.|.> ^+^+^+^+^+' ' ' R.R.R.o+R.R.R.R.$ R.$ R.3+o+o+o+' t+/ t+> > |.> 4.M.+ ;+;+z+>.J.'+C x.U.i+h+Y I.U y+y+l+y+}.&.l+l &.r+7.l l l l l v.v.l+t.^.; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 < K.{.'+B m+B u X.6.6.X.6.e+<.<.e+e+e+e+- - - - - e+R ) R R ]+]++ M.|.|.+ ]+]+]+]+]+;+M.4.+ + M.|.|.> > > > > ^+' ' ^+o+' R.R.R.R.R.R.$ $ $ $ $ $ $ $ R.3+o+' ^+t+^+c+M.4++ + 4+4.c+c+c+g i.6 H.1+h+h+U.x.9 B+U y+_.! v.y+l+! l v.7.l v.v.l l v.l l+t.y.s.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v < #+N.'+B @.m e+X.X.X.6.6.6.<.;+e+e+- e+e+- - - - - - ) Q.a.- - a.a.]+A + |.4.c+M.M.4+c+4.M.M.|.|.|.|.> > > ^+^+^+^+' ' o+o+$ $ R.$ $ $ $ $ $ D+$ D+$ $ R.R.' ' ' / 4.4.M.+ A ]+;+A z+) g n C !.{.U.U.x.H.I.I.9 I.U _.l+! l+y+l 7.4 l l l l l l v._.N.^.; #+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 ~ ~.n @.` m @.X.X.X.X.6.e+<.<.e+e+- e+- - e+- - - ;+M.Q.- a.]+]+a.]+]+]+]+]+A + 4+4.> c+c+c+> > > > > > > / / ' ' ' ' ' R.$ R.$ $ $ $ D+s+s+s+D+D+$ D+3+R.' C ' g c+M.M.+ A A A + ;+z+( n H.x.U.N.{.x.(+g+U &+U U U U l+l+l v.7.7.^ 4 l v.v.l v._.t.^.#+#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ; n @.u m m+- X.6.6.6.e+<.;+e+e+e+- e+- - - - - e+M.a.- - ]+a.a.]+a.a.]+]+a.a.A z+c+4.c+c+> > ^+/ / t+t+/ ' ' ' ' o+o+3+$ $ $ $ D+D+D+s+D+s+D+s+D+$ $ o+' ' ' / 4.M.+ + + A A ]+z+J.o.6 1+-.N.U.N.x.(+F+I.U U y+y+l+y+y+}.l l l ^ ^ 4 l l l v.y+N.^.K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < < s.(+@.` ( ` Q.>.- 6.6.6.Q.>.e+6.- - e+- - - - - - 4.- a.a.a.]+a.]+]+]+]+]+]+]+]+A M.4.M.M.M.|.|.> > ^+^+/ ' ' ' o+R.r D+5 s+D+% % % * % % % s+s+D+D+D+c c C t+> c+4.M.+ A ]+;+;+;+J.i.n H.x.{.h+U.!.[+9 (+9 [+I.5.l+l+l+&.l ^ l l l l 4 &.l ! U.t.^.K.~ < < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~ t.A+B m u X.Q.>.z+Q.e+>.;+e+- e+- - - - - - - e+4+- - a.a.a.]+]+a.]+]+]+]+]+A A c+M.M.M.|.|.4.|.> > / ^+^+' ' ' o+3+5 D+D+D+D+% % % % * * * * % % s+D+3+r o+C / > > > > c+> c+c+g 6 n Y 1+x.{.x.Y [+9 9 F+g+y+B+U g+B+y+&.4 ! l l l l l ^ l+{.J ^.#+#+< v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ~ #+%.@.B m+X.u 6.Q.<.Q.z+>.6.6.e+- - - - - - - a.4+- a.a.a.a.]+]+]+]+]+]+]+]+]++ 4.M.M.M.|.4.> |.> > ^+/ / / ' ' 3+3+5 $ D+D+s+s+% % % % % % % s+D+D+-.3+c t+6 c+4.+ A + A ;+;+>.J.%.n n 1+1+{.!.9 9 Y (+F+g+y+U U U l+l+! ^ 4 l l l l l l F+N.J ^.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < #+#+!.B B ( ` X.X.6.Q.>.z+z+R e+- - e+- - - - a.- M.a.- a.- ]+a.]+a.]+]+]+]+]+]++ 4.M.M.|.|.|.|.> > > > / / ' ' ' o+-.D+5 s+s+s+s+% % % % % % % % s+5 -.c 3+t+g c+4.M.+ + A A A <.o.6 n !.{.x.x.x.(+H.1+H.9 (+[+U 5.I.U }.l+v.! l l 4 ^ 7.v.!.N.J ++#+~ < v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < #+b+Y @.( u 6.6.X.6.Q.z+J.J.) z+A R - - - - a.R ) ]+- a.a.a.a.]+]+]+]+]+A A ]++ c+M.M.|.|.> |.> > ^+/ / t+t+' ' 3+-.5 5 s+s+% % % * * * * * % % s+U.-.c 3+t+g 4.M.+ A + ]+A ]+m+>.A+A+[+Y Y Y (+[+!.h+x.(+(+[+! _.B+U l+l+&.v.l l &.l l g+N.J ^.~.~ ~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 < #+#+b+}.A+u u Q.6.X.6.<.;+e+Q.R z++ 4++ ;+- e+Q.4+a.a.- a.]+]+]+]+]+]+]+]+]+A M.|.M.M.|.|.|.> > > > > / / ' ' ' 3+3+s+5 D+s+s+% % % * * * % b+% s+5 -.c 3+6 > c+M.+ + A A ;+R o.i.'+A+F+9 9 9 9 '+H.h+H.H.Y (+g+8 B+U _.l+! l l l l l &.Y t.t.^.s.~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 < #+; j+'+%.m m+Q.e+e+Q.>.>.e+e+e+- - <.;+z+4+4+;+) R - a.a.a.a.]+]+]+]+]+]+]+]+M.4.+ M.|.|.> |.> > ^+/ / t+' ' 3+3+-.s+5 s+% % % % * * * * % * s+s+5 -.c 3+> 6 4.4.4+M.M.c+c+c+>.m i.5.[+[+[+[+F+9 x.N.h+{.H.9 y+U B+B+y+l+&.&.l l l 4 B+h+t.y.~.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 ~ #+~.1+A+g B <.e+Q.6.e+>.<.e+- e+e+e+- R ]+;+o.c+4++ ]+A A ]+]+]+]+]+]+A A A M.4.M.M.|.|.|.> > > > / / t+t+' ' 3+-.s+5 5 s+% % % % % % b+% % s+s+-.-.c 3+/ > / > > M.+ ;+R R m i.A+'+Y (+(+(+9 [+!.{.{.{.!.(+g+5.U B+B+l+l l l l l v.Y t.N.^.~.#+< < 0 =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v ~ ~ #+t.1+%.m m <.Q.Q.Q.) <.Q.e+- - - - - a.]+R o.R a.4+M.|.M.M.+ + M.M.M.+ A M.4.M.M.|.|.> > > > > / / t+' ' 3+-.-.5 5 5 s+s+% % * * * * % b+s+% 5 -.3+' t+6 ) ) + + A ]+;+a.` m+A+A+}+I.8 g+U [+!.h+h+h+{.H._.U 5.U B+l+7.v.l l 4 x.i+t.J ++s.~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < < #+++5 !.%.( B <.<.<.J.m+Q.- - - - - - a.- Q.) R - ]+a.a.a.]++ + + M.+ |.|.c+> > 4.^+> > ^+^+' t+' ' ' 3+3+3+3+5 % s+% % % % % % % % % % s+s+D+-.3+C C > c+) M.+ A A A ;+>.m m A+g+5.I.g+'+F+(+!.h+h+x.x.H.F+y+B+F+}.v.}.l l l _.h+N.t.^.s.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 v ~ ~ #+s.N.H.6 i.m m <.J.>.e+- e+R a.a.- a.- - z+z+a.a.a.a.]+a.]+A ]+]+]+A M.M.c+4.|.> > > > > ^+^+/ t+' ' ' 3+3+r 5 5 5 s+s+s+s+% s+s+s+D+D+D+r 3+' C ' g ) ) z+]+]++ o.c+i.%.A+I.'+9 9 }+B+I.9 (+!.{.{.x.Y g+U [+B+_.U &.4 r+y+!.t.N.y.~.#+~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < ~ #+j+H N.{.%+A+( m ( ( <.Q.- e+- - a.a.a.- ;+) R a.a.a.]+]+]+]+]+]+]+A ]+M.c+M.+ + |.|.> |.> > > > / / t+C ' 3+$ -.-.D+D+D+D+D+D+D+D+D+$ $ 3+o+' t+' g c+o.) o.c+o.i.( m p.@.8 I.I.g+U U B+[+Y 1+1+x.1+(+F+y+_.U y+! ! &._.!.t.N.t.++~.#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < ~ s.~.++J h+Y '+( m ( ` <.<.Q.Q.Q.R Q.- <.<.) R - ]+a.a.]+]+]+]+]+A A ]+4+4.M.+ M.|.|.> > |.> > > > t+/ ' ' 3+-.r r r D+D+D+D+s+$ $ $ $ $ o+c C 6 C g g g g g %.i.B @.B y+U y+8 5.5.B+B+y+[+Y Y Y H.Y F+}.U U U U l+! l+1+i+N.N.++++#+< < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 0 ~ ~ #+++H b+N.x.%+A+g m Q.Q.Q.<.R Q.Q.Q.Q.Q.o.Q.R ;+]+]+]+]+]+]+A ]+A A A M.M.+ + M.|.|.|.> 4.> > > > / t+t+' r 3+3+$ $ D+$ $ D+$ $ $ 3+o+c C c C C %+%+'+8 8 8 A+F+A+'+'+I.8 I.[+9 [+5.B+I.[+9 (+Y Y F+B+y+y+y+y+&.&.x.N.N.N.^.~.~.~ < 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v 0 < < ~ j+++H J N.h+n 6 A+B m+` ` m+m+Q.Q.m+Q.o.Q.Q.<.<.R A A + ]+A ]+]++ z+4.M.M.+ M.|.|.|.|.> |.> > > / t+t+o+3+3+3+$ $ $ $ $ $ R.r 3+c c c c c 6+6+%+%+j.g+U y+8 '+[+'+F+[+'+F+g+U y+y+U 5.F+9 9 [+9 F+5.B+y+l+l y+x.N.i+t.J s.K.#+< < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 v v < ~ ~ ~ ; j+J b+t.H.n ( i.i.m m+Q.` m+Q.m+>.o.m+<.<.>.>.;+;+;+;+;+A z+A A 4.M.+ + + |.|.|.|.|.4.4.> > > > t+' 3+' o+R.R.R.$ R.R.c r r $ c c C 6+%+j.j.@ j.j.@ j.I I.8 B+*+B+y+U U B+F+I.y+l+_.g+F+I.g+B+B+B+l+v.8 x.i+i+t.y.^.j+#+< ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < < < ~ ; ++y.J i+!.[+'+}.y+i.B+i.p.@.p.@.B i.m+>.>.>.J.>.J.z+>.z+z+z+z+4.4.+ + M.|.|.|.|.> |.> 4.> > / t+' c o+c R.3+c r r 5 5 c e e {.N e e 6+@ 9+9+T.!++.+.j.I F+[+9 9 *+I.g+*+y+_.l+! _.B+I.g+B+U l+_.v.Y i+i+N.N.J ^.~.#+< < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v 0 0 < < ~ #+; ~.^.t.{.!.'+B+B l+}.A+A+A+B+@.A+i.@.B m ( m m J.( J.J.J.) J.c+M.+ + + |.|.|.> 4.4.c+> g > 6 / C 3+c c r $ U.r U.U.A.c e 6+6+6+@ @ T.[.[.T.s !+= +.h.i .+}+B+B+y+_._.y+_._.U l+v.l ! y+y+l+l+(+x.N.i+N.J ^.++s.#+~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < < < ~ ~ #+s.++J i+H.9 *+_._.B+_.}.B+B+g+F+A+A+8 A+%.%.%.%.i.( m ( ( i.i.J.o.c+M.c+> 6 / / 6 t+t+t+C C c c c U.c N c } e e N } 9+..........x+x+W...: x+x+!++.-+i }+I.I.A+y+l+_.}._.&.! _.y+l+l+F+{.1+i+i+N.N.t.J ^.s.#+~ < < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v 0 0 ~ ~ #+s.^.J h+(+[+n.&+n.v+7 v+v+&+}+n.5.5.*+F+F+'+%+n '+6 %+6 6 6 %.6 6 6 6 6 6 6 6 6 n n n C 6+c 6+e } } } } } } } } # ..# # # # u+o o u+o e.w.X { = G.G.x .+U i v+_.v+7 ! l+y+g+g+(+h+i+h+N.N.i+t.J ^.++#+~ ~ < < v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v 0 0 < ~ ~ #+~.^.N.p 9 t ;.;.;.F C.$.C.;.t +.x +.I I I j.(+j.F+F+'+'+'+%.'+n C %+%.%+6 %+%+%+%+6+1+e e 6+} A.D.A.D.# D.D.D.D.# D.D.].=+o =+=+=+S d+S w.: { O !+= $+$+h.B.p+h.C.-+g+[+1+h+h+h+i+N.i+J y.^.^.K.K.#+< < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v =.v v v v 0 v 0 < ~ ~ s.s.^.N.1+ +;.F F f+:.B.F /+f+B.= a+2.Z.a+3.D [. +3.j.j.9 j.j.6+6+%+6+c.c.6+6+6+9+6+} } _ # D.D.D.D.D.D.D.w ,+y y 3 y y y y ].y =+=+d+w.e.q : X X E+`.`.O q+_+2.2.2.[+x.i+h+h+t.t.N.J y.^.++s.~ ~ < < 0 v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v =.v =.v v =.=.v v v 0 < < ~ s.++y.N.b. +/+F f+:.:.:.f+L.f+S.:.O q+q+E+b.T.[.E+T.[.{ T.[..._ 9+..} .._ .._ # # w D.D.w w w w y d y y h y y y 3 3 3 3 y y 3 y =+=+S w.w.w.{+w.f : `.S.S.+.+.t  +{.h+U.N.N.t.J y.++~.~.#+~ ~ ~ 0 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v =.v v v v v 0 0 < ~ ~ #+^.^.N.p Z.:.:+:+:.f+9.L.9.q+: P : : : G+).W.W.X X W.W.b.0.8+# # V.# u+u+u+D.D.w ,+,+3 y y 3 y 3 y y h y 3 3 3 3 y 3 =+y 3 y y ].S w.S d+w.q f O S.= Z.t }+Y x.h+i+N.t.J y.^.~.s.~ #+~ ~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v v =.v v v 0 0 0 < ~ s.^.y.N.D a+:+q+~+~+~+9.1.L.q+: q {+G+V.{+w.Q {+d+{+S d+=+,+].].=+=+=+=+].=+y 3 y y y y y y y y 3 3 3 y 3 y 3 3 y =+y 3 y =+=+d+S w.d+Q f P P q+_+Z.2.p 1+h+i+i+N.J y.^.K.#+#+~ < < 0 < 0 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v =.v v v v =.=.v =.=.=.v 0 0 < ~ s.s.s.N.i+D f+S.] Y.Y.Y.P P L.: L.q ).d+g.g.w.{+d+d+=+d+y d y =+=+y y y y y 3 h 3 y 3 y y y y y y 3 y =+y y y =+y y y y y =+=+=+S w.w.{+).L.q+L.L.D 2+2+h+i+i+t.t.y.++K.#+#+~ < < 0 < v 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v =.=.=.=.=.=.v 0 0 < < s.s.y.J ).2.~+7+Y.P 9.f P f f f f f {+d+d+S g.].=+y ].y ,+].y y y y y ].=+y 3 y ].y ].=+].=+].y y ].=+=+=+=+=+=+y ].].=+=+=+y =+g.G+: q+`.2.D b.2+h+i+i+N.N.J y.~.#+#+~ < < < 0 v v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v =.v =.=.=.=.=.v v 0 0 < ~ s.s.t.2+2.f+O 9.9.Y.q.f q f f f f q {+{+G+w.w.{+S g.].d ,+y y y ,+y y y ,+,+].].y y y ].y ,+y y y =+=+y y =+y ].3 y 3 y =+G+G+G+: O O E+b.b.2+k.h+h+N.t.b+^.~.#+~ < < 0 v =.v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v v v v =.v =.=.=.=.=.=.v v 0 0 ~ s.#+2+t B.:+f+P 1.9.9.9.f f f q f f e.{+X e.e.e.e.e.S ].=+d+V.d+=+=+].,+d ,+].=+,+y y =+].y d ].].=+=+=+g.g.g.=+g.g.Q Q q {+f : O `.q+L.L.2+i+i+i+N.t.H ~.~.#+~ < 0 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v =.=.=.=.=.=.=.=.v v < < ~ ^.[+|+C.0+B.:.q+9.: P w+e.f q E.E.q d+e.q e.q w.e.e.d+d+o e.o e.o S d+=+].d+o S o S S S g.g.d+d+d+d+w.S d+g.g.S w.w.e.e.q f 9.9.P b.2+b.k.i+i+N.t.b+++~.#+#+~ 0 0 0 =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v v =.=.=.=.=.=.=.=.v v 0 < ~ 1+&+E C+0+C.$.C.Z q+f f q q q E.q E.q {+q q q q e.e.{+{+S w.o w.w.S S d+=+S o S o o w.w.g.S w.o w.w.w.w.o w.w.q E.f : f : `.`.E+D 2+2+h+h+N.N.J y.++s.#+< < 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v v v v v =.=.v =.=.=.=.=.=.=.=.=.0 < ~ &+v+7 l.E 0+C+-+b f+f+9.L.).q *.q E.q g.q w.w.w.w.w.d+S e.w.q w.w.w.Q S d+o w.w.w.w.S S g.w.e.w.w.e.e.q V.e.q f f f f : P O 2.L.b.2+h+h+i+N.t.^.~.s.~ ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.v =.=.v v v v v v =.=.=.=.=.=.=.=.=.=.0 =.0 Y $.5+|+2 .+T a ;.| & & k+f+q+L.{+{+Q {+g.Q *.E.Q Q Q Q Q w.w.w.w.w.w.S g.Q o w.w.o w.X o g.e.e.e.e.f e.d+q f : : `.: ).q+E+_+2. + +p x.N.N.t.y.~.s.#+~ < < 0 0 =.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v v v v =.v =.v v =.=.=.=.=.=.v v 0 < ++9 7 2 @+l.C+a E 0+C+a )+u.j :.P L.L.P >+q Q d+d+w.Q w.Q g.q w.w.w.d+S w.=+w.w.e.e.e.e.q d+e.q X f X : q X : : : f X L.L.2./+h.C.|+v+&+[+2+i+^.s.++#+~ ~ v v =.=.v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v v =.=.v v =.=.=.=.=.=.=.=.< 2+v+7 E 2 2 C+2 0+C+P.| )+)+& P.j :+P 1.L.9.m.q Q {+q w.Q g.g.=+d+Q S {+{+d+q e.q q q X X d+: X X q V.G+).W.: X W.L.2._+$+p+d.0+C+E C+7 7 n.[+2+^.#+~ < v < 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v v v =.=.=.=.v v v 0 < t.9 5+2 2 0+0+l.P.C+a 0+)+)+)+)+j ] :.:+S.9.: ~+9.f P 9.P E.q E.E.f f q {+{+g.w.{+e.{+V.{+{+V.G+f : : : O f+:.L.q+2.Z h.b 0+| C.a C+2 r.E l.@+5+_.*+1+~.< ~ v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v =.v v v =.=.=.v v 0 < N.i T l.$.d.P.| C.L a d.P.)+& :.k+<+j '.k+[ O.P P f P P 9.O Y.1.P O 9.O : f P O P `.9.`.q+q+`.`.S.s q+_+_+_+f+Z.C.C.b d.d.P.| E 0+C+a C+l., l.5+T T 7 *+h+~ 0 < v =.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v =.v =.v =.v v v v v v v 0 0 0 < 2+T 7 2 2 C.P.C+F L a -+F F F u.u.u.#.#.'.'.[ z.O.:+9.9.O Y.O f 9.9.`.Y.P L.S. .O 7+S.q+q+O S.S.q+L.2.f+f+= b = -+P.b d.| d.P.| a C+C+l.| C+L l.5+,.5+T 5+&+N.0 0 =.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.v =.v v v v v v v v v 0 0 0 ++5.7 , 0+d.P.& h.F d.| b P.<+& #.#.'.[ [ [ [ [ '.z.O.7+7+7+7+ .~+~+~+O O P P _+9.`.~+9.q+_+S.f+= _+= k+<+F b )+b b | -+b | )+P.b | | d.C+C+C+a a a E r.@+T 7 7 t.y.~ v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v =.v v v v v v v v v v 0 0 0 J .+,.5+2 d.$+b t h.0+l.p+& /+u.#.'.'.'.'.[ [ [ F.~+~+:+[ '.O.O.k+O.z.[ 7+S.] :.] 7+] f+~+k+j <+$+Z P.& C.$+)+C+)+$+| )+k+& | & <+)+)+P.0+a l.0+C+l.a l.E ,.,.7 _.F+h+; < 0 v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v =.v v v =.v =.v v v 0 0 < J U ^ C+E C.& z.P.| 0+d.C+& <+z.#.[ O.[ [ [ O.9.~+F.[ [ [ [ [ O.'.'.O.7+:+[ j '.#.#.O.] j j j u.$+Z P.& b <+)+d.& /+| )+& z.)+)+P.<+)+| <+P.| a P.C+a a C+C+L , 5+7 7 }+2+~ 0 =.v =.=.=.=.0 =.v v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v =.=.v v =.v v v 0 0 0 < N.U T |+C+b & /+b | F -+d.& & :+[ '.#.z.7+~+7+O.[ [ [ [ [ [ '.'.O.O.O.:+[ #.'.'.'.'.7+z.j u.u.j k+$+& )+P.$+& & & z.& & )+F u.)+)+<+P.)+)+P.P.| | P.0+a L l.l.l.,.,.v+7 U 9 h+< 0 < 0 < v =.< 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.v v v v v =.v 0 0 < N.U ! l.0+b P.k+P.d.p+0+C+)+& :+O.[ [ 7+~+7+O.[ '.[ [ [ '.[ [ '.F.~+O.k+'.#.j '.j k+O.j u.j j j z.<+& & u.Z & )+& <+P.& )+<+<+& )+& <+#.)+& <+u.| )+0+P.a a l.| l.r.7.l.E 5+7 }+t.0 0 0 v < =.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v 0 0 < t.y+v.@+$.<+F <+b F C.P.C+| P.#.:+7+7+7+[ [ #.[ #.'.[ [ '.'.[  .:+[ [ '.#.'.'.j [ :+'.#.#.'.#.#.] j & u.b k+& & & j z.u.& #./+u.#.)+P.k+& )+P.j b )+| P.b | L L d.d.a @+,.|+l.7 j.h+~.< v =.0 0 =.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.v v v v 0 0 < t.U 7 , 0+0+/+k+] B.$.F P.)+& & :+~+:.'.'.[ '.[ [ [ '.'.'.[ O.O.[ j #.[ '.#.'.'.7+k+#.j j #.& k+z.u.u.u.b Z & & & j /+& u.u.k+<+& u.u.<+j u.)+u.<+#.)+| & P.C+a L L d.L L @+E l._.v+j.h+K.< v =.0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.=.=.v 0 < ~ N.U ! , 0+d.k+k+f+P.d.;.b b )+#.:.:.[ '.'.[ #.[ #.[ [ #.[ F.:+'.[ #.'.'.'.#.'.:+O.'.'.'.'.u.u.:.'.u.u.u.j :+#.& u.k+:+& u.u.k+k+u.u.u.u./+k+& & u.k+k+)+)+P.P.& | L a P.$., , , @+&.5+.+9 {.~ < 0 =.v 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < N.U 7 , -+d.F #.:.)+C+F $.b & <+:+/+O.O.'.[ [ [ #.[ '.[ O.:+[ #.[ '.'.'.'.'.[ 7+[ #.'.'.#.#.'.:.#.& #.#.#.] u.u.#.'.:+u.u.u.k+[ k+u.u.#.k+/+#.j P.#.k+k+& )+& b )+a a L , $.a @+, ,.7 5+@+y+(+h+~ v 0 < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v v < < t..+! , C.d.k+j f+P.)+p+| -+F <+k+#.k+ .[ [ [ [ [ '.'.F.7+[ '.[ #.'.'.#.'.k+:+:+[ '.'.'.'.'.[ :+#.#.j #.j :+u.#.u.j /+'.u.#.#.k+:+u.j #.j :+/+u.j u.j /+u.)+)+)+<+)+| L l., 2 E , , 7.T 7 5+.+}+{.y.K.#+v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 ~ t.y+,.v+a P.b k+:+#.C.0+p+a b k+u.j #.F./.[ [ [ #./.~+F.k+[ '.[ '.[ [ #.[ ~+7+'.[ '.[ '.#.#.~+'.#.#.#.#.:+[ #.#.#.#.:+/+u.j #.#.7+k+#.k+j j f+k+j j j k+[ u.)+& d.0+& a L , , l.T T @+7 l+&.i .+5.F+I.(+++< =.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < < N._.,.0+a b b /+[ <+F P.p+a P.F #.& k+[ O.k [ [ k 7+:+[ [ '.[ #.'.'.[ #.O.~+[ [ [ [ [ [ '.[ 7+'.[ #.j #.:.k+#.#.#.j O.:+#.j #.#.k+7+j '.'.j O.:.k+'.'.'.k+F u.)+| )+b d.a , , C+7 v.7 _.7 7 l+i i _.&+*+p ++< 0 < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 < N.U ,.|+| P.b B.'.k+F -+h.| )+/+j #.'.'.:+~+O.:+~+F.[ '.'.'.'.[ '.#.[ [ 7+7+'.[ [ [ [ [ '.:+7+'.'.#.'.j 7+k+#.'.#.#.O.:.#.'.'.'.'.~+[ j O.'.k+7+f+z.k+'.#.z.k+)+| a | a l.$.|+|+7 7 7 7 ! |+_._._.|+.+&+*+h+~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < ~ t.5.r+2 C+<+u.:.k+/+<+P.p+a a F k+k+#.'.O.O. .~+O.[ [ '.[ '.[ '.[ '.[ ~+ .O.[ O.O.O.O.O.'.~+O.[ '.'.'.k+~+'.'.'.'.'.'.:.'.#.'.#.'.7+:+'.z.O.k+ ._+] z.j j b <+<+| | L L l.v+|+! 7 |+@+T 5+T 2 7 l.G v+G G Y t.~ < < =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 ~ t.*+5+$.0+F P./+k+:.P.b h.0+C+C.P.k+#.#.[ F.~+~+O.O.'.[ [ [ [ #.[ '.7+ .F.O.7+O.O.[ [ O.O.~+:+'.'.#.'.[ ~+#.#.[ #.'.'.7+'.'.'.[ [ [ 7+O.[ O.] 7+S.:.] z.j P.P.b d.| l.0+G.2 T 7 l.|+@+l.E E 2 l.$.-+$.|+$. +Y K.~ ~ < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < N.U ,.0+0+/+F f+j :+b b F C.-+0+P.b :.'.#.Y. .~+ . .F.[ #.[ [ [ [ O. .~+O.O.7+O.F.O.F.O.7+Y.O.[ [ [ '.k+k '.#.'.[ #.'.7+[ '.'.'.[ k+~+O Z ] ~+S.S.q+O z.j j d.& F -+C.G.2 l.E 7 E l.l.G.G.-+-+-+b 0+P.0+.+G }+N.~ < < 0 =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < t.U ,.C+l.F k+:.:.~+/+F p+;.0+-+u.u.:.k+[ Y.[ [ O.~+k  .[ '.[ [ [ ~+7+O.O.O. .7+ .O.F.O.Y.7+O.[ [ [ '.k+Y.#.[ #.[ '.[ ~+:+'.[ [ O.Z ~+P S.S.O O _+_+S.] k+<+b b C.G.;.0+E l.0+G.G.p+G.F C.b & 0+j P.d.-+C.v+n.Y ~.< < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 ~ t.i ,.$.a <+<+j /+j <+F )+$.a ;.b & j :+:+F.7+[ [ [ 7+Y.Y.F.[ [ O.Y.F.O.O.7+7+ ./.7+F.7+P ~+O.O.[ [ [ k+Y.[ [ [ [ '.'.~+O.[ [ O.] 7+S.q+L.O O `._+S.q+s ] b -+b ;.0+0+G.-+b -+-+C+h.d.b b P.F j F P./+)+$.G.G }+h+~.< < v =.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.v v < N..+,.$.| P.<+F :.b b b C.P.C.$.0+& #.[ 9.:.'./.F.[ [ [ F.Y. .[ 9.7+[ 7+F.F.F. .F. .F. .P 7+O.O.F.O.O.O.~+[ [ [ '.[ '.[ 9./+:+] S.7+S.P L.q+: q+E+O s q+= $+b d.C.p+0+b C+p+P.b )+= & $+Z b ] <+/+u.F P.d.C.G x p J ~ ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v 0 0 ~ J l+@+2 C.& <+u.B.j /+P.d.0+0+| C.)+& '.:.~+7+[ F.F.F.[ [ O./.Y.P 7+O.F. . . . .k  . .Y.P 7+O.O.F.[ z.O.P [ [ [ O.O.[ z.q+O.] 7+O O q+: G+: : { { s _+_+s = b b G.b b G.d.h.p+B.b :.b F ] j f+j :.k+j /+C.C.2 $.j.{.~.~ < 0 < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < y.! r.2 -+d.F P./+<+B.P.C+C+C+r.C.& & #.:+~+~+F.F.[ /.F.[ [ :+m.m.~+~+ .7+F. .Y. . . .9.Y. . .7+7+[ O.O.9.z.O.O.O.] O.7+P S.S.O `.: { X W.W.W.: { T.s s 2.2.p+b = B.B.$+<+b <+= <+S.$+] ] k+q+z.] ] P.:.b P.0+;.G 1+s.#+~ 0 < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.=.v 0 ~ {.! 7 .+C.b <+<+j b <+P.0+$.$.E 0+P.u.u.:+7+7+Y.k F.F.F.F.O.F.Y.F.Y.9.9.Y. . . .k Y.Y.f 9.O  .7+k 7+O.7+P 7+ .7+7+7+7+S.P `.O `.E+: L.X W.# # W.L.: T.2.T.E+2.a+C.$+$+$+= $+$+= $+_+z.S.S.O.S.] :+S.u.k+<+p+h.h.v+p ++~ #+< 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < s.I.l+|+$.C.h.F B.k+k+<+F C.0+$.l.C+C.u.#.:.:+[  .Y. .F.F.F.O.~+Y.F.F.k Y.K m.9.Y.Y.Y.Y.:  .O k  . .7+7+7+: ~+ .O O  .7+S.`.: : : X W.W.W.V.0.n+u+n+V.b.L.[.2.a+C.<+p+= <+_+$+= S.] q+Z S.q+]  .S.:+S.] ] f+<+F -+G  +h+s.~ < < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.0 0 0 ~ U ! |+L C.P.F :.F :.F p+C.E v+E E 0+& k+:+:+O.F.O.k Y.~+F. .Y.Y. .k F./. .9.w+f 9.P w+P Y.Y.O Y. . .~+O 1.`.P P P : P : L.).b.).V.g.V.0.V.0.0.W.W.W.T.E+2.[.Z.h.a+:.= $+s Z S.s ] : ] ] P 7+S.: ~+_+9.7+_+b h.P.h.}+2+++~ ~ v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 v 0 #+_.5+|+l.P.P.<+k+P.<+C.d.0+l.l.7 E C+& k+/+:+k+[ [ /.k Y.Y.~+Y.~+/./. .Y. . . .P q.f E.f f m.f f P P : : ).f f q X ).q ).).V.W.W.L.).G+V.V.0.0.# # # x+E+E+[.2.a+= B.f+= _+$+s `.S.: s `.: q+P ).P ~+f+[ :.z./+b p+x 1+y.s.~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v ~ N.7 ,.l.p+d./+<+k+k+k+<+0+0+v+T |+r.$.)+P.:+7+[ F.[ F.O.k 9.m.m. ./. .k Y.Y. . .Y.k Y.1.P f : w+q.m.f m.P ).`.: P : : : X W.V.X G+V.G+V.V.V.,+V.V.G+# W.T.T.[.3.2.$+a+s = E+= s E+!+W.: E+W.L.L.q+7+S.9.7+O.f+B.P.p+7 Y J s.~ ~ 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < F+&.7 L b )+k+<+b /+& F 0+l.2 7 7 |+0+)+& & /+O.'.F.F./././.Y.>+m.k  ./. .Y.Y.Y.9.Y.q.>+w+1 9.Y.9.Y.q.9.q P m.q.f f f f q f g.).e.V.G+V.V.V.].0.u+u+# # ..[.[.D D 2.D 2.T.T.W.E+b.: b.q+: 1.`.`.f O S.: 7+~+~+j :+& G &+i+++~ ~ 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.0 0 < 5.7 l.|+P.P.F <+<+k+<+b 0+2 T T 7 7 0+-+& & :.:+k '.F./././.K m.~+w+w+K Y.Y. .Y.9.Y.f q.9.9.q.q.q.q.P 9.w.P : f f f f q X q g.G+o V.G+o V.0.8+D.V.V.u+u+b.x+T.D 2.a+q+Z.L.s 2.E+E+E+W.s s ).: `.: : S.f 7+7+f+j :.b C..+i+~.#+~ 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 v ~ B+5+@+$.)+/+#.k+/+P.k+0+P.|+T r+T 7 2 F & )+/+k+F.[ [ [ /./.Y.K  .k 9.q.w+f q.9.K w+1.q.9.P q.P P q.f P w.f f f q X q q X G+0.G+V.V.V.u+V.V.8+D.u+0.D.n+_ _ b.9+2.a+E+!+L.[.E+E+W.q+W.{ `.).: P P q O f S.O._+<+:.P.G._.p ^.K.#+< v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 0 y.y+T r.C.C+/+P.F F u.F 0+0+l.7 &._.i T 0+P.)+<+:+7+7+O.[ F.k Y.m.k k k k Y.K q.q.f : q P P 9.q.9.q.f P f {+f f f q f : X ).G+0.V.u+u+u+].u+8+8+8+8+D.D.D._ _ b.T.a+= 2.!+T.E+E+T.b.{ V.{ : W.X : : q S.: O 7+9.z.:.)+0+7 [+t.K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< 0 #+!.&.l.7 0+P./+P.k+F <+F b 0+E 7 7 (+p |+C+C.d.)+/+k+~+/.F. ./.Y.m.k Y.1 k k /.Y.K q.w+{+E.q q Q q Q {+q {+g.{+V.{+w.g.S d+d+0.g.V.V.g.u+].0.].W D.8+d+u+# W...T.D :.= E+S.T.E+{ T...{ _ X x+e.X : : : q+O P 7+_+] $+b 0+l+I.t.K.~ ~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v y.*+&.7 $.C+<+b k+F F C.<+$.2 7 7 l h+h+7 a p+P.0+/+#.'.7+~+/.F.k m.k k k Y.1 Y.k Y.Y.9.1.f >+E.f f E.>+>+).{+q q q ).q q e.).g.V.G+o G+o o o 0.0.u+u+u+V.W.b.b.E+E+a+= E+s W.T.{ b._ x+n+: { W.X { : : `.S.: 7+S.] P.F l.7 9 t.~.#+< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v ~ {.y+l+0+G.$.k+P./+u.b F C.C.C+7 7 l h+h+7 L 0+-+b /+#.#.[ ~+k k 1 w+k 1 k k 1 Y.1 K K 9.Q K m.q.q.q.q.f q.).{+f f E.q q q q e.g.G+e.o G+o o o =+=+V.o o o # u+b.T.D S.a+E+a+W.T.T..._ W._ X X G+X : : X `.S.: 7+S./+& <+a _.H.t.++; < < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < v ++F+v.&.C+$.F B.<+:.F F /+C.C.E @+5+&.{.h+v+E C+0+C.F #.j '.[  .Y.Y.K k 1 1 1 K 1 Y.Y.K 9.E.P q.q.q.q.E.E.f Q w.f q q w.q q w.q g.G+e.e.o e.o o =+D.o u+# o W.0._ E+E+= = L.f+b.T.T._ _ x+n+W.x+V.X : X ).`.O : ] q+] b F C+n.h+t.~.j+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.#+N.y+T r+C+C+0+b f+F F B.C.$.a |+7.5+! U.i+2 G l.-+)+<+B.#.'.F.[ k m.m. .1 1 1 Y.1 1 1 K f K K q.q.E.q.q.f f Q q E.f q E.q q e.d+d+e.w.w.o S o g.=+V.S S o o X V._ f+E+:.a+E+!+W.E+b._ _ _ # # ..# # : X W.P O : 7+Z _+$++.l.I.h+J y.; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< v #+[+5+r+T l.P.b b <+<+b k+C+P.E 2 ,.l y+h+h+v+G r.0+0+)+:.#.#.'.[ k m.w+K Y.1 K K Y.1 Y.K >+f P K q.q.q.f E.E.d+q q q w.q w.q e.d+o e.o w.e.o G+=+].o o u+o e.W.W.b.a+2.= = Z.:.W.T.x+..n+# _ # W.W.G+x+: : : O : O 7+_+k+C.l.j.h+J ^.; #+0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ~.y+&.5+E a 0+C.<+P.<+b C.C+C.l.l.! T [+h+i+.+.+E C+d.| F k+<+#.'./.Y.m.K *.>+w+w+q.K Y.1 1.q.q.9.K q.q.f f E.d+E.q q q q w.q w.d+S e.S S o S S ].].u+S o e.X W.T.L.!+!+= s S.= W.T.W._ n+_ _ n+....V.X x+X X q+: q+S.f+C.G.l.(+i+J ^.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v ~ 1+v+T l.r.0+P.P.F b <+P.P.P.0+C+5+7 l+Y i+i+5.7 2 C+C+| )+B.F '.[ [ k K m.k 1 K K w+1.*.1.1.f P q.E.E.q E.E.q Q q q E.w.q w.w.w.d+o w.w.w.o o d+=+d+S u+o V.V.V.{ { a+= $+!+= S.b.T.T._ _ # _ D.# W.V.W.X ).G+: ).q+_+] b C.v+H.N.t.~.#+< 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.^.y+7 @+|+| 0+b P.<+P.F P.0+b a C+@+l.l+H.h+i+9 7 v+0+C+| )+F F k+O.[ F.m.K Y.K Y.K K 9.K K q 1.q E.Q q Q {+Q Q g.Q w.Q Q Q d+d+g.g.g.d+d+d+d+g.].,+=+d+d+u+e.V._ L.s a+= $+!+= = T.{ T._ _ } # n+# # 0.V.G+b.X q+X 7+S.= & ;.;.x.t.t.~.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 H.v+5+E | p+)+C.<+P.P.F <+d.C.a $.5+T 7 (+i+N.2+T .+|+0+| )+<+P.j :+[ [ m.Y.1 k K K K K q.q.>+w+w+q.q.q.E.E.1.Q Q Q Q w.Q d+Q d+g.].g.g.d+g.=+=+,+=+g.].u+d+W.).b.T.E+!+!+a+T.s E+V.W._ D.A.D.A.w n+# u+T.X W.: q+X ] f+= b $.I x.t.J s.; ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 t.y+_.,.0+l.P.P.<+F u.#.C.b d.C.C+-+T 5+_.9 i+N.i+7 |+l.$.| )+C.#.#.:+O.O.Y.Y.1 1 1 K Y.1 1 9.q >+q.q.q.q.E.E.q {+Q q Q w.Q Q Q w.g.d+G+S w.w.V.d+].d+o S o e.V.W.W.T.2.= = = 2.!+s b.W..._ D.} # D.# # u+W.X W.X `.W.S.O = $+E I x.t.y.s.~ ~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 Y U ,.2 l.P.)+b <+F P./+b b b d.d.C+@+@+_.9 i+N.h+7 v+, $.| a & k+& u.[ :.9.~+/.1 1 K 1 K K K >+q.q.q.E.E.q.E.q Q w.q w.q w.w.S S g.S o S o S w.=+=+u+=+u+e.o G+X E+E+!+p+h.b s = s T.W.....A.# N D.....D.X { W.W.O : S._+$+h.2 j.1+J y.s.~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 =.v =.v i+g+7 2 a d.C.P./+P.#.<+k+#.<+F C+C.a |+^ l+Y N.N.1+*+v+r.C+P.C+& <+& u.j :+9.~+/.1 k 1 K K K K >+q.K (.(.E.E.E.E.Q Q Q w.Q q Q w.g.d+w.w.w.w.S o y =+w.d+S o o V.`.`.E+Z.h.= <+Z E+O # T...# # # # A.# # # X x+X : E+: ] S.Z h.v+j.2+t.^.~.~ ~ v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< =.< < !.l+&.2 C+d.b P./+F k+k+P.P.P.<+)+-+E 7 @+7 Y N.t.2+*+2 r.a C.C+& F u.u.#.j :+9.Y.9.K 1 K K 1 K >+E.q.q.E.E.*.q Q Q w.E.w.q Q S *.g.d+S S S S S d+g.S S d+o e.e.u+: `.E+!+h.= $+Z E+!+W.x+x+# A.# # D.# x+u+W.X X { `.: S._+$+h.x (+i+J ++#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v ~ v t.U T T l.0+P.b <+<+<+<+:.#.k+P.C.)+0+C+7 v.l+Y N.N.2+&+T E a C.)+P.k+b P.j #.k+9.Y.Y.m.(.(.(.K (.1.E.q.q.(.E.E.E.Q Q w.q Q w.q Q S g.g.Q S S w.w.=+d+S S S o o o e.{ s s Z.p+G.Z Z E+s W...x+# # # # D.....V.x+X W.`.`.: S.a+$+C.x c.N.y.^.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < !.l+.+|+l.P.<+b :.P.F #./+<+/+<+P.b b $.l.7 l+Y N.J 1+&+5+2 L P.| )+/+<+u.j '.k+~+:+ .k 1 m.(.>+*.q >+E.E.E.E.q E.Q w.Q E.Q Q w.Q d+d+w.S w.w.o S ].d+S d+S e.o u+e.X `.= a+p+-+Z = E+s ..x+..# } ..# D.....# x+{ W.`.`.`.S.S.C.G.t (+N.y.++#+~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.0 < < Y i T v+$.0+C.#.b k+<+/+<+k+& /+<+b <+$.$.T 7 l+Y N.t.H.v+r.2 L C.| )+k+/+u.#.j [ 9.F.F. .k K 1 w+w+Q q *.Q Q *.w.q d+Q w.q w.w.w.Q d+S w.w.S w.o =+=+o S S S S o o X X `.!+a+h.G.] Z `.s x+..x+# D.....n+..x+G+x+{ W.s E+S.] = p+0+n.p t.^.~.~ ~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ~.U l+E r.C+C.k+b /+k+k+/+:+k+<+/+/+F F d.0+@+7 ! Y N.i+9 v+T 0+L C.)+)+b /+k+z.'.k+7+7+F./.1 K K K K >+>+E.*.q Q Q Q d+Q w.w.Q w.Q Q =+d+w.S d+o w.=+u+o S S o o u+e.X X { !+a++.-+a+Z s { [.# x+} # ....u+..x+# { { { !+: ] ] = p+0+&+p t.y.~.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 (+7 7 C+l.0+P.F k+:.:.:./+f+k+:.<+/+P.F C+0+@+! 7 Y N.h+.+7 7 0+L b )+)+& /+k+:+7+[ [ m.k  .k 1 K q.(.Q >+(.E.*.*.E.*.Q Q d+d+d+Q S Q =+=+g.d+d+S {+d+g.S =+S d+d+o G+e.e.X s +.G.2 $+<+!+E+{ # @ # # ....# x+x+W.{ { : S.E+Z = = h.-+*+p t.y.; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v N.&+r+7 E 0+$.)+<+<+k+P.:.P./+#.:.& <+P.F C+$.T 7 _.H.N.2+_.5+7 C+a <+)+)+& ] <+#.:.7+7+Y././.1 1 1 K K *.E.E.(.(.E.E.E.Q {+E.*.q Q g.=+g.g.=+g.g.g.=+].=+u+g.=+=+=+g.0.V.q X { +.+.G.a+b ] { s # @ # # ....# x+x+G+{ { T.= E+Z ] F +.;.}+h+y.++; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.0 =.0 < (+2 7 E C+<+)+/+& :+<+/+<+k+/+& :.<+F )+B.d.0+E 7 _.!.N.2+G 7.a p+C+C.d.u.u.:+<+#.'.F.k m.F.k k K 1 (.K Q (.(.E.(.E.E.q Q E.E.w.*.w.Q Q Q Q S S S w.=+d+=+w.g.g.g.=+G+e.X G+L.`.h.p+p+b = = { !+..x+..} ....# x+x+W.{ { { = E+= a+$+G.;.F+N.^.^.#+~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v 0 =.=.=.v v v =.=.=.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.0 v < v i+*+@+C+C+C.b P./+u.:.<+:.#.[ :+#./+j F P.b d.C.a _.g+{.h+(+.+r.l.0+0+F d.& u.:+k+'.#.[  .m.Y.Y.1 1 1 K q.*.>+q.(.*.E.*.Q Q E.*.q q q Q =+Q Q Q S {+d+g.w.S S d+=+=+w.e.e.W.G+q s = G.-+0+= = { s ..x+......x+# { { X { E+{ !+E+] = p+0+.+[+N.y.++~ ~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.v =.=.=.0 #+++J ++; < v =.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v s.h+7 |+l.-+b b <+<+/+/+#.f+j :.k+:+k+j F F & & C.a _.9 h+2+G T r.C+L | F P.& u.:+k+#.[ [ F.9.Y.9.q.q.1 K K *.>+(.q.E.(.E.E.Q E.E.*.E.Q Q d+Q w.S S Q =+g.e.o S o g.g.e.e.e.o e.: : !+p+-+0+= = E+!+x+T.x+} ....# x+{ W.E+: { s E+Z = G.2 .+Y N.y.++~ ~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ~ i+9 I.5.5.5.g+(+i+#+=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v ~.N.I.v+r.l.0+& b P./+j :+k+z.:+k+~+'.7+#.k+z.F d.& P.2 5.1+N.h+.+5+E C.a | /+k+k+#.:+'.'.[ [ F.9.Y.Y.K (.(.w+(.>+(.q.(.(.q.E.E.Q q *.q E.w.Q S Q Q Q d+w.=+w.o w.S S g.d+e.e.e.u+e.q X q+$+G.;.h.= !+!+[.x+x+# ..x+# x+W.# : T.E+S.s = h.G.G.G h+t.^.K.#+< v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.t.H.g+5.9 Y H.Y [+5.5.H.J 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v ^.F+I.y+_.v+, 0+P.F P./+:+z.'.f+j /+:.#.~+#.F <+F & 0+)+E *+{.N.h+&+r.L C.a | <+P.:+k+:.k+'.[ [ /.Y.m.k k K (.(.*.Q *.E.E.q.q.E.Q E.E.E.*.E.w.Q S w.S w.d+S ].w.o w.o =+=+S e.e.S o X q X q+b 0+G G.a+{ T.x+_ .._ # # u+..X b.E+s s = S.$+p+0+G I N.J ++; #+< v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.v =.=.t.[+U (+i+b+J y.++J i+(+B+F+N.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 v =.y.[+y+! r+l+7 v+l.C+0+F <+<+/+k+:.<+:+:+k+:.<+/+& b d.$.| l.[+U.i+Y G l.a P.)+& k+u.#.'.~+[ [ [ F./.Y.w+Y.1 1 1 K (.Q Q *.*.E.q.E.Q E.E.E.*.q Q Q w.Q w.Q d+g.g.e.w.w.S y d+e.e.e.d+w.X e.).`.<+2 v+d.h.!+{ [.# ..# # ..# x+x+W.`.s E+= !+$+p+2 i }+N.J ^.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.=.=.=.++F+5.!.t.^.y.t.^.t.y.~.t.!.U [+^.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 i+B+l+r+^ l T v+C+G.d.F d.<+$+z.<+k+B.<+/+k+b B.d.P.C+$.$.v+I.{.x.n.2 l.0+)+)+<+<+j u.#.~+:+:+[ F./. .>+1 K K 1 1 (.>+>+*.*.*.E.*.Q E.Q *.*.E.Q S q w.w.w.Q =+w.w.o w.d+].d+e.o o d+q e.e.G+`.] G.v+p+= a+!+!+..[.....x+# { { W.s s s S.= b h.l.|+9 N.J ++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.< !.I.Y t.++J y.y.y.y.J t.^.y.H.g+Y < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 t.I.&.l r+l ^ ^ 7 |+;.h.C.P.B.& /+F b :.P./+b P./+d.G .+G |+7 l I.Y &+E L p+| )+k+u.u.#.j :.:+ .~+/./. .>+k 1 K K (.K Q >+K q.>+1.Q Q *.Q q E.*.Q Q q Q S Q d+].w.e.o S =+S o o S g.e.e.e.S P O !+h._.G.+.= [.{ ..T.# x+x+..x+x+W.s s !+!+h.P.h.l._.Y t.y.~.#+~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.^.I.9 t.H J ^.y.H y.b+y.y.t.++t.(+I.J =.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 [+&.l ^ r+^ 7.T ^ 5+U $.+.t +.+.B.B.h./+/+B.h.C.+.;.;.G T ! r+v.! 7 @+0+a p+)+| /+<+u.#.k+7+/.O.Y.K k ~+1.1 1 K K K (.*.>+(.(.E.K Q Q Q Q Q Q Q d+q Q w.Q w.=+d+S w.e.S =+g.w.e.d+u+e.e.e.V.P f = 0+|+i -+= { !+x+......x+x+# { W.{ s S.!+<+$+2 |+.+h+t.y.s.~ < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.h+8 x.b+^.y.H J J J J H H b+H b+1+g+{.v =.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< i+&.l+7.v.,.l v.^ ,.v.7 2 $.$.;.p+$.F $.$.p+C.p+G.$.$.E |+7.l r+l _.l+T 0+$.d.| P.<+#.j #.[ 7+O.[  .k Y.m.1.k 1 1 (.K (.E.q.q.q.(.q.Q Q *.E.E.q Q d+Q Q S Q g.g.S w.e.e.w.g.d+e.o d+w.e.V.g.{+: E+= x p I p+= s !+T.....# x+x+# { X s s s !+h.= 2 |+&+h+t.y.K.#+< v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 9 5.N.H b+y.^.y.^.y.y.y.^.H J H i+g+(+< =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < F+l 7.^ l V l 7 &.v+! l G.v+2 ;.$.l.;.C+C+G 2 $.2 T l.@+,.@+r+r+l 7 5+7 L C.d.| <+F u.#.'.:+~+[ [ F./.k Y.>+1 1 1 K K *.>+q.(.q.(.E.Q E.*.E.E.E.q Q Q q Q Q d+g.g.=+g.].].].=+g.].,+g.g.V.G+: O O C.t 2+j.;.= !+s { # @ # x+x+..{ X s s !+= $+h.2 7 &+h+t.^.; ~ ~ 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.g+I.b+H J y.H b+H y.H b+y.y.J H b+F+g+< =.=.v =.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v x.l+l+l r+r+^ v.^ 7 _.i G v+v+v+n..+2 .+l.l.$.5+7 7 T _.! r+i v.! l+5+5+E L -+C.P.<+k+#.'.#.F.7+F.F.O.F.1 Y.m.>+(.(.1 K *.E.q.q.q.(.E.Q E.E.E.f E.q Q E.q w.Q Q d+{+S {+g.d+d+{+{+d+d+G+e.V.e.P `.S.B.c.1+I .+C.= [.{ ..{ # x+x+..{ x+s !+S.!+Z a+0+v+5.i+J ^.#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.I.I.J b+b+y.J y.++J y.b+y.H y.b+b+[+g+< =.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 ~ [+l+l+l ^ 7.r+v.^ _.l v.v+&+;.t t &+G G v+_..+7 7 i 7 7 7 &.l ^ r+v.7.l.L 0+0+& <+/+k+#.k+[ 7+:+[ /.F.F.k m.1 m.K *.(.(.>+*.q.(.E.(.E.Q E.E.E.E.q Q Q q q q w.Q d+q e.w.d+d+o e.d+g.o e.e.).: `.P = a+p h+Y x p+= { @ # x+....x+..{ X s !+a+= $++.l.2 B+h+J ++; < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.I.5.t.J y.H J J b+J H y.J b+H J J [+g+~ v =.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 {._.l 7.4 v.l _.r+r+! v.7 5._.i *+_.7 &+v+i v+.+v+l+.+&.l v.5+7.&.^ 7 T a , P.-+a b :.j [ #.:+~+F.O././././.m.1 k 1 (.>+*.*.E.q.q.(.E.(.Q q *.E.E.w.Q Q E.E.Q Q =+w.w.o e.g.d+S o o d+e.X e.{+P O q+/+2.2+h+x. +h.= [.!+......x+..# { W.{ `.[.!+h.= 2 2 5.i+y.++#+~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+b+J y.H b+J b+y.y.b+y.J H J J [+g+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 0 1+l ! 7.&.4 _.l+&._.T l 7 &+7 i }+v+l+5._.! ! l+v.l _.5+r+&.l l &.7.r+E r.| d.P.)+<+:+k+:.[ /. .O.[ k /.k 1 w+1 1 1 1 K >+>+>+q.K K E.E.Q E.*.E.E.q Q w.q q w.w.d+q e.e.e.d+o w.o o o q : q q P P q+a+p h+h+h+}+p+= [.[.x+....x+x+# T.W.{ s !+a+$+p+l.7 B+h+y.~.#+< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.I.I.y.J J y.y.y.b+H b+J ^.y.y.b+H [+5.< =.=.v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 J I.v.7.7.v.7.l+r+! _.5.7 5.&+.+U }+i 7 &+_.&.l+i 5+5+l+l 5+T v.r+5+l+T r., d.0+| P.<+u.#.[ 7+:+k F.F././././.>+k K 1 K 1 K w+Q *.E.K (.*.Q q.(.*.E.*.d+E.*.q q Q g.q w.w.e.g.w.e.w.{+S e.X e.: f : 9.:.2+i+N.U.I -++.!+9+.._ _ ....# x+W.s !+!+= p+h.2 7 &+U.y.++~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+H H y.y.y.b+b+b+H J H b+H [+g+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 i+! l+7.v.7.l+v.^ ! y+! 5.[+F+j.[+5.y+y+5.U 7 _._.&.v._.! &.! y+! ! 7 7 r.C+0+)+| & /+u.#.'.F.9.:+F.F.F.F.k (.1 1 k K 1 (.1 *.>+(.Q *.1.1.E.*.E.E.q f g.1.q w.w.Q w.q w.w.o d+e.e.o g.f q : V.Y.P L.f+p N.i+N.N.I 2 +.= { T.# @ _ x+W.{ x+s !+!+= $+= | |+U i+y.~.~ ~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.y.y.H b+y.y.y.y.y.b+y.J b+[+5.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v h+&.^ ^ &.7.l+4 l }._.! U B+5.B+F+[+j.I.g+8 B+y+B+U _.U y+_._.l l ! ! E 5+l.$.C+0+$.F C.b P.<+2.f+f+f+:.:+:.9.~+k Y.K 1 K K f >+(.K q.>+Q q >+L.f+B.n.;.p+t Z.L.V.w.w.w.w.V.V.w.e.e.V.q X E+T.Z.f+Z.a+p h+h+U.h+I i +.+.3.x+x+x+# T.W.!+X !+!+!+= p+F l.|+U U.^.++#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+H y.y.b+H b+b+y.y.y.H J y.[+g+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v ~ 1+l+^ ! _.l v.l &.i l+_.8 g+g+g+I.5.5.g+5.&+I.F+U B+B+F+B+5.5.5.5.&+5.n.*+&+&+&+}+&+n.&+n.;. +n.n.n.;.n.t t t ;.t ~+Y.1 K K 1.K (.K K *.Q L.2.n.}+9 Y '+A+I.B+n. +E+e.e.w.d+G+w.e.u+# E+2.a+x 5.}+[+F+}+I.g+'+[+8 G x +.3.@ 9+@ # x+W.{ W.s !+!+a+h.= C+|+.+U.y.~.#+< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+J y.y.H y.y.y.y.b+b+H J y.b+b+[+5.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 J B+! 7.v.4 l+_.l v.U _.U g+I.g+Y 9 I.F+(+(+j.F+!.5.I.[+Y I.[+Y [+Y (+Y Y !.9 5.}+H.[+}+g+I.9 (+g+5.g+}+9 H.!.H.j.g+;.B.O m.>+*.K K (.K (.1.2.n.I.x.t.j+H b+N.{.Y &++.T.W.d+=+q E.e.u+D h. +(+F+Y h+i+N.h+9 g+g+'+(+(+*+x I I @ @ 9+x+x+[.X !+{ !+= $+= C+|+y+h+^.~.~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+J y.y.H y.b+H y.b+y.H b+H b+b+[+g+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 y.! 4 ^ l+7.l l+_.U I.y+j.H.h+i+++y.t.t.++^.t.t.s.N.t.J ^.t.^.^.y.~.y.J J ++b+J t.++t.J N.t.H H t.t.t.t.N.J ^.++t.x.[+&+t s f (.(.K (.(.w+2.x F+H.t.y.j+j+j+++^.j+1+g+t [.V.u+X w.e.9+x *+x.J b+~.; b+K.; J J J N.N.J i+(+(+j.I 5.j.@ T.T.x+O `.!+a+$+= 0+$.y+h+y.~.~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+b+y.H y.y.y.y.y.y.J y.J b+[+5.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < t.y+7.7.l ^ v.v.l B+8 j.U.H ^.~.j+~.y.b+++++H ++j+^.++++++^.K.~.s.#+~.++~.; ++H ~.~.y.J J ~.; b+b+b+H ^.b+y.j+++j+j+t.H.I.n.P >+K (.(.K q++.I.h+y.~.~.~.y.^.H j+~ ~.x.n.I W.e.e.e.E+I I.!.b+j+j+s.s.y.#+#+^.y.J b+H ~ K.b+H i+x.%+j.8 I  +[.s s !+a+$+= 0+.+i U.^.~.#+< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+J y.H y.y.b+H b+J y.^.b+H b+y.[+5.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < ~ B+l+l l ^ l &.4 &.5.B+!.^.; ++~.; ; j+K.; ; ~.~.#+++~.~ K.++K.#+#+K.H J ~.~.++~.s.++y.J J ++~.b+H b+b+H H ++j+b+t.++; t.H..+a+1.9.(.(.P a+g+1+^.J J K.H J H H H * j+~.x.F+D V.V.W.Z.[+h+H ~ ++H ++~.J s.s.y.y.H b+++; ++#+~ b+++H h+'+g+I.I a+3.Z.a+= = 0+G.y+h+y.K.#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+y.H b+y.y.y.b+b+y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< ~ l+l l l+7.l }.l l+g+9 t.#+y.y.^.~.y.y.~.~.++++++#+~.++s.^.++++#+++++++H j+J J ~.#+K.^.b+^.j+++y.J y.y.y.J ^.K.b+~.J ++#+t.}+;._+q.(.K P *+6 J y.H H #+J y.^.b+b+#+J H U.5.}+V.V.b.n.9 * ; ; J y.++j+H #+; H b+b+^.H ; ++j+j+H j+~.~.b+J h+(+*+5.S.a+$+!+-+.+y+U.y.~.~ ~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+y.H y.b+y.y.b+b+H b+H b+b+[+5.< =.=.=.=.=.=.=.v =.=.=.=.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.< =.< ~ y+l ^ &.v.v.&.l 8 B+{.^.K.++J ~.j+y.H ++j+b+++++~.y.b+; H b+j+#+#+++b+~.~.b+b+j+~.++++++K.~.J y.J ^.++J b+~.++y.b+J ^.y.K.h+5.t w+K (.a+I.{.J y.y.b+K.++b+y.J ^.#+b+b+b+Y &+D G+ +}+{.H j+++^.b+++~.H j+; y.J y.b+++; j+++H ; ^.~.j+H j+j+H x.F+5.5.+.+.-+0+_.i+y.~.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.b+y.b+y.H H y.y.y.J y.J b+[+g+< =.=.=.=.=.=.=.=.v =.=.0 v =.=.< ++i+1+x.h+N.~ =.=.=.v =.=.v =.=.=.=.=.=.=.=.=.v =.=.=.=.0 #+_.l ^ l l ! l+! B+F+t.~.++J y.++~.b+H ++~.J y.j+^.b+J j+^.b+~.#+~.H ++~.H b+++j+b+b+^.~.; j+^.++J J y.J y.j+H b+b+y.y.J ++N.9 t K (.(.a+[+N.y.H y.y.~.++b+H b+~.++y.y.H !.*+D e.}+(+i+b+~.++J H ~.++H ; ; H b+H b+++; j+; ~.; ++++j+J H ++j+J N.{.&+x x -+.+i h+y.++#+~ 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H b+b+y.b+b+y.^.b+H b+b+[+5.< =.=.=.=.=.=.v =.=.v =.=.=.< t.Y 5.g+F+F+g+I.F+{.~.=.=.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 ~ y+l l l ^ l+&.l+I.9 ~.; ++b+++++~.^.H j+++b+H #+b+b+y.j+^.H j+#+++++j+~.J y.~.++y.b+J ++K.~.++~.^.H y.b+++j+H J b+^.y.y.H J H.*+9.(.q.+.'+t.H b+b+H j+++b+y.b+j+y.H y.++{.}+D e.*+x.J b+~.~.J H j+H ^.K.K.b+y.b+b+++; #+; ++; ++++; H H ++j+~.++++h+}+x x i i h+^.~.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.*+b+b+y.y.y.y.y.y.b+b+y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.v =.=.K.x.5.5.F+H.{.{.x.H.g+B+9 t.v =.=.=.=.=.=.=.=.=.=.=.v =.=.=.0 0 < t._.l l r+7.l+l _.I.[+~.; ~.~.~.++++^.^.K.b+b+y.; ^.b+++~.H y.~.++~.j+~.y.J ++K.y.H H b+++~.b+++~.~.++H y.~.++J H y.y.J y.% H (+*+f >+>+a+'+N.y.b+b+^.~.^.y.H y.K.H y.b+b+h+}+[.o I.H.% H j+~.^.++j+H ++; ~.b+H y.b+H ; #+#+++~.~.++; ^.^.; ~.H b+~.~.j+{.F+F+_.*+t.++#+< v v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+b+y.H H y.b+H y.y.b+H b+H b+b+[+5.< =.=.=.=.=.=.=.v =.v =.#+H.B+9 {.b+b+J H ++J t.H.5.[+N.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v #+F+! ^ l ^ ^ l+4 _.8 5.y.~.++j+~.; K.~.j+~ ~.K.j+#+K.j+#+#+~.j+#+K.^.#+j+b+H ~.~.b+J y.H ~.~.J y.y.~.~.++~.~.H J b+y.J y.y.J * [+*+P *.Q  +F+U.y.y.J ^.j+^.y.H b+j+++b+b+H h+I.[.V.j.[+i+H ~.^.y.b+K.b+~.; ~.J y.y.b+y.j+; ; ++~.~.++j+H H ; ~.++y.K.++b+j+U.[+B+*+N.#+~ #+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+y.y.b+y.y.y.b+y.y.J y.J b+[+g+< =.=.=.=.=.=.v v =.=.0 {.U Y t.H ++y.J b+H J y.t.x.5.9 ++=.=.=.=.=.=.=.=.=.=.=.0 v =.0 v < U &.^ l ^ l v.4 y+8 I.J j+H ^.H ; ++^.++~.^.++++~.^.y.j+^.H ~.; ++b+K.~.H ~.j+y.J b+H ^.j+^.b+y.y.y.y.++K.j+^.y.y.b+y.^.J ^.b+}+n.w+(.E.t I.i+y.b+b+^.~.H H y.J j+++J b+H {.I.D e.@ g+x.++s.^.^.H ; b+K.K.K.y.H b+b+H j+; ; H j+~.~.~.++^.~.++++++++; #+j+~.J (+5.H.J ~ ~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H b+b+H y.b+y.^.y.H b+b+[+5.< =.=.=.=.=.=.=.=.=.=.^.[+F+N.b+t.J H ++J b+H J ++t.H.5.x.0 =.=.=.=.=.=.=.=.=.=.=.=.=.0 < < 8 ! 4 l l l+r+r+l+B+I.U.~.y.J ^.~.b+b+~.++H ^.j+++b+y.j+^.H j+; y.++j+++++~.j+^.J y.^.++++J b+H H J J H K.~.++++b+H b+y.y.y.h+}+a+q (.*.Z.F+N.~.H ++~.~.y.y.^.b+; H b+b+% U.I.[.u+9+I (+N.s.~.H ~.j+b+; K.K.y.y.y.y.++; ; ; ++; ~.^.++~.~.~.^.j+~.; j+H j+~.~.^.1+g+Y t.< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+y.b+y.y.H y.b+b+b+y.y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.0 x.B+!.b+b+H b+J J b+b+b+J ^.y.t.I.I.#+=.=.=.=.=.=.=.=.=.v =.v v 0 < ~ U l ^ l l y+4 l y+l+8 (+t.H ^.j+++b+y.K.H J b+j+^.y.J K.^.++K.K.b+j+y.J y.K.j+~.y.b+H K.++J y.b+y.^.b+y.K.~.++j+^.* J t.y.t.9 ;.2.(.(.*.a+g+U.K.j+~.~.K.J b+H b+; H b+b+b+h+I.D u+n+t *+!.s.~.J H K.y.; j+; b+b+y.b+++; ~ #+K.; j+; j+; ; ; ~.#+~.j+~.++~.~.++~.~.1+g+H.~.< 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.y.y.y.y.y.y.b+b+H y.H b+b+[+5.< =.=.=.=.=.=.=.=.=.< I.I.t.J H b+H b+H b+y.H J b+b+J 1+I.N.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ~ U l 4 r+7._.! v.U y+y+F+H.t.y.#+t.H J K.y.y.y.~.y.b+++~.J H ; ++y.K.++b+j+++++j+~.^.j+++H b+J J b+H J H K.++b+^.K.~.t.^.y.H.A+f+(.(.(.E.a+5.U.b+H ++j+; ^.y.y.J ; H ^.y.H h+*+[.u+D.T.t 5.x.~.H H K.y.s.^.#+J y.y.J ^.#+#+#+++#+s.K.++; ++; H ; H j+~.~.b+; ~.#+; #+9 g+!.~ v < =.=.=.=.=.v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+y.b+H H b+b+H y.b+y.y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.#+5.9 ^.y.b+H b+b+b+y.H y.H J b+b+{.g+h+v =.=.=.=.=.=.=.=.=.=.=.=.0 0 ~ U l ^ l 7._.l ! y+l+y+B+g+!.i+s.~.^.^.#+b+J ++#+^.H ~.j+y.^.K.K.j+~.^.b+~.++++^.^.~.~.++y.H ^.b+y.J ++~.~.b+J b+H ++~.N.(+I. +~+(.(.*.>+ +5.h+J b+H ~.j+++~.++^.; H J t.J h+*+9+u+8+_ D 5.F+x.N.^.#+~.#+^.j+y.H y.J ^.; #+#+y.~.^.~.y.; ++j+b+j+~.j+H ~.++j+++#+K.~.i+[+I.x.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.y.H y.y.H y.b+y.H y.H b+b+[+5.< =.=.=.=.=.=.=.=.=.++5.H.^.y.b+y.y.y.H y.y.y.b+y.y.y.h+5.x.=.=.=.=.=.=.=.=.=.=.=.v =.0 0 ~ y+l 4 r+7.l+4 ! l+l l+g+U 5.[+{.i+y.y.^.N.N.t.J N.t.b+++^.++^.y.~.~.#+~.; ++H J b+++j+~.++H y.b+H t.++~.++H y.J J s.y.H.U /+m.w+(.(.E.E.Z.g+h+b+H b+++~.^.~.j+++K.~.++J H h+I.9+u+,+u+# 3.n.5.F+H.U.U.N.h+N.N.N.t.b+++#+; #+~.#+++~.y.; ++K.b+j+++j+y.j+~.~.++K.++#+++i+B+F+i+=.v =.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+y.y.y.b+b+y.b+b+y.J y.J b+[+g+< =.=.=.=.=.=.v =.=.++I.(+y.J y.y.H y.b+b+y.y.J ++b+b+h+g+x.v =.=.=.=.=.=.=.=.=.=.=.v 0 < ~ y+&.v.4 v.l 4 ! l+v.l+y+l+y+5.I.I.g+g+I.g+g+g+g+g+A+F+I.8 5.g+I.(+U.++~.~.H y.J H ^.++~.++^.b+b+J y.H ++++y.b+^.^.t.!.g+t P (.K (.(.(.>+a+5.i+J b+y.++++H ^.H ++K.~.++++~.U.*+9+u+8+# V.V.b.3.;.n.*+5.I.8 I.I.I.8 8 1+H ~.#+++; ~.~.y.K.++; b+j+H j+H ~.++j+++j+~.; #+y.x.5.9 t.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H y.y.H y.b+y.H y.H b+b+[+5.< =.=.=.=.=.=.v =.=.K.g+[+^.J H y.H y.y.H b+y.H b+t.H h+g+{.v =.=.=.=.=.=.=.=.=.=.=.v 0 < ~ y+l &.r+l+r+^ ! l+4 ! U ! ! y+U 5.B+g+5.B+5.g+B+B+U I.B+U 5.5.U 5.(+J K.++J H y.H j+++b+H ~.~.++b+y.++j+++t.y.++t.Y g+;.b.).m.K (.(.(.f Z.g+i+J H H j+++b+J J H j+++++++j+h+g+9+D.f.D.8+0.0.0.L.a+2.x +.n.}+9 [+}+I.5.F+9 2+N.++j+~.b+j+y.~.y.K.^.~.++j+^.j+~.~.s.#+K.y.J H.5.H.0 =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+y.b+y.y.y.b+b+y.y.b+y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.~ g+g+y.y.b+b+y.y.H y.H y.y.J H H x.8 U.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < ~ y+v.l l &.! r+_.! v.&.y+v.l+U l+&._.B+l+! l+_.! v.l+_.l 7.l &.! _.(+t.#+K.b+H y.J ; ^.J y.^.++~.++H ~.~.b+b+j+N.(+5.t ~+>+Q f (.K K (.>+ +g+h+y.y.J j+~.H y.J ^.j+b+J y.j+{.*+9+w f.8+0.V.{+G+: L.L.] B.2.D k.N.t.h+(+I..+*+[+x.t.++H #+++j+y.#+H ~.~.~.H ~.~.H #+s.K.^.J H 9 I.i+v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+y.H H y.y.H b+b+y.H y.H b+b+[+5.< =.=.=.=.=.=.=.=.=.0 H.g+h+y.y.b+H y.b+y.H y.b+b+++t.9 F+++=.=.=.=.=.=.=.=.=.=.=.v v 0 < ~ y+v.4 ^ &.l+&.y+l+l &.B+&.l+U ! ! ! 5.l+v.l+y+! v.! }.l ^ &._.U g+x.t.++j+^.H H y.j+++y.H y.b+++~.H ~.^.b+H t.H.B+/+_+K (.>+1.*.(.(.(.f Z.I.h+y.^.J K.++H H b+++j+++y.J ~.x.5.T.D.8+n+# V.g.X f q 1.7+Z _+ +i+^.++++1+}+.+&+&+I.(+x.N.; ++j+y.; H ~.~.j+H ++K.~.; ++; J ^.J i+5.F+~.=.=.v =.v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+y.y.y.b+b+y.y.b+y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.=.N.g+[+y.H y.y.y.y.y.b+H y.b+b+x.I.Y < =.=.=.=.=.=.=.=.=.=.=.=.=.0 < ~ y+l l 7.l+^ v.l+_.y+y+B+l v.B+! ! ! B+! l+l+y+&.l l+_.r+7.l+U }+H.++~.++#+K.^.y.~.~.b+b+y.b+y.H y.~.~.H ++t.Y B+F+Y.1 K *.(.K E.*.K (.w+ +g+i+J b+H j+++b+H H ++++y.J J ~.{.*+9+D.,+,+V.V.g.{+: X q ~+= f+/+h+^.++^.x.I 2 G &+5.g+8 Y y.^.~.H #+y.++++K.^.b+j+++~.#+~.s.y.y.J !.g+x.0 =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+y.H y.y.H b+b+y.H y.H b+b+[+5.< =.=.=.=.=.=.v =.v =.~ H.B+(+y.^.J b+++^.y.J J y.N.g+8 ++v =.=.v =.=.=.< #+i+N.t.N.t.U.N.N.B+&.l l ! v.&.}.! l U l+U g+8 g+B+B+y+! l+y+l+&.v.U U ! _.y+g+h+~.++++~.~.++; ++++++y.J J H y.b+y.* K.++b+n B+t Y.1 K 1 *.(.K K *.*.Q >+Z.g+h+y.J y.~.++y.J b+K.~.y.J y.H h+5.T.u+8+D.u+# 8+V.q X q ~+] 2.p+i+t.y.y.p t 2 +.G.a+3.I g+5.x.; H j+y.++j+H j+y.j+j+++K.~ K.H y.b+t.g+I.y.=.=.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+y.y.H y.y.b+y.y.y.b+y.J y.J b+F+5.< =.=.=.=.=.=.=.=.=.=.=.^.(+B+H.N.++++t.t.y.y.++x.g+I.i+=.=.=.v =.=.; h+[+5.F+8 I.8 5.g+g+F+8 F+I.g+[+8 I.I.B+g+I.8 y+_.U &.&.U B+y+U 5.U _.y+l+^ r+y+I.!.++++++++++++^.j+++; ~.^.J y.y.y.y.y.b+; J Y 5.a+:.Y.1 1 (.*.(.K (.(.*.*.1. +g+h+J y.b+K.++^.y.y.~.^.y.y.b+b+h+*+9+D.8+D.D.u+D.G+W.q q 9.] 9.:+2+t.++y.p I |+h.G.I [.c.9 g+I.x.t.#+J ++~.^.K.H j+++^.; ; ~.y.b+J J !.5.x.0 =.v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+H H y.b+H b+b+y.H y.H y.H [+5.< =.v v =.v v =.v =.=.=.=.J 9 g+F+H.i+N.t.N.{.(+g+5.h+< =.v =.=.v ^.[+F+g+(+1+!.1+1+!.1+H.Y U.N.h+x.h+1+6+(+[+[+H.F+g+g+B+y+! y+_.l v.l+&.l l y+7.y+I.1+++y.j+; j+j+++~.H ++K.j+++b+b+b+b+y.H ~.; H.&+B.7+k Y.1 K (.*.(.K q.K (.*.q 2.I.i+y.J H ~.++^.H H j+++b+b+b+b+h+5.T.u+8+D.u+u+D.V.G+q q P S.f+F D i+^.J p n.G.G.h.a+[.9+c.c.5.8 1+#+++++~.^.#+^.~.++++#+j+++^.H b+H t.g+F+++=.v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+b+y.y.y.y.y.y.y.y.b+y.J y.b+b+F+I.~ =.=.=.=.=.=.v =.=.v 0 =.=.K.1+F+g+g+I.g+B+g+5.Y t.v =.=.=.=.=.t.F+U (+t.^.^.b+J ++b+++H J ~.j+~.H ; ~.K.; H ^.~ N.i+{.F+B+_.y+! &.! _.v.^ l _.U I.{.^.~.++K.++~.; ~.#+^.~.; j+~.++^.H y.b+y.++{.&+t 9./.1 K 1 K (.(.K K (.(.K E.1. +I.N.~.^.^.K.H b+y.y.~.^.H J J H h+*+9+D.W D.u+u+].G+X X q : ~+~+B.2.h+J t.H.x h.G.I +.[.@ 9+N (+*+I.h+J ~.~.b+j+^.~.++++j+K.; ++^.J y.H !.U h+v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+H H y.b+H b+b+y.H y.y.b+H [+I.~ =.=.=.v v =.=.=.=.=.=.=.=.=.v K.i+H.(+(+Y 2+b+; =.=.v v =.v ++F+g+H.^.t.H y.b+b+b+J b+H H b+j+j+++j+^.~.K.~.s.K.++++++x.g+5.U ! v.&._.v.^ &.y+F+x.++s.++~.~.J ++j+++#+++#+K.j+~.++++^.H y.H ++I.I.t ~+(.1 1 1 K (.>+(.K (.(.(.*.q a+I.N.~.++~.K.H J b+y.j+++H b+J H {.*+T.u+w D.u+u+8+V.).e.q W.~+7+_+2.i+^.t.p G +.p+!++.@ D 9+} 9+6+5.F+H.++j+y.j+H ~.~.~.++; #+~.y.y.J H N.5.(+~ =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+y.y.y.b+y.y.y.y.b+y.J H b+b+[+g+~ =.=.0 =.=.=.v ~.h+1+x.1+x.N.~ =.=.< < 0 0 =.=.=.=.0 v =.=.< H.g+H.^.^.^.t.H H ++b+J H b+b+H ; #+j+K.b+^.~.++b+K.s.~.#+y.{.9 8 l+v.! y+! ! y+g+9 ++s.~.#+J ~.H j+++++++H j+H K.~.++++++^.H y.#+g+&+n.F 9.K 1 1 1 *.(.K (.(.(.(.*.Q  +g+i+++++~.j+^.b+J b+~.++y.y.b+b+h+g+9+D.8+D.D.u+D.V.X G+).f ~+7+_+2.2+t.N.c.i +.G.!++.T.c.9+} 9+} 3.I.&+t.++++j+^.~.++j+H ; #+++b+H y.y.^.(+5.t.=.v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+H H y.b+H b+b+y.H J y.J y.F+g+~ =.=.=.=.v ~.H.F+B+B+g+I.g+g+[+i+~ =.=.0 v =.0 =.=.=.=.=.=.~.5.(+y.J y.y.++J J b+J b+y.J J H ++; j+K.H ~.~.H b+~ y.y.K.j+; h+[+U y+5.B+&.&.B+g+N.~.~.#+~.~.~.++~.b+~.^.b+~.y.~.~.++~.~.++++++s.H.I.*+&+t P m.K Y.(.*.(.(.(.(.(.*.Q a+5.h+y.^.~.K.++++++^.K.++b+b+b+H {.*+T.D.w D.D.u+].V.G+X G+).Y.Y.f+B.D N.2+ +G.x G.3.+.9+6+9+N 9+..9+@ n.!.t.++j+b+~.~.K.++; j+j+y.H y.y.^.h+g+x.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+y.y.y.b+y.y.y.y.b+y.b+H b+b+[+g+< =.v =.=.N.I.g+[+x.i+h+h+h+H.g+5.Y ~.=.=.=.=.=.=.v =.=.=.=.x.g+x.++^.J ^.J J ^.t.++^.b+^.b+b+b+; ; #+~.; K.J ~.y.^.y.K.^.y.J Y B+&.v.&.l v.5.[+++#+~.K.s.#+^.~.~.J #+++^.K.b+j+++H ^.~.j+j+~.j+J b+!.F+*+/+m.m.K w+(.K K (.(.(.>+{+ +I.U.b+b+++; ~.j+++++~.++y.y.b+b+h+5.9+u+w D.u+u+8+V.{+X ).: P L.~+p+ +N.Y j.G.p+p+[.= 9+} 6+e e ..x+9+I 8 h+H K.b+~.~.K.; ~.++#+~.y.y.H y.N.I.(+~ =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+H H y.b+H b+b+y.y.J H b+b+[+g+< =.=.=.N.5.I.!.t.^.J H y.t.y.i+Y B+(+; =.=.=.=.=.=.v =.=.v 9 g+t.J ++J y.^.b+H b+b+y.H y.y.y.J ^.~.j+~.~.K.#+K.++H ~.~.y.H ++{.I.! y+l 4 _.g+i+K.~.y.^.#+K.; ; ^.++~.J ++j+b+j+++H ~.K.^.++++#+J H H U.'+5.F+9.).>+1 (.1 *.(.(.*.Q a+g+h+y.J ++~.y.H ++~.#+j+^.y.J H {.*+9+u+f.D.D.u+8+u+V.X G+).m.Y.9.F  +i+Y t i h.p+!+3.9+} 9+} 9+} ..T.W.x 9 t.~.j+y.~.~.; ^.#+j+++H H J y.y.(+g+++=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+y.y.y.b+y.y.y.y.b+H b+y.b+b+[+I.~ v =.y.[+g+H.t.^.H J H H y.H ++t.H.F+(+; =.v =.=.=.v v =.=.[+I.t.b+y.y.y.b+y.y.H y.y.y.H H y.b+b+++K.#+; ~.H K.K.K.#+#+~.~.j+U.5.}.5.l+l+8 I.t.j+++^.J ++; ~.#+~.++; b+~.j+y.j+~.y.++~.~.j+~.#+++++H y.h+(+U F m.*.(.K q.(.(.(.(.g.t g+h+y.J ~.j+b+H H H K.~.++++++~.{.}+D u+w D.u+u+D.V.{+G+0.G+P Y.9.<+f+i+c.x -+h.h.[.!+9+9+9+N 9+} ..T... +*+Y b+; #+s.^.#+H ; ; j+^.y.b+y.^.1+g+N.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H y.b+H b+b+y.y.y.y.b+y.[+I.~ =.v x.U !.J ++^.b+J ^.H b+H y.H J (+5.(+; =.=.=.=.=.=.=.v [+8 t.b+J H ^.J H y.y.H b+y.y.H y.y.J J H ~.K.K.~.H ~.++++++^.~.; h+F+_.l+l l+B+g+y.~.b+++J ^.#+~.j+~.++; ++K.j+++; ~.++K.~.K.#+j+j+j+K.y.~.~.i+(+5.a+>+(.(.>+(.(.(.*.Q Z.*+h+y.y.++~.J J y.H ~.~.^.~.++j+h+}+T.8+8+D.D.D.8+0.g.g.V.q `.Y.9.h. +2+D *+G.h.+.[.3...e 9+N 9+} x+{ _ 3.*+I.b+K.s.s.++; ++~.; ; y.J y.J y.h+g+x.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+y.y.b+y.y.y.y.b+H J H b+b+[+g+< =.K.[+g+N.^.J J b+^.^.b+y.b+J H H H (+8 (+~.=.=.0 =.=.=.v (+I.i+H J y.^.b+y.y.H b+y.b+y.b+y.H b+J J b+++~.; ~.#+j+++++b+++K.1+I.y+&.l _.g+g+N.H t.y.b+H j+; ++~.~.~.++#+~.++#+j+j+#+~.; j+^.++j+~.H b+^.b+i+g+n.:.K w+(.>+E.(.*.Q t 5.i+y.^.++~.H y.b+J ~.++b+y.b+++U.*+9+,+W w D.8+8+0.V.G+W.q f Y.O :+B.(+ +G G.h.h.[.3.} 9+e N 9+} ..x+..{ j.F+t.K.J ~.++~.++++; #+++J H y.y.t.g+Y 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H y.b+H b+J y.H J y.b+b+[+5.< =.N.5.H.y.J H y.^.H J J H y.++t.H b+J (+F+[+++v =.=.v =.v 2+I.x.^.H J J b+y.y.y.H y.b+y.b+y.b+H ^.y.J b+H ++~.#+; #+#+j+K.; 2+I.B+B+5.[+[+5.Y H H J b+y.^.; ++j+~.++H K.^.y.j+++++j+y.~.++b+K.~.~.~.++++++y.H.9 n.f+q.K *.q *.Q Q  +g+h+J H ++~.H y.b+y.~.++y.y.b+H h+*+D D.8+8+u+D.8+0.G+e.X {+1.9.Y.] F ;.&+|+p+= = [.3.9+} 9+N 9+} ..x+b...[.I.1+; J ++^.++~.++j+; ~.y.y.y.J J I.[+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+y.b+y.y.b+y.y.y.y.y.y.y.H J b+[+g+< =.x.g+h+++H y.^.H J b+H ^.b+J H t.H b+H !.8 [+J =.=.=.v =.~.8 [+t.++b+J y.H b+y.y.H H y.H b+y.y.y.y.b+b+y.H H H b+++; #+; ++Y 5.9 H.H.x.x.I.F+t.++b+J H y.; j+; K.H y.; b+b+~.^.H ~.H ~.++++; #+K.#+j+~.~.++y.U.I.a+P K (.w+(.Q Q t 5.i+J b+++K.^.H y.b+~.++H y.J b+{.I 9+u+8+D.u+u+u+0.G+G+e.w.f 9.9.S.C.F v+2 C.+.B.T.D } } e N ..A._ _ _ x+D 5.'+K.^.^.~.H K.++~.K.; ++b+y.y.J F+g+~ =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H y.b+H y.J y.y.J H b+y.[+g+< =.x.g+h+J y.t.b+y.J y.^.y.b+y.b+~.b+H b+t.H.U Y J 0 =.v =.v 1+8 1+t.H H y.^.H y.y.y.H y.y.y.b+b+b+b+y.y.y.y.^.^.b+J b+++t.1+g+(+h+i+h+N.N.9 g+1+N.^.y.H y.; #+; s.~.++; H ++j+~.++; ~.; ~.#+++#+#+; ++~.j+~.K.H (+&+f+q.q.(.*.*.Q  +g+N.J b+++~.y.H y.y.~.++b+b+b+b+1+*+9+D.8+8+u+u+u+D.d+G+q {+f Y.P S.b F $.2 p+h.h.T.9+} N } A.} A...x+b.X T.*+8 b+~.y.#+H K.^.j+j+; ~.y.J y.y.9 g+K.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+y.b+y.y.b+y.y.H y.b+H y.y.J b+[+5.0 0 1+g+{.y.^.H ^.H H H b+b+^.b+y.J y.J ^.H b+!.U [+^.=.=.=.v ; I.g+H.J y.J b+y.b+y.y.y.y.H b+H y.y.y.y.y.b+J J H y.b+b+b+h+8 F+x.N.i+N.t.t.U.F+8 1+b+y.y.t.K.#+~.; #+K.#+^.K.j+~.~.#+j+~ ++; ++; #+K.b+++++y.++~ {.*+t q+1 (.(.*.1. +I.N.^.H ++~.y.J b+b+K.~.y.y.H H !.*+..u+u+w D.u+V.0.V.e.f {+f Y.Y.~+P.C.h.2 G.p+h.T.T.} e e N } } _ ..# `.b.I '+t.#+J K.++~.^.K.~.; ~.y.y.^.^.Y g+^.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.g+g+J y.^.b+H ^.b+b+H y.J y.H y.t.[+B+< =.i+5.x.^.J H y.J y.^.b+J ^.y.H b+y.H y.y.y.b+H.B+[+H =.=.=.=.t.[+B+(+i+^.J ++H y.J y.y.^.y.y.y.y.y.y.J y.y.y.++J J J !.5.I.{.t.t.J t.y.^.++h+I.B+!.t.++y.++#+j+K.++^.++#+; ; ^.#+++K.^.~.++j+; #+#+H J ++j+y.s.~.!.&+a+w+(.w+Q w+ +F+N.j+y.++j+y.y.H b+~.++b+b+y.b+!.5._ D.D.w D.u+u+D.V.# q q : P 9.7+Z ;.;.0+C.$+= D 9+_ 9+} A.} _ ....# { x+}+5.N.s.b+; H b+; j+++#+j+^.^.J J Y g+J =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J H y.J J b+y.H y.y.b+b+J H b+[+g+~ =.^.5.(+J J y.++^.t.J y.H b+H y.y.y.y.y.H H ++t.!.I.[+++=.=.=.=.J (+I.I.[+H.Y H.!.x.x.2+x.x.{.{.i+i+N.N.i+i+i+N.i+x.[+B+[+x.J ++J ^.++~.++K.K.i+9 B+F+H.h+N.b+h+x.Y H.!.i+t.^.~.#+t.++j+j+j+#+j+j+; J b+y.y.++#+~.i+9 t 9.K (.Q *.t 8 U.++~.K.K.b+J J y.~.++b+b+H b+x.*+..D.D.w u+o u+].e.e.q e.q 9. .7+B.h.0+-+G.$+a+[.9+} e } N e } 9+W.# { T.t g+N.~.b+j+~.H j+++++#+K.j+++^.y.Y g+J =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.F+5.J b+y.H b+J y.^.H H J y.J b+H F+I.~ =.~ (+5.h+^.J b+^.b+b+y.H J y.y.H b+H y.y.b+H H b+(+5.[+y.=.v =.=.#+h+9 I.5.5.g+g+I.I.I.I.g+g+5.g+5.g+I.I.g+I.5.g+F+I.(+N.K.++K.j+#+s.#+~ ~ < ~ t.H.[+I.g+B+(+g+g+*+*+B+I.g+h+N.K.K.K.~.#+++#+; K.j+b+y.y.y.~.K.~.~.!.t f+m.q.Q (.a+g+h+H ^.~.K.++++b+J ++++H b+b+b+!.g+..D.D.w D.u+u+D.V.e.q G+f O  .7+B.p+l.C.b = E+!+9+} 9+} A.} n+....W.X { j.g+N.^.^.H K.^.~.++~.#+#+; s.~.++H.g+J =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v =.I.g+J J b+^.y.b+H b+b+y.b+H b+y.H [+g+~ =.=.N.g+[+t.H J J y.++^.J b+y.H y.y.y.b+y.y.J b+J ++!.8 [+y.=.v =.=.=.~ K.y.J t.N.U.h+{.{.{.h+{.!.H.(+(+(+(+Y 9 Y x.t.~ ~ ^.K.#+#+~ #+~ ~ 0 ~ v =.0 ++i+1+(+&+_.G .+t x n.;.g+F+h+~.#+++~.++j+; ~ K.b+b+^.b+b+H J ; i+&+B.P w+*.(.a+g+U.H J ~.j+j+~.^.H ~.~.b+b+b+J 1+5.# u+D.8+u+V.u+0.V.X f q f Y.~+~+B.p+a C.h.= E+[.b.N } } A.} N } ......{ }+g+t.++j+b+#+^.++~.~.~ #+#+~ s.~.Y B+J 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v I.g+b+y.J ^.H y.y.J y.y.y.y.H H b+F+g+< =.=.< x.5.(+J H b+t.b+y.b+H y.b+H y.y.b+H H ^.J H b+++(+I.[+y.=.=.< =.=.v =.=.=.=.=.=.=.=.=.=.=.v v 0 0 v 0 ~ =.v H x.9 I.g+I.[+1+J ~ v < < v < 0 =.< < < ~.}+G C.0+b C.B.p+G &+}+!.^.~.^.#+++K.~ ; y.J b+b+b+b+b+* ++I.t D 1.1.K t g+h+H b+K.^.H ++~.j+K.++b+J H H x.5...u+D.8+u+o o u+V.X : : G+P Y.7+B.p+0+-+Z = E+[.9+k.e } A.} n+......o T.I 8 t.++s.J j+++~.; ; #+j+j+#+s.j+H.5.y.0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v j.5.J ++J b+y.J H J b+H b+H y.y.t.F+[+< =.0 =.#+H.B+(+N.~.^.J y.y.H b+y.y.b+H H y.y.b+++t.H J b+!.8 F+t.=.=.=.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.#+1+I.I.I.5.g+g+I.B+g+H.~.v =.v =.=.=.0 0 ~ x.;.;.h.0+<+<+/+j a+n.n.*+{.++K.K.~.j+~ #+j+y.y.J % b+H b+~.9 &+ +1.f w+t g+h+H ^.j+H J H H ~.j+~.++H b+J 1+&+..u+u+8+# u+V.d+V.e.f : ).f Y.:+B.G b b a+= T.9+b.N e } N e N _ x+....@ *+[+t.^.j+J j+++~.; #+; j+++~.j+s.H.I.^.0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.H.5.i+^.b+y.H J y.y.y.y.y.y.H b+U.g+(+< =.0 =.=.K.!.5.H.N.++H y.y.y.H y.H y.y.y.y.b+J b+^.J H b+t.1+I.9 t.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.s.!.B+I.!.N.t.J J t.{.[+B+H.t.v =.=.=.0 < =.~ !.n.$.C.)+b P.] /+z.P.t n.I.N.~.~.j+K.#+; ; ++^.y.J y.y.J J 1+5. +b.L.m. +I.h+b+y.~.y.y.y.J H j+~.j+++++H 1+5...D.u+,+V.u+W.V.V.e.q : ).P 7+k+/+$.b b O = W.D e k.e e A.} } ....x+W.!+g+H.y.y.~.J j+j+K.#+#+j+~.++++~.~.H.g+^.< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.{.I.1+J y.b+^.J y.H H J H J ^.J {.g+{.=.=.=.v v =.; Y 8 9 N.y.b+H y.y.b+y.y.y.b+y.y.H y.b+++J b+~.J Y 5.[+J =.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.v < H.5.(+N.y.t.^.y.y.J J J H.y+[+; v =.v =.v < y.(+n..+;.0+F b Z $+] j a+&+5.x.J ~ K.j+#+K.; b+y.J J ~.y.^.t.N.I. +k.L.P t I.i+H ^.K.y.b+^.J ^.++~.H ~.j+j+{.}+..u+# ,+# o e.V.d+X V.f f S.F.z.F l.C.b _+S.b.E+} k.e e N ..N ..T...x+a+}+h+++^.s.^.K.; #+#+; ~.++^.++^.++9 B+J ~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.K.I.j.N.++t.y.H y.y.^.y.H b+++N.[+I.K.0 =.=.=.=.=.=.~ !.U [+N.^.b+^.^.J H ++H b+y.^.H y.b+y.b+b+b+b+J !.5.[+H v =.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.x.g+(+J ++b+b+J y.y.y.H y.J x.U H.=.=.=.=.0 ~ h+ +G l.$.P.<+b /+F k+& B.<+p+}+U.#+~.j+~.j+#+++y.y.J ^.J b+H N.I.[+h+2+p I I.N.y.^.; ^.J H J H ~.++J H J H !.*+_ D.u+u+n+# e.W.V.{+f P f 7+k+<+p+l.$+p+s !+W.D k.k.N 1+N e } ..@ { 6+I g+y.++H ++#+#+; #+; ++H H K.++^.t.[+y+i+#+~ < v =.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< x.5.(+t.~.J J J t.t.J y.J t.H.g+H.< v =.v v =.=.=.=.~ {.g+F+N.J J H H y.J t.b+H J b+H H y.H y.y.H ++t.H.g+[+H =.=.=.=.=.=.v =.=.=.=.=.=.=.=.v ; 9 I.i+y.b+y.b+y.y.H J J H H N.F+I.b+=.v v 0 ~.p &+.+$.$.C./+<+:.z.7+/+f+F ;.&+!.j+^.j+~.j+~ ~.H b+++H J J ^.t.I.t N.N.k.[+n.N.^.K.~.H b+^.H y.~.++t.y.J H 1+5...u+D.8+D.D.].V.0.X : `.: '.<+P.-+L C.$+O a+x+[.e N 9+e } @ e x+@ { @ x (+^.++; K.#+#+; ; ++++~.^.H K.#+i+I.l+l+#+~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.#+(+U !.t.t.^.^.J ^.y.J t.1+B+9 ; =.=.v v =.=.=.=.=.=.< 1+5.9 N.++J J H ^.J y.b+J b+y.H y.H H b+b+H H b+(+B+[+H =.=.=.=.=.=.=.=.=.v =.v =.=.v N.B+Y H y.t.^.J H y.J ^.y.y.y.t.!.g+!.v =.v ~ N. +n.l.$.| b B.k+2.:.:.:./+F /+&+[+++H j+++j+#+K.++b+^.b+y.J ++J 5.F+h+y.t.c.*+N.++++K.^.b+y.y.H j+++J H J b+!.5...V.u+0.V.G+V.q V.: f 9.: z.$+C.C.l.0+p+!+a+T.[.9+{.6+6+e @ 9+@ @ @ j.*+h+#+j+#+; #+~.j+~.H ^.j+++y.++; !.g+! ^ x.~ < 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.++(+B+[+2+J J J J J {.[+B+(+^.=.=.=.=.=.=.=.=.=.=.=.=.v x.5.F+N.^.H J H ++b+J ^.y.y.b+y.y.y.y.y.J H J ++H.B+F+y.v =.=.v =.=.=.=.v =.v =.=.0 x.g+h+H b+H ++J ^.J J H y.b+H ~.U.I.(+; ++N.h+(+n.n.0+C.0+P.<+b /+$+Z :.<+k+F &+I.++++K.~.~.#+#+~.y.J J H y.b+J F+}+2+^.y.(+I.i+++++K.~.y.y.b+y.~.~.b+H b+b+1+*+x+# X u+W.X W.: {+f O S.S.= F $.$.7 2 G.+.= 3.j.@ 6+ +@ c.@ @ @ I I *+Y ++~ ; ; ++K.H ^.j+^.b+^.++; s.^.Y g+v.&._.++; < 0 v v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.~.!.F+g+5.*+I.5.I.5.g+!.j+=.0 =.=.=.=.=.=.=.=.=.=.=.=.=.1+5.[+N.H y.J b+y.J ^.y.y.y.y.y.y.H b+H t.H H ++Y I.[+b+0 =.0 v =.0 =.=.=.=.=.v 0 H.I.N.t.b+y.H b+y.b+y.H J J b+++t.[+I.!.(+[+t n.;.0+$.d.<+<+j z.k+] ] f+P.k+F &+g+J H K.~.j+; #+; ++y.H b+y.J y.Y 5.h+s.K.Y g+N.j+j+H ~.j+j+^.b+++++J y.b+b+!.g+9+V.G+D.G+X e.: ).: O O S.B.p+$.7 |+G.G.+.x +.I @ (+9 j.c.j.j.@ 3.I j.N.K.; #+~.J ~.^.J ++~.++y.^.#+~.h+[+U v.l ! 1+; ~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< J 1+[+I.5.I.9 H.J 0 v =.=.=.=.=.=.v v =.=.=.=.< =.=.< {.U F+i+~.H J H H b+H y.H b+b+H y.H J ++t.b+J b+H.8 [+J =.=.=.=.v =.=.=.=.=.=.v H.g+U.b+H J J y.J H y.^.b+H J H ~.H.B+B+y+*+5.&+G C+p+d.F z.<+:.j ] :+_+j '.<+;.'+t.^.j+~.++j+#+#+; ~.~.b+y.b+++x.I.h+#+#+H.8 h+#+; ++~.++++~.++~.++y.b+J b+1+*+T.G+# 0.X { X : ).`.: S.$+C.G 7 ,.,.7 |+x x I I c.9 (+j.c.@ c.c.j.*+x.~.~.b+; ^.y.^.K.y.b+++j+~.H ~.s.{.g+y+l v.7.I.s.~ ~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v 0 < s.#+v =.=.=.v v =.=.=.=.=.v v =.v =.< =.=.=.=.< x.5.(+i+^.b+y.^.J H b+H H y.b+y.H J J H t.b+H t.H.5.Y ; =.=.=.=.v =.v =.=.=.v H.g+h+y.H J b+H J H b+y.J ~.#+#+#+x.g+_.l+v+|+$.2 0+P.P.F z.z.:.<+] z.S.<+O.F ;.[+b+b+~.~.~.~.j+#+#+K.K.++H b+b+Y I.i+< ~ !.I.h+j+++j+~.H H ~.j+K.++^.J b+H !.g+T.# W.V.W.X V.X q q+P S.C.C.G 7 ^ 5+,.v.i i 8 5.I }+j.j.(+j.j.j.5.*+t.; H b+H ~.y.y.#+++++++j+K.H J ++!.I.y+l+l+^ B+t.~ ~ < v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.< =.=.v =.0 =.=.=.=.v =.=.=.v =.=.=.=.v =.=.v =.=.v =.v =.=.=.{.B+F+N.^.J H H y.y.y.y.b+y.y.y.++J b+++J H ++b+Y 5.N.=.0 =.=.=.=.=.=.=.=.< !.g+N.J y.y.y.y.^.J ^.j+; #+#+; ~ i+*+v.l l+7 v+C+C.0+F P.z.Z S.] S.z.:.k+[ :+G F+J ++~.K.j+~.~.; #+++K.K.++y.t.[+A+b+< ~ H.I.h+s.++^.K.~.~.~.~.j+~.++H b+H x.5.x+V...V.# W.W.L.W.X ] :.B.;.l.7.V ! ,.T 7 ! i _._.5._.B+5.U 8 g+F+x.H j+H H H s.^.y.^.j+; ^.H j+++J t.B+B+l+y+7.&.v.!.~.< < < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v {.5.F+N.^.J y.H y.y.++^.b+b+H H y.b+b+y.b+y.b+i+g+Y < =.v =.=.=.=.=.=.=.=.1+5.U.t.H b+J b+y.~.; #+~ ; ; ~ ~.N.5.7 T _.T i |+G.b Z $+z.z.S.Z S.$+`.[ <+B.5.(+J ; j+j+~.~.++j+#+~.j+#+j+++J g+F+b+< < H.g+i+#+^.~.++#+y.J #+K.#+~.~.; ++(+5.9+u+# X _ : W.{ q+L.] a+h..+l+l l 7.4 y+v.y+y+! B+g+y+5.j.g+g+[+x.y.y.; ~.b+++++#+K.~.++; J t.^.K.y.H.g+B+U y+l v.^ Y ^.; < < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 {.g+F+N.^.J y.H H J J J y.b+b+H y.H H y.y.y.t.g+[+#+=.v =.=.v =.=.=.=.=.{.g+{.H y.y.b+++++#+#+; ; #+; j+~.J 9 5.l+5+.+C.C.b P.k+:+:+:+7+:+9.Z ~+z.B.;.}+x.~.#+~.~.++j+~.j+; b+H ~.j+~.b+g+[+; 0 < 1+g+h+~.K.~.^.++++++~.~.j+; s.; H Y 5.T._ G+T.V.{ W.: `.q+S.B.p+i 5+5+l r+l+l ! U l+_.y+g+B+g+j.U [+N.y.y.b+~.; ++j+++~.^.^.^.~.++H ++j+N.g+B+8 _.l+v.r+v.(+^.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 x.5.I.N.y.J J b+b+y.y.J J y.y.y.y.y.H y.y.t.I.I.y.=.=.v =.=.=.=.=.0 0 N.5.H.H J H ~.; K.~ #+; #+; j+j+K.~.x.9 _.7 E 0+& b <+<+:+:+~+:+] q+z.S.Z h.&+Y t.~.; ^.~.H j+~.~.~.#+++J ++#+H I.[+< v < !.I.h+++#+++~.b+++j+++++~.H j+; ~.!.I.9+# # X b.: W.W.E+`.a+b G.7 7.r+l ! U ! l+5._.i I.B+8 U F+(+x.~.++~.++~.; ++++^.j+H y.^.++++b+H ++x.g+5.g+l+l+_.7.&.5.N.K.#+< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 x.g+F+N.^.H J H ~.b+J ^.b+H y.y.H y.H y.J F+g+t.0 =.v =.=.=.=.=.v =.~.F+I.t.b+++K.#+; #+#+#+#+j+~.~.~.++~.1+&+U l.0+P.k+f+/+] :+S.] ] O O.q+F G 9 U.j+++j+^.; y.~.++j+~.~ j+++~.; N.g+H.0 < < 1+I.h+J K.~.~.b+~.~.J ~.~.J K.++H 1+I.9+0.V.W.0.T.G+{ S.] = G.G.7 7.v.r+_.&.U 8 j.8 F+(+F+I.%+x.J ++~ ++; ~.~.~.y.b+H j+++H H ++~.J ++b+9 g+B+B+l+&.y+^ v._.h+~.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v x.g+I.N.^.y.t.y.y.J ++y.y.y.y.b+y.H y.J g+I.^.v =.=.=.=.=.=.=.=.=.~ [+5.N.++; #+#+; ~ ; ; ~.++~.K.j+~.#+N.Y i ;.0+P.<+:./+_+:.P S.q+E+f+2.&+}+h+H ; b+~.H ; ++~.++K.j+~.H ++j+++1+g+x.< < < !.I.h+J ~.#+j+H ~.H b+j+H b+~.H H !.*+x+b.T.E+G+E+X E+O S.h.0+i 7 ^ ! r+U ! l+B+y+U j.g+5.5.U.J b+b+j+++t.b+H j+^.y.y.~.++J b+^.~.++J x.I.5.y+8 B+! _.l+l+_.x.~.; ~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.=.0 h+B+F+i+~.H b+b+H y.b+H H b+y.b+b+H N.5.[+~ =.=.v =.=.=.=.=.0 =.v !.I.U.#+#+#+#+; #+#+~.^.++~.~.~.; ; #+J 9 &+G C.p+P.'._+~+P ~+2.q+a+t 5.x.++++j+b+~.++~.j+H ~.; K.K.y.b+b+t.Y I.U.~ < 0 H.5.i+J ^.#+~.~.~.y.H K.b+b+~.J ++1+5.9+W.{ { b.s { `.= ] h.|+2 r+7.&.4 U _.l+8 F+g+g+I.F+H.++++b+b+++; J J y.j+++^.y.++++b+^.++K.; U.I.g+g+U B+I.! l+y+&.! (+J s.~ < < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v =.=.< h+5.9 i+H ^.J H y.b+b+y.H y.y.y.H H.g+1+0 =.=.=.=.=.=.=.v =.=.=.i+I.Y ; #+#+; #+; ; ; ++++~.++H ~.j+#+#+t.[+}+&+n.C.F f+a+a+a+B.B.&+9 H.t.K.y.K.H ++~.^.#+b+~.j+++#+++j+++U.8 8 i+j+~ < H.g+i+J ++#+~.K.j+^.~.++y.j+++b+++!.5..._ { { G+q+{ E+] = h.2 7 l 4 ! ! U y+g+I.I.8 I.U.t.t.++++^.^.t.K.++b+++j+b+H y.++j+j+; ~.#+t.Y 8 [+F+U y+B+}.! y+^ r+B+N.~.~ < < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v =.v v {.8 j.N.H b+y.H y.y.H y.H y.y.y.5.F+N.=.=.v =.v =.=.=.v =.0 < 1+5.8 ~.; #+j+; j+y.~.~.++~.; ; j+#+; #+~.K.x.F+}+}+&+&+&+n.*+g+I.I.h+b+* ~.y.#+b+++#+t.#+J ~.j+b+; y.++++N.5.y+1+^.#+~ !.g+h+y.y.; ^.; ~.~.K.b+H j+^.b+j+!.g+[.W.{ E+W.`.E+`.= z.+.$.i _.U 8 5.g+8 F+F+I.Y b+; y.y.y.#+y.y.b+#+b+b+H K.H ++++++#+j+H b+~.!.B+F+[+F+B+U B+5.y+U r+r+y+i+K.#+~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 {.B+F+i+y.J J ^.J J J J ^.t.(+B+!.0 =.0 =.=.=.=.0 =.0 =.< i+_.U B+{.++J y.~.; ~.~.~.~.~.~.j+#+~.j+; #+#+^.h+Y I.9 g+9 F+I.!.H.b+#+H ~.s.y.~.y.++~.++++~.K.~.~.~.J H i+F+B+v.g+t.#+~ H.I.h+^.y.^.#+K.^.++#+~.j+++^.++j+Y g+9+W.E+X !+[.3.+.B+g+g+j.9 I.j.I.9 6+H.{.b+H J b+~.H b+H ~.H y.b+++^.^.; K.; ~.~.++#+J y.J H.I.g+I.I.(+B+B+B+F+l+! _.l l+[+++K.~ < < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.~ h+g+g+h+y.y.J ^.y.^.^.i+Y 5.!.~.=.=.=.=.=.v 0 =.< =.v 0 Y l+&.B+I.b+~.~.#+^.++~.~.j+~.~.j+j+; ; j+j+j+; ++b+y.~.t.^.y.t.s.y.J #+J ++j+b+j+++J ~.; ~.~.++++; K.K.++H.I.y+v.F+t.#+#+H.I.h+y.b+++#+; ++H ; ++K.j+~.++~.6+5.D { s W.!++. +I.j.U.N.t.t.N.b+N.H ~.H j+~ ; j+K.~ K.~.~.#+K.j+j+#+j+~.++++~.H b+b+~.++y.{.I.I.[+[+I.9 I.I.g+I.l+&.}.^ &.F+++~.~ < v 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< i+I.B+(+2+N.t.N.h+!.g+5.(+++=.=.v =.v =.v =.0 v 0 < 9 U l v.y+B+!.^.y.#+j+++++++~.j+~.j+; ~.~.j+K.j+; ; ; ~.~.y.; ~.++~ b+b+; b+^.j+J ++j+H K.#+j+H b+y.~.~.^.^.g+B+y+7.g+i+~.~ H.I.h+y.y.H ~.; ~.++j+H ; ~.~.j+; H.j.9+W.W.T. +n.}+x.t.~.; ; j+H j+b+~.~.H ++j+y.b+H j+y.++++; ++^.~.#+++++J H K.H b+b+^.#+i+[+5.[+[+[+[+[+[+I.B+I._.! y+^ l 5.y.~.~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v t.Y I.g+B+I.F+I.B+I.h+< v =.v =.=.0 =.=.v =.v < (+l+l l+! r+5.g+N.s.++^.++~.~.~.++~.j+j+++j+j+j+++++++~.#+~.H K.b+t.K.J b+; y.++K.b+++; K.j+~.~.K.~.j+~.J J H.I._.r+7.y+h+y.#+H.g+h+y.y.H ++#+; ~.#+y.j+b+y.++++Y g+T.E+[.3.n.[+i+~.~.s.j+; #+++j+y.j+^.y.H j+++H ++K.y.b+b+K.H J H ~.H J J ^.#+J y.^.y.t.[+y+[+Y 9 (+9 9 Y g+y+g+y+&.l+l v.5.y.++; < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.< H {.H.[+F+H.t.~ =.=.=.0 v =.=.v =.v v 0 ~ (+l+l+l+l V V l+g+x.#+^.++++++++~.~.~.++++j+K.K.; K.K.j+K.#+#+~.; ++b+; ^.y.j+++~.#+++++~ K.~.y.y.++~.#+++y.1+5.8 l+^ 7.l+1+t.#+Y g+i+y.y.H ++#+#+j+K.y.j+H ++~.++(+5.@ s [.+.}+h+j+#+; ; b+++j+~.j+y.j+H y.^.j+y.J H j+y.H b+K.H J ^.~.++b+H ^.~.J ^.J i+(+g+F+(+Y !.Y 9 [+(+g+y+5.5.! &.y+_.g+J ++; < < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< v =.=.=.v =.v v =.v =.v 0 =.v v =.#+Y l+&.4 ^ ^ 7.^ l y+F+1+++++~.~.~.++~.++++++++~.~.K.; K.K.j+++++^.~.j+j+#+j+j+K.~.j+j+++++~.++~.J J J ^.; ~.J B+5.&.! &.4 ! H.t.~.(+I.N.y.y.H ~.j+~ ~.j+~.#+^.H ~.H (+5.3.s @ U {.#+; ; ~ y.b+++~ ~.K.H j+++b+H ~.y.J y.K.++J y.K.y.J H ^.++H y.J ~.j+++{.[+g+[+H.(+H.x.[+[+F+(+I.y+U B+! ! l+l+5.t.^.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v =.v =.=.v =.=.v =.=.=.=.=.=.=.v =.=.v =.0 i+&.&.^ . 7.r+l 4 7.l B+I.i+H ~.++++H ++++++~.~.~.++~.++^.~.~.b+~.^.^.K.~.++++; j+j+j+~.^.b+H b+~.H H ^.~.; J x.5._.l v.^ v._.Y t.++[+g+t.y.y.y.j+~.#+j+~.~.j+j+K.#+~.!.I.3.{ I  +i+++j+; ; y.b+++; ~.; ++j+++y.++K.H b+H ~.b+H H #+^.y.H H #+J b+J ++H h+'+5.(+H.!.H.Y H.[+F+I.[+[+U y+I.y+y+v.&.g+J ^.#+~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v =.=.=.=.=.0 =.=.=.=.v =.=.=.=.=.=.0 v =.< F+l 7.z V 4 4 V 7.^ v.l+5.g+N.++++++~.~.~.++y.++++j+~.~.++^.~.H j+++H j+++b+++K.^.++++++~.^.b+J ~.~.; ; ++N.Y 5.U l+v.l 7.7.l+Y J ~.I.g+t.y.y.b+~.~.~ j+++j+~.++~.~.++!.I.3.T.I.F+N.s.s.; #+H b+~.; ++; ++K.^.++^.j+y.y.^.K.y.J ^.K.H H J J ; J ++H b+x.I.U H.1+x.H.Y (+Y (+[+I.F+[+g+y+F+y+_.! l+I.J y.~.~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.=.=.=.< 0 I.l+V z V l l 7.7.&.! 7.^ l+F+9 i+j+y.++++++~.K.y.++~.b+; b+j+++H b+K.H H K.H ^.j+#+H b+^.~.j+J J ^.^.y.K.^.9 g+8 r+! v.^ 7.^ &.(+t.y.[+5.t.^.J ++#+++j+#+~.~.K.^.++~.H 1+5.B.Z I.9 j+; ~ #+~.H H ~.#+++; b+K.~.; ++K.++++~.K.H b+H ; y.J ++++~.^.++J x.g+I.H.!.!.x.H.(+(+Y Y [+I.F+(+y+5.5.I.&.l+&.U t.^.~.~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v =.0 v =.++l+7.7.l ^ 7.r+7.v.4 7.4 l+l+_.g+9 N.y.++++^.^.++++++H ++K.y.~.++y.^.j+y.^.#+++~.++~.++J J H ++++H J y.#+J 1+g+U r+4 l l+l ^ ^ 5.(+t.^.[+5.N.t.y.~.~ j+^.; j+K.#+~.s.; ++1+*+= Z *+n j+H K.#+H b+b+~.#+H K.y.j+++b+~.~ #+; ~.; ++~.H #+j+j+~.K.~ ; x.F+g+[+H.1+1+1+1+Y (+Y Y H.[+F+I.9 5.g+5.g+v.l+&.B+y.^.~.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.=.=.#+5.l+^ 7.7.z 7.&.l ^ 7.^ v.&.4 l y+5.5.H.~.++^.j+J ~.++y.++++H ~.~.b+++K.++++#+j+^.J b+; ++J y.H ~.y.s.++N.9 5.B+&.4 &._.7.l+7.l y+9 t.++Y I.N.J ++; #+#+b+K.++~.s.^.++#+~.!.I.3.= n.F+H * #+#+++J b+++s.^.~.H ~.++J H ~.J J ^.#+; K.K.~ ++y.H J t.Y g+5.(+{.h+x.1+!.1+H.(+(+Y Y 9 F+F+(+F+g+U &+&._.v.B+t.++~.#+< v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.< 0 t.U ! l 7.z V l v.7.7.l l+! ^ r+l+l+y+g+I.H.i+~.++y.~.^.H ; ++^.~.H ++K.; ~.++~.~.H ^.H ~.++++++J y.K.~.1+F+g+U ! _.l l+l 7.l l v.l+(+i+y.!.g+x.y.++#+; #+^.K.~.^.K.++H ; H 9 G 2.= n.U i+#+#+s.~.b+J H ; ~.K.y.~.++H ++~.J H ++~.y.y.J ++++H N.H.[+U 9 x.i+N.h+x.1+!.x.H.H.(+(+Y 9 9 F+9 9 U _.g+l+_.! 5.t.^.s.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 v v =.~ (+&.v.7.V ^ 4 l 4 r+v.&.v.4 v._.y+l l+U B+I.I.h+^.y.; ++b+~.^.~.#+#+++j+~.++b+H ~.H t.J ++~.b+b+++~.t.H.I.g+l+&.l l l+v.^ ^ 7.l v.l+{.t.^.i+g+(+++K.; ~.; ~.; ~.++; ++j+* N.I.;.a+= h.&+H.~.~ s.#+++b+b+~.; ; ^.++~.b+++; b+b+H ~.H H J H t.!.8 U [+x.i+N.h+i+h+x.x.!.x.!.Y 9 (+H.Y (+}+F+[+U y+I.&.l+_.(+t.y.K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 0 {.y+! l z 7.l 7.7.l l+l l ^ l _.}.v.! B+U _.U I.5.[+h+++++#+#+~.^.K.~.H H ++H t.y.~.~.++b+t.++j+b+t.x.I.[+B+! v.l r+}._.4 7.7.7.&.l+y+x.t.++^.[+g+t.~ K.j+~.~.j+++H K.H ~ t.Y n.a+F = p+;.F+h+#+~ #+b+H J j+#+; ~.++~.H ++~.^.H ++K.b+N.!.[+I.g+[+H.h+N.N.i+i+i+N.x.!.!.1+!.H.H.H.H.Y 9 I.F+9 U y+5.l+&.y+x.t.H K.#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v 1+l V l 7.^ l 7.^ v.! ^ ^ v.l+_.v.! U B+l+_.I.U U 5.g+F+H.N.J H b+~.++y.b+~.j+b+y.~.j+b+b+H t.x.(+[+U U y+l+_.v.l v.l+l ! 7.^ 7.! l+I.{.N.J y.!.F+x.++++; ++K.~.j+++++++H 1+I.;.a+p+Z p+h.B+%+h+j+K.J H b+j+#+~.j+~.j+y.b+j+++J N.i+H.I.8 8 [+(+{.N.t.t.N.i+i+N.i+x.1+!.1+1+H.H.H.H.Y F+F+[+9 B+_.y+U ! B+i+J y.s.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v K.Y ^ z l 4 l ^ 7.v.&.v.v.v.l+l+l ! U y+_.}.g+F+y+5.[+g+8 8 [+g+H.x.t.t.t.t.~.K.J t.t.t.h+!.H.[+g+I.8 U l+v.! y+l l _.l ^ v.4 7.l V &.Y {.1+Y 1+1+I.U !.t.~.++#+~.#+~.++y.{.g+B+;.f+Z = Z h.5.5.I.{.y.~.J ^.K.K.++; ~.~.t.h+h+!.F+8 F+B+I.[+H.U.U.N.N.N.t.i+i+i+h+i+x.2+x.x.x.!.Y (+Y Y [+I.}+}+g+y+_.&+_.5.h+t.++; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 N.! V z ! 7.V l v.l l 4 _.l+_.l &.U }._._.g+I.5.B+[+[+g+g+I.I.8 5.I.[+F+8 g+(+(+[+I.I.[+5.I.8 g+y+g+}.&.! v.&.v.y+! l ^ 7.r+4 l 4 4 ! U B+g+g+&+*+*+U }+[+x.N.H b+j+t.h+(+F+n.+.s Z.a+= B.d.C.0+G }+(+1+Y H.x.h+!.Y (+(+(+[+g+I.g+g+[+[+!.{.h+h+h+h+N.N.t.N.i+i+N.N.h+{.{.1+x.H.(+Y (+H.}+I.g+[+I._.y+B+l+F+i+t.^.#+#+0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< < t.v.7.4 l 7.4 l v.v.^ v.B+y+l+! l+U y+_.B+F+I.g+g+9 [+I.I.9 [+g+B+5.F+B+g+5.I.F+5.B+B+5.g+B+_._.l+y+_.l+&.v.l v.l+l ^ 7.7.7.l v.! &.&.&.&.y+y+U y+i 7 i 5.8 '+A+A+F+I.g+}+&+a+!+_+Z = $+$+P.-+C+v+|+B+I.g+g+F+I.B+F+B+g+B+g+I.[+9 (+!.x.Y 1+{.i+U.N.t.t.t.N.t.i+i+i+x.1+!.!.1+H.(+(+9 Y (+}+I.}+F+I.5.B+y+(+N.y.++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v 0 h+v.7.7.^ 4 v.l l l l l+! l+}.y+y+y+}._.g+F+5.g+[+Y 9 [+[+Y (+I.g+F+[+B+U y+U 8 5.8 B+U g+y+}.! &.y+y+&.l l+! l+l+v.^ 7.4 r+&.&.&.&.v.v.l+_.7 l+v+|+|+7 &+i x G I.x t ;.a+p+:.Z O k+Z $+h.$+C.2 |+7 g+Y 1+{.{.[+l+l+&.U l+U F+[+F+[+H.H.x.h+i+N.N.i+N.N.t.N.N.h+h+i+2+1+!.H.x.!.(+(+9 Y (+F+5.F+F+B+_.y+y+!.J ^.K.~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 ~.g+l 4 7.7.&.l l ^ 4 l+_.&.v.! U 5.&+U y+[+[+g+[+(+H.(+(+9 H.(+F+F+[+[+5.5.5.I.I.B+U _.l+g+y+_._.! l+y+l+&.l+&.4 ^ l 4 v.&.l+l+&.v.v.v.v.&.5+! ,.7 T l.E P.b C.p+B.h.= p+_+= S.$+S.Z ] b B.& C.C+2 2 &+}+h+J J H.! l l g+l+y+I.[+I.F+(+!.Y !.1+h+h+U.i+U.N.N.i+h+h+h+{.1+!.!.x.!.(+9 (+Y 9 }+F+9 }+_.l+y+y+x.t.y.~.#+< < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 ~.U l 7.V 7.&.^ ^ ^ v.y+l+&.&._.y+U B+5.[+[+[+F+(+(+(+9 (+H.!.Y (+(+(+(+I.[+F+F+I.U }._.l+B+y+l+l+! l l+y+l+v.4 7.7.v.v._.l+! v.v.&.&.v.l ^ 5+7 @+7 2 a |+u./+u.z.j z.Z ] = = s $+O = f+P.= P.Z d.0+|+v+G {.t.N.Y l+v.l }.y+y+I.F+g+[+(+!.H.H.1+h+i+h+i+i+N.N.i+h+i+h+{.1+!.Y !.!.Y 9 9 Y 9 9 9 [+g+_._.y+_.x.J y.K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ++y+l V 7.v.l l 4 v.l+&.&.l l+B+y+l+}.B+[+[+9 (+!.H.1+!.x.x.1+!.H.Y H.Y 9 I.5.5.5.U _.y+_.y+B+l+! l+&.l+}.l+4 ^ l &.l+v.l+&.&.&.v.&.r+^ r+V 7.r+T @+G.E P.-+F b _+Z = ] s = = s Z Z.= s C.= b F | 0+0+T x 9 i+J h+g+l+! v.5.y+g+[+I.I.9 Y H.H.!.h+h+h+h+U.t.N.h+h+h+h+2+1+!.H.H.!.H.(+Y H.Y 9 I.*+g+U ! _.y+x.J ^.K.~ 0 < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.< ^._.4 V 7.! l &.&.! l+l &.&.y+y+_._.U F+g+g+g+9 !.Y H.H.!.x.1+!.H.(+(+Y I.I.B+B+I.g+y+_.l+l+5.}._._.y+&.l l+^ v.! ! l+&.&.&.&.&.&.v.V z 7.7.7., 5+a $.0+-+C.<+$+= Z S.$+s ] ] S.Z S.Z _+j ] <+Z d.p+C.l.v+B+1+N.t.g+l &.v.g+_.B+[+[+F+9 H.H.H.!.h+i+h+h+h+i+N.h+{.h+{.h+1+1+H.H.1+1+H.Y (+H.}+U 5.I.U l+y+g+2+J ~.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < K.y+^ 7.&.^ 7.4 l+l+l l &.! g+l+l+_.y+9 B+g+I.9 !.(+(+Y H.x.H.Y (+(+Y H.F+I.g+5.F+g+y+y+y+_.B+_.B+y+! 4 r+! r+l+l+! &.! v.! v.v.&.v.V z V , 7.r.E 2 a p+)+Z <+S.k+O.q+Z q+] S.q+S.O z.S.k+= C./+b -+C+l.l.U 9 !.N.I.^ y+y+g+l+U [+I.g+[+H.H.H.H.x.h+x.{.i+i+N.i+h+x.{.{.1+1+Y H.1+!.Y 9 [+(+F+g+B+&+y+&.! F+{.y.++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < N.l+^ ! ^ ^ r+&._.l+l+! &.U l+l+l+y+I.B+8 I.I.(+Y (+(+Y H.x.H.!.Y Y (+H.[+F+g+5.[+8 y+y+U U U I.v.&.v.^ l _.l+! ! ! &.v.v.v.v.7.z z ^ 7.V z @+^ 2 l.d.B.d.$+<+] z.S.S.S.S.= `.Z E+] z.O k+S.<+f+P.p+C+v+@+i &.5.H.8 l+l l g+y+F+[+5.[+[+Y (+H.!.H.h+{.{.h+i+N.h+h+x.x.h+2+{.x.1+{.Y (+9 F+H.I.g+B+g+_._._.F+i+J ^.#+~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < < [+l ^ l ^ ^ 4 l+! ! l+l+U l+&.l+l+8 F+U 5.g+F+(+Y (+Y Y !.x.!.H.Y (+Y Y F+I.I.5.F+5.B+8 5.B+l+B+v.l l v._.l+! l r+4 r+4 &.r+v.7.V V 7.^ r+^ ^ 7 E a 0+| = C.Z Z k+S.7+q+S.S.: Z O ] ] S.Z f+F :+P.b d.0+E _.5+l U _.v.l l U y+B+9 [+[+(+1+Y H.H.!.h+{.{.h+i+N.i+h+h+h+h+x.1+!.H.1+Y (+9 9 Y F+I.y+g+B+_.v.Y t.^.s.#+< 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < ~ x.&.7.l 7.7.&._.l l l+l+g+l+_.l+_.5.g+U g+g+[+(+(+(+(+Y !.!.H.H.H.Y H.H.9 g+I.g+[+I.I.g+5.y+! B+l l v._.y+l+l V V V V V ^ V 7.^ r+^ 7.V 7.r+l r+5+2 C+C+F $+a+= z.O ] s S.= { ] O S.] q+S.f+:.z.k+P.0+l.l.7 ! l }._.^ v.&.l+y+y+F+(+[+9 !.!.1+1+x.h+h+h+i+i+i+i+h+h+h+{.1+H.H.Y p H.9 9 [+Y I.g+U I.B+_._.Y t.H K.#+~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < K.l+7.v.7.^ l+! &.v.&.U y+8 B+U B+5.U U 8 I.(+9 [+(+(+Y x.Y (+Y (+(+Y (+[+9 9 [+9 I.B+y+l+l+! U l _.}._.l+l 7.V z z V 7.^ V V z V V 7.r+l 7.^ ,.,.l.E 0+-+P.= Z _+E+S.q+= S.L.] q+q+_+q+] f+/+j B.& C.l.2 r+5+r+l &.^ l l v.U _.8 [+I.[+9 !.H.!.1+h+h+x.h+h+i+{.x.x.1+x.x.H.H.Y H.1+(+[+[+Y g+5.5.F+y+&.8 Y N.y.~.#+< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 < H U v.7.l l &.l l &.l+y+l+l+}.U 5.5.U 5.g+[+(+[+F+9 [+(+x.Y (+H.H.H.!.Y (+9 [+g+F+5.U y+_.l+v._.&.U l+l+l+! l l l 4 v.v.v.l v.l l v.l ^ 7.l l 5+! $.2 p+2 b h.P._+Z O E+E+{ L.s L.S.:._+j f+<+<+:.| p+l.$.T ^ V V v.&.! 4 v.B+l+U [+I.[+9 H.Y Y H.1+x.!.x.{.h+h+x.1+x.1+2+H.H.(+H.!.(+[+[+9 9 F+5.5.l+v.5.!.J ^.K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< < y.Y 4 V 4 l+4 4 l &.y+y+l+! l+U F+g+I.9 [+[+9 [+9 Y (+Y !.1+1+!.H.Y H.[+I.I.B+y+I.U y+l+y+l+v.U l+l+l+! l V V z V V ^ V z V V V V ^ l &.v.v.r+^ 7 |+2 h.E G.b P.s $+f+S.= E+S.S.E+= ] q+Z _+<+k+B.| C.r.2 7 ^ 7.V ^ &.v.r+v.y+l+y+9 g+I.9 H.Y Y !.x.{.1+x.x.{.h+x.1+1+1+h+p H.(+Y H.(+9 9 9 (+F+U g+_.&.B+1+J ^.#+~ < 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~ N.! ^ 7.l+l l l ! y+! l+l+_.U B+y+y+B+5.(+(+(+(+Y Y !.H.9 [+[+[+9 Y F+I.5.B+U F+U l+&.&.&.l+U _.l+l+4 V V V V 7.4 &.r+^ 4 r+4 r+l r+^ 7.^ 7.! ! 7 v+$.+.C.-+b $+b !+= = E+= = E+= Z f+<+:.C.b F d.-+E |+7 v.v.l 4 l l l+&.y+_.y+[+I.I.9 H.Y Y Y !.{.1+1+1+x.{.1+1+1+H.2+H.Y Y Y p (+(+9 (+(+5.U g+l+&.5.1+J y.K.~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 0 ~ J Y l 7._.}.! l l+l+! ! l+_.U y+y+y+y+8 [+[+I.F+F+9 Y 9 [+[+[+[+[+(+g+g+5.B+y+5.y+l+! ! }.y+_.l+l+&.V V 4 4 l &.^ 4 ^ ^ ^ 7.^ 4 v.^ r+r+^ l+T 7 7 2 |+G.+.-++.P.b = = $+E+Z = q+] Z S.<+a+$+b C.0+2 7 7 &.r+^ 4 4 v.l l+&._.U y+F+F+F+[+H.(+Y Y !.{.1+1+1+2+h+1+1+1+H.h+H.Y H.H.1+Y Y 9 F+9 U y+5.l+l+[+x.y.^.#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< < ~ #+{._.! l l l l+8 v.v.! ! y+5.y+l+y+U g+[+I.I.I.F+F+Y [+[+F+g+I.[+(+g+8 U U y+U }.v._.U y+l+y+! l+&.&.l 7.7.7.v.V V V 7.4 v.l ^ l ^ &.&.v.v.! ! ! v+7 .+G G. +x a+a+G.p+!+$+a+Z.= h.Z.P.h.p+2 -+x G T @+l+7.7.7.^ &.l 4 ! l+8 5.g+[+I.[+9 !.(+Y H.2+!.1+!.1+{.!.!.!.1+1+H.1+1+p 1+(+[+F+F+(+U y+l+U l+(+N.J ++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < < ~ J Y B+r+^ ^ l+U _._.v.! y+B+l+y+y+y+g+F+g+g+I.I.[+(+[+I.I.g+5.g+[+8 B+B+y+y+g+B+_.y+y+l+l+}.&.l+^ V V 7.z V v.^ &.! v.7.V r+7.l+l V ^ l ! v.! 7 ! .+v+i |+G.2 G.+.a+3.s p+= !+G.b = b +.h.2 $.G .+v+_.l+^ 7.V 7.l ^ &.l+l U U I.(+9 (+9 !.Y H.!.x.1+1+1+x.{.2+x.x.x.2+!.H.Y 9 Y 9 [+I.5.9 U _.y+U l+9 N.J ~.#+< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< ~ #+~.h+[+! v.v._.! ! y+y+y+B+y+! _._.y+g+g+5.5.5.g+I.9 I.g+g+g+5.g+9 g+I.F+g+B+U ! v.}.l+l+l ^ ^ ^ V V V 7.8.! &.^ 7.V ^ 4 r+l l l 4 &.4 l ^ v.l &.|+7 v+&.T |+.+G G.h.+.t h.x +.G.h.3.G +.+.v+.+|+l r+l _.&.l ^ 4 l 7.&.l+^ l+y+y+[+I.9 Y x.H.1+x.{.{.2+{.2+{.{.!.1+H.Y x.(+Y [+Y Y [+F+g+9 8 U 5.U y+Y N.y.~.#+~ < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 ~ #+++h+9 U l+U ! &.l+l+y+I.8 U g+B+U F+B+B+B+5.g+F+F+g+I.F+F+F+F+9 I.F+5.y+y+_.v.&._.&.4 V V ^ 7.^ 4 4 l 7.4 7.^ 4 ! l v.l 4 ^ l+r+7.! &.l l r+7 v._.5+T 7 |+7 v+.+G |+|+h.I h.i i G.G x &+v+7 ! ,.r+&.l+l &.l v.l V l y+l _._.l+B+F+F+9 Y (+Y Y H.1+H.!.H.!.x.H.H.H.Y 1+(+(+9 (+Y F+I.I.[+g+y+U _.y+Y t.y.~.~ < v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.0 0 < ~ #+H i+H.I.g+}.l+l+l+y+U U B+8 B+g+[+F+[+[+[+[+Y (+[+9 [+F+I.I.[+U y+U l+&.l+! l+v.V z z V v.4 4 l ^ 7.7.&.l v.l l 7.^ l l 7.v.! 4 ^ ^ ^ 4 ^ v.r+l+l 7 &.! 7 |+i |+.+_.i G x G i |+&+7 7 _.|+_.! l ! l ^ l 4 v.! 7.7.y+l+l+y+_.U [+g+[+Y Y Y Y H.x.H.Y H.H.2+H.H.Y (+x.(+(+9 9 Y I.I.F+9 B+l+y+l+5.x.t.^.s.~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< 0 0 #+s.K.^.t.x.9 U y+l+_.5._._._._._.g+[+5.5.g+g+I.[+[+F+g+5.B+U 5.[+U y+y+l+&.l+_.l+l V z 7.8.4 ^ 7.V V V 4 l+8.4 7.^ v.! l 4 ! r+7.&.4 4 4 ! v.v.l v.r+_.&.7 y+i _.T _.5.7 ! i U I I G _.T ! ! l+_._.8 l 7.^ ^ l ! 4 7.l+y+l+y+l+y+[+5.I.9 Y 9 (+Y 1+!.H.H.!.{.H.(+Y Y 1+(+9 [+9 Y [+[+F+[+y+l+y+B+9 i+J ^.K.~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 0 < ~ #+~.y.N.x.H.9 g+y+[+U U U y+y+B+I.U B+B+B+5.[+I.g+g+g+5.B+5.F+U y+y+y+v.&.l+v.7.z ^ ^ &.7.V 7.7.4 l+4 v.r+^ 4 ! l ^ 4 v.^ ^ l ^ ! 7.v.r+&.l r+_.l i y+y+! l _.U ! i U i 7 ! U 5.y+_.! v.v.&.! l+l+&.4 ^ 7.l l+! &.y+g+y+U y+y+g+F+F+[+H.9 Y Y !.1+H.H.H.!.!.(+(+(+!.9 9 9 [+Y [+F+5.F+l+l+U I.Y N.J ++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < < #+#+++~.J N.x.!.(+Y 8 B+U U 5.5.[+8 5.5.5.5.[+F+F+I.I.I.I.F+(+F+[+9 9 g+y+l+^ 7.v.V V 4 V 7.4 &.&.7.^ &.v.&.! 4 l v.! r+l &.r+r+l+_._._.7 ! _.y+_.i ! v.U l+_.U ! ! i 8 .+i &+i i B+U &.T &.l y+! l+&.4 ^ l &.l+l+g+5.y+y+8 B+I.[+F+}+Y 9 Y (+Y x.H.Y Y H.x.Y Y Y 1+Y Y H.Y Y I.U U [+y+_.B+[+H.t.y.~.#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < < < ~ s.++^.b+t.i+h+x.!.Y (+[+F+9 I.g+F+F+I.F+[+[+[+(+Y (+H.!.!.H.1+H.h+[+l+! 4 7.z z z &.l v.v.^ V 7.l l+! 7.^ 4 l+l+^ l+! r+! v.r+! r+l+y+l+l y+l l+l+v._._.v._.B+l+l+l+U 8 i ! l+_._.B+_.&._.y+l v._.! l v.&.l y+[+x.[+_.U _.F+F+F+9 (+H.Y 1+1+!.H.1+1+1+x.!.1+Y H.!.9 I.F+(+g+B+y+I.8 U 5.(+i+t.y.~.~ ~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ~ ~ #+~.^.J t.N.i+h+{.{.1+!.!.H.H.H.H.H.H.!.1+H.1+x.x.x.{.x.h+h+h+x.5.}.&.7.V V 7.7.}.4 7.^ ^ ^ &.! v.v.v.l+l+4 l l+v.l &.v.l _.l ! v.&.}.l y+v.l+y+v.l+U l+_._.8 l+_.U B+U y+! ! _.y+y+y+y+l+l l ^ v.&.y+l l+U Y x.!.5.U U y+g+F+9 9 Y Y H.H.1+!.!.!.1+x.Y Y 9 9 Y [+[+F+(+5.y+B+[+5.5.[+1+N.t.++K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < ~ ~ #+K.++^.y.J t.N.N.i+h+i+{.h+h+{.{.h+{.h+h+i+i+i+i+i+i+N.i+N.(+_.&.^ z V V 7.l ! V ^ ^ ^ ! v.4 7.l+}.l l l ! ! 4 ! l+l ! }.r+y+l v.y+v.U v.! U ! l+U U l+l+g+U 8 8 _.U 8 _.l+l+l+l+U y+! v.v.^ 4 ! y+l }.[+H.{.x.Y I.I.l+5.g+I.[+9 9 9 (+H.1+Y (+(+H.9 9 9 9 (+I.g+I.9 F+8 g+9 F+[+!.h+J t.++#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v < ~ ~ #+#+j+~.^.J J J N.t.N.i+N.i+N.N.i+i+i+N.i+N.N.t.N.t.N.t.h+I._.&.7.V 7.4 4 V &.4 7.v.}.l ^ ^ l y+_.l l l+l+^ v.y+&.v.y+v.&.y+v.l+y+! B+! ! B+}.l+_.8 _._.8 g+g+U _._.U 8 l+l+l+_.U y+! &.l l r+l+! y+_.9 !.i+h+h+H.I._.y+F+g+I.9 9 9 [+Y !.(+9 Y Y Y 9 I.[+(+I.I.F+(+9 [+I.(+H.1+h+N.t.++s.#+< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < < < ~ #+#+s.++++^.J J J t.t.t.N.t.t.t.N.t.t.J t.J J J t.H Y y+l+&.7.^ l l 7.7.v.l ! &.l 4 r+l+l+r+4 _.l+&.l &.y+l+&.l+_.v.y+_.&.y+l+! 8 l+l+g+i l+_.g+U U 5.I.5.y+_._._.i 8 l+_.U y+_.l+l+l l &.l+v.B+B+Y 1+i+h+i+h+(+[+g+F+5.I.[+9 9 [+(+H.(+[+9 (+(+9 F+[+Y [+[+[+(+9 F+[+H.{.i+N.t.J ++#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < 0 ~ ~ ~ #+s.~.++~.^.++^.J y.H y.J y.^.^.++++++++^.~.^.[+l+! &.4 7.7.7.V 7._.&.l ^ l l l+l+v.l &.8 y+l+l y+l+v.l+y+&.l+U ! l+B+! ! g+! _.B+U _.U g+g+8 U U 5.8 U y+_.l+I.y+y+U l+&.l+_.}.l y+! l y+[+Y {.i+N.i+t.!.(+I.F+g+[+[+9 9 F+[+Y 9 [+F+9 Y (+9 9 (+[+I.[+(+(+(+H.x.h+N.N.J ^.; #+~ 0 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 v < < < ~ ~ #+#+#+s.; K.~.~.K.~.~.~.~.~.#+~.#+K.#+K.h+I.l+&.&.l ^ 7.7.^ v.}.4 l ^ l }.! l ^ ! l+! v.y+y+l+v.l+y+_.&.U y+l+l+I.l+l+I._._.U g+B+8 g+j.g+y+_.B+I.U y+y+_.U 5.5.y+l+&.v.&.l+! y+&.&.l+9 H.h+N.t.t.J i+!.Y 9 F+9 F+9 Y (+Y Y Y (+9 9 Y 9 [+[+9 [+F+9 !.x.h+h+i+i+t.t.y.s.~ ~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v 0 v 0 < < < < ~ < ~ ~ ~ #+#+#+#+#+#+#+~ ~ ~ < #+~ #+Y y+l+l ^ 7.7.7.^ &.l _.r+4 &._.! l &.&._.l+l ! U g+y+! y+U &.&.U y+l+_.I.l+}.F+U y+B+9 F+g+y+I.8 U y+U g+8 y+y+y+}.[+F+l+l+! v.v.&.y+l+&.! y+9 x.i+t.N.b+t.y.t.i+x.Y (+5.I.9 [+F+9 9 [+[+F+9 F+F+g+[+(+(+x.h+h+i+i+i+t.J y.~.#+#+< 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v 0 0 < < < < < < < < < < < ~ 0 ~ ~ 0 < < ++Y l+! ^ 4 7.^ ^ v.l ^ l _.v._.l+&.&.l+y+l+&.&.! B+! _.U F+}.y+y+I.y+y+U I.y+U F+F+F+8 j.B+U B+B+F+y+U U U g+5._.U I._.U g+l+&.! l l+y+l+&.l+g+Y x.N.t.J ^.++++^.J t.h+1+H.Y 9 9 F+F+[+F+5.5.[+[+[+(+H.x.h+h+h+h+i+N.N.y.^.~.#+~ < < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v 0 0 0 < 0 0 0 < 0 0 0 0 0 0 v < ~ N.U }.^ 7.l ^ l ! l+r+4 r+l+l+l+! ! l+y+_.l+&.l+y+l+! ! U I.B+B+[+8 I.g+[+[+g+F+[+8 B+U F+5.U U 5.j.8 U U y+B+I.g+B+B+}._.U y+l+l l+_.}.y+l+_.I.H.h+N.t.y.^.K.K.~.^.y.J N.h+x.1+!.!.(+(+9 [+(+Y !.!.x.{.U.h+i+i+N.N.t.J ^.~.#+#+~ < v v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 v v v 0 v v v 0 v v =.v v v < i+_.l 7.V v.&.v.r+4 r+l v.y+y+l+l ! y+U l+! l+U 8 l+l+y+B+y+y+y+F+y+y+U I.B+U 5.F+U U B+[+I.U y+B+I.I.U B+B+y+I.F+B+y+y+l+y+B+l+v.y+! v.y+y+5.[+H.h+t.J ^.~.s.#+#+K.^.^.y.J N.i+i+i+{.x.x.1+x.x.{.h+i+i+i+i+N.N.t.J y.^.s.#+~ < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v v =.v =.v v 0 0 ~ x.l+7.V V l ! l ^ l l ! ! _.l+l+&._.U y+}.! y+5.y+_.}.5.5._._.y+I.U y+B+[+U U 5.[+B+B+B+I.[+5.B+U 5.(+U U 5.I.[+[+U _.U }.l+U y+}.B+&.l l+B+g+9 !.N.t.y.K.#+#+~ ~ #+#+K.^.y.J t.t.N.N.i+i+i+i+i+i+N.i+i+N.N.t.t.^.^.~.#+#+~ < < v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.v =.v 0 ++9 v.7.7.^ &.r+^ l l ! }.l+l+! y+U y+y+_.y+y+B+U }.U 5.5.U y+U [+5.B+y+I.[+B+5.8 [+5.B+B+5.[+g+5.B+U [+5.g+I.g+5.I.g+y+y+l+l+_.U U _.v.l ! B+F+(+{.N.J y.K.#+~ ~ < ~ ~ #+s.++~.^.y.t.J N.t.t.N.N.N.t.t.t.J J ^.++~.s.#+~ < < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v < t.g+v.7.^ v.v.&.^ l &.y+_.! l ! 8 g+B+_.l+y+F+g+_.y+U [+B+y+B+U [+B+y+g+[+F+B+g+5.(+g+8 5.5.9 5.B+8 B+5.9 [+I.B+y+5.F+U _._._.y+B+g+v.&.l+l+I.9 Y i+t.J ~.#+~ < 0 0 < < ~ #+#+s.s.K.~.y.^.y.J y.y.y.J ^.++^.~.K.s.#+#+~ < < 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 < t.I.y+7.l ^ 7.! v.l _.l+l+! &._.B+8 B+U U B+F+8 y+5.g+[+B+B+g+I.[+I.I.g+(+g+B+5.5.9 5.5.g+8 (+5.B+g+I.[+(+g+U 8 U B+5.g+y+y+U y+y+B+! v.l+y+F+Y x.i+t.y.s.#+~ < 0 0 0 0 0 0 ~ ~ #+s.s.#+K.K.~.~.~.++~.K.K.s.#+#+~ < < < 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 0 t.8 _.! 4 ^ ^ ! v.! l+! ! l+y+U y+_.y+I.I.F+5.B+5.g+(+I.I.g+g+Y I.g+g+5.Y I.I.g+I.(+g+g+I.5.(+g+F+[+[+F+[+g+B+B+y+B+I.8 y+y+U U &.y+y+l+y+y+B+(+{.N.J ++K.~ < 0 0 v v 0 0 0 0 < ~ ~ ~ ~ #+#+#+#+#+#+#+#+#+~ ~ ~ < < 0 v 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 < t.F+_.l V ^ 7.4 }.l &.&.l+! B+I.y+y+y+U 9 9 F+I.I.9 9 F+F+F+(+9 I.[+F+[+(+[+F+[+[+(+g+g+I.[+9 Y [+[+g+5.g+9 5.B+U y+U g+U I.y+_.l+&.g+_.U l+B+!.i+t.J K.#+~ < 0 v =.v v v v 0 v 0 < < < < < ~ < ~ ~ ~ < < < 0 < 0 0 0 v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< < t.[+U 4 ^ ^ 4 l+_.&.l l+! y+8 y+y+U U F+[+[+Y Y Y Y Y (+[+9 Y Y 9 9 9 Y H.9 F+F+F+Y [+(+(+[+9 (+F+g+8 g+I.[+B+U U U y+F+I.U }.l+! ! U y+U U 9 {.N.t.^.K.#+< 0 v =.=.=.=.=.v v 0 v v 0 0 0 0 0 0 0 0 0 0 < 0 0 v 0 v =.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.0 < t.[+U ^ ^ 7.l l+! l+&.&.y+B+y+y+y+U I.(+[+F+(+(+H.1+1+H.H.H.1+!.Y H.Y H.H.(+(+(+(+1+(+9 [+[+F+9 I.g+g+5.I.[+5.U U B+5.g+[+_._.}.l+l+y+y+B+[+1+i+t.J ++#+~ < 0 0 =.=.=.=.=.=.=.v v v v v v v v 0 0 v 0 v v v v =.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 ~ J [+l+l ^ l l+l l _.l+&.U y+_.U B+8 [+9 F+9 9 Y 1+!.!.x.x.{.{.{.x.x.x.{.x.x.1+!.Y H.(+[+'+I.F+(+I.I.5.5.g+[+g+B+5.g+I.U [+y+y+_._.y+U 8 g+H.i+N.J ^.s.~ ~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < J [+v.l+4 ! ! 4 l ! }.U y+l+l+y+B+9 [+F+[+Y Y 1+{.1+!.1+x.{.{.x.1+1+x.{.1+H.H.H.Y H.(+9 [+[+[+Y I.g+5.8 B+I.F+I.F+g+B+U g+y+_.y+B+y+U I.(+{.N.N.y.~.s.~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < b+[+v.l+v.! l l ! l y+B+U ! l+y+5.[+F+[+(+(+H.x.{.x.{.{.h+i+h+{.h+{.h+h+x.1+H.H.Y 1+(+9 [+[+F+H.I.g+g+B+8 [+(+F+5.U y+y+U B+y+U 8 _.y+(+1+i+N.t.^.K.#+~ 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < < y.9 ! l ! l ^ v.&.&.y+y+U y+_.B+F+g+[+F+9 (+1+2+x.x.{.{.h+i+i+h+h+{.i+i+{.{.1+1+!.x.(+(+[+[+I.(+g+g+g+g+I.[+9 8 U y+y+y+y+F+U B+B+y+5.!.h+N.t.y.~.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ^.Y _.4 l+4 l l l y+U l+! [+g+y+[+I.g+[+9 H.x.x.1+h+2+h+i+N.i+h+i+h+i+i+{.{.1+!.!.x.(+9 [+[+[+H.I.I.F+(+[+g+[+B+B+U y+y+_.9 B+U y+g+Y 1+t.N.J ~.s.~ < < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 < ~ U.U y+4 l+l 4 &.5.}._.y+}.8 9 '+5.I.F+[+H.!.!.!.{.x.h+N.h+h+i+i+i+i+h+h+{.2+x.x.H.Y (+[+[+F+[+(+[+9 5.B+U [+I.U y+y+B+U '+y+U g+H.{.N.N.J ^.#+#+< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < #+N.I.y+l v.v.l y+y+l+_.y+y+5.[+[+F+9 F+(+Y H.H.1+x.{.h+i+{.h+h+h+h+N.h+h+x.x.1+{.H.(+9 (+(+(+Y Y F+g+5.B+5.[+8 U B+B+g+5.F+U F+H.x.i+N.J y.~.#+~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < ~ J (+y+l ^ ! l+l+! }.y+y+5.I.I.I.'+9 (+H.H.Y Y Y 1+x.h+h+x.{.h+h+h+N.{.h+x.x.!.2+H.Y !.H.(+[+9 (+g+5.g+8 5.I.U y+g+g+g+B+[+F+H.{.i+N.t.J ++#+~ ~ 0 v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~ ++h+U 4 l l y+l+&.l+_.U I.'+8 5.I.F+[+Y H.!.1+1+!.1+{.{.x.2+x.x.{.h+2+{.x.x.x.h+1+!.(+9 [+I.[+9 I.g+5.B+U I.I.g+g+g+U g+(+H.x.i+N.N.y.++s.#+~ 0 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 ~ #+t.(+l+&.l l+l+l+! ! B+I.g+5.8 g+I.[+(+(+9 H.!.1+h+h+h+{.h+{.{.h+U.h+h+{.x.1+x.H.Y 9 [+[+I.9 (+I.5.U g+B+I.9 F+5.5.g+9 1+{.i+N.t.J ^.K.~ < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < < ~ ^.i+[+l l+&.l+l+y+l+5.I.B+5.g+I.[+9 (+[+9 (+Y H.x.!.H.!.!.1+1+h+x.!.!.!.H.H.1+(+9 9 [+[+g+[+[+5.5.g+F+g+I.9 g+5.[+Y !.h+i+N.t.y.^.s.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < < K.^.1+y+y+&.! ! U y+8 B+U B+g+8 '+9 9 [+[+9 9 Y !.H.Y H.H.H.H.1+H.H.Y Y Y (+!.(+9 [+I.[+g+[+(+I.F+[+F+F+F+F+I.9 H.x.h+h+N.t.J ++K.#+~ < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 < ~ #+j+N.Y y+&.l ! ! B+U U y+8 5.g+I.Y [+F+[+9 9 (+!.Y (+Y Y Y Y 1+Y Y (+(+(+Y H.(+9 [+F+F+g+F+[+F+[+g+5.g+[+9 [+1+{.i+i+N.t.y.^.s.#+~ < < v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~ #+~.i+[+l+v.! ! 8 I.F+U B+5.U F+(+F+F+[+[+[+H.Y 9 (+(+9 (+(+1+9 (+9 (+[+9 H.[+[+I.I.[+F+(+(+F+5.g+g+F+(+!.x.h+i+N.N.t.y.++; #+~ < 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ~ #+K.J {.9 U l+! B+U B+g+F+F+F+9 g+5.g+I.[+[+Y 9 9 9 9 9 9 (+H.9 9 [+[+[+[+Y 9 [+(+(+(+[+[+9 I.I.I.[+(+!.x.h+i+N.N.J y.^.K.#+~ < 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 < ~ #+~.J h+(+8 _.I.y+y+U B+I.(+(+9 [+F+I.F+[+Y 9 [+[+F+[+F+9 9 [+[+[+9 9 (+H.(+(+[+F+g+8 F+[+F+F+(+H.x.h+h+i+N.t.J ^.++s.#+< < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < ~ #+~.J h+(+F+B+U y+U y+B+[+F+F+[+(+(+(+Y (+[+[+F+F+9 [+H.(+(+Y (+(+(+(+Y [+F+[+F+g+I.[+9 (+Y x.{.h+i+N.N.t.y.^.K.#+~ < < 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ~ ~ #+j+++b+h+H.8 U U B+y+g+[+g+g+g+I.F+F+(+H.Y H.H.Y (+(+H.(+(+9 9 [+[+(+9 F+I.g+F+F+(+H.H.1+{.h+i+i+N.N.J y.^.s.#+#+~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 0 < #+K.~.t.h+1+(+F+I.g+I.[+I.g+I.I.I.F+9 9 9 [+9 9 [+[+Y [+[+[+9 [+F+9 [+F+I.[+[+9 Y x.{.h+h+i+N.t.t.y.^.K.K.#+~ < 0 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.0 < ~ #+#+~.y.N.{.1+H.(+(+[+[+[+[+[+9 (+Y 9 [+9 9 9 [+(+(+[+[+(+(+9 [+Y (+(+Y H.x.x.h+h+h+i+t.N.t.y.++~.s.#+~ ~ < < 0 v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < 0 < #+~.~.y.J N.{.x.x.!.Y H.(+[+9 (+H.(+(+Y (+(+(+!.(+(+9 9 (+(+9 Y H.!.x.x.h+h+i+N.N.t.t.J ^.K.++K.#+~ ~ 0 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 0 < ~ ~ #+++++J t.N.i+h+h+{.{.x.1+1+H.H.Y H.!.H.!.1+H.H.!.1+x.x.x.x.{.h+h+i+i+N.N.t.J y.^.++~.#+#+~ < < < 0 v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 < ~ ~ #+~.^.b+J t.N.N.i+i+i+i+h+i+h+h+h+h+h+h+i+h+{.h+h+h+h+h+h+i+i+N.N.N.t.t.y.^.++K.#+#+~ ~ < < 0 v v v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~ ~ ~ s.~.^.^.y.y.N.N.N.N.i+N.i+i+i+i+i+h+i+U.h+U.i+i+N.N.i+N.t.t.t.J ^.^.~.K.#+#+~ ~ < < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 < ~ ~ #+#+K.++^.^.y.t.t.t.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.t.J J y.++++~.#+#+#+~ ~ < 0 0 v v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< =.0 =.=.=.=.=.0 =.v =.=.0 =.< =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ~ ~ #+#+K.~.~.++^.y.b+J t.J t.t.t.t.N.t.J t.b+b+y.H y.^.++~.s.#+#+~ ~ ~ 0 0 < 0 0 v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< x.=.=.=.0 =.=.=.=.=.=.< 1+=.=.=.=.v < =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 0 < < ~ ~ ~ s.#+j+~.++~.++^.^.H ++^.^.++++++++++~.~.K.#+#+#+~ ~ ~ < 0 0 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v H.. ~.v v =.v 0 0 v 0 v 1+. ++v =.J B+v =.v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 0 < < < < ~ ~ ~ #+#+#+; ~.~.K.K.~.K.#+~.#+#+#+~ #+~ ~ ~ < < < 0 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.h+&.K.v v =.=.=.=.=.=.v {.l ; =.0 V ! v =.0 =.=.=.=.=.=.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v 0 v 0 < < < < ~ ~ ~ ~ ~ ~ ~ ~ ~ #+~ ~ ~ ~ ~ ~ ~ < < 0 0 < 0 v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v =.=.=.~ =.v =.v 0 =.v =.v v =.< =.v _.. ^ K.++0 v < =.=.=.=.v =.=.v =.=.=.=.=.=.=.=.v v =.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.v 0 0 v v 0 < < < < < < < < < < < 0 0 0 0 0 0 0 v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v =.=.v =.v F+< < =.=.[+^.v Y ^ 7.t.Y v #+U . . z . ^ ; N.~ g+&.(+1+h+=.i+&.z z l =.N.N.~.< h+&.(+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v 0 v 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 v v v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v =.=.v =.. (+=.0 =.l+&.r+z . . l+l+=.=.0 z ^ N.t.#+V [+J z . r+z z g+. . . V y+H.z V z H.Y z . B+=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v =.v v v v v v v v v v v =.=.v v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 K.l !.=.y.. U v 0 =.7.. z V h+; z 7.=.#+H.. 7.~ s._.z y+=.t.~ (+l z z . H.< l+x.V . H.. z y+U 1+x.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.[+. V 7.. &.K.=.=.. . l ++=.< . . ^ z z . . . . . V . v.&.^ . ! . V t.=.=.i+. ^ =.t.z . y+H.B+r+I.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 v =.Y . . z (+z ~ =.z 7.~ =.=.=.l z . . t.V . . V 5.^ . . V . z V . N.v 0 =.V V (+=.=._.. z . z _.~ =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 v =.0 =.v Y ! (+1+. ^.=.F+(+=.=.0 =.~.B+_.h+=.y.l+. F+v =.Y _.v.[+; 1+l+< =.=.0 l . . . l =.H._.y+(+v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< =.=.=.=.0 =.~.=.=.< =.0 =.=.< =.=.=.v =.=.< =.=.=.=.< =.=.v v =.0 =.=.v =.v 0 ++i+1+=.=.=.0 v =.< =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< =.=.=.=.v =.0 v =.=.=.0 =.0 v =.=.=.=.=.=.=.v =.v =.=.v =.=.=.v =.=.=.=.=.=.v =.v =.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/automagic-off.xpm",
    "content": "/* XPM */\nstatic char * automagic_xpm[] = {\n\"16 15 3 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"+\tc #FFFFFF\",\n\"                \",\n\"  .             \",\n\" .+.            \",\n\".+++.           \",\n\" .+++.          \",\n\"  .+...         \",\n\"   .....        \",\n\"    .....       \",\n\"     .....      \",\n\"      .....     \",\n\"       .....    \",\n\"        .....   \",\n\"         .....  \",\n\"          ...   \",\n\"           .    \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/automagic-on.xpm",
    "content": "/* XPM */\nstatic char * automagic_on_xpm[] = {\n\"16 15 3 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"+\tc #FFFFFF\",\n\"      .         \",\n\"  .  .+.  .     \",\n\" .+.  .  .+.    \",\n\".+++.     .     \",\n\" .+++.          \",\n\"  .+...         \",\n\"   .....        \",\n\"    .....       \",\n\"     .....      \",\n\"      .....     \",\n\"       .....    \",\n\"        .....   \",\n\"         .....  \",\n\"          ...   \",\n\"           .    \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/fast_forward.xpm",
    "content": "/* XPM */\nstatic char * fastforward_xpm[] = {\n\"32 20 2 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"       .       .       ..       \",\n\"       ...     ...     ..       \",\n\"       .....   .....   ..       \",\n\"       ....... ....... ..       \",\n\"       ..................       \",\n\"       ....... ....... ..       \",\n\"       .....   .....   ..       \",\n\"       ...     ...     ..       \",\n\"       .       .       ..       \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/mat_edit_shader_icon.xpm",
    "content": "/* XPM */\nstatic char * mat_edit_shader_icon_xpm[] = {\n\"24 24 353 2\",\n\"  \tc None\",\n\". \tc #000000\",\n\"+ \tc #2C2C2C\",\n\"@ \tc #3F3F3F\",\n\"# \tc #010101\",\n\"$ \tc #202020\",\n\"% \tc #5F5E5E\",\n\"& \tc #858585\",\n\"* \tc #AFAFAF\",\n\"= \tc #E0E0E0\",\n\"- \tc #FDFDFD\",\n\"; \tc #E1E1E1\",\n\"> \tc #050505\",\n\", \tc #232323\",\n\"' \tc #5D5D5D\",\n\") \tc #7E7E7E\",\n\"! \tc #A9A9A9\",\n\"~ \tc #DEDEDE\",\n\"{ \tc #FEFDFD\",\n\"] \tc #FCFCFB\",\n\"^ \tc #FCFBFB\",\n\"/ \tc #FBFAFA\",\n\"( \tc #555555\",\n\"_ \tc #242423\",\n\": \tc #7E7E7D\",\n\"< \tc #A6A5A4\",\n\"[ \tc #D8D7D7\",\n\"} \tc #FAF9FA\",\n\"| \tc #FEFEFE\",\n\"1 \tc #FEFEFD\",\n\"2 \tc #FDFDFC\",\n\"3 \tc #FCFCFA\",\n\"4 \tc #8C8C8B\",\n\"5 \tc #4D4D4C\",\n\"6 \tc #FDFDFA\",\n\"7 \tc #FEFEFC\",\n\"8 \tc #FFFFFF\",\n\"9 \tc #E4E4E4\",\n\"0 \tc #ACACAC\",\n\"a \tc #767676\",\n\"b \tc #58595C\",\n\"c \tc #ABABAA\",\n\"d \tc #CECDCD\",\n\"e \tc #1D1D1D\",\n\"f \tc #FAFAF8\",\n\"g \tc #F4F4F4\",\n\"h \tc #C2C2C2\",\n\"i \tc #8C8B8B\",\n\"j \tc #6B6567\",\n\"k \tc #44383D\",\n\"l \tc #3D343E\",\n\"m \tc #777893\",\n\"n \tc #A5ADD6\",\n\"o \tc #A9B1DE\",\n\"p \tc #7F7D80\",\n\"q \tc #F9F9F9\",\n\"r \tc #2F2F2F\",\n\"s \tc #020202\",\n\"t \tc #DADAD8\",\n\"u \tc #E7E7E7\",\n\"v \tc #6D6D6D\",\n\"w \tc #5C5556\",\n\"x \tc #685256\",\n\"y \tc #5B464A\",\n\"z \tc #64414B\",\n\"A \tc #824F5B\",\n\"B \tc #8E525B\",\n\"C \tc #92565F\",\n\"D \tc #84515C\",\n\"E \tc #856376\",\n\"F \tc #B5B9E7\",\n\"G \tc #70707C\",\n\"H \tc #717170\",\n\"I \tc #171717\",\n\"J \tc #9F9F9F\",\n\"K \tc #060606\",\n\"L \tc #AEAEAD\",\n\"M \tc #F0F0F0\",\n\"N \tc #785E63\",\n\"O \tc #E0A9B0\",\n\"P \tc #A98087\",\n\"Q \tc #734B57\",\n\"R \tc #874950\",\n\"S \tc #965358\",\n\"T \tc #A6686B\",\n\"U \tc #B57E80\",\n\"V \tc #AF7477\",\n\"W \tc #955155\",\n\"X \tc #8B5E62\",\n\"Y \tc #646272\",\n\"Z \tc #A7A7A5\",\n\"` \tc #575757\",\n\" .\tc #878787\",\n\"..\tc #151515\",\n\"+.\tc #0E0E20\",\n\"@.\tc #8F90BF\",\n\"#.\tc #7B696D\",\n\"$.\tc #DAA4AC\",\n\"%.\tc #60363D\",\n\"&.\tc #7F454A\",\n\"*.\tc #8D4C4B\",\n\"=.\tc #9E6255\",\n\"-.\tc #B07E69\",\n\";.\tc #C1967E\",\n\">.\tc #BE927D\",\n\",.\tc #A46761\",\n\"'.\tc #863A3A\",\n\").\tc #58322E\",\n\"!.\tc #D0D0D0\",\n\"~.\tc #EAEAE8\",\n\"{.\tc #595959\",\n\"].\tc #A1A1A1\",\n\"^.\tc #F3F3F3\",\n\"/.\tc #777777\",\n\"(.\tc #303030\",\n\"_.\tc #1F1F45\",\n\":.\tc #6868E6\",\n\"<.\tc #8787FA\",\n\"[.\tc #FBFBF8\",\n\"}.\tc #7C7778\",\n\"|.\tc #8A5B60\",\n\"1.\tc #5F1C1C\",\n\"2.\tc #7E4137\",\n\"3.\tc #936040\",\n\"4.\tc #A57A49\",\n\"5.\tc #B59155\",\n\"6.\tc #BFA060\",\n\"7.\tc #B78E60\",\n\"8.\tc #9F6252\",\n\"9.\tc #883A3A\",\n\"0.\tc #71322E\",\n\"a.\tc #ABA9A7\",\n\"b.\tc #F2F2F0\",\n\"c.\tc #C0C0BF\",\n\"d.\tc #DDDCDB\",\n\"e.\tc #A3A1A1\",\n\"f.\tc #1B1B39\",\n\"g.\tc #7475FE\",\n\"h.\tc #6F70FD\",\n\"i.\tc #F8F8F6\",\n\"j.\tc #939393\",\n\"k.\tc #4F292B\",\n\"l.\tc #5D1918\",\n\"m.\tc #773828\",\n\"n.\tc #8E5E35\",\n\"o.\tc #9F773C\",\n\"p.\tc #AD8D42\",\n\"q.\tc #B49748\",\n\"r.\tc #A97E49\",\n\"s.\tc #945443\",\n\"t.\tc #843635\",\n\"u.\tc #6E2C29\",\n\"v.\tc #857978\",\n\"w.\tc #CACBC8\",\n\"x.\tc #BFBFBD\",\n\"y.\tc #E1DDDC\",\n\"z.\tc #6A6969\",\n\"A.\tc #6061BB\",\n\"B.\tc #6A6BFF\",\n\"C.\tc #E2E3F4\",\n\"D.\tc #C8C8C8\",\n\"E.\tc #381A19\",\n\"F.\tc #541919\",\n\"G.\tc #6C3026\",\n\"H.\tc #7F4A31\",\n\"I.\tc #8E6036\",\n\"J.\tc #9E7B39\",\n\"K.\tc #A3833A\",\n\"L.\tc #97653A\",\n\"M.\tc #884437\",\n\"N.\tc #7D3432\",\n\"O.\tc #6F3735\",\n\"P.\tc #534643\",\n\"Q.\tc #B3B4B2\",\n\"R.\tc #E3E3E2\",\n\"S.\tc #A5A1A1\",\n\"T.\tc #797979\",\n\"U.\tc #282828\",\n\"V.\tc #2F2F47\",\n\"W.\tc #7171FC\",\n\"X.\tc #C4C4F4\",\n\"Y.\tc #F7F7F7\",\n\"Z.\tc #311717\",\n\"`.\tc #491E1D\",\n\" +\tc #61302C\",\n\".+\tc #734338\",\n\"++\tc #83593A\",\n\"@+\tc #917137\",\n\"#+\tc #926F33\",\n\"$+\tc #854E2F\",\n\"%+\tc #79342C\",\n\"&+\tc #702D2A\",\n\"*+\tc #653735\",\n\"=+\tc #625654\",\n\"-+\tc #A5A5A5\",\n\";+\tc #DEDAD9\",\n\">+\tc #666565\",\n\",+\tc #6C6C6C\",\n\"'+\tc #5C5DAA\",\n\")+\tc #A9A9F6\",\n\"!+\tc #524545\",\n\"~+\tc #461E1D\",\n\"{+\tc #5A3432\",\n\"]+\tc #6D4841\",\n\"^+\tc #7A5941\",\n\"/+\tc #816537\",\n\"(+\tc #7C582E\",\n\"_+\tc #703B28\",\n\":+\tc #672924\",\n\"<+\tc #602521\",\n\"[+\tc #6E4743\",\n\"}+\tc #B3B3B2\",\n\"|+\tc #AEADAD\",\n\"1+\tc #9B9898\",\n\"2+\tc #717171\",\n\"3+\tc #292929\",\n\"4+\tc #2C2D3B\",\n\"5+\tc #9293F0\",\n\"6+\tc #7B7B79\",\n\"7+\tc #5E4640\",\n\"8+\tc #573633\",\n\"9+\tc #654642\",\n\"0+\tc #6B4D3F\",\n\"a+\tc #6A4D34\",\n\"b+\tc #643F2A\",\n\"c+\tc #5B2C24\",\n\"d+\tc #532622\",\n\"e+\tc #502C28\",\n\"f+\tc #C0B1AF\",\n\"g+\tc #DFDFDF\",\n\"h+\tc #B2AFAE\",\n\"i+\tc #848580\",\n\"j+\tc #646492\",\n\"k+\tc #F9F9F5\",\n\"l+\tc #9D9D9D\",\n\"m+\tc #A3C09D\",\n\"n+\tc #5B3F38\",\n\"o+\tc #54322F\",\n\"p+\tc #5B3834\",\n\"q+\tc #57332E\",\n\"r+\tc #512B26\",\n\"s+\tc #4A2622\",\n\"t+\tc #4A2D28\",\n\"u+\tc #A69490\",\n\"v+\tc #CCCCCD\",\n\"w+\tc #CACACB\",\n\"x+\tc #9D9999\",\n\"y+\tc #6A6A66\",\n\"z+\tc #CCCBC2\",\n\"A+\tc #070707\",\n\"B+\tc #39393A\",\n\"C+\tc #F2F2EC\",\n\"D+\tc #D2D2D2\",\n\"E+\tc #88A788\",\n\"F+\tc #BAE5B8\",\n\"G+\tc #858670\",\n\"H+\tc #614941\",\n\"I+\tc #553430\",\n\"J+\tc #553530\",\n\"K+\tc #4B3430\",\n\"L+\tc #5D5351\",\n\"M+\tc #777776\",\n\"N+\tc #797978\",\n\"O+\tc #A7A2A1\",\n\"P+\tc #5F5E5D\",\n\"Q+\tc #B0B0A8\",\n\"R+\tc #F2F1E6\",\n\"S+\tc #494946\",\n\"T+\tc #D3D3CD\",\n\"U+\tc #FBFBFB\",\n\"V+\tc #546053\",\n\"W+\tc #738A70\",\n\"X+\tc #687564\",\n\"Y+\tc #757973\",\n\"Z+\tc #908E8E\",\n\"`+\tc #C1C0C0\",\n\" @\tc #E0E0DB\",\n\".@\tc #CCCACA\",\n\"+@\tc #8A8685\",\n\"@@\tc #676763\",\n\"#@\tc #DDDDD2\",\n\"$@\tc #F3F2E6\",\n\"%@\tc #7C7C77\",\n\"&@\tc #A1A19C\",\n\"*@\tc #BDBDBD\",\n\"=@\tc #F8F8F3\",\n\"-@\tc #CBCBC8\",\n\";@\tc #B5B0AE\",\n\">@\tc #626161\",\n\",@\tc #A8A79F\",\n\"'@\tc #EFEEE3\",\n\")@\tc #B8B8B0\",\n\"!@\tc #212121\",\n\"~@\tc #787772\",\n\"{@\tc #FAFAF5\",\n\"]@\tc #FCFCF9\",\n\"^@\tc #FAFAF4\",\n\"/@\tc #F7F8F0\",\n\"(@\tc #F5F6EC\",\n\"_@\tc #DFE1D5\",\n\":@\tc #C4C3C3\",\n\"<@\tc #898585\",\n\"[@\tc #676663\",\n\"}@\tc #C6C5BC\",\n\"|@\tc #C8C8C1\",\n\"1@\tc #BBBBB7\",\n\"2@\tc #70716F\",\n\"3@\tc #565552\",\n\"4@\tc #F4F4EA\",\n\"5@\tc #FAF9F4\",\n\"6@\tc #FBFBF7\",\n\"7@\tc #F6F6EF\",\n\"8@\tc #F3F4E9\",\n\"9@\tc #F2F2E6\",\n\"0@\tc #F0F0E4\",\n\"a@\tc #E6E7DC\",\n\"b@\tc #B5B6AE\",\n\"c@\tc #8D8D8D\",\n\"d@\tc #757575\",\n\"e@\tc #7F7F7F\",\n\"f@\tc #676767\",\n\"g@\tc #545454\",\n\"h@\tc #272727\",\n\"i@\tc #242422\",\n\"j@\tc #F0EEDF\",\n\"k@\tc #F3F1E3\",\n\"l@\tc #F4F1E4\",\n\"m@\tc #F2EFE2\",\n\"n@\tc #D7D5D9\",\n\"o@\tc #A6A4D1\",\n\"p@\tc #7675D0\",\n\"q@\tc #6969B0\",\n\"r@\tc #6C6C75\",\n\"s@\tc #707070\",\n\"t@\tc #808080\",\n\"u@\tc #C1C2B8\",\n\"v@\tc #C9C9BF\",\n\"w@\tc #8584B6\",\n\"x@\tc #3C3DDA\",\n\"y@\tc #3436EA\",\n\"z@\tc #494BED\",\n\"A@\tc #4B4C86\",\n\"B@\tc #2A2A2A\",\n\"C@\tc #535353\",\n\"D@\tc #242424\",\n\"E@\tc #262626\",\n\"F@\tc #565656\",\n\"G@\tc #666675\",\n\"H@\tc #6A6BF9\",\n\"I@\tc #696AC0\",\n\"J@\tc #30313C\",\n\"K@\tc #3D3D3D\",\n\"L@\tc #313131\",\n\"  . . . . . . . . . . . . . . + @ . . . . . .   \",\n\". . . . . . . . . # $ % & * = - ; > . . . . . . \",\n\". . . . . , ' ) ! ~ - - { { ] ^ / ( . . . . . . \",\n\". _ : < [ } - { | | | | | - 1 2 3 4 . . . . . . \",\n\". 5 6 7 1 | | | | 8 8 | 9 0 a b c d # . . . . . \",\n\". e f - | 8 8 g h i j k l m n o p q r . . . . . \",\n\". s t | u v w x y z A B C D E F G 2 H . . I J > \",\n\". K L - M N O P Q R S T U V W X Y q Z > `  .J ..\",\n\". +.@.] | #.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(.\",\n\"_.:.<.[.| }.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.v . \",\n\"f.g.h.i.1 j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.v . \",\n\". A.B.C.2 D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.. \",\n\". V.W.X.] Y.Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+. . \",\n\". . '+)+3 | !+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+. . \",\n\". . 4+5+[.| 6+7+8+9+0+a+b+c+d+e+f+g+h+% i+. . . \",\n\". . . j+k+| l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+. . \",\n\". . . B+C+- D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+. . \",\n\". . . s T+] U+V+W+X+Y+Z+`+M 3  @.@+@@@#@$@%@. . \",\n\". . . # &@3 8 *@= | 8 | { ] =@-@;@>@,@'@R+)@. . \",\n\". . . !@~@{@| | | 2 ]@^@/@(@_@:@<@[@}@|@1@2@. . \",\n\". . . . 3@4@5@6@k+7@8@9@0@a@b@c@d@e@f@g@h@. . . \",\n\". . . . i@j@k@l@m@n@o@p@q@r@s@t@l+3+. . . . . . \",\n\". . . . . u@v@w@x@y@z@A@B@. C@l+D@. . . . . . . \",\n\"  . . . . E@F@G@H@I@J@. . . K@L@. . . . . . .   \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/mat_preview_bg_icon.xpm",
    "content": "/* XPM */\nstatic char * mat_preview_bg_xpm[] = {\n\"20 22 153 2\",\n\"  \tc None\",\n\". \tc #AE6874\",\n\"+ \tc #80525B\",\n\"@ \tc #D57786\",\n\"# \tc #FE8899\",\n\"$ \tc #F08292\",\n\"% \tc #FE8798\",\n\"& \tc #EE8191\",\n\"* \tc #A87AA3\",\n\"= \tc #8698FB\",\n\"- \tc #8899FE\",\n\"; \tc #8292F0\",\n\"> \tc #8697FB\",\n\", \tc #8191F0\",\n\"' \tc #8697FA\",\n\") \tc #7F8FEB\",\n\"! \tc #6470A8\",\n\"~ \tc #EB8393\",\n\"{ \tc #D97A89\",\n\"] \tc #EF8293\",\n\"^ \tc #FD8899\",\n\"/ \tc #8292F1\",\n\"( \tc #8797FB\",\n\"_ \tc #8192F0\",\n\": \tc #8697F9\",\n\"< \tc #8090E7\",\n\"[ \tc #EE8090\",\n\"} \tc #E87D8D\",\n\"| \tc #E17A8A\",\n\"1 \tc #DF7989\",\n\"2 \tc #9F7399\",\n\"3 \tc #8090EC\",\n\"4 \tc #8090EE\",\n\"5 \tc #7B8AE2\",\n\"6 \tc #7A8AE1\",\n\"7 \tc #7E8DE8\",\n\"8 \tc #FB8797\",\n\"9 \tc #ED8090\",\n\"0 \tc #FC8798\",\n\"a \tc #FB8798\",\n\"b \tc #8798FC\",\n\"c \tc #8191EF\",\n\"d \tc #8191EE\",\n\"e \tc #8596F8\",\n\"f \tc #EF8191\",\n\"g \tc #EF8292\",\n\"h \tc #FD8798\",\n\"i \tc #8698FA\",\n\"j \tc #8797FA\",\n\"k \tc #8292EF\",\n\"l \tc #EE8091\",\n\"m \tc #E07A8A\",\n\"n \tc #E17B8A\",\n\"o \tc #E07A89\",\n\"p \tc #7A8AE2\",\n\"q \tc #7B8AE1\",\n\"r \tc #EF8192\",\n\"s \tc #8798FE\",\n\"t \tc #EC8090\",\n\"u \tc #DE7989\",\n\"v \tc #9E7298\",\n\"w \tc #8090EB\",\n\"x \tc #8090ED\",\n\"y \tc #7A89E0\",\n\"z \tc #7E8EEA\",\n\"A \tc #7A89DF\",\n\"B \tc #FD8898\",\n\"C \tc #8696F9\",\n\"D \tc #8898FE\",\n\"E \tc #8192EF\",\n\"F \tc #8798FB\",\n\"G \tc #BA9384\",\n\"H \tc #B08C7E\",\n\"I \tc #BA9385\",\n\"J \tc #BA9485\",\n\"K \tc #B18C7F\",\n\"L \tc #B08B7E\",\n\"M \tc #8C7C89\",\n\"N \tc #939DD1\",\n\"O \tc #939DD3\",\n\"P \tc #8D96C9\",\n\"Q \tc #939CD1\",\n\"R \tc #8C96C8\",\n\"S \tc #929CD0\",\n\"T \tc #949DD3\",\n\"U \tc #8C95C7\",\n\"V \tc #95F596\",\n\"W \tc #8FE98F\",\n\"X \tc #96F796\",\n\"Y \tc #96F696\",\n\"Z \tc #90EA90\",\n\"` \tc #A2CBA1\",\n\" .\tc #F3F3F3\",\n\"..\tc #F7F7F7\",\n\"+.\tc #EAEAEA\",\n\"@.\tc #F3F3F2\",\n\"#.\tc #98FD98\",\n\"$.\tc #91EF91\",\n\"%.\tc #99FE99\",\n\"&.\tc #98FE98\",\n\"*.\tc #92F092\",\n\"=.\tc #91EE91\",\n\"-.\tc #A3CFA3\",\n\";.\tc #FBFAFB\",\n\">.\tc #FEFEFE\",\n\",.\tc #F1F1F1\",\n\"'.\tc #FBFBFB\",\n\").\tc #F0F0F0\",\n\"!.\tc #FAFAFA\",\n\"~.\tc #EFEFEF\",\n\"{.\tc #8AE28A\",\n\"].\tc #91F091\",\n\"^.\tc #8BE38B\",\n\"/.\tc #92EF92\",\n\"(.\tc #9AC39B\",\n\"_.\tc #EDEDED\",\n\":.\tc #E4E4E4\",\n\"<.\tc #E3E3E3\",\n\"[.\tc #ECECEC\",\n\"}.\tc #E2E2E2\",\n\"|.\tc #96F996\",\n\"1.\tc #8FEC8F\",\n\"2.\tc #97FA97\",\n\"3.\tc #97F997\",\n\"4.\tc #90EC90\",\n\"5.\tc #8FEB8F\",\n\"6.\tc #A1CCA2\",\n\"7.\tc #F7F6F7\",\n\"8.\tc #F6F6F6\",\n\"9.\tc #FFFFFF\",\n\"0.\tc #92F192\",\n\"a.\tc #8BE48C\",\n\"b.\tc #9BC49B\",\n\"c.\tc #EEEEEE\",\n\"d.\tc #E5E5E5\",\n\"e.\tc #A1CCA1\",\n\"f.\tc #8DE68D\",\n\"g.\tc #8BE18B\",\n\"h.\tc #8AE08A\",\n\"i.\tc #9AC29A\",\n\"j.\tc #E6E6E6\",\n\"k.\tc #93EF93\",\n\"l.\tc #8CE48C\",\n\"m.\tc #94F494\",\n\"n.\tc #97FB97\",\n\"o.\tc #97FC97\",\n\"p.\tc #90ED90\",\n\"q.\tc #98FB98\",\n\"r.\tc #A2CDA2\",\n\"s.\tc #F8F8F8\",\n\"t.\tc #FCFCFC\",\n\"u.\tc #F9F9F9\",\n\"v.\tc #DCDCDC\",\n\". + @ # $ % # & % # * = - ; > - , ' ) ! \",\n\"~ { ] ^ $ # # & % ^ * = - / ( - _ ' : < \",\n\"[ } [ [ | [ [ 1 [ & 2 3 4 5 ) 4 6 ) 4 7 \",\n\"8 9 0 a & 0 0 9 0 0 * : b c : b d e b d \",\n\"0 f # ^ g # ^ & h ^ * i - ; j - _ ' - k \",\n\"l m & & n & & o & & 2 3 d 5 3 d p ) d q \",\n\"0 & % h r % h & h ^ * i s ; > s , ' - k \",\n\"h f # ^ $ # ^ & % ^ * = - ; ( - _ ' - k \",\n\"t 1 9 9 o 9 9 u 9 9 v w x 6 ) x y z x A \",\n\"0 & h h r h h l h B * ' s _ ' s , C D E \",\n\"h f # ^ $ # # f # ^ * F - ; F - _ ' - k \",\n\"G H I J K I J L I J M N O P Q O R S T U \",\n\"V W X Y Z Y Y W Y Y `  ...+. ...+.@...+.\",\n\"#.$.%.&.*.%.%.=.&.%.-.;.>.,.'.>.).!.>.~.\",\n\"$.{.].$.^.].*.{.]./.(._.).:._.).<.[.).}.\",\n\"|.1.2.3.4.2.2.5.2.3.6.7.!._...!._.8.!.[.\",\n\"#.$.%.&.*.%.%.=.&.%.-.;.>.,.'.>.).!.9.~.\",\n\"*.^.0.0.a.0.0.^.0.*.b.c.,.d.c.,.:.c.,.:.\",\n\"|.1.2.3.4.2.3.5.2.3.e.7.!._...!._.8.!.[.\",\n\"#.$.%.&.*.%.%.=.&.%.-.;.>.,.'.>.).!.9.~.\",\n\"=.f.$.=.g.$.=.h.=.=.i.[.~.}.[.~.}.[.~.j.\",\n\"k.l.m.n.=.o.n.p.n.q.r.s.t.c.u.t.c.s.s.v.\"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/mat_preview_date_icon.xpm",
    "content": "/* XPM */\nstatic char * mat_preview_date_icon_xpm[] = {\n\"22 24 446 2\",\n\"  \tc None\",\n\". \tc #B0ADB4\",\n\"+ \tc #98999B\",\n\"@ \tc #AEAEAE\",\n\"# \tc #9A9899\",\n\"$ \tc #999999\",\n\"% \tc #AFAFAF\",\n\"& \tc #999B9A\",\n\"* \tc #AFAFAD\",\n\"= \tc #9B999C\",\n\"- \tc #DBDBD9\",\n\"; \tc #848681\",\n\"> \tc #D9DBD8\",\n\", \tc #858786\",\n\"' \tc #D9D9D9\",\n\") \tc #868485\",\n\"! \tc #DADADA\",\n\"~ \tc #DCDBD9\",\n\"{ \tc #858384\",\n\"] \tc #DFCAB5\",\n\"^ \tc #D6BAA2\",\n\"/ \tc #F8F9F4\",\n\"( \tc #878787\",\n\"_ \tc #D3BA9B\",\n\": \tc #CFB899\",\n\"< \tc #F6FBF5\",\n\"[ \tc #D3B39A\",\n\"} \tc #CBB294\",\n\"| \tc #F8FAF9\",\n\"1 \tc #868686\",\n\"2 \tc #CCB193\",\n\"3 \tc #C3AC8D\",\n\"4 \tc #FAFCFB\",\n\"5 \tc #C4A98B\",\n\"6 \tc #BEA68A\",\n\"7 \tc #F8FBF4\",\n\"8 \tc #888A87\",\n\"9 \tc #B49674\",\n\"0 \tc #B59876\",\n\"a \tc #D8B794\",\n\"b \tc #CCA98B\",\n\"c \tc #DEE4E4\",\n\"d \tc #C5A27A\",\n\"e \tc #C19F79\",\n\"f \tc #DDE3E1\",\n\"g \tc #868885\",\n\"h \tc #C09A76\",\n\"i \tc #BA9873\",\n\"j \tc #DFE3E2\",\n\"k \tc #848887\",\n\"l \tc #B89470\",\n\"m \tc #B2906B\",\n\"n \tc #E1E3E2\",\n\"o \tc #888888\",\n\"p \tc #B18B67\",\n\"q \tc #AB8B65\",\n\"r \tc #DFE5E3\",\n\"s \tc #858585\",\n\"t \tc #A17751\",\n\"u \tc #886744\",\n\"v \tc #D4A27D\",\n\"w \tc #C7986E\",\n\"x \tc #B3B7B8\",\n\"y \tc #917D7F\",\n\"z \tc #860000\",\n\"A \tc #850504\",\n\"B \tc #B8B8BA\",\n\"C \tc #8D7B7B\",\n\"D \tc #870100\",\n\"E \tc #870704\",\n\"F \tc #B5B7B4\",\n\"G \tc #8F787E\",\n\"H \tc #850100\",\n\"I \tc #850804\",\n\"J \tc #B3B8B4\",\n\"K \tc #8F7A7F\",\n\"L \tc #860200\",\n\"M \tc #87040A\",\n\"N \tc #B4B6B5\",\n\"O \tc #8C7E7E\",\n\"P \tc #925E36\",\n\"Q \tc #81553A\",\n\"R \tc #CBAD89\",\n\"S \tc #C7A17A\",\n\"T \tc #968283\",\n\"U \tc #867B7F\",\n\"V \tc #BD7F80\",\n\"W \tc #BF8281\",\n\"X \tc #9C9293\",\n\"Y \tc #867C7A\",\n\"Z \tc #BF8182\",\n\"` \tc #9D9593\",\n\" .\tc #877B7B\",\n\"..\tc #C18584\",\n\"+.\tc #BF8382\",\n\"@.\tc #9F9492\",\n\"#.\tc #7F6B6C\",\n\"$.\tc #8B643B\",\n\"%.\tc #765738\",\n\"&.\tc #CDAB86\",\n\"*.\tc #C5A27C\",\n\"=.\tc #8B0504\",\n\"-.\tc #B75C5B\",\n\";.\tc #B8605C\",\n\">.\tc #B95D60\",\n\",.\tc #B95B5B\",\n\"'.\tc #B65C5C\",\n\").\tc #B75B5C\",\n\"!.\tc #B85E5E\",\n\"~.\tc #BA605F\",\n\"{.\tc #BA6261\",\n\"].\tc #BD6363\",\n\"^.\tc #BC6463\",\n\"/.\tc #BD6564\",\n\"(.\tc #B86464\",\n\"_.\tc #BC6262\",\n\":.\tc #901517\",\n\"<.\tc #86603B\",\n\"[.\tc #72573A\",\n\"}.\tc #C9A885\",\n\"|.\tc #C3A076\",\n\"1.\tc #950306\",\n\"2.\tc #F4E5E2\",\n\"3.\tc #E6A8A9\",\n\"4.\tc #E3A6A5\",\n\"5.\tc #BE4E4D\",\n\"6.\tc #EEBABC\",\n\"7.\tc #F0BEC1\",\n\"8.\tc #A11514\",\n\"9.\tc #E4ADAA\",\n\"0.\tc #DC928F\",\n\"a.\tc #C04347\",\n\"b.\tc #C34747\",\n\"c.\tc #E9918D\",\n\"d.\tc #C24A4B\",\n\"e.\tc #E6908F\",\n\"f.\tc #EA9090\",\n\"g.\tc #9A1212\",\n\"h.\tc #835D38\",\n\"i.\tc #725438\",\n\"j.\tc #BF9C74\",\n\"k.\tc #A70302\",\n\"l.\tc #F4CACB\",\n\"m.\tc #F2C6C5\",\n\"n.\tc #F3C1C2\",\n\"o.\tc #D6777B\",\n\"p.\tc #F5C7C9\",\n\"q.\tc #E8A4A3\",\n\"r.\tc #DD8D90\",\n\"s.\tc #EFBAB6\",\n\"t.\tc #EFAFB0\",\n\"u.\tc #C8181B\",\n\"v.\tc #CF2C2F\",\n\"w.\tc #CB3536\",\n\"x.\tc #CF3336\",\n\"y.\tc #CD3132\",\n\"z.\tc #CC2E2F\",\n\"A.\tc #C92E2A\",\n\"B.\tc #AB1214\",\n\"C.\tc #825C37\",\n\"D.\tc #6D5235\",\n\"E.\tc #CD9B7A\",\n\"F.\tc #C2926A\",\n\"G.\tc #C00000\",\n\"H.\tc #FCB6BE\",\n\"I.\tc #F07071\",\n\"J.\tc #F9B2B8\",\n\"K.\tc #EF7778\",\n\"L.\tc #F8ADB1\",\n\"M.\tc #F7ADAE\",\n\"N.\tc #F06261\",\n\"O.\tc #F8C6C9\",\n\"P.\tc #DA211F\",\n\"Q.\tc #D90000\",\n\"R.\tc #DB0000\",\n\"S.\tc #E78989\",\n\"T.\tc #E00E0D\",\n\"U.\tc #ED868A\",\n\"V.\tc #E31112\",\n\"W.\tc #EA878A\",\n\"X.\tc #B90D09\",\n\"Y.\tc #87532E\",\n\"Z.\tc #794D32\",\n\"`.\tc #C7A582\",\n\" +\tc #A30003\",\n\".+\tc #BE0200\",\n\"++\tc #C00002\",\n\"@+\tc #C10001\",\n\"#+\tc #C10100\",\n\"$+\tc #C20102\",\n\"%+\tc #C20001\",\n\"&+\tc #BE0203\",\n\"*+\tc #C10000\",\n\"=+\tc #BD0100\",\n\"-+\tc #BE0002\",\n\";+\tc #BE0201\",\n\">+\tc #A00E11\",\n\",+\tc #795732\",\n\"'+\tc #6B4C30\",\n\")+\tc #C5A481\",\n\"!+\tc #BB9872\",\n\"~+\tc #FEFFFF\",\n\"{+\tc #FDFEFF\",\n\"]+\tc #FFFDFE\",\n\"^+\tc #FBFCFE\",\n\"/+\tc #FEFCFF\",\n\"(+\tc #F9FBF8\",\n\"_+\tc #FDF9F8\",\n\":+\tc #F8F8F8\",\n\"<+\tc #F5F5F7\",\n\"[+\tc #F4F2F3\",\n\"}+\tc #EEF2F5\",\n\"|+\tc #EFEFED\",\n\"1+\tc #EDEDEB\",\n\"2+\tc #EDEDEF\",\n\"3+\tc #E7E7E7\",\n\"4+\tc #E6E6E4\",\n\"5+\tc #E4E4E4\",\n\"6+\tc #E2E2E2\",\n\"7+\tc #795630\",\n\"8+\tc #6C4D30\",\n\"9+\tc #C2A07D\",\n\"0+\tc #B6936B\",\n\"a+\tc #FFFFFA\",\n\"b+\tc #FCFCFC\",\n\"c+\tc #FEFCFD\",\n\"d+\tc #FAFCF9\",\n\"e+\tc #E7E5EA\",\n\"f+\tc #191919\",\n\"g+\tc #0E0E0E\",\n\"h+\tc #F5F5F5\",\n\"i+\tc #F0F2EF\",\n\"j+\tc #F1EDEA\",\n\"k+\tc #1E1E20\",\n\"l+\tc #000000\",\n\"m+\tc #1B1A18\",\n\"n+\tc #7E8283\",\n\"o+\tc #E4E4E2\",\n\"p+\tc #DEDEE0\",\n\"q+\tc #DFDFDD\",\n\"r+\tc #73512C\",\n\"s+\tc #684A30\",\n\"t+\tc #C09F7C\",\n\"u+\tc #B9936E\",\n\"v+\tc #FCFCFE\",\n\"w+\tc #FCFEFD\",\n\"x+\tc #F7F3F4\",\n\"y+\tc #A2A4A3\",\n\"z+\tc #212121\",\n\"A+\tc #110D0E\",\n\"B+\tc #F2F1EF\",\n\"C+\tc #EDEFEE\",\n\"D+\tc #909090\",\n\"E+\tc #010103\",\n\"F+\tc #000100\",\n\"G+\tc #010006\",\n\"H+\tc #020204\",\n\"I+\tc #868688\",\n\"J+\tc #DEDCDF\",\n\"K+\tc #DBDBDB\",\n\"L+\tc #724F29\",\n\"M+\tc #644A29\",\n\"N+\tc #BE9D7A\",\n\"O+\tc #B39068\",\n\"P+\tc #F6FCFA\",\n\"Q+\tc #F9F7F8\",\n\"R+\tc #141615\",\n\"S+\tc #020001\",\n\"T+\tc #000201\",\n\"U+\tc #0D0E12\",\n\"V+\tc #EDEDED\",\n\"W+\tc #EBEBEB\",\n\"X+\tc #1D1F1E\",\n\"Y+\tc #010101\",\n\"Z+\tc #767674\",\n\"`+\tc #E1DBDB\",\n\" @\tc #717574\",\n\".@\tc #010000\",\n\"+@\tc #1B1B1D\",\n\"@@\tc #DAD5D9\",\n\"#@\tc #714E28\",\n\"$@\tc #62472C\",\n\"%@\tc #C1906F\",\n\"&@\tc #B7835C\",\n\"*@\tc #F6E6E6\",\n\"=@\tc #F9E7E7\",\n\"-@\tc #130100\",\n\";@\tc #4A3A3A\",\n\">@\tc #B5A3A3\",\n\",@\tc #1F0D0D\",\n\"'@\tc #EBD9D9\",\n\")@\tc #E9D7D7\",\n\"!@\tc #160404\",\n\"~@\tc #120000\",\n\"{@\tc #D8C6C6\",\n\"]@\tc #E0CECE\",\n\"^@\tc #D2C0C0\",\n\"/@\tc #150303\",\n\"(@\tc #DAC8C8\",\n\"_@\tc #D9C6C8\",\n\":@\tc #794422\",\n\"<@\tc #6D4126\",\n\"[@\tc #B99875\",\n\"}@\tc #AF8C66\",\n\"|@\tc #F5F3F4\",\n\"1@\tc #F3F1F2\",\n\"2@\tc #E2E2E4\",\n\"3@\tc #F0F0F2\",\n\"4@\tc #EBEBE9\",\n\"5@\tc #0F0F11\",\n\"6@\tc #E5E5E5\",\n\"7@\tc #E3E3E3\",\n\"8@\tc #CFCFCF\",\n\"9@\tc #CCCCCC\",\n\"0@\tc #D4D2D3\",\n\"a@\tc #D1D3D2\",\n\"b@\tc #6A4622\",\n\"c@\tc #5E4526\",\n\"d@\tc #B69874\",\n\"e@\tc #AA8662\",\n\"f@\tc #F0F1F3\",\n\"g@\tc #EEF0EF\",\n\"h@\tc #EBE9EA\",\n\"i@\tc #E6E6E6\",\n\"j@\tc #100E0F\",\n\"k@\tc #0C0E0B\",\n\"l@\tc #E0E0E0\",\n\"m@\tc #020202\",\n\"n@\tc #D8D8D8\",\n\"o@\tc #C8C8C8\",\n\"p@\tc #D5D3D4\",\n\"q@\tc #CFD0D2\",\n\"r@\tc #684724\",\n\"s@\tc #5A4228\",\n\"t@\tc #B59775\",\n\"u@\tc #AB855E\",\n\"v@\tc #ECECEA\",\n\"w@\tc #EBEBED\",\n\"x@\tc #E8E8E8\",\n\"y@\tc #E6E6E8\",\n\"z@\tc #0B0B09\",\n\"A@\tc #0C0E0D\",\n\"B@\tc #DEDEDE\",\n\"C@\tc #1D1D1D\",\n\"D@\tc #A6A6A6\",\n\"E@\tc #D6D6D6\",\n\"F@\tc #A2A2A2\",\n\"G@\tc #1D1C1A\",\n\"H@\tc #CFCFD1\",\n\"I@\tc #D1CFD0\",\n\"J@\tc #684420\",\n\"K@\tc #5A3E26\",\n\"L@\tc #B19371\",\n\"M@\tc #A28460\",\n\"N@\tc #EAEAEA\",\n\"O@\tc #E9E5E4\",\n\"P@\tc #E5E5E7\",\n\"Q@\tc #E4E4E6\",\n\"R@\tc #0D0D0D\",\n\"S@\tc #0E0C0D\",\n\"T@\tc #7F7F7F\",\n\"U@\tc #2C2C2C\",\n\"V@\tc #030303\",\n\"W@\tc #777978\",\n\"X@\tc #D2D0D1\",\n\"Y@\tc #D1D1CF\",\n\"Z@\tc #64401E\",\n\"`@\tc #5A4027\",\n\" #\tc #B88766\",\n\".#\tc #AA7853\",\n\"+#\tc #E3D7D9\",\n\"@#\tc #E5D6D3\",\n\"##\tc #E5D1D0\",\n\"$#\tc #DFCFD0\",\n\"%#\tc #DDCDCD\",\n\"&#\tc #1F0C0E\",\n\"*#\tc #1E0C0A\",\n\"=#\tc #D9C7C7\",\n\"-#\tc #827070\",\n\";#\tc #2B1919\",\n\">#\tc #130101\",\n\",#\tc #7E6C6C\",\n\"'#\tc #D1C3C3\",\n\")#\tc #D4C1BD\",\n\"!#\tc #D0C2C1\",\n\"~#\tc #723A15\",\n\"{#\tc #633920\",\n\"]#\tc #AE8D6C\",\n\"^#\tc #A17F5A\",\n\"/#\tc #E2E0E1\",\n\"(#\tc #E1E1E3\",\n\"_#\tc #DDDBDC\",\n\":#\tc #DCDCDE\",\n\"<#\tc #D9DADC\",\n\"[#\tc #DCD8D9\",\n\"}#\tc #D6D6D8\",\n\"|#\tc #D5D5D5\",\n\"1#\tc #D3D3D3\",\n\"2#\tc #D2D2D2\",\n\"3#\tc #D0D0D0\",\n\"4#\tc #D1D1D1\",\n\"5#\tc #D1CFD2\",\n\"6#\tc #D3D2D0\",\n\"7#\tc #613D1B\",\n\"8#\tc #563A22\",\n\"9#\tc #9F7E5B\",\n\"0#\tc #896438\",\n\"a#\tc #7D5935\",\n\"b#\tc #785631\",\n\"c#\tc #785734\",\n\"d#\tc #78522D\",\n\"e#\tc #724F2F\",\n\"f#\tc #704E29\",\n\"g#\tc #6E4D2A\",\n\"h#\tc #6D4B28\",\n\"i#\tc #6C4A27\",\n\"j#\tc #694724\",\n\"k#\tc #664421\",\n\"l#\tc #63411E\",\n\"m#\tc #62401D\",\n\"n#\tc #603E1B\",\n\"o#\tc #623C18\",\n\"p#\tc #5A3D1D\",\n\"q#\tc #5A3918\",\n\"r#\tc #523316\",\n\"s#\tc #4E3820\",\n\"t#\tc #94765A\",\n\"u#\tc #5D4328\",\n\"v#\tc #533B21\",\n\"w#\tc #4F371F\",\n\"x#\tc #4C361E\",\n\"y#\tc #4B351D\",\n\"z#\tc #4A341C\",\n\"A#\tc #4A321A\",\n\"B#\tc #452F18\",\n\"C#\tc #442E17\",\n\"D#\tc #422C15\",\n\"E#\tc #412B14\",\n\"F#\tc #3F2912\",\n\"G#\tc #3E2811\",\n\"H#\tc #3D2710\",\n\"I#\tc #3F270F\",\n\"J#\tc #39240F\",\n\"K#\tc #3A2510\",\n\"L#\tc #39230E\",\n\"M#\tc #655546\",\n\"    . +     @ #     @ $     % &     * =     \",\n\"    - ;     > ,     ' )     ! )     ~ {     \",\n\"] ^ / ( _ : < ( [ } | 1 2 3 4 1 5 6 7 8 9 0 \",\n\"a b c , d e f g h i j k l m n o p q r s t u \",\n\"v w x y z A B C D E F G H I J K L M N O P Q \",\n\"R S T U V W X Y V Z `  ...V `  .W +.@.#.$.%.\",\n\"&.*.=.-.;.>.,.'.).).!.~.{.].^.]./.(._.:.<.[.\",\n\"}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.b.f.g.h.i.\",\n\"}.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.\",\n\"E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.\",\n\"`.i  +.+++G.@+#+G.#+#+++$+%+&+*+=+-+;+>+,+'+\",\n\")+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+\",\n\"9+0+a+b+c+d+e+f+g+h+i+j+8 k+l+m+n+o+p+q+r+s+\",\n\"t+u+v+w+x+y+z+l+A+B+C+D+E+F+G+H+l+I+J+K+L+M+\",\n\"N+O+P+Q+R+S+l+T+U+V+W+X+Y+Z+`+ @.@+@> @@#@$@\",\n\"%@&@*@=@-@;@>@,@,@'@)@!@~@{@]@^@~@/@(@_@:@<@\",\n\"[@}@|@1@2@3@4@5@g+6@7@Y+l+8@K+9@l+S+0@a@b@c@\",\n\"d@e@f@g@1+h@i@j@k@6+l@m@Y+9@n@o@l+Y+p@q@r@s@\",\n\"t@u@v@w@x@y@6@z@A@B@K+C@l+D@E@F@Y+G@H@I@J@K@\",\n\"L@M@N@O@P@Q@l@R@S@K+K+T@l+m@U@V@l+W@X@Y@Z@`@\",\n\" #.#+#@###$#%#&#*#(@=#{@-#;#>#;#,#'#)#!#~#{#\",\n\"]#^#/#(#_#:#<#[#}#|#1#2#3#4#3#8@3#5#3#6#7#8#\",\n\"9#0#a#b#c#d#e#f#g#h#i#j#j#k#l#m#n#o#p#q#r#s#\",\n\"t#u#v#w#x#y#z#A#A#B#B#C#D#E#F#G#H#I#J#K#L#M#\"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/pinned.xpm",
    "content": "/* XPM */\nstatic char * pinned_xpm[] = {\n\"16 15 59 1\",\n\" \tc None\",\n\".\tc #101010\",\n\"+\tc #000000\",\n\"@\tc #141414\",\n\"#\tc #040404\",\n\"$\tc #010101\",\n\"%\tc #0F0F0F\",\n\"&\tc #FAFAFA\",\n\"*\tc #FFFFFF\",\n\"=\tc #EAEAEA\",\n\"-\tc #F2F2F2\",\n\";\tc #0A0A0A\",\n\">\tc #050505\",\n\",\tc #FCFCFC\",\n\"'\tc #F1F1F1\",\n\")\tc #B9B9B9\",\n\"!\tc #BEBEBE\",\n\"~\tc #C6C6C6\",\n\"{\tc #8E8E8E\",\n\"]\tc #060606\",\n\"^\tc #F5F5F5\",\n\"/\tc #C5C5C5\",\n\"(\tc #CDCDCD\",\n\"_\tc #D3D3D3\",\n\":\tc #BBBBBB\",\n\"<\tc #838383\",\n\"[\tc #070707\",\n\"}\tc #EDEDED\",\n\"|\tc #F6F6F6\",\n\"1\tc #020202\",\n\"2\tc #BFBFBF\",\n\"3\tc #C2C2C2\",\n\"4\tc #696969\",\n\"5\tc #0E0E0E\",\n\"6\tc #0B0B0B\",\n\"7\tc #BDBDBD\",\n\"8\tc #030303\",\n\"9\tc #848484\",\n\"0\tc #BABABA\",\n\"a\tc #828282\",\n\"b\tc #8C8C8C\",\n\"c\tc #727272\",\n\"d\tc #898989\",\n\"e\tc #080808\",\n\"f\tc #0C0C0C\",\n\"g\tc #7E7E7E\",\n\"h\tc #757575\",\n\"i\tc #8F8F8F\",\n\"j\tc #8B8B8B\",\n\"k\tc #151515\",\n\"l\tc #7C7C7C\",\n\"m\tc #6F6F6F\",\n\"n\tc #808080\",\n\"o\tc #787878\",\n\"p\tc #282828\",\n\"q\tc #8A8A8A\",\n\"r\tc #7F7F7F\",\n\"s\tc #858585\",\n\"t\tc #707070\",\n\"                \",\n\"                \",\n\"        .+@#    \",\n\"      $%&*=-;   \",\n\"    >++,')!~{]  \",\n\"    %*.^/(_:<+  \",\n\"   [}|1&)23456  \",\n\"   +*789~0ab+#  \",\n\"   +c/d#+e#8+   \",\n\"   f{ghij+5>k   \",\n\"    ;lmn1+]#o   \",\n\"    ++p$%#8b    \",\n\"   1qr1e+st     \",\n\"                \",\n\"                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/play.xpm",
    "content": "/* XPM */\nstatic char * play_xpm[] = {\n\"32 20 2 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"             .                  \",\n\"             ...                \",\n\"             .....              \",\n\"             .......            \",\n\"             ........           \",\n\"             .......            \",\n\"             .....              \",\n\"             ...                \",\n\"             .                  \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/play_from_cursor.xpm",
    "content": "/* XPM */\nstatic char * play_from_cursor_xpm[] = {\n\"32 20 2 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"         ... ...                \",\n\"            .                   \",\n\"            .    .              \",\n\"            .    ...            \",\n\"            .    .....          \",\n\"            .    .......        \",\n\"            .    ........       \",\n\"            .    .......        \",\n\"            .    .....          \",\n\"            .    ...            \",\n\"            .    .              \",\n\"            .                   \",\n\"         ... ...                \",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/play_loop.xpm",
    "content": "/* XPM */\nstatic char * playloop_xpm[] = {\n\"32 20 2 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"     .                          \",\n\"     ...                        \",\n\"     .....    ...........       \",\n\"     .......             .      \",\n\"     ........            .      \",\n\"     .......       ..    .      \",\n\"     .....       ........       \",\n\"     ...           ..           \",\n\"     .                          \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/record.xpm",
    "content": "/* XPM */\nstatic char * record_xpm[] = {\n\"32 20 2 1\",\n\" \tc None\",\n\".\tc #FF0000\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"              ...               \",\n\"             .....              \",\n\"            .......             \",\n\"            .......             \",\n\"            .......             \",\n\"             .....              \",\n\"              ...               \",\n\"                                \",\n\"                                \",\n\"      .....  ......  .....      \",\n\"      .    . .      .     .     \",\n\"      .    . .....  .           \",\n\"      .....  .      .     .     \",\n\"      .    . ......  .....      \",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/render_animation.xpm",
    "content": "/* XPM */\nstatic char * record_xpm[] = {\n\"32 20 2 1\",\n\" \tc None\",\n\".\tc #FF0000\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"              ...               \",\n\"             .....              \",\n\"            .......             \",\n\"            .......             \",\n\"            .......             \",\n\"             .....              \",\n\"              ...               \",\n\"                                \",\n\"                                \",\n\"      .....  ......  .....      \",\n\"      .    . .      .     .     \",\n\"      .    . .....  .           \",\n\"      .....  .      .     .     \",\n\"      .    . ......  .....      \",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/render_frame.xpm",
    "content": "/* XPM */\nstatic char * recordframe_xpm[] = {\n\"32 20 2 1\",\n\" \tc None\",\n\".\tc #FF0000\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"          ...    .. ..          \",\n\"         .....   .. ..          \",\n\"        .......  .. ..          \",\n\"        .......  .. ..          \",\n\"        .......  .. ..          \",\n\"         .....   .. ..          \",\n\"          ...    .. ..          \",\n\"                                \",\n\"                                \",\n\"      .....  ......  .....      \",\n\"      .    . .      .     .     \",\n\"      .    . .....  .           \",\n\"      .....  .      .     .     \",\n\"      .    . ......  .....      \",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/render_preview.xpm",
    "content": "/* XPM */\nstatic char * preview_xpm[] = {\n\"32 20 199 2\",\n\"  \tc None\",\n\". \tc #706E70\",\n\"+ \tc #4A4A4A\",\n\"@ \tc #3D3C3D\",\n\"# \tc #5F5E5F\",\n\"$ \tc #6A686A\",\n\"% \tc #4F4E4F\",\n\"& \tc #636263\",\n\"* \tc #878587\",\n\"= \tc #7D7B7D\",\n\"- \tc #4E4C4E\",\n\"; \tc #3A393A\",\n\"> \tc #5D5C5D\",\n\", \tc #4B4B4B\",\n\"' \tc #464546\",\n\") \tc #7B7A7C\",\n\"! \tc #7C7A7D\",\n\"~ \tc #565456\",\n\"{ \tc #7F7C7F\",\n\"] \tc #BEBBBE\",\n\"^ \tc #3E3E40\",\n\"/ \tc #232223\",\n\"( \tc #B0ADB0\",\n\"_ \tc #626062\",\n\": \tc #050505\",\n\"< \tc #484748\",\n\"[ \tc #7C787B\",\n\"} \tc #3E3F3F\",\n\"| \tc #BDBABD\",\n\"1 \tc #B1ADB1\",\n\"2 \tc #212121\",\n\"3 \tc #1D1C1D\",\n\"4 \tc #BAB7BA\",\n\"5 \tc #6A6769\",\n\"6 \tc #020202\",\n\"7 \tc #A8A5A8\",\n\"8 \tc #040404\",\n\"9 \tc #575557\",\n\"0 \tc #EDE9ED\",\n\"a \tc #121212\",\n\"b \tc #A19EA1\",\n\"c \tc #444244\",\n\"d \tc #A9A5A9\",\n\"e \tc #383838\",\n\"f \tc #FDF9FD\",\n\"g \tc #545354\",\n\"h \tc #030303\",\n\"i \tc #605E60\",\n\"j \tc #BBB8BB\",\n\"k \tc #070707\",\n\"l \tc #393839\",\n\"m \tc #D1CED1\",\n\"n \tc #2E2D2E\",\n\"o \tc #5B595B\",\n\"p \tc #646364\",\n\"q \tc #323132\",\n\"r \tc #2C2B2C\",\n\"s \tc #515051\",\n\"t \tc #8D8A8D\",\n\"u \tc #0F0F0F\",\n\"v \tc #111111\",\n\"w \tc #4D4C4D\",\n\"x \tc #464446\",\n\"y \tc #222424\",\n\"z \tc #3B3B3B\",\n\"A \tc #4D4D4D\",\n\"B \tc #505050\",\n\"C \tc #565658\",\n\"D \tc #666668\",\n\"E \tc #5C5B5C\",\n\"F \tc #949194\",\n\"G \tc #3A3A3A\",\n\"H \tc #C6C2C6\",\n\"I \tc #262626\",\n\"J \tc #131313\",\n\"K \tc #B1AEB1\",\n\"L \tc #727273\",\n\"M \tc #858385\",\n\"N \tc #7E7D7F\",\n\"O \tc #777577\",\n\"P \tc #646264\",\n\"Q \tc #6A696A\",\n\"R \tc #6A6A6A\",\n\"S \tc #1D1D1D\",\n\"T \tc #747274\",\n\"U \tc #010101\",\n\"V \tc #868486\",\n\"W \tc #EBE7EB\",\n\"X \tc #242324\",\n\"Y \tc #0E0E0E\",\n\"Z \tc #CECBCE\",\n\"` \tc #9F9D9F\",\n\" .\tc #2A292A\",\n\"..\tc #918E91\",\n\"+.\tc #B0ACB0\",\n\"@.\tc #2F2F2F\",\n\"#.\tc #404040\",\n\"$.\tc #434343\",\n\"%.\tc #393939\",\n\"&.\tc #2F2F2E\",\n\"*.\tc #303030\",\n\"=.\tc #363636\",\n\"-.\tc #7C7A7C\",\n\";.\tc #959295\",\n\">.\tc #F5F1F5\",\n\",.\tc #1A191A\",\n\"'.\tc #545254\",\n\").\tc #E2DFE2\",\n\"!.\tc #1C1C1C\",\n\"~.\tc #737173\",\n\"{.\tc #414141\",\n\"].\tc #4D4E4E\",\n\"^.\tc #575757\",\n\"/.\tc #626262\",\n\"(.\tc #595A59\",\n\"_.\tc #4C4C4C\",\n\":.\tc #3F3F3F\",\n\"<.\tc #323232\",\n\"[.\tc #252525\",\n\"}.\tc #1E1E1E\",\n\"|.\tc #0C0C0C\",\n\"1.\tc #5D5D5C\",\n\"2.\tc #565656\",\n\"3.\tc #5F5F5F\",\n\"4.\tc #5E5D5E\",\n\"5.\tc #666768\",\n\"6.\tc #4B4C4C\",\n\"7.\tc #4E4E4E\",\n\"8.\tc #484848\",\n\"9.\tc #353535\",\n\"0.\tc #2D2D2D\",\n\"a.\tc #1D1E1D\",\n\"b.\tc #4E4D4D\",\n\"c.\tc #50504E\",\n\"d.\tc #474747\",\n\"e.\tc #676566\",\n\"f.\tc #525454\",\n\"g.\tc #585858\",\n\"h.\tc #505051\",\n\"i.\tc #484847\",\n\"j.\tc #434340\",\n\"k.\tc #343434\",\n\"l.\tc #313131\",\n\"m.\tc #494849\",\n\"n.\tc #434342\",\n\"o.\tc #4C4D4D\",\n\"p.\tc #5A5A5B\",\n\"q.\tc #504F50\",\n\"r.\tc #5B5A5A\",\n\"s.\tc #575657\",\n\"t.\tc #39393A\",\n\"u.\tc #424242\",\n\"v.\tc #494949\",\n\"w.\tc #30302D\",\n\"x.\tc #2C2C2C\",\n\"y.\tc #3D3E3D\",\n\"z.\tc #414140\",\n\"A.\tc #5A595A\",\n\"B.\tc #595959\",\n\"C.\tc #5F6060\",\n\"D.\tc #615F60\",\n\"E.\tc #515151\",\n\"F.\tc #474646\",\n\"G.\tc #4B4949\",\n\"H.\tc #333333\",\n\"I.\tc #2E2C2A\",\n\"J.\tc #202020\",\n\"K.\tc #4B4A4B\",\n\"L.\tc #454545\",\n\"M.\tc #4F4F4F\",\n\"N.\tc #4B4B4C\",\n\"O.\tc #3F3F3E\",\n\"P.\tc #1C1D1C\",\n\"Q.\tc #232323\",\n\"R.\tc #4A4A49\",\n\"S.\tc #464646\",\n\"T.\tc #373737\",\n\"U.\tc #343432\",\n\"V.\tc #3D3D3D\",\n\"W.\tc #333435\",\n\"X.\tc #2E2D2F\",\n\"Y.\tc #3C3B3C\",\n\"Z.\tc #282727\",\n\"`.\tc #2A2828\",\n\" +\tc #2E2E2E\",\n\".+\tc #30302F\",\n\"++\tc #2D2C2B\",\n\"@+\tc #292828\",\n\"#+\tc #282828\",\n\"$+\tc #262628\",\n\"%+\tc #202023\",\n\"&+\tc #434243\",\n\"*+\tc #2B2B2B\",\n\"=+\tc #31302F\",\n\"-+\tc #1C1F1F\",\n\";+\tc #1C1C1E\",\n\">+\tc #414041\",\n\",+\tc #3C3C3C\",\n\"'+\tc #191919\",\n\"                                          . +                   \",\n\"                              @ # $ % & * = - ;                 \",\n\"                    > , ' ) ! ~ { ] ^ / ( _ : <                 \",\n\"              [ } | 1 2 3 4 5 6 4 7 8 9 0 a 9 b c               \",\n\"              d e f g h i j k l m n h o p q r s                 \",\n\"                / t u v i w x                                   \",\n\"                q 2 y z A B C D E                               \",\n\"              F G H I J K > I L M E N O P Q R ;                 \",\n\"                S T ' U V ( 8 e W X Y Z `  ...+.@.              \",\n\"                #.$.%.&.*.=.v Y -.@ U ;.>.,.'.).!.              \",\n\"              ~.{.].^./.(.A _.:.%.<.I !.[.}.|.A #.              \",\n\"              1.G 2.3.4.5.6.^.~ _.% 7.8.9.@.0.a.                \",\n\"              b.z + c.d.e.f.E g.2.h.i.j.k.l.*.=.                \",\n\"              m.n., p o.p.q.r.s.:.t.u.v., , w.x.                \",\n\"              y.z.A.B.C.D.E.F.G.E., '.H.*.I.J.,                 \",\n\"            . H.#.K.8.d.v.L.M.M.B 7.N.O.e @.P.                  \",\n\"              Q.{.+ R.S.z T.H.*.*.*.U.%.V.W.X.                  \",\n\"              Y.Z.`.0.l.<. +@.*..+++@+#+$+%+q                   \",\n\"                          &+*+#+=+#+2 -+;+!.>+                  \",\n\"                                      _ ,+'+                    \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/reverse_play.xpm",
    "content": "/* XPM */\nstatic char * playreverse_xpm[] = {\n\"32 20 2 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                  .             \",\n\"                ...             \",\n\"              .....             \",\n\"            .......             \",\n\"           ........             \",\n\"            .......             \",\n\"              .....             \",\n\"                ...             \",\n\"                  .             \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/reverse_play_loop.xpm",
    "content": "/* XPM */\nstatic char * playreverseloop_xpm[] = {\n\"32 20 2 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                          .     \",\n\"                        ...     \",\n\"       ...........    .....     \",\n\"      .             .......     \",\n\"      .            ........     \",\n\"      .    ..       .......     \",\n\"       ........       .....     \",\n\"           ..           ...     \",\n\"                          .     \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/rewind.xpm",
    "content": "/* XPM */\nstatic char * rewind_xpm[] = {\n\"32 20 2 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"      ..       .       .        \",\n\"      ..     ...     ...        \",\n\"      ..   .....   .....        \",\n\"      .. ....... .......        \",\n\"      ..................        \",\n\"      .. ....... .......        \",\n\"      ..   .....   .....        \",\n\"      ..     ...     ...        \",\n\"      ..       .       .        \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/splash.xpm",
    "content": "/* XPM */\nstatic char * splash_xpm[] = {\n\"300 350 256 2\",\n\"  \tc None\",\n\". \tc #020202\",\n\"+ \tc #2166BE\",\n\"@ \tc #888341\",\n\"# \tc #B49D25\",\n\"$ \tc #7DBBD6\",\n\"% \tc #ACCFDE\",\n\"& \tc #77430B\",\n\"* \tc #B9D7DF\",\n\"= \tc #8D6619\",\n\"- \tc #124D9C\",\n\"; \tc #DADEDB\",\n\"> \tc #3D83D4\",\n\", \tc #402509\",\n\"' \tc #619FD5\",\n\") \tc #2F66AF\",\n\"! \tc #434241\",\n\"~ \tc #E8E8E8\",\n\"{ \tc #A38411\",\n\"] \tc #986516\",\n\"^ \tc #282828\",\n\"/ \tc #4E8ED2\",\n\"( \tc #3A6395\",\n\"_ \tc #B29E39\",\n\": \tc #B58216\",\n\"< \tc #F0F0F0\",\n\"[ \tc #9D5507\",\n\"} \tc #A79F54\",\n\"| \tc #62390D\",\n\"1 \tc #C16806\",\n\"2 \tc #5B4326\",\n\"3 \tc #E6B70D\",\n\"4 \tc #292E32\",\n\"5 \tc #98BACF\",\n\"6 \tc #5F83A1\",\n\"7 \tc #504435\",\n\"8 \tc #5B6465\",\n\"9 \tc #7B7979\",\n\"0 \tc #F6F6F6\",\n\"a \tc #55300A\",\n\"b \tc #7A5119\",\n\"c \tc #78A3A3\",\n\"d \tc #E0B728\",\n\"e \tc #A19D68\",\n\"f \tc #C08213\",\n\"g \tc #4A75A4\",\n\"h \tc #ECBE22\",\n\"i \tc #5B5342\",\n\"j \tc #885009\",\n\"k \tc #B56408\",\n\"l \tc #353433\",\n\"m \tc #355988\",\n\"n \tc #6F8499\",\n\"o \tc #C89C0C\",\n\"p \tc #988C75\",\n\"q \tc #C88A11\",\n\"r \tc #84B1C9\",\n\"s \tc #9B771C\",\n\"t \tc #7F6753\",\n\"u \tc #1C4370\",\n\"v \tc #FAFAFA\",\n\"w \tc #D2B636\",\n\"x \tc #726344\",\n\"y \tc #DEB010\",\n\"z \tc #080808\",\n\"A \tc #1A5EB6\",\n\"B \tc #38547A\",\n\"C \tc #6896B0\",\n\"D \tc #9E8349\",\n\"E \tc #4E3820\",\n\"F \tc #875A28\",\n\"G \tc #6A5740\",\n\"H \tc #C9CECC\",\n\"I \tc #726B4B\",\n\"J \tc #C5C6C6\",\n\"K \tc #C5700B\",\n\"L \tc #4C2C0A\",\n\"M \tc #D6B63A\",\n\"N \tc #ACA569\",\n\"O \tc #A47211\",\n\"P \tc #B6781D\",\n\"Q \tc #D9911E\",\n\"R \tc #19539E\",\n\"S \tc #D09C06\",\n\"T \tc #483826\",\n\"U \tc #5B5A58\",\n\"V \tc #141312\",\n\"W \tc #D6B640\",\n\"X \tc #B58E0E\",\n\"Y \tc #868687\",\n\"Z \tc #8E5E16\",\n\"` \tc #28476F\",\n\" .\tc #AC660B\",\n\"..\tc #A69323\",\n\"+.\tc #7C6639\",\n\"@.\tc #3B5270\",\n\"#.\tc #884906\",\n\"$.\tc #694D31\",\n\"%.\tc #587594\",\n\"&.\tc #3E3E3E\",\n\"*.\tc #D98213\",\n\"=.\tc #FEFEFE\",\n\"-.\tc #8CAFCD\",\n\";.\tc #775C42\",\n\">.\tc #29589A\",\n\",.\tc #372717\",\n\"'.\tc #925209\",\n\").\tc #C6902A\",\n\"!.\tc #919293\",\n\"~.\tc #D4D6D5\",\n\"{.\tc #A0A3A3\",\n\"].\tc #D7AA1E\",\n\"^.\tc #CECECE\",\n\"/.\tc #B05E06\",\n\"(.\tc #D4780B\",\n\"_.\tc #504D4A\",\n\":.\tc #9D6627\",\n\"<.\tc #21538F\",\n\"[.\tc #978032\",\n\"}.\tc #43505E\",\n\"|.\tc #2973D1\",\n\"1.\tc #C8832B\",\n\"2.\tc #9F783C\",\n\"3.\tc #8C7838\",\n\"4.\tc #3074CA\",\n\"5.\tc #636261\",\n\"6.\tc #14447F\",\n\"7.\tc #1F1F1E\",\n\"8.\tc #1C3657\",\n\"9.\tc #B67219\",\n\"0.\tc #C8A539\",\n\"a.\tc #1352AA\",\n\"b.\tc #B39041\",\n\"c.\tc #85845A\",\n\"d.\tc #6B4312\",\n\"e.\tc #C3920B\",\n\"f.\tc #D4B846\",\n\"g.\tc #D7A127\",\n\"h.\tc #7B5E2D\",\n\"i.\tc #4A6994\",\n\"j.\tc #74745C\",\n\"k.\tc #B1A575\",\n\"l.\tc #563A1C\",\n\"m.\tc #C37725\",\n\"n.\tc #746457\",\n\"o.\tc #3866A7\",\n\"p.\tc #324862\",\n\"q.\tc #C8780B\",\n\"r.\tc #462D15\",\n\"s.\tc #DFD9D9\",\n\"t.\tc #C0C0C0\",\n\"u.\tc #824708\",\n\"v.\tc #3A3A39\",\n\"w.\tc #CE930B\",\n\"x.\tc #9B9C9C\",\n\"y.\tc #CACACA\",\n\"z.\tc #925A16\",\n\"A.\tc #B5AF6B\",\n\"B.\tc #8B6531\",\n\"C.\tc #775328\",\n\"D.\tc #C7AA23\",\n\"E.\tc #CD820C\",\n\"F.\tc #AA5C08\",\n\"G.\tc #6C5324\",\n\"H.\tc #8C8C8C\",\n\"I.\tc #6A6A69\",\n\"J.\tc #305E9C\",\n\"K.\tc #DADADA\",\n\"L.\tc #B28231\",\n\"M.\tc #286EC7\",\n\"N.\tc #B8B8B8\",\n\"O.\tc #A05C0D\",\n\"P.\tc #784A16\",\n\"Q.\tc #1C4E8C\",\n\"R.\tc #6BAFD9\",\n\"S.\tc #9F6E17\",\n\"T.\tc #A2892B\",\n\"U.\tc #A8AFAC\",\n\"V.\tc #C69C21\",\n\"W.\tc #B49025\",\n\"X.\tc #133C70\",\n\"Y.\tc #B66C14\",\n\"Z.\tc #8F7236\",\n\"`.\tc #A87709\",\n\" +\tc #857358\",\n\".+\tc #625444\",\n\"++\tc #D1D2D1\",\n\"@+\tc #422C16\",\n\"#+\tc #E0E0E0\",\n\"$+\tc #875A18\",\n\"%+\tc #6A817A\",\n\"&+\tc #685E58\",\n\"*+\tc #6E655D\",\n\"=+\tc #D8A614\",\n\"-+\tc #6C4E24\",\n\";+\tc #1F59AB\",\n\">+\tc #CD8120\",\n\",+\tc #D7B029\",\n\"'+\tc #667580\",\n\")+\tc #6C3C08\",\n\"!+\tc #917517\",\n\"~+\tc #AB691D\",\n\"{+\tc #CE9320\",\n\"]+\tc #1558B2\",\n\"^+\tc #4490D7\",\n\"/+\tc #935D25\",\n\"(+\tc #80807F\",\n\"_+\tc #A17228\",\n\":+\tc #9B5E20\",\n\"<+\tc #865318\",\n\"[+\tc #747474\",\n\"}+\tc #736C66\",\n\"|+\tc #5C4934\",\n\"1+\tc #959696\",\n\"2+\tc #A79D8F\",\n\"3+\tc #77ACCF\",\n\"4+\tc #2A67B8\",\n\"5+\tc #423424\",\n\"6+\tc #828E73\",\n\"7+\tc #A36515\",\n\"8+\tc #D1B23A\",\n\"9+\tc #9E8F4A\",\n\"0+\tc #684621\",\n\"a+\tc #8B6E37\",\n\"b+\tc #C6CAC9\",\n\"c+\tc #3875C4\",\n\"d+\tc #D39E17\",\n\"e+\tc #13478C\",\n\"f+\tc #9E6E2B\",\n\"g+\tc #666666\",\n\"h+\tc #A9A8A8\",\n\"i+\tc #B0B0AF\",\n\"j+\tc #D6DAD8\",\n\"k+\tc #905519\",\n\"l+\tc #484848\",\n\"m+\tc #285288\",\n\"n+\tc #C1A744\",\n\"o+\tc #6AAAD7\",\n\"p+\tc #7A5A2E\",\n\"q+\tc #A87820\",\n\"r+\tc #302D2B\",\n\"s+\tc #9FC6DB\",\n\"t+\tc #5B90C8\",\n\"u+\tc #C5A421\",\n\"v+\tc #5E4D3F\",\n\"w+\tc #C6781C\",\n\"x+\tc #A58E16\",\n\"y+\tc #545453\",\n\"z+\tc #275EA8\",\n\"A+\tc #556880\",\n\"B+\tc #5E5E5F\",\n\"C+\tc #603D1D\",\n\"D+\tc #8CBFD8\",\n\"E+\tc #A48028\",\n\"F+\tc #6E6E6E\",\n\"G+\tc #C3921D\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.v =.v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v =.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.v =.=.v v =.=.v =.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.=.=.=.v =.=.v v v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v 0 0 0 v v v v v v 0 v 0 =.v 0 v =.v v =.v v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 =.=.v v v 0 v v < 0 0 < v < < < v 0 v 0 0 < 0 0 0 0 < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.=.v 0 =.< ~ K.t.i+1+(+n.I .+.+|+v.T l i i j.(+2+i+^.#+~ < v v 0 < 0 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v < ~ j+U.p I._.! &.v.l 5+T r+r+l ,.r+,.v.r+r+,.5+r+7 .+9 H.i+++#+< < 0 0 0 v 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v =.=.=.v =.=.=.0 v v =.=.< b+{.9 U 5+&.,.5+l.7 7 T E $.2 2 a 5+, @+5+, T 7.@+E v+7 |+7 _.&+9 1+N.~ ~ < v 0 < v =.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.=.=.=.=.=.=.v v =.v 0 v =.0 =.~.h+Y &+7 5+5+@+,.T ,.V 5+5+,.,.T , ,.T C+7 C+.+l.|+G.l.l.2 5+,.l.,.@+2 T $.&+2+t.#+v 0 0 v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v =.=.=.=.0 =.0 j+1+g+7 &.T 5+@+@+T 5+@+@+L E @+L l.r., , 2 @+@+L l., ,.2 @+,.L E @+,.l.5+,.T E 5+@+G p t.~ < < 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.v =.v ~ ^.H.l+|+7 T T E T T ,.a l., 5+d., , l.E , , l.2 , , @+2 , , E l., r.2 r.@+r.l.@+, l.r.5+T @+7 p H #+0 0 < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.0 ++!.&+7 _.5+,.@+5+@+, L l., , a C+L , L )+L , L d.L , , a 2 a , a -+L , a | E , a 2 , , l.C+L E E @+7 !.b+< < < < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v 0 v =.0 ; h+g+|+7 &.,.r.7 l., , C+l., , a C+a , L d.a L L l.-+, L a a 0+, a , P.a L , | a L , a C+L a L l., @+2 5+@+U 1+H 0 v < < < v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< ^.(+i .+i T 5+7 E , 7.L E L , , a C+L , a | $.a L L | d.a L a | b a a L | C+| L | P.| a L l.$., L a C+r., l.-+, ,.I h+#+0 0 < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.; i+j.&+v+i |+|+2 r.@+E 0+2 , , L a 2 a a L | 0+L a L | b a a a a | P.a a a )+b a L a 2 d.l.a a a -+a r.a l.a , , l.T a $.p ^.~ ~ 0 < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v =.=.v =.=.=.=.0 s.1+&+G .+7 @+T l.@+5+l.|+T C+l.C+0+C.C+| L | b | a a a | b | a | a C+b | | | | P.& a a a & b a C+| | 0+a a a C+$.| C+G..+2 a t N.s.< ~ v < =.=.0 =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 J p &+G .+7 E T l.5+, ,.l.r., a E 0+0+C+0+C.C.C.F <+F <+C.F F <+P.)+| d.P.| | | | & 0+)+)+& C.F <+b b C.F h.-+C.$.d.0+l.a 0+, @+E $.i+#+~ ~ 0 0 =.=.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.~ N. +G .+*+C+T l.7 E @+, E 2 @+, L L 0+| L a )+b P.C+)+)+& d.F P.& & P.F F :.F <+F F B.B.F <+b P.b C.)+)+d.| P.d.C+a a C+| a L P.a L C+2 p s.~ < ~ < 0 =.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v 0 v v 0 ~ N.9 .+&+G 7 T l.|+l.@+, 5+2 @+, , L C+d.a | | | b b )+)+)+)+P.<+& | )+)+P.d.F & d.& )+b b )+d.& )+)+F d.C+)+)+& b )+| C+d.b a )+a d.d.a 2 0+c.s.~ ~ v 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 < k.;.|+v+.+2 E |+2 l.@+L l.l.L L a a d.C+| a )+)+)+b j )+& & & <+P.)+& u.)+)+b b & )+& & #.<+& & )+& & k+j )+d.)+& <+P.)+| | & b | a | d.C+a 0+|+9 ++< < < < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 s.p G 7 G G 2 l.l.$.l.L , l.d.l., L a a 0+| | )+| | b <+& )+& & & /+& u.)+& u.& :.& & & u.& P.k+#.#.& & & b j & & )+& & <+j )+)+d.j u.)+)+& & C+a 0+2 p ++#+< < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v ~.1+.+v+.+|+E 5+2 2 E L L r.2 l.L L L | C+d.a )+)+)+& k+b & )+& )+#.k+#.u.& & & u.k+& )+& u.& u./+<+& & u.u.u.k+j & & & & j j )+& )+& F & | )+P.C.| a 0+2 c.s.< ~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 0 < h+_.7 $..+l., l.0+a , r.L C+d.a , a a d.& )+a )+| )+u.k+)+& u.u.& '.F #.& u.#.& u.:.#.u.& u.& u./+#.u.#.& u.& k+z.& u.& P.j <+#.)+P.)+<+u.u.)+d.b d.l.| |+$.Y s.~ ~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v =.=.< v 0 A.;.|+v+5+r., C+0+L a , a C+d.a L L a | -+)+| )+)+& )+/+u.& u.& u.& k+k+u.u.& #.u.u.:+u.#.& #.u.#.:+j #.u.u.#.& j z.u.u.u.& u.k+j & & & u.u.<+)+)+& b d.| L 0+$.p #+#+~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.0 v < =.0 h+&+v+v+|+E 5+2 l.r.a , a l.C+a L a a a 0+)+a | )+)+)+k+[ & u.#.u.u.#./+[ #.#.u.u.u.#.:.#.#.u.#.#.#.k+k+u.u.#.#.u.j :+<+u.#.u.u.k+k+#.& & & j z.u.& | )+P.)+a l.C+G 2+J ~.~ 0 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.< 0 y.&+T 7 E l.E l.0+E , a , C+C+a L L L a | b | | )+)+& & /+j & u.#.#.#.'./+j #.#.#.#.u.j ~+#.#.#.j j j '.:+'.j #.#.u.u.z.Z j #.#.#.k+:+'.u.#.u.u.k+<+j & )+& C.P.a a l.n.N.^.~ ~ 0 v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.v v 0 =.#+Y 7 7 v+5+, L |+l.l.|+2 2 d.l.L , L L | 0+)+a | )+)+& j /+#.#.#.'.#.'.z.:.#.#.#.#.#.u.j :.#.#.#.u.#.u.u.:.j #.#.#.#.#.k+:.j u.j u.#.k+k+j #.#.u.j k+k+u.& & P.P.)+$.G.$.t N.s.#+~ v 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v v v 0 #+p l.T 2 E , , a C+, , a @+l.$.0+)+| a | d.)+| a | | )+u.z.<+#.#.#.'.#.#.O.:+#.#.'.#.#.#.k+~+#.'.'.#.'.j #.~+'.j '.'.'.j j :+] j k+j u.'.O.:.#.#.#.#.'.z.k+j P.<+F F & l.0+G.H.^.~ ~ < 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.=.=.v v v ~ 1+7 l 7 l., @+r.$.r., r., a 2 , L l.d.0+C.C.P.& u.u.#.<+k+:.'.'.[ [ [ '.[ 7+7+k+'.[ '.'.#.k+f+'.#.'.#.j '.j 7+k+#.#.#.j #.j ] k+#.'.j j u.'.:+O.7+O.k+:+f+~+:.:.j u.F & | -+$.v+k.#+~ ~ 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v ~ * b+N.Y y+! _.y+! T 7 E |+r.r.r.r.d.d.L , L a | C+C+| )+P.C.F /+] :.:+:+7+F.7+7+~+Y.~+7+7+O.[ [ k+'.:.'.'.'.#.[ '.k+:+:+'.'.'.[ [ /+~+S.:+7+7+7+] 7+7+Y.~+~+~+7+7+~+:.#.u.u.k+u.a )+C.C+t t.~ ; ~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.~ b+N.{.n 8 m p.` 8.p.p.l ! l+v..+7 2 a L C+0+a L a L , | $.)+L )+| & )+u.k+k+k+:+~+7+7+k ~+P :.~+7+~+~+9.Y.f+9. . .~+~+~+~+:.~+9.7+~+~+7+~+7+f+~+7+:.:+:+7+:.~+~+[ [ [ k+[ 7+:+'.z.u.j :.<+)+P.F d.9+; ; ~ 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.~ c m B B ` ( p.u u 8.8.8.8.8.4 p.&.&.p._..+|+l.a a a a a & d.a | | )+& )+k+:.'.'.[ [ F.[ /.F.m.F.[ F.F.[ O.F.:+Y.F.F.:+F.O.F.O.O.9.:+F.F.F.O.[ O.Y.[ [ [ [ [ [ O.:.~+[ F.F.[ O.P k+'.[ #.j :+& & F -+$.J s.#+< < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.=.=.~ U.B+8.` u p.@.8.u u X.8.8.8.8.8.@.8.4 4 r+v.7 $..+0+C+C+C+P.)+| )+)+d.& & '.z.#.[ [ [ F./.O.k Y.F./.F.F.F./.:+F.9.O.O.O.O.O.[ [ :+9.O.[ O.[ [ [ [ ~+7+[ O.[ [ [ F.~+Y.[ [ /.[ O.~+7+[ [ '.'.:+j & & F $. +s.j+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v b+'+u u u 8.m u X.8.u X.X.X.8.u p.@.8.8.8.8.v.l v.v.$.|+$.$.;.C+| | | & & u.:+:+#.F.[ F./.F.F.m.Y. ./.F.F.F./.F.F.m.F.[ F.[ F.[ F.[ 9.:+[ F.[ F.F.O.~+~+O.O.F.F.F.F.~+Y.F././.F.O.O.Y.[ [ '.#.O.:+u.& k+P.|+N.s.#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v 0 i+}.8.u u u m+X.X.u 6.u X.X.X.u m u u X.` u 8.8.4 8.v.5+7 |+G $.C.C.d.0+)+k+:+[ '.[ [ F.k /.F.w+ .k /./.k  . .O.Y.Y././.F./.F./.F.F.P O.O.F.F.F.F.F. .Y.F.[ /.[ /.F.~+K /././.F./.[ 9.~+[ [ '.[ :.#.& j b $. +; ; #+< 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v ~ x.p.8.8.8.m+u X.6.X.6.6.X.X.X.` >.X.u u X.u X.u ` ` v.v.v.v.v+v+.+C.p+C.C.F k+u.'.[ F.[ k F.~+w+k k k /.k /.k k m.k  ././././.F.F./.m.O.F./.F.F. .F. .m.k F.k /././.F.Y.1 /./.F. .F.~+Y.[ [ [ [ :+k+#.& #.B.|+N.#+; < < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 * '+8.X.X.X.m X.X.6.X.X.X.6.X.6.Q.m+6.6.6.u 6.u ` u u u ` ` p.y+_.7 ! .+G ;.t F P.k+<+[ [ O. .k m./.k 1 k 1 k 1 k w+/.k k k k /.k /./.m. .F././././.F.F.m.k F./././././.K Y.k F././. .F.Y. .[ [ '.:+:.#.u.& <+0+ +K.#+#+< < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 #+h+B 8.8.8.u ` X.X.X.6.6.X.X.X.Q.m+` X.6.6.6.6.6.e+6.u u ` ` p.U p.&.&.p._.B+n.n.;.h.C.F /+z.:+Y.1 k /.1 /.1 1 1 Y.>+k 1 k 1 k k 1 k k m. ./.k /././././.Y.1 k /./.k k /.k m.k /.k /.k O.Y.k [ [ [ '.:+'.u.& P.b |+N.#+#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.< ~.Y u X.8.X.m X.X.X.X.X.6.6.X.X.Q.m+X.e+X.e+e+e+6.u e+6.u u u ` ( ` u }.p.l+! l+v+n.t t F F k+:+m./.k k 1 k k 1 K /.>+1 1 1 k 1 1 k 1 k 1.k k 1 k 1 k k k Y.K 1 k 1 /.1 k k w+k  .k /./.F.m.Y./.[ [ '.:+:+u.u.& <+0+p s.s.~ < < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < U.8 u 8.X.Q.u X.8.X.6.X.X.6.X.Q.J.e+6.6.6.e+u e+e+- 6.e+e+u Q.m m u ` ` ` p.p.@.l+_.y+U t t t F f+:+/.k /.1 1 1 1 1 (.1 1 1 1 1 1 1 1 1 >+k 1 1 /.1 1 k k 1 m.F.k k 1 /.1 /.m.k k F././.F./.k Y.[ [ [ '.~+<+u.& P.b  +^.^.; < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< ++1+8 m m+B B u X.X.X.X.6.6.X.X.<.>.e+6.6.e+e+e+e+e+e+e+Q.e+e+>.>.Q.Q.m+e+m+m+B ` @.p.}.}._..+n.t 2.:+:+[ /./.k k Y.1 >+1 1 1 1 1 1 1 1 1 >+k 1 1 1 1 k Y.1 1 >+k k 1 k 1 k k K K Y.k k k /.k Y.k [ F.[ [ O.z.b u.k+F C.i+~.; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.~ N.'+p.` u m+m+` m+J.m+u X.6.X.u <.6.X.e+e+e+6.6.e+e+Q.- 6.e+Q.J.>.e+Q.Q.m+R Q.R m+m+` B m+}.}.y+&+n.;.:./+k+:+7+k k k >+9.1 1 1 1 1 1 1 1 *.Y.1 1 1 1 1 1 1 1 m.1 k k 1 k 1 1 Y.m.k k /.k k  .Y.Y.[ [ [ '.'.:.k+k+j k+2 D ++~.#+~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 j+x.U 8.8.8.B u 8.X.` Q.>.( m+u J.J.6.6.6.6.e+6.Q.Q.6.6.e+e+e+<.J.<.- e+- - a.R - R <.<.Q.Q.` m+p.}.5.&+n.t t /+k+O.k k w+~+1 1 1 1 1 1 1 1 >+1 1 1 1 k k 1 /.1 m.1 1 k 1 1 k k k w+Y.1 k k  .F.1 Y.~+7+O.7+/.~+:.F u.<+$.t y.s.#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< b+n @.8.8.X.Q.u X.X.X.X.X.6.Q.m+( J.<.<.Q.e+e+6.e+e+e+e+- e+Q.4+R e+- Q.- Q.a.Q.- Q.Q.m+<.<.<.m+Q.B i.}.y+U t t B./+:+F.9.~+1 1 1 1 1 1 1 1 w+(.1 1 1 1 1 K 1 1 (.m.1 1 1 /.1 k Y.Y.w+k 1 1  . .Y.m.m.9.9.P /.:+:.j & u.a+F t.~.#+~ < < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < t.'+u X.8.X.` X.X.X.6.6.X.X.X.u m+Q.m+>.>.J.>.Q.6.e+e+- - 6.;+J.- e+a.- a.a.Q.<.Q.Q.R Q.Q.Q.;+>.Q.J.i.m m+m y+&+t t /+/+_+:+/./.1 1 1 K 1 1 m.(.K 1 1 1 1 1 1 1 K w+Y.K 1 1 K k K Y.1.K w+K >+w+m.m.m.~+ .O.F.O.~+j j u.:.b h+++s.#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 j+-.B+8.8.X.u m+X.X.8.X.X.X.6.X.Q.Q.X.X.e+Q.<.>.z+J.<.- 6.e+- J.;+e+- Q.- - - a.Q.- a.R R a.Q.- R >.o.) m+m+>.B B }.B+}+t 2.F :+/.7+Y.Y.1 1 1 Y.m.K 1 K K Y.K Y.Y.Y.w+Y.w+>+w+*.>+>+w+>+>+w+K w+w+1 Y.w+k  .F.F.7+~+:+'.u./+P.p ^.s.s.< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< b+Y @.8.X.8.u ` X.X.X.X.6.X.X.6.>.m+X.6.6.6.e+6.R Q.>.J.) ;+R ( e+Q.- e+- e+a.- - - a.- a.a.]+Q.a.z+) ;+- z+;+;+>.m B }.U  +t 2.2.2.L.1.1.1.1.1.Q >+>+*.>+>+>+>+>+>+Q >+E.w+m.K K K >+w+>+1 K 1 K 1 k >+Y.k k /. .~+~+j k+:.u. +t.s.s.~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< b+%+` 8.X.X.m+X.X.X.X.X.X.X.X.Q.m 6.6.e+6.e+e+e+- e+- e+Q.) o.z+>.R Q.- a.Q.a.- - - a.a.- - a.- R 4+z+a.;+a.]+A ;+;+>.m @.y+}.t n.;./+=  .Y.1 K *.K K K 1 K (.1 K m.>+K 1 K K K K K (.(.*.K K K K K 1 >+1 /./.F.F.O.~+[ #.#.B.2.t.++#+~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v ~ N.A+X.8.8.u >.X.X.X.X.6.6.X.6.Q.z+X.6.6.e+e+e+e+e+e+- e+e+- z+) 4+) ) z+R - e+- a.- - - a.- a.R 4+4+A ]+]+]+]+]+A ;+>.>.m @.@.B+&+}+a+B.:. .Y.m.>+1 K K K 1 K q.K K *.K K (.K K K K w+(.*.K (.K K 1 1 w+Y.k k /.F.7+Y.#.'.#.B.F N.^.K.#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v #+H.B 8.8.X.X.` X.X.X.X.X.X.6.X.Q.>.e+6.6.e+e+e+e+e+e+e+e+a.Q.) - a.R ;+z+) ) ) a.a.R - - a.R R R 4+z+;+]+a.;+]+]+]+]+;+;+>.>.B @.@.B+*+t B.:.:+~+1.9.m.K q.K K (.q.q.Q K K (.K (.(.(.(.(.Q (.(.K (.K 1 K w+/./.F.'.:+~+'.#.#./+$.k.y.~.~ ~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 #+6+p.X.8.X.m+6.X.X.6.6.X.6.6.6.>.;+6.e+6.e+- e+- - e+e+Q.a.z+) R - - a.a.R ;+;+) 4+z+R - - a.a.;+4+]+a.]+]+]+]+]+]+]+]+a.;+;+>.>.m B @.5.}+t  +B.L.9.P K q.q.q.(.(.(.*.*.K (.(.(.(.(.(.*.*.(.(.(.(.1 1 k m. .F.[ j <+:+#.u.u.C.C.p ++~.~ ~ 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 J n @.` 8.X.m+X.X.X.X.6.6.6.6.6.J.e+X.e+e+e+- e+e+- e+a.e+a.) R - a.a.- a.a.a.R ]+A 4+4+4+z+]+e+4+]+a.a.]+]+]+]+]+]+]+A ]+]+]+]+R ;+m+B m g+g+F+ +2.f+_+9.q.q.q.q.(.>+*.*.(.(.(.(.*.*.*.*.Q (.(.1 K 1 1 /.m.:.k+:./+p+b P.& )+P.;. +y.++#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < {.'+p.` u u m X.X.6.X.X.X.X.X.Q.;+e+e+e+e+e+e+e+e+- e+- e+R o.R - a.a.R a.a.a.a.- a.a.]+z++ 4+M.c+;+]+a.a.]+a.]+]+]+]+]+A A ]+]+;+;+;+J.o.A+m A+}+9 t a+:.q+P m.q.E.>+Q Q *.*.*.(.*.*.*.*.Q *.(.(.1 1 7+:+_+:.F B.B.p+C.b P.)+2 C.G.h+++s.~ ~ v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < U.A+` u ` m ( ` X.6.X.X.6.6.e+J.Q.6.6.e+e+e+- e+a.e+- - - z+4+a.a.a.- a.a.- - ]+a.a.a.a.a.]+z+M.4++ z+A ]+]+a.]+]+]+]+]+]+]+A ]+]+]+R z+o.o.m m i.A+I.j.t f+f+q+P m.f >+Q (.*.*.*.*.*.*.*.Q *.(.1 Y.m.P _+:.p+a C+$..+G $.$.C+l.C+C+9 J #+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < {.U 8.8.X.m+` Q.<.<.e+X.6.X.6.) X.6.- e+e+e+- e+e+e+a.- a.) ;+- a.a.a.a.a.a.a.- a.- a.]+a.- A M.;+M.M.M.M.]+]+]+]+]+]+]+]+]+]+;+]+;+;+) o.>.Q.J.>.( i.[+9  +a+Z.9.9.m.1.*.(.*.(.*.*.*.*.*.Q (.(.1.m.P :+F 0+2 , ,.5+|+v+0+$.0+C+C+2 *+J K.; ~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < -.@.u X.8.m 8.X.6.e+J.>.<.6.e+>.e+e+- e+- - - - - e+a.- R M.R - a.a.a.a.a.a.]+a.a.a.a.a.]+a.+ M.]+a.]+A + M.|.|.]+]+]+]+]+]+]+a.]+]++ M.A a.;+;+>.J.m ( %.F+[+[+ + +3.L.L.K (.(.(.(.*.*.*.*.Q m.1.2.B.0+L r.E @+V V ,.! 7 7 _.|+&.5+&+t.K.; ~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < ~ {.p.X.8.8.m X.X.6.X.6.6.<.>.J.<.- - e+e+e+e+e+e+a.e+e+- z+M.a.a.a.a.]+]+a.]+a.a.]+a.]+]+]+]+M.+ ]+]+]+]+A + + A |.|.+ A ]+]+]+]+]+]++ M.;+;+;+z+A ;+z+J.J.i.%.'+j.*+n.2.L._+Y.q.*.(.(.(.*.*.>+~+:.f+F C+L 7.V , @+7.7.l v+T 7.7 &.T 7 J H ; ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< #+{.@.` X.8.B X.X.X.X.6.X.6.u J.>.J.;+R - - - e+e+- a.a.- ) ;+- a.a.a.- ]+a.a.]+a.]+a.]+]+A A M.+ A A A A ]+A A A ]++ + M.+ A A ]+- + M.+ a.]+]+A A + A + z+z+( ( %.'+A+[+ +t :.:.~+q.(.(.*.*.9.O.F )+l.E @+, 7.z ,.r+5+V ^ l V r+^ 5+7 t.++; ~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < j+6+p.X.8.X.m X.X.X.6.X.6.X.e+J.m+e+<.z+) z+z+]+- e+e+e+- M.;+a.a.a.a.a.a.a.a.a.a.]+]+]+]+]+4+|.A A A A A ]+A A A ]+]++ + |.|.M.M.+ ) 4+a.]++ A ]+A A A A + + z+4+o.i.%.'+I.&+;.x ] 9.w+w+w+m.~+/+d.L 7.,.,.r+,.^ 7.^ 5+V 7.v.7.7.^ r+_.h+K.j+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < y.(+B u X.u m+X.X.X.6.X.X.X.Q.>.Q.6.6.e+Q.Q.>.z+) + z+;+;+) - ;+- a.]+a.a.a.]+]+]+a.a.]+]+A M.M.]+A ]+A A A A A + + A A ]+]+A + M.4.c+M.;+]+]+]+A A A A A A + A + ]+z+o.g %.i.y+U ;.+.= ] :.:.F C.2 , 7.V z 7.v.r+7.7.v.v.^ l r+7.7.7.^ B+h+~.~ ~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < J %+}.u X.B u X.X.X.X.6.6.X.<.>.- X.6.e+e+- - Q.e+;+;+4+o.;+a.a.- a.- a.a.a.a.]+a.]+]+]+A A M.+ A A A A A + A + A A + A A A A A A 4.c+4.M.+ A A A A A A A A ]+A A A + ;+) i.i.m U U .+G C.h.C.C+E 5+7 ,.7.^ r+r+&.l 4 v.l+l ^ ^ l 7.^ 7.v.I.H #+< 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 < t.'+@.u X.B u X.6.e+X.X.e+6.>.Q.6.e+e+- e+e+e+- - - e+R 4.c+o.M.4+A ]+]+a.a.a.a.a.]+A ]+A + c++ A + A A + + A + A + + + M.+ + + + 4.M.A M.4.4.M.+ A A A A + A ]+A ]+A R >.o.i.i.i.B }.y+G .+7 r+,.7.^ r+r+l ^ ^ l y+&.r+! l+l ^ v.l v.4 ! _.h+s.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 ~ N.n @.u u m+X.X.X.e+X.X.X.6.J.e+e+e+e+e+e+e+- - - e+- - >.R R - ;+) 4++ A A ]+]+a.]+A ]+A + |.A A + A + + + |.+ + + + + A + + + + > M.A + + + M.> |.M.A A A + A ]+]+]+]+4+) <.<.g A+( B+U 7 r+^ ^ ,.7.^ ! }.v.l &.v.U _.r+v._.v.^ l ^ 7.l ! (+K.#+< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < i+'+8 @.u B X.X.X.X.e+X.X.e+;+<.X.e+e+e+- e+- - - - R z+4+- a.]+]+a.;++ 4+4++ M.M.A A 4+;+> A + + + + + + |.+ + + |.|.+ M.M.+ + M.4.|.+ + + + + + |.|.|.|.+ A A ]+;+]+R 4++ - R - m m m p.@._.l+^ ^ l &.v.&.y+y+! l+&.y+! l+&.l 4 l 7.&.V &.l+h+#+< < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < U.A+B @.` m+X.X.6.X.X.e+6.X.>.- e+e+e+e+e+- e+- - - - ;+) - - ]+a.R ]+;+]+;+A z+4+4.4.M.+ c++ + A |.+ |.+ + + |.|.+ + |.+ M.|.M.> c+M.M.M.M.M.+ + M.|.4.4.4.M.+ ;+]+a.+ 4+;+R - - R >.i.m p.8.! }.p.v.! l+! l+U &+l+_.y+y+&.r+l+7.l ^ 4 7.l ! 9 ^.~ < 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v < ~ U.'+B p.` m X.X.X.X.e+X.e+e+;+e+e+X.e+e+e+- e+- - - - ;+) R - ]+]+]+a.]+a.R ]+A A ;+A 4+> > > |.|.+ + |.|.|.|.M.|.|.M.|.|.|.4.|.^+|.M.M.M.|.|.M.M.M.M.M.+ M.4.4.c+A ]+4+z+a.R a.R - - >.m B u v.8.l+}.U }.l+y+5.B+U B+v.l+! 7.v.l ^ ^ 7.^ 4 ^ ! t.#+< < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 ~ i+'+@.p.B ( m+- X.6.X.6.X.>.>.e+X.e+e+e+e+e+- - - - - z+4+a.a.a.a.a.]+]+]+]+]+]+]+A A + 4.M.|.|.> > > 4.|.|.|.|.|.> |.4.4.4.> > / 4.4.|.4.4.|.|.|.|.M.M.4++ 4+4+4+M.4.c+A a.]+a.a.;+a.R e+m+B @.4 }.l+U F+g+U y+y+g+U r+^ l+v.7.&.^ ^ 7.v.v.4 ! N.; ~ < < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < ~ N.n @.p.B ` u m+>.a.e+6.X.R <.e+e+e+e+e+- e+- - - - - z+;+a.a.a.a.]+]+]+]+]+]+]+A ]+]++ > 4++ M.|.|.|.> ^+/ / > c+> > > > 4.c+^+> > > > > > > > > |.4.M.M.M.+ + ;+4+> 4.4++ ;+]+]+a.a.;+- >.>.( @.}.}.B+[+9 g+U l+_.y+l+4 l ! 7.^ r+4 l l r+l l y+~.~ < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < ~ t.H.B p.m ` X.X.6.<.R <.e+m+Q.X.X.e+e+e+e+- - - - - - 4+;+- a.a.]+]+]+]+]+]+]+A A A ]+A c+M.+ M.|.|.|.|.4.c+> ^+^+> ^+^+^+^+> ' > > > > > > > > > > > 4.4.4.M.M.4+A M.+ + M.+ M.M.a.- ]+- Q.` m A+y+B+8 I.I.}+&+_.&.l l+_.7.4 l ^ l ^ &.v.^ l &.v.y.; ~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < < H -.B p.B ` X.X.X.u e+m >.J.>.- X.e+e+e+- e+- - - - a.) R - ]+a.a.]+]+]+]+]+]+]+A A A M.c+M.+ |.+ |.|.|.4.> > > > ^+' / t+' ^+' / ^+^+^+^+> > > > > ^+> > > |.M.4+4.4+A ]+]++ + + M.;+;+- Q.m+A+'+I.'+F+F+g+y+y+y+_.l v.l+^ ^ v.v.l ^ v.&.7.4 v.l+J s.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v 0 < ~.x.U ` B m+X.X.6.6.6.6.e+J.( ) + e+e+e+e+- - - - a.;+4+- - a.]+]+]+]+]+]+]+]+]+]+A + M.4.+ + |.|.|.|.> |.> > > > ^+^+^+^+' o+' ' o+o+' ' ^+' ^+^+^+^+> > > c+4.M.> 4+A ]+]+A ]+A z+4+4.z+m+m+A+A+9 !.!.9 B+y+y+l+U l+l ^ ! v.7.l r+^ l ! 7.v.l l+J j+~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < ~.x.B ` m+m+8.X.X.X.6.6.6.<.>.6.6.4++ A ]+- - - e+- R 4.- - a.a.a.]+]+]+]+]+]+A A A + c+M.M.M.M.|.|.|.> > > > > ^+^+^+/ / ' ' ' ' ^+' ' R.R.R.o+' ' ' ^+> > > c+> 4.4+A A ]+A ]+A ;+a.;+) i.i.A+[+(+Y 1+(+g+U l+_.! B+l+l l &.7.4 v.l ! l+r+r+v._.t.++; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~.x.y+` u B u 6.6.6.6.X.e+<.;+e+e+6.e+<.z+z+z+R R - R 4+- - a.]+]+a.a.]+]+]+]+]+]+]++ 4.M.M.M.M.> 4.4.|.> > ^+/ ^+^+^+' ^+' R.' ' o+o+' o+' o+R.R.o+o+o+' t+/ > > c+M.A A A ]+]+]+;+]+>.) i.'+'+n !.!.Y 9 I.B+U _.! l l+l ^ l _.^ ^ ^ &.! v.l v.l+t.++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < ++1+i.` X.m ` X.X.X.6.6.e+<.<.e+e+- e+- a.R A z+z+) 4+4+a.a.- a.- ]+]+]+]+]+]+A ]+]++ 4.M.+ M.M.|.|.> > > > > ^+^+' ' ' ' o+R.o+o+R.R.R.R.R.R.R.R.o+o+R.o+' t+t+' > c++ + A A A ;+a.;+>.J.g n H.H.1+x.Y [+B+y+5.5.y+&.^ v.! v.4 &.^ 4 v.v.v.v.&._.t.++; ~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < ~.x.A+B u m 6.X.e+6.X.6.6.>.;+e+e+- e+e+e+e+- R ;+;+) z+4+M.+ + ]+a.a.a.]+]+A ]+]+;+M.4.M.+ |.|.|.|.|.|.> ^+^+^+^+^+' ' ' R.R.R.o+R.R.R.R.$ R.$ R.3+o+o+o+' t+/ t+> > |.> 4.M.+ ;+;+z+>.J.'+C x.U.i+h+Y I.U y+y+l+y+}.&.l+l &.r+7.l l l l l v.v.l+t.^.; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 < K.{.'+B m+B u X.6.6.X.6.e+<.<.e+e+e+e+- - - - - e+R ) R R ]+]++ M.|.|.+ ]+]+]+]+]+;+M.4.+ + M.|.|.> > > > > ^+' ' ^+o+' R.R.R.R.R.R.$ $ $ $ $ $ $ $ R.3+o+' ^+t+^+c+M.4++ + 4+4.c+c+c+g i.6 H.1+h+h+U.x.9 B+U y+_.! v.y+l+! l v.7.l v.v.l l v.l l+t.y.s.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v < #+N.'+B @.m e+X.X.X.6.6.6.<.;+e+e+- e+e+- - - - - - ) Q.a.- - a.a.]+A + |.4.c+M.M.4+c+4.M.M.|.|.|.|.> > > ^+^+^+^+' ' o+o+$ $ R.$ $ $ $ $ $ D+$ D+$ $ R.R.' ' ' / 4.4.M.+ A ]+;+A z+) g n C !.{.U.U.x.H.I.I.9 I.U _.l+! l+y+l 7.4 l l l l l l v._.N.^.; #+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 ~ ~.n @.` m @.X.X.X.X.6.e+<.<.e+e+- e+- - e+- - - ;+M.Q.- a.]+]+a.]+]+]+]+]+A + 4+4.> c+c+c+> > > > > > > / / ' ' ' ' ' R.$ R.$ $ $ $ D+s+s+s+D+D+$ D+3+R.' C ' g c+M.M.+ A A A + ;+z+( n H.x.U.N.{.x.(+g+U &+U U U U l+l+l v.7.7.^ 4 l v.v.l v._.t.^.#+#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ; n @.u m m+- X.6.6.6.e+<.;+e+e+e+- e+- - - - - e+M.a.- - ]+a.a.]+a.a.]+]+a.a.A z+c+4.c+c+> > ^+/ / t+t+/ ' ' ' ' o+o+3+$ $ $ $ D+D+D+s+D+s+D+s+D+$ $ o+' ' ' / 4.M.+ + + A A ]+z+J.o.6 1+-.N.U.N.x.(+F+I.U U y+y+l+y+y+}.l l l ^ ^ 4 l l l v.y+N.^.K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < < s.(+@.` ( ` Q.>.- 6.6.6.Q.>.e+6.- - e+- - - - - - 4.- a.a.a.]+a.]+]+]+]+]+]+]+]+A M.4.M.M.M.|.|.> > ^+^+/ ' ' ' o+R.r D+5 s+D+% % % * % % % s+s+D+D+D+c c C t+> c+4.M.+ A ]+;+;+;+J.i.n H.x.{.h+U.!.[+9 (+9 [+I.5.l+l+l+&.l ^ l l l l 4 &.l ! U.t.^.K.~ < < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~ t.A+B m u X.Q.>.z+Q.e+>.;+e+- e+- - - - - - - e+4+- - a.a.a.]+]+a.]+]+]+]+]+A A c+M.M.M.|.|.4.|.> > / ^+^+' ' ' o+3+5 D+D+D+D+% % % % * * * * % % s+D+3+r o+C / > > > > c+> c+c+g 6 n Y 1+x.{.x.Y [+9 9 F+g+y+B+U g+B+y+&.4 ! l l l l l ^ l+{.J ^.#+#+< v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ~ #+%.@.B m+X.u 6.Q.<.Q.z+>.6.6.e+- - - - - - - a.4+- a.a.a.a.]+]+]+]+]+]+]+]+]++ 4.M.M.M.|.4.> |.> > ^+/ / / ' ' 3+3+5 $ D+D+s+s+% % % % % % % s+D+D+-.3+c t+6 c+4.+ A + A ;+;+>.J.%.n n 1+1+{.!.9 9 Y (+F+g+y+U U U l+l+! ^ 4 l l l l l l F+N.J ^.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < #+#+!.B B ( ` X.X.6.Q.>.z+z+R e+- - e+- - - - a.- M.a.- a.- ]+a.]+a.]+]+]+]+]+]++ 4.M.M.|.|.|.|.> > > > / / ' ' ' o+-.D+5 s+s+s+s+% % % % % % % % s+5 -.c 3+t+g c+4.M.+ + A A A <.o.6 n !.{.x.x.x.(+H.1+H.9 (+[+U 5.I.U }.l+v.! l l 4 ^ 7.v.!.N.J ++#+~ < v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < #+b+Y @.( u 6.6.X.6.Q.z+J.J.) z+A R - - - - a.R ) ]+- a.a.a.a.]+]+]+]+]+A A ]++ c+M.M.|.|.> |.> > ^+/ / t+t+' ' 3+-.5 5 s+s+% % % * * * * * % % s+U.-.c 3+t+g 4.M.+ A + ]+A ]+m+>.A+A+[+Y Y Y (+[+!.h+x.(+(+[+! _.B+U l+l+&.v.l l &.l l g+N.J ^.~.~ ~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 < #+#+b+}.A+u u Q.6.X.6.<.;+e+Q.R z++ 4++ ;+- e+Q.4+a.a.- a.]+]+]+]+]+]+]+]+]+A M.|.M.M.|.|.|.> > > > > / / ' ' ' 3+3+s+5 D+s+s+% % % * * * % b+% s+5 -.c 3+6 > c+M.+ + A A ;+R o.i.'+A+F+9 9 9 9 '+H.h+H.H.Y (+g+8 B+U _.l+! l l l l l &.Y t.t.^.s.~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 < #+; j+'+%.m m+Q.e+e+Q.>.>.e+e+e+- - <.;+z+4+4+;+) R - a.a.a.a.]+]+]+]+]+]+]+]+M.4.+ M.|.|.> |.> > ^+/ / t+' ' 3+3+-.s+5 s+% % % % * * * * % * s+s+5 -.c 3+> 6 4.4.4+M.M.c+c+c+>.m i.5.[+[+[+[+F+9 x.N.h+{.H.9 y+U B+B+y+l+&.&.l l l 4 B+h+t.y.~.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 ~ #+~.1+A+g B <.e+Q.6.e+>.<.e+- e+e+e+- R ]+;+o.c+4++ ]+A A ]+]+]+]+]+]+A A A M.4.M.M.|.|.|.> > > > / / t+t+' ' 3+-.s+5 5 s+% % % % % % b+% % s+s+-.-.c 3+/ > / > > M.+ ;+R R m i.A+'+Y (+(+(+9 [+!.{.{.{.!.(+g+5.U B+B+l+l l l l l v.Y t.N.^.~.#+< < 0 =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v ~ ~ #+t.1+%.m m <.Q.Q.Q.) <.Q.e+- - - - - a.]+R o.R a.4+M.|.M.M.+ + M.M.M.+ A M.4.M.M.|.|.> > > > > / / t+' ' 3+-.-.5 5 5 s+s+% % * * * * % b+s+% 5 -.3+' t+6 ) ) + + A ]+;+a.` m+A+A+}+I.8 g+U [+!.h+h+h+{.H._.U 5.U B+l+7.v.l l 4 x.i+t.J ++s.~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < < #+++5 !.%.( B <.<.<.J.m+Q.- - - - - - a.- Q.) R - ]+a.a.a.]++ + + M.+ |.|.c+> > 4.^+> > ^+^+' t+' ' ' 3+3+3+3+5 % s+% % % % % % % % % % s+s+D+-.3+C C > c+) M.+ A A A ;+>.m m A+g+5.I.g+'+F+(+!.h+h+x.x.H.F+y+B+F+}.v.}.l l l _.h+N.t.^.s.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 v ~ ~ #+s.N.H.6 i.m m <.J.>.e+- e+R a.a.- a.- - z+z+a.a.a.a.]+a.]+A ]+]+]+A M.M.c+4.|.> > > > > ^+^+/ t+' ' ' 3+3+r 5 5 5 s+s+s+s+% s+s+s+D+D+D+r 3+' C ' g ) ) z+]+]++ o.c+i.%.A+I.'+9 9 }+B+I.9 (+!.{.{.x.Y g+U [+B+_.U &.4 r+y+!.t.N.y.~.#+~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < ~ #+j+H N.{.%+A+( m ( ( <.Q.- e+- - a.a.a.- ;+) R a.a.a.]+]+]+]+]+]+]+A ]+M.c+M.+ + |.|.> |.> > > > / / t+C ' 3+$ -.-.D+D+D+D+D+D+D+D+D+$ $ 3+o+' t+' g c+o.) o.c+o.i.( m p.@.8 I.I.g+U U B+[+Y 1+1+x.1+(+F+y+_.U y+! ! &._.!.t.N.t.++~.#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < ~ s.~.++J h+Y '+( m ( ` <.<.Q.Q.Q.R Q.- <.<.) R - ]+a.a.]+]+]+]+]+A A ]+4+4.M.+ M.|.|.> > |.> > > > t+/ ' ' 3+-.r r r D+D+D+D+s+$ $ $ $ $ o+c C 6 C g g g g g %.i.B @.B y+U y+8 5.5.B+B+y+[+Y Y Y H.Y F+}.U U U U l+! l+1+i+N.N.++++#+< < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 0 ~ ~ #+++H b+N.x.%+A+g m Q.Q.Q.<.R Q.Q.Q.Q.Q.o.Q.R ;+]+]+]+]+]+]+A ]+A A A M.M.+ + M.|.|.|.> 4.> > > > / t+t+' r 3+3+$ $ D+$ $ D+$ $ $ 3+o+c C c C C %+%+'+8 8 8 A+F+A+'+'+I.8 I.[+9 [+5.B+I.[+9 (+Y Y F+B+y+y+y+y+&.&.x.N.N.N.^.~.~.~ < 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v 0 < < ~ j+++H J N.h+n 6 A+B m+` ` m+m+Q.Q.m+Q.o.Q.Q.<.<.R A A + ]+A ]+]++ z+4.M.M.+ M.|.|.|.|.> |.> > > / t+t+o+3+3+3+$ $ $ $ $ $ R.r 3+c c c c c 6+6+%+%+j.g+U y+8 '+[+'+F+[+'+F+g+U y+y+U 5.F+9 9 [+9 F+5.B+y+l+l y+x.N.i+t.J s.K.#+< < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 v v < ~ ~ ~ ; j+J b+t.H.n ( i.i.m m+Q.` m+Q.m+>.o.m+<.<.>.>.;+;+;+;+;+A z+A A 4.M.+ + + |.|.|.|.|.4.4.> > > > t+' 3+' o+R.R.R.$ R.R.c r r $ c c C 6+%+j.j.@ j.j.@ j.I I.8 B+*+B+y+U U B+F+I.y+l+_.g+F+I.g+B+B+B+l+v.8 x.i+i+t.y.^.j+#+< ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < < < ~ ; ++y.J i+!.[+'+}.y+i.B+i.p.@.p.@.B i.m+>.>.>.J.>.J.z+>.z+z+z+z+4.4.+ + M.|.|.|.|.> |.> 4.> > / t+' c o+c R.3+c r r 5 5 c e e {.N e e 6+@ 9+9+T.!++.+.j.I F+[+9 9 *+I.g+*+y+_.l+! _.B+I.g+B+U l+_.v.Y i+i+N.N.J ^.~.#+< < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v 0 0 < < ~ #+; ~.^.t.{.!.'+B+B l+}.A+A+A+B+@.A+i.@.B m ( m m J.( J.J.J.) J.c+M.+ + + |.|.|.> 4.4.c+> g > 6 / C 3+c c r $ U.r U.U.A.c e 6+6+6+@ @ T.[.[.T.s !+= +.h.i .+}+B+B+y+_._.y+_._.U l+v.l ! y+y+l+l+(+x.N.i+N.J ^.++s.#+~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < < < ~ ~ #+s.++J i+H.9 *+_._.B+_.}.B+B+g+F+A+A+8 A+%.%.%.%.i.( m ( ( i.i.J.o.c+M.c+> 6 / / 6 t+t+t+C C c c c U.c N c } e e N } 9+..........x+x+W...: x+x+!++.-+i }+I.I.A+y+l+_.}._.&.! _.y+l+l+F+{.1+i+i+N.N.t.J ^.s.#+~ < < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v 0 0 ~ ~ #+s.^.J h+(+[+n.&+n.v+7 v+v+&+}+n.5.5.*+F+F+'+%+n '+6 %+6 6 6 %.6 6 6 6 6 6 6 6 6 n n n C 6+c 6+e } } } } } } } } # ..# # # # u+o o u+o e.w.X { = G.G.x .+U i v+_.v+7 ! l+y+g+g+(+h+i+h+N.N.i+t.J ^.++#+~ ~ < < v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v 0 0 < ~ ~ #+~.^.N.p 9 t ;.;.;.F C.$.C.;.t +.x +.I I I j.(+j.F+F+'+'+'+%.'+n C %+%.%+6 %+%+%+%+6+1+e e 6+} A.D.A.D.# D.D.D.D.# D.D.].=+o =+=+=+S d+S w.: { O !+= $+$+h.B.p+h.C.-+g+[+1+h+h+h+i+N.i+J y.^.^.K.K.#+< < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v =.v v v v 0 v 0 < ~ ~ s.s.^.N.1+ +;.F F f+:.B.F /+f+B.= a+2.Z.a+3.D [. +3.j.j.9 j.j.6+6+%+6+c.c.6+6+6+9+6+} } _ # D.D.D.D.D.D.D.w ,+y y 3 y y y y ].y =+=+d+w.e.q : X X E+`.`.O q+_+2.2.2.[+x.i+h+h+t.t.N.J y.^.++s.~ ~ < < 0 v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v =.v =.v v =.=.v v v 0 < < ~ s.++y.N.b. +/+F f+:.:.:.f+L.f+S.:.O q+q+E+b.T.[.E+T.[.{ T.[..._ 9+..} .._ .._ # # w D.D.w w w w y d y y h y y y 3 3 3 3 y y 3 y =+=+S w.w.w.{+w.f : `.S.S.+.+.t  +{.h+U.N.N.t.J y.++~.~.#+~ ~ ~ 0 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v =.v v v v v 0 0 < ~ ~ #+^.^.N.p Z.:.:+:+:.f+9.L.9.q+: P : : : G+).W.W.X X W.W.b.0.8+# # V.# u+u+u+D.D.w ,+,+3 y y 3 y 3 y y h y 3 3 3 3 y 3 =+y 3 y y ].S w.S d+w.q f O S.= Z.t }+Y x.h+i+N.t.J y.^.~.s.~ #+~ ~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v v =.v v v 0 0 0 < ~ s.^.y.N.D a+:+q+~+~+~+9.1.L.q+: q {+G+V.{+w.Q {+d+{+S d+=+,+].].=+=+=+=+].=+y 3 y y y y y y y y 3 3 3 y 3 y 3 3 y =+y 3 y =+=+d+S w.d+Q f P P q+_+Z.2.p 1+h+i+i+N.J y.^.K.#+#+~ < < 0 < 0 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v =.v v v v =.=.v =.=.=.v 0 0 < ~ s.s.s.N.i+D f+S.] Y.Y.Y.P P L.: L.q ).d+g.g.w.{+d+d+=+d+y d y =+=+y y y y y 3 h 3 y 3 y y y y y y 3 y =+y y y =+y y y y y =+=+=+S w.w.{+).L.q+L.L.D 2+2+h+i+i+t.t.y.++K.#+#+~ < < 0 < v 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v =.=.=.=.=.=.v 0 0 < < s.s.y.J ).2.~+7+Y.P 9.f P f f f f f {+d+d+S g.].=+y ].y ,+].y y y y y ].=+y 3 y ].y ].=+].=+].y y ].=+=+=+=+=+=+y ].].=+=+=+y =+g.G+: q+`.2.D b.2+h+i+i+N.N.J y.~.#+#+~ < < < 0 v v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v =.v =.=.=.=.=.v v 0 0 < ~ s.s.t.2+2.f+O 9.9.Y.q.f q f f f f q {+{+G+w.w.{+S g.].d ,+y y y ,+y y y ,+,+].].y y y ].y ,+y y y =+=+y y =+y ].3 y 3 y =+G+G+G+: O O E+b.b.2+k.h+h+N.t.b+^.~.#+~ < < 0 v =.v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v v v v =.v =.=.=.=.=.=.v v 0 0 ~ s.#+2+t B.:+f+P 1.9.9.9.f f f q f f e.{+X e.e.e.e.e.S ].=+d+V.d+=+=+].,+d ,+].=+,+y y =+].y d ].].=+=+=+g.g.g.=+g.g.Q Q q {+f : O `.q+L.L.2+i+i+i+N.t.H ~.~.#+~ < 0 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v =.=.=.=.=.=.=.=.v v < < ~ ^.[+|+C.0+B.:.q+9.: P w+e.f q E.E.q d+e.q e.q w.e.e.d+d+o e.o e.o S d+=+].d+o S o S S S g.g.d+d+d+d+w.S d+g.g.S w.w.e.e.q f 9.9.P b.2+b.k.i+i+N.t.b+++~.#+#+~ 0 0 0 =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v v =.=.=.=.=.=.=.=.v v 0 < ~ 1+&+E C+0+C.$.C.Z q+f f q q q E.q E.q {+q q q q e.e.{+{+S w.o w.w.S S d+=+S o S o o w.w.g.S w.o w.w.w.w.o w.w.q E.f : f : `.`.E+D 2+2+h+h+N.N.J y.++s.#+< < 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v v v v v =.=.v =.=.=.=.=.=.=.=.=.0 < ~ &+v+7 l.E 0+C+-+b f+f+9.L.).q *.q E.q g.q w.w.w.w.w.d+S e.w.q w.w.w.Q S d+o w.w.w.w.S S g.w.e.w.w.e.e.q V.e.q f f f f : P O 2.L.b.2+h+h+i+N.t.^.~.s.~ ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.v =.=.v v v v v v =.=.=.=.=.=.=.=.=.=.0 =.0 Y $.5+|+2 .+T a ;.| & & k+f+q+L.{+{+Q {+g.Q *.E.Q Q Q Q Q w.w.w.w.w.w.S g.Q o w.w.o w.X o g.e.e.e.e.f e.d+q f : : `.: ).q+E+_+2. + +p x.N.N.t.y.~.s.#+~ < < 0 0 =.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v v v v =.v =.v v =.=.=.=.=.=.v v 0 < ++9 7 2 @+l.C+a E 0+C+a )+u.j :.P L.L.P >+q Q d+d+w.Q w.Q g.q w.w.w.d+S w.=+w.w.e.e.e.e.q d+e.q X f X : q X : : : f X L.L.2./+h.C.|+v+&+[+2+i+^.s.++#+~ ~ v v =.=.v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v v =.=.v v =.=.=.=.=.=.=.=.< 2+v+7 E 2 2 C+2 0+C+P.| )+)+& P.j :+P 1.L.9.m.q Q {+q w.Q g.g.=+d+Q S {+{+d+q e.q q q X X d+: X X q V.G+).W.: X W.L.2._+$+p+d.0+C+E C+7 7 n.[+2+^.#+~ < v < 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v v v =.=.=.=.v v v 0 < t.9 5+2 2 0+0+l.P.C+a 0+)+)+)+)+j ] :.:+S.9.: ~+9.f P 9.P E.q E.E.f f q {+{+g.w.{+e.{+V.{+{+V.G+f : : : O f+:.L.q+2.Z h.b 0+| C.a C+2 r.E l.@+5+_.*+1+~.< ~ v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v v =.v v v =.=.=.v v 0 < N.i T l.$.d.P.| C.L a d.P.)+& :.k+<+j '.k+[ O.P P f P P 9.O Y.1.P O 9.O : f P O P `.9.`.q+q+`.`.S.s q+_+_+_+f+Z.C.C.b d.d.P.| E 0+C+a C+l., l.5+T T 7 *+h+~ 0 < v =.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v =.v =.v =.v v v v v v v 0 0 0 < 2+T 7 2 2 C.P.C+F L a -+F F F u.u.u.#.#.'.'.[ z.O.:+9.9.O Y.O f 9.9.`.Y.P L.S. .O 7+S.q+q+O S.S.q+L.2.f+f+= b = -+P.b d.| d.P.| a C+C+l.| C+L l.5+,.5+T 5+&+N.0 0 =.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.v =.v v v v v v v v v 0 0 0 ++5.7 , 0+d.P.& h.F d.| b P.<+& #.#.'.[ [ [ [ [ '.z.O.7+7+7+7+ .~+~+~+O O P P _+9.`.~+9.q+_+S.f+= _+= k+<+F b )+b b | -+b | )+P.b | | d.C+C+C+a a a E r.@+T 7 7 t.y.~ v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v =.v v v v v v v v v v 0 0 0 J .+,.5+2 d.$+b t h.0+l.p+& /+u.#.'.'.'.'.[ [ [ F.~+~+:+[ '.O.O.k+O.z.[ 7+S.] :.] 7+] f+~+k+j <+$+Z P.& C.$+)+C+)+$+| )+k+& | & <+)+)+P.0+a l.0+C+l.a l.E ,.,.7 _.F+h+; < 0 v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v =.v v v =.v =.v v v 0 0 < J U ^ C+E C.& z.P.| 0+d.C+& <+z.#.[ O.[ [ [ O.9.~+F.[ [ [ [ [ O.'.'.O.7+:+[ j '.#.#.O.] j j j u.$+Z P.& b <+)+d.& /+| )+& z.)+)+P.<+)+| <+P.| a P.C+a a C+C+L , 5+7 7 }+2+~ 0 =.v =.=.=.=.0 =.v v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v =.=.v v =.v v v 0 0 0 < N.U T |+C+b & /+b | F -+d.& & :+[ '.#.z.7+~+7+O.[ [ [ [ [ [ '.'.O.O.O.:+[ #.'.'.'.'.7+z.j u.u.j k+$+& )+P.$+& & & z.& & )+F u.)+)+<+P.)+)+P.P.| | P.0+a L l.l.l.,.,.v+7 U 9 h+< 0 < 0 < v =.< 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.v v v v v =.v 0 0 < N.U ! l.0+b P.k+P.d.p+0+C+)+& :+O.[ [ 7+~+7+O.[ '.[ [ [ '.[ [ '.F.~+O.k+'.#.j '.j k+O.j u.j j j z.<+& & u.Z & )+& <+P.& )+<+<+& )+& <+#.)+& <+u.| )+0+P.a a l.| l.r.7.l.E 5+7 }+t.0 0 0 v < =.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v 0 0 < t.y+v.@+$.<+F <+b F C.P.C+| P.#.:+7+7+7+[ [ #.[ #.'.[ [ '.'.[  .:+[ [ '.#.'.'.j [ :+'.#.#.'.#.#.] j & u.b k+& & & j z.u.& #./+u.#.)+P.k+& )+P.j b )+| P.b | L L d.d.a @+,.|+l.7 j.h+~.< v =.0 0 =.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.v v v v 0 0 < t.U 7 , 0+0+/+k+] B.$.F P.)+& & :+~+:.'.'.[ '.[ [ [ '.'.'.[ O.O.[ j #.[ '.#.'.'.7+k+#.j j #.& k+z.u.u.u.b Z & & & j /+& u.u.k+<+& u.u.<+j u.)+u.<+#.)+| & P.C+a L L d.L L @+E l._.v+j.h+K.< v =.0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.=.=.v 0 < ~ N.U ! , 0+d.k+k+f+P.d.;.b b )+#.:.:.[ '.'.[ #.[ #.[ [ #.[ F.:+'.[ #.'.'.'.#.'.:+O.'.'.'.'.u.u.:.'.u.u.u.j :+#.& u.k+:+& u.u.k+k+u.u.u.u./+k+& & u.k+k+)+)+P.P.& | L a P.$., , , @+&.5+.+9 {.~ < 0 =.v 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < N.U 7 , -+d.F #.:.)+C+F $.b & <+:+/+O.O.'.[ [ [ #.[ '.[ O.:+[ #.[ '.'.'.'.'.[ 7+[ #.'.'.#.#.'.:.#.& #.#.#.] u.u.#.'.:+u.u.u.k+[ k+u.u.#.k+/+#.j P.#.k+k+& )+& b )+a a L , $.a @+, ,.7 5+@+y+(+h+~ v 0 < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v v < < t..+! , C.d.k+j f+P.)+p+| -+F <+k+#.k+ .[ [ [ [ [ '.'.F.7+[ '.[ #.'.'.#.'.k+:+:+[ '.'.'.'.'.[ :+#.#.j #.j :+u.#.u.j /+'.u.#.#.k+:+u.j #.j :+/+u.j u.j /+u.)+)+)+<+)+| L l., 2 E , , 7.T 7 5+.+}+{.y.K.#+v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 ~ t.y+,.v+a P.b k+:+#.C.0+p+a b k+u.j #.F./.[ [ [ #./.~+F.k+[ '.[ '.[ [ #.[ ~+7+'.[ '.[ '.#.#.~+'.#.#.#.#.:+[ #.#.#.#.:+/+u.j #.#.7+k+#.k+j j f+k+j j j k+[ u.)+& d.0+& a L , , l.T T @+7 l+&.i .+5.F+I.(+++< =.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < < N._.,.0+a b b /+[ <+F P.p+a P.F #.& k+[ O.k [ [ k 7+:+[ [ '.[ #.'.'.[ #.O.~+[ [ [ [ [ [ '.[ 7+'.[ #.j #.:.k+#.#.#.j O.:+#.j #.#.k+7+j '.'.j O.:.k+'.'.'.k+F u.)+| )+b d.a , , C+7 v.7 _.7 7 l+i i _.&+*+p ++< 0 < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 < N.U ,.|+| P.b B.'.k+F -+h.| )+/+j #.'.'.:+~+O.:+~+F.[ '.'.'.'.[ '.#.[ [ 7+7+'.[ [ [ [ [ '.:+7+'.'.#.'.j 7+k+#.'.#.#.O.:.#.'.'.'.'.~+[ j O.'.k+7+f+z.k+'.#.z.k+)+| a | a l.$.|+|+7 7 7 7 ! |+_._._.|+.+&+*+h+~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < ~ t.5.r+2 C+<+u.:.k+/+<+P.p+a a F k+k+#.'.O.O. .~+O.[ [ '.[ '.[ '.[ '.[ ~+ .O.[ O.O.O.O.O.'.~+O.[ '.'.'.k+~+'.'.'.'.'.'.:.'.#.'.#.'.7+:+'.z.O.k+ ._+] z.j j b <+<+| | L L l.v+|+! 7 |+@+T 5+T 2 7 l.G v+G G Y t.~ < < =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 ~ t.*+5+$.0+F P./+k+:.P.b h.0+C+C.P.k+#.#.[ F.~+~+O.O.'.[ [ [ [ #.[ '.7+ .F.O.7+O.O.[ [ O.O.~+:+'.'.#.'.[ ~+#.#.[ #.'.'.7+'.'.'.[ [ [ 7+O.[ O.] 7+S.:.] z.j P.P.b d.| l.0+G.2 T 7 l.|+@+l.E E 2 l.$.-+$.|+$. +Y K.~ ~ < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < N.U ,.0+0+/+F f+j :+b b F C.-+0+P.b :.'.#.Y. .~+ . .F.[ #.[ [ [ [ O. .~+O.O.7+O.F.O.F.O.7+Y.O.[ [ [ '.k+k '.#.'.[ #.'.7+[ '.'.'.[ k+~+O Z ] ~+S.S.q+O z.j j d.& F -+C.G.2 l.E 7 E l.l.G.G.-+-+-+b 0+P.0+.+G }+N.~ < < 0 =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < t.U ,.C+l.F k+:.:.~+/+F p+;.0+-+u.u.:.k+[ Y.[ [ O.~+k  .[ '.[ [ [ ~+7+O.O.O. .7+ .O.F.O.Y.7+O.[ [ [ '.k+Y.#.[ #.[ '.[ ~+:+'.[ [ O.Z ~+P S.S.O O _+_+S.] k+<+b b C.G.;.0+E l.0+G.G.p+G.F C.b & 0+j P.d.-+C.v+n.Y ~.< < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 ~ t.i ,.$.a <+<+j /+j <+F )+$.a ;.b & j :+:+F.7+[ [ [ 7+Y.Y.F.[ [ O.Y.F.O.O.7+7+ ./.7+F.7+P ~+O.O.[ [ [ k+Y.[ [ [ [ '.'.~+O.[ [ O.] 7+S.q+L.O O `._+S.q+s ] b -+b ;.0+0+G.-+b -+-+C+h.d.b b P.F j F P./+)+$.G.G }+h+~.< < v =.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.v v < N..+,.$.| P.<+F :.b b b C.P.C.$.0+& #.[ 9.:.'./.F.[ [ [ F.Y. .[ 9.7+[ 7+F.F.F. .F. .F. .P 7+O.O.F.O.O.O.~+[ [ [ '.[ '.[ 9./+:+] S.7+S.P L.q+: q+E+O s q+= $+b d.C.p+0+b C+p+P.b )+= & $+Z b ] <+/+u.F P.d.C.G x p J ~ ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v 0 0 ~ J l+@+2 C.& <+u.B.j /+P.d.0+0+| C.)+& '.:.~+7+[ F.F.F.[ [ O./.Y.P 7+O.F. . . . .k  . .Y.P 7+O.O.F.[ z.O.P [ [ [ O.O.[ z.q+O.] 7+O O q+: G+: : { { s _+_+s = b b G.b b G.d.h.p+B.b :.b F ] j f+j :.k+j /+C.C.2 $.j.{.~.~ < 0 < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < y.! r.2 -+d.F P./+<+B.P.C+C+C+r.C.& & #.:+~+~+F.F.[ /.F.[ [ :+m.m.~+~+ .7+F. .Y. . . .9.Y. . .7+7+[ O.O.9.z.O.O.O.] O.7+P S.S.O `.: { X W.W.W.: { T.s s 2.2.p+b = B.B.$+<+b <+= <+S.$+] ] k+q+z.] ] P.:.b P.0+;.G 1+s.#+~ 0 < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.=.v 0 ~ {.! 7 .+C.b <+<+j b <+P.0+$.$.E 0+P.u.u.:+7+7+Y.k F.F.F.F.O.F.Y.F.Y.9.9.Y. . . .k Y.Y.f 9.O  .7+k 7+O.7+P 7+ .7+7+7+7+S.P `.O `.E+: L.X W.# # W.L.: T.2.T.E+2.a+C.$+$+$+= $+$+= $+_+z.S.S.O.S.] :+S.u.k+<+p+h.h.v+p ++~ #+< 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < s.I.l+|+$.C.h.F B.k+k+<+F C.0+$.l.C+C.u.#.:.:+[  .Y. .F.F.F.O.~+Y.F.F.k Y.K m.9.Y.Y.Y.Y.:  .O k  . .7+7+7+: ~+ .O O  .7+S.`.: : : X W.W.W.V.0.n+u+n+V.b.L.[.2.a+C.<+p+= <+_+$+= S.] q+Z S.q+]  .S.:+S.] ] f+<+F -+G  +h+s.~ < < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.0 0 0 ~ U ! |+L C.P.F :.F :.F p+C.E v+E E 0+& k+:+:+O.F.O.k Y.~+F. .Y.Y. .k F./. .9.w+f 9.P w+P Y.Y.O Y. . .~+O 1.`.P P P : P : L.).b.).V.g.V.0.V.0.0.W.W.W.T.E+2.[.Z.h.a+:.= $+s Z S.s ] : ] ] P 7+S.: ~+_+9.7+_+b h.P.h.}+2+++~ ~ v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 v 0 #+_.5+|+l.P.P.<+k+P.<+C.d.0+l.l.7 E C+& k+/+:+k+[ [ /.k Y.Y.~+Y.~+/./. .Y. . . .P q.f E.f f m.f f P P : : ).f f q X ).q ).).V.W.W.L.).G+V.V.0.0.# # # x+E+E+[.2.a+= B.f+= _+$+s `.S.: s `.: q+P ).P ~+f+[ :.z./+b p+x 1+y.s.~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v ~ N.7 ,.l.p+d./+<+k+k+k+<+0+0+v+T |+r.$.)+P.:+7+[ F.[ F.O.k 9.m.m. ./. .k Y.Y. . .Y.k Y.1.P f : w+q.m.f m.P ).`.: P : : : X W.V.X G+V.G+V.V.V.,+V.V.G+# W.T.T.[.3.2.$+a+s = E+= s E+!+W.: E+W.L.L.q+7+S.9.7+O.f+B.P.p+7 Y J s.~ ~ 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < F+&.7 L b )+k+<+b /+& F 0+l.2 7 7 |+0+)+& & /+O.'.F.F./././.Y.>+m.k  ./. .Y.Y.Y.9.Y.q.>+w+1 9.Y.9.Y.q.9.q P m.q.f f f f q f g.).e.V.G+V.V.V.].0.u+u+# # ..[.[.D D 2.D 2.T.T.W.E+b.: b.q+: 1.`.`.f O S.: 7+~+~+j :+& G &+i+++~ ~ 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.0 0 < 5.7 l.|+P.P.F <+<+k+<+b 0+2 T T 7 7 0+-+& & :.:+k '.F./././.K m.~+w+w+K Y.Y. .Y.9.Y.f q.9.9.q.q.q.q.P 9.w.P : f f f f q X q g.G+o V.G+o V.0.8+D.V.V.u+u+b.x+T.D 2.a+q+Z.L.s 2.E+E+E+W.s s ).: `.: : S.f 7+7+f+j :.b C..+i+~.#+~ 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 v ~ B+5+@+$.)+/+#.k+/+P.k+0+P.|+T r+T 7 2 F & )+/+k+F.[ [ [ /./.Y.K  .k 9.q.w+f q.9.K w+1.q.9.P q.P P q.f P w.f f f q X q q X G+0.G+V.V.V.u+V.V.8+D.u+0.D.n+_ _ b.9+2.a+E+!+L.[.E+E+W.q+W.{ `.).: P P q O f S.O._+<+:.P.G._.p ^.K.#+< v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 0 y.y+T r.C.C+/+P.F F u.F 0+0+l.7 &._.i T 0+P.)+<+:+7+7+O.[ F.k Y.m.k k k k Y.K q.q.f : q P P 9.q.9.q.f P f {+f f f q f : X ).G+0.V.u+u+u+].u+8+8+8+8+D.D.D._ _ b.T.a+= 2.!+T.E+E+T.b.{ V.{ : W.X : : q S.: O 7+9.z.:.)+0+7 [+t.K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< 0 #+!.&.l.7 0+P./+P.k+F <+F b 0+E 7 7 (+p |+C+C.d.)+/+k+~+/.F. ./.Y.m.k Y.1 k k /.Y.K q.w+{+E.q q Q q Q {+q {+g.{+V.{+w.g.S d+d+0.g.V.V.g.u+].0.].W D.8+d+u+# W...T.D :.= E+S.T.E+{ T...{ _ X x+e.X : : : q+O P 7+_+] $+b 0+l+I.t.K.~ ~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v y.*+&.7 $.C+<+b k+F F C.<+$.2 7 7 l h+h+7 a p+P.0+/+#.'.7+~+/.F.k m.k k k Y.1 Y.k Y.Y.9.1.f >+E.f f E.>+>+).{+q q q ).q q e.).g.V.G+o G+o o o 0.0.u+u+u+V.W.b.b.E+E+a+= E+s W.T.{ b._ x+n+: { W.X { : : `.S.: 7+S.] P.F l.7 9 t.~.#+< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v ~ {.y+l+0+G.$.k+P./+u.b F C.C.C+7 7 l h+h+7 L 0+-+b /+#.#.[ ~+k k 1 w+k 1 k k 1 Y.1 K K 9.Q K m.q.q.q.q.f q.).{+f f E.q q q q e.g.G+e.o G+o o o =+=+V.o o o # u+b.T.D S.a+E+a+W.T.T..._ W._ X X G+X : : X `.S.: 7+S./+& <+a _.H.t.++; < < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < v ++F+v.&.C+$.F B.<+:.F F /+C.C.E @+5+&.{.h+v+E C+0+C.F #.j '.[  .Y.Y.K k 1 1 1 K 1 Y.Y.K 9.E.P q.q.q.q.E.E.f Q w.f q q w.q q w.q g.G+e.e.o e.o o =+D.o u+# o W.0._ E+E+= = L.f+b.T.T._ _ x+n+W.x+V.X : X ).`.O : ] q+] b F C+n.h+t.~.j+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.#+N.y+T r+C+C+0+b f+F F B.C.$.a |+7.5+! U.i+2 G l.-+)+<+B.#.'.F.[ k m.m. .1 1 1 Y.1 1 1 K f K K q.q.E.q.q.f f Q q E.f q E.q q e.d+d+e.w.w.o S o g.=+V.S S o o X V._ f+E+:.a+E+!+W.E+b._ _ _ # # ..# # : X W.P O : 7+Z _+$++.l.I.h+J y.; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< v #+[+5+r+T l.P.b b <+<+b k+C+P.E 2 ,.l y+h+h+v+G r.0+0+)+:.#.#.'.[ k m.w+K Y.1 K K Y.1 Y.K >+f P K q.q.q.f E.E.d+q q q w.q w.q e.d+o e.o w.e.o G+=+].o o u+o e.W.W.b.a+2.= = Z.:.W.T.x+..n+# _ # W.W.G+x+: : : O : O 7+_+k+C.l.j.h+J ^.; #+0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ~.y+&.5+E a 0+C.<+P.<+b C.C+C.l.l.! T [+h+i+.+.+E C+d.| F k+<+#.'./.Y.m.K *.>+w+w+q.K Y.1 1.q.q.9.K q.q.f f E.d+E.q q q q w.q w.d+S e.S S o S S ].].u+S o e.X W.T.L.!+!+= s S.= W.T.W._ n+_ _ n+....V.X x+X X q+: q+S.f+C.G.l.(+i+J ^.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v ~ 1+v+T l.r.0+P.P.F b <+P.P.P.0+C+5+7 l+Y i+i+5.7 2 C+C+| )+B.F '.[ [ k K m.k 1 K K w+1.*.1.1.f P q.E.E.q E.E.q Q q q E.w.q w.w.w.d+o w.w.w.o o d+=+d+S u+o V.V.V.{ { a+= $+!+= S.b.T.T._ _ # _ D.# W.V.W.X ).G+: ).q+_+] b C.v+H.N.t.~.#+< 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.^.y+7 @+|+| 0+b P.<+P.F P.0+b a C+@+l.l+H.h+i+9 7 v+0+C+| )+F F k+O.[ F.m.K Y.K Y.K K 9.K K q 1.q E.Q q Q {+Q Q g.Q w.Q Q Q d+d+g.g.g.d+d+d+d+g.].,+=+d+d+u+e.V._ L.s a+= $+!+= = T.{ T._ _ } # n+# # 0.V.G+b.X q+X 7+S.= & ;.;.x.t.t.~.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 H.v+5+E | p+)+C.<+P.P.F <+d.C.a $.5+T 7 (+i+N.2+T .+|+0+| )+<+P.j :+[ [ m.Y.1 k K K K K q.q.>+w+w+q.q.q.E.E.1.Q Q Q Q w.Q d+Q d+g.].g.g.d+g.=+=+,+=+g.].u+d+W.).b.T.E+!+!+a+T.s E+V.W._ D.A.D.A.w n+# u+T.X W.: q+X ] f+= b $.I x.t.J s.; ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 t.y+_.,.0+l.P.P.<+F u.#.C.b d.C.C+-+T 5+_.9 i+N.i+7 |+l.$.| )+C.#.#.:+O.O.Y.Y.1 1 1 K Y.1 1 9.q >+q.q.q.q.E.E.q {+Q q Q w.Q Q Q w.g.d+G+S w.w.V.d+].d+o S o e.V.W.W.T.2.= = = 2.!+s b.W..._ D.} # D.# # u+W.X W.X `.W.S.O = $+E I x.t.y.s.~ ~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 Y U ,.2 l.P.)+b <+F P./+b b b d.d.C+@+@+_.9 i+N.h+7 v+, $.| a & k+& u.[ :.9.~+/.1 1 K 1 K K K >+q.q.q.E.E.q.E.q Q w.q w.q w.w.S S g.S o S o S w.=+=+u+=+u+e.o G+X E+E+!+p+h.b s = s T.W.....A.# N D.....D.X { W.W.O : S._+$+h.2 j.1+J y.s.~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 =.v =.v i+g+7 2 a d.C.P./+P.#.<+k+#.<+F C+C.a |+^ l+Y N.N.1+*+v+r.C+P.C+& <+& u.j :+9.~+/.1 k 1 K K K K >+q.K (.(.E.E.E.E.Q Q Q w.Q q Q w.g.d+w.w.w.w.S o y =+w.d+S o o V.`.`.E+Z.h.= <+Z E+O # T...# # # # A.# # # X x+X : E+: ] S.Z h.v+j.2+t.^.~.~ ~ v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< =.< < !.l+&.2 C+d.b P./+F k+k+P.P.P.<+)+-+E 7 @+7 Y N.t.2+*+2 r.a C.C+& F u.u.#.j :+9.Y.9.K 1 K K 1 K >+E.q.q.E.E.*.q Q Q w.E.w.q Q S *.g.d+S S S S S d+g.S S d+o e.e.u+: `.E+!+h.= $+Z E+!+W.x+x+# A.# # D.# x+u+W.X X { `.: S._+$+h.x (+i+J ++#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v ~ v t.U T T l.0+P.b <+<+<+<+:.#.k+P.C.)+0+C+7 v.l+Y N.N.2+&+T E a C.)+P.k+b P.j #.k+9.Y.Y.m.(.(.(.K (.1.E.q.q.(.E.E.E.Q Q w.q Q w.q Q S g.g.Q S S w.w.=+d+S S S o o o e.{ s s Z.p+G.Z Z E+s W...x+# # # # D.....V.x+X W.`.`.: S.a+$+C.x c.N.y.^.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < !.l+.+|+l.P.<+b :.P.F #./+<+/+<+P.b b $.l.7 l+Y N.J 1+&+5+2 L P.| )+/+<+u.j '.k+~+:+ .k 1 m.(.>+*.q >+E.E.E.E.q E.Q w.Q E.Q Q w.Q d+d+w.S w.w.o S ].d+S d+S e.o u+e.X `.= a+p+-+Z = E+s ..x+..# } ..# D.....# x+{ W.`.`.`.S.S.C.G.t (+N.y.++#+~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.0 < < Y i T v+$.0+C.#.b k+<+/+<+k+& /+<+b <+$.$.T 7 l+Y N.t.H.v+r.2 L C.| )+k+/+u.#.j [ 9.F.F. .k K 1 w+w+Q q *.Q Q *.w.q d+Q w.q w.w.w.Q d+S w.w.S w.o =+=+o S S S S o o X X `.!+a+h.G.] Z `.s x+..x+# D.....n+..x+G+x+{ W.s E+S.] = p+0+n.p t.^.~.~ ~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ~.U l+E r.C+C.k+b /+k+k+/+:+k+<+/+/+F F d.0+@+7 ! Y N.i+9 v+T 0+L C.)+)+b /+k+z.'.k+7+7+F./.1 K K K K >+>+E.*.q Q Q Q d+Q w.w.Q w.Q Q =+d+w.S d+o w.=+u+o S S o o u+e.X X { !+a++.-+a+Z s { [.# x+} # ....u+..x+# { { { !+: ] ] = p+0+&+p t.y.~.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 (+7 7 C+l.0+P.F k+:.:.:./+f+k+:.<+/+P.F C+0+@+! 7 Y N.h+.+7 7 0+L b )+)+& /+k+:+7+[ [ m.k  .k 1 K q.(.Q >+(.E.*.*.E.*.Q Q d+d+d+Q S Q =+=+g.d+d+S {+d+g.S =+S d+d+o G+e.e.X s +.G.2 $+<+!+E+{ # @ # # ....# x+x+W.{ { : S.E+Z = = h.-+*+p t.y.; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v N.&+r+7 E 0+$.)+<+<+k+P.:.P./+#.:.& <+P.F C+$.T 7 _.H.N.2+_.5+7 C+a <+)+)+& ] <+#.:.7+7+Y././.1 1 1 K K *.E.E.(.(.E.E.E.Q {+E.*.q Q g.=+g.g.=+g.g.g.=+].=+u+g.=+=+=+g.0.V.q X { +.+.G.a+b ] { s # @ # # ....# x+x+G+{ { T.= E+Z ] F +.;.}+h+y.++; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.0 =.0 < (+2 7 E C+<+)+/+& :+<+/+<+k+/+& :.<+F )+B.d.0+E 7 _.!.N.2+G 7.a p+C+C.d.u.u.:+<+#.'.F.k m.F.k k K 1 (.K Q (.(.E.(.E.E.q Q E.E.w.*.w.Q Q Q Q S S S w.=+d+=+w.g.g.g.=+G+e.X G+L.`.h.p+p+b = = { !+..x+..} ....# x+x+W.{ { { = E+= a+$+G.;.F+N.^.^.#+~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v 0 =.=.=.v v v =.=.=.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.0 v < v i+*+@+C+C+C.b P./+u.:.<+:.#.[ :+#./+j F P.b d.C.a _.g+{.h+(+.+r.l.0+0+F d.& u.:+k+'.#.[  .m.Y.Y.1 1 1 K q.*.>+q.(.*.E.*.Q Q E.*.q q q Q =+Q Q Q S {+d+g.w.S S d+=+=+w.e.e.W.G+q s = G.-+0+= = { s ..x+......x+# { { X { E+{ !+E+] = p+0+.+[+N.y.++~ ~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.v =.=.=.0 #+++J ++; < v =.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v s.h+7 |+l.-+b b <+<+/+/+#.f+j :.k+:+k+j F F & & C.a _.9 h+2+G T r.C+L | F P.& u.:+k+#.[ [ F.9.Y.9.q.q.1 K K *.>+(.q.E.(.E.E.Q E.E.*.E.Q Q d+Q w.S S Q =+g.e.o S o g.g.e.e.e.o e.: : !+p+-+0+= = E+!+x+T.x+} ....# x+{ W.E+: { s E+Z = G.2 .+Y N.y.++~ ~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ~ i+9 I.5.5.5.g+(+i+#+=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v ~.N.I.v+r.l.0+& b P./+j :+k+z.:+k+~+'.7+#.k+z.F d.& P.2 5.1+N.h+.+5+E C.a | /+k+k+#.:+'.'.[ [ F.9.Y.Y.K (.(.w+(.>+(.q.(.(.q.E.E.Q q *.q E.w.Q S Q Q Q d+w.=+w.o w.S S g.d+e.e.e.u+e.q X q+$+G.;.h.= !+!+[.x+x+# ..x+# x+W.# : T.E+S.s = h.G.G.G h+t.^.K.#+< v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.t.H.g+5.9 Y H.Y [+5.5.H.J 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v ^.F+I.y+_.v+, 0+P.F P./+:+z.'.f+j /+:.#.~+#.F <+F & 0+)+E *+{.N.h+&+r.L C.a | <+P.:+k+:.k+'.[ [ /.Y.m.k k K (.(.*.Q *.E.E.q.q.E.Q E.E.E.*.E.w.Q S w.S w.d+S ].w.o w.o =+=+S e.e.S o X q X q+b 0+G G.a+{ T.x+_ .._ # # u+..X b.E+s s = S.$+p+0+G I N.J ++; #+< v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.v =.=.t.[+U (+i+b+J y.++J i+(+B+F+N.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 v =.y.[+y+! r+l+7 v+l.C+0+F <+<+/+k+:.<+:+:+k+:.<+/+& b d.$.| l.[+U.i+Y G l.a P.)+& k+u.#.'.~+[ [ [ F./.Y.w+Y.1 1 1 K (.Q Q *.*.E.q.E.Q E.E.E.*.q Q Q w.Q w.Q d+g.g.e.w.w.S y d+e.e.e.d+w.X e.).`.<+2 v+d.h.!+{ [.# ..# # ..# x+x+W.`.s E+= !+$+p+2 i }+N.J ^.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.=.=.=.++F+5.!.t.^.y.t.^.t.y.~.t.!.U [+^.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 i+B+l+r+^ l T v+C+G.d.F d.<+$+z.<+k+B.<+/+k+b B.d.P.C+$.$.v+I.{.x.n.2 l.0+)+)+<+<+j u.#.~+:+:+[ F./. .>+1 K K 1 1 (.>+>+*.*.*.E.*.Q E.Q *.*.E.Q S q w.w.w.Q =+w.w.o w.d+].d+e.o o d+q e.e.G+`.] G.v+p+= a+!+!+..[.....x+# { { W.s s s S.= b h.l.|+9 N.J ++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.< !.I.Y t.++J y.y.y.y.J t.^.y.H.g+Y < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 t.I.&.l r+l ^ ^ 7 |+;.h.C.P.B.& /+F b :.P./+b P./+d.G .+G |+7 l I.Y &+E L p+| )+k+u.u.#.j :.:+ .~+/./. .>+k 1 K K (.K Q >+K q.>+1.Q Q *.Q q E.*.Q Q q Q S Q d+].w.e.o S =+S o o S g.e.e.e.S P O !+h._.G.+.= [.{ ..T.# x+x+..x+x+W.s s !+!+h.P.h.l._.Y t.y.~.#+~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.^.I.9 t.H J ^.y.H y.b+y.y.t.++t.(+I.J =.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 [+&.l ^ r+^ 7.T ^ 5+U $.+.t +.+.B.B.h./+/+B.h.C.+.;.;.G T ! r+v.! 7 @+0+a p+)+| /+<+u.#.k+7+/.O.Y.K k ~+1.1 1 K K K (.*.>+(.(.E.K Q Q Q Q Q Q Q d+q Q w.Q w.=+d+S w.e.S =+g.w.e.d+u+e.e.e.V.P f = 0+|+i -+= { !+x+......x+x+# { W.{ s S.!+<+$+2 |+.+h+t.y.s.~ < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.h+8 x.b+^.y.H J J J J H H b+H b+1+g+{.v =.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< i+&.l+7.v.,.l v.^ ,.v.7 2 $.$.;.p+$.F $.$.p+C.p+G.$.$.E |+7.l r+l _.l+T 0+$.d.| P.<+#.j #.[ 7+O.[  .k Y.m.1.k 1 1 (.K (.E.q.q.q.(.q.Q Q *.E.E.q Q d+Q Q S Q g.g.S w.e.e.w.g.d+e.o d+w.e.V.g.{+: E+= x p I p+= s !+T.....# x+x+# { X s s s !+h.= 2 |+&+h+t.y.K.#+< v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 9 5.N.H b+y.^.y.^.y.y.y.^.H J H i+g+(+< =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < F+l 7.^ l V l 7 &.v+! l G.v+2 ;.$.l.;.C+C+G 2 $.2 T l.@+,.@+r+r+l 7 5+7 L C.d.| <+F u.#.'.:+~+[ [ F./.k Y.>+1 1 1 K K *.>+q.(.q.(.E.Q E.*.E.E.E.q Q Q q Q Q d+g.g.=+g.].].].=+g.].,+g.g.V.G+: O O C.t 2+j.;.= !+s { # @ # x+x+..{ X s s !+= $+h.2 7 &+h+t.^.; ~ ~ 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.g+I.b+H J y.H b+H y.H b+y.y.J H b+F+g+< =.=.v =.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v x.l+l+l r+r+^ v.^ 7 _.i G v+v+v+n..+2 .+l.l.$.5+7 7 T _.! r+i v.! l+5+5+E L -+C.P.<+k+#.'.#.F.7+F.F.O.F.1 Y.m.>+(.(.1 K *.E.q.q.q.(.E.Q E.E.E.f E.q Q E.q w.Q Q d+{+S {+g.d+d+{+{+d+d+G+e.V.e.P `.S.B.c.1+I .+C.= [.{ ..{ # x+x+..{ x+s !+S.!+Z a+0+v+5.i+J ^.#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.I.I.J b+b+y.J y.++J y.b+y.H y.b+b+[+g+< =.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 ~ [+l+l+l ^ 7.r+v.^ _.l v.v+&+;.t t &+G G v+_..+7 7 i 7 7 7 &.l ^ r+v.7.l.L 0+0+& <+/+k+#.k+[ 7+:+[ /.F.F.k m.1 m.K *.(.(.>+*.q.(.E.(.E.Q E.E.E.E.q Q Q q q q w.Q d+q e.w.d+d+o e.d+g.o e.e.).: `.P = a+p h+Y x p+= { @ # x+....x+..{ X s !+a+= $++.l.2 B+h+J ++; < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.I.5.t.J y.H J J b+J H y.J b+H J J [+g+~ v =.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 {._.l 7.4 v.l _.r+r+! v.7 5._.i *+_.7 &+v+i v+.+v+l+.+&.l v.5+7.&.^ 7 T a , P.-+a b :.j [ #.:+~+F.O././././.m.1 k 1 (.>+*.*.E.q.q.(.E.(.Q q *.E.E.w.Q Q E.E.Q Q =+w.w.o e.g.d+S o o d+e.X e.{+P O q+/+2.2+h+x. +h.= [.!+......x+..# { W.{ `.[.!+h.= 2 2 5.i+y.++#+~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+b+J y.H b+J b+y.y.b+y.J H J J [+g+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 0 1+l ! 7.&.4 _.l+&._.T l 7 &+7 i }+v+l+5._.! ! l+v.l _.5+r+&.l l &.7.r+E r.| d.P.)+<+:+k+:.[ /. .O.[ k /.k 1 w+1 1 1 1 K >+>+>+q.K K E.E.Q E.*.E.E.q Q w.q q w.w.d+q e.e.e.d+o w.o o o q : q q P P q+a+p h+h+h+}+p+= [.[.x+....x+x+# T.W.{ s !+a+$+p+l.7 B+h+y.~.#+< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.I.I.y.J J y.y.y.b+H b+J ^.y.y.b+H [+5.< =.=.v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 J I.v.7.7.v.7.l+r+! _.5.7 5.&+.+U }+i 7 &+_.&.l+i 5+5+l+l 5+T v.r+5+l+T r., d.0+| P.<+u.#.[ 7+:+k F.F././././.>+k K 1 K 1 K w+Q *.E.K (.*.Q q.(.*.E.*.d+E.*.q q Q g.q w.w.e.g.w.e.w.{+S e.X e.: f : 9.:.2+i+N.U.I -++.!+9+.._ _ ....# x+W.s !+!+= p+h.2 7 &+U.y.++~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+H H y.y.y.b+b+b+H J H b+H [+g+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 i+! l+7.v.7.l+v.^ ! y+! 5.[+F+j.[+5.y+y+5.U 7 _._.&.v._.! &.! y+! ! 7 7 r.C+0+)+| & /+u.#.'.F.9.:+F.F.F.F.k (.1 1 k K 1 (.1 *.>+(.Q *.1.1.E.*.E.E.q f g.1.q w.w.Q w.q w.w.o d+e.e.o g.f q : V.Y.P L.f+p N.i+N.N.I 2 +.= { T.# @ _ x+W.{ x+s !+!+= $+= | |+U i+y.~.~ ~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.y.y.H b+y.y.y.y.y.b+y.J b+[+5.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v h+&.^ ^ &.7.l+4 l }._.! U B+5.B+F+[+j.I.g+8 B+y+B+U _.U y+_._.l l ! ! E 5+l.$.C+0+$.F C.b P.<+2.f+f+f+:.:+:.9.~+k Y.K 1 K K f >+(.K q.>+Q q >+L.f+B.n.;.p+t Z.L.V.w.w.w.w.V.V.w.e.e.V.q X E+T.Z.f+Z.a+p h+h+U.h+I i +.+.3.x+x+x+# T.W.!+X !+!+!+= p+F l.|+U U.^.++#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+H y.y.b+H b+b+y.y.y.H J y.[+g+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v ~ 1+l+^ ! _.l v.l &.i l+_.8 g+g+g+I.5.5.g+5.&+I.F+U B+B+F+B+5.5.5.5.&+5.n.*+&+&+&+}+&+n.&+n.;. +n.n.n.;.n.t t t ;.t ~+Y.1 K K 1.K (.K K *.Q L.2.n.}+9 Y '+A+I.B+n. +E+e.e.w.d+G+w.e.u+# E+2.a+x 5.}+[+F+}+I.g+'+[+8 G x +.3.@ 9+@ # x+W.{ W.s !+!+a+h.= C+|+.+U.y.~.#+< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+J y.y.H y.y.y.y.b+b+H J y.b+b+[+5.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 J B+! 7.v.4 l+_.l v.U _.U g+I.g+Y 9 I.F+(+(+j.F+!.5.I.[+Y I.[+Y [+Y (+Y Y !.9 5.}+H.[+}+g+I.9 (+g+5.g+}+9 H.!.H.j.g+;.B.O m.>+*.K K (.K (.1.2.n.I.x.t.j+H b+N.{.Y &++.T.W.d+=+q E.e.u+D h. +(+F+Y h+i+N.h+9 g+g+'+(+(+*+x I I @ @ 9+x+x+[.X !+{ !+= $+= C+|+y+h+^.~.~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+J y.y.H y.b+H y.b+y.H b+H b+b+[+g+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 y.! 4 ^ l+7.l l+_.U I.y+j.H.h+i+++y.t.t.++^.t.t.s.N.t.J ^.t.^.^.y.~.y.J J ++b+J t.++t.J N.t.H H t.t.t.t.N.J ^.++t.x.[+&+t s f (.(.K (.(.w+2.x F+H.t.y.j+j+j+++^.j+1+g+t [.V.u+X w.e.9+x *+x.J b+~.; b+K.; J J J N.N.J i+(+(+j.I 5.j.@ T.T.x+O `.!+a+$+= 0+$.y+h+y.~.~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+b+y.H y.y.y.y.y.y.J y.J b+[+5.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < t.y+7.7.l ^ v.v.l B+8 j.U.H ^.~.j+~.y.b+++++H ++j+^.++++++^.K.~.s.#+~.++~.; ++H ~.~.y.J J ~.; b+b+b+H ^.b+y.j+++j+j+t.H.I.n.P >+K (.(.K q++.I.h+y.~.~.~.y.^.H j+~ ~.x.n.I W.e.e.e.E+I I.!.b+j+j+s.s.y.#+#+^.y.J b+H ~ K.b+H i+x.%+j.8 I  +[.s s !+a+$+= 0+.+i U.^.~.#+< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+J y.H y.y.b+H b+J y.^.b+H b+y.[+5.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < ~ B+l+l l ^ l &.4 &.5.B+!.^.; ++~.; ; j+K.; ; ~.~.#+++~.~ K.++K.#+#+K.H J ~.~.++~.s.++y.J J ++~.b+H b+b+H H ++j+b+t.++; t.H..+a+1.9.(.(.P a+g+1+^.J J K.H J H H H * j+~.x.F+D V.V.W.Z.[+h+H ~ ++H ++~.J s.s.y.y.H b+++; ++#+~ b+++H h+'+g+I.I a+3.Z.a+= = 0+G.y+h+y.K.#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+y.H b+y.y.y.b+b+y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< ~ l+l l l+7.l }.l l+g+9 t.#+y.y.^.~.y.y.~.~.++++++#+~.++s.^.++++#+++++++H j+J J ~.#+K.^.b+^.j+++y.J y.y.y.J ^.K.b+~.J ++#+t.}+;._+q.(.K P *+6 J y.H H #+J y.^.b+b+#+J H U.5.}+V.V.b.n.9 * ; ; J y.++j+H #+; H b+b+^.H ; ++j+j+H j+~.~.b+J h+(+*+5.S.a+$+!+-+.+y+U.y.~.~ ~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+y.H y.b+y.y.b+b+H b+H b+b+[+5.< =.=.=.=.=.=.=.v =.=.=.=.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.< =.< ~ y+l ^ &.v.v.&.l 8 B+{.^.K.++J ~.j+y.H ++j+b+++++~.y.b+; H b+j+#+#+++b+~.~.b+b+j+~.++++++K.~.J y.J ^.++J b+~.++y.b+J ^.y.K.h+5.t w+K (.a+I.{.J y.y.b+K.++b+y.J ^.#+b+b+b+Y &+D G+ +}+{.H j+++^.b+++~.H j+; y.J y.b+++; j+++H ; ^.~.j+H j+j+H x.F+5.5.+.+.-+0+_.i+y.~.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.b+y.b+y.H H y.y.y.J y.J b+[+g+< =.=.=.=.=.=.=.=.v =.=.0 v =.=.< ++i+1+x.h+N.~ =.=.=.v =.=.v =.=.=.=.=.=.=.=.=.v =.=.=.=.0 #+_.l ^ l l ! l+! B+F+t.~.++J y.++~.b+H ++~.J y.j+^.b+J j+^.b+~.#+~.H ++~.H b+++j+b+b+^.~.; j+^.++J J y.J y.j+H b+b+y.y.J ++N.9 t K (.(.a+[+N.y.H y.y.~.++b+H b+~.++y.y.H !.*+D e.}+(+i+b+~.++J H ~.++H ; ; H b+H b+++; j+; ~.; ++++j+J H ++j+J N.{.&+x x -+.+i h+y.++#+~ 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H b+b+y.b+b+y.^.b+H b+b+[+5.< =.=.=.=.=.=.v =.=.v =.=.=.< t.Y 5.g+F+F+g+I.F+{.~.=.=.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 ~ y+l l l ^ l+&.l+I.9 ~.; ++b+++++~.^.H j+++b+H #+b+b+y.j+^.H j+#+++++j+~.J y.~.++y.b+J ++K.~.++~.^.H y.b+++j+H J b+^.y.y.H J H.*+9.(.q.+.'+t.H b+b+H j+++b+y.b+j+y.H y.++{.}+D e.*+x.J b+~.~.J H j+H ^.K.K.b+y.b+b+++; #+; ++; ++++; H H ++j+~.++++h+}+x x i i h+^.~.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.*+b+b+y.y.y.y.y.y.b+b+y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.v =.=.K.x.5.5.F+H.{.{.x.H.g+B+9 t.v =.=.=.=.=.=.=.=.=.=.=.v =.=.=.0 0 < t._.l l r+7.l+l _.I.[+~.; ~.~.~.++++^.^.K.b+b+y.; ^.b+++~.H y.~.++~.j+~.y.J ++K.y.H H b+++~.b+++~.~.++H y.~.++J H y.y.J y.% H (+*+f >+>+a+'+N.y.b+b+^.~.^.y.H y.K.H y.b+b+h+}+[.o I.H.% H j+~.^.++j+H ++; ~.b+H y.b+H ; #+#+++~.~.++; ^.^.; ~.H b+~.~.j+{.F+F+_.*+t.++#+< v v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+b+y.H H y.b+H y.y.b+H b+H b+b+[+5.< =.=.=.=.=.=.=.v =.v =.#+H.B+9 {.b+b+J H ++J t.H.5.[+N.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v #+F+! ^ l ^ ^ l+4 _.8 5.y.~.++j+~.; K.~.j+~ ~.K.j+#+K.j+#+#+~.j+#+K.^.#+j+b+H ~.~.b+J y.H ~.~.J y.y.~.~.++~.~.H J b+y.J y.y.J * [+*+P *.Q  +F+U.y.y.J ^.j+^.y.H b+j+++b+b+H h+I.[.V.j.[+i+H ~.^.y.b+K.b+~.; ~.J y.y.b+y.j+; ; ++~.~.++j+H H ; ~.++y.K.++b+j+U.[+B+*+N.#+~ #+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+y.y.b+y.y.y.b+y.y.J y.J b+[+g+< =.=.=.=.=.=.v v =.=.0 {.U Y t.H ++y.J b+H J y.t.x.5.9 ++=.=.=.=.=.=.=.=.=.=.=.0 v =.0 v < U &.^ l ^ l v.4 y+8 I.J j+H ^.H ; ++^.++~.^.++++~.^.y.j+^.H ~.; ++b+K.~.H ~.j+y.J b+H ^.j+^.b+y.y.y.y.++K.j+^.y.y.b+y.^.J ^.b+}+n.w+(.E.t I.i+y.b+b+^.~.H H y.J j+++J b+H {.I.D e.@ g+x.++s.^.^.H ; b+K.K.K.y.H b+b+H j+; ; H j+~.~.~.++^.~.++++++++; #+j+~.J (+5.H.J ~ ~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H b+b+H y.b+y.^.y.H b+b+[+5.< =.=.=.=.=.=.=.=.=.=.^.[+F+N.b+t.J H ++J b+H J ++t.H.5.x.0 =.=.=.=.=.=.=.=.=.=.=.=.=.0 < < 8 ! 4 l l l+r+r+l+B+I.U.~.y.J ^.~.b+b+~.++H ^.j+++b+y.j+^.H j+; y.++j+++++~.j+^.J y.^.++++J b+H H J J H K.~.++++b+H b+y.y.y.h+}+a+q (.*.Z.F+N.~.H ++~.~.y.y.^.b+; H b+b+% U.I.[.u+9+I (+N.s.~.H ~.j+b+; K.K.y.y.y.y.++; ; ; ++; ~.^.++~.~.~.^.j+~.; j+H j+~.~.^.1+g+Y t.< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+y.b+y.y.H y.b+b+b+y.y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.0 x.B+!.b+b+H b+J J b+b+b+J ^.y.t.I.I.#+=.=.=.=.=.=.=.=.=.v =.v v 0 < ~ U l ^ l l y+4 l y+l+8 (+t.H ^.j+++b+y.K.H J b+j+^.y.J K.^.++K.K.b+j+y.J y.K.j+~.y.b+H K.++J y.b+y.^.b+y.K.~.++j+^.* J t.y.t.9 ;.2.(.(.*.a+g+U.K.j+~.~.K.J b+H b+; H b+b+b+h+I.D u+n+t *+!.s.~.J H K.y.; j+; b+b+y.b+++; ~ #+K.; j+; j+; ; ; ~.#+~.j+~.++~.~.++~.~.1+g+H.~.< 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.y.y.y.y.y.y.b+b+H y.H b+b+[+5.< =.=.=.=.=.=.=.=.=.< I.I.t.J H b+H b+H b+y.H J b+b+J 1+I.N.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ~ U l 4 r+7._.! v.U y+y+F+H.t.y.#+t.H J K.y.y.y.~.y.b+++~.J H ; ++y.K.++b+j+++++j+~.^.j+++H b+J J b+H J H K.++b+^.K.~.t.^.y.H.A+f+(.(.(.E.a+5.U.b+H ++j+; ^.y.y.J ; H ^.y.H h+*+[.u+D.T.t 5.x.~.H H K.y.s.^.#+J y.y.J ^.#+#+#+++#+s.K.++; ++; H ; H j+~.~.b+; ~.#+; #+9 g+!.~ v < =.=.=.=.=.v 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+y.b+H H b+b+H y.b+y.y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.#+5.9 ^.y.b+H b+b+b+y.H y.H J b+b+{.g+h+v =.=.=.=.=.=.=.=.=.=.=.=.0 0 ~ U l ^ l 7._.l ! y+l+y+B+g+!.i+s.~.^.^.#+b+J ++#+^.H ~.j+y.^.K.K.j+~.^.b+~.++++^.^.~.~.++y.H ^.b+y.J ++~.~.b+J b+H ++~.N.(+I. +~+(.(.*.>+ +5.h+J b+H ~.j+++~.++^.; H J t.J h+*+9+u+8+_ D 5.F+x.N.^.#+~.#+^.j+y.H y.J ^.; #+#+y.~.^.~.y.; ++j+b+j+~.j+H ~.++j+++#+K.~.i+[+I.x.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.y.H y.y.H y.b+y.H y.H b+b+[+5.< =.=.=.=.=.=.=.=.=.++5.H.^.y.b+y.y.y.H y.y.y.b+y.y.y.h+5.x.=.=.=.=.=.=.=.=.=.=.=.v =.0 0 ~ y+l 4 r+7.l+4 ! l+l l+g+U 5.[+{.i+y.y.^.N.N.t.J N.t.b+++^.++^.y.~.~.#+~.; ++H J b+++j+~.++H y.b+H t.++~.++H y.J J s.y.H.U /+m.w+(.(.E.E.Z.g+h+b+H b+++~.^.~.j+++K.~.++J H h+I.9+u+,+u+# 3.n.5.F+H.U.U.N.h+N.N.N.t.b+++#+; #+~.#+++~.y.; ++K.b+j+++j+y.j+~.~.++K.++#+++i+B+F+i+=.v =.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+y.y.y.b+b+y.b+b+y.J y.J b+[+g+< =.=.=.=.=.=.v =.=.++I.(+y.J y.y.H y.b+b+y.y.J ++b+b+h+g+x.v =.=.=.=.=.=.=.=.=.=.=.v 0 < ~ y+&.v.4 v.l 4 ! l+v.l+y+l+y+5.I.I.g+g+I.g+g+g+g+g+A+F+I.8 5.g+I.(+U.++~.~.H y.J H ^.++~.++^.b+b+J y.H ++++y.b+^.^.t.!.g+t P (.K (.(.(.>+a+5.i+J b+y.++++H ^.H ++K.~.++++~.U.*+9+u+8+# V.V.b.3.;.n.*+5.I.8 I.I.I.8 8 1+H ~.#+++; ~.~.y.K.++; b+j+H j+H ~.++j+++j+~.; #+y.x.5.9 t.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H y.y.H y.b+y.H y.H b+b+[+5.< =.=.=.=.=.=.v =.=.K.g+[+^.J H y.H y.y.H b+y.H b+t.H h+g+{.v =.=.=.=.=.=.=.=.=.=.=.v 0 < ~ y+l &.r+l+r+^ ! l+4 ! U ! ! y+U 5.B+g+5.B+5.g+B+B+U I.B+U 5.5.U 5.(+J K.++J H y.H j+++b+H ~.~.++b+y.++j+++t.y.++t.Y g+;.b.).m.K (.(.(.f Z.g+i+J H H j+++b+J J H j+++++++j+h+g+9+D.f.D.8+0.0.0.L.a+2.x +.n.}+9 [+}+I.5.F+9 2+N.++j+~.b+j+y.~.y.K.^.~.++j+^.j+~.~.s.#+K.y.J H.5.H.0 =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+y.b+y.y.y.b+b+y.y.b+y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.~ g+g+y.y.b+b+y.y.H y.H y.y.J H H x.8 U.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < ~ y+v.l l &.! r+_.! v.&.y+v.l+U l+&._.B+l+! l+_.! v.l+_.l 7.l &.! _.(+t.#+K.b+H y.J ; ^.J y.^.++~.++H ~.~.b+b+j+N.(+5.t ~+>+Q f (.K K (.>+ +g+h+y.y.J j+~.H y.J ^.j+b+J y.j+{.*+9+w f.8+0.V.{+G+: L.L.] B.2.D k.N.t.h+(+I..+*+[+x.t.++H #+++j+y.#+H ~.~.~.H ~.~.H #+s.K.^.J H 9 I.i+v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+y.H H y.y.H b+b+y.H y.H b+b+[+5.< =.=.=.=.=.=.=.=.=.0 H.g+h+y.y.b+H y.b+y.H y.b+b+++t.9 F+++=.=.=.=.=.=.=.=.=.=.=.v v 0 < ~ y+v.4 ^ &.l+&.y+l+l &.B+&.l+U ! ! ! 5.l+v.l+y+! v.! }.l ^ &._.U g+x.t.++j+^.H H y.j+++y.H y.b+++~.H ~.^.b+H t.H.B+/+_+K (.>+1.*.(.(.(.f Z.I.h+y.^.J K.++H H b+++j+++y.J ~.x.5.T.D.8+n+# V.g.X f q 1.7+Z _+ +i+^.++++1+}+.+&+&+I.(+x.N.; ++j+y.; H ~.~.j+H ++K.~.; ++; J ^.J i+5.F+~.=.=.v =.v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+y.y.y.b+b+y.y.b+y.J y.J b+[+g+< =.=.=.=.=.=.=.=.=.=.N.g+[+y.H y.y.y.y.y.b+H y.b+b+x.I.Y < =.=.=.=.=.=.=.=.=.=.=.=.=.0 < ~ y+l l 7.l+^ v.l+_.y+y+B+l v.B+! ! ! B+! l+l+y+&.l l+_.r+7.l+U }+H.++~.++#+K.^.y.~.~.b+b+y.b+y.H y.~.~.H ++t.Y B+F+Y.1 K *.(.K E.*.K (.w+ +g+i+J b+H j+++b+H H ++++y.J J ~.{.*+9+D.,+,+V.V.g.{+: X q ~+= f+/+h+^.++^.x.I 2 G &+5.g+8 Y y.^.~.H #+y.++++K.^.b+j+++~.#+~.s.y.y.J !.g+x.0 =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+y.H y.y.H b+b+y.H y.H b+b+[+5.< =.=.=.=.=.=.v =.v =.~ H.B+(+y.^.J b+++^.y.J J y.N.g+8 ++v =.=.v =.=.=.< #+i+N.t.N.t.U.N.N.B+&.l l ! v.&.}.! l U l+U g+8 g+B+B+y+! l+y+l+&.v.U U ! _.y+g+h+~.++++~.~.++; ++++++y.J J H y.b+y.* K.++b+n B+t Y.1 K 1 *.(.K K *.*.Q >+Z.g+h+y.J y.~.++y.J b+K.~.y.J y.H h+5.T.u+8+D.u+# 8+V.q X q ~+] 2.p+i+t.y.y.p t 2 +.G.a+3.I g+5.x.; H j+y.++j+H j+y.j+j+++K.~ K.H y.b+t.g+I.y.=.=.0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+y.y.H y.y.b+y.y.y.b+y.J y.J b+F+5.< =.=.=.=.=.=.=.=.=.=.=.^.(+B+H.N.++++t.t.y.y.++x.g+I.i+=.=.=.v =.=.; h+[+5.F+8 I.8 5.g+g+F+8 F+I.g+[+8 I.I.B+g+I.8 y+_.U &.&.U B+y+U 5.U _.y+l+^ r+y+I.!.++++++++++++^.j+++; ~.^.J y.y.y.y.y.b+; J Y 5.a+:.Y.1 1 (.*.(.K (.(.*.*.1. +g+h+J y.b+K.++^.y.y.~.^.y.y.b+b+h+*+9+D.8+D.D.u+D.G+W.q q 9.] 9.:+2+t.++y.p I |+h.G.I [.c.9 g+I.x.t.#+J ++~.^.K.H j+++^.; ; ~.y.b+J J !.5.x.0 =.v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+H H y.b+H b+b+y.H y.H y.H [+5.< =.v v =.v v =.v =.=.=.=.J 9 g+F+H.i+N.t.N.{.(+g+5.h+< =.v =.=.v ^.[+F+g+(+1+!.1+1+!.1+H.Y U.N.h+x.h+1+6+(+[+[+H.F+g+g+B+y+! y+_.l v.l+&.l l y+7.y+I.1+++y.j+; j+j+++~.H ++K.j+++b+b+b+b+y.H ~.; H.&+B.7+k Y.1 K (.*.(.K q.K (.*.q 2.I.i+y.J H ~.++^.H H j+++b+b+b+b+h+5.T.u+8+D.u+u+D.V.G+q q P S.f+F D i+^.J p n.G.G.h.a+[.9+c.c.5.8 1+#+++++~.^.#+^.~.++++#+j+++^.H b+H t.g+F+++=.v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.F+g+b+y.y.y.y.y.y.y.y.b+y.J y.b+b+F+I.~ =.=.=.=.=.=.v =.=.v 0 =.=.K.1+F+g+g+I.g+B+g+5.Y t.v =.=.=.=.=.t.F+U (+t.^.^.b+J ++b+++H J ~.j+~.H ; ~.K.; H ^.~ N.i+{.F+B+_.y+! &.! _.v.^ l _.U I.{.^.~.++K.++~.; ~.#+^.~.; j+~.++^.H y.b+y.++{.&+t 9./.1 K 1 K (.(.K K (.(.K E.1. +I.N.~.^.^.K.H b+y.y.~.^.H J J H h+*+9+D.W D.u+u+].G+X X q : ~+~+B.2.h+J t.H.x h.G.I +.[.@ 9+N (+*+I.h+J ~.~.b+j+^.~.++++j+K.; ++^.J y.H !.U h+v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+H H y.b+H b+b+y.H y.y.b+H [+I.~ =.=.=.v v =.=.=.=.=.=.=.=.=.v K.i+H.(+(+Y 2+b+; =.=.v v =.v ++F+g+H.^.t.H y.b+b+b+J b+H H b+j+j+++j+^.~.K.~.s.K.++++++x.g+5.U ! v.&._.v.^ &.y+F+x.++s.++~.~.J ++j+++#+++#+K.j+~.++++^.H y.H ++I.I.t ~+(.1 1 1 K (.>+(.K (.(.(.*.q a+I.N.~.++~.K.H J b+y.j+++H b+J H {.*+T.u+w D.u+u+8+V.).e.q W.~+7+_+2.i+^.t.p G +.p+!++.@ D 9+} 9+6+5.F+H.++j+y.j+H ~.~.~.++; #+~.y.y.J H N.5.(+~ =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+y.y.y.b+y.y.y.y.b+y.J H b+b+[+g+~ =.=.0 =.=.=.v ~.h+1+x.1+x.N.~ =.=.< < 0 0 =.=.=.=.0 v =.=.< H.g+H.^.^.^.t.H H ++b+J H b+b+H ; #+j+K.b+^.~.++b+K.s.~.#+y.{.9 8 l+v.! y+! ! y+g+9 ++s.~.#+J ~.H j+++++++H j+H K.~.++++++^.H y.#+g+&+n.F 9.K 1 1 1 *.(.K (.(.(.(.*.Q  +g+i+++++~.j+^.b+J b+~.++y.y.b+b+h+g+9+D.8+D.D.u+D.V.X G+).f ~+7+_+2.2+t.N.c.i +.G.!++.T.c.9+} 9+} 3.I.&+t.++++j+^.~.++j+H ; #+++b+H y.y.^.(+5.t.=.v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+H H y.b+H b+b+y.H J y.J y.F+g+~ =.=.=.=.v ~.H.F+B+B+g+I.g+g+[+i+~ =.=.0 v =.0 =.=.=.=.=.=.~.5.(+y.J y.y.++J J b+J b+y.J J H ++; j+K.H ~.~.H b+~ y.y.K.j+; h+[+U y+5.B+&.&.B+g+N.~.~.#+~.~.~.++~.b+~.^.b+~.y.~.~.++~.~.++++++s.H.I.*+&+t P m.K Y.(.*.(.(.(.(.(.*.Q a+5.h+y.^.~.K.++++++^.K.++b+b+b+H {.*+T.D.w D.D.u+].V.G+X G+).Y.Y.f+B.D N.2+ +G.x G.3.+.9+6+9+N 9+..9+@ n.!.t.++j+b+~.~.K.++; j+j+y.H y.y.^.h+g+x.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+y.y.y.b+y.y.y.y.b+y.b+H b+b+[+g+< =.v =.=.N.I.g+[+x.i+h+h+h+H.g+5.Y ~.=.=.=.=.=.=.v =.=.=.=.x.g+x.++^.J ^.J J ^.t.++^.b+^.b+b+b+; ; #+~.; K.J ~.y.^.y.K.^.y.J Y B+&.v.&.l v.5.[+++#+~.K.s.#+^.~.~.J #+++^.K.b+j+++H ^.~.j+j+~.j+J b+!.F+*+/+m.m.K w+(.K K (.(.(.>+{+ +I.U.b+b+++; ~.j+++++~.++y.y.b+b+h+5.9+u+w D.u+u+8+V.{+X ).: P L.~+p+ +N.Y j.G.p+p+[.= 9+} 6+e e ..x+9+I 8 h+H K.b+~.~.K.; ~.++#+~.y.y.H y.N.I.(+~ =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J b+H H y.b+H b+b+y.y.J H b+b+[+g+< =.=.=.N.5.I.!.t.^.J H y.t.y.i+Y B+(+; =.=.=.=.=.=.v =.=.v 9 g+t.J ++J y.^.b+H b+b+y.H y.y.y.J ^.~.j+~.~.K.#+K.++H ~.~.y.H ++{.I.! y+l 4 _.g+i+K.~.y.^.#+K.; ; ^.++~.J ++j+b+j+++H ~.K.^.++++#+J H H U.'+5.F+9.).>+1 (.1 *.(.(.*.Q a+g+h+y.J ++~.y.H ++~.#+j+^.y.J H {.*+9+u+f.D.D.u+8+u+V.X G+).m.Y.9.F  +i+Y t i h.p+!+3.9+} 9+} 9+} ..T.W.x 9 t.~.j+y.~.~.; ^.#+j+++H H J y.y.(+g+++=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+y.y.y.b+y.y.y.y.b+H b+y.b+b+[+I.~ v =.y.[+g+H.t.^.H J H H y.H ++t.H.F+(+; =.v =.=.=.v v =.=.[+I.t.b+y.y.y.b+y.y.H y.y.y.H H y.b+b+++K.#+; ~.H K.K.K.#+#+~.~.j+U.5.}.5.l+l+8 I.t.j+++^.J ++; ~.#+~.++; b+~.j+y.j+~.y.++~.~.j+~.#+++++H y.h+(+U F m.*.(.K q.(.(.(.(.g.t g+h+y.J ~.j+b+H H H K.~.++++++~.{.}+D u+w D.u+u+D.V.{+G+0.G+P Y.9.<+f+i+c.x -+h.h.[.!+9+9+9+N 9+} ..T... +*+Y b+; #+s.^.#+H ; ; j+^.y.b+y.^.1+g+N.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H y.b+H b+b+y.y.y.y.b+y.[+I.~ =.v x.U !.J ++^.b+J ^.H b+H y.H J (+5.(+; =.=.=.=.=.=.=.v [+8 t.b+J H ^.J H y.y.H b+y.y.H y.y.J J H ~.K.K.~.H ~.++++++^.~.; h+F+_.l+l l+B+g+y.~.b+++J ^.#+~.j+~.++; ++K.j+++; ~.++K.~.K.#+j+j+j+K.y.~.~.i+(+5.a+>+(.(.>+(.(.(.*.Q Z.*+h+y.y.++~.J J y.H ~.~.^.~.++j+h+}+T.8+8+D.D.D.8+0.g.g.V.q `.Y.9.h. +2+D *+G.h.+.[.3...e 9+N 9+} x+{ _ 3.*+I.b+K.s.s.++; ++~.; ; y.J y.J y.h+g+x.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+b+b+y.y.b+y.y.y.y.b+H J H b+b+[+g+< =.K.[+g+N.^.J J b+^.^.b+y.b+J H H H (+8 (+~.=.=.0 =.=.=.v (+I.i+H J y.^.b+y.y.H b+y.b+y.b+y.H b+J J b+++~.; ~.#+j+++++b+++K.1+I.y+&.l _.g+g+N.H t.y.b+H j+; ++~.~.~.++#+~.++#+j+j+#+~.; j+^.++j+~.H b+^.b+i+g+n.:.K w+(.>+E.(.*.Q t 5.i+y.^.++~.H y.b+J ~.++b+y.b+++U.*+9+,+W w D.8+8+0.V.G+W.q f Y.O :+B.(+ +G G.h.h.[.3.} 9+e N 9+} ..x+..{ j.F+t.K.J ~.++~.++++; #+++J H y.y.t.g+Y 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H y.b+H b+J y.H J y.b+b+[+5.< =.N.5.H.y.J H y.^.H J J H y.++t.H b+J (+F+[+++v =.=.v =.v 2+I.x.^.H J J b+y.y.y.H y.b+y.b+y.b+H ^.y.J b+H ++~.#+; #+#+j+K.; 2+I.B+B+5.[+[+5.Y H H J b+y.^.; ++j+~.++H K.^.y.j+++++j+y.~.++b+K.~.~.~.++++++y.H.9 n.f+q.K *.q *.Q Q  +g+h+J H ++~.H y.b+y.~.++y.y.b+H h+*+D D.8+8+u+D.8+0.G+e.X {+1.9.Y.] F ;.&+|+p+= = [.3.9+} 9+N 9+} ..x+b...[.I.1+; J ++^.++~.++j+; ~.y.y.y.J J I.[+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+y.b+y.y.b+y.y.y.y.y.y.y.H J b+[+g+< =.x.g+h+++H y.^.H J b+H ^.b+J H t.H b+H !.8 [+J =.=.=.v =.~.8 [+t.++b+J y.H b+y.y.H H y.H b+y.y.y.y.b+b+y.H H H b+++; #+; ++Y 5.9 H.H.x.x.I.F+t.++b+J H y.; j+; K.H y.; b+b+~.^.H ~.H ~.++++; #+K.#+j+~.~.++y.U.I.a+P K (.w+(.Q Q t 5.i+J b+++K.^.H y.b+~.++H y.J b+{.I 9+u+8+D.u+u+u+0.G+G+e.w.f 9.9.S.C.F v+2 C.+.B.T.D } } e N ..A._ _ _ x+D 5.'+K.^.^.~.H K.++~.K.; ++b+y.y.J F+g+~ =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J y.H H y.b+H y.J y.y.J H b+y.[+g+< =.x.g+h+J y.t.b+y.J y.^.y.b+y.b+~.b+H b+t.H.U Y J 0 =.v =.v 1+8 1+t.H H y.^.H y.y.y.H y.y.y.b+b+b+b+y.y.y.y.^.^.b+J b+++t.1+g+(+h+i+h+N.N.9 g+1+N.^.y.H y.; #+; s.~.++; H ++j+~.++; ~.; ~.#+++#+#+; ++~.j+~.K.H (+&+f+q.q.(.*.*.Q  +g+N.J b+++~.y.H y.y.~.++b+b+b+b+1+*+9+D.8+8+u+u+u+D.d+G+q {+f Y.P S.b F $.2 p+h.h.T.9+} N } A.} A...x+b.X T.*+8 b+~.y.#+H K.^.j+j+; ~.y.J y.y.9 g+K.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+y.b+y.y.b+y.y.H y.b+H y.y.J b+[+5.0 0 1+g+{.y.^.H ^.H H H b+b+^.b+y.J y.J ^.H b+!.U [+^.=.=.=.v ; I.g+H.J y.J b+y.b+y.y.y.y.H b+H y.y.y.y.y.b+J J H y.b+b+b+h+8 F+x.N.i+N.t.t.U.F+8 1+b+y.y.t.K.#+~.; #+K.#+^.K.j+~.~.#+j+~ ++; ++; #+K.b+++++y.++~ {.*+t q+1 (.(.*.1. +I.N.^.H ++~.y.J b+b+K.~.y.y.H H !.*+..u+u+w D.u+V.0.V.e.f {+f Y.Y.~+P.C.h.2 G.p+h.T.T.} e e N } } _ ..# `.b.I '+t.#+J K.++~.^.K.~.; ~.y.y.^.^.Y g+^.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.g+g+J y.^.b+H ^.b+b+H y.J y.H y.t.[+B+< =.i+5.x.^.J H y.J y.^.b+J ^.y.H b+y.H y.y.y.b+H.B+[+H =.=.=.=.t.[+B+(+i+^.J ++H y.J y.y.^.y.y.y.y.y.y.J y.y.y.++J J J !.5.I.{.t.t.J t.y.^.++h+I.B+!.t.++y.++#+j+K.++^.++#+; ; ^.#+++K.^.~.++j+; #+#+H J ++j+y.s.~.!.&+a+w+(.w+Q w+ +F+N.j+y.++j+y.y.H b+~.++b+b+y.b+!.5._ D.D.w D.u+u+D.V.# q q : P 9.7+Z ;.;.0+C.$+= D 9+_ 9+} A.} _ ....# { x+}+5.N.s.b+; H b+; j+++#+j+^.^.J J Y g+J =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.I.g+J H y.J J b+y.H y.y.b+b+J H b+[+g+~ =.^.5.(+J J y.++^.t.J y.H b+H y.y.y.y.y.H H ++t.!.I.[+++=.=.=.=.J (+I.I.[+H.Y H.!.x.x.2+x.x.{.{.i+i+N.N.i+i+i+N.i+x.[+B+[+x.J ++J ^.++~.++K.K.i+9 B+F+H.h+N.b+h+x.Y H.!.i+t.^.~.#+t.++j+j+j+#+j+j+; J b+y.y.++#+~.i+9 t 9.K (.Q *.t 8 U.++~.K.K.b+J J y.~.++b+b+H b+x.*+..D.D.w u+o u+].e.e.q e.q 9. .7+B.h.0+-+G.$+a+[.9+} e } N e } 9+W.# { T.t g+N.~.b+j+~.H j+++++#+K.j+++^.y.Y g+J =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.F+5.J b+y.H b+J y.^.H H J y.J b+H F+I.~ =.~ (+5.h+^.J b+^.b+b+y.H J y.y.H b+H y.y.b+H H b+(+5.[+y.=.v =.=.#+h+9 I.5.5.g+g+I.I.I.I.g+g+5.g+5.g+I.I.g+I.5.g+F+I.(+N.K.++K.j+#+s.#+~ ~ < ~ t.H.[+I.g+B+(+g+g+*+*+B+I.g+h+N.K.K.K.~.#+++#+; K.j+b+y.y.y.~.K.~.~.!.t f+m.q.Q (.a+g+h+H ^.~.K.++++b+J ++++H b+b+b+!.g+..D.D.w D.u+u+D.V.e.q G+f O  .7+B.p+l.C.b = E+!+9+} 9+} A.} n+....W.X { j.g+N.^.^.H K.^.~.++~.#+#+; s.~.++H.g+J =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v =.I.g+J J b+^.y.b+H b+b+y.b+H b+y.H [+g+~ =.=.N.g+[+t.H J J y.++^.J b+y.H y.y.y.b+y.y.J b+J ++!.8 [+y.=.v =.=.=.~ K.y.J t.N.U.h+{.{.{.h+{.!.H.(+(+(+(+Y 9 Y x.t.~ ~ ^.K.#+#+~ #+~ ~ 0 ~ v =.0 ++i+1+(+&+_.G .+t x n.;.g+F+h+~.#+++~.++j+; ~ K.b+b+^.b+b+H J ; i+&+B.P w+*.(.a+g+U.H J ~.j+j+~.^.H ~.~.b+b+b+J 1+5.# u+D.8+u+V.u+0.V.X f q f Y.~+~+B.p+a C.h.= E+[.b.N } } A.} N } ......{ }+g+t.++j+b+#+^.++~.~.~ #+#+~ s.~.Y B+J 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v I.g+b+y.J ^.H y.y.J y.y.y.y.H H b+F+g+< =.=.< x.5.(+J H b+t.b+y.b+H y.b+H y.y.b+H H ^.J H b+++(+I.[+y.=.=.< =.=.v =.=.=.=.=.=.=.=.=.=.=.v v 0 0 v 0 ~ =.v H x.9 I.g+I.[+1+J ~ v < < v < 0 =.< < < ~.}+G C.0+b C.B.p+G &+}+!.^.~.^.#+++K.~ ; y.J b+b+b+b+b+* ++I.t D 1.1.K t g+h+H b+K.^.H ++~.j+K.++b+J H H x.5...u+D.8+u+o o u+V.X : : G+P Y.7+B.p+0+-+Z = E+[.9+k.e } A.} n+......o T.I 8 t.++s.J j+++~.; ; #+j+j+#+s.j+H.5.y.0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v j.5.J ++J b+y.J H J b+H b+H y.y.t.F+[+< =.0 =.#+H.B+(+N.~.^.J y.y.H b+y.y.b+H H y.y.b+++t.H J b+!.8 F+t.=.=.=.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.#+1+I.I.I.5.g+g+I.B+g+H.~.v =.v =.=.=.0 0 ~ x.;.;.h.0+<+<+/+j a+n.n.*+{.++K.K.~.j+~ #+j+y.y.J % b+H b+~.9 &+ +1.f w+t g+h+H ^.j+H J H H ~.j+~.++H b+J 1+&+..u+u+8+# u+V.d+V.e.f : ).f Y.:+B.G b b a+= T.9+b.N e } N e N _ x+....@ *+[+t.^.j+J j+++~.; #+; j+++~.j+s.H.I.^.0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.H.5.i+^.b+y.H J y.y.y.y.y.y.H b+U.g+(+< =.0 =.=.K.!.5.H.N.++H y.y.y.H y.H y.y.y.y.b+J b+^.J H b+t.1+I.9 t.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.s.!.B+I.!.N.t.J J t.{.[+B+H.t.v =.=.=.0 < =.~ !.n.$.C.)+b P.] /+z.P.t n.I.N.~.~.j+K.#+; ; ++^.y.J y.y.J J 1+5. +b.L.m. +I.h+b+y.~.y.y.y.J H j+~.j+++++H 1+5...D.u+,+V.u+W.V.V.e.q : ).P 7+k+/+$.b b O = W.D e k.e e A.} } ....x+W.!+g+H.y.y.~.J j+j+K.#+#+j+~.++++~.~.H.g+^.< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.{.I.1+J y.b+^.J y.H H J H J ^.J {.g+{.=.=.=.v v =.; Y 8 9 N.y.b+H y.y.b+y.y.y.b+y.y.H y.b+++J b+~.J Y 5.[+J =.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.v < H.5.(+N.y.t.^.y.y.J J J H.y+[+; v =.v =.v < y.(+n..+;.0+F b Z $+] j a+&+5.x.J ~ K.j+#+K.; b+y.J J ~.y.^.t.N.I. +k.L.P t I.i+H ^.K.y.b+^.J ^.++~.H ~.j+j+{.}+..u+# ,+# o e.V.d+X V.f f S.F.z.F l.C.b _+S.b.E+} k.e e N ..N ..T...x+a+}+h+++^.s.^.K.; #+#+; ~.++^.++^.++9 B+J ~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.K.I.j.N.++t.y.H y.y.^.y.H b+++N.[+I.K.0 =.=.=.=.=.=.~ !.U [+N.^.b+^.^.J H ++H b+y.^.H y.b+y.b+b+b+b+J !.5.[+H v =.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.x.g+(+J ++b+b+J y.y.y.H y.J x.U H.=.=.=.=.0 ~ h+ +G l.$.P.<+b /+F k+& B.<+p+}+U.#+~.j+~.j+#+++y.y.J ^.J b+H N.I.[+h+2+p I I.N.y.^.; ^.J H J H ~.++J H J H !.*+_ D.u+u+n+# e.W.V.{+f P f 7+k+<+p+l.$+p+s !+W.D k.k.N 1+N e } ..@ { 6+I g+y.++H ++#+#+; #+; ++H H K.++^.t.[+y+i+#+~ < v =.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< x.5.(+t.~.J J J t.t.J y.J t.H.g+H.< v =.v v =.=.=.=.~ {.g+F+N.J J H H y.J t.b+H J b+H H y.H y.y.H ++t.H.g+[+H =.=.=.=.=.=.v =.=.=.=.=.=.=.=.v ; 9 I.i+y.b+y.b+y.y.H J J H H N.F+I.b+=.v v 0 ~.p &+.+$.$.C./+<+:.z.7+/+f+F ;.&+!.j+^.j+~.j+~ ~.H b+++H J J ^.t.I.t N.N.k.[+n.N.^.K.~.H b+^.H y.~.++t.y.J H 1+5...u+D.8+D.D.].V.0.X : `.: '.<+P.-+L C.$+O a+x+[.e N 9+e } @ e x+@ { @ x (+^.++; K.#+#+; ; ++++~.^.H K.#+i+I.l+l+#+~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.#+(+U !.t.t.^.^.J ^.y.J t.1+B+9 ; =.=.v v =.=.=.=.=.=.< 1+5.9 N.++J J H ^.J y.b+J b+y.H y.H H b+b+H H b+(+B+[+H =.=.=.=.=.=.=.=.=.v =.v =.=.v N.B+Y H y.t.^.J H y.J ^.y.y.y.t.!.g+!.v =.v ~ N. +n.l.$.| b B.k+2.:.:.:./+F /+&+[+++H j+++j+#+K.++b+^.b+y.J ++J 5.F+h+y.t.c.*+N.++++K.^.b+y.y.H j+++J H J b+!.5...V.u+0.V.G+V.q V.: f 9.: z.$+C.C.l.0+p+!+a+T.[.9+{.6+6+e @ 9+@ @ @ j.*+h+#+j+#+; #+~.j+~.H ^.j+++y.++; !.g+! ^ x.~ < 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.++(+B+[+2+J J J J J {.[+B+(+^.=.=.=.=.=.=.=.=.=.=.=.=.v x.5.F+N.^.H J H ++b+J ^.y.y.b+y.y.y.y.y.J H J ++H.B+F+y.v =.=.v =.=.=.=.v =.v =.=.0 x.g+h+H b+H ++J ^.J J H y.b+H ~.U.I.(+; ++N.h+(+n.n.0+C.0+P.<+b /+$+Z :.<+k+F &+I.++++K.~.~.#+#+~.y.J J H y.b+J F+}+2+^.y.(+I.i+++++K.~.y.y.b+y.~.~.b+H b+b+1+*+x+# X u+W.X W.: {+f O S.S.= F $.$.7 2 G.+.= 3.j.@ 6+ +@ c.@ @ @ I I *+Y ++~ ; ; ++K.H ^.j+^.b+^.++; s.^.Y g+v.&._.++; < 0 v v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.~.!.F+g+5.*+I.5.I.5.g+!.j+=.0 =.=.=.=.=.=.=.=.=.=.=.=.=.1+5.[+N.H y.J b+y.J ^.y.y.y.y.y.y.H b+H t.H H ++Y I.[+b+0 =.0 v =.0 =.=.=.=.=.v 0 H.I.N.t.b+y.H b+y.b+y.H J J b+++t.[+I.!.(+[+t n.;.0+$.d.<+<+j z.k+] ] f+P.k+F &+g+J H K.~.j+; #+; ++y.H b+y.J y.Y 5.h+s.K.Y g+N.j+j+H ~.j+j+^.b+++++J y.b+b+!.g+9+V.G+D.G+X e.: ).: O O S.B.p+$.7 |+G.G.+.x +.I @ (+9 j.c.j.j.@ 3.I j.N.K.; #+~.J ~.^.J ++~.++y.^.#+~.h+[+U v.l ! 1+; ~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< J 1+[+I.5.I.9 H.J 0 v =.=.=.=.=.=.v v =.=.=.=.< =.=.< {.U F+i+~.H J H H b+H y.H b+b+H y.H J ++t.b+J b+H.8 [+J =.=.=.=.v =.=.=.=.=.=.v H.g+U.b+H J J y.J H y.^.b+H J H ~.H.B+B+y+*+5.&+G C+p+d.F z.<+:.j ] :+_+j '.<+;.'+t.^.j+~.++j+#+#+; ~.~.b+y.b+++x.I.h+#+#+H.8 h+#+; ++~.++++~.++~.++y.b+J b+1+*+T.G+# 0.X { X : ).`.: S.$+C.G 7 ,.,.7 |+x x I I c.9 (+j.c.@ c.c.j.*+x.~.~.b+; ^.y.^.K.y.b+++j+~.H ~.s.{.g+y+l v.7.I.s.~ ~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v 0 < s.#+v =.=.=.v v =.=.=.=.=.v v =.v =.< =.=.=.=.< x.5.(+i+^.b+y.^.J H b+H H y.b+y.H J J H t.b+H t.H.5.Y ; =.=.=.=.v =.v =.=.=.v H.g+h+y.H J b+H J H b+y.J ~.#+#+#+x.g+_.l+v+|+$.2 0+P.P.F z.z.:.<+] z.S.<+O.F ;.[+b+b+~.~.~.~.j+#+#+K.K.++H b+b+Y I.i+< ~ !.I.h+j+++j+~.H H ~.j+K.++^.J b+H !.g+T.# W.V.W.X V.X q q+P S.C.C.G 7 ^ 5+,.v.i i 8 5.I }+j.j.(+j.j.j.5.*+t.; H b+H ~.y.y.#+++++++j+K.H J ++!.I.y+l+l+^ B+t.~ ~ < v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.< =.=.v =.0 =.=.=.=.v =.=.=.v =.=.=.=.v =.=.v =.=.v =.v =.=.=.{.B+F+N.^.J H H y.y.y.y.b+y.y.y.++J b+++J H ++b+Y 5.N.=.0 =.=.=.=.=.=.=.=.< !.g+N.J y.y.y.y.^.J ^.j+; #+#+; ~ i+*+v.l l+7 v+C+C.0+F P.z.Z S.] S.z.:.k+[ :+G F+J ++~.K.j+~.~.; #+++K.K.++y.t.[+A+b+< ~ H.I.h+s.++^.K.~.~.~.~.j+~.++H b+H x.5.x+V...V.# W.W.L.W.X ] :.B.;.l.7.V ! ,.T 7 ! i _._.5._.B+5.U 8 g+F+x.H j+H H H s.^.y.^.j+; ^.H j+++J t.B+B+l+y+7.&.v.!.~.< < < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v {.5.F+N.^.J y.H y.y.++^.b+b+H H y.b+b+y.b+y.b+i+g+Y < =.v =.=.=.=.=.=.=.=.1+5.U.t.H b+J b+y.~.; #+~ ; ; ~ ~.N.5.7 T _.T i |+G.b Z $+z.z.S.Z S.$+`.[ <+B.5.(+J ; j+j+~.~.++j+#+~.j+#+j+++J g+F+b+< < H.g+i+#+^.~.++#+y.J #+K.#+~.~.; ++(+5.9+u+# X _ : W.{ q+L.] a+h..+l+l l 7.4 y+v.y+y+! B+g+y+5.j.g+g+[+x.y.y.; ~.b+++++#+K.~.++; J t.^.K.y.H.g+B+U y+l v.^ Y ^.; < < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 {.g+F+N.^.J y.H H J J J y.b+b+H y.H H y.y.y.t.g+[+#+=.v =.=.v =.=.=.=.=.{.g+{.H y.y.b+++++#+#+; ; #+; j+~.J 9 5.l+5+.+C.C.b P.k+:+:+:+7+:+9.Z ~+z.B.;.}+x.~.#+~.~.++j+~.j+; b+H ~.j+~.b+g+[+; 0 < 1+g+h+~.K.~.^.++++++~.~.j+; s.; H Y 5.T._ G+T.V.{ W.: `.q+S.B.p+i 5+5+l r+l+l ! U l+_.y+g+B+g+j.U [+N.y.y.b+~.; ++j+++~.^.^.^.~.++H ++j+N.g+B+8 _.l+v.r+v.(+^.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 x.5.I.N.y.J J b+b+y.y.J J y.y.y.y.y.H y.y.t.I.I.y.=.=.v =.=.=.=.=.0 0 N.5.H.H J H ~.; K.~ #+; #+; j+j+K.~.x.9 _.7 E 0+& b <+<+:+:+~+:+] q+z.S.Z h.&+Y t.~.; ^.~.H j+~.~.~.#+++J ++#+H I.[+< v < !.I.h+++#+++~.b+++j+++++~.H j+; ~.!.I.9+# # X b.: W.W.E+`.a+b G.7 7.r+l ! U ! l+5._.i I.B+8 U F+(+x.~.++~.++~.; ++++^.j+H y.^.++++b+H ++x.g+5.g+l+l+_.7.&.5.N.K.#+< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 x.g+F+N.^.H J H ~.b+J ^.b+H y.y.H y.H y.J F+g+t.0 =.v =.=.=.=.=.v =.~.F+I.t.b+++K.#+; #+#+#+#+j+~.~.~.++~.1+&+U l.0+P.k+f+/+] :+S.] ] O O.q+F G 9 U.j+++j+^.; y.~.++j+~.~ j+++~.; N.g+H.0 < < 1+I.h+J K.~.~.b+~.~.J ~.~.J K.++H 1+I.9+0.V.W.0.T.G+{ S.] = G.G.7 7.v.r+_.&.U 8 j.8 F+(+F+I.%+x.J ++~ ++; ~.~.~.y.b+H j+++H H ++~.J ++b+9 g+B+B+l+&.y+^ v._.h+~.#+~ 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v v x.g+I.N.^.y.t.y.y.J ++y.y.y.y.b+y.H y.J g+I.^.v =.=.=.=.=.=.=.=.=.~ [+5.N.++; #+#+; ~ ; ; ~.++~.K.j+~.#+N.Y i ;.0+P.<+:./+_+:.P S.q+E+f+2.&+}+h+H ; b+~.H ; ++~.++K.j+~.H ++j+++1+g+x.< < < !.I.h+J ~.#+j+H ~.H b+j+H b+~.H H !.*+x+b.T.E+G+E+X E+O S.h.0+i 7 ^ ! r+U ! l+B+y+U j.g+5.5.U.J b+b+j+++t.b+H j+^.y.y.~.++J b+^.~.++J x.I.5.y+8 B+! _.l+l+_.x.~.; ~ < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v =.=.0 h+B+F+i+~.H b+b+H y.b+H H b+y.b+b+H N.5.[+~ =.=.v =.=.=.=.=.0 =.v !.I.U.#+#+#+#+; #+#+~.^.++~.~.~.; ; #+J 9 &+G C.p+P.'._+~+P ~+2.q+a+t 5.x.++++j+b+~.++~.j+H ~.; K.K.y.b+b+t.Y I.U.~ < 0 H.5.i+J ^.#+~.~.~.y.H K.b+b+~.J ++1+5.9+W.{ { b.s { `.= ] h.|+2 r+7.&.4 U _.l+8 F+g+g+I.F+H.++++b+b+++; J J y.j+++^.y.++++b+^.++K.; U.I.g+g+U B+I.! l+y+&.! (+J s.~ < < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v =.=.< h+5.9 i+H ^.J H y.b+b+y.H y.y.y.H H.g+1+0 =.=.=.=.=.=.=.v =.=.=.i+I.Y ; #+#+; #+; ; ; ++++~.++H ~.j+#+#+t.[+}+&+n.C.F f+a+a+a+B.B.&+9 H.t.K.y.K.H ++~.^.#+b+~.j+++#+++j+++U.8 8 i+j+~ < H.g+i+J ++#+~.K.j+^.~.++y.j+++b+++!.5..._ { { G+q+{ E+] = h.2 7 l 4 ! ! U y+g+I.I.8 I.U.t.t.++++^.^.t.K.++b+++j+b+H y.++j+j+; ~.#+t.Y 8 [+F+U y+B+}.! y+^ r+B+N.~.~ < < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v =.v v {.8 j.N.H b+y.H y.y.H y.H y.y.y.5.F+N.=.=.v =.v =.=.=.v =.0 < 1+5.8 ~.; #+j+; j+y.~.~.++~.; ; j+#+; #+~.K.x.F+}+}+&+&+&+n.*+g+I.I.h+b+* ~.y.#+b+++#+t.#+J ~.j+b+; y.++++N.5.y+1+^.#+~ !.g+h+y.y.; ^.; ~.~.K.b+H j+^.b+j+!.g+[.W.{ E+W.`.E+`.= z.+.$.i _.U 8 5.g+8 F+F+I.Y b+; y.y.y.#+y.y.b+#+b+b+H K.H ++++++#+j+H b+~.!.B+F+[+F+B+U B+5.y+U r+r+y+i+K.#+~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 {.B+F+i+y.J J ^.J J J J ^.t.(+B+!.0 =.0 =.=.=.=.0 =.0 =.< i+_.U B+{.++J y.~.; ~.~.~.~.~.~.j+#+~.j+; #+#+^.h+Y I.9 g+9 F+I.!.H.b+#+H ~.s.y.~.y.++~.++++~.K.~.~.~.J H i+F+B+v.g+t.#+~ H.I.h+^.y.^.#+K.^.++#+~.j+++^.++j+Y g+9+W.E+X !+[.3.+.B+g+g+j.9 I.j.I.9 6+H.{.b+H J b+~.H b+H ~.H y.b+++^.^.; K.; ~.~.++#+J y.J H.I.g+I.I.(+B+B+B+F+l+! _.l l+[+++K.~ < < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.~ h+g+g+h+y.y.J ^.y.^.^.i+Y 5.!.~.=.=.=.=.=.v 0 =.< =.v 0 Y l+&.B+I.b+~.~.#+^.++~.~.j+~.~.j+j+; ; j+j+j+; ++b+y.~.t.^.y.t.s.y.J #+J ++j+b+j+++J ~.; ~.~.++++; K.K.++H.I.y+v.F+t.#+#+H.I.h+y.b+++#+; ++H ; ++K.j+~.++~.6+5.D { s W.!++. +I.j.U.N.t.t.N.b+N.H ~.H j+~ ; j+K.~ K.~.~.#+K.j+j+#+j+~.++++~.H b+b+~.++y.{.I.I.[+[+I.9 I.I.g+I.l+&.}.^ &.F+++~.~ < v 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< i+I.B+(+2+N.t.N.h+!.g+5.(+++=.=.v =.v =.v =.0 v 0 < 9 U l v.y+B+!.^.y.#+j+++++++~.j+~.j+; ~.~.j+K.j+; ; ; ~.~.y.; ~.++~ b+b+; b+^.j+J ++j+H K.#+j+H b+y.~.~.^.^.g+B+y+7.g+i+~.~ H.I.h+y.y.H ~.; ~.++j+H ; ~.~.j+; H.j.9+W.W.T. +n.}+x.t.~.; ; j+H j+b+~.~.H ++j+y.b+H j+y.++++; ++^.~.#+++++J H K.H b+b+^.#+i+[+5.[+[+[+[+[+[+I.B+I._.! y+^ l 5.y.~.~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v t.Y I.g+B+I.F+I.B+I.h+< v =.v =.=.0 =.=.v =.v < (+l+l l+! r+5.g+N.s.++^.++~.~.~.++~.j+j+++j+j+j+++++++~.#+~.H K.b+t.K.J b+; y.++K.b+++; K.j+~.~.K.~.j+~.J J H.I._.r+7.y+h+y.#+H.g+h+y.y.H ++#+; ~.#+y.j+b+y.++++Y g+T.E+[.3.n.[+i+~.~.s.j+; #+++j+y.j+^.y.H j+++H ++K.y.b+b+K.H J H ~.H J J ^.#+J y.^.y.t.[+y+[+Y 9 (+9 9 Y g+y+g+y+&.l+l v.5.y.++; < < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.< H {.H.[+F+H.t.~ =.=.=.0 v =.=.v =.v v 0 ~ (+l+l+l+l V V l+g+x.#+^.++++++++~.~.~.++++j+K.K.; K.K.j+K.#+#+~.; ++b+; ^.y.j+++~.#+++++~ K.~.y.y.++~.#+++y.1+5.8 l+^ 7.l+1+t.#+Y g+i+y.y.H ++#+#+j+K.y.j+H ++~.++(+5.@ s [.+.}+h+j+#+; ; b+++j+~.j+y.j+H y.^.j+y.J H j+y.H b+K.H J ^.~.++b+H ^.~.J ^.J i+(+g+F+(+Y !.Y 9 [+(+g+y+5.5.! &.y+_.g+J ++; < < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< v =.=.=.v =.v v =.v =.v 0 =.v v =.#+Y l+&.4 ^ ^ 7.^ l y+F+1+++++~.~.~.++~.++++++++~.~.K.; K.K.j+++++^.~.j+j+#+j+j+K.~.j+j+++++~.++~.J J J ^.; ~.J B+5.&.! &.4 ! H.t.~.(+I.N.y.y.H ~.j+~ ~.j+~.#+^.H ~.H (+5.3.s @ U {.#+; ; ~ y.b+++~ ~.K.H j+++b+H ~.y.J y.K.++J y.K.y.J H ^.++H y.J ~.j+++{.[+g+[+H.(+H.x.[+[+F+(+I.y+U B+! ! l+l+5.t.^.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v =.v =.=.v =.=.v =.=.=.=.=.=.=.v =.=.v =.0 i+&.&.^ . 7.r+l 4 7.l B+I.i+H ~.++++H ++++++~.~.~.++~.++^.~.~.b+~.^.^.K.~.++++; j+j+j+~.^.b+H b+~.H H ^.~.; J x.5._.l v.^ v._.Y t.++[+g+t.y.y.y.j+~.#+j+~.~.j+j+K.#+~.!.I.3.{ I  +i+++j+; ; y.b+++; ~.; ++j+++y.++K.H b+H ~.b+H H #+^.y.H H #+J b+J ++H h+'+5.(+H.!.H.Y H.[+F+I.[+[+U y+I.y+y+v.&.g+J ^.#+~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v =.=.=.=.=.0 =.=.=.=.v =.=.=.=.=.=.0 v =.< F+l 7.z V 4 4 V 7.^ v.l+5.g+N.++++++~.~.~.++y.++++j+~.~.++^.~.H j+++H j+++b+++K.^.++++++~.^.b+J ~.~.; ; ++N.Y 5.U l+v.l 7.7.l+Y J ~.I.g+t.y.y.b+~.~.~ j+++j+~.++~.~.++!.I.3.T.I.F+N.s.s.; #+H b+~.; ++; ++K.^.++^.j+y.y.^.K.y.J ^.K.H H J J ; J ++H b+x.I.U H.1+x.H.Y (+Y (+[+I.F+[+g+y+F+y+_.! l+I.J y.~.~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.=.=.=.< 0 I.l+V z V l l 7.7.&.! 7.^ l+F+9 i+j+y.++++++~.K.y.++~.b+; b+j+++H b+K.H H K.H ^.j+#+H b+^.~.j+J J ^.^.y.K.^.9 g+8 r+! v.^ 7.^ &.(+t.y.[+5.t.^.J ++#+++j+#+~.~.K.^.++~.H 1+5.B.Z I.9 j+; ~ #+~.H H ~.#+++; b+K.~.; ++K.++++~.K.H b+H ; y.J ++++~.^.++J x.g+I.H.!.!.x.H.(+(+Y Y [+I.F+(+y+5.5.I.&.l+&.U t.^.~.~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v =.0 v =.++l+7.7.l ^ 7.r+7.v.4 7.4 l+l+_.g+9 N.y.++++^.^.++++++H ++K.y.~.++y.^.j+y.^.#+++~.++~.++J J H ++++H J y.#+J 1+g+U r+4 l l+l ^ ^ 5.(+t.^.[+5.N.t.y.~.~ j+^.; j+K.#+~.s.; ++1+*+= Z *+n j+H K.#+H b+b+~.#+H K.y.j+++b+~.~ #+; ~.; ++~.H #+j+j+~.K.~ ; x.F+g+[+H.1+1+1+1+Y (+Y Y H.[+F+I.9 5.g+5.g+v.l+&.B+y.^.~.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.=.=.#+5.l+^ 7.7.z 7.&.l ^ 7.^ v.&.4 l y+5.5.H.~.++^.j+J ~.++y.++++H ~.~.b+++K.++++#+j+^.J b+; ++J y.H ~.y.s.++N.9 5.B+&.4 &._.7.l+7.l y+9 t.++Y I.N.J ++; #+#+b+K.++~.s.^.++#+~.!.I.3.= n.F+H * #+#+++J b+++s.^.~.H ~.++J H ~.J J ^.#+; K.K.~ ++y.H J t.Y g+5.(+{.h+x.1+!.1+H.(+(+Y Y 9 F+F+(+F+g+U &+&._.v.B+t.++~.#+< v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.< 0 t.U ! l 7.z V l v.7.7.l l+! ^ r+l+l+y+g+I.H.i+~.++y.~.^.H ; ++^.~.H ++K.; ~.++~.~.H ^.H ~.++++++J y.K.~.1+F+g+U ! _.l l+l 7.l l v.l+(+i+y.!.g+x.y.++#+; #+^.K.~.^.K.++H ; H 9 G 2.= n.U i+#+#+s.~.b+J H ; ~.K.y.~.++H ++~.J H ++~.y.y.J ++++H N.H.[+U 9 x.i+N.h+x.1+!.x.H.H.(+(+Y 9 9 F+9 9 U _.g+l+_.! 5.t.^.s.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 v v =.~ (+&.v.7.V ^ 4 l 4 r+v.&.v.4 v._.y+l l+U B+I.I.h+^.y.; ++b+~.^.~.#+#+++j+~.++b+H ~.H t.J ++~.b+b+++~.t.H.I.g+l+&.l l l+v.^ ^ 7.l v.l+{.t.^.i+g+(+++K.; ~.; ~.; ~.++; ++j+* N.I.;.a+= h.&+H.~.~ s.#+++b+b+~.; ; ^.++~.b+++; b+b+H ~.H H J H t.!.8 U [+x.i+N.h+i+h+x.x.!.x.!.Y 9 (+H.Y (+}+F+[+U y+I.&.l+_.(+t.y.K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 0 {.y+! l z 7.l 7.7.l l+l l ^ l _.}.v.! B+U _.U I.5.[+h+++++#+#+~.^.K.~.H H ++H t.y.~.~.++b+t.++j+b+t.x.I.[+B+! v.l r+}._.4 7.7.7.&.l+y+x.t.++^.[+g+t.~ K.j+~.~.j+++H K.H ~ t.Y n.a+F = p+;.F+h+#+~ #+b+H J j+#+; ~.++~.H ++~.^.H ++K.b+N.!.[+I.g+[+H.h+N.N.i+i+i+N.x.!.!.1+!.H.H.H.H.Y 9 I.F+9 U y+5.l+&.y+x.t.H K.#+< 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v 1+l V l 7.^ l 7.^ v.! ^ ^ v.l+_.v.! U B+l+_.I.U U 5.g+F+H.N.J H b+~.++y.b+~.j+b+y.~.j+b+b+H t.x.(+[+U U y+l+_.v.l v.l+l ! 7.^ 7.! l+I.{.N.J y.!.F+x.++++; ++K.~.j+++++++H 1+I.;.a+p+Z p+h.B+%+h+j+K.J H b+j+#+~.j+~.j+y.b+j+++J N.i+H.I.8 8 [+(+{.N.t.t.N.i+i+N.i+x.1+!.1+1+H.H.H.H.Y F+F+[+9 B+_.y+U ! B+i+J y.s.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v K.Y ^ z l 4 l ^ 7.v.&.v.v.v.l+l+l ! U y+_.}.g+F+y+5.[+g+8 8 [+g+H.x.t.t.t.t.~.K.J t.t.t.h+!.H.[+g+I.8 U l+v.! y+l l _.l ^ v.4 7.l V &.Y {.1+Y 1+1+I.U !.t.~.++#+~.#+~.++y.{.g+B+;.f+Z = Z h.5.5.I.{.y.~.J ^.K.K.++; ~.~.t.h+h+!.F+8 F+B+I.[+H.U.U.N.N.N.t.i+i+i+h+i+x.2+x.x.x.!.Y (+Y Y [+I.}+}+g+y+_.&+_.5.h+t.++; ~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 N.! V z ! 7.V l v.l l 4 _.l+_.l &.U }._._.g+I.5.B+[+[+g+g+I.I.8 5.I.[+F+8 g+(+(+[+I.I.[+5.I.8 g+y+g+}.&.! v.&.v.y+! l ^ 7.r+4 l 4 4 ! U B+g+g+&+*+*+U }+[+x.N.H b+j+t.h+(+F+n.+.s Z.a+= B.d.C.0+G }+(+1+Y H.x.h+!.Y (+(+(+[+g+I.g+g+[+[+!.{.h+h+h+h+N.N.t.N.i+i+N.N.h+{.{.1+x.H.(+Y (+H.}+I.g+[+I._.y+B+l+F+i+t.^.#+#+0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< < t.v.7.4 l 7.4 l v.v.^ v.B+y+l+! l+U y+_.B+F+I.g+g+9 [+I.I.9 [+g+B+5.F+B+g+5.I.F+5.B+B+5.g+B+_._.l+y+_.l+&.v.l v.l+l ^ 7.7.7.l v.! &.&.&.&.y+y+U y+i 7 i 5.8 '+A+A+F+I.g+}+&+a+!+_+Z = $+$+P.-+C+v+|+B+I.g+g+F+I.B+F+B+g+B+g+I.[+9 (+!.x.Y 1+{.i+U.N.t.t.t.N.t.i+i+i+x.1+!.!.1+H.(+(+9 Y (+}+I.}+F+I.5.B+y+(+N.y.++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v 0 h+v.7.7.^ 4 v.l l l l l+! l+}.y+y+y+}._.g+F+5.g+[+Y 9 [+[+Y (+I.g+F+[+B+U y+U 8 5.8 B+U g+y+}.! &.y+y+&.l l+! l+l+v.^ 7.4 r+&.&.&.&.v.v.l+_.7 l+v+|+|+7 &+i x G I.x t ;.a+p+:.Z O k+Z $+h.$+C.2 |+7 g+Y 1+{.{.[+l+l+&.U l+U F+[+F+[+H.H.x.h+i+N.N.i+N.N.t.N.N.h+h+i+2+1+!.H.x.!.(+(+9 Y (+F+5.F+F+B+_.y+y+!.J ^.K.~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 ~.g+l 4 7.7.&.l l ^ 4 l+_.&.v.! U 5.&+U y+[+[+g+[+(+H.(+(+9 H.(+F+F+[+[+5.5.5.I.I.B+U _.l+g+y+_._.! l+y+l+&.l+&.4 ^ l 4 v.&.l+l+&.v.v.v.v.&.5+! ,.7 T l.E P.b C.p+B.h.= p+_+= S.$+S.Z ] b B.& C.C+2 2 &+}+h+J J H.! l l g+l+y+I.[+I.F+(+!.Y !.1+h+h+U.i+U.N.N.i+h+h+h+{.1+!.!.x.!.(+9 (+Y 9 }+F+9 }+_.l+y+y+x.t.y.~.#+< < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 ~.U l 7.V 7.&.^ ^ ^ v.y+l+&.&._.y+U B+5.[+[+[+F+(+(+(+9 (+H.!.Y (+(+(+(+I.[+F+F+I.U }._.l+B+y+l+l+! l l+y+l+v.4 7.7.v.v._.l+! v.v.&.&.v.l ^ 5+7 @+7 2 a |+u./+u.z.j z.Z ] = = s $+O = f+P.= P.Z d.0+|+v+G {.t.N.Y l+v.l }.y+y+I.F+g+[+(+!.H.H.1+h+i+h+i+i+N.N.i+h+i+h+{.1+!.Y !.!.Y 9 9 Y 9 9 9 [+g+_._.y+_.x.J y.K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ++y+l V 7.v.l l 4 v.l+&.&.l l+B+y+l+}.B+[+[+9 (+!.H.1+!.x.x.1+!.H.Y H.Y 9 I.5.5.5.U _.y+_.y+B+l+! l+&.l+}.l+4 ^ l &.l+v.l+&.&.&.v.&.r+^ r+V 7.r+T @+G.E P.-+F b _+Z = ] s = = s Z Z.= s C.= b F | 0+0+T x 9 i+J h+g+l+! v.5.y+g+[+I.I.9 Y H.H.!.h+h+h+h+U.t.N.h+h+h+h+2+1+!.H.H.!.H.(+Y H.Y 9 I.*+g+U ! _.y+x.J ^.K.~ 0 < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.< ^._.4 V 7.! l &.&.! l+l &.&.y+y+_._.U F+g+g+g+9 !.Y H.H.!.x.1+!.H.(+(+Y I.I.B+B+I.g+y+_.l+l+5.}._._.y+&.l l+^ v.! ! l+&.&.&.&.&.&.v.V z 7.7.7., 5+a $.0+-+C.<+$+= Z S.$+s ] ] S.Z S.Z _+j ] <+Z d.p+C.l.v+B+1+N.t.g+l &.v.g+_.B+[+[+F+9 H.H.H.!.h+i+h+h+h+i+N.h+{.h+{.h+1+1+H.H.1+1+H.Y (+H.}+U 5.I.U l+y+g+2+J ~.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < K.y+^ 7.&.^ 7.4 l+l+l l &.! g+l+l+_.y+9 B+g+I.9 !.(+(+Y H.x.H.Y (+(+Y H.F+I.g+5.F+g+y+y+y+_.B+_.B+y+! 4 r+! r+l+l+! &.! v.! v.v.&.v.V z V , 7.r.E 2 a p+)+Z <+S.k+O.q+Z q+] S.q+S.O z.S.k+= C./+b -+C+l.l.U 9 !.N.I.^ y+y+g+l+U [+I.g+[+H.H.H.H.x.h+x.{.i+i+N.i+h+x.{.{.1+1+Y H.1+!.Y 9 [+(+F+g+B+&+y+&.! F+{.y.++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < N.l+^ ! ^ ^ r+&._.l+l+! &.U l+l+l+y+I.B+8 I.I.(+Y (+(+Y H.x.H.!.Y Y (+H.[+F+g+5.[+8 y+y+U U U I.v.&.v.^ l _.l+! ! ! &.v.v.v.v.7.z z ^ 7.V z @+^ 2 l.d.B.d.$+<+] z.S.S.S.S.= `.Z E+] z.O k+S.<+f+P.p+C+v+@+i &.5.H.8 l+l l g+y+F+[+5.[+[+Y (+H.!.H.h+{.{.h+i+N.h+h+x.x.h+2+{.x.1+{.Y (+9 F+H.I.g+B+g+_._._.F+i+J ^.#+~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < < [+l ^ l ^ ^ 4 l+! ! l+l+U l+&.l+l+8 F+U 5.g+F+(+Y (+Y Y !.x.!.H.Y (+Y Y F+I.I.5.F+5.B+8 5.B+l+B+v.l l v._.l+! l r+4 r+4 &.r+v.7.V V 7.^ r+^ ^ 7 E a 0+| = C.Z Z k+S.7+q+S.S.: Z O ] ] S.Z f+F :+P.b d.0+E _.5+l U _.v.l l U y+B+9 [+[+(+1+Y H.H.!.h+{.{.h+i+N.i+h+h+h+h+x.1+!.H.1+Y (+9 9 Y F+I.y+g+B+_.v.Y t.^.s.#+< 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < ~ x.&.7.l 7.7.&._.l l l+l+g+l+_.l+_.5.g+U g+g+[+(+(+(+(+Y !.!.H.H.H.Y H.H.9 g+I.g+[+I.I.g+5.y+! B+l l v._.y+l+l V V V V V ^ V 7.^ r+^ 7.V 7.r+l r+5+2 C+C+F $+a+= z.O ] s S.= { ] O S.] q+S.f+:.z.k+P.0+l.l.7 ! l }._.^ v.&.l+y+y+F+(+[+9 !.!.1+1+x.h+h+h+i+i+i+i+h+h+h+{.1+H.H.Y p H.9 9 [+Y I.g+U I.B+_._.Y t.H K.#+~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < K.l+7.v.7.^ l+! &.v.&.U y+8 B+U B+5.U U 8 I.(+9 [+(+(+Y x.Y (+Y (+(+Y (+[+9 9 [+9 I.B+y+l+l+! U l _.}._.l+l 7.V z z V 7.^ V V z V V 7.r+l 7.^ ,.,.l.E 0+-+P.= Z _+E+S.q+= S.L.] q+q+_+q+] f+/+j B.& C.l.2 r+5+r+l &.^ l l v.U _.8 [+I.[+9 !.H.!.1+h+h+x.h+h+i+{.x.x.1+x.x.H.H.Y H.1+(+[+[+Y g+5.5.F+y+&.8 Y N.y.~.#+< < v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 < H U v.7.l l &.l l &.l+y+l+l+}.U 5.5.U 5.g+[+(+[+F+9 [+(+x.Y (+H.H.H.!.Y (+9 [+g+F+5.U y+_.l+v._.&.U l+l+l+! l l l 4 v.v.v.l v.l l v.l ^ 7.l l 5+! $.2 p+2 b h.P._+Z O E+E+{ L.s L.S.:._+j f+<+<+:.| p+l.$.T ^ V V v.&.! 4 v.B+l+U [+I.[+9 H.Y Y H.1+x.!.x.{.h+h+x.1+x.1+2+H.H.(+H.!.(+[+[+9 9 F+5.5.l+v.5.!.J ^.K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< < y.Y 4 V 4 l+4 4 l &.y+y+l+! l+U F+g+I.9 [+[+9 [+9 Y (+Y !.1+1+!.H.Y H.[+I.I.B+y+I.U y+l+y+l+v.U l+l+l+! l V V z V V ^ V z V V V V ^ l &.v.v.r+^ 7 |+2 h.E G.b P.s $+f+S.= E+S.S.E+= ] q+Z _+<+k+B.| C.r.2 7 ^ 7.V ^ &.v.r+v.y+l+y+9 g+I.9 H.Y Y !.x.{.1+x.x.{.h+x.1+1+1+h+p H.(+Y H.(+9 9 9 (+F+U g+_.&.B+1+J ^.#+~ < 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~ N.! ^ 7.l+l l l ! y+! l+l+_.U B+y+y+B+5.(+(+(+(+Y Y !.H.9 [+[+[+9 Y F+I.5.B+U F+U l+&.&.&.l+U _.l+l+4 V V V V 7.4 &.r+^ 4 r+4 r+l r+^ 7.^ 7.! ! 7 v+$.+.C.-+b $+b !+= = E+= = E+= Z f+<+:.C.b F d.-+E |+7 v.v.l 4 l l l+&.y+_.y+[+I.I.9 H.Y Y Y !.{.1+1+1+x.{.1+1+1+H.2+H.Y Y Y p (+(+9 (+(+5.U g+l+&.5.1+J y.K.~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 0 ~ J Y l 7._.}.! l l+l+! ! l+_.U y+y+y+y+8 [+[+I.F+F+9 Y 9 [+[+[+[+[+(+g+g+5.B+y+5.y+l+! ! }.y+_.l+l+&.V V 4 4 l &.^ 4 ^ ^ ^ 7.^ 4 v.^ r+r+^ l+T 7 7 2 |+G.+.-++.P.b = = $+E+Z = q+] Z S.<+a+$+b C.0+2 7 7 &.r+^ 4 4 v.l l+&._.U y+F+F+F+[+H.(+Y Y !.{.1+1+1+2+h+1+1+1+H.h+H.Y H.H.1+Y Y 9 F+9 U y+5.l+l+[+x.y.^.#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< < ~ #+{._.! l l l l+8 v.v.! ! y+5.y+l+y+U g+[+I.I.I.F+F+Y [+[+F+g+I.[+(+g+8 U U y+U }.v._.U y+l+y+! l+&.&.l 7.7.7.v.V V V 7.4 v.l ^ l ^ &.&.v.v.! ! ! v+7 .+G G. +x a+a+G.p+!+$+a+Z.= h.Z.P.h.p+2 -+x G T @+l+7.7.7.^ &.l 4 ! l+8 5.g+[+I.[+9 !.(+Y H.2+!.1+!.1+{.!.!.!.1+1+H.1+1+p 1+(+[+F+F+(+U y+l+U l+(+N.J ++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < < ~ J Y B+r+^ ^ l+U _._.v.! y+B+l+y+y+y+g+F+g+g+I.I.[+(+[+I.I.g+5.g+[+8 B+B+y+y+g+B+_.y+y+l+l+}.&.l+^ V V 7.z V v.^ &.! v.7.V r+7.l+l V ^ l ! v.! 7 ! .+v+i |+G.2 G.+.a+3.s p+= !+G.b = b +.h.2 $.G .+v+_.l+^ 7.V 7.l ^ &.l+l U U I.(+9 (+9 !.Y H.!.x.1+1+1+x.{.2+x.x.x.2+!.H.Y 9 Y 9 [+I.5.9 U _.y+U l+9 N.J ~.#+< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< ~ #+~.h+[+! v.v._.! ! y+y+y+B+y+! _._.y+g+g+5.5.5.g+I.9 I.g+g+g+5.g+9 g+I.F+g+B+U ! v.}.l+l+l ^ ^ ^ V V V 7.8.! &.^ 7.V ^ 4 r+l l l 4 &.4 l ^ v.l &.|+7 v+&.T |+.+G G.h.+.t h.x +.G.h.3.G +.+.v+.+|+l r+l _.&.l ^ 4 l 7.&.l+^ l+y+y+[+I.9 Y x.H.1+x.{.{.2+{.2+{.{.!.1+H.Y x.(+Y [+Y Y [+F+g+9 8 U 5.U y+Y N.y.~.#+~ < =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v 0 ~ #+++h+9 U l+U ! &.l+l+y+I.8 U g+B+U F+B+B+B+5.g+F+F+g+I.F+F+F+F+9 I.F+5.y+y+_.v.&._.&.4 V V ^ 7.^ 4 4 l 7.4 7.^ 4 ! l v.l 4 ^ l+r+7.! &.l l r+7 v._.5+T 7 |+7 v+.+G |+|+h.I h.i i G.G x &+v+7 ! ,.r+&.l+l &.l v.l V l y+l _._.l+B+F+F+9 Y (+Y Y H.1+H.!.H.!.x.H.H.H.Y 1+(+(+9 (+Y F+I.I.[+g+y+U _.y+Y t.y.~.~ < v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.0 0 < ~ #+H i+H.I.g+}.l+l+l+y+U U B+8 B+g+[+F+[+[+[+[+Y (+[+9 [+F+I.I.[+U y+U l+&.l+! l+v.V z z V v.4 4 l ^ 7.7.&.l v.l l 7.^ l l 7.v.! 4 ^ ^ ^ 4 ^ v.r+l+l 7 &.! 7 |+i |+.+_.i G x G i |+&+7 7 _.|+_.! l ! l ^ l 4 v.! 7.7.y+l+l+y+_.U [+g+[+Y Y Y Y H.x.H.Y H.H.2+H.H.Y (+x.(+(+9 9 Y I.I.F+9 B+l+y+l+5.x.t.^.s.~ ~ 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< 0 0 #+s.K.^.t.x.9 U y+l+_.5._._._._._.g+[+5.5.g+g+I.[+[+F+g+5.B+U 5.[+U y+y+l+&.l+_.l+l V z 7.8.4 ^ 7.V V V 4 l+8.4 7.^ v.! l 4 ! r+7.&.4 4 4 ! v.v.l v.r+_.&.7 y+i _.T _.5.7 ! i U I I G _.T ! ! l+_._.8 l 7.^ ^ l ! 4 7.l+y+l+y+l+y+[+5.I.9 Y 9 (+Y 1+!.H.H.!.{.H.(+Y Y 1+(+9 [+9 Y [+[+F+[+y+l+y+B+9 i+J ^.K.~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 0 < ~ #+~.y.N.x.H.9 g+y+[+U U U y+y+B+I.U B+B+B+5.[+I.g+g+g+5.B+5.F+U y+y+y+v.&.l+v.7.z ^ ^ &.7.V 7.7.4 l+4 v.r+^ 4 ! l ^ 4 v.^ ^ l ^ ! 7.v.r+&.l r+_.l i y+y+! l _.U ! i U i 7 ! U 5.y+_.! v.v.&.! l+l+&.4 ^ 7.l l+! &.y+g+y+U y+y+g+F+F+[+H.9 Y Y !.1+H.H.H.!.!.(+(+(+!.9 9 9 [+Y [+F+5.F+l+l+U I.Y N.J ++#+~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 < < #+#+++~.J N.x.!.(+Y 8 B+U U 5.5.[+8 5.5.5.5.[+F+F+I.I.I.I.F+(+F+[+9 9 g+y+l+^ 7.v.V V 4 V 7.4 &.&.7.^ &.v.&.! 4 l v.! r+l &.r+r+l+_._._.7 ! _.y+_.i ! v.U l+_.U ! ! i 8 .+i &+i i B+U &.T &.l y+! l+&.4 ^ l &.l+l+g+5.y+y+8 B+I.[+F+}+Y 9 Y (+Y x.H.Y Y H.x.Y Y Y 1+Y Y H.Y Y I.U U [+y+_.B+[+H.t.y.~.#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < < < ~ s.++^.b+t.i+h+x.!.Y (+[+F+9 I.g+F+F+I.F+[+[+[+(+Y (+H.!.!.H.1+H.h+[+l+! 4 7.z z z &.l v.v.^ V 7.l l+! 7.^ 4 l+l+^ l+! r+! v.r+! r+l+y+l+l y+l l+l+v._._.v._.B+l+l+l+U 8 i ! l+_._.B+_.&._.y+l v._.! l v.&.l y+[+x.[+_.U _.F+F+F+9 (+H.Y 1+1+!.H.1+1+1+x.!.1+Y H.!.9 I.F+(+g+B+y+I.8 U 5.(+i+t.y.~.~ ~ < v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ~ ~ #+~.^.J t.N.i+h+{.{.1+!.!.H.H.H.H.H.H.!.1+H.1+x.x.x.{.x.h+h+h+x.5.}.&.7.V V 7.7.}.4 7.^ ^ ^ &.! v.v.v.l+l+4 l l+v.l &.v.l _.l ! v.&.}.l y+v.l+y+v.l+U l+_._.8 l+_.U B+U y+! ! _.y+y+y+y+l+l l ^ v.&.y+l l+U Y x.!.5.U U y+g+F+9 9 Y Y H.H.1+!.!.!.1+x.Y Y 9 9 Y [+[+F+(+5.y+B+[+5.5.[+1+N.t.++K.~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < ~ ~ #+K.++^.y.J t.N.N.i+h+i+{.h+h+{.{.h+{.h+h+i+i+i+i+i+i+N.i+N.(+_.&.^ z V V 7.l ! V ^ ^ ^ ! v.4 7.l+}.l l l ! ! 4 ! l+l ! }.r+y+l v.y+v.U v.! U ! l+U U l+l+g+U 8 8 _.U 8 _.l+l+l+l+U y+! v.v.^ 4 ! y+l }.[+H.{.x.Y I.I.l+5.g+I.[+9 9 9 (+H.1+Y (+(+H.9 9 9 9 (+I.g+I.9 F+8 g+9 F+[+!.h+J t.++#+~ < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v < ~ ~ #+#+j+~.^.J J J N.t.N.i+N.i+N.N.i+i+i+N.i+N.N.t.N.t.N.t.h+I._.&.7.V 7.4 4 V &.4 7.v.}.l ^ ^ l y+_.l l l+l+^ v.y+&.v.y+v.&.y+v.l+y+! B+! ! B+}.l+_.8 _._.8 g+g+U _._.U 8 l+l+l+_.U y+! &.l l r+l+! y+_.9 !.i+h+h+H.I._.y+F+g+I.9 9 9 [+Y !.(+9 Y Y Y 9 I.[+(+I.I.F+(+9 [+I.(+H.1+h+N.t.++s.#+< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < < < ~ #+#+s.++++^.J J J t.t.t.N.t.t.t.N.t.t.J t.J J J t.H Y y+l+&.7.^ l l 7.7.v.l ! &.l 4 r+l+l+r+4 _.l+&.l &.y+l+&.l+_.v.y+_.&.y+l+! 8 l+l+g+i l+_.g+U U 5.I.5.y+_._._.i 8 l+_.U y+_.l+l+l l &.l+v.B+B+Y 1+i+h+i+h+(+[+g+F+5.I.[+9 9 [+(+H.(+[+9 (+(+9 F+[+Y [+[+[+(+9 F+[+H.{.i+N.t.J ++#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < 0 ~ ~ ~ #+s.~.++~.^.++^.J y.H y.J y.^.^.++++++++^.~.^.[+l+! &.4 7.7.7.V 7._.&.l ^ l l l+l+v.l &.8 y+l+l y+l+v.l+y+&.l+U ! l+B+! ! g+! _.B+U _.U g+g+8 U U 5.8 U y+_.l+I.y+y+U l+&.l+_.}.l y+! l y+[+Y {.i+N.i+t.!.(+I.F+g+[+[+9 9 F+[+Y 9 [+F+9 Y (+9 9 (+[+I.[+(+(+(+H.x.h+N.N.J ^.; #+~ 0 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 v < < < ~ ~ #+#+#+s.; K.~.~.K.~.~.~.~.~.#+~.#+K.#+K.h+I.l+&.&.l ^ 7.7.^ v.}.4 l ^ l }.! l ^ ! l+! v.y+y+l+v.l+y+_.&.U y+l+l+I.l+l+I._._.U g+B+8 g+j.g+y+_.B+I.U y+y+_.U 5.5.y+l+&.v.&.l+! y+&.&.l+9 H.h+N.t.t.J i+!.Y 9 F+9 F+9 Y (+Y Y Y (+9 9 Y 9 [+[+9 [+F+9 !.x.h+h+i+i+t.t.y.s.~ ~ < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v 0 v 0 < < < < ~ < ~ ~ ~ #+#+#+#+#+#+#+~ ~ ~ < #+~ #+Y y+l+l ^ 7.7.7.^ &.l _.r+4 &._.! l &.&._.l+l ! U g+y+! y+U &.&.U y+l+_.I.l+}.F+U y+B+9 F+g+y+I.8 U y+U g+8 y+y+y+}.[+F+l+l+! v.v.&.y+l+&.! y+9 x.i+t.N.b+t.y.t.i+x.Y (+5.I.9 [+F+9 9 [+[+F+9 F+F+g+[+(+(+x.h+h+i+i+i+t.J y.~.#+#+< 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v 0 0 < < < < < < < < < < < ~ 0 ~ ~ 0 < < ++Y l+! ^ 4 7.^ ^ v.l ^ l _.v._.l+&.&.l+y+l+&.&.! B+! _.U F+}.y+y+I.y+y+U I.y+U F+F+F+8 j.B+U B+B+F+y+U U U g+5._.U I._.U g+l+&.! l l+y+l+&.l+g+Y x.N.t.J ^.++++^.J t.h+1+H.Y 9 9 F+F+[+F+5.5.[+[+[+(+H.x.h+h+h+h+i+N.N.y.^.~.#+~ < < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v v v v 0 0 0 < 0 0 0 < 0 0 0 0 0 0 v < ~ N.U }.^ 7.l ^ l ! l+r+4 r+l+l+l+! ! l+y+_.l+&.l+y+l+! ! U I.B+B+[+8 I.g+[+[+g+F+[+8 B+U F+5.U U 5.j.8 U U y+B+I.g+B+B+}._.U y+l+l l+_.}.y+l+_.I.H.h+N.t.y.^.K.K.~.^.y.J N.h+x.1+!.!.(+(+9 [+(+Y !.!.x.{.U.h+i+i+N.N.t.J ^.~.#+#+~ < v v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 v v v 0 v v v 0 v v =.v v v < i+_.l 7.V v.&.v.r+4 r+l v.y+y+l+l ! y+U l+! l+U 8 l+l+y+B+y+y+y+F+y+y+U I.B+U 5.F+U U B+[+I.U y+B+I.I.U B+B+y+I.F+B+y+y+l+y+B+l+v.y+! v.y+y+5.[+H.h+t.J ^.~.s.#+#+K.^.^.y.J N.i+i+i+{.x.x.1+x.x.{.h+i+i+i+i+N.N.t.J y.^.s.#+~ < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v v =.v =.v v 0 0 ~ x.l+7.V V l ! l ^ l l ! ! _.l+l+&._.U y+}.! y+5.y+_.}.5.5._._.y+I.U y+B+[+U U 5.[+B+B+B+I.[+5.B+U 5.(+U U 5.I.[+[+U _.U }.l+U y+}.B+&.l l+B+g+9 !.N.t.y.K.#+#+~ ~ #+#+K.^.y.J t.t.N.N.i+i+i+i+i+i+N.i+i+N.N.t.t.^.^.~.#+#+~ < < v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.v =.v 0 ++9 v.7.7.^ &.r+^ l l ! }.l+l+! y+U y+y+_.y+y+B+U }.U 5.5.U y+U [+5.B+y+I.[+B+5.8 [+5.B+B+5.[+g+5.B+U [+5.g+I.g+5.I.g+y+y+l+l+_.U U _.v.l ! B+F+(+{.N.J y.K.#+~ ~ < ~ ~ #+s.++~.^.y.t.J N.t.t.N.N.N.t.t.t.J J ^.++~.s.#+~ < < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.v < t.g+v.7.^ v.v.&.^ l &.y+_.! l ! 8 g+B+_.l+y+F+g+_.y+U [+B+y+B+U [+B+y+g+[+F+B+g+5.(+g+8 5.5.9 5.B+8 B+5.9 [+I.B+y+5.F+U _._._.y+B+g+v.&.l+l+I.9 Y i+t.J ~.#+~ < 0 0 < < ~ #+#+s.s.K.~.y.^.y.J y.y.y.J ^.++^.~.K.s.#+#+~ < < 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 < t.I.y+7.l ^ 7.! v.l _.l+l+! &._.B+8 B+U U B+F+8 y+5.g+[+B+B+g+I.[+I.I.g+(+g+B+5.5.9 5.5.g+8 (+5.B+g+I.[+(+g+U 8 U B+5.g+y+y+U y+y+B+! v.l+y+F+Y x.i+t.y.s.#+~ < 0 0 0 0 0 0 ~ ~ #+s.s.#+K.K.~.~.~.++~.K.K.s.#+#+~ < < < 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 0 t.8 _.! 4 ^ ^ ! v.! l+! ! l+y+U y+_.y+I.I.F+5.B+5.g+(+I.I.g+g+Y I.g+g+5.Y I.I.g+I.(+g+g+I.5.(+g+F+[+[+F+[+g+B+B+y+B+I.8 y+y+U U &.y+y+l+y+y+B+(+{.N.J ++K.~ < 0 0 v v 0 0 0 0 < ~ ~ ~ ~ #+#+#+#+#+#+#+#+#+~ ~ ~ < < 0 v 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 < t.F+_.l V ^ 7.4 }.l &.&.l+! B+I.y+y+y+U 9 9 F+I.I.9 9 F+F+F+(+9 I.[+F+[+(+[+F+[+[+(+g+g+I.[+9 Y [+[+g+5.g+9 5.B+U y+U g+U I.y+_.l+&.g+_.U l+B+!.i+t.J K.#+~ < 0 v =.v v v v 0 v 0 < < < < < ~ < ~ ~ ~ < < < 0 < 0 0 0 v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< < t.[+U 4 ^ ^ 4 l+_.&.l l+! y+8 y+y+U U F+[+[+Y Y Y Y Y (+[+9 Y Y 9 9 9 Y H.9 F+F+F+Y [+(+(+[+9 (+F+g+8 g+I.[+B+U U U y+F+I.U }.l+! ! U y+U U 9 {.N.t.^.K.#+< 0 v =.=.=.=.=.v v 0 v v 0 0 0 0 0 0 0 0 0 0 < 0 0 v 0 v =.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.0 < t.[+U ^ ^ 7.l l+! l+&.&.y+B+y+y+y+U I.(+[+F+(+(+H.1+1+H.H.H.1+!.Y H.Y H.H.(+(+(+(+1+(+9 [+[+F+9 I.g+g+5.I.[+5.U U B+5.g+[+_._.}.l+l+y+y+B+[+1+i+t.J ++#+~ < 0 0 =.=.=.=.=.=.=.v v v v v v v v 0 0 v 0 v v v v =.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 ~ J [+l+l ^ l l+l l _.l+&.U y+_.U B+8 [+9 F+9 9 Y 1+!.!.x.x.{.{.{.x.x.x.{.x.x.1+!.Y H.(+[+'+I.F+(+I.I.5.5.g+[+g+B+5.g+I.U [+y+y+_._.y+U 8 g+H.i+N.J ^.s.~ ~ 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < J [+v.l+4 ! ! 4 l ! }.U y+l+l+y+B+9 [+F+[+Y Y 1+{.1+!.1+x.{.{.x.1+1+x.{.1+H.H.H.Y H.(+9 [+[+[+Y I.g+5.8 B+I.F+I.F+g+B+U g+y+_.y+B+y+U I.(+{.N.N.y.~.s.~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < b+[+v.l+v.! l l ! l y+B+U ! l+y+5.[+F+[+(+(+H.x.{.x.{.{.h+i+h+{.h+{.h+h+x.1+H.H.Y 1+(+9 [+[+F+H.I.g+g+B+8 [+(+F+5.U y+y+U B+y+U 8 _.y+(+1+i+N.t.^.K.#+~ 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < < y.9 ! l ! l ^ v.&.&.y+y+U y+_.B+F+g+[+F+9 (+1+2+x.x.{.{.h+i+i+h+h+{.i+i+{.{.1+1+!.x.(+(+[+[+I.(+g+g+g+g+I.[+9 8 U y+y+y+y+F+U B+B+y+5.!.h+N.t.y.~.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ^.Y _.4 l+4 l l l y+U l+! [+g+y+[+I.g+[+9 H.x.x.1+h+2+h+i+N.i+h+i+h+i+i+{.{.1+!.!.x.(+9 [+[+[+H.I.I.F+(+[+g+[+B+B+U y+y+_.9 B+U y+g+Y 1+t.N.J ~.s.~ < < 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 < ~ U.U y+4 l+l 4 &.5.}._.y+}.8 9 '+5.I.F+[+H.!.!.!.{.x.h+N.h+h+i+i+i+i+h+h+{.2+x.x.H.Y (+[+[+F+[+(+[+9 5.B+U [+I.U y+y+B+U '+y+U g+H.{.N.N.J ^.#+#+< 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < #+N.I.y+l v.v.l y+y+l+_.y+y+5.[+[+F+9 F+(+Y H.H.1+x.{.h+i+{.h+h+h+h+N.h+h+x.x.1+{.H.(+9 (+(+(+Y Y F+g+5.B+5.[+8 U B+B+g+5.F+U F+H.x.i+N.J y.~.#+~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < ~ J (+y+l ^ ! l+l+! }.y+y+5.I.I.I.'+9 (+H.H.Y Y Y 1+x.h+h+x.{.h+h+h+N.{.h+x.x.!.2+H.Y !.H.(+[+9 (+g+5.g+8 5.I.U y+g+g+g+B+[+F+H.{.i+N.t.J ++#+~ ~ 0 v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~ ++h+U 4 l l y+l+&.l+_.U I.'+8 5.I.F+[+Y H.!.1+1+!.1+{.{.x.2+x.x.{.h+2+{.x.x.x.h+1+!.(+9 [+I.[+9 I.g+5.B+U I.I.g+g+g+U g+(+H.x.i+N.N.y.++s.#+~ 0 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 ~ #+t.(+l+&.l l+l+l+! ! B+I.g+5.8 g+I.[+(+(+9 H.!.1+h+h+h+{.h+{.{.h+U.h+h+{.x.1+x.H.Y 9 [+[+I.9 (+I.5.U g+B+I.9 F+5.5.g+9 1+{.i+N.t.J ^.K.~ < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v < < ~ ^.i+[+l l+&.l+l+y+l+5.I.B+5.g+I.[+9 (+[+9 (+Y H.x.!.H.!.!.1+1+h+x.!.!.!.H.H.1+(+9 9 [+[+g+[+[+5.5.g+F+g+I.9 g+5.[+Y !.h+i+N.t.y.^.s.#+~ < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v < < K.^.1+y+y+&.! ! U y+8 B+U B+g+8 '+9 9 [+[+9 9 Y !.H.Y H.H.H.H.1+H.H.Y Y Y (+!.(+9 [+I.[+g+[+(+I.F+[+F+F+F+F+I.9 H.x.h+h+N.t.J ++K.#+~ < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 < ~ #+j+N.Y y+&.l ! ! B+U U y+8 5.g+I.Y [+F+[+9 9 (+!.Y (+Y Y Y Y 1+Y Y (+(+(+Y H.(+9 [+F+F+g+F+[+F+[+g+5.g+[+9 [+1+{.i+i+N.t.y.^.s.#+~ < < v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~ #+~.i+[+l+v.! ! 8 I.F+U B+5.U F+(+F+F+[+[+[+H.Y 9 (+(+9 (+(+1+9 (+9 (+[+9 H.[+[+I.I.[+F+(+(+F+5.g+g+F+(+!.x.h+i+N.N.t.y.++; #+~ < 0 0 =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ~ #+K.J {.9 U l+! B+U B+g+F+F+F+9 g+5.g+I.[+[+Y 9 9 9 9 9 9 (+H.9 9 [+[+[+[+Y 9 [+(+(+(+[+[+9 I.I.I.[+(+!.x.h+i+N.N.J y.^.K.#+~ < 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 < ~ #+~.J h+(+8 _.I.y+y+U B+I.(+(+9 [+F+I.F+[+Y 9 [+[+F+[+F+9 9 [+[+[+9 9 (+H.(+(+[+F+g+8 F+[+F+F+(+H.x.h+h+i+N.t.J ^.++s.#+< < < 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < ~ #+~.J h+(+F+B+U y+U y+B+[+F+F+[+(+(+(+Y (+[+[+F+F+9 [+H.(+(+Y (+(+(+(+Y [+F+[+F+g+I.[+9 (+Y x.{.h+i+N.N.t.y.^.K.#+~ < < 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v ~ ~ #+j+++b+h+H.8 U U B+y+g+[+g+g+g+I.F+F+(+H.Y H.H.Y (+(+H.(+(+9 9 [+[+(+9 F+I.g+F+F+(+H.H.1+{.h+i+i+N.N.J y.^.s.#+#+~ < 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 0 < #+K.~.t.h+1+(+F+I.g+I.[+I.g+I.I.I.F+9 9 9 [+9 9 [+[+Y [+[+[+9 [+F+9 [+F+I.[+[+9 Y x.{.h+h+i+N.t.t.y.^.K.K.#+~ < 0 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.0 < ~ #+#+~.y.N.{.1+H.(+(+[+[+[+[+[+9 (+Y 9 [+9 9 9 [+(+(+[+[+(+(+9 [+Y (+(+Y H.x.x.h+h+h+i+t.N.t.y.++~.s.#+~ ~ < < 0 v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 0 < 0 < #+~.~.y.J N.{.x.x.!.Y H.(+[+9 (+H.(+(+Y (+(+(+!.(+(+9 9 (+(+9 Y H.!.x.x.h+h+i+N.N.t.t.J ^.K.++K.#+~ ~ 0 0 v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.0 0 < ~ ~ #+++++J t.N.i+h+h+{.{.x.1+1+H.H.Y H.!.H.!.1+H.H.!.1+x.x.x.x.{.h+h+i+i+N.N.t.J y.^.++~.#+#+~ < < < 0 v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 < ~ ~ #+~.^.b+J t.N.N.i+i+i+i+h+i+h+h+h+h+h+h+i+h+{.h+h+h+h+h+h+i+i+N.N.N.t.t.y.^.++K.#+#+~ ~ < < 0 v v v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 < ~ ~ ~ s.~.^.^.y.y.N.N.N.N.i+N.i+i+i+i+i+h+i+U.h+U.i+i+N.N.i+N.t.t.t.J ^.^.~.K.#+#+~ ~ < < 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 < ~ ~ #+#+K.++^.^.y.t.t.t.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.t.J J y.++++~.#+#+#+~ ~ < 0 0 v v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< =.0 =.=.=.=.=.0 =.v =.=.0 =.< =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 < ~ ~ #+#+K.~.~.++^.y.b+J t.J t.t.t.t.N.t.J t.b+b+y.H y.^.++~.s.#+#+~ ~ ~ 0 0 < 0 0 v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.< x.=.=.=.0 =.=.=.=.=.=.< 1+=.=.=.=.v < =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v 0 0 < < ~ ~ ~ s.#+j+~.++~.++^.^.H ++^.^.++++++++++~.~.K.#+#+#+~ ~ ~ < 0 0 0 0 v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v H.. ~.v v =.v 0 0 v 0 v 1+. ++v =.J B+v =.v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 0 0 < < < < ~ ~ ~ #+#+#+; ~.~.K.K.~.K.#+~.#+#+#+~ #+~ ~ ~ < < < 0 0 0 v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.h+&.K.v v =.=.=.=.=.=.v {.l ; =.0 V ! v =.0 =.=.=.=.=.=.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v 0 v 0 < < < < ~ ~ ~ ~ ~ ~ ~ ~ ~ #+~ ~ ~ ~ ~ ~ ~ < < 0 0 < 0 v v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v v v =.=.=.~ =.v =.v 0 =.v =.v v =.< =.v _.. ^ K.++0 v < =.=.=.=.v =.=.v =.=.=.=.=.=.=.=.v v =.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.v 0 0 v v 0 < < < < < < < < < < < 0 0 0 0 0 0 0 v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 =.v =.=.v =.v F+< < =.=.[+^.v Y ^ 7.t.Y v #+U . . z . ^ ; N.~ g+&.(+1+h+=.i+&.z z l =.N.N.~.< h+&.(+< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.v v 0 v 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 v v v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.v =.=.v =.. (+=.0 =.l+&.r+z . . l+l+=.=.0 z ^ N.t.#+V [+J z . r+z z g+. . . V y+H.z V z H.Y z . B+=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.=.v =.v v v v v v v v v v v =.=.v v v =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.=.0 K.l !.=.y.. U v 0 =.7.. z V h+; z 7.=.#+H.. 7.~ s._.z y+=.t.~ (+l z z . H.< l+x.V . H.. z y+U 1+x.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v v =.=.[+. V 7.. &.K.=.=.. . l ++=.< . . ^ z z . . . . . V . v.&.^ . ! . V t.=.=.i+. ^ =.t.z . y+H.B+r+I.< =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.0 v =.Y . . z (+z ~ =.z 7.~ =.=.=.l z . . t.V . . V 5.^ . . V . z V . N.v 0 =.V V (+=.=._.. z . z _.~ =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v 0 v =.0 =.v Y ! (+1+. ^.=.F+(+=.=.0 =.~.B+_.h+=.y.l+. F+v =.Y _.v.[+; 1+l+< =.=.0 l . . . l =.H._.y+(+v =.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< =.=.=.=.0 =.~.=.=.< =.0 =.=.< =.=.=.v =.=.< =.=.=.=.< =.=.v v =.0 =.=.v =.v 0 ++i+1+=.=.=.0 v =.< =.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.v =.< =.=.=.=.v =.0 v =.=.=.0 =.0 v =.=.=.=.=.=.=.v =.v =.=.v =.=.=.v =.=.=.=.=.=.v =.v =.=.=.=.=.=.=.v =.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\",\n\"=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.\"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/stop.xpm",
    "content": "/* XPM */\nstatic char * stop_xpm[] = {\n\"32 20 2 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"           ..........           \",\n\"           ..........           \",\n\"           ..........           \",\n\"           ..........           \",\n\"           ..........           \",\n\"           ..........           \",\n\"           ..........           \",\n\"           ..........           \",\n\"           ..........           \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "share/k3d/ngui/pixmap/unpinned.xpm",
    "content": "/* XPM */\nstatic char * unpinned_xpm[] = {\n\"16 15 57 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"+\tc #0C0C0C\",\n\"@\tc #161616\",\n\"#\tc #EEEEEE\",\n\"$\tc #000100\",\n\"%\tc #0E0E0E\",\n\"&\tc #151314\",\n\"*\tc #010101\",\n\"=\tc #C8C8C8\",\n\"-\tc #FEFFFF\",\n\";\tc #111312\",\n\">\tc #020202\",\n\",\tc #1B1B1B\",\n\"'\tc #F4F4F4\",\n\")\tc #090708\",\n\"!\tc #0A0A0A\",\n\"~\tc #C0C0C0\",\n\"{\tc #F2F4F3\",\n\"]\tc #737574\",\n\"^\tc #FFFFFF\",\n\"/\tc #787878\",\n\"(\tc #F8F8F8\",\n\"_\tc #020001\",\n\":\tc #9A9A9A\",\n\"<\tc #8B8B8B\",\n\"[\tc #777777\",\n\"}\tc #929292\",\n\"|\tc #7E7E7E\",\n\"1\tc #BCBCBC\",\n\"2\tc #BEC0BF\",\n\"3\tc #858786\",\n\"4\tc #BDBDBD\",\n\"5\tc #CCCCCC\",\n\"6\tc #7C7C7C\",\n\"7\tc #BBBBBB\",\n\"8\tc #161415\",\n\"9\tc #050505\",\n\"0\tc #030303\",\n\"a\tc #040404\",\n\"b\tc #C9C9C9\",\n\"c\tc #7C7E7D\",\n\"d\tc #050706\",\n\"e\tc #7F7F7F\",\n\"f\tc #060606\",\n\"g\tc #CBCBCB\",\n\"h\tc #010000\",\n\"i\tc #888888\",\n\"j\tc #0D0D0D\",\n\"k\tc #797979\",\n\"l\tc #141414\",\n\"m\tc #6F6F6F\",\n\"n\tc #111111\",\n\"o\tc #080808\",\n\"p\tc #0B0B0B\",\n\"q\tc #070707\",\n\"r\tc #101010\",\n\"                \",\n\"                \",\n\"      .+        \",\n\"      @#$    %& \",\n\"      *=-;>.,') \",\n\"      !~{]^^/(_ \",\n\"/:<[}|>12345678 \",\n\"9.0*>9abcde[fgh \",\n\"      >if.j9>k. \",\n\"      lm.!a.a.n \",\n\"      *o9    pq \",\n\"      r.        \",\n\"                \",\n\"                \",\n\"                \"};\n"
  },
  {
    "path": "share/k3d/ngui/rasterized/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.png k3d/ngui/rasterized)\n\n"
  },
  {
    "path": "share/k3d/ngui/scalable/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.svg k3d/ngui/scalable)\n\nFIND_PROGRAM(RSVG_COMMAND rsvg)\n\nIF(RSVG_COMMAND)\n\tFILE(GLOB SVG_FILES *.svg)\n\tLIST(SORT SVG_FILES)\n\n\tFOREACH(SVG_FILE ${SVG_FILES})\n\t\tGET_FILENAME_COMPONENT(SVG_NAME ${SVG_FILE} NAME_WE)\n\t\tSET(PNG_BINARY_FILE \"${share_BINARY_DIR}/ngui/rasterized/${SVG_NAME}.png\")\n\t\tLIST(APPEND PNG_BINARY_FILES ${PNG_BINARY_FILE})\n\n\t\tADD_CUSTOM_COMMAND(\n\t\t\tDEPENDS ${SVG_FILE}\n\t\t\tCOMMAND ${RSVG_COMMAND} ${SVG_FILE} ${PNG_BINARY_FILE}\n\t\t\tOUTPUT ${PNG_BINARY_FILE}\n\t\t\t)\n\tENDFOREACH(SVG_FILE)\n\n\tADD_CUSTOM_TARGET(rasterize-svg-resources\n\t\tDEPENDS ${PNG_BINARY_FILES}\n\t\t)\nENDIF()\n\n"
  },
  {
    "path": "share/k3d/ngui/tool_layout.k3d",
    "content": "<k3dml>\n\t<application>\n\t\t<user_interface>\n\t\t\t<tools>\n\t\t\t\t<move\n\t\t\t\t\tsize=\"10\"\n\t\t\t\t\tcurrent_color=\"1 1 0\"\n\t\t\t\t\tx_color=\"1 0 0\"\n\t\t\t\t\ty_color=\"0 1 0\"\n\t\t\t\t\tz_color=\"0 0 1\"\n\t\t\t\t\tscreen_xy_color=\"0.9 0.9 0.9\"\n\t\t\t\t\tplane_offset=\"5\"\n\t\t\t\t\tplane_size=\"4.8\"\n\t\t\t\t\tscreen_xy_radius=\"0.5\"\n\t\t\t\t\tscreen_xy_slices=\"8\"\n\t\t\t\t\tscreen_xy_stacks=\"8\"\n\t\t\t\t\taxis_start=\"5\"\n\t\t\t\t\taxis_end=\"10\"\n\t\t\t\t\taxis_line_width=\"1\"\n\t\t\t\t\taxis_arrow_radius=\"0.5\"\n\t\t\t\t\taxis_arrow_length=\"2.0\"\n\t\t\t\t\taxis_arrow_slices=\"8\" />\n\t\t\t\t<rotate\n\t\t\t\t\tsize=\"10\"\n\t\t\t\t\tcurrent_color=\"1 1 0\"\n\t\t\t\t\tx_color=\"1 0 0\"\n\t\t\t\t\ty_color=\"0 1 0\"\n\t\t\t\t\tz_color=\"0 0 1\"\n\t\t\t\t\tscreen_z_color=\"0.9 0.9 0.9\"\n\t\t\t\t\thandle_size=\"6\"\n\t\t\t\t\thandle_major_radius=\"1\"\n\t\t\t\t\thandle_minor_radius=\"0.03\"\n\t\t\t\t\thandle_u_segments=\"32\"\n\t\t\t\t\thandle_v_segments=\"8\"\n\t\t\t\t\tscreen_z_handle_size=\"8\" />\n\t\t\t\t<scale\n\t\t\t\t\tsize=\"10\"\n\t\t\t\t\tcurrent_color=\"1 1 0\"\n\t\t\t\t\tx_color=\"1 0 0\"\n\t\t\t\t\ty_color=\"0 1 0\"\n\t\t\t\t\tz_color=\"0 0 1\"\n\t\t\t\t\tscreen_xy_color=\"0.9 0.9 0.9\"\n\t\t\t\t\tplane_offset=\"5\"\n\t\t\t\t\tplane_size=\"4.8\"\n\t\t\t\t\taxis_start=\"0\"\n\t\t\t\t\taxis_end=\"10\"\n\t\t\t\t\taxis_line_width=\"1\"\n\t\t\t\t\taxis_box_size=\"0.5\" />\n\t\t\t</tools>\n\t\t</user_interface>\n\t</application>\n</k3dml>\n"
  },
  {
    "path": "share/k3d/ngui/toolbar_layout.k3d",
    "content": "<k3dml>\n\t<application>\n\t\t<user_interface>\n\t\t\t<toolbars>\n\t\t\t\t<toolbar name=\"create\" label=\"Create\" description=\"Primitive Geometry\">\n\t\t\t\t\t<node name=\"PolyCube\"/>\n\t\t\t\t\t<node name=\"PolyGrid\"/>\n\t\t\t\t\t<node name=\"PolyCone\"/>\n\t\t\t\t\t<node name=\"PolyCylinder\"/>\n\t\t\t\t\t<node name=\"PolySphere\"/>\n\t\t\t\t\t<node name=\"PolySphereTessellation\"/>\n\t\t\t\t\t<node name=\"PolyTorus\"/>\n\t\t\t\t\t<separator/>\n\t\t\t\t\t<node name=\"QuadricCone\"/>\n\t\t\t\t\t<node name=\"QuadricCylinder\"/>\n\t\t\t\t\t<node name=\"QuadricDisk\"/>\n\t\t\t\t\t<node name=\"QuadricSphere\"/>\n\t\t\t\t\t<node name=\"QuadricTorus\"/>\n\t\t\t\t\t<node name=\"QuadricHyperboloid\"/>\n\t\t\t\t\t<node name=\"QuadricParaboloid\"/>\n\t\t\t\t\t<separator/>\n\t\t\t\t\t<node name=\"NurbsCone\"/>\n\t\t\t\t\t<node name=\"NurbsCylinder\"/>\n\t\t\t\t\t<node name=\"NurbsDisk\"/>\n\t\t\t\t\t<node name=\"NurbsSphere\"/>\n\t\t\t\t\t<node name=\"NurbsTorus\"/>\n\t\t\t\t\t<node name=\"NurbsHyperboloid\"/>\n\t\t\t\t</toolbar>\n\t\t\t\t<toolbar name=\"modify\" label=\"Modify\" description=\"Modify Geometry\">\n\t\t\t\t\t<node name=\"TranslatePoints\"/>\n\t\t\t\t\t<node name=\"RotatePoints\"/>\n\t\t\t\t\t<node name=\"ScalePoints\"/>\n\t\t\t\t\t<node name=\"ShearPoints\"/>\n\t\t\t\t\t<node name=\"TaperPoints\"/>\n\t\t\t\t\t<node name=\"BendPoints\"/>\n\t\t\t\t\t<node name=\"BulgePoints\"/>\n\t\t\t\t\t<node name=\"TwistPoints\"/>\n\t\t\t\t\t<node name=\"LinearWavePoints\"/>\n\t\t\t\t\t<node name=\"CylindricalWavePoints\"/>\n\t\t\t\t\t<separator/>\n\t\t\t\t\t<node name=\"BevelFaces\"/>\n\t\t\t\t\t<node name=\"BevelPoints\"/>\n\t\t\t\t</toolbar>\n\t\t\t</toolbars>\n\t\t</user_interface>\n\t</application>\n</k3dml>\n"
  },
  {
    "path": "share/k3d/qtui/CMakeLists.txt",
    "content": "ADD_SUBDIRECTORY(icons)\nADD_SUBDIRECTORY(scripted_modes)\nADD_SUBDIRECTORY(sounds)\n"
  },
  {
    "path": "share/k3d/qtui/icons/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.svg k3d/qtui/icons)\n"
  },
  {
    "path": "share/k3d/qtui/scripted_modes/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.js k3d/qtui/scripted_modes)\n"
  },
  {
    "path": "share/k3d/qtui/scripted_modes/browser.js",
    "content": "// k3d:plugin-class=\"application\"\n// k3d:plugin-type=\"QTUIProgrammableMode\"\n// k3d:plugin-name=\"QTUIBrowserMode\"\n// qtui:component-type=\"mode\"\n\n// Create states ...\nvar state = new Object();\nstate.initial = new QState();\nstate.running = new QState();\nstate.finished = new QState();\n\nstate.machine = new QStateMachine();\nstate.machine.addState(state.initial);\nstate.machine.addState(state.running);\nstate.machine.addState(state.finished);\nstate.machine.initialState = state.initial;\n\n// Create widgets\nvar widget = new Object();\nvar proxy = new Object();\n\nwidget.browser = new QWebView();\nwidget.browser.setWindowOpacity(0.7);\nproxy.browser = scene.addWidget(widget.browser);\n//proxy.browser.setGeometry(50, 50, 600, 400);\n\n/*\nback_button = new QPushButton(\"Back\");\nback_button.clicked.connect(function() { browser.back(); });\nproxy = scene.addWidget(back_button);\nproxy.setGeometry(50, 20, 100, 20);\n\nforward_button = new QPushButton(\"Forward\");\nforward_button.clicked.connect(function() { browser.forward(); });\nproxy = scene.addWidget(forward_button);\nproxy.setGeometry(170, 20, 100, 20);\n*/\n\n// Control widgets based on the current state ...\nstate.initial.assignProperty(proxy.browser, \"geometry\", new QRect(-600, 50, 600, 400));\n\nstate.running.assignProperty(proxy.browser, \"geometry\", new QRect(50, 50, 600, 400));\nstate.running.propertiesAssigned.connect(function() { widget.browser.load(new QUrl(\"http://www.k-3d.org\")); });\n\nstate.finished.assignProperty(proxy.browser, \"geometry\", new QRect(-600, 50, 600, 400));\nstate.finished.propertiesAssigned.connect(function() { scene.set_active_mode(\"QTUIConsoleMode\"); });\n\n// Setup transitions between states ...\nvar transition = new Object();\n\ntransition.start = state.initial.addTransition(state.running);\n\ntransition.finish = new QKeyEventTransition(scene.views()[0], QEvent.KeyPress, Qt.Key_C);\ntransition.finish.targetState = state.finished;\nstate.running.addTransition(transition.finish);\n\n// Setup animated transitions ...\nvar animation = new Object();\n\nanimation.browser = new QPropertyAnimation(proxy.browser, \"geometry\");\nanimation.browser.easingCurve = new QEasingCurve(QEasingCurve.InOutCubic);\nanimation.browser.duration = 500;\n\ntransition.start.addAnimation(animation.browser);\ntransition.finish.addAnimation(animation.browser);\n\n// Finish setting-up the state machine ...\nstate.machine.start();\n\n"
  },
  {
    "path": "share/k3d/qtui/scripted_modes/console.js",
    "content": "// k3d:plugin-class=\"application\"\n// k3d:plugin-type=\"QTUIProgrammableMode\"\n// k3d:plugin-name=\"QTUIConsoleMode\"\n// qtui:component-type=\"mode\"\n\nfunction prompt()\n{\n\twidget.console.print_html(\"<span style='color:green'>&gt;&gt;&gt;</span> \");\n}\n\nfunction execute(command)\n{\n\twidget.command.text = command;\n\tprompt();\n\tanimation.command.start();\n}\n\n// Create states ...\nvar state = new Object();\nstate.initial = new QState();\nstate.running = new QState();\n\tstate.instructions = new QState(state.running);\n\tstate.visible = new QState(state.running);\n\tstate.hidden = new QState(state.running);\nstate.running.initialState = state.instructions;\nstate.finished = new QState();\n\nmachine = new QStateMachine();\nmachine.addState(state.initial);\nmachine.addState(state.running);\nmachine.addState(state.finished);\nmachine.initialState = state.initial;\n\n// Create widgets ...\nvar widget = new Object();\nvar proxy = new Object();\n\nwidget.console = new k3d.console();\nwidget.console.execute.connect(execute);\nwidget.console.setWindowOpacity(0.7);\nproxy.console = scene.addWidget(widget.console);\nprompt();\n\nwidget.instructions = new QLabel(\"Use F1 for browse mode,\\nF2 to toggle the console.\");\nwidget.instructions.alignment = Qt.AlignCenter;\nwidget.instructions.styleSheet = \"QLabel { color: blue;  background: #f5f5dc; }\";\nwidget.instructions.setWindowOpacity(0.7);\nproxy.instructions = scene.addWidget(widget.instructions);\nproxy.instructions.geometry = new QRect();\n\nwidget.command = new QLabel();\nwidget.command.alignment = Qt.AlignCenter;\nwidget.command.setWindowOpacity(0);\nwidget.command.styleSheet = \"QLabel { color: green; background: #001100; border: 1px solid green; }\";\nproxy.command = scene.addWidget(widget.command);\nproxy.command.geometry = new QRect(20, 400, 600, 50);\n\n// Control widgets based on the current state ...\nstate.initial.assignProperty(proxy.instructions, \"geometry\", new QRect(20, -100, 300, 50));\nstate.initial.assignProperty(proxy.console, \"geometry\", new QRect(20, -100, 500, 100));\n\nstate.instructions.assignProperty(proxy.instructions, \"geometry\", new QRect(20, 20, 300, 50));\n\nstate.visible.assignProperty(proxy.instructions, \"geometry\", new QRect(20, 1000, 300, 50));\nstate.visible.assignProperty(proxy.console, \"geometry\", new QRect(20, 20, 500, 100));\nstate.visible.entered.connect(widget.console.setFocus);\n\nstate.hidden.assignProperty(proxy.console, \"geometry\", new QRect(20, -100, 500, 100));\n\nstate.finished.assignProperty(proxy.instructions, \"geometry\", new QRect(20, 1000, 300, 50));\nstate.finished.assignProperty(proxy.console, \"geometry\", new QRect(20, -100, 500, 100));\nstate.finished.propertiesAssigned.connect(function() { scene.set_active_mode(\"QTUIBrowserMode\"); });\n\n// Setup transitions between states ...\nvar transition = new Object();\n\ntransition.show_instructions = state.initial.addTransition(state.instructions);\n\ntransition.first_show = new QKeyEventTransition(scene.views()[0], QEvent.KeyPress, Qt.Key_F2);\ntransition.first_show.targetState = state.visible;\nstate.instructions.addTransition(transition.first_show);\n\ntransition.hide = new QKeyEventTransition(scene.views()[0], QEvent.KeyPress, Qt.Key_F2);\ntransition.hide.targetState = state.hidden;\nstate.visible.addTransition(transition.hide);\n\ntransition.show = new QKeyEventTransition(scene.views()[0], QEvent.KeyPress, Qt.Key_F2);\ntransition.show.targetState = state.visible;\nstate.hidden.addTransition(transition.show);\n\ntransition.finish = new QKeyEventTransition(scene.views()[0], QEvent.KeyPress, Qt.Key_F1);\ntransition.finish.targetState = state.finished;\nstate.running.addTransition(transition.finish);\n\n// Setup animated transitions ...\nvar animation = new Object();\n\nanimation.instructions = new QPropertyAnimation(proxy.instructions, \"geometry\");\nanimation.instructions.easingCurve = new QEasingCurve(QEasingCurve.InOutCubic);\nanimation.instructions.duration = 500;\n\nanimation.console = new QPropertyAnimation(proxy.console, \"geometry\");\nanimation.console.easingCurve = new QEasingCurve(QEasingCurve.InOutCubic);\nanimation.console.duration = 500;\n\nanimation.command = new QPropertyAnimation(widget.command, \"windowOpacity\");\nanimation.command.duration = 1000;\nanimation.command.startValue = 0;\nanimation.command.setKeyValueAt(0.5, 1);\nanimation.command.endValue = 0;\nanimation.command.easingCurve = new QEasingCurve(QEasingCurve.OutInQuint);\n\ntransition.show_instructions.addAnimation(animation.instructions);\ntransition.first_show.addAnimation(animation.instructions);\ntransition.first_show.addAnimation(animation.console);\ntransition.show.addAnimation(animation.console);\ntransition.hide.addAnimation(animation.console);\ntransition.finish.addAnimation(animation.instructions);\ntransition.finish.addAnimation(animation.console);\n\n// Finish setting-up the state machine ...\nmachine.start();\n\n"
  },
  {
    "path": "share/k3d/qtui/scripted_modes/create_node.js",
    "content": "// k3d:plugin-class=\"application\"\n// k3d:plugin-type=\"QTUIProgrammableMode\"\n// k3d:plugin-name=\"QTUICreateMode\"\n// qtui:component-type=\"mode\"\n\nedit = new QLineEdit();\nedit.setWindowOpacity(0.6);\nedit.returnPressed.connect(\n\tfunction()\n\t{\n\t\tfactory_name = edit.text;\n\t\tnode_name = factory_name;\n\t\tk3d.plugin.create(factory_name, document, node_name);\n\t});\n\nproxy = scene.addWidget(edit);\nproxy.setGeometry(20, 20, 250, 30);\n\nplugin_names = new Array();\nplugins = k3d.plugin.factory.lookup();\nfor(var i = 0; i != plugins.length; ++i)\n{\n  plugin_names.push(plugins[i].name);\n}\n\ncompleter = new QCompleter(plugin_names.sort(), scene);\ncompleter.completionMode = QCompleter.PopupCompletion;\ncompleter.caseSensitivity = Qt.CaseInsensitive;\ncompleter.modelSorting = QCompleter.CaseSensitivelySortedModel;\nedit.setCompleter(completer);\n\n"
  },
  {
    "path": "share/k3d/qtui/scripted_modes/hello_world.js",
    "content": "// k3d:plugin-class=\"application\"\n// k3d:plugin-type=\"QTUIProgrammableMode\"\n// k3d:plugin-name=\"QTUIHelloWorldMode\"\n// qtui:component-type=\"mode\"\n\nbutton = new QPushButton(\"Hello, World!\");\nbutton.setIconSize(new QSize(64, 64));\nbutton.icon = QIcon.fromTheme(\"call-start\");\n// button.icon = new QIcon(\"/home/tshead/src/k3d/share/ngui/scalable/LuxRenderEngine.svg\");\nbutton.clicked.connect(function() { print(\"Hello, World!\"); });\nproxy = scene.addWidget(button);\nproxy.setGeometry(20, 20, 50, 30);\n\nrect = new QGraphicsRectItem(-100, -100, 200, 200, this);\nrect.setBrush(new QBrush(QColor.fromRgbF(0, 1, 0, 0.5)));\nrect.setFlag(QGraphicsItem.ItemIsMovable);\nrect.setPos(200, 200);\n\nlabel = new QGraphicsSimpleTextItem(\"Drag Me\", rect);\n\nscene.addItem(rect);\n\n"
  },
  {
    "path": "share/k3d/qtui/scripted_modes/null.js",
    "content": "// k3d:plugin-class=\"application\"\n// k3d:plugin-type=\"QTUIProgrammableMode\"\n// k3d:plugin-name=\"QTUINullMode\"\n// qtui:component-type=\"mode\"\n\n"
  },
  {
    "path": "share/k3d/qtui/scripted_modes/sound_effects.js",
    "content": "// k3d:plugin-class=\"application\"\n// k3d:plugin-type=\"QTUIProgrammableMode\"\n// k3d:plugin-name=\"QTUISoundEffectsMode\"\n// qtui:component-type=\"mode\"\n\nfunction addSoundButton(text, sound)\n{\n\tbutton = new QPushButton(text);\n\tbutton.clicked.connect(function()\n\t{\n\t\tk3d.log.debug(sound);\n\t\tplayer = Phonon.createPlayer(Phonon.MusicCategory, new MediaSource(sound));\n\t\tplayer.play();\n\t});\n\tproxy = scene.addWidget(button);\n\treturn proxy;\n}\n\nlayout = new QGraphicsLinearLayout(Qt.Vertical);\nlayout.addItem(addSoundButton(\"Harp\", k3d.share_path + \"/qtui/sounds/harp.wav\"));\nlayout.addItem(addSoundButton(\"Are You Sure?\", k3d.share_path + \"/qtui/sounds/areyousure.wav\"));\nlayout.addItem(addSoundButton(\"You Cannot!\", k3d.share_path + \"/qtui/sounds/youcannot.wav\"));\n\nform = new QGraphicsWidget();\nform.setLayout(layout);\nscene.addItem(form);\n\n"
  },
  {
    "path": "share/k3d/qtui/scripted_modes/state_machine.js",
    "content": "// k3d:plugin-class=\"application\"\n// k3d:plugin-type=\"QTUIProgrammableMode\"\n// k3d:plugin-name=\"QTUIStateMachineMode\"\n// qtui:component-type=\"mode\"\n\nbutton = new QPushButton(\"\");\nbutton.clicked.connect(function() { print(\"Voila!\"); });\nproxy = scene.addWidget(button);\nproxy.setGeometry(20, 20, 50, 30);\n\nstate1 = new QState();\nstate1.assignProperty(button, \"text\", \"State 1\");\nstate1.assignProperty(proxy, \"geometry\", new QRect(20, 20, 50, 30));\n\nstate2 = new QState();\nstate2.assignProperty(button, \"text\", \"State 2\");\nstate2.assignProperty(proxy, \"geometry\", new QRect(400, 300, 100, 30));\n\nstate3 = new QState();\nstate3.assignProperty(button, \"text\", \"State 3\");\nstate3.assignProperty(proxy, \"geometry\", new QRect(400, 100, 150, 30));\n\ntransition2 = state1.addTransition(button, \"clicked()\", state2);\ntransition3 = state2.addTransition(button, \"clicked()\", state3);\ntransition1 = state3.addTransition(button, \"clicked()\", state1);\n\nanimation = new QPropertyAnimation(proxy, \"geometry\");\nanimation.easingCurve = new QEasingCurve(QEasingCurve.InOutCubic);\nanimation.duration = 750;\ntransition1.addAnimation(animation);\ntransition2.addAnimation(animation);\ntransition3.addAnimation(animation);\n\nmachine = new QStateMachine();\nmachine.addState(state1);\nmachine.addState(state2);\nmachine.addState(state3);\nmachine.initialState = state1;\nmachine.start();\n"
  },
  {
    "path": "share/k3d/qtui/sounds/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.wav k3d/qtui/sounds)\n"
  },
  {
    "path": "share/k3d/resolutions.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<application>\n\t\t<resolutions>\n\t\t\t<resolution name=\"320x240\" description=\"\" width=\"320\" height=\"240\"/>\n\t\t\t<resolution name=\"480x360\" description=\"\" width=\"480\" height=\"360\"/>\n\t\t\t<resolution name=\"640x480\" description=\"\" width=\"640\" height=\"480\"/>\n\t\t\t<resolution name=\"800x600\" description=\"\" width=\"800\" height=\"600\"/>\n\t\t\t<resolution name=\"1024x768\" description=\"\" width=\"1024\" height=\"768\"/>\n\t\t\t<resolution name=\"1280x960\" description=\"\" width=\"1280\" height=\"960\"/>\n\t\t\t<resolution name=\"1600x1200\" description=\"\" width=\"1600\" height=\"1200\"/>\n\t\n\t\t\t<resolution name=\"32x32\" description=\"\" width=\"32\" height=\"32\"/>\n\t\t\t<resolution name=\"64x64\" description=\"\" width=\"64\" height=\"64\"/>\n\t\t\t<resolution name=\"128x128\" description=\"\" width=\"128\" height=\"128\"/>\n\t\t\t<resolution name=\"256x256\" description=\"\" width=\"256\" height=\"256\"/>\n\t\t\t<resolution name=\"512x512\" description=\"\" width=\"512\" height=\"512\"/>\n\t\t\t<resolution name=\"1024x1024\" description=\"\" width=\"1024\" height=\"1024\"/>\n\t\n\t\t\t<resolution name=\"Full Camera Aperture (1K)\" description=\"\" width=\"1024\" height=\"768\"/>\n\t\t\t<resolution name=\"Full Camera Aperture (2K)\" description=\"\" width=\"2048\" height=\"1536\"/>\n\t\t\t<resolution name=\"Full Camera Aperture (4K)\" description=\"\" width=\"4096\" height=\"3072\"/>\n\n\t\t\t<resolution name=\"Academy Full Frame (1K)\" description=\"\" width=\"914\" height=\"666\"/>\n\t\t\t<resolution name=\"Academy Full Frame (2K)\" description=\"\" width=\"1828\" height=\"1332\"/>\n\t\t\t<resolution name=\"Academy Full Frame (4K)\" description=\"\" width=\"3656\" height=\"2664\"/>\n\n\t\t\t<resolution name=\"Academy Projection 1.66 (1K)\" description=\"\" width=\"914\" height=\"550\"/>\n\t\t\t<resolution name=\"Academy Projection 1.66 (2K)\" description=\"\" width=\"1828\" height=\"1102\"/>\n\t\t\t<resolution name=\"Academy Projection 1.66 (4K)\" description=\"\" width=\"3656\" height=\"2202\"/>\n\n\t\t\t<resolution name=\"Academy Projection 1.85 (1K)\" description=\"\" width=\"914\" height=\"494\"/>\n\t\t\t<resolution name=\"Academy Projection 1.85 (2K)\" description=\"\" width=\"1828\" height=\"988\"/>\n\t\t\t<resolution name=\"Academy Projection 1.85 (4K)\" description=\"\" width=\"3656\" height=\"1976\"/>\n\n\t\t\t<resolution name=\"Anamorphic Squeezed (1K)\" description=\"\" width=\"914\" height=\"774\"/>\n\t\t\t<resolution name=\"Anamorphic Squeezed (2K)\" description=\"\" width=\"1828\" height=\"1550\"/>\n\t\t\t<resolution name=\"Anamorphic Squeezed (4K)\" description=\"\" width=\"3656\" height=\"3098\"/>\n\t\t\t\n\t\t\t<resolution name=\"Anamorphic Unsqueezed (1K)\" description=\"\" width=\"914\" height=\"388\"/>\n\t\t\t<resolution name=\"Anamorphic Unsqueezed (2K)\" description=\"\" width=\"1828\" height=\"778\"/>\n\t\t\t<resolution name=\"Anamorphic Unsqueezed (4K)\" description=\"\" width=\"3656\" height=\"1556\"/>\n\t\t</resolutions>\n\t</application>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/scripts/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.py k3d/scripts)\n\nADD_SUBDIRECTORY(animation)\nADD_SUBDIRECTORY(MeshModifierScript)\nADD_SUBDIRECTORY(MeshSourceScript)\nADD_SUBDIRECTORY(OpenGLPainterScript)\nADD_SUBDIRECTORY(OpenGLRenderableScript)\nADD_SUBDIRECTORY(RenderManScript)\nADD_SUBDIRECTORY(scripted_plugins)\nADD_SUBDIRECTORY(shell)\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshModifierScript/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.py k3d/scripts/MeshModifierScript)\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshModifierScript/random_face_varying_colors.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(locals(), \"MeshModifierScript\")\n\nfrom random import seed, randint\n\nOutput.copy(Input)\n\nseed(123)\n\ncolors = [ k3d.color(1, 0, 0), k3d.color(1, 1, 0), k3d.color(0, 1, 0), k3d.color(0, 1, 1), k3d.color(0, 0, 1), k3d.color(1, 0, 1), k3d.color(1, 1, 1)]\n\nfor prim_idx, const_primitive in enumerate(Input.primitives()):\n\tif const_primitive.type() == \"polyhedron\":\n\t\tpolyhedron = k3d.polyhedron.validate(Output, Output.primitives()[prim_idx])\n\t\tif polyhedron:\n\t\t\tCs = polyhedron.edge_attributes().create(\"Cs\", \"k3d::color\")\n\t\t\tfor i in range(len(polyhedron.edge_points())):\n\t\t\t\tCs.append(colors[i % len(colors)])\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshModifierScript/random_per_face_colors.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(locals(), \"MeshModifierScript\")\n\nfrom random import seed, randint\n\nOutput.copy(Input)\n\nseed(123)\n\ncolors = [ k3d.color(1, 0, 0), k3d.color(1, 1, 0), k3d.color(0, 1, 0), k3d.color(0, 1, 1), k3d.color(0, 0, 1), k3d.color(1, 0, 1), k3d.color(1, 1, 1)]\n\nfor prim_idx, const_primitive in enumerate(Input.primitives()):\n\tif const_primitive.attributes()[\"uniform\"]:\n\t\tCs = Output.prmitives()[prim_idx].attributes()[\"uniform\"].create_array(\"Cs\", \"k3d::color\")\n\t\t#todo: find out how to get the length for uniform data\n\t\t#for i in range(len(Output.bilinear_patches().patch_points()) / 4):\n\t\t#\tCs.append(colors[i % len(colors)])\n"
  },
  {
    "path": "share/k3d/scripts/MeshModifierScript/random_per_vertex_colors.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(locals(), \"MeshModifierScript\")\n\nfrom random import seed, uniform\n\nOutput.copy(Input)\n\nseed(123)\n\nCs = Output.vertex_data().create_array(\"Cs\", \"k3d::color\")\nfor point in range(len(Output.points())):\n\tCs.append(k3d.color(uniform(0, 1), uniform(0, 1), uniform(0, 1)))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshModifierScript/snow_animation.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(locals(), \"MeshModifierScript\")\n\nfrom math import fmod\nfrom cgkit.noise import vsnoise\n\ntime = Node.time\ngravity = Node.gravity\nz1 = Node.z1\nz2 = Node.z2\ndz = z2 - z1\n\nOutput.copy(Input)\n\npoints = Output.points()\nfor i in range(len(points)):\n\tpoint = points[i]\n\twiggle = 10 * vsnoise((point[0], point[1], point[2]), time / 2)\n\tpoint[0] += wiggle.x\n\tpoint[1] += wiggle.y\n\tpoint[2] += wiggle.z\n\tpoint[2] = fmod((point[2] + (time * gravity) - z1), dz) + z1\n\tpoints[i] = point\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.py k3d/scripts/MeshSourceScript)\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/bezier_triangle_patches.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Perform required one-time setup to store geometric points in the mesh ...\npoints = context.output.create_points()\npoint_selection = context.output.create_point_selection()\n\n# Perform required one-time setup to store bezier triangle patches in the mesh ...\npatches = k3d.bezier_triangle_patch.create(context.output)\n\n# We will create two identical bezier triangle patches ...\nfor i in range(2):\n\tpatches.patch_first_points().append(len(points))\n\tpatches.patch_orders().append(4)\n\tpatches.patch_selections().append(0)\n\tpatches.patch_materials().append(None)\n\n\t# from The Platonic Spheroids at http://www.cise.ufl.edu/research/SurfLab/pre99-papers/97.spheroids.ps.gz\n\t# The tetroid:\n\t# (3,-3,-3) (1,-1,-7) (-1,1,-7) (-3,3,-3)\n\t#    (1,-7,-1) (-11,-11,-11) (-7,1,-1)\n\t#           (-1,-7,1) (-7,-1,1)\n\t#                (-3,-3,3)\n\tpositions = [\n\t\t(3,-3,-3),\n\t\t(1,-7,-1), (1,-1,-7),\n\t\t(-1,-7,1), (-11,-11,-11), (-1,1,-7),\n\t\t(-3,-3,3), (-7,-1,1), (-7,1,-1), (-3,3,-3) ]\n\n\t# Assign patch_points and patch_weights here ...\n\tfor j in range(0,len(positions)):\n\t\tpatches.patch_points().append(len(points) + j)\n\t\tpatches.patch_point_weights().append(1)\n\n\tfor position in positions:\n\t\tpoints.append(k3d.point3(position[0] + (12 * i), position[2], -position[1]))\n\t\tpoint_selection.append(0.0)\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/bicubic_patches.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Perform required one-time setup to store geometric points in the mesh ...\npoints = context.output.create_points()\npoint_selection = context.output.create_point_selection()\n\n# Perform required one-time setup to store bicubic patches in the mesh ...\npatches = k3d.bicubic_patch.create(context.output)\n\n# Create an (optional) array to hold color values at the parametric\n# corners of each patch ...\nCs = patches.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n# We will create two identical bicubic patches ...\nfor i in range(2):\n\tpatches.patch_selections().append(0)\n\tpatches.patch_materials().append(None)\n\n\tfor j in range(16):\n\t\tpatches.patch_points().append(len(points) + j)\n\n\tpositions = [\n\t\t(-5, -5, 0), (-2, -5, 2), (2, -5, -2), (5, -5, 0),\n\t\t(-5, -2, 2), (-2, -2, 5), (2, -2, -5), (5, -2, -2),\n\t\t(-5, 2, 2), (-2, 2, 5), (2, 2, -5), (5, 2, -2),\n\t\t(-5, 5, 0), (-2, 5, 2), (2, 5, -2), (5, 5, 0)]\n\n\tfor position in positions:\n\t\tpoints.append(k3d.point3(position[0] + (12 * i), position[2], -position[1]))\n\t\tpoint_selection.append(0.0)\n\n\tCs.append(k3d.color(1, 0, 0))\n\tCs.append(k3d.color(0, 1, 0))\n\tCs.append(k3d.color(0, 0, 1))\n\tCs.append(k3d.color(1, 1, 1))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/bilinear_patches.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Perform required one-time setup to store geometric points in the mesh ...\npoints = context.output.create_points()\npoint_selection = context.output.create_point_selection()\n\n# Perform required one-time setup to store bilinear patches in the mesh ...\npatches = k3d.bilinear_patch.create(context.output)\n\n# Create an (optional) array to hold color values at the parametric\n# corners of each patch ...\nCs = patches.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n# We will create two identical bilinear patches\nfor i in range(2):\n\tpatches.patch_selections().append(0)\n\tpatches.patch_materials().append(None)\n\n\tfor j in range(4):\n\t\tpatches.patch_points().append(len(points) + j)\n\n\tpositions = [ (-5, 0, 5), (5, 0, 5), (0, -5, -5), (0, 5, -5) ]\n\n\tfor position in positions:\n\t\tpoints.append(k3d.point3(position[0] + (12 * i), position[1], position[2]))\n\t\tpoint_selection.append(0.0)\n\n\tCs.append(k3d.color(1, 0, 0))\n\tCs.append(k3d.color(0, 1, 0))\n\tCs.append(k3d.color(0, 0, 1))\n\tCs.append(k3d.color(1, 1, 1))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/blobby.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\nblobby = k3d.blobby.create(context.output)\nCs = blobby.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add four ellipsoids to the blobby ...\nellipsoids = [k3d.point3(-1, 0, 1), k3d.point3(1, 0, 1), k3d.point3(1, 0, -1), k3d.point3(-1, 0, -1)]\n\nblobby.first_primitives().append(len(blobby.primitives()))\nblobby.primitive_counts().append(len(ellipsoids) + 1)\nblobby.first_operators().append(len(blobby.operators()))\nblobby.operator_counts().append(1)\nblobby.materials().append(k3d.node.lookup_one(context.document, \"Material\"))\n\nfor center in ellipsoids:\n\tblobby.primitives().append(k3d.blobby.primitive_type.ELLIPSOID)\n\tblobby.primitive_first_floats().append(len(blobby.floats()))\n\tblobby.primitive_float_counts().append(16)\n\tfor i in (k3d.translate3(center[0], center[1], center[2]) * k3d.scale3(1)).column_major_values():\n\t\tblobby.floats().append(i)\n\n# Add a segment to the blobby ...\nblobby.primitives().append(k3d.blobby.primitive_type.SEGMENT)\nblobby.primitive_first_floats().append(len(blobby.floats()))\nblobby.primitive_float_counts().append(23)\nblobby.floats().append(-1)\nblobby.floats().append(0)\nblobby.floats().append(0)\nblobby.floats().append(1)\nblobby.floats().append(0)\nblobby.floats().append(0)\nblobby.floats().append(1)\nfor i in k3d.identity3().column_major_values():\n\tblobby.floats().append(i)\n\n# Assign colors to each ellipsoid and segment ...\nCs.assign([k3d.color(1, 0, 0), k3d.color(0, 1, 0), k3d.color(0, 0, 1), k3d.color(1, 1, 0), k3d.color(1, 1, 1)])\n\n# Add the ellipsoids and segment together to produce a surface ...\nblobby.operators().append(k3d.blobby.operator_type.ADD)\nblobby.operator_first_operands().append(len(blobby.operands()))\nblobby.operator_operand_counts().append(6)\nblobby.operands().assign([5, 0, 1, 2, 3, 4])\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/cones.py",
    "content": "#python\n\nfrom math import radians\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Construct a cone mesh primitive ...\ncone = k3d.cone.create(context.output)\ncolor = cone.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add two cones ...\ncone.matrices().append(k3d.translate3(k3d.vector3(-5, 0, 0)))\ncone.materials().append(None)\ncone.heights().append(5)\ncone.radii().append(4)\ncone.sweep_angles().append(radians(360))\ncone.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 1, 0))\ncolor.append(k3d.color(1, 1, 0))\n\ncone.matrices().append(k3d.translate3(k3d.vector3(5, 0, 0)))\ncone.materials().append(None)\ncone.heights().append(5)\ncone.radii().append(4)\ncone.sweep_angles().append(radians(360))\ncone.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(0, 0, 1))\ncolor.append(k3d.color(0, 0, 1))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/cubes.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Construct a cube mesh primitive ...\ncubes = context.output.primitives().create(\"cube\")\nmatrices = cubes.topology().create(\"matrices\", \"k3d::matrix4\")\nmaterials = cubes.topology().create(\"materials\", \"k3d::imaterial*\")\nuniform = cubes.attributes().create(\"uniform\")\ncolor = uniform.create(\"Cs\", \"k3d::color\")\n\n# Add three cubes ...\nmatrices.append(k3d.translate3(k3d.vector3(-7, 0, 0)))\nmaterials.append(None)\ncolor.append(k3d.color(1, 0, 0))\n\nmatrices.append(k3d.translate3(k3d.vector3(0, 0, 0)))\nmaterials.append(None)\ncolor.append(k3d.color(0, 1, 0))\n\nmatrices.append(k3d.translate3(k3d.vector3(7, 0, 0)))\nmaterials.append(None)\ncolor.append(k3d.color(0, 0, 1))\n\nprint repr(context.output)\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/cubic_curves.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Perform required one-time setup to store geometric points in the mesh ...\npoints = context.output.create_points()\npoint_selection = context.output.create_point_selection()\n\n# Perform required one-time setup to store cubic curves in the mesh ...\ncurves = k3d.cubic_curve.create(context.output)\n\n# Create an array to store constant curve widths ...\nconstantwidth = curves.constant_attributes().create(\"constantwidth\", \"k3d::double_t\")\n\n# Create an array to store per-curve curve colors ...\nCs = curves.curve_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add some curves ...\ncurves.periodic().append(False)\ncurves.material().append(None)\nconstantwidth.append(0.5)\n\nfor j in range(5):\n\tcurves.curve_first_points().append(len(curves.curve_points()))\n\tcurves.curve_point_counts().append(7)\n\tcurves.curve_selections().append(0.0)\n\n\tcurves.curve_points().append(len(points) + 0)\n\tcurves.curve_points().append(len(points) + 1)\n\tcurves.curve_points().append(len(points) + 2)\n\tcurves.curve_points().append(len(points) + 3)\n\tcurves.curve_points().append(len(points) + 4)\n\tcurves.curve_points().append(len(points) + 5)\n\tcurves.curve_points().append(len(points) + 6)\n\n\tpositions = [(0, 0, 5), (-5, 0, 5), (-5, 0, 0), (0, 0, 0), (5, 0, 0), (5, 0, -5), (0, 0, -5)]\n\tfor position in positions:\n\t\tpoints.append(k3d.point3(position[0] + (j * 5), position[1], position[2]))\n\t\tpoint_selection.append(0.0)\n\n\tCs.append(k3d.color(1, 1, j * 0.2))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/cylinders.py",
    "content": "#python\n\nfrom math import radians\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Construct a sphere mesh primitive ...\ncylinder = k3d.cylinder.create(context.output)\ncolor = cylinder.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add two cylinders ...\ncylinder.matrices().append(k3d.translate3(k3d.vector3(-3, 0, 0)))\ncylinder.materials().append(None)\ncylinder.radii().append(2)\ncylinder.z_min().append(-5)\ncylinder.z_max().append(5)\ncylinder.sweep_angles().append(radians(360))\ncylinder.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 1, 0))\ncolor.append(k3d.color(1, 1, 0))\n\ncylinder.matrices().append(k3d.translate3(k3d.vector3(3, 0, 0)))\ncylinder.materials().append(None)\ncylinder.radii().append(2)\ncylinder.z_min().append(-5)\ncylinder.z_max().append(5)\ncylinder.sweep_angles().append(radians(360))\ncylinder.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(0, 0, 1))\ncolor.append(k3d.color(0, 0, 1))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/disks.py",
    "content": "#python\n\nfrom math import radians\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Construct a sphere mesh primitive ...\ndisk = k3d.disk.create(context.output)\ncolor = disk.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add two disks ...\ndisk.matrices().append(k3d.translate3(k3d.vector3(-5, 0, 0)))\ndisk.materials().append(None)\ndisk.heights().append(0)\ndisk.radii().append(4)\ndisk.sweep_angles().append(radians(360))\ndisk.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 1, 0))\ncolor.append(k3d.color(1, 1, 0))\n\ndisk.matrices().append(k3d.translate3(k3d.vector3(5, 0, 0)))\ndisk.materials().append(None)\ndisk.heights().append(0)\ndisk.radii().append(4)\ndisk.sweep_angles().append(radians(360))\ndisk.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(0, 0, 1))\ncolor.append(k3d.color(0, 0, 1))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/hyperboloids.py",
    "content": "#python\n\nfrom math import radians\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Construct a sphere mesh primitive ...\nhyperboloid = k3d.hyperboloid.create(context.output)\ncolor = hyperboloid.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add two hyperboloids ...\nhyperboloid.matrices().append(k3d.translate3(k3d.vector3(-5, 0, 0)))\nhyperboloid.materials().append(None)\nhyperboloid.start_points().append(k3d.point3(-2, 2, 2))\nhyperboloid.end_points().append(k3d.point3(2, 2, -2))\nhyperboloid.sweep_angles().append(radians(360))\nhyperboloid.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 1, 0))\ncolor.append(k3d.color(1, 1, 0))\n\nhyperboloid.matrices().append(k3d.translate3(k3d.vector3(5, 0, 0)))\nhyperboloid.materials().append(None)\nhyperboloid.start_points().append(k3d.point3(-2, 2, 2))\nhyperboloid.end_points().append(k3d.point3(2, 2, -2))\nhyperboloid.sweep_angles().append(radians(360))\nhyperboloid.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(0, 0, 1))\ncolor.append(k3d.color(0, 0, 1))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/linear_curves.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Perform required one-time setup to store geometric points in the mesh ...\npoints = context.output.create_points()\npoint_selection = context.output.create_point_selection()\n\n# Perform required one-time setup to store linear curves in the mesh ...\ncurves = k3d.linear_curve.create(context.output)\n\n# Create an (optional) array to store curve widths\nconstantwidth = curves.constant_attributes().create(\"constantwidth\", \"k3d::double_t\")\n\n# Create an (optional) array to store per-curve curve colors\nCs = curves.curve_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add curves ...\ncurves.periodic().append(False)\ncurves.material().append(None)\nconstantwidth.append(0.5)\n\nfor j in range(5):\n\tcurves.curve_first_points().append(len(curves.curve_points()))\n\tcurves.curve_point_counts().append(3)\n\tcurves.curve_selections().append(0.0)\n\n\tcurves.curve_points().append(len(points) + 0)\n\tcurves.curve_points().append(len(points) + 1)\n\tcurves.curve_points().append(len(points) + 2)\n\n\tpositions = [(0, 0, 5), (5, 0, 0), (0, 0, -5)]\n\n\tfor position in positions:\n\t\tpoints.append(k3d.point3(position[0] + (j * 5), position[1], position[2]))\n\t\tpoint_selection.append(0.0)\n\n\tCs.append(k3d.color(1, 1, j * 0.2))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/nurbs_curves.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Perform required one-time setup to store geometric points in the mesh ...\npoints = context.output.create_points()\npoint_selection = context.output.create_point_selection()\n\n# Perform required one-time setup to store NURBS curves in the mesh ...\ncurves = k3d.nurbs_curve.create(context.output)\n\n# Add some curves ...\ncurves.material().append(None)\n\nfor j in range(3):\n\tcurves.curve_first_points().append(len(curves.curve_points()))\n\tcurves.curve_point_counts().append(4)\n\tcurves.curve_orders().append(3)\n\tcurves.curve_first_knots().append(len(curves.curve_knots()))\n\tcurves.curve_selections().append(0.0)\n\n\tcurves.curve_points().append(len(points) + 0)\n\tcurves.curve_points().append(len(points) + 1)\n\tcurves.curve_points().append(len(points) + 2)\n\tcurves.curve_points().append(len(points) + 3)\n\t\n\tcurves.curve_point_weights().append(1)\n\tcurves.curve_point_weights().append(0.5)\n\tcurves.curve_point_weights().append(1)\n\tcurves.curve_point_weights().append(1)\n\t\n\tcurves.curve_knots().append(1)\n\tcurves.curve_knots().append(1)\n\tcurves.curve_knots().append(1)\n\tcurves.curve_knots().append(2)\n\tcurves.curve_knots().append(3)\n\tcurves.curve_knots().append(3)\n\tcurves.curve_knots().append(3)\n\n\tpositions = [(-5, -5, 0), (5, -5, 0), (5, 5, 0), (-5, 5, 0)]\n\n\tfor position in positions:\n\t\tpoints.append(k3d.point3(position[0] + (j * 10), position[1], position[2]))\n\t\tpoint_selection.append(0.0)\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/nurbs_patches.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Perform required one-time setup to store geometric points in the mesh ...\npoints = context.output.create_points()\npoint_selection = context.output.create_point_selection()\n\n# Perform required one-time setup to store NURBS patches in the mesh ...\npatches = k3d.nurbs_patch.create(context.output)\n\n# Create an (optional) array to hold color values at the parametric\n# corners of each patch ...\n#Cs = nurbs_patches.writable_varying_data().create(\"Cs\", \"k3d::color\")\n\n# We will create two identical NURBS patches ...\nfor i in range(2):\n\tpatches.patch_first_points().append(len(patches.patch_points()))\n\tpatches.patch_u_point_counts().append(3)\n\tpatches.patch_v_point_counts().append(2)\n\tpatches.patch_u_orders().append(3)\n\tpatches.patch_v_orders().append(2)\n\tpatches.patch_u_first_knots().append(len(patches.patch_u_knots()))\n\tpatches.patch_v_first_knots().append(len(patches.patch_v_knots()))\n\tpatches.patch_selections().append(0)\n\tpatches.patch_materials().append(None)\n\n\tpatches.patch_points().append(len(points) + 0)\n\tpatches.patch_points().append(len(points) + 1)\n\tpatches.patch_points().append(len(points) + 2)\n\tpatches.patch_points().append(len(points) + 3)\n\tpatches.patch_points().append(len(points) + 4)\n\tpatches.patch_points().append(len(points) + 5)\n\n\tpatches.patch_point_weights().append(1)\n\tpatches.patch_point_weights().append(10)\n\tpatches.patch_point_weights().append(1)\n\tpatches.patch_point_weights().append(1)\n\tpatches.patch_point_weights().append(0.5)\n\tpatches.patch_point_weights().append(1)\n\n\tpatches.patch_u_knots().append(1)\n\tpatches.patch_u_knots().append(1)\n\tpatches.patch_u_knots().append(1)\n\tpatches.patch_u_knots().append(2)\n\tpatches.patch_u_knots().append(2)\n\tpatches.patch_u_knots().append(2)\n\n\tpatches.patch_v_knots().append(1)\n\tpatches.patch_v_knots().append(1)\n\tpatches.patch_v_knots().append(2)\n\tpatches.patch_v_knots().append(2)\n\n\tpatches.patch_first_trim_loops().append(0)\n\tpatches.patch_trim_loop_counts().append(0)\n\n#\tCs.append(k3d.color(1, 0, 0))\n#\tCs.append(k3d.color(0, 1, 0))\n#\tCs.append(k3d.color(0, 0, 1))\n#\tCs.append(k3d.color(1, 1, 1))\n\n\tpositions = [(-5, 5, 5), (5, 5, 5), (5, 5, 10), (-5, -5, 5), (5, -5, 5), (5, -5, 10)]\n\n\tfor position in positions:\n\t\tpoints.append(k3d.point3(position[0], position[1], position[2] + (i * -10)))\n\t\tpoint_selection.append(0.0)\n\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/paraboloids.py",
    "content": "#python\n\nfrom math import radians\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Construct a sphere mesh primitive ...\nparaboloids = k3d.paraboloid.create(context.output)\ncolor = paraboloids.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add two paraboloids ...\nparaboloids.matrices().append(k3d.translate3(k3d.vector3(-5, 0, 0)))\nparaboloids.materials().append(None)\nparaboloids.radii().append(3)\nparaboloids.z_min().append(0)\nparaboloids.z_max().append(6)\nparaboloids.sweep_angles().append(radians(360))\nparaboloids.selections().append(0.0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 1, 0))\ncolor.append(k3d.color(1, 1, 0))\n\nparaboloids.matrices().append(k3d.translate3(k3d.vector3(5, 0, 0)))\nparaboloids.materials().append(None)\nparaboloids.radii().append(3)\nparaboloids.z_min().append(0)\nparaboloids.z_max().append(6)\nparaboloids.sweep_angles().append(radians(360))\nparaboloids.selections().append(0.0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(0, 0, 1))\ncolor.append(k3d.color(0, 0, 1))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/particles.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Perform required one-time setup to store geometric points in the mesh ...\npoints = context.output.create_points()\npoint_selection = context.output.create_point_selection()\n\n# Construct a point group mesh primitive ...\nparticles = k3d.particle.create(context.output)\n\n# Create an (optional) array to store per-group point widths\nconstantwidth = particles.constant_attributes().create(\"constantwidth\", \"k3d::double_t\")\n\n# Create an (optional) array to store per-point point colors\nCs = particles.vertex_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add some points ...\nparticles.material().append(None)\nconstantwidth.append(0.5)\n\nfor x in range(-5, 6):\n\tfor z in range (-5, 6):\n\t\tparticles.points().append(len(points))\n\n\t\tpoints.append(k3d.point3(x, 0, z))\n\t\tpoint_selection.append(0.0)\n\t\tCs.append(k3d.color((x / 10.0) + 0.5, 1, (z / 10.0) + 0.5))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/polyhedra.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Perform required one-time setup to store geometric points in the mesh ...\npoints = context.output.create_points()\npoint_selection = context.output.create_point_selection()\n\n# Create two polyhedra ...\nfor i in range(2):\n\tpolyhedron = k3d.polyhedron.create(context.output)\n\n\t# Create an (optional) array to store per-face colors ...\n\tCs = polyhedron.face_attributes().create(\"Cs\", \"k3d::color\")\n\n\tpolyhedron.shell_types().append(k3d.polyhedron.shell_type.POLYGONS)\n\n\t# Create three faces in each polyhedron ...\n\tfor j in range(3):\n\t\t# Each face has a single loop (its exterior boundary) ...\n\t\tpolyhedron.face_shells().append(0)\n\t\tpolyhedron.face_first_loops().append(len(polyhedron.loop_first_edges()))\n\t\tpolyhedron.face_loop_counts().append(1)\n\t\tpolyhedron.face_materials().append(None)\n\t\tpolyhedron.face_selections().append(0.0)\n\n\t\tCs.append(k3d.color(1, j / 2.0, i / 1.0))\n\n\t\tpolyhedron.loop_first_edges().append(len(polyhedron.clockwise_edges()))\n\n\t\t# Each loop has four edges, each of which points to the next edge in clockwise-order ...\n\t\tpolyhedron.clockwise_edges().append(len(polyhedron.clockwise_edges()) + 1)\n\t\tpolyhedron.clockwise_edges().append(len(polyhedron.clockwise_edges()) + 1)\n\t\tpolyhedron.clockwise_edges().append(len(polyhedron.clockwise_edges()) + 1)\n\t\tpolyhedron.clockwise_edges().append(len(polyhedron.clockwise_edges()) - 3)\n\n\t\tpolyhedron.edge_selections().append(0.0)\n\t\tpolyhedron.edge_selections().append(0.0)\n\t\tpolyhedron.edge_selections().append(0.0)\n\t\tpolyhedron.edge_selections().append(0.0)\n\n\t\t# Each edge has a vertex that references a mesh point ...\n\t\tpolyhedron.vertex_points().append(len(points) + 0)\n\t\tpolyhedron.vertex_points().append(len(points) + 1)\n\t\tpolyhedron.vertex_points().append(len(points) + 2)\n\t\tpolyhedron.vertex_points().append(len(points) + 3)\n\n\t\tpolyhedron.vertex_selections().append(0.0)\n\t\tpolyhedron.vertex_selections().append(0.0)\n\t\tpolyhedron.vertex_selections().append(0.0)\n\t\tpolyhedron.vertex_selections().append(0.0)\n\n\t\tpositions = [(-5, 0, 5), (5, 0, 5), (5, 0, -5), (-5, 0, -5)]\n\n\t\tfor position in positions:\n\t\t\tpoints.append(k3d.point3(position[0] + (j * 11.0), position[1] + (i * -11.0), position[2]))\n\t\t\tpoint_selection.append(0.0)\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/simple_polyhedron.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Create two triangles, arranged to form a square ...\nvertices = [k3d.point3(-3, -3, 0), k3d.point3(3, -3, 0), k3d.point3(3, 3, 0), k3d.point3(-3, 3, 0)]\nvertex_counts = [3, 3]\nvertex_indices = [0, 1, 3, 1, 2, 3]\nmaterial = None\npolyhedron = k3d.polyhedron.create(context.output, vertices, vertex_counts, vertex_indices, material)\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/snow_source.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\nfrom random import uniform\n\ncount = 200\nsize = 10\n\npoints = context.output.create_points()\npoint_selection = context.output.create_point_selection()\n\nfor i in range(count):\n\tpoints.append(k3d.point3(uniform(-size, size), uniform(-size, size), uniform(-size, size)))\n\tpoint_selection.append(0.0)\n\npoint_groups = context.output.create_point_groups()\n\nfirst_points = point_groups.create_first_points()\nfirst_points.append(0)\n\npoint_counts = point_groups.create_point_counts()\npoint_counts.append(len(points))\n\nmaterials = point_groups.create_materials()\nmaterials.append(None)\n\nconstantwidth = point_groups.writable_constant_data().create(\"constantwidth\", \"double\")\nconstantwidth.append(0.2)\n\ngroup_points = point_groups.create_points()\nfor i in range(len(points)):\n\tgroup_points.append(i)\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/spheres.py",
    "content": "#python\n\nfrom math import radians\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Construct a sphere mesh primitive ...\nsphere = k3d.sphere.create(context.output)\ncolor = sphere.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add two spheres ...\nsphere.matrices().append(k3d.translate3(k3d.vector3(-3, 0, 0)))\nsphere.materials().append(None)\nsphere.radii().append(2)\nsphere.z_min().append(-1)\nsphere.z_max().append(1)\nsphere.sweep_angles().append(radians(360))\nsphere.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 1, 0))\ncolor.append(k3d.color(1, 1, 0))\n\nsphere.matrices().append(k3d.translate3(k3d.vector3(3, 0, 0)))\nsphere.materials().append(None)\nsphere.radii().append(2)\nsphere.z_min().append(-1)\nsphere.z_max().append(1)\nsphere.sweep_angles().append(radians(360))\nsphere.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(0, 0, 1))\ncolor.append(k3d.color(0, 0, 1))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/teapots.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Construct a teapot mesh primitive ...\nteapot = k3d.teapot.create(context.output)\ncolor = teapot.surface_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add three teapots ...\nteapot.matrices().append(k3d.translate3(k3d.vector3(-7, 0, 0)))\nteapot.materials().append(None)\nteapot.selections().append(0.0)\ncolor.append(k3d.color(1, 0, 0))\n\nteapot.matrices().append(k3d.translate3(k3d.vector3(0, 0, 0)))\nteapot.materials().append(None)\nteapot.selections().append(0.0)\ncolor.append(k3d.color(0, 1, 0))\n\nteapot.matrices().append(k3d.translate3(k3d.vector3(7, 0, 0)))\nteapot.materials().append(None)\nteapot.selections().append(0.0)\ncolor.append(k3d.color(0, 0, 1))\n\n"
  },
  {
    "path": "share/k3d/scripts/MeshSourceScript/tori.py",
    "content": "#python\n\nfrom math import radians\n\nimport k3d\nk3d.check_node_environment(context, \"MeshSourceScript\")\n\n# Construct a sphere mesh primitive ...\ntorus = k3d.torus.create(context.output)\ncolor = torus.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n# Add two tori ...\ntorus.matrices().append(k3d.translate3(k3d.vector3(-5, 0, 0)))\ntorus.materials().append(None)\ntorus.major_radii().append(3)\ntorus.minor_radii().append(2)\ntorus.phi_min().append(0)\ntorus.phi_max().append(radians(360))\ntorus.sweep_angles().append(radians(360))\ntorus.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 1, 0))\ncolor.append(k3d.color(1, 1, 0))\n\ntorus.matrices().append(k3d.translate3(k3d.vector3(5, 0, 0)))\ntorus.materials().append(None)\ntorus.major_radii().append(3)\ntorus.minor_radii().append(2)\ntorus.phi_min().append(0)\ntorus.phi_max().append(radians(360))\ntorus.sweep_angles().append(radians(360))\ntorus.selections().append(0)\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(1, 0, 0))\ncolor.append(k3d.color(0, 0, 1))\ncolor.append(k3d.color(0, 0, 1))\n\n"
  },
  {
    "path": "share/k3d/scripts/OpenGLPainterScript/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.py k3d/scripts/OpenGLPainterScript)\n\n"
  },
  {
    "path": "share/k3d/scripts/OpenGLPainterScript/blue_particles.py",
    "content": "#python\n\nimport k3d\nk3d.check_node_environment(context, \"OpenGLPainterScript\")\n\nfrom OpenGL.GL import *\n\npoints = context.mesh.points()\nif points:\n\tglPushAttrib(GL_ALL_ATTRIB_BITS)\n\tglDisable(GL_LIGHTING)\n\n\tglEnable(GL_POINT_SMOOTH)\n\tglHint(GL_POINT_SMOOTH_HINT, GL_NICEST)\n\n\tglEnable(GL_BLEND)\n\tglBlendFunc(GL_ONE, GL_ONE)\n\n\tglPointSize(3)\n\tglColor3d(1, 1, 1)\n\n\tglBegin(GL_POINTS)\n\tfor point in points:\n\t\tglVertex3d(point[0], point[1], point[2])\n\tglEnd()\n\n\tglPointSize(7)\n\tglColor3d(0.05, 0.05, 1)\n\n\tglBegin(GL_POINTS)\n\tfor point in points:\n\t\tglVertex3d(point[0], point[1], point[2])\n\tglEnd()\n\n\tglPopAttrib()\n"
  },
  {
    "path": "share/k3d/scripts/OpenGLRenderableScript/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.py k3d/scripts/OpenGLRenderableScript)\n\n"
  },
  {
    "path": "share/k3d/scripts/OpenGLRenderableScript/gradient_background.py",
    "content": "#python\n\ntry:\n  from OpenGL.GL import *\n\nexcept:\n  print \"Couldn't load OpenGL module\"\n\nglDisable(GL_LIGHTING)\n\nglMatrixMode(GL_MODELVIEW)\nglPushMatrix()\nglLoadIdentity()\n  \nglMatrixMode(GL_PROJECTION)\nglPushMatrix()\nglLoadIdentity()\nglOrtho(-1, 1, -1, 1, 0, 10000)\n\nglBegin(GL_POLYGON)\nglColor3d(0.9, 0.9, 0.9)\nglVertex3f(-1, 1, -9999)\nglVertex3f(1, 1, -9999)\nglColor3d(0.3, 0.3, 0.3)\nglVertex3f(1, -1, -9999)\nglVertex3f(-1, -1, -9999)\nglEnd()\n\nglPopMatrix()\nglMatrixMode(GL_MODELVIEW)\nglPopMatrix()\n"
  },
  {
    "path": "share/k3d/scripts/RenderManScript/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.py k3d/scripts/RenderManScript)\n\n"
  },
  {
    "path": "share/k3d/scripts/RenderManScript/tribble.py",
    "content": "#python\n\n# Load this script into a RenderManScript node to create\n# what is either a Tribble or a really bad-hair-day ...\n\nimport k3d\nk3d.check_node_environment(context, \"RenderManScript\")\n\nimport sys\nimport ri\nfrom ri import *\nfrom random import *\nfrom cgtypes import vec3\nfrom noise import vsnoise\nfrom sl import mix\n\nmessage = \"\"\"You're probably trying to run this script manually, which won't work - this script is meant to be loaded into a RenderManScript node, where it will be run at render-time.\n\nUse the Create > RenderMan > RenderManScript menu item to create the node, then load this file into its Script property.\"\"\"\n\nif not context.has_key(\"archive\"):\n      k3d.ui.error_message(message)\n      raise\n\n# Redirect output to our RIB archive\nri._ribout = open(str(context.archive), \"w\")\n\nbody_size = 5\nlumpyness = 1\nhair_length = 2\nhair_count = 10000\nhair_wavyness = 1\n\ncontrol_point_counts = []\ncontrol_points = []\nwidths = []\n\nseed(12345)\n\nfor i in range(hair_count):\n\tcontrol_point_counts.append(4)\n\n\tv = vec3(random() - 0.5, random() - 0.5, random() - 0.5).normalize()\n\n\tp1 = v * body_size\n\tp1 += vsnoise(p1) * lumpyness\n\n\tp4 = p1 + v * hair_length\n\tp4 += vsnoise(p4) * hair_wavyness\n\n\tp2 = mix(p1, p4, 0.2)\n\tp2 += vsnoise(p2)\n\n\tp3 = mix(p1, p4, 0.8)\n\tp3 += vsnoise(p3)\n\n\tcontrol_points.append(p1)\n\tcontrol_points.append(p2)\n\tcontrol_points.append(p3)\n\tcontrol_points.append(p4)\n\n\twidths.append(0.08)\n\twidths.append(0.01)\n\nRiSurface(\"k3d_hair\")\nRiCurves(RI_CUBIC, control_point_counts, RI_NONPERIODIC, \"P\", control_points, \"width\", widths)\n\nri._ribout.flush()\n\ncontext.render_state.use_shader(k3d.share_path() / k3d.filesystem.generic_path(\"shaders/surface/k3d_hair.sl\"))\n\n"
  },
  {
    "path": "share/k3d/scripts/animation/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.py k3d/scripts/animation)\n\n"
  },
  {
    "path": "share/k3d/scripts/animation/keyframes.py",
    "content": "import k3d\n\nclass control_point:\n\tdef __init__(self, position, weight):\n\t\tself.position = position\n\t\tself.weight = weight\n\nclass nucurve:\n\tdef __init__(self, order):\n\t\tself.order = order\n\t\tself.control_points=[]\n\t\tself.knots = []\n\nclass arc_length:\n\tdef __init__(self, T, Point, Length):\n\t\tself.t = T\n\t\tself.point = Point\n\t\tself.length = Length\n\ndef basis(i, k, t, knots):\n\tret = 0\n\tif k > 0:\n\t\tn1 = (t - knots[i]) * basis(i, k - 1, t, knots)\n\t\td1 = knots[i + k] - knots[i]\n\t\tn2 = (knots[i + k + 1] - t) * basis(i + 1, k - 1, t, knots)\n\t\td2 = knots[i + k + 1] - knots[i + 1]\n\t\tif d1 > 0.0001 or d1 < -0.0001:\n\t\t\ta = n1 / d1\n\t\telse:\n\t\t\ta = 0\n\t\t\n\t\tif d2 > 0.0001 or d2 < -0.0001:\n\t\t\tb = n2 / d2\n\t\telse:\n\t\t\tb = 0\n\n\t\tret = a + b\n\telse:\n\t\tif knots[i] <= t and t <= knots[i + 1]:\n\t\t\tret = 1\n\t\telse:\n\t\t\tret = 0\n\treturn ret\n\n\ndef evaluate(Curve, T):\n\tc = k3d.vector3(0, 0, 0)\n\tfor i in range(len(Curve.control_points)):\n\t\tcontrol_point = Curve.control_points[i]\n\t\tw = control_point.weight * basis(i, Curve.order-1, T, Curve.knots)\n\t\tb = control_point.position * w\n\t\tc = c + b\n\n\treturn c\n\ndef mix(x, y, alpha):\n\treturn x * (1 - alpha) + y * (alpha)\n\ndef start_t(Curve):\n\treturn Curve.knots[0]\n\ndef end_t(Curve):\n\treturn Curve.knots[len(Curve.knots)-1]\n\ndef get_arc_length_detail(Curve, SegmentCount):\n\tmin_t = start_t(Curve)\n\tmax_t = end_t(Curve)\n\n\tarc_lengths = []\n\tarc_lengths.append(arc_length(min_t, evaluate(Curve, min_t), 0))\n\n\tfor i in range(1, SegmentCount + 1):\n\t\tt = mix(min_t, max_t, float(i) / float(SegmentCount))\n\t\tpoint = evaluate(Curve, t)\n\t\tlast_arc = arc_lengths[len(arc_lengths)-1]\n\t\tarc_lengths.append(arc_length(t, point, last_arc.length + k3d.length(point - last_arc.point)))\n\t\t\n\treturn arc_lengths\n\t\t\ndef get_arc_lengths(Curve, MaxError):\n\tsegment_count = 4\n\n\tlast_arcs = get_arc_length_detail(Curve, segment_count)\n\tlast_length = last_arcs[len(last_arcs)-1].length\n\tlast_error = last_length\n\n\twhile last_error / last_length > MaxError:\n\t\tsegment_count *= 2\n\t\t\n\t\tarcs = get_arc_length_detail(Curve, segment_count)\n\t\tlength = arcs[len(arcs)-1].length\n\t\terror = length - last_length\n\n\t\tlast_arcs = arcs\n\t\tlast_length = length\n\t\tlast_error = error\n\n\treturn last_arcs\n\ndef get_uniform_arc_length_position(Arcs, Length):\n\tfor i in range(1, len(Arcs)):\n\t\tif Length <= Arcs[i].length:\n\t\t\tu = (Length - Arcs[i-1].length) / (Arcs[i].length - Arcs[i-1].length)\n\t\t\treturn mix(Arcs[i-1].point, Arcs[i].point, u)\n\n\treturn Arcs[len(Arcs)-1].point\n\n\n"
  },
  {
    "path": "share/k3d/scripts/count_plugins.py",
    "content": "#python\n\nimport k3d\n\nfactories = k3d.plugin.factory.lookup()\n\nk3d.ui().message(\"There are \" + str(len(factories)) + \" K-3D plugins installed.\")\n\n"
  },
  {
    "path": "share/k3d/scripts/create_bicubic_patch.py",
    "content": "#python\n\nimport k3d\n\ncontext.document.start_change_set()\ntry:\n\t# Create a FrozenMesh node to act as a mesh source ...\n\tfrozen_mesh = k3d.plugin.create(\"FrozenMesh\", context.document)\n\tfrozen_mesh.name = \"Bicubic Patch\"\n\n\t# Create a mesh ...\n\tmesh = frozen_mesh.create_mesh()\n\n\t# Add geometric points to the mesh ...\n\tpoints = mesh.create_points()\n\tpoint_selection = mesh.create_point_selection()\n\n\tpositions = [\n\t\t(-5, -5, 0), (-2, -5, 2), (2, -5, -2), (5, -5, 0),\n\t\t(-5, -2, 2), (-2, -2, 5), (2, -2, -5), (5, -2, -2),\n\t\t(-5, 2, 2), (-2, 2, 5), (2, 2, -5), (5, 2, -2),\n\t\t(-5, 5, 0), (-2, 5, 2), (2, 5, -2), (5, 5, 0)\n\t\t]\n\n\tfor position in positions:\n\t\tpoints.append(k3d.point3(position[0], position[2], -position[1]))\n\t\tpoint_selection.append(0)\n\n\t# Create a bicubic_patch primitive ...\n\tpatches = k3d.bicubic_patch.create(mesh)\n\n\t# Create a custom attribute array to store color values at each parametric corner of each patch ...\n\tCs = patches.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n\t# Add a single patch to the primitive ...\n\tpatches.patch_selections().append(0)\n\tpatches.patch_materials().append(None)\n\tfor i in range(16):\n\t\tpatches.patch_points().append(len(patches.patch_points()))\n\n\t# Add some colors to the patch corners ...\n\tCs.append(k3d.color(1, 0, 0))\n\tCs.append(k3d.color(0, 1, 0))\n\tCs.append(k3d.color(0, 0, 1))\n\tCs.append(k3d.color(1, 1, 1))\n\n\t# Connect the FrozenMesh to a MeshInstance to place it in the scene ...\n\tmesh_instance = k3d.plugin.create(\"MeshInstance\", context.document)\n\tmesh_instance.name = \"Bicubic Patch Instance\"\n\tmesh_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\n\tmesh_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n\n\tk3d.property.connect(context.document, frozen_mesh.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n\n\t# Make the MeshInstance visible to render engines ...\n\tk3d.node.show(context.document, mesh_instance)\n\n\tcontext.document.finish_change_set(\"Create Bicubic Patch\")\n\nexcept:\n\tcontext.document.cancel_change_set()\n\traise\n\n"
  },
  {
    "path": "share/k3d/scripts/create_bilinear_patch.py",
    "content": "#python\n\nimport k3d\n\ncontext.document.start_change_set()\ntry:\n\t# Create a FrozenMesh node to act as a mesh source ...\n\tfrozen_mesh = k3d.plugin.create(\"FrozenMesh\", context.document)\n\tfrozen_mesh.name = \"Bilinear Patch\"\n\n\t# Create a mesh ...\n\tmesh = frozen_mesh.create_mesh()\n\n\t# Add geometric points to the mesh ...\n\tpoints = mesh.create_points()\n\tpoint_selection = mesh.create_point_selection()\n\n\tpositions = [(-5, 0, 5), (5, 0, 5), (0, -5, -5), (0, 5, -5)]\n\tfor position in positions:\n\t\tpoints.append(k3d.point3(position[0], position[1], position[2]))\n\t\tpoint_selection.append(0.0)\n\n\t# Create a bilinear_patch primitive ...\n\tpatches = k3d.bilinear_patch.create(mesh)\n\n\t# Create a custom attribute array to store color values at each parametric corner of each patch ...\n\tCs = patches.parameter_attributes().create(\"Cs\", \"k3d::color\")\n\n\t# Add a single patch to the primitive ...\n\tpatches.patch_selections().append(0)\n\tpatches.patch_materials().append(None)\n\tfor i in range(4):\n\t\tpatches.patch_points().append(len(patches.patch_points()))\n\n\t# Add some colors to the patch corners ...\n\tCs.append(k3d.color(1, 0, 0))\n\tCs.append(k3d.color(0, 1, 0))\n\tCs.append(k3d.color(0, 0, 1))\n\tCs.append(k3d.color(1, 1, 1))\n\n\t# Connect the FrozenMesh to a MeshInstance to place it in the scene ...\n\tmesh_instance = k3d.plugin.create(\"MeshInstance\", context.document)\n\tmesh_instance.name = \"Bilinear Patch Instance\"\n\tmesh_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\n\tmesh_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n\n\tk3d.property.connect(context.document, frozen_mesh.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n\n\t# Make the MeshInstance visible to render engines ...\n\tk3d.node.show(context.document, mesh_instance)\n\n\tcontext.document.finish_change_set(\"Create Bilinear Patch\")\n\nexcept:\n\tcontext.document.cancel_change_set()\n\traise\n\n"
  },
  {
    "path": "share/k3d/scripts/create_blobby.py",
    "content": "#python\n\nimport k3d\n\ncontext.document.start_change_set()\ntry:\n\t# Create a FrozenMesh node to act as a mesh source ...\n\tfrozen_mesh = k3d.plugin.create(\"FrozenMesh\", context.document)\n\tfrozen_mesh.name = \"Blobby\"\n\n\t# Create a mesh ...\n\tmesh = frozen_mesh.create_mesh()\n\n\t# Create a blobby primitive ...\n\tblobby = k3d.blobby.create(mesh)\n\n\t# Create a custom attribute array to assign color values to each blobby primitive ...\n\tCs = blobby.vertex_attributes().create(\"Cs\", \"k3d::color\")\n\n\t# Add four ellipsoid primitives to the blobby ...\n\tblobby.materials().append(None)\n\tblobby.first_primitives().append(len(blobby.primitives()))\n\tblobby.primitive_counts().append(4)\n\n\tellipsoids = [(-1, 0, 1), (1, 0, 1), (1, 0, -1), (-1, 0, -1)]\n\tfor center in ellipsoids:\n\t\tblobby.primitives().append(k3d.blobby.primitive_type.ELLIPSOID)\n\t\tblobby.primitive_first_floats().append(len(blobby.floats()))\n\t\tblobby.primitive_float_counts().append(16)\n\t\tfor i in (k3d.translate3(center) * k3d.scale3(1.7, 1, 1.7)).column_major_values():\n\t\t\tblobby.floats().append(i)\n\n\t# Assign a color to each primitive ...\n\tCs.assign([k3d.color(1, 0, 0), k3d.color(0, 1, 0), k3d.color(0, 0, 1), k3d.color(1, 1, 1)])\n\n\t# Add a single operator to the blobby to add all four primitives together ...\n\tblobby.first_operators().append(len(blobby.operators()))\n\tblobby.operator_counts().append(1)\n\tblobby.operators().append(k3d.blobby.operator_type.ADD)\n\tblobby.operator_first_operands().append(len(blobby.operands()))\n\tblobby.operator_operand_counts().append(5)\n\tblobby.operands().assign([5, 0, 1, 2, 3]) # Operand count, followed by the index of each primitive to add\n\n\t# Connect the FrozenMesh to a MeshInstance to place it in the scene ...\n\tmesh_instance = k3d.plugin.create(\"MeshInstance\", context.document)\n\tmesh_instance.name = \"Blobby Instance\"\n\tmesh_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\n\tmesh_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n\tk3d.property.connect(context.document, frozen_mesh.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n\n\t# Make the MeshInstance visible to render engines ...\n\tk3d.node.show(context.document, mesh_instance)\n\n\tcontext.document.finish_change_set(\"Create Test Blobby\")\n\n\tk3d.ui().message(\"Note: not all RenderMan engines can render blobby geometry!\")\n\nexcept:\n\tcontext.document.cancel_change_set()\n\traise\n\n"
  },
  {
    "path": "share/k3d/scripts/create_cubic_curve.py",
    "content": "#python\n\nimport k3d\n\ncontext.document.start_change_set()\ntry:\n\t# Create a FrozenMesh node to act as a mesh source ...\n\tfrozen_mesh = k3d.plugin.create(\"FrozenMesh\", context.document)\n\tfrozen_mesh.name = \"Cubic Curve\"\n\n\t# Create a mesh ...\n\tmesh = frozen_mesh.create_mesh()\n\n\t# Add geometric points to the mesh ...\n\tpoints = mesh.create_points()\n\tpoint_selection = mesh.create_point_selection()\n\n\tpositions = [k3d.point3(-5, 0, -5), k3d.point3(5, 0, -5), k3d.point3(-5, 0, 5), k3d.point3(5, 0, 5)]\n\tfor position in positions:\n\t\tpoints.append(position)\n\t\tpoint_selection.append(0.0)\n\n\t# Create a cubic curve primitive ...\n\tcurves = k3d.cubic_curve.create(mesh)\n\n\t# Create a custom attribute array to control the width of the curve ...\n\twidth = curves.constant_attributes().create(\"constantwidth\", \"k3d::double_t\")\n\n\t# Create a custom attribute array to store color values at each curve vertex ...\n\tCs = curves.vertex_attributes().create(\"Cs\", \"k3d::color\")\n\n\t# Add a single curve to the primitive ...\n\tcurves.periodic().append(False)\n\tcurves.material().append(None)\n\tcurves.curve_first_points().append(len(curves.curve_points()))\n\tcurves.curve_point_counts().append(len(positions))\n\tcurves.curve_selections().append(0.0)\n\tfor i in range(len(positions)):\n\t\tcurves.curve_points().append(i)\n\n\twidth.append(0.2)\n\n\t# Assign some colors to the curve vertices ...\n\tcolors = [k3d.color(1, 0, 0), k3d.color(0, 1, 0), k3d.color(0, 0, 1), k3d.color(1, 1, 1)]\n\tfor color in colors:\n\t\tCs.append(color)\n\n\t# Connect the FrozenMesh to a MeshInstance to place it in the scene ...\n\tmesh_instance = k3d.plugin.create(\"MeshInstance\", context.document)\n\tmesh_instance.name = \"Cubic Curve Instance\"\n\tmesh_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\n\tmesh_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n\n\tk3d.property.connect(context.document, frozen_mesh.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n\n\t# Make the MeshInstance visible to render engines ...\n\tk3d.node.show(context.document, mesh_instance)\n\n\tcontext.document.finish_change_set(\"Create Cubic Curve\")\n\nexcept:\n\tcontext.document.cancel_change_set()\n\traise\n\n"
  },
  {
    "path": "share/k3d/scripts/create_linear_curve.py",
    "content": "#python\n\nimport k3d\n\ncontext.document.start_change_set()\ntry:\n\t# Create a FrozenMesh node to act as a mesh source ...\n\tfrozen_mesh = k3d.plugin.create(\"FrozenMesh\", context.document)\n\tfrozen_mesh.name = \"Linear Curve\"\n\n\t# Create a mesh ...\n\tmesh = frozen_mesh.create_mesh()\n\n\t# Add geometric points to the mesh ...\n\tpoints = mesh.create_points()\n\tpoint_selection = mesh.create_point_selection()\n\n\tpositions = [k3d.point3(-5, 0, -5), k3d.point3(5, 0, -5), k3d.point3(-5, 0, 5), k3d.point3(5, 0, 5)]\n\tfor position in positions:\n\t\tpoints.append(position)\n\t\tpoint_selection.append(0.0)\n\n\t# Create a linear curve primitive ...\n\tcurves = k3d.linear_curve.create(mesh)\n\n\t# Create a custom attribute array to control the width of the curve ...\n\twidth = curves.vertex_attributes().create(\"width\", \"k3d::double_t\")\n\n\t# Create a custom attribute array to store color values at each curve vertex ...\n\tCs = curves.vertex_attributes().create(\"Cs\", \"k3d::color\")\n\n\t# Add a single curve to the primitive ...\n\tcurves.periodic().append(False)\n\tcurves.material().append(None)\n\tcurves.curve_first_points().append(len(curves.curve_points()))\n\tcurves.curve_point_counts().append(len(positions))\n\tcurves.curve_selections().append(0.0)\n\tfor i in range(len(positions)):\n\t\tcurves.curve_points().append(i)\n\n\t# Assign some widths to the curve ...\n\twidths = [0.1, 0.8, 0.8, 0.1]\n\tfor w in widths:\n\t\twidth.append(w)\n\n\t# Assign colors to the curve vertices ...\n\tcolors = [k3d.color(1, 0, 0), k3d.color(0, 1, 0), k3d.color(0, 0, 1), k3d.color(1, 1, 1)]\n\tfor color in colors:\n\t\tCs.append(color)\n\n\t# Connect the FrozenMesh to a MeshInstance to place it in the scene ...\n\tmesh_instance = k3d.plugin.create(\"MeshInstance\", context.document)\n\tmesh_instance.name = \"Linear Curve Instance\"\n\tmesh_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\n\tmesh_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n\n\tk3d.property.connect(context.document, frozen_mesh.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n\n\t# Make the MeshInstance visible to render engines ...\n\tk3d.node.show(context.document, mesh_instance)\n\n\tcontext.document.finish_change_set(\"Create Linear Curve\")\n\nexcept:\n\tcontext.document.cancel_change_set()\n\traise\n\n"
  },
  {
    "path": "share/k3d/scripts/create_particles.py",
    "content": "#python\n\nimport k3d\nfrom random import uniform\n\ncontext.document.start_change_set()\ntry:\n\t# Create a FrozenMesh node to act as a mesh source ...\n\tfrozen_mesh = k3d.plugin.create(\"FrozenMesh\", context.document)\n\tfrozen_mesh.name = \"Particles\"\n\n\t# Create a mesh ...\n\tmesh = frozen_mesh.create_mesh()\n\n\tparticle_count = 100\n\tsize = 10\n\n\t# Add geometric points to the mesh ...\n\tpoints = mesh.create_points()\n\tpoint_selection = mesh.create_point_selection()\n\tfor i in range(particle_count):\n\t\tpoints.append(k3d.point3(uniform(-size, size), uniform(-size, size), uniform(-size, size)))\n\t\tpoint_selection.append(0.0)\n\n\t# Create a particle primitive ...\n\tparticles = k3d.particle.create(mesh)\n\n\t# Create a custom attribute array to control the widths of particles ...\n\tconstantwidth = particles.constant_attributes().create(\"constantwidth\", \"k3d::double_t\")\n\n\t# Create a custom attribute array to store color values for each particle ...\n\tCs = particles.vertex_attributes().create(\"Cs\", \"k3d::color\")\n\n\t# Add particles to the primitive ...\n\tparticles.material().append(None)\n\tfor i in range(particle_count):\n\t\tparticles.points().append(i)\n\t\n\tconstantwidth.append(0.5)\n\n\t# Assign a random color to each particle ...\n\tfor i in range(particle_count):\n\t\tCs.append(k3d.color(uniform(0, 1), uniform(0, 1), uniform(0, 1)))\n\n\t# Connect the FrozenMesh to a MeshInstance to place it in the scene ...\n\tmesh_instance = k3d.plugin.create(\"MeshInstance\", context.document)\n\tmesh_instance.name = \"Particle Instance\"\n\tmesh_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\n\tmesh_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n\n\tk3d.property.connect(context.document, frozen_mesh.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n\n\t# Make the MeshInstance visible to render engines ...\n\tk3d.node.show(context.document, mesh_instance)\n\n\tcontext.document.finish_change_set(\"Create Point Group\")\n\nexcept:\n\tcontext.document.cancel_change_set()\n\traise\n\n"
  },
  {
    "path": "share/k3d/scripts/create_polyhedron.py",
    "content": "#python\n\nimport k3d\n\ncontext.document.start_change_set()\ntry:\n\t# Create a FrozenMesh node to act as a mesh source ...\n\tfrozen_mesh = k3d.plugin.create(\"FrozenMesh\", context.document)\n\tfrozen_mesh.name = \"Square\"\n\n\t# Create a mesh ...\n\tmesh = frozen_mesh.create_mesh()\n\n\t# Add geometric points to the mesh ...\n\tpoints = mesh.create_points()\n\tpoint_selection = mesh.create_point_selection()\n\n\tpositions = [(-5, 0, 5), (5, 0, 5), (5, 0, -5), (-5, 0, -5)]\n\tfor position in positions:\n\t\tpoints.append(k3d.point3(position[0], position[1], position[2]))\n\t\tpoint_selection.append(0.0)\n\n\t# Create a polyhedron primitive ...\n\tpolyhedron = k3d.polyhedron.create(mesh)\n\n\t# Create a custom attribute array to store color values at each polyhedron vertex ...\n\tCs = polyhedron.vertex_attributes().create(\"Cs\", \"k3d::color\")\n\n\t# Add a single quadrilateral to the polyhedron ...\n\tpolyhedron.shell_types().append(k3d.polyhedron.shell_type.POLYGONS)\n\tpolyhedron.face_shells().append(0)\n\tpolyhedron.face_first_loops().append(len(polyhedron.loop_first_edges()))\n\tpolyhedron.face_loop_counts().append(1)\n\tpolyhedron.face_materials().append(None)\n\tpolyhedron.face_selections().append(0.0)\n\tpolyhedron.loop_first_edges().append(len(polyhedron.clockwise_edges()))\n\n\tpolyhedron.clockwise_edges().append(1)\n\tpolyhedron.clockwise_edges().append(2)\n\tpolyhedron.clockwise_edges().append(3)\n\tpolyhedron.clockwise_edges().append(0)\n\n\tpolyhedron.edge_selections().append(0.0)\n\tpolyhedron.edge_selections().append(0.0)\n\tpolyhedron.edge_selections().append(0.0)\n\tpolyhedron.edge_selections().append(0.0)\n\t\n\tpolyhedron.vertex_points().append(0)\n\tpolyhedron.vertex_points().append(1)\n\tpolyhedron.vertex_points().append(2)\n\tpolyhedron.vertex_points().append(3)\n\n\tpolyhedron.vertex_selections().append(0.0)\n\tpolyhedron.vertex_selections().append(0.0)\n\tpolyhedron.vertex_selections().append(0.0)\n\tpolyhedron.vertex_selections().append(0.0)\n\t\n\t# Assign colors to the face vertices ...\n\tCs.append(k3d.color(1, 0, 0))\n\tCs.append(k3d.color(0, 1, 0))\n\tCs.append(k3d.color(0, 0, 1))\n\tCs.append(k3d.color(1, 1, 1))\n\n\t# Connect the FrozenMesh to a MeshInstance to place it in the scene ...\n\tmesh_instance = k3d.plugin.create(\"MeshInstance\", context.document)\n\tmesh_instance.name = \"Square Instance\"\n\tmesh_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\n\tmesh_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n\tk3d.property.connect(context.document, frozen_mesh.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n\n\t# Make the MeshInstance visible to render engines ...\n\tk3d.node.show(context.document, mesh_instance)\n\n\tcontext.document.finish_change_set(\"Create Square\")\n\nexcept:\n\tcontext.document.cancel_change_set()\n\traise\n\n"
  },
  {
    "path": "share/k3d/scripts/create_polyhedron_simple.py",
    "content": "#python\n\nimport k3d\n\ncontext.document.start_change_set()\ntry:\n\t# Create a FrozenMesh node to act as a mesh source ...\n\tfrozen_mesh = k3d.plugin.create(\"FrozenMesh\", context.document)\n\tfrozen_mesh.name = \"Simple Polyhedron\"\n\n\t# Create a mesh ...\n\tmesh = frozen_mesh.create_mesh()\n\n\t# Add two triangles to the mesh ...\n\tvertices = [k3d.point3(-3, -3, 0), k3d.point3(3, -3, 0), k3d.point3(3, 3, 0), k3d.point3(-3, 3, 0)]\n\tvertex_counts = [3, 3]\n\tvertex_indices = [0, 1, 3, 1, 2, 3]\n\tmaterial = None\n\tpolyhedron = k3d.polyhedron.create(mesh, vertices, vertex_counts, vertex_indices, material)\n\t\n\t# Connect the FrozenMesh to a MeshInstance to place it in the scene ...\n\tmesh_instance = k3d.plugin.create(\"MeshInstance\", context.document)\n\tmesh_instance.name = \"Simple Polyhedron Instance\"\n\tmesh_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\n\tmesh_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n\tk3d.property.connect(context.document, frozen_mesh.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n\n\t# Make the MeshInstance visible to render engines ...\n\tk3d.node.show(context.document, mesh_instance)\n\n\tcontext.document.finish_change_set(\"Create Simple Polyhedron\")\n\nexcept:\n\tcontext.document.cancel_change_set()\n\traise\n\n"
  },
  {
    "path": "share/k3d/scripts/describe_plugins.py",
    "content": "#python\n\nimport k3d\n\nfactories = k3d.plugin.factory.lookup()\n\napplication_plugins = []\ndocument_plugins = []\n\nfor factory in factories :\n\tif factory.is_application_plugin():\n\t\tapplication_plugins.append(factory.name())\n\tif factory.is_document_plugin():\n\t\tdocument_plugins.append(factory.name())\n\napplication_plugins.sort()\ndocument_plugins.sort()\n\nprint \"\\nApplication Plugins:\"\nfor plugin in application_plugins:\n\tprint \"\\t\" + plugin\nprint \"\\n\\t\" + \"Total: \" + str(len(application_plugins))\n\nprint \"\\nDocument Plugins:\"\nfor plugin in document_plugins:\n\tprint \"\\t\" + plugin\nprint \"\\n\\t\" + \"Total: \" + str(len(document_plugins))\n\nimport sys\nsys.stdout.flush()\n\nk3d.ui().message(\"Output sent to console\")\n\n"
  },
  {
    "path": "share/k3d/scripts/hello_world.py",
    "content": "#python\n\nimport k3d\n\nk3d.ui().message(\"Howdy, World!\");\n\n"
  },
  {
    "path": "share/k3d/scripts/innovation.py",
    "content": "#python\n\nimport k3d\n\ndef innovate():\n\tglobal context\n\tglobal k3d\n\n\t# Give folks a chance to bail ...\n\tif k3d.ui().query_message(\"Are you sure?  Don't run this script on a real working document!\", [\"OK\", \"Cancel\"]) == 2:\n\t\treturn\n\n\t# Start recording changes for undo-purposes ...\n\tcontext.document.start_change_set()\n\ttry:\n\t\t# Deliver \"value\" ...\n\t\tfor node in k3d.node.lookup(context.document):\n\t\t\tnode.name = \"Microsoft \" + node.name + \" (TM)\"\n\n\t\t# Finish recording undos ...\n\t\tcontext.document.finish_change_set(\"Innovate!\")\n\n\t\t# Communicate the good news to our \"customer\"!\n\t\tk3d.ui().message(\"You have been Innovated ... check your Node List Panel (it's undo-able)\")\n\n\texcept:\n\t\tcontext.document.cancel_change_set()\n\t\traise\n\ninnovate()\n\n"
  },
  {
    "path": "share/k3d/scripts/log_messages.py",
    "content": "#python\n\nimport k3d\n\nk3d.log.critical(\"This is a critical message!\")\nk3d.log.error(\"This is an error message!\")\nk3d.log.warning(\"This is a warning message!\")\nk3d.log.info(\"This is an informational message!\")\nk3d.log.debug(\"This is a debug message!\")\n\nk3d.ui().message(\"Wrote several messages to the K-3D log ... check your console output, or use Help > Open Log Window to see them.\")\n"
  },
  {
    "path": "share/k3d/scripts/print_selected_objects.py",
    "content": "#python\n\nimport k3d\n\nk3d.log.debug(\"***** Selected Nodes *****\")\n\nselection_nodes = k3d.node.lookup(context.document, \"ngui:unique_node\", \"node_selection\")\nif len(selection_nodes):\n\tfor node in selection_nodes[0].selected_nodes():\n\t\tk3d.log.debug(node.name)\nk3d.log.debug(\"**************************\")\n\nk3d.ui().message(\"Output sent to the K-3D log ... check your console output, or use Help > Open Log Window.\")\n\n"
  },
  {
    "path": "share/k3d/scripts/pygtk_hello_world.py",
    "content": "#python\n\nimport k3d\n\n# Well-behaved scripts never wait for user-input if batch_mode() is enabled ...\nif not k3d.batch_mode():\n\timport pygtk\n\tpygtk.require('2.0')\n\timport gtk\n\n\tlabel = gtk.Label(\"Helloooooo ... from PyGTK!\")\n\tlabel.set_padding(5, 5)\n\n\tdialog = gtk.Dialog(\"Howdy, World!\", None, gtk.DIALOG_MODAL | gtk.DIALOG_NO_SEPARATOR, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))\n\tdialog.vbox.pack_start(label)\n\tdialog.show_all();\n\tdialog.run()\n\tdialog.hide()\n\n"
  },
  {
    "path": "share/k3d/scripts/pygtk_plot_function.py",
    "content": "#python\n\nimport k3d\n\n# Well-behaved scripts never wait for user-input if batch_mode() is enabled ...\nif not k3d.batch_mode():\n\timport pygtk\n\tpygtk.require('2.0')\n\n\timport gtk\n\timport math\n\n\tdef mix(a, b, amount):\n\t\treturn (a * (1 - amount)) + (b * amount)\n\n\tx1 = -5\n\tx2 = 5\n\txcount = 29\n\n\ty1 = -5\n\ty2 = 5\n\tycount = 29\n\n\tfunction = \"-2 * math.sqrt(math.fabs(x * y))\"\n\n\tx1_entry = gtk.Entry()\n\tx1_entry.set_text(str(x1))\n\n\tx2_entry = gtk.Entry()\n\tx2_entry.set_text(str(x2))\n\n\txcount_entry = gtk.Entry()\n\txcount_entry.set_text(str(xcount))\n\n\ty1_entry = gtk.Entry()\n\ty1_entry.set_text(str(y1))\n\n\ty2_entry = gtk.Entry()\n\ty2_entry.set_text(str(y2))\n\n\tycount_entry = gtk.Entry()\n\tycount_entry.set_text(str(ycount))\n\n\tfunction_entry = gtk.Entry()\n\tfunction_entry.set_text(str(function))\n\n\ttable = gtk.Table(7, 2)\n\n\ttable.attach(gtk.Label(\"x1\"), 0, 1, 0, 1)\n\ttable.attach(x1_entry, 1, 2, 0, 1)\n\n\ttable.attach(gtk.Label(\"x2\"), 0, 1, 1, 2)\n\ttable.attach(x2_entry, 1, 2, 1, 2)\n\n\ttable.attach(gtk.Label(\"xcount\"), 0, 1, 2, 3)\n\ttable.attach(xcount_entry, 1, 2, 2, 3)\n\n\ttable.attach(gtk.Label(\"y1\"), 0, 1, 3, 4)\n\ttable.attach(y1_entry, 1, 2, 3, 4)\n\n\ttable.attach(gtk.Label(\"y2\"), 0, 1, 4, 5)\n\ttable.attach(y2_entry, 1, 2, 4, 5)\n\n\ttable.attach(gtk.Label(\"ycount\"), 0, 1, 5, 6)\n\ttable.attach(ycount_entry, 1, 2, 5, 6)\n\n\ttable.attach(gtk.Label(\"function\"), 0, 1, 6, 7)\n\ttable.attach(function_entry, 1, 2, 6, 7)\n\n\tdialog = gtk.Dialog(\"Plot Function\", None, gtk.DIALOG_MODAL | gtk.DIALOG_NO_SEPARATOR, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))\n\tdialog.vbox.pack_start(table)\n\tdialog.show_all()\n\n\tresult = gtk.RESPONSE_ACCEPT\n\n\tif not k3d.batch_mode():\n\t\tresult = dialog.run()\n\n\tdialog.hide()\n\n\tif result == gtk.RESPONSE_ACCEPT:\n\t\tx1 = float(x1_entry.get_text())\n\t\tx2 = float(x2_entry.get_text())\n\t\txcount = int(xcount_entry.get_text())\n\t\ty1 = float(y1_entry.get_text())\n\t\ty2 = float(y2_entry.get_text())\n\t\tycount = int(ycount_entry.get_text())\n\t\tfunction = function_entry.get_text()\n\n\t\tcontext.document.start_change_set()\n\t\ttry:\n\t\t\t# Create a FrozenMesh node to act as a mesh source ...\n\t\t\tfrozen_mesh = k3d.plugin.create(\"FrozenMesh\", context.document)\n\t\t\tfrozen_mesh.name = function\n\n\t\t\t# Create a mesh ...\n\t\t\tmesh = frozen_mesh.create_mesh()\n\n\t\t\t# Add geometric points to the mesh ...\n\t\t\tpoints = mesh.create_points()\n\t\t\tpoint_selection = mesh.create_point_selection()\n\n\t\t\tfor xi in range(0, xcount):\n\t\t\t\tfor yi in range(0, ycount):\n\t\t\t\t\tx = mix(x1, x2, float(xi) / (xcount - 1))\n\t\t\t\t\ty = mix(y1, y2, float(yi) / (ycount - 1))\n\t\t\t\t\tz = eval(function)\n\t\t\t\t\tpoints.append(k3d.point3(x, y, z))\n\t\t\t\t\tpoint_selection.append(0.0)\n\n\t\t\t# Create a particle primitive ...\n\t\t\tparticles = k3d.particle.create(mesh)\n\n\t\t\t# Create a custom attribute array to control the widths of particles ...\n\t\t\tconstantwidth = particles.constant_attributes().create(\"constantwidth\", \"k3d::double_t\")\n\n\t\t\tparticles.material().append(None)\n\t\t\tconstantwidth.append(0.2)\n\n\t\t\tfor i in range(len(points)):\n\t\t\t\tparticles.points().append(i)\n\n\t\t\t# Connect the FrozenMesh to a MeshInstance to place it in the scene ...\n\t\t\tmesh_instance = k3d.plugin.create(\"MeshInstance\", context.document)\n\t\t\tmesh_instance.name = function + \" Instance\"\n\t\t\tmesh_instance.gl_painter = k3d.node.lookup_one(context.document, \"GL Default Painter\")\n\t\t\tmesh_instance.ri_painter = k3d.node.lookup_one(context.document, \"RenderMan Default Painter\")\n\t\t\tk3d.property.connect(context.document, frozen_mesh.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n\n\t\t\t# Make the MeshInstance visible to render engines ...\n\t\t\tk3d.node.show(context.document, mesh_instance)\n\n\t\t\tcontext.document.finish_change_set(\"Plot \" + function)\n\t\texcept:\n\t\t\tcontext.document.cancel_change_set()\n\t\t\traise\n\n"
  },
  {
    "path": "share/k3d/scripts/script_context.py",
    "content": "#python\n\nimport k3d\n\nif context.has_key(\"node\"):\n\tk3d.ui().message(\"This script is executing within a node context\")\nelif context.has_key(\"document\"):\n\tk3d.ui().message(\"This script is executing within a document context\")\nelse:\n\tk3d.ui().message(\"This script is executing within the global context\")\n\n"
  },
  {
    "path": "share/k3d/scripts/script_recursion.py",
    "content": "#python\nimport k3d\n\nk3d.ui().message(\"Howdy,\")\n\nrecursive_script = \"\"\"#python\nimport k3d\nk3d.ui().message(\"World!\")\n\"\"\"\n\nk3d.script.execute(recursive_script)\n\n"
  },
  {
    "path": "share/k3d/scripts/script_recursion_context.py",
    "content": "#python\nimport k3d\n\na = \"context 1\"\nk3d.ui().message(a)\n\nrecursive_script = \"\"\"#python\nimport k3d\na = \"context 2\"\nk3d.ui().message(a)\n\"\"\"\n\nk3d.script.execute(recursive_script)\nk3d.ui().message(a)\n\n"
  },
  {
    "path": "share/k3d/scripts/scripted_plugins/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.py k3d/scripts/scripted_plugins)\n\n"
  },
  {
    "path": "share/k3d/scripts/shell/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.py k3d/scripts/shell)\nK3D_ADD_SHARE_FILES(*.k3d k3d/scripts/shell)\n\n"
  },
  {
    "path": "share/k3d/scripts/shell/batch_render.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml package=\"k3d\" version=\"0.7.12.0\" host=\"Linux-2.6.28-13-generic;i686\">\n\t<document>\n\t\t<nodes>\n\t\t\t<node name=\"Axes\" factory=\"00000001 00000000 00000000 00000001\" id=\"2\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"axes\">true</property>\n\t\t\t\t\t<property name=\"xyplane\">true</property>\n\t\t\t\t\t<property name=\"yzplane\">false</property>\n\t\t\t\t\t<property name=\"xzplane\">false</property>\n\t\t\t\t\t<property name=\"gridsize\">2</property>\n\t\t\t\t\t<property name=\"gridcount\">5</property>\n\t\t\t\t\t<property name=\"xcolor\">1 0 0</property>\n\t\t\t\t\t<property name=\"ycolor\">0 0.69999999999999996 0</property>\n\t\t\t\t\t<property name=\"zcolor\">0 0 0.69999999999999996</property>\n\t\t\t\t\t<property name=\"gridcolor\">0.40000000000000002 0.40000000000000002 0.40000000000000002</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/Vera.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"font_size\">12</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Engine\" factory=\"0059ba47 7bf740f3 93fb523d 5899f22c\" id=\"3\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"point_size\">4</property>\n\t\t\t\t\t<property name=\"background_color\">0.80000000000000004 0.80000000000000004 0.80000000000000004</property>\n\t\t\t\t\t<property name=\"fog\">false</property>\n\t\t\t\t\t<property name=\"fog_near\">0</property>\n\t\t\t\t\t<property name=\"fog_far\">100</property>\n\t\t\t\t\t<property name=\"headlight\">true</property>\n\t\t\t\t\t<property name=\"show_lights\">false</property>\n\t\t\t\t\t<property name=\"draw_two_sided\">true</property>\n\t\t\t\t\t<property name=\"draw_safe_zone\">false</property>\n\t\t\t\t\t<property name=\"draw_aimpoint\">true</property>\n\t\t\t\t\t<property name=\"draw_crop_window\">true</property>\n\t\t\t\t\t<property name=\"draw_frustum\">true</property>\n\t\t\t\t\t<property name=\"node_selection\">4</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TimeSource\" factory=\"1978f1f7 4a864c99 8caf7cfc d2591baf\" id=\"5\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"start_time\">0</property>\n\t\t\t\t\t<property name=\"end_time\">4</property>\n\t\t\t\t\t<property name=\"frame_rate\">30</property>\n\t\t\t\t\t<property name=\"time\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera\" factory=\"45ce1872 af184b6d b391e136 0dcfe8b5\" id=\"6\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"navigation_target\">6</property>\n\t\t\t\t\t<property name=\"world_target\">0.37717975602544834 -0.14024744170054668 0.5603221203153943</property>\n\t\t\t\t\t<property name=\"aspect_ratio\"/>\n\t\t\t\t\t<property name=\"show_projection\">false</property>\n\t\t\t\t\t<property name=\"orthographic\">false</property>\n\t\t\t\t\t<property name=\"left\">-0.6666666666666666</property>\n\t\t\t\t\t<property name=\"right\">0.6666666666666666</property>\n\t\t\t\t\t<property name=\"top\">0.5</property>\n\t\t\t\t\t<property name=\"bottom\">-0.5</property>\n\t\t\t\t\t<property name=\"near\">1</property>\n\t\t\t\t\t<property name=\"far\">1000</property>\n\t\t\t\t\t<property name=\"crop_window_left\">0</property>\n\t\t\t\t\t<property name=\"crop_window_right\">1</property>\n\t\t\t\t\t<property name=\"crop_window_top\">0</property>\n\t\t\t\t\t<property name=\"crop_window_bottom\">1</property>\n\t\t\t\t\t<property name=\"show_reference_plane\">false</property>\n\t\t\t\t\t<property name=\"reference_plane\">0</property>\n\t\t\t\t\t<property name=\"reference_plane_color\">0 0 0.69999999999999996</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"7\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">0.98925310626343788 -0.021574033469113848 -0.14461276855109609 2.3843783864179628 -0.14621317227985764 -0.14596618957903434 -0.97842505065622576 13.440112310037344 -1.479331183918374e-15 0.98905431224966145 -0.14755191432288853 2.6083155534542342 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Default Painter\" factory=\"243cba5a 13f342fa 8f1a19cd faf34169\" id=\"8\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"particles\" label=\"Particles\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">9</property>\n\t\t\t\t\t<property name=\"polyhedra\" label=\"Polyhedra\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">10</property>\n\t\t\t\t\t<property name=\"subdivision_surfaces\" label=\"Subdivision Surfaces\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">11</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">12</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">13</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">14</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">15</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">16</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">17</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">18</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">19</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">20</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">21</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">22</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">23</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">24</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">25</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Particle Painter\" factory=\"06fab90b 2f034d69 b4a1cb9f b9864144\" id=\"9\"/>\n\t\t\t<node name=\"RenderMan Polyhedron Painter\" factory=\"0771ea79 6c8c4c6d 8bab8c83 42fc73e9\" id=\"10\"/>\n\t\t\t<node name=\"RenderMan Subdivision Surface Painter\" factory=\"4d6fae39 723e4ed3 bc5735c5 3b75edc0\" id=\"11\"/>\n\t\t\t<node name=\"RenderMan Linear Curve Painter\" factory=\"f8b19206 a0ae4bd1 b3548a15 1209469e\" id=\"12\"/>\n\t\t\t<node name=\"RenderMan Cubic Curve Painter\" factory=\"8c5be7c4 0e8d43c5 a1daace4 a79275d7\" id=\"13\"/>\n\t\t\t<node name=\"RenderMan Bilinear Patch Painter\" factory=\"3f51b275 5a664903 96ed9168 503e30f0\" id=\"14\"/>\n\t\t\t<node name=\"RenderMan Bicubic Patch Painter\" factory=\"64dfefde eedc4047 b59fc8f6 972a9b86\" id=\"15\"/>\n\t\t\t<node name=\"RenderMan NURBS Patch Painter\" factory=\"120d87f0 fe05419f ae2d14ce ea9c32b4\" id=\"16\"/>\n\t\t\t<node name=\"RenderMan Blobby Painter\" factory=\"0221462c c3d44a12 97b39425 29774d3f\" id=\"17\"/>\n\t\t\t<node name=\"RenderMan Cone Painter\" factory=\"6612c455 774ed5d4 5ff0c495 6d920b8e\" id=\"18\"/>\n\t\t\t<node name=\"RenderMan Cylinder Painter\" factory=\"85a1d5ac 224449cf 202911a1 a2434ee8\" id=\"19\"/>\n\t\t\t<node name=\"RenderMan Disk Painter\" factory=\"6c92b34f 57480914 1708dca6 cc8651cc\" id=\"20\"/>\n\t\t\t<node name=\"RenderMan Hyperboloid Painter\" factory=\"8f5ac6bd f84bfac3 8585f08b 953e3df1\" id=\"21\"/>\n\t\t\t<node name=\"RenderMan Paraboloid Painter\" factory=\"49dafd22 d34c22e6 cb8e30b3 0f74f5ef\" id=\"22\"/>\n\t\t\t<node name=\"RenderMan Sphere Painter\" factory=\"a07012c4 ce4b11f4 92d5f48d 8f3751c0\" id=\"23\"/>\n\t\t\t<node name=\"RenderMan Teapot Painter\" factory=\"cf54aa9b 9c4e886c a8cf2fa2 470d44ed\" id=\"24\"/>\n\t\t\t<node name=\"RenderMan Torus Painter\" factory=\"d3865bdb 69469c71 2cc55a8b 420de184\" id=\"25\"/>\n\t\t\t<node name=\"Surface Shader\" factory=\"b553a3bd d1044c6e b3f21e07 87132c31\" id=\"26\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/surface/k3d_plastic.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"Ka\" label=\"Ambient\" description=\"Ambient Amount\" type=\"k3d::double_t\" user_property=\"generic\">1</property>\n\t\t\t\t\t<property name=\"Kd\" label=\"Diffuse\" description=\"Diffuse Amount\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t\t<property name=\"Ks\" label=\"Specular\" description=\"Specular Amount\" type=\"k3d::double_t\" user_property=\"generic\">0.3</property>\n\t\t\t\t\t<property name=\"roughness\" label=\"Roughness\" description=\"Surface Roughness (affects specular reflection size)\" type=\"k3d::double_t\" user_property=\"generic\">0.1</property>\n\t\t\t\t\t<property name=\"specularcolor\" label=\"Specular Color\" description=\"Specular Reflection Color\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManMaterial\" factory=\"00000001 00000000 00000000 00000024\" id=\"27\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"surface_shader\">26</property>\n\t\t\t\t\t<property name=\"displacement_shader\">0</property>\n\t\t\t\t\t<property name=\"atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"interior_shader\">0</property>\n\t\t\t\t\t<property name=\"exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"matte\">false</property>\n\t\t\t\t\t<property name=\"displacement_bounds\">1</property>\n\t\t\t\t\t<property name=\"color\">1 1 1</property>\n\t\t\t\t\t<property name=\"opacity\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Shader\" factory=\"830e867b 7bc94c6c 8d5087ee 8aa35db2\" id=\"28\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/light/k3d_pointlight.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"intensity\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">2000</property>\n\t\t\t\t\t<property name=\"lightcolor\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">1 1 0.70968184939345391</property>\n\t\t\t\t\t<property name=\"from\" label=\"\" description=\"\" type=\"k3d::point3\" user_property=\"generic\">0 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light\" factory=\"00000001 00000000 00000000 0000001d\" id=\"29\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"shader\">28</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"30\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -20 0 1 0 20 0 0 1 30 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Material\" factory=\"00000001 00000002 00000003 00000004\" id=\"31\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"renderman_material\" label=\"RenderMan Material\" description=\"\" type=\"k3d::imaterial*\" user_property=\"generic\">27</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Aqsis\" factory=\"8d430069 63404829 053361ad fc6abda6\" id=\"32\"/>\n\t\t\t<node name=\"Pixie\" factory=\"7a1d773b a9472dae a80223ab 59d62f9a\" id=\"33\"/>\n\t\t\t<node name=\"RenderMan Engine\" factory=\"0dc5e733 fa684e05 86a3865f 42f7a99d\" id=\"34\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"visible_nodes\"> 35</property>\n\t\t\t\t\t<property name=\"enabled_lights\"> 29 36</property>\n\t\t\t\t\t<property name=\"render_engine\">32</property>\n\t\t\t\t\t<property name=\"resolution\"/>\n\t\t\t\t\t<property name=\"hider\"/>\n\t\t\t\t\t<property name=\"pixel_width\">320</property>\n\t\t\t\t\t<property name=\"pixel_height\">240</property>\n\t\t\t\t\t<property name=\"pixel_aspect_ratio\">1</property>\n\t\t\t\t\t<property name=\"default_atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"default_interior_shader\">0</property>\n\t\t\t\t\t<property name=\"default_exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"imager_shader\">0</property>\n\t\t\t\t\t<property name=\"bucket_width\">16</property>\n\t\t\t\t\t<property name=\"bucket_height\">16</property>\n\t\t\t\t\t<property name=\"grid_size\">256</property>\n\t\t\t\t\t<property name=\"eye_splits\">10</property>\n\t\t\t\t\t<property name=\"texture_memory\">1024</property>\n\t\t\t\t\t<property name=\"render_alpha\">false</property>\n\t\t\t\t\t<property name=\"pixel_xsamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_ysamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_filter\">gaussian</property>\n\t\t\t\t\t<property name=\"pixel_filter_width\">2</property>\n\t\t\t\t\t<property name=\"pixel_filter_height\">2</property>\n\t\t\t\t\t<property name=\"exposure\">1</property>\n\t\t\t\t\t<property name=\"gamma\">1</property>\n\t\t\t\t\t<property name=\"dof\">false</property>\n\t\t\t\t\t<property name=\"fstop\">0.3</property>\n\t\t\t\t\t<property name=\"focal_length\">1.6</property>\n\t\t\t\t\t<property name=\"focus_plane\">30</property>\n\t\t\t\t\t<property name=\"shading_rate\">1</property>\n\t\t\t\t\t<property name=\"shading_interpolation\">constant</property>\n\t\t\t\t\t<property name=\"two_sided\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"render_motion_blur\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Node Selection\" factory=\"5d305922 d2442343 077956b6 b112b9b3\" id=\"4\">\n\t\t\t\t<metadata>\n\t\t\t\t\t<pair name=\"ngui:unique_node\">node_selection</pair>\n\t\t\t\t</metadata>\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"selection_weights\"> 37 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Default Painter\" factory=\"6bc7d8a1 bbe7491f a2405d97 8b136c41\" id=\"38\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"points\" label=\"Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">39</property>\n\t\t\t\t\t<property name=\"edges\" label=\"Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">40</property>\n\t\t\t\t\t<property name=\"faces\" label=\"Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">41</property>\n\t\t\t\t\t<property name=\"sds_points\" label=\"SDS Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">0</property>\n\t\t\t\t\t<property name=\"sds_edges\" label=\"SDS Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">0</property>\n\t\t\t\t\t<property name=\"sds_faces\" label=\"SDS Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">0</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">42</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">43</property>\n\t\t\t\t\t<property name=\"nurbs_curves\" label=\"NURBS Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">44</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">45</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">46</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">47</property>\n\t\t\t\t\t<property name=\"bezier_triangle_patches\" label=\"Bezier Triangle Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">48</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">49</property>\n\t\t\t\t\t<property name=\"face_normals\" label=\"Face Normals\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">50</property>\n\t\t\t\t\t<property name=\"face_orientation\" label=\"Face Orientation\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">51</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">52</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">53</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">54</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">55</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">56</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">57</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">58</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">59</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Point Painter\" factory=\"7e376143 b640c3f4 288543a0 57f83514\" id=\"39\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Edge Painter\" factory=\"172c1208 d24430f5 63f70388 1945866e\" id=\"40\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Painter\" factory=\"7e6e8354 604f05ae 1d4d658b 96538240\" id=\"41\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Linear Curve Painter\" factory=\"6acd1d8e 954f4b3a bce4c296 523ebacd\" id=\"42\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cubic Curve Painter\" factory=\"cb30d291 47e146a3 b5167d0f 6f56bd61\" id=\"43\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Curve Painter\" factory=\"86705b44 ef534dc4 86d9fc7a 8709ec59\" id=\"44\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bilinear Patch Painter\" factory=\"f172b866 fce74aa8 a9e792ff 630653f3\" id=\"45\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bicubic Patch Painter\" factory=\"e058ab07 44384acd ba321d58 cdb3ef25\" id=\"46\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Patch Painter\" factory=\"8881a190 9d1c4e6f 8b8c0523 2dc43fda\" id=\"47\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bezier Triangle Patch Painter\" factory=\"8d38bda1 df47e212 1e06bfb8 a8f440c5\" id=\"48\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Blobby Point Painter\" factory=\"06148329 b2264760 84b25aab f8401c63\" id=\"49\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Normal Painter\" factory=\"02d092ca 84405ff6 4fe806a9 ab886cb1\" id=\"50\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Orientation Painter\" factory=\"7bc1ee5f 45802906 323984bf cbe858d6\" id=\"51\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cone Painter\" factory=\"ae8f0e12 33403c10 04e4998d 17a8ec8c\" id=\"52\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cylinder Painter\" factory=\"311d3fbd 6a46e7b0 ccf9af8e f2daf44a\" id=\"53\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Disk Painter\" factory=\"e30f4079 8a4a030f 5ce166b6 77f324b4\" id=\"54\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Hyperboloid Painter\" factory=\"8fc78171 3e49ff1a a4b6e69d aa8fafa3\" id=\"55\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Paraboloid Painter\" factory=\"a4e66aa9 c34a22ca c5d3b19e 83c5d0f4\" id=\"56\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Sphere Painter\" factory=\"e22923fa 5146fa44 0b6ff7b2 3f71ad6e\" id=\"57\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Teapot Painter\" factory=\"aa87fdcc fc47c821 87d74dad f1f9f833\" id=\"58\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Torus Painter\" factory=\"271118dd 2a47903b f36b96b8 f6916c27\" id=\"59\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"OBJMeshReader\" factory=\"650f96b9 e1c145d5 9eda410d 13f4e98f\" id=\"37\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"file\" reference=\"relative\" relative_path=\"geometry/knot.obj\" watched=\"true\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"center\">true</property>\n\t\t\t\t\t<property name=\"scale_to_size\">true</property>\n\t\t\t\t\t<property name=\"size\">10</property>\n\t\t\t\t\t<property name=\"material\">31</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"OBJMeshReader Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"35\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">38</property>\n\t\t\t\t\t<property name=\"ri_painter\">8</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManLight\" factory=\"00000001 00000000 00000000 0000001d\" id=\"36\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"shader\">60</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Move RenderManLight\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"61\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 7.3418194301853195 0 1 0 13.835168489460481 0 0 1 6.8781736240983511 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManLightShader\" factory=\"830e867b 7bc94c6c 8d5087ee 8aa35db2\" id=\"60\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/light/k3d_pointlight.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"intensity\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">200</property>\n\t\t\t\t\t<property name=\"lightcolor\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">0.63709468223086896 0.63709468223086896 1</property>\n\t\t\t\t\t<property name=\"from\" label=\"\" description=\"\" type=\"k3d::point3\" user_property=\"generic\">0 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"CalculateNormals\" factory=\"a6d565ee 6b4a065d 2430ca88 b0bd88a1\" id=\"62\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set>\n\t\t\t\t\t\t\t<storage type=\"point\">\n\t\t\t\t\t\t\t\t<structure>\n\t\t\t\t\t\t\t\t\t<array name=\"index_begin\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"index_end\" type=\"k3d::uint_t\">4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"weight\" type=\"k3d::double_t\">1</array>\n\t\t\t\t\t\t\t\t</structure>\n\t\t\t\t\t\t\t</storage>\n\t\t\t\t\t\t\t<storage type=\"primitive\">\n\t\t\t\t\t\t\t\t<structure>\n\t\t\t\t\t\t\t\t\t<array name=\"index_begin\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"index_end\" type=\"k3d::uint_t\">4294967295 4294967295 4294967295 4294967295 4294967295 4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_begin\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_end\" type=\"k3d::uint_t\">4294967295 4294967295 4294967295 4294967295 4294967295 4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_first_range\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_range_count\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_selection_type\" type=\"k3d::int32_t\">26 27 28 29 30 32</array>\n\t\t\t\t\t\t\t\t\t<array name=\"weight\" type=\"k3d::double_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t\t\t</structure>\n\t\t\t\t\t\t\t</storage>\n\t\t\t\t\t\t</set>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"max_angle\">1.55334303428</property>\n\t\t\t\t\t<property name=\"uniform\">false</property>\n\t\t\t\t\t<property name=\"face_varying\">true</property>\n\t\t\t\t\t<property name=\"vertex\">false</property>\n\t\t\t\t\t<property name=\"uniform_array\">N</property>\n\t\t\t\t\t<property name=\"face_varying_array\">N</property>\n\t\t\t\t\t<property name=\"vertex_array\">N</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t</nodes>\n\t\t<dependencies>\n\t\t\t<dependency from_node=\"7\" from_property=\"output_matrix\" to_node=\"6\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"30\" from_property=\"output_matrix\" to_node=\"29\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"62\" from_property=\"output_mesh\" to_node=\"35\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"61\" from_property=\"output_matrix\" to_node=\"36\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"37\" from_property=\"output_mesh\" to_node=\"62\" to_property=\"input_mesh\"/>\n\t\t</dependencies>\n\t</document>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/scripts/shell/batch_render.py",
    "content": "#python\n\n# This script uses Python to load an existing K-3D document, load a sample OBJ file\n# into the document, then render the results using RenderMan. It provides an example\n# of a \"batch rendering\" scenario where the user has prepared a document with the K-3D\n# graphical user interface, then uses a script to modify the document and render the\n# results to a file in the current working directory.\n# \n# This scenario can be adapted to many different use-cases.  For example, this\n# script could be modified to load a series of OBJ files into the document, rendering\n# each in-turn.  The script could also modify other properties of the document to\n# create animated effects.\n#\n# To run the script, do the following at the shell:\n#\n# $ k3d --ui=none --script-file=/path/to/batch_render.py --batch --exit\n#\n# The \n\nimport k3d\nimport os\n\n# Load our \"template\" document.  We assume that the document already contains  materials / lighting / render options to suit.\ndocument = k3d.open_document(k3d.share_path() / k3d.filesystem.generic_path(\"scripts/shell/batch_render.k3d\"))\n\n# Load an external OBJ file into the document.\nobj_reader = k3d.node.lookup_one(document, \"OBJMeshReader\")\nobj_reader.filepath = k3d.share_path() / k3d.filesystem.generic_path(\"geometry/knot.obj\")\n\n# Figure-out where to put the rendered results.\noutput = k3d.filesystem.native_path(os.getcwd()) / k3d.filesystem.generic_path(\"batch_render.tiff\")\nprint output\n\n# Render the document to the current directory.\ncamera = k3d.node.lookup_one(document, \"Camera\")\nrender_engine = k3d.node.lookup_one(document, \"RenderMan Engine\")\nrender_engine.render_camera_frame(camera, output, False)\n\n"
  },
  {
    "path": "share/k3d/scripts/shell/simple_rpc.py",
    "content": "#python\n\n# This script uses Python to start an interactive \"K-3D server\" that listens for\n# Python commands on port 8888, executing each command and printing its output.\n# Although this example is a toy (a real RPC server wouldn't incorporate interactive\n# Python prompts into its output, for example), it demonstrates how K-3D can be\n# easily integrated into larger systems.\n#\n# To start a K-3D \"server\", do the following at the shell:\n#\n# $ k3d --ui=none --script-file=/path/to/simple_rpc.py\n#\n# To communicate with the running K-3D \"server\" use netcat to send interactive\n# Python \"commands\":\n#\n# $ nc localhost 8888\n#\n# You can use \"exit()\" or \"quit()\" to end a client session cleanly.  You will\n# have to use Ctrl-C or similar to end the server process.\n\nimport code\nimport k3d\nimport sys\nimport SocketServer\n\nconsole = code.InteractiveConsole()\nconsole.push(\"__close = False\\n\")\nconsole.push(\"def exit():\\n  global __close\\n  __close = True\\n\")\nconsole.push(\"def quit():\\n  global __close\\n  __close = True\\n\")\n\nclass request_handler(SocketServer.BaseRequestHandler):\n\n\tdef __init__(self, request, client_address, server):\n\t\tsys.stdout = self\n\t\tsys.stderr = self\n\n\t\tSocketServer.BaseRequestHandler.__init__(self, request, client_address, server)\n\n\tdef write(self, output):\n\t\tself.request.send(output)\n\n\tdef handle(self):\n\t\tglobal console\n\t\tconsole.locals[\"__close\"] = False\n\n\t\tsys.stdout.write(\">>> \")\n\t\twhile True:\n\t\t\tmore_input = console.push(self.request.recv(1024))\n\n\t\t\tif console.locals[\"__close\"]:\n\t\t\t\tbreak\n\n\t\t\tif more_input:\n\t\t\t\tsys.stdout.write(\"... \")\n\t\t\telse:\n\t\t\t\tsys.stdout.write(\">>> \")\n    \naddress = (\"localhost\", 8888)\nserver = SocketServer.TCPServer(address, request_handler)\n\nk3d.log.info(\"K-3D listening for Python commands on port 8888 ...\")\nserver.serve_forever()\n\n"
  },
  {
    "path": "share/k3d/scripts/undo_redo_errors.py",
    "content": "#python\n\nimport k3d\n\n# While recording state changes for undo/redo purposes, you must ensure that errors are handled properly!\n\ncontext.document.start_change_set()\ntry:\n\tif k3d.ui().query_message(\"Choose one ...\", [\"Succeed\", \"Fail\"]) == 2:\n\t\traise RuntimeError(\"Simulated error condition.\")\n\n\tnull_node = k3d.plugin.create(\"Null\", context.document)\n\tnull_node.name = \"Test Node\"\n\n\tcontext.document.finish_change_set(\"Test Change Set\")\n\tk3d.ui().message(\"State recording completed successfully ... check the Edit menu.\")\n\nexcept:\n\tcontext.document.cancel_change_set()\n\tk3d.ui().message(\"State recording cancelled due to an error!\")\n"
  },
  {
    "path": "share/k3d/scripts/user_interface.py",
    "content": "#python\n\nimport k3d\n\nk3d.ui().message(\"This is a message!\")\nk3d.ui().warning_message(\"This is a warning message!\")\nk3d.ui().error_message(\"This is an error message!\")\n\nresult = k3d.ui().query_message(\"Pick one!\", [\"Choice 1\", \"Choice 2\", \"Choice 3\"])\nk3d.ui().message(\"You chose \" + str(result))\n\nresult = k3d.ui().get_file_path(\"read\", \"test\", \"Choose file to read (doesn't actually read anything):\", \"\")\nk3d.ui().message(\"You chose \" + str(result))\n\nresult = k3d.ui().get_file_path(\"write\", \"test\", \"Choose file to write (doesn't actually write anything):\", \"\")\nk3d.ui().message(\"You chose \" + str(result))\n\n"
  },
  {
    "path": "share/k3d/scripts/user_properties.py",
    "content": "#python\n\nimport k3d\n\ncontext.document.start_change_set()\ntry:\n\tnode = k3d.plugin.create(\"Null\", context.document)\n\tnode.name = \"User Properties Test\"\n\n\tk3d.property.create(node, \"k3d::bool_t\", \"bool\", \"Boolean\", \"Boolean user property\")\n\tk3d.property.create(node, \"k3d::color\", \"color\", \"Color\", \"Color user property\")\n\tk3d.property.create(node, \"k3d::double_t\", \"double\", \"Double\", \"Double user property\")\n\tk3d.property.create(node, \"k3d::int32_t\", \"integer\", \"Integer\", \"Integer user property\")\t\n\tk3d.property.create(node, \"k3d::matrix4\", \"matrix4\", \"Matrix4\", \"Matrix4 user property\")\t\n\tk3d.property.create(node, \"k3d::string_t\", \"string\", \"String\", \"String user property\")\t\n\tk3d.property.create(node, \"k3d::point3\", \"point3\", \"Point3\", \"Point user property\")\n\n\tk3d.property.ri.create_attribute(node, \"k3d::int32_t\", \"render\", \"ri_attribute_integer\", \"RenderMan Integer\", \"RenderMan Integer Attribute\")\n\tk3d.property.ri.create_attribute(node, \"k3d::double_t\", \"render\", \"ri_attribute_real\", \"RenderMan Real\", \"RenderMan Real Attribute\")\n\tk3d.property.ri.create_attribute(node, \"k3d::string_t\", \"render\", \"ri_attribute_string\", \"RenderMan String\", \"RenderMan String Attribute\")\n\tk3d.property.ri.create_attribute(node, \"k3d::point3\", \"render\", \"ri_attribute_point\", \"RenderMan Point\", \"RenderMan Point Attribute\")\n\tk3d.property.ri.create_attribute(node, \"k3d::vector3\", \"render2\", \"ri_attribute_vector\", \"RenderMan Vector\", \"RenderMan Vector Attribute\")\n\tk3d.property.ri.create_attribute(node, \"k3d::color\", \"render2\", \"ri_attribute_color\", \"RenderMan Color\", \"RenderMan Color Attribute\")\n\tk3d.property.ri.create_attribute(node, \"k3d::point4\", \"render2\", \"ri_attribute_hpoint\", \"RenderMan HPoint\", \"RenderMan HPoint Attribute\")\n\tk3d.property.ri.create_attribute(node, \"k3d::matrix4\", \"render2\", \"ri_attribute_matrix\", \"RenderMan Matrix\", \"RenderMan Matrix Attribute\")\n\n\tnode.string = \"Howdy, World!\"\n\n\tcontext.document.finish_change_set(\"User Property Sample\")\n\nexcept:\n\tcontext.document.cancel_change_set()\n\traise\n\n"
  },
  {
    "path": "share/k3d/shaders/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.h k3d/shaders)\n\nADD_SUBDIRECTORY(displacement)\nADD_SUBDIRECTORY(glsl)\nADD_SUBDIRECTORY(imager)\nADD_SUBDIRECTORY(light)\nADD_SUBDIRECTORY(surface)\nADD_SUBDIRECTORY(volume)\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.sl k3d/shaders/displacement)\nK3D_ADD_SHARE_FILES(*.slmeta k3d/shaders/displacement)\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_brickbump.sl",
    "content": "#ifdef RCSIDS\nstatic char rcsid[] = \"$Id: brickbump.sl,v 1.1.1.1 2002/02/10 02:35:49 tal Exp $\";\n#endif\n\n/*\n * brickbump.sl -- displacement shader for bricks.\n *\n * Description:\n *   Makes displacements for a wall of bricks.  This is the companion\n *   shader to the surface \"brick\" shader.  The parameters work exactly\n *   the same.  Of course, you can use it with any surface shader, and\n *   in fact matte or plastic gives those nice white cinder block walls.\n *   However, if you do use it with \"brick\", the parameters MUST match,\n *   or your bricks will look very strange.\n * \n * Parameters:\n *    brickwidth                Width of a brick (in st space)\n *    brickheight               Height of a brick (in st space)\n *    mortarthickness           Thickness of the mortar (in st space)\n *    rowvary                   How much does each row shift?\n *    jagged                    How much do bricks deviate from squares?\n *    pitting                   The amplitude of the \"pits\" on the face of\n *                                 the bricks.\n *    pockfrequency             The st frequency of the pits.\n *    groovedepth               The depth of the grooves between bricks.\n *\n * AUTHOR: written by Larry Gritz, 1992 (and subsequently modified)\n *\n * $Revision: 1.1.1.1 $     $Date: 2002/02/10 02:35:49 $\n *\n */\n\n\n\n#include \"k3d_noises.h\"\n#include \"k3d_patterns.h\"\n\n\n\ndisplacement\nbrickbump ( float jagged = 0.006;\n\t    float raggedamp = 0.04, raggedfreq = 12;\n            float brickwidth = .28, brickheight = .07;\n\t    float mortarthickness = .014;\n\t    float rowvary = .5, pitting = 0.01;\n\t    float pockfrequency = 10, groovedepth = 0.01; )\n{\n#define sqr(x) ((x)*(x))\n    float sbrick, tbrick;\n    float ss, tt;\n    float fact, disp;\n    uniform float BMWIDTH = (brickwidth+mortarthickness);\n    uniform float BMHEIGHT = (brickheight+mortarthickness);\n    uniform float MWF = (mortarthickness*0.5/BMWIDTH);\n    uniform float MHF = (mortarthickness*0.5/BMHEIGHT);\n\n    basicbrick (s, t, BMWIDTH, BMHEIGHT, 0.5, rowvary, 1, jagged,\n\t       sbrick, tbrick, ss, tt);\n\n    ss += raggedamp * snoisexy ((s+tbrick*5.15)*raggedfreq,\n\t\t\t       (t+sbrick*23.8)*raggedfreq);\n    tt += raggedamp * snoisexy ((s+tbrick*11.4)*raggedfreq,\n\t\t\t       (t+sbrick*7.2)*raggedfreq);\n    ss += raggedamp/2 * snoisexy ((s+tbrick*5.15)*raggedfreq*2,\n\t\t\t\t (t+sbrick*23.8)*raggedfreq*2);\n    tt += raggedamp/2 * snoisexy ((s+tbrick*11.4)*raggedfreq*2,\n\t\t\t\t (t+sbrick*7.2)*raggedfreq*2);\n\n    fact = 1;\n    disp = 0;\n    if (tt < MHF) {\n\t/* We're in the top horizontal groove */\n\tdisp = groovedepth * (sqr((tt)/MHF) - 1);\n    }\n    else if (tt > (1.0-MHF)) {\n      /* Bottom horizontal groove */\n\tdisp = groovedepth * (sqr((1-tt)/MHF) - 1);\n    }\n    if (ss < MWF) {\n\tdisp = min (disp, 0.85 * groovedepth * (sqr(ss/MWF) - 1));\n    }\n    else if (ss > (1.0-MWF)) {\n\tdisp = min (disp, 0.85 * groovedepth * (sqr((1-ss)/MWF) - 1));\n    }\n\n    fact = smoothstep (0, 1.3*MHF, tt) - smoothstep (1.0-1.3*MHF, 1, tt);\n    fact *= (smoothstep (0, 1.3*MWF, ss) - smoothstep (1.0-1.3*MWF, 1, ss));\n    fact = pitting * (0.75 * fact + 0.25);\n    disp -= fact * pow(noise ((ss+sbrick)*pockfrequency/BMHEIGHT,\n\t\t\t      (tt+tbrick)*pockfrequency/BMWIDTH), 0.25);\n\n    P += disp * normalize(N);\n    N = calculatenormal (P);\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_brickbump.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_brickbump\">\n\t\t\t<argument name=\"brickwidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".28\"/>\n\t\t\t<argument name=\"brickheight\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".07\"/>\n\t\t\t<argument name=\"mortarthickness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".014\"/>\n\t\t\t<argument name=\"rowvary\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"jagged\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.001\"/>\n\t\t\t<argument name=\"raggedamp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.001\"/>\n\t\t\t<argument name=\"raggedfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"12\"/>\n\t\t\t<argument name=\"pitting\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.01\"/>\n\t\t\t<argument name=\"pockfrequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"10\"/>\n\t\t\t<argument name=\"groovedepth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.04\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_bubbles.sl",
    "content": "/*\n * FEbubbles.sl\n * \n * A simple semi-sphere carpet displacement\n * Felipe Esquivel  felipeer@hotmail.com\n * Nov 2000\n * \n */\ndisplacement k3d_bubbles(float radius = 0.5;   /* values between -0.5 and 0.5          */\n                       float Kmag = 1;       /* scale                                */\n                       float frequency = 1;) /* number of bubbles per linear surface */\n\n{\n float distance2point;\n point myCenter = (0, 0, 0);\n float magnitud = 0;\n \n float smod = mod((s) * frequency, 1) - 0.5;\n float tmod = mod((t) * frequency, 1) - 0.5;\n point myPoint = (smod, 0, tmod);\n distance2point = distance(myPoint, myCenter);\n if (distance2point <= radius) \n    magnitud = sqrt((radius * radius) - (distance2point * distance2point));\n\n P += Kmag * magnitud * normalize(N);\n N = calculatenormal(P);\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_bubbles.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_bubbles\">\n\t\t\t<argument name=\"radius\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"Kmag\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"frequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_bubbly.sl",
    "content": "/*  bubbly.sl written a while ago by Ivan DeWolf\n *  ivan@SpamSucks_martian-tools.com\n *  feel free to copy, distribute, hack and/or abuse this code \n *  in any way you see fit, but please leave my name near the top\n *\n *  basicly it's F1 squared as described in \n *  \"a cellular texture basis function\" by Steven Worley in the \n *  siggraph proceedings from 1996, except this uses a noised grid of cells\n *  instead of the sparse convolution in the paper.\n *  not as elegant, but hey, it works.\n *\n *  the \"bubbles\" are paraboloids diplaced along the normal. \n *  try lowering bubsize for pimples.\n *  try negative values for Kd.\n *  try anything you feel like.\n *\n *  PARAMETERS:\n *  mult    - multiples of bubbles per unit\n *  Nzscale - scale of the noise that randomizes the location of \n *            the bubbles. set this to zero for a perfect grid of bubbles.\n *\t      dont go higher than two with this.\n *  Kd      - coefficient of displacement. \n *\t      Displacement bounds and this value should be equal.\n *  bubsize - basicly the radius of the bubbles. distance in rVu's.\n */\n\ndisplacement\nk3d_bubbly(\n  float  mult\t = 5,\n         Nzscale = 1,\n         Kd      = .2,\n         bubsize = 1)\n{\n  normal Nn = normalize(N);\n  float a,b,c,bub;\n  float dist, shortest=10000;\n  point Po = transform(\"object\",P)*mult;\n\n  /*true cell center, surrounding cell centers, noised cell center*/\n  point trucell, surrcell, nzcell;\n  vector offset;\n  \n  setxcomp(trucell,floor(xcomp(Po))+.5);\n  setycomp(trucell,floor(ycomp(Po))+.5);\n  setzcomp(trucell,floor(zcomp(Po))+.5);\n\t\t\t     \n  /*what is the shortest distance to a noised cell center?*/\n  for(a = -1; a<= 1; a+=1){\n    for(b = -1; b<=1; b += 1){\n      for(c = -1; c<=1; c += 1){\n\toffset = vector(a,b,c);\n\tsurrcell = trucell+offset;\n\tnzcell = surrcell + ((vector cellnoise(surrcell)-.5)*Nzscale);\n\tdist = distance(Po,nzcell);\n\tif(dist<shortest) shortest = dist;\n      }\n    }\n  }\n  bub = clamp(shortest,0,bubsize)/bubsize; \n  P+= Nn*(pow(bub,2)-1)*Kd;\n  N = calculatenormal(P);\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_bubbly.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_bubbly\">\n\t\t\t<argument name=\"mult\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"Nzscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"-0.2\"/>\n\t\t\t<argument name=\"bubsize\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.8\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_castucco.sl",
    "content": "/*\n * castucco.sl -- dispacement shader for stucco.\n *\n * Description:\n *   I call this \"castucco\" because it's the stuff on the walls *everywhere*\n *   in Northern California.  I never really saw it on the East Coast,\n *   but in CA it's truly ubiquitous.\n * \n * Parameters:\n *   freq - basic frequency of the texture\n *   Km - amplitude of the mesas.\n *   octaves - how many octaves of fBm to sum\n *   trough, peak - define the shape of the valleys and mesas of the stucco.\n *\n * $Revision: 1.1 $    $Date: 2006/02/25 20:11:53 $\n *\n */\n\n#include \"k3d_noises.h\"\n#include \"k3d_displace.h\"\n\ndisplacement k3d_castucco(float freq = 1;\n\t\t\t  float Km = 0.2;\n\t\t\t  float octaves = 3;\n\t\t\t  float trough = -0.15, peak = 0.35)\n{\n  point Pshad;\t\t\t/* Point to be shaded, in shader space */\n  float fwidth;\t\t\t/* Estimated change in P between image samples */\n  float disp;\t\t\t/* Amount to displace */\n\n  /* Do texture calcs in \"shader\" space, get approximate filter size */\n  Pshad = freq * transform(\"shader\", P);\n  fwidth = filterwidthp(Pshad);\n\n  /* Compute some fractional Brownian motion */\n  disp = fBm(Pshad, fwidth, 3, 2, 0.6);\n\n  /* Threshold the fBm and scale it */\n  disp = Km * smoothstep(trough, peak, disp);\n\n  /* displace in shader space units */\n  N = Displace(normalize(N), \"shader\", disp, 1);\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_castucco.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_castucco\">\n\t\t\t<description>California-style stucco</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"freq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Km\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.2\"/>\n\t\t\t<argument name=\"octaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"3\"/>\n\t\t\t<argument name=\"trough\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"-0.15\"/>\n\t\t\t<argument name=\"peak\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.35\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_dented.sl",
    "content": "/*\n * dented.sl -- displacement shader for dents\n *\n * DESCRIPTION:\n *   Makes a surface appear worn and dented.\n * \n * PARAMETERS:\n *   Km \t   \tthe amplitude of the dents\n *   power\t   \tcontrols the fractal dimension of the dents (1 looks\n *                         like previously crumpled paper or cloth, 3 looks\n *                         like worn metal).\n *   frequency  \tthe frequency of the dents\n *\n *\n * AUTHOR: written by Larry Gritz, based on the \"dented\" shader in\n *         RenderMan Companion, but with more control parameters.\n *\n * HISTORY:\n *      Dec 1992 -- written by lg for \"Timbre Trees Examples\" (jingle)\n *\n * last modified  12 Jan 1994 by Larry Gritz\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\n\n\ndisplacement k3d_dented( float Km = 1; float power = 3; float frequency = 1; float maxoctaves = 6; )\n{\n\tfloat size;\n\tfloat magnitude = 0;\n\tfloat i;\n\tpoint PP;\n\n\tPP = transform (\"shader\", P);\n\tsize = frequency;\n\tfor(i = 0;  i < maxoctaves;  i += 1)\n\t\t{\n\t\t\tmagnitude += abs(0.5 - noise(PP*size)) / size;\n\t\t\tsize *= 2;\n\t\t}\n\tP = P - (Km * pow(magnitude, power)) * normalize(N);\n\tN = calculatenormal(P);\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_dented.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_dented\">\n\t\t\t<description>Makes a surface appear worn and dented</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Km\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"power\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"3\"/>\n\t\t\t<argument name=\"frequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"maxoctaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"6\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_displacementmap.sl",
    "content": "displacement k3d_displacementmap(float Km = 1;\n\t\t\t\t float ZeroPoint = 0.0;\n\t\t\t\t string texturename = \"\";)\n{\n  point PP;\n  point N1, N2;\n  float Ct;\n\n  Ct = (texturename != \"\") ? float texture(texturename) : 0;\n\n  N1 = calculatenormal(P);\n  P = P - (Km * (Ct - ZeroPoint)) * normalize(N);\n  N2 = calculatenormal(P);\n  N = normalize(N) + normalize(N2) - normalize(N1);\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_displacementmap.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_displacementmap\">\n\t\t\t<description>Applies a texture as a displacement map</description>\n\t\t\t<authors>Timothy M. Shead</authors>\n\t\t\t<copyright>Copyright (c) 1995-2004, Timothy M. Shead</copyright>\n\t\t\t<argument name=\"Km\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"ZeroPoint\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.0\"/>\n\t\t\t<argument name=\"texturename\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_droop.sl",
    "content": "/* Copyrighted Pixar 1989 */\n/* From the RenderMan Companion p.370 */\n/* Listing 16.27  Displacement shader with catenary droop in y*/\n\n/*\n * droop(): a displacement shader for making a surface \"sag\" along t.\n*/\n#include \"k3d_constants.h\" \n\ndisplacement \nk3d_droop ( \n\tfloat\tKm = 0.05 )\n{\n\tfloat droop, yDel;\n \n\tdroop = (t-.5)*2;\t/* t in [0,1] goes to droop in [-1,1] */\n\n\tyDel = -Km * ( M_E + (1/M_E) - (exp(droop)+exp(-droop)) );\n\tsetycomp(P, ycomp(P) + yDel);\n\tN = calculatenormal(P);\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_droop.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_droop\">\n\t\t\t<argument name=\"Km\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_dturb.sl",
    "content": "/* dturb.sl\n *\n * turbulence displacement\n */\n\n#include \"k3d_rmannotes.h\"\n#include \"k3d_filterwidth.h\"\n\ndisplacement k3d_dturb(float Km = 0.1, freq = 10, flatness = 1)\n{\n  float magnitude, layer_mag;\n  point PP;\n  float width, cutoff, fade, f, turb, maxfreq = 16;\n\n  /* compute turbulence */\n\n  PP = transform(\"shader\", P) * freq;\n\n  width = filterwidthp(PP);\n  cutoff = clamp(0.5 / width, 0, maxfreq);\n\n  turb = 0;\n  for (f = 1; f < 0.5 * cutoff; f *= 2) \n    turb += abs(snoise(PP * f)) / f;\n  fade = clamp(2 * (cutoff - f) / cutoff, 0, 1);\n  turb += fade * abs(snoise(PP * f)) / f;\n\n  /* raise to power to create flat areas */\n\n  magnitude = pow(turb, flatness);\n\n  /* output */\n\n  P += Km * magnitude * normalize(N);\n  N = calculatenormal(P);\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_fractal.sl",
    "content": "/*********************************\n *AUTHOR: Ken Musgrave.\n *    Conversion to Shading Language and minor modifications by Fredrik Brnnbacka.\n *\n *\n * REFERENCES:\n *    _Texturing and Modeling: A Procedural Approach_, by David S. Ebert, ed.,\n *    F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, and Steven Worley.\n *    Academic Press, 1998.  ISBN 0-12-228730-4.\n *\n *********************************/\n #include \"k3d_noises.h\"\n\ndisplacement\nk3d_fractal(float H = 0.8, lacunarity = 2.5, octaves = 7, offset = 0.9, sharpness = 4, threshold = 12, Kt = 0.1)\n{\n\tfloat result, signal, weight, i, exponent;\n\tpoint PP =transform(\"shader\",P);\n\tnormal Nn = normalize(N);\t\n\tfor( i=0; i<octaves; i += 1 ) {\n       \t\t/* First octaves */\n\n       \t\tif ( i == 0) {\n          \t\tsignal = snoise2( PP );\n          \t\tif ( signal < 0.0 ) signal = -signal;\n          \t\tsignal = offset - signal;\n          \t\tsignal = pow( signal, sharpness );\n                             /*This should give you a power function to control\n                             sharpness of the ridges. Or you can just use the\n                             original one -- signal *= signal;*/\n          \t\tresult = signal;\n          \t\tweight = 1.0;\n        \t}else{\n        \t\n          \t\texponent = pow( lacunarity, (-i*H) );\n\t\t\t/*\n          \t\tPP.x *= lacunarity;\n          \t\tPP.y *= lacunarity;\n          \t\tPP.z *= lacunarity;\n\t\t\t*/\n\t\t\tPP = PP * lacunarity;\n          \t\t/* weigh successive contributions by previous signal */\n          \t\tweight = signal * threshold;\n          \t\tweight = clamp(weight,0,1)    ;    \t\t\n          \t\tsignal = snoise2( PP );\n\n          \t\t/* get absolute value of signal*/\n          \t\tsignal = abs(signal);\n\n          \t\t/* invert and translate*/\n          \t\tsignal = offset - signal;\n\n          \t\t/* sharpen the ridge*/\n          \t\tsignal = pow( signal, sharpness ); /* Or signal *= signal;*/\n\n          \t\t/* weight the contribution*/\n          \t\tsignal *= weight;\n          \t\tresult += signal * exponent;\n       \t\t}\n\t}\n\n\tP+= Nn*result*Kt;\n  \tN = calculatenormal(P);\t\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_fractal.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_fractal\">\n\t\t\t<argument name=\"H\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.8\"/>\n\t\t\t<argument name=\"lacunarity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"2.5\"/>\n\t\t\t<argument name=\"octaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"7\"/>\n\t\t\t<argument name=\"offset\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.9\"/>\n\t\t\t<argument name=\"sharpness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"4\"/>\n\t\t\t<argument name=\"threshold\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"12\"/>\n\t\t\t<argument name=\"Kt\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_gloop.sl",
    "content": "/*  IDGloop.sl written 8/99 by Ivan DeWolf\n *  courtesy of Rhythm & Hues  (thanks!)\n *  ivan@SpamSucks_martian-labs.com\n *\n * an example of nonlinear displacements \n * generated from the gradient of a noise function.\n * Written as an explanation to the talk I gave at\n * the \"stupid renderman tricks\" section of the 1998\n * Renderman Users Group meeting at siggraph.\n *\n * freq - the frequency of the noise. Lower values\n *        will cause a larger displacement so you will \n *        have to change your displacement bounds to fit\n *        rhymes with freak.\n *\n * magnitude - how far to displace. probably fine set where it is.\n *\n * displacement bounds can be computed with the following \n * wildly complex formula:\n *\n * 10*magnitude/freq\n * \n */\n\ndisplacement\nk3d_gloop(float freq = 5, magnitude = .2){\n\n  vector overdist = .1;\n  vector stepsize = magnitude/freq;\n  float numsteps = 20;\n  point  Psh = transform(\"object\",P)*freq;\n  float  i;\n\n  vector dPduN = normalize(vtransform(\"object\",dPdu));\n  vector dPdvN = normalize(vtransform(\"object\",dPdv));\n\n  point  Pou = Psh + (dPduN*overdist);/*P Over a distance in U*/\n  point  Pov = Psh + (dPdvN*overdist);\n\n  /*noise function at the point, over in u, and over in v*/\n  float  nz = noise(Psh)-.5;\n  float  nzou = noise(Pou)-.5;\n  float  nzov = noise(Pov)-.5;\n\n  float  chu = (nz - nzou);/*change in noise value in u*/\n  float  chv = (nz - nzov); \n\n  /*init deflected derivatives*/\n  vector DdPdu = dPduN;\n  vector DdPdv = dPdvN;\n\n  vector step = DdPdu^DdPdv;\n\n  /*where it all happens*/\n  for(i=1;i<numsteps;i=i+1){\n    P -= vtransform(\"object\",\"current\",step)*nz*stepsize;\n    DdPdu = normalize(DdPdu+(step*chu));\n    DdPdv = normalize(DdPdv+(step*chv));\n    step = DdPdu^DdPdv;\n  }\n\n  /* wash your hands after displacing P*/\n  N = normalize(calculatenormal(P));\n}\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_gloop.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_gloop\">\n\t\t\t<argument name=\"freq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"magnitude\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.05\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_ridged_multifractal.sl",
    "content": "/*********************************\n *AUTHOR: Ken Musgrave.\n *    Conversion to Shading Language and minor modifications by Fredrik Brnnbacka.\n *\n *\n * REFERENCES:\n *    _Texturing and Modeling: A Procedural Approach_, by David S. Ebert, ed.,\n *    F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, and Steven Worley.\n *    Academic Press, 1998.  ISBN 0-12-228730-4.\n *\n *********************************/\n#include \"k3d_noises.h\"\n\ndisplacement\nk3d_ridged_multifractal(float H = 0.8, lacunarity = 2.5, octaves = 7, offset = 0.9, sharpness = 4, threshold = 12, Kt = 0.1)\n{\n\tfloat result, signal, weight, i, exponent;\n\tpoint PP =transform(\"shader\",P);\n\tnormal Nn = normalize(N);\t\n\tfor( i=0; i<octaves; i += 1 ) {\n       \t\t/* First octaves */\n\n       \t\tif ( i == 0) {\n          \t\tsignal = snoise2( PP );\n          \t\tif ( signal < 0.0 ) signal = -signal;\n          \t\tsignal = offset - signal;\n          \t\tsignal = pow( signal, sharpness );\n                             /*This should give you a power function to control\n                             sharpness of the ridges. Or you can just use the\n                             original one -- signal *= signal;*/\n          \t\tresult = signal;\n          \t\tweight = 1.0;\n        \t}else{\n        \t\n          \t\texponent = pow( lacunarity, (-i*H) );\n\t\t\t/*\n          \t\tPP.x *= lacunarity;\n          \t\tPP.y *= lacunarity;\n          \t\tPP.z *= lacunarity;\n\t\t\t*/\n\t\t\tPP = PP * lacunarity;\n          \t\t/* weigh successive contributions by previous signal */\n          \t\tweight = signal * threshold;\n          \t\tweight = clamp(weight,0,1)    ;    \t\t\n          \t\tsignal = snoise2( PP );\n\n          \t\t/* get absolute value of signal*/\n          \t\tsignal = abs(signal);\n\n          \t\t/* invert and translate*/\n          \t\tsignal = offset - signal;\n\n          \t\t/* sharpen the ridge*/\n          \t\tsignal = pow( signal, sharpness ); /* Or signal *= signal;*/\n\n          \t\t/* weight the contribution*/\n          \t\tsignal *= weight;\n          \t\tresult += signal * exponent;\n       \t\t}\n\t}\n\n\tP+= Nn*result*Kt;\n  \tN = calculatenormal(P);\t\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_ridged_multifractal.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_ridged_multifractal\">\n\t\t\t<argument name=\"H\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.8\"/>\n\t\t\t<argument name=\"lacunarity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"2.5\"/>\n\t\t\t<argument name=\"octaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"7\"/>\n\t\t\t<argument name=\"offset\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.9\"/>\n\t\t\t<argument name=\"sharpness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"4\"/>\n\t\t\t<argument name=\"threshold\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"12\"/>\n\t\t\t<argument name=\"Kt\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_round.sl",
    "content": "/* Copyrighted Pixar 1989 */\n/* From the RenderMan Companion p.364 */\n/* Listing 16.23  Displacement shader for bevelling perpendicular bilinear patches*/\n\n/* \n * round(): displace the edge of a bilinear patch so that, if it is placed \n * next to another patch at a right angle, the edge will be rounded.\n */\ndisplacement\nk3d_round (float radius = .10 )\n{\n\tfloat\t uu,\t/* distance in u to the nearest \"vertical\" edge */\n\t\t vv,\t/* distance in v to the nearest \"horizontal\" edge */\n\t\t lu,\t/* \"real\" distance to the nearest \"vertical\" edge */\n\t\t lv;\t/* \"real\" distance to the nearest \"horizontal\" edge */\n\tpoint\t center,/* point toward which the surface is displaced \t*/\n\t\t dpdu,\t/* dPdu pointed toward patch center line \t*/\n\t\t dpdv;\t/* dPdv pointed toward patch center line \t*/\n\n\t/* Find the distance in parameter space from the nearest edge in\n\t   u and in v, and the directions away from those edges. */\n\tif (u < .5) {\n\t\tuu = u;\n\t\tdpdu = dPdu;\n\t} else {\n\t\tuu = 1 - u;\n\t\tdpdu = -dPdu;\n\t}\n\tif (v < .5) {\n\t\tvv = v;\n\t\tdpdv = dPdv;\n\t} else {\n\t\tvv = 1 - v;\n\t\tdpdv = -dPdv;\n\t}\n\n\t/* Find the distances from the edges in the current space. */\n\tlu = length(dPdu*uu);\n\tlv = length(dPdv*vv);\n\n\tif (lu < radius || lv < radius) {\t/* only if within radius of \n\t                                                     an edge...  */\n\t/*\n\t * Find the point towards which the surface  point will be \n\t *  moved. This center is on the center line of a cylinder, if we \n\t *  are not near the corner of the patch, or is the center of a \n\t *  sphere, if we are. We move `center' to the nearest inflection \n\t *  edge along u and/or v.\n\t */\n\t\tcenter = point(0,0,0);\n\t\tif (lu < radius)\n\t\t\tcenter = (radius-lu) * normalize(dpdu);\n\t\tif (lv < radius)\n\t\t\tcenter += (radius-lv) * normalize(dpdv);\n\t\t/* Move center perpendicular to the surface */\n\t\tcenter += P - radius*normalize(N);\n\t\t/* Make P be distance 'radius' along the line \n                 * from 'center' to P */\n\t\tP = center + radius*normalize( P-center );\n\t}\n\tN = calculatenormal(P);\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_round.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_round\">\n\t\t\t<argument name=\"radius\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".10\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_slateroofd.sl",
    "content": "/* Renamed to PQslateroofd.sl for RMR -- talrmr@SpamSucks_pacbell.net */\n\n/*\n  slateroofd.sl - a displacement shader to produce tiles on a roof\n  \n \n    \tParameters:\n \n    \tKm: Maximum displacement of tiles;\n    \tsfreq: number of tiles on the s direction\n    \ttfreq: number of tiles in the t direction\n \t\tmaxadd: the maximum amount of overlap of one tile and another\n \t\tramp: the amount of a tile used for the initial rise to the maximum height\n \t\t\ta value between 0 and 1\n \t\tgap: the size of the gap between one tile and the next in the s direction,\n \t\t\tmeasured as a proportion of the tile (so the value of gap must lie between 0 \n \t\tand 1)\n \t\tfactor: a seed used for adjusting the randomness - if you have two roofs with\n \t\t\tthe same sfreq, tfreq change the value of factor to ensure they have a \n \t\t\tdifferent random patterning. A value > 20 works best\n \t\n \t\tDescription\n \n\t\tThis routine produces a random tiled effect. In the s direction the\n\t\ttiles are regular, with every other row offset by half a tile width, as\n\t\tnormal roof tiles would be. Each tile is expanded by a random amount in\n\t\tthe t direction so that it overlaps the tile 'below' it. No randomness\n\t\tis incorporated in the s direction, which remains regular. The routine\n\t\tfirst determines the dimensions of the current tile, and then works out\n\t\tthe surface displacement according to a simple formula: a sharp ridge at\n\t\tthe bottom of the tile, gaps to either side and the whole tile gently\n\t\tsloping towards zero at the top of the tile. It then looks to see if the\n\t\tpoint we are considering is actually in the zone of overlap with the\n\t\ttile 'above' the current one. If it is we replace the displacement we are\n\t\tconsidering with one calculated for the tile above, being a little\n\t\tcareful to ensure there are no sudden jumps in displacement.\n\n\t\tPeter Quint 17/11/2000\n \n */\n\n\n displacement\nk3d_slateroofd(  float \tKm = 1.0,\n                   \tsfreq = 10,\n                   \ttfreq = 10,\n\t\t\t\t\t\t\tmaxadd = .5,\n\t\t\t\t\t\t\tramp = .1,\n\t\t\t\t\t\t\tgap = .05,\n\t\t\t\t\t\t\tfactor = 22.838)\n/* sfreq and tfreq must not be below 3 */\t\t\t\t   \n\n{\n   uniform float swidth = 1 / sfreq, \t\t/* Tile width in the s directio */\n                 twidth = 1 / tfreq, \t\t/* ditto for the t direction */\n                 offset = swidth / 2;\t\t/* the amount by which alternate rows are offset */\n   float scoord = s, tcoord = 1 - t; \t\t/* re map the t coord so that the coving is at the top */\n   float stile, ttile, \t\t\t\t\t\t\t/* An integer identifying the current tile */\n\t\t\ts_offset, t_offset, \t\t\t\t\t/* Offsets withing the current tile, between 0, 1 */\n\t\t\tnewstile, newscoord, \t\t\t\t/* Used in calculations to identify an overlapping tile */\n\t\t\tcs, ct; \t\t\t\t\t\t\t\t\t/* Coordinates set to the centre of the tile and fed into the noise function */\n   float add,\t \t\t\t\t\t\t\t\t\t/* Add, between 0 and 1, hold the amount the current tile overlaps the next */\n\t\t\tnews_offset, \n\t\t\tdisps, dispt, disp, dispo,      \t/* Displacements - s direction, t direction, final displacement, and \n\t\t\t\t\t\t\t\t\t\t \t\t\t\t \tdisplacement for the non-overlapping tile */\n\t\t\ttemp_s_offset, \n\t\t\ttemp_t_offset, newadd;\t\t\t \n\t\t   \n\tnormal Nf = normalize(N);\n\tfloat spacescale = length(vtransform(\"shader\", Nf));\n   vector Ndisp = Nf * (1 / max(spacescale,1e-6));\n\t\n   \n\n\n\t/* Work out which tile we are in, and the offset within that tile */\n   ttile = tcoord / twidth;\n\tif (mod(ttile,2) >= 1)\n      scoord = scoord + offset; /* Displace alternate rows */\n   stile = scoord / swidth;\n   s_offset = stile - floor(stile);\n   t_offset = ttile - floor(ttile);\n   stile = floor(stile);\n   ttile = floor(ttile);\n\n\t/* Work out the displacement assuming the point is in the \n   \tcurrent tile */\n\n\tif (ttile < tfreq - 1)\n\t\t{\n   \t/* the noise function is always taken at the same point in the tile \n   \t\tnormally the center, except in the short tiles which lie at the\n\t\t\tstart and end of an offset row, where the middle of the left side \n\t\t\tof the tile is used */\n   \t\tct = ttile + .5;\n   \t\tcs = stile + .5;\n   \t\tif ((mod(ct,2) >= 1)  && ((stile == 0) || (stile == sfreq)))\n\t\t\t/* An offset row, so we must deal with the half tiles */\n\t\t\t\tcs = stile;\n   \t\tadd = noise(cs * factor, ct * factor) * maxadd;\n \t\t}\n\telse\n \t\t/* the very bottom row cannot expand */\n\t\tadd = 0;\n\t/* now calculate the displacement */\n\ttemp_t_offset = t_offset / (1 + add); \n\t/* the above adjusts t_offset so that it runs from 0 to 1 within the expanded tile */\n   if (1 - temp_t_offset <= ramp / (1 + add))\n\t\tdispt = Km / 2 + smoothstep(0, ramp / (1 + add), (1 - temp_t_offset)) * Km / 2;\n\telse\n\t   dispt = Km / 2 + smoothstep( 0, 1 - ramp /(1 + add), temp_t_offset) * Km / 2;\n\tif (s_offset > .5)\n\t   temp_s_offset = 1 - s_offset;\n\telse\n\t\ttemp_s_offset = s_offset;\n\tif (temp_s_offset < gap * (1 + add))\n\t   disps = smoothstep(0, gap * (1 + add), temp_s_offset) * Km;\n\telse\n     \tdisps = Km;\n\tdispo = min(disps, dispt);\n\tdisp = dispo;\n\t\t   \n\n\t/* Work out whether the point is in fact in another tile \t\n\t\tstoring the new tile in stile, ttile and new offset\n\t\tin s_offset, t_offset */\n\tif ((t_offset <= maxadd) && (ttile >= 1))\n\t\t{\n\t\t\t/* the point might be in another tile */\n\t\t\tif (mod(ttile,2) >= 1)\n\t\t\t\t/* We are in an offset tile row adjust the scoord appropriately for\n\t\t \t\t\tthe row below */\n\t\t\t\tnewscoord = scoord - offset;\n\t\t\telse\n\t\t\t\tnewscoord = scoord + offset;\n\t\t\tnewstile = newscoord / swidth;\n\t\t\tnews_offset = newstile - floor(newstile);\n\t\t\tnewstile = floor(newstile);\n\t\t\t/* Now calculate cs, ct the reference point for the noise calculation */\t\t\t\t\t\n\t\t\tct = ttile - .5;\n\t\t\tcs = newstile + .5;\n\t\t\tif ((mod(ct,2) >= 1) && ((newstile == 0) || (newstile == sfreq)))\n\t\t\t\t/* An offset row, so we must deal with the half tiles */\n\t\t\t\tcs = newstile;\n\t\t\tnewadd = noise(cs * factor, ct * factor) * maxadd;\n\t\t\tif (t_offset <= newadd)\n\t\t\t/* if t_offset <= newadd we are actually in the overlapping tile */\n\t\t\t\t{\n\t\t\t\t\t/* set parameters to overlapping tile */\n\t\t\t\t\tttile = ttile - 1;\n\t\t\t\t\tstile = newstile;\n\t\t\t\t\tt_offset = t_offset + 1;\n\t\t\t\t\ts_offset = news_offset;\n\t\t\t\t\tadd = newadd;\n\t\t\t\t}\n\t\t\t/* calculate the displacement again */\n\t\t\tt_offset = t_offset / (1 + add); \n\t\t\tif (1 - t_offset <= ramp / (1 + add))\n\t\t\t\t{\n\t\t\t\t\tdispt = Km / 2 + smoothstep(0, ramp / (1 + add), (1 - t_offset)) * Km / 2;\n\t\t\t\t}\n\t\t\telse\n\t\t\t\tdispt = Km / 2 +  smoothstep( 0, 1 - ramp, t_offset) * Km / 2;\n\t\t\tif (s_offset > .5)\n\t\t\t\ts_offset = 1 - s_offset;\n\t\t\tif (s_offset < gap / (1 + add))\n\t\t\t\tdisps = Km * smoothstep(0, gap / (1 + add), s_offset);\n\t\t\telse\n\t\t\t\tdisps = Km;\n\t\t\tdisp = min(disps, dispt);\n\t\t\tdisp = max(dispo,disp);\n\t\t\t/* taking the maximum of dispo, disp ensures that there\n   \t\t\tare no discontinuities */\n\n\t\t}\n\tP += Nf * (disp / max(spacescale, 1e-6));\n\t/*printf(\"disp = %f\\n\",disp);*/\n   N = calculatenormal(P);\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_slateroofd.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_slateroofd\">\n\t\t\t<argument name=\"Km\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.0\"/>\n\t\t\t<argument name=\"sfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"10\"/>\n\t\t\t<argument name=\"tfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"10\"/>\n\t\t\t<argument name=\"maxadd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"ramp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"gap\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".05\"/>\n\t\t\t<argument name=\"factor\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"22.838\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_square_ridges.sl",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n/// Filtering code courtesy of the Advanced RenderMan book ... where else?\n\n#define MIN_FILTER_WIDTH 1.0e-6\n#define filter_width(x) max(abs(Du(x)*du) + abs(Dv(x)*dv), MIN_FILTER_WIDTH)\n\n/*\nfloat pulse(float edge0, edge1, x)\n{\n\treturn step(edge0, x) - step(edge1, x);\n}\n\nfloat pulse_train(float edge, period, x)\n{\n\treturn pulse(edge, period, mod(x, period));\n}\n*/\n\nfloat filtered_pulse_train(float edge, period, x, dx)\n{\n\tfloat w = dx / period;\n\tfloat x0 = x/period - w/2;\n\tfloat x1 = x0 + w;\n\tfloat nedge = edge / period;\n\t\n\tfloat integral(float t)\n\t{\n\t\textern float nedge;\n\t\treturn ((1 - nedge) * floor(t) + max(0, t-floor(t)-nedge));\n\t}\n\t\n\treturn (integral(x1) - integral(x0)) / w;\n}\n\ndisplacement k3d_square_ridges(\n\tfloat Km = 1.0;\n\tfloat Frequency = 8.0;\n\tfloat Offset = 0.25;\n\t)\n{\n\tfloat ridge_position = filtered_pulse_train(0.5 / Frequency, 1.0 / Frequency, t + (Offset / Frequency), filter_width(t));\n//\tfloat ridge_position = pulse_train(0.5 / Frequency, 1.0 / Frequency, u, filter_width(u));\n\n\tvector Nn = normalize(N);\n\tP += Nn * ((Km * ridge_position) / length(vtransform(\"shader\", Nn)));\n//\tP += Km * ridge_position * N;\n\tN = calculatenormal(P);\n}\n\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_square_ridges.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_square_ridges\">\n\t\t\t<description></description>\n\t\t\t<authors>Timothy M. Shead</authors>\n\t\t\t<copyright>Copyright (c) 1995-2004, Timothy M. Shead</copyright>\n\t\t\t<argument name=\"Km\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Frequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"6\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_stucco.sl",
    "content": "/*\n * stucco.sl -- displacement shader for stucco\n *\n * DESCRIPTION:\n *   Displacees a surface to make it look like stucco.\n * \n * PARAMETERS:\n *   Km \t   \tthe amplitude of the stucco pimples\n *   power\t   \tcontrols the shape of the pimples\n *   frequency  \tthe frequency of the pimples\n *\n *\n * AUTHOR: written by Larry Gritz (lg@bmrt.org)\n *\n */\n\ndisplacement k3d_stucco(float Km = 0.05, power = 5, frequency = 10;)\n{\n  float magnitude;\n  point PP;\n\n  PP = transform(\"shader\", P);\n  magnitude = Km * pow(noise(PP * frequency), power);\n  P += magnitude * normalize(N);\n  N = calculatenormal(P);\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_stucco.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_stucco\">\n\t\t\t<description>Displacement shader for stucco</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Km\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.05\"/>\n\t\t\t<argument name=\"power\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"5\"/>\n\t\t\t<argument name=\"frequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"10\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_terranbump.sl",
    "content": "\n#include \"k3d_noises.h\" \n\n\n#define N_OFFSET 0.7\n#define VERY_SMALL 0.0001\n\n\n\ndisplacement k3d_terranbump(float spectral_exp = 0.5;\n\t\t\t    float lacunarity = 2, octaves = 7;\n\t\t\t    float bump_scale = 0.04; float multifractal = 0;\n\t\t\t    float dist_scale = .2; float offset = 0;\n\t\t\t    float sea_level = 0;)\n{\n  float chaos;\n  point Ptexture, tp;\n  float l, o, a, i, weight;\t/* Loop variables for fBm calc */\n  float bumpy;\n\n  /* Do all shading in shader space */\n  Ptexture = transform(\"shader\", P);\n\n  if(multifractal == 0)\n    {\t\t\t\t/* use a \"standard\" fBm bump function */\n      o = 1;\n      l = 1;\n      bumpy = 0;\n      for(i = 0; i < octaves; i += 1)\n\t{\n\t  bumpy += o * snoise(l * Ptexture);\n\t  l *= lacunarity;\n\t  o *= spectral_exp;\n\t}\n    }\n  else\n    {\t\t\t\t/* use a \"multifractal\" fBm bump function */\n      /* get \"distortion\" vector, as used with clouds */\n      Ptexture += dist_scale * DNoise(Ptexture);\n      /* compute bump vector using MfBm with displaced point */\n      o = spectral_exp;\n      tp = Ptexture;\n      weight = abs(VLNoise(tp, 1.5));\n      bumpy = weight * snoise(tp);\n      for(i = 1; i < octaves && weight >= VERY_SMALL; i += 1)\n\t{\n\t  tp *= lacunarity;\n\t  /* get subsequent values, weighted by previous value */\n\t  weight *= o * (N_OFFSET + snoise(tp));\n\t  weight = clamp(abs(weight), 0, 1);\n\t  bumpy += snoise(tp) * min(weight, spectral_exp);\n\t  o *= spectral_exp;\n\t}\n    }\n\n  /* get the \"height\" of the bump, displacing by offset */\n  chaos = bumpy + offset;\n\n  /* set bump for land masses (i.e., areas above \"sea level\") */\n  if(chaos > sea_level)\n    P += (bump_scale * bumpy) * normalize(Ng);\n\n  /* Recalculate the surface normal (this is where all the real magic is!) */\n  N = calculatenormal(P);\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_terranbump.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_terranbump\">\n\t\t\t<description>An Earth-like planet displacement</description>\n\t\t\t<authors>Key Musgrave</authors>\n\t\t\t<argument name=\"spectral_exp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"lacunarity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"2\"/>\n\t\t\t<argument name=\"octaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"7\"/>\n\t\t\t<argument name=\"bump_scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.04\"/>\n\t\t\t<argument name=\"multifractal\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"dist_scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".2\"/>\n\t\t\t<argument name=\"offset\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"sea_level\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_threads.sl",
    "content": "/* Copyrighted Pixar 1989 */\n/* From the RenderMan Companion p.367 */\n/* Listing 16.24  Displacement shader providing light-bulb threads to cylinder */\n\n/*\n * threads(): wrap threads around a cylinder \n */\ndisplacement \nk3d_threads ( \n\tfloat   Km\t\t=  .1,\n\t\tfrequency\t= 5.0,\n\t\tphase\t\t=  .0,\n\t\toffset\t\t=  .0,\n\t\tdampzone\t=  .05 )\n{\n\tfloat magnitude;\n \n\t/* Calculate the undamped displacement */\n\tmagnitude = (sin( PI*2*(t*frequency + s + phase))+offset) * Km;\n\n\t/* Damp the displacement to 0 at each end */\n\tif( t > (1-dampzone)) \n\t\tmagnitude *= (1.0-t) / dampzone;\n\telse if( t < dampzone )\n\t\tmagnitude *= t / dampzone;\n\n\t/* Do the displacement */\n\tP += normalize(N) * magnitude;\n\tN = calculatenormal(P);\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_threads.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_threads\">\n\t\t\t<argument name=\"Km\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"frequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"5.0\"/>\n\t\t\t<argument name=\"phase\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".0\"/>\n\t\t\t<argument name=\"offset\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".0\"/>\n\t\t\t<argument name=\"dampzone\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".05\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_windywave.sl",
    "content": "#include \"k3d_noises.h\"\n\ndisplacement k3d_windywave(float Km = 0.1; float txtscale = 1;\n\t\t\t   float windfreq = 0.5; float windamp = 1;\n\t\t\t   float minwind = 0.3)\n{\n  float offset;\n  point PP;\n  float wind;\n  float turb, a, i;\n\n  PP = txtscale * windfreq * transform(\"shader\", P);\n\n  offset = Km * (snoise(PP) + 0.5 * snoise(2 * PP));\n\n  turb = 0;\n  a = 1;\n  PP *= 8;\n  for(i = 0; i < 4; i += 1)\n    {\n      turb += abs(a * snoise(PP));\n      PP *= 2;\n      a /= 2;\n    }\n  wind = minwind + windamp * turb;\n\n/*  P += wind * offset * normalize(N); */\n  N = calculatenormal(P + wind * offset * normalize(N));\n}\n"
  },
  {
    "path": "share/k3d/shaders/displacement/k3d_windywave.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"displacement\" name=\"k3d_windywave\">\n\t\t\t<description>Displacement shader for wave with small wind-ripples</description>\n\t\t\t<authors>F. Kenton Musgrave, Larry Gritz</authors>\n\t\t\t<argument name=\"Km\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"windfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"windamp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"minwind\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.3\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/glsl/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.glsl k3d/shaders/glsl)\n\n"
  },
  {
    "path": "share/k3d/shaders/glsl/gooch_fragment.glsl",
    "content": "varying float NdotL;\nvarying vec3 ReflectVec;\nvarying vec3 ViewVec;\n\nvoid main()\n{\n\tconst vec3 SurfaceColor = vec3(0.75, 0.75, 0.75);\n\tconst vec3 WarmColor = vec3(0.6, 0.6, 0.0);\n\tconst vec3 CoolColor = vec3(0.0, 0.0, 0.6);\n\tconst float DiffuseWarm = 0.45;\n\tconst float DiffuseCool = 0.45;\n\n\tvec3 kcool = min(CoolColor + DiffuseCool * SurfaceColor, 1.0);\n\tvec3 kwarm = min(WarmColor + DiffuseWarm * SurfaceColor, 1.0);\n\tvec3 kfinal = mix(kcool, kwarm, NdotL);\n\tvec3 nreflect = normalize(ReflectVec);\n\tvec3 nview = normalize(ViewVec);\n\tfloat spec = max(dot(nreflect, nview), 0.0);\n\tspec = pow(spec, 32.0);\n\tgl_FragColor = vec4(min(kfinal + spec, 1.0), 1.0);\n}\n"
  },
  {
    "path": "share/k3d/shaders/glsl/gooch_vertex.glsl",
    "content": "varying float NdotL;\nvarying vec3 ReflectVec;\nvarying vec3 ViewVec;\n\nvoid main()\n{\n\tconst vec3 LightPosition = vec3(0.0, 10.0, 4.0);\n\n\tvec3 ecPos = vec3(gl_ModelViewMatrix * gl_Vertex);\n\tvec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);\n\tvec3 lightVec = normalize(LightPosition - ecPos);\n\tReflectVec = normalize(reflect(-lightVec, tnorm));\n\tViewVec = normalize(-ecPos);\n\tNdotL = (dot(lightVec, tnorm) + 1.0) * 0.5;\n\tgl_Position = ftransform();\n}\n"
  },
  {
    "path": "share/k3d/shaders/glsl/show_normals_fragment.glsl",
    "content": "varying vec3 normal;\n\nvoid main (void)\n{\n\tgl_FragColor = vec4(normal, 1.0);\n}\n"
  },
  {
    "path": "share/k3d/shaders/glsl/show_normals_vertex.glsl",
    "content": "varying vec3 normal;\n\nvoid main(void)\n{\n\tnormal = gl_Normal;\n\tgl_Position = ftransform();\n}\n"
  },
  {
    "path": "share/k3d/shaders/imager/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.sl k3d/shaders/imager)\nK3D_ADD_SHARE_FILES(*.slmeta k3d/shaders/imager)\n\n"
  },
  {
    "path": "share/k3d/shaders/imager/k3d_background.sl",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n/// Simplified from the original by Larry Gritz\n\nimager k3d_background(color bgcolor = color(1, 1, 1))\n{\n  Ci += (1 - alpha) * bgcolor;\n  Oi = 1;\n  alpha = 1;\n}\n"
  },
  {
    "path": "share/k3d/shaders/imager/k3d_background.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"imager\" name=\"k3d_background\">\n\t\t\t<description>Imager shader to put a solid background color behind an image</description>\n\t\t\t<authors>Timothy M. Shead</authors>\n\t\t\t<argument name=\"bgcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/imager/k3d_bluescreen.sl",
    "content": "/*\n * bluescreen.sl\n *   puts a background color behind an image.\n *\n * PARAMETERS:\n *   background - the color of the background\n */\n\nimager k3d_bluescreen (\n\ncolor background = color(0.0, 0.0, 1.0); \nstring texturename = \"\"\n)\n{\nfloat resolution[3];\nfloat lenx, leny;\ncolor tex;\n\n    if (option(\"Format\", resolution) == 1.0) {\n       lenx = xcomp(P)/ resolution[0];\n       leny = ycomp(P)/ resolution[1];\n    }\n\n    if (texturename != \"\") {\n\ttex = texture(texturename, lenx, leny);\n\tCi+=(1-alpha)*  tex;\n    }\n    else\n       Ci+=(1-alpha)*background;\n    Oi=1;\n}\n"
  },
  {
    "path": "share/k3d/shaders/imager/k3d_bluescreen.sl.slmeta",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<shaders>\n\t\t<shader type=\"imager\" name=\"k3d_bluescreen\">\n\t\t\t<description/>\n\t\t\t<authors/>\n\t\t\t<copyright/>\n\t\t\t<argument name=\"background\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0 0 1\"/>\n\t\t\t<argument name=\"texturename\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/imager/k3d_clamptoalpha.sl",
    "content": "/*\n * clamptoalpha.sl -- imager shader that forces Ci to be non-negative\n *    and with each component to greater than the alpha value of the\n *    pixel.\n */\n\nimager\nk3d_clamptoalpha()\n{\n  Ci = clamp(Ci, color(0, 0, 0), color(alpha, alpha, alpha));\n}\n"
  },
  {
    "path": "share/k3d/shaders/imager/k3d_clamptoalpha.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"imager\" name=\"k3d_clamptoalpha\">\n\t\t\t<description>Forces Ci to be non-negative with all components greater than the alpha default_value of a pixel</description>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/k3d_colors.h",
    "content": "/* k3d_colors.h\n * 2006-03-13 dan@3-e.net\n * based on X windows color and web standard colors\n * added /255 to each value as a quick convert of original values of 0-255 to 0-1\n * need to fix this\n */\n\n#define\tsnow\tcolor (255/255, 250/255, 250/255)\n#define\tghost_white\tcolor (248/255, 248/255, 255/255)\n#define\tGhostWhite\tcolor (248/255, 248/255, 255/255)\n#define\twhite_smoke\tcolor (245/255, 245/255, 245/255)\n#define\tWhiteSmoke\tcolor (245/255, 245/255, 245/255)\n#define\tgainsboro\tcolor (220/255, 220/255, 220/255)\n#define\tfloral_white\tcolor (255/255, 250/255, 240/255)\n#define\tFloralWhite\tcolor (255/255, 250/255, 240/255)\n#define\told_lace\tcolor (253/255, 245/255, 230/255)\n#define\tOldLace\tcolor (253/255, 245/255, 230/255)\n#define\tlinen\tcolor (250/255, 240/255, 230/255)\n#define\tantique_white\tcolor (250/255, 235/255, 215/255)\n#define\tAntiqueWhite\tcolor (250/255, 235/255, 215/255)\n#define\tpapaya_whip\tcolor (255/255, 239/255, 213/255)\n#define\tPapayaWhip\tcolor (255/255, 239/255, 213/255)\n#define\tblanched_almond\tcolor (255/255, 235/255, 205/255)\n#define\tBlanchedAlmond\tcolor (255/255, 235/255, 205/255)\n#define\tbisque\tcolor (255/255, 228/255, 196/255)\n#define\tpeach_puff\tcolor (255/255, 218/255, 185/255)\n#define\tPeachPuff\tcolor (255/255, 218/255, 185/255)\n#define\tnavajo_white\tcolor (255/255, 222/255, 173/255)\n#define\tNavajoWhite\tcolor (255/255, 222/255, 173/255)\n#define\tmoccasin\tcolor (255/255, 228/255, 181/255)\n#define\tcornsilk\tcolor (255/255, 248/255, 220/255)\n#define\tivory\tcolor (255/255, 255/255, 240/255)\n#define\tlemon_chiffon\tcolor (255/255, 250/255, 205/255)\n#define\tLemonChiffon\tcolor (255/255, 250/255, 205/255)\n#define\tseashell\tcolor (255/255, 245/255, 238/255)\n#define\thoneydew\tcolor (240/255, 255/255, 240/255)\n#define\tmint_cream\tcolor (245/255, 255/255, 250/255)\n#define\tMintCream\tcolor (245/255, 255/255, 250/255)\n#define\tazure\tcolor (240/255, 255/255, 255/255)\n#define\talice_blue\tcolor (240/255, 248/255, 255/255)\n#define\tAliceBlue\tcolor (240/255, 248/255, 255/255)\n#define\tlavender\tcolor (230/255, 230/255, 250/255)\n#define\tlavender_blush\tcolor (255/255, 240/255, 245/255)\n#define\tLavenderBlush\tcolor (255/255, 240/255, 245/255)\n#define\tmisty_rose\tcolor (255/255, 228/255, 225/255)\n#define\tMistyRose\tcolor (255/255, 228/255, 225/255)\n#define\twhite\tcolor (255/255, 255/255, 255/255)\n#define\tblack\tcolor (0/255, 0/255, 0/255)\n#define\tdark_slate_gray\tcolor (47/255, 79/255, 79/255)\n#define\tDarkSlateGray\tcolor (47/255, 79/255, 79/255)\n#define\tdark_slate_grey\tcolor (47/255, 79/255, 79/255)\n#define\tDarkSlateGrey\tcolor (47/255, 79/255, 79/255)\n#define\tdim_gray\tcolor (105/255, 105/255, 105/255)\n#define\tDimGray\tcolor (105/255, 105/255, 105/255)\n#define\tdim_grey\tcolor (105/255, 105/255, 105/255)\n#define\tDimGrey\tcolor (105/255, 105/255, 105/255)\n#define\tslate_gray\tcolor (112/255, 128/255, 144/255)\n#define\tSlateGray\tcolor (112/255, 128/255, 144/255)\n#define\tslate_grey\tcolor (112/255, 128/255, 144/255)\n#define\tSlateGrey\tcolor (112/255, 128/255, 144/255)\n#define\tlight_slate_gray\tcolor (119/255, 136/255, 153/255)\n#define\tLightSlateGray\tcolor (119/255, 136/255, 153/255)\n#define\tlight_slate_grey\tcolor (119/255, 136/255, 153/255)\n#define\tLightSlateGrey\tcolor (119/255, 136/255, 153/255)\n#define\tgray\tcolor (190/255, 190/255, 190/255)\n#define\tgrey\tcolor (190/255, 190/255, 190/255)\n#define\tlight_grey\tcolor (211/255, 211/255, 211/255)\n#define\tLightGrey\tcolor (211/255, 211/255, 211/255)\n#define\tlight_gray\tcolor (211/255, 211/255, 211/255)\n#define\tLightGray\tcolor (211/255, 211/255, 211/255)\n#define\tmidnight_blue\tcolor (25/255, 25/255, 112/255)\n#define\tMidnightBlue\tcolor (25/255, 25/255, 112/255)\n#define\tnavy\tcolor (0/255, 0/255, 128/255)\n#define\tnavy_blue\tcolor (0/255, 0/255, 128/255)\n#define\tNavyBlue\tcolor (0/255, 0/255, 128/255)\n#define\tcornflower_blue\tcolor (100/255, 149/255, 237/255)\n#define\tCornflowerBlue\tcolor (100/255, 149/255, 237/255)\n#define\tdark_slate_blue\tcolor (72/255, 61/255, 139/255)\n#define\tDarkSlateBlue\tcolor (72/255, 61/255, 139/255)\n#define\tslate_blue\tcolor (106/255, 90/255, 205/255)\n#define\tSlateBlue\tcolor (106/255, 90/255, 205/255)\n#define\tmedium_slate_blue\tcolor (123/255, 104/255, 238/255)\n#define\tMediumSlateBlue\tcolor (123/255, 104/255, 238/255)\n#define\tlight_slate_blue\tcolor (132/255, 112/255, 255/255)\n#define\tLightSlateBlue\tcolor (132/255, 112/255, 255/255)\n#define\tmedium_blue\tcolor (0/255, 0/255, 205/255)\n#define\tMediumBlue\tcolor (0/255, 0/255, 205/255)\n#define\troyal_blue\tcolor (65/255, 105/255, 225/255)\n#define\tRoyalBlue\tcolor (65/255, 105/255, 225/255)\n#define\tblue\tcolor (0/255, 0/255, 255/255)\n#define\tdodger_blue\tcolor (30/255, 144/255, 255/255)\n#define\tDodgerBlue\tcolor (30/255, 144/255, 255/255)\n#define\tdeep_sky_blue\tcolor (0/255, 191/255, 255/255)\n#define\tDeepSkyBlue\tcolor (0/255, 191/255, 255/255)\n#define\tsky_blue\tcolor (135/255, 206/255, 235/255)\n#define\tSkyBlue\tcolor (135/255, 206/255, 235/255)\n#define\tlight_sky_blue\tcolor (135/255, 206/255, 250/255)\n#define\tLightSkyBlue\tcolor (135/255, 206/255, 250/255)\n#define\tsteel_blue\tcolor (70/255, 130/255, 180/255)\n#define\tSteelBlue\tcolor (70/255, 130/255, 180/255)\n#define\tlight_steel_blue\tcolor (176/255, 196/255, 222/255)\n#define\tLightSteelBlue\tcolor (176/255, 196/255, 222/255)\n#define\tlight_blue\tcolor (173/255, 216/255, 230/255)\n#define\tLightBlue\tcolor (173/255, 216/255, 230/255)\n#define\tpowder_blue\tcolor (176/255, 224/255, 230/255)\n#define\tPowderBlue\tcolor (176/255, 224/255, 230/255)\n#define\tpale_turquoise\tcolor (175/255, 238/255, 238/255)\n#define\tPaleTurquoise\tcolor (175/255, 238/255, 238/255)\n#define\tdark_turquoise\tcolor (0/255, 206/255, 209/255)\n#define\tDarkTurquoise\tcolor (0/255, 206/255, 209/255)\n#define\tmedium_turquoise\tcolor (72/255, 209/255, 204/255)\n#define\tMediumTurquoise\tcolor (72/255, 209/255, 204/255)\n#define\tturquoise\tcolor (64/255, 224/255, 208/255)\n#define\tcyan\tcolor (0/255, 255/255, 255/255)\n#define\tlight_cyan\tcolor (224/255, 255/255, 255/255)\n#define\tLightCyan\tcolor (224/255, 255/255, 255/255)\n#define\tcadet_blue\tcolor (95/255, 158/255, 160/255)\n#define\tCadetBlue\tcolor (95/255, 158/255, 160/255)\n#define\tmedium_aquamarine\tcolor (102/255, 205/255, 170/255)\n#define\tMediumAquamarine\tcolor (102/255, 205/255, 170/255)\n#define\taquamarine\tcolor (127/255, 255/255, 212/255)\n#define\tdark_green\tcolor (0/255, 100/255, 0/255)\n#define\tDarkGreen\tcolor (0/255, 100/255, 0/255)\n#define\tdark_olive_green\tcolor (85/255, 107/255, 47/255)\n#define\tDarkOliveGreen\tcolor (85/255, 107/255, 47/255)\n#define\tdark_sea_green\tcolor (143/255, 188/255, 143/255)\n#define\tDarkSeaGreen\tcolor (143/255, 188/255, 143/255)\n#define\tsea_green\tcolor (46/255, 139/255, 87/255)\n#define\tSeaGreen\tcolor (46/255, 139/255, 87/255)\n#define\tmedium_sea_green\tcolor (60/255, 179/255, 113/255)\n#define\tMediumSeaGreen\tcolor (60/255, 179/255, 113/255)\n#define\tlight_sea_green\tcolor (32/255, 178/255, 170/255)\n#define\tLightSeaGreen\tcolor (32/255, 178/255, 170/255)\n#define\tpale_green\tcolor (152/255, 251/255, 152/255)\n#define\tPaleGreen\tcolor (152/255, 251/255, 152/255)\n#define\tspring_green\tcolor (0/255, 255/255, 127/255)\n#define\tSpringGreen\tcolor (0/255, 255/255, 127/255)\n#define\tlawn_green\tcolor (124/255, 252/255, 0/255)\n#define\tLawnGreen\tcolor (124/255, 252/255, 0/255)\n#define\tgreen\tcolor (0/255, 255/255, 0/255)\n#define\tchartreuse\tcolor (127/255, 255/255, 0/255)\n#define\tmedium_spring_green\tcolor (0/255, 250/255, 154/255)\n#define\tMediumSpringGreen\tcolor (0/255, 250/255, 154/255)\n#define\tgreen_yellow\tcolor (173/255, 255/255, 47/255)\n#define\tGreenYellow\tcolor (173/255, 255/255, 47/255)\n#define\tlime_green\tcolor (50/255, 205/255, 50/255)\n#define\tLimeGreen\tcolor (50/255, 205/255, 50/255)\n#define\tyellow_green\tcolor (154/255, 205/255, 50/255)\n#define\tYellowGreen\tcolor (154/255, 205/255, 50/255)\n#define\tforest_green\tcolor (34/255, 139/255, 34/255)\n#define\tForestGreen\tcolor (34/255, 139/255, 34/255)\n#define\tolive_drab\tcolor (107/255, 142/255, 35/255)\n#define\tOliveDrab\tcolor (107/255, 142/255, 35/255)\n#define\tdark_khaki\tcolor (189/255, 183/255, 107/255)\n#define\tDarkKhaki\tcolor (189/255, 183/255, 107/255)\n#define\tkhaki\tcolor (240/255, 230/255, 140/255)\n#define\tpale_goldenrod\tcolor (238/255, 232/255, 170/255)\n#define\tPaleGoldenrod\tcolor (238/255, 232/255, 170/255)\n#define\tlight_goldenrod_yellow\tcolor (250/255, 250/255, 210/255)\n#define\tLightGoldenrodYellow\tcolor (250/255, 250/255, 210/255)\n#define\tlight_yellow\tcolor (255/255, 255/255, 224/255)\n#define\tLightYellow\tcolor (255/255, 255/255, 224/255)\n#define\tyellow\tcolor (255/255, 255/255, 0/255)\n#define\tgold\tcolor (255/255, 215/255, 0/255)\n#define\tlight_goldenrod\tcolor (238/255, 221/255, 130/255)\n#define\tLightGoldenrod\tcolor (238/255, 221/255, 130/255)\n#define\tgoldenrod\tcolor (218/255, 165/255, 32/255)\n#define\tdark_goldenrod\tcolor (184/255, 134/255, 11/255)\n#define\tDarkGoldenrod\tcolor (184/255, 134/255, 11/255)\n#define\trosy_brown\tcolor (188/255, 143/255, 143/255)\n#define\tRosyBrown\tcolor (188/255, 143/255, 143/255)\n#define\tindian_red\tcolor (205/255, 92/255, 92/255)\n#define\tIndianRed\tcolor (205/255, 92/255, 92/255)\n#define\tsaddle_brown\tcolor (139/255, 69/255, 19/255)\n#define\tSaddleBrown\tcolor (139/255, 69/255, 19/255)\n#define\tsienna\tcolor (160/255, 82/255, 45/255)\n#define\tperu\tcolor (205/255, 133/255, 63/255)\n#define\tburlywood\tcolor (222/255, 184/255, 135/255)\n#define\tbeige\tcolor (245/255, 245/255, 220/255)\n#define\twheat\tcolor (245/255, 222/255, 179/255)\n#define\tsandy_brown\tcolor (244/255, 164/255, 96/255)\n#define\tSandyBrown\tcolor (244/255, 164/255, 96/255)\n#define\ttan\tcolor (210/255, 180/255, 140/255)\n#define\tchocolate\tcolor (210/255, 105/255, 30/255)\n#define\tfirebrick\tcolor (178/255, 34/255, 34/255)\n#define\tbrown\tcolor (165/255, 42/255, 42/255)\n#define\tdark_salmon\tcolor (233/255, 150/255, 122/255)\n#define\tDarkSalmon\tcolor (233/255, 150/255, 122/255)\n#define\tsalmon\tcolor (250/255, 128/255, 114/255)\n#define\tlight_salmon\tcolor (255/255, 160/255, 122/255)\n#define\tLightSalmon\tcolor (255/255, 160/255, 122/255)\n#define\torange\tcolor (255/255, 165/255, 0/255)\n#define\tdark_orange\tcolor (255/255, 140/255, 0/255)\n#define\tDarkOrange\tcolor (255/255, 140/255, 0/255)\n#define\tcoral\tcolor (255/255, 127/255, 80/255)\n#define\tlight_coral\tcolor (240/255, 128/255, 128/255)\n#define\tLightCoral\tcolor (240/255, 128/255, 128/255)\n#define\ttomato\tcolor (255/255, 99/255, 71/255)\n#define\torange_red\tcolor (255/255, 69/255, 0/255)\n#define\tOrangeRed\tcolor (255/255, 69/255, 0/255)\n#define\tred\tcolor (255/255, 0/255, 0/255)\n#define\thot_pink\tcolor (255/255, 105/255, 180/255)\n#define\tHotPink\tcolor (255/255, 105/255, 180/255)\n#define\tdeep_pink\tcolor (255/255, 20/255, 147/255)\n#define\tDeepPink\tcolor (255/255, 20/255, 147/255)\n#define\tpink\tcolor (255/255, 192/255, 203/255)\n#define\tlight_pink\tcolor (255/255, 182/255, 193/255)\n#define\tLightPink\tcolor (255/255, 182/255, 193/255)\n#define\tpale_violet_red\tcolor (219/255, 112/255, 147/255)\n#define\tPaleVioletRed\tcolor (219/255, 112/255, 147/255)\n#define\tmaroon\tcolor (176/255, 48/255, 96/255)\n#define\tmedium_violet_red\tcolor (199/255, 21/255, 133/255)\n#define\tMediumVioletRed\tcolor (199/255, 21/255, 133/255)\n#define\tviolet_red\tcolor (208/255, 32/255, 144/255)\n#define\tVioletRed\tcolor (208/255, 32/255, 144/255)\n#define\tmagenta\tcolor (255/255, 0/255, 255/255)\n#define\tviolet\tcolor (238/255, 130/255, 238/255)\n#define\tplum\tcolor (221/255, 160/255, 221/255)\n#define\torchid\tcolor (218/255, 112/255, 214/255)\n#define\tmedium_orchid\tcolor (186/255, 85/255, 211/255)\n#define\tMediumOrchid\tcolor (186/255, 85/255, 211/255)\n#define\tdark_orchid\tcolor (153/255, 50/255, 204/255)\n#define\tDarkOrchid\tcolor (153/255, 50/255, 204/255)\n#define\tdark_violet\tcolor (148/255, 0/255, 211/255)\n#define\tDarkViolet\tcolor (148/255, 0/255, 211/255)\n#define\tblue_violet\tcolor (138/255, 43/255, 226/255)\n#define\tBlueViolet\tcolor (138/255, 43/255, 226/255)\n#define\tpurple\tcolor (160/255, 32/255, 240/255)\n#define\tmedium_purple\tcolor (147/255, 112/255, 219/255)\n#define\tMediumPurple\tcolor (147/255, 112/255, 219/255)\n#define\tthistle\tcolor (216/255, 191/255, 216/255)\n#define\tsnow1\tcolor (255/255, 250/255, 250/255)\n#define\tsnow2\tcolor (238/255, 233/255, 233/255)\n#define\tsnow3\tcolor (205/255, 201/255, 201/255)\n#define\tsnow4\tcolor (139/255, 137/255, 137/255)\n#define\tseashell1\tcolor (255/255, 245/255, 238/255)\n#define\tseashell2\tcolor (238/255, 229/255, 222/255)\n#define\tseashell3\tcolor (205/255, 197/255, 191/255)\n#define\tseashell4\tcolor (139/255, 134/255, 130/255)\n#define\tAntiqueWhite1\tcolor (255/255, 239/255, 219/255)\n#define\tAntiqueWhite2\tcolor (238/255, 223/255, 204/255)\n#define\tAntiqueWhite3\tcolor (205/255, 192/255, 176/255)\n#define\tAntiqueWhite4\tcolor (139/255, 131/255, 120/255)\n#define\tbisque1\tcolor (255/255, 228/255, 196/255)\n#define\tbisque2\tcolor (238/255, 213/255, 183/255)\n#define\tbisque3\tcolor (205/255, 183/255, 158/255)\n#define\tbisque4\tcolor (139/255, 125/255, 107/255)\n#define\tPeachPuff1\tcolor (255/255, 218/255, 185/255)\n#define\tPeachPuff2\tcolor (238/255, 203/255, 173/255)\n#define\tPeachPuff3\tcolor (205/255, 175/255, 149/255)\n#define\tPeachPuff4\tcolor (139/255, 119/255, 101/255)\n#define\tNavajoWhite1\tcolor (255/255, 222/255, 173/255)\n#define\tNavajoWhite2\tcolor (238/255, 207/255, 161/255)\n#define\tNavajoWhite3\tcolor (205/255, 179/255, 139/255)\n#define\tNavajoWhite4\tcolor (139/255, 121/255, 94/255)\n#define\tLemonChiffon1\tcolor (255/255, 250/255, 205/255)\n#define\tLemonChiffon2\tcolor (238/255, 233/255, 191/255)\n#define\tLemonChiffon3\tcolor (205/255, 201/255, 165/255)\n#define\tLemonChiffon4\tcolor (139/255, 137/255, 112/255)\n#define\tcornsilk1\tcolor (255/255, 248/255, 220/255)\n#define\tcornsilk2\tcolor (238/255, 232/255, 205/255)\n#define\tcornsilk3\tcolor (205/255, 200/255, 177/255)\n#define\tcornsilk4\tcolor (139/255, 136/255, 120/255)\n#define\tivory1\tcolor (255/255, 255/255, 240/255)\n#define\tivory2\tcolor (238/255, 238/255, 224/255)\n#define\tivory3\tcolor (205/255, 205/255, 193/255)\n#define\tivory4\tcolor (139/255, 139/255, 131/255)\n#define\thoneydew1\tcolor (240/255, 255/255, 240/255)\n#define\thoneydew2\tcolor (224/255, 238/255, 224/255)\n#define\thoneydew3\tcolor (193/255, 205/255, 193/255)\n#define\thoneydew4\tcolor (131/255, 139/255, 131/255)\n#define\tLavenderBlush1\tcolor (255/255, 240/255, 245/255)\n#define\tLavenderBlush2\tcolor (238/255, 224/255, 229/255)\n#define\tLavenderBlush3\tcolor (205/255, 193/255, 197/255)\n#define\tLavenderBlush4\tcolor (139/255, 131/255, 134/255)\n#define\tMistyRose1\tcolor (255/255, 228/255, 225/255)\n#define\tMistyRose2\tcolor (238/255, 213/255, 210/255)\n#define\tMistyRose3\tcolor (205/255, 183/255, 181/255)\n#define\tMistyRose4\tcolor (139/255, 125/255, 123/255)\n#define\tazure1\tcolor (240/255, 255/255, 255/255)\n#define\tazure2\tcolor (224/255, 238/255, 238/255)\n#define\tazure3\tcolor (193/255, 205/255, 205/255)\n#define\tazure4\tcolor (131/255, 139/255, 139/255)\n#define\tSlateBlue1\tcolor (131/255, 111/255, 255/255)\n#define\tSlateBlue2\tcolor (122/255, 103/255, 238/255)\n#define\tSlateBlue3\tcolor (105/255, 89/255, 205/255)\n#define\tSlateBlue4\tcolor (71/255, 60/255, 139/255)\n#define\tRoyalBlue1\tcolor (72/255, 118/255, 255/255)\n#define\tRoyalBlue2\tcolor (67/255, 110/255, 238/255)\n#define\tRoyalBlue3\tcolor (58/255, 95/255, 205/255)\n#define\tRoyalBlue4\tcolor (39/255, 64/255, 139/255)\n#define\tblue1\tcolor (0/255, 0/255, 255/255)\n#define\tblue2\tcolor (0/255, 0/255, 238/255)\n#define\tblue3\tcolor (0/255, 0/255, 205/255)\n#define\tblue4\tcolor (0/255, 0/255, 139/255)\n#define\tDodgerBlue1\tcolor (30/255, 144/255, 255/255)\n#define\tDodgerBlue2\tcolor (28/255, 134/255, 238/255)\n#define\tDodgerBlue3\tcolor (24/255, 116/255, 205/255)\n#define\tDodgerBlue4\tcolor (16/255, 78/255, 139/255)\n#define\tSteelBlue1\tcolor (99/255, 184/255, 255/255)\n#define\tSteelBlue2\tcolor (92/255, 172/255, 238/255)\n#define\tSteelBlue3\tcolor (79/255, 148/255, 205/255)\n#define\tSteelBlue4\tcolor (54/255, 100/255, 139/255)\n#define\tDeepSkyBlue1\tcolor (0/255, 191/255, 255/255)\n#define\tDeepSkyBlue2\tcolor (0/255, 178/255, 238/255)\n#define\tDeepSkyBlue3\tcolor (0/255, 154/255, 205/255)\n#define\tDeepSkyBlue4\tcolor (0/255, 104/255, 139/255)\n#define\tSkyBlue1\tcolor (135/255, 206/255, 255/255)\n#define\tSkyBlue2\tcolor (126/255, 192/255, 238/255)\n#define\tSkyBlue3\tcolor (108/255, 166/255, 205/255)\n#define\tSkyBlue4\tcolor (74/255, 112/255, 139/255)\n#define\tLightSkyBlue1\tcolor (176/255, 226/255, 255/255)\n#define\tLightSkyBlue2\tcolor (164/255, 211/255, 238/255)\n#define\tLightSkyBlue3\tcolor (141/255, 182/255, 205/255)\n#define\tLightSkyBlue4\tcolor (96/255, 123/255, 139/255)\n#define\tSlateGray1\tcolor (198/255, 226/255, 255/255)\n#define\tSlateGray2\tcolor (185/255, 211/255, 238/255)\n#define\tSlateGray3\tcolor (159/255, 182/255, 205/255)\n#define\tSlateGray4\tcolor (108/255, 123/255, 139/255)\n#define\tLightSteelBlue1\tcolor (202/255, 225/255, 255/255)\n#define\tLightSteelBlue2\tcolor (188/255, 210/255, 238/255)\n#define\tLightSteelBlue3\tcolor (162/255, 181/255, 205/255)\n#define\tLightSteelBlue4\tcolor (110/255, 123/255, 139/255)\n#define\tLightBlue1\tcolor (191/255, 239/255, 255/255)\n#define\tLightBlue2\tcolor (178/255, 223/255, 238/255)\n#define\tLightBlue3\tcolor (154/255, 192/255, 205/255)\n#define\tLightBlue4\tcolor (104/255, 131/255, 139/255)\n#define\tLightCyan1\tcolor (224/255, 255/255, 255/255)\n#define\tLightCyan2\tcolor (209/255, 238/255, 238/255)\n#define\tLightCyan3\tcolor (180/255, 205/255, 205/255)\n#define\tLightCyan4\tcolor (122/255, 139/255, 139/255)\n#define\tPaleTurquoise1\tcolor (187/255, 255/255, 255/255)\n#define\tPaleTurquoise2\tcolor (174/255, 238/255, 238/255)\n#define\tPaleTurquoise3\tcolor (150/255, 205/255, 205/255)\n#define\tPaleTurquoise4\tcolor (102/255, 139/255, 139/255)\n#define\tCadetBlue1\tcolor (152/255, 245/255, 255/255)\n#define\tCadetBlue2\tcolor (142/255, 229/255, 238/255)\n#define\tCadetBlue3\tcolor (122/255, 197/255, 205/255)\n#define\tCadetBlue4\tcolor (83/255, 134/255, 139/255)\n#define\tturquoise1\tcolor (0/255, 245/255, 255/255)\n#define\tturquoise2\tcolor (0/255, 229/255, 238/255)\n#define\tturquoise3\tcolor (0/255, 197/255, 205/255)\n#define\tturquoise4\tcolor (0/255, 134/255, 139/255)\n#define\tcyan1\tcolor (0/255, 255/255, 255/255)\n#define\tcyan2\tcolor (0/255, 238/255, 238/255)\n#define\tcyan3\tcolor (0/255, 205/255, 205/255)\n#define\tcyan4\tcolor (0/255, 139/255, 139/255)\n#define\tDarkSlateGray1\tcolor (151/255, 255/255, 255/255)\n#define\tDarkSlateGray2\tcolor (141/255, 238/255, 238/255)\n#define\tDarkSlateGray3\tcolor (121/255, 205/255, 205/255)\n#define\tDarkSlateGray4\tcolor (82/255, 139/255, 139/255)\n#define\taquamarine1\tcolor (127/255, 255/255, 212/255)\n#define\taquamarine2\tcolor (118/255, 238/255, 198/255)\n#define\taquamarine3\tcolor (102/255, 205/255, 170/255)\n#define\taquamarine4\tcolor (69/255, 139/255, 116/255)\n#define\tDarkSeaGreen1\tcolor (193/255, 255/255, 193/255)\n#define\tDarkSeaGreen2\tcolor (180/255, 238/255, 180/255)\n#define\tDarkSeaGreen3\tcolor (155/255, 205/255, 155/255)\n#define\tDarkSeaGreen4\tcolor (105/255, 139/255, 105/255)\n#define\tSeaGreen1\tcolor (84/255, 255/255, 159/255)\n#define\tSeaGreen2\tcolor (78/255, 238/255, 148/255)\n#define\tSeaGreen3\tcolor (67/255, 205/255, 128/255)\n#define\tSeaGreen4\tcolor (46/255, 139/255, 87/255)\n#define\tPaleGreen1\tcolor (154/255, 255/255, 154/255)\n#define\tPaleGreen2\tcolor (144/255, 238/255, 144/255)\n#define\tPaleGreen3\tcolor (124/255, 205/255, 124/255)\n#define\tPaleGreen4\tcolor (84/255, 139/255, 84/255)\n#define\tSpringGreen1\tcolor (0/255, 255/255, 127/255)\n#define\tSpringGreen2\tcolor (0/255, 238/255, 118/255)\n#define\tSpringGreen3\tcolor (0/255, 205/255, 102/255)\n#define\tSpringGreen4\tcolor (0/255, 139/255, 69/255)\n#define\tgreen1\tcolor (0/255, 255/255, 0/255)\n#define\tgreen2\tcolor (0/255, 238/255, 0/255)\n#define\tgreen3\tcolor (0/255, 205/255, 0/255)\n#define\tgreen4\tcolor (0/255, 139/255, 0/255)\n#define\tchartreuse1\tcolor (127/255, 255/255, 0/255)\n#define\tchartreuse2\tcolor (118/255, 238/255, 0/255)\n#define\tchartreuse3\tcolor (102/255, 205/255, 0/255)\n#define\tchartreuse4\tcolor (69/255, 139/255, 0/255)\n#define\tOliveDrab1\tcolor (192/255, 255/255, 62/255)\n#define\tOliveDrab2\tcolor (179/255, 238/255, 58/255)\n#define\tOliveDrab3\tcolor (154/255, 205/255, 50/255)\n#define\tOliveDrab4\tcolor (105/255, 139/255, 34/255)\n#define\tDarkOliveGreen1\tcolor (202/255, 255/255, 112/255)\n#define\tDarkOliveGreen2\tcolor (188/255, 238/255, 104/255)\n#define\tDarkOliveGreen3\tcolor (162/255, 205/255, 90/255)\n#define\tDarkOliveGreen4\tcolor (110/255, 139/255, 61/255)\n#define\tkhaki1\tcolor (255/255, 246/255, 143/255)\n#define\tkhaki2\tcolor (238/255, 230/255, 133/255)\n#define\tkhaki3\tcolor (205/255, 198/255, 115/255)\n#define\tkhaki4\tcolor (139/255, 134/255, 78/255)\n#define\tLightGoldenrod1\tcolor (255/255, 236/255, 139/255)\n#define\tLightGoldenrod2\tcolor (238/255, 220/255, 130/255)\n#define\tLightGoldenrod3\tcolor (205/255, 190/255, 112/255)\n#define\tLightGoldenrod4\tcolor (139/255, 129/255, 76/255)\n#define\tLightYellow1\tcolor (255/255, 255/255, 224/255)\n#define\tLightYellow2\tcolor (238/255, 238/255, 209/255)\n#define\tLightYellow3\tcolor (205/255, 205/255, 180/255)\n#define\tLightYellow4\tcolor (139/255, 139/255, 122/255)\n#define\tyellow1\tcolor (255/255, 255/255, 0/255)\n#define\tyellow2\tcolor (238/255, 238/255, 0/255)\n#define\tyellow3\tcolor (205/255, 205/255, 0/255)\n#define\tyellow4\tcolor (139/255, 139/255, 0/255)\n#define\tgold1\tcolor (255/255, 215/255, 0/255)\n#define\tgold2\tcolor (238/255, 201/255, 0/255)\n#define\tgold3\tcolor (205/255, 173/255, 0/255)\n#define\tgold4\tcolor (139/255, 117/255, 0/255)\n#define\tgoldenrod1\tcolor (255/255, 193/255, 37/255)\n#define\tgoldenrod2\tcolor (238/255, 180/255, 34/255)\n#define\tgoldenrod3\tcolor (205/255, 155/255, 29/255)\n#define\tgoldenrod4\tcolor (139/255, 105/255, 20/255)\n#define\tDarkGoldenrod1\tcolor (255/255, 185/255, 15/255)\n#define\tDarkGoldenrod2\tcolor (238/255, 173/255, 14/255)\n#define\tDarkGoldenrod3\tcolor (205/255, 149/255, 12/255)\n#define\tDarkGoldenrod4\tcolor (139/255, 101/255, 8/255)\n#define\tRosyBrown1\tcolor (255/255, 193/255, 193/255)\n#define\tRosyBrown2\tcolor (238/255, 180/255, 180/255)\n#define\tRosyBrown3\tcolor (205/255, 155/255, 155/255)\n#define\tRosyBrown4\tcolor (139/255, 105/255, 105/255)\n#define\tIndianRed1\tcolor (255/255, 106/255, 106/255)\n#define\tIndianRed2\tcolor (238/255, 99/255, 99/255)\n#define\tIndianRed3\tcolor (205/255, 85/255, 85/255)\n#define\tIndianRed4\tcolor (139/255, 58/255, 58/255)\n#define\tsienna1\tcolor (255/255, 130/255, 71/255)\n#define\tsienna2\tcolor (238/255, 121/255, 66/255)\n#define\tsienna3\tcolor (205/255, 104/255, 57/255)\n#define\tsienna4\tcolor (139/255, 71/255, 38/255)\n#define\tburlywood1\tcolor (255/255, 211/255, 155/255)\n#define\tburlywood2\tcolor (238/255, 197/255, 145/255)\n#define\tburlywood3\tcolor (205/255, 170/255, 125/255)\n#define\tburlywood4\tcolor (139/255, 115/255, 85/255)\n#define\twheat1\tcolor (255/255, 231/255, 186/255)\n#define\twheat2\tcolor (238/255, 216/255, 174/255)\n#define\twheat3\tcolor (205/255, 186/255, 150/255)\n#define\twheat4\tcolor (139/255, 126/255, 102/255)\n#define\ttan1\tcolor (255/255, 165/255, 79/255)\n#define\ttan2\tcolor (238/255, 154/255, 73/255)\n#define\ttan3\tcolor (205/255, 133/255, 63/255)\n#define\ttan4\tcolor (139/255, 90/255, 43/255)\n#define\tchocolate1\tcolor (255/255, 127/255, 36/255)\n#define\tchocolate2\tcolor (238/255, 118/255, 33/255)\n#define\tchocolate3\tcolor (205/255, 102/255, 29/255)\n#define\tchocolate4\tcolor (139/255, 69/255, 19/255)\n#define\tfirebrick1\tcolor (255/255, 48/255, 48/255)\n#define\tfirebrick2\tcolor (238/255, 44/255, 44/255)\n#define\tfirebrick3\tcolor (205/255, 38/255, 38/255)\n#define\tfirebrick4\tcolor (139/255, 26/255, 26/255)\n#define\tbrown1\tcolor (255/255, 64/255, 64/255)\n#define\tbrown2\tcolor (238/255, 59/255, 59/255)\n#define\tbrown3\tcolor (205/255, 51/255, 51/255)\n#define\tbrown4\tcolor (139/255, 35/255, 35/255)\n#define\tsalmon1\tcolor (255/255, 140/255, 105/255)\n#define\tsalmon2\tcolor (238/255, 130/255, 98/255)\n#define\tsalmon3\tcolor (205/255, 112/255, 84/255)\n#define\tsalmon4\tcolor (139/255, 76/255, 57/255)\n#define\tLightSalmon1\tcolor (255/255, 160/255, 122/255)\n#define\tLightSalmon2\tcolor (238/255, 149/255, 114/255)\n#define\tLightSalmon3\tcolor (205/255, 129/255, 98/255)\n#define\tLightSalmon4\tcolor (139/255, 87/255, 66/255)\n#define\torange1\tcolor (255/255, 165/255, 0/255)\n#define\torange2\tcolor (238/255, 154/255, 0/255)\n#define\torange3\tcolor (205/255, 133/255, 0/255)\n#define\torange4\tcolor (139/255, 90/255, 0/255)\n#define\tDarkOrange1\tcolor (255/255, 127/255, 0/255)\n#define\tDarkOrange2\tcolor (238/255, 118/255, 0/255)\n#define\tDarkOrange3\tcolor (205/255, 102/255, 0/255)\n#define\tDarkOrange4\tcolor (139/255, 69/255, 0/255)\n#define\tcoral1\tcolor (255/255, 114/255, 86/255)\n#define\tcoral2\tcolor (238/255, 106/255, 80/255)\n#define\tcoral3\tcolor (205/255, 91/255, 69/255)\n#define\tcoral4\tcolor (139/255, 62/255, 47/255)\n#define\ttomato1\tcolor (255/255, 99/255, 71/255)\n#define\ttomato2\tcolor (238/255, 92/255, 66/255)\n#define\ttomato3\tcolor (205/255, 79/255, 57/255)\n#define\ttomato4\tcolor (139/255, 54/255, 38/255)\n#define\tOrangeRed1\tcolor (255/255, 69/255, 0/255)\n#define\tOrangeRed2\tcolor (238/255, 64/255, 0/255)\n#define\tOrangeRed3\tcolor (205/255, 55/255, 0/255)\n#define\tOrangeRed4\tcolor (139/255, 37/255, 0/255)\n#define\tred1\tcolor (255/255, 0/255, 0/255)\n#define\tred2\tcolor (238/255, 0/255, 0/255)\n#define\tred3\tcolor (205/255, 0/255, 0/255)\n#define\tred4\tcolor (139/255, 0/255, 0/255)\n#define\tDeepPink1\tcolor (255/255, 20/255, 147/255)\n#define\tDeepPink2\tcolor (238/255, 18/255, 137/255)\n#define\tDeepPink3\tcolor (205/255, 16/255, 118/255)\n#define\tDeepPink4\tcolor (139/255, 10/255, 80/255)\n#define\tHotPink1\tcolor (255/255, 110/255, 180/255)\n#define\tHotPink2\tcolor (238/255, 106/255, 167/255)\n#define\tHotPink3\tcolor (205/255, 96/255, 144/255)\n#define\tHotPink4\tcolor (139/255, 58/255, 98/255)\n#define\tpink1\tcolor (255/255, 181/255, 197/255)\n#define\tpink2\tcolor (238/255, 169/255, 184/255)\n#define\tpink3\tcolor (205/255, 145/255, 158/255)\n#define\tpink4\tcolor (139/255, 99/255, 108/255)\n#define\tLightPink1\tcolor (255/255, 174/255, 185/255)\n#define\tLightPink2\tcolor (238/255, 162/255, 173/255)\n#define\tLightPink3\tcolor (205/255, 140/255, 149/255)\n#define\tLightPink4\tcolor (139/255, 95/255, 101/255)\n#define\tPaleVioletRed1\tcolor (255/255, 130/255, 171/255)\n#define\tPaleVioletRed2\tcolor (238/255, 121/255, 159/255)\n#define\tPaleVioletRed3\tcolor (205/255, 104/255, 137/255)\n#define\tPaleVioletRed4\tcolor (139/255, 71/255, 93/255)\n#define\tmaroon1\tcolor (255/255, 52/255, 179/255)\n#define\tmaroon2\tcolor (238/255, 48/255, 167/255)\n#define\tmaroon3\tcolor (205/255, 41/255, 144/255)\n#define\tmaroon4\tcolor (139/255, 28/255, 98/255)\n#define\tVioletRed1\tcolor (255/255, 62/255, 150/255)\n#define\tVioletRed2\tcolor (238/255, 58/255, 140/255)\n#define\tVioletRed3\tcolor (205/255, 50/255, 120/255)\n#define\tVioletRed4\tcolor (139/255, 34/255, 82/255)\n#define\tmagenta1\tcolor (255/255, 0/255, 255/255)\n#define\tmagenta2\tcolor (238/255, 0/255, 238/255)\n#define\tmagenta3\tcolor (205/255, 0/255, 205/255)\n#define\tmagenta4\tcolor (139/255, 0/255, 139/255)\n#define\torchid1\tcolor (255/255, 131/255, 250/255)\n#define\torchid2\tcolor (238/255, 122/255, 233/255)\n#define\torchid3\tcolor (205/255, 105/255, 201/255)\n#define\torchid4\tcolor (139/255, 71/255, 137/255)\n#define\tplum1\tcolor (255/255, 187/255, 255/255)\n#define\tplum2\tcolor (238/255, 174/255, 238/255)\n#define\tplum3\tcolor (205/255, 150/255, 205/255)\n#define\tplum4\tcolor (139/255, 102/255, 139/255)\n#define\tMediumOrchid1\tcolor (224/255, 102/255, 255/255)\n#define\tMediumOrchid2\tcolor (209/255, 95/255, 238/255)\n#define\tMediumOrchid3\tcolor (180/255, 82/255, 205/255)\n#define\tMediumOrchid4\tcolor (122/255, 55/255, 139/255)\n#define\tDarkOrchid1\tcolor (191/255, 62/255, 255/255)\n#define\tDarkOrchid2\tcolor (178/255, 58/255, 238/255)\n#define\tDarkOrchid3\tcolor (154/255, 50/255, 205/255)\n#define\tDarkOrchid4\tcolor (104/255, 34/255, 139/255)\n#define\tpurple1\tcolor (155/255, 48/255, 255/255)\n#define\tpurple2\tcolor (145/255, 44/255, 238/255)\n#define\tpurple3\tcolor (125/255, 38/255, 205/255)\n#define\tpurple4\tcolor (85/255, 26/255, 139/255)\n#define\tMediumPurple1\tcolor (171/255, 130/255, 255/255)\n#define\tMediumPurple2\tcolor (159/255, 121/255, 238/255)\n#define\tMediumPurple3\tcolor (137/255, 104/255, 205/255)\n#define\tMediumPurple4\tcolor (93/255, 71/255, 139/255)\n#define\tthistle1\tcolor (255/255, 225/255, 255/255)\n#define\tthistle2\tcolor (238/255, 210/255, 238/255)\n#define\tthistle3\tcolor (205/255, 181/255, 205/255)\n#define\tthistle4\tcolor (139/255, 123/255, 139/255)\n#define\tgray0\tcolor (0/255, 0/255, 0/255)\n#define\tgrey0\tcolor (0/255, 0/255, 0/255)\n#define\tgray1\tcolor (3/255, 3/255, 3/255)\n#define\tgrey1\tcolor (3/255, 3/255, 3/255)\n#define\tgray2\tcolor (5/255, 5/255, 5/255)\n#define\tgrey2\tcolor (5/255, 5/255, 5/255)\n#define\tgray3\tcolor (8/255, 8/255, 8/255)\n#define\tgrey3\tcolor (8/255, 8/255, 8/255)\n#define\tgray4\tcolor (10/255, 10/255, 10/255)\n#define\tgrey4\tcolor (10/255, 10/255, 10/255)\n#define\tgray5\tcolor (13/255, 13/255, 13/255)\n#define\tgrey5\tcolor (13/255, 13/255, 13/255)\n#define\tgray6\tcolor (15/255, 15/255, 15/255)\n#define\tgrey6\tcolor (15/255, 15/255, 15/255)\n#define\tgray7\tcolor (18/255, 18/255, 18/255)\n#define\tgrey7\tcolor (18/255, 18/255, 18/255)\n#define\tgray8\tcolor (20/255, 20/255, 20/255)\n#define\tgrey8\tcolor (20/255, 20/255, 20/255)\n#define\tgray9\tcolor (23/255, 23/255, 23/255)\n#define\tgrey9\tcolor (23/255, 23/255, 23/255)\n#define\tgray10\tcolor (26/255, 26/255, 26/255)\n#define\tgrey10\tcolor (26/255, 26/255, 26/255)\n#define\tgray11\tcolor (28/255, 28/255, 28/255)\n#define\tgrey11\tcolor (28/255, 28/255, 28/255)\n#define\tgray12\tcolor (31/255, 31/255, 31/255)\n#define\tgrey12\tcolor (31/255, 31/255, 31/255)\n#define\tgray13\tcolor (33/255, 33/255, 33/255)\n#define\tgrey13\tcolor (33/255, 33/255, 33/255)\n#define\tgray14\tcolor (36/255, 36/255, 36/255)\n#define\tgrey14\tcolor (36/255, 36/255, 36/255)\n#define\tgray15\tcolor (38/255, 38/255, 38/255)\n#define\tgrey15\tcolor (38/255, 38/255, 38/255)\n#define\tgray16\tcolor (41/255, 41/255, 41/255)\n#define\tgrey16\tcolor (41/255, 41/255, 41/255)\n#define\tgray17\tcolor (43/255, 43/255, 43/255)\n#define\tgrey17\tcolor (43/255, 43/255, 43/255)\n#define\tgray18\tcolor (46/255, 46/255, 46/255)\n#define\tgrey18\tcolor (46/255, 46/255, 46/255)\n#define\tgray19\tcolor (48/255, 48/255, 48/255)\n#define\tgrey19\tcolor (48/255, 48/255, 48/255)\n#define\tgray20\tcolor (51/255, 51/255, 51/255)\n#define\tgrey20\tcolor (51/255, 51/255, 51/255)\n#define\tgray21\tcolor (54/255, 54/255, 54/255)\n#define\tgrey21\tcolor (54/255, 54/255, 54/255)\n#define\tgray22\tcolor (56/255, 56/255, 56/255)\n#define\tgrey22\tcolor (56/255, 56/255, 56/255)\n#define\tgray23\tcolor (59/255, 59/255, 59/255)\n#define\tgrey23\tcolor (59/255, 59/255, 59/255)\n#define\tgray24\tcolor (61/255, 61/255, 61/255)\n#define\tgrey24\tcolor (61/255, 61/255, 61/255)\n#define\tgray25\tcolor (64/255, 64/255, 64/255)\n#define\tgrey25\tcolor (64/255, 64/255, 64/255)\n#define\tgray26\tcolor (66/255, 66/255, 66/255)\n#define\tgrey26\tcolor (66/255, 66/255, 66/255)\n#define\tgray27\tcolor (69/255, 69/255, 69/255)\n#define\tgrey27\tcolor (69/255, 69/255, 69/255)\n#define\tgray28\tcolor (71/255, 71/255, 71/255)\n#define\tgrey28\tcolor (71/255, 71/255, 71/255)\n#define\tgray29\tcolor (74/255, 74/255, 74/255)\n#define\tgrey29\tcolor (74/255, 74/255, 74/255)\n#define\tgray30\tcolor (77/255, 77/255, 77/255)\n#define\tgrey30\tcolor (77/255, 77/255, 77/255)\n#define\tgray31\tcolor (79/255, 79/255, 79/255)\n#define\tgrey31\tcolor (79/255, 79/255, 79/255)\n#define\tgray32\tcolor (82/255, 82/255, 82/255)\n#define\tgrey32\tcolor (82/255, 82/255, 82/255)\n#define\tgray33\tcolor (84/255, 84/255, 84/255)\n#define\tgrey33\tcolor (84/255, 84/255, 84/255)\n#define\tgray34\tcolor (87/255, 87/255, 87/255)\n#define\tgrey34\tcolor (87/255, 87/255, 87/255)\n#define\tgray35\tcolor (89/255, 89/255, 89/255)\n#define\tgrey35\tcolor (89/255, 89/255, 89/255)\n#define\tgray36\tcolor (92/255, 92/255, 92/255)\n#define\tgrey36\tcolor (92/255, 92/255, 92/255)\n#define\tgray37\tcolor (94/255, 94/255, 94/255)\n#define\tgrey37\tcolor (94/255, 94/255, 94/255)\n#define\tgray38\tcolor (97/255, 97/255, 97/255)\n#define\tgrey38\tcolor (97/255, 97/255, 97/255)\n#define\tgray39\tcolor (99/255, 99/255, 99/255)\n#define\tgrey39\tcolor (99/255, 99/255, 99/255)\n#define\tgray40\tcolor (102/255, 102/255, 102/255)\n#define\tgrey40\tcolor (102/255, 102/255, 102/255)\n#define\tgray41\tcolor (105/255, 105/255, 105/255)\n#define\tgrey41\tcolor (105/255, 105/255, 105/255)\n#define\tgray42\tcolor (107/255, 107/255, 107/255)\n#define\tgrey42\tcolor (107/255, 107/255, 107/255)\n#define\tgray43\tcolor (110/255, 110/255, 110/255)\n#define\tgrey43\tcolor (110/255, 110/255, 110/255)\n#define\tgray44\tcolor (112/255, 112/255, 112/255)\n#define\tgrey44\tcolor (112/255, 112/255, 112/255)\n#define\tgray45\tcolor (115/255, 115/255, 115/255)\n#define\tgrey45\tcolor (115/255, 115/255, 115/255)\n#define\tgray46\tcolor (117/255, 117/255, 117/255)\n#define\tgrey46\tcolor (117/255, 117/255, 117/255)\n#define\tgray47\tcolor (120/255, 120/255, 120/255)\n#define\tgrey47\tcolor (120/255, 120/255, 120/255)\n#define\tgray48\tcolor (122/255, 122/255, 122/255)\n#define\tgrey48\tcolor (122/255, 122/255, 122/255)\n#define\tgray49\tcolor (125/255, 125/255, 125/255)\n#define\tgrey49\tcolor (125/255, 125/255, 125/255)\n#define\tgray50\tcolor (127/255, 127/255, 127/255)\n#define\tgrey50\tcolor (127/255, 127/255, 127/255)\n#define\tgray51\tcolor (130/255, 130/255, 130/255)\n#define\tgrey51\tcolor (130/255, 130/255, 130/255)\n#define\tgray52\tcolor (133/255, 133/255, 133/255)\n#define\tgrey52\tcolor (133/255, 133/255, 133/255)\n#define\tgray53\tcolor (135/255, 135/255, 135/255)\n#define\tgrey53\tcolor (135/255, 135/255, 135/255)\n#define\tgray54\tcolor (138/255, 138/255, 138/255)\n#define\tgrey54\tcolor (138/255, 138/255, 138/255)\n#define\tgray55\tcolor (140/255, 140/255, 140/255)\n#define\tgrey55\tcolor (140/255, 140/255, 140/255)\n#define\tgray56\tcolor (143/255, 143/255, 143/255)\n#define\tgrey56\tcolor (143/255, 143/255, 143/255)\n#define\tgray57\tcolor (145/255, 145/255, 145/255)\n#define\tgrey57\tcolor (145/255, 145/255, 145/255)\n#define\tgray58\tcolor (148/255, 148/255, 148/255)\n#define\tgrey58\tcolor (148/255, 148/255, 148/255)\n#define\tgray59\tcolor (150/255, 150/255, 150/255)\n#define\tgrey59\tcolor (150/255, 150/255, 150/255)\n#define\tgray60\tcolor (153/255, 153/255, 153/255)\n#define\tgrey60\tcolor (153/255, 153/255, 153/255)\n#define\tgray61\tcolor (156/255, 156/255, 156/255)\n#define\tgrey61\tcolor (156/255, 156/255, 156/255)\n#define\tgray62\tcolor (158/255, 158/255, 158/255)\n#define\tgrey62\tcolor (158/255, 158/255, 158/255)\n#define\tgray63\tcolor (161/255, 161/255, 161/255)\n#define\tgrey63\tcolor (161/255, 161/255, 161/255)\n#define\tgray64\tcolor (163/255, 163/255, 163/255)\n#define\tgrey64\tcolor (163/255, 163/255, 163/255)\n#define\tgray65\tcolor (166/255, 166/255, 166/255)\n#define\tgrey65\tcolor (166/255, 166/255, 166/255)\n#define\tgray66\tcolor (168/255, 168/255, 168/255)\n#define\tgrey66\tcolor (168/255, 168/255, 168/255)\n#define\tgray67\tcolor (171/255, 171/255, 171/255)\n#define\tgrey67\tcolor (171/255, 171/255, 171/255)\n#define\tgray68\tcolor (173/255, 173/255, 173/255)\n#define\tgrey68\tcolor (173/255, 173/255, 173/255)\n#define\tgray69\tcolor (176/255, 176/255, 176/255)\n#define\tgrey69\tcolor (176/255, 176/255, 176/255)\n#define\tgray70\tcolor (179/255, 179/255, 179/255)\n#define\tgrey70\tcolor (179/255, 179/255, 179/255)\n#define\tgray71\tcolor (181/255, 181/255, 181/255)\n#define\tgrey71\tcolor (181/255, 181/255, 181/255)\n#define\tgray72\tcolor (184/255, 184/255, 184/255)\n#define\tgrey72\tcolor (184/255, 184/255, 184/255)\n#define\tgray73\tcolor (186/255, 186/255, 186/255)\n#define\tgrey73\tcolor (186/255, 186/255, 186/255)\n#define\tgray74\tcolor (189/255, 189/255, 189/255)\n#define\tgrey74\tcolor (189/255, 189/255, 189/255)\n#define\tgray75\tcolor (191/255, 191/255, 191/255)\n#define\tgrey75\tcolor (191/255, 191/255, 191/255)\n#define\tgray76\tcolor (194/255, 194/255, 194/255)\n#define\tgrey76\tcolor (194/255, 194/255, 194/255)\n#define\tgray77\tcolor (196/255, 196/255, 196/255)\n#define\tgrey77\tcolor (196/255, 196/255, 196/255)\n#define\tgray78\tcolor (199/255, 199/255, 199/255)\n#define\tgrey78\tcolor (199/255, 199/255, 199/255)\n#define\tgray79\tcolor (201/255, 201/255, 201/255)\n#define\tgrey79\tcolor (201/255, 201/255, 201/255)\n#define\tgray80\tcolor (204/255, 204/255, 204/255)\n#define\tgrey80\tcolor (204/255, 204/255, 204/255)\n#define\tgray81\tcolor (207/255, 207/255, 207/255)\n#define\tgrey81\tcolor (207/255, 207/255, 207/255)\n#define\tgray82\tcolor (209/255, 209/255, 209/255)\n#define\tgrey82\tcolor (209/255, 209/255, 209/255)\n#define\tgray83\tcolor (212/255, 212/255, 212/255)\n#define\tgrey83\tcolor (212/255, 212/255, 212/255)\n#define\tgray84\tcolor (214/255, 214/255, 214/255)\n#define\tgrey84\tcolor (214/255, 214/255, 214/255)\n#define\tgray85\tcolor (217/255, 217/255, 217/255)\n#define\tgrey85\tcolor (217/255, 217/255, 217/255)\n#define\tgray86\tcolor (219/255, 219/255, 219/255)\n#define\tgrey86\tcolor (219/255, 219/255, 219/255)\n#define\tgray87\tcolor (222/255, 222/255, 222/255)\n#define\tgrey87\tcolor (222/255, 222/255, 222/255)\n#define\tgray88\tcolor (224/255, 224/255, 224/255)\n#define\tgrey88\tcolor (224/255, 224/255, 224/255)\n#define\tgray89\tcolor (227/255, 227/255, 227/255)\n#define\tgrey89\tcolor (227/255, 227/255, 227/255)\n#define\tgray90\tcolor (229/255, 229/255, 229/255)\n#define\tgrey90\tcolor (229/255, 229/255, 229/255)\n#define\tgray91\tcolor (232/255, 232/255, 232/255)\n#define\tgrey91\tcolor (232/255, 232/255, 232/255)\n#define\tgray92\tcolor (235/255, 235/255, 235/255)\n#define\tgrey92\tcolor (235/255, 235/255, 235/255)\n#define\tgray93\tcolor (237/255, 237/255, 237/255)\n#define\tgrey93\tcolor (237/255, 237/255, 237/255)\n#define\tgray94\tcolor (240/255, 240/255, 240/255)\n#define\tgrey94\tcolor (240/255, 240/255, 240/255)\n#define\tgray95\tcolor (242/255, 242/255, 242/255)\n#define\tgrey95\tcolor (242/255, 242/255, 242/255)\n#define\tgray96\tcolor (245/255, 245/255, 245/255)\n#define\tgrey96\tcolor (245/255, 245/255, 245/255)\n#define\tgray97\tcolor (247/255, 247/255, 247/255)\n#define\tgrey97\tcolor (247/255, 247/255, 247/255)\n#define\tgray98\tcolor (250/255, 250/255, 250/255)\n#define\tgrey98\tcolor (250/255, 250/255, 250/255)\n#define\tgray99\tcolor (252/255, 252/255, 252/255)\n#define\tgrey99\tcolor (252/255, 252/255, 252/255)\n#define\tgray100\tcolor (255/255, 255/255, 255/255)\n#define\tgrey100\tcolor (255/255, 255/255, 255/255)\n\n\t"
  },
  {
    "path": "share/k3d/shaders/k3d_constants.h",
    "content": "/* k3d_constants.h\n *  various constants or \"magic\" numbers\n * see http://en.wikipedia.org/wiki/Mathematical_constant\n *  2006-03-13 dan@3-e.net\n *\n * need to check the max number of digits.\n * need to make case of names uniform.\n * Some of these may be in a Math.h else where...\n */\n\n\n#define M_E 2.7182818284590452354\t/* e, euler's number */\n#define Euler 0.57721566490153286060651209008240243 /* Y, Euler-Mascheroni constant */\n\n#define GoldenRatio  1.61803398874989484820458683436563811  /* the Golden Ratio */\n\n#define Pi 3.14159265358979323846264338327950288 /* Pi , Archimedes' constant or Ludolph's number */\n#define TWOPI (2*Pi)\n\n#define VERY_SMALL 0.0001\n\n\n"
  },
  {
    "path": "share/k3d/shaders/k3d_displace.h",
    "content": "/************************************************************************\n * displace.h - Routines for displacing\n *\n * Author: Larry Gritz (gritzl@acm.org)\n *\n * Reference:\n *   _Advanced RenderMan: Creating CGI for Motion Picture_, \n *   by Anthony A. Apodaca and Larry Gritz, Morgan Kaufmann, 1999.\n *\n * $Revision: 1.1 $    $Date: 2004/05/19 18:15:19 $\n *\n ************************************************************************/\n\n\n\n#ifndef DISPLACE_H\n#define DISPLACE_H 1\n\n\n\n\n/* Combine displacement and bump mapping, with units relative to \n * a particular space.  When truedisp != 0, this function modifies\n * P as a side effect.\n *\n * Inputs:\n *    dir       direction in which to push the surface, assumed to\n *                 already be in \"current\" space and normalized.\n *    amp       amplitude of the actual displacement or bumping.\n *    space     the name of the coordinate system against which the\n *                 amplitude is measured.\n *    truedisp  when 1, truly displace; when 0, just bump.\n * Return value: the normal of the displaced and bumped surface,\n *                in \"current\" space, normalized.\n */\nnormal Displace (vector dir;  string space;\n                 float amp; float truedisp;)\n{\n    extern point P;\n    float spacescale = length(vtransform(space, dir));\n    vector Ndisp = dir * (amp / max(spacescale,1e-6));\n    P += truedisp * Ndisp;\n    return normalize (calculatenormal (P + (1-truedisp)*Ndisp));\n}\n\n\n#endif /* DISPLACE_H */\n"
  },
  {
    "path": "share/k3d/shaders/k3d_filterwidth.h",
    "content": "/************************************************************************\n * filterwidth.h - Some handy macros for filter size estimation\n *                 for antialiasing of shaders.\n *\n * Author: Larry Gritz (gritzl@acm.org)\n *\n * Reference:\n *   _Advanced RenderMan: Creating CGI for Motion Picture_, \n *   by Anthony A. Apodaca and Larry Gritz, Morgan Kaufmann, 1999.\n *\n * $Revision: 1.2 $    $Date: 2006/03/16 15:31:45 $\n *\n ************************************************************************/\n\n\n\n#ifndef FILTERWIDTH_H\n#define FILTERWIDTH_H 1\n\n/* Define metrics for estimating filter widths, if none has already\n * been defined.  This is crucial for antialiasing.\n */\n#ifndef MINFILTWIDTH\n#define MINFILTWIDTH 1.0e-6\n#define MINDERIV        0.0003    /* sqrt(MINFILTERWIDTH) */\n\n#endif\n\n\n/* The filterwidth macro takes a float and returns the approximate \n * amount that the float changes from pixel to adjacent pixel.\n */\n#define filterwidth(x)  max (abs(Du(x)*du) + abs(Dv(x)*dv), MINFILTWIDTH)\n\n\n/* The filterwidthp macro is similar to filterwidth, but is for \n * point data.\n */\n#define filterwidthp(p) max (sqrt(area(p)), MINFILTWIDTH)\n#define filterwidth_point(p) (max(sqrt(area(p)), MINFILTWIDTH)) /* need to clean this out of our code and use name above */\n\n\n\n/* Given a function g, its known average g_avg, its high frequency\n * feature size, and a filter width, fade to the average as we approach\n * the Nyquist limit.\n */\n#define fadeout(g,g_avg,featuresize,fwidth) \\\n        mix (g, g_avg, smoothstep(.2,.6,fwidth/featuresize))\n\n\n#endif /* FILTERWIDTH_H */\n"
  },
  {
    "path": "share/k3d/shaders/k3d_functions.h",
    "content": "/* k3d_functions.h\n * \n * various functions collected from k3d_*.sl files\n *\n * add #include \"k3d_functions.h\" to your .sl files to use\n */\n \n \n /*\n \t* Basic Math\n \t*/\n \t\n#define sqr(x) ((x)*(x))\n \n#define isOdd(x) ((mod(x,2) == 1) ? 1 : 0)  /* also in rmnotes as odd(x) even(x) */\n\t\n\t/*\n\t * finters steps and pulses\n\t */\n\t \n#define boxstep(a,b,x) clamp(((x)-(a))/((b)-(a)),0,1) /* also in rmnotes, but all that code will end up here anyway. */\n  \n#define smoothPulse(a, b, fuzz, loc)  (smoothstep (a-fuzz, a+fuzz, loc) - smoothstep (b-fuzz, b+fuzz, loc) )\n\n/* separate fuzzes */\n#define smoothPulse2Fuzz(a, b, afuzz, bfuzz, loc)   (smoothstep (a-afuzz, a, loc) - smoothstep (b, b+bfuzz, loc))\n\n"
  },
  {
    "path": "share/k3d/shaders/k3d_isshad.h",
    "content": "/***********************************************************/\n/*** Return 1 if we're pretty sure this is a shadow pass ***/\n/***********************************************************/\n\nfloat is_shadow_pass()\n{\n    float fmt[3];\n    string sc;\n    float is = 0;\n    option(\"Format\",fmt);\n    attribute(\"identifier:name\",sc);\n\t/* square pic - can't be a regular camera */\n    /* not a glimpse editor window? */\n    if ((sc != \"<unnamed>\") &&\n\t((fmt[0] == fmt[1]) && (fmt[2] == 1.0)) )  {\n\t    is = 1;\n    }\n    return(is);\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/k3d_km.h",
    "content": "/* \n * km.h\n * \n * Copyright (C) 2001, Matt Pharr <mmp@Exluna.com> \n * \n * This software is placed in the public domain and is provided as is \n * without express or implied warranty. \n *\n * Basic implementation of the Kubelka-Munk model for the composition\n * of layered surfaces.  See SIGGRAPH 2001 course notes, \"Advanced \n * RenderMan 3: Render Harder,\" for notes and background information.\n */\n\nvoid sinhcosh(float t; output float sinh, cosh;) {\n    if (t > 10) t = 10.;\n    float ex = exp(t);\n    float invex = 1. / ex;\n\n    sinh = 0.5 * (ex - invex);\n    cosh = 0.5 * (ex + invex);\n}\n\n\nvoid KMEstimateCoeffs(color Rinf; output color sigma_a, sigma_s;) {\n    if (Rinf == color 0.) {\n        sigma_a = color 1.;\n        sigma_s = color 0.;\n    }\n    else {\n        color a_over_s = (1. - Rinf) * (1. - Rinf) / (2. * Rinf);\n        sigma_a = color 1.;\n        sigma_s = sigma_a / a_over_s;\n    }\n}\n\nvoid KM(color sigma_a, sigma_s; float thickness;\n        output color R, T;) {\n    float i;\n    for (i = 0; i < ncomps; i += 1) {\n        float s = comp(sigma_s, i), a = comp(sigma_a, i);\n        float aa = (s+a)/s;\n        float b = sqrt(max(aa*aa - 1., 0.));\n\n        float sh, ch;\n        sinhcosh(b*s*thickness, sh, ch);\n\n        setcomp(R, i, sh / (aa * sh + b * ch));\n        setcomp(T, i, b  / (aa * sh + b * ch));\n    }\n}\n\ncolor KMInfinite(color sigma_a, sigma_s;) {\n    float i;\n    color R = 0;\n    for (i = 0; i < ncomps; i += 1) {\n        float a = comp(sigma_a, i) / comp(sigma_s, i);\n        float r = 1. + a - sqrt(a*a + 2.*a);\n        setcomp(R, i, r);\n    }\n    return R;\n}\n\ncolor KMComposeR(color R1, T1, R2, T2) {\n    return R1 + T1*R2*T1 / (color 1. - R1*R2);\n}\n\ncolor KMComposeT(color R1, T1, R2, T2) {\n    return T1*T2 / (color 1. - R1*R2);\n}\n\ncolor KMOverGlossy(normal Nf; color sigma_a, sigma_s, Kd, Ks;\n                   float thickness, roughness;) {\n    color R1, T1;\n    KM(sigma_a, sigma_s, thickness, R1, T1);\n\n    color Kdnew = KMComposeR(R1, T1, Kd, color 0.);\n    color Ksnew = KMComposeR(0., T1, Ks, color 0.);\n\n    float KsRatio = comp(Ks, 0) / comp(Ksnew, 0);\n    float roughnew = roughness * KsRatio;\n\n    extern vector I;\n    return Kdnew*diffuse(Nf) + Ksnew*specular(Nf, -normalize(I), roughnew);\n}\n"
  },
  {
    "path": "share/k3d/shaders/k3d_locillum.h",
    "content": "/************************************************************************\n * locillum.h - Functions that compute the light response of locillums.\n *\n * Author: Larry Gritz (gritzl@acm.org)\n *\n * Reference:\n *   _Advanced RenderMan: Creating CGI for Motion Picture_, \n *   by Anthony A. Apodaca and Larry Gritz, Morgan Kaufmann, 1999.\n *\n * $Revision: 1.1 $    $Date: 2004/05/19 18:15:19 $\n *\n ************************************************************************/\n\n\n#ifndef LOCILLUM_H\n#define LOCILLUM_H\n\n\n\n\n/*\n * Oren and Nayar's generalization of Lambert's reflection model.\n * The roughness parameter gives the standard deviation of angle\n * orientations of the presumed surface grooves.  When roughness=0,\n * the model is identical to Lambertian reflection.\n */\ncolor\nLocIllumOrenNayar (normal N;  vector V;  float roughness;)\n{\n    /* Surface roughness coefficients for Oren/Nayar's formula */\n    float sigma2 = roughness * roughness;\n    float A = 1 - 0.5 * sigma2 / (sigma2 + 0.33);\n    float B = 0.45 * sigma2 / (sigma2 + 0.09);\n    /* Useful precomputed quantities */\n    float  theta_r = acos (V . N);        /* Angle between V and N */\n    vector V_perp_N = normalize(V-N*(V.N)); /* Part of V perpendicular to N */\n\n    /* Accumulate incoming radiance from lights in C */\n    color  C = 0;\n    extern point P;\n    illuminance (P, N, PI/2) {\n\t/* Must declare extern L & Cl because we're in a function */\n\textern vector L;  extern color Cl;\n\tfloat nondiff = 0;\n\tlightsource (\"__nondiffuse\", nondiff);\n\tif (nondiff < 1) {\n\t    vector LN = normalize(L);\n\t    float cos_theta_i = LN . N;\n\t    float cos_phi_diff = V_perp_N . normalize(LN - N*cos_theta_i);\n\t    float theta_i = acos (cos_theta_i);\n\t    float alpha = max (theta_i, theta_r);\n\t    float beta = min (theta_i, theta_r);\n\t    C += (1-nondiff) * Cl * cos_theta_i * \n\t\t(A + B * max(0,cos_phi_diff) * sin(alpha) * tan(beta));\n\t}\n    }\n    return C;\n\n}\n\n\n\n/*\n * Greg Ward Larson's anisotropic specular local illumination model.\n * The derivation and formulae can be found in:  Ward, Gregory J.\n * \"Measuring and Modeling Anisotropic Reflection,\" ACM Computer \n * Graphics 26(2) (Proceedings of Siggraph '92), pp. 265-272, July, 1992.\n * Notice that compared to the paper, the implementation below appears\n * to be missing a factor of 1/pi, and to have an extra L.N term.\n * This is not an error!  It is because the paper's formula is for the\n * BRDF, which is only part of the kernel of the light integral, whereas\n * shaders must compute the result of the integral.\n *\n * Inputs:\n *   N - unit surface normal\n *   V - unit viewing direction (from P toward the camera)\n *   xdir - a unit tangent of the surface defining the reference\n *          direction for the anisotropy.\n *   xroughness - the apparent roughness of the surface in xdir.\n *   yroughness - the roughness for the direction of the surface \n *          tangent perpendicular to xdir.\n */\ncolor\nLocIllumWardAnisotropic (normal N;  vector V;\n                         vector xdir;  float xroughness, yroughness;)\n{\n    float square (float x) { return x*x; }\n\n    float cos_theta_r = clamp (N.V, 0.0001, 1);\n    vector X = xdir / xroughness;\n    vector Y = (N ^ xdir) / yroughness;\n\n    color C = 0;\n    extern point P;\n    illuminance (P, N, PI/2) {\n\t/* Must declare extern L & Cl because we're in a function */\n\textern vector L;  extern color Cl; \n\tfloat nonspec = 0;\n\tlightsource (\"__nonspecular\", nonspec);\n\tif (nonspec < 1) {\n\t    vector LN = normalize (L);\n\t    float cos_theta_i = LN . N;\n\t    if (cos_theta_i > 0.0) {\n\t\tvector H = normalize (V + LN);\n\t\tfloat rho = exp (-2 * (square(X.H) + square(Y.H)) / (1 + H.N))\n\t\t    / sqrt (cos_theta_i * cos_theta_r);\n\t\tC += Cl * ((1-nonspec) * cos_theta_i * rho);\n\t    }\n\t}\n    }\n    return C / (4 * xroughness * yroughness);\n}\n\n\n\n/*\n * LocIllumGlossy - a possible replacement for specular(), with a\n * more uniformly bright core and a sharper falloff.  It's a nice\n * specular function to use for something made of glass or liquid.\n * Inputs:\n *  roughness - related to the size of the highlight, larger is bigger\n *  sharpness - 1 is infinitely sharp, 0 is very dull\n */\ncolor LocIllumGlossy ( normal N;  vector V;\n                       float roughness, sharpness; )\n{\n    color C = 0;\n    float w = .18 * (1-sharpness);\n    extern point P;\n    illuminance (P, N, PI/2) {\n\t/* Must declare extern L & Cl because we're in a function */\n\textern vector L;  extern color Cl; \n\tfloat nonspec = 0;\n\tlightsource (\"__nonspecular\", nonspec);\n\tif (nonspec < 1) {\n\t    vector H = normalize(normalize(L)+V);\n\t    C += Cl * ((1-nonspec) * \n\t\t       smoothstep (.72-w, .72+w,\n\t\t\t\t   pow(max(0,N.H), 1/roughness)));\n\t}\n    }\n    return C;\n}\n\n#endif /* defined(LOCILLUM_H) */\n\n"
  },
  {
    "path": "share/k3d/shaders/k3d_material.h",
    "content": "/************************************************************************\n * material.h - Functions which compute the light response of materials.\n *\n * Author: Larry Gritz (gritzl@acm.org)\n *\n * Reference:\n *   _Advanced RenderMan: Creating CGI for Motion Picture_, \n *   by Anthony A. Apodaca and Larry Gritz, Morgan Kaufmann, 1999.\n *\n * $Revision: 1.1 $    $Date: 2004/05/19 18:15:19 $\n *\n ************************************************************************/\n\n#ifndef MATERIAL_H\n#define MATERIAL_H\n\n\n#include \"k3d_locillum.h\"\n#include \"k3d_reflections.h\"\n\n\n\n/* Compute the color of the surface using a simple plastic-like BRDF.\n * Typical values are Ka=1, Kd=0.8, Ks=0.5, roughness=0.1.\n */\ncolor MaterialPlastic (normal Nf;  color basecolor;\n                       float Ka, Kd, Ks, roughness;)\n{\n    extern vector I;\n    return basecolor * (Ka*ambient() + Kd*diffuse(Nf))\n           + Ks*specular(Nf,-normalize(I),roughness);\n}\n\n\n/* Compute the color of the surface using a simple Lambertian BRDF. */\ncolor MaterialMatte (normal Nf;  color basecolor;  float Ka, Kd;)\n{\n    return basecolor * (Ka*ambient() + Kd*diffuse(Nf));\n}\n\n\n/* Compute the color of the surface using a simple metal-like BRDF.  To\n * give a metallic appearance, both diffuse and specular components are \n * scaled by the color of the metal.  It is recommended that Kd < 0.1,\n * Ks > 0.5, and roughness > 0.15 to give a believable metallic appearance.\n */\ncolor MaterialRoughMetal (normal Nf;  color basecolor;\n                          float Ka, Kd, Ks, roughness;)\n{\n    extern vector I;\n    return basecolor * (Ka*ambient() + Kd*diffuse(Nf) +\n                        Ks*specular(Nf,-normalize(I),roughness));\n}\n\n\n/* Compute the color of the surface using a simple thin plastic-like BRDF.\n * We call it _thin_ because it includes a transmisison component to allow \n * light from the _back_ of the surface to affect the appearance.  Typical\n * values are Ka=1, Kd=0.8, Kt = 0.2, Ks=0.5, roughness=0.1.\n */\ncolor MaterialThinPlastic (normal Nf;  vector V;  color basecolor; \n                           float Ka, Kd, Kt, Ks, roughness;)\n{\n    return basecolor * (Ka*ambient() + Kd*diffuse(Nf) + Kt*diffuse(-Nf))\n           + Ks*specular(Nf,V,roughness);\n}\n\n\n\n/* Compute the color of the surface using a simple plastic-like BRDF, with\n * fresnel-attenuated coherent reflections.\n * If twosided is nonzero, both sides are shiny, but if you know that\n * the object has N facing outward, twosided==0 is a good optimization\n * (especially when using the ray server).\n */\ncolor\nMaterialShinyPlastic (normal Nf; color basecolor;\n                      float Ka, Kd, Ks, roughness, Kr, blur, ior;\n\t\t      uniform float twosided;\n                      DECLARE_ENVPARAMS; )\n{\n    extern vector I;\n    extern point P;\n    extern normal N;\n    vector IN = normalize(I), V = -IN;\n    float fkr, fkt;  vector R, T;\n    fresnel (IN, Nf, 1/ior, fkr, fkt, R, T);\n    fkt = 1-fkr;\n    if (twosided == 0 && N.I > 0)\n\tfkr = 0;\n    return  fkt * basecolor * (Ka*ambient() + Kd*diffuse(Nf))\n          + (Ks) * specular(Nf,V,roughness)\n\t  + SampleEnvironment (P, R, fkr*Kr, blur, ENVPARAMS);\n}\n\n\n\n/* Compute the color of the surface using a simple metal-like BRDF.  To\n * give a metallic appearance, both diffuse and specular components are \n * scaled by the color of the metal.  It is recommended that Kd < 0.1,\n * Ks > 0.5, and roughness > 0.15 to give a believable metallic appearance.\n * If twosided is nonzero, both sides are shiny, but if you know that\n * the object has N facing outward, twosided==0 is a good optimization\n * (especially when using the ray server).\n */\ncolor MaterialShinyMetal (normal Nf;  color basecolor;\n                          float Ka, Kd, Ks, roughness, Kr, blur;\n\t\t\t  uniform float twosided;\n                          DECLARE_ENVPARAMS;)\n{\n    extern point P;\n    extern vector I;\n    extern normal N;\n    float kr = Kr;\n    if (twosided == 0 && N.I > 0)\n\tkr = 0;\n    vector IN = normalize(I), V = -IN;\n    vector R = reflect (IN, Nf);\n    return basecolor * (Ka*ambient() + Kd*diffuse(Nf) +\n                        Ks*specular(Nf,V,roughness) + \n                        SampleEnvironment (P, R, kr, blur, ENVPARAMS));\n}\n\n\n\n/* Compute the color of the surface of a very rough, totally nonspecular\n * material like clay.  Use an Oren/Nayar BRDF for the diffuse term.\n */\ncolor MaterialClay (normal Nf;  color basecolor;\n                    float Ka, Kd, roughness;)\n{\n    extern vector I;\n    return basecolor * (Ka*ambient() + \n\t\t\tKd*LocIllumOrenNayar(Nf,-normalize(I),roughness));\n}\n\n\n/* Compute the color of the surface using an anisotropic BRDF.  To\n * give a metallic appearance, both diffuse and specular components are \n * scaled by the color of the metal.  It is recommended that Kd < 0.1,\n * Ks > 0.5, and roughness > 0.15 to give a believable metallic appearance.\n */\ncolor MaterialBrushedMetal (normal Nf;  color basecolor;\n                            float Ka, Kd, Ks;\n                            vector xdir;  float uroughness, vroughness;)\n{\n    extern vector I;\n    color spec = LocIllumWardAnisotropic (Nf, -normalize(I), \n\t\t\t\t\t  xdir, uroughness, vroughness);\n    return basecolor * (Ka*ambient() + Kd*diffuse(Nf) + Ks*spec);\n}\n\n\n/* Compute the color of a ceramic object.  Like plastic, but use a\n * \"glossy\" specular term.\n */\ncolor MaterialCeramic (normal Nf;  color basecolor;\n                       float Ka, Kd, Ks, roughness, specsharpness;)\n{\n    extern vector I;\n    vector V = -normalize(I);\n    return basecolor * (Ka*ambient() + Kd*diffuse(Nf))\n              + Ks * LocIllumGlossy (Nf, V, roughness/10, specsharpness);\n}\n\n\n\n/* Compute the color of a glass-like surface with coherent reflections\n * and refractions.\n */\ncolor MaterialGlass (normal Nf;  color basecolor;\n                     float Ka, Kd, Ks, roughness, Kr, reflblur;\n\t\t     float Kt, refrblur, eta;\n\t\t     color transmitcolor;\n\t\t     uniform float refrrayjitter, refrraysamples;\n\t\t     DECLARE_ENVPARAMS;)\n{\n    extern point P;\n    extern vector I;\n    extern normal N;\n\n    vector IN = normalize (I);\n\n    /* Compute the reflection & refraction directions and amounts */\n    vector Rfldir, Rfrdir;   /* Smooth reflection/refraction directions */\n    float kr, kt;\n    fresnel (IN, Nf, (I.N < 0) ? 1.0/eta : eta, kr, kt, Rfldir, Rfrdir);\n    kt = 1-kr;   /* Physically incorrect, but portable */\n    kr *= Kr;\n    kt *= Kt;\n#if (defined(BMRT) || defined(RAYSERVER_H))\n    /* Speedup -- at deep ray levels, reflection is unimportant */\n    if (raylevel() > 0)\n\tkr = 0;\n#endif\n#ifndef BMRT\n    /* Speedup for PRMan -- don't shade back sides, but you HAVE to be sure\n     * that normals correctly face outward.\n     */\n    if (N.I > 0)\n\tkr = kt = 0;\n#endif\n\n    /* Calculate the reflection & refraction color */\n    color Crefl = SampleEnvironment (P, normalize(Rfldir), kr, reflblur,\n\t\t\t\t     ENVPARAMS);\n    color Crefr = SampleEnvironment (P, normalize(Rfrdir), kt, refrblur,\n\t\t\t\t     envname, envspace, envrad, \n\t\t\t\t     refrrayjitter, refrraysamples);\n    return (basecolor * (Ka*ambient() + Kd*diffuse(Nf)) +\n\t    (Crefl + Ks*LocIllumGlossy(Nf,-IN,roughness,0.5)) +\n\t    transmitcolor * Crefr);\n}\n\n\n\n#endif /* defined(MATERIAL_H) */\n\n"
  },
  {
    "path": "share/k3d/shaders/k3d_noises.h",
    "content": "/************************************************************************\n * noises.h - various noise-based patterns\n *\n * Author: Larry Gritz (gritzl@acm.org), though they're obvious to any\n *         experience shader writer.\n *\n * Reference:\n *   _Advanced RenderMan: Creating CGI for Motion Picture_, \n *   by Anthony A. Apodaca and Larry Gritz, Morgan Kaufmann, 1999.\n *\n * $Revision: 1.7 $    $Date: 2006/03/17 17:31:39 $\n *\n ************************************************************************/\n\n\n#ifndef NOISES_H\n#define NOISES_H 1\n\n\n#ifndef FILTERWIDTH_H\n#include \"k3d_filterwidth.h\"    /* Needed for filterwidth and friends */\n#endif\n\n#ifndef PATTERNS_H\n#include \"k3d_patterns.h\"    /* Needed for filteredabs */\n#endif\n\n\n\n\n#ifndef snoise\n/*\n * Signed noise -- the original Perlin kind with range (-1,1) We prefer\n * signed noise to regular noise mostly because its average is zero.\n * We define three simple macros:\n *   snoise(p) - Perlin noise on either a 1-D (float) or 3-D (point) domain.\n *   snoisexy(x,y) - Perlin noise on a 2-D domain.\n *   vsnoise(p) - vector-valued Perlin noise on either 1-D or 3-D domain.\n */\n#define snoise(p) (2 * (float noise(p)) - 1)\n#endif\n\n#define snoise2(x) (2.5*(noise(x)-0.5))   /* need to check this one */\n#define snoisexy(x,y) (2 * (float noise(x,y)) - 1)\n#define vsnoise(p) (2 * (vector noise(p)) - 1)\n#define DNoise(x) ((2*(point noise(x))) - point(1,1,1))\n#define fnoise(p,width) (noise(p) * (1-smoothstep (0.2,0.75,width)))\n#define adjustNoise(x, y, minVal, maxVal) snoisexy (x,y) * ((maxVal)-(minVal)+(minVal))\n\n\n\n/* uniformly distributed noise\n *\n */\n#define udn(x,lo,hi) (smoothstep(.25, .75, noise(x)) * ((hi) - (lo)) + (lo))\n#define udn2(x,y,lo,hi) (smoothstep(.25, .75, noise(x,y)) * ((hi)-(lo))+(lo))\n\n\n/* If we know the filter size, we can crudely antialias snoise by fading\n * to its average value at approximately the Nyquist limit.\n */\n#define filteredsnoise(p,width) (snoise(p) * (1-smoothstep (0.2,0.75,width)))\n#define filteredvsnoise(p,width) (vsnoise(p) * (1-smoothstep (0.2,0.75,width)))\n\n\n\n/* fractional Brownian motion\n * Inputs: \n *    p, filtwidth   position and approximate inter-pixel spacing\n *    octaves        max # of octaves to calculate\n *    lacunarity     frequency spacing between successive octaves\n *    gain           scaling factor between successive octaves\n */\nfloat fBm (point p; float filtwidth;\n           uniform float octaves, lacunarity, gain)\n{\n    uniform float amp = 1;\n    varying point pp = p;\n    varying float sum = 0, fw = filtwidth;\n    uniform float i;\n\n    for (i = 0;  i < octaves;  i += 1) {\n#pragma nolint\n\tsum += amp * filteredsnoise (pp, fw);\n\tamp *= gain;  pp *= lacunarity;  fw *= lacunarity;\n    }\n    return sum;\n}\n\n\n/* Typical use of fBm: */\n#define fBm_default(p)  fBm (p, filterwidthp(p), 4, 2, 0.5)\n\n\n\n\n\n/* A vector-valued antialiased fBm. */\nvector\nvfBm (point p; float filtwidth;\n      uniform float octaves, lacunarity, gain)\n{\n    uniform float amp = 1;\n    varying point pp = p;\n    varying vector sum = 0;\n    varying float fw = filtwidth;\n    uniform float i;\n\n    for (i = 0;  i < octaves;  i += 1) {\n#pragma nolint\n\tsum += amp * filteredvsnoise (pp, fw);\n\tamp *= gain;  pp *= lacunarity;  fw *= lacunarity;\n    }\n    return sum;\n}\n\n\n/* Typical use of vfBm: */\n#define vfBm_default(p)  vfBm (p, filterwidthp(p), 4, 2, 0.5)\n\n\n\n/* The stuff that Ken Musgrave calls \"VLNoise\" */\n#define VLNoise(Pt,scale) (snoise(vsnoise(Pt)*scale+Pt))\n#define filteredVLNoise(Pt,fwidth,scale) \\\n            (filteredsnoise(filteredvsnoise(Pt,fwidth)*scale+Pt,fwidth))\n\n\nfloat\nVLfBm (point p; float filtwidth;\n       uniform float octaves, lacunarity, gain, scale)\n{\n    uniform float amp = 1;\n    varying point pp = p;\n    varying float sum = 0;\n    varying float fw = filtwidth;\n    uniform float i;\n\n    for (i = 0;  i < octaves;  i += 1) {\n#pragma nolint\n\tsum += amp * filteredVLNoise (pp, fw, scale);\n\tamp *= gain;  pp *= lacunarity;  fw *= lacunarity;\n    }\n    return sum;\n}\n\n\n/* Typical use of vfBm: */\n#define VLfBm_default(p)      VLfBm (p, filterwidthp(p), 4, 2, 0.5, 1.0)\n\n\n\n\n/* Antialiased turbulence.  Watch out -- the abs() call introduces infinite\n * frequency content, which makes our antialiasing efforts much trickier!\n */\nfloat turbulence (point p; float filtwidth;\n                  uniform float octaves, lacunarity, gain)\n{\n    extern float du, dv;   /* Needed for filterwidth macro */\n    uniform float amp = 1;\n    varying point pp = p;\n    varying float sum = 0, fw = filtwidth;\n    uniform float i;\n\n    for (i = 0;  i < octaves;  i += 1) {\n#pragma nolint\n\tfloat n = filteredsnoise (pp, fw);\n\tsum += amp * filteredabs (n, fw);\n\tamp *= gain;  pp *= lacunarity;  fw *= lacunarity;\n    }\n    return sum;\n}\n\n\n/* Typical use of turbulence: */\n#define turbulence_default(p)  turbulence (p, filterwidthp(p), 4, 2, 0.5)\n\n\n\n\n/***************************************************************************\n * Voronoi cell noise (a.k.a. Worley noise) functions\n *\n * These functions assume that space is filled with \"features\" (points\n * of interest).  There are interestingpatterns we can make by\n * figuring out which feature we are closest to, or to what extent\n * we're on the boundary between two features.  Several varieties of\n * these computations are below, categorized by the dimension of their\n * domains, and the number of close features they are interested in.\n *\n * All these functions have similar inputs:\n *   P      - position to test (for 3-D varieties; 2-D varieties use ss,tt)\n *   jitter - how much to jitter the cell center positions (1 is typical,\n *             smaller values make a more regular pattern, larger values\n *             make a more jagged pattern; use jitter >1 at your risk!).\n * And outputs:\n *   f_n    - distance to the nth nearest feature (f1 is closest, f2 is\n *            the distance to the 2nd closest, etc.)\n *   pos_n  - the position of the nth nearest feature.  For 2-D varieties,\n *            these are instead spos_n and tpos_n.\n ***************************************************************************/\n\n/* Voronoi cell noise (a.k.a. Worley noise) -- 3-D, 1-feature version. */\nvoid\nvoronoi_f1_3d (point P;\n\t       float jitter;\n\t       output float f1;\n\t       output point pos1;\n    )\n{\n    point thiscell = point (floor(xcomp(P))+0.5, floor(ycomp(P))+0.5,\n\t\t\t    floor(zcomp(P))+0.5);\n    f1 = 1000;\n    uniform float i, j, k;\n    for (i = -1;  i <= 1;  i += 1) {\n        for (j = -1;  j <= 1;  j += 1) {\n            for (k = -1;  k <= 1;  k += 1) {\n\t\tpoint testcell = thiscell + vector(i,j,k);\n                point pos = testcell + \n\t\t            jitter * (vector cellnoise (testcell) - 0.5);\n\t\tvector offset = pos - P;\n                float dist = offset . offset; /* actually dist^2 */\n                if (dist < f1) {\n                    f1 = dist;  pos1 = pos;\n                }\n            }\n\t}\n    }\n    f1 = sqrt(f1);\n}\n\n\n/* Voronoi cell noise (a.k.a. Worley noise) -- 3-D, 2-feature version. */\nvoid\nvoronoi_f1f2_3d (point P;\n\t\t float jitter;\n\t\t output float f1;  output point pos1;\n\t\t output float f2;  output point pos2;\n    )\n{\n    point thiscell = point (floor(xcomp(P))+0.5, floor(ycomp(P))+0.5,\n\t\t\t    floor(zcomp(P))+0.5);\n    f1 = f2 = 1000;\n    uniform float i, j, k;\n    for (i = -1;  i <= 1;  i += 1) {\n        for (j = -1;  j <= 1;  j += 1) {\n            for (k = -1;  k <= 1;  k += 1) {\n\t\tpoint testcell = thiscell + vector(i,j,k);\n                point pos = testcell + \n\t\t            jitter * (vector cellnoise (testcell) - 0.5);\n\t\tvector offset = pos - P;\n                float dist = offset . offset; /* actually dist^2 */\n                if (dist < f1) {\n                    f2 = f1;  pos2 = pos1;\n                    f1 = dist;  pos1 = pos;\n                } else if (dist < f2) {\n                    f2 = dist;  pos2 = pos;\n\t\t}\n            }\n\t}\n    }\n    f1 = sqrt(f1);  f2 = sqrt(f2);\n}\n\n\n/* Voronoi cell noise (a.k.a. Worley noise) -- 2-D, 1-feature version. */\nvoid\nvoronoi_f1_2d (float ss, tt;\n\t       float jitter;\n\t       output float f1;\n\t       output float spos1, tpos1;\n    )\n{\n    float sthiscell = floor(ss)+0.5, tthiscell = floor(tt)+0.5;\n    f1 = 1000;\n    uniform float i, j;\n    for (i = -1;  i <= 1;  i += 1) {\n\tfloat stestcell = sthiscell + i;\n        for (j = -1;  j <= 1;  j += 1) {\n\t    float ttestcell = tthiscell + j;\n\t    float spos = stestcell +\n\t\t     jitter * (float cellnoise(stestcell, ttestcell) - 0.5);\n\t    float tpos = ttestcell +\n\t\t jitter * (float cellnoise(stestcell+23, ttestcell-87) - 0.5);\n\t    float soffset = spos - ss;\n\t    float toffset = tpos - tt;\n\t    float dist = soffset*soffset + toffset*toffset;\n\t    if (dist < f1) {\n\t\tf1 = dist;\n\t\tspos1 = spos;  tpos1 = tpos;\n\t    }\n\t}\n    }\n    f1 = sqrt(f1);\n}\n\n\n/* Voronoi cell noise (a.k.a. Worley noise) -- 2-D, 2-feature version. */\nvoid\nvoronoi_f1f2_2d (float ss, tt;\n\t\t float jitter;\n\t\t output float f1;\n\t\t output float spos1, tpos1;\n\t\t output float f2;\n\t\t output float spos2, tpos2;\n    )\n{\n    float sthiscell = floor(ss)+0.5, tthiscell = floor(tt)+0.5;\n    f1 = f2 = 1000;\n    uniform float i, j;\n    for (i = -1;  i <= 1;  i += 1) {\n\tfloat stestcell = sthiscell + i;\n        for (j = -1;  j <= 1;  j += 1) {\n\t    float ttestcell = tthiscell + j;\n\t    float spos = stestcell +\n\t\t   jitter * (cellnoise(stestcell, ttestcell) - 0.5);\n\t    float tpos = ttestcell +\n\t\t   jitter * (cellnoise(stestcell+23, ttestcell-87) - 0.5);\n\t    float soffset = spos - ss;\n\t    float toffset = tpos - tt;\n\t    float dist = soffset*soffset + toffset*toffset;\n\t    if (dist < f1) {\n\t\tf2 = f1;  spos2 = spos1;  tpos2 = tpos1;\n\t\tf1 = dist;  spos1 = spos;  tpos1 = tpos;\n\t    } else if (dist < f2) {\n\t\tf2 = dist;\n\t\tspos2 = spos;  tpos2 = tpos;\n\t    }\n\t}\n    }\n    f1 = sqrt(f1);  f2 = sqrt(f2);\n}\n\n\n#endif /* NOISES_H */\n"
  },
  {
    "path": "share/k3d/shaders/k3d_oak.h",
    "content": "/****************************************************************************\n * oak.h - contains the oaktexture function, which is common to many\n *         shader which make wood grain patterns.  It looks very much\n *         like oak, and can also pass for ...\n *\n ***************************************************************************\n *\n * Author: Larry Gritz, 1999\n *\n * Contacts:  lg@pixar.com\n *\n * $Revision: 1.1 $    $Date: 2004/05/19 18:15:19 $\n *\n ****************************************************************************/\n\n#include \"k3d_noises.h\"\n\n\n/* oaktexture -- generate a pattern much like the rings and grain of\n *    oak wood.  Rings are centered on the z axis, so the caller should\n *    position the space of Pshad so that the grain goes the way you want.\n *    Note: this function takes derivatives, so it shouldn't be called \n *    from within varying conditionals or loops.\n * Inputs:\n *    Pshad, dPshad - sample point & its derivative\n *    ringfreq - mean frequency of ring spacing\n *    ringunevenness - 0=equally spaced rings, larger is unequally spaced\n *    grainfreq - frequency of the fine grain\n *    ringnoise, ringnoisefreq - general warping of the domain\n *    trunkwobble, trunkwobblefreq - controls noise which wobbles the\n *        axis of the trunk so that it's not perfectly on the z axis.\n *    angularwobble, angularwobblefreq - warping indexed by angle about\n *        the z axis.\n *    ringy, grainy - overall scale on the degree to which rings and\n *        grain are weighted.  0 turns one off, 1 makes full effect.\n * Return value: 0 when in the \"background\" light wood, 1 when in the\n *    darkest part of a ring or grain.\n */\nfloat\noaktexture (point Pshad;  float dPshad;\n\t    float ringfreq, ringunevenness, grainfreq;\n\t    float ringnoise, ringnoisefreq;\n\t    float trunkwobble, trunkwobblefreq;\n\t    float angularwobble, angularwobblefreq;\n\t    float ringy, grainy;)\n{\n    /* We shade based on Pshad, but we add several layers of warping: */\n    /* Some general warping of the domain */\n    vector offset = vfBm(Pshad*ringnoisefreq,dPshad*ringnoisefreq, 2, 4, 0.5);\n    point Pring = Pshad + ringnoise*offset;\n    /* The trunk isn't totally steady xy as you go up in z */\n    Pring += trunkwobble * \n               vsnoise(zcomp(Pshad)*trunkwobblefreq) * vector(1,1,0);\n\n    /* Calculate the radius from the center. */\n    float r2 = sqr(xcomp(Pring)) + sqr(ycomp(Pring));\n    float r = sqrt(r2) * ringfreq;\n    /* Add some noise around the trunk */\n    r += angularwobble * smoothstep(0,5,r)\n\t   * snoise (angularwobblefreq*(Pring)*vector(1,1,0.1));\n\n    /* Now add some noise so all rings are not equal width */\n    extern float du, dv;\n    float dr = filterwidth(r);\n    r += ringunevenness*filteredsnoise(r,dr);\n\n    float inring = smoothpulsetrain (.1, .55, .7, .95, 1, r);\n\n    point Pgrain = Pshad*grainfreq*vector(1,1,.05);\n    float dPgrain = filterwidthp(Pgrain);\n    float grain = 0;\n    float i, amp=1;\n    for (i = 0;  i < 2;  i += 1) {\n\tfloat grain1valid = 1-smoothstep(.2,.6,dPgrain);\n\tif (grain1valid > 0) {\n\t    float g = grain1valid * snoise (Pgrain);\n\t    g *= (0.3 + 0.7*inring);\n\t    g = pow(clamp(0.8 - (g),0,1),2);\n\t    g = grainy * smoothstep (0.5, 1, g);\n\t    if (i == 0)\n\t\tinring *= (1-0.4*grain1valid);\n\t    grain = max (grain, g);\n\t}\n\tPgrain *= 2;\n\tdPgrain *= 2;\n\tamp *= 0.5;\n    }\n\n    return mix (inring*ringy, 1, grain);\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/k3d_patterns.h",
    "content": "/************************************************************************\n * patterns.h - Some handy functions for various patterns.  Wherever\n *              possible, antialiased versions will also be given.\n *\n * Author: Larry Gritz (gritzl@acm.org)\n *\n * Reference:\n *   _Advanced RenderMan: Creating CGI for Motion Picture_, \n *   by Anthony A. Apodaca and Larry Gritz, Morgan Kaufmann, 1999.\n *\n * $Revision: 1.2 $    $Date: 2006/03/17 16:00:41 $\n *\n ************************************************************************/\n\n\n\n#ifndef PATTERNS_H\n#define PATTERNS_H 1\n\n#include \"k3d_filterwidth.h\"\n#include \"k3d_functions.h\"\n\n\n\n/* Antialiased abs().  \n * Compute the box filter of abs(t) from x-dx/2 to x+dx/2.\n * Hinges on the realization that the indefinite integral of abs(x) is \n * sign(x) * 1/2 x*x;\n */\nfloat filteredabs (float x, dx)\n{\n    float integral (float t) {\n\treturn sign(t) * 0.5 * t*t;\n    }\n\n    float x0 = x - 0.5*dx;\n    float x1 = x0 + dx;\n    return (integral(x1) - integral(x0)) / dx;\n}\n\n\n\n\n/* Antialiased smoothstep(e0,e1,x).  \n * Compute the box filter of smoothstep(e0,e1,t) from x-dx/2 to x+dx/2.\n * Strategy: divide domain into 3 regions: t < e0, e0 <= t <= e1,\n * and t > e1.  Region 1 has integral 0.  Region 2 is computed by\n * analytically integrating smoothstep, which is -2t^3+3t^2.  Region 3\n * is trivially 1.\n */\nfloat filteredsmoothstep (float e0, e1, x, dx)\n{\n    float integral (float t) {\n\treturn -0.5*t*t * (t*t + t);\n    }\n\n    /* Compute x0, x1 bounding region of integration, and normalize so that\n     * e0==0, e1==1\n     */\n    float edgediff = e1 - e0;\n    float x0 = (x-e0)/edgediff;\n    float fw = dx / edgediff;\n    x0 -= 0.5*fw;\n    float x1 = x0 + fw;\n\n    /* Region 1 always contributes nothing */\n    float int = 0;\n    /* Region 2 - compute integral in region between 0 and 1 */\n    if (x0 < 1 && x1 > 0)\n\tint += integral(min(x1,1)) - integral(max(x0,0));\n    /* Region 3 - is 1.0 */\n    if (x1 > 1)\n\tint += x1-max(1,x0);\n    return int / fw;\n}\n\n\n\n/* A 1-D pulse pattern:  return 1 if edge0 <= x <= edge1, otherwise 0 */\nfloat pulse(float edge0, edge1, x)\n{\n    return step(edge0,x) - step(edge1,x);\n}\n\n\n\nfloat filteredpulse (float edge0, edge1, x, dx)\n{\n    float x0 = x - dx/2;\n    float x1 = x0 + dx;\n    return max (0, (min(x1,edge1)-max(x0,edge0)) / dx);\n}\n\n\n\n/* A pulse train: a signal that repeats with a given period, and is\n * 0 when 0 <= mod(x,period) < edge, and 1 when mod(x,period) > edge.\n */\nfloat pulsetrain (float edge, period, x)\n{\n    return pulse (edge, period, mod(x,period));\n}\n\n\n/* Filtered pulse train: it's not as simple as just returning the mod\n * of filteredpulse -- you have to take into account that the filter may\n * cover multiple pulses in the train.\n * Strategy: consider the function that is the integral of the pulse\n * train from 0 to x. Just subtract!\n */\nfloat filteredpulsetrain (float edge, period, x, dx)\n{\n    /* First, normalize so period == 1 and our domain of interest is > 0 */\n    float w = dx/period;\n    float x0 = x/period - w/2;\n    float x1 = x0+w;\n    float nedge = edge / period;   /* normalized edge value */\n\n    /* Definite integral of normalized pulsetrain from 0 to t */\n    float integral (float t) { \n        extern float nedge;\n        return ((1-nedge)*floor(t) + max(0,t-floor(t)-nedge));\n    }\n\n    /* Now we want to integrate the normalized pulsetrain over [x0,x1] */\n    return (integral(x1) - integral(x0)) / w;\n}\n\n\n\nfloat\nsmoothpulse (float e0, e1, e2, e3, x)\n{\n    return smoothstep(e0,e1,x) - smoothstep(e2,e3,x);\n}\n\n\nfloat\nfilteredsmoothpulse (float e0, e1, e2, e3, x, dx)\n{\n    return filteredsmoothstep(e0,e1,x,dx) - filteredsmoothstep(e2,e3,x,dx);\n}\n\n\n\n/* A pulse train of smoothsteps: a signal that repeats with a given\n * period, and is 0 when 0 <= mod(x/period,1) < edge, and 1 when\n * mod(x/period,1) > edge.  \n */\nfloat smoothpulsetrain (float e0, e1, e2, e3, period, x)\n{\n    return smoothpulse (e0, e1, e2, e3, mod(x,period));\n}\n\n\n\n/* varyEach takes a computed color, then tweaks each indexed item\n * separately to add some variation.  Hue, saturation, and lightness\n * are all independently controlled.  Hue adds, but saturation and\n * lightness multiply.\n */\ncolor varyEach (color Cin; float index, varyhue, varysat, varylum;)\n{\n    /* Convert to \"hsl\" space, it's more convenient */\n    color Chsl = ctransform (\"hsl\", Cin);\n    float h = comp(Chsl,0), s = comp(Chsl,1), l = comp(Chsl,2);\n    /* Modify Chsl by adding Cvary scaled by our separate h,s,l controls */\n    h += varyhue * (cellnoise(index+3)-0.5);\n    s *= 1 - varysat * (cellnoise(index-14)-0.5);\n    l *= 1 - varylum * (cellnoise(index+37)-0.5);\n    Chsl = color (mod(h,1), clamp(s,0,1), clamp(l,0,1));\n    /* Clamp hsl and transform back to rgb space */\n    return ctransform (\"hsl\", \"rgb\", clamp(Chsl,color 0, color 1));\n}\n\n\n\n/* Given 2-D texture coordinates ss,tt and their filter widths ds, dt,\n * and the width and height of the grooves between tiles (assuming that\n * tile spacing is 1.0), figure out which (integer indexed) tile we are\n * on and what coordinates (on [0,1]) within our individual tile we are\n * shading.\n */\nfloat\ntilepattern (float ss, tt, ds, dt;\n\t     float groovewidth, grooveheight;\n\t     output float swhichtile, twhichtile;\n\t     output float stile, ttile;)\n{\n    swhichtile = floor (ss);\n    twhichtile = floor (tt);\n    stile = ss - swhichtile;\n    ttile = tt - twhichtile;\n\n    return filteredpulsetrain (groovewidth, 1, ss+groovewidth/2, ds)\n             * filteredpulsetrain (grooveheight, 1, tt+grooveheight/2, dt);\n}\n\n\n\n/* basic brick tiling pattern --\n *   inputs:\n *      x, y                    positions on a 2-D surface\n *      tilewidth, tileheight   dimensions of each tile\n *      rowstagger              how much does each row stagger relative to\n *                                   the previous row\n *      rowstaggervary          how much should rowstagger randomly vary\n *      jaggedfreq, jaggedamp   adds noise to the edge between the tiles\n *   outputs:\n *      row, column             index which tile the sample is in\n *      xtile, ytile            position within this tile (0-1)\n */\nvoid basicbrick (float x, y;\n\t\tuniform float tilewidth, tileheight;\n\t\tuniform float rowstagger, rowstaggervary;\n\t\tuniform float jaggedfreq, jaggedamp;\n\t\toutput float column, row;\n\t\toutput float xtile, ytile;\n    )\n{\n    point PP;\n    float scoord = x, tcoord = y;\n\n    if (jaggedamp != 0.0) {\n\t/* Make the shapes of the bricks vary just a bit */\n\tPP = point noise (x*jaggedfreq/tilewidth, y*jaggedfreq/tileheight);\n\tscoord += jaggedamp * xcomp (PP);\n\ttcoord += jaggedamp * ycomp (PP);\n    }\n\n    xtile = scoord / tilewidth;\n    ytile = tcoord / tileheight;\n    row = floor (ytile);   /* which brick row? */\n\n    /* Shift the columns randomly by row */\n    xtile += mod (rowstagger * row, 1);\n    xtile += rowstaggervary * (noise (row+0.5) - 0.5);\n\n    column = floor (xtile);\n    xtile -= column;\n    ytile -= row;\n}\n\n\n\n#endif /* defined(PATTERNS_H) */\n"
  },
  {
    "path": "share/k3d/shaders/k3d_proctext.h",
    "content": "/* I took wave's lead and renamed proctexh.h to DPProctext.h -- tal@cs.caltech.edu */\n\n/*\n * Preprocessor macros for use in RenderMan shaders.\n * Darwyn Peachey, June, 1994.\n *\n * removing redundant functions and adding correct includes.\n * 2006-03-13 dan@3-e.net\n * as you can see this file is redundant and all inludes that use it need to \n * be change to call the two below.\n */\n#include \"k3d_noises.h\"\n#include \"k3d_functions.h\"\n\n/* Not used in any k3d_*.sl file, refer to pulse(a,b,fuzz,x) in k3d_rmannotes.h\n *\n * #define PULSE(a,b,x) (step((a),(x)) - step((b),(x)))\n *\n */\n"
  },
  {
    "path": "share/k3d/shaders/k3d_project.h",
    "content": "/************************************************************************\n * project.h - Routines for texture projection\n *\n * Author: Larry Gritz (gritzl@acm.org)\n *\n * $Revision: 1.1 $    $Date: 2004/05/19 18:15:20 $\n *\n ************************************************************************/\n\n\n\n#ifndef PROJECT_H\n#define PROJECT_H 1\n\n\n#ifndef FILTERWIDTH_H\n#include \"k3d_filterwidth.h\"\n#endif\n\n\n/* Project 3-D points onto a unit sphere centered at the origin */\nvoid\nspherical_projection (point p; output float ss, tt, ds, dt;)\n{\n    extern float du, dv;    /* Used by the filterwidth macro */\n    vector V = normalize(vector p);\n    ss = (-atan (ycomp(V), xcomp(V)) + PI) / (2*PI);\n    tt = 0.5 - acos(zcomp(V)) / PI;\n    ds = filterwidth (ss);\n    if (ds > 0.5)\n\tds = max (1-ds, MINFILTWIDTH);\n    dt = filterwidth (tt);\n    if (dt > 0.5)\n\tdt = max (1-dt, MINFILTWIDTH);\n}\n    \n\n\n/* Project 3-D points onto a cylinder about the z-axis between z=0 and z=1 */\nvoid\ncylindrical_projection (point p; output float ss, tt, ds, dt;)\n{\n    extern float du, dv;    /* Used by the filterwidth macro */\n    vector V = normalize(vector p);\n    ss = (-atan (ycomp(V), xcomp(V)) + PI) / (2*PI);\n    tt = zcomp(p);\n    ds = filterwidth (ss);\n    if (ds > 0.5)\n\tds = max (1-ds, MINFILTWIDTH);\n    dt = filterwidth (tt);\n}\n\n\n\n\nvoid\nProjectTo2D (string projection;\n\t     point P; string whichspace;\n\t     matrix xform;\n\t     output float ss, tt;\n\t     output float ds, dt; )\n{\n    point Pproj;\n    extern float du, dv;    /* Used by the filterwidth macro */\n    if (projection == \"st\") {\n\textern float s, t;\n\tPproj = point (s, t, 0);\n    } else {\n        Pproj = transform (whichspace, P);\n    }\n#pragma nolint 2\n    Pproj = transform (xform, Pproj);\n    if (projection == \"planar\" || projection == \"st\") {\n\tss = xcomp(Pproj);\n\ttt = ycomp(Pproj);\n\tds = filterwidth (ss);\n\tdt = filterwidth (tt);\n    }\n    else if (projection == \"perspective\") {\n\tfloat z = max (zcomp(Pproj), 1.0e-6);  /* avoid zero division */\n\tss = xcomp(Pproj) / z;\n\ttt = ycomp(Pproj) / z;\n\tds = filterwidth (ss);\n\tdt = filterwidth (tt);\n    }\n    /* Special cases for the projections that may wrap */\n    else if (projection == \"spherical\")\n\tspherical_projection (Pproj, ss, tt, ds, dt);\n    else if (projection == \"cylindrical\")\n\tcylindrical_projection (Pproj, ss, tt, ds, dt);\n}\n\n\n\ncolor\nGetColorTextureAndAlpha (string texturename;\n\t\t\t string projection;\n\t\t\t point P; string whichspace;\n\t\t\t matrix xform;\n\t\t\t float blur;\n\t\t\t uniform float alphachannel;\n\t\t\t output float alpha;\n    )\n{\n    float ss, tt, ds, dt;\n    ProjectTo2D (projection, P, whichspace, xform, ss, tt, ds, dt);\n    ds *= 0.5;  dt *= 0.5;\n    color Ct = color texture (texturename, ss-ds, tt-dt, ss+ds, tt-dt,\n\t\t\t      ss-ds, tt+dt, ss+ds, tt+dt, \"blur\", blur);\n    alpha = float texture (texturename[alphachannel], ss-ds, tt-dt,\n\t\t\t   ss+ds, tt-dt, ss-ds, tt+dt, ss+ds, tt+dt,\n\t\t\t   \"blur\", blur, \"fill\", 1);\n    return Ct;\n}\n\n\n\nfloat\nGetFloatTextureAndAlpha (string texturename;\n\t\t\t string projection;\n\t\t\t point P; string whichspace;\n\t\t\t matrix xform;\n\t\t\t float blur;\n\t\t\t uniform float alphachannel;\n\t\t\t output float alpha;\n    )\n{\n    float ss, tt, ds, dt;\n    ProjectTo2D (projection, P, whichspace, xform, ss, tt, ds, dt);\n    ds *= 0.5;  dt *= 0.5;\n    float val = float texture (texturename, ss-ds, tt-dt, ss+ds, tt-dt,\n\t\t\t       ss-ds, tt+dt, ss+ds, tt+dt, \"blur\", blur);\n    alpha = float texture (texturename[alphachannel], ss-ds, tt-dt,\n\t\t\t   ss+ds, tt-dt, ss-ds, tt+dt, ss+ds, tt+dt,\n\t\t\t   \"blur\", blur, \"fill\", 1);\n    return val;\n}\n\n\n\ncolor\nApplyColorTextureOver (color basecolor;\n\t\t       string texturename;\n\t\t       string projection;\n\t\t       point P; string whichspace;\n\t\t       matrix xform;\n\t\t       float blur;\n    )\n{\n    float alpha;\n    color Ct = GetColorTextureAndAlpha (texturename, projection, P, whichspace,\n\t\t\t\t\txform, blur, 3, alpha);\n    return Ct + (1-alpha)*basecolor;\n}\n\n\n\nfloat\nApplyFloatTextureOver (float baseval;\n\t\t       string texturename;\n\t\t       string projection;\n\t\t       point P; string whichspace;\n\t\t       matrix xform;\n\t\t       float blur;\n    )\n{\n    float alpha;\n    float x = GetFloatTextureAndAlpha (texturename, projection, P, whichspace,\n\t\t\t\t\txform, blur, 3, alpha);\n    return x + (1-alpha)*baseval;\n}\n\n\n/* Helper function to convert arrays of 16 floats to matrices */\nmatrix array_to_mx (float mx[16])\n{\n    return matrix (mx[0], mx[1], mx[2], mx[3],\n\t\t   mx[4], mx[5], mx[6], mx[7],\n\t\t   mx[8], mx[9], mx[10], mx[11],\n\t\t   mx[12], mx[13], mx[14], mx[15]);\n}\n\n\n\n\n#endif /* PROJECT_H */\n"
  },
  {
    "path": "share/k3d/shaders/k3d_pshad.h",
    "content": "/************************************************************************\n * pshad.h - define macros for easy use of reference meshes and texture\n *           spaces.\n *\n * This file is meant to be included in shaders which use solid\n * texturing.  It provides two macros:\n *\n * PSHAD_PARAMS(space,freq) - put this macro in the parameter list of \n *                your shader to declare a shadingspace parameter (and \n *                optionally Pref, if USE_PREF is nonzero).  Takes as\n *                arguments the default shading space name and frequency.\n *\n * DEFAULT_PSHAD_PARAMS - calls PSHAD_PARAMS with default space \"shader\"\n *                and default frequency 1.\n *\n * GET_PSHAD    - put this in the body of your shader, near the top.\n *                It sets Pshad to the shading coordinates of P (or Pref,\n *                if provided), and sets dPshad to the expected change\n *                in Pshad between adjacent shading samples.\n *\n * This file expects that the .sl file #define's the symbol USE_PREF\n * _prior_ to inclusion of this header file.  \n *\n * Author: Larry Gritz (gritzl@acm.org)\n *\n * Reference:\n *   _Advanced RenderMan: Creating CGI for Motion Picture_, \n *   by Anthony A. Apodaca and Larry Gritz, Morgan Kaufmann, 1999.\n *\n * $Revision: 1.1 $    $Date: 2004/05/19 18:15:20 $\n *\n ************************************************************************/\n\n\n#ifndef PSHAD_H\n#define PSHAD_H 1\n\n\n#ifndef FILTERWIDTH_H\n#include \"k3d_filterwidth.h\"    /* Needed for filterwidth and friends */\n#endif\n\n\n\n/* If USE_PREF is not defined prior to inclusion of this file, assume\n * that Pref will not be used.\n */\n#ifndef USE_PREF\n#define USE_PREF 0\n#endif\n\n#if (USE_PREF)\n\n/* Pick an unlikely point value to let us recognize an uninitialized,\n * and therefore nonexistant, Pref.\n */\n#define UNINITIALIZED_PREF point (-1e10, -1e10, -1e10)\n\n#define PSHAD_PARAMS(spacedefault,freqdefault) \\\n                     varying point Pref = UNINITIALIZED_PREF;           \\\n                     string shadingspace = spacedefault;                \\\n                     float shadingfreq = freqdefault\n\n#define GET_PSHAD    varying point Pshad;                               \\\n                     if (Pref != UNINITIALIZED_PREF)                    \\\n                          Pshad = transform (shadingspace, Pref);       \\\n                     else Pshad = transform (shadingspace, P);          \\\n                     Pshad *= shadingfreq;                              \\\n                     float dPshad = filterwidthp(Pshad)\n\n#else /* if (USE_PREF) */\n\n#define PSHAD_PARAMS(spacedefault,freqdefault) \\\n                     string shadingspace = spacedefault;                \\\n                     float shadingfreq = freqdefault\n\n#define GET_PSHAD    varying point Pshad;                               \\\n                     Pshad = shadingfreq * transform (shadingspace, P); \\\n                     float dPshad = filterwidthp(Pshad)\n\n#endif /* USE_PREF */\n\n#define DEFAULT_PSHAD_PARAMS PSHAD_PARAMS(\"shader\",1)\n\n#endif /* defined(PSHAD_H) */\n"
  },
  {
    "path": "share/k3d/shaders/k3d_rayserver.h",
    "content": "/* rayserver.h - Shading Language (PRMan side) include file for ray server.\n * \n * These macros translate calls to trace(), visibility(), and\n * rayhittest() into calls to rayserver().  Each generates different\n * numbers of args, allowing rayserver() to be pathmorphic.\n *\n * It is assumed that the rayserver() function itself is implemented\n * as a DSO shadeop.  (See docs for PRMan 3.8 or later.)\n *\n * Note that the ray server expects its data in world space.\n *\n * Author: Larry Gritz (lg@bmrt.org)\n *\n * Reference:  \n *   Gritz, Larry, \"Ray Tracing in PRMan (with a little help from\n *   BMRT)\".  Appeared in: Apodaca and Gritz, eds., \"Advanced\n *   RenderMan: Beyond the Companion\", SIGGRAPH '98 course notes\n *   (Course #11), July 20, 1998.\n */\n\n#ifndef RAYSERVER_H\n#define RAYSERVER_H\n\n#ifndef BMRT\n\n/* PRMan side only -- BMRT already knows these functions */\n\n#define worldp(p) transform(\"world\",p)\n#define worldv(v) vtransform(\"world\",v)\n\n#define trace(p,d) rayserver(worldp(p), worldv(d))\n\n#define visibility(from,to) rayserver(worldp(from), worldp(to))\n\n#define rayhittest(p,d,phit,nhit) \\\n        rayserver(worldp(p), worldv(d), phit,nhit)\n\n#define fulltrace(p,d,chit,hitdist,phit,nhit,pmiss,rmiss) \\\n        rayserver(worldp(p),worldv(d), chit,hitdist,phit,nhit,pmiss,rmiss)\n\n#define areashadow(Ps,nsamples) rayserver(worldp(Ps), nsamples, __lightname)\n\n#define rs_indirect(Ps,Ns) \\\n        rayserver_indirect(worldp(Ps), normalize(worldv(Ns)))\n\nfloat raylevel () { return 0; }\nfloat isshadowray () { return 0; }\n\n#endif\n\n#endif\n"
  },
  {
    "path": "share/k3d/shaders/k3d_raysphere.h",
    "content": "/************************************************************************\n * raysphere.h - intersect a ray with a sphere (this is a useful\n *               solution to subproblems that crop up frequently)\n *\n * Author: Larry Gritz (gritzl@acm.org).\n *\n * Reference:\n *   _Advanced RenderMan: Creating CGI for Motion Picture_, \n *   by Anthony A. Apodaca and Larry Gritz, Morgan Kaufmann, 1999.\n *\n * $Revision: 1.1 $    $Date: 2004/05/19 18:15:20 $\n *\n ************************************************************************/\n\n\n#ifndef RAYSPHERE_H\n#define RAYSPHERE_H 1\n\n\n/* raysphere - calculate the intersection of ray (E,I) with a sphere\n * centered at the origin and with radius r.  We return the number of\n * intersections found (0, 1, or 2), and place the distances to the\n * intersections in t0, t1 (always with t0 <= t1).  Ignore any hits\n * closer than eps.\n */\nfloat\nraysphere (point E; vector I;   /* Origin and unit direction of the ray */\n           float r;             /* radius of sphere */\n\t   float eps;           /* epsilon - ignore closer hits */\n\t   output float t0, t1; /* distances to intersection */\n    )\n{\n    /* Set up a quadratic equation -- note that a==1 if I is normalized */\n    float b = 2 * ((vector E) . I);\n    float c = ((vector E) . (vector E)) - r*r;\n    float discrim = b*b - 4*c;\n    float solutions;\n    if (discrim > 0) {           /* Two solutions */\n\tdiscrim = sqrt(discrim);\n\tt0 = (-discrim - b) / 2;\n\tif (t0 > eps) {\n\t    t1 = (discrim - b) / 2;\n\t    solutions = 2;\n\t} else {\n\t    t0 = (discrim - b) / 2;\n\t    solutions = (t0 > eps) ? 1 : 0;\n\t}\n    } else if (discrim == 0) {  /* One solution on the edge! */\n\tt0 = -b/2;\n\tsolutions = (t0 > eps) ? 1 : 0;\n    } else {                    /* Imaginary solution -> no intersection */\n\tsolutions = 0;\n    }\n    return solutions;\n}\n\n\n#endif\n"
  },
  {
    "path": "share/k3d/shaders/k3d_reflections.h",
    "content": "/************************************************************************\n * reflections.h - Functions which compute reflected light by either\n *                 ray tracing or environment mapping.\n *\n * Author: Larry Gritz (gritzl@acm.org)\n *\n * $Revision: 1.1 $    $Date: 2004/05/19 18:15:20 $\n *\n ************************************************************************/\n\n\n#ifndef REFLECTIONS_H\n#define REFLECTIONS_H\n\n#include \"k3d_filterwidth.h\"\n#include \"k3d_raysphere.h\"\n\n\n/* ReflMap() - Use a reflection map for reflections in flat objects.\n * Inputs are:\n *    reflname - filename of reflection map\n *    P - origin of traced ray\n *    blur - amount of additional blur to add to environment map\n * Outputs are:\n *    return value - the color of incoming light\n *    alpha - opacity of reflection map lookup in the direction R.\n * Warning -  the texture call itself takes derivatives, causing\n * trouble if called inside a loop or varying conditional!  Be cautious.\n */\ncolor ReflMap ( string reflname;  point P; float blur;\n                output float alpha; )\n{\n    /* Transform to the space of the environment map */\n    point Pndc = transform (\"NDC\", P);\n    float x = xcomp(Pndc), y = 1-ycomp(Pndc);\n    alpha = float texture (reflname[3], x, y, \"blur\", blur, \"fill\", 1);\n    return color texture (reflname, x, y, \"blur\", blur);\n}\n\n\n\n/* Environment() - A replacement for ordinary environment() lookups, this\n * function ray traces against an environment sphere of known, finite \n * radius.  Inputs are:\n *    envname - filename of environment map\n *    envspace - name of space environment map was made in\n *    envrad - approximate supposed radius of environment sphere\n *    P, R - position and direction of traced ray\n *    blur - amount of additional blur to add to environment map\n * Outputs are:\n *    return value - the color of incoming environment light\n *    alpha - opacity of environment map lookup in the direction R.\n * Warning -  the environment call itself takes derivatives, causing\n * trouble if called inside a loop or varying conditional!  Be cautious.\n */\ncolor Environment ( string envname, envspace;  uniform float envrad;\n                    point P;  vector R;  float blur; output float alpha;)\n{\n    /* Transform to the space of the environment map */\n    point Psp = transform (envspace, P);\n    vector Rsp = normalize (vtransform (envspace, R));\n    uniform float r2 = envrad * envrad;\n    /* Clamp the position to be *inside* the environment sphere */\n    if ((vector Psp).(vector Psp) > r2)\n        Psp = point (envrad * normalize (vector Psp));\n    float t0, t1;\n    if (raysphere (Psp, Rsp, envrad, 1.0e-4, t0, t1) > 0)\n\tRsp = vector (Psp + t0 * Rsp);\n    alpha = float environment (envname[3], Rsp, \"blur\", blur, \"fill\", 1);\n    return color environment (envname, Rsp, \"blur\", blur);\n}\n\n\n\n\n/* RayTrace() - A fancy ray trace routine, particularly suitable for\n * use with the \"ray server.\"  Tries to sample over the surface\n * element and over the varying ray spread due to surface curvature.\n * An ordinary call to trace would point sample the environment in a\n * very simplistic way.  This function takes the size of the surface\n * facet and curvature of the surface into account, and lets you\n * sample the space with multiple rays.\n * \n * Inputs:\n *    P - surface position\n *    Rdir - the unit-length reflection direction.\n *    blur - reflection blurriness; 0 = sharp reflection\n *    jitter - when 1, fully jitter the stochastic ray directions.  Lower\n *          numbers jitter less, 0 doesn't jitter.  Lowering jitter may help\n *          alleviate \"sparkling\" due to animation with low nrays.\n *    nsamples - number of rays with which to sample.  Larger numbers will\n *          yield better-sampled reflections, but will be more expensive.\n *          Note that the function reduces this number for secondary rays,\n *          assuming that the distribution from primary rays will be\n *          sufficient!\n * Return value: the average of the trace calls.\n * \n * Warning!!! This function takes derivatives to find out the ray spread!\n * This can cause trouble if RayTrace() is called inside a loop or varying\n * conditional!  Be cautious.\n */\ncolor\nRayTrace (point P;  vector Rdir;  float Kr, blur, jitter;  \n          uniform float nsamples;  output float alpha;)\n{\n#if (defined(BMRT) || defined(RAYSERVER_H))\n    float rand () {\n        extern float jitter;\n        return (raylevel()==0) ? (0.5 + jitter * (float random() - 0.5)) : 0.5;\n    }\n    extern float du, dv;\n    color C, Ct;\n    float hitdist; point Phit, Pmiss;  vector Nhit, Rmiss;\n    float bluramt = blur + filterwidthp(Rdir);\n    uniform float nrays = (raylevel() == 0 ? max(1,ceil(sqrt(nsamples))) : 1);\n    vector Tu = Du(P) * (1.5 * du); /* overblur just a tad... */\n    vector Tv = Dv(P) * (1.5 * dv);\n    if (Kr < 0.0001) {\n\tC = 0;\n    } else if (bluramt > 0 || nrays > 1) {\n        /* Construct orthogonal components to Rdir */\n        vector uoffset = blur * normalize (vector (zcomp(Rdir) - ycomp(Rdir),\n                                                   xcomp(Rdir) - zcomp(Rdir),\n                                                   ycomp(Rdir) - xcomp(Rdir)));\n        vector voffset = Rdir ^ uoffset;\n        uniform float i, j;\n        C = 0;  alpha = 0;\n        for (i = 0;  i < nrays;  i += 1) {\n            for (j = 0;  j < nrays;  j += 1) {\n                /* Add a random offset to the smooth reflection vector */\n                vector R = Rdir + ((i + rand())/nrays - 0.5) * uoffset +\n                                  ((j + rand())/nrays - 0.5) * voffset;\n\t\tR = normalize(R);\n                point Pray = P +  ((j + rand())/nrays - 0.5) * Tu +\n                                  ((i + rand())/nrays - 0.5) * Tv;\n#pragma nolint 3  /* this call intentionally passes uninitialized vars */\n\t\tfulltrace (Pray, R, Ct, hitdist, Phit, Nhit, Pmiss, Rmiss);\n\t\tC += Ct;\n\t\talpha += 1 - step(1.0e10,hitdist);\n            }\n        }\n\tuniform float totrays = nrays*nrays;\n        C /= totrays;   alpha /= totrays;\n    } else {\n        /* No blur or curvature, just do a simple trace */\n#pragma nolint 2  /* this call intentionally passes uninitialized vars */\n\tfulltrace (P, Rdir, C, hitdist, Phit, Nhit, Pmiss, Rmiss);\n\talpha = 1 - step(1.0e10,hitdist);\n    }\n    return C;\n#else\n    return color 0;\n#endif\n}\n\n\n\n\n\n#define ENVPARAMS \\\n        envname, envspace, envrad, rayjitter, raysamples\n\n#define DECLARE_ENVPARAMS                           \\\n        string envname, envspace;                   \\\n        uniform float envrad, rayjitter, raysamples\n\n#define DECLARE_DEFAULTED_ENVPARAMS                                 \\\n        string envname = \"\", envspace = \"world\";                    \\\n        uniform float envrad = 100, rayjitter = 0, raysamples = 1\n\n\n\ncolor\nSampleEnvironment (point P;  vector R;  float Kr, blur;  DECLARE_ENVPARAMS;)\n{\n    color C = 0;\n    float alpha;\n    if (envname != \"\") {\n\tif (envspace == \"NDC\")\n\t    C = ReflMap (envname, P, blur, alpha);\n\telse\n\t    C = Environment (envname, envspace, envrad, P, R, blur, alpha);\n    }\n#if (defined(BMRT) || defined(RAYSERVER_H))\n    color Cray = RayTrace (P, R, Kr, sqrt(blur), rayjitter, raysamples, alpha);\n    C = Cray + (1-alpha) * C;\n#endif\n    return Kr * C;\n}\n\n\n\n\n#endif /* defined(REFLECTIONS_H) */\n\n"
  },
  {
    "path": "share/k3d/shaders/k3d_rmannotes.h",
    "content": "/* rmannotes.sl\n * \n * macros to be used in conjunction with shaders described in\n * the RManNotes web pages. \n *   http://www.cgrg.ohio-state.edu/~smay/RManNotes\n *\n */\n#include \"k3d_noises.h\"\n#include \"k3d_filterwidth.h\"\n#include \"k3d_functions.h\"\n\n#define pulse(a,b,fuzz,x) (smoothstep((a)-(fuzz),(a),(x)) - \\\n\t\t\t   smoothstep((b)-(fuzz),(b),(x)))\n\n#define repeat(x,freq)    (mod((x) * (freq), 1.0))\n\n#define odd(x)            (mod((x), 2) == 1)\n#define even(x)           (mod((x), 2) == 0)\n\n#define whichtile(x,freq) (floor((x) * (freq)))\n\n/* rotate2d()\n *\n * 2D rotation of point (x,y) about origin (ox,oy) by an angle rad.\n * The resulting point is (rx, ry).\n *\n */\n#define rotate2d(x,y,rad,ox,oy,rx,ry) \\\n  rx = ((x) - (ox)) * cos(rad) - ((y) - (oy)) * sin(rad) + (ox); \\\n  ry = ((x) - (ox)) * sin(rad) + ((y) - (oy)) * cos(rad) + (oy)\n\n/* topolar2d()\n * \n * 2D cartesian -> polar coordinates\n * converts the point (x,y) to radius 'r' and angle 'theta' (in radians).\n * theta will be in the range [-PI,PI].\n *\n */\n#define topolar2d(x, y, r, theta) \\\n  r = sqrt((x) * (x) + (y) * (y)); \\\n  theta = atan(y, x) \n\n/* boolean ops (from Perlin85)\n *\n */\n#define intersection(a,b) ((a) * (b))\n#define union(a,b)        ((a) + (b) - (a) * (b))\n#define difference(a,b)   ((a) - (a) * (b))\n#define complement(a)     (1 - (a))\n\n\n/* blend() and lerp() are equivalent. blend() is used as a substitute for\n * mix because it allows non-scalar 3rd arguments.\n *\n */\n#define blend(a,b,x) ((a) * (1 - (x)) + (b) * (x))\n#define lerp(a,b,x)  ((a) * (1 - (x)) + (b) * (x))\n\n\n"
  },
  {
    "path": "share/k3d/shaders/k3d_tile.h",
    "content": "/* \ttile.h\n\t\ta file to produce an antaliased tiling pattern\n*/\n\n\n\n/* this function considers a square wave pulse, with a given period and width,\nthe width being expressed as a proportion of the period, and so varying between 0 and 1 */\nfloat integratedpulse (\t\t\t\t\tfloat x, pulseperiod, pulsewidth;\n\t\t\t\t\t\t\t\t\t\t\t\toutput\tfloat which, offset)\n\t{\n\t\tfloat where = x / pulseperiod;\n\t\twhich = floor(where);\n\t\toffset = where - which;\n\t\t/* sum up the contribution of all tiles except the present */\n\t\tfloat basetotal = which * pulsewidth;\n\t\tfloat thistile = offset - min(max(0, offset - pulsewidth / 2), 1 - pulsewidth);\n\t\treturn (thistile + basetotal) * pulseperiod;\n\t} \n\n/*\nGiven the dimensions of a series of tiles, works out which tile we are in, and the\ncoordinates within that tile (normalized to the range 0 - 1). It returns a float\nrepresenting a filtered calculation of the extent the current micropolygon lies\nwithin an edge (1 = all within edge, 0 = all within tile).\nNote that the parameters sedge, tedge give the total width of the edge, so that e.g there\nwill be an edge of width sedge / 2 on both the left and right of the tile \n*/\n\nfloat tile(\t\tfloat ss,\t\t\t\t\t\t\t\t\t/* current s texture coordinate */\n\t\t\t\t\t\t\t\t\t\ttt, \t\t\t\t\t\t\t\t/* current t texture coordinate */\n\t\t\t\t\t\t\t\t\t\tswidth, \t\t\t\t\t\t/* width of tile in s direction */\n\t\t\t\t\t\t\t\t\t\ttwidth, \t\t\t\t\t\t/* width of tile in t direction */\n\t\t\t\t\t\t\t\t\t\tsfiltwidth, \t\t\t\t/* size of antalias filter in s direction */\n\t\t\t\t\t\t\t\t\t\ttfiltwidth, \t\t\t\t/* size of antalias filter in t direction */\n\t\t\t\t\t\t\t\t\t\tsedge, \t\t\t\t\t\t\t/* tile edge in t direction, as a proportion of tile size (0 - 1)*/\n\t\t\t\t\t\t\t\t\t\ttedge;\t\t\t\t\t\t\t/* tile edge in s direction, as a proportion of tile size (0 - 1)*/\n\t\t\t\t\t\t\toutput float \tswhich,\t\t\t/* s coordinate of which tile we are in (an integer) */\n\t\t\t\t\t\t\t\t\t\t\t\t\t \ttwhich,\t\t\t/* t coordinate of which tile we are in (an integer) */\n\t\t\t\t\t\t\t\t\t\t\t\t\t \tsoffset,\t\t/* s offset within tile (0 - 1) */\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttoffset)\t\t/* t offset within tile (0 - 1) */\n\t{\n\t\tfloat sintegral = integratedpulse(ss + sfiltwidth, swidth, sedge, swhich, soffset); \t\n\t\tfloat tintegral = integratedpulse(tt + tfiltwidth, twidth, tedge, twhich, toffset); \t\n\t\tsintegral = abs(sintegral - integratedpulse(ss, swidth, sedge, swhich, soffset)) \n\t\t\t/sfiltwidth;\n\t\ttintegral = abs(tintegral - integratedpulse(tt, twidth, tedge, twhich, toffset)) \n\t\t\t/tfiltwidth;\n\t\t/*printf(\"soffset = %f\\tsfiltwidth = %f\\tsintegral = %f\\n\",soffset,sfiltwidth, sintegral); */\n\t\treturn max(sintegral, tintegral);\n\t}\n\n"
  },
  {
    "path": "share/k3d/shaders/light/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.sl k3d/shaders/light)\nK3D_ADD_SHARE_FILES(*.slmeta k3d/shaders/light)\n\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_ambientlight.sl",
    "content": "/* ambientlight.sl - Standard ambient light source for RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nlight k3d_ambientlight(float intensity = 1;\n\t\t       color lightcolor = 1;\n  )\n{\n  Cl = intensity * lightcolor;\n  L = 0;\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_ambientlight.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"light\" name=\"k3d_ambientlight\">\n\t\t\t<description>Standard ambient light source for RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"intensity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"lightcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_distant_shadow.sl",
    "content": "light k3d_distant_shadow(\n\tfloat  intensity=1 ;\n\tcolor  lightcolor=1 ;\n\tpoint from = point \"shader\" (0,0,0) ;\n\tpoint to   = point \"shader\" (0,0,1) ;\n\tstring shadowname=\"\";\n\tfloat  samples=16;\n\tfloat  blur=.01;\n\tfloat  bias=.01;\n\t)\n{\n\tsolar(to - from, 0.0)\n\t{\n\t\tCl = intensity * lightcolor;\n\n\t\tif(shadowname != \"\")\n\t\t{\n\t\t\tCl *= 1 - shadow(shadowname, Ps, \"samples\", samples, \"blur\", blur, \"bias\", bias);\n\t\t}\n\n\t}\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_distant_shadow.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"light\" name=\"k3d_distant_shadow\">\n\t\t\t<description>Distant light source that uses a shadow map</description>\n\t\t\t<authors>Aqsis</authors>\n\t\t\t<argument name=\"intensity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"lightcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"from\" storage_class=\"uniform\" type=\"point\" extended_type=\"point\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"to\" storage_class=\"uniform\" type=\"point\" extended_type=\"point\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"0 0 -1\"/>\n\t\t\t<argument name=\"shadowname\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"samples\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"16\"/>\n\t\t\t<argument name=\"blur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"0.01\"/>\n\t\t\t<argument name=\"bias\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"0.01\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_distantlight.sl",
    "content": "/* distantlight.sl - Standard distant light source for RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nlight k3d_distantlight(float intensity = 1;\n\t\t       color lightcolor = 1;\n\t\t       point from = point \"shader\"(0, 0, 0);\n\t\t       point to = point \"shader\"(0, 0, 1);)\n{\n  solar(to - from, 0) Cl = intensity * lightcolor;\n}\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_distantlight.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"light\" name=\"k3d_distantlight\">\n\t\t\t<description>Standard distant light source for RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"intensity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"lightcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"from\" storage_class=\"uniform\" type=\"point\" extended_type=\"point\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"to\" storage_class=\"uniform\" type=\"point\" extended_type=\"point\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"0 0 -1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_pointlight.sl",
    "content": "/* pointlight.sl - Standard point light source for RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nlight k3d_pointlight(\n\tfloat intensity = 1;\n\tcolor lightcolor = 1;\n\tpoint from = point \"shader\"(0, 0, 0);\n\t)\n{\n\tilluminate(from)\n\t{\n\t\tCl = intensity * lightcolor / (L.L);\n\t}\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_pointlight.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"light\" name=\"k3d_pointlight\">\n\t\t\t<description>Standard point light source for RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"intensity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"3000\"/>\n\t\t\t<argument name=\"lightcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"from\" storage_class=\"uniform\" type=\"point\" extended_type=\"point\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_spotlight.sl",
    "content": "/* spotlight.sl - Standard spot light source for RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nlight k3d_spotlight(\n\tfloat intensity = 1;\n\tcolor lightcolor = 1;\n\tpoint from = point \"shader\"(0, 0, 0);\n\tpoint to = point \"shader\"(0, 0, -1);\n\tfloat coneangle = radians(30);\n\tfloat conedeltaangle = radians(5);\n\tfloat beamdistribution = 2;\n\t)\n{\n\tfloat atten, cosangle;\n\tuniform vector A = normalize(to - from);\n\n\tilluminate(from, A, coneangle)\n\t{\n\t\tcosangle = (L.A) / length(L);\n\t\tatten = pow(cosangle, beamdistribution) / (L.L);\n\t\tatten *= smoothstep(cos(coneangle), cos(coneangle - conedeltaangle), cosangle);\n\t\tCl = atten * intensity * lightcolor;\n\t}\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_spotlight.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"light\" name=\"k3d_spotlight\">\n\t\t\t<description>Standard spot light source for RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"intensity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1000\"/>\n\t\t\t<argument name=\"lightcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"from\" storage_class=\"uniform\" type=\"point\" extended_type=\"point\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"to\" storage_class=\"uniform\" type=\"point\" extended_type=\"point\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"0 0 -1\"/>\n\t\t\t<argument name=\"coneangle\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.523598776\"/>\n\t\t\t<argument name=\"conedeltaangle\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.0872664626\"/>\n\t\t\t<argument name=\"beamdistribution\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"2\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_waterlight.sl",
    "content": "/** k3d_waterlight\n\nCopyright (c) 1995-2004, Timothy M. Shead\n\nA cheap trick to simulate underwater caustics - best used for deep-sea effects\n\n*/\n\nlight k3d_waterlight(\n\tfloat minimum_intensity = 0.3;\n\tfloat maximum_intensity = 1.0;\n\tfloat frequency = 1;\n\tfloat phase = 0;\n\tcolor lightcolor = 1;\n\tstring shadowname=\"\";\n\tfloat  samples=16;\n\tfloat  blur=.01;\n\tfloat  bias=.01;\n\t)\n{\n\tsolar(vector \"shader\" (0, 0, -1), 0)\n\t{\n\t\tCl = mix(minimum_intensity, maximum_intensity, float noise(frequency * Ps)) * lightcolor;\n\t\t\n\t\tif(shadowname != \"\")\n\t\t{\n\t\t\tCl *= 1 - shadow(shadowname, Ps, \"samples\", samples, \"blur\", blur, \"bias\", bias);\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/light/k3d_waterlight.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"light\" name=\"k3d_waterlight\">\n\t\t\t<description>Cheap simulation of underwater light caustic effects</description>\n\t\t\t<authors>Timothy M. Shead</authors>\n\t\t\t<copyright>Copyright (c) 1995-2004, Timothy M. Shead</copyright>\n\t\t\t<argument name=\"minimum_intensity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"maximum_intensity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"2.5\"/>\n\t\t\t<argument name=\"frequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1.0\"/>\n\t\t\t<argument name=\"phase\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.0\"/>\n\t\t\t<argument name=\"lightcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.2 0.6 0.9\"/>\n\t\t\t<argument name=\"shadowname\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"samples\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"16\"/>\n\t\t\t<argument name=\"blur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"0.01\"/>\n\t\t\t<argument name=\"bias\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"shader\" output=\"false\" default_value=\"0.01\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.sl k3d/shaders/surface)\nK3D_ADD_SHARE_FILES(*.slmeta k3d/shaders/surface)\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_bluemarble.sl",
    "content": "/* I took wave's lead and renamed bluemarb to DPBlueMarble.sl -- tal@SpamSucks_cs.caltech.edu */\n\n/* \n * bluemarb.sl\n *\n * AUTHOR: Darwyn Peachy\n *\n * REFERENCES:\n *    _Texturing and Modeling: A Procedural Approach_, by David S. Ebert, ed.,\n *    F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, and Steven Worley.\n *    Academic Press, 1994.  ISBN 0-12-228760-6.\n */\n \n#include \"k3d_proctext.h\"\n\n#define PALE_BLUE        color (0.25, 0.25, 0.35)\n#define MEDIUM_BLUE      color (0.10, 0.10, 0.30)\n#define DARK_BLUE        color (0.05, 0.05, 0.26)\n#define DARKER_BLUE      color (0.03, 0.03, 0.20)\n\ncolor marble_color(float m)\n{\n\treturn color spline(\n\t\tclamp(2 * m + .75, 0, 1),\n\t\tPALE_BLUE, PALE_BLUE,\n\t\tMEDIUM_BLUE, MEDIUM_BLUE, MEDIUM_BLUE,\n\t\tPALE_BLUE, PALE_BLUE,\n\t\tDARK_BLUE, DARK_BLUE,\n\t\tDARKER_BLUE, DARKER_BLUE,\n\t\tPALE_BLUE, DARKER_BLUE);\n}\n\nsurface k3d_bluemarble(\n\tuniform float Ka = 1;\n\tuniform float Kd = 0.8;\n\tuniform float Ks = 0.2;\n\tuniform float texturescale = 2.5;\n\tuniform float roughness = 0.1;\n\t)\n{\n\tpoint NN = normalize(faceforward(N, I));\n\tpoint PP = transform(\"shader\", P) * texturescale;\n\n\tfloat marble = fBm(PP, filterwidthp(PP), 4, 2.17, 1.0 / 2.17);\n\n\tcolor Ct = marble_color(marble);\n\n\tCi = Os * (Ct * (Ka * ambient() + Kd * diffuse(NN)) + Ks * specular(NN, normalize(-I), roughness));\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_bluemarble.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_bluemarble\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.8\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.2\"/>\n\t\t\t<argument name=\"texturescale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.2\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_brick.sl",
    "content": "/*\n * brick.sl -- Surface shader for a bricks.\n *\n * DESCRIPTION:\n *   Makes a wall of bricks.  Need more be said?  OK.  It makes a good\n *   looking staggered brick masonry.  It is especially convincing when\n *   used in conjunction with the \"brickbump\" displacement shader (and\n *   identical parameters).  Every other row of bricks is staggered.\n *   The staggering isn't exact, however, and this variance is controlled\n *   by the \"rowvary\" parameter.\n * \n * PARAMETERS:\n *    Ka, Kd\t\t\tThe usual\n *    brickcolor, mortarcolor\tPretty obvious (default is red bricks)\n *    brickvary                 How much does the brick color vary from\n *     \t\t\t\t   brick to brick?\n *    brickwidth                Width of a brick (in st space)\n *    brickheight               Height of a brick (in st space)\n *    mortarthickness           Thickness of the mortar (in st space)\n *    rowvary                   How much does each row shift?\n *    jagged                    How much do bricks deviate from squares?\n *\n * AUTHOR: written by Larry Gritz, lg AT larrygritz DOT com\n *\n * $Revision: 1.3 $    $Date: 2003/12/24 06:18:06 $\n */\n\n\n#include \"k3d_filterwidth.h\"\n#include \"k3d_noises.h\"\n#include \"k3d_patterns.h\"\n\n\nsurface\nbrick ( float Ka = 1, Kd = 1;\n\tcolor brickcolor = color \"rgb\" (.6,.1,.1);\n\tcolor mortarcolor = color \"rgb\" (.6,.6,.6);\n\tfloat raggedamp = 0.04, raggedfreq = 12;\n        float jagged = 0.006, brickvary = 0.3;\n        float brickwidth = .28, brickheight = .07;\n        float mortarthickness = .014;\n        float rowvary = .5;\n\tfloat pitting = 0.01;\n\tfloat pockfrequency = 10, groovedepth = 0.01;\n    )\n{\n#define sqr(x) ((x)*(x))\n    color bcolor, Ct;\n    normal Nf;\n    float sbrick, tbrick, w, h;\n    float ss, tt;\n    float swidth, twidth;\n    uniform float BMWIDTH = (brickwidth+mortarthickness);\n    uniform float BMHEIGHT = (brickheight+mortarthickness);\n    uniform float MWF = (mortarthickness*0.5/BMWIDTH);\n    uniform float MHF = (mortarthickness*0.5/BMHEIGHT);\n    float whichbrick;\n    float fact, disp;\n\n    /* Determine how wide in s-t space one pixel projects to, relative\n     * the the width and height of a brick.  Overestimate the filter\n     * size by a bit -- it makes the transitions between brick and mortar\n     * a bit smoother.\n     */\n    swidth = 1.5 * max (filterwidth(s), MINFILTWIDTH) / BMWIDTH;\n    twidth = 1.5 * max (filterwidth(t), MINFILTWIDTH) / BMHEIGHT;\n    \n    basicbrick (s, t, BMWIDTH, BMHEIGHT, 0.5, rowvary, 1, jagged,\n\t       sbrick, tbrick, ss, tt);\n\n    /* Make the edges ragged, but different for each brick */\n    whichbrick = 103*sbrick + tbrick;\n    ss += raggedamp * snoisexy ((s+tbrick*5.15)*raggedfreq,\n\t\t\t       (t+sbrick*23.8)*raggedfreq);\n    tt += raggedamp * snoisexy ((s+tbrick*11.4)*raggedfreq,\n\t\t\t       (t+sbrick*7.2)*raggedfreq);\n    ss += raggedamp/2 * snoisexy ((s+tbrick*5.15)*raggedfreq*2,\n\t\t\t\t (t+sbrick*23.8)*raggedfreq*2);\n    tt += raggedamp/2 * snoisexy ((s+tbrick*11.4)*raggedfreq*2,\n\t\t\t\t (t+sbrick*7.2)*raggedfreq*2);\n\n    /* Choose a color for the surface */\n    if (swidth >= 1)\n\tw = 1 - 2*MWF;\n    else w = clamp (filteredpulse (MWF, 1-MWF, ss, swidth), max(1-MWF/swidth,0), 1);\n    if (twidth >= 1)\n\th = 1 - 2*MHF;\n    else h = clamp (filteredpulse (MHF, 1-MHF, tt, twidth), max(1-MHF/twidth,0), 1);\n\n    fact = 1;\n    disp = 0;\n    if (tt < MHF) {\n\t/* We're in the top horizontal groove */\n\tdisp = groovedepth * (sqr((tt)/MHF) - 1);\n    }\n    else if (tt > (1.0-MHF)) {\n      /* Bottom horizontal groove */\n\tdisp = groovedepth * (sqr((1-tt)/MHF) - 1);\n    }\n    if (ss < MWF) {\n\tdisp = min (disp, 0.85 * groovedepth * (sqr(ss/MWF) - 1));\n    }\n    else if (ss > (1.0-MWF)) {\n\tdisp = min (disp, 0.85 * groovedepth * (sqr((1-ss)/MWF) - 1));\n    }\n\n    fact = smoothstep (0, 1.3*MHF, tt) - smoothstep (1.0-1.3*MHF, 1, tt);\n    fact *= (smoothstep (0, 1.3*MWF, ss) - smoothstep (1.0-1.3*MWF, 1, ss));\n    fact = pitting * (0.5 * fact + 0.5);\n    disp -= fact * pow(noise ((ss+sbrick)*pockfrequency/BMHEIGHT,\n\t\t\t      (tt+tbrick)*pockfrequency/BMWIDTH), 0.25);\n\n    P += disp * normalize(N);\n    N = calculatenormal (P);\n    Nf = faceforward (normalize(N),I);\n\n\n    /* Choose a brick color that varies from brick to brick */\n    bcolor = brickcolor * (1 + (brickvary * snoise (whichbrick+0.5)));\n\n    Ct = mix (mortarcolor, bcolor, w*h);\n\n    Oi = Os;\n    Ci = Os * Ct * (Ka * ambient() + Kd*diffuse(Nf));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_brick.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_brick\">\n\t\t\t<description>Makes a good looking staggered brick masonry</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"brickcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"rgb\" output=\"false\" default_value=\"0.6 0.1 0.1\"/>\n\t\t\t<argument name=\"mortarcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"rgb\" output=\"false\" default_value=\"0.6 0.6 0.6\"/>\n\t\t\t<argument name=\"brickvary\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.3\"/>\n\t\t\t<argument name=\"brickwidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".28\"/>\n\t\t\t<argument name=\"brickheight\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".07\"/>\n\t\t\t<argument name=\"mortarthickness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".014\"/>\n\t\t\t<argument name=\"rowvary\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".1\"/>\n\t\t\t<argument name=\"jagged\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.001\"/>\n\t\t\t<argument name=\"raggedamp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.001\"/>\n\t\t\t<argument name=\"raggedfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"12\"/>\n\t\t\t<argument name=\"pitting\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.00\"/>\n\t\t\t<argument name=\"pockfrequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"10\"/>\n\t\t\t<argument name=\"groovedepth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.00\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_brushedmetal.sl",
    "content": "/************************************************************************\n * brushedmetal.sl\n *\n * Description:\n *   Simple anisotropic metal shader.\n * \n * Parameters:\n *   Ka, Kd, Ks - the usual meaning\n *   uroughness, vroughness - separate roughnesses for u and v directions\n *\n * Author: Larry Gritz (gritzl@acm.org)\n *\n * Reference:\n *   _Advanced RenderMan: Creating CGI for Motion Picture_, \n *   by Anthony A. Apodaca and Larry Gritz, Morgan Kaufmann, 1999.\n ************************************************************************/\n\n#include \"k3d_material.h\"\n\nsurface k3d_brushedmetal(float Ka = 1, Kd = 0.1, Ks = .9;\n\t\t\t float uroughness = 0.15, vroughness = 0.5;)\n{\n  normal Nf = faceforward(normalize(N), I);\n  Ci =\n    MaterialBrushedMetal(Nf, Cs, Ka, Kd, Ks, normalize(dPdu), uroughness,\n\t\t\t vroughness);\n  Oi = Os;\n  Ci *= Oi;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_brushedmetal.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_brushedmetal\">\n\t\t\t<description>Simple anisotropic metal shader</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".9\"/>\n\t\t\t<argument name=\"uroughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.15\"/>\n\t\t\t<argument name=\"vroughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_ceramic.sl",
    "content": "/* Author & copyright unknown */\n\n#include \"k3d_material.h\"\n\nsurface k3d_ceramic(float Ka = 1, Kd = 0.5, Ks = .5, roughness = 0.1;\n\t\t    float Kr = 1, blur = 0, eta = 1.5;\n\t\t    float specsharpness = 0.5;\n\t\t    DECLARE_DEFAULTED_ENVPARAMS;)\n{\n  normal Nf = faceforward(normalize(N), I);\n  Ci = MaterialCeramic(Nf, Cs, Ka, Kd, Ks, roughness, specsharpness);\n  Oi = Os;\n  Ci *= Oi;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_ceramic.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_ceramic\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".5\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"Kr\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"blur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"eta\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1.5\"/>\n\t\t\t<argument name=\"specsharpness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"envname\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"envspace\" storage_class=\"uniform\" type=\"string\" extended_type=\"space\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"world\"/>\n\t\t\t<argument name=\"envrad\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"100\"/>\n\t\t\t<argument name=\"rayjitter\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"raysamples\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_checks.sl",
    "content": "/*\n * checks_aa.sl -- RenderMan compatible shader for checks.\n *\n * DESCRIPTION:\n *   Makes a checkered surface, fully antialiased!  This sucker should\n *   look great even at only one sample per pixel.\n * \n * PARAMETERS:\n *   Ka, Kd\t    \twork just like the matte shader\n *   color1, color2     these are the colors which make the pattern\n *   frequency\t\tdetermines the frequency (in s-t space) of the checks\n *\n *\n * AUTHOR: written by Larry Gritz\n *\n * HISTORY:\n *      27 Jan 1994 -- written by lg\n *\n * last modified 27 Jan 1994 by Larry Gritz\n */\n\nsurface k3d_checks(\n\tfloat Ka = 1;\n\tfloat Kd = 1;\n\tfloat Ks = 0.5;\n\tfloat roughness = 0.1;\n\tcolor specularcolor = 1.0;\n\tfloat frequency = 6;\n\tcolor color1 = 0;\n\tcolor color2 = 1;\n\t)\n{\n\tpoint Nf;             /* Forward facing surface normal */\n\tfloat smod, tmod;     /* Texture position within the pattern */\n\tcolor checkcolor;     /* Color of the checks */\n\tfloat x, y;           /* Used to determine pattern */\n\tfloat swidth, twidth, sfuzz, tfuzz;  /* Antialiasing */\n\tfloat Nfactor;        /* Multiplicative factor for AA due to normal */\n\tfloat fuzzmax;        /* max of (sfuzz, tfuzz) */\n\n\tNf = faceforward (normalize(N), I);\n\n\t/* Determine how wide in s-t space one pixel projects to */\n\tswidth = abs(Du(s)*du) + abs(Dv(s)*dv);\n\ttwidth = abs(Du(t)*du) + abs(Dv(t)*dv);\n\n\t/* Figure out amount of fuzziness, taking normal into account */\n\tNfactor = abs (Nf . I) / (length(Nf) * length(I));\n\tsfuzz = .5 * swidth * frequency / Nfactor;\n\ttfuzz = .5 * twidth * frequency / Nfactor;\n\tfuzzmax = max (sfuzz, tfuzz);\n\n\t/* Get the place in the pattern where we're sampling */\n\tsmod = mod (s*frequency, 1);\n\ttmod = mod (t*frequency, 1);\n\n\t/* If the filter width is small enough, compute the pattern color */\n\tif (fuzzmax <= 0.5)\n\t{\n\t\tx = ((smoothstep (.5,.5+sfuzz,smod)) + (1 - smoothstep (0,sfuzz,smod)));\n\t\ty = ((smoothstep (.5,.5+tfuzz,tmod)) + (1 - smoothstep (0,tfuzz,tmod)));\n\t\tcheckcolor = mix (color1, color2, x*y + (1-x)*(1-y));\n\t\t/* Gradually fade in the average color when we get close to the limit */\n\t\tCi = mix (checkcolor, (color1+color2)/2, smoothstep (.125, .5, fuzzmax));\n\t}\n\telse\n\t{ /* otherwise, only use the average color */\n\t\tCi = (color1 + color2) / 2;\n\t}\n\n\t/* Use the matte reflectance formula */\n\tOi = Os;\n\tCi *= Os * (Ka * ambient() + Kd * diffuse(Nf));\n\tCi += Os * (specularcolor * Ks * specular(Nf, normalize(-I), roughness));\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_checks.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_checks\">\n\t\t\t<description>Anti-aliased checkered surface</description>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"frequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"3\"/>\n\t\t\t<argument name=\"color1\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"color2\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_constant.sl",
    "content": "/* constant.sl - Standard constant surface for RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nsurface k3d_constant(\n\tfloat intensity = 1.0;\n\t)\n{\n\tOi = Os;\n\tCi = Os * Cs * intensity;\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_constant.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_constant\">\n\t\t\t<description>Standard constant surface for the RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"intensity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_corktile.sl",
    "content": "/* Renamed to PQcorktile.sl for RMR -- talrmr@SpamSucks_pacbell.net */\n\n/* corktile.sl - a surface shader imitating cork tiling\n *\n * Author: Peter Quint\n * Last Update: 16 October 2000\n *\n * parameters\n *\n * Ka, Kd, Ks, roughness, specularcolor - take their usual meanings\n * Ksgap - the specular component for tile gaps : by default 0.3 * Ks\n * txtscale - the amount of detail / magnification of the image, this also determines\n *   (if tiles=1) the number of tiles fitted into the texture as s and t vary from 0 to 1\n * tiles - the number of tiles in a unit square of texture before txtscale is applied\n *\t (this means the number of tiles actually seen is the square of txtscale * tiles)\n * gap - the size of the gap or groove between tiles, measured as a proportion of the tile,\n *\t thus a gap of .05 will mean that 2.5% of the tile around each edge will be taken up with\n *   the groove (2.5% either side = 5% in total = 0.05)\n * bumpheight - the total height for bump mapped bumps - irregularities on the surface plus\n *   the displacement of the tile itself out of the gap\n * tileheight - the proportion of the bumpheight that is taken up with the rise of the tile from\n * \t the gap between the tiles, the remainder of bumpheight is taken up with the bumps on the \n *   surface of the tile. So if tileheight = 1 there are no bumps on the tile surface, if\n *   tileheight = 0 there are bumps on the tile surface of height tileheight, but no difference\n *   in height between the gap and the tile itself\n *\n * The shader makes an attempt at being self antaliasing\n *\n */\n\n#include \"k3d_noises.h\" /* the standard BMRT include file */\n#include \"k3d_tile.h\"\n\n/* Bias function - Perlin and Hoffert 1989 */\n\nfloat\nbias (float b, x)\n{\n\treturn pow(x, log(b)/log(0.5));\n}\n\ncolor cork(\t\tpoint PP;\n\t\t\t\t\t\t\tfloat txtscale, filtwidth)\n\t{\n\t\t/* \tthe pattern is built up of the sum of two offset noise functions, perturbed slightly\n\t\tand used to select a color from a spline, combined with an overlay of the dark \n\t\tmarkings that characterise cork\n\t\t*/\n\t\tcolor Ct;\n\t\tpoint P2 = transform(\"shader\",PP);\n\t\tpoint PT = P2 * txtscale;\n\t\tfloat fw = filtwidth * txtscale;\n\t\tfloat g;\n\t\tfloat f = fnoise(PT, fw) + fnoise((P2 + 0.553) * txtscale, fw); \n\t\tf = f * fnoise(PT * .854, fw);\n\t\tf = f + (fnoise(PT * 5.342, fw) - .5) * .5;  \n\t\tf = clamp(f, 0, 1);\n\t\tg = fBm((P2 + 8.654) * txtscale, fw, 4, 2, .5);\n\t\tCt = color spline( \tf,\n\t\t\t\t\t\tcolor( 0, 0, 0),\n\t\t\t\t\t\tcolor( .25, 0, 0),\n\t\t\t\t\t\tcolor( .31, .2, 0),\n\t\t\t\t\t\tcolor( .486, .165, .059),\n\t\t\t\t\t\tcolor( .47, .18, .09),\n\t\t\t\t\t\tcolor( .64, .24, .07),\n\t\t\t\t\t\tcolor( .749, .416, .208)\n\t\t\t\t\t\t); \n\t\t/* Overlay the dark markings */\n\t\tif (g > .2)\n\t\t\t{\n\t\t\t\tg = bias(0.8,(g - .2) / .8);\n\t\t\t\tCt = Ct * (1 - g * .65);\n\t\t\t}\n\t\treturn Ct;\n\t}\n\nsurface\nk3d_corktile( \tfloat\tKa = 1;\n          \tfloat\tKd = .75;\n         \t\tfloat\tKs = .3;\n\t\t\t\t\t\tfloat Ksgap = -1;\n         \t\tfloat\troughness = .05;\n\t \t\t\t\t\tfloat\ttxtscale = 1;\n\t\t\t\t\t\tfloat tiles = 1;\n\t\t\t\t\t\tfloat gap = .05;\n\t\t\t\t\t\tcolor specularcolor = 1;\n\t\t\t\t\t\tfloat bumpheight = 0.3;\n\t\t\t\t\t\tfloat tileheight = .8;\n\t\t\t\t\t\tfloat bumpfreq = 0.8;)\n\n{\n\tuniform float Ksg = Ksgap > 0 ? Ksgap : Ks * .3; \n\tuniform float tilewidth = 1 / (tiles * txtscale); \n\tfloat disp, adjust;\n\tpoint PP = transform(\"shader\",P);\n\tfloat filtwidth = filterwidthp(PP),\n\t\t\tswidth = abs(Du(s)*du) + abs(Dv(s)*dv),\n\t\t\ttwidth = abs(Du(t)*du) + abs(Dv(t)*dv),\n\t\t\tstfiltwidth = max(swidth, twidth) / tilewidth,\n\t\t\tsw, tw, so, to;\n\tcolor Cg, Ct;\n\tnormal Nf;\n\tfloat ingap = tile(s, t, tilewidth, tilewidth, swidth, twidth, gap, gap, sw, tw, so, to);\n\t\n\tCt = cork( P, txtscale, filtwidth);\t\n\t/* Calculate color of gap between tiles */\n\tCg = color( .20, 0, 0) + filteredsnoise(PP * txtscale, filtwidth * txtscale) * .2;\n\tso = so > .5 ? 1 - so : so;\n\tto = to > .5 ? 1 - to : to; \n\tadjust = (1 - min(smoothstep(gap * .3, gap * .7, so), smoothstep(gap * .3, gap * .7, to))) * \n\t\t(1  - smoothstep(.2 * gap, gap * .8, stfiltwidth));  \n\tdisp = (tileheight + fnoise(PP * txtscale * bumpfreq + 3, filtwidth * txtscale) * (1 - tileheight)) \n\t\t* bumpheight * (1 - adjust);\n\tNf = faceforward(calculatenormal(P + disp *\tnormalize(N)), I);\n\tNf = normalize(Nf);\n\t/* printf(\"Nf = %p\\n\", Nf);\t */\n\tOi = Os;\n\tCi = Os * (mix( Ct, Cg, ingap) * (Ka*ambient() + Kd*diffuse(Nf)) +\n\t\tspecularcolor * Ks*specular(Nf,-normalize(I),roughness)); \n\t}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_corktile.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_corktile\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".75\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".3\"/>\n\t\t\t<argument name=\"Ksgap\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"-1\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".05\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"tiles\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"gap\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".05\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"bumpheight\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.3\"/>\n\t\t\t<argument name=\"tileheight\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".8\"/>\n\t\t\t<argument name=\"bumpfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.8\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_craters.sl",
    "content": "/*******************************************************************************\n * JBUMcraters.sl -- Lunar-like surface - Jim Bumgardner jbum@jbum.com\n *\n * Voronoi/Worley noise is combined using 1/f scaling to put craters on a surface.\n * Similar tricks can be used to make cork, swiss-cheese, bread, etc.\n ******************************************************************************/\n\n\n#include \"k3d_material.h\"\n#include \"k3d_noises.h\"\n#include \"k3d_patterns.h\"\n\n\nsurface\nk3d_craters ( float Ka = 1, Kd = 0.7, roughness = 0.1;\n   float Km = 0.03;\t/* Depth of crater displacement */\n   float swidth=.6;      /* Size of largest crater relative to s/t mapping */\n   float pitfactor = .7; /* chance of crater occuring in a cell */\n   float octaves=9;      /* number of scales used - use lower numbers for cartoony effects */\n   float lac=1.91341;    /* diameter spacing between successive octaves */\n   float amp=1.91341;    /* amplitude reduction between successive octaves */\n   float jitter=1.0;     /* irregularity of crater spacing */\n  \n   /* you'll get artifacts if you go too much higher than 1 */\n   /* but this can be avoided by looping i,j from -2 to 2 instead of -1 to 1 */\n   float distortamp = 0.0005; /* Crater distortion.  You'll get artifacts if it goes too high. */\n)\n{\n    normal Nf;\n    color\t\tCt;\n\n    float ss, tt, angle, r, rim, uu, a, i, j, sc, asc, lev;\n    float sctr, tctr, scell, tcell,scellctr,tcellctr;\n    float pert=0,rad,pert2;\n    float rmax = swidth/2; /* was /2 */\n    float\trmax1=1000000,rmax2=1000000,rrad1=0,rrad2=0,cellsizescale,ilac;\n\n    ilac = 1/lac;\n\n    /* Add craters */\n\n    for (lev = 0; lev < octaves; lev += 1)\n      {\n\tsc = pow(lac, lev);\n\tasc = 1 / pow(amp, lev);\n\tscellctr = floor(s*sc/swidth);\n\ttcellctr = floor(t*sc/swidth);\n\tcellsizescale = swidth/sc;\n\trrad1 = 0;\n\trrad2 = 0;\n\tfor (i = -1; i <= 1; i += 1) \n\t  {\n\t    scell = scellctr + i;\n\t    for (j = -1; j <= 1; j += 1) \n\t      {\n\t\ttcell = tcellctr + j;\n\t\tif ( cellnoise(7*scell-9.5, 7*tcell+7.5) < pitfactor)\n\t\t  /* xp = (sc*7*scell-9.5,sc*7*tcell+7.5,.5); */\n\t\t  /* if ( fBm_default(xp) < pitfactor)  *//* I like this distribution better - pitf = -1 -> 1 */\n\t\t  {\n\t\t    sctr = cellsizescale * (scell + 0.5 + jitter * cellnoise(scell+0.5, tcell+0.5));\n\t\t    tctr = cellsizescale * (tcell + 0.5 + jitter * cellnoise(scell+3.5, tcell+8.5));\n\t\t    ss = s - sctr;\n\t\t    tt = t - tctr;\n\t\t    r = ss*ss + tt*tt; /* r is distance from center squared */\n\t\t    if (r < rmax1) {\n\t\t      /* rad is size of crater squared */\n\t\t      rad = rmax*ilac;\n\t\t      rad /= sc;\n\t\t      rad *= rad;\n\t\t      rmax2 = rmax1;\n\t\t      rrad2 = rrad1;\n\t\t      rmax1 = r;\n\t\t      rrad1 = rad;\n\t\t    }\n\t\t    else if (r < rmax2) {\n\t\t      /* rad is size of crater squared */\n\t\t      rad = rmax*ilac;\n\t\t      rad /= sc;\n\t\t      rad *= rad;\n\t\t      rmax2 = r;\n\t\t      rrad2 = rad;\n\t\t    }\n\t\t  }\n\t      }\n\t  }\n\t/* Optional Crater Distortion... */\n\tif (distortamp != 0)\n\t  {\n\t    rrad1 += fBm_default(P*sc)*asc*distortamp; /* add crater roughness */\n\t    rrad2 += fBm_default(P*sc)*asc*distortamp; \n\t  }\n\t\n\t/* Seem crater perturbations for each scale */\n\tif (rrad1 > 0 && rmax1 > 0) \n\t  {\n\t    r = smoothstep(0,rrad1,rmax1);\n\t    r = r*(2*r-pow(r,3))+(1-r)*pow(r,3);\n\t    pert += sin(r*PI/2)*asc-asc;\n\t  }\n\tif (rrad2 > 0 && rmax2 > 0) \n\t  {\n\t    r = smoothstep(0,rrad2,rmax2);\n\t    r = r*(2*r-pow(r,3))+(1-r)*pow(r,3);\t\t\t\n\t    pert += sin(r*PI/2)*asc-asc;\n\t  }\n      }\n    \n    P += Km*pert*normalize(N);\n    N = calculatenormal(P);\t\n    Nf = faceforward (normalize(N),I);\n    \n    Ct = Cs;\n    Ci = MaterialClay (Nf, Ct, Ka, Kd, roughness);\n    Oi = Os;  Ci *= Oi;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_craters.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_craters\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"Km\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.05\"/>\n\t\t\t<argument name=\"swidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".2\"/>\n\t\t\t<argument name=\"pitfactor\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"octaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"4\"/>\n\t\t\t<argument name=\"lac\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.91341\"/>\n\t\t\t<argument name=\"amp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.91341\"/>\n\t\t\t<argument name=\"jitter\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.0\"/>\n\t\t\t<argument name=\"distortamp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.01\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_crayon.sl",
    "content": "/* Renamed shader to PQCrayon for RMR -- talrmr@SpamSucks_pacbell.net */\n\n/* crayon.sl - a surface shader making crayon like marks\n\n\tDESCRIPTION\n\n\tThis shader makes the surface look as if it had been shaded with a pastel crayon.\n\tIt makes an attempt at antaliasing.\n\t\n\tPARAMETERS\n\t\n\tKa, Kd, Ks, roughness, specularcolor - work as in the plastic shader\n\ttxtscale  - an overall scaling factor\n\twidth - the width of the crayon strokes - this is scaled by txtscale\n\tmicro - the size of the dots that make up a crayon stroke, relative to the size of\n\t\tthe stroke. By default they are about 15 times smaller\n\tstretch - the length of the stroke relative to its width;\n\tdensity0 - controls the amount of topcolor seen - measured as a proportion - \n\t\tthis should vary between 0 (no topcolor) to 1, .3 would give 30% topcolor;\n\tdensity1 - if different density0 this is the density when t = 1, with a smooth\n\t\tinterpolation of values for density0 when t = 0, thus allowing a \n\t\tgraduation of shading from top to bottom of the object\n\tcolor topcolor, basecolor - the color of the crayon strokes and the color of the ground\n\t\n\tAUTHOR\n\tPeter Quint - Revised Monday, January 10, 2000 \n\n */\n \n \n#include \"k3d_filterwidth.h\"\n#include \"k3d_noises.h\"\n\nfloat\naanoise(float sp, tp, width)\n{\n\t/* an antaliased noise function, which returns noise of a wavelenth always greater than\n\t   twice the micropolygon width */\n\tfloat f, mag, ns;\n\t/* calculate smallest integer f for which width / f < .5 */\n\tf = ceil(width /.5);\n\tmag = max(pow(0.85, f - 1),.1);\n\tns  = mag * snoisexy(sp / f, tp / f) * (1 - smoothstep(0, .5, width / f))\n\t\t+ snoisexy(sp / (f * 1.33), tp / (f * 1.33)) * mag * .25 * smoothstep(0, .5, width / f);\n\treturn ns;\n}\n\n\nsurface k3d_crayon(\n\tfloat Ka = 1;\n\tfloat Kd = .5;\n\tfloat Ks = .1;\n\tfloat roughness = .1;\n\tcolor specularcolor = 1;\n\tfloat txtscale = 1;\n\tfloat width = .05;\n\tfloat micro = 15.32;\n\tfloat stretch = 10;\n\tfloat density0 = 0.8;\n\tfloat density1 = 0.8;\n\tcolor topcolor = color \"rgb\" (1, 0.2, 0.2);\n\tcolor basecolor = color \"rgb\" (0, 0, 0);\n\t)\n{\n  color Csurf;\n    float density = density0 + t * (density1 - density0);\n\t/* work out the density for the current t */\n\tfloat trs = spline(1 - density, 0 , -0.195997, -0.128361, -0.0738346,\t-0.0316483,\n\t\t\t0.00807387,\t0.0445915, 0.084543, 0.150693, 0.2198, 0.527474);\n\t/*  use a spline to read across to the appropriate noise value - this equalisation\n\t\tprocess is described by Steven Worley in Ch 3 of \"Texturing and Modelling a\n\t\tprocedural approach */ \n\tnormal Nf = faceforward (normalize(N),I);\n\tfloat m;\n\tfloat fw = max(filterwidth(s), filterwidth(t)); /* the size of the micropolygon */\n\tfloat smks = aanoise(txtscale * s * micro / width, txtscale * t * micro / width,\n\t \t\ttxtscale * fw * micro / width);\n\tfloat lmks = (aanoise(txtscale * s / width, txtscale * t / (width * stretch), \n\t\ttxtscale * fw / width) + 1) / 2;\n\tsmks = (smks + 1) / 2;\n\tlmks = lmks - smks;\n\tm = smoothstep(trs - .1, trs + .3, lmks);\t\n\tm = clamp(m, 0, 1);\n\tCsurf = mix(basecolor, topcolor, m);\n\tOi = Os;\n    Ci = Os * ( Csurf * (Ka*ambient() + Kd*diffuse(Nf)) +\n\t\tspecularcolor * Ks*specular(Nf,-normalize(I),roughness));\n}\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_crayon.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_crayon\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"width\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".05\"/>\n\t\t\t<argument name=\"micro\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"15.32\"/>\n\t\t\t<argument name=\"stretch\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"10\"/>\n\t\t\t<argument name=\"density0\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"density1\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"topcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 0.2 0.2\"/>\n\t\t\t<argument name=\"basecolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_crayontoon.sl",
    "content": "/* crayonToon.sl Ver. 1.0 Felipe Esquivel\n * Abril 2002    <felipe@siggraph.org.mx>\n * \n * Este shader es un constant con un poco de difusion,\n * hay que escoger con cuidado ambos colores para obtener\n * el estilo deseado. Mi intencion fue hacer un color dependiente\n * del otro pero es mejor dejar al usuario esa eleccion. \n *\n * This shader is a constant with little diffusion, \n * choose wisely both colors to obtain the crayon look. My\n * idea was to make one color dependable of the other but is\n * better to let the user change this.\n */\nsurface k3d_crayontoon(color colorBase = color(1, .92, .44),\n                         colorSombra = color(1, .81, .37);\n                   float eta = 1.3,\n                         Kd = .33;)\n{\n  float Kr1, Kt1;\n  vector Nf = normalize(N);\n\n  fresnel(normalize(I), faceforward(Nf, I, Nf), 1/eta, Kr1, Kt1);\n  if(Kt1 > 1) Kt1 = 1;\n\n  Ci = Os * (mix(colorBase, colorSombra, Kt1) + Kd * Kt1 * diffuse(Nf) * colorBase);\n  Oi = Os;\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_crayontoon.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_crayontoon\">\n\t\t\t<argument name=\"colorBase\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 0.92 0.44\"/>\n\t\t\t<argument name=\"colorSombra\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 0.81 0.37\"/>\n\t\t\t<argument name=\"eta\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.3\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".33\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_dots.sl",
    "content": "/*\n * TLShiftedD_RTile.sl -- generates a surface of alternating disks and rings\n *\n * DESCRIPTION:\n *\tWill generate alternating and shifted rows of disks and rings\n * \n *\n * PARAMETERS:\n *\tKa, Kd, Ks - the usual\n *  roughness -  Contols the specular reflection\n *\tinnerRadius - inner ring\n *\touterRadius - outer ring\n *\tsfreq - # of tiles in s\n *\ttfreq - # of tiles in t \n *\tspecularcolor - color of specular highlight\n * \n * HINTS:\n *\tThe center varible should really be placed in the parameter list \n *      (remember to set the right space)\n *  Also, it would be better to set the width of the ring rather than\n *      specifing the inner and outer ring.\n *  Another thing that might be useful is to add a parameter to \n *      choose which row to do first.\n * \n * AUTHOR: Tal Lancaster\n *\ttal@SpamSucks_cs.caltech.edu\n *\n * History:\n *\tCreated: 8/12/95\n */ \n#include \"k3d_rmannotes.h\"\n#include \"k3d_functions.h\"\n#include \"k3d_patterns.h\"\n\nsurface k3d_dots (\n\tuniform float Ka = 1;\n\tuniform float Kd = .5;\n\tuniform float Ks = .5;\n\tuniform float roughness = .1;\n\tuniform float innerRadius = 0.3;    /* inner ring */\n\tuniform float outerRadius = 0.45;   /* outer ring */\n\tuniform float sfreq = 4.0;          /* # of tiles in s */\n\tuniform float tfreq = 4.0;          /* # of tiles in t */\n\tuniform color dotcolor = color(1, 0, 0);  /* foreground color */\n\tuniform color specularcolor = 1;)\n{\n\tpoint Nf;\n\tuniform point center;      /* Center of disk */\n\tcolor surfColor;   /* Color of surface */ \n\tfloat mix_opacity; /* How much to mix between the surfaces */\n\tfloat ss, tt;      /* tiled s, t */\n\tfloat row, col;    /* used to determine which tile we are in */\n\tfloat d;           /* distance from center of current tile */\n\tfloat wasOdd;      /* True if test was odd */\n\t\n\tNf = faceforward (normalize(N),I);\n\n\tcenter = (0.5, 0.5, 0);  /* This should really be */\n\t                         /* put in the paramter list */\n\n \trow = whichtile (t, tfreq);\n\t\n\tif (isOdd(row) == 0) {\n\t\tss = mod (s * sfreq + 0.5, 1);\n\t\twasOdd = 0;\n\t}\n\telse {\n\t\tss = repeat (s, sfreq);\n\t\twasOdd = 1;\n\t}\n\t\n\ttt = repeat (t, tfreq);\n\td = distance (center, (ss, tt, 0));\n\n\t/* Do ring */\n\tmix_opacity = filteredpulse (innerRadius, outerRadius, d, filterwidth(d));\n\t\t\n\tsurfColor = mix (Cs, dotcolor, mix_opacity);\n\t\n\tOi = Os;\n\tCi = Os * (surfColor * (Ka*ambient() + Kd*diffuse(Nf)) +\n\t      specularcolor * Ks*specular(Nf,-normalize(I),roughness));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_dots.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_dots\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"innerRadius\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.0\"/>\n\t\t\t<argument name=\"outerRadius\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.45\"/>\n\t\t\t<argument name=\"sfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"4.0\"/>\n\t\t\t<argument name=\"tfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"4.0\"/>\n\t\t\t<argument name=\"dotcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0 0 1\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_easysurface.sl",
    "content": "/* Copyrighted Pixar 1989 */\n/* From the RenderMan Companion p.363 */\n/* Listing 16.22  Surface shader for use without a light source*/\n\n/*\n * easysurface(): orientation-sensitive surface shading without a light source\n */\n\nsurface k3d_easysurface(\n\tfloat Kd = 0.8;\n\tfloat Ka = 0.2;\n\tfloat falloff= 2.0;\n\t)\n{\n\tfloat diffuse;\n\tpoint II = normalize(I);\n\tpoint NN = normalize(N);\n\n\tdiffuse = II.NN / (II.II * NN.NN);\n\tdiffuse = pow(diffuse, falloff);\n\n\tCi = Cs * (Ka + Kd * diffuse);\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_easysurface.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_easysurface\">\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".8\"/>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".2\"/>\n\t\t\t<argument name=\"falloff\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"2.0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_environment_plastic.sl",
    "content": "surface k3d_environment_plastic(\n\tfloat Ka = 1.0;\n\tfloat Kd = 0.5;\n\tfloat Ks = 0.5;\n\tfloat roughness = 0.1;\n\tfloat Kr = 1.0;\n\tstring environment_map = \"\";\n\tfloat blur = 0.0;\n\t)\n{\n\tnormal Nf = faceforward(normalize(N), I);\n\tvector R = normalize(reflect(I, N));\n\tcolor reflection = color environment(environment_map, R, \"blur\", blur);\n\t\n\tOi = Os;\n\n\tCi = Cs * (Ka * ambient() + Kd * diffuse(Nf));\n\tCi += Kr * reflection;\n\tCi += Ks * specular(Nf, -normalize(I), roughness);\n\tCi *= Os;\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_environment_plastic.sl.slmeta",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<shaders>\n\t\t<shader name=\"k3d_environment_plastic\" type=\"surface\">\n\t\t\t<description/>\n\t\t\t<authors/>\n\t\t\t<copyright/>\n\t\t\t<argument name=\"Ka\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1.0\"/>\n\t\t\t<argument name=\"Kd\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"Ks\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"roughness\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"Kr\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1.0\"/>\n\t\t\t<argument name=\"environment_map\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"blur\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_envsurf.sl",
    "content": "surface k3d_envsurf (string envname = \"\", envspace = \"world\")\n{\n    if (envname != \"\")\n\tCi = environment (envname, normalize(vtransform(envspace, I)));\n    else Ci = Cs;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_envsurf.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_envsurf\">\n\t\t\t<argument name=\"envname\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"envspace\" storage_class=\"uniform\" type=\"string\" extended_type=\"space\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"world\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_eyeball.sl",
    "content": "/*\n * eyeball.sl -- RenderMan compatible shader for an eyeball.\n *\n * DESCRIPTION:\n *   Makes a plastic-like surface which looks like an eyeball.  It's meant\n *   for use on a sphere.  The center of the pupil is at the \"north pole\",\n *   i.e. where the t parameter is 1.  The colors of the pupil, iris, white\n *   part (eyeball), and blood vessels can be set individually.  Fractal\n *   functions are used for the veining and the iris mottling.\n * \n * PARAMETERS:\n *   Ka, Kd, Ks, roughness, specularcolor - work just like the plastic shader\n *   iriscolor - color of the iris\n *   eyeballcolor - color of the white part of the eyeball\n *   bloodcolor - color of the blood vessels\n *   pupilcolor - color of the pupil (opening)\n *   pupilsize - size of pupil (in \"t\" space)\n *   irissize - size of iris (in \"t\" space), must be larger than pupilsize\n *   bloodshot - controls how bloodshot the eye is (0=no blood, 1=very ugly)\n *   veinfreq, veinlevel - control the formation of the blood vessels\n *   index - set between 0 and 1, lets you use this shader to generate\n *           non-identical eyeballs.\n *\n * ANTIALIASING: basic antialiasing of the boundaries between tissue types\n *               is performed.\n *\n * AUTHOR: written by Larry Gritz\n *\n * HISTORY:\n *      Nov 1991 - crude written of \"eye\" by lg for Herman's eyes for\n *                 \"Graphic Violence\".  Original version hard coded in C.\n *      Dec 1993 - \"eye\" modified by lg to clean up a bit.\n *      10 Jan 1994 - recoded by lg in correct shading language.\n *      28 Jun 94 (lg) - revamped to add veins and iris mottling, renamed\n *                       \"eyeball\"\n *       7 Jan 95 (wave) - changed name to LGEyeBall for namespace reasons...\n *       8 Jan 95 (wave) - changed Ciris line to fix bug Larry figured out and changed defaults\n *       27 Feb 95 (wave) - changed PO line to fix bug Larry figured out to actually *use* index\n *\n * last modified  8 Jan 95 by Michael B. Johnson (wave)\n */\n\n#include \"k3d_filterwidth.h\"\n#include \"k3d_noises.h\" \n#include \"k3d_rmannotes.h\"\n\nsurface\nk3d_eyeball (float Ka = .75, Kd = 0.75, Ks = 0.4, roughness = 0.1;\n\t color specularcolor = 1;\n\t color iriscolor = color (.135289, .084323, .372417);\n\t color irisoutercolor = color (.403882, .343944, .68276);\n\t color irisinnercolor = color (.065142, .040605, .179311);\n\t color eyeballcolor = color(1,1,1);\n\t color bloodcolor = color(.8,.05,.05);\n\t color pupilcolor = 0;\n\t float pupilsize = 0.05, irissize = 0.12;\n\t float bloodshot = 1.0;\n\t float veinfreq = 8, veinlevel = 4;\n\t float index = 0;\n        )\n{\n  color Ct;\n  point Nf;\n  point PP, PO;\n  float i, turb, newturb, freq, f2;\n  float displayed, newdisp;\n  color Cball, Ciris;\n  float irisstat, pupilstat;\n  float bloody, tt;\n  float ks, rough;\n  float twidth, cutoff;\n\n  /* Calculate an appropriate filter width for antialiasing */\n  twidth = filterwidth(t);\n  PO = transform (\"object\", P) + index;\n\n  /* Figure out where we are in the eyeball.  Use the following variables:\n   * irisstat: 0 inside the iris/white boundary, 1 outside\n   * pupilstat: 0 inside the pupil/iris boundary, 1 outside\n   * bloody: how potentially bloody it is (fade as we get away from iris)\n   */\n  tt = 1-t;\n  irisstat = smoothstep (irissize, irissize+twidth, tt);\n  pupilstat = smoothstep (pupilsize, pupilsize+twidth, tt);\n  bloody = bloodshot * (smoothstep (-irissize, 2.5*irissize, tt));\n\n  /* If we're somewhere in the white part and it's potentially bloody,\n   * then calculate the veining pattern.  Otherwise, just use the color\n   * of the whites.  The veining pattern is essentially summed zero sets\n   * of turbulence functions.  Some stretching is done to get it to look\n   * just right.\n   */\n  if (irisstat * bloody > 0.001) {\n      turb = bloody;  freq = veinfreq;\n      displayed = 0;\n      for (i = 1;  (i <= veinlevel) && (turb > 0.1);  i += 1) {\n\t  newturb = 1 - abs (snoise(PO*freq + point(0,0,20*freq)));\n\t  newdisp = pow (smoothstep (.85, 1, newturb), 10);\n\t  displayed += (1-displayed) * newdisp * smoothstep (.1, .85, turb * turb);\n\t  turb *= newturb;\n\t  freq *= 2;\n        }\n      Cball = mix (eyeballcolor, bloodcolor, smoothstep(0,.75,displayed));\n    }\n  else Cball = eyeballcolor;\n\n  Ciris = mix (iriscolor, irisoutercolor, smoothstep (irissize*.8, irissize, tt));\n  /* If we're somewhere in the iris, calculate the iris pattern, which is\n   * just a stretched turbulence function.\n   */\n  if (irisstat < 0.9999 && pupilstat > 0.0001) {\n      turb = 0;  freq = 1;  f2 = 30;\n      for (i = 1;  i <= 4;  i += 1) {\n\t  turb += snoise (PO*f2 + point(0,0,20*f2)) / freq;\n\t  freq *= 2;  f2 *= 2;\n        }\n      Ciris *= (1-clamp(turb/2,0,1));\n    }\n\n  /* OK, now calculate a surface texture color (Ct) based on where we are\n   * and what patterns we calculated.\n   */\n  Ct = mix (Ciris, Cball, irisstat);\n  Ct = mix (pupilcolor, Ct, pupilstat);\n\n  /* Make the eye a little glossier on the iris and pupil */\n  ks = Ks * (1+2*(1-irisstat));\n  rough = roughness * (1-.75*(1-irisstat));\n\n  /* Now shade like plastic, but using our calculated surface color and\n   * our modified values for roughness and Ks.\n   */\n  Oi = Os;\n  Nf = faceforward (normalize(N),I);\n  Ci = Os * ( Ct * (Ka*ambient() + Kd*diffuse(Nf)) +\n\t      specularcolor * ks*specular(Nf,-normalize(I),rough));\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_eyeball.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_eyeball\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".75\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.75\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.4\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"iriscolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.135289 0.84323 0.372417\"/>\n\t\t\t<argument name=\"irisoutercolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.403882 0.343944 0.68276\"/>\n\t\t\t<argument name=\"irisinnercolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.065142 0.040605 0.179311\"/>\n\t\t\t<argument name=\"eyeballcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"bloodcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.8 0.05 0.05\"/>\n\t\t\t<argument name=\"pupilcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"pupilsize\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.05\"/>\n\t\t\t<argument name=\"irissize\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.12\"/>\n\t\t\t<argument name=\"bloodshot\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.0\"/>\n\t\t\t<argument name=\"veinfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"8\"/>\n\t\t\t<argument name=\"veinlevel\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"4\"/>\n\t\t\t<argument name=\"index\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_filament.sl",
    "content": "/* Copyrighted Pixar 1989 */\n/* From the RenderMan Companion p.368 */\n/* Listing 16.25  Surface shader to make a cylinder look like a filament */\n\n/*\n * filament(): map a filament-like spiral onto the surface of a cylinder.\n */\n\n#include \"k3d_patterns.h\"\n\nsurface k3d_filament ( \n\tfloat frequency\t= 5.0;\n\tfloat phase = 0.0;\n\tfloat width = 0.3;\n\t)\n{\n\tfloat offset = mod((t*frequency + s + phase), 1.0);\n\n\tOi = filteredpulse(0.5 - width / 2, 0.5 + width / 2, offset, filterwidth(offset));\n\tCi = Cs * Oi;\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_filament.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_filament\">\n\t\t\t<argument name=\"frequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"5.0\"/>\n\t\t\t<argument name=\"phase\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.0\"/>\n\t\t\t<argument name=\"width\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.3\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_fire.sl",
    "content": "/* fire.sl\n *\n * animated fire -- adpated from shader by Flip Phillips\n *\n */\n\n#include \"k3d_rmannotes.h\"\n\nsurface k3d_fire(float frame = 1)\n{\n  color layer_color, surface_color;\n  color surface_opac, layer_opac;\n  float width, cutoff, fade, f, turb, maxfreq = 16;\n  float flame;\n  float ss, tt;\n  color red = color (1, .3, .1);\n  color orange = color (.95, .7, .05);\n  color yellow = color (.95, .95, .1);\n  color hot = color (1, 1, .8);\n\n  surface_color = 0;\n  surface_opac = 0;\n\n  /* compress ss & offset both by factor of current frame */\n\n  ss = s * 5 + frame * 0.01;\n  tt = t + frame * 0.1;\n\n  /* compute turbulence */\n\n  width = max(filterwidth(ss), filterwidth(tt));\n  cutoff = clamp(0.5 / width, 0, maxfreq);\n\n  turb = 0;\n  for (f = 1; f < 0.5 * cutoff; f *= 2) \n    turb += abs(snoisexy(ss * f, tt * f)) / f;\n  fade = clamp(2 * (cutoff - f) / cutoff, 0, 1);\n  turb += fade * abs(snoisexy(ss * f, tt * f)) / f;\n  turb *= 0.5;\n\n  /* index into color spline using turbulence */\n\n  flame = clamp(t - turb, 0, 1);\n  layer_opac = flame;\n  layer_color = spline(flame, red, red, red, red, orange, yellow, hot, hot);\n  surface_color = blend(surface_color, layer_color, layer_opac);\n  surface_opac = union(surface_opac, layer_opac);\n\n  /* output */\n\n  Oi = surface_opac;\n  Ci = surface_color;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_fire.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_fire\">\n\t\t\t<argument name=\"frame\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_fresnelplastic.sl",
    "content": "/* \n * TLFresnelPlastic.sl -- simple shader illustrating fresnel().\n *\n * DESCRIPTION:\n *    Simple Fresnel shader using plastic illuminance.\n *\n * PARAMETERS\n *\n * AUTHOR: Tal Lancaster  tal@SpamSucks_renderman.org\n *\n * HISTORY:\n *    Jan 26 2002  Created\n */\n\n/* From Advanced RenderMan */\n#include \"k3d_reflections.h\"\n\n#ifdef PRMAN  /* as of prman10 */\n#define CHKTX(tx) ((tx != \"\" && textureinfo (tx, \"exists\", 0) != 0)? 1: 0)\n#else\n#define CHKTX(tx) \\\n    ((tx != \"\")? 1: 0)\n#endif\n\nsurface k3d_fresnelplastic (\n   color Csurf = 0.5; /* cat Color \n\t\t\t desc {Base color for surface if \n\t\t\t not over-written by \"colorMap } */\n   string colorMap = \"\"; /* cat Color\n\t\t\t    desc {Optional color map.  Replaces 'Csurf'.} */\n   \n   float ior = 0;\n   /* desc { Index of Refraction.  Used to get Fresnel falloff.\n      0: turns off fresnel and gives plastic look. Typical values\n      gt 1.0 and lt 2.2}  range {1.01 2.2 .01} */\n   float Ka= 1;       /* desc { Usual } */\n   float Kd= 0.5;     /* desc { Usual } */\n   float Ks= 0.5;     /* desc { Usual } */\n   float roughness= 0.1;  /* desc {Specular roughness} */\n   color Cspec = 1;       /* desc {Specular color} */\n   float Kr = 0;  /* cat Reflection desc {Strength of reflection } */\n   string reflectMap = \"\"; \n   /* cat Reflection desc {Name of reflection map. } type texture */\n   float reflectBlur = 0; \n   /* cat Reflection desc {Percentage amount to blur map} */\n   string reflectSpace = \"world\";  /* cat Reflection \n   desc {Space the reflection calculations are performed in. } */\n   float reflectDist = 1e10;\n   /* cat Reflection desc {The size of the room to base the reflection\n      lookup off of.} */\n\n   float flipS = 0; /* cat ST type switch desc {Flip S on texture lookups.} */\n   float flipT = 0; /* cat ST type switch desc {Flip S on texture lookups.} */\n   float MtorFlip = 0; /* cat ST type switch def 1\n\t\t\t  desc {Swap S/T access to overcome Maya/MtoR\n\t\t\t  NURBs differences.} */\n)\n{\n    float ss, tt;\n    float fKt, fKr;\n    color Ct;\n\n    normal Nf = normalize (faceforward( normalize(N), I ));\n    vector V = -normalize(I);\n    vector R = normalize (reflect (I, Nf));\n\n    /* Parametric space adjustments */\n    if (MtorFlip == 1) {\n\tss = t;\n\ttt = s;\n    }\n    else {\n\tss = s;\n\ttt = t;\n    }\n    if (flipS == 1)\n\tss = 1 - ss;\n    if (flipT == 1)\n\ttt = 1 - tt;\n\n    /* Calculate fresnel index of refraction */\n    if (ior != 0) {\n      fresnel (normalize (I), Nf, (I.Nf > 0)? ior: 1/ior,\n\t       fKr, fKt);\n      /* hack */\n      fKt = 1 - fKr;\n    }\n    else {\n      /* fresnel turned off */\n      fKr = fKt = 1;\n    }\n\n    /* base color */\n    /*Ct = (CHKTX (colorMap))? texture (colorMap, ss, tt): Csurf; */\n    if (CHKTX (colorMap) == 1)\n      Ct = texture (colorMap, ss, tt);\n    else\n      Ct = Csurf;\n\n    /* Environment */\n    color Cr = 0;\n    float reflOpacity = 1;\n    if (reflectMap != \"\")\n      Cr = Environment (reflectMap, reflectSpace, reflectDist, \n\t\t\tP, R, reflectBlur, reflOpacity);\n\n    /* lighting */\n    Oi = Os;\n    Ci = Os * ( fKt * Ct * (Ka*ambient() + Kd*diffuse(Nf)) +\n                fKr * Cspec * Ks * specular(Nf,V,roughness) +\n\t\tKr * Cr * fKr);\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_fresnelplastic.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_fresnelplastic\">\n\t\t\t<argument name=\"Csurf\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5 0.5 0.5\"/>\n\t\t\t<argument name=\"colorMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"ior\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"Cspec\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"Kr\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"reflectMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"reflectBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"reflectSpace\" storage_class=\"uniform\" type=\"string\" extended_type=\"space\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"world\"/>\n\t\t\t<argument name=\"reflectDist\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1e10\"/>\n\t\t\t<argument name=\"flipS\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"flipT\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"MtorFlip\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_funkyglass.sl",
    "content": "/* funkyglass.sl - randomly colored \"glass\" (transparent, but no refl/refr).\n * (c) Copyright 1994, Larry Gritz\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nsurface k3d_funkyglass(float Ka = .2;\n\t\t       float Kd = .2; float Ks = 1; float roughness = .08;\n\t\t       color specularcolor = 1;)\n{\n  point PP;\n  normal Nf;\n  vector V;\n  color Ct, Ot;\n\n  V = normalize(I);\n  Nf = faceforward(normalize(N), V);\n  PP = transform(\"shader\", P);\n  Ct = 2 * (color noise(PP) - .5) + .5;\n  Ot = (comp(Ct, 0) + comp(Ct, 1) + comp(Ct, 2)) / 3 + (1 - Ct);\n\n  Oi = Ot * (0.75 - 0.5 * abs(V.Nf));\n  Ci =\n    (Ct * (Ka * ambient() + Kd * diffuse(Nf)) +\n     specularcolor * Ks * specular(Nf, -V, roughness));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_funkyglass.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_funkyglass\">\n\t\t\t<description>Randomly colored \"glass\" (transparent, but no refl/refr)</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<copyright>(c) Copyright 1994, Larry Gritz</copyright>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".2\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".2\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".08\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_fur2.sl",
    "content": "/* Renamed to SIG2k_srf_fur to be consistent with the RMR \n   -- tal@SpamSucks_renderman.org\n */\n\n/* fur surface shader\n\n   with clumping and specular model\n\n   by Clint Hanson and Armin Bruderlin\n*/\n\ncolor \nfnc_diffuselgt (color Cin;       /* Light Colour */\n                point Lin;       /* Light Position */\n                point Nin;       /* Surface Normal */\n    )\n{\n    color Cout = Cin;\n    vector LN, NN;\n    float Atten;\n\n    /* normalize the stuff */\n    LN = normalize(vector(Lin));\n    NN = normalize(vector(Nin));\n\n    /* diffuse calculation */\n    Atten = max(0.0,LN.NN);\n\n    Cout *= Atten;\n\n    return (Cout);\n}\n\n\n#define luminance(c) comp(c,0)*0.299 + comp(c,1)*0.587 + comp(c,2)*0.114\n\n\nsurface \nk3d_fur2( /* Hair Shading... */\n         float Ka   = 0.0287;\n\t float Kd   = 0.77;\n\t float Ks   = 1.285;\n\t float roughness1  = 0.008;\n\t float SPEC1  = 0.01;\n\t float roughness2  = 0.016;\n\t float SPEC2  = 0.003;\n\t float   start_spec = 0.3;\n\t float   end_spec = 0.95;\n\t float spec_size_fade  = 0.1;\n\t float illum_width  = 180;\n\t float var_fade_start = 0.005;\n\t float var_fade_end = 0.001;\n\t float clump_dark_strength = 0.0;\n              \n\t /* Hair Color */\n\t color rootcolor  = color (.9714, .9714, .9714);\n\t color tipcolor = color (.519, .325, .125);\n\t color specularcolor  = (color(1) + tipcolor) / 2;\n\t color static_ambient  = color (0.057,0.057,0.057);\n\t \n\t /* Variables Passed from the rib... */\n\t uniform float hair_col_var  = 0.0;\n\t uniform float hair_length = 0.0;\n\t uniform normal surface_normal  = normal 1;\n\t varying vector clump_vect  = vector 0;\n\t uniform float hair_id   = 0.0; /* Watch Out... Across Patches */\n\t \n    )\n{\n    vector T = normalize (dPdv); /* tangent along length of hair */\n    vector V = -normalize(I);    /* V is the view vector */\n    color Cspec = 0, Cdiff = 0;  /* collect specular & diffuse light */\n    float Kspec = Ks;\n    vector nL;\n    varying normal nSN = normalize( surface_normal );\n    vector S = nSN^T;     /* Cross product of the tangent along the hair and surface normal */\n    vector N_hair = (T^S); /* N_hair is a normal for the hair oriented \"away\" from the surface */\n    vector norm_hair;\n    float  l = clamp(nSN.T,0,1);  /* Dot of surface_normal and T, used for blending */\n    float clump_darkening = 1.0;\n    float T_Dot_nL = 0;\n    float T_Dot_e = 0;\n    float Alpha = 0;\n    float Beta = 0;\n    float Kajiya = 0;\n    float darkening = 1.0;\n    varying color final_c;\n\n    /* values from light */\n    uniform float nonspecular = 0;\n    uniform color SpecularColor = 1;\n\n    /* When the hair is exactly perpendicular to the surface, use the\n       surface normal, when the hair is exactly tangent to the\n       surface, use the hair normal Otherwise, blend between the two\n       normals in a linear fashion \n    */\n    norm_hair = (l * nSN) + ( (1-l) * N_hair);\n    norm_hair = normalize(norm_hair);\n    \n    /* Make the specular only hit in certain parts of the hair--v is\n       along the length of the hair \n    */\n    Kspec *= min( smoothstep( start_spec, start_spec + spec_size_fade, v),  \n\t\t  1 - smoothstep( end_spec, end_spec - spec_size_fade, v ) );\n\n\n    /* Loop over lights, catch highlights as if this was a thin cylinder,\n\n       Specular illumination model from:\n       James T. Kajiya and Timothy L.  Kay (1989) \"Rendering Fur with Three \n       Dimensional Textures\", Computer Graphics 23,3, 271-280  \n    */\n\n    illuminance (P, norm_hair, radians(illum_width)) {\n\tnL = normalize(L);\n\t\n\tT_Dot_nL = T.nL;\n\tT_Dot_e = T.V;\n\tAlpha = acos(T_Dot_nL);\n\tBeta = acos(T_Dot_e);\n\n\tKajiya = T_Dot_nL * T_Dot_e + sin(Alpha) * sin(Beta);\n\n\t/* calculate diffuse component */\n\tif ( clump_dark_strength > 0.0 ) {\n\t    clump_darkening = 1 - ( clump_dark_strength * \n                                    abs(clamp(nL.normalize(-1*clump_vect), -1, 0)));\n\t} else {\n\t    clump_darkening = 1.0;\n\t}\n\t\n\t/* get light source parameters */\n\tif ( lightsource(\"__nonspecular\",nonspecular) == 0)\n\t    nonspecular = 0;\n\tif ( lightsource(\"__SpecularColor\",SpecularColor) == 0)\n\t    SpecularColor = color 1;\n\t\n\tCspec += (1-nonspecular) * SpecularColor * clump_darkening * \n\t    ((SPEC1*Cl*pow(Kajiya, 1/roughness1)) + \n\t     (SPEC2*Cl*pow(Kajiya, 1/roughness2)));\n\t\n\tCdiff += clump_darkening * fnc_diffuselgt(Cl, L, norm_hair);\n    }\n\n    darkening = clamp(hair_col_var, 0, 1);\n    \n    darkening = (1 - (smoothstep( var_fade_end, var_fade_start, \n\t\t\t\t  abs(luminance(Kd*Cdiff))) * darkening));\n    \n    final_c = mix( rootcolor, tipcolor, v ) * darkening;\n    \n    Ci =  ((Ka*ambient() + Kd*Cdiff + static_ambient) * final_c\n\t   + ((v) * Kspec * Cspec * specularcolor));\n    \n    Ci = clamp(Ci, color 0, color 1 );\n    \n    Oi = Os;\n    Ci = Oi * Ci;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_fur2.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_fur2\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.0287\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.77\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.285\"/>\n\t\t\t<argument name=\"roughness1\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.008\"/>\n\t\t\t<argument name=\"SPEC1\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.01\"/>\n\t\t\t<argument name=\"roughness2\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.016\"/>\n\t\t\t<argument name=\"SPEC2\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.003\"/>\n\t\t\t<argument name=\"start_spec\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.3\"/>\n\t\t\t<argument name=\"end_spec\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.95\"/>\n\t\t\t<argument name=\"spec_size_fade\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"illum_width\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"180\"/>\n\t\t\t<argument name=\"var_fade_start\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.005\"/>\n\t\t\t<argument name=\"var_fade_end\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.001\"/>\n\t\t\t<argument name=\"clump_dark_strength\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.0\"/>\n\t\t\t<argument name=\"rootcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.488655 0 0\"/>\n\t\t\t<argument name=\"tipcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 0.855543 0.272877\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"static_ambient\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.804532 0.463371 0.0615091\"/>\n\t\t\t<argument name=\"hair_col_var\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.0\"/>\n\t\t\t<argument name=\"hair_length\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.0\"/>\n\t\t\t<argument name=\"surface_normal\" storage_class=\"uniform\" type=\"normal\" extended_type=\"normal\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"clump_vect\" storage_class=\"varying\" type=\"vector\" extended_type=\"vector\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"hair_id\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_glow.sl",
    "content": "surface k3d_glow(\n\tfloat attenuation = 2;\n\tcolor edgecolor = color(0, 0, 1);\n\t)\n{\n\tfloat falloff = I.N;\n\n\tif(falloff < 0)\n\t{\n\t\tfalloff = falloff * falloff / (I.I * N.N);\n\t\tfalloff = pow(falloff, attenuation);\n\n\t\tCi = mix(edgecolor, Cs, falloff) * falloff;\n\t\tOi = 1e-5;\n\t}\n\telse\n\t{\n\t\tCi = 0;\n\t\tOi = 0;\n\t}\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_glow.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_glow\">\n\t\t\t<description>Gives geometry a transparent \"glow\" effect</description>\n\t\t\t<authors>Steve Upstill</authors>\n\t\t\t<argument name=\"attenuation\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"2.0\"/>\n\t\t\t<argument name=\"edgecolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0 0 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_gooch.sl",
    "content": "/* Renamed to MKgooch.sl for RMR -- tal@SpamSucks_cs.caltech.edu */\n\n/* s_gooch.sl - a simple implementation of the Gooch\n *              non-photorealistic lighting model\n *\n * DESCRIPTION   : This model is described in \"A Non-Photorealistc\n *                 Lighting Model For Automatic Technical \n *                 Illustration\" in the Siggraph 1998 Proceedings.\n *                 http://www.cs.utah.edu/~gooch/SIG98/abstract.html\n *\n * INPUTS        : \n *  Ka           : ambient factor\n *  Kd           : diffuse factor\n *  Ks           : specular factor\n *  alpha        : Gooch cool color factor\n *  beta         : Gooch warm color factor\n *  b            : used to construct the cool color\n *  y            : used to construct the warm color\n *  roughness    : specular roughness\n *  specularcolor: specular hilight color\n *\n * AUTHOR: written by Mike King\n *               \n ***************************************************/\n\nsurface\nk3d_gooch (float Ka = 0;\n         float Kd = 1;\n         float Ks = 0;\n         float alpha = .25;\n         float beta = .5;\n         float b = .55;\n         float y = .3;\n         float roughness = .1;\n         color specularcolor = 1;)\n{\n    normal Nf = faceforward (normalize(N),I);\n    color blue = color(0,0,b);\n    color yellow = color(y,y,0);\n\n    color Cgooch = color(0,0,0); \n    float ldotn, blendval;\n    color kcool,kwarm;\n\n    kcool = blue + ( Cs * alpha);\n    kwarm = yellow + (Cs * beta);\n    illuminance(P,Nf,PI) {\n        ldotn = (normalize(L)).Nf;\n        blendval = 0.5*(1+ldotn);\n        Cgooch += mix(kcool,kwarm,blendval); \n    }\n    \n    Oi = Os;\n    Ci = Os * ((Ka*ambient() + \n                Kd*Cgooch +\n                specularcolor*Ks*specular(Nf,-normalize(I),roughness)));\n}\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_gooch.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_gooch\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"alpha\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".25\"/>\n\t\t\t<argument name=\"beta\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"b\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".55\"/>\n\t\t\t<argument name=\"y\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".3\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_gradient_t.sl",
    "content": "surface k3d_gradient_t(\n\tcolor start_color = color(1, 0, 0);\n\tcolor end_color = color(1, 1, 0);\n\tfloat additive = 0.0;\n\t)\n{\n\tcolor C = mix(start_color, end_color, t);\n\n\tif(additive != 0.0)\n\t\t{\t\n\t\t\tCi = C;\n\t\t\tOi = 0.0;\n\t\t}\n\telse\n\t\t{\n\t\t\tCi = C * Os;\n\t\t\tOi = Os;\n\t\t}\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_gradient_t.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_gradient_t\">\n\t\t\t<description>Gradient along t texture coordinates</description>\n\t\t\t<authors>Timothy M. Shead</authors>\n\t\t\t<copyright>Copyright (c) 1995-2004, Timothy M. Shead</copyright>\n\t\t\t<argument name=\"start_color\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 0 0\"/>\n\t\t\t<argument name=\"end_color\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 0\"/>\n\t\t\t<argument name=\"additive\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_granite.sl",
    "content": "/* Copyrighted Pixar 1989 */\n/* From the RenderMan Companion p.352 */\n/* Listing 16.18  Surface shader for granite-like surface*/\n\n/* \n * granite(): Provide a diffuse granite-like surface texture. \n */\nsurface \nk3d_granite(\n\tfloat\tKd\t= .8,\n\t\tKa\t= .2 )\n{\n\tfloat sum = 0;\n\tfloat i, freq = 1.0; /* Try other values for example, 7.0 */\n\n\tfor (i = 0; i < 6; i = i + 1) {\n\t\tsum = sum + abs(.5 - noise( 4 * freq * I))/freq ;\n\t\tfreq *= 2;\n\t}\n\tCi = Cs * sum * (Ka + Kd * diffuse(faceforward( normalize(N), I )) ) ;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_granite.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_granite\">\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".8\"/>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".2\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_greenmarble.sl",
    "content": "/*\n * greenmarble.sl -- RenderMan compatible shader for green veined marble.\n *\n * DESCRIPTION:\n *   Makes a marble-like surface using a turbulence function.\n *   \n * PARAMETERS:\n *   Ka, Kd, Ks, roughness, specularcolor - work just like the plastic\n *   txtscale - overall scaling for the texture\n *   darkcolor, lightcolor - colors of the underlying substrate\n *   veincolor - color of the bright veins\n *   veinfreq - controls the frequency of the veining effects\n *   sharpness - how sharp the veins appear\n *\n *\n * AUTHOR: Larry Gritz, 1994\n *\n */\n\n#include \"k3d_noises.h\"\n#include \"k3d_material.h\"\n\n\nsurface k3d_greenmarble(float Ka = 0.1, Kd = 0.6, Ks = 0.4, roughness = 0.1;\n\t\t\tcolor specularcolor = 1;\n\t\t\tcolor darkcolor = color(0.01, 0.12, 0.004);\n\t\t\tcolor lightcolor = color(0.06, 0.18, 0.02);\n\t\t\tcolor veincolor = color(0.47, 0.57, 0.03);\n\t\t\tfloat veinfreq = 1;\n\t\t\tfloat sharpness = 25; float txtscale = 1;\n  )\n{\n  color Ct;\n  float freq;\n  float turbsum, turb, i;\n\n  point PP = txtscale * transform(\"shader\", P);\n  float dPP = filterwidthp(PP);\n\n  /*\n   * First calculate the underlying color of the substrate\n   *    Use turbulence - use frequency clamping\n   */\n  turb = 0.5 * turbulence(PP, dPP, 5, 2, 0.5);\n  Ct = mix(darkcolor, lightcolor, smoothstep(0.1, .35, turb));\n\n  /*\n   * Now we layer on the veins\n   */\n\n  /* perturb the lookup */\n  PP += vector(35.2, -21.9, 6.25) + 0.5 * vfBm(PP, dPP, 6, 2, 0.5);\n\n  /* Now calculate the veining function for the lookup area */\n  turbsum = 0;\n  freq = 1;\n  PP *= veinfreq;\n  for(i = 0; i < 3; i += 1)\n    {\n      turb = abs(filteredsnoise(PP * freq, dPP * freq));\n      turb = pow(smoothstep(0.8, 1, 1 - turb), sharpness) / freq;\n      turbsum += (1 - turbsum) * turb;\n      freq *= 2;\n    }\n  turbsum *=\n    smoothstep(-0.1, 0.05, snoise(2 * (PP + vector(-4.4, 8.34, 27.1))));\n\n  Ct = mix(Ct, veincolor, turbsum);\n\n  /*\n   * Shade like plastic\n   */\n  normal Nf = faceforward(normalize(N), I);\n  Ci = MaterialPlastic(Nf, Ct, Ka, Kd, Ks, roughness);\n  Oi = Os;\n  Ci *= Os;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_greenmarble.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_greenmarble\">\n\t\t\t<description>Green veined marble</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.6\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.4\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"darkcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.01 0.12 0.004\"/>\n\t\t\t<argument name=\"lightcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.06 0.18 0.02\"/>\n\t\t\t<argument name=\"veincolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.47 0.57 0.03\"/>\n\t\t\t<argument name=\"veinfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"sharpness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"25\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_hair.sl",
    "content": "/** From RenderMan AppNote #19 */\n\nsurface k3d_hair(\n\tfloat Ka = 1;\n\tfloat Kd = .6;\n\tfloat Ks = .35;\n\tfloat roughness = .15;\n\tcolor rootcolor = color (.109, .037, .007);\n\tcolor tipcolor = color (.519, .325, .125);\n\tcolor specularcolor = (color(1) + tipcolor) / 2;\n\t)\n{\n\tvector T = normalize (dPdv); /* tangent along length of hair */\n\tvector V = -normalize(I);    /* V is the view vector */\n\tcolor Cspec = 0, Cdiff = 0;  /* collect specular & diffuse light */\n\tfloat cosang;\n\n\t/* Loop over lights, catch highlights as if this was a thin cylinder */\n\tilluminance (P)\n\t\t{\n\t\t\tcosang = cos (abs (acos (T.normalize(L)) - acos (-T.V)));\n\t\t\tCspec += Cl * v * pow (cosang, 1/roughness);\n\t\t\tCdiff += Cl * v;\n\n\t\t\t/* We multipled by v to make it darker at the roots.  This assumes v=0 at the root, v=1 at the tip.  */\n\t\t}\n\n\tOi = Os;\n\tCi = Oi * (mix(rootcolor, tipcolor, v) * (Ka*ambient() + Kd * Cdiff) + (Ks * Cspec * specularcolor));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_hair.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_hair\">\n\t\t\t<description>Hair surface from RenderMan AppNote #19</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.6\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.35\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.15\"/>\n\t\t\t<argument name=\"rootcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.109 0.037 0.007\"/>\n\t\t\t<argument name=\"tipcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.519 0.325 0.125\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.75 0.65 0.6\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_hextile.sl",
    "content": "/*\n * hextile.sl -- surface shader for hexagonal tiles in st space\n *\n * DESCRIPTION\n *       This surface shader operates in s-t space and gives a pattern of\n *    hexagonal tiles, similar to that found as floor patterns in public\n *    places and such.\n *       The basic pattern is a hexagonal tiling, with a little bit of\n *    color variation from tile to tile.  On top of that is some staining\n *    (presumably due to water or something), which darkens the tile or\n *    mortar underneath it.  Finally, there is scuffing due to people's\n *    shoes, which really only affects the tile part not the mortar part.\n *\n *\n * PARAMTERS\n *    Ka, Kd, Ks, roughness, specularcolor - work just like plastic\n *    tilecolor - the color of the tiles\n *    mortarcolor - the color of the mortar (space between the tiles)\n *    tileradius - the \"radius\" (in s-t units) of a single tile\n *    mortarwidth - the width of the mortar (in s-t units)\n *    tilevary - the color variance from tile to tile\n *\n * ANTIALIASING\n *    Some rudimentary antialiasing is performed on the borders between\n *    tile and mortar.\n *\n * HINTS & APPLICATIONS\n *    If all of the default parameters are used, the tiles look just like\n *    the floors in the public areas of the Washington DC subway system.\n *\n * AUTHOR: written by Larry Gritz, 1994\n *\n * HISTORY:\n *    15 Feb 1994 -- written by lg\n *\n * last modified 15 Feb 94 by Larry Gritz\n */\n\n\n#include \"k3d_noises.h\"\n\nsurface\nk3d_hextile (float Ka = .5;\n         float Kd = .5;\n         float Ks = .2;\n         float roughness = .1;\n\t color specularcolor = 1;\n\t color tilecolor = color(.55,0,0);\n\t color mortarcolor = color(.5,.5,.5);\n\t float tileradius = 0.2;\n\t float mortarwidth = 0.02;\n\t float tilevary = 0.15;\n\t float scuffing = 0.5;\n\t float stains = 0.4;\n         float stainfrequency = 2;\n         float scufffrequency = 4;\n\t color scuffcolor = color (.05,.05,.05))\n{\n  point Nf;\n  color Ct, Ctile;\n  float tilewidth;\n  float ss, tt;\n  float ttile, stile;\n  float x, y;\n  float mortar;\n  float swidth, twidth, sfuzz, tfuzz, fuzzmax;\n  float mw2;\n  float tileindex;\n  float stain, scuff;\n  float ks;\n\n  /* Determine how wide in s-t space one pixel projects to */\n  swidth = abs(Du(s)*du) + abs(Dv(s)*dv);\n  twidth = abs(Du(t)*du) + abs(Dv(t)*dv);\n  sfuzz = 0.5 * swidth;\n  tfuzz = 0.5 * twidth;\n  fuzzmax = max (sfuzz, tfuzz);\n\n  tilewidth = tileradius * 1.7320508;  /* sqrt(3) */\n  tt = mod (t, 1.5*tileradius);\n  ttile = floor (t/(1.5*tileradius));\n  if (mod (ttile/2, 1) == 0.5)\n       ss = s + tilewidth/2;\n  else ss = s;\n  stile = floor (ss / tilewidth);\n  ss = mod (ss, tilewidth);\n  mortar = 0;\n  mw2 = mortarwidth/2;\n  if (tt < tileradius) {\n      mortar =  1 - (smoothstep(mw2,mw2+sfuzz,ss) *\n\t\t     (1 - smoothstep(tilewidth-mw2-sfuzz,tilewidth-mw2,ss)));\n    }\n  else {\n      x = tilewidth/2 - abs (ss - tilewidth/2);\n      y = 1.7320508 * (tt - tileradius);\n      if (y > x) {\n\t  if (mod (ttile/2, 1) == 0.5)\n\t      stile -= 1;\n\t  ttile += 1;\n\t  if (ss > tilewidth/2)\n\t      stile += 1;\n\t}\n      mortar = (smoothstep (x-1.73*mw2-tfuzz, x-1.73*mw2, y) *\n\t\t(1 - smoothstep (x+1.73*mw2, x+1.73*mw2+tfuzz, y)));\n    }\n\n  tileindex = stile+41*ttile;\n  Ctile = tilecolor * (1 + tilevary * snoise(tileindex+0.5));\n\n  stain = stains * smoothstep (.5,1, noise(s*stainfrequency,t*stainfrequency));\n\n  scuff = scuffing * smoothstep (.6,1, noise(t*scufffrequency-90.26,\n\t\t\t\t\t     s*scufffrequency+123.82));\n\n  ks = Ks * (1-scuff/2);\n  Ct = (1-stain) * mix (mix (Ctile, scuffcolor, scuff), mortarcolor, mortar);\n  Oi = Os;\n  Nf = faceforward (normalize(N),I);\n  Ci = Os * ( Ct * (Ka*ambient() + Kd*diffuse(Nf)) +\n\t      specularcolor * ks*specular(Nf,-normalize(I),roughness));\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_hextile.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_hextile\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".2\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"tilecolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.6 0.1 0.1\"/>\n\t\t\t<argument name=\"mortarcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.6 0.6 0.6\"/>\n\t\t\t<argument name=\"tileradius\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.2\"/>\n\t\t\t<argument name=\"mortarwidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.04\"/>\n\t\t\t<argument name=\"tilevary\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.15\"/>\n\t\t\t<argument name=\"scuffing\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"stains\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.4\"/>\n\t\t\t<argument name=\"stainfrequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"2\"/>\n\t\t\t<argument name=\"scufffrequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"4\"/>\n\t\t\t<argument name=\"scuffcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0 0 0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_incandplastic.sl",
    "content": "/* incandPlastic.sl   version 1.0, Jan. 2002\n * Felipe Esquivel <felipe@siggraph.org.mx>\n * \n * Este es un shader plastico con componente de\n * incandescencia como el contenido en un Blinn. \n *\n * This is a normal plastic shader and includes an\n * incandescence value like the blinn shader.\n */\nsurface \nk3d_incandplastic(color SurfaceColor = color(0, 0.25, 1);\n\t      color SurfaceOpacity = 1;\n\t      float Ka = 0;\n\t      float Kd = 0.9;\n\t      float Ks = 0.5;\n\t      float Roughness = 0.05;\n\t      color SpecularColor = 1;\n\t      color Incandescence = color(0, 0, 0.3);)\n{\n  normal Nf;\n  vector NI;\n  \n  Nf = faceforward(normalize(N), I, normalize(N));\n  NI = -normalize(I);\n  Ci = SurfaceOpacity * (SurfaceColor * (Ka * ambient() + Kd * diffuse(Nf)) +\n\t\t\t SpecularColor * Ks * specular(Nf, NI, Roughness) +\n\t\t\t Incandescence);\n  Oi = SurfaceOpacity;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_incandplastic.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_incandplastic\">\n\t\t\t<argument name=\"SurfaceColor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0 0.25 1\"/>\n\t\t\t<argument name=\"SurfaceOpacity\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.9\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"Roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.05\"/>\n\t\t\t<argument name=\"SpecularColor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"Incandescence\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0 0 0.3\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_luna.sl",
    "content": "/*\n * luna.sl -- surface shader for the moon\n *\n * DESCRIPTION:\n *    Makes a surface that looks sort of like Earth's moon.  It doesn't really\n *    have craters, so it isn't good for closeups.  But it's pretty good at about\n *    the scale for human naked-eye viewing from earth.\n *\n * AUTHOR:\n *    C language version by F. Kenton Musgrave\n *    Translation to Shading Language by Larry Gritz.\n *\n * REFERENCES:\n *    _Texturing and Modeling: A Procedural Approach_, by David S. Ebert, ed.,\n *    F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, and Steven Worley.\n *    Academic Press, 1994.  ISBN 0-12-228760-6.\n *\n * HISTORY:\n *    ??? - original C language version by Ken Musgrave\n *    Apr 94 - translation to Shading Language by L. Gritz\n *\n * this file last updated 18 Apr 1994\n */\n#include \"k3d_functions.h\"\n#include \"k3d_noises.h\"\n#include \"k3d_constants.h\"\n\nsurface k3d_luna(float Ka = .5, Kd = 1;\n\t\t float lacunarity = 2;\n\t\t float octaves = 8;\n\t\t float H = .3;\n\t\t color highland_color = .7;\n\t\t float maria_basecolor = .7, maria_color = .1;\n\t\t float arg22 = 1, arg23 = .3;\n\t\t float highland_threshold = -0.2;\n\t\t float highland_altitude = 0.001, maria_altitude = 0.0004;\n\t\t float peak_rad = .0075, inner_rad = .01, rim_rad =\n\t\t .02, outer_rad = .05; float peak_ht = 0.005, rim_ht = 0.003;\n\t\t float numrays = 8;\t/* arg10 */\n\t\t float rayfade = 1;\t/* arg11 */\n  )\n{\n  float radial_dist;\n  point PP, PQ;\n  float l, a, o, i, omega;\n  float chaos;\n  color Ct;\n  float temp1;\n  point vv;\n  float uu, ht, freq, scale;\n  float lighten;\n  point NN;\n  float pd;\t\t\t/* pole distance */\n  float raydist;\n\n  PQ = P;\n  PP = transform(\"shader\", P);\n  NN = normalize(N);\n  radial_dist = sqrt(xcomp(PP) * xcomp(PP) + ycomp(PP) * ycomp(PP));\n  omega = pow(lacunarity, (-.5) - H);\n\n  /* bumpy = fBm (PP, omega, lacunarity, octaves); */\n  l = 1;\n  o = 1;\n  a = 0;\n  for(i = 0; i < octaves; i += 1)\n    {\n      a += o * snoise(l * PP);\n      l *= lacunarity;\n      o *= omega;\n    }\n  chaos = a;\n\n  Ct = Cs;\n\n  /* Insure that the crater is in one of the maria */\n  temp1 = radial_dist * arg22;\n  if(temp1 < 1)\n    chaos -= arg23 * (1 - smoothstep(0, 1, temp1));\n\n  if(chaos > highland_threshold)\n    {\n      PQ += chaos * highland_altitude * NN;\n      Ct += highland_color * chaos;\n    }\n  else\n    {\n      PQ += chaos * maria_altitude * NN;\n      Ct *= maria_basecolor + maria_color * chaos;\n    }\n\n\n\t/***********************************************************************/\n  /* Add crater */\n  /* get normalized vector \"v\" */\n  pd = 1 - v;\n  vv = point(xcomp(PP) / radial_dist, 0, zcomp(PP) / radial_dist);\n  lighten = 0;\n  if(pd < peak_rad)\n    {\t\t\t\t/* central peak */\n      uu = 1 - pd / peak_rad;\n/*      lighten = uu*uu; */\n      ht = peak_ht * smoothstep(0, 1, uu);\n    }\n  else if(pd < inner_rad)\n    {\t\t\t\t/* crater floor */\n      ht = 0;\n    }\n  else if(pd < rim_rad)\n    {\t\t\t\t/* inner rim */\n      uu = (pd - inner_rad) / (rim_rad - inner_rad);\n      lighten = .75 * uu;\n      ht = rim_ht * smoothstep(0, 1, uu);\n    }\n  else if(pd < outer_rad)\n    {\t\t\t\t/* outer rim */\n      uu = 1 - (pd - rim_rad) / (outer_rad - rim_rad);\n      lighten = .75 * uu * uu;\n      ht = rim_ht * smoothstep(0, 1, uu * uu);\n    }\n  else\n    ht = 0;\n  PQ += ht * NN;\n  lighten *= 0.2;\n  Ct += color(lighten, lighten, lighten);\n\n  /* Add some noise */\n  if(uu > 0)\n    {\n      if(pd < peak_rad)\n\t{\t\t\t/* if on central peak */\n\t  vv = 5 * PP + 3 * vv;\n\t  freq = 1;\n\t  scale = 1;\n\t  ht = 0;\n\t  for(i = 0; i < 4; i += 1)\n\t    {\n\t      ht += scale * snoise(freq * vv);\n\t      freq *= 2;\n\t      scale *= 0.833;\n\t    }\n/*\t  ht = wrinkled (vv, 2, .833, 4); */\n\t  PQ += 0.0025 * uu * ht * NN;\n\t}\n      else\n\t{\n\t  vv = 6 * PP + 3 * vv;\n\t  freq = 1;\n\t  scale = 1;\n\t  ht = 0;\n\t  for(i = 0; i < 4; i += 1)\n\t    {\n\t      ht += scale * snoise(freq * vv);\n\t      freq *= 2;\n\t      scale *= 0.833;\n\t    }\n/*\t  ht = wrinkled (vv, 2, .833, 4); */\n\t  if(radial_dist > rim_rad)\n\t    uu *= uu;\n\t  PQ += 0.0025 * (0.5 * uu + 0.5 * ht) * NN;\n\t}\n    }\n\n\n  /* Make crater rays (PP, arg10, arg11, arg12, arg15, arg24, arg25, radial_dist);, yielding temp1 */\n  lighten = 0;\n  if(pd >= rim_rad && pd < 0.4)\n    {\n      lighten = smoothstep(.15, .5, snoise(62 * u));\n      raydist = 0.2 + 0.2 * snoise(20 * mod(u + 0.022, 1));\n      lighten *= (1 - smoothstep(raydist - .2, raydist, pd));\n    }\n  lighten = 0.2 * clamp(lighten, 0, 1);\n  Ct += color(lighten, lighten, lighten);\n\n\n  /* Recalc normal since we changed P a whole bunch. */\n/*  N = normalize (calculatenormal (PQ)); */\n\n  /* Shade like matte */\n  Oi = 1;\n  Ci = Ct * (Ka * ambient() + Kd * diffuse(faceforward(normalize(N), I)));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_luna.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_luna\">\n\t\t\t<description>Surface shader for Earth's moon</description>\n\t\t\t<authors>F. Kenton Musgrave, Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"lacunarity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"2\"/>\n\t\t\t<argument name=\"octaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"8\"/>\n\t\t\t<argument name=\"H\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".3\"/>\n\t\t\t<argument name=\"highland_color\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.7 0.7 0.7\"/>\n\t\t\t<argument name=\"maria_basecolor\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".7\"/>\n\t\t\t<argument name=\"maria_color\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".1\"/>\n\t\t\t<argument name=\"arg22\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"arg23\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".3\"/>\n\t\t\t<argument name=\"highland_threshold\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"-0.2\"/>\n\t\t\t<argument name=\"highland_altitude\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.001\"/>\n\t\t\t<argument name=\"maria_altitude\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.0004\"/>\n\t\t\t<argument name=\"peak_rad\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".0075\"/>\n\t\t\t<argument name=\"inner_rad\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".01\"/>\n\t\t\t<argument name=\"rim_rad\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".02\"/>\n\t\t\t<argument name=\"outer_rad\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".05\"/>\n\t\t\t<argument name=\"peak_ht\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.005\"/>\n\t\t\t<argument name=\"rim_ht\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.003\"/>\n\t\t\t<argument name=\"numrays\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"8\"/>\n\t\t\t<argument name=\"rayfade\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_lunette.sl",
    "content": "/* renamed JMlinette.sl for RMR.  -- tal */\n\n/******************************************************************************\n * lunette.sl -- A pretty surface shader ideal for \"ground planes\".\n *\n * Description:\n *   A grid pattern overlaid upon an fBm noise.  This shader is good for\n *   surfaces placed beneath your scene which act as the ground.  The default\n *   colors are a bland pastel blue and yellow, which should complement many\n *   hero objects that you might wish to show off.  The shader is a copy of a\n *   pattern I saw in the background of another image entitled \"Lunettes\",\n *   which I believe has something to do with spectacles in French.  Hence the\n *   name, anyway.  The pattern is calculated in 2D u,v coordinates.\n *\n * Parameters:\n *   Ka, Kd, Ks, roughness, specularcolor - work like the plastic shader\n *   urepeats, vrepeats - number of repeats of the grid pattern in u and v\n *   ulinewidth, vlinewidth - proportional width of the grid lines\n *   colorA, colorB - colors used in the background fBm noise\n *   baselinecolor - base color of the grid lines\n *   colorBenhance - amount to enhance colorB's presence over colorA\n *   gridDensity - effective opacity of the grid lines\n *   noiseScale - scale factor for the fBm noise relative to the grid size\n *   noiseRandom - randomization factor for the fBm noise\n *   maxOctaves, lunacrity, gain - work as in the fBm function\n *\n * Antialiasing:\n *   The shader should antialias itself quite well, since it uses antialiased\n *   noise functions and an box-filter antialiased grid function.\n *\n * Author: written by Jonathan Merritt (jmerritt@warpax.com), 5th October 2002\n *\n * License: This shader is distributed under the GNU General Public License.\n *\n *****************************************************************************/\n\n#include \"k3d_patterns.h\"\n#include \"k3d_noises.h\"\n\n\n/**\n * Base color for the \"lunette\" pattern.  The pattern is calculated in a two-\n * dimensional fashion using the coordinates ss and tt as texture / pattern\n * coordinates.\n *\n * Parameters:\n *   ss, tt - 2D pattern coordinates.\n *   ssrepeats, ttrepeats - Number of repeats of the grid pattern in both ss\n *                           and tt directions.  Also scales the noise in both\n *                           directions appropriately.\n *   sslinewidth, ttlinewidth - Width of the grid lines in ss and tt\n *                              respectively; expressed as a fraction of the\n *                              cell over which the grid repeat occurs.\n *   colorA, colorB - Two colors for the background pattern.\n *   noiseScale - Scale of the background fBm noise (relative to the size of\n *                a grid cell).  Increasing this value makes a finer, smaller\n *                noise; decreasing it makes a broader noise.\n *   noiseRandom - Randomization value for the noise.\n *   maxOctaves - Maximum number of octaves for the fBm noise.\n *   lunacrity - Lunacrity of the fBm noise.\n *   gain - Gain of the fBm noise.\n *   colorBenhance - After the noise has been calculated, there exists the\n *                   possibility to increase the amount of colorB present in\n *                   the output.  A value of colorBenhance = 1 means that\n *                   colorA and colorB are present in equal amounts.\n *                   Increasing this value puts more colorB in the output.\n *   gridDensity - Effective opacity of the grid pattern over the underlying\n *                   noise.\n *   baselinecolor - Base color of the grid lines.\n */\ncolor lunetteColor (\n\tfloat ss;\t\t/* ss coordinate for the lunette pattern */\n\tfloat tt;\t\t/* tt coordinate for the lunette pattern */\n\tfloat ssrepeats;\t/* number of repeats in the ss direction */\n\tfloat ttrepeats;\t/* number of repeats in the tt direction */\n\tfloat sslinewidth;\t/* proportional width of lines in ss */\n\tfloat ttlinewidth;\t/* proportional width of lines in tt */\n\tcolor colorA;\t\t/* first color in the pattern */\n\tcolor colorB;\t\t/* second color in the pattern */\n\tfloat noiseScale;\t/* scale of the noise relative to the grid */\n\tfloat noiseRandom;\t/* randomization for the noise */\n\tuniform float maxOctaves;\t/* maximum number of octives for the noise */\n\tuniform float lunacrity;\t/* lunacrity of the noise */\n\tuniform float gain;\t\t/* gain for the noise */\n\tfloat colorBenhance;\t/* amount to enhance color B */\n\tfloat gridDensity;\t/* density of the grid pattern */\n\tcolor baselinecolor;\t/* base color for the lines */\n) {\n\n\t/*\n\t * Calculate pulsegrid, which is a variable indicating the value of\n\t * the grid.  pulsegrid = 0 means that there is no grid at the point\n\t * whereas pulsegrid = 1 means that there IS a grid at the point.\n\t * pulsegrid varies smoothly between the two values to cope with\n\t * antialising at the edges of the grid.\n\t */\n\tfloat pulsess = filteredpulsetrain(\n\t\t1/ssrepeats, sslinewidth, ss, filterwidth(ss)\n\t);\n\tfloat pulsett = filteredpulsetrain(\n\t\t1/ttrepeats, ttlinewidth, tt, filterwidth(tt)\n\t);\n\tfloat pulsegrid = 1 - min(pulsess, pulsett); \n\n\t/*\n\t * Find the base color for the pattern.  The base color is a mix\n\t * between colorA and colorB, created using noise and other mixing\n\t * parameters.\n\t */\n\tpoint noisePt = noiseScale * \n\t\tpoint(ss*ssrepeats, tt*ttrepeats, noiseRandom);\n\tfloat noisefilterwidth = filterwidthp(noisePt);\n\tfloat noiseamt = (fBm(\n\t\tnoisePt, noisefilterwidth, maxOctaves, lunacrity, gain\n\t)+1) / 2;\n\tnoiseamt = pow(noiseamt, colorBenhance);\n\tcolor basecolor = mix(colorB, colorA, noiseamt);\n\n\t/*\n\t * find the base line color for the grid pattern\n\t */\n\tcolor linecolor = mix(basecolor, baselinecolor, gridDensity);\n\n\t/*\n\t * return the mix between the base grid and the colorful noise\n\t */\n\treturn mix(basecolor, linecolor, pulsegrid);\n\n}\n\nsurface k3d_lunette (\n\t/* Plastic illumination model parameters. */\n\tfloat Ka = 1;\n\tfloat Kd = .5;\n\tfloat Ks = .5;\n\tfloat roughness = .1;\n\tcolor specularcolor = 1;\n\t/* Grid pattern parameters. */\t\n\tfloat urepeats = 30;\t\t/* Number of repeats in u */\n\tfloat ulinewidth = 0.125;\t/* Relative width of grid lines in u */\n\tfloat vrepeats = 30;\t\t/* Number of repeats in v */\n\tfloat vlinewidth = 0.12;\t/* Relative width of grid lines in v */\n\t/* Colors used. */\n\tcolor colorA = color(.36, .58, .67);\n\tcolor colorB = color(.88, .88, .71);\n\tcolor baselinecolor = color(.51, .48, .52);\n\tfloat colorBenhance = 1.6;\t/* Enhancement of colorB in output */\n\tfloat gridDensity = .5;\t\t/* Effective opacity of the grid */\n\t/* fBm noise parameters */\n\tfloat noiseScale = .3;\n\tfloat noiseRandom = 0;\n\tfloat maxOctaves = 5;\n\tfloat lunacrity = 1.3;\n\tfloat gain = .7;\n) {\n\t/*\n\t * fetch the lunette color\n\t */\n\tcolor cc = lunetteColor(\n\t\tu, v, urepeats, vrepeats, ulinewidth, vlinewidth,\n\t\tcolorA, colorB, noiseScale, noiseRandom, maxOctaves,\n\t\tlunacrity, gain, colorBenhance, gridDensity, baselinecolor\n\t);\n\n\t/*\n\t * apply a plastic illumination model\n\t */\n\tnormal Nf = faceforward (normalize(N),I);\n\tOi = Os;\n\n\tCi = Os * ( cc * (Ka*ambient() + Kd*diffuse(Nf)) +\n\t\tspecularcolor * Ks*specular(Nf,-normalize(I),roughness));\n\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_lunette.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_lunette\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"urepeats\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"30\"/>\n\t\t\t<argument name=\"ulinewidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.125\"/>\n\t\t\t<argument name=\"vrepeats\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"30\"/>\n\t\t\t<argument name=\"vlinewidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.12\"/>\n\t\t\t<argument name=\"colorA\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.36 0.58 .67\"/>\n\t\t\t<argument name=\"colorB\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.88 0.88 0.71\"/>\n\t\t\t<argument name=\"baselinecolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.51 0.48 0.52\"/>\n\t\t\t<argument name=\"colorBenhance\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.6\"/>\n\t\t\t<argument name=\"gridDensity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"noiseScale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".3\"/>\n\t\t\t<argument name=\"noiseRandom\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"maxOctaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"5\"/>\n\t\t\t<argument name=\"lunacrity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.3\"/>\n\t\t\t<argument name=\"gain\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".7\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_matte.sl",
    "content": "/* matte.sl - Standard matte surface for RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nsurface k3d_matte(\n\tfloat Ka = 1;\n\tfloat Kd = 1;\n\t)\n{\n\tnormal Nf = faceforward(normalize(N), I);\n\tOi = Os;\n\tCi = Os * Cs * (Ka * ambient() + Kd * diffuse(Nf));\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_matte.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_matte\">\n\t\t\t<description>Standard matte surface for RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_metal.sl",
    "content": "/* metal.sl - Standard metal surface for RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nsurface k3d_metal(\n\tfloat Ka = 1;\n\tfloat Ks = 1;\n\tfloat roughness = 0.1;\n\t)\n{\n\tnormal Nf = faceforward(normalize(N), I);\n\tvector V = -normalize(I);\n\tOi = Os;\n\tCi = Os * Cs * (Ka * ambient() + Ks * specular(Nf, -I, roughness));\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_metal.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_metal\">\n\t\t\t<description>Standard metal surface for RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_mondometal.sl",
    "content": "/* MondoMetal.sl   Felipe Esquivel, july 2001\n * felipe@siggraph.org.mx\n * \n * Layered shader with mondo as a base and a metal modulated with a matte file.\n *\n * Version ampliada de Mondo.sl. Recibe un archivo B/N como mate, donde\n * las partes blancas producen un efecto metalico y donde lo oscuro \n * se comporta igual que mondo simple.\n */\n\nsurface\nk3d_mondometal(\n    string abColorMap = \"\";\n    float abColorMapBlur = 1;\n    float abUseColorMapAlpha = 0;\n    float abDiffuse = .8;\n    string abDiffuseMap = \"\";\n    float abDiffuseMapBlur = 1;\n    float abSpecular = .3;\n    string abSpecularMap = \"\";\n    float abSpecularMapBlur = 1;\n    color abSpecularColor = color(1,1,1);\n    string abSpecularColorMap = \"\";\n    float abSpecularColorMapBlur = 1;\n    float abRoughness = .3;\n    string abRoughnessMap = \"\";\n    float abRoughnessMapBlur = 1;\n    string abTransparencyMap = \"\";\n    float abInvertTransparencyMap = 0;\n    float abTransparencyMapBlur = 1;\n    color abIncandescence = color(0,0,0);\n    string abIncandescenseMap = \"\";\n    float abIncandescenseMapBlur = 1;\n    string abReflectionMap = \"\";\n    float abReflectionUp = 0;\n    float abReflectivity = .1;\n    float abReflectionMapBlur = 1;\n    string abBumpMap = \"\";\n    float abBumpMapBlur = 1;\n    float abBumpScale = 1.0;\n    float abDoDisplacement = 0.0;\n    float abUseNormals = 0;\n    float Ka = 0.05;\n    float Kd = 0.80;\n    float Ks = 0.80;\n    float roughness = 0.25;\n    color Cmetal = color(0.0,0.76,0.79);\n    string metalMatte = \"\";\n    point STMatrix0 = point \"shader\" (1,0,0);\n    point STMatrix1 = point \"shader\" (0,1,0);\n)\n{\n\n\n\n\n    extern vector I;\n\n    normal Nf;\n    vector V, D;\n    point PP;\n    color Csurf, Cspec, Copac, Cincand, Crefl;\n    color Cmatte = 0;\n    float ss, tt, roughness, diff, spec, bmp;\n\n    /* apply STMatrix to texture coordinates **/\n    ss = vector(s, t, 1) . vector(transform(\"shader\", STMatrix0));\n    tt = vector(s, t, 1) . vector(transform(\"shader\", STMatrix1));\n    \n    /* determine color **/\n    if(abColorMap != \"\")\n    {\n        Csurf = Cs * color texture(abColorMap, ss, tt,\n                            \"swidth\", abColorMapBlur,\n                            \"twidth\", abColorMapBlur );\n        if(abUseColorMapAlpha != 0)\n        {\n            Copac = float texture(abColorMap[3], ss, tt, \n                            \"swidth\", abColorMapBlur,\n                            \"twidth\", abColorMapBlur );\n            /* need to un-premultiply the color in this case */\n            Csurf = Csurf / Copac;\n        }\n        else\n        {\n            Copac = color(1, 1, 1);\n        }\n    }\n    else\n    {\n        Csurf = Cs;\n        Copac = color(1);\n    }\n\n    /* determine diffuse **/\n    if(abDiffuseMap != \"\")\n    {\n        diff = abDiffuse * float texture(abDiffuseMap, ss, tt, \n                            \"swidth\", abDiffuseMapBlur,\n                            \"twidth\", abDiffuseMapBlur );\n    }\n    else\n    {\n        diff = abDiffuse;\n    }\n    \n    /* determine specular */\n    if(abSpecularMap != \"\")\n    {\n        spec = abSpecular * float texture(abSpecularMap, ss, tt, \n                            \"swidth\", abSpecularMapBlur,\n                            \"twidth\", abSpecularMapBlur );\n\n    }\n    else\n    {\n        spec = abSpecular;\n    }\n    \n    /* determine specular color */\n    if(abSpecularColorMap != \"\")\n    {\n        Cspec = abSpecularColor * color texture(abSpecularColorMap, ss, tt,\n                      \"swidth\", abSpecularColorMapBlur, \n                      \"twidth\", abSpecularColorMapBlur );\n    }\n    else\n    {\n        Cspec = abSpecularColor;\n    }\n    /* determine roughness */\n    if(abRoughnessMap != \"\")\n    {\n        roughness = abRoughness * float texture(abRoughnessMap, ss, tt,\n                            \"swidth\", abRoughnessMapBlur, \n                            \"twidth\", abRoughnessMapBlur );\n    }\n    else\n    {\n        roughness = abRoughness;\n    }\n    \n    /* determine opacity */\n    if(abTransparencyMap != \"\")\n    {\n        if(abInvertTransparencyMap != 0)\n        {\n            Copac = Copac * color texture(abTransparencyMap, ss, tt,\n                            \"swidth\", abTransparencyMapBlur, \n                            \"twidth\", abTransparencyMapBlur );\n        }\n        else\n        {\n            Copac = Copac * (color(1) - color texture(abTransparencyMap, ss, tt,\n                            \"swidth\", abTransparencyMapBlur, \n                            \"twidth\", abTransparencyMapBlur ));\n        }\n    }\n    \n    /* determine incandescence */\n    if(abIncandescenseMap != \"\")\n    {\n        Cincand = abIncandescence * color texture(abIncandescenseMap, ss, tt,\n                            \"swidth\", abIncandescenseMapBlur, \n                            \"twidth\", abIncandescenseMapBlur );\n    }\n    else\n    {\n        Cincand = abIncandescence;\n    }\n    \n    \n    /* do the bump */\n    if( abBumpMap != \"\" )\n    {\n        bmp = abBumpScale * float texture( abBumpMap, ss, tt,\n                            \"swidth\", abBumpMapBlur,\n                            \"twidth\", abBumpMapBlur );\n        PP = transform(\"shader\", P);\n        Nf = normalize( ntransform(\"shader\", N) );\n        PP += bmp * Nf;\n        PP = transform(\"shader\", \"current\", PP);\n        Nf = calculatenormal(PP);\n\t\n\tif (abUseNormals == 1) {\n\t    normal deltaN = normalize(N) - normalize(Ng);\n\t    Nf = normalize(Nf) + deltaN;\n\t}\n\t\n        if( abDoDisplacement == 1.0 )\n            P = PP; /* usually it's better to do displacements in displacement shader */\n    }\n    else\n    {\n        Nf = N;\n    }\n\n    /* compute shading variables **/\n    Nf = faceforward(normalize(Nf), I , normalize(Nf));\n    V = -normalize(I);\n\n    /* get reflection from environment map **/\n    if( abReflectionMap != \"\" )\n    {\n        D = reflect(-V, Nf);\n        D = vtransform(\"worldspace\", D);\n        if( abReflectionUp != 0 )\n        {\n            D = vector(-zcomp(D), xcomp(D), ycomp(D));\n        }\n        Crefl = abReflectivity * \n                color environment(abReflectionMap, D,\n                                    \"swidth\", abReflectionMapBlur,\n                                    \"twidth\", abReflectionMapBlur );\n    }\n    else\n        Crefl = color(0);\n\n    /* Averiguamos si la textura es metlica o no */\n    if(metalMatte != \"\")\n    {\n        Cmatte = color texture(metalMatte, ss, tt,\n                            \"swidth\", abColorMapBlur,\n                            \"twidth\", abColorMapBlur);\n    }\n\n\n \n    /* now add it all together */\n    Oi = Os * Copac;\n    \n    /* Textura normal de Mondo*/\n    if(comp(Cmatte, 1) < 0.5){\n      Ci = Os * Copac * (Csurf * (Cincand + ambient() + diff * diffuse(Nf)) + \n           (spec * Cspec * (specular(Nf, V, roughness) + Crefl) ));\n    }\n    /* Textura metlica */\n    else{\n      Ci = Cmetal * Oi * (Ka * ambient() + Kd * diffuse(Nf) +\n            Ks * specular(Nf,-normalize(I),roughness));\n    }\n}\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_mondometal.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_mondometal\">\n\t\t\t<argument name=\"abColorMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"abColorMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"abUseColorMapAlpha\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"abDiffuse\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".8\"/>\n\t\t\t<argument name=\"abDiffuseMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"abDiffuseMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"abSpecular\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".3\"/>\n\t\t\t<argument name=\"abSpecularMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"abSpecularMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"abSpecularColor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"abSpecularColorMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"abSpecularColorMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"abRoughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".3\"/>\n\t\t\t<argument name=\"abRoughnessMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"abRoughnessMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"abTransparencyMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"abInvertTransparencyMap\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"abTransparencyMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"abIncandescence\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"abIncandescenseMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"abIncandescenseMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"abReflectionMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"abReflectionUp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"abReflectivity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"abReflectionMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"abBumpMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"abBumpMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"abBumpScale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.0\"/>\n\t\t\t<argument name=\"abDoDisplacement\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.0\"/>\n\t\t\t<argument name=\"abUseNormals\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.05\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.80\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.80\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.25\"/>\n\t\t\t<argument name=\"Cmetal\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"metalMatte\" storage_class=\"uniform\" type=\"string\" extended_type=\"string\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"STMatrix0\" storage_class=\"uniform\" type=\"point\" extended_type=\"point\" array_count=\"1\" space=\"shader\" output=\"0\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"STMatrix1\" storage_class=\"uniform\" type=\"point\" extended_type=\"point\" array_count=\"1\" space=\"shader\" output=\"0\" default_value=\"0 0 0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_mottled_clay.sl",
    "content": "\n\nsurface k3d_mottled_clay (\n\nfloat Ka1=0.8; \nfloat Kd1=0.5; \nfloat roughness1=0.1; \ncolor claycol1=color(0.88,0.74,0.42); \ncolor claycol2=color(0.59,0.37,0.19); \nfloat stucco_freq3=15; \nfloat transp=1; ) \n{\n/** Surface main-code start **/\n\npoint PP6=point(0.0,0.0,0.0); \n/** Basic fractal **/\npoint temp_PP6;\nif (PP6 == point(0.0,0.0,0.0)) {temp_PP6=P;} else {temp_PP6=PP6;}\ntemp_PP6=transform(\"shader\",P);\nuniform float i6;\nfloat size6,sum6,area6;\nsum6 = 0;\nsize6 = 1;\narea6 = sqrt(area(temp_PP6));\nwhile(area6<size6)\n{\nsum6 += size6*noise(temp_PP6/size6);\nsize6 /= 2;\n}\n/*** stucco pattern code ***/ \nfloat magnitude3; \npoint PP3; \nPP3 = transform (\"shader\", P); \nmagnitude3 = pow (noise(PP3 * stucco_freq3), sum6);\ncolor\nLocIllumOrenNayar (normal N; vector V; float roughness;)\n{\n/* Surface roughness coefficients for Oren/Nayar's formula */\nfloat sigma2 = roughness * roughness;\nfloat A = 1 - 0.5 * sigma2 / (sigma2 + 0.33);\nfloat B = 0.45 * sigma2 / (sigma2 + 0.09);\n/* Useful precomputed quantities */\nfloat theta_r = acos (V . N); /* Angle between V and N */\nvector V_perp_N = normalize(V-N*(V.N)); /* Part of V perpendicular to N */\n\n/* Accumulate incoming radiance from lights in C */\ncolor C = 0;\nextern point P;\nilluminance (P, N, PI/2) {\n/* Must declare extern L & Cl because we're in a function */\nextern vector L; extern color Cl;\nfloat nondiff = 0;\nlightsource (\"__nondiffuse\", nondiff);\nif (nondiff < 1) {\nvector LN = normalize(L);\nfloat cos_theta_i = LN . N;\nfloat cos_phi_diff = V_perp_N . normalize(LN - N*cos_theta_i);\nfloat theta_i = acos (cos_theta_i);\nfloat alpha = max (theta_i, theta_r);\nfloat beta = min (theta_i, theta_r);\nC += (1-nondiff) * Cl * cos_theta_i * \n(A + B * max(0,cos_phi_diff) * sin(alpha) * tan(beta));\n}\n}\nreturn C;\n\n}\n\nnormal Nf1 = faceforward (normalize(N), I);\ncolor ci1 = (float(magnitude3)*claycol1+(1-float(magnitude3))*claycol2) * (Ka1*ambient() + Kd1*LocIllumOrenNayar(Nf1,-normalize(I),roughness1));\n\n/** Surface main-code end **/\n\nCi = ci1;\nOi = color(transp);\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_mottled_clay.sl.slmeta",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<shaders>\n\t\t<shader name=\"k3d_mottled_clay\" type=\"surface\">\n\t\t\t<description/>\n\t\t\t<authors/>\n\t\t\t<copyright/>\n\t\t\t<argument name=\"Ka1\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.8\"/>\n\t\t\t<argument name=\"Kd1\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"roughness1\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"claycol1\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.88 0.74 0.42\"/>\n\t\t\t<argument name=\"claycol2\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.59 0.37 0.19\"/>\n\t\t\t<argument name=\"stucco_freq3\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"15\"/>\n\t\t\t<argument name=\"transp\" label=\"\" description=\"\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_oak.sl",
    "content": "/****************************************************************************\n * oak.sl\n *\n * Description: makes procedural solid texture that looks very much like\n *    wood grain.  The rings surround the z axis, so to position the\n *    pattern, one should translate the shadingspace (which defaults to\n *    \"shader\").  This makes a fairly plain, unfinished wood, that looks\n *    very much like oak.\n *   \n * Parameters for the coordinate mapping: \n *   shadingspace - space in which the pattern is laid out\n *   shadingfreq - overall scaling factor for the pattern\n *   Pref - if supplied, gives the reference pose\n *\n * Parameters for the color and pattern: \n *   Clightwood - the light, \"background\" wood color\n *   Cdarkwood - the darker color in the ring/grain\n *   ringfreq - mean frequency of ring spacing\n *   ringunevenness - 0=equally spaced rings, larger is unequally spaced\n *   grainfreq - frequency of the fine grain\n *   ringnoise, ringnoisefreq - general warping of the domain\n *   trunkwobble, trunkwobblefreq - controls noise which wobbles the\n *       axis of the trunk so that it's not perfectly on the z axis.\n *   angularwobble, angularwobblefreq - warping indexed by angle about\n *       the z axis.\n *   ringy, grainy - overall scale on the degree to which rings and\n *       grain are weighted.  0 turns one off, 1 makes full effect.\n *   divotdepth - depth (in shader units) of the displacement due to\n *       ring or grain.\n *   truedisp - 1 for true displacement, 0 for bump mapping\n *\n * Parameters for illumination model:\n *   Ka, Kd, Ks, roughness - the usual meaning\n *   \n ***************************************************************************\n *\n * Author: Larry Gritz, 1999\n *\n * Contacts:  lg@pixar.com\n *\n * $Revision: 1.1 $    $Date: 2006/02/25 20:11:54 $\n *\n ****************************************************************************/\n\n#include \"k3d_project.h\"\n#include \"k3d_pshad.h\"\n#include \"k3d_material.h\"\n#include \"k3d_displace.h\"\n\n#include \"k3d_oak.h\"\n\n\n\nsurface k3d_oak(float Ka = 1, Kd = 1, Ks = .25, roughness = 0.2;\n\t\tDEFAULT_PSHAD_PARAMS;\n\t\tfloat ringfreq = 8, ringunevenness = 0.5;\n\t\tfloat ringnoise = 0.02, ringnoisefreq = 1;\n\t\tfloat grainfreq = 25;\n\t\tfloat trunkwobble = 0.15, trunkwobblefreq = 0.025;\n\t\tfloat angularwobble = 1, angularwobblefreq = 1.5;\n\t\tfloat divotdepth = 0.05;\n\t\tcolor Clightwood = color(.5, .2, .067);\t/* light wood color */\n\t\tcolor Cdarkwood = color(0.15, 0.077, 0.028);\n\t\tfloat ringy = 1, grainy = 1;\n\t\tfloat truedisp = 0;\n  )\n{\n  GET_PSHAD;\n  normal Nf = faceforward(normalize(N), I);\n\n  float wood;\n  wood =\n    oaktexture(Pshad, dPshad, ringfreq, ringunevenness, grainfreq, ringnoise,\n\t       ringnoisefreq, trunkwobble, trunkwobblefreq, angularwobble,\n\t       angularwobblefreq, ringy, grainy);\n  color Cwood = mix(Clightwood, Cdarkwood, wood);\n  Nf = faceforward(Displace(Nf, \"shader\", -wood * divotdepth, truedisp), I);\n\n  /* Illumination model - just use plastic */\n  Ci = MaterialPlastic(Nf, Cwood, Ka, Kd, Ks * (1 - 0.5 * wood), roughness);\n  Oi = Os;\n  Ci *= Oi;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_oak.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_oak\">\n\t\t\t<description>Procedural solid wood grain texture</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".25\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.2\"/>\n\t\t\t<argument name=\"shadingspace\" storage_class=\"uniform\" type=\"string\" extended_type=\"space\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"shader\"/>\n\t\t\t<argument name=\"shadingfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"ringfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"8\"/>\n\t\t\t<argument name=\"ringunevenness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"ringnoise\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.02\"/>\n\t\t\t<argument name=\"ringnoisefreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"grainfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"25\"/>\n\t\t\t<argument name=\"trunkwobble\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.15\"/>\n\t\t\t<argument name=\"trunkwobblefreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.025\"/>\n\t\t\t<argument name=\"angularwobble\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"angularwobblefreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1.5\"/>\n\t\t\t<argument name=\"divotdepth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.05\"/>\n\t\t\t<argument name=\"Clightwood\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5 0.2 0.067\"/>\n\t\t\t<argument name=\"Cdarkwood\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.15 0.077 0.028\"/>\n\t\t\t<argument name=\"ringy\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"grainy\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"truedisp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_oakplank.sl",
    "content": "/****************************************************************************\n * oakplank.sl\n *\n * Description: makes procedural varnished wood planks.  The planks\n *    are projected onto the x-y plane, with the length aligned with\n *    the y axis.  The subpattern within each individual plank is just\n *    a shifted version of the oaktexture function from oak.h.\n *   \n * Parameters for the coordinate mapping: \n *   shadingspace - space in which the pattern is laid out\n *   shadingfreq - overall scaling factor for the pattern\n *   Pref - if supplied, gives the reference pose\n *\n * Parameters for the pattern of the plank structure: \n *   plankwidth, planklength - size of the planks\n *   groovewidth, grooveheight - width of the grooves between planks\n *   Cgroove - color of the grooves between the planks\n *   groovedepth - how far down do the grooves displace?\n *   edgewidth - how close to the plank border does the wood start to curl?\n *   varyhue, varysat, varylum - control plank-to-plank color variation\n * \n * Parameters for the color and pattern of the wood grain: \n *   Clightwood - the light, \"background\" wood color\n *   Cdarkwood - the darker color in the ring/grain\n *   ringfreq - mean frequency of ring spacing\n *   ringunevenness - 0=equally spaced rings, larger is unequally spaced\n *   grainfreq - frequency of the fine grain\n *   ringnoise, ringnoisefreq - general warping of the domain\n *   trunkwobble, trunkwobblefreq - controls noise which wobbles the\n *       axis of the trunk so that it's not perfectly on the z axis.\n *   angularwobble, angularwobblefreq - warping indexed by angle about\n *       the z axis.\n *   ringy, grainy - overall scale on the degree to which rings and\n *       grain are weighted.  0 turns one off, 1 makes full effect.\n *   divotdepth - depth (in shader units) of the displacement due to\n *       ring or grain.\n *   truedisp - 1 for true displacement, 0 for bump mapping\n *\n * Parameters for illumination model:\n *   Ka, Kd, Ks, roughness - the usual meaning\n *   Kr, blur, eta - reflection parameters for the tile\n *   envname, envspace, envrad - environment mapping controls\n *   rayjitter, raysamples - ray tracing controls\n *   varnishlump, arnishlumpfreq - amp & freq of lumpiness in the varnish\n *\n ***************************************************************************\n *\n * Author: Larry Gritz, 1999\n *\n * Contacts:  lg@pixar.com\n *\n * $Revision: 1.2 $    $Date: 2006/03/08 16:01:22 $\n *\n ****************************************************************************/\n\n\n#include \"k3d_project.h\"\n#include \"k3d_pshad.h\"\n#include \"k3d_material.h\"\n#include \"k3d_noises.h\"\n#include \"k3d_displace.h\"\n#include \"k3d_patterns.h\"\n\n#include \"k3d_oak.h\"\n\n\n/* Given 2-D texture coordinates ss,tt, filter widths ds, dt, and the\n * width and height of the grooves between tiles, figure out which\n * (integer indexed) plank we are on and what coordinates within our\n * individual plank we are shading.\n */\nfloat plankpattern(float ss, tt, ds, dt;\n\t\t   float plankwidth, planklength;\n\t\t   float groovewidth, grooveheight;\n\t\t   output float swhichplank, twhichplank;\n\t\t   output float splank, tplank;)\n{\n  /* Find which s plank we're on and our s coordinate within it */\n  swhichplank = floor(ss / plankwidth);\n  splank = ss - swhichplank * plankwidth;\n  /* Shift in t a random amount for each plank column */\n  float newt = tt + planklength * cellnoise(swhichplank);\n  /* Find which t plank we're on and our t coordinate within it */\n  twhichplank = floor(newt / planklength);\n  tplank = newt - twhichplank * planklength;\n  /* Calculate our \"in-plank\" value by multiplying two perpendicular\n   * filtered pulsetrain functions.\n   */\n  return filteredpulsetrain(groovewidth, plankwidth, ss + groovewidth / 2,\n\t\t\t    ds) * filteredpulsetrain(grooveheight,\n\t\t\t\t\t\t     planklength,\n\t\t\t\t\t\t     newt + grooveheight / 2,\n\t\t\t\t\t\t     dt);\n}\n\n\n\nsurface k3d_oakplank(float Ka = 1, Kd = 1, Ks = .75, roughness = 0.1;\n\t\t     float Kr = 1, blur = 0, eta = 1.5;\n\t\t     DECLARE_DEFAULTED_ENVPARAMS;\n\t\t     DEFAULT_PSHAD_PARAMS;\n\t\t     float ringfreq = 8, ringunevenness = 0.5;\n\t\t     float ringnoise = 0.02, ringnoisefreq = 1;\n\t\t     float grainfreq = 25;\n\t\t     float trunkwobble = 0.15, trunkwobblefreq = 0.025;\n\t\t     float angularwobble = 1, angularwobblefreq = 1.5;\n\t\t     float divotdepth = 0.012, truedisp = 0;\n\t\t     color Clightwood = color(.5, .2, .067);\t/* light wood color */\n\t\t     color Cdarkwood = color(0.15, 0.077, 0.028);\n\t\t     color Cgroove = color(0.02, 0.02, 0.02);\n\t\t     float ringy = 1, grainy = 1;\n\t\t     float plankwidth = 2, planklength = 30;\n\t\t     float groovewidth = 0.05, grooveheight = 0.05;\n\t\t     float varyhue = 0.015, varysat = 0.1, varylum = 0.5;\n\t\t     float groovedepth = 0.03, edgewidth = 0.1;\n\t\t     float varnishlump = 0.01, varnishlumpfreq = 0.5;\n  )\n{\n  GET_PSHAD;\n  float ss = xcomp(Pshad), tt = ycomp(Pshad), height = zcomp(Pshad);\n  float dss = filterwidth(ss), dtt = filterwidth(tt);\n\n  /*\n   * Find out where in the pattern we are: which plank we're on, and\n   * the (splank,tplank) coordinates (both on [0,1]) within our tile.\n   */\n  float swhichplank, twhichplank, splank, tplank;\n  float inplank = plankpattern(ss, tt, dss, dtt, plankwidth, planklength,\n\t\t\t       groovewidth, grooveheight,\n\t\t\t       swhichplank, twhichplank, splank, tplank);\n  float plankindex = swhichplank + 13 * twhichplank;\n  point Ppat =\n    point(splank - 0.5, height - 0.01 * tplank, tplank) + vector(1, 5,\n\t\t\t\t\t\t\t\t 10) *\n    (vector cellnoise(swhichplank, twhichplank) - 0.5);\n\n  float wood = oaktexture(Ppat, dPshad, ringfreq, ringunevenness, grainfreq,\n\t\t\t  ringnoise, ringnoisefreq, trunkwobble,\n\t\t\t  trunkwobblefreq, angularwobble,\n\t\t\t  angularwobblefreq, ringy, grainy);\n  color Cwood = mix(Clightwood, Cdarkwood, wood);\n\n  Cwood = varyEach(Cwood, plankindex, varyhue, varysat, varylum);\n  Cwood = mix(Cgroove, Cwood, inplank);\n\n  /* Displacement: the edges of the planks displace down a bit, as do\n   * the grooves between planks. \n   */\n  float edgedisp = smoothpulse(0, edgewidth, plankwidth - edgewidth,\n\t\t\t       plankwidth, splank);\n  edgedisp *=\n    smoothpulse(0, edgewidth, planklength - edgewidth, planklength, tplank);\n  normal Nf = faceforward(normalize(N), I);\n  float disp = -wood * divotdepth + groovedepth * (edgedisp - 1);\n  disp +=\n    varnishlump * filteredsnoise(Pshad * varnishlumpfreq,\n\t\t\t\t dPshad * varnishlumpfreq);\n  Nf = faceforward(Displace(Nf, \"shader\", disp, truedisp), I);\n\n  /* Illumination model\n   * Less specular in the grooves, more specular in the dark wood. \n   */\n  float specadjusted = 1 + .3 * wood - 0.8 * (1 - inplank);\n  Ci =\n    MaterialShinyPlastic(Nf, Cwood, Ka, Kd, specadjusted * Ks, roughness,\n\t\t\t specadjusted * Kr, blur, eta, 1, ENVPARAMS);\n  Oi = Os;\n  Ci *= Oi;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_oakplank.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_oakplank\">\n\t\t\t<description>Makes procedural varnished wood planks</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".75\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"Kr\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"blur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"eta\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1.5\"/>\n\t\t\t<argument name=\"envname\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"envspace\" storage_class=\"uniform\" type=\"string\" extended_type=\"space\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"world\"/>\n\t\t\t<argument name=\"envrad\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"100\"/>\n\t\t\t<argument name=\"rayjitter\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"raysamples\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"shadingspace\" storage_class=\"uniform\" type=\"string\" extended_type=\"space\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"shader\"/>\n\t\t\t<argument name=\"shadingfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"ringfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"8\"/>\n\t\t\t<argument name=\"ringunevenness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"ringnoise\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.02\"/>\n\t\t\t<argument name=\"ringnoisefreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"grainfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"25\"/>\n\t\t\t<argument name=\"trunkwobble\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.15\"/>\n\t\t\t<argument name=\"trunkwobblefreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.025\"/>\n\t\t\t<argument name=\"angularwobble\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"angularwobblefreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1.5\"/>\n\t\t\t<argument name=\"divotdepth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.012\"/>\n\t\t\t<argument name=\"truedisp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"Clightwood\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5 0.2 0.067\"/>\n\t\t\t<argument name=\"Cdarkwood\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.15 0.077 0.028\"/>\n\t\t\t<argument name=\"Cgroove\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.02 0.02 0.02\"/>\n\t\t\t<argument name=\"ringy\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"grainy\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"plankwidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"2\"/>\n\t\t\t<argument name=\"planklength\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"30\"/>\n\t\t\t<argument name=\"groovewidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.05\"/>\n\t\t\t<argument name=\"grooveheight\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.05\"/>\n\t\t\t<argument name=\"varyhue\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.015\"/>\n\t\t\t<argument name=\"varysat\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"varylum\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"groovedepth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.03\"/>\n\t\t\t<argument name=\"edgewidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"varnishlump\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.01\"/>\n\t\t\t<argument name=\"varnishlumpfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_orennayar.sl",
    "content": "/* renamed LG_orennayar.sl -- tal@SpamSucks_cs.caltech.edu */\n\n/*\n * orennayar.sl - rough diffuse surface\n *\n * \n * DESCRIPTION:\n *   Makes a rough surface using a BRDF which is more accurate than\n *   Lambert.  Based on Oren & Nayar's model (see Proc. SIGGRAPH 94).\n *\n *   Lambertian (isotropic) BRDF is a simple approximation, but not\n *   an especially accurate one for rough surfaces.  Truly rough surfacs\n *   tend to act more like retroreflectors than like isotropic scatterers.\n * \n * PARAMETERS:\n *   Ka, Kd - just like matte.sl\n *   sigma - roughness (0 is lambertian, larger values are rougher)\n *\n * AUTHOR:  Larry Gritz\n *\n * REFERENCES:\n *   Oren, Michael and Shree K. Nayar.  \"Generalization of Lambert's\n *         Reflectance Model,\" Computer Graphics Annual Conference\n *         Series 1994 (Proceedings of SIGGRAPH '94), pp. 239-246.\n *\n * NOTES:\n *   1. Note that this is really just an illuminance loop that gathers\n *      light from the sources and applies Oren & Nayar's local reflectance\n *      model to the result.  It could easily be packaged up as a macro\n *      or a function and used in any other shader, in place of diffuse().\n *   2. Examination of why rough surfaces are not Lambertian will lead\n *      you to the solution to the famous \"flat full moon\" problem.\n *\n * HISTORY:\n *   14 June 1994 -- written by Larry Gritz\n *\n */\n\n\nsurface\nk3d_orennayar (float Ka = 1;\n\t   float Kd = .5;\n\t   float sigma = 0.0; )\n{\n    point Nf, IN, Eye, LN;\n    color lightC = 0;\n    color L1, L2;\n    float C1, C2, C3;\n    float theta_r, theta_i, cos_theta_i;\n    float alpha, beta, sigma2, cos_phi_diff;\n\n    Nf = faceforward (normalize(N),I);\n    IN = normalize (I);\n    Eye = -IN;\n    theta_r = acos (Eye . Nf);\n    sigma2 = sigma*sigma;\n\n    illuminance (P, Nf, PI/2) {\n\tLN = normalize(L);\n\tcos_theta_i = LN . Nf;\n\tcos_phi_diff = normalize(Eye-Nf*(Eye.Nf)) . normalize(LN - Nf*(LN.Nf));\n\ttheta_i = acos (cos_theta_i);\n\talpha = max (theta_i, theta_r);\n\tbeta = min (theta_i, theta_r);\n\tC1 = 1 - 0.5 * sigma2/(sigma2+0.33);\n\tC2 = 0.45 * sigma2 / (sigma2 + 0.09);\n\tif (cos_phi_diff >= 0)\n\t    C2 *= sin(alpha);\n\telse C2 *= (sin(alpha) - pow(2*beta/PI,3));\n\tC3 = 0.125 * sigma2 / (sigma2+0.09) * pow ((4*alpha*beta)/(PI*PI),2);\n\tL1 = Cs * (cos_theta_i * (C1 + cos_phi_diff * C2 * tan(beta) +\n\t\t\t\t  (1 - abs(cos_phi_diff)) * C3 * tan((alpha+beta)/2)));\n\tL2 = (Cs * Cs) * (0.17 * cos_theta_i * sigma2/(sigma2+0.13) *\n\t\t\t  (1 - cos_phi_diff*(4*beta*beta)/(PI*PI)));\n\tlightC += (L1 + L2) * Cl;\n    }\n\n    Oi = Os;\n    Ci = Os * (Cs * (Ka*ambient()) + Kd*lightC);\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_orennayar.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_orennayar\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"sigma\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_paintedplastic.sl",
    "content": "/* paintedplastic.sl - Standard texture map surface for RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n *\n * DESCRIPTION:\n *    Apply a texture map to a plastic surface, indexing the texture\n *    by the s,t parameters of the surface.\n *\n * PARAMETERS:\n *    Ka, Kd, Ks, roughness, specularcolor - the usual meaning.\n *    texturename - the name of the texture file.\n *\n */\n\nsurface k3d_paintedplastic(\n\tfloat Ka = 1;\n\tfloat Kd = .5;\n\tfloat Ks = .5;\n\tfloat roughness = .1;\n\tcolor specularcolor = 1;\n\tstring texturename = \"\";\n\t)\n{\n\tcolor Ct;\n\n\tif(texturename != \"\")\n\t\tCt = color texture(texturename);\n\telse\n\t\tCt = 1;\n\n\tnormal Nf = faceforward (normalize(N), I);\n\tvector V = -normalize(I);\n\tOi = Os;\n\tCi = Os * (Cs * Ct * (Ka * ambient() + Kd * diffuse(Nf)) + specularcolor * Ks * specular(Nf, V, roughness));\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_paintedplastic.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_paintedplastic\">\n\t\t\t<description>Standard texture map surface for RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".5\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".5\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".1\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"texturename\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_parquet_plank.sl",
    "content": "/*\n * parquet_plank.sl -- another surface shader for wood.\n *\n * DESCRIPTION:\n *   Makes texture of wooden planks in s-t space.  This wood looks rather\n *   like oak plank parquet floor tiles.  The actual wood and plank pattern\n *   is based on my \"planks\" shader.  This shader works best if \"s\" and \"t\"\n *   units are both the same size in world space.\n *\n * PARAMETERS:\n *   Ka, Kd, Ks, specular, roughness - work just like the plastic shader\n *   txtscale - overall scaling factor for the texture\n *   plankwidth - width of each plank (in terms of s/t)\n *   plankspertile - number of planks in each parquet tile\n *   ringscale - scaling for the ring spacing\n *   grainscale - scaling for the fine grain\n *   groovewidth - width of the grooves between the planks (in terms of s/t)\n *   lightwood, darkwood - surface colors for the wood itself\n *   groovecolor - the color of the \"grooves\" between the planks\n *   plankvary - controls how much wood color varies from plank to plank\n *   grainy - relative graininess (0 = no fine grain)\n *   wavy - relative wavyness of the ring pattern\n *\n * ANTIALIASING: this shader does a pretty good job of antialiasing itself,\n *   even with low sampling densities.\n *\n * AUTHOR: Larry Gritz, email: lg@bmrt.org\n *\n */\n\n#include \"k3d_filterwidth.h\"\n#include \"k3d_noises.h\"\n#include \"k3d_rmannotes.h\"\n\nsurface k3d_parquet_plank(float Ka = 1, Kd = 0.75, Ks = .15, roughness = .025;\n\t\t\t  color specularcolor = 1;\n\t\t\t  float ringscale = 15, grainscale = 60;\n\t\t\t  float txtscale = 1;\n\t\t\t  float plankspertile = 4;\n\t\t\t  color lightwood = color(0.57, 0.292, 0.125);\n\t\t\t  color darkwood = color(0.275, 0.15, 0.06);\n\t\t\t  color groovecolor = color(.05, .04, .015);\n\t\t\t  float plankwidth = .05, groovewidth = 0.001;\n\t\t\t  float plankvary = 0.8;\n\t\t\t  float grainy = 1, wavy = 0.08;)\n{\n\n  float r, r2;\n  normal Nf;\n  float whichrow, whichplank;\n  float swidth, twidth, fwidth, ss, tt, w, h, fade, ttt;\n  color Ct, woodcolor;\n  float groovy;\n  float PGWIDTH, PGHEIGHT, GWF, GHF;\n  float tmp, planklength;\n\n  PGWIDTH = plankwidth + groovewidth;\n  planklength = PGWIDTH * plankspertile - groovewidth;\n  PGHEIGHT = planklength + groovewidth;\n  GWF = groovewidth * 0.5 / PGWIDTH;\n  GHF = groovewidth * 0.5 / PGHEIGHT;\n\n  /* Determine how wide in s-t space one pixel projects to */\n  swidth =\n    (max(abs(Du(s) * du) + abs(Dv(s) * dv), MINFILTWIDTH) / PGWIDTH) *\n    txtscale;\n  twidth =\n    (max(abs(Du(t) * du) + abs(Dv(t) * dv), MINFILTWIDTH) / PGHEIGHT) *\n    txtscale;\n  fwidth = max(swidth, twidth);\n\n  Nf = faceforward(normalize(N), I);\n\n  ss = (txtscale * s) / PGWIDTH;\n  whichrow = floor(ss);\n  tt = (txtscale * t) / PGHEIGHT;\n  whichplank = floor(tt);\n  if(mod(whichrow / plankspertile + whichplank, 2) >= 1)\n    {\n      ss = txtscale * t / PGWIDTH;\n      whichrow = floor(ss);\n      tt = txtscale * s / PGHEIGHT;\n      whichplank = floor(tt);\n      tmp = swidth;\n      swidth = twidth;\n      twidth = tmp;\n    }\n  ss -= whichrow;\n  tt -= whichplank;\n  whichplank += 20 * (whichrow + 10);\n\n  /*\n   * Figure out where the grooves are.  The value groovy is 0 where there\n   * are grooves, 1 where the wood grain is visible.  Do some simple\n   * antialiasing.\n   */\n  if(swidth >= 1)\n    w = 1 - 2 * GWF;\n  else\n    w =\n      clamp(boxstep(GWF - swidth, GWF, ss), max(1 - GWF / swidth, 0),\n\t    1) - clamp(boxstep(1 - GWF - swidth, 1 - GWF, ss), 0,\n\t\t       2 * GWF / swidth);\n  if(twidth >= 1)\n    h = 1 - 2 * GHF;\n  else\n    h =\n      clamp(boxstep(GHF - twidth, GHF, tt), max(1 - GHF / twidth, 0),\n\t    1) - clamp(boxstep(1 - GHF - twidth, 1 - GHF, tt), 0,\n\t\t       2 * GHF / twidth);\n  /* This would be the non-antialiased version:\n   * w = step (GWF,ss) - step(1-GWF,ss);\n   * h = step (GHF,tt) - step(1-GHF,tt);\n   */\n  groovy = w * h;\n\n\n  /*\n   * Add the ring patterns\n   */\n  fade = smoothstep(1 / ringscale, 8 / ringscale, fwidth);\n  if(fade < 0.999)\n    {\n      ttt = tt / 4 + whichplank / 28.38 + wavy * noise(8 * ss, tt / 4);\n      r = ringscale * noise(ss - whichplank, ttt);\n      r -= floor(r);\n      r =\n\t0.3 + 0.7 * smoothstep(0.2, 0.55, r) * (1 - smoothstep(0.75, 0.8, r));\n      r = (1 - fade) * r + 0.65 * fade;\n\n      /*\n       * Multiply the ring pattern by the fine grain\n       */\n      fade = smoothstep(2 / grainscale, 8 / grainscale, fwidth);\n      if(fade < 0.999)\n\t{\n\t  r2 = 1.3 - noise(ss * grainscale, (tt * grainscale / 4));\n\t  r2 = grainy * r2 * r2 + (1 - grainy);\n\t  r *= (1 - fade) * r2 + (0.75 * fade);\n\t}\n      else\n\tr *= 0.75;\n    }\n  else\n    r = 0.4875;\n\n\n  /* Mix the light and dark wood according to the grain pattern */\n  woodcolor = mix(lightwood, darkwood, r);\n\n  /* Add plank-to-plank variation in overall color */\n  woodcolor *=\n    (1 - plankvary / 2 + plankvary * (float noise(whichplank + 0.5)));\n\n  Ct = mix(groovecolor, woodcolor, groovy);\n\n  /* Use the plastic illumination model */\n  Oi = Os;\n  Ci =\n    Os * (Ct * (Ka * ambient() + Kd * diffuse(Nf)) +\n\t  specularcolor * Ks * specular(Nf, -normalize(I), roughness));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_parquet_plank.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_parquet_plank\">\n\t\t\t<description>Oak plank parquet floor tiles</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.75\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".15\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".025\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"ringscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"15\"/>\n\t\t\t<argument name=\"grainscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"60\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"plankspertile\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"4\"/>\n\t\t\t<argument name=\"lightwood\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.57 0.292 0.125\"/>\n\t\t\t<argument name=\"darkwood\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.275 0.15 0.06\"/>\n\t\t\t<argument name=\"groovecolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.05 0.04 0.015\"/>\n\t\t\t<argument name=\"plankwidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".05\"/>\n\t\t\t<argument name=\"groovewidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.001\"/>\n\t\t\t<argument name=\"plankvary\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.8\"/>\n\t\t\t<argument name=\"grainy\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"wavy\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.08\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_particle.sl",
    "content": "/** Copied from RenderMan AppNote #18 */\n\nsurface k3d_particle()\n{\n\tCi = Cs * Os;\n\tOi = 0.0001;\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_particle.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_particle\">\n\t\t\t<description>Basic additive shader for particles</description>\n\t\t\t<authors>RenderMan AppNote #18</authors>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_planetclouds.sl",
    "content": "/*\n * planetclouds.sl - surface for a semi-opaque cloud layer to be put on\n *                   an earth-like planetary model.\n *\n * DESCRIPTION:\n *      When put on a sphere, sets the color & opacity of the sphere to\n *   make it look like the clouds surrounding an Earth-like planet.\n *      The shader works by creating a fractal turbulence function over\n *   the surface, then modulating the opacity based on this function in\n *   a way that looks like clouds on a planetary scale.\n *\n *\n * PARAMETERS:\n *    Ka, Kd - the usual meaning\n *    distortionscale - controls the amount of texture distortion\n *    omega,lambda,octaves - the fractal characteristics of the clouds\n *    p4 - beats me\n *    offset - controls the zero crossings (where the clouds disappear)\n *\n *\n * HINTS:\n *   1. The way this shader is typically used is to have two concentric\n *      spheres represent a planet.  The inner one is colored like the\n *      surface of a planet (perhaps using the \"terran\" shader), and the\n *      outer one uses the \"planetclouds\" shader.\n *   2. The best effects are achieved when the clouds not only occlude\n *      the view of the planet, but also shadow it.  The way to do this\n *      with the Blue Moon Renderer is to let the light cast shadows,\n *      then declare the cloud sphere as follows:\n *           AttributeBegin\n *             Attribute \"render\" \"casts_shadows\" \"shade\"\n *             Surface \"planetclouds\"\n *             Sphere 1 -1 1 360\n *           AttributeEnd\n *   3. The default values for the shader assume that the planet is\n *      represented by a unit sphere.  The texture space and/or parameters\n *      to this shader will need to be altered if the size of your planet\n *      is radically different.\n *\n *\n * AUTHOR: Ken Musgrave\n *    Conversion to Shading Language and other minor changes by Larry Gritz.\n *\n * REFERENCES:\n *    _Texturing and Modeling: A Procedural Approach_, by David S. Ebert, ed.,\n *    F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, and Steven Worley.\n *    Academic Press, 1994.  ISBN 0-12-228760-6.\n *\n * HISTORY:\n *    ???? - original texture developed by Ken Musgrave.\n *    Feb 1994 - Conversion to Shading Language by L. Gritz\n *\n * last modified 1 March 1994 by lg\n */\n\n#include \"k3d_noises.h\"\n#include \"k3d_constants.h\"\n\n\n\nsurface k3d_planetclouds(float Ka = 0.5, Kd = 0.75;\n\t\t\t float distortionscale = 1; float omega = 0.7;\n\t\t\t float lambda = 2; float octaves = 9;\n\t\t\t float offset = 0;)\n{\n  point Pdistortion;\t\t/* \"distortion\" vector */\n  point PP;\t\t\t/* Point after distortion */\n  float l, o, a, i;\t\t/* Loop control for fractal sum */\n  float result;\t\t\t/* Fractal sum is stored here */\n\n  /* Transform to texture coordinates */\n  PP = transform(\"shader\", P);\n\n  /* Add in \"distortion\" vector */\n  Pdistortion = distortionscale * DNoise(PP);\n  /* Second cirrus: replace DNoise with vector fBm */\n  PP = PP + Pdistortion;\n\n  /* Compute VLfBm */\n  l = 1;\n  o = 1;\n  a = 0;\n  for(i = 0; i < octaves && o >= VERY_SMALL; i += 1)\n    {\n      a += o * VLNoise(PP * l, 1);\n      l *= lambda;\n      o *= omega;\n    }\n  result = a;\n\n  /* Adjust zero crossing (where the clouds disappear) */\n  result += offset;\n\n  if(result < 0)\n    result = 0;\n\n  /* Scale density */\n  result /= (1 + offset);\n\n  /* Modulate surface opacity by the cloud value */\n  Oi = result * Os;\n\n  /* Shade like matte, but with color scaled by cloud opacity */\n  Ci = Oi * (Ka * ambient() + Kd * diffuse(faceforward(normalize(N), I)));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_planetclouds.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_planetclouds\">\n\t\t\t<description>Semi-opaque cloud layer for an Earth-like planetary model</description>\n\t\t\t<authors>Ken Musgrave</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.75\"/>\n\t\t\t<argument name=\"distortionscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"omega\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.7\"/>\n\t\t\t<argument name=\"lambda\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"2\"/>\n\t\t\t<argument name=\"octaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"9\"/>\n\t\t\t<argument name=\"offset\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_plastic.sl",
    "content": "/* plastic.sl - Standard plastic surface for RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nsurface k3d_plastic(\n\tfloat Ks = 0.5; \n\tfloat Kd = 0.5; \n\tfloat Ka = 1;\n\tfloat roughness = 0.1;\n\tcolor specularcolor = 1;\n\t)\n{\n\tnormal Nf = faceforward(normalize(N), I);\n\tnormal V = normalize(-I);\n\n\tOi = Os;\n\tCi = Os * (Cs * (Ka * ambient() + Kd * diffuse(Nf)) + specularcolor * Ks * specular(Nf, V, roughness));\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_plastic.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_plastic\">\n\t\t\t<description>Standard plastic surface for RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"Ka\" label=\"Ambient\" description=\"Ambient Amount\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" label=\"Diffuse\" description=\"Diffuse Amount\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".5\"/>\n\t\t\t<argument name=\"Ks\" label=\"Specular\" description=\"Specular Amount\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".5\"/>\n\t\t\t<argument name=\"roughness\" label=\"Roughness\" description=\"Surface Roughness (affects specular reflection size)\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".1\"/>\n\t\t\t<argument name=\"specularcolor\" label=\"Specular Color\" description=\"Specular Reflection Color\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_puffyclouds.sl",
    "content": "/* I took wave's lead and renamed starfield to KMPuffyclouds.sl -- tal@SpamSucks_cs.caltech.edu */\n\n/*\n * puffyclouds.sl -- RenderMan compatible surface shader for puffy\n *                   clouds.\n *\n * DESCRIPTION:\n *    Makes nice looking cumulous clouds like you would see in the sky\n *    on a bright sunny day.  Works as a basic thresholded fBm.  Since\n *    this texture is generally used as a backdrop, it does not take\n *    lighting into account.  If you wanted a lit surface that looked like\n *    puffy clouds (like painted clouds on a wall), then it would be pretty\n *    easy to add the lighting.\n *\n * PARAMETERS:\n *    txtscale - overall scaling factor\n *    skycolor, cloudcolor - the obvious meanings\n *    octaves, omega, lambda - control the fractal appearance of the clouds\n *    threshold - fBm sum below this level is just blue sky\n *\n * ANTIALIASING:\n *    None, but should be easy to add antialiasing simply by adaptively\n *    setting the \"octaves\" parameter based on distance from eye point.\n *\n * AUTHOR:\n *    C language version by F. Kenton Musgrave\n *    Translation to RenderMan Shading Language by Larry Gritz.\n *\n * REFERENCES:\n *    _Texturing and Modeling: A Procedural Approach_, by David S. Ebert, ed.,\n *    F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, and Steven Worley.\n *    Academic Press, 1994.  ISBN 0-12-228760-6.\n *\n * HISTORY:\n *    ??? - original C language version by Ken Musgrave\n *    Apr 94 - translation to Shading Language by L. Gritz\n *\n * this file last updated 18 Apr 1994\n */\n\n#include \"k3d_noises.h\"\n\nsurface\nk3d_puffyclouds (float Ka = 0, Kd = 0;\n\t     float txtscale = 1;\n\t     color skycolor = color(.15, .15, .6);\n\t     color cloudcolor = color(1,1,1);\n\t     float octaves = 8, omega = 0.5, lambda = 2;\n\t     float threshold = 0;\n\t     )\n{\n  float value;\n  color Ct;      /* Color of the surface */\n  point PP;      /* Surface point in shader space */\n  float i, a, l, o;\n\n  PP = txtscale * transform (\"shader\", P);\n\n  /* Use fractional Brownian motion to compute a value for this point */\n/*  value = fBm (PP, omega, lambda, octaves); */\n  value = 0;\n  l = 1;  o = 1;  a = 0;\n  for (i = 0;  i < octaves;  i += 1) {\n      a += o * snoise (PP*l);\n      l *= 2;  o *= omega;\n    }\n  value = a;\n\n  Ct = mix (skycolor, cloudcolor, smoothstep (threshold, 1, value));\n  \n  /* Shade like matte, but use color Ct */\n  Oi = 1;    /* Make it opaque */\n  Ci = Ct;   /* This makes the color disregard the lighting */\n  /* Uncomment the next line if you want the surface to actually be lit */\n/*  Ci = Ct * (Ka * ambient() + Kd * diffuse(faceforward(N,I))); */\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_puffyclouds.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_puffyclouds\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"skycolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.255024 0.383627 0.656184\"/>\n\t\t\t<argument name=\"cloudcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"octaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"8\"/>\n\t\t\t<argument name=\"omega\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"lambda\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"2\"/>\n\t\t\t<argument name=\"threshold\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_redapple.sl",
    "content": "/*\n * Renamed to JMredapple.sl for RMR -- talrmr@SpamSucks_pacbell.net  7/18/99\n *\n * redapple.sl - A nice shader for reddy-green apples.\n *\n * Copyright (C) Jonathan Merritt, 1999.\n * Feel free to use this shader to create apples anywhere and\n * everywhere.\n *\n * This shader creates a nice skin for red-green apples. It _is_ tuned\n * for specific geometry, but can very easily be adjusted to fit any\n * apple you care to lay it on. Apples are requred to have the \"s\"\n * texture parameter running equatorialy around them (like latitude\n * lines), and \"t\" running from pole to pole (like longditude). Apples\n * look best from the side, but work ok from the top, so long as you\n * don't mind the simple lerping I used to fade to green at the poles.\n *\n * Look out for the \"txtscale\" parameter: some noise calculations are\n * done using shader space, instead of \"s\" and \"t\" parameters (I think\n * my apple's parameters are stretched a bit?), so if you use\n * different size apples, make sure to change txtscale appropriately.\n *\n * I think this shader is really cool. If you think so too, you can\n * email me your praises, notification of my credits in big motion\n * pictures, job offers at Pixar, etc... to:  jmerritt@SpamSucks_warpax.com   :-)\n *\n * Have FUN!!!   :-)\n */\n\n#include \"k3d_noises.h\"\n\n/*#define USE_LG_RAYTRACE */\n\n#ifdef USE_LG_RAYTRACE\n#include \"rayserver.h\"\n#include \"raytrace.h\"\n#endif\n\n\n#define TSCALE .05\n\nsurface\nk3d_redapple (\n\tfloat Ks = .25;           /* Specular reflection coeff.    */\n\tfloat Kd = .5;            /* Diffuse reflection coeff.     */\n\tfloat Ka = 1;             /* Ambient light coeff.          */\n\tfloat Kr = .05;           /* Mirror-like reflection coeff. */\n\tfloat roughness = .1;     /* Specular roughness param.     */\n\tfloat label = 0;          /* Non-uniformity param.         */\n\tfloat redness = 1;        /* Amount of 'redness' - higher  */\n\t                          /*  values give redder apples.   */\n\t                          /*  2 = almost complete red.     */\n\tfloat txtscale = .05;     /* Ugly kludge (see above...)    */\n\tcolor specularcolor = 1;  /* Specular reflection color     */\n)\n{\n\t/*\n\t * Shader variables\n\t */\n\tvector Nf, V, Rdir;\n\tpoint PP, newP;\n\tfloat base_turb, blotch_turb, disp_turb;\n\tfloat small_noise, blotch, speck, disp = 0, blackness;\n\tcolor cs, small_speckle, base_color, reflect;\n\n\n\t/*\n\t * Some nice colors for our red apple\n\t */\n\tcolor red   = color(0.52,0.00,0.00);\n\tcolor dred  = color(0.40,0.00,0.00);\n\tcolor green = color(0.76,0.80,0.37);\n\tcolor brown = color(0.70,0.78,0.34);\n\tcolor black = color(0.00,0.00,0.00);\n\n\n\t/*\n\t * Standard settings\n\t */\n\tPP = transform(\"shader\", P);\n\tV = normalize(-I);\n\n\n\t/*\n\t * Pick the base color for the apple.\n\t *\n\t * The base color consists of patches of pure green,\n\t * and patches of finely speckled red and green. These\n\t * are set up so that the poles of the apple (as \"t\"\n\t * goes to 1 or 0) are colored more and more green.\n\t *\n\t * The apple geometry is such that lines of constant\n\t * \"t\" are lines of longditude (from pole to pole).\n\t * The constants T1 - T4 specify locations of the\n\t * start of 'greenness' toward the poles.\n\t */\n\t#define BASE_SF          1.2    /* s-factor for big noise          */\n\t#define BASE_TF          3      /* t-factor for big noise          */\n\t#define BASE_NF          100    /* scaling factor for small noise  */\n\t#define BASE_NOISE_AMP   0.2    /* small noise color mix amplitude */\n\t#define BASE_GRC         0.4    /* shift factor for more red       */\n\t#define T1               0.0    /* t < T1 is pure green            */\n\t#define T2               0.18   /* lerp s.t. T1->T2 => green->red  */\n\t#define T3               0.8    /* T2->T3 => red can exist here    */\n\t#define T4               1.0    /* lerp s.t. T3->T4 => red->green  */\n\t                                /* t > T4 is pure green            */\n\tbase_turb = noise(BASE_SF*sin(2*PI*s) + PI + label,\n\t                  BASE_TF*t + label);\n\tbase_turb = pow(base_turb, (1/redness));\n\tsmall_noise = snoise(BASE_NF*PP*txtscale/TSCALE);\n\tsmall_speckle = mix(red, green, BASE_GRC+\n\t                    (small_noise*BASE_NOISE_AMP));\n\tif (t < T1)\n\t\tbase_turb = 0;\n\telse if (t >= T1 && t < T2)\n\t\tbase_turb *= (t-T1)/(T2-T1);\n\telse if (t >= T3 && t < T4)\n\t\tbase_turb *= (T4-t)/(T4-T3);\n\telse if (t >= T4)\n\t\tbase_turb = 0;\n\tbase_color = spline(base_turb, green, green,\n\t                    small_speckle, small_speckle,\n\t                    small_speckle);\n\n\n\t/*\n\t * Pick the blotch color.\n\t *\n\t * The blotch color is finally determined by mixing,\n\t * using the blotching coefficient \"blotch\". This\n\t * section sets that coefficient, using a funky yet\n\t * really simple noise routine.\n\t */\n\t#define BLOTCH_SF          20   /* s-factor for blotches  */\n\t#define BLOTCH_TF          15   /* t-factor for blotches  */\n\t#define BLOTCH_TCF         2.5  /* scaling kludge         */\n\t#define BLOTCH_DELTA       0.1  /* 'nother scaling kludge */\n\t#define BLOTCH_SPECK_COEFF 0.3  /* blotch specking coeff  */\n\tblotch_turb = noise(BLOTCH_SF*sin(2*PI*(s+.1234)) + PI + label,\n\t                    BLOTCH_TF*t + label) + BLOTCH_DELTA;\n\tblotch = pow(blotch_turb, 1.3) * BLOTCH_TCF * \n\t         pow(base_turb, 2);\n\tblotch = blotch * (1+small_noise) +\n\t         small_noise * BLOTCH_SPECK_COEFF;\n\tif (blotch > 1) blotch = 1;\n\n\n\t/*\n\t * Set the brown specking.\n\t *\n\t * The apple has brown speckles on it, set by mixing\n\t * using the speckling coefficient \"speck\". These\n\t * specks are very dot-like in nature, and this\n\t * dottiness technique is stolen from LG's starfield \n\t * shader.\n\t */\n\t#define SPECK_NF        50    /* A noise scaling factor      */\n\t#define SPECK_CUTOFF    .45   /* Cutoff for 'tops' of specks */\n\tspeck = pow(smoothstep(SPECK_CUTOFF, 1,\n\t            noise(SPECK_NF*PP*txtscale/TSCALE)), 3);\n\n\t/*\n\t * Determine where the apple goes black at the poles.\n\t * This simulates the spots where the stalk would be\n\t * attached, and where the wierd bit at the very bottom\n\t * is.\n\t */\n\t#define BEDGE  .01\n\t#define BWIDTH .01\n\tblackness = 1-(smoothstep(BEDGE, BEDGE+BWIDTH, t)*\n\t               smoothstep(BEDGE, BEDGE+BWIDTH, 1-t));\n\n\n\t/*\n\t * Combine what we have so far to set the surface\n\t * color.\n\t */\n\tcs = mix(base_color, dred, blotch);\n\tcs = mix(cs, brown, speck);\n\tcs = mix(cs, black, blackness);\n\n\n\t/*\n\t * Set the shading surface normal.\n\t *\n\t * Here we set the surface normal to fix up the specular\n\t * highlights. We'd like them perturbed by the small\n\t * noise, affected a little by the brown specks, and\n\t * also dented a bit (alas, no real apples are perfectly\n\t * un-dented).\n\t */\n\t#define DISP_SF     10             /* s-factor for dent noise */\n\t#define DISP_TF     30             /* t-factor for dent noise */\n\t#define DISP_DENT_AMP     (1/15)   /* dent amplitude          */\n\t#define DISP_SMNOISE_AMP  (1/1000) /* small noise amplitude   */\n\t#define DISP_SPECK_AMP    (1/40)   /* speckle disp. amplitude */\n\tdisp += noise(DISP_SF*sin(2*PI*s) + PI + label,\n\t              DISP_TF*t + label) * DISP_DENT_AMP * txtscale / TSCALE;\n\tdisp += small_noise * DISP_SMNOISE_AMP * txtscale / TSCALE;\n\tdisp -= speck * DISP_SPECK_AMP * txtscale / TSCALE;\n\tnewP = calculatenormal(P + disp * normalize(N));\n\tNf = faceforward(normalize(newP), I);\n\n\n\t/*\n\t * 'Mirror' reflections\n\t *\n\t * Here, we raytrace for the slight mirrored reflections\n\t * in the surface of an apple. They don't add much, but\n\t * may be needed for the 'perfect' apple :-).\n\t *\n\t * Note: You'll need Larry Gritz's raytrace helper files\n\t * for this bit!\n\t */\n#ifdef USE_LG_RAYTRACE\n\tif (Kr > .01) {\n\t\tRdir = normalize(reflect(normalize(I), Nf));\n\t\treflect = RayTrace(P, Rdir, 0, 1, 1);\n\t} else {\n\t\treflect = 0;\n\t}\n#else\n\treflect = 0;\n#endif\n\n\n\t/*\n\t * Combine everything to get Ci, in the standard form.\n\t */\n\tOi = Os;\n\tCi = Os * (cs * (Ka*ambient() + Kd*diffuse(Nf)) +\n\t           specularcolor * (Kr * reflect +\n\t                            Ks * specular(Nf, V, roughness)));\n\t\t\n}\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_redapple.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_redapple\">\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".25\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kr\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".05\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"label\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"redness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".05\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_roughmetal.sl",
    "content": "/*\n * roughmetal.sl\n *\n * Description:\n *   Rough metal without coherent reflections\n *\n * Parameters:\n *   Ka, Kd, Ks - ambient, diffuse, specular weights\n *   roughness - highlight width\n * \n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\n#include \"k3d_material.h\"\n\n\nsurface k3d_roughmetal(float Ka = 1, Kd = 0.1, Ks = .9, roughness = 0.4;)\n{\n  normal Nf = faceforward(normalize(N), I);\n  Ci = MaterialRoughMetal(Nf, Cs, Ka, Kd, Ks, roughness);\n  Oi = Os;\n  Ci *= Oi;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_roughmetal.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_roughmetal\">\n\t\t\t<description>Rough metal without coherent reflections</description>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".9\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.4\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_rubber.sl",
    "content": "/* Copyrighted Pixar 1989 */\n/* From the RenderMan Companion p.385 */\n/* Listing 16.38  Rubber surface shader*/\n\n/*\n * rubber(): This shader generates a rubber surface. It is a matte shader that\n * adds in a little white dust to mimic the dust on a new eraser.\n */\nsurface\nk3d_rubber( \n\tfloat\tKa\t\t= 1.0, \n\t\tKd\t\t= 1.0, \n\t\ttxtscale\t= 1.5 )\n{\n\tpoint\tNf = faceforward(normalize(N),I), \n\t\tPloc = transform(\"shader\", P);  /* Move to shader space */\n\tcolor\tcout, white=1;\n\n\t/* Mix in some white dust. */\n\tcout = mix(Cs, white, .05* (float noise(txtscale*Ploc)));\n\n\t/* Compute a matte surface. */\n\tOi = Os;\n\tCi = Os * cout * ( Ka*ambient() + Kd*diffuse(Nf) ) ;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_rubber.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_rubber\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.0\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.5\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_saturn.sl",
    "content": "/* This was terran.sl from Larry Gritz and Ken Musgrave.  But there isn't much of it left.\n*/\n\n/*\n * TLSaturn.sl - surface for an Saturn-like planet.\n *\n *\n * DESCRIPTION:\n *      When put on a sphere, sets the color to look like relatively\n *   Saturn-like.  The shader works by using a variety of fractal \n *   turbulence techniques.\n *\n *\n * PARAMETERS:\n *    Ka, Kd - the usual meaning\n *    dist_scale - scaling for multifractal distortion\n *    lat_scale,  map_exp - control scaling of \n *               terrain type by latitude\n *\n *\n * HINTS:\n *   Assumes being used on a sphere.  Haven't really tried it by using other\n *   than the default arguments.\n *\n * AUTHOR: Ken Musgrave.\n *    Conversion to Shading Language and minor modifications by Larry Gritz.\n *\n *\n * REFERENCES:\n *\n *\n * HISTORY:\n *    This started out as L. Gritz's terran.sl shader.  But I think he may be\n *        the only one that would recognize that it was.\n *    23 May 1995 - Changed name from terran.sl to TLSaturn.sl and\n *        Did major hacking to make it a Saturn-like shader by Tal Lancaster \n *        tal@SpamSucks_cs.caltech.edu\n *\n * last modified 23 May 1995 by Tal\n */\n\nsurface\nk3d_saturn (float Ka = .5, Kd = .7;\n\t  float dist_scale = .2;\n\t  float offset = 0;\n\t  float lat_scale = 0.95;\n\t  float map_exp = 0;)\n{\n  point PP;\n  point PtN;\n  float latitude;\n  color Ct;\n  point Ptexture;\n\n  /* Do all shading in shader space */\n  Ptexture = transform (\"shader\", P);\n  PtN = normalize (Ptexture);      /* Version of Ptexture with radius 1 */\n\n  /************************************************************************\n   * Step 2: Assign a climite type, roughly by latitude.\n   ************************************************************************/\n\n  /* make climate symmetric about equator */\n  latitude = abs (zcomp (PtN));\n\t\n  if (map_exp > 0)\n       latitude = lat_scale * pow(latitude,map_exp);\n  else latitude *= lat_scale;\n\n  \t/* Color map for Saturn */\n      Ct = spline (latitude,\n\t\tcolor (.73, .598, .266),\n\t\tcolor (.73, .598, .266),\n\t\tcolor (1, .63, .332),\n\t\tcolor (.598, .531, .266),\n\t\tcolor (.863, .664, .332),\n\t\tcolor (.797, .598, .332),\n\t\tcolor (.73, .598, .266),\n\t\tcolor (.461, .461, .461),\n\t\tcolor (.332, .199, .266),\n\t\tcolor (.332, .199, .266),\n\t\tcolor (.332, .199, .266));\n\n  /* Shade using matte model */\n  Oi = 1;\n  Ci = Os * Ct * (Ka * ambient() + Kd * diffuse(faceforward(normalize(N),I)));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_saturn.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_saturn\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".7\"/>\n\t\t\t<argument name=\"dist_scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".2\"/>\n\t\t\t<argument name=\"offset\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"lat_scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.95\"/>\n\t\t\t<argument name=\"map_exp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_screen.sl",
    "content": "/*\n * screen_aa.sl -- RenderMan compatible shader for a metalic screen.\n *\n * DESCRIPTION:\n *   Makes a surface that looks like a metal screen.  Strips of metal run\n *   parallel to lines of s and t.  You can adjust the Ka, Kd, Ks, etc.\n *   to change the material appearance.  This texture antialiases pretty\n *   well, even with only one sample per pixel.\n *\n * PARAMETERS:\n *   Ka, Kd, Ks, roughness, specularcolor - work just like the plastic shader\n *   frequency - how many cycles of screen in st space\n *   density - how much of each cycle is opaque?\n *\n * AUTHOR: written by Larry Gritz\n *\n * last modified  31 Jan 1994 by Larry Gritz\n *\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\n#include \"k3d_filterwidth.h\"\n#include \"k3d_rmannotes.h\"\n\nsurface k3d_screen(float Ka = 1, Kd = 0.75, Ks = 0.4, roughness = 0.1;\n\t\t      color specularcolor = 1;\n\t\t      float density = 0.25, frequency = 20;)\n{\n  normal Nf;\t\t\t/* Forward facing Normal vector */\n  vector IN;\t\t\t/* normalized incident vector */\n  float d;\t\t\t/* Density at the sample point */\n  float ss, tt;\t\t\t/* s,t, parameters in phase */\n  float swidth, twidth, GWF, w, h;\n\n  /* Compute a forward facing normal */\n  IN = normalize(I);\n  Nf = faceforward(normalize(N), I);\n\n  /* Determine how wide in s-t space one pixel projects to */\n  swidth = filterwidth(s) * frequency;\n  twidth = filterwidth(t) * frequency;\n\n  /* Figure out where in the pattern we are */\n  ss = mod(frequency * s, 1);\n  tt = mod(frequency * t, 1);\n\n  /* Figure out where the strips are. Do some simple antialiasing. */\n  GWF = density * 0.5;\n  if(swidth >= 1)\n    w = 1 - 2 * GWF;\n  else\n    w =\n      clamp(boxstep(GWF - swidth, GWF, ss), max(1 - GWF / swidth, 0),\n\t    1) - clamp(boxstep(1 - GWF - swidth, 1 - GWF, ss), 0,\n\t\t       2 * GWF / swidth);\n  if(twidth >= 1)\n    h = 1 - 2 * GWF;\n  else\n    h =\n      clamp(boxstep(GWF - twidth, GWF, tt), max(1 - GWF / twidth, 0),\n\t    1) - clamp(boxstep(1 - GWF - twidth, 1 - GWF, tt), 0,\n\t\t       2 * GWF / twidth);\n  /* This would be the non-antialiased version:\n   *    w = step (GWF,ss) - step(1-GWF,ss);\n   *    h = step (GWF,tt) - step(1-GWF,tt);\n   */\n  d = 1 - w * h;\n\n  Oi = d;\n  if(d > 0)\n    {\n      Ci =\n\tOi * (Cs * (Ka * ambient() + Kd * diffuse(Nf)) +\n\t      specularcolor * Ks * specular(Nf, -IN, roughness));\n    }\n  else\n    Ci = 0;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_screen.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_screen\">\n\t\t\t<description>Antialiased metal screen</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.75\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.4\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"density\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.25\"/>\n\t\t\t<argument name=\"frequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"10\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_shiny.sl",
    "content": "/****************************************************************************\n * shiny.sl -- Shiny metal surface\n *\n * Parameters:\n *    Ka, Kd, Ks, roughness - The usual meaning\n *    Kr - coefficient for mirror-like reflections of environment\n *    blur - how blurry are the reflections? (0 = perfectly sharp)\n *    envname, envspace, envrad - controls for using environment maps\n *    rayjitter, raysamples - ray tracing controls for reflection\n *    twosided - if nonzero both sides of the surface are shiny, otherwise\n *        only the \"outside\" (where the surface normal points) will\n *        spawn rays.  This can be an important optimization, especially\n *        when using the \"ray server.\"\n *\n ***************************************************************************\n *\n * Author: Larry Gritz (gritzl@acm.org).\n *\n * Reference:\n *   _Advanced RenderMan: Creating CGI for Motion Picture_, \n *   by Anthony A. Apodaca and Larry Gritz, Morgan Kaufmann, 1999.\n *\n * $Revision: 1.2 $    $Date: 2006/03/08 16:01:22 $\n *\n ****************************************************************************/\n\n#include \"k3d_material.h\"\n\n\n\nsurface k3d_shiny(float Ka = 1, Kd = 0.1, Ks = 1, roughness = 0.2;\n\t\t  float Kr = 0.8, blur = 0; DECLARE_DEFAULTED_ENVPARAMS;\n\t\t  float twosided = 0;)\n{\n  normal Nf = faceforward(normalize(N), I);\n  Ci =\n    MaterialShinyMetal(Nf, Cs, Ka, Kd, Ks, roughness, Kr, blur, twosided,\n\t\t       ENVPARAMS);\n  Oi = Os;\n  Ci *= Oi;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_shiny.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_shiny\">\n\t\t\t<description>Shiny metal surface with raytraced reflection</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.2\"/>\n\t\t\t<argument name=\"Kr\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.8\"/>\n\t\t\t<argument name=\"blur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"envname\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"envspace\" storage_class=\"uniform\" type=\"string\" extended_type=\"space\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"world\"/>\n\t\t\t<argument name=\"envrad\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"100\"/>\n\t\t\t<argument name=\"rayjitter\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"raysamples\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"twosided\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_shinymetal.sl",
    "content": "/* shinymetal.sl - Standard metal with environment mapping for\n * RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nsurface k3d_shinymetal(float Ka = 1;\n\t\t       float Ks = 1; float Kr = 1; float roughness = .1;\n\t\t       string texturename = \"\";)\n{\n  normal Nf;\n  vector V, D;\n  color env;\n\n  V = normalize(I);\n  Nf = faceforward(normalize(N), V);\n  D = reflect(V, Nf);\n  D = vtransform(\"world\", D);\n\n  if(texturename != \"\")\n    env = Kr * color environment(texturename, D);\n  else\n    env = 0;\n\n  Oi = Os;\n  Ci = Os * Cs * (Ka * ambient() + Ks * specular(Nf, -V, roughness) + env);\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_shinymetal.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_shinymetal\">\n\t\t\t<description>Standard metal with environment mapping for RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kr\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".1\"/>\n\t\t\t<argument name=\"texturename\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_show_st.sl",
    "content": "/* Copyrighted Pixar 1989 */\n/* From the RenderMan Companion p.344 */\n/* Listing 16.11  Shader mapping texture-space coordinates to colors */\n\n/*\n * show_st(): color surface point according to its s,t coordinates.\n */\n\nsurface k3d_show_st()\n{\n\tCi = color \"rgb\" (s, t, 0);\n\tOi = 1;\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_show_st.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_show_st\">\n\t\t\t<description>Colors surface point according to its s,t coordinates</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_slateroof.sl",
    "content": "/* Renamed to PQslateroof.sl for RMR -- talrmr@SpamSucks_pacbell.net */\n\n/* \n\tslateroof.sl - a surface shader working with slateroofd.sl, to\n\tintroduce a slate color onto roof tiles, making the last row of tiles\n\ttransparent (and black) so that the edge of the roof looks irregular.\n\tYou must bear this in mind when modelling - to avoid the roof ending\n\tbefore it reaches the wall which supposedly supports it! The shader\n\tintroduces a random color variation so that one tile will be lighter or\n\tdarker than the next Parameters:\n \n   Ka: Coefficient of ambient light;\n \tKd: Coefficient of diffuse light;\n   sfreq: number of tiles on the s direction\n   tfreq: number of tiles in the t direction\n \tmaxadd: the maximum amount of overlap of one tile and another\n \tramp: the amount of a tile used for the initial rise to the maximum height\n \t\ta value between 0 and 1\n \tgap: the size of the gap between one tile and the next in the s direction,\n \t\tmeasured as a proportion of the tile (so the value of gap must lie between 0 \n \t\tand 1)\n \tmaxcolorvary: the maximum amount by which the color of a slate can vary from the \n \t\taverage\n \ttxtscale: a scaling factor for the slate coloration - the larger txtscale the\n \t\tthe smaller the detail on the tile pattern\n \tfactor: a seed used for adjusting the randomness - if you have two roofs with\n \t\tthe same sfreq, tfreq change the value of factor to ensure they have a \n \t\tdifferent random patterning. A value > 20 works best\n \t\t\n\n \t\t\n \t\t\t\t\n \t\t\n \tPeter Quint 17/11/2000\n\n\n\tNb. This shader would normally be used with the slateroofd shader to\n\tproduce an appropriate displacement and message passing from the\n\tdisplacement shader would eliminate the need for a lot of the\n\tcalculations in this shader. Renderdc, however, does not yet support\n\tmessage passing, so to produce the test image the code has been\n\tduplicated here \n*/\n\n\n\nsurface\nk3d_slateroof(  float \tKa = .2,\n \t\t\t\t\t\t\tKd = .8,\n                   \tsfreq = 10,\n                   \ttfreq = 10,\n\t\t\t\t   \t\tmaxadd = .5,\n\t\t\t\t\t\t\tramp = .1,\n\t\t\t\t\t\t\tgap = .05,\n\t\t\t\t\t\t\tmaxcolorvary = .2,\n\t\t\t\t\t\t\tfactor = 22.238,\n\t\t\t\t\t\t\ttxtscale = 1)\n\t/* sfreq and tfreq must not be below 3 */\t\t\t\t   \n\n{\n   uniform float swidth = 1 / sfreq, \t\t/* Tile width in the s directio */\n                 twidth = 1 / tfreq, \t\t/* ditto for the t direction */\n                 offset = swidth / 2,\t\t/* the amount by which alternate rows are offset */\n\t\t\t\t\t  Km = 1;\n   float scoord = s, tcoord = 1 - t; \t\t/* re map the t coord so that the coving is at the top */\n\tfloat stile, ttile, \t\t\t\t\t\t\t/* An integer identifying the current tile */\n\t\t\ts_offset, t_offset, \t\t\t\t\t/* Offsets withing the current tile, between 0, 1 */\n\t\t\tnewstile, newscoord, \t\t\t\t/* Used in calculations to identify an overlapping tile */\n\t\t\tcs, ct; \t\t\t\t\t\t\t\t\t/* Coordinates set to the centre of the tile and fed into the noise function */\n   float add, \t\t\t\t\t\t\t\t\t\t/* Add, between 0 and 1, hold the amount the current tile overlaps the next */\n\t\t\tnews_offset, \n\t\t\tdisps, dispt, disp, dispo,      \t/* Displacements - s direction, t direction, final displacement, and \n\t\t\t\t\t\t\t\t\t\t  \t\t\t\t\tdisplacement for the non-overlapping tile */\n\t\t\ttemp_s_offset, \n\t\t\ttemp_t_offset, newadd;\t\t\t \n   uniform \tfloat colorfactor = 3.276 * factor;\t/* Used in noise calculations */\t\n   color \tCt = 0;\t\t\t\t\t\t\t\t/* A temporary color variable */\n\tfloat \tcolorvary = 0,\t\t\t\t    \t/* the random amount by which a tile is lightened or darkened */\n\t\t\t\tnewcolorvary, ocolorvary, ns;\n\n\n\tnormal Nf = normalize(faceforward(N,I));\n\n\n\t/* Work out which tile we are in, and the offset within that tile */\n   ttile = tcoord / twidth;\n\tif (mod(ttile,2) >= 1)\n      scoord = scoord + offset; /* Displace alternate rows */\n   stile = scoord / swidth;\n   s_offset = stile - floor(stile);\n   t_offset = ttile - floor(ttile);\n   stile = floor(stile);\n   ttile = floor(ttile);\n\n\t/* Work out the displacement assuming the point is in the \n   current tile */\n\n\n\t/* the noise function is always taken at the same point in the tile \n\t * normally the center, except in the short tiles which lie at the\n\t * start and end of an offset row, where the middle of the left side \n    * of the tile is used */\n\tct = ttile + .5;\n\tcs = stile + .5;\n\tif ((mod(ct,2) >= 1)  && ((stile == 0) || (stile == sfreq)))\n\t/* An offset row, so we must deal with the half tiles */\n\tcs = stile;\n\tif (ttile < tfreq - 1)\n\t\tadd = noise(cs * factor, ct * factor) * maxadd;\n\telse \n\t\tadd = 0;\n\tocolorvary = (noise(cs * colorfactor, ct * colorfactor) - 1) * 2 * maxcolorvary;\n\tcolorvary = ocolorvary;\n\t/* now calculate the displacement */\n\ttemp_t_offset = t_offset / (1 + add); \n\tif (1 - temp_t_offset <= ramp / (1 + add))\n   \tdispt = Km / 2 + smoothstep(0, ramp / (1 + add), (1 - temp_t_offset)) * Km / 2;\n   else\n\t   dispt = Km / 2 + smoothstep( 0, 1 - ramp /(1 + add), temp_t_offset) * Km / 2;\n\tif (s_offset > .5)\n\t   temp_s_offset = 1 - s_offset;\n\telse\n\t\ttemp_s_offset = s_offset;\n\tif (temp_s_offset < gap * (1 + add))\n\t   disps = smoothstep(0, gap * (1 + add), temp_s_offset) * Km;\n\telse\n   \tdisps = Km;\n\tdispo = min(disps, dispt);\n\n\t   \n\n\t/* Work out whether the point is in fact in another tile \n\t * storing the new tile in stile, ttile and new offset\n\t * in s_offset, t_offset */\n\tif ((t_offset <= maxadd) && (ttile >= 1))\n\t\t{\n\t\t\t/* the point might be in another tile */\n\t\t\tif (mod(ttile,2) >= 1)\n\t\t\t/* We are in an offset tile row adjust the scoord appropriately for\n\t\t\t * the row below */\n\t\t\t\tnewscoord = scoord - offset;\n\t\t\telse\n\t\t\t\tnewscoord = scoord + offset;\n\t\t\tnewstile = newscoord / swidth;\n\t\t\tnews_offset = newstile - floor(newstile);\n\t\t\tnewstile = floor(newstile);\n\t\t\t/* Now calculate cs, ct the reference point for the noise calculation */\t\t\t\t\t\n\t\t\tct = ttile - .5;\n\t\t\tcs = newstile + .5;\n\t\t\tif ((mod(ct,2) >= 1) && ((newstile == 0) || (newstile == sfreq)))\n\t\t\t/* An offset row, so we must deal with the half tiles */\n\t\t\t\tcs = newstile;\n\t\t\tnewadd = noise(cs * factor, ct * factor) * maxadd;\n\t\t\tnewcolorvary =  (noise(cs * colorfactor, ct * colorfactor) - 1) * 2 * maxcolorvary;\n\t\t\tif (t_offset <= newadd)\n\t\t\t\t/* if t_offset <= newadd we are actually in the overlapping tile */\n\t\t\t\t{\n\t\t\t\t\t/* set parameters to overlapping tile */\n\t\t\t\t\tttile = ttile - 1;\n\t\t\t\t\tstile = newstile;\n\t\t\t\t\tt_offset = t_offset + 1;\n\t\t\t\t\ts_offset = news_offset;\n\t\t\t\t\tadd = newadd;\n\t\t\t\t\tcolorvary = newcolorvary; \n\t\t\t\t}\n\t\t}\n\t/* calculate the displacement again */\n\tt_offset = t_offset / (1 + add); \n\tif (1 - t_offset <= ramp / (1 + add))\n\t\t\tdispt = Km / 2 + smoothstep(0, ramp / (1 + add), (1 - t_offset)) * Km / 2;\n\t\telse\n\t\t    dispt = Km / 2 + smoothstep( 0, 1 - ramp /(1 + add), t_offset) * Km / 2;\n\tif (s_offset > .5)\n\t\ts_offset = 1 - s_offset;\n\tif (s_offset < gap / (1 + add))\n\t\tdisps = Km * smoothstep(0, gap / (1 + add), s_offset);\n\telse\n\t\tdisps = Km;\n\tdisp = min(disps, dispt);\n\tif (dispo > disp)\n\t\tcolorvary = ocolorvary;\n\t/*printf(\"#dispo = %f, disp = %f, colorvary = %f\\n\",dispo,disp,colorvary); */\n\n\tns = noise( s * txtscale * 59.8534 * sfreq, t * txtscale * 59.8534 * tfreq);\n\tCt = color spline( \tns, \n\t\t\tcolor( .41, .44, .60),\n\t\t\tcolor( .65, .70, .82),\n\t\t\tcolor( .39, .31, .35),\n\t\t\tcolor( .50, .41, .53),\n\t\t\tcolor( .47, .47, .63));\n\tCt = Ct * (1 + colorvary);\n\tif (ttile < tfreq - 1) \n\t\tOi = 1;\n\telse\n\t\t{\n\t\t\tOi = 0;\n\t\t\tCt = 0;\n\t\t};\n\tCi = Ct * (Ka * ambient() + Kd * diffuse(faceforward( normalize(N), I )));\n\t  \n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_slateroof.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_slateroof\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".2\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".8\"/>\n\t\t\t<argument name=\"sfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"10\"/>\n\t\t\t<argument name=\"tfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"10\"/>\n\t\t\t<argument name=\"maxadd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"ramp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t\t<argument name=\"gap\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".05\"/>\n\t\t\t<argument name=\"maxcolorvary\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".2\"/>\n\t\t\t<argument name=\"factor\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"22.238\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_star.sl",
    "content": "/* I took wave's lead and renamed star to DPStar.sl -- tal@SpamSucks_cs.caltech.edu */\n\n/* \n * star.sl\n *\n * AUTHOR: Darwyn Peachy\n *\n * REFERENCES:\n *    _Texturing and Modeling: A Procedural Approach_, by David S. Ebert, ed.,\n *    F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, and Steven Worley.\n *    Academic Press, 1994.  ISBN 0-12-228760-6.\n */\n \n#include \"k3d_proctext.h\"\n\nsurface\nk3d_star(\n    uniform float Ka = 1;\n    uniform float Kd = 1;\n    uniform color starcolor = color (1.0000,0.5161,0.0000);\n    uniform float npoints = 5;\n    uniform float sctr = 0.5;\n    uniform float tctr = 0.5;\n     )\n{\n    point Nf = normalize(faceforward(N, I));\n    color Ct;\n    float ss, tt, angle, r, a, in_out;\n    uniform float rmin = 0.07, rmax = 0.2;\n    uniform float starangle = 2*PI/npoints;\n    uniform point p0 = rmax*(cos(0),sin(0),0);\n    uniform point p1 = rmin*\n        (cos(starangle/2),sin(starangle/2),0);\n    uniform point d0 = p1 - p0;\n    point d1;\n    \n    ss = s - sctr; tt = t - tctr;\n    angle = atan(ss, tt) + PI;\n    r = sqrt(ss*ss + tt*tt);\n    a = mod(angle, starangle)/starangle;\n    \n    if (a >= 0.5)\n        a = 1 - a;\n    d1 = r*(cos(a), sin(a),0) - p0;\n    in_out = filterstep(0, zcomp(d0^d1));\n    Ct = mix(Cs, starcolor, in_out);\n    \n    /* diffuse (\"matte\") shading model */\n    Oi = Os;\n    Ci = Os * Ct * (Ka * ambient() + Kd * diffuse(Nf));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_star.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_star\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"starcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0 0 1\"/>\n\t\t\t<argument name=\"npoints\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"5\"/>\n\t\t\t<argument name=\"sctr\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"tctr\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_strata.sl",
    "content": "/*\n * strata.sl -- surface shader for sedimentary rock strata\n *\n * DESCRIPTION:\n *    Makes sedimentary rock strata, useful for rendering landscapes.\n *\n * PARAMETERS:\n *    Ka, Kd - the usual meaning\n *    txtscale - overall scaling factor for the texture\n *    zscale - scaling for the thickness of the layers\n *    turbscale - how turbulent the layers are\n *    offset - z offset for the pattern\n *    octaves - number of octaves of noise to sum for the turbulence\n *\n * ANTIALIASING:\n *    None.\n *\n *\n * AUTHOR:\n *    C language version by F. Kenton Musgrave\n *    Translation to Shading Language by Larry Gritz.\n *\n * REFERENCES:\n *    _Texturing and Modeling: A Procedural Approach_, by David S. Ebert, ed.,\n *    F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, and Steven Worley.\n *    Academic Press, 1994.  ISBN 0-12-228760-6.\n *\n * HISTORY:\n *    ??? - original C language version by Ken Musgrave\n *    Apr 94 - translation to Shading Language by L. Gritz\n *\n * this file last updated 18 Apr 1994\n */\n\n#include \"k3d_noises.h\"\n\nsurface k3d_strata(float Ka = 0.5, Kd = 1; float txtscale = 1;\n\t\t   float yscale = 2; float turbscale = 0.1; float offset = 0;\n\t\t   float octaves = 8;\n  )\n{\n  color Ct;\n  point PP;\n  float cmap;\n  float turb, i, freq;\n\n  PP = txtscale * transform(\"shader\", P);\n\n  turb = 0;\n  freq = 1;\n  for(i = 0; i < octaves; i += 1)\n    {\n      turb += abs(snoise(PP * freq) / freq);\n      freq *= 2;\n    }\n\n  cmap = yscale * ycomp(PP) + turbscale * turb - offset;\n  Ct =\n    color spline(mod(cmap, 1), color(166, 131, 70), color(166, 131, 70),\n\t\t color(204, 178, 127), color(184, 153, 97), color(140, 114,\n\t\t\t\t\t\t\t\t  51),\n\t\t color(159, 123, 60), color(204, 178, 127), color(230, 180,\n\t\t\t\t\t\t\t\t  80),\n\t\t color(192, 164, 110), color(172, 139, 80), color(102, 76,\n\t\t\t\t\t\t\t\t  25),\n\t\t color(166, 131, 70), color(201, 175, 124), color(181, 150,\n\t\t\t\t\t\t\t\t  94),\n\t\t color(161, 125, 64), color(177, 145, 87), color(170, 136,\n\t\t\t\t\t\t\t\t 77),\n\t\t color(197, 170, 117), color(180, 100, 50), color(175, 142,\n\t\t\t\t\t\t\t\t  84),\n\t\t color(197, 170, 117), color(177, 145, 87), color(170, 136,\n\t\t\t\t\t\t\t\t  77),\n\t\t color(186, 156, 100), color(166, 131, 70), color(188, 159,\n\t\t\t\t\t\t\t\t  104),\n\t\t color(168, 134, 74), color(159, 123, 60), color(195, 167,\n\t\t\t\t\t\t\t\t 114),\n\t\t color(175, 142, 84), color(161, 125, 64), color(197, 170,\n\t\t\t\t\t\t\t\t 117),\n\t\t color(177, 145, 87), color(177, 145, 87)) / 255;\n\n  /* Shade like matte, but with color scaled by cloudcolor and opacity */\n  Oi = 1;\n  Ci =\n    Cs * Ct * (Ka * ambient() + Kd * diffuse(faceforward(normalize(N), I)));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_strata.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_strata\">\n\t\t\t<description>surface shader for sedimentary rock strata</description>\n\t\t\t<authors>F. Kenton Musgrave, Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"yscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"2\"/>\n\t\t\t<argument name=\"turbscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"offset\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"octaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"8\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_superplank.sl",
    "content": "/****************************************************************************\n * superplank.sl -- another surface shader for wood planks.\n *\n * Description:\n *   Makes texture of wooden planks in s-t space.  This wood looks rather\n *   like varnished oak planks, with staggered planks, rings and grain,\n *   reflections (either traced or via reflection map), and bumps.\n *   It can make the plank pattern as either straight staggered planks\n *   or in a parquet pattern.\n *\n * Parameters:\n *   Ka, Kd, Ks, specularcolor, roughness - work just like the plastic shader\n *   Kr, eta - reflection amount and index of refraction (for fresnel)\n *   Ktrace, Krefl, reflmap - const for trace, for refl map, filename\n *   txtscale - overall scaling factor for the texture\n *   Km - overall scaling factor for bumpiness.\n *   lightwood - wood-like color from which the various shades are derived.\n *   plankwidth - width of each plank (in terms of s/t)\n *   planklength - length of each plank (in terms of s/t)\n *   groovewidth - width of the grooves between the planks (in terms of s/t)\n *   groovedepth - depth of the groove indentations (in shader space units)\n *   groovecolor - the color of the \"grooves\" between the planks\n *   plankpattern - plank orientation pattern  1=straight, 2=parquet\n *   plankspertile - for parquet, number of sub-planks\n *   plankstagger - for staggered, how much are the rows of planks staggered\n *   plankvary - controls how much wood color varies from plank to plank\n *   ringscale - scaling for the ring spacing\n *   ringwidth - relative width of the dark ring parts\n *   wavy - relative wavyness of the ring pattern\n *   grainy - relative graininess (0 = no fine grain)\n *   grainscale - scaling for the fine grain\n *   graindepth - depth of grain and ring grooves\n *   varnishbumpfreq - frequency of bumps in the varnish coating\n *   varnishbumpamp - height of bumps in the varnish coating\n *\n * Antialiasing: this shader does a pretty good job of antialiasing itself,\n *   even with low sampling densities.\n *\n * Author: written by Larry Gritz\n *          current contact address: gritzl@acm.org\n *\n * $Revision: 1.1 $     $Date: 2006/02/25 20:11:54 $\n *\n ****************************************************************************/\n\n#include \"k3d_noises.h\"\n#include \"k3d_patterns.h\"\n\n\n\n\nsurface k3d_superplank(\t\t/* Parameters: */\n\t\t\t/* BRDF */\n\t\t\tfloat Ka = 1, Kd = 1;\t/* Overall ambient & diffuse response */\n\t\t\tfloat Ks = .75, roughness = .02;\t/* Spec highlight control */\n\t\t\tcolor specularcolor = 1;\t/* Spec reflection color */\n\t\t\tfloat Kr = 1, eta = 1.5;\t/* Mirror refl & index of refr */\n\t\t\tfloat Ktrace = 1, Krefl = 0;\t/* trace and reflection map */\n\t\t\tstring reflmap = \"\";\n\t\t\t/* Overall texturing control */\n\t\t\tfloat txtscale = 1;\t/* Overall scaling factor */\n\t\t\tfloat Km = 1;\t/* Overall bumpiness factor */\n\t\t\tcolor lightwood = color(.5, .2, .067);\t/* light wood color */\n\t\t\t/* Plank layout */\n\t\t\tfloat plankpattern = 1;\t/* 1=straight, 2=parquet */\n\t\t\tfloat plankspertile = 4;\t/* For parquet */\n\t\t\tfloat plankwidth = .05;\t/* Width of a plank */\n\t\t\tfloat planklength = .75;\t/* Length of a plank */\n\t\t\tfloat groovewidth = 0.001;\t/* Width of the grooves between planks */\n\t\t\tfloat groovedepth = .0004;\t/* Depth of the groove */\n\t\t\tcolor groovecolor = color(.01, .003, .001);\n\t\t\tfloat plankstagger = 1;\t/* How much should rows be staggered */\n\t\t\tfloat plankvary = 0.8;\t/* Wood color variation plank-to-plank */\n\t\t\t/* Wood appearance */\n\t\t\tfloat ringscale = 25;\t/* Larger makes more, thinner rings */\n\t\t\tfloat ringwidth = 1;\t/* Relative ring width */\n\t\t\tfloat wavy = 0.08;\t/* Larger makes rings more wavy */\n\t\t\tfloat grainy = 1;\t/* Relative graininess */\n\t\t\tfloat grainscale = 60;\t/* Larger makes smaller \"grains\" */\n\t\t\tfloat graindepth = 0.0001;\t/* Depth of divots where grains are */\n\t\t\tfloat varnishbumpfreq = 30;\t/* Bump freq of the varnish */\n\t\t\tfloat varnishbumpamp = 0.0003;\t/* How big are the varnish bumps? */\n  )\n{\n  /* mapping coordinates */\n  float ss, tt;\n  float grain_s, grain_t, ring_s, ring_t, plank_s, plank_t;\n  /* antialiasing */\n  float swidth, twidth, fwidth;\n  float sw, tw, overallscale;\n  /* Planks & grooves */\n  uniform float PGWIDTH, PGHEIGHT, GWF, GHF;\n  float whichrow, whichplank;\t/* Index for each row & plank within row */\n  float w, h;\t\t\t/* temporaries */\n  float groovy;\t\t\t/* 0 in groove, 1 in woody part */\n  /* Wood appearance */\n  color Ct, woodcolor;\n  float r2;\n  float fade, ttt;\n  float ring;\t\t\t/* 1 in a ring darkening, 0 where not */\n  float grain;\t\t\t/* 1 inside a grain bit, 0 elsewhere */\n  /* Illumination model */\n  float adjustedKs;\n  vector IN;\t\t\t/* normalized I vector */\n  normal NN;\t\t\t/* normalized N for displacing */\n  normal Nf;\t\t\t/* forward facing, normalized normal */\n  vector R, T_dummy;\t\t/* Refl (and tummy transmit) from fresnel */\n  float fresnelKr, fresnelKt;\t/* Fresnel reflection coefficients */\n  float shadlen;\t\t/* length of a unit of shader space */\n  float disp;\t\t\t/* accumulate displacement here */\n  point Pndc;\t\t\t/* NDC coordinate of P */\n  vector V;\n  color Cspec;\n  float nonspec;\n  float tmp;\n\n  /*\n   * 1. Setup.\n   *\n   * Determine the basic mapping, filter sizes for antialiasing, other\n   * values used throughout the shader.\n   */\n\n  /* First, determine the basic mapping */\n  ss = s * txtscale;\n  tt = t * txtscale;\n  /* Compute the basic filter size for antialiasing */\n  swidth = filterwidth(ss);\n  twidth = filterwidth(tt);\n  fwidth = max(swidth, twidth);\n\n  /* How much current space corresponds to a unit of s or t?\n   * We will use this later to help scale the displacement, this making\n   * the bumps scale relative to the overall pattern, rather than being\n   * strictly tied to the scale of the object.\n   */\n  overallscale = (length(Deriv(P, ss)));\n\n\n  /*\n   * 2. Plank pattern.\n   *\n   * Determine which row and plank we're on, and come up with an\n   * antialiased term for whether we're in or out of a groove.\n   */\n  if(plankpattern == 1)\n    {\n      /* Straight, staggered planks */\n      PGWIDTH = plankwidth + groovewidth;\n      PGHEIGHT = planklength + groovewidth;\n      plank_s = ss / PGWIDTH;\n      whichrow = floor(plank_s);\n      /* Jiggle each row */\n      plank_t = tt / PGHEIGHT + 20 * plankstagger * cellnoise(whichrow);\n      whichplank = floor(plank_t);\n    }\n  else\n    {\n      /* Parquet pattern */\n      PGWIDTH = plankwidth + groovewidth;\n      PGHEIGHT = PGWIDTH * plankspertile;\n      plank_s = ss / PGWIDTH;\n      whichrow = floor(plank_s);\n      plank_t = tt / PGHEIGHT;\n      whichplank = floor(plank_t);\n      if(mod((whichrow / plankspertile) + whichplank, 2) >= 1)\n\t{\n\t  plank_s = tt / PGWIDTH;\n\t  plank_t = ss / PGHEIGHT;\n\t  whichrow = floor(plank_s);\n\t  whichplank = floor(plank_t);\n\t  tmp = ss;\n\t  ss = tt;\n\t  tt = tmp;\n\t  tmp = swidth;\n\t  swidth = twidth;\n\t  twidth = tmp;\n\t}\n    }\n  /* Now whichplank is a unique integer index for each plank */\n\n  /* Figure out where the grooves are.  The value groovy is 0 where there\n   * are grooves, 1 where the wood grain is visible.  Do some simple\n   * antialiasing by trying to box filter the edges of the grooves.\n   */\n\n  /* compute half width & length of groove as fraction of plank size */\n  GWF = groovewidth * 0.5 / PGWIDTH;\n  GHF = groovewidth * 0.5 / PGHEIGHT;\n  sw = swidth / PGWIDTH;\n  tw = twidth / PGHEIGHT;\n  if(sw >= 1)\n    w = 1 - 2 * GWF;\t\t/* Filter width is wider than the plank itself */\n  else\n    w = filteredpulse(whichrow + GWF, whichrow + 1 - GWF, plank_s, sw);\n  if(tw >= 1)\n    h = 1 - 2 * GHF;\t\t/* Filter width is longer than the plank itself */\n  else\n    h = filteredpulse(whichplank + GHF, whichplank + 1 - GHF, plank_t, tw);\n  groovy = w * h;\n\n  /*\n   * 3. Ring and grain patterns, color and specularity adjustment.\n   *\n   * The wood has rings at one scale, grain at a finer scale.  They\n   * interact subtly.\n   */\n\n  /* Compute the filter width first, so we don't bother with more if\n   * the rings are too small to see.\n   */\n  fwidth = max(swidth * ringscale, twidth * ringscale);\n  fade = smoothstep(.75, 4, fwidth);\n  if(fade < 0.999)\n    {\n      ring_s = ss * ringscale;\n      ring_t = tt * ringscale;\n      ttt = ring_t + whichplank * 28.38 + wavy * noise(8 * ring_s, ring_t);\n      ring = ringscale * noise(ring_s - whichplank * 4.18, ttt / 20);\n      ring -= floor(ring);\n      ring =\n\t0.3 + 0.7 * smoothstep(.55 - .35 * ringwidth, 0.55,\n\t\t\t       ring) * (1 - smoothstep(0.75, 0.8, ring));\n      ring = (1 - fade) * ring + 0.65 * fade;\n\n      /* Grain pattern */\n      fwidth = max(swidth * grainscale, twidth * grainscale);\n      fade = smoothstep(.75, 4, fwidth);\n      if(fade < 0.999)\n\t{\n\t  grain_s = ss * grainscale;\n\t  grain_t = tt * grainscale;\n\t  r2 = 1.3 - noise(12 * grain_s, grain_t);\n\t  r2 = grainy * r2 * r2 + (1 - grainy);\n\t  grain = (1 - fade) * r2 + (0.75 * fade);\n\t}\n      else\n\tgrain = 0.75;\n    }\n  else\n    {\n      ring = 0.4875;\n      grain = 0.75;\n    }\n  grain *= (.85 + .15 * ring);\n\n  /* Start with the light wood color */\n  woodcolor = lightwood;\n  /* Add some plank-to-plank variation in overall color */\n  woodcolor *=\n    1 - plankvary / 2 + plankvary * float cellnoise(whichplank, whichrow);\n  /* Darken the wood according to the ring and grain patterns */\n  woodcolor *= (1 - 0.25 * ring) * (1 - .5 * grain);\n  /* Combine the rings, grain, plank variation into one surface color */\n  Ct = mix(groovecolor, woodcolor, groovy);\n  /* Less specular in the grooves, more specular in the dark wood. */\n  adjustedKs = Ks * (1 + .2 * ring) * (1 + .3 * grain) * groovy;\n\n\n  /*\n   * 4. Bumps\n   *\n   * We do some bump mapping to make the grooves and grain depressed,\n   * and add some general lumpiness to the varnish layer.\n   */\n  if(Km > 0)\n    {\n      /* Grooves */\n      disp = -groovedepth * (1 - groovy);\n      /* Random bumps on the varnish */\n      if(varnishbumpamp > 0)\n\tdisp +=\n\t  varnishbumpamp * (2 *\n\t\t\t    noise(varnishbumpfreq * ss,\n\t\t\t\t  varnishbumpfreq * tt) - 1);\n      /* Depressions due to grain & rings */\n      disp -= graindepth * (.75 * grain + ring);\n      /* Find out how long a unit of shader space is, in current units */\n      NN = normalize(N);\n      shadlen = overallscale / length(ntransform(\"shader\", NN));\n\n      /* Recalculate N */\n      N = calculatenormal(P + (Km * shadlen * disp) * NN);\n    }\n\n  /*\n   * 5. BRDF\n   *\n   * The wood itself behaves like plastic, the varnish overtop reflects\n   * using the fresnel formula (grazing angles reflect like mirrors).\n   * Have some subtle interaction between grain and specularity.\n   */\n\n  IN = normalize(I);\n  V = -IN;\n  Nf = faceforward(normalize(N), I);\n  fresnel(IN, Nf, 1 / eta, fresnelKr, fresnelKt, R, T_dummy);\n  fresnelKr *= Kr;\n  Cspec = 0;\n  illuminance(P, Nf, PI / 2)\n  {\n    nonspec = 0;\n    lightsource(\"__nonspecular\", nonspec);\n    if(nonspec < 1)\n      {\n\tvector H = normalize(normalize(L) + V);\n\tCspec +=\n\t  Cl * ((1 - nonspec) *\n\t\tsmoothstep(.6, .85, pow(max(0, Nf.H), 8 / roughness)));\n      }\n  }\n  Ci =\n    (1 - fresnelKr) * (Ct * (Ka * ambient() + Kd * diffuse(Nf))) +\n    adjustedKs * (specularcolor * Cspec);\n\n  /* Only compute reflections if Kr > 0 */\n  if(fresnelKr > 0.001)\n    {\n      if(Krefl > 0 && reflmap != \"\")\n\t{\n\t  Pndc = transform(\"NDC\", P);\n\t  Ci +=\n\t    fresnelKr * specularcolor * texture(reflmap, xcomp(Pndc),\n\t\t\t\t\t\t1 - ycomp(Pndc));\n\t}\n      if(Ktrace > 0)\n\tCi += Ktrace * fresnelKr * specularcolor * trace(P, R);\n    }\n\n  /* Scale by opacity */\n  Oi = Os;\n  Ci *= Oi;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_superplank.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_superplank\">\n\t\t\t<description>Varnished oak planks</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".75\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".02\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"Kr\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"eta\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1.5\"/>\n\t\t\t<argument name=\"Ktrace\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Krefl\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"reflmap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Km\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"lightwood\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5 0.2 0.067\"/>\n\t\t\t<argument name=\"plankpattern\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"plankspertile\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"4\"/>\n\t\t\t<argument name=\"plankwidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".05\"/>\n\t\t\t<argument name=\"planklength\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".75\"/>\n\t\t\t<argument name=\"groovewidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.001\"/>\n\t\t\t<argument name=\"groovedepth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".0004\"/>\n\t\t\t<argument name=\"groovecolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.01 0.003 0.001\"/>\n\t\t\t<argument name=\"plankstagger\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"plankvary\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.8\"/>\n\t\t\t<argument name=\"ringscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"25\"/>\n\t\t\t<argument name=\"ringwidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"wavy\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.08\"/>\n\t\t\t<argument name=\"grainy\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"grainscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"60\"/>\n\t\t\t<argument name=\"graindepth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.0001\"/>\n\t\t\t<argument name=\"varnishbumpfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"30\"/>\n\t\t\t<argument name=\"varnishbumpamp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.0003\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_supertoon.sl",
    "content": "/* SuperToon.sl V1.1    Felipe Esquivel \n * <felipe@siggraph.org.mx>, abril 2002\n *\n * Toon shader con antialiasing. Modula diffuse mediante escaloneo de modo que\n * no se tenga un degradado en el cambio de color. En su lugar el cambio se\n * hace en tres puntos definidos por lim2, lim3 y lim4. A falta de antialiasing\n * analitico se utiliza delta para determinar el nivel de antialiasing del shader.\n *\n * Toon shader with non-analitic antialiasing (controlled by delta). Difusion is modulated with\n * clamping, the inflection points are lim2, lim3 and lim4. This shader is very cheap, \n * reason why no border detection is allowed. Now with specular.\n */\n\ncolor splitColor(color valor; float delta; float lim2; float lim3; float lim4;){\n  color C = 0;\n\n  if(comp(valor, 0) < lim3 - delta){\n    C = smoothstep(lim2 - delta, lim2 + delta, comp(valor, 0))* lim2;\n  }\n  else if(comp(valor, 0) >= lim3 - delta && comp(valor, 0) < lim4 - delta){\n    C = lim2 + (smoothstep(lim3 - delta, lim3 + delta, comp(valor, 0))* lim3);\n  }\n  else if(comp(valor, 0) >= lim4 - delta){\n    C = lim3 + (smoothstep(lim4 - delta, lim4, comp(valor, 0))* lim4);\n  }\n\n  return C;\n}\n\nsurface k3d_supertoon(float Kd = 1,\n                        Ks = 0,\n                        roughness = 0.5, /* specular roughness */\n                        delta = 0.015,   /* antialiasing level */\n                        lim2 = 0.3,      /* inflection points  */\n                        lim3 = 0.7,\n                        lim4 = 1;\n                  color specColor = 1;)\n{\n    normal Nf = normalize(N);\n    vector NI = normalize(I);\n    color  difusion = 0;\n    color  especular = 0;\n\n    if(Ks != 0){ /* Some optimization. If the multiplier is zero, why call an expensive function? */\n      especular = specular(Nf, -NI, roughness);\n      especular = splitColor(especular, delta * 3, lim3, lim4, lim4);\n    }\n    if(Kd != 0){\n      difusion = diffuse(faceforward(Nf, NI, Nf));\n      difusion = splitColor(difusion, delta, lim2, lim3, lim4);\n    }\n    \n    Oi = Os;\n    Ci = Os * (Cs * Kd * difusion + Ks * especular * specColor);\n}\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_supertoon.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_supertoon\">\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"delta\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.015\"/>\n\t\t\t<argument name=\"lim2\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.3\"/>\n\t\t\t<argument name=\"lim3\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.7\"/>\n\t\t\t<argument name=\"lim4\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"specColor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_terran.sl",
    "content": "/* Was terran.sl -- changed color spline to not use white \n  -- tal@SpamSucks_cs.caltech.edu */\n  \n/*\n * terran.sl - surface for an Earth-like planet.\n *\n *\n * DESCRIPTION:\n *      When put on a sphere, sets the color to look like relatively\n *   Earth-like.  The shader works by using a variety of fractal \n *   turbulence and mottling techniques.\n *      Note that there is a companion displacement shader \"terranbump\"\n *   which is necessary to get the best effect.  If you do this, it is\n *   important that the parameters common to \"terran\" and \"terranbump\"\n *   both be set to the same values.  Otherwise you get bumpy mountains\n *   in the middle of the ocean.\n *\n *\n * PARAMETERS:\n *    Ka, Kd - the usual meaning\n *    spectral_exp, lacunarity, octaves - control the fractal characteristics\n *                of the bump pattern.\n *    bump_scale - scaling of the mountains\n *    multifractal - zero uses fBm noise, nonzero uses multifractal\n *    dist_scale - scaling for multifractal distortion\n *    offset - elevation offset\n *    sea_level - obvious\n *    mtn_scale - scaling factor for mountains\n *    lat_scale, nonlinear, purt_scale, map_exp - control scaling of \n *               terrain type by latitude\n *    ice_caps - latitude at which ice caps tend to form on the oceans\n *    depth_scale, depth_max - scaling factor and max depth of oceans\n *    mottle_limit, mottle_scale, moddle_dim, mottle_mag - control the\n *               mottling that adds detail to lower latitude regions.\n *\n *\n * HINTS:\n *       The default values for the shader assume that the planet is\n *    represented by a unit sphere.  The texture space and/or parameters\n *    to this shader will need to be altered if the size of your planet\n *    is radically different.\n *       For best results, use with the \"terranbump\" displacement shader,\n *    and add a cloud layer using either \"planetclouds\" or \"venusclouds\".\n *\n *\n * AUTHOR: Ken Musgrave.\n *    Conversion to Shading Language and minor modifications by Larry Gritz.\n *\n *\n * REFERENCES:\n *\n *\n * HISTORY:\n *    ???? - original texture developed by F. Ken Musgrave.\n *    Feb 1994 - Conversion to Shading Language by L. Gritz\n *    1 March 1994 by lg\n *    May 28 1995 Didn't want polar caps so removed white from color spline --\n *       tal@SpamSucks_cs.caltech.edu\n * \n */\n\n#include \"k3d_noises.h\"\n#include \"k3d_constants.h\"\n\n#define N_OFFSET 0.7\n\nsurface\nk3d_terran2 (float Ka = .5, Kd = .7;\n\t  float spectral_exp = 0.5;\n\t  float lacunarity = 2, octaves = 7;\n\t  float bump_scale = 0.07;\n\t  float multifractal = 0;\n\t  float dist_scale = .2;\n\t  float offset = 0;\n\t  float sea_level = 0;\n\t  float mtn_scale = 1;\n\t  float lat_scale = 0.95;\n\t  float nonlinear = 0;\n\t  float purt_scale = .9;\n\t  float map_exp = 0;\n\t  float ice_caps = 0.9;\n\t  float depth_scale = 1;\n\t  float depth_max = .5;\n\t  float mottle_limit = 0.75;\n\t  float mottle_scale = 20;\n\t  float mottle_dim = .25;\n\t  float mottle_mag = .02;)\n{\n  point PP;\n  point PtN;\n  float chaos, latitude, purt;\n  color Ct;\n  point Ptexture, tp;\n  float l, o, a, i, weight;      /* Loop variables for fBm calc */\n  float bumpy;\n\n  /* Do all shading in shader space */\n  Ptexture = transform (\"shader\", P);\n  PtN = normalize (Ptexture);      /* Version of Ptexture with radius 1 */\n\n  /**********************************************************************\n   * First, figure out where we are in relation to the oceans/mountains.\n   * Note: this section of code must be identical to \"terranbump\" if you\n   *       expect these two shaders to work well together.\n   **********************************************************************/\n\n  if (multifractal == 0) {\t/* use a \"standard\" fBm bump function */\n      o = 1;  l = 1;  bumpy = 0;\n      for (i = 0;  i < octaves;  i += 1) {\n\t  bumpy += o * snoise2 (l * Ptexture);\n\t  l *= lacunarity;\n\t  o *= spectral_exp;\n        }\n    }\n  else {\t\t\t/* use a \"multifractal\" fBm bump function */\n      /* get \"distortion\" vector, as used with clouds */\n      Ptexture += dist_scale * DNoise (Ptexture);\n      /* compute bump vector using MfBm with displaced point */\n      o = spectral_exp;  tp = Ptexture;\n      weight = abs (VLNoise (tp, 1.5));\n      bumpy = weight * snoise2 (tp);\n      for (i = 1;  i < octaves  &&  weight >= VERY_SMALL;  i += 1) {\n\t  tp *= lacunarity;\n\t  /* get subsequent values, weighted by previous value */\n\t  weight *= o * (N_OFFSET + snoise2(tp));\n\t  weight = clamp (abs(weight), 0, 1);\n\t  bumpy += snoise2(tp) * min (weight, spectral_exp);\n\t  o *= spectral_exp;\n\t}\n    }\n\n  /* get the \"height\" of the bump, displacing by offset */\n  chaos = bumpy + offset;\n  /* set bump for land masses (i.e., areas above \"sea level\") */\n  if (chaos > sea_level) {\n      chaos *= mtn_scale;\n/*      sea_level *= mtn_scale; */\n    }\n\n\n  /************************************************************************\n   * Step 2: Assign a climite type, roughly by latitude.\n   ************************************************************************/\n\n  /* make climate symmetric about equator -- use the \"v\" parameter */\n  latitude = abs (zcomp (PtN));\n\n  /* fractally purturb color map offset using \"chaos\" */\n  /*  \"nonlinear\" scales purturbation-by-z */\n  /*  \"purt_scale\" scales overall purturbation */\n  latitude += chaos*(nonlinear*(1-latitude) + purt_scale);\n  if (map_exp > 0)\n       latitude = lat_scale * pow(latitude,map_exp);\n  else latitude *= lat_scale;\n\n\n  if (chaos > sea_level) {\n      /* Choose color of land based on the following spline.\n       * Ken originally had a huge table.  I was too lazy to type it in,\n       * so I used a scanned photo of the real Earth to select some\n       * suitable colors.  -- lg\n       */\n\n      Ct = spline (latitude,\n\t\t   color (.529, .412, .2745),\n\t\t   color (.529, .412, .2745),\n\t\t   color (.529, .412, .2745),\n\t\t   color (.255, .341,  0),\n\t\t   color (.256, .341, .141),\n\t\t   color (.235, .392, .235),\n\t\t   color (.490, .494, .1176),\n\t\t   color (.655, .529, .392),\n\t\t   color (.769, .616, .314),\n\t\t   color (.976, .820, .471),\n\t\t   color (1,1,1),\n\t\t   color (1,1,1));\n\n     /* mottle the color some */\n     if (latitude < mottle_limit) {\n         PP = mottle_scale * Ptexture;\n\t l = 1;  o = 1;\n\t for (i = 0;  i < 6;  i += 1) {\n\t     purt += o * snoise2 (l * PP);\n\t     l *= 2;\n\t     o *= mottle_dim;\n\t   }\n\t Ct += (mottle_mag * purt) * (color (0.5,0.175,0.5));\n       }\n    }\n  else { \n      /* Oceans */\n      Ct = color(.1,.2,.5);\n      if (ice_caps > 0  &&  latitude > ice_caps)\n\t  Ct = color(1,1,1);  /* Ice color */\n      else {\n\t  /* Adjust color of water to darken deeper seas */\n          chaos -= sea_level;\n\t  chaos *= depth_scale;\n\t  chaos = max (chaos, -depth_max);\n\t  Ct *= (1+chaos);\n        }\n    }\n\n  /* Shade using matte model */\n  Oi = 1;\n  Ci = Os * Ct * (Ka * ambient() + Kd * diffuse(faceforward(normalize(N),I)));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_terran.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_terran2\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".7\"/>\n\t\t\t<argument name=\"spectral_exp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"lacunarity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"2\"/>\n\t\t\t<argument name=\"octaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"7\"/>\n\t\t\t<argument name=\"bump_scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.07\"/>\n\t\t\t<argument name=\"multifractal\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"dist_scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".2\"/>\n\t\t\t<argument name=\"offset\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"sea_level\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"mtn_scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"lat_scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.95\"/>\n\t\t\t<argument name=\"nonlinear\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"purt_scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".9\"/>\n\t\t\t<argument name=\"map_exp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"ice_caps\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.9\"/>\n\t\t\t<argument name=\"depth_scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"depth_max\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"mottle_limit\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.75\"/>\n\t\t\t<argument name=\"mottle_scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"20\"/>\n\t\t\t<argument name=\"mottle_dim\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".25\"/>\n\t\t\t<argument name=\"mottle_mag\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".02\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_tooledsteel.sl",
    "content": "/*  tooledsteel.sl written 9/99 by Ivan DeWolf\n *  ivan@SpamSucks_martian-tools.com\n *  feel free to copy, distribute, hack and/or abuse this code \n *  in any way you see fit, but please leave my name near the top\n *\n *  a combination of IDbrushedmetal.sl and the Worley-esque\n *  F1 from bubbly.sl adapted to happen in parameter space.\n *  A vector is computed from the gradient of the distance function,\n *  and then used as the vector of anisotropy. works best on parametric\n *  surfaces where you don't care about the seams. \n *  (like that'll ever happen...)\n *  thanks to Jos Stam whose animated cube motivated this thing.\n *\n *\n *  PARAMETERS:\n *  mult    \t\t- multiples of swirls per unit\n *  Nzscale \t\t- scale of the noise that randomizes the location of \n *          \t\t  the swirls. set this to zero for a perfect grid.\n *  Ks\t\t\t- coefficient of specular\n *  Kd\t\t\t- coefficient of diffuse\n *  Ka\t\t\t- coefficient of ambient\n *  Kr\t\t\t- coefficient of reflectivity\n *  specwidth\t\t- the width of the specular stripe\n * \t\t\t  maxes out at 10\n *  specspread\t\t- the spread of the specular stripe\n *\t\t\t  maxes out at .5\n *  mapspread\t\t- the spread of the reflection map streaking\n *\t\t\t  maxes out at .5\n *  twist\t\t- allows you to twist the direction of anisotropy\n *\t\t\t  angle in radians (i.e. PI*.5 = 90 degrees)\n *  mapname\t\t- name of the environment map\n *  specularcolor\t- color of the specular hilight\n */\n\nvector\ngetvec(float  mult; float Nzscale)\n{\n  extern point P;\n  extern vector dPdu;\n  extern vector dPdv;\n  extern float s;\n  extern float t;\n  vector udir = vector(1,0,0);\n  vector vdir = vector(0,1,0);\n\n  float a,b,c;\n  float dist, shortest=10000;\n  float valu,valv;\n  point Po = point(s*mult,t*mult,0);\n  point Pou = Po +(udir*.01);\n  point Pov = Po +(vdir*.01);\n\n  /*true cell center, surrounding cell centers, noised cell center*/\n  point trucell, surrcell, nzcell;\n  vector offset, nzoff, out;\n  float chu, chv;\n  \n  float ncells = floor(mult);\n  float cellsize = 1/ncells;\n  \n  setxcomp(trucell,floor(xcomp(Po))+.5);\n  setycomp(trucell,floor(ycomp(Po))+.5);\n  setzcomp(trucell,0);\n  c = 0;\n\t\t\t     \n  /*what is the shortest distance to a noised cell center?*/\n  for(a = -1; a<= 1; a+=1){\n    for(b = -1; b<=1; b += 1){\n\toffset = vector(a,b,c);\n\tsurrcell = trucell+offset;\n\tnzoff = ((vector cellnoise(surrcell)-.5)*Nzscale);\n\tsetzcomp(nzoff,0);\n\tnzcell = surrcell + nzoff;\n\tdist = distance(Po,nzcell);\n\tif(dist<shortest){\n\t  shortest = dist;\n\t  valu = distance(Pou,nzcell);\n\t  valv = distance(Pov,nzcell);\n\t}\n    }\n  }\n  chu = valu - shortest;\n  chv = valv - shortest;\n  out  = normalize((udir*chu)+(vdir*chv));\n  return out;\n}\n\ncolor\nanisospecular (vector VA; float specspread; float specwidth)\n{\n\n    extern vector I;\n    extern normal N;\n    extern point P;\n\n    float nonspec;\n    vector V = normalize(-I);\n    normal NN = normalize(N);\n    normal Nf = faceforward(NN,-V);\n    color pixbrdf, C = 0;\n    point zro = 0;\n\n    illuminance (P, Nf, PI*.5) {\n        extern vector L;  \n\textern color Cl;\n\n        nonspec = 0;\n        lightsource (\"__nonspecular\", nonspec);\n        if (nonspec < 1) {\n            vector LN = normalize (L);\n\t    vector H = normalize (V + LN);\n\n\t    pixbrdf  = specularbrdf(LN, Nf,V,specspread);\n            C += Cl * pixbrdf * pow( 1-abs(VA.H), 1/specwidth );\n\n        }\n    }\n    return C;\n}\n\nsurface\nk3d_tooledsteel(\n\tfloat\tmult\t\t=  3,\n\t\tNzscale\t\t=  1.5,\n\t\tKs\t\t=  1,\n\t\tKd\t\t= .01,\n\t\tKa\t\t= .001,\n\t\tKr\t\t= .6,\n\t\tspecwidth\t= .5,\n\t\tspecspread \t= .5,\n\t\tmapspread \t= .2,\n\t\ttwist\t\t=  0;\n\tstring\tmapname \t= \"\";\n\tcolor\tspecularcolor\t=  1)\n{\n        vector VA = getvec(mult,Nzscale);\n\tpoint Po = transform(\"object\",P);\n\tcolor ev = 0;\n\tvector D, V= normalize(-I);\n\tvector Nf, Ntmp;\n        point zro = 0;\n\tfloat i, numsamples = 20;\n\tfloat angle, jitter;\n\tfloat Jspread = PI*(1/numsamples)*mapspread;\n\n\tVA = rotate(VA, twist, zro, normalize(N));\n\t\n\n\tNf = faceforward(normalize(N), -I);\n        Ntmp = Nf;\n\n\tif( mapname != \"\" ) {\n\t    for(i=0;i<=numsamples;i=i+1){\n\t      jitter = (random()-.5)*Jspread;\n\t      angle = PI*((i/numsamples)-.5)*mapspread;\n\t      Ntmp = rotate(Nf,angle+jitter,zro,VA);\n\t      D = reflect(-V, Ntmp);\n\t      D = vtransform(\"world\", D);\n\t      ev += environment(mapname, D)*(.5-abs((i/numsamples)-.5))*.25;\n\t    }\n\t} else\n\t    ev = 0;\n\n\tOi = Os;\n\tCi = Oi * (Cs * (Ka * ambient() + Kd * diffuse(-Nf)) + \n\tspecularcolor * Ks * anisospecular(VA, specspread*2, specwidth*.1)) +\n\tev * Kr;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_tooledsteel.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_tooledsteel\">\n\t\t\t<argument name=\"mult\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"3\"/>\n\t\t\t<argument name=\"Nzscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1.5\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".01\"/>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".001\"/>\n\t\t\t<argument name=\"Kr\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".6\"/>\n\t\t\t<argument name=\"specwidth\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"specspread\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".5\"/>\n\t\t\t<argument name=\"mapspread\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".2\"/>\n\t\t\t<argument name=\"twist\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"mapname\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1 1 1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_urbermap.sl",
    "content": "\n\nsurface k3d_urbermap (\n\nstring abColorMap=\"\"; \nfloat abColorMapBlur=1; \nfloat abUseColorMapAlpha=0; \nfloat abDiffuse=0.8; \nstring abDiffuseMap=\"\"; \nfloat abDiffuseMapBlur=1; \nfloat abSpecular=0.3; \nstring abSpecularMap=\"\"; \nfloat abSpecularMapBlur=1; \ncolor abSpecularColor=color(1.00,1.00,1.00); \nstring abSpecularColorMap=\"\"; \nfloat abSpecularColorMapBlur=1; \nfloat abRoughness=0.3; \nstring abRoughnessMap=\"\"; \nfloat abRoughnessMapBlur=1; \nstring abTransparencyMap=\"\"; \nfloat abInvertTransparencyMap=0; \nfloat abTransparencyMapBlur=1; \ncolor abIncandescence=color(0.00,0.00,0.00); \nstring abIncandescenseMap=\"\"; \nfloat abIncandescenseMapBlur=1; \nstring abReflectionMap=\"\"; \nfloat abReflectionUp=0; \nfloat abReflectivity=0.1; \nfloat abReflectionMapBlur=1; \nstring abBumpMap=\"\"; \nfloat abBumpMapBlur=1; \nfloat abBumpScale=1; \nfloat abDoDisplacement=0; \nfloat abUseNormals=0; \npoint STMatrix0=point(1,0,0); \npoint STMatrix1=point(0,1,0); ) \n{\n/** Surface main-code start **/\n\nnormal Nf;\nvector V, D;\npoint PP;\ncolor Csurf, Cspec, Copac, Cincand, Crefl;\nfloat ss, tt, roughness, diff, spec, bmp;\n\n\nss = vector(s, t, 1) . vector(transform(\"shader\", STMatrix0));\ntt = vector(s, t, 1) . vector(transform(\"shader\", STMatrix1));\n\n\nif(abColorMap != \"\")\n{\nCsurf = Cs * color texture(abColorMap, ss, tt,\n\"swidth\", abColorMapBlur,\n\"twidth\", abColorMapBlur );\nif(abUseColorMapAlpha != 0)\n{\nCopac = float texture(abColorMap[3], ss, tt,\n\"swidth\", abColorMapBlur,\n\"twidth\", abColorMapBlur );\n\nCsurf = Csurf / Copac;\n}\nelse\n{\nCopac = color(1, 1, 1);\n}\n}\nelse\n{\nCsurf = Cs;\nCopac = color(1);\n}\n\n\nif(abDiffuseMap != \"\")\n{\ndiff = abDiffuse * float texture(abDiffuseMap, ss, tt,\n\"swidth\", abDiffuseMapBlur,\n\"twidth\", abDiffuseMapBlur );\n}\nelse\n{\ndiff = abDiffuse;\n}\n\n\nif(abSpecularMap != \"\")\n{\nspec = abSpecular * float texture(abSpecularMap, ss, tt,\n\"swidth\", abSpecularMapBlur,\n\"twidth\", abSpecularMapBlur );\n}\nelse\n{\nspec = abSpecular;\n}\n\n\nif(abSpecularColorMap != \"\")\n{\nCspec = abSpecularColor * color texture(abSpecularColorMap, ss, tt,\n\"swidth\", abSpecularColorMapBlur,\n\"twidth\", abSpecularColorMapBlur );\n}\nelse\n{\nCspec = abSpecularColor;\n}\n\n\nif(abRoughnessMap != \"\")\n{\nroughness = abRoughness * float texture(abRoughnessMap, ss, tt,\n\"swidth\", abRoughnessMapBlur,\n\"twidth\", abRoughnessMapBlur );\n}\nelse\n{\nroughness = abRoughness;\n}\n\n\nif(abTransparencyMap != \"\")\n{\nif(abInvertTransparencyMap != 0)\n{\nCopac = Copac * color texture(abTransparencyMap, ss, tt,\n\"swidth\", abTransparencyMapBlur,\n\"twidth\", abTransparencyMapBlur );\n}\nelse\n{\nCopac = Copac * (color(1) - color texture(abTransparencyMap, ss, tt,\n\"swidth\", abTransparencyMapBlur,\n\"twidth\", abTransparencyMapBlur ));\n}\n}\n\n\nif(abIncandescenseMap != \"\")\n{\nCincand = abIncandescence * color texture(abIncandescenseMap, ss, tt,\n\"swidth\", abIncandescenseMapBlur,\n\"twidth\", abIncandescenseMapBlur );\n}\nelse\n{\nCincand = abIncandescence;\n}\n\n\n\nif( abBumpMap != \"\" )\n{\nbmp = abBumpScale * float texture( abBumpMap, ss, tt,\n\"swidth\", abBumpMapBlur,\n\"twidth\", abBumpMapBlur );\nPP = transform(\"shader\", P);\nNf = normalize( ntransform(\"shader\", N) );\nPP += bmp * Nf;\nPP = transform(\"shader\", \"current\", PP);\nNf = calculatenormal(PP);\n\nif (abUseNormals == 1) {\nnormal deltaN = normalize(N) - normalize(Ng);\nNf = normalize(Nf) + deltaN;\n}\n\nif( abDoDisplacement == 1.0 )\nP = PP;\n}\nelse\n{\nNf = N;\n}\n\n\nNf = faceforward( normalize(Nf), I );\nV = -normalize(I);\n\n\nif( abReflectionMap != \"\" )\n{\nD = reflect(-V, Nf);\nD = vtransform(\"worldspace\", D);\nif( abReflectionUp != 0 )\n{\nD = vector(-zcomp(D), xcomp(D), ycomp(D));\n}\nCrefl = abReflectivity *\ncolor environment(abReflectionMap, D,\n\"swidth\", abReflectionMapBlur,\n\"twidth\", abReflectionMapBlur );\n}\nelse\nCrefl = color(0);\n\n/** Surface main-code end **/\n\nCi = Csurf * (Cincand + ambient() + diff * diffuse(Nf)) + (spec * Cspec * (specular(Nf, V, roughness) + Crefl));\n\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_urbermap.sl.slmeta",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_urbermap\">\n\t\t\t<argument name=\"abColorMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"abColorMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"abUseColorMapAlpha\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"abDiffuse\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.8\"/>\n\t\t\t<argument name=\"abDiffuseMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"abDiffuseMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"abSpecular\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.3\"/>\n\t\t\t<argument name=\"abSpecularMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"abSpecularMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"abSpecularColor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"abSpecularColorMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"abSpecularColorMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"abRoughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.3\"/>\n\t\t\t<argument name=\"abRoughnessMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"abRoughnessMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"abTransparencyMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"abInvertTransparencyMap\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"abTransparencyMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"abIncandescence\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"abIncandescenseMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"abIncandescenseMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"abReflectionMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"abReflectionUp\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"abReflectivity\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"abReflectionMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"abBumpMap\" storage_class=\"uniform\" type=\"string\" extended_type=\"texture\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"\"/>\n\t\t\t<argument name=\"abBumpMapBlur\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"abBumpScale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"abDoDisplacement\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"abUseNormals\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"STMatrix0\" storage_class=\"uniform\" type=\"point\" extended_type=\"point\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t\t<argument name=\"STMatrix1\" storage_class=\"uniform\" type=\"point\" extended_type=\"point\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_veinedmarble.sl",
    "content": "/*\n * veinedmarble.sl -- surface shader for a nice veined marble.\n *\n * DESCRIPTION:\n *   Makes solid marble texture with strong veins.  The \"veincolor\" parameter\n *   controls the color of the veins.  The background color is given by the\n *   surface color (Cs).\n * \n * PARAMETERS:\n *   Ka, Kd, Ks, roughness, specularcolor - same as plastic\n *   veinfreq - controls fhe lowest frequency of the color veins\n *   veinlevels - how many \"levels\" of vein tendrills it has\n *   warpfreq - lowest frequency of the turbulent warping in the marble\n *   warping - controls how much turbulent warping there will be\n *   veincolor - the color of the veins\n *   sharpness - controls how sharp or fuzzy the veins are (higher = sharper)\n *\n *\n * AUTHOR: Larry Gritz, the George Washington University\n *         email: gritz@seas.gwu.edu\n *\n * HISTORY:\n *\n * last modified  29 Jun 1994 by Larry Gritz\n */\n\n#include \"k3d_noises.h\"\n#include \"k3d_material.h\"\n\n\nsurface k3d_veinedmarble(float Ka = .5;\n\t\t\t float Kd = .8;\n\t\t\t float Ks = .4;\n\t\t\t float roughness = .075;\n\t\t\t color specularcolor = 1;\n\t\t\t float veinfreq = 1;\n\t\t\t float veinlevels = 2;\n\t\t\t float warpfreq = 1;\n\t\t\t float warping = .5;\n\t\t\t color veincolor = color(.6, .5, .1);\n\t\t\t float sharpness = 8;\n  )\n{\n  color Ct;\n  point offset;\n  float i, turb, freq;\n  float turbsum;\n\n  point PP = transform(\"shader\", P);\n  float dPP = filterwidthp(PP);\n\n  PP += 0.5 * vfBm(PP, dPP, 6, 2, 0.5);\n\n  /* Now calculate the veining function for the lookup area */\n  turbsum = 0;\n  freq = 1;\n  PP *= veinfreq;\n  for(i = 0; i < veinlevels; i += 1)\n    {\n      turb = abs(filteredsnoise(PP * freq, dPP * freq));\n      turb = pow(smoothstep(0.8, 1, 1 - turb), sharpness) / freq;\n      turbsum += (1 - turbsum) * turb;\n      freq *= 3;\n      PP *= 3;\n    }\n\n  Ct = mix(Cs, veincolor, turbsum);\n\n  normal Nf = faceforward(normalize(N), I);\n  Ci = MaterialPlastic(Nf, Ct, Ka, Kd, Ks, roughness);\n  Oi = Os;\n  Ci *= Oi;\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_veinedmarble.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_veinedmarble\">\n\t\t\t<description>Solid marble texture with strong veins</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".5\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".4\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".075\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"veinfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"veinlevels\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"2\"/>\n\t\t\t<argument name=\"warpfreq\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"warping\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".5\"/>\n\t\t\t<argument name=\"veincolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.6 0.5 0.1\"/>\n\t\t\t<argument name=\"sharpness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"8\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_velvet.sl",
    "content": "/* Renamed to SHW_velvet.sl -- tal@SpamSucks_cs.caltech.edu */\n\n/*\n * velvet.sl -- velvet\n *\n * DESCRIPTION:\n *   An attempt at a velvet surface.\n *   This phenomenological model contains three compnents:\n *   - A retroreflective lobe (back toward the light source)\n *   - Scattering near the horizon, regardless of incident direction\n *   - A diffuse color\n * \n * PARAMETERS:\n *   Ks:\tcontrols retroreflective lobe\n *   Kd:\tscales diffuse color\n *   Ka:\tambient component (affects diffuse color only)\n *   sheen:\tcolor of retroreflective lobe and horizon scattering\n *   roughness: shininess of fabric (controls retroreflection only)\n *\n * ANTIALIASING: should antialias itself fairly well\n *\n * AUTHOR: written by Stephen H. Westin, Ford Motor Company\n *\n * HISTORY:\n * \t2001.02.01\twestin@SpamSucks_graphics.cornell.edu\n *\t\t\tFixed retroreflection lobe (sign error); added\n *\t\t\t\"backscatter\" parameter to control it; added\n *\t\t\t\"edginess\" parameter to control horizon scatter;\n *\t\t\tdefined sqr()\n *\n * prev modified  28 January 1997 S. H. Westin\n */\n\n#include \"k3d_functions.h\"\n\nsurface\nk3d_velvet (float Ka = 0.05,\n              Kd = 0.1,\n              Ks = 0.1;\n\t    float backscatter = 0.1,\n\t    edginess = 10;\n        color sheen = .25;\n        float roughness = .1;\n  )\n{\n  normal Nf;                     /* Normalized normal vector */\n  vector V;                      /* Normalized eye vector */\n  vector H;                      /* Bisector vector for Phong/Blinn */\n  vector Ln;                     /* Normalized vector to light */\n  color shiny;                   /* Non-diffuse components */\n  float cosine, sine;            /* Components for horizon scatter */\n\n  Nf = faceforward (normalize(N), I);\n  V = -normalize (I);\n\n  shiny = 0;\n  illuminance ( P, Nf, 1.57079632679489661923 /* Hemisphere */ ) {\n    Ln = normalize ( L );\n    /* Retroreflective lobe */\n    cosine = max ( Ln.V, 0 );\n    shiny += pow ( cosine, 1.0/roughness ) * backscatter\n      * Cl * sheen;\n    /* Horizon scattering */\n    cosine = max ( Nf.V, 0 );\n    sine = sqrt (1.0-sqr(cosine));\n    shiny += pow ( sine, edginess ) * Ln.Nf * Cl * sheen;\n  }\n\n  Oi = Os;\n  /* Add in diffuse color */\n  Ci = Os * (Ka*ambient() + Kd*diffuse(Nf)) * Cs + shiny;\n\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_velvet.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_velvet\">\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.05\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"backscatter\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.1\"/>\n\t\t\t<argument name=\"edginess\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"10\"/>\n\t\t\t<argument name=\"sheen\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.25 0.25 0.25\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\".1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_venus.sl",
    "content": "/*\n * venus.sl - surface for a very cloudy planet like Venus.\n *\n *\n * DESCRIPTION:\n *      When put on a sphere, sets the color to look like a densely\n *   clouded planet, very much like the real Venus appears in UV.\n *      The shader works by creating a fractal turbulence function over\n *   the surface to simulate the clouds.  Strong Coriolis forces are\n *   simulated to give the twisting of clouds that is typically seen\n *   on Venus.\n *\n *\n * PARAMETERS:\n *    Ka, Kd - the usual meaning\n *    offset, scale - control the linear scaling of the cloud value.\n *    twist - controls the twisting of the clouds due to Coriolis forces.\n *    omega - controls the fractal characteristics of the clouds\n *    octaves - the number of octaves of noise to sum for the clouds.\n *\n *\n * HINTS:\n *    The default values for the shader assume that the planet is\n *    represented by a unit sphere.  The texture space and/or parameters\n *    to this shader will need to be altered if the size of your planet\n *    is radically different.\n *\n *\n * AUTHOR: Ken Musgrave.\n *    Conversion to Shading Language and minor modifications by Larry Gritz.\n *\n *\n * REFERENCES:\n *    _Texturing and Modeling: A Procedural Approach_, by David S. Ebert, ed.,\n *    F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, and Steven Worley.\n *    Academic Press, 1994.  ISBN 0-12-228760-6.\n *\n *\n * HISTORY:\n *    ???? - Venus texture developed by F. Ken Musgrave.\n *    Feb 1994 - Conversion to Shading Language by L. Gritz\n *\n * last modified 1 March 1994 by lg\n */\n\n #include \"k3d_constants.h\"\n #include \"k3d_noises.h\"\n\n\nsurface k3d_venus(float Ka = 1, Kd = 1;\n\t\t  float offset = 1; float scale = 0.6; float twist = 0.22;\n\t\t  float omega = 0.65;\n\t\t  float octaves = 8;)\n{\n  point Ptexture;\t\t/* the shade point in texture space */\n  point PtN;\t\t\t/* normalized version of Ptexture */\n  point PP;\t\t\t/* Point after rotation by coriolis twist */\n  float rsq;\t\t\t/* Used in calculation of twist */\n  float angle;\t\t\t/* Twist angle */\n  float sine, cosine;\t\t/* sin and cos of angle */\n  float l, o, a, i;\t\t/* Loop control for fractal sum */\n  float value;\t\t\t/* Fractal sum is stored here */\n\n  /* Transform to texture coordinates */\n  Ptexture = transform(\"shader\", P);\n\n  /* Calculate Coriolis twist, yielding point PP */\n  PtN = normalize(Ptexture);\n  rsq = xcomp(PtN) * xcomp(PtN) + ycomp(PtN) * ycomp(PtN);\n  angle = twist * TWOPI * rsq;\n  sine = sin(angle);\n  cosine = cos(angle);\n  PP =\n    point(xcomp(Ptexture) * cosine - ycomp(Ptexture) * sine,\n\t  xcomp(Ptexture) * sine + ycomp(Ptexture) * cosine, zcomp(Ptexture));\n\n  /* Compute VLfBm */\n  l = 1;\n  o = 1;\n  a = 0;\n  for(i = 0; i < octaves; i += 1)\n    {\n      a += o * snoise(PP * l);\n      l *= 2;\n      o *= omega;\n    }\n\n  value = abs(offset + scale * a);\n\n  /* Shade like matte, but with color scaled by cloud color */\n  Oi = 1;\n  Ci =\n    Os * (value * Cs) * (Ka * ambient() +\n\t\t\t Kd * diffuse(faceforward(normalize(N), I)));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_venus.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_venus\">\n\t\t\t<description>A cloudy, Venus-like planet</description>\n\t\t\t<authors>Ken Musgrave, Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"offset\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"scale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.6\"/>\n\t\t\t<argument name=\"twist\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.22\"/>\n\t\t\t<argument name=\"omega\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.65\"/>\n\t\t\t<argument name=\"octaves\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"8\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_warningstripes.sl",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include \"k3d_patterns.h\"\n\nsurface k3d_warningstripes(\n\tfloat Ka = 1;\n\tfloat Kd = 1;\n\tfloat Frequency = 4;\n\tcolor StripeColor = color(0, 0, 0)\n\t)\n{\n\tvector Nf = normalize(faceforward(N, I));\n\t\n\tfloat stripe_position = filteredpulsetrain(0.5 / Frequency, 1.0 / Frequency, u+v, filterwidth(u+v));\n\tcolor Ct = mix(Cs, StripeColor, stripe_position);\n\n\tOi = Os;\n\tCi = Os * Ct * (Ka * ambient() + Kd * diffuse(Nf));\n}\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_warningstripes.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_warningstripes\">\n\t\t\t<description>Creates diagonal stripes as seen around heavy equipment</description>\n\t\t\t<authors>Timothy M. Shead</authors>\n\t\t\t<copyright>Copyright (c) 1995-2004, Timothy M. Shead</copyright>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Frequency\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"4\"/>\n\t\t\t<argument name=\"StripeColor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_wood2.sl",
    "content": "/*\n * wood2.sl -- another surface shader for wood.\n *\n * DESCRIPTION:\n *   Makes wood solid texture.\n * \n * PARAMETERS:\n *   Ka, Kd, Ks, specular, roughness - work just like the plastic shader\n *   txtscale - overall scaling factor for the texture\n *   ringscale - scaling for the ring spacing\n *   lightwood, darkwood - surface colors for the wood itself\n *   grainy - relative graininess (0 = no fine grain)\n *\n * AUTHOR: written by Larry Gritz (lg@bmrt.org)\n *\n * $Revision: 1.1 $    $Date: 2006/02/25 20:11:54 $\n */\n\n\n\nsurface k3d_wood2(float Ka = 1, Kd = .75, Ks = .4;\n\t\t  float roughness = .1;\n\t\t  color specularcolor = 1;\n\t\t  float ringscale = 15;\n\t\t  float txtscale = 1;\n\t\t  color lightwood = color(0.69, 0.44, 0.25);\n\t\t  color darkwood = color(0.35, 0.22, 0.08); float grainy = 1;)\n{\n  point PP, PQ;\t\t\t/* shading space point to be computed */\n  normal Nf;\t\t\t/* forward facing normal */\n  color Ct;\t\t\t/* surface color of the wood */\n  float r, r2;\n  float my_t;\n\n  /* Calculate in shader space */\n  PP = txtscale * transform(\"shader\", P);\n\n  my_t = zcomp(PP) / ringscale;\n  PQ = point(xcomp(PP) * 8, ycomp(PP) * 8, zcomp(PP));\n  my_t += noise(PQ) / 16;\n\n  PQ = point(xcomp(PP), my_t, ycomp(PP) + 12.93);\n  r = ringscale * noise(PQ);\n  r -= floor(r);\n  r = 0.2 + 0.8 * smoothstep(0.2, 0.55, r) * (1 - smoothstep(0.75, 0.8, r));\n\n  /* \\/--  extra line added for fine grain */\n  PQ = point(xcomp(PP) * 128 + 5, zcomp(PP) * 8 - 3, ycomp(PP) * 128 + 1);\n  r2 = grainy * (1.3 - noise(PQ)) + (1 - grainy);\n\n  Ct = mix(lightwood, darkwood, r * r2 * r2);\n\n\n  /*\n   * Use the plastic illumination model\n   */\n  Nf = faceforward(normalize(N), I);\n  Oi = Os;\n  Ci =\n    Os * (Ct * (Ka * ambient() + Kd * diffuse(Nf)) +\n\t  specularcolor * Ks * specular(Nf, -normalize(I), roughness));\n}\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_wood2.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_wood2\">\n\t\t\t<description>Basic wood surface shader</description>\n\t\t\t<authors>Larry Gritz</authors>\n\t\t\t<argument name=\"Ka\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"Kd\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".75\"/>\n\t\t\t<argument name=\"Ks\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".4\"/>\n\t\t\t<argument name=\"roughness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\".1\"/>\n\t\t\t<argument name=\"specularcolor\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1 1 1\"/>\n\t\t\t<argument name=\"ringscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"15\"/>\n\t\t\t<argument name=\"txtscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"lightwood\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.69 0.44 0.25\"/>\n\t\t\t<argument name=\"darkwood\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0.35 0.22 0.08\"/>\n\t\t\t<argument name=\"grainy\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_woodcut.sl",
    "content": "/*\n * 2006-03-13 dan@3-e.net\n *\n */\n\n#include \"k3d_rmannotes.h\"\n#include \"k3d_noises.h\"\n  \n surface k3d_woodcut (\nstring up=\"y\"; \nfloat ringscale=5; \nfloat contrast=0.3; \nfloat brightness=0.75; \nfloat random=0; \nfloat nsize=5; ) { \n\ncolor surface_color, layer_color;\ncolor surface_opac, layer_opac, Cr;\nfloat fuzz = 0.3;\nfloat stripemin, stripemax, tt;\nfloat y, z, i, n, ns;\nfloat tfreq = 50;\n\ncolor illumcolor = 0.0;\nfloat illumination = 0.0;\nfloat Ka = 0.10;\nfloat Kd = 0.70;\nfloat Ks = 0.20;\nvector Nf, V; \npoint Psh;\nfloat roughness = 0.2;\n\nPsh = transform(\"shader\", P);\n\nNf = faceforward( normalize(N), I );\nV = -normalize(I); \n\nif (up == \"z\") { \nz = zcomp(Psh);\nz *= ringscale;\ntt = mod(z,1);\n}\nelse {\ny = ycomp(Psh);\ny *= ringscale;\ntt = mod(y,1);\n}\n\nillumcolor = (Ka*ambient() + Kd*diffuse(Nf) + Ks*specular(Nf,V,roughness));\nillumination = max(max(comp(illumcolor, 0), comp(illumcolor, 1)), comp(illumcolor, 2));\n\nn = 0;\nns = nsize;\nfor (i = 0; i < 6.0; i += 1.0) {\n\nn += snoise(Psh * ns) / ns;\nns *= 2.17;\n}\n\nillumination = (illumination * contrast) + (1.0 - contrast)/2.0 + \n(brightness - 1.0) + n*random;\n\nif (illumination < 0.01) {\nsurface_color = color (0.0, 0.0, 0.0);\nlayer_color = 0.0; \n}\nelse if (illumination > 0.99) {\nsurface_color = color (1.0, 1.0, 1.0);\nlayer_color = 1.0;\n}\nelse {\nsurface_color = color (0.0, 0.0, 0.0);\nlayer_color = 1.0;\n}\nsurface_opac = 1.0;\n\n\nstripemin = 0.5 - smoothstep(0.0, 1.0, illumination)/2.0;\nstripemax = 0.5 + smoothstep(0.0, 1.0, illumination)/2.0;\nfloat val = pulse(stripemin, stripemax, fuzz, tt);\nlayer_opac = color val;\nsurface_color = blend(surface_color, layer_color, layer_opac);\nfloat color_val = mix(0.0, 1.0, val);\nCr = spline (color_val,\ncolor (0.0, 0.0, 0.0),\ncolor (0.1, 0.05, 0.0),\ncolor (0.8, 0.6, 0.4),\ncolor (1.0, 1.0, 0.8),\ncolor (1.0, 1.0, 1.0),\ncolor (1.0, 1.0, 1.0));\n float spacescale = length(vtransform(\"shader\", normalize(N)));\n vector Ndisp = normalize(N) * (0 / max(spacescale,1e-6));\n P += 0 * Ndisp;\n N = normalize (calculatenormal (P + (1-0)*Ndisp)); \n Ci = surface_opac * Cr; Oi = 1; }\n\n"
  },
  {
    "path": "share/k3d/shaders/surface/k3d_woodcut.sl.slmeta",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<shaders>\n\t\t<shader type=\"surface\" name=\"k3d_woodcut\">\n\t\t\t<argument name=\"up\" storage_class=\"uniform\" type=\"string\" extended_type=\"string\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"z\"/>\n\t\t\t<argument name=\"ringscale\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"15\"/>\n\t\t\t<argument name=\"contrast\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0.5\"/>\n\t\t\t<argument name=\"brightness\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"1\"/>\n\t\t\t<argument name=\"random\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"0\"/>\n\t\t\t<argument name=\"nsize\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"0\" default_value=\"15\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n"
  },
  {
    "path": "share/k3d/shaders/volume/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.sl k3d/shaders/volume)\nK3D_ADD_SHARE_FILES(*.slmeta k3d/shaders/volume)\n\n"
  },
  {
    "path": "share/k3d/shaders/volume/k3d_altitude_fog.sl",
    "content": "\nvolume k3d_altitude_fog(\n\tfloat max_height = 1; \n\tfloat min_height = -1;\n\tmatrix m = 1;\n\tcolor background = 0;\n\t)\n{\n\tpoint PP = transform(m, transform(\"world\", P));\n\tfloat fog = 1 - smoothstep(min_height, max_height, zcomp(PP));\n\n\tCi = mix(Ci, background, fog);\n\tOi = mix(Oi, color(1, 1, 1), fog);\n}\n\n"
  },
  {
    "path": "share/k3d/shaders/volume/k3d_altitude_fog.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"volume\" name=\"k3d_altitude_fog\">\n\t\t\t<description>Altitude fog</description>\n\t\t\t<authors>Timothy M. Shead</authors>\n\t\t\t<copyright>Copyright (c) 1995-2004, Timothy M. Shead</copyright>\n\t\t\t<argument name=\"max_height\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"5\"/>\n\t\t\t<argument name=\"min_height\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"-5\"/>\n\t\t\t<argument name=\"background\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n"
  },
  {
    "path": "share/k3d/shaders/volume/k3d_depthcue.sl",
    "content": "/* depthcue.sl - Standard depthcue volume shader for RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nvolume k3d_depthcue(float mindistance = 0, maxdistance = 1;\n\t\t    color background = 0;)\n{\n  float d;\n\n  d = clamp((depth(P) - mindistance) / (maxdistance - mindistance), 0, 1);\n  Ci = mix(Ci, background, d);\n}\n"
  },
  {
    "path": "share/k3d/shaders/volume/k3d_depthcue.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"volume\" name=\"k3d_depthcue\">\n\t\t\t<description>Standard depthcue volume shader for RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"mindistance\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0\"/>\n\t\t\t<argument name=\"maxdistance\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"background\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/shaders/volume/k3d_fog.sl",
    "content": "/* fog.sl - Standard fog volume shader for RenderMan Interface.\n * (c) Copyright 1988, Pixar.\n *\n * The RenderMan (R) Interface Procedures and RIB Protocol are:\n *     Copyright 1988, 1989, Pixar.  All rights reserved.\n * RenderMan (R) is a registered trademark of Pixar.\n */\n\nvolume k3d_fog(float distance = 1; color background = 0;)\n{\n  float d = 1 - exp(-length(I) / distance);\n  Ci = mix(Ci, background, d);\n  Oi = mix(Oi, color(1, 1, 1), d);\n}\n"
  },
  {
    "path": "share/k3d/shaders/volume/k3d_fog.sl.slmeta",
    "content": "<k3dml>\n\t<shaders>\n\t\t<shader type=\"volume\" name=\"k3d_fog\">\n\t\t\t<description>Standard fog volume shader for RenderMan Interface</description>\n\t\t\t<authors>Pixar</authors>\n\t\t\t<copyright>(c) Copyright 1988, Pixar</copyright>\n\t\t\t<argument name=\"distance\" storage_class=\"uniform\" type=\"float\" extended_type=\"float\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"1\"/>\n\t\t\t<argument name=\"background\" storage_class=\"uniform\" type=\"color\" extended_type=\"color\" array_count=\"1\" space=\"\" output=\"false\" default_value=\"0 0 0\"/>\n\t\t</shader>\n\t</shaders>\n</k3dml>\n\n\n\n\n"
  },
  {
    "path": "share/k3d/textures/CMakeLists.txt",
    "content": "K3D_ADD_SHARE_FILES(*.png k3d/textures)\n\n"
  },
  {
    "path": "share/man/CMakeLists.txt",
    "content": "PROJECT(man)\n\nCONFIGURE_FILE(k3d.1.txt.in k3d.1.txt)\nCONFIGURE_FILE(k3d-renderframe.1.txt.in k3d-renderframe.1.txt)\nCONFIGURE_FILE(k3d-renderjob.1.txt.in k3d-renderjob.1.txt)\nCONFIGURE_FILE(k3d-sl2xml.1.txt.in k3d-sl2xml.1.txt)\nCONFIGURE_FILE(k3d-uuidgen.1.txt.in k3d-uuidgen.1.txt)\n\nK3D_ADD_ASCIIDOC_MAN_PAGE(k3d.1 SOURCE ${CMAKE_CURRENT_BINARY_DIR}/k3d.1.txt DESTINATION ${K3D_SHARE_OUTPUT_DIRECTORY}/man/man1)\nK3D_ADD_ASCIIDOC_MAN_PAGE(k3d-renderframe.1 SOURCE ${CMAKE_CURRENT_BINARY_DIR}/k3d-renderframe.1.txt DESTINATION ${K3D_SHARE_OUTPUT_DIRECTORY}/man/man1)\nK3D_ADD_ASCIIDOC_MAN_PAGE(k3d-renderjob.1 SOURCE ${CMAKE_CURRENT_BINARY_DIR}/k3d-renderjob.1.txt DESTINATION ${K3D_SHARE_OUTPUT_DIRECTORY}/man/man1)\nK3D_ADD_ASCIIDOC_MAN_PAGE(k3d-sl2xml.1 SOURCE ${CMAKE_CURRENT_BINARY_DIR}/k3d-sl2xml.1.txt DESTINATION ${K3D_SHARE_OUTPUT_DIRECTORY}/man/man1)\nK3D_ADD_ASCIIDOC_MAN_PAGE(k3d-uuidgen.1 SOURCE ${CMAKE_CURRENT_BINARY_DIR}/k3d-uuidgen.1.txt DESTINATION ${K3D_SHARE_OUTPUT_DIRECTORY}/man/man1)\n\nINSTALL(FILES ${K3D_SHARE_OUTPUT_DIRECTORY}/man/man1/k3d.1 DESTINATION share/man/man1)\nINSTALL(FILES ${K3D_SHARE_OUTPUT_DIRECTORY}/man/man1/k3d-renderframe.1 DESTINATION share/man/man1)\nINSTALL(FILES ${K3D_SHARE_OUTPUT_DIRECTORY}/man/man1/k3d-renderjob.1 DESTINATION share/man/man1)\nINSTALL(FILES ${K3D_SHARE_OUTPUT_DIRECTORY}/man/man1/k3d-sl2xml.1 DESTINATION share/man/man1)\nINSTALL(FILES ${K3D_SHARE_OUTPUT_DIRECTORY}/man/man1/k3d-uuidgen.1 DESTINATION share/man/man1)\n\n"
  },
  {
    "path": "share/man/k3d-renderframe.1.txt.in",
    "content": "K3D-RENDERFRAME(1)\n==================\n\nNAME\n----\nk3d-renderframe - Part of a simple system for queueing K-3D render jobs on the local host\n\nSYNOPSIS\n--------\n*k3d-renderframe* ['OPTIONS'] ['DIRECTORY' ...]\n\nDESCRIPTION\n-----------\n\nExtracted from http://www.k-3d.org/wiki/Network_Rendering\n\nCurrently, K-3D implements a simple system for queueing rendering jobs on the\nlocal host. When the user initiates a job (such as rendering a preview image,\nrendering a final frame, or rendering an animation), a job directory is created\n(usually in /tmp, although this can be configured). The job directory contains\na lock file, a control file named control.k3d, and one-to-many numbered frame\ndirectories. The name of the lock file changes to flag the sta.IP tus of the\njob as \"ready\", \"running\", \"complete\", or \"error\". The control.k3d file is\ncurrently unused.  Each frame directory contains a lock file, a control file\nnamed control.k3d and zero-to-many frame resources. The name of the lock file\nchanges to flag the status of the frame as \"ready\", \"running\", \"complete\", or\n\"error\". The control.k3d file is an XML file that encodes a set of operations\nthat must be completed successfully to change the status of the frame from\n\"ready\" to \"complete\". Three types of operation are allowed: a \"render\"\noperation that executes a pre-configured render command using a fixed set of\ncommand-line arguments, a \"copy\" operation that copies a file from one\nfilesystem location to another; and a \"view\" operation that displays a bitmap\nimage using the user's choice of image viewer. The frame resources are inputs\nto the render engine, such as RIB files, texture images, shaders, etc. \n\nThe k3d-renderjob executable is run with the path to a job directory as an\nargument. k3d-renderjob updates the job lock file, iterating over each frame\ndirectory, spawning an instance of k3d-renderframe for each frame (one at a\ntime). k3d-renderframe is run with the path to a frame directory as an\nargument, updating the frame lock file, reading the control file, and executing\nthe operations that it specifies. \n\nOPTIONS\n-------\n\n*-h, --help*::\nPrints this help information and exits.\n\n*--version*::\nPrints program version information and exits.\n\nAUTHORS\n-------\nK-3D by Timothy M. Shead <tshead@k-3d.com>, and many others.  This manpage written by Manuel A. Fernandez Montecelo <manuel.montezelo@gmail.com>\n\nRESOURCES\n---------\nK-3D home page: http://www.k-3d.org\n\nCOPYING\n-------\n@K3D_COPYRIGHT@  This software is licensed under the terms of the GNU General\nPublic License; see the source for copying conditions.  There is NO warranty;\nnot even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
  },
  {
    "path": "share/man/k3d-renderjob.1.txt.in",
    "content": "K3D-RENDERJOB(1)\n================\n\nNAME\n----\nk3d-renderjob - Part of a simple system for queueing K-3D render jobs on the local host\n\nSYNOPSIS\n--------\n*k3d-renderjob* ['OPTIONS'] ['DIRECTORY' ...]\n\nDESCRIPTION\n-----------\n\nExtracted from http://www.k-3d.org/wiki/Network_Rendering\n\nCurrently, K-3D implements a simple system for queueing rendering jobs on the\nlocal host. When the user initiates a job (such as rendering a preview image,\nrendering a final frame, or rendering an animation), a job directory is created\n(usually in /tmp, although this can be configured). The job directory contains\na lock file, a control file named control.k3d, and one-to-many numbered frame\ndirectories. The name of the lock file changes to flag the sta.IP tus of the\njob as \"ready\", \"running\", \"complete\", or \"error\". The control.k3d file is\ncurrently unused.  Each frame directory contains a lock file, a control file\nnamed control.k3d and zero-to-many frame resources. The name of the lock file\nchanges to flag the status of the frame as \"ready\", \"running\", \"complete\", or\n\"error\". The control.k3d file is an XML file that encodes a set of operations\nthat must be completed successfully to change the status of the frame from\n\"ready\" to \"complete\". Three types of operation are allowed: a \"render\"\noperation that executes a pre-configured render command using a fixed set of\ncommand-line arguments, a \"copy\" operation that copies a file from one\nfilesystem location to another; and a \"view\" operation that displays a bitmap\nimage using the user's choice of image viewer. The frame resources are inputs\nto the render engine, such as RIB files, texture images, shaders, etc. \n\nThe k3d-renderjob executable is run with the path to a job directory as an\nargument. k3d-renderjob updates the job lock file, iterating over each frame\ndirectory, spawning an instance of k3d-renderframe for each frame (one at a\ntime). k3d-renderframe is run with the path to a frame directory as an\nargument, updating the frame lock file, reading the control file, and executing\nthe operations that it specifies. \n\nOPTIONS\n-------\n\n*-h, --help*::\nPrints this help information and exits.\n\n*--version*::\nPrints program version information and exits.\n\nAUTHORS\n-------\nK-3D by Timothy M. Shead <tshead@k-3d.com>, and many others.  This manpage written by Manuel A. Fernandez Montecelo <manuel.montezelo@gmail.com>\n\nRESOURCES\n---------\nK-3D home page: http://www.k-3d.org\n\nCOPYING\n-------\n@K3D_COPYRIGHT@  This software is licensed under the terms of the GNU General\nPublic License; see the source for copying conditions.  There is NO warranty;\nnot even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
  },
  {
    "path": "share/man/k3d-sl2xml.1.txt.in",
    "content": "K3D-SL2XML(1)\n=============\n\nNAME\n----\nk3d-sl2xml - Parses a RenderMan shader to create a shader meta file used by the K-3D user interface.\n\nSYNOPSIS\n--------\n*k3d-sl2xml* ['OPTIONS']\n\nDESCRIPTION\n-----------\n\n*-h, --help*::\nPrints this help information and exits.\n\n*--version*::\nPrints program version information and exits.\n\nNote: input on stdin *must* be *preprocessed* RenderMan Shading Language source code.\nWe recommend you run k3d-sl2xml with:\n\n--------------------------------------------------------\ngcc -E -P -x c <file> | k3d-sl2xml\n--------------------------------------------------------\n\nAUTHORS\n-------\nK-3D by Timothy M. Shead <tshead@k-3d.com>, and many others.  This manpage written by Manuel A. Fernandez Montecelo <manuel.montezelo@gmail.com>\n\nRESOURCES\n---------\nK-3D home page: http://www.k-3d.org\n\nCOPYING\n-------\n@K3D_COPYRIGHT@  This software is licensed under the terms of the GNU General\nPublic License; see the source for copying conditions.  There is NO warranty;\nnot even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
  },
  {
    "path": "share/man/k3d-uuidgen.1.txt.in",
    "content": "K3D-UUIDGEN(1)\n==============\n\nNAME\n----\nk3d-uuidgen - generates a unique identifier.\n\nSYNOPSIS\n--------\n*k3d-uuidgen*\n\nDESCRIPTION\n-----------\nGenerates a unique identifier for use by a new K-3D plugin.  You can get\nsimilar results with other 'uuid' tools, k3d-uuidgen is provided as a\nconvenience.\n\nAUTHORS\n-------\nK-3D by Timothy M. Shead <tshead@k-3d.com>, and many others.  This manpage written by Manuel A. Fernandez Montecelo <manuel.montezelo@gmail.com>\n\nRESOURCES\n---------\nK-3D home page: http://www.k-3d.org\n\nCOPYING\n-------\n@K3D_COPYRIGHT@  This software is licensed under the terms of the GNU General\nPublic License; see the source for copying conditions.  There is NO warranty;\nnot even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
  },
  {
    "path": "share/man/k3d.1.txt.in",
    "content": "K3D(1)\n=======\n\nNAME\n----\nk3d - 3D modeling and animation system.\n\nSYNOPSIS\n--------\n*k3d* ['OPTIONS']\n\nDESCRIPTION\n-----------\nK-3D is the free (as in freedom) 3D modeling, animation, and rendering system\nfor systems including GNU/Linux, Mac OSX, Windows, and others. K-3D features a\nrobust, object-oriented plugin architecture and is capable of producing\nmotion-picture-quality output when paired with a RenderMan Interface compliant\nrender engine such as Aqsis.\n\nOPTIONS\n-------\n\n*--add-path*='PATH'::\nPrepends a filesystem path to the PATH environment variable.\n\n*--batch*::\nEnables batch (no user intervention) mode.\n\n*--color*::\nColor-codes log messages based on their priority.  Requires an ANSI\ncolor-capable terminal.\n\n*--disable-gl-extension*='EXTENSION'::\nDisables the given OpenGL extension (whether it is supported by the\nunderlyinghardware or not).\n\n*--enable-gl-extension*='EXTENSION'::\nEnables the given OpenGL extension (whether it is supported by the underlying\nhardware or not).\n\n*--exit*::\nExits the program after startup (useful when running scripts in batch mode).\n\n*-h, --help*::\nPrints this help information and exits.\n\n*--list-gl-extensions*::\nList available OpenGL extensions and exit.\n\n*--locale*='PATH'::\nOverrides the path for loading locales.\n\n*--log-level*='LEVEL'::\nSpecifies the minimal message priority to display: 'warning', 'information'\nor 'debug'.  Defaults to 'warning'.\n\n*--options*='PATH'::\nOverrides the filepath for storing user options (this overrides the default\nand the K3D_OPTIONS_PATH environment variable).\n\n*--plugins*='PATHS'::\nOverrides the path(s) for loading plugin libraries (this overrides the\ndefault and the K3D_PLUGIN_PATHS environment variable).  Multiple\ncolon-delimited paths are allowed.  Use \"&\" as a synonym for the default\npaths.\n\n*--no-color*::\nDisable color-coding of log messages based on their priority.\n\n*-e, --script*='SCRIPT'::\nExecutes the given script text after startup.\n\n*-f, --script-file*='PATH'::\nExecutes the given script file after startup (use - for stdin).\n\n*--setenv*='ARG'::\nSet an environment variable using name=value syntax.\n\n*--shadercache*='PATH'::\nOverrides the path where compiled shaders will be cached (this overrides the\ndefault and the K3D_SHADER_CACHE_PATH environment variable).\n\n*--share*='PATH'::\nOverrides the path for loading shared data files (this overrides the default\nand the K3D_SHARE_PATH environment variable).\n\n*--show-process*::\nPrints the process name next to log messages.\n\n*--show-timestamps*::\nPrints timestamps next to log messages.\n\n*--syslog*::\nLogs messages to syslog.\n\n*-u, --ui*='ARG'::\nSpecifies the user interface to use at startup: 'nui', 'ngui', 'qtui',\n'pyui', or the path to a user interface plugin (this overrides the default\nand the K3D_USER_INTERFACE_PATH environment variable).\n\n*-H, --user-interface-help*::\nPrints additional command line options based on the the current choice of\nuser interface, and exits.\n\n*--version*::\nPrints program version information and exits.\n\nENVIRONMENT VARIABLES\n---------------------\n\n*K3D_EXTRA_OPTIONS*::\nProvides additional options that are appended to the command-line at startup.\nNote that unlike other K-3D environment variables, options specified via\nK3D_EXTRA_OPTIONS will override options specified on the command line.\nTypically used to pass command-line arguments when running the program from\nthe build tree. \n\n*K3D_OPTIONS_PATH*::\nOverrides the path for storing user options (this overrides the default, but\ncan be overridden by the --options option).\n\n*K3D_PLUGIN_PATHS*::\nOverrides the path(s) for loading plugin libraries (this overrides the\ndefault, but can be overridden by the --plugins option).  Multiple\ncolon-delimited paths are allowed.  Use \"&\" as a synonym for the default\npaths.\n\n*K3D_SHADER_CACHE_PATH*::\nOverrides the path where compiled shaders are cached (this overrides the\ndefault, but can be overridden by the --shadercache option).\n\n*K3D_SHARE_PATH*::\nOverrides the path for loading shared data files (this overrides the default,\nbut can be overridden by the --share option).\n\n*K3D_USER_INTERFACE_PATH*::\nOverrides the path to the user interface plugin (this overrides the default,\nbut can be overridden by the --ui option).\n\n\nEXIT STATUS\n-----------\n\n*0*::\n    Success\n\n*Non-zero*::\n    Failure (syntax or usage error; configuration error; runtime\n    failure; unexpected error).\n\nBUGS\n----\nSee the K-3D tracker at http://developer.k-3d.org/tracker and report bugs to <k3d-development@lists.sourceforge.net>\n\nAUTHORS\n-------\nK-3D by Timothy M. Shead <tshead@k-3d.com>, and many others.\n\nRESOURCES\n---------\nK-3D home page: http://www.k-3d.org\n\nCOPYING\n-------\n@K3D_COPYRIGHT@  This software is licensed under the terms of the GNU General\nPublic License; see the source for copying conditions.  There is NO warranty;\nnot even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
  },
  {
    "path": "sl2xml/CMakeLists.txt",
    "content": "PROJECT(sl2xml)\n\nINCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GLIBMM_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${K3D_GLIBMM_LIB_DIRS})\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nADD_EXECUTABLE(k3d-sl2xml\n  main.cpp\n  )\n\nSET_TARGET_PROPERTIES(k3d-sl2xml PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY ${K3D_RUNTIME_OUTPUT_DIRECTORY}\n  )\n\nTARGET_LINK_LIBRARIES(k3d-sl2xml\n  k3dsdk\n  )\n\nINSTALL(TARGETS k3d-sl2xml DESTINATION bin)\n\n"
  },
  {
    "path": "sl2xml/main.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\t\\brief Implements the k3d-sl2xml command-line application, which converts Pixar RenderMan Shading Language to XML on stdout\n\t\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3d-version-config.h>\n\n#include <k3dsdk/sl.h>\n\n#include <iostream>\n#include <fstream>\n#include <vector>\n\n/////////////////////////////////////////////////////////////////////////////\n// main\n\nint main(int argc, char* argv[])\n{\n\t// Keep track of command line arguments that aren't options ...\n\tstd::vector<std::string> files;\n\n\t// Look for command-line options ...\n\tfor(int i = 1; i < argc; ++i)\n\t{\n\t\tconst std::string argument = argv[i];\n\n\t\tif(argument == \"--help\" || argument == \"-h\")\n\t\t{\n\t\t\tstd::cout << \"Usage: \" << argv[0] << \" [options]\" << std::endl;\n\t\t\tstd::cout << std::endl;\n\t\t\tstd::cout << \"  -h, --help         prints this help information and exits\" << std::endl;\n\t\t\tstd::cout << \"      --version      prints program version information and exits\" << std::endl;\n\t\t\tstd::cout << std::endl;\n\t\t\tstd::cout << \"Note: input on stdin MUST be PREPROCESSED Shading Language source code.\" << std::endl;\n\t\t\tstd::cout << \"Recommend you run this command with:\" << std::endl;\n\t\t\tstd::cout << std::endl;\n\t\t\tstd::cout << \"     gcc -E -P -x c <file> | sl2xml\" << std::endl;\n\t\t\tstd::cout << std::endl;\n\t\t\treturn 0;\n\t\t}\n\t\telse if(argument == \"--version\")\n\t\t{\n\t\t\tstd::cout << argv[0] << \" version \" << K3D_VERSION << std::endl;\n\t\t\tstd::cout << K3D_COPYRIGHT << \"  See the AUTHORS file for contributors.\" << std::endl;\n\t\t\tstd::cout << \"Licensed under the GNU General Public License.  See the COPYING file for details.\" << std::endl;\n\t\t\tstd::cout << \"K-3D Home Page: http://www.k-3d.com\" << std::endl;\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tconst k3d::sl::shaders_t shaders = k3d::sl::parse_source(std::cin, k3d::filesystem::generic_path(\"stdin\"));\n\tk3d::sl::generate_metafile(std::cout, shaders);\n\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "tests/CMakeLists.txt",
    "content": "PROJECT(tests)\n\nINCLUDE(K3DParseArguments)\n\n# Provides a consistent interface for running all K-3D tests\nFUNCTION(K3D_TEST TEST_NAME)\n\tK3D_PARSE_ARGUMENTS(TEST \"COMMAND;TARGET;CMAKE_SCRIPT;PYTHON_SCRIPT;K3D_PYTHON_SCRIPT;K3D_PYTHON_COMMAND_SCRIPT;REQUIRES;LABELS;WORKING_DIRECTORY;ARGUMENTS\" \"NGUI;XFAIL\" ${ARGN})\n\n\tFOREACH(REQUIREMENT ${TEST_REQUIRES})\n\t\tIF(NOT ${REQUIREMENT})\n\t\t\tRETURN()\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_COMMAND)\n\t\tADD_TEST(${TEST_NAME} ${TEST_COMMAND})\n\tELSEIF(TEST_TARGET)\n\t\tGET_TARGET_PROPERTY(TARGET_LOCATION ${TEST_TARGET} LOCATION)\n\t\tIF(TEST_WORKING_DIRECTORY)\n\t\t\tADD_TEST(${TEST_NAME} \"${CMAKE_COMMAND}\" -E chdir \"${TEST_WORKING_DIRECTORY}\" \"${TARGET_LOCATION}\" ${TEST_ARGUMENTS})\n\t\tELSE()\n\t\t\tADD_TEST(${TEST_NAME} \"${TARGET_LOCATION}\" ${TEST_ARGUMENTS})\n\t\tENDIF()\n\tELSEIF(TEST_CMAKE_SCRIPT)\n\t\tIF(NOT TEST_WORKING_DIRECTORY)\n\t\t\tMESSAGE(SEND_ERROR \"CMAKE_SCRIPT directive requires WORKING_DIRECTORY\")\n\t\tENDIF()\n\t\tADD_TEST(${TEST_NAME} \"${CMAKE_COMMAND}\" -E chdir \"${TEST_WORKING_DIRECTORY}\" \"${CMAKE_COMMAND}\" -P \"${TEST_CMAKE_SCRIPT}\")\n\tELSEIF(TEST_PYTHON_SCRIPT)\n\t\tADD_TEST(${TEST_NAME} \"${PYTHON_EXECUTABLE}\" \"${TEST_PYTHON_SCRIPT}\")\n\tELSEIF(TEST_K3D_PYTHON_SCRIPT)\n\t\tSET(TEST_UI --ui=nui)\n\t\tIF(TEST_NGUI)\n\t\t\tIF(NOT K3D_BUILD_NGUI_MODULE)\n\t\t\t\tRETURN()\n\t\t\tENDIF()\n\t\t\tSET(TEST_UI --ui=ngui --batch --no-custom-layouts --no-splash)\n\t\tENDIF()\n\n\t\tADD_TEST(${TEST_NAME}\n\t\t\t${k3d_BINARY_DIR}/bin/k3d\n\t\t\t--log-level=debug\n\t\t\t${TEST_UI}\n\t\t\t--setenv \"PYTHONPATH=${tests_SOURCE_DIR}\"\n\t\t\t--setenv \"K3D_TEST_SOURCE_PATH=${tests_SOURCE_DIR}\"\n\t\t\t--setenv \"K3D_TEST_BINARY_PATH=${tests_BINARY_DIR}\"\n\t\t\t${TEST_ARGUMENTS}\n\t\t\t--script-file=${TEST_K3D_PYTHON_SCRIPT}\n\t\t\t--batch\n\t\t\t--exit\n\t\t\t)\n\tELSEIF(TEST_K3D_PYTHON_COMMAND_SCRIPT)\n\t\tSET(TEST_UI --ui=nui)\n\t\tIF(TEST_NGUI)\n\t\t\tIF(NOT K3D_BUILD_NGUI_MODULE)\n\t\t\t\tRETURN()\n\t\t\tENDIF()\n\t\t\tSET(TEST_UI --ui=ngui --batch --no-custom-layouts --no-splash)\n\t\tENDIF()\n\n\t\tADD_TEST(${TEST_NAME}\n\t\t\t${k3d_BINARY_DIR}/bin/k3d\n\t\t\t--log-level=debug\n\t\t\t${TEST_UI}\n\t\t\t--setenv \"PYTHONPATH=${tests_SOURCE_DIR}\"\n\t\t\t--setenv \"K3D_TEST_SOURCE_PATH=${tests_SOURCE_DIR}\"\n\t\t\t--setenv \"K3D_TEST_BINARY_PATH=${tests_BINARY_DIR}\"\n\t\t\t${TEST_ARGUMENTS}\n\t\t\t--script=${TEST_K3D_PYTHON_COMMAND_SCRIPT}\n\t\t\t--batch\n\t\t\t--exit\n\t\t\t)\n\tELSE()\n\t\tMESSAGE(SEND_ERROR \"Unknown K3D_TEST type\")\n\t\tRETURN()\n\tENDIF()\n\n\tIF(TEST_LABELS)\n\t\tFOREACH(LABEL ${TEST_LABELS})\n\t\t\tSET(LABELS \"${LABELS} ${LABEL}\")\n\t\tENDFOREACH()\n\t\tSET_TESTS_PROPERTIES(${TEST_NAME} PROPERTIES LABELS ${LABELS})\n\tENDIF()\n\n\tIF(TEST_XFAIL)\n\t\tSET_TESTS_PROPERTIES(${TEST_NAME} PROPERTIES WILL_FAIL TRUE)\n\tENDIF()\nENDFUNCTION()\n\nFILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bitmaps)\nFILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bitmaps/differences)\nFILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/meshes)\nFILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/meshes/differences)\nFILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/shaders/displacement)\nFILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/shaders/light)\nFILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/shaders/surface)\nFILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/shaders/volume)\n\n# Run tests that extract information about the underlying platform\nADD_SUBDIRECTORY(platform)\n\n# Run tests that enforce coding-standards\nADD_SUBDIRECTORY(code)\n\n# Run tests that verify the functionality of the testing system itself\nADD_SUBDIRECTORY(testing)\n\n# Run tests that exercise the C++ SDK\nADD_SUBDIRECTORY(sdk)\n\n# Run tests that exercise the Python SDK\nADD_SUBDIRECTORY(python)\n\n# Run tests that exercise double-related functionality\nADD_SUBDIRECTORY(double)\n\nADD_SUBDIRECTORY(int32)\n\nADD_SUBDIRECTORY(color)\n\nADD_SUBDIRECTORY(vector3)\n\n# Run tests that exercise matrix-related functionality\nADD_SUBDIRECTORY(matrix)\n\nADD_SUBDIRECTORY(string)\n\n# Run tests that exercise bitmap-related functionality\nADD_SUBDIRECTORY(bitmap)\n\n# Run tests that exercise mesh-related functionality\nADD_SUBDIRECTORY(mesh)\n\n# Run tests that exercise shaders ...\nADD_SUBDIRECTORY(shaders)\n\n# Run tests that exercise parallel computation ...\nADD_SUBDIRECTORY(parallel)\n\n# Run tests that exercise offscreen rendering ...\nADD_SUBDIRECTORY(offscreen)\n\n# Run tests that exercise animation ...\nADD_SUBDIRECTORY(animation)\n\n# Run tests that exercise the standard user interface ...\nADD_SUBDIRECTORY(ngui)\n\n# Run miscellaneous odds-and-ends ...\nADD_SUBDIRECTORY(other)\n\n"
  },
  {
    "path": "tests/animation/AnimationTrack.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\ntime_source = k3d.plugin.create(\"TimeSource\", document)\ninstance = k3d.plugin.create(\"MeshInstance\", document)\ntransform = k3d.plugin.create(\"FrozenMatrix\", document)\ntrack = k3d.plugin.create(\"AnimationTrackDoubleMatrix4\", document)\ninterpolator = k3d.plugin.create(\"InterpolatorDoubleMatrix4Linear\", document)\ntrack.interpolator = interpolator\ntransform.matrix = k3d.translate3(3, 0, 0)\n\ntime = k3d.get_time(document)\n\nk3d.property.connect(document, track.get_property(\"output_value\"), instance.get_property(\"input_matrix\"))\nk3d.property.connect(document, transform.get_property(\"output_matrix\"), track.get_property(\"value_input\"))\nk3d.property.connect(document, time_source.get_property(\"time\"), track.get_property(\"time_input\"))\n\ntime.set_value(0.0)\ntransform.matrix = k3d.translate3(0, 0, 0)\ntrack.keyframe()\ntime.set_value(4.0)\ntransform.matrix = k3d.translate3(2, 0, 0)\ntrack.keyframe()\ntime.set_value(2.0)\nposition = k3d.world_position(instance)\n\nreference = k3d.point3(1, 0, 0)\n\nif position != reference:\n  raise Exception(\"Position differs from expected value, expected: \" + str(reference) + \", result: \" + str(position))\n"
  },
  {
    "path": "tests/animation/CMakeLists.txt",
    "content": "K3D_TEST(animation.AnimationTrack\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/AnimationTrack.py\n\tREQUIRES K3D_BUILD_ANIMATION_MODULE\n\tLABELS animation)\n\n"
  },
  {
    "path": "tests/benchmarking.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nCALC_AVERAGE = -1\n\npolyGridRange = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]\n\ndef benchmark_path():\n    return testing.benchmark_path()\n\n# this class is used to setup an input mesh for mesh benchmarks\nclass benchmarkMesh(object):\n    def __init__(self, counts = (1,1,1)):\n        self.__counts = counts\n        \n    def set_document(self, document):\n        self.__document = document\n        self.initialize_mesh()\n        \n    def initialize_mesh(self):\n        self.__cube = k3d.plugin.create(\"PolyCube\", self.__document)\n        self.__cube.columns = 1;\n        self.__cube.rows = 1;\n        self.__cube.slices = 1;\n        self.__cube.width = 1;\n        self.__cube.height = 1;\n        self.__cube.depth = 1;\n        \n        self.__mesh_array_3D = k3d.plugin.create(\"MeshArray3D\", self.__document)\n        self.__mesh_array_3D.count1 = self.__counts[0]\n        self.__mesh_array_3D.count2 = self.__counts[1]\n        self.__mesh_array_3D.count3 = self.__counts[2]\n    \n        self.__mesh_array_3D.layout = k3d.plugin.create(\"TranslateArray3D\", self.__document)\n    \n        k3d.property.connect(self.__document, self.__cube.get_property(\"output_mesh\"), self.__mesh_array_3D.get_property(\"input_mesh\"))\n    \n    def set_counts(self, counts):\n        # counts is a tuple of values\n        self.__counts = counts\n        \n    def get_mesh(self):\n        return self.__mesh_array_3D\n    \n    def get_size_metric(self):\n        return self.__counts[0]*self.__counts[1]*self.__counts[2]*4\n\n# class to handle profiler output for benchmarking\nclass k3dProfilingProcessor(object):\n    def __init__(self):\n        self.__results = {}\n        self.__results['Total'] = []\n        self.__nodeName = ''\n    \n    def number_of_results(self):\n        try:\n            return len(self.__results['Total'])\n        except:\n            return 0\n    \n    def number_of_columns(self):\n        return len(self.__results)\n        \n    def clear_results(self):\n        self.__init__()\n        \n    def add_profiler_results_for_node(self, nodeName, profilerRecords):\n        self.__nodeName = nodeName\n        for (node, timing) in profilerRecords.items():\n            if node.name == self.__nodeName:\n                total = 0.0\n                for t in timing:\n                    total += timing[t]\n                    if t in self.__results:\n                        self.__results[t] += [timing[t],]\n                    else:\n                        self.__results[t] = [timing[t],]\n                self.__results['Total'] += [total,]\n                break\n    \n    # oputput the results as a table to display on the dashboard\n    def output_as_dart_table(self, description = ''):\n        if description:\n            print '<DartMeasurement name=\"Description\" type=\"text/string\">' + description + '</DartMeasurement>'\n    \n        tmpString = '';\n        headingOrder = []\n        averages = []\n        maximums = []\n    \n        for heading in self.__results:\n            if heading != 'Total':\n                tmpString += heading + ' : '\n                headingOrder += [heading,]\n            averages += [0.0,]\n            maximums += [0.0,]\n            \n        tmpString += 'Total'\n        headingOrder += ['Total',]\n    \n        print '<DartMeasurement name=\"HEADING\" type=\"text/string\">' + tmpString + '</DartMeasurement>'\n        \n        # get the number of self.__results\n        numResults = self.number_of_results()\n        numColumns = self.number_of_columns()\n        \n        for row in range(numResults):\n            tmpString = ''\n            for col_index in range(numColumns):\n                heading = headingOrder[col_index]\n                # update the averages and the maximums\n                averages[col_index] += self.__results[heading][row]\n                if self.__results[heading][row] > maximums[col_index]:\n                    maximums[col_index] = self.__results[heading][row]\n                \n                tmpString += str(self.__results[heading][row])\n                if heading != 'Total':\n                    tmpString += ' : '\n    \n            print '<DartMeasurement name=\"run' + str(row) + '\" type=\"text/string\">' + tmpString + '</DartMeasurement>'\n            \n        # now handle the averages and the maximums\n        tmpString = ''\n        tmpStringMax = ''\n        for col_index in range(numColumns):\n            tmpString += str(averages[col_index]/numResults)\n            tmpStringMax += str(maximums[col_index])\n            if col_index < ( numColumns - 1 ):\n                tmpString += ' : '\n                tmpStringMax += ' : '\n        \n        print '<DartMeasurement name=\"Average\" type=\"text/string\">' + tmpString + '</DartMeasurement>'\n        print '<DartMeasurement name=\"Maximums\" type=\"text/string\">' + tmpStringMax + '</DartMeasurement>'\n    \n    # output the results to a comma-separated file\n    def output_as_CSV_file(self, filename, description = '', appendFile = False):\n        def output_headings(file):\n            tmpString = '';\n            headingOrder = []\n    \n            for heading in self.__results:\n                if heading != 'Total':\n                    tmpString += '\"' + heading + '\",'\n                    headingOrder += [heading,]\n                \n            tmpString += '\"Total\"'\n            headingOrder += ['Total',]\n        \n            file.write(tmpString + '\\n')\n            return headingOrder\n        \n        def output_result_data(file, headingOrder):\n            numResults = self.number_of_results()\n            numColumns = self.number_of_columns()\n            \n            for row in range(numResults):\n                tmpString = ''\n                for col_index in range(numColumns):\n                    heading = headingOrder[col_index]\n                    \n                    tmpString += str(self.__results[heading][row])\n                    if heading != 'Total':\n                        tmpString += ','\n        \n                file.write(tmpString + '\\n')\n        \n        if appendFile:\n            out_file = open(filename, 'a+')\n        else:\n            out_file = open(filename, 'w')\n            \n        try:\n            if description:\n                out_file.write('\"' + self.__nodeName + '\",'  +  description + ',' + str(self.number_of_results()) + '\\n')\n            headingOrder = output_headings(out_file)\n            output_result_data(out_file, headingOrder)\n        finally:\n              out_file.close()\n       \n    def output_file_to_Dart(self, filename):\n         print \"\"\"<DartMeasurementFile name=\"CSV_file\" type=\"text/plain\">\"\"\" + str(filename) + \"\"\"</DartMeasurementFile>\"\"\"\n    \n    def output_and_save(self, nodeName, description, appendToFile, firstInFile):\n        self.output_as_dart_table(nodeName + ' : ' + description)\n        # save to CSV file\n        if (appendToFile or firstInFile):\n            if firstInFile:\n                appendToFile = False\n            CSV_output_file = k3d.filesystem.generic_path(benchmark_path() + '/' + nodeName + '.benchmark.txt')\n        else:\n            CSV_output_file = k3d.filesystem.generic_path(benchmark_path() + '/' + nodeName + description + '.benchmark.txt')\n        \n        self.output_as_CSV_file(str(CSV_output_file), description, appendToFile)\n\ndef total_profiler_time(profilerRecords):\n  total = 0.0\n  for (node, timing) in profilerRecords.items():\n    for t in timing:\n        total += timing[t]\n  return total\n\ndef print_profiler_records(profilerRecords):\n  for (node, timing) in profilerRecords.items():\n    for t in timing:\n        print \"\"\"<DartMeasurement name=\\\"\"\"\" + node.name + \"::\" + t +  \"\"\"\\\" type=\"numeric/float\">\"\"\" + str(timing[t]) + \"\"\"</DartMeasurement>\"\"\"\n        \nclass ResultSet(object):\n    def __init__(self, x, y, label, plot_style):\n        self.x = x\n        self.y = y\n        self.label = label\n        self.plot_style = plot_style\n    \nclass ResultsProcessor(object):\n    def __init__(self, operation = CALC_AVERAGE):\n        self.__operation = operation\n        self.__results = []\n    \n    def add_dataset(self, benchmarkPluginName, ColumnTitle, plot_style = 'o-'):\n        print \"Adding Dataset %s : %s\" % (benchmarkPluginName, ColumnTitle)\n        (x, y) = extract_data(benchmarkPluginName, ColumnTitle, self.__operation)\n        self.__results += [ResultSet(x, y, (benchmarkPluginName, ColumnTitle, self.__operation), plot_style)]\n        \n    def plot_data(self, xlabel=None, ylabel=None):\n        try:\n            import pylab as P\n        except:\n            return 0\n        \n        legend = ()\n        for result in self.__results:\n            P.plot(result.x, result.y, result.plot_style)\n            legend += (\"%s : %s\" % (result.label[0], result.label[1]),)\n        \n        \n        if xlabel:\n            P.xlabel(xlabel)\n        if ylabel:\n            P.ylabel(ylabel)\n        \n        P.legend(legend, loc='upper left')\n        # set the legend fontsize    \n        ltexts = P.gca().get_legend().get_texts()\n        for lt in ltexts:\n            P.setp(lt, fontsize = 10)\n        \n        return 1\n            \n    def plot_speedup(self, xlabel=None, ylabel=None, ref_index = 0):\n        try:\n            import pylab as P\n        except:\n            return 0\n        \n        x = self.__results[0].x \n        \n        y_ref = self.__results[0].y\n        \n        P.plot([x[0], x[-1]], [1,1], 'k--');\n        legend = ('Unity',)\n        \n        for r_index in range(1,len(self.__results)):\n            speedup = []\n            for k in range(len(self.__results[r_index].y)):\n                y = self.__results[r_index].y[k]\n                try:\n                    speedup += [y_ref[k]/y, ]\n                except:\n                    speedup += [0, ]\n                \n            P.plot(x, speedup, self.__results[r_index].plot_style)\n            legend += (\"%s : %s\" % (self.__results[r_index].label[0], self.__results[r_index].label[1]),)\n            \n        \n        if xlabel:\n            P.xlabel(xlabel)\n        \n        P.ylabel('Speedup vs %s:%s' % (self.__results[0].label[0], self.__results[0].label[1]))\n        \n        P.legend(legend, loc='lower right')\n        # set the legend fontsize    \n        ltexts = P.gca().get_legend().get_texts()\n        for lt in ltexts:\n            P.setp(lt, fontsize = 10)\n        \n        return 1\n        \n# run a mesh modifier benchmark for the specified node\ndef mesh_modifier_benchmark(benchmarkPluginName, maxSize = 15, properties = {\"input_matrix\" : k3d.translate3(k3d.vector3(0, 0, 1))}):\n    current_count = [1,1,1]\n    runsPerBenchmark = 10\n    append = True\n    for k in range(maxSize):\n        try:\n            benchmark_mesh = benchmarkMesh(current_count)\n            run_mesh_modifier_benchmark(benchmarkPluginName, benchmark_mesh, runsPerBenchmark, properties, append, k == 0)\n            current_count[k % 3] *= 2\n        except:\n            break\n        \ndef mesh_source_benchmark(benchmarkPluginName, properties = {}):\n    num_runs = 10e10\n    for p in properties.values():\n        if len(p) < num_runs:\n            num_runs = len(p)\n    \n    numberOfRuns = 10   \n    for k in range(num_runs):\n        properties_for_run = {}\n        for (p, val) in properties.items():\n            properties_for_run[p] = val[k]\n            \n        run_mesh_source_benchmark(benchmarkPluginName, numberOfRuns, properties_for_run, True, k == 0)\n    \n\ndef run_mesh_source_benchmark(meshSourceNodeName, numberOfRuns = 1, properties = {}, appendToFile = False, firstInFile=False):\n    document = k3d.new_document()\n        \n    profiler = k3d.plugin.create(\"PipelineProfiler\", document)\n    benchmarkNode = k3d.plugin.create(meshSourceNodeName, document)\n    \n    sizeMetric = 1\n    for (p, val) in properties.items():\n        benchmarkNode.get_property(p).set_value(val)\n        sizeMetric *= val\n   \n    profilingResults = k3dProfilingProcessor()\n    for n in range(numberOfRuns):\n        benchmarkNode.output_mesh\n        profilingResults.add_profiler_results_for_node(meshSourceNodeName, profiler.records)\n    \n    profilingResults.output_and_save(meshSourceNodeName, '%d' % (sizeMetric), appendToFile, firstInFile)\n \n        \ndef convert_dim_string_to_size_measure(dimString):\n    # image where dimension is given as (width)x(height)\n    if 'x' in dimString:\n        dims = dimString.split('x')\n        return int(dims[0])*int(dims[1])\n    \n    # as default try to convert string to int and return\n    # return 0 if it fails\n    try:\n        dims = int(dimString)\n        return dims\n    except:\n        pass\n\n    return 0\n \n \n\"\"\"\n    Read the data from a benchmark file generated py parsing the pipeline profiler output\n    @param - bencmarkPluginName : the name of the plugin that was benchmarked\n    @param - ColumnTitle : the column of interest\n    @param - operation : specify the operation to perform on the data.  If operation >= 0 then a specific run is \n                         selected.\n\"\"\"        \ndef extract_data(benchmarkPluginName, ColumnTitle = \"Total\", operation = CALC_AVERAGE):\n    \"\"\"\n        Open the benchmark file and read the lines\n    \"\"\"\n    def read_benchmark_file(pluginName):\n        benchmarkFilename = benchmark_path() + '/' + benchmarkPluginName + '.benchmark.txt'\n        f = open(benchmarkFilename, 'r')\n        lines = f.readlines()\n        f.close()\n        return (lines, len(lines))\n    \n    def process_header_lines(lines, k):\n        splitLine = lines[k].strip().split(',')\n        dimension = convert_dim_string_to_size_measure(splitLine[1])\n        number_of_runs = int(splitLine[2])\n        column_of_interest_index = -1;\n        splitLine = lines[k+1].strip().split(',')\n        if ('\"' + ColumnTitle + '\"') in splitLine:\n            column_of_interest_index = splitLine.index('\"' + ColumnTitle + '\"')\n            \n        return (k+2, dimension, number_of_runs, column_of_interest_index)\n    \n    def process_data_lines(lines, k, number_of_runs, column_of_interest_index, operation):    \n        \"\"\"\n            Retrive the desired data from the lines\n            @param operation - specify the row of interest or average, max, min\n        \"\"\"\n        if operation > 0:\n            splitLine = lines[k+operation-1].strip().split(',')\n            datum = float(splitLine[column_of_interest_index])\n        elif operation == CALC_AVERAGE:\n            datum = 0\n            for data_row in range(k, k+number_of_runs):\n                splitLine = lines[data_row].strip().split(',')\n                datum += float(splitLine[column_of_interest_index])\n            datum /= number_of_runs\n        else:\n            datum = -1\n        \n        return (k+number_of_runs, datum)\n    \n    try:    \n        (lines, number_of_lines) = read_benchmark_file(benchmarkPluginName)\n    except:\n        print \"Error reading file\"\n        return (0, 0)\n    \n    k = 0;\n    data_list = []\n    dimension_list = []\n    \n    while k < number_of_lines:\n        (k, dimension, number_of_runs, column_of_interest_index) = process_header_lines(lines, k)\n        if k >= number_of_lines:\n            break\n        (k, datum) = process_data_lines(lines, k, number_of_runs, column_of_interest_index, operation)\n        dimension_list += [dimension, ]\n        data_list += [datum, ]\n    \n    return (dimension_list, data_list)\n        \n    \n\n\"\"\"\n    Run a benchmark for the specified mesh modifier\n\"\"\"\ndef run_mesh_modifier_benchmark(meshModifierNodeName, benchmarkMesh, numberOfRuns = 1, properties = {}, appendToFile = False, firstInFile=False):\n    document = k3d.new_document()\n        \n    profiler = k3d.plugin.create(\"PipelineProfiler\", document)\n    \n    benchmarkMesh.set_document(document)\n    \n    inputNode = benchmarkMesh.get_mesh()\n    \n    selection = k3d.select_all()\n    \n\n    benchmarkNode = k3d.plugin.create(meshModifierNodeName, document)\n    for (p, val) in properties.items():\n        benchmarkNode.get_property(p).set_value(val)\n    benchmarkNode.mesh_selection = selection\n        \n    profilingResults = k3dProfilingProcessor()\n    for n in range(numberOfRuns):\n        k3d.property.connect(document, inputNode.get_property(\"output_mesh\"), benchmarkNode.get_property(\"input_mesh\"))\n        benchmarkNode.output_mesh\n        profilingResults.add_profiler_results_for_node(meshModifierNodeName, profiler.records)\n    \n    description = '%d' % (benchmarkMesh.get_size_metric())\n    profilingResults.output_and_save(meshModifierNodeName, description, appendToFile, firstInFile)\n\n\"\"\"\n    selected is a list of tuples (PluginName, ColumnName)\n\"\"\"\ndef compare_and_output_image(filename, selected_benchmarks, plotLabels = (None, None), plotSpeedup = False):\n    \n    try:\n        import pylab as P\n    except:\n        print \"Pylab not found\"\n        return 0;\n    \n    import os\n    \n    processor = ResultsProcessor()\n    \n    for selected in selected_benchmarks:\n        processor.add_dataset(selected[0], selected[1])\n    \n    if plotSpeedup:\n        if processor.plot_speedup(plotLabels[0], plotLabels[1]) != 0:\n            speedup_filename =  benchmark_path() + '/' + filename + '.speedup.png';\n            try:\n                os.delete(speedup_filename)\n            except:\n                pass\n            \n            P.savefig(speedup_filename, format='png')\n            \n            P.close()\n        \n            return speedup_filename\n        \n    if processor.plot_data(plotLabels[0], plotLabels[1]) != 0:\n        image_filename = benchmark_path() + '/' + filename + '.png';\n        try:\n            os.delete(image_filename)\n        except:\n            pass\n        \n        P.savefig(image_filename, format='png')\n        \n        P.close()\n        \n        return image_filename\n    \n    return None\n    \n    \ndef generate_component_image(description, node_name, columns = [\"Total\"] ):\n    selected = []\n    for col in columns:\n        selected += [(node_name, col),]\n        \n    filename = compare_and_output_image(description, selected)\n    \n    if filename != 0:\n        print '<DartMeasurementFile name=\"' + description + '\" type=\"image/png\">' + str(filename) + '</DartMeasurementFile>'\n    else:\n        print '<DartMeasurement name=\"' + description + '\" type=\"text/string\">  Error in comparison </DartMeasurementFile>'\n\ndef generate_comparison_image(description, run_names, column = \"Total\", plotLabels = (None, None), calculate_speedup = False):\n    selected = []\n    for run in run_names:\n        selected += [(run, column),]\n    \n    filename = compare_and_output_image(description, selected, plotLabels)\n    \n    \n    if filename:\n        print '<DartMeasurementFile name=\"' + description + '\" type=\"image/png\">' + str(filename) + '</DartMeasurementFile>'\n    else:\n        print '<DartMeasurement name=\"' + description + '\" type=\"text/string\">  Error in comparison </DartMeasurementFile>'\n    \n    if calculate_speedup:\n        filename = compare_and_output_image(description, selected, plotLabels, plotSpeedup = True)\n        if filename:\n            print '<DartMeasurementFile name=\"' + description + 'Speedup\" type=\"image/png\">' + str(filename) + '</DartMeasurementFile>'\n        else:\n            print '<DartMeasurement name=\"' + description + 'Speedup\" type=\"text/string\">  Error in comparison </DartMeasurementFile>'\n"
  },
  {
    "path": "tests/bitmap/CMakeLists.txt",
    "content": "K3D_TEST(bitmap.source.JPEGBitmapReader\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.source.JPEGBitmapReader.py\n\tREQUIRES K3D_BUILD_JPEG_IO_MODULE \n\tLABELS bitmap source reader JPEGBitmapReader)\n\nK3D_TEST(bitmap.source.PNGBitmapReader \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.source.PNGBitmapReader.py\n\tREQUIRES K3D_BUILD_PNG_IO_MODULE \n\tLABELS bitmap source reader PNGBitmapReader)\n\nK3D_TEST(bitmap.source.TIFFBitmapReader \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.source.TIFFBitmapReader.py\n\tREQUIRES K3D_BUILD_TIFF_IO_MODULE \n\tLABELS bitmap source reader TIFFBitmapReader)\n\nK3D_TEST(bitmap.source.BitmapReader.bmp \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.source.BitmapReader.bmp.py\n\tREQUIRES K3D_BUILD_IMAGEMAGICK_IO_MODULE K3D_BUILD_BITMAP_MODULE \n\tLABELS bitmap source reader BitmapReader)\n\nK3D_TEST(bitmap.source.BitmapReader.jpeg \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.source.BitmapReader.jpeg.py\n\tREQUIRES K3D_BUILD_JPEG_IO_MODULE K3D_BUILD_BITMAP_MODULE \n\tLABELS bitmap source reader BitmapReader)\n\nK3D_TEST(bitmap.source.BitmapReader.png \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.source.BitmapReader.png.py\n\tREQUIRES K3D_BUILD_PNG_IO_MODULE K3D_BUILD_BITMAP_MODULE \n\tLABELS bitmap source reader BitmapReader)\n\nK3D_TEST(bitmap.source.BitmapReader.sun \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.source.BitmapReader.sun.py\n\tREQUIRES K3D_BUILD_IMAGEMAGICK_IO_MODULE K3D_BUILD_BITMAP_MODULE \n\tLABELS bitmap source reader BitmapReader)\n\nK3D_TEST(bitmap.source.BitmapReader.tiff \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.source.BitmapReader.tiff.py\n\tREQUIRES K3D_BUILD_TIFF_IO_MODULE K3D_BUILD_BITMAP_MODULE \n\tLABELS bitmap source reader BitmapReader)\n\nK3D_TEST(bitmap.source.BitmapChecker \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.source.BitmapChecker.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE \n\tLABELS bitmap source BitmapChecker)\n\nK3D_TEST(bitmap.source.BitmapSolid \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.source.BitmapSolid.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE \n\tLABELS bitmap source BitmapSolid)\n\nK3D_TEST(bitmap.source.BitmapSourceScript \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.source.BitmapSourceScript.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE \n\tLABELS bitmap source BitmapSourceScript)\n\n\n\n\n\nK3D_TEST(bitmap.modifier.BitmapAdd \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.BitmapAdd.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE\n\tLABELS bitmap modifier BitmapAdd)\n\nK3D_TEST(bitmap.modifier.BitmapMultiply \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.BitmapMultiply.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE\n\tLABELS bitmap modifier BitmapMultiply)\n\nK3D_TEST(bitmap.modifier.BitmapSubtract \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.BitmapSubtract.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE\n\tLABELS bitmap modifier BitmapSubtract)\n\nK3D_TEST(bitmap.modifier.BitmapColorMonochrome \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.BitmapColorMonochrome.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE\n\tLABELS bitmap modifier BitmapColorMonochrome)\n\nK3D_TEST(bitmap.modifier.BitmapGamma \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.BitmapGamma.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE\n\tLABELS bitmap modifier BitmapGamma)\n\nK3D_TEST(bitmap.modifier.BitmapInvert \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.BitmapInvert.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE\n\tLABELS bitmap modifier BitmapInvert)\n\nK3D_TEST(bitmap.modifier.BitmapMatteColorDiff \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.BitmapMatteColorDiff.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE\n\tLABELS bitmap modifier BitmapMatteColorDiff)\n\nK3D_TEST(bitmap.modifier.BitmapMatteInvert \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.BitmapMatteInvert.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE\n\tLABELS bitmap modifier BitmapMatteInvert)\n\nK3D_TEST(bitmap.modifier.BitmapThreshold \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.BitmapThreshold.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE\n\tLABELS bitmap modifier BitmapThreshold)\n\n\n\n\n\n\n\nK3D_TEST(bitmap.modifier.CUDABitmapAdd \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapAdd.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapMultiply \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapMultiply.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapSubtract \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapSubtract.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapColorMonochrome \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapColorMonochrome.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapGamma \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapGamma.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapInvert \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapInvert.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapMatteColorDiff \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapMatteColorDiff.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapMatteInvert \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapMatteInvert.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapThreshold \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapThreshold.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapAdd.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapAdd.benchmark.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapMultiply.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapMultiply.benchmark.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapSubtract.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapSubtract.benchmark.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapColorMonochrome.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapColorMonochrome.benchmark.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapGamma.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapGamma.benchmark.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapInvert.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapInvert.benchmark.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapMatteColorDiff.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapMatteColorDiff.benchmark.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapMatteInvert.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapInvert.benchmark.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.CUDABitmapThreshold.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.CUDABitmapThreshold.benchmark.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap modifier cuda)\n\nK3D_TEST(bitmap.modifier.BenchmarkComparison\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/bitmap.modifier.BenchmarkComparison.py\n\tREQUIRES K3D_BUILD_BITMAP_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS bitmap cuda)\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.BenchmarkComparison.py",
    "content": "#python\n\nimport benchmarking\n# a test to compare the benchmark results for a number of bitmap plugins\n\ncompare_list = [\"BitmapAdd\", \n                \"BitmapSubtract\", \n                \"BitmapMultiply\", \n                \"BitmapColorMonochrome\", \n                \"BitmapGamma\", \n                \"BitmapInvert\", \n                \"BitmapMatteColorDiff\", \n                \"BitmapMatteInvert\",\n                \"BitmapThreshold\"]\n\nfor run in compare_list:\n    try:\n        benchmarking.generate_comparison_image(run, (run, \"CUDA\"+run), plotLabels=('Number of Pixels', 'Time [s]'), calculate_speedup = True)\n    except:\n        print \"Error with: \" + run\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.BitmapAdd.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_modifier_test(\"BitmapReader\", \"BitmapAdd\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/bitmaps/\" + \"test_rgb_8.png\")\nsetup.modifier.value = 0.5 \n\ntesting.require_similar_bitmap(setup.document, setup.modifier.get_property(\"output_bitmap\"), \"BitmapAdd\", 0)\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.BitmapColorMonochrome.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_modifier_test(\"BitmapReader\", \"BitmapColorMonochrome\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/bitmaps/\" + \"test_rgb_8.png\")\n\ntesting.require_similar_bitmap(setup.document, setup.modifier.get_property(\"output_bitmap\"), \"BitmapColorMonochrome\", 0)\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.BitmapGamma.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_modifier_test(\"BitmapReader\", \"BitmapGamma\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/bitmaps/\" + \"test_rgb_8.png\")\nsetup.modifier.gamma = 2.2\n\ntesting.require_similar_bitmap(setup.document, setup.modifier.get_property(\"output_bitmap\"), \"BitmapGamma\", 0)\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.BitmapInvert.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_modifier_test(\"BitmapReader\", \"BitmapInvert\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/bitmaps/\" + \"test_rgb_8.png\")\n\ntesting.require_similar_bitmap(setup.document, setup.modifier.get_property(\"output_bitmap\"), \"BitmapInvert\", 0)\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.BitmapMatteColorDiff.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_modifier_test(\"BitmapReader\", \"BitmapMatteColorDiff\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/bitmaps/\" + \"test_rgb_8_alpha.png\")\nsetup.modifier.threshold = 0.95\n\ntesting.require_similar_bitmap(setup.document, setup.modifier.get_property(\"output_bitmap\"), \"BitmapMatteColorDiff\", 0)\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.BitmapMatteInvert.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_modifier_test(\"BitmapReader\", \"BitmapMatteInvert\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/bitmaps/\" + \"test_rgb_8_alpha.png\")\n\ntesting.require_similar_bitmap(setup.document, setup.modifier.get_property(\"output_bitmap\"), \"BitmapMatteInvert\", 0)\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.BitmapMultiply.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_modifier_test(\"BitmapReader\", \"BitmapMultiply\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/bitmaps/\" + \"test_rgb_8.png\")\nsetup.modifier.value = 0.7\n\ntesting.require_similar_bitmap(setup.document, setup.modifier.get_property(\"output_bitmap\"), \"BitmapMultiply\", 0)\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.BitmapSubtract.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_modifier_test(\"BitmapReader\", \"BitmapSubtract\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/bitmaps/\" + \"test_rgb_8.png\")\nsetup.modifier.value = 0.5\n\ntesting.require_similar_bitmap(setup.document, setup.modifier.get_property(\"output_bitmap\"), \"BitmapSubtract\", 0.001)\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.BitmapThreshold.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_modifier_test(\"BitmapReader\", \"BitmapThreshold\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/bitmaps/\" + \"test_rgb_8_alpha.png\")\nsetup.modifier.red_threshold = 0.5 \nsetup.modifier.blue_threshold = 0.5 \nsetup.modifier.alpha_threshold = 0.5 \n\ntesting.require_similar_bitmap(setup.document, setup.modifier.get_property(\"output_bitmap\"), \"BitmapThreshold\", 0)\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapAdd.benchmark.py",
    "content": "#python\n\nimport testing\n\ntesting.bitmap_modifier_benchmark(\"CUDABitmapAdd\")\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapAdd.py",
    "content": "#python\nimport testing\n\ntesting.bitmap_compare_plugin_outputs(\"BitmapAdd\", \"CUDABitmapAdd\", {\"value\": 0.0 })\ntesting.bitmap_compare_plugin_outputs(\"BitmapAdd\", \"CUDABitmapAdd\", {\"value\": 30.5 })"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapColorMonochrome.benchmark.py",
    "content": "#python\n\nimport testing\n\ntesting.bitmap_modifier_benchmark(\"CUDABitmapColorMonochrome\")\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapColorMonochrome.py",
    "content": "#python\nimport testing\n\ntesting.bitmap_compare_plugin_outputs(\"BitmapColorMonochrome\", \"CUDABitmapColorMonochrome\", {\"red_weight\": 1.0, \"green_weight\":1.0, \"blue_weight\":1.0 })\ntesting.bitmap_compare_plugin_outputs(\"BitmapColorMonochrome\", \"CUDABitmapColorMonochrome\", {\"red_weight\": 0.0, \"green_weight\":1.0, \"blue_weight\":0.5 })"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapGamma.benchmark.py",
    "content": "#python\n\nimport testing\n\ntesting.bitmap_modifier_benchmark(\"CUDABitmapGamma\")\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapGamma.py",
    "content": "#python\nimport testing\n\ntesting.bitmap_compare_plugin_outputs(\"BitmapGamma\", \"CUDABitmapGamma\", {\"value\": 0.0 })\ntesting.bitmap_compare_plugin_outputs(\"BitmapGamma\", \"CUDABitmapGamma\", {\"value\": 30.5 })"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapInvert.benchmark.py",
    "content": "#python\n\nimport testing\n\ntesting.bitmap_modifier_benchmark(\"CUDABitmapInvert\")\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapInvert.py",
    "content": "#python\nimport testing\n\ntesting.bitmap_compare_plugin_outputs(\"BitmapInvert\", \"CUDABitmapInvert\")"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapMatteColorDiff.benchmark.py",
    "content": "#python\n\nimport testing\n\ntesting.bitmap_modifier_benchmark(\"CUDABitmapMatteColorDiff\")\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapMatteColorDiff.py",
    "content": "#python\nimport testing\n\ntesting.bitmap_compare_plugin_outputs(\"BitmapMatteColorDiff\", \"CUDABitmapMatteColorDiff\", {\"value\": 0.0 })\ntesting.bitmap_compare_plugin_outputs(\"BitmapMatteColorDiff\", \"CUDABitmapMatteColorDiff\", {\"value\": 30.5 })"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapMatteInvert.benchmark.py",
    "content": "#python\n\nimport testing\n\ntesting.bitmap_modifier_benchmark(\"CUDABitmapMatteInvert\")\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapMatteInvert.py",
    "content": "#python\nimport testing\n\ntesting.bitmap_compare_plugin_outputs(\"BitmapMatteInvert\", \"CUDABitmapMatteInvert\")"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapMultiply.benchmark.py",
    "content": "#python\n\nimport testing\n\ntesting.bitmap_modifier_benchmark(\"CUDABitmapMultiply\")\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapMultiply.py",
    "content": "#python\nimport testing\n\ntesting.bitmap_compare_plugin_outputs(\"BitmapMultiply\", \"CUDABitmapMultiply\", {\"value\": 1.0 })\ntesting.bitmap_compare_plugin_outputs(\"BitmapMultiply\", \"CUDABitmapMultiply\", {\"value\": 0.25 })\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapSubtract.benchmark.py",
    "content": "#python\n\nimport testing\n\ntesting.bitmap_modifier_benchmark(\"CUDABitmapSubtract\")\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapSubtract.py",
    "content": "#python\nimport testing\n\ntesting.bitmap_compare_plugin_outputs(\"BitmapSubtract\", \"CUDABitmapSubtract\", {\"value\": 0.0 })\ntesting.bitmap_compare_plugin_outputs(\"BitmapSubtract\", \"CUDABitmapSubtract\", {\"value\": 30.5 })\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapThreshold.benchmark.py",
    "content": "#python\n\nimport testing\n\ntesting.bitmap_modifier_benchmark(\"CUDABitmapThreshold\")\n"
  },
  {
    "path": "tests/bitmap/bitmap.modifier.CUDABitmapThreshold.py",
    "content": "#python\nimport testing\n\ntesting.bitmap_compare_plugin_outputs(\"BitmapThreshold\", \"CUDABitmapThreshold\", {\"red_threshold\": 0.0, \"green_threshold\": 0.0, \"blue_threshold\": 0.0, \"alpha_threshold\": 0.0 })\ntesting.bitmap_compare_plugin_outputs(\"BitmapThreshold\", \"CUDABitmapThreshold\", {\"red_threshold\": 0.5, \"green_threshold\": 0.5, \"blue_threshold\": 0.5, \"alpha_threshold\": 2.0 })"
  },
  {
    "path": "tests/bitmap/bitmap.source.BitmapChecker.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_source_test(\"BitmapChecker\")\nsetup.source.color1 = k3d.color(1, 1, 0)\nsetup.source.color2 = k3d.color(0, 0, 1)\n\ntesting.require_similar_bitmap(setup.document, setup.source.get_property(\"output_bitmap\"), \"BitmapChecker\", 0)\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.source.BitmapReader.bmp.py",
    "content": "#python\n\nimport testing\nsetup = testing.setup_bitmap_reader_test(\"BitmapReader\", \"test_rgb_8.bmp\")\ntesting.require_similar_bitmap(setup.document, setup.source.get_property(\"output_bitmap\"), \"BitmapReader.bmp\", 0)\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.source.BitmapReader.jpeg.py",
    "content": "#python\n\nimport testing\nsetup = testing.setup_bitmap_reader_test(\"BitmapReader\", \"test_rgb_8.jpg\")\ntesting.require_similar_bitmap(setup.document, setup.source.get_property(\"output_bitmap\"), \"BitmapReader.jpeg\", 0.09)\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.source.BitmapReader.png.py",
    "content": "#python\n\nimport testing\nsetup = testing.setup_bitmap_reader_test(\"BitmapReader\", \"test_rgb_8.png\")\ntesting.require_similar_bitmap(setup.document, setup.source.get_property(\"output_bitmap\"), \"BitmapReader.png\", 0)\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.source.BitmapReader.sun.py",
    "content": "#python\n\nimport testing\nsetup = testing.setup_bitmap_reader_test(\"BitmapReader\", \"test_rgb_8.sun\")\ntesting.require_similar_bitmap(setup.document, setup.source.get_property(\"output_bitmap\"), \"BitmapReader.sun\", 0)\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.source.BitmapReader.tiff.py",
    "content": "#python\n\nimport testing\nsetup = testing.setup_bitmap_reader_test(\"BitmapReader\", \"test_rgb_8.tif\")\ntesting.require_similar_bitmap(setup.document, setup.source.get_property(\"output_bitmap\"), \"BitmapReader.tiff\", 0)\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.source.BitmapSolid.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_source_test(\"BitmapSolid\")\nsetup.source.color = k3d.color(1, 1, 0)\n\ntesting.require_similar_bitmap(setup.document, setup.source.get_property(\"output_bitmap\"), \"BitmapSolid\", 0)\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.source.BitmapSourceScript.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_bitmap_source_test(\"BitmapSourceScript\")\ntesting.require_similar_bitmap(setup.document, setup.source.get_property(\"output_bitmap\"), \"BitmapSourceScript\", 0)\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.source.JPEGBitmapReader.py",
    "content": "#python\n\nimport testing\nsetup = testing.setup_bitmap_reader_test(\"JPEGBitmapReader\", \"test_rgb_8.jpg\")\ntesting.require_similar_bitmap(setup.document, setup.source.get_property(\"output_bitmap\"), \"JPEGBitmapReader\", 0.09)\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.source.PNGBitmapReader.py",
    "content": "#python\n\nimport testing\nsetup = testing.setup_bitmap_reader_test(\"PNGBitmapReader\", \"test_rgb_8.png\")\ntesting.require_bitmap_size(setup.source.output_bitmap, 200, 150)\n\n"
  },
  {
    "path": "tests/bitmap/bitmap.source.TIFFBitmapReader.py",
    "content": "#python\n\nimport testing\nsetup = testing.setup_bitmap_reader_test(\"TIFFBitmapReader\", \"test_rgb_8.tif\")\ntesting.require_similar_bitmap(setup.document, setup.source.get_property(\"output_bitmap\"), \"TIFFBitmapReader\", 0)\n\n"
  },
  {
    "path": "tests/code/CMakeLists.txt",
    "content": "K3D_TEST(code.const_cast CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/const_cast.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code)\nK3D_TEST(code.debug_logging CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/debug_logging.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code)\nK3D_TEST(code.exit CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/exit.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code)\nK3D_TEST(code.filename_case CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/filename_case.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code filename)\nK3D_TEST(code.filename_length CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/filename_length.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code filename)\nK3D_TEST(code.header_guard CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/header_guard.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code)\nK3D_TEST(code.legacy CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/legacy.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code)\nK3D_TEST(code.line_endings CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/line_endings.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code)\nK3D_TEST(code.pretty_function CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/pretty_function.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code)\nK3D_TEST(code.printf CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/printf.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code)\nK3D_TEST(code.quoted_includes CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/quoted_includes.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code)\nK3D_TEST(code.typed_array_uint_t CMAKE_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/typed_array_uint_t.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} LABELS code)\n\n"
  },
  {
    "path": "tests/code/const_cast.cmake",
    "content": "# Test to ensure that const_cast isn't abused\n\nSET(ERROR_COUNT 0)\nSET(SKIP_FILES\n\t\"^[.]hg/.*$\"\n\t\"[.]yaml$\"\n\t\"^application/k3d_main.cpp$\"\n\t\"^k3dsdk/document.cpp$\"\n\t\"^k3dsdk/ftgl/src/FTVectoriser.cpp$\"\n\t\"^k3dsdk/gil/boost/gil/extension/dynamic_image/variant.hpp$\"\n\t\"^k3dsdk/socket.cpp$\"\n\t\"^k3dsdk/system.cpp$\"\n\t\"^k3dsdk/triangulator.cpp$\"\n\t\"^modules/cuda/cuda_device_polyhedra.cpp$\"\n\t\"^modules/development/glsl_painter.cpp$\"\n\t\"^modules/development/tweak_points.cpp$\"\n\t\"^modules/gnome/uri_handler.cpp$\"\n\t\"^modules/lsystem/l_parser.cpp$\"\n\t\"^modules/ngui/user_interface.cpp$\"\n\t\"^modules/ngui_material_manager_panel/GroupContentPanel.cpp$\"\n\t\"^modules/ngui_material_manager_panel/MaterialContentPanel.cpp$\"\n\t\"^modules/ngui_material_manager_panel/MaterialGroup.cpp$\"\n\t\"^modules/ngui_material_manager_panel/panel.cpp$\"\n\t\"^modules/plot/least_squares_plot.cpp$\"\n\t\"^modules/plot/surface_plot.cpp$\"\n\t\"^modules/polyhedron_sources/poly_grid.cpp$\"\n\t\"^modules/python/engine.cpp$\"\n\t\"^modules/pyui/user_interface.cpp$\"\n\t\"^modules/qtui/user_interface.cpp$\"\n\t\"^modules/renderman_painters/scripted_painter.cpp$\"\n\t\"^renderframe/main.cpp$\"\n\t\"^tests/code/CMakeLists.txt$\"\n\t\"^tests/code/const_cast.cmake$\"\n\t)\n\nFILE(GLOB_RECURSE SOURCE_FILES \"*\")\nLIST(SORT SOURCE_FILES)\n\nFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_SOURCE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\t\tFILE(READ ${SOURCE_FILE} SOURCE)\n\t\tIF(SOURCE MATCHES \"const_cast\")\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE}\")\n\t\tENDIF()\n\tENDIF()\nENDFOREACH(SOURCE_FILE)\n\nIF(ERROR_COUNT)\n\tMESSAGE(SEND_ERROR \"Found ${ERROR_COUNT} files using const_cast, which should almost never be necessary.  Contact the mailing list to discuss exceptions.\")\nENDIF()\n"
  },
  {
    "path": "tests/code/debug_logging.cmake",
    "content": "# Test for debug-abuse in committed code\n\nSET(ERROR_COUNT 0)\nSET(SKIP_FILES\n\t\"^[.]hg/.*$\"\n\t\"^docs/sample_module/module.cpp$\"\n\t\"^k3dsdk/log.cpp$\"\n\t\"^modules/advanced_opengl_painters/attic/.*$\"\n\t\"^modules/cuda/.*$\"\n\t\"^modules/development/.*$\"\n\t\"^modules/ngui/user_interface.cpp$\"\n\t\"^modules/qtui_opengl/window.cpp$\"\n\t\"^modules/qtui/user_interface.cpp$\"\n\t)\n\nFILE(GLOB_RECURSE SOURCE_FILES \"*\")\nLIST(SORT SOURCE_FILES)\n\nFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_SOURCE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\t\tFILE(READ ${SOURCE_FILE} SOURCE)\n\t\tIF(SOURCE MATCHES \"log[(][ \\t]*[)][ \\t]*<<[ \\t]*debug\")\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE} uses debug logging.\")\n\t\tENDIF()\n\tENDIF()\nENDFOREACH(SOURCE_FILE)\n\nIF(ERROR_COUNT)\n\tMESSAGE(SEND_ERROR \"Found ${ERROR_COUNT} files using debug logging, which is reserved for development ... either convert debug logging statements to other log levels (such as info), or remove them altogether.\")\t\nENDIF()\n\n"
  },
  {
    "path": "tests/code/exit.cmake",
    "content": "# Test to ensure that code doesn't call exit()\n\nSET(ERROR_COUNT 0)\nSET(SKIP_FILES\n\t\"^[.]hg/.*$\"\n\t\"[.]yaml$\"\n\t\"^application/k3d_main.cpp$\"\n\t\"^docs/guide\"\n\t\"^k3dsdk/application_detail.cpp$\"\n\t\"^k3dsdk/application_detail.h$\"\n\t\"^k3dsdk/ftgl/ChangeLog$\"\n\t\"^k3dsdk/ftgl/Makefile.in$\"\n\t\"^k3dsdk/iapplication.h$\"\n\t\"^k3dsdk/ngui/application_state.cpp$\"\n\t\"^k3dsdk/python/object_model_python.cpp$\"\n\t\"^k3dsdk/qtui/application.cpp$\"\n\t\"^man/k3d.1.in$\"\n\t\"^modules/inotify/inotify-cxx.h$\"\n\t\"^modules/ngui_python_shell/dialog.cpp$\"\n\t\"^modules/obj_io/obj_specification.txt$\"\n\t\"^modules/qslim/MxStdModel.cpp$\"\n\t\"^modules/qtui/main_window.cpp$\"\n\t\"^modules/qtui_text_editor/window.cpp$\"\n\t\"^modules/qtui/user_interface.cpp$\"\n\t\"^renderframe/main.cpp$\"\n\t\"^renderjob/main.cpp$\"\n\t\"^resource-compiler/main.cpp$\"\n\t\"^share/lsystem/fractint2.ls$\"\n\t\"^share/scripts/shell/batch_render.py$\"\n\t\"^share/scripts/shell/simple_rpc.py$\"\n\t\"^sl2xml/main.cpp$\"\n\t\"^tests/CMakeLists.txt$\"\n\t\"^tests/code/CMakeLists.txt$\"\n\t\"^tests/code/exit.cmake$\"\n\t\"^tests/other/document.stress.read_all_properties.py$\"\n\t\"^tests/python/module.py$\"\n\t)\n\nFILE(GLOB_RECURSE SOURCE_FILES \"*\")\nLIST(SORT SOURCE_FILES)\n\nFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_SOURCE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\t\tFILE(READ ${SOURCE_FILE} SOURCE)\n\t\tIF(SOURCE MATCHES \"exit\")\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE}\")\n\t\tENDIF()\n\tENDIF()\nENDFOREACH(SOURCE_FILE)\n\nIF(ERROR_COUNT)\n\tMESSAGE(SEND_ERROR \"Found ${ERROR_COUNT} files calling exit(), which should never happen.  Contact the mailing list for guidance.\")\t\nENDIF()\n\n"
  },
  {
    "path": "tests/code/filename_case.cmake",
    "content": "# Ensure that filenames are all lower-case (excepting third-party sources)\n\nSET(ERROR_COUNT 0)\nSET(SKIP_FILES\n\t\"^application/Info.plist.in$\"\n\t\"^AUTHORS$\"\n\t\"^.*CMakeLists.txt$\"\n\t\"^cmake/modules/K3D.*$\"\n\t\"^COPYING$\"\n\t\"^CTestConfig.cmake$\"\n\t\"^CTestCustom.cmake.in$\"\n\t\"^distribution/osx/bundle/Info.plist.in$\"\n\t\"^docs/doxygen/Doxyfile.in$\"\n\t\"[.]DS_Store$\"\n\t\"^INSTALL$\"\n\t\"^k3dsdk/ftgl/.*$\"\n\t\"^k3dsdk/Half/.*$\"\n\t\"^k3dsdk/sgi_tesselator/README$\"\n\t\"^modules/cloth/d_Vec3f.h$\"\n\t\"^modules/cloth/d_Vecf.h$\"\n\t\"^modules/cuda/FindCUDA.cmake$\"\n\t\"^modules/ngui_material_manager_panel/.*.cpp$\"\n\t\"^modules/ngui_material_manager_panel/.*.h$\"\n\t\"^modules/pdiff/CompareArgs.*$\"\n\t\"^modules/pdiff/LPyramid.*$\"\n\t\"^modules/pdiff/Metric.*$\"\n\t\"^modules/pdiff/README.txt$\"\n\t\"^modules/pdiff/RGBAImage.*$\"\n\t\"^modules/qslim/Mx.*$\"\n\t\"^po/POTFILES.in$\"\n\t\"^po/POTFILES.skip$\"\n\t\"^README$\"\n\t\"^share/fonts/.*[.]ttf$\"\n\t\"^share/ngui/rasterized/.*[.]png$\"\n\t\"^share/ngui/scalable/.*[.]svg$\"\n\t\"^share/qtui/icons/.*[.]svg$\"\n\t\"^share/scripts/.*$\"\n\t\"^.*[.]svn/.*$\"\n\t\"^tests/.*$\"\n\t)\n\nFILE(GLOB_RECURSE SOURCE_FILES *)\nLIST(SORT SOURCE_FILES)\n\nFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_SOURCE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\t\tSTRING(TOLOWER \"${RELATIVE_SOURCE_FILE}\" LOWER_CASE_SOURCE_FILE)\n\n\t\tIF(NOT LOWER_CASE_SOURCE_FILE STREQUAL RELATIVE_SOURCE_FILE)\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE} must be all-lower-case\")\n\t\tENDIF()\n\tENDIF()\n\nENDFOREACH(SOURCE_FILE)\n\nIF(ERROR_COUNT)\n\tMESSAGE(SEND_ERROR \"Found ${ERROR_COUNT} invalid filenames.\")\t\nENDIF()\n\n"
  },
  {
    "path": "tests/code/filename_length.cmake",
    "content": "# Test to ensure that none of our filenames exceed 90 characters in length (causes portability issues with tar)\n\nSET(ERROR_COUNT 0)\nSET(MAX_LENGTH 90)\nSET(SKIP_FILES\n\t\"^[.]hg/.*$\"\n  \"^.*[.]svn/.*$\"\n\t)\n\nFILE(GLOB_RECURSE SOURCE_FILES *)\nLIST(SORT SOURCE_FILES)\n\nFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_SOURCE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\t\tSTRING(LENGTH ${RELATIVE_SOURCE_FILE} FILENAME_LENGTH)\n\n\t\tIF(FILENAME_LENGTH GREATER ${MAX_LENGTH})\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${RELATIVE_SOURCE_FILE} too long [${FILENAME_LENGTH} chars]\")\n\t\tENDIF()\n\tENDIF()\nENDFOREACH()\n\nIF(ERROR_COUNT)\n\tMESSAGE(SEND_ERROR \"Found ${ERROR_COUNT} filenames longer than ${MAX_LENGTH} characters, which can cause portability problems with tar.\")\nENDIF(ERROR_COUNT)\n\n"
  },
  {
    "path": "tests/code/header_guard.cmake",
    "content": "# Ensure that header-files have unique preprocessor guards\n\nSET(ERROR_COUNT 0)\nSET(SKIP_FILES\n\t\"^k3dsdk/Half/.*$\"\n\t\"^k3dsdk/expression/fparser.h$\"\n\t\"^k3dsdk/expression/fpconfig.h$\"\n\t\"^k3dsdk/expression/fptypes.h$\"\n\t\"^k3dsdk/ftgl/.*$\"\n\t\"^k3dsdk/glew/.*$\"\n\t\"^k3dsdk/sgi_tesselator/.*$\"\n\t\"^modules/pdiff/CompareArgs.h$\"\n\t\"^modules/pdiff/LPyramid.h$\"\n\t\"^modules/pdiff/Metric.h$\"\n\t\"^modules/pdiff/RGBAImage.h$\"\n\t\"^modules/qslim/Mx.*$\"\n\t\"^modules/solar/solpos/solpos.h$\"\n\t\"^share/.*$\"\n\t)\n\nFILE(GLOB_RECURSE SOURCE_FILES *.h)\nLIST(SORT SOURCE_FILES)\n\nFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_SOURCE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\t\tSTRING(TOUPPER \"${RELATIVE_SOURCE_FILE}\" GUARD_SYMBOL)\n\t\tSTRING(REPLACE \"/\" \"_\" GUARD_SYMBOL \"${GUARD_SYMBOL}\")\n\t\tSTRING(REPLACE \".\" \"_\" GUARD_SYMBOL \"${GUARD_SYMBOL}\")\n\t\tSTRING(REPLACE \"-\" \"_\" GUARD_SYMBOL \"${GUARD_SYMBOL}\")\n\n\t\tSET(OPEN_GUARD \"#ifndef ${GUARD_SYMBOL}\")\n\t\tSET(DEFINE_GUARD \"#define ${GUARD_SYMBOL}\")\n\t\tSET(CLOSE_GUARD \"#endif // !${GUARD_SYMBOL}\")\n\n\t\tFILE(READ ${SOURCE_FILE} SOURCE)\n\n\t\tIF(NOT SOURCE MATCHES \"${OPEN_GUARD}\")\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE} missing ${OPEN_GUARD}\")\n\t\tENDIF()\n\n\t\tIF(NOT SOURCE MATCHES \"${DEFINE_GUARD}\")\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE} missing ${DEFINE_GUARD}\")\n\t\tENDIF()\n\n\t\tIF(NOT SOURCE MATCHES \"${CLOSE_GUARD}\")\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE} missing ${CLOSE_GUARD}\")\n\t\tENDIF()\n\tENDIF()\n\nENDFOREACH(SOURCE_FILE)\n\nIF(ERROR_COUNT)\n\tMESSAGE(SEND_ERROR \"Found ${ERROR_COUNT} problems with header file guards\")\t\nENDIF()\n\n"
  },
  {
    "path": "tests/code/legacy.cmake",
    "content": "# Test to ensure that legacy data structures aren't used in new code\n\nSET(ERROR_COUNT 0)\nSET(SKIP_FILES\n\t\"^[.]hg/.*$\"\n\t\"^k3dsdk/iselectable.h$\"\n\t\"^k3dsdk/ngui/document_state.cpp$\"\n\t\"^k3dsdk/selectable.h$\"\n\t\"^k3dsdk/serialization_xml.cpp$\"\n\t\"^modules/polyhedron/bevel_faces.cpp$\"\n\t\"^modules/polyhedron/dissolve_components.cpp$\"\n\t\"^modules/polyhedron/fillet_edges.cpp$\"\n\t\"^tests/code/legacy.cmake$\"\n\t)\n\nFILE(GLOB_RECURSE SOURCE_FILES \"*\")\nLIST(SORT SOURCE_FILES)\n\nFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_SOURCE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\t\tFILE(READ ${SOURCE_FILE} SOURCE)\n\t\tIF(SOURCE MATCHES \"legacy::\")\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE}\")\n\t\tENDIF()\n\tENDIF()\nENDFOREACH(SOURCE_FILE)\n\nIF(ERROR_COUNT)\n\tMESSAGE(SEND_ERROR \"Found ${ERROR_COUNT} files using the k3d::legacy namespace, which should never be used in new code.  Contact the mailing list to discuss alternatives.\")\t\nENDIF()\n\n"
  },
  {
    "path": "tests/code/line_endings.cmake",
    "content": "# Ensure that K-3D source files always use Unix line-endings\n\nSET(ERROR_COUNT 0)\nSET(SKIP_FILES\n\t\"^application/icon.rc$\"\n\t\"^distribution/win32/aqsisrc$\"\n\t\"^k3dsdk/gil/boost/gil/\"\n\t\"^share/geometry/knot.obj$\"\n\t\"^tests/meshes/mesh.modifier.PGPRemesh.bunny.ply$\"\n\t\"^tests/meshes/mesh.modifier.PGPRemesh.torus.ply$\"\n\t\"^tests/meshes/mesh.source.OBJMeshReader.polyhedron.obj$\"\n\t)\n\nFILE(GLOB_RECURSE SOURCE_FILES \"*\")\nLIST(SORT SOURCE_FILES)\n\nFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_SOURCE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\n\t\tEXECUTE_PROCESS(\n\t\t\tCOMMAND file ${SOURCE_FILE}\n\t\t\tCOMMAND grep -q \"CRLF\"\n\t\t\tRESULT_VARIABLE FOUND_CRLF\n\t\t\t)\n\n\t\tIF(FOUND_CRLF EQUAL 0)\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE} uses DOS line endings.\")\n\t\tENDIF()\n\tENDIF()\nENDFOREACH(SOURCE_FILE)\n\nIF(ERROR_COUNT)\n\tMESSAGE(SEND_ERROR \"Found ${ERROR_COUNT} files using DOS line endings.\")\t\nENDIF()\n\n"
  },
  {
    "path": "tests/code/pretty_function.cmake",
    "content": "# Test to ensure that committed code never uses the nonstandard gcc __PRETTY_FUNCTION__ preprocessor symbol\n\nSET(ERROR_COUNT 0)\nSET(SKIP_FILES\n\t\"[.]svn\"\n\t\"^modules/inotify/inotify-cxx.h$\"\n\t\"^tests/code/pretty_function.cmake$\"\n\t)\n\nFILE(GLOB_RECURSE SOURCE_FILES \"*\")\nLIST(SORT SOURCE_FILES)\n\nFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_SOURCE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\t\tFILE(READ ${SOURCE_FILE} SOURCE)\n\t\tIF(SOURCE MATCHES \"__PRETTY_FUNCTION__\")\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE} uses '__PRETTY_FUNCTION__' which is a nonstandard gcc extension.\")\n\t\tENDIF()\n\tENDIF()\nENDFOREACH(SOURCE_FILE)\n\nIF(ERROR_COUNT)\n\tMESSAGE(SEND_ERROR \"Found ${ERROR_COUNT} files using __PRETTY_FUNCTION__.\")\t\nENDIF()\n\n"
  },
  {
    "path": "tests/code/printf.cmake",
    "content": "# Test to ensure that committed code never uses printf() \n\nSET(ERROR_COUNT 0)\nSET(SKIP_FILES\n\t\"^[.]hg\"\n\t\"[.]svn\"\n\t\"[.]cu$\"\n\t\"[.]po$\"\n\t\"[.]sl$\"\n\t\"^k3dsdk/ftgl/src/FTFont/FTFontGlue.cpp$\"\n\t\"^k3dsdk/ftgl/src/FTGlyph/FTGlyphGlue.cpp$\"\n\t\"^k3dsdk/ftgl/src/FTLayout/FTLayoutGlue.cpp$\"\n\t\"^k3dsdk/sgi_tesselator/geom.c$\"\n\t\"^k3dsdk/xml.cpp$\"\n\t\"^modules/double/double_to_string.cpp$\"\n\t\"^modules/inotify/inotify-cxx.cpp$\"\n\t\"^modules/lsystem/l_parser.cpp$\"\n\t\"^modules/md2_io/md2.cpp$\"\n\t\"^modules/pdiff/CompareArgs.cpp$\"\n\t\"^modules/pdiff/Metric.cpp$\"\n\t\"^modules/polyhedron_sources/polyhedron.cpp$\"\n\t\"^modules/solar/solpos/solpos.cpp$\"\n\t\"^modules/test/string_to_stdout.cpp$\"\n\t\"^share/shaders/k3d_tile.h$\"\n\t\"^tests/code/printf.cmake$\"\n\t\"^tests/code/CMakeLists.txt$\"\n\t)\n\nFILE(GLOB_RECURSE SOURCE_FILES \"*\")\nLIST(SORT SOURCE_FILES)\n\nFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_SOURCE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\t\tFILE(READ ${SOURCE_FILE} SOURCE)\n\t\tIF(SOURCE MATCHES \"printf\")\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE} uses 'printf' ... use k3d::log() for debugging and C++ iostreams for I/O .\")\n\t\tENDIF()\n\tENDIF()\nENDFOREACH(SOURCE_FILE)\n\nIF(ERROR_COUNT)\n\tMESSAGE(SEND_ERROR \"Found ${ERROR_COUNT} files using printf.\")\t\nENDIF()\n\n"
  },
  {
    "path": "tests/code/quoted_includes.cmake",
    "content": "# Ensure that K-3D header files are always #included using angle-brackets instead of quotation marks\n\nSET(ERROR_COUNT 0)\nSET(SKIP_FILES\n\t\"[.]hg/\"\n\t\"[.]sl$\"\n\t\"^application/main.cpp$\"\n\t\"^application/winmain.cpp$\"\n\t\"^k3dsdk/expression/fparser.cpp$\"\n\t\"^k3dsdk/expression/fpoptimizer.cpp$\"\n\t\"^k3dsdk/ftgl/src/\"\n\t\"^k3dsdk/gil/boost/gil/\"\n\t\"^k3dsdk/glew/glew.c$\"\n\t\"^k3dsdk/glew/glxew.h$\"\n\t\"^k3dsdk/sgi_tesselator/\"\n\t\"^modules/\"\n\t\"^share/shaders/.*[.]h$\"\n\t)\n\nFILE(GLOB_RECURSE SOURCE_FILES \"*\")\nLIST(SORT SOURCE_FILES)\n\nFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\tFILE(RELATIVE_PATH RELATIVE_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_FILE})\n\n\tSET(TEST_FILE 1)\n\tFOREACH(SKIP_FILE ${SKIP_FILES})\n\t\tIF(RELATIVE_SOURCE_FILE MATCHES \"${SKIP_FILE}\")\n\t\t\tSET(TEST_FILE 0)\n\t\tENDIF()\n\tENDFOREACH()\n\n\tIF(TEST_FILE)\n\t\tFILE(READ ${SOURCE_FILE} SOURCE)\n\t\tIF(SOURCE MATCHES \"#include[ \\t]*\\\"\")\n\t\t\tMATH(EXPR ERROR_COUNT \"${ERROR_COUNT} + 1\")\n\t\t\tMESSAGE(\"${SOURCE_FILE} uses #include \\\"...\\\" ... use #include <...> for all K-3D header files.\")\n\t\tENDIF()\n\tENDIF()\nENDFOREACH(SOURCE_FILE)\n\nIF(ERROR_COUNT)\n\tMESSAGE(SEND_ERROR \"Found ${ERROR_COUNT} files using #include \\\"...\\\".\")\t\nENDIF()\n\n"
  },
  {
    "path": "tests/code/typed_array_uint_t.cmake",
    "content": "# Test to ensure that new code never uses k3d::typed_array<k3d::uint_t>\n\nFUNCTION(TEST_FILES GLOB_EXPRESSION)\n\tFILE(GLOB_RECURSE SOURCE_FILES ${GLOB_EXPRESSION})\n\tLIST(SORT SOURCE_FILES)\n\n\tFOREACH(SOURCE_FILE ${SOURCE_FILES})\n\t\tFILE(READ ${SOURCE_FILE} SOURCE)\n\t\tIF(SOURCE MATCHES \"typed_array *< *(k3d::)?uint_t *>\")\n\t\t\tMESSAGE(SEND_ERROR \"${SOURCE_FILE} uses k3d::typed_array<k3d::uint_t> ... use k3d::uint_t_array instead.\")\n\t\tENDIF()\n\tENDFOREACH(SOURCE_FILE)\n\nENDFUNCTION(TEST_FILES)\n\nTEST_FILES(*.h)\nTEST_FILES(*.cpp)\n\n"
  },
  {
    "path": "tests/color/CMakeLists.txt",
    "content": "K3D_TEST(color.source.ColorSourceScript\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/source.ColorSourceScript.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS color source ColorSourceScript)\n\n"
  },
  {
    "path": "tests/color/source.ColorSourceScript.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndoc = k3d.new_document()\nsource = k3d.plugin.create(\"ColorSourceScript\", doc)\n\nif source.output_color != k3d.color(1, 0.5, 0.25):\n\traise \"unexpected output_color: \" + str(source.output_color)\n\n"
  },
  {
    "path": "tests/double/CMakeLists.txt",
    "content": "K3D_TEST(double.source.DoubleSourceScript\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/source.DoubleSourceScript.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS double source DoubleSourceScript)\n\nK3D_TEST(double.source.PapagayoLipsyncReader\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/source.DoubleSourceScript.py\n\tREQUIRES K3D_BUILD_LIPSYNC_MODULE\n\tLABELS double source PapagayoLipsyncReader)\n\nK3D_TEST(double.source.DoubleExpression \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/source.DoubleExpression.py\n\tREQUIRES K3D_BUILD_DOUBLE_MODULE\n\tLABELS double source DoubleExpression)\n\n"
  },
  {
    "path": "tests/double/source.DoubleExpression.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_scalar_source_test(\"DoubleExpression\")\nsetup.source.expression = \"cos(pi)\"\n\ntesting.require_scalar_value(setup.source.output, -1.0)\n\n"
  },
  {
    "path": "tests/double/source.DoubleSourceScript.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndoc = k3d.new_document()\nsource = k3d.plugin.create(\"DoubleSourceScript\", doc)\n\nif source.output_double != 1.0:\n\traise \"unexpected output_double: \" + str(source.output_double)\n\n"
  },
  {
    "path": "tests/double/source.PapagayoLipsyncReader.py",
    "content": "#python\n\nimport k3d\nimport testing\nimport copy\n\nsource_file = \"papagayo_example.dat\"\n\nsetup = testing.setup_scalar_source_test(\"PapagayoLipsyncReader\")\n\nsetup.source.frame_rate = 30\nsetup.source.interpolate = True\nsetup.source.interpolation_time = 0.2\n\nsetup.source.papagayo_file = k3d.filesystem.generic_path(testing.source_path() + \"/lipsync/\" + source_file)\n\ntest_cases = \\\n[\n[0.0,{\"rest\":1.0}],\n[1.98,{\"E\":0.24000000000000021,\"etc\":0.75999999999999979}],\n[2.0,{\"E\":0.5,\"etc\":0.5}],\n[4.34,{\"E\":0.69999999999999463,\"MBP\":0.30000000000000537}],\n]\n\nmouths = [\"AI\",\"E\",\"etc\",\"FV\",\"L\",\"MBP\",\"O\",\"rest\",\"U\",\"WQ\"]\n\nfor test_case in test_cases:\n  setup.source.time = test_case[0]\n  source_mouth_value = 0.0\n  mouths_in_zero = copy.deepcopy(mouths)\n  for mouth,reference_value in test_case[1].iteritems():\n    exec(\"source_mouth_value = setup.source.\"+mouth)\n    testing.require_scalar_value(source_mouth_value,reference_value)\n    mouths_in_zero.remove(mouth)\n  #Check the other mouths are in zero\n  for mouth in mouths_in_zero:\n    exec(\"source_mouth_value = setup.source.\"+mouth)\n    testing.require_scalar_value(source_mouth_value,0.0)\n"
  },
  {
    "path": "tests/int32/CMakeLists.txt",
    "content": "K3D_TEST(int32.source.Int32SourceScript\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/source.Int32SourceScript.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS int32 source Int32SourceScript)\n\n"
  },
  {
    "path": "tests/int32/source.Int32SourceScript.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\nsource = k3d.plugin.create(\"Int32SourceScript\", document)\n\nif source.output_int32 != 1:\n\traise \"unexpected output_int32: \" + str(source.output_int32)\n\n"
  },
  {
    "path": "tests/matrix/CMakeLists.txt",
    "content": "K3D_TEST(matrix.modifier.FrozenMatrix\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/modifier.FrozenMatrix.py\n\tREQUIRES K3D_BUILD_CORE_MODULE\n\tLABELS matrix modifier FrozenMatrix)\n\nK3D_TEST(matrix.modifier.MatrixInverse\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/modifier.MatrixInverse.py\n\tREQUIRES K3D_BUILD_MATRIX_MODULE\n\tLABELS matrix modifier MatrixInverse)\n\n"
  },
  {
    "path": "tests/matrix/modifier.FrozenMatrix.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\ninstance = k3d.plugin.create(\"MeshInstance\", document)\ntransform = k3d.plugin.create(\"FrozenMatrix\", document)\n\ntransform.matrix = k3d.translate3(1, 0, 0)\nk3d.property.connect(document, transform.get_property(\"output_matrix\"), instance.get_property(\"input_matrix\"))\n\nposition = k3d.world_position(instance)\nreference = k3d.point3(1, 0, 0)\n\nif position != reference:\n  raise Exception(\"Position differs from expected value, expected: \" + str(reference) + \", result: \" + str(position))\n"
  },
  {
    "path": "tests/matrix/modifier.MatrixInverse.py",
    "content": "#python\n\nimport k3d\n\ndocument = k3d.new_document()\nmodifier = k3d.plugin.create(\"MatrixInverse\", document)\nmodifier.input_matrix = k3d.matrix4.row_major((1, 5, 2, 4, 2, 2, 2, 3, 3, 7, 2, 2, 4, 8, 4, 1))\n\nreference_matrix = k3d.matrix4.row_major((-0.525, 0.45, 0.47500000000000003, -0.2, .125, -0.25, 0.125, 1.3877787807814457e-17, 0.25, 0.0, -0.75, 0.5, 0.1, 0.2, 0.1, -0.2))\n\nresult = k3d.difference.accumulator()\nk3d.difference.test(modifier.output_matrix, reference_matrix, result)\n\nprint \"\"\"<DartMeasurement name=\"Input Value\" type=\"text/string\">\"\"\" + str(modifier.input_matrix) + \"\"\"</DartMeasurement>\"\"\"\nprint \"\"\"<DartMeasurement name=\"Output Value\" type=\"text/string\">\"\"\" + str(modifier.output_matrix) + \"\"\"</DartMeasurement>\"\"\"\nprint \"\"\"<DartMeasurement name=\"Expected Value\" type=\"text/string\">\"\"\" + str(reference_matrix) + \"\"\"</DartMeasurement>\"\"\"\nprint \"\"\"<DartMeasurement name=\"ULPS\" type=\"numeric/integer\">\"\"\" + str(result.ulps_max()) + \"\"\"</DartMeasurement>\"\"\"\n\nif result.ulps_max() > 10:\n\traise Exception(\"matrix does not match expected values\")\n\n\n"
  },
  {
    "path": "tests/mesh/CMakeLists.txt",
    "content": "K3D_TEST(mesh.validation\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.validation.py\n\tLABELS mesh)\n\nK3D_TEST(mesh.serialization\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.serialization.py\n\tLABELS mesh)\n\nK3D_TEST(mesh.diff\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.diff.py\n\tLABELS mesh)\n\nK3D_TEST(mesh.solid\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.solid.py\n\tLABELS mesh)\n\nK3D_TEST(mesh.solid.failure\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.solid.failure.py\n\tLABELS mesh)\n\n\n\n\n\n\n\nK3D_TEST(mesh.selection.null \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.selection.null.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh modifier selection)\n\nK3D_TEST(mesh.selection.none \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.selection.none.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh modifier selection)\n\nK3D_TEST(mesh.selection.all \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.selection.all.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh modifier selection)\n\nK3D_TEST(mesh.selection.points \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.selection.points.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh modifier selection)\n\nK3D_TEST(mesh.selection.GrowSelection \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.selection.GrowSelection.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE K3D_BUILD_SELECTION_MODULE\n\tLABELS mesh modifier selection)\n\nK3D_TEST(mesh.selection.SelectBoundaryEdges \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.selection.SelectBoundaryEdges.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE K3D_BUILD_SELECTION_MODULE\n\tLABELS mesh modifier selection)\n\nK3D_TEST(mesh.selection.SelectDegenerateFaces \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.selection.SelectDegenerateFaces.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE K3D_BUILD_SELECTION_MODULE\n\tLABELS mesh modifier selection)\n\n\n\n\nK3D_TEST(mesh.metrics.GTSMeshArea.PolyCube \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.metrics.GTSMeshArea.PolyCube.py\n\tREQUIRES K3D_BUILD_GTS_MODULE K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh metric)\n\nK3D_TEST(mesh.metrics.GTSMeshArea.self_intersection \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.metrics.GTSMeshArea.self_intersection.py\n\tREQUIRES K3D_BUILD_GTS_MODULE K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh metric)\n\nK3D_TEST(mesh.metrics.GTSMeshVolume.PolyCube \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.metrics.GTSMeshVolume.PolyCube.py\n\tREQUIRES K3D_BUILD_GTS_MODULE K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh metric)\n\n\n\n\n\n\nK3D_TEST(mesh.source.3DSMeshReader\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.3DSMeshReader.py\n\tREQUIRES K3D_BUILD_3DS_IO_MODULE\n\tLABELS mesh source reader 3DSMeshReader)\n\nK3D_TEST(mesh.source.COLLADAMeshReader\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.COLLADAMeshReader.py\n\tREQUIRES K3D_BUILD_COLLADA_IO_MODULE\n\tLABELS mesh source reader COLLADAMeshReader)\n\nK3D_TEST(mesh.source.GTSMeshReader.cube\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.GTSMeshReader.cube.py\n\tREQUIRES K3D_BUILD_GTS_IO_MODULE\n\tLABELS mesh source reader GTSMeshReader)\n\nK3D_TEST(mesh.source.GTSMeshReader.gz.cube\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.GTSMeshReader.gz.cube.py\n\tREQUIRES K3D_BUILD_GTS_IO_MODULE\n\tLABELS mesh source reader GTSMeshReader)\n\nK3D_TEST(mesh.source.MD2MeshReader\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MD2MeshReader.py\n\tREQUIRES K3D_BUILD_MD2_IO_MODULE\n\tLABELS mesh source reader MD2MeshReader)\n\nK3D_TEST(mesh.source.OBJMeshReader.nurbs\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.OBJMeshReader.nurbs.py\n\tREQUIRES K3D_BUILD_OBJ_IO_MODULE\n\tLABELS mesh source reader OBJMeshReader)\n\nK3D_TEST(mesh.source.OBJMeshReader.polyhedron\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.OBJMeshReader.polyhedron.py\n\tREQUIRES K3D_BUILD_OBJ_IO_MODULE\n\tLABELS mesh source reader OBJMeshReader)\n\nK3D_TEST(mesh.source.PLYMeshReader\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PLYMeshReader.py\n\tREQUIRES K3D_BUILD_PLY_IO_MODULE\n\tLABELS mesh source reader PLYMeshReader)\n\nK3D_TEST(mesh.source.STLMeshReader\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.STLMeshReader.py\n\tREQUIRES K3D_BUILD_STL_IO_MODULE\n\tLABELS mesh source reader STLMeshReader)\n\t\nK3D_TEST(mesh.source.STLMeshReader.viscam\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.STLMeshReader.viscam.py\n\tREQUIRES K3D_BUILD_STL_IO_MODULE\n\tLABELS mesh source reader STLMeshReader)\n\t\nK3D_TEST(mesh.source.STLMeshReader.magics\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.STLMeshReader.magics.py\n\tREQUIRES K3D_BUILD_STL_IO_MODULE\n\tLABELS mesh source reader STLMeshReader)\n\nK3D_TEST(mesh.source.SVGMeshReader\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.SVGMeshReader.py\n\tREQUIRES K3D_BUILD_SVG_IO_MODULE\n\tLABELS mesh source reader SVGMeshReader)\n\n\n\n\n\n\nK3D_TEST(mesh.source.MeshSourceScript.bezier_triangle_patches\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.bezier_triangle_patches.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.bicubic.patches\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.bicubic.patches.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.bilinear.patches\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.bilinear.patches.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.blobby\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.blobby.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.cones\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.cones.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.cubic.curves\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.cubic.curves.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.cylinders\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.cylinders.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.disks\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.disks.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.hyperboloids\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.hyperboloids.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.linear.curves\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.linear.curves.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.nurbs.curves\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.nurbs.curves.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.nurbs.patches\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.nurbs.patches.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.paraboloids\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.paraboloids.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.particles\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.particles.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.polyhedra\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.polyhedra.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.simple_polyhedron\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.simple_polyhedron.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.spheres\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.spheres.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.teapots\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.teapots.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\nK3D_TEST(mesh.source.MeshSourceScript.tori\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.MeshSourceScript.tori.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS mesh source MeshSourceScript)\n\n\n\n\n\n\n\n\n\n\n\n\n\nK3D_TEST(mesh.source.QuadricCone\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.QuadricCone.py\n\tREQUIRES K3D_BUILD_QUADRICS_MODULE\n\tLABELS mesh source quadric QuadricCone)\n\nK3D_TEST(mesh.source.QuadricCylinder\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.QuadricCylinder.py\n\tREQUIRES K3D_BUILD_QUADRICS_MODULE\n\tLABELS mesh source quadric QuadricCylinder)\n\nK3D_TEST(mesh.source.QuadricDisk\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.QuadricDisk.py\n\tREQUIRES K3D_BUILD_QUADRICS_MODULE\n\tLABELS mesh source quadric QuadricDisk)\n\nK3D_TEST(mesh.source.QuadricLogo\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.QuadricLogo.py\n\tREQUIRES K3D_BUILD_QUADRICS_MODULE\n\tLABELS mesh source quadric QuadricLogo)\n\nK3D_TEST(mesh.source.QuadricHyperboloid\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.QuadricHyperboloid.py\n\tREQUIRES K3D_BUILD_QUADRICS_MODULE\n\tLABELS mesh source quadric QuadricHyperboloid)\n\nK3D_TEST(mesh.source.QuadricParaboloid\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.QuadricParaboloid.py\n\tREQUIRES K3D_BUILD_QUADRICS_MODULE\n\tLABELS mesh source quadric QuadricParaboloid)\n\nK3D_TEST(mesh.source.QuadricSphere\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.QuadricSphere.py\n\tREQUIRES K3D_BUILD_QUADRICS_MODULE\n\tLABELS mesh source quadric QuadricSphere)\n\nK3D_TEST(mesh.source.QuadricTorus\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.QuadricTorus.py\n\tREQUIRES K3D_BUILD_QUADRICS_MODULE\n\tLABELS mesh source quadric QuadricTorus)\n\n\n\n\n\n\nK3D_TEST(mesh.source.Teapot\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.Teapot.py\n\tREQUIRES K3D_BUILD_QUADRICS_MODULE\n\tLABELS mesh source teapot Teapot)\n\n\n\n\n\n\n\n\nK3D_TEST(mesh.source.BlobbyEllipsoid\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.BlobbyEllipsoid.py\n\tREQUIRES K3D_BUILD_BLOBBY_MODULE\n\tLABELS mesh source BlobbyEllipsoid)\n\nK3D_TEST(mesh.source.BlobbySegment\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.BlobbySegment.py\n\tREQUIRES K3D_BUILD_BLOBBY_MODULE\n\tLABELS mesh source BlobbySegment) \n\nK3D_TEST(mesh.source.LinearKnot\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/source.LinearKnot.py\n\tREQUIRES K3D_BUILD_LINEAR_CURVE_MODULE\n\tLABELS mesh source LinearKnot)\n\nK3D_TEST(mesh.source.LSystemParser\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.LSystemParser.py\n\tREQUIRES K3D_BUILD_LSYSTEM_MODULE\n\tLABELS mesh source LSystemParser)\n\nK3D_TEST(mesh.source.LinearLissajousCurve\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/source.LinearLissajousCurve.py\n\tREQUIRES K3D_BUILD_LINEAR_CURVE_MODULE\n\tLABELS mesh source LinearLissajousCurve)\n\nK3D_TEST(mesh.source.Newell.teacup\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.Newell.teacup.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source Newell)\n\nK3D_TEST(mesh.source.Newell.teapot\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.Newell.teapot.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source Newell)\n\nK3D_TEST(mesh.source.Newell.teaspoon\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.Newell.teaspoon.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source Newell)\n\nK3D_TEST(mesh.source.NurbsCircle\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.NurbsCircle.py\n\tREQUIRES K3D_BUILD_NURBS_SOURCES_MODULE\n\tLABELS mesh source NurbsCircle)\n\nK3D_TEST(mesh.source.NurbsCone\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.NurbsCone.py\n\tREQUIRES K3D_BUILD_NURBS_SOURCES_MODULE\n\tLABELS mesh source NurbsCone)\n\nK3D_TEST(mesh.source.NurbsCurve\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.NurbsCurve.py\n\tREQUIRES K3D_BUILD_NURBS_SOURCES_MODULE\n\tLABELS mesh source NurbsCurve)\n\nK3D_TEST(mesh.source.NurbsCylinder\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.NurbsCylinder.py\n\tREQUIRES K3D_BUILD_NURBS_SOURCES_MODULE\n\tLABELS mesh source NurbsCylinder)\n\nK3D_TEST(mesh.source.NurbsDisk\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.NurbsDisk.py\n\tREQUIRES K3D_BUILD_NURBS_SOURCES_MODULE\n\tLABELS mesh source NurbsDisk)\n\nK3D_TEST(mesh.source.NurbsGrid\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.NurbsGrid.py\n\tREQUIRES K3D_BUILD_NURBS_SOURCES_MODULE\n\tLABELS mesh source NurbsGrid)\n\nK3D_TEST(mesh.source.NurbsHyperboloid\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.NurbsHyperboloid.py\n\tREQUIRES K3D_BUILD_NURBS_SOURCES_MODULE\n\tLABELS mesh source NurbsHyperboloid)\n\nK3D_TEST(mesh.source.NurbsParaboloid\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.NurbsParaboloid.py\n\tREQUIRES K3D_BUILD_NURBS_SOURCES_MODULE\n\tLABELS mesh source NurbsParaboloid)\n\nK3D_TEST(mesh.source.NurbsPolygon\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.NurbsPolygon.py\n\tREQUIRES K3D_BUILD_NURBS_SOURCES_MODULE\n\tLABELS mesh source NurbsPolygon)\n\nK3D_TEST(mesh.source.NurbsSphere\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.NurbsSphere.py\n\tREQUIRES K3D_BUILD_NURBS_SOURCES_MODULE\n\tLABELS mesh source NurbsSphere)\n\nK3D_TEST(mesh.source.NurbsTorus\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.NurbsTorus.py\n\tREQUIRES K3D_BUILD_NURBS_SOURCES_MODULE\n\tLABELS mesh source NurbsTorus)\n\nK3D_TEST(mesh.source.PolyCone\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolyCone.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source PolyCone)\n\nK3D_TEST(mesh.source.PolyCube\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolyCube.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source PolyCube)\n\nK3D_TEST(mesh.source.PolyCushion\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolyCushion.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source PolyCushion)\n\nK3D_TEST(mesh.source.PolyCylinder\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolyCylinder.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source PolyCylinder)\n\nK3D_TEST(mesh.source.PolyCylinder.caps\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolyCylinder.caps.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source PolyCylinder)\n\nK3D_TEST(mesh.source.PolyDisk\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolyDisk.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source PolyDisk)\n\nK3D_TEST(mesh.source.PolyGrid\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolyGrid.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source PolyGrid)\n\nK3D_TEST(mesh.source.PolyIcosahedron\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolyIcosahedron.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source POlyIcosahedron)\n\nK3D_TEST(mesh.source.PolySphere.1\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolySphere.1.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source PolySphere)\n\nK3D_TEST(mesh.source.PolySphere.2\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolySphere.2.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source PolySphere)\n\nK3D_TEST(mesh.source.PolySphere.3\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolySphere.3.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source PolySphere)\n\nK3D_TEST(mesh.source.PolyText\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolyText.py\n\tREQUIRES K3D_BUILD_FREETYPE2_MODULE\n\tLABELS mesh source PolyText)\n\nK3D_TEST(mesh.source.PolyTorus\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolyTorus.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source PolyTorus)\n\nK3D_TEST(mesh.source.UniformPolyhedron\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/source.UniformPolyhedron.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh source polyhedron UniformPolyhedron)\n\nK3D_TEST(mesh.source.SurfacePlot\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.SurfacePlot.py\n\tREQUIRES K3D_BUILD_PLOT_MODULE\n\tLABELS mesh source SurfacePlot)\n\nK3D_TEST(mesh.source.reader.bogus_input\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.reader.bogus_input.py\n\tLABELS mesh source)\n\n\n\n\n\n\n\n\n\n\nK3D_TEST(mesh.source.CUDAPolyGrid\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.CUDAPolyGrid.py\n\tREQUIRES K3D_BUILD_CUDA_MODULE\n\tLABELS mesh source)\n\nK3D_TEST(mesh.source.CUDAPolyGridAndTransformPoints\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.CUDAPolyGridAndTransformPoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS mesh source)\n\nK3D_TEST(mesh.source.CUDAPolyGrid.benchmark\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.CUDAPolyGrid.benchmark.py\n\tREQUIRES K3D_BUILD_CUDA_MODULE\n\tLABELS mesh source)\n\nK3D_TEST(mesh.source.PolyGrid.benchmark\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.PolyGrid.benchmark.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS mesh source)\n\nK3D_TEST(mesh.source.BenchmarkComparison\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.BenchmarkComparison.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_SOURCES_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS mesh source)\n\nK3D_TEST(mesh.source.CUDAPolyGridAndTransformPoints.benchmark\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.CUDAPolyGridAndTransformPoints.benchmark.py\n\tREQUIRES K3D_BUILD_CUDA_MODULE\n\tLABELS mesh source)\n\nK3D_TEST(mesh.source.CUDA.Breakdown\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.source.CUDA.Breakdown.py\n\tREQUIRES K3D_BUILD_CUDA_MODULE\n\tLABELS mesh source)\n\n\n\n\n\n\nK3D_TEST(mesh.modifier.BendPoints\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BendPoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n\tLABELS mesh modifier)\n\n#K3D_TEST(mesh.modifier.BevelFaces \n#\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BevelFaces.py\n#\tREQUIRES K3D_BUILD_MESH_MODULE K3D_BUILD_POLYHEDRON_SOURCES_MODULE\n#\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BevelPoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BevelPoints.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BevelPoints.boundary \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BevelPoints.boundary.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BlobbyAdd \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BlobbyAdd.py\n\tREQUIRES K3D_BUILD_BLOBBY_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BlobbyDivide \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BlobbyDivide.py\n\tREQUIRES K3D_BUILD_BLOBBY_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BlobbyMaximum \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BlobbyMaximum.py\n\tREQUIRES K3D_BUILD_BLOBBY_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BlobbyMinimum \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BlobbyMinimum.py\n\tREQUIRES K3D_BUILD_BLOBBY_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BlobbyMultiply \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BlobbyMultiply.py\n\tREQUIRES K3D_BUILD_BLOBBY_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BlobbyNegate \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BlobbyNegate.py\n\tREQUIRES K3D_BUILD_BLOBBY_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BlobbySubtract \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BlobbySubtract.py\n\tREQUIRES K3D_BUILD_BLOBBY_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BridgeEdges \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BridgeEdges.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier BridgeEdges)\n\nK3D_TEST(mesh.modifier.BridgeFaces \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BridgeFaces.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier BridgeFaces)\n\nK3D_TEST(mesh.modifier.BulgePoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BulgePoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CalculateNormals \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CalculateNormals.py\n\tREQUIRES K3D_BUILD_MESH_ATTRIBUTES_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CalculateNormals.2 \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CalculateNormals.2.py\n\tREQUIRES K3D_BUILD_MESH_ATTRIBUTES_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CapHoles \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CapHoles.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CatmullClark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CatmullClark.py\n\tREQUIRES K3D_BUILD_SUBDIVISION_SURFACE_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CatmullClark.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CatmullClark.benchmark.py\n\tREQUIRES K3D_BUILD_SUBDIVISION_SURFACE_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CatmullClark.complex \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CatmullClark.complex.py\n\tREQUIRES K3D_BUILD_SUBDIVISION_SURFACE_MODULE\n\tLABELS mesh modifier)\n\t\nK3D_TEST(mesh.modifier.CatmullClark.cube \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CatmullClark.cube.py\n\tREQUIRES K3D_BUILD_SUBDIVISION_SURFACE_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CenterPoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CenterPoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CARVEBoolean.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CARVEBoolean.benchmark.py\n\tREQUIRES K3D_BUILD_CARVE_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CARVEBoolean.cubes \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CARVEBoolean.cubes.py\n\tREQUIRES K3D_BUILD_CARVE_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CARVEBoolean.cylinders \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CARVEBoolean.cylinders.py\n\tREQUIRES K3D_BUILD_CARVE_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CARVEBoolean.ply \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CARVEBoolean.ply.py\n\tREQUIRES K3D_BUILD_CARVE_MODULE K3D_BUILD_PLY_IO_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CGALBoolean.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CGALBoolean.benchmark.py\n\tREQUIRES K3D_BUILD_CGAL_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CGALBoolean.cubes \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CGALBoolean.cubes.py\n\tREQUIRES K3D_BUILD_CGAL_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CGALBoolean.cylinders \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CGALBoolean.cylinders.py\n\tREQUIRES K3D_BUILD_CGAL_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CollapseEdges \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CollapseEdges.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CollapseFaces \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CollapseFaces.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CollapsePoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CollapsePoints.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.ConnectVertices \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.ConnectVertices.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CylindricalWavePoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CylindricalWavePoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.DeformationExpression \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.DeformationExpression.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier DeformationExpression)\n\nK3D_TEST(mesh.modifier.DeleteComponents.point \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/modifier.DeleteComponents.point.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier DeleteComponents)\n\nK3D_TEST(mesh.modifier.DeleteComponents.edge \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/modifier.DeleteComponents.edge.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier DeleteComponents)\n\nK3D_TEST(mesh.modifier.DeleteComponents.face \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/modifier.DeleteComponents.face.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier DeleteComponents)\n\nK3D_TEST(mesh.modifier.DeleteComponents.complex \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/modifier.DeleteComponents.complex.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier DeleteComponents)\n\nK3D_TEST(mesh.modifier.DissolveFaces \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/modifier.DissolveFaces.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier polyhedron PolyGrid DissolveFaces)\n\nK3D_TEST(mesh.modifier.EdgesToBlobby \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.EdgesToBlobby.py\n\tREQUIRES K3D_BUILD_BLOBBY_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.EulerKillEdgeAndVertex \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.EulerKillEdgeAndVertex.py\n\tREQUIRES K3D_BUILD_EULER_OPERATIONS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.EulerKillEdgeMakeLoop \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.EulerKillEdgeMakeLoop.py\n\tREQUIRES K3D_BUILD_EULER_OPERATIONS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.ExtrudeFaces \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.ExtrudeFaces.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.LeastSquaresPlot \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.LeastSquaresPlot.py\n\tREQUIRES K3D_BUILD_PLOT_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.LinearPointNoise \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.LinearPointNoise.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.LinearWavePoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.LinearWavePoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.PointsToParticles \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/modifier.PointsToParticles.py\n\tREQUIRES K3D_BUILD_PARTICLE_MODULE\n\tLABELS mesh modifier particles PointsToParticles)\n\nK3D_TEST(mesh.modifier.PolyToBilinear \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/modifier.PolyToBilinear.py\n\tREQUIRES K3D_BUILD_BILINEAR_PATCH_MODULE\n\tLABELS mesh modifier PolyToBilinear)\n\nK3D_TEST(mesh.modifier.MakeHole \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.MakeHole.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.MergeCollinearEdges \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.MergeCollinearEdges.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.MergeCoplanarFaces \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.MergeCoplanarFaces.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.MergePolyhedra \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.MergePolyhedra.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.MergeMesh \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.MergeMesh.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.MergeMesh.generic \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.MergeMesh.generic.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.MeshArray1D \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.MeshArray1D.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.MeshArray2D \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.MeshArray2D.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.MeshArray3D \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.MeshArray3D.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.MorphPoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.MorphPoints.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.MoveFirstEdge \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.MoveFirstEdge.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsAddTrimCurve \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsAddTrimCurve.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsCloseCurve1 \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsCloseCurve1.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsCloseCurve2 \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsCloseCurve2.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsConnectCurves \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsConnectCurves.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsCreateCap \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsCreateCap.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsCurveInsertKnot \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsCurveInsertKnot.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsCurveTraversal \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsCurveTraversal.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsDegreeElevateCurve \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsDegreeElevateCurve.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsEditKnotVector1 \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsEditKnotVector1.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsExtractCurvePoint \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsExtractCurvePoint.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsExtractPatchCurve \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsExtractPatchCurve.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsExtractTrimCurves \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsExtractTrimCurves.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsExtrudeCurve \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsExtrudeCurve.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsExtrudePatch \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsExtrudePatch.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsFlipCurve \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsFlipCurve.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsMergeConnectedCurves \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsMergeConnectedCurves.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsMergeCurveKnotVectors \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsMergeCurveKnotVectors.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsPatchDegreeElevation \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsPatchDegreeElevation.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsPatchInsertKnot \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsPatchInsertKnot.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsPolygonizeCurve \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsPolygonizeCurve.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsPolygonizePatch \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsPolygonizePatch.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsRevolveCurve \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsRevolveCurve.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsRuledSurface \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsRuledSurface.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsSetWeight1 \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsSetWeight1.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsSetWeight2 \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsSetWeight2.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsSkinnedSurface \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsSkinnedSurface.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsSplitCurve \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsSplitCurve.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsSplitPatch \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsSplitPatch.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsSplitPatch2 \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsSplitPatch2.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.NurbsSweepSurface \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.NurbsSweepSurface.py\n\tREQUIRES K3D_BUILD_NURBS_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.PGPRemesh \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.PGPRemesh.py\n\tREQUIRES K3D_BUILD_PGP_REMESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.PGPRemesh.high \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.PGPRemesh.high.py\n\tREQUIRES K3D_BUILD_PGP_REMESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.PGPRemesh.ply.bunny \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.PGPRemesh.ply.bunny.py\n\tREQUIRES K3D_BUILD_PGP_REMESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.PGPRemesh.ply.torus \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.PGPRemesh.ply.torus.py\n\tREQUIRES K3D_BUILD_PGP_REMESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.PGPRemesh.triang \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.PGPRemesh.triang.py\n\tREQUIRES K3D_BUILD_PGP_REMESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.PGPRemesh.bun_zipper_res4 \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.PGPRemesh.bun_zipper_res4.py\n\tREQUIRES K3D_BUILD_PGP_REMESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.PointsToBlobby \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.PointsToBlobby.py\n\tREQUIRES K3D_BUILD_BLOBBY_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BicubicToPoly \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/modifier.BicubicToPoly.py\n\tREQUIRES K3D_BUILD_BICUBIC_PATCH_MODULE\n\tLABELS mesh modifier BicubicToPoly)\n\nK3D_TEST(mesh.modifier.QSlim \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.QSlim.py\n\tREQUIRES K3D_BUILD_QSLIM_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.RotatePoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.RotatePoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SDSCorner \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SDSCorner.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SDSCrease \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SDSCrease.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SDSHole \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SDSHole.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.ScalePoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.ScalePoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SelectConnectedComponents \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SelectConnectedComponents.py\n\tREQUIRES K3D_BUILD_SELECTION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SelectCube \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SelectCube.py\n\tREQUIRES K3D_BUILD_SELECTION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SelectedFacesToPolyhedron \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SelectedFacesToPolyhedron.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SelectNSided \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SelectNSided.py\n\tREQUIRES K3D_BUILD_SELECTION_MODULE\n\tLABELS mesh modifier polyhedron UniformPolyhedron SelectNSided)\n\nK3D_TEST(mesh.modifier.SetColor \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SetColor.py\n\tREQUIRES K3D_BUILD_MESH_ATTRIBUTES_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SetPosition \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SetPosition.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.ShearPoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.ShearPoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SmoothPoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SmoothPoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SphereizePoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SphereizePoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SubdivideEdges \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SubdivideEdges.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SubdivideEdges.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SubdivideEdges.benchmark.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SubdivideFaces.Center \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SubdivideFaces.Center.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SubdivideFaces.Midpoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SubdivideFaces.Midpoints.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.SubdivideFaces.CenterMidpoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.SubdivideFaces.CenterMidpoints.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.TaperPoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.TaperPoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.TransformPoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.TransformPoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.TranslatePoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.TranslatePoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.TriangulateFaces.PolyCube \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.TriangulateFaces.PolyCube.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.TriangulateFaces.PolyGrid \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.TriangulateFaces.PolyGrid.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.TriangulateFaces.PolyGrid.selection \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.TriangulateFaces.PolyGrid.selection.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.TriangulateFaces.vertex \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.TriangulateFaces.vertex.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.TriangulateFaces.self_intersection \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.TriangulateFaces.self_intersection.py\n\tREQUIRES K3D_BUILD_POLYHEDRON_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.TwistPoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.TwistPoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.WeldPoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/modifier.WeldPoints.py\n\tREQUIRES K3D_BUILD_MESH_MODULE\n\tLABELS mesh modifier)\n\n\n\n\n\n\n\n\n\n\n\n\nK3D_TEST(mesh.modifier.CUDATransformPoints \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CUDATransformPoints.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CUDATransformPoints.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CUDATransformPoints.benchmark.py\n\tREQUIRES K3D_BUILD_CUDA_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CUDATransformPointsAsynchronous \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CUDATransformPointsAsynchronous.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CUDATransformPointsAsynchronous.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CUDATransformPointsAsynchronous.benchmark.py\n\tREQUIRES K3D_BUILD_CUDA_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CUDASubdivideEdges \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CUDASubdivideEdges.py\n\tREQUIRES K3D_BUILD_MESH_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CUDASubdivideEdgesSimple \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CUDASubdivideEdgesSimple.py\n\tREQUIRES K3D_BUILD_MESH_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CUDASubdivideEdges.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CUDASubdivideEdges.benchmark.py\n\tREQUIRES K3D_BUILD_MESH_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.TransformPoints.benchmark \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.TransformPoints.benchmark.py\n\tREQUIRES K3D_BUILD_DEFORMATION_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.BenchmarkComparison \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.BenchmarkComparison.py\n\tREQUIRES K3D_BUILD_MESH_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CUDA.Breakdown \n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CUDA.Breakdown.py\n\tREQUIRES K3D_BUILD_CUDA_MODULE\n\tLABELS mesh modifier)\n\nK3D_TEST(mesh.modifier.CUDAConversion\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.modifier.CUDAConversion.py\n\tREQUIRES K3D_BUILD_MESH_MODULE K3D_BUILD_CUDA_MODULE\n\tLABELS mesh modifier cuda)\n\n\nK3D_TEST(mesh.sink.GmshGeoMeshWriter\n  K3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.sink.GmshGeoMeshWriter.py\n  REQUIRES K3D_BUILD_GMSH_IO_MODULE\n  LABELS mesh sink GmshGeoMeshWriter)\n\n\nK3D_TEST(mesh.sink.IGESMeshWriter\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.sink.IGESMeshWriter.py\n\tREQUIRES K3D_BUILD_IGES_IO_MODULE\n\tLABELS mesh sink IGESMeshWriter)\n\nK3D_TEST(mesh.sink.K3DMeshWriter\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.sink.K3DMeshWriter.py\n\tREQUIRES K3D_BUILD_K3D_IO_MODULE\n\tLABELS mesh sink K3DMeshWriter)\n\nK3D_TEST(mesh.sink.OBJMeshWriter\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.sink.OBJMeshWriter.py\n\tREQUIRES K3D_BUILD_OBJ_IO_MODULE\n\tLABELS mesh sink OBJMeshWriter)\n\nK3D_TEST(mesh.sink.PointsCentroid\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.sink.PointsCentroid.py\n\tREQUIRES K3D_BUILD_MESH_MODULE K3D_BUILD_POLYHEDRON_SOURCES_MODULE \n\tLABELS mesh sink)\n\nK3D_TEST(mesh.sink.PLYMeshWriter\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.sink.PLYMeshWriter.py\n\tREQUIRES K3D_BUILD_PLY_IO_MODULE\n\tLABELS mesh sink PLYMeshWriter)\n\nK3D_TEST(mesh.sink.STLMeshWriter\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.sink.STLMeshWriter.py\n\tREQUIRES K3D_BUILD_STL_IO_MODULE\n\tLABELS mesh sink STLMeshWriter)\n\t\nK3D_TEST(mesh.sink.STLMeshWriter.viscam\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.sink.STLMeshWriter.viscam.py\n\tREQUIRES K3D_BUILD_STL_IO_MODULE\n\tLABELS mesh sink STLMeshWriter)\n\nK3D_TEST(mesh.sink.STLMeshWriter.magics\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/mesh.sink.STLMeshWriter.magics.py\n\tREQUIRES K3D_BUILD_STL_IO_MODULE\n\tLABELS mesh sink STLMeshWriter)\n"
  },
  {
    "path": "tests/mesh/mesh.diff.py",
    "content": "#python\n\nimport k3d\n\ndef test_equal(a, b, test):\n\tresult = k3d.difference.accumulator()\n\tk3d.difference.test(a, b, result)\n\tif result.exact_min() != True or result.ulps_max() > 0:\n\t\tprint repr(a)\n\t\tprint repr(b)\n\t\traise Exception(test + \" should test equal\")\n\ndef test_unequal(a, b, test):\n\tresult = k3d.difference.accumulator()\n\tk3d.difference.test(a, b, result)\n\tif result.exact_min() == True and result.ulps_max() == 0:\n\t\tprint repr(a)\n\t\tprint repr(b)\n\t\traise Exception(test + \" should test unequal\")\n\ndocument = k3d.new_document()\n\nsource_a = k3d.plugin.create(\"FrozenMesh\", document)\nsource_b = k3d.plugin.create(\"FrozenMesh\", document)\n\nmesh_a = source_a.create_mesh()\nmesh_b = source_b.create_mesh()\n\ntest_equal(mesh_a, mesh_b, \"empty meshes\")\n\npoints_a = mesh_a.create_points()\ntest_unequal(mesh_a, mesh_b, \"mesh without point array\")\n\npoints_b = mesh_b.create_points()\ntest_equal(mesh_a, mesh_b, \"meshes with empty point arrays\")\n\npoints_a.append(k3d.point3(1, 2, 3))\ntest_unequal(mesh_a, mesh_b, \"mismatched point arrays\")\n\npoints_b.append(k3d.point3(1, 2, 3))\ntest_equal(mesh_a, mesh_b, \"matched point arrays\")\n\nprimitive_a = mesh_a.primitives().create(\"foo\")\ntest_unequal(mesh_a, mesh_b, \"mesh without primitive\")\n\nprimitive_b = mesh_b.primitives().create(\"foo\")\ntest_equal(mesh_a, mesh_b, \"matched primitives\")\n\nstructure_a = primitive_a.structure().create(\"uniform\")\ntest_unequal(mesh_a, mesh_b, \"primitive with missing structure\")\n\nstructure_b = primitive_b.structure().create(\"uniform\")\ntest_equal(mesh_a, mesh_b, \"primitive with matched structures\")\n\narray_a = structure_a.create(\"indices\", \"k3d::uint_t\")\ntest_unequal(mesh_a, mesh_b, \"structure with missing array\")\n\narray_b = structure_b.create(\"indices\", \"k3d::uint_t\")\ntest_equal(mesh_a, mesh_b, \"structure with matched arrays\")\n\narray_a.append(5)\ntest_unequal(mesh_a, mesh_b, \"mismatched structure arrays\")\n\narray_b.append(5)\ntest_equal(mesh_a, mesh_b, \"matched structure_arrays\")\n\nattributes_a = primitive_a.attributes().create(\"uniform\")\ntest_unequal(mesh_a, mesh_b, \"primitive with missing attributes\")\n\nattributes_b = primitive_b.attributes().create(\"uniform\")\ntest_equal(mesh_a, mesh_b, \"matched primitive attributes\")\n\nattribute_a = attributes_a.create(\"Cs\", \"k3d::color\")\ntest_unequal(mesh_a, mesh_b, \"missing attribute arrays\")\n\nattribute_b = attributes_b.create(\"Cs\", \"k3d::color\")\ntest_equal(mesh_a, mesh_b, \"matched attribute arrays\")\n\nattribute_a.append(k3d.color(1, 2, 3))\ntest_unequal(mesh_a, mesh_b, \"mismatched attributes\")\n\nattribute_b.append(k3d.color(1, 2, 3))\ntest_equal(mesh_a, mesh_b, \"matched attributes\")\n\n\n"
  },
  {
    "path": "tests/mesh/mesh.metrics.GTSMeshArea.PolyCube.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"GTSMeshArea\")\nsetup.source.width = 1\nsetup.source.height = 1\nsetup.source.depth = 1\n\ntesting.require_mesh_area(setup.modifier.area, 6.0)\n\n"
  },
  {
    "path": "tests/mesh/mesh.metrics.GTSMeshArea.self_intersection.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource = k3d.plugin.create(\"FrozenMesh\", document)\nmesh = source.create_mesh()\n\npositions = [(-5, 5, 0), (5, 5, 0), (-5, -5, 0), (5, -5, 0)]\n\npoints = mesh.create_points()\npoint_selection = mesh.create_point_selection()\n\nfor position in positions:\n\tpoints.append(k3d.point3(position[0], position[1], position[2]))\n\tpoint_selection.append(0.0)\n\npolyhedron = k3d.polyhedron.create(mesh)\npolyhedron.shell_types().append(k3d.polyhedron.shell_type.POLYGONS)\npolyhedron.face_shells().append(0)\npolyhedron.face_first_loops().append(0)\npolyhedron.face_loop_counts().append(1)\npolyhedron.face_materials().append(None)\npolyhedron.face_selections().append(0.0)\npolyhedron.loop_first_edges().append(0)\npolyhedron.clockwise_edges().assign([1, 2, 3, 0])\npolyhedron.edge_selections().assign([0, 0, 0, 0])\npolyhedron.vertex_points().assign([0, 1, 2, 3])\npolyhedron.vertex_selections().assign([0, 0, 0, 0])\n\nCs = polyhedron.edge_attributes().create(\"Cs\", \"k3d::color\")\nCs.assign([k3d.color(1, 0, 0), k3d.color(0, 1, 0), k3d.color(0, 0, 1), k3d.color(1, 1, 1)])\n\nmodifier = k3d.plugin.create(\"GTSMeshArea\", document)\nk3d.property.connect(document, source.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\ntesting.require_mesh_area(modifier.area, 50.0)\n\n"
  },
  {
    "path": "tests/mesh/mesh.metrics.GTSMeshVolume.PolyCube.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"GTSMeshVolume\")\nsetup.source.width = 2\nsetup.source.height = 3\nsetup.source.depth = 4\n\ntesting.require_mesh_volume(setup.modifier.volume, 24.0)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BenchmarkComparison.py",
    "content": "#python\n\nimport benchmarking\n# a test to compare the benchmark results for a number of bitmap plugins\n\ncompare_list = [\"SubdivideEdges\",\n                \"TransformPoints\",\n                ]\n\nfor run in compare_list:\n    try:\n        benchmarking.generate_comparison_image(run, (run, \"CUDA\"+run), plotLabels=('Mesh Size', 'Time [s]'), calculate_speedup = True)\n    except:\n        print \"Error with: \" + run\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BendPoints.py",
    "content": "#python\n\nimport k3d\nimport math\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCylinder\", \"BendPoints\")\n\nsetup.source.radius = 1\n\nselection = k3d.geometry.selection.create(0)\npoint_selection = k3d.geometry.point_selection.create(selection, 1)\nsetup.modifier.mesh_selection = selection\nsetup.modifier.angle = math.radians(90)\nsetup.modifier.around = \"y\"\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.BendPoints\", 512, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BevelFaces.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"BevelFaces\")\n\nselection = k3d.geometry.selection.create(0)\nselection.faces = [(4, 5, 1)]\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.BevelFaces\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BevelPoints.boundary.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"BevelPoints\")\n\nselection = k3d.selection.set()\npoint_selection = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.BevelPoints.boundary\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BevelPoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"BevelPoints\")\n\nselection = k3d.selection.set()\npoint_selection = k3d.geometry.point_selection.create(selection)\nk3d.geometry.point_selection.append(point_selection, 0, 4, 1)\n\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.BevelPoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BlobbyAdd.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource1 = k3d.plugin.create(\"BlobbyEllipsoid\", document)\nsource1.color = k3d.color(1, 0, 0)\n\nsource2 = k3d.plugin.create(\"BlobbySegment\", document)\nsource2.color = k3d.color(1, 1, 0)\n\nmodifier = k3d.plugin.create(\"BlobbyAdd\", document)\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh1\"))\nk3d.property.connect(document, source2.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh2\"))\n\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.BlobbyAdd\", 5)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BlobbyDivide.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource1 = k3d.plugin.create(\"BlobbyEllipsoid\", document)\nsource1.color = k3d.color(1, 0, 0)\n\nsource2 = k3d.plugin.create(\"BlobbySegment\", document)\nsource2.color = k3d.color(1, 1, 0)\n\nmodifier = k3d.plugin.create(\"BlobbyDivide\", document)\n\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), modifier.get_property(\"input_a\"))\nk3d.property.connect(document, source2.get_property(\"output_mesh\"), modifier.get_property(\"input_b\"))\n\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.BlobbyDivide\", 5)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BlobbyMaximum.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource1 = k3d.plugin.create(\"BlobbyEllipsoid\", document)\nsource1.color = k3d.color(1, 0, 0)\n\nsource2 = k3d.plugin.create(\"BlobbySegment\", document)\nsource2.color = k3d.color(1, 1, 0)\n\nmodifier = k3d.plugin.create(\"BlobbyMaximum\", document)\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh1\"))\nk3d.property.connect(document, source2.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh2\"))\n\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.BlobbyMaximum\", 5)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BlobbyMinimum.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource1 = k3d.plugin.create(\"BlobbyEllipsoid\", document)\nsource1.color = k3d.color(1, 0, 0)\n\nsource2 = k3d.plugin.create(\"BlobbySegment\", document)\nsource2.color = k3d.color(1, 1, 0)\n\nmodifier = k3d.plugin.create(\"BlobbyMinimum\", document)\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh1\"))\nk3d.property.connect(document, source2.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh2\"))\n\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.BlobbyMinimum\", 5)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BlobbyMultiply.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource1 = k3d.plugin.create(\"BlobbyEllipsoid\", document)\nsource1.color = k3d.color(1, 0, 0)\n\nsource2 = k3d.plugin.create(\"BlobbySegment\", document)\nsource2.color = k3d.color(1, 1, 0)\n\nmodifier = k3d.plugin.create(\"BlobbyMultiply\", document)\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh1\"))\nk3d.property.connect(document, source2.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh2\"))\n\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.BlobbyMultiply\", 5)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BlobbyNegate.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource1 = k3d.plugin.create(\"BlobbyEllipsoid\", document)\nsource1.color = k3d.color(1, 0, 0)\n\nmodifier = k3d.plugin.create(\"BlobbyNegate\", document)\n\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.BlobbyNegate\", 5)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BlobbySubtract.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource1 = k3d.plugin.create(\"BlobbyEllipsoid\", document)\nsource1.color = k3d.color(1, 0, 0)\n\nsource2 = k3d.plugin.create(\"BlobbySegment\", document)\nsource2.color = k3d.color(1, 1, 0)\n\nmodifier = k3d.plugin.create(\"BlobbySubtract\", document)\n\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), modifier.get_property(\"input_a\"))\nk3d.property.connect(document, source2.get_property(\"output_mesh\"), modifier.get_property(\"input_b\"))\n\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.BlobbySubtract\", 5)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BridgeEdges.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"K3DMeshReader\", \"BridgeEdges\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/mesh.modifier.BridgeEdges.source.k3d\")\n\nselection = k3d.geometry.selection.create(0)\nedge_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.EDGE)\nk3d.geometry.primitive_selection.append(edge_selection, 1, 2, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 7, 8, 1)\n\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.BridgeEdges\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BridgeFaces.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"K3DMeshReader\", \"BridgeFaces\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/mesh.modifier.BridgeFaces.source.k3d\")\n\nselection = k3d.geometry.selection.create(0)\nedge_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(edge_selection, 8, 9, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 12, 13, 1)\n\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.BridgeFaces\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.BulgePoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCylinder\", \"BulgePoints\")\n\nsetup.source.radius = 1\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.bulge_factor = 5\nsetup.modifier.displace_y = False\nsetup.modifier.displace_z = False\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.BulgePoints\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CARVEBoolean.benchmark.py",
    "content": "#python\n\nimport k3d\nimport testing\nimport benchmarking\n\ndocument = k3d.new_document()\n\nsphere = k3d.plugin.create(\"PolySphere\", document)\ntorus = k3d.plugin.create(\"PolyTorus\", document)\n\ncarve_boolean = k3d.plugin.create(\"CARVEBoolean\", document)\nk3d.property.create(carve_boolean, \"k3d::mesh*\", \"input_1\", \"Input 1\", \"\")\nk3d.property.create(carve_boolean, \"k3d::mesh*\", \"input_2\", \"Input 2\", \"\")\n\nk3d.property.connect(document, sphere.get_property(\"output_mesh\"), carve_boolean.get_property(\"input_1\"))\nk3d.property.connect(document, torus.get_property(\"output_mesh\"), carve_boolean.get_property(\"input_2\"))\n\nprofiler = k3d.plugin.create(\"PipelineProfiler\", document)\n\ntesting.require_valid_mesh(document, carve_boolean.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, carve_boolean.get_property(\"output_mesh\"), \"mesh.modifier.CARVEBoolean.benchmark\", 0)\nbenchmarking.print_profiler_records(profiler.records)\nprint \"\"\"<DartMeasurement name=\"Total Boolean Time\" type=\"numeric/float\">\"\"\" + str(benchmarking.total_profiler_time(profiler.records)) + \"\"\"</DartMeasurement>\"\"\"\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CARVEBoolean.cubes.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsmall_cube = k3d.plugin.create(\"PolyCube\", document)\nsmall_cube.width = 2.5\nsmall_cube.depth = 2.5\nsmall_cube.height = 7.5\nbig_cube = k3d.plugin.create(\"PolyCube\", document)\n\ncarve_boolean = k3d.plugin.create(\"CARVEBoolean\", document)\ncarve_boolean.type = \"difference\"\nk3d.property.create(carve_boolean, \"k3d::mesh*\", \"input_1\", \"Input 1\", \"\")\nk3d.property.create(carve_boolean, \"k3d::mesh*\", \"input_2\", \"Input 2\", \"\")\n\nk3d.property.connect(document, big_cube.get_property(\"output_mesh\"), carve_boolean.get_property(\"input_1\"))\nk3d.property.connect(document, small_cube.get_property(\"output_mesh\"), carve_boolean.get_property(\"input_2\"))\n\n\ntesting.require_valid_mesh(document, carve_boolean.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, carve_boolean.get_property(\"output_mesh\"), \"mesh.modifier.CARVEBoolean.cubes\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CARVEBoolean.cylinders.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsmall_cylinder = k3d.plugin.create(\"PolyCylinder\", document)\nsmall_cylinder.radius = 2.0\nsmall_cylinder.zmax = 7.5\nsmall_cylinder.zmin = -7.5\nsmall_cylinder.u_segments = 8\nbig_cylinder = k3d.plugin.create(\"PolyCylinder\", document)\nbig_cylinder.u_segments = 8\ntorus = k3d.plugin.create(\"PolyTorus\", document)\ntorus.u_segments = 8\ntorus.v_segments = 4\n\nfirst_boolean = k3d.plugin.create(\"CARVEBoolean\", document)\nfirst_boolean.type = \"difference\"\nk3d.property.create(first_boolean, \"k3d::mesh*\", \"input_1\", \"Input 1\", \"\")\nk3d.property.create(first_boolean, \"k3d::mesh*\", \"input_2\", \"Input 2\", \"\")\nsecond_boolean = k3d.plugin.create(\"CARVEBoolean\", document)\nsecond_boolean.type = \"reverse_difference\"\nk3d.property.create(second_boolean, \"k3d::mesh*\", \"input_1\", \"Input 1\", \"\")\nk3d.property.create(second_boolean, \"k3d::mesh*\", \"input_2\", \"Input 2\", \"\")\n\nk3d.property.connect(document, big_cylinder.get_property(\"output_mesh\"), first_boolean.get_property(\"input_1\"))\nk3d.property.connect(document, small_cylinder.get_property(\"output_mesh\"), first_boolean.get_property(\"input_2\"))\nk3d.property.connect(document, torus.get_property(\"output_mesh\"), second_boolean.get_property(\"input_1\"))\nk3d.property.connect(document, first_boolean.get_property(\"output_mesh\"), second_boolean.get_property(\"input_2\"))\n\n\ntesting.require_valid_mesh(document, second_boolean.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, second_boolean.get_property(\"output_mesh\"), \"mesh.modifier.CARVEBoolean.cylinders\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CARVEBoolean.ply.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsmall_cylinder = k3d.plugin.create(\"PLYMeshReader\", document)\nsmall_cylinder.file = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/mesh.modifier.CARVEBoolean.input.b.ply\")\nsmall_cylinder.center = False\nsmall_cylinder.scale_to_size = False\nbig_cylinder = k3d.plugin.create(\"PLYMeshReader\", document)\nbig_cylinder.file = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/mesh.modifier.CARVEBoolean.input.a.ply\")\nbig_cylinder.center = False\nbig_cylinder.scale_to_size = False\n\ncarve_boolean = k3d.plugin.create(\"CARVEBoolean\", document)\ncarve_boolean.type = \"difference\"\nk3d.property.create(carve_boolean, \"k3d::mesh*\", \"input_1\", \"Input 1\", \"\")\nk3d.property.create(carve_boolean, \"k3d::mesh*\", \"input_2\", \"Input 2\", \"\")\n\nk3d.property.connect(document, big_cylinder.get_property(\"output_mesh\"), carve_boolean.get_property(\"input_1\"))\nk3d.property.connect(document, small_cylinder.get_property(\"output_mesh\"), carve_boolean.get_property(\"input_2\"))\n\ntesting.require_valid_mesh(document, carve_boolean.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, carve_boolean.get_property(\"output_mesh\"), \"mesh.modifier.CARVEBoolean.ply\", 10)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CGALBoolean.benchmark.py",
    "content": "#python\n\nimport k3d\nimport testing\nimport benchmarking\n\ndocument = k3d.new_document()\n\nsphere = k3d.plugin.create(\"PolySphere\", document)\ntorus = k3d.plugin.create(\"PolyTorus\", document)\n\ncgal_boolean = k3d.plugin.create(\"CGALBoolean\", document)\nk3d.property.create(cgal_boolean, \"k3d::mesh*\", \"input_1\", \"Input 1\", \"\")\nk3d.property.create(cgal_boolean, \"k3d::mesh*\", \"input_2\", \"Input 2\", \"\")\n\nk3d.property.connect(document, sphere.get_property(\"output_mesh\"), cgal_boolean.get_property(\"input_1\"))\nk3d.property.connect(document, torus.get_property(\"output_mesh\"), cgal_boolean.get_property(\"input_2\"))\n\nprofiler = k3d.plugin.create(\"PipelineProfiler\", document)\n\ntesting.require_valid_mesh(document, cgal_boolean.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, cgal_boolean.get_property(\"output_mesh\"), \"mesh.modifier.CGALBoolean.benchmark\", 1)\nbenchmarking.print_profiler_records(profiler.records)\nprint \"\"\"<DartMeasurement name=\"Total Boolean Time\" type=\"numeric/float\">\"\"\" + str(benchmarking.total_profiler_time(profiler.records)) + \"\"\"</DartMeasurement>\"\"\"\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CGALBoolean.cubes.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsmall_cube = k3d.plugin.create(\"PolyCube\", document)\nsmall_cube.width = 2.5\nsmall_cube.depth = 2.5\nsmall_cube.height = 7.5\nbig_cube = k3d.plugin.create(\"PolyCube\", document)\n\ncgal_boolean = k3d.plugin.create(\"CGALBoolean\", document)\ncgal_boolean.type = \"difference\"\nk3d.property.create(cgal_boolean, \"k3d::mesh*\", \"input_1\", \"Input 1\", \"\")\nk3d.property.create(cgal_boolean, \"k3d::mesh*\", \"input_2\", \"Input 2\", \"\")\n\nk3d.property.connect(document, big_cube.get_property(\"output_mesh\"), cgal_boolean.get_property(\"input_1\"))\nk3d.property.connect(document, small_cube.get_property(\"output_mesh\"), cgal_boolean.get_property(\"input_2\"))\n\n\ntesting.require_valid_mesh(document, cgal_boolean.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, cgal_boolean.get_property(\"output_mesh\"), \"mesh.modifier.CGALBoolean.cubes\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CGALBoolean.cylinders.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsmall_cylinder = k3d.plugin.create(\"PolyCylinder\", document)\nsmall_cylinder.radius = 2.0\nsmall_cylinder.zmax = 7.5\nsmall_cylinder.zmin = -7.5\nsmall_cylinder.u_segments = 8\nbig_cylinder = k3d.plugin.create(\"PolyCylinder\", document)\nbig_cylinder.u_segments = 8\ntorus = k3d.plugin.create(\"PolyTorus\", document)\ntorus.u_segments = 8\ntorus.v_segments = 4\n\nfirst_boolean = k3d.plugin.create(\"CGALBoolean\", document)\nfirst_boolean.type = \"difference\"\nk3d.property.create(first_boolean, \"k3d::mesh*\", \"input_1\", \"Input 1\", \"\")\nk3d.property.create(first_boolean, \"k3d::mesh*\", \"input_2\", \"Input 2\", \"\")\nsecond_boolean = k3d.plugin.create(\"CGALBoolean\", document)\nsecond_boolean.type = \"reverse_difference\"\nk3d.property.create(second_boolean, \"k3d::mesh*\", \"input_1\", \"Input 1\", \"\")\nk3d.property.create(second_boolean, \"k3d::mesh*\", \"input_2\", \"Input 2\", \"\")\n\nk3d.property.connect(document, big_cylinder.get_property(\"output_mesh\"), first_boolean.get_property(\"input_1\"))\nk3d.property.connect(document, small_cylinder.get_property(\"output_mesh\"), first_boolean.get_property(\"input_2\"))\nk3d.property.connect(document, torus.get_property(\"output_mesh\"), second_boolean.get_property(\"input_1\"))\nk3d.property.connect(document, first_boolean.get_property(\"output_mesh\"), second_boolean.get_property(\"input_2\"))\n\n\ntesting.require_valid_mesh(document, second_boolean.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, second_boolean.get_property(\"output_mesh\"), \"mesh.modifier.CGALBoolean.cylinders\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CUDA.Breakdown.py",
    "content": "#python\n\nimport benchmarking\n\n\ncolumns = [#\"Create:Validate input\",\n           #\"Merge selection\",\n           \"Calculate companions\",\n           \"Calculate indices\",\n           \"Allocate memory\",\n           \"Update indices\",\n           \"Split edges\",\n           #\"Update:Validate input\",\n           \"Calculate positions\",\n           #\"Update:Copy\",\n           \"Total\"]\n           \n\nbenchmarking.generate_component_image(\"CUDASubdivideEdgesBreakdown\", \"CUDASubdivideEdges\", columns )\n\n\ncolumns = [#\"Create:Validate input\",\n           #\"Merge selection\",\n           \"Calculate companions\",\n           \"Calculate indices\",\n           \"Allocate memory\",\n           \"Update indices\",\n           \"Split edges\",\n           #\"Update:Validate input\",\n           \"Calculate positions\",\n           \"Update Mesh\",\n           \"Total\"]\n\nbenchmarking.generate_component_image(\"SubdivideEdgesBreakdown\", \"SubdivideEdges\", columns )\n\n\ncolumns = [\"BIND_TEXTURE\",\n           \"SETUP\",\n           \"CONVERT_PRE\",\n           \"TO_DEVICE\",\n           \"EXECUTE\",\n           \"TO_HOST\",\n           \"CONVERT_POST\",\n           \"CLEANUP\",\n           \"Update Mesh\",\n           \"Create Mesh\",\n           \"Copy points\",\n           \"Total\"\n           ]\n           \n\nbenchmarking.generate_component_image(\"CUDATransformPointsBreakdown\", \"CUDATransformPoints\", columns )\n\ncolumns = [\"Deform Mesh\",\n           \"Update Mesh\",\n           \"Create Mesh\",\n           \"Copy points\",\n           \"Total\"\n           ]\n           \n\nbenchmarking.generate_component_image(\"TransformPointsBreakdown\", \"TransformPoints\", columns )"
  },
  {
    "path": "tests/mesh/mesh.modifier.CUDAConversion.py",
    "content": "#python \n\nimport testing, k3d, sys\n\ndoc = k3d.new_document()\n\nsource = k3d.plugin.create(\"PolyGrid\", doc)\n\nk3d_to_cuda = k3d.plugin.create(\"CUDAMeshK3dToCUDAConverter\", doc)\ncuda_to_k3d = k3d.plugin.create(\"CUDAMeshCUDAToK3dConverter\", doc)\n\nk3d.property.connect(doc, source.get_property(\"output_mesh\"), k3d_to_cuda.get_property(\"input_mesh\"))\nk3d.property.connect(doc, k3d_to_cuda.get_property(\"device_output_mesh\"), cuda_to_k3d.get_property(\"device_input_mesh\"))\n\ndifference = k3d.plugin.create(\"MeshDiff\", doc)\ndifference.threshold = 1\nk3d.property.create(difference, \"k3d::mesh*\", \"input_a\", \"InputA\", \"First input mesh\")\nk3d.property.create(difference, \"k3d::mesh*\", \"input_b\", \"InputB\", \"Second input mesh\")\nk3d.property.connect(doc, source.get_property(\"output_mesh\"), difference.get_property(\"input_a\"))\nk3d.property.connect(doc, cuda_to_k3d.get_property(\"output_mesh\"), difference.get_property(\"input_b\"))\n\nif not difference.equal: \n    # Send the mesh difference to the dashboard as preformatted HTML, so the\n    # columns all line-up.\n    print \"\"\"<DartMeasurement name=\"Mesh Difference\" type=\"text/html\"><![CDATA[\\n\"\"\"\n    print \"\"\"<pre>\"\"\"\n    print k3d.print_diff(cuda_to_k3d.output_mesh, source.output_mesh, 1)\n    print \"\"\"</pre>\"\"\"\n    print \"\"\"]]></DartMeasurement>\\n\"\"\"\n    sys.stdout.flush()\n    \n    raise Exception(\"output mesh differs from reference\")\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CUDASubdivideEdges.benchmark.py",
    "content": "#python\n\nimport benchmarking\n\nbenchmarking.mesh_modifier_benchmark(\"CUDASubdivideEdges\", 15, {})"
  },
  {
    "path": "tests/mesh/mesh.modifier.CUDASubdivideEdges.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"K3DMeshReader\", \"CUDASubdivideEdges\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/polyhedron.k3d\")\n\n# select some edges, distributed along polyhedra\nselection = k3d.geometry.selection.create(0)\nselection.edges =[(0, 4294967295, 0), (0, 1, 1), (1, 2, 1), (2, 3, 1), (3, 4, 1), (52, 53, 1), (53, 54, 1), (54, 55, 1), (55, 56, 1), (56, 57, 1), (57, 58, 1), (58, 59, 1), (59, 60, 1), (60, 61, 1), (61, 62, 1), (62, 63, 1), (63, 64, 1), (64, 65, 1), (74, 75, 1), (75, 76, 1), (76, 77, 1), (77, 78, 1), (78, 79, 1), (79, 80, 1), (80, 81, 1), (81, 82, 1)]\nsetup.modifier.mesh_selection = selection\nsetup.modifier.vertices = 2\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SubdivideEdges\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CUDASubdivideEdgesSimple.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\ngrid = k3d.plugin.create(\"PolyGrid\"), document;\ngrid.columns = 1\ngrid.rows = 1\n\nmodifier = k3d.plugin.create(\"SubdivideEdges\", document)\ncuda_modifier = k3d.plugin.create(\"CUDASubdivideEdges\", document)\n\nmodifier.mesh_selection = k3d.geometry.selection.create(1)\nmodifier.vertices = 1\n\ncuda_modifier.mesh_selection = modifier.mesh_selection\ncuda_modifier.vertices = 1\n\nk3d.property.connect(document, grid.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\nk3d.property.connect(document, grid.get_property(\"output_mesh\"), cuda_modifier.get_property(\"input_mesh\"))\n\ntesting.output_mesh_difference(cuda_modifier.output_mesh, modifier.output_mesh, 1)\n\ndifference = testing.get_mesh_difference(document, cuda_modifier.get_property(\"output_mesh\"), modifier.get_property(\"output_mesh\"), 1)\n\nif not difference.equal:\n    raise \"Meshes not equal\"\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CUDATransformPoints.benchmark.py",
    "content": "#python\n\nimport benchmarking\n\nbenchmarking.mesh_modifier_benchmark(\"CUDATransformPoints\")\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CUDATransformPoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"CUDATransformPoints\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.uniform(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.input_matrix = k3d.translate3(k3d.vector3(0, 0, 1))\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.TransformPoints\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CUDATransformPointsAsynchronous.benchmark.py",
    "content": "#python\n\nimport benchmarking\n\nbenchmarking.mesh_modifier_benchmark(\"CUDATransformPointsAsynchronous\")\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CUDATransformPointsAsynchronous.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"CUDATransformPointsAsynchronous\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.input_matrix = k3d.translate3(k3d.vector3(0, 0, 1))\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.TransformPoints\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CalculateNormals.2.py",
    "content": "#python\n\nimport k3d\nimport testing\nimport math\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"CalculateNormals\")\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.max_angle = math.radians(91.0)\nsetup.modifier.face = True\nsetup.modifier.vertex = True\nsetup.modifier.point = True\nsetup.modifier.face_array = \"Nf\"\nsetup.modifier.vertex_array = \"Nv\"\nsetup.modifier.point_array = \"Np\"\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.CalculateNormals.2\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CalculateNormals.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"CalculateNormals\")\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.face = True\nsetup.modifier.vertex = True\nsetup.modifier.point = True\nsetup.modifier.face_array = \"Nf\"\nsetup.modifier.vertex_array = \"Nv\"\nsetup.modifier.point_array = \"Np\"\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.CalculateNormals\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CapHoles.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyText\", \"CapHoles\")\n\nselection = k3d.geometry.selection.create(0)\nedge_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.EDGE)\nk3d.geometry.primitive_selection.append(edge_selection, 48, 49, 1)\n\nsetup.source.text = \"8\"\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.CapHoles\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CatmullClark.benchmark.py",
    "content": "#python\n\nimport k3d\nimport testing\nimport benchmarking\n\nsetup = testing.setup_mesh_modifier_test(\"PolySphere\", \"CatmullClark\")\nsetup.modifier.level = 5\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\nprofiler = k3d.plugin.create(\"PipelineProfiler\", setup.document)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\n#note: no comparison to reference, as the file is 97 MB!\n\nbenchmarking.print_profiler_records(profiler.records)\nprint \"\"\"<DartMeasurement name=\"Total Time\" type=\"numeric/float\">\"\"\" + str(benchmarking.total_profiler_time(profiler.records)) + \"\"\"</DartMeasurement>\"\"\"\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CatmullClark.complex.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nreader = k3d.plugin.create(\"K3DMeshReader\", document)\n# load a mesh that has multiple polyhedra, triangles, quads, n-sided polygons and holes. (i.e. a mesh from hell)\nreader.file = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/polyhedron.hole.k3d\")\nreader.center = False\nreader.scale_to_size = False\n\nmodifier = k3d.plugin.create(\"CatmullClark\", document)\n\nmodifier.level = 2\n\nk3d.property.connect(document, reader.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.CatmullClark.complex\", 2)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CatmullClark.cube.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"CatmullClark\")\ntesting.add_point_attributes_test(setup, True, False, False)\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\n#testing.require_valid_point_attributes(setup.document, setup.modifier.output_mesh)\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.CatmullClark.cube\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CatmullClark.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"CatmullClark\")\ntesting.add_point_attributes_test(setup, True, False, False)\n\nsetup.source.u_segments = 4\nsetup.source.v_segments = 2\nsetup.source.bottom = False\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\n#testing.require_valid_point_attributes(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.CatmullClark\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CenterPoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test2(\"PolyCube\", \"TranslatePoints\", \"CenterPoints\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier1.mesh_selection = selection\nsetup.modifier1.x = 1.0\nsetup.modifier1.y = 2.0\nsetup.modifier1.z = 3.0\n\nsetup.modifier2.mesh_selection = selection\nsetup.modifier2.center_x = True\nsetup.modifier2.center_y = True\nsetup.modifier2.center_z = True\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier2.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier2.get_property(\"output_mesh\"), \"mesh.modifier.CenterPoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CollapseEdges.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"CollapseEdges\")\n\nselection = k3d.selection.set()\nprimitive_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.EDGE)\nk3d.geometry.primitive_selection.append(primitive_selection, 10, 11, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 28, 29, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 30, 31, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 48, 49, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 48, 49, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 50, 51, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 68, 69, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 70, 71, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 88, 89, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 90, 91, 1)\n\nk3d.geometry.primitive_selection.append(primitive_selection, 43, 44, 1)\n\nk3d.geometry.primitive_selection.append(primitive_selection, 18, 19, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 36, 37, 1)\n\nk3d.geometry.primitive_selection.append(primitive_selection, 82, 83, 1)\n\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.CollapseEdges\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CollapseFaces.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"CollapseFaces\")\n\nselection = k3d.selection.set()\nprimitive_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(primitive_selection, 0, 1, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 13, 14, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 17, 18, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 19, 20, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 23, 24, 1)\n\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.CollapseFaces\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CollapsePoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"CollapsePoints\")\n\nselection = k3d.selection.set()\npoint_selection = k3d.geometry.point_selection.create(selection)\nk3d.geometry.point_selection.append(point_selection, 14, 16, 1)\nk3d.geometry.point_selection.append(point_selection, 20, 22, 1)\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.CollapsePoints\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.ConnectVertices.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"ConnectVertices\")\n\nselection = k3d.selection.set()\npoint_selection = k3d.geometry.point_selection.create(selection)\nk3d.geometry.point_selection.append(point_selection, 0, 1, 1)\nk3d.geometry.point_selection.append(point_selection, 2, 3, 1)\n\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.ConnectVertices\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.CylindricalWavePoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCylinder\", \"CylindricalWavePoints\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.source.u_segments = 4\nsetup.source.v_segments = 16\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.amplitude = 1\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.CylindricalWavePoints\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.DeformationExpression.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolySphere\", \"DeformationExpression\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.DeformationExpression\", 32, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.EdgesToBlobby.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"EdgesToBlobby\")\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.EdgesToBlobby\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.EulerKillEdgeAndVertex.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"EulerKillEdgeAndVertex\")\n\nselection = k3d.geometry.selection.create(1)\nedge_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.EDGE)\nk3d.geometry.primitive_selection.append(edge_selection, 0, 4294967295, 0)\nk3d.geometry.primitive_selection.append(edge_selection, 49, 50, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 55, 56, 1)\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.EulerKillEdgeAndVertex\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.EulerKillEdgeMakeLoop.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"EulerKillEdgeMakeLoop\")\n\nsetup.source.rows = 3\nsetup.source.columns = 3\n\nselection = k3d.geometry.selection.create(0)\nedge_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.EDGE)\nk3d.geometry.primitive_selection.append(edge_selection, 0, 4294967295, 0)\nk3d.geometry.primitive_selection.append(edge_selection, 7, 8, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 1, 2, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 2, 3, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 12, 13, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 14, 15, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 24, 25, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 31, 32, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 25, 26, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 35, 36, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 29, 30, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 22, 23, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 32, 33, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 10, 11, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 20, 21, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 5, 6, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 11, 12, 1)\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.EulerKillEdgeMakeLoop\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.ExtrudeFaces.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"ExtrudeFaces\")\n\nsetup.source.rows = 3\nsetup.source.columns = 3\n\nselection = k3d.geometry.selection.create(0)\nface_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(face_selection, 4, 5, 1)\nsetup.modifier.mesh_selection = selection\nsetup.modifier.distance = 5\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.ExtrudeFaces\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.LeastSquaresPlot.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"FrozenMesh\", \"LeastSquaresPlot\")\n\nmesh = setup.source.create_mesh()\n\npositions = [(-5, 1, 3), (4, 2, 4), (3, 3, -5), (-4, 4, -3)]\n\npoints = mesh.create_points()\npoint_selection = mesh.create_point_selection()\n\nfor position in positions:\n\tpoints.append(k3d.point3(position[0], position[1], position[2]))\n\tpoint_selection.append(0.0)\n\nk3d.property.create(setup.modifier, \"k3d::string_t\",\"function_1\", \"Function 1\", \"Function 1\")\nk3d.property.create(setup.modifier, \"k3d::string_t\",\"function_2\", \"Function 2\", \"Function 2\")\nk3d.property.create(setup.modifier, \"k3d::string_t\",\"function_3\", \"Function 3\", \"Function 3\")\n\nsetup.modifier.function_1 = \"u^2\"\nsetup.modifier.function_2 = \"sin(v)\"\nsetup.modifier.function_3 = \"u*v\"\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.source.LeastSquaresPlot\", 4096)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.LinearPointNoise.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"LinearPointNoise\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.amplitude_x = 0\nsetup.modifier.amplitude_y = 0\nsetup.modifier.amplitude_z = 1\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.LinearPointNoise\", 64)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.LinearWavePoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCylinder\", \"LinearWavePoints\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.source.u_segments = 4\nsetup.source.v_segments = 16\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.axis = \"x\"\nsetup.modifier.along = \"z\"\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.LinearWavePoints\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.MakeHole.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"MakeHole\")\n\nselection = k3d.geometry.selection.create(1)\n\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.MakeHole\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.MergeCollinearEdges.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"MergeCoplanarFaces\", \"MergeCollinearEdges\")\nplane = k3d.plugin.create(\"PolyGrid\", setup.document)\nk3d.property.connect(setup.document, plane.get_property(\"output_mesh\"), setup.source.get_property(\"input_mesh\"))\n\nsetup.source.mesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.MergeCollinearEdges\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.MergeCoplanarFaces.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"MergeCoplanarFaces\")\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1) \n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.MergeCoplanarFaces\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.MergeMesh.generic.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource1= k3d.plugin.create(\"PolyCube\", document)\nsource1.width = 2.0\nsource1.height = 2.0\nsource1.depth = 2.0\n\nsource2 = k3d.plugin.create(\"PolyCube\", document)\nsource2.width = 4.0\nsource2.height = 4.0\nsource2.depth = 4.0\n\nmodifier1 = k3d.plugin.create(\"PointsToParticles\", document)\nmodifier1.width = 2.0\n\nmodifier2 = k3d.plugin.create(\"PointsToParticles\", document)\nmodifier2.width = 3.0\n\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), modifier1.get_property(\"input_mesh\"))\nk3d.property.connect(document, source2.get_property(\"output_mesh\"), modifier2.get_property(\"input_mesh\"))\n\nmerge_mesh = k3d.plugin.create(\"MergeMesh\", document)\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\nk3d.property.connect(document, modifier1.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh1\"))\nk3d.property.connect(document, modifier2.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh2\"))\n\ntesting.require_valid_mesh(document, merge_mesh.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, merge_mesh.get_property(\"output_mesh\"), \"mesh.modifier.MergeMesh.generic\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.MergeMesh.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource1 = k3d.plugin.create(\"BlobbyEllipsoid\", document)\nsource2 = k3d.plugin.create(\"LinearLissajousCurve\", document)\nsource3 = k3d.plugin.create(\"Newell\", document)\nsource4 = k3d.plugin.create(\"NurbsCurve\", document)\nsource5 = k3d.plugin.create(\"NurbsGrid\", document)\nsource6 = k3d.plugin.create(\"PolyCube\", document)\nsource7 = k3d.plugin.create(\"QuadricCone\", document)\nsource8 = k3d.plugin.create(\"PolyCylinder\", document)\nsource9 = k3d.plugin.create(\"NurbsGrid\", document)\nmodifier = k3d.plugin.create(\"MergeMesh\", document)\n\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh3\", \"Input Mesh 3\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh4\", \"Input Mesh 4\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh5\", \"Input Mesh 5\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh6\", \"Input Mesh 6\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh7\", \"Input Mesh 7\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh8\", \"Input Mesh 8\", \"\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input_mesh9\", \"Input Mesh 9\", \"\")\n\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh1\"))\nk3d.property.connect(document, source2.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh2\"))\nk3d.property.connect(document, source3.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh3\"))\nk3d.property.connect(document, source4.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh4\"))\nk3d.property.connect(document, source5.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh5\"))\nk3d.property.connect(document, source6.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh6\"))\nk3d.property.connect(document, source7.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh7\"))\nk3d.property.connect(document, source8.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh8\"))\nk3d.property.connect(document, source9.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh9\"))\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.MergeMesh\", 32, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.MergePolyhedra.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test2(\"PolyCube\", \"MeshArray2D\", \"MergePolyhedra\")\n\nsetup.modifier1.layout = k3d.plugin.create(\"TranslateArray2D\", setup.document)\n\ntesting.require_valid_mesh(setup.document, setup.modifier2.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier2.get_property(\"output_mesh\"), \"mesh.modifier.MergePolyhedra\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.MeshArray1D.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"MeshArray1D\")\n\nsetup.modifier.layout = k3d.plugin.create(\"TranslateArray1D\", setup.document)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.MeshArray1D\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.MeshArray2D.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"MeshArray2D\")\n\nsetup.modifier.layout = k3d.plugin.create(\"TranslateArray2D\", setup.document)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.MeshArray2D\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.MeshArray3D.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"MeshArray3D\")\n\nsetup.modifier.layout = k3d.plugin.create(\"TranslateArray3D\", setup.document)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.MeshArray3D\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.MorphPoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource1 = k3d.plugin.create(\"PolyCone\", document)\nsource2 = k3d.plugin.create(\"PolySphere\", document)\nsource3 = k3d.plugin.create(\"PolyCube\", document)\nmodifier = k3d.plugin.create(\"MorphPoints\", document)\n\nk3d.property.create(modifier, \"k3d::mesh*\", \"input1\", \"input1\", \"input1\")\nk3d.property.create(modifier, \"k3d::mesh*\", \"input2\", \"input2\", \"input2\")\nk3d.property.create(modifier, \"k3d::double_t\", \"amount1\", \"amount1\", \"amount1\")\nk3d.property.create(modifier, \"k3d::double_t\", \"amount2\", \"amount2\", \"amount2\")\n\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\nk3d.property.connect(document, source2.get_property(\"output_mesh\"), modifier.get_property(\"input1\"))\nk3d.property.connect(document, source3.get_property(\"output_mesh\"), modifier.get_property(\"input2\"))\n\nselection = k3d.geometry.selection.create(0)\npoint_selection = k3d.geometry.point_selection.create(selection, 1)\n\nmodifier.mesh_selection = selection\n\nmodifier.amount1 = 0.1\nmodifier.amount2 = 0.1 \n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.MorphPoints\", 4)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.MoveFirstEdge.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"MoveFirstEdge\")\n\nselection = k3d.geometry.selection.create(0)\nface_selection = k3d.geometry.primitive_selection.create(selection)\nface_selection.primitive_begin().append(0)\nface_selection.primitive_end().append(1)\nface_selection.primitive_selection_type().append(k3d.selection.type.FACE)\nface_selection.primitive_first_range().append(0)\nface_selection.primitive_range_count().append(1)\nface_selection.index_begin().append(0)\nface_selection.index_end().append(3)\nface_selection.weight().append(1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.distance = 1\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.MoveFirstEdge\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsAddTrimCurve.py",
    "content": "#python\n\nimport testing\nimport k3d\n\ndocument = k3d.new_document()\n\npatch = k3d.plugin.create(\"NurbsGrid\", document)\ncurve = k3d.plugin.create(\"NurbsCircle\", document)\nmerge_mesh = k3d.plugin.create(\"MergeMesh\", document)\nmodifier = k3d.plugin.create(\"NurbsAddTrimCurve\", document)\n\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\nmodifier.mesh_selection = k3d.geometry.selection.create(1)\nmodifier.offset_u = 0.5\nmodifier.offset_v = 0.5\n\nk3d.property.connect(document, patch.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh1\"))\nk3d.property.connect(document, curve.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh2\"))\nk3d.property.connect(document, merge_mesh.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsAddTrimCurve\", 1, [\"Darwin-i386\"]\n)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsCloseCurve1.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCurve\", \"NurbsCloseCurve\")\n\nsetup.modifier.keep_ends = True\n\nselection = k3d.geometry.selection.create(0)\ncurve_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.CURVE)\nk3d.geometry.primitive_selection.append(curve_selection, 0, 10000, 1)\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsCloseCurve1\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsCloseCurve2.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCircle\", \"NurbsCloseCurve\")\n\nselection = k3d.geometry.selection.create(0)\ncurve_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.CURVE)\nk3d.geometry.primitive_selection.append(curve_selection, 0, 10000, 1)\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsCloseCurve2\", 32, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsConnectCurves.py",
    "content": "#python\n\nimport testing\nimport k3d\n\ndocument = k3d.new_document()\n\ncurve1 = k3d.plugin.create(\"NurbsCurve\", document)\ncurve2 = k3d.plugin.create(\"NurbsCurve\", document)\ntransform = k3d.plugin.create(\"TranslatePoints\", document)\nmerge_mesh = k3d.plugin.create(\"MergeMesh\", document)\nmodifier = k3d.plugin.create(\"NurbsConnectCurves\", document)\n\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\ntransform_selection = k3d.geometry.selection.create(0)\nk3d.geometry.point_selection.create(transform_selection, 1)\ntransform.mesh_selection = transform_selection\ntransform.y = 3\n\nselection = k3d.geometry.selection.create(0)\npoint_selection = k3d.geometry.point_selection.create(selection)\nk3d.geometry.point_selection.append(point_selection, 0, 8, 0)\nk3d.geometry.point_selection.append(point_selection, 0, 1, 1)\nk3d.geometry.point_selection.append(point_selection, 4, 5, 1)\nmodifier.mesh_selection = selection\n\nk3d.property.connect(document, curve2.get_property(\"output_mesh\"), transform.get_property(\"input_mesh\"))\nk3d.property.connect(document, curve1.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh1\"))\nk3d.property.connect(document, transform.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh2\"))\nk3d.property.connect(document, merge_mesh.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsConnectCurves\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsCreateCap.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCircle\",\"NurbsCreateCap\")\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsCreateCap\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsCurveInsertKnot.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCircle\", \"NurbsCurveInsertKnot\")\n\nsetup.modifier.u_value = 0.1\n\nselection = k3d.geometry.selection.create(0)\ncurve_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.CURVE)\nk3d.geometry.primitive_selection.append(curve_selection, 0, 10000, 1)\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsCurveInsertKnot\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsCurveTraversal.py",
    "content": "#python\n\nimport testing\nimport k3d\nfrom math import pi\n\ndocument = k3d.new_document()\n\ncurve1 = k3d.plugin.create(\"NurbsCurve\", document)\ncurve2 = k3d.plugin.create(\"NurbsCircle\", document)\ntransform = k3d.plugin.create(\"RotatePoints\", document)\nmerge_mesh = k3d.plugin.create(\"MergeMesh\", document)\nmodifier = k3d.plugin.create(\"NurbsCurveTraversal\", document)\n\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\ntransform_selection = k3d.geometry.selection.create(0)\nk3d.geometry.point_selection.create(transform_selection, 1)\ntransform.mesh_selection = transform_selection\ntransform.y = 0.5*pi\n\nmodifier.mesh_selection = k3d.geometry.selection.create(1)\n\nk3d.property.connect(document, curve2.get_property(\"output_mesh\"), transform.get_property(\"input_mesh\"))\nk3d.property.connect(document, curve1.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh1\"))\nk3d.property.connect(document, transform.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh2\"))\nk3d.property.connect(document, merge_mesh.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsCurveTraversal\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsDegreeElevateCurve.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCurve\",\"NurbsCurveDegreeElevation\")\n\nmesh_selection = k3d.geometry.selection.create(0)\nuniform_selection = k3d.geometry.primitive_selection.create(mesh_selection, k3d.selection.type.CURVE)\nk3d.geometry.primitive_selection.append(uniform_selection, 1)\n\nsetup.modifier.mesh_selection = mesh_selection\nsetup.modifier.degree = 1\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsDegreeElevateCurve\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsEditKnotVector1.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCircle\",\"NurbsEditCurveKnotVector\")\n\nselection = k3d.geometry.selection.create(0)\ncurve_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.CURVE)\nk3d.geometry.primitive_selection.append(curve_selection, 0, 10000, 1)\nsetup.modifier.mesh_selection = selection\n\nsetup.modifier.knot_vector = [0, 0, 0, 0.1, 0.2, 0.25, 0.3, 0.3, 0.8, 0.8, 1, 1, 1]\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsEditKnotVector\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsExtractCurvePoint.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCircle\", \"NurbsExtractCurvePoint\")\n\nsetup.modifier.parameter = 0.1\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsExtractCurvePoint\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsExtractPatchCurve.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCylinder\",\"NurbsExtractPatchCurve\")\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.parameter = 0.5\nsetup.modifier.extract_v_curve = True\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsExtractPatchCurve\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsExtractTrimCurves.py",
    "content": "#python\n\nimport testing\nimport k3d\n\ndocument = k3d.new_document()\n\npatch = k3d.plugin.create(\"NurbsGrid\", document)\ncurve = k3d.plugin.create(\"NurbsCircle\", document)\nmerge_mesh = k3d.plugin.create(\"MergeMesh\", document)\nmodifier = k3d.plugin.create(\"NurbsAddTrimCurve\", document)\nextract_trim = k3d.plugin.create(\"NurbsExtractTrimCurves\", document)\n\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\nmodifier.mesh_selection = k3d.geometry.selection.create(1)\nmodifier.offset_u = 0.5\nmodifier.offset_v = 0.5\nmodifier.delete_curve = True\n\nextract_trim.mesh_selection = k3d.geometry.selection.create(1)\n\nk3d.property.connect(document, patch.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh1\"))\nk3d.property.connect(document, curve.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh2\"))\nk3d.property.connect(document, merge_mesh.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\nk3d.property.connect(document, modifier.get_property(\"output_mesh\"), extract_trim.get_property(\"input_mesh\"))\n\ntesting.require_valid_mesh(document, extract_trim.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, extract_trim.get_property(\"output_mesh\"), \"mesh.modifier.NurbsExtractTrimCurves\", 10)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsExtrudeCurve.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCircle\",\"NurbsExtrudeCurve\")\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsExtrudeCurve\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsExtrudePatch.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsDisk\", \"NurbsExtrudePatch\")\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsExtrudePatch\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsFlipCurve.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCircle\",\"NurbsFlipCurve\")\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsFlipCurve\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsMergeConnectedCurves.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nselection = k3d.geometry.selection.create(1)\ncircle = k3d.plugin.create(\"NurbsCircle\", document)\nsplit1 = k3d.plugin.create(\"NurbsSplitCurve\", document)\nsplit2 = k3d.plugin.create(\"NurbsSplitCurve\", document)\nmerge = k3d.plugin.create(\"NurbsMergeConnectedCurves\", document)\n\nsplit1.mesh_selection = selection\nsplit2.mesh_selection = selection\nmerge.mesh_selection = selection\n\nk3d.property.connect(document, circle.get_property(\"output_mesh\"), split1.get_property(\"input_mesh\"))\nk3d.property.connect(document, split1.get_property(\"output_mesh\"), split2.get_property(\"input_mesh\"))\nk3d.property.connect(document, split2.get_property(\"output_mesh\"), merge.get_property(\"input_mesh\"))\n\ntesting.require_valid_mesh(document, merge.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, merge.get_property(\"output_mesh\"), \"mesh.modifier.NurbsMergeConnectedCurves\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsMergeCurveKnotVectors.py",
    "content": "#python\n\nimport testing\nimport k3d\nimport math\n\ndocument = k3d.new_document()\n\ncurve1 = k3d.plugin.create(\"NurbsCircle\", document)\ncurve2 = k3d.plugin.create(\"NurbsCircle\", document)\ntransform = k3d.plugin.create(\"TranslatePoints\", document)\nmerge_mesh = k3d.plugin.create(\"MergeMesh\", document)\nmodifier = k3d.plugin.create(\"NurbsMergeCurveKnotVectors\", document)\n\ncurve2.thetamax = math.radians(180)\ncurve2.u_segments = 6\n\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\ntransform_selection = k3d.geometry.selection.create(0)\nk3d.geometry.point_selection.create(transform_selection, 1)\ntransform.mesh_selection = transform_selection\ntransform.z = 3\n\nselection = k3d.geometry.selection.create(0)\ncurve_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.CURVE)\nk3d.geometry.primitive_selection.append(curve_selection, 0, 10000, 1)\nmodifier.mesh_selection = selection\n\nk3d.property.connect(document, curve2.get_property(\"output_mesh\"), transform.get_property(\"input_mesh\"))\nk3d.property.connect(document, curve1.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh1\"))\nk3d.property.connect(document, transform.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh2\"))\nk3d.property.connect(document, merge_mesh.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsMergeCurveKnotVectors\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsPatchDegreeElevation.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsGrid\",\"NurbsPatchDegreeElevation\")\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.degree = 1\nsetup.modifier.insert_to_v=False\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsPatchDegreeElevation\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsPatchInsertKnot.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsGrid\",\"NurbsPatchInsertKnot\")\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.u_value = 0.735\nsetup.modifier.multiplicity = 2\nsetup.modifier.insert_to_v = False\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsPatchInsertKnot\", 32)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsPolygonizeCurve.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCircle\",\"NurbsPolygonizeCurve\")\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.segments = 10\nsetup.modifier.delete_original = True\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsPolygonizeCurve\", 3, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsPolygonizePatch.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsSphere\",\"NurbsPolygonizePatch\")\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsPolygonizePatch\", 4, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsRevolveCurve.py",
    "content": "#python\n\nimport testing\nimport k3d\nfrom math import pi\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCircle\",\"NurbsRevolveCurve\")\n\nsetup.source.thetamax = pi\nsetup.modifier.angle = 0.5*pi\nsetup.modifier.around = 'x'\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsRevolveCurve\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsRuledSurface.py",
    "content": "#python\n\nimport testing\nimport k3d\nfrom math import pi\n\ndocument = k3d.new_document()\n\ncurve1 = k3d.plugin.create(\"NurbsCurve\", document)\ncurve2 = k3d.plugin.create(\"NurbsCircle\", document)\ntransform = k3d.plugin.create(\"RotatePoints\", document)\nmerge_mesh = k3d.plugin.create(\"MergeMesh\", document)\nmodifier = k3d.plugin.create(\"NurbsRuledSurface\", document)\n\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\ntransform_selection = k3d.geometry.selection.create(0)\nk3d.geometry.point_selection.create(transform_selection, 1)\ntransform.mesh_selection = transform_selection\ntransform.y = 0.5*pi\n\nmodifier.mesh_selection = k3d.geometry.selection.create(1)\n\nk3d.property.connect(document, curve2.get_property(\"output_mesh\"), transform.get_property(\"input_mesh\"))\nk3d.property.connect(document, curve1.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh1\"))\nk3d.property.connect(document, transform.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh2\"))\nk3d.property.connect(document, merge_mesh.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsRuledSurface\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsSetWeight1.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCircle\",\"NurbsSetWeight\")\n\nmodifier = setup.modifier\nmodifier.weight = 1.7\nmodifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsSetWeight1\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsSetWeight2.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCylinder\",\"NurbsSetWeight\")\n\nsetup.modifier.weight = 2.5\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsSetWeight2\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsSkinnedSurface.py",
    "content": "#python\n\nimport testing\nimport k3d\n\ndocument = k3d.new_document()\n\ncurve1 = k3d.plugin.create(\"NurbsCurve\", document)\ncurve2 = k3d.plugin.create(\"NurbsCurve\", document)\ncurve3 = k3d.plugin.create(\"NurbsCurve\", document)\ntransform1 = k3d.plugin.create(\"TranslatePoints\", document)\ntransform2 = k3d.plugin.create(\"TranslatePoints\", document)\nmerge_mesh = k3d.plugin.create(\"MergeMesh\", document)\nmodifier = k3d.plugin.create(\"NurbsSkinnedSurface\", document)\n\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh3\", \"Input Mesh 3\", \"\")\n\ntransform1.mesh_selection = k3d.geometry.selection.create(1)\ntransform1.y = 3\ntransform2.mesh_selection = k3d.geometry.selection.create(1)\ntransform2.z = 3\n\nmodifier.mesh_selection = k3d.geometry.selection.create(1)\n\nk3d.property.connect(document, curve2.get_property(\"output_mesh\"), transform1.get_property(\"input_mesh\"))\nk3d.property.connect(document, curve3.get_property(\"output_mesh\"), transform2.get_property(\"input_mesh\"))\nk3d.property.connect(document, curve1.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh1\"))\nk3d.property.connect(document, transform1.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh2\"))\nk3d.property.connect(document, transform2.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh3\"))\nk3d.property.connect(document, merge_mesh.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsSkinnedSurface\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsSplitCurve.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsCurve\",\"NurbsSplitCurve\")\ntesting.add_point_attributes_test(setup, True, True, True)\n\nselection = k3d.geometry.selection.create(0)\ncurve_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.CURVE)\nk3d.geometry.primitive_selection.append(curve_selection, 0, 10000, 1)\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\n#testing.require_valid_point_attributes(setup.document, setup.modifier.output_mesh)\n#testing.require_valid_vertex_attributes(setup.document, setup.modifier.output_mesh)\n#testing.require_valid_parameter_attributes(setup.document, setup.modifier.output_mesh)\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsSplitCurve\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsSplitPatch.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsGrid\",\"NurbsSplitPatch\")\n#testing.add_point_attributes_test(setup, True, True, True)\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.u_value = 0.567\nsetup.modifier.insert_to_v = False\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\n#testing.require_valid_point_attributes(setup.document, setup.modifier.output_mesh)\n#testing.require_valid_vertex_attributes(setup.document, setup.modifier.output_mesh)\n#testing.require_valid_parameter_attributes(setup.document, setup.modifier.output_mesh)\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsSplitPatch1\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsSplitPatch2.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"NurbsGrid\",\"NurbsSplitPatch\")\n\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.u_value = 0.147\nsetup.modifier.insert_to_v = True\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsSplitPatch2\", 16)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.NurbsSweepSurface.py",
    "content": "#python\n\nimport testing\nimport k3d\nfrom math import pi\n\ndocument = k3d.new_document()\n\npath = k3d.plugin.create(\"NurbsCircle\", document)\nto_sweep = k3d.plugin.create(\"NurbsCircle\", document)\nrotate = k3d.plugin.create(\"RotatePoints\", document)\ntranslate = k3d.plugin.create(\"TranslatePoints\", document)\nmerge_mesh = k3d.plugin.create(\"MergeMesh\", document)\nmodifier = k3d.plugin.create(\"NurbsSweepSurface\", document)\n\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(merge_mesh, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\n\nrotate.mesh_selection = k3d.geometry.selection.create(1)\ntranslate.mesh_selection = k3d.geometry.selection.create(1)\nrotate.x = 0.5*pi\ntranslate.x = 5\n\nmodifier.mesh_selection = k3d.geometry.selection.create(1)\nmodifier.align_normal = False\n\npath.thetamax = 0.6*pi\nto_sweep.radius = 1.\n\nk3d.property.connect(document, to_sweep.get_property(\"output_mesh\"), rotate.get_property(\"input_mesh\"))\nk3d.property.connect(document, rotate.get_property(\"output_mesh\"), translate.get_property(\"input_mesh\"))\nk3d.property.connect(document, path.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh1\"))\nk3d.property.connect(document, translate.get_property(\"output_mesh\"), merge_mesh.get_property(\"input_mesh2\"))\nk3d.property.connect(document, merge_mesh.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.NurbsSweepSurface\", 20)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.PGPRemesh.bun_zipper_res4.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PLYMeshReader\", \"PGPRemesh\")\nsetup.source.file = testing.source_path() + \"/meshes/bun_zipper_res4.ply\"\n#setup.modifier.use_smooth = True\n#setup.modifier.smooth_4 = False\n#setup.modifier.steps = 5\n#setup.modifier.h = 1500\n#setup.modifier.omega = 10\n#setup.modifier.div = 2\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.PGPRemesh.bun_zipper_res4\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.PGPRemesh.high.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test2(\"PolyTorus\", \"TriangulateFaces\", \"PGPRemesh\")\nsetup.modifier1.mesh_selection = k3d.select_all()\nsetup.modifier2.use_smooth = False\nsetup.modifier2.steps = 0\nsetup.modifier2.omega = 5\nsetup.modifier2.div = 17\nsetup.modifier2.triangulate = True\n\ntesting.require_valid_mesh(setup.document, setup.modifier2.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier2.get_property(\"output_mesh\"), \"mesh.modifier.PGPRemesh.high\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.PGPRemesh.ply.bunny.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"PLYMeshReader\", \"mesh.modifier.PGPRemesh.bunny.ply\")\n\nmodifier = setup.k3d.plugin.create(\"PGPRemesh\", document)\nmodifier.use_smooth = True\nmodifier.steps = 1\nmodifier.h = 100000\nmodifier.omega = 10\nmodifier.div = 10\nmodifier.triangulate = True\nk3d.property.connect(document, setup.source.get_property(\", modifier.get_property(\"input_mesh\")output_mesh\"))\n\n#print \"source output: \" + repr(source.output_mesh)\n#print \"triangles output: \" + repr(triangles.output_mesh)\n#print \"modifier output: \" + repr(modifier.output_mesh)\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.PGPRemesh.bunny\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.PGPRemesh.ply.torus.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"PLYMeshReader\", \"mesh.modifier.PGPRemesh.torus.ply\")\n\nmodifier = setup.k3d.plugin.create(\"PGPRemesh\", document)\nmodifier.use_smooth = True\nmodifier.steps = 15\nmodifier.h = 1000\nmodifier.omega = 10\nmodifier.div = 4\nmodifier.triangulate = True\nk3d.property.connect(document, setup.source.get_property(\", modifier.get_property(\"input_mesh\")output_mesh\"))\n\n#print \"source output: \" + repr(source.output_mesh)\n#print \"triangles output: \" + repr(triangles.output_mesh)\n#print \"modifier output: \" + repr(modifier.output_mesh)\n\ntesting.require_valid_mesh(setup.document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.PGPRemesh.torus\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.PGPRemesh.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource = k3d.plugin.create(\"PolyTorus\", document)\n\ntriangles = k3d.plugin.create(\"TriangulateFaces\", document)\ntriangles.mesh_selection = k3d.select_all()\nk3d.property.connect(document, source.get_property(\"output_mesh\"), triangles.get_property(\"input_mesh\"))\n\nmodifier = k3d.plugin.create(\"PGPRemesh\", document)\nmodifier.use_smooth = False\nmodifier.steps = 0\nmodifier.omega = 1\nmodifier.div = 2\nmodifier.triangulate = True\nk3d.property.connect(document, triangles.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\n#print \"source output: \" + repr(source.output_mesh)\n#print \"triangles output: \" + repr(triangles.output_mesh)\n#print \"modifier output: \" + repr(modifier.output_mesh)\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.PGPRemesh\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.PGPRemesh.triang.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource = k3d.plugin.create(\"PolyTorus\", document)\n\ntriangles = k3d.plugin.create(\"TriangulateFaces\", document)\ntriangles.mesh_selection = k3d.select_all()\nk3d.property.connect(document, source.get_property(\"output_mesh\"), triangles.get_property(\"input_mesh\"))\n\nmodifier = k3d.plugin.create(\"PGPRemesh\", document)\nmodifier.use_smooth = False\nmodifier.steps = 0\nmodifier.omega = 6\nmodifier.div = 6\nmodifier.triangulate = False\nk3d.property.connect(document, triangles.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\n#print \"source output: \" + repr(source.output_mesh)\n#print \"triangles output: \" + repr(triangles.output_mesh)\n#print \"modifier output: \" + repr(modifier.output_mesh)\n\ntesting.require_valid_mesh(document, modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, modifier.get_property(\"output_mesh\"), \"mesh.modifier.PGPRemesh.triang\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.PointsToBlobby.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"PointsToBlobby\")\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.PointsToBlobby\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.QSlim.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyTorus\", \"QSlim\")\n\nsetup.modifier.face_count = 100\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.QSlim\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.RotatePoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"RotatePoints\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.z = 1.0\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.RotatePoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SDSCorner.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"SDSCorner\")\n\nselection = k3d.geometry.selection.create(0)\npoint_selection = k3d.geometry.point_selection.create(selection)\npoint_selection.index_begin().append(1)\npoint_selection.index_end().append(2)\npoint_selection.weight().append(1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.sharpness = 3.5\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SDSCorner\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SDSCrease.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"SDSCrease\")\n\nselection = k3d.geometry.selection.create(0)\nedge_selection = k3d.geometry.primitive_selection.create(selection)\nedge_selection.primitive_begin().append(0)\nedge_selection.primitive_end().append(1)\nedge_selection.primitive_selection_type().append(k3d.selection.type.EDGE)\nedge_selection.primitive_first_range().append(0)\nedge_selection.primitive_range_count().append(1)\nedge_selection.index_begin().append(2)\nedge_selection.index_end().append(3)\nedge_selection.weight().append(1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.sharpness = 2.5\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SDSCrease\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SDSHole.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"SDSHole\")\n\nselection = k3d.geometry.selection.create(0)\nface_selection = k3d.geometry.primitive_selection.create(selection)\nface_selection.primitive_begin().append(0)\nface_selection.primitive_end().append(1)\nface_selection.primitive_selection_type().append(k3d.selection.type.FACE)\nface_selection.primitive_first_range().append(0)\nface_selection.primitive_range_count().append(1)\nface_selection.index_begin().append(3)\nface_selection.index_end().append(4)\nface_selection.weight().append(1)\n\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SDSHole\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.ScalePoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"ScalePoints\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.x = 2.0\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.ScalePoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SelectConnectedComponents.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"SelectConnectedComponents\")\n\nselection = k3d.geometry.selection.create(0)\nface_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(face_selection, 0, 1, 1)\n\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SelectConnectedComponents\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SelectCube.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"SelectCube\")\n\nsetup.modifier.x1 = 0.0\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SelectCube\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SelectNSided.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"UniformPolyhedron\", \"SelectNSided\")\n\nsetup.source.type = \"gyroelongated_pentagonal_bicupola\"\nsetup.modifier.sides = 4\nsetup.modifier.operator = \"greater_or_equal\"\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SelectNSided\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SelectedFacesToPolyhedron.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"SelectedFacesToPolyhedron\")\n\nselection = k3d.geometry.selection.create(0)\nface_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(face_selection, 0, 1, 1)\n\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SelectedFacesToPolyhedron\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SetColor.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"SetColor\")\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SetColor\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SetPosition.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"SetPosition\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.use_y = False\nsetup.modifier.use_z = False\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SetPosition\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.ShearPoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"ShearPoints\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.shear_factor = 1.0\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.ShearPoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SmoothPoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"SmoothPoints\")\n\nsetup.source.rows = 2\nsetup.source.columns = 2\nsetup.source.slices = 2\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SmoothPoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SphereizePoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"SphereizePoints\")\n\nsetup.source.rows = 2\nsetup.source.columns = 2\nsetup.source.slices = 2\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SphereizePoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SubdivideEdges.benchmark.py",
    "content": "#python\n\nimport benchmarking\n\nbenchmarking.mesh_modifier_benchmark(\"SubdivideEdges\", 15, {\"vertices\": 1})"
  },
  {
    "path": "tests/mesh/mesh.modifier.SubdivideEdges.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"K3DMeshReader\", \"SubdivideEdges\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/polyhedron.hole.k3d\")\nsetup.source.center = False\nsetup.source.scale_to_size = False\n\nselection = k3d.geometry.selection.create(0)\nedge_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.EDGE)\nk3d.geometry.primitive_selection.append(edge_selection, 0, 4294967295, 0)\nk3d.geometry.primitive_selection.append(edge_selection, 0, 4, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 27, 28, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 52, 65, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 74, 82, 1)\nsetup.modifier.mesh_selection = selection\nsetup.modifier.vertices = 2\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SubdivideEdges\", 8)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SubdivideFaces.Center.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"K3DMeshReader\", \"SubdivideFaces\")\n\n# load a mesh that has multiple polyhedra, triangles, quads, n-sided polygons and holes. (i.e. a mesh from hell)\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/polyhedron.hole.k3d\")\nsetup.source.center = False\nsetup.source.scale_to_size = False\n\n# select some faces, distributed along polyhedra\nselection = k3d.geometry.selection.create(0)\nface_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(face_selection, 0, 6, 0)\nk3d.geometry.primitive_selection.append(face_selection, 6, 7, 1)\nk3d.geometry.primitive_selection.append(face_selection, 7, 8, 0)\nk3d.geometry.primitive_selection.append(face_selection, 8, 9, 1)\nk3d.geometry.primitive_selection.append(face_selection, 9, 13, 0)\nk3d.geometry.primitive_selection.append(face_selection, 13, 15, 1)\nk3d.geometry.primitive_selection.append(face_selection, 15, 16, 0)\nk3d.geometry.primitive_selection.append(face_selection, 16, 17, 1)\nk3d.geometry.primitive_selection.append(face_selection, 17, 19, 0)\nk3d.geometry.primitive_selection.append(face_selection, 19, 20, 1)\nk3d.geometry.primitive_selection.append(face_selection, 20, 23, 0)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.subdivision_type = \"center\"\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SubdivideFaces.Center\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SubdivideFaces.CenterMidpoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"K3DMeshReader\", \"SubdivideFaces\")\n# load a mesh that has multiple polyhedra, triangles, quads, n-sided polygons and holes. (i.e. a mesh from hell)\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/polyhedron.hole.k3d\")\nsetup.source.center = False\nsetup.source.scale_to_size = False\n\n#testing.add_point_attributes_test(setup, True, True, False)\n\n# select some faces, distributed along polyhedra\nselection = k3d.geometry.selection.create(0)\nface_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(face_selection, 0, 6, 0)\nk3d.geometry.primitive_selection.append(face_selection, 6, 7, 1)\nk3d.geometry.primitive_selection.append(face_selection, 7, 8, 0)\nk3d.geometry.primitive_selection.append(face_selection, 8, 9, 1)\nk3d.geometry.primitive_selection.append(face_selection, 9, 13, 0)\nk3d.geometry.primitive_selection.append(face_selection, 13, 15, 1)\nk3d.geometry.primitive_selection.append(face_selection, 15, 16, 0)\nk3d.geometry.primitive_selection.append(face_selection, 16, 17, 1)\nk3d.geometry.primitive_selection.append(face_selection, 17, 19, 0)\nk3d.geometry.primitive_selection.append(face_selection, 19, 20, 1)\nk3d.geometry.primitive_selection.append(face_selection, 20, 23, 0)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.subdivision_type = \"centermidpoints\"\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\n#testing.require_valid_point_attributes(setup.document, setup.modifier.output_mesh)\n#testing.require_valid_vertex_attributes(setup.document, setup.modifier.output_mesh)\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SubdivideFaces.CenterMidpoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.SubdivideFaces.Midpoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"K3DMeshReader\", \"SubdivideFaces\")\n\n# load a mesh that has multiple polyhedra, triangles, quads, n-sided polygons and holes. (i.e. a mesh from hell)\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/polyhedron.hole.k3d\")\nsetup.source.center = False\nsetup.source.scale_to_size = False\n\n# select some faces, distributed along polyhedra\nselection = k3d.geometry.selection.create(0)\nface_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(face_selection, 0, 6, 0)\nk3d.geometry.primitive_selection.append(face_selection, 6, 7, 1)\nk3d.geometry.primitive_selection.append(face_selection, 7, 8, 0)\nk3d.geometry.primitive_selection.append(face_selection, 8, 9, 1)\nk3d.geometry.primitive_selection.append(face_selection, 9, 13, 0)\nk3d.geometry.primitive_selection.append(face_selection, 13, 15, 1)\nk3d.geometry.primitive_selection.append(face_selection, 15, 16, 0)\nk3d.geometry.primitive_selection.append(face_selection, 16, 17, 1)\nk3d.geometry.primitive_selection.append(face_selection, 17, 19, 0)\nk3d.geometry.primitive_selection.append(face_selection, 19, 20, 1)\nk3d.geometry.primitive_selection.append(face_selection, 20, 23, 0)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.subdivision_type = \"midpoints\"\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.SubdivideFaces.Midpoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.TaperPoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCylinder\", \"TaperPoints\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.taper_factor = 1\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.TaperPoints\", 4, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.TransformPoints.benchmark.py",
    "content": "#python\n\nimport benchmarking\n\nbenchmarking.mesh_modifier_benchmark(\"TransformPoints\")\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.TransformPoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"TransformPoints\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.input_matrix = k3d.translate3(k3d.vector3(0, 0, 1))\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.TransformPoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.TranslatePoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"TranslatePoints\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.x = 1.0\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.TranslatePoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.TriangulateFaces.PolyCube.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"TriangulateFaces\")\n\nmesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.mesh_selection = mesh_selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.TriangulateFaces.PolyCube\", 0)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.TriangulateFaces.PolyGrid.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"TriangulateFaces\")\nsetup.source.rows = 1\nsetup.source.columns = 1\n\nmesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.mesh_selection = mesh_selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.TriangulateFaces.PolyGrid\", 0)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.TriangulateFaces.PolyGrid.selection.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"TriangulateFaces\")\nsetup.source.rows = 3\nsetup.source.columns = 3\n\nselection = k3d.geometry.selection.create(0)\nface_selection = k3d.geometry.primitive_selection.create(selection)\nface_selection.primitive_begin().append(0)\nface_selection.primitive_end().append(1)\nface_selection.primitive_selection_type().append(k3d.selection.type.FACE)\nface_selection.primitive_first_range().append(0)\nface_selection.primitive_range_count().append(1)\nface_selection.index_begin().append(0)\nface_selection.index_end().append(3)\nface_selection.weight().append(1)\n\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.TriangulateFaces.PolyGrid.selection\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.TriangulateFaces.self_intersection.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"FrozenMesh\", \"TriangulateFaces\")\n\nmesh = setup.source.create_mesh()\n\npositions = [(-5, 5, 0), (5, 5, 0), (-5, -5, 0), (5, -5, 0)]\n\npoints = mesh.create_points()\npoint_selection = mesh.create_point_selection()\n\nfor position in positions:\n\tpoints.append(k3d.point3(position[0], position[1], position[2]))\n\tpoint_selection.append(0.0)\n\npolyhedron = k3d.polyhedron.create(mesh)\npolyhedron.shell_types().append(k3d.polyhedron.shell_type.POLYGONS)\npolyhedron.face_shells().append(0)\npolyhedron.face_first_loops().append(0)\npolyhedron.face_loop_counts().append(1)\npolyhedron.face_materials().append(None)\npolyhedron.face_selections().append(0.0)\npolyhedron.loop_first_edges().append(0)\npolyhedron.clockwise_edges().assign([1, 2, 3, 0])\npolyhedron.edge_selections().assign([0, 0, 0, 0])\npolyhedron.vertex_points().assign([0, 1, 2, 3])\npolyhedron.vertex_selections().assign([0, 0, 0, 0])\n\nCs = polyhedron.vertex_attributes().create(\"Cs\", \"k3d::color\")\nCs.assign([k3d.color(1, 0, 0), k3d.color(0, 1, 0), k3d.color(0, 0, 1), k3d.color(1, 1, 1)])\n\nmesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.mesh_selection = mesh_selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.TriangulateFaces.self_intersection\", 0)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.TriangulateFaces.vertex.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"FrozenMesh\", \"TriangulateFaces\")\n\nmesh = setup.source.create_mesh()\n\npoints = mesh.create_points()\npoint_selection = mesh.create_point_selection()\n\npolyhedron = k3d.polyhedron.create(mesh)\nCs = polyhedron.vertex_attributes().create(\"Cs\", \"k3d::color\")\n\npositions = [(0, 0, 1), (1, 0, 1), (2, 0, 0), (2, 0, 1), (1, 0, 0), (0, 0, 0)]\nfor position in positions:\n\tpoints.append(k3d.point3(position[0], position[1], position[2]))\n\tpoint_selection.append(0)\n\npolyhedron.shell_types().append(k3d.polyhedron.shell_type.POLYGONS)\n\npolyhedron.face_shells().append(0)\npolyhedron.face_first_loops().append(len(polyhedron.loop_first_edges()))\npolyhedron.face_loop_counts().append(1)\npolyhedron.face_materials().append(None)\npolyhedron.face_selections().append(0)\n\npolyhedron.loop_first_edges().append(len(polyhedron.clockwise_edges()))\n\npolyhedron.clockwise_edges().append(1)\npolyhedron.edge_selections().append(0)\npolyhedron.vertex_points().append(0)\npolyhedron.vertex_selections().append(0)\nCs.append(k3d.color(1, 0, 0))\n\npolyhedron.clockwise_edges().append(2)\npolyhedron.edge_selections().append(0)\npolyhedron.vertex_points().append(1)\npolyhedron.vertex_selections().append(0)\nCs.append(k3d.color(0, 1, 0))\n\npolyhedron.clockwise_edges().append(3)\npolyhedron.edge_selections().append(0)\npolyhedron.vertex_points().append(4)\npolyhedron.vertex_selections().append(0)\nCs.append(k3d.color(0, 0, 1))\n\npolyhedron.clockwise_edges().append(0)\npolyhedron.edge_selections().append(0)\npolyhedron.vertex_points().append(5)\npolyhedron.vertex_selections().append(0)\nCs.append(k3d.color(1, 1, 1))\n\npolyhedron.face_shells().append(0)\npolyhedron.face_first_loops().append(len(polyhedron.loop_first_edges()))\npolyhedron.face_loop_counts().append(1)\npolyhedron.face_materials().append(None)\npolyhedron.face_selections().append(0)\n\npolyhedron.loop_first_edges().append(len(polyhedron.clockwise_edges()))\n\npolyhedron.clockwise_edges().append(5)\npolyhedron.edge_selections().append(0)\npolyhedron.vertex_points().append(1)\npolyhedron.vertex_selections().append(0)\nCs.append(k3d.color(1, 0, 0))\n\npolyhedron.clockwise_edges().append(6)\npolyhedron.edge_selections().append(0)\npolyhedron.vertex_points().append(2)\npolyhedron.vertex_selections().append(0)\nCs.append(k3d.color(0, 1, 0))\n\npolyhedron.clockwise_edges().append(7)\npolyhedron.edge_selections().append(0)\npolyhedron.vertex_points().append(3)\npolyhedron.vertex_selections().append(0)\nCs.append(k3d.color(0, 0, 1))\n\npolyhedron.clockwise_edges().append(4)\npolyhedron.edge_selections().append(0)\npolyhedron.vertex_points().append(4)\npolyhedron.vertex_selections().append(0)\nCs.append(k3d.color(1, 1, 1))\n\nmesh_selection = k3d.geometry.selection.create(1)\nsetup.modifier.mesh_selection = mesh_selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.TriangulateFaces.vertex\", 0)\n\n"
  },
  {
    "path": "tests/mesh/mesh.modifier.TwistPoints.py",
    "content": "#python\n\nimport k3d\nimport math\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"TwistPoints\")\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\n\nsetup.modifier.mesh_selection = selection\nsetup.modifier.angle = math.radians(20.0)\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.TwistPoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.selection.GrowSelection.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"GrowSelection\")\n\nselection = k3d.geometry.selection.create(0)\n\npoint_selection = k3d.geometry.point_selection.create(selection)\nk3d.geometry.point_selection.append(point_selection, 15, 16, 1)\nk3d.geometry.point_selection.append(point_selection, 18, 19, 1)\n\nedge_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.EDGE)\nk3d.geometry.primitive_selection.append(edge_selection, 17, 18, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 55, 56, 1)\n\nface_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(face_selection, 12, 13, 1)\n\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.selection.GrowSelection\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.selection.SelectBoundaryEdges.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"SelectBoundaryEdges\")\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(0)\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.selection.SelectBoundaryEdges\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.selection.SelectDegenerateFaces.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\ngrid = k3d.plugin.create(\"PolyGrid\", document)\nscale = k3d.plugin.create(\"ScalePoints\", document)\nselect = k3d.plugin.create(\"SelectDegenerateFaces\", document)\n\nselection = k3d.geometry.selection.create(0)\npoint_selection = k3d.geometry.point_selection.create(selection)\nk3d.geometry.point_selection.append(point_selection, 0, 10000, 0.)\nk3d.geometry.point_selection.append(point_selection, 0, 12, 1.)\n\nscale.mesh_selection = selection\nscale.x = 0.\n\nk3d.property.connect(document, grid.get_property(\"output_mesh\"), scale.get_property(\"input_mesh\"))\nk3d.property.connect(document, scale.get_property(\"output_mesh\"), select.get_property(\"input_mesh\"))\n\ntesting.require_valid_mesh(document, select.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, select.get_property(\"output_mesh\"), \"mesh.selection.SelectDegenerateFaces\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.selection.all.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"ScalePoints\")\n\nsetup.source.rows = 1\nsetup.source.columns = 1\n\nmesh_selection = k3d.geometry.selection.create(1.0)\nsetup.modifier.mesh_selection = mesh_selection\nsetup.modifier.x = 2\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.selection.all\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.selection.none.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"ScalePoints\")\n\nsetup.source.rows = 1\nsetup.source.columns = 1\n\nmesh_selection = k3d.geometry.selection.create(0.0)\nsetup.modifier.mesh_selection = mesh_selection\nsetup.modifier.x = 2\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.selection.none\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.selection.null.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"ScalePoints\")\n\nsetup.source.rows = 1\nsetup.source.columns = 1\n\nmesh_selection = k3d.selection.set()\nsetup.modifier.mesh_selection = mesh_selection\nsetup.modifier.x = 2\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.selection.null\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.selection.points.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"ScalePoints\")\n\nsetup.source.rows = 1\nsetup.source.columns = 1\n\nmesh_selection = k3d.geometry.selection.create(0.0)\npoint_selection = k3d.geometry.point_selection.create(mesh_selection)\npoint_selection.index_begin().append(0)\npoint_selection.index_end().append(2)\npoint_selection.weight().append(1)\n\nsetup.modifier.mesh_selection = mesh_selection\nsetup.modifier.x = 2\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.selection.points\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.serialization.py",
    "content": "#python\n\nimport k3d\nimport sys\nimport testing\n\nsetup = testing.setup_mesh_writer_test([\"FrozenMesh\", \"K3DMeshWriter\"], \"K3DMeshReader\", \"mesh.serialization.k3d\")\n\nmesh = setup.source.create_mesh()\nprimitive = mesh.primitives().create(\"test\")\n\narray_types = [ \"k3d::bool_t\", \"k3d::color\", \"k3d::double_t\", \"k3d::imaterial*\", \"k3d::inode*\", \"k3d::int16_t\", \"k3d::int32_t\", \"k3d::int64_t\", \"k3d::int8_t\", \"k3d::matrix4\", \"k3d::normal3\", \"k3d::point2\", \"k3d::point3\", \"k3d::point4\", \"k3d::string_t\", \"k3d::texture3\", \"k3d::uint16_t\", \"k3d::uint32_t\", \"k3d::uint64_t\", \"k3d::uint8_t\", \"k3d::vector2\", \"k3d::vector3\", \"k3d::uint_t\" ]\narray_values = [ True, k3d.color(1, 2, 3), 1.0, None, None, 1, 2, 3, 4, k3d.identity3(), k3d.normal3(1, 2, 3), k3d.point2(1, 2), k3d.point3(1, 2, 3), k3d.point4(1, 2, 3, 4), \"A String\", k3d.texture3(1, 2, 3), 1, 2, 3, 4, k3d.vector2(1, 2), k3d.vector3(1, 2, 3), 7 ]\n\nstructure = primitive.structure().create(\"generic\")\nattributes = primitive.attributes().create(\"generic\")\n\nfor i in range(len(array_types)):\n\ttype = array_types[i]\n\tvalue = array_values[i]\n\n\tstructure_array = structure.create(type, type)\n\tstructure_array.append(value)\n\tstructure_array.append(value)\n\tstructure_array.append(value)\n\n\tattribute_array = attributes.create(type, type)\n\tattribute_array.append(value)\n\tattribute_array.append(value)\n\tattribute_array.append(value)\n\nsetup.source.set_mesh(mesh) # This is a bit of a hack, it forces the writer to send the current mesh to disk\n\nresult = k3d.difference.accumulator()\nk3d.difference.test(setup.source.output_mesh, setup.reader.output_mesh, result)\n\nif not (result.exact_min() == True and result.ulps_max() == 0):\n\traise Exception(\"serialized mesh differs from reference\")\n\n"
  },
  {
    "path": "tests/mesh/mesh.sink.GmshGeoMeshWriter.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ntarget_file = \"mesh.sink.GmshGeoMeshWriter.geo\"\n\nsetup = testing.setup_mesh_test([\"PolyCube\", \"GmshGeoMeshWriter\"])\nsetup.sink.file = k3d.filesystem.generic_path(testing.binary_path() + \"/meshes/\" + target_file)\n\n"
  },
  {
    "path": "tests/mesh/mesh.sink.IGESMeshWriter.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ntarget_file = \"mesh.sink.IGESMeshWriter.iges\"\n\nsetup = testing.setup_mesh_test([\"NurbsCylinder\", \"IGESMeshWriter\"])\nsetup.sink.file = k3d.filesystem.generic_path(testing.binary_path() + \"/meshes/\" + target_file)\n\n"
  },
  {
    "path": "tests/mesh/mesh.sink.K3DMeshWriter.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_writer_test([\"PolyCube\", \"AddIndexAttributes\", \"K3DMeshWriter\"], \"K3DMeshReader\", \"mesh.sink.K3DMeshWriter.k3d\")\n\ntesting.require_valid_mesh(setup.document, setup.reader.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.reader.get_property(\"output_mesh\"), \"mesh.sink.K3DMeshWriter\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.sink.OBJMeshWriter.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_writer_test([\"PolyCube\", \"OBJMeshWriter\"], \"OBJMeshReader\", \"mesh.sink.OBJMeshWriter.obj\")\n\ntesting.require_valid_mesh(setup.document, setup.reader.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.reader.get_property(\"output_mesh\"), \"mesh.sink.OBJMeshWriter\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.sink.PLYMeshWriter.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_writer_test([\"PolyCube\", \"PLYMeshWriter\"], \"PLYMeshReader\", \"mesh.sink.PLYMeshWriter.ply\")\n\ntesting.require_valid_mesh(setup.document, setup.reader.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.reader.get_property(\"output_mesh\"), \"mesh.sink.PLYMeshWriter\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.sink.PointsCentroid.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndoc = k3d.new_document()\nsource = k3d.plugin.create(\"PolyGrid\", doc)\ncentroid = k3d.plugin.create(\"PointsCentroid\", doc)\n\nsource.rows = 1\nsource.columns = 1\n\nselection = k3d.geometry.selection.create(0)\npoint_selection = k3d.geometry.point_selection.create(selection)\nk3d.geometry.point_selection.append(point_selection, 0, 2, 1)\ncentroid.mesh_selection = selection\n\nk3d.property.connect(doc, source.get_property(\"output_mesh\"), centroid.get_property(\"input_mesh\"))\n\nif centroid.centroid != k3d.point3(0, 5, 0):\n\traise \"unexpected output_vector: \" + str(centroid.centroid)\n\n"
  },
  {
    "path": "tests/mesh/mesh.sink.STLMeshWriter.magics.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_writer_test([\"PolyCube\", \"TriangulateFaces\", \"STLMeshWriter\"], \"STLMeshReader\", \"mesh.sink.STLMeshWriter.magics.stl\")\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\nsetup.writer.file_type = \"magics\"\n\ntesting.require_valid_mesh(setup.document, setup.reader.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.reader.get_property(\"output_mesh\"), \"mesh.sink.STLMeshWriter.magics\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.sink.STLMeshWriter.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_writer_test([\"PolyCube\", \"TriangulateFaces\", \"STLMeshWriter\"], \"STLMeshReader\", \"mesh.sink.STLMeshWriter.stl\")\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\n\ntesting.require_valid_mesh(setup.document, setup.reader.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.reader.get_property(\"output_mesh\"), \"mesh.sink.STLMeshWriter\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.sink.STLMeshWriter.viscam.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_writer_test([\"PolyCube\", \"TriangulateFaces\", \"STLMeshWriter\"], \"STLMeshReader\", \"mesh.sink.STLMeshWriter.viscam.stl\")\nsetup.modifier.mesh_selection = k3d.geometry.selection.create(1)\nsetup.writer.file_type = \"viscam\"\n\ntesting.require_valid_mesh(setup.document, setup.reader.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.reader.get_property(\"output_mesh\"), \"mesh.sink.STLMeshWriter.viscam\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.solid.failure.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyDisk\")\nif k3d.polyhedron.is_solid(k3d.polyhedron.validate(setup.source.output_mesh, setup.source.output_mesh.primitives()[0])):\n  raise Exception(\"Expected non-solid polyhedron\")\n\n"
  },
  {
    "path": "tests/mesh/mesh.solid.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyCube\")\nif not k3d.polyhedron.is_solid(k3d.polyhedron.validate(setup.source.output_mesh, setup.source.output_mesh.primitives()[0])):\n  raise Exception(\"Expected solid polyhedron\")\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.3DSMeshReader.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"3DSMeshReader\", \"mesh.source.3DSMeshReader.test.3ds\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.3DSMeshReader.test\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.BenchmarkComparison.py",
    "content": "#python\n\nimport benchmarking\n\ncompare_list = [\"PolyGrid\", \n                ]\n\nfor run in compare_list:\n    try:\n        benchmarking.generate_comparison_image(run, (run, \"CUDA\"+run), plotLabels=('Mesh Size', 'Time [s]'), calculate_speedup = True)\n    except:\n        print \"Error with: \" + run\n"
  },
  {
    "path": "tests/mesh/mesh.source.BlobbyEllipsoid.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"BlobbyEllipsoid\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.BlobbyEllipsoid\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.BlobbySegment.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"BlobbySegment\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.BlobbySegment\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.COLLADAMeshReader.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"COLLADAMeshReader\", \"mesh.source.COLLADAMeshReader.duck.dae\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.COLLADAMeshReader.duck\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.CUDA.Breakdown.py",
    "content": "#python\n\nimport benchmarking\n\ncolumns = [\"Update Topology:init\",\n           \"Update Topology:DeviceAllocate\",\n           \"Update Topology:Kernel\",\n           \"Update Topology:Copy\",\n           \"Update Geometry:init\",\n           \"Update Geometry:Kernel\",\n           \"Update Geometry:Copy\",\n           \"Total\"]\n           \n\nbenchmarking.generate_component_image(\"CUDAPolyGridBreakdown\", \"CUDAPolyGrid\", columns )\n\ncolumns = [\"Update Topology\",\n           \"Update Mesh Topology\",\n           \"Update Geometry\",\n           \"Update Mesh Geometry\",\n           \"Total\"]\n\nbenchmarking.generate_component_image(\"PolyGridBreakdown\", \"PolyGrid\", columns )\n\n\n\ncolumns = [\"Update Topology:init\",\n           \"Update Topology:DeviceAllocate\",\n           \"Update Topology:Kernel\",\n           \"Update Topology:Copy\",\n           \"Update Geometry:init\",\n           \"Update Geometry:Kernel\",\n           \"Update Geometry:Transform Points\",\n           \"Update Geometry:Copy\",\n           \"Total\"]\n\n\nbenchmarking.generate_component_image(\"CUDAPolyGridAndTransformPointsBreakdown\", \"CUDAPolyGridAndTransformPoints\", columns )\n"
  },
  {
    "path": "tests/mesh/mesh.source.CUDAPolyGrid.benchmark.py",
    "content": "#python\n\nimport benchmarking\n\nbenchmarking.mesh_source_benchmark(\"CUDAPolyGrid\", properties = {\"rows\" : benchmarking.polyGridRange, \"columns\" : benchmarking.polyGridRange})"
  },
  {
    "path": "tests/mesh/mesh.source.CUDAPolyGrid.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"CUDAPolyGrid\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyGrid\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.CUDAPolyGridAndTransformPoints.benchmark.py",
    "content": "#python\n\nimport benchmarking\n\nbenchmarking.mesh_source_benchmark(\"CUDAPolyGridAndTransformPoints\", properties = {\"rows\" : benchmarking.polyGridRange, \"columns\" : benchmarking.polyGridRange})"
  },
  {
    "path": "tests/mesh/mesh.source.CUDAPolyGridAndTransformPoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"CUDAPolyGridAndTransformPoints\")\n\nsetup.source.input_matrix = k3d.translate3(k3d.vector3(0, 0, 1))\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyGridAndTransformPoints\", 1)\n"
  },
  {
    "path": "tests/mesh/mesh.source.GTSMeshReader.cube.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"GTSMeshReader\", \"mesh.source.GTSMeshReader.cube.gts\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.GTSMeshReader.cube\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.GTSMeshReader.gz.cube.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"GTSMeshReader\", \"mesh.source.GTSMeshReader.cube.gts.gz\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.GTSMeshReader.gz.cube\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.LSystemParser.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"LSystemParser\")\nsetup.source.growth = 2\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.LSystemParser\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MD2MeshReader.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"MD2MeshReader\", \"mesh.source.MD2MeshReader.md2\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MD2MeshReader\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.bezier_triangle_patches.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/bezier_triangle_patches.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.bezier_triangle_patches\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.bicubic.patches.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/bicubic_patches.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.bicubic.patches\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.bilinear.patches.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/bilinear_patches.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.bilinear.patches\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.blobby.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/blobby.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.blobby\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.cones.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/cones.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.cones\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.cubic.curves.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/cubic_curves.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.cubic.curves\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.cylinders.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/cylinders.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.cylinders\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.disks.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/disks.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.disks\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.hyperboloids.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/hyperboloids.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.hyperboloids\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.linear.curves.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/linear_curves.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.linear.curves\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.nurbs.curves.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/nurbs_curves.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.nurbs.curves\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.nurbs.patches.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/nurbs_patches.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.nurbs.patches\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.paraboloids.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/paraboloids.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.paraboloids\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.particles.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/particles.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.particles\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.polyhedra.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/polyhedra.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.polyhedra\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.simple_polyhedron.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/simple_polyhedron.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.simple_polyhedron\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.spheres.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/spheres.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.spheres\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.teapots.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/teapots.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.teapots\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.MeshSourceScript.tori.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nscript_path = k3d.share_path() / k3d.filesystem.generic_path(\"scripts/MeshSourceScript/tori.py\")\nscript_file = file(str(script_path), \"r\")\n\nsetup = testing.setup_mesh_source_test(\"MeshSourceScript\")\nsetup.source.script = script_file.read()\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.MeshSourceScript.tori\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.Newell.teacup.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"Newell\")\nsetup.source.type = \"teacup\"\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.Newell.teacup\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.Newell.teapot.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"Newell\")\nsetup.source.type = \"teapot\"\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.Newell.teapot\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.Newell.teaspoon.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"Newell\")\nsetup.source.type = \"teaspoon\"\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.Newell.teaspoon\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.NurbsCircle.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"NurbsCircle\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.NurbsCircle\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.NurbsCone.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"NurbsCone\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.NurbsCone\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.NurbsCurve.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"NurbsCurve\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.NurbsCurve\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.NurbsCylinder.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"NurbsCylinder\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.NurbsCylinder\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.NurbsDisk.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"NurbsDisk\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.NurbsDisk\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.NurbsGrid.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"NurbsGrid\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.NurbsGrid\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.NurbsHyperboloid.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"NurbsHyperboloid\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.NurbsHyperboloid\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.NurbsParaboloid.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"NurbsParaboloid\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.NurbsParaboloid\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.NurbsPolygon.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"NurbsPolygon\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.NurbsPolygon\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.NurbsSphere.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"NurbsSphere\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.NurbsSphere\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.NurbsTorus.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"NurbsTorus\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.NurbsTorus\", 3, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.OBJMeshReader.nurbs.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"OBJMeshReader\", \"mesh.source.OBJMeshReader.nurbs.obj\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.OBJMeshReader.nurbs\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.OBJMeshReader.polyhedron.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"OBJMeshReader\", \"mesh.source.OBJMeshReader.polyhedron.obj\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.OBJMeshReader.polyhedron\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PLYMeshReader.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"PLYMeshReader\", \"mesh.source.PLYMeshReader.ply\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PLYMeshReader\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolyCone.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyCone\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyCone\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolyCube.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyCube\")\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyCube\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolyCushion.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyCushion\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyCushion\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolyCylinder.caps.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyCylinder\")\n\nsetup.source.top_segments = 2\nsetup.source.bottom_segments = 2\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyCylinder.caps\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolyCylinder.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyCylinder\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyCylinder\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolyDisk.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyDisk\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyDisk\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolyGrid.benchmark.py",
    "content": "#python\n\nimport benchmarking\n\nbenchmarking.mesh_source_benchmark(\"PolyGrid\", properties = {\"rows\" : benchmarking.polyGridRange, \"columns\" : benchmarking.polyGridRange})\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolyGrid.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyGrid\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyGrid\", 2)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolyIcosahedron.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyIcosahedron\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyIcosahedron\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolySphere.1.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolySphere\")\n\nsetup.source.type = \"sphere\"\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolySphere.1\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolySphere.2.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolySphere\")\n\nsetup.source.type = \"quad_only_sphere\"\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolySphere.2\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolySphere.3.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolySphere\")\n\nsetup.source.type = \"sphereized_cylinder\"\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolySphere.3\", 2, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolyText.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyText\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyText\", 3, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.PolyTorus.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"PolyTorus\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.PolyTorus\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.QuadricCone.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"QuadricCone\")\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.QuadricCone\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.QuadricCylinder.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"QuadricCylinder\")\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.QuadricCylinder\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.QuadricDisk.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"QuadricDisk\")\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.QuadricDisk\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.QuadricHyperboloid.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"QuadricHyperboloid\")\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.QuadricHyperboloid\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.QuadricLogo.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"QuadricLogo\")\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.QuadricLogo\", 1, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.QuadricParaboloid.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"QuadricParaboloid\")\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.QuadricParaboloid\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.QuadricSphere.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"QuadricSphere\")\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.QuadricSphere\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.QuadricTorus.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"QuadricTorus\")\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.QuadricTorus\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.STLMeshReader.magics.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"STLMeshReader\", \"mesh.source.STLMeshReader.magics.stl\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.STLMeshReader.magics\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.STLMeshReader.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"STLMeshReader\", \"mesh.source.STLMeshReader.stl\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.STLMeshReader\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.STLMeshReader.viscam.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"STLMeshReader\", \"mesh.source.STLMeshReader.viscam.stl\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.STLMeshReader.viscam\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.SVGMeshReader.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_reader_test(\"SVGMeshReader\", \"mesh.source.SVGMeshReader.svg\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.SVGMeshReader\", 4)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.SurfacePlot.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"SurfacePlot\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.SurfacePlot\", 8192)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.Teapot.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"Teapot\")\n\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.Teapot\", 1)\n\n"
  },
  {
    "path": "tests/mesh/mesh.source.reader.bogus_input.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nfactories = k3d.plugin.factory.lookup()\n\nfor factory in factories:\n\tif \"MeshReader\" in factory.categories():\n\n\t\tprint \"\\n\\nTesting \" + factory.name() + \" with a file containing all zeroes ...\"\n\t\tsetup = testing.setup_mesh_reader_test(factory.name(), \"zero_bytes\")\n\t\tmesh = setup.source.output_mesh\n\n\t\tprint \"\\n\\nTesting \" + factory.name() + \" with a file containing random data ...\"\n\t\tsetup = testing.setup_mesh_reader_test(factory.name(), \"random_bytes\")\n\t\tmesh = setup.source.output_mesh\n\n"
  },
  {
    "path": "tests/mesh/mesh.validation.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource = k3d.plugin.create(\"FrozenMesh\", document)\nmesh = source.create_mesh()\npolyhedron = k3d.polyhedron.create(mesh)\nprimitive = mesh.primitives()[0]\n\nif k3d.polyhedron.validate(mesh, primitive):\n\traise Exception(\"validate() should fail on polyhedron with missing points.\")\n\nmesh.create_points()\n\nif k3d.polyhedron.validate(mesh, primitive):\n\traise Exception(\"validate() should fail on polyhedron with missing point_selections.\")\n\nmesh.create_point_selection()\n\nif not k3d.polyhedron.validate(mesh, primitive):\n\traise Exception(\"validate() should succeed.\")\n\npolyhedron.clockwise_edges().append(0)\npolyhedron.edge_selections().append(0)\npolyhedron.vertex_points().append(0)\npolyhedron.vertex_selections().append(0)\n\nif k3d.polyhedron.validate(mesh, primitive):\n\traise Exception(\"validate() should fail on polyhedron with out-of-bound point indices.\")\n\nmesh.points().append(k3d.point3(0, 0, 0))\nmesh.point_selection().append(0)\n\nif not k3d.polyhedron.validate(mesh, primitive):\n\traise Exception(\"validate() should succeed.\")\n\n"
  },
  {
    "path": "tests/mesh/modifier.BicubicToPoly.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"Newell\", \"BicubicToPoly\")\n\nsetup.source.type = \"teapot\"\nsetup.modifier.subdivisions = 3\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.BicubicToPoly\", 8)\n\n"
  },
  {
    "path": "tests/mesh/modifier.DeleteComponents.complex.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"K3DMeshReader\", \"DeleteComponents\")\nsetup.source.file = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/polyhedron.hole.k3d\")\nsetup.source.center = False\nsetup.source.scale_to_size = False\n\nselection = k3d.geometry.selection.create(0)\n\npoint_selection = k3d.geometry.point_selection.create(selection)\nk3d.geometry.point_selection.append(point_selection, 0, 10000, 0)\nk3d.geometry.point_selection.append(point_selection, 7, 8, 1)\n\nface_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(face_selection, 0, 10000, 0)\nk3d.geometry.primitive_selection.append(face_selection, 6, 7, 1)\nk3d.geometry.primitive_selection.append(face_selection, 8, 9, 1)\nk3d.geometry.primitive_selection.append(face_selection, 13, 15, 1)\nk3d.geometry.primitive_selection.append(face_selection, 16, 17, 1)\nk3d.geometry.primitive_selection.append(face_selection, 19, 20, 1)\n\nedge_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.EDGE)\nk3d.geometry.primitive_selection.append(edge_selection, 0, 10000, 0)\nk3d.geometry.primitive_selection.append(edge_selection, 25, 26, 1)\n\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.DeleteComponents.complex\", 1)\n\n"
  },
  {
    "path": "tests/mesh/modifier.DeleteComponents.edge.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"DeleteComponents\")\n\nselection = k3d.geometry.selection.create(0)\nedge_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.EDGE)\nk3d.geometry.primitive_selection.append(edge_selection, 0, 2, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 32, 33, 1)\nk3d.geometry.primitive_selection.append(edge_selection, 48, 52, 1)\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.DeleteComponents.edge\", 2)\n\n"
  },
  {
    "path": "tests/mesh/modifier.DeleteComponents.face.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"DeleteComponents\")\n\nselection = k3d.geometry.selection.create(0)\nface_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(face_selection, 0, 2, 1)\nk3d.geometry.primitive_selection.append(face_selection, 12, 13, 1)\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.DeleteComponents.face\", 2)\n\n"
  },
  {
    "path": "tests/mesh/modifier.DeleteComponents.point.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"DeleteComponents\")\n\nselection = k3d.geometry.selection.create(0)\npoint_selection = k3d.geometry.point_selection.create(selection)\nk3d.geometry.point_selection.append(point_selection, 0, 2, 1)\nk3d.geometry.point_selection.append(point_selection, 14, 15, 1)\nsetup.modifier.mesh_selection = selection\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.DeleteComponents.point\", 2)\n\n"
  },
  {
    "path": "tests/mesh/modifier.DissolveFaces.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"DissolveFaces\")\n\nselection = k3d.selection.set()\nprimitive_selection = k3d.geometry.primitive_selection.create(selection, k3d.selection.type.FACE)\nk3d.geometry.primitive_selection.append(primitive_selection, 0, 2, 1)\nk3d.geometry.primitive_selection.append(primitive_selection, 11, 15, 1)\n\nsetup.modifier.mesh_selection = selection\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"modifier.DissolveFaces\", 2)\n\n"
  },
  {
    "path": "tests/mesh/modifier.PointsToParticles.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"PointsToParticles\")\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.PointsToParticles\", 1)\n\n"
  },
  {
    "path": "tests/mesh/modifier.PolyToBilinear.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nsetup = testing.setup_mesh_modifier_test(\"PolyCube\", \"PolyToBilinear\")\n\n\ntesting.require_valid_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.modifier.get_property(\"output_mesh\"), \"mesh.modifier.PolyToBilinear\", 1)\n\n"
  },
  {
    "path": "tests/mesh/modifier.WeldPoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndocument = k3d.new_document()\n\nsource1 = k3d.plugin.create(\"PolyCube\", document)\nsource2 = k3d.plugin.create(\"PolyCube\", document)\n\nmerge = k3d.plugin.create(\"MergeMesh\", document)\nk3d.property.create(merge, \"k3d::mesh*\", \"input_mesh1\", \"Input Mesh 1\", \"\")\nk3d.property.create(merge, \"k3d::mesh*\", \"input_mesh2\", \"Input Mesh 2\", \"\")\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), merge.get_property(\"input_mesh1\"))\nk3d.property.connect(document, source1.get_property(\"output_mesh\"), merge.get_property(\"input_mesh2\"))\n\nweld = k3d.plugin.create(\"WeldPoints\", document)\nweld.distance = 0.5\nk3d.property.connect(document, merge.get_property(\"output_mesh\"), weld.get_property(\"input_mesh\"))\n\ntesting.require_valid_mesh(document, weld.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(document, weld.get_property(\"output_mesh\"), \"mesh.modifier.WeldPoints\", 1)\n\n"
  },
  {
    "path": "tests/mesh/source.LinearKnot.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"LinearKnot\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.LinearKnot\", 512, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/source.LinearLissajousCurve.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"LinearLissajousCurve\")\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"mesh.source.LinearLissajousCurve\", 32, [\"Darwin-i386\"])\n\n"
  },
  {
    "path": "tests/mesh/source.UniformPolyhedron.py",
    "content": "#python\n\nimport testing\n\nsetup = testing.setup_mesh_source_test(\"UniformPolyhedron\")\nsetup.source.type = \"small_stellated_dodecahedron\"\nsetup.source.size = 5\n\ntesting.require_valid_mesh(setup.document, setup.source.get_property(\"output_mesh\"))\ntesting.require_similar_mesh(setup.document, setup.source.get_property(\"output_mesh\"), \"source.UniformPolyhedron\", 1)\n\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BendPoints.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 -0.99999999999999967 5 -0.19509032201612825 -0.9807852804032301 5 -0.38268343236508978 -0.92387953251128641 5 -0.55557023301960218 -0.8314696123025449 5 -0.70710678118654746 -0.70710678118654724 5 -0.83146961230254512 -0.55557023301960196 5 -0.92387953251128674 -0.3826834323650895 5 -0.98078528040323043 -0.195090322016128 5 -1 2.4492935982947064e-16 5 -0.98078528040323043 0.1950903220161285 5 -0.92387953251128674 0.38268343236509006 5 -0.83146961230254546 0.55557023301960229 5 -0.70710678118654757 0.70710678118654779 5 -0.55557023301960218 0.83146961230254568 5 -0.38268343236508984 0.92387953251128707 5 -0.19509032201612858 0.98078528040323076 5 -1.2246467991473532e-16 1.0000000000000002 5 0.19509032201612836 0.98078528040323076 5 0.38268343236508967 0.92387953251128707 5 0.55557023301960196 0.83146961230254579 5 0.70710678118654746 0.70710678118654802 5 0.83146961230254524 0.55557023301960251 5 0.92387953251128652 0.38268343236509067 5 0.98078528040323032 0.19509032201612897 5 1 4.8985871965894128e-16 5 0.98078528040323043 -0.19509032201612797 5 0.92387953251128663 -0.38268343236508967 5 0.83146961230254557 -0.55557023301960151 5 0.70710678118654768 -0.70710678118654713 5 0.55557023301960218 -0.8314696123025449 5 0.38268343236509039 -0.92387953251128618 5 0.19509032201612872 -0.98078528040322999 3.4147290339516156 0 -1.0576441587903078 3.4109804281180325 -0.19509032201612825 -1.0387986446427209 3.3998786674372248 -0.38268343236508978 -0.9829863247399655 3.3818503863462164 -0.55557023301960218 -0.89235203523599482 3.357588401576959 -0.70710678118654746 -0.77037880104815093 3.3280250875978572 -0.83146961230254512 -0.62175398516289615 3.29429654598583 -0.92387953251128674 -0.45218915590494246 3.2576989456798442 -0.98078528040323043 -0.26820059456962264 3.2196387119354872 -1 -0.07685887838707739 3.1815784781911312 -0.98078528040323043 0.11448283779546742 3.1449808778851449 -0.92387953251128674 0.29847139913078724 3.1112523362731181 -0.83146961230254546 0.46803622838874137 3.0816890222940163 -0.70710678118654757 0.61666104427399571 3.0574270375247585 -0.55557023301960218 0.73863427846184049 3.0393987564337506 -0.38268343236508984 0.82926856796581028 3.0282969957529424 -0.19509032201612858 0.88508088786856565 3.0245483899193593 -1.2246467991473532e-16 0.90392640201615304 3.0282969957529424 0.19509032201612836 0.88508088786856565 3.0393987564337506 0.38268343236508967 0.82926856796581028 3.0574270375247585 0.55557023301960196 0.73863427846184049 3.0816890222940159 0.70710678118654746 0.61666104427399659 3.1112523362731181 0.83146961230254524 0.46803622838874137 3.1449808778851445 0.92387953251128652 0.29847139913078813 3.1815784781911307 0.98078528040323032 0.11448283779546831 3.2196387119354872 1 -0.07685887838707739 3.2576989456798442 0.98078528040323043 -0.26820059456962264 3.29429654598583 0.92387953251128663 -0.45218915590494291 3.3280250875978572 0.83146961230254557 -0.62175398516289571 3.357588401576959 0.70710678118654768 -0.77037880104815093 3.3818503863462164 0.55557023301960218 -0.89235203523599482 3.3998786674372243 0.38268343236509039 -0.98298632473996506 3.4109804281180325 0.19509032201612872 -1.0387986446427209 2.3332893009411935 0 -1.505591163092364 2.32261417469741 -0.19509032201612825 -1.4896147076387356 2.2909990350809282 -0.38268343236508978 -1.4422993075012354 2.2396588341772348 -0.55557023301960218 -1.3654632669723639 2.1705665471151425 -0.70710678118654746 -1.2620593519994978 2.0863773517390465 -0.83146961230254512 -1.1360613170454621 1.9903265916134054 -0.92387953251128674 -0.99231119593302708 1.8861054435839608 -0.98078528040323043 -0.83633322520054776 1.7777190679215913 -1 -0.67412155078981861 1.6693326922592218 -0.98078528040323043 -0.51190987637909036 1.5651115442297772 -0.92387953251128674 -0.35593190564661059 1.4690607841041361 -0.83146961230254546 -0.21218178453417558 1.3848715887280405 -0.70710678118654757 -0.086183749580139857 1.3157793016659474 -0.55557023301960218 0.017220165392726194 1.2644391007622544 -0.38268343236508984 0.094056205921597247 1.2328239611457725 -0.19509032201612858 0.14137160605909838 1.2221488349019891 -1.2246467991473532e-16 0.15734806151272629 1.2328239611457725 0.19509032201612836 0.14137160605909838 1.2644391007622544 0.38268343236508967 0.094056205921597247 1.3157793016659474 0.55557023301960196 0.017220165392726194 1.3848715887280401 0.70710678118654746 -0.086183749580138969 1.4690607841041361 0.83146961230254524 -0.21218178453417558 1.5651115442297767 0.92387953251128652 -0.3559319056466097 1.6693326922592213 0.98078528040323032 -0.51190987637908947 1.7777190679215913 1 -0.67412155078981861 1.8861054435839608 0.98078528040323043 -0.83633322520054776 1.9903265916134054 0.92387953251128663 -0.99231119593302752 2.086377351739046 0.83146961230254557 -1.1360613170454616 2.1705665471151425 0.70710678118654768 -1.2620593519994978 2.2396588341772348 0.55557023301960218 -1.3654632669723639 2.2909990350809277 0.38268343236509039 -1.4422993075012349 2.32261417469741 0.19509032201612872 -1.4896147076387356 1.5055911630923648 0 -2.3332893009411926 1.4896147076387365 -0.19509032201612825 -2.3226141746974092 1.4422993075012362 -0.38268343236508978 -2.2909990350809273 1.3654632669723648 -0.55557023301960218 -2.2396588341772339 1.2620593519994987 -0.70710678118654746 -2.1705665471151416 1.136061317045463 -0.83146961230254512 -2.0863773517390456 0.99231119593302797 -0.92387953251128674 -1.9903265916134045 0.83633322520054865 -0.98078528040323043 -1.8861054435839599 0.6741215507898195 -1 -1.7777190679215904 0.51190987637909124 -0.98078528040323043 -1.6693326922592209 0.35593190564661148 -0.92387953251128674 -1.5651115442297763 0.21218178453417647 -0.83146961230254546 -1.4690607841041352 0.086183749580140745 -0.70710678118654757 -1.3848715887280396 -0.017220165392725306 -0.55557023301960218 -1.3157793016659465 -0.094056205921596359 -0.38268343236508984 -1.2644391007622535 -0.14137160605909749 -0.19509032201612858 -1.2328239611457716 -0.1573480615127254 -1.2246467991473532e-16 -1.2221488349019882 -0.14137160605909749 0.19509032201612836 -1.2328239611457716 -0.094056205921596359 0.38268343236508967 -1.2644391007622535 -0.017220165392725306 0.55557023301960196 -1.3157793016659465 0.086183749580139857 0.70710678118654746 -1.3848715887280392 0.21218178453417647 0.83146961230254524 -1.4690607841041352 0.35593190564661059 0.92387953251128652 -1.5651115442297758 0.51190987637909036 0.98078528040323032 -1.6693326922592204 0.6741215507898195 1 -1.7777190679215904 0.83633322520054865 0.98078528040323043 -1.8861054435839599 0.99231119593302841 0.92387953251128663 -1.9903265916134045 1.1360613170454625 0.83146961230254557 -2.0863773517390451 1.2620593519994987 0.70710678118654768 -2.1705665471151416 1.3654632669723648 0.55557023301960218 -2.2396588341772339 1.4422993075012358 0.38268343236509039 -2.2909990350809268 1.4896147076387365 0.19509032201612872 -2.3226141746974092 1.0576441587903087 0 -3.4147290339516148 1.0387986446427218 -0.19509032201612825 -3.4109804281180316 0.98298632473996639 -0.38268343236508978 -3.3998786674372239 0.89235203523599571 -0.55557023301960218 -3.3818503863462155 0.77037880104815182 -0.70710678118654746 -3.3575884015769581 0.62175398516289704 -0.83146961230254512 -3.3280250875978563 0.45218915590494335 -0.92387953251128674 -3.2942965459858291 0.26820059456962353 -0.98078528040323043 -3.2576989456798433 0.076858878387078278 -1 -3.2196387119354863 -0.11448283779546653 -0.98078528040323043 -3.1815784781911303 -0.29847139913078635 -0.92387953251128674 -3.144980877885144 -0.46803622838874048 -0.83146961230254546 -3.1112523362731173 -0.61666104427399482 -0.70710678118654757 -3.0816890222940154 -0.7386342784618396 -0.55557023301960218 -3.0574270375247576 -0.82926856796580939 -0.38268343236508984 -3.0393987564337497 -0.88508088786856476 -0.19509032201612858 -3.0282969957529415 -0.90392640201615215 -1.2246467991473532e-16 -3.0245483899193584 -0.88508088786856476 0.19509032201612836 -3.0282969957529415 -0.82926856796580939 0.38268343236508967 -3.0393987564337497 -0.7386342784618396 0.55557023301960196 -3.0574270375247576 -0.61666104427399571 0.70710678118654746 -3.081689022294015 -0.46803622838874048 0.83146961230254524 -3.1112523362731173 -0.29847139913078724 0.92387953251128652 -3.1449808778851436 -0.11448283779546742 0.98078528040323032 -3.1815784781911298 0.076858878387078278 1 -3.2196387119354863 0.26820059456962353 0.98078528040323043 -3.2576989456798433 0.4521891559049438 0.92387953251128663 -3.2942965459858291 0.62175398516289659 0.83146961230254557 -3.3280250875978563 0.77037880104815182 0.70710678118654768 -3.3575884015769581 0.89235203523599571 0.55557023301960218 -3.3818503863462155 0.98298632473996594 0.38268343236509039 -3.3998786674372234 1.0387986446427218 0.19509032201612872 -3.4109804281180316 1 0 -5 0.98078528040323043 -0.19509032201612825 -5 0.92387953251128674 -0.38268343236508978 -5 0.83146961230254524 -0.55557023301960218 -5 0.70710678118654757 -0.70710678118654746 -5 0.55557023301960229 -0.83146961230254512 -5 0.38268343236508984 -0.92387953251128674 -5 0.1950903220161283 -0.98078528040323043 -5 6.123233995736766e-17 -1 -5 -0.19509032201612819 -0.98078528040323043 -5 -0.38268343236508973 -0.92387953251128674 -5 -0.55557023301960196 -0.83146961230254546 -5 -0.70710678118654746 -0.70710678118654757 -5 -0.83146961230254535 -0.55557023301960218 -5 -0.92387953251128674 -0.38268343236508984 -5 -0.98078528040323043 -0.19509032201612858 -5 -1 -1.2246467991473532e-16 -5 -0.98078528040323043 0.19509032201612836 -5 -0.92387953251128674 0.38268343236508967 -5 -0.83146961230254546 0.55557023301960196 -5 -0.70710678118654768 0.70710678118654746 -5 -0.55557023301960218 0.83146961230254524 -5 -0.38268343236509034 0.92387953251128652 -5 -0.19509032201612866 0.98078528040323032 -5 -1.8369701987210297e-16 1 -5 0.19509032201612828 0.98078528040323043 -5 0.38268343236509 0.92387953251128663 -5 0.55557023301960184 0.83146961230254557 -5 0.70710678118654746 0.70710678118654768 -5 0.83146961230254524 0.55557023301960218 -5 0.92387953251128652 0.38268343236509039 -5 0.98078528040323032 0.19509032201612872 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BendPoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 -0.99999999999999967 5 -0.19509032201612825 -0.9807852804032301 5 -0.38268343236508978 -0.92387953251128641 5 -0.55557023301960218 -0.8314696123025449 5 -0.70710678118654746 -0.70710678118654724 5 -0.83146961230254524 -0.55557023301960196 5 -0.92387953251128674 -0.3826834323650895 5 -0.98078528040323043 -0.19509032201612803 5 -1 2.4492127076447545e-16 5 -0.98078528040323043 0.1950903220161285 5 -0.92387953251128674 0.38268343236509006 5 -0.83146961230254546 0.55557023301960229 5 -0.70710678118654757 0.70710678118654779 5 -0.55557023301960218 0.83146961230254568 5 -0.38268343236508989 0.92387953251128707 5 -0.19509032201612861 0.98078528040323076 5 -1.2246063538223773e-16 1.0000000000000002 5 0.19509032201612836 0.98078528040323076 5 0.38268343236508967 0.92387953251128718 5 0.55557023301960196 0.83146961230254579 5 0.70710678118654746 0.70710678118654802 5 0.83146961230254524 0.55557023301960251 5 0.92387953251128652 0.38268343236509067 5 0.98078528040323032 0.19509032201612897 5 1 4.898425415289509e-16 5 0.98078528040323043 -0.195090322016128 5 0.92387953251128663 -0.38268343236508967 5 0.83146961230254546 -0.55557023301960151 5 0.70710678118654768 -0.70710678118654702 5 0.55557023301960218 -0.8314696123025449 5 0.38268343236509039 -0.92387953251128618 5 0.19509032201612872 -0.98078528040322999 3.4147290339516156 0 -1.0576441587903078 3.4109804281180325 -0.19509032201612825 -1.0387986446427206 3.3998786674372243 -0.38268343236508978 -0.98298632473996517 3.3818503863462164 -0.55557023301960218 -0.89235203523599449 3.357588401576959 -0.70710678118654746 -0.77037880104815115 3.3280250875978572 -0.83146961230254524 -0.62175398516289615 3.29429654598583 -0.92387953251128674 -0.45218915590494269 3.2576989456798442 -0.98078528040323043 -0.26820059456962236 3.2196387119354872 -1 -0.076858878387077473 3.1815784781911307 -0.98078528040323043 0.1144828377954674 3.1449808778851449 -0.92387953251128674 0.2984713991307878 3.1112523362731177 -0.83146961230254546 0.46803622838874098 3.0816890222940159 -0.70710678118654757 0.61666104427399626 3.0574270375247585 -0.55557023301960218 0.73863427846183982 3.0393987564337506 -0.38268343236508989 0.82926856796581039 3.0282969957529424 -0.19509032201612861 0.88508088786856598 3.0245483899193593 -1.2246063538223773e-16 0.90392640201615304 3.0282969957529424 0.19509032201612836 0.88508088786856598 3.0393987564337501 0.38268343236508967 0.8292685679658105 3.0574270375247585 0.55557023301960196 0.73863427846183993 3.0816890222940159 0.70710678118654746 0.61666104427399648 3.1112523362731177 0.83146961230254524 0.4680362283887412 3.1449808778851445 0.92387953251128652 0.29847139913078841 3.1815784781911307 0.98078528040323032 0.11448283779546786 3.2196387119354872 1 -0.076858878387077223 3.2576989456798442 0.98078528040323043 -0.26820059456962231 3.29429654598583 0.92387953251128663 -0.45218915590494285 3.3280250875978568 0.83146961230254546 -0.62175398516289571 3.357588401576959 0.70710678118654768 -0.77037880104815093 3.3818503863462164 0.55557023301960218 -0.89235203523599449 3.3998786674372243 0.38268343236509039 -0.98298632473996495 3.4109804281180325 0.19509032201612872 -1.0387986446427206 2.3332893009411935 0 -1.5055911630923635 2.32261417469741 -0.19509032201612825 -1.4896147076387354 2.2909990350809282 -0.38268343236508978 -1.4422993075012347 2.2396588341772348 -0.55557023301960218 -1.3654632669723632 2.1705665471151425 -0.70710678118654746 -1.2620593519994978 2.0863773517390465 -0.83146961230254524 -1.1360613170454616 1.9903265916134054 -0.92387953251128674 -0.99231119593302686 1.8861054435839608 -0.98078528040323043 -0.8363332252005472 1.7777190679215913 -1 -0.67412155078981839 1.6693326922592218 -0.98078528040323043 -0.51190987637908947 1.5651115442297772 -0.92387953251128674 -0.35593190564660987 1.4690607841041363 -0.83146961230254546 -0.21218178453417516 1.3848715887280401 -0.70710678118654757 -0.08618374958013901 1.3157793016659478 -0.55557023301960218 0.017220165392726656 1.2644391007622544 -0.38268343236508989 0.094056205921597996 1.2328239611457725 -0.19509032201612861 0.14137160605909879 1.2221488349019889 -1.2246063538223773e-16 0.15734806151272693 1.2328239611457725 0.19509032201612836 0.14137160605909879 1.2644391007622544 0.38268343236508967 0.094056205921598093 1.3157793016659476 0.55557023301960196 0.01722016539272675 1.3848715887280401 0.70710678118654746 -0.08618374958013883 1.4690607841041361 0.83146961230254524 -0.21218178453417499 1.5651115442297767 0.92387953251128652 -0.35593190564660937 1.6693326922592213 0.98078528040323032 -0.51190987637908913 1.7777190679215911 1 -0.67412155078981817 1.8861054435839608 0.98078528040323043 -0.8363332252005472 1.9903265916134054 0.92387953251128663 -0.99231119593302697 2.086377351739046 0.83146961230254546 -1.1360613170454614 2.1705665471151421 0.70710678118654768 -1.2620593519994976 2.2396588341772348 0.55557023301960218 -1.3654632669723632 2.2909990350809277 0.38268343236509039 -1.4422993075012345 2.32261417469741 0.19509032201612872 -1.4896147076387354 1.5055911630923644 0 -2.333289300941193 1.4896147076387363 -0.19509032201612825 -2.3226141746974096 1.4422993075012356 -0.38268343236508978 -2.2909990350809273 1.3654632669723641 -0.55557023301960218 -2.2396588341772343 1.2620593519994987 -0.70710678118654746 -2.1705665471151421 1.1360613170454625 -0.83146961230254524 -2.086377351739046 0.99231119593302775 -0.92387953251128674 -1.990326591613405 0.83633322520054809 -0.98078528040323043 -1.8861054435839604 0.67412155078981928 -1 -1.7777190679215908 0.51190987637909036 -0.98078528040323043 -1.6693326922592213 0.35593190564661076 -0.92387953251128674 -1.5651115442297767 0.21218178453417605 -0.83146961230254546 -1.4690607841041359 0.086183749580139898 -0.70710678118654757 -1.3848715887280398 -0.017220165392725768 -0.55557023301960218 -1.3157793016659474 -0.094056205921597108 -0.38268343236508989 -1.2644391007622542 -0.1413716060590979 -0.19509032201612861 -1.2328239611457723 -0.15734806151272604 -1.2246063538223773e-16 -1.2221488349019887 -0.1413716060590979 0.19509032201612836 -1.2328239611457723 -0.094056205921597205 0.38268343236508967 -1.264439100762254 -0.017220165392725861 0.55557023301960196 -1.3157793016659474 0.086183749580139718 0.70710678118654746 -1.3848715887280396 0.21218178453417588 0.83146961230254524 -1.4690607841041357 0.35593190564661026 0.92387953251128652 -1.5651115442297765 0.51190987637909002 0.98078528040323032 -1.6693326922592209 0.67412155078981906 1 -1.7777190679215906 0.83633322520054809 0.98078528040323043 -1.8861054435839604 0.99231119593302786 0.92387953251128663 -1.990326591613405 1.1360613170454623 0.83146961230254546 -2.0863773517390456 1.2620593519994985 0.70710678118654768 -2.1705665471151416 1.3654632669723641 0.55557023301960218 -2.2396588341772343 1.4422993075012354 0.38268343236509039 -2.2909990350809273 1.4896147076387363 0.19509032201612872 -2.3226141746974092 1.0576441587903087 0 -3.4147290339516148 1.0387986446427215 -0.19509032201612825 -3.4109804281180316 0.98298632473996606 -0.38268343236508978 -3.3998786674372234 0.89235203523599538 -0.55557023301960218 -3.3818503863462155 0.77037880104815204 -0.70710678118654746 -3.3575884015769581 0.62175398516289704 -0.83146961230254524 -3.3280250875978563 0.45218915590494357 -0.92387953251128674 -3.2942965459858291 0.26820059456962325 -0.98078528040323043 -3.2576989456798433 0.076858878387078361 -1 -3.2196387119354868 -0.11448283779546652 -0.98078528040323043 -3.1815784781911298 -0.29847139913078691 -0.92387953251128674 -3.144980877885144 -0.46803622838874009 -0.83146961230254546 -3.1112523362731168 -0.61666104427399537 -0.70710678118654757 -3.081689022294015 -0.73863427846183893 -0.55557023301960218 -3.0574270375247576 -0.8292685679658095 -0.38268343236508989 -3.0393987564337497 -0.88508088786856509 -0.19509032201612861 -3.0282969957529415 -0.90392640201615215 -1.2246063538223773e-16 -3.0245483899193584 -0.88508088786856509 0.19509032201612836 -3.0282969957529415 -0.82926856796580961 0.38268343236508967 -3.0393987564337497 -0.73863427846183904 0.55557023301960196 -3.0574270375247576 -0.6166610442739956 0.70710678118654746 -3.081689022294015 -0.46803622838874032 0.83146961230254524 -3.1112523362731168 -0.29847139913078752 0.92387953251128652 -3.144980877885144 -0.11448283779546697 0.98078528040323032 -3.1815784781911298 0.076858878387078111 1 -3.2196387119354868 0.2682005945696232 0.98078528040323043 -3.2576989456798433 0.45218915590494374 0.92387953251128663 -3.2942965459858291 0.62175398516289659 0.83146961230254546 -3.3280250875978563 0.77037880104815182 0.70710678118654768 -3.3575884015769581 0.89235203523599538 0.55557023301960218 -3.3818503863462155 0.98298632473996583 0.38268343236509039 -3.3998786674372234 1.0387986446427215 0.19509032201612872 -3.4109804281180316 1 0 -5 0.98078528040323043 -0.19509032201612825 -5 0.92387953251128674 -0.38268343236508978 -5 0.83146961230254524 -0.55557023301960218 -5 0.70710678118654757 -0.70710678118654746 -5 0.55557023301960229 -0.83146961230254524 -5 0.38268343236508984 -0.92387953251128674 -5 0.19509032201612833 -0.98078528040323043 -5 6.1230317691118863e-17 -1 -5 -0.19509032201612819 -0.98078528040323043 -5 -0.38268343236508973 -0.92387953251128674 -5 -0.55557023301960196 -0.83146961230254546 -5 -0.70710678118654746 -0.70710678118654757 -5 -0.83146961230254535 -0.55557023301960218 -5 -0.92387953251128674 -0.38268343236508989 -5 -0.98078528040323043 -0.19509032201612861 -5 -1 -1.2246063538223773e-16 -5 -0.98078528040323043 0.19509032201612836 -5 -0.92387953251128685 0.38268343236508967 -5 -0.83146961230254546 0.55557023301960196 -5 -0.70710678118654768 0.70710678118654746 -5 -0.55557023301960218 0.83146961230254524 -5 -0.38268343236509034 0.92387953251128652 -5 -0.19509032201612866 0.98078528040323032 -5 -1.8369095307335659e-16 1 -5 0.1950903220161283 0.98078528040323043 -5 0.38268343236509 0.92387953251128663 -5 0.55557023301960184 0.83146961230254546 -5 0.70710678118654735 0.70710678118654768 -5 0.83146961230254524 0.55557023301960218 -5 0.92387953251128652 0.38268343236509039 -5 0.98078528040323032 0.19509032201612872 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BevelFaces.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 -2.5 2.5 -2.2000000000000002 2.5 2.2000000000000002 2.5 -2.5 2.5 2.2000000000000002 2.5 2.2000000000000002 -2.5 -2.5 -2.5 2.5 -2.5 -2.5 2.2000000000000002 2.5 -2.2000000000000002 -2.2000000000000002 2.5 -2.2000000000000002 -2.5 1 -2.5 2.5 1 -2.5 2.5 1 2.5 -2.5 1 2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<polyhedra>\n\t\t\t<first_faces>0</first_faces>\n\t\t\t<face_counts>10</face_counts>\n\t\t\t<types>polygons</types>\n\t\t\t<face_first_loops>0 1 2 3 4 5 6 7 8 9</face_first_loops>\n\t\t\t<face_loop_counts>1 1 1 1 1 1 1 1 1 1</face_loop_counts>\n\t\t\t<face_selection>0 0 0 1 1 0 1 0 1 1</face_selection>\n\t\t\t<face_materials>0 0 0 0 0 0 0 0 0 0</face_materials>\n\t\t\t<loop_first_edges>0 4 8 12 16 20 24 28 32 36</loop_first_edges>\n\t\t\t<edge_points>0 2 10 11 0 11 8 4 2 0 4 5 3 10 9 6 1 3 6 7 5 4 8 9 8 7 6 9 10 2 5 9 10 3 1 11 11 1 7 8</edge_points>\n\t\t\t<clockwise_edges>1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36</clockwise_edges>\n\t\t\t<edge_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</edge_selection>\n\t\t</polyhedra>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BevelPoints.boundary.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>3.2000000000000002 5 0 3 4.7999999999999998 0 3 3.2000000000000002 0 3.2000000000000002 3 0 4.7999999999999998 3 0 5 3.2000000000000002 0 5 4.7999999999999998 0 4.7999999999999998 5 0 1.2000000000000002 5 0 1 4.7999999999999998 0 1 3.2000000000000002 0 1.2000000000000002 3 0 2.8000000000000003 3 0 2.8000000000000003 5 0 -0.80000000000000004 5 0 -1 4.7999999999999998 0 -1 3.2000000000000002 0 -0.80000000000000004 3 0 0.80000000000000004 3 0 0.80000000000000004 5 0 -2.8000000000000003 5 0 -3 4.7999999999999998 0 -3 3.2000000000000002 0 -2.8000000000000003 3 0 -1.2000000000000002 3 0 -1.2000000000000002 5 0 -4.7999999999999998 5 0 -5 4.7999999999999998 0 -5 3.2000000000000002 0 -4.7999999999999998 3 0 -3.2000000000000002 3 0 -3.2000000000000002 5 0 3 2.8000000000000003 0 3 1.2000000000000002 0 3.2000000000000002 1 0 4.7999999999999998 1 0 5 1.2000000000000002 0 5 2.8000000000000003 0 1 2.8000000000000003 0 1 1.2000000000000002 0 1.2000000000000002 1 0 2.8000000000000003 1 0 -1 2.8000000000000003 0 -1 1.2000000000000002 0 -0.80000000000000004 1 0 0.80000000000000004 1 0 -3 2.8000000000000003 0 -3 1.2000000000000002 0 -2.8000000000000003 1 0 -1.2000000000000002 1 0 -5 2.8000000000000003 0 -5 1.2000000000000002 0 -4.7999999999999998 1 0 -3.2000000000000002 1 0 3 0.80000000000000004 0 3 -0.80000000000000004 0 3.2000000000000002 -1 0 4.7999999999999998 -1 0 5 -0.80000000000000004 0 5 0.80000000000000004 0 1 0.80000000000000004 0 1 -0.80000000000000004 0 1.2000000000000002 -1 0 2.8000000000000003 -1 0 -1 0.80000000000000004 0 -1 -0.80000000000000004 0 -0.80000000000000004 -1 0 0.80000000000000004 -1 0 -3 0.80000000000000004 0 -3 -0.80000000000000004 0 -2.8000000000000003 -1 0 -1.2000000000000002 -1 0 -5 0.80000000000000004 0 -5 -0.80000000000000004 0 -4.7999999999999998 -1 0 -3.2000000000000002 -1 0 3 -1.2000000000000002 0 3 -2.8000000000000003 0 3.2000000000000002 -3 0 4.7999999999999998 -3 0 5 -2.8000000000000003 0 5 -1.2000000000000002 0 1 -1.2000000000000002 0 1 -2.8000000000000003 0 1.2000000000000002 -3 0 2.8000000000000003 -3 0 -1 -1.2000000000000002 0 -1 -2.8000000000000003 0 -0.80000000000000004 -3 0 0.80000000000000004 -3 0 -3 -1.2000000000000002 0 -3 -2.8000000000000003 0 -2.8000000000000003 -3 0 -1.2000000000000002 -3 0 -5 -1.2000000000000002 0 -5 -2.8000000000000003 0 -4.7999999999999998 -3 0 -3.2000000000000002 -3 0 3 -3.2000000000000002 0 3 -4.7999999999999998 0 3.2000000000000002 -5 0 4.7999999999999998 -5 0 5 -4.7999999999999998 0 5 -3.2000000000000002 0 1 -3.2000000000000002 0 1 -4.7999999999999998 0 1.2000000000000002 -5 0 2.8000000000000003 -5 0 -1 -3.2000000000000002 0 -1 -4.7999999999999998 0 -0.80000000000000004 -5 0 0.80000000000000004 -5 0 -3 -3.2000000000000002 0 -3 -4.7999999999999998 0 -2.8000000000000003 -5 0 -1.2000000000000002 -5 0 -5 -3.2000000000000002 0 -5 -4.7999999999999998 0 -4.7999999999999998 -5 0 -3.2000000000000002 -5 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">1 1 7 7 6 6 0 0 2 2 8 8 7 1 3 3 9 9 8 2 4 4 10 10 9 3 5 5 11 11 10 4 7 13 13 12 12 6 8 14 14 13 9 15 15 14 10 16 16 15 11 17 17 16 13 19 19 18 18 12 14 20 20 19 15 21 21 20 16 22 22 21 17 23 23 22 19 25 25 24 24 18 20 26 26 25 21 27 27 26 22 28 28 27 23 29 29 28 25 31 31 30 30 24 26 32 32 31 27 33 33 32 28 34 34 33 29 35 35 34</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 201 202 200 204 205 206 203 208 209 207 211 210 213 214 212 216 217 218 215 220 221 219 223 224 225 222 227 228 226 230 231 232 229 234 233 236 237 235 239 240 241 238 243 244 242 246 247 248 245 250 251 252 249 254 255 256 253 258 259 257 261 262 263 260 265 266 264 268 269 270 267 272 273 274 271 276 277 278 275 280 281 279 283 284 285 282 287 288 286 290 291 292 289 294 295 296 293 298 299 300 297 302 303 301 305 306 304 308 307 310 311 309 313 314 312 316 317 315 319 318</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 200 203 207 210 212 215 219 222 226 229 233 235 238 242 245 249 253 257 260 264 267 271 275 279 282 286 289 293 297 301 304 307 309 312 315 318</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">7 1 3 5 13 9 11 2 19 15 17 10 25 21 23 16 31 27 29 22 4 32 34 36 12 38 40 33 18 42 44 39 24 46 48 43 30 50 52 47 35 54 56 58 41 60 62 55 45 64 66 61 49 68 70 65 53 72 74 69 57 76 78 80 63 82 84 77 67 86 88 83 71 90 92 87 75 94 96 91 79 98 100 102 85 104 106 99 89 108 110 105 93 112 114 109 97 116 118 113 0 2 4 6 8 10 12 1 14 16 18 9 20 22 24 15 26 28 30 21 3 33 35 37 11 39 41 32 17 43 45 38 23 47 49 42 29 51 53 46 34 55 57 59 40 61 63 54 44 65 67 60 48 69 71 64 52 73 75 68 56 77 79 81 62 83 85 76 66 87 89 82 70 91 93 86 74 95 97 90 78 99 101 103 84 105 107 98 88 109 111 104 92 113 115 108 96 117 119 112 13 1 0 3 2 12 32 5 4 37 7 6 19 9 8 11 10 18 38 25 15 14 17 16 24 42 31 21 20 23 22 30 46 27 26 50 29 28 34 33 41 54 36 35 59 40 39 45 60 44 43 49 64 48 47 53 68 72 52 51 56 55 63 76 58 57 81 62 61 67 82 66 65 71 86 70 69 75 90 94 74 73 78 77 85 98 80 79 103 84 83 89 104 88 87 93 108 92 91 97 112 116 96 95 100 99 107 102 101 106 105 111 110 109 115 114 113 119 118 117\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 0 1 2 1 4 5 6 5 8 9 10 9 12 13 14 13 16 17 18 17 20 21 22 21 24 25 26 25 28 29 30 29 32 33 34 33 36 37 38 37 40 41 42 41 44 45 46 45 48 49 50 49 52 53 54 53 56 57 58 57 60 61 62 61 64 65 66 65 68 69 70 69 72 73 74 73 76 77 78 77 80 81 82 81 84 85 86 85 88 89 90 89 92 93 94 93 96 97 98 97 5 0 2 1 6 25 20 2 21 12 1 1 9 4 6 5 10 29 24 13 8 10 9 14 33 28 17 12 14 13 18 37 32 16 16 36 17 26 21 26 45 40 22 41 32 25 30 49 44 29 34 53 48 33 38 57 52 56 37 46 41 46 65 60 42 61 52 45 50 69 64 49 54 73 68 53 58 77 72 76 57 66 61 66 85 80 62 81 72 65 70 89 84 69 74 93 88 73 78 97 92 96 77 86 81 86 84 82 82 85 90 88 89 94 92 93 98 96 97 97</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 0 2 2 0 1 2 2 3 3 5 4 6 6 7 7 9 10 11 11 12 13 14 14 16 17 17 18 18 19 21 20 20 21 22 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 4 1 1 2 7 24 21 3 20 20 0 0 8 5 5 6 11 28 25 12 9 9 10 15 32 29 16 13 13 14 19 36 33 17 17 37 18 18 22 27 44 41 23 40 40 26 31 48 45 30 35 52 49 34 39 56 53 57 38 38 42 47 64 61 43 60 60 46 51 68 65 50 55 72 69 54 59 76 73 77 58 58 62 67 84 81 63 80 80 66 71 88 85 70 75 92 89 74 79 96 93 97 78 78 82 87 87 83 83 86 91 91 90 95 95 94 99 99 98 98</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BevelPoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5 2 2.5 2.5 2.5 2.5 2 -2.5 2.5 2 -2 2.5 2.5 2.5 -2 2.5 2.5 -2.5 2 2.5 2 2.5 -2 -2.5 2.5 -2.5 -2.5 2 2 -2.5 2.5 -2.5 2 2.5 -2.5 -2 2.5</points>\n\t\t<point_selection>0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">4 5 6 7 1 1 0 0 2 2 1 3 3 2 0 3</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">24 2 3 25 26 6 7 27 28 10 11 29 30 14 15 31 32 33 34 35 21 22 23 20 1 0 5 4 9 8 13 12 17 18 19 16 37 38 36 40 41 39 43 44 42 46 47 45</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 36 39 42 45</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">7 5 1 0 10 9 2 1 13 12 3 2 15 6 0 3 4 14 11 8 0 1 2 3 4 6 8 5 11 9 14 12 7 15 13 10 5 4 10 7 6 14 9 8 13 12 11 15\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 4 5 8 9 12 13 16 17 18 17 0 17 5 1 12 16 4 18 9 8 17 13</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 1 0 5 4 9 8 13 12 17 18 19 16 1 16 4 0 13 17 5 19 8 9 18 12</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BicubicToPoly.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1.3999999999999999 0 2.3999999999999999 1.211259259259259 -0.71140740740740738 2.3999999999999999 0.71140740740740738 -1.211259259259259 2.3999999999999999 0 -1.3999999999999999 2.3999999999999999 1.3842592592592591 0 2.4874999999999998 1.1976406035665292 -0.70340877914951982 2.4874999999999998 0.70340877914951982 -1.1976406035665292 2.4874999999999998 0 -1.3842592592592591 2.4874999999999998 1.4324074074074074 0 2.4874999999999998 1.2392976680384087 -0.72787517146776404 2.4874999999999998 0.72787517146776404 -1.2392976680384087 2.4874999999999998 0 -1.4324074074074074 2.4874999999999998 1.5 0 2.3999999999999999 1.2977777777777777 -0.76222222222222213 2.3999999999999999 0.76222222222222213 -1.2977777777777777 2.3999999999999999 0 -1.5 2.3999999999999999 0 -1.3999999999999999 2.3999999999999999 -0.71140740740740738 -1.211259259259259 2.3999999999999999 -1.211259259259259 -0.71140740740740738 2.3999999999999999 -1.3999999999999999 0 2.3999999999999999 0 -1.3842592592592591 2.4874999999999998 -0.70340877914951982 -1.1976406035665292 2.4874999999999998 -1.1976406035665292 -0.70340877914951982 2.4874999999999998 -1.3842592592592591 0 2.4874999999999998 0 -1.4324074074074074 2.4874999999999998 -0.72787517146776404 -1.2392976680384087 2.4874999999999998 -1.2392976680384087 -0.72787517146776404 2.4874999999999998 -1.4324074074074074 0 2.4874999999999998 0 -1.5 2.3999999999999999 -0.76222222222222213 -1.2977777777777777 2.3999999999999999 -1.2977777777777777 -0.76222222222222213 2.3999999999999999 -1.5 0 2.3999999999999999 -1.3999999999999999 0 2.3999999999999999 -1.211259259259259 0.71140740740740738 2.3999999999999999 -0.71140740740740738 1.211259259259259 2.3999999999999999 0 1.3999999999999999 2.3999999999999999 -1.3842592592592591 0 2.4874999999999998 -1.1976406035665292 0.70340877914951982 2.4874999999999998 -0.70340877914951982 1.1976406035665292 2.4874999999999998 0 1.3842592592592591 2.4874999999999998 -1.4324074074074074 0 2.4874999999999998 -1.2392976680384087 0.72787517146776404 2.4874999999999998 -0.72787517146776404 1.2392976680384087 2.4874999999999998 0 1.4324074074074074 2.4874999999999998 -1.5 0 2.3999999999999999 -1.2977777777777777 0.76222222222222213 2.3999999999999999 -0.76222222222222213 1.2977777777777777 2.3999999999999999 0 1.5 2.3999999999999999 0 1.3999999999999999 2.3999999999999999 0.71140740740740738 1.211259259259259 2.3999999999999999 1.211259259259259 0.71140740740740738 2.3999999999999999 1.3999999999999999 0 2.3999999999999999 0 1.3842592592592591 2.4874999999999998 0.70340877914951982 1.1976406035665292 2.4874999999999998 1.1976406035665292 0.70340877914951982 2.4874999999999998 1.3842592592592591 0 2.4874999999999998 0 1.4324074074074074 2.4874999999999998 0.72787517146776404 1.2392976680384087 2.4874999999999998 1.2392976680384087 0.72787517146776404 2.4874999999999998 1.4324074074074074 0 2.4874999999999998 0 1.5 2.3999999999999999 0.76222222222222213 1.2977777777777777 2.3999999999999999 1.2977777777777777 0.76222222222222213 2.3999999999999999 1.5 0 2.3999999999999999 1.5 0 2.3999999999999999 1.2977777777777777 -0.76222222222222213 2.3999999999999999 0.76222222222222213 -1.2977777777777777 2.3999999999999999 0 -1.5 2.3999999999999999 1.7407407407407407 0 1.8777777777777778 1.506063100137174 -0.88455418381344297 1.8777777777777775 0.88455418381344297 -1.506063100137174 1.8777777777777775 0 -1.7407407407407407 1.8777777777777778 1.9259259259259258 0 1.3722222222222222 1.6662825788751714 -0.97865569272976671 1.3722222222222222 0.97865569272976671 -1.6662825788751714 1.3722222222222222 0 -1.9259259259259258 1.3722222222222222 2 0 0.90000000000000002 1.7303703703703703 -1.0162962962962963 0.90000000000000002 1.0162962962962963 -1.7303703703703703 0.90000000000000002 0 -2 0.90000000000000002 0 -1.5 2.3999999999999999 -0.76222222222222213 -1.2977777777777777 2.3999999999999999 -1.2977777777777777 -0.76222222222222213 2.3999999999999999 -1.5 0 2.3999999999999999 0 -1.7407407407407407 1.8777777777777778 -0.88455418381344297 -1.506063100137174 1.8777777777777775 -1.506063100137174 -0.88455418381344297 1.8777777777777775 -1.7407407407407407 0 1.8777777777777778 0 -1.9259259259259258 1.3722222222222222 -0.97865569272976671 -1.6662825788751714 1.3722222222222222 -1.6662825788751714 -0.97865569272976671 1.3722222222222222 -1.9259259259259258 0 1.3722222222222222 0 -2 0.90000000000000002 -1.0162962962962963 -1.7303703703703703 0.90000000000000002 -1.7303703703703703 -1.0162962962962963 0.90000000000000002 -2 0 0.90000000000000002 -1.5 0 2.3999999999999999 -1.2977777777777777 0.76222222222222213 2.3999999999999999 -0.76222222222222213 1.2977777777777777 2.3999999999999999 0 1.5 2.3999999999999999 -1.7407407407407407 0 1.8777777777777778 -1.506063100137174 0.88455418381344297 1.8777777777777775 -0.88455418381344297 1.506063100137174 1.8777777777777775 0 1.7407407407407407 1.8777777777777778 -1.9259259259259258 0 1.3722222222222222 -1.6662825788751714 0.97865569272976671 1.3722222222222222 -0.97865569272976671 1.6662825788751714 1.3722222222222222 0 1.9259259259259258 1.3722222222222222 -2 0 0.90000000000000002 -1.7303703703703703 1.0162962962962963 0.90000000000000002 -1.0162962962962963 1.7303703703703703 0.90000000000000002 0 2 0.90000000000000002 0 1.5 2.3999999999999999 0.76222222222222213 1.2977777777777777 2.3999999999999999 1.2977777777777777 0.76222222222222213 2.3999999999999999 1.5 0 2.3999999999999999 0 1.7407407407407407 1.8777777777777778 0.88455418381344297 1.506063100137174 1.8777777777777775 1.506063100137174 0.88455418381344297 1.8777777777777775 1.7407407407407407 0 1.8777777777777778 0 1.9259259259259258 1.3722222222222222 0.97865569272976671 1.6662825788751714 1.3722222222222222 1.6662825788751714 0.97865569272976671 1.3722222222222222 1.9259259259259258 0 1.3722222222222222 0 2 0.90000000000000002 1.0162962962962963 1.7303703703703703 0.90000000000000002 1.7303703703703703 1.0162962962962963 0.90000000000000002 2 0 0.90000000000000002 2 0 0.90000000000000002 1.7303703703703703 -1.0162962962962963 0.90000000000000002 1.0162962962962963 -1.7303703703703703 0.90000000000000002 0 -2 0.90000000000000002 1.8703703703703702 0 0.52222222222222225 1.6182167352537722 -0.95042524005486961 0.52222222222222214 0.95042524005486961 -1.6182167352537722 0.52222222222222214 0 -1.8703703703703702 0.52222222222222225 1.6296296296296295 0 0.27777777777777779 1.4099314128943756 -0.82809327846364877 0.27777777777777773 0.82809327846364877 -1.4099314128943756 0.27777777777777773 0 -1.6296296296296295 0.27777777777777779 1.5 0 0.14999999999999999 1.2977777777777777 -0.76222222222222213 0.14999999999999999 0.76222222222222213 -1.2977777777777777 0.14999999999999999 0 -1.5 0.14999999999999999 0 -2 0.90000000000000002 -1.0162962962962963 -1.7303703703703703 0.90000000000000002 -1.7303703703703703 -1.0162962962962963 0.90000000000000002 -2 0 0.90000000000000002 0 -1.8703703703703702 0.52222222222222225 -0.95042524005486961 -1.6182167352537722 0.52222222222222214 -1.6182167352537722 -0.95042524005486961 0.52222222222222214 -1.8703703703703702 0 0.52222222222222225 0 -1.6296296296296295 0.27777777777777779 -0.82809327846364877 -1.4099314128943756 0.27777777777777773 -1.4099314128943756 -0.82809327846364877 0.27777777777777773 -1.6296296296296295 0 0.27777777777777779 0 -1.5 0.14999999999999999 -0.76222222222222213 -1.2977777777777777 0.14999999999999999 -1.2977777777777777 -0.76222222222222213 0.14999999999999999 -1.5 0 0.14999999999999999 -2 0 0.90000000000000002 -1.7303703703703703 1.0162962962962963 0.90000000000000002 -1.0162962962962963 1.7303703703703703 0.90000000000000002 0 2 0.90000000000000002 -1.8703703703703702 0 0.52222222222222225 -1.6182167352537722 0.95042524005486961 0.52222222222222214 -0.95042524005486961 1.6182167352537722 0.52222222222222214 0 1.8703703703703702 0.52222222222222225 -1.6296296296296295 0 0.27777777777777779 -1.4099314128943756 0.82809327846364877 0.27777777777777773 -0.82809327846364877 1.4099314128943756 0.27777777777777773 0 1.6296296296296295 0.27777777777777779 -1.5 0 0.14999999999999999 -1.2977777777777777 0.76222222222222213 0.14999999999999999 -0.76222222222222213 1.2977777777777777 0.14999999999999999 0 1.5 0.14999999999999999 0 2 0.90000000000000002 1.0162962962962963 1.7303703703703703 0.90000000000000002 1.7303703703703703 1.0162962962962963 0.90000000000000002 2 0 0.90000000000000002 0 1.8703703703703702 0.52222222222222225 0.95042524005486961 1.6182167352537722 0.52222222222222214 1.6182167352537722 0.95042524005486961 0.52222222222222214 1.8703703703703702 0 0.52222222222222225 0 1.6296296296296295 0.27777777777777779 0.82809327846364877 1.4099314128943756 0.27777777777777773 1.4099314128943756 0.82809327846364877 0.27777777777777773 1.6296296296296295 0 0.27777777777777779 0 1.5 0.14999999999999999 0.76222222222222213 1.2977777777777777 0.14999999999999999 1.2977777777777777 0.76222222222222213 0.14999999999999999 1.5 0 0.14999999999999999 -1.6000000000000001 0 2.0249999999999999 -1.574074074074074 -0.19999999999999998 2.083333333333333 -1.5259259259259259 -0.19999999999999998 2.1916666666666664 -1.5 0 2.25 -2.1962962962962962 0 2.0166666666666666 -2.231824417009602 -0.19999999999999998 2.0728395061728393 -2.2978052126200272 -0.19999999999999998 2.1771604938271603 -2.333333333333333 0 2.2333333333333334 -2.5703703703703704 0 1.9583333333333333 -2.6385459533607678 -0.19999999999999998 1.9993827160493824 -2.7651577503429352 -0.19999999999999998 2.0756172839506171 -2.833333333333333 0 2.1166666666666667 -2.7000000000000002 0 1.8 -2.7777777777777777 -0.19999999999999998 1.8 -2.9222222222222221 -0.19999999999999998 1.8 -3 0 1.8 -1.5 0 2.25 -1.5259259259259259 0.19999999999999998 2.1916666666666664 -1.574074074074074 0.19999999999999998 2.083333333333333 -1.6000000000000001 0 2.0249999999999999 -2.333333333333333 0 2.2333333333333334 -2.2978052126200272 0.19999999999999998 2.1771604938271603 -2.231824417009602 0.19999999999999998 2.0728395061728393 -2.1962962962962962 0 2.0166666666666666 -2.833333333333333 0 2.1166666666666667 -2.7651577503429352 0.19999999999999998 2.0756172839506171 -2.6385459533607678 0.19999999999999998 1.9993827160493824 -2.5703703703703704 0 1.9583333333333333 -3 0 1.8 -2.9222222222222221 0.19999999999999998 1.8 -2.7777777777777777 0.19999999999999998 1.8 -2.7000000000000002 0 1.8 -2.7000000000000002 0 1.8 -2.7777777777777777 -0.19999999999999998 1.8 -2.9222222222222221 -0.19999999999999998 1.8 -3 0 1.8 -2.6296296296296298 0 1.5166666666666666 -2.6949245541838134 -0.19999999999999998 1.4770576131687241 -2.8161865569272972 -0.19999999999999998 1.4034979423868312 -2.8814814814814813 0 1.3638888888888889 -2.4037037037037035 0 1.1833333333333333 -2.4334705075445813 -0.19999999999999998 1.1257201646090533 -2.4887517146776403 -0.19999999999999998 1.0187242798353908 -2.5185185185185182 0 0.96111111111111103 -2 0 0.90000000000000002 -1.9740740740740739 -0.19999999999999998 0.82222222222222219 -1.9259259259259258 -0.19999999999999998 0.6777777777777777 -1.8999999999999999 0 0.59999999999999998 -3 0 1.8 -2.9222222222222221 0.19999999999999998 1.8 -2.7777777777777777 0.19999999999999998 1.8 -2.7000000000000002 0 1.8 -2.8814814814814813 0 1.3638888888888889 -2.8161865569272972 0.19999999999999998 1.4034979423868312 -2.6949245541838134 0.19999999999999998 1.4770576131687241 -2.6296296296296298 0 1.5166666666666666 -2.5185185185185182 0 0.96111111111111103 -2.4887517146776403 0.19999999999999998 1.0187242798353908 -2.4334705075445813 0.19999999999999998 1.1257201646090533 -2.4037037037037035 0 1.1833333333333333 -1.8999999999999999 0 0.59999999999999998 -1.9259259259259258 0.19999999999999998 0.6777777777777777 -1.9740740740740739 0.19999999999999998 0.82222222222222219 -2 0 0.90000000000000002 1.7 0 1.425 1.7 -0.44 1.211111111111111 1.7 -0.44 0.81388888888888888 1.7 0 0.59999999999999998 2.2703703703703701 0 1.6111111111111112 2.3395061728395059 -0.3691358024691358 1.4742798353909463 2.467901234567901 -0.3691358024691358 1.2201646090534979 2.5370370370370368 0 1.0833333333333333 2.4629629629629628 0 2.0138888888888888 2.5493827160493825 -0.23753086419753086 1.9627572016460904 2.7098765432098761 -0.23753086419753086 1.8677983539094647 2.7962962962962963 0 1.8166666666666664 2.7000000000000002 0 2.3999999999999999 2.8555555555555556 -0.16666666666666666 2.3999999999999999 3.1444444444444444 -0.16666666666666666 2.3999999999999999 3.2999999999999998 0 2.3999999999999999 1.7 0 0.59999999999999998 1.7 0.44 0.81388888888888888 1.7 0.44 1.211111111111111 1.7 0 1.425 2.5370370370370368 0 1.0833333333333333 2.467901234567901 0.3691358024691358 1.2201646090534979 2.3395061728395059 0.3691358024691358 1.4742798353909463 2.2703703703703701 0 1.6111111111111112 2.7962962962962963 0 1.8166666666666664 2.7098765432098761 0.23753086419753086 1.8677983539094647 2.5493827160493825 0.23753086419753086 1.9627572016460904 2.4629629629629628 0 2.0138888888888888 3.2999999999999998 0 2.3999999999999999 3.1444444444444444 0.16666666666666666 2.3999999999999999 2.8555555555555556 0.16666666666666666 2.3999999999999999 2.7000000000000002 0 2.3999999999999999 2.7000000000000002 0 2.3999999999999999 2.8555555555555556 -0.16666666666666666 2.3999999999999999 3.1444444444444444 -0.16666666666666666 2.3999999999999999 3.2999999999999998 0 2.3999999999999999 2.7925925925925923 0 2.4499999999999997 2.9577503429355279 -0.14938271604938269 2.4543209876543206 3.2644718792866936 -0.14938271604938269 2.4623456790123455 3.4296296296296296 0 2.4666666666666663 2.8407407407407406 0 2.4499999999999997 2.982373113854595 -0.11728395061728394 2.4554012345679008 3.2454046639231824 -0.11728395061728394 2.4654320987654321 3.3870370370370368 0 2.4708333333333332 2.7999999999999998 0 2.3999999999999999 2.9037037037037035 -0.099999999999999992 2.3999999999999999 3.0962962962962961 -0.099999999999999992 2.3999999999999999 3.2000000000000002 0 2.3999999999999999 3.2999999999999998 0 2.3999999999999999 3.1444444444444444 0.16666666666666666 2.3999999999999999 2.8555555555555556 0.16666666666666666 2.3999999999999999 2.7000000000000002 0 2.3999999999999999 3.4296296296296296 0 2.4666666666666663 3.2644718792866936 0.14938271604938269 2.4623456790123455 2.9577503429355279 0.14938271604938269 2.4543209876543206 2.7925925925925923 0 2.4499999999999997 3.3870370370370368 0 2.4708333333333332 3.2454046639231824 0.11728395061728394 2.4654320987654321 2.982373113854595 0.11728395061728394 2.4554012345679008 2.8407407407407406 0 2.4499999999999997 3.2000000000000002 0 2.3999999999999999 3.0962962962962961 0.099999999999999992 2.3999999999999999 2.9037037037037035 0.099999999999999992 2.3999999999999999 2.7999999999999998 0 2.3999999999999999 0 0 3.1499999999999999 0 0 3.1499999999999999 0 0 3.1499999999999999 0 0 3.1499999999999999 0.36296296296296299 0 3.0666666666666664 0.31422770919067217 -0.18483401920438958 3.0666666666666664 0.18483401920438958 -0.31422770919067217 3.0666666666666664 0 -0.36296296296296299 3.0666666666666664 0.23703703703703705 0 2.8833333333333333 0.20517969821673523 -0.1206474622770919 2.8833333333333333 0.1206474622770919 -0.20517969821673523 2.8833333333333333 0 -0.23703703703703705 2.8833333333333333 0.20000000000000001 0 2.7000000000000002 0.17303703703703704 -0.10162962962962963 2.7000000000000002 0.10162962962962963 -0.17303703703703704 2.7000000000000002 0 -0.20000000000000001 2.7000000000000002 0 0 3.1499999999999999 0 0 3.1499999999999999 0 0 3.1499999999999999 0 0 3.1499999999999999 0 -0.36296296296296299 3.0666666666666664 -0.18483401920438958 -0.31422770919067217 3.0666666666666664 -0.31422770919067217 -0.18483401920438958 3.0666666666666664 -0.36296296296296299 0 3.0666666666666664 0 -0.23703703703703705 2.8833333333333333 -0.1206474622770919 -0.20517969821673523 2.8833333333333333 -0.20517969821673523 -0.1206474622770919 2.8833333333333333 -0.23703703703703705 0 2.8833333333333333 0 -0.20000000000000001 2.7000000000000002 -0.10162962962962963 -0.17303703703703704 2.7000000000000002 -0.17303703703703704 -0.10162962962962963 2.7000000000000002 -0.20000000000000001 0 2.7000000000000002 0 0 3.1499999999999999 0 0 3.1499999999999999 0 0 3.1499999999999999 0 0 3.1499999999999999 -0.36296296296296299 0 3.0666666666666664 -0.31422770919067217 0.18483401920438958 3.0666666666666664 -0.18483401920438958 0.31422770919067217 3.0666666666666664 0 0.36296296296296299 3.0666666666666664 -0.23703703703703705 0 2.8833333333333333 -0.20517969821673523 0.1206474622770919 2.8833333333333333 -0.1206474622770919 0.20517969821673523 2.8833333333333333 0 0.23703703703703705 2.8833333333333333 -0.20000000000000001 0 2.7000000000000002 -0.17303703703703704 0.10162962962962963 2.7000000000000002 -0.10162962962962963 0.17303703703703704 2.7000000000000002 0 0.20000000000000001 2.7000000000000002 0 0 3.1499999999999999 0 0 3.1499999999999999 0 0 3.1499999999999999 0 0 3.1499999999999999 0 0.36296296296296299 3.0666666666666664 0.18483401920438958 0.31422770919067217 3.0666666666666664 0.31422770919067217 0.18483401920438958 3.0666666666666664 0.36296296296296299 0 3.0666666666666664 0 0.23703703703703705 2.8833333333333333 0.1206474622770919 0.20517969821673523 2.8833333333333333 0.20517969821673523 0.1206474622770919 2.8833333333333333 0.23703703703703705 0 2.8833333333333333 0 0.20000000000000001 2.7000000000000002 0.10162962962962963 0.17303703703703704 2.7000000000000002 0.17303703703703704 0.10162962962962963 2.7000000000000002 0.20000000000000001 0 2.7000000000000002 0.20000000000000001 0 2.7000000000000002 0.17303703703703704 -0.10162962962962963 2.7000000000000002 0.10162962962962963 -0.17303703703703704 2.7000000000000002 0 -0.20000000000000001 2.7000000000000002 0.57407407407407407 0 2.5888888888888886 0.49668038408779147 -0.29171467764060355 2.5888888888888886 0.29171467764060355 -0.49668038408779147 2.5888888888888886 0 -0.57407407407407407 2.5888888888888886 1.0592592592592593 0 2.5111111111111106 0.91645541838134426 -0.53826063100137167 2.5111111111111106 0.53826063100137167 -0.91645541838134426 2.5111111111111106 0 -1.0592592592592593 2.5111111111111106 1.3 0 2.3999999999999999 1.1247407407407406 -0.66059259259259251 2.3999999999999999 0.66059259259259251 -1.1247407407407406 2.3999999999999999 0 -1.3 2.3999999999999999 0 -0.20000000000000001 2.7000000000000002 -0.10162962962962963 -0.17303703703703704 2.7000000000000002 -0.17303703703703704 -0.10162962962962963 2.7000000000000002 -0.20000000000000001 0 2.7000000000000002 0 -0.57407407407407407 2.5888888888888886 -0.29171467764060355 -0.49668038408779147 2.5888888888888886 -0.49668038408779147 -0.29171467764060355 2.5888888888888886 -0.57407407407407407 0 2.5888888888888886 0 -1.0592592592592593 2.5111111111111106 -0.53826063100137167 -0.91645541838134426 2.5111111111111106 -0.91645541838134426 -0.53826063100137167 2.5111111111111106 -1.0592592592592593 0 2.5111111111111106 0 -1.3 2.3999999999999999 -0.66059259259259251 -1.1247407407407406 2.3999999999999999 -1.1247407407407406 -0.66059259259259251 2.3999999999999999 -1.3 0 2.3999999999999999 -0.20000000000000001 0 2.7000000000000002 -0.17303703703703704 0.10162962962962963 2.7000000000000002 -0.10162962962962963 0.17303703703703704 2.7000000000000002 0 0.20000000000000001 2.7000000000000002 -0.57407407407407407 0 2.5888888888888886 -0.49668038408779147 0.29171467764060355 2.5888888888888886 -0.29171467764060355 0.49668038408779147 2.5888888888888886 0 0.57407407407407407 2.5888888888888886 -1.0592592592592593 0 2.5111111111111106 -0.91645541838134426 0.53826063100137167 2.5111111111111106 -0.53826063100137167 0.91645541838134426 2.5111111111111106 0 1.0592592592592593 2.5111111111111106 -1.3 0 2.3999999999999999 -1.1247407407407406 0.66059259259259251 2.3999999999999999 -0.66059259259259251 1.1247407407407406 2.3999999999999999 0 1.3 2.3999999999999999 0 0.20000000000000001 2.7000000000000002 0.10162962962962963 0.17303703703703704 2.7000000000000002 0.17303703703703704 0.10162962962962963 2.7000000000000002 0.20000000000000001 0 2.7000000000000002 0 0.57407407407407407 2.5888888888888886 0.29171467764060355 0.49668038408779147 2.5888888888888886 0.49668038408779147 0.29171467764060355 2.5888888888888886 0.57407407407407407 0 2.5888888888888886 0 1.0592592592592593 2.5111111111111106 0.53826063100137167 0.91645541838134426 2.5111111111111106 0.91645541838134426 0.53826063100137167 2.5111111111111106 1.0592592592592593 0 2.5111111111111106 0 1.3 2.3999999999999999 0.66059259259259251 1.1247407407407406 2.3999999999999999 1.1247407407407406 0.66059259259259251 2.3999999999999999 1.3 0 2.3999999999999999 0 0 0 0 0 0 0 0 0 0 0 0 1.0222222222222221 0 0.02222222222222222 0.88441152263374478 0.51944032921810701 0.02222222222222222 0.51944032921810701 0.88441152263374478 0.02222222222222222 0 1.0222222222222221 0.02222222222222222 1.4277777777777778 0 0.077777777777777765 1.2352921810699586 0.72552263374485593 0.077777777777777765 0.72552263374485593 1.2352921810699586 0.077777777777777765 0 1.4277777777777778 0.077777777777777765 1.5 0 0.14999999999999999 1.2977777777777777 0.76222222222222213 0.14999999999999999 0.76222222222222213 1.2977777777777777 0.14999999999999999 0 1.5 0.14999999999999999 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0222222222222221 0.02222222222222222 -0.51944032921810701 0.88441152263374478 0.02222222222222222 -0.88441152263374478 0.51944032921810701 0.02222222222222222 -1.0222222222222221 0 0.02222222222222222 0 1.4277777777777778 0.077777777777777765 -0.72552263374485593 1.2352921810699586 0.077777777777777765 -1.2352921810699586 0.72552263374485593 0.077777777777777765 -1.4277777777777778 0 0.077777777777777765 0 1.5 0.14999999999999999 -0.76222222222222213 1.2977777777777777 0.14999999999999999 -1.2977777777777777 0.76222222222222213 0.14999999999999999 -1.5 0 0.14999999999999999 0 0 0 0 0 0 0 0 0 0 0 0 -1.0222222222222221 0 0.02222222222222222 -0.88441152263374478 -0.51944032921810701 0.02222222222222222 -0.51944032921810701 -0.88441152263374478 0.02222222222222222 0 -1.0222222222222221 0.02222222222222222 -1.4277777777777778 0 0.077777777777777765 -1.2352921810699586 -0.72552263374485593 0.077777777777777765 -0.72552263374485593 -1.2352921810699586 0.077777777777777765 0 -1.4277777777777778 0.077777777777777765 -1.5 0 0.14999999999999999 -1.2977777777777777 -0.76222222222222213 0.14999999999999999 -0.76222222222222213 -1.2977777777777777 0.14999999999999999 0 -1.5 0.14999999999999999 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.0222222222222221 0.02222222222222222 0.51944032921810701 -0.88441152263374478 0.02222222222222222 0.88441152263374478 -0.51944032921810701 0.02222222222222222 1.0222222222222221 0 0.02222222222222222 0 -1.4277777777777778 0.077777777777777765 0.72552263374485593 -1.2352921810699586 0.077777777777777765 1.2352921810699586 -0.72552263374485593 0.077777777777777765 1.4277777777777778 0 0.077777777777777765 0 -1.5 0.14999999999999999 0.76222222222222213 -1.2977777777777777 0.14999999999999999 1.2977777777777777 -0.76222222222222213 0.14999999999999999 1.5 0 0.14999999999999999</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 3 2 0 1 5 6 4 4 9 12 11 12 15 3 10 15 18 5 10 14 19 9 13 17 21 15 20 23 27 18 24 26 30 19 21 25 30 21 25 29 34 27 32 35 39 30 34 27 0 30 33 25 2 34 36 29 6 39 41 34 12 12 11 12 15 37 31 31 40 49 44 46 52 56 55 56 59 15 20 23 27 40 42 45 50 52 54 55 61 59 62 65 68 27 32 35 39 50 51 54 60 61 62 64 70 68 71 73 77 39 41 34 12 60 58 53 37 70 66 61 49 77 78 72 56 56 55 56 59 75 69 70 78 86 81 81 89 92 91 92 95 59 62 65 68 78 76 79 88 89 87 91 97 95 98 100 104 68 71 73 77 88 85 89 97 97 98 100 106 104 107 109 113 77 78 72 56 97 94 87 75 106 104 99 86 113 114 109 92 120 119 120 123 122 119 119 125 126 122 123 129 132 131 131 135 123 130 129 120 125 127 127 122 129 130 129 126 135 137 137 132 132 131 131 135 136 133 135 142 120 135 142 148 68 125 147 154 135 137 137 132 142 141 139 136 148 146 140 120 154 152 131 68 161 160 160 164 163 157 158 166 167 161 163 171 173 172 173 176 164 170 171 161 166 167 166 163 171 169 168 167 176 179 178 173 173 172 173 176 181 176 177 184 187 181 183 190 193 193 194 196 176 179 178 173 184 183 184 181 190 190 188 187 196 198 197 193 203 202 202 203 204 198 199 205 207 202 202 209 211 210 211 214 203 202 202 203 205 201 202 210 209 204 206 213 214 216 217 221 203 202 202 203 210 205 206 213 213 209 210 216 221 223 225 228 203 202 202 203 213 207 205 204 216 212 209 207 228 227 224 211 211 210 211 214 225 219 220 229 234 229 229 237 241 240 240 244 214 216 217 221 229 230 231 238 237 238 240 247 244 247 249 253 221 223 225 228 238 238 241 246 247 247 250 256 253 255 258 262 228 227 224 211 246 245 240 225 256 253 249 234 262 262 258 241 269 266 266 269 271 267 268 274 270 266 266 274 270 269 269 273 269 266 266 269 274 272 275 280 274 275 277 284 273 277 281 284 269 266 266 269 280 278 280 286 284 284 286 292 284 287 289 293 269 266 266 269 286 283 278 271 292 289 285 270 293 294 288 270</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 4 5 9 8 5 6 10 9 6 7 11 10 8 9 13 12 9 10 14 13 10 11 15 14 16 17 21 20 17 18 22 21 18 19 23 22 20 21 25 24 21 22 26 25 22 23 27 26 24 25 29 28 25 26 30 29 26 27 31 30 32 33 37 36 33 34 38 37 34 35 39 38 36 37 41 40 37 38 42 41 38 39 43 42 40 41 45 44 41 42 46 45 42 43 47 46 48 49 53 52 49 50 54 53 50 51 55 54 52 53 57 56 53 54 58 57 54 55 59 58 56 57 61 60 57 58 62 61 58 59 63 62 64 65 69 68 65 66 70 69 66 67 71 70 68 69 73 72 69 70 74 73 70 71 75 74 72 73 77 76 73 74 78 77 74 75 79 78 80 81 85 84 81 82 86 85 82 83 87 86 84 85 89 88 85 86 90 89 86 87 91 90 88 89 93 92 89 90 94 93 90 91 95 94 96 97 101 100 97 98 102 101 98 99 103 102 100 101 105 104 101 102 106 105 102 103 107 106 104 105 109 108 105 106 110 109 106 107 111 110 112 113 117 116 113 114 118 117 114 115 119 118 116 117 121 120 117 118 122 121 118 119 123 122 120 121 125 124 121 122 126 125 122 123 127 126 128 129 133 132 129 130 134 133 130 131 135 134 132 133 137 136 133 134 138 137 134 135 139 138 136 137 141 140 137 138 142 141 138 139 143 142 144 145 149 148 145 146 150 149 146 147 151 150 148 149 153 152 149 150 154 153 150 151 155 154 152 153 157 156 153 154 158 157 154 155 159 158 160 161 165 164 161 162 166 165 162 163 167 166 164 165 169 168 165 166 170 169 166 167 171 170 168 169 173 172 169 170 174 173 170 171 175 174 176 177 181 180 177 178 182 181 178 179 183 182 180 181 185 184 181 182 186 185 182 183 187 186 184 185 189 188 185 186 190 189 186 187 191 190 192 193 197 196 193 194 198 197 194 195 199 198 196 197 201 200 197 198 202 201 198 199 203 202 200 201 205 204 201 202 206 205 202 203 207 206 208 209 213 212 209 210 214 213 210 211 215 214 212 213 217 216 213 214 218 217 214 215 219 218 216 217 221 220 217 218 222 221 218 219 223 222 224 225 229 228 225 226 230 229 226 227 231 230 228 229 233 232 229 230 234 233 230 231 235 234 232 233 237 236 233 234 238 237 234 235 239 238 240 241 245 244 241 242 246 245 242 243 247 246 244 245 249 248 245 246 250 249 246 247 251 250 248 249 253 252 249 250 254 253 250 251 255 254 256 257 261 260 257 258 262 261 258 259 263 262 260 261 265 264 261 262 266 265 262 263 267 266 264 265 269 268 265 266 270 269 266 267 271 270 272 273 277 276 273 274 278 277 274 275 279 278 276 277 281 280 277 278 282 281 278 279 283 282 280 281 285 284 281 282 286 285 282 283 287 286 288 289 293 292 289 290 294 293 290 291 295 294 292 293 297 296 293 294 298 297 294 295 299 298 296 297 301 300 297 298 302 301 298 299 303 302 304 305 309 308 305 306 310 309 306 307 311 310 308 309 313 312 309 310 314 313 310 311 315 314 312 313 317 316 313 314 318 317 314 315 319 318 320 321 325 324 321 322 326 325 322 323 327 326 324 325 329 328 325 326 330 329 326 327 331 330 328 329 333 332 329 330 334 333 330 331 335 334 336 337 341 340 337 338 342 341 338 339 343 342 340 341 345 344 341 342 346 345 342 343 347 346 344 345 349 348 345 346 350 349 346 347 351 350 352 353 357 356 353 354 358 357 354 355 359 358 356 357 361 360 357 358 362 361 358 359 363 362 360 361 365 364 361 362 366 365 362 363 367 366 368 369 373 372 369 370 374 373 370 371 375 374 372 373 377 376 373 374 378 377 374 375 379 378 376 377 381 380 377 378 382 381 378 379 383 382 384 385 389 388 385 386 390 389 386 387 391 390 388 389 393 392 389 390 394 393 390 391 395 394 392 393 397 396 393 394 398 397 394 395 399 398 400 401 405 404 401 402 406 405 402 403 407 406 404 405 409 408 405 406 410 409 406 407 411 410 408 409 413 412 409 410 414 413 410 411 415 414 416 417 421 420 417 418 422 421 418 419 423 422 420 421 425 424 421 422 426 425 422 423 427 426 424 425 429 428 425 426 430 429 426 427 431 430 432 433 437 436 433 434 438 437 434 435 439 438 436 437 441 440 437 438 442 441 438 439 443 442 440 441 445 444 441 442 446 445 442 443 447 446 448 449 453 452 449 450 454 453 450 451 455 454 452 453 457 456 453 454 458 457 454 455 459 458 456 457 461 460 457 458 462 461 458 459 463 462 464 465 469 468 465 466 470 469 466 467 471 470 468 469 473 472 469 470 474 473 470 471 475 474 472 473 477 476 473 474 478 477 474 475 479 478 480 481 485 484 481 482 486 485 482 483 487 486 484 485 489 488 485 486 490 489 486 487 491 490 488 489 493 492 489 490 494 493 490 491 495 494 496 497 501 500 497 498 502 501 498 499 503 502 500 501 505 504 501 502 506 505 502 503 507 506 504 505 509 508 505 506 510 509 506 507 511 510\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 21 21 21 21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 29 29 29 29 29 29 29 29 29 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BlobbyAdd.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 3 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\">2 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0 16</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16 23</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001 1002</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BlobbyDivide.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 3 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\">5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0 16</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16 23</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001 1002</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BlobbyMaximum.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 3 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\">2 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0 16</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16 23</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001 1002</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BlobbyMinimum.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 3 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\">2 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0 16</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16 23</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001 1002</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BlobbyMultiply.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 3 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\">2 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0 16</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16 23</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001 1002</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BlobbyNegate.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\">6</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BlobbySubtract.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 3 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\">4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0 16</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16 23</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001 1002</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BridgeEdges.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 0 5 -1.6666666666666665 0 5 1.6666666666666665 0 5 5 0 5 -5 0 0 -1.6666666666666665 0 0 1.6666666666666665 0 0 5 0 0 -5 0 -5 -1.6666666666666665 0 -5 1.6666666666666665 0 -5 5 0 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 2 3 7 6 4 5 9 8 6 7 11 10 6 5 1 2\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 3 1 3 7</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 7 2 1 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BridgeEdges.source.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 0 5 -1.6666666666666665 0 5 1.6666666666666665 0 5 5 0 5 -5 0 0 -1.6666666666666665 0 0 1.6666666666666665 0 0 5 0 0 -5 -0 -5 -1.6666666666666665 -0 -5 1.6666666666666665 0 -5 5 0 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">2 2 2 2</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 2 3 7 6 4 5 9 8 6 7 11 10\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BridgeFaces.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 3.5355339059327378 -3.5355339059327373 5 3.0615158845559431e-16 -5 5 -3.5355339059327373 -3.5355339059327378 5 -5 -6.1230317691118863e-16 5 -3.5355339059327386 3.5355339059327373 5 -9.1845476536678294e-16 5 5 3.5355339059327369 3.5355339059327386 5 5 0 1.666666666666667 3.5355339059327378 -3.5355339059327373 1.666666666666667 3.0615158845559431e-16 -5 1.666666666666667 -3.5355339059327373 -3.5355339059327378 1.666666666666667 -5 -6.1230317691118863e-16 1.666666666666667 -3.5355339059327386 3.5355339059327373 1.666666666666667 -9.1845476536678294e-16 5 1.666666666666667 3.5355339059327369 3.5355339059327386 1.666666666666667 5 0 -1.6666666666666663 3.5355339059327378 -3.5355339059327373 -1.6666666666666663 3.0615158845559431e-16 -5 -1.6666666666666663 -3.5355339059327373 -3.5355339059327378 -1.6666666666666663 -5 -6.1230317691118863e-16 -1.6666666666666663 -3.5355339059327386 3.5355339059327373 -1.6666666666666663 -9.1845476536678294e-16 5 -1.6666666666666663 3.5355339059327369 3.5355339059327386 -1.6666666666666663 5 0 -5 3.5355339059327378 -3.5355339059327373 -5 3.0615158845559431e-16 -5 -5 -3.5355339059327373 -3.5355339059327378 -5 -5 -6.1230317691118863e-16 -5 -3.5355339059327386 3.5355339059327373 -5 -9.1845476536678294e-16 5 -5 3.5355339059327369 3.5355339059327386 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 92 93 94 95 88 97 98 99 100 101 102 103 96 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 96 104 108 112 116</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 9 8 1 2 10 9 2 3 11 10 3 4 12 11 4 5 13 12 5 6 14 13 6 7 15 14 7 0 8 15 9 10 18 17 10 11 19 18 11 12 20 19 13 14 22 21 14 15 23 22 15 8 16 23 16 17 25 24 17 18 26 25 18 19 27 26 19 20 28 27 20 21 29 28 21 22 30 29 22 23 31 30 23 16 24 31 0 7 6 5 4 3 2 1 24 25 26 27 28 29 30 31 8 9 12 13 9 17 20 12 17 16 21 20 16 8 13 21\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 36 37 38 39 40 41 42 43 44 45 46 47 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 32 33 48 49 33 34 51 48 34 35 50 51 35 32 49 50</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24 25 10 10 10 10</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 36 37 38 39 40 41 42 43 44 45 46 47 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 32 33 48 49 33 34 51 48 34 35 50 51 35 32 49 50</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BridgeFaces.source.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 3.5355339059327378 -3.5355339059327373 5 3.0615158845559431e-16 -5 5 -3.5355339059327373 -3.5355339059327378 5 -5 -6.1230317691118863e-16 5 -3.5355339059327386 3.5355339059327373 5 -9.1845476536678294e-16 5 5 3.5355339059327369 3.5355339059327386 5 5 0 1.666666666666667 3.5355339059327378 -3.5355339059327373 1.666666666666667 3.0615158845559431e-16 -5 1.666666666666667 -3.5355339059327373 -3.5355339059327378 1.666666666666667 -5 -6.1230317691118863e-16 1.666666666666667 -3.5355339059327386 3.5355339059327373 1.666666666666667 -9.1845476536678294e-16 5 1.666666666666667 3.5355339059327369 3.5355339059327386 1.666666666666667 5 0 -1.6666666666666663 3.5355339059327378 -3.5355339059327373 -1.6666666666666663 3.0615158845559431e-16 -5 -1.6666666666666663 -3.5355339059327373 -3.5355339059327378 -1.6666666666666663 -5 -6.1230317691118863e-16 -1.6666666666666663 -3.5355339059327386 3.5355339059327373 -1.6666666666666663 -9.1845476536678294e-16 5 -1.6666666666666663 3.5355339059327369 3.5355339059327386 -1.6666666666666663 5 0 -5 3.5355339059327378 -3.5355339059327373 -5 3.0615158845559431e-16 -5 -5 -3.5355339059327373 -3.5355339059327378 -5 -5 -6.1230317691118863e-16 -5 -3.5355339059327386 3.5355339059327373 -5 -9.1845476536678294e-16 5 -5 3.5355339059327369 3.5355339059327386 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 100 101 102 103 96 105 106 107 108 109 110 111 104</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 104</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 9 8 1 2 10 9 2 3 11 10 3 4 12 11 4 5 13 12 5 6 14 13 6 7 15 14 7 0 8 15 8 9 17 16 9 10 18 17 10 11 19 18 11 12 20 19 12 13 21 20 13 14 22 21 14 15 23 22 15 8 16 23 16 17 25 24 17 18 26 25 18 19 27 26 19 20 28 27 20 21 29 28 21 22 30 29 22 23 31 30 23 16 24 31 0 7 6 5 4 3 2 1 24 25 26 27 28 29 30 31\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BulgePoints.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1 0 5 0.98078528040323043 -0.19509032201612825 5 0.92387953251128674 -0.38268343236508978 5 0.83146961230254524 -0.55557023301960218 5 0.70710678118654757 -0.70710678118654746 5 0.55557023301960229 -0.83146961230254512 5 0.38268343236508984 -0.92387953251128674 5 0.1950903220161283 -0.98078528040323043 5 6.123233995736766e-17 -1 5 -0.19509032201612819 -0.98078528040323043 5 -0.38268343236508973 -0.92387953251128674 5 -0.55557023301960196 -0.83146961230254546 5 -0.70710678118654746 -0.70710678118654757 5 -0.83146961230254535 -0.55557023301960218 5 -0.92387953251128674 -0.38268343236508984 5 -0.98078528040323043 -0.19509032201612858 5 -1 -1.2246467991473532e-16 5 -0.98078528040323043 0.19509032201612836 5 -0.92387953251128674 0.38268343236508967 5 -0.83146961230254546 0.55557023301960196 5 -0.70710678118654768 0.70710678118654746 5 -0.55557023301960218 0.83146961230254524 5 -0.38268343236509034 0.92387953251128652 5 -0.19509032201612866 0.98078528040323032 5 -1.8369701987210297e-16 1 5 0.19509032201612828 0.98078528040323043 5 0.38268343236509 0.92387953251128663 5 0.55557023301960184 0.83146961230254557 5 0.70710678118654746 0.70710678118654768 5 0.83146961230254524 0.55557023301960218 5 0.92387953251128652 0.38268343236509039 5 0.98078528040323032 0.19509032201612872 5 1.5059644256269407 0 3 1.4770277414658088 -0.19509032201612825 3 1.3913297095268464 -0.38268343236508978 3 1.2521636571174575 -0.55557023301960218 3 1.064877657586514 -0.70710678118654746 3 0.83666900686479095 -0.83146961230254512 3 0.57630763541863872 -0.92387953251128674 3 0.29379908474039357 -0.98078528040323043 3 9.2213725673690756e-17 -1 3 -0.2937990847403934 -0.98078528040323043 3 -0.5763076354186385 -0.92387953251128674 3 -0.8366690068647904 -0.83146961230254546 3 -1.0648776575865138 -0.70710678118654757 3 -1.2521636571174577 -0.55557023301960218 3 -1.3913297095268464 -0.38268343236508984 3 -1.4770277414658088 -0.19509032201612858 3 -1.5059644256269407 -1.2246467991473532e-16 3 -1.4770277414658088 0.19509032201612836 3 -1.3913297095268464 0.38268343236508967 3 -1.2521636571174579 0.55557023301960196 3 -1.0648776575865142 0.70710678118654746 3 -0.83666900686479073 0.83146961230254524 3 -0.5763076354186395 0.92387953251128652 3 -0.29379908474039412 0.98078528040323032 3 -2.7664117702107227e-16 1 3 0.29379908474039351 0.98078528040323043 3 0.57630763541863894 0.92387953251128663 3 0.83666900686479029 0.83146961230254557 3 1.0648776575865138 0.70710678118654768 3 1.2521636571174575 0.55557023301960218 3 1.391329709526846 0.38268343236509039 3 1.4770277414658086 0.19509032201612872 3 2.6970562748477138 0 1 2.6452330947898073 -0.19509032201612825 1 2.4917550903629384 -0.38268343236508978 1 2.2425203352057754 -0.55557023301960218 1 1.9071067811865474 -0.70710678118654746 1 1.4984041830841248 -0.83146961230254512 1 1.0321187525405262 -0.92387953251128674 1 0.52616957715565993 -0.98078528040323043 1 1.6514706670562685e-16 -1 1 -0.5261695771556596 -0.98078528040323043 1 -1.032118752540526 -0.92387953251128674 1 -1.4984041830841239 -0.83146961230254546 1 -1.9071067811865472 -0.70710678118654757 1 -2.2425203352057759 -0.55557023301960218 1 -2.4917550903629384 -0.38268343236508984 1 -2.6452330947898073 -0.19509032201612858 1 -2.6970562748477138 -1.2246467991473532e-16 1 -2.6452330947898073 0.19509032201612836 1 -2.4917550903629384 0.38268343236508967 1 -2.2425203352057759 0.55557023301960196 1 -1.9071067811865479 0.70710678118654746 1 -1.4984041830841246 0.83146961230254524 1 -1.0321187525405275 0.92387953251128652 1 -0.52616957715566093 0.98078528040323032 1 -4.9544120011688049e-16 1 1 0.52616957715565982 0.98078528040323043 1 1.0321187525405267 0.92387953251128663 1 1.4984041830841237 0.83146961230254557 1 1.9071067811865472 0.70710678118654768 1 2.2425203352057754 0.55557023301960218 1 2.4917550903629375 0.38268343236509039 1 2.6452330947898068 0.19509032201612872 1 2.6970562748477138 0 -1 2.6452330947898073 -0.19509032201612825 -1 2.4917550903629384 -0.38268343236508978 -1 2.2425203352057754 -0.55557023301960218 -1 1.9071067811865474 -0.70710678118654746 -1 1.4984041830841248 -0.83146961230254512 -1 1.0321187525405262 -0.92387953251128674 -1 0.52616957715565993 -0.98078528040323043 -1 1.6514706670562685e-16 -1 -1 -0.5261695771556596 -0.98078528040323043 -1 -1.032118752540526 -0.92387953251128674 -1 -1.4984041830841239 -0.83146961230254546 -1 -1.9071067811865472 -0.70710678118654757 -1 -2.2425203352057759 -0.55557023301960218 -1 -2.4917550903629384 -0.38268343236508984 -1 -2.6452330947898073 -0.19509032201612858 -1 -2.6970562748477138 -1.2246467991473532e-16 -1 -2.6452330947898073 0.19509032201612836 -1 -2.4917550903629384 0.38268343236508967 -1 -2.2425203352057759 0.55557023301960196 -1 -1.9071067811865479 0.70710678118654746 -1 -1.4984041830841246 0.83146961230254524 -1 -1.0321187525405275 0.92387953251128652 -1 -0.52616957715566093 0.98078528040323032 -1 -4.9544120011688049e-16 1 -1 0.52616957715565982 0.98078528040323043 -1 1.0321187525405267 0.92387953251128663 -1 1.4984041830841237 0.83146961230254557 -1 1.9071067811865472 0.70710678118654768 -1 2.2425203352057754 0.55557023301960218 -1 2.4917550903629375 0.38268343236509039 -1 2.6452330947898068 0.19509032201612872 -1 1.5059644256269407 0 -3 1.4770277414658088 -0.19509032201612825 -3 1.3913297095268464 -0.38268343236508978 -3 1.2521636571174575 -0.55557023301960218 -3 1.064877657586514 -0.70710678118654746 -3 0.83666900686479095 -0.83146961230254512 -3 0.57630763541863872 -0.92387953251128674 -3 0.29379908474039357 -0.98078528040323043 -3 9.2213725673690756e-17 -1 -3 -0.2937990847403934 -0.98078528040323043 -3 -0.5763076354186385 -0.92387953251128674 -3 -0.8366690068647904 -0.83146961230254546 -3 -1.0648776575865138 -0.70710678118654757 -3 -1.2521636571174577 -0.55557023301960218 -3 -1.3913297095268464 -0.38268343236508984 -3 -1.4770277414658088 -0.19509032201612858 -3 -1.5059644256269407 -1.2246467991473532e-16 -3 -1.4770277414658088 0.19509032201612836 -3 -1.3913297095268464 0.38268343236508967 -3 -1.2521636571174579 0.55557023301960196 -3 -1.0648776575865142 0.70710678118654746 -3 -0.83666900686479073 0.83146961230254524 -3 -0.5763076354186395 0.92387953251128652 -3 -0.29379908474039412 0.98078528040323032 -3 -2.7664117702107227e-16 1 -3 0.29379908474039351 0.98078528040323043 -3 0.57630763541863894 0.92387953251128663 -3 0.83666900686479029 0.83146961230254557 -3 1.0648776575865138 0.70710678118654768 -3 1.2521636571174575 0.55557023301960218 -3 1.391329709526846 0.38268343236509039 -3 1.4770277414658086 0.19509032201612872 -3 1 0 -5 0.98078528040323043 -0.19509032201612825 -5 0.92387953251128674 -0.38268343236508978 -5 0.83146961230254524 -0.55557023301960218 -5 0.70710678118654757 -0.70710678118654746 -5 0.55557023301960229 -0.83146961230254512 -5 0.38268343236508984 -0.92387953251128674 -5 0.1950903220161283 -0.98078528040323043 -5 6.123233995736766e-17 -1 -5 -0.19509032201612819 -0.98078528040323043 -5 -0.38268343236508973 -0.92387953251128674 -5 -0.55557023301960196 -0.83146961230254546 -5 -0.70710678118654746 -0.70710678118654757 -5 -0.83146961230254535 -0.55557023301960218 -5 -0.92387953251128674 -0.38268343236508984 -5 -0.98078528040323043 -0.19509032201612858 -5 -1 -1.2246467991473532e-16 -5 -0.98078528040323043 0.19509032201612836 -5 -0.92387953251128674 0.38268343236508967 -5 -0.83146961230254546 0.55557023301960196 -5 -0.70710678118654768 0.70710678118654746 -5 -0.55557023301960218 0.83146961230254524 -5 -0.38268343236509034 0.92387953251128652 -5 -0.19509032201612866 0.98078528040323032 -5 -1.8369701987210297e-16 1 -5 0.19509032201612828 0.98078528040323043 -5 0.38268343236509 0.92387953251128663 -5 0.55557023301960184 0.83146961230254557 -5 0.70710678118654746 0.70710678118654768 -5 0.83146961230254524 0.55557023301960218 -5 0.92387953251128652 0.38268343236509039 -5 0.98078528040323032 0.19509032201612872 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.BulgePoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1 0 5 0.98078528040323043 -0.19509032201612825 5 0.92387953251128674 -0.38268343236508978 5 0.83146961230254524 -0.55557023301960218 5 0.70710678118654757 -0.70710678118654746 5 0.55557023301960229 -0.83146961230254524 5 0.38268343236508984 -0.92387953251128674 5 0.19509032201612833 -0.98078528040323043 5 6.1230317691118863e-17 -1 5 -0.19509032201612819 -0.98078528040323043 5 -0.38268343236508973 -0.92387953251128674 5 -0.55557023301960196 -0.83146961230254546 5 -0.70710678118654746 -0.70710678118654757 5 -0.83146961230254535 -0.55557023301960218 5 -0.92387953251128674 -0.38268343236508989 5 -0.98078528040323043 -0.19509032201612861 5 -1 -1.2246063538223773e-16 5 -0.98078528040323043 0.19509032201612836 5 -0.92387953251128685 0.38268343236508967 5 -0.83146961230254546 0.55557023301960196 5 -0.70710678118654768 0.70710678118654746 5 -0.55557023301960218 0.83146961230254524 5 -0.38268343236509034 0.92387953251128652 5 -0.19509032201612866 0.98078528040323032 5 -1.8369095307335659e-16 1 5 0.1950903220161283 0.98078528040323043 5 0.38268343236509 0.92387953251128663 5 0.55557023301960184 0.83146961230254546 5 0.70710678118654735 0.70710678118654768 5 0.83146961230254524 0.55557023301960218 5 0.92387953251128652 0.38268343236509039 5 0.98078528040323032 0.19509032201612872 5 1.5059644256269407 0 3 1.4770277414658088 -0.19509032201612825 3 1.3913297095268464 -0.38268343236508978 3 1.2521636571174575 -0.55557023301960218 3 1.064877657586514 -0.70710678118654746 3 0.83666900686479095 -0.83146961230254524 3 0.57630763541863872 -0.92387953251128674 3 0.29379908474039362 -0.98078528040323043 3 9.2210680212660925e-17 -1 3 -0.2937990847403934 -0.98078528040323043 3 -0.5763076354186385 -0.92387953251128674 3 -0.8366690068647904 -0.83146961230254546 3 -1.0648776575865138 -0.70710678118654757 3 -1.2521636571174577 -0.55557023301960218 3 -1.3913297095268464 -0.38268343236508989 3 -1.4770277414658088 -0.19509032201612861 3 -1.5059644256269407 -1.2246063538223773e-16 3 -1.4770277414658088 0.19509032201612836 3 -1.3913297095268466 0.38268343236508967 3 -1.2521636571174579 0.55557023301960196 3 -1.0648776575865142 0.70710678118654746 3 -0.83666900686479073 0.83146961230254524 3 -0.5763076354186395 0.92387953251128652 3 -0.29379908474039412 0.98078528040323032 3 -2.7663204063798277e-16 1 3 0.29379908474039357 0.98078528040323043 3 0.57630763541863894 0.92387953251128663 3 0.83666900686479029 0.83146961230254546 3 1.0648776575865135 0.70710678118654768 3 1.2521636571174575 0.55557023301960218 3 1.391329709526846 0.38268343236509039 3 1.4770277414658086 0.19509032201612872 3 2.6970562748477143 0 0.99999999999999978 2.6452330947898077 -0.19509032201612825 0.99999999999999978 2.4917550903629389 -0.38268343236508978 0.99999999999999978 2.2425203352057759 -0.55557023301960218 0.99999999999999978 1.9071067811865479 -0.70710678118654746 0.99999999999999978 1.498404183084125 -0.83146961230254524 0.99999999999999978 1.0321187525405264 -0.92387953251128674 0.99999999999999978 0.52616957715566004 -0.98078528040323043 0.99999999999999978 1.6514161253975113e-16 -1 0.99999999999999978 -0.52616957715565971 -0.98078528040323043 0.99999999999999978 -1.0321187525405262 -0.92387953251128674 0.99999999999999978 -1.4984041830841242 -0.83146961230254546 0.99999999999999978 -1.9071067811865474 -0.70710678118654757 0.99999999999999978 -2.2425203352057763 -0.55557023301960218 0.99999999999999978 -2.4917550903629389 -0.38268343236508989 0.99999999999999978 -2.6452330947898077 -0.19509032201612861 0.99999999999999978 -2.6970562748477143 -1.2246063538223773e-16 0.99999999999999978 -2.6452330947898077 0.19509032201612836 0.99999999999999978 -2.4917550903629389 0.38268343236508967 0.99999999999999978 -2.2425203352057763 0.55557023301960196 0.99999999999999978 -1.9071067811865481 0.70710678118654746 0.99999999999999978 -1.4984041830841248 0.83146961230254524 0.99999999999999978 -1.0321187525405278 0.92387953251128652 0.99999999999999978 -0.52616957715566104 0.98078528040323032 0.99999999999999978 -4.9542483761925337e-16 1 0.99999999999999978 0.52616957715566004 0.98078528040323043 0.99999999999999978 1.0321187525405269 0.92387953251128663 0.99999999999999978 1.4984041830841239 0.83146961230254546 0.99999999999999978 1.9071067811865472 0.70710678118654768 0.99999999999999978 2.2425203352057759 0.55557023301960218 0.99999999999999978 2.491755090362938 0.38268343236509039 0.99999999999999978 2.6452330947898073 0.19509032201612872 0.99999999999999978 2.6970562748477143 0 -0.99999999999999978 2.6452330947898077 -0.19509032201612825 -0.99999999999999978 2.4917550903629389 -0.38268343236508978 -0.99999999999999978 2.2425203352057759 -0.55557023301960218 -0.99999999999999978 1.9071067811865479 -0.70710678118654746 -0.99999999999999978 1.498404183084125 -0.83146961230254524 -0.99999999999999978 1.0321187525405264 -0.92387953251128674 -0.99999999999999978 0.52616957715566004 -0.98078528040323043 -0.99999999999999978 1.6514161253975113e-16 -1 -0.99999999999999978 -0.52616957715565971 -0.98078528040323043 -0.99999999999999978 -1.0321187525405262 -0.92387953251128674 -0.99999999999999978 -1.4984041830841242 -0.83146961230254546 -0.99999999999999978 -1.9071067811865474 -0.70710678118654757 -0.99999999999999978 -2.2425203352057763 -0.55557023301960218 -0.99999999999999978 -2.4917550903629389 -0.38268343236508989 -0.99999999999999978 -2.6452330947898077 -0.19509032201612861 -0.99999999999999978 -2.6970562748477143 -1.2246063538223773e-16 -0.99999999999999978 -2.6452330947898077 0.19509032201612836 -0.99999999999999978 -2.4917550903629389 0.38268343236508967 -0.99999999999999978 -2.2425203352057763 0.55557023301960196 -0.99999999999999978 -1.9071067811865481 0.70710678118654746 -0.99999999999999978 -1.4984041830841248 0.83146961230254524 -0.99999999999999978 -1.0321187525405278 0.92387953251128652 -0.99999999999999978 -0.52616957715566104 0.98078528040323032 -0.99999999999999978 -4.9542483761925337e-16 1 -0.99999999999999978 0.52616957715566004 0.98078528040323043 -0.99999999999999978 1.0321187525405269 0.92387953251128663 -0.99999999999999978 1.4984041830841239 0.83146961230254546 -0.99999999999999978 1.9071067811865472 0.70710678118654768 -0.99999999999999978 2.2425203352057759 0.55557023301960218 -0.99999999999999978 2.491755090362938 0.38268343236509039 -0.99999999999999978 2.6452330947898073 0.19509032201612872 -0.99999999999999978 1.5059644256269404 0 -3.0000000000000004 1.4770277414658088 -0.19509032201612825 -3.0000000000000004 1.3913297095268464 -0.38268343236508978 -3.0000000000000004 1.2521636571174575 -0.55557023301960218 -3.0000000000000004 1.064877657586514 -0.70710678118654746 -3.0000000000000004 0.83666900686479084 -0.83146961230254524 -3.0000000000000004 0.57630763541863861 -0.92387953251128674 -3.0000000000000004 0.29379908474039362 -0.98078528040323043 -3.0000000000000004 9.2210680212660913e-17 -1 -3.0000000000000004 -0.2937990847403934 -0.98078528040323043 -3.0000000000000004 -0.5763076354186385 -0.92387953251128674 -3.0000000000000004 -0.83666900686479029 -0.83146961230254546 -3.0000000000000004 -1.0648776575865138 -0.70710678118654757 -3.0000000000000004 -1.2521636571174575 -0.55557023301960218 -3.0000000000000004 -1.3913297095268462 -0.38268343236508989 -3.0000000000000004 -1.4770277414658086 -0.19509032201612861 -3.0000000000000004 -1.5059644256269404 -1.2246063538223773e-16 -3.0000000000000004 -1.4770277414658088 0.19509032201612836 -3.0000000000000004 -1.3913297095268464 0.38268343236508967 -3.0000000000000004 -1.2521636571174577 0.55557023301960196 -3.0000000000000004 -1.064877657586514 0.70710678118654746 -3.0000000000000004 -0.83666900686479073 0.83146961230254524 -3.0000000000000004 -0.5763076354186395 0.92387953251128652 -3.0000000000000004 -0.29379908474039412 0.98078528040323032 -3.0000000000000004 -2.7663204063798273e-16 1 -3.0000000000000004 0.29379908474039357 0.98078528040323043 -3.0000000000000004 0.57630763541863894 0.92387953251128663 -3.0000000000000004 0.83666900686479029 0.83146961230254546 -3.0000000000000004 1.0648776575865135 0.70710678118654768 -3.0000000000000004 1.2521636571174575 0.55557023301960218 -3.0000000000000004 1.3913297095268458 0.38268343236509039 -3.0000000000000004 1.4770277414658086 0.19509032201612872 -3.0000000000000004 1 0 -5 0.98078528040323043 -0.19509032201612825 -5 0.92387953251128674 -0.38268343236508978 -5 0.83146961230254524 -0.55557023301960218 -5 0.70710678118654757 -0.70710678118654746 -5 0.55557023301960229 -0.83146961230254524 -5 0.38268343236508984 -0.92387953251128674 -5 0.19509032201612833 -0.98078528040323043 -5 6.1230317691118863e-17 -1 -5 -0.19509032201612819 -0.98078528040323043 -5 -0.38268343236508973 -0.92387953251128674 -5 -0.55557023301960196 -0.83146961230254546 -5 -0.70710678118654746 -0.70710678118654757 -5 -0.83146961230254535 -0.55557023301960218 -5 -0.92387953251128674 -0.38268343236508989 -5 -0.98078528040323043 -0.19509032201612861 -5 -1 -1.2246063538223773e-16 -5 -0.98078528040323043 0.19509032201612836 -5 -0.92387953251128685 0.38268343236508967 -5 -0.83146961230254546 0.55557023301960196 -5 -0.70710678118654768 0.70710678118654746 -5 -0.55557023301960218 0.83146961230254524 -5 -0.38268343236509034 0.92387953251128652 -5 -0.19509032201612866 0.98078528040323032 -5 -1.8369095307335659e-16 1 -5 0.1950903220161283 0.98078528040323043 -5 0.38268343236509 0.92387953251128663 -5 0.55557023301960184 0.83146961230254546 -5 0.70710678118654735 0.70710678118654768 -5 0.83146961230254524 0.55557023301960218 -5 0.92387953251128652 0.38268343236509039 -5 0.98078528040323032 0.19509032201612872 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CARVEBoolean.benchmark.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 -6.1232339957367663e-16 3.0616169978683831e-16 -4.904022475614136 -6.0056954277075304e-16 -0.97545161008064096 -4.904022475614136 -6.0056954277075304e-16 0.97545161008064163 -4.9039264020161522 -0.97545161008064307 3.0616169978683831e-16 -4.9039264020161522 0.97545161008064185 3.0616169978683831e-16 -4.809793058848955 -0.95672732394189397 -0.97545161008064096 -4.809793058848955 -0.95672732394189397 0.97545161008064163 -4.809793058848955 0.95672732394189275 -0.97545161008064096 -4.809793058848955 0.95672732394189275 0.97545161008064163 -4.6197782648938777 -5.6575966648728e-16 -1.9134171618254485 -4.6197782648938777 -5.6575966648728e-16 1.9134171618254492 -4.6193976625564339 -1.9134171618254494 3.0616169978683831e-16 -4.6193976625564339 1.9134171618254483 3.0616169978683831e-16 -4.6144916507916856 -4.2383418223756675e-16 1.9233176216143502 -4.6144916507916847 -4.2383418223756675e-16 -1.9233176216143502 -4.5310105209346911 -0.90127402934125844 -1.9134171618254485 -4.5310105209346911 -0.90127402934125844 1.9134171618254492 -4.5310105209346911 0.90127402934125733 -1.9134171618254485 -4.5310105209346911 0.90127402934125733 1.9134171618254492 -4.5307259921952312 -1.8766881533635629 -0.97545161008064096 -4.5307259921952312 -1.8766881533635629 0.97545161008064163 -4.5307259921952312 1.8766881533635618 -0.97545161008064096 -4.5307259921952312 1.8766881533635618 0.97545161008064163 -4.5258254876400885 -0.90024266209368609 -1.9233176216143502 -4.5258254876400885 -0.90024266209368609 1.9233176216143502 -4.5258254876400885 0.9002426620936852 -1.9233176216143502 -4.5258254876400885 0.9002426620936852 1.9233176216143502 -4.2681185836759594 -1.7679126031752286 -1.9134171618254485 -4.2681185836759594 -1.7679126031752286 1.9134171618254492 -4.2681185836759594 1.7679126031752275 -1.9134171618254485 -4.2681185836759594 1.7679126031752275 1.9134171618254492 -4.2632343891106581 -1.765889503545012 1.9233176216143502 -4.2632343891106581 -1.7658895035450115 -1.9233176216143502 -4.2632343891106581 1.7658895035450108 -1.9233176216143502 -4.2632343891106581 1.7658895035450111 1.9233176216143502 -4.2346331352698208 -2.5929649573357535e-16 1.8477590650225735 -4.2346331352698199 -2.592964957335753e-16 -1.8477590650225733 -4.1573480615127272 2.77785116509801 3.0616169978683831e-16 -4.1573480615127263 -2.7778511650980109 3.0616169978683831e-16 -4.153265846980422 -0.82613594197995643 1.8477590650225735 -4.153265846980422 0.82613594197995588 1.8477590650225735 -4.1532658469804211 -0.82613594197995632 -1.8477590650225733 -4.1532658469804211 0.82613594197995566 -1.8477590650225733 -4.0775456665218552 2.7245289095103109 -0.97545161008064096 -4.0775456665218552 2.7245289095103109 0.97545161008064163 -4.0775456665218544 -2.7245289095103118 -0.97545161008064096 -4.0775456665218544 -2.7245289095103118 0.97545161008064163 -3.9122908813698865 -1.6205239430119969 1.8477590650225735 -3.9122908813698865 1.6205239430119962 1.8477590650225735 -3.9122908813698856 -1.6205239430119964 -1.8477590650225733 -3.9122908813698856 1.620523943011996 -1.8477590650225733 -3.8412052428350387 2.5666112871259839 -1.9134171618254485 -3.8412052428350387 2.5666112871259839 1.9134171618254492 -3.8412052428350383 -2.5666112871259852 -1.9134171618254485 -3.8412052428350383 -2.5666112871259852 1.9134171618254492 -3.8368095838570957 2.5636742016973439 -1.9233176216143502 -3.8368095838570957 2.5636742016973439 1.9233176216143502 -3.8368095838570948 -2.5636742016973457 -1.9233176216143502 -3.8368095838570948 -2.5636742016973457 1.9233176216143502 -3.5857864376269051 -2.1956609416328899e-16 -1.4142135623730954 -3.5857864376269051 -2.1956609416328899e-16 1.4142135623730949 -3.5355339059327386 3.5355339059327373 3.0616169978683831e-16 -3.5355339059327373 -3.5355339059327378 3.0616169978683831e-16 -3.5209687712263102 2.3526361177143817 1.8477590650225735 -3.5209687712263098 2.3526361177143813 -1.8477590650225733 -3.5209687712263094 -2.3526361177143835 1.8477590650225735 -3.5209687712263089 -2.3526361177143826 -1.8477590650225733 -3.5168865566940046 -0.69955223079769857 -1.4142135623730954 -3.5168865566940046 -0.69955223079769857 1.4142135623730949 -3.5168865566940046 0.69955223079769813 -1.4142135623730954 -3.5168865566940046 0.69955223079769813 1.4142135623730949 -3.4676675475979968 3.4676675475979954 -0.97545161008064096 -3.4676675475979968 3.4676675475979954 0.97545161008064163 -3.4676675475979954 -3.4676675475979963 -0.97545161008064096 -3.4676675475979954 -3.4676675475979963 0.97545161008064163 -3.3128346976800573 -1.3722210616792521 -1.4142135623730954 -3.3128346976800573 -1.3722210616792521 1.4142135623730949 -3.3128346976800573 1.3722210616792518 -1.4142135623730954 -3.3128346976800573 1.3722210616792518 1.4142135623730949 -3.2666765386846839 3.266676538684683 -1.9134171618254485 -3.2666765386846839 3.266676538684683 1.9134171618254492 -3.266676538684683 -3.2666765386846834 -1.9134171618254485 -3.266676538684683 -3.2666765386846834 1.9134171618254492 -3.2629383380035071 3.2629383380035062 -1.9233176216143502 -3.2629383380035071 3.2629383380035062 1.9233176216143502 -3.2629383380035062 -3.2629383380035071 1.9233176216143502 -3.2629383380035062 -3.2629383380035066 -1.9233176216143502 -3.152240934977427 -1.9301908855806829e-16 -0.76536686473018078 -3.1522409349774265 -1.9301908855806826e-16 0.76536686473017956 -3.0916715093103768 -0.61497169907716764 -0.76536686473018078 -3.0916715093103768 0.6149716990771672 -0.76536686473018078 -3.0916715093103764 -0.61497169907716764 0.76536686473017956 -3.0916715093103764 0.6149716990771672 0.76536686473017956 -3 -1.8369701987210297e-16 0 -2.9943378057865409 2.9943378057865404 1.8477590650225735 -2.9943378057865404 -2.9943378057865409 1.8477590650225735 -2.9943378057865404 2.99433780578654 -1.8477590650225733 -2.99433780578654 -2.9943378057865404 -1.8477590650225733 -2.9814724590933683 1.992156206710908 -1.4142135623730954 -2.9814724590933683 1.992156206710908 1.4142135623730949 -2.9814724590933674 -1.9921562067109093 -1.4142135623730954 -2.9814724590933674 -1.9921562067109093 1.4142135623730949 -2.9423558412096913 -0.58527096604838502 0 -2.9423558412096913 0.58527096604838458 0 -2.9122908813698865 -1.2063103806389017 -0.76536686473018078 -2.9122908813698865 -1.2063103806389015 0.76536686473017956 -2.9122908813698865 1.2063103806389013 -0.76536686473018078 -2.9122908813698865 1.2063103806389013 0.76536686473017956 -2.7778511650980109 4.1573480615127263 3.0616169978683831e-16 -2.77785116509801 -4.1573480615127272 3.0616169978683831e-16 -2.77163859753386 -1.1480502970952695 0 -2.77163859753386 1.1480502970952693 0 -2.7245289095103118 4.0775456665218535 -0.97545161008064096 -2.7245289095103118 4.0775456665218535 0.97545161008064163 -2.7245289095103109 -4.0775456665218552 -0.97545161008064096 -2.7245289095103109 -4.0775456665218552 0.97545161008064163 -2.6209925480898946 1.7512912307793371 -0.76536686473018078 -2.6209925480898941 -1.751291230779338 -0.76536686473018078 -2.6209925480898941 1.7512912307793367 0.76536686473017956 -2.6209925480898937 -1.7512912307793378 0.76536686473017956 -2.5666112871259852 3.8412052428350374 -1.9134171618254485 -2.5666112871259852 3.8412052428350374 1.9134171618254492 -2.5666112871259839 -3.8412052428350387 -1.9134171618254485 -2.5666112871259839 -3.8412052428350387 1.9134171618254492 -2.5636742016973453 3.8368095838570944 1.9233176216143502 -2.5636742016973448 -3.8368095838570953 1.9233176216143502 -2.5636742016973448 -3.8368095838570948 -1.9233176216143502 -2.5636742016973448 3.8368095838570939 -1.9233176216143499 -2.5355339059327378 2.5355339059327373 -1.4142135623730954 -2.5355339059327378 2.5355339059327373 1.4142135623730949 -2.5355339059327373 -2.5355339059327378 -1.4142135623730954 -2.5355339059327373 -2.5355339059327378 1.4142135623730949 -2.4944088369076365 1.6667106990588059 0 -2.4944088369076356 -1.666710699058807 0 -2.3526361177143831 -3.5209687712263094 1.8477590650225735 -2.3526361177143831 3.5209687712263098 1.8477590650225735 -2.3526361177143822 -3.5209687712263089 -1.8477590650225733 -2.3526361177143822 3.5209687712263094 -1.8477590650225733 -2.2289709410563616 2.2289709410563612 -0.76536686473018078 -2.2289709410563612 -2.2289709410563616 -0.76536686473018078 -2.2289709410563612 2.2289709410563607 0.76536686473017956 -2.2289709410563607 -2.2289709410563612 0.76536686473017956 -2.1213203435596428 2.1213203435596424 0 -2.1213203435596424 -2.1213203435596428 0 -1.9921562067109089 -2.9814724590933674 -1.4142135623730954 -1.9921562067109089 -2.9814724590933674 1.4142135623730949 -1.9921562067109089 2.9814724590933679 -1.4142135623730954 -1.9921562067109089 2.9814724590933679 1.4142135623730949 -1.9134171618254516 4.6193976625564321 3.0616169978683831e-16 -1.9134171618254485 -4.6193976625564339 3.0616169978683831e-16 -1.8766881533635651 4.5307259921952303 -0.97545161008064096 -1.8766881533635651 4.5307259921952303 0.97545161008064163 -1.876688153363562 -4.5307259921952312 -0.97545161008064096 -1.876688153363562 -4.5307259921952312 0.97545161008064163 -1.7679126031752306 4.2681185836759576 -1.9134171618254485 -1.7679126031752306 4.2681185836759576 1.9134171618254492 -1.7679126031752277 -4.2681185836759594 -1.9134171618254485 -1.7679126031752277 -4.2681185836759594 1.9134171618254492 -1.7658895035450128 4.2632343891106572 1.9233176216143502 -1.7658895035450126 4.2632343891106572 -1.9233176216143502 -1.7658895035450113 -4.2632343891106581 1.9233176216143502 -1.7658895035450111 -4.2632343891106581 -1.9233176216143502 -1.7512912307793378 -2.6209925480898941 -0.76536686473018078 -1.7512912307793378 2.6209925480898941 -0.76536686473018078 -1.7512912307793376 -2.6209925480898937 0.76536686473017956 -1.7512912307793376 2.6209925480898937 0.76536686473017956 -1.6667106990588065 -2.4944088369076356 0 -1.6667106990588065 2.494408836907636 0 -1.6205239430119971 3.9122908813698865 1.8477590650225735 -1.6205239430119966 -3.9122908813698865 1.8477590650225735 -1.6205239430119966 3.9122908813698856 -1.8477590650225733 -1.6205239430119962 -3.9122908813698856 -1.8477590650225733 -1.3722210616792523 3.3128346976800573 -1.4142135623730954 -1.3722210616792523 3.3128346976800573 1.4142135623730949 -1.3722210616792521 -3.3128346976800573 -1.4142135623730954 -1.3722210616792521 -3.3128346976800573 1.4142135623730949 -1.2063103806389019 2.9122908813698865 -0.76536686473018078 -1.2063103806389017 2.9122908813698865 0.76536686473017956 -1.2063103806389015 -2.9122908813698865 -0.76536686473018078 -1.2063103806389013 -2.9122908813698865 0.76536686473017956 -1.1480502970952697 2.77163859753386 0 -1.1480502970952693 -2.77163859753386 0 -0.97545161008064329 4.9039264020161513 3.0616169978683831e-16 -0.97545161008064096 -4.9039264020161522 3.0616169978683831e-16 -0.9567273239418943 4.8097930588489541 -0.97545161008064096 -0.9567273239418943 4.8097930588489541 0.97545161008064163 -0.95672732394189197 -4.809793058848955 -0.97545161008064096 -0.95672732394189197 -4.809793058848955 0.97545161008064163 -0.90127402934125878 4.5310105209346903 -1.9134171618254485 -0.90127402934125878 4.5310105209346903 1.9134171618254492 -0.90127402934125656 -4.5310105209346911 -1.9134171618254485 -0.90127402934125656 -4.5310105209346911 1.9134171618254492 -0.90024266209368686 4.5258254876400876 1.9233176216143499 -0.90024266209368675 4.5258254876400876 -1.9233176216143497 -0.90024266209368498 -4.5258254876400885 1.9233176216143502 -0.90024266209368486 -4.5258254876400885 -1.9233176216143502 -0.82613594197995766 4.153265846980422 1.8477590650225735 -0.82613594197995743 4.1532658469804211 -1.8477590650225733 -0.8261359419799561 -4.153265846980422 1.8477590650225735 -0.82613594197995588 -4.1532658469804211 -1.8477590650225733 -0.69955223079769957 3.5168865566940046 -1.4142135623730954 -0.69955223079769957 3.5168865566940046 1.4142135623730949 -0.69955223079769824 -3.5168865566940046 -1.4142135623730954 -0.69955223079769824 -3.5168865566940046 1.4142135623730949 -0.61497169907716853 3.0916715093103768 -0.76536686473018078 -0.61497169907716842 3.0916715093103764 0.76536686473017956 -0.61497169907716742 -3.0916715093103768 -0.76536686473018078 -0.61497169907716731 -3.0916715093103764 0.76536686473017956 -0.5852709660483858 2.9423558412096913 0 -0.5852709660483848 -2.9423558412096913 0 -9.1848509936051479e-16 5 3.0616169978683831e-16 -9.008543141561295e-16 4.904022475614136 -0.97545161008064096 -9.008543141561295e-16 4.904022475614136 0.97545161008064163 -8.4863949973092005e-16 4.6197782648938777 -1.9134171618254485 -8.4863949973092005e-16 4.6197782648938777 1.9134171618254492 -7.0639030372927798e-16 4.6144916507916856 1.9233176216143502 -7.0639030372927788e-16 4.6144916507916847 -1.9233176216143502 -5.1859299146715069e-16 4.2346331352698208 1.8477590650225735 -5.1859299146715059e-16 4.2346331352698199 -1.8477590650225733 -4.3913218832657797e-16 3.5857864376269051 -1.4142135623730954 -4.3913218832657797e-16 3.5857864376269051 1.4142135623730949 -3.8603817711613658e-16 3.152240934977427 -0.76536686473018078 -3.8603817711613653e-16 3.1522409349774265 0.76536686473017956 -3.6739403974420594e-16 3 0 0 -4.2346331352698208 1.8477590650225735 0 -4.2346331352698199 -1.8477590650225733 0 -3.5857864376269051 -1.4142135623730954 0 -3.5857864376269051 1.4142135623730949 0 -3.152240934977427 -0.76536686473018078 0 -3.1522409349774265 0.76536686473017956 0 -3 0 1.4127806074585557e-16 -4.6144916507916856 1.9233176216143502 1.4127806074585557e-16 -4.6144916507916847 -1.9233176216143502 2.8287983324364e-16 -4.6197782648938777 -1.9134171618254485 2.8287983324364e-16 -4.6197782648938777 1.9134171618254492 3.0028477138537652e-16 -4.904022475614136 -0.97545161008064096 3.0028477138537652e-16 -4.904022475614136 0.97545161008064163 3.0616169978683831e-16 -5 3.0616169978683831e-16 0.58527096604838502 2.9423558412096913 0 0.58527096604838613 -2.9423558412096908 0 0.61497169907716764 3.0916715093103764 0.76536686473017956 0.61497169907716775 3.0916715093103768 -0.76536686473018078 0.61497169907716887 -3.0916715093103768 -0.76536686473018078 0.61497169907716887 -3.0916715093103764 0.76536686473017956 0.69955223079769868 3.5168865566940046 -1.4142135623730954 0.69955223079769868 3.5168865566940046 1.4142135623730949 0.69955223079770001 -3.5168865566940046 -1.4142135623730954 0.69955223079770001 -3.5168865566940046 1.4142135623730949 0.82613594197995643 4.1532658469804211 -1.8477590650225733 0.82613594197995655 4.153265846980422 1.8477590650225735 0.82613594197995788 -4.1532658469804202 -1.8477590650225733 0.8261359419799581 -4.1532658469804211 1.8477590650225735 0.90024266209368542 4.5258254876400885 -1.9233176216143502 0.90024266209368553 4.5258254876400885 1.9233176216143502 0.90024266209368631 -4.5258254876400876 -1.9233176216143502 0.90024266209368642 -4.5258254876400885 1.9233176216143502 0.90127402934125711 4.5310105209346911 -1.9134171618254485 0.90127402934125711 4.5310105209346911 1.9134171618254492 0.90127402934125722 -4.5310105209346911 -1.9134171618254485 0.90127402934125722 -4.5310105209346911 1.9134171618254492 0.95672732394189253 4.809793058848955 -0.97545161008064096 0.95672732394189253 4.809793058848955 0.97545161008064163 0.95672732394189264 -4.809793058848955 -0.97545161008064096 0.95672732394189264 -4.809793058848955 0.97545161008064163 0.97545161008064152 4.9039264020161522 3.0616169978683831e-16 0.97545161008064163 -4.9039264020161522 3.0616169978683831e-16 1.1480502970952691 2.7716385975338604 0 1.1480502970952711 -2.7716385975338595 0 1.2063103806389011 2.9122908813698865 0.76536686473017956 1.2063103806389013 2.9122908813698869 -0.76536686473018078 1.2063103806389033 -2.9122908813698856 0.76536686473017956 1.2063103806389035 -2.912290881369886 -0.76536686473018078 1.3722210616792516 3.3128346976800578 -1.4142135623730954 1.3722210616792516 3.3128346976800578 1.4142135623730949 1.3722210616792541 -3.3128346976800565 -1.4142135623730954 1.3722210616792541 -3.3128346976800565 1.4142135623730949 1.6205239430119958 3.912290881369886 -1.8477590650225733 1.620523943011996 3.9122908813698869 1.8477590650225735 1.6205239430119989 -3.9122908813698847 -1.8477590650225733 1.6205239430119991 -3.9122908813698856 1.8477590650225735 1.6667106990588059 2.4944088369076365 0 1.6667106990588065 -2.4944088369076356 0 1.7512912307793367 2.6209925480898941 0.76536686473017956 1.7512912307793371 2.6209925480898946 -0.76536686473018078 1.7512912307793376 -2.6209925480898937 0.76536686473017956 1.7512912307793378 -2.6209925480898941 -0.76536686473018078 1.7658895035450115 4.2632343891106572 -1.9233176216143502 1.7658895035450115 4.2632343891106572 1.9233176216143502 1.7658895035450128 -4.2632343891106572 -1.9233176216143502 1.7658895035450131 -4.2632343891106572 1.9233176216143502 1.7679126031752284 -4.2681185836759594 -1.9134171618254485 1.7679126031752284 -4.2681185836759594 1.9134171618254492 1.767912603175229 4.2681185836759585 -1.9134171618254485 1.767912603175229 4.2681185836759585 1.9134171618254492 1.8766881533635627 -4.5307259921952312 -0.97545161008064096 1.8766881533635627 -4.5307259921952312 0.97545161008064163 1.8766881533635635 4.5307259921952303 -0.97545161008064096 1.8766881533635635 4.5307259921952303 0.97545161008064163 1.9134171618254492 -4.6193976625564339 3.0616169978683831e-16 1.9134171618254501 4.619397662556433 3.0616169978683831e-16 1.992156206710908 2.9814724590933683 -1.4142135623730954 1.992156206710908 2.9814724590933683 1.4142135623730949 1.9921562067109089 -2.9814724590933674 -1.4142135623730954 1.9921562067109089 -2.9814724590933674 1.4142135623730949 2.1213203435596424 2.1213203435596428 0 2.1213203435596428 -2.1213203435596419 0 2.2289709410563607 2.2289709410563616 0.76536686473017956 2.2289709410563612 2.2289709410563621 -0.76536686473018078 2.2289709410563616 -2.2289709410563607 0.76536686473017956 2.2289709410563621 -2.2289709410563607 -0.76536686473018078 2.3526361177143813 3.5209687712263098 -1.8477590650225733 2.3526361177143817 3.5209687712263102 1.8477590650225735 2.3526361177143822 -3.5209687712263089 -1.8477590650225733 2.3526361177143831 -3.5209687712263094 1.8477590650225735 2.4944088369076356 1.6667106990588065 0 2.4944088369076365 -1.6667106990588056 0 2.5355339059327373 2.5355339059327382 -1.4142135623730954 2.5355339059327373 2.5355339059327382 1.4142135623730949 2.5355339059327382 -2.5355339059327373 -1.4142135623730954 2.5355339059327382 -2.5355339059327373 1.4142135623730949 2.5636742016973439 3.8368095838570953 -1.9233176216143499 2.5636742016973439 3.8368095838570957 1.9233176216143502 2.5636742016973457 -3.8368095838570944 1.9233176216143502 2.5636742016973457 -3.8368095838570939 -1.9233176216143502 2.5666112871259834 3.8412052428350387 -1.9134171618254485 2.5666112871259834 3.8412052428350387 1.9134171618254492 2.5666112871259856 -3.8412052428350374 -1.9134171618254485 2.5666112871259856 -3.8412052428350374 1.9134171618254492 2.6209925480898937 1.7512912307793376 0.76536686473017956 2.6209925480898941 -1.7512912307793365 0.76536686473017956 2.6209925480898941 1.7512912307793378 -0.76536686473018078 2.6209925480898946 -1.7512912307793367 -0.76536686473018078 2.72452890951031 4.0775456665218552 -0.97545161008064096 2.72452890951031 4.0775456665218552 0.97545161008064163 2.7245289095103122 -4.0775456665218535 -0.97545161008064096 2.7245289095103122 -4.0775456665218535 0.97545161008064163 2.7716385975338595 1.1480502970952711 0 2.77163859753386 -1.14805029709527 0 2.7778511650980091 4.1573480615127272 3.0616169978683831e-16 2.7778511650980113 -4.1573480615127263 3.0616169978683831e-16 2.9122908813698856 1.2063103806389031 0.76536686473017956 2.912290881369886 -1.2063103806389022 0.76536686473017956 2.912290881369886 1.2063103806389033 -0.76536686473018078 2.9122908813698865 -1.2063103806389022 -0.76536686473018078 2.9423558412096908 0.58527096604838602 0 2.9423558412096913 -0.58527096604838491 0 2.9814724590933674 1.9921562067109089 -1.4142135623730954 2.9814724590933674 1.9921562067109089 1.4142135623730949 2.9814724590933683 -1.9921562067109075 -1.4142135623730954 2.9814724590933683 -1.9921562067109075 1.4142135623730949 2.99433780578654 2.9943378057865409 -1.8477590650225733 2.9943378057865404 2.9943378057865417 1.8477590650225735 2.9943378057865409 -2.9943378057865395 -1.8477590650225733 2.9943378057865417 -2.99433780578654 1.8477590650225735 3 5.5109105961630896e-16 0 3.0916715093103764 -0.61497169907716753 0.76536686473017956 3.0916715093103764 0.61497169907716864 0.76536686473017956 3.0916715093103768 -0.61497169907716764 -0.76536686473018078 3.0916715093103768 0.61497169907716875 -0.76536686473018078 3.1522409349774265 5.7905726567420479e-16 0.76536686473017956 3.152240934977427 5.7905726567420489e-16 -0.76536686473018078 3.2629383380035057 3.2629383380035071 -1.9233176216143499 3.2629383380035062 3.2629383380035071 1.9233176216143502 3.2629383380035071 -3.2629383380035062 -1.9233176216143502 3.2629383380035071 -3.2629383380035062 1.9233176216143502 3.2666765386846826 3.2666765386846839 -1.9134171618254485 3.2666765386846826 3.2666765386846839 1.9134171618254492 3.2666765386846834 -3.266676538684683 -1.9134171618254485 3.2666765386846834 -3.266676538684683 1.9134171618254492 3.3128346976800565 1.3722210616792538 -1.4142135623730954 3.3128346976800565 1.3722210616792538 1.4142135623730949 3.3128346976800569 -1.3722210616792527 -1.4142135623730954 3.3128346976800569 -1.3722210616792527 1.4142135623730949 3.467667547597995 3.4676675475979968 -0.97545161008064096 3.467667547597995 3.4676675475979968 0.97545161008064163 3.4676675475979963 -3.4676675475979954 -0.97545161008064096 3.4676675475979963 -3.4676675475979954 0.97545161008064163 3.5168865566940046 -0.69955223079769846 -1.4142135623730954 3.5168865566940046 -0.69955223079769846 1.4142135623730949 3.5168865566940046 0.69955223079769979 -1.4142135623730954 3.5168865566940046 0.69955223079769979 1.4142135623730949 3.5209687712263089 2.3526361177143822 -1.8477590650225733 3.5209687712263094 2.3526361177143831 1.8477590650225735 3.5209687712263098 -2.3526361177143809 -1.8477590650225733 3.5209687712263102 -2.3526361177143813 1.8477590650225735 3.5355339059327369 3.5355339059327386 3.0616169978683831e-16 3.5355339059327378 -3.5355339059327373 3.0616169978683831e-16 3.5857864376269051 6.5869828248986693e-16 -1.4142135623730954 3.5857864376269051 6.5869828248986693e-16 1.4142135623730949 3.8368095838570939 2.5636742016973448 -1.9233176216143502 3.8368095838570944 2.5636742016973453 1.9233176216143502 3.8368095838570948 -2.5636742016973444 -1.9233176216143502 3.8368095838570948 -2.5636742016973444 1.9233176216143502 3.8412052428350374 -2.5666112871259852 -1.9134171618254485 3.8412052428350374 -2.5666112871259852 1.9134171618254492 3.8412052428350374 2.5666112871259852 -1.9134171618254485 3.8412052428350374 2.5666112871259852 1.9134171618254492 3.9122908813698847 1.6205239430119986 -1.8477590650225733 3.9122908813698851 -1.6205239430119971 -1.8477590650225733 3.9122908813698856 1.6205239430119989 1.8477590650225735 3.912290881369886 -1.6205239430119975 1.8477590650225735 4.0775456665218535 -2.7245289095103118 -0.97545161008064096 4.0775456665218535 -2.7245289095103118 0.97545161008064163 4.0775456665218535 2.7245289095103118 -0.97545161008064096 4.0775456665218535 2.7245289095103118 0.97545161008064163 4.1532658469804202 0.82613594197995766 -1.8477590650225733 4.1532658469804211 -0.82613594197995621 -1.8477590650225733 4.1532658469804211 0.82613594197995788 1.8477590650225735 4.153265846980422 -0.82613594197995632 1.8477590650225735 4.1573480615127263 -2.7778511650980109 3.0616169978683831e-16 4.1573480615127263 2.7778511650980109 3.0616169978683831e-16 4.2346331352698199 7.7788948720072579e-16 -1.8477590650225733 4.2346331352698208 7.7788948720072599e-16 1.8477590650225735 4.2632343891106563 1.7658895035450137 -1.9233176216143502 4.2632343891106572 -1.765889503545012 -1.9233176216143502 4.2632343891106572 1.7658895035450142 1.9233176216143502 4.2632343891106581 -1.765889503545012 1.9233176216143502 4.2681185836759576 1.7679126031752308 -1.9134171618254485 4.2681185836759576 1.7679126031752308 1.9134171618254492 4.2681185836759594 -1.7679126031752281 -1.9134171618254485 4.2681185836759594 -1.7679126031752281 1.9134171618254492 4.5258254876400876 0.90024266209368708 -1.9233176216143502 4.5258254876400876 0.9002426620936872 1.9233176216143502 4.5258254876400885 -0.9002426620936852 -1.9233176216143502 4.5258254876400885 -0.9002426620936852 1.9233176216143502 4.5307259921952303 1.8766881533635653 -0.97545161008064096 4.5307259921952303 1.8766881533635653 0.97545161008064163 4.5307259921952312 -1.8766881533635624 -0.97545161008064096 4.5307259921952312 -1.8766881533635624 0.97545161008064163 4.5310105209346903 0.901274029341259 -1.9134171618254485 4.5310105209346903 0.901274029341259 1.9134171618254492 4.5310105209346911 -0.90127402934125678 -1.9134171618254485 4.5310105209346911 -0.90127402934125678 1.9134171618254492 4.6144916507916847 4.238341822375667e-16 -1.9233176216143502 4.6144916507916856 4.238341822375667e-16 1.9233176216143502 4.6193976625564321 1.9134171618254521 3.0616169978683831e-16 4.6193976625564339 -1.913417161825449 3.0616169978683831e-16 4.6197782648938777 0 -1.9134171618254485 4.6197782648938777 0 1.9134171618254492 4.8097930588489541 0.95672732394189453 -0.97545161008064096 4.8097930588489541 0.95672732394189453 0.97545161008064163 4.809793058848955 -0.95672732394189219 -0.97545161008064096 4.809793058848955 -0.95672732394189219 0.97545161008064163 4.9039264020161513 0.97545161008064363 3.0616169978683831e-16 4.9039264020161522 -0.97545161008064118 3.0616169978683831e-16 4.904022475614136 0 -0.97545161008064096 4.904022475614136 0 0.97545161008064163 5 0 3.0616169978683831e-16</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">424 432 438 434 416 420 432 424 432 442 446 438 422 434 438 430 392 394 420 416 420 428 442 432 430 438 446 440 442 444 447 446 415 422 430 418 364 368 394 392 394 402 428 420 428 436 444 442 418 430 440 426 440 446 447 443 441 445 447 444 390 415 418 396 322 327 368 364 368 376 402 394 402 409 436 428 427 441 444 436 396 418 426 404 426 440 443 435 439 443 447 445 431 437 445 441 362 390 396 366 289 291 327 322 327 335 376 368 376 386 409 402 401 427 436 409 419 431 441 427 366 396 404 374 404 426 435 410 425 435 443 439 429 439 445 437 423 433 437 431 321 362 366 325 255 259 291 289 291 295 335 327 335 339 386 376 375 401 409 386 393 419 427 401 414 423 431 419 325 366 374 333 374 404 410 385 403 410 435 425 417 425 439 429 421 429 437 433 287 321 325 293 231 234 259 255 259 263 295 291 295 298 339 335 334 375 386 339 367 393 401 375 391 414 419 393 293 325 333 297 333 374 385 338 373 385 410 403 395 403 425 417 413 417 429 421 253 287 293 257 191 234 231 194 234 236 263 259 263 265 298 295 294 334 339 298 326 367 375 334 363 391 393 367 257 293 297 261 297 333 338 299 332 338 385 373 365 373 403 395 389 395 417 413 214 215 253 257 157 191 194 160 187 236 234 191 236 237 265 263 262 294 298 265 290 326 334 294 323 363 367 326 212 214 257 261 261 297 299 264 296 299 338 332 324 332 373 365 361 365 395 389 189 192 215 214 123 157 160 125 153 187 191 157 183 237 236 187 235 262 265 237 258 290 294 262 288 323 326 290 185 189 214 212 210 212 261 264 260 264 299 296 292 296 332 324 320 324 365 361 155 158 192 189 82 123 125 85 115 153 157 123 149 183 187 153 183 186 235 237 233 258 262 235 254 288 290 258 151 155 189 185 182 185 212 210 210 264 260 211 256 260 296 292 286 292 324 320 121 124 158 155 54 82 85 58 74 115 123 82 109 149 153 115 149 152 186 183 186 190 233 235 232 254 258 233 113 121 155 151 148 151 185 182 182 210 211 184 211 260 256 213 252 256 292 286 80 84 124 121 28 54 58 31 46 74 82 54 62 109 115 74 109 114 152 149 152 156 190 186 190 195 232 233 72 80 121 113 108 113 151 148 148 182 184 150 184 211 213 188 213 256 252 216 52 56 84 80 16 28 31 24 20 46 54 28 38 62 74 46 62 73 114 109 114 122 156 152 156 161 195 190 44 52 80 72 61 72 113 108 108 148 150 112 150 184 188 154 188 213 216 193 30 34 56 52 10 16 24 13 6 20 28 16 11 38 46 20 38 45 73 62 73 81 122 114 122 126 161 156 22 30 52 44 37 44 72 61 61 108 112 71 112 150 154 120 154 188 193 159 18 26 34 30 10 13 26 18 2 6 16 10 3 11 20 6 11 19 45 38 45 53 81 73 81 86 126 122 8 18 30 22 12 22 44 37 37 61 71 43 71 112 120 79 120 154 159 127 2 10 18 8 0 3 6 2 3 5 19 11 19 27 53 45 53 57 86 81 4 8 22 12 12 37 43 21 43 71 79 51 79 120 127 83 0 2 8 4 0 1 5 3 5 15 27 19 27 32 57 53 4 12 21 7 21 43 51 29 51 79 83 55 0 4 7 1 1 9 15 5 15 23 32 27 7 21 29 17 29 51 55 33 1 7 17 9 9 14 23 15 17 29 33 25 9 17 25 14 207 229 230 209 229 243 239 230 206 209 230 228 179 207 209 181 203 227 229 207 239 243 270 267 228 230 239 242 227 247 243 229 202 206 228 226 178 181 209 206 164 179 181 166 175 203 207 179 198 224 227 203 267 270 284 281 239 267 271 242 243 247 275 270 226 228 242 246 224 251 247 227 199 202 226 225 174 178 206 202 162 166 181 178 141 164 166 143 145 175 179 164 169 198 203 175 194 231 224 198 281 284 308 305 267 281 285 271 270 275 303 284 242 271 274 246 247 251 279 275 225 226 246 250 224 231 255 251 195 199 225 232 171 174 202 199 144 162 178 174 139 143 166 162 119 141 143 133 131 145 164 141 134 169 175 145 160 194 198 169 305 308 329 315 281 305 309 285 284 303 319 308 271 285 302 274 275 279 313 303 246 274 278 250 251 255 289 279 225 250 254 232 161 171 199 195 136 144 174 171 130 139 162 144 117 133 143 139 105 119 133 110 101 131 141 119 95 134 145 131 125 160 169 134 315 329 341 337 305 315 331 309 308 319 349 329 285 309 318 302 303 313 353 319 274 302 312 278 279 289 322 313 250 278 288 254 126 136 171 161 97 130 144 136 100 117 139 130 104 110 133 117 91 105 110 102 76 101 119 105 65 95 131 101 85 125 134 95 337 341 355 345 315 337 343 331 329 349 372 341 309 331 348 318 319 353 384 349 302 318 352 312 313 322 364 353 278 312 323 288 86 97 136 126 66 100 130 97 75 104 117 100 89 102 110 104 88 91 102 93 68 76 105 91 47 65 101 76 58 85 95 65 345 355 359 354 337 345 357 343 341 372 378 355 331 343 371 348 349 384 400 372 318 348 383 352 353 364 392 384 312 352 363 323 57 66 97 86 49 75 100 66 67 89 104 75 87 93 102 89 88 93 103 92 60 68 91 88 39 47 76 68 31 58 65 47 344 354 359 356 345 354 360 357 355 378 388 359 343 357 377 371 372 400 408 378 348 371 398 383 384 392 416 400 352 383 391 363 32 49 66 57 41 67 75 49 59 87 89 67 87 90 103 93 92 103 111 107 60 88 92 70 35 39 68 60 24 31 47 39 336 344 356 340 344 358 360 354 356 359 388 380 357 360 387 377 378 408 412 388 371 377 406 398 400 416 424 408 383 398 414 391 23 41 49 32 36 59 67 41 59 69 90 87 90 106 111 103 107 111 132 118 70 92 107 78 35 60 70 40 13 24 39 35 314 336 340 328 336 342 358 344 340 356 380 370 358 379 387 360 380 388 412 407 377 387 411 406 408 424 434 412 398 406 423 414 14 36 41 23 36 42 69 59 69 77 106 90 106 116 132 111 118 132 142 140 78 107 118 99 40 70 78 48 13 35 40 26 304 314 328 306 314 330 342 336 328 340 370 347 342 369 379 358 370 380 407 399 379 405 411 387 407 412 434 422 406 411 433 423 14 25 42 36 42 50 77 69 77 98 116 106 116 138 142 132 140 142 167 165 99 118 140 129 48 78 99 63 26 40 48 34 280 304 306 282 304 307 330 314 306 328 347 317 330 346 369 342 347 370 399 382 369 397 405 379 399 407 422 415 405 421 433 411 25 33 50 42 50 64 98 77 98 128 138 116 138 163 167 142 165 167 180 177 129 140 165 147 63 99 129 94 34 48 63 56 266 280 282 268 280 283 307 304 282 306 317 301 307 316 346 330 317 347 382 351 346 381 397 369 382 399 415 390 397 413 421 405 33 55 64 50 64 96 128 98 128 146 163 138 163 176 180 167 177 180 208 205 147 165 177 173 94 129 147 135 56 63 94 84 238 266 268 240 266 269 283 280 268 282 301 273 283 300 316 307 301 317 351 311 316 350 381 346 351 382 390 362 381 389 413 397 55 83 96 64 96 137 146 128 146 172 176 163 176 204 208 180 205 208 223 222 173 177 205 201 135 147 173 168 84 94 135 124 222 223 238 240 238 241 269 266 240 268 273 245 269 272 300 283 273 301 311 277 300 310 350 316 311 351 362 321 350 361 389 381 83 127 137 96 137 170 172 146 172 200 204 176 204 221 223 208 201 205 222 220 168 173 201 196 124 135 168 158 221 241 238 223 220 222 240 245 241 244 272 269 245 273 277 249 272 276 310 300 277 311 321 287 310 320 361 350 127 159 170 137 170 197 200 172 200 219 221 204 196 201 220 217 158 168 196 192 219 244 241 221 217 220 245 249 244 248 276 272 249 277 287 253 276 286 320 310 159 193 197 170 197 218 219 200 192 196 217 215 218 248 244 219 215 217 249 253 248 252 286 276 193 216 218 197 216 252 248 218\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CARVEBoolean.cubes.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 -2.5 -2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 2.5 -1.25 -2.5 -1.25 -1.25 -2.5 1.25 -1.25 2.5 -1.25 -1.25 2.5 1.25 1.25 -2.5 -1.25 1.25 -2.5 1.25 1.25 2.5 -1.25 1.25 2.5 1.25 2.5 -2.5 -2.5 2.5 -2.5 2.5 2.5 2.5 -2.5 2.5 2.5 2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 4 5 6 7 8 9 0 11 12 13 10 15 16 17 14 19 20 21 18 23 24 25 22 27 28 29 30 31 32 33 34 35 26 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 10 14 18 22 26 36 40 44 48</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">2 6 10 11 7 6 2 3 15 14 0 1 3 2 1 13 15 3 12 14 15 13 0 2 14 12 0 4 5 9 8 4 0 12 13 1 8 9 11 10 5 7 11 9 4 8 10 6 4 6 7 5\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CARVEBoolean.cylinders.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 -6.1232339957367663e-16 -5 -5 -6.1232339957367663e-16 -3 -5 -6.1232339957367663e-16 3 -5 -6.1232339957367663e-16 5 -5 -3.0616169978683831e-16 -2 -5 -3.0616169978683831e-16 2 -3.5355339059327386 3.5355339059327373 -5 -3.5355339059327386 3.5355339059327373 -3 -3.5355339059327386 3.5355339059327373 3 -3.5355339059327386 3.5355339059327373 5 -3.5355339059327378 3.5355339059327373 -2 -3.5355339059327378 3.5355339059327373 2 -3.5355339059327373 -3.5355339059327378 -5 -3.5355339059327373 -3.5355339059327378 -3 -3.5355339059327373 -3.5355339059327378 -2 -3.5355339059327373 -3.5355339059327378 2 -3.5355339059327373 -3.5355339059327378 3 -3.5355339059327373 -3.5355339059327378 5 -3 -1.8369701987210297e-16 0 -2.1213203435596428 2.1213203435596424 0 -2.1213203435596424 -2.1213203435596428 0 -2 -2.4492935982947064e-16 -5 -2 -2.4492935982947064e-16 -4.5 -2 -2.4492935982947064e-16 -1.5 -2 -2.4492935982947064e-16 1.5 -2 -2.4492935982947064e-16 4.5 -2 -2.4492935982947064e-16 5 -1.4142135623730954 1.4142135623730949 -5 -1.4142135623730954 1.4142135623730949 -4.5 -1.4142135623730954 1.4142135623730949 -1.5 -1.4142135623730954 1.4142135623730949 1.5 -1.4142135623730954 1.4142135623730949 4.5 -1.4142135623730954 1.4142135623730949 5 -1.4142135623730949 -1.4142135623730951 -5 -1.4142135623730949 -1.4142135623730951 -4.5 -1.4142135623730949 -1.4142135623730951 -1.5 -1.4142135623730949 -1.4142135623730951 1.5 -1.4142135623730949 -1.4142135623730951 4.5 -1.4142135623730949 -1.4142135623730951 5 -9.1848509936051479e-16 5 -5 -9.1848509936051479e-16 5 -3 -9.1848509936051479e-16 5 3 -9.1848509936051479e-16 5 5 -6.1232339957367663e-16 5 -2 -6.1232339957367663e-16 5 2 -3.6739403974420594e-16 2 -5 -3.6739403974420594e-16 2 -4.5 -3.6739403974420594e-16 2 -1.5 -3.6739403974420594e-16 2 1.5 -3.6739403974420594e-16 2 4.5 -3.6739403974420594e-16 2 5 -3.6739403974420594e-16 3 0 0 -5 -2 0 -5 2 0 -3 0 1.2246467991473532e-16 -2 -5 1.2246467991473532e-16 -2 -4.5 1.2246467991473532e-16 -2 -1.5 1.2246467991473532e-16 -2 1.5 1.2246467991473532e-16 -2 4.5 1.2246467991473532e-16 -2 5 3.0616169978683831e-16 -5 -5 3.0616169978683831e-16 -5 -3 3.0616169978683831e-16 -5 3 3.0616169978683831e-16 -5 5 1.4142135623730947 1.4142135623730954 -5 1.4142135623730947 1.4142135623730954 -4.5 1.4142135623730947 1.4142135623730954 -1.5 1.4142135623730947 1.4142135623730954 1.5 1.4142135623730947 1.4142135623730954 4.5 1.4142135623730947 1.4142135623730954 5 1.4142135623730951 -1.4142135623730949 -5 1.4142135623730951 -1.4142135623730949 -4.5 1.4142135623730951 -1.4142135623730949 -1.5 1.4142135623730951 -1.4142135623730949 1.5 1.4142135623730951 -1.4142135623730949 4.5 1.4142135623730951 -1.4142135623730949 5 2 0 -5 2 0 -4.5 2 0 -1.5 2 0 1.5 2 0 4.5 2 0 5 2.1213203435596424 2.1213203435596428 0 2.1213203435596428 -2.1213203435596419 0 3 5.5109105961630896e-16 0 3.5355339059327369 3.5355339059327386 -5 3.5355339059327369 3.5355339059327386 -3 3.5355339059327369 3.5355339059327386 3 3.5355339059327369 3.5355339059327386 5 3.5355339059327373 3.5355339059327386 -2 3.5355339059327373 3.5355339059327386 2 3.5355339059327378 -3.5355339059327373 -5 3.5355339059327378 -3.5355339059327373 -3 3.5355339059327378 -3.5355339059327373 3 3.5355339059327378 -3.5355339059327373 5 3.5355339059327386 -3.5355339059327369 -2 3.5355339059327386 -3.5355339059327369 2 5 0 -5 5 0 -3 5 0 3 5 0 5 5 9.1848509936051479e-16 -2 5 9.1848509936051479e-16 2</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 80 99 100 101 98 103 104 105 102 107 108 109 106 111 112 113 110 115 116 117 114 119 120 121 118 123 124 125 122 127 128 129 126 131 132 133 130 135 136 137 134 139 140 141 138 143 144 145 142 147 148 149 146 151 152 153 150 155 156 157 154 159 160 161 158 163 164 165 162 167 168 169 166 171 172 173 170 175 176 177 174 179 180 181 178 183 184 185 182 187 188 189 186 191 192 193 190 195 196 197 194 199 200 201 198 203 204 205 202 207 208 209 206 211 212 213 210 215 216 217 214 219 220 221 218 223 224 225 222 227 228 229 226 231 232 233 230 235 236 237 234 239 240 241 238 243 244 245 242 247 248 249 246 251 252 253 250 255 256 257 254 259 260 261 258 263 264 265 262 267 268 269 266 271 272 273 270 275 276 277 274 279 280 281 278 283 284 285 282 287 288 289 286 291 292 293 290 295 296 297 294 299 300 301 298 303 304 305 302 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 306 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 98 102 106 110 114 118 122 126 130 134 138 142 146 150 154 158 162 166 170 174 178 182 186 190 194 198 202 206 210 214 218 222 226 230 234 238 242 246 250 254 258 262 266 270 274 278 282 286 290 294 298 302 306 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">15 20 54 53 53 54 84 97 14 52 54 20 5 18 20 15 84 85 103 97 52 96 84 54 4 14 20 18 5 11 19 18 83 91 103 85 84 96 102 85 4 18 19 10 11 44 51 19 44 91 83 51 83 85 102 90 10 19 51 43 43 51 83 90 94 100 101 95 63 94 95 64 94 97 103 100 88 89 101 100 3 17 64 60 38 26 32 50 70 82 76 60 64 95 101 89 42 9 16 63 64 17 53 97 94 63 88 100 103 91 41 42 89 88 2 3 9 8 2 16 17 3 37 38 60 59 25 26 38 37 25 31 32 26 31 49 50 32 49 69 70 50 69 81 82 70 75 76 82 81 59 60 76 75 8 9 42 41 15 53 63 16 41 88 91 44 2 8 11 5 2 5 15 16 36 37 59 58 24 25 37 36 24 30 31 25 30 48 49 31 48 68 69 49 68 80 81 69 74 75 81 80 58 59 75 74 8 41 44 11 35 36 58 57 23 24 36 35 23 29 30 24 29 47 48 30 47 67 68 48 67 79 80 68 73 74 80 79 57 58 74 73 34 35 57 56 22 23 35 34 22 28 29 23 28 46 47 29 46 66 67 47 66 78 79 67 72 73 79 78 56 57 73 72 33 34 56 55 21 22 34 33 21 27 28 22 27 45 46 28 45 65 66 46 65 77 78 66 71 72 78 77 55 56 72 71 0 21 33 55 71 77 65 45 27 21 0 6 39 86 98 92 61 12 0 12 13 1 0 1 7 6 6 7 40 39 39 40 87 86 86 87 99 98 92 98 99 93 61 92 93 62 12 61 62 13 1 13 14 4 1 4 10 7 7 10 43 40 40 43 90 87 87 90 102 99 93 99 102 96 52 62 93 96 13 62 52 14\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CARVEBoolean.input.a.ply",
    "content": "ply\nformat ascii 1.0\ncomment Written by K-3D 0.7.12.0\nelement vertex 48\nproperty float x\nproperty float y\nproperty float z\nelement face 92\nproperty list uchar int vertex_indices\nend_header\n5 0 5\n3.5355339059327378 -3.5355339059327373 5\n3.0615158845559431e-16 -5 5\n-3.5355339059327373 -3.5355339059327378 5\n-5 -6.1230317691118863e-16 5\n-3.5355339059327386 3.5355339059327373 5\n-9.1845476536678294e-16 5 5\n3.5355339059327369 3.5355339059327386 5\n5 0 3\n3.5355339059327378 -3.5355339059327373 3\n3.0615158845559431e-16 -5 3\n-3.5355339059327373 -3.5355339059327378 3\n-5 -6.1230317691118863e-16 3\n-3.5355339059327386 3.5355339059327373 3\n-9.1845476536678294e-16 5 3\n3.5355339059327369 3.5355339059327386 3\n5 0 0.99999999999999978\n3.5355339059327378 -3.5355339059327373 0.99999999999999978\n3.0615158845559431e-16 -5 0.99999999999999978\n-3.5355339059327373 -3.5355339059327378 0.99999999999999978\n-5 -6.1230317691118863e-16 0.99999999999999978\n-3.5355339059327386 3.5355339059327373 0.99999999999999978\n-9.1845476536678294e-16 5 0.99999999999999978\n3.5355339059327369 3.5355339059327386 0.99999999999999978\n5 0 -0.99999999999999978\n3.5355339059327378 -3.5355339059327373 -0.99999999999999978\n3.0615158845559431e-16 -5 -0.99999999999999978\n-3.5355339059327373 -3.5355339059327378 -0.99999999999999978\n-5 -6.1230317691118863e-16 -0.99999999999999978\n-3.5355339059327386 3.5355339059327373 -0.99999999999999978\n-9.1845476536678294e-16 5 -0.99999999999999978\n3.5355339059327369 3.5355339059327386 -0.99999999999999978\n5 0 -3.0000000000000004\n3.5355339059327378 -3.5355339059327373 -3.0000000000000004\n3.0615158845559431e-16 -5 -3.0000000000000004\n-3.5355339059327373 -3.5355339059327378 -3.0000000000000004\n-5 -6.1230317691118863e-16 -3.0000000000000004\n-3.5355339059327386 3.5355339059327373 -3.0000000000000004\n-9.1845476536678294e-16 5 -3.0000000000000004\n3.5355339059327369 3.5355339059327386 -3.0000000000000004\n5 0 -5\n3.5355339059327378 -3.5355339059327373 -5\n3.0615158845559431e-16 -5 -5\n-3.5355339059327373 -3.5355339059327378 -5\n-5 -6.1230317691118863e-16 -5\n-3.5355339059327386 3.5355339059327373 -5\n-9.1845476536678294e-16 5 -5\n3.5355339059327369 3.5355339059327386 -5\n3 0 1 9\n3 0 9 8\n3 1 2 10\n3 1 10 9\n3 2 3 11\n3 2 11 10\n3 3 4 12\n3 3 12 11\n3 4 5 13\n3 4 13 12\n3 5 6 14\n3 5 14 13\n3 6 7 15\n3 6 15 14\n3 7 0 8\n3 7 8 15\n3 8 9 17\n3 8 17 16\n3 9 10 18\n3 9 18 17\n3 10 11 19\n3 10 19 18\n3 11 12 20\n3 11 20 19\n3 12 13 21\n3 12 21 20\n3 13 14 22\n3 13 22 21\n3 14 15 23\n3 14 23 22\n3 15 8 16\n3 15 16 23\n3 16 17 25\n3 16 25 24\n3 17 18 26\n3 17 26 25\n3 18 19 27\n3 18 27 26\n3 19 20 28\n3 19 28 27\n3 20 21 29\n3 20 29 28\n3 21 22 30\n3 21 30 29\n3 22 23 31\n3 22 31 30\n3 23 16 24\n3 23 24 31\n3 24 25 33\n3 24 33 32\n3 25 26 34\n3 25 34 33\n3 26 27 35\n3 26 35 34\n3 27 28 36\n3 27 36 35\n3 28 29 37\n3 28 37 36\n3 29 30 38\n3 29 38 37\n3 30 31 39\n3 30 39 38\n3 31 24 32\n3 31 32 39\n3 32 33 41\n3 32 41 40\n3 33 34 42\n3 33 42 41\n3 34 35 43\n3 34 43 42\n3 35 36 44\n3 35 44 43\n3 36 37 45\n3 36 45 44\n3 37 38 46\n3 37 46 45\n3 38 39 47\n3 38 47 46\n3 39 32 40\n3 39 40 47\n3 0 7 6\n3 0 6 5\n3 0 5 4\n3 0 4 3\n3 0 3 2\n3 0 2 1\n3 40 41 42\n3 40 42 43\n3 40 43 44\n3 40 44 45\n3 40 45 46\n3 40 46 47\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CARVEBoolean.input.b.ply",
    "content": "ply\nformat ascii 1.0\ncomment Written by K-3D 0.7.12.0\nelement vertex 48\nproperty float x\nproperty float y\nproperty float z\nelement face 92\nproperty list uchar int vertex_indices\nend_header\n2 0 7.5\n1.4142135623730951 -1.4142135623730949 7.5\n1.2246063538223773e-16 -2 7.5\n-1.4142135623730949 -1.4142135623730951 7.5\n-2 -2.4492127076447545e-16 7.5\n-1.4142135623730954 1.4142135623730949 7.5\n-3.6738190614671318e-16 2 7.5\n1.4142135623730947 1.4142135623730954 7.5\n2 0 4.5\n1.4142135623730951 -1.4142135623730949 4.5\n1.2246063538223773e-16 -2 4.5\n-1.4142135623730949 -1.4142135623730951 4.5\n-2 -2.4492127076447545e-16 4.5\n-1.4142135623730954 1.4142135623730949 4.5\n-3.6738190614671318e-16 2 4.5\n1.4142135623730947 1.4142135623730954 4.5\n2 0 1.4999999999999996\n1.4142135623730951 -1.4142135623730949 1.4999999999999996\n1.2246063538223773e-16 -2 1.4999999999999996\n-1.4142135623730949 -1.4142135623730951 1.4999999999999996\n-2 -2.4492127076447545e-16 1.4999999999999996\n-1.4142135623730954 1.4142135623730949 1.4999999999999996\n-3.6738190614671318e-16 2 1.4999999999999996\n1.4142135623730947 1.4142135623730954 1.4999999999999996\n2 0 -1.4999999999999996\n1.4142135623730951 -1.4142135623730949 -1.4999999999999996\n1.2246063538223773e-16 -2 -1.4999999999999996\n-1.4142135623730949 -1.4142135623730951 -1.4999999999999996\n-2 -2.4492127076447545e-16 -1.4999999999999996\n-1.4142135623730954 1.4142135623730949 -1.4999999999999996\n-3.6738190614671318e-16 2 -1.4999999999999996\n1.4142135623730947 1.4142135623730954 -1.4999999999999996\n2 0 -4.5000000000000009\n1.4142135623730951 -1.4142135623730949 -4.5000000000000009\n1.2246063538223773e-16 -2 -4.5000000000000009\n-1.4142135623730949 -1.4142135623730951 -4.5000000000000009\n-2 -2.4492127076447545e-16 -4.5000000000000009\n-1.4142135623730954 1.4142135623730949 -4.5000000000000009\n-3.6738190614671318e-16 2 -4.5000000000000009\n1.4142135623730947 1.4142135623730954 -4.5000000000000009\n2 0 -7.5\n1.4142135623730951 -1.4142135623730949 -7.5\n1.2246063538223773e-16 -2 -7.5\n-1.4142135623730949 -1.4142135623730951 -7.5\n-2 -2.4492127076447545e-16 -7.5\n-1.4142135623730954 1.4142135623730949 -7.5\n-3.6738190614671318e-16 2 -7.5\n1.4142135623730947 1.4142135623730954 -7.5\n3 0 1 9\n3 0 9 8\n3 1 2 10\n3 1 10 9\n3 2 3 11\n3 2 11 10\n3 3 4 12\n3 3 12 11\n3 4 5 13\n3 4 13 12\n3 5 6 14\n3 5 14 13\n3 6 7 15\n3 6 15 14\n3 7 0 8\n3 7 8 15\n3 8 9 17\n3 8 17 16\n3 9 10 18\n3 9 18 17\n3 10 11 19\n3 10 19 18\n3 11 12 20\n3 11 20 19\n3 12 13 21\n3 12 21 20\n3 13 14 22\n3 13 22 21\n3 14 15 23\n3 14 23 22\n3 15 8 16\n3 15 16 23\n3 16 17 25\n3 16 25 24\n3 17 18 26\n3 17 26 25\n3 18 19 27\n3 18 27 26\n3 19 20 28\n3 19 28 27\n3 20 21 29\n3 20 29 28\n3 21 22 30\n3 21 30 29\n3 22 23 31\n3 22 31 30\n3 23 16 24\n3 23 24 31\n3 24 25 33\n3 24 33 32\n3 25 26 34\n3 25 34 33\n3 26 27 35\n3 26 35 34\n3 27 28 36\n3 27 36 35\n3 28 29 37\n3 28 37 36\n3 29 30 38\n3 29 38 37\n3 30 31 39\n3 30 39 38\n3 31 24 32\n3 31 32 39\n3 32 33 41\n3 32 41 40\n3 33 34 42\n3 33 42 41\n3 34 35 43\n3 34 43 42\n3 35 36 44\n3 35 44 43\n3 36 37 45\n3 36 45 44\n3 37 38 46\n3 37 46 45\n3 38 39 47\n3 38 47 46\n3 39 32 40\n3 39 40 47\n3 0 7 6\n3 0 6 5\n3 0 5 4\n3 0 4 3\n3 0 3 2\n3 0 2 1\n3 40 41 42\n3 40 42 43\n3 40 43 44\n3 40 44 45\n3 40 45 46\n3 40 46 47\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CARVEBoolean.ply.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 -6.1230317691118863e-16 -5 -5 -6.1230317691118863e-16 -3.0000000000000004 -5 -6.1230317691118863e-16 -0.99999999999999978 -5 -6.1230317691118863e-16 0.99999999999999978 -5 -6.1230317691118863e-16 3 -5 -6.1230317691118863e-16 5 -3.5355339059327386 3.5355339059327373 -5 -3.5355339059327386 3.5355339059327373 -3.0000000000000004 -3.5355339059327386 3.5355339059327373 -0.99999999999999978 -3.5355339059327386 3.5355339059327373 0.99999999999999978 -3.5355339059327386 3.5355339059327373 3 -3.5355339059327386 3.5355339059327373 5 -3.5355339059327373 -3.5355339059327378 -5 -3.5355339059327373 -3.5355339059327378 -3.0000000000000004 -3.5355339059327373 -3.5355339059327378 -0.99999999999999978 -3.5355339059327373 -3.5355339059327378 0.99999999999999978 -3.5355339059327373 -3.5355339059327378 3 -3.5355339059327373 -3.5355339059327378 5 -2 -3.3676674730115375e-16 -5 -2 -3.3676674730115375e-16 5 -2 -2.4492127076447545e-16 -4.5000000000000009 -2 -2.4492127076447545e-16 -1.4999999999999996 -2 -2.4492127076447545e-16 1.4999999999999996 -2 -2.4492127076447545e-16 4.5 -1.9023689270621826 -0.23570226039551589 5 -1.9023689270621826 0.23570226039551523 -5 -1.5118446353109127 1.178511301977579 5 -1.5118446353109123 -1.1785113019775797 -5 -1.4142135623730954 1.4142135623730949 -5 -1.4142135623730954 1.4142135623730949 -4.5000000000000009 -1.4142135623730954 1.4142135623730949 -1.4999999999999996 -1.4142135623730954 1.4142135623730949 1.4999999999999996 -1.4142135623730954 1.4142135623730949 4.5 -1.4142135623730954 1.4142135623730949 5 -1.4142135623730949 -1.4142135623730951 -5 -1.4142135623730949 -1.4142135623730951 -4.5000000000000009 -1.4142135623730949 -1.4142135623730951 -1.4999999999999996 -1.4142135623730949 -1.4142135623730951 1.4999999999999996 -1.4142135623730949 -1.4142135623730951 4.5 -1.4142135623730949 -1.4142135623730951 5 -1.1785113019775799 1.5118446353109123 -5 -1.178511301977579 -1.5118446353109127 5 -0.23570226039551617 1.9023689270621824 5 -0.23570226039551537 -1.9023689270621826 -5 -9.1845476536678294e-16 5 -5 -9.1845476536678294e-16 5 -3.0000000000000004 -9.1845476536678294e-16 5 -0.99999999999999978 -9.1845476536678294e-16 5 0.99999999999999978 -9.1845476536678294e-16 5 3 -9.1845476536678294e-16 5 5 -3.6738190614671318e-16 2 -5 -3.6738190614671318e-16 2 -4.5000000000000009 -3.6738190614671318e-16 2 -1.4999999999999996 -3.6738190614671318e-16 2 1.4999999999999996 -3.6738190614671318e-16 2 4.5 -3.6738190614671318e-16 2 5 1.2246063538223773e-16 -2 -5 1.2246063538223773e-16 -2 -4.5000000000000009 1.2246063538223773e-16 -2 -1.4999999999999996 1.2246063538223773e-16 -2 1.4999999999999996 1.2246063538223773e-16 -2 4.5 1.2246063538223773e-16 -2 5 3.0615158845559431e-16 -5 -5 3.0615158845559431e-16 -5 -3.0000000000000004 3.0615158845559431e-16 -5 -0.99999999999999978 3.0615158845559431e-16 -5 0.99999999999999978 3.0615158845559431e-16 -5 3 3.0615158845559431e-16 -5 5 0.23570226039551501 1.9023689270621826 -5 0.23570226039551589 -1.9023689270621826 5 1.1785113019775788 1.5118446353109127 5 1.1785113019775797 -1.5118446353109123 -5 1.4142135623730947 1.4142135623730954 -5 1.4142135623730947 1.4142135623730954 -4.5000000000000009 1.4142135623730947 1.4142135623730954 -1.4999999999999996 1.4142135623730947 1.4142135623730954 1.4999999999999996 1.4142135623730947 1.4142135623730954 4.5 1.4142135623730947 1.4142135623730954 5 1.4142135623730951 -1.4142135623730949 -5 1.4142135623730951 -1.4142135623730949 -4.5000000000000009 1.4142135623730951 -1.4142135623730949 -1.4999999999999996 1.4142135623730951 -1.4142135623730949 1.4999999999999996 1.4142135623730951 -1.4142135623730949 4.5 1.4142135623730951 -1.4142135623730949 5 1.5118446353109121 1.1785113019775799 -5 1.5118446353109127 -1.1785113019775793 5 1.9023689270621824 0.23570226039551589 5 1.9023689270621826 -0.23570226039551545 -5 2 -9.1845476536678319e-17 -5 2 -9.1845476536678319e-17 5 2 0 -4.5000000000000009 2 0 -1.4999999999999996 2 0 1.4999999999999996 2 0 4.5 3.5355339059327369 3.5355339059327386 -5 3.5355339059327369 3.5355339059327386 -3.0000000000000004 3.5355339059327369 3.5355339059327386 -0.99999999999999978 3.5355339059327369 3.5355339059327386 0.99999999999999978 3.5355339059327369 3.5355339059327386 3 3.5355339059327369 3.5355339059327386 5 3.5355339059327378 -3.5355339059327373 -5 3.5355339059327378 -3.5355339059327373 -3.0000000000000004 3.5355339059327378 -3.5355339059327373 -0.99999999999999978 3.5355339059327378 -3.5355339059327373 0.99999999999999978 3.5355339059327378 -3.5355339059327373 3 3.5355339059327378 -3.5355339059327373 5 5 0 -5 5 0 -3.0000000000000004 5 0 -0.99999999999999978 5 0 0.99999999999999978 5 0 3 5 0 5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 42 43 44 45 46 47 48 49 50 39 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63 67 68 66 70 71 69 73 74 72 76 77 78 79 80 81 82 83 84 85 86 75 88 89 87 91 92 90 94 95 93 97 98 96 100 101 99 103 104 102 106 107 105 109 110 108 112 113 111 115 116 114 118 119 117 121 122 120 124 125 123 127 128 126 130 131 129 133 134 132 136 137 135 139 140 138 142 143 141 145 146 144 148 149 147 151 152 150 154 155 153 157 158 156 160 161 159 163 164 162 166 167 165 169 170 168 172 173 171 175 176 174 178 179 177 181 182 180 184 185 183 187 188 186 190 191 189 193 194 192 196 197 195 199 200 198 202 203 201 205 206 204 208 209 207 211 212 210 214 215 213 217 218 216 220 221 219 223 224 222 226 227 225 229 230 228 232 233 231 235 236 234 238 239 237 241 242 240 244 245 243 247 248 246 250 251 249 253 254 252 256 257 255 259 260 258 262 263 261 265 266 264 268 269 270 271 272 273 274 275 276 277 278 267 280 281 282 283 284 285 286 287 288 289 290 279 292 293 291 295 296 294 298 299 297 301 302 300 304 305 303 307 308 306 310 311 309 313 314 312 316 317 318 315 320 321 322 319 324 325 323 327 328 326 330 331 329 333 334 332 336 337 338 335 340 341 339 343 344 342 346 347 345 349 350 351 348 353 354 352 356 357 355 359 360 358 362 363 361 365 366 364 368 369 367 371 372 370 374 375 376 373 378 379 377 381 382 380 384 385 383 387 388 386 390 391 389 393 394 392 396 397 398 395 400 401 399 403 404 402 406 407 405 409 410 408 412 413 411 415 416 414 418 419 417 421 422 420 424 425 423 427 428 426 430 431 432 429 434 435 433 437 438 436 440 441 439 443 444 442 446 447 445 449 450 448 452 453 451 455 456 454 458 459 457 461 462 463 460 465 466 464 468 469 467 471 472 470 474 475 473 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 492 496 497 495 499 500 498 502 503 504 501 506 507 505 509 510 508 512 513 511 515 516 514 518 519 517 521 522 520 524 525 523 527 528 526 530 531 529 533 534 532 536 537 535 539 540 538 542 543 541 545 546 547 544 549 550 548 552 553 554 551 556 557 555 559 560 558 562 563 561 565 566 567 564</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33 36 39 51 54 57 60 63 66 69 72 75 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 279 291 294 297 300 303 306 309 312 315 319 323 326 329 332 335 339 342 345 348 352 355 358 361 364 367 370 373 377 380 383 386 389 392 395 399 402 405 408 411 414 417 420 423 426 429 433 436 439 442 445 448 451 454 457 460 464 467 470 473 476 480 484 488 492 495 498 501 505 508 511 514 517 520 523 526 529 532 535 538 541 544 548 551 555 558 561 564</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">104 111 105 104 110 111 67 105 111 66 104 105 99 111 110 103 110 104 17 67 111 66 105 67 65 104 66 98 99 110 49 111 99 103 109 110 65 103 104 5 17 111 89 85 83 69 61 41 39 24 19 16 67 17 16 66 67 15 65 66 49 99 98 98 110 109 11 111 49 102 109 103 64 103 65 5 19 26 33 42 55 70 77 86 89 111 11 4 17 5 4 16 17 15 66 16 14 65 15 48 49 98 97 98 109 11 49 48 102 108 109 64 102 103 14 64 65 5 11 10 4 5 10 3 16 4 3 15 16 2 14 15 48 98 97 97 109 108 10 11 48 101 108 102 63 102 64 13 64 14 4 10 9 3 4 9 2 15 3 1 14 2 47 48 97 96 97 108 10 48 47 101 107 108 63 101 102 13 63 64 1 13 14 9 10 47 3 9 8 2 3 8 1 2 7 47 97 96 96 108 107 100 107 101 62 101 63 12 63 13 0 13 1 9 47 46 8 9 46 2 8 7 1 7 6 46 47 96 95 96 107 100 106 107 62 100 101 12 62 63 0 12 13 0 1 6 8 46 45 7 8 45 6 7 44 46 96 95 95 107 106 62 106 100 12 106 62 0 18 27 34 43 56 71 78 87 88 106 12 0 6 106 88 84 72 68 50 40 28 25 18 45 46 95 7 45 44 6 44 106 94 95 106 45 95 94 44 45 94 44 94 106 82 83 85 60 69 83 82 82 85 89 93 60 61 69 59 60 82 81 82 93 86 93 89 38 41 61 60 59 82 81 37 60 59 81 93 92 76 93 86 77 38 39 41 37 38 60 58 59 81 36 37 59 76 92 93 80 81 92 70 76 77 23 24 39 38 22 38 37 58 81 80 36 59 58 21 37 36 75 92 76 80 92 91 54 76 70 55 19 24 23 22 23 38 21 22 37 57 58 80 35 36 58 20 21 36 54 75 76 75 91 92 79 80 91 42 54 55 19 23 32 26 22 31 23 21 30 22 57 80 79 35 58 57 20 36 35 20 29 21 53 75 54 74 91 75 79 91 90 32 54 42 33 26 32 33 23 31 32 22 30 31 21 29 30 56 57 79 71 34 35 57 43 18 20 35 27 20 25 28 29 32 53 54 53 74 75 74 90 91 78 79 90 87 31 53 32 30 52 31 29 51 30 71 79 78 43 57 56 27 35 34 18 25 20 28 40 29 52 74 53 73 90 74 87 90 88 31 52 53 30 51 52 29 40 50 51 52 73 74 73 84 88 90 51 73 52 50 68 51 72 84 73 51 68 72 73\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CGALBoolean.benchmark.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>4.6197782648999999 0 1.9134171618 4.5310105208999998 -0.9012740293 1.9134171618 4.2681185836999997 -1.7679126032000001 1.9134171618 3.8412052428000001 -2.5666112871000002 1.9134171618 3.2666765387000001 -3.2666765387000001 1.9134171618 2.5666112871000002 -3.8412052428000001 1.9134171618 1.7679126032000001 -4.2681185836999997 1.9134171618 0.9012740293 -4.5310105208999998 1.9134171618 0 -4.6197782648999999 1.9134171618 -0.9012740293 -4.5310105208999998 1.9134171618 -1.7679126032000001 -4.2681185836999997 1.9134171618 -2.5666112871000002 -3.8412052428000001 1.9134171618 -3.2666765387000001 -3.2666765387000001 1.9134171618 -3.8412052428000001 -2.5666112871000002 1.9134171618 -4.2681185836999997 -1.7679126032000001 1.9134171618 -4.5310105208999998 -0.9012740293 1.9134171618 -4.6197782648999999 0 1.9134171618 -4.5310105208999998 0.9012740293 1.9134171618 -4.2681185836999997 1.7679126032000001 1.9134171618 -3.8412052428000001 2.5666112871000002 1.9134171618 -3.2666765387000001 3.2666765387000001 1.9134171618 -2.5666112871000002 3.8412052428000001 1.9134171618 -1.7679126032000001 4.2681185836999997 1.9134171618 -0.9012740293 4.5310105208999998 1.9134171618 0 4.6197782648999999 1.9134171618 0.9012740293 4.5310105208999998 1.9134171618 1.7679126032000001 4.2681185836999997 1.9134171618 2.5666112871000002 3.8412052428000001 1.9134171618 3.2666765387000001 3.2666765387000001 1.9134171618 3.8412052428000001 2.5666112871000002 1.9134171618 4.2681185836999997 1.7679126032000001 1.9134171618 4.5310105208999998 0.9012740293 1.9134171618 4.9040224755999997 0 0.97545161010000003 4.8097930588000004 -0.95672732390000004 0.97545161010000003 4.5307259921999998 -1.8766881533999999 0.97545161010000003 4.0775456664999998 -2.7245289095 0.97545161010000003 3.4676675476000001 -3.4676675476000001 0.97545161010000003 2.7245289095 -4.0775456664999998 0.97545161010000003 1.8766881533999999 -4.5307259921999998 0.97545161010000003 0.95672732390000004 -4.8097930588000004 0.97545161010000003 0 -4.9040224755999997 0.97545161010000003 -0.95672732390000004 -4.8097930588000004 0.97545161010000003 -1.8766881533999999 -4.5307259921999998 0.97545161010000003 -2.7245289095 -4.0775456664999998 0.97545161010000003 -3.4676675476000001 -3.4676675476000001 0.97545161010000003 -4.0775456664999998 -2.7245289095 0.97545161010000003 -4.5307259921999998 -1.8766881533999999 0.97545161010000003 -4.8097930588000004 -0.95672732390000004 0.97545161010000003 -4.9040224755999997 0 0.97545161010000003 -4.8097930588000004 0.95672732390000004 0.97545161010000003 -4.5307259921999998 1.8766881533999999 0.97545161010000003 -4.0775456664999998 2.7245289095 0.97545161010000003 -3.4676675476000001 3.4676675476000001 0.97545161010000003 -2.7245289095 4.0775456664999998 0.97545161010000003 -1.8766881533999999 4.5307259921999998 0.97545161010000003 -0.95672732390000004 4.8097930588000004 0.97545161010000003 0 4.9040224755999997 0.97545161010000003 0.95672732390000004 4.8097930588000004 0.97545161010000003 1.8766881533999999 4.5307259921999998 0.97545161010000003 2.7245289095 4.0775456664999998 0.97545161010000003 3.4676675476000001 3.4676675476000001 0.97545161010000003 4.0775456664999998 2.7245289095 0.97545161010000003 4.5307259921999998 1.8766881533999999 0.97545161010000003 4.8097930588000004 0.95672732390000004 0.97545161010000003 5 0 0 4.9039264019999997 -0.97545161010000003 0 4.6193976626 -1.9134171618 0 4.1573480614999996 -2.7778511651 0 3.5355339058999999 -3.5355339058999999 0 2.7778511651 -4.1573480614999996 0 1.9134171618 -4.6193976626 0 0.97545161010000003 -4.9039264019999997 0 0 -5 0 -0.97545161010000003 -4.9039264019999997 0 -1.9134171618 -4.6193976626 0 -2.7778511651 -4.1573480614999996 0 -3.5355339058999999 -3.5355339058999999 0 -4.1573480614999996 -2.7778511651 0 -4.6193976626 -1.9134171618 0 -4.9039264019999997 -0.97545161010000003 0 -5 0 0 -4.9039264019999997 0.97545161010000003 0 -4.6193976626 1.9134171618 0 -4.1573480614999996 2.7778511651 0 -3.5355339058999999 3.5355339058999999 0 -2.7778511651 4.1573480614999996 0 -1.9134171618 4.6193976626 0 -0.97545161010000003 4.9039264019999997 0 0 5 0 0.97545161010000003 4.9039264019999997 0 1.9134171618 4.6193976626 0 2.7778511651 4.1573480614999996 0 3.5355339058999999 3.5355339058999999 0 4.1573480614999996 2.7778511651 0 4.6193976626 1.9134171618 0 4.9039264019999997 0.97545161010000003 0 4.9040224755999997 0 -0.97545161010000003 4.8097930588000004 -0.95672732390000004 -0.97545161010000003 4.5307259921999998 -1.8766881533999999 -0.97545161010000003 4.0775456664999998 -2.7245289095 -0.97545161010000003 3.4676675476000001 -3.4676675476000001 -0.97545161010000003 2.7245289095 -4.0775456664999998 -0.97545161010000003 1.8766881533999999 -4.5307259921999998 -0.97545161010000003 0.95672732390000004 -4.8097930588000004 -0.97545161010000003 0 -4.9040224755999997 -0.97545161010000003 -0.95672732390000004 -4.8097930588000004 -0.97545161010000003 -1.8766881533999999 -4.5307259921999998 -0.97545161010000003 -2.7245289095 -4.0775456664999998 -0.97545161010000003 -3.4676675476000001 -3.4676675476000001 -0.97545161010000003 -4.0775456664999998 -2.7245289095 -0.97545161010000003 -4.5307259921999998 -1.8766881533999999 -0.97545161010000003 -4.8097930588000004 -0.95672732390000004 -0.97545161010000003 -4.9040224755999997 0 -0.97545161010000003 -4.8097930588000004 0.95672732390000004 -0.97545161010000003 -4.5307259921999998 1.8766881533999999 -0.97545161010000003 -4.0775456664999998 2.7245289095 -0.97545161010000003 -3.4676675476000001 3.4676675476000001 -0.97545161010000003 -2.7245289095 4.0775456664999998 -0.97545161010000003 -1.8766881533999999 4.5307259921999998 -0.97545161010000003 -0.95672732390000004 4.8097930588000004 -0.97545161010000003 0 4.9040224755999997 -0.97545161010000003 0.95672732390000004 4.8097930588000004 -0.97545161010000003 1.8766881533999999 4.5307259921999998 -0.97545161010000003 2.7245289095 4.0775456664999998 -0.97545161010000003 3.4676675476000001 3.4676675476000001 -0.97545161010000003 4.0775456664999998 2.7245289095 -0.97545161010000003 4.5307259921999998 1.8766881533999999 -0.97545161010000003 4.8097930588000004 0.95672732390000004 -0.97545161010000003 4.6197782648999999 0 -1.9134171618 4.5310105208999998 -0.9012740293 -1.9134171618 4.2681185836999997 -1.7679126032000001 -1.9134171618 3.8412052428000001 -2.5666112871000002 -1.9134171618 3.2666765387000001 -3.2666765387000001 -1.9134171618 2.5666112871000002 -3.8412052428000001 -1.9134171618 1.7679126032000001 -4.2681185836999997 -1.9134171618 0.9012740293 -4.5310105208999998 -1.9134171618 0 -4.6197782648999999 -1.9134171618 -0.9012740293 -4.5310105208999998 -1.9134171618 -1.7679126032000001 -4.2681185836999997 -1.9134171618 -2.5666112871000002 -3.8412052428000001 -1.9134171618 -3.2666765387000001 -3.2666765387000001 -1.9134171618 -3.8412052428000001 -2.5666112871000002 -1.9134171618 -4.2681185836999997 -1.7679126032000001 -1.9134171618 -4.5310105208999998 -0.9012740293 -1.9134171618 -4.6197782648999999 0 -1.9134171618 -4.5310105208999998 0.9012740293 -1.9134171618 -4.2681185836999997 1.7679126032000001 -1.9134171618 -3.8412052428000001 2.5666112871000002 -1.9134171618 -3.2666765387000001 3.2666765387000001 -1.9134171618 -2.5666112871000002 3.8412052428000001 -1.9134171618 -1.7679126032000001 4.2681185836999997 -1.9134171618 -0.9012740293 4.5310105208999998 -1.9134171618 0 4.6197782648999999 -1.9134171618 0.9012740293 4.5310105208999998 -1.9134171618 1.7679126032000001 4.2681185836999997 -1.9134171618 2.5666112871000002 3.8412052428000001 -1.9134171618 3.2666765387000001 3.2666765387000001 -1.9134171618 3.8412052428000001 2.5666112871000002 -1.9134171618 4.2681185836999997 1.7679126032000001 -1.9134171618 4.5310105208999998 0.9012740293 -1.9134171618 0 -3 0 -0.58527096599999995 -2.9423558411999999 0 -1.1480502971 -2.7716385975 0 -1.6667106991 -2.4944088368999999 0 -2.1213203435999999 -2.1213203435999999 0 -2.4944088368999999 -1.6667106991 0 -2.7716385975 -1.1480502971 0 -2.9423558411999999 -0.58527096599999995 0 -3 0 0 -2.9423558411999999 0.58527096599999995 0 -2.7716385975 1.1480502971 0 -2.4944088368999999 1.6667106991 0 -2.1213203435999999 2.1213203435999999 0 -1.6667106991 2.4944088368999999 0 -1.1480502971 2.7716385975 0 -0.58527096599999995 2.9423558411999999 0 0 3 0 0.58527096599999995 2.9423558411999999 0 1.1480502971 2.7716385975 0 1.6667106991 2.4944088368999999 0 2.1213203435999999 2.1213203435999999 0 2.4944088368999999 1.6667106991 0 2.7716385975 1.1480502971 0 2.9423558411999999 0.58527096599999995 0 3 0 0 2.9423558411999999 -0.58527096599999995 0 2.7716385975 -1.1480502971 0 2.4944088368999999 -1.6667106991 0 2.1213203435999999 -2.1213203435999999 0 1.6667106991 -2.4944088368999999 0 1.1480502971 -2.7716385975 0 0.58527096599999995 -2.9423558411999999 0 0 -3.152240935 0.76536686470000004 -0.61497169910000005 -3.0916715092999998 0.76536686470000004 -1.2063103806 -2.9122908814000001 0.76536686470000004 -1.7512912307999999 -2.6209925480999998 0.76536686470000004 -2.2289709411 -2.2289709411 0.76536686470000004 -2.6209925480999998 -1.7512912307999999 0.76536686470000004 -2.9122908814000001 -1.2063103806 0.76536686470000004 -3.0916715092999998 -0.61497169910000005 0.76536686470000004 -3.152240935 0 0.76536686470000004 -3.0916715092999998 0.61497169910000005 0.76536686470000004 -2.9122908814000001 1.2063103806 0.76536686470000004 -2.6209925480999998 1.7512912307999999 0.76536686470000004 -2.2289709411 2.2289709411 0.76536686470000004 -1.7512912307999999 2.6209925480999998 0.76536686470000004 -1.2063103806 2.9122908814000001 0.76536686470000004 -0.61497169910000005 3.0916715092999998 0.76536686470000004 0 3.152240935 0.76536686470000004 0.61497169910000005 3.0916715092999998 0.76536686470000004 1.2063103806 2.9122908814000001 0.76536686470000004 1.7512912307999999 2.6209925480999998 0.76536686470000004 2.2289709411 2.2289709411 0.76536686470000004 2.6209925480999998 1.7512912307999999 0.76536686470000004 2.9122908814000001 1.2063103806 0.76536686470000004 3.0916715092999998 0.61497169910000005 0.76536686470000004 3.152240935 0 0.76536686470000004 3.0916715092999998 -0.61497169910000005 0.76536686470000004 2.9122908814000001 -1.2063103806 0.76536686470000004 2.6209925480999998 -1.7512912307999999 0.76536686470000004 2.2289709411 -2.2289709411 0.76536686470000004 1.7512912307999999 -2.6209925480999998 0.76536686470000004 1.2063103806 -2.9122908814000001 0.76536686470000004 0.61497169910000005 -3.0916715092999998 0.76536686470000004 0 -3.5857864375999999 1.4142135624000001 -0.69955223079999995 -3.5168865566999998 1.4142135624000001 -1.3722210616999999 -3.3128346977000001 1.4142135624000001 -1.9921562067 -2.9814724590999999 1.4142135624000001 -2.5355339058999999 -2.5355339058999999 1.4142135624000001 -2.9814724590999999 -1.9921562067 1.4142135624000001 -3.3128346977000001 -1.3722210616999999 1.4142135624000001 -3.5168865566999998 -0.69955223079999995 1.4142135624000001 -3.5857864375999999 0 1.4142135624000001 -3.5168865566999998 0.69955223079999995 1.4142135624000001 -3.3128346977000001 1.3722210616999999 1.4142135624000001 -2.9814724590999999 1.9921562067 1.4142135624000001 -2.5355339058999999 2.5355339058999999 1.4142135624000001 -1.9921562067 2.9814724590999999 1.4142135624000001 -1.3722210616999999 3.3128346977000001 1.4142135624000001 -0.69955223079999995 3.5168865566999998 1.4142135624000001 0 3.5857864375999999 1.4142135624000001 0.69955223079999995 3.5168865566999998 1.4142135624000001 1.3722210616999999 3.3128346977000001 1.4142135624000001 1.9921562067 2.9814724590999999 1.4142135624000001 2.5355339058999999 2.5355339058999999 1.4142135624000001 2.9814724590999999 1.9921562067 1.4142135624000001 3.3128346977000001 1.3722210616999999 1.4142135624000001 3.5168865566999998 0.69955223079999995 1.4142135624000001 3.5857864375999999 0 1.4142135624000001 3.5168865566999998 -0.69955223079999995 1.4142135624000001 3.3128346977000001 -1.3722210616999999 1.4142135624000001 2.9814724590999999 -1.9921562067 1.4142135624000001 2.5355339058999999 -2.5355339058999999 1.4142135624000001 1.9921562067 -2.9814724590999999 1.4142135624000001 1.3722210616999999 -3.3128346977000001 1.4142135624000001 0.69955223079999995 -3.5168865566999998 1.4142135624000001 0 -4.2346331353000002 1.847759065 -0.82613594199999996 -4.1532658470000001 1.847759065 -1.620523943 -3.9122908814000001 1.847759065 -2.3526361176999999 -3.5209687712000002 1.847759065 -2.9943378057999999 -2.9943378057999999 1.847759065 -3.5209687712000002 -2.3526361176999999 1.847759065 -3.9122908814000001 -1.620523943 1.847759065 -4.1532658470000001 -0.82613594199999996 1.847759065 -4.2346331353000002 0 1.847759065 -4.1532658470000001 0.82613594199999996 1.847759065 -3.9122908814000001 1.620523943 1.847759065 -3.5209687712000002 2.3526361176999999 1.847759065 -2.9943378057999999 2.9943378057999999 1.847759065 -2.3526361176999999 3.5209687712000002 1.847759065 -1.620523943 3.9122908814000001 1.847759065 -0.82613594199999996 4.1532658470000001 1.847759065 0 4.2346331353000002 1.847759065 0.82613594199999996 4.1532658470000001 1.847759065 1.620523943 3.9122908814000001 1.847759065 2.3526361176999999 3.5209687712000002 1.847759065 2.9943378057999999 2.9943378057999999 1.847759065 3.5209687712000002 2.3526361176999999 1.847759065 3.9122908814000001 1.620523943 1.847759065 4.1532658470000001 0.82613594199999996 1.847759065 4.2346331353000002 0 1.847759065 4.1532658470000001 -0.82613594199999996 1.847759065 3.9122908814000001 -1.620523943 1.847759065 3.5209687712000002 -2.3526361176999999 1.847759065 2.9943378057999999 -2.9943378057999999 1.847759065 2.3526361176999999 -3.5209687712000002 1.847759065 1.620523943 -3.9122908814000001 1.847759065 0.82613594199999996 -4.1532658470000001 1.847759065 0 -4.2346331353000002 -1.847759065 -0.82613594199999996 -4.1532658470000001 -1.847759065 -1.620523943 -3.9122908814000001 -1.847759065 -2.3526361176999999 -3.5209687712000002 -1.847759065 -2.9943378057999999 -2.9943378057999999 -1.847759065 -3.5209687712000002 -2.3526361176999999 -1.847759065 -3.9122908814000001 -1.620523943 -1.847759065 -4.1532658470000001 -0.82613594199999996 -1.847759065 -4.2346331353000002 0 -1.847759065 -4.1532658470000001 0.82613594199999996 -1.847759065 -3.9122908814000001 1.620523943 -1.847759065 -3.5209687712000002 2.3526361176999999 -1.847759065 -2.9943378057999999 2.9943378057999999 -1.847759065 -2.3526361176999999 3.5209687712000002 -1.847759065 -1.620523943 3.9122908814000001 -1.847759065 -0.82613594199999996 4.1532658470000001 -1.847759065 0 4.2346331353000002 -1.847759065 0.82613594199999996 4.1532658470000001 -1.847759065 1.620523943 3.9122908814000001 -1.847759065 2.3526361176999999 3.5209687712000002 -1.847759065 2.9943378057999999 2.9943378057999999 -1.847759065 3.5209687712000002 2.3526361176999999 -1.847759065 3.9122908814000001 1.620523943 -1.847759065 4.1532658470000001 0.82613594199999996 -1.847759065 4.2346331353000002 0 -1.847759065 4.1532658470000001 -0.82613594199999996 -1.847759065 3.9122908814000001 -1.620523943 -1.847759065 3.5209687712000002 -2.3526361176999999 -1.847759065 2.9943378057999999 -2.9943378057999999 -1.847759065 2.3526361176999999 -3.5209687712000002 -1.847759065 1.620523943 -3.9122908814000001 -1.847759065 0.82613594199999996 -4.1532658470000001 -1.847759065 0 -3.5857864375999999 -1.4142135624000001 -0.69955223079999995 -3.5168865566999998 -1.4142135624000001 -1.3722210616999999 -3.3128346977000001 -1.4142135624000001 -1.9921562067 -2.9814724590999999 -1.4142135624000001 -2.5355339058999999 -2.5355339058999999 -1.4142135624000001 -2.9814724590999999 -1.9921562067 -1.4142135624000001 -3.3128346977000001 -1.3722210616999999 -1.4142135624000001 -3.5168865566999998 -0.69955223079999995 -1.4142135624000001 -3.5857864375999999 0 -1.4142135624000001 -3.5168865566999998 0.69955223079999995 -1.4142135624000001 -3.3128346977000001 1.3722210616999999 -1.4142135624000001 -2.9814724590999999 1.9921562067 -1.4142135624000001 -2.5355339058999999 2.5355339058999999 -1.4142135624000001 -1.9921562067 2.9814724590999999 -1.4142135624000001 -1.3722210616999999 3.3128346977000001 -1.4142135624000001 -0.69955223079999995 3.5168865566999998 -1.4142135624000001 0 3.5857864375999999 -1.4142135624000001 0.69955223079999995 3.5168865566999998 -1.4142135624000001 1.3722210616999999 3.3128346977000001 -1.4142135624000001 1.9921562067 2.9814724590999999 -1.4142135624000001 2.5355339058999999 2.5355339058999999 -1.4142135624000001 2.9814724590999999 1.9921562067 -1.4142135624000001 3.3128346977000001 1.3722210616999999 -1.4142135624000001 3.5168865566999998 0.69955223079999995 -1.4142135624000001 3.5857864375999999 0 -1.4142135624000001 3.5168865566999998 -0.69955223079999995 -1.4142135624000001 3.3128346977000001 -1.3722210616999999 -1.4142135624000001 2.9814724590999999 -1.9921562067 -1.4142135624000001 2.5355339058999999 -2.5355339058999999 -1.4142135624000001 1.9921562067 -2.9814724590999999 -1.4142135624000001 1.3722210616999999 -3.3128346977000001 -1.4142135624000001 0.69955223079999995 -3.5168865566999998 -1.4142135624000001 0 -3.152240935 -0.76536686470000004 -0.61497169910000005 -3.0916715092999998 -0.76536686470000004 -1.2063103806 -2.9122908814000001 -0.76536686470000004 -1.7512912307999999 -2.6209925480999998 -0.76536686470000004 -2.2289709411 -2.2289709411 -0.76536686470000004 -2.6209925480999998 -1.7512912307999999 -0.76536686470000004 -2.9122908814000001 -1.2063103806 -0.76536686470000004 -3.0916715092999998 -0.61497169910000005 -0.76536686470000004 -3.152240935 0 -0.76536686470000004 -3.0916715092999998 0.61497169910000005 -0.76536686470000004 -2.9122908814000001 1.2063103806 -0.76536686470000004 -2.6209925480999998 1.7512912307999999 -0.76536686470000004 -2.2289709411 2.2289709411 -0.76536686470000004 -1.7512912307999999 2.6209925480999998 -0.76536686470000004 -1.2063103806 2.9122908814000001 -0.76536686470000004 -0.61497169910000005 3.0916715092999998 -0.76536686470000004 0 3.152240935 -0.76536686470000004 0.61497169910000005 3.0916715092999998 -0.76536686470000004 1.2063103806 2.9122908814000001 -0.76536686470000004 1.7512912307999999 2.6209925480999998 -0.76536686470000004 2.2289709411 2.2289709411 -0.76536686470000004 2.6209925480999998 1.7512912307999999 -0.76536686470000004 2.9122908814000001 1.2063103806 -0.76536686470000004 3.0916715092999998 0.61497169910000005 -0.76536686470000004 3.152240935 0 -0.76536686470000004 3.0916715092999998 -0.61497169910000005 -0.76536686470000004 2.9122908814000001 -1.2063103806 -0.76536686470000004 2.6209925480999998 -1.7512912307999999 -0.76536686470000004 2.2289709411 -2.2289709411 -0.76536686470000004 1.7512912307999999 -2.6209925480999998 -0.76536686470000004 1.2063103806 -2.9122908814000001 -0.76536686470000004 0.61497169910000005 -3.0916715092999998 -0.76536686470000004 -4.614491650792476 0 1.923317621600114 -3.2629383380110872 -3.2629383380110872 1.9233176216077763 -3.2629383380110872 3.2629383380110872 1.9233176216077763 0 4.614491650792476 1.923317621600114 0 -4.614491650792476 1.923317621600114 3.2629383380110872 -3.2629383380110872 1.9233176216077763 3.2629383380110872 3.2629383380110872 1.9233176216077763 4.614491650792476 0 1.923317621600114 -4.614491650792476 0 -1.923317621600114 -3.2629383380110872 -3.2629383380110872 -1.9233176216077763 -3.2629383380110872 3.2629383380110872 -1.9233176216077763 0 -4.614491650792476 -1.923317621600114 0 4.614491650792476 -1.923317621600114 3.2629383380110872 -3.2629383380110872 -1.9233176216077763 3.2629383380110872 3.2629383380110872 -1.9233176216077763 4.614491650792476 0 -1.923317621600114 -4.5258254876036323 -0.90024266205248027 1.9233176215941681 -4.5258254876036323 0.90024266205248027 1.9233176215941681 -4.2632343891270912 -1.7658895035671818 1.9233176216032399 -3.8368095838188108 -2.5636742016690315 1.9233176215976027 -4.2632343891270912 1.7658895035671818 1.9233176216032399 -3.8368095838188108 2.5636742016690315 1.9233176215976027 -2.5636742016690315 -3.8368095838188108 1.9233176215976027 -1.7658895035671818 -4.2632343891270912 1.9233176216032399 -2.5636742016690315 3.8368095838188108 1.9233176215976027 -1.7658895035671818 4.2632343891270912 1.9233176216032399 -0.90024266205248027 -4.5258254876036323 1.9233176215941681 -0.90024266205248027 4.5258254876036323 1.9233176215941681 0.90024266205248027 4.5258254876036323 1.9233176215941681 0.90024266205248027 -4.5258254876036323 1.9233176215941681 1.7658895035671818 -4.2632343891270912 1.9233176216032399 1.7658895035671818 4.2632343891270912 1.9233176216032399 2.5636742016690315 3.8368095838188108 1.9233176215976027 2.5636742016690315 -3.8368095838188108 1.9233176215976027 3.8368095838188108 -2.5636742016690315 1.9233176215976027 3.8368095838188108 2.5636742016690315 1.9233176215976027 4.2632343891270912 1.7658895035671818 1.9233176216032399 4.2632343891270912 -1.7658895035671818 1.9233176216032399 4.5258254876036323 -0.90024266205248027 1.9233176215941681 4.5258254876036323 0.90024266205248027 1.9233176215941681 -4.5258254876036323 0.90024266205248027 -1.9233176215941681 -4.5258254876036323 -0.90024266205248027 -1.9233176215941681 -4.2632343891270912 -1.7658895035671818 -1.9233176216032399 -3.8368095838188108 2.5636742016690315 -1.9233176215976027 -4.2632343891270912 1.7658895035671818 -1.9233176216032399 -3.8368095838188108 -2.5636742016690315 -1.9233176215976027 -2.5636742016690315 -3.8368095838188108 -1.9233176215976027 -1.7658895035671818 4.2632343891270912 -1.9233176216032399 -2.5636742016690315 3.8368095838188108 -1.9233176215976027 -1.7658895035671818 -4.2632343891270912 -1.9233176216032399 -0.90024266205248027 -4.5258254876036323 -1.9233176215941681 -0.90024266205248027 4.5258254876036323 -1.9233176215941681 0.90024266205248027 4.5258254876036323 -1.9233176215941681 0.90024266205248027 -4.5258254876036323 -1.9233176215941681 1.7658895035671818 -4.2632343891270912 -1.9233176216032399 1.7658895035671818 4.2632343891270912 -1.9233176216032399 2.5636742016690315 -3.8368095838188108 -1.9233176215976027 2.5636742016690315 3.8368095838188108 -1.9233176215976027 3.8368095838188108 -2.5636742016690315 -1.9233176215976027 3.8368095838188108 2.5636742016690315 -1.9233176215976027 4.2632343891270912 -1.7658895035671818 -1.9233176216032399 4.2632343891270912 1.7658895035671818 -1.9233176216032399 4.5258254876036323 -0.90024266205248027 -1.9233176215941681 4.5258254876036323 0.90024266205248027 -1.9233176215941681 -4.5258254875893558 -0.90024266210293058 -1.9233176215923169 -4.5258254875893567 0.90024266210293058 -1.9233176215923169 -4.2632343891411653 -1.7658895035237361 -1.9233176216016274 -4.2632343891411661 1.7658895035237361 -1.9233176216016277 -3.8368095838138734 -2.5636742016752834 -1.9233176215973216 -3.8368095838138734 2.5636742016752838 -1.9233176215973216 -2.5636742016752834 3.8368095838138734 -1.9233176215973216 -2.5636742016752838 -3.8368095838138734 -1.9233176215973216 -1.7658895035237361 -4.2632343891411661 -1.9233176216016277 -1.7658895035237361 4.2632343891411653 -1.9233176216016274 -0.90024266210293058 4.5258254875893558 -1.9233176215923169 -0.90024266210293058 -4.5258254875893567 -1.9233176215923169 0.90024266210293058 -4.5258254875893558 -1.9233176215923169 1.7658895035237361 -4.2632343891411653 -1.9233176216016274 0.90024266210293058 4.5258254875893567 -1.9233176215923169 1.7658895035237361 4.2632343891411661 -1.9233176216016277 2.5636742016752834 -3.8368095838138734 -1.9233176215973216 2.5636742016752838 3.8368095838138734 -1.9233176215973216 3.8368095838138734 -2.5636742016752838 -1.9233176215973216 3.8368095838138734 2.5636742016752834 -1.9233176215973216 4.2632343891411661 -1.7658895035237361 -1.9233176216016277 4.5258254875893567 -0.90024266210293058 -1.9233176215923169 4.2632343891411653 1.7658895035237361 -1.9233176216016274 4.5258254875893558 0.90024266210293058 -1.9233176215923169 -4.5258254875893567 -0.90024266210293058 1.9233176215923169 -4.5258254875893558 0.90024266210293058 1.9233176215923169 -4.2632343891411661 -1.7658895035237361 1.9233176216016277 -4.2632343891411653 1.7658895035237361 1.9233176216016274 -3.8368095838138734 -2.5636742016752838 1.9233176215973216 -3.8368095838138734 2.5636742016752834 1.9233176215973216 -2.5636742016752834 -3.8368095838138734 1.9233176215973216 -2.5636742016752838 3.8368095838138734 1.9233176215973216 -1.7658895035237361 -4.2632343891411653 1.9233176216016274 -1.7658895035237361 4.2632343891411661 1.9233176216016277 -0.90024266210293058 -4.5258254875893558 1.9233176215923169 -0.90024266210293058 4.5258254875893567 1.9233176215923169 0.90024266210293058 -4.5258254875893567 1.9233176215923169 1.7658895035237361 4.2632343891411653 1.9233176216016274 0.90024266210293058 4.5258254875893558 1.9233176215923169 1.7658895035237361 -4.2632343891411661 1.9233176216016277 2.5636742016752838 -3.8368095838138734 1.9233176215973216 2.5636742016752834 3.8368095838138734 1.9233176215973216 3.8368095838138734 2.5636742016752838 1.9233176215973216 3.8368095838138734 -2.5636742016752834 1.9233176215973216 4.2632343891411653 -1.7658895035237361 1.9233176216016274 4.5258254875893567 0.90024266210293058 1.9233176215923169 4.2632343891411661 1.7658895035237361 1.9233176216016277 4.5258254875893558 -0.90024266210293058 1.9233176215923169</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">2 0 3 1 5 30 8 6 9 7 11 16 14 12 15 13 17 10 19 53 22 20 23 21 26 24 27 25 29 81 31 4 33 86 36 34 37 35 40 38 41 39 44 42 45 43 47 63 49 50 51 48 18 52 55 56 120 59 57 60 61 62 58 64 46 66 121 68 69 70 67 73 71 74 72 77 75 78 76 80 160 82 28 84 164 32 85 88 89 170 91 92 93 90 96 94 97 98 99 95 101 102 103 100 106 104 107 105 110 108 111 109 113 139 127 116 118 115 119 117 54 122 65 124 125 126 217 128 129 130 114 132 134 131 133 136 137 143 135 140 112 142 218 144 138 147 145 148 149 146 152 150 153 151 156 154 157 155 159 265 161 79 163 269 165 83 167 168 169 275 87 172 173 174 175 171 177 179 176 180 178 182 184 181 183 186 187 189 185 190 188 193 191 194 195 192 198 196 199 197 202 200 203 201 205 242 208 206 209 207 211 228 214 212 215 213 123 216 219 141 221 222 340 224 225 226 223 210 227 230 352 233 231 234 232 237 235 238 236 240 246 239 243 204 245 341 241 248 383 247 251 252 253 254 250 257 255 258 256 261 259 262 260 264 398 266 158 268 402 270 162 272 273 408 166 274 277 278 279 276 281 418 284 282 285 283 288 286 289 287 292 290 293 291 296 294 297 295 300 298 301 299 303 305 302 304 307 449 306 310 311 312 313 309 316 314 317 315 320 318 321 319 323 371 326 324 327 325 329 356 332 330 333 331 336 334 337 335 339 347 220 342 244 344 345 346 490 348 349 350 338 229 351 354 501 328 355 358 505 361 359 362 360 365 363 366 364 369 367 370 368 372 322 374 491 377 375 378 376 380 381 539 379 249 385 386 387 384 390 388 391 389 394 392 395 393 397 557 399 263 401 561 403 267 405 406 407 566 271 410 411 412 413 414 409 416 574 280 417 420 578 423 421 424 422 427 425 428 426 431 429 432 430 435 433 436 434 439 437 440 438 443 441 444 442 447 445 448 446 308 452 450 453 451 455 456 619 454 459 460 461 458 464 462 465 463 468 466 469 467 471 524 474 472 475 473 477 509 480 478 481 479 484 482 485 483 488 486 489 487 343 492 373 494 495 657 497 498 499 496 353 500 503 668 357 504 507 672 476 508 511 675 514 512 515 513 518 516 519 517 522 520 523 521 525 470 527 659 530 528 531 529 534 532 535 533 537 711 536 540 382 543 541 544 545 546 542 549 547 550 548 553 551 554 552 556 726 558 396 560 730 562 400 564 565 735 404 568 569 570 567 572 744 415 573 576 748 419 577 580 642 583 581 584 582 587 585 588 586 591 589 592 590 595 593 596 594 599 597 600 598 603 601 604 602 607 605 608 606 611 609 612 610 615 613 616 614 621 617 620 457 622 618 624 781 623 628 626 629 630 631 627 634 632 635 633 638 636 639 637 641 691 643 579 645 646 647 644 649 650 651 648 653 654 655 652 664 658 493 660 526 662 663 814 665 666 656 502 667 670 825 506 671 674 829 676 510 678 749 680 681 682 679 689 683 686 687 688 685 690 684 692 640 694 815 697 695 698 696 701 699 702 700 705 703 706 704 708 709 868 707 538 713 714 715 712 718 716 719 717 722 720 723 721 725 883 727 555 729 887 731 559 733 734 893 736 563 738 739 740 737 742 902 571 743 746 802 575 747 750 677 752 753 754 751 756 757 758 755 760 761 762 759 764 765 766 763 769 767 770 768 773 771 774 772 777 775 778 776 782 779 625 783 780 785 786 939 784 789 790 791 788 794 792 795 793 798 796 799 797 801 845 803 745 805 806 807 804 809 810 811 808 813 821 661 816 693 818 819 820 962 822 823 824 812 826 669 828 973 830 673 832 904 834 835 836 833 838 839 840 837 842 843 844 841 846 800 848 964 850 855 853 851 854 852 856 849 858 859 860 857 862 863 864 861 866 867 1016 710 870 871 872 869 874 875 876 873 878 879 880 877 1034 881 884 724 886 1038 888 728 890 891 892 1043 732 895 896 897 898 899 894 901 956 903 741 905 831 907 908 909 906 911 912 913 910 915 916 917 914 919 920 921 918 923 926 930 924 927 922 934 928 931 925 940 932 935 929 937 1081 936 787 941 933 943 944 945 942 948 946 949 947 952 950 953 951 955 989 957 900 959 960 961 958 963 817 965 847 967 968 1111 970 971 972 969 974 827 976 1049 978 979 980 977 983 981 984 982 987 985 988 986 990 954 992 1112 994 1003 997 995 998 996 1001 999 1002 1000 1004 993 1006 1007 1008 1005 1010 1011 1012 1009 1014 1015 1165 1017 865 1019 1020 1021 1022 1023 1018 1025 1026 1027 1024 1029 1030 1031 1028 1180 1032 1035 882 1184 1036 1039 885 1041 1042 1189 1044 889 1046 1047 1048 1045 1050 975 1052 1053 1054 1051 1056 1061 1058 1059 1060 1057 1062 1055 1065 1063 1066 1064 1069 1067 1070 1068 1072 1073 1074 1071 1076 1077 1078 1075 1080 1083 1082 938 1084 1079 1086 1087 1225 1089 1090 1091 1092 1093 1088 1095 1096 1097 1094 1099 1100 1101 1098 1133 1102 1105 1106 1107 1108 1104 1110 1117 966 1113 991 1115 1116 1246 1118 1119 1109 1121 1122 1123 1124 1120 1127 1125 1128 1126 1130 1131 1132 1129 1134 1103 1247 1135 1138 1151 1141 1139 1142 1140 1145 1143 1146 1144 1149 1147 1150 1148 1152 1137 1154 1155 1156 1153 1158 1159 1160 1157 1162 1163 1164 1301 1013 1167 1168 1169 1166 1171 1172 1173 1170 1175 1176 1177 1174 1318 1178 1181 1033 1322 1182 1185 1037 1187 1253 1186 1040 1191 1192 1193 1194 1190 1197 1195 1198 1196 1200 1201 1202 1199 1205 1203 1206 1204 1209 1207 1210 1208 1213 1211 1214 1212 1216 1217 1218 1215 1220 1221 1222 1219 1224 1226 1085 1227 1223 1229 1230 1231 1358 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1266 1244 1114 1248 1136 1250 1251 1330 1249 1188 1255 1256 1264 1254 1260 1258 1261 1262 1263 1259 1265 1257 1267 1245 1380 1268 1271 1288 1274 1272 1275 1273 1278 1276 1279 1277 1282 1280 1283 1281 1285 1286 1287 1284 1289 1270 1291 1292 1293 1290 1295 1296 1297 1294 1299 1300 1434 1302 1161 1304 1305 1306 1307 1303 1309 1310 1311 1308 1313 1314 1315 1312 1450 1316 1319 1179 1385 1320 1323 1183 1326 1324 1327 1328 1329 1325 1331 1252 1333 1334 1335 1332 1338 1336 1339 1337 1342 1340 1343 1341 1346 1344 1347 1345 1349 1350 1351 1348 1353 1354 1355 1352 1357 1360 1359 1228 1361 1356 1363 1364 1489 1366 1367 1368 1369 1365 1371 1372 1373 1370 1375 1376 1377 1374 1395 1378 1381 1269 1383 1454 1382 1386 1321 1388 1390 1387 1389 1392 1393 1417 1391 1396 1379 1510 1397 1400 1421 1403 1401 1404 1402 1407 1405 1408 1406 1411 1409 1412 1410 1414 1415 1416 1413 1394 1419 1542 1418 1422 1399 1424 1425 1426 1423 1428 1430 1427 1429 1432 1433 1565 1298 1436 1437 1438 1439 1435 1441 1442 1443 1440 1445 1446 1447 1444 1580 1448 1451 1317 1512 1452 1384 1456 1457 1459 1455 1458 1461 1584 1460 1464 1465 1466 1463 1469 1467 1470 1468 1473 1471 1474 1472 1477 1475 1478 1476 1480 1481 1482 1479 1484 1485 1486 1483 1488 1491 1362 1487 1490 1493 1494 1621 1496 1497 1498 1499 1495 1501 1502 1503 1500 1505 1506 1507 1504 1518 1508 1511 1398 1513 1453 1516 1514 1517 1515 1519 1509 1582 1520 1523 1551 1526 1524 1527 1525 1530 1528 1531 1529 1534 1532 1535 1533 1538 1536 1539 1540 1541 1537 1543 1420 1546 1544 1547 1545 1549 1664 1548 1552 1522 1554 1556 1553 1555 1558 1560 1557 1559 1562 1563 1564 1691 1431 1567 1568 1569 1566 1571 1572 1573 1570 1575 1576 1577 1574 1642 1578 1581 1449 1583 1521 1585 1462 1588 1586 1589 1587 1591 1712 1590 1595 1593 1596 1597 1598 1594 1601 1599 1602 1600 1605 1603 1606 1604 1609 1607 1610 1608 1612 1613 1614 1611 1616 1618 1615 1617 1620 1623 1492 1619 1622 1625 1626 1627 1746 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1644 1640 1643 1579 1645 1641 1647 1677 1650 1648 1651 1649 1654 1652 1655 1653 1658 1656 1659 1657 1661 1662 1663 1660 1550 1666 1667 1785 1665 1671 1669 1672 1670 1675 1673 1676 1674 1678 1646 1680 1682 1679 1681 1684 1686 1683 1685 1688 1689 1816 1561 1690 1693 1694 1695 1696 1697 1692 1699 1700 1701 1698 1703 1704 1705 1702 1708 1706 1709 1707 1713 1710 1592 1714 1711 1716 1717 1835 1715 1720 1721 1722 1719 1725 1723 1726 1724 1729 1727 1730 1728 1733 1731 1734 1732 1736 1737 1738 1735 1740 1742 1739 1741 1744 1748 1624 1745 1743 1747 1750 1751 1869 1753 1754 1755 1756 1757 1752 1759 1760 1761 1758 1763 1764 1765 1762 1767 1803 1770 1768 1771 1769 1774 1772 1775 1773 1778 1776 1779 1777 1782 1780 1783 1784 1781 1786 1668 1789 1787 1790 1788 1792 1885 1791 1795 1796 1797 1794 1800 1798 1801 1799 1766 1802 1805 1807 1804 1806 1809 1811 1808 1810 1813 1814 1815 1886 1687 1818 1819 1820 1817 1822 1824 1821 1823 1826 1827 1828 1825 1831 1829 1832 1830 1837 1833 1836 1718 1838 1834 1840 1887 1839 1844 1842 1845 1846 1843 1849 1847 1850 1848 1853 1851 1854 1852 1857 1855 1858 1856 1860 1862 1859 1861 1864 1866 1863 1865 1868 1871 1749 1867 1870 1873 1874 1875 1884 1877 1878 1879 1876 1881 1883 1880 1882 1872 1793 1812 1841</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 5 6 11 12 19 20 24 29 33 34 38 42 47 48 120 58 66 67 71 75 80 84 170 90 95 100 104 108 113 114 118 217 134 143 142 146 150 154 159 163 275 175 179 184 189 192 196 200 205 206 211 212 340 226 230 231 235 246 245 383 250 255 259 264 268 408 279 281 282 286 290 294 298 305 449 309 314 318 323 324 329 330 334 338 490 354 358 359 363 367 374 375 539 384 388 392 397 401 566 413 416 420 421 425 429 433 437 441 445 450 619 458 462 466 471 472 477 478 482 486 657 499 503 507 511 512 516 520 527 528 532 711 542 547 551 556 560 735 570 572 576 580 581 585 589 593 597 601 605 609 613 617 781 627 632 636 641 645 649 653 656 814 670 674 678 680 683 686 694 695 699 703 868 712 716 720 725 729 893 740 742 746 752 756 760 764 767 771 775 779 939 788 792 796 801 805 809 812 962 828 832 834 838 842 848 850 851 858 862 1016 869 874 878 881 886 1043 898 901 907 911 915 919 923 924 928 932 1081 942 946 950 955 959 1111 972 976 978 981 985 992 994 995 999 1006 1010 1165 1018 1025 1029 1032 1036 1189 1048 1052 1056 1058 1063 1067 1072 1076 1080 1225 1088 1095 1099 1102 1104 1109 1246 1120 1125 1129 1135 1138 1139 1143 1147 1154 1158 1301 1166 1171 1175 1178 1182 1253 1190 1195 1199 1203 1207 1211 1216 1220 1224 1358 1232 1237 1241 1244 1330 1264 1259 1268 1271 1272 1276 1280 1284 1291 1295 1434 1303 1309 1313 1316 1320 1325 1332 1336 1340 1344 1349 1353 1357 1489 1365 1371 1375 1378 1454 1390 1417 1397 1400 1401 1405 1409 1413 1542 1424 1428 1565 1435 1441 1445 1448 1452 1459 1584 1463 1467 1471 1475 1480 1484 1488 1621 1495 1501 1505 1508 1514 1520 1523 1524 1528 1532 1537 1544 1664 1554 1558 1691 1566 1571 1575 1578 1586 1712 1594 1599 1603 1607 1612 1616 1620 1746 1628 1633 1637 1640 1647 1648 1652 1656 1660 1785 1669 1673 1680 1684 1816 1692 1699 1703 1706 1710 1835 1719 1723 1727 1731 1736 1740 1744 1869 1752 1759 1763 1767 1768 1772 1776 1781 1787 1885 1795 1798 1805 1809 1886 1817 1822 1826 1829 1833 1887 1843 1847 1851 1855 1860 1864 1868 1884 1876 1881</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">112 113 80 81 81 80 48 47 80 79 79 80 144 145 112 113 112 111 111 112 145 146 113 114 113 114 81 82 82 81 48 49 49 48 16 15 48 47 15 14 47 46 47 46 79 78 78 79 392 144 145 424 143 144 143 144 392 424 449 145 146 428 451 111 110 110 111 428 146 147 427 146 147 114 115 114 115 82 83 83 82 49 50 50 49 17 16 17 16 384 384 16 15 400 400 472 15 14 402 474 402 14 13 403 14 13 46 45 46 45 78 77 77 78 392 296 392 297 424 449 425 143 142 142 143 425 448 296 295 448 425 297 449 298 451 298 451 428 299 110 109 109 110 427 453 427 453 147 148 394 147 148 115 116 115 116 83 84 84 83 50 51 51 50 17 18 18 17 401 473 401 264 265 473 401 384 264 384 263 400 472 263 472 262 474 262 474 402 261 403 476 403 476 13 12 385 13 12 45 44 45 44 77 76 76 77 328 329 296 297 295 296 329 330 297 298 426 450 142 141 141 142 426 295 294 450 448 327 328 294 295 330 331 298 299 331 332 299 300 299 453 300 109 108 108 109 394 300 394 301 394 148 149 432 454 148 149 116 117 116 117 84 85 85 84 51 52 52 51 18 19 19 18 404 404 475 265 266 475 473 266 265 233 232 265 264 232 231 264 263 231 230 263 262 230 229 262 261 229 228 261 260 261 476 260 385 260 385 259 385 12 11 406 478 12 11 44 43 44 43 76 75 75 76 360 361 328 329 327 328 361 362 329 330 362 363 330 331 426 450 429 141 140 140 141 429 452 294 293 452 429 326 327 293 294 359 360 326 327 363 364 331 332 364 365 332 333 332 333 300 301 108 107 107 108 333 334 301 302 301 454 432 302 454 432 149 150 431 149 150 117 118 117 118 85 86 86 85 52 53 53 52 19 20 20 19 405 477 405 266 267 477 405 404 475 267 266 234 233 234 233 201 200 233 232 200 199 232 231 199 198 231 230 198 197 230 229 197 196 229 228 196 195 228 227 228 227 260 259 478 227 226 259 258 259 478 406 258 406 11 10 407 11 10 43 42 43 42 75 74 74 75 168 169 360 361 359 360 169 170 361 362 170 171 362 363 171 172 363 364 393 140 139 139 140 393 293 292 393 452 325 326 292 293 358 359 325 326 167 168 358 359 172 173 364 365 173 174 365 366 365 366 333 334 107 106 106 107 366 367 334 335 334 335 302 303 302 457 303 431 457 431 457 150 151 435 458 150 151 118 119 118 119 86 87 87 86 53 54 54 53 20 21 21 20 386 386 267 268 386 477 268 267 235 234 235 234 202 201 202 201 169 168 201 200 168 167 200 199 167 166 199 198 166 165 198 197 165 164 197 196 164 163 196 195 163 162 195 194 195 194 227 226 194 193 226 225 226 225 407 480 258 257 258 480 257 407 480 10 9 410 482 10 9 42 41 42 41 74 73 73 74 169 170 203 202 170 171 204 203 171 172 205 204 172 173 393 455 430 139 138 138 139 430 292 291 455 324 325 291 292 357 358 324 325 167 166 357 358 206 205 173 174 174 175 207 206 174 175 366 367 106 105 105 106 175 176 367 368 367 368 335 336 335 336 303 304 303 458 435 304 458 435 151 152 396 151 152 119 120 119 120 87 88 88 87 54 55 55 54 21 22 22 21 408 479 408 268 269 479 386 269 268 236 235 236 235 203 202 166 165 356 357 165 164 355 356 164 163 354 355 163 162 353 354 162 161 162 161 194 193 161 160 193 192 193 192 225 224 225 224 482 257 256 257 482 410 256 410 9 8 388 9 8 41 40 41 40 73 72 72 73 203 204 237 236 204 205 238 237 205 206 430 455 433 138 137 137 138 433 456 291 290 456 433 324 323 290 291 357 356 323 324 239 238 206 207 208 207 175 176 240 239 207 208 105 104 104 105 177 176 208 209 176 177 368 369 369 368 336 337 337 336 304 305 305 304 396 396 396 152 153 436 153 152 120 121 121 120 88 89 88 89 55 56 56 55 22 23 23 22 409 481 409 269 270 481 409 408 479 270 269 236 237 356 355 322 323 355 354 321 322 354 353 320 321 353 352 352 353 161 160 160 191 160 191 383 352 192 223 192 223 224 255 224 255 256 388 287 388 256 287 388 8 7 413 8 7 40 39 40 39 72 71 71 72 237 238 271 270 238 239 459 434 137 136 136 137 434 290 289 459 456 323 322 289 290 272 271 239 240 240 241 208 209 272 273 240 241 104 103 103 104 178 177 209 210 177 178 241 242 209 210 369 370 370 369 337 338 338 337 305 306 306 305 462 436 462 462 436 153 154 439 463 154 153 121 122 122 121 89 90 89 90 56 57 56 57 23 24 24 23 411 483 411 270 271 483 481 322 321 288 289 321 320 351 320 319 288 320 351 352 383 351 350 383 382 383 382 191 190 190 191 223 222 222 223 255 254 254 255 413 484 287 286 286 287 484 484 413 7 6 414 487 6 7 39 38 38 39 71 70 71 70 411 483 271 272 387 434 459 395 136 135 135 136 395 289 288 395 387 272 273 486 412 273 274 241 242 486 273 274 485 103 102 103 102 179 178 210 211 178 179 242 243 210 211 274 275 242 243 370 371 371 370 338 339 339 338 306 307 307 306 463 439 463 439 154 155 441 155 154 122 123 123 122 90 91 90 91 57 58 57 58 24 25 24 387 25 387 395 288 319 460 437 319 318 351 350 460 319 318 461 318 317 350 349 350 349 382 381 382 381 190 189 189 190 222 221 221 222 254 253 253 254 487 286 285 285 286 487 414 414 6 5 417 5 6 38 37 37 38 70 69 70 69 437 135 134 135 437 460 134 412 25 412 486 26 485 415 274 275 489 416 485 415 102 101 102 101 180 179 211 212 179 180 243 244 211 212 275 276 243 244 489 275 276 390 371 372 372 371 339 340 340 339 307 308 308 307 465 441 465 465 441 155 156 398 156 155 123 124 124 123 91 92 91 92 58 59 58 59 25 26 461 438 318 317 464 440 461 438 464 317 316 397 317 316 349 348 349 348 381 380 381 380 189 188 188 189 221 220 220 221 253 252 252 253 417 488 285 284 284 285 488 488 417 5 4 389 4 5 37 36 36 37 69 68 69 68 134 133 134 438 133 26 27 26 415 27 416 27 416 489 28 101 100 101 100 181 180 212 213 180 181 244 245 212 213 276 277 244 245 390 276 277 490 390 28 390 29 372 373 373 372 340 341 341 340 309 308 309 308 398 398 398 156 157 443 467 157 156 124 125 125 124 92 93 92 93 59 60 59 60 440 133 440 464 132 397 132 397 131 397 316 315 466 316 315 348 347 348 347 380 379 380 379 188 187 187 188 220 219 219 220 252 251 251 252 389 283 284 283 284 389 389 4 3 418 491 3 4 36 35 35 36 68 67 68 67 133 132 27 28 60 61 28 29 100 99 100 99 182 181 213 214 181 182 245 246 213 214 277 278 245 246 490 419 277 278 494 420 490 419 61 62 29 30 29 419 30 373 374 374 373 342 341 342 341 310 309 310 309 467 443 467 443 157 158 445 158 157 125 126 126 125 93 94 93 94 60 61 132 131 466 442 99 98 131 130 131 442 130 466 442 315 314 468 444 315 314 347 346 347 346 379 378 379 378 187 186 186 187 219 218 218 219 250 251 250 251 491 282 283 282 283 491 418 418 3 2 421 2 3 35 34 34 35 67 66 67 66 61 62 99 98 183 182 214 215 182 183 246 247 214 215 278 279 246 247 494 278 279 493 420 30 420 494 31 94 95 62 63 62 63 30 31 374 375 375 374 343 342 343 342 311 310 311 310 470 470 445 470 445 158 159 447 471 159 158 126 127 127 126 94 95 66 65 98 97 98 97 444 130 129 130 444 468 129 468 314 313 469 314 313 346 345 346 345 378 377 378 377 186 185 185 186 218 217 217 218 249 250 249 250 492 421 281 282 281 282 492 492 421 2 1 422 495 1 2 34 33 33 34 66 65 184 183 215 216 183 184 247 248 215 216 279 280 247 248 493 423 279 280 391 493 423 63 32 31 0 31 423 0 96 127 95 64 95 64 63 32 376 375 376 375 344 343 344 343 312 311 312 311 471 447 471 447 159 128 399 128 159 96 127 32 33 65 64 65 64 97 96 97 96 469 446 129 128 129 446 128 469 446 313 312 399 313 312 345 344 345 344 377 376 377 376 185 184 184 185 216 217 216 217 248 249 248 249 495 280 281 280 281 495 422 422 1 0 391 0 1 32 33 391 391 399 399\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CGALBoolean.cubes.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -1.25 2.5 1.25 -1.25 2.5 -1.25 1.25 2.5 1.25 1.25 2.5 -1.25 -1.25 -2.5 1.25 -1.25 -2.5 -1.25 1.25 -2.5 1.25 1.25 -2.5 -1.25</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 4 5 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 2 1 2 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">6 7 4 5 4 7 3 0 3 7 6 2 13 12 14 15 2 6 5 1 5 4 0 1 8 9 11 10 0 3 2 1 15 11 9 13 9 8 12 13 14 10 11 15 8 10 14 12\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CGALBoolean.cylinders.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 3.5355339058999999 -3.5355339058999999 5 0 -5 5 -3.5355339058999999 -3.5355339058999999 5 -5 0 5 -3.5355339058999999 3.5355339058999999 5 0 5 5 3.5355339058999999 3.5355339058999999 5 5 0 -5 3.5355339058999999 -3.5355339058999999 -5 0 -5 -5 -3.5355339058999999 -3.5355339058999999 -5 -5 0 -5 -3.5355339058999999 3.5355339058999999 -5 0 5 -5 3.5355339058999999 3.5355339058999999 -5 -2 0 5 -1.4142135624000001 -1.4142135624000001 5 -1.4142135624000001 1.4142135624000001 5 0 -2 5 0 2 5 1.4142135624000001 -1.4142135624000001 5 1.4142135624000001 1.4142135624000001 5 2 0 5 -2 0 -5 -1.4142135624000001 -1.4142135624000001 -5 -1.4142135624000001 1.4142135624000001 -5 0 -2 -5 0 2 -5 1.4142135624000001 -1.4142135624000001 -5 1.4142135624000001 1.4142135624000001 -5 2 0 -5 0 -3 0 -2.1213203435999999 -2.1213203435999999 0 -3 0 0 -2.1213203435999999 2.1213203435999999 0 0 3 0 2.1213203435999999 2.1213203435999999 0 3 0 0 2.1213203435999999 -2.1213203435999999 0 0 -5 2 -3.5355339058999999 -3.5355339058999999 2 -5 0 2 -3.5355339058999999 3.5355339058999999 2 0 5 2 3.5355339058999999 3.5355339058999999 2 5 0 2 3.5355339058999999 -3.5355339058999999 2 0 -5 -2 -3.5355339058999999 -3.5355339058999999 -2 -5 0 -2 -3.5355339058999999 3.5355339058999999 -2 0 5 -2 3.5355339058999999 3.5355339058999999 -2 5 0 -2 3.5355339058999999 -3.5355339058999999 -2</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 8 9 10 11 4 13 14 15 16 17 18 19 12 21 22 23 20 28 24 27 31 29 25 26 30 33 108 35 36 37 34 39 40 41 38 43 44 45 42 47 48 49 46 51 52 53 50 55 56 57 54 59 60 61 58 63 64 65 62 67 68 69 66 71 72 73 70 75 76 77 74 79 80 81 78 83 84 85 82 87 88 89 86 91 93 90 92 96 94 97 95 104 98 101 102 103 100 105 99 166 106 109 32 111 112 113 110 116 114 117 115 122 118 121 124 123 119 125 120 127 128 129 130 131 132 133 126 135 136 137 138 139 140 141 134 143 145 142 144 147 148 149 146 151 152 153 150 155 156 157 154 159 160 161 158 163 164 165 162 167 107 170 168 171 169 173 175 172 174 177 179 176 178 181 182 183 180 185 186 187 184 189 190 191 188</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 43</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 12 20 24 27 33 34 38 42 46 50 54 58 62 66 70 74 78 82 86 91 94 98 101 106 111 114 118 121 126 134 143 146 150 154 158 162 168 173 177 180 184 188</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">50 12 11 49 11 12 13 14 15 8 9 10 24 25 27 29 31 30 28 26 13 12 50 51 34 50 34 50 35 51 33 49 33 49 49 11 10 48 48 10 9 55 55 9 8 54 8 15 53 54 15 14 52 53 14 13 51 52 25 24 16 17 16 24 26 18 18 26 28 20 20 28 30 22 22 30 31 23 31 29 21 23 29 27 19 21 27 25 17 19 36 52 35 51 35 43 34 42 34 42 44 36 35 43 33 41 33 41 48 32 32 48 55 39 55 39 54 38 54 38 37 53 53 37 52 36 5 4 3 2 1 0 7 6 17 16 18 20 22 23 21 19 45 37 44 36 43 42 4 5 44 43 5 6 4 42 41 3 45 44 6 7 3 41 40 2 32 40 32 40 39 47 47 39 46 38 46 38 45 37 46 45 7 0 1 47 46 0 2 40 47 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CalculateNormals.2.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"Np\" type=\"k3d::normal3\">-1 1 1 1 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1</array>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Nf\" type=\"k3d::normal3\">0 1 0 1 0 0 0 -1 0 -1 0 0 0 0 1 0 0 -1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"Nv\" type=\"k3d::normal3\">-1 1 1 1 1 1 1 1 -1 -1 1 -1 1 1 1 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CalculateNormals.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"Np\" type=\"k3d::normal3\">-1 1 1 1 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1</array>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Nf\" type=\"k3d::normal3\">0 1 0 1 0 0 0 -1 0 -1 0 0 0 0 1 0 0 -1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"Nv\" type=\"k3d::normal3\">0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 -1 0 0 -1 0 0 -1 0 0 -1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CapHoles.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1.4629940343027594 -1.7708287703312871e-11 3.4698918717375102 1.1763609246830724 -1.8607378737812836e-11 3.6460663683818049 0.95218120805369133 -1.9715781970820731e-11 3.863255033557047 0.79138702460850119 -2.1028740306915925e-11 4.1205257270693521 0.69491051454138708 -2.2541496650677774e-11 4.4169463087248326 0.66275167785234901 -2.4254051002106286e-11 4.7525167785234901 0.72846756152125292 -2.673725481167763e-11 5.2390939597315445 0.9256152125279643 -2.879232003339184e-11 5.6417785234899327 1.2541946308724832 -3.0419246667248926e-11 5.9605704697986575 1.7100111856823268 -3.159662778385603e-11 6.1912751677852356 2.2888702460850112 -3.2303056453820288e-11 6.3296979865771812 2.9907718120805371 -3.2538532677141705e-11 6.375838926174497 3.6880126771066375 -3.2303056453820294e-11 6.3296979865771821 4.2640753169276664 -3.1596627783856024e-11 6.1912751677852347 4.7189597315436238 -3.0419246667248926e-11 5.9605704697986575 5.047539149888145 -2.8801834224233111e-11 5.6436428038777038 5.2446868008948551 -2.6746769002518895e-11 5.2409582401193138 5.3104026845637584 -2.4254051002106286e-11 4.7525167785234901 5.2777777777777786 -2.2541496650677774e-11 4.4169463087248326 5.1799030574198373 -2.1028740306915922e-11 4.1205257270693512 5.0167785234899327 -1.9715781970820731e-11 3.863255033557047 4.7925988068605525 -1.8607378737812839e-11 3.6460663683818053 4.5059656972408648 -1.7708287703312868e-11 3.4698918717375098 4.1568791946308723 -1.7018508867320826e-11 3.3347315436241609 4.5469798657718119 -1.6293051815674029e-11 3.1925801640566744 4.867170022371365 -1.5315468706733586e-11 3.0010253542132737 5.1174496644295306 -1.4085759540499502e-11 2.7600671140939599 5.2992170022371372 -1.2625331246364634e-11 2.4739000745712159 5.4082774049216997 -1.0927048181198026e-11 2.1411260253542133 5.4446308724832218 -8.9909103449996818e-12 1.761744966442953 5.3756524981357199 -6.0795679475712145e-12 1.1912751677852351 5.1687173750932143 -3.6819918555712981e-12 0.72147651006711411 4.8238255033557049 -1.7981820689999365e-12 0.3523489932885906 4.3461036539895606 -4.5430261267061906e-13 0.089019388516032846 3.7350857568978379 3.5202506112697166e-13 -0.068978374347501856 2.9907718120805371 6.2080095239283518e-13 -0.12164429530201343 2.2431953765846391 3.5202506112697171e-13 -0.06897837434750187 1.6279828486204326 -4.5430261267061876e-13 0.089019388516032791 1.1451342281879195 -1.7981820689999365e-12 0.3523489932885906 0.8002423564504102 -3.6819918555712981e-12 0.72147651006711411 0.59330723340790459 -6.0795679475712137e-12 1.1912751677852349 0.52432885906040272 -8.9909103449996818e-12 1.761744966442953 0.5602162565249813 -1.0927048181198026e-11 2.1411260253542133 0.66787844891871739 -1.2625331246364634e-11 2.4739000745712159 0.84731543624161076 -1.4085759540499502e-11 2.7600671140939599 1.0999254287844895 -1.5315468706733589e-11 3.0010253542132741 1.4215137956748696 -1.6293051815674026e-11 3.192580164056674 1.8120805369127517 -1.7018508867320826e-11 3.3347315436241609 2.7120618941088743 -1.4159494519519341e-11 2.7745152870991796 2.4799589858314688 -1.3738491574793166e-11 2.6920208799403431 2.2944630872483223 -1.3036820000249539e-11 2.5545302013422817 2.1593027591349743 -1.2073508177571003e-11 2.3657718120805376 2.0782065622669652 -1.0867584488440093e-11 2.1294742729306488 2.0511744966442955 -9.4190489328568096e-12 1.8456375838926176 2.0782065622669652 -7.9705133772735278e-12 1.5618008948545863 2.1593027591349743 -6.7645896881426189e-12 1.3255033557046982 2.2944630872483223 -5.8012778654640806e-12 1.136744966442953 2.4799589858314692 -5.1114990294720421e-12 1.0015846383296048 2.7120618941088739 -4.6976317278768181e-12 0.92048844146159592 2.9907718120805371 -4.5596759606784101e-12 0.89345637583892623 3.266685309470545 -4.6976317278768189e-12 0.92048844146159603 3.4959917971662939 -5.1114990294720413e-12 1.0015846383296048 3.6786912751677852 -5.8012778654640806e-12 1.136744966442953 3.8115212527964211 -6.7645896881426181e-12 1.325503355704698 3.8912192393736023 -7.9705133772735278e-12 1.5618008948545863 3.9177852348993287 -9.4190489328568096e-12 1.8456375838926176 3.8912192393736027 -1.0877098679281363e-11 2.1313385533184195 3.8115212527964211 -1.2083022368412272e-11 2.3676360924683073 3.6786912751677852 -1.3036820000249539e-11 2.5545302013422817 3.4959917971662939 -1.3738491574793166e-11 2.6920208799403431 3.2666853094705446 -1.4159494519519341e-11 2.7745152870991796 2.9907718120805371 -1.4299828834428066e-11 2.8020134228187921 2.2124347501864285 -2.2246556734598422e-11 4.3591536167039528 2.2809470544369876 -2.1268973625657979e-11 4.1675988068605525 2.3951342281879193 -2.0486431428963561e-11 4.0142617449664426 2.5545302013422817 -1.9915579978487393e-11 3.9024049217002243 2.7530760626398205 -1.9573069108201691e-11 3.8352908277404922 2.9907718120805371 -1.9458898818106454e-11 3.8129194630872485 3.2233407904548845 -1.9573069108201691e-11 3.8352908277404922 3.4176920208799406 -1.991557997848739e-11 3.9024049217002235 3.5738255033557049 -2.0486431428963561e-11 4.0142617449664426 3.688012677106637 -2.1268973625657979e-11 4.1675988068605525 3.7565249813571961 -2.2246556734598419e-11 4.359153616703952 3.7793624161073827 -2.3419180755784886e-11 4.5889261744966445 3.7565249813571961 -2.4589426229261043e-11 4.8182326621923952 3.6880126771066366 -2.5559873695070525e-11 5.0083892617449663 3.5738255033557049 -2.6330523153213355e-11 5.1593959731543624 3.4176920208799406 -2.6901374603689527e-11 5.2712527964205824 3.2233407904548845 -2.7243885473975229e-11 5.3383668903803132 2.9907718120805371 -2.7358055764070462e-11 5.3607382550335574 2.7530760626398214 -2.7243885473975229e-11 5.3383668903803132 2.5545302013422817 -2.690137460368952e-11 5.2712527964205806 2.3951342281879193 -2.6330523153213355e-11 5.1593959731543624 2.2809470544369876 -2.5550359504229257e-11 5.0065249813571961 2.2124347501864281 -2.4579912038419765e-11 4.8163683818046232 2.1895973154362416 -2.3419180755784886e-11 4.5889261744966445</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 0 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 48 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 72 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 96</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 3</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">3 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 48 72 96</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CapHoles.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1.4629940343027594 -1.7708287710329915e-11 3.4698918717375102 1.1763609246830724 -1.8607378745186153e-11 3.6460663683818049 0.95218120805369133 -1.9715781978633261e-11 3.863255033557047 0.79138702460850119 -2.1028740315248726e-11 4.1205257270693521 0.69491051454138708 -2.2541496659610013e-11 4.4169463087248326 0.66275167785234901 -2.4254051011717139e-11 4.7525167785234901 0.72846756152125292 -2.6737254822272473e-11 5.2390939597315445 0.9256152125279643 -2.8792320044801016e-11 5.6417785234899327 1.2541946308724832 -3.0419246679302782e-11 5.9605704697986575 1.7100111856823268 -3.1596627796376436e-11 6.1912751677852356 2.2888702460850112 -3.2303056466620617e-11 6.3296979865771812 2.9907718120805371 -3.253853269003535e-11 6.375838926174497 3.6880126771066375 -3.2303056466620624e-11 6.3296979865771821 4.2640753169276664 -3.159662779637643e-11 6.1912751677852347 4.7189597315436238 -3.0419246679302782e-11 5.9605704697986575 5.047539149888145 -2.8801834235646058e-11 5.6436428038777038 5.2446868008948551 -2.6746769013117505e-11 5.2409582401193138 5.3104026845637584 -2.4254051011717139e-11 4.7525167785234901 5.2777777777777786 -2.2541496659610013e-11 4.4169463087248326 5.1799030574198373 -2.102874031524872e-11 4.1205257270693512 5.0167785234899327 -1.9715781978633261e-11 3.863255033557047 4.7925988068605525 -1.8607378745186153e-11 3.6460663683818053 4.5059656972408648 -1.7708287710329912e-11 3.4698918717375098 4.1568791946308723 -1.7018508874064542e-11 3.3347315436241609 4.5469798657718119 -1.6293051822130274e-11 3.1925801640566744 4.867170022371365 -1.5315468712802459e-11 3.0010253542132737 5.1174496644295306 -1.4085759546081091e-11 2.7600671140939599 5.2992170022371372 -1.2625331251367518e-11 2.4739000745712159 5.4082774049216997 -1.0927048185527953e-11 2.1411260253542133 5.4446308724832218 -8.9909103485623988e-12 1.761744966442953 5.3756524981357199 -6.07956794998029e-12 1.1912751677852351 5.1687173750932143 -3.6819918570303155e-12 0.72147651006711411 4.8238255033557049 -1.7981820697124799e-12 0.3523489932885906 4.3461036539895606 -4.5430261285063995e-13 0.089019388516032846 3.7350857568978379 3.5202506126646428e-13 -0.068978374347501856 2.9907718120805371 6.2080095263883236e-13 -0.12164429530201343 2.2431953765846391 3.5202506126646433e-13 -0.06897837434750187 1.6279828486204326 -4.5430261285063965e-13 0.089019388516032791 1.1451342281879195 -1.7981820697124799e-12 0.3523489932885906 0.8002423564504102 -3.6819918570303155e-12 0.72147651006711411 0.59330723340790459 -6.0795679499802892e-12 1.1912751677852349 0.52432885906040272 -8.9909103485623988e-12 1.761744966442953 0.5602162565249813 -1.0927048185527953e-11 2.1411260253542133 0.66787844891871739 -1.2625331251367518e-11 2.4739000745712159 0.84731543624161076 -1.4085759546081091e-11 2.7600671140939599 1.0999254287844895 -1.5315468712802459e-11 3.0010253542132741 1.4215137956748696 -1.6293051822130274e-11 3.192580164056674 1.8120805369127517 -1.7018508874064542e-11 3.3347315436241609 2.7120618941088743 -1.4159494525130149e-11 2.7745152870991796 2.4799589858314688 -1.3738491580237149e-11 2.6920208799403431 2.2944630872483223 -1.3036820005415478e-11 2.5545302013422817 2.1593027591349743 -1.2073508182355224e-11 2.3657718120805376 2.0782065622669652 -1.0867584492746455e-11 2.1294742729306488 2.0511744966442955 -9.4190489365891794e-12 1.8456375838926176 2.0782065622669652 -7.9705133804319053e-12 1.5618008948545863 2.1593027591349743 -6.7645896908231397e-12 1.3255033557046982 2.2944630872483223 -5.801277867762881e-12 1.136744966442953 2.4799589858314692 -5.1114990314975126e-12 1.0015846383296048 2.7120618941088739 -4.6976317297382911e-12 0.92048844146159592 2.9907718120805371 -4.5596759624852165e-12 0.89345637583892623 3.266685309470545 -4.6976317297382911e-12 0.92048844146159603 3.4959917971662939 -5.1114990314975118e-12 1.0015846383296048 3.6786912751677852 -5.801277867762881e-12 1.136744966442953 3.8115212527964211 -6.7645896908231381e-12 1.325503355704698 3.8912192393736023 -7.9705133804319053e-12 1.5618008948545863 3.9177852348993287 -9.4190489365891794e-12 1.8456375838926176 3.8912192393736027 -1.0877098683591497e-11 2.1313385533184195 3.8115212527964211 -1.2083022373200261e-11 2.3676360924683073 3.6786912751677852 -1.3036820005415478e-11 2.5545302013422817 3.4959917971662939 -1.3738491580237149e-11 2.6920208799403431 3.2666853094705446 -1.4159494525130149e-11 2.7745152870991796 2.9907718120805371 -1.4299828840094483e-11 2.8020134228187921 2.2124347501864285 -2.2246556743413793e-11 4.3591536167039528 2.2809470544369876 -2.1268973634085974e-11 4.1675988068605525 2.3951342281879193 -2.0486431437081466e-11 4.0142617449664426 2.5545302013422817 -1.9915579986379093e-11 3.9024049217002243 2.7530760626398205 -1.9573069115957669e-11 3.8352908277404922 2.9907718120805371 -1.9458898825817193e-11 3.8129194630872485 3.2233407904548845 -1.9573069115957669e-11 3.8352908277404922 3.4176920208799406 -1.991557998637909e-11 3.9024049217002235 3.5738255033557049 -2.0486431437081466e-11 4.0142617449664426 3.688012677106637 -2.1268973634085974e-11 4.1675988068605525 3.7565249813571961 -2.2246556743413786e-11 4.359153616703952 3.7793624161073827 -2.3419180765064916e-11 4.5889261744966445 3.7565249813571961 -2.4589426239004788e-11 4.8182326621923952 3.6880126771066366 -2.5559873705198819e-11 5.0083892617449663 3.5738255033557049 -2.6330523163647027e-11 5.1593959731543624 3.4176920208799406 -2.69013746143494e-11 5.2712527964205824 3.2233407904548845 -2.7243885484770828e-11 5.3383668903803132 2.9907718120805371 -2.73580557749113e-11 5.3607382550335574 2.7530760626398214 -2.7243885484770828e-11 5.3383668903803132 2.5545302013422817 -2.6901374614349397e-11 5.2712527964205806 2.3951342281879193 -2.6330523163647027e-11 5.1593959731543624 2.2809470544369876 -2.5550359514353783e-11 5.0065249813571961 2.2124347501864281 -2.4579912048159743e-11 4.8163683818046232 2.1895973154362416 -2.3419180765064916e-11 4.5889261744966445</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 0 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 48 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 72 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 96</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 3</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">3 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 48 72 96</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CatmullClark.complex.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-7.5 -7.5 -2.5 -7.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -7.5 -2.5 -7.5 -7.5 2.5 -7.5 -2.5 2.5 -2.5 -7.5 2.5 -2.5 -2.5 2.5 -6.25 -3.75 2.5 -3.75 -3.75 2.5 -4.140625 -6.25 2.109375 -5 -6.25 2.421875 -5.859375 -6.25 2.109375 -6.171875 -6.25 1.25 -5.859375 -6.25 0.390625 -6.25 -3.75 0 -4.453125 -6.25 1.796875 -5 -6.25 1.8359375 -4.53125 -6.25 2.34375 -3.90625 -6.25 1.71875 -3.828125 -6.25 1.25 -4.4140625 -6.25 1.25 -5 -6.25 1.25 -4.453125 -6.25 0.703125 -3.90625 -6.25 0.78125 -4.140625 -6.25 0.390625 -4.53125 -6.25 0.15625 -5 -6.25 0.078125 -5 -6.25 0.6640625 -5.546875 -6.25 0.703125 -5.46875 -6.25 0.15625 -6.09375 -6.25 0.78125 -5.5859375 -6.25 1.25 -5.546875 -6.25 1.796875 -6.09375 -6.25 1.71875 -5.46875 -6.25 2.34375 -3.75 -3.75 0 -0.3927343749999998 4.3211172733146048 5.9375 -1.2512499999999995 2.968223212840102 2.5 -2.1097656249999996 2.6989434388508773 -0.9375 5 5 -2.5 0.0050000000000000001 5 7.5 -0.70492187500000036 5.677800194930664 4.6875 -0.66589843750000011 5 4.84375 -0.080546875000000018 5 7.1875 -0.15859375000000012 5.27198610337605 6.875 -0.3927343750000003 5.6788827266853943 5.9375 -0.78296875000000066 6.355600389861328 4.375 -1.2512500000000011 7.0317767871598971 2.5 -1.2512500000000006 6.0158883935799476 2.5 -1.2512500000000002 4.9999999999999982 2.5 -1.7975781250000009 6.2185248064185714 0.3125 -1.7195312500000013 7.4370496128371455 0.625 -2.1097656250000014 7.3010565611491209 -0.9375 -2.3439062500000012 6.3534353263518666 -1.875 -2.4219531250000008 4.9999999999999982 -2.1875 -1.8366015625000005 4.9999999999999982 0.15625 -1.797578125 3.7814751935814255 0.3125 -2.3439062500000003 3.6465646736481307 -1.875 -1.7195312499999997 2.5629503871628527 0.625 -1.25125 3.9841116064200506 2.5 -0.70492187499999981 4.3221998050693351 4.6875 -0.78296874999999966 3.6443996101386711 4.375 -0.15859374999999992 4.72801389662395 6.875 6.5450849718747373 -9.7552825814757682 5 6.5450849718747373 -9.7552825814757682 0 10 -5 0 10 -5 5 0.95491502812526363 -7.9389262614623668 5 0.95491502812526363 -7.9389262614623668 0 1.8283790818361174 -1.7772680635355407 4.21875 1.1296078388674329 -2.0043126035372163 2.5 1.8283790818361174 -1.7772680635355407 0.78125 4.9728496751951967 -0.75556763352800149 3.59375 3.7499999999999991 -1.1528955785309334 3.671875 3.7499999999999991 -1.1528955785309334 4.84375 4.7981568644530252 -0.81232876852842029 4.6875 5.6716209181638817 -0.52852309352632609 4.21875 6.1956993503903943 -0.35823968852506949 3.4375 6.3703921611325658 -0.30147855352465064 2.5 5.060196080566282 -0.72718706602779215 2.5 3.7499999999999991 -1.1528955785309334 2.5 4.9728496751951976 -0.75556763352800149 1.40625 6.1956993503903943 -0.35823968852506949 1.5625 5.6716209181638808 -0.52852309352632609 0.78125 4.7981568644530252 -0.81232876852842029 0.3125 3.7499999999999991 -1.1528955785309334 0.15625 3.7499999999999991 -1.1528955785309334 1.328125 2.5271503248048015 -1.5502235235338653 1.40625 2.7018431355469725 -1.4934623885334464 0.3125 1.3043006496096039 -1.9475514685367972 1.5625 2.4398039194337162 -1.5786040910340746 2.5 2.5271503248048015 -1.5502235235338653 3.59375 1.3043006496096039 -1.9475514685367972 3.4375 2.7018431355469725 -1.4934623885334464 4.6875 6.2114513913084544 -8.728464003118086 -5 8.1312130332518251 -7.2749594329021159 -5 8.9203390537108547 -5 -5 1.8283790818361183 -7.3043174797574721 -5 3.8039830473144578 -8.68096168546281 -5 1.8283790818361176 -2.6956825202425301 -5 1.1296078388674338 -5.0000000000000009 -5 6.2114513913084526 -1.2715359968819149 -5 3.8039830473144565 -1.3190383145371913 -5 8.1312130332518251 -2.7250405670978841 -5 5.8251801483397703 -7.539643357749144 -5 6.6920154219969987 -6.2293211621217566 -5 7.2753602966795397 -8.1557345047637533 -5 5.0140890537108556 -8.8904660701293459 -5 4.3537076182861432 -6.9890834234025228 -5 5 -5 -5 2.8396503248048024 -6.5695859143918796 -5 2.7018431355469739 -8.1391718287837591 -5 1.3043006496096052 -6.2156196180492262 -5 2.9085539194337167 -5 -5 2.8396503248048024 -3.4304140856081213 -5 1.3043006496096046 -3.784380381950776 -5 2.701843135546973 -1.8608281712162422 -5 4.3537076182861432 -3.0109165765974781 -5 5.8251801483397694 -2.4603566422508569 -5 5.0140890537108547 -1.1095339298706559 -5 7.2753602966795388 -1.8442654952362472 -5 6.6920154219969978 -3.7706788378782434 -5 7.6703390537108556 -5 -5 8.704406864453027 -3.8111793546310579 -5 8.704406864453027 -6.1888206453689421 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 28 29 30 24 32 33 34 35 36 37 31 39 40 41 38 43 44 45 42 47 48 49 46 51 52 53 50 55 56 57 54 59 60 61 58 63 64 65 62 67 68 69 66 71 72 73 70 75 76 77 74 79 80 81 78 83 84 85 82 87 88 89 86 91 92 93 90 95 96 97 94 99 100 101 98 103 104 105 106 107 108 102 110 111 112 109 114 115 116 117 118 119 113</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 31 38 42 46 50 54 58 62 66 70 74 78 82 86 90 94 98 102 109 113</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">3 0 1 2 1 0 4 5 4 0 3 6 6 3 2 7 2 1 5 7 5 4 6 7 12 8 9 10 18 11 35 15 8 12 34 13 31 14 16 17 11 18 16 18 10 19 16 19 20 21 16 21 22 17 23 21 20 24 23 24 25 26 23 26 27 28 23 28 22 21 29 28 27 30 29 30 14 31 29 31 13 32 29 32 22 28 33 32 13 34 33 34 12 35 33 35 11 17 33 17 22 32 10 9 36 25 24 20 19 36 9 8 15 25 36 15 14 30 27 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0.8125 0.1875 0.9375 0.625 0.125 0.875 0.5 0 1 0.75 0 1 0.8125 0.1875 0.9375 0.75 0 1 1 0 1 1 0.25 1 0.8125 0.1875 0.9375 1 0.25 1 1 0.5 1 0.875 0.375 0.875 0.8125 0.1875 0.9375 0.875 0.375 0.875 0.75 0.25 0.75 0.625 0.125 0.875 0.9375 0.5625 0.8125 0.875 0.375 0.875 1 0.5 1 1 0.75 1 0.9375 0.5625 0.8125 1 0.75 1 1 1 1 1 0.75 0.75 0.9375 0.5625 0.8125 1 0.75 0.75 1 0.5 0.5 0.875 0.375 0.625 0.9375 0.5625 0.8125 0.875 0.375 0.625 0.75 0.25 0.75 0.875 0.375 0.875 0.8125 0.1875 0.4375 0.875 0.375 0.625 1 0.5 0.5 1 0.25 0.25 0.8125 0.1875 0.4375 1 0.25 0.25 1 0 0 0.75 0 0.25 0.8125 0.1875 0.4375 0.75 0 0.25 0.5 0 0.5 0.625 0.125 0.625 0.8125 0.1875 0.4375 0.625 0.125 0.625 0.75 0.25 0.75 0.875 0.375 0.625 0.4375 0.0625 0.8125 0.625 0.125 0.625 0.5 0 0.5 0.25 0 0.75 0.4375 0.0625 0.8125 0.25 0 0.75 0 0 1 0.25 0 1 0.4375 0.0625 0.8125 0.25 0 1 0.5 0 1 0.625 0.125 0.875 0.4375 0.0625 0.8125 0.625 0.125 0.875 0.75 0.25 0.75 0.625 0.125 0.625 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 4 5 6 0 8 9 10 7 12 13 14 11 16 17 18 15 20 21 22 19 24 25 26 23 28 29 30 27 32 33 34 31 36 37 38 35 40 41 42 39 44 45 46 43 48 49 50 47 52 53 54 51 56 57 58 55 60 61 62 59 64 65 66 63 68 69 70 67 72 73 74 75 76 77 71 79 80 81 82 83 78 85 86 87 88 89 84</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 7 11 15 19 23 27 31 35 39 43 47 51 55 59 63 67 71 78 84</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">41 37 62 38 59 39 40 42 43 44 45 42 45 46 47 42 47 48 49 42 49 50 43 51 49 48 52 51 52 53 54 51 54 55 56 51 56 50 49 57 56 55 58 57 58 39 59 57 59 38 60 57 60 50 56 61 60 38 62 61 62 37 63 61 63 44 43 61 43 50 60 46 41 40 53 52 48 47 41 46 45 44 63 37 40 39 58 55 54 53\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0.8125 0.1875 0.9375 0.625 0.125 0.875 0.5 0 1 0.75 0 1 0.8125 0.1875 0.9375 0.75 0 1 1 0 1 1 0.25 1 0.8125 0.1875 0.9375 1 0.25 1 1 0.5 1 0.875 0.375 0.875 0.8125 0.1875 0.9375 0.875 0.375 0.875 0.75 0.25 0.75 0.625 0.125 0.875 0.9375 0.5625 0.8125 0.875 0.375 0.875 1 0.5 1 1 0.75 1 0.9375 0.5625 0.8125 1 0.75 1 1 1 1 1 0.75 0.75 0.9375 0.5625 0.8125 1 0.75 0.75 1 0.5 0.5 0.875 0.375 0.625 0.9375 0.5625 0.8125 0.875 0.375 0.625 0.75 0.25 0.75 0.875 0.375 0.875 0.8125 0.1875 0.4375 0.875 0.375 0.625 1 0.5 0.5 1 0.25 0.25 0.8125 0.1875 0.4375 1 0.25 0.25 1 0 0 0.75 0 0.25 0.8125 0.1875 0.4375 0.75 0 0.25 0.5 0 0.5 0.625 0.125 0.625 0.8125 0.1875 0.4375 0.625 0.125 0.625 0.75 0.25 0.75 0.875 0.375 0.625 0.4375 0.0625 0.8125 0.625 0.125 0.625 0.5 0 0.5 0.25 0 0.75 0.4375 0.0625 0.8125 0.25 0 0.75 0 0 1 0.25 0 1 0.4375 0.0625 0.8125 0.25 0 1 0.5 0 1 0.625 0.125 0.875 0.4375 0.0625 0.8125 0.625 0.125 0.875 0.75 0.25 0.75 0.625 0.125 0.625 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 0 0 1 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 12 13 14 8 16 17 18 15 20 21 22 19 24 25 26 23 28 29 30 27 32 33 34 31 36 37 38 35 40 41 42 39 44 45 46 43 48 49 50 47 52 53 54 51 56 57 58 55 60 61 62 59 64 65 66 63 68 69 70 67 72 73 74 71 76 77 78 75 80 81 82 83 84 85 79 87 88 89 90 91 92 86 94 95 96 97 98 99 93 101 102 103 104 105 106 100 108 109 110 111 112 113 114 115 116 107 118 119 120 121 122 123 117 125 126 127 128 129 130 131 124 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 15 19 23 27 31 35 39 43 47 51 55 59 63 67 71 75 79 86 93 100 107 117 124 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">67 64 65 66 64 68 69 65 68 70 93 71 90 72 69 73 74 75 76 73 76 77 78 73 78 79 80 73 80 81 74 82 80 79 83 82 83 84 85 82 85 86 87 82 87 81 80 88 87 86 89 88 89 72 90 88 90 71 91 88 91 81 87 92 91 71 93 92 93 70 94 92 94 75 74 92 74 81 91 77 67 66 84 83 79 78 66 65 95 107 96 125 97 65 69 98 112 99 108 95 69 72 100 116 101 113 98 72 89 86 85 84 102 120 103 117 100 84 66 97 124 104 121 102 67 77 76 75 94 70 68 64 105 106 96 107 105 107 95 108 105 108 99 109 105 109 110 106 111 109 99 112 111 112 98 113 111 113 101 114 111 114 110 109 115 114 101 116 115 116 100 117 115 117 103 118 115 118 110 114 119 118 103 120 119 120 102 121 119 121 104 122 119 122 110 118 123 122 104 124 123 124 97 125 123 125 96 106 123 106 110 122\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0.625 0.75 1 0.5 0.75 1 0.5 1 1 0.75 1 1 0.625 0.75 1 0.75 1 1 1 1 1 0.75 0.75 1 0.625 0.75 1 0.75 0.75 1 0.5 0.5 1 0.5 0.5 1 0.625 0.75 1 0.5 0.5 1 0.5 0.5 1 0.5 0.75 1 0.375 0.25 1 0.5 0.5 1 0.5 0.5 1 0.25 0.25 1 0.375 0.25 1 0.25 0.25 1 0 0 1 0.25 0 1 0.375 0.25 1 0.25 0 1 0.5 0 1 0.5 0.25 1 0.375 0.25 1 0.5 0.25 1 0.5 0.5 1 0.5 0.5 1 0.625 0.25 1 0.5 0.25 1 0.5 0 1 0.75 0 1 0.625 0.25 1 0.75 0 1 1 0 1 0.75 0.25 1 0.625 0.25 1 0.75 0.25 1 0.5 0.5 1 0.5 0.5 1 0.625 0.25 1 0.5 0.5 1 0.5 0.5 1 0.5 0.25 1 0.375 0.75 1 0.5 0.5 1 0.5 0.5 1 0.25 0.75 1 0.375 0.75 1 0.25 0.75 1 0 1 1 0.25 1 1 0.375 0.75 1 0.25 1 1 0.5 1 1 0.5 0.75 1 0.375 0.75 1 0.5 0.75 1 0.5 0.5 1 0.5 0.5 0 1 0 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0.27500000000000002 0.22500000000000001 0.94999999999999996 0.30000000000000004 0.45000000000000001 0.90000000000000002 0 0.5 1 0 0.25 1 0.27500000000000002 0.22500000000000001 0.94999999999999996 0 0.25 1 0 0 1 0.25 0 1 0.27500000000000002 0.22500000000000001 0.94999999999999996 0.25 0 1 0.5 0 1 0.55000000000000004 0.20000000000000001 0.90000000000000002 0.27500000000000002 0.22500000000000001 0.94999999999999996 0.55000000000000004 0.20000000000000001 0.90000000000000002 0.60000000000000009 0.40000000000000002 0.80000000000000004 0.30000000000000004 0.45000000000000001 0.90000000000000002 0.77500000000000002 0.22500000000000001 0.94999999999999996 0.55000000000000004 0.20000000000000001 0.90000000000000002 0.5 0 1 0.75 0 1 0.77500000000000002 0.22500000000000001 0.94999999999999996 0.75 0 1 1 0 1 1 0.25 1 0.77500000000000002 0.22500000000000001 0.94999999999999996 1 0.25 1 1 0.5 1 0.80000000000000004 0.45000000000000001 0.90000000000000002 0.77500000000000002 0.22500000000000001 0.94999999999999996 0.80000000000000004 0.45000000000000001 0.90000000000000002 0.60000000000000009 0.40000000000000002 0.80000000000000004 0.55000000000000004 0.20000000000000001 0.90000000000000002 0.90000000000000002 0.59999999999999998 0.82499999999999996 0.80000000000000004 0.45000000000000001 0.90000000000000002 1 0.5 1 1 0.75 1 0.90000000000000002 0.59999999999999998 0.82499999999999996 1 0.75 1 1 1 1 1 0.75 0.75 0.90000000000000002 0.59999999999999998 0.82499999999999996 1 0.75 0.75 1 0.5 0.5 0.80000000000000004 0.45000000000000001 0.65000000000000002 0.90000000000000002 0.59999999999999998 0.82499999999999996 0.80000000000000004 0.45000000000000001 0.65000000000000002 0.60000000000000009 0.40000000000000002 0.80000000000000004 0.80000000000000004 0.45000000000000001 0.90000000000000002 0.77500000000000002 0.34999999999999998 0.45000000000000001 0.80000000000000004 0.45000000000000001 0.65000000000000002 1 0.5 0.5 1 0.25 0.25 0.77500000000000002 0.34999999999999998 0.45000000000000001 1 0.25 0.25 1 0 0 0.75 0.25 0.25 0.77500000000000002 0.34999999999999998 0.45000000000000001 0.75 0.25 0.25 0.5 0.5 0.5 0.55000000000000004 0.45000000000000001 0.65000000000000002 0.77500000000000002 0.34999999999999998 0.45000000000000001 0.55000000000000004 0.45000000000000001 0.65000000000000002 0.60000000000000009 0.40000000000000002 0.80000000000000004 0.80000000000000004 0.45000000000000001 0.65000000000000002 0.27500000000000002 0.59999999999999998 0.82499999999999996 0.55000000000000004 0.45000000000000001 0.65000000000000002 0.5 0.5 0.5 0.25 0.75 0.75 0.27500000000000002 0.59999999999999998 0.82499999999999996 0.25 0.75 0.75 0 1 1 0 0.75 1 0.27500000000000002 0.59999999999999998 0.82499999999999996 0 0.75 1 0 0.5 1 0.30000000000000004 0.45000000000000001 0.90000000000000002 0.27500000000000002 0.59999999999999998 0.82499999999999996 0.30000000000000004 0.45000000000000001 0.90000000000000002 0.60000000000000009 0.40000000000000002 0.80000000000000004 0.55000000000000004 0.45000000000000001 0.65000000000000002</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CatmullClark.cube.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 2.5 0 0 1.875 1.875 1.3888888888888888 1.3888888888888888 1.3888888888888888 1.875 1.875 0 1.3888888888888888 1.3888888888888888 -1.3888888888888888 0 1.875 -1.875 -1.3888888888888888 1.3888888888888888 -1.3888888888888888 -1.875 1.875 0 -1.3888888888888888 1.3888888888888888 1.3888888888888888 2.5 0 0 1.875 0 1.875 1.3888888888888888 -1.3888888888888888 1.3888888888888888 1.875 -1.875 0 1.3888888888888888 -1.3888888888888888 -1.3888888888888888 1.875 0 -1.875 0 -2.5 0 0 -1.875 1.875 -1.3888888888888888 -1.3888888888888888 1.3888888888888888 -1.875 -1.875 0 -1.3888888888888888 -1.3888888888888888 -1.3888888888888888 0 -1.875 -1.875 -2.5 0 0 -1.875 0 1.875 -1.875 0 -1.875 0 0 2.5 0 0 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">2 0 0 1 1 3 1 1 0 2 0 0 2 1 3 2 1 0 2 2 4 2 0 3 0 4</array>\n\t\t\t<array name=\"points\" type=\"k3d::point3\">0 2.5 0 0 1.875 1.875 1.3888888888888888 1.3888888888888888 1.3888888888888888 1.875 1.875 0 1.3888888888888888 1.3888888888888888 -1.3888888888888888 0 1.875 -1.875 -1.3888888888888888 1.3888888888888888 -1.3888888888888888 -1.875 1.875 0 -1.3888888888888888 1.3888888888888888 1.3888888888888888 2.5 0 0 1.875 0 1.875 1.3888888888888888 -1.3888888888888888 1.3888888888888888 1.875 -1.875 0 1.3888888888888888 -1.3888888888888888 -1.3888888888888888 1.875 0 -1.875 0 -2.5 0 0 -1.875 1.875 -1.3888888888888888 -1.3888888888888888 1.3888888888888888 -1.875 -1.875 0 -1.3888888888888888 -1.3888888888888888 -1.3888888888888888 0 -1.875 -1.875 -2.5 0 0 -1.875 0 1.875 -1.875 0 -1.875 0 0 2.5 0 0 -2.5</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 3 0 3 4 5 0 5 6 7 0 7 8 1 9 10 11 12 9 12 13 14 9 14 4 3 9 3 2 10 15 16 17 18 15 18 19 20 15 20 13 12 15 12 11 16 21 22 8 7 21 7 6 23 21 23 19 18 21 18 17 22 24 1 8 22 24 22 17 16 24 16 11 10 24 10 2 1 25 5 4 14 25 14 13 20 25 20 19 23 25 23 6 5\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 1 0 1 2 2 0 2 3 1 0 1 0 0 4 4 5 5 4 5 6 6 4 6 7 5 4 5 4 4 8 8 9 9 8 9 10 10 8 10 11 9 8 9 8 8 12 12 13 13 12 13 14 14 12 14 15 13 12 13 12 12 16 16 17 17 16 17 18 18 16 18 19 17 16 17 16 16 20 20 21 21 20 21 22 22 20 22 23 21 20 21 20 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 1 0 1 2 2 0 2 3 1 0 1 0 0 4 4 5 5 4 5 6 6 4 6 7 5 4 5 4 4 8 8 9 9 8 9 10 10 8 10 11 9 8 9 8 8 12 12 13 13 12 13 14 14 12 14 15 13 12 13 12 12 16 16 17 17 16 17 18 18 16 18 19 17 16 17 16 16 20 20 21 21 20 21 22 22 20 22 23 21 20 21 20 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CatmullClark.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>4 4 0 4 5 0 3 5 0 3 4 0 3 3 0 4 3 0 5 3 0 5 4 0 4.75 4.75 0 2 4 0 2 5 0 1 5 0 1 4 0 1 3 0 2 3 0 0 4 0 0 5 0 -1 5 0 -1 4 0 -1 3 0 0 3 0 -2 4 0 -2 5 0 -3 5 0 -3 4 0 -3 3 0 -2 3 0 -4 4 0 -4 5 0 -4.75 4.75 0 -5 4 0 -5 3 0 -4 3 0 4 2 0 3 2 0 3 1 0 4 1 0 5 1 0 5 2 0 2 2 0 1 2 0 1 1 0 2 1 0 0 2 0 -1 2 0 -1 1 0 0 1 0 -2 2 0 -3 2 0 -3 1 0 -2 1 0 -4 2 0 -5 2 0 -5 1 0 -4 1 0 4 0 0 3 0 0 3 -1 0 4 -1 0 5 -1 0 5 0 0 2 0 0 1 0 0 1 -1 0 2 -1 0 0 0 0 -1 0 0 -1 -1 0 0 -1 0 -2 0 0 -3 0 0 -3 -1 0 -2 -1 0 -4 0 0 -5 0 0 -5 -1 0 -4 -1 0 4 -2 0 3 -2 0 3 -3 0 4 -3 0 5 -3 -0 5 -2 -0 2 -2 0 1 -2 0 1 -3 0 2 -3 0 0 -2 0 -1 -2 0 -1 -3 0 0 -3 0 -2 -2 0 -3 -2 0 -3 -3 0 -2 -3 0 -4 -2 0 -5 -2 0 -5 -3 0 -4 -3 0 4 -4 0 3 -4 0 3 -5 -0 4 -5 -0 4.75 -4.75 -0 5 -4 -0 2 -4 0 1 -4 0 1 -5 0 2 -5 -0 0 -4 0 -1 -4 0 -1 -5 0 0 -5 0 -2 -4 0 -3 -4 0 -3 -5 0 -2 -5 0 -4 -4 0 -5 -4 0 -4.75 -4.75 0 -4 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">2 0 0 1 3 5 5 3 0 3 1 1 3 4 5 4 2 1 4 4 7 5 3 3 5 6 7 6 4 4 7 9 9 8 8 7 11 11 9 9 9 9 11 10 9 11 13 11 11 12 13 12 13 15 15 14 13 14 17 17 15 15 15 16 17 16 16 17 19 17 17 19 19 18 19 21 21 20 20 20 23 23 21 21 21 22 23 22 21 22 25 23 23 23 25 24 25 27 27 26 25 29 30 28 27 27 27 31 31 28 28 32 32 29 29 33 33 30 31 32 34</array>\n\t\t\t<array name=\"points\" type=\"k3d::point3\">4 4 0 4 5 0 3 5 0 3 4 0 3 3 0 4 3 0 5 3 0 5 4 0 4.75 4.75 0 2 4 0 2 5 0 1 5 0 1 4 0 1 3 0 2 3 0 0 4 0 0 5 0 -1 5 0 -1 4 0 -1 3 0 0 3 0 -2 4 0 -2 5 0 -3 5 0 -3 4 0 -3 3 0 -2 3 0 -4 4 0 -4 5 0 -4.75 4.75 0 -5 4 0 -5 3 0 -4 3 0 4 2 0 3 2 0 3 1 0 4 1 0 5 1 0 5 2 0 2 2 0 1 2 0 1 1 0 2 1 0 0 2 0 -1 2 0 -1 1 0 0 1 0 -2 2 0 -3 2 0 -3 1 0 -2 1 0 -4 2 0 -5 2 0 -5 1 0 -4 1 0 4 0 0 3 0 0 3 -1 0 4 -1 0 5 -1 0 5 0 0 2 0 0 1 0 0 1 -1 0 2 -1 0 0 0 0 -1 0 0 -1 -1 0 0 -1 0 -2 0 0 -3 0 0 -3 -1 0 -2 -1 0 -4 0 0 -5 0 0 -5 -1 0 -4 -1 0 4 -2 0 3 -2 0 3 -3 0 4 -3 0 5 -3 0 5 -2 0 2 -2 0 1 -2 0 1 -3 0 2 -3 0 0 -2 0 -1 -2 0 -1 -3 0 0 -3 0 -2 -2 0 -3 -2 0 -3 -3 0 -2 -3 0 -4 -2 0 -5 -2 0 -5 -3 0 -4 -3 0 4 -4 0 3 -4 0 3 -5 0 4 -5 0 4.75 -4.75 0 5 -4 0 2 -4 0 1 -4 0 1 -5 0 2 -5 0 0 -4 0 -1 -4 0 -1 -5 0 0 -5 0 -2 -4 0 -3 -4 0 -3 -5 0 -2 -5 0 -4 -4 0 -5 -4 0 -4.75 -4.75 0 -4 -5 0</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 3 0 3 4 5 0 5 6 7 0 7 8 1 9 10 11 12 9 12 13 14 9 14 4 3 9 3 2 10 15 16 17 18 15 18 19 20 15 20 13 12 15 12 11 16 21 22 23 24 21 24 25 26 21 26 19 18 21 18 17 22 27 28 29 30 27 30 31 32 27 32 25 24 27 24 23 28 33 5 4 34 33 34 35 36 33 36 37 38 33 38 6 5 39 14 13 40 39 40 41 42 39 42 35 34 39 34 4 14 43 20 19 44 43 44 45 46 43 46 41 40 43 40 13 20 47 26 25 48 47 48 49 50 47 50 45 44 47 44 19 26 51 32 31 52 51 52 53 54 51 54 49 48 51 48 25 32 55 36 35 56 55 56 57 58 55 58 59 60 55 60 37 36 61 42 41 62 61 62 63 64 61 64 57 56 61 56 35 42 65 46 45 66 65 66 67 68 65 68 63 62 65 62 41 46 69 50 49 70 69 70 71 72 69 72 67 66 69 66 45 50 73 54 53 74 73 74 75 76 73 76 71 70 73 70 49 54 77 58 57 78 77 78 79 80 77 80 81 82 77 82 59 58 83 64 63 84 83 84 85 86 83 86 79 78 83 78 57 64 87 68 67 88 87 88 89 90 87 90 85 84 87 84 63 68 91 72 71 92 91 92 93 94 91 94 89 88 91 88 67 72 95 76 75 96 95 96 97 98 95 98 93 92 95 92 71 76 99 80 79 100 99 100 101 102 99 102 103 104 99 104 81 80 105 86 85 106 105 106 107 108 105 108 101 100 105 100 79 86 109 90 89 110 109 110 111 112 109 112 107 106 109 106 85 90 113 94 93 114 113 114 115 116 113 116 111 110 113 110 89 94 117 98 97 118 117 118 119 120 117 120 115 114 117 114 93 98\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 1 0 1 2 2 0 2 3 1 0 1 0 0 4 4 5 5 4 5 6 6 4 6 7 5 4 5 4 4 8 8 9 9 8 9 10 10 8 10 11 9 8 9 8 8 12 12 13 13 12 13 14 14 12 14 15 13 12 13 12 12 16 16 17 17 16 17 18 18 16 18 19 17 16 17 16 16 20 20 21 21 20 21 22 22 20 22 23 21 20 21 20 20 24 24 25 25 24 25 26 26 24 26 27 25 24 25 24 24 28 28 29 29 28 29 30 30 28 30 31 29 28 29 28 28 32 32 33 33 32 33 34 34 32 34 35 33 32 33 32 32 36 36 37 37 36 37 38 38 36 38 39 37 36 37 36 36 40 40 41 41 40 41 42 42 40 42 43 41 40 41 40 40 44 44 45 45 44 45 46 46 44 46 47 45 44 45 44 44 48 48 49 49 48 49 50 50 48 50 51 49 48 49 48 48 52 52 53 53 52 53 54 54 52 54 55 53 52 53 52 52 56 56 57 57 56 57 58 58 56 58 59 57 56 57 56 56 60 60 61 61 60 61 62 62 60 62 63 61 60 61 60 60 64 64 65 65 64 65 66 66 64 66 67 65 64 65 64 64 68 68 69 69 68 69 70 70 68 70 71 69 68 69 68 68 72 72 73 73 72 73 74 74 72 74 75 73 72 73 72 72 76 76 77 77 76 77 78 78 76 78 79 77 76 77 76 76 80 80 81 81 80 81 82 82 80 82 83 81 80 81 80 80 84 84 85 85 84 85 86 86 84 86 87 85 84 85 84 84 88 88 89 89 88 89 90 90 88 90 91 89 88 89 88 88 92 92 93 93 92 93 94 94 92 94 95 93 92 93 92 92 96 96 97 97 96 97 98 98 96 98 99 97 96 97 96 96</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8 9 9 9 9 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15 15 15 16 16 16 16 17 17 17 17 18 18 18 18 19 19 19 19 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24 24 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 1 0 1 2 2 0 2 3 1 0 1 0 0 4 4 5 5 4 5 6 6 4 6 7 5 4 5 4 4 8 8 9 9 8 9 10 10 8 10 11 9 8 9 8 8 12 12 13 13 12 13 14 14 12 14 15 13 12 13 12 12 16 16 17 17 16 17 18 18 16 18 19 17 16 17 16 16 20 20 21 21 20 21 22 22 20 22 23 21 20 21 20 20 24 24 25 25 24 25 26 26 24 26 27 25 24 25 24 24 28 28 29 29 28 29 30 30 28 30 31 29 28 29 28 28 32 32 33 33 32 33 34 34 32 34 35 33 32 33 32 32 36 36 37 37 36 37 38 38 36 38 39 37 36 37 36 36 40 40 41 41 40 41 42 42 40 42 43 41 40 41 40 40 44 44 45 45 44 45 46 46 44 46 47 45 44 45 44 44 48 48 49 49 48 49 50 50 48 50 51 49 48 49 48 48 52 52 53 53 52 53 54 54 52 54 55 53 52 53 52 52 56 56 57 57 56 57 58 58 56 58 59 57 56 57 56 56 60 60 61 61 60 61 62 62 60 62 63 61 60 61 60 60 64 64 65 65 64 65 66 66 64 66 67 65 64 65 64 64 68 68 69 69 68 69 70 70 68 70 71 69 68 69 68 68 72 72 73 73 72 73 74 74 72 74 75 73 72 73 72 72 76 76 77 77 76 77 78 78 76 78 79 77 76 77 76 76 80 80 81 81 80 81 82 82 80 82 83 81 80 81 80 80 84 84 85 85 84 85 86 86 84 86 87 85 84 85 84 84 88 88 89 89 88 89 90 90 88 90 91 89 88 89 88 88 92 92 93 93 92 93 94 94 92 94 95 93 92 93 92 92 96 96 97 97 96 97 98 98 96 98 99 97 96 97 96 96</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CenterPoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CollapseEdges.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 3 5 0 1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 3 1 0 -3 1 0 -5 1 0 3 -1 -0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 -3 -3 0 -5 -3 0 -3 -5 0 -5 -5 0 0 3 0 -4 3 0 0 1 0 5 0 0 0 -1 0 0 -3 0 4 -5 0 0 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 13 16 17 19 22 23 24 25 28 29 34 35 8 8 12 15 20 24 30 32</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 8 12 13 14 11 16 17 15 19 20 21 18 23 24 25 22 27 28 29 26 31 32 30 34 35 33 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 64 68 69 70 67 72 73 74 71 76 77 78 75</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 11 15 18 22 26 30 33 36 40 44 48 52 56 60 64 67 71 75</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 20 7 2 3 20 3 4 21 20 4 5 21 6 7 8 23 7 20 22 8 20 21 9 22 21 10 9 23 8 11 8 22 24 11 22 9 12 24 9 10 13 12 23 11 15 14 11 24 25 15 24 12 16 25 12 13 17 16 14 15 26 15 25 27 26 25 16 18 27 16 17 19 18\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 19 20 21 22 23 24 25 26 27 32 33 34 35 37 38 39 40 41 42 44 45 46 47 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 8 9 10 11 13 14 15 16 18 19 20 21 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 19 20 21 22 23 24 25 26 27 32 33 34 35 37 38 39 40 41 42 44 45 46 47 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CollapseFaces.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1 5 0 -1 5 0 -3 5 0 -5 5 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 1 1 0 -5 1 0 5 -1 -0 3 -1 -0 5 -3 -0 3 -3 -0 5 -5 -0 3 -5 -0 1 -5 -0 4 4 0 -2 -2 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">2 3 4 5 8 9 10 11 12 13 14 17 18 19 24 25 30 31 32 2 17</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 6 3 8 9 10 7 12 13 14 11 16 17 15 19 20 21 18 23 24 25 22 27 28 26 30 31 32 29 34 35 36 33 38 39 40 37 42 43 44 41 46 47 45 49 50 51 48 53 54 55 52</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 7 11 15 18 22 26 29 33 37 41 45 48 52</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">19 0 4 0 1 5 4 1 2 6 5 2 3 7 6 19 9 8 19 4 10 9 4 5 20 10 5 6 20 6 7 11 20 8 9 13 12 9 10 20 13 12 13 15 14 13 20 15 14 15 17 16 15 20 18 17\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 60 61 62 63 64 66 67 80 81 82 83 84 85 86 87</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">1 2 3 4 5 6 7 8 9 10 11 15 16 20 21</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 60 61 62 63 64 66 67 80 81 82 83 84 85 86 87</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CollapsePoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 3 5 0 1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 -3 1 0 -5 1 0 5 -1 -0 3 -1 -0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 1 -3 -0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0 0 0 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 16 17 18 19 22 23 24 25 26 27 28 29 30 31 32 33 34 35 16</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 28 32 33 34 31 36 37 38 35 40 41 42 39 44 45 43 47 48 46 50 51 52 49 54 55 56 53 58 59 60 57 62 63 61 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 31 35 39 43 46 49 53 57 61 64 68 72 76 80 84 88</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 8 7 2 3 9 8 3 4 10 9 4 5 11 10 6 7 13 12 7 8 32 13 8 9 32 9 10 14 32 10 11 15 14 12 13 17 16 13 32 17 32 14 18 14 15 19 18 16 17 21 20 17 32 22 21 32 23 22 32 18 24 23 18 19 25 24 20 21 27 26 21 22 28 27 22 23 29 28 23 24 30 29 24 25 31 30\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.ConnectVertices.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 24 18 25 16 21 22 23 20 19 17</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 17</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7 0 2\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 17 17</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 17 19</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CreateTrimCurve.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 5 0 -1.666666666666667 5 0 1.6666666666666663 5 0 5 5 0 -5 1.666666666666667 0 -1.666666666666667 1.666666666666667 0 1.6666666666666663 1.666666666666667 0 5 1.666666666666667 0 -5 -1.6666666666666663 0 -1.666666666666667 -1.6666666666666663 0 1.6666666666666663 -1.6666666666666663 0 5 -1.6666666666666663 0 -5 -5 0 -1.666666666666667 -5 0 1.6666666666666663 -5 0 5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<nurbs_patches>\n\t\t\t<patch_first_points>0</patch_first_points>\n\t\t\t<patch_u_point_counts>4</patch_u_point_counts>\n\t\t\t<patch_v_point_counts>4</patch_v_point_counts>\n\t\t\t<patch_u_orders>4</patch_u_orders>\n\t\t\t<patch_v_orders>4</patch_v_orders>\n\t\t\t<patch_u_first_knots>0</patch_u_first_knots>\n\t\t\t<patch_v_first_knots>0</patch_v_first_knots>\n\t\t\t<patch_selection>0</patch_selection>\n\t\t\t<patch_materials>2</patch_materials>\n\t\t\t<patch_points>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15</patch_points>\n\t\t\t<patch_point_weights>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</patch_point_weights>\n\t\t\t<patch_u_knots>0 0 0 0 1 1 1 1</patch_u_knots>\n\t\t\t<patch_v_knots>0 0 0 0 1 1 1 1</patch_v_knots>\n\t\t\t<patch_trim_curve_loop_counts>1</patch_trim_curve_loop_counts>\n\t\t\t<patch_first_trim_curve_loops>0</patch_first_trim_curve_loops>\n\t\t\t<trim_curve_loops>0</trim_curve_loops>\n\t\t\t<trim_points>0.75 0.5 0.75 0.75 0.5 0.75 0.25 0.75 0.25 0.5 0.25 0.25000000000000006 0.49999999999999994 0.25 0.75 0.24999999999999994 0.75 0.49999999999999994</trim_points>\n\t\t\t<trim_point_selection>0 0 0 0 0 0 0 0 0</trim_point_selection>\n\t\t\t<first_trim_curves>0</first_trim_curves>\n\t\t\t<trim_curve_counts>1</trim_curve_counts>\n\t\t\t<trim_curve_loop_selection>0</trim_curve_loop_selection>\n\t\t\t<trim_curve_first_points>0</trim_curve_first_points>\n\t\t\t<trim_curve_point_counts>9</trim_curve_point_counts>\n\t\t\t<trim_curve_orders>3</trim_curve_orders>\n\t\t\t<trim_curve_first_knots>0</trim_curve_first_knots>\n\t\t\t<trim_curve_selection>0</trim_curve_selection>\n\t\t\t<trim_curve_points>0 1 2 3 4 5 6 7 0</trim_curve_points>\n\t\t\t<trim_curve_point_weights>1 0.70710678118654757 1 0.70710678118654757 1 0.70710678118654757 1 0.70710678118654757 1 0.70710678118654757</trim_curve_point_weights>\n\t\t\t<trim_curve_knots>0 0 0 1 1 2 2 3 3 4 4 4</trim_curve_knots>\n\t\t</nurbs_patches>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CylindricalWavePoints.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 3.0616169978683831e-16 -5 5 -5 -6.1232339957367663e-16 5 -9.1848509936051479e-16 5 5 5.3826834323650896 0 4.375 3.295943018134698e-16 -5.3826834323650896 4.375 -5.3826834323650896 -6.591886036269396e-16 4.375 -9.8878290544040934e-16 5.3826834323650896 4.375 5.7071067811865479 0 3.75 3.4945950259861299e-16 -5.7071067811865479 3.75 -5.7071067811865479 -6.9891900519722598e-16 3.75 -1.0483785077958388e-15 5.7071067811865479 3.75 5.923879532511287 0 3.125 3.6273300540122331e-16 -5.923879532511287 3.125 -5.923879532511287 -7.2546601080244663e-16 3.125 -1.0881990162036698e-15 5.923879532511287 3.125 6 0 2.5 3.6739403974420599e-16 -6 2.5 -6 -7.3478807948841197e-16 2.5 -1.1021821192326177e-15 6 2.5 5.923879532511287 0 1.875 3.6273300540122331e-16 -5.923879532511287 1.875 -5.923879532511287 -7.2546601080244663e-16 1.875 -1.0881990162036698e-15 5.923879532511287 1.875 5.7071067811865479 0 1.25 3.4945950259861299e-16 -5.7071067811865479 1.25 -5.7071067811865479 -6.9891900519722598e-16 1.25 -1.0483785077958388e-15 5.7071067811865479 1.25 5.3826834323650896 0 0.625 3.295943018134698e-16 -5.3826834323650896 0.625 -5.3826834323650896 -6.591886036269396e-16 0.625 -9.8878290544040934e-16 5.3826834323650896 0.625 5 0 0 3.0616169978683831e-16 -5 0 -5 -6.1232339957367663e-16 0 -9.1848509936051479e-16 5 0 4.6173165676349104 0 -0.625 2.8272909776020683e-16 -4.6173165676349104 -0.625 -4.6173165676349104 -5.6545819552041366e-16 -0.625 -8.4818729328062034e-16 4.6173165676349104 -0.625 4.2928932188134521 0 -1.25 2.6286389697506364e-16 -4.2928932188134521 -1.25 -4.2928932188134521 -5.2572779395012728e-16 -1.25 -7.8859169092519081e-16 4.2928932188134521 -1.25 4.076120467488713 0 -1.875 2.4959039417245331e-16 -4.076120467488713 -1.875 -4.076120467488713 -4.9918078834490663e-16 -1.875 -7.4877118251735979e-16 4.076120467488713 -1.875 4 0 -2.5 2.4492935982947064e-16 -4 -2.5 -4 -4.8985871965894128e-16 -2.5 -7.3478807948841188e-16 4 -2.5 4.076120467488713 0 -3.125 2.4959039417245331e-16 -4.076120467488713 -3.125 -4.076120467488713 -4.9918078834490663e-16 -3.125 -7.4877118251735979e-16 4.076120467488713 -3.125 4.2928932188134521 0 -3.75 2.6286389697506364e-16 -4.2928932188134521 -3.75 -4.2928932188134521 -5.2572779395012728e-16 -3.75 -7.8859169092519081e-16 4.2928932188134521 -3.75 4.6173165676349104 0 -4.375 2.8272909776020683e-16 -4.6173165676349104 -4.375 -4.6173165676349104 -5.6545819552041366e-16 -4.375 -8.4818729328062034e-16 4.6173165676349104 -4.375 5 0 -5 3.0616169978683831e-16 -5 -5 -5 -6.1232339957367663e-16 -5 -9.1848509936051479e-16 5 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 4 5 9 8 5 6 10 9 6 7 11 10 7 4 8 11 8 9 13 12 9 10 14 13 10 11 15 14 11 8 12 15 12 13 17 16 13 14 18 17 14 15 19 18 15 12 16 19 16 17 21 20 17 18 22 21 18 19 23 22 19 16 20 23 20 21 25 24 21 22 26 25 22 23 27 26 23 20 24 27 24 25 29 28 25 26 30 29 26 27 31 30 27 24 28 31 28 29 33 32 29 30 34 33 30 31 35 34 31 28 32 35 32 33 37 36 33 34 38 37 34 35 39 38 35 32 36 39 36 37 41 40 37 38 42 41 38 39 43 42 39 36 40 43 40 41 45 44 41 42 46 45 42 43 47 46 43 40 44 47 44 45 49 48 45 46 50 49 46 47 51 50 47 44 48 51 48 49 53 52 49 50 54 53 50 51 55 54 51 48 52 55 52 53 57 56 53 54 58 57 54 55 59 58 55 52 56 59 56 57 61 60 57 58 62 61 58 59 63 62 59 56 60 63 60 61 65 64 61 62 66 65 62 63 67 66 63 60 64 67 0 3 2 1 64 65 66 67\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.CylindricalWavePoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 3.0615158845559431e-16 -5 5 -5 -6.1230317691118863e-16 5 -9.1845476536678294e-16 5 5 5.3826834323650896 0 4.375 3.2958341659443659e-16 -5.3826834323650896 4.375 -5.3826834323650896 -6.5916683318887318e-16 4.375 -9.8875024978330967e-16 5.3826834323650896 4.375 5.7071067811865479 0 3.75 3.494479613091911e-16 -5.7071067811865479 3.75 -5.7071067811865479 -6.9889592261838221e-16 3.75 -1.0483438839275733e-15 5.7071067811865479 3.75 5.923879532511287 0 3.125 3.6272102573958275e-16 -5.923879532511287 3.125 -5.923879532511287 -7.2544205147916551e-16 3.125 -1.0881630772187484e-15 5.923879532511287 3.125 6 0 2.5 3.6738190614671318e-16 -6 2.5 -6 -7.3476381229342635e-16 2.5 -1.1021457184401395e-15 6 2.5 5.923879532511287 0 1.875 3.6272102573958275e-16 -5.923879532511287 1.875 -5.923879532511287 -7.2544205147916551e-16 1.875 -1.0881630772187484e-15 5.923879532511287 1.875 5.7071067811865479 0 1.25 3.494479613091911e-16 -5.7071067811865479 1.25 -5.7071067811865479 -6.9889592261838221e-16 1.25 -1.0483438839275733e-15 5.7071067811865479 1.25 5.3826834323650896 0 0.625 3.2958341659443654e-16 -5.3826834323650896 0.625 -5.3826834323650896 -6.5916683318887308e-16 0.625 -9.8875024978330967e-16 5.3826834323650896 0.625 5 0 0 3.0615158845559431e-16 -5 0 -5 -6.1230317691118863e-16 0 -9.1845476536678294e-16 5 0 4.6173165676349104 0 -0.625 2.8271976031675209e-16 -4.6173165676349104 -0.625 -4.6173165676349104 -5.6543952063350418e-16 -0.625 -8.4815928095025622e-16 4.6173165676349104 -0.625 4.2928932188134521 0 -1.25 2.6285521560199753e-16 -4.2928932188134521 -1.25 -4.2928932188134521 -5.2571043120399505e-16 -1.25 -7.8856564680599262e-16 4.2928932188134521 -1.25 4.076120467488713 0 -1.875 2.4958215117160587e-16 -4.076120467488713 -1.875 -4.076120467488713 -4.9916430234321175e-16 -1.875 -7.4874645351481753e-16 4.076120467488713 -1.875 4 0 -2.5 2.4492127076447545e-16 -4 -2.5 -4 -4.898425415289509e-16 -2.5 -7.3476381229342635e-16 4 -2.5 4.076120467488713 0 -3.125 2.4958215117160587e-16 -4.076120467488713 -3.125 -4.076120467488713 -4.9916430234321175e-16 -3.125 -7.4874645351481753e-16 4.076120467488713 -3.125 4.2928932188134521 0 -3.75 2.6285521560199753e-16 -4.2928932188134521 -3.75 -4.2928932188134521 -5.2571043120399505e-16 -3.75 -7.8856564680599262e-16 4.2928932188134521 -3.75 4.6173165676349104 0 -4.375 2.8271976031675204e-16 -4.6173165676349104 -4.375 -4.6173165676349104 -5.6543952063350408e-16 -4.375 -8.4815928095025622e-16 4.6173165676349104 -4.375 5 0 -5 3.0615158845559431e-16 -5 -5 -5 -6.1230317691118863e-16 -5 -9.1845476536678294e-16 5 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 4 5 9 8 5 6 10 9 6 7 11 10 7 4 8 11 8 9 13 12 9 10 14 13 10 11 15 14 11 8 12 15 12 13 17 16 13 14 18 17 14 15 19 18 15 12 16 19 16 17 21 20 17 18 22 21 18 19 23 22 19 16 20 23 20 21 25 24 21 22 26 25 22 23 27 26 23 20 24 27 24 25 29 28 25 26 30 29 26 27 31 30 27 24 28 31 28 29 33 32 29 30 34 33 30 31 35 34 31 28 32 35 32 33 37 36 33 34 38 37 34 35 39 38 35 32 36 39 36 37 41 40 37 38 42 41 38 39 43 42 39 36 40 43 40 41 45 44 41 42 46 45 42 43 47 46 43 40 44 47 44 45 49 48 45 46 50 49 46 47 51 50 47 44 48 51 48 49 53 52 49 50 54 53 50 51 55 54 51 48 52 55 52 53 57 56 53 54 58 57 54 55 59 58 55 52 56 59 56 57 61 60 57 58 62 61 58 59 63 62 59 56 60 63 60 61 65 64 61 62 66 65 62 63 67 66 63 60 64 67 0 3 2 1 64 65 66 67\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.DeformationExpression.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 5 0.97947615847056058 0 5.7341318670302694 0.96065579873382767 -0.19108631916314192 5.7234939078152189 0.90491797539373253 -0.3748292982432867 5.6903008889068438 0.81440466174310333 -0.5441677975986341 5.6312435479829723 0.69259423366508288 -0.69259423366508277 5.5424622324082566 0.54416779759863421 -0.81440466174310322 5.4216326740999277 0.37482929824328676 -0.90491797539373253 5.2700400864808516 0.19108631916314198 -0.96065579873382767 5.0938519553665618 5.9975617115605883e-17 -0.97947615847056058 4.9039264020161522 -0.19108631916314187 -0.96065579873382767 4.7140008486657434 -0.3748292982432867 -0.90491797539373253 4.5378127175514527 -0.54416779759863387 -0.81440466174310355 4.3862201299323775 -0.69259423366508277 -0.69259423366508288 4.2653905716240477 -0.81440466174310344 -0.5441677975986341 4.176609256049332 -0.90491797539373253 -0.37482929824328676 4.1175519151254605 -0.96065579873382767 -0.19108631916314225 4.0843588962170854 -0.97947615847056058 -1.1995123423121177e-16 4.0737209370020349 -0.96065579873382767 0.19108631916314203 4.0843588962170854 -0.90491797539373253 0.37482929824328665 4.1175519151254605 -0.81440466174310355 0.54416779759863387 4.176609256049332 -0.69259423366508299 0.69259423366508277 4.2653905716240477 -0.5441677975986341 0.81440466174310333 4.3862201299323766 -0.37482929824328726 0.90491797539373231 4.5378127175514527 -0.19108631916314234 0.96065579873382756 4.7140008486657425 -1.7992685134681764e-16 0.97947615847056058 4.9039264020161522 0.19108631916314195 0.96065579873382767 5.0938519553665609 0.37482929824328692 0.90491797539373242 5.2700400864808516 0.54416779759863376 0.81440466174310366 5.4216326740999268 0.69259423366508277 0.69259423366508299 5.5424622324082566 0.81440466174310333 0.5441677975986341 5.6312435479829723 0.90491797539373231 0.37482929824328731 5.6903008889068429 0.96065579873382756 0.19108631916314239 5.7234939078152189 1.9165037446636235 0 5.5602336333343629 1.8796786626037532 -0.37389133269154196 5.5720715906705687 1.7706185836759589 -0.73341423114842308 5.5994995370225489 1.5935146255518391 -1.0647524320057096 5.6191396131062463 1.3551727940210598 -1.3551727940210596 5.5962408377373132 1.0647524320057096 -1.5935146255518389 5.494066616162522 0.73341423114842319 -1.7706185836759589 5.2888076034353526 0.37389133269154207 -1.8796786626037532 4.9846383433724606 1.1735200882281113e-16 -1.9165037446636235 4.6193976625564339 -0.37389133269154184 -1.8796786626037532 4.2541569817404072 -0.73341423114842297 -1.7706185836759589 3.9499877216775152 -1.0647524320057091 -1.5935146255518395 3.7447287089503463 -1.3551727940210596 -1.3551727940210598 3.6425544873755547 -1.5935146255518393 -1.0647524320057096 3.619655712006622 -1.7706185836759589 -0.73341423114842319 3.639295788090319 -1.8796786626037532 -0.37389133269154257 3.6667237344422992 -1.9165037446636235 -2.3470401764562226e-16 3.6785616917785044 -1.8796786626037532 0.37389133269154218 3.6667237344422992 -1.7706185836759589 0.73341423114842286 3.639295788090319 -1.5935146255518395 1.0647524320057091 3.619655712006622 -1.3551727940210601 1.3551727940210596 3.6425544873755547 -1.0647524320057096 1.5935146255518391 3.7447287089503463 -0.73341423114842408 1.7706185836759585 3.9499877216775143 -0.37389133269154273 1.8796786626037529 4.2541569817404064 -3.5205602646843339e-16 1.9165037446636235 4.6193976625564339 0.37389133269154201 1.8796786626037532 4.9846383433724606 0.73341423114842352 1.7706185836759587 5.2888076034353535 1.0647524320057089 1.5935146255518398 5.4940666161625211 1.3551727940210596 1.3551727940210601 5.5962408377373132 1.5935146255518391 1.0647524320057096 5.6191396131062463 1.7706185836759585 0.73341423114842419 5.5994995370225489 1.8796786626037529 0.37389133269154284 5.5720715906705687 2.7800733139329128 0 4.5110438328061031 2.7266549847472299 -0.54236539804361672 4.5604809508557125 2.5684528336234433 -1.0638879980024369 4.6996208634240197 2.3115464805084511 -1.5445259788332859 4.8953105929294258 1.9658086924777203 -1.9658086924777201 5.0803398673892648 1.5445259788332864 -2.3115464805084507 5.1570030157663016 1.0638879980024369 -2.5684528336234433 5.0315976792617523 0.54236539804361694 -2.7266549847472299 4.6735114353883134 1.7023039426514583e-16 -2.7800733139329128 4.1573480615127263 -0.54236539804361661 -2.7266549847472299 3.6411846876371401 -1.0638879980024367 -2.5684528336234433 3.2830984437636999 -1.5445259788332855 -2.3115464805084516 3.157693107259151 -1.9658086924777201 -1.9658086924777203 3.2343562556361873 -2.3115464805084516 -1.5445259788332859 3.4193855300960267 -2.5684528336234433 -1.0638879980024369 3.6150752596014328 -2.7266549847472299 -0.54236539804361772 3.7542151721697397 -2.7800733139329128 -3.4046078853029166e-16 3.8036522902193495 -2.7266549847472299 0.54236539804361705 3.7542151721697397 -2.5684528336234433 1.0638879980024365 3.6150752596014328 -2.3115464805084516 1.5445259788332855 3.4193855300960267 -1.9658086924777207 1.9658086924777201 3.2343562556361878 -1.5445259788332859 2.3115464805084511 3.157693107259151 -1.0638879980024385 2.5684528336234425 3.283098443763699 -0.54236539804361794 2.7266549847472294 3.6411846876371388 -5.1069118279543739e-16 2.7800733139329128 4.1573480615127254 0.54236539804361683 2.7266549847472299 4.6735114353883125 1.0638879980024374 2.5684528336234429 5.0315976792617532 1.544525978833285 2.311546480508452 5.1570030157663016 1.9658086924777201 1.9658086924777207 5.0803398673892648 2.3115464805084511 1.5445259788332859 4.8953105929294258 2.5684528336234425 1.0638879980024385 4.6996208634240206 2.7266549847472294 0.54236539804361805 4.5604809508557134 3.5369983720268046 0 3.1503512720824531 3.4690359400940789 -0.69003415136923063 3.2139106932289838 3.2677604024413065 -1.3535506772769523 3.4097006201300095 2.9409066651038609 -1.9650510097368854 3.7348755043179902 2.5010355339059327 -2.5010355339059323 4.1331761179276141 1.9650510097368858 -2.9409066651038605 4.4588170180153446 1.3535506772769526 -3.2677604024413065 4.5120287335762717 0.69003415136923085 -3.4690359400940789 4.1720974268909252 2.1657868674460127e-16 -3.5369983720268046 3.5355339059327378 -0.69003415136923052 -3.4690359400940789 2.8989703849745512 -1.3535506772769521 -3.2677604024413065 2.5590390782892039 -1.9650510097368845 -2.9409066651038618 2.61225079385013 -2.5010355339059323 -2.5010355339059327 2.937891693937861 -2.9409066651038613 -1.9650510097368854 3.3361923075474857 -3.2677604024413065 -1.3535506772769526 3.661367191735466 -3.4690359400940789 -0.69003415136923185 3.8571571186364917 -3.5369983720268046 -4.3315737348920254e-16 3.9207165397830224 -3.4690359400940789 0.69003415136923107 3.8571571186364917 -3.2677604024413065 1.3535506772769519 3.661367191735466 -2.9409066651038618 1.9650510097368845 3.3361923075474862 -2.5010355339059331 2.5010355339059323 2.9378916939378614 -1.9650510097368854 2.9409066651038609 2.6122507938501305 -1.3535506772769543 3.2677604024413056 2.5590390782892034 -0.69003415136923218 3.4690359400940785 2.8989703849745494 -6.4973606023380378e-16 3.5369983720268046 3.5355339059327373 0.69003415136923074 3.4690359400940789 4.1720974268909252 1.3535506772769532 3.2677604024413061 4.5120287335762717 1.9650510097368843 2.9409066651038622 4.4588170180153455 2.5010355339059323 2.5010355339059331 4.133176117927615 2.9409066651038609 1.9650510097368854 3.7348755043179902 3.2677604024413056 1.3535506772769546 3.4097006201300104 3.4690359400940785 0.6900341513692323 3.2139106932289843 4.158190713451213 0 1.9275285301532326 4.0782922448623564 -0.81122276529167126 1.9722440009433679 3.8416672924360804 -1.5912706946521518 2.1335763927163773 3.4574092203933242 -2.3101669836120364 2.467258408486666 2.9402848509482808 -2.9402848509482804 2.9778020592902656 2.3101669836120369 -3.4574092203933238 3.5167439360563888 1.591270694652152 -3.8416672924360804 3.7776415725503494 0.81122276529167148 -4.0782922448623564 3.5029808925498234 2.5461574737361384e-16 -4.158190713451213 2.7778511650980118 -0.81122276529167103 -4.0782922448623564 2.0527214376461993 -1.5912706946521515 -3.8416672924360804 1.7780607576456733 -2.3101669836120355 -3.4574092203933251 2.038958394139633 -2.9402848509482804 -2.9402848509482808 2.5779002709057566 -3.4574092203933247 -2.3101669836120364 3.0884439217093571 -3.8416672924360804 -1.591270694652152 3.4221259374796453 -4.0782922448623564 -0.81122276529167259 3.5834583292526547 -4.158190713451213 -5.0923149474722769e-16 3.6281738000427901 -4.0782922448623564 0.8112227652916717 3.5834583292526547 -3.8416672924360804 1.5912706946521513 3.4221259374796453 -3.4574092203933251 2.3101669836120355 3.0884439217093576 -2.9402848509482813 2.9402848509482804 2.5779002709057575 -2.3101669836120364 3.4574092203933242 2.0389583941396334 -1.591270694652154 3.8416672924360795 1.7780607576456733 -0.81122276529167292 4.0782922448623564 2.052721437646198 -7.6384724212084148e-16 4.158190713451213 2.7778511650980104 0.81122276529167137 4.0782922448623564 3.5029808925498234 1.5912706946521527 3.84166729243608 3.7776415725503494 2.3101669836120351 3.4574092203933255 3.5167439360563901 2.9402848509482804 2.9402848509482813 2.9778020592902661 3.4574092203933242 2.3101669836120364 2.467258408486666 3.8416672924360795 1.5912706946521542 2.1335763927163778 4.0782922448623564 0.81122276529167314 1.9722440009433679 4.6197782648938777 0 0.91770246999059146 4.5310105209346911 -0.90127402934125678 0.92982118869186348 4.2681185836759594 -1.7679126031752281 1.0104926732102388 3.8412052428350374 -2.5666112871259852 1.2694958310137703 3.2666765386846834 -3.266676538684683 1.7886591982835036 2.5666112871259856 -3.8412052428350369 2.4572363152945411 1.7679126031752284 -4.2681185836759594 2.8940525712680318 0.90127402934125711 -4.5310105209346911 2.6975353848483357 2.8287983324364e-16 -4.6197782648938777 1.9134171618254494 -0.90127402934125656 -4.5310105209346911 1.1292989388025629 -1.7679126031752277 -4.2681185836759594 0.93278175238286654 -2.5666112871259839 -3.8412052428350387 1.3695980083563559 -3.266676538684683 -3.2666765386846834 2.0381751253673941 -3.8412052428350383 -2.5666112871259852 2.5573384926371285 -4.2681185836759594 -1.7679126031752284 2.8163416504406595 -4.5310105209346911 -0.90127402934125833 2.8970131349590349 -4.6197782648938777 -5.6575966648728e-16 2.9091318536603068 -4.5310105209346911 0.90127402934125733 2.8970131349590349 -4.2681185836759594 1.7679126031752275 2.8163416504406595 -3.8412052428350387 2.5666112871259839 2.557338492637129 -3.2666765386846839 3.266676538684683 2.038175125367395 -2.5666112871259852 3.8412052428350374 1.3695980083563568 -1.7679126031752306 4.2681185836759576 0.93278175238286709 -0.90127402934125878 4.5310105209346903 1.1292989388025614 -8.4863949973092005e-16 4.6197782648938777 1.9134171618254483 0.901274029341257 4.5310105209346911 2.6975353848483357 1.767912603175229 4.2681185836759585 2.8940525712680314 2.5666112871259834 3.8412052428350392 2.4572363152945429 3.266676538684683 3.2666765386846839 1.7886591982835041 3.8412052428350374 2.5666112871259852 1.2694958310137703 4.2681185836759576 1.7679126031752308 1.0104926732102397 4.5310105209346903 0.901274029341259 0.92982118869186359 4.904022475614136 0 -0.0062428149259103893 4.809793058848955 -0.95672732394189219 -0.019808362053132411 4.5307259921952312 -1.8766881533635624 -0.0080929983543646111 4.0775456665218535 -2.7245289095103118 0.17028698079665705 3.4676675475979963 -3.4676675475979954 0.65512438479630997 2.7245289095103122 -4.0775456665218535 1.3805292464135057 1.8766881533635627 -4.5307259921952312 1.9290303739285592 0.95672732394189253 -4.809793058848955 1.7927618496705615 3.0028477138537652e-16 -4.904022475614136 0.97545161008064185 -0.95672732394189197 -4.809793058848955 0.15814137049072186 -1.876688153363562 -4.5307259921952312 0.021872846232723564 -2.7245289095103109 -4.0775456665218552 0.57037397374777599 -3.4676675475979954 -3.4676675475979963 1.2957788353649722 -4.0775456665218544 -2.7245289095103118 1.7806162393646265 -4.5307259921952312 -1.8766881533635627 1.9589962185156478 -4.809793058848955 -0.95672732394189386 1.9707115822144154 -4.904022475614136 -6.0056954277075304e-16 1.9571460350871934 -4.809793058848955 0.95672732394189275 1.9707115822144154 -4.5307259921952312 1.8766881533635618 1.9589962185156478 -4.0775456665218552 2.7245289095103109 1.780616239364627 -3.4676675475979968 3.4676675475979954 1.2957788353649735 -2.7245289095103118 4.0775456665218535 0.57037397374777687 -1.8766881533635651 4.5307259921952303 0.021872846232724563 -0.9567273239418943 4.8097930588489541 0.15814137049072052 -9.008543141561295e-16 4.904022475614136 0.97545161008064063 0.9567273239418923 4.809793058848955 1.7927618496705613 1.8766881533635635 4.5307259921952303 1.929030373928559 2.72452890951031 4.0775456665218552 1.3805292464135079 3.4676675475979954 3.4676675475979968 0.65512438479631085 4.0775456665218535 2.7245289095103118 0.17028698079665705 4.5307259921952303 1.8766881533635653 -0.0080929983543645001 4.8097930588489541 0.95672732394189453 -0.019808362053132522 5 0 -0.95892427466313812 4.9039264020161522 -0.97545161008064118 -0.98171271891679746 4.6193976625564339 -1.913417161825449 -0.99567942222593664 4.1573480615127263 -2.7778511650980109 -0.84987887763288694 3.5355339059327378 -3.5355339059327373 -0.38383075286612806 2.7778511650980113 -4.1573480615127254 0.35577340660646689 1.9134171618254492 -4.6193976625564339 0.94187741409201675 0.97545161008064152 -4.9039264020161522 0.82795523290297257 3.0616169978683831e-16 -5 6.1232339957367663e-16 -0.97545161008064096 -4.9039264020161522 -0.82795523290297168 -1.9134171618254485 -4.6193976625564339 -0.94187741409201631 -2.77785116509801 -4.1573480615127272 -0.35577340660646745 -3.5355339059327373 -3.5355339059327378 0.38383075286612833 -4.1573480615127263 -2.7778511650980109 0.84987887763288761 -4.6193976625564339 -1.9134171618254492 0.99567942222593731 -4.9039264020161522 -0.97545161008064296 0.98171271891679812 -5 -6.1232339957367663e-16 0.95892427466313879 -4.9039264020161522 0.97545161008064185 0.98171271891679812 -4.6193976625564339 1.9134171618254483 0.99567942222593731 -4.1573480615127272 2.77785116509801 0.84987887763288805 -3.5355339059327386 3.5355339059327373 0.38383075286612955 -2.7778511650980109 4.1573480615127263 -0.35577340660646661 -1.9134171618254516 4.6193976625564321 -0.9418774140920152 -0.97545161008064329 4.9039264020161513 -0.8279552329029729 -9.1848509936051479e-16 5 -6.1232339957367653e-16 0.97545161008064141 4.9039264020161522 0.82795523290297257 1.9134171618254501 4.619397662556433 0.94187741409201642 2.7778511650980091 4.1573480615127281 0.35577340660646894 3.5355339059327373 3.5355339059327386 -0.38383075286612767 4.1573480615127263 2.7778511650980109 -0.84987887763288694 4.6193976625564321 1.9134171618254521 -0.99567942222593642 4.9039264020161513 0.97545161008064363 -0.98171271891679757 4.904022475614136 0 -1.957146035087193 4.809793058848955 -0.95672732394189219 -1.970711582214415 4.5307259921952312 -1.8766881533635624 -1.9589962185156471 4.0775456665218535 -2.7245289095103118 -1.7806162393646254 3.4676675475979963 -3.4676675475979954 -1.2957788353649726 2.7245289095103122 -4.0775456665218535 -0.57037397374777665 1.8766881533635627 -4.5307259921952312 -0.021872846232723231 0.95672732394189253 -4.809793058848955 -0.15814137049072108 3.0028477138537652e-16 -4.904022475614136 -0.97545161008064063 -0.95672732394189197 -4.809793058848955 -1.7927618496705606 -1.876688153363562 -4.5307259921952312 -1.9290303739285588 -2.7245289095103109 -4.0775456665218552 -1.3805292464135066 -3.4676675475979954 -3.4676675475979963 -0.65512438479631019 -4.0775456665218544 -2.7245289095103118 -0.17028698079665594 -4.5307259921952312 -1.8766881533635627 0.0080929983543651662 -4.809793058848955 -0.95672732394189386 0.019808362053132966 -4.904022475614136 -6.0056954277075304e-16 0.0062428149259109444 -4.809793058848955 0.95672732394189275 0.019808362053132966 -4.5307259921952312 1.8766881533635618 0.0080929983543651662 -4.0775456665218552 2.7245289095103109 -0.17028698079665539 -3.4676675475979968 3.4676675475979954 -0.65512438479630897 -2.7245289095103118 4.0775456665218535 -1.3805292464135057 -1.8766881533635651 4.5307259921952303 -1.9290303739285579 -0.9567273239418943 4.8097930588489541 -1.792761849670562 -9.008543141561295e-16 4.904022475614136 -0.97545161008064185 0.9567273239418923 4.809793058848955 -0.15814137049072119 1.8766881533635635 4.5307259921952303 -0.021872846232723453 2.72452890951031 4.0775456665218552 -0.57037397374777465 3.4676675475979954 3.4676675475979968 -1.2957788353649717 4.0775456665218535 2.7245289095103118 -1.7806162393646254 4.5307259921952303 1.8766881533635653 -1.9589962185156469 4.8097930588489541 0.95672732394189453 -1.970711582214415 4.6197782648938777 0 -2.9091318536603064 4.5310105209346911 -0.90127402934125678 -2.8970131349590345 4.2681185836759594 -1.7679126031752281 -2.8163416504406591 3.8412052428350374 -2.5666112871259852 -2.5573384926371272 3.2666765386846834 -3.266676538684683 -2.0381751253673941 2.5666112871259856 -3.8412052428350369 -1.3695980083563566 1.7679126031752284 -4.2681185836759594 -0.93278175238286598 0.90127402934125711 -4.5310105209346911 -1.1292989388025618 2.8287983324364e-16 -4.6197782648938777 -1.9134171618254483 -0.90127402934125656 -4.5310105209346911 -2.6975353848483348 -1.7679126031752277 -4.2681185836759594 -2.8940525712680314 -2.5666112871259839 -3.8412052428350387 -2.457236315294542 -3.266676538684683 -3.2666765386846834 -1.7886591982835034 -3.8412052428350383 -2.5666112871259852 -1.2694958310137689 -4.2681185836759594 -1.7679126031752284 -1.0104926732102382 -4.5310105209346911 -0.90127402934125833 -0.92982118869186281 -4.6197782648938777 -5.6575966648728e-16 -0.9177024699905908 -4.5310105209346911 0.90127402934125733 -0.92982118869186281 -4.2681185836759594 1.7679126031752275 -1.0104926732102382 -3.8412052428350387 2.5666112871259839 -1.2694958310137687 -3.2666765386846839 3.266676538684683 -1.7886591982835025 -2.5666112871259852 3.8412052428350374 -2.4572363152945407 -1.7679126031752306 4.2681185836759576 -2.8940525712680305 -0.90127402934125878 4.5310105209346903 -2.6975353848483361 -8.4863949973092005e-16 4.6197782648938777 -1.9134171618254494 0.901274029341257 4.5310105209346911 -1.129298938802562 1.767912603175229 4.2681185836759585 -0.93278175238286609 2.5666112871259834 3.8412052428350392 -1.3695980083563548 3.266676538684683 3.2666765386846839 -2.0381751253673936 3.8412052428350374 2.5666112871259852 -2.5573384926371272 4.2681185836759576 1.7679126031752308 -2.8163416504406582 4.5310105209346903 0.901274029341259 -2.897013134959034 4.1581907134512148 0 -3.6281738000427897 4.0782922448623582 -0.81122276529167159 -3.5834583292526547 3.8416672924360822 -1.5912706946521524 -3.4221259374796453 3.4574092203933255 -2.3101669836120373 -3.0884439217093567 2.9402848509482822 -2.9402848509482817 -2.577900270905757 2.3101669836120378 -3.4574092203933251 -2.038958394139633 1.5912706946521527 -3.8416672924360822 -1.778060757645672 0.81122276529167181 -4.0782922448623582 -2.0527214376461975 2.5461574737361394e-16 -4.1581907134512148 -2.7778511650980096 -0.81122276529167137 -4.0782922448623582 -3.5029808925498225 -1.5912706946521522 -3.8416672924360822 -3.777641572550348 -2.3101669836120364 -3.4574092203933264 -3.5167439360563879 -2.9402848509482817 -2.9402848509482822 -2.9778020592902634 -3.457409220393326 -2.3101669836120373 -2.4672584084866629 -3.8416672924360822 -1.5912706946521527 -2.1335763927163747 -4.0782922448623582 -0.81122276529167292 -1.9722440009433653 -4.1581907134512148 -5.0923149474722788e-16 -1.9275285301532303 -4.0782922448623582 0.81122276529167203 -1.9722440009433653 -3.8416672924360822 1.591270694652152 -2.1335763927163747 -3.4574092203933264 2.3101669836120364 -2.4672584084866624 -2.9402848509482826 2.9402848509482817 -2.9778020592902625 -2.3101669836120373 3.4574092203933255 -3.516743936056387 -1.5912706946521546 3.8416672924360813 -3.777641572550348 -0.81122276529167325 4.0782922448623582 -3.5029808925498234 -7.6384724212084188e-16 4.1581907134512148 -2.7778511650980109 0.8112227652916717 4.0782922448623582 -2.0527214376461975 1.5912706946521533 3.8416672924360817 -1.778060757645672 2.310166983612036 3.4574092203933269 -2.0389583941396321 2.9402848509482817 2.9402848509482826 -2.5779002709057566 3.4574092203933255 2.3101669836120373 -3.0884439217093567 3.8416672924360813 1.5912706946521549 -3.4221259374796449 4.0782922448623582 0.81122276529167348 -3.5834583292526547 3.536998372026805 0 -3.9207165397830224 3.4690359400940793 -0.69003415136923074 -3.8571571186364917 3.2677604024413069 -1.3535506772769526 -3.661367191735466 2.9409066651038613 -1.9650510097368856 -3.3361923075474853 2.5010355339059331 -2.5010355339059327 -2.9378916939378614 1.9650510097368861 -2.9409066651038609 -2.61225079385013 1.3535506772769528 -3.2677604024413069 -2.5590390782892034 0.69003415136923096 -3.4690359400940793 -2.8989703849745503 2.1657868674460129e-16 -3.536998372026805 -3.5355339059327373 -0.69003415136923052 -3.4690359400940793 -4.1720974268909243 -1.3535506772769523 -3.2677604024413069 -4.5120287335762708 -1.9650510097368847 -2.9409066651038618 -4.4588170180153446 -2.5010355339059327 -2.5010355339059331 -4.1331761179276141 -2.9409066651038618 -1.9650510097368856 -3.7348755043179889 -3.2677604024413069 -1.3535506772769528 -3.4097006201300086 -3.4690359400940793 -0.69003415136923196 -3.2139106932289829 -3.536998372026805 -4.3315737348920259e-16 -3.1503512720824522 -3.4690359400940793 0.69003415136923119 -3.2139106932289829 -3.2677604024413069 1.3535506772769521 -3.4097006201300086 -2.9409066651038618 1.9650510097368847 -3.7348755043179889 -2.5010355339059336 2.5010355339059327 -4.1331761179276132 -1.9650510097368856 2.9409066651038613 -4.4588170180153446 -1.3535506772769546 3.2677604024413061 -4.5120287335762717 -0.6900341513692323 3.4690359400940789 -4.1720974268909252 -6.4973606023380388e-16 3.536998372026805 -3.5355339059327378 0.69003415136923085 3.4690359400940793 -2.8989703849745503 1.3535506772769532 3.2677604024413065 -2.559039078289203 1.9650510097368845 2.9409066651038622 -2.6122507938501296 2.5010355339059327 2.5010355339059336 -2.9378916939378605 2.9409066651038613 1.9650510097368856 -3.3361923075474853 3.2677604024413061 1.3535506772769546 -3.6613671917354651 3.4690359400940789 0.69003415136923241 -3.8571571186364912 2.7800733139329128 0 -3.8036522902193495 2.7266549847472299 -0.54236539804361672 -3.7542151721697397 2.5684528336234433 -1.0638879980024369 -3.6150752596014328 2.3115464805084511 -1.5445259788332859 -3.4193855300960267 1.9658086924777203 -1.9658086924777201 -3.2343562556361873 1.5445259788332864 -2.3115464805084507 -3.157693107259151 1.0638879980024369 -2.5684528336234433 -3.2830984437636999 0.54236539804361694 -2.7266549847472299 -3.6411846876371396 1.7023039426514583e-16 -2.7800733139329128 -4.1573480615127263 -0.54236539804361661 -2.7266549847472299 -4.6735114353883125 -1.0638879980024367 -2.5684528336234433 -5.0315976792617523 -1.5445259788332855 -2.3115464805084516 -5.1570030157663016 -1.9658086924777201 -1.9658086924777203 -5.0803398673892648 -2.3115464805084516 -1.5445259788332859 -4.8953105929294258 -2.5684528336234433 -1.0638879980024369 -4.6996208634240197 -2.7266549847472299 -0.54236539804361772 -4.5604809508557125 -2.7800733139329128 -3.4046078853029166e-16 -4.5110438328061031 -2.7266549847472299 0.54236539804361705 -4.5604809508557125 -2.5684528336234433 1.0638879980024365 -4.6996208634240197 -2.3115464805084516 1.5445259788332855 -4.8953105929294258 -1.9658086924777207 1.9658086924777201 -5.0803398673892648 -1.5445259788332859 2.3115464805084511 -5.1570030157663016 -1.0638879980024385 2.5684528336234425 -5.0315976792617532 -0.54236539804361794 2.7266549847472294 -4.6735114353883134 -5.1069118279543739e-16 2.7800733139329128 -4.1573480615127272 0.54236539804361683 2.7266549847472299 -3.6411846876371396 1.0638879980024374 2.5684528336234429 -3.2830984437636994 1.544525978833285 2.311546480508452 -3.157693107259151 1.9658086924777201 1.9658086924777207 -3.2343562556361873 2.3115464805084511 1.5445259788332859 -3.4193855300960267 2.5684528336234425 1.0638879980024385 -3.6150752596014324 2.7266549847472294 0.54236539804361805 -3.7542151721697392 1.9165037446636237 0 -3.6785616917785049 1.8796786626037534 -0.37389133269154196 -3.6667237344422992 1.7706185836759591 -0.73341423114842319 -3.639295788090319 1.5935146255518393 -1.0647524320057096 -3.619655712006622 1.3551727940210601 -1.3551727940210598 -3.6425544873755547 1.0647524320057098 -1.5935146255518391 -3.7447287089503458 0.7334142311484233 -1.7706185836759591 -3.9499877216775152 0.37389133269154207 -1.8796786626037534 -4.2541569817404072 1.1735200882281115e-16 -1.9165037446636237 -4.6193976625564339 -0.3738913326915419 -1.8796786626037534 -4.9846383433724606 -0.73341423114842308 -1.7706185836759591 -5.2888076034353526 -1.0647524320057091 -1.5935146255518398 -5.4940666161625211 -1.3551727940210598 -1.3551727940210601 -5.5962408377373132 -1.5935146255518395 -1.0647524320057096 -5.6191396131062463 -1.7706185836759591 -0.7334142311484233 -5.5994995370225489 -1.8796786626037534 -0.37389133269154262 -5.5720715906705687 -1.9165037446636237 -2.3470401764562231e-16 -5.5602336333343629 -1.8796786626037534 0.37389133269154218 -5.5720715906705687 -1.7706185836759591 0.73341423114842297 -5.5994995370225489 -1.5935146255518398 1.0647524320057091 -5.6191396131062463 -1.3551727940210603 1.3551727940210598 -5.5962408377373132 -1.0647524320057096 1.5935146255518393 -5.494066616162522 -0.73341423114842419 1.7706185836759587 -5.2888076034353535 -0.37389133269154279 1.8796786626037532 -4.9846383433724615 -3.5205602646843344e-16 1.9165037446636237 -4.6193976625564339 0.37389133269154201 1.8796786626037534 -4.2541569817404072 0.73341423114842352 1.7706185836759589 -3.9499877216775148 1.0647524320057089 1.59351462555184 -3.7447287089503467 1.3551727940210598 1.3551727940210603 -3.6425544873755547 1.5935146255518393 1.0647524320057096 -3.619655712006622 1.7706185836759587 0.7334142311484243 -3.639295788090319 1.8796786626037532 0.3738913326915429 -3.6667237344422992 0.97947615847056235 0 -4.0737209370020331 0.96065579873382945 -0.19108631916314228 -4.0843588962170845 0.9049179753937342 -0.37482929824328742 -4.1175519151254596 0.81440466174310489 -0.54416779759863509 -4.1766092560493311 0.6925942336650841 -0.69259423366508399 -4.2653905716240459 0.54416779759863521 -0.81440466174310477 -4.3862201299323758 0.37482929824328748 -0.9049179753937342 -4.5378127175514518 0.19108631916314234 -0.96065579873382945 -4.7140008486657425 5.9975617115605994e-17 -0.97947615847056235 -4.9039264020161522 -0.19108631916314223 -0.96065579873382945 -5.0938519553665618 -0.37482929824328737 -0.9049179753937342 -5.2700400864808525 -0.54416779759863487 -0.81440466174310511 -5.4216326740999277 -0.69259423366508399 -0.6925942336650841 -5.5424622324082575 -0.814404661743105 -0.54416779759863509 -5.6312435479829732 -0.9049179753937342 -0.37482929824328748 -5.6903008889068447 -0.96065579873382945 -0.19108631916314259 -5.7234939078152198 -0.97947615847056235 -1.1995123423121199e-16 -5.7341318670302712 -0.96065579873382945 0.19108631916314239 -5.7234939078152198 -0.9049179753937342 0.37482929824328731 -5.6903008889068447 -0.81440466174310511 0.54416779759863487 -5.6312435479829732 -0.69259423366508421 0.69259423366508399 -5.5424622324082584 -0.54416779759863509 0.81440466174310489 -5.4216326740999286 -0.37482929824328798 0.90491797539373398 -5.2700400864808525 -0.19108631916314267 0.96065579873382934 -5.0938519553665618 -1.7992685134681798e-16 0.97947615847056235 -4.9039264020161522 0.19108631916314231 0.96065579873382945 -4.7140008486657425 0.37482929824328765 0.90491797539373409 -4.5378127175514518 0.54416779759863476 0.81440466174310522 -4.3862201299323766 0.69259423366508399 0.69259423366508421 -4.2653905716240468 0.81440466174310489 0.54416779759863509 -4.1766092560493311 0.90491797539373398 0.37482929824328803 -4.1175519151254605 0.96065579873382934 0.19108631916314273 -4.0843588962170845 0 0 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 39 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63 67 68 66 70 71 69 73 74 72 76 77 75 79 80 78 82 83 81 85 86 84 88 89 87 91 92 90 94 95 93 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1888 1892 1893 1891 1895 1896 1894 1898 1899 1897 1901 1902 1900 1904 1905 1903 1907 1908 1906 1910 1911 1909 1913 1914 1912 1916 1917 1915 1919 1920 1918 1922 1923 1921 1925 1926 1924 1928 1929 1927 1931 1932 1930 1934 1935 1933 1937 1938 1936 1940 1941 1939 1943 1944 1942 1946 1947 1945 1949 1950 1948 1952 1953 1951 1955 1956 1954 1958 1959 1957 1961 1962 1960 1964 1965 1963 1967 1968 1966 1970 1971 1969 1973 1974 1972 1976 1977 1975 1979 1980 1978 1982 1983 1981</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1891 1894 1897 1900 1903 1906 1909 1912 1915 1918 1921 1924 1927 1930 1933 1936 1939 1942 1945 1948 1951 1954 1957 1960 1963 1966 1969 1972 1975 1978 1981</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">2 1 0 3 2 0 4 3 0 5 4 0 6 5 0 7 6 0 8 7 0 9 8 0 10 9 0 11 10 0 12 11 0 13 12 0 14 13 0 15 14 0 16 15 0 17 16 0 18 17 0 19 18 0 20 19 0 21 20 0 22 21 0 23 22 0 24 23 0 25 24 0 26 25 0 27 26 0 28 27 0 29 28 0 30 29 0 31 30 0 32 31 0 1 32 0 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 32 64 63 32 1 33 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 64 96 95 64 33 65 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 96 128 127 96 65 97 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 128 160 159 128 97 129 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 160 192 191 160 129 161 192 161 162 194 193 162 163 195 194 163 164 196 195 164 165 197 196 165 166 198 197 166 167 199 198 167 168 200 199 168 169 201 200 169 170 202 201 170 171 203 202 171 172 204 203 172 173 205 204 173 174 206 205 174 175 207 206 175 176 208 207 176 177 209 208 177 178 210 209 178 179 211 210 179 180 212 211 180 181 213 212 181 182 214 213 182 183 215 214 183 184 216 215 184 185 217 216 185 186 218 217 186 187 219 218 187 188 220 219 188 189 221 220 189 190 222 221 190 191 223 222 191 192 224 223 192 161 193 224 193 194 226 225 194 195 227 226 195 196 228 227 196 197 229 228 197 198 230 229 198 199 231 230 199 200 232 231 200 201 233 232 201 202 234 233 202 203 235 234 203 204 236 235 204 205 237 236 205 206 238 237 206 207 239 238 207 208 240 239 208 209 241 240 209 210 242 241 210 211 243 242 211 212 244 243 212 213 245 244 213 214 246 245 214 215 247 246 215 216 248 247 216 217 249 248 217 218 250 249 218 219 251 250 219 220 252 251 220 221 253 252 221 222 254 253 222 223 255 254 223 224 256 255 224 193 225 256 225 226 258 257 226 227 259 258 227 228 260 259 228 229 261 260 229 230 262 261 230 231 263 262 231 232 264 263 232 233 265 264 233 234 266 265 234 235 267 266 235 236 268 267 236 237 269 268 237 238 270 269 238 239 271 270 239 240 272 271 240 241 273 272 241 242 274 273 242 243 275 274 243 244 276 275 244 245 277 276 245 246 278 277 246 247 279 278 247 248 280 279 248 249 281 280 249 250 282 281 250 251 283 282 251 252 284 283 252 253 285 284 253 254 286 285 254 255 287 286 255 256 288 287 256 225 257 288 257 258 290 289 258 259 291 290 259 260 292 291 260 261 293 292 261 262 294 293 262 263 295 294 263 264 296 295 264 265 297 296 265 266 298 297 266 267 299 298 267 268 300 299 268 269 301 300 269 270 302 301 270 271 303 302 271 272 304 303 272 273 305 304 273 274 306 305 274 275 307 306 275 276 308 307 276 277 309 308 277 278 310 309 278 279 311 310 279 280 312 311 280 281 313 312 281 282 314 313 282 283 315 314 283 284 316 315 284 285 317 316 285 286 318 317 286 287 319 318 287 288 320 319 288 257 289 320 289 290 322 321 290 291 323 322 291 292 324 323 292 293 325 324 293 294 326 325 294 295 327 326 295 296 328 327 296 297 329 328 297 298 330 329 298 299 331 330 299 300 332 331 300 301 333 332 301 302 334 333 302 303 335 334 303 304 336 335 304 305 337 336 305 306 338 337 306 307 339 338 307 308 340 339 308 309 341 340 309 310 342 341 310 311 343 342 311 312 344 343 312 313 345 344 313 314 346 345 314 315 347 346 315 316 348 347 316 317 349 348 317 318 350 349 318 319 351 350 319 320 352 351 320 289 321 352 321 322 354 353 322 323 355 354 323 324 356 355 324 325 357 356 325 326 358 357 326 327 359 358 327 328 360 359 328 329 361 360 329 330 362 361 330 331 363 362 331 332 364 363 332 333 365 364 333 334 366 365 334 335 367 366 335 336 368 367 336 337 369 368 337 338 370 369 338 339 371 370 339 340 372 371 340 341 373 372 341 342 374 373 342 343 375 374 343 344 376 375 344 345 377 376 345 346 378 377 346 347 379 378 347 348 380 379 348 349 381 380 349 350 382 381 350 351 383 382 351 352 384 383 352 321 353 384 353 354 386 385 354 355 387 386 355 356 388 387 356 357 389 388 357 358 390 389 358 359 391 390 359 360 392 391 360 361 393 392 361 362 394 393 362 363 395 394 363 364 396 395 364 365 397 396 365 366 398 397 366 367 399 398 367 368 400 399 368 369 401 400 369 370 402 401 370 371 403 402 371 372 404 403 372 373 405 404 373 374 406 405 374 375 407 406 375 376 408 407 376 377 409 408 377 378 410 409 378 379 411 410 379 380 412 411 380 381 413 412 381 382 414 413 382 383 415 414 383 384 416 415 384 353 385 416 385 386 418 417 386 387 419 418 387 388 420 419 388 389 421 420 389 390 422 421 390 391 423 422 391 392 424 423 392 393 425 424 393 394 426 425 394 395 427 426 395 396 428 427 396 397 429 428 397 398 430 429 398 399 431 430 399 400 432 431 400 401 433 432 401 402 434 433 402 403 435 434 403 404 436 435 404 405 437 436 405 406 438 437 406 407 439 438 407 408 440 439 408 409 441 440 409 410 442 441 410 411 443 442 411 412 444 443 412 413 445 444 413 414 446 445 414 415 447 446 415 416 448 447 416 385 417 448 417 418 450 449 418 419 451 450 419 420 452 451 420 421 453 452 421 422 454 453 422 423 455 454 423 424 456 455 424 425 457 456 425 426 458 457 426 427 459 458 427 428 460 459 428 429 461 460 429 430 462 461 430 431 463 462 431 432 464 463 432 433 465 464 433 434 466 465 434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 448 480 479 448 417 449 480 449 450 481 450 451 481 451 452 481 452 453 481 453 454 481 454 455 481 455 456 481 456 457 481 457 458 481 458 459 481 459 460 481 460 461 481 461 462 481 462 463 481 463 464 481 464 465 481 465 466 481 466 467 481 467 468 481 468 469 481 469 470 481 470 471 481 471 472 481 472 473 481 473 474 481 474 475 481 475 476 481 476 477 481 477 478 481 478 479 481 479 480 481 480 449 481\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.DeformationExpression.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 5 0.97947615847056058 0 5.7341318670302694 0.96065579873382767 -0.19108631916314192 5.7234939078152189 0.90491797539373253 -0.3748292982432867 5.6903008889068438 0.81440466174310333 -0.5441677975986341 5.6312435479829723 0.69259423366508288 -0.69259423366508277 5.5424622324082566 0.54416779759863421 -0.81440466174310333 5.4216326740999277 0.37482929824328676 -0.90491797539373253 5.2700400864808516 0.191086319163142 -0.96065579873382767 5.0938519553665618 5.9973636354029111e-17 -0.97947615847056058 4.9039264020161522 -0.19108631916314187 -0.96065579873382767 4.7140008486657434 -0.3748292982432867 -0.90491797539373253 4.5378127175514527 -0.54416779759863387 -0.81440466174310355 4.3862201299323775 -0.69259423366508277 -0.69259423366508288 4.2653905716240477 -0.81440466174310344 -0.5441677975986341 4.176609256049332 -0.90491797539373253 -0.37482929824328681 4.1175519151254605 -0.96065579873382767 -0.19108631916314228 4.0843588962170854 -0.97947615847056058 -1.1994727270805822e-16 4.0737209370020349 -0.96065579873382767 0.19108631916314203 4.0843588962170854 -0.90491797539373264 0.37482929824328665 4.1175519151254605 -0.81440466174310355 0.54416779759863387 4.176609256049332 -0.69259423366508299 0.69259423366508277 4.2653905716240477 -0.5441677975986341 0.81440466174310333 4.3862201299323766 -0.37482929824328726 0.90491797539373231 4.5378127175514527 -0.19108631916314234 0.96065579873382756 4.7140008486657425 -1.7992090906208733e-16 0.97947615847056058 4.9039264020161522 0.19108631916314198 0.96065579873382767 5.0938519553665618 0.37482929824328692 0.90491797539373242 5.2700400864808516 0.54416779759863376 0.81440466174310355 5.4216326740999268 0.69259423366508266 0.69259423366508299 5.5424622324082566 0.81440466174310333 0.5441677975986341 5.6312435479829723 0.90491797539373231 0.37482929824328731 5.6903008889068429 0.96065579873382756 0.19108631916314239 5.7234939078152189 1.9165037446636235 0 5.5602336333343629 1.8796786626037532 -0.37389133269154196 5.5720715906705687 1.7706185836759589 -0.73341423114842308 5.5994995370225489 1.5935146255518391 -1.0647524320057096 5.6191396131062463 1.3551727940210598 -1.3551727940210596 5.5962408377373132 1.0647524320057096 -1.5935146255518391 5.494066616162522 0.73341423114842319 -1.7706185836759589 5.2888076034353526 0.37389133269154212 -1.8796786626037532 4.9846383433724606 1.173481331419726e-16 -1.9165037446636235 4.6193976625564339 -0.37389133269154184 -1.8796786626037532 4.2541569817404072 -0.73341423114842297 -1.7706185836759589 3.9499877216775152 -1.0647524320057091 -1.5935146255518395 3.7447287089503463 -1.3551727940210596 -1.3551727940210598 3.6425544873755547 -1.5935146255518393 -1.0647524320057096 3.619655712006622 -1.7706185836759589 -0.7334142311484233 3.639295788090319 -1.8796786626037532 -0.37389133269154262 3.6667237344422992 -1.9165037446636235 -2.3469626628394521e-16 3.6785616917785044 -1.8796786626037532 0.37389133269154218 3.6667237344422992 -1.7706185836759591 0.73341423114842286 3.639295788090319 -1.5935146255518395 1.0647524320057091 3.619655712006622 -1.3551727940210601 1.3551727940210596 3.6425544873755547 -1.0647524320057096 1.5935146255518391 3.7447287089503463 -0.73341423114842408 1.7706185836759585 3.9499877216775143 -0.37389133269154273 1.8796786626037529 4.2541569817404064 -3.5204439942591786e-16 1.9165037446636235 4.6193976625564339 0.37389133269154207 1.8796786626037532 4.9846383433724606 0.73341423114842352 1.7706185836759587 5.2888076034353535 1.0647524320057089 1.5935146255518395 5.4940666161625211 1.3551727940210594 1.3551727940210601 5.5962408377373132 1.5935146255518391 1.0647524320057096 5.6191396131062463 1.7706185836759585 0.73341423114842419 5.5994995370225489 1.8796786626037529 0.37389133269154284 5.5720715906705687 2.7800733139329128 0 4.5110438328061031 2.7266549847472299 -0.54236539804361672 4.5604809508557125 2.5684528336234433 -1.0638879980024369 4.6996208634240197 2.3115464805084511 -1.5445259788332859 4.8953105929294258 1.9658086924777203 -1.9658086924777201 5.0803398673892648 1.5445259788332864 -2.3115464805084511 5.1570030157663016 1.0638879980024369 -2.5684528336234433 5.0315976792617523 0.54236539804361694 -2.7266549847472299 4.6735114353883134 1.7022477221671387e-16 -2.7800733139329128 4.1573480615127263 -0.54236539804361661 -2.7266549847472299 3.6411846876371401 -1.0638879980024367 -2.5684528336234433 3.2830984437636999 -1.5445259788332855 -2.3115464805084516 3.157693107259151 -1.9658086924777201 -1.9658086924777203 3.2343562556361873 -2.3115464805084516 -1.5445259788332859 3.4193855300960267 -2.5684528336234433 -1.0638879980024372 3.6150752596014328 -2.7266549847472299 -0.54236539804361772 3.7542151721697397 -2.7800733139329128 -3.4044954443342775e-16 3.8036522902193495 -2.7266549847472299 0.54236539804361705 3.7542151721697397 -2.5684528336234433 1.0638879980024365 3.6150752596014328 -2.3115464805084516 1.5445259788332855 3.4193855300960267 -1.9658086924777207 1.9658086924777201 3.2343562556361878 -1.5445259788332859 2.3115464805084511 3.157693107259151 -1.0638879980024385 2.5684528336234425 3.283098443763699 -0.54236539804361794 2.7266549847472294 3.6411846876371388 -5.1067431665014159e-16 2.7800733139329128 4.1573480615127254 0.54236539804361694 2.7266549847472299 4.6735114353883134 1.0638879980024374 2.5684528336234429 5.0315976792617532 1.544525978833285 2.3115464805084516 5.1570030157663016 1.9658086924777198 1.9658086924777207 5.0803398673892657 2.3115464805084511 1.5445259788332859 4.8953105929294258 2.5684528336234425 1.0638879980024385 4.6996208634240206 2.7266549847472294 0.54236539804361805 4.5604809508557134 3.5369983720268046 0 3.1503512720824531 3.4690359400940789 -0.69003415136923063 3.2139106932289838 3.2677604024413065 -1.3535506772769523 3.4097006201300095 2.9409066651038609 -1.9650510097368854 3.7348755043179902 2.5010355339059327 -2.5010355339059323 4.1331761179276141 1.9650510097368858 -2.9409066651038609 4.4588170180153446 1.3535506772769526 -3.2677604024413065 4.5120287335762717 0.69003415136923096 -3.4690359400940789 4.1720974268909252 2.1657153399217148e-16 -3.5369983720268046 3.5355339059327378 -0.69003415136923052 -3.4690359400940789 2.8989703849745512 -1.3535506772769521 -3.2677604024413065 2.5590390782892039 -1.9650510097368845 -2.9409066651038618 2.61225079385013 -2.5010355339059323 -2.5010355339059327 2.937891693937861 -2.9409066651038613 -1.9650510097368854 3.3361923075474857 -3.2677604024413065 -1.3535506772769528 3.661367191735466 -3.4690359400940789 -0.69003415136923196 3.8571571186364917 -3.5369983720268046 -4.3314306798434296e-16 3.9207165397830224 -3.4690359400940789 0.69003415136923107 3.8571571186364917 -3.2677604024413069 1.3535506772769519 3.6613671917354664 -2.9409066651038618 1.9650510097368845 3.3361923075474862 -2.5010355339059331 2.5010355339059323 2.9378916939378614 -1.9650510097368854 2.9409066651038609 2.6122507938501305 -1.3535506772769543 3.2677604024413056 2.5590390782892034 -0.69003415136923218 3.4690359400940785 2.8989703849745494 -6.4971460197651439e-16 3.5369983720268046 3.5355339059327373 0.69003415136923085 3.4690359400940789 4.1720974268909252 1.3535506772769532 3.2677604024413061 4.5120287335762717 1.9650510097368843 2.9409066651038618 4.4588170180153455 2.5010355339059318 2.5010355339059331 4.133176117927615 2.9409066651038609 1.9650510097368854 3.7348755043179902 3.2677604024413056 1.3535506772769546 3.4097006201300104 3.4690359400940785 0.6900341513692323 3.2139106932289843 4.158190713451213 0 1.9275285301532326 4.0782922448623564 -0.81122276529167126 1.9722440009433679 3.8416672924360804 -1.5912706946521518 2.1335763927163773 3.4574092203933242 -2.3101669836120364 2.467258408486666 2.9402848509482808 -2.9402848509482804 2.9778020592902656 2.3101669836120369 -3.4574092203933242 3.5167439360563888 1.591270694652152 -3.8416672924360804 3.7776415725503494 0.81122276529167159 -4.0782922448623564 3.5029808925498238 2.5460733840487798e-16 -4.158190713451213 2.7778511650980118 -0.81122276529167103 -4.0782922448623564 2.0527214376461993 -1.5912706946521515 -3.8416672924360804 1.7780607576456733 -2.3101669836120355 -3.4574092203933251 2.038958394139633 -2.9402848509482804 -2.9402848509482808 2.5779002709057566 -3.4574092203933247 -2.3101669836120364 3.0884439217093571 -3.8416672924360804 -1.5912706946521522 3.4221259374796453 -4.0782922448623564 -0.8112227652916727 3.5834583292526547 -4.158190713451213 -5.0921467680975597e-16 3.6281738000427901 -4.0782922448623564 0.8112227652916717 3.5834583292526547 -3.8416672924360808 1.5912706946521513 3.4221259374796458 -3.4574092203933251 2.3101669836120355 3.0884439217093576 -2.9402848509482813 2.9402848509482804 2.5779002709057575 -2.3101669836120364 3.4574092203933242 2.0389583941396334 -1.591270694652154 3.8416672924360795 1.7780607576456733 -0.81122276529167292 4.0782922448623564 2.052721437646198 -7.6382201521463395e-16 4.158190713451213 2.7778511650980104 0.81122276529167148 4.0782922448623564 3.5029808925498234 1.5912706946521527 3.84166729243608 3.7776415725503494 2.3101669836120351 3.4574092203933251 3.5167439360563901 2.94028485094828 2.9402848509482813 2.9778020592902665 3.4574092203933242 2.3101669836120364 2.467258408486666 3.8416672924360795 1.5912706946521542 2.1335763927163778 4.0782922448623564 0.81122276529167314 1.9722440009433679 4.6197782648938777 0 0.91770246999059146 4.5310105209346911 -0.90127402934125678 0.92982118869186348 4.2681185836759594 -1.7679126031752281 1.0104926732102388 3.8412052428350374 -2.5666112871259852 1.2694958310137705 3.2666765386846834 -3.266676538684683 1.7886591982835036 2.5666112871259856 -3.8412052428350374 2.4572363152945411 1.7679126031752284 -4.2681185836759594 2.8940525712680318 0.90127402934125722 -4.5310105209346911 2.6975353848483357 2.8287049082197799e-16 -4.6197782648938777 1.9134171618254494 -0.90127402934125656 -4.5310105209346911 1.1292989388025629 -1.7679126031752277 -4.2681185836759594 0.93278175238286654 -2.5666112871259839 -3.8412052428350387 1.3695980083563559 -3.266676538684683 -3.2666765386846834 2.0381751253673941 -3.8412052428350383 -2.5666112871259852 2.5573384926371285 -4.2681185836759594 -1.7679126031752286 2.8163416504406595 -4.5310105209346911 -0.90127402934125844 2.8970131349590349 -4.6197782648938777 -5.6574098164395597e-16 2.9091318536603068 -4.5310105209346911 0.90127402934125733 2.8970131349590349 -4.2681185836759594 1.7679126031752275 2.8163416504406595 -3.8412052428350387 2.5666112871259839 2.557338492637129 -3.2666765386846839 3.266676538684683 2.038175125367395 -2.5666112871259852 3.8412052428350374 1.3695980083563568 -1.7679126031752306 4.2681185836759576 0.93278175238286709 -0.90127402934125878 4.5310105209346903 1.1292989388025614 -8.4861147246593396e-16 4.6197782648938777 1.9134171618254483 0.90127402934125711 4.5310105209346911 2.6975353848483357 1.767912603175229 4.2681185836759585 2.8940525712680314 2.5666112871259834 3.8412052428350387 2.4572363152945429 3.2666765386846826 3.2666765386846839 1.7886591982835045 3.8412052428350374 2.5666112871259852 1.2694958310137705 4.2681185836759576 1.7679126031752308 1.0104926732102397 4.5310105209346903 0.901274029341259 0.92982118869186359 4.904022475614136 0 -0.0062428149259102783 4.809793058848955 -0.95672732394189219 -0.0198083620531323 4.5307259921952312 -1.8766881533635624 -0.0080929983543645001 4.0775456665218535 -2.7245289095103118 0.17028698079665716 3.4676675475979963 -3.4676675475979954 0.65512438479631008 2.7245289095103122 -4.0775456665218535 1.3805292464135059 1.8766881533635627 -4.5307259921952312 1.9290303739285592 0.95672732394189264 -4.809793058848955 1.7927618496705615 3.0027485414624075e-16 -4.904022475614136 0.97545161008064196 -0.95672732394189197 -4.809793058848955 0.15814137049072197 -1.876688153363562 -4.5307259921952312 0.021872846232723675 -2.7245289095103109 -4.0775456665218552 0.5703739737477761 -3.4676675475979954 -3.4676675475979963 1.2957788353649724 -4.0775456665218544 -2.7245289095103118 1.7806162393646265 -4.5307259921952312 -1.8766881533635629 1.9589962185156478 -4.809793058848955 -0.95672732394189397 1.9707115822144154 -4.904022475614136 -6.005497082924815e-16 1.9571460350871934 -4.809793058848955 0.95672732394189275 1.9707115822144154 -4.5307259921952312 1.8766881533635618 1.9589962185156478 -4.0775456665218552 2.7245289095103109 1.7806162393646272 -3.4676675475979968 3.4676675475979954 1.2957788353649735 -2.7245289095103118 4.0775456665218535 0.57037397374777687 -1.8766881533635651 4.5307259921952303 0.021872846232724674 -0.9567273239418943 4.8097930588489541 0.15814137049072063 -9.0082456243872235e-16 4.904022475614136 0.97545161008064074 0.95672732394189253 4.809793058848955 1.7927618496705615 1.8766881533635635 4.5307259921952303 1.9290303739285592 2.72452890951031 4.0775456665218552 1.3805292464135079 3.467667547597995 3.4676675475979968 0.6551243847963113 4.0775456665218535 2.7245289095103118 0.17028698079665716 4.5307259921952303 1.8766881533635653 -0.0080929983543643891 4.8097930588489541 0.95672732394189453 -0.019808362053132411 5 0 -0.95892427466313812 4.9039264020161522 -0.97545161008064118 -0.98171271891679746 4.6193976625564339 -1.913417161825449 -0.99567942222593664 4.1573480615127263 -2.7778511650980109 -0.84987887763288694 3.5355339059327378 -3.5355339059327373 -0.38383075286612806 2.7778511650980113 -4.1573480615127263 0.35577340660646689 1.9134171618254492 -4.6193976625564339 0.94187741409201675 0.97545161008064163 -4.9039264020161522 0.82795523290297268 3.0615158845559431e-16 -5 6.1230317691118863e-16 -0.97545161008064096 -4.9039264020161522 -0.82795523290297168 -1.9134171618254485 -4.6193976625564339 -0.94187741409201631 -2.77785116509801 -4.1573480615127272 -0.35577340660646745 -3.5355339059327373 -3.5355339059327378 0.38383075286612833 -4.1573480615127263 -2.7778511650980109 0.84987887763288761 -4.6193976625564339 -1.9134171618254494 0.99567942222593731 -4.9039264020161522 -0.97545161008064307 0.98171271891679812 -5 -6.1230317691118863e-16 0.95892427466313879 -4.9039264020161522 0.97545161008064185 0.98171271891679812 -4.6193976625564339 1.9134171618254483 0.99567942222593731 -4.1573480615127272 2.77785116509801 0.84987887763288805 -3.5355339059327386 3.5355339059327373 0.38383075286612955 -2.7778511650980109 4.1573480615127263 -0.35577340660646661 -1.9134171618254516 4.6193976625564321 -0.9418774140920152 -0.97545161008064329 4.9039264020161513 -0.82795523290297302 -9.1845476536678294e-16 5 -6.1230317691118863e-16 0.97545161008064152 4.9039264020161522 0.82795523290297268 1.9134171618254501 4.619397662556433 0.94187741409201642 2.7778511650980091 4.1573480615127272 0.35577340660646894 3.5355339059327369 3.5355339059327386 -0.38383075286612722 4.1573480615127263 2.7778511650980109 -0.84987887763288694 4.6193976625564321 1.9134171618254521 -0.99567942222593642 4.9039264020161513 0.97545161008064363 -0.98171271891679757 4.904022475614136 0 -1.957146035087193 4.809793058848955 -0.95672732394189219 -1.970711582214415 4.5307259921952312 -1.8766881533635624 -1.9589962185156471 4.0775456665218535 -2.7245289095103118 -1.7806162393646254 3.4676675475979963 -3.4676675475979954 -1.2957788353649726 2.7245289095103122 -4.0775456665218535 -0.57037397374777665 1.8766881533635627 -4.5307259921952312 -0.021872846232723231 0.95672732394189264 -4.809793058848955 -0.15814137049072097 3.0027485414624075e-16 -4.904022475614136 -0.97545161008064063 -0.95672732394189197 -4.809793058848955 -1.7927618496705606 -1.876688153363562 -4.5307259921952312 -1.9290303739285588 -2.7245289095103109 -4.0775456665218552 -1.3805292464135066 -3.4676675475979954 -3.4676675475979963 -0.65512438479631019 -4.0775456665218544 -2.7245289095103118 -0.17028698079665594 -4.5307259921952312 -1.8766881533635629 0.0080929983543651662 -4.809793058848955 -0.95672732394189397 0.019808362053132966 -4.904022475614136 -6.005497082924815e-16 0.0062428149259109444 -4.809793058848955 0.95672732394189275 0.019808362053132966 -4.5307259921952312 1.8766881533635618 0.0080929983543651662 -4.0775456665218552 2.7245289095103109 -0.17028698079665539 -3.4676675475979968 3.4676675475979954 -0.65512438479630897 -2.7245289095103118 4.0775456665218535 -1.3805292464135057 -1.8766881533635651 4.5307259921952303 -1.9290303739285579 -0.9567273239418943 4.8097930588489541 -1.792761849670562 -9.0082456243872235e-16 4.904022475614136 -0.97545161008064185 0.95672732394189253 4.809793058848955 -0.15814137049072108 1.8766881533635635 4.5307259921952303 -0.021872846232723453 2.72452890951031 4.0775456665218552 -0.57037397374777465 3.467667547597995 3.4676675475979968 -1.2957788353649713 4.0775456665218535 2.7245289095103118 -1.7806162393646254 4.5307259921952303 1.8766881533635653 -1.9589962185156469 4.8097930588489541 0.95672732394189453 -1.970711582214415 4.6197782648938777 0 -2.9091318536603064 4.5310105209346911 -0.90127402934125678 -2.8970131349590345 4.2681185836759594 -1.7679126031752281 -2.8163416504406591 3.8412052428350374 -2.5666112871259852 -2.5573384926371272 3.2666765386846834 -3.266676538684683 -2.0381751253673941 2.5666112871259856 -3.8412052428350374 -1.3695980083563566 1.7679126031752284 -4.2681185836759594 -0.93278175238286598 0.90127402934125722 -4.5310105209346911 -1.1292989388025618 2.8287049082197799e-16 -4.6197782648938777 -1.9134171618254483 -0.90127402934125656 -4.5310105209346911 -2.6975353848483348 -1.7679126031752277 -4.2681185836759594 -2.8940525712680314 -2.5666112871259839 -3.8412052428350387 -2.457236315294542 -3.266676538684683 -3.2666765386846834 -1.7886591982835034 -3.8412052428350383 -2.5666112871259852 -1.2694958310137689 -4.2681185836759594 -1.7679126031752286 -1.0104926732102382 -4.5310105209346911 -0.90127402934125844 -0.92982118869186281 -4.6197782648938777 -5.6574098164395597e-16 -0.9177024699905908 -4.5310105209346911 0.90127402934125733 -0.92982118869186281 -4.2681185836759594 1.7679126031752275 -1.0104926732102382 -3.8412052428350387 2.5666112871259839 -1.2694958310137687 -3.2666765386846839 3.266676538684683 -1.7886591982835025 -2.5666112871259852 3.8412052428350374 -2.4572363152945407 -1.7679126031752306 4.2681185836759576 -2.8940525712680305 -0.90127402934125878 4.5310105209346903 -2.6975353848483361 -8.4861147246593396e-16 4.6197782648938777 -1.9134171618254494 0.90127402934125711 4.5310105209346911 -1.1292989388025618 1.767912603175229 4.2681185836759585 -0.93278175238286609 2.5666112871259834 3.8412052428350387 -1.3695980083563548 3.2666765386846826 3.2666765386846839 -2.0381751253673932 3.8412052428350374 2.5666112871259852 -2.5573384926371272 4.2681185836759576 1.7679126031752308 -2.8163416504406582 4.5310105209346903 0.901274029341259 -2.897013134959034 4.1581907134512148 0 -3.6281738000427897 4.0782922448623582 -0.81122276529167159 -3.5834583292526547 3.8416672924360822 -1.5912706946521524 -3.4221259374796453 3.4574092203933255 -2.3101669836120373 -3.0884439217093567 2.9402848509482822 -2.9402848509482817 -2.577900270905757 2.3101669836120378 -3.4574092203933255 -2.038958394139633 1.5912706946521527 -3.8416672924360822 -1.778060757645672 0.81122276529167192 -4.0782922448623582 -2.0527214376461975 2.5460733840487808e-16 -4.1581907134512148 -2.7778511650980096 -0.81122276529167137 -4.0782922448623582 -3.5029808925498225 -1.5912706946521522 -3.8416672924360822 -3.777641572550348 -2.3101669836120364 -3.4574092203933264 -3.5167439360563879 -2.9402848509482817 -2.9402848509482822 -2.9778020592902634 -3.457409220393326 -2.3101669836120373 -2.4672584084866629 -3.8416672924360822 -1.5912706946521529 -2.1335763927163747 -4.0782922448623582 -0.81122276529167303 -1.9722440009433653 -4.1581907134512148 -5.0921467680975617e-16 -1.9275285301532303 -4.0782922448623582 0.81122276529167203 -1.9722440009433653 -3.8416672924360826 1.591270694652152 -2.1335763927163742 -3.4574092203933264 2.3101669836120364 -2.4672584084866624 -2.9402848509482826 2.9402848509482817 -2.977802059290263 -2.3101669836120373 3.4574092203933255 -3.516743936056387 -1.5912706946521546 3.8416672924360813 -3.777641572550348 -0.81122276529167325 4.0782922448623582 -3.5029808925498234 -7.6382201521463425e-16 4.1581907134512148 -2.7778511650980109 0.81122276529167181 4.0782922448623582 -2.0527214376461975 1.5912706946521533 3.8416672924360817 -1.778060757645672 2.310166983612036 3.4574092203933264 -2.0389583941396321 2.9402848509482813 2.9402848509482826 -2.5779002709057561 3.4574092203933255 2.3101669836120373 -3.0884439217093567 3.8416672924360813 1.5912706946521549 -3.4221259374796449 4.0782922448623582 0.81122276529167348 -3.5834583292526547 3.536998372026805 0 -3.9207165397830224 3.4690359400940793 -0.69003415136923074 -3.8571571186364917 3.2677604024413069 -1.3535506772769526 -3.661367191735466 2.9409066651038613 -1.9650510097368856 -3.3361923075474853 2.5010355339059331 -2.5010355339059327 -2.9378916939378614 1.9650510097368861 -2.9409066651038613 -2.61225079385013 1.3535506772769528 -3.2677604024413069 -2.5590390782892034 0.69003415136923107 -3.4690359400940793 -2.8989703849745503 2.165715339921715e-16 -3.536998372026805 -3.5355339059327373 -0.69003415136923052 -3.4690359400940793 -4.1720974268909243 -1.3535506772769523 -3.2677604024413069 -4.5120287335762708 -1.9650510097368847 -2.9409066651038618 -4.4588170180153446 -2.5010355339059327 -2.5010355339059331 -4.1331761179276141 -2.9409066651038618 -1.9650510097368856 -3.7348755043179889 -3.2677604024413069 -1.353550677276953 -3.4097006201300086 -3.4690359400940793 -0.69003415136923207 -3.2139106932289829 -3.536998372026805 -4.3314306798434301e-16 -3.1503512720824522 -3.4690359400940793 0.69003415136923119 -3.2139106932289829 -3.2677604024413074 1.3535506772769521 -3.4097006201300082 -2.9409066651038618 1.9650510097368847 -3.7348755043179889 -2.5010355339059336 2.5010355339059327 -4.1331761179276132 -1.9650510097368856 2.9409066651038613 -4.4588170180153446 -1.3535506772769546 3.2677604024413061 -4.5120287335762717 -0.6900341513692323 3.4690359400940789 -4.1720974268909252 -6.4971460197651449e-16 3.536998372026805 -3.5355339059327378 0.69003415136923096 3.4690359400940793 -2.8989703849745503 1.3535506772769532 3.2677604024413065 -2.559039078289203 1.9650510097368845 2.9409066651038618 -2.6122507938501296 2.5010355339059323 2.5010355339059336 -2.9378916939378605 2.9409066651038613 1.9650510097368856 -3.3361923075474853 3.2677604024413061 1.3535506772769546 -3.6613671917354651 3.4690359400940789 0.69003415136923241 -3.8571571186364912 2.7800733139329128 0 -3.8036522902193495 2.7266549847472299 -0.54236539804361672 -3.7542151721697397 2.5684528336234433 -1.0638879980024369 -3.6150752596014328 2.3115464805084511 -1.5445259788332859 -3.4193855300960267 1.9658086924777203 -1.9658086924777201 -3.2343562556361873 1.5445259788332864 -2.3115464805084511 -3.157693107259151 1.0638879980024369 -2.5684528336234433 -3.2830984437636999 0.54236539804361694 -2.7266549847472299 -3.6411846876371396 1.7022477221671387e-16 -2.7800733139329128 -4.1573480615127263 -0.54236539804361661 -2.7266549847472299 -4.6735114353883125 -1.0638879980024367 -2.5684528336234433 -5.0315976792617523 -1.5445259788332855 -2.3115464805084516 -5.1570030157663016 -1.9658086924777201 -1.9658086924777203 -5.0803398673892648 -2.3115464805084516 -1.5445259788332859 -4.8953105929294258 -2.5684528336234433 -1.0638879980024372 -4.6996208634240197 -2.7266549847472299 -0.54236539804361772 -4.5604809508557125 -2.7800733139329128 -3.4044954443342775e-16 -4.5110438328061031 -2.7266549847472299 0.54236539804361705 -4.5604809508557125 -2.5684528336234433 1.0638879980024365 -4.6996208634240197 -2.3115464805084516 1.5445259788332855 -4.8953105929294258 -1.9658086924777207 1.9658086924777201 -5.0803398673892648 -1.5445259788332859 2.3115464805084511 -5.1570030157663016 -1.0638879980024385 2.5684528336234425 -5.0315976792617532 -0.54236539804361794 2.7266549847472294 -4.6735114353883134 -5.1067431665014159e-16 2.7800733139329128 -4.1573480615127272 0.54236539804361694 2.7266549847472299 -3.6411846876371396 1.0638879980024374 2.5684528336234429 -3.2830984437636994 1.544525978833285 2.3115464805084516 -3.157693107259151 1.9658086924777198 1.9658086924777207 -3.2343562556361873 2.3115464805084511 1.5445259788332859 -3.4193855300960267 2.5684528336234425 1.0638879980024385 -3.6150752596014324 2.7266549847472294 0.54236539804361805 -3.7542151721697392 1.9165037446636239 0 -3.6785616917785049 1.8796786626037536 -0.37389133269154201 -3.6667237344422992 1.7706185836759594 -0.73341423114842319 -3.639295788090319 1.5935146255518395 -1.0647524320057098 -3.619655712006622 1.3551727940210603 -1.3551727940210601 -3.6425544873755547 1.06475243200571 -1.5935146255518395 -3.7447287089503458 0.7334142311484233 -1.7706185836759594 -3.9499877216775152 0.37389133269154218 -1.8796786626037536 -4.2541569817404072 1.1734813314197265e-16 -1.9165037446636239 -4.6193976625564339 -0.3738913326915419 -1.8796786626037536 -4.9846383433724606 -0.73341423114842308 -1.7706185836759594 -5.2888076034353526 -1.0647524320057093 -1.59351462555184 -5.494066616162522 -1.3551727940210601 -1.3551727940210603 -5.5962408377373132 -1.5935146255518398 -1.0647524320057098 -5.6191396131062463 -1.7706185836759594 -0.73341423114842341 -5.5994995370225489 -1.8796786626037536 -0.37389133269154273 -5.5720715906705687 -1.9165037446636239 -2.3469626628394531e-16 -5.5602336333343629 -1.8796786626037536 0.37389133269154223 -5.5720715906705687 -1.7706185836759596 0.73341423114842297 -5.5994995370225489 -1.59351462555184 1.0647524320057093 -5.6191396131062463 -1.3551727940210603 1.3551727940210601 -5.5962408377373132 -1.0647524320057098 1.5935146255518395 -5.494066616162522 -0.7334142311484243 1.7706185836759589 -5.2888076034353535 -0.37389133269154284 1.8796786626037534 -4.9846383433724615 -3.5204439942591791e-16 1.9165037446636239 -4.6193976625564339 0.37389133269154212 1.8796786626037536 -4.2541569817404072 0.73341423114842363 1.7706185836759591 -3.9499877216775148 1.0647524320057091 1.59351462555184 -3.7447287089503463 1.3551727940210598 1.3551727940210603 -3.6425544873755547 1.5935146255518395 1.0647524320057098 -3.619655712006622 1.7706185836759589 0.73341423114842441 -3.639295788090319 1.8796786626037534 0.37389133269154295 -3.6667237344422992 0.97947615847056235 0 -4.0737209370020331 0.96065579873382945 -0.19108631916314228 -4.0843588962170845 0.9049179753937342 -0.37482929824328742 -4.1175519151254596 0.81440466174310489 -0.54416779759863509 -4.1766092560493311 0.6925942336650841 -0.69259423366508399 -4.2653905716240459 0.54416779759863521 -0.81440466174310489 -4.3862201299323758 0.37482929824328748 -0.9049179753937342 -4.5378127175514518 0.19108631916314237 -0.96065579873382945 -4.7140008486657425 5.9973636354029222e-17 -0.97947615847056235 -4.9039264020161522 -0.19108631916314223 -0.96065579873382945 -5.0938519553665618 -0.37482929824328737 -0.9049179753937342 -5.2700400864808525 -0.54416779759863487 -0.81440466174310511 -5.4216326740999277 -0.69259423366508399 -0.6925942336650841 -5.5424622324082575 -0.814404661743105 -0.54416779759863509 -5.6312435479829732 -0.9049179753937342 -0.37482929824328753 -5.6903008889068447 -0.96065579873382945 -0.19108631916314262 -5.7234939078152198 -0.97947615847056235 -1.1994727270805844e-16 -5.7341318670302712 -0.96065579873382945 0.19108631916314239 -5.7234939078152198 -0.90491797539373431 0.37482929824328731 -5.6903008889068447 -0.81440466174310511 0.54416779759863487 -5.6312435479829732 -0.69259423366508421 0.69259423366508399 -5.5424622324082584 -0.54416779759863509 0.81440466174310489 -5.4216326740999286 -0.37482929824328798 0.90491797539373398 -5.2700400864808525 -0.19108631916314267 0.96065579873382934 -5.0938519553665618 -1.7992090906208765e-16 0.97947615847056235 -4.9039264020161522 0.19108631916314234 0.96065579873382945 -4.7140008486657425 0.37482929824328765 0.90491797539373409 -4.5378127175514518 0.54416779759863476 0.81440466174310511 -4.3862201299323766 0.69259423366508388 0.69259423366508421 -4.2653905716240468 0.81440466174310489 0.54416779759863509 -4.1766092560493311 0.90491797539373398 0.37482929824328803 -4.1175519151254596 0.96065579873382934 0.19108631916314273 -4.0843588962170845 0 0 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 39 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63 67 68 66 70 71 69 73 74 72 76 77 75 79 80 78 82 83 81 85 86 84 88 89 87 91 92 90 94 95 93 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1888 1892 1893 1891 1895 1896 1894 1898 1899 1897 1901 1902 1900 1904 1905 1903 1907 1908 1906 1910 1911 1909 1913 1914 1912 1916 1917 1915 1919 1920 1918 1922 1923 1921 1925 1926 1924 1928 1929 1927 1931 1932 1930 1934 1935 1933 1937 1938 1936 1940 1941 1939 1943 1944 1942 1946 1947 1945 1949 1950 1948 1952 1953 1951 1955 1956 1954 1958 1959 1957 1961 1962 1960 1964 1965 1963 1967 1968 1966 1970 1971 1969 1973 1974 1972 1976 1977 1975 1979 1980 1978 1982 1983 1981</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1891 1894 1897 1900 1903 1906 1909 1912 1915 1918 1921 1924 1927 1930 1933 1936 1939 1942 1945 1948 1951 1954 1957 1960 1963 1966 1969 1972 1975 1978 1981</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">2 1 0 3 2 0 4 3 0 5 4 0 6 5 0 7 6 0 8 7 0 9 8 0 10 9 0 11 10 0 12 11 0 13 12 0 14 13 0 15 14 0 16 15 0 17 16 0 18 17 0 19 18 0 20 19 0 21 20 0 22 21 0 23 22 0 24 23 0 25 24 0 26 25 0 27 26 0 28 27 0 29 28 0 30 29 0 31 30 0 32 31 0 1 32 0 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 32 64 63 32 1 33 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 64 96 95 64 33 65 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 96 128 127 96 65 97 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 128 160 159 128 97 129 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 160 192 191 160 129 161 192 161 162 194 193 162 163 195 194 163 164 196 195 164 165 197 196 165 166 198 197 166 167 199 198 167 168 200 199 168 169 201 200 169 170 202 201 170 171 203 202 171 172 204 203 172 173 205 204 173 174 206 205 174 175 207 206 175 176 208 207 176 177 209 208 177 178 210 209 178 179 211 210 179 180 212 211 180 181 213 212 181 182 214 213 182 183 215 214 183 184 216 215 184 185 217 216 185 186 218 217 186 187 219 218 187 188 220 219 188 189 221 220 189 190 222 221 190 191 223 222 191 192 224 223 192 161 193 224 193 194 226 225 194 195 227 226 195 196 228 227 196 197 229 228 197 198 230 229 198 199 231 230 199 200 232 231 200 201 233 232 201 202 234 233 202 203 235 234 203 204 236 235 204 205 237 236 205 206 238 237 206 207 239 238 207 208 240 239 208 209 241 240 209 210 242 241 210 211 243 242 211 212 244 243 212 213 245 244 213 214 246 245 214 215 247 246 215 216 248 247 216 217 249 248 217 218 250 249 218 219 251 250 219 220 252 251 220 221 253 252 221 222 254 253 222 223 255 254 223 224 256 255 224 193 225 256 225 226 258 257 226 227 259 258 227 228 260 259 228 229 261 260 229 230 262 261 230 231 263 262 231 232 264 263 232 233 265 264 233 234 266 265 234 235 267 266 235 236 268 267 236 237 269 268 237 238 270 269 238 239 271 270 239 240 272 271 240 241 273 272 241 242 274 273 242 243 275 274 243 244 276 275 244 245 277 276 245 246 278 277 246 247 279 278 247 248 280 279 248 249 281 280 249 250 282 281 250 251 283 282 251 252 284 283 252 253 285 284 253 254 286 285 254 255 287 286 255 256 288 287 256 225 257 288 257 258 290 289 258 259 291 290 259 260 292 291 260 261 293 292 261 262 294 293 262 263 295 294 263 264 296 295 264 265 297 296 265 266 298 297 266 267 299 298 267 268 300 299 268 269 301 300 269 270 302 301 270 271 303 302 271 272 304 303 272 273 305 304 273 274 306 305 274 275 307 306 275 276 308 307 276 277 309 308 277 278 310 309 278 279 311 310 279 280 312 311 280 281 313 312 281 282 314 313 282 283 315 314 283 284 316 315 284 285 317 316 285 286 318 317 286 287 319 318 287 288 320 319 288 257 289 320 289 290 322 321 290 291 323 322 291 292 324 323 292 293 325 324 293 294 326 325 294 295 327 326 295 296 328 327 296 297 329 328 297 298 330 329 298 299 331 330 299 300 332 331 300 301 333 332 301 302 334 333 302 303 335 334 303 304 336 335 304 305 337 336 305 306 338 337 306 307 339 338 307 308 340 339 308 309 341 340 309 310 342 341 310 311 343 342 311 312 344 343 312 313 345 344 313 314 346 345 314 315 347 346 315 316 348 347 316 317 349 348 317 318 350 349 318 319 351 350 319 320 352 351 320 289 321 352 321 322 354 353 322 323 355 354 323 324 356 355 324 325 357 356 325 326 358 357 326 327 359 358 327 328 360 359 328 329 361 360 329 330 362 361 330 331 363 362 331 332 364 363 332 333 365 364 333 334 366 365 334 335 367 366 335 336 368 367 336 337 369 368 337 338 370 369 338 339 371 370 339 340 372 371 340 341 373 372 341 342 374 373 342 343 375 374 343 344 376 375 344 345 377 376 345 346 378 377 346 347 379 378 347 348 380 379 348 349 381 380 349 350 382 381 350 351 383 382 351 352 384 383 352 321 353 384 353 354 386 385 354 355 387 386 355 356 388 387 356 357 389 388 357 358 390 389 358 359 391 390 359 360 392 391 360 361 393 392 361 362 394 393 362 363 395 394 363 364 396 395 364 365 397 396 365 366 398 397 366 367 399 398 367 368 400 399 368 369 401 400 369 370 402 401 370 371 403 402 371 372 404 403 372 373 405 404 373 374 406 405 374 375 407 406 375 376 408 407 376 377 409 408 377 378 410 409 378 379 411 410 379 380 412 411 380 381 413 412 381 382 414 413 382 383 415 414 383 384 416 415 384 353 385 416 385 386 418 417 386 387 419 418 387 388 420 419 388 389 421 420 389 390 422 421 390 391 423 422 391 392 424 423 392 393 425 424 393 394 426 425 394 395 427 426 395 396 428 427 396 397 429 428 397 398 430 429 398 399 431 430 399 400 432 431 400 401 433 432 401 402 434 433 402 403 435 434 403 404 436 435 404 405 437 436 405 406 438 437 406 407 439 438 407 408 440 439 408 409 441 440 409 410 442 441 410 411 443 442 411 412 444 443 412 413 445 444 413 414 446 445 414 415 447 446 415 416 448 447 416 385 417 448 417 418 450 449 418 419 451 450 419 420 452 451 420 421 453 452 421 422 454 453 422 423 455 454 423 424 456 455 424 425 457 456 425 426 458 457 426 427 459 458 427 428 460 459 428 429 461 460 429 430 462 461 430 431 463 462 431 432 464 463 432 433 465 464 433 434 466 465 434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 448 480 479 448 417 449 480 449 450 481 450 451 481 451 452 481 452 453 481 453 454 481 454 455 481 455 456 481 456 457 481 457 458 481 458 459 481 459 460 481 460 461 481 461 462 481 462 463 481 463 464 481 464 465 481 465 466 481 466 467 481 467 468 481 468 469 481 469 470 481 470 471 481 471 472 481 472 473 481 473 474 481 474 475 481 475 476 481 476 477 481 477 478 481 478 479 481 479 480 481 480 449 481\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.DeleteComponents.complex.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-7.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 -7.5 2.5 -7.5 -7.5 2.5 -7.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -7.5 -2.5 -6.25 -3.75 0 -3.75 -3.75 0 -3.75 -6.25 0 -6.25 -6.25 0 -6.25 -3.75 2.5 -6.25 -6.25 2.5 -3.75 -3.75 2.5 -3.75 -6.25 2.5 0.0050000000000000001 5 7.5 -0.0024999999999999988 4.995669872981078 7.5 -0.0025000000000000022 5.004330127018922 7.5 5 5 -2.5 -2.4999999999999991 0.66987298107780635 -2.5 -2.5000000000000022 9.330127018922191 -2.5 10 -5 5 6.5450849718747373 -9.7552825814757682 5 0.95491502812526363 -7.9389262614623668 5 0.95491502812526186 -2.061073738537635 5 6.5450849718747364 -0.24471741852423179 5 10 -5 0 6.5450849718747373 -9.7552825814757682 0 0.95491502812526363 -7.9389262614623668 0 0.95491502812526186 -2.061073738537635 0 6.5450849718747364 -0.24471741852423179 0 10 -5 -5 6.5450849718747373 -9.7552825814757682 -5 0.95491502812526363 -7.9389262614623668 -5 0.95491502812526186 -2.061073738537635 -5 6.5450849718747364 -0.24471741852423179 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 12 9 14 15 16 13 18 19 20 17 22 23 21 25 26 27 24 29 30 31 28 33 34 35 32</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 8 9</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 2 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 13 17 21 24 28 32</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">6 4 5 4 3 0 3 6 2 2 6 5 1 5 4 0 1 0 3 2 1 12 13 14 12 14 9 10 8 13 11 7 9 8 7 10\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 2 3 4 6 7 8 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 32 33 34 35 40 41 42 43 44 45 46 47</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 9 10</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 2 3 4 6 7 8 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 32 33 34 35 40 41 42 43 44 45 46 47</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 12 16 17 15</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 15</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">15 16 19 18 16 17 20 19 17 15 18 20 15 17 16 18 19 20\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 36 32 38 39 40 41 37</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 37</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">21 22 27 26 22 23 28 27 23 24 29 28 24 25 30 29 25 21 26 30 26 27 32 31 28 29 34 33 30 26 31 35 21 25 24 23 22 31 32 33 34 35\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 28 29 30 31 36 37 38 39 40 41 42 43 44 45 46 47 48 49</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 9 10 11</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 28 29 30 31 36 37 38 39 40 41 42 43 44 45 46 47 48 49</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.DeleteComponents.edge.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>3 5 0 1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 1 1 0 -1 1 0 -3 1 0 -5 1 0 5 -1 -0 3 -1 -0 1 -1 -0 -1 -1 0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 1 -3 -0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 28 32 33 34 31 36 37 38 35 40 41 42 39 44 45 46 43 48 49 50 47 52 53 54 51 56 57 58 55 60 61 62 59 64 65 66 63 68 69 70 67 72 73 74 71 76 77 78 75 80 81 82 79 84 85 86 83 88 89 90 87</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 31 35 39 43 47 51 55 59 63 67 71 75 79 83 87</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 8 7 2 3 9 8 3 4 10 9 5 6 12 11 6 7 13 12 7 8 14 13 9 15 14 9 10 16 15 11 12 18 17 12 13 19 18 14 15 21 20 15 16 22 21 17 18 24 23 18 19 25 24 19 20 26 25 20 21 27 26 21 22 28 27 23 24 30 29 24 25 31 30 25 26 32 31 26 27 33 32 27 28 34 33\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">1 2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.DeleteComponents.face.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 1 1 0 -1 1 0 -3 1 0 -5 1 0 5 -1 -0 3 -1 -0 1 -1 -0 -1 -1 0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 1 -3 -0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 8 7 2 3 9 8 4 5 11 10 5 6 12 11 6 7 13 12 7 8 14 13 8 9 15 14 10 11 17 16 11 12 18 17 13 14 20 19 14 15 21 20 16 17 23 22 17 18 24 23 18 19 25 24 19 20 26 25 20 21 27 26 22 23 29 28 23 24 30 29 24 25 31 30 25 26 32 31 26 27 33 32\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.DeleteComponents.point.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 -1 1 0 -3 1 0 -5 1 0 5 -1 -0 3 -1 -0 1 -1 -0 -1 -1 0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 1 -3 -0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">2 3 4 5 6 7 8 9 10 11 12 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 6 3 8 9 10 7 12 13 14 11 16 17 18 15 20 21 19 23 24 22 26 27 28 25 30 31 32 29 34 35 36 33 38 39 37 41 42 40 44 45 46 43 48 49 50 47 52 53 54 51 56 57 58 55 60 61 62 59 64 65 66 63 68 69 70 67 72 73 74 71 76 77 78 75 80 81 82 79 84 85 86 83 88 89 90 87</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 7 11 15 19 22 25 29 33 37 40 43 47 51 55 59 63 67 71 75 79 83 87</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 6 5 0 1 7 6 1 2 8 7 2 3 9 8 4 5 11 10 5 6 11 6 7 12 7 8 13 12 8 9 14 13 10 11 16 15 11 17 16 12 18 17 12 13 19 18 13 14 20 19 15 16 22 21 16 17 23 22 17 18 24 23 18 19 25 24 19 20 26 25 21 22 28 27 22 23 29 28 23 24 30 29 24 25 31 30 25 26 32 31\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.EdgesToBlobby.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">-2.5 2.5 2.5 2.5 2.5 2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -2.5 2.5 2.5 -2.5 -2.5 2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -2.5 2.5 2.5 -2.5 2.5 -2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 2.5 2.5 2.5 2.5 -2.5 2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 2.5 2.5 2.5 2.5 2.5 -2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 2.5 -2.5 2.5 -2.5 -2.5 2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 2.5 -2.5 2.5 2.5 -2.5 -2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -2.5 -2.5 2.5 -2.5 -2.5 -2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -2.5 2.5 -2.5 2.5 2.5 -2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 2.5 2.5 -2.5 2.5 -2.5 -2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 2.5 -2.5 -2.5 -2.5 -2.5 -2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\">12 0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\">13</array>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">12</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0 23 46 69 92 115 138 161 184 207 230 253</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">23 23 23 23 23 23 23 23 23 23 23 23</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.EulerKillEdgeAndVertex.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 3 5 0 1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 1 1 0 -3 1 0 -5 1 0 5 -1 -0 3 -1 -0 1 -1 -0 -1 -1 0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 1 -3 -0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 48 52 53 51 55 56 57 54 59 60 61 58 63 64 65 62 67 68 69 66 71 72 73 70 75 76 77 74 79 80 81 78 83 84 85 82 87 88 89 86 91 92 93 90 95 96 97 94</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 49 51 54 58 62 66 70 74 78 82 86 90 94</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 8 7 2 3 9 8 3 4 10 9 4 5 11 10 6 7 13 12 7 8 14 13 8 9 20 14 9 10 15 20 10 11 16 15 12 13 18 17 13 14 19 18 14 20 19 20 15 21 15 16 22 21 17 18 24 23 18 19 25 24 19 20 26 25 20 21 27 26 21 22 28 27 23 24 30 29 24 25 31 30 25 26 32 31 26 27 33 32 27 28 34 33\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.EulerKillEdgeMakeLoop.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 1.6666666666666665 5 0 -1.6666666666666665 5 0 -5 5 0 5 1.6666666666666665 0 1.6666666666666665 1.6666666666666665 0 -1.6666666666666665 1.6666666666666665 0 -5 1.6666666666666665 0 5 -1.6666666666666665 -0 1.6666666666666665 -1.6666666666666665 -0 -1.6666666666666665 -1.6666666666666665 0 -5 -1.6666666666666665 0 5 -5 -0 1.6666666666666665 -5 -0 -1.6666666666666665 -5 0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">2 0 4 6 5 12 16 1 9 10 11 8 18 3 15 7 13 14 19 17</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 2</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">2 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">17 13 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 4 1 6 2 3 5 8 5 6 10 9 7 10 13 12 9 14 11 15\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 3 4 6 8 9 13 15 16 17 18 19 21 23 26 27 28 30 33 34</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 3 4 6 8 9 13 15 16 17 18 19 21 23 26 27 28 30 33 34</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.ExtrudeFaces.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 1.6666666666666665 5 0 -1.6666666666666665 5 0 -5 5 0 5 1.6666666666666665 0 1.6666666666666665 1.6666666666666665 0 -1.6666666666666665 1.6666666666666665 0 -5 1.6666666666666665 0 5 -1.6666666666666665 -0 1.6666666666666665 -1.6666666666666665 -0 -1.6666666666666665 -1.6666666666666665 0 -5 -1.6666666666666665 0 5 -5 -0 1.6666666666666665 -5 -0 -1.6666666666666665 -5 0 -5 -5 0 1.6666666666666665 1.6666666666666665 5 -1.6666666666666665 1.6666666666666665 5 -1.6666666666666665 -1.6666666666666665 5 1.6666666666666665 -1.6666666666666665 5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 5 6 10 9</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 1 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 4 5 9 8 16 17 18 19 6 7 11 10 8 9 13 12 9 10 14 13 10 11 15 14 17 16 5 6 18 17 6 10 19 18 10 9 16 19 9 5\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 16 16 16 16 17 17 17 17 18 18 18 18 19 19 19 19</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 4 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 17 16 16 17 18 17 17 18 19 18 18 19 16 19 19 16</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.LinearPointNoise.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0.50383647026077572 3 5 0.41940758593993238 1 5 0.077895468529510972 -1 5 -0.31601717992562417 -3 5 -0.50351830451488133 -5 5 -0.55090535866954538 5 3 0.44783925211310943 3 3 0.37556934682253607 1 3 0.099125002467841367 -1 3 -0.25518864577117611 -3 3 -0.47994728507911943 -5 3 -0.61137236603535561 5 1 0.18476583393684923 3 1 0.22459727152680004 1 1 0.16701534115251079 -1 1 -0.018487075321228289 -3 1 -0.22824690890164942 -5 1 -0.42961177121410454 5 -1 -0.056789188488687872 3 -1 0.092813800657695886 1 -1 0.22503452565880563 -1 -1 0.19220899280923243 -3 -1 0.020197524352702716 -5 -1 -0.20084395105098077 5 -3 -0.261932327596686 3 -3 -0.031324453180576334 1 -3 0.23443926409545029 -1 -3 0.31118469207594701 -3 -3 0.17367619148982019 -5 -3 -0.046000295443876037 5 -5 -0.44473681328112946 3 -5 -0.18264779682292101 1 -5 0.13635669078247331 -1 -5 0.25771698190622527 -3 -5 0.13496766590361783 -5 -5 -0.078250674172081605</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 8 7 2 3 9 8 3 4 10 9 4 5 11 10 6 7 13 12 7 8 14 13 8 9 15 14 9 10 16 15 10 11 17 16 12 13 19 18 13 14 20 19 14 15 21 20 15 16 22 21 16 17 23 22 18 19 25 24 19 20 26 25 20 21 27 26 21 22 28 27 22 23 29 28 24 25 31 30 25 26 32 31 26 27 33 32 27 28 34 33 28 29 35 34\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.LinearWavePoints.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 4.2862637970157361e-16 -5 5 -5 -6.1232339957367663e-16 5 -7.9602041944577945e-16 5 5 5.3826834323650896 0 4.375 0.38268343236509017 -5 4.375 -4.6173165676349104 -6.1232339957367663e-16 4.375 0.38268343236508889 5 4.375 5.7071067811865479 0 3.75 0.70710678118654791 -5 3.75 -4.2928932188134521 -6.1232339957367663e-16 3.75 0.70710678118654668 5 3.75 5.923879532511287 0 3.125 0.92387953251128707 -5 3.125 -4.076120467488713 -6.1232339957367663e-16 3.125 0.92387953251128585 5 3.125 6 0 2.5 1.0000000000000002 -5 2.5 -4 -6.1232339957367663e-16 2.5 0.99999999999999911 5 2.5 5.923879532511287 0 1.875 0.92387953251128707 -5 1.875 -4.076120467488713 -6.1232339957367663e-16 1.875 0.92387953251128585 5 1.875 5.7071067811865479 0 1.25 0.70710678118654779 -5 1.25 -4.2928932188134521 -6.1232339957367663e-16 1.25 0.70710678118654657 5 1.25 5.3826834323650896 0 0.625 0.38268343236509011 -5 0.625 -4.6173165676349104 -6.1232339957367663e-16 0.625 0.38268343236508884 5 0.625 5 0 0 3.0616169978683831e-16 -5 0 -5 -6.1232339957367663e-16 0 -9.1848509936051479e-16 5 0 4.6173165676349104 0 -0.625 -0.38268343236508945 -5 -0.625 -5.3826834323650896 -6.1232339957367663e-16 -0.625 -0.38268343236509073 5 -0.625 4.2928932188134521 0 -1.25 -0.70710678118654713 -5 -1.25 -5.7071067811865479 -6.1232339957367663e-16 -1.25 -0.70710678118654835 5 -1.25 4.076120467488713 0 -1.875 -0.92387953251128641 -5 -1.875 -5.923879532511287 -6.1232339957367663e-16 -1.875 -0.92387953251128763 5 -1.875 4 0 -2.5 -0.99999999999999967 -5 -2.5 -6 -6.1232339957367663e-16 -2.5 -1.0000000000000009 5 -2.5 4.076120467488713 0 -3.125 -0.92387953251128641 -5 -3.125 -5.923879532511287 -6.1232339957367663e-16 -3.125 -0.92387953251128763 5 -3.125 4.2928932188134521 0 -3.75 -0.70710678118654724 -5 -3.75 -5.7071067811865479 -6.1232339957367663e-16 -3.75 -0.70710678118654846 5 -3.75 4.6173165676349104 0 -4.375 -0.3826834323650895 -5 -4.375 -5.3826834323650896 -6.1232339957367663e-16 -4.375 -0.38268343236509078 5 -4.375 5 0 -5 1.8369701987210299e-16 -5 -5 -5 -6.1232339957367663e-16 -5 -1.0409497792752501e-15 5 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 4 5 9 8 5 6 10 9 6 7 11 10 7 4 8 11 8 9 13 12 9 10 14 13 10 11 15 14 11 8 12 15 12 13 17 16 13 14 18 17 14 15 19 18 15 12 16 19 16 17 21 20 17 18 22 21 18 19 23 22 19 16 20 23 20 21 25 24 21 22 26 25 22 23 27 26 23 20 24 27 24 25 29 28 25 26 30 29 26 27 31 30 27 24 28 31 28 29 33 32 29 30 34 33 30 31 35 34 31 28 32 35 32 33 37 36 33 34 38 37 34 35 39 38 35 32 36 39 36 37 41 40 37 38 42 41 38 39 43 42 39 36 40 43 40 41 45 44 41 42 46 45 42 43 47 46 43 40 44 47 44 45 49 48 45 46 50 49 46 47 51 50 47 44 48 51 48 49 53 52 49 50 54 53 50 51 55 54 51 48 52 55 52 53 57 56 53 54 58 57 54 55 59 58 55 52 56 59 56 57 61 60 57 58 62 61 58 59 63 62 59 56 60 63 60 61 65 64 61 62 66 65 62 63 67 66 63 60 64 67 0 3 2 1 64 65 66 67\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.LinearWavePoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 4.2861222383783204e-16 -5 5 -5 -6.1230317691118863e-16 5 -7.9599412998454522e-16 5 5 5.3826834323650896 0 4.375 0.38268343236509023 -5 4.375 -4.6173165676349104 -6.1230317691118863e-16 4.375 0.38268343236508895 5 4.375 5.7071067811865479 0 3.75 0.70710678118654791 -5 3.75 -4.2928932188134521 -6.1230317691118863e-16 3.75 0.70710678118654668 5 3.75 5.923879532511287 0 3.125 0.92387953251128707 -5 3.125 -4.076120467488713 -6.1230317691118863e-16 3.125 0.92387953251128585 5 3.125 6 0 2.5 1.0000000000000002 -5 2.5 -4 -6.1230317691118863e-16 2.5 0.99999999999999911 5 2.5 5.923879532511287 0 1.875 0.92387953251128707 -5 1.875 -4.076120467488713 -6.1230317691118863e-16 1.875 0.92387953251128585 5 1.875 5.7071067811865479 0 1.25 0.70710678118654779 -5 1.25 -4.2928932188134521 -6.1230317691118863e-16 1.25 0.70710678118654657 5 1.25 5.3826834323650896 0 0.625 0.38268343236509011 -5 0.625 -4.6173165676349104 -6.1230317691118863e-16 0.625 0.38268343236508884 5 0.625 5 0 0 3.0615158845559431e-16 -5 0 -5 -6.1230317691118863e-16 0 -9.1845476536678294e-16 5 0 4.6173165676349104 0 -0.625 -0.38268343236508945 -5 -0.625 -5.3826834323650896 -6.1230317691118863e-16 -0.625 -0.38268343236509073 5 -0.625 4.2928932188134521 0 -1.25 -0.70710678118654713 -5 -1.25 -5.7071067811865479 -6.1230317691118863e-16 -1.25 -0.70710678118654835 5 -1.25 4.076120467488713 0 -1.875 -0.92387953251128641 -5 -1.875 -5.923879532511287 -6.1230317691118863e-16 -1.875 -0.92387953251128763 5 -1.875 4 0 -2.5 -0.99999999999999967 -5 -2.5 -6 -6.1230317691118863e-16 -2.5 -1.0000000000000009 5 -2.5 4.076120467488713 0 -3.125 -0.92387953251128641 -5 -3.125 -5.923879532511287 -6.1230317691118863e-16 -3.125 -0.92387953251128763 5 -3.125 4.2928932188134521 0 -3.75 -0.70710678118654724 -5 -3.75 -5.7071067811865479 -6.1230317691118863e-16 -3.75 -0.70710678118654846 5 -3.75 4.6173165676349104 0 -4.375 -0.38268343236508956 -5 -4.375 -5.3826834323650896 -6.1230317691118863e-16 -4.375 -0.38268343236509084 5 -4.375 5 0 -5 1.8369095307335659e-16 -5 -5 -5 -6.1230317691118863e-16 -5 -1.0409154007490207e-15 5 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 4 5 9 8 5 6 10 9 6 7 11 10 7 4 8 11 8 9 13 12 9 10 14 13 10 11 15 14 11 8 12 15 12 13 17 16 13 14 18 17 14 15 19 18 15 12 16 19 16 17 21 20 17 18 22 21 18 19 23 22 19 16 20 23 20 21 25 24 21 22 26 25 22 23 27 26 23 20 24 27 24 25 29 28 25 26 30 29 26 27 31 30 27 24 28 31 28 29 33 32 29 30 34 33 30 31 35 34 31 28 32 35 32 33 37 36 33 34 38 37 34 35 39 38 35 32 36 39 36 37 41 40 37 38 42 41 38 39 43 42 39 36 40 43 40 41 45 44 41 42 46 45 42 43 47 46 43 40 44 47 44 45 49 48 45 46 50 49 46 47 51 50 47 44 48 51 48 49 53 52 49 50 54 53 50 51 55 54 51 48 52 55 52 53 57 56 53 54 58 57 54 55 59 58 55 52 56 59 56 57 61 60 57 58 62 61 58 59 63 62 59 56 60 63 60 61 65 64 61 62 66 65 62 63 67 66 63 60 64 67 0 3 2 1 64 65 66 67\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MakeHole.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -1.25 2.5 1.25 1.25 2.5 1.25 1.25 2.5 -1.25 -1.25 2.5 -1.25 2.5 1.25 1.25 2.5 -1.25 1.25 2.5 -1.25 -1.25 2.5 1.25 -1.25 1.25 -2.5 1.25 -1.25 -2.5 1.25 -1.25 -2.5 -1.25 1.25 -2.5 -1.25 -2.5 -1.25 1.25 -2.5 1.25 1.25 -2.5 1.25 -1.25 -2.5 -1.25 -1.25 1.25 1.25 2.5 -1.25 1.25 2.5 -1.25 -1.25 2.5 1.25 -1.25 2.5 -1.25 1.25 -2.5 1.25 1.25 -2.5 1.25 -1.25 -2.5 -1.25 -1.25 -2.5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 27 24 25 26 31 28 29 30 35 32 33 34 39 36 37 38 43 40 41 42 47 44 45 46</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 2 4 6 8 10</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">2 2 2 2 2 2</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 24 4 28 8 32 12 36 16 40 20 44</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MergeCollinearEdges.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 -5 5 0 5 -5 -0 -5 -5 0</points>\n\t\t<point_selection>1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 5 14 19</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 3 0 2</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 3\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 6 14 19</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 6 14 19</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MergeCoplanarFaces.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 3 5 0 1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 -5 3 0 5 1 0 -5 1 0 5 -1 -0 -5 -1 0 5 -3 -0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 11 12 17 18 23 24 29 30 31 32 33 34 35</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">2 0 3 4 5 6 8 1 10 7 12 9 18 14 11 13 15 16 19 17</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">17</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 6 1 2 3 4 5 8 7 10 9 12 11 15 14 16 17 18 13 19\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 3 4 8 12 16 17 23 37 43 57 63 77 82 83 86 90 94 97 98</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 3 4 8 12 16 17 23 37 43 57 63 77 82 83 86 90 94 97 98</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MergeMesh.generic.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-1 1 1 1 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -2 2 2 2 2 2 2 -2 2 -2 -2 2 -2 2 -2 2 2 -2 2 -2 -2 -2 -2 -2</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"particle\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"constantwidth\" type=\"k3d::double_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"particle\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::uint_t\">8 9 10 11 12 13 14 15\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"constantwidth\" type=\"k3d::double_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MergeMesh.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 5 0 0.32317943298734508 5.1367899902323195 0 0.6564659149439398 5.1964627944717279 0 0.98145912799579937 5.1449889263132365 0 1.2799934978417193 4.9852455300757148 0 1.545084971874737 4.7552825814757682 0 1.7865282176546853 4.5122552028578982 0 2.0276614153887391 4.3089998462381107 0 2.2942246277576843 4.1731791056371454 0 2.6003962029270338 4.0975687518328794 0 2.9389262614623659 4.0450849718747373 0 3.2807870539013755 3.965790294078861 0 3.5854962760945606 3.818165727928025 0 3.818165727928025 3.5854962760945615 0 3.9657902940788601 3.2807870539013737 0 4.0450849718747364 2.9389262614623664 0 4.0975687518328803 2.6003962029270342 0 4.1731791056371454 2.2942246277576839 0 4.3089998462381116 2.02766141538874 0 4.5122552028578973 1.7865282176546862 0 4.7552825814757673 1.5450849718747375 0 4.985245530075713 1.2799934978417213 0 5.1449889263132365 0.98145912799579915 0 5.1964627944717279 0.65646591494394124 0 5.1367899902323195 0.32317943298734619 0 5 6.1232339957367663e-16 0 4.8434772940503974 -0.30472576230578846 0 4.7246842186730502 -0.59686642069910301 0 4.677883580973651 -0.89235401786144752 0 4.7005860812105977 -1.2069053738068276 0 4.7552825814757682 -1.5450849718747364 0 4.7855096560246153 -1.8947173091920939 0 4.7392706784220842 -2.2301315002619879 0 4.5898876948014893 -2.5233121132594691 0 4.3457105031872691 -2.7578717468629326 0 4.0450849718747373 -2.938926261462365 0 3.7393421336790316 -3.0934528435855215 0 3.471520546286091 -3.2599747831923263 0 3.2599747831923267 -3.4715205462860896 0 3.093452843585522 -3.739342133679032 0 2.9389262614623664 -4.0450849718747364 0 2.7578717468629339 -4.3457105031872683 0 2.5233121132594696 -4.5898876948014866 0 2.2301315002619888 -4.7392706784220833 0 1.8947173091920952 -4.7855096560246162 0 1.5450849718747375 -4.7552825814757673 0 1.2069053738068289 -4.700586081210596 0 0.89235401786144863 -4.6778835809736501 0 0.59686642069910401 -4.7246842186730502 0 0.30472576230578963 -4.8434772940503965 0 6.1232339957367653e-16 -4.9999999999999991 0 -0.32317943298734492 -5.1367899902323195 -0 -0.65646591494394002 -5.1964627944717279 -0 -0.98145912799580037 -5.1449889263132365 -0 -1.2799934978417202 -4.985245530075713 -0 -1.5450849718747384 -4.7552825814757673 -0 -1.7865282176546868 -4.5122552028578964 -0 -2.0276614153887373 -4.3089998462381134 -0 -2.294224627757683 -4.1731791056371463 -0 -2.6003962029270324 -4.0975687518328794 -0 -2.9389262614623646 -4.0450849718747373 -0 -3.2807870539013755 -3.9657902940788627 -0 -3.585496276094561 -3.818165727928025 -0 -3.8181657279280237 -3.5854962760945623 -0 -3.9657902940788619 -3.2807870539013755 -0 -4.0450849718747355 -2.9389262614623659 -0 -4.0975687518328794 -2.600396202927032 -0 -4.1731791056371454 -2.2942246277576843 -0 -4.3089998462381134 -2.0276614153887369 -0 -4.5122552028578964 -1.7865282176546884 -0 -4.7552825814757664 -1.5450849718747379 -0 -4.9852455300757121 -1.2799934978417218 -0 -5.1449889263132365 -0.98145912799579993 -0 -5.196462794471727 -0.65646591494394202 -0 -5.1367899902323177 -0.32317943298734447 -0 -5.0000000000000009 -1.2246467991473535e-15 -0 -4.8434772940503974 0.30472576230578569 -0 -4.7246842186730511 0.59686642069910234 -0 -4.6778835809736501 0.89235401786144464 -0 -4.7005860812105968 1.2069053738068294 -0 -4.7552825814757673 1.5450849718747357 -0 -4.7855096560246153 1.8947173091920959 -0 -4.739270678422085 2.2301315002619826 -0 -4.5898876948014919 2.5233121132594669 -0 -4.3457105031872745 2.7578717468629299 -0 -4.0450849718747373 2.9389262614623641 -0 -3.7393421336790347 3.0934528435855206 -0 -3.471520546286091 3.2599747831923258 -0 -3.2599747831923276 3.4715205462860883 -0 -3.0934528435855215 3.7393421336790316 -0 -2.9389262614623659 4.0450849718747355 -0 -2.7578717468629312 4.3457105031872718 -0 -2.5233121132594687 4.5898876948014893 -0 -2.2301315002619848 4.739270678422085 -0 -1.8947173091920981 4.7855096560246153 -0 -1.5450849718747386 4.7552825814757682 -0 -1.2069053738068314 4.700586081210596 -0 -0.89235401786144697 4.6778835809736501 -0 -0.59686642069910478 4.7246842186730502 -0 -0.30472576230578813 4.8434772940503974 -0 1.3999999999999999 0 2.3999999999999999 1.3999999999999999 -0.78400000000000003 2.3999999999999999 0.78400000000000003 -1.3999999999999999 2.3999999999999999 0 -1.3999999999999999 2.3999999999999999 1.3374999999999999 0 2.53125 1.3374999999999999 -0.749 2.53125 0.749 -1.3374999999999999 2.53125 0 -1.3374999999999999 2.53125 1.4375 0 2.53125 1.4375 -0.80500000000000005 2.53125 0.80500000000000005 -1.4375 2.53125 0 -1.4375 2.53125 1.5 0 2.3999999999999999 1.5 -0.83999999999999997 2.3999999999999999 0.83999999999999997 -1.5 2.3999999999999999 0 -1.5 2.3999999999999999 -0.78400000000000003 -1.3999999999999999 2.3999999999999999 -1.3999999999999999 -0.78400000000000003 2.3999999999999999 -1.3999999999999999 0 2.3999999999999999 -0.749 -1.3374999999999999 2.53125 -1.3374999999999999 -0.749 2.53125 -1.3374999999999999 0 2.53125 -0.80500000000000005 -1.4375 2.53125 -1.4375 -0.80500000000000005 2.53125 -1.4375 0 2.53125 -0.83999999999999997 -1.5 2.3999999999999999 -1.5 -0.83999999999999997 2.3999999999999999 -1.5 0 2.3999999999999999 -1.3999999999999999 0.78400000000000003 2.3999999999999999 -0.78400000000000003 1.3999999999999999 2.3999999999999999 0 1.3999999999999999 2.3999999999999999 -1.3374999999999999 0.749 2.53125 -0.749 1.3374999999999999 2.53125 0 1.3374999999999999 2.53125 -1.4375 0.80500000000000005 2.53125 -0.80500000000000005 1.4375 2.53125 0 1.4375 2.53125 -1.5 0.83999999999999997 2.3999999999999999 -0.83999999999999997 1.5 2.3999999999999999 0 1.5 2.3999999999999999 0.78400000000000003 1.3999999999999999 2.3999999999999999 1.3999999999999999 0.78400000000000003 2.3999999999999999 0.749 1.3374999999999999 2.53125 1.3374999999999999 0.749 2.53125 0.80500000000000005 1.4375 2.53125 1.4375 0.80500000000000005 2.53125 0.83999999999999997 1.5 2.3999999999999999 1.5 0.83999999999999997 2.3999999999999999 1.75 0 1.875 1.75 -0.97999999999999998 1.875 0.97999999999999998 -1.75 1.875 0 -1.75 1.875 2 0 1.3500000000000001 2 -1.1200000000000001 1.3500000000000001 1.1200000000000001 -2 1.3500000000000001 0 -2 1.3500000000000001 2 0 0.90000000000000002 2 -1.1200000000000001 0.90000000000000002 1.1200000000000001 -2 0.90000000000000002 0 -2 0.90000000000000002 -0.97999999999999998 -1.75 1.875 -1.75 -0.97999999999999998 1.875 -1.75 0 1.875 -1.1200000000000001 -2 1.3500000000000001 -2 -1.1200000000000001 1.3500000000000001 -2 0 1.3500000000000001 -1.1200000000000001 -2 0.90000000000000002 -2 -1.1200000000000001 0.90000000000000002 -2 0 0.90000000000000002 -1.75 0.97999999999999998 1.875 -0.97999999999999998 1.75 1.875 0 1.75 1.875 -2 1.1200000000000001 1.3500000000000001 -1.1200000000000001 2 1.3500000000000001 0 2 1.3500000000000001 -2 1.1200000000000001 0.90000000000000002 -1.1200000000000001 2 0.90000000000000002 0 2 0.90000000000000002 0.97999999999999998 1.75 1.875 1.75 0.97999999999999998 1.875 1.1200000000000001 2 1.3500000000000001 2 1.1200000000000001 1.3500000000000001 1.1200000000000001 2 0.90000000000000002 2 1.1200000000000001 0.90000000000000002 2 0 0.45000000000000001 2 -1.1200000000000001 0.45000000000000001 1.1200000000000001 -2 0.45000000000000001 0 -2 0.45000000000000001 1.5 0 0.22500000000000001 1.5 -0.83999999999999997 0.22500000000000001 0.83999999999999997 -1.5 0.22500000000000001 0 -1.5 0.22500000000000001 1.5 0 0.14999999999999999 1.5 -0.83999999999999997 0.14999999999999999 0.83999999999999997 -1.5 0.14999999999999999 0 -1.5 0.14999999999999999 -1.1200000000000001 -2 0.45000000000000001 -2 -1.1200000000000001 0.45000000000000001 -2 0 0.45000000000000001 -0.83999999999999997 -1.5 0.22500000000000001 -1.5 -0.83999999999999997 0.22500000000000001 -1.5 0 0.22500000000000001 -0.83999999999999997 -1.5 0.14999999999999999 -1.5 -0.83999999999999997 0.14999999999999999 -1.5 0 0.14999999999999999 -2 1.1200000000000001 0.45000000000000001 -1.1200000000000001 2 0.45000000000000001 0 2 0.45000000000000001 -1.5 0.83999999999999997 0.22500000000000001 -0.83999999999999997 1.5 0.22500000000000001 0 1.5 0.22500000000000001 -1.5 0.83999999999999997 0.14999999999999999 -0.83999999999999997 1.5 0.14999999999999999 0 1.5 0.14999999999999999 1.1200000000000001 2 0.45000000000000001 2 1.1200000000000001 0.45000000000000001 0.83999999999999997 1.5 0.22500000000000001 1.5 0.83999999999999997 0.22500000000000001 0.83999999999999997 1.5 0.14999999999999999 1.5 0.83999999999999997 0.14999999999999999 -1.6000000000000001 0 2.0249999999999999 -1.6000000000000001 -0.29999999999999999 2.0249999999999999 -1.5 -0.29999999999999999 2.25 -1.5 0 2.25 -2.2999999999999998 0 2.0249999999999999 -2.2999999999999998 -0.29999999999999999 2.0249999999999999 -2.5 -0.29999999999999999 2.25 -2.5 0 2.25 -2.7000000000000002 0 2.0249999999999999 -2.7000000000000002 -0.29999999999999999 2.0249999999999999 -3 -0.29999999999999999 2.25 -3 0 2.25 -2.7000000000000002 0 1.8 -2.7000000000000002 -0.29999999999999999 1.8 -3 -0.29999999999999999 1.8 -3 0 1.8 -1.5 0.29999999999999999 2.25 -1.6000000000000001 0.29999999999999999 2.0249999999999999 -2.5 0.29999999999999999 2.25 -2.2999999999999998 0.29999999999999999 2.0249999999999999 -3 0.29999999999999999 2.25 -2.7000000000000002 0.29999999999999999 2.0249999999999999 -3 0.29999999999999999 1.8 -2.7000000000000002 0.29999999999999999 1.8 -2.7000000000000002 0 1.575 -2.7000000000000002 -0.29999999999999999 1.575 -3 -0.29999999999999999 1.3500000000000001 -3 0 1.3500000000000001 -2.5 0 1.125 -2.5 -0.29999999999999999 1.125 -2.6499999999999999 -0.29999999999999999 0.9375 -2.6499999999999999 0 0.9375 -2 -0.29999999999999999 0.90000000000000002 -1.8999999999999999 -0.29999999999999999 0.59999999999999998 -1.8999999999999999 0 0.59999999999999998 -3 0.29999999999999999 1.3500000000000001 -2.7000000000000002 0.29999999999999999 1.575 -2.6499999999999999 0.29999999999999999 0.9375 -2.5 0.29999999999999999 1.125 -1.8999999999999999 0.29999999999999999 0.59999999999999998 -2 0.29999999999999999 0.90000000000000002 1.7 0 1.425 1.7 -0.66000000000000003 1.425 1.7 -0.66000000000000003 0.59999999999999998 1.7 0 0.59999999999999998 2.6000000000000001 0 1.425 2.6000000000000001 -0.66000000000000003 1.425 3.1000000000000001 -0.66000000000000003 0.82499999999999996 3.1000000000000001 0 0.82499999999999996 2.2999999999999998 0 2.1000000000000001 2.2999999999999998 -0.25 2.1000000000000001 2.3999999999999999 -0.25 2.0249999999999999 2.3999999999999999 0 2.0249999999999999 2.7000000000000002 0 2.3999999999999999 2.7000000000000002 -0.25 2.3999999999999999 3.2999999999999998 -0.25 2.3999999999999999 3.2999999999999998 0 2.3999999999999999 1.7 0.66000000000000003 0.59999999999999998 1.7 0.66000000000000003 1.425 3.1000000000000001 0.66000000000000003 0.82499999999999996 2.6000000000000001 0.66000000000000003 1.425 2.3999999999999999 0.25 2.0249999999999999 2.2999999999999998 0.25 2.1000000000000001 3.2999999999999998 0.25 2.3999999999999999 2.7000000000000002 0.25 2.3999999999999999 2.7999999999999998 0 2.4750000000000001 2.7999999999999998 -0.25 2.4750000000000001 3.5249999999999999 -0.25 2.4937499999999999 3.5249999999999999 0 2.4937499999999999 2.8999999999999999 0 2.4750000000000001 2.8999999999999999 -0.14999999999999999 2.4750000000000001 3.4500000000000002 -0.14999999999999999 2.5125000000000002 3.4500000000000002 0 2.5125000000000002 2.7999999999999998 0 2.3999999999999999 2.7999999999999998 -0.14999999999999999 2.3999999999999999 3.2000000000000002 -0.14999999999999999 2.3999999999999999 3.2000000000000002 0 2.3999999999999999 3.5249999999999999 0.25 2.4937499999999999 2.7999999999999998 0.25 2.4750000000000001 3.4500000000000002 0.14999999999999999 2.5125000000000002 2.8999999999999999 0.14999999999999999 2.4750000000000001 3.2000000000000002 0.14999999999999999 2.3999999999999999 2.7999999999999998 0.14999999999999999 2.3999999999999999 0 0 3.1499999999999999 0 -0.002 3.1499999999999999 0.002 0 3.1499999999999999 0.80000000000000004 0 3.1499999999999999 0.80000000000000004 -0.45000000000000001 3.1499999999999999 0.45000000000000001 -0.80000000000000004 3.1499999999999999 0 -0.80000000000000004 3.1499999999999999 0 0 2.8500000000000001 0.20000000000000001 0 2.7000000000000002 0.20000000000000001 -0.112 2.7000000000000002 0.112 -0.20000000000000001 2.7000000000000002 0 -0.20000000000000001 2.7000000000000002 -0.002 0 3.1499999999999999 -0.45000000000000001 -0.80000000000000004 3.1499999999999999 -0.80000000000000004 -0.45000000000000001 3.1499999999999999 -0.80000000000000004 0 3.1499999999999999 -0.112 -0.20000000000000001 2.7000000000000002 -0.20000000000000001 -0.112 2.7000000000000002 -0.20000000000000001 0 2.7000000000000002 0 0.002 3.1499999999999999 -0.80000000000000004 0.45000000000000001 3.1499999999999999 -0.45000000000000001 0.80000000000000004 3.1499999999999999 0 0.80000000000000004 3.1499999999999999 -0.20000000000000001 0.112 2.7000000000000002 -0.112 0.20000000000000001 2.7000000000000002 0 0.20000000000000001 2.7000000000000002 0.45000000000000001 0.80000000000000004 3.1499999999999999 0.80000000000000004 0.45000000000000001 3.1499999999999999 0.112 0.20000000000000001 2.7000000000000002 0.20000000000000001 0.112 2.7000000000000002 0.40000000000000002 0 2.5499999999999998 0.40000000000000002 -0.224 2.5499999999999998 0.224 -0.40000000000000002 2.5499999999999998 0 -0.40000000000000002 2.5499999999999998 1.3 0 2.5499999999999998 1.3 -0.72799999999999998 2.5499999999999998 0.72799999999999998 -1.3 2.5499999999999998 0 -1.3 2.5499999999999998 1.3 0 2.3999999999999999 1.3 -0.72799999999999998 2.3999999999999999 0.72799999999999998 -1.3 2.3999999999999999 0 -1.3 2.3999999999999999 -0.224 -0.40000000000000002 2.5499999999999998 -0.40000000000000002 -0.224 2.5499999999999998 -0.40000000000000002 0 2.5499999999999998 -0.72799999999999998 -1.3 2.5499999999999998 -1.3 -0.72799999999999998 2.5499999999999998 -1.3 0 2.5499999999999998 -0.72799999999999998 -1.3 2.3999999999999999 -1.3 -0.72799999999999998 2.3999999999999999 -1.3 0 2.3999999999999999 -0.40000000000000002 0.224 2.5499999999999998 -0.224 0.40000000000000002 2.5499999999999998 0 0.40000000000000002 2.5499999999999998 -1.3 0.72799999999999998 2.5499999999999998 -0.72799999999999998 1.3 2.5499999999999998 0 1.3 2.5499999999999998 -1.3 0.72799999999999998 2.3999999999999999 -0.72799999999999998 1.3 2.3999999999999999 0 1.3 2.3999999999999999 0.224 0.40000000000000002 2.5499999999999998 0.40000000000000002 0.224 2.5499999999999998 0.72799999999999998 1.3 2.5499999999999998 1.3 0.72799999999999998 2.5499999999999998 0.72799999999999998 1.3 2.3999999999999999 1.3 0.72799999999999998 2.3999999999999999 0 0 0 1.5 0 0.14999999999999999 1.5 0.83999999999999997 0.14999999999999999 0.83999999999999997 1.5 0.14999999999999999 0 1.5 0.14999999999999999 1.5 0 0.074999999999999997 1.5 0.83999999999999997 0.074999999999999997 0.83999999999999997 1.5 0.074999999999999997 0 1.5 0.074999999999999997 1.425 0 0 1.425 0.79800000000000004 0 0.79800000000000004 1.425 0 0 1.425 0 -0.83999999999999997 1.5 0.14999999999999999 -1.5 0.83999999999999997 0.14999999999999999 -1.5 0 0.14999999999999999 -0.83999999999999997 1.5 0.074999999999999997 -1.5 0.83999999999999997 0.074999999999999997 -1.5 0 0.074999999999999997 -0.79800000000000004 1.425 0 -1.425 0.79800000000000004 0 -1.425 0 0 -1.5 -0.83999999999999997 0.14999999999999999 -0.83999999999999997 -1.5 0.14999999999999999 0 -1.5 0.14999999999999999 -1.5 -0.83999999999999997 0.074999999999999997 -0.83999999999999997 -1.5 0.074999999999999997 0 -1.5 0.074999999999999997 -1.425 -0.79800000000000004 0 -0.79800000000000004 -1.425 0 0 -1.425 0 0.83999999999999997 -1.5 0.14999999999999999 1.5 -0.83999999999999997 0.14999999999999999 0.83999999999999997 -1.5 0.074999999999999997 1.5 -0.83999999999999997 0.074999999999999997 0.79800000000000004 -1.425 0 1.425 -0.79800000000000004 0 0 0 0 1 0 0 2 0 0 3 0 0 -5 5 0 -1.666666666666667 5 0 1.6666666666666663 5 0 5 5 0 -5 1.666666666666667 0 -1.666666666666667 1.666666666666667 0 1.6666666666666663 1.666666666666667 0 5 1.666666666666667 0 -5 -1.6666666666666663 0 -1.666666666666667 -1.6666666666666663 0 1.6666666666666663 -1.6666666666666663 0 5 -1.6666666666666663 0 -5 -5 0 -1.666666666666667 -5 0 1.6666666666666663 -5 0 5 -5 0 -2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5 5 0 5 4.9039264020161522 -0.97545161008064118 5 4.6193976625564339 -1.913417161825449 5 4.1573480615127263 -2.7778511650980109 5 3.5355339059327378 -3.5355339059327373 5 2.7778511650980113 -4.1573480615127254 5 1.9134171618254492 -4.6193976625564339 5 0.97545161008064152 -4.9039264020161522 5 3.0616169978683831e-16 -5 5 -0.97545161008064096 -4.9039264020161522 5 -1.9134171618254485 -4.6193976625564339 5 -2.77785116509801 -4.1573480615127272 5 -3.5355339059327373 -3.5355339059327378 5 -4.1573480615127263 -2.7778511650980109 5 -4.6193976625564339 -1.9134171618254492 5 -4.9039264020161522 -0.97545161008064296 5 -5 -6.1232339957367663e-16 5 -4.9039264020161522 0.97545161008064185 5 -4.6193976625564339 1.9134171618254483 5 -4.1573480615127272 2.77785116509801 5 -3.5355339059327386 3.5355339059327373 5 -2.7778511650980109 4.1573480615127263 5 -1.9134171618254516 4.6193976625564321 5 -0.97545161008064329 4.9039264020161513 5 -9.1848509936051479e-16 5 5 0.97545161008064141 4.9039264020161522 5 1.9134171618254501 4.619397662556433 5 2.7778511650980091 4.1573480615127281 5 3.5355339059327373 3.5355339059327386 5 4.1573480615127263 2.7778511650980109 5 4.6193976625564321 1.9134171618254521 5 4.9039264020161513 0.97545161008064363 5 5 0 3 4.9039264020161522 -0.97545161008064118 3 4.6193976625564339 -1.913417161825449 3 4.1573480615127263 -2.7778511650980109 3 3.5355339059327378 -3.5355339059327373 3 2.7778511650980113 -4.1573480615127254 3 1.9134171618254492 -4.6193976625564339 3 0.97545161008064152 -4.9039264020161522 3 3.0616169978683831e-16 -5 3 -0.97545161008064096 -4.9039264020161522 3 -1.9134171618254485 -4.6193976625564339 3 -2.77785116509801 -4.1573480615127272 3 -3.5355339059327373 -3.5355339059327378 3 -4.1573480615127263 -2.7778511650980109 3 -4.6193976625564339 -1.9134171618254492 3 -4.9039264020161522 -0.97545161008064296 3 -5 -6.1232339957367663e-16 3 -4.9039264020161522 0.97545161008064185 3 -4.6193976625564339 1.9134171618254483 3 -4.1573480615127272 2.77785116509801 3 -3.5355339059327386 3.5355339059327373 3 -2.7778511650980109 4.1573480615127263 3 -1.9134171618254516 4.6193976625564321 3 -0.97545161008064329 4.9039264020161513 3 -9.1848509936051479e-16 5 3 0.97545161008064141 4.9039264020161522 3 1.9134171618254501 4.619397662556433 3 2.7778511650980091 4.1573480615127281 3 3.5355339059327373 3.5355339059327386 3 4.1573480615127263 2.7778511650980109 3 4.6193976625564321 1.9134171618254521 3 4.9039264020161513 0.97545161008064363 3 5 0 1 4.9039264020161522 -0.97545161008064118 1 4.6193976625564339 -1.913417161825449 1 4.1573480615127263 -2.7778511650980109 1 3.5355339059327378 -3.5355339059327373 1 2.7778511650980113 -4.1573480615127254 1 1.9134171618254492 -4.6193976625564339 1 0.97545161008064152 -4.9039264020161522 1 3.0616169978683831e-16 -5 1 -0.97545161008064096 -4.9039264020161522 1 -1.9134171618254485 -4.6193976625564339 1 -2.77785116509801 -4.1573480615127272 1 -3.5355339059327373 -3.5355339059327378 1 -4.1573480615127263 -2.7778511650980109 1 -4.6193976625564339 -1.9134171618254492 1 -4.9039264020161522 -0.97545161008064296 1 -5 -6.1232339957367663e-16 1 -4.9039264020161522 0.97545161008064185 1 -4.6193976625564339 1.9134171618254483 1 -4.1573480615127272 2.77785116509801 1 -3.5355339059327386 3.5355339059327373 1 -2.7778511650980109 4.1573480615127263 1 -1.9134171618254516 4.6193976625564321 1 -0.97545161008064329 4.9039264020161513 1 -9.1848509936051479e-16 5 1 0.97545161008064141 4.9039264020161522 1 1.9134171618254501 4.619397662556433 1 2.7778511650980091 4.1573480615127281 1 3.5355339059327373 3.5355339059327386 1 4.1573480615127263 2.7778511650980109 1 4.6193976625564321 1.9134171618254521 1 4.9039264020161513 0.97545161008064363 1 5 0 -1 4.9039264020161522 -0.97545161008064118 -1 4.6193976625564339 -1.913417161825449 -1 4.1573480615127263 -2.7778511650980109 -1 3.5355339059327378 -3.5355339059327373 -1 2.7778511650980113 -4.1573480615127254 -1 1.9134171618254492 -4.6193976625564339 -1 0.97545161008064152 -4.9039264020161522 -1 3.0616169978683831e-16 -5 -1 -0.97545161008064096 -4.9039264020161522 -1 -1.9134171618254485 -4.6193976625564339 -1 -2.77785116509801 -4.1573480615127272 -1 -3.5355339059327373 -3.5355339059327378 -1 -4.1573480615127263 -2.7778511650980109 -1 -4.6193976625564339 -1.9134171618254492 -1 -4.9039264020161522 -0.97545161008064296 -1 -5 -6.1232339957367663e-16 -1 -4.9039264020161522 0.97545161008064185 -1 -4.6193976625564339 1.9134171618254483 -1 -4.1573480615127272 2.77785116509801 -1 -3.5355339059327386 3.5355339059327373 -1 -2.7778511650980109 4.1573480615127263 -1 -1.9134171618254516 4.6193976625564321 -1 -0.97545161008064329 4.9039264020161513 -1 -9.1848509936051479e-16 5 -1 0.97545161008064141 4.9039264020161522 -1 1.9134171618254501 4.619397662556433 -1 2.7778511650980091 4.1573480615127281 -1 3.5355339059327373 3.5355339059327386 -1 4.1573480615127263 2.7778511650980109 -1 4.6193976625564321 1.9134171618254521 -1 4.9039264020161513 0.97545161008064363 -1 5 0 -3 4.9039264020161522 -0.97545161008064118 -3 4.6193976625564339 -1.913417161825449 -3 4.1573480615127263 -2.7778511650980109 -3 3.5355339059327378 -3.5355339059327373 -3 2.7778511650980113 -4.1573480615127254 -3 1.9134171618254492 -4.6193976625564339 -3 0.97545161008064152 -4.9039264020161522 -3 3.0616169978683831e-16 -5 -3 -0.97545161008064096 -4.9039264020161522 -3 -1.9134171618254485 -4.6193976625564339 -3 -2.77785116509801 -4.1573480615127272 -3 -3.5355339059327373 -3.5355339059327378 -3 -4.1573480615127263 -2.7778511650980109 -3 -4.6193976625564339 -1.9134171618254492 -3 -4.9039264020161522 -0.97545161008064296 -3 -5 -6.1232339957367663e-16 -3 -4.9039264020161522 0.97545161008064185 -3 -4.6193976625564339 1.9134171618254483 -3 -4.1573480615127272 2.77785116509801 -3 -3.5355339059327386 3.5355339059327373 -3 -2.7778511650980109 4.1573480615127263 -3 -1.9134171618254516 4.6193976625564321 -3 -0.97545161008064329 4.9039264020161513 -3 -9.1848509936051479e-16 5 -3 0.97545161008064141 4.9039264020161522 -3 1.9134171618254501 4.619397662556433 -3 2.7778511650980091 4.1573480615127281 -3 3.5355339059327373 3.5355339059327386 -3 4.1573480615127263 2.7778511650980109 -3 4.6193976625564321 1.9134171618254521 -3 4.9039264020161513 0.97545161008064363 -3 5 0 -5 4.9039264020161522 -0.97545161008064118 -5 4.6193976625564339 -1.913417161825449 -5 4.1573480615127263 -2.7778511650980109 -5 3.5355339059327378 -3.5355339059327373 -5 2.7778511650980113 -4.1573480615127254 -5 1.9134171618254492 -4.6193976625564339 -5 0.97545161008064152 -4.9039264020161522 -5 3.0616169978683831e-16 -5 -5 -0.97545161008064096 -4.9039264020161522 -5 -1.9134171618254485 -4.6193976625564339 -5 -2.77785116509801 -4.1573480615127272 -5 -3.5355339059327373 -3.5355339059327378 -5 -4.1573480615127263 -2.7778511650980109 -5 -4.6193976625564339 -1.9134171618254492 -5 -4.9039264020161522 -0.97545161008064296 -5 -5 -6.1232339957367663e-16 -5 -4.9039264020161522 0.97545161008064185 -5 -4.6193976625564339 1.9134171618254483 -5 -4.1573480615127272 2.77785116509801 -5 -3.5355339059327386 3.5355339059327373 -5 -2.7778511650980109 4.1573480615127263 -5 -1.9134171618254516 4.6193976625564321 -5 -0.97545161008064329 4.9039264020161513 -5 -9.1848509936051479e-16 5 -5 0.97545161008064141 4.9039264020161522 -5 1.9134171618254501 4.619397662556433 -5 2.7778511650980091 4.1573480615127281 -5 3.5355339059327373 3.5355339059327386 -5 4.1573480615127263 2.7778511650980109 -5 4.6193976625564321 1.9134171618254521 -5 4.9039264020161513 0.97545161008064363 -5 -5 5 0 -1.666666666666667 5 0 1.6666666666666663 5 0 5 5 0 -5 1.666666666666667 0 -1.666666666666667 1.666666666666667 0 1.6666666666666663 1.666666666666667 0 5 1.666666666666667 0 -5 -1.6666666666666663 0 -1.666666666666667 -1.6666666666666663 0 1.6666666666666663 -1.6666666666666663 0 5 -1.6666666666666663 0 -5 -5 0 -1.666666666666667 -5 0 1.6666666666666663 -5 0 5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"linear_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"periodic\" type=\"k3d::bool_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">100</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"width\" type=\"k3d::double_t\">0.10000000000000001</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"bicubic_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 103 116 117 118 107 119 120 121 111 122 123 124 115 125 126 127 118 128 129 130 121 131 132 133 124 134 135 136 127 137 138 139 130 140 141 100 133 142 143 104 136 144 145 108 139 146 147 112 112 113 114 115 148 149 150 151 152 153 154 155 156 157 158 159 115 125 126 127 151 160 161 162 155 163 164 165 159 166 167 168 127 137 138 139 162 169 170 171 165 172 173 174 168 175 176 177 139 146 147 112 171 178 179 148 174 180 181 152 177 182 183 156 156 157 158 159 184 185 186 187 188 189 190 191 192 193 194 195 159 166 167 168 187 196 197 198 191 199 200 201 195 202 203 204 168 175 176 177 198 205 206 207 201 208 209 210 204 211 212 213 177 182 183 156 207 214 215 184 210 216 217 188 213 218 219 192 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 223 236 237 220 227 238 239 224 231 240 241 228 235 242 243 232 232 233 234 235 244 245 246 247 248 249 250 251 168 252 253 254 235 242 243 232 247 255 256 244 251 257 258 248 254 259 260 168 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 264 277 278 261 268 279 280 265 272 281 282 269 276 283 284 273 273 274 275 276 285 286 287 288 289 290 291 292 293 294 295 296 276 283 284 273 288 297 298 285 292 299 300 289 296 301 302 293 303 303 303 303 306 307 308 309 310 310 310 310 311 312 313 314 303 303 303 303 309 316 317 318 310 310 310 310 314 319 320 321 303 303 303 303 318 323 324 325 310 310 310 310 321 326 327 328 303 303 303 303 325 329 330 306 310 310 310 310 328 331 332 311 311 312 313 314 333 334 335 336 337 338 339 340 341 342 343 344 314 319 320 321 336 345 346 347 340 348 349 350 344 351 352 353 321 326 327 328 347 354 355 356 350 357 358 359 353 360 361 362 328 331 332 311 356 363 364 333 359 365 366 337 362 367 368 341 369 369 369 369 378 379 380 381 374 375 376 377 370 371 372 373 369 369 369 369 381 388 389 390 377 385 386 387 373 382 383 384 369 369 369 369 390 397 398 399 387 394 395 396 384 391 392 393 369 369 369 369 399 404 405 378 396 402 403 374 393 400 401 370\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">406 407 408 409\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">426 427 431 430 427 428 432 431 428 429 433 432 429 426 430 433 427 426 429 428 430 431 432 433\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"cone\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"heights\" type=\"k3d::double_t\">10</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">5</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 448 480 479 448 449 481 480 449 450 482 481 450 451 483 482 451 452 484 483 452 453 485 484 453 454 486 485 454 455 487 486 455 456 488 487 456 457 489 488 457 458 490 489 458 459 491 490 459 460 492 491 460 461 493 492 461 462 494 493 462 463 495 494 463 464 496 495 464 465 497 496 465 434 466 497 466 467 499 498 467 468 500 499 468 469 501 500 469 470 502 501 470 471 503 502 471 472 504 503 472 473 505 504 473 474 506 505 474 475 507 506 475 476 508 507 476 477 509 508 477 478 510 509 478 479 511 510 479 480 512 511 480 481 513 512 481 482 514 513 482 483 515 514 483 484 516 515 484 485 517 516 485 486 518 517 486 487 519 518 487 488 520 519 488 489 521 520 489 490 522 521 490 491 523 522 491 492 524 523 492 493 525 524 493 494 526 525 494 495 527 526 495 496 528 527 496 497 529 528 497 466 498 529 498 499 531 530 499 500 532 531 500 501 533 532 501 502 534 533 502 503 535 534 503 504 536 535 504 505 537 536 505 506 538 537 506 507 539 538 507 508 540 539 508 509 541 540 509 510 542 541 510 511 543 542 511 512 544 543 512 513 545 544 513 514 546 545 514 515 547 546 515 516 548 547 516 517 549 548 517 518 550 549 518 519 551 550 519 520 552 551 520 521 553 552 521 522 554 553 522 523 555 554 523 524 556 555 524 525 557 556 525 526 558 557 526 527 559 558 527 528 560 559 528 529 561 560 529 498 530 561 530 531 563 562 531 532 564 563 532 533 565 564 533 534 566 565 534 535 567 566 535 536 568 567 536 537 569 568 537 538 570 569 538 539 571 570 539 540 572 571 540 541 573 572 541 542 574 573 542 543 575 574 543 544 576 575 544 545 577 576 545 546 578 577 546 547 579 578 547 548 580 579 548 549 581 580 549 550 582 581 550 551 583 582 551 552 584 583 552 553 585 584 553 554 586 585 554 555 587 586 555 556 588 587 556 557 589 588 557 558 590 589 558 559 591 590 559 560 592 591 560 561 593 592 561 530 562 593 562 563 595 594 563 564 596 595 564 565 597 596 565 566 598 597 566 567 599 598 567 568 600 599 568 569 601 600 569 570 602 601 570 571 603 602 571 572 604 603 572 573 605 604 573 574 606 605 574 575 607 606 575 576 608 607 576 577 609 608 577 578 610 609 578 579 611 610 579 580 612 611 580 581 613 612 581 582 614 613 582 583 615 614 583 584 616 615 584 585 617 616 585 586 618 617 586 587 619 618 587 588 620 619 588 589 621 620 589 590 622 621 590 591 623 622 591 592 624 623 592 593 625 624 593 562 594 625 434 465 464 463 462 461 460 459 458 457 456 455 454 453 452 451 450 449 448 447 446 445 444 443 442 441 440 439 438 437 436 435 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MergeMesh.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 5 0 0.32317943298734514 5.1367899902323186 0 0.6564659149439398 5.1964627944717279 0 0.98145912799579949 5.1449889263132356 0 1.2799934978417193 4.9852455300757139 0 1.545084971874737 4.7552825814757682 0 1.7865282176546853 4.5122552028578982 0 2.0276614153887391 4.3089998462381116 0 2.2942246277576843 4.1731791056371463 0 2.6003962029270338 4.0975687518328803 0 2.9389262614623655 4.0450849718747373 0 3.2807870539013755 3.9657902940788605 0 3.5854962760945601 3.8181657279280241 0 3.8181657279280246 3.5854962760945615 0 3.965790294078861 3.2807870539013764 0 4.0450849718747373 2.9389262614623659 0 4.0975687518328803 2.6003962029270342 0 4.1731791056371454 2.2942246277576839 0 4.3089998462381116 2.02766141538874 0 4.5122552028578982 1.7865282176546864 0 4.7552825814757682 1.5450849718747377 0 4.9852455300757139 1.2799934978417191 0 5.1449889263132356 0.98145912799579926 0 5.1964627944717279 0.65646591494394135 0 5.1367899902323186 0.32317943298734619 0 5 6.1230317691118863e-16 0 4.8434772940503974 -0.30472576230578846 0 4.7246842186730511 -0.59686642069910301 0 4.677883580973651 -0.8923540178614453 0 4.7005860812105968 -1.2069053738068276 0 4.7552825814757682 -1.5450849718747366 0 4.7855096560246162 -1.8947173091920939 0 4.7392706784220833 -2.2301315002619875 0 4.5898876948014911 -2.5233121132594674 0 4.3457105031872709 -2.7578717468629317 0 4.0450849718747373 -2.938926261462365 0 3.7393421336790316 -3.0934528435855211 0 3.4715205462860901 -3.2599747831923263 0 3.2599747831923276 -3.4715205462860896 0 3.093452843585522 -3.739342133679032 0 2.9389262614623659 -4.0450849718747364 0 2.7578717468629321 -4.3457105031872691 0 2.5233121132594682 -4.5898876948014902 0 2.2301315002619888 -4.7392706784220833 0 1.894717309192095 -4.7855096560246162 0 1.5450849718747377 -4.7552825814757673 0 1.2069053738068289 -4.7005860812105968 0 0.89235401786144652 -4.6778835809736501 0 0.59686642069910412 -4.7246842186730502 0 0.30472576230578963 -4.8434772940503974 0 6.1230317691118863e-16 -5 0 -0.32317943298734492 -5.1367899902323195 -0 -0.65646591494394002 -5.1964627944717279 -0 -0.98145912799579804 -5.1449889263132373 -0 -1.2799934978417182 -4.9852455300757139 -0 -1.545084971874737 -4.7552825814757691 -0 -1.7865282176546853 -4.5122552028578999 -0 -2.0276614153887391 -4.3089998462381107 -0 -2.294224627757683 -4.1731791056371472 -0 -2.6003962029270324 -4.0975687518328785 -0 -2.938926261462365 -4.0450849718747381 -0 -3.2807870539013755 -3.9657902940788627 -0 -3.5854962760945606 -3.8181657279280241 -0 -3.8181657279280237 -3.5854962760945623 -0 -3.9657902940788619 -3.280787053901375 -0 -4.0450849718747364 -2.9389262614623659 -0 -4.0975687518328794 -2.6003962029270369 -0 -4.1731791056371463 -2.2942246277576843 -0 -4.3089998462381107 -2.0276614153887409 -0 -4.5122552028578991 -1.7865282176546851 -0 -4.7552825814757673 -1.5450849718747379 -0 -4.985245530075713 -1.2799934978417218 -0 -5.1449889263132356 -0.98145912799579982 -0 -5.1964627944717279 -0.65646591494394191 -0 -5.1367899902323177 -0.32317943298734447 -0 -5.0000000000000018 -1.2246063538223777e-15 -0 -4.8434772940503974 0.30472576230578574 -0 -4.7246842186730511 0.59686642069910234 -0 -4.677883580973651 0.89235401786144475 -0 -4.7005860812105977 1.2069053738068294 -0 -4.7552825814757673 1.5450849718747357 -0 -4.7855096560246162 1.8947173091920908 -0 -4.7392706784220833 2.230131500261987 -0 -4.5898876948014919 2.5233121132594665 -0 -4.3457105031872709 2.757871746862933 -0 -4.0450849718747381 2.9389262614623646 -0 -3.7393421336790347 3.0934528435855202 -0 -3.4715205462860905 3.2599747831923263 -0 -3.2599747831923276 3.4715205462860892 -0 -3.0934528435855211 3.739342133679032 -0 -2.9389262614623659 4.0450849718747355 -0 -2.7578717468629339 4.3457105031872683 -0 -2.5233121132594682 4.5898876948014893 -0 -2.2301315002619897 4.7392706784220833 -0 -1.894717309192093 4.7855096560246153 -0 -1.5450849718747386 4.7552825814757691 -0 -1.2069053738068316 4.7005860812105968 -0 -0.89235401786144708 4.6778835809736501 -0 -0.59686642069910467 4.7246842186730502 -0 -0.30472576230578807 4.8434772940503974 -0 1.3999999999999999 0 2.3999999999999999 1.3999999999999999 -0.78400000000000003 2.3999999999999999 0.78400000000000003 -1.3999999999999999 2.3999999999999999 0 -1.3999999999999999 2.3999999999999999 1.3374999999999999 0 2.53125 1.3374999999999999 -0.749 2.53125 0.749 -1.3374999999999999 2.53125 0 -1.3374999999999999 2.53125 1.4375 0 2.53125 1.4375 -0.80500000000000005 2.53125 0.80500000000000005 -1.4375 2.53125 0 -1.4375 2.53125 1.5 0 2.3999999999999999 1.5 -0.83999999999999997 2.3999999999999999 0.83999999999999997 -1.5 2.3999999999999999 0 -1.5 2.3999999999999999 -0.78400000000000003 -1.3999999999999999 2.3999999999999999 -1.3999999999999999 -0.78400000000000003 2.3999999999999999 -1.3999999999999999 0 2.3999999999999999 -0.749 -1.3374999999999999 2.53125 -1.3374999999999999 -0.749 2.53125 -1.3374999999999999 0 2.53125 -0.80500000000000005 -1.4375 2.53125 -1.4375 -0.80500000000000005 2.53125 -1.4375 0 2.53125 -0.83999999999999997 -1.5 2.3999999999999999 -1.5 -0.83999999999999997 2.3999999999999999 -1.5 0 2.3999999999999999 -1.3999999999999999 0.78400000000000003 2.3999999999999999 -0.78400000000000003 1.3999999999999999 2.3999999999999999 0 1.3999999999999999 2.3999999999999999 -1.3374999999999999 0.749 2.53125 -0.749 1.3374999999999999 2.53125 0 1.3374999999999999 2.53125 -1.4375 0.80500000000000005 2.53125 -0.80500000000000005 1.4375 2.53125 0 1.4375 2.53125 -1.5 0.83999999999999997 2.3999999999999999 -0.83999999999999997 1.5 2.3999999999999999 0 1.5 2.3999999999999999 0.78400000000000003 1.3999999999999999 2.3999999999999999 1.3999999999999999 0.78400000000000003 2.3999999999999999 0.749 1.3374999999999999 2.53125 1.3374999999999999 0.749 2.53125 0.80500000000000005 1.4375 2.53125 1.4375 0.80500000000000005 2.53125 0.83999999999999997 1.5 2.3999999999999999 1.5 0.83999999999999997 2.3999999999999999 1.75 0 1.875 1.75 -0.97999999999999998 1.875 0.97999999999999998 -1.75 1.875 0 -1.75 1.875 2 0 1.3500000000000001 2 -1.1200000000000001 1.3500000000000001 1.1200000000000001 -2 1.3500000000000001 0 -2 1.3500000000000001 2 0 0.90000000000000002 2 -1.1200000000000001 0.90000000000000002 1.1200000000000001 -2 0.90000000000000002 0 -2 0.90000000000000002 -0.97999999999999998 -1.75 1.875 -1.75 -0.97999999999999998 1.875 -1.75 0 1.875 -1.1200000000000001 -2 1.3500000000000001 -2 -1.1200000000000001 1.3500000000000001 -2 0 1.3500000000000001 -1.1200000000000001 -2 0.90000000000000002 -2 -1.1200000000000001 0.90000000000000002 -2 0 0.90000000000000002 -1.75 0.97999999999999998 1.875 -0.97999999999999998 1.75 1.875 0 1.75 1.875 -2 1.1200000000000001 1.3500000000000001 -1.1200000000000001 2 1.3500000000000001 0 2 1.3500000000000001 -2 1.1200000000000001 0.90000000000000002 -1.1200000000000001 2 0.90000000000000002 0 2 0.90000000000000002 0.97999999999999998 1.75 1.875 1.75 0.97999999999999998 1.875 1.1200000000000001 2 1.3500000000000001 2 1.1200000000000001 1.3500000000000001 1.1200000000000001 2 0.90000000000000002 2 1.1200000000000001 0.90000000000000002 2 0 0.45000000000000001 2 -1.1200000000000001 0.45000000000000001 1.1200000000000001 -2 0.45000000000000001 0 -2 0.45000000000000001 1.5 0 0.22500000000000001 1.5 -0.83999999999999997 0.22500000000000001 0.83999999999999997 -1.5 0.22500000000000001 0 -1.5 0.22500000000000001 1.5 0 0.14999999999999999 1.5 -0.83999999999999997 0.14999999999999999 0.83999999999999997 -1.5 0.14999999999999999 0 -1.5 0.14999999999999999 -1.1200000000000001 -2 0.45000000000000001 -2 -1.1200000000000001 0.45000000000000001 -2 0 0.45000000000000001 -0.83999999999999997 -1.5 0.22500000000000001 -1.5 -0.83999999999999997 0.22500000000000001 -1.5 0 0.22500000000000001 -0.83999999999999997 -1.5 0.14999999999999999 -1.5 -0.83999999999999997 0.14999999999999999 -1.5 0 0.14999999999999999 -2 1.1200000000000001 0.45000000000000001 -1.1200000000000001 2 0.45000000000000001 0 2 0.45000000000000001 -1.5 0.83999999999999997 0.22500000000000001 -0.83999999999999997 1.5 0.22500000000000001 0 1.5 0.22500000000000001 -1.5 0.83999999999999997 0.14999999999999999 -0.83999999999999997 1.5 0.14999999999999999 0 1.5 0.14999999999999999 1.1200000000000001 2 0.45000000000000001 2 1.1200000000000001 0.45000000000000001 0.83999999999999997 1.5 0.22500000000000001 1.5 0.83999999999999997 0.22500000000000001 0.83999999999999997 1.5 0.14999999999999999 1.5 0.83999999999999997 0.14999999999999999 -1.6000000000000001 0 2.0249999999999999 -1.6000000000000001 -0.29999999999999999 2.0249999999999999 -1.5 -0.29999999999999999 2.25 -1.5 0 2.25 -2.2999999999999998 0 2.0249999999999999 -2.2999999999999998 -0.29999999999999999 2.0249999999999999 -2.5 -0.29999999999999999 2.25 -2.5 0 2.25 -2.7000000000000002 0 2.0249999999999999 -2.7000000000000002 -0.29999999999999999 2.0249999999999999 -3 -0.29999999999999999 2.25 -3 0 2.25 -2.7000000000000002 0 1.8 -2.7000000000000002 -0.29999999999999999 1.8 -3 -0.29999999999999999 1.8 -3 0 1.8 -1.5 0.29999999999999999 2.25 -1.6000000000000001 0.29999999999999999 2.0249999999999999 -2.5 0.29999999999999999 2.25 -2.2999999999999998 0.29999999999999999 2.0249999999999999 -3 0.29999999999999999 2.25 -2.7000000000000002 0.29999999999999999 2.0249999999999999 -3 0.29999999999999999 1.8 -2.7000000000000002 0.29999999999999999 1.8 -2.7000000000000002 0 1.575 -2.7000000000000002 -0.29999999999999999 1.575 -3 -0.29999999999999999 1.3500000000000001 -3 0 1.3500000000000001 -2.5 0 1.125 -2.5 -0.29999999999999999 1.125 -2.6499999999999999 -0.29999999999999999 0.9375 -2.6499999999999999 0 0.9375 -2 -0.29999999999999999 0.90000000000000002 -1.8999999999999999 -0.29999999999999999 0.59999999999999998 -1.8999999999999999 0 0.59999999999999998 -3 0.29999999999999999 1.3500000000000001 -2.7000000000000002 0.29999999999999999 1.575 -2.6499999999999999 0.29999999999999999 0.9375 -2.5 0.29999999999999999 1.125 -1.8999999999999999 0.29999999999999999 0.59999999999999998 -2 0.29999999999999999 0.90000000000000002 1.7 0 1.425 1.7 -0.66000000000000003 1.425 1.7 -0.66000000000000003 0.59999999999999998 1.7 0 0.59999999999999998 2.6000000000000001 0 1.425 2.6000000000000001 -0.66000000000000003 1.425 3.1000000000000001 -0.66000000000000003 0.82499999999999996 3.1000000000000001 0 0.82499999999999996 2.2999999999999998 0 2.1000000000000001 2.2999999999999998 -0.25 2.1000000000000001 2.3999999999999999 -0.25 2.0249999999999999 2.3999999999999999 0 2.0249999999999999 2.7000000000000002 0 2.3999999999999999 2.7000000000000002 -0.25 2.3999999999999999 3.2999999999999998 -0.25 2.3999999999999999 3.2999999999999998 0 2.3999999999999999 1.7 0.66000000000000003 0.59999999999999998 1.7 0.66000000000000003 1.425 3.1000000000000001 0.66000000000000003 0.82499999999999996 2.6000000000000001 0.66000000000000003 1.425 2.3999999999999999 0.25 2.0249999999999999 2.2999999999999998 0.25 2.1000000000000001 3.2999999999999998 0.25 2.3999999999999999 2.7000000000000002 0.25 2.3999999999999999 2.7999999999999998 0 2.4750000000000001 2.7999999999999998 -0.25 2.4750000000000001 3.5249999999999999 -0.25 2.4937499999999999 3.5249999999999999 0 2.4937499999999999 2.8999999999999999 0 2.4750000000000001 2.8999999999999999 -0.14999999999999999 2.4750000000000001 3.4500000000000002 -0.14999999999999999 2.5125000000000002 3.4500000000000002 0 2.5125000000000002 2.7999999999999998 0 2.3999999999999999 2.7999999999999998 -0.14999999999999999 2.3999999999999999 3.2000000000000002 -0.14999999999999999 2.3999999999999999 3.2000000000000002 0 2.3999999999999999 3.5249999999999999 0.25 2.4937499999999999 2.7999999999999998 0.25 2.4750000000000001 3.4500000000000002 0.14999999999999999 2.5125000000000002 2.8999999999999999 0.14999999999999999 2.4750000000000001 3.2000000000000002 0.14999999999999999 2.3999999999999999 2.7999999999999998 0.14999999999999999 2.3999999999999999 0 0 3.1499999999999999 0 -0.002 3.1499999999999999 0.002 0 3.1499999999999999 0.80000000000000004 0 3.1499999999999999 0.80000000000000004 -0.45000000000000001 3.1499999999999999 0.45000000000000001 -0.80000000000000004 3.1499999999999999 0 -0.80000000000000004 3.1499999999999999 0 0 2.8500000000000001 0.20000000000000001 0 2.7000000000000002 0.20000000000000001 -0.112 2.7000000000000002 0.112 -0.20000000000000001 2.7000000000000002 0 -0.20000000000000001 2.7000000000000002 -0.002 0 3.1499999999999999 -0.45000000000000001 -0.80000000000000004 3.1499999999999999 -0.80000000000000004 -0.45000000000000001 3.1499999999999999 -0.80000000000000004 0 3.1499999999999999 -0.112 -0.20000000000000001 2.7000000000000002 -0.20000000000000001 -0.112 2.7000000000000002 -0.20000000000000001 0 2.7000000000000002 0 0.002 3.1499999999999999 -0.80000000000000004 0.45000000000000001 3.1499999999999999 -0.45000000000000001 0.80000000000000004 3.1499999999999999 0 0.80000000000000004 3.1499999999999999 -0.20000000000000001 0.112 2.7000000000000002 -0.112 0.20000000000000001 2.7000000000000002 0 0.20000000000000001 2.7000000000000002 0.45000000000000001 0.80000000000000004 3.1499999999999999 0.80000000000000004 0.45000000000000001 3.1499999999999999 0.112 0.20000000000000001 2.7000000000000002 0.20000000000000001 0.112 2.7000000000000002 0.40000000000000002 0 2.5499999999999998 0.40000000000000002 -0.224 2.5499999999999998 0.224 -0.40000000000000002 2.5499999999999998 0 -0.40000000000000002 2.5499999999999998 1.3 0 2.5499999999999998 1.3 -0.72799999999999998 2.5499999999999998 0.72799999999999998 -1.3 2.5499999999999998 0 -1.3 2.5499999999999998 1.3 0 2.3999999999999999 1.3 -0.72799999999999998 2.3999999999999999 0.72799999999999998 -1.3 2.3999999999999999 0 -1.3 2.3999999999999999 -0.224 -0.40000000000000002 2.5499999999999998 -0.40000000000000002 -0.224 2.5499999999999998 -0.40000000000000002 0 2.5499999999999998 -0.72799999999999998 -1.3 2.5499999999999998 -1.3 -0.72799999999999998 2.5499999999999998 -1.3 0 2.5499999999999998 -0.72799999999999998 -1.3 2.3999999999999999 -1.3 -0.72799999999999998 2.3999999999999999 -1.3 0 2.3999999999999999 -0.40000000000000002 0.224 2.5499999999999998 -0.224 0.40000000000000002 2.5499999999999998 0 0.40000000000000002 2.5499999999999998 -1.3 0.72799999999999998 2.5499999999999998 -0.72799999999999998 1.3 2.5499999999999998 0 1.3 2.5499999999999998 -1.3 0.72799999999999998 2.3999999999999999 -0.72799999999999998 1.3 2.3999999999999999 0 1.3 2.3999999999999999 0.224 0.40000000000000002 2.5499999999999998 0.40000000000000002 0.224 2.5499999999999998 0.72799999999999998 1.3 2.5499999999999998 1.3 0.72799999999999998 2.5499999999999998 0.72799999999999998 1.3 2.3999999999999999 1.3 0.72799999999999998 2.3999999999999999 0 0 0 1.5 0 0.14999999999999999 1.5 0.83999999999999997 0.14999999999999999 0.83999999999999997 1.5 0.14999999999999999 0 1.5 0.14999999999999999 1.5 0 0.074999999999999997 1.5 0.83999999999999997 0.074999999999999997 0.83999999999999997 1.5 0.074999999999999997 0 1.5 0.074999999999999997 1.425 0 0 1.425 0.79800000000000004 0 0.79800000000000004 1.425 0 0 1.425 0 -0.83999999999999997 1.5 0.14999999999999999 -1.5 0.83999999999999997 0.14999999999999999 -1.5 0 0.14999999999999999 -0.83999999999999997 1.5 0.074999999999999997 -1.5 0.83999999999999997 0.074999999999999997 -1.5 0 0.074999999999999997 -0.79800000000000004 1.425 0 -1.425 0.79800000000000004 0 -1.425 0 0 -1.5 -0.83999999999999997 0.14999999999999999 -0.83999999999999997 -1.5 0.14999999999999999 0 -1.5 0.14999999999999999 -1.5 -0.83999999999999997 0.074999999999999997 -0.83999999999999997 -1.5 0.074999999999999997 0 -1.5 0.074999999999999997 -1.425 -0.79800000000000004 0 -0.79800000000000004 -1.425 0 0 -1.425 0 0.83999999999999997 -1.5 0.14999999999999999 1.5 -0.83999999999999997 0.14999999999999999 0.83999999999999997 -1.5 0.074999999999999997 1.5 -0.83999999999999997 0.074999999999999997 0.79800000000000004 -1.425 0 1.425 -0.79800000000000004 0 0 0 0 1 0 0 2 0 0 3 0 0 -5 5 0 -1.6666666666666665 5 0 1.6666666666666665 5 0 5 5 0 -5 1.6666666666666665 0 -1.6666666666666665 1.6666666666666665 0 1.6666666666666665 1.6666666666666665 0 5 1.6666666666666665 0 -5 -1.6666666666666665 0 -1.6666666666666665 -1.6666666666666665 0 1.6666666666666665 -1.6666666666666665 0 5 -1.6666666666666665 0 -5 -5 0 -1.6666666666666665 -5 0 1.6666666666666665 -5 0 5 -5 0 -2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5 5 0 5 4.9039264020161522 -0.97545161008064118 5 4.6193976625564339 -1.913417161825449 5 4.1573480615127263 -2.7778511650980109 5 3.5355339059327378 -3.5355339059327373 5 2.7778511650980113 -4.1573480615127263 5 1.9134171618254492 -4.6193976625564339 5 0.97545161008064163 -4.9039264020161522 5 3.0615158845559431e-16 -5 5 -0.97545161008064096 -4.9039264020161522 5 -1.9134171618254485 -4.6193976625564339 5 -2.77785116509801 -4.1573480615127272 5 -3.5355339059327373 -3.5355339059327378 5 -4.1573480615127263 -2.7778511650980109 5 -4.6193976625564339 -1.9134171618254494 5 -4.9039264020161522 -0.97545161008064307 5 -5 -6.1230317691118863e-16 5 -4.9039264020161522 0.97545161008064185 5 -4.6193976625564339 1.9134171618254483 5 -4.1573480615127272 2.77785116509801 5 -3.5355339059327386 3.5355339059327373 5 -2.7778511650980109 4.1573480615127263 5 -1.9134171618254516 4.6193976625564321 5 -0.97545161008064329 4.9039264020161513 5 -9.1845476536678294e-16 5 5 0.97545161008064152 4.9039264020161522 5 1.9134171618254501 4.619397662556433 5 2.7778511650980091 4.1573480615127272 5 3.5355339059327369 3.5355339059327386 5 4.1573480615127263 2.7778511650980109 5 4.6193976625564321 1.9134171618254521 5 4.9039264020161513 0.97545161008064363 5 5 0 3 4.9039264020161522 -0.97545161008064118 3 4.6193976625564339 -1.913417161825449 3 4.1573480615127263 -2.7778511650980109 3 3.5355339059327378 -3.5355339059327373 3 2.7778511650980113 -4.1573480615127263 3 1.9134171618254492 -4.6193976625564339 3 0.97545161008064163 -4.9039264020161522 3 3.0615158845559431e-16 -5 3 -0.97545161008064096 -4.9039264020161522 3 -1.9134171618254485 -4.6193976625564339 3 -2.77785116509801 -4.1573480615127272 3 -3.5355339059327373 -3.5355339059327378 3 -4.1573480615127263 -2.7778511650980109 3 -4.6193976625564339 -1.9134171618254494 3 -4.9039264020161522 -0.97545161008064307 3 -5 -6.1230317691118863e-16 3 -4.9039264020161522 0.97545161008064185 3 -4.6193976625564339 1.9134171618254483 3 -4.1573480615127272 2.77785116509801 3 -3.5355339059327386 3.5355339059327373 3 -2.7778511650980109 4.1573480615127263 3 -1.9134171618254516 4.6193976625564321 3 -0.97545161008064329 4.9039264020161513 3 -9.1845476536678294e-16 5 3 0.97545161008064152 4.9039264020161522 3 1.9134171618254501 4.619397662556433 3 2.7778511650980091 4.1573480615127272 3 3.5355339059327369 3.5355339059327386 3 4.1573480615127263 2.7778511650980109 3 4.6193976625564321 1.9134171618254521 3 4.9039264020161513 0.97545161008064363 3 5 0 0.99999999999999989 4.9039264020161522 -0.97545161008064118 0.99999999999999989 4.6193976625564339 -1.913417161825449 0.99999999999999989 4.1573480615127263 -2.7778511650980109 0.99999999999999989 3.5355339059327378 -3.5355339059327373 0.99999999999999989 2.7778511650980113 -4.1573480615127263 0.99999999999999989 1.9134171618254492 -4.6193976625564339 0.99999999999999989 0.97545161008064163 -4.9039264020161522 0.99999999999999989 3.0615158845559431e-16 -5 0.99999999999999989 -0.97545161008064096 -4.9039264020161522 0.99999999999999989 -1.9134171618254485 -4.6193976625564339 0.99999999999999989 -2.77785116509801 -4.1573480615127272 0.99999999999999989 -3.5355339059327373 -3.5355339059327378 0.99999999999999989 -4.1573480615127263 -2.7778511650980109 0.99999999999999989 -4.6193976625564339 -1.9134171618254494 0.99999999999999989 -4.9039264020161522 -0.97545161008064307 0.99999999999999989 -5 -6.1230317691118863e-16 0.99999999999999989 -4.9039264020161522 0.97545161008064185 0.99999999999999989 -4.6193976625564339 1.9134171618254483 0.99999999999999989 -4.1573480615127272 2.77785116509801 0.99999999999999989 -3.5355339059327386 3.5355339059327373 0.99999999999999989 -2.7778511650980109 4.1573480615127263 0.99999999999999989 -1.9134171618254516 4.6193976625564321 0.99999999999999989 -0.97545161008064329 4.9039264020161513 0.99999999999999989 -9.1845476536678294e-16 5 0.99999999999999989 0.97545161008064152 4.9039264020161522 0.99999999999999989 1.9134171618254501 4.619397662556433 0.99999999999999989 2.7778511650980091 4.1573480615127272 0.99999999999999989 3.5355339059327369 3.5355339059327386 0.99999999999999989 4.1573480615127263 2.7778511650980109 0.99999999999999989 4.6193976625564321 1.9134171618254521 0.99999999999999989 4.9039264020161513 0.97545161008064363 0.99999999999999989 5 0 -0.99999999999999989 4.9039264020161522 -0.97545161008064118 -0.99999999999999989 4.6193976625564339 -1.913417161825449 -0.99999999999999989 4.1573480615127263 -2.7778511650980109 -0.99999999999999989 3.5355339059327378 -3.5355339059327373 -0.99999999999999989 2.7778511650980113 -4.1573480615127263 -0.99999999999999989 1.9134171618254492 -4.6193976625564339 -0.99999999999999989 0.97545161008064163 -4.9039264020161522 -0.99999999999999989 3.0615158845559431e-16 -5 -0.99999999999999989 -0.97545161008064096 -4.9039264020161522 -0.99999999999999989 -1.9134171618254485 -4.6193976625564339 -0.99999999999999989 -2.77785116509801 -4.1573480615127272 -0.99999999999999989 -3.5355339059327373 -3.5355339059327378 -0.99999999999999989 -4.1573480615127263 -2.7778511650980109 -0.99999999999999989 -4.6193976625564339 -1.9134171618254494 -0.99999999999999989 -4.9039264020161522 -0.97545161008064307 -0.99999999999999989 -5 -6.1230317691118863e-16 -0.99999999999999989 -4.9039264020161522 0.97545161008064185 -0.99999999999999989 -4.6193976625564339 1.9134171618254483 -0.99999999999999989 -4.1573480615127272 2.77785116509801 -0.99999999999999989 -3.5355339059327386 3.5355339059327373 -0.99999999999999989 -2.7778511650980109 4.1573480615127263 -0.99999999999999989 -1.9134171618254516 4.6193976625564321 -0.99999999999999989 -0.97545161008064329 4.9039264020161513 -0.99999999999999989 -9.1845476536678294e-16 5 -0.99999999999999989 0.97545161008064152 4.9039264020161522 -0.99999999999999989 1.9134171618254501 4.619397662556433 -0.99999999999999989 2.7778511650980091 4.1573480615127272 -0.99999999999999989 3.5355339059327369 3.5355339059327386 -0.99999999999999989 4.1573480615127263 2.7778511650980109 -0.99999999999999989 4.6193976625564321 1.9134171618254521 -0.99999999999999989 4.9039264020161513 0.97545161008064363 -0.99999999999999989 5 0 -3 4.9039264020161522 -0.97545161008064118 -3 4.6193976625564339 -1.913417161825449 -3 4.1573480615127263 -2.7778511650980109 -3 3.5355339059327378 -3.5355339059327373 -3 2.7778511650980113 -4.1573480615127263 -3 1.9134171618254492 -4.6193976625564339 -3 0.97545161008064163 -4.9039264020161522 -3 3.0615158845559431e-16 -5 -3 -0.97545161008064096 -4.9039264020161522 -3 -1.9134171618254485 -4.6193976625564339 -3 -2.77785116509801 -4.1573480615127272 -3 -3.5355339059327373 -3.5355339059327378 -3 -4.1573480615127263 -2.7778511650980109 -3 -4.6193976625564339 -1.9134171618254494 -3 -4.9039264020161522 -0.97545161008064307 -3 -5 -6.1230317691118863e-16 -3 -4.9039264020161522 0.97545161008064185 -3 -4.6193976625564339 1.9134171618254483 -3 -4.1573480615127272 2.77785116509801 -3 -3.5355339059327386 3.5355339059327373 -3 -2.7778511650980109 4.1573480615127263 -3 -1.9134171618254516 4.6193976625564321 -3 -0.97545161008064329 4.9039264020161513 -3 -9.1845476536678294e-16 5 -3 0.97545161008064152 4.9039264020161522 -3 1.9134171618254501 4.619397662556433 -3 2.7778511650980091 4.1573480615127272 -3 3.5355339059327369 3.5355339059327386 -3 4.1573480615127263 2.7778511650980109 -3 4.6193976625564321 1.9134171618254521 -3 4.9039264020161513 0.97545161008064363 -3 5 0 -5 4.9039264020161522 -0.97545161008064118 -5 4.6193976625564339 -1.913417161825449 -5 4.1573480615127263 -2.7778511650980109 -5 3.5355339059327378 -3.5355339059327373 -5 2.7778511650980113 -4.1573480615127263 -5 1.9134171618254492 -4.6193976625564339 -5 0.97545161008064163 -4.9039264020161522 -5 3.0615158845559431e-16 -5 -5 -0.97545161008064096 -4.9039264020161522 -5 -1.9134171618254485 -4.6193976625564339 -5 -2.77785116509801 -4.1573480615127272 -5 -3.5355339059327373 -3.5355339059327378 -5 -4.1573480615127263 -2.7778511650980109 -5 -4.6193976625564339 -1.9134171618254494 -5 -4.9039264020161522 -0.97545161008064307 -5 -5 -6.1230317691118863e-16 -5 -4.9039264020161522 0.97545161008064185 -5 -4.6193976625564339 1.9134171618254483 -5 -4.1573480615127272 2.77785116509801 -5 -3.5355339059327386 3.5355339059327373 -5 -2.7778511650980109 4.1573480615127263 -5 -1.9134171618254516 4.6193976625564321 -5 -0.97545161008064329 4.9039264020161513 -5 -9.1845476536678294e-16 5 -5 0.97545161008064152 4.9039264020161522 -5 1.9134171618254501 4.619397662556433 -5 2.7778511650980091 4.1573480615127272 -5 3.5355339059327369 3.5355339059327386 -5 4.1573480615127263 2.7778511650980109 -5 4.6193976625564321 1.9134171618254521 -5 4.9039264020161513 0.97545161008064363 -5 -5 5 0 -1.6666666666666665 5 0 1.6666666666666665 5 0 5 5 0 -5 1.6666666666666665 0 -1.6666666666666665 1.6666666666666665 0 1.6666666666666665 1.6666666666666665 0 5 1.6666666666666665 0 -5 -1.6666666666666665 0 -1.6666666666666665 -1.6666666666666665 0 1.6666666666666665 -1.6666666666666665 0 5 -1.6666666666666665 0 -5 -5 0 -1.6666666666666665 -5 0 1.6666666666666665 -5 0 5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"linear_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"periodic\" type=\"k3d::bool_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">100</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"width\" type=\"k3d::double_t\">0.10000000000000001</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"bicubic_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 103 116 117 118 107 119 120 121 111 122 123 124 115 125 126 127 118 128 129 130 121 131 132 133 124 134 135 136 127 137 138 139 130 140 141 100 133 142 143 104 136 144 145 108 139 146 147 112 112 113 114 115 148 149 150 151 152 153 154 155 156 157 158 159 115 125 126 127 151 160 161 162 155 163 164 165 159 166 167 168 127 137 138 139 162 169 170 171 165 172 173 174 168 175 176 177 139 146 147 112 171 178 179 148 174 180 181 152 177 182 183 156 156 157 158 159 184 185 186 187 188 189 190 191 192 193 194 195 159 166 167 168 187 196 197 198 191 199 200 201 195 202 203 204 168 175 176 177 198 205 206 207 201 208 209 210 204 211 212 213 177 182 183 156 207 214 215 184 210 216 217 188 213 218 219 192 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 223 236 237 220 227 238 239 224 231 240 241 228 235 242 243 232 232 233 234 235 244 245 246 247 248 249 250 251 168 252 253 254 235 242 243 232 247 255 256 244 251 257 258 248 254 259 260 168 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 264 277 278 261 268 279 280 265 272 281 282 269 276 283 284 273 273 274 275 276 285 286 287 288 289 290 291 292 293 294 295 296 276 283 284 273 288 297 298 285 292 299 300 289 296 301 302 293 303 303 303 303 306 307 308 309 310 310 310 310 311 312 313 314 303 303 303 303 309 316 317 318 310 310 310 310 314 319 320 321 303 303 303 303 318 323 324 325 310 310 310 310 321 326 327 328 303 303 303 303 325 329 330 306 310 310 310 310 328 331 332 311 311 312 313 314 333 334 335 336 337 338 339 340 341 342 343 344 314 319 320 321 336 345 346 347 340 348 349 350 344 351 352 353 321 326 327 328 347 354 355 356 350 357 358 359 353 360 361 362 328 331 332 311 356 363 364 333 359 365 366 337 362 367 368 341 369 369 369 369 378 379 380 381 374 375 376 377 370 371 372 373 369 369 369 369 381 388 389 390 377 385 386 387 373 382 383 384 369 369 369 369 390 397 398 399 387 394 395 396 384 391 392 393 369 369 369 369 399 404 405 378 396 402 403 374 393 400 401 370\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">406 407 408 409\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">426 427 431 430 427 428 432 431 428 429 433 432 429 426 430 433 427 426 429 428 430 431 432 433\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"cone\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"heights\" type=\"k3d::double_t\">10</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">5</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 448 480 479 448 449 481 480 449 450 482 481 450 451 483 482 451 452 484 483 452 453 485 484 453 454 486 485 454 455 487 486 455 456 488 487 456 457 489 488 457 458 490 489 458 459 491 490 459 460 492 491 460 461 493 492 461 462 494 493 462 463 495 494 463 464 496 495 464 465 497 496 465 434 466 497 466 467 499 498 467 468 500 499 468 469 501 500 469 470 502 501 470 471 503 502 471 472 504 503 472 473 505 504 473 474 506 505 474 475 507 506 475 476 508 507 476 477 509 508 477 478 510 509 478 479 511 510 479 480 512 511 480 481 513 512 481 482 514 513 482 483 515 514 483 484 516 515 484 485 517 516 485 486 518 517 486 487 519 518 487 488 520 519 488 489 521 520 489 490 522 521 490 491 523 522 491 492 524 523 492 493 525 524 493 494 526 525 494 495 527 526 495 496 528 527 496 497 529 528 497 466 498 529 498 499 531 530 499 500 532 531 500 501 533 532 501 502 534 533 502 503 535 534 503 504 536 535 504 505 537 536 505 506 538 537 506 507 539 538 507 508 540 539 508 509 541 540 509 510 542 541 510 511 543 542 511 512 544 543 512 513 545 544 513 514 546 545 514 515 547 546 515 516 548 547 516 517 549 548 517 518 550 549 518 519 551 550 519 520 552 551 520 521 553 552 521 522 554 553 522 523 555 554 523 524 556 555 524 525 557 556 525 526 558 557 526 527 559 558 527 528 560 559 528 529 561 560 529 498 530 561 530 531 563 562 531 532 564 563 532 533 565 564 533 534 566 565 534 535 567 566 535 536 568 567 536 537 569 568 537 538 570 569 538 539 571 570 539 540 572 571 540 541 573 572 541 542 574 573 542 543 575 574 543 544 576 575 544 545 577 576 545 546 578 577 546 547 579 578 547 548 580 579 548 549 581 580 549 550 582 581 550 551 583 582 551 552 584 583 552 553 585 584 553 554 586 585 554 555 587 586 555 556 588 587 556 557 589 588 557 558 590 589 558 559 591 590 559 560 592 591 560 561 593 592 561 530 562 593 562 563 595 594 563 564 596 595 564 565 597 596 565 566 598 597 566 567 599 598 567 568 600 599 568 569 601 600 569 570 602 601 570 571 603 602 571 572 604 603 572 573 605 604 573 574 606 605 574 575 607 606 575 576 608 607 576 577 609 608 577 578 610 609 578 579 611 610 579 580 612 611 580 581 613 612 581 582 614 613 582 583 615 614 583 584 616 615 584 585 617 616 585 586 618 617 586 587 619 618 587 588 620 619 588 589 621 620 589 590 622 621 590 591 623 622 591 592 624 623 592 593 625 624 593 562 594 625 434 465 464 463 462 461 460 459 458 457 456 455 454 453 452 451 450 449 448 447 446 445 444 443 442 441 440 439 438 437 436 435 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MergePolyhedra.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 2.5 2.5 -2.5 2.5 2.5 -7.5 2.5 -2.5 -7.5 2.5 -2.5 -2.5 -2.5 2.5 -2.5 -2.5 2.5 -7.5 -2.5 -2.5 -7.5 -2.5 -2.5 -7.5 2.5 2.5 -7.5 2.5 2.5 -12.5 2.5 -2.5 -12.5 2.5 -2.5 -7.5 -2.5 2.5 -7.5 -2.5 2.5 -12.5 -2.5 -2.5 -12.5 -2.5 -2.5 -12.5 2.5 2.5 -12.5 2.5 2.5 -17.5 2.5 -2.5 -17.5 2.5 -2.5 -12.5 -2.5 2.5 -12.5 -2.5 2.5 -17.5 -2.5 -2.5 -17.5 -2.5 -2.5 -17.5 2.5 2.5 -17.5 2.5 2.5 -22.5 2.5 -2.5 -22.5 2.5 -2.5 -17.5 -2.5 2.5 -17.5 -2.5 2.5 -22.5 -2.5 -2.5 -22.5 -2.5 2.5 2.5 2.5 7.5 2.5 2.5 7.5 -2.5 2.5 2.5 -2.5 2.5 2.5 2.5 -2.5 7.5 2.5 -2.5 7.5 -2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 7.5 -2.5 2.5 7.5 -7.5 2.5 2.5 -7.5 2.5 2.5 -2.5 -2.5 7.5 -2.5 -2.5 7.5 -7.5 -2.5 2.5 -7.5 -2.5 2.5 -7.5 2.5 7.5 -7.5 2.5 7.5 -12.5 2.5 2.5 -12.5 2.5 2.5 -7.5 -2.5 7.5 -7.5 -2.5 7.5 -12.5 -2.5 2.5 -12.5 -2.5 2.5 -12.5 2.5 7.5 -12.5 2.5 7.5 -17.5 2.5 2.5 -17.5 2.5 2.5 -12.5 -2.5 7.5 -12.5 -2.5 7.5 -17.5 -2.5 2.5 -17.5 -2.5 2.5 -17.5 2.5 7.5 -17.5 2.5 7.5 -22.5 2.5 2.5 -22.5 2.5 2.5 -17.5 -2.5 7.5 -17.5 -2.5 7.5 -22.5 -2.5 2.5 -22.5 -2.5 7.5 2.5 2.5 12.5 2.5 2.5 12.5 -2.5 2.5 7.5 -2.5 2.5 7.5 2.5 -2.5 12.5 2.5 -2.5 12.5 -2.5 -2.5 7.5 -2.5 -2.5 7.5 -2.5 2.5 12.5 -2.5 2.5 12.5 -7.5 2.5 7.5 -7.5 2.5 7.5 -2.5 -2.5 12.5 -2.5 -2.5 12.5 -7.5 -2.5 7.5 -7.5 -2.5 7.5 -7.5 2.5 12.5 -7.5 2.5 12.5 -12.5 2.5 7.5 -12.5 2.5 7.5 -7.5 -2.5 12.5 -7.5 -2.5 12.5 -12.5 -2.5 7.5 -12.5 -2.5 7.5 -12.5 2.5 12.5 -12.5 2.5 12.5 -17.5 2.5 7.5 -17.5 2.5 7.5 -12.5 -2.5 12.5 -12.5 -2.5 12.5 -17.5 -2.5 7.5 -17.5 -2.5 7.5 -17.5 2.5 12.5 -17.5 2.5 12.5 -22.5 2.5 7.5 -22.5 2.5 7.5 -17.5 -2.5 12.5 -17.5 -2.5 12.5 -22.5 -2.5 7.5 -22.5 -2.5 12.5 2.5 2.5 17.5 2.5 2.5 17.5 -2.5 2.5 12.5 -2.5 2.5 12.5 2.5 -2.5 17.5 2.5 -2.5 17.5 -2.5 -2.5 12.5 -2.5 -2.5 12.5 -2.5 2.5 17.5 -2.5 2.5 17.5 -7.5 2.5 12.5 -7.5 2.5 12.5 -2.5 -2.5 17.5 -2.5 -2.5 17.5 -7.5 -2.5 12.5 -7.5 -2.5 12.5 -7.5 2.5 17.5 -7.5 2.5 17.5 -12.5 2.5 12.5 -12.5 2.5 12.5 -7.5 -2.5 17.5 -7.5 -2.5 17.5 -12.5 -2.5 12.5 -12.5 -2.5 12.5 -12.5 2.5 17.5 -12.5 2.5 17.5 -17.5 2.5 12.5 -17.5 2.5 12.5 -12.5 -2.5 17.5 -12.5 -2.5 17.5 -17.5 -2.5 12.5 -17.5 -2.5 12.5 -17.5 2.5 17.5 -17.5 2.5 17.5 -22.5 2.5 12.5 -22.5 2.5 12.5 -17.5 -2.5 17.5 -17.5 -2.5 17.5 -22.5 -2.5 12.5 -22.5 -2.5 17.5 2.5 2.5 22.5 2.5 2.5 22.5 -2.5 2.5 17.5 -2.5 2.5 17.5 2.5 -2.5 22.5 2.5 -2.5 22.5 -2.5 -2.5 17.5 -2.5 -2.5 17.5 -2.5 2.5 22.5 -2.5 2.5 22.5 -7.5 2.5 17.5 -7.5 2.5 17.5 -2.5 -2.5 22.5 -2.5 -2.5 22.5 -7.5 -2.5 17.5 -7.5 -2.5 17.5 -7.5 2.5 22.5 -7.5 2.5 22.5 -12.5 2.5 17.5 -12.5 2.5 17.5 -7.5 -2.5 22.5 -7.5 -2.5 22.5 -12.5 -2.5 17.5 -12.5 -2.5 17.5 -12.5 2.5 22.5 -12.5 2.5 22.5 -17.5 2.5 17.5 -17.5 2.5 17.5 -12.5 -2.5 22.5 -12.5 -2.5 22.5 -17.5 -2.5 17.5 -17.5 -2.5 17.5 -17.5 2.5 22.5 -17.5 2.5 22.5 -22.5 2.5 17.5 -22.5 2.5 17.5 -17.5 -2.5 22.5 -17.5 -2.5 22.5 -22.5 -2.5 17.5 -22.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 8 8 8 8 8 8 9 9 9 9 9 9 10 10 10 10 10 10 11 11 11 11 11 11 12 12 12 12 12 12 13 13 13 13 13 13 14 14 14 14 14 14 15 15 15 15 15 15 16 16 16 16 16 16 17 17 17 17 17 17 18 18 18 18 18 18 19 19 19 19 19 19 20 20 20 20 20 20 21 21 21 21 21 21 22 22 22 22 22 22 23 23 23 23 23 23 24 24 24 24 24 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7 8 9 13 12 9 10 14 13 10 11 15 14 11 8 12 15 9 8 11 10 12 13 14 15 16 17 21 20 17 18 22 21 18 19 23 22 19 16 20 23 17 16 19 18 20 21 22 23 24 25 29 28 25 26 30 29 26 27 31 30 27 24 28 31 25 24 27 26 28 29 30 31 32 33 37 36 33 34 38 37 34 35 39 38 35 32 36 39 33 32 35 34 36 37 38 39 40 41 45 44 41 42 46 45 42 43 47 46 43 40 44 47 41 40 43 42 44 45 46 47 48 49 53 52 49 50 54 53 50 51 55 54 51 48 52 55 49 48 51 50 52 53 54 55 56 57 61 60 57 58 62 61 58 59 63 62 59 56 60 63 57 56 59 58 60 61 62 63 64 65 69 68 65 66 70 69 66 67 71 70 67 64 68 71 65 64 67 66 68 69 70 71 72 73 77 76 73 74 78 77 74 75 79 78 75 72 76 79 73 72 75 74 76 77 78 79 80 81 85 84 81 82 86 85 82 83 87 86 83 80 84 87 81 80 83 82 84 85 86 87 88 89 93 92 89 90 94 93 90 91 95 94 91 88 92 95 89 88 91 90 92 93 94 95 96 97 101 100 97 98 102 101 98 99 103 102 99 96 100 103 97 96 99 98 100 101 102 103 104 105 109 108 105 106 110 109 106 107 111 110 107 104 108 111 105 104 107 106 108 109 110 111 112 113 117 116 113 114 118 117 114 115 119 118 115 112 116 119 113 112 115 114 116 117 118 119 120 121 125 124 121 122 126 125 122 123 127 126 123 120 124 127 121 120 123 122 124 125 126 127 128 129 133 132 129 130 134 133 130 131 135 134 131 128 132 135 129 128 131 130 132 133 134 135 136 137 141 140 137 138 142 141 138 139 143 142 139 136 140 143 137 136 139 138 140 141 142 143 144 145 149 148 145 146 150 149 146 147 151 150 147 144 148 151 145 144 147 146 148 149 150 151 152 153 157 156 153 154 158 157 154 155 159 158 155 152 156 159 153 152 155 154 156 157 158 159 160 161 165 164 161 162 166 165 162 163 167 166 163 160 164 167 161 160 163 162 164 165 166 167 168 169 173 172 169 170 174 173 170 171 175 174 171 168 172 175 169 168 171 170 172 173 174 175 176 177 181 180 177 178 182 181 178 179 183 182 179 176 180 183 177 176 179 178 180 181 182 183 184 185 189 188 185 186 190 189 186 187 191 190 187 184 188 191 185 184 187 186 188 189 190 191 192 193 197 196 193 194 198 197 194 195 199 198 195 192 196 199 193 192 195 194 196 197 198 199\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MeshArray1D.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5 2.5 2.5 2.5 7.5 2.5 2.5 7.5 -2.5 2.5 2.5 -2.5 2.5 2.5 2.5 -2.5 7.5 2.5 -2.5 7.5 -2.5 -2.5 2.5 -2.5 -2.5 7.5 2.5 2.5 12.5 2.5 2.5 12.5 -2.5 2.5 7.5 -2.5 2.5 7.5 2.5 -2.5 12.5 2.5 -2.5 12.5 -2.5 -2.5 7.5 -2.5 -2.5 12.5 2.5 2.5 17.5 2.5 2.5 17.5 -2.5 2.5 12.5 -2.5 2.5 12.5 2.5 -2.5 17.5 2.5 -2.5 17.5 -2.5 -2.5 12.5 -2.5 -2.5 17.5 2.5 2.5 22.5 2.5 2.5 22.5 -2.5 2.5 17.5 -2.5 2.5 17.5 2.5 -2.5 22.5 2.5 -2.5 22.5 -2.5 -2.5 17.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">8 9 13 12 9 10 14 13 10 11 15 14 11 8 12 15 9 8 11 10 12 13 14 15\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">16 17 21 20 17 18 22 21 18 19 23 22 19 16 20 23 17 16 19 18 20 21 22 23\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">24 25 29 28 25 26 30 29 26 27 31 30 27 24 28 31 25 24 27 26 28 29 30 31\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">32 33 37 36 33 34 38 37 34 35 39 38 35 32 36 39 33 32 35 34 36 37 38 39\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MeshArray2D.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 2.5 2.5 -2.5 2.5 2.5 -7.5 2.5 -2.5 -7.5 2.5 -2.5 -2.5 -2.5 2.5 -2.5 -2.5 2.5 -7.5 -2.5 -2.5 -7.5 -2.5 -2.5 -7.5 2.5 2.5 -7.5 2.5 2.5 -12.5 2.5 -2.5 -12.5 2.5 -2.5 -7.5 -2.5 2.5 -7.5 -2.5 2.5 -12.5 -2.5 -2.5 -12.5 -2.5 -2.5 -12.5 2.5 2.5 -12.5 2.5 2.5 -17.5 2.5 -2.5 -17.5 2.5 -2.5 -12.5 -2.5 2.5 -12.5 -2.5 2.5 -17.5 -2.5 -2.5 -17.5 -2.5 -2.5 -17.5 2.5 2.5 -17.5 2.5 2.5 -22.5 2.5 -2.5 -22.5 2.5 -2.5 -17.5 -2.5 2.5 -17.5 -2.5 2.5 -22.5 -2.5 -2.5 -22.5 -2.5 2.5 2.5 2.5 7.5 2.5 2.5 7.5 -2.5 2.5 2.5 -2.5 2.5 2.5 2.5 -2.5 7.5 2.5 -2.5 7.5 -2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 7.5 -2.5 2.5 7.5 -7.5 2.5 2.5 -7.5 2.5 2.5 -2.5 -2.5 7.5 -2.5 -2.5 7.5 -7.5 -2.5 2.5 -7.5 -2.5 2.5 -7.5 2.5 7.5 -7.5 2.5 7.5 -12.5 2.5 2.5 -12.5 2.5 2.5 -7.5 -2.5 7.5 -7.5 -2.5 7.5 -12.5 -2.5 2.5 -12.5 -2.5 2.5 -12.5 2.5 7.5 -12.5 2.5 7.5 -17.5 2.5 2.5 -17.5 2.5 2.5 -12.5 -2.5 7.5 -12.5 -2.5 7.5 -17.5 -2.5 2.5 -17.5 -2.5 2.5 -17.5 2.5 7.5 -17.5 2.5 7.5 -22.5 2.5 2.5 -22.5 2.5 2.5 -17.5 -2.5 7.5 -17.5 -2.5 7.5 -22.5 -2.5 2.5 -22.5 -2.5 7.5 2.5 2.5 12.5 2.5 2.5 12.5 -2.5 2.5 7.5 -2.5 2.5 7.5 2.5 -2.5 12.5 2.5 -2.5 12.5 -2.5 -2.5 7.5 -2.5 -2.5 7.5 -2.5 2.5 12.5 -2.5 2.5 12.5 -7.5 2.5 7.5 -7.5 2.5 7.5 -2.5 -2.5 12.5 -2.5 -2.5 12.5 -7.5 -2.5 7.5 -7.5 -2.5 7.5 -7.5 2.5 12.5 -7.5 2.5 12.5 -12.5 2.5 7.5 -12.5 2.5 7.5 -7.5 -2.5 12.5 -7.5 -2.5 12.5 -12.5 -2.5 7.5 -12.5 -2.5 7.5 -12.5 2.5 12.5 -12.5 2.5 12.5 -17.5 2.5 7.5 -17.5 2.5 7.5 -12.5 -2.5 12.5 -12.5 -2.5 12.5 -17.5 -2.5 7.5 -17.5 -2.5 7.5 -17.5 2.5 12.5 -17.5 2.5 12.5 -22.5 2.5 7.5 -22.5 2.5 7.5 -17.5 -2.5 12.5 -17.5 -2.5 12.5 -22.5 -2.5 7.5 -22.5 -2.5 12.5 2.5 2.5 17.5 2.5 2.5 17.5 -2.5 2.5 12.5 -2.5 2.5 12.5 2.5 -2.5 17.5 2.5 -2.5 17.5 -2.5 -2.5 12.5 -2.5 -2.5 12.5 -2.5 2.5 17.5 -2.5 2.5 17.5 -7.5 2.5 12.5 -7.5 2.5 12.5 -2.5 -2.5 17.5 -2.5 -2.5 17.5 -7.5 -2.5 12.5 -7.5 -2.5 12.5 -7.5 2.5 17.5 -7.5 2.5 17.5 -12.5 2.5 12.5 -12.5 2.5 12.5 -7.5 -2.5 17.5 -7.5 -2.5 17.5 -12.5 -2.5 12.5 -12.5 -2.5 12.5 -12.5 2.5 17.5 -12.5 2.5 17.5 -17.5 2.5 12.5 -17.5 2.5 12.5 -12.5 -2.5 17.5 -12.5 -2.5 17.5 -17.5 -2.5 12.5 -17.5 -2.5 12.5 -17.5 2.5 17.5 -17.5 2.5 17.5 -22.5 2.5 12.5 -22.5 2.5 12.5 -17.5 -2.5 17.5 -17.5 -2.5 17.5 -22.5 -2.5 12.5 -22.5 -2.5 17.5 2.5 2.5 22.5 2.5 2.5 22.5 -2.5 2.5 17.5 -2.5 2.5 17.5 2.5 -2.5 22.5 2.5 -2.5 22.5 -2.5 -2.5 17.5 -2.5 -2.5 17.5 -2.5 2.5 22.5 -2.5 2.5 22.5 -7.5 2.5 17.5 -7.5 2.5 17.5 -2.5 -2.5 22.5 -2.5 -2.5 22.5 -7.5 -2.5 17.5 -7.5 -2.5 17.5 -7.5 2.5 22.5 -7.5 2.5 22.5 -12.5 2.5 17.5 -12.5 2.5 17.5 -7.5 -2.5 22.5 -7.5 -2.5 22.5 -12.5 -2.5 17.5 -12.5 -2.5 17.5 -12.5 2.5 22.5 -12.5 2.5 22.5 -17.5 2.5 17.5 -17.5 2.5 17.5 -12.5 -2.5 22.5 -12.5 -2.5 22.5 -17.5 -2.5 17.5 -17.5 -2.5 17.5 -17.5 2.5 22.5 -17.5 2.5 22.5 -22.5 2.5 17.5 -22.5 2.5 17.5 -17.5 -2.5 22.5 -17.5 -2.5 22.5 -22.5 -2.5 17.5 -22.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">8 9 13 12 9 10 14 13 10 11 15 14 11 8 12 15 9 8 11 10 12 13 14 15\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">16 17 21 20 17 18 22 21 18 19 23 22 19 16 20 23 17 16 19 18 20 21 22 23\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">24 25 29 28 25 26 30 29 26 27 31 30 27 24 28 31 25 24 27 26 28 29 30 31\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">32 33 37 36 33 34 38 37 34 35 39 38 35 32 36 39 33 32 35 34 36 37 38 39\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">40 41 45 44 41 42 46 45 42 43 47 46 43 40 44 47 41 40 43 42 44 45 46 47\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">48 49 53 52 49 50 54 53 50 51 55 54 51 48 52 55 49 48 51 50 52 53 54 55\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">56 57 61 60 57 58 62 61 58 59 63 62 59 56 60 63 57 56 59 58 60 61 62 63\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">64 65 69 68 65 66 70 69 66 67 71 70 67 64 68 71 65 64 67 66 68 69 70 71\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">72 73 77 76 73 74 78 77 74 75 79 78 75 72 76 79 73 72 75 74 76 77 78 79\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">80 81 85 84 81 82 86 85 82 83 87 86 83 80 84 87 81 80 83 82 84 85 86 87\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">88 89 93 92 89 90 94 93 90 91 95 94 91 88 92 95 89 88 91 90 92 93 94 95\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">96 97 101 100 97 98 102 101 98 99 103 102 99 96 100 103 97 96 99 98 100 101 102 103\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">104 105 109 108 105 106 110 109 106 107 111 110 107 104 108 111 105 104 107 106 108 109 110 111\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">112 113 117 116 113 114 118 117 114 115 119 118 115 112 116 119 113 112 115 114 116 117 118 119\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">120 121 125 124 121 122 126 125 122 123 127 126 123 120 124 127 121 120 123 122 124 125 126 127\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">128 129 133 132 129 130 134 133 130 131 135 134 131 128 132 135 129 128 131 130 132 133 134 135\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">136 137 141 140 137 138 142 141 138 139 143 142 139 136 140 143 137 136 139 138 140 141 142 143\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">144 145 149 148 145 146 150 149 146 147 151 150 147 144 148 151 145 144 147 146 148 149 150 151\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">152 153 157 156 153 154 158 157 154 155 159 158 155 152 156 159 153 152 155 154 156 157 158 159\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">160 161 165 164 161 162 166 165 162 163 167 166 163 160 164 167 161 160 163 162 164 165 166 167\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">168 169 173 172 169 170 174 173 170 171 175 174 171 168 172 175 169 168 171 170 172 173 174 175\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">176 177 181 180 177 178 182 181 178 179 183 182 179 176 180 183 177 176 179 178 180 181 182 183\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">184 185 189 188 185 186 190 189 186 187 191 190 187 184 188 191 185 184 187 186 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">192 193 197 196 193 194 198 197 194 195 199 198 195 192 196 199 193 192 195 194 196 197 198 199\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MeshArray3D.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 2.5 7.5 2.5 2.5 7.5 2.5 -2.5 7.5 -2.5 -2.5 7.5 -2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 12.5 2.5 2.5 12.5 2.5 -2.5 12.5 -2.5 -2.5 12.5 -2.5 2.5 7.5 2.5 2.5 7.5 2.5 -2.5 7.5 -2.5 -2.5 7.5 -2.5 2.5 17.5 2.5 2.5 17.5 2.5 -2.5 17.5 -2.5 -2.5 17.5 -2.5 2.5 12.5 2.5 2.5 12.5 2.5 -2.5 12.5 -2.5 -2.5 12.5 -2.5 2.5 22.5 2.5 2.5 22.5 2.5 -2.5 22.5 -2.5 -2.5 22.5 -2.5 2.5 17.5 2.5 2.5 17.5 2.5 -2.5 17.5 -2.5 -2.5 17.5 -2.5 -2.5 2.5 2.5 -2.5 2.5 2.5 -7.5 2.5 -2.5 -7.5 2.5 -2.5 -2.5 -2.5 2.5 -2.5 -2.5 2.5 -7.5 -2.5 -2.5 -7.5 -2.5 -2.5 -2.5 7.5 2.5 -2.5 7.5 2.5 -7.5 7.5 -2.5 -7.5 7.5 -2.5 -2.5 2.5 2.5 -2.5 2.5 2.5 -7.5 2.5 -2.5 -7.5 2.5 -2.5 -2.5 12.5 2.5 -2.5 12.5 2.5 -7.5 12.5 -2.5 -7.5 12.5 -2.5 -2.5 7.5 2.5 -2.5 7.5 2.5 -7.5 7.5 -2.5 -7.5 7.5 -2.5 -2.5 17.5 2.5 -2.5 17.5 2.5 -7.5 17.5 -2.5 -7.5 17.5 -2.5 -2.5 12.5 2.5 -2.5 12.5 2.5 -7.5 12.5 -2.5 -7.5 12.5 -2.5 -2.5 22.5 2.5 -2.5 22.5 2.5 -7.5 22.5 -2.5 -7.5 22.5 -2.5 -2.5 17.5 2.5 -2.5 17.5 2.5 -7.5 17.5 -2.5 -7.5 17.5 -2.5 -7.5 2.5 2.5 -7.5 2.5 2.5 -12.5 2.5 -2.5 -12.5 2.5 -2.5 -7.5 -2.5 2.5 -7.5 -2.5 2.5 -12.5 -2.5 -2.5 -12.5 -2.5 -2.5 -7.5 7.5 2.5 -7.5 7.5 2.5 -12.5 7.5 -2.5 -12.5 7.5 -2.5 -7.5 2.5 2.5 -7.5 2.5 2.5 -12.5 2.5 -2.5 -12.5 2.5 -2.5 -7.5 12.5 2.5 -7.5 12.5 2.5 -12.5 12.5 -2.5 -12.5 12.5 -2.5 -7.5 7.5 2.5 -7.5 7.5 2.5 -12.5 7.5 -2.5 -12.5 7.5 -2.5 -7.5 17.5 2.5 -7.5 17.5 2.5 -12.5 17.5 -2.5 -12.5 17.5 -2.5 -7.5 12.5 2.5 -7.5 12.5 2.5 -12.5 12.5 -2.5 -12.5 12.5 -2.5 -7.5 22.5 2.5 -7.5 22.5 2.5 -12.5 22.5 -2.5 -12.5 22.5 -2.5 -7.5 17.5 2.5 -7.5 17.5 2.5 -12.5 17.5 -2.5 -12.5 17.5 -2.5 -12.5 2.5 2.5 -12.5 2.5 2.5 -17.5 2.5 -2.5 -17.5 2.5 -2.5 -12.5 -2.5 2.5 -12.5 -2.5 2.5 -17.5 -2.5 -2.5 -17.5 -2.5 -2.5 -12.5 7.5 2.5 -12.5 7.5 2.5 -17.5 7.5 -2.5 -17.5 7.5 -2.5 -12.5 2.5 2.5 -12.5 2.5 2.5 -17.5 2.5 -2.5 -17.5 2.5 -2.5 -12.5 12.5 2.5 -12.5 12.5 2.5 -17.5 12.5 -2.5 -17.5 12.5 -2.5 -12.5 7.5 2.5 -12.5 7.5 2.5 -17.5 7.5 -2.5 -17.5 7.5 -2.5 -12.5 17.5 2.5 -12.5 17.5 2.5 -17.5 17.5 -2.5 -17.5 17.5 -2.5 -12.5 12.5 2.5 -12.5 12.5 2.5 -17.5 12.5 -2.5 -17.5 12.5 -2.5 -12.5 22.5 2.5 -12.5 22.5 2.5 -17.5 22.5 -2.5 -17.5 22.5 -2.5 -12.5 17.5 2.5 -12.5 17.5 2.5 -17.5 17.5 -2.5 -17.5 17.5 -2.5 -17.5 2.5 2.5 -17.5 2.5 2.5 -22.5 2.5 -2.5 -22.5 2.5 -2.5 -17.5 -2.5 2.5 -17.5 -2.5 2.5 -22.5 -2.5 -2.5 -22.5 -2.5 -2.5 -17.5 7.5 2.5 -17.5 7.5 2.5 -22.5 7.5 -2.5 -22.5 7.5 -2.5 -17.5 2.5 2.5 -17.5 2.5 2.5 -22.5 2.5 -2.5 -22.5 2.5 -2.5 -17.5 12.5 2.5 -17.5 12.5 2.5 -22.5 12.5 -2.5 -22.5 12.5 -2.5 -17.5 7.5 2.5 -17.5 7.5 2.5 -22.5 7.5 -2.5 -22.5 7.5 -2.5 -17.5 17.5 2.5 -17.5 17.5 2.5 -22.5 17.5 -2.5 -22.5 17.5 -2.5 -17.5 12.5 2.5 -17.5 12.5 2.5 -22.5 12.5 -2.5 -22.5 12.5 -2.5 -17.5 22.5 2.5 -17.5 22.5 2.5 -22.5 22.5 -2.5 -22.5 22.5 -2.5 -17.5 17.5 2.5 -17.5 17.5 2.5 -22.5 17.5 -2.5 -22.5 17.5 2.5 2.5 2.5 7.5 2.5 2.5 7.5 -2.5 2.5 2.5 -2.5 2.5 2.5 2.5 -2.5 7.5 2.5 -2.5 7.5 -2.5 -2.5 2.5 -2.5 -2.5 2.5 2.5 7.5 7.5 2.5 7.5 7.5 -2.5 7.5 2.5 -2.5 7.5 2.5 2.5 2.5 7.5 2.5 2.5 7.5 -2.5 2.5 2.5 -2.5 2.5 2.5 2.5 12.5 7.5 2.5 12.5 7.5 -2.5 12.5 2.5 -2.5 12.5 2.5 2.5 7.5 7.5 2.5 7.5 7.5 -2.5 7.5 2.5 -2.5 7.5 2.5 2.5 17.5 7.5 2.5 17.5 7.5 -2.5 17.5 2.5 -2.5 17.5 2.5 2.5 12.5 7.5 2.5 12.5 7.5 -2.5 12.5 2.5 -2.5 12.5 2.5 2.5 22.5 7.5 2.5 22.5 7.5 -2.5 22.5 2.5 -2.5 22.5 2.5 2.5 17.5 7.5 2.5 17.5 7.5 -2.5 17.5 2.5 -2.5 17.5 2.5 -2.5 2.5 7.5 -2.5 2.5 7.5 -7.5 2.5 2.5 -7.5 2.5 2.5 -2.5 -2.5 7.5 -2.5 -2.5 7.5 -7.5 -2.5 2.5 -7.5 -2.5 2.5 -2.5 7.5 7.5 -2.5 7.5 7.5 -7.5 7.5 2.5 -7.5 7.5 2.5 -2.5 2.5 7.5 -2.5 2.5 7.5 -7.5 2.5 2.5 -7.5 2.5 2.5 -2.5 12.5 7.5 -2.5 12.5 7.5 -7.5 12.5 2.5 -7.5 12.5 2.5 -2.5 7.5 7.5 -2.5 7.5 7.5 -7.5 7.5 2.5 -7.5 7.5 2.5 -2.5 17.5 7.5 -2.5 17.5 7.5 -7.5 17.5 2.5 -7.5 17.5 2.5 -2.5 12.5 7.5 -2.5 12.5 7.5 -7.5 12.5 2.5 -7.5 12.5 2.5 -2.5 22.5 7.5 -2.5 22.5 7.5 -7.5 22.5 2.5 -7.5 22.5 2.5 -2.5 17.5 7.5 -2.5 17.5 7.5 -7.5 17.5 2.5 -7.5 17.5 2.5 -7.5 2.5 7.5 -7.5 2.5 7.5 -12.5 2.5 2.5 -12.5 2.5 2.5 -7.5 -2.5 7.5 -7.5 -2.5 7.5 -12.5 -2.5 2.5 -12.5 -2.5 2.5 -7.5 7.5 7.5 -7.5 7.5 7.5 -12.5 7.5 2.5 -12.5 7.5 2.5 -7.5 2.5 7.5 -7.5 2.5 7.5 -12.5 2.5 2.5 -12.5 2.5 2.5 -7.5 12.5 7.5 -7.5 12.5 7.5 -12.5 12.5 2.5 -12.5 12.5 2.5 -7.5 7.5 7.5 -7.5 7.5 7.5 -12.5 7.5 2.5 -12.5 7.5 2.5 -7.5 17.5 7.5 -7.5 17.5 7.5 -12.5 17.5 2.5 -12.5 17.5 2.5 -7.5 12.5 7.5 -7.5 12.5 7.5 -12.5 12.5 2.5 -12.5 12.5 2.5 -7.5 22.5 7.5 -7.5 22.5 7.5 -12.5 22.5 2.5 -12.5 22.5 2.5 -7.5 17.5 7.5 -7.5 17.5 7.5 -12.5 17.5 2.5 -12.5 17.5 2.5 -12.5 2.5 7.5 -12.5 2.5 7.5 -17.5 2.5 2.5 -17.5 2.5 2.5 -12.5 -2.5 7.5 -12.5 -2.5 7.5 -17.5 -2.5 2.5 -17.5 -2.5 2.5 -12.5 7.5 7.5 -12.5 7.5 7.5 -17.5 7.5 2.5 -17.5 7.5 2.5 -12.5 2.5 7.5 -12.5 2.5 7.5 -17.5 2.5 2.5 -17.5 2.5 2.5 -12.5 12.5 7.5 -12.5 12.5 7.5 -17.5 12.5 2.5 -17.5 12.5 2.5 -12.5 7.5 7.5 -12.5 7.5 7.5 -17.5 7.5 2.5 -17.5 7.5 2.5 -12.5 17.5 7.5 -12.5 17.5 7.5 -17.5 17.5 2.5 -17.5 17.5 2.5 -12.5 12.5 7.5 -12.5 12.5 7.5 -17.5 12.5 2.5 -17.5 12.5 2.5 -12.5 22.5 7.5 -12.5 22.5 7.5 -17.5 22.5 2.5 -17.5 22.5 2.5 -12.5 17.5 7.5 -12.5 17.5 7.5 -17.5 17.5 2.5 -17.5 17.5 2.5 -17.5 2.5 7.5 -17.5 2.5 7.5 -22.5 2.5 2.5 -22.5 2.5 2.5 -17.5 -2.5 7.5 -17.5 -2.5 7.5 -22.5 -2.5 2.5 -22.5 -2.5 2.5 -17.5 7.5 7.5 -17.5 7.5 7.5 -22.5 7.5 2.5 -22.5 7.5 2.5 -17.5 2.5 7.5 -17.5 2.5 7.5 -22.5 2.5 2.5 -22.5 2.5 2.5 -17.5 12.5 7.5 -17.5 12.5 7.5 -22.5 12.5 2.5 -22.5 12.5 2.5 -17.5 7.5 7.5 -17.5 7.5 7.5 -22.5 7.5 2.5 -22.5 7.5 2.5 -17.5 17.5 7.5 -17.5 17.5 7.5 -22.5 17.5 2.5 -22.5 17.5 2.5 -17.5 12.5 7.5 -17.5 12.5 7.5 -22.5 12.5 2.5 -22.5 12.5 2.5 -17.5 22.5 7.5 -17.5 22.5 7.5 -22.5 22.5 2.5 -22.5 22.5 2.5 -17.5 17.5 7.5 -17.5 17.5 7.5 -22.5 17.5 2.5 -22.5 17.5 7.5 2.5 2.5 12.5 2.5 2.5 12.5 -2.5 2.5 7.5 -2.5 2.5 7.5 2.5 -2.5 12.5 2.5 -2.5 12.5 -2.5 -2.5 7.5 -2.5 -2.5 7.5 2.5 7.5 12.5 2.5 7.5 12.5 -2.5 7.5 7.5 -2.5 7.5 7.5 2.5 2.5 12.5 2.5 2.5 12.5 -2.5 2.5 7.5 -2.5 2.5 7.5 2.5 12.5 12.5 2.5 12.5 12.5 -2.5 12.5 7.5 -2.5 12.5 7.5 2.5 7.5 12.5 2.5 7.5 12.5 -2.5 7.5 7.5 -2.5 7.5 7.5 2.5 17.5 12.5 2.5 17.5 12.5 -2.5 17.5 7.5 -2.5 17.5 7.5 2.5 12.5 12.5 2.5 12.5 12.5 -2.5 12.5 7.5 -2.5 12.5 7.5 2.5 22.5 12.5 2.5 22.5 12.5 -2.5 22.5 7.5 -2.5 22.5 7.5 2.5 17.5 12.5 2.5 17.5 12.5 -2.5 17.5 7.5 -2.5 17.5 7.5 -2.5 2.5 12.5 -2.5 2.5 12.5 -7.5 2.5 7.5 -7.5 2.5 7.5 -2.5 -2.5 12.5 -2.5 -2.5 12.5 -7.5 -2.5 7.5 -7.5 -2.5 7.5 -2.5 7.5 12.5 -2.5 7.5 12.5 -7.5 7.5 7.5 -7.5 7.5 7.5 -2.5 2.5 12.5 -2.5 2.5 12.5 -7.5 2.5 7.5 -7.5 2.5 7.5 -2.5 12.5 12.5 -2.5 12.5 12.5 -7.5 12.5 7.5 -7.5 12.5 7.5 -2.5 7.5 12.5 -2.5 7.5 12.5 -7.5 7.5 7.5 -7.5 7.5 7.5 -2.5 17.5 12.5 -2.5 17.5 12.5 -7.5 17.5 7.5 -7.5 17.5 7.5 -2.5 12.5 12.5 -2.5 12.5 12.5 -7.5 12.5 7.5 -7.5 12.5 7.5 -2.5 22.5 12.5 -2.5 22.5 12.5 -7.5 22.5 7.5 -7.5 22.5 7.5 -2.5 17.5 12.5 -2.5 17.5 12.5 -7.5 17.5 7.5 -7.5 17.5 7.5 -7.5 2.5 12.5 -7.5 2.5 12.5 -12.5 2.5 7.5 -12.5 2.5 7.5 -7.5 -2.5 12.5 -7.5 -2.5 12.5 -12.5 -2.5 7.5 -12.5 -2.5 7.5 -7.5 7.5 12.5 -7.5 7.5 12.5 -12.5 7.5 7.5 -12.5 7.5 7.5 -7.5 2.5 12.5 -7.5 2.5 12.5 -12.5 2.5 7.5 -12.5 2.5 7.5 -7.5 12.5 12.5 -7.5 12.5 12.5 -12.5 12.5 7.5 -12.5 12.5 7.5 -7.5 7.5 12.5 -7.5 7.5 12.5 -12.5 7.5 7.5 -12.5 7.5 7.5 -7.5 17.5 12.5 -7.5 17.5 12.5 -12.5 17.5 7.5 -12.5 17.5 7.5 -7.5 12.5 12.5 -7.5 12.5 12.5 -12.5 12.5 7.5 -12.5 12.5 7.5 -7.5 22.5 12.5 -7.5 22.5 12.5 -12.5 22.5 7.5 -12.5 22.5 7.5 -7.5 17.5 12.5 -7.5 17.5 12.5 -12.5 17.5 7.5 -12.5 17.5 7.5 -12.5 2.5 12.5 -12.5 2.5 12.5 -17.5 2.5 7.5 -17.5 2.5 7.5 -12.5 -2.5 12.5 -12.5 -2.5 12.5 -17.5 -2.5 7.5 -17.5 -2.5 7.5 -12.5 7.5 12.5 -12.5 7.5 12.5 -17.5 7.5 7.5 -17.5 7.5 7.5 -12.5 2.5 12.5 -12.5 2.5 12.5 -17.5 2.5 7.5 -17.5 2.5 7.5 -12.5 12.5 12.5 -12.5 12.5 12.5 -17.5 12.5 7.5 -17.5 12.5 7.5 -12.5 7.5 12.5 -12.5 7.5 12.5 -17.5 7.5 7.5 -17.5 7.5 7.5 -12.5 17.5 12.5 -12.5 17.5 12.5 -17.5 17.5 7.5 -17.5 17.5 7.5 -12.5 12.5 12.5 -12.5 12.5 12.5 -17.5 12.5 7.5 -17.5 12.5 7.5 -12.5 22.5 12.5 -12.5 22.5 12.5 -17.5 22.5 7.5 -17.5 22.5 7.5 -12.5 17.5 12.5 -12.5 17.5 12.5 -17.5 17.5 7.5 -17.5 17.5 7.5 -17.5 2.5 12.5 -17.5 2.5 12.5 -22.5 2.5 7.5 -22.5 2.5 7.5 -17.5 -2.5 12.5 -17.5 -2.5 12.5 -22.5 -2.5 7.5 -22.5 -2.5 7.5 -17.5 7.5 12.5 -17.5 7.5 12.5 -22.5 7.5 7.5 -22.5 7.5 7.5 -17.5 2.5 12.5 -17.5 2.5 12.5 -22.5 2.5 7.5 -22.5 2.5 7.5 -17.5 12.5 12.5 -17.5 12.5 12.5 -22.5 12.5 7.5 -22.5 12.5 7.5 -17.5 7.5 12.5 -17.5 7.5 12.5 -22.5 7.5 7.5 -22.5 7.5 7.5 -17.5 17.5 12.5 -17.5 17.5 12.5 -22.5 17.5 7.5 -22.5 17.5 7.5 -17.5 12.5 12.5 -17.5 12.5 12.5 -22.5 12.5 7.5 -22.5 12.5 7.5 -17.5 22.5 12.5 -17.5 22.5 12.5 -22.5 22.5 7.5 -22.5 22.5 7.5 -17.5 17.5 12.5 -17.5 17.5 12.5 -22.5 17.5 7.5 -22.5 17.5 12.5 2.5 2.5 17.5 2.5 2.5 17.5 -2.5 2.5 12.5 -2.5 2.5 12.5 2.5 -2.5 17.5 2.5 -2.5 17.5 -2.5 -2.5 12.5 -2.5 -2.5 12.5 2.5 7.5 17.5 2.5 7.5 17.5 -2.5 7.5 12.5 -2.5 7.5 12.5 2.5 2.5 17.5 2.5 2.5 17.5 -2.5 2.5 12.5 -2.5 2.5 12.5 2.5 12.5 17.5 2.5 12.5 17.5 -2.5 12.5 12.5 -2.5 12.5 12.5 2.5 7.5 17.5 2.5 7.5 17.5 -2.5 7.5 12.5 -2.5 7.5 12.5 2.5 17.5 17.5 2.5 17.5 17.5 -2.5 17.5 12.5 -2.5 17.5 12.5 2.5 12.5 17.5 2.5 12.5 17.5 -2.5 12.5 12.5 -2.5 12.5 12.5 2.5 22.5 17.5 2.5 22.5 17.5 -2.5 22.5 12.5 -2.5 22.5 12.5 2.5 17.5 17.5 2.5 17.5 17.5 -2.5 17.5 12.5 -2.5 17.5 12.5 -2.5 2.5 17.5 -2.5 2.5 17.5 -7.5 2.5 12.5 -7.5 2.5 12.5 -2.5 -2.5 17.5 -2.5 -2.5 17.5 -7.5 -2.5 12.5 -7.5 -2.5 12.5 -2.5 7.5 17.5 -2.5 7.5 17.5 -7.5 7.5 12.5 -7.5 7.5 12.5 -2.5 2.5 17.5 -2.5 2.5 17.5 -7.5 2.5 12.5 -7.5 2.5 12.5 -2.5 12.5 17.5 -2.5 12.5 17.5 -7.5 12.5 12.5 -7.5 12.5 12.5 -2.5 7.5 17.5 -2.5 7.5 17.5 -7.5 7.5 12.5 -7.5 7.5 12.5 -2.5 17.5 17.5 -2.5 17.5 17.5 -7.5 17.5 12.5 -7.5 17.5 12.5 -2.5 12.5 17.5 -2.5 12.5 17.5 -7.5 12.5 12.5 -7.5 12.5 12.5 -2.5 22.5 17.5 -2.5 22.5 17.5 -7.5 22.5 12.5 -7.5 22.5 12.5 -2.5 17.5 17.5 -2.5 17.5 17.5 -7.5 17.5 12.5 -7.5 17.5 12.5 -7.5 2.5 17.5 -7.5 2.5 17.5 -12.5 2.5 12.5 -12.5 2.5 12.5 -7.5 -2.5 17.5 -7.5 -2.5 17.5 -12.5 -2.5 12.5 -12.5 -2.5 12.5 -7.5 7.5 17.5 -7.5 7.5 17.5 -12.5 7.5 12.5 -12.5 7.5 12.5 -7.5 2.5 17.5 -7.5 2.5 17.5 -12.5 2.5 12.5 -12.5 2.5 12.5 -7.5 12.5 17.5 -7.5 12.5 17.5 -12.5 12.5 12.5 -12.5 12.5 12.5 -7.5 7.5 17.5 -7.5 7.5 17.5 -12.5 7.5 12.5 -12.5 7.5 12.5 -7.5 17.5 17.5 -7.5 17.5 17.5 -12.5 17.5 12.5 -12.5 17.5 12.5 -7.5 12.5 17.5 -7.5 12.5 17.5 -12.5 12.5 12.5 -12.5 12.5 12.5 -7.5 22.5 17.5 -7.5 22.5 17.5 -12.5 22.5 12.5 -12.5 22.5 12.5 -7.5 17.5 17.5 -7.5 17.5 17.5 -12.5 17.5 12.5 -12.5 17.5 12.5 -12.5 2.5 17.5 -12.5 2.5 17.5 -17.5 2.5 12.5 -17.5 2.5 12.5 -12.5 -2.5 17.5 -12.5 -2.5 17.5 -17.5 -2.5 12.5 -17.5 -2.5 12.5 -12.5 7.5 17.5 -12.5 7.5 17.5 -17.5 7.5 12.5 -17.5 7.5 12.5 -12.5 2.5 17.5 -12.5 2.5 17.5 -17.5 2.5 12.5 -17.5 2.5 12.5 -12.5 12.5 17.5 -12.5 12.5 17.5 -17.5 12.5 12.5 -17.5 12.5 12.5 -12.5 7.5 17.5 -12.5 7.5 17.5 -17.5 7.5 12.5 -17.5 7.5 12.5 -12.5 17.5 17.5 -12.5 17.5 17.5 -17.5 17.5 12.5 -17.5 17.5 12.5 -12.5 12.5 17.5 -12.5 12.5 17.5 -17.5 12.5 12.5 -17.5 12.5 12.5 -12.5 22.5 17.5 -12.5 22.5 17.5 -17.5 22.5 12.5 -17.5 22.5 12.5 -12.5 17.5 17.5 -12.5 17.5 17.5 -17.5 17.5 12.5 -17.5 17.5 12.5 -17.5 2.5 17.5 -17.5 2.5 17.5 -22.5 2.5 12.5 -22.5 2.5 12.5 -17.5 -2.5 17.5 -17.5 -2.5 17.5 -22.5 -2.5 12.5 -22.5 -2.5 12.5 -17.5 7.5 17.5 -17.5 7.5 17.5 -22.5 7.5 12.5 -22.5 7.5 12.5 -17.5 2.5 17.5 -17.5 2.5 17.5 -22.5 2.5 12.5 -22.5 2.5 12.5 -17.5 12.5 17.5 -17.5 12.5 17.5 -22.5 12.5 12.5 -22.5 12.5 12.5 -17.5 7.5 17.5 -17.5 7.5 17.5 -22.5 7.5 12.5 -22.5 7.5 12.5 -17.5 17.5 17.5 -17.5 17.5 17.5 -22.5 17.5 12.5 -22.5 17.5 12.5 -17.5 12.5 17.5 -17.5 12.5 17.5 -22.5 12.5 12.5 -22.5 12.5 12.5 -17.5 22.5 17.5 -17.5 22.5 17.5 -22.5 22.5 12.5 -22.5 22.5 12.5 -17.5 17.5 17.5 -17.5 17.5 17.5 -22.5 17.5 12.5 -22.5 17.5 17.5 2.5 2.5 22.5 2.5 2.5 22.5 -2.5 2.5 17.5 -2.5 2.5 17.5 2.5 -2.5 22.5 2.5 -2.5 22.5 -2.5 -2.5 17.5 -2.5 -2.5 17.5 2.5 7.5 22.5 2.5 7.5 22.5 -2.5 7.5 17.5 -2.5 7.5 17.5 2.5 2.5 22.5 2.5 2.5 22.5 -2.5 2.5 17.5 -2.5 2.5 17.5 2.5 12.5 22.5 2.5 12.5 22.5 -2.5 12.5 17.5 -2.5 12.5 17.5 2.5 7.5 22.5 2.5 7.5 22.5 -2.5 7.5 17.5 -2.5 7.5 17.5 2.5 17.5 22.5 2.5 17.5 22.5 -2.5 17.5 17.5 -2.5 17.5 17.5 2.5 12.5 22.5 2.5 12.5 22.5 -2.5 12.5 17.5 -2.5 12.5 17.5 2.5 22.5 22.5 2.5 22.5 22.5 -2.5 22.5 17.5 -2.5 22.5 17.5 2.5 17.5 22.5 2.5 17.5 22.5 -2.5 17.5 17.5 -2.5 17.5 17.5 -2.5 2.5 22.5 -2.5 2.5 22.5 -7.5 2.5 17.5 -7.5 2.5 17.5 -2.5 -2.5 22.5 -2.5 -2.5 22.5 -7.5 -2.5 17.5 -7.5 -2.5 17.5 -2.5 7.5 22.5 -2.5 7.5 22.5 -7.5 7.5 17.5 -7.5 7.5 17.5 -2.5 2.5 22.5 -2.5 2.5 22.5 -7.5 2.5 17.5 -7.5 2.5 17.5 -2.5 12.5 22.5 -2.5 12.5 22.5 -7.5 12.5 17.5 -7.5 12.5 17.5 -2.5 7.5 22.5 -2.5 7.5 22.5 -7.5 7.5 17.5 -7.5 7.5 17.5 -2.5 17.5 22.5 -2.5 17.5 22.5 -7.5 17.5 17.5 -7.5 17.5 17.5 -2.5 12.5 22.5 -2.5 12.5 22.5 -7.5 12.5 17.5 -7.5 12.5 17.5 -2.5 22.5 22.5 -2.5 22.5 22.5 -7.5 22.5 17.5 -7.5 22.5 17.5 -2.5 17.5 22.5 -2.5 17.5 22.5 -7.5 17.5 17.5 -7.5 17.5 17.5 -7.5 2.5 22.5 -7.5 2.5 22.5 -12.5 2.5 17.5 -12.5 2.5 17.5 -7.5 -2.5 22.5 -7.5 -2.5 22.5 -12.5 -2.5 17.5 -12.5 -2.5 17.5 -7.5 7.5 22.5 -7.5 7.5 22.5 -12.5 7.5 17.5 -12.5 7.5 17.5 -7.5 2.5 22.5 -7.5 2.5 22.5 -12.5 2.5 17.5 -12.5 2.5 17.5 -7.5 12.5 22.5 -7.5 12.5 22.5 -12.5 12.5 17.5 -12.5 12.5 17.5 -7.5 7.5 22.5 -7.5 7.5 22.5 -12.5 7.5 17.5 -12.5 7.5 17.5 -7.5 17.5 22.5 -7.5 17.5 22.5 -12.5 17.5 17.5 -12.5 17.5 17.5 -7.5 12.5 22.5 -7.5 12.5 22.5 -12.5 12.5 17.5 -12.5 12.5 17.5 -7.5 22.5 22.5 -7.5 22.5 22.5 -12.5 22.5 17.5 -12.5 22.5 17.5 -7.5 17.5 22.5 -7.5 17.5 22.5 -12.5 17.5 17.5 -12.5 17.5 17.5 -12.5 2.5 22.5 -12.5 2.5 22.5 -17.5 2.5 17.5 -17.5 2.5 17.5 -12.5 -2.5 22.5 -12.5 -2.5 22.5 -17.5 -2.5 17.5 -17.5 -2.5 17.5 -12.5 7.5 22.5 -12.5 7.5 22.5 -17.5 7.5 17.5 -17.5 7.5 17.5 -12.5 2.5 22.5 -12.5 2.5 22.5 -17.5 2.5 17.5 -17.5 2.5 17.5 -12.5 12.5 22.5 -12.5 12.5 22.5 -17.5 12.5 17.5 -17.5 12.5 17.5 -12.5 7.5 22.5 -12.5 7.5 22.5 -17.5 7.5 17.5 -17.5 7.5 17.5 -12.5 17.5 22.5 -12.5 17.5 22.5 -17.5 17.5 17.5 -17.5 17.5 17.5 -12.5 12.5 22.5 -12.5 12.5 22.5 -17.5 12.5 17.5 -17.5 12.5 17.5 -12.5 22.5 22.5 -12.5 22.5 22.5 -17.5 22.5 17.5 -17.5 22.5 17.5 -12.5 17.5 22.5 -12.5 17.5 22.5 -17.5 17.5 17.5 -17.5 17.5 17.5 -17.5 2.5 22.5 -17.5 2.5 22.5 -22.5 2.5 17.5 -22.5 2.5 17.5 -17.5 -2.5 22.5 -17.5 -2.5 22.5 -22.5 -2.5 17.5 -22.5 -2.5 17.5 -17.5 7.5 22.5 -17.5 7.5 22.5 -22.5 7.5 17.5 -22.5 7.5 17.5 -17.5 2.5 22.5 -17.5 2.5 22.5 -22.5 2.5 17.5 -22.5 2.5 17.5 -17.5 12.5 22.5 -17.5 12.5 22.5 -22.5 12.5 17.5 -22.5 12.5 17.5 -17.5 7.5 22.5 -17.5 7.5 22.5 -22.5 7.5 17.5 -22.5 7.5 17.5 -17.5 17.5 22.5 -17.5 17.5 22.5 -22.5 17.5 17.5 -22.5 17.5 17.5 -17.5 12.5 22.5 -17.5 12.5 22.5 -22.5 12.5 17.5 -22.5 12.5 17.5 -17.5 22.5 22.5 -17.5 22.5 22.5 -22.5 22.5 17.5 -22.5 22.5 17.5 -17.5 17.5 22.5 -17.5 17.5 22.5 -22.5 17.5 17.5 -22.5 17.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">8 9 13 12 9 10 14 13 10 11 15 14 11 8 12 15 9 8 11 10 12 13 14 15\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">16 17 21 20 17 18 22 21 18 19 23 22 19 16 20 23 17 16 19 18 20 21 22 23\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">24 25 29 28 25 26 30 29 26 27 31 30 27 24 28 31 25 24 27 26 28 29 30 31\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">32 33 37 36 33 34 38 37 34 35 39 38 35 32 36 39 33 32 35 34 36 37 38 39\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">40 41 45 44 41 42 46 45 42 43 47 46 43 40 44 47 41 40 43 42 44 45 46 47\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">48 49 53 52 49 50 54 53 50 51 55 54 51 48 52 55 49 48 51 50 52 53 54 55\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">56 57 61 60 57 58 62 61 58 59 63 62 59 56 60 63 57 56 59 58 60 61 62 63\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">64 65 69 68 65 66 70 69 66 67 71 70 67 64 68 71 65 64 67 66 68 69 70 71\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">72 73 77 76 73 74 78 77 74 75 79 78 75 72 76 79 73 72 75 74 76 77 78 79\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">80 81 85 84 81 82 86 85 82 83 87 86 83 80 84 87 81 80 83 82 84 85 86 87\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">88 89 93 92 89 90 94 93 90 91 95 94 91 88 92 95 89 88 91 90 92 93 94 95\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">96 97 101 100 97 98 102 101 98 99 103 102 99 96 100 103 97 96 99 98 100 101 102 103\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">104 105 109 108 105 106 110 109 106 107 111 110 107 104 108 111 105 104 107 106 108 109 110 111\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">112 113 117 116 113 114 118 117 114 115 119 118 115 112 116 119 113 112 115 114 116 117 118 119\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">120 121 125 124 121 122 126 125 122 123 127 126 123 120 124 127 121 120 123 122 124 125 126 127\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">128 129 133 132 129 130 134 133 130 131 135 134 131 128 132 135 129 128 131 130 132 133 134 135\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">136 137 141 140 137 138 142 141 138 139 143 142 139 136 140 143 137 136 139 138 140 141 142 143\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">144 145 149 148 145 146 150 149 146 147 151 150 147 144 148 151 145 144 147 146 148 149 150 151\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">152 153 157 156 153 154 158 157 154 155 159 158 155 152 156 159 153 152 155 154 156 157 158 159\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">160 161 165 164 161 162 166 165 162 163 167 166 163 160 164 167 161 160 163 162 164 165 166 167\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">168 169 173 172 169 170 174 173 170 171 175 174 171 168 172 175 169 168 171 170 172 173 174 175\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">176 177 181 180 177 178 182 181 178 179 183 182 179 176 180 183 177 176 179 178 180 181 182 183\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">184 185 189 188 185 186 190 189 186 187 191 190 187 184 188 191 185 184 187 186 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">192 193 197 196 193 194 198 197 194 195 199 198 195 192 196 199 193 192 195 194 196 197 198 199\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">200 201 205 204 201 202 206 205 202 203 207 206 203 200 204 207 201 200 203 202 204 205 206 207\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">208 209 213 212 209 210 214 213 210 211 215 214 211 208 212 215 209 208 211 210 212 213 214 215\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">216 217 221 220 217 218 222 221 218 219 223 222 219 216 220 223 217 216 219 218 220 221 222 223\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">224 225 229 228 225 226 230 229 226 227 231 230 227 224 228 231 225 224 227 226 228 229 230 231\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">232 233 237 236 233 234 238 237 234 235 239 238 235 232 236 239 233 232 235 234 236 237 238 239\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">240 241 245 244 241 242 246 245 242 243 247 246 243 240 244 247 241 240 243 242 244 245 246 247\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">248 249 253 252 249 250 254 253 250 251 255 254 251 248 252 255 249 248 251 250 252 253 254 255\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">256 257 261 260 257 258 262 261 258 259 263 262 259 256 260 263 257 256 259 258 260 261 262 263\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">264 265 269 268 265 266 270 269 266 267 271 270 267 264 268 271 265 264 267 266 268 269 270 271\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">272 273 277 276 273 274 278 277 274 275 279 278 275 272 276 279 273 272 275 274 276 277 278 279\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">280 281 285 284 281 282 286 285 282 283 287 286 283 280 284 287 281 280 283 282 284 285 286 287\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">288 289 293 292 289 290 294 293 290 291 295 294 291 288 292 295 289 288 291 290 292 293 294 295\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">296 297 301 300 297 298 302 301 298 299 303 302 299 296 300 303 297 296 299 298 300 301 302 303\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">304 305 309 308 305 306 310 309 306 307 311 310 307 304 308 311 305 304 307 306 308 309 310 311\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">312 313 317 316 313 314 318 317 314 315 319 318 315 312 316 319 313 312 315 314 316 317 318 319\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">320 321 325 324 321 322 326 325 322 323 327 326 323 320 324 327 321 320 323 322 324 325 326 327\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">328 329 333 332 329 330 334 333 330 331 335 334 331 328 332 335 329 328 331 330 332 333 334 335\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">336 337 341 340 337 338 342 341 338 339 343 342 339 336 340 343 337 336 339 338 340 341 342 343\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">344 345 349 348 345 346 350 349 346 347 351 350 347 344 348 351 345 344 347 346 348 349 350 351\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">352 353 357 356 353 354 358 357 354 355 359 358 355 352 356 359 353 352 355 354 356 357 358 359\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">360 361 365 364 361 362 366 365 362 363 367 366 363 360 364 367 361 360 363 362 364 365 366 367\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">368 369 373 372 369 370 374 373 370 371 375 374 371 368 372 375 369 368 371 370 372 373 374 375\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">376 377 381 380 377 378 382 381 378 379 383 382 379 376 380 383 377 376 379 378 380 381 382 383\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">384 385 389 388 385 386 390 389 386 387 391 390 387 384 388 391 385 384 387 386 388 389 390 391\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">392 393 397 396 393 394 398 397 394 395 399 398 395 392 396 399 393 392 395 394 396 397 398 399\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">400 401 405 404 401 402 406 405 402 403 407 406 403 400 404 407 401 400 403 402 404 405 406 407\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">408 409 413 412 409 410 414 413 410 411 415 414 411 408 412 415 409 408 411 410 412 413 414 415\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">416 417 421 420 417 418 422 421 418 419 423 422 419 416 420 423 417 416 419 418 420 421 422 423\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">424 425 429 428 425 426 430 429 426 427 431 430 427 424 428 431 425 424 427 426 428 429 430 431\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">432 433 437 436 433 434 438 437 434 435 439 438 435 432 436 439 433 432 435 434 436 437 438 439\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">440 441 445 444 441 442 446 445 442 443 447 446 443 440 444 447 441 440 443 442 444 445 446 447\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">448 449 453 452 449 450 454 453 450 451 455 454 451 448 452 455 449 448 451 450 452 453 454 455\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">456 457 461 460 457 458 462 461 458 459 463 462 459 456 460 463 457 456 459 458 460 461 462 463\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">464 465 469 468 465 466 470 469 466 467 471 470 467 464 468 471 465 464 467 466 468 469 470 471\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">472 473 477 476 473 474 478 477 474 475 479 478 475 472 476 479 473 472 475 474 476 477 478 479\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">480 481 485 484 481 482 486 485 482 483 487 486 483 480 484 487 481 480 483 482 484 485 486 487\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">488 489 493 492 489 490 494 493 490 491 495 494 491 488 492 495 489 488 491 490 492 493 494 495\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">496 497 501 500 497 498 502 501 498 499 503 502 499 496 500 503 497 496 499 498 500 501 502 503\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">504 505 509 508 505 506 510 509 506 507 511 510 507 504 508 511 505 504 507 506 508 509 510 511\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">512 513 517 516 513 514 518 517 514 515 519 518 515 512 516 519 513 512 515 514 516 517 518 519\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">520 521 525 524 521 522 526 525 522 523 527 526 523 520 524 527 521 520 523 522 524 525 526 527\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">528 529 533 532 529 530 534 533 530 531 535 534 531 528 532 535 529 528 531 530 532 533 534 535\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">536 537 541 540 537 538 542 541 538 539 543 542 539 536 540 543 537 536 539 538 540 541 542 543\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">544 545 549 548 545 546 550 549 546 547 551 550 547 544 548 551 545 544 547 546 548 549 550 551\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">552 553 557 556 553 554 558 557 554 555 559 558 555 552 556 559 553 552 555 554 556 557 558 559\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">560 561 565 564 561 562 566 565 562 563 567 566 563 560 564 567 561 560 563 562 564 565 566 567\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">568 569 573 572 569 570 574 573 570 571 575 574 571 568 572 575 569 568 571 570 572 573 574 575\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">576 577 581 580 577 578 582 581 578 579 583 582 579 576 580 583 577 576 579 578 580 581 582 583\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">584 585 589 588 585 586 590 589 586 587 591 590 587 584 588 591 585 584 587 586 588 589 590 591\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">592 593 597 596 593 594 598 597 594 595 599 598 595 592 596 599 593 592 595 594 596 597 598 599\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">600 601 605 604 601 602 606 605 602 603 607 606 603 600 604 607 601 600 603 602 604 605 606 607\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">608 609 613 612 609 610 614 613 610 611 615 614 611 608 612 615 609 608 611 610 612 613 614 615\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">616 617 621 620 617 618 622 621 618 619 623 622 619 616 620 623 617 616 619 618 620 621 622 623\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">624 625 629 628 625 626 630 629 626 627 631 630 627 624 628 631 625 624 627 626 628 629 630 631\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">632 633 637 636 633 634 638 637 634 635 639 638 635 632 636 639 633 632 635 634 636 637 638 639\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">640 641 645 644 641 642 646 645 642 643 647 646 643 640 644 647 641 640 643 642 644 645 646 647\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">648 649 653 652 649 650 654 653 650 651 655 654 651 648 652 655 649 648 651 650 652 653 654 655\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">656 657 661 660 657 658 662 661 658 659 663 662 659 656 660 663 657 656 659 658 660 661 662 663\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">664 665 669 668 665 666 670 669 666 667 671 670 667 664 668 671 665 664 667 666 668 669 670 671\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">672 673 677 676 673 674 678 677 674 675 679 678 675 672 676 679 673 672 675 674 676 677 678 679\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">680 681 685 684 681 682 686 685 682 683 687 686 683 680 684 687 681 680 683 682 684 685 686 687\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">688 689 693 692 689 690 694 693 690 691 695 694 691 688 692 695 689 688 691 690 692 693 694 695\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">696 697 701 700 697 698 702 701 698 699 703 702 699 696 700 703 697 696 699 698 700 701 702 703\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">704 705 709 708 705 706 710 709 706 707 711 710 707 704 708 711 705 704 707 706 708 709 710 711\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">712 713 717 716 713 714 718 717 714 715 719 718 715 712 716 719 713 712 715 714 716 717 718 719\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">720 721 725 724 721 722 726 725 722 723 727 726 723 720 724 727 721 720 723 722 724 725 726 727\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">728 729 733 732 729 730 734 733 730 731 735 734 731 728 732 735 729 728 731 730 732 733 734 735\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">736 737 741 740 737 738 742 741 738 739 743 742 739 736 740 743 737 736 739 738 740 741 742 743\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">744 745 749 748 745 746 750 749 746 747 751 750 747 744 748 751 745 744 747 746 748 749 750 751\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">752 753 757 756 753 754 758 757 754 755 759 758 755 752 756 759 753 752 755 754 756 757 758 759\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">760 761 765 764 761 762 766 765 762 763 767 766 763 760 764 767 761 760 763 762 764 765 766 767\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">768 769 773 772 769 770 774 773 770 771 775 774 771 768 772 775 769 768 771 770 772 773 774 775\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">776 777 781 780 777 778 782 781 778 779 783 782 779 776 780 783 777 776 779 778 780 781 782 783\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">784 785 789 788 785 786 790 789 786 787 791 790 787 784 788 791 785 784 787 786 788 789 790 791\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">792 793 797 796 793 794 798 797 794 795 799 798 795 792 796 799 793 792 795 794 796 797 798 799\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">800 801 805 804 801 802 806 805 802 803 807 806 803 800 804 807 801 800 803 802 804 805 806 807\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">808 809 813 812 809 810 814 813 810 811 815 814 811 808 812 815 809 808 811 810 812 813 814 815\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">816 817 821 820 817 818 822 821 818 819 823 822 819 816 820 823 817 816 819 818 820 821 822 823\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">824 825 829 828 825 826 830 829 826 827 831 830 827 824 828 831 825 824 827 826 828 829 830 831\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">832 833 837 836 833 834 838 837 834 835 839 838 835 832 836 839 833 832 835 834 836 837 838 839\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">840 841 845 844 841 842 846 845 842 843 847 846 843 840 844 847 841 840 843 842 844 845 846 847\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">848 849 853 852 849 850 854 853 850 851 855 854 851 848 852 855 849 848 851 850 852 853 854 855\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">856 857 861 860 857 858 862 861 858 859 863 862 859 856 860 863 857 856 859 858 860 861 862 863\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">864 865 869 868 865 866 870 869 866 867 871 870 867 864 868 871 865 864 867 866 868 869 870 871\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">872 873 877 876 873 874 878 877 874 875 879 878 875 872 876 879 873 872 875 874 876 877 878 879\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">880 881 885 884 881 882 886 885 882 883 887 886 883 880 884 887 881 880 883 882 884 885 886 887\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">888 889 893 892 889 890 894 893 890 891 895 894 891 888 892 895 889 888 891 890 892 893 894 895\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">896 897 901 900 897 898 902 901 898 899 903 902 899 896 900 903 897 896 899 898 900 901 902 903\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">904 905 909 908 905 906 910 909 906 907 911 910 907 904 908 911 905 904 907 906 908 909 910 911\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">912 913 917 916 913 914 918 917 914 915 919 918 915 912 916 919 913 912 915 914 916 917 918 919\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">920 921 925 924 921 922 926 925 922 923 927 926 923 920 924 927 921 920 923 922 924 925 926 927\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">928 929 933 932 929 930 934 933 930 931 935 934 931 928 932 935 929 928 931 930 932 933 934 935\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">936 937 941 940 937 938 942 941 938 939 943 942 939 936 940 943 937 936 939 938 940 941 942 943\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">944 945 949 948 945 946 950 949 946 947 951 950 947 944 948 951 945 944 947 946 948 949 950 951\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">952 953 957 956 953 954 958 957 954 955 959 958 955 952 956 959 953 952 955 954 956 957 958 959\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">960 961 965 964 961 962 966 965 962 963 967 966 963 960 964 967 961 960 963 962 964 965 966 967\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">968 969 973 972 969 970 974 973 970 971 975 974 971 968 972 975 969 968 971 970 972 973 974 975\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">976 977 981 980 977 978 982 981 978 979 983 982 979 976 980 983 977 976 979 978 980 981 982 983\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">984 985 989 988 985 986 990 989 986 987 991 990 987 984 988 991 985 984 987 986 988 989 990 991\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">992 993 997 996 993 994 998 997 994 995 999 998 995 992 996 999 993 992 995 994 996 997 998 999\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MorphPoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-0.246 0.25 8.75 0.35187075696866899 0.2492196387119355 8.7403926402016161 0.34976109800342792 -0.27063936564577457 8.7403926402016161 -0.15618232401141652 -0.28970521075640709 8.7403926402016161 -0.16573110670094349 0.1927547931153904 8.2403926402016161 0.32148170429858675 0.17741469818428152 8.2403926402016161 0.30594751348932381 -0.33513598430435548 8.2403926402016161 -0.21173670888760682 -0.34441493866098616 8.2403926402016161 0.019108631916314203 -0.10056557987338277 9.4903926402016161 -0.00087790644907257093 -0.10236114960887061 9.4903926402016161 -0.020830707361957093 -0.10022303776968357 9.4903926402016161 -0.039982995872916885 -0.094233410794734726 9.4903926402016161 -0.057598760275202852 -0.084622446689649827 9.4903926402016161 -0.073001036621869742 -0.071759489415096508 9.4903926402016161 -0.085597924070611134 -0.056138855205506315 9.4903926402016161 -0.094905331301187779 -0.038360836273401255 9.4903926402016161 -0.10056557987338277 -0.01910863191631423 9.4903926402016161 -0.10236114960887061 0.00087790644907256561 9.4903926402016161 -0.10022303776968357 0.020830707361957111 9.4903926402016161 -0.094233410794734726 0.039982995872916878 9.4903926402016161 -0.084622446689649827 0.057598760275202852 9.4903926402016161 -0.071759489415096522 0.073001036621869742 9.4903926402016161 -0.056138855205506315 0.085597924070611134 9.4903926402016161 -0.038360836273401304 0.094905331301187765 9.4903926402016161 -0.019108631916314234 0.10056557987338277 9.4903926402016161 0.00087790644907255932 0.10236114960887061 9.4903926402016161 0.020830707361957104 0.10022303776968357 9.4903926402016161 0.039982995872916906 0.094233410794734712 9.4903926402016161 0.057598760275202845 0.084622446689649827 9.4903926402016161 0.073001036621869728 0.071759489415096522 9.4903926402016161 0.085597924070611134 0.056138855205506315 9.4903926402016161 0.094905331301187765 0.038360836273401304 9.4903926402016161 0.99966557987338278 0.019108631916314241 7.6903926402016154 1.0778879538387214 -0.17628361497377348 7.6619397662556432 1.0227854118375741 -0.38318188275424936 7.6619397662556432 0.9283778000441758 -0.57535468567135484 7.6619397662556432 0.79829315003534829 -0.74541693068073522 7.6619397662556432 0.63753054195861858 -0.88683322107868578 7.6619397662556432 0.4522679926856662 -0.99416900813238263 7.6619397662556432 0.24962503808861589 -1.0632994377399549 7.6619397662556432 0.037389133269154273 -1.0915678662603754 7.6619397662556432 -0.17628361497377343 -1.0778879538387214 7.6619397662556432 -0.3831818827542493 -1.0227854118375741 7.6619397662556432 -0.57535468567135462 -0.92837780004417603 7.6619397662556432 -0.74541693068073522 -0.79829315003534829 7.6619397662556432 -0.8868332210786859 -0.63753054195861858 7.6619397662556432 -0.99416900813238263 -0.4522679926856662 7.6619397662556432 -1.0632994377399549 -0.24962503808861616 7.6619397662556432 -1.0915678662603754 -0.037389133269154377 7.6619397662556432 -1.0778879538387214 0.17628361497377357 7.6619397662556432 -1.0227854118375741 0.38318188275424925 7.6619397662556432 -0.92837780004417603 0.57535468567135462 7.6619397662556432 -0.7982931500353484 0.74541693068073522 7.6619397662556432 -0.63753054195861858 0.88683322107868578 7.6619397662556432 -0.45226799268566664 0.9941690081323824 7.6619397662556432 -0.24962503808861627 1.0632994377399547 7.6619397662556432 -0.037389133269154447 1.0915678662603754 7.6619397662556432 0.17628361497377351 1.0778879538387214 7.6619397662556432 0.38318188275424958 1.0227854118375739 7.6619397662556432 0.57535468567135462 0.92837780004417592 7.6619397662556432 0.74541693068073511 0.7982931500353484 7.6619397662556432 0.88683322107868578 0.63753054195861858 7.6619397662556432 0.9941690081323824 0.45226799268566664 7.6619397662556432 1.0632994377399547 0.24962503808861636 7.6619397662556432 1.9906678662603754 0.037389133269154287 5.8619397662556434 2.0460689563761951 -0.35168932349847443 5.8157348061512728 1.9381431317328197 -0.74409996332890904 5.8157348061512728 1.7557355534601427 -1.1079152588646806 5.8157348061512728 1.5058560424958345 -1.4291539923283179 5.8157348061512728 1.1981073283122092 -1.6954711393455704 5.8157348061512728 0.84431602140787609 -1.8966322813089418 5.8157348061512728 0.45807812329871828 -2.024906908345248 5.8157348061512728 0.054236539804361814 -2.075365498474723 5.8157348061512728 -0.35168932349847426 -2.0460689563761951 5.8157348061512728 -0.74409996332890893 -1.9381431317328197 5.8157348061512728 -1.1079152588646801 -1.7557355534601431 5.8157348061512728 -1.4291539923283176 -1.5058560424958345 5.8157348061512728 -1.6954711393455706 -1.198107328312209 5.8157348061512728 -1.896632281308942 -0.8443160214078762 5.8157348061512728 -2.024906908345248 -0.45807812329871883 5.8157348061512728 -2.075365498474723 -0.054236539804361994 5.8157348061512728 -2.0460689563761951 0.35168932349847459 5.8157348061512728 -1.9381431317328199 0.74409996332890893 5.8157348061512728 -1.7557355534601431 1.1079152588646801 5.8157348061512728 -1.5058560424958347 1.4291539923283176 5.8157348061512728 -1.198107328312209 1.6954711393455704 5.8157348061512728 -0.84431602140787698 1.8966322813089416 5.8157348061512728 -0.45807812329871905 2.0249069083452476 5.8157348061512728 -0.054236539804362133 2.075365498474723 5.8157348061512728 0.35168932349847448 2.0460689563761951 5.8157348061512728 0.74409996332890949 1.9381431317328195 5.8157348061512728 1.1079152588646801 1.7557355534601431 5.8157348061512728 1.4291539923283174 1.5058560424958347 5.8157348061512728 1.6954711393455704 1.198107328312209 5.8157348061512728 1.8966322813089416 0.84431602140787709 5.8157348061512728 2.0249069083452476 0.45807812329871916 5.8157348061512728 2.9744654984747227 0.054236539804361807 4.015734806151273 3.0035855077961284 -0.52709503202317531 3.9535533905932736 2.843041314948402 -1.1029375127009224 3.9535533905932736 2.573240638763147 -1.6363947233000564 3.9535533905932736 2.2045517679202002 -2.1069662023835027 3.9535533905932736 1.7511432089629546 -2.4965681519096097 3.9535533905932736 1.2304391985376881 -2.7902283874493805 3.9535533905932736 0.66245009975087077 -2.9766617108375786 3.9535533905932736 0.069003415136923263 -3.0487035940094076 3.9535533905932736 -0.52709503202317509 -3.0035855077961284 3.9535533905932736 -1.1029375127009224 -2.843041314948402 3.9535533905932736 -1.6363947233000558 -2.5732406387631479 3.9535533905932736 -2.1069662023835023 -2.2045517679202002 3.9535533905932736 -2.4965681519096101 -1.7511432089629544 3.9535533905932736 -2.7902283874493805 -1.2304391985376884 3.9535533905932736 -2.9766617108375786 -0.66245009975087155 3.9535533905932736 -3.0487035940094076 -0.069003415136923527 3.9535533905932736 -3.0035855077961284 0.52709503202317554 3.9535533905932736 -2.8430413149484024 1.1029375127009222 3.9535533905932736 -2.5732406387631479 1.6363947233000558 3.9535533905932736 -2.2045517679202007 2.1069662023835023 3.9535533905932736 -1.7511432089629544 2.4965681519096097 3.9535533905932736 -1.2304391985376895 2.7902283874493801 3.9535533905932736 -0.66245009975087177 2.9766617108375781 3.9535533905932736 -0.069003415136923721 3.0487035940094076 3.9535533905932736 0.52709503202317531 3.0035855077961284 3.9535533905932736 1.1029375127009231 2.843041314948402 3.9535533905932736 1.6363947233000553 2.5732406387631479 3.9535533905932736 2.1069662023835019 2.2045517679202007 3.9535533905932736 2.4965681519096097 1.7511432089629544 3.9535533905932736 2.7902283874493801 1.2304391985376897 3.9535533905932736 2.9766617108375781 0.66245009975087199 3.9535533905932736 3.9478035940094083 0.069003415136923235 2.1535533905932733 3.9475287875491141 -0.70250074054787626 2.0777851165098009 3.7346270331061282 -1.4591270481326191 2.0777851165098009 3.3782056561838432 -2.1596799215455009 2.0777851165098009 2.8919617304139718 -2.7772375067358426 2.0777851165098009 2.294581337175114 -3.2880674120350633 2.0777851165098009 1.6090214699646559 -3.672538730659225 2.0777851165098009 0.86162781001309174 -3.9158764454476009 2.0777851165098009 0.081122276529167398 -4.0087292244862356 2.0777851165098009 -0.70250074054787603 -3.9475287875491141 2.0777851165098009 -1.4591270481326188 -3.7346270331061282 2.0777851165098009 -2.1596799215455 -3.3782056561838441 2.0777851165098009 -2.7772375067358426 -2.8919617304139718 2.0777851165098009 -3.2880674120350637 -2.2945813371751136 2.0777851165098009 -3.672538730659225 -1.6090214699646559 2.0777851165098009 -3.9158764454476009 -0.86162781001309274 2.0777851165098009 -4.0087292244862356 -0.081122276529167717 2.0777851165098009 -3.9475287875491141 0.70250074054787659 2.0777851165098009 -3.7346270331061286 1.4591270481326186 2.0777851165098009 -3.3782056561838441 2.1596799215455 2.0777851165098009 -2.8919617304139722 2.7772375067358426 2.0777851165098009 -2.2945813371751136 3.2880674120350633 2.0777851165098009 -1.6090214699646577 3.6725387306592241 2.0777851165098009 -0.86162781001309319 3.9158764454476005 2.0777851165098009 -0.081122276529167953 4.0087292244862356 2.0777851165098009 0.70250074054787637 3.9475287875491141 2.0777851165098009 1.45912704813262 3.7346270331061278 2.0777851165098009 2.1596799215454996 3.3782056561838441 2.0777851165098009 2.7772375067358421 2.8919617304139722 2.0777851165098009 3.2880674120350633 2.2945813371751136 2.0777851165098009 3.6725387306592241 1.6090214699646577 2.0777851165098009 3.9158764454476005 0.86162781001309341 2.0777851165098009 4.9078292244862354 0.081122276529167314 0.27778511650980114 4.8755115883039251 -0.87790644907257709 0.19134171618254492 4.6105589483942593 -1.8122028485770298 0.19134171618254492 4.1684251137290493 -2.6768573089057326 0.19134171618254492 3.5661010396229678 -3.438641644052062 0.19134171618254492 2.8267337024566785 -4.0682809092299221 0.19134171618254492 1.9787365743555028 -4.541578420584294 0.19134171618254492 1.0546977093901002 -4.8403456201821324 0.19134171618254492 0.090127402934125994 -4.9531010520934693 0.19134171618254492 -0.87790644907257687 -4.8755115883039251 0.19134171618254492 -1.8122028485770294 -4.6105589483942593 0.19134171618254492 -2.6768573089057317 -4.1684251137290502 0.19134171618254492 -3.438641644052062 -3.5661010396229678 0.19134171618254492 -4.0682809092299221 -2.8267337024566781 0.19134171618254492 -4.541578420584294 -1.978736574355503 0.19134171618254492 -4.8403456201821324 -1.0546977093901015 0.19134171618254492 -4.9531010520934693 -0.090127402934126397 0.19134171618254492 -4.8755115883039251 0.87790644907257764 0.19134171618254492 -4.6105589483942593 1.8122028485770292 0.19134171618254492 -4.1684251137290502 2.6768573089057317 0.19134171618254492 -3.5661010396229686 3.438641644052062 0.19134171618254492 -2.8267337024566781 4.0682809092299221 0.19134171618254492 -1.978736574355505 4.5415784205842931 0.19134171618254492 -1.054697709390102 4.8403456201821315 0.19134171618254492 -0.090127402934126716 4.9531010520934693 0.19134171618254492 0.87790644907257731 4.8755115883039251 0.19134171618254492 1.8122028485770307 4.6105589483942584 0.19134171618254492 2.6768573089057313 4.1684251137290502 0.19134171618254492 3.4386416440520615 3.5661010396229686 0.19134171618254492 4.0682809092299221 2.8267337024566781 0.19134171618254492 4.5415784205842931 1.9787365743555054 0.19134171618254492 4.8403456201821315 1.0546977093901024 0.19134171618254492</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.MoveFirstEdge.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">1 5 9 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsAddTrimCurve.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 5 0 -1.666666666666667 5 0 1.6666666666666663 5 0 5 5 0 -5 1.666666666666667 0 -1.666666666666667 1.666666666666667 0 1.6666666666666663 1.666666666666667 0 5 1.666666666666667 0 -5 -1.6666666666666663 0 -1.666666666666667 -1.6666666666666663 0 1.6666666666666663 -1.6666666666666663 0 5 -1.6666666666666663 0 -5 -5 0 -1.666666666666667 -5 0 1.6666666666666663 -5 0 5 -5 0 5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119672569625e-11 -0 -4.9999999999489653 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\">0.99999999998979316 0.50000000000255174 0.99999999998979316 1 0.49999999999489658 0.99999999999744826 0 0.99999999999489653 5.1033621772944571e-12 0.49999999999744826 1.0206835376891377e-11 0 0.50000000000510336 7.6552097993953794e-12 1 1.5310253065337065e-11 0.99999999998979316 0.50000000001275846</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">16 17 18 19 20 21 22 23 24\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsAddTrimCurve.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 5 0 -1.6666666666666665 5 0 1.6666666666666665 5 0 5 5 0 -5 1.6666666666666665 0 -1.6666666666666665 1.6666666666666665 0 1.6666666666666665 1.6666666666666665 0 5 1.6666666666666665 0 -5 -1.6666666666666665 0 -1.6666666666666665 -1.6666666666666665 0 1.6666666666666665 -1.6666666666666665 0 5 -1.6666666666666665 0 -5 -5 0 -1.6666666666666665 -5 0 1.6666666666666665 -5 0 5 -5 0 5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119692792285e-11 -0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\">0.99999999998979316 0.50000000000255174 0.99999999998979316 1 0.49999999999489658 0.99999999999744826 0 0.99999999999489653 5.1033621772944571e-12 0.49999999999744826 1.0206724354588914e-11 5.5511151231257827e-17 0.50000000000510336 7.6551542882441481e-12 1 1.5310253065337065e-11 0.99999999998979316 0.50000000001275846</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">16 17 18 19 20 21 22 23 24\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsCloseCurve1.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1.5 0 0 0 0 0 1 0 0 2 0 0 3 0 0</points>\n\t\t<point_selection>0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">1 0 1 2 3</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">6</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.25 0.5 0.75 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">1 0 1 2 3 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsCloseCurve2.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5.1034119672569625e-11 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119672569625e-11 -0 -4.9999999999489653 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">4 0 2 2 4 4 6 5</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">4 0 2 2 4 4 6 5 6</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsCloseCurve2.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5.1034119692792285e-11 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119692792285e-11 -0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">4 0 2 2 4 4 6 5</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">4 0 2 2 4 4 6 5 6</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsConnectCurves.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>3 0 0 2 0 0 1 0 0 0 0 0 0 3 0 1 3 0 2 3 0 3 3 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">8</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.5 0.75 1 1.25 1.5 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsCreateCap.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119672569625e-11 -0 -4.9999999999489653 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0 5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 5.0000000001020695 -4.9999999999234488 0 3.827582432280027e-11 1.2758460954387374e-11 0 -5.0000000000510338 4.9999999999744826 0 7.6551179508854434e-11 -5 0 -4.9999999999489653 -5.0000000000765503 0 -5 -5.1034119672569625e-11 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 0 1 4 3 0 3 12 5 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474313 1 0.70710678118474313 0.41421356236948648 0.70710678118474313 1 0.70710678118474313 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">9 10 11 12 13 14 15 16 17\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">6 4 4 2 0 4 12 6 10</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsCreateCap.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119692792285e-11 -0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0 5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 5.0000000001020695 -4.9999999999234488 0 3.8275510304308531e-11 1.2758460954387374e-11 0 -5.0000000000510338 4.9999999999744826 0 7.6551179539188427e-11 -5 0 -4.9999999999489653 -5.0000000000765503 0 -5 -5.1034119692792285e-11 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 0 1 4 3 0 3 12 5 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474313 1 0.70710678118474313 0.41421356236948648 0.70710678118474313 1 0.70710678118474313 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">9 10 11 12 13 14 15 16 17\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">6 4 4 2 0 4 12 6 10</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsCurveInsertKnot.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 4.9999999999999991 1.6018862050906011 0 2.5735931287915781 5.0000000000131344 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119672569625e-11 -0 -4.9999999999489653 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 2 2 4 4 6 5 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">10</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.10000000000000001 0.25 0.25 0.5 0.5 0.75 0.75 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.88284271247389734 0.82426406871084601 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 2 2 4 4 6 5 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsCurveInsertKnot.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 4.9999999999999991 1.6018862050906011 0 2.5735931287915781 5.0000000000131344 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119692792285e-11 -0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 2 2 4 4 6 5 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">10</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.10000000000000001 0.25 0.25 0.5 0.5 0.75 0.75 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.88284271247389734 0.82426406871084601 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 2 2 4 4 6 5 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsCurveTraversal.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 0 1 0 0 2 0 0 3 0 0 6.7407548053553255e-33 5.0000000000255174 0 1 5.0000000000255174 0 2 5.0000000000255174 0 3 5.0000000000255174 0 -3.0615158845715675e-16 5 5.0000000000255174 0.99999999999999967 5 5.0000000000255174 1.9999999999999998 5 5.0000000000255174 2.9999999999999996 5 5.0000000000255174 -6.1230317691431341e-16 4.9999999999744826 10.000000000051035 0.99999999999999933 4.9999999999744826 10.000000000051035 1.9999999999999993 4.9999999999744826 10.000000000051035 2.9999999999999996 4.9999999999744826 10.000000000051035 -6.1230317691118863e-16 -5.1034119692792285e-11 10 0.99999999999999933 -5.1034119692792285e-11 10 1.9999999999999993 -5.1034119692792285e-11 10 2.9999999999999996 -5.1034119692792285e-11 10 -6.1230317690806375e-16 -5.0000000000765512 9.9999999999489653 0.99999999999999933 -5.0000000000765512 9.9999999999489653 1.9999999999999993 -5.0000000000765512 9.9999999999489653 2.9999999999999996 -5.0000000000765512 9.9999999999489653 -3.0615158845090705e-16 -5 4.9999999999234488 0.99999999999999967 -5 4.9999999999234488 1.9999999999999998 -5 4.9999999999234488 2.9999999999999996 -5 4.9999999999234488 6.249697606688244e-27 -4.9999999999234488 -1.0206857581351869e-10 1 -4.9999999999234488 -1.0206857581351869e-10 2 -4.9999999999234488 -1.0206857581351869e-10 3 -4.9999999999234488 -1.0206857581351869e-10 0 1.0206823938558457e-10 0 1 1.0206823938558457e-10 0 2 1.0206823938558457e-10 0 3 1.0206823938558457e-10 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 0.70710678118474324 0.70710678118474324 0.70710678118474324 0.70710678118474324 1 1 1 1 0.70710678118474324 0.70710678118474324 0.70710678118474324 0.70710678118474324 1 1 1 1 0.70710678118474324 0.70710678118474324 0.70710678118474324 0.70710678118474324 1 1 1 1 0.70710678118474324 0.70710678118474324 0.70710678118474324 0.70710678118474324 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsDegreeElevateCurve.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 0 0.66666666666666663 0 0 1.1666666666666665 0 0 1.8333333333333333 0 0 2.333333333333333 0 0 3 0 0</points>\n\t\t<point_selection>0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 1 1 3</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">6</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 2 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 1 1 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsEditKnotVector.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 0.7511055240883614 5.0000000000038334 0 -2.0710678118984669 4.9999999999894307 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119672569625e-11 -0 -4.9999999999489653 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 0 1 4 2 6 4 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">10</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.10000000000000001 0.20000000000000001 0.25 0.29999999999999999 0.29999999999999999 0.80000000000000004 0.80000000000000004 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 0.94142135623694867 0.85355339059237156 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 0 1 4 2 6 4 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsEditKnotVector.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 0.7511055240883614 5.0000000000038334 0 -2.0710678118984669 4.9999999999894307 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119692792285e-11 -0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 0 1 4 2 6 4 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">10</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.10000000000000001 0.20000000000000001 0.25 0.29999999999999999 0.29999999999999999 0.80000000000000004 0.80000000000000004 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 0.94142135623694867 0.85355339059237156 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 0 1 4 2 6 4 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsExtractCurvePoint.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>4.0691301802496866 2.9055429055825619 0</points>\n\t\t<point_selection>1</point_selection>\n\t\t<point_attributes/>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsExtractPatchCurve.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 -5 5 5.0000000000255174 -5 -2.5517059836284813e-11 5 -5 -5.0000000000510338 4.9999999999744817 -5 -5 -5.1034119672569625e-11 -5 -4.9999999999489662 -5.0000000000765512 -5 7.6551179508854434e-11 -5 -5 5.0000000001020686 -4.9999999999234488 -5 5 1.0206823934513925e-10 -5 5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119672569625e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0 5 0 5 5 5.0000000000255174 5 -2.5517059836284813e-11 5 5 -5.0000000000510338 4.9999999999744817 5 -5 -5.1034119672569625e-11 5 -4.9999999999489662 -5.0000000000765512 5 7.6551179508854434e-11 -5 5 5.0000000001020686 -4.9999999999234488 5 5 1.0206823934513925e-10 5 -5 -5.1034119672569625e-11 -5 -5 -5.1034119672569625e-11 0 -5 -5.1034119672569625e-11 5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 4 13 22</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\"/>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">27 28 29\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">4 13 22</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsExtractPatchCurve.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 -5 5 5.0000000000255174 -5 -2.5517059846396142e-11 5 -5 -5.0000000000510338 4.9999999999744817 -5 -5 -5.1034119692792285e-11 -5 -4.9999999999489662 -5.0000000000765512 -5 7.6551179539188427e-11 -5 -5 5.0000000001020686 -4.9999999999234488 -5 5 1.0206823938558457e-10 -5 5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119692792285e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0 5 0 5 5 5.0000000000255174 5 -2.5517059846396142e-11 5 5 -5.0000000000510338 4.9999999999744817 5 -5 -5.1034119692792285e-11 5 -4.9999999999489662 -5.0000000000765512 5 7.6551179539188427e-11 -5 5 5.0000000001020686 -4.9999999999234488 5 5 1.0206823938558457e-10 5 -5 -5.1034119692792285e-11 -5 -5 -5.1034119692792285e-11 0 -5 -5.1034119692792285e-11 5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 4 13 22</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\"/>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">27 28 29\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">4 13 22</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsExtractTrimCurves.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 5 0 -1.6666666666666665 5 0 1.6666666666666665 5 0 5 5 0 -5 1.6666666666666665 0 -1.6666666666666665 1.6666666666666665 0 1.6666666666666665 1.6666666666666665 0 5 1.6666666666666665 0 -5 -1.6666666666666665 0 -1.6666666666666665 -1.6666666666666665 0 1.6666666666666665 -1.6666666666666665 0 5 -1.6666666666666665 0 -5 -5 0 -1.6666666666666665 -5 0 1.6666666666666665 -5 0 5 -5 0 5 -2.5517365997984598e-11 0 4.9999999997497167 -2.9289321881419976 0 2.9289321881198696 -4.9999999999894342 0 -5.103449146571723e-11 -4.9999999999744826 0 -2.928932188187249 -4.9999999999595328 0 -4.9999999999047589 -2.9289321880909647 0 -5 2.5517365997984598e-11 0 -4.999999999844964 2.9289321881419976 0 -2.9289321880851857 4.9999999999682938 0 5.1033436699633734e-11 4.9999999999234488 0 2.928932188221931 4.9999999998786029 0 4.9999999998095124 2.9289321879888965 0 5 -1.2758460954387374e-10 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\">0.99999999998979316 0.50000000000255174 0.99999999998979316 1 0.49999999999489658 0.99999999999744826 0 0.99999999999489653 5.1033621772944571e-12 0.49999999999744826 1.0206724354588914e-11 5.5511151231257827e-17 0.50000000000510336 7.6551542882441481e-12 1 1.5310253065337065e-11 0.99999999998979316 0.50000000001275846</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">13</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0 0.25 0.25 0.25 0.5 0.5 0.5 0.75 0.75 0.75 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.80473785412316279 0.80473785412316146 1 0.80473785412316257 0.80473785412316168 1 0.80473785412316257 0.80473785412316157 0.99999999999999978 0.80473785412316234 0.80473785412316212 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">16 17 18 19 20 21 22 23 24 25 26 27 28\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsExtrudeCurve.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119672569625e-11 -0 -4.9999999999489653 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0 5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744826 0 -5 -5.1034119672569625e-11 0 -4.9999999999489653 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0 5 0 1 5 5.0000000000255174 1 -2.5517059836284813e-11 5 1 -5.0000000000510338 4.9999999999744826 1 -5 -5.1034119672569625e-11 1 -4.9999999999489653 -5.0000000000765512 1 7.6551179508854434e-11 -5 1 5.0000000001020686 -4.9999999999234488 1 5 1.0206823934513925e-10 1</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 0 0 2 2 4 4 6 5 8 0 0 2 2 4 4 6 5 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 2 2 4 4 6 5 8 0 0 2 2 4 4 6 5 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsExtrudeCurve.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119692792285e-11 -0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0 5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744826 0 -5 -5.1034119692792285e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0 5 0 1 5 5.0000000000255174 1 -2.5517059846396142e-11 5 1 -5.0000000000510338 4.9999999999744826 1 -5 -5.1034119692792285e-11 1 -4.9999999999489662 -5.0000000000765512 1 7.6551179539188427e-11 -5 1 5.0000000001020686 -4.9999999999234488 1 5 1.0206823938558457e-10 1</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 0 0 2 2 4 4 6 5 8 0 0 2 2 4 4 6 5 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 2 2 4 4 6 5 8 0 0 2 2 4 4 6 5 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsExtrudePatch.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119672569625e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 2.5 0 0 2.5 2.5000000000127587 0 -1.2758529918142406e-11 2.5 0 -2.5000000000255169 2.4999999999872409 0 -2.5 -2.5517059836284813e-11 0 -2.4999999999744831 -2.5000000000382756 0 3.8275589754427217e-11 -2.5 0 2.5000000000510343 -2.4999999999617244 0 0 0 0 5 0 1 5 5.0000000000255174 1 -2.5517059836284813e-11 5 1 -5.0000000000510338 4.9999999999744817 1 -5 -5.1034119672569625e-11 1 -4.9999999999489662 -5.0000000000765512 1 7.6551179508854434e-11 -5 1 5.0000000001020686 -4.9999999999234488 1 2.5 0 1 0 0 1</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 9 10 11 12 13 14 15 16 18 0 0 2 1 4 2 6 4 9 18</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0 27 45 51 69</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0 12 24 29 41</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3 3 2 3 2</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9 9 3 9 3</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0 5 9 13 17</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2 2 2 2 2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3 2 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4 0 0 0 1 1 2 2 3 3 4 4 4 0 0 1 2 2 0 0 0 1 1 2 2 3 3 4 4 4 0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 1 1 1 1 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 0 8 9 10 11 12 13 14 15 8 16 16 16 16 16 16 16 16 16 0 1 2 3 4 5 6 7 0 17 18 19 20 21 22 23 24 17 0 8 16 17 25 26 16 16 16 16 16 16 16 16 16 26 26 26 26 26 26 26 26 26 0 8 16 17 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 0 1 0 1 0 2 0 2 2 3 2 3 1 3 1 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 0 0 2 1 4 2 6 4 8 0 0 2 1 4 2 6 4 8 0 9 18 0 9 18 18 16 20 18 22 21 24 22 26 18 16 20 18 22 21 24 22 26 8 17 26 8 17 26</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsExtrudePatch.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119692792285e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 2.5 0 0 2.5 2.5000000000127587 0 -1.2758529923198071e-11 2.5 0 -2.5000000000255169 2.4999999999872409 0 -2.5 -2.5517059846396142e-11 0 -2.4999999999744831 -2.5000000000382756 0 3.8275589769594213e-11 -2.5 0 2.5000000000510343 -2.4999999999617244 0 0 0 0 5 0 1 5 5.0000000000255174 1 -2.5517059846396142e-11 5 1 -5.0000000000510338 4.9999999999744817 1 -5 -5.1034119692792285e-11 1 -4.9999999999489662 -5.0000000000765512 1 7.6551179539188427e-11 -5 1 5.0000000001020686 -4.9999999999234488 1 2.5 0 1 0 0 1</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 9 10 11 12 13 14 15 16 18 0 0 2 1 4 2 6 4 9 18</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0 27 45 51 69</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0 12 24 29 41</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3 3 2 3 2</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9 9 3 9 3</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0 5 9 13 17</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2 2 2 2 2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3 2 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4 0 0 0 1 1 2 2 3 3 4 4 4 0 0 1 2 2 0 0 0 1 1 2 2 3 3 4 4 4 0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 1 1 1 1 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 0 8 9 10 11 12 13 14 15 8 16 16 16 16 16 16 16 16 16 0 1 2 3 4 5 6 7 0 17 18 19 20 21 22 23 24 17 0 8 16 17 25 26 16 16 16 16 16 16 16 16 16 26 26 26 26 26 26 26 26 26 0 8 16 17 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 0 1 0 1 0 2 0 2 2 3 2 3 1 3 1 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 0 0 2 1 4 2 6 4 8 0 0 2 1 4 2 6 4 8 0 9 18 0 9 18 18 16 20 18 22 21 24 22 26 18 16 20 18 22 21 24 22 26 8 17 26 8 17 26</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsFlipCurve.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119672569625e-11 -0 -4.9999999999489653 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">8 7 6 5 4 3 2 1 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsFlipCurve.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119692792285e-11 -0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">8 7 6 5 4 3 2 1 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsMergeConnectedCurves.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119672569625e-11 -0 -4.9999999999489653 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 0 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.5 0.5 1 1 1.5 1.5 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsMergeConnectedCurves.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119692792285e-11 -0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 0 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.5 0.5 1 1 1.5 1.5 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsMergeCurveKnotVectors.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 4.9999999999999991 2.9289321881463768 0 2.4452083820389481 4.3613020955222161 0 1.3060193747973934 5.0000000000066649 0 -2.5517059836284813e-11 5 0 -1.306019374848427 4.9999999999933351 0 -2.4452083820834623 4.3613020954972583 0 -5.0000000000298961 2.9289321880953434 0 -5 -5.1034119672569625e-11 -0 -4.9999999999701039 -2.9289321881974093 0 -2.4452083819944344 -4.361302095547174 0 -1.30601937474636 -5.0000000000199956 0 7.6551179508854434e-11 -5 0 1.3060193748994622 -4.9999999999800044 0 2.4452083821279791 -4.3613020954722996 0 5.0000000000597895 -2.9289321880443078 0 5 1.0206823934513925e-10 0 5 0 3 5 1.3397459621556136 3 4.3301270189221936 2.4999999999999996 3 4.0009957749537044 3.0700720369117716 3.0000000000000004 3.5355339059327386 3.5355339059327373 3.0000000000000004 3.0700720369117729 4.0009957749537035 3.0000000000000004 2.5000000000000004 4.3301270189221928 3 1.3397459621556134 5 3 3.0616169978683831e-16 5 3 -1.339745962155614 5 3 -2.4999999999999991 4.3301270189221945 3 -3.0700720369117711 4.0009957749537053 3.0000000000000004 -3.5355339059327373 3.5355339059327391 3.0000000000000004 -4.0009957749537035 3.0700720369117729 3.0000000000000004 -4.3301270189221936 2.4999999999999996 3 -5 1.3397459621556143 3 -5 6.1232339957367663e-16 3</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">17</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.16666666666666666 0.16666666666666666 0.25 0.25 0.33333333333333331 0.33333333333333331 0.5 0.5 0.66666666666666663 0.66666666666666663 0.75 0.75 0.83333333333333337 0.83333333333333337 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.80473785412316223 0.86982523608210816 0.90236892706158112 1 0.90236892706158112 0.86982523608210816 0.80473785412316212 1 0.80473785412316223 0.86982523608210793 0.90236892706158101 1 0.90236892706158101 0.86982523608210793 0.80473785412316223 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">17</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.16666666666666666 0.16666666666666666 0.25 0.25 0.33333333333333331 0.33333333333333331 0.5 0.5 0.66666666666666663 0.66666666666666663 0.75 0.75 0.83333333333333337 0.83333333333333337 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.96592582628906831 1 0.9829629131445341 0.9829629131445341 0.9829629131445341 1 0.96592582628906831 1 0.96592582628906831 1 0.9829629131445341 0.9829629131445341 0.9829629131445341 1 0.96592582628906831 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsMergeCurveKnotVectors.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 4.9999999999999991 2.9289321881463768 0 2.4452083820389481 4.3613020955222161 0 1.3060193747973934 5.0000000000066649 0 -2.5517059846396142e-11 5 0 -1.306019374848427 4.9999999999933351 0 -2.4452083820834623 4.3613020954972583 0 -5.0000000000298961 2.9289321880953434 -0 -5 -5.1034119692792285e-11 -0 -4.9999999999701048 -2.9289321881974093 0 -2.4452083819944344 -4.361302095547174 0 -1.30601937474636 -5.0000000000199956 0 7.6551179539188427e-11 -5 0 1.3060193748994622 -4.9999999999800044 0 2.4452083821279791 -4.3613020954722996 0 5.0000000000597895 -2.9289321880443078 0 5 1.0206823938558457e-10 0 5 0 3 5 1.3397459621556136 3 4.3301270189221936 2.4999999999999996 3 4.0009957749537044 3.0700720369117716 3.0000000000000004 3.5355339059327382 3.5355339059327373 3.0000000000000004 3.0700720369117724 4.0009957749537035 3.0000000000000004 2.5000000000000004 4.3301270189221928 3 1.3397459621556134 5 3 3.0615158845559431e-16 5 3 -1.3397459621556129 5 3 -2.4999999999999991 4.3301270189221936 3 -3.070072036911772 4.0009957749537044 3.0000000000000004 -3.5355339059327382 3.5355339059327382 3.0000000000000004 -4.0009957749537044 3.070072036911772 3.0000000000000004 -4.3301270189221936 2.4999999999999996 3 -5 1.3397459621556143 3 -5 6.1230317691118863e-16 3</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">17</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.16666666666666666 0.16666666666666666 0.25 0.25 0.33333333333333331 0.33333333333333331 0.5 0.5 0.66666666666666663 0.66666666666666663 0.75 0.75 0.83333333333333337 0.83333333333333337 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.80473785412316223 0.86982523608210816 0.90236892706158112 1 0.90236892706158112 0.86982523608210816 0.80473785412316212 1 0.80473785412316223 0.86982523608210793 0.90236892706158101 1 0.90236892706158101 0.86982523608210793 0.80473785412316223 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">17</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.16666666666666666 0.16666666666666666 0.25 0.25 0.33333333333333331 0.33333333333333331 0.5 0.5 0.66666666666666663 0.66666666666666663 0.75 0.75 0.83333333333333337 0.83333333333333337 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.96592582628906831 1 0.9829629131445341 0.9829629131445341 0.9829629131445341 1 0.96592582628906831 1 0.96592582628906831 1 0.9829629131445341 0.9829629131445341 0.9829629131445341 1 0.96592582628906831 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsPatchDegreeElevation.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 5 0 -2.5 5 0 0 5 0 2.5 5 0 5 5 0 -5 1.6666666666666665 0 -2.5 1.6666666666666665 0 0 1.6666666666666665 0 2.5 1.6666666666666665 0 5 1.6666666666666665 0 -5 -1.6666666666666665 0 -2.5 -1.6666666666666665 0 0 -1.6666666666666665 0 2.5 -1.6666666666666665 0 5 -1.6666666666666665 0 -5 -5 0 -2.5 -5 0 0 -5 0 2.5 -5 0 5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 1 3 4 4 5 5 7 8 8 9 9 11 12 12 13 13 15</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">5</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">5</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 0 1 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 1 3 4 4 5 5 7 8 8 9 9 11 12 12 13 13 15</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsPatchInsertKnot.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 5 0 -2.5499999999999998 5 0 -0.10000000000000009 5 0 3.2333333333333329 5 0 4.1166666666666663 5 0 5 5 0 -5 1.6666666666666665 0 -2.5499999999999998 1.6666666666666665 0 -0.10000000000000009 1.6666666666666665 0 3.2333333333333329 1.6666666666666665 0 4.1166666666666663 1.6666666666666665 0 5 1.6666666666666665 0 -5 -1.6666666666666665 0 -2.5499999999999998 -1.6666666666666665 0 -0.10000000000000009 -1.6666666666666665 0 3.2333333333333329 -1.6666666666666665 0 4.1166666666666663 -1.6666666666666665 0 5 -1.6666666666666665 0 -5 -5 0 -2.5499999999999998 -5 0 -0.10000000000000009 -5 0 3.2333333333333329 -5 0 4.1166666666666663 -5 0 5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 1 2 3 4 4 4 5 6 7 8 8 8 9 10 11 12 12 12 13 14 15</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">6</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 0.73499999999999999 0.73499999999999999 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 1 2 3 4 4 4 5 6 7 8 8 8 9 10 11 12 12 12 13 14 15</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsPolygonizeCurve.reference.3.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 4.0691301944989151 2.905542885626923 0 1.4690596885376697 4.7793162305411014 0 -1.4690596885864524 4.7793162305261072 0 -4.0691301945285714 2.9055428855853886 0 -5 -5.1034119692792285e-011 0 -4.0691301944692588 -2.9055428856684564 0 -1.4690596884888873 -4.7793162305560966 0 1.4690596886352343 -4.779316230511113 0 4.0691301945582277 -2.9055428855438565 0 5 1.0206823938558457e-010 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<vertex_data/>\n\t\t<primitives>\n\t\t\t<primitive type=\"linear_curve\">\n\t\t\t\t<topology>\n\t\t\t\t\t<array name=\"curve_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">11</array>\n\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10\n\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t</metadata>\n\t\t\t\t\t</array>\n\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0</array>\n\t\t\t\t\t<array name=\"first_curves\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">2</array>\n\t\t\t\t\t<array name=\"periodic_curves\" type=\"k3d::bool_t\">0</array>\n\t\t\t\t</topology>\n\t\t\t\t<attributes>\n\t\t\t\t\t<arrays type=\"constant\"/>\n\t\t\t\t\t<arrays type=\"uniform\"/>\n\t\t\t\t\t<arrays type=\"varying\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t\t<nurbs_curve_groups>\n\t\t\t<first_curves/>\n\t\t\t<curve_counts/>\n\t\t\t<materials/>\n\t\t\t<constant_data/>\n\t\t\t<curve_first_points/>\n\t\t\t<curve_point_counts/>\n\t\t\t<curve_orders/>\n\t\t\t<curve_first_knots/>\n\t\t\t<curve_selection/>\n\t\t\t<uniform_data/>\n\t\t\t<curve_points/>\n\t\t\t<curve_point_weights/>\n\t\t\t<curve_knots/>\n\t\t</nurbs_curve_groups>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsPolygonizeCurve.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 4.9565754102706041 0.65754102708561246 0 4.818932170054361 1.3333764436254161 0 4.57920772021847 2.0076993437991559 0 4.2351668723008657 2.6576985464430138 0 3.7914111706844498 3.2596320858049572 0 3.2596320857856083 3.7914111707010854 0 2.6576985464214 4.2351668723144291 0 2.0076993437757862 4.579207720228716 0 1.3333764436008222 4.8189321700611663 0 0.65754102706031636 4.9565754102739588 0 -2.5517059836284813e-11 5 0 -0.65754102711090723 4.9565754102672477 0 -1.3333764436500091 4.8189321700475567 0 -2.0076993438225252 4.5792077202082231 0 -2.6576985464646281 4.2351668722873006 0 -3.2596320858243071 3.7914111706678142 0 -3.7914111707177205 3.2596320857662584 0 -4.2351668723279907 2.6576985463997866 0 -4.5792077202389612 2.0076993437524169 0 -4.8189321700679724 1.3333764435762285 0 -4.9565754102773143 0.65754102703502093 0 -5 -5.1034119672569625e-11 0 -4.956575410263893 -0.65754102713620266 0 -4.8189321700407524 -1.3333764436746005 0 -4.5792077201979788 -2.0076993438458937 0 -4.2351668722737372 -2.6576985464862419 0 -3.7914111706511799 -3.2596320858436556 0 -3.2596320857469099 -3.7914111707343556 0 -2.6576985463781728 -4.235166872341555 0 -2.0076993437290458 -4.5792077202492099 0 -1.3333764435516353 -4.8189321700747767 0 -0.6575410270097255 -4.9565754102806707 0 7.6551179508854434e-11 -5 0 0.6575410271614982 -4.9565754102605366 0 1.3333764436991937 -4.818932170033948 0 2.0076993438692634 -4.5792077201877319 0 2.6576985465078558 -4.2351668722601747 0 3.2596320858630046 -3.7914111706345439 0 3.7914111707509912 -3.2596320857275605 0 4.2351668723551184 -2.657698546356559 0 4.579207720259455 -2.007699343705676 0 4.8189321700815819 -1.3333764435270428 0 4.9565754102840263 -0.65754102698443007 0 5 1.0206823934513925e-10 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">2147483648 2147483648 2147483648 2147483648 2147483648 2147483648 2147483648 2147483648 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 2147483648 2147483648 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"linear_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"periodic\" type=\"k3d::bool_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">45</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">2147483648 2147483648 2147483648 2147483648 2147483648 2147483648 2147483648 2147483648 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 2147483648 2147483648 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsPolygonizeCurve.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 4.9565754102706041 0.65754102708561246 0 4.818932170054361 1.3333764436254161 0 4.57920772021847 2.0076993437991559 0 4.2351668723008657 2.6576985464430138 0 3.7914111706844498 3.2596320858049572 0 3.2596320857856083 3.7914111707010854 0 2.6576985464214 4.2351668723144291 0 2.0076993437757862 4.579207720228716 0 1.3333764436008222 4.8189321700611663 0 0.65754102706031636 4.9565754102739588 0 -2.5517059846396142e-11 5 0 -0.65754102711090723 4.9565754102672477 0 -1.3333764436500091 4.8189321700475567 0 -2.0076993438225252 4.5792077202082231 0 -2.6576985464646281 4.2351668722873006 0 -3.2596320858243071 3.7914111706678142 0 -3.7914111707177205 3.2596320857662584 0 -4.2351668723279916 2.6576985463997849 0 -4.5792077202389612 2.0076993437524169 0 -4.8189321700679715 1.3333764435762299 0 -4.9565754102773143 0.65754102703502093 0 -5 -5.1034119692792285e-11 0 -4.956575410263893 -0.65754102713620266 0 -4.8189321700407532 -1.3333764436746005 0 -4.5792077201979771 -2.0076993438458972 0 -4.2351668722737381 -2.6576985464862419 0 -3.7914111706511799 -3.2596320858436556 0 -3.2596320857469099 -3.7914111707343556 0 -2.6576985463781733 -4.235166872341555 0 -2.0076993437290458 -4.5792077202492099 0 -1.3333764435516355 -4.8189321700747767 0 -0.6575410270097255 -4.9565754102806707 0 7.6551179539188427e-11 -5 0 0.6575410271614982 -4.9565754102605366 0 1.3333764436991937 -4.818932170033948 0 2.0076993438692665 -4.5792077201877301 0 2.6576985465078558 -4.2351668722601747 0 3.2596320858630046 -3.7914111706345439 0 3.7914111707509912 -3.2596320857275605 0 4.2351668723551184 -2.657698546356559 0 4.579207720259455 -2.007699343705676 0 4.8189321700815819 -1.3333764435270428 0 4.9565754102840263 -0.65754102698443007 0 5 1.0206823938558457e-10 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"linear_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"periodic\" type=\"k3d::bool_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">45</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsPolygonizePatch.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>3.0616169978683831e-16 0 -5 2.9690400960488656e-16 7.4719445239559589e-17 -5 2.670527325690322e-16 1.497258309169767e-16 -5 2.1648901405832093e-16 2.1648901405942578e-16 -5 1.4972583091561382e-16 2.6705273256979631e-16 -5 7.4719445238044409e-17 2.9690400960526793e-16 -5.0000000000000009 -1.5624692826078842e-27 3.0616169978683831e-16 -5 -7.4719445241074843e-17 2.969040096045052e-16 -5 -1.4972583091833954e-16 2.6705273256826814e-16 -5.0000000000000009 -2.1648901406053061e-16 2.1648901405721606e-16 -5 -2.6705273257056038e-16 1.4972583091425094e-16 -5 -2.9690400960564919e-16 7.471944523652918e-17 -5.0000000000000009 -3.0616169978683831e-16 -3.1249385652157683e-27 -5 -2.9690400960412393e-16 -7.4719445242589974e-17 -5.0000000000000009 -2.6705273256750388e-16 -1.4972583091970249e-16 -5 -2.1648901405611129e-16 -2.1648901406163543e-16 -5 -1.4972583091288811e-16 -2.6705273257132449e-16 -5 -7.4719445235014062e-17 -2.9690400960603051e-16 -4.9999999999999991 4.6874078478236525e-27 -3.0616169978683831e-16 -5 7.4719445244105203e-17 -2.9690400960374261e-16 -5.0000000000000009 1.497258309210654e-16 -2.6705273256673982e-16 -5 2.1648901406274028e-16 -2.1648901405500644e-16 -5 2.670527325720886e-16 -1.4972583091152521e-16 -5 2.9690400960641187e-16 -7.471944523349882e-17 -4.9999999999999991 3.0616169978683831e-16 6.2498771304315366e-27 -5 1.2202611445418281 0 -4.8488104457816723 1.183362996846975 0.29780745217653476 -4.8488104457816723 1.0643854973518772 0.59675855578745574 -4.8488104457816732 0.86285493012178283 0.86285493012618641 -4.8488104457816732 0.59675855578202375 1.0643854973549227 -4.8488104457816723 0.2978074521704957 1.1833629968484947 -4.8488104457816723 -6.227495328233445e-12 1.2202611445418281 -4.8488104457816723 -0.2978074521825741 1.1833629968454549 -4.8488104457816723 -0.59675855579288761 1.0643854973488316 -4.8488104457816732 -0.86285493013058978 0.86285493011737935 -4.8488104457816732 -1.0643854973579678 0.59675855577659187 -4.8488104457816723 -1.1833629968500146 0.29780745216445653 -4.8488104457816723 -1.2202611445418281 -1.245499065646689e-11 -4.8488104457816723 -1.1833629968439354 -0.29780745218861288 -4.8488104457816723 -1.0643854973457858 -0.59675855579832005 -4.8488104457816723 -0.86285493011297587 -0.86285493013499348 -4.8488104457816732 -0.59675855577115999 -1.0643854973610136 -4.8488104457816723 -0.29780745215841775 -1.1833629968515345 -4.8488104457816732 1.8682485984700332e-11 -1.2202611445418281 -4.8488104457816723 0.2978074521946521 -1.1833629968424155 -4.8488104457816723 0.59675855580375203 -1.0643854973427402 -4.8488104457816723 0.86285493013939696 -0.86285493010857228 -4.8488104457816732 1.064385497364059 -0.596758555765728 -4.8488104457816723 1.1833629968530543 -0.29780745215237858 -4.8488104457816732 1.2202611445418281 2.490998131293378e-11 -4.8488104457816723 2.4452083820543411 0 -4.3613020955135848 2.3712703890031808 0.59675855578744019 -4.3613020955135848 2.1328584881223143 1.1958088063371186 -4.3613020955135848 1.7290234283603989 1.729023428369223 -4.3613020955135839 1.1958088063262338 2.1328584881284169 -4.3613020955135839 0.59675855577533887 2.3712703890062268 -4.3613020955135848 -1.2478905719413163e-11 2.4452083820543411 -4.3613020955135848 -0.59675855579954196 2.3712703890001352 -4.3613020955135848 -1.1958088063480032 2.1328584881162116 -4.3613020955135848 -1.7290234283780468 1.7290234283515746 -4.3613020955135839 -2.1328584881345192 1.1958088063153489 -4.3613020955135839 -2.3712703890092719 0.59675855576323722 -4.3613020955135848 -2.4452083820543411 -2.4957811438826327e-11 -4.3613020955135848 -2.3712703889970901 -0.59675855581164261 -4.3613020955135839 -2.1328584881101089 -1.1958088063588885 -4.3613020955135848 -1.7290234283427512 -1.7290234283868704 -4.3613020955135839 -1.1958088063044645 -2.1328584881406218 -4.3613020955135839 -0.59675855575113657 -2.3712703890123175 -4.3613020955135848 3.7436717158239477e-11 -2.4452083820543411 -4.3613020955135848 0.59675855582374426 -2.3712703889940445 -4.3613020955135839 1.1958088063697738 -2.1328584881040062 -4.3613020955135848 1.7290234283956947 -1.7290234283339276 -4.3613020955135839 2.1328584881467245 -1.1958088062935797 -4.3613020955135839 2.371270389015363 -0.59675855573903513 -4.3613020955135848 2.4452083820543411 4.9915622877652653e-11 -4.3613020955135848 3.5355339059327378 0 -3.5355339059327378 3.4286267468997842 0.86285493012638437 -3.5355339059327382 3.0839062865380349 1.7290234283696648 -3.5355339059327378 2.4999999999936211 2.5000000000063798 -3.5355339059327382 1.7290234283539263 3.0839062865468589 -3.5355339059327378 0.86285493010888692 3.4286267469041869 -3.5355339059327373 -1.8043286046179888e-11 3.5355339059327378 -3.5355339059327378 -0.86285493014388259 3.4286267468953793 -3.5355339059327373 -1.7290234283854029 3.0839062865292104 -3.5355339059327378 -2.500000000019138 2.499999999980862 -3.5355339059327382 -3.0839062865556821 1.7290234283381882 -3.5355339059327369 -3.4286267469085909 0.86285493009138914 -3.5355339059327373 -3.5355339059327378 -3.6086572092359776e-11 -3.5355339059327378 -3.4286267468909775 -0.86285493016137904 -3.5355339059327382 -3.0839062865203863 -1.7290234284011423 -3.5355339059327369 -2.4999999999681042 -2.5000000000318967 -3.5355339059327382 -1.7290234283224502 -3.0839062865645062 -3.5355339059327369 -0.8628549300738928 -3.4286267469129936 -3.5355339059327373 5.412985813853966e-11 -3.5355339059327378 -3.5355339059327378 0.86285493017887693 -3.4286267468865743 -3.5355339059327382 1.7290234284168806 -3.0839062865115623 -3.5355339059327369 2.5000000000446554 -2.4999999999553455 -3.5355339059327382 3.0839062865733298 -1.7290234283067116 -3.5355339059327369 3.4286267469173972 -0.86285493005639513 -3.5355339059327373 3.5355339059327378 7.2173144184719551e-11 -3.5355339059327378 4.3613020955135848 0 -2.4452083820543411 4.2294254315864093 1.0643854973557765 -2.4452083820543415 3.8041911936628803 2.1328584881301831 -2.4452083820543407 3.0839062865328857 3.0839062865486251 -2.4452083820543407 2.1328584881107697 3.8041911936737658 -2.4452083820543411 1.0643854973341924 4.2294254315918414 -2.4452083820543407 -2.2257521307066901e-11 4.3613020955135848 -2.4452083820543411 -1.0643854973773614 4.2294254315809763 -2.4452083820543407 -2.1328584881495978 3.8041911936519957 -2.4452083820543411 -3.0839062865643632 3.0839062865171467 -2.4452083820543407 -3.8041911936846504 2.132858488091355 -2.4452083820543411 -4.2294254315972726 1.0643854973126077 -2.4452083820543407 -4.3613020955135848 -4.4515042614133802e-11 -2.4452083820543411 -4.229425431575546 -1.0643854973989444 -2.4452083820543411 -3.8041911936411106 -2.1328584881690125 -2.4452083820543407 -3.0839062865014095 -3.0839062865801012 -2.4452083820543407 -2.1328584880719417 -3.804191193695535 -2.4452083820543411 -1.0643854972910252 -4.2294254316027047 -2.4452083820543411 6.6772563921200693e-11 -4.3613020955135848 -2.4452083820543411 1.0643854974205289 -4.229425431570113 -2.4452083820543411 2.1328584881884272 -3.8041911936302246 -2.4452083820543407 3.0839062865958402 -3.0839062864856706 -2.4452083820543407 3.8041911937064192 -2.1328584880525265 -2.4452083820543411 4.2294254316081368 -1.0643854972694404 -2.4452083820543411 4.3613020955135848 8.9030085228267604e-11 -2.4452083820543411 4.8488104457816732 0 -1.2202611445418288 4.702192547823465 1.1833629968504744 -1.2202611445418288 4.2294254315834223 2.3712703890102556 -1.2202611445418288 3.4286267468916378 3.4286267469091354 -1.2202611445418285 2.3712703889886706 4.2294254315955238 -1.2202611445418285 1.1833629968264778 4.7021925478295046 -1.2202611445418285 -2.4745477255962761e-11 4.8488104457816732 -1.2202611445418288 -1.1833629968744723 4.7021925478174253 -1.220261144541829 -2.3712703890318392 4.2294254315713209 -1.2202611445418288 -3.4286267469266338 3.4286267468741398 -1.2202611445418285 -4.2294254316076243 2.3712703889670865 -1.2202611445418285 -4.7021925478355442 1.1833629968024804 -1.2202611445418285 -4.8488104457816732 -4.9490954511925521e-11 -1.2202611445418288 -4.7021925478113866 -1.183362996898468 -1.2202611445418288 -4.2294254315592186 -2.3712703890534255 -1.2202611445418285 -3.4286267468566431 -3.4286267469441314 -1.2202611445418285 -2.3712703889455029 -4.2294254316197266 -1.2202611445418285 -1.1833629967784849 -4.702192547841582 -1.2202611445418285 7.4236431767888263e-11 -4.8488104457816732 -1.2202611445418288 1.1833629969224653 -4.702192547805347 -1.2202611445418288 2.3712703890750095 -4.2294254315471171 -1.2202611445418285 3.4286267469616294 -3.4286267468391456 -1.2202611445418285 4.229425431631828 -2.3712703889239184 -1.2202611445418285 4.7021925478476208 -1.1833629967544876 -1.2202611445418285 4.8488104457816732 9.8981909023851043e-11 -1.2202611445418288 5 0 0 4.8488104457808188 1.2202611445452218 0 4.3613020955097372 2.4452083820612054 0 3.5355339059237156 3.5355339059417599 0 2.4452083820389481 4.3613020955222161 0 1.2202611445204772 4.8488104457870467 0 -2.5517059836284813e-11 5 0 -1.220261144569968 4.8488104457745909 0 -2.4452083820834627 4.3613020954972583 0 -3.5355339059598032 3.5355339059056718 0 -4.3613020955346942 2.4452083820166903 0 -4.8488104457932737 1.2202611444957314 0 -5 -5.1034119672569625e-11 0 -4.8488104457683656 -1.2202611445947118 0 -4.3613020954847785 -2.4452083821057213 0 -3.5355339058876298 -3.5355339059778461 0 -2.4452083819944339 -4.3613020955471731 0 -1.2202611444709877 -4.8488104457995007 0 7.6551179508854434e-11 -5 0 1.2202611446194576 -4.8488104457621377 0 2.4452083821279786 -4.3613020954722996 0 3.5355339059958895 -3.5355339058695865 0 4.361302095559652 -2.4452083819721757 0 4.8488104458057277 -1.2202611444462421 0 5 1.0206823934513925e-10 0 4.8488104457816732 0 1.2202611445418288 4.702192547823465 1.1833629968504744 1.2202611445418288 4.2294254315834223 2.3712703890102556 1.2202611445418288 3.4286267468916378 3.4286267469091354 1.2202611445418285 2.3712703889886706 4.2294254315955238 1.2202611445418285 1.1833629968264778 4.7021925478295046 1.2202611445418285 -2.4745477255962761e-11 4.8488104457816732 1.2202611445418288 -1.1833629968744723 4.7021925478174253 1.220261144541829 -2.3712703890318392 4.2294254315713209 1.2202611445418288 -3.4286267469266338 3.4286267468741398 1.2202611445418285 -4.2294254316076243 2.3712703889670865 1.2202611445418285 -4.7021925478355442 1.1833629968024804 1.2202611445418285 -4.8488104457816732 -4.9490954511925521e-11 1.2202611445418288 -4.7021925478113866 -1.183362996898468 1.2202611445418288 -4.2294254315592186 -2.3712703890534255 1.2202611445418285 -3.4286267468566431 -3.4286267469441314 1.2202611445418285 -2.3712703889455029 -4.2294254316197266 1.2202611445418285 -1.1833629967784849 -4.702192547841582 1.2202611445418285 7.4236431767888263e-11 -4.8488104457816732 1.2202611445418288 1.1833629969224653 -4.702192547805347 1.2202611445418288 2.3712703890750095 -4.2294254315471171 1.2202611445418285 3.4286267469616294 -3.4286267468391456 1.2202611445418285 4.229425431631828 -2.3712703889239184 1.2202611445418285 4.7021925478476208 -1.1833629967544876 1.2202611445418285 4.8488104457816732 9.8981909023851043e-11 1.2202611445418288 4.3613020955135866 0 2.4452083820543407 4.229425431586411 1.0643854973557769 2.4452083820543407 3.8041911936628812 2.1328584881301835 2.4452083820543402 3.0839062865328866 3.0839062865486255 2.4452083820543402 2.1328584881107697 3.8041911936737671 2.4452083820543407 1.0643854973341926 4.2294254315918431 2.4452083820543407 -2.2257521307066904e-11 4.3613020955135866 2.4452083820543407 -1.0643854973773617 4.2294254315809781 2.4452083820543407 -2.1328584881495982 3.8041911936519965 2.4452083820543407 -3.0839062865643641 3.0839062865171476 2.4452083820543402 -3.8041911936846513 2.1328584880913555 2.4452083820543407 -4.2294254315972752 1.0643854973126077 2.4452083820543407 -4.3613020955135866 -4.4515042614133809e-11 2.4452083820543407 -4.2294254315755468 -1.0643854973989446 2.4452083820543407 -3.804191193641111 -2.1328584881690129 2.4452083820543402 -3.0839062865014104 -3.0839062865801017 2.4452083820543402 -2.1328584880719417 -3.8041911936955359 2.4452083820543407 -1.0643854972910252 -4.2294254316027065 2.4452083820543407 6.6772563921200706e-11 -4.3613020955135866 2.4452083820543407 1.0643854974205293 -4.2294254315701147 2.4452083820543407 2.1328584881884276 -3.804191193630226 2.4452083820543402 3.0839062865958407 -3.0839062864856719 2.4452083820543402 3.8041911937064206 -2.1328584880525274 2.4452083820543407 4.2294254316081386 -1.0643854972694404 2.4452083820543407 4.3613020955135866 8.9030085228267617e-11 2.4452083820543407 3.5355339059327378 0 3.5355339059327378 3.4286267468997842 0.86285493012638437 3.5355339059327382 3.0839062865380349 1.7290234283696648 3.5355339059327378 2.4999999999936211 2.5000000000063798 3.5355339059327382 1.7290234283539263 3.0839062865468589 3.5355339059327378 0.86285493010888692 3.4286267469041869 3.5355339059327373 -1.8043286046179888e-11 3.5355339059327378 3.5355339059327378 -0.86285493014388259 3.4286267468953793 3.5355339059327373 -1.7290234283854029 3.0839062865292104 3.5355339059327378 -2.500000000019138 2.499999999980862 3.5355339059327382 -3.0839062865556821 1.7290234283381882 3.5355339059327369 -3.4286267469085909 0.86285493009138914 3.5355339059327373 -3.5355339059327378 -3.6086572092359776e-11 3.5355339059327378 -3.4286267468909775 -0.86285493016137904 3.5355339059327382 -3.0839062865203863 -1.7290234284011423 3.5355339059327369 -2.4999999999681042 -2.5000000000318967 3.5355339059327382 -1.7290234283224502 -3.0839062865645062 3.5355339059327369 -0.8628549300738928 -3.4286267469129936 3.5355339059327373 5.412985813853966e-11 -3.5355339059327378 3.5355339059327378 0.86285493017887693 -3.4286267468865743 3.5355339059327382 1.7290234284168806 -3.0839062865115623 3.5355339059327369 2.5000000000446554 -2.4999999999553455 3.5355339059327382 3.0839062865733298 -1.7290234283067116 3.5355339059327369 3.4286267469173972 -0.86285493005639513 3.5355339059327373 3.5355339059327378 7.2173144184719551e-11 3.5355339059327378 2.4452083820543424 0 4.3613020955135848 2.3712703890031821 0.59675855578744053 4.3613020955135848 2.1328584881223152 1.1958088063371195 4.3613020955135848 1.7290234283604 1.7290234283692241 4.3613020955135848 1.1958088063262344 2.1328584881284183 4.3613020955135839 0.59675855577533909 2.3712703890062277 4.3613020955135848 -1.2478905719413167e-11 2.4452083820543424 4.3613020955135848 -0.59675855579954218 2.3712703890001361 4.3613020955135848 -1.1958088063480039 2.1328584881162129 4.3613020955135848 -1.7290234283780477 1.7290234283515757 4.3613020955135848 -2.1328584881345205 1.19580880631535 4.3613020955135848 -2.3712703890092728 0.59675855576323755 4.3613020955135848 -2.4452083820543424 -2.4957811438826333e-11 4.3613020955135848 -2.371270388997091 -0.59675855581164317 4.3613020955135848 -2.1328584881101098 -1.1958088063588896 4.3613020955135848 -1.7290234283427524 -1.7290234283868717 4.3613020955135848 -1.1958088063044654 -2.1328584881406232 4.3613020955135848 -0.5967585557511369 -2.3712703890123183 4.3613020955135848 3.7436717158239496e-11 -2.4452083820543424 4.3613020955135848 0.5967585558237446 -2.3712703889940454 4.3613020955135848 1.1958088063697745 -2.1328584881040071 4.3613020955135848 1.7290234283956958 -1.7290234283339283 4.3613020955135848 2.1328584881467259 -1.1958088062935806 4.3613020955135848 2.3712703890153639 -0.59675855573903536 4.3613020955135848 2.4452083820543424 4.9915622877652666e-11 4.3613020955135848 1.220261144541829 0 4.8488104457816732 1.1833629968469757 0.29780745217653493 4.8488104457816732 1.064385497351878 0.59675855578745607 4.8488104457816732 0.86285493012178338 0.86285493012618686 4.8488104457816714 0.59675855578202419 1.0643854973549232 4.8488104457816732 0.29780745217049592 1.1833629968484956 4.8488104457816732 -6.227495328233449e-12 1.220261144541829 4.8488104457816732 -0.29780745218257432 1.1833629968454558 4.8488104457816732 -0.59675855579288795 1.0643854973488323 4.8488104457816732 -0.86285493013059034 0.86285493011737979 4.8488104457816714 -1.0643854973579685 0.59675855577659231 4.8488104457816723 -1.1833629968500152 0.29780745216445681 4.8488104457816732 -1.220261144541829 -1.2454990656466898e-11 4.8488104457816732 -1.1833629968439359 -0.29780745218861304 4.8488104457816732 -1.0643854973457867 -0.59675855579832027 4.8488104457816732 -0.86285493011297643 -0.86285493013499381 4.8488104457816714 -0.59675855577116044 -1.0643854973610141 4.8488104457816723 -0.29780745215841792 -1.1833629968515351 4.8488104457816723 1.8682485984700345e-11 -1.220261144541829 4.8488104457816732 0.29780745219465232 -1.1833629968424162 4.8488104457816732 0.59675855580375237 -1.0643854973427409 4.8488104457816732 0.8628549301393974 -0.86285493010857262 4.8488104457816714 1.0643854973640596 -0.59675855576572834 4.8488104457816723 1.183362996853055 -0.29780745215237875 4.8488104457816723 1.220261144541829 2.4909981312933796e-11 4.8488104457816732 3.0616169978683831e-16 0 5 2.9690400960488656e-16 7.4719445239559589e-17 5 2.670527325690322e-16 1.497258309169767e-16 5 2.1648901405832093e-16 2.1648901405942578e-16 5 1.4972583091561382e-16 2.6705273256979631e-16 5 7.4719445238044409e-17 2.9690400960526793e-16 5.0000000000000009 -1.5624692826078842e-27 3.0616169978683831e-16 5 -7.4719445241074843e-17 2.969040096045052e-16 5 -1.4972583091833954e-16 2.6705273256826814e-16 5.0000000000000009 -2.1648901406053061e-16 2.1648901405721606e-16 5 -2.6705273257056038e-16 1.4972583091425094e-16 5 -2.9690400960564919e-16 7.471944523652918e-17 5.0000000000000009 -3.0616169978683831e-16 -3.1249385652157683e-27 5 -2.9690400960412393e-16 -7.4719445242589974e-17 5.0000000000000009 -2.6705273256750388e-16 -1.4972583091970249e-16 5 -2.1648901405611129e-16 -2.1648901406163543e-16 5 -1.4972583091288811e-16 -2.6705273257132449e-16 5 -7.4719445235014062e-17 -2.9690400960603051e-16 4.9999999999999991 4.6874078478236525e-27 -3.0616169978683831e-16 5 7.4719445244105203e-17 -2.9690400960374261e-16 5.0000000000000009 1.497258309210654e-16 -2.6705273256673982e-16 5 2.1648901406274028e-16 -2.1648901405500644e-16 5 2.670527325720886e-16 -1.4972583091152521e-16 5 2.9690400960641187e-16 -7.471944523349882e-17 4.9999999999999991 3.0616169978683831e-16 6.2498771304315366e-27 5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 26 25 1 2 27 26 2 3 28 27 3 4 29 28 4 5 30 29 5 6 31 30 6 7 32 31 7 8 33 32 8 9 34 33 9 10 35 34 10 11 36 35 11 12 37 36 12 13 38 37 13 14 39 38 14 15 40 39 15 16 41 40 16 17 42 41 17 18 43 42 18 19 44 43 19 20 45 44 20 21 46 45 21 22 47 46 22 23 48 47 23 24 49 48 25 26 51 50 26 27 52 51 27 28 53 52 28 29 54 53 29 30 55 54 30 31 56 55 31 32 57 56 32 33 58 57 33 34 59 58 34 35 60 59 35 36 61 60 36 37 62 61 37 38 63 62 38 39 64 63 39 40 65 64 40 41 66 65 41 42 67 66 42 43 68 67 43 44 69 68 44 45 70 69 45 46 71 70 46 47 72 71 47 48 73 72 48 49 74 73 50 51 76 75 51 52 77 76 52 53 78 77 53 54 79 78 54 55 80 79 55 56 81 80 56 57 82 81 57 58 83 82 58 59 84 83 59 60 85 84 60 61 86 85 61 62 87 86 62 63 88 87 63 64 89 88 64 65 90 89 65 66 91 90 66 67 92 91 67 68 93 92 68 69 94 93 69 70 95 94 70 71 96 95 71 72 97 96 72 73 98 97 73 74 99 98 75 76 101 100 76 77 102 101 77 78 103 102 78 79 104 103 79 80 105 104 80 81 106 105 81 82 107 106 82 83 108 107 83 84 109 108 84 85 110 109 85 86 111 110 86 87 112 111 87 88 113 112 88 89 114 113 89 90 115 114 90 91 116 115 91 92 117 116 92 93 118 117 93 94 119 118 94 95 120 119 95 96 121 120 96 97 122 121 97 98 123 122 98 99 124 123 100 101 126 125 101 102 127 126 102 103 128 127 103 104 129 128 104 105 130 129 105 106 131 130 106 107 132 131 107 108 133 132 108 109 134 133 109 110 135 134 110 111 136 135 111 112 137 136 112 113 138 137 113 114 139 138 114 115 140 139 115 116 141 140 116 117 142 141 117 118 143 142 118 119 144 143 119 120 145 144 120 121 146 145 121 122 147 146 122 123 148 147 123 124 149 148 125 126 151 150 126 127 152 151 127 128 153 152 128 129 154 153 129 130 155 154 130 131 156 155 131 132 157 156 132 133 158 157 133 134 159 158 134 135 160 159 135 136 161 160 136 137 162 161 137 138 163 162 138 139 164 163 139 140 165 164 140 141 166 165 141 142 167 166 142 143 168 167 143 144 169 168 144 145 170 169 145 146 171 170 146 147 172 171 147 148 173 172 148 149 174 173 150 151 176 175 151 152 177 176 152 153 178 177 153 154 179 178 154 155 180 179 155 156 181 180 156 157 182 181 157 158 183 182 158 159 184 183 159 160 185 184 160 161 186 185 161 162 187 186 162 163 188 187 163 164 189 188 164 165 190 189 165 166 191 190 166 167 192 191 167 168 193 192 168 169 194 193 169 170 195 194 170 171 196 195 171 172 197 196 172 173 198 197 173 174 199 198 175 176 201 200 176 177 202 201 177 178 203 202 178 179 204 203 179 180 205 204 180 181 206 205 181 182 207 206 182 183 208 207 183 184 209 208 184 185 210 209 185 186 211 210 186 187 212 211 187 188 213 212 188 189 214 213 189 190 215 214 190 191 216 215 191 192 217 216 192 193 218 217 193 194 219 218 194 195 220 219 195 196 221 220 196 197 222 221 197 198 223 222 198 199 224 223 200 201 226 225 201 202 227 226 202 203 228 227 203 204 229 228 204 205 230 229 205 206 231 230 206 207 232 231 207 208 233 232 208 209 234 233 209 210 235 234 210 211 236 235 211 212 237 236 212 213 238 237 213 214 239 238 214 215 240 239 215 216 241 240 216 217 242 241 217 218 243 242 218 219 244 243 219 220 245 244 220 221 246 245 221 222 247 246 222 223 248 247 223 224 249 248 225 226 251 250 226 227 252 251 227 228 253 252 228 229 254 253 229 230 255 254 230 231 256 255 231 232 257 256 232 233 258 257 233 234 259 258 234 235 260 259 235 236 261 260 236 237 262 261 237 238 263 262 238 239 264 263 239 240 265 264 240 241 266 265 241 242 267 266 242 243 268 267 243 244 269 268 244 245 270 269 245 246 271 270 246 247 272 271 247 248 273 272 248 249 274 273 250 251 276 275 251 252 277 276 252 253 278 277 253 254 279 278 254 255 280 279 255 256 281 280 256 257 282 281 257 258 283 282 258 259 284 283 259 260 285 284 260 261 286 285 261 262 287 286 262 263 288 287 263 264 289 288 264 265 290 289 265 266 291 290 266 267 292 291 267 268 293 292 268 269 294 293 269 270 295 294 270 271 296 295 271 272 297 296 272 273 298 297 273 274 299 298 275 276 301 300 276 277 302 301 277 278 303 302 278 279 304 303 279 280 305 304 280 281 306 305 281 282 307 306 282 283 308 307 283 284 309 308 284 285 310 309 285 286 311 310 286 287 312 311 287 288 313 312 288 289 314 313 289 290 315 314 290 291 316 315 291 292 317 316 292 293 318 317 293 294 319 318 294 295 320 319 295 296 321 320 296 297 322 321 297 298 323 322 298 299 324 323\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsPolygonizePatch.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>3.0615158845559431e-16 0 -5 2.9689420401917523e-16 7.4716977546632254e-17 -4.9999999999999991 2.6704391285500361e-16 1.4972088605459433e-16 -5 2.164818642674315e-16 2.164818642685363e-16 -5 1.4972088605323152e-16 2.6704391285576767e-16 -5 7.4716977545117111e-17 2.9689420401955654e-16 -5 -1.5624176809381285e-27 3.0615158845559431e-16 -5 -7.4716977548147458e-17 2.9689420401879386e-16 -5 -1.4972088605595716e-16 2.670439128542396e-16 -5 -2.1648186426964107e-16 2.1648186426632672e-16 -5 -2.6704391285653173e-16 1.4972088605186874e-16 -5.0000000000000009 -2.9689420401993781e-16 7.4716977543601943e-17 -5 -3.0615158845559431e-16 -3.124835361876257e-27 -5 -2.968942040184126e-16 -7.4716977549662527e-17 -5 -2.6704391285347544e-16 -1.4972088605732009e-16 -5.0000000000000009 -2.1648186426522192e-16 -2.164818642707459e-16 -5 -1.4972088605050591e-16 -2.6704391285729589e-16 -5.0000000000000009 -7.4716977542086652e-17 -2.9689420402031917e-16 -5 4.6872530428143855e-27 -3.0615158845559431e-16 -5 7.4716977551177707e-17 -2.9689420401803128e-16 -5 1.4972088605868295e-16 -2.6704391285271133e-16 -5.0000000000000009 2.1648186427185067e-16 -2.164818642641171e-16 -5 2.6704391285805995e-16 -1.4972088604914305e-16 -5.0000000000000009 2.9689420402070049e-16 -7.4716977540571485e-17 -5 3.0615158845559431e-16 6.249670723752514e-27 -5 1.2202611445418281 0 -4.8488104457816723 1.183362996846975 0.29780745217653476 -4.8488104457816723 1.0643854973518772 0.59675855578745574 -4.8488104457816732 0.86285493012178283 0.86285493012618641 -4.8488104457816732 0.59675855578202375 1.0643854973549227 -4.8488104457816723 0.2978074521704957 1.1833629968484947 -4.8488104457816723 -6.2274953307011364e-12 1.2202611445418281 -4.8488104457816723 -0.2978074521825741 1.1833629968454551 -4.8488104457816723 -0.59675855579288761 1.0643854973488318 -4.8488104457816723 -0.86285493013058989 0.86285493011737946 -4.8488104457816732 -1.0643854973579681 0.59675855577659209 -4.8488104457816723 -1.1833629968500146 0.29780745216445659 -4.8488104457816723 -1.2202611445418281 -1.2454990661402273e-11 -4.8488104457816723 -1.1833629968439354 -0.29780745218861288 -4.8488104457816723 -1.0643854973457858 -0.59675855579832005 -4.8488104457816723 -0.86285493011297587 -0.86285493013499348 -4.8488104457816732 -0.59675855577115999 -1.0643854973610134 -4.8488104457816723 -0.29780745215841692 -1.1833629968515345 -4.8488104457816723 1.8682485992103408e-11 -1.2202611445418281 -4.8488104457816723 0.2978074521946521 -1.1833629968424155 -4.8488104457816723 0.59675855580375203 -1.0643854973427402 -4.8488104457816723 0.86285493013939696 -0.86285493010857228 -4.8488104457816732 1.064385497364059 -0.59675855576572789 -4.8488104457816723 1.1833629968530543 -0.29780745215237769 -4.8488104457816723 1.2202611445418281 2.4909981322804546e-11 -4.8488104457816723 2.4452083820543411 0 -4.3613020955135848 2.3712703890031812 0.59675855578744008 -4.3613020955135848 2.1328584881223143 1.1958088063371186 -4.3613020955135848 1.7290234283603989 1.729023428369223 -4.3613020955135848 1.195808806326234 2.1328584881284174 -4.3613020955135848 0.59675855577533887 2.3712703890062268 -4.3613020955135848 -1.247890572435802e-11 2.4452083820543411 -4.3613020955135848 -0.59675855579954218 2.3712703890001356 -4.3613020955135848 -1.1958088063480035 2.132858488116212 -4.3613020955135848 -1.7290234283780472 1.7290234283515753 -4.3613020955135848 -2.1328584881345196 1.1958088063153496 -4.3613020955135848 -2.3712703890092723 0.59675855576323733 -4.3613020955135848 -2.4452083820543411 -2.495781144871604e-11 -4.3613020955135848 -2.3712703889970905 -0.59675855581164283 -4.3613020955135848 -2.1328584881101085 -1.195808806358889 -4.3613020955135848 -1.7290234283427512 -1.7290234283868706 -4.3613020955135848 -1.1958088063044647 -2.1328584881406223 -4.3613020955135848 -0.5967585557511349 -2.3712703890123179 -4.3613020955135848 3.7436717173074063e-11 -2.4452083820543411 -4.3613020955135848 0.59675855582374437 -2.3712703889940445 -4.3613020955135848 1.1958088063697738 -2.1328584881040058 -4.3613020955135848 1.7290234283956949 -1.7290234283339272 -4.3613020955135848 2.132858488146725 -1.1958088062935797 -4.3613020955135848 2.3712703890153635 -0.59675855573903336 -4.3613020955135848 2.4452083820543411 4.991562289743208e-11 -4.3613020955135848 3.5355339059327378 0 -3.5355339059327378 3.4286267468997842 0.86285493012638437 -3.5355339059327382 3.0839062865380349 1.7290234283696646 -3.5355339059327378 2.4999999999936211 2.5000000000063798 -3.5355339059327382 1.7290234283539263 3.0839062865468589 -3.5355339059327378 0.86285493010888692 3.4286267469041869 -3.5355339059327373 -1.8043286053329675e-11 3.5355339059327378 -3.5355339059327378 -0.86285493014388237 3.4286267468953802 -3.5355339059327373 -1.7290234283854029 3.0839062865292113 -3.5355339059327378 -2.500000000019138 2.4999999999808629 -3.5355339059327382 -3.0839062865556826 1.7290234283381889 -3.5355339059327378 -3.4286267469085905 0.86285493009138947 -3.5355339059327373 -3.5355339059327378 -3.608657210665935e-11 -3.5355339059327378 -3.4286267468909766 -0.86285493016137893 -3.5355339059327373 -3.0839062865203868 -1.7290234284011423 -3.5355339059327378 -2.4999999999681042 -2.5000000000318967 -3.5355339059327382 -1.7290234283224504 -3.0839062865645066 -3.5355339059327378 -0.86285493007389047 -3.4286267469129945 -3.5355339059327373 5.4129858159989035e-11 -3.5355339059327378 -3.5355339059327378 0.8628549301788766 -3.428626746886573 -3.5355339059327373 1.7290234284168811 -3.0839062865115627 -3.5355339059327378 2.5000000000446554 -2.4999999999553455 -3.5355339059327382 3.0839062865733302 -1.7290234283067119 -3.5355339059327378 3.4286267469173981 -0.8628549300563928 -3.5355339059327373 3.5355339059327378 7.21731442133187e-11 -3.5355339059327378 4.3613020955135848 0 -2.4452083820543411 4.2294254315864093 1.0643854973557765 -2.4452083820543411 3.8041911936628807 2.1328584881301835 -2.4452083820543407 3.0839062865328861 3.0839062865486255 -2.4452083820543411 2.1328584881107697 3.8041911936737662 -2.4452083820543411 1.0643854973341926 4.2294254315918414 -2.4452083820543411 -2.2257521315886608e-11 4.3613020955135848 -2.4452083820543411 -1.0643854973773614 4.2294254315809772 -2.4452083820543411 -2.1328584881495978 3.8041911936519965 -2.4452083820543411 -3.0839062865643636 3.0839062865171485 -2.4452083820543411 -3.8041911936846504 2.1328584880913559 -2.4452083820543411 -4.2294254315972735 1.0643854973126081 -2.4452083820543411 -4.3613020955135848 -4.4515042631773215e-11 -2.4452083820543411 -4.229425431575546 -1.0643854973989446 -2.4452083820543411 -3.804191193641111 -2.1328584881690134 -2.4452083820543411 -3.08390628650141 -3.0839062865801021 -2.4452083820543411 -2.1328584880719417 -3.8041911936955355 -2.4452083820543411 -1.0643854972910221 -4.2294254316027056 -2.4452083820543411 6.6772563947659836e-11 -4.3613020955135848 -2.4452083820543411 1.0643854974205291 -4.2294254315701139 -2.4452083820543411 2.1328584881884276 -3.804191193630226 -2.4452083820543411 3.0839062865958407 -3.0839062864856714 -2.4452083820543411 3.8041911937064201 -2.1328584880525274 -2.4452083820543411 4.2294254316081377 -1.0643854972694375 -2.4452083820543411 4.3613020955135848 8.9030085263546431e-11 -2.4452083820543411 4.8488104457816732 0 -1.2202611445418285 4.7021925478234659 1.1833629968504744 -1.2202611445418285 4.2294254315834232 2.3712703890102556 -1.2202611445418285 3.4286267468916387 3.4286267469091372 -1.2202611445418288 2.371270388988671 4.2294254315955246 -1.2202611445418285 1.1833629968264778 4.7021925478295046 -1.2202611445418285 -2.4745477265768341e-11 4.8488104457816732 -1.2202611445418285 -1.1833629968744723 4.7021925478174262 -1.2202611445418285 -2.3712703890318396 4.2294254315713218 -1.2202611445418285 -3.4286267469266343 3.4286267468741412 -1.2202611445418288 -4.2294254316076252 2.371270388967087 -1.2202611445418285 -4.7021925478355433 1.1833629968024804 -1.2202611445418285 -4.8488104457816732 -4.9490954531536681e-11 -1.2202611445418285 -4.7021925478113875 -1.1833629968984678 -1.2202611445418288 -4.2294254315592186 -2.371270389053425 -1.2202611445418285 -3.4286267468566436 -3.4286267469441318 -1.2202611445418288 -2.3712703889455029 -4.2294254316197266 -1.2202611445418285 -1.1833629967784818 -4.7021925478415829 -1.2202611445418288 7.4236431797305015e-11 -4.8488104457816732 -1.2202611445418285 1.183362996922465 -4.7021925478053488 -1.2202611445418288 2.3712703890750095 -4.2294254315471171 -1.2202611445418285 3.4286267469616298 -3.428626746839146 -1.2202611445418288 4.229425431631828 -2.3712703889239184 -1.2202611445418285 4.7021925478476225 -1.1833629967544845 -1.2202611445418288 4.8488104457816732 9.8981909063073362e-11 -1.2202611445418285 5 0 0 4.8488104457808188 1.2202611445452218 0 4.3613020955097372 2.4452083820612049 0 3.5355339059237165 3.5355339059417599 0 2.4452083820389481 4.3613020955222161 0 1.220261144520477 4.8488104457870458 0 -2.5517059846396142e-11 5 0 -1.220261144569968 4.8488104457745909 0 -2.4452083820834623 4.3613020954972583 0 -3.5355339059598028 3.5355339059056727 0 -4.3613020955346942 2.4452083820166917 0 -4.8488104457932737 1.2202611444957316 0 -5 -5.1034119692792285e-11 0 -4.8488104457683647 -1.2202611445947118 0 -4.3613020954847785 -2.4452083821057218 0 -3.5355339058876298 -3.5355339059778461 0 -2.4452083819944339 -4.3613020955471731 0 -1.2202611444709843 -4.8488104457995016 0 7.6551179539188427e-11 -5 0 1.2202611446194571 -4.8488104457621359 0 2.4452083821279791 -4.3613020954722996 0 3.5355339059958895 -3.5355339058695865 0 4.361302095559652 -2.4452083819721766 0 4.8488104458057295 -1.2202611444462388 0 5 1.0206823938558457e-10 0 4.8488104457816732 0 1.2202611445418285 4.7021925478234659 1.1833629968504744 1.2202611445418285 4.2294254315834232 2.3712703890102556 1.2202611445418285 3.4286267468916387 3.4286267469091372 1.2202611445418288 2.371270388988671 4.2294254315955246 1.2202611445418285 1.1833629968264778 4.7021925478295046 1.2202611445418285 -2.4745477265768341e-11 4.8488104457816732 1.2202611445418285 -1.1833629968744723 4.7021925478174262 1.2202611445418285 -2.3712703890318396 4.2294254315713218 1.2202611445418285 -3.4286267469266343 3.4286267468741412 1.2202611445418288 -4.2294254316076252 2.371270388967087 1.2202611445418285 -4.7021925478355433 1.1833629968024804 1.2202611445418285 -4.8488104457816732 -4.9490954531536681e-11 1.2202611445418285 -4.7021925478113875 -1.1833629968984678 1.2202611445418288 -4.2294254315592186 -2.371270389053425 1.2202611445418285 -3.4286267468566436 -3.4286267469441318 1.2202611445418288 -2.3712703889455029 -4.2294254316197266 1.2202611445418285 -1.1833629967784818 -4.7021925478415829 1.2202611445418288 7.4236431797305015e-11 -4.8488104457816732 1.2202611445418285 1.183362996922465 -4.7021925478053488 1.2202611445418288 2.3712703890750095 -4.2294254315471171 1.2202611445418285 3.4286267469616298 -3.428626746839146 1.2202611445418288 4.229425431631828 -2.3712703889239184 1.2202611445418285 4.7021925478476225 -1.1833629967544845 1.2202611445418288 4.8488104457816732 9.8981909063073362e-11 1.2202611445418285 4.3613020955135848 0 2.4452083820543407 4.2294254315864093 1.0643854973557765 2.4452083820543407 3.8041911936628807 2.1328584881301835 2.4452083820543402 3.0839062865328861 3.0839062865486255 2.4452083820543407 2.1328584881107697 3.8041911936737662 2.4452083820543407 1.0643854973341926 4.2294254315918414 2.4452083820543407 -2.2257521315886611e-11 4.3613020955135848 2.4452083820543407 -1.0643854973773617 4.2294254315809772 2.4452083820543407 -2.1328584881495978 3.8041911936519974 2.4452083820543407 -3.0839062865643636 3.0839062865171485 2.4452083820543407 -3.8041911936846504 2.1328584880913564 2.4452083820543407 -4.2294254315972735 1.0643854973126083 2.4452083820543407 -4.3613020955135848 -4.4515042631773222e-11 2.4452083820543407 -4.229425431575546 -1.0643854973989446 2.4452083820543407 -3.804191193641111 -2.1328584881690134 2.4452083820543407 -3.08390628650141 -3.0839062865801021 2.4452083820543407 -2.1328584880719417 -3.8041911936955355 2.4452083820543407 -1.0643854972910221 -4.2294254316027056 2.4452083820543407 6.6772563947659836e-11 -4.3613020955135848 2.4452083820543407 1.0643854974205293 -4.2294254315701139 2.4452083820543407 2.132858488188428 -3.804191193630226 2.4452083820543407 3.0839062865958411 -3.0839062864856714 2.4452083820543407 3.8041911937064206 -2.1328584880525274 2.4452083820543407 4.2294254316081377 -1.0643854972694375 2.4452083820543407 4.3613020955135848 8.9030085263546444e-11 2.4452083820543407 3.5355339059327378 0 3.5355339059327378 3.4286267468997842 0.86285493012638437 3.5355339059327382 3.0839062865380349 1.7290234283696646 3.5355339059327378 2.4999999999936211 2.5000000000063798 3.5355339059327382 1.7290234283539263 3.0839062865468589 3.5355339059327378 0.86285493010888692 3.4286267469041869 3.5355339059327373 -1.8043286053329675e-11 3.5355339059327378 3.5355339059327378 -0.86285493014388237 3.4286267468953802 3.5355339059327373 -1.7290234283854029 3.0839062865292113 3.5355339059327378 -2.500000000019138 2.4999999999808629 3.5355339059327382 -3.0839062865556826 1.7290234283381889 3.5355339059327378 -3.4286267469085905 0.86285493009138947 3.5355339059327373 -3.5355339059327378 -3.608657210665935e-11 3.5355339059327378 -3.4286267468909766 -0.86285493016137893 3.5355339059327373 -3.0839062865203868 -1.7290234284011423 3.5355339059327378 -2.4999999999681042 -2.5000000000318967 3.5355339059327382 -1.7290234283224504 -3.0839062865645066 3.5355339059327378 -0.86285493007389047 -3.4286267469129945 3.5355339059327373 5.4129858159989035e-11 -3.5355339059327378 3.5355339059327378 0.8628549301788766 -3.428626746886573 3.5355339059327373 1.7290234284168811 -3.0839062865115627 3.5355339059327378 2.5000000000446554 -2.4999999999553455 3.5355339059327382 3.0839062865733302 -1.7290234283067119 3.5355339059327378 3.4286267469173981 -0.8628549300563928 3.5355339059327373 3.5355339059327378 7.21731442133187e-11 3.5355339059327378 2.4452083820543424 0 4.3613020955135839 2.3712703890031825 0.5967585557874403 4.3613020955135848 2.1328584881223156 1.1958088063371191 4.3613020955135848 1.7290234283603998 1.7290234283692238 4.3613020955135848 1.1958088063262344 2.1328584881284183 4.3613020955135848 0.59675855577533909 2.3712703890062277 4.3613020955135848 -1.2478905724358026e-11 2.4452083820543424 4.3613020955135839 -0.59675855579954229 2.371270389000137 4.3613020955135848 -1.1958088063480039 2.1328584881162134 4.3613020955135848 -1.7290234283780477 1.7290234283515762 4.3613020955135848 -2.1328584881345209 1.1958088063153502 4.3613020955135848 -2.3712703890092732 0.59675855576323766 4.3613020955135848 -2.4452083820543424 -2.4957811448716053e-11 4.3613020955135839 -2.3712703889970914 -0.59675855581164305 4.3613020955135848 -2.1328584881101098 -1.1958088063588894 4.3613020955135848 -1.7290234283427519 -1.7290234283868715 4.3613020955135848 -1.1958088063044652 -2.1328584881406232 4.3613020955135848 -0.59675855575113512 -2.3712703890123188 4.3613020955135848 3.7436717173074082e-11 -2.4452083820543424 4.3613020955135839 0.59675855582374471 -2.3712703889940463 4.3613020955135848 1.1958088063697743 -2.1328584881040071 4.3613020955135848 1.7290234283956958 -1.7290234283339281 4.3613020955135848 2.1328584881467259 -1.1958088062935806 4.3613020955135848 2.3712703890153644 -0.59675855573903369 4.3613020955135848 2.4452083820543424 4.9915622897432106e-11 4.3613020955135839 1.2202611445418288 0 4.8488104457816723 1.1833629968469757 0.29780745217653498 4.8488104457816723 1.0643854973518778 0.59675855578745607 4.8488104457816732 0.86285493012178338 0.86285493012618697 4.8488104457816723 0.59675855578202408 1.0643854973549232 4.8488104457816732 0.29780745217049587 1.1833629968484953 4.8488104457816723 -6.2274953307011396e-12 1.2202611445418288 4.8488104457816723 -0.29780745218257426 1.1833629968454558 4.8488104457816723 -0.59675855579288795 1.0643854973488323 4.8488104457816732 -0.86285493013059045 0.8628549301173799 4.8488104457816723 -1.0643854973579685 0.59675855577659231 4.8488104457816723 -1.1833629968500152 0.29780745216445675 4.8488104457816723 -1.2202611445418288 -1.2454990661402279e-11 4.8488104457816723 -1.1833629968439359 -0.29780745218861304 4.8488104457816732 -1.0643854973457867 -0.59675855579832027 4.8488104457816723 -0.86285493011297643 -0.86285493013499392 4.8488104457816723 -0.59675855577116033 -1.0643854973610141 4.8488104457816723 -0.29780745215841709 -1.1833629968515351 4.8488104457816732 1.8682485992103421e-11 -1.2202611445418288 4.8488104457816723 0.29780745219465232 -1.183362996842416 4.8488104457816732 0.59675855580375237 -1.0643854973427409 4.8488104457816723 0.86285493013939751 -0.86285493010857284 4.8488104457816723 1.0643854973640596 -0.59675855576572834 4.8488104457816723 1.183362996853055 -0.29780745215237792 4.8488104457816732 1.2202611445418288 2.4909981322804558e-11 4.8488104457816723 3.0615158845559431e-16 0 5 2.9689420401917523e-16 7.4716977546632254e-17 4.9999999999999991 2.6704391285500361e-16 1.4972088605459433e-16 5 2.164818642674315e-16 2.164818642685363e-16 5 1.4972088605323152e-16 2.6704391285576767e-16 5 7.4716977545117111e-17 2.9689420401955654e-16 5 -1.5624176809381285e-27 3.0615158845559431e-16 5 -7.4716977548147458e-17 2.9689420401879386e-16 5 -1.4972088605595716e-16 2.670439128542396e-16 5 -2.1648186426964107e-16 2.1648186426632672e-16 5 -2.6704391285653173e-16 1.4972088605186874e-16 5.0000000000000009 -2.9689420401993781e-16 7.4716977543601943e-17 5 -3.0615158845559431e-16 -3.124835361876257e-27 5 -2.968942040184126e-16 -7.4716977549662527e-17 5 -2.6704391285347544e-16 -1.4972088605732009e-16 5.0000000000000009 -2.1648186426522192e-16 -2.164818642707459e-16 5 -1.4972088605050591e-16 -2.6704391285729589e-16 5.0000000000000009 -7.4716977542086652e-17 -2.9689420402031917e-16 5 4.6872530428143855e-27 -3.0615158845559431e-16 5 7.4716977551177707e-17 -2.9689420401803128e-16 5 1.4972088605868295e-16 -2.6704391285271133e-16 5.0000000000000009 2.1648186427185067e-16 -2.164818642641171e-16 5 2.6704391285805995e-16 -1.4972088604914305e-16 5.0000000000000009 2.9689420402070049e-16 -7.4716977540571485e-17 5 3.0615158845559431e-16 6.249670723752514e-27 5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 26 25 1 2 27 26 2 3 28 27 3 4 29 28 4 5 30 29 5 6 31 30 6 7 32 31 7 8 33 32 8 9 34 33 9 10 35 34 10 11 36 35 11 12 37 36 12 13 38 37 13 14 39 38 14 15 40 39 15 16 41 40 16 17 42 41 17 18 43 42 18 19 44 43 19 20 45 44 20 21 46 45 21 22 47 46 22 23 48 47 23 24 49 48 25 26 51 50 26 27 52 51 27 28 53 52 28 29 54 53 29 30 55 54 30 31 56 55 31 32 57 56 32 33 58 57 33 34 59 58 34 35 60 59 35 36 61 60 36 37 62 61 37 38 63 62 38 39 64 63 39 40 65 64 40 41 66 65 41 42 67 66 42 43 68 67 43 44 69 68 44 45 70 69 45 46 71 70 46 47 72 71 47 48 73 72 48 49 74 73 50 51 76 75 51 52 77 76 52 53 78 77 53 54 79 78 54 55 80 79 55 56 81 80 56 57 82 81 57 58 83 82 58 59 84 83 59 60 85 84 60 61 86 85 61 62 87 86 62 63 88 87 63 64 89 88 64 65 90 89 65 66 91 90 66 67 92 91 67 68 93 92 68 69 94 93 69 70 95 94 70 71 96 95 71 72 97 96 72 73 98 97 73 74 99 98 75 76 101 100 76 77 102 101 77 78 103 102 78 79 104 103 79 80 105 104 80 81 106 105 81 82 107 106 82 83 108 107 83 84 109 108 84 85 110 109 85 86 111 110 86 87 112 111 87 88 113 112 88 89 114 113 89 90 115 114 90 91 116 115 91 92 117 116 92 93 118 117 93 94 119 118 94 95 120 119 95 96 121 120 96 97 122 121 97 98 123 122 98 99 124 123 100 101 126 125 101 102 127 126 102 103 128 127 103 104 129 128 104 105 130 129 105 106 131 130 106 107 132 131 107 108 133 132 108 109 134 133 109 110 135 134 110 111 136 135 111 112 137 136 112 113 138 137 113 114 139 138 114 115 140 139 115 116 141 140 116 117 142 141 117 118 143 142 118 119 144 143 119 120 145 144 120 121 146 145 121 122 147 146 122 123 148 147 123 124 149 148 125 126 151 150 126 127 152 151 127 128 153 152 128 129 154 153 129 130 155 154 130 131 156 155 131 132 157 156 132 133 158 157 133 134 159 158 134 135 160 159 135 136 161 160 136 137 162 161 137 138 163 162 138 139 164 163 139 140 165 164 140 141 166 165 141 142 167 166 142 143 168 167 143 144 169 168 144 145 170 169 145 146 171 170 146 147 172 171 147 148 173 172 148 149 174 173 150 151 176 175 151 152 177 176 152 153 178 177 153 154 179 178 154 155 180 179 155 156 181 180 156 157 182 181 157 158 183 182 158 159 184 183 159 160 185 184 160 161 186 185 161 162 187 186 162 163 188 187 163 164 189 188 164 165 190 189 165 166 191 190 166 167 192 191 167 168 193 192 168 169 194 193 169 170 195 194 170 171 196 195 171 172 197 196 172 173 198 197 173 174 199 198 175 176 201 200 176 177 202 201 177 178 203 202 178 179 204 203 179 180 205 204 180 181 206 205 181 182 207 206 182 183 208 207 183 184 209 208 184 185 210 209 185 186 211 210 186 187 212 211 187 188 213 212 188 189 214 213 189 190 215 214 190 191 216 215 191 192 217 216 192 193 218 217 193 194 219 218 194 195 220 219 195 196 221 220 196 197 222 221 197 198 223 222 198 199 224 223 200 201 226 225 201 202 227 226 202 203 228 227 203 204 229 228 204 205 230 229 205 206 231 230 206 207 232 231 207 208 233 232 208 209 234 233 209 210 235 234 210 211 236 235 211 212 237 236 212 213 238 237 213 214 239 238 214 215 240 239 215 216 241 240 216 217 242 241 217 218 243 242 218 219 244 243 219 220 245 244 220 221 246 245 221 222 247 246 222 223 248 247 223 224 249 248 225 226 251 250 226 227 252 251 227 228 253 252 228 229 254 253 229 230 255 254 230 231 256 255 231 232 257 256 232 233 258 257 233 234 259 258 234 235 260 259 235 236 261 260 236 237 262 261 237 238 263 262 238 239 264 263 239 240 265 264 240 241 266 265 241 242 267 266 242 243 268 267 243 244 269 268 244 245 270 269 245 246 271 270 246 247 272 271 247 248 273 272 248 249 274 273 250 251 276 275 251 252 277 276 252 253 278 277 253 254 279 278 254 255 280 279 255 256 281 280 256 257 282 281 257 258 283 282 258 259 284 283 259 260 285 284 260 261 286 285 261 262 287 286 262 263 288 287 263 264 289 288 264 265 290 289 265 266 291 290 266 267 292 291 267 268 293 292 268 269 294 293 269 270 295 294 270 271 296 295 271 272 297 296 272 273 298 297 273 274 299 298 275 276 301 300 276 277 302 301 277 278 303 302 278 279 304 303 279 280 305 304 280 281 306 305 281 282 307 306 282 283 308 307 283 284 309 308 284 285 310 309 285 286 311 310 286 287 312 311 287 288 313 312 288 289 314 313 289 290 315 314 290 291 316 315 291 292 317 316 292 293 318 317 293 294 319 318 294 295 320 319 295 296 321 320 296 297 322 321 297 298 323 322 298 299 324 323\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsRevolveCurve.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 2.0710678118654746 0 3.5355339059327378 3.5355339059327373 0 2.0710678118654746 5 0 3.0616169978683831e-16 5 0 -2.0710678118654746 5 0 -3.5355339059327373 3.5355339059327378 0 -5 2.0710678118654751 0 -5 6.1232339957367663e-16 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 2.0710678118654746 5 0.41196100146196968 2.0710678118654746 5 0.79256333890553587 1.9134171618254483 5 1.1731656763491018 1.755766511785422 5 1.4644660940672618 1.464466094067262 5 1.755766511785422 1.1731656763491018 5 1.9134171618254483 0.79256333890553599 5 2.0710678118654746 0.41196100146196996 5 2.0710678118654746 1.268163283309083e-16 3.5355339059327378 0 3.5355339059327373 3.5355339059327378 0.70326141918012974 3.5355339059327373 3.5355339059327378 1.3529902503654925 3.266407412190941 3.5355339059327378 2.0027190815508544 2.9972809184491447 3.5355339059327378 2.4999999999999996 2.5 3.5355339059327378 2.9972809184491447 2.0027190815508544 3.5355339059327378 3.266407412190941 1.3529902503654925 3.5355339059327378 3.5355339059327373 0.7032614191801303 3.5355339059327378 3.5355339059327373 2.1648901405887331e-16 2.0710678118654746 0 5 2.0710678118654746 0.99456183689828992 5 2.0710678118654746 1.913417161825449 4.6193976625564339 2.0710678118654746 2.8322724867526072 4.2387953251128678 2.0710678118654746 3.5355339059327373 3.5355339059327378 2.0710678118654746 4.2387953251128678 2.8322724867526072 2.0710678118654746 4.6193976625564339 1.9134171618254492 2.0710678118654746 5 0.99456183689829059 2.0710678118654746 5 3.0616169978683831e-16 3.0616169978683831e-16 0 5 3.0616169978683831e-16 0.99456183689828992 5 3.0616169978683831e-16 1.913417161825449 4.6193976625564339 3.0616169978683831e-16 2.8322724867526072 4.2387953251128678 3.0616169978683831e-16 3.5355339059327373 3.5355339059327378 3.0616169978683831e-16 4.2387953251128678 2.8322724867526072 3.0616169978683831e-16 4.6193976625564339 1.9134171618254492 3.0616169978683831e-16 5 0.99456183689829059 3.0616169978683831e-16 5 3.0616169978683831e-16 -2.0710678118654746 0 5 -2.0710678118654746 0.99456183689828992 5 -2.0710678118654746 1.913417161825449 4.6193976625564339 -2.0710678118654746 2.8322724867526072 4.2387953251128678 -2.0710678118654746 3.5355339059327373 3.5355339059327378 -2.0710678118654746 4.2387953251128678 2.8322724867526072 -2.0710678118654746 4.6193976625564339 1.9134171618254492 -2.0710678118654746 5 0.99456183689829059 -2.0710678118654746 5 3.0616169978683831e-16 -3.5355339059327373 0 3.5355339059327378 -3.5355339059327373 0.70326141918012985 3.5355339059327378 -3.5355339059327373 1.3529902503654925 3.2664074121909414 -3.5355339059327373 2.0027190815508549 2.9972809184491451 -3.5355339059327373 2.5 2.5000000000000004 -3.5355339059327373 2.9972809184491451 2.0027190815508549 -3.5355339059327373 3.2664074121909414 1.3529902503654927 -3.5355339059327373 3.5355339059327378 0.70326141918013041 -3.5355339059327373 3.5355339059327378 2.1648901405887333e-16 -5 0 2.0710678118654751 -5 0.41196100146196973 2.0710678118654751 -5 0.79256333890553599 1.9134171618254487 -5 1.1731656763491021 1.7557665117854222 -5 1.464466094067262 1.4644660940672622 -5 1.7557665117854222 1.1731656763491021 -5 1.9134171618254487 0.7925633389055361 -5 2.0710678118654751 0.41196100146197001 -5 2.0710678118654751 1.2681632833090833e-16 -5 0 6.1232339957367663e-16 -5 1.2179869701116027e-16 6.1232339957367663e-16 -5 2.3432602026631494e-16 5.657130561438502e-16 -5 3.4685334352146951e-16 5.1910271271402378e-16 -5 4.3297802811774662e-16 4.3297802811774672e-16 -5 5.1910271271402378e-16 3.4685334352146951e-16 -5 5.657130561438502e-16 2.3432602026631494e-16 -5 6.1232339957367663e-16 1.2179869701116037e-16 -5 6.1232339957367663e-16 3.7493994566546446e-32</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsRevolveCurve.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 2.0710678118654746 0 3.5355339059327378 3.5355339059327373 0 2.0710678118654755 5 0 3.0615158845559431e-16 5 0 -2.0710678118654746 5 0 -3.5355339059327373 3.5355339059327378 0 -5 2.0710678118654755 0 -5 6.1230317691118863e-16 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 2.0710678118654746 5 0.41196100146196968 2.0710678118654746 5 0.79256333890553587 1.9134171618254483 5 1.1731656763491021 1.755766511785422 5 1.4644660940672618 1.464466094067262 5 1.755766511785422 1.1731656763491021 5 1.9134171618254483 0.79256333890553599 5 2.0710678118654746 0.41196100146196996 5 2.0710678118654746 1.2681214008037341e-16 3.5355339059327378 0 3.5355339059327373 3.5355339059327378 0.70326141918012974 3.5355339059327373 3.5355339059327378 1.3529902503654925 3.266407412190941 3.5355339059327378 2.0027190815508549 2.9972809184491447 3.5355339059327378 2.4999999999999996 2.5 3.5355339059327378 2.9972809184491447 2.0027190815508549 3.5355339059327378 3.266407412190941 1.3529902503654925 3.5355339059327378 3.5355339059327373 0.7032614191801303 3.5355339059327378 3.5355339059327373 2.1648186426798385e-16 2.0710678118654755 0 5 2.0710678118654755 0.99456183689828992 5 2.0710678118654755 1.913417161825449 4.6193976625564339 2.0710678118654755 2.8322724867526077 4.2387953251128678 2.0710678118654755 3.5355339059327373 3.5355339059327378 2.0710678118654755 4.2387953251128678 2.8322724867526077 2.0710678118654755 4.6193976625564339 1.9134171618254492 2.0710678118654755 5 0.99456183689829059 2.0710678118654755 5 3.0615158845559431e-16 3.0615158845559431e-16 0 5 3.0615158845559431e-16 0.99456183689828992 5 3.0615158845559431e-16 1.913417161825449 4.6193976625564339 3.0615158845559431e-16 2.8322724867526077 4.2387953251128678 3.0615158845559431e-16 3.5355339059327373 3.5355339059327378 3.0615158845559431e-16 4.2387953251128678 2.8322724867526077 3.0615158845559431e-16 4.6193976625564339 1.9134171618254492 3.0615158845559431e-16 5 0.99456183689829059 3.0615158845559431e-16 5 3.0615158845559431e-16 -2.0710678118654746 0 5 -2.0710678118654746 0.99456183689828992 5 -2.0710678118654746 1.913417161825449 4.6193976625564339 -2.0710678118654746 2.8322724867526077 4.2387953251128678 -2.0710678118654746 3.5355339059327373 3.5355339059327378 -2.0710678118654746 4.2387953251128678 2.8322724867526077 -2.0710678118654746 4.6193976625564339 1.9134171618254492 -2.0710678118654746 5 0.99456183689829059 -2.0710678118654746 5 3.0615158845559431e-16 -3.5355339059327373 0 3.5355339059327378 -3.5355339059327373 0.70326141918012985 3.5355339059327378 -3.5355339059327373 1.3529902503654925 3.2664074121909414 -3.5355339059327373 2.0027190815508553 2.9972809184491451 -3.5355339059327373 2.5 2.5000000000000004 -3.5355339059327373 2.9972809184491451 2.0027190815508553 -3.5355339059327373 3.2664074121909414 1.3529902503654927 -3.5355339059327373 3.5355339059327378 0.70326141918013041 -3.5355339059327373 3.5355339059327378 2.164818642679839e-16 -5 0 2.0710678118654755 -5 0.41196100146196984 2.0710678118654755 -5 0.79256333890553621 1.913417161825449 -5 1.1731656763491025 1.7557665117854226 -5 1.4644660940672625 1.4644660940672627 -5 1.7557665117854226 1.1731656763491025 -5 1.913417161825449 0.79256333890553632 -5 2.0710678118654755 0.41196100146197012 -5 2.0710678118654755 1.2681214008037346e-16 -5 0 6.1230317691118863e-16 -5 1.2179467447349007e-16 6.1230317691118863e-16 -5 2.3431828138842245e-16 5.6569437283988469e-16 -5 3.4684188830335483e-16 5.1908556876858066e-16 -5 4.329637285359677e-16 4.329637285359678e-16 -5 5.1908556876858066e-16 3.4684188830335483e-16 -5 5.6569437283988469e-16 2.343182813884225e-16 -5 6.1230317691118863e-16 1.2179467447349015e-16 -5 6.1230317691118863e-16 3.7491518045553436e-32</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 0.90612744635288778 0.92387953251128674 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1 0.98078528040323043 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsRuledSurface.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 0 1 0 0 2 0 0 3 0 0 3.0615158845559431e-16 0 -5 3.0615158845559431e-16 5.0000000000255174 -5 -1.5624176809381285e-27 5 2.5517059846396142e-11 -3.0615158845871914e-16 4.9999999999744826 5.0000000000510338 -3.0615158845559431e-16 -5.1034119692792285e-11 5 -3.0615158845246949e-16 -5.0000000000765512 4.9999999999489662 4.6872530428143855e-27 -5 -7.6551179539188427e-11 3.0615158846184402e-16 -4.9999999999234488 -5.0000000001020686 3.0615158845559431e-16 1.0206823938558457e-10 -5 0 0 0 3.0615158845559431e-16 0 -5 0.5 0 0 3.0615158845559431e-16 5.0000000000255174 -5 0.875 0 0 -1.5624176809381285e-27 5 2.5517059846396142e-11 1.25 0 0 -3.0615158845871914e-16 4.9999999999744826 5.0000000000510338 1.5 0 0 -3.0615158845559431e-16 -5.1034119692792285e-11 5 1.75 0 0 -3.0615158845246949e-16 -5.0000000000765512 4.9999999999489662 2.125 0 0 4.6872530428143855e-27 -5 -7.6551179539188427e-11 2.5 0 0 3.0615158846184402e-16 -4.9999999999234488 -5.0000000001020686 3 0 0 3.0615158845559431e-16 1.0206823938558457e-10 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 0.70710678118474324 1 1 1 0.70710678118474324 1 1 1 0.70710678118474324 1 1 1 0.70710678118474324 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsSetWeight1.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119672569625e-11 -0 -4.9999999999489653 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsSetWeight1.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119692792285e-11 -0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsSetWeight2.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 -5 5 5.0000000000255174 -5 -2.5517059836284813e-11 5 -5 -5.0000000000510338 4.9999999999744817 -5 -5 -5.1034119672569625e-11 -5 -4.9999999999489662 -5.0000000000765512 -5 7.6551179508854434e-11 -5 -5 5.0000000001020686 -4.9999999999234488 -5 5 1.0206823934513925e-10 -5 5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119672569625e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0 5 0 5 5 5.0000000000255174 5 -2.5517059836284813e-11 5 5 -5.0000000000510338 4.9999999999744817 5 -5 -5.1034119672569625e-11 5 -4.9999999999489662 -5.0000000000765512 5 7.6551179508854434e-11 -5 5 5.0000000001020686 -4.9999999999234488 5 5 1.0206823934513925e-10 5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsSetWeight2.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 -5 5 5.0000000000255174 -5 -2.5517059846396142e-11 5 -5 -5.0000000000510338 4.9999999999744817 -5 -5 -5.1034119692792285e-11 -5 -4.9999999999489662 -5.0000000000765512 -5 7.6551179539188427e-11 -5 -5 5.0000000001020686 -4.9999999999234488 -5 5 1.0206823938558457e-10 -5 5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119692792285e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0 5 0 5 5 5.0000000000255174 5 -2.5517059846396142e-11 5 5 -5.0000000000510338 4.9999999999744817 5 -5 -5.1034119692792285e-11 5 -4.9999999999489662 -5.0000000000765512 5 7.6551179539188427e-11 -5 5 5.0000000001020686 -4.9999999999234488 5 5 1.0206823938558457e-10 5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsSkinnedSurface.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 0 1 0 0 2 0 0 3 0 0 0 3 0 1 3 0 2 3 0 3 3 0 0 0 3 1 0 3 2 0 3 3 0 3</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0.5 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsSplitCurve.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 0 1 0 0 1.5 0 0 1.5 0 0 2 0 0 3 0 0</points>\n\t\t<point_selection>0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 1 1 2 3</array>\n\t\t\t<array name=\"points\" type=\"k3d::point3\">0 0 0 1 0 0 1.5 0 0 1.5 0 0 2 0 0 3 0 0</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0 6</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0 3</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3 3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">3 3</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 0.5 0.5 0.5 0.5 0.5 0.5 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point3\">0 0 0 1.5 0 0 1.5 0 0 3 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 1 1 2 3</array>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point3\">0 0 0 1 0 0 1.5 0 0 1.5 0 0 2 0 0 3 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsSplitPatch1.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 5 0 -3.1099999999999999 5 0 -1.2200000000000004 5 0 0.66999999999999937 5 0 -5 1.6666666666666665 0 -3.1099999999999999 1.6666666666666665 0 -1.2200000000000004 1.6666666666666665 0 0.66999999999999937 1.6666666666666665 0 -5 -1.6666666666666665 0 -3.1099999999999999 -1.6666666666666665 0 -1.2200000000000004 -1.6666666666666665 0 0.66999999999999937 -1.6666666666666665 0 -5 -5 0 -3.1099999999999999 -5 0 -1.2200000000000004 -5 0 0.66999999999999937 -5 0 0.66999999999999937 5 0 2.1133333333333328 5 0 3.5566666666666666 5 0 5 5 0 0.66999999999999937 1.6666666666666665 0 2.1133333333333328 1.6666666666666665 0 3.5566666666666666 1.6666666666666665 0 5 1.6666666666666665 0 0.66999999999999937 -1.6666666666666665 0 2.1133333333333328 -1.6666666666666665 0 3.5566666666666666 -1.6666666666666665 0 5 -1.6666666666666665 0 0.66999999999999937 -5 0 2.1133333333333328 -5 0 3.5566666666666666 -5 0 5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 4 3 3 3 8 8 7 7 12 12 11 10 0 0 1 3 3 4 5 7 7 8 10 11 10 12 14 15</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0 16</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0 8</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4 4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4 4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0 8</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4 4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 0.56699999999999995 0.56699999999999995 0.56699999999999995 0.56699999999999995 0.56699999999999995 0.56699999999999995 0.56699999999999995 0.56699999999999995 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 0 0 4 3 3 3 8 8 7 7 12 12 11 10 0 0 1 3 3 4 5 7 7 8 10 11 10 12 14 15</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsSplitPatch2.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 5 0 -1.6666666666666665 5 0 1.6666666666666665 5 0 5 5 0 -5 4.5099999999999998 0 -1.6666666666666663 4.5099999999999998 0 1.6666666666666663 4.5099999999999998 0 5 4.5099999999999998 0 -5 4.0199999999999996 0 -1.6666666666666663 4.0199999999999996 0 1.6666666666666663 4.0199999999999996 0 5 4.0199999999999996 0 -5 3.5299999999999998 0 -1.6666666666666663 3.5299999999999998 0 1.6666666666666663 3.5299999999999998 0 5 3.5299999999999998 0 -5 3.5299999999999998 0 -1.6666666666666663 3.5299999999999998 0 1.6666666666666663 3.5299999999999998 0 5 3.5299999999999998 0 -5 0.68666666666666654 0 -1.6666666666666663 0.68666666666666654 0 1.6666666666666663 0.68666666666666654 0 5 0.68666666666666654 0 -5 -2.1566666666666663 0 -1.6666666666666663 -2.1566666666666663 0 1.6666666666666663 -2.1566666666666663 0 5 -2.1566666666666663 0 -5 -5 0 -1.6666666666666665 -5 0 1.6666666666666665 -5 0 5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 0 0 1 3 0 0 0 2 0 0 0 1 0 0 0 1 4 5 6 6 7 8 10 11 12 13 14 15</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0 16</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0 8</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4 4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4 4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0 8</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4 4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 0.14699999999999999 0.14699999999999999 0.14699999999999999 0.14699999999999999 0.14699999999999999 0.14699999999999999 0.14699999999999999 0.14699999999999999 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 0 0 1 3 0 0 0 2 0 0 0 1 0 0 0 1 4 5 6 6 7 8 10 11 12 13 14 15</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.NurbsSweepSurface.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>6 4.1496987845188265e-16 -6.9451138533017739e-20 5.9994492371416683 1.4423151654140198 -0.0007025146618134118 5.3463024102301357 2.7234253037076601 -0.0013881616730078636 4.6905456341425262 4.0092029959350874 -0.0021030180706821848 3.5271794005299766 4.8537578623585214 -0.0027838369400198545 2.3591649434785751 5.7016855547735492 -0.0034990828330362291 0.9391791368561887 5.9260310587172613 -0.0041802744254817708 -0.4864795971069818 6.1512719769412394 -0.0048959101332717841 -1.8535447904583509 5.706503603215709 -0.0055774653191457023 6 5.5703319374551801e-16 1.0000000000051035 6.0001897937010629 1.4423233106097533 0.99929748719643285 5.3475396363147718 2.724054797032549 0.99861087483651678 4.6922954830002288 4.0104831726897716 0.99789502316663026 3.5288170054847146 4.8560090815093737 0.99721228818874963 2.360689360027842 5.704948285171799 0.99649504820996404 0.93983547326473205 5.9301594837456397 0.99581098820610314 -0.48671847825633086 6.1563029985469573 0.99509235795873341 -1.8552652411590609 5.7118090879978025 0.9944069805052983 4.9999999999948965 2.6539774880190083e-16 1.0000000000000002 5.0007405565542911 1.2004019405950794 1.0000000018531465 4.4562698470219209 2.2705819920203045 0.99999903650442801 3.9118150907373899 3.3407913787461481 0.9999980412322198 2.9405638664140934 4.0473361910214516 0.9999961251236803 1.9693116975883156 4.753921472147967 0.99999413103791523 0.78282866160889275 4.9425701279990086 0.99999126262650206 -0.40368151178766687 5.1312556857972549 0.99998826808692742 -1.5468054225738637 4.7605880662529794 0.99998444581936907 3.9999999999897939 3.9356544212574559e-16 0.99999999999489664 4.0012913194075157 0.95848057058040437 1.0007025165098604 3.5650000577290699 1.8171091870080609 1.0013871981723392 3.13133469847455 2.6710995848025232 1.0021010592978092 2.3523107273434714 3.2386633005335304 1.0027799620586111 1.5779340351487889 3.802894659124135 1.0034932138658657 0.62582184995305379 3.9549807722523767 1.0041715370469022 -0.32064454531900272 4.1062083730475534 1.0048841782151201 -1.2383456039886667 3.8093670445081567 1.00556191113344 4.0000000000000009 -3.3487585865085373e-17 -1.0206823841499792e-11 4.0005507628583219 0.95847242538714017 0.00070251465160658759 3.5637628316535315 1.8164796936878012 0.0013881616628010495 3.1295848496248135 2.6698194080546749 0.0021030180604753807 2.350673122394737 3.236412081390931 0.0027838369298130708 1.5764096186035166 3.799631928735594 0.0034990828228294657 0.62516551354611327 3.950852347234076 0.0041802744152750352 -0.32040566417050126 4.1011773514522956 0.0048959101230650814 -1.2366251532911052 3.8040615597357728 0.0055774653089390369 4.0000000000102061 1.6743792932542686e-17 -1.0000000000153104 3.9998102063091294 0.95846428019387508 -0.99929748720664702 3.5625256055779926 1.8158502003675416 -0.99861087484673738 3.1278350007750761 2.6685392313068261 -0.99789502317685852 2.3490355174460036 3.2341608622483315 -0.99721228819898466 1.5748852020582438 3.7963691983470542 -0.99649504822020718 0.62450917713917276 3.9467239222157744 -0.99581098821635206 -0.32016678302199963 4.0961463298570395 -0.99509235796899043 -1.2349047025935438 3.7987560749633893 -0.99440698051556187 5.0000000000153104 -1.0710848984167769e-16 -0.99999999999999978 4.9992594434559097 1.2003856502085495 -1.0000000018531539 4.4537953948708555 2.2693230053797921 -0.99999903650444211 3.9083153930379337 3.3382310252504626 -0.99999804123224101 2.9372886565166425 4.0428337527362768 -0.99999612512370872 1.966262864497786 4.7473960113709186 -0.99999413103795087 0.78151598879501838 4.934313277962449 -0.99999126262654492 -0.40320374949066617 5.1211936426067943 -0.99998826808697705 -1.5433645211787583 4.7499770967082657 -0.99998444581942603 6.0000000000204148 -2.3078815619391311e-16 -0.99999999998469002 5.9987086806026904 1.4423070202232238 -1.0007025164996608 5.3450651841637207 2.7227958103920433 -1.0013871981621469 4.6887957853007896 4.0079228191940999 -1.0021010592876241 3.525541795587281 4.851506643224222 -1.0027799620484326 2.357640526937328 5.6984228243947808 -1.0034932138556949 0.93852280045086423 5.9219026337091254 -1.0041715370367383 -0.48624071595933255 6.1462409553565474 -1.0048841782049638 -1.8518243397639729 5.7011981184531431 -1.0055619111232903 6 -2.257822799563488e-16 2.0413647780517747e-11 5.9994492371416817 1.4423151654140185 -0.00070251464139976338 5.3463024102301615 2.7234253037076748 -0.001388161652594236 4.6905456341425609 4.0092029959351123 -0.0021030180502685765 3.5271794005300108 4.8537578623585658 -0.0027838369196062861 2.3591649434786066 5.7016855547736185 -0.0034990828126227015 0.93917913685620202 5.9260310587173439 -0.0041802744050683013 -0.48647959710698657 6.1512719769413415 -0.004895910112858377 -1.8535447904583859 5.7065036032158174 -0.0055774652987323715</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.97236992039767678 1 0.97236992039767656 1.0000000000000002 0.97236992039767589 1.0000000000000002 0.97236992039767611 1 0.70710678118474324 0.68756936453326623 0.70710678118474324 0.68756936453326611 0.70710678118474335 0.68756936453326556 0.70710678118474335 0.68756936453326578 0.70710678118474324 1 0.97236992039767678 1 0.97236992039767656 1.0000000000000002 0.97236992039767589 1.0000000000000002 0.97236992039767611 1 0.70710678118474324 0.68756936453326623 0.70710678118474324 0.68756936453326611 0.70710678118474335 0.68756936453326556 0.70710678118474335 0.68756936453326578 0.70710678118474324 1 0.97236992039767678 1 0.97236992039767656 1.0000000000000002 0.97236992039767589 1.0000000000000002 0.97236992039767611 1 0.70710678118474324 0.68756936453326623 0.70710678118474324 0.68756936453326611 0.70710678118474335 0.68756936453326556 0.70710678118474335 0.68756936453326578 0.70710678118474324 1 0.97236992039767678 1 0.97236992039767656 1.0000000000000002 0.97236992039767589 1.0000000000000002 0.97236992039767611 1 0.70710678118474324 0.68756936453326623 0.70710678118474324 0.68756936453326611 0.70710678118474335 0.68756936453326556 0.70710678118474335 0.68756936453326578 0.70710678118474324 1 0.97236992039767678 1 0.97236992039767656 1.0000000000000002 0.97236992039767589 1.0000000000000002 0.97236992039767611 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.PGPRemesh.bun_zipper_res4.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays/>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.PGPRemesh.bunny.ply",
    "content": "ply\r\nformat ascii 1.0\r\ncomment modified by simplify:\r\ncomment simplify -c manifold,fold_angle_max=90 -t 10000 -i\r\ncomment bunny_filled_20K.ply -o bunny_filled_10K.ply\r\ncomment modified by smoothply\r\ncomment modified by boundply\r\ncomment modified by vizply\r\nelement vertex 20002\r\nproperty float32 x\r\nproperty float32 y\r\nproperty float32 z\r\nproperty int32 angle_deficit\r\nelement face 40000\r\nproperty list uint8 int32 vertex_indices\r\nproperty int32 ancestor\r\nend_header\r\n0.61989 0.510763 -0.584227 1 \r\n0.579545 -0.653547 -0.202568 1 \r\n0.442262 -0.841195 -0.30039 1 \r\n0.592277 -0.450376 -0.84317 1 \r\n-0.190725 -0.16999 -0.677863 1 \r\n0.275313 -0.734678 -0.562635 1 \r\n-0.244386 0.417726 -0.115225 1 \r\n-0.322586 -0.00728226 -0.897274 1 \r\n0.0756829 -0.253431 0.569532 1 \r\n0.740788 -0.0570746 -0.397233 1 \r\n0.455544 -0.140146 -0.924164 1 \r\n-0.430617 0.204081 -0.420168 1 \r\n0.412513 -0.129705 0.121977 1 \r\n0.279733 -0.170207 -0.946061 1 \r\n-0.252031 -0.366175 -0.958023 1 \r\n0.279754 0.693703 0.0164529 1 \r\n0.0137189 -0.26604 0.216176 1 \r\n0.12899 0.982412 -0.530172 1 \r\n0.311475 -0.435058 -0.764646 1 \r\n0.350232 0.777951 -0.41095 1 \r\n0.493616 0.0346621 0.126885 1 \r\n0.218171 -0.286673 -0.964376 1 \r\n-0.246378 -0.331766 -0.320128 1 \r\n-0.0577543 0.692312 -0.683718 1 \r\n0.574077 -0.315789 -0.399079 1 \r\n0.690928 -0.0402666 -0.198311 1 \r\n0.579483 -0.498082 -0.422763 1 \r\n-0.0776546 -0.373818 0.589403 1 \r\n0.185007 0.801267 -0.283831 1 \r\n-0.667937 -0.702687 0.918882 1 \r\n-0.730673 -0.569557 0.74719 1 \r\n0.626167 0.221244 -0.909808 1 \r\n0.56839 -0.467953 -0.451814 1 \r\n0.347451 -0.45409 0.392434 1 \r\n0.313405 -0.952705 0.324768 1 \r\n0.671285 -0.044329 -0.81186 1 \r\n0.271899 -0.485047 -0.667663 1 \r\n-0.633124 -0.722481 0.821041 1 \r\n0.0228544 -0.868151 0.073871 1 \r\n0.601481 -0.505271 -0.839653 1 \r\n0.290483 -0.772282 -0.519782 1 \r\n0.116854 -0.226644 -0.955336 1 \r\n0.128501 -0.707949 0.584443 1 \r\n0.21046 -0.751197 -0.565772 1 \r\n-0.42538 0.128643 -0.212716 1 \r\n-0.0351883 -0.305276 -0.956609 1 \r\n0.604335 0.0520117 -0.115758 1 \r\n-0.0419175 0.844579 -0.694014 1 \r\n-0.199701 -0.395863 -0.449068 1 \r\n0.733597 0.308512 -0.557057 1 \r\n-0.0556116 -0.465327 0.217546 1 \r\n0.222703 -0.460378 -0.805185 1 \r\n0.0236275 -0.849443 0.0394413 1 \r\n-0.0955149 -0.374551 -0.736359 1 \r\n-0.318736 0.478637 -0.632197 1 \r\n-0.0526552 0.730664 -0.568745 1 \r\n-0.393086 0.324025 -0.443681 1 \r\n-0.0582255 -0.743752 0.413094 1 \r\n0.0348083 -0.466393 0.398338 1 \r\n0.023612 -0.127522 0.189882 1 \r\n0.390628 0.434142 0.205914 1 \r\n-0.275337 -0.187789 -0.183148 1 \r\n0.574315 -0.935015 0.279608 1 \r\n0.6502 -0.127325 -0.409157 1 \r\n0.4623 0.581262 -0.829129 1 \r\n0.011518 -0.789657 0.533929 1 \r\n0.242689 -0.960799 0.470725 1 \r\n-0.0358803 -0.447876 0.597787 1 \r\n0.737312 0.0763553 -0.561249 1 \r\n-0.21559 -0.227304 -0.476175 1 \r\n-0.0545666 -0.629807 -0.906699 1 \r\n0.70477 0.0203007 -0.180088 1 \r\n0.0282016 -0.549544 -0.786547 1 \r\n-0.282318 0.1831 -0.941894 1 \r\n-0.206116 0.0303973 0.797185 1 \r\n0.0947874 -0.927943 0.0602155 1 \r\n-0.0257341 0.562708 0.117028 1 \r\n-0.211776 -0.38285 -0.942273 1 \r\n-0.132915 -0.782659 -0.232227 1 \r\n0.408787 0.842628 -0.591801 1 \r\n0.543652 -0.188846 -0.952305 1 \r\n0.632653 0.202255 -0.939866 1 \r\n0.5502 -0.465939 -0.0619155 1 \r\n0.142464 0.349624 -0.964544 1 \r\n-0.0429126 -0.624935 -0.98127 1 \r\n-0.15516 -0.0685823 0.82268 1 \r\n0.0193254 -0.502467 0.62267 1 \r\n0.138883 -0.923382 0.0258273 1 \r\n0.215256 0.283898 0.281383 1 \r\n-0.189644 -0.127653 0.906274 1 \r\n0.38958 0.757602 -0.280906 1 \r\n0.519008 0.632034 -0.645218 1 \r\n0.495827 -0.98229 0.165237 1 \r\n-0.276358 0.217415 -0.12408 1 \r\n0.10228 -0.219515 -0.946026 1 \r\n0.704335 -0.697014 0.102448 1 \r\n0.464437 -0.465052 0.086956 1 \r\n0.613788 -0.131866 -0.428997 1 \r\n-0.225902 0.612257 -0.499109 1 \r\n0.696313 -0.802733 0.288709 1 \r\n-0.195855 -0.359875 -0.457586 1 \r\n0.768742 0.146066 -0.384439 1 \r\n0.519413 -0.171778 -0.530216 1 \r\n0.614566 0.566869 -0.278741 1 \r\n0.670112 -0.785412 0.357174 1 \r\n0.418832 0.589999 0.0711316 1 \r\n0.48986 -0.563143 0.49979 1 \r\n-0.363528 -0.20017 -0.352038 1 \r\n0.253159 0.13047 -0.910578 1 \r\n0.58464 -0.589986 0.228265 1 \r\n0.63286 -0.920781 0.226719 1 \r\n-0.0362301 -0.556153 -0.835363 1 \r\n0.569563 -0.584348 -0.417619 1 \r\n0.558128 -0.0860544 -0.655718 1 \r\n0.631179 0.539226 -0.406136 1 \r\n0.291531 0.895518 -0.480568 1 \r\n0.277398 -0.351733 0.238559 1 \r\n0.686923 -0.104031 -0.250323 1 \r\n-0.160228 0.436373 0.065632 1 \r\n0.488978 0.669691 -0.62909 1 \r\n-0.130485 -0.064993 0.755564 1 \r\n0.397923 0.226526 -0.893444 1 \r\n-0.0535829 0.672047 -0.79935 1 \r\n-0.202384 0.648253 -0.391187 1 \r\n0.150772 0.814622 -0.444906 1 \r\n-0.2545 -0.038541 -0.037273 1 \r\n0.583852 -0.359094 -0.343813 1 \r\n-0.447979 0.148847 -0.33438 1 \r\n-0.267748 -0.678195 0.738567 1 \r\n0.610831 0.471134 -0.130379 1 \r\n-0.182903 0.257967 0.11187 1 \r\n-0.202022 0.0831313 0.0625606 1 \r\n0.54909 -0.380018 -0.516454 1 \r\n0.76097 0.174435 -0.285493 1 \r\n0.0834851 -0.953482 0.149185 1 \r\n0.259883 -0.281711 -0.9646 1 \r\n0.729539 0.224679 -0.681072 1 \r\n0.503246 -0.526359 -0.790317 1 \r\n0.0473309 0.95646 -0.636186 1 \r\n0.0513321 0.421544 -0.965876 1 \r\n-0.583337 -0.664166 0.536129 1 \r\n-0.0525308 -0.149491 0.712335 1 \r\n0.44661 0.708552 -0.159653 1 \r\n-0.0544286 -0.588609 0.405508 1 \r\n-0.169733 -0.217299 -0.920379 1 \r\n-0.168606 -0.641022 -0.0679422 1 \r\n0.553292 0.634027 -0.248827 1 \r\n0.552763 -0.238966 -0.484674 1 \r\n-0.223423 0.322832 -0.00966609 1 \r\n0.124243 -0.398053 0.461656 1 \r\n-0.194833 -0.0164615 0.948631 1 \r\n0.0533742 -0.227382 0.557879 1 \r\n0.748249 0.28173 -0.332267 1 \r\n0.654465 0.0556644 -0.796402 1 \r\n-0.192663 -0.583681 -0.067166 1 \r\n0.288792 0.730394 -0.048622 1 \r\n0.237109 -0.493181 0.57115 1 \r\n-0.183498 0.599701 -0.133017 1 \r\n-0.341841 -0.113224 -0.961737 1 \r\n0.331845 -0.473534 0.53671 1 \r\n0.324446 0.855858 -0.501711 1 \r\n0.098193 -0.654896 -0.981173 1 \r\n-0.454045 -0.111001 -0.323682 1 \r\n-0.267824 0.417238 -0.874183 1 \r\n0.428493 -0.0448717 -0.90678 1 \r\n-0.277735 -0.149719 -0.65684 1 \r\n-0.225832 -0.295659 -0.0233476 1 \r\n0.27027 -0.999856 0.167199 1 \r\n-0.170192 -0.037607 0.961312 1 \r\n0.609606 -0.562659 -0.869681 1 \r\n0.467322 0.42528 0.133039 1 \r\n0.488739 -0.447385 -0.55926 1 \r\n0.0877364 -0.872152 0.474471 1 \r\n-0.027909 0.248898 -0.912431 1 \r\n0.101846 -0.428214 0.413187 1 \r\n0.20145 -0.896722 -0.016413 1 \r\n-0.54865 -0.630083 0.812625 1 \r\n-0.119762 -0.0470736 0.628844 1 \r\n0.0849929 -0.318086 0.505601 1 \r\n-0.357575 -0.289755 -0.959167 1 \r\n0.510468 -0.97821 0.0915114 1 \r\n0.716922 -0.721761 0.158679 1 \r\n0.720605 -0.0532467 -0.921632 1 \r\n-0.412325 0.11697 -0.653225 1 \r\n0.429582 -0.908934 0.495982 1 \r\n-0.198185 0.079209 0.693947 1 \r\n0.575332 -0.880897 0.400911 1 \r\n0.0946162 -0.311247 0.611349 1 \r\n-0.189248 0.582455 -0.735705 1 \r\n0.377554 -0.204939 0.145657 1 \r\n0.351456 -0.939975 0.502582 1 \r\n0.0376754 -0.924788 0.203818 1 \r\n0.530101 -0.0993304 -0.674824 1 \r\n-0.0508705 0.004601 0.184372 1 \r\n-0.264182 -0.573317 0.577708 1 \r\n0.416393 0.750878 -0.39783 1 \r\n-0.222375 0.0073508 0.942374 1 \r\n0.601367 -0.641723 0.310977 1 \r\n-0.346062 0.24151 -0.770907 1 \r\n-0.544086 -0.585055 0.664841 1 \r\n0.108589 -0.433756 0.389943 1 \r\n0.360204 0.8986 -0.748456 1 \r\n-0.199908 -0.308111 -0.822852 1 \r\n0.394488 0.89309 -0.704063 1 \r\n0.628596 0.130034 -0.966844 1 \r\n0.356116 -0.44264 -0.736692 1 \r\n-0.0718458 0.612101 -0.77729 1 \r\n-0.611904 -0.611742 0.598586 1 \r\n0.510489 -0.962352 0.239773 1 \r\n0.367945 0.905438 -0.542554 1 \r\n0.0252027 0.635282 -0.915986 1 \r\n0.334885 0.479301 -0.960349 1 \r\n0.683799 -0.738466 0.0696374 1 \r\n-0.630298 -0.739935 0.839646 1 \r\n-0.112902 -0.0847574 0.940953 1 \r\n-0.460901 -0.659649 0.497922 1 \r\n0.181762 -0.896905 0.555596 1 \r\n0.347098 0.305347 -0.942644 1 \r\n0.636638 0.0449868 -0.968684 1 \r\n0.00326025 -0.104408 0.63202 1 \r\n-0.0593492 0.715546 -0.737478 1 \r\n-0.119854 -0.203471 -0.7106 1 \r\n0.411516 -0.938878 0.447295 1 \r\n-0.211018 -0.0445822 0.982428 1 \r\n-0.316574 -0.219038 -0.331025 1 \r\n0.675591 0.397377 -0.201878 1 \r\n-0.122087 0.523319 -0.848355 1 \r\n0.58986 -0.187343 -0.212788 1 \r\n0.619485 -0.106233 -0.491576 1 \r\n0.0118241 -0.592429 0.511827 1 \r\n-0.0849224 0.513803 0.107491 1 \r\n0.279069 -0.926305 -0.119649 1 \r\n-0.218341 -0.574848 0.544576 1 \r\n0.553676 0.0190141 -0.931781 1 \r\n-0.170375 -0.258486 -0.509535 1 \r\n0.499583 -0.0857878 0.0528272 1 \r\n0.743901 0.115164 -0.577199 1 \r\n0.0865825 -0.856435 0.527237 1 \r\n0.506338 0.257428 -0.934465 1 \r\n-0.0253978 -0.601528 0.538132 1 \r\n0.0606379 0.572358 0.143457 1 \r\n-0.299538 0.113524 0.803992 1 \r\n-0.309511 0.0833907 0.897132 1 \r\n-0.462278 -0.734637 0.689102 1 \r\n0.629312 -0.776423 0.415574 1 \r\n-0.059398 -0.591446 0.532373 1 \r\n0.590576 -0.454974 -0.962779 1 \r\n-0.0622422 -0.629605 -0.975741 1 \r\n-0.1366 -0.619864 0.0196946 1 \r\n-0.135666 -0.0646475 0.937788 1 \r\n-0.272911 0.0209857 0.973971 1 \r\n0.602872 -0.582358 0.123025 1 \r\n-0.223848 -0.415628 -0.0296286 1 \r\n-0.417414 0.0806928 -0.661919 1 \r\n0.290826 0.179271 -0.914229 1 \r\n0.61879 0.0914845 -0.12389 1 \r\n0.556768 -0.92996 0.311486 1 \r\n0.255794 0.990236 -0.642833 1 \r\n0.48298 -0.480653 0.237863 1 \r\n0.763056 0.225021 -0.365585 1 \r\n-0.163244 -0.364755 -0.531067 1 \r\n-0.0805072 -0.707354 0.176164 1 \r\n0.3331 0.720505 -0.0539732 1 \r\n-0.237541 -0.0883965 0.804625 1 \r\n0.179883 -0.685768 -0.938976 1 \r\n-0.288351 -0.778612 0.650812 1 \r\n-0.178104 0.558506 -0.0677026 1 \r\n-0.0564375 -0.589922 0.332062 1 \r\n0.426147 0.85452 -0.671164 1 \r\n0.475478 0.134579 0.174649 1 \r\n-0.0307253 0.760175 -0.643829 1 \r\n0.453853 0.409736 0.160018 1 \r\n0.486156 -0.884296 0.480687 1 \r\n0.194674 -0.650776 0.591852 1 \r\n-0.741725 -0.605786 0.885811 1 \r\n0.528938 -0.573259 0.0693468 1 \r\n0.675156 0.483597 -0.378742 1 \r\n0.0156842 -0.675466 0.605746 1 \r\n0.0922109 -0.916664 -0.270564 1 \r\n-0.377769 -0.795842 0.732632 1 \r\n0.320513 -0.36818 0.226314 1 \r\n0.327839 -0.59364 -0.963075 1 \r\n0.253761 -0.449082 0.451715 1 \r\n0.137291 -0.572367 -0.981035 1 \r\n-0.144641 0.535781 0.0126177 1 \r\n-0.191688 -0.677899 -0.225577 1 \r\n-0.0660691 -0.642356 0.333432 1 \r\n0.029784 -0.398031 -0.979391 1 \r\n0.358149 -0.858288 -0.0378345 1 \r\n0.067778 0.830415 -0.846648 1 \r\n0.152925 -0.245916 -0.965639 1 \r\n0.587338 -0.153795 -0.14712 1 \r\n0.275634 0.232005 0.274898 1 \r\n0.559269 0.0025568 -0.934392 1 \r\n0.0839739 0.660715 0.0533253 1 \r\n-0.33645 -0.264261 -0.985271 1 \r\n-0.213793 -0.437405 -0.00980401 1 \r\n0.278872 -0.546387 -0.889249 1 \r\n0.647647 0.130366 -0.880318 1 \r\n-0.264843 0.198561 -0.968926 1 \r\n0.112771 -0.640118 0.577241 1 \r\n-0.0143499 -0.788813 0.479846 1 \r\n0.478965 -0.587576 -0.970187 1 \r\n0.626873 0.549499 -0.357828 1 \r\n0.13478 -0.479933 -0.716757 1 \r\n0.723687 -0.104128 -0.901954 1 \r\n0.496428 -0.550127 0.308414 1 \r\n0.386021 0.758111 -0.522613 1 \r\n0.414546 0.745285 -0.487263 1 \r\n0.145016 -0.542369 0.597009 1 \r\n0.374721 -0.883982 -0.309601 1 \r\n0.00789654 -0.129209 0.594736 1 \r\n0.592547 -0.340612 -0.962408 1 \r\n-0.083946 -0.580273 -0.974452 1 \r\n0.11165 0.25914 -0.966983 1 \r\n-0.171082 -0.0158898 0.776473 1 \r\n-0.557213 -0.642972 0.537561 1 \r\n0.560743 0.245785 0.0178995 1 \r\n0.674979 -0.782444 0.0725739 1 \r\n-0.230919 -0.593887 0.495754 1 \r\n0.0408922 -0.563373 -0.638079 1 \r\n0.551684 -0.643121 -0.416252 1 \r\n0.175644 0.909765 -0.81269 1 \r\n0.243093 0.225831 -0.944694 1 \r\n-0.159181 0.387727 -0.973569 1 \r\n-0.166688 0.544393 -0.0335022 1 \r\n0.403194 -0.0803754 -0.908541 1 \r\n0.0512584 -0.882027 0.0460305 1 \r\n0.07428 -0.917921 0.297187 1 \r\n-0.290345 0.450547 -0.788599 1 \r\n-0.232961 -0.536899 -0.176482 1 \r\n0.764996 0.137256 -0.444153 1 \r\n0.426853 -0.590225 -0.835822 1 \r\n0.650636 -0.004987 -0.779713 1 \r\n0.658159 -0.0212058 -0.650301 1 \r\n-0.263577 -0.164946 -0.109044 1 \r\n0.383251 0.636081 0.0471097 1 \r\n0.565267 -0.57596 -0.843067 1 \r\n0.22298 -0.211709 -0.962989 1 \r\n0.298422 -0.473664 0.551466 1 \r\n-0.186427 -0.297381 0.0567911 1 \r\n-0.0845602 -0.657803 0.231222 1 \r\n-0.284618 0.0509741 0.942717 1 \r\n0.142129 -0.382592 0.580873 1 \r\n0.39508 0.896825 -0.587134 1 \r\n0.182997 -0.939679 0.36064 1 \r\n0.446039 -0.424723 -0.654738 1 \r\n-0.0496782 -0.359237 0.76731 1 \r\n-0.0923884 0.688037 -0.637055 1 \r\n0.0569811 -0.940157 0.157652 1 \r\n0.138851 -0.713157 -0.927926 1 \r\n0.0606295 -0.372752 0.741389 1 \r\n-0.499637 -0.636289 0.797288 1 \r\n-0.373949 0.368395 -0.352799 1 \r\n-0.243269 -0.37616 -0.338943 1 \r\n-0.169676 -0.414397 -0.974856 1 \r\n0.588749 0.274425 -0.0779941 1 \r\n-0.15479 -0.227209 -0.580905 1 \r\n-0.475424 0.0231959 -0.387589 1 \r\n-0.0294126 -0.757489 0.589548 1 \r\n-0.194038 -0.0336846 0.690285 1 \r\n-0.474243 0.0163369 -0.419105 1 \r\n0.554226 -0.244343 -0.0981569 1 \r\n-0.30392 -0.785073 0.722421 1 \r\n-0.395727 -0.182934 -0.352131 1 \r\n0.564302 0.545908 -0.108061 1 \r\n0.234275 0.99751 -0.555545 1 \r\n0.0446827 0.844423 -0.82196 1 \r\n0.527517 -0.379826 -0.786596 1 \r\n-0.00343466 0.600873 0.094479 1 \r\n0.634884 0.207464 -0.839296 1 \r\n-0.274667 0.557852 -0.389312 1 \r\n-0.0329479 -0.49941 -0.653606 1 \r\n0.362767 -0.440693 -0.694859 1 \r\n0.278457 -0.0596781 0.212088 1 \r\n0.565049 -0.311134 -0.137086 1 \r\n0.239166 -0.660986 -0.617536 1 \r\n0.567674 -0.274133 -0.440151 1 \r\n0.545863 -0.363137 -0.819247 1 \r\n-0.102742 -0.594692 0.447471 1 \r\n0.428949 -0.905344 0.0306939 1 \r\n-0.249233 -0.425206 -0.311751 1 \r\n-0.01832 -0.690337 -0.946488 1 \r\n0.683042 -0.82869 0.141195 1 \r\n0.59235 -0.940939 0.0763096 1 \r\n0.435601 0.818793 -0.708519 1 \r\n-0.624814 -0.671554 0.619599 1 \r\n-0.245615 0.126599 -0.0115608 1 \r\n0.0742562 -0.49589 0.650002 1 \r\n0.388024 -0.444899 -0.969573 1 \r\n0.529675 -0.773977 -0.0131142 1 \r\n0.54662 -0.873202 0.00984931 1 \r\n0.465537 -0.610306 -0.847247 1 \r\n0.634479 -0.0556084 -0.770652 1 \r\n0.438091 -0.517468 0.418614 1 \r\n-0.0407045 0.195718 -0.899707 1 \r\n0.443591 -0.545643 -0.798099 1 \r\n-0.210603 0.170679 -0.964064 1 \r\n0.0987149 -0.616838 -0.818315 1 \r\n0.521415 -0.406846 -0.547157 1 \r\n0.549028 -0.276753 -0.965845 1 \r\n-0.226555 -0.554179 -0.404815 1 \r\n-0.0999624 -0.528092 -0.562623 1 \r\n-0.388678 0.175701 -0.689815 1 \r\n-0.411008 0.099599 -0.189985 1 \r\n-0.053696 -0.555378 0.299884 1 \r\n-0.430148 0.0576152 -0.626128 1 \r\n-0.0475624 -0.797368 -0.0435323 1 \r\n0.056757 -0.538844 0.598161 1 \r\n0.171178 -0.116512 0.214018 1 \r\n-0.183635 -0.338763 -0.841938 1 \r\n-0.464258 -0.0699354 -0.310101 1 \r\n-0.150213 -0.0644244 0.647346 1 \r\n0.281892 -0.868419 -0.400996 1 \r\n-0.237397 -0.153883 -0.697383 1 \r\n-0.142808 -0.408163 0.126211 1 \r\n0.76621 0.0797693 -0.350723 1 \r\n0.146013 0.185735 0.277398 1 \r\n-0.138888 -0.772898 0.628564 1 \r\n0.0839614 -0.419022 -0.976096 1 \r\n0.0776867 -0.576723 -0.645527 1 \r\n0.117801 0.721076 -0.023717 1 \r\n-0.320314 -0.195412 -0.270822 1 \r\n0.331648 -0.184074 -0.947106 1 \r\n0.647149 0.120217 -0.134135 1 \r\n0.441795 0.785017 -0.69961 1 \r\n0.631356 -0.144408 -0.255451 1 \r\n-0.0173155 -0.802279 0.0110935 1 \r\n0.722286 -0.0112784 -0.212753 1 \r\n0.374316 -0.946804 0.441204 1 \r\n0.539865 -0.56229 -0.479261 1 \r\n0.0106193 -0.506267 0.398649 1 \r\n0.482897 -0.751672 -0.060829 1 \r\n-0.457295 -0.12137 -0.420536 1 \r\n-0.0131452 0.813926 -0.608425 1 \r\n0.0175302 -0.426442 0.726208 1 \r\n0.537997 -0.381788 -0.548535 1 \r\n0.243903 0.321348 -0.965078 1 \r\n0.502841 -0.751959 -0.0184437 1 \r\n0.382701 0.865104 -0.548995 1 \r\n-0.162082 -0.166168 0.888727 1 \r\n0.236267 -0.165797 -0.944191 1 \r\n0.56369 -0.779872 -0.00673461 1 \r\n-0.227132 0.082654 0.0299675 1 \r\n0.0495317 -0.900413 -0.157645 1 \r\n0.744316 -0.0628108 -0.340589 1 \r\n-0.246138 -0.22359 -0.795521 1 \r\n-0.194352 -0.681974 0.709014 1 \r\n0.693097 -0.107079 -0.391954 1 \r\n-0.430854 0.136301 -0.547952 1 \r\n0.242419 -0.339566 0.244183 1 \r\n0.111444 0.46771 0.225017 1 \r\n0.453594 -0.49537 -0.573716 1 \r\n-0.477109 0.00285769 -0.397613 1 \r\n-0.727656 -0.634269 0.907924 1 \r\n-0.348287 -0.276892 -0.899093 1 \r\n-0.0464355 -0.771111 0.0100547 1 \r\n-0.311495 -0.763553 0.633275 1 \r\n0.472282 -0.426838 -0.722522 1 \r\n0.518821 0.672327 -0.430726 1 \r\n0.0506721 -0.415837 0.30251 1 \r\n0.442107 -0.679296 -0.521922 1 \r\n-0.0108052 0.647734 0.0387461 1 \r\n0.0484049 0.260665 -0.946091 1 \r\n0.51244 -0.34555 -0.0101247 1 \r\n-0.0550896 -0.010909 0.643828 1 \r\n0.466243 0.539081 -0.893762 1 \r\n-0.0872229 -0.829812 -0.272218 1 \r\n0.277046 -0.991289 0.105468 1 \r\n-0.230148 -0.377579 -0.0419177 1 \r\n0.669708 -0.82261 0.338382 1 \r\n0.338257 -0.891336 -0.327505 1 \r\n-0.161497 -0.270294 0.0914906 1 \r\n-0.00495279 -0.788469 0.511059 1 \r\n-0.402667 0.177849 -0.631976 1 \r\n0.573983 -0.2317 -0.322164 1 \r\n-0.35989 0.408584 -0.424289 1 \r\n-0.162272 -0.175475 -0.730772 1 \r\n0.30305 -0.959245 0.466606 1 \r\n-0.327183 -0.143988 -0.614513 1 \r\n-0.00896126 -0.420936 0.721757 1 \r\n0.0382907 -0.269834 0.73397 1 \r\n-0.141375 -0.513145 0.0889275 1 \r\n-0.247576 -0.697395 0.455513 1 \r\n0.329147 -0.4836 0.56039 1 \r\n-0.189385 -0.703157 0.44688 1 \r\n0.0792338 0.899451 -0.784716 1 \r\n0.262664 0.980471 -0.520659 1 \r\n0.481113 0.101529 0.160931 1 \r\n0.57691 -0.748972 0.47609 1 \r\n-0.296341 -0.225689 -0.38826 1 \r\n0.653998 -0.133181 -0.376896 1 \r\n-0.399402 0.265521 -0.545011 1 \r\n0.124345 -0.855341 -0.4371 1 \r\n0.27937 -0.680609 0.59649 1 \r\n0.0994651 0.798538 -0.261357 1 \r\n0.274452 0.290944 -0.963113 1 \r\n-0.0835278 -0.419562 -0.799286 1 \r\n0.425867 0.128394 -0.895389 1 \r\n0.764239 0.194794 -0.314029 1 \r\n0.441681 -0.635474 -0.88778 1 \r\n-0.183667 -0.292435 -0.483241 1 \r\n-0.102296 -0.698136 -0.488283 1 \r\n-0.29839 -0.791232 0.679814 1 \r\n-0.282611 0.278461 -0.899412 1 \r\n-0.0924019 -0.766414 0.602581 1 \r\n0.283344 -0.269526 -0.965499 1 \r\n-0.0209795 -0.774453 0.527683 1 \r\n0.386467 0.70273 -0.0661668 1 \r\n0.336929 0.627811 -0.918048 1 \r\n0.0872415 0.53025 0.180076 1 \r\n-0.18976 -0.321206 -0.471482 1 \r\n0.234885 -0.297322 0.226034 1 \r\n0.182134 0.493786 -0.959814 1 \r\n0.206251 -0.93173 -0.273813 1 \r\n0.18472 0.258828 0.283531 1 \r\n-0.123738 -0.585623 0.492931 1 \r\n0.117531 -0.364399 0.269761 1 \r\n0.663243 0.218598 -0.139873 1 \r\n0.457122 -0.459117 -0.970452 1 \r\n-0.188908 0.570158 -0.106034 1 \r\n-0.476921 -0.0433329 -0.370768 1 \r\n0.706068 -0.0547451 -0.945158 1 \r\n-0.252255 0.235336 -0.0672387 1 \r\n0.384319 -0.442725 -0.658477 1 \r\n-0.182525 -0.607234 -0.464173 1 \r\n-0.41904 0.138833 -0.603299 1 \r\n-0.216287 0.205503 0.0583891 1 \r\n0.518074 -0.242202 -0.677285 1 \r\n0.147711 -0.543061 -0.66451 1 \r\n-0.456183 0.100678 -0.314049 1 \r\n-0.335113 0.0443435 0.88054 1 \r\n-0.434339 0.198654 -0.386817 1 \r\n0.101646 -0.495264 -0.703086 1 \r\n-0.0431212 -0.769963 0.493782 1 \r\n0.353957 0.736724 -0.115096 1 \r\n0.63479 -0.630249 0.0669395 1 \r\n-0.283131 0.46827 -0.211718 1 \r\n0.650314 0.181211 -0.809461 1 \r\n0.00817466 -0.629794 0.570953 1 \r\n0.467374 -0.587417 0.547305 1 \r\n-0.0116987 -0.808349 0.407573 1 \r\n0.313219 0.796348 -0.491298 1 \r\n-0.195171 0.475233 -0.881191 1 \r\n0.197053 -0.369767 0.284465 1 \r\n0.590939 0.595747 -0.261309 1 \r\n-0.0687722 -0.412548 0.201514 1 \r\n-0.0212451 0.85204 -0.754624 1 \r\n-0.154001 -0.357151 0.116104 1 \r\n0.453459 0.726099 -0.434162 1 \r\n0.174707 0.801589 -0.325872 1 \r\n0.457018 0.7267 -0.360799 1 \r\n0.344919 0.952932 -0.57931 1 \r\n-0.237391 -0.505353 -0.371637 1 \r\n0.474004 -0.364483 -0.967721 1 \r\n-0.140144 -0.761845 0.533608 1 \r\n0.466554 -0.466935 -0.75841 1 \r\n-0.746498 -0.573086 0.80615 1 \r\n-0.264456 0.374538 -0.911425 1 \r\n-0.0794986 0.735562 -0.462986 1 \r\n-0.351362 0.356286 -0.69111 1 \r\n-0.196658 0.611541 -0.666244 1 \r\n-0.330418 0.207599 -0.809463 1 \r\n0.432986 -0.932462 0.397217 1 \r\n0.5422 0.0470103 -0.927302 1 \r\n-0.0499117 -0.181368 0.744523 1 \r\n0.555586 -0.736832 -0.00940764 1 \r\n0.57388 -0.530453 -0.820569 1 \r\n-0.358286 0.396122 -0.322229 1 \r\n0.420368 0.195656 -0.893963 1 \r\n0.23467 -0.774001 -0.534555 1 \r\n0.686912 -0.0845779 -0.961152 1 \r\n-0.628264 -0.687262 0.750915 1 \r\n-0.224039 -0.592546 -0.27385 1 \r\n-0.157257 0.0364261 0.106838 1 \r\n0.46203 -0.53881 0.441141 1 \r\n0.270498 -0.281046 0.211206 1 \r\n0.593107 -0.575066 -0.178601 1 \r\n-0.456361 -0.627631 0.775248 1 \r\n0.0119383 -0.274759 -0.948314 1 \r\n0.00872248 -0.33143 0.482824 1 \r\n0.284071 -0.42803 -0.739491 1 \r\n-0.0959133 -0.449208 -0.631292 1 \r\n0.00788307 -0.149235 -0.909178 1 \r\n-0.119285 0.458527 0.104461 1 \r\n-0.0154135 -0.828085 0.347814 1 \r\n0.317514 -0.704999 -0.572353 1 \r\n-0.189806 0.656046 -0.433104 1 \r\n0.462518 -0.905656 0.0265847 1 \r\n0.747823 0.270513 -0.288769 1 \r\n0.587058 -0.914045 0.320534 1 \r\n-0.2671 -0.120233 -0.104729 1 \r\n0.104383 -0.963499 0.185856 1 \r\n-0.0443404 -0.704253 -0.527714 1 \r\n-0.307703 0.283888 -0.156798 1 \r\n0.377574 -0.498143 0.550802 1 \r\n-0.198772 0.656129 -0.341494 1 \r\n0.524393 0.149428 -0.926325 1 \r\n0.573589 0.573842 -0.614767 1 \r\n-0.410962 -0.0898233 -0.22324 1 \r\n0.369968 -0.984392 0.124291 1 \r\n-6.22869e-005 -0.882884 -0.241819 1 \r\n0.478664 -0.466224 0.20196 1 \r\n0.0282856 -0.535024 -0.98348 1 \r\n-0.294007 -0.206199 -0.254365 1 \r\n0.0655605 -0.787262 0.566533 1 \r\n0.186009 -0.328431 0.24798 1 \r\n0.445178 0.22471 -0.903246 1 \r\n0.441629 -0.807545 -0.0760526 1 \r\n0.66261 -0.890511 0.222672 1 \r\n-0.318016 0.348182 -0.180353 1 \r\n0.54718 -0.57867 0.268516 1 \r\n-0.189697 0.551615 -0.779603 1 \r\n0.171658 -0.181671 -0.944853 1 \r\n-0.23633 0.0682098 0.0133587 1 \r\n-0.064 -0.585936 0.470528 1 \r\n-0.0760276 -0.720495 0.127601 1 \r\n-0.617203 -0.576877 0.722795 1 \r\n-0.36277 -0.0468204 -0.183201 1 \r\n-0.340754 0.0973681 0.846515 1 \r\n0.170945 -0.29198 -0.964712 1 \r\n0.064305 -0.272001 0.52734 1 \r\n-0.258274 -0.199165 -0.521204 1 \r\n0.741514 0.306717 -0.473257 1 \r\n0.691167 0.452301 -0.383817 1 \r\n0.407926 0.688846 -0.84151 1 \r\n0.507365 0.628693 -0.115234 1 \r\n0.530557 -0.189078 -0.94721 1 \r\n0.00546008 0.779652 -0.579807 1 \r\n0.212098 -0.682367 0.59484 1 \r\n-0.116668 -0.0990564 0.617098 1 \r\n0.522588 -0.472731 -0.0196514 1 \r\n0.754755 -0.000152588 -0.405336 1 \r\n0.0817959 0.0112109 0.234771 1 \r\n-0.272005 -0.352541 -0.918944 1 \r\n-0.182448 -0.183646 0.828356 1 \r\n-0.0914773 -0.133897 0.827163 1 \r\n0.650843 0.350319 -0.770692 1 \r\n0.0364696 -0.502836 0.640435 1 \r\n-0.743627 -0.620865 0.779773 1 \r\n-0.239739 -0.234341 -0.968327 1 \r\n-0.0029937 -0.255987 0.518613 1 \r\n0.0558376 0.123735 -0.90672 1 \r\n0.535154 -0.110335 -0.0128818 1 \r\n0.541463 -0.519597 -0.0546902 1 \r\n0.527755 -0.34891 -0.775459 1 \r\n0.540789 0.0509015 0.0609833 1 \r\n0.157725 0.805999 -0.419688 1 \r\n0.074088 0.0243477 -0.906516 1 \r\n0.192912 0.131206 -0.913481 1 \r\n0.603536 0.319106 -0.947761 1 \r\n0.105507 -0.895 0.00455201 1 \r\n0.115554 -0.777987 0.577501 1 \r\n-0.000506461 -0.869504 0.12703 1 \r\n-0.00875902 0.781935 -0.605134 1 \r\n0.394727 -0.599048 0.586632 1 \r\n0.181413 -0.924821 -0.301103 1 \r\n-0.085682 0.0158285 0.165154 1 \r\n0.418624 -0.959186 0.0760916 1 \r\n0.0438194 -0.00853479 -0.905931 1 \r\n-0.0496408 0.641332 -0.814325 1 \r\n-0.155132 0.678563 -0.225545 1 \r\n0.418199 0.393777 -0.961418 1 \r\n0.740186 0.276977 -0.571508 1 \r\n0.343902 0.663445 0.0384452 1 \r\n-0.103069 0.20681 0.179298 1 \r\n-0.108081 0.552933 -0.819012 1 \r\n0.405021 0.784384 -0.807048 1 \r\n-0.331442 0.292127 -0.784696 1 \r\n0.456198 0.655268 -0.725427 1 \r\n-0.0730827 -0.743608 0.195558 1 \r\n-0.600353 -0.763048 0.834022 1 \r\n-0.35295 0.3239 -0.715536 1 \r\n-0.0552287 0.787321 -0.738484 1 \r\n0.00474519 -0.236011 0.754173 1 \r\n0.6637 0.498913 -0.349027 1 \r\n0.598099 -0.238923 -0.966413 1 \r\n0.75105 0.262626 -0.503059 1 \r\n0.129606 -0.341127 0.253771 1 \r\n-0.0483676 -0.821597 0.194935 1 \r\n0.0410271 0.246293 -0.932125 1 \r\n-0.202878 -0.27702 -0.959586 1 \r\n-0.307703 -0.182174 -0.240636 1 \r\n-0.418846 -0.136872 -0.502969 1 \r\n0.116099 -0.672021 -0.617337 1 \r\n0.220722 -0.604134 0.592547 1 \r\n0.408518 0.743313 -0.603205 1 \r\n0.6312 -0.134957 -0.23674 1 \r\n0.423263 -0.435288 -0.699557 1 \r\n-0.733692 -0.587434 0.858147 1 \r\n-0.749541 -0.616802 0.884493 1 \r\n0.185766 -0.969733 0.258129 1 \r\n0.364645 -0.331929 0.156303 1 \r\n-0.267835 0.568197 -0.450987 1 \r\n-0.251338 0.178991 -0.037548 1 \r\n0.307999 0.97133 -0.547353 1 \r\n0.0787513 0.294566 -0.968571 1 \r\n-0.139817 -0.0650854 0.962515 1 \r\n-0.254794 0.0709803 -0.980213 1 \r\n-0.691002 -0.571373 0.721643 1 \r\n0.176098 -0.926282 0.519246 1 \r\n0.417307 -0.496666 0.398131 1 \r\n0.0638286 -0.821005 -0.469816 1 \r\n0.191298 -0.797653 0.581382 1 \r\n-0.204015 0.449841 -0.913016 1 \r\n-0.285519 0.533467 -0.342155 1 \r\n-0.419078 -0.637206 0.497767 1 \r\n-0.267696 0.0110449 -0.0760993 1 \r\n0.211793 0.991107 -0.519752 1 \r\n0.71219 0.387592 -0.35151 1 \r\n0.0428585 0.754001 -0.882433 1 \r\n0.308342 -0.263189 0.192787 1 \r\n0.491863 -0.0815209 -0.917757 1 \r\n-0.0223658 0.77023 -0.225122 1 \r\n0.459716 -0.845319 0.528212 1 \r\n0.56342 -0.556857 -0.10369 1 \r\n-0.082074 -0.729071 0.43367 1 \r\n-0.0550512 0.284189 -0.92047 1 \r\n-0.0989101 -0.265431 0.586165 1 \r\n-0.0631055 -0.533149 -0.591375 1 \r\n-0.242713 0.538458 -0.188881 1 \r\n-0.0852524 0.434515 -0.963566 1 \r\n0.157778 -0.619038 -0.979953 1 \r\n0.719775 0.349043 -0.546385 1 \r\n0.529717 0.635832 -0.173519 1 \r\n-0.172423 -0.254972 -0.928124 1 \r\n0.736564 0.0361356 -0.514041 1 \r\n0.0477418 -0.279542 0.74913 1 \r\n-0.113926 -0.659896 -0.506095 1 \r\n-0.448949 -0.0881599 -0.281096 1 \r\n0.160486 0.954841 -0.751775 1 \r\n0.580998 -0.350085 -0.886291 1 \r\n0.553655 0.578699 -0.663843 1 \r\n-0.427637 -0.763811 0.809035 1 \r\n0.142545 -0.698583 -0.897592 1 \r\n-0.274913 -0.238498 -0.252994 1 \r\n0.370124 -0.479924 0.508247 1 \r\n0.452265 0.526649 -0.91616 1 \r\n0.286177 0.797542 -0.455903 1 \r\n0.0739957 -0.329629 0.241755 1 \r\n-0.177477 -0.609037 0.647533 1 \r\n0.17466 -0.455602 0.59153 1 \r\n0.606452 0.188558 -0.108042 1 \r\n0.495557 0.469588 0.0572373 1 \r\n0.459394 -0.549506 -0.972961 1 \r\n-0.123604 0.660778 -0.659242 1 \r\n-0.234594 0.596225 -0.260768 1 \r\n0.678258 -0.805649 0.100124 1 \r\n0.149453 -0.315546 -0.965522 1 \r\n-0.134228 -0.283514 0.756145 1 \r\n0.271754 -0.975199 0.0765378 1 \r\n0.714006 -0.0884193 -0.272603 1 \r\n0.277606 0.785951 -0.213645 1 \r\n0.378882 -0.269122 0.149953 1 \r\n-0.29011 0.404392 -0.829222 1 \r\n0.0256312 0.923618 -0.713309 1 \r\n0.25982 -0.598215 0.594882 1 \r\n0.671358 0.049428 -0.150144 1 \r\n-0.381812 -0.0392164 -0.71792 1 \r\n0.0862173 -0.547691 -0.65579 1 \r\n-0.162325 -0.41627 -0.950248 1 \r\n0.56784 -0.412126 -0.828832 1 \r\n-0.118122 -0.667181 0.422567 1 \r\n0.550314 -0.278565 -0.562706 1 \r\n-0.35914 -0.169089 -0.895868 1 \r\n0.177628 -0.932396 -0.265674 1 \r\n0.688427 0.242931 -0.753927 1 \r\n0.00313365 -0.866827 -0.352049 1 \r\n-0.254599 -0.263366 -0.117098 1 \r\n0.244857 -0.469235 -0.823933 1 \r\n0.493025 -0.571863 0.431792 1 \r\n0.288221 -0.561836 0.592121 1 \r\n-0.309992 0.21837 -0.151502 1 \r\n0.30279 0.928433 -0.756477 1 \r\n-0.195631 -0.43874 0.0301232 1 \r\n0.49426 -0.794947 -0.201012 1 \r\n-0.143274 0.229203 -0.917316 1 \r\n0.753219 -0.0305716 -0.376957 1 \r\n-0.257666 0.578699 -0.490707 1 \r\n-0.236855 -0.674225 0.449038 1 \r\n0.439357 -0.0563949 0.132572 1 \r\n0.225191 -0.265437 0.220202 1 \r\n-0.338353 0.342319 -0.744875 1 \r\n0.1203 -0.0976202 0.214547 1 \r\n-0.0563763 -0.219205 0.877385 1 \r\n0.0877188 0.863869 -0.826406 1 \r\n0.26669 0.599774 0.131565 1 \r\n0.612709 0.538178 -0.498057 1 \r\n0.212183 0.950358 -0.474401 1 \r\n0.601647 -0.483277 -0.216849 1 \r\n0.0353251 -0.471056 0.679711 1 \r\n0.650885 -0.214516 -0.948231 1 \r\n0.256739 -0.936267 -0.229524 1 \r\n-0.178264 0.652497 -0.531197 1 \r\n0.723749 0.16521 -0.691784 1 \r\n0.484008 -0.413876 0.0307976 1 \r\n-0.245309 -0.786337 0.654672 1 \r\n-0.183046 0.530997 -0.812204 1 \r\n0.650469 -0.759254 0.39592 1 \r\n0.603515 -0.255179 -0.88734 1 \r\n0.0889443 0.601807 -0.956169 1 \r\n-0.641713 -0.580478 0.786849 1 \r\n-0.348701 -0.0723096 -0.747583 1 \r\n0.302313 -0.958204 0.0642 1 \r\n0.559238 -0.431757 -0.0788512 1 \r\n-0.136301 -0.683964 -0.467072 1 \r\n-0.173103 0.292366 0.121552 1 \r\n0.341599 -0.559663 0.588127 1 \r\n0.569677 -0.636276 0.358917 1 \r\n0.0110863 -0.29669 -0.961248 1 \r\n-0.688298 -0.647889 0.694186 1 \r\n0.523076 -0.543153 0.0976024 1 \r\n-0.30601 -0.575933 0.626489 1 \r\n-0.398 -0.1801 -0.389858 1 \r\n-0.101692 -0.556258 -0.931416 1 \r\n-0.00571239 0.191183 0.250139 1 \r\n0.613404 -0.506231 -0.947478 1 \r\n0.758086 -0.0208062 -0.328702 1 \r\n0.635455 -0.512506 -0.902175 1 \r\n0.698565 -0.169486 -0.907113 1 \r\n-0.116359 -0.238188 -0.65418 1 \r\n0.0468826 0.444736 0.224477 1 \r\n-0.291716 -0.68719 0.461065 1 \r\n0.209203 -0.74042 0.589953 1 \r\n0.101917 0.814559 -0.458142 1 \r\n0.54413 -0.554301 0.233059 1 \r\n-0.399665 0.185953 -0.200195 1 \r\n0.594799 0.570584 -0.463732 1 \r\n0.645541 0.516802 -0.30978 1 \r\n-0.344094 0.42694 -0.333665 1 \r\n0.0190493 0.779009 -0.545776 1 \r\n0.395858 0.173626 0.240821 1 \r\n0.581029 -0.359497 -0.37517 1 \r\n-0.23202 0.112808 0.0228698 1 \r\n0.507895 -0.719293 -0.0780346 1 \r\n0.154974 0.220124 0.280573 1 \r\n-0.316662 0.244363 -0.82663 1 \r\n0.564302 -0.600271 0.0654037 1 \r\n-0.117912 -0.750545 0.483001 1 \r\n0.581994 -0.31749 -0.226839 1 \r\n0.245584 -0.558095 0.589569 1 \r\n-0.229696 0.616833 -0.290297 1 \r\n-0.371628 0.380941 -0.4009 1 \r\n-0.298972 0.0120928 0.968938 1 \r\n0.500434 -0.221975 -0.722042 1 \r\n0.0769105 0.0933523 0.257102 1 \r\n-0.262604 -0.574051 0.553385 1 \r\n-0.147159 0.148473 0.131524 1 \r\n0.255109 -0.889794 -0.0220007 1 \r\n0.179846 -0.833242 -0.47215 1 \r\n0.529903 -0.610592 0.416466 1 \r\n0.0473651 0.615121 0.097011 1 \r\n0.467457 0.671331 -0.672558 1 \r\n-0.376474 0.214126 -0.702642 1 \r\n-0.639788 -0.644678 0.564572 1 \r\n-0.420492 0.239964 -0.407704 1 \r\n-0.158603 -0.195095 0.0810828 1 \r\n-0.0298588 -0.190655 0.810508 1 \r\n0.383323 -0.402262 0.237199 1 \r\n0.340187 0.0643704 0.238714 1 \r\n-0.261676 -0.294676 -0.203238 1 \r\n0.235647 -0.125305 -0.923251 1 \r\n-0.0416996 -0.500922 0.272552 1 \r\n0.519008 -0.612634 -0.854102 1 \r\n0.666844 -0.122702 -0.401941 1 \r\n0.0355015 -0.17537 0.58712 1 \r\n0.389736 0.471093 0.188678 1 \r\n-0.444483 -0.58494 0.604107 1 \r\n-0.355322 -0.0896894 -0.698635 1 \r\n-0.0578477 0.703187 -0.775838 1 \r\n0.301649 -0.924826 -0.230258 1 \r\n-0.0048812 0.356545 0.238434 1 \r\n0.623635 0.49167 -0.637229 1 \r\n-0.445488 0.103988 -0.5095 1 \r\n-0.626219 -0.673122 0.644005 1 \r\n0.124565 -0.499191 -0.687402 1 \r\n0.469823 -0.825628 -0.256131 1 \r\n0.577096 -0.485319 -0.116461 1 \r\n-0.162982 -0.475378 -0.503263 1 \r\n0.556758 0.140929 0.0456154 1 \r\n0.742126 0.152914 -0.625654 1 \r\n0.350512 -0.757734 0.587878 1 \r\n-0.619594 -0.641721 0.864321 1 \r\n-0.200173 0.480888 -0.0536588 1 \r\n-0.129065 -0.200446 0.622587 1 \r\n-0.0593866 -0.127636 0.581579 1 \r\n0.561282 0.458278 -0.926732 1 \r\n-0.219853 -0.739637 0.716849 1 \r\n0.707126 -0.0317588 -0.518004 1 \r\n0.056564 -0.894189 -0.114752 1 \r\n0.503754 -0.831715 0.504325 1 \r\n0.161056 -0.473775 0.607552 1 \r\n-0.0492392 -0.855183 -0.262701 1 \r\n0.293057 0.528673 0.186333 1 \r\n0.579058 -0.0365382 -0.0817452 1 \r\n0.00616467 0.803602 -0.826942 1 \r\n0.578093 -0.252164 -0.298972 1 \r\n-0.272165 -0.0420451 0.897662 1 \r\n-0.202516 -0.0145802 -0.929928 1 \r\n-0.342121 -0.162525 -0.550391 1 \r\n-0.22681 0.625798 -0.352571 1 \r\n0.240842 0.697615 -0.921654 1 \r\n-0.352457 0.291971 -0.735066 1 \r\n-0.465853 0.0462216 -0.452337 1 \r\n-0.19661 0.400086 -0.959367 1 \r\n-0.084855 -0.566176 -0.90053 1 \r\n-0.421038 -0.732701 0.647823 1 \r\n-0.485586 -0.709017 0.602581 1 \r\n-0.232781 -0.333441 -0.364846 1 \r\n0.322713 -0.406916 0.305488 1 \r\n0.142344 0.834648 -0.463954 1 \r\n0.676909 -0.0136992 -0.173676 1 \r\n0.473569 0.545742 0.0395141 1 \r\n-0.0325608 -0.449392 0.556934 1 \r\n-0.434517 -0.127884 -0.295667 1 \r\n-0.164447 0.655091 -0.590967 1 \r\n0.440301 -0.646636 -0.542071 1 \r\n0.732071 0.249375 -0.660072 1 \r\n-0.0982398 -0.411625 -0.841092 1 \r\n-0.163197 0.233011 0.126948 1 \r\n0.0182691 -0.489816 0.422754 1 \r\n0.161065 -0.427386 0.598016 1 \r\n0.157816 -0.640141 0.586072 1 \r\n0.572219 -0.386895 -0.846248 1 \r\n0.046508 -0.886352 0.337552 1 \r\n0.328254 -0.280631 -0.966271 1 \r\n0.308767 0.665323 0.0489464 1 \r\n0.524746 -0.696664 -0.0925733 1 \r\n-0.125681 0.137443 -0.898273 1 \r\n-0.0925493 -0.574505 -0.918127 1 \r\n0.569272 -0.324187 -0.878872 1 \r\n-0.596278 -0.623695 0.833337 1 \r\n-0.130667 -0.74233 -0.410724 1 \r\n0.767539 0.116886 -0.355918 1 \r\n0.262072 0.339891 0.270394 1 \r\n-0.369067 -0.241817 -0.957811 1 \r\n0.580251 -0.226125 -0.271097 1 \r\n0.341568 0.233333 0.262643 1 \r\n0.620439 -0.152634 -0.284586 1 \r\n-0.141673 -0.313332 0.129801 1 \r\n-0.269541 -0.155129 -0.767628 1 \r\n-0.0870798 -0.236562 0.571047 1 \r\n-0.0356822 -0.77493 0.444815 1 \r\n0.631968 -0.497488 -0.927104 1 \r\n0.569677 0.0291418 -0.942622 1 \r\n0.0563399 0.950919 -0.686335 1 \r\n-0.595143 -0.585567 0.672374 1 \r\n0.605642 -0.238089 -0.858861 1 \r\n0.580811 -0.00189173 -0.0776973 1 \r\n-0.28328 -0.297732 -0.986122 1 \r\n0.618696 -0.740635 0.436721 1 \r\n0.40142 0.726711 -0.83785 1 \r\n-0.736624 -0.642352 0.834323 1 \r\n0.57886 -0.0357424 -0.94668 1 \r\n0.575177 -0.154312 -0.407223 1 \r\n0.317867 0.821563 -0.842541 1 \r\n0.42981 0.790455 -0.761849 1 \r\n-0.115528 -0.325516 -0.669381 1 \r\n0.587743 -0.595957 -0.882604 1 \r\n-0.0294158 -0.181243 0.555554 1 \r\n-0.0672261 -0.758115 0.147203 1 \r\n0.387858 -0.445691 -0.732981 1 \r\n-0.0754164 -0.751354 0.460878 1 \r\n-0.0354311 -0.823072 0.125142 1 \r\n0.760898 0.227066 -0.326078 1 \r\n0.554538 -0.872588 0.432768 1 \r\n-0.0223628 -0.793433 0.415231 1 \r\n-0.242731 0.324232 -0.0778198 1 \r\n0.29452 -0.930642 -0.166161 1 \r\n-0.00106257 -0.540936 0.418074 1 \r\n0.0793189 0.97023 -0.561006 1 \r\n0.111447 0.987444 -0.564502 1 \r\n0.602571 -0.544354 -0.339937 1 \r\n-0.13648 -0.461304 -0.96014 1 \r\n0.498805 -0.750108 -0.0980282 1 \r\n0.214201 -0.159004 0.206267 1 \r\n0.596563 -0.498273 -0.184995 1 \r\n0.680416 0.108699 -0.752065 1 \r\n-0.214846 0.638613 -0.310185 1 \r\n-0.215321 -0.243678 -0.435168 1 \r\n0.152316 -0.925936 -0.287186 1 \r\n-0.391984 -0.776894 0.781298 1 \r\n0.548114 -0.126603 -0.526773 1 \r\n0.746692 0.148286 -0.594693 1 \r\n0.231278 -0.941554 -0.164633 1 \r\n-0.536489 -0.697553 0.627693 1 \r\n-0.21181 -0.625102 -0.256081 1 \r\n-0.271683 -0.223606 -0.981883 1 \r\n0.615978 0.276292 -0.883393 1 \r\n0.13504 -0.922109 0.359436 1 \r\n0.5254 -0.299629 -0.747831 1 \r\n0.215214 -0.923271 -0.304033 1 \r\n0.313395 0.308242 -0.957052 1 \r\n0.0863958 -0.291301 0.535413 1 \r\n0.399033 -0.981721 0.198069 1 \r\n0.587131 0.0340499 -0.0871556 1 \r\n0.715604 -0.776082 0.241734 1 \r\n0.541629 0.274352 0.0619898 1 \r\n0.523003 -0.304738 -0.0302895 1 \r\n-0.00386947 -0.505299 -0.676118 1 \r\n-0.652635 -0.695746 0.803172 1 \r\n0.0675943 -0.849632 -0.428559 1 \r\n-0.0380906 -0.794313 0.0866446 1 \r\n0.531252 -0.804151 -0.00964212 1 \r\n-0.215434 -0.11372 -0.937717 1 \r\n-0.105704 -0.0938099 0.913724 1 \r\n-0.138669 0.371934 -0.971063 1 \r\n-0.247833 -0.48482 -0.315283 1 \r\n-0.235963 -0.180728 -0.036527 1 \r\n0.298328 0.385206 -0.961191 1 \r\n-0.117016 -0.229847 0.857919 1 \r\n-0.0788407 -0.658879 0.27441 1 \r\n0.403225 0.63467 -0.855987 1 \r\n0.40335 -0.868007 -0.148678 1 \r\n0.0217359 0.289491 -0.955804 1 \r\n-0.15477 0.62007 -0.102727 1 \r\n0.000300825 -0.828351 0.386893 1 \r\n0.599769 0.538821 -0.596017 1 \r\n0.139316 -0.918059 -0.101427 1 \r\n0.471898 -0.372401 0.0442251 1 \r\n0.517327 -0.0424062 -0.916435 1 \r\n0.636679 0.492925 -0.554266 1 \r\n0.546724 0.179582 0.0761539 1 \r\n0.493513 -0.534556 0.292673 1 \r\n-0.332914 -0.0928211 -0.825275 1 \r\n0.721902 -0.749653 0.189342 1 \r\n-0.360757 -0.172549 -0.951115 1 \r\n0.489684 -0.515796 0.0599871 1 \r\n0.114753 -0.366188 0.664281 1 \r\n-0.261021 -0.0746609 -0.0649766 1 \r\n0.229264 -0.75476 -0.558418 1 \r\n-0.0198402 0.0373704 0.208632 1 \r\n-0.593667 -0.580472 0.708361 1 \r\n-0.447313 0.0511817 -0.559935 1 \r\n0.0291739 -0.37286 0.7607 1 \r\n-0.148425 -0.71294 -0.421739 1 \r\n-0.265943 0.437639 -0.16118 1 \r\n-0.147948 -0.314505 -0.96453 1 \r\n0.720854 -0.0495972 -0.900413 1 \r\n0.459332 0.253225 -0.912632 1 \r\n-0.240743 0.181346 -0.00241387 1 \r\n0.62707 -0.0534874 -0.625101 1 \r\n-0.509954 -0.742797 0.737872 1 \r\n-0.122358 -0.233463 -0.761042 1 \r\n0.582503 -0.271712 -0.228562 1 \r\n0.179129 -0.453717 -0.746235 1 \r\n0.0763139 0.434795 -0.96404 1 \r\n-0.334333 -0.0861354 -0.189094 1 \r\n-0.304382 -0.0706213 -0.980062 1 \r\n0.682378 -0.637702 0.118034 1 \r\n0.660462 -0.875208 0.138652 1 \r\n0.42512 0.440772 0.177845 1 \r\n0.507531 -0.594475 0.0133493 1 \r\n-0.305685 0.0693512 -0.910997 1 \r\n0.273549 0.801423 -0.869064 1 \r\n0.651798 0.137246 -0.918892 1 \r\n0.578393 -0.101259 -0.950741 1 \r\n-0.0370602 0.619064 -0.849927 1 \r\n0.0734624 -0.329978 0.487297 1 \r\n0.442615 0.683316 -0.700144 1 \r\n-0.456331 -0.122632 -0.373365 1 \r\n-0.221953 -0.373988 -0.921554 1 \r\n-0.117553 0.721388 -0.386487 1 \r\n-0.0566275 -0.0784484 0.600703 1 \r\n0.712958 0.332617 -0.640483 1 \r\n0.577159 -0.865486 0.0177791 1 \r\n-0.119007 -0.319321 0.671721 1 \r\n-0.0723844 -0.707275 0.405135 1 \r\n-0.0899416 -0.365897 0.667425 1 \r\n-0.116324 0.725414 -0.351287 1 \r\n-0.247866 -0.231131 -0.422249 1 \r\n0.703702 -0.0111176 -0.884238 1 \r\n0.264386 -0.957381 0.321893 1 \r\n0.720419 0.361827 -0.328706 1 \r\n0.66592 0.459564 -0.527484 1 \r\n-0.173806 0.492261 -0.00591385 1 \r\n0.296824 0.666246 -0.921155 1 \r\n-0.277895 -0.00132203 -0.111716 1 \r\n0.513851 0.680825 -0.291958 1 \r\n0.191227 -0.686893 -0.611965 1 \r\n0.546278 0.611209 -0.617283 1 \r\n0.548997 0.310266 -0.961098 1 \r\n0.586809 -0.364074 -0.233875 1 \r\n-0.147092 -0.457164 0.104741 1 \r\n-0.203067 0.411313 -0.0153307 1 \r\n-0.287827 -0.230375 -0.294074 1 \r\n-0.413523 -0.159956 -0.447179 1 \r\n-0.008843 -0.844593 -0.076642 1 \r\n-0.0349402 -0.848317 0.184019 1 \r\n-0.138801 -0.200173 0.0995014 1 \r\n-0.226104 -0.240841 -0.953912 1 \r\n-0.177998 -0.0299906 0.0731239 1 \r\n-0.426985 -0.0672084 -0.596002 1 \r\n0.208891 -0.709308 -0.596643 1 \r\n0.482243 -0.213432 -0.946187 1 \r\n-0.599795 -0.681745 0.672551 1 \r\n-0.165504 -0.0534293 0.862796 1 \r\n0.546942 0.525944 -0.0613583 1 \r\n-0.104501 -0.0192455 0.70504 1 \r\n0.589175 -0.130087 -0.960889 1 \r\n-0.126947 0.0131618 0.131295 1 \r\n0.102306 -0.715811 -0.955651 1 \r\n0.14092 -0.979595 0.179433 1 \r\n0.125374 -0.836118 0.56672 1 \r\n0.522671 0.320248 0.0804602 1 \r\n-0.439099 0.159742 -0.280323 1 \r\n0.542999 0.0912147 -0.930792 1 \r\n0.0316517 0.667491 0.0333606 1 \r\n-0.405749 0.262419 -0.512905 1 \r\n0.111642 0.939453 -0.489253 1 \r\n0.751195 -0.039562 -0.297167 1 \r\n-0.133215 -0.0777449 0.887783 1 \r\n0.697797 0.297876 -0.724145 1 \r\n0.54248 -0.509075 -0.797347 1 \r\n-0.238988 0.02882 0.909781 1 \r\n-0.31116 -0.211635 -0.2918 1 \r\n-0.259334 0.339943 -0.117853 1 \r\n-0.44124 0.0173123 -0.597213 1 \r\n0.0464551 -0.428164 0.423553 1 \r\n0.00938356 0.75175 -0.862713 1 \r\n0.43696 -0.0163785 0.152256 1 \r\n0.413291 0.242745 -0.897719 1 \r\n0.393596 0.792893 -0.585453 1 \r\n-0.0351976 -0.377362 0.510509 1 \r\n0.291946 -0.976406 0.254902 1 \r\n0.3769 -0.525754 -0.817003 1 \r\n0.138376 0.741695 -0.912264 1 \r\n0.520731 -0.405006 -0.777778 1 \r\n-0.232084 -0.515607 -0.125106 1 \r\n0.0797412 -0.508394 -0.686509 1 \r\n-0.106901 -0.746867 -0.0724074 1 \r\n-0.387892 -0.734137 0.606421 1 \r\n-0.386205 0.026257 -0.732836 1 \r\n0.693605 0.413772 -0.293552 1 \r\n0.207461 0.317955 -0.965264 1 \r\n-0.0744472 0.674579 -0.0551863 1 \r\n0.538142 -0.535806 0.13389 1 \r\n-0.203207 -0.658724 -0.290656 1 \r\n-0.211139 -0.361461 0.00814641 1 \r\n0.200488 0.242776 -0.960291 1 \r\n-0.682593 -0.665777 0.778683 1 \r\n-0.0159044 -0.0184975 0.19506 1 \r\n0.640913 -0.73119 0.402167 1 \r\n0.523978 -0.27586 -0.721573 1 \r\n0.496937 -0.544465 -0.972924 1 \r\n0.0599664 0.966131 -0.596305 1 \r\n-0.343296 0.290799 -0.760579 1 \r\n0.140794 -0.39341 0.615791 1 \r\n-0.0100021 0.768643 -0.46551 1 \r\n-0.227545 0.520247 -0.140003 1 \r\n0.390151 0.515266 0.163411 1 \r\n0.336867 0.780441 -0.316549 1 \r\n-0.0464707 0.592634 -0.838194 1 \r\n0.55955 -0.101539 -0.732952 1 \r\n0.455825 -0.57559 -0.815802 1 \r\n0.634054 -0.106942 -0.208349 1 \r\n-0.198343 0.644694 -0.260446 1 \r\n0.150878 0.237587 0.282203 1 \r\n-0.437456 -0.717258 0.515916 1 \r\n-0.11321 -0.686287 0.42457 1 \r\n-0.241623 -0.36707 -0.0839793 1 \r\n-0.434477 -0.101364 -0.53201 1 \r\n-0.504733 -0.581585 0.677303 1 \r\n0.313665 -0.437867 0.376806 1 \r\n0.0353603 -0.860122 -0.0435115 1 \r\n-0.109051 -0.0346965 0.71552 1 \r\n-0.0759061 0.535968 -0.856856 1 \r\n0.370051 0.814943 -0.820262 1 \r\n0.533182 -0.141332 -0.0225269 1 \r\n0.669832 0.0063442 -0.697775 1 \r\n-0.0846786 -0.227454 0.154373 1 \r\n-0.259579 0.492666 -0.794676 1 \r\n-0.0461035 0.765385 -0.360935 1 \r\n0.417473 0.557696 0.109753 1 \r\n-0.520329 -0.715655 0.700059 1 \r\n0.452701 -0.980244 0.187672 1 \r\n-0.199115 0.445535 -0.0294709 1 \r\n0.470445 -0.771108 -0.41218 1 \r\n0.583686 0.460488 -0.771397 1 \r\n0.142753 -0.0985843 -0.913037 1 \r\n0.140934 0.338812 0.275333 1 \r\n-0.286256 -0.221836 -0.416258 1 \r\n-0.623129 -0.674264 0.662465 1 \r\n-0.136639 -0.294556 -0.601713 1 \r\n-0.0710707 -0.834619 -0.307064 1 \r\n-0.311081 0.0127882 -0.952205 1 \r\n-0.390601 0.307267 -0.530273 1 \r\n0.0846193 0.411573 0.249184 1 \r\n0.552535 -0.155075 -0.0619901 1 \r\n0.0587504 -0.248831 0.220991 1 \r\n0.65848 -0.816378 0.0676554 1 \r\n-0.222538 -0.229663 -0.0112599 1 \r\n0.0126978 -0.423426 0.447752 1 \r\n0.340748 -0.510872 0.574336 1 \r\n-0.0635663 0.351149 0.204036 1 \r\n0.0227341 -0.13995 0.611298 1 \r\n-0.0825534 -0.515753 0.182224 1 \r\n-0.365297 -0.751709 0.645634 1 \r\n-0.198746 -0.652244 -0.390675 1 \r\n0.299044 -0.679279 -0.593559 1 \r\n-0.543102 -0.58344 0.70257 1 \r\n0.294032 -0.438244 -0.796422 1 \r\n0.131238 -0.488208 -0.747974 1 \r\n-0.192113 0.191318 0.0882323 1 \r\n-0.264585 -0.755765 0.572136 1 \r\n0.350107 -0.486337 -0.634448 1 \r\n-0.100475 0.608832 0.0073185 1 \r\n-0.334757 -0.794922 0.705932 1 \r\n0.145316 -0.823335 0.573008 1 \r\n-0.0019291 0.752403 -0.136765 1 \r\n0.639346 0.333551 -0.798199 1 \r\n-0.296409 0.0211724 0.976264 1 \r\n0.162362 -0.349606 0.262612 1 \r\n0.376226 -0.231749 0.149496 1 \r\n0.569407 -0.262637 -0.405635 1 \r\n0.367675 -0.94785 0.468691 1 \r\n0.0448467 -0.276041 -0.958928 1 \r\n-0.10167 0.462926 -0.93423 1 \r\n-0.282973 0.302659 -0.89037 1 \r\n0.464873 0.356836 -0.946687 1 \r\n0.604366 -0.218861 -0.830153 1 \r\n0.106828 -0.884343 0.492641 1 \r\n-0.020993 -0.630626 -0.583228 1 \r\n-0.0620782 0.0859019 0.198256 1 \r\n0.310967 -0.642816 0.596895 1 \r\n0.444867 -0.436534 0.112182 1 \r\n-0.330238 0.237401 -0.16128 1 \r\n-0.186688 0.439154 0.00723863 1 \r\n0.391375 0.76332 -0.342583 1 \r\n-0.094307 -0.277413 -0.733424 1 \r\n0.290743 -0.526645 0.584308 1 \r\n-0.451645 -0.718251 0.539533 1 \r\n-0.113702 -0.61379 -0.527516 1 \r\n-0.395443 -0.707995 0.492236 1 \r\n-0.0608258 0.749487 -0.73856 1 \r\n-0.341407 -0.162064 -0.975375 1 \r\n-0.071383 -0.63868 -0.549525 1 \r\n-0.242475 0.231922 -0.0232719 1 \r\n0.192424 -0.790578 -0.522011 1 \r\n0.589808 -0.395346 -0.329053 1 \r\n0.537354 -0.613014 -0.462299 1 \r\n0.218522 0.799503 -0.279346 1 \r\n-0.186073 0.208087 -0.948087 1 \r\n0.29452 -0.53576 -0.643786 1 \r\n-0.3209 0.478979 -0.594033 1 \r\n0.0515043 -0.226169 0.623957 1 \r\n-0.390182 -0.765673 0.686974 1 \r\n0.730297 0.195811 -0.681357 1 \r\n-0.214777 -0.198748 -0.774298 1 \r\n0.671928 -0.0882221 -0.219007 1 \r\n0.615106 0.328933 -0.84527 1 \r\n-0.0794467 0.414333 0.167852 1 \r\n0.154707 0.982308 -0.683924 1 \r\n-0.0747325 -0.593573 -0.56443 1 \r\n0.622878 0.349759 -0.109784 1 \r\n-0.00226945 -0.81748 0.0327381 1 \r\n0.0719546 0.797521 -0.318586 1 \r\n0.678725 0.168199 -0.765498 1 \r\n-0.1433 -0.650826 -0.025672 1 \r\n-0.360534 -0.226384 -0.89317 1 \r\n-0.247322 -0.242625 -0.0809296 1 \r\n-0.22635 0.100346 0.721228 1 \r\n0.510675 0.67765 -0.468279 1 \r\n0.636772 0.184511 -0.955889 1 \r\n-0.0851455 -0.674061 0.170125 1 \r\n0.578891 -0.282616 -0.195859 1 \r\n0.251312 0.998101 -0.593622 1 \r\n0.643621 -0.0592132 -0.578006 1 \r\n-0.210965 0.57709 -0.165841 1 \r\n-0.0925534 -0.346828 0.724922 1 \r\n-0.250512 -0.432031 -0.157054 1 \r\n0.368889 0.197513 0.256562 1 \r\n-0.24436 0.288713 -0.968183 1 \r\n0.438973 -0.803151 -0.404665 1 \r\n0.131039 0.994148 -0.614058 1 \r\n0.477055 0.275265 -0.925126 1 \r\n-0.0451664 -0.731722 0.635382 1 \r\n-0.209076 -0.597378 -0.422485 1 \r\n0.403838 -0.448857 0.309971 1 \r\n0.532767 -0.925355 0.344089 1 \r\n0.421862 -0.433771 -0.650712 1 \r\n0.550719 0.501694 -0.789514 1 \r\n-0.106305 0.102826 0.166773 1 \r\n0.112985 -0.879488 -0.393562 1 \r\n0.421488 0.861576 -0.696944 1 \r\n0.636005 0.155239 -0.850653 1 \r\n0.029344 0.915275 -0.558023 1 \r\n0.591665 -0.391717 -0.277054 1 \r\n0.591945 -0.746622 -0.000124693 1 \r\n-0.21922 0.433747 -0.0694531 1 \r\n0.122395 -0.158397 -0.922287 1 \r\n0.526344 -0.61148 0.0304241 1 \r\n0.480874 0.342952 -0.945452 1 \r\n0.273362 -0.321066 0.21875 1 \r\n0.443383 0.694097 -0.664862 1 \r\n-0.0191615 0.560674 -0.898352 1 \r\n0.0527859 0.345505 -0.968226 1 \r\n-0.333126 0.0334065 0.912044 1 \r\n0.554268 0.448088 -0.0256554 1 \r\n-0.0313707 0.739412 -0.82302 1 \r\n0.235027 0.577329 0.154477 1 \r\n0.475073 -0.93328 0.348924 1 \r\n0.735215 0.315236 -0.529811 1 \r\n0.564437 -0.552398 -0.962276 1 \r\n-0.30887 0.383317 -0.190897 1 \r\n-0.0727848 -0.251834 0.173373 1 \r\n0.560058 -0.446282 -0.811299 1 \r\n0.18536 0.855184 -0.46202 1 \r\n0.577377 0.445016 -0.867956 1 \r\n0.650106 0.120954 -0.960514 1 \r\n-0.103317 -0.232695 -0.708629 1 \r\n-0.278158 -0.120679 -0.149799 1 \r\n-0.220625 -0.340757 -0.854921 1 \r\n-0.300007 -0.187739 -0.519012 1 \r\n0.665049 -0.728723 0.352048 1 \r\n-0.328163 0.447901 -0.664823 1 \r\n0.277357 -0.14023 -0.931191 1 \r\n-0.305904 0.489408 -0.317069 1 \r\n0.44992 0.462771 0.136598 1 \r\n0.0674616 0.483981 0.208414 1 \r\n0.619495 -0.937793 0.141174 1 \r\n0.444908 0.439683 -0.963765 1 \r\n-0.162009 -0.372074 -0.882336 1 \r\n0.532259 -0.856036 0.464779 1 \r\n0.281767 0.487851 -0.959873 1 \r\n0.158462 0.946135 -0.47631 1 \r\n-0.386908 0.341977 -0.396898 1 \r\n0.638381 -0.669787 0.308829 1 \r\n0.113193 -0.923184 0.331066 1 \r\n0.617659 -0.864144 0.373963 1 \r\n-0.165312 -0.202196 0.695328 1 \r\n-0.38251 -0.647844 0.483053 1 \r\n0.0453832 0.395447 -0.967207 1 \r\n0.711754 -0.145714 -0.877375 1 \r\n0.502436 0.308958 -0.944535 1 \r\n0.365693 0.0420502 0.219694 1 \r\n0.110171 -0.911309 0.360318 1 \r\n0.611578 -0.0803525 -0.568869 1 \r\n-0.263477 -0.279318 -0.247155 1 \r\n-0.463861 -0.0416093 -0.491636 1 \r\n-0.180415 0.321472 0.104679 1 \r\n-0.240173 0.287105 -0.0489541 1 \r\n-0.0817762 0.716033 -0.15991 1 \r\n0.624331 0.402545 -0.762363 1 \r\n-0.417453 0.211501 -0.249684 1 \r\n0.597829 -0.294996 -0.925278 1 \r\n0.382285 0.9201 -0.615978 1 \r\n0.394654 0.431226 -0.964338 1 \r\n0.577418 -0.205536 -0.290522 1 \r\n0.269751 -0.217801 0.200414 1 \r\n0.725679 0.359731 -0.412754 1 \r\n0.358502 -0.382519 0.215782 1 \r\n-0.0810208 0.707379 -0.603561 1 \r\n0.201482 -0.515887 -0.672121 1 \r\n0.150196 -0.91471 -0.324727 1 \r\n-0.0306267 0.582185 -0.873377 1 \r\n0.668712 -0.755259 0.365319 1 \r\n-0.416895 0.189222 -0.552477 1 \r\n0.179227 0.332492 -0.964107 1 \r\n0.624165 0.516439 -0.524035 1 \r\n-0.715342 -0.580606 0.694881 1 \r\n0.0817439 -0.59621 -0.983169 1 \r\n0.236733 0.666973 0.0562308 1 \r\n0.660213 0.258683 -0.796405 1 \r\n-0.39555 -0.660642 0.777853 1 \r\n0.442252 0.558962 -0.879611 1 \r\n-0.0494634 0.512527 0.138642 1 \r\n0.583322 -0.300769 -0.966484 1 \r\n-0.0903162 -0.603852 0.153574 1 \r\n0.306733 0.86555 -0.820495 1 \r\n0.177635 0.2743 0.282545 1 \r\n0.210703 0.486772 -0.958109 1 \r\n-0.576803 -0.602635 0.793501 1 \r\n0.0296139 0.937896 -0.593192 1 \r\n0.297145 -0.457104 0.466014 1 \r\n0.706534 -0.065955 -0.232541 1 \r\n-0.333615 -0.0517909 -0.906011 1 \r\n0.577408 0.615909 -0.354913 1 \r\n0.00999475 -0.709028 -0.92226 1 \r\n0.320109 -0.465641 -0.658591 1 \r\n-0.265357 -0.198777 -0.13276 1 \r\n0.613923 -0.258786 -0.914343 1 \r\n0.63809 -0.889523 0.298535 1 \r\n0.267717 -0.839993 0.579327 1 \r\n0.497559 -0.204545 -0.681218 1 \r\n-0.200829 0.384365 0.0138193 1 \r\n0.357807 0.585298 -0.921878 1 \r\n0.24217 -0.0530589 0.222132 1 \r\n0.620647 0.558879 -0.305874 1 \r\n0.579078 -0.328376 -0.359283 1 \r\n-0.0115586 -0.340337 0.488791 1 \r\n0.0570517 -0.588382 -0.801782 1 \r\n0.160372 0.656534 0.0684649 1 \r\n0.423501 0.746769 -0.33162 1 \r\n-0.337443 -0.0685657 -0.795923 1 \r\n0.565381 -0.500894 -0.0934802 1 \r\n0.276942 -0.633727 0.597185 1 \r\n0.44853 -0.211175 -0.943612 1 \r\n-0.326938 -0.142614 -0.826468 1 \r\n-0.0978424 -0.404485 -0.707237 1 \r\n0.522225 -0.633722 -0.0499326 1 \r\n-0.13386 -0.717999 -0.0879474 1 \r\n0.441474 -0.158466 0.0908058 1 \r\n-0.252634 0.032016 0.944626 1 \r\n-0.504465 -0.615259 0.779181 1 \r\n-0.2462 -0.306475 -0.0925515 1 \r\n0.52209 -0.636207 -0.885616 1 \r\n0.646329 -0.90815 0.153968 1 \r\n0.722992 0.255166 -0.68725 1 \r\n-0.0837312 -0.524749 -0.881109 1 \r\n-0.122049 0.26079 -0.912987 1 \r\n-0.0950407 -0.328222 -0.744346 1 \r\n0.621207 -0.617493 0.226408 1 \r\n-0.339595 0.439631 -0.590257 1 \r\n0.455181 0.158175 0.196429 1 \r\n0.469356 0.697802 -0.587085 1 \r\n-0.159901 0.247383 -0.93425 1 \r\n0.439367 -0.46115 0.282213 1 \r\n0.527683 -0.208274 -0.776382 1 \r\n0.440478 0.349406 0.196295 1 \r\n0.0557765 -0.592642 0.544524 1 \r\n-0.328885 -0.176095 -0.835238 1 \r\n0.0872664 0.520589 -0.963559 1 \r\n0.145437 0.574008 -0.963016 1 \r\n-0.00663692 -0.492316 0.568255 1 \r\n0.378851 0.769193 -0.382981 1 \r\n-0.148863 -0.183721 0.0894567 1 \r\n-0.015732 -0.779826 -0.476508 1 \r\n-0.159173 0.676156 -0.484433 1 \r\n0.0888624 0.192574 -0.919332 1 \r\n-0.448712 -0.0677978 -0.536269 1 \r\n0.344297 0.448482 0.218729 1 \r\n-0.188358 0.157646 -0.938556 1 \r\n0.380304 0.106251 0.234501 1 \r\n-0.169197 -0.221446 0.773246 1 \r\n0.601471 -0.589872 -0.312206 1 \r\n0.387536 0.763818 -0.434804 1 \r\n-0.00928611 -0.16375 0.671306 1 \r\n-0.0129128 0.750401 -0.592087 1 \r\n0.0119642 0.321483 -0.962272 1 \r\n0.0641991 0.782205 -0.156312 1 \r\n-0.277078 -0.139462 -0.698365 1 \r\n0.52044 -0.391901 -0.572808 1 \r\n0.559217 -0.264703 -0.493103 1 \r\n-0.268116 0.542785 -0.668333 1 \r\n0.512149 -0.572061 0.324415 1 \r\n0.584505 -0.617703 -0.35723 1 \r\n-0.00775033 -0.355742 0.785366 1 \r\n0.203865 0.32388 0.276184 1 \r\n0.193204 0.842867 -0.856293 1 \r\n0.536129 -0.978938 0.154601 1 \r\n-0.0360069 0.763652 -0.420637 1 \r\n-0.258534 0.0971605 0.738058 1 \r\n0.410271 0.740533 -0.560151 1 \r\n0.183149 -0.940905 0.464416 1 \r\n0.54139 -0.822095 0.479307 1 \r\n-0.133068 0.655216 -0.122213 1 \r\n-0.0952233 -0.361123 0.64194 1 \r\n0.0240748 -0.618746 -0.827269 1 \r\n0.595816 -0.162265 -0.297158 1 \r\n0.0799446 -0.6939 -0.594419 1 \r\n-0.224769 0.565344 -0.726422 1 \r\n0.155777 -0.422909 0.459135 1 \r\n-0.0968348 -0.0569211 0.140344 1 \r\n0.66535 0.353121 -0.744277 1 \r\n-0.247374 0.237754 -0.97888 1 \r\n-0.219411 0.598756 -0.645892 1 \r\n-0.118667 -0.291757 -0.647445 1 \r\n0.639055 0.287727 -0.820545 1 \r\n-0.14321 -0.28291 0.119601 1 \r\n0.0874158 0.324264 0.273486 1 \r\n-0.0115192 -0.324359 -0.969127 1 \r\n-0.449925 -0.677159 0.805735 1 \r\n-0.50305 -0.594122 0.742375 1 \r\n0.442833 0.749187 -0.720409 1 \r\n0.0173829 -0.373617 -0.979533 1 \r\n-0.402772 -0.72822 0.530827 1 \r\n0.541951 0.632408 -0.553281 1 \r\n0.0403412 0.137297 0.258181 1 \r\n0.247472 0.922373 -0.468198 1 \r\n-0.368271 0.316699 -0.648987 1 \r\n0.159127 -0.603844 -0.840235 1 \r\n0.119311 -0.895853 0.471275 1 \r\n0.504398 -0.953691 0.058856 1 \r\n0.219034 0.447548 -0.954425 1 \r\n0.490192 0.426878 0.087039 1 \r\n0.405934 0.722529 -0.135172 1 \r\n-0.252649 -0.366453 -0.145106 1 \r\n0.505664 -0.509446 0.117609 1 \r\n-0.00455958 -0.583987 -0.823107 1 \r\n-0.170245 -0.315284 -0.519109 1 \r\n0.58518 0.201653 -0.960401 1 \r\n0.540654 -0.546376 -0.809515 1 \r\n0.523563 0.543719 -0.790471 1 \r\n-0.200138 -0.519655 -0.456693 1 \r\n0.0836626 0.971703 -0.655286 1 \r\n-0.216214 -0.126092 0.855045 1 \r\n0.0486072 -0.6375 0.567186 1 \r\n0.435601 0.713916 -0.619822 1 \r\n0.729882 0.336695 -0.314545 1 \r\n-0.32754 -0.10716 -0.976135 1 \r\n0.50693 0.16134 -0.919603 1 \r\n-0.259694 0.0268277 0.965919 1 \r\n-0.0271837 0.871838 -0.715564 1 \r\n0.0249195 0.499878 -0.957173 1 \r\n0.381912 -0.540247 -0.971879 1 \r\n-0.00928402 0.690278 -0.869676 1 \r\n0.502219 -0.984056 0.124561 1 \r\n0.193738 -0.945893 0.440374 1 \r\n-0.101535 0.315153 0.183085 1 \r\n-0.308334 0.442858 -0.752921 1 \r\n0.571846 -0.252048 -0.363464 1 \r\n0.229194 0.285673 -0.965925 1 \r\n0.413893 -0.430931 0.263245 1 \r\n0.534345 -0.657457 -0.0874493 1 \r\n0.643434 -0.144337 -0.321027 1 \r\n-0.243131 -0.509238 -0.183769 1 \r\n0.764052 0.0602094 -0.311206 1 \r\n0.46231 -0.535144 0.475945 1 \r\n0.597694 -0.659052 0.370072 1 \r\n0.102317 -0.946574 0.0967723 1 \r\n-0.0720336 -0.144063 -0.908155 1 \r\n0.37854 -0.686084 -0.556883 1 \r\n0.415844 -0.843178 -0.103442 1 \r\n-0.387179 0.139892 -0.719424 1 \r\n0.541006 -0.721829 -0.348626 1 \r\n-0.057773 -0.163982 0.821144 1 \r\n0.191746 0.24869 0.282991 1 \r\n0.513809 0.030117 -0.914195 1 \r\n0.0385076 -0.653192 -0.841476 1 \r\n0.137673 -0.418894 0.360059 1 \r\n0.558636 -0.440424 -0.473144 1 \r\n0.604626 -0.0542967 -0.716518 1 \r\n0.0359207 -0.720241 -0.947 1 \r\n0.547616 0.593693 -0.137152 1 \r\n-0.558697 -0.735267 0.767155 1 \r\n-0.483891 -0.709628 0.563814 1 \r\n0.0848891 -0.507768 -0.746584 1 \r\n-0.00411439 0.909443 -0.693512 1 \r\n0.221317 -0.92148 0.0199645 1 \r\n-0.253247 -0.452963 -0.209057 1 \r\n0.582181 -0.325773 -0.315997 1 \r\n0.0271213 -0.230347 0.658656 1 \r\n-0.125547 -0.397588 -0.879307 1 \r\n0.411382 -0.681482 -0.541541 1 \r\n0.0870039 -0.734602 -0.928108 1 \r\n0.358326 -0.588181 -0.876258 1 \r\n-0.148481 0.549146 -0.805596 1 \r\n-0.136439 -0.0420835 -0.904513 1 \r\n-0.447449 0.150455 -0.385698 1 \r\n0.577677 -0.182174 -0.131739 1 \r\n0.417327 -0.407757 0.138206 1 \r\n0.294333 -0.436291 -0.70801 1 \r\n-0.672564 -0.637378 0.593273 1 \r\n0.500455 -0.555392 0.0231293 1 \r\n0.170054 0.77793 -0.130529 1 \r\n0.327196 0.904068 -0.776074 1 \r\n-0.235915 0.538499 -0.755579 1 \r\n-0.418118 -0.679152 0.486269 1 \r\n-0.0126253 -0.524104 0.366378 1 \r\n-0.148594 0.189481 0.134055 1 \r\n0.637001 0.164204 -0.831524 1 \r\n-0.113851 -0.0956954 0.949576 1 \r\n0.378166 0.549613 -0.929448 1 \r\n-0.117091 -0.73442 0.669905 1 \r\n0.637519 0.234174 -0.127893 1 \r\n0.456842 0.371581 0.17027 1 \r\n0.721549 -0.0726344 -0.423614 1 \r\n0.428192 0.825434 -0.650288 1 \r\n0.74856 0.0212035 -0.450118 1 \r\n0.555461 0.640823 -0.367746 1 \r\n0.562247 -0.136954 -0.757553 1 \r\n-0.0725192 -0.651255 0.306494 1 \r\n0.208633 -0.450372 0.514183 1 \r\n0.157173 -0.271984 -0.966125 1 \r\n0.191483 -0.94125 0.405705 1 \r\n-0.0346113 -0.138808 0.165403 1 \r\n0.169232 -0.519408 -0.672711 1 \r\n0.210679 -0.866617 0.570165 1 \r\n0.193191 -0.765844 -0.55009 1 \r\n0.579234 -0.288743 -0.314403 1 \r\n0.490109 -0.924342 0.391137 1 \r\n-0.202156 -0.257055 -0.942411 1 \r\n-0.261021 0.0841378 -0.0565964 1 \r\n0.472925 -0.328145 0.0466635 1 \r\n0.30527 0.82973 -0.496603 1 \r\n0.655201 -0.783052 0.0455221 1 \r\n0.348115 0.940324 -0.684089 1 \r\n-0.0765609 -0.0172729 0.163349 1 \r\n0.70365 -0.696032 0.224924 1 \r\n-0.587095 -0.582905 0.744202 1 \r\n-0.65191 -0.625842 0.588645 1 \r\n0.396252 0.666848 -0.0096432 1 \r\n0.211398 -0.445175 0.46754 1 \r\n-0.00420362 -0.392817 0.471566 1 \r\n0.0454952 0.252478 0.270882 1 \r\n-0.257805 0.141593 -0.0524904 1 \r\n0.591437 0.405118 -0.830879 1 \r\n0.17166 -0.423284 0.550273 1 \r\n-0.316011 -0.318302 -0.902782 1 \r\n-0.34471 0.347549 -0.211676 1 \r\n0.0813455 0.164671 -0.91123 1 \r\n-0.0686975 -0.587069 0.269813 1 \r\n-0.507607 -0.59435 0.603422 1 \r\n0.709917 0.391297 -0.491473 1 \r\n0.178091 -0.429482 0.489445 1 \r\n0.106477 -0.41174 0.434324 1 \r\n-0.168786 0.0485771 0.667944 1 \r\n0.266752 0.0472386 0.249952 1 \r\n-0.33543 0.316761 -0.181114 1 \r\n-0.00177652 0.644393 -0.894333 1 \r\n-0.184043 0.648876 -0.22332 1 \r\n0.510271 0.668353 -0.199845 1 \r\n0.539502 -0.619805 0.451829 1 \r\n-0.303023 -0.22601 -0.366456 1 \r\n-0.286551 -0.239153 -0.821473 1 \r\n0.679202 0.0459415 -0.948552 1 \r\n0.0052101 0.923255 -0.649499 1 \r\n0.231688 0.511126 -0.960847 1 \r\n0.549858 0.411137 -0.00984454 1 \r\n0.0834498 -0.656423 0.576308 1 \r\n0.658304 0.0241506 -0.758401 1 \r\n0.626406 -0.726993 0.0162071 1 \r\n0.458346 0.690164 -0.643115 1 \r\n0.672696 0.471062 -0.463636 1 \r\n0.239107 -0.952486 0.359239 1 \r\n0.229698 0.422904 -0.955166 1 \r\n0.361117 -0.87049 -0.0664501 1 \r\n0.714016 0.293279 -0.692069 1 \r\n-0.132278 -0.0943879 0.836035 1 \r\n-0.254727 -0.395065 -0.184455 1 \r\n0.636938 -0.823042 0.0418177 1 \r\n0.162743 -0.390387 0.313094 1 \r\n-0.0863513 -0.140499 0.13555 1 \r\n0.400434 -0.770809 -0.475289 1 \r\n0.111832 -0.906068 0.378425 1 \r\n0.499282 0.50463 0.0306731 1 \r\n0.0628989 -0.848218 0.494602 1 \r\n0.643694 -0.144775 -0.801529 1 \r\n0.189732 -0.00495589 0.239752 1 \r\n0.618914 0.526525 -0.207721 1 \r\n-0.179873 0.423775 0.0377811 1 \r\n0.742614 0.288059 -0.537059 1 \r\n0.306816 -0.842338 -0.433755 1 \r\n0.608143 -0.0571877 -0.655396 1 \r\n0.596303 0.489428 -0.71651 1 \r\n-0.182752 -0.54789 -0.00341201 1 \r\n-0.248406 -0.498593 -0.226467 1 \r\n0.118471 -0.917487 -0.298467 1 \r\n0.681049 0.323745 -0.741286 1 \r\n-0.231637 -0.490425 -0.400123 1 \r\n-0.315434 0.206852 -0.835765 1 \r\n-0.565863 -0.715069 0.742925 1 \r\n0.519319 0.103438 -0.919763 1 \r\n0.038766 -0.450479 0.70367 1 \r\n0.234451 -0.996165 0.127197 1 \r\n-0.345163 0.392459 -0.26052 1 \r\n-0.168201 0.461131 0.032572 1 \r\n-0.035207 0.730343 -0.640908 1 \r\n-0.217809 -0.0488542 0.727391 1 \r\n0.317608 0.92698 -0.500999 1 \r\n-0.116725 0.690777 -0.165066 1 \r\n0.0977467 0.569391 -0.963192 1 \r\n-0.253973 -0.35245 -0.981669 1 \r\n-0.0118408 -0.61367 -0.849195 1 \r\n0.759652 0.0407739 -0.403383 1 \r\n-0.0276039 -0.851754 0.155411 1 \r\n0.524757 0.458309 0.0144285 1 \r\n-0.278185 -0.646588 0.45901 1 \r\n0.0511702 -0.237012 -0.938746 1 \r\n0.215992 0.469422 0.232685 1 \r\n-0.31864 -0.207933 -0.985267 1 \r\n0.446652 0.543449 0.0830336 1 \r\n-0.0675789 0.144789 -0.894382 1 \r\n-0.0121729 0.710419 -0.0463402 1 \r\n0.557692 -0.193996 -0.0882649 1 \r\n0.0550095 -0.210363 0.580064 1 \r\n-0.327973 0.253225 -0.8035 1 \r\n0.534822 -0.788504 0.499541 1 \r\n-0.0987887 -0.495644 -0.5727 1 \r\n0.649453 0.510389 -0.434987 1 \r\n-0.198484 -0.392234 -0.957566 1 \r\n0.278405 -0.453826 -0.686188 1 \r\n0.163095 -0.912016 0.00914991 1 \r\n0.451238 -0.424516 -0.685776 1 \r\n0.631293 -0.487617 -0.885693 1 \r\n-0.175445 -0.404285 -0.493104 1 \r\n0.151901 0.248182 -0.966969 1 \r\n0.428129 0.668093 -0.802975 1 \r\n0.567892 -0.238987 -0.826323 1 \r\n0.506016 0.396578 -0.963299 1 \r\n-0.203666 0.616926 -0.212162 1 \r\n-0.175677 -0.715315 -0.226819 1 \r\n-0.235931 -0.186412 -0.952947 1 \r\n-0.304518 -0.167847 -0.574441 1 \r\n0.0644658 -0.287414 0.646236 1 \r\n-0.0316 0.434775 0.194863 1 \r\n0.657277 -0.000127673 -0.726513 1 \r\n0.497362 -0.572207 0.473952 1 \r\n-0.15443 -0.317365 -0.820171 1 \r\n-0.110405 -0.285015 0.155213 1 \r\n0.569739 -0.270866 -0.15048 1 \r\n0.460837 -0.650314 0.567104 1 \r\n0.0958136 -0.14579 0.208228 1 \r\n0.556758 -0.01036 -0.00776196 1 \r\n0.0513954 0.789396 -0.200348 1 \r\n0.49235 0.460913 -0.954667 1 \r\n-0.444396 0.146802 -0.440629 1 \r\n-0.145141 -0.270431 -0.927119 1 \r\n0.729903 0.0418738 -0.197893 1 \r\n-0.160377 -0.752651 0.502488 1 \r\n0.579732 0.59609 -0.441224 1 \r\n0.563856 -0.678403 0.00688779 1 \r\n0.248271 0.763973 -0.893547 1 \r\n0.705175 -0.00036633 -0.911973 1 \r\n0.45459 -0.260914 0.0718268 1 \r\n-0.0635725 -0.0149508 0.659829 1 \r\n0.697891 0.358714 -0.65601 1 \r\n0.525441 -0.346497 -0.729988 1 \r\n0.383593 -0.613029 -0.887145 1 \r\n0.0226998 0.777587 -0.513107 1 \r\n-0.299047 -0.315564 -0.872181 1 \r\n-0.290384 -0.16591 -0.205303 1 \r\n-0.371448 -0.785258 0.703899 1 \r\n0.151378 0.200595 -0.933691 1 \r\n0.758719 0.126796 -0.49685 1 \r\n0.0355566 0.798341 -0.853479 1 \r\n0.0349432 -0.539325 -0.646322 1 \r\n0.338807 -0.686827 0.593803 1 \r\n-0.160529 0.680317 -0.446179 1 \r\n-0.274909 0.506249 -0.232616 1 \r\n-0.210208 -0.63974 -0.340013 1 \r\n-0.229288 -0.109941 0.826613 1 \r\n0.659352 0.439579 -0.627991 1 \r\n-0.126501 -0.333177 -0.82433 1 \r\n0.133554 -0.360809 0.558252 1 \r\n-0.374067 0.273854 -0.662433 1 \r\n0.227483 0.800001 -0.355496 1 \r\n0.437666 -0.575225 -0.57104 1 \r\n0.530547 -0.435102 -0.788931 1 \r\n-0.328873 0.463819 -0.536867 1 \r\n0.158492 -0.859631 0.566553 1 \r\n0.258731 0.543698 0.180252 1 \r\n0.0677625 0.922736 -0.515917 1 \r\n0.629903 0.191826 -0.963921 1 \r\n0.257818 -0.842954 -0.445963 1 \r\n0.594166 -0.622422 0.0550479 1 \r\n0.557059 0.606996 -0.579477 1 \r\n-0.00527763 0.112674 -0.901142 1 \r\n0.255006 0.541862 -0.961051 1 \r\n0.116438 0.593672 -0.962892 1 \r\n-0.0626583 0.0419568 0.187225 1 \r\n-0.385412 -0.0824818 -0.657969 1 \r\n0.57168 -0.487727 -0.814358 1 \r\n0.177398 0.975657 -0.49716 1 \r\n0.159995 -0.897546 -0.0319167 1 \r\n0.238322 -0.454706 0.488002 1 \r\n-0.0982409 0.618161 -0.747119 1 \r\n0.679119 -0.124097 -0.288365 1 \r\n-0.306158 -0.127752 -0.195115 1 \r\n0.714691 -0.100277 -0.326672 1 \r\n0.502706 -0.703494 -0.0484809 1 \r\n-0.226949 0.271239 0.0184556 1 \r\n0.615386 -0.573803 -0.896704 1 \r\n-0.224499 0.473023 -0.100944 1 \r\n-0.069815 -0.681833 0.323336 1 \r\n-0.272559 -0.747235 0.534324 1 \r\n-0.459298 -0.578265 0.668421 1 \r\n-0.11937 0.682735 -0.608705 1 \r\n-0.186488 -0.168647 -0.740965 1 \r\n-0.263242 -0.243154 -0.154979 1 \r\n0.210884 -0.439622 -0.761161 1 \r\n0.560172 -0.671444 -0.373136 1 \r\n-0.53496 -0.700984 0.668836 1 \r\n0.508279 -0.0382369 0.068029 1 \r\n0.657111 0.299111 -0.791173 1 \r\n0.499448 -0.157381 -0.693174 1 \r\n-0.153696 -0.718512 0.693429 1 \r\n0.508393 -0.196831 -0.943843 1 \r\n-0.198406 -0.669773 -0.259151 1 \r\n0.211482 -0.94784 0.377512 1 \r\n-0.334241 -0.214831 -0.368114 1 \r\n0.58464 0.138833 -0.0645532 1 \r\n0.581724 0.57103 -0.573462 1 \r\n-0.0413966 0.707722 -0.0758285 1 \r\n0.526832 0.19881 0.109027 1 \r\n0.606099 0.52281 -0.167216 1 \r\n0.00329351 0.69225 -0.0092572 1 \r\n0.530599 0.495447 -0.915144 1 \r\n-0.161052 -0.749002 -0.25081 1 \r\n0.688469 0.433654 -0.499485 1 \r\n0.455503 0.633549 -0.0373031 1 \r\n0.619163 0.478045 -0.678886 1 \r\n-0.0610541 -0.751384 0.0886889 1 \r\n-0.681177 -0.579913 0.824517 1 \r\n0.40446 -0.864007 -0.319704 1 \r\n-0.101021 -0.314472 -0.782482 1 \r\n-0.214861 0.0134003 0.841275 1 \r\n0.386633 -0.939076 0.0579326 1 \r\n0.505944 -0.566582 0.045107 1 \r\n0.720149 -0.0466876 -0.469784 1 \r\n-0.231892 -0.563972 -0.251264 1 \r\n-0.20227 -0.1578 0.812376 1 \r\n-0.00742662 -0.122839 0.655294 1 \r\n0.5557 0.485216 -0.896117 1 \r\n0.272739 -0.458859 0.492589 1 \r\n-0.278723 0.254522 -0.922169 1 \r\n-0.328313 0.0518562 -0.158635 1 \r\n-0.0444162 -0.192987 0.885957 1 \r\n0.539574 -0.69281 -0.125906 1 \r\n-0.204152 0.127875 -0.949951 1 \r\n-0.350566 -0.119273 -0.944813 1 \r\n0.556706 -0.510068 -0.467404 1 \r\n0.498151 0.539184 0.00500858 1 \r\n0.586985 -0.281667 -0.898116 1 \r\n-0.270413 0.175473 -0.106384 1 \r\n-0.0146487 -0.869115 -0.302429 1 \r\n0.238019 -0.93299 -0.121244 1 \r\n0.353833 -0.826256 -0.435725 1 \r\n-0.0423388 -0.404875 0.709865 1 \r\n0.414598 0.800862 -0.616404 1 \r\n-0.0416726 -0.210711 0.175054 1 \r\n0.273798 -0.191261 -0.95619 1 \r\n0.599313 0.368759 -0.87298 1 \r\n-0.011211 -0.317611 0.809906 1 \r\n-0.291423 -0.793769 0.692505 1 \r\n0.346756 -0.531999 -0.841931 1 \r\n-0.125755 -0.227063 -0.916387 1 \r\n0.586186 -0.653074 -0.257368 1 \r\n0.367644 -0.373479 0.172605 1 \r\n0.160555 0.519853 -0.963369 1 \r\n-0.3242 -0.21413 -0.401496 1 \r\n0.438392 -0.300482 0.0902765 1 \r\n0.496999 -0.919607 0.0311608 1 \r\n-0.113026 0.351357 0.164967 1 \r\n-0.145618 -0.773789 0.606358 1 \r\n0.187089 -0.301452 0.235643 1 \r\n0.114682 0.374756 0.26616 1 \r\n0.120612 -0.518246 -0.673279 1 \r\n-0.0290982 -0.812942 0.338154 1 \r\n0.466824 -0.974112 0.0938876 1 \r\n0.389923 0.330697 -0.939395 1 \r\n0.175473 -0.985912 0.198505 1 \r\n0.402032 -0.967729 0.249454 1 \r\n0.706275 0.355528 -0.621916 1 \r\n0.253179 -0.913811 -0.0772761 1 \r\n-0.152055 -0.182418 -0.70042 1 \r\n0.135368 -0.650312 0.582202 1 \r\n0.395204 -0.845575 -0.0665383 1 \r\n0.00959313 -0.858122 0.336244 1 \r\n0.113491 -0.404816 0.678362 1 \r\n0.137843 -0.435276 -0.973262 1 \r\n-0.181405 0.671341 -0.303487 1 \r\n0.607054 -0.115027 -0.181467 1 \r\n0.687805 0.15116 -0.150647 1 \r\n-0.100945 0.641633 -0.0351698 1 \r\n-0.144757 0.702295 -0.295248 1 \r\n-0.155369 0.693547 -0.354662 1 \r\n0.119581 0.837512 -0.85391 1 \r\n0.629094 -0.460289 -0.911485 1 \r\n0.632809 0.150642 -0.127732 1 \r\n0.729986 0.255217 -0.20924 1 \r\n-0.223987 0.263218 -0.977698 1 \r\n-0.349109 0.431049 -0.421559 1 \r\n0.222842 -0.956979 0.431906 1 \r\n0.658781 -0.624514 0.092715 1 \r\n-0.0558824 -0.548207 -0.983566 1 \r\n0.618779 -0.484849 -0.862601 1 \r\n0.660161 0.404361 -0.179496 1 \r\n-0.18047 -0.686577 -0.179261 1 \r\n0.248883 -0.612568 -0.939703 1 \r\n0.362445 0.849757 -0.529661 1 \r\n0.646142 0.373781 -0.756571 1 \r\n-0.222472 0.158933 0.0390159 1 \r\n0.477086 -0.550949 0.464157 1 \r\n0.600101 -0.552861 -0.21033 1 \r\n-0.467072 -0.795848 0.778569 1 \r\n-0.198209 -0.567655 -0.456542 1 \r\n0.118082 -0.346728 0.601741 1 \r\n-0.31297 0.342993 -0.804058 1 \r\n0.187735 0.970676 -0.721141 1 \r\n0.227725 -0.811776 -0.490934 1 \r\n-0.0218585 0.890797 -0.675393 1 \r\n-0.36533 -0.170601 -0.924942 1 \r\n0.749162 0.103407 -0.530207 1 \r\n0.201511 0.827842 -0.45967 1 \r\n0.518313 -0.598857 0.489455 1 \r\n0.40499 -0.0759549 0.147192 1 \r\n0.505965 -0.226784 -0.693419 1 \r\n0.154933 -0.35459 -0.967125 1 \r\n0.103891 -0.290678 0.233194 1 \r\n-0.137757 0.0282285 0.651154 1 \r\n0.572956 -0.27916 -0.381795 1 \r\n-0.0654278 0.476281 -0.930303 1 \r\n-0.321272 -0.224958 -0.839311 1 \r\n0.603401 -0.157392 -0.965616 1 \r\n-0.278065 -0.0131327 0.961716 1 \r\n0.338704 -0.204023 0.167665 1 \r\n0.56921 0.18917 0.00622785 1 \r\n0.606057 -0.538403 -0.25309 1 \r\n0.245656 0.798413 -0.321601 1 \r\n0.559217 -0.388143 -0.968174 1 \r\n0.403381 -0.20351 0.12425 1 \r\n-0.225468 -0.0619745 0.748196 1 \r\n0.0562963 0.361754 0.259872 1 \r\n0.581807 0.494108 -0.736266 1 \r\n0.0339907 0.792851 -0.32976 1 \r\n0.573558 -0.27122 -0.863423 1 \r\n0.632829 0.439921 -0.705872 1 \r\n-0.095409 0.00615752 -0.900369 1 \r\n0.203007 -0.158219 -0.935439 1 \r\n0.0911846 -0.599462 0.57003 1 \r\n0.567737 -0.963321 0.192351 1 \r\n0.511537 0.280941 0.123285 1 \r\n-0.26868 0.520029 -0.736216 1 \r\n0.0257828 -0.568184 0.503661 1 \r\n0.738277 0.120394 -0.618644 1 \r\n-0.343757 0.440212 -0.461639 1 \r\n-0.255484 -0.182244 -0.576825 1 \r\n0.440104 0.740595 -0.761647 1 \r\n0.508216 -0.877235 0.010803 1 \r\n0.0743599 -0.356837 0.732009 1 \r\n-0.177484 0.0478092 -0.914771 1 \r\n0.228863 -0.735623 -0.576037 1 \r\n-0.0788147 -0.201433 0.568639 1 \r\n-0.703441 -0.564966 0.758345 1 \r\n0.072463 -0.439525 0.40116 1 \r\n0.0979584 -0.887256 -0.0373135 1 \r\n0.0510612 0.705594 -0.0140004 1 \r\n0.200437 -0.448423 -0.971486 1 \r\n-0.00580996 -0.467528 0.303931 1 \r\n0.184079 0.468883 0.231513 1 \r\n0.367146 0.018433 -0.902188 1 \r\n0.27028 -0.156477 0.191168 1 \r\n0.582544 -0.302225 -0.273036 1 \r\n-0.291941 0.350392 -0.851375 1 \r\n0.242616 0.184594 0.277035 1 \r\n-0.112939 -0.702247 -0.0257571 1 \r\n0.587058 -0.0711173 -0.952716 1 \r\n0.434895 0.692499 -0.106759 1 \r\n-0.326114 -0.139652 -0.214862 1 \r\n-0.251764 -0.185136 -0.78097 1 \r\n0.346849 0.774526 -0.856014 1 \r\n-0.24537 -0.318155 -0.84357 1 \r\n-0.476521 -0.0659944 -0.394396 1 \r\n-0.176709 -0.0023607 0.669313 1 \r\n0.199319 -0.23142 -0.967853 1 \r\n0.730235 0.326411 -0.28426 1 \r\n-0.383011 0.14177 -0.17667 1 \r\n-0.0785699 0.473895 0.139451 1 \r\n0.260319 -0.600103 -0.637496 1 \r\n-0.0625141 -0.542537 -0.858525 1 \r\n-0.665542 -0.709434 0.843454 1 \r\n-0.0606162 -0.71248 0.649276 1 \r\n0.20854 -0.43783 0.425805 1 \r\n0.161668 -0.430639 0.405072 1 \r\n-0.0989817 -0.161192 0.592858 1 \r\n0.610353 -0.795557 0.0157018 1 \r\n-0.689239 -0.618742 0.616621 1 \r\n-0.188613 -0.780079 0.639086 1 \r\n-0.245723 -0.0311776 0.766221 1 \r\n0.234639 -0.504258 -0.670019 1 \r\n-0.327047 0.0172708 -0.848763 1 \r\n0.446797 0.49857 -0.944314 1 \r\n0.567073 0.474071 -0.877946 1 \r\n0.572261 -0.429183 -0.108989 1 \r\n-0.329582 0.142838 -0.821424 1 \r\n-0.400282 0.268448 -0.24736 1 \r\n0.14594 0.966795 -0.724219 1 \r\n0.562445 0.113742 -0.944117 1 \r\n0.576318 -0.652775 0.425047 1 \r\n-0.236997 0.613201 -0.320701 1 \r\n0.525338 0.580193 -0.0803652 1 \r\n-0.113779 -0.10912 0.774709 1 \r\n0.388159 -0.0330641 0.175904 1 \r\n0.253252 -0.474676 0.551507 1 \r\n0.730639 0.336404 -0.500496 1 \r\n0.568525 -0.353692 -0.860768 1 \r\n0.651393 -0.0184507 -0.700185 1 \r\n0.374939 0.289782 -0.924052 1 \r\n-0.0191398 -0.743486 0.611744 1 \r\n0.519257 -0.727182 -0.114021 1 \r\n0.0374534 -0.622374 -0.617259 1 \r\n0.157149 -0.134718 -0.919308 1 \r\n-0.0842905 -0.668069 0.405861 1 \r\n-0.546266 -0.682805 0.529187 1 \r\n-0.189322 0.650889 -0.473862 1 \r\n0.325131 -0.328654 0.18652 1 \r\n0.137522 -0.61433 0.582876 1 \r\n0.0506441 0.794647 -0.261894 1 \r\n-0.0991073 -0.25034 0.153221 1 \r\n0.394053 -0.221212 0.135726 1 \r\n-0.0201483 0.506176 -0.926498 1 \r\n-0.0920917 -0.463722 -0.864625 1 \r\n-0.270121 -0.173706 -0.143614 1 \r\n-0.200271 -0.154944 0.767539 1 \r\n-0.110751 -0.503945 -0.97594 1 \r\n-0.0652919 -0.0455109 0.615957 1 \r\n0.352473 0.787103 -0.532262 1 \r\n-0.164461 -0.212674 -0.765587 1 \r\n0.550719 -0.954867 0.240904 1 \r\n0.194628 1 -0.552778 1 \r\n0.441878 -0.882167 0.018078 1 \r\n0.578871 -0.077557 -0.0937728 1 \r\n-0.21339 -0.760126 0.555347 1 \r\n-0.269701 0.452498 -0.832975 1 \r\n0.0733232 0.278523 0.275759 1 \r\n-0.321872 -0.591561 0.686601 1 \r\n0.331596 -0.446285 -0.679329 1 \r\n-0.276623 0.30735 -0.90962 1 \r\n0.0463233 -0.377214 0.452763 1 \r\n0.745509 -0.0214568 -0.428232 1 \r\n0.320617 -0.9258 0.53753 1 \r\n0.0366544 0.883699 -0.538685 1 \r\n-0.0737821 -0.63096 0.399012 1 \r\n0.604864 -0.500419 -0.269719 1 \r\n-0.208484 -0.655075 0.702871 1 \r\n-0.289734 -0.66648 0.459052 1 \r\n-0.310346 -0.279476 -0.858642 1 \r\n0.235333 0.613128 0.120846 1 \r\n0.386862 0.584011 0.1091 1 \r\n-0.0637022 -0.76195 0.254684 1 \r\n0.357765 0.493237 0.19203 1 \r\n0.625161 -0.190184 -0.81631 1 \r\n0.226318 -0.185779 -0.954191 1 \r\n0.0219383 -0.353875 0.238538 1 \r\n-0.222848 0.0151125 0.878236 1 \r\n-0.421403 0.240752 -0.316976 1 \r\n0.373434 -0.896261 -0.177386 1 \r\n0.679275 -0.660033 0.0783434 1 \r\n-0.0695048 -0.288677 0.189705 1 \r\n0.703888 -0.711531 0.248416 1 \r\n0.165664 -0.546405 -0.81196 1 \r\n0.443466 0.774225 -0.733735 1 \r\n0.579213 0.206292 -0.0516623 1 \r\n-0.0881921 -0.427705 -0.711257 1 \r\n-0.434088 0.0726302 -0.217752 1 \r\n-0.157374 -0.741591 0.477055 1 \r\n0.709647 0.0909761 -0.690622 1 \r\n0.150631 -0.167747 -0.930652 1 \r\n0.601533 -0.504174 -0.330575 1 \r\n-0.110054 -0.732312 -0.447507 1 \r\n-0.259037 0.573292 -0.531149 1 \r\n-0.419112 -0.725987 0.545447 1 \r\n-0.296277 0.176355 -0.887086 1 \r\n0.299812 0.611987 -0.939209 1 \r\n-0.237864 -0.265011 -0.0544246 1 \r\n0.585408 -0.377139 -0.195885 1 \r\n-0.137816 -0.369039 -0.601495 1 \r\n-0.0058037 -0.873684 0.251654 1 \r\n-0.146016 -0.418501 -0.544611 1 \r\n-0.0344764 -0.817053 -0.417653 1 \r\n0.597217 -0.444604 -0.301186 1 \r\n-0.243413 -0.437123 -0.113041 1 \r\n-0.0535373 -0.0242357 0.631304 1 \r\n-0.166122 -0.184071 -0.658126 1 \r\n0.556779 -0.127946 -0.943575 1 \r\n0.362466 -0.796526 -0.468903 1 \r\n0.279671 0.317654 -0.964161 1 \r\n-0.605949 -0.743351 0.817149 1 \r\n-0.456432 0.0602509 -0.501706 1 \r\n-0.406994 0.0954587 -0.686642 1 \r\n0.216172 -0.639714 -0.968608 1 \r\n0.428098 -0.528807 0.546039 1 \r\n-0.122954 -0.114081 0.112285 1 \r\n0.144462 -0.837026 -0.466796 1 \r\n0.542189 -0.53268 0.181757 1 \r\n-0.457048 0.115828 -0.374292 1 \r\n0.578715 0.365863 -0.0481789 1 \r\n-0.348221 -0.685646 0.472468 1 \r\n0.0843298 -0.898965 0.360443 1 \r\n-0.0996085 -0.043006 -0.904414 1 \r\n-0.400917 0.0219404 -0.181998 1 \r\n-0.67216 -0.660063 0.729384 1 \r\n0.625151 -0.0413457 -0.691173 1 \r\n0.136308 -0.175344 0.213022 1 \r\n-0.126603 -0.59313 0.0618964 1 \r\n0.265133 0.851822 -0.840715 1 \r\n-0.0150679 -0.380108 0.764841 1 \r\n0.641224 0.503105 -0.494016 1 \r\n-0.228087 -0.65029 0.448416 1 \r\n-0.304558 0.147508 -0.14483 1 \r\n0.140378 0.863776 -0.467791 1 \r\n0.579141 0.0242128 -0.0637169 1 \r\n0.457983 -0.777974 0.553531 1 \r\n-0.190073 -0.692578 -0.275255 1 \r\n-0.230748 0.337203 -0.0479547 1 \r\n-0.162244 0.458714 -0.920552 1 \r\n0.484495 -0.497059 -0.774905 1 \r\n-0.40146 -0.152741 -0.283988 1 \r\n-0.309259 0.170191 -0.853568 1 \r\n0.65048 -0.896818 0.257112 1 \r\n-0.0193971 0.303074 0.242772 1 \r\n-0.126014 -0.118516 0.944014 1 \r\n0.415138 -0.389478 0.113883 1 \r\n-0.0205126 0.038242 -0.902691 1 \r\n0.0872685 -0.318568 0.646381 1 \r\n0.716455 -0.733239 0.221956 1 \r\n0.0260577 -0.350696 -0.975624 1 \r\n0.425681 -0.932322 0.365869 1 \r\n0.617223 -0.146856 -0.3697 1 \r\n0.329655 -0.464439 -0.970363 1 \r\n0.086347 -0.840748 0.545582 1 \r\n0.569407 -0.45992 -0.0974938 1 \r\n-0.437497 0.179447 -0.42494 1 \r\n-0.375708 -0.157177 -0.527288 1 \r\n-0.170432 -0.123529 0.0703638 1 \r\n0.393627 -0.703559 0.586477 1 \r\n-0.647531 -0.606199 0.845436 1 \r\n0.600444 0.358641 -0.922839 1 \r\n0.578777 0.495831 -0.0891832 1 \r\n-0.240116 0.451989 -0.877994 1 \r\n-0.314391 0.0270145 -0.900849 1 \r\n-0.194464 -0.580584 0.517648 1 \r\n0.481009 -0.805293 0.53203 1 \r\n0.637997 0.471373 -0.189218 1 \r\n0.549743 0.499546 -0.868338 1 \r\n0.0686922 -0.303294 0.693242 1 \r\n-0.045622 -0.316047 0.811442 1 \r\n-0.215799 0.11395 0.048386 1 \r\n-0.0478281 -0.415469 0.552607 1 \r\n0.152267 0.47157 -0.959631 1 \r\n0.516767 -0.678347 -0.0615606 1 \r\n0.0186986 -0.904435 0.221842 1 \r\n-0.0168123 -0.672214 -0.968454 1 \r\n0.661054 -0.845082 0.100632 1 \r\n0.547782 -0.172294 -0.949346 1 \r\n0.73451 0.132099 -0.647851 1 \r\n0.0932651 0.958193 -0.518294 1 \r\n0.742479 0.180246 -0.216314 1 \r\n-0.0783613 -0.152136 0.580686 1 \r\n-0.628688 -0.66771 0.889132 1 \r\n0.0313748 -0.916014 0.164895 1 \r\n0.1667 -0.461523 -0.728285 1 \r\n0.575343 0.12442 -0.0173458 1 \r\n0.42567 -0.404561 -0.968662 1 \r\n-0.455658 0.101529 -0.441081 1 \r\n0.451155 0.337047 -0.936305 1 \r\n0.624268 -0.546824 -0.920022 1 \r\n0.248531 -0.928275 -0.270155 1 \r\n0.53119 0.666298 -0.374243 1 \r\n0.0544866 -0.513978 -0.749337 1 \r\n0.0307158 -0.86388 -0.386774 1 \r\n-0.0452899 -0.387833 0.218729 1 \r\n-0.182106 0.0787628 0.700422 1 \r\n0.240094 0.471674 -0.957247 1 \r\n-0.594168 -0.682418 0.638889 1 \r\n0.502769 -0.586908 -0.515 1 \r\n0.584412 0.116959 -0.0582951 1 \r\n-0.466 -0.777958 0.749556 1 \r\n0.350491 -0.34886 0.169678 1 \r\n0.410458 0.0472075 0.195547 1 \r\n0.522951 -0.697734 -0.0102513 1 \r\n0.592246 -0.397224 -0.872415 1 \r\n0.357174 -0.949554 0.316487 1 \r\n0.573257 0.623474 -0.307496 1 \r\n0.462518 -0.458138 0.112545 1 \r\n0.374192 0.678055 -0.876168 1 \r\n-0.00984442 -0.876104 0.189021 1 \r\n-0.366213 -0.0528877 -0.735415 1 \r\n0.679068 -0.688903 0.267115 1 \r\n-0.470868 -0.784357 0.817575 1 \r\n0.439803 -0.517164 0.464717 1 \r\n0.515065 -0.942979 0.295962 1 \r\n-0.262704 0.111698 0.756259 1 \r\n-0.407978 -0.0905102 -0.604651 1 \r\n0.66371 0.325218 -0.769173 1 \r\n0.29259 0.457365 -0.959169 1 \r\n0.592692 -0.5727 -0.369448 1 \r\n0.0176817 0.841041 -0.561155 1 \r\n0.287931 -0.893456 0.562735 1 \r\n-0.172232 -0.410642 0.0805224 1 \r\n-0.251751 -0.0883083 -0.968104 1 \r\n0.0596759 -0.512189 0.635226 1 \r\n-0.184752 0.512122 -0.0415938 1 \r\n-0.769157 -0.591183 0.825762 1 \r\n0.451435 -0.401536 0.0694506 1 \r\n-0.243356 0.598445 -0.458979 1 \r\n0.0383291 -0.300918 0.495951 1 \r\n0.568287 0.461038 -0.815036 1 \r\n0.0764685 -0.734668 -0.907067 1 \r\n0.0512906 -0.734723 -0.921544 1 \r\n0.746858 0.280661 -0.512677 1 \r\n-0.262744 -0.165433 -0.622422 1 \r\n-0.13633 -0.205786 -0.660488 1 \r\n-0.00618243 -0.550009 -0.804187 1 \r\n-0.306858 0.503572 -0.388259 1 \r\n0.492153 0.287468 0.14934 1 \r\n0.50693 -0.168868 0.00949228 1 \r\n-0.304201 -0.137115 -0.788494 1 \r\n0.194533 -0.921975 -0.0920056 1 \r\n0.244318 0.142091 0.273383 1 \r\n-0.0825461 -0.747775 0.641431 1 \r\n-0.421421 -0.731198 0.810799 1 \r\n-0.393792 -0.0358419 -0.190228 1 \r\n-0.0186998 -0.208169 0.860264 1 \r\n0.653116 -0.857318 0.328638 1 \r\n-0.0358482 0.22994 0.236182 1 \r\n-0.28367 0.130272 -0.124942 1 \r\n-0.047413 0.130895 0.218988 1 \r\n0.158099 -0.499971 -0.976582 1 \r\n0.155732 -0.493885 -0.773409 1 \r\n0.157355 -0.326662 0.24741 1 \r\n0.352619 0.336498 0.252142 1 \r\n-0.459899 -0.0922328 -0.467215 1 \r\n-0.173507 -0.632379 0.440799 1 \r\n0.753084 0.27098 -0.422445 1 \r\n-0.0473476 -0.656857 0.624621 1 \r\n0.214673 -0.86875 -0.416427 1 \r\n0.0126626 0.858868 -0.782428 1 \r\n0.578549 -0.965931 0.139607 1 \r\n-0.0132272 -0.81475 -0.436711 1 \r\n0.296958 -0.91161 -0.29819 1 \r\n-0.434886 0.16684 -0.474195 1 \r\n0.0639251 -0.642223 -0.832991 1 \r\n-0.360967 0.210121 -0.173693 1 \r\n0.389373 0.826742 -0.566337 1 \r\n0.0594311 -0.193927 -0.923018 1 \r\n-0.188639 -0.370755 -0.888959 1 \r\n-0.198728 -0.75532 0.526749 1 \r\n-0.213811 -0.299946 -0.978095 1 \r\n-0.187237 -0.195172 -0.604969 1 \r\n0.141677 -0.929633 -0.240913 1 \r\n0.186861 0.803695 -0.408216 1 \r\n0.505311 -0.575019 -0.818694 1 \r\n0.34107 -0.840332 0.574979 1 \r\n0.414982 0.759262 -0.631129 1 \r\n0.283282 -0.744437 0.592474 1 \r\n0.229177 0.849881 -0.465768 1 \r\n0.655201 0.29029 -0.142273 1 \r\n0.0201545 -0.399801 0.450647 1 \r\n0.198223 -0.585804 -0.860434 1 \r\n0.62596 -0.683965 0.0240529 1 \r\n0.0480064 -0.503634 -0.711941 1 \r\n0.428327 0.625954 0.0111506 1 \r\n-0.323532 0.0415833 0.952502 1 \r\n-0.186223 -0.223415 -0.525292 1 \r\n0.248344 0.0818549 0.260578 1 \r\n0.287516 0.987766 -0.639428 1 \r\n0.241101 -0.438699 -0.78868 1 \r\n-0.00453049 -0.487673 0.601461 1 \r\n0.543735 -0.474425 -0.492178 1 \r\n0.556478 -0.947433 0.0596238 1 \r\n0.157392 -0.81067 -0.498611 1 \r\n0.199882 0.265106 0.283292 1 \r\n-0.0151458 0.758391 -0.613418 1 \r\n0.574813 0.564254 -0.639397 1 \r\n0.0178654 -0.39424 0.25485 1 \r\n0.551954 0.425062 -0.952952 1 \r\n-0.0365756 -0.292209 0.208363 1 \r\n-0.336445 0.402151 -0.701414 1 \r\n0.00742757 -0.230113 0.788769 1 \r\n0.205139 -0.941625 -0.172049 1 \r\n0.305021 -0.487346 -0.653624 1 \r\n-0.221011 -0.00305176 0.970308 1 \r\n0.0296346 0.784426 -0.457432 1 \r\n-0.284641 0.275556 -0.140539 1 \r\n-0.0303631 -0.820611 -0.0556428 1 \r\n-0.226473 -0.158948 -0.74158 1 \r\n0.476557 -0.497666 0.274794 1 \r\n-0.00960362 -0.142089 0.575996 1 \r\n-0.141651 0.0347555 0.710228 1 \r\n0.64663 -0.0908537 -0.789269 1 \r\n0.560027 -0.39249 -0.0934189 1 \r\n0.528637 0.253661 0.0988995 1 \r\n0.197809 -0.995594 0.138071 1 \r\n0.165369 0.511915 0.202811 1 \r\n0.546309 -0.275466 -0.828779 1 \r\n-0.0445915 -0.480376 -0.693695 1 \r\n0.179183 -0.917694 0.541162 1 \r\n-0.110846 -0.122424 0.81275 1 \r\n0.202015 -0.483476 0.576131 1 \r\n-0.316282 -0.65691 0.747408 1 \r\n0.358471 -0.873473 0.00984097 1 \r\n0.0708091 -0.717418 0.591416 1 \r\n0.613321 -0.404217 -0.926885 1 \r\n-0.0761251 -0.731293 0.159779 1 \r\n0.426594 0.391193 0.196077 1 \r\n0.51025 -0.664254 -0.463488 1 \r\n0.366627 0.617466 -0.902312 1 \r\n-0.469571 -0.597781 0.57554 1 \r\n-0.203566 0.623183 -0.585584 1 \r\n0.76069 0.00451803 -0.365023 1 \r\n0.590959 0.518441 -0.128305 1 \r\n0.0478414 0.853399 -0.524801 1 \r\n0.564707 -0.703424 -0.287571 1 \r\n0.236133 -0.652743 0.595681 1 \r\n0.464946 -0.118236 0.0783434 1 \r\n0.179388 -0.948475 0.0442561 1 \r\n-0.358828 -0.0413769 -0.759744 1 \r\n0.658916 0.451346 -0.590918 1 \r\n0.333246 -0.644121 -0.600301 1 \r\n-0.191532 -0.652165 -0.169405 1 \r\n0.233325 -0.954917 0.397082 1 \r\n0.143916 -0.426655 0.63313 1 \r\n-0.152719 0.494316 -0.873237 1 \r\n0.433069 0.77186 -0.670868 1 \r\n-0.258952 -0.325495 -0.243845 1 \r\n0.572261 0.240721 -0.0310367 1 \r\n0.0104482 0.714248 -0.0382516 1 \r\n-0.10396 0.398373 -0.972115 1 \r\n0.25293 -0.313114 -0.964273 1 \r\n0.579742 -0.603351 -0.158149 1 \r\n0.256749 -0.505905 -0.973858 1 \r\n0.530983 -0.224821 -0.043994 1 \r\n-0.0428192 0.728215 -0.127049 1 \r\n-0.198975 0.277818 0.0881286 1 \r\n-0.145829 -0.0867093 0.0983598 1 \r\n-0.652015 -0.663169 0.662039 1 \r\n-0.273242 0.548731 -0.612663 1 \r\n0.594467 -0.104689 -0.759195 1 \r\n0.314121 0.761078 -0.154301 1 \r\n-0.00803983 0.133479 0.240208 1 \r\n0.560016 -0.139224 -0.470567 1 \r\n-0.423879 0.195012 -0.501116 1 \r\n-0.0581911 0.631671 -0.784645 1 \r\n-0.0611506 0.59279 -0.81017 1 \r\n-0.0452701 0.511831 -0.90274 1 \r\n-0.0855388 -0.626589 0.18763 1 \r\n0.137593 0.895933 -0.814341 1 \r\n-0.183254 -0.141435 0.702186 1 \r\n0.216047 -0.49521 -0.974349 1 \r\n-0.632929 -0.574663 0.745281 1 \r\n0.387515 0.250455 -0.903351 1 \r\n0.125966 -0.938546 0.0526819 1 \r\n0.703868 0.0575011 -0.674754 1 \r\n0.53063 -0.247412 -0.625005 1 \r\n-0.405149 0.288225 -0.406932 1 \r\n0.584941 -0.427794 -0.402187 1 \r\n0.0991912 -0.358834 0.481019 1 \r\n0.464344 0.490383 0.0963572 1 \r\n0.154939 -0.597563 0.585501 1 \r\n-0.308599 0.0404626 0.815634 1 \r\n0.6582 -0.10968 -0.441144 1 \r\n0.427953 0.516086 0.129905 1 \r\n-0.0493991 -0.817327 -0.398936 1 \r\n-0.0819547 -0.337387 0.763243 1 \r\n0.409348 -0.825649 -0.0423763 1 \r\n-0.0775176 0.126682 0.196678 1 \r\n0.205101 0.140421 0.27441 1 \r\n0.0667342 -0.79188 -0.503369 1 \r\n-0.568181 -0.781707 0.824423 1 \r\n0.238086 -0.629538 -0.95632 1 \r\n-0.177919 0.326598 -0.970544 1 \r\n0.0290452 0.168738 -0.906454 1 \r\n-0.038462 -0.176577 0.166877 1 \r\n0.708776 0.319521 -0.207704 1 \r\n0.318698 -0.0576463 0.199055 1 \r\n-0.126083 -0.240447 0.12262 1 \r\n0.247244 0.198592 -0.928046 1 \r\n0.602737 -0.156913 -0.334547 1 \r\n-0.123172 -0.10937 0.805413 1 \r\n0.766989 0.189668 -0.33725 1 \r\n-0.453969 -0.612051 0.540851 1 \r\n0.0562392 0.94516 -0.545328 1 \r\n0.649494 0.00392652 -0.153419 1 \r\n0.0878838 -0.532042 0.613259 1 \r\n-0.224353 0.0981567 0.739657 1 \r\n-0.0259531 -0.403523 0.230755 1 \r\n0.645831 0.102463 -0.8168 1 \r\n0.554455 -0.282756 -0.105195 1 \r\n0.138976 -0.291587 -0.966036 1 \r\n0.12798 -0.314298 0.241194 1 \r\n0.477968 -0.0754464 0.0858145 1 \r\n0.28598 0.250351 -0.943717 1 \r\n0.00265431 -0.230669 0.697631 1 \r\n0.236069 0.158642 0.275977 1 \r\n0.608392 -0.944865 0.186727 1 \r\n0.538993 -0.750721 0.511039 1 \r\n0.535714 -0.294612 -0.689705 1 \r\n0.769157 0.173782 -0.358602 1 \r\n-0.255668 -0.427542 -0.22643 1 \r\n-0.11073 -0.518429 -0.931201 1 \r\n0.541619 -0.0637188 -0.924376 1 \r\n0.117468 0.944558 -0.748791 1 \r\n0.448104 0.580462 0.0427723 1 \r\n0.208716 0.205389 0.278996 1 \r\n-0.222741 -0.467777 -0.0504245 1 \r\n-0.242122 0.603239 -0.405784 1 \r\n-0.0142669 0.757758 -0.83724 1 \r\n0.697932 -0.146254 -0.847005 1 \r\n0.2103 -0.451302 -0.784697 1 \r\n-0.355395 0.391722 -0.289946 1 \r\n-0.217502 0.519998 -0.803029 1 \r\n0.205074 0.663496 0.062104 1 \r\n-0.227661 -0.585699 -0.320102 1 \r\n0.4287 -0.426131 0.218822 1 \r\n0.55461 0.0694549 -0.936005 1 \r\n0.598908 -0.603479 -0.240055 1 \r\n0.6874 -0.0205572 -0.578805 1 \r\n0.649172 -0.639683 0.228441 1 \r\n0.480915 -0.975028 0.204357 1 \r\n-0.0850998 -0.0655606 0.705528 1 \r\n-0.00445372 0.305482 -0.95378 1 \r\n-0.248909 -0.350122 -0.116103 1 \r\n0.376962 -0.453421 0.353189 1 \r\n-0.158977 -0.768172 0.57251 1 \r\n-0.140732 -0.702082 0.436763 1 \r\n-0.402835 -0.0163049 -0.68823 1 \r\n-0.314852 0.0171049 0.939562 1 \r\n0.31545 0.94545 -0.716193 1 \r\n-0.546942 -0.704436 0.860264 1 \r\n0.2609 -0.939023 -0.19379 1 \r\n0.680116 -0.854502 0.172729 1 \r\n0.584516 -0.197106 -0.250025 1 \r\n0.102117 0.050445 0.249267 1 \r\n0.534147 -0.141279 -0.506557 1 \r\n0.0149734 -0.524926 0.542334 1 \r\n-0.11101 -0.638925 0.420596 1 \r\n0.242118 0.768829 -0.127602 1 \r\n-0.00959325 -0.545314 -0.622742 1 \r\n0.522297 -0.154116 -0.937719 1 \r\n0.00330901 -0.525149 -0.779728 1 \r\n0.705518 -0.809058 0.224229 1 \r\n-0.206817 -0.0937768 0.728522 1 \r\n0.400133 -0.400127 0.187744 1 \r\n-0.42393 -0.11237 -0.258174 1 \r\n0.510499 0.347341 -0.958309 1 \r\n0.688458 0.396308 -0.232149 1 \r\n0.535258 -0.315277 -0.0518636 1 \r\n-0.227355 0.0377439 0.0213134 1 \r\n0.25513 -0.992762 0.208041 1 \r\n0.384963 0.584312 -0.901254 1 \r\n0.37829 0.922891 -0.659705 1 \r\n0.606255 0.253879 -0.101071 1 \r\n0.284569 0.927032 -0.477403 1 \r\n0.188673 -0.739847 -0.574976 1 \r\n-0.123657 -0.336631 0.154466 1 \r\n-0.665585 -0.659322 0.696365 1 \r\n-0.222234 -0.478533 -0.419108 1 \r\n0.143108 -0.575841 0.587649 1 \r\n-0.245498 0.0108684 0.741638 1 \r\n-0.362176 0.392811 -0.510738 1 \r\n-0.359752 -0.202408 -0.39018 1 \r\n-0.266508 0.51096 -0.758677 1 \r\n0.309732 0.979361 -0.632995 1 \r\n0.38102 -0.479481 0.468038 1 \r\n0.302946 -0.449032 0.419652 1 \r\n0.23388 -0.444233 -0.712337 1 \r\n-0.0255878 -0.582826 0.469459 1 \r\n0.589839 -0.532538 -0.385963 1 \r\n-0.240904 -0.530389 -0.223793 1 \r\n-0.297864 0.518794 -0.563674 1 \r\n0.378083 0.752258 -0.847369 1 \r\n-0.0904988 0.710637 -0.57305 1 \r\n0.765162 0.194939 -0.446091 1 \r\n0.00168926 0.411925 0.223243 1 \r\n-0.256006 0.274258 -0.0956146 1 \r\n0.215005 0.787456 -0.184094 1 \r\n-0.000122488 -0.382074 -0.980383 1 \r\n0.273943 -0.907037 0.0196738 1 \r\n0.683457 0.0556748 -0.720586 1 \r\n-0.25589 -0.400775 -0.24678 1 \r\n0.331523 0.565997 -0.94225 1 \r\n-0.381302 -0.588402 0.562185 1 \r\n-0.0776753 -0.765417 0.560172 1 \r\n0.479919 -0.540886 -0.546302 1 \r\n0.567571 -0.608242 -0.948289 1 \r\n0.197775 -0.424552 0.383489 1 \r\n-0.424033 -0.154968 -0.342359 1 \r\n-0.00278723 -0.21698 0.828968 1 \r\n0.536285 -0.154148 -0.482188 1 \r\n0.0961602 0.178752 0.27413 1 \r\n0.473403 -0.549 0.382514 1 \r\n-0.137373 -0.505622 -0.529967 1 \r\n-0.0516923 0.744143 -0.190246 1 \r\n0.00412464 0.452207 0.20526 1 \r\n-0.122733 0.230137 0.163369 1 \r\n0.0595224 -0.302172 0.232644 1 \r\n0.523594 0.292521 0.0976024 1 \r\n-0.254997 -0.06615 0.837778 1 \r\n0.124444 -0.946325 0.278073 1 \r\n-0.120488 -0.559547 0.0956724 1 \r\n-0.36497 0.350485 -0.251735 1 \r\n0.168069 0.301622 -0.968135 1 \r\n0.512471 -0.621036 -0.491749 1 \r\n0.451031 -0.944801 0.308725 1 \r\n0.338268 -0.388518 0.256354 1 \r\n0.39398 -0.206548 -0.947632 1 \r\n-0.291557 -0.768632 0.733783 1 \r\n0.654983 -0.0822141 -0.508678 1 \r\n0.119638 -0.617611 -0.982826 1 \r\n0.0540331 -0.522898 -0.66559 1 \r\n0.26063 -0.896988 -0.0436183 1 \r\n0.546682 -0.363887 -0.553891 1 \r\n0.285119 -0.491895 0.56948 1 \r\n0.624268 -0.522693 -0.869701 1 \r\n-0.399133 0.132742 -0.686849 1 \r\n0.565506 -0.169324 -0.956974 1 \r\n-0.284694 0.421648 -0.18265 1 \r\n0.274804 0.466278 0.228338 1 \r\n0.489518 -0.40215 -0.678902 1 \r\n-0.054247 0.71348 -0.625071 1 \r\n-0.0658294 -0.307229 0.545894 1 \r\n0.512979 -0.234815 -0.761206 1 \r\n0.514359 -0.591259 0.379764 1 \r\n0.532913 0.652134 -0.469178 1 \r\n0.204201 0.918824 -0.802102 1 \r\n-0.249855 -0.276524 -0.821219 1 \r\n-0.232224 -0.0384994 -0.955079 1 \r\n-0.0317141 -0.513171 -0.797966 1 \r\n0.58685 -0.399164 -0.18033 1 \r\n0.44164 -0.483224 0.311652 1 \r\n-0.0489134 -0.53057 0.28544 1 \r\n-0.421883 -0.577096 0.678704 1 \r\n0.600029 -0.542184 -0.845257 1 \r\n0.558211 0.485184 -0.851465 1 \r\n0.0508714 -0.862821 -0.0101527 1 \r\n0.560961 0.370969 -0.964308 1 \r\n-0.127032 0.634691 -0.704242 1 \r\n0.410717 0.576841 -0.882509 1 \r\n0.181227 0.737419 -0.0470116 1 \r\n0.550376 -0.12158 -0.742708 1 \r\n0.508227 -0.134292 -0.636232 1 \r\n0.628938 -0.546681 -0.89165 1 \r\n0.511869 0.687518 -0.357442 1 \r\n-0.0136018 -0.461045 0.652358 1 \r\n0.319901 -0.914757 -0.12747 1 \r\n0.516985 -0.382571 -0.750119 1 \r\n0.488625 0.372463 0.118677 1 \r\n0.400517 0.239642 0.238714 1 \r\n-0.139192 -0.368267 -0.865887 1 \r\n0.441889 -0.934951 0.343798 1 \r\n-0.138133 -0.17047 0.90231 1 \r\n-0.238607 -0.0272013 -0.00557876 1 \r\n-0.115905 -0.763156 0.637841 1 \r\n-0.183371 -0.353698 0.0674375 1 \r\n0.0169626 -0.720579 0.60999 1 \r\n0.185482 -0.407525 0.345729 1 \r\n0.343311 0.533934 0.170872 1 \r\n0.474824 -0.162715 0.0538857 1 \r\n0.289186 0.435978 0.239109 1 \r\n0.653634 0.105908 -0.796525 1 \r\n0.584215 -0.571924 0.186447 1 \r\n0.680074 -0.145303 -0.824357 1 \r\n0.596241 -0.156251 -0.191914 1 \r\n-0.159745 -0.279117 -0.796763 1 \r\n-0.469633 -0.0955304 -0.405291 1 \r\n0.708693 -0.687201 0.183718 1 \r\n0.404004 -0.291784 0.127726 1 \r\n0.615542 0.404932 -0.107686 1 \r\n-0.1468 -0.579512 0.534407 1 \r\n-0.109406 -0.481509 -0.907414 1 \r\n0.0211963 0.705833 -0.891572 1 \r\n0.096512 -0.25432 -0.959971 1 \r\n0.563586 -0.291471 -0.481408 1 \r\n0.162004 -0.0562071 0.225754 1 \r\n0.687535 0.390633 -0.625721 1 \r\n-0.00468719 -0.824143 0.0563761 1 \r\n-0.014933 0.617372 -0.884842 1 \r\n-0.199566 0.245017 -0.967341 1 \r\n-0.100446 -0.420613 0.172221 1 \r\n0.0895887 -0.609929 -0.63817 1 \r\n0.196362 -0.665934 -0.956784 1 \r\n0.51053 -0.477464 -0.778407 1 \r\n-0.349824 -0.128178 -0.886172 1 \r\n0.542854 -0.619641 0.378228 1 \r\n-0.140423 -0.752205 -0.359729 1 \r\n0.572603 0.409352 -0.0412619 1 \r\n-0.00707376 -0.698023 -0.553363 1 \r\n-0.0949732 -0.322009 0.180066 1 \r\n0.739283 -0.0333039 -0.255927 1 \r\n0.040751 -0.506661 -0.736535 1 \r\n0.380272 0.307848 0.243187 1 \r\n0.186226 0.367129 -0.960488 1 \r\n-0.308302 0.00398874 0.899716 1 \r\n-0.0153211 -0.438707 0.257475 1 \r\n-0.319339 -0.136912 -0.982813 1 \r\n-0.219753 -0.134073 0.00499928 1 \r\n-0.217341 -0.611947 -0.37706 1 \r\n-0.407705 0.0570238 -0.181943 1 \r\n0.527517 0.292553 -0.952145 1 \r\n0.130817 0.242381 0.281331 1 \r\n0.263203 0.79254 -0.237849 1 \r\n-0.157222 -0.174587 0.663866 1 \r\n-0.0297167 -0.768653 0.54607 1 \r\n0.195141 -0.9038 0.000582933 1 \r\n0.704708 0.318058 -0.697983 1 \r\n0.340198 -0.459694 0.426137 1 \r\n-0.139385 0.304797 0.152557 1 \r\n0.319061 -0.960554 0.294094 1 \r\n0.595235 0.570646 -0.217315 1 \r\n-0.383051 -0.633607 0.755491 1 \r\n0.463576 -0.982709 0.171806 1 \r\n0.212628 0.558163 -0.961455 1 \r\n0.277471 0.63275 0.0931094 1 \r\n0.500766 0.586128 -0.0454674 1 \r\n-0.218221 0.245142 0.05566 1 \r\n0.151623 -0.898028 -0.0111167 1 \r\n0.255898 0.810336 -0.463163 1 \r\n0.394094 -0.935356 0.48573 1 \r\n0.415698 -0.557737 -0.816336 1 \r\n0.475156 -0.467595 0.0535225 1 \r\n-0.601256 -0.722465 0.787327 1 \r\n0.567031 -0.344826 -0.459335 1 \r\n0.675643 0.470512 -0.332384 1 \r\n0.451124 -0.424846 -0.630451 1 \r\n-0.708687 -0.673218 0.847106 1 \r\n0.556436 -0.694584 -0.182666 1 \r\n-0.175322 -0.0305914 0.803784 1 \r\n-0.197522 -0.107497 0.0406659 1 \r\n0.435746 -0.187834 -0.935779 1 \r\n0.656945 0.143067 -0.794623 1 \r\n0.5987 -0.677109 0.0150666 1 \r\n0.750978 -0.000185728 -0.251892 1 \r\n-0.373655 0.374756 -0.448123 1 \r\n-0.00608695 -0.229904 0.730421 1 \r\n0.247991 -0.435184 0.403163 1 \r\n-0.291819 -0.185661 -0.803944 1 \r\n0.302551 0.74432 -0.886941 1 \r\n-0.228707 -0.567655 -0.377634 1 \r\n0.496989 -0.194419 -0.727517 1 \r\n-0.339368 -0.12885 -0.851292 1 \r\n-0.190311 -0.164998 -0.717008 1 \r\n0.150119 -0.37205 0.284309 1 \r\n-0.234311 0.277994 -0.0156451 1 \r\n0.0403712 -0.884016 -0.349519 1 \r\n0.239556 0.169289 -0.917659 1 \r\n0.417141 -0.977497 0.112835 1 \r\n-0.209417 0.328954 0.0369924 1 \r\n0.58407 -0.528121 -0.14563 1 \r\n0.67996 -0.0541744 -0.531706 1 \r\n0.257859 0.384645 0.259654 1 \r\n0.753624 0.261474 -0.462527 1 \r\n-0.417863 -0.773958 0.713871 1 \r\n-0.139967 0.681054 -0.191583 1 \r\n0.40308 0.84131 -0.768437 1 \r\n0.115025 -0.511079 0.62183 1 \r\n-0.0887618 -0.128446 0.928376 1 \r\n-0.24207 -0.474881 -0.122943 1 \r\n-0.181178 -0.241519 -0.50153 1 \r\n-0.0691789 -0.600811 0.563814 1 \r\n0.204104 0.987839 -0.667242 1 \r\n0.288616 0.792478 -0.376958 1 \r\n-0.211971 0.0275749 0.698493 1 \r\n-0.295819 0.52666 -0.445307 1 \r\n-0.361811 0.309778 -0.688251 1 \r\n0.557049 -0.642697 -0.128936 1 \r\n0.208841 -0.633906 -0.907319 1 \r\n-0.129342 0.0625441 0.138808 1 \r\n-0.183456 -0.0522837 0.984846 1 \r\n0.618458 -0.263291 -0.939968 1 \r\n0.212352 0.0359591 -0.907634 1 \r\n0.767248 0.198935 -0.354122 1 \r\n-0.355565 -0.132962 -0.224089 1 \r\n0.547357 -0.7338 -0.24674 1 \r\n0.159668 -0.876171 -0.407756 1 \r\n0.151452 -0.917459 0.487618 1 \r\n-0.157441 -0.715795 -0.148246 1 \r\n-0.173123 -0.224511 0.0668461 1 \r\n0.62128 -0.633845 0.25954 1 \r\n0.355752 0.814549 -0.536299 1 \r\n0.591572 -0.00266373 -0.95514 1 \r\n0.569553 0.315018 -0.0401547 1 \r\n0.571306 -0.650131 -0.16812 1 \r\n-0.362975 -0.178518 -0.282514 1 \r\n0.393824 -0.35659 0.130123 1 \r\n0.26311 0.634151 -0.941074 1 \r\n-0.0317867 -0.863842 -0.208314 1 \r\n0.582233 -0.121865 -0.490945 1 \r\n0.747273 0.237961 -0.250877 1 \r\n0.0416455 -0.442565 0.3309 1 \r\n0.275925 -0.601897 -0.950623 1 \r\n-0.373166 -0.734323 0.561967 1 \r\n0.119194 0.80053 -0.318405 1 \r\n0.237015 0.242859 0.279723 1 \r\n-0.197986 -0.134919 0.733005 1 \r\n0.224657 0.345629 -0.962398 1 \r\n0.497912 0.345494 -0.952673 1 \r\n-0.0608839 -0.258248 0.544898 1 \r\n-0.0382721 0.315703 -0.944734 1 \r\n0.147063 0.802377 -0.377858 1 \r\n0.474056 -0.550202 -0.797329 1 \r\n0.0274305 -0.292494 0.795804 1 \r\n0.208927 -0.613225 -0.642425 1 \r\n0.170396 -0.936215 -0.173424 1 \r\n-0.22487 -0.0863699 0.00278807 1 \r\n-0.288208 0.535926 -0.507434 1 \r\n0.0866427 -0.400914 0.305944 1 \r\n-0.354116 -0.222933 -0.976103 1 \r\n-0.0990191 -0.557171 0.140925 1 \r\n0.391479 -0.637728 -0.94016 1 \r\n0.656664 -0.0951693 -0.967767 1 \r\n0.328991 -0.951732 0.410852 1 \r\n0.403174 0.606342 -0.867183 1 \r\n0.654568 0.459938 -0.226735 1 \r\n-0.273683 0.343834 -0.906696 1 \r\n-0.0799105 0.743085 -0.405548 1 \r\n0.0843464 -0.467181 0.668566 1 \r\n0.219862 -0.594034 -0.887483 1 \r\n0.597092 -0.369462 -0.906081 1 \r\n-0.0319259 -0.253208 0.196606 1 \r\n-0.168589 0.632491 -0.156986 1 \r\n-0.416553 -0.00780118 -0.19684 1 \r\n-0.505126 -0.765627 0.846868 1 \r\n0.48792 0.644715 -0.685821 1 \r\n0.151796 -0.394163 0.5254 1 \r\n0.2824 0.178295 0.273019 1 \r\n0.60694 0.57379 -0.260932 1 \r\n0.323004 0.26494 -0.933459 1 \r\n0.370529 -0.414301 0.282016 1 \r\n0.745644 0.0289341 -0.233076 1 \r\n0.0849763 0.795487 -0.216409 1 \r\n0.561459 0.0587566 0.0100485 1 \r\n-0.111733 -0.433443 -0.885392 1 \r\n0.386758 0.627126 -0.879487 1 \r\n-0.315615 -0.708995 0.47498 1 \r\n0.51494 -0.117925 -0.681709 1 \r\n-0.132689 0.578086 -0.00631952 1 \r\n0.267032 -0.585114 -0.924073 1 \r\n-0.721324 -0.565191 0.785303 1 \r\n-0.203362 -0.611796 0.460836 1 \r\n0.0690543 -0.272662 0.623656 1 \r\n0.540996 -0.280092 -0.64354 1 \r\n0.592433 -0.598653 -0.919297 1 \r\n0.363535 -0.0781299 0.169948 1 \r\n0.56231 -0.635777 0.0322815 1 \r\n0.576951 -0.355061 -0.403468 1 \r\n-0.175082 -0.657392 -0.439087 1 \r\n0.598047 0.296631 -0.0856478 1 \r\n0.0992898 -0.885986 0.437759 1 \r\n-0.321778 -0.74959 0.597663 1 \r\n0.423968 -0.413286 0.159592 1 \r\n0.282794 -0.560959 -0.973505 1 \r\n0.69016 -0.771751 0.0965648 1 \r\n-0.29322 0.145277 -0.916418 1 \r\n0.31022 0.490705 0.207418 1 \r\n-0.255584 -0.322384 -0.1534 1 \r\n0.70503 -0.747624 0.119871 1 \r\n0.18874 0.462418 -0.956559 1 \r\n-0.441034 -0.793723 0.786725 1 \r\n-0.119195 -0.758324 0.507759 1 \r\n0.505767 -0.712466 0.542324 1 \r\n-0.0912293 0.493112 -0.899274 1 \r\n0.303413 0.790703 -0.280038 1 \r\n-0.237484 -0.316144 -0.0592497 1 \r\n0.603225 0.369319 -0.0810739 1 \r\n-0.171646 0.183951 -0.928278 1 \r\n0.506712 -0.544791 0.0723768 1 \r\n-0.343422 0.416927 -0.29745 1 \r\n-0.470085 -0.000897646 -0.462745 1 \r\n-0.332409 0.0689672 -0.825309 1 \r\n0.197239 -0.178731 -0.948144 1 \r\n0.640404 0.436476 -0.16631 1 \r\n0.586134 -0.101159 -0.546136 1 \r\n0.0921112 -0.350261 0.254601 1 \r\n-0.0658948 0.172796 -0.893717 1 \r\n-0.316833 0.28174 -0.816798 1 \r\n0.453646 0.28698 0.19561 1 \r\n0.192178 0.762303 -0.0938569 1 \r\n0.345604 -0.284078 0.173653 1 \r\n0.595753 -0.0605508 -0.129483 1 \r\n-0.0155629 -0.0973453 0.598991 1 \r\n-0.120889 0.580629 -0.780537 1 \r\n0.162275 0.0406079 0.251924 1 \r\n-0.0943734 0.340793 -0.94899 1 \r\n-0.259855 0.531018 -0.22302 1 \r\n-0.370073 -0.110856 -0.631078 1 \r\n-0.260274 0.49912 -0.190036 1 \r\n-0.312783 0.0617554 -0.871662 1 \r\n-0.141912 -0.24963 -0.77843 1 \r\n-0.000242889 -0.498943 -0.710361 1 \r\n0.268537 -0.932293 0.544555 1 \r\n0.0152847 -0.80887 0.493907 1 \r\n-0.386847 0.33216 -0.493522 1 \r\n-0.107528 0.101301 -0.895569 1 \r\n-0.23654 -0.439668 -0.375321 1 \r\n0.132949 0.274746 -0.970482 1 \r\n-0.698708 -0.591597 0.859424 1 \r\n-0.085931 -0.795383 -0.38496 1 \r\n0.446724 0.620786 -0.793885 1 \r\n0.196692 0.62668 0.10745 1 \r\n0.545624 -0.302373 -0.637769 1 \r\n0.430578 -0.782852 -0.440723 1 \r\n-0.113211 0.717932 -0.24766 1 \r\n0.0468639 -0.165097 0.199335 1 \r\n0.612823 -0.451977 -0.954303 1 \r\n0.0485169 -0.86347 0.397643 1 \r\n-0.359597 0.359139 -0.640288 1 \r\n0.0706389 -0.574189 0.568888 1 \r\n-0.384507 0.0771544 -0.740469 1 \r\n-0.689646 -0.67667 0.818955 1 \r\n-0.252407 0.208025 -0.0524427 1 \r\n-0.758627 -0.591655 0.84913 1 \r\n0.0266263 -0.328023 0.785272 1 \r\n0.667238 0.180807 -0.140038 1 \r\n0.198885 0.232586 0.281528 1 \r\n0.308165 -0.81019 -0.472447 1 \r\n-0.375894 -0.0155369 -0.74257 1 \r\n-0.136965 -0.197924 0.876618 1 \r\n0.133161 -0.000480533 0.238828 1 \r\n-0.208902 -0.638587 -0.270994 1 \r\n-0.132451 -0.26201 -0.605916 1 \r\n0.419216 -0.480974 -0.767652 1 \r\n0.691613 0.372577 -0.212194 1 \r\n0.109713 0.690361 0.0196427 1 \r\n0.460702 -0.800946 -0.379129 1 \r\n-0.514127 -0.627344 0.539367 1 \r\n-0.239963 -0.786627 0.673983 1 \r\n0.621581 -0.121344 -0.778651 1 \r\n0.339482 -0.561917 -0.870107 1 \r\n0.423128 -0.463922 -0.604101 1 \r\n0.176899 -0.494687 -0.682992 1 \r\n0.513083 -0.499604 0.191781 1 \r\n0.322547 -0.00233579 0.219901 1 \r\n0.502488 0.315506 0.124094 1 \r\n0.146362 0.796628 -0.884762 1 \r\n0.0398566 -0.7129 -0.566478 1 \r\n0.523719 0.0108062 0.0744107 1 \r\n0.535123 -0.224432 -0.544469 1 \r\n-0.42318 0.0939645 -0.631999 1 \r\n-0.0700039 -0.478214 -0.634852 1 \r\n-0.436809 -0.0269108 -0.596257 1 \r\n0.0211392 -0.51552 -0.668072 1 \r\n0.681299 -0.662585 0.214765 1 \r\n0.0126874 -0.649799 0.589693 1 \r\n-0.419681 0.0158181 -0.659457 1 \r\n0.708776 -0.761533 0.270135 1 \r\n0.0598378 0.610565 -0.944453 1 \r\n0.178129 0.263944 -0.968877 1 \r\n0.360152 -0.89605 -0.134866 1 \r\n0.43254 -0.373878 0.0885643 1 \r\n0.0460047 -0.42922 0.716434 1 \r\n-0.669376 -0.569385 0.75299 1 \r\n0.295298 0.747578 -0.0940706 1 \r\n-0.101135 -0.815619 -0.21454 1 \r\n0.44467 -0.0845841 0.113873 1 \r\n0.282379 0.991512 -0.61046 1 \r\n0.548696 0.49802 -0.81965 1 \r\n-0.74372 -0.580443 0.718229 1 \r\n-0.310424 -0.160397 -0.220927 1 \r\n-0.406092 0.215132 -0.57489 1 \r\n-0.387862 0.0777252 -0.174542 1 \r\n0.474202 0.703934 -0.527264 1 \r\n0.577626 0.446179 -0.901936 1 \r\n0.559269 -0.218603 -0.411473 1 \r\n0.224314 0.442101 0.243218 1 \r\n0.665619 0.215537 -0.789988 1 \r\n0.689838 0.408418 -0.560636 1 \r\n0.248717 -0.570001 -0.897109 1 \r\n0.398214 0.87602 -0.572356 1 \r\n0.39895 0.8727 -0.738993 1 \r\n0.0897682 -0.918221 -0.173392 1 \r\n-0.62631 -0.756942 0.893158 1 \r\n0.652566 0.0793543 -0.836364 1 \r\n0.407148 -0.579434 -0.589364 1 \r\n-0.707973 -0.668945 0.918653 1 \r\n-0.270484 -0.00865614 -0.979604 1 \r\n0.0753239 -0.326392 0.726188 1 \r\n0.393098 0.463009 -0.962378 1 \r\n0.523646 0.347684 0.0563968 1 \r\n0.640684 -0.234919 -0.927046 1 \r\n-0.10287 -0.607922 0.102926 1 \r\n0.104141 -0.469408 -0.977462 1 \r\n0.0669437 -0.386272 0.275811 1 \r\n0.663326 -0.698934 0.0448787 1 \r\n0.162542 -0.262506 0.226065 1 \r\n0.54883 0.376022 -0.00572813 1 \r\n-0.0197333 -0.22658 -0.915523 1 \r\n-0.146586 -0.216582 0.842862 1 \r\n0.620626 0.131953 -0.123262 1 \r\n0.605684 -0.652805 0.0339521 1 \r\n-0.0155339 0.885359 -0.632373 1 \r\n0.736046 0.168915 -0.656186 1 \r\n0.626178 0.260167 -0.850858 1 \r\n-0.186744 -0.627766 -0.105079 1 \r\n-0.271422 -0.0563452 -0.0998099 1 \r\n0.453075 0.721782 -0.494776 1 \r\n0.501658 -0.175227 -0.628248 1 \r\n0.158228 0.569723 0.159188 1 \r\n-0.348277 -0.60114 0.520502 1 \r\n0.287723 0.794584 -0.430785 1 \r\n-0.393883 0.102878 -0.717898 1 \r\n-0.0820938 -0.631639 0.232063 1 \r\n0.440581 0.673603 -0.736562 1 \r\n0.609098 -0.148552 -0.2405 1 \r\n-0.720844 -0.626197 0.703162 1 \r\n0.556623 -0.487941 -0.969342 1 \r\n0.426407 0.666879 -0.0476487 1 \r\n0.50943 -0.649979 -0.940994 1 \r\n0.031987 -0.668314 -0.592707 1 \r\n-0.185724 0.381698 0.0572684 1 \r\n0.610893 0.24095 -0.963568 1 \r\n0.351477 -0.942784 0.386114 1 \r\n-0.386923 0.226713 -0.650694 1 \r\n0.57197 -0.15127 -0.102267 1 \r\n0.569137 -0.207054 -0.341549 1 \r\n0.22854 -0.215377 0.209151 1 \r\n0.0147015 -0.314468 0.228255 1 \r\n0.26808 0.578097 -0.953916 1 \r\n-0.217088 -0.537407 -0.102348 1 \r\n0.46865 -0.935885 0.04381 1 \r\n-0.134315 -0.762586 -0.165856 1 \r\n0.525224 -0.596108 -0.489947 1 \r\n0.565132 -0.57185 0.103092 1 \r\n0.539606 -0.0315502 -0.922517 1 \r\n-0.0586062 0.565769 -0.839018 1 \r\n0.439668 0.713854 -0.742432 1 \r\n-0.133588 -0.293257 0.71882 1 \r\n0.486923 -0.918305 0.425193 1 \r\n0.471659 -0.879871 0.0134043 1 \r\n-0.289516 -0.128579 -0.982512 1 \r\n-0.0296035 0.142423 -0.898187 1 \r\n0.680095 0.0626789 -0.927735 1 \r\n-0.218507 -0.765993 0.584069 1 \r\n0.540892 -0.910063 0.0290232 1 \r\n-0.464164 0.0881121 -0.366568 1 \r\n0.422869 -0.647331 0.583198 1 \r\n0.585066 0.441042 -0.070031 1 \r\n0.595339 -0.61997 -0.294121 1 \r\n-0.269306 0.556492 -0.57871 1 \r\n0.467924 0.321244 0.170374 1 \r\n0.241319 0.385309 -0.958927 1 \r\n0.528835 -0.267109 -0.684019 1 \r\n0.0281569 -0.887727 -0.318961 1 \r\n0.532 -0.63774 -0.952014 1 \r\n-0.366457 0.02276 -0.172325 1 \r\n0.493876 0.698964 -0.392971 1 \r\n0.687711 0.346625 -0.703772 1 \r\n0.301856 0.958763 -0.512667 1 \r\n0.00988263 0.731775 -0.0775115 1 \r\n0.308435 -0.614151 -0.618346 1 \r\n0.150685 0.493299 -0.961568 1 \r\n0.22642 -0.537207 -0.662289 1 \r\n-0.621996 -0.596221 0.636554 1 \r\n0.00678313 -0.512022 0.507749 1 \r\n-0.239867 0.566713 -0.221742 1 \r\n-0.115424 -0.734708 0.456188 1 \r\n-0.366795 -0.688473 0.779565 1 \r\n-0.0685035 -0.601328 -0.981996 1 \r\n-0.379008 -0.0630111 -0.698155 1 \r\n-0.402352 -0.0707303 -0.203833 1 \r\n0.471659 0.267898 0.177949 1 \r\n-0.108362 -0.763209 -0.409137 1 \r\n0.315761 -0.348442 0.202469 1 \r\n-0.149983 -0.585578 0.576774 1 \r\n-0.189273 -0.178281 -0.645555 1 \r\n-0.0317349 0.751252 -0.518152 1 \r\n0.305332 0.0874687 0.254923 1 \r\n0.567612 -0.141409 -0.952157 1 \r\n0.168826 0.249884 0.283043 1 \r\n-0.0380086 -0.0308249 0.641307 1 \r\n-0.0844772 -0.759575 0.499095 1 \r\n0.599987 -0.173104 -0.791584 1 \r\n0.000431597 -0.869896 -0.139631 1 \r\n-0.196154 -0.684579 0.442273 1 \r\n0.133849 -0.363076 0.532248 1 \r\n0.536389 -0.328123 -0.674169 1 \r\n-0.0459914 -0.781392 0.328337 1 \r\n-0.0504979 -0.584515 0.444078 1 \r\n0.519776 -0.144157 -0.557291 1 \r\n0.525535 -0.128027 -0.721509 1 \r\n-0.367187 -0.262218 -0.931344 1 \r\n0.431325 0.195925 0.218438 1 \r\n0.597943 -0.59071 -0.203224 1 \r\n0.407584 -0.630051 -0.569239 1 \r\n-0.167151 -0.0778103 0.0792876 1 \r\n0.564821 0.513035 -0.740536 1 \r\n-0.0520679 -0.753225 0.372801 1 \r\n-0.302386 -0.123692 -0.752544 1 \r\n-0.00616372 -0.599717 0.524995 1 \r\n-0.335788 -0.0568827 -0.839354 1 \r\n0.237876 -0.571186 -0.651374 1 \r\n-0.120067 -0.284344 0.786258 1 \r\n0.305519 -0.130355 0.180097 1 \r\n0.544285 0.00381231 -0.925677 1 \r\n-0.31962 0.486647 -0.440438 1 \r\n0.588095 -0.0652172 -0.686983 1 \r\n-0.241201 -0.294511 -0.0695153 1 \r\n0.614795 -0.0538309 -0.15212 1 \r\n-0.378746 -0.574159 0.639906 1 \r\n0.424788 -0.832144 0.55186 1 \r\n-0.0557184 -0.52074 0.253522 1 \r\n-0.0475292 -0.627664 0.596127 1 \r\n-0.325971 0.0854349 0.814669 1 \r\n-0.0823833 0.578221 -0.80469 1 \r\n-0.119949 -0.404695 0.155961 1 \r\n0.0778102 -0.624741 0.563306 1 \r\n-0.27429 -0.232433 -0.381895 1 \r\n-0.170876 -0.72944 -0.292363 1 \r\n0.603629 -0.513253 -0.224561 1 \r\n0.549069 -0.214375 -0.796044 1 \r\n-0.100921 -0.329656 0.611495 1 \r\n0.15221 -0.404193 0.336825 1 \r\n-0.168288 0.654375 -0.197017 1 \r\n0.340447 0.228643 -0.913075 1 \r\n0.522111 0.52062 -0.874969 1 \r\n0.500589 0.555424 -0.826406 1 \r\n-0.260211 -0.710505 0.740445 1 \r\n0.0180314 -0.837315 0.0120096 1 \r\n0.323834 0.807597 -0.509791 1 \r\n-0.344913 -0.609217 0.719816 1 \r\n0.372832 -0.17078 0.144619 1 \r\n0.220815 -0.321655 0.238787 1 \r\n0.190936 -0.89053 -0.382012 1 \r\n0.192226 -0.55731 -0.838753 1 \r\n0.0882387 -0.524148 -0.9811 1 \r\n0.22771 0.97382 -0.493361 1 \r\n0.0424311 -0.558455 0.549629 1 \r\n0.171811 0.993536 -0.530402 1 \r\n-0.472586 0.0369554 -0.362236 1 \r\n-0.313657 -0.744407 0.555492 1 \r\n-0.078711 -0.779061 -0.0671889 1 \r\n-0.318039 0.112113 -0.844437 1 \r\n0.325888 -0.0944326 0.181414 1 \r\n0.126248 -0.623512 -0.830002 1 \r\n0.69347 -0.727103 0.286395 1 \r\n-0.0631492 0.642089 0.00718355 1 \r\n0.542781 0.534121 -0.754311 1 \r\n-0.224965 -0.058241 0.95658 1 \r\n0.189463 -0.488684 -0.797431 1 \r\n0.0197861 -0.449978 0.435901 1 \r\n-0.108708 -0.220438 -0.736392 1 \r\n-0.26746 0.564462 -0.333366 1 \r\n0.34549 0.443252 -0.962283 1 \r\n-0.0885438 -0.58474 0.519496 1 \r\n0.581621 -0.259784 -0.266131 1 \r\n-0.00231612 -0.171218 0.183376 1 \r\n0.132086 -0.135361 0.211818 1 \r\n0.73425 -0.0428576 -0.44274 1 \r\n-0.0978081 -0.680179 0.0385801 1 \r\n0.261802 -0.962146 0.430371 1 \r\n-0.717779 -0.650401 0.804241 1 \r\n0.586124 -0.194632 -0.176021 1 \r\n0.649058 0.223247 -0.814872 1 \r\n0.0623625 -0.683523 -0.979632 1 \r\n0.411143 0.550775 -0.909283 1 \r\n-0.165282 -0.0407625 0.932973 1 \r\n-0.0418293 0.606082 0.0673234 1 \r\n0.576941 -0.37752 -0.152239 1 \r\n0.443352 -0.745112 -0.469032 1 \r\n0.513228 -0.584 -0.0162646 1 \r\n-0.0562279 0.366745 -0.963411 1 \r\n0.746308 0.194431 -0.600338 1 \r\n0.645011 0.383597 -0.146344 1 \r\n0.240873 -0.359962 0.264843 1 \r\n0.0974023 0.227979 0.277461 1 \r\n0.704833 0.260167 -0.17567 1 \r\n0.566803 0.269298 -0.0275813 1 \r\n0.215383 -0.646201 -0.934961 1 \r\n-0.101423 -0.256581 -0.753715 1 \r\n-0.166223 -0.134966 0.919504 1 \r\n-0.34993 -0.184305 -0.866058 1 \r\n0.351508 -0.963487 0.276527 1 \r\n0.219811 0.0387608 0.251311 1 \r\n-0.125556 0.700105 -0.496589 1 \r\n0.528129 -0.750199 -0.194009 1 \r\n0.482389 -0.814526 -0.22979 1 \r\n0.359218 -0.941236 0.355503 1 \r\n-0.307243 0.0377024 0.968046 1 \r\n-0.129922 -0.374946 0.148967 1 \r\n0.523252 -0.54386 -0.0287829 1 \r\n-0.170704 -0.104545 0.945674 1 \r\n0.361802 0.153028 0.255576 1 \r\n0.48243 -0.638931 -0.957594 1 \r\n0.524757 0.645607 -0.592375 1 \r\n0.57526 -0.264458 -0.33775 1 \r\n-0.150272 -0.633123 -0.48634 1 \r\n-0.340734 -0.0875685 -0.879457 1 \r\n0.226684 0.80658 -0.876052 1 \r\n0.11894 -0.888413 0.514027 1 \r\n0.360038 0.684758 -0.00550401 1 \r\n-0.175354 -0.0753562 0.970132 1 \r\n0.505684 -0.669042 0.539512 1 \r\n-0.391822 -0.127144 -0.239605 1 \r\n-0.246784 0.122594 -0.980717 1 \r\n0.499811 0.001104 0.103704 1 \r\n-0.193886 -0.0197935 0.854453 1 \r\n0.00700313 0.906818 -0.589411 1 \r\n0.190739 -0.133741 -0.922104 1 \r\n-0.0241755 0.801526 -0.794132 1 \r\n0.537188 0.153869 0.0921961 1 \r\n-0.121055 -0.440716 -0.983734 1 \r\n0.566066 0.465157 -0.838652 1 \r\n-0.369025 0.363394 -0.293962 1 \r\n-0.0542554 -0.800473 0.155701 1 \r\n0.617638 0.00488114 -0.135992 1 \r\n-0.725081 -0.663187 0.874916 1 \r\n0.764395 0.0415729 -0.354403 1 \r\n0.598981 -0.452637 -0.229889 1 \r\n0.0274949 0.495644 0.188273 1 \r\n0.240572 -0.520052 0.580863 1 \r\n-0.168365 -0.660767 0.435165 1 \r\n0.085576 -0.0264386 -0.907166 1 \r\n-0.540247 -0.614229 0.571161 1 \r\n0.701855 -0.120848 -0.950972 1 \r\n0.498825 0.676644 -0.581796 1 \r\n-0.291879 0.0978349 0.845145 1 \r\n0.426272 -0.643279 -0.954792 1 \r\n-0.30002 0.057387 -0.14318 1 \r\n-0.310378 0.106551 0.794175 1 \r\n0.472936 -0.290933 0.0490501 1 \r\n-0.0276631 0.77434 -0.267002 1 \r\n-0.242952 -0.718639 0.467643 1 \r\n0.318417 0.402949 0.243923 1 \r\n0.207285 -0.344658 0.257122 1 \r\n-0.316586 -0.202588 -0.454827 1 \r\n-0.0649868 -0.836124 -0.175259 1 \r\n-0.457436 0.0117193 -0.526106 1 \r\n0.00985569 0.783191 -0.394657 1 \r\n0.0721155 0.884218 -0.502915 1 \r\n0.163179 -0.401095 -0.969412 1 \r\n-0.275144 -0.239538 -0.340745 1 \r\n-0.364442 0.271664 -0.190954 1 \r\n0.42733 0.721979 -0.658153 1 \r\n0.0505155 -0.470555 -0.980891 1 \r\n-0.65117 -0.682422 0.909356 1 \r\n-0.155611 0.139601 -0.910786 1 \r\n0.198411 0.338905 -0.962685 1 \r\n0.14551 -0.755995 -0.556519 1 \r\n-0.131801 0.668685 -0.147721 1 \r\n-0.0479577 -0.807197 0.25018 1 \r\n0.253802 -0.792696 0.587462 1 \r\n0.432944 -0.627142 -0.96639 1 \r\n-0.177493 -0.0423201 0.979616 1 \r\n0.241682 -0.379218 0.29123 1 \r\n0.0360411 0.396724 0.243394 1 \r\n-0.20358 -0.21104 0.0247999 1 \r\n0.340146 0.620257 0.091449 1 \r\n0.754215 0.0777978 -0.469137 1 \r\n0.725036 0.0489714 -0.579963 1 \r\n0.4243 0.730446 -0.804694 1 \r\n0.590482 -0.432952 -0.368703 1 \r\n0.614701 -0.93386 0.100913 1 \r\n-0.342283 -0.736434 0.529177 1 \r\n0.468878 -0.52767 0.33145 1 \r\n-0.438537 0.0844284 -0.572948 1 \r\n0.353221 0.574413 0.135985 1 \r\n0.592215 -0.618694 -0.207636 1 \r\n-0.471521 -0.0326334 -0.330529 1 \r\n0.389041 -0.474988 0.395163 1 \r\n0.529084 -0.696378 -0.409503 1 \r\n-0.137184 -0.452825 -0.978013 1 \r\n0.361823 -0.619973 -0.919197 1 \r\n0.747138 0.239891 -0.572518 1 \r\n0.492454 0.522457 -0.902585 1 \r\n0.679835 -0.126582 -0.338334 1 \r\n0.430506 -0.929461 0.460629 1 \r\n0.0678414 0.798403 -0.867928 1 \r\n0.0672903 0.737845 -0.0605489 1 \r\n0.407926 -0.282072 -0.96375 1 \r\n-0.0872706 -0.085655 0.605414 1 \r\n0.68465 -0.1046 -0.824987 1 \r\n0.436358 0.682527 -0.76178 1 \r\n0.558979 -0.634511 0.389943 1 \r\n-0.0192083 0.527749 -0.913319 1 \r\n0.463348 -0.698177 -0.489245 1 \r\n0.517005 -0.556143 0.28185 1 \r\n0.693719 -0.0741525 -0.469068 1 \r\n-0.0784962 0.210536 -0.896963 1 \r\n-0.0406505 0.834752 -0.661566 1 \r\n-0.228828 -0.0877843 0.906015 1 \r\n0.171482 0.690206 -0.932483 1 \r\n0.311143 -0.517395 -0.855944 1 \r\n-0.623955 -0.57935 0.698192 1 \r\n0.535393 -0.145909 -0.747281 1 \r\n-0.259668 -0.155205 -0.971703 1 \r\n0.609471 0.305482 -0.91645 1 \r\n-0.328288 -0.793734 0.718955 1 \r\n0.454237 -0.804521 -0.013716 1 \r\n0.17051 -0.989546 0.15456 1 \r\n0.686684 0.217426 -0.152107 1 \r\n0.665941 0.0768431 -0.768775 1 \r\n0.65738 0.482217 -0.274245 1 \r\n0.43614 0.359866 -0.948302 1 \r\n-0.146075 0.666402 -0.172264 1 \r\n0.288335 -0.897403 -0.0561461 1 \r\n-0.245884 -0.341405 -0.0966886 1 \r\n-0.314622 -0.0186136 -0.161744 1 \r\n-0.266436 0.294721 -0.938212 1 \r\n-0.189567 0.0980633 -0.930137 1 \r\n0.646589 -0.151703 -0.967435 1 \r\n0.525307 -0.213307 -0.955206 1 \r\n0.551425 -0.614136 0.338797 1 \r\n0.674076 0.364556 -0.179141 1 \r\n-0.482683 -0.714554 0.650189 1 \r\n0.100283 0.0756705 -0.907776 1 \r\n0.378124 0.853908 -0.787074 1 \r\n0.27387 0.857467 -0.477379 1 \r\n0.212653 -0.989118 0.214412 1 \r\n-0.757434 -0.578134 0.763772 1 \r\n-0.195175 -0.356804 -0.865191 1 \r\n-0.158948 0.269651 0.13665 1 \r\n0.106508 -0.415689 0.683809 1 \r\n-0.301248 0.499255 -0.662127 1 \r\n0.584567 0.609548 -0.286382 1 \r\n0.0134087 -0.480867 0.353978 1 \r\n-0.15037 -0.682127 -0.0788875 1 \r\n0.121637 0.68563 -0.934565 1 \r\n0.00220597 -0.519805 -0.649307 1 \r\n-0.32935 -0.0297083 -0.875395 1 \r\n-0.24764 0.185829 -0.981285 1 \r\n0.584443 0.0914949 -0.0670063 1 \r\n-0.295979 0.518016 -0.612124 1 \r\n-0.116919 -0.204281 0.882958 1 \r\n0.696687 -0.0417753 -0.85078 1 \r\n0.0814119 -0.713006 -0.885434 1 \r\n0.710249 0.355788 -0.24355 1 \r\n0.678414 0.0598669 -0.898787 1 \r\n0.330994 0.173346 0.265974 1 \r\n-0.21148 -0.181775 -0.934845 1 \r\n0.716143 0.0114496 -0.557852 1 \r\n0.680022 0.309757 -0.166749 1 \r\n-0.280417 -0.0560515 -0.131803 1 \r\n-0.17057 -0.389915 -0.915178 1 \r\n0.501897 -0.427556 -0.75755 1 \r\n-0.203979 -0.641734 -0.232479 1 \r\n0.237331 -0.605971 -0.917397 1 \r\n0.471898 -0.456435 0.160692 1 \r\n0.641701 -0.208009 -0.849278 1 \r\n-0.0547669 -0.589504 -0.878273 1 \r\n0.354393 -0.80112 0.58299 1 \r\n0.339783 0.870033 -0.79932 1 \r\n-0.115623 -0.322362 0.718934 1 \r\n0.513249 0.554127 -0.0331391 1 \r\n0.184219 -0.464515 -0.706918 1 \r\n0.212645 0.539589 0.185482 1 \r\n-0.0627559 -0.555695 0.26423 1 \r\n-0.675374 -0.64641 0.628222 1 \r\n0.14949 0.694689 0.0182637 1 \r\n-0.0254902 -0.504856 0.312959 1 \r\n-0.368107 -0.188052 -0.437915 1 \r\n0.0100414 0.785079 -0.244705 1 \r\n0.0760638 0.408771 -0.964604 1 \r\n-0.194878 0.328476 0.0755728 1 \r\n0.313955 0.0989558 -0.904147 1 \r\n0.148769 -0.905358 -0.0616094 1 \r\n-0.245358 0.069154 -0.00912642 1 \r\n-0.109696 0.70768 -0.19667 1 \r\n0.239039 -0.952129 0.0481371 1 \r\n0.511049 -0.38752 -0.619663 1 \r\n-0.10334 -0.277385 -0.928519 1 \r\n-0.334496 0.457261 -0.410777 1 \r\n0.748664 0.2878 -0.425773 1 \r\n0.0242792 0.558391 0.142284 1 \r\n0.0897474 0.121878 0.265745 1 \r\n-0.489709 -0.716612 0.838473 1 \r\n0.584059 -0.455966 -0.410435 1 \r\n-0.306429 0.0168765 0.845177 1 \r\n0.414671 -0.723916 -0.507566 1 \r\n0.336265 -0.915208 -0.176303 1 \r\n0.50115 0.243129 0.143623 1 \r\n0.0177689 -0.5784 -0.806714 1 \r\n0.44164 0.722239 -0.548933 1 \r\n0.561583 -0.401591 -0.471321 1 \r\n0.109504 -0.720019 -0.901244 1 \r\n0.413934 0.659968 -0.836466 1 \r\n0.320046 -0.996945 0.166576 1 \r\n-0.0421115 0.792219 -0.662341 1 \r\n0.520606 -0.626545 0.514224 1 \r\n-0.0570352 0.757758 -0.706249 1 \r\n0.475291 0.587114 -0.00814068 1 \r\n-0.0352868 0.202162 0.236763 1 \r\n0.474596 0.00417554 0.132624 1 \r\n0.354984 0.77572 -0.510155 1 \r\n-0.0390546 -0.544672 0.329499 1 \r\n0.627558 0.210121 -0.871848 1 \r\n0.623355 -0.601499 0.186945 1 \r\n0.0403475 -0.817203 0.524808 1 \r\n-0.0507895 -0.0598431 0.672655 1 \r\n0.356842 -0.762016 -0.505161 1 \r\n0.596833 -0.954518 0.107792 1 \r\n-0.293933 -0.334713 -0.976289 1 \r\n-0.256059 -0.20284 -0.0998317 1 \r\n-0.163454 -0.567412 -0.494804 1 \r\n-0.286649 -0.0795058 -0.153571 1 \r\n0.0474305 -0.747265 0.586207 1 \r\n0.179116 -0.637716 -0.879066 1 \r\n-0.732704 -0.648708 0.897921 1 \r\n-0.119575 0.270969 0.169658 1 \r\n-0.205162 -0.462754 -0.445432 1 \r\n0.765297 0.115206 -0.314014 1 \r\n0.58051 -0.244173 -0.186197 1 \r\n0.394198 0.826337 -0.796533 1 \r\n0.370487 0.768373 -0.47539 1 \r\n0.684941 -0.854352 0.209857 1 \r\n-0.198185 -0.266588 -0.798225 1 \r\n-0.303435 0.0147804 -0.967697 1 \r\n0.421851 0.132472 0.216249 1 \r\n0.0614493 0.762635 -0.112832 1 \r\n0.422983 -0.43261 -0.677323 1 \r\n0.390825 0.743178 -0.194803 1 \r\n0.0469822 -0.699573 -0.970588 1 \r\n-0.578077 -0.693287 0.700744 1 \r\n-0.105953 -0.375061 -0.700639 1 \r\n-0.227903 0.180132 -0.97664 1 \r\n-0.275225 -0.581825 0.534708 1 \r\n-0.247007 -0.473697 -0.161369 1 \r\n0.602104 0.352114 -0.902254 1 \r\n-0.127457 0.294721 -0.931762 1 \r\n0.602768 -0.314668 -0.948005 1 \r\n0.534988 -0.432037 -0.512231 1 \r\n-0.0465081 0.718679 -0.679335 1 \r\n0.165865 0.620236 0.11408 1 \r\n0.144531 0.795985 -0.214327 1 \r\n-0.0309473 -0.846891 0.22702 1 \r\n0.330465 -0.59811 -0.919847 1 \r\n-0.0651684 -0.501922 -0.838454 1 \r\n0.000249982 0.760456 -0.549987 1 \r\n0.285222 -0.963309 0.294935 1 \r\n-0.416562 0.241302 -0.459301 1 \r\n0.412855 -0.503368 0.525587 1 \r\n0.589268 0.56909 -0.504563 1 \r\n0.0416985 -0.275786 0.692578 1 \r\n0.652067 -0.695528 0.332093 1 \r\n-0.701638 -0.598568 0.652825 1 \r\n0.357423 -0.986076 0.20334 1 \r\n-0.391449 0.32114 -0.332351 1 \r\n0.390701 -0.80101 -0.44905 1 \r\n0.0839106 0.226215 -0.934174 1 \r\n-0.522572 -0.788698 0.801013 1 \r\n0.61632 0.509912 -0.614217 1 \r\n-0.0953499 -0.805698 -0.342226 1 \r\n0.587328 -0.0602167 -0.11205 1 \r\n0.449848 0.71761 -0.204755 1 \r\n0.377595 -0.623491 -0.959545 1 \r\n-0.126009 -0.0752607 0.116529 1 \r\n0.707448 -0.672714 0.13556 1 \r\n-0.149244 -0.0742178 0.971305 1 \r\n0.340281 -0.464949 0.461314 1 \r\n0.603432 0.121286 -0.110852 1 \r\n0.104874 -0.192715 -0.931842 1 \r\n0.401378 -0.87921 -0.207216 1 \r\n-0.299821 0.0838265 -0.937063 1 \r\n0.677625 0.38532 -0.673858 1 \r\n0.565921 0.607463 -0.47798 1 \r\n0.136111 -0.887015 0.540321 1 \r\n0.33997 -0.933643 0.0504407 1 \r\n-0.297895 0.268676 -0.860403 1 \r\n0.476983 -0.548105 0.487785 1 \r\n-0.184357 0.607338 -0.699597 1 \r\n0.514847 -0.176288 -0.744617 1 \r\n0.605445 -0.591516 0.0999994 1 \r\n-0.476025 -0.0270487 -0.416708 1 \r\n-0.359528 -0.576597 0.602197 1 \r\n-0.483704 -0.638436 0.517472 1 \r\n0.532861 0.211221 -0.939863 1 \r\n0.0917864 -0.822437 0.560379 1 \r\n-0.33995 -0.659343 0.47004 1 \r\n0.695234 0.435003 -0.458588 1 \r\n-0.12538 -0.166523 0.10801 1 \r\n0.569999 -0.293982 -0.42863 1 \r\n0.607157 0.326193 -0.887064 1 \r\n0.00916356 -0.485112 0.455191 1 \r\n0.522661 -0.220361 -0.598507 1 \r\n0.0489496 -0.923972 0.23943 1 \r\n0.48269 0.672981 -0.147984 1 \r\n-0.12872 -0.288173 0.657567 1 \r\n0.110721 -0.321336 0.55129 1 \r\n0.656841 0.426702 -0.662094 1 \r\n0.0106796 -0.779248 0.549007 1 \r\n-0.156399 -0.252259 -0.546438 1 \r\n-0.286707 0.113815 0.769188 1 \r\n-0.16965 -0.474331 0.0651131 1 \r\n0.672385 0.0914119 -0.144928 1 \r\n-0.14943 0.421731 -0.965288 1 \r\n0.619495 -0.902352 0.0739021 1 \r\n0.0528762 -0.204489 0.599863 1 \r\n-0.575831 -0.770437 0.877385 1 \r\n-0.210951 -0.775708 0.615614 1 \r\n0.635558 -0.909783 0.116789 1 \r\n0.203571 -0.331439 -0.964756 1 \r\n0.299501 0.523007 -0.957972 1 \r\n0.374607 0.3462 -0.952547 1 \r\n-0.168878 -0.247515 -0.783024 1 \r\n0.110833 0.474164 -0.963093 1 \r\n-0.125342 0.0365921 0.683114 1 \r\n-0.0760192 -0.638631 0.626312 1 \r\n-0.0444452 -0.670136 -0.550474 1 \r\n-0.253224 0.474465 -0.835768 1 \r\n-0.300946 -0.736977 0.507645 1 \r\n0.533784 -0.718623 0.520398 1 \r\n0.299522 -0.260066 -0.966179 1 \r\n0.507334 -0.739882 -0.397226 1 \r\n0.590711 -0.0288595 -0.109956 1 \r\n0.044552 -0.715976 -0.897699 1 \r\n0.468754 -0.961439 0.252712 1 \r\n-0.426342 0.226443 -0.36544 1 \r\n-0.110424 -0.364645 -0.83184 1 \r\n-0.40829 -0.593164 0.716683 1 \r\n0.612927 -0.415046 -0.901645 1 \r\n0.586062 -0.350772 -0.286909 1 \r\n0.429862 0.302628 0.213416 1 \r\n-0.47576 -0.00107706 -0.367819 1 \r\n0.621228 0.241852 -0.955007 1 \r\n-0.0637811 0.203562 0.214568 1 \r\n-0.189586 -0.150437 0.873515 1 \r\n0.317141 -0.464912 0.500797 1 \r\n0.113356 -0.327907 0.579773 1 \r\n-0.182917 0.0338008 0.673215 1 \r\n0.697009 -0.821933 0.181134 1 \r\n0.617192 0.263975 -0.937336 1 \r\n0.00858247 -0.586435 -0.61719 1 \r\n-0.0450118 0.751916 -0.480208 1 \r\n-0.167319 -0.722719 0.456883 1 \r\n0.0895565 -0.946105 0.23612 1 \r\n0.00652999 -0.697961 0.617274 1 \r\n0.608745 -0.88646 0.350844 1 \r\n0.737218 0.21506 -0.65181 1 \r\n0.540851 -0.711959 -0.00858271 1 \r\n-0.101667 -0.296087 -0.697929 1 \r\n0.192483 -0.263212 -0.966059 1 \r\n0.595432 -0.143004 -0.774485 1 \r\n0.47801 -0.517582 -0.972422 1 \r\n-0.22244 0.422312 -0.928518 1 \r\n0.413187 -0.498248 0.489331 1 \r\n0.30278 -0.888667 0.0110499 1 \r\n0.400258 -0.600933 -0.969577 1 \r\n0.156008 -0.670144 -0.970913 1 \r\n-0.0670736 -0.450716 -0.780733 1 \r\n0.34383 -0.593155 -0.896275 1 \r\n0.23979 -0.0555379 -0.910712 1 \r\n-0.105798 -0.500501 0.144328 1 \r\n0.00177646 0.872503 -0.585696 1 \r\n0.149262 0.425062 0.250544 1 \r\n-0.385282 -0.58169 0.687379 1 \r\n-0.129298 -0.317185 -0.629373 1 \r\n0.0509876 0.793422 -0.384041 1 \r\n0.641795 -0.917527 0.186624 1 \r\n0.343612 -0.246216 0.172044 1 \r\n0.445531 -0.930694 0.428783 1 \r\n0.486072 -0.19935 0.032655 1 \r\n0.0483613 -0.803837 0.548322 1 \r\n0.236791 -0.892221 -0.370754 1 \r\n0.46562 0.0499054 0.157901 1 \r\n-0.244131 -0.294491 -0.330803 1 \r\n0.533099 0.100689 0.0894879 1 \r\n0.547959 0.294721 0.025049 1 \r\n-0.318212 0.0728688 -0.851591 1 \r\n0.377367 -0.486007 -0.788202 1 \r\n0.0863678 0.842763 -0.490045 1 \r\n-0.524517 -0.700319 0.585813 1 \r\n0.369325 0.927011 -0.56908 1 \r\n0.027194 0.224129 -0.918111 1 \r\n-0.192101 0.505844 -0.840433 1 \r\n0.168678 -0.930531 -0.125932 1 \r\n0.435269 0.474828 -0.958514 1 \r\n-0.349584 -0.30089 -0.932142 1 \r\n0.592091 0.395094 -0.067025 1 \r\n0.365185 -0.880461 0.553925 1 \r\n0.325754 -0.884834 -0.058184 1 \r\n0.207519 0.112643 0.268817 1 \r\n0.665132 -0.88546 0.182546 1 \r\n0.57333 -0.0758377 -0.944305 1 \r\n0.613809 0.381916 -0.799426 1 \r\n-0.223172 -0.250295 -0.797012 1 \r\n-0.372833 -0.575567 0.662102 1 \r\n0.0217546 0.444809 -0.965156 1 \r\n0.0516963 -0.363682 0.252422 1 \r\n0.135623 -0.426091 0.427621 1 \r\n0.0855241 -0.106926 0.207491 1 \r\n0.454476 -0.819431 -0.144598 1 \r\n0.513871 -0.550501 -0.51518 1 \r\n0.384755 0.774298 -0.575825 1 \r\n-0.048269 -0.835691 -0.35577 1 \r\n0.025209 -0.892417 0.283448 1 \r\n-0.217738 -0.379949 -0.976571 1 \r\n0.429094 -0.849531 0.00428534 1 \r\n-0.0254695 0.741279 -0.578535 1 \r\n0.271691 -0.447216 -0.811227 1 \r\n0.055049 -0.511402 -0.982305 1 \r\n-0.457618 -0.714735 0.58602 1 \r\n0.721415 0.0778393 -0.179858 1 \r\n0.506764 -0.494889 0.159022 1 \r\n-0.606777 -0.650542 0.545738 1 \r\n0.611744 -0.266007 -0.959205 1 \r\n0.156832 -0.698152 -0.952718 1 \r\n0.0496833 -0.590842 -0.633581 1 \r\n0.507511 -0.12269 0.024032 1 \r\n-0.0228546 -0.836386 0.296948 1 \r\n0.392413 -0.161412 -0.931256 1 \r\n-0.0507096 0.736693 -0.693623 1 \r\n-0.033254 -0.784674 0.0466739 1 \r\n-0.32438 0.405564 -0.741908 1 \r\n-0.0345054 -0.0639294 0.61192 1 \r\n0.0930327 0.581376 0.141651 1 \r\n0.755118 0.220528 -0.52556 1 \r\n0.47387 -0.412161 -0.641882 1 \r\n0.0225567 -0.75561 -0.520893 1 \r\n0.563119 -0.705507 -0.00399423 1 \r\n0.564873 -0.0494094 -0.0471278 1 \r\n0.0153034 0.773188 -0.178222 1 \r\n0.0862173 -0.432393 0.357174 1 \r\n-0.242175 -0.120386 -0.957879 1 \r\n-0.0565786 0.737357 -0.772442 1 \r\n-0.497621 -0.584101 0.641473 1 \r\n-0.0561439 -0.36567 0.210604 1 \r\n-0.025178 -0.803087 0.37553 1 \r\n-0.00193423 0.510566 -0.941437 1 \r\n0.115817 -0.786078 -0.521883 1 \r\n-0.217021 0.627925 -0.444175 1 \r\n0.452048 0.68039 -0.681553 1 \r\n-0.116314 -0.624645 0.634116 1 \r\n-0.462766 -0.582758 0.698928 1 \r\n0.305021 -0.598319 0.595535 1 \r\n-0.0420918 -0.213679 -0.908786 1 \r\n0.0654382 0.273345 -0.961214 1 \r\n0.420471 -0.878493 0.530837 1 \r\n0.581589 -0.179964 -0.293597 1 \r\n0.715645 -0.122861 -0.931388 1 \r\n-0.191963 -0.0794363 -0.921961 1 \r\n-0.0665174 -0.729682 -0.489282 1 \r\n-0.16075 -0.353292 -0.85518 1 \r\n0.583219 -0.320442 -0.903436 1 \r\n-0.363505 0.252592 -0.720246 1 \r\n-0.121511 0.139176 0.157434 1 \r\n0.710332 0.259866 -0.715096 1 \r\n0.328119 0.773188 -0.226127 1 \r\n-0.147513 -0.326872 -0.579937 1 \r\n0.503225 -0.512974 0.0101949 1 \r\n0.588448 -0.111148 -0.958344 1 \r\n-0.141029 0.603322 -0.741119 1 \r\n-0.324496 -0.11662 -0.811425 1 \r\n-0.411186 0.26356 -0.28832 1 \r\n0.0445728 -0.301144 -0.966943 1 \r\n-0.200705 -0.232474 -0.783805 1 \r\n0.383002 -0.457978 -0.756292 1 \r\n0.34936 0.728143 -0.875372 1 \r\n0.104279 -0.344086 0.657349 1 \r\n0.673443 0.00806677 -0.834045 1 \r\n-0.0759124 0.598113 0.0466532 1 \r\n-0.255082 -0.313138 -0.284505 1 \r\n0.536659 -0.422385 -0.0418927 1 \r\n0.464583 -0.812396 -0.343361 1 \r\n0.323709 0.786304 -0.455217 1 \r\n-0.0500041 -0.164723 0.889671 1 \r\n0.500226 -0.400901 -0.72025 1 \r\n0.209397 -0.903057 -0.0459459 1 \r\n0.545458 -0.204352 -0.458733 1 \r\n0.450325 0.437846 0.153709 1 \r\n-0.109078 -0.265809 -0.663057 1 \r\n-0.436528 0.00086534 -0.224794 1 \r\n-0.732131 -0.592316 0.683758 1 \r\n-0.0242887 -0.063807 0.647937 1 \r\n0.27331 -0.490128 -0.845484 1 \r\n0.651912 0.334796 -0.14391 1 \r\n0.437292 -0.509867 -0.971871 1 \r\n0.385513 -0.518047 -0.610162 1 \r\n-0.0850387 0.310266 -0.930164 1 \r\n-0.105586 -0.800151 -0.173426 1 \r\n0.522173 -0.511512 -0.0212277 1 \r\n-0.456958 -0.0255826 -0.277728 1 \r\n-0.290282 -0.116573 -0.174459 1 \r\n0.311714 0.350122 0.259333 1 \r\n-0.252743 0.0145314 -0.0313283 1 \r\n0.72074 0.146699 -0.176883 1 \r\n0.272449 0.794315 -0.288138 1 \r\n0.470393 -0.718571 0.558854 1 \r\n0.371743 -0.456623 -0.641062 1 \r\n-0.0266462 -0.322502 0.218438 1 \r\n0.517763 0.0454226 0.09919 1 \r\n0.42126 0.63301 -0.827062 1 \r\n-0.115687 -0.799262 -0.295421 1 \r\n0.162969 -0.508793 0.599375 1 \r\n0.0398722 -0.0219996 0.214246 1 \r\n0.724974 0.361111 -0.459059 1 \r\n0.544877 -0.175326 -0.441547 1 \r\n0.534417 -0.270901 -0.0567936 1 \r\n-0.764724 -0.593398 0.791301 1 \r\n0.436503 0.698455 -0.711874 1 \r\n0.00687134 -0.211325 0.541349 1 \r\n0.242284 0.747651 -0.0720358 1 \r\n-0.0724362 -0.7585 -0.0251563 1 \r\n0.456323 -0.535748 0.510042 1 \r\n-0.158455 0.631879 -0.680162 1 \r\n0.0608506 -0.253148 -0.95138 1 \r\n0.558159 0.629181 -0.41545 1 \r\n-0.0430849 -0.830804 0.161201 1 \r\n0.253802 0.963464 -0.71643 1 \r\n0.434459 0.701475 -0.785094 1 \r\n0.189777 0.217052 -0.947548 1 \r\n-0.00463742 -0.43759 0.47362 1 \r\n-0.323094 -0.101373 -0.775704 1 \r\n-0.0918218 0.690486 -0.117868 1 \r\n0.498628 -0.798538 -0.251595 1 \r\n-0.22339 -0.423487 -0.407749 1 \r\n-0.0137066 -0.839987 -0.396037 1 \r\n-0.166472 -0.604954 -0.0226141 1 \r\n-0.187008 -0.691382 -0.338728 1 \r\n-0.280045 -0.0308104 0.863325 1 \r\n0.0192009 -0.839094 -0.423141 1 \r\n-0.310217 0.40654 -0.779383 1 \r\n-0.0930421 -0.374494 -0.786643 1 \r\n-0.00500369 -0.0755658 0.185555 1 \r\n-0.197197 0.523391 -0.0771889 1 \r\n0.00107604 0.766235 -0.510754 1 \r\n-0.0650501 0.560664 0.0903907 1 \r\n-0.0613353 -0.457447 -0.739673 1 \r\n-0.0766688 -0.837552 -0.232665 1 \r\n0.6772 0.29166 -0.763591 1 \r\n0.1935 0.683586 0.0351143 1 \r\n-0.224657 -0.577463 0.595919 1 \r\n0.585418 -0.908603 0.0444844 1 \r\n-0.0841036 -0.683212 0.128193 1 \r\n0.285824 -0.377484 0.271421 1 \r\n-0.16365 0.474559 -0.896893 1 \r\n-0.100161 0.162637 0.180802 1 \r\n0.539159 -0.353811 -0.606164 1 \r\n0.732061 0.285144 -0.228655 1 \r\n-0.211689 -0.166617 0.0144949 1 \r\n-0.342756 -0.247229 -0.86904 1 \r\n0.512772 -0.834346 -0.00350225 1 \r\n0.234927 -0.912881 0.557038 1 \r\n0.124724 -0.471611 0.638868 1 \r\n0.441194 -0.428383 0.177181 1 \r\n0.192883 0.600946 0.134927 1 \r\n-0.287285 -0.161566 -0.610309 1 \r\n0.598192 0.4688 -0.738382 1 \r\n-0.463826 0.0836813 -0.406439 1 \r\n-0.354048 0.415547 -0.378915 1 \r\n-0.17444 -0.500674 -0.488596 1 \r\n-0.0368122 -0.364058 -0.977738 1 \r\n0.61716 -0.588487 0.150544 1 \r\n0.117786 -0.590995 0.582596 1 \r\n-0.415871 -0.574871 0.660306 1 \r\n0.447544 -0.207359 0.0792149 1 \r\n0.297145 0.0292248 0.238901 1 \r\n0.0897132 -0.919425 -0.224953 1 \r\n-0.26063 0.178638 -0.0751177 1 \r\n0.186895 0.913988 -0.463392 1 \r\n0.591281 0.326411 -0.070527 1 \r\n0.60448 0.582683 -0.339799 1 \r\n-0.263692 0.132607 -0.0723814 1 \r\n0.0111289 -0.211918 0.198754 1 \r\n-0.222725 -0.257624 -0.398926 1 \r\n0.0621467 -0.94148 0.190338 1 \r\n-0.346619 -0.725738 0.499043 1 \r\n-0.0387101 0.268385 0.233931 1 \r\n-0.157603 -0.286397 -0.942516 1 \r\n0.0592339 -0.854861 0.453853 1 \r\n0.36285 -0.42937 0.319559 1 \r\n0.54716 -0.411831 -0.808927 1 \r\n-0.14869 0.0658853 -0.902589 1 \r\n0.563368 -0.653934 0.465827 1 \r\n0.487608 -0.634557 -0.873744 1 \r\n0.643891 0.460509 -0.635964 1 \r\n0.617472 0.438043 -0.738208 1 \r\n-0.156195 0.0944315 0.115772 1 \r\n0.302219 -0.226564 0.18984 1 \r\n-0.235251 -0.350264 -0.0542523 1 \r\n0.554973 -0.333468 -0.539802 1 \r\n-0.342062 -0.770114 0.664333 1 \r\n-0.634954 -0.749995 0.867144 1 \r\n0.17733 0.880773 -0.460897 1 \r\n-0.0571172 -0.478319 -0.801009 1 \r\n-0.159684 0.614664 -0.712221 1 \r\n0.534781 -0.374248 -0.575947 1 \r\n0.764602 0.0618176 -0.37661 1 \r\n-0.162486 0.379623 0.098941 1 \r\n0.357361 -0.108844 -0.918046 1 \r\n0.360712 -0.0107409 0.200113 1 \r\n-0.0459416 0.407816 -0.969336 1 \r\n0.737208 0.255383 -0.617347 1 \r\n0.69676 -0.788797 0.130963 1 \r\n0.680821 0.0247731 -0.161185 1 \r\n0.621955 0.539547 -0.451149 1 \r\n-0.0209204 -0.0584039 0.629861 1 \r\n0.00789142 -0.431315 0.452255 1 \r\n-0.0532913 -0.784025 0.118283 1 \r\n-0.209165 -0.416609 -0.433613 1 \r\n-0.202835 -0.606727 -0.148581 1 \r\n0.581745 0.52337 -0.695063 1 \r\n-0.311653 0.423516 -0.226023 1 \r\n0.480282 0.547724 -0.868931 1 \r\n-0.149321 -0.0128577 0.747003 1 \r\n0.232172 -0.532306 -0.856212 1 \r\n0.486623 0.699441 -0.46556 1 \r\n0.657443 -0.629409 0.192185 1 \r\n-0.218156 -0.592151 -0.21808 1 \r\n-0.404044 0.282498 -0.475124 1 \r\n-0.335252 -0.170376 -0.248608 1 \r\n-0.188641 -0.171918 0.0475247 1 \r\n-0.290948 -0.0182348 -0.142247 1 \r\n-0.127968 -0.348407 -0.637635 1 \r\n0.257289 0.720817 -0.0237896 1 \r\n-0.310896 -0.743013 0.539273 1 \r\n-0.386964 0.294534 -0.571018 1 \r\n0.588438 0.409227 -0.863166 1 \r\n0.485076 -0.647516 -0.899328 1 \r\n0.0961654 0.790703 -0.175203 1 \r\n-0.368177 -0.789689 0.750666 1 \r\n-0.318529 0.0186199 -0.880779 1 \r\n0.101926 -0.568108 -0.791242 1 \r\n0.522111 0.678252 -0.335247 1 \r\n-0.285162 0.50957 -0.70656 1 \r\n-0.766919 -0.580553 0.807935 1 \r\n-0.541187 -0.694408 0.556488 1 \r\n0.471732 0.13516 -0.904751 1 \r\n0.16109 0.995133 -0.631583 1 \r\n0.211119 -0.955989 0.314951 1 \r\n0.643839 -0.807796 0.384869 1 \r\n-0.374214 0.129899 -0.750704 1 \r\n0.397103 -0.438422 -0.675517 1 \r\n0.45901 -0.758007 -0.4437 1 \r\n0.123915 -0.193747 -0.937826 1 \r\n0.434677 -0.698591 0.576671 1 \r\n-0.0704843 0.649374 -0.735479 1 \r\n-0.269487 -0.211175 -0.168888 1 \r\n-0.255902 0.0626997 0.73563 1 \r\n-0.010084 0.522644 0.155504 1 \r\n-0.241316 -0.536728 -0.275786 1 \r\n-0.217866 -0.372399 -0.410656 1 \r\n-0.282668 0.0572935 -0.120551 1 \r\n0.382161 0.761805 -0.554769 1 \r\n-0.127981 -0.615063 0.434988 1 \r\n0.280242 -0.0937954 -0.916557 1 \r\n0.0345209 0.0674834 0.238444 1 \r\n0.301773 -0.304764 -0.965325 1 \r\n-0.067139 0.0798004 -0.897401 1 \r\n0.390161 -0.0437562 -0.904499 1 \r\n-0.041298 0.822881 -0.746112 1 \r\n0.623916 0.171997 -0.12342 1 \r\n0.474949 0.377942 -0.959532 1 \r\n0.0767009 -0.651617 -0.619203 1 \r\n0.533452 -0.326237 -0.0472202 1 \r\n-0.0757775 -0.720155 0.239752 1 \r\n-0.165857 -0.182996 -0.748009 1 \r\n0.762226 0.188371 -0.497301 1 \r\n-0.319358 0.105161 0.853914 1 \r\n0.719848 -0.76914 0.20913 1 \r\n0.505913 0.141406 0.137469 1 \r\n-0.230901 -0.5894 0.636658 1 \r\n0.543964 -0.472767 -0.795195 1 \r\n0.195378 -0.909566 -0.340883 1 \r\n0.392226 0.0854245 -0.898631 1 \r\n0.743195 0.305648 -0.431673 1 \r\n0.530215 -0.658519 0.00427496 1 \r\n-0.607051 -0.6982 0.891664 1 \r\n-0.065158 -0.328044 0.201898 1 \r\n0.600755 -0.576516 -0.337019 1 \r\n0.646734 -0.222278 -0.893622 1 \r\n-0.0771441 -0.678807 -0.522655 1 \r\n-0.0383843 0.328393 0.2284 1 \r\n0.727008 -0.0849898 -0.374469 1 \r\n-0.211912 -0.322764 -0.417837 1 \r\n0.421966 -0.834016 -0.364745 1 \r\n-0.119985 -0.449047 0.142793 1 \r\n0.0239025 -0.414395 0.276485 1 \r\n-0.292459 0.216793 -0.141811 1 \r\n-0.269636 0.460042 -0.179525 1 \r\n0.604812 -0.39299 -0.952069 1 \r\n-0.649835 -0.574333 0.717949 1 \r\n-0.00122869 0.889748 -0.735371 1 \r\n0.686632 0.0247213 -0.676214 1 \r\n0.591655 -0.720554 0.467861 1 \r\n0.591354 -0.705111 0.00403106 1 \r\n0.589227 -0.393176 -0.964218 1 \r\n0.191012 0.432461 -0.95488 1 \r\n-0.404904 -0.119677 -0.561964 1 \r\n0.30748 0.277911 -0.947942 1 \r\n0.00471503 -0.465084 0.671171 1 \r\n-0.153179 -0.575563 0.0308185 1 \r\n0.502219 -0.76596 -0.142728 1 \r\n-0.239289 0.367088 -0.945309 1 \r\n0.220774 0.260271 0.281777 1 \r\n0.577345 -0.342926 -0.179576 1 \r\n0.518645 -0.371026 -0.683961 1 \r\n0.666522 0.119761 -0.777278 1 \r\n0.236726 -0.982026 0.242564 1 \r\n0.274358 -0.42888 -0.776236 1 \r\n-0.34335 0.0558823 0.911711 1 \r\n-0.35216 -0.121916 -0.917348 1 \r\n0.72348 0.318027 -0.59989 1 \r\n-0.352156 -0.178018 -0.495748 1 \r\n-0.182153 -0.213279 -0.557129 1 \r\n0.0927504 -0.566473 0.586975 1 \r\n0.0195381 -0.513083 -0.75642 1 \r\n0.246186 -0.180573 0.199875 1 \r\n0.303983 -0.273002 -0.965835 1 \r\n0.294043 -0.374323 -0.966634 1 \r\n-0.0422537 -0.760318 -0.479726 1 \r\n-0.0780873 -0.45127 -0.823198 1 \r\n-0.321926 -0.580736 0.662351 1 \r\n0.344826 0.88483 -0.512445 1 \r\n-0.174761 -0.758026 0.68052 1 \r\n0.0772238 0.153848 0.269346 1 \r\n0.493087 0.68728 -0.551227 1 \r\n0.447368 -0.235267 -0.954198 1 \r\n0.522038 -0.763755 -0.320098 1 \r\n0.494436 0.497584 -0.932296 1 \r\n0.174502 0.923504 -0.797872 1 \r\n-0.00107092 0.270305 -0.930887 1 \r\n0.271421 0.351741 -0.962729 1 \r\n0.111296 0.885037 -0.477584 1 \r\n0.360069 -0.28457 -0.96618 1 \r\n0.560037 -0.636641 0.414142 1 \r\n0.344919 0.955225 -0.630743 1 \r\n0.687296 0.459564 -0.419647 1 \r\n-0.336268 -0.749159 0.768939 1 \r\n0.0213737 0.00584614 -0.905324 1 \r\n-0.686667 -0.70572 0.879139 1 \r\n0.152097 -0.897252 -0.367022 1 \r\n-0.251413 0.593112 -0.350899 1 \r\n0.0175292 0.790672 -0.294006 1 \r\n-0.657808 -0.731147 0.911888 1 \r\n-0.345784 0.40352 -0.65641 1 \r\n0.52264 -0.108566 -0.651047 1 \r\n-0.391352 -0.724857 0.511588 1 \r\n0.0440467 -0.900534 -0.269949 1 \r\n-0.0898015 -0.144137 0.788759 1 \r\n0.271235 0.67297 0.0460098 1 \r\n-0.453596 -0.649298 0.790792 1 \r\n-0.413514 0.233976 -0.506356 1 \r\n0.483935 -0.939274 0.320534 1 \r\n0.558771 -0.108753 -0.0576549 1 \r\n0.0959941 0.982692 -0.604677 1 \r\n0.634967 0.483949 -0.604701 1 \r\n-0.0970744 -0.586557 0.543196 1 \r\n-0.263103 0.103708 0.788562 1 \r\n-0.119858 -0.645224 0.655014 1 \r\n0.205012 -0.51237 0.581568 1 \r\n0.0561417 0.703146 -0.9103 1 \r\n0.631335 -0.608036 0.0905359 1 \r\n-0.23233 -0.172562 -0.765291 1 \r\n0.200911 -0.519887 -0.825961 1 \r\n0.365766 -0.607926 -0.599883 1 \r\n0.707157 0.413005 -0.426066 1 \r\n-0.213844 0.408428 -0.0431535 1 \r\n0.602861 -0.604792 0.077783 1 \r\n0.525379 -0.518531 -0.507911 1 \r\n0.379006 -0.069154 -0.907892 1 \r\n0.108633 0.780462 -0.135477 1 \r\n-0.0617161 -0.783035 0.198899 1 \r\n0.144212 -0.484704 -0.697794 1 \r\n0.583115 -0.41162 -0.847314 1 \r\n0.203614 -0.442903 -0.732715 1 \r\n-0.0782751 -0.163389 0.91168 1 \r\n-0.660543 -0.585269 0.674159 1 \r\n-0.295695 -0.634263 0.468069 1 \r\n-0.227164 -0.0839771 0.767279 1 \r\n0.130161 -0.587384 -0.811095 1 \r\n0.252671 -0.229333 -0.96663 1 \r\n0.17212 -0.981075 0.112815 1 \r\n0.756446 0.106282 -0.258294 1 \r\n0.195136 0.0723915 0.26064 1 \r\n0.402893 -0.548456 0.571181 1 \r\n0.598794 -0.346248 -0.930211 1 \r\n0.209787 -0.955101 0.458419 1 \r\n0.0822524 -0.373126 0.459311 1 \r\n0.316498 -0.872734 -0.00978327 1 \r\n0.230028 -0.0989734 0.211133 1 \r\n0.538848 -0.309708 -0.821458 1 \r\n0.595006 -0.0776847 -0.605879 1 \r\n0.723853 0.128778 -0.678026 1 \r\n-0.440392 -0.720077 0.610872 1 \r\n0.229731 -0.471045 -0.687156 1 \r\n0.591437 -0.430188 -0.183755 1 \r\n-0.106068 -0.707789 0.430734 1 \r\n-0.266509 0.402265 -0.147708 1 \r\n-0.34916 0.409041 -0.61744 1 \r\n0.211478 -0.93833 -0.220354 1 \r\n-0.00733638 0.519344 -0.930059 1 \r\n0.275385 -0.110264 0.196761 1 \r\n0.207198 0.999409 -0.601234 1 \r\n0.759964 0.238252 -0.441072 1 \r\n-0.044161 -0.271775 0.844886 1 \r\n0.0677822 0.933942 -0.732802 1 \r\n-0.02777 -0.485821 0.288356 1 \r\n-0.470348 0.0539833 -0.392257 1 \r\n-0.12291 -0.26295 0.627381 1 \r\n0.507168 0.677474 -0.506993 1 \r\n0.177585 -0.116387 -0.91584 1 \r\n0.179317 -0.930195 0.0232227 1 \r\n-0.230833 0.213784 0.0241566 1 \r\n0.158754 -0.961631 0.0734559 1 \r\n0.608558 0.32114 -0.0938423 1 \r\n0.457755 -0.513472 -0.780848 1 \r\n0.00238454 0.289813 -0.947081 1 \r\n-0.269247 -0.238721 -0.205149 1 \r\n0.645094 0.180869 -0.131674 1 \r\n-0.413106 -0.748296 0.677542 1 \r\n0.0595151 -0.291766 0.508237 1 \r\n0.533649 0.520039 -0.838291 1 \r\n-0.0289353 -0.26956 0.521706 1 \r\n-0.0572075 0.671673 -0.775468 1 \r\n-0.054329 0.795996 -0.699274 1 \r\n0.468235 -0.432477 0.0528376 1 \r\n0.0469968 -0.904484 -0.209599 1 \r\n0.0704749 -0.369851 -0.974494 1 \r\n0.423792 0.688141 -0.81708 1 \r\n0.38049 -0.870652 -0.0985097 1 \r\n0.156905 -0.208973 -0.955029 1 \r\n0.32511 -0.0335538 -0.907481 1 \r\n0.330226 -0.853359 -0.40828 1 \r\n0.310811 -0.80358 0.586207 1 \r\n0.0948164 0.709911 -0.920748 1 \r\n-0.118725 0.173885 0.162695 1 \r\n0.523273 -0.770366 -0.277954 1 \r\n-0.256241 -0.347991 -0.269181 1 \r\n-0.06491 -0.0943547 0.152536 1 \r\n0.183821 0.799368 -0.88534 1 \r\n-0.32803 0.108896 0.835775 1 \r\n0.0119538 -0.887127 -0.191505 1 \r\n-0.218251 -0.208359 -0.529662 1 \r\n-0.279103 0.547922 -0.546423 1 \r\n-0.441515 -0.129304 -0.46111 1 \r\n0.0562247 -0.465225 0.684733 1 \r\n-0.19592 -0.21903 -0.929377 1 \r\n0.326988 0.966089 -0.654975 1 \r\n0.62267 -0.452267 -0.940122 1 \r\n0.132306 0.964273 -0.49669 1 \r\n0.531771 0.471331 -0.940328 1 \r\n0.17742 -0.675813 -0.91123 1 \r\n0.51246 -0.478293 -0.971351 1 \r\n-0.257467 -0.362204 -0.249415 1 \r\n0.754547 0.177361 -0.249765 1 \r\n-0.080337 -0.604308 -0.930446 1 \r\n0.51383 0.612215 -0.693082 1 \r\n0.295205 -0.420309 0.346797 1 \r\n0.763274 0.159773 -0.487413 1 \r\n0.117905 -0.667745 -0.861785 1 \r\n-0.317562 -0.329312 -0.950928 1 \r\n0.713456 -0.104362 -0.86286 1 \r\n0.416487 0.326598 -0.931582 1 \r\n0.572759 -0.221434 -0.139433 1 \r\n-0.24816 -0.0715842 -0.0319332 1 \r\n0.00364733 -0.36907 0.469947 1 \r\n0.435435 -0.601323 0.574865 1 \r\n0.593201 -0.598115 -0.185621 1 \r\n0.539938 -0.979941 0.111611 1 \r\n0.573133 0.220975 -0.0204858 1 \r\n-0.121164 0.711758 -0.440608 1 \r\n0.00724596 0.805169 -0.578502 1 \r\n0.440945 -0.515422 0.378093 1 \r\n0.669531 -0.205962 -0.925817 1 \r\n-0.0762102 -0.331256 -0.96784 1 \r\n-0.000829101 -0.766387 0.566118 1 \r\n0.168035 -0.211268 0.215979 1 \r\n0.570331 -0.299469 -0.881328 1 \r\n-0.134091 -0.696719 0.68438 1 \r\n0.350824 -0.0565963 0.185306 1 \r\n0.431616 0.284677 -0.915974 1 \r\n0.585875 0.40185 -0.933216 1 \r\n-0.521164 -0.737558 0.858095 1 \r\n0.568826 0.595405 -0.535131 1 \r\n0.536897 0.131922 -0.931434 1 \r\n0.418925 -0.485332 0.354663 1 \r\n-0.692214 -0.657754 0.915063 1 \r\n0.528866 0.500884 -0.0149021 1 \r\n0.319175 -0.981105 0.0959733 1 \r\n-0.140596 -0.140832 0.926924 1 \r\n0.10998 0.748377 -0.0689394 1 \r\n-0.0487723 -0.685771 0.640445 1 \r\n0.500143 -0.521202 0.0890832 1 \r\n0.403568 -0.637462 -0.914978 1 \r\n0.56865 -0.966208 0.0927358 1 \r\n0.666802 0.424803 -0.21335 1 \r\n-0.249231 -0.392732 -0.131003 1 \r\n-0.0978932 -0.00653112 0.691156 1 \r\n-0.278769 0.376894 -0.877313 1 \r\n-0.0828792 -0.673483 0.252764 1 \r\n0.583053 -0.393235 -0.387858 1 \r\n-0.165763 0.284967 -0.952303 1 \r\n0.337002 -0.723921 -0.548492 1 \r\n0.149842 -0.405417 0.485367 1 \r\n0.452898 -0.788202 -0.0351365 1 \r\n-0.0841483 -0.243006 0.860534 1 \r\n-0.663999 -0.732355 0.898585 1 \r\n-0.633438 -0.672682 0.697403 1 \r\n0.21604 -0.99709 0.170374 1 \r\n0.49537 -0.25264 0.0141358 1 \r\n-0.0653832 -0.522507 0.224291 1 \r\n0.44742 -0.435561 0.140219 1 \r\n0.655917 -0.0548561 -0.183673 1 \r\n0.681049 -0.83626 0.303755 1 \r\n0.0921756 -0.696445 -0.974437 1 \r\n0.368007 -0.470473 0.431035 1 \r\n-0.234862 0.0720179 -0.969188 1 \r\n-0.0592517 -0.0584049 -0.905795 1 \r\n0.573963 -0.384921 -0.432392 1 \r\n-0.0838962 -0.117999 0.915831 1 \r\n0.00745243 0.787684 -0.337517 1 \r\n0.119691 0.0358139 -0.906992 1 \r\n0.559051 -0.0242014 -0.933353 1 \r\n0.604273 0.0556644 -0.961203 1 \r\n-0.408951 0.233727 -0.537164 1 \r\n-0.103995 -0.0164034 0.144411 1 \r\n0.165886 -0.174752 -0.938583 1 \r\n-0.14612 0.697345 -0.407891 1 \r\n0.350315 -0.669705 -0.579455 1 \r\n0.401866 0.546552 0.135301 1 \r\n0.196524 0.165003 0.276734 1 \r\n0.198885 0.945544 -0.76665 1 \r\n-0.716121 -0.614655 0.655959 1 \r\n0.219599 -0.488753 -0.823266 1 \r\n-0.172316 0.67517 -0.407121 1 \r\n0.468972 0.21149 0.18461 1 \r\n-0.22962 0.488671 -0.838707 1 \r\n0.0389352 -0.242939 0.532871 1 \r\n-0.0407419 0.490466 -0.927797 1 \r\n0.656187 -0.615811 0.152121 1 \r\n0.122789 -0.402306 0.324321 1 \r\n0.228087 0.88236 -0.464191 1 \r\n0.403858 -0.777383 0.573817 1 \r\n0.329033 0.134236 0.262113 1 \r\n0.209019 -0.844053 -0.454947 1 \r\n0.413239 0.876145 -0.631805 1 \r\n-0.429591 -0.577235 0.637882 1 \r\n0.673246 0.259856 -0.150751 1 \r\n0.344815 -0.312347 0.173393 1 \r\n0.280543 -0.193529 0.191065 1 \r\n0.529437 -0.192759 -0.507853 1 \r\n0.476962 -0.190125 -0.937266 1 \r\n-0.229132 -0.339934 -0.0342368 1 \r\n-0.433575 -0.610457 0.749691 1 \r\n-0.0952513 -0.762524 0.524788 1 \r\n0.672904 0.437307 -0.251107 1 \r\n-0.18764 -0.627332 0.673765 1 \r\n-0.198638 0.620797 -0.624934 1 \r\n-0.710299 -0.615636 0.892847 1 \r\n-0.0183916 -0.614996 0.561843 1 \r\n-0.660932 -0.605843 0.623615 1 \r\n0.149302 0.996296 -0.575877 1 \r\n-0.193572 -0.390593 0.046954 1 \r\n0.0493222 -0.275667 0.225951 1 \r\n0.588137 -0.854415 0.415293 1 \r\n0.656623 -0.0306578 -0.792064 1 \r\n0.0142782 -0.6138 0.54551 1 \r\n0.651995 -0.74672 0.0337342 1 \r\n0.558688 -0.690126 0.494944 1 \r\n-0.0403475 -0.572797 -0.594333 1 \r\n0.617399 -0.449727 -0.880161 1 \r\n0.0116249 -0.550777 0.460805 1 \r\n-0.109842 -0.456994 -0.585592 1 \r\n-0.25012 0.411334 -0.91022 1 \r\n-0.440183 0.176542 -0.393982 1 \r\n0.581776 -0.203759 -0.804255 1 \r\n-0.141469 0.693122 -0.468408 1 \r\n0.376568 -0.912293 0.528036 1 \r\n-0.29418 0.0872819 0.770693 1 \r\n0.766501 0.204797 -0.401393 1 \r\n-0.263004 -0.0294178 -0.0609214 1 \r\n-0.292709 0.0110552 -0.97594 1 \r\n-0.135598 -0.0459083 0.112939 1 \r\n-0.0932341 -0.658133 0.0885124 1 \r\n0.298401 -0.960504 0.42926 1 \r\n0.103261 -0.674823 0.581257 1 \r\n0.455202 -0.457329 0.246964 1 \r\n-0.0141672 0.778905 -0.364823 1 \r\n-0.292437 -0.728043 0.487245 1 \r\n0.579327 0.170139 -0.0349871 1 \r\n-0.420652 0.0387297 -0.195076 1 \r\n0.253833 0.444113 -0.955962 1 \r\n-0.179394 -0.774166 0.65959 1 \r\n0.291459 0.81431 -0.48815 1 \r\n0.26091 0.291878 0.275603 1 \r\n0.250367 -0.89557 0.00143492 1 \r\n-0.379375 -0.0893822 -0.205037 1 \r\n-0.127763 0.388588 0.136131 1 \r\n0.337344 -0.433017 0.348364 1 \r\n-0.156233 -0.746114 -0.205809 1 \r\n-0.307986 0.114988 -0.866856 1 \r\n0.475779 -0.854209 0.00427496 1 \r\n0.722805 0.0912563 -0.650405 1 \r\n0.0754796 -0.532991 -0.768395 1 \r\n-0.160307 -0.281532 -0.537693 1 \r\n-0.0910664 0.184521 0.190037 1 \r\n0.0533016 -0.663528 0.584235 1 \r\n-0.278697 -0.309285 -0.852803 1 \r\n-0.301685 -0.0774263 -0.168964 1 \r\n-0.0989527 -0.257902 -0.694651 1 \r\n0.185769 -0.569301 -0.657612 1 \r\n0.218888 -0.976113 0.080564 1 \r\n0.506359 -0.482239 -0.53276 1 \r\n-0.567809 -0.690336 0.66178 1 \r\n-0.0434979 -0.837352 -0.121191 1 \r\n0.531346 -0.320413 -0.795958 1 \r\n-0.164611 -0.311141 0.0967205 1 \r\n0.367011 -0.990171 0.163722 1 \r\n0.584671 -0.224497 -0.224865 1 \r\n0.741203 0.302815 -0.510246 1 \r\n-0.137591 0.442931 -0.949434 1 \r\n-0.069703 0.244291 -0.904386 1 \r\n0.108668 0.319085 -0.968899 1 \r\n0.763139 0.0164926 -0.32559 1 \r\n0.40666 -0.492251 0.439398 1 \r\n0.545147 -0.313928 -0.0773051 1 \r\n0.621405 0.54568 -0.257412 1 \r\n0.0173227 -0.538892 0.490773 1 \r\n0.118202 -0.553055 0.596625 1 \r\n-0.00485116 -0.826393 -0.0255142 1 \r\n-0.267934 -0.20745 -0.151359 1 \r\n0.635807 -0.0295247 -0.719057 1 \r\n-0.105744 -0.178696 0.905154 1 \r\n-0.424183 -0.794385 0.746661 1 \r\n-0.328676 -0.0997973 -0.738356 1 \r\n-0.384161 -0.181715 -0.320528 1 \r\n0.355099 -0.12138 0.159831 1 \r\n0.4904 -0.800353 -0.3031 1 \r\n0.253543 -0.255474 -0.966144 1 \r\n-0.156529 -0.130938 -0.915878 1 \r\n0.741659 0.0631251 -0.520588 1 \r\n0.507313 0.383047 0.0745248 1 \r\n0.312067 0.977535 -0.592655 1 \r\n-0.397695 -0.14296 -0.530309 1 \r\n0.414277 -0.113009 -0.915839 1 \r\n0.493917 0.700977 -0.334374 1 \r\n-0.061574 -0.719948 0.366606 1 \r\n0.149802 -0.611966 -0.644953 1 \r\n0.595048 -0.942034 0.233194 1 \r\n0.288439 0.420787 -0.95901 1 \r\n-0.0819278 -0.0480459 0.696303 1 \r\n0.163912 0.776467 -0.898459 1 \r\n0.229902 0.699939 0.0110686 1 \r\n-0.0616352 -0.755969 0.61577 1 \r\n0.669396 0.489812 -0.414628 1 \r\n-0.118114 -0.524837 0.116675 1 \r\n0.646807 -0.661792 0.0472965 1 \r\n-0.0515159 -0.265082 -0.923145 1 \r\n0.475623 0.511966 0.0648642 1 \r\n0.180246 -0.463916 -0.767684 1 \r\n-0.244432 -0.261597 -0.35232 1 \r\n-0.358152 -0.26902 -0.976329 1 \r\n-0.193448 -0.266528 -0.458843 1 \r\n0.0483654 0.560612 -0.949863 1 \r\n-0.153754 -0.23694 0.799748 1 \r\n-0.0139193 -0.273534 0.834738 1 \r\n0.520938 0.269029 -0.944289 1 \r\n-0.0344225 0.471944 -0.948902 1 \r\n0.483126 -0.274599 -0.961948 1 \r\n0.673391 0.452789 -0.281559 1 \r\n-0.436287 -0.148394 -0.404761 1 \r\n-0.288397 0.19165 -0.909286 1 \r\n-0.0969313 -0.371265 0.180916 1 \r\n-0.269569 -0.335776 -0.87607 1 \r\n-0.114556 -0.357351 -0.677553 1 \r\n0.485315 -0.72631 -0.443181 1 \r\n0.644046 -0.880316 0.0976231 1 \r\n-0.140874 -0.554856 0.0666074 1 \r\n0.29975 -0.465216 -0.822333 1 \r\n0.554963 0.544912 -0.716029 1 \r\n-0.0502385 -0.0419663 0.171982 1 \r\n0.0278456 -0.527737 0.58079 1 \r\n-0.592604 -0.778928 0.848373 1 \r\n0.00112373 -0.0621883 -0.905878 1 \r\n0.413768 -0.248674 0.117577 1 \r\n-0.220775 0.0777252 0.768721 1 \r\n0.616559 -0.690519 0.402592 1 \r\n-0.111615 -0.635998 0.0532112 1 \r\n-0.244942 -0.24358 -0.383344 1 \r\n0.606483 -0.550608 -0.298922 1 \r\n-0.333956 -0.0630536 -0.940584 1 \r\n-0.376974 0.342423 -0.54642 1 \r\n0.413156 0.524366 -0.933 1 \r\n-0.0871887 0.170046 -0.894473 1 \r\n0.418407 -0.610069 -0.860559 1 \r\n-0.251836 -0.360564 -0.298393 1 \r\n-0.126852 -0.144459 0.619609 1 \r\n0.312638 0.699638 -0.00269914 1 \r\n0.578248 0.435916 -0.84291 1 \r\n0.471805 -0.869367 0.50419 1 \r\n0.288387 0.793069 -0.263728 1 \r\n0.185265 -0.568734 0.588427 1 \r\n0.58298 -0.117576 -0.117533 1 \r\n0.157734 -0.943362 0.317359 1 \r\n-0.313619 0.456794 -0.710992 1 \r\n0.216385 -0.611431 -0.975428 1 \r\n-0.0634075 -0.633186 -0.956398 1 \r\n0.137626 0.418691 -0.960191 1 \r\n-0.264439 -0.765546 0.608371 1 \r\n0.213803 -0.464781 0.548509 1 \r\n0.0340529 -0.526163 -0.767151 1 \r\n0.369118 -0.340335 -0.966713 1 \r\n-0.148573 -0.76416 -0.288136 1 \r\n0.578155 0.0633223 -0.0457248 1 \r\n0.711961 -0.776308 0.171401 1 \r\n0.34935 -0.61922 0.593969 1 \r\n-0.157429 0.575679 -0.768072 1 \r\n-0.322089 0.444217 -0.277507 1 \r\n0.509897 -0.508668 0.226221 1 \r\n0.117083 -0.380543 -0.971176 1 \r\n-0.317151 0.314956 -0.167028 1 \r\n-0.173983 -0.69598 -0.393591 1 \r\n-0.229203 -0.359892 -0.888298 1 \r\n0.0819816 -0.0717368 0.212793 1 \r\n0.10601 0.965373 -0.699263 1 \r\n0.0025329 0.556617 -0.923331 1 \r\n0.713394 0.205327 -0.713661 1 \r\n-0.271169 0.118059 -0.0955347 1 \r\n0.124359 -0.524521 -0.774299 1 \r\n-0.0289623 -0.577111 0.432477 1 \r\n0.129293 0.156774 -0.916161 1 \r\n0.436918 0.654676 -0.775905 1 \r\n-0.14678 -0.456136 -0.526559 1 \r\n0.0782014 -0.212996 -0.934564 1 \r\n0.316 -0.4506 -0.797017 1 \r\n0.585626 0.237598 -0.0734574 1 \r\n-0.0304118 -0.43754 -0.983005 1 \r\n-0.0769303 -0.596982 -0.907713 1 \r\n0.377761 0.552093 0.146238 1 \r\n-0.281878 0.0135456 0.79513 1 \r\n-0.126798 -0.489329 0.119258 1 \r\n0.241869 0.801173 -0.416462 1 \r\n0.103668 -0.0402406 0.224218 1 \r\n0.43421 0.731941 -0.692389 1 \r\n-0.0639284 -0.635277 0.371867 1 \r\n0.197857 0.809548 -0.43797 1 \r\n0.317919 -0.162594 0.172791 1 \r\n0.50971 -0.531707 0.262186 1 \r\n0.548602 -0.320358 -0.604889 1 \r\n-0.253198 -0.607506 0.681724 1 \r\n0.286582 -1 0.137127 1 \r\n-0.101363 -0.780819 -0.11593 1 \r\n0.623386 -0.0856643 -0.539421 1 \r\n-0.370004 -0.210169 -0.928069 1 \r\n0.0223616 0.936101 -0.675552 1 \r\n-0.378766 0.315391 -0.241725 1 \r\n0.525307 -0.972021 0.199729 1 \r\n-0.335781 0.444197 -0.625775 1 \r\n0.265829 -0.433562 -0.718274 1 \r\n0.723365 0.291774 -0.653497 1 \r\n-0.257215 0.431309 -0.143955 1 \r\n0.214127 -0.102526 -0.915462 1 \r\n0.520814 -0.771734 -0.235488 1 \r\n-0.356709 0.391961 -0.577647 1 \r\n0.405093 -0.93864 0.338984 1 \r\n-0.586774 -0.671366 0.865079 1 \r\n-0.240542 -0.53217 -0.329097 1 \r\n-0.441428 0.115185 -0.248502 1 \r\n0.281248 0.130605 0.267644 1 \r\n-0.435971 -0.0636077 -0.24205 1 \r\n0.653043 0.514519 -0.378571 1 \r\n0.590223 0.162793 -0.0859633 1 \r\n0.210765 0.800966 -0.311121 1 \r\n0.515449 -0.647698 -0.916651 1 \r\n0.481009 0.167691 0.172397 1 \r\n0.370996 -0.847366 -0.392448 1 \r\n0.268008 -0.398149 0.315221 1 \r\n-0.269652 0.541291 -0.277415 1 \r\n-0.252857 -0.477799 -0.246571 1 \r\n-0.00610459 -0.66386 -0.886747 1 \r\n-0.339741 -0.18882 -0.277914 1 \r\n-0.000755489 -0.252346 -0.929949 1 \r\n0.324789 -0.99419 0.130642 1 \r\n-0.251476 -0.0308726 -0.971579 1 \r\n0.493295 -0.578364 0.517119 1 \r\n0.580282 -0.412781 -0.142382 1 \r\n0.732154 -0.000394344 -0.492255 1 \r\n-0.696221 -0.695676 0.907955 1 \r\n0.265009 -0.451051 -0.970428 1 \r\n-0.217108 0.373739 -0.0288504 1 \r\n0.412896 0.349302 0.218594 1 \r\n0.639232 0.129504 -0.831884 1 \r\n0.090122 -0.908206 0.0373038 1 \r\n-0.411106 -0.621026 0.511339 1 \r\n0.567726 -0.234663 -0.3788 1 \r\n-0.411618 0.179281 -0.591166 1 \r\n-0.426046 0.209145 -0.454413 1 \r\n-0.284496 0.204081 -0.921519 1 \r\n0.158086 -0.782923 -0.53125 1 \r\n-0.0819039 -0.610844 0.414079 1 \r\n-0.26678 -0.792056 0.674481 1 \r\n0.575187 -0.425452 -0.434221 1 \r\n-0.329192 -0.61947 0.489248 1 \r\n0.707738 0.377849 -0.277512 1 \r\n0.216827 -0.393213 0.318293 1 \r\n-0.126505 0.0243788 -0.899975 1 \r\n0.360889 -0.903554 -0.223334 1 \r\n0.0285159 -0.81012 -0.466541 1 \r\n0.603515 0.585402 -0.29319 1 \r\n0.452255 0.104227 0.187391 1 \r\n-0.340526 -0.0198754 -0.171355 1 \r\n0.0850043 -0.276608 0.592505 1 \r\n-0.383552 0.273636 -0.616217 1 \r\n0.0837456 -0.498872 -0.728611 1 \r\n0.456063 -0.649855 -0.929379 1 \r\n0.306598 -0.991123 0.205582 1 \r\n0.561832 -0.599352 -0.113837 1 \r\n0.548924 0.649467 -0.325645 1 \r\n-0.329618 0.448285 -0.315939 1 \r\n0.59264 -0.407041 -0.228873 1 \r\n0.349495 0.406976 -0.962566 1 \r\n0.209628 0.202535 -0.936499 1 \r\n-0.617522 -0.742932 0.903317 1 \r\n0.513104 -0.679861 -0.0133176 1 \r\n0.391386 -0.935197 0.382586 1 \r\n0.574149 -0.169412 -0.353864 1 \r\n0.267686 0.951987 -0.486021 1 \r\n0.582803 0.131995 -0.046557 1 \r\n-0.220627 -0.533023 -0.423073 1 \r\n-0.315623 0.493268 -0.480954 1 \r\n-0.606649 -0.671831 0.568743 1 \r\n-0.381974 0.328871 -0.275344 1 \r\n-0.302979 0.102992 -0.89136 1 \r\n-0.136144 -0.197621 -0.737735 1 \r\n0.0642157 -0.127044 0.201265 1 \r\n0.30664 -0.505348 -0.972642 1 \r\n-0.0388149 0.172962 0.231067 1 \r\n-0.754768 -0.617749 0.846339 1 \r\n-0.123595 0.613792 -0.0294605 1 \r\n-0.447662 -0.703025 0.816049 1 \r\n0.00897986 -0.510707 0.476526 1 \r\n0.54525 -0.0943993 -0.932683 1 \r\n0.221594 0.64349 0.0863645 1 \r\n0.577242 -0.608831 0.278415 1 \r\n-0.109409 -0.205239 0.596853 1 \r\n0.528295 -0.280344 -0.796279 1 \r\n-0.0114683 -0.453352 0.280573 1 \r\n0.601191 -0.704541 0.448862 1 \r\n-0.032674 -0.416233 0.517264 1 \r\n-0.21322 0.288091 0.0561477 1 \r\n-0.336987 0.0919722 0.88495 1 \r\n0.0970007 0.911249 -0.487313 1 \r\n0.238337 -0.473441 -0.972328 1 \r\n0.147456 0.800447 -0.270984 1 \r\n0.543248 -0.350659 -0.0652838 1 \r\n0.435901 -0.344655 0.0874541 1 \r\n0.321406 -0.435668 -0.720239 1 \r\n-0.184687 -0.442809 -0.474089 1 \r\n0.10803 -0.799858 0.572053 1 \r\n-0.0991727 -0.34903 0.6279 1 \r\n-0.0429053 -0.589743 0.506214 1 \r\n0.613446 0.462387 -0.718271 1 \r\n0.496698 -0.305416 0.014936 1 \r\n-0.0961884 0.140991 0.182867 1 \r\n-0.125084 -0.412147 -0.601993 1 \r\n0.0324695 -0.510174 -0.685441 1 \r\n-0.345622 0.0754216 0.86374 1 \r\n0.275749 -0.951142 0.512045 1 \r\n-0.683496 -0.610532 0.878693 1 \r\n-0.282425 0.331558 -0.88419 1 \r\n0.654703 0.129826 -0.944477 1 \r\n0.495754 0.689075 -0.235401 1 \r\n-0.119526 -0.670433 0.669521 1 \r\n-0.589845 -0.778818 0.865421 1 \r\n0.554299 -0.175148 -0.773005 1 \r\n0.556146 -0.312221 -0.85253 1 \r\n0.488065 0.614872 -0.0619394 1 \r\n0.159118 0.601465 0.133464 1 \r\n0.121215 -0.388411 0.663129 1 \r\n0.684308 0.415163 -0.251795 1 \r\n-0.0665495 -0.675596 0.370622 1 \r\n-0.536451 -0.78684 0.846432 1 \r\n-0.0585948 -0.765757 0.525514 1 \r\n0.478767 0.694803 -0.189932 1 \r\n0.540135 0.000315428 0.0357991 1 \r\n-0.221807 -0.285638 -0.390175 1 \r\n0.576079 -0.294446 -0.358058 1 \r\n0.102791 -0.823409 -0.476418 1 \r\n0.374845 0.384178 0.229552 1 \r\n-0.0345408 -0.485616 -0.755203 1 \r\n-0.179141 0.0687286 0.722016 1 \r\n0.19441 0.405606 -0.956465 1 \r\n0.414111 -0.51884 -0.793441 1 \r\n-0.252632 -0.128646 -0.062867 1 \r\n-0.140928 0.0452774 0.665287 1 \r\n-0.278507 0.538074 -0.636001 1 \r\n0.599748 -0.567827 -0.942373 1 \r\n-0.563731 -0.595274 0.626147 1 \r\n-0.194943 -0.141353 0.0418177 1 \r\n0.54689 0.322053 0.00792027 1 \r\n0.2124 -0.392379 -0.96751 1 \r\n0.625057 0.492635 -0.177825 1 \r\n-0.0290266 -0.471913 0.26864 1 \r\n-0.376968 0.293103 -0.215738 1 \r\n0.406878 0.415059 0.204461 1 \r\n0.34245 -0.978058 0.238185 1 \r\n-0.0819693 -0.485095 -0.601171 1 \r\n0.53173 -0.72802 -0.151812 1 \r\n-0.0257351 0.842089 -0.62831 1 \r\n0.122112 0.615743 0.112161 1 \r\n0.0863221 -0.417872 0.331014 1 \r\n-0.466736 0.0298576 -0.320511 1 \r\n-0.102446 -0.00884712 0.634925 1 \r\n-0.33226 -0.302752 -0.977718 1 \r\n-0.250283 0.588484 -0.305066 1 \r\n-0.272775 0.0644948 0.894175 1 \r\n-0.0376942 -0.789521 -0.0132128 1 \r\n-0.00944072 -0.506964 -0.76659 1 \r\n0.0713891 -0.883016 -0.37069 1 \r\n-0.0721591 -0.733332 0.0296147 1 \r\n0.626323 0.297419 -0.116621 1 \r\n-0.253602 -0.454127 -0.264099 1 \r\n0.385004 0.188579 -0.896431 1 \r\n-0.622127 -0.659042 0.552379 1 \r\n-0.286261 0.23243 -0.902395 1 \r\n0.550148 -0.635142 -0.932453 1 \r\n0.0457318 0.198623 0.267624 1 \r\n0.242575 -0.415798 0.356614 1 \r\n0.570694 -0.689956 -0.237236 1 \r\n-0.100278 -0.536418 -0.913281 1 \r\n-0.0946816 -0.647731 -0.529383 1 \r\n0.0382015 -0.265466 0.669552 1 \r\n0.259208 0.830861 -0.474714 1 \r\n-0.0323005 -0.17898 0.848756 1 \r\n-0.573299 -0.687458 0.595639 1 \r\n-0.426931 0.162834 -0.232778 1 \r\n-0.118236 -0.556025 -0.540498 1 \r\n0.768971 0.184853 -0.380689 1 \r\n0.493077 -0.454399 0.0217493 1 \r\n-0.0653064 -0.729938 0.308331 1 \r\n0.127508 0.236197 -0.954119 1 \r\n-0.174608 -0.667655 -0.123988 1 \r\n-0.0583758 -0.196165 0.558418 1 \r\n-0.0403516 -0.774111 0.3937 1 \r\n-0.0562912 -0.746709 0.347544 1 \r\n0.120894 -0.359531 0.506919 1 \r\n0.504501 -0.752105 0.534625 1 \r\n0.575913 -0.666938 -0.321957 1 \r\n-0.0422277 0.684727 -0.821703 1 \r\n0.134097 -0.549694 -0.792526 1 \r\n-0.393014 0.24868 -0.21498 1 \r\n0.199024 -0.947528 0.486166 1 \r\n0.0940278 -0.912028 -0.126022 1 \r\n0.0614877 -0.936437 0.132924 1 \r\n-0.199352 0.232088 0.0876513 1 \r\n0.375945 -0.867959 -0.349024 1 \r\n0.389061 -0.559141 -0.603442 1 \r\n-0.0154405 -0.235422 0.851465 1 \r\n0.63974 -0.856476 0.0663894 1 \r\n0.604148 -0.576773 -0.268039 1 \r\n-0.213428 -0.0144111 0.033589 1 \r\n-0.309893 0.0543673 -0.89128 1 \r\n0.402821 -0.324471 0.124301 1 \r\n-0.15432 0.590248 -0.0572512 1 \r\n0.127315 -0.972671 0.143872 1 \r\n-0.0833141 -0.68303 0.220358 1 \r\n0.23423 -0.705901 0.594934 1 \r\n0.660784 0.0101628 -0.808675 1 \r\n-0.34677 0.137712 -0.162529 1 \r\n-0.451434 0.0505072 -0.262942 1 \r\n-0.747774 -0.597776 0.72459 1 \r\n-0.241395 0.0444266 0.861312 1 \r\n0.145714 0.9303 -0.780505 1 \r\n0.0511837 -0.679762 -0.863716 1 \r\n-0.114401 -0.769694 0.584702 1 \r\n0.292195 0.897344 -0.798834 1 \r\n0.24602 -0.00217605 0.237241 1 \r\n0.532373 -0.181422 -0.0347515 1 \r\n0.509908 -0.205383 -0.00303233 1 \r\n0.0224062 -0.186364 0.646672 1 \r\n0.261564 -0.607071 -0.967678 1 \r\n-0.279681 -0.630148 0.71551 1 \r\n0.311579 -0.299504 0.194095 1 \r\n0.180154 0.79969 -0.252231 1 \r\n-0.195031 -0.0166192 0.906222 1 \r\n-0.26731 0.279696 -0.121749 1 \r\n0.307543 -0.588893 -0.932857 1 \r\n0.32538 0.293725 0.264179 1 \r\n0.281819 -0.930022 0.0376565 1 \r\n0.390296 -0.90179 0.0313476 1 \r\n-0.239036 0.0902393 0.00922978 1 \r\n0.24438 -0.968767 0.28048 1 \r\n-0.170348 -0.0802777 0.668213 1 \r\n-0.397481 0.294752 -0.282318 1 \r\n-0.215492 -0.621036 -0.286607 1 \r\n-0.350454 0.163903 -0.784247 1 \r\n0.0335953 0.903798 -0.751252 1 \r\n0.768857 0.171602 -0.413059 1 \r\n0.346476 -0.615756 -0.941106 1 \r\n-0.370047 -0.156712 -0.255149 1 \r\n0.3116 -0.213494 -0.959642 1 \r\n0.500766 -0.712193 -0.0286937 1 \r\n-0.234058 0.578574 -0.669627 1 \r\n0.128494 0.282965 0.280013 1 \r\n0.394675 -0.951249 0.299978 1 \r\n-0.411931 0.268375 -0.339848 1 \r\n0.100893 -0.246474 0.223294 1 \r\n0.409628 -0.938151 0.428575 1 \r\n-0.0469367 -0.422339 0.658957 1 \r\n-0.648692 -0.653465 0.57583 1 \r\n0.672572 -0.150621 -0.960389 1 \r\n-0.249741 -0.0754901 0.86758 1 \r\n0.0526697 0.800499 -0.49194 1 \r\n-0.373668 -0.138886 -0.570108 1 \r\n0.396688 -0.83651 -0.0152165 1 \r\n0.00850362 -0.502646 -0.739793 1 \r\n-0.0501949 -0.508133 -0.617348 1 \r\n0.121335 0.98568 -0.648515 1 \r\n0.73011 0.0812947 -0.604109 1 \r\n-0.233589 -0.632406 0.454144 1 \r\n-0.104947 0.731743 -0.309251 1 \r\n-0.206544 -0.268846 0.0183436 1 \r\n0.632342 -0.0325692 -0.967996 1 \r\n0.322827 -0.904714 0.0273838 1 \r\n0.154355 -0.921056 0.445188 1 \r\n-0.046365 0.763102 -0.78331 1 \r\n0.632809 -0.83727 0.378902 1 \r\n-0.23969 -0.50019 -0.140247 1 \r\n-0.358012 0.0839304 -0.782302 1 \r\n-0.502788 -0.795425 0.813766 1 \r\n-0.350454 -7.67708e-005 -0.793754 1 \r\n0.396149 -0.934049 0.363649 1 \r\n0.630121 0.0511091 -0.134004 1 \r\n0.491084 -0.808299 -0.00851321 1 \r\n-0.342845 -0.199104 -0.305043 1 \r\n0.640124 -0.604165 0.117048 1 \r\n-0.155249 -0.247198 0.715033 1 \r\n-0.0681663 -0.398906 0.602892 1 \r\n0.564105 0.600458 -0.186824 1 \r\n0.332789 -0.872431 -0.37268 1 \r\n0.0315542 0.304922 0.263348 1 \r\n0.702685 -0.00150776 -0.93304 1 \r\n0.599479 -0.0650013 -0.960434 1 \r\n0.599946 0.578034 -0.404726 1 \r\n-0.135351 0.474777 -0.906687 1 \r\n0.125112 -0.928931 -0.189445 1 \r\n-0.0726904 -0.34941 0.564727 1 \r\n0.481797 -0.551352 0.346922 1 \r\n-0.163478 -0.527975 0.0483756 1 \r\n0.445375 -0.427457 0.0888757 1 \r\n0.245822 -0.462273 0.519246 1 \r\n0.43917 -0.975532 0.209867 1 \r\n0.725026 0.214437 -0.186056 1 \r\n-0.035539 -0.106531 0.5885 1 \r\n0.342273 -0.892443 -0.0920181 1 \r\n0.645862 -0.142565 -0.27716 1 \r\n-0.606146 -0.632648 0.563669 1 \r\n-0.112047 0.21313 -0.902625 1 \r\n0.537074 -0.971323 0.0797753 1 \r\n-0.492063 -0.703207 0.525753 1 \r\n-0.272355 -0.139801 -0.728965 1 \r\n-0.527224 -0.664057 0.516102 1 \r\n0.664219 0.0110552 -0.964268 1 \r\n0.176775 -0.434858 0.444389 1 \r\n0.413478 0.863942 -0.605382 1 \r\n-0.15865 -0.168894 0.0799414 1 \r\n0.266555 0.265096 -0.956746 1 \r\n-0.00850993 -0.488162 0.542864 1 \r\n0.739553 0.0982085 -0.205931 1 \r\n-0.0232759 -0.805839 0.0673027 1 \r\n0.00165087 0.251503 0.255815 1 \r\n0.516704 -0.594559 0.470725 1 \r\n0.462269 -0.829449 -0.209377 1 \r\n0.588521 -0.811732 0.440052 1 \r\n-0.0895057 -0.461712 0.175438 1 \r\n0.606462 -0.52481 -0.310189 1 \r\n-0.137006 0.340119 -0.957882 1 \r\n0.220746 -0.934902 0.536918 1 \r\n0.464406 0.0267655 -0.904061 1 \r\n0.129025 -0.859038 0.557962 1 \r\n0.0204636 -0.180361 0.566657 1 \r\n0.43587 0.700956 -0.673155 1 \r\n0.507677 -0.895984 0.445583 1 \r\n0.594643 -0.0887109 -0.136551 1 \r\n0.0664757 -0.909002 0.067562 1 \r\n-0.114448 0.654956 -0.0826387 1 \r\n0.595287 -0.071824 -0.738764 1 \r\n0.5929 -0.478478 -0.371514 1 \r\n0.156662 -0.676408 -0.886822 1 \r\n-0.153285 -0.128171 0.650604 1 \r\n-0.214917 0.584094 -0.701951 1 \r\n0.708641 0.326038 -0.673513 1 \r\n0.138318 -0.914419 0.399303 1 \r\n-0.350513 0.0830379 0.887378 1 \r\n-0.317622 0.0086478 -0.921998 1 \r\n-0.0727309 -0.62057 0.280553 1 \r\n0.147393 0.255767 0.282555 1 \r\n-0.0772136 -0.814875 -0.133811 1 \r\n0.563586 -0.253193 -0.441917 1 \r\n0.654392 -0.125579 -0.246822 1 \r\n-0.394596 0.243398 -0.596808 1 \r\n-0.431449 -0.723792 0.530619 1 \r\n-0.715764 -0.572898 0.823676 1 \r\n0.683654 -0.181981 -0.867713 1 \r\n0.600558 -0.00286293 -0.121277 1 \r\n-0.0725898 -0.244567 -0.913931 1 \r\n0.497912 0.192916 0.151737 1 \r\n0.250149 0.92947 -0.777844 1 \r\n0.758065 0.223081 -0.291857 1 \r\n-0.120756 -0.365578 -0.979844 1 \r\n0.0918518 0.764336 -0.89275 1 \r\n0.300134 0.576696 0.145947 1 \r\n0.742406 0.0396428 -0.491843 1 \r\n0.0196533 -0.256473 0.807675 1 \r\n-0.429848 0.0975444 -0.599941 1 \r\n0.311143 0.0353158 -0.903967 1 \r\n-0.0968431 -0.429433 -0.6704 1 \r\n0.0274171 -0.552227 0.51962 1 \r\n0.511142 -0.215621 -0.643303 1 \r\n0.0889816 -0.393688 0.709274 1 \r\n-0.22747 -0.169684 -0.641105 1 \r\n0.55405 -0.613992 -0.871631 1 \r\n0.0463409 -0.613872 0.546464 1 \r\n0.306111 0.46165 0.225619 1 \r\n0.262 -0.938164 -0.151888 1 \r\n-0.257984 -0.351696 -0.21347 1 \r\n0.767362 0.157791 -0.334835 1 \r\n-0.306924 -0.576496 0.564675 1 \r\n0.302251 0.787964 -0.254873 1 \r\n0.590534 0.604111 -0.317403 1 \r\n-0.130025 0.627645 -0.0609982 1 \r\n0.136705 0.0895648 0.262539 1 \r\n0.689351 -0.695548 0.0703534 1 \r\n-0.391963 -0.161785 -0.489807 1 \r\n-0.0388719 -0.663627 -0.926425 1 \r\n0.51687 -0.198262 -0.575535 1 \r\n0.511817 -0.651315 -0.0183897 1 \r\n0.756083 0.255632 -0.394242 1 \r\n0.2056 0.623162 -0.950167 1 \r\n0.135059 -0.968122 0.222381 1 \r\n-0.407354 -0.0468785 -0.659318 1 \r\n0.0118676 -0.437944 0.292393 1 \r\n0.176312 -0.691641 0.589424 1 \r\n0.210839 -0.24145 -0.967841 1 \r\n0.554444 -0.0893885 -0.702769 1 \r\n0.118867 -0.641561 -0.632891 1 \r\n0.332529 -0.956322 0.44467 1 \r\n-0.220838 -0.223422 -0.94245 1 \r\n-0.0764396 -0.459256 -0.667855 1 \r\n0.432104 -0.852894 -0.188668 1 \r\n0.275157 0.777868 -0.178556 1 \r\n-0.23404 -0.481714 -0.0979909 1 \r\n0.550771 0.214998 0.0584409 1 \r\n0.601637 0.344062 -0.0805187 1 \r\n0.560411 0.480577 -0.0498589 1 \r\n-0.195319 -0.575552 0.564094 1 \r\n-0.321931 0.282498 -0.162314 1 \r\n0.380999 -0.940753 0.410365 1 \r\n0.582316 0.105991 -0.048154 1 \r\n0.453791 0.722903 -0.278181 1 \r\n0.739688 0.31341 -0.351522 1 \r\n0.0953445 -0.891867 0.398027 1 \r\n-0.11631 -0.387391 -0.658175 1 \r\n0.34715 0.112331 0.252079 1 \r\n0.513799 -0.593151 0.452037 1 \r\n0.761448 0.218328 -0.475947 1 \r\n-0.695038 -0.629562 0.618105 1 \r\n-0.272879 0.0546787 -0.093886 1 \r\n0.21511 0.796234 -0.238531 1 \r\n0.00206697 0.381283 -0.967891 1 \r\n-0.316769 0.0599084 0.939926 1 \r\n-0.0440509 -0.187447 0.780499 1 \r\n0.018046 -0.651185 -0.851824 1 \r\n-0.0399574 0.548482 -0.877337 1 \r\n0.141075 0.140659 0.272262 1 \r\n-0.0732912 0.162699 0.204606 1 \r\n-0.0774056 0.727147 -0.523751 1 \r\n0.513425 -0.25744 -0.739888 1 \r\n-0.29629 0.0561106 0.785718 1 \r\n0.247493 -0.91186 -0.324251 1 \r\n0.288418 0.22608 -0.929661 1 \r\n0.634853 0.367638 -0.779023 1 \r\n0.477035 -0.642599 -0.513316 1 \r\n-0.0612398 -0.609695 0.384101 1 \r\n-0.249217 -0.499098 -0.279817 1 \r\n-0.39837 0.291504 -0.509139 1 \r\n0.637935 0.500085 -0.231872 1 \r\n0.465164 0.655548 -0.0860858 1 \r\n0.414266 -0.173519 0.113593 1 \r\n-0.0529219 -0.100745 0.689984 1 \r\n-0.710309 -0.642202 0.749244 1 \r\n-0.0387682 -0.467291 0.244421 1 \r\n0.33198 0.359503 -0.961414 1 \r\n0.132129 -0.440497 0.645976 1 \r\n-0.0192186 0.750868 -0.547361 1 \r\n0.12368 -0.575917 -0.65314 1 \r\n0.551352 0.0889527 0.052049 1 \r\n0.731355 0.304828 -0.250182 1 \r\n-0.0661792 -0.203597 -0.908423 1 \r\n0.267997 -0.243345 0.205623 1 \r\n-0.243774 -0.777778 0.696676 1 \r\n0.406857 0.889863 -0.663552 1 \r\n0.569791 -0.538402 -0.436934 1 \r\n-0.0653864 0.298893 0.212576 1 \r\n0.562725 -0.347742 -0.118636 1 \r\n0.74885 0.258818 -0.538321 1 \r\n0.724579 -0.0883706 -0.927266 1 \r\n0.402437 -0.81776 -0.41626 1 \r\n-0.0958148 0.0559342 0.166659 1 \r\n0.485927 0.217384 -0.917794 1 \r\n0.703764 0.130521 -0.718179 1 \r\n0.384786 -0.649102 0.590907 1 \r\n0.456157 -0.95419 0.062934 1 \r\n0.68987 -0.762001 0.319029 1 \r\n0.38102 -0.574852 -0.849952 1 \r\n-0.577637 -0.645694 0.841846 1 \r\n-0.628247 -0.715509 0.908858 1 \r\n-0.230532 0.600593 -0.558356 1 \r\n0.706202 0.365749 -0.590398 1 \r\n-0.467413 0.0657816 -0.349438 1 \r\n0.292289 -0.471172 -0.665677 1 \r\n0.534438 -0.380148 -0.0425589 1 \r\n-0.233052 -0.385213 -0.376335 1 \r\n0.281176 -0.431935 0.380376 1 \r\n0.188912 -0.535277 -0.667456 1 \r\n0.232649 0.892768 -0.818225 1 \r\n0.718644 -0.0648115 -0.87974 1 \r\n-0.00061959 -0.86743 0.292652 1 \r\n0.526168 0.578449 -0.721858 1 \r\n-0.0854724 -0.642912 0.209691 1 \r\n0.509897 -0.43048 -0.00157738 1 \r\n0.571866 0.518919 -0.722288 1 \r\n0.764654 0.092823 -0.398439 1 \r\n0.170421 -0.854226 -0.4437 1 \r\n0.338309 0.943987 -0.537215 1 \r\n-0.12553 0.414353 -0.973324 1 \r\n0.676619 0.0376297 -0.864204 1 \r\n0.111353 -0.901388 -0.346089 1 \r\n0.34687 -0.902532 -0.2774 1 \r\n-0.200693 -0.365873 -0.98466 1 \r\n-0.03507 -0.327556 0.511474 1 \r\n0.575363 -0.305727 -0.180099 1 \r\n-0.250261 0.549426 -0.709986 1 \r\n-0.126041 -0.60479 0.608558 1 \r\n-0.15278 0.338397 0.131638 1 \r\n0.557754 -0.626632 -0.901748 1 \r\n-0.0890118 -0.643925 0.143031 1 \r\n0.0731095 0.798984 -0.431809 1 \r\n0.428202 0.595405 -0.847423 1 \r\n0.364313 -0.964063 0.0829195 1 \r\n0.38048 0.507992 -0.95137 1 \r\n0.461615 -0.983625 0.138154 1 \r\n0.252422 -0.707179 -0.590967 1 \r\n0.0216581 -0.635654 -0.981375 1 \r\n-0.160313 0.646385 -0.638557 1 \r\n0.538993 0.63964 -0.515078 1 \r\n0.501347 0.0785552 0.130942 1 \r\n-0.418506 -0.0483219 -0.209882 1 \r\n0.38049 -0.717708 -0.533931 1 \r\n-0.0941452 -0.284516 0.815634 1 \r\n0.131959 -0.926642 -0.144803 1 \r\n0.344795 0.162564 -0.903006 1 \r\n0.333162 0.688203 -0.898614 1 \r\n-0.420179 -0.797681 0.761209 1 \r\n-0.472824 -0.0678114 -0.433714 1 \r\n-0.196492 -0.102108 0.930493 1 \r\n0.0593045 -0.450193 0.371193 1 \r\n0.195206 0.756295 -0.90483 1 \r\n-0.0792465 -0.580765 0.211725 1 \r\n0.419174 0.84737 -0.73129 1 \r\n-0.0724372 -0.136649 0.866386 1 \r\n-0.0260008 -0.739821 -0.509925 1 \r\n0.20969 -0.041546 0.228856 1 \r\n0.300715 0.972118 -0.670399 1 \r\n-0.0343394 0.683669 -0.0240346 1 \r\n0.629654 0.467191 -0.162024 1 \r\n-0.146982 0.00332463 0.650252 1 \r\n-0.255051 -0.379586 -0.2749 1 \r\n0.0453531 -0.910013 0.107979 1 \r\n0.586124 0.310888 -0.963529 1 \r\n0.384724 -0.837793 0.566772 1 \r\n0.527901 -0.538821 -0.971223 1 \r\n0.105667 -0.312025 -0.968405 1 \r\n0.148928 0.891751 -0.46444 1 \r\n0.223655 -0.951502 0.507272 1 \r\n-0.201138 -0.293454 -0.440547 1 \r\n0.134739 0.7647 -0.097056 1 \r\n0.33667 -0.607789 -0.95301 1 \r\n0.173805 0.709973 -0.00262237 1 \r\n0.153475 -0.51916 -0.787994 1 \r\n-0.289277 0.0857565 -0.963809 1 \r\n-0.180265 -0.614352 -0.0631326 1 \r\n0.482731 -0.489971 0.0987542 1 \r\n-0.470717 -0.0803941 -0.355475 1 \r\n-0.323278 0.376043 -0.766753 1 \r\n0.633753 -0.197412 -0.963992 1 \r\n0.617441 -0.918136 0.26972 1 \r\n-0.406989 0.0609565 -0.693709 1 \r\n0.517618 0.663071 -0.549766 1 \r\n0.490119 0.599877 -0.756922 1 \r\n-0.0967995 -0.30499 -0.949937 1 \r\n-0.403943 -0.06863 -0.64488 1 \r\n0.42843 -0.930424 0.0469022 1 \r\n0.00894672 -0.816308 0.444462 1 \r\n-0.0861427 -0.654774 0.192258 1 \r\n-0.522931 -0.663989 0.826872 1 \r\n-0.0473528 -0.285558 -0.938635 1 \r\n-0.294981 0.481667 -0.257029 1 \r\n0.375084 -0.305012 0.151696 1 \r\n-0.418076 0.238625 -0.281154 1 \r\n0.423968 -0.446341 -0.72926 1 \r\n0.0282243 -0.164473 0.628658 1 \r\n0.611049 0.150777 -0.117716 1 \r\n0.552047 -0.832753 0.000434637 1 \r\n-0.0041756 -0.0918311 0.61468 1 \r\n-0.209548 0.344166 -0.970654 1 \r\n-0.233604 -0.426213 -0.0659686 1 \r\n0.0453676 -0.877434 -0.0799387 1 \r\n0.13428 0.915981 -0.471641 1 \r\n-0.291679 0.350703 -0.160467 1 \r\n0.643901 0.138823 -0.815313 1 \r\n0.481299 0.361381 -0.953727 1 \r\n-0.0775343 0.246262 0.203838 1 \r\n0.396875 -0.878946 -0.26879 1 \r\n-0.0532 0.463124 0.166368 1 \r\n-0.176683 -0.762625 0.546298 1 \r\n0.652047 0.396111 -0.719765 1 \r\n-0.0493253 -0.491865 0.24327 1 \r\n0.337095 -0.486735 -0.815303 1 \r\n0.584754 -0.460911 -0.14307 1 \r\n-0.583466 -0.73009 0.888623 1 \r\n0.146601 -0.709277 -0.59462 1 \r\n-0.0364604 0.393071 0.209307 1 \r\n0.0670361 -0.690541 0.591841 1 \r\n0.54001 -0.592546 -0.0712721 1 \r\n0.594934 -0.12624 -0.156276 1 \r\n0.397352 0.65617 -0.860319 1 \r\n0.528804 0.371851 0.0310466 1 \r\n-0.555342 -0.791345 0.835952 1 \r\n-0.262391 0.2192 -0.0965475 1 \r\n-0.326814 0.0577086 0.834779 1 \r\n-0.433593 0.197482 -0.329867 1 \r\n0.58271 0.373335 -0.957064 1 \r\n0.476827 -0.779919 -0.102261 1 \r\n-0.226555 -0.739635 0.49372 1 \r\n0.140282 -0.272335 -0.967155 1 \r\n0.0713424 -0.901709 -0.318095 1 \r\n-0.213206 0.0642147 0.697247 1 \r\n-0.664886 -0.639535 0.891301 1 \r\n-0.10666 -0.814328 -0.251558 1 \r\n0.244816 -0.429762 -0.747264 1 \r\n0.0964393 -0.900458 -0.0833536 1 \r\n0.0808277 0.652964 -0.937612 1 \r\n-0.0217132 -0.360074 0.226086 1 \r\n0.167498 -0.658289 -0.626598 1 \r\n0.178289 0.886729 -0.827858 1 \r\n-0.442436 -0.758183 0.710716 1 \r\n-0.243109 0.579487 -0.620653 1 \r\n-0.315293 -0.150656 -0.812265 1 \r\n-0.15031 -0.532359 -0.515038 1 \r\n0.583758 -0.590492 0.0871947 1 \r\n-0.103789 -0.342851 -0.708006 1 \r\n-0.0580106 -0.146178 0.885158 1 \r\n0.496511 -0.774817 -0.360013 1 \r\n-0.0556748 0.762168 -0.308826 1 \r\n0.322402 -0.337213 -0.965805 1 \r\n0.529914 -0.613833 -0.96178 1 \r\n0.0127622 -0.393499 0.754838 1 \r\n-0.185527 -0.497835 0.0270828 1 \r\n0.699395 -0.804187 0.157434 1 \r\n-0.365189 0.192978 -0.747018 1 \r\n0.132472 0.631422 -0.952149 1 \r\n0.116203 -0.385836 0.295122 1 \r\n0.199078 0.179136 -0.924231 1 \r\n0.592412 0.398228 -0.897095 1 \r\n-0.0860815 0.744621 -0.354056 1 \r\n0.42319 -0.439463 -0.626617 1 \r\n-0.337704 0.276292 -0.170132 1 \r\n0.422256 -0.983662 0.163255 1 \r\n-0.265682 -0.084056 -0.976862 1 \r\n-0.563275 -0.754656 0.879783 1 \r\n0.203196 -0.0767124 0.219798 1 \r\n0.517223 0.569225 -0.754675 1 \r\n0.469792 -0.040114 0.113624 1 \r\n0.737042 -0.0701502 -0.29592 1 \r\n0.700983 -0.663191 0.105561 1 \r\n-0.181734 0.434266 -0.943499 1 \r\n0.691156 -0.168781 -0.940296 1 \r\n-0.160566 -0.593813 0.471742 1 \r\n-0.254808 0.0770298 0.827183 1 \r\n-0.0104991 -0.470156 0.505871 1 \r\n-0.0843901 -0.187558 0.140863 1 \r\n-0.160545 0.521025 -0.835557 1 \r\n0.0512595 -0.0886238 0.202199 1 \r\n-0.275037 -0.0287029 0.931904 1 \r\n-0.204808 -0.49692 -0.0187155 1 \r\n0.0847594 -0.420749 0.697517 1 \r\n0.106354 -0.813039 0.56867 1 \r\n0.572199 0.00637543 -0.044737 1 \r\n0.594166 0.532979 -0.64273 1 \r\n-0.0862247 0.00911486 0.650563 1 \r\n-0.169166 -0.0263671 -0.910807 1 \r\n0.202514 -0.937176 -0.138298 1 \r\n0.560411 -0.190114 -0.378994 1 \r\n0.395619 -0.942923 0.458107 1 \r\n-0.262203 -0.212811 -0.472739 1 \r\n0.301877 -0.906919 -0.0854943 1 \r\n0.49233 -0.189016 -0.69485 1 \r\n-0.129841 -0.745013 -0.117632 1 \r\n0.344857 -0.456316 -0.777554 1 \r\n0.708444 0.203158 -0.165608 1 \r\n0.171216 -0.250946 -0.96755 1 \r\n-0.174241 0.0404937 0.743392 1 \r\n0.705735 0.0335622 -0.62399 1 \r\n0.543289 -0.74085 -0.298741 1 \r\n0.756903 0.012041 -0.279238 1 \r\n0.52209 0.419386 0.0314721 1 \r\n-0.213952 0.0476122 -0.946973 1 \r\n0.238793 0.496028 0.213862 1 \r\n-0.0977863 -0.0727319 0.720729 1 \r\n-0.0574877 0.685401 -0.728565 1 \r\n-0.185369 0.139497 0.0881286 1 \r\n0.65517 -0.0558356 -0.790124 1 \r\n0.427185 -0.540692 -0.58522 1 \r\n-0.373129 0.323122 -0.607386 1 \r\n0.558367 -0.0590762 -0.933486 1 \r\n-0.0796947 -0.555424 -0.572927 1 \r\n-0.0144962 -0.829897 0.0872362 1 \r\n0.0900981 0.371622 -0.965856 1 \r\n-0.495008 -0.694673 0.831697 1 \r\n-0.105273 -0.543206 -0.952934 1 \r\n0.300403 -0.88227 -0.0342856 1 \r\n0.590669 0.0969945 -0.090334 1 \r\n0.533079 -0.399309 -0.797419 1 \r\n-0.26284 -0.264058 -0.297838 1 \r\n-0.0825451 -0.420042 -0.749328 1 \r\n0.286924 -0.465983 0.526873 1 \r\n0.207126 -0.553553 -0.977383 1 \r\n0.143569 -0.191136 -0.942705 1 \r\n-0.28809 0.485081 -0.749281 1 \r\n-0.130547 0.00439346 0.718364 1 \r\n0.653852 0.0602301 -0.1419 1 \r\n-0.0878102 0.665966 -0.685212 1 \r\n-0.219537 -0.0225039 0.986122 1 \r\n-0.183757 -0.0994881 0.689651 1 \r\n0.677241 -0.856102 0.266368 1 \r\n0.596127 -0.462545 -0.188737 1 \r\n0.534293 -0.2422 -0.799653 1 \r\n0.181347 0.382891 0.265195 1 \r\n-0.329779 0.457977 -0.358336 1 \r\n0.423989 0.726825 -0.173077 1 \r\n0.275904 0.990246 -0.56696 1 \r\n0.302915 -0.95044 0.364334 1 \r\n0.20325 -0.939731 0.0309429 1 \r\n0.688272 -0.648193 0.162944 1 \r\n-0.057058 -0.811744 -0.0860225 1 \r\n-0.190447 0.0347762 0.069793 1 \r\n0.580915 0.559367 -0.156598 1 \r\n0.143601 0.788483 -0.162895 1 \r\n0.0340187 0.813553 -0.538911 1 \r\n0.514287 -0.249837 -0.71327 1 \r\n-0.267151 0.0958635 -0.979363 1 \r\n0.325235 -0.250823 -0.965323 1 \r\n0.479338 -0.419695 -0.596511 1 \r\n0.0939717 0.799617 -0.37431 1 \r\n-0.258996 -0.0118874 0.979689 1 \r\n-0.145122 0.493185 0.0461551 1 \r\n-0.0806005 -0.70238 0.0809791 1 \r\n0.483873 -0.750195 -0.0346167 1 \r\n-0.14922 -0.684524 0.432965 1 \r\n0.350574 -0.565317 -0.617643 1 \r\n0.315356 -0.566383 -0.896094 1 \r\n0.330817 -0.155294 -0.934964 1 \r\n-0.344974 -0.213625 -0.859133 1 \r\n0.458865 -0.601832 -0.546516 1 \r\n-0.0617981 0.754105 -0.256708 1 \r\n-0.342178 0.0704614 0.919452 1 \r\n0.201594 -0.699972 0.593066 1 \r\n0.118037 0.804992 -0.419079 1 \r\n0.171613 0.234755 0.282234 1 \r\n0.418147 0.483327 0.161678 1 \r\n0.671731 0.423277 -0.614679 1 \r\n0.577107 -0.563398 0.145937 1 \r\n0.731573 0.0399126 -0.540306 1 \r\n0.535538 -0.066507 0.00670207 1 \r\n0.568048 -0.00792778 -0.93984 1 \r\n0.58243 0.507785 -0.719091 1 \r\n0.47994 -0.472399 0.130403 1 \r\n-0.160687 0.684893 -0.265468 1 \r\n0.634355 -0.0283458 -0.746114 1 \r\n-0.0142835 0.780898 -0.309716 1 \r\n-0.232027 0.376769 -0.0722569 1 \r\n-0.0750791 -0.447708 -0.707374 1 \r\n-0.201198 -0.542569 -0.0444641 1 \r\n-0.108323 0.548077 0.0531489 1 \r\n-0.454773 -0.700641 0.501367 1 \r\n-0.378536 0.168718 -0.726849 1 \r\n0.0562019 -0.872381 0.0210021 1 \r\n0.604677 0.539838 -0.546521 1 \r\n0.443072 0.251783 0.208425 1 \r\n-0.555895 -0.759598 0.791799 1 \r\n-0.429218 -0.722218 0.572292 1 \r\n-0.107825 0.370844 -0.964871 1 \r\n-0.0199522 0.47982 0.17772 1 \r\n0.565692 0.2575 -0.0102699 1 \r\n0.754879 0.156805 -0.541012 1 \r\n-0.0271598 -0.562325 0.390618 1 \r\n-0.251095 0.463227 -0.148092 1 \r\n0.195292 0.801869 -0.377826 1 \r\n-0.077554 -0.691916 0.273434 1 \r\n-0.125576 0.690756 -0.554925 1 \r\n0.275728 -0.957107 0.396491 1 \r\n-0.0972986 0.275784 -0.913835 1 \r\n0.542034 -0.110596 -0.59783 1 \r\n-0.123264 -0.282211 -0.788274 1 \r\n-0.317867 -0.0463172 -0.967411 1 \r\n0.701606 0.421825 -0.370018 1 \r\n0.738557 0.318525 -0.389009 1 \r\n0.18916 -0.448854 0.556343 1 \r\n0.0775622 -0.413392 0.426894 1 \r\n0.509669 -0.393692 -0.00315464 1 \r\n-0.0216094 0.0924807 0.224073 1 \r\n0.691167 0.432782 -0.324074 1 \r\n-0.490915 -0.683924 0.505062 1 \r\n0.279661 -0.0195767 0.226158 1 \r\n0.667591 -0.173224 -0.832646 1 \r\n-0.279251 -0.208794 -0.220864 1 \r\n0.0118365 -0.521386 0.44331 1 \r\n-0.281559 -0.789062 0.701875 1 \r\n0.613414 -0.860669 0.0383519 1 \r\n0.470144 0.314427 -0.932972 1 \r\n-0.264961 -0.0358721 0.813289 1 \r\n0.648176 -0.656637 0.263286 1 \r\n-0.31531 -0.122602 -0.694012 1 \r\n-0.12009 -0.657249 0.012347 1 \r\n-0.0595556 -0.781779 -0.438424 1 \r\n0.435217 -0.85428 -0.238567 1 \r\n0.545811 -0.907102 0.384246 1 \r\n-0.69094 -0.568097 0.7899 1 \r\n0.592298 -0.172515 -0.234363 1 \r\n0.0680209 -0.208343 0.212275 1 \r\n0.640311 0.248078 -0.827093 1 \r\n-0.197108 -0.179169 -0.757185 1 \r\n0.696407 0.0799561 -0.160066 1 \r\n-0.00272804 -0.569102 0.454922 1 \r\n0.395267 -0.439963 -0.706363 1 \r\n-0.134123 -0.434135 -0.922553 1 \r\n0.290193 -0.893467 -0.350525 1 \r\n0.0851029 -0.744791 -0.553967 1 \r\n0.378892 -0.236307 -0.95918 1 \r\n-0.121408 -0.484362 -0.938049 1 \r\n0.14695 0.801059 -0.322138 0 \r\n0.133128 0.801453 -0.348132 0 \r\n0.160885 0.801983 -0.351865 0 \r\n0.459316 -0.535446 0.492994 0 \r\n0.469647 -0.541624 0.481865 0 \r\n0.466653 -0.541927 0.498914 0 \r\n0.395661 0.53699 -0.931224 0 \r\n0.412149 0.53757 -0.921142 0 \r\n0.394655 0.550194 -0.919366 0 \r\n0.144653 0.877764 -0.466115 0 \r\n0.125837 0.874407 -0.472687 0 \r\n0.130112 0.888394 -0.471012 0 \r\n0.563414 0.531915 -0.719159 0 \r\n0.559892 0.528973 -0.728282 0 \r\n0.568344 0.515977 -0.731412 0 \r\n0.0717798 -0.90622 -0.141833 0 \r\n0.0530479 -0.897301 -0.136199 0 \r\n0.0752959 -0.903108 -0.120387 0 \r\n-0.161817 -0.104224 0.659409 0 \r\n-0.177052 -0.0898829 0.678932 0 \r\n-0.168521 -0.11383 0.670128 0 \r\n0.562626 -0.578104 -0.108764 0 \r\n0.571581 -0.580104 -0.13092 0 \r\n0.570787 -0.601351 -0.135993 0 \r\n0.350611 -0.850362 -0.400364 0 \r\n0.362414 -0.836811 -0.414087 0 \r\n0.34203 -0.839808 -0.422002 0 \r\n0.166671 0.446972 0.241029 0 \r\n0.130353 0.446386 0.237781 0 \r\n0.147761 0.468296 0.228265 0 \r\n0.550081 -0.0983252 -0.626774 0 \r\n0.56852 -0.0941404 -0.601855 0 \r\n0.576567 -0.0818696 -0.630799 0 \r\n0.540581 -0.164737 -0.461868 0 \r\n0.560027 -0.164819 -0.424385 0 \r\n0.555731 -0.15423 -0.444705 0 \r\n-0.0730941 -0.604939 -0.975097 0 \r\n-0.0653728 -0.615466 -0.978868 0 \r\n-0.0762247 -0.590801 -0.978224 0 \r\n0.580235 0.0846566 -0.0469394 0 \r\n0.58338 0.0987429 -0.0575802 0 \r\n0.581299 0.0774086 -0.0563655 0 \r\n0.565309 -0.318148 -0.470371 0 \r\n0.568515 -0.319404 -0.443982 0 \r\n0.566792 -0.292727 -0.455019 0 \r\n0.688614 0.0523646 -0.160625 0 \r\n0.700589 0.0501284 -0.170077 0 \r\n0.692796 0.0225369 -0.170637 0 \r\n0.54292 -0.358849 -0.580027 0 \r\n0.550828 -0.348678 -0.546847 0 \r\n0.547066 -0.343639 -0.572983 0 \r\n-0.734309 -0.611987 0.713876 0 \r\n-0.7457 -0.609321 0.752182 0 \r\n-0.732235 -0.623531 0.741467 0 \r\n0.08063 -0.640582 0.569807 0 \r\n0.0660285 -0.646961 0.571747 0 \r\n0.0632087 -0.631121 0.565246 0 \r\n0.630277 0.394264 -0.127015 0 \r\n0.627973 0.420704 -0.136998 0 \r\n0.642707 0.410037 -0.156327 0 \r\n-0.170632 -0.580048 0.526028 0 \r\n-0.159101 -0.583104 0.505289 0 \r\n-0.135269 -0.582568 0.513669 0 \r\n-0.277407 -0.14459 -0.677603 0 \r\n-0.296194 -0.131032 -0.696188 0 \r\n-0.296522 -0.13616 -0.675426 0 \r\n-0.0722976 -0.745916 0.0022292 0 \r\n-0.0592973 -0.752221 0.0198347 0 \r\n-0.0594359 -0.764805 -0.0075508 0 \r\n-0.238263 -0.203762 -0.525433 0 \r\n-0.236868 -0.195302 -0.553244 0 \r\n-0.256879 -0.190704 -0.549015 0 \r\n0.160845 0.341058 -0.964325 0 \r\n0.155266 0.325623 -0.966339 0 \r\n0.173648 0.317057 -0.966121 0 \r\n-0.0924807 0.284931 0.191117 0 \r\n-0.110555 0.293061 0.176371 0 \r\n-0.0834607 0.307023 0.19783 0 \r\n0.228265 -0.436507 0.414484 0 \r\n0.250876 -0.442133 0.427439 0 \r\n0.23115 -0.443456 0.43876 0 \r\n-0.124241 -0.273908 -0.927819 0 \r\n-0.114547 -0.252224 -0.922453 0 \r\n-0.135448 -0.248747 -0.921753 0 \r\n0.168312 -0.539169 -0.665983 0 \r\n0.179072 -0.527342 -0.670084 0 \r\n0.158471 -0.531235 -0.668611 0 \r\n0.681091 -0.855227 0.238113 0 \r\n0.673775 -0.872432 0.216265 0 \r\n0.669926 -0.873307 0.24452 0 \r\n0.409047 0.106909 -0.89701 0 \r\n0.428316 0.056095 -0.901346 0 \r\n0.445136 0.0775797 -0.899725 0 \r\n-0.313867 -0.215337 -0.311413 0 \r\n-0.299493 -0.221005 -0.292937 0 \r\n-0.3022 -0.224707 -0.31255 0 \r\n0.215403 -0.65176 0.593767 0 \r\n0.207698 -0.627455 0.5922 0 \r\n0.228427 -0.628438 0.594114 0 \r\n-0.250717 -0.469474 -0.289691 0 \r\n-0.25141 -0.476613 -0.271958 0 \r\n-0.248525 -0.491959 -0.29755 0 \r\n0.559508 -0.635576 0.402043 0 \r\n0.578336 -0.646782 0.380008 0 \r\n0.578866 -0.647847 0.392107 0 \r\n-0.0242305 -0.492837 -0.684906 0 \r\n-0.00205618 -0.502121 -0.69324 0 \r\n-0.0224172 -0.489659 -0.702028 0 \r\n0.648281 -0.010757 -0.966132 0 \r\n0.650429 0.028021 -0.966476 0 \r\n0.63449 0.0062088 -0.96834 0 \r\n0.457687 -0.633036 -0.961992 0 \r\n0.429608 -0.635211 -0.960591 0 \r\n0.454351 -0.641105 -0.956193 0 \r\n-0.258579 -0.0574643 -0.974221 0 \r\n-0.258717 -0.0861821 -0.972483 0 \r\n-0.251613 -0.0595904 -0.969841 0 \r\n0.466808 -0.203355 0.055935 0 \r\n0.490721 -0.225995 0.0233954 0 \r\n0.471457 -0.23 0.0466754 0 \r\n0.0595639 -0.940818 0.173995 0 \r\n0.0441779 -0.928086 0.161274 0 \r\n0.0467608 -0.928747 0.177617 0 \r\n0.522982 -0.560697 -0.814104 0 \r\n0.552961 -0.561168 -0.826291 0 \r\n0.535289 -0.57549 -0.830881 0 \r\n0.529276 0.0481621 0.0800866 0 \r\n0.525431 0.0730558 0.094339 0 \r\n0.536944 0.0757952 0.0752356 0 \r\n0.582363 -0.313999 -0.294517 0 \r\n0.584121 -0.338273 -0.301453 0 \r\n0.584303 -0.326499 -0.279972 0 \r\n-0.140271 0.363492 0.133885 0 \r\n-0.157633 0.35901 0.11529 0 \r\n-0.145124 0.384106 0.117536 0 \r\n0.327258 0.469594 0.213073 0 \r\n0.325204 0.455066 0.222174 0 \r\n0.308165 0.476178 0.216518 0 \r\n-0.0476501 -0.337642 0.789376 0 \r\n-0.0303449 -0.348078 0.788141 0 \r\n-0.032373 -0.369672 0.766075 0 \r\n0.739086 0.160915 -0.64092 0 \r\n0.744217 0.173672 -0.612996 0 \r\n0.741177 0.181673 -0.628262 0 \r\n0.504387 0.283193 -0.9395 0 \r\n0.513638 0.263228 -0.939377 0 \r\n0.511687 0.288993 -0.944412 0 \r\n-0.410429 -0.0595261 -0.206858 0 \r\n-0.406657 -0.0802768 -0.213537 0 \r\n-0.414734 -0.0690726 -0.216561 0 \r\n-0.343865 -0.230427 -0.864087 0 \r\n-0.333123 -0.219292 -0.849222 0 \r\n-0.332014 -0.236093 -0.854176 0 \r\n0.116044 -0.577746 -0.801169 0 \r\n0.114438 -0.602111 -0.814705 0 \r\n0.10032 -0.592473 -0.804779 0 \r\n0.0704578 0.386663 0.254528 0 \r\n0.0461687 0.379239 0.251633 0 \r\n0.0603302 0.404148 0.246289 0 \r\n0.179688 -0.458816 -0.756959 0 \r\n0.155742 -0.476062 -0.757829 0 \r\n0.155183 -0.470962 -0.747105 0 \r\n0.719178 -0.741446 0.205649 0 \r\n0.720875 -0.759396 0.199236 0 \r\n0.718151 -0.751189 0.215543 0 \r\n-0.168472 -0.737028 0.693377 0 \r\n-0.186774 -0.729074 0.705139 0 \r\n-0.135394 -0.726466 0.681667 0 \r\n0.370254 0.794424 -0.556062 0 \r\n0.368614 0.780701 -0.554044 0 \r\n0.354113 0.800826 -0.534281 0 \r\n0.718571 -0.104245 -0.882407 0 \r\n0.71605 -0.0845868 -0.8713 0 \r\n0.721166 -0.0844698 -0.890847 0 \r\n-0.572943 -0.691812 0.681262 0 \r\n-0.583802 -0.686041 0.667166 0 \r\n-0.588936 -0.687516 0.686647 0 \r\n0.606058 -0.375233 -0.928548 0 \r\n0.605206 -0.38684 -0.916483 0 \r\n0.597943 -0.357855 -0.918146 0 \r\n-0.371989 0.175946 -0.175182 0 \r\n-0.353868 0.173917 -0.168111 0 \r\n-0.364891 0.139741 -0.1696 0 \r\n0.671046 0.480437 -0.439132 0 \r\n0.659424 0.5001 -0.424807 0 \r\n0.661075 0.490725 -0.449311 0 \r\n-0.374013 -0.046052 -0.726668 0 \r\n-0.362521 -0.0471323 -0.747579 0 \r\n-0.37032 -0.0402967 -0.738832 0 \r\n0.526505 -0.49327 -0.787877 0 \r\n0.527247 -0.475115 -0.786801 0 \r\n0.543222 -0.490921 -0.796271 0 \r\n-0.126206 0.328077 0.158762 0 \r\n-0.107281 0.333255 0.174026 0 \r\n-0.12046 0.309975 0.167821 0 \r\n0.0529727 0.795186 -0.324173 0 \r\n0.0424891 0.793136 -0.356901 0 \r\n0.0614711 0.795471 -0.351314 0 \r\n-0.428245 -0.00554635 -0.627857 0 \r\n-0.430461 0.0165652 -0.628335 0 \r\n-0.439025 -0.00479925 -0.596735 0 \r\n0.0898014 -0.335239 0.691769 0 \r\n0.0615329 -0.302967 0.737659 0 \r\n0.0760104 -0.311814 0.70324 0 \r\n-0.375051 0.332772 -0.576903 0 \r\n-0.364919 0.357542 -0.592516 0 \r\n-0.366841 0.367192 -0.562033 0 \r\n0.235585 -0.994926 0.189207 0 \r\n0.2627 -0.996309 0.18762 0 \r\n0.243155 -0.998473 0.168786 0 \r\n-0.0479053 0.678387 -0.810526 0 \r\n-0.0516118 0.65669 -0.806837 0 \r\n-0.0459343 0.663029 -0.818014 0 \r\n0.0241085 -0.47363 0.376158 0 \r\n0.0227138 -0.48633 0.398493 0 \r\n0.012014 -0.493567 0.376314 0 \r\n0.56204 0.618322 -0.446715 0 \r\n0.545536 0.640658 -0.442314 0 \r\n0.549417 0.629799 -0.473579 0 \r\n-0.208111 -0.386092 -0.967069 0 \r\n-0.18408 -0.403315 -0.966211 0 \r\n-0.193707 -0.397173 -0.975713 0 \r\n-0.603184 -0.656543 0.8647 0 \r\n-0.598616 -0.643708 0.853083 0 \r\n-0.582206 -0.65853 0.853462 0 \r\n0.420653 -0.544877 -0.97242 0 \r\n0.430439 -0.563911 -0.971033 0 \r\n0.46918 -0.568541 -0.971574 0 \r\n0.47499 0.189591 0.178503 0 \r\n0.468095 0.162933 0.184413 0 \r\n0.462076 0.184833 0.190519 0 \r\n-0.0669501 -0.141361 0.902751 0 \r\n-0.069383 -0.146584 0.909024 0 \r\n-0.086329 -0.123223 0.922104 0 \r\n-0.0327191 -0.650381 -0.566851 0 \r\n-0.0257595 -0.68408 -0.551919 0 \r\n-0.0140334 -0.664325 -0.568295 0 \r\n0.611562 0.0717481 -0.119824 0 \r\n0.624455 0.0712968 -0.128947 0 \r\n0.617228 0.0515604 -0.124881 0 \r\n0.462689 0.701678 -0.174792 0 \r\n0.448229 0.713081 -0.182204 0 \r\n0.464307 0.706207 -0.197343 0 \r\n-0.151375 -0.0618593 0.0961133 0 \r\n-0.172575 -0.0539005 0.0762058 0 \r\n-0.156798 -0.0379495 0.0930315 0 \r\n-0.0719402 -0.438744 -0.744501 0 \r\n-0.0642044 -0.454081 -0.760203 0 \r\n-0.0748094 -0.435379 -0.765031 0 \r\n0.68698 -0.755108 0.0831011 0 \r\n0.697595 -0.759687 0.108218 0 \r\n0.694414 -0.743045 0.0947542 0 \r\n0.356997 -0.506244 -0.816153 0 \r\n0.357231 -0.486371 -0.801753 0 \r\n0.377133 -0.50588 -0.802603 0 \r\n0.489938 -0.878553 0.0121037 0 \r\n0.491998 -0.865722 0.00753898 0 \r\n0.473719 -0.86704 0.00883963 0 \r\n0.104148 0.898143 -0.482449 0 \r\n0.0917058 0.884627 -0.49025 0 \r\n0.0845581 0.897733 -0.495114 0 \r\n0.0408699 -0.237191 0.214226 0 \r\n0.0633857 -0.228587 0.216633 0 \r\n0.0362347 -0.257436 0.218583 0 \r\n0.576775 -0.309955 -0.892382 0 \r\n0.578658 -0.290568 -0.889722 0 \r\n0.585102 -0.301054 -0.900776 0 \r\n-0.00372636 0.765027 -0.585947 0 \r\n-0.0140293 0.754396 -0.602752 0 \r\n-0.00484286 0.769022 -0.596612 0 \r\n0.549328 -0.0278758 -0.927935 0 \r\n0.551668 -0.0101945 -0.929515 0 \r\n0.541945 -0.0138689 -0.924097 0 \r\n-0.158626 -0.181994 0.0805121 0 \r\n-0.165863 -0.209803 0.0739644 0 \r\n-0.165886 -0.196702 0.0733937 0 \r\n0.68065 -0.817169 0.12066 0 \r\n0.689901 -0.808743 0.136079 0 \r\n0.687509 -0.797223 0.115543 0 \r\n0.178675 -0.594824 -0.850335 0 \r\n0.18867 -0.61176 -0.86975 0 \r\n0.169122 -0.62078 -0.85965 0 \r\n0.271038 0.803939 -0.459533 0 \r\n0.264023 0.799357 -0.436182 0 \r\n0.248884 0.805754 -0.439812 0 \r\n0.203412 -0.325043 0.243383 0 \r\n0.21405 -0.333156 0.247955 0 \r\n0.196647 -0.336545 0.252551 0 \r\n-0.262704 0.0482554 0.9194 0 \r\n-0.268626 0.0414951 0.943671 0 \r\n-0.278696 0.0577345 0.918446 0 \r\n-0.595057 -0.657354 0.540933 0 \r\n-0.614452 -0.654792 0.549058 0 \r\n-0.602732 -0.661604 0.544254 0 \r\n0.308223 -0.355768 -0.966219 0 \r\n0.331581 -0.357329 -0.966673 0 \r\n0.34576 -0.338774 -0.966259 0 \r\n0.282727 0.790252 -0.246361 0 \r\n0.275795 0.792804 -0.250789 0 \r\n0.295319 0.790516 -0.259301 0 \r\n0.329375 0.13076 -0.903576 0 \r\n0.31781 0.170917 -0.908617 0 \r\n0.302391 0.139113 -0.909188 0 \r\n-0.076923 -0.76414 0.525151 0 \r\n-0.071536 -0.762666 0.512304 0 \r\n-0.0898643 -0.76105 0.511941 0 \r\n-0.0454985 -0.572829 -0.856818 0 \r\n-0.0586405 -0.56602 -0.868399 0 \r\n-0.0493721 -0.549345 -0.846944 0 \r\n0.473662 0.679928 -0.636102 0 \r\n0.479167 0.683747 -0.608088 0 \r\n0.463851 0.693983 -0.6151 0 \r\n-0.221308 -0.255681 -0.963956 0 \r\n-0.214491 -0.258931 -0.956749 0 \r\n-0.232922 -0.237591 -0.96112 0 \r\n0.354367 -0.870195 -0.360852 0 \r\n0.335523 -0.881884 -0.350093 0 \r\n0.357101 -0.879647 -0.338264 0 \r\n-0.0394017 -0.772447 0.469299 0 \r\n-0.0287356 -0.779388 0.486814 0 \r\n-0.0250161 -0.781871 0.462331 0 \r\n0.720242 0.3411 -0.263905 0 \r\n0.730795 0.315619 -0.267221 0 \r\n0.720802 0.330308 -0.246866 0 \r\n-0.189564 0.653467 -0.453483 0 \r\n-0.203414 0.641985 -0.43864 0 \r\n-0.203171 0.639407 -0.459018 0 \r\n0.612185 0.297025 -0.101134 0 \r\n0.616289 0.275649 -0.108846 0 \r\n0.602151 0.275255 -0.0933594 0 \r\n0.686466 -0.11683 -0.365144 0 \r\n0.697263 -0.11343 -0.332503 0 \r\n0.703894 -0.103678 -0.359313 0 \r\n0.283432 -0.884152 -0.00417417 0 \r\n0.285803 -0.881264 -0.015892 0 \r\n0.252738 -0.892682 -0.0102829 0 \r\n0.0909194 -0.868316 0.504314 0 \r\n0.112884 -0.886378 0.503334 0 \r\n0.0848634 -0.866281 0.493621 0 \r\n0.112993 -0.919335 -0.135412 0 \r\n0.110864 -0.922431 -0.159097 0 \r\n0.091898 -0.915125 -0.149707 0 \r\n0.0974032 -0.433075 0.373559 0 \r\n0.111945 -0.425644 0.358617 0 \r\n0.123131 -0.426325 0.375001 0 \r\n0.234623 -0.606664 -0.639961 0 \r\n0.224046 -0.637105 -0.629981 0 \r\n0.249743 -0.630545 -0.627516 0 \r\n0.35485 -0.905734 -0.176845 0 \r\n0.348208 -0.905629 -0.155584 0 \r\n0.366793 -0.896155 -0.156126 0 \r\n0.422526 -0.436617 -0.638664 0 \r\n0.437157 -0.432154 -0.628534 0 \r\n0.436493 -0.429309 -0.640581 0 \r\n0.515252 -0.593855 0.461381 0 \r\n0.526651 -0.606478 0.451933 0 \r\n0.528103 -0.607182 0.461277 0 \r\n-0.0604813 -0.139654 0.150477 0 \r\n-0.0756306 -0.117427 0.144043 0 \r\n-0.0497607 -0.116581 0.158969 0 \r\n0.764628 0.0773203 -0.387524 0 \r\n0.765406 0.0707934 -0.363667 0 \r\n0.765432 0.0862961 -0.374581 0 \r\n0.104154 0.976321 -0.545589 0 \r\n0.111128 0.970302 -0.524233 0 \r\n0.086292 0.964211 -0.53965 0 \r\n0.492683 -0.336847 0.0182694 0 \r\n0.492169 -0.358975 0.0170502 0 \r\n0.472412 -0.350273 0.0454443 0 \r\n-0.23816 -0.380686 -0.357639 0 \r\n-0.239904 -0.407914 -0.357132 0 \r\n-0.234796 -0.41244 -0.375828 0 \r\n0.0452878 -0.577108 -0.63583 0 \r\n0.063685 -0.583782 -0.639554 0 \r\n0.0592894 -0.570048 -0.641803 0 \r\n-0.0823054 -0.695283 0.152178 0 \r\n-0.0782674 -0.713925 0.151882 0 \r\n-0.0800656 -0.701854 0.127897 0 \r\n-0.408867 0.239974 -0.248522 0 \r\n-0.417764 0.225063 -0.265419 0 \r\n-0.409179 0.253536 -0.264257 0 \r\n0.691851 0.434328 -0.479037 0 \r\n0.699193 0.412476 -0.495479 0 \r\n0.702576 0.41315 -0.47503 0 \r\n-0.325789 -0.0272029 -0.931291 0 \r\n-0.322518 -0.0251327 -0.946395 0 \r\n-0.314351 0.010718 -0.937101 0 \r\n-0.659554 -0.692554 0.914119 0 \r\n-0.680076 -0.68022 0.916973 0 \r\n-0.671692 -0.670088 0.91221 0 \r\n0.615911 -0.0487853 -0.964215 0 \r\n0.60144 -0.111197 -0.963025 0 \r\n0.617872 -0.0949806 -0.966806 0 \r\n0.660078 0.112834 -0.786901 0 \r\n0.661734 0.131414 -0.785951 0 \r\n0.65529 0.124488 -0.795574 0 \r\n-0.131851 -0.731506 -0.10279 0 \r\n-0.120381 -0.732433 -0.0801774 0 \r\n-0.118371 -0.74594 -0.0950197 0 \r\n0.0588396 -0.249692 0.542609 0 \r\n0.0461547 -0.23516 0.545375 0 \r\n0.0516201 -0.25747 0.530105 0 \r\n0.644866 0.120643 -0.816056 0 \r\n0.649732 0.104185 -0.806662 0 \r\n0.648767 0.122366 -0.805919 0 \r\n0.577817 -0.763247 -0.00342965 0 \r\n0.587021 -0.787714 0.0044836 0 \r\n0.601149 -0.77109 0.00778855 0 \r\n0.279017 0.20515 0.273959 0 \r\n0.262508 0.181444 0.275027 0 \r\n0.259125 0.2083 0.275966 0 \r\n0.174605 0.984596 -0.513781 0 \r\n0.191802 0.992321 -0.525077 0 \r\n0.194596 0.983382 -0.508456 0 \r\n0.748311 0.0143742 -0.242484 0 \r\n0.751274 0.0204876 -0.256157 0 \r\n0.75394 0.00592764 -0.265565 0 \r\n-0.0287257 0.864969 -0.663193 0 \r\n-0.0280922 0.860056 -0.646969 0 \r\n-0.041284 0.839666 -0.67779 0 \r\n0.432202 0.73552 -0.78317 0 \r\n0.434957 0.765525 -0.761748 0 \r\n0.427055 0.76045 -0.783271 0 \r\n-0.115533 -0.22695 -0.748717 0 \r\n-0.105066 -0.23851 -0.745054 0 \r\n-0.111891 -0.245022 -0.757378 0 \r\n-0.424915 0.0367166 -0.642793 0 \r\n-0.413335 0.0383873 -0.676583 0 \r\n-0.418568 0.0592858 -0.659919 0 \r\n0.568536 -0.021517 -0.0459324 0 \r\n0.575629 -0.0150814 -0.0632411 0 \r\n0.571965 -0.0429738 -0.0644365 0 \r\n0.3437 0.901334 -0.762265 0 \r\n0.33349 0.887051 -0.787697 0 \r\n0.349994 0.884317 -0.773888 0 \r\n0.570855 -0.233182 -0.350482 0 \r\n0.57156 -0.219377 -0.331856 0 \r\n0.568431 -0.220858 -0.360175 0 \r\n-0.00114514 0.721097 -0.0619259 0 \r\n0.0101654 0.723011 -0.0578815 0 \r\n-0.00086235 0.712334 -0.0422959 0 \r\n-0.208456 0.409871 -0.0292421 0 \r\n-0.210088 0.392526 -0.0220906 0 \r\n-0.215476 0.391084 -0.036002 0 \r\n-0.252562 -0.412991 -0.279265 0 \r\n-0.254746 -0.427451 -0.255439 0 \r\n-0.251418 -0.439667 -0.287925 0 \r\n0.056093 0.510234 -0.960366 0 \r\n0.0233371 0.472344 -0.961164 0 \r\n0.0545105 0.482699 -0.964357 0 \r\n-0.28466 0.0210791 0.975118 0 \r\n-0.301826 0.0294374 0.972155 0 \r\n-0.290077 0.0293441 0.971009 0 \r\n0.695758 0.238797 -0.163888 0 \r\n0.706638 0.231663 -0.170639 0 \r\n0.697564 0.210292 -0.158857 0 \r\n-0.226954 0.31644 -0.969419 0 \r\n-0.224418 0.355627 -0.957981 0 \r\n-0.241825 0.3279 -0.956746 0 \r\n0.136741 -0.593942 -0.649047 0 \r\n0.106634 -0.592923 -0.645655 0 \r\n0.119695 -0.610947 -0.641562 0 \r\n0.664519 0.174705 -0.78748 0 \r\n0.672172 0.191868 -0.777743 0 \r\n0.657966 0.198374 -0.799724 0 \r\n-0.466362 -0.0800221 -0.450464 0 \r\n-0.471229 -0.0816709 -0.419502 0 \r\n-0.464766 -0.0938816 -0.436253 0 \r\n-0.39634 0.217317 -0.207588 0 \r\n-0.378728 0.260172 -0.202967 0 \r\n-0.382053 0.228808 -0.195574 0 \r\n0.503884 0.690901 -0.313166 0 \r\n0.483821 0.701864 -0.285069 0 \r\n0.473854 0.71194 -0.306278 0 \r\n0.751045 0.0676081 -0.245685 0 \r\n0.756675 0.0591615 -0.268766 0 \r\n0.719666 -0.113495 -0.916671 0 \r\n0.707105 -0.146174 -0.91925 0 \r\n0.711126 -0.136807 -0.904534 0 \r\n0.181177 0.266564 0.283038 0 \r\n0.176773 0.254356 0.283287 0 \r\n0.17323 0.262092 0.282794 0 \r\n0.113069 -0.890098 0.481958 0 \r\n0.12914 -0.900901 0.49013 0 \r\n0.135382 -0.906656 0.479447 0 \r\n-0.0956137 0.173579 0.185419 0 \r\n-0.109443 0.168261 0.171749 0 \r\n-0.104896 0.179203 0.176366 0 \r\n0.309623 -0.198776 0.179365 0 \r\n0.320462 -0.215293 0.178753 0 \r\n0.291381 -0.210046 0.190453 0 \r\n-0.28816 0.313129 -0.150503 0 \r\n-0.296172 0.279722 -0.148668 0 \r\n-0.299691 0.317295 -0.158633 0 \r\n0.0779804 -0.310931 0.669811 0 \r\n0.0957737 -0.331327 0.651865 0 \r\n0.0864856 -0.32369 0.675295 0 \r\n-0.0423979 -0.596487 0.535253 0 \r\n-0.0511516 -0.590595 0.519294 0 \r\n-0.0341516 -0.595636 0.522173 0 \r\n0.45006 -0.528139 0.429878 0 \r\n0.450916 -0.527987 0.452929 0 \r\n0.438947 -0.517316 0.441666 0 \r\n-0.232121 0.0297696 0.869774 0 \r\n-0.230918 0.0219663 0.894009 0 \r\n-0.240191 0.0366233 0.885546 0 \r\n0.542282 -0.722391 -0.188338 0 \r\n0.52993 -0.73911 -0.172911 0 \r\n0.544083 -0.711302 -0.167239 0 \r\n-0.295235 0.0716963 0.778206 0 \r\n-0.276096 0.0594051 0.760674 0 \r\n-0.275041 0.0749908 0.753161 0 \r\n0.174297 0.126651 0.27054 0 \r\n0.172112 0.101104 0.265678 0 \r\n0.13889 0.115112 0.267401 0 \r\n0.738832 -0.0109256 -0.460244 0 \r\n0.747035 -0.000126651 -0.439175 0 \r\n0.740357 0.0104046 -0.471187 0 \r\n0.46368 -0.45398 0.135311 0 \r\n0.475919 -0.464417 0.145548 0 \r\n0.459659 -0.445998 0.150456 0 \r\n0.423771 -0.643791 -0.93477 0 \r\n0.441168 -0.646567 -0.942086 0 \r\n0.408875 -0.640504 -0.947476 0 \r\n-0.0565112 -0.347657 -0.972789 0 \r\n-0.0241657 -0.344208 -0.973433 0 \r\n-0.0438647 -0.327807 -0.968484 0 \r\n-0.152722 0.693594 -0.280358 0 \r\n-0.171046 0.678117 -0.284478 0 \r\n-0.163081 0.686818 -0.299367 0 \r\n0.507007 0.570127 -0.0393033 0 \r\n0.49427 0.57062 -0.0206399 0 \r\n0.488028 0.586621 -0.026804 0 \r\n0.437303 0.529768 0.106469 0 \r\n0.422713 0.536891 0.119829 0 \r\n0.432063 0.550573 0.0963933 0 \r\n0.16914 -0.441849 -0.972374 0 \r\n0.147971 -0.467624 -0.974922 0 \r\n0.179268 -0.474197 -0.974034 0 \r\n0.708911 0.0788977 -0.169962 0 \r\n0.713093 0.04907 -0.179973 0 \r\n-0.243383 -0.0493928 -0.018756 0 \r\n-0.25133 -0.0550626 -0.0346031 0 \r\n-0.246554 -0.0328711 -0.0214259 0 \r\n0.644866 -0.712964 0.0305429 0 \r\n0.639201 -0.736857 0.0249707 0 \r\n0.65766 -0.722827 0.0393064 0 \r\n0.696386 0.427303 -0.347046 0 \r\n0.683405 0.451647 -0.328229 0 \r\n0.688625 0.446168 -0.351201 0 \r\n0.134162 -0.530653 -0.668895 0 \r\n0.103415 -0.532969 -0.664534 0 \r\n0.116964 -0.545376 -0.66015 0 \r\n0.586108 -0.370606 -0.21488 0 \r\n0.581376 -0.360032 -0.18773 0 \r\n0.582077 -0.3535 -0.206726 0 \r\n0.585652 0.25627 -0.961965 0 \r\n0.598037 0.221301 -0.961985 0 \r\n0.598508 0.275919 -0.963548 0 \r\n-0.530676 -0.589687 0.63381 0 \r\n-0.535669 -0.594812 0.614784 0 \r\n-0.502614 -0.589226 0.622447 0 \r\n0.122569 -0.378792 0.484288 0 \r\n0.110043 -0.359182 0.493969 0 \r\n0.111717 -0.378443 0.471337 0 \r\n-0.207164 -0.439682 -0.439523 0 \r\n-0.194925 -0.452781 -0.45976 0 \r\n-0.196926 -0.429709 -0.453851 0 \r\n0.0666593 -0.873689 -0.0404125 0 \r\n0.071663 -0.882345 -0.0586261 0 \r\n0.0403639 -0.868778 -0.0617251 0 \r\n-0.232433 -0.161783 -0.669244 0 \r\n-0.257566 -0.151801 -0.677112 0 \r\n-0.252602 -0.159701 -0.648973 0 \r\n0.606888 0.165844 -0.963623 0 \r\n0.594727 0.128659 -0.960802 0 \r\n0.616435 0.0928492 -0.964023 0 \r\n0.600299 -0.304832 -0.936642 0 \r\n0.600781 -0.330458 -0.939108 0 \r\n0.598311 -0.320622 -0.927745 0 \r\n0.203952 -0.311554 0.237215 0 \r\n0.186549 -0.314942 0.241811 0 \r\n0.15957 -0.532782 -0.799977 0 \r\n0.171469 -0.503922 -0.792713 0 \r\n0.177564 -0.517545 -0.804695 0 \r\n-0.159488 -0.661574 -0.0734148 0 \r\n-0.162489 -0.674891 -0.101438 0 \r\n-0.171607 -0.654338 -0.0959651 0 \r\n-0.0676651 -0.806355 -0.391948 0 \r\n-0.0544773 -0.799553 -0.41868 0 \r\n-0.0727433 -0.788581 -0.411692 0 \r\n0.475338 -0.539511 0.339186 0 \r\n0.4776 -0.550176 0.364718 0 \r\n0.471141 -0.538335 0.356982 0 \r\n0.179352 -0.939335 0.0337394 0 \r\n0.1591 -0.926788 0.024525 0 \r\n0.159135 -0.935928 0.0350417 0 \r\n0.362217 -0.988124 0.183531 0 \r\n0.378228 -0.983899 0.200705 0 \r\n0.383022 -0.985946 0.180896 0 \r\n-0.253136 -0.648439 0.453713 0 \r\n-0.230838 -0.641348 0.45128 0 \r\n-0.255887 -0.639497 0.456577 0 \r\n-0.145333 -0.760591 0.659181 0 \r\n-0.128654 -0.7529 0.660975 0 \r\n-0.0992256 -0.755466 0.639636 0 \r\n-0.0598784 0.57928 -0.824594 0 \r\n-0.0525385 0.579202 -0.838606 0 \r\n-0.0538106 0.592712 -0.824182 0 \r\n-0.257874 -0.0074432 -0.0461248 0 \r\n-0.26535 -0.00918645 -0.0685104 0 \r\n-0.26022 0.0127882 -0.0537138 0 \r\n-0.332509 0.100434 0.860363 0 \r\n-0.33887 0.0946701 0.865732 0 \r\n-0.334392 0.103132 0.841145 0 \r\n0.660758 -0.860145 0.119642 0 \r\n0.65255 -0.862699 0.0991275 0 \r\n0.652254 -0.877762 0.118138 0 \r\n0.48559 0.490777 0.0610508 0 \r\n0.47995 0.479986 0.0767972 0 \r\n0.469984 0.501175 0.0806107 0 \r\n0.0658837 -0.444859 0.386176 0 \r\n0.0839467 -0.441974 0.380568 0 \r\n0.090526 -0.436641 0.395552 0 \r\n-0.15565 -0.122689 0.936299 0 \r\n-0.148359 -0.11153 0.944844 0 \r\n-0.133305 -0.129674 0.935469 0 \r\n0.384968 -0.492573 -0.970726 0 \r\n0.35884 -0.454669 -0.969968 0 \r\n0.355783 -0.502343 -0.971121 0 \r\n-0.321064 -0.175132 -0.534701 0 \r\n-0.302262 -0.177793 -0.546726 0 \r\n-0.323319 -0.165186 -0.562416 0 \r\n0.295158 -0.998401 0.166887 0 \r\n0.288434 -0.995489 0.18639 0 \r\n0.313322 -0.994034 0.186079 0 \r\n0.583136 0.0291313 -0.0754362 0 \r\n0.578648 0.0437675 -0.0547209 0 \r\n0.582643 0.0486861 -0.0664402 0 \r\n0.0506888 0.91887 -0.742027 0 \r\n0.0564146 0.901625 -0.767984 0 \r\n0.073508 0.916697 -0.758759 0 \r\n-0.126359 -0.0749214 0.951734 0 \r\n-0.137742 -0.0648665 0.950152 0 \r\n-0.124284 -0.0747025 0.939371 0 \r\n0.292226 -0.503762 -0.850714 0 \r\n0.28653 -0.477672 -0.833908 0 \r\n0.305447 -0.491306 -0.839139 0 \r\n0.621073 0.248768 -0.8966 0 \r\n0.626863 0.215683 -0.890828 0 \r\n0.621768 0.243207 -0.87762 0 \r\n0.761837 0.20335 -0.486624 0 \r\n0.758283 0.219428 -0.500754 0 \r\n0.758672 0.20445 -0.511431 0 \r\n-0.127999 -0.200546 -0.724167 0 \r\n-0.114281 -0.211955 -0.723496 0 \r\n-0.122426 -0.209029 -0.737064 0 \r\n-0.222732 0.121348 -0.966626 0 \r\n-0.219507 0.0999465 -0.959569 0 \r\n-0.207377 0.149277 -0.957008 0 \r\n0.601663 -0.560435 -0.338478 0 \r\n0.597632 -0.558527 -0.354693 0 \r\n0.596723 -0.574608 -0.353234 0 \r\n-0.0317489 0.439662 -0.964361 0 \r\n-0.065597 0.421165 -0.966451 0 \r\n-0.0120935 0.426313 -0.967246 0 \r\n0.650262 0.253381 -0.811749 0 \r\n0.649634 0.273205 -0.808475 0 \r\n0.639683 0.267902 -0.823819 0 \r\n-0.380316 0.198037 -0.186944 0 \r\n-0.362705 0.240892 -0.182324 0 \r\n0.0137163 -0.487464 0.438972 0 \r\n0.0105 -0.503249 0.44925 0 \r\n0.0150528 -0.505601 0.433032 0 \r\n-0.0821788 0.17361 0.197322 0 \r\n-0.0867261 0.162668 0.192704 0 \r\n-0.0133947 -0.446029 0.269024 0 \r\n-0.00172675 -0.438325 0.274934 0 \r\n0.00019965 -0.445648 0.286483 0 \r\n-0.330269 -0.0849693 -0.785814 0 \r\n-0.323795 -0.108996 -0.793564 0 \r\n-0.33097 -0.0925929 -0.803674 0 \r\n0.415387 -0.935481 0.352426 0 \r\n0.433785 -0.933637 0.354833 0 \r\n0.423491 -0.936795 0.341391 0 \r\n-0.420297 0.0873287 -0.646959 0 \r\n-0.414869 0.0988314 -0.657572 0 \r\n-0.417753 0.105467 -0.642612 0 \r\n0.0622483 -0.502766 -0.732573 0 \r\n0.0691161 -0.506425 -0.738974 0 \r\n0.0476188 -0.510319 -0.742936 0 \r\n-0.42022 0.218157 -0.480208 0 \r\n-0.421304 0.225223 -0.456857 0 \r\n-0.424963 0.202078 -0.477764 0 \r\n-0.146082 0.321597 0.142098 0 \r\n-0.132903 0.344877 0.148302 0 \r\n0.595286 -0.863078 0.0280655 0 \r\n0.611884 -0.828113 0.0270269 0 \r\n0.593756 -0.830522 0.0167405 0 \r\n0.596496 -0.872521 0.387437 0 \r\n0.613202 -0.875302 0.362404 0 \r\n0.592039 -0.883678 0.375877 0 \r\n0.518541 0.632262 -0.144377 0 \r\n0.538666 0.614763 -0.155336 0 \r\n0.52749 0.611193 -0.126193 0 \r\n-0.176679 -0.189622 -0.631548 0 \r\n-0.177698 -0.181176 -0.651841 0 \r\n-0.188255 -0.186726 -0.625262 0 \r\n0.586424 -0.589208 -0.168375 0 \r\n0.581906 -0.565736 -0.15189 0 \r\n0.588588 -0.551593 -0.162115 0 \r\n0.321982 -0.987648 0.113308 0 \r\n0.29811 -0.986197 0.100721 0 \r\n0.300918 -0.992739 0.118055 0 \r\n0.506716 -0.553135 0.295132 0 \r\n0.494971 -0.542341 0.300543 0 \r\n0.505259 -0.545349 0.287261 0 \r\n0.606576 -0.537029 -0.944925 0 \r\n0.612008 -0.557325 -0.931198 0 \r\n0.618836 -0.526528 -0.93375 0 \r\n0.195197 -0.525582 -0.669788 0 \r\n0.185357 -0.517648 -0.672416 0 \r\n0.754641 -0.0301841 -0.312935 0 \r\n0.751201 -0.0418085 -0.334646 0 \r\n0.747756 -0.0511864 -0.318878 0 \r\n-0.768038 -0.585868 0.816849 0 \r\n-0.76694 -0.592291 0.808532 0 \r\n-0.765822 -0.586975 0.799618 0 \r\n0.29329 0.109037 0.261283 0 \r\n0.30514 0.13242 0.264879 0 \r\n0.317182 0.110852 0.258518 0 \r\n0.575171 -0.70534 0.481403 0 \r\n0.579939 -0.697334 0.471903 0 \r\n0.596423 -0.712548 0.458362 0 \r\n-0.321247 -0.133295 -0.654262 0 \r\n-0.302459 -0.146854 -0.635677 0 \r\n0.43752 0.451771 0.157221 0 \r\n0.421633 0.462049 0.169762 0 \r\n0.434034 0.473049 0.149138 0 \r\n0.331269 -0.91419 -0.226796 0 \r\n0.318957 -0.920017 -0.203281 0 \r\n0.348577 -0.909381 -0.199818 0 \r\n0.205564 0.718679 -0.0179715 0 \r\n0.219258 0.729118 -0.0354006 0 \r\n0.243595 0.710378 -0.0063605 0 \r\n0.582384 -0.211616 -0.260561 0 \r\n0.580967 -0.201321 -0.270274 0 \r\n0.578835 -0.215831 -0.28081 0 \r\n-0.463524 -0.101513 -0.36442 0 \r\n-0.462982 -0.109081 -0.389328 0 \r\n-0.470175 -0.0879622 -0.380383 0 \r\n0.415843 -0.0626236 -0.90766 0 \r\n0.409327 -0.0443139 -0.90564 0 \r\n0.396677 -0.0620658 -0.90652 0 \r\n0.166864 -0.925379 -0.294145 0 \r\n0.165805 -0.919765 -0.312915 0 \r\n0.151256 -0.920323 -0.305956 0 \r\n-0.0460085 -0.382056 0.738587 0 \r\n-0.0621468 -0.371131 0.736554 0 \r\n-0.0658164 -0.348312 0.765277 0 \r\n0.156431 -0.381218 0.298701 0 \r\n0.173586 -0.370908 0.284387 0 \r\n0.179898 -0.380077 0.298779 0 \r\n0.398104 -0.569287 -0.596403 0 \r\n0.377414 -0.583534 -0.601663 0 \r\n0.386457 -0.59368 -0.594624 0 \r\n-0.389365 -0.0159209 -0.7154 0 \r\n-0.38105 0.00536005 -0.737703 0 \r\n-0.39452 0.00497605 -0.710533 0 \r\n-0.273419 -0.0111633 0.804209 0 \r\n-0.294154 0.015211 0.820153 0 \r\n-0.285695 -0.0094978 0.829233 0 \r\n-0.2372 -0.0794427 -0.956479 0 \r\n-0.228804 -0.117053 -0.947798 0 \r\n-0.223829 -0.0761097 -0.946398 0 \r\n-0.0490296 -0.767308 0.350569 0 \r\n-0.0462097 -0.763668 0.383251 0 \r\n-0.0431715 -0.777751 0.361019 0 \r\n-0.101197 -0.0128883 0.698098 0 \r\n-0.117524 -0.00742602 0.711702 0 \r\n-0.11422 -0.00106883 0.70476 0 \r\n-0.0518557 -0.0802941 0.681319 0 \r\n-0.0291081 -0.091341 0.663975 0 \r\n-0.0301743 -0.111792 0.672639 0 \r\n0.454709 -0.78713 -0.408422 0 \r\n0.449838 -0.802049 -0.391897 0 \r\n0.465573 -0.786027 -0.395654 0 \r\n0.36781 -0.502192 -0.622305 0 \r\n0.404321 -0.490984 -0.607131 0 \r\n0.386618 -0.475129 -0.619274 0 \r\n-0.139261 0.27031 0.153154 0 \r\n-0.149166 0.287224 0.144603 0 \r\n-0.12948 0.287883 0.161108 0 \r\n0.103577 -0.206115 -0.938934 0 \r\n0.0915377 -0.202855 -0.933203 0 \r\n0.0902407 -0.216256 -0.940295 0 \r\n-0.246322 -0.414927 -0.122022 0 \r\n-0.246963 -0.434577 -0.135047 0 \r\n-0.249871 -0.412382 -0.144029 0 \r\n-0.363503 -0.190409 -0.312786 0 \r\n-0.353186 -0.199637 -0.328541 0 \r\n-0.373845 -0.190942 -0.336283 0 \r\n0.304658 0.787378 -0.302343 0 \r\n0.32014 0.785572 -0.298294 0 \r\n0.287931 0.792509 -0.284088 0 \r\n-0.0844067 -0.713909 -0.488783 0 \r\n-0.0718307 -0.704244 -0.505969 0 \r\n-0.0897201 -0.688471 -0.505469 0 \r\n-0.0417655 0.605849 -0.844061 0 \r\n-0.0385487 0.587409 -0.855785 0 \r\n-0.0338435 0.600624 -0.861652 0 \r\n0.285108 -0.234955 0.197731 0 \r\n0.305281 -0.244877 0.191314 0 \r\n0.28817 -0.253267 0.199205 0 \r\n-0.380282 0.358366 -0.422511 0 \r\n-0.389997 0.333001 -0.42029 0 \r\n-0.38337 0.349391 -0.445902 0 \r\n0.163852 0.844916 -0.462987 0 \r\n0.141361 0.849212 -0.465872 0 \r\n0.162869 0.85948 -0.464906 0 \r\n-0.101969 -0.0923557 0.611256 0 \r\n-0.103516 -0.0663643 0.617129 0 \r\n-0.118215 -0.073065 0.622971 0 \r\n-0.0913998 -0.807513 -0.153618 0 \r\n-0.103474 -0.790485 -0.144678 0 \r\n-0.0892883 -0.797847 -0.12487 0 \r\n-0.0725804 -0.450993 -0.801965 0 \r\n-0.0620954 -0.464517 -0.790871 0 \r\n-0.0676022 -0.464795 -0.812104 0 \r\n0.132541 -0.88837 -0.380292 0 \r\n0.155883 -0.886711 -0.387389 0 \r\n0.136326 -0.877829 -0.400659 0 \r\n-0.306665 0.237764 -0.848084 0 \r\n-0.312347 0.188522 -0.844666 0 \r\n-0.303577 0.219434 -0.856986 0 \r\n-0.305228 -0.217983 -0.408877 0 \r\n-0.301421 -0.212212 -0.435543 0 \r\n-0.320393 -0.208359 -0.428162 0 \r\n0.0358974 -0.486946 0.660073 0 \r\n0.0205923 -0.48396 0.655803 0 \r\n0.0200201 -0.46807 0.675441 0 \r\n-0.284945 0.493958 -0.244823 0 \r\n-0.282317 0.511479 -0.267222 0 \r\n-0.272281 0.52377 -0.255015 0 \r\n-0.236821 0.59004 -0.589504 0 \r\n-0.223338 0.601335 -0.603118 0 \r\n-0.217049 0.611888 -0.57197 0 \r\n0.297041 -0.0839552 0.197908 0 \r\n0.322293 -0.0760394 0.190234 0 \r\n0.300637 -0.102348 0.189087 0 \r\n0.647797 0.472135 -0.572592 0 \r\n0.662418 0.455455 -0.559201 0 \r\n0.651299 0.476245 -0.540875 0 \r\n0.704381 0.417415 -0.398042 0 \r\n0.696386 0.437063 -0.376917 0 \r\n0.699162 0.432653 -0.404941 0 \r\n0.563949 -0.429204 -0.820065 0 \r\n0.553609 -0.429056 -0.810113 0 \r\n0.5575 -0.411978 -0.818879 0 \r\n0.491168 -0.142703 0.0389588 0 \r\n0.507221 -0.145779 0.0167621 0 \r\n0.490877 -0.165792 0.031689 0 \r\n0.0577972 0.7858 -0.17833 0 \r\n0.0737804 0.790049 -0.187775 0 \r\n0.0801823 0.786454 -0.165758 0 \r\n0.161799 0.540819 0.181 0 \r\n0.185436 0.554656 0.172335 0 \r\n0.189007 0.525752 0.194146 0 \r\n0.136345 -0.376847 0.51616 0 \r\n0.135368 -0.382474 0.496143 0 \r\n0.150819 -0.39979 0.505383 0 \r\n-0.474424 -0.04743 -0.425211 0 \r\n-0.468342 -0.0547104 -0.462675 0 \r\n-0.469943 -0.034329 -0.454172 0 \r\n0.545323 -0.737325 -0.272741 0 \r\n0.533281 -0.755608 -0.288348 0 \r\n0.535315 -0.752083 -0.262347 0 \r\n0.330247 0.306794 -0.949848 0 \r\n0.310438 0.293077 -0.952497 0 \r\n0.327289 0.291629 -0.945293 0 \r\n0.618437 0.527309 -0.511046 0 \r\n0.608693 0.539008 -0.522289 0 \r\n0.614421 0.528139 -0.535278 0 \r\n0.481491 0.246325 -0.92146 0 \r\n0.468194 0.264245 -0.918879 0 \r\n0.472629 0.235305 -0.915213 0 \r\n-0.0511413 -0.76405 0.337941 0 \r\n-0.0541795 -0.749967 0.360173 0 \r\n0.179821 0.796109 -0.226429 0 \r\n0.215057 0.791845 -0.211313 0 \r\n0.179768 0.791721 -0.19921 0 \r\n0.379012 0.766096 -0.455097 0 \r\n0.368884 0.770885 -0.422877 0 \r\n0.360359 0.773162 -0.44317 0 \r\n0.624004 -0.758529 0.426148 0 \r\n0.603111 -0.762697 0.445832 0 \r\n0.597803 -0.744803 0.456406 0 \r\n-0.0875046 0.736018 -0.252184 0 \r\n-0.0567452 0.749124 -0.223477 0 \r\n-0.0824516 0.731037 -0.218953 0 \r\n0.392672 -0.150243 0.133298 0 \r\n0.41339 -0.151612 0.117785 0 \r\n0.393549 -0.17215 0.129106 0 \r\n0.73464 0.252379 -0.63871 0 \r\n0.730286 0.273579 -0.635422 0 \r\n0.727718 0.270575 -0.656785 0 \r\n-0.0906405 -0.80054 -0.363593 0 \r\n-0.113177 -0.773794 -0.372344 0 \r\n-0.117886 -0.778952 -0.350977 0 \r\n-0.00321164 -0.870557 0.272153 0 \r\n-0.0143292 -0.855035 0.274301 0 \r\n-0.0117371 -0.851908 0.2948 0 \r\n0.402639 0.672508 -0.850914 0 \r\n0.405643 0.658069 -0.848392 0 \r\n0.41093 0.674407 -0.838988 0 \r\n0.278545 -0.155218 -0.938626 0 \r\n0.256812 -0.153013 -0.937691 0 \r\n0.258 -0.168002 -0.945126 0 \r\n0.621576 -0.127747 -0.224425 0 \r\n0.632627 -0.120949 -0.222544 0 \r\n0.620149 -0.141755 -0.23862 0 \r\n0.452899 -0.818719 0.541945 0 \r\n0.470362 -0.825306 0.530121 0 \r\n0.442252 -0.838732 0.540036 0 \r\n-0.0448915 -0.293911 0.828164 0 \r\n-0.027686 -0.294693 0.827396 0 \r\n-0.0284165 -0.316829 0.810674 0 \r\n0.256502 -0.132767 -0.927221 0 \r\n0.2788 -0.117013 -0.923874 0 \r\n0.257944 -0.10955 -0.919904 0 \r\n0.56053 -0.520169 -0.965809 0 \r\n0.542262 -0.513381 -0.970282 0 \r\n0.546169 -0.545609 -0.966749 0 \r\n-0.246214 0.261221 -0.0580964 0 \r\n-0.241324 0.259513 -0.036113 0 \r\n-0.247365 0.233629 -0.0452553 0 \r\n-0.355529 -0.708495 0.483608 0 \r\n-0.371031 -0.716866 0.49564 0 \r\n-0.331117 -0.717366 0.487011 0 \r\n0.361828 -0.528876 -0.829467 0 \r\n0.341926 -0.509367 -0.828617 0 \r\n0.475509 0.32869 -0.939212 0 \r\n0.48629 0.311692 -0.938753 0 \r\n0.491655 0.325955 -0.944993 0 \r\n0.0980942 0.763667 -0.104944 0 \r\n0.0850412 0.771549 -0.124155 0 \r\n0.121686 0.772581 -0.116267 0 \r\n0.699354 0.376048 -0.23785 0 \r\n0.700931 0.364183 -0.227872 0 \r\n0.690036 0.384443 -0.222172 0 \r\n-0.0607423 -0.69153 -0.525185 0 \r\n-0.0443928 -0.687194 -0.539094 0 \r\n-0.0607947 -0.674471 -0.536564 0 \r\n0.397466 -0.448043 -0.633839 0 \r\n0.397435 -0.460272 -0.622581 0 \r\n0.423159 -0.451692 -0.615359 0 \r\n-0.0459021 -0.325273 0.210168 0 \r\n-0.041395 -0.344086 0.214521 0 \r\n-0.060651 -0.346857 0.206251 0 \r\n0.590887 -0.366894 -0.963313 0 \r\n0.575882 -0.364377 -0.965291 0 \r\n0.574222 -0.39066 -0.966196 0 \r\n-0.316637 -0.756572 0.615469 0 \r\n-0.343538 -0.750649 0.621648 0 \r\n-0.338396 -0.757631 0.639454 0 \r\n0.130006 0.713663 -0.923414 0 \r\n0.14656 0.687918 -0.933524 0 \r\n0.154929 0.71595 -0.922374 0 \r\n0.0803695 0.301394 0.274622 0 \r\n0.107955 0.303614 0.276749 0 \r\n0.100909 0.280744 0.277886 0 \r\n-0.290993 0.0484059 -0.969875 0 \r\n-0.27993 0.0534594 -0.977651 0 \r\n-0.278214 0.09081 -0.971586 0 \r\n-0.20213 -0.33976 -0.84843 0 \r\n-0.210267 -0.324434 -0.838886 0 \r\n-0.191772 -0.323437 -0.832395 0 \r\n0.122028 -0.742968 0.580972 0 \r\n0.1599 -0.752801 0.582912 0 \r\n0.153426 -0.78782 0.579441 0 \r\n-0.0495734 0.774989 -0.684295 0 \r\n-0.0556821 0.776877 -0.702762 0 \r\n-0.0482203 0.794107 -0.680807 0 \r\n-0.137598 0.045132 -0.901282 0 \r\n-0.117017 0.0628399 -0.897772 0 \r\n-0.128109 0.0835931 -0.899079 0 \r\n-0.291299 -0.223762 -0.402259 0 \r\n-0.285316 -0.229061 -0.385078 0 \r\n-0.280273 -0.227134 -0.399077 0 \r\n-0.274249 -0.223758 -0.213006 0 \r\n-0.277294 -0.198291 -0.202006 0 \r\n-0.272292 -0.213255 -0.194148 0 \r\n0.506467 0.328149 -0.951422 0 \r\n0.504205 0.346417 -0.955491 0 \r\n0.500174 0.327226 -0.948604 0 \r\n0.690793 -0.164118 -0.857359 0 \r\n0.704843 -0.145984 -0.86219 0 \r\n0.697704 -0.163848 -0.872544 0 \r\n-0.417072 -0.740499 0.662682 0 \r\n-0.441658 -0.733669 0.668463 0 \r\n-0.437692 -0.741467 0.683322 0 \r\n0.0780603 0.0997028 -0.907248 0 \r\n0.0176625 0.0809885 -0.904706 0 \r\n0.0398852 0.0569563 -0.905234 0 \r\n-0.36386 -0.244301 -0.912257 0 \r\n-0.368595 -0.236194 -0.929706 0 \r\n-0.365269 -0.218277 -0.910619 0 \r\n-0.0786301 -0.482822 -0.851539 0 \r\n-0.0850895 -0.457496 -0.843912 0 \r\n-0.0716279 -0.476596 -0.830826 0 \r\n0.286893 0.345006 0.264863 0 \r\n0.286312 0.321 0.267468 0 \r\n0.261491 0.315885 0.272999 0 \r\n-0.0708781 0.753394 -0.331441 0 \r\n-0.0803109 0.746956 -0.309039 0 \r\n-0.0955143 0.738182 -0.331654 0 \r\n0.741908 0.295437 -0.523652 0 \r\n0.744736 0.28436 -0.524868 0 \r\n0.74403 0.291738 -0.511461 0 \r\n-0.231382 0.126075 -0.972914 0 \r\n-0.219253 0.175406 -0.970352 0 \r\n0.612496 -0.568231 -0.883193 0 \r\n0.619272 -0.55467 -0.880666 0 \r\n0.622162 -0.560242 -0.894177 0 \r\n0.612081 0.572141 -0.299532 0 \r\n0.603998 0.584043 -0.316494 0 \r\n0.612563 0.570781 -0.322836 0 \r\n0.0902897 -0.86456 -0.411061 0 \r\n0.0694917 -0.866324 -0.399624 0 \r\n0.092187 -0.881252 -0.382126 0 \r\n0.534916 -0.273601 -0.663779 0 \r\n0.532274 -0.28086 -0.686862 0 \r\n0.538355 -0.287352 -0.666623 0 \r\n0.564473 0.0158493 -0.938507 0 \r\n0.561677 0.024078 -0.937201 0 \r\n0.556473 0.0107854 -0.933087 0 \r\n0.343659 -0.696813 -0.563974 0 \r\n0.333915 -0.687352 -0.575904 0 \r\n0.327258 -0.71446 -0.560423 0 \r\n-0.2042 0.198411 0.0733107 0 \r\n-0.207292 0.175126 0.0636241 0 \r\n-0.219379 0.182218 0.0487025 0 \r\n-0.282403 -0.100092 -0.151685 0 \r\n-0.283533 -0.0677786 -0.142687 0 \r\n-0.279288 -0.0883652 -0.140801 0 \r\n0.0222739 -0.168157 0.191355 0 \r\n0.0106479 -0.14937 0.186629 0 \r\n0.0352379 -0.146309 0.194608 0 \r\n0.16793 0.960896 -0.486735 0 \r\n0.145384 0.955204 -0.4865 0 \r\n0.154852 0.969965 -0.496925 0 \r\n-0.0809471 -0.514396 -0.582038 0 \r\n-0.0566502 -0.520641 -0.604362 0 \r\n-0.0744918 -0.501889 -0.595024 0 \r\n-0.319528 -0.726891 0.493144 0 \r\n-0.304026 -0.718519 0.481112 0 \r\n0.395505 -0.522297 -0.805222 0 \r\n0.395739 -0.502424 -0.790821 0 \r\n0.61341 0.563766 -0.381277 0 \r\n0.615677 0.566091 -0.348813 0 \r\n0.602213 0.580359 -0.372262 0 \r\n0.166791 0.748995 -0.908547 0 \r\n0.179559 0.766381 -0.901644 0 \r\n0.151144 0.759081 -0.905362 0 \r\n-0.2643 -0.220966 -0.14387 0 \r\n-0.260708 -0.200808 -0.116296 0 \r\n-0.25965 -0.222997 -0.127405 0 \r\n0.198631 0.293647 -0.96703 0 \r\n0.173099 0.282783 -0.968506 0 \r\n0.203662 0.274808 -0.967401 0 \r\n0.689232 0.455932 -0.401732 0 \r\n0.697227 0.436284 -0.422857 0 \r\n0.420336 0.730394 -0.199779 0 \r\n0.436918 0.722218 -0.188916 0 \r\n0.407407 0.735002 -0.18394 0 \r\n-0.213208 -0.604663 -0.399772 0 \r\n-0.208044 -0.632095 -0.383868 0 \r\n-0.203911 -0.624811 -0.40658 0 \r\n0.56039 -0.833884 0.452415 0 \r\n0.536824 -0.839065 0.472043 0 \r\n0.564955 -0.816913 0.459679 0 \r\n0.0219922 -0.891709 -0.255884 0 \r\n0.0234673 -0.893684 -0.225709 0 \r\n0.0455218 -0.902509 -0.239774 0 \r\n0.514977 0.300756 -0.94834 0 \r\n0.519008 0.319947 -0.955227 0 \r\n0.536477 0.586943 -0.108759 0 \r\n0.555959 0.5698 -0.122607 0 \r\n0.54482 0.563051 -0.0942131 0 \r\n0.123455 -0.344358 0.569013 0 \r\n0.125818 -0.353768 0.579996 0 \r\n0.115719 -0.337317 0.590757 0 \r\n0.327325 0.967293 -0.631869 0 \r\n0.328493 0.96638 -0.611699 0 \r\n0.310899 0.978448 -0.612825 0 \r\n-0.0900993 0.677001 -0.661134 0 \r\n-0.0710286 0.689723 -0.655141 0 \r\n-0.0733177 0.700758 -0.631063 0 \r\n-0.0613457 -0.178188 0.898818 0 \r\n-0.0503962 -0.206096 0.881671 0 \r\n-0.0673257 -0.191297 0.894533 0 \r\n0.0435871 0.281418 -0.958509 0 \r\n0.0350704 0.275078 -0.950948 0 \r\n0.0569215 0.267005 -0.953653 0 \r\n0.532611 0.283437 0.0797961 0 \r\n0.535133 0.264006 0.0804446 0 \r\n0.526116 0.273091 0.0982509 0 \r\n0.47443 0.566428 0.0156867 0 \r\n0.486721 0.563149 -0.00156605 0 \r\n0.48586 0.542463 0.0222613 0 \r\n-0.590398 -0.748794 0.89155 0 \r\n-0.569553 -0.762547 0.878584 0 \r\n-0.596676 -0.756685 0.890351 0 \r\n0.509737 -0.69092 -0.0550207 0 \r\n0.512331 -0.69882 -0.0697976 0 \r\n0.505301 -0.711393 -0.0632578 0 \r\n-0.476045 -0.589645 0.603765 0 \r\n-0.471052 -0.584521 0.62279 0 \r\n0.363764 0.874967 -0.53072 0 \r\n0.372573 0.857431 -0.539328 0 \r\n0.353635 0.867293 -0.521053 0 \r\n0.632694 0.509772 -0.509025 0 \r\n0.626966 0.520642 -0.496036 0 \r\n0.232579 -0.447128 0.459628 0 \r\n0.209969 -0.441503 0.446672 0 \r\n-0.0685952 -0.198799 0.563528 0 \r\n-0.0698493 -0.229841 0.556768 0 \r\n-0.0596299 -0.227206 0.551658 0 \r\n-0.258105 -0.146796 -0.0859555 0 \r\n-0.254345 -0.165743 -0.0813494 0 \r\n-0.259818 -0.183893 -0.104438 0 \r\n-0.614388 -0.665437 0.560561 0 \r\n-0.594993 -0.667998 0.552436 0 \r\n0.195315 0.240638 0.282259 0 \r\n0.185249 0.233671 0.281881 0 \r\n0.181679 0.241722 0.282613 0 \r\n-0.081274 0.042979 -0.898885 0 \r\n-0.096822 0.0520896 -0.898688 0 \r\n-0.110957 0.0152682 -0.900172 0 \r\n0.767451 0.137339 -0.345376 0 \r\n0.768052 0.151928 -0.359637 0 \r\n0.768141 0.131476 -0.370178 0 \r\n-0.472295 0.0351601 -0.405681 0 \r\n-0.472886 0.0385896 -0.389923 0 \r\n-0.474833 0.0197664 -0.403347 0 \r\n-0.0963782 -0.439321 -0.650846 0 \r\n-0.0861764 -0.454232 -0.649574 0 \r\n-0.0866413 -0.444344 -0.669128 0 \r\n0.250858 0.588552 0.143021 0 \r\n0.23518 0.595228 0.137662 0 \r\n0.251011 0.606451 0.126206 0 \r\n0.233172 -0.956151 0.488999 0 \r\n0.249702 -0.951322 0.509659 0 \r\n0.259219 -0.955971 0.491385 0 \r\n0.62488 -0.67729 0.351083 0 \r\n0.618037 -0.66442 0.339451 0 \r\n0.645224 -0.682657 0.320461 0 \r\n-0.587818 -0.603508 0.612366 0 \r\n-0.576076 -0.612985 0.584873 0 \r\n-0.551989 -0.604751 0.598654 0 \r\n0.624331 0.374777 -0.789225 0 \r\n0.626577 0.357733 -0.798813 0 \r\n0.6371 0.350594 -0.788611 0 \r\n-0.0204996 0.196672 0.243451 0 \r\n-0.0222636 0.182072 0.240603 0 \r\n-0.0370509 0.187562 0.233915 0 \r\n-0.152176 -0.541416 0.0574915 0 \r\n-0.147027 -0.56521 0.048713 0 \r\n-0.158329 -0.551769 0.039597 0 \r\n0.664654 0.0834478 -0.954533 0 \r\n0.657163 0.0660046 -0.962391 0 \r\n0.67171 0.0284984 -0.95641 0 \r\n-0.345634 0.090203 0.866946 0 \r\n-0.34375 0.0875051 0.886164 0 \r\n-0.072625 -0.635913 0.293523 0 \r\n-0.07568 -0.655067 0.290452 0 \r\n-0.0757858 -0.639724 0.277481 0 \r\n-0.405095 -0.0315917 -0.673774 0 \r\n-0.419822 -0.0216078 -0.642244 0 \r\n-0.422082 -0.0368946 -0.627787 0 \r\n0.107686 -0.849893 0.551772 0 \r\n0.0890667 -0.831593 0.552981 0 \r\n0.110406 -0.840737 0.55917 0 \r\n0.260916 -0.0363178 0.224145 0 \r\n0.279059 -0.0396274 0.219123 0 \r\n0.260314 -0.0563685 0.21711 0 \r\n-0.357894 -0.150706 -0.56025 0 \r\n-0.374688 -0.148032 -0.548698 0 \r\n-0.358914 -0.159851 -0.53884 0 \r\n-0.400436 0.0819172 -0.705804 0 \r\n-0.400438 0.0991683 -0.70227 0 \r\n-0.406991 0.0782076 -0.690176 0 \r\n-0.195036 -0.117606 0.715354 0 \r\n-0.202402 -0.114348 0.730763 0 \r\n-0.19062 -0.138177 0.717595 0 \r\n0.0431158 -0.861472 -0.0268321 0 \r\n0.0744149 -0.875039 -0.0237331 0 \r\n-0.145651 -0.716897 -0.118097 0 \r\n-0.153906 -0.698961 -0.113567 0 \r\n-0.142115 -0.700063 -0.0834174 0 \r\n0.0228996 -0.873665 -0.109785 0 \r\n0.0509658 -0.885812 -0.0973454 0 \r\n0.0284978 -0.882043 -0.127191 0 \r\n0.271136 0.43245 -0.957486 0 \r\n0.241765 0.433509 -0.955564 0 \r\n0.259068 0.421845 -0.957088 0 \r\n0.0792276 -0.324032 0.496449 0 \r\n0.072254 -0.304926 0.506919 0 \r\n0.0664888 -0.310872 0.497767 0 \r\n0.576038 -0.241932 -0.310568 0 \r\n0.579172 -0.239145 -0.285035 0 \r\n0.577117 -0.228913 -0.296631 0 \r\n0.613954 -0.931408 0.229957 0 \r\n0.606245 -0.930085 0.251457 0 \r\n0.625151 -0.919459 0.248219 0 \r\n-0.739953 -0.595046 0.704174 0 \r\n-0.737926 -0.58638 0.700994 0 \r\n-0.745747 -0.58911 0.721409 0 \r\n0.55708 -0.498401 -0.805853 0 \r\n0.557822 -0.480247 -0.804776 0 \r\n0.751144 0.274637 -0.44415 0 \r\n0.753354 0.266227 -0.442486 0 \r\n0.750874 0.27939 -0.424109 0 \r\n-0.660738 -0.595556 0.648887 0 \r\n-0.68109 -0.591918 0.663492 0 \r\n-0.681285 -0.602206 0.63822 0 \r\n-0.100534 -0.223644 0.871746 0 \r\n-0.100582 -0.236427 0.859226 0 \r\n-0.116967 -0.217064 0.870438 0 \r\n0.630422 0.504682 -0.53915 0 \r\n0.620678 0.516382 -0.550393 0 \r\n0.521265 -0.192281 -0.760499 0 \r\n0.520331 -0.221545 -0.768794 0 \r\n0.513913 -0.205552 -0.752911 0 \r\n-0.273344 0.0874324 0.836164 0 \r\n-0.277491 0.100771 0.816854 0 \r\n-0.258956 0.0903689 0.807873 0 \r\n0.226734 -0.637869 -0.945641 0 \r\n0.232133 -0.629385 -0.937332 0 \r\n0.243484 -0.621053 -0.948012 0 \r\n0.756524 0.254616 -0.431758 0 \r\n0.758024 0.246942 -0.417657 0 \r\n0.754583 0.263306 -0.408343 0 \r\n0.330014 0.153791 0.264044 0 \r\n0.346398 0.163187 0.260775 0 \r\n0.345417 0.143632 0.258844 0 \r\n-0.12967 -0.760085 0.520684 0 \r\n-0.117698 -0.762185 0.529198 0 \r\n-0.107223 -0.760424 0.516273 0 \r\n0.0624688 0.236254 -0.933149 0 \r\n0.0661578 0.24344 -0.940132 0 \r\n0.044716 0.253479 -0.939108 0 \r\n0.476573 -0.622432 -0.860496 0 \r\n0.464644 -0.635015 -0.880762 0 \r\n0.453609 -0.62289 -0.867514 0 \r\n-0.0714302 -0.710927 0.290883 0 \r\n-0.0736845 -0.686875 0.298385 0 \r\n-0.0675607 -0.705886 0.315834 0 \r\n0.0293378 -0.223137 -0.926484 0 \r\n0.0252074 -0.244679 -0.934348 0 \r\n0.0553006 -0.21547 -0.930882 0 \r\n0.667082 -0.846789 0.316197 0 \r\n0.661412 -0.839964 0.33351 0 \r\n0.675379 -0.829435 0.321068 0 \r\n-0.115645 -0.769656 0.615573 0 \r\n-0.127396 -0.768027 0.633202 0 \r\n-0.104153 -0.764785 0.620211 0 \r\n0.458668 -0.644617 -0.527694 0 \r\n0.46795 -0.622216 -0.529916 0 \r\n0.449583 -0.624234 -0.544294 0 \r\n0.375089 0.37664 -0.961416 0 \r\n0.383847 0.400376 -0.961992 0 \r\n0.340737 0.38324 -0.96199 0 \r\n-0.0390126 -0.839561 0.17261 0 \r\n-0.031272 -0.850036 0.169715 0 \r\n-0.0353444 -0.841279 0.158306 0 \r\n0.422422 -0.433191 -0.664017 0 \r\n0.43395 -0.429247 -0.652725 0 \r\n0.434511 -0.428667 -0.666031 0 \r\n0.544695 -0.590446 0.301415 0 \r\n0.564333 -0.611483 0.308606 0 \r\n0.531787 -0.593099 0.331606 0 \r\n0.513124 0.132389 -0.919683 0 \r\n0.521856 0.126433 -0.923044 0 \r\n0.515661 0.155384 -0.922964 0 \r\n0.109149 0.147254 0.270804 0 \r\n0.115411 0.131269 0.269004 0 \r\n0.0834856 0.137863 0.267546 0 \r\n0.653162 -0.174017 -0.962191 0 \r\n0.65958 -0.151162 -0.963912 0 \r\n0.640171 -0.174558 -0.965714 0 \r\n0.504699 -0.511379 -0.972138 0 \r\n0.495235 -0.497938 -0.971887 0 \r\n0.487473 -0.531024 -0.972673 0 \r\n-0.0211212 -0.691866 0.62886 0 \r\n-0.0270431 -0.70522 0.633275 0 \r\n-0.0546943 -0.699126 0.644861 0 \r\n0.610986 0.0284464 -0.125875 0 \r\n0.623879 0.0279951 -0.134998 0 \r\n-0.396695 -0.086496 -0.63131 0 \r\n-0.389026 -0.100683 -0.617864 0 \r\n-0.377742 -0.0966689 -0.644524 0 \r\n-0.0634402 -0.724943 0.337469 0 \r\n-0.0589326 -0.733328 0.357075 0 \r\n-0.0607988 -0.738323 0.327938 0 \r\n0.384584 -0.0564551 -0.906196 0 \r\n0.357635 -0.038655 -0.90599 0 \r\n0.352058 -0.0513539 -0.907686 0 \r\n0.403278 0.287229 -0.920013 0 \r\n0.424052 0.305637 -0.923778 0 \r\n0.395713 0.30819 -0.927817 0 \r\n-0.471602 -0.711876 0.594301 0 \r\n-0.470755 -0.712181 0.574917 0 \r\n-0.484738 -0.709322 0.583197 0 \r\n0.545406 -0.191316 -0.95609 0 \r\n0.564354 -0.185349 -0.960411 0 \r\n0.584453 -0.163358 -0.961295 0 \r\n0.212054 0.414255 -0.955815 0 \r\n0.217864 0.395458 -0.957696 0 \r\n0.235509 0.404106 -0.957047 0 \r\n-0.242032 -0.285743 -0.073488 0 \r\n-0.246761 -0.27455 -0.0867406 0 \r\n-0.242593 -0.253818 -0.0676771 0 \r\n0.257891 -0.330316 0.231467 0 \r\n0.27538 -0.336399 0.228655 0 \r\n0.259908 -0.345649 0.241371 0 \r\n0.513254 -0.58166 0.352089 0 \r\n0.532892 -0.602697 0.35928 0 \r\n-0.721995 -0.601535 0.875497 0 \r\n-0.7162 -0.589516 0.858786 0 \r\n-0.704504 -0.603616 0.876135 0 \r\n0.537774 -0.340967 -0.640167 0 \r\n0.54388 -0.337085 -0.605526 0 \r\n0.542495 -0.324241 -0.639529 0 \r\n0.470569 -0.648686 -0.914353 0 \r\n0.448872 -0.642665 -0.908579 0 \r\n0.463378 -0.641495 -0.893554 0 \r\n0.0433125 -0.92438 0.221624 0 \r\n0.0555482 -0.932726 0.214884 0 \r\n0.0499111 -0.933134 0.197078 0 \r\n-0.00991645 -0.875484 -0.19991 0 \r\n0.00594576 -0.885005 -0.216662 0 \r\n-0.0159245 -0.873363 -0.225066 0 \r\n0.511516 -0.320618 -0.966783 0 \r\n0.516077 -0.275676 -0.963897 0 \r\n0.478565 -0.319541 -0.964834 0 \r\n-0.322089 -0.163375 -0.823751 0 \r\n-0.327911 -0.159355 -0.830853 0 \r\n-0.321115 -0.146635 -0.819366 0 \r\n-0.364912 -0.207183 -0.954463 0 \r\n-0.361592 -0.232375 -0.966957 0 \r\n-0.357436 -0.197741 -0.963609 0 \r\n0.347732 -0.820726 0.578984 0 \r\n0.379126 -0.789252 0.578403 0 \r\n0.372464 -0.808858 0.574398 0 \r\n0.179686 0.950193 -0.759212 0 \r\n0.1531 0.942571 -0.76614 0 \r\n0.1723 0.937922 -0.773578 0 \r\n0.163967 -0.41745 0.487406 0 \r\n0.164944 -0.411822 0.507423 0 \r\n0.484811 -0.316781 0.0307998 0 \r\n0.47293 -0.309539 0.0478568 0 \r\n0.484817 -0.298175 0.0319931 0 \r\n0.342621 0.195603 -0.908041 0 \r\n0.315637 0.203957 -0.913652 0 \r\n0.432742 0.566724 0.0770826 0 \r\n0.418153 0.573848 0.0904423 0 \r\n0.0464313 -0.926226 0.14891 0 \r\n0.0592344 -0.938297 0.145288 0 \r\n-0.494062 -0.661853 0.507012 0 \r\n-0.50907 -0.67399 0.510582 0 \r\n-0.475908 -0.671787 0.501492 0 \r\n0.540202 -0.314602 -0.0645844 0 \r\n0.52913 -0.310008 -0.0410765 0 \r\n0.534075 -0.309333 -0.0537973 0 \r\n-0.325885 -0.100585 -0.75703 0 \r\n-0.335898 -0.0868413 -0.761644 0 \r\n-0.338688 -0.0860534 -0.74297 0 \r\n-0.287535 -0.599533 0.684162 0 \r\n-0.276386 -0.590481 0.661629 0 \r\n-0.24205 -0.598453 0.659191 0 \r\n0.764498 0.0516952 -0.365507 0 \r\n0.765303 0.0606711 -0.352563 0 \r\n0.434003 0.735692 -0.460712 0 \r\n0.433811 0.733534 -0.491019 0 \r\n0.453267 0.72394 -0.464469 0 \r\n0.153993 -0.525581 0.598192 0 \r\n0.13002 -0.526724 0.609419 0 \r\n0.138997 -0.509936 0.610602 0 \r\n-0.207819 0.218796 0.0730202 0 \r\n-0.195733 0.211703 0.0879418 0 \r\n0.184965 -0.988335 0.125443 0 \r\n0.171315 -0.98531 0.133687 0 \r\n0.184159 -0.99257 0.146316 0 \r\n-0.170354 0.190399 0.111144 0 \r\n-0.177655 0.212165 0.10759 0 \r\n-0.155896 0.211246 0.130502 0 \r\n-0.523927 -0.60429 0.587291 0 \r\n-0.0808724 -0.0756379 0.14644 0 \r\n-0.093932 -0.104218 0.13241 0 \r\n-0.109894 -0.0855011 0.126314 0 \r\n0.672276 0.486704 -0.396685 0 \r\n0.678346 0.474688 -0.417138 0 \r\n0.681226 0.471581 -0.399195 0 \r\n0.455778 -0.00610148 0.14244 0 \r\n0.472194 -0.0179692 0.123124 0 \r\n0.453376 -0.0282463 0.13294 0 \r\n-0.25397 0.434613 -0.876089 0 \r\n-0.254909 0.452244 -0.855484 0 \r\n-0.268762 0.434868 -0.853579 0 \r\n-0.260238 -0.205988 -0.496971 0 \r\n-0.27914 -0.193452 -0.520108 0 \r\n-0.281105 -0.200275 -0.495875 0 \r\n0.375924 -0.950402 0.308232 0 \r\n0.373091 -0.957368 0.288252 0 \r\n0.354341 -0.956521 0.296507 0 \r\n0.155539 0.269345 -0.969679 0 \r\n0.142425 0.261464 -0.968726 0 \r\n0.165015 0.256063 -0.967923 0 \r\n0.559041 -0.375016 -0.832747 0 \r\n0.557194 -0.358415 -0.840008 0 \r\n0.570372 -0.370293 -0.853508 0 \r\n0.132836 -0.0482239 0.224986 0 \r\n0.118414 -0.0203606 0.231523 0 \r\n0.147583 -0.0283438 0.232291 0 \r\n-0.369702 0.161438 -0.748861 0 \r\n-0.362334 0.146901 -0.767475 0 \r\n-0.357821 0.17844 -0.765633 0 \r\n0.192736 0.801278 -0.318496 0 \r\n0.197886 0.801117 -0.297476 0 \r\n0.179857 0.801428 -0.304852 0 \r\n0.0688162 -0.203461 -0.928791 0 \r\n0.0646858 -0.225004 -0.936655 0 \r\n-0.100331 0.72366 -0.451797 0 \r\n-0.12336 0.705932 -0.468598 0 \r\n-0.102527 0.717834 -0.479787 0 \r\n0.455498 0.516916 0.0896954 0 \r\n0.461138 0.527707 0.0739489 0 \r\n-0.041381 0.813486 -0.661954 0 \r\n-0.0331928 0.838421 -0.644938 0 \r\n-0.0339233 0.817154 -0.645326 0 \r\n-0.348628 -0.127422 -0.622795 0 \r\n-0.37187 -0.124871 -0.600593 0 \r\n-0.350425 -0.141437 -0.59231 0 \r\n-0.140845 -0.561719 -0.517651 0 \r\n-0.138578 -0.590601 -0.51116 0 \r\n-0.115969 -0.584908 -0.534007 0 \r\n-0.0354061 -0.821792 0.273564 0 \r\n-0.026901 -0.841639 0.261984 0 \r\n-0.0394525 -0.827044 0.2386 0 \r\n0.418417 -0.82656 -0.0712954 0 \r\n0.402276 -0.835612 -0.0544573 0 \r\n0.425489 -0.816597 -0.0592145 0 \r\n0.0599785 0.868809 -0.513858 0 \r\n0.0422479 0.868549 -0.531743 0 \r\n0.054385 0.883958 -0.5208 0 \r\n-0.209242 -0.141946 0.833711 0 \r\n-0.199331 -0.154869 0.841701 0 \r\n-0.192359 -0.170723 0.820366 0 \r\n0.200812 0.152712 0.275572 0 \r\n0.173088 0.14054 0.273336 0 \r\n0.168799 0.152831 0.274498 0 \r\n-0.15907 0.623271 -0.696192 0 \r\n-0.143358 0.624678 -0.708232 0 \r\n-0.142743 0.633285 -0.692202 0 \r\n0.495899 0.354361 -0.956018 0 \r\n0.489605 0.353437 -0.9532 0 \r\n0.608314 0.315838 -0.901757 0 \r\n0.612725 0.290887 -0.899922 0 \r\n0.611567 0.301243 -0.885229 0 \r\n-0.115407 -0.482935 -0.922732 0 \r\n-0.110068 -0.499969 -0.919307 0 \r\n-0.116069 -0.501395 -0.934625 0 \r\n0.672048 -0.836886 0.120913 0 \r\n0.669656 -0.825365 0.100378 0 \r\n0.569667 0.444565 -0.0478432 0 \r\n0.557339 0.464332 -0.0377572 0 \r\n0.572739 0.460809 -0.059945 0 \r\n-0.309747 -0.143885 -0.80038 0 \r\n-0.319894 -0.133638 -0.811845 0 \r\n-0.314349 -0.126868 -0.799959 0 \r\n-0.181942 0.533892 -0.0553456 0 \r\n-0.187651 0.540949 -0.0724458 0 \r\n-0.172396 0.55145 -0.0506024 0 \r\n0.70393 -0.000937045 -0.922507 0 \r\n0.692635 0.0311563 -0.919854 0 \r\n0.69139 0.0305856 -0.930387 0 \r\n-0.430466 0.187992 -0.464304 0 \r\n-0.429383 0.180926 -0.487655 0 \r\n-0.144035 0.484547 -0.889962 0 \r\n-0.11329 0.483945 -0.902981 0 \r\n-0.121974 0.493714 -0.886256 0 \r\n-0.0566913 0.238101 0.22001 0 \r\n-0.0581222 0.257324 0.218884 0 \r\n-0.0372792 0.249162 0.235057 0 \r\n0.563275 0.628751 -0.278161 0 \r\n0.551108 0.641747 -0.287236 0 \r\n0.561091 0.63647 -0.316571 0 \r\n-0.0850163 -0.650357 0.220457 0 \r\n-0.0837831 -0.637275 0.220877 0 \r\n-0.083327 -0.644721 0.231642 0 \r\n0.298364 0.82202 -0.492377 0 \r\n0.275333 0.822585 -0.481432 0 \r\n0.282239 0.830295 -0.485659 0 \r\n0.519081 -0.631397 0.0060172 0 \r\n0.521016 -0.654917 -0.00705737 0 \r\n0.52828 -0.635 0.0173495 0 \r\n0.229064 -0.745192 -0.567227 0 \r\n0.219662 -0.74341 -0.570904 0 \r\n0.219862 -0.752979 -0.562095 0 \r\n0.65573 -0.896805 0.168257 0 \r\n0.662797 -0.880334 0.160599 0 \r\n0.653396 -0.891679 0.14631 0 \r\n-0.041669 0.768254 -0.287914 0 \r\n-0.0349791 0.771533 -0.309271 0 \r\n-0.0209733 0.777619 -0.288359 0 \r\n0.640005 0.15639 -0.962218 0 \r\n0.62925 0.16093 -0.965383 0 \r\n0.639351 0.125494 -0.963679 0 \r\n0.520741 0.0281144 0.0868004 0 \r\n0.511765 0.0059551 0.0890573 0 \r\n0.508787 0.0232633 0.101447 0 \r\n-0.0447939 -0.584381 0.469994 0 \r\n-0.0342465 -0.586285 0.487837 0 \r\n-0.0534527 -0.587839 0.488371 0 \r\n0.66688 -0.741991 0.358684 0 \r\n0.654813 -0.743225 0.383743 0 \r\n0.652981 -0.729957 0.377108 0 \r\n-0.131571 0.39305 -0.972842 0 \r\n-0.114745 0.406363 -0.972719 0 \r\n-0.142356 0.40104 -0.973446 0 \r\n0.0750546 0.796592 -0.261625 0 \r\n0.0612994 0.796084 -0.29024 0 \r\n0.0857099 0.79803 -0.289972 0 \r\n-0.119459 -0.0857774 0.900753 0 \r\n-0.102826 -0.107197 0.877084 0 \r\n-0.0890706 -0.115229 0.890055 0 \r\n0.53849 0.650754 -0.423088 0 \r\n0.525867 0.66223 -0.449952 0 \r\n-0.26871 -0.209312 -0.160123 0 \r\n-0.265588 -0.225302 -0.153169 0 \r\n-0.266365 -0.227165 -0.161934 0 \r\n0.506888 -0.501912 -0.784362 0 \r\n0.522863 -0.517717 -0.793832 0 \r\n0.725524 -0.0792847 -0.284262 0 \r\n0.725866 -0.0852136 -0.311296 0 \r\n0.714348 -0.0943481 -0.299637 0 \r\n0.103588 -0.898968 0.388226 0 \r\n0.116831 -0.903143 0.398665 0 \r\n0.125075 -0.910244 0.388864 0 \r\n0.23428 0.333489 -0.963738 0 \r\n0.257662 0.336545 -0.963903 0 \r\n0.248039 0.348685 -0.962564 0 \r\n0.212112 -0.640054 -0.92114 0 \r\n0.196402 -0.661007 -0.923096 0 \r\n0.19313 -0.65486 -0.909275 0 \r\n0.265538 0.739022 -0.0603289 0 \r\n0.268791 0.747615 -0.0830532 0 \r\n0.292045 0.738986 -0.0713463 0 \r\n0.35294 0.0532103 0.229204 0 \r\n0.360246 0.0853107 0.236607 0 \r\n0.372999 0.0741506 0.227098 0 \r\n-0.0227799 0.599778 -0.87911 0 \r\n-0.0259966 0.618218 -0.867384 0 \r\n0.522043 -0.77105 -0.256721 0 \r\n0.534086 -0.752767 -0.241114 0 \r\n-0.208392 -0.161973 -0.729294 0 \r\n-0.231935 -0.156415 -0.719481 0 \r\n-0.213854 -0.15944 -0.707196 0 \r\n0.677967 -0.0744645 -0.818424 0 \r\n0.683986 -0.0430522 -0.83132 0 \r\n0.690668 -0.0731876 -0.837883 0 \r\n0.0154342 -0.892759 0.145963 0 \r\n0.0383639 -0.913014 0.136437 0 \r\n0.0224233 -0.889758 0.117504 0 \r\n0.0303428 0.789863 -0.2533 0 \r\n0.0510198 0.792022 -0.231121 0 \r\n0.0307184 0.787238 -0.222527 0 \r\n0.55681 0.635002 -0.391598 0 \r\n0.567783 0.622545 -0.385181 0 \r\n0.566435 0.628366 -0.361329 0 \r\n-0.307234 -0.152777 -0.612411 0 \r\n-0.28251 -0.155643 -0.633574 0 \r\n0.682668 0.365973 -0.688815 0 \r\n0.692801 0.35267 -0.679891 0 \r\n0.687758 0.372017 -0.664934 0 \r\n0.0119108 0.413046 -0.966524 0 \r\n-0.0219373 0.394549 -0.968614 0 \r\n0.5426 0.0691125 -0.929047 0 \r\n0.548405 0.0582326 -0.931653 0 \r\n0.548805 0.0803348 -0.933398 0 \r\n0.619708 0.111719 -0.123576 0 \r\n0.633888 0.126085 -0.128698 0 \r\n0.632969 0.105851 -0.129012 0 \r\n0.603977 -0.57024 -0.305564 0 \r\n0.602809 -0.583323 -0.290123 0 \r\n0.605315 -0.56369 -0.28348 0 \r\n0.397943 -0.469377 0.353926 0 \r\n0.3904 -0.451139 0.33158 0 \r\n0.411381 -0.467095 0.332317 0 \r\n0.578508 -0.389078 -0.410125 0 \r\n0.574575 -0.405187 -0.433307 0 \r\n0.57912 -0.409343 -0.41104 0 \r\n-0.0828263 -0.690708 0.173144 0 \r\n-0.0846246 -0.678636 0.149159 0 \r\n-0.0952778 -0.351386 -0.740353 0 \r\n-0.0994149 -0.335537 -0.726176 0 \r\n-0.0996519 -0.358701 -0.722183 0 \r\n-0.199637 0.595716 -0.700774 0 \r\n-0.190508 0.609439 -0.68292 0 \r\n-0.205788 0.597817 -0.684098 0 \r\n-0.183506 -0.120462 0.695919 0 \r\n-0.195287 -0.0966325 0.709087 0 \r\n-0.132665 -0.324982 0.142134 0 \r\n-0.126039 -0.299173 0.142507 0 \r\n-0.117031 -0.310823 0.15484 0 \r\n0.649712 -0.780918 0.386374 0 \r\n0.63989 -0.767838 0.405747 0 \r\n0.66029 -0.772333 0.376547 0 \r\n-0.21737 -0.0265398 -0.942504 0 \r\n-0.208234 0.016516 -0.938451 0 \r\n-0.223088 0.0045564 -0.951026 0 \r\n0.346144 -0.609042 -0.919522 0 \r\n0.337147 -0.595633 -0.908061 0 \r\n0.352826 -0.606564 -0.907736 0 \r\n-0.0337817 0.584395 0.0921757 0 \r\n-0.022632 0.603477 0.0809012 0 \r\n-0.0145844 0.581791 0.105753 0 \r\n-0.298542 0.110183 0.781682 0 \r\n-0.284456 0.101856 0.766116 0 \r\n-0.27262 0.105488 0.753623 0 \r\n-0.443626 -0.796764 0.769889 0 \r\n-0.454053 -0.794785 0.782647 0 \r\n-0.430606 -0.795702 0.773967 0 \r\n0.182723 0.660015 0.0652844 0 \r\n0.176936 0.67006 0.0517896 0 \r\n0.199287 0.673541 0.0486092 0 \r\n-0.384991 0.270891 -0.215359 0 \r\n-0.370705 0.282384 -0.203346 0 \r\n0.575524 -0.626741 -0.163135 0 \r\n0.579643 -0.628449 -0.180358 0 \r\n0.575426 -0.651839 -0.185344 0 \r\n0.54853 -0.617621 -0.100104 0 \r\n0.550921 -0.595949 -0.0925546 0 \r\n0.55944 -0.621024 -0.121386 0 \r\n-0.159384 0.639132 -0.65936 0 \r\n-0.178485 0.628963 -0.6524 0 \r\n-0.177556 0.62171 -0.673203 0 \r\n0.403937 -0.582538 -0.842887 0 \r\n0.42263 -0.600147 -0.84819 0 \r\n0.399714 -0.592461 -0.855255 0 \r\n-0.226998 -0.396603 -0.0357732 0 \r\n-0.220643 -0.36952 -0.0168856 0 \r\n-0.217494 -0.388544 -0.0107411 0 \r\n-0.210382 -0.526339 -0.439883 0 \r\n-0.209418 -0.550339 -0.439807 0 \r\n-0.199174 -0.543655 -0.456617 0 \r\n0.0122547 0.77933 -0.562791 0 \r\n0.00306825 0.764705 -0.568931 0 \r\n0.307491 -0.826264 -0.453101 0 \r\n0.330325 -0.834297 -0.43474 0 \r\n0.330999 -0.818223 -0.454086 0 \r\n-0.307529 -0.316933 -0.887482 0 \r\n-0.284308 -0.32567 -0.874125 0 \r\n-0.29279 -0.327039 -0.889426 0 \r\n0.151904 -0.841483 0.56978 0 \r\n0.141933 -0.847875 0.566637 0 \r\n0.135345 -0.829726 0.569864 0 \r\n-0.543096 -0.715362 0.721492 0 \r\n-0.549203 -0.704471 0.700401 0 \r\n-0.57197 -0.704178 0.721834 0 \r\n-0.101455 -0.814537 -0.283819 0 \r\n-0.0791468 -0.832215 -0.289641 0 \r\n-0.0933788 -0.81694 -0.301243 0 \r\n-0.193759 0.411759 0.010529 0 \r\n-0.201948 0.397839 -0.0007557 0 \r\n-0.194878 0.425233 -0.00404603 0 \r\n0.539299 -0.320082 -0.0622627 0 \r\n0.544197 -0.332294 -0.0712944 0 \r\n0.53835 -0.338448 -0.056252 0 \r\n-0.418324 -0.641452 0.773142 0 \r\n-0.389301 -0.647125 0.766672 0 \r\n-0.424573 -0.65497 0.784323 0 \r\n-0.230132 -0.243629 -0.409256 0 \r\n-0.231594 -0.237404 -0.428708 0 \r\n-0.246404 -0.237356 -0.402797 0 \r\n0.213773 0.376219 -0.959707 0 \r\n0.205442 0.356379 -0.961443 0 \r\n0.232988 0.365469 -0.960662 0 \r\n0.341703 -0.36096 0.187537 0 \r\n0.344079 -0.37083 0.199459 0 \r\n0.318137 -0.358311 0.214391 0 \r\n-0.4009 0.155295 -0.659413 0 \r\n-0.393906 0.154222 -0.688332 0 \r\n-0.395673 0.176775 -0.660895 0 \r\n-0.117048 0.23696 -0.907806 0 \r\n-0.104673 0.244457 -0.90823 0 \r\n-0.109674 0.268287 -0.913411 0 \r\n-0.0242144 0.861939 -0.735094 0 \r\n-0.0342408 0.847359 -0.730838 0 \r\n-0.0312715 0.837461 -0.750368 0 \r\n-0.0692599 -0.328319 0.55531 0 \r\n-0.053944 -0.363386 0.537618 0 \r\n-0.0505135 -0.342296 0.528202 0 \r\n-0.0225723 0.665702 0.00735575 0 \r\n-0.0369772 0.644912 0.0229648 0 \r\n-0.0487443 0.662879 -0.00842553 0 \r\n0.478265 -0.812198 -0.205195 0 \r\n0.458373 -0.82444 -0.176987 0 \r\n0.474368 -0.807189 -0.172805 0 \r\n0.401042 0.61304 0.0591207 0 \r\n0.402847 0.587005 0.0901158 0 \r\n0.385056 0.610046 0.0781049 0 \r\n-0.412821 0.264095 -0.407318 0 \r\n-0.40854 0.2783 -0.37339 0 \r\n-0.416211 0.254169 -0.373776 0 \r\n-0.15746 0.206577 -0.922797 0 \r\n-0.151587 0.238293 -0.925783 0 \r\n-0.165773 0.215667 -0.931264 0 \r\n0.259104 -0.792029 -0.505358 0 \r\n0.262576 -0.773142 -0.527169 0 \r\n0.231198 -0.792889 -0.512745 0 \r\n-0.19664 -0.675651 -0.282955 0 \r\n-0.18854 -0.69198 -0.306992 0 \r\n-0.195107 -0.675053 -0.314692 0 \r\n0.431351 -0.417607 0.113541 0 \r\n0.445121 -0.431996 0.100529 0 \r\n0.431097 -0.422145 0.125194 0 \r\n0.621523 -0.503771 -0.866151 0 \r\n0.625036 -0.486233 -0.874147 0 \r\n0.62778 -0.505155 -0.877697 0 \r\n-0.390815 -0.174004 -0.442547 0 \r\n-0.405761 -0.170028 -0.418518 0 \r\n-0.383053 -0.184076 -0.413886 0 \r\n0.616647 -0.0492667 -0.673285 0 \r\n0.633151 -0.0391967 -0.652848 0 \r\n0.641655 -0.0312757 -0.670737 0 \r\n-0.427238 -0.0559648 -0.225966 0 \r\n-0.436249 -0.0313712 -0.233422 0 \r\n-0.427517 -0.0237283 -0.217338 0 \r\n-0.110636 0.728578 -0.330269 0 \r\n-0.130158 0.712645 -0.331957 0 \r\n-0.135846 0.709481 -0.352975 0 \r\n0.551228 -0.293844 -0.840654 0 \r\n0.559933 -0.273343 -0.846101 0 \r\n0.564852 -0.291721 -0.857976 0 \r\n-0.0693845 -0.224082 -0.911177 0 \r\n-0.0959671 -0.21533 -0.912405 0 \r\n-0.0991724 -0.235815 -0.915159 0 \r\n0.561671 -0.800118 0.469797 0 \r\n0.555866 -0.768738 0.487815 0 \r\n0.582716 -0.780352 0.458071 0 \r\n0.0478678 -0.697869 -0.880708 0 \r\n0.0662978 -0.696384 -0.874575 0 \r\n0.0629819 -0.714491 -0.891567 0 \r\n0.0673551 0.759169 -0.887591 0 \r\n0.0495001 0.728574 -0.896366 0 \r\n0.0739968 0.733741 -0.901525 0 \r\n0.563586 -0.272332 -0.461663 0 \r\n0.56563 -0.282802 -0.460779 0 \r\n0.56563 -0.263663 -0.441034 0 \r\n0.260016 -0.0746666 -0.913635 0 \r\n0.302676 -0.0636746 -0.912019 0 \r\n0.28245 -0.0445459 -0.909096 0 \r\n0.0376847 0.789043 -0.502523 0 \r\n0.0208745 0.778298 -0.529441 0 \r\n0.0358595 0.789754 -0.518858 0 \r\n0.359784 0.711617 -0.06007 0 \r\n0.343529 0.728615 -0.0845346 0 \r\n0.370212 0.719727 -0.0906314 0 \r\n-0.34007 0.332155 -0.196395 0 \r\n-0.349936 0.294212 -0.186034 0 \r\n-0.354576 0.309606 -0.201315 0 \r\n0.743662 0.258434 -0.572013 0 \r\n0.738697 0.26618 -0.594427 0 \r\n0.742173 0.247637 -0.594932 0 \r\n0.582741 -0.960363 0.100264 0 \r\n0.594591 -0.947729 0.0920508 0 \r\n0.5805 -0.953573 0.0845227 0 \r\n-0.114485 0.566781 -0.799775 0 \r\n-0.134685 0.564888 -0.793067 0 \r\n-0.128281 0.551039 -0.812304 0 \r\n0.458829 -0.868188 0.0111765 0 \r\n0.452437 -0.85187 0.00428015 0 \r\n0.435486 -0.865849 0.0111817 0 \r\n-0.0915949 -0.268425 0.164293 0 \r\n-0.104756 -0.267677 0.154217 0 \r\n-0.0859461 -0.251087 0.163297 0 \r\n0.0504931 -0.34243 0.758641 0 \r\n0.0270284 -0.310259 0.790538 0 \r\n0.0508952 -0.324665 0.763906 0 \r\n-0.132078 -0.753799 -0.141744 0 \r\n-0.115602 -0.762916 -0.116781 0 \r\n-0.117839 -0.771703 -0.140893 0 \r\n0.391059 0.68345 -0.858839 0 \r\n0.404673 0.707778 -0.83968 0 \r\n0.387806 0.702383 -0.857009 0 \r\n-0.0866866 0.554371 0.0717698 0 \r\n-0.0749862 0.537233 0.0989408 0 \r\n-0.0966227 0.53094 0.0803199 0 \r\n0.480111 -0.81299 -0.279615 0 \r\n0.466331 -0.820774 -0.301745 0 \r\n0.456042 -0.833411 -0.27826 0 \r\n0.0821525 -0.193321 -0.92743 0 \r\n-0.44276 -0.0473543 -0.566263 0 \r\n-0.450335 -0.03426 -0.543947 0 \r\n-0.456286 -0.0547035 -0.513952 0 \r\n0.179722 -0.427595 0.39428 0 \r\n0.203157 -0.431191 0.404647 0 \r\n0.185104 -0.434234 0.415439 0 \r\n0.618379 -0.761275 0.0159544 0 \r\n0.631174 -0.771139 0.024718 0 \r\n-0.23932 0.491737 -0.144047 0 \r\n-0.226022 0.496635 -0.120473 0 \r\n-0.237797 0.468125 -0.124518 0 \r\n0.760171 0.022646 -0.384203 0 \r\n0.757204 0.0203107 -0.404359 0 \r\n0.757722 0.00218272 -0.385179 0 \r\n0.115852 -0.727034 -0.574293 0 \r\n0.115306 -0.750393 -0.555243 0 \r\n0.146056 -0.732636 -0.57557 0 \r\n0.321141 -0.945923 0.0573203 0 \r\n0.333313 -0.961133 0.0735597 0 \r\n0.352141 -0.948853 0.0666801 0 \r\n0.673469 0.11423 -0.764672 0 \r\n0.666232 0.0983021 -0.773026 0 \r\n0.673178 0.0927711 -0.76042 0 \r\n-0.173645 -0.170406 0.063733 0 \r\n-0.179536 -0.147723 0.0589442 0 \r\n-0.164541 -0.146212 0.0751526 0 \r\n0.646282 0.465656 -0.207976 0 \r\n0.647486 0.448207 -0.196523 0 \r\n0.6392 0.453924 -0.177764 0 \r\n-0.0464106 0.764456 -0.677982 0 \r\n-0.0538724 0.747226 -0.699936 0 \r\n-0.718544 -0.569044 0.804489 0 \r\n-0.731131 -0.572992 0.814913 0 \r\n-0.733911 -0.569139 0.795727 0 \r\n-0.340783 0.423858 -0.641092 0 \r\n-0.336973 0.42571 -0.660617 0 \r\n-0.331972 0.446049 -0.645299 0 \r\n0.430256 -0.408468 0.101379 0 \r\n0.433286 -0.395507 0.0916668 0 \r\n0.448405 -0.414496 0.0791631 0 \r\n-0.0322392 0.51979 -0.908029 0 \r\n-0.0327092 0.509004 -0.914619 0 \r\n-0.0196783 0.516963 -0.919909 0 \r\n-0.284797 -0.347744 -0.954476 0 \r\n-0.272982 -0.350444 -0.967156 0 \r\n-0.305748 -0.332013 -0.963609 0 \r\n-0.171614 0.580203 -0.0816426 0 \r\n-0.171839 0.595114 -0.104381 0 \r\n-0.154545 0.605159 -0.0799891 0 \r\n0.138917 -0.52184 -0.781147 0 \r\n0.143786 -0.534427 -0.79026 0 \r\n0.129228 -0.537107 -0.783413 0 \r\n-0.328198 -0.00621875 -0.862079 0 \r\n-0.331418 -0.019806 -0.844059 0 \r\n-0.332569 -0.0432955 -0.857374 0 \r\n-0.164005 -0.662754 0.686196 0 \r\n-0.156939 -0.676203 0.689268 0 \r\n-0.201418 -0.668525 0.705943 0 \r\n-0.35265 -0.163544 -0.251878 0 \r\n-0.362806 -0.144837 -0.239619 0 \r\n-0.345408 -0.151669 -0.236348 0 \r\n-0.330996 0.105903 -0.823367 0 \r\n-0.325224 0.0905401 -0.834873 0 \r\n-0.323811 0.127476 -0.832931 0 \r\n-0.309276 0.424699 -0.766152 0 \r\n-0.316357 0.424211 -0.747414 0 \r\n-0.317299 0.406052 -0.760646 0 \r\n0.312934 -0.501383 0.571908 0 \r\n0.315746 -0.518759 0.579322 0 \r\n0.287931 -0.50927 0.576894 0 \r\n0.065876 -0.501253 -0.720276 0 \r\n0.0748262 -0.499449 -0.707514 0 \r\n0.0926958 -0.497068 -0.715849 0 \r\n-0.33 0.175218 -0.815444 0 \r\n-0.322508 0.174845 -0.828595 0 \r\n-0.322926 0.207226 -0.822614 0 \r\n-0.417143 -0.164247 -0.397309 0 \r\n-0.424905 -0.154175 -0.42597 0 \r\n0.0430163 -0.274688 0.74155 0 \r\n0.0275847 -0.254827 0.76895 0 \r\n0.0228591 -0.249974 0.761369 0 \r\n-0.15463 -0.391628 -0.537839 0 \r\n-0.169344 -0.38452 -0.512085 0 \r\n-0.160731 -0.411393 -0.518857 0 \r\n0.553454 0.491602 -0.835557 0 \r\n0.541173 0.50903 -0.82897 0 \r\n0.54593 0.502612 -0.844878 0 \r\n-0.0558347 -0.543132 0.274835 0 \r\n-0.0513047 -0.542974 0.292662 0 \r\n-0.0582259 -0.555537 0.282057 0 \r\n-0.217622 -0.564779 -0.160214 0 \r\n-0.225558 -0.564525 -0.197281 0 \r\n-0.225024 -0.537153 -0.139415 0 \r\n0.207569 0.274502 0.282337 0 \r\n0.218015 0.272085 0.28158 0 \r\n0.210328 0.262689 0.282534 0 \r\n0.520238 -0.122976 -0.701609 0 \r\n0.512491 -0.142704 -0.707341 0 \r\n0.507194 -0.137653 -0.687441 0 \r\n-0.338261 -0.0722256 -0.859406 0 \r\n-0.335042 -0.0586384 -0.877426 0 \r\n0.409265 -0.437626 -0.70296 0 \r\n0.423616 -0.440814 -0.714409 0 \r\n0.409617 -0.443152 -0.717812 0 \r\n0.0550148 -0.565617 -0.983325 0 \r\n0.0849913 -0.560179 -0.982135 0 \r\n0.0582622 -0.529586 -0.98229 0 \r\n0.559108 0.0241983 0.00114327 0 \r\n0.548447 -0.00502229 0.0140186 0 \r\n0.550797 0.029536 0.0229238 0 \r\n-0.325408 -0.216935 -0.349569 0 \r\n-0.309799 -0.222524 -0.348741 0 \r\n-0.318632 -0.22042 -0.367285 0 \r\n0.601803 -0.369619 -0.94114 0 \r\n0.60379 -0.353829 -0.950037 0 \r\n0.238841 -0.506616 0.576007 0 \r\n0.261114 -0.492538 0.570315 0 \r\n0.262846 -0.505974 0.575171 0 \r\n0.573002 -0.121334 -0.951449 0 \r\n0.567586 -0.114603 -0.947158 0 \r\n0.562196 -0.134677 -0.947866 0 \r\n0.133395 -0.929282 -0.215179 0 \r\n0.115695 -0.924529 -0.232933 0 \r\n0.107413 -0.924178 -0.207199 0 \r\n0.583421 -0.106203 -0.954543 0 \r\n0.593964 -0.0880747 -0.959389 0 \r\n0.588936 -0.0831302 -0.955588 0 \r\n-0.391338 0.163862 -0.188432 0 \r\n0.371987 -0.444165 -0.734837 0 \r\n0.38543 -0.451834 -0.744637 0 \r\n0.369559 -0.450309 -0.746492 0 \r\n0.49742 0.487109 0.0439552 0 \r\n0.487453 0.508298 0.0477687 0 \r\n-0.0276211 -0.0587661 0.178769 0 \r\n-0.0349568 -0.0849603 0.169046 0 \r\n-0.0575742 -0.0681605 0.162259 0 \r\n0.705071 -0.0730686 -0.85682 0 \r\n0.699053 -0.104481 -0.843924 0 \r\n-0.206708 -0.649232 -0.315334 0 \r\n-0.21285 -0.630388 -0.31331 0 \r\n-0.209349 -0.63988 -0.288631 0 \r\n0.429334 -0.932392 0.381543 0 \r\n0.408534 -0.93376 0.374227 0 \r\n0.412186 -0.933829 0.389902 0 \r\n0.641567 0.134163 -0.823599 0 \r\n0.642532 0.115984 -0.824342 0 \r\n0.422624 -0.636468 -0.901379 0 \r\n0.39358 -0.625246 -0.901062 0 \r\n0.412637 -0.624251 -0.887462 0 \r\n0.0121157 -0.812589 0.469185 0 \r\n-0.00270159 -0.802561 0.462154 0 \r\n0.0004674 -0.798841 0.486876 0 \r\n-0.439641 0.156821 -0.457412 0 \r\n-0.444942 0.125395 -0.475065 0 \r\n-0.440187 0.135414 -0.491848 0 \r\n0.410645 -0.982692 0.180662 0 \r\n0.419102 -0.978626 0.203968 0 \r\n0.430713 -0.979597 0.186561 0 \r\n-0.281485 -0.234957 -0.31741 0 \r\n-0.295859 -0.229288 -0.335885 0 \r\n0.104949 -0.561804 -0.654465 0 \r\n0.135696 -0.559489 -0.658825 0 \r\n0.589024 0.506399 -0.705786 0 \r\n0.607733 0.483737 -0.697698 0 \r\n0.600454 0.500708 -0.686975 0 \r\n0.571197 -0.32703 -0.158331 0 \r\n0.570206 -0.30843 -0.158592 0 \r\n0.576354 -0.324327 -0.179837 0 \r\n-0.194239 -0.681175 -0.267203 0 \r\n-0.200806 -0.664248 -0.274904 0 \r\n-0.256826 -0.101653 -0.0639218 0 \r\n-0.259866 -0.12444 -0.083798 0 \r\n-0.26406 -0.0974469 -0.0848528 0 \r\n0.161103 0.14399 -0.914821 0 \r\n0.114788 0.116222 -0.911968 0 \r\n0.146598 0.103438 -0.910628 0 \r\n-0.0887021 -0.570341 -0.909328 0 \r\n-0.0964136 -0.555462 -0.915704 0 \r\n-0.0925665 -0.551297 -0.906906 0 \r\n-0.0508891 0.763776 -0.334881 0 \r\n-0.0301935 0.773142 -0.335325 0 \r\n0.723179 0.27347 -0.670373 0 \r\n0.718691 0.292526 -0.672783 0 \r\n0.718504 0.274222 -0.689659 0 \r\n-0.355851 -0.633657 0.486151 0 \r\n-0.374135 -0.628338 0.493508 0 \r\n-0.400794 -0.642525 0.49041 0 \r\n-0.642726 -0.667925 0.679721 0 \r\n-0.6588 -0.661246 0.679202 0 \r\n-0.649511 -0.666002 0.696884 0 \r\n-0.00887312 0.277288 0.249294 0 \r\n0.00607855 0.303998 0.25306 0 \r\n0.0166025 0.278212 0.259582 0 \r\n-0.339408 -0.1802 -0.850648 0 \r\n-0.344649 -0.156577 -0.858675 0 \r\n-0.334126 -0.152472 -0.843265 0 \r\n0.483478 -0.772962 -0.386097 0 \r\n0.501922 -0.757349 -0.378619 0 \r\n0.48889 -0.755495 -0.404703 0 \r\n-0.0808927 -0.581579 -0.904122 0 \r\n-0.0698109 -0.57784 -0.889401 0 \r\n-0.0658486 -0.593243 -0.892993 0 \r\n-0.275319 0.429644 -0.171915 0 \r\n-0.266226 0.419952 -0.154444 0 \r\n-0.275602 0.411956 -0.165179 0 \r\n0.363602 0.937662 -0.623361 0 \r\n0.363602 0.936516 -0.597644 0 \r\n0.344919 0.954078 -0.605026 0 \r\n-0.348935 -0.288891 -0.915617 0 \r\n-0.358386 -0.281554 -0.931743 0 \r\n-0.357737 -0.269555 -0.915218 0 \r\n-0.186914 -0.654818 -0.414881 0 \r\n-0.186365 -0.674112 -0.392133 0 \r\n-0.174533 -0.676686 -0.416339 0 \r\n0.305223 0.975739 -0.651697 0 \r\n0.313852 0.969104 -0.662687 0 \r\n0.31836 0.972725 -0.643985 0 \r\n0.417415 0.787419 -0.784449 0 \r\n0.414661 0.757415 -0.805871 0 \r\n0.233817 0.550012 -0.961253 0 \r\n0.261543 0.559979 -0.957484 0 \r\n0.240354 0.56813 -0.957685 0 \r\n-0.308439 0.498497 -0.603078 0 \r\n-0.319818 0.478808 -0.613115 0 \r\n-0.307357 0.498326 -0.622161 0 \r\n0.274804 -0.960345 0.308414 0 \r\n0.264801 -0.966038 0.287708 0 \r\n0.254383 -0.963074 0.301187 0 \r\n-0.535725 -0.699268 0.648265 0 \r\n-0.552149 -0.693944 0.644737 0 \r\n-0.551384 -0.69566 0.665308 0 \r\n-0.508969 -0.679331 0.829284 0 \r\n-0.486428 -0.670574 0.816303 0 \r\n-0.472466 -0.685916 0.818716 0 \r\n-0.0275049 -0.7959 -0.00105965 0 \r\n-0.0420649 -0.780316 -0.00157905 0 \r\n-0.0318755 -0.786695 0.0105741 0 \r\n0.321727 -0.969947 0.265714 0 \r\n0.305503 -0.96848 0.274498 0 \r\n0.335285 -0.962021 0.285311 0 \r\n0.133646 0.707883 -0.00272665 0 \r\n0.129602 0.692525 0.0189532 0 \r\n0.113757 0.705719 -0.00203715 0 \r\n0.0601932 0.828158 -0.514478 0 \r\n0.0695188 0.821631 -0.490992 0 \r\n0.0433442 0.807026 -0.515426 0 \r\n0.419003 0.451346 -0.963072 0 \r\n0.393876 0.447118 -0.963358 0 \r\n0.419781 0.435454 -0.964051 0 \r\n-0.308291 -0.144074 -0.208021 0 \r\n-0.318269 -0.150025 -0.217894 0 \r\n-0.316136 -0.133702 -0.204989 0 \r\n-0.0534397 0.583373 0.078857 0 \r\n-0.0453921 0.561686 0.103709 0 \r\n0.568395 -0.623024 -0.143542 0 \r\n0.0798217 -0.247653 0.222143 0 \r\n0.084457 -0.227408 0.217784 0 \r\n-0.0849836 -0.706756 0.0340974 0 \r\n-0.092549 -0.71779 0.0019288 0 \r\n-0.105374 -0.691213 0.0064115 0 \r\n-0.212126 0.353598 0.0020766 0 \r\n-0.205123 0.35666 0.0254059 0 \r\n-0.21642 0.325893 0.0136632 0 \r\n0.264444 -0.428896 -0.743378 0 \r\n0.255323 -0.431662 -0.732769 0 \r\n0.27495 -0.430796 -0.728882 0 \r\n0.209561 0.303889 0.278784 0 \r\n0.232388 0.307879 0.275894 0 \r\n0.238083 0.287888 0.278493 0 \r\n-0.53567 -0.635158 0.538464 0 \r\n-0.520459 -0.640704 0.527516 0 \r\n-0.498915 -0.63289 0.528419 0 \r\n0.0905709 0.793095 -0.195806 0 \r\n0.0681859 0.792441 -0.208378 0 \r\n-0.393156 0.136317 -0.703137 0 \r\n-0.387928 0.157797 -0.70462 0 \r\n-0.0616834 -0.647744 0.625466 0 \r\n-0.0617742 -0.633147 0.61122 0 \r\n-0.0474384 -0.642261 0.610374 0 \r\n-0.0707142 -0.603819 0.275183 0 \r\n-0.0625675 -0.588495 0.300938 0 \r\n-0.0645842 -0.605246 0.306307 0 \r\n-0.00067088 -0.232957 0.742297 0 \r\n0.0178058 -0.252845 0.7115 0 \r\n0.0232218 -0.255899 0.723375 0 \r\n0.519174 -0.981497 0.139581 0 \r\n0.499023 -0.983173 0.144899 0 \r\n0.515978 -0.980614 0.159919 0 \r\n0.555928 -0.657282 -0.394694 0 \r\n0.540384 -0.669749 -0.412878 0 \r\n0.544628 -0.683911 -0.39132 0 \r\n0.609098 0.0010091 -0.128634 0 \r\n0.602446 0.0245744 -0.118518 0 \r\n0.237363 -0.197975 0.204513 0 \r\n0.263364 -0.187051 0.19547 0 \r\n0.254542 -0.204453 0.200108 0 \r\n0.411983 -0.494458 0.418765 0 \r\n0.427699 -0.507067 0.408373 0 \r\n0.422376 -0.50486 0.429006 0 \r\n-0.401644 -0.756984 0.682258 0 \r\n-0.427771 -0.75324 0.694129 0 \r\n-0.416309 -0.761928 0.698845 0 \r\n0.528285 -0.645589 -0.0686909 0 \r\n0.531117 -0.613134 -0.0606023 0 \r\n0.537177 -0.625001 -0.0793607 0 \r\n-0.394465 0.307946 -0.307334 0 \r\n-0.386712 0.325006 -0.303847 0 \r\n-0.389728 0.311812 -0.278831 0 \r\n-0.0708273 -0.726882 0.084834 0 \r\n-0.0783141 -0.711437 0.10429 0 \r\n-0.0685408 -0.73594 0.108145 0 \r\n-0.397009 0.120685 -0.183327 0 \r\n-0.405336 0.142776 -0.19509 0 \r\n-0.235007 -0.0282348 0.981058 0 \r\n-0.217992 -0.0514116 0.969504 0 \r\n-0.241981 -0.0350642 0.968135 0 \r\n0.141212 0.990407 -0.640049 0 \r\n0.138021 0.983994 -0.666219 0 \r\n0.157899 0.98872 -0.657753 0 \r\n-0.347452 -0.198965 -0.862595 0 \r\n-0.352754 -0.220004 -0.876152 0 \r\n-0.355232 -0.205344 -0.879614 0 \r\n-0.00444339 -0.463064 0.661765 0 \r\n-0.0279703 -0.43296 0.681111 0 \r\n-0.0188119 -0.434979 0.690518 0 \r\n-0.436888 0.187012 -0.361924 0 \r\n-0.437261 0.187598 -0.3904 0 \r\n-0.433966 0.198068 -0.358342 0 \r\n0.103721 0.985068 -0.584589 0 \r\n0.122648 0.989494 -0.590277 0 \r\n0.130375 0.99187 -0.570189 0 \r\n0.592988 -0.603788 -0.334718 0 \r\n0.589922 -0.618837 -0.325675 0 \r\n0.598405 -0.604921 -0.303163 0 \r\n0.0817362 -0.734635 -0.917588 0 \r\n0.0929862 -0.727343 -0.904155 0 \r\n0.098254 -0.72731 -0.914676 0 \r\n-0.347472 -0.741956 0.579815 0 \r\n-0.380529 -0.73423 0.584194 0 \r\n-0.354835 -0.741863 0.602042 0 \r\n-0.266303 0.0239067 0.969945 0 \r\n-0.240353 0.011888 0.968114 0 \r\n-0.246961 0.00896697 0.972139 0 \r\n-0.164171 -0.650149 0.678943 0 \r\n-0.198062 -0.641204 0.688318 0 \r\n-0.153749 -0.636278 0.664389 0 \r\n0.142675 -0.377486 0.541826 0 \r\n0.133702 -0.361942 0.54525 0 \r\n0.142823 -0.378619 0.528824 0 \r\n0.11389 0.734727 -0.0463282 0 \r\n0.0925457 0.72946 -0.042133 0 \r\n0.0886351 0.743111 -0.0647442 0 \r\n-0.245611 -0.0101546 0.753929 0 \r\n-0.263688 0.012207 0.768384 0 \r\n-0.263801 -0.008816 0.780676 0 \r\n0.00687085 0.703249 -0.0237544 0 \r\n0.0307547 0.709921 -0.026126 0 \r\n0.0271774 0.698922 -0.0116288 0 \r\n0.208308 -0.939978 -0.196202 0 \r\n0.218208 -0.941589 -0.168341 0 \r\n0.221378 -0.939942 -0.192493 0 \r\n-0.0523553 -0.252521 0.184989 0 \r\n-0.0507153 -0.270943 0.193155 0 \r\n-0.0711448 -0.270256 0.181539 0 \r\n0.161577 -0.413209 0.352894 0 \r\n0.191629 -0.416039 0.364609 0 \r\n0.167724 -0.421723 0.371774 0 \r\n-0.109639 -0.697038 0.427652 0 \r\n-0.0951792 -0.687929 0.418297 0 \r\n-0.0987502 -0.677178 0.415215 0 \r\n0.228436 0.200564 -0.932272 0 \r\n0.245169 0.212212 -0.93637 0 \r\n0.22636 0.214183 -0.940596 0 \r\n0.512533 0.682631 -0.383607 0 \r\n0.506348 0.685645 -0.411848 0 \r\n0.525005 0.669312 -0.402484 0 \r\n0.765131 0.0699894 -0.330965 0 \r\n0.764674 0.0877077 -0.31261 0 \r\n0.765754 0.0974877 -0.332368 0 \r\n-0.23568 0.250486 -0.978289 0 \r\n-0.247507 0.211792 -0.980083 0 \r\n-0.235813 0.224523 -0.979491 0 \r\n0.185322 0.948246 -0.475356 0 \r\n0.19479 0.963007 -0.48578 0 \r\n0.662522 -0.116191 -0.421542 0 \r\n0.679971 -0.114891 -0.396948 0 \r\n0.675649 -0.108379 -0.416549 0 \r\n0.601274 0.355377 -0.912547 0 \r\n0.604958 0.332061 -0.919644 0 \r\n0.605788 0.328798 -0.909352 0 \r\n0.720419 0.302333 -0.218179 0 \r\n0.720065 0.312174 -0.228943 0 \r\n0.731708 0.294986 -0.239419 0 \r\n-0.460648 -0.014945 -0.508871 0 \r\n-0.447123 -0.00759575 -0.561181 0 \r\n0.49191 -0.952209 0.274337 0 \r\n0.512777 -0.952665 0.267868 0 \r\n0.489621 -0.961895 0.246243 0 \r\n-0.228128 0.0289135 0.851293 0 \r\n-0.223756 0.037412 0.829248 0 \r\n-0.210488 0.0218988 0.81923 0 \r\n0.41175 0.751288 -0.617167 0 \r\n0.421156 0.74062 -0.644641 0 \r\n0.417924 0.732646 -0.630679 0 \r\n-0.343188 0.0863948 0.855128 0 \r\n-0.335797 0.0804283 0.839205 0 \r\n-0.333363 0.0914015 0.830592 0 \r\n0.704376 -0.0281264 -0.939099 0 \r\n0.690943 0.0222169 -0.940796 0 \r\n0.692635 -0.0044018 -0.946855 0 \r\n-0.556518 -0.697136 0.68479 0 \r\n-0.323694 0.107028 0.844845 0 \r\n-0.313784 0.11121 0.819883 0 \r\n-0.309448 0.109343 0.828953 0 \r\n0.507147 -0.166835 -0.718895 0 \r\n0.520191 -0.152158 -0.733063 0 \r\n0.429816 -0.643659 -0.922179 0 \r\n0.397523 -0.637595 -0.927569 0 \r\n0.434755 -0.516998 0.499687 0 \r\n0.426495 -0.507706 0.477024 0 \r\n0.448063 -0.526456 0.487379 0 \r\n0.186693 0.934524 -0.782261 0 \r\n0.189351 0.921164 -0.799987 0 \r\n0.201543 0.932184 -0.784376 0 \r\n-0.244824 -0.353963 -0.329535 0 \r\n-0.238025 -0.3548 -0.351894 0 \r\n-0.239579 -0.332604 -0.342487 0 \r\n0.492801 -0.727583 -0.0546549 0 \r\n0.495396 -0.735483 -0.0694318 0 \r\n-0.41717 -0.0570435 -0.62766 0 \r\n-0.415464 -0.0679192 -0.620441 0 \r\n-0.405648 -0.0577543 -0.652099 0 \r\n0.70874 -0.792683 0.197815 0 \r\n0.712683 -0.789099 0.216679 0 \r\n0.715904 -0.772724 0.190266 0 \r\n0.102164 -0.191844 0.212648 0 \r\n0.118601 -0.210909 0.218158 0 \r\n-0.0735366 -0.0494437 0.156163 0 \r\n-0.371832 -0.69682 0.482352 0 \r\n-0.331918 -0.69732 0.473724 0 \r\n0.163775 -0.92187 0.503432 0 \r\n0.187561 -0.936905 0.502706 0 \r\n0.175238 -0.932494 0.486892 0 \r\n0.0909151 -0.654984 -0.847388 0 \r\n0.08132 -0.62953 -0.825653 0 \r\n0.10831 -0.642291 -0.84005 0 \r\n0.104716 -0.40161 0.315132 0 \r\n0.104556 -0.410089 0.327668 0 \r\n0.0864824 -0.409393 0.318479 0 \r\n-0.738585 -0.571321 0.77667 0 \r\n-0.725999 -0.567374 0.766246 0 \r\n0.595572 -0.594413 -0.194422 0 \r\n0.593154 -0.586591 -0.182111 0 \r\n0.595525 -0.582888 -0.190913 0 \r\n-0.379058 -0.578629 0.67474 0 \r\n-0.403583 -0.579393 0.683042 0 \r\n-0.397358 -0.576331 0.670403 0 \r\n0.450377 -0.932801 0.357396 0 \r\n0.45403 -0.932871 0.373071 0 \r\n-0.115084 0.538126 -0.833683 0 \r\n-0.135284 0.536232 -0.826975 0 \r\n0.512393 0.670272 -0.528379 0 \r\n0.500127 0.682377 -0.52911 0 \r\n0.505352 0.675175 -0.550496 0 \r\n0.559752 -0.296945 -0.121141 0 \r\n0.562097 -0.276811 -0.127838 0 \r\n0.567394 -0.291 -0.143783 0 \r\n0.345926 -0.461132 -0.649827 0 \r\n0.335108 -0.475989 -0.646519 0 \r\n0.360925 -0.47148 -0.637755 0 \r\n-0.277165 0.440845 -0.181087 0 \r\n-0.283912 0.444959 -0.197184 0 \r\n-0.276384 0.464156 -0.195621 0 \r\n-0.16635 -0.0632508 0.978076 0 \r\n-0.180475 -0.0473019 0.982231 0 \r\n-0.163368 -0.0582689 0.975461 0 \r\n0.715323 -0.0715578 -0.936212 0 \r\n0.710856 -0.0888031 -0.938273 0 \r\n0.720112 -0.105616 -0.929327 0 \r\n0.454912 -0.521546 0.354771 0 \r\n0.457174 -0.532211 0.380304 0 \r\n-0.282585 -0.791644 0.677148 0 \r\n-0.294906 -0.7925 0.686159 0 \r\n-0.279101 -0.792912 0.683493 0 \r\n0.249537 -0.468475 0.535376 0 \r\n0.266373 -0.464128 0.523059 0 \r\n0.270088 -0.47033 0.53919 0 \r\n0.431916 0.710217 -0.685014 0 \r\n0.43077 0.72696 -0.675271 0 \r\n0.435356 0.715198 -0.702132 0 \r\n-0.0760764 -0.725894 0.14369 0 \r\n-0.0783162 -0.719324 0.167971 0 \r\n-0.285355 0.363643 -0.864344 0 \r\n-0.287183 0.340975 -0.867782 0 \r\n-0.280597 0.354226 -0.880751 0 \r\n-0.245266 -0.358596 -0.100041 0 \r\n-0.245427 -0.379901 -0.107491 0 \r\n-0.24907 -0.371427 -0.123553 0 \r\n0.583997 -0.410515 -0.395023 0 \r\n0.587712 -0.430373 -0.385445 0 \r\n0.586767 -0.413094 -0.378281 0 \r\n0.070946 0.188688 0.270877 0 \r\n0.086692 0.1663 0.271738 0 \r\n0.0614778 0.176235 0.268485 0 \r\n-0.288657 -0.229221 -0.374175 0 \r\n-0.289084 -0.232774 -0.353601 0 \r\n-0.274717 -0.235986 -0.36132 0 \r\n-0.673969 -0.641894 0.610747 0 \r\n-0.662033 -0.649938 0.602026 0 \r\n-0.660628 -0.645422 0.584551 0 \r\n0.153213 0.960818 -0.737997 0 \r\n0.174111 0.962759 -0.736458 0 \r\n0.166838 0.968736 -0.72268 0 \r\n0.688681 -0.819497 0.296232 0 \r\n0.686777 -0.829417 0.277539 0 \r\n0.679145 -0.846181 0.285061 0 \r\n-0.0668209 -0.747553 0.436986 0 \r\n-0.0555493 -0.763142 0.452847 0 \r\n-0.0469538 -0.759341 0.428955 0 \r\n-0.128055 -0.775733 -0.327575 0 \r\n-0.105518 -0.80248 -0.318824 0 \r\n0.0131513 -0.524799 0.483649 0 \r\n0.0145796 -0.530139 0.467041 0 \r\n0.0104082 -0.516047 0.459918 0 \r\n-0.26464 0.472582 -0.813825 0 \r\n-0.261463 0.463481 -0.834371 0 \r\n-0.256401 0.483566 -0.815222 0 \r\n0.448582 -0.424784 -0.642595 0 \r\n0.436186 0.699705 -0.692515 0 \r\n0.4316 0.711468 -0.665654 0 \r\n0.129752 -0.957224 0.250227 0 \r\n0.112308 -0.957114 0.22925 0 \r\n0.107 -0.946215 0.257096 0 \r\n0.595863 0.383493 -0.885038 0 \r\n0.593876 0.388993 -0.868073 0 \r\n0.590425 0.403728 -0.880131 0 \r\n0.00123115 -0.403275 0.745525 0 \r\n0.00428447 -0.423689 0.723982 0 \r\n-0.0120146 -0.400522 0.743299 0 \r\n0.191372 -0.44831 -0.739475 0 \r\n0.172915 -0.45762 -0.73726 0 \r\n0.185157 -0.452213 -0.7305 0 \r\n0.470617 0.498077 -0.938305 0 \r\n0.47335 0.512116 -0.924228 0 \r\n0.449531 0.512609 -0.930237 0 \r\n0.275894 0.536186 0.183293 0 \r\n0.279433 0.560197 0.163099 0 \r\n0.296596 0.552684 0.16614 0 \r\n0.725207 0.342723 -0.52344 0 \r\n0.727495 0.332139 -0.538098 0 \r\n0.732927 0.32582 -0.515154 0 \r\n0.602669 -0.152402 -0.216207 0 \r\n0.601647 -0.135639 -0.186691 0 \r\n0.608076 -0.13179 -0.210983 0 \r\n-0.140069 -0.136315 0.635107 0 \r\n-0.138533 -0.104442 0.633478 0 \r\n-0.151749 -0.0962977 0.648975 0 \r\n0.148511 -0.65273 -0.870425 0 \r\n0.167889 -0.657062 -0.882944 0 \r\n0.137284 -0.672076 -0.874303 0 \r\n-0.40169 0.294757 -0.3361 0 \r\n-0.404706 0.281564 -0.311083 0 \r\n0.194086 -0.440017 0.455965 0 \r\n0.194744 -0.437329 0.478492 0 \r\n0.177433 -0.43217 0.466917 0 \r\n0.488039 -0.693807 0.549183 0 \r\n0.465615 -0.684443 0.562979 0 \r\n0.483261 -0.659678 0.553308 0 \r\n0.188819 0.335698 -0.963396 0 \r\n0.192318 0.353017 -0.961586 0 \r\n0.182727 0.34981 -0.962297 0 \r\n-0.082352 -0.692796 0.104586 0 \r\n-0.0869173 -0.680256 0.0847457 0 \r\n-0.0886689 -0.670672 0.108353 0 \r\n-0.135954 -0.192944 -0.70551 0 \r\n-0.1441 -0.19002 -0.719077 0 \r\n-0.397784 0.0673745 -0.178243 0 \r\n-0.39439 0.0498328 -0.17827 0 \r\n-0.404311 0.0394821 -0.181971 0 \r\n-0.0212727 -0.807957 -0.0193635 0 \r\n-0.0262068 -0.81188 -0.0345232 0 \r\n-0.0426283 -0.793445 -0.0283726 0 \r\n0.665568 -0.692215 0.299604 0 \r\n0.658725 -0.679345 0.287972 0 \r\n-0.275919 -0.0561984 -0.115806 0 \r\n-0.27479 -0.0885121 -0.124804 0 \r\n-0.12699 -0.213886 0.867269 0 \r\n-0.131801 -0.223215 0.85039 0 \r\n-0.141776 -0.207253 0.85974 0 \r\n0.527849 -0.162963 -0.506202 0 \r\n0.532145 -0.173552 -0.485882 0 \r\n0.253269 -0.494653 -0.668841 0 \r\n0.26458 -0.520009 -0.656902 0 \r\n0.28321 -0.510404 -0.655725 0 \r\n-0.26614 0.395888 -0.892804 0 \r\n-0.257288 0.392936 -0.910823 0 \r\n-0.258972 0.414286 -0.892202 0 \r\n-0.0701497 -0.736412 0.423382 0 \r\n-0.0653049 -0.725513 0.409115 0 \r\n-0.0772292 -0.718173 0.419403 0 \r\n-0.173563 0.563647 -0.773838 0 \r\n-0.169089 0.55038 -0.792599 0 \r\n-0.152955 0.562413 -0.786834 0 \r\n0.531818 -0.515554 -0.0379589 0 \r\n0.52238 -0.492121 -0.0204396 0 \r\n0.532026 -0.496164 -0.0371708 0 \r\n0.602192 -0.664957 0.0245093 0 \r\n0.58477 -0.665604 0.0204199 0 \r\n0.581278 -0.677756 0.0109772 0 \r\n0.371385 0.584805 -0.911566 0 \r\n0.375795 0.600889 -0.901783 0 \r\n0.362217 0.601382 -0.912095 0 \r\n0.421395 0.813148 -0.633346 0 \r\n0.430631 0.798647 -0.660578 0 \r\n0.423833 0.786361 -0.643636 0 \r\n-0.696898 -0.613084 0.88577 0 \r\n-0.691102 -0.601065 0.869058 0 \r\n-0.197834 -0.659817 -0.229028 0 \r\n-0.197756 -0.64695 -0.200942 0 \r\n-0.19161 -0.665032 -0.197491 0 \r\n0.532358 -0.531729 -0.0417366 0 \r\n0.522712 -0.527686 -0.0250053 0 \r\n0.0999193 -0.528756 -0.771347 0 \r\n0.103359 -0.510599 -0.758184 0 \r\n0.127798 -0.506364 -0.761137 0 \r\n0.0924547 -0.918074 0.0487597 0 \r\n0.110377 -0.933244 0.0564487 0 \r\n0.108044 -0.923376 0.0449928 0 \r\n0.486254 -0.41387 -0.721386 0 \r\n0.4809 -0.414494 -0.700712 0 \r\n0.494872 -0.401525 -0.699576 0 \r\n0.144042 -0.911708 -0.0815182 0 \r\n0.117878 -0.909258 -0.0923903 0 \r\n0.122604 -0.902908 -0.0724815 0 \r\n0.427367 0.646416 -0.018249 0 \r\n0.41229 0.646401 0.0007537 0 \r\n0.41133 0.666864 -0.028646 0 \r\n0.324628 0.742151 -0.104583 0 \r\n0.304709 0.754328 -0.124186 0 \r\n0.334039 0.748901 -0.134699 0 \r\n0.54497 -0.623617 0.415304 0 \r\n0.54977 -0.628223 0.432985 0 \r\n0.534703 -0.615198 0.434147 0 \r\n-0.00066777 -0.477634 0.480531 0 \r\n0.00226307 -0.461351 0.464405 0 \r\n-0.00756826 -0.453873 0.489745 0 \r\n-0.122473 0.686746 -0.581815 0 \r\n-0.104934 0.696686 -0.590878 0 \r\n-0.108037 0.700696 -0.563987 0 \r\n-0.30777 -0.300242 -0.98192 0 \r\n-0.313097 -0.318733 -0.977003 0 \r\n-0.288606 -0.316222 -0.981205 0 \r\n0.437723 0.439309 0.165777 0 \r\n0.452089 0.423791 0.156863 0 \r\n0.439487 0.425254 0.168931 0 \r\n-0.0345112 0.111688 0.22153 0 \r\n-0.0418438 0.0891913 0.211165 0 \r\n-0.0547456 0.108398 0.208622 0 \r\n-0.25171 0.134096 -0.0320256 0 \r\n-0.253318 0.105368 -0.0340786 0 \r\n-0.259413 0.112865 -0.0545434 0 \r\n0.559021 0.206437 -0.950132 0 \r\n0.547653 0.162482 -0.94199 0 \r\n0.573812 0.157697 -0.952259 0 \r\n0.609944 -0.722588 0.442791 0 \r\n0.605175 -0.730595 0.452291 0 \r\n-0.348552 -0.0664779 -0.186148 0 \r\n-0.351648 -0.0333479 -0.177278 0 \r\n-0.33743 -0.0530054 -0.180225 0 \r\n-0.149089 -0.241018 -0.922256 0 \r\n-0.158782 -0.262702 -0.927621 0 \r\n-0.623282 -0.64761 0.555155 0 \r\n-0.606462 -0.641595 0.554703 0 \r\n-0.622967 -0.638663 0.564121 0 \r\n-0.0558299 -0.784573 0.252432 0 \r\n-0.0548369 -0.795116 0.22454 0 \r\n-0.0627092 -0.772493 0.226792 0 \r\n-0.179515 0.664793 -0.262957 0 \r\n-0.189874 0.658018 -0.281967 0 \r\n0.247874 0.275384 -0.961335 0 \r\n0.270504 0.27802 -0.959929 0 \r\n0.251823 0.288309 -0.964519 0 \r\n0.147534 -0.595703 -0.980494 0 \r\n0.182452 -0.586295 -0.978668 0 \r\n0.172209 -0.56296 -0.979209 0 \r\n0.628118 -0.522156 -0.923563 0 \r\n0.622686 -0.501859 -0.937291 0 \r\n0.691805 -0.678523 0.0903957 0 \r\n0.684313 -0.677791 0.0743484 0 \r\n0.696843 -0.696281 0.0864007 0 \r\n-0.272729 -0.180747 -0.163381 0 \r\n-0.269804 -0.19244 -0.156251 0 \r\n-0.272412 -0.199482 -0.176018 0 \r\n0.597694 -0.423982 -0.957424 0 \r\n0.59702 -0.393083 -0.958143 0 \r\n0.589902 -0.424075 -0.963498 0 \r\n0.158136 -0.694485 -0.919578 0 \r\n0.178652 -0.680791 -0.925103 0 \r\n0.159367 -0.699463 -0.933451 0 \r\n0.3459 -0.99218 0.147182 0 \r\n0.36849 -0.987282 0.144006 0 \r\n0.347378 -0.989291 0.127466 0 \r\n0.318184 0.531304 0.178603 0 \r\n0.326766 0.51232 0.189145 0 \r\n0.301638 0.509689 0.196875 0 \r\n0.467089 -0.892763 0.0199945 0 \r\n0.485367 -0.891446 0.0186938 0 \r\n0.199209 -0.979425 0.236271 0 \r\n0.211246 -0.975879 0.250346 0 \r\n0.224689 -0.985572 0.228488 0 \r\n0.0115274 -0.568643 0.479291 0 \r\n0.00444843 -0.55994 0.457864 0 \r\n0.0187038 -0.559481 0.482233 0 \r\n-0.15759 -0.335328 -0.837676 0 \r\n-0.140465 -0.325271 -0.82225 0 \r\n-0.143625 -0.343234 -0.839755 0 \r\n-0.290917 -0.218287 -0.27422 0 \r\n-0.302584 -0.208917 -0.273082 0 \r\n0.269341 0.826622 -0.85489 0 \r\n0.295708 0.811493 -0.855802 0 \r\n0.2915 0.836693 -0.841628 0 \r\n0.637395 0.342278 -0.126847 0 \r\n0.633945 0.366678 -0.128064 0 \r\n0.648461 0.359196 -0.145127 0 \r\n0.353127 0.924713 -0.539885 0 \r\n0.353817 0.935499 -0.553147 0 \r\n0.368635 0.916224 -0.555817 0 \r\n0.540669 -0.298492 -0.663737 0 \r\n0.54331 -0.291232 -0.640655 0 \r\n-0.220085 0.279665 0.0373016 0 \r\n-0.215721 0.266616 0.0559038 0 \r\n-0.222585 0.258191 0.0370578 0 \r\n-0.422181 -0.796033 0.753935 0 \r\n-0.445628 -0.795117 0.762615 0 \r\n0.367141 -0.974227 0.103605 0 \r\n0.393555 -0.980945 0.118563 0 \r\n0.390727 -0.97078 0.0978772 0 \r\n-0.254458 -0.440252 -0.217744 0 \r\n-0.253424 -0.453545 -0.236578 0 \r\n-0.254635 -0.440835 -0.245265 0 \r\n0.199877 -0.938892 0.513259 0 \r\n0.198422 -0.930592 0.528082 0 \r\n0.2222 -0.943202 0.522095 0 \r\n-0.297086 0.222516 -0.873744 0 \r\n-0.302768 0.173273 -0.870327 0 \r\n-0.317842 0.473692 -0.337703 0 \r\n-0.318318 0.480774 -0.373298 0 \r\n-0.306381 0.49649 -0.352664 0 \r\n-0.0194401 0.828007 -0.618368 0 \r\n-0.0276284 0.803072 -0.635383 0 \r\n0.0133365 0.330734 0.250891 0 \r\n0.0257076 0.35915 0.249153 0 \r\n0.0439252 0.333338 0.26161 0 \r\n0.739879 -0.0321572 -0.435486 0 \r\n0.737519 -0.0499661 -0.419986 0 \r\n0.743149 -0.0392657 -0.412733 0 \r\n0.519895 0.18628 -0.929733 0 \r\n0.528627 0.180324 -0.933094 0 \r\n0.0306473 -0.643649 0.578439 0 \r\n0.010431 -0.639796 0.580323 0 \r\n0.0283909 -0.633647 0.56907 0 \r\n-0.186127 0.624709 -0.184574 0 \r\n-0.189777 0.604791 -0.161413 0 \r\n-0.207316 0.597008 -0.189002 0 \r\n-0.527187 -0.620787 0.555264 0 \r\n-0.484048 -0.619698 0.540109 0 \r\n-0.497108 -0.61314 0.556006 0 \r\n-0.0397872 -0.770105 0.526599 0 \r\n-0.0441558 -0.767205 0.535792 0 \r\n-0.0253481 -0.771553 0.536876 0 \r\n0.726265 0.239922 -0.684161 0 \r\n0.730805 0.237027 -0.670572 0 \r\n0.727531 0.25227 -0.673661 0 \r\n0.598011 -0.126865 -0.459971 0 \r\n0.616637 -0.119049 -0.460286 0 \r\n0.600859 -0.114049 -0.49126 0 \r\n0.185268 -0.241183 -0.967701 0 \r\n0.176122 -0.238668 -0.966746 0 \r\n0.16207 -0.248431 -0.966594 0 \r\n-0.0207248 0.0649256 0.216352 0 \r\n-0.0409592 0.0616361 0.203444 0 \r\n-0.249919 0.578542 -0.568533 0 \r\n-0.256207 0.567989 -0.599681 0 \r\n0.434994 0.805225 -0.674949 0 \r\n0.437432 0.778439 -0.685239 0 \r\n-0.320246 -0.106944 -0.192105 0 \r\n-0.330224 -0.112894 -0.201978 0 \r\n0.326973 -0.273633 0.18322 0 \r\n0.328591 -0.291791 0.183874 0 \r\n0.30996 -0.281346 0.193441 0 \r\n-0.0751725 -0.361614 0.577065 0 \r\n-0.0627414 -0.394643 0.571005 0 \r\n-0.0602592 -0.382439 0.558667 0 \r\n-0.608078 -0.76788 0.87929 0 \r\n-0.612399 -0.764407 0.866282 0 \r\n-0.630632 -0.753469 0.880151 0 \r\n-0.200165 -0.169268 0.0310098 0 \r\n-0.203316 -0.153985 0.0281563 0 \r\n-0.191792 -0.156635 0.0446712 0 \r\n0.576225 -0.461959 -0.431125 0 \r\n0.573936 -0.483018 -0.437288 0 \r\n0.581771 -0.477024 -0.416599 0 \r\n0.227931 0.097249 0.264697 0 \r\n0.244383 0.121624 0.26823 0 \r\n0.264796 0.10623 0.264111 0 \r\n0.0281195 -0.521352 -0.657449 0 \r\n0.0185746 -0.529565 -0.647815 0 \r\n0.0444882 -0.531111 -0.655956 0 \r\n0.0985584 -0.306319 0.543352 0 \r\n0.103645 -0.325416 0.521166 0 \r\n0.115808 -0.340433 0.529104 0 \r\n-0.456555 -0.715923 0.568053 0 \r\n-0.443418 -0.718476 0.579156 0 \r\n-0.313099 0.0939284 -0.859223 0 \r\n-0.315498 0.0673121 -0.861627 0 \r\n-0.310385 0.0883717 -0.869259 0 \r\n-0.0550652 -0.77401 -0.0191846 0 \r\n0.578507 -0.445047 -0.126029 0 \r\n0.57708 -0.460415 -0.120282 0 \r\n0.570834 -0.444551 -0.103241 0 \r\n0.469092 -0.912722 0.453106 0 \r\n0.4973 -0.907144 0.435388 0 \r\n0.458714 -0.923883 0.442911 0 \r\n0.640399 -0.615454 0.189565 0 \r\n0.639771 -0.608655 0.169533 0 \r\n0.656815 -0.62261 0.172153 0 \r\n-0.166598 0.329934 0.118159 0 \r\n-0.17145 0.350547 0.10181 0 \r\n-0.487977 -0.760378 0.743714 0 \r\n-0.454218 -0.76807 0.730136 0 \r\n-0.476195 -0.75049 0.724294 0 \r\n-0.251033 0.332088 -0.0978364 0 \r\n-0.24568 0.358356 -0.095055 0 \r\n-0.237379 0.350501 -0.0750384 0 \r\n0.671021 -0.191648 -0.944263 0 \r\n0.660208 -0.210239 -0.937024 0 \r\n0.680344 -0.187371 -0.933056 0 \r\n0.0268044 -0.512847 -0.676757 0 \r\n0.0375862 -0.519209 -0.666831 0 \r\n0.0432513 -0.516536 -0.675516 0 \r\n-0.111893 -0.404607 -0.860199 0 \r\n-0.117986 -0.381117 -0.855573 0 \r\n-0.104332 -0.388135 -0.836466 0 \r\n-0.337496 -0.179598 -0.263261 0 \r\n-0.327783 -0.182894 -0.259715 0 \r\n-0.330027 -0.192116 -0.274368 0 \r\n0.0474783 0.489812 0.198344 0 \r\n0.0571721 0.464359 0.216446 0 \r\n0.0371887 0.47019 0.206375 0 \r\n0.745239 -0.036433 -0.276547 0 \r\n0.748093 -0.0106315 -0.267582 0 \r\n0.754049 -0.0137605 -0.288202 0 \r\n-0.157463 0.333358 -0.964213 0 \r\n-0.171841 0.305782 -0.961424 0 \r\n-0.151385 0.312543 -0.955092 0 \r\n-0.321993 -0.1112 -0.716184 0 \r\n-0.341999 -0.0947433 -0.718495 0 \r\n-0.335316 -0.106146 -0.696324 0 \r\n-0.148925 0.37983 -0.972316 0 \r\n-0.121314 0.385154 -0.971589 0 \r\n0.747885 0.284521 -0.372882 0 \r\n0.739123 0.315968 -0.370265 0 \r\n0.74732 0.287078 -0.391625 0 \r\n-0.082816 -0.118896 0.59305 0 \r\n-0.0688739 -0.139886 0.581133 0 \r\n-0.0733286 -0.106645 0.593497 0 \r\n0.562139 0.47517 -0.845059 0 \r\n0.557381 0.481588 -0.829151 0 \r\n0.608818 -0.422484 -0.953186 0 \r\n0.601699 -0.453476 -0.958541 0 \r\n0.0803871 0.697978 0.00282115 0 \r\n0.0968435 0.675538 0.036484 0 \r\n0.0675175 0.683154 0.0196624 0 \r\n-0.431897 -0.0470596 -0.596129 0 \r\n0.397103 -0.488865 0.478684 0 \r\n0.391656 -0.489086 0.498789 0 \r\n0.375572 -0.479703 0.488142 0 \r\n0.614457 0.355424 -0.822348 0 \r\n0.627226 0.331242 -0.821734 0 \r\n0.615837 0.141365 -0.120489 0 \r\n0.617482 0.161387 -0.120568 0 \r\n0.622271 0.151975 -0.123341 0 \r\n0.533945 -0.13538 -0.542032 0 \r\n0.545074 -0.1186 -0.562302 0 \r\n0.530905 -0.127376 -0.57756 0 \r\n0.583452 -0.376164 -0.365835 0 \r\n0.58244 -0.359295 -0.359491 0 \r\n0.582041 -0.376366 -0.381514 0 \r\n0.146592 -0.645226 0.584137 0 \r\n0.136445 -0.632321 0.582539 0 \r\n0.147669 -0.627236 0.584474 0 \r\n0.662678 -0.194995 -0.858495 0 \r\n0.665194 -0.202129 -0.880667 0 \r\n0.644217 -0.215144 -0.87145 0 \r\n-0.512539 -0.702018 0.560151 0 \r\n-0.487977 -0.706418 0.544783 0 \r\n-0.516625 -0.698807 0.541121 0 \r\n-0.249651 -0.77716 0.633213 0 \r\n-0.237695 -0.770627 0.611992 0 \r\n-0.276395 -0.772079 0.629591 0 \r\n0.189308 0.25336 -0.964584 0 \r\n0.214841 0.264224 -0.963108 0 \r\n0.253984 0.669971 0.0511203 0 \r\n0.233317 0.683456 0.0336497 0 \r\n0.250569 0.686455 0.0285392 0 \r\n0.603302 0.308886 -0.089745 0 \r\n0.61744 0.30928 -0.105232 0 \r\n-0.749197 -0.619307 0.813056 0 \r\n-0.745696 -0.63005 0.840331 0 \r\n-0.740126 -0.631608 0.807048 0 \r\n0.422059 0.728615 -0.611513 0 \r\n0.422936 0.727224 -0.589987 0 \r\n0.409395 0.741923 -0.581678 0 \r\n0.183288 -0.533146 -0.81896 0 \r\n0.196568 -0.538598 -0.832357 0 \r\n0.178945 -0.551857 -0.825356 0 \r\n-0.0773838 0.157418 -0.894428 0 \r\n-0.0667368 0.158792 -0.89405 0 \r\n-0.0765418 0.171421 -0.894095 0 \r\n-0.239533 -0.279761 -0.06197 0 \r\n-0.243701 -0.300493 -0.0810334 0 \r\n0.754371 0.241001 -0.494044 0 \r\n0.752337 0.26205 -0.482793 0 \r\n0.753084 0.241577 -0.51431 0 \r\n0.192547 -0.861488 -0.430063 0 \r\n0.211846 -0.856401 -0.435687 0 \r\n0.18972 -0.849139 -0.449323 0 \r\n0.5845 -0.44188 -0.406311 0 \r\n0.58727 -0.444459 -0.389569 0 \r\n-0.523076 -0.588781 0.722473 0 \r\n-0.502934 -0.583099 0.700749 0 \r\n-0.482908 -0.58844 0.720652 0 \r\n-0.132661 0.244996 -0.915151 0 \r\n-0.124753 0.277755 -0.922374 0 \r\n-0.135365 0.261962 -0.924539 0 \r\n-0.250892 -0.31443 -0.122976 0 \r\n-0.255091 -0.292875 -0.135249 0 \r\n-0.2504 -0.284921 -0.104825 0 \r\n-0.227482 -0.317796 -0.0287922 0 \r\n-0.233308 -0.328039 -0.0467433 0 \r\n-0.231658 -0.305901 -0.0412987 0 \r\n0.617098 -0.606414 0.0841594 0 \r\n0.618825 -0.617521 0.0723613 0 \r\n0.633062 -0.619143 0.0787377 0 \r\n0.433224 -0.615942 -0.557878 0 \r\n0.448265 -0.588529 -0.558778 0 \r\n0.422625 -0.602638 -0.57014 0 \r\n0.118213 -0.487598 -0.709921 0 \r\n0.109263 -0.489403 -0.722684 0 \r\n-0.292195 -0.186054 -0.229834 0 \r\n-0.284818 -0.187352 -0.213084 0 \r\n-0.286629 -0.207496 -0.237614 0 \r\n-0.165159 -0.197835 -0.756798 0 \r\n-0.151 -0.190309 -0.742872 0 \r\n-0.150302 -0.205148 -0.751661 0 \r\n0.357682 0.493647 -0.95586 0 \r\n0.363991 0.471155 -0.961364 0 \r\n0.386789 0.485501 -0.956874 0 \r\n0.262783 0.136348 0.270513 0 \r\n0.263359 0.160193 0.273201 0 \r\n0.281824 0.15445 0.270332 0 \r\n0.391728 -0.401195 0.212472 0 \r\n0.370912 -0.39239 0.22649 0 \r\n0.379318 -0.391323 0.201763 0 \r\n-0.00820019 -0.598828 -0.836151 0 \r\n0.00975761 -0.601367 -0.825188 0 \r\n0.006117 -0.616208 -0.838232 0 \r\n-0.168387 0.682444 -0.329075 0 \r\n-0.150063 0.697921 -0.324955 0 \r\n0.627429 0.497356 -0.594464 0 \r\n0.618105 0.510337 -0.599222 0 \r\n0.625643 0.496931 -0.609459 0 \r\n-0.0431471 -0.492873 -0.983285 0 \r\n-0.0137984 -0.541615 -0.983523 0 \r\n-0.0010631 -0.486282 -0.983243 0 \r\n0.609066 -0.398603 -0.939477 0 \r\n-0.0819216 -0.626155 0.615121 0 \r\n-0.0961666 -0.631638 0.630214 0 \r\n0.57112 -0.567624 0.124514 0 \r\n0.584002 -0.577104 0.113058 0 \r\n0.58999 -0.572878 0.134481 0 \r\n-0.182337 -0.0926536 0.0599767 0 \r\n-0.18776 -0.0687438 0.0568949 0 \r\n0.346631 0.393564 0.236737 0 \r\n0.331357 0.425716 0.231326 0 \r\n0.359571 0.41633 0.22414 0 \r\n0.377554 -0.250436 0.149724 0 \r\n0.394997 -0.240212 0.133537 0 \r\n0.396325 -0.258898 0.133765 0 \r\n0.321572 -0.454363 0.422894 0 \r\n0.325199 -0.451561 0.406043 0 \r\n0.343825 -0.456892 0.409285 0 \r\n0.362207 -0.453755 0.372811 0 \r\n0.383002 -0.464204 0.374176 0 \r\n0.368246 -0.464539 0.393799 0 \r\n-0.738598 -0.625535 0.896209 0 \r\n-0.73018 -0.641488 0.902923 0 \r\n-0.741122 -0.632755 0.891207 0 \r\n0.645058 -0.616275 0.0916255 0 \r\n0.649453 -0.614339 0.104882 0 \r\n0.63573 -0.6061 0.103792 0 \r\n-0.0842931 -0.545462 -0.890819 0 \r\n-0.0920046 -0.530584 -0.897195 0 \r\n0.625234 -0.850707 0.376432 0 \r\n0.602898 -0.85928 0.394628 0 \r\n0.610473 -0.845842 0.397097 0 \r\n-0.190351 0.40407 0.0258002 0 \r\n-0.18328 0.431464 0.0225099 0 \r\n0.401985 0.813802 -0.59137 0 \r\n0.39908 0.834685 -0.579069 0 \r\n0.411693 0.821745 -0.604102 0 \r\n-0.476267 0.0130268 -0.392601 0 \r\n-0.475592 0.0110594 -0.377704 0 \r\n-0.476434 0.000890315 -0.382716 0 \r\n0.7465 0.171358 -0.597515 0 \r\n0.744409 0.1506 -0.610173 0 \r\n-0.255342 -0.0335249 0.789755 0 \r\n0.217148 0.765566 -0.110729 0 \r\n0.181116 0.770117 -0.112193 0 \r\n0.206086 0.77338 -0.129065 0 \r\n-0.0302693 -0.441692 0.655658 0 \r\n-0.0446377 -0.413607 0.684411 0 \r\n0.145803 0.715524 -0.0131697 0 \r\n0.161647 0.702331 0.00782066 0 \r\n-0.101195 -0.75506 0.491048 0 \r\n-0.0799468 -0.755464 0.479986 0 \r\n-0.0966642 -0.75095 0.47194 0 \r\n0.416663 -0.499907 -0.780546 0 \r\n0.438486 -0.497223 -0.77425 0 \r\n0.435933 -0.516156 -0.787145 0 \r\n-0.0304451 0.498321 -0.927148 0 \r\n-0.043006 0.501148 -0.915269 0 \r\n-0.0327367 0.812204 -0.770122 0 \r\n-0.0227103 0.826783 -0.774378 0 \r\n0.204353 0.190836 -0.930365 0 \r\n0.223161 0.188864 -0.926139 0 \r\n-0.178708 0.466973 -0.900872 0 \r\n-0.162947 0.466637 -0.908723 0 \r\n-0.179411 0.474896 -0.889042 0 \r\n-0.0240541 -0.268952 -0.934292 0 \r\n-0.0177072 -0.280158 -0.943475 0 \r\n0.00559141 -0.263552 -0.939131 0 \r\n0.0489221 -0.296342 0.502094 0 \r\n0.0558957 -0.315448 0.491624 0 \r\n0.112765 -0.548257 -0.981068 0 \r\n0.147695 -0.536169 -0.978809 0 \r\n0.123169 -0.51206 -0.978841 0 \r\n-0.312443 -0.626866 0.478658 0 \r\n-0.249528 -0.623029 0.464453 0 \r\n-0.266277 -0.615633 0.475042 0 \r\n-0.578575 -0.741032 0.789563 0 \r\n-0.557296 -0.747432 0.779477 0 \r\n-0.579976 -0.728866 0.777241 0 \r\n-0.0673994 -0.763322 0.197228 0 \r\n-0.0644711 -0.770575 0.173051 0 \r\n-0.0701544 -0.750862 0.17138 0 \r\n0.223164 -0.694134 0.594887 0 \r\n0.217912 -0.702937 0.594 0 \r\n0.206846 -0.69117 0.593953 0 \r\n0.26091 0.782698 -0.881305 0 \r\n0.250116 0.804002 -0.872558 0 \r\n0.237478 0.785277 -0.884799 0 \r\n-0.311338 0.0580614 -0.881471 0 \r\n-0.315656 0.0401876 -0.876221 0 \r\n-0.314211 0.0364936 -0.886029 0 \r\n0.662605 0.054829 -0.146022 0 \r\n0.660426 0.0266773 -0.151781 0 \r\n0.651673 0.0320783 -0.14766 0 \r\n-0.396648 0.258564 -0.23117 0 \r\n-0.388625 0.280775 -0.231549 0 \r\n0.667233 0.406011 -0.667976 0 \r\n0.68258 0.387976 -0.649789 0 \r\n0.672188 0.408668 -0.643907 0 \r\n-0.28396 -0.656534 0.459031 0 \r\n-0.309067 -0.652966 0.464525 0 \r\n-0.314842 -0.662912 0.464546 0 \r\n-0.0979386 -0.641927 0.640663 0 \r\n-0.118086 -0.634934 0.644565 0 \r\n-0.197571 0.355326 0.0471304 0 \r\n-0.193276 0.383031 0.0355439 0 \r\n0.350985 -0.476729 0.522479 0 \r\n0.373849 -0.489033 0.529525 0 \r\n0.35471 -0.485838 0.543756 0 \r\n-0.417529 -0.0280615 -0.203361 0 \r\n-0.405172 -0.0218215 -0.193534 0 \r\n-0.406149 -0.0420819 -0.200055 0 \r\n0.193435 0.841513 -0.460845 0 \r\n0.171927 0.831245 -0.461812 0 \r\n-0.434057 0.191764 -0.422554 0 \r\n-0.432478 0.201367 -0.403493 0 \r\n-0.435918 0.18905 -0.405878 0 \r\n-0.342261 -0.0911633 -0.942698 0 \r\n-0.346204 -0.116249 -0.953275 0 \r\n-0.337898 -0.0881388 -0.95116 0 \r\n0.519652 -0.175145 -0.0126296 0 \r\n0.521141 -0.193402 -0.0188919 0 \r\n0.508419 -0.187126 0.00322998 0 \r\n-0.334652 -0.153257 -0.582452 0 \r\n-0.150261 -0.757248 0.518048 0 \r\n-0.179552 -0.753986 0.514619 0 \r\n-0.169436 -0.758582 0.530179 0 \r\n0.315242 0.271425 -0.940701 0 \r\n0.29673 0.264131 -0.94583 0 \r\n0.304492 0.257645 -0.938588 0 \r\n-0.168956 -0.701186 -0.163754 0 \r\n-0.166559 -0.715555 -0.187532 0 \r\n-0.178073 -0.700946 -0.20304 0 \r\n-0.00528648 -0.853407 -0.374043 0 \r\n-0.0309878 -0.837839 -0.375903 0 \r\n-0.0225677 -0.851259 -0.353909 0 \r\n-0.596478 -0.770988 0.841197 0 \r\n-0.580392 -0.780317 0.836398 0 \r\n-0.584267 -0.772377 0.829223 0 \r\n-0.0675109 -0.620327 0.391557 0 \r\n-0.0688553 -0.633119 0.38544 0 \r\n-0.0625841 -0.622486 0.377984 0 \r\n0.528227 -0.315488 -0.0387549 0 \r\n0.534355 -0.320757 -0.0495419 0 \r\n-0.172126 -0.0490545 0.668815 0 \r\n-0.163461 -0.0333926 0.658329 0 \r\n-0.185373 -0.0180227 0.679799 0 \r\n-0.115903 -0.472331 -0.979837 0 \r\n-0.0833167 -0.526076 -0.979753 0 \r\n-0.0884687 -0.494461 -0.98365 0 \r\n0.750132 -0.0108047 -0.416784 0 \r\n0.751657 0.0105255 -0.427727 0 \r\n-0.138847 -0.299788 -0.804222 0 \r\n-0.157088 -0.298241 -0.808467 0 \r\n-0.141504 -0.280664 -0.792518 0 \r\n-0.0500133 0.37211 0.206672 0 \r\n-0.0715065 0.382741 0.185944 0 \r\n-0.0579536 0.403702 0.188579 0 \r\n0.292471 -0.310285 0.206423 0 \r\n0.318355 -0.314079 0.190307 0 \r\n0.299246 -0.32486 0.202635 0 \r\n-0.246783 -0.578336 0.539642 0 \r\n-0.240472 -0.57445 0.54898 0 \r\n-0.268915 -0.577938 0.544047 0 \r\n0.426314 0.343232 -0.939942 0 \r\n0.433821 0.331823 -0.933944 0 \r\n0.443648 0.348457 -0.942303 0 \r\n0.213955 0.589137 0.144702 0 \r\n0.214108 0.607037 0.127887 0 \r\n-0.145926 -0.746223 0.675213 0 \r\n-0.0998186 -0.741098 0.655668 0 \r\n0.512439 -0.648839 -0.928823 0 \r\n0.532799 -0.64142 -0.924552 0 \r\n0.529789 -0.64256 -0.936723 0 \r\n0.324493 -0.469223 0.518754 0 \r\n0.309384 -0.469759 0.531792 0 \r\n0.302033 -0.465447 0.513835 0 \r\n0.0401196 0.821382 -0.83772 0 \r\n0.0516673 0.814378 -0.850064 0 \r\n0.0562304 0.837419 -0.834304 0 \r\n0.0933341 0.737123 -0.906749 0 \r\n0.0754791 0.706528 -0.915524 0 \r\n0.590986 -0.0744638 -0.1243 0 \r\n0.586757 -0.083134 -0.115162 0 \r\n0.583099 -0.0688868 -0.102911 0 \r\n0.280828 -0.293238 -0.964962 0 \r\n0.256406 -0.297413 -0.964437 0 \r\n0.277351 -0.308939 -0.964799 0 \r\n0.1673 -0.929182 0.476017 0 \r\n0.168752 -0.93098 0.454802 0 \r\n0.152903 -0.919258 0.466403 0 \r\n0.277062 0.304299 -0.963637 0 \r\n0.254432 0.301664 -0.965043 0 \r\n0.588443 -0.163162 -0.344205 0 \r\n0.588957 -0.155612 -0.370885 0 \r\n0.574663 -0.161862 -0.380544 0 \r\n0.49799 -0.202367 0.0148113 0 \r\n0.502639 -0.229012 0.00555173 0 \r\n-0.141984 -0.267686 0.6863 0 \r\n-0.137128 -0.28326 0.693377 0 \r\n-0.123864 -0.303747 0.664644 0 \r\n0.304943 0.791923 -0.45556 0 \r\n0.305716 0.790444 -0.443001 0 \r\n0.28695 0.796063 -0.443344 0 \r\n0.159852 0.243735 0.282623 0 \r\n0.149136 0.246677 0.282379 0 \r\n0.15811 0.252825 0.282799 0 \r\n0.705891 -0.684864 0.119004 0 \r\n0.704216 -0.667953 0.120561 0 \r\n0.702659 -0.680102 0.104005 0 \r\n0.0959696 -0.852486 -0.432829 0 \r\n0.113568 -0.839375 -0.456759 0 \r\n0.0851927 -0.836521 -0.452488 0 \r\n0.391972 -0.942477 0.434889 0 \r\n0.392916 -0.942841 0.44425 0 \r\n0.410572 -0.938514 0.437935 0 \r\n0.738209 0.309025 -0.520028 0 \r\n0.738914 0.301647 -0.533435 0 \r\n-0.088285 -0.397028 -0.792965 0 \r\n-0.0877936 -0.397268 -0.767986 0 \r\n-0.0830365 -0.419802 -0.774307 0 \r\n0.222865 0.224124 0.279359 0 \r\n0.2038 0.218987 0.280262 0 \r\n0.21795 0.237723 0.280625 0 \r\n0.658662 0.278897 -0.793789 0 \r\n0.648083 0.293419 -0.805859 0 \r\n0.57623 0.195557 -0.0277364 0 \r\n0.576173 0.213634 -0.036074 0 \r\n0.57927 0.188215 -0.0433247 0 \r\n0.122076 -0.645629 -0.845894 0 \r\n0.142687 -0.613678 -0.835119 0 \r\n0.138516 -0.635795 -0.85101 0 \r\n0.464334 -0.735711 -0.456106 0 \r\n0.451181 -0.751559 -0.456366 0 \r\n0.472162 -0.742159 -0.44344 0 \r\n0.441334 -0.817481 -0.371937 0 \r\n0.43047 -0.818583 -0.384705 0 \r\n-0.363854 -0.0676603 -0.722869 0 \r\n-0.367165 -0.0763502 -0.698395 0 \r\n-0.352012 -0.0809995 -0.723109 0 \r\n0.405374 0.353033 -0.950424 0 \r\n0.42717 0.376822 -0.95486 0 \r\n0.396403 0.369989 -0.956982 0 \r\n-0.140646 0.138522 -0.904529 0 \r\n-0.118864 0.175287 -0.900449 0 \r\n-0.133829 0.176365 -0.906705 0 \r\n0.47788 -0.748709 -0.42768 0 \r\n0.464728 -0.764557 -0.42794 0 \r\n0.0153153 -0.13458 0.603017 0 \r\n0.021699 -0.152289 0.590928 0 \r\n0.0291178 -0.15766 0.599209 0 \r\n-0.0873335 0.0905507 -0.896485 0 \r\n0.0265999 -0.560206 0.51164 0 \r\n0.0215527 -0.553538 0.497217 0 \r\n0.0223699 -0.54556 0.505197 0 \r\n0.584412 -0.494516 -0.14435 0 \r\n0.580583 -0.50672 -0.131046 0 \r\n0.580925 -0.473115 -0.129765 0 \r\n0.122299 0.266943 -0.968732 0 \r\n0.131775 0.253661 -0.966976 0 \r\n0.546263 -0.647148 0.0182782 0 \r\n0.544327 -0.623628 0.0313528 0 \r\n-0.390531 0.121385 -0.718661 0 \r\n-0.384048 0.116388 -0.734301 0 \r\n-0.380696 0.134896 -0.735064 0 \r\n0.154727 -0.182944 -0.940644 0 \r\n0.158258 -0.17125 -0.934618 0 \r\n0.1471 -0.179442 -0.936679 0 \r\n-0.343072 -0.0704376 -0.771753 0 \r\n-0.0674248 -0.0743954 0.693143 0 \r\n-0.0690109 -0.0831528 0.697756 0 \r\n-0.0835138 -0.0568032 0.700916 0 \r\n-0.00189531 -0.555019 0.436498 0 \r\n0.00528116 -0.545856 0.43944 0 \r\n-0.139891 -0.584347 0.0463574 0 \r\n-0.133739 -0.573993 0.0642519 0 \r\n0.448343 -0.529687 -0.972416 0 \r\n0.468702 -0.533544 -0.972692 0 \r\n0.457651 -0.513725 -0.972147 0 \r\n-0.687955 -0.685816 0.918768 0 \r\n-0.700094 -0.66335 0.916858 0 \r\n-0.253636 -0.262828 -0.325079 0 \r\n-0.253486 -0.279274 -0.314321 0 \r\n-0.244282 -0.278044 -0.341561 0 \r\n-0.0146799 -0.254478 0.843102 0 \r\n0.005995 -0.263958 0.823635 0 \r\n0.0067556 -0.283014 0.815271 0 \r\n-0.582838 -0.774628 0.871403 0 \r\n-0.601071 -0.76369 0.885272 0 \r\n0.475524 -0.481997 -0.766657 0 \r\n0.471125 -0.505265 -0.777876 0 \r\n0.462155 -0.490203 -0.769629 0 \r\n0.490696 0.137993 0.156059 0 \r\n0.493513 0.121468 0.1492 0 \r\n0.478296 0.118054 0.16779 0 \r\n-0.0107435 -0.212574 0.844616 0 \r\n-0.0343519 -0.186446 0.874968 0 \r\n-0.0263957 -0.190851 0.85932 0 \r\n0.699323 -0.761767 0.294582 0 \r\n0.702545 -0.782133 0.279422 0 \r\n0.693092 -0.782367 0.303869 0 \r\n0.301882 -0.597769 -0.956849 0 \r\n0.294701 -0.600356 -0.965376 0 \r\n0.268744 -0.604484 -0.95915 0 \r\n-0.626945 -0.709105 0.795249 0 \r\n-0.61476 -0.704863 0.769121 0 \r\n-0.64045 -0.691504 0.777043 0 \r\n0.574865 -0.159076 -0.773745 0 \r\n0.558273 -0.156051 -0.765279 0 \r\n0.578839 -0.139979 -0.766019 0 \r\n-0.0426138 0.530156 -0.890038 0 \r\n-0.0579318 0.542225 -0.867096 0 \r\n-0.0605881 0.523899 -0.879798 0 \r\n0.0183199 -0.334172 0.233397 0 \r\n0.0371119 -0.30832 0.230449 0 \r\n0.0407303 -0.328023 0.235591 0 \r\n0.0607235 0.402109 -0.965906 0 \r\n0.0677406 0.383534 -0.966532 0 \r\n0.0830809 0.390197 -0.96523 0 \r\n-0.231973 -0.529766 -0.388226 0 \r\n-0.223591 -0.543601 -0.413944 0 \r\n-0.229009 -0.519188 -0.397355 0 \r\n-0.242739 0.600842 -0.432382 0 \r\n-0.254978 0.585718 -0.428385 0 \r\n-0.255596 0.583321 -0.454983 0 \r\n0.179363 -0.672591 -0.619282 0 \r\n0.15705 -0.683783 -0.610609 0 \r\n0.168914 -0.698085 -0.603292 0 \r\n0.0748056 -0.38322 0.725331 0 \r\n0.0674947 -0.364794 0.736699 0 \r\n0.0816707 -0.375262 0.720641 0 \r\n0.403174 -0.485827 0.396647 0 \r\n0.397851 -0.48362 0.41728 0 \r\n0.42305 0.499707 0.145792 0 \r\n0.438937 0.489428 0.133252 0 \r\n0.660592 0.493657 -0.321082 0 \r\n0.666512 0.476364 -0.303315 0 \r\n0.651461 0.49951 -0.292013 0 \r\n0.520756 -0.687505 -0.077067 0 \r\n0.51632 -0.707978 -0.0853039 0 \r\n0.556644 -0.170809 -0.95316 0 \r\n0.566559 -0.155366 -0.954566 0 \r\n0.557697 -0.156852 -0.950752 0 \r\n0.134333 -0.916098 -0.311597 0 \r\n0.130774 -0.908049 -0.335408 0 \r\n0.114912 -0.909438 -0.322278 0 \r\n0.484225 -0.447246 -0.75798 0 \r\n0.469418 -0.446887 -0.740466 0 \r\n0.487089 -0.427197 -0.740036 0 \r\n-0.29016 0.300117 -0.872297 0 \r\n-0.294918 0.309534 -0.855889 0 \r\n-0.0657246 -0.587242 0.512855 0 \r\n-0.0739709 -0.588093 0.525935 0 \r\n0.563166 0.632688 -0.340279 0 \r\n0.575333 0.619691 -0.331205 0 \r\n0.661884 -0.145039 -0.812943 0 \r\n0.664172 -0.124688 -0.813258 0 \r\n0.682362 -0.124951 -0.824672 0 \r\n-0.0144386 -0.686328 -0.924343 0 \r\n-0.0224882 -0.663743 -0.906586 0 \r\n0.00194508 -0.686444 -0.904503 0 \r\n0.128204 -0.605448 -0.820549 0 \r\n0.112481 -0.620175 -0.824159 0 \r\n0.396216 0.751169 -0.55746 0 \r\n0.395339 0.752559 -0.578987 0 \r\n-0.0353554 0.0209857 0.196502 0 \r\n-0.0567644 0.0232789 0.185798 0 \r\n-0.0412493 0.0396636 0.197929 0 \r\n0.225993 -0.439161 -0.774921 0 \r\n0.2257 -0.445 -0.786689 0 \r\n0.210592 -0.445462 -0.772929 0 \r\n0.371302 0.916707 -0.694076 0 \r\n0.386389 0.907991 -0.681884 0 \r\n0.363203 0.931607 -0.671897 0 \r\n-0.195713 -0.0222009 0.0533565 0 \r\n-0.201434 -0.0581803 0.037956 0 \r\n-0.219149 -0.0503905 0.0181885 0 \r\n-0.19 0.0166145 -0.92235 0 \r\n-0.185841 -0.0204736 -0.920367 0 \r\n-0.173325 0.010721 -0.912789 0 \r\n-0.295902 -0.164706 -0.592375 0 \r\n-0.31585 -0.155917 -0.594477 0 \r\n0.508227 -0.548487 -0.00303485 0 \r\n0.513239 -0.528417 -0.009294 0 \r\n0.51824 -0.56393 -0.0225237 0 \r\n0.0279825 -0.177866 0.576889 0 \r\n0.0141801 -0.154785 0.580696 0 \r\n-0.122132 -0.0870565 0.765136 0 \r\n-0.144551 -0.0698557 0.789246 0 \r\n-0.152903 -0.0477922 0.779674 0 \r\n0.704485 -0.79912 0.176268 0 \r\n0.701264 -0.815495 0.202681 0 \r\n0.324524 -0.984591 0.221884 0 \r\n0.299272 -0.983765 0.230242 0 \r\n0.317198 -0.977232 0.246543 0 \r\n0.214365 0.802434 -0.412339 0 \r\n0.21858 0.801521 -0.397144 0 \r\n0.191076 0.802782 -0.393021 0 \r\n-0.0942785 -0.374523 -0.761501 0 \r\n-0.08903 -0.397296 -0.742844 0 \r\n0.496839 -0.403784 0.0138215 0 \r\n0.509783 -0.412086 -0.00236601 0 \r\n0.496953 -0.422178 0.0146101 0 \r\n0.643709 -0.228599 -0.910334 0 \r\n0.627303 -0.246852 -0.920694 0 \r\n0.630329 -0.240532 -0.903983 0 \r\n0.310894 -0.931832 0.0440486 0 \r\n0.292066 -0.944113 0.0509282 0 \r\n0.366445 0.322173 0.247665 0 \r\n0.363732 0.360338 0.240847 0 \r\n0.377558 0.346013 0.236369 0 \r\n0.149604 -0.687495 -0.892207 0 \r\n0.167041 -0.676111 -0.899026 0 \r\n0.159983 -0.687198 -0.904411 0 \r\n0.300045 -0.453068 0.442833 0 \r\n0.275453 -0.453093 0.458865 0 \r\n0.278354 -0.449057 0.435683 0 \r\n-0.222935 0.392599 -0.0577052 0 \r\n-0.224568 0.375254 -0.0505536 0 \r\n0.156377 -0.618852 0.585787 0 \r\n0.14623 -0.605947 0.584189 0 \r\n-0.138665 0.556934 0.00314909 0 \r\n-0.155665 0.540087 -0.0104422 0 \r\n-0.149688 0.561239 -0.0199109 0 \r\n0.599925 -0.637613 0.0445 0 \r\n0.578238 -0.629099 0.0436647 0 \r\n0.583997 -0.644291 0.0331168 0 \r\n-0.763892 -0.591419 0.837446 0 \r\n-0.762773 -0.586104 0.828532 0 \r\n-0.0362083 0.0962372 -0.899271 0 \r\n-0.0174406 0.127549 -0.899665 0 \r\n-0.0483712 0.111112 -0.897794 0 \r\n-0.00948067 -0.336677 0.797636 0 \r\n-0.0266862 -0.335895 0.798404 0 \r\n0.113105 -0.497227 -0.695244 0 \r\n0.0906936 -0.501829 -0.694798 0 \r\n0.102153 -0.503793 -0.686956 0 \r\n-0.225945 0.221675 -0.977169 0 \r\n-0.237771 0.182981 -0.978962 0 \r\n-0.0550667 -0.57265 0.315973 0 \r\n-0.0595967 -0.572809 0.298146 0 \r\n0.568567 -0.24865 -0.392218 0 \r\n0.570626 -0.257342 -0.384549 0 \r\n0.569786 -0.243355 -0.371132 0 \r\n-0.382217 -0.16563 -0.283251 0 \r\n-0.373568 -0.180117 -0.301521 0 \r\n-0.39281 -0.167228 -0.302258 0 \r\n-0.0621919 -0.438937 0.20953 0 \r\n-0.0473626 -0.408036 0.216135 0 \r\n-0.0407823 -0.434425 0.224151 0 \r\n0.522946 -0.335894 -0.0286724 0 \r\n0.517722 -0.325144 -0.0202071 0 \r\n0.570876 -0.113164 -0.087594 0 \r\n0.577475 -0.134423 -0.1099 0 \r\n0.565371 -0.130011 -0.0799609 0 \r\n0.176142 0.821232 -0.452288 0 \r\n0.146558 0.824635 -0.45443 0 \r\n-0.0996179 0.191588 -0.898549 0 \r\n-0.0828425 0.190291 -0.895718 0 \r\n-0.0952716 0.211833 -0.899794 0 \r\n0.130648 0.973342 -0.513431 0 \r\n0.153194 0.979034 -0.513666 0 \r\n-0.105783 0.0228535 0.666839 0 \r\n-0.0748986 -0.00291797 0.655196 0 \r\n-0.0944573 0.0108206 0.671471 0 \r\n-0.117025 -0.799139 -0.223384 0 \r\n-0.119251 -0.791405 -0.202826 0 \r\n-0.103361 -0.807885 -0.193983 0 \r\n0.594664 0.311521 -0.0780874 0 \r\n0.599919 0.323776 -0.0821847 0 \r\n0.315704 -0.112394 0.180755 0 \r\n0.290452 -0.12031 0.188429 0 \r\n0.589305 -0.625277 0.294696 0 \r\n0.599261 -0.621338 0.268977 0 \r\n0.611323 -0.637784 0.285259 0 \r\n-0.240929 -0.534449 -0.302442 0 \r\n-0.244879 -0.515634 -0.304457 0 \r\n-0.245266 -0.517913 -0.277802 0 \r\n0.465584 -0.920771 0.0351973 0 \r\n0.482825 -0.927746 0.0374854 0 \r\n0.479759 -0.912632 0.0288728 0 \r\n-0.355479 0.357713 -0.665699 0 \r\n-0.348573 0.379903 -0.67376 0 \r\n-0.352691 0.381329 -0.648349 0 \r\n0.0237251 0.388365 -0.967549 0 \r\n0.0274264 0.363394 -0.968058 0 \r\n0.0490846 0.370476 -0.967717 0 \r\n-0.423467 -0.0767155 -0.232645 0 \r\n-0.0261357 -0.258714 -0.926547 0 \r\n-0.0494343 -0.27532 -0.93089 0 \r\n0.577869 -0.174688 -0.323731 0 \r\n0.56728 -0.179763 -0.366429 0 \r\n0.571 -0.185039 -0.336295 0 \r\n0.276838 0.0846618 0.257751 0 \r\n0.143485 -0.491046 -0.760692 0 \r\n0.140045 -0.509203 -0.773854 0 \r\n-0.158875 -0.747121 0.489772 0 \r\n-0.191965 -0.740613 0.485388 0 \r\n-0.193466 -0.746143 0.498104 0 \r\n0.164281 -0.195322 -0.949941 0 \r\n0.177072 -0.193852 -0.951586 0 \r\n0.184448 -0.180201 -0.946499 0 \r\n0.210871 -0.309056 -0.964566 0 \r\n0.228251 -0.322276 -0.964514 0 \r\n0.23555 -0.299893 -0.964324 0 \r\n-0.174435 -0.627687 -0.0655374 0 \r\n-0.177675 -0.634394 -0.0865106 0 \r\n-0.183504 -0.621059 -0.0841058 0 \r\n-0.031558 -0.200578 0.873111 0 \r\n-0.0472101 -0.178855 0.887814 0 \r\n0.187082 -0.615234 -0.97769 0 \r\n0.211756 -0.582492 -0.976406 0 \r\n-0.364613 -0.0120302 -0.177763 0 \r\n-0.353491 0.0014423 -0.17184 0 \r\n-0.378844 -0.740178 0.789869 0 \r\n-0.381953 -0.756485 0.788987 0 \r\n-0.424529 -0.747504 0.809917 0 \r\n0.168307 -0.810494 0.577195 0 \r\n0.130435 -0.800661 0.575254 0 \r\n0.503837 -0.145837 -0.664703 0 \r\n0.511584 -0.126108 -0.65897 0 \r\n0.572339 -0.644574 -0.365183 0 \r\n0.568043 -0.669191 -0.347547 0 \r\n0.580209 -0.642321 -0.339593 0 \r\n0.59525 -0.268423 -0.892728 0 \r\n0.580271 -0.276443 -0.880769 0 \r\n0.588537 -0.2632 -0.875381 0 \r\n0.240193 0.150367 0.27468 0 \r\n0.224709 0.141256 0.273897 0 \r\n0.220585 0.149531 0.275194 0 \r\n0.661251 -0.620934 0.117541 0 \r\n0.670579 -0.631108 0.105375 0 \r\n0.396636 0.758806 -0.589515 0 \r\n0.399868 0.76678 -0.603477 0 \r\n-0.180564 -0.0529017 -0.916384 0 \r\n-0.19724 -0.0470082 -0.925945 0 \r\n-0.132588 -0.265921 -0.783352 0 \r\n-0.132135 -0.241547 -0.769736 0 \r\n-0.122811 -0.257837 -0.774658 0 \r\n-0.148798 0.466745 -0.91362 0 \r\n-0.131957 0.46082 -0.927391 0 \r\n-0.11851 0.468852 -0.920459 0 \r\n0.469573 0.479742 -0.94949 0 \r\n0.441033 0.486699 -0.951414 0 \r\n0.463809 0.467871 -0.95659 0 \r\n-0.225416 0.571902 -0.193792 0 \r\n-0.226839 0.557774 -0.177361 0 \r\n-0.24129 0.552585 -0.205312 0 \r\n-0.274229 -0.217323 -0.444499 0 \r\n-0.289394 -0.2077 -0.463783 0 \r\n0.326241 0.0998999 0.253501 0 \r\n0.343669 0.0883507 0.245396 0 \r\n0.32276 0.0759196 0.246818 0 \r\n0.672364 -0.0181311 -0.822953 0 \r\n0.685065 -0.0168543 -0.842412 0 \r\n0.459254 0.532865 -0.904961 0 \r\n0.472359 0.524553 -0.909373 0 \r\n0.479348 0.530769 -0.898174 0 \r\n0.0413565 0.686543 0.0096801 0 \r\n0.0174726 0.67987 0.0120517 0 \r\n-0.581679 -0.63781 0.550615 0 \r\n-0.54873 -0.6286 0.554361 0 \r\n-0.573197 -0.623438 0.567415 0 \r\n-0.275333 -0.247216 -0.295956 0 \r\n-0.28137 -0.234437 -0.273534 0 \r\n-0.268876 -0.251278 -0.275416 0 \r\n-0.336567 0.296526 -0.175623 0 \r\n-0.351073 0.273978 -0.180543 0 \r\n0.394571 0.904981 -0.639765 0 \r\n0.380287 0.921495 -0.637841 0 \r\n0.392574 0.906377 -0.661628 0 \r\n-0.120697 -0.399769 -0.630084 0 \r\n-0.110964 -0.42079 -0.636196 0 \r\n-0.106577 -0.408412 -0.664288 0 \r\n-0.119772 0.0141122 0.700692 0 \r\n-0.133496 0.0356738 0.696671 0 \r\n-0.111618 0.0150305 0.687135 0 \r\n0.520087 0.267301 0.111092 0 \r\n0.514894 0.248395 0.121261 0 \r\n0.506343 0.262035 0.133454 0 \r\n0.0130615 0.247217 -0.924499 0 \r\n0.0341105 0.235211 -0.925118 0 \r\n0.0199781 0.258299 -0.931506 0 \r\n0.0937112 0.817958 -0.860919 0 \r\n0.0798466 0.78137 -0.880339 0 \r\n0.105716 0.800924 -0.87333 0 \r\n0.746282 0.284671 -0.488158 0 \r\n0.747569 0.284096 -0.467892 0 \r\n-0.425281 -0.72489 0.538033 0 \r\n-0.441547 -0.721022 0.535076 0 \r\n-0.435378 -0.722119 0.54249 0 \r\n0.383079 0.890729 -0.557455 0 \r\n0.381512 0.901132 -0.564844 0 \r\n0.396647 0.886423 -0.579745 0 \r\n0.524227 0.280791 -0.948217 0 \r\n0.610016 -0.585423 0.136784 0 \r\n0.597134 -0.575943 0.148241 0 \r\n0.551787 -0.326913 -0.572345 0 \r\n-0.614404 -0.581692 0.765526 0 \r\n-0.637321 -0.57757 0.766065 0 \r\n-0.610012 -0.578784 0.744741 0 \r\n0.0897407 -0.918823 -0.199172 0 \r\n0.068355 -0.911955 -0.217276 0 \r\n0.0683825 -0.911353 -0.191496 0 \r\n-0.0455124 -0.496394 0.257911 0 \r\n-0.048709 -0.510831 0.263037 0 \r\n-0.0525218 -0.506302 0.248396 0 \r\n0.210355 0.427683 -0.955023 0 \r\n0.192711 0.419033 -0.955673 0 \r\n0.66564 -0.0977269 -0.807128 0 \r\n0.658957 -0.0675913 -0.800565 0 \r\n0.173382 -0.900914 -0.00526688 0 \r\n0.198296 -0.900261 -0.00791503 0 \r\n0.176537 -0.897375 -0.0137648 0 \r\n0.506842 -0.569696 0.00343235 0 \r\n0.510379 -0.589237 -0.00145765 0 \r\n0.503993 -0.574934 0.0182393 0 \r\n-0.00575753 -0.867971 -0.327239 0 \r\n-0.0314589 -0.852403 -0.329099 0 \r\n0.0161507 0.135388 0.249195 0 \r\n0.0374311 0.10239 0.248313 0 \r\n0.0132405 0.100481 0.239326 0 \r\n0.495557 0.343984 0.121385 0 \r\n0.505648 0.346355 0.0995686 0 \r\n0.51258 0.317877 0.102277 0 \r\n0.139473 -0.388112 0.304108 0 \r\n0.133161 -0.378943 0.289715 0 \r\n0.453568 -0.796362 -0.0244262 0 \r\n0.424793 -0.812356 -0.0251765 0 \r\n0.425463 -0.820516 -0.0144663 0 \r\n-0.0925824 -0.36351 0.654683 0 \r\n-0.079054 -0.382401 0.635158 0 \r\n-0.0816948 -0.380014 0.622416 0 \r\n-0.0657485 -0.613394 -0.907206 0 \r\n-0.0674518 -0.617058 -0.918573 0 \r\n-0.0786337 -0.600645 -0.91908 0 \r\n0.216314 -0.95604 0.445163 0 \r\n0.20829 -0.951436 0.43614 0 \r\n0.201762 -0.950497 0.449396 0 \r\n0.634671 -0.238903 -0.944099 0 \r\n0.629571 -0.249105 -0.933507 0 \r\n0.645784 -0.224717 -0.937639 0 \r\n0.0666206 -0.0801803 0.207496 0 \r\n0.0455659 -0.0553117 0.208223 0 \r\n0.0609269 -0.0468682 0.213519 0 \r\n0.579151 0.294721 -0.0590744 0 \r\n0.5838 0.305825 -0.0629013 0 \r\n0.593398 0.285528 -0.0818209 0 \r\n-0.360839 0.320326 -0.213707 0 \r\n0.490851 -0.75089 -0.0794286 0 \r\n0.487816 -0.765014 -0.100145 0 \r\n0.479862 -0.765796 -0.081545 0 \r\n0.0155602 0.893889 -0.571859 0 \r\n0.0329992 0.899487 -0.548354 0 \r\n0.0192154 0.878101 -0.562191 0 \r\n-0.167539 -0.622988 -0.0452782 0 \r\n-0.173368 -0.609653 -0.0428733 0 \r\n0.220904 0.665235 0.0591674 0 \r\n0.215117 0.675279 0.0456726 0 \r\n0.169221 -0.432748 0.42473 0 \r\n0.192658 -0.436344 0.435097 0 \r\n-0.25863 -0.30853 -0.178319 0 \r\n-0.262459 -0.268915 -0.179109 0 \r\n-0.259413 -0.282769 -0.154189 0 \r\n-0.378281 -0.0413311 -0.186715 0 \r\n-0.380125 -0.00654095 -0.181277 0 \r\n0.520637 -0.25758 -0.778742 0 \r\n0.526847 -0.289986 -0.772055 0 \r\n0.519189 -0.267222 -0.754519 0 \r\n0.466046 -0.827538 -0.232754 0 \r\n0.45252 -0.839954 -0.247349 0 \r\n0.448743 -0.841864 -0.223972 0 \r\n0.403485 -0.45216 -0.742776 0 \r\n0.421592 -0.463657 -0.748456 0 \r\n0.401109 -0.469476 -0.761972 0 \r\n0.19622 -0.881761 0.562881 0 \r\n0.222803 -0.889749 0.563601 0 \r\n0.208344 -0.904893 0.556317 0 \r\n0.407874 0.437457 0.19188 0 \r\n0.390182 0.452617 0.197296 0 \r\n0.407428 0.455932 0.183261 0 \r\n0.496132 0.237406 -0.926129 0 \r\n0.491697 0.266347 -0.929796 0 \r\n0.415506 -0.77683 -0.458006 0 \r\n0.436965 -0.763982 -0.454877 0 \r\n0.421893 -0.75796 -0.47216 0 \r\n0.543435 -0.079059 -0.92853 0 \r\n0.551808 -0.0767378 -0.933084 0 \r\n0.549993 -0.0613975 -0.928931 0 \r\n0.287288 -0.587003 -0.928465 0 \r\n0.291734 -0.595395 -0.94174 0 \r\n0.271479 -0.593506 -0.937348 0 \r\n-0.539927 -0.598379 0.767938 0 \r\n-0.581949 -0.59277 0.768852 0 \r\n-0.545073 -0.588513 0.743289 0 \r\n-0.223294 -0.441702 -0.0400266 0 \r\n-0.21882 -0.426516 -0.0197163 0 \r\n-0.218267 -0.452591 -0.0301143 0 \r\n-0.208901 0.03626 0.0455532 0 \r\n-0.214689 0.0604376 0.041937 0 \r\n-0.196234 0.0589537 0.0661768 0 \r\n0.582088 0.515578 -0.707077 0 \r\n0.589366 0.498607 -0.7178 0 \r\n-0.0916644 -0.82594 -0.242112 0 \r\n-0.103897 -0.814973 -0.233049 0 \r\n-0.0889019 -0.826586 -0.223603 0 \r\n0.462404 -0.945037 0.053372 0 \r\n0.44854 -0.933154 0.0453561 0 \r\n0.442293 -0.942307 0.0549181 0 \r\n0.189942 -0.210341 -0.959009 0 \r\n0.154915 -0.227444 -0.960334 0 \r\n0.187952 -0.228812 -0.964314 0 \r\n0.656545 -0.893664 0.239892 0 \r\n0.66386 -0.87646 0.26174 0 \r\n-0.175851 0.0411889 0.670579 0 \r\n-0.16495 0.0185627 0.661734 0 \r\n-0.157884 0.0259509 0.659098 0 \r\n-0.189619 -0.205711 -0.769943 0 \r\n-0.182583 -0.222574 -0.774696 0 \r\n-0.207741 -0.215611 -0.779052 0 \r\n0.5896 -0.254654 -0.861142 0 \r\n0.604578 -0.246634 -0.873101 0 \r\n0.377346 0.895845 -0.726259 0 \r\n0.379577 0.88565 -0.743724 0 \r\n0.396719 0.882895 -0.721528 0 \r\n0.652586 0.393979 -0.16292 0 \r\n0.667119 0.384459 -0.179319 0 \r\n0.659544 0.374076 -0.162742 0 \r\n0.150989 -0.917699 0.0174886 0 \r\n0.134301 -0.903508 0.00685096 0 \r\n0.122195 -0.909191 0.0151897 0 \r\n-0.206441 -0.640161 -0.251737 0 \r\n-0.210356 -0.631845 -0.263538 0 \r\n-0.207895 -0.633418 -0.24428 0 \r\n0.179303 0.787969 -0.173494 0 \r\n0.144066 0.792234 -0.188611 0 \r\n-0.363932 -0.167598 -0.511518 0 \r\n-0.347139 -0.170272 -0.52307 0 \r\n0.763943 0.208367 -0.331664 0 \r\n0.764073 0.213001 -0.3401 0 \r\n0.767118 0.194302 -0.345686 0 \r\n-0.502051 -0.625774 0.788234 0 \r\n-0.480413 -0.621445 0.777215 0 \r\n-0.477999 -0.63196 0.786268 0 \r\n0.199489 -0.615875 -0.883274 0 \r\n0.214352 -0.61397 -0.897401 0 \r\n0.193978 -0.635811 -0.893193 0 \r\n0.384968 -0.944863 0.449656 0 \r\n0.370996 -0.947327 0.454948 0 \r\n0.381647 -0.945387 0.463399 0 \r\n0.488516 -0.921323 0.408165 0 \r\n0.46782 -0.927518 0.40996 0 \r\n0.466227 -0.9245 0.426988 0 \r\n0.447259 0.542805 -0.897886 0 \r\n0.426697 0.554868 -0.894447 0 \r\n0.431704 0.538712 -0.912722 0 \r\n0.539289 -0.916229 0.364168 0 \r\n0.511438 -0.924848 0.367613 0 \r\n0.51796 -0.915722 0.387691 0 \r\n0.202554 0.974738 -0.49526 0 \r\n0.219947 0.962089 -0.483881 0 \r\n0.578835 0.425197 -0.0556464 0 \r\n0.588579 0.418068 -0.068528 0 \r\n0.582347 0.402223 -0.0541435 0 \r\n0.728657 0.111678 -0.649128 0 \r\n0.730541 0.105825 -0.634524 0 \r\n0.736394 0.126246 -0.633247 0 \r\n-0.0539159 0.636501 -0.799485 0 \r\n-0.0523309 0.612153 -0.811419 0 \r\n-0.0480558 0.616983 -0.826259 0 \r\n0.768202 0.186359 -0.356362 0 \r\n0.768073 0.181725 -0.347926 0 \r\n-0.133538 -0.453106 0.123767 0 \r\n-0.123392 -0.469188 0.131025 0 \r\n-0.136945 -0.473247 0.111999 0 \r\n0.358196 -0.945395 0.335995 0 \r\n0.382156 -0.939938 0.347243 0 \r\n0.381133 -0.944097 0.327736 0 \r\n-0.155953 -0.645924 -0.0468071 0 \r\n-0.146835 -0.666476 -0.0522797 0 \r\n-0.348233 -0.791712 0.73481 0 \r\n-0.336048 -0.787381 0.736544 0 \r\n-0.316104 -0.789403 0.720688 0 \r\n-0.33693 -0.19486 -0.847185 0 \r\n-0.325078 -0.200527 -0.837274 0 \r\n0.269248 -0.262195 0.208414 0 \r\n0.28942 -0.272117 0.201997 0 \r\n0.0678102 0.795067 -0.239151 0 \r\n0.295106 -0.902161 -0.0708202 0 \r\n0.277528 -0.910365 -0.0813852 0 \r\n0.270757 -0.905607 -0.0667111 0 \r\n-0.256784 -0.33704 -0.183435 0 \r\n-0.25983 -0.323186 -0.208354 0 \r\n0.201328 0.0925173 0.264728 0 \r\n0.22174 0.0771232 0.260609 0 \r\n0.239198 -0.853305 0.574746 0 \r\n0.277824 -0.866724 0.571031 0 \r\n0.249305 -0.880036 0.56645 0 \r\n0.521883 0.638821 -0.618796 0 \r\n0.506868 0.657649 -0.610732 0 \r\n0.503993 0.650863 -0.637154 0 \r\n-0.191128 0.245027 0.0997607 0 \r\n-0.17305 0.245489 0.119409 0 \r\n-0.181275 0.23255 0.1073 0 \r\n0.734359 0.0178706 -0.503148 0 \r\n0.734069 0.0380241 -0.527174 0 \r\n0.731863 0.0197591 -0.51628 0 \r\n-0.644622 -0.593338 0.816142 0 \r\n-0.664354 -0.593056 0.834976 0 \r\n-0.661445 -0.580196 0.805683 0 \r\n-0.272579 0.274621 -0.930191 0 \r\n-0.271529 0.301036 -0.923916 0 \r\n-0.277673 0.280936 -0.915895 0 \r\n0.363888 -0.553425 -0.845941 0 \r\n0.360251 -0.568385 -0.860029 0 \r\n0.343119 -0.546958 -0.856019 0 \r\n0.570154 -0.402636 -0.1179 0 \r\n0.568484 -0.385005 -0.122829 0 \r\n0.578611 -0.39515 -0.14731 0 \r\n-0.398299 0.304682 -0.369641 0 \r\n-0.396029 0.315101 -0.401915 0 \r\n-0.389179 0.331558 -0.364625 0 \r\n0.0122947 -0.879923 0.28805 0 \r\n0.00970265 -0.883051 0.267551 0 \r\n0.452478 0.705859 -0.603454 0 \r\n0.455498 0.710021 -0.568009 0 \r\n0.438621 0.718078 -0.584378 0 \r\n-0.393167 -0.742205 0.646729 0 \r\n-0.389201 -0.750003 0.661588 0 \r\n0.581506 -0.257942 -0.207379 0 \r\n0.582591 -0.234335 -0.205531 0 \r\n0.583587 -0.248105 -0.226714 0 \r\n-0.0294645 -0.0446144 0.635584 0 \r\n-0.0226046 -0.0611055 0.638899 0 \r\n-0.0311486 -0.047316 0.644622 0 \r\n0.511168 -0.806225 -0.00907767 0 \r\n0.501928 -0.821323 -0.00600773 0 \r\n0.522012 -0.819248 -0.00657219 0 \r\n0.574268 0.179655 -0.0143796 0 \r\n0.571172 0.205072 -0.00712897 0 \r\n0.339508 -0.37535 0.221048 0 \r\n0.348385 -0.385518 0.236068 0 \r\n0.329391 -0.378349 0.241334 0 \r\n-0.311125 -0.0584693 -0.973737 0 \r\n-0.322704 -0.0767386 -0.971773 0 \r\n-0.315961 -0.0888906 -0.978099 0 \r\n-0.31646 0.0228172 -0.890814 0 \r\n-0.312142 0.0406909 -0.896065 0 \r\n0.559108 0.0998428 0.027832 0 \r\n0.556406 0.0738546 0.0310488 0 \r\n0.554055 0.114941 0.0488322 0 \r\n-0.700186 -0.658089 0.791462 0 \r\n-0.703712 -0.663535 0.811598 0 \r\n-0.686119 -0.671224 0.798819 0 \r\n0.573599 -0.471457 -0.966061 0 \r\n0.574896 -0.421558 -0.965477 0 \r\n0.55792 -0.438042 -0.968758 0 \r\n0.494913 -0.518499 0.0745352 0 \r\n0.491437 -0.505587 0.0939187 0 \r\n0.486207 -0.502883 0.0793706 0 \r\n-0.0375448 -0.797167 0.333246 0 \r\n-0.0355847 -0.792239 0.351934 0 \r\n-0.0271381 -0.808015 0.356842 0 \r\n0.00864109 0.297486 -0.954792 0 \r\n0.0168501 0.305487 -0.959038 0 \r\n0.00375524 0.313482 -0.958026 0 \r\n-0.0669792 -0.713611 0.385871 0 \r\n-0.0640618 -0.697772 0.368614 0 \r\n-0.0694669 -0.691435 0.387879 0 \r\n0.314225 -0.892402 -0.339015 0 \r\n0.311491 -0.882949 -0.361602 0 \r\n0.106683 -0.240482 -0.957654 0 \r\n0.109567 -0.22308 -0.950681 0 \r\n0.099396 -0.236917 -0.952999 0 \r\n-0.67114 -0.686208 0.811064 0 \r\n-0.667614 -0.680762 0.790928 0 \r\n0.151798 -0.769459 -0.543885 0 \r\n0.130663 -0.771037 -0.539201 0 \r\n0.136952 -0.7845 -0.526567 0 \r\n-0.709935 -0.646011 0.911494 0 \r\n-0.717815 -0.651607 0.913288 0 \r\n0.0347202 -0.645344 -0.604983 0 \r\n0.054344 -0.659966 -0.605955 0 \r\n0.0570772 -0.636995 -0.618231 0 \r\n0.00972908 0.856772 -0.573426 0 \r\n0.0271681 0.86237 -0.54992 0 \r\n-0.262012 -0.0520393 -0.062949 0 \r\n-0.266221 -0.065503 -0.0823933 0 \r\n-0.267213 -0.0428815 -0.0803657 0 \r\n0.601923 -0.476528 -0.249804 0 \r\n0.603256 -0.491848 -0.243284 0 \r\n0.600314 -0.467957 -0.223369 0 \r\n0.181714 -0.277596 -0.965386 0 \r\n0.194558 -0.289326 -0.964544 0 \r\n0.205327 -0.274943 -0.965217 0 \r\n0.522131 -0.600926 0.398115 0 \r\n0.511464 -0.591228 0.424129 0 \r\n0.503692 -0.581561 0.405778 0 \r\n0.612507 0.524668 -0.187468 0 \r\n0.621985 0.50958 -0.192773 0 \r\n0.615578 0.507722 -0.172521 0 \r\n0.664099 0.499058 -0.378657 0 \r\n0.661219 0.502165 -0.3966 0 \r\n0.597949 0.456088 -0.100205 0 \r\n0.613186 0.438033 -0.119033 0 \r\n0.600304 0.422987 -0.0888585 0 \r\n0.0390918 -0.828544 0.494254 0 \r\n0.0359228 -0.832263 0.469532 0 \r\n-0.100195 0.695057 -0.606133 0 \r\n-0.105879 0.685386 -0.62288 0 \r\n-0.0867046 0.697708 -0.620308 0 \r\n-0.192877 -0.671813 -0.364702 0 \r\n-0.180496 -0.693681 -0.366159 0 \r\n-0.257596 -0.336743 -0.256513 0 \r\n-0.258209 -0.343849 -0.24663 0 \r\n-0.256854 -0.355097 -0.259298 0 \r\n-0.201747 0.0834427 0.730837 0 \r\n-0.199958 0.0732269 0.745368 0 \r\n-0.222564 0.0879409 0.754189 0 \r\n-0.189472 0.567035 -0.757654 0 \r\n-0.173339 0.579067 -0.751889 0 \r\n0.00274715 -0.83954 -0.409589 0 \r\n0.00298685 -0.826922 -0.429926 0 \r\n-0.0134669 -0.827368 -0.416374 0 \r\n0.235857 -0.271074 -0.96526 0 \r\n0.223013 -0.259343 -0.966102 0 \r\n0.504569 -0.325483 0.00240565 0 \r\n0.586129 -0.388151 -0.188107 0 \r\n0.581895 -0.388342 -0.166285 0 \r\n0.581174 -0.377329 -0.174062 0 \r\n-0.56228 -0.725168 0.75504 0 \r\n-0.58356 -0.718767 0.765126 0 \r\n-0.339103 -0.641053 0.475561 0 \r\n-0.36123 -0.653594 0.476546 0 \r\n-0.317823 -0.646803 0.469054 0 \r\n0.480698 -0.613253 -0.96389 0 \r\n0.455954 -0.607359 -0.968289 0 \r\n0.318801 -0.10132 -0.917302 0 \r\n0.341235 -0.0711989 -0.912763 0 \r\n-0.190088 0.663735 -0.322491 0 \r\n-0.17707 0.674838 -0.348078 0 \r\n0.439886 0.727224 -0.752039 0 \r\n0.437281 0.721035 -0.773371 0 \r\n0.437064 0.707664 -0.763763 0 \r\n0.267581 0.577012 0.150212 0 \r\n0.246879 0.560513 0.167365 0 \r\n0.0778574 -0.351552 0.473304 0 \r\n0.0907218 -0.36598 0.470165 0 \r\n0.0863268 -0.344406 0.484158 0 \r\n-0.269261 -0.0882891 -0.102269 0 \r\n0.518759 -0.748323 -0.35432 0 \r\n0.509274 -0.769286 -0.340056 0 \r\n0.531522 -0.742792 -0.334362 0 \r\n0.621887 0.244027 -0.114482 0 \r\n0.621985 0.211366 -0.117968 0 \r\n0.606354 0.221218 -0.104557 0 \r\n0.543544 -0.380903 -0.532494 0 \r\n0.547886 -0.371953 -0.535172 0 \r\n0.54234 -0.372837 -0.551213 0 \r\n-0.29107 0.133463 -0.939479 0 \r\n-0.287769 0.164189 -0.929156 0 \r\n-0.296521 0.114552 -0.926741 0 \r\n0.369906 -0.441395 0.336374 0 \r\n0.383344 -0.439113 0.314765 0 \r\n-0.294522 -0.29438 -0.855722 0 \r\n-0.2801 -0.278 -0.839931 0 \r\n-0.264276 -0.292904 -0.837011 0 \r\n-0.260043 -0.241559 -0.362045 0 \r\n-0.259616 -0.238007 -0.38262 0 \r\n-0.142076 -0.310714 -0.590825 0 \r\n-0.148473 -0.288044 -0.569703 0 \r\n-0.15391 -0.304202 -0.558815 0 \r\n0.605243 0.521446 -0.628474 0 \r\n0.6089 0.512325 -0.639979 0 \r\n0.619977 0.500791 -0.625723 0 \r\n0.518946 -0.914835 0.030092 0 \r\n0.524554 -0.893649 0.0199131 0 \r\n0.502608 -0.898421 0.0209819 0 \r\n0.139946 -0.357002 0.266186 0 \r\n0.15624 -0.360828 0.273461 0 \r\n0.133825 -0.368225 0.277035 0 \r\n0.49277 0.0826385 -0.909473 0 \r\n0.516564 0.0667775 -0.916979 0 \r\n0.495525 0.119299 -0.912257 0 \r\n-0.231739 -0.0567856 -0.00139535 0 \r\n-0.236515 -0.078977 -0.0145726 0 \r\n0.653629 0.162139 -0.802042 0 \r\n0.647107 0.160017 -0.812387 0 \r\n0.650423 0.140945 -0.804968 0 \r\n-0.0952321 0.565577 -0.811851 0 \r\n-0.101636 0.579425 -0.792614 0 \r\n0.660442 -0.042057 -0.966017 0 \r\n0.671788 -0.0898736 -0.96446 0 \r\n0.675565 -0.0367614 -0.96271 0 \r\n0.414962 0.724677 -0.154124 0 \r\n0.4353 0.717689 -0.166365 0 \r\n0.426272 0.715541 -0.147412 0 \r\n0.653516 0.0675094 -0.816383 0 \r\n0.656675 0.0447586 -0.822519 0 \r\n0.657624 0.0329136 -0.802539 0 \r\n0.251747 -0.954934 0.340566 0 \r\n0.237752 -0.956685 0.318422 0 \r\n0.225113 -0.954237 0.337095 0 \r\n0.55391 0.617522 -0.525105 0 \r\n0.567374 0.601434 -0.506555 0 \r\n0.552457 0.623551 -0.496529 0 \r\n0.57403 -0.595381 0.0762992 0 \r\n0.574445 -0.581171 0.0951433 0 \r\n0.564717 -0.586061 0.0842478 0 \r\n0.326501 -0.440977 -0.699784 0 \r\n0.347181 -0.443489 -0.687094 0 \r\n0.342086 -0.438181 -0.707549 0 \r\n0.227749 -0.962378 0.297715 0 \r\n0.586622 -0.373654 -0.879353 0 \r\n0.580386 -0.375458 -0.866592 0 \r\n0.574762 -0.351888 -0.87353 0 \r\n0.0954579 -0.716513 -0.893339 0 \r\n0.0996584 -0.690376 -0.873609 0 \r\n0.113705 -0.693882 -0.881514 0 \r\n0.461184 -0.185037 0.0665503 0 \r\n0.480448 -0.181033 0.0432703 0 \r\n0.225919 0.127367 0.2711 0 \r\n-0.540478 -0.768032 0.862126 0 \r\n-0.5342 -0.760141 0.863325 0 \r\n0.416829 0.2192 -0.895841 0 \r\n0.405607 0.234636 -0.895581 0 \r\n0.409145 0.211091 -0.893703 0 \r\n0.314199 0.734042 -0.0740219 0 \r\n0.381642 0.869955 -0.758447 0 \r\n0.369164 0.876254 -0.767765 0 \r\n0.390602 0.847609 -0.777755 0 \r\n-0.377159 0.0502426 -0.173433 0 \r\n-0.367316 0.107719 -0.168536 0 \r\n-0.356613 0.080236 -0.167427 0 \r\n-0.0987318 0.732237 -0.396017 0 \r\n-0.119359 0.716573 -0.413548 0 \r\n-0.100537 0.727422 -0.423078 0 \r\n0.593471 -0.955398 0.163167 0 \r\n0.573143 -0.964626 0.165979 0 \r\n0.588064 -0.954093 0.189539 0 \r\n-0.321615 -0.736705 0.518411 0 \r\n-0.323783 -0.731357 0.503344 0 \r\n-0.344451 -0.731086 0.51411 0 \r\n-0.178942 -0.710411 -0.315545 0 \r\n-0.180474 -0.711009 -0.283809 0 \r\n0.652099 -0.130253 -0.393027 0 \r\n0.631994 -0.129595 -0.419077 0 \r\n0.633893 -0.132524 -0.402947 0 \r\n-0.290253 0.273569 -0.879907 0 \r\n-0.292078 0.250553 -0.881399 0 \r\n-0.284436 0.255446 -0.900903 0 \r\n-0.232192 -0.345099 -0.0442446 0 \r\n-0.236367 -0.333204 -0.056751 0 \r\n0.585019 0.422203 -0.899516 0 \r\n0.581751 0.424015 -0.917576 0 \r\n0.589144 0.400039 -0.915156 0 \r\n-0.218486 -0.32856 -0.00760059 0 \r\n-0.220135 -0.350698 -0.0130452 0 \r\n-0.102425 -0.647066 0.0708618 0 \r\n-0.107243 -0.62196 0.0780686 0 \r\n-0.0980521 -0.633027 0.0957192 0 \r\n-0.329818 0.279395 -0.166223 0 \r\n-0.326084 0.25995 -0.161797 0 \r\n-0.333971 0.256846 -0.165706 0 \r\n-0.0810601 -0.19895 0.89127 0 \r\n-0.0702623 -0.231106 0.86896 0 \r\n-0.0949461 -0.210851 0.882844 0 \r\n0.633431 -0.199097 -0.832794 0 \r\n0.646376 -0.181704 -0.824478 0 \r\n0.654646 -0.190617 -0.840962 0 \r\n0.0267955 -0.519623 -0.761786 0 \r\n0.0370123 -0.51353 -0.752879 0 \r\n0.0442697 -0.52007 -0.758244 0 \r\n-0.218855 0.0142564 0.859756 0 \r\n0.520715 -0.64386 -0.946504 0 \r\n0.541074 -0.636441 -0.942234 0 \r\n-0.206402 -0.577716 0.531112 0 \r\n-0.234845 -0.581205 0.526178 0 \r\n-0.286447 0.197866 -0.915403 0 \r\n-0.290808 0.168463 -0.912852 0 \r\n-0.288858 0.174679 -0.918968 0 \r\n0.654776 -0.0198282 -0.675243 0 \r\n0.638272 -0.0298982 -0.695679 0 \r\n0.495889 -0.173198 -0.694012 0 \r\n0.498219 -0.1759 -0.710346 0 \r\n0.49466 -0.191718 -0.711184 0 \r\n0.0696499 -0.909317 -0.165518 0 \r\n0.663118 0.075821 -0.143414 0 \r\n0.671871 0.07042 -0.147536 0 \r\n-0.0836028 -0.65104 0.639817 0 \r\n-0.0834368 -0.663645 0.647071 0 \r\n-0.119692 -0.657828 0.662267 0 \r\n-0.0342238 0.353847 0.221235 0 \r\n-0.0206708 0.374808 0.223871 0 \r\n0.0272734 -0.712502 -0.909979 0 \r\n0.0192237 -0.689918 -0.892223 0 \r\n-0.104315 -0.476319 -0.579146 0 \r\n-0.128311 -0.456565 -0.556075 0 \r\n-0.122784 -0.47589 -0.54963 0 \r\n-0.0171044 -0.181457 -0.908982 0 \r\n-0.0291481 -0.176416 -0.9088 0 \r\n-0.0541355 -0.208638 -0.908605 0 \r\n-0.0678845 -0.795403 -0.0766057 0 \r\n-0.0631367 -0.788215 -0.0553606 0 \r\n-0.0523102 -0.804556 -0.0647774 0 \r\n0.248268 -0.229361 0.207387 0 \r\n0.249146 -0.216589 0.204783 0 \r\n0.268874 -0.230573 0.203019 0 \r\n0.473262 0.543402 -0.881346 0 \r\n0.486368 0.535091 -0.885758 0 \r\n-0.233822 -0.453964 -0.0819798 0 \r\n-0.238726 -0.459419 -0.105516 0 \r\n-0.238508 -0.431668 -0.0895048 0 \r\n0.144922 -0.518827 -0.672995 0 \r\n0.528892 -0.222396 -0.571488 0 \r\n0.525997 -0.211347 -0.560002 0 \r\n0.519765 -0.209312 -0.587021 0 \r\n0.604921 -0.252465 -0.962809 0 \r\n0.622748 -0.23171 -0.961599 0 \r\n0.615926 -0.218167 -0.965203 0 \r\n-0.0216327 0.342469 0.233417 0 \r\n-0.0509753 0.339771 0.216218 0 \r\n0.378653 -0.0126616 -0.903343 0 \r\n0.346128 -0.0075604 -0.904835 0 \r\n0.318547 0.321923 0.261756 0 \r\n0.293145 0.292801 0.269891 0 \r\n0.0107584 0.91653 -0.703411 0 \r\n-0.00267154 0.899595 -0.714442 0 \r\n0.0122013 0.906683 -0.72434 0 \r\n0.051701 -0.615932 -0.982272 0 \r\n0.0249719 -0.585339 -0.982427 0 \r\n0.528201 -0.419441 -0.529694 0 \r\n0.505077 -0.427115 -0.553208 0 \r\n0.511863 -0.439711 -0.535746 0 \r\n-0.255156 -0.358725 -0.168928 0 \r\n-0.256356 -0.373381 -0.198963 0 \r\n0.290514 0.439076 -0.95909 0 \r\n0.316965 0.43202 -0.960647 0 \r\n0.31904 0.450309 -0.960726 0 \r\n0.254798 0.97685 -0.679631 0 \r\n0.229949 0.989038 -0.655038 0 \r\n0.228953 0.975652 -0.691836 0 \r\n-0.0524632 -0.586562 0.424793 0 \r\n-0.0416954 -0.58286 0.418993 0 \r\n-0.0397301 -0.580813 0.438277 0 \r\n0.709512 0.337655 -0.225627 0 \r\n-0.291269 0.204392 -0.89474 0 \r\n0.0644835 -0.297177 0.669479 0 \r\n0.0530821 -0.2816 0.669407 0 \r\n0.0758671 -0.302991 0.646309 0 \r\n0.530967 -0.653687 -0.43987 0 \r\n0.544519 -0.628067 -0.439276 0 \r\n0.523802 -0.638634 -0.462893 0 \r\n-0.447405 -0.629731 0.514405 0 \r\n-0.432537 -0.616539 0.526095 0 \r\n-0.468836 -0.625244 0.529162 0 \r\n0.42483 -0.0802695 0.130533 0 \r\n0.422174 -0.0661749 0.139882 0 \r\n0.442014 -0.0704895 0.123223 0 \r\n-0.190579 -0.468287 0.028603 0 \r\n-0.195167 -0.497378 0.00418365 0 \r\n-0.200219 -0.46783 0.00570385 0 \r\n0.177746 -0.709293 -0.595631 0 \r\n0.200059 -0.698101 -0.604304 0 \r\n-0.18732 -0.58152 0.586347 0 \r\n-0.190442 -0.587489 0.606716 0 \r\n-0.227779 -0.583431 0.616289 0 \r\n0.521188 0.654339 -0.57107 0 \r\n0.533354 0.639008 -0.572828 0 \r\n0.529785 0.64774 -0.551524 0 \r\n0.0709035 -0.888946 -0.0816462 0 \r\n0.0765017 -0.897323 -0.0990528 0 \r\n0.444794 -0.770429 -0.442212 0 \r\n0.278234 -0.912874 0.553645 0 \r\n0.251732 -0.922587 0.550797 0 \r\n0.261429 -0.903168 0.559887 0 \r\n0.379935 -0.439557 -0.685188 0 \r\n0.373543 -0.441709 -0.676668 0 \r\n0.390711 -0.440574 -0.666997 0 \r\n-0.180784 -0.195922 -0.761386 0 \r\n-0.181482 -0.181083 -0.752597 0 \r\n-0.243088 0.543962 -0.732782 0 \r\n-0.259471 0.534728 -0.723101 0 \r\n-0.252298 0.529264 -0.745898 0 \r\n-0.146693 -0.118805 0.0913244 0 \r\n-0.15813 -0.105119 0.0843618 0 \r\n-0.134392 -0.100395 0.105322 0 \r\n0.131591 0.937429 -0.764648 0 \r\n0.0983509 0.922005 -0.766753 0 \r\n0.112474 0.914876 -0.782611 0 \r\n0.261787 0.319501 -0.96462 0 \r\n0.236548 0.30351 -0.965501 0 \r\n-0.263295 -0.670352 0.454045 0 \r\n-0.290725 -0.676835 0.460059 0 \r\n-0.264286 -0.680707 0.455051 0 \r\n-0.0898286 -0.541758 -0.567775 0 \r\n-0.109099 -0.542059 -0.551561 0 \r\n-0.0989653 -0.555725 -0.556713 0 \r\n0.166409 0.493542 -0.960691 0 \r\n0.171345 0.506819 -0.961591 0 \r\n0.15562 0.506576 -0.962469 0 \r\n0.047474 -0.625686 0.556825 0 \r\n0.0620755 -0.619307 0.554885 0 \r\n-0.203593 -0.650229 -0.261568 0 \r\n-0.206055 -0.648656 -0.280825 0 \r\n-0.756698 -0.604702 0.847734 0 \r\n-0.761963 -0.604466 0.836051 0 \r\n0.179118 -0.907908 0.00486642 0 \r\n0.157359 -0.905022 -0.000983395 0 \r\n-0.0788121 -0.433875 -0.728351 0 \r\n-0.0853686 -0.423873 -0.730292 0 \r\n-0.0816356 -0.437707 -0.709315 0 \r\n0.0748419 -0.341614 0.729098 0 \r\n0.0513772 -0.309443 0.760996 0 \r\n0.0978626 -0.298972 0.571898 0 \r\n0.112039 -0.324621 0.565531 0 \r\n0.0991801 -0.302257 0.586139 0 \r\n0.423943 -0.638344 -0.555655 0 \r\n0.588863 -0.371244 -0.281982 0 \r\n0.589237 -0.377895 -0.255464 0 \r\n0.586435 -0.357423 -0.260392 0 \r\n-0.178682 0.35405 0.0872569 0 \r\n-0.187647 0.324974 0.0901259 0 \r\n0.214346 -0.993104 0.192393 0 \r\n0.195756 -0.991501 0.18444 0 \r\n0.194063 -0.987515 0.206459 0 \r\n0.73728 0.0196242 -0.492049 0 \r\n0.745483 0.0304231 -0.47098 0 \r\n-0.333786 -0.0574223 -0.923298 0 \r\n-0.342888 -0.0868535 -0.91168 0 \r\n-0.343058 -0.0924848 -0.928966 0 \r\n0.308279 -0.692139 -0.582956 0 \r\n0.287179 -0.706978 -0.578097 0 \r\n0.296413 -0.719839 -0.567494 0 \r\n0.586752 0.567621 -0.540826 0 \r\n0.596973 0.554464 -0.525542 0 \r\n0.579047 0.582247 -0.519847 0 \r\n-0.388124 0.305072 -0.262021 0 \r\n-0.38037 0.322131 -0.258534 0 \r\n0.504802 0.68495 -0.26368 0 \r\n0.474773 0.705989 -0.256791 0 \r\n-0.154513 0.535085 -0.820576 0 \r\n-0.141316 0.522172 -0.841956 0 \r\n-0.395748 0.0690555 -0.717089 0 \r\n-0.389195 0.0900162 -0.729183 0 \r\n0.307341 -0.870425 -0.386838 0 \r\n0.286043 -0.880943 -0.37576 0 \r\n0.633374 -0.500062 -0.893934 0 \r\n0.630193 -0.473953 -0.898589 0 \r\n0.632275 -0.486398 -0.90683 0 \r\n0.177552 -0.0313126 -0.910336 0 \r\n0.191271 -0.0770611 -0.911875 0 \r\n0.226071 -0.0097894 -0.909173 0 \r\n0.600989 0.553634 -0.50131 0 \r\n0.603754 0.554381 -0.480895 0 \r\n0.592034 0.569837 -0.484147 0 \r\n-0.0850433 0.615131 -0.762205 0 \r\n-0.0711651 0.630738 -0.756384 0 \r\n-0.0843626 0.633767 -0.741299 0 \r\n-0.296949 -0.0996002 -0.981287 0 \r\n-0.311861 -0.103767 -0.981438 0 \r\n-0.304428 -0.132746 -0.982662 0 \r\n0.654168 0.199733 -0.135774 0 \r\n0.665241 0.199703 -0.139955 0 \r\n0.656166 0.180838 -0.135856 0 \r\n-0.34738 -0.578151 0.662226 0 \r\n-0.353604 -0.581213 0.674865 0 \r\n-0.0865048 -0.318123 -0.958889 0 \r\n-0.0556993 -0.318266 -0.962224 0 \r\n-0.0659939 -0.305133 -0.953273 0 \r\n0.690129 -0.661612 0.0919522 0 \r\n-0.0472884 -0.601169 0.550973 0 \r\n-0.0642885 -0.596128 0.548093 0 \r\n0.232089 0.798958 -0.300474 0 \r\n0.214644 0.800235 -0.295233 0 \r\n0.228211 0.79969 -0.316361 0 \r\n-0.00688185 -0.587628 0.490643 0 \r\n-0.0155406 -0.591086 0.509021 0 \r\n-0.110499 -0.430677 -0.616642 0 \r\n0.125566 0.334355 -0.966722 0 \r\n0.138369 0.310354 -0.968517 0 \r\n0.461547 -0.928402 0.394177 0 \r\n0.482591 -0.928811 0.370031 0 \r\n0.213193 -0.129523 -0.922678 0 \r\n0.224887 -0.113916 -0.919356 0 \r\n0.202433 -0.118134 -0.918783 0 \r\n-0.293036 0.52736 -0.535554 0 \r\n-0.308541 0.499873 -0.522151 0 \r\n-0.313368 0.491306 -0.55027 0 \r\n0.587188 -0.192225 -0.231407 0 \r\n0.591079 -0.179929 -0.223576 0 \r\n0.588407 -0.184811 -0.242194 0 \r\n-0.402747 0.240326 -0.55995 0 \r\n-0.404177 0.249624 -0.541088 0 \r\n-0.407521 0.224429 -0.556027 0 \r\n-0.151759 -0.606913 0.628045 0 \r\n-0.204189 -0.599218 0.642096 0 \r\n-0.178471 -0.597095 0.622608 0 \r\n-0.160202 -0.0143737 0.761738 0 \r\n-0.139903 -0.0389253 0.751284 0 \r\n-0.150784 -0.0404414 0.766019 0 \r\n0.171682 -0.327547 0.247695 0 \r\n0.172222 -0.314057 0.241526 0 \r\n0.0844974 -0.612101 0.566668 0 \r\n0.0667934 -0.608692 0.553915 0 \r\n0.0734805 -0.596052 0.557277 0 \r\n0.181845 0.212756 0.279785 0 \r\n0.17693 0.226355 0.281051 0 \r\n-0.28 -0.0686176 -0.981058 0 \r\n-0.287433 -0.0396387 -0.979833 0 \r\n0.521701 -0.569987 -0.966231 0 \r\n0.50444 -0.600704 -0.965984 0 \r\n0.547176 -0.583116 -0.962028 0 \r\n0.0424585 0.565374 0.142871 0 \r\n0.0358221 0.586756 0.119648 0 \r\n0.0540015 0.59374 0.120234 0 \r\n0.0843963 -0.927788 0.0821671 0 \r\n0.0985522 -0.937258 0.0784939 0 \r\n0.0806315 -0.918473 0.0638888 0 \r\n0.354995 -0.946242 0.410608 0 \r\n0.366238 -0.941769 0.398239 0 \r\n0.340234 -0.947258 0.398483 0 \r\n0.761858 0.132026 -0.470502 0 \r\n0.764135 0.148515 -0.465783 0 \r\n0.760997 0.143284 -0.492132 0 \r\n0.215197 -0.673939 -0.614751 0 \r\n0.203332 -0.659638 -0.622067 0 \r\n-0.0421079 0.717968 -0.101439 0 \r\n-0.0666092 0.699104 -0.0968482 0 \r\n-0.0673205 0.70935 -0.122459 0 \r\n0.587935 -0.373059 -0.307981 0 \r\n0.584957 -0.354933 -0.315361 0 \r\n0.58683 -0.37722 -0.336433 0 \r\n-0.325662 0.342656 -0.774467 0 \r\n-0.334898 0.317223 -0.764786 0 \r\n-0.322206 0.31756 -0.794377 0 \r\n0.571836 0.372152 -0.960686 0 \r\n0.567332 0.399199 -0.955008 0 \r\n0.556458 0.398015 -0.95863 0 \r\n-0.0926876 -0.730374 -0.0254567 0 \r\n0.25675 0.439039 0.241163 0 \r\n0.249559 0.454189 0.235778 0 \r\n0.281995 0.451128 0.233723 0 \r\n0.540057 0.657882 -0.349944 0 \r\n0.535518 0.663859 -0.330446 0 \r\n0.52665 0.672275 -0.354745 0 \r\n-0.380035 -0.174919 -0.463861 0 \r\n-0.402743 -0.16087 -0.468493 0 \r\n0.685045 0.0401981 -0.6984 0 \r\n0.676645 0.0310095 -0.70918 0 \r\n0.678232 0.0155328 -0.686994 0 \r\n0.239027 -0.284192 -0.964488 0 \r\n0.256713 -0.268593 -0.965372 0 \r\n-0.0864633 -0.76397 0.54248 0 \r\n-0.10891 -0.763631 0.54689 0 \r\n0.434548 -0.44413 0.255104 0 \r\n0.421297 -0.428531 0.241033 0 \r\n0.441951 -0.44173 0.232893 0 \r\n0.548218 -0.724396 -0.00899518 0 \r\n0.559353 -0.721169 -0.00670094 0 \r\n0.551985 -0.708733 -0.00628847 0 \r\n0.160108 0.926902 -0.789189 0 \r\n-0.00115285 -0.386804 0.75984 0 \r\n0.0151462 -0.40997 0.740523 0 \r\n-0.090037 -0.77994 -0.0915595 0 \r\n-0.104132 -0.763843 -0.0941687 0 \r\n-0.092806 -0.762964 -0.0697982 0 \r\n-0.670156 -0.655529 0.678113 0 \r\n-0.676942 -0.653606 0.695275 0 \r\n-0.0852864 -0.818138 -0.174342 0 \r\n-0.0830609 -0.825871 -0.194899 0 \r\n0.738318 0.142507 -0.636752 0 \r\n0.740201 0.136654 -0.622149 0 \r\n-0.241784 0.595478 -0.494908 0 \r\n-0.258352 0.575996 -0.510928 0 \r\n-0.242469 0.592775 -0.515129 0 \r\n0.242201 0.75824 -0.0998189 0 \r\n0.217231 0.754977 -0.0829463 0 \r\n0.238705 -0.421715 -0.968969 0 \r\n0.279526 -0.412687 -0.968531 0 \r\n0.253222 -0.383351 -0.967072 0 \r\n0.398323 -0.340531 0.127212 0 \r\n0.419361 -0.334563 0.105878 0 \r\n0.414863 -0.350623 0.108789 0 \r\n0.456022 0.231637 0.196517 0 \r\n0.450148 0.203708 0.201524 0 \r\n0.437198 0.223854 0.213432 0 \r\n0.568354 0.534141 -0.705546 0 \r\n0.5677 0.551035 -0.679453 0 \r\n0.554309 0.561805 -0.689936 0 \r\n0.564234 0.571476 -0.65162 0 \r\n0.574201 0.569048 -0.627082 0 \r\n0.563622 0.57627 -0.639305 0 \r\n0.643657 0.172707 -0.820493 0 \r\n0.640451 0.151514 -0.823418 0 \r\n0.635029 0.451833 -0.164167 0 \r\n0.633825 0.469282 -0.175621 0 \r\n0.0262705 0.939857 -0.642843 0 \r\n0.0137859 0.929678 -0.662526 0 \r\n0.0348462 0.94628 -0.655869 0 \r\n-0.0372289 -0.0413198 0.630583 0 \r\n-0.045773 -0.0275303 0.636306 0 \r\n-0.277599 -0.106318 -0.979687 0 \r\n-0.268083 -0.0463561 -0.978233 0 \r\n-0.031104 -0.132247 0.680645 0 \r\n-0.0309085 -0.156621 0.691821 0 \r\n-0.0527264 -0.125118 0.701159 0 \r\n0.4539 -0.358528 0.0658396 0 \r\n0.454413 -0.3364 0.0670588 0 \r\n-0.237613 -0.396641 -0.074974 0 \r\n-0.235886 -0.372324 -0.0629485 0 \r\n-0.231876 -0.401896 -0.0539431 0 \r\n0.404279 0.880383 -0.596258 0 \r\n0.405846 0.869981 -0.588869 0 \r\n0.245928 -0.987394 0.225302 0 \r\n0.233891 -0.99094 0.211226 0 \r\n0.569594 0.488204 -0.069521 0 \r\n0.581922 0.468437 -0.0796071 0 \r\n0.443253 0.17705 0.207433 0 \r\n0.723801 0.146994 -0.684905 0 \r\n0.729949 0.148847 -0.667106 0 \r\n0.729897 0.167062 -0.673985 0 \r\n-0.106487 -0.126753 0.797086 0 \r\n-0.118475 -0.109245 0.790061 0 \r\n-0.10179 -0.126628 0.781734 0 \r\n0.195541 -0.238942 0.217608 0 \r\n0.226866 -0.240407 0.214676 0 \r\n0.193866 -0.263972 0.223134 0 \r\n0.209143 0.635085 0.0969073 0 \r\n0.178532 0.641607 0.0879574 0 \r\n0.190983 0.650012 0.0774147 0 \r\n0.745821 0.294752 -0.405727 0 \r\n0.743611 0.303163 -0.407391 0 \r\n0.334101 0.786034 -0.500727 0 \r\n0.339346 0.781012 -0.482686 0 \r\n0.318464 0.791326 -0.473257 0 \r\n-0.251873 0.370813 -0.928367 0 \r\n-0.244705 0.389211 -0.927765 0 \r\n0.621679 0.24261 -0.923572 0 \r\n0.617819 0.263363 -0.913129 0 \r\n0.613331 0.284728 -0.926893 0 \r\n0.154725 -0.572609 -0.655376 0 \r\n0.16674 -0.556181 -0.661061 0 \r\n0.0778833 -0.60261 -0.810049 0 \r\n0.0794889 -0.578245 -0.796512 0 \r\n-0.293832 -0.131202 -0.711488 0 \r\n-0.274716 -0.139631 -0.713665 0 \r\n-0.417446 -0.101097 -0.240707 0 \r\n-0.42995 -0.0879889 -0.250112 0 \r\n-0.330023 -0.184998 -0.980321 0 \r\n-0.31899 -0.172422 -0.98404 0 \r\n-0.330373 -0.149488 -0.979094 0 \r\n0.559513 -0.172369 -0.397705 0 \r\n-0.223024 -0.589801 -0.377347 0 \r\n-0.218892 -0.582517 -0.400059 0 \r\n0.18062 -0.977823 0.228317 0 \r\n0.155266 -0.977017 0.210443 0 \r\n0.160412 -0.968928 0.240255 0 \r\n0.188541 0.656684 -0.941325 0 \r\n0.151977 0.660814 -0.942316 0 \r\n0.169036 0.627292 -0.951158 0 \r\n0.224517 0.937507 -0.772247 0 \r\n0.227175 0.924147 -0.789973 0 \r\n0.0281196 0.196433 -0.912283 0 \r\n0.0589538 0.180656 -0.912893 0 \r\n0.0580282 0.208351 -0.918722 0 \r\n-0.0841916 0.094364 0.182515 0 \r\n-0.0919113 0.114754 0.181726 0 \r\n-0.0697979 0.106292 0.197467 0 \r\n-0.212642 -0.747478 0.510234 0 \r\n-0.271702 0.483695 -0.200877 0 \r\n-0.27902 0.48726 -0.222167 0 \r\n-0.267591 0.502684 -0.211326 0 \r\n-0.482016 -0.579925 0.672862 0 \r\n-0.461032 -0.580512 0.683674 0 \r\n-0.48375 -0.582171 0.688115 0 \r\n0.594327 -0.0975441 -0.960662 0 \r\n0.596288 -0.143739 -0.963252 0 \r\n-0.0215332 -0.853624 -0.130411 0 \r\n-0.0322776 -0.85301 -0.157445 0 \r\n-0.0542424 -0.836738 -0.148225 0 \r\n0.443274 -0.823206 -0.354053 0 \r\n0.462642 -0.806671 -0.361245 0 \r\n-0.651152 -0.572024 0.749135 0 \r\n-0.655545 -0.574932 0.76992 0 \r\n-0.0599993 -0.777934 -0.0343443 0 \r\n-0.13344 -0.0817404 0.632222 0 \r\n-0.12176 -0.121758 0.618353 0 \r\n-0.393183 0.280028 -0.558015 0 \r\n-0.396999 0.25446 -0.57091 0 \r\n-0.39078 0.268966 -0.583913 0 \r\n-0.408735 0.00706961 -0.189419 0 \r\n-0.397354 -0.00695075 -0.186113 0 \r\n-0.149402 -0.438787 -0.955194 0 \r\n-0.153078 -0.437851 -0.967498 0 \r\n-0.166001 -0.415334 -0.962552 0 \r\n-0.16629 -0.380994 -0.898757 0 \r\n-0.179605 -0.380335 -0.902068 0 \r\n-0.175324 -0.371414 -0.885648 0 \r\n-0.224527 0.229463 0.0399083 0 \r\n-0.228891 0.242512 0.0213061 0 \r\n-0.0257336 -0.455006 0.630209 0 \r\n-0.00906614 -0.474359 0.626909 0 \r\n-0.565204 -0.717263 0.874444 0 \r\n-0.595258 -0.714145 0.890144 0 \r\n-0.576997 -0.701318 0.875964 0 \r\n-0.166025 -0.691725 -0.136117 0 \r\n-0.279156 -0.0286868 -0.12176 0 \r\n-0.274659 -0.0288336 -0.105763 0 \r\n-0.102104 0.486165 0.105976 0 \r\n-0.113804 0.503302 0.0788049 0 \r\n-0.238987 -0.757946 0.563742 0 \r\n-0.242974 -0.75368 0.544836 0 \r\n-0.268572 -0.7515 0.55323 0 \r\n-0.321477 -0.176275 -0.244622 0 \r\n-0.314008 -0.188793 -0.255729 0 \r\n0.541505 -0.88844 0.423247 0 \r\n0.531108 -0.884286 0.439175 0 \r\n0.564935 -0.876742 0.416839 0 \r\n0.751688 0.0906024 -0.499672 0 \r\n0.745411 0.083266 -0.525397 0 \r\n0.747937 0.0704615 -0.494862 0 \r\n0.221151 -0.474566 -0.814226 0 \r\n0.23378 -0.464806 -0.814559 0 \r\n0.232228 -0.478994 -0.8236 0 \r\n0.556286 -0.0877215 -0.679244 0 \r\n0.573112 -0.0756358 -0.67135 0 \r\n0.57127 -0.0773028 -0.694876 0 \r\n0.504216 -0.243953 -0.958577 0 \r\n0.537167 -0.24503 -0.960526 0 \r\n-0.154025 -0.7124 0.446823 0 \r\n-0.136694 -0.715254 0.443808 0 \r\n-0.1234 -0.704935 0.433748 0 \r\n0.567596 -0.146768 -0.438895 0 \r\n0.594483 -0.143089 -0.41811 0 \r\n0.586902 -0.135545 -0.449782 0 \r\n0.766869 0.141661 -0.414296 0 \r\n0.764825 0.115039 -0.421296 0 \r\n0.766698 0.119444 -0.391439 0 \r\n-0.394583 -0.0430475 -0.688619 0 \r\n-0.393181 -0.0549448 -0.678736 0 \r\n-0.38041 -0.0511138 -0.708037 0 \r\n0.0018439 -0.412066 0.46191 0 \r\n0.0102946 -0.42737 0.450004 0 \r\n0.00424709 -0.408121 0.459659 0 \r\n-0.00426538 0.896088 -0.610892 0 \r\n0.00704 0.911628 -0.612782 0 \r\n0.0183085 0.922357 -0.591302 0 \r\n-0.106435 0.153745 -0.896373 0 \r\n0.0231279 -0.0820948 0.193877 0 \r\n0.0374357 -0.108073 0.19604 0 \r\n0.00930415 -0.101544 0.187718 0 \r\n0.496324 -0.733096 -0.420204 0 \r\n-0.0437105 -0.816177 -0.0708327 0 \r\n-0.019603 -0.832602 -0.0661424 0 \r\n-0.0329505 -0.828169 -0.0813323 0 \r\n-0.100324 -0.133281 0.800754 0 \r\n-0.117009 -0.115897 0.809081 0 \r\n-0.0335016 -0.373954 0.222408 0 \r\n-0.0238331 -0.381799 0.22842 0 \r\n-0.0356215 -0.395678 0.224742 0 \r\n0.395214 -0.500755 0.538195 0 \r\n0.420476 -0.516088 0.535813 0 \r\n0.402836 -0.513475 0.54842 0 \r\n0.211218 -0.457577 0.531346 0 \r\n0.227228 -0.456322 0.516714 0 \r\n0.229813 -0.463527 0.533877 0 \r\n0.0575544 -0.660993 -0.848354 0 \r\n0.0448456 -0.666477 -0.852596 0 \r\n0.0512163 -0.647707 -0.837234 0 \r\n0.0657115 -0.835319 -0.449188 0 \r\n0.0461723 -0.815562 -0.468179 0 \r\n0.0480551 -0.829876 -0.44755 0 \r\n-0.420387 0.192117 -0.526796 0 \r\n-0.427366 0.165657 -0.524534 0 \r\n-0.423874 0.162761 -0.550215 0 \r\n0.501197 0.534172 -0.87195 0 \r\n0.51135 0.538022 -0.850688 0 \r\n0.490436 0.551574 -0.847669 0 \r\n0.488775 -0.0806171 0.0693209 0 \r\n0.493124 -0.0568416 0.0769217 0 \r\n0.503931 -0.0620124 0.0604281 0 \r\n-0.138406 -0.322029 -0.604655 0 \r\n-0.132969 -0.305871 -0.615543 0 \r\n0.333795 -0.438849 -0.750669 0 \r\n0.316441 -0.435363 -0.742442 0 \r\n0.338761 -0.439154 -0.728465 0 \r\n-0.0543933 0.679124 -0.0396105 0 \r\n-0.0579219 0.691151 -0.0655074 0 \r\n-0.037868 0.695696 -0.0499315 0 \r\n0.281611 -0.364608 0.25499 0 \r\n0.263348 -0.368723 0.268132 0 \r\n0.259135 -0.355847 0.251701 0 \r\n0.358954 0.861971 -0.793197 0 \r\n0.146064 0.99464 -0.62282 0 \r\n0.155196 0.995714 -0.60373 0 \r\n0.14017 0.995222 -0.594967 0 \r\n-0.363999 0.391971 -0.365857 0 \r\n-0.372788 0.374668 -0.37685 0 \r\n-0.362838 0.398244 -0.389908 0 \r\n-0.243179 0.153973 -0.00698733 0 \r\n-0.248477 0.152795 -0.0245544 0 \r\n-0.24604 0.180169 -0.0199809 0 \r\n0.637618 0.142372 -0.841269 0 \r\n0.638116 0.146854 -0.831704 0 \r\n0.636503 0.159721 -0.841089 0 \r\n-0.192901 0.442344 -0.0111161 0 \r\n-0.18646 0.468898 -0.0176924 0 \r\n-0.180247 0.465707 0.00066239 0 \r\n0.0165268 -0.312752 -0.968035 0 \r\n0.0278296 -0.298917 -0.964095 0 \r\n-0.00021645 -0.310524 -0.965187 0 \r\n0.159019 -0.930894 0.360038 0 \r\n0.170366 -0.941521 0.339 0 \r\n0.146387 -0.932736 0.338398 0 \r\n-0.189172 0.417176 -0.951433 0 \r\n-0.17302 0.410908 -0.962327 0 \r\n-0.165582 0.427998 -0.954394 0 \r\n0.605767 -0.944189 0.104353 0 \r\n0.608164 -0.946156 0.124483 0 \r\n0.617098 -0.935827 0.121044 0 \r\n0.570725 -0.255103 -0.844873 0 \r\n0.557101 -0.257226 -0.827551 0 \r\n0.639979 0.13543 -0.130933 0 \r\n0.638951 0.165755 -0.129703 0 \r\n0.646122 0.150543 -0.132904 0 \r\n0.465563 -0.4118 -0.969087 0 \r\n0.484791 -0.468705 -0.970901 0 \r\n0.493232 -0.421388 -0.969536 0 \r\n-0.0137377 0.443491 0.200062 0 \r\n-0.0257761 0.457298 0.186292 0 \r\n-0.00791378 0.466013 0.19149 0 \r\n0.189514 0.777832 -0.895085 0 \r\n0.173866 0.787917 -0.891899 0 \r\n0.527517 -0.349575 -0.679065 0 \r\n0.528902 -0.362419 -0.645062 0 \r\n0.0656695 0.637918 0.0751681 0 \r\n0.103043 0.638229 0.0827432 0 \r\n0.0847386 0.615432 0.104586 0 \r\n-0.603151 -0.753199 0.825585 0 \r\n-0.618124 -0.741643 0.828398 0 \r\n-0.615326 -0.751491 0.836834 0 \r\n-0.463273 -0.748412 0.828833 0 \r\n-0.466381 -0.764719 0.827951 0 \r\n0.210074 -0.801177 -0.506472 0 \r\n0.213547 -0.78229 -0.528283 0 \r\n0.351078 -0.590668 -0.886266 0 \r\n0.341656 -0.577536 -0.883191 0 \r\n0.348904 -0.575049 -0.873183 0 \r\n0.580194 -0.0734775 -0.948511 0 \r\n0.575861 -0.0885483 -0.947523 0 \r\n0.582726 -0.0861882 -0.951728 0 \r\n-0.214779 -0.132443 0.797076 0 \r\n-0.215779 -0.13387 0.819494 0 \r\n-0.20127 -0.156372 0.789958 0 \r\n0.416046 -0.866613 -0.253679 0 \r\n0.438739 -0.847737 -0.269478 0 \r\n0.419568 -0.86007 -0.28459 0 \r\n0.385861 0.605719 -0.89037 0 \r\n0.376693 0.622296 -0.890899 0 \r\n0.0719307 -0.877668 0.397835 0 \r\n0.0739034 -0.874728 0.417701 0 \r\n0.0973171 -0.888927 0.417893 0 \r\n-0.245107 -0.167558 -0.631763 0 \r\n-0.259114 -0.173838 -0.599624 0 \r\n-0.241477 -0.175964 -0.608965 0 \r\n0.503433 -0.563198 -0.970705 0 \r\n0.512419 -0.541643 -0.972073 0 \r\n0.487951 -0.56602 -0.971555 0 \r\n-0.124808 -0.366456 -0.848863 0 \r\n-0.13237 -0.382928 -0.872597 0 \r\n0.557267 -0.538414 -0.815042 0 \r\n0.541567 -0.527725 -0.803431 0 \r\n0.55818 -0.519764 -0.808958 0 \r\n0.0198489 -0.210254 -0.919271 0 \r\n-0.0102444 -0.239463 -0.922736 0 \r\n-0.025551 -0.101938 0.593745 0 \r\n-0.0225713 -0.12431 0.582248 0 \r\n-0.0125833 -0.119717 0.587493 0 \r\n0.110902 -0.427149 -0.974679 0 \r\n0.0940512 -0.444215 -0.976779 0 \r\n0.120992 -0.452342 -0.975362 0 \r\n-0.197183 -0.629446 -0.158993 0 \r\n-0.203407 -0.624231 -0.19053 0 \r\n0.672395 0.00175775 -0.663257 0 \r\n0.663996 -0.0074308 -0.674038 0 \r\n0.0232409 -0.858797 0.0566562 0 \r\n0.00947015 -0.836793 0.0479087 0 \r\n0.00908361 -0.846147 0.0651236 0 \r\n-0.143641 -0.730404 -0.132939 0 \r\n0.0949067 -0.909598 -0.308281 0 \r\n0.0817766 -0.909186 -0.294329 0 \r\n0.105341 -0.917076 -0.284516 0 \r\n0.0229577 -0.714635 -0.93463 0 \r\n0.0306427 -0.721875 -0.921902 0 \r\n0.0436056 -0.727482 -0.934272 0 \r\n0.479618 0.0422838 0.142393 0 \r\n0.483483 0.0642303 0.144422 0 \r\n0.497482 0.0566086 0.128913 0 \r\n0.138977 0.9497 -0.750283 0 \r\n0.131704 0.955677 -0.736505 0 \r\n0.469698 -0.543046 0.470051 0 \r\n0.477035 -0.549527 0.475971 0 \r\n-0.628284 -0.673473 0.679934 0 \r\n-0.637572 -0.668717 0.662252 0 \r\n0.447357 0.72201 -0.521855 0 \r\n0.457921 0.713086 -0.538099 0 \r\n0.463638 0.712858 -0.51102 0 \r\n-0.116216 -0.0514147 0.126641 0 \r\n-0.111422 -0.0660909 0.128437 0 \r\n-0.130803 -0.0605845 0.114734 0 \r\n-0.048834 -0.826509 -0.377353 0 \r\n-0.0315529 -0.828657 -0.397487 0 \r\n0.287899 -0.143416 0.185632 0 \r\n0.272833 -0.133371 0.193964 0 \r\n0.562564 -0.95682 0.0761798 0 \r\n0.546776 -0.959378 0.0696996 0 \r\n0.552862 -0.968765 0.0862556 0 \r\n0.108413 0.897692 -0.799528 0 \r\n0.141654 0.913116 -0.797423 0 \r\n-0.221462 0.620091 -0.471642 0 \r\n-0.230189 0.613185 -0.451577 0 \r\n-0.234629 0.605351 -0.479044 0 \r\n0.0582164 -0.525517 0.616693 0 \r\n0.0466133 -0.52084 0.619298 0 \r\n0.0480727 -0.507512 0.63783 0 \r\n0.583878 0.553411 -0.628749 0 \r\n0.584489 0.548617 -0.641064 0 \r\n-0.328381 0.178041 -0.157016 0 \r\n-0.307275 0.182939 -0.148166 0 \r\n-0.325664 0.14261 -0.15368 0 \r\n0.0407797 -0.580413 0.524092 0 \r\n0.0338003 -0.592535 0.528175 0 \r\n0.0188034 -0.580307 0.507744 0 \r\n0.202169 -0.357212 0.270793 0 \r\n0.179707 -0.359686 0.273538 0 \r\n0.184823 -0.347132 0.259867 0 \r\n-0.106013 -0.226566 -0.722511 0 \r\n-0.111585 -0.218083 -0.709615 0 \r\n0.566051 0.132675 0.0141348 0 \r\n0.568401 0.0915883 -0.00364865 0 \r\n0.71289 -0.0268065 -0.916803 0 \r\n0.711645 -0.0273772 -0.927336 0 \r\n-0.19378 -0.522405 -0.0110638 0 \r\n-0.184139 -0.522862 0.0118354 0 \r\n0.615163 -0.432387 -0.890903 0 \r\n0.604823 -0.423476 -0.876288 0 \r\n0.602587 -0.406135 -0.88703 0 \r\n-0.00863913 -0.46044 0.292252 0 \r\n-0.0174183 -0.46972 0.286286 0 \r\n-0.0202475 -0.462633 0.274607 0 \r\n0.231553 0.469065 0.22854 0 \r\n0.256799 0.481153 0.2211 0 \r\n-0.15191 0.676301 -0.513893 0 \r\n-0.15192 0.671627 -0.543061 0 \r\n-0.125566 0.695431 -0.525757 0 \r\n0.594949 -0.123847 -0.76684 0 \r\n0.578357 -0.120821 -0.758374 0 \r\n-0.259436 0.578787 -0.342133 0 \r\n-0.271064 0.561157 -0.361339 0 \r\n-0.26304 0.575482 -0.370106 0 \r\n0.501845 0.284204 0.136312 0 \r\n0.496652 0.265298 0.146481 0 \r\n0.0425203 0.622923 -0.93022 0 \r\n0.036784 0.597947 -0.932925 0 \r\n0.0541016 0.585589 -0.947158 0 \r\n0.506343 -0.981133 0.108036 0 \r\n0.488646 -0.976161 0.0926995 0 \r\n0.484522 -0.979084 0.109224 0 \r\n0.679477 -0.125339 -0.313349 0 \r\n0.696905 -0.112187 -0.307518 0 \r\n0.592152 -0.399379 -0.252964 0 \r\n0.589724 -0.385558 -0.231374 0 \r\n0.580889 -0.295484 -0.29372 0 \r\n0.580707 -0.307258 -0.3152 0 \r\n0.232765 -0.958889 0.451316 0 \r\n0.252245 -0.961473 0.450548 0 \r\n0.242322 -0.959562 0.431139 0 \r\n0.0724864 -0.94496 0.141055 0 \r\n0.0702331 -0.946819 0.153419 0 \r\n-0.110254 -0.366206 -0.689096 0 \r\n-0.104871 -0.358956 -0.704323 0 \r\n-0.109173 -0.350101 -0.69278 0 \r\n0.561983 -0.257605 -0.124318 0 \r\n0.55434 -0.26355 -0.101676 0 \r\n-0.237231 0.581469 -0.241255 0 \r\n-0.21913 0.606575 -0.236465 0 \r\n-0.221767 0.59182 -0.216952 0 \r\n0.00035795 -0.819797 0.0115515 0 \r\n0.00659012 -0.831854 -0.0067523 0 \r\n-0.0110833 -0.814336 -0.00721035 0 \r\n-0.412923 0.211474 -0.54482 0 \r\n-0.411233 0.233851 -0.52176 0 \r\n-0.415204 0.211599 -0.529417 0 \r\n-0.0588387 -0.599809 0.358082 0 \r\n-0.055433 -0.589265 0.368785 0 \r\n-0.0578342 -0.599152 0.394805 0 \r\n0.252182 -0.595542 -0.920735 0 \r\n0.257957 -0.598841 -0.931888 0 \r\n0.243107 -0.609269 -0.92855 0 \r\n0.194432 -0.838647 -0.463548 0 \r\n0.175133 -0.843734 -0.457925 0 \r\n0.331087 -0.9036 -0.109744 0 \r\n0.310889 -0.910838 -0.106482 0 \r\n0.322075 -0.899681 -0.0887562 0 \r\n-0.0148246 0.11298 0.23214 0 \r\n-0.0277264 0.132187 0.229598 0 \r\n0.127054 0.658526 -0.943357 0 \r\n-0.193053 0.546775 -0.0916115 0 \r\n-0.183506 0.564332 -0.0868683 0 \r\n0.706757 0.0742386 -0.682688 0 \r\n0.696552 0.0733254 -0.705604 0 \r\n0.693663 0.0565879 -0.69767 0 \r\n0.313785 -0.478632 0.555928 0 \r\n0.315134 -0.473599 0.544088 0 \r\n0.330496 -0.478567 0.54855 0 \r\n0.0862697 -0.425133 0.344094 0 \r\n0.111998 -0.418383 0.345537 0 \r\n0.245081 0.782662 -0.181325 0 \r\n0.246305 0.786703 -0.198869 0 \r\n0.276381 0.781909 -0.196101 0 \r\n-0.136461 0.707467 -0.370575 0 \r\n-0.116939 0.723401 -0.368887 0 \r\n0.177997 -0.844976 0.571586 0 \r\n0.184585 -0.863124 0.568359 0 \r\n0.7688 0.158834 -0.398749 0 \r\n0.766927 0.154429 -0.428606 0 \r\n-0.0744301 -0.731881 0.217655 0 \r\n-0.076795 -0.725481 0.185861 0 \r\n-0.0781423 -0.713755 0.207958 0 \r\n-0.00347832 -0.820812 0.0445571 0 \r\n0.010679 -0.833462 0.0360897 0 \r\n-0.454517 -0.681538 0.495665 0 \r\n-0.472844 -0.692282 0.503214 0 \r\n-0.436446 -0.689896 0.493818 0 \r\n0.341173 -0.535267 0.581231 0 \r\n0.371821 -0.529664 0.572758 0 \r\n0.372246 -0.55406 0.579654 0 \r\n-0.318999 0.431179 -0.72645 0 \r\n-0.310977 0.449826 -0.731956 0 \r\n0.170685 -0.150744 -0.926378 0 \r\n0.173944 -0.13423 -0.920706 0 \r\n0.15389 -0.151233 -0.92498 0 \r\n0.577278 -0.896781 0.367545 0 \r\n0.597901 -0.900252 0.335689 0 \r\n0.566435 -0.910573 0.35239 0 \r\n-0.697677 -0.689469 0.863122 0 \r\n-0.716884 -0.668203 0.861011 0 \r\n-0.705874 -0.684453 0.877028 0 \r\n-0.290333 -0.141242 -0.189881 0 \r\n-0.28422 -0.118626 -0.162129 0 \r\n-0.284271 -0.143294 -0.177551 0 \r\n-0.0704813 0.579388 0.0685219 0 \r\n-0.0588709 0.602098 0.0569883 0 \r\n0.376137 0.715156 -0.861768 0 \r\n0.389751 0.739484 -0.84261 0 \r\n0.026534 0.796281 -0.542343 0 \r\n-0.148059 -0.393752 -0.897242 0 \r\n-0.129835 -0.415861 -0.90093 0 \r\n-0.152346 -0.412025 -0.918866 0 \r\n0.532093 -0.567407 0.275183 0 \r\n0.530568 -0.555222 0.257455 0 \r\n0.545655 -0.566486 0.250787 0 \r\n0.356001 0.536995 -0.94681 0 \r\n0.379323 0.528803 -0.940409 0 \r\n0.354845 0.557805 -0.935849 0 \r\n0.357771 -0.705002 -0.552688 0 \r\n0.358746 -0.720814 -0.541211 0 \r\n0.379515 -0.701896 -0.545407 0 \r\n0.245485 0.796909 -0.283742 0 \r\n0.259052 0.796364 -0.30487 0 \r\n0.729488 0.340176 -0.358858 0 \r\n0.730053 0.337618 -0.340114 0 \r\n0.582518 -0.436846 -0.142726 0 \r\n0.576271 -0.420982 -0.125685 0 \r\n-0.00172205 -0.747715 -0.515409 0 \r\n-0.0208664 -0.759824 -0.493217 0 \r\n0.00341235 -0.767718 -0.4987 0 \r\n0.297223 0.984524 -0.601557 0 \r\n0.296055 0.985436 -0.621727 0 \r\n-0.280056 -0.606678 0.492501 0 \r\n-0.21714 -0.602841 0.478295 0 \r\n0.500553 -0.166304 -0.660711 0 \r\n0.504943 -0.154759 -0.63224 0 \r\n-0.0436555 -0.232863 0.540062 0 \r\n-0.0449096 -0.263904 0.533302 0 \r\n-0.0509047 -0.771048 -0.459075 0 \r\n-0.0543856 -0.745 -0.484504 0 \r\n-0.0630365 -0.755731 -0.463853 0 \r\n-0.313503 -0.699489 0.760005 0 \r\n-0.340816 -0.720852 0.775622 0 \r\n-0.394108 -0.709836 0.795182 0 \r\n0.328312 -0.183309 0.170228 0 \r\n0.299231 -0.178062 0.181928 0 \r\n0.00538696 -0.531161 0.430692 0 \r\n0.0117307 -0.536082 0.452057 0 \r\n0.00891759 -0.197048 0.664981 0 \r\n-0.0127047 -0.189919 0.685495 0 \r\n0.65779 0.0120115 -0.742457 0 \r\n0.64633 -0.0020976 -0.752257 0 \r\n0.645816 -0.0142367 -0.736314 0 \r\n-0.258468 -0.338596 -0.228657 0 \r\n-0.257726 -0.35695 -0.231442 0 \r\n-0.150744 0.695446 -0.381276 0 \r\n-0.131837 0.709367 -0.397189 0 \r\n0.567685 -0.188085 -0.110002 0 \r\n0.564831 -0.172633 -0.0952659 0 \r\n0.574823 -0.166722 -0.117003 0 \r\n0.0988319 0.8639 -0.483815 0 \r\n0.0792416 0.86349 -0.49648 0 \r\n0.188396 -0.917194 -0.320993 0 \r\n0.172787 -0.912138 -0.332805 0 \r\n-0.0267847 0.709071 -0.0610844 0 \r\n-0.0232561 0.697044 -0.0351874 0 \r\n0.473366 0.0757172 0.159416 0 \r\n0.458938 0.0770662 0.172646 0 \r\n0.466684 0.102878 0.174161 0 \r\n-0.134172 0.698247 -0.236603 0 \r\n-0.157909 0.681728 -0.245506 0 \r\n-0.136949 0.701412 -0.256564 0 \r\n-0.229387 -0.4591 -0.397215 0 \r\n-0.234089 -0.465046 -0.387722 0 \r\n-0.226936 -0.484479 -0.409616 0 \r\n0.582865 -0.653311 -0.229968 0 \r\n0.58588 -0.63612 -0.205102 0 \r\n0.5892 -0.635884 -0.232502 0 \r\n-0.321899 -0.586149 0.674476 0 \r\n-0.353577 -0.586626 0.68699 0 \r\n0.117639 0.0249822 0.244047 0 \r\n0.132196 0.0455265 0.250596 0 \r\n0.147718 0.0200637 0.245376 0 \r\n0.362897 -0.839062 0.570876 0 \r\n0.374954 -0.859127 0.560349 0 \r\n0.353127 -0.860397 0.564452 0 \r\n0.468386 -0.769199 -0.0348766 0 \r\n0.483385 -0.750934 -0.0477228 0 \r\n0.467898 -0.769937 -0.0479827 0 \r\n0.296579 -0.350087 0.220514 0 \r\n0.294562 -0.334754 0.210609 0 \r\n-0.174466 0.598559 -0.723963 0 \r\n-0.165138 0.592888 -0.738412 0 \r\n-0.150357 0.608993 -0.72667 0 \r\n0.158854 0.872275 -0.464344 0 \r\n0.181345 0.867979 -0.461459 0 \r\n-0.0720761 -0.295274 -0.944286 0 \r\n-0.0753464 -0.281471 -0.933577 0 \r\n-0.10007 -0.291187 -0.939228 0 \r\n-0.255684 0.481174 -0.169064 0 \r\n-0.243909 0.509683 -0.165019 0 \r\n-0.379691 -0.611083 0.515921 0 \r\n-0.370149 -0.620248 0.500293 0 \r\n-0.338735 -0.610305 0.504875 0 \r\n0.488325 -0.804736 -0.215401 0 \r\n0.496444 -0.796743 -0.226303 0 \r\n0.490508 -0.806532 -0.240692 0 \r\n-0.125815 -0.275562 0.642474 0 \r\n-0.144111 -0.232573 0.661355 0 \r\n-0.147016 -0.245184 0.676448 0 \r\n0.51877 -0.641953 -0.901134 0 \r\n0.500262 -0.647607 -0.90799 0 \r\n0.503583 -0.641861 -0.892472 0 \r\n-0.0908838 -0.415594 -0.820189 0 \r\n-0.0956409 -0.393059 -0.813868 0 \r\n-0.43951 -0.669401 0.492096 0 \r\n0.128536 -0.927786 -0.167124 0 \r\n0.10744 -0.923576 -0.181419 0 \r\n-0.208035 0.605148 -0.656068 0 \r\n-0.197648 0.616169 -0.645589 0 \r\n-0.209025 0.609776 -0.635413 0 \r\n0.509851 -0.305077 -0.00767675 0 \r\n0.496034 -0.279028 0.0145359 0 \r\n0.509187 -0.278689 -0.00807685 0 \r\n-0.625066 -0.57577 0.734038 0 \r\n-0.602149 -0.579891 0.733499 0 \r\n-0.015757 0.719748 -0.07667 0 \r\n0.441204 -0.662966 -0.531996 0 \r\n0.459571 -0.660948 -0.517619 0 \r\n0.734442 0.058134 -0.550777 0 \r\n0.736616 0.0515189 -0.530447 0 \r\n0.739486 0.0697402 -0.540918 0 \r\n-0.124392 -0.757707 -0.384433 0 \r\n-0.119514 -0.752769 -0.409931 0 \r\n-0.135545 -0.747267 -0.385226 0 \r\n0.0961898 -0.496778 -0.979281 0 \r\n0.0773282 -0.469981 -0.979177 0 \r\n0.0693771 -0.497351 -0.980996 0 \r\n0.67223 -0.632002 0.157533 0 \r\n0.672858 -0.638801 0.177565 0 \r\n0.439009 -0.711046 -0.498405 0 \r\n0.452727 -0.688736 -0.505584 0 \r\n0.428389 -0.701606 -0.514744 0 \r\n0.451056 -0.526154 0.470331 0 \r\n0.557381 0.282009 -0.00126615 0 \r\n0.547425 0.308387 0.0164846 0 \r\n0.556846 0.295675 -0.00983052 0 \r\n0.642111 0.526873 -0.392354 0 \r\n0.639958 0.532009 -0.368199 0 \r\n0.629026 0.544362 -0.381982 0 \r\n0.671301 -0.679484 0.061611 0 \r\n0.676339 -0.697241 0.0576161 0 \r\n-0.262161 0.155622 -0.0737495 0 \r\n-0.259218 0.160115 -0.063804 0 \r\n-0.260749 0.1371 -0.0624359 0 \r\n-0.383607 0.17221 -0.708332 0 \r\n-0.382858 0.154305 -0.723137 0 \r\n-0.164123 -0.047182 0.897002 0 \r\n-0.149248 -0.0592537 0.910378 0 \r\n-0.180156 -0.0286908 0.919598 0 \r\n-0.366113 0.106915 -0.766503 0 \r\n-0.354233 0.123917 -0.783275 0 \r\n0.579701 -0.558443 -0.401791 0 \r\n0.579815 -0.53547 -0.411448 0 \r\n0.569677 -0.561375 -0.427276 0 \r\n-0.0149439 -0.565714 0.42277 0 \r\n-0.0141112 -0.55163 0.404346 0 \r\n-0.266344 -0.231371 -0.808497 0 \r\n-0.247997 -0.250057 -0.80837 0 \r\n-0.268203 -0.257838 -0.821346 0 \r\n0.236434 0.44583 -0.955194 0 \r\n0.224366 0.435226 -0.954795 0 \r\n-0.190719 -9.70503e-005 0.800485 0 \r\n-0.188599 0.00725375 0.786829 0 \r\n-0.173202 -0.0232406 0.790128 0 \r\n0.521846 -0.731959 -0.0135132 0 \r\n0.529213 -0.744395 -0.0139257 0 \r\n0.556742 -0.66864 -0.155801 0 \r\n0.548005 -0.693697 -0.154286 0 \r\n0.548311 -0.667753 -0.127421 0 \r\n0.610665 -0.824501 0.409477 0 \r\n0.588329 -0.833073 0.427673 0 \r\n0.228963 -0.964121 0.0643505 0 \r\n0.209213 -0.950302 0.0461966 0 \r\n0.199138 -0.962294 0.06241 0 \r\n0.353361 -0.490871 0.555596 0 \r\n0.289975 0.286669 -0.956899 0 \r\n0.287018 0.271504 -0.952344 0 \r\n0.0620486 0.796203 -0.407925 0 \r\n0.0835406 0.7993 -0.403059 0 \r\n0.0724797 0.79652 -0.379175 0 \r\n-0.118326 -0.766795 0.566341 0 \r\n-0.149561 -0.765009 0.553059 0 \r\n-0.376375 0.149309 -0.738777 0 \r\n-0.275874 0.543403 -0.624332 0 \r\n-0.260808 0.558781 -0.628327 0 \r\n-0.258175 0.564109 -0.616658 0 \r\n0.521213 -0.364534 -0.740053 0 \r\n0.526598 -0.347704 -0.752723 0 \r\n0.52237 -0.365741 -0.762789 0 \r\n-0.122928 -0.433789 -0.903973 0 \r\n-0.110569 -0.457476 -0.896403 0 \r\n-0.121764 -0.457822 -0.914984 0 \r\n0.310946 0.72545 -0.0512976 0 \r\n-0.441594 -0.0845809 -0.53414 0 \r\n-0.454305 -0.0800153 -0.501742 0 \r\n-0.447188 -0.0967984 -0.499613 0 \r\n0.403018 -0.831079 -0.0287964 0 \r\n0.431123 -0.806926 -0.0387564 0 \r\n-0.333153 -0.135732 -0.83888 0 \r\n-0.18313 0.454278 -0.916784 0 \r\n-0.192874 0.442053 -0.928258 0 \r\n-0.171989 0.44649 -0.932026 0 \r\n0.332166 0.34331 0.255738 0 \r\n0.339 0.315112 0.258161 0 \r\n-0.289878 0.518664 -0.649064 0 \r\n-0.287243 0.528045 -0.624063 0 \r\n-0.298613 0.508636 -0.637125 0 \r\n-0.149918 0.450823 -0.934993 0 \r\n-0.119631 0.452928 -0.941832 0 \r\n-0.144531 -0.0696516 0.96691 0 \r\n-0.126834 -0.0803904 0.956046 0 \r\n-0.131547 -0.0849566 0.960441 0 \r\n0.617996 -0.428242 -0.933504 0 \r\n0.625882 -0.456278 -0.925804 0 \r\n0.621207 -0.432253 -0.919185 0 \r\n0.464105 -0.618865 0.557204 0 \r\n0.486529 -0.628229 0.543409 0 \r\n0.595686 -0.518356 -0.358269 0 \r\n0.596205 -0.538446 -0.36295 0 \r\n0.602052 -0.524264 -0.335256 0 \r\n-0.0410552 0.764518 -0.390786 0 \r\n-0.0250871 0.771279 -0.39273 0 \r\n-0.0301354 0.772145 -0.362879 0 \r\n0.551637 -0.553828 0.118491 0 \r\n0.557625 -0.549602 0.139913 0 \r\n0.622281 -0.609496 0.206677 0 \r\n0.639325 -0.623451 0.209296 0 \r\n0.682761 -0.159739 -0.839826 0 \r\n0.673832 -0.159263 -0.828501 0 \r\n0.689003 -0.145779 -0.835681 0 \r\n-0.0119524 0.770163 -0.609276 0 \r\n-0.00164947 0.780793 -0.592471 0 \r\n0.0197394 0.796602 -0.559359 0 \r\n-0.223561 0.504335 -0.820868 0 \r\n-0.21086 0.497258 -0.83957 0 \r\n-0.204801 0.512921 -0.821731 0 \r\n-0.100415 -0.0366623 0.142377 0 \r\n-0.119796 -0.0311558 0.128675 0 \r\n0.0429265 0.941528 -0.56926 0 \r\n0.0427916 0.930218 -0.551675 0 \r\n0.029479 0.926585 -0.575607 0 \r\n0.268708 0.758204 -0.110836 0 \r\n0.236246 -0.855852 -0.431195 0 \r\n0.248282 -0.868585 -0.408711 0 \r\n0.269855 -0.855686 -0.423479 0 \r\n-0.111915 -0.296303 0.619438 0 \r\n-0.0868057 -0.339533 0.588111 0 \r\n-0.0978002 -0.30618 0.596054 0 \r\n-0.417481 -0.0788593 -0.600326 0 \r\n-0.405961 -0.0795701 -0.624766 0 \r\n-0.641464 -0.601032 0.630085 0 \r\n-0.64127 -0.590745 0.655357 0 \r\n-0.0651051 -0.150315 0.843765 0 \r\n-0.0438159 -0.177318 0.815826 0 \r\n-0.051148 -0.163652 0.838447 0 \r\n-0.00240174 0.53798 -0.926695 0 \r\n-0.00463531 0.514955 -0.935748 0 \r\n0.000299335 0.533592 -0.932384 0 \r\n-0.712383 -0.565078 0.771824 0 \r\n-0.697191 -0.566532 0.774122 0 \r\n-0.706132 -0.566644 0.787601 0 \r\n0.376676 -0.851931 -0.0521864 0 \r\n0.378161 -0.858032 -0.0664942 0 \r\n0.359633 -0.864389 -0.0521423 0 \r\n0.119874 -0.491345 0.630349 0 \r\n0.143846 -0.490202 0.619121 0 \r\n0.374088 0.834426 -0.803668 0 \r\n0.382124 0.82064 -0.808398 0 \r\n0.386161 0.840122 -0.791803 0 \r\n0.563513 -0.454188 -0.462479 0 \r\n0.551185 -0.457424 -0.482661 0 \r\n0.556063 -0.471189 -0.471996 0 \r\n0.551124 0.054829 0.0355159 0 \r\n0.546071 0.0699271 0.0565161 0 \r\n-0.245768 -0.503915 -0.205118 0 \r\n-0.247707 -0.486145 -0.193918 0 \r\n-0.245069 -0.491468 -0.172569 0 \r\n0.186197 -0.640787 -0.973171 0 \r\n0.156893 -0.644591 -0.975433 0 \r\n-0.206481 -0.163797 -0.741273 0 \r\n-0.191798 -0.173908 -0.749075 0 \r\n-0.211791 -0.169059 -0.749382 0 \r\n-0.156662 0.477158 0.0393635 0 \r\n-0.152675 0.464779 0.0558935 0 \r\n-0.164214 0.448752 0.049102 0 \r\n0.561401 -0.278087 -0.487256 0 \r\n0.554765 -0.271634 -0.527905 0 \r\n0.55695 -0.285018 -0.522057 0 \r\n-0.111104 -0.0279604 0.631885 0 \r\n-0.124714 -0.00276125 0.642588 0 \r\n-0.133372 -0.0218745 0.639548 0 \r\n-0.469128 -0.0013879 -0.32552 0 \r\n-0.473641 -0.0168552 -0.349174 0 \r\n-0.471248 0.0143903 -0.344165 0 \r\n0.600454 -0.270226 -0.906229 0 \r\n0.608719 -0.256983 -0.900841 0 \r\n0.264796 0.797879 -0.423624 0 \r\n0.714877 0.336778 -0.610903 0 \r\n0.709616 0.344073 -0.631199 0 \r\n0.718219 0.325322 -0.620187 0 \r\n-0.532852 -0.697363 0.57115 0 \r\n-0.504204 -0.704973 0.574813 0 \r\n0.0278161 -0.813037 0.509358 0 \r\n0.0516232 -0.832711 0.509705 0 \r\n0.489745 0.292112 -0.934831 0 \r\n-0.280093 0.54566 -0.365734 0 \r\n-0.276489 0.548965 -0.337761 0 \r\n0.164319 0.425576 -0.957536 0 \r\n0.166018 0.412149 -0.958328 0 \r\n0.280081 -0.434927 -0.713142 0 \r\n0.289202 -0.43216 -0.72375 0 \r\n-0.0523688 -0.157815 0.857571 0 \r\n-0.0451555 -0.162579 0.866957 0 \r\n-0.0652239 -0.141414 0.875772 0 \r\n-0.650212 -0.673663 0.740149 0 \r\n-0.677377 -0.66292 0.754034 0 \r\n-0.655429 -0.67652 0.764799 0 \r\n0.0889433 -0.310153 0.237475 0 \r\n0.115935 -0.302488 0.237194 0 \r\n0.100988 -0.321963 0.241474 0 \r\n0.696209 0.332341 -0.700878 0 \r\n0.706674 0.322048 -0.685748 0 \r\n0.698176 0.336331 -0.688643 0 \r\n0.654444 0.411407 -0.69093 0 \r\n0.664836 0.390716 -0.696811 0 \r\n-0.295708 0.105679 0.824569 0 \r\n-0.281321 0.108616 0.796277 0 \r\n-0.180267 -0.0350243 0.884509 0 \r\n-0.194458 -0.0182064 0.880337 0 \r\n-0.179695 -0.0366114 0.858625 0 \r\n-0.113814 -0.636843 -0.516806 0 \r\n-0.131987 -0.623456 -0.506928 0 \r\n-0.132099 -0.64651 -0.496217 0 \r\n-0.240227 -0.210585 -0.5012 0 \r\n-0.258911 -0.658385 0.453734 0 \r\n-0.232471 -0.662257 0.448727 0 \r\n0.555622 0.535926 -0.0847097 0 \r\n0.53614 0.553069 -0.0708617 0 \r\n-0.230864 0.3947 -0.936913 0 \r\n-0.23628 0.416823 -0.919369 0 \r\n0.658096 0.433141 -0.645043 0 \r\n0.664286 0.424989 -0.638386 0 \r\n0.665542 0.431428 -0.621335 0 \r\n-0.0462591 -0.734752 -0.499604 0 \r\n-0.0341273 -0.750069 -0.494825 0 \r\n0.564173 -0.563112 0.209753 0 \r\n0.543159 -0.543491 0.207408 0 \r\n0.563202 -0.552302 0.184102 0 \r\n-0.31309 -0.794345 0.699219 0 \r\n-0.331522 -0.794328 0.712443 0 \r\n-0.309855 -0.793751 0.70573 0 \r\n0.00656004 -0.175057 0.658989 0 \r\n-0.00835637 -0.143294 0.6633 0 \r\n0.00748979 -0.154601 0.650983 0 \r\n0.408823 -0.188515 0.118922 0 \r\n0.388106 -0.187145 0.134435 0 \r\n0.588702 -0.171115 -0.295377 0 \r\n0.584983 -0.165839 -0.325511 0 \r\n-0.0710012 -0.56823 0.237978 0 \r\n-0.0657267 -0.571382 0.267022 0 \r\n-0.073972 -0.583917 0.240769 0 \r\n0.206418 -0.420401 -0.969498 0 \r\n0.232723 -0.449737 -0.970957 0 \r\n0.769064 0.179318 -0.369645 0 \r\n0.768857 0.165459 -0.382564 0 \r\n0.76895 0.159924 -0.37152 0!\r\n-0.461143 0.0532362 -0.477022 0 \r\n-0.456045 0.08089 -0.471393 0 \r\n-0.460755 0.0738753 -0.446709 0 \r\n0.357859 0.774817 -0.349765 0 \r\n0.343549 0.779196 -0.36375 0 \r\n0.364542 0.773572 -0.396966 0 \r\n0.231902 -0.449538 -0.796933 0 \r\n0.216502 -0.45584 -0.794941 0 \r\n-0.047938 -0.471532 -0.747438 0 \r\n-0.0508072 -0.468166 -0.767968 0 \r\n0.410915 -0.933186 0.364759 0 \r\n0.393768 -0.934623 0.373118 0 \r\n0.762542 0.0230455 -0.359713 0 \r\n0.761914 0.0105053 -0.345307 0 \r\n0.763767 0.0290327 -0.339997 0 \r\n0.756794 0.249863 -0.4518 0 \r\n0.757536 0.239901 -0.469237 0 \r\n0.760706 0.22829 -0.45851 0 \r\n0.495702 -0.96869 0.222065 0 \r\n0.517898 -0.967186 0.219751 0 \r\n0.503111 -0.973524 0.202043 0 \r\n0.532892 -0.948923 0.268433 0 \r\n0.54469 -0.938997 0.287785 0 \r\n0.562517 -0.944941 0.260256 0 \r\n-0.057181 -0.0373969 0.666242 0 \r\n-0.0743413 -0.0331871 0.681906 0 \r\n-0.0807329 -0.010741 0.675493 0 \r\n0.632145 -0.0249522 -0.15277 0 \r\n0.616217 -0.0244749 -0.144056 0 \r\n0.633566 0.00440383 -0.144706 0 \r\n0.518209 -0.71813 -0.403365 0 \r\n0.5072 -0.711344 -0.426342 0 \r\n0.516975 -0.74699 -0.14727 0 \r\n0.515174 -0.75808 -0.168369 0 \r\n-0.071767 0.585505 -0.80743 0 \r\n-0.0704947 0.571995 -0.821854 0 \r\n0.272143 -0.941718 0.5283 0 \r\n0.294577 -0.929047 0.541043 0 \r\n0.298183 -0.938471 0.524788 0 \r\n-0.282492 0.243476 -0.912282 0 \r\n-0.285379 0.218255 -0.911957 0 \r\n-0.28161 0.229301 -0.921844 0 \r\n0.314993 0.91625 -0.766276 0 \r\n0.331497 0.913517 -0.752466 0 \r\n-0.0320027 -0.298558 0.51659 0 \r\n-0.0479769 -0.292902 0.528186 0 \r\n-0.0272751 -0.579969 0.450968 0 \r\n-0.0380429 -0.58367 0.456769 0 \r\n-0.388724 0.319714 -0.511898 0 \r\n-0.392608 0.311832 -0.50133 0 \r\n-0.394486 0.299385 -0.519706 0 \r\n0.581288 -0.887045 0.0311317 0 \r\n0.559026 -0.887775 0.0234012 0 \r\n0.563155 -0.909333 0.0367538 0 \r\n-0.113376 -0.0902264 0.945265 0 \r\n-0.35119 0.411531 -0.327947 0 \r\n-0.356167 0.405834 -0.350572 0 \r\n-0.349071 0.421243 -0.35629 0 \r\n-0.385238 0.250175 -0.633456 0 \r\n-0.380495 0.250283 -0.656564 0 \r\n-0.37881 0.273745 -0.639325 0 \r\n0.248012 -0.920067 -0.297203 0 \r\n0.231353 -0.917565 -0.314142 0 \r\n0.231872 -0.925773 -0.287094 0 \r\n0.441339 -0.582907 -0.825812 0 \r\n0.460681 -0.592948 -0.831524 0 \r\n0.446195 -0.600266 -0.841534 0 \r\n0.603292 -0.0790186 -0.587374 0 \r\n0.627599 -0.0697829 -0.573438 0 \r\n0.619313 -0.0684489 -0.591943 0 \r\n0.696023 0.396506 -0.264654 0 \r\n0.698098 0.387079 -0.254831 0 \r\n0.686383 0.405735 -0.241972 0 \r\n-0.0946062 0.416444 -0.96784 0 \r\n-0.0749508 0.403095 -0.970725 0 \r\n-0.186039 0.285092 0.10484 0 \r\n-0.189695 0.299645 0.0964038 0 \r\n-0.176759 0.306919 0.113116 0 \r\n0.494753 -0.631817 -0.502532 0 \r\n0.50762 -0.603972 -0.503374 0 \r\n0.489902 -0.614753 -0.514158 0 \r\n0.116613 -0.532067 0.609227 0 \r\n0.131609 -0.547712 0.596817 0 \r\n0.0511147 -0.447223 0.700583 0 \r\n0.0651755 -0.4482 0.6925 0 \r\n0.0702856 -0.466203 0.676649 0 \r\n0.629617 -0.879414 0.0701457 0 \r\n0.626577 -0.858572 0.0523706 0 \r\n0.616454 -0.88151 0.056127 0 \r\n0.494281 -0.487446 0.21409 0 \r\n0.495874 -0.482914 0.196871 0 \r\n0.51149 -0.504136 0.209001 0 \r\n-0.112143 -0.298342 -0.785378 0 \r\n-0.112344 -0.269396 -0.770994 0 \r\n-0.101222 -0.285527 -0.768098 0 \r\n0.302863 0.77957 -0.219886 0 \r\n0.289928 0.786958 -0.234259 0 \r\n0.315185 0.780576 -0.2405 0 \r\n0.41519 0.271135 0.226065 0 \r\n0.436467 0.277206 0.21092 0 \r\n0.421794 0.245713 0.223569 0 \r\n-0.0139815 -0.814991 0.0618394 0 \r\n-0.0189706 -0.804408 0.051525 0 \r\n-0.028265 -0.795256 0.0569883 0 \r\n0.372241 -0.972893 0.24382 0 \r\n0.379727 -0.976902 0.226397 0 \r\n0.349936 -0.982067 0.220762 0 \r\n0.431897 0.822114 -0.679403 0 \r\n0.42717 0.839977 -0.660726 0 \r\n0.430874 0.836657 -0.689842 0 \r\n-0.0825506 0.333151 0.19356 0 \r\n-0.0882961 0.351253 0.184501 0 \r\n-0.137837 0.356027 -0.964473 0 \r\n-0.122415 0.355482 -0.961376 0 \r\n-0.123247 0.371389 -0.967967 0 \r\n0.445733 -0.9055 0.0286393 0 \r\n0.452198 -0.893911 0.0223313 0 \r\n0.435413 -0.893755 0.0243859 0 \r\n-0.334419 0.0159904 -0.164995 0 \r\n-0.347385 0.0373081 -0.16548 0 \r\n-0.0859129 -0.663269 -0.526019 0 \r\n-0.104304 -0.653813 -0.517739 0 \r\n-0.0955351 -0.669352 -0.514375 0 \r\n-0.126345 -0.221987 -0.657334 0 \r\n-0.14556 -0.216498 -0.620697 0 \r\n-0.135575 -0.232699 -0.617543 0 \r\n0.301477 -0.574955 -0.631066 0 \r\n0.329504 -0.589734 -0.617994 0 \r\n0.322547 -0.550538 -0.630715 0 \r\n-0.015371 -0.509607 -0.651456 0 \r\n-0.0415714 -0.503771 -0.635477 0 \r\n-0.0239945 -0.513969 -0.633327 0 \r\n-0.00517544 -0.872804 0.158026 0 \r\n0.0107652 -0.896059 0.176958 0 \r\n-0.236822 0.0144821 0.957467 0 \r\n-0.237504 0.0196834 0.9435 0 \r\n-0.221693 0.00214952 0.956341 0 \r\n0.741359 0.304766 -0.491751 0 \r\n0.744186 0.293689 -0.492967 0 \r\n-0.659088 -0.70259 0.823313 0 \r\n-0.649333 -0.715958 0.832247 0 \r\n-0.642879 -0.709113 0.812106 0 \r\n-0.418602 0.0154643 -0.195958 0 \r\n-0.410784 0.0303351 -0.188537 0 \r\n0.571239 -0.493106 -0.104971 0 \r\n0.574726 -0.514508 -0.119555 0 \r\n-0.377505 0.191422 -0.714746 0 \r\n-0.382576 0.194914 -0.696229 0 \r\n-0.0718722 -0.618747 -0.943422 0 \r\n-0.0843403 -0.588196 -0.954666 0 \r\n-0.092805 -0.573757 -0.94169 0 \r\n-0.110746 -0.721249 0.443461 0 \r\n-0.141372 -0.728714 0.456536 0 \r\n0.47498 -0.256777 0.0429813 0 \r\n0.451067 -0.234136 0.0755209 0 \r\n0.627081 0.30833 -0.832907 0 \r\n0.639201 0.310639 -0.809372 0 \r\n0.593087 0.583197 -0.239312 0 \r\n0.598939 0.584769 -0.26112 0 \r\n0.601087 0.572218 -0.239123 0 \r\n-0.165671 -0.61343 0.447912 0 \r\n-0.188435 -0.622087 0.450817 0 \r\n-0.150744 -0.623721 0.437894 0 \r\n0.530095 0.540035 -0.0472487 0 \r\n0.519293 0.56716 -0.0567522 0 \r\n0.0767251 -0.228263 -0.942386 0 \r\n0.570497 -0.364874 -0.445863 0 \r\n0.575457 -0.369991 -0.41793 0 \r\n0.571991 -0.349944 -0.431401 0 \r\n0.0559658 -0.681107 -0.593563 0 \r\n0.0783228 -0.672758 -0.606811 0 \r\n0.124116 -0.922647 0.345251 0 \r\n0.111682 -0.917246 0.345692 0 \r\n0.122606 -0.916709 0.359877 0 \r\n-0.620579 -0.578113 0.710494 0 \r\n-0.633519 -0.575605 0.720372 0 \r\n-0.636895 -0.576841 0.708071 0 \r\n0.318967 0.413882 -0.960788 0 \r\n0.347493 0.425114 -0.962425 0 \r\n0.639807 0.0275178 -0.143712 0 \r\n-0.0534241 0.656502 -0.794896 0 \r\n-0.0576993 0.651672 -0.780056 0 \r\n0.643439 0.152733 -0.958202 0 \r\n0.633337 0.188168 -0.959905 0 \r\n-0.094071 -0.71843 0.432202 0 \r\n-0.098749 -0.731889 0.444929 0 \r\n-0.476341 -0.022205 -0.369294 0 \r\n-0.476473 -0.0351908 -0.393738 0 \r\n-0.475892 -0.0140629 -0.392264 0 \r\n-0.370831 0.203552 -0.72483 0 \r\n-0.364347 0.222785 -0.733632 0 \r\n-0.36999 0.233359 -0.711444 0 \r\n0.665106 0.0985565 -0.90884 0 \r\n0.665946 0.0999625 -0.923313 0 \r\n0.679255 0.0612729 -0.913261 0 \r\n0.6542 -0.118502 -0.425151 0 \r\n0.635994 -0.120773 -0.435071 0 \r\n0.520886 -0.231516 -0.634154 0 \r\n0.514608 -0.228911 -0.660294 0 \r\n0.524352 -0.244807 -0.651145 0 \r\n0.0112264 -0.621797 0.558231 0 \r\n0.0314427 -0.62565 0.556348 0 \r\n-0.0881937 0.603472 0.0269859 0 \r\n-0.0818121 0.625461 0.00725103 0 \r\n-0.0695308 0.620101 0.0269184 0 \r\n-0.290762 0.530712 -0.388785 0 \r\n-0.301338 0.515116 -0.416783 0 \r\n-0.285243 0.542256 -0.417309 0 \r\n-0.449005 -0.717406 0.598446 0 \r\n-0.434805 -0.721147 0.591582 0 \r\n0.585289 -0.581683 0.101546 0 \r\n0.604159 -0.586937 0.111512 0 \r\n0.429012 -0.734514 -0.488299 0 \r\n0.45335 -0.721645 -0.479138 0 \r\n0.248248 -0.943022 0.524482 0 \r\n0.101236 -0.399252 0.693818 0 \r\n0.0939254 -0.380827 0.705186 0 \r\n0.38514 -0.22648 0.142611 0 \r\n0.403911 -0.234943 0.126651 0 \r\n0.118618 0.159706 0.273196 0 \r\n0.121087 0.182243 0.275764 0 \r\n0.143544 0.163197 0.27483 0 \r\n-0.238751 -0.107508 -0.0300395 0 \r\n-0.250396 -0.100115 -0.0474001 0 \r\n0.403983 -0.48016 0.374913 0 \r\n0.418116 -0.490999 0.376397 0 \r\n0.482265 -0.102012 0.0655853 0 \r\n0.503547 -0.104239 0.0384296 0 \r\n0.486229 -0.120463 0.0511877 0 \r\n-0.310651 -0.0157684 -0.967554 0 \r\n-0.307258 0.0137843 -0.959951 0 \r\n-0.314474 -0.0167645 -0.959808 0 \r\n0.60225 -0.91609 0.295127 0 \r\n0.612574 -0.901784 0.309534 0 \r\n0.627766 -0.90383 0.284127 0 \r\n0.211587 -0.524382 -0.975866 0 \r\n0.187073 -0.49759 -0.975466 0 \r\n0.182613 -0.526762 -0.976982 0 \r\n-0.143919 0.637643 -0.11247 0 \r\n-0.123758 0.655086 -0.102426 0 \r\n-0.134609 0.637513 -0.0926829 0 \r\n0.207249 -0.441263 -0.746938 0 \r\n0.195007 -0.44667 -0.753698 0 \r\n-0.101206 -0.667625 0.414214 0 \r\n-0.115666 -0.676734 0.423568 0 \r\n-0.0140552 -0.860629 0.141221 0 \r\n-0.0187242 -0.863929 0.172216 0 \r\n0.548285 -0.536179 -0.473333 0 \r\n0.541043 -0.5143 -0.487658 0 \r\n0.532622 -0.540411 -0.493586 0 \r\n0.575218 -0.201804 -0.135586 0 \r\n0.5819 -0.188403 -0.15388 0 \r\n0.579441 -0.208033 -0.157727 0 \r\n-0.039258 -0.826938 0.143171 0 \r\n-0.0315175 -0.837413 0.140276 0 \r\n0.314858 0.842794 -0.499157 0 \r\n0.340099 0.835204 -0.519005 0 \r\n0.330511 0.82214 -0.516451 0 \r\n0.111001 -0.908689 0.369372 0 \r\n0.0972504 -0.905137 0.360381 0 \r\n0.0980809 -0.902516 0.369434 0 \r\n0.485061 0.227309 0.164117 0 \r\n0.499531 0.218022 0.14768 0 \r\n0.483442 0.202203 0.168173 0 \r\n-0.206097 0.282955 0.0721381 0 \r\n-0.204049 0.308284 0.0658602 0 \r\n-0.196927 0.303147 0.0818507 0 \r\n0.582108 -0.335263 -0.894863 0 \r\n0.590155 -0.344952 -0.904759 0 \r\n0.589045 -0.359774 -0.896186 0 \r\n0.706934 -0.0604201 -0.469426 0 \r\n0.713637 -0.0392232 -0.493894 0 \r\n0.700423 -0.0529556 -0.493536 0 \r\n-0.242518 -0.402097 -0.0985101 0 \r\n0.33049 -0.397717 0.280921 0 \r\n0.354398 -0.40141 0.269185 0 \r\n0.346621 -0.410609 0.293752 0 \r\n-0.25186 0.378834 -0.116539 0 \r\n-0.262922 0.371104 -0.13278 0 \r\n-0.255448 0.409995 -0.131467 0 \r\n0.108057 -0.121705 0.211388 0 \r\n0.126193 -0.116491 0.213182 0 \r\n0.11395 -0.140575 0.210023 0 \r\n0.0844311 0.713335 -0.0188587 0 \r\n0.0591758 0.72172 -0.0372747 0 \r\n0.40527 -0.625317 -0.962968 0 \r\n0.401933 -0.633385 -0.957169 0 \r\n0.627355 0.479913 -0.169924 0 \r\n0.620242 0.469163 -0.146202 0 \r\n0.617944 0.481885 -0.154102 0 \r\n0.763694 0.191655 -0.471696 0 \r\n0.763305 0.206634 -0.461019 0 \r\n-0.0971465 -0.779296 -0.397049 0 \r\n0.662133 0.0839978 -0.872261 0 \r\n0.664593 0.058492 -0.850284 0 \r\n0.650107 0.10486 -0.858341 0 \r\n0.417727 -0.860451 -0.168673 0 \r\n0.428913 -0.843719 -0.146638 0 \r\n0.44329 -0.836163 -0.166633 0 \r\n0.540472 0.636024 -0.53418 0 \r\n0.528306 0.651356 -0.532422 0 \r\n-0.0971207 -0.565382 -0.924771 0 \r\n-0.100985 -0.546338 -0.922348 0 \r\n-0.752604 -0.587955 0.744181 0 \r\n-0.750577 -0.579288 0.741001 0 \r\n0.219863 0.80536 -0.427216 0 \r\n0.226878 0.809942 -0.450567 0 \r\n-0.381969 0.318478 -0.558719 0 \r\n-0.380046 0.308828 -0.589202 0 \r\n-0.248811 -0.498846 -0.253142 0 \r\n-0.251037 -0.488449 -0.263194 0 \r\n-0.250632 -0.488196 -0.236519 0 \r\n0.210945 0.781438 -0.890441 0 \r\n0.205252 0.802974 -0.880696 0 \r\n0.531289 -0.0684028 -0.924559 0 \r\n0.504595 -0.0619636 -0.917096 0 \r\n0.518556 -0.0879601 -0.92522 0 \r\n0.412658 -0.477383 -0.970722 0 \r\n0.447207 -0.484492 -0.971161 0 \r\n0.422573 -0.452008 -0.970013 0 \r\n0.503775 -0.213369 -0.950696 0 \r\n0.464805 -0.224349 -0.950193 0 \r\n0.486337 -0.224287 -0.954702 0 \r\n0.726457 0.0862755 -0.627257 0 \r\n0.71427 0.0624092 -0.637197 0 \r\n0.717923 0.0574284 -0.614049 0 \r\n-0.265339 -0.14259 -0.106886 0 \r\n0.11536 -0.404896 0.44799 0 \r\n0.103248 -0.385589 0.460483 0 \r\n0.0943647 -0.392433 0.446818 0 \r\n-0.0751586 -0.111111 0.716532 0 \r\n-0.0753541 -0.0867385 0.705356 0 \r\n0.602753 -0.0413452 -0.131038 0 \r\n0.595634 -0.0158612 -0.115617 0 \r\n0.607677 -0.0283469 -0.136698 0 \r\n0.413359 0.870044 -0.618594 0 \r\n0.404159 0.886485 -0.60947 0 \r\n-0.346996 -0.20862 -0.379147 0 \r\n-0.329221 -0.21448 -0.384805 0 \r\n-0.341976 -0.208269 -0.395838 0 \r\n0.270405 0.789245 -0.225747 0 \r\n-0.398886 0.278512 -0.527075 0 \r\n-0.402059 0.276962 -0.511022 0 \r\n-0.402575 0.26397 -0.528958 0 \r\n-0.0624653 0.128789 0.207833 0 \r\n0.00377135 0.487732 0.182996 0 \r\n-0.0150181 0.501232 0.166612 0 \r\n0.00870545 0.509144 0.171889 0 \r\n0.079541 -0.299331 0.628793 0 \r\n0.06676 -0.280038 0.634946 0 \r\n0.0818352 -0.291955 0.617502 0 \r\n0.317608 -0.901473 -0.312847 0 \r\n0.321914 -0.907071 -0.287795 0 \r\n0.342564 -0.896934 -0.302453 0 \r\n0.3017 0.355622 -0.962071 0 \r\n0.315154 0.372355 -0.961303 0 \r\n0.284874 0.368474 -0.96196 0 \r\n-0.260972 0.0834219 -0.979788 0 \r\n-0.268817 0.0436037 -0.979483 0 \r\n-0.262639 0.0311621 -0.979908 0 \r\n0.339793 0.811073 -0.523045 0 \r\n0.314552 0.818663 -0.503197 0 \r\n0.224649 -0.198744 -0.95859 0 \r\n0.248389 -0.201485 -0.959589 0 \r\n0.250058 -0.18852 -0.955191 0 \r\n0.363073 -0.377999 0.194193 0 \r\n0.383889 -0.386803 0.180174 0 \r\n0.296533 0.312948 -0.960606 0 \r\n0.293923 0.299593 -0.960083 0 \r\n0.39149 -0.491646 0.516917 0 \r\n0.413021 -0.500808 0.507459 0 \r\n0.558408 0.486808 -0.873142 0 \r\n0.562642 0.479627 -0.864706 0 \r\n0.553977 0.492365 -0.859901 0 \r\n0.46011 0.544595 0.0612739 0 \r\n0.447378 0.561955 0.0629029 0 \r\n0.460836 0.563102 0.0411432 0 \r\n0.255749 -0.993727 0.116333 0 \r\n0.247967 -0.983701 0.093016 0 \r\n0.226669 -0.986139 0.10388 0 \r\n-0.177539 -0.677116 -0.151625 0 \r\n0.586679 0.556332 -0.605392 0 \r\n0.596967 0.5359 -0.619374 0 \r\n0.00065681 0.280059 -0.938984 0 \r\n-0.0179438 0.302758 -0.945907 0 \r\n-0.0196715 0.293004 -0.93781 0 \r\n-0.257218 0.0799301 0.736844 0 \r\n-0.276357 0.0922212 0.754375 0 \r\n0.218747 -0.443568 -0.722526 0 \r\n0.193916 -0.453709 -0.719817 0 \r\n0.209049 -0.454374 -0.709628 0 \r\n0.484106 0.0194188 0.129754 0 \r\n0.470108 0.0270405 0.145263 0 \r\n0.290982 -0.616023 0.59636 0 \r\n0.268381 -0.615971 0.596034 0 \r\n0.282421 -0.598267 0.595209 0 \r\n0.172293 0.804847 -0.413952 0 \r\n0.166962 0.803036 -0.393037 0 \r\n0.152394 0.804188 -0.398773 0 \r\n-0.204385 -0.255103 -0.447006 0 \r\n-0.187313 -0.254023 -0.480186 0 \r\n-0.19825 -0.242599 -0.468349 0 \r\n0.137219 -0.963825 0.104794 0 \r\n0.114816 -0.959623 0.120322 0 \r\n0.149718 -0.976873 0.128343 0 \r\n-0.0857598 0.709008 -0.588305 0 \r\n-0.066838 0.719021 -0.586153 0 \r\n-0.071577 0.72065 -0.570898 0 \r\n0.0137853 0.787876 -0.269356 0 \r\n-0.00212105 0.782988 -0.277211 0 \r\n0.00162285 0.785785 -0.301861 0 \r\n0.44839 0.664436 -0.730994 0 \r\n0.438749 0.66414 -0.756234 0 \r\n0.446558 0.654972 -0.750666 0 \r\n0.423839 -0.381678 0.101224 0 \r\n0.441988 -0.387707 0.0790074 0 \r\n-0.0347348 -0.493372 0.280454 0 \r\n-0.0353631 -0.486418 0.270596 0 \r\n-0.0283983 -0.478867 0.278498 0 \r\n-0.158294 0.349266 -0.970803 0 \r\n-0.229571 0.615582 -0.42498 0 \r\n-0.209702 0.638089 -0.417681 0 \r\n-0.222253 0.625746 -0.398486 0 \r\n0.652405 0.12539 -0.952496 0 \r\n0.666952 0.0878837 -0.946514 0 \r\n-0.0940414 -0.351358 -0.765495 0 \r\n0.649686 0.202229 -0.812167 0 \r\n0.641971 0.215356 -0.827084 0 \r\n0.642599 0.194337 -0.824378 0 \r\n0.000547855 0.916349 -0.671506 0 \r\n-0.0083242 0.907026 -0.662446 0 \r\n-0.0129864 0.90012 -0.684453 0 \r\n0.583343 0.422572 -0.853038 0 \r\n0.589937 0.407173 -0.847022 0 \r\n0.584843 0.420517 -0.836895 0 \r\n-0.231607 0.170139 0.018301 0 \r\n-0.235788 0.197565 0.0108714 0 \r\n-0.226653 0.186358 0.0315863 0 \r\n0.577247 -0.2766 -0.326077 0 \r\n0.578663 -0.270454 -0.306688 0 \r\n0.576676 -0.258311 -0.318361 0 \r\n-0.265997 0.147212 -0.974145 0 \r\n-0.27706 0.142159 -0.966367 0 \r\n0.127985 -0.636967 -0.980563 0 \r\n0.1271 -0.66252 -0.976043 0 \r\n0.00379937 -0.474198 0.328955 0 \r\n-0.00604075 -0.492862 0.333468 0 \r\n-0.0156501 -0.486192 0.308445 0 \r\n0.0250367 -0.910224 0.193368 0 \r\n0.028187 -0.914611 0.21283 0 \r\n0.0345251 -0.920401 0.184356 0 \r\n0.0112487 -0.0281711 -0.905601 0 \r\n0.0224716 -0.0353615 -0.905905 0 \r\n0.0325966 -0.00134433 -0.905627 0 \r\n-0.208598 0.26148 0.0718943 0 \r\n-0.270894 0.0334895 0.763678 0 \r\n-0.2507 0.036784 0.738634 0 \r\n-0.330815 0.359181 -0.755814 0 \r\n-0.323829 0.390804 -0.754331 0 \r\n-0.331367 0.373942 -0.743392 0 \r\n-0.609025 -0.622195 0.581128 0 \r\n0.0278975 -0.502651 0.631552 0 \r\n0.0380412 -0.520656 0.610415 0 \r\n-0.0723149 -0.551636 0.218008 0 \r\n-0.0809 -0.548259 0.196975 0 \r\n-0.0739683 -0.51913 0.203258 0 \r\n-0.0519979 0.70204 -0.70395 0 \r\n-0.0540987 0.711047 -0.711094 0 \r\n-0.0486089 0.727686 -0.686479 0 \r\n0.0254237 0.824013 -0.824451 0 \r\n0.0286727 0.851645 -0.802194 0 \r\n0.00941364 0.831235 -0.804685 0 \r\n0.566663 0.465697 -0.899027 0 \r\n0.572349 0.460125 -0.889941 0 \r\n0.561386 0.479643 -0.887031 0 \r\n0.50695 -0.602455 0.515671 0 \r\n0.505804 -0.588611 0.503287 0 \r\n0.519459 -0.612701 0.50184 0 \r\n0.282094 -0.47811 -0.66667 0 \r\n0.285347 -0.462499 -0.675933 0 \r\n0.275152 -0.469437 -0.676925 0 \r\n-0.240032 -0.725071 0.728647 0 \r\n-0.27806 -0.744398 0.742894 0 \r\n-0.298239 -0.729832 0.754692 0 \r\n-0.118668 -0.516857 -0.546295 0 \r\n-0.127805 -0.530824 -0.535233 0 \r\n-0.101162 -0.128161 0.819956 0 \r\n-0.111878 -0.114142 0.831599 0 \r\n-0.121562 -0.108406 0.824392 0 \r\n-0.249703 -0.194773 -0.970015 0 \r\n-0.265675 -0.189406 -0.976793 0 \r\n-0.255711 -0.228974 -0.975105 0 \r\n-0.353679 -0.760911 0.654984 0 \r\n-0.377739 -0.758691 0.666304 0 \r\n-0.366122 -0.767893 0.675653 0 \r\n-0.327574 -0.0192445 -0.16655 0 \r\n-0.321468 0.0166213 -0.16019 0 \r\n0.230862 0.354262 0.267919 0 \r\n0.192606 0.353386 0.270689 0 \r\n0.219603 0.383768 0.262424 0 \r\n0.527932 -0.201192 -0.951208 0 \r\n0.519475 -0.192955 -0.945526 0 \r\n0.51685 -0.205069 -0.949525 0 \r\n-0.586541 -0.613165 0.813419 0 \r\n-0.621904 -0.614947 0.839386 0 \r\n-0.612167 -0.604417 0.819468 0 \r\n0.161446 -0.00271821 0.23929 0 \r\n0.175868 -0.0305815 0.232753 0 \r\n0.493896 0.69997 -0.363672 0 \r\n0.475468 0.713839 -0.347587 0 \r\n0.475447 0.712832 -0.376885 0 \r\n0.542273 -0.0943595 -0.688797 0 \r\n0.544114 -0.0926924 -0.665271 0 \r\n0.155105 -0.958029 0.268101 0 \r\n0.141089 -0.944844 0.297716 0 \r\n0.17175 -0.956547 0.287744 0 \r\n0.391391 -0.381478 0.143244 0 \r\n0.416232 -0.398618 0.126045 0 \r\n0.392485 -0.390618 0.155405 0 \r\n0.523771 -0.974766 0.0856434 0 \r\n0.520736 -0.962507 0.0693156 0 \r\n0.507433 -0.96595 0.0751837 0 \r\n-0.198685 0.50214 -0.0654238 0 \r\n-0.190975 0.517756 -0.0593913 0 \r\n-0.192463 0.496505 -0.0476263 0 \r\n-0.00959169 -0.82702 0.0718061 0 \r\n0.0041791 -0.849024 0.0805536 0 \r\n0.490867 -0.00782035 -0.910248 0 \r\n0.478135 -0.0273777 -0.910909 0 \r\n-0.265446 0.33463 -0.924819 0 \r\n-0.252863 0.330904 -0.94176 0 \r\n0.479701 -0.982499 0.168521 0 \r\n0.472246 -0.978868 0.188082 0 \r\n0.488371 -0.978659 0.184797 0 \r\n0.0856944 -0.304694 0.520507 0 \r\n0.0753504 -0.281651 0.531376 0 \r\n0.0746489 -0.295043 0.51647 0 \r\n0.373253 0.693744 -0.0358354 0 \r\n0.346569 0.702631 -0.0297386 0 \r\n-0.214577 0.0828926 0.0462641 0 \r\n-0.227243 0.0601989 0.0256405 0 \r\n0.0385247 0.2787 0.267115 0 \r\n0.023573 0.25199 0.263349 0 \r\n-0.0047515 0.485911 -0.953038 0 \r\n0.0114926 0.505222 -0.949305 0 \r\n-0.0181784 0.491255 -0.94517 0 \r\n-0.0184087 -0.502355 -0.664862 0 \r\n-0.0387697 -0.489893 -0.673651 0 \r\n0.0662007 0.854146 -0.824183 0 \r\n0.0777484 0.847142 -0.836527 0 \r\n0.0144385 -0.365615 0.466735 0 \r\n0.00618491 -0.35025 0.476386 0 \r\n0.0119009 -0.384435 0.460297 0 \r\n0.0261672 0.781006 -0.485269 0 \r\n0.0411521 0.792462 -0.474686 0 \r\n0.366217 -0.695193 0.59014 0 \r\n0.372069 -0.730646 0.587178 0 \r\n0.34466 -0.722281 0.59084 0 \r\n0.047625 -0.801 -0.484955 0 \r\n0.0446455 -0.773745 -0.512131 0 \r\n0.0255363 -0.782865 -0.493717 0 \r\n0.538013 -0.963444 0.220316 0 \r\n0.559228 -0.959094 0.216628 0 \r\n0.546522 -0.967671 0.19604 0 \r\n0.101978 -0.61979 0.573635 0 \r\n0.0952906 -0.632429 0.570274 0 \r\n0.231617 -0.330611 0.241485 0 \r\n0.224852 -0.342112 0.250652 0 \r\n0.544441 -0.622552 0.403205 0 \r\n0.536379 -0.615116 0.397347 0 \r\n0.550916 -0.627076 0.384086 0 \r\n0.74939 0.135984 -0.559106 0 \r\n0.746531 0.109286 -0.553703 0 \r\n0.75202 0.130106 -0.535609 0 \r\n0.272179 -0.584015 -0.970592 0 \r\n0.24959 -0.586195 -0.974467 0 \r\n0.238974 -0.609251 -0.971553 0 \r\n-0.233159 -0.763329 0.707152 0 \r\n-0.209267 -0.767902 0.688598 0 \r\n-0.267666 -0.773205 0.71523 0 \r\n-0.104192 -0.63076 -0.52845 0 \r\n-0.163116 -0.383896 0.0983132 0 \r\n-0.177802 -0.38217 0.07398 0 \r\n-0.168686 -0.355424 0.0917708 0 \r\n0.291952 0.980788 -0.557157 0 \r\n0.293985 0.983891 -0.579808 0 \r\n0.310033 0.974432 -0.570004 0 \r\n0.535813 -0.263752 -0.634273 0 \r\n0.545655 -0.279328 -0.603123 0 \r\n0.540472 -0.262989 -0.593856 0 \r\n-0.0811214 -0.000722201 0.164252 0 \r\n-0.0682762 0.0102147 0.174763 0 \r\n-0.0637157 -0.00633595 0.17386 0 \r\n0.584283 -0.734763 0.471976 0 \r\n0.0834763 0.88166 -0.805561 0 \r\n0.112656 0.879901 -0.820374 0 \r\n-0.0304357 -0.626682 -0.88251 0 \r\n-0.0303356 -0.646834 -0.896723 0 \r\n-0.0546668 -0.609655 -0.892486 0 \r\n0.387287 -0.538594 -0.606802 0 \r\n0.368043 -0.541682 -0.613903 0 \r\n0.369817 -0.562229 -0.610543 0 \r\n-0.538957 -0.790022 0.818483 0 \r\n-0.529065 -0.793385 0.824859 0 \r\n-0.51268 -0.792062 0.807389 0 \r\n-0.111811 0.679586 -0.132794 0 \r\n-0.112445 0.672851 -0.12004 0 \r\n-0.132434 0.66195 -0.134967 0 \r\n0.163458 0.763502 -0.0954565 0 \r\n0.152397 0.771315 -0.113793 0 \r\n0.590524 -0.307719 -0.914357 0 \r\n0.592407 -0.288332 -0.911697 0 \r\n0.545168 -0.189839 -0.45014 0 \r\n0.537157 -0.184043 -0.4747 0 \r\n0.537448 -0.198555 -0.483293 0 \r\n0.274507 0.493367 0.21064 0 \r\n0.292512 0.478491 0.217878 0 \r\n0.0226002 -0.256122 0.51865 0 \r\n0.00193882 -0.233656 0.529981 0 \r\n0.0176677 -0.278453 0.507282 0 \r\n-0.351645 -0.236806 -0.881105 0 \r\n-0.345522 -0.26206 -0.884066 0 \r\n-0.35441 -0.251638 -0.896132 0 \r\n0.535315 0.307485 0.0527546 0 \r\n0.523158 0.333966 0.0684285 0 \r\n0.535802 0.321203 0.0407229 0 \r\n-0.451873 0.0557163 -0.53082 0 \r\n-0.446401 0.0775848 -0.534718 0 \r\n-0.45096 0.0821194 -0.505603 0 \r\n0.201481 -0.456818 0.552426 0 \r\n0.198896 -0.449613 0.535263 0 \r\n0.294261 0.679513 0.0326996 0 \r\n0.296196 0.696671 0.00687688 0 \r\n0.310703 0.682481 0.0231236 0 \r\n-0.0339721 -0.534662 -0.816664 0 \r\n-0.0506992 -0.529037 -0.836908 0 \r\n-0.0484413 -0.507547 -0.81821 0 \r\n0.404481 -0.373034 0.122003 0 \r\n0.413182 -0.365234 0.109344 0 \r\n-0.134335 0.143824 0.144479 0 \r\n-0.132942 0.161179 0.14711 0 \r\n-0.120118 0.15653 0.160065 0 \r\n-0.0550294 0.72612 -0.715551 0 \r\n-0.0584185 0.700474 -0.733021 0 \r\n-0.450027 0.124165 -0.440855 0 \r\n-0.450573 0.102758 -0.475291 0 \r\n0.216753 -0.172264 -0.946167 0 \r\n0.219637 -0.162008 -0.939815 0 \r\n0.200123 -0.168475 -0.941792 0 \r\n0.0728159 -0.947481 0.169762 0 \r\n0.0832649 -0.952489 0.188097 0 \r\n0.093934 -0.95849 0.16752 0 \r\n0.683161 0.467949 -0.381279 0 \r\n-0.405234 0.23009 -0.232332 0 \r\n-0.408559 0.198727 -0.224939 0 \r\n0.594705 0.360478 -0.940488 0 \r\n0.584293 0.387592 -0.94514 0 \r\n0.593123 0.34622 -0.952412 0 \r\n-0.179476 0.633591 -0.631746 0 \r\n-0.16238 0.650738 -0.614762 0 \r\n-0.181543 0.637944 -0.607951 0 \r\n0.754999 0.188666 -0.533286 0 \r\n0.750713 0.20748 -0.562949 0 \r\n0.750594 0.175618 -0.570675 0 \r\n-0.324138 0.286934 -0.800747 0 \r\n-0.329708 0.272676 -0.794098 0 \r\n-0.322403 0.267483 -0.810149 0 \r\n-0.452375 0.0314505 -0.54302 0 \r\n-0.456934 0.0359851 -0.513906 0 \r\n0.0751199 -0.306585 -0.967674 0 \r\n0.101089 -0.283172 -0.964188 0 \r\n0.0705424 -0.277732 -0.963457 0 \r\n0.405789 0.631017 0.0291301 0 \r\n0.42358 0.607976 0.0411411 0 \r\n0.656976 -0.796604 0.371022 0 \r\n0.636575 -0.792109 0.400222 0 \r\n0.681947 0.0061782 -0.637146 0 \r\n0.67278 -0.0208815 -0.614553 0 \r\n0.696568 0.0065025 -0.601398 0 \r\n-0.140802 -0.141487 0.0961132 0 \r\n-0.22836 0.0881848 0.716002 0 \r\n-0.23587 0.0806876 0.717652 0 \r\n-0.205695 0.0717119 0.695597 0 \r\n-0.156726 0.0654288 0.111305 0 \r\n-0.142769 0.0784878 0.12729 0 \r\n-0.1433 0.0494851 0.122823 0 \r\n0.481917 -0.98384 0.131357 0 \r\n0.46422 -0.978868 0.116021 0 \r\n-0.22964 -0.358756 -0.0380773 0 \r\n0.233153 -0.581115 0.591058 0 \r\n0.202994 -0.586434 0.590487 0 \r\n0.215425 -0.563414 0.588998 0 \r\n-0.0899229 -0.467604 -0.610222 0 \r\n-0.0959056 -0.471044 -0.593382 0 \r\n-0.0759866 -0.481654 -0.618011 0 \r\n0.46176 -0.425677 -0.704149 0 \r\n0.448125 -0.43659 -0.725891 0 \r\n0.437603 -0.435429 -0.707518 0 \r\n-0.630851 -0.679972 0.724159 0 \r\n-0.652799 -0.666373 0.713394 0 \r\n0.710052 -0.0960344 -0.383211 0 \r\n0.72085 -0.0926334 -0.35057 0 \r\n0.0291329 -0.588639 -0.625386 0 \r\n0.0247373 -0.574904 -0.627635 0 \r\n0.122138 -0.341072 0.554771 0 \r\n-0.292337 0.184003 -0.898186 0 \r\n-0.287329 0.21204 -0.905841 0 \r\n0.10665 0.642193 -0.94488 0 \r\n0.084886 0.627385 -0.94689 0 \r\n0.110708 0.616614 -0.954159 0 \r\n0.220769 0.96707 -0.718786 0 \r\n0.19331 0.95811 -0.743896 0 \r\n0.226343 0.954504 -0.74154 0 \r\n0.126305 0.521083 0.191444 0 \r\n0.138407 0.489812 0.213914 0 \r\n0.0993427 0.49898 0.202547 0 \r\n0.764778 0.214909 -0.383489 0 \r\n0.75957 0.240327 -0.379914 0 \r\n0.761292 0.230215 -0.397817 0 \r\n-0.089706 0.32553 -0.939577 0 \r\n-0.110915 0.317757 -0.940376 0 \r\n-0.106248 0.302494 -0.930963 0 \r\n-0.734691 -0.620028 0.896868 0 \r\n-0.726012 -0.610711 0.889329 0 \r\n-0.718978 -0.624952 0.900385 0 \r\n-0.177445 0.450143 0.0199053 0 \r\n-0.174037 0.442453 0.0351766 0 \r\n0.553422 -0.510246 -0.0740852 0 \r\n0.545832 -0.492768 -0.0583028 0 \r\n0.557791 -0.483416 -0.0776979 0 \r\n0.635942 0.185834 -0.83541 0 \r\n0.372074 0.419101 -0.963452 0 \r\n0.406426 0.412502 -0.962878 0 \r\n0.607074 0.548586 -0.212518 0 \r\n0.600667 0.546728 -0.192266 0 \r\n-0.069881 -0.00756042 0.640934 0 \r\n-0.0543135 -0.0175724 0.637566 0 \r\n-0.0706571 -0.00089707 0.647195 0 \r\n-0.174523 -0.0441879 0.838567 0 \r\n-0.160332 -0.0610058 0.842738 0 \r\n-0.184695 -0.204225 -0.581049 0 \r\n-0.168472 -0.220244 -0.569017 0 \r\n-0.171014 -0.21119 -0.592937 0 \r\n0.171206 -0.921106 0.0161863 0 \r\n0.318126 0.000880999 -0.905724 0 \r\n0.339144 0.0268744 -0.903077 0 \r\n0.0479213 -0.725349 -0.909621 0 \r\n-0.150178 -0.4905 -0.516615 0 \r\n-0.168711 -0.488026 -0.495929 0 \r\n-0.155906 -0.503148 -0.509282 0 \r\n0.0366425 0.530245 -0.953518 0 \r\n0.0678159 0.540601 -0.956711 0 \r\n0.569391 0.589013 -0.57647 0 \r\n0.565324 0.590419 -0.597122 0 \r\n0.577657 0.572436 -0.594115 0 \r\n-0.417636 -0.600227 0.551518 0 \r\n-0.425436 -0.593091 0.568862 0 \r\n-0.46177 -0.604916 0.558195 0 \r\n-0.344377 0.424336 -0.603848 0 \r\n-0.348152 0.415796 -0.583952 0 \r\n-0.352934 0.400501 -0.597543 0 \r\n0.201155 -0.400369 0.332011 0 \r\n0.174112 -0.398956 0.329412 0 \r\n0.189785 -0.3918 0.315693 0 \r\n0.608917 -0.794078 0.427813 0 \r\n-0.222812 -0.45101 -0.413428 0 \r\n-0.229965 -0.431578 -0.391535 0 \r\n-0.101481 0.713626 -0.51017 0 \r\n-0.0784521 0.731354 -0.493369 0 \r\n0.0925066 0.54499 -0.963375 0 \r\n0.073056 0.565001 -0.956527 0 \r\n0.253553 0.994169 -0.618227 0 \r\n0.269086 0.990874 -0.626647 0 \r\n0.266845 0.994807 -0.602041 0 \r\n0.564203 -0.212829 -0.376511 0 \r\n0.563498 -0.226633 -0.395137 0 \r\n0.54012 -0.40557 -0.803173 0 \r\n0.539471 -0.381223 -0.808333 0 \r\n0.546512 -0.387484 -0.814087 0 \r\n-0.234174 0.275966 -0.972941 0 \r\n-0.245867 0.263234 -0.973531 0 \r\n0.275468 -0.442108 0.411407 0 \r\n0.264583 -0.43356 0.391769 0 \r\n0.292061 -0.440484 0.400014 0 \r\n0.572157 0.450536 -0.840781 0 \r\n0.573268 0.448477 -0.828973 0 \r\n0.567177 0.463098 -0.826844 0 \r\n0.603997 -0.514492 -0.320382 0 \r\n0.604517 -0.534582 -0.325063 0 \r\n0.501487 -0.442439 0.010086 0 \r\n0.516243 -0.451605 -0.0106144 0 \r\n0.507833 -0.463565 0.00104895 0 \r\n-0.197237 -0.0484329 0.983637 0 \r\n-0.215277 -0.0335431 0.984275 0 \r\n-0.201497 -0.0373938 0.985484 0 \r\n0.279215 -0.428455 -0.757864 0 \r\n0.259587 -0.429321 -0.76175 0 \r\n0.496501 -0.184109 0.0210736 0 \r\n0.0452555 -0.192867 0.583592 0 \r\n0.0444378 -0.201376 0.5725 0 \r\n0.0541919 -0.218873 0.568972 0 \r\n0.321624 -0.198784 -0.953374 0 \r\n0.302723 -0.187667 -0.951648 0 \r\n0.292699 -0.202377 -0.957916 0 \r\n-0.404465 -0.733419 0.627122 0 \r\n-0.414142 -0.727107 0.608647 0 \r\n-0.430715 -0.726389 0.629347 0 \r\n-0.258961 -0.288598 -0.291171 0 \r\n-0.263159 -0.271688 -0.272496 0 \r\n-0.259279 -0.296228 -0.26583 0 \r\n0.171178 0.802123 -0.377842 0 \r\n0.184999 0.801729 -0.351849 0 \r\n0.267945 -0.810983 -0.481691 0 \r\n0.299324 -0.791236 -0.496114 0 \r\n0.15074 -0.470728 -0.722521 0 \r\n0.148969 -0.474865 -0.738129 0 \r\n0.133009 -0.48407 -0.732365 0 \r\n-0.32344 -0.122036 -0.979474 0 \r\n-0.334473 -0.134612 -0.975755 0 \r\n-0.381698 0.220419 -0.676668 0 \r\n-0.387801 0.201207 -0.670254 0 \r\n-0.0573408 -0.229123 -0.911358 0 \r\n-0.152297 -0.77098 0.589434 0 \r\n-0.184964 -0.77194 0.594062 0 \r\n-0.178284 -0.774749 0.610986 0 \r\n0.581128 -0.578524 -0.393533 0 \r\n0.591265 -0.552619 -0.377706 0 \r\n-0.0589305 0.753623 -0.722404 0 \r\n-0.0575774 0.772741 -0.718917 0 \r\n0.239935 0.951172 -0.480211 0 \r\n0.257579 0.93718 -0.477109 0 \r\n0.229827 0.936365 -0.471299 0 \r\n0.508014 0.689615 -0.33481 0 \r\n0.517981 0.679538 -0.313603 0 \r\n-0.27185 -0.788785 0.667243 0 \r\n-0.256045 -0.789196 0.664577 0 \r\n0.581895 0.613793 -0.31245 0 \r\n0.587551 0.60683 -0.301892 0 \r\n0.578912 0.616511 -0.296939 0 \r\n-0.0641396 -0.164056 0.900676 0 \r\n-0.0587365 0.758137 -0.282767 0 \r\n-0.0447306 0.764223 -0.261855 0 \r\n-0.232589 0.56676 -0.705968 0 \r\n-0.224487 0.581334 -0.685789 0 \r\n-0.24216 0.564 -0.689806 0 \r\n0.660421 -0.127942 -0.389418 0 \r\n0.673548 -0.12013 -0.384425 0 \r\n0.496439 -0.49466 0.232042 0 \r\n0.480822 -0.473439 0.219912 0 \r\n0.330159 -0.631018 0.595432 0 \r\n0.344078 -0.653023 0.593886 0 \r\n0.324887 -0.664822 0.595349 0 \r\n0.343529 -0.993558 0.165149 0 \r\n0.322417 -0.995568 0.148609 0 \r\n0.566144 -0.410837 -0.101204 0 \r\n0.0608341 -0.00539435 0.224508 0 \r\n0.0371966 0.0227419 0.226345 0 \r\n0.0581584 0.0393471 0.236607 0 \r\n0.265925 0.51235 0.200098 0 \r\n0.248762 0.519863 0.197057 0 \r\n0.58892 -0.529315 -0.954877 0 \r\n0.582093 -0.560112 -0.952325 0 \r\n0.228083 -0.955948 0.414494 0 \r\n0.212404 -0.948084 0.401394 0 \r\n0.207162 -0.949115 0.418806 0 \r\n-0.26375 -0.738306 0.500682 0 \r\n-0.286752 -0.742106 0.520985 0 \r\n-0.249557 -0.743435 0.514022 0 \r\n-0.341431 0.0344452 -0.809531 0 \r\n-0.34521 0.0764488 -0.803805 0 \r\n-0.354233 0.0419268 -0.788028 0 \r\n0.245599 -0.923401 -0.09926 0 \r\n0.266124 -0.920058 -0.0984626 0 \r\n0.258544 -0.929648 -0.120447 0 \r\n0.555902 -0.620312 -0.88669 0 \r\n0.570897 -0.604975 -0.877118 0 \r\n0.572748 -0.611295 -0.892176 0 \r\n-0.261862 0.416787 -0.145831 0 \r\n-0.2508 0.424518 -0.12959 0 \r\n-0.284764 -0.575274 0.55903 0 \r\n-0.291075 -0.579161 0.549691 0 \r\n0.382695 -0.628718 -0.917088 0 \r\n0.376651 -0.62885 -0.929678 0 \r\n0.507282 0.521538 -0.888777 0 \r\n0.311045 -0.715632 0.593138 0 \r\n0.316897 -0.751086 0.590176 0 \r\n0.608045 0.524366 -0.605117 0 \r\n0.609829 0.524792 -0.590122 0 \r\n-0.43287 0.15157 -0.511073 0 \r\n-0.00046855 -0.504805 -0.753191 0 \r\n-0.0219908 -0.49629 -0.760897 0 \r\n-0.0130186 -0.494131 -0.747498 0 \r\n0.160199 -0.303763 -0.965117 0 \r\n0.15496 -0.291784 -0.965374 0 \r\n0.144214 -0.303567 -0.965779 0 \r\n0.30816 -0.951573 0.344551 0 \r\n0.288895 -0.955043 0.323331 0 \r\n0.283651 -0.95391 0.343113 0 \r\n-0.254759 0.554002 -0.249579 0 \r\n-0.252123 0.568758 -0.269091 0 \r\n-0.401392 -0.108484 -0.231422 0 \r\n-0.407876 -0.119757 -0.24889 0 \r\n0.663031 0.0951165 -0.889552 0 \r\n0.677516 0.0487483 -0.881495 0 \r\n-0.0502687 -0.24549 0.861135 0 \r\n-0.0641547 -0.25739 0.85271 0 \r\n0.487203 0.00263977 0.118164 0 \r\n0.484802 -0.019505 0.108664 0 \r\n-0.0623771 0.26424 -0.912428 0 \r\n-0.048806 0.246594 -0.908409 0 \r\n-0.0414801 0.266544 -0.916451 0 \r\n-0.294114 0.13889 -0.134886 0 \r\n-0.290458 0.182462 -0.134455 0 \r\n-0.280014 0.173844 -0.124511 0 \r\n-0.168719 0.664326 -0.507815 0 \r\n-0.174248 0.663522 -0.479147 0 \r\n-0.183793 0.651693 -0.50253 0 \r\n0.498711 -0.208197 -0.724779 0 \r\n0.496382 -0.205496 -0.708446 0 \r\n0.0236913 0.225063 0.261719 0 \r\n0.0456135 0.225551 0.269253 0 \r\n0.509498 0.399365 0.0590428 0 \r\n0.518059 0.377449 0.0527857 0 \r\n0.498753 0.404963 0.0807819 0 \r\n0.0845443 -0.673753 -0.862751 0 \r\n0.52018 -0.508557 -0.971287 0 \r\n0.57844 -0.671515 -0.247302 0 \r\n0.575446 -0.678249 -0.27247 0 \r\n0.567701 -0.69669 -0.262403 0 \r\n-0.409631 0.248197 -0.509631 0 \r\n-0.40735 0.248073 -0.525034 0 \r\n0.224215 -0.436333 -0.73999 0 \r\n0.22785 -0.434692 -0.754212 0 \r\n0.449708 -0.560616 -0.80695 0 \r\n0.458824 -0.547922 -0.797714 0 \r\n0.46494 -0.562896 -0.806566 0 \r\n-0.461645 0.0289705 -0.489222 0 \r\n0.606472 -0.537709 -0.304556 0 \r\n0.605673 -0.525514 -0.284321 0 \r\n0.605663 -0.512614 -0.289954 0 \r\n0.541862 0.448197 -0.94664 0 \r\n0.512061 0.466122 -0.947497 0 \r\n0.522152 0.442988 -0.953809 0 \r\n-0.0833725 0.742924 -0.282979 0 \r\n-0.161113 -0.430211 -0.509831 0 \r\n-0.146398 -0.437319 -0.535585 0 \r\n-0.280667 0.266492 -0.910791 0 \r\n0.47898 -0.876832 0.492438 0 \r\n0.502032 -0.862702 0.484484 0 \r\n0.509207 -0.870166 0.472733 0 \r\n0.644684 0.235663 -0.820983 0 \r\n0.654635 0.240965 -0.805639 0 \r\n0.748954 0.271643 -0.507868 0 \r\n0.747854 0.26974 -0.525499 0 \r\n0.74995 0.260722 -0.52069 0 \r\n0.207491 0.898174 -0.463791 0 \r\n0.202708 0.881567 -0.462544 0 \r\n0.182113 0.89738 -0.462144 0 \r\n-0.412202 0.0708247 -0.677814 0 \r\n-0.423781 0.069154 -0.644024 0 \r\n-0.069249 -0.557127 -0.879691 0 \r\n0.0767932 -0.393593 0.290877 0 \r\n0.0915734 -0.386054 0.285466 0 \r\n0.101423 -0.393375 0.300533 0 \r\n-0.295238 0.0270041 0.805382 0 \r\n-0.289084 0.0348281 0.790424 0 \r\n-0.302445 0.0482866 0.800676 0 \r\n-0.0412705 -0.295417 -0.947622 0 \r\n-0.011625 -0.290017 -0.952461 0 \r\n-0.142965 0.231574 0.145158 0 \r\n-0.135664 0.209809 0.148712 0 \r\n-0.343797 0.113384 -0.801863 0 \r\n0.160556 0.994916 -0.55314 0 \r\n0.171965 0.998148 -0.564327 0 \r\n0.183219 0.996768 -0.54159 0 \r\n0.656384 0.0399075 -0.777401 0 \r\n0.652551 0.0253387 -0.788057 0 \r\n0.65447 0.0095818 -0.769057 0 \r\n-0.372611 -0.0579494 -0.716785 0 \r\n0.693543 -0.0429666 -0.524855 0 \r\n0.697263 -0.026158 -0.548405 0 \r\n0.68368 -0.0373658 -0.555256 0 \r\n0.5812 -0.814155 0.00806822 0 \r\n0.557868 -0.806313 -0.00314999 0 \r\n0.755653 -0.0256889 -0.35283 0 \r\n0.748767 -0.0466912 -0.358773 0 \r\n0.116281 0.360623 -0.9652 0 \r\n0.099383 0.345353 -0.967378 0 \r\n-0.115042 -0.341433 -0.673467 0 \r\n-0.121748 -0.336962 -0.653508 0 \r\n-0.121262 -0.352879 -0.657594 0 \r\n0.521078 -0.981999 0.118086 0 \r\n0.525203 -0.979075 0.101561 0 \r\n-0.179279 0.502191 -0.0237538 0 \r\n-0.17572 0.528257 -0.037548 0 \r\n-0.170247 0.518327 -0.019708 0 \r\n-0.139144 -0.751598 0.492745 0 \r\n-0.139786 -0.755488 0.505123 0 \r\n-0.118554 -0.754435 0.49538 0 \r\n-0.033612 -0.400799 -0.980371 0 \r\n-0.0787841 -0.364818 -0.978791 0 \r\n-0.0755839 -0.401559 -0.981424 0 \r\n-0.057249 -0.585225 0.457303 0 \r\n-0.083371 -0.590314 0.459 0 \r\n-0.07662 -0.589603 0.445774 0 \r\n0.515999 -0.0137154 0.0712198 0 \r\n0.504045 -0.0185665 0.0858665 0 \r\n-0.220874 0.600142 -0.622793 0 \r\n-0.23126 0.589122 -0.633273 0 \r\n0.509674 -0.622895 -0.0025202 0 \r\n0.516937 -0.602978 0.0218867 0 \r\n0.360852 0.325773 -0.947595 0 \r\n0.36851 0.318022 -0.94102 0 \r\n0.382265 0.338448 -0.945971 0 \r\n0.442999 0.688707 -0.682503 0 \r\n0.447331 0.681853 -0.690848 0 \r\n0.447716 0.687243 -0.673208 0 \r\n0.620554 -0.110985 -0.194908 0 \r\n-0.324911 -0.316032 -0.964323 0 \r\n-0.592864 -0.595747 0.631351 0 \r\n-0.61695 -0.603981 0.61757 0 \r\n-0.153756 -0.176307 0.084699 0 \r\n-0.153733 -0.189408 0.0852697 0 \r\n0.228464 0.628309 0.103605 0 \r\n0.249533 0.63812 0.089737 0 \r\n0.256402 0.622939 0.106978 0 \r\n0.208242 -0.471816 -0.972917 0 \r\n0.227192 -0.484325 -0.973338 0 \r\n0.219387 -0.460932 -0.971907 0 \r\n0.259965 0.362268 0.265024 0 \r\n0.284786 0.367383 0.259493 0 \r\n-0.0508429 -0.745631 0.626588 0 \r\n-0.0638563 -0.739748 0.638407 0 \r\n-0.0321531 -0.737604 0.623563 0 \r\n-0.685206 -0.637986 0.623163 0 \r\n-0.683801 -0.63347 0.605689 0 \r\n0.299304 -0.918218 -0.264224 0 \r\n0.32426 -0.913679 -0.253829 0 \r\n-0.0830967 -0.678257 0.236561 0 \r\n-0.0839372 -0.670416 0.22579 0 \r\n-0.0837197 -0.665643 0.241993 0 \r\n-0.0245345 -0.59473 0.515604 0 \r\n-0.0157808 -0.600623 0.531564 0 \r\n0.531927 0.00556081 0.0551049 0 \r\n0.524207 -0.0189607 0.0519141 0 \r\n-0.193733 0.335382 -0.970599 0 \r\n-0.216767 0.303692 -0.974176 0 \r\n-0.200953 0.294908 -0.974121 0 \r\n-0.120394 0.369973 0.150549 0 \r\n0.29977 -0.511553 -0.648705 0 \r\n0.322313 -0.511048 -0.639117 0 \r\n0.327564 -0.486841 -0.644036 0 \r\n0.526225 0.359767 0.0437217 0 \r\n0.537847 0.346952 0.0194834 0 \r\n0.535268 0.334868 0.0321585 0 \r\n0.235014 -0.900023 -0.0447821 0 \r\n0.232253 -0.896425 -0.0339733 0 \r\n0.25787 -0.893391 -0.0328095 0 \r\n0.586471 -0.600733 -0.171885 0 \r\n-0.108949 -0.668714 0.0254636 0 \r\n-0.115853 -0.646623 0.0327791 0 \r\n-0.104712 -0.658089 0.0458957 0 \r\n0.192529 0.782693 -0.157311 0 \r\n0.156828 0.783207 -0.146712 0 \r\n0.339705 -0.0341936 0.199584 0 \r\n0.355768 -0.0336686 0.19271 0 \r\n0.334761 -0.0571213 0.19218 0 \r\n0.428591 -0.107145 0.117925 0 \r\n0.454808 -0.10141 0.0961082 0 \r\n0.438729 -0.12397 0.10016 0 \r\n-0.129251 -0.215542 -0.749388 0 \r\n-0.14341 -0.223069 -0.763314 0 \r\n-0.0663234 0.438729 0.16711 0 \r\n-0.0424 0.44895 0.180615 0 \r\n-0.0555234 0.424554 0.181358 0 \r\n0.205424 -0.899889 -0.0311795 0 \r\n0.22828 -0.893258 -0.0192068 0 \r\n-0.28052 0.218811 -0.932032 0 \r\n-0.274377 0.23891 -0.940053 0 \r\n-0.242442 0.0987533 0.729643 0 \r\n-0.244527 0.106022 0.738744 0 \r\n-0.260619 0.104429 0.747159 0 \r\n0.11 -0.410253 0.681085 0 \r\n0.0977448 -0.404688 0.696541 0 \r\n-0.105391 0.424434 -0.968445 0 \r\n0.429126 -0.506044 0.388112 0 \r\n0.439518 -0.516445 0.398354 0 \r\n0.382203 0.911918 -0.578107 0 \r\n0.0219538 -0.898426 0.252645 0 \r\n0.0370793 -0.908195 0.261439 0 \r\n0.0338241 -0.914204 0.230636 0 \r\n0.0638738 -0.506014 -0.699225 0 \r\n0.706706 0.110749 -0.7044 0 \r\n0.693611 0.0930979 -0.719383 0 \r\n0.517815 -0.376799 -0.71704 0 \r\n0.522043 -0.358761 -0.706975 0 \r\n0.193344 0.325224 -0.964685 0 \r\n0.202936 0.32843 -0.963974 0 \r\n0.558709 -0.0416388 -0.933419 0 \r\n0.548986 -0.0453132 -0.928002 0 \r\n-0.317717 -0.746998 0.576577 0 \r\n-0.343412 -0.739365 0.55873 0 \r\n-0.131655 -0.692187 -0.0523223 0 \r\n-0.128119 -0.676537 -0.0257146 0 \r\n-0.181964 -0.602805 0.466289 0 \r\n-0.195743 -0.59385 0.483748 0 \r\n0.35388 -0.903043 -0.250367 0 \r\n0.301638 0.775528 -0.202341 0 \r\n0.32112 0.767133 -0.190214 0 \r\n0.294639 0.769473 -0.166429 0 \r\n-0.012051 -0.300983 -0.958928 0 \r\n-0.0233537 -0.314817 -0.962868 0 \r\n0.389591 -0.873994 -0.314653 0 \r\n0.390203 -0.865983 -0.334364 0 \r\n0.375333 -0.87597 -0.329313 0 \r\n-0.168438 0.643433 -0.177002 0 \r\n-0.157182 0.660388 -0.18464 0 \r\n-0.157332 0.649446 -0.164625 0 \r\n0.156036 -0.932924 -0.207169 0 \r\n0.190937 -0.937272 -0.196889 0 \r\n0.176578 -0.933982 -0.230633 0 \r\n0.0864161 0.781334 -0.145894 0 \r\n0.102399 0.785583 -0.15534 0 \r\n-0.221576 -0.603368 -0.303355 0 \r\n-0.218935 -0.61272 -0.330058 0 \r\n0.447285 -0.459239 0.264589 0 \r\n0.42663 -0.446041 0.272729 0 \r\n0.398608 -0.416597 0.250222 0 \r\n0.392211 -0.422616 0.272631 0 \r\n0.376926 -0.408282 0.259607 0 \r\n0.604527 -0.547481 -0.31943 0 \r\n-0.169032 -0.328064 -0.831055 0 \r\n-0.172192 -0.346027 -0.848559 0 \r\n-0.682079 -0.699182 0.913419 0 \r\n-0.702097 -0.682311 0.913304 0 \r\n-0.0856441 -0.664418 0.181192 0 \r\n-0.0870787 -0.658993 0.156578 0 \r\n-0.0875773 -0.64935 0.167645 0 \r\n0.0449017 -0.372806 0.751045 0 \r\n0.0726945 -0.396751 0.719453 0 \r\n0.0569666 -0.396805 0.729108 0 \r\n-0.184792 -0.239994 -0.783414 0 \r\n-0.16667 -0.230094 -0.774305 0 \r\n-0.431426 -0.780625 0.799436 0 \r\n-0.416509 -0.785308 0.784011 0 \r\n-0.455951 -0.78904 0.80215 0 \r\n0.0963999 -0.661819 -0.61827 0 \r\n0.0980218 -0.682961 -0.605878 0 \r\n0.0320118 -0.295067 0.227103 0 \r\n0.0544223 -0.28892 0.229298 0 \r\n0.669428 0.491255 -0.363885 0 \r\n0.658371 0.506716 -0.363799 0 \r\n0.71219 -0.768808 0.255934 0 \r\n0.705958 -0.789407 0.265222 0 \r\n-0.340051 -0.209604 -0.341532 0 \r\n-0.32971 -0.209071 -0.318034 0 \r\n0.584401 -0.340782 -0.230357 0 \r\n0.584028 -0.334131 -0.256874 0 \r\n0.720278 0.363851 -0.495984 0 \r\n0.714846 0.37017 -0.518929 0 \r\n-0.183486 0.063893 0.680946 0 \r\n-0.190996 0.0563959 0.682595 0 \r\n0.421255 -0.208862 -0.945622 0 \r\n0.442138 -0.199504 -0.939695 0 \r\n0.414863 -0.197191 -0.941705 0 \r\n-0.0593311 -0.0129299 0.651829 0 \r\n-0.0465491 -0.0208669 0.642568 0 \r\n-0.0507906 -0.0228879 0.650568 0 \r\n-0.0309126 -0.220129 -0.912154 0 \r\n-0.00592512 -0.187907 -0.912351 0 \r\n0.547155 -0.08763 -0.0254764 0 \r\n0.550205 -0.0579582 -0.0202129 0 \r\n0.561822 -0.0790812 -0.0523914 0 \r\n0.00927925 -0.115891 0.612989 0 \r\n0.00186047 -0.11052 0.604708 0 \r\n-0.01679 -0.476674 0.296144 0 \r\n0.155137 0.786548 -0.891611 0 \r\n0.165091 0.797998 -0.885051 0 \r\n0.216278 -0.625573 -0.972018 0 \r\n0.18609 -0.654929 -0.969761 0 \r\n0.500512 -0.758034 -0.120378 0 \r\n0.509031 -0.738645 -0.106025 0 \r\n0.510738 -0.746571 -0.128375 0 \r\n-0.504909 -0.606005 0.57335 0 \r\n0.745929 0.296724 -0.428723 0 \r\n0.74841 0.283561 -0.4471 0 \r\n-0.356263 -0.795382 0.719282 0 \r\n-0.353028 -0.794788 0.725793 0 \r\n-0.02153 -0.459774 0.531402 0 \r\n-0.0205354 -0.468777 0.549899 0 \r\n-0.00950452 -0.479159 0.524368 0 \r\n0.0369189 -0.203872 0.562268 0 \r\n0.020968 -0.383179 0.757769 0 \r\n0.0375893 -0.40104 0.738567 0 \r\n0.0293835 -0.411359 0.735636 0 \r\n0.279967 0.650198 -0.931114 0 \r\n0.268833 0.681931 -0.921404 0 \r\n0.251976 0.665883 -0.931364 0 \r\n-0.444445 -0.57775 0.653152 0 \r\n-0.47846 -0.581183 0.654947 0 \r\n-0.463606 -0.580668 0.639678 0 \r\n-0.266645 -0.203113 -0.14206 0 \r\n-0.00429125 0.855454 -0.768526 0 \r\n-0.00575645 0.830197 -0.78828 0 \r\n-0.086799 0.703259 -0.138889 0 \r\n-0.104273 0.690632 -0.141467 0 \r\n-0.0992506 0.703405 -0.162488 0 \r\n0.190318 0.386367 -0.958477 0 \r\n0.483432 -0.831254 -0.00211913 0 \r\n0.494276 -0.844278 0.000386355 0 \r\n-0.0944476 0.664768 -0.0689125 0 \r\n-0.103135 0.672721 -0.100253 0 \r\n-0.0831345 0.682533 -0.0865272 0 \r\n-0.356854 -0.0877588 -0.197066 0 \r\n-0.371073 -0.0681013 -0.194119 0 \r\n0.368572 0.768762 -0.532462 0 \r\n0.353728 0.781412 -0.521209 0 \r\n0.367317 0.774454 -0.543516 0 \r\n0.018681 -0.525656 -0.77344 0 \r\n0.0114236 -0.519116 -0.768074 0 \r\n-0.46188 -0.066921 -0.479425 0 \r\n-0.0356246 -0.245831 -0.919334 0 \r\n0.292673 -0.469823 0.539169 0 \r\n0.756934 0.0592858 -0.43626 0 \r\n0.751387 0.0495007 -0.459628 0 \r\n0.754106 0.0309887 -0.42675 0 \r\n-0.262034 -0.31372 -0.848186 0 \r\n-0.247613 -0.297339 -0.832394 0 \r\n-0.165276 -0.298408 -0.528401 0 \r\n-0.158879 -0.321078 -0.549523 0 \r\n0.638843 -0.107956 -0.46636 0 \r\n-0.511037 -0.703285 0.615137 0 \r\n-0.505051 -0.704668 0.594197 0 \r\n-0.530503 -0.698936 0.606753 0 \r\n0.448799 0.131777 -0.90007 0 \r\n0.468069 0.0809627 -0.904406 0 \r\n-0.430731 -0.0842862 -0.564006 0 \r\n-0.437849 -0.0675031 -0.566136 0 \r\n-0.64424 -0.649071 0.570201 0 \r\n-0.635409 -0.656253 0.564104 0 \r\n-0.630957 -0.65186 0.558475 0 \r\n-0.0453065 -0.515746 0.278996 0 \r\n-0.0335949 -0.502889 0.292755 0 \r\n-0.0372018 -0.517713 0.299199 0 \r\n-0.210848 0.498207 -0.0890664 0 \r\n-0.212371 0.521819 -0.108596 0 \r\n0.163183 0.440554 -0.958375 0 \r\n0.170503 0.466994 -0.958095 0 \r\n0.144947 0.44513 -0.959911 0 \r\n-0.24905 0.0418427 -0.0202274 0 \r\n-0.256882 0.0493346 -0.0439623 0 \r\n-0.25319 0.0766459 -0.0328614 0 \r\n0.564603 -0.84912 0.00910687 0 \r\n0.626183 -0.705479 0.02013 0 \r\n0.608657 -0.694538 0.014042 0 \r\n0.60888 -0.716052 0.0101191 0 \r\n-0.265462 -0.266699 -0.204194 0 \r\n-0.262577 -0.286997 -0.225196 0 \r\n-0.266362 -0.259019 -0.226152 0 \r\n0.731833 0.297502 -0.585699 0 \r\n0.736892 0.292745 -0.564283 0 \r\n0.728539 0.313269 -0.578474 0 \r\n0.179252 -0.343014 -0.96594 0 \r\n0.183666 -0.373484 -0.967317 0 \r\n0.207986 -0.361909 -0.966133 0 \r\n0.129592 -0.214244 -0.950528 0 \r\n0.150237 -0.200054 -0.948867 0 \r\n0.122924 -0.205325 -0.944366 0 \r\n-0.28068 -0.170395 -0.785786 0 \r\n-0.260652 -0.170133 -0.774299 0 \r\n-0.271792 -0.185399 -0.792457 0 \r\n-0.165013 -0.270685 -0.93532 0 \r\n-0.18729 -0.256014 -0.935268 0 \r\n-0.17988 -0.271726 -0.942464 0 \r\n0.240553 -0.975397 0.261522 0 \r\n0.268163 -0.972587 0.267691 0 \r\n0.264336 -0.979216 0.248733 0 \r\n0.337811 -0.338757 0.178099 0 \r\n0.333126 -0.348651 0.186074 0 \r\n0.320446 -0.338548 0.194495 0 \r\n-0.0442964 0.723915 -0.802507 0 \r\n-0.0514718 0.750229 -0.777876 0 \r\n-0.0494031 0.711042 -0.797073 0 \r\n-0.305432 0.305835 -0.832231 0 \r\n-0.302455 0.346693 -0.827716 0 \r\n-0.356458 -0.147233 -0.934232 0 \r\n-0.358745 -0.146259 -0.921145 0 \r\n-0.363043 -0.171575 -0.938029 0 \r\n-0.255612 0.561136 -0.644493 0 \r\n-0.251087 0.560679 -0.66898 0 \r\n-0.238584 0.579031 -0.64514 0 \r\n0.0632077 -0.583416 0.556706 0 \r\n0.0491038 -0.575549 0.547076 0 \r\n0.056535 -0.566322 0.559258 0 \r\n0.491344 -0.563897 -0.530651 0 \r\n0.469392 -0.571359 -0.546409 0 \r\n0.480817 -0.59437 -0.530758 0 \r\n-0.130959 0.591976 -0.760828 0 \r\n-0.109565 0.599395 -0.763828 0 \r\n-0.119635 0.610741 -0.744119 0 \r\n-0.752563 -0.582371 0.82764 0 \r\n-0.740095 -0.58026 0.832149 0 \r\n-0.746159 -0.589545 0.853639 0 \r\n0.122589 -0.508718 -0.680341 0 \r\n0.100177 -0.51332 -0.679894 0 \r\n-0.00404385 -0.398881 0.242803 0 \r\n0.00127215 -0.416474 0.256162 0 \r\n-0.0206371 -0.421115 0.244115 0 \r\n0.474596 0.528854 0.0521891 0 \r\n0.461319 -0.0800152 0.0998437 0 \r\n0.471457 -0.0968412 0.0820789 0 \r\n0.535652 -0.710415 -0.138859 0 \r\n0.525494 -0.727601 -0.132917 0 \r\n0.529415 -0.709996 -0.119964 0 \r\n-0.0847398 0.151845 0.193736 0 \r\n-0.0754044 0.14469 0.200642 0 \r\n-0.086853 0.133837 0.189773 0 \r\n0.148074 -0.281785 -0.966081 0 \r\n0.164059 -0.281982 -0.965419 0 \r\n0.28819 -0.426122 0.363586 0 \r\n0.261876 -0.423867 0.368495 0 \r\n0.26889 -0.418054 0.351705 0 \r\n0.252702 -0.578155 0.592225 0 \r\n0.266903 -0.559965 0.590845 0 \r\n0.27402 -0.580025 0.593502 0 \r\n0.542225 0.0948208 0.0707685 0 \r\n0.544928 0.120809 0.0675517 0 \r\n0.655066 -0.680363 0.0460876 0 \r\n0.636384 -0.672879 0.0356747 0 \r\n0.644643 -0.69145 0.0344658 0 \r\n-0.0714001 -0.544286 -0.582151 0 \r\n-0.081534 -0.530621 -0.576999 0 \r\n0.410639 -0.791931 -0.444887 0 \r\n0.396569 -0.809385 -0.432655 0 \r\n0.416507 -0.800306 -0.428492 0 \r\n-0.0509119 -0.175714 0.800821 0 \r\n-0.0369548 -0.189051 0.795503 0 \r\n0.189876 0.447439 -0.955719 0 \r\n0.205023 0.440004 -0.954652 0 \r\n0.203887 0.454983 -0.955492 0 \r\n-0.315737 -0.203523 -0.281311 0 \r\n-0.327002 -0.20537 -0.298422 0 \r\n-0.33158 -0.197258 -0.287933 0 \r\n-0.287967 -0.764549 0.620823 0 \r\n-0.299923 -0.771083 0.642043 0 \r\n0.221739 0.760134 -0.899189 0 \r\n0.218024 0.726955 -0.913242 0 \r\n0.244557 0.730794 -0.907601 0 \r\n-0.00711993 0.624303 0.0666125 0 \r\n-0.0263172 0.626908 0.0530348 0 \r\n0.576805 0.521145 -0.708676 0 \r\n0.47706 -0.490424 0.0734716 0 \r\n0.473584 -0.477512 0.0928551 0 \r\n0.105268 -0.578734 0.584785 0 \r\n0.105476 -0.559764 0.5918 0 \r\n0.117994 -0.572025 0.58961 0 \r\n-0.0405094 0.757784 -0.450423 0 \r\n-0.0577528 0.749607 -0.441812 0 \r\n-0.0622552 0.743739 -0.471597 0 \r\n0.0279208 -0.374363 -0.977507 0 \r\n0.0501295 -0.383941 -0.976942 0 \r\n0.0482663 -0.360273 -0.975059 0 \r\n-0.43884 0.177994 -0.409461 0 \r\n-0.0152729 -0.76752 0.556094 0 \r\n0.00492525 -0.772817 0.557562 0 \r\n-0.00951855 -0.77395 0.547539 0 \r\n0.582119 0.500947 -0.727679 0 \r\n0.589055 0.491768 -0.726388 0 \r\n0.400672 0.891477 -0.683807 0 \r\n0.407988 0.877333 -0.700503 0 \r\n0.414173 0.87572 -0.680248 0 \r\n0.0321966 -0.733922 0.598099 0 \r\n0.0438859 -0.718999 0.600703 0 \r\n0.0591198 -0.732342 0.588812 0 \r\n-0.12912 -0.44677 -0.980873 0 \r\n-0.123967 -0.478385 -0.976977 0 \r\n0.273041 0.725605 -0.0362058 0 \r\n0.249786 0.734234 -0.0479127 0 \r\n-0.129744 -0.518991 0.102801 0 \r\n-0.134087 -0.501237 0.104093 0 \r\n-0.122456 -0.507083 0.117967 0 \r\n0.176966 0.898247 -0.820274 0 \r\n0.156619 0.902849 -0.813516 0 \r\n0.157941 0.891331 -0.8211 0 \r\n0.726645 -0.0608616 -0.264265 0 \r\n0.738163 -0.051727 -0.275923 0 \r\n0.0235419 -0.274484 0.80174 0 \r\n0.0474886 -0.291432 0.766932 0 \r\n-0.097664 -0.295942 -0.757953 0 \r\n-0.097865 -0.266997 -0.743569 0 \r\n0.677459 -0.745362 0.335539 0 \r\n0.67926 -0.727913 0.319221 0 \r\n0.69167 -0.744552 0.302712 0 \r\n-0.110897 0.190347 0.170997 0 \r\n-0.0970677 0.195666 0.184667 0 \r\n-0.251515 -0.0356869 0.959148 0 \r\n-0.26853 -0.0125101 0.970703 0 \r\n-0.0771146 0.595161 -0.79099 0 \r\n-0.0664982 0.602445 -0.79373 0 \r\n-0.105373 -0.280948 -0.680493 0 \r\n-0.113872 -0.278783 -0.655251 0 \r\n-0.110167 -0.293922 -0.672687 0 \r\n0.57899 -0.357279 -0.389319 0 \r\n0.580002 -0.374148 -0.395663 0 \r\n-0.104653 -0.12729 0.123918 0 \r\n0.438542 0.686029 -0.724218 0 \r\n0.441598 0.67846 -0.718353 0 \r\n0.439559 0.690885 -0.706009 0 \r\n0.0480878 -0.251505 0.641156 0 \r\n0.0457935 -0.25888 0.652446 0 \r\n0.476106 -0.820077 -0.24296 0 \r\n0.472329 -0.821988 -0.219584 0 \r\n0.379234 -0.34426 0.143213 0 \r\n0.383733 -0.3282 0.140302 0 \r\n-0.259788 -0.250567 -0.346532 0 \r\n-0.268992 -0.251798 -0.319292 0 \r\n0.170127 -0.878268 0.561074 0 \r\n0.396574 -0.0545095 0.161548 0 \r\n0.41256 -0.0247213 0.16408 0 \r\n0.420975 -0.0461667 0.149724 0 \r\n0.613114 -0.479104 -0.950891 0 \r\n0.618037 -0.479249 -0.9438 0 \r\n0.617746 -0.452122 -0.947213 0 \r\n-0.14661 0.289844 -0.942032 0 \r\n-0.132232 0.31742 -0.944822 0 \r\n0.590658 -0.479592 -0.164032 0 \r\n0.590441 -0.461728 -0.165904 0 \r\n0.596345 -0.480409 -0.186866 0 \r\n0.0110988 -0.784452 0.541468 0 \r\n0.0295205 -0.791543 0.548665 0 \r\n0.0299397 -0.796747 0.541126 0 \r\n0.458149 -0.16059 0.0723457 0 \r\n0.45321 -0.138351 0.0845746 0 \r\n0.469885 -0.140475 0.0661145 0 \r\n-0.238046 -0.523068 -0.180126 0 \r\n-0.24141 -0.504714 -0.162008 0 \r\n-0.236326 -0.518544 -0.158365 0 \r\n-0.303922 -0.102589 -0.182039 0 \r\n-0.318009 -0.0817809 -0.179029 0 \r\n0.596459 0.335236 -0.0755229 0 \r\n0.605098 0.332601 -0.0871805 0 \r\n-0.102145 -0.140952 0.927847 0 \r\n-0.107388 -0.123481 0.936195 0 \r\n-0.0835184 -0.145918 0.920028 0 \r\n0.224028 -0.685147 -0.60709 0 \r\n0.230657 -0.708243 -0.593805 0 \r\n0.245794 -0.684083 -0.604252 0 \r\n-0.0110413 0.508371 -0.933967 0 \r\n-0.0213381 0.500516 -0.934617 0 \r\n0.480277 -0.953941 0.060895 0 \r\n0.461491 -0.964151 0.0784108 0 \r\n0.485611 -0.963902 0.0763718 0 \r\n-0.307279 0.256519 -0.843516 0 \r\n-0.316048 0.225607 -0.831198 0 \r\n-0.199936 0.573624 -0.135937 0 \r\n-0.208227 0.545202 -0.123019 0 \r\n-0.219255 0.548669 -0.152922 0 \r\n-0.188352 -0.217775 0.045823 0 \r\n-0.189833 -0.246679 0.0425949 0 \r\n-0.205062 -0.239943 0.0215717 0 \r\n-0.236865 -0.490952 -0.119119 0 \r\n-0.233062 -0.498661 -0.111548 0 \r\n-0.235887 -0.507899 -0.132677 0 \r\n0.0604884 -0.615303 -0.817387 0 \r\n0.0977685 -0.699245 0.588142 0 \r\n0.0851486 -0.682682 0.586549 0 \r\n0.115881 -0.691386 0.58285 0 \r\n0.369294 0.45313 -0.962331 0 \r\n0.340187 0.461277 -0.961316 0 \r\n-0.178423 -0.177031 -0.667994 0 \r\n-0.189999 -0.174136 -0.661709 0 \r\n0.354102 -0.465083 0.428586 0 \r\n0.354144 -0.467711 0.446175 0 \r\n0.34024 -0.462322 0.443725 0 \r\n0.630329 -0.145597 -0.345363 0 \r\n0.648716 -0.138759 -0.348962 0 \r\n0.635611 -0.140018 -0.373298 0 \r\n-0.214983 -0.608626 -0.237081 0 \r\n-0.211067 -0.616943 -0.22528 0 \r\n0.445645 -0.16399 -0.929971 0 \r\n0.456354 -0.18898 -0.936522 0 \r\n0.466253 -0.165136 -0.930715 0 \r\n-0.543727 -0.688607 0.542838 0 \r\n-0.519165 -0.693006 0.52747 0 \r\n-0.128142 0.595939 -0.01789 0 \r\n-0.143505 0.584167 -0.0317854 0 \r\n-0.138958 0.60202 -0.0433559 0 \r\n0.463763 -0.275923 0.0604385 0 \r\n0.455664 -0.295708 0.0696633 0 \r\n0.446491 -0.280698 0.0810516 0 \r\n-0.408855 0.197206 -0.583028 0 \r\n-0.407142 0.178565 -0.611571 0 \r\n-0.404379 0.19649 -0.603433 0 \r\n-0.291025 0.377392 -0.840299 0 \r\n-0.30154 0.373693 -0.81664 0 \r\n-0.209962 -0.572067 -0.125464 0 \r\n-0.210496 -0.599439 -0.183331 0 \r\n-0.039644 0.651896 -0.835815 0 \r\n-0.0285804 0.651049 -0.853272 0 \r\n0.0937096 0.306826 -0.968735 0 \r\n0.080727 0.332295 -0.968562 0 \r\n0.0657686 0.320036 -0.968399 0 \r\n-0.213698 -0.470644 -0.43227 0 \r\n-0.214276 -0.443121 -0.426591 0 \r\n0.666034 -0.0170831 -0.810268 0 \r\n0.667114 0.00911479 -0.82136 0 \r\n0.238868 -0.623392 -0.968143 0 \r\n0.227129 -0.634626 -0.962464 0 \r\n0.249825 -0.618304 -0.961999 0 \r\n0.128587 0.866722 -0.834126 0 \r\n0.10365 0.85069 -0.840158 0 \r\n0.540462 0.0256085 0.0483912 0 \r\n0.654621 0.507858 -0.329404 0 \r\n0.669672 0.484712 -0.340706 0 \r\n-0.106141 -0.585181 0.506214 0 \r\n-0.0833216 -0.587683 0.499573 0 \r\n0.225995 -0.230376 -0.967242 0 \r\n0.205079 -0.236435 -0.967847 0 \r\n0.231755 -0.235391 -0.967236 0 \r\n0.591007 -0.333345 -0.916824 0 \r\n0.195565 -0.451769 -0.764423 0 \r\n-0.0221318 0.344114 -0.962842 0 \r\n-0.04725 0.341224 -0.954072 0 \r\n-0.013154 0.318593 -0.953503 0 \r\n0.0387012 0.297414 -0.961743 0 \r\n0.0720948 0.283956 -0.964893 0 \r\n0.0453578 0.308024 -0.965421 0 \r\n0.305016 -0.444422 -0.796719 0 \r\n0.302754 -0.436651 -0.780534 0 \r\n0.313738 -0.442829 -0.780831 0 \r\n0.532663 -0.752303 -0.30942 0 \r\n0.522655 -0.767061 -0.299026 0 \r\n0.71964 -0.0160766 -0.50513 0 \r\n0.724149 0.00552763 -0.525054 0 \r\n0.711635 -0.0101546 -0.537928 0 \r\n0.191118 -0.185136 0.211123 0 \r\n0.221371 -0.187191 0.207709 0 \r\n0.198288 -0.213322 0.212565 0 \r\n0.429152 -0.624327 0.579031 0 \r\n0.408798 -0.62319 0.584915 0 \r\n0.415081 -0.600186 0.580748 0 \r\n-0.226896 -0.0730127 0.931297 0 \r\n-0.251933 -0.0582436 0.918959 0 \r\n-0.250001 -0.0434719 0.944242 0 \r\n0.538106 -0.8053 0.489424 0 \r\n0.522572 -0.826905 0.491816 0 \r\n0.519288 -0.810109 0.501933 0 \r\n-0.171003 0.476696 0.0133291 0 \r\n-0.159464 0.492723 0.0201206 0 \r\n0.483422 -0.555624 0.493788 0 \r\n0.473091 -0.549446 0.504916 0 \r\n0.692713 0.374673 -0.640865 0 \r\n0.394364 0.565282 0.1222 0 \r\n0.402167 0.570853 0.109426 0 \r\n0.409669 0.552124 0.122527 0 \r\n0.346684 0.597335 0.113717 0 \r\n0.326678 0.575554 0.140966 0 \r\n0.32014 0.598477 0.118698 0 \r\n-0.276414 -0.585068 0.649505 0 \r\n-0.313968 -0.578334 0.64442 0 \r\n-0.268456 -0.582667 0.631573 0 \r\n0.00981625 0.776534 -0.461471 0 \r\n0.0197451 0.783808 -0.426044 0 \r\n-7.32047e-005 0.775917 -0.430084 0 \r\n0.341744 -0.972584 0.0894464 0 \r\n0.344572 -0.982749 0.110132 0 \r\n0.0021064 -0.245948 0.82957 0 \r\n-0.0165441 -0.680619 0.623096 0 \r\n0.0111071 -0.686713 0.61151 0 \r\n0.113273 -0.701589 -0.594519 0 \r\n0.13135 -0.690649 -0.605978 0 \r\n0.19269 -0.137758 0.210142 0 \r\n0.175254 -0.167174 0.209644 0 \r\n0.153743 -0.145928 0.21352 0 \r\n0.3911 -0.0747647 -0.908216 0 \r\n-0.183931 -0.424691 0.0553228 0 \r\n-0.194602 -0.414666 0.0385386 0 \r\n-0.182902 -0.400617 0.0637382 0 \r\n0.481678 0.600993 -0.03504 0 \r\n0.494415 0.6005 -0.0537034 0 \r\n-0.703172 -0.575989 0.708262 0 \r\n-0.710837 -0.570465 0.734416 0 \r\n-0.723008 -0.575081 0.721035 0 \r\n0.706898 0.404709 -0.360764 0 \r\n0.701679 0.410187 -0.337792 0 \r\n-0.022344 0.746073 -0.562948 0 \r\n-0.0126098 0.750867 -0.564261 0 \r\n-0.00948431 0.755662 -0.548674 0 \r\n0.503464 0.638375 -0.665519 0 \r\n0.488449 0.657203 -0.657456 0 \r\n0.0495941 -0.548649 0.573895 0 \r\n0.0636979 -0.556517 0.583524 0 \r\n-0.45186 -0.723628 0.649006 0 \r\n-0.472481 -0.724596 0.669645 0 \r\n0.692428 0.284962 -0.171209 0 \r\n0.689039 0.260011 -0.16321 0 \r\n0.676634 0.284806 -0.15875 0 \r\n0.530557 -0.297121 -0.718768 0 \r\n0.529846 -0.285236 -0.705639 0 \r\n0.524689 -0.287745 -0.734702 0 \r\n0.14988 -0.54805 -0.802243 0 \r\n-0.451761 -0.663229 0.798263 0 \r\n-0.488263 -0.656644 0.808832 0 \r\n0.700194 0.346049 -0.209949 0 \r\n0.691426 0.342039 -0.193422 0 \r\n0.682845 0.368567 -0.195668 0 \r\n0.0524387 0.291723 0.269554 0 \r\n0.059485 0.314593 0.268417 0 \r\n0.178705 0.0564997 0.256282 0 \r\n0.14949 0.0650863 0.257232 0 \r\n0.16592 0.0809782 0.261589 0 \r\n-0.677014 -0.713412 0.909922 0 \r\n-0.660904 -0.731751 0.905236 0 \r\n-0.68011 -0.714015 0.90327 0 \r\n-0.356755 -0.777686 0.684116 0 \r\n-0.380815 -0.775465 0.695436 0 \r\n0.569412 0.239237 -0.0153778 0 \r\n0.568977 0.24911 -0.0206533 0 \r\n0.572697 0.230848 -0.0257613 0 \r\n-0.129186 -0.0237771 0.731261 0 \r\n-0.139934 -0.00423212 0.732684 0 \r\n-0.119799 -0.0151515 0.716942 0 \r\n-0.23366 -0.62874 0.694638 0 \r\n-0.266439 -0.618827 0.698617 0 \r\n-0.220419 -0.617419 0.677745 0 \r\n0.512159 -0.593827 -0.836398 0 \r\n0.542138 -0.594297 -0.848585 0 \r\n-0.380237 0.342267 -0.313156 0 \r\n-0.382699 0.344768 -0.342575 0 \r\n-0.371487 0.365894 -0.323381 0 \r\n-0.225351 0.0992513 0.730443 0 \r\n-0.243529 0.104927 0.747958 0 \r\n-0.0529634 -0.468911 -0.716684 0 \r\n-0.0395662 -0.482996 -0.724449 0 \r\n0.496895 -0.545694 -0.530741 0 \r\n0.519625 -0.534516 -0.511546 0 \r\n0.502649 -0.529709 -0.527107 0 \r\n-0.224914 -0.350325 -0.871609 0 \r\n-0.2079 -0.348781 -0.860056 0 \r\n-0.212189 -0.358348 -0.876745 0 \r\n0.118665 -0.867414 -0.415331 0 \r\n0.188758 0.269703 0.282919 0 \r\n0.192301 0.261967 0.283412 0 \r\n0.626717 0.141297 -0.125497 0 \r\n-0.57337 -0.742373 0.884203 0 \r\n-0.552315 -0.733824 0.873359 0 \r\n-0.54222 -0.746107 0.868939 0 \r\n0.148756 -0.506467 -0.678136 0 \r\n0.150732 -0.496939 -0.685197 0 \r\n0.0654189 -0.892658 0.348998 0 \r\n0.0475124 -0.874911 0.367598 0 \r\n0.0664233 -0.881217 0.379043 0 \r\n0.39881 -0.573752 0.578907 0 \r\n0.368163 -0.579355 0.58738 0 \r\n0.119496 -0.394071 0.309721 0 \r\n0.367162 -0.899907 -0.20036 0 \r\n0.387406 -0.887735 -0.192301 0 \r\n0.381133 -0.891382 -0.215275 0 \r\n0.343279 0.36715 0.244443 0 \r\n-0.405405 -0.149329 -0.496388 0 \r\n-0.394829 -0.152373 -0.510058 0 \r\n-0.408271 -0.139916 -0.516639 0 \r\n0.0447901 0.952013 -0.594748 0 \r\n0.0384724 0.947178 -0.614689 0 \r\n0.0536487 0.961295 -0.616246 0 \r\n0.142007 -0.865756 -0.422428 0 \r\n0.206924 -0.996342 0.154223 0 \r\n0.225246 -0.996627 0.148786 0 \r\n0.21613 -0.99588 0.132634 0 \r\n-0.00646365 -0.294271 0.217307 0 \r\n0.0142102 -0.290254 0.222216 0 \r\n-0.00597235 -0.318485 0.223347 0 \r\n-0.639929 -0.675066 0.899244 0 \r\n-0.658028 -0.660978 0.900329 0 \r\n-0.646787 -0.653623 0.890216 0 \r\n-0.228726 -0.42092 -0.0477986 0 \r\n-0.228172 -0.446995 -0.0581966 0 \r\n0.0786813 -0.253734 -0.955675 0 \r\n0.0528487 -0.264594 -0.955154 0 \r\n0.0706794 -0.26518 -0.95945 0 \r\n0.513991 0.220969 0.126325 0 \r\n0.527735 0.226236 0.103963 0 \r\n-0.238437 -0.358667 -0.0691158 0 \r\n-0.239553 -0.341607 -0.0716145 0 \r\n-0.156882 -0.549886 -0.504921 0 \r\n-0.162375 -0.516517 -0.501817 0 \r\n-0.168947 -0.534043 -0.4917 0 \r\n0.594669 -0.383343 -0.889248 0 \r\n0.307869 -0.435979 -0.714125 0 \r\n0.302738 -0.431849 -0.729865 0 \r\n0.585403 0.380479 -0.057602 0 \r\n0.575659 0.387608 -0.0447204 0 \r\n-0.422738 -0.6689 0.791794 0 \r\n-0.172651 -0.580565 0.570434 0 \r\n-0.171059 -0.577532 0.54925 0 \r\n-0.148392 -0.582545 0.555591 0 \r\n-0.342691 -0.116729 -0.662545 0 \r\n-0.362697 -0.100273 -0.664856 0 \r\n-0.298212 0.463969 -0.751101 0 \r\n-0.300855 0.470937 -0.730137 0 \r\n0.0747537 -0.552658 0.592568 0 \r\n0.0723204 -0.535443 0.60571 0 \r\n0.0903171 -0.549258 0.600117 0 \r\n-0.0510847 0.38728 -0.966373 0 \r\n-0.0270805 0.374014 -0.965651 0 \r\n0.664224 0.275073 -0.146512 0 \r\n0.655383 0.247015 -0.139322 0 \r\n0.64636 0.262232 -0.135083 0 \r\n0.59385 -0.438778 -0.334944 0 \r\n0.591691 -0.455715 -0.370108 0 \r\n0.595059 -0.461541 -0.33635 0 \r\n0.198523 -0.929576 -0.115152 0 \r\n0.185596 -0.933854 -0.132115 0 \r\n0.181606 -0.926253 -0.108969 0 \r\n-0.0461616 -0.235574 -0.914727 0 \r\n-0.0620528 -0.254825 -0.918538 0 \r\n-0.197444 0.0306878 0.685854 0 \r\n-0.19434 0.0126071 0.683903 0 \r\n-0.179813 0.01572 0.671264 0 \r\n-0.0389628 -0.80899 -0.0495875 0 \r\n-0.0176071 -0.823502 -0.0405785 0 \r\n0.0378052 -0.172219 0.605581 0 \r\n0.0441888 -0.189929 0.593491 0 \r\n0.168619 -0.821956 -0.485381 0 \r\n0.203786 -0.822509 -0.481542 0 \r\n0.192558 -0.811223 -0.494772 0 \r\n-0.171796 0.526011 -0.82388 0 \r\n-0.165763 0.540071 -0.8089 0 \r\n-0.198061 0.0490078 0.685231 0 \r\n-0.142365 0.68813 -0.490511 0 \r\n0.216435 0.221442 -0.946121 0 \r\n0.199703 0.209794 -0.942024 0 \r\n0.583971 0.0160791 -0.0824265 0 \r\n0.579976 0.0111605 -0.0707071 0 \r\n-0.306436 0.0786797 -0.89132 0 \r\n-0.307881 0.0823737 -0.881511 0 \r\n-0.0743279 -0.670356 0.298873 0 \r\n-0.0711671 -0.666544 0.314915 0 \r\n0.00440639 -0.191568 0.191065 0 \r\n0.0289964 -0.188507 0.199044 0 \r\n-0.179826 -0.293614 -0.809808 0 \r\n-0.199046 -0.28735 -0.810539 0 \r\n-0.178965 -0.272852 -0.797494 0 \r\n0.2434 0.183941 -0.922853 0 \r\n0.219317 0.174212 -0.920945 0 \r\n0.488542 -0.472199 -0.768408 0 \r\n0.506213 -0.45251 -0.767978 0 \r\n-0.31027 -0.219909 -0.394878 0 \r\n-0.313612 -0.22007 -0.383976 0 \r\n-0.299682 -0.225849 -0.377358 0 \r\n0.267826 0.793427 -0.262994 0 \r\n0.280418 0.793692 -0.275933 0 \r\n-0.223471 -0.232132 -0.948181 0 \r\n-0.228384 -0.204917 -0.947698 0 \r\n-0.231018 -0.213627 -0.95343 0 \r\n0.375193 -0.18786 0.145138 0 \r\n0.390467 -0.204224 0.134953 0 \r\n-0.701257 -0.636695 0.903955 0 \r\n-0.687593 -0.627586 0.892074 0 \r\n-0.67855 -0.648645 0.903182 0 \r\n0.543404 -0.688069 -0.00168176 0 \r\n0.547036 -0.668461 0.00558138 0 \r\n0.526583 -0.678127 -0.00298817 0 \r\n-0.181649 -0.168557 0.714167 0 \r\n-0.174283 -0.171815 0.698757 0 \r\n0.623417 -0.887992 0.32469 0 \r\n0.63093 -0.871889 0.339741 0 \r\n0.645603 -0.87342 0.313586 0 \r\n0.295465 -0.978152 0.0862556 0 \r\n0.2744 -0.983244 0.0910029 0 \r\n-0.412204 0.0880757 -0.674281 0 \r\n-0.40966 0.106214 -0.669933 0 \r\n0.480729 0.683892 -0.168958 0 \r\n0.46465 0.690767 -0.153818 0 \r\n-0.0692941 -0.646806 0.319963 0 \r\n-0.0679421 -0.662094 0.328384 0 \r\n-0.273623 0.554609 -0.519292 0 \r\n-0.283656 0.541924 -0.526929 0 \r\n-0.26907 0.560607 -0.538786 0 \r\n0.444509 -0.182912 0.0850103 0 \r\n0.430905 -0.190439 0.0964039 0 \r\n0.42787 -0.165992 0.102199 0 \r\n0.294354 -0.855379 -0.417376 0 \r\n0.282317 -0.842646 -0.439859 0 \r\n-0.0819459 -0.833682 -0.252441 0 \r\n-0.0969414 -0.82207 -0.261888 0 \r\n0.37689 -0.218344 0.147577 0 \r\n0.357465 -0.217886 0.158581 0 \r\n0.358129 -0.204481 0.156661 0 \r\n0.696184 0.0291418 -0.650102 0 \r\n-0.00075653 0.793552 -0.591818 0 \r\n-0.0109521 0.79793 -0.60678 0 \r\n-0.00294962 0.809547 -0.593464 0 \r\n-0.284611 0.533373 -0.612393 0 \r\n-0.162832 0.266175 -0.943277 0 \r\n-0.175918 0.246527 -0.950195 0 \r\n-0.172987 0.227735 -0.941168 0 \r\n0.633504 -0.0724387 -0.558714 0 \r\n0.639184 -0.0839392 -0.52405 0 \r\n0.649302 -0.0707137 -0.543342 0 \r\n0.116941 0.418317 0.249864 0 \r\n0.0980316 0.439641 0.2371 0 \r\n-0.0982444 -0.220901 0.58395 0 \r\n-0.10416 -0.235335 0.591509 0 \r\n-0.092995 -0.250997 0.578606 0 \r\n0.0406317 -0.447278 0.410945 0 \r\n0.0331206 -0.439071 0.429727 0 \r\n0.0272972 -0.458185 0.41712 0 \r\n0.556311 -0.129267 -0.750131 0 \r\n0.54882 -0.141431 -0.752417 0 \r\n0.542884 -0.133744 -0.744995 0 \r\n-0.192079 -0.627385 -0.430786 0 \r\n-0.178804 -0.632313 -0.45163 0 \r\n-0.1958 -0.602306 -0.443329 0 \r\n0.3123 0.843557 -0.831518 0 \r\n0.328825 0.845798 -0.82093 0 \r\n0.323258 0.867792 -0.809907 0 \r\n0.717337 0.0310872 -0.188991 0 \r\n0.726094 0.0152977 -0.205323 0 \r\n0.713528 0.00451115 -0.19642 0 \r\n0.174117 -0.538764 0.593901 0 \r\n0.165141 -0.555552 0.592718 0 \r\n0.359067 -0.36117 0.171142 0 \r\n0.356489 -0.887659 -0.318553 0 \r\n0.617332 0.538863 -0.474603 0 \r\n0.608377 0.555066 -0.45744 0 \r\n0.49025 0.699203 -0.429265 0 \r\n0.502722 0.685884 -0.448143 0 \r\n0.392719 0.23849 -0.898398 0 \r\n0.386259 0.219517 -0.899891 0 \r\n0.391464 0.207552 -0.894938 0 \r\n0.691359 -0.692467 0.246019 0 \r\n0.680184 -0.675744 0.24094 0 \r\n0.692474 -0.679309 0.219844 0 \r\n0.293575 -0.902539 -0.324358 0 \r\n-0.0783374 -0.687672 0.405498 0 \r\n-0.0892262 -0.707532 0.417935 0 \r\n-0.390864 -0.0800563 -0.204435 0 \r\n-0.395168 -0.0896028 -0.214139 0 \r\n0.408751 -0.10283 0.134585 0 \r\n0.298624 0.983564 -0.636212 0 \r\n0.294115 0.979942 -0.654914 0 \r\n0.675622 -0.177602 -0.850179 0 \r\n0.423117 0.162025 -0.894676 0 \r\n0.402686 0.192117 -0.895197 0 \r\n0.405436 0.158486 -0.89591 0 \r\n0.439611 -0.594254 -0.969882 0 \r\n0.416601 -0.614038 -0.967983 0 \r\n0.0703328 0.631765 -0.941033 0 \r\n0.0530152 0.644123 -0.926799 0 \r\n-0.289056 0.474968 -0.234373 0 \r\n-0.230342 0.551921 -0.741001 0 \r\n-0.237515 0.557385 -0.718204 0 \r\n-0.00835476 0.630883 -0.889588 0 \r\n-0.00553027 0.667336 -0.882004 0 \r\n-0.0121085 0.653825 -0.877259 0 \r\n-0.29274 -0.787068 0.712148 0 \r\n-0.304923 -0.791398 0.710415 0 \r\n0.196627 0.573526 0.156833 0 \r\n0.175555 0.585335 0.147058 0 \r\n0.243024 -0.587986 -0.907253 0 \r\n0.257874 -0.577558 -0.910591 0 \r\n-0.342791 0.42789 -0.557257 0 \r\n-0.334234 0.451725 -0.563562 0 \r\n0.398053 0.567544 -0.905268 0 \r\n0.381564 0.566962 -0.915351 0 \r\n-0.178352 -0.712938 0.451882 0 \r\n-0.216168 -0.710898 0.457262 0 \r\n-0.205135 -0.720679 0.462263 0 \r\n0.629804 -0.735913 0.419444 0 \r\n0.645691 -0.745222 0.399044 0 \r\n0.634583 -0.749944 0.416321 0 \r\n-0.0683686 -0.17415 0.569552 0 \r\n-0.078588 -0.176785 0.574662 0 \r\n0.111739 0.954965 -0.724027 0 \r\n0.0868961 0.949657 -0.716033 0 \r\n0.0926251 0.93925 -0.740796 0 \r\n0.357957 -0.444505 -0.668903 0 \r\n-0.351299 -0.142886 -0.956426 0 \r\n-0.355662 -0.145911 -0.947964 0 \r\n-0.474221 -0.0379831 -0.350649 0 \r\n-0.471119 -0.0565137 -0.343002 0 \r\n-0.473819 -0.0618635 -0.363122 0 \r\n-0.164221 -0.689346 0.696697 0 \r\n-0.126808 -0.683576 0.67695 0 \r\n0.0143 -0.507736 -0.68078 0 \r\n0.00863487 -0.510409 -0.672095 0 \r\n0.107478 0.00536518 0.2368 0 \r\n0.0919565 0.030828 0.242019 0 \r\n0.55928 -0.312469 -0.510605 0 \r\n0.561002 -0.339147 -0.499569 0 \r\n0.454123 0.667829 -0.70349 0 \r\n0.461828 0.6633 -0.698992 0 \r\n0.459753 0.675861 -0.677055 0 \r\n-0.198783 -0.329421 0.0324688 0 \r\n-0.184899 -0.325539 0.0621143 0 \r\n-0.197255 -0.357579 0.037792 0 \r\n-0.155962 -0.212342 0.0831738 0 \r\n-0.132442 -0.22031 0.111061 0 \r\n-0.149603 -0.232479 0.0947331 0 \r\n0.0043898 0.88966 -0.587554 0 \r\n-0.00687872 0.878931 -0.609034 0 \r\n0.122929 -0.489984 -0.70044 0 \r\n0.139496 -0.482318 -0.707276 0 \r\n-0.0530402 -0.290443 0.199034 0 \r\n-0.0342508 -0.272709 0.202484 0 \r\n-0.43018 -0.133088 -0.48204 0 \r\n-0.427519 -0.14463 -0.454144 0 \r\n-0.416184 -0.148414 -0.475074 0 \r\n0.0182799 0.631428 0.0678786 0 \r\n0.0104233 0.657613 0.0360534 0 \r\n0.0395084 0.641306 0.0651858 0 \r\n0.420835 0.844688 -0.627835 0 \r\n0.41849 0.834031 -0.621045 0 \r\n0.411133 0.853285 -0.598592 0 \r\n0.493227 -0.503167 0.250508 0 \r\n0.509804 -0.520187 0.244203 0 \r\n0.493133 -0.514686 0.26849 0 \r\n-0.270787 -0.344159 -0.897507 0 \r\n-0.294008 -0.335422 -0.910863 0 \r\n0.553676 0.50326 -0.0556086 0 \r\n0.56286 0.510888 -0.0752707 0 \r\n0.438516 0.145324 0.206339 0 \r\n0.426588 0.164198 0.217344 0 \r\n-0.70849 -0.589587 0.673853 0 \r\n-0.687943 -0.582937 0.68452 0 \r\n0.454336 0.279971 -0.92055 0 \r\n0.445474 0.268951 -0.914303 0 \r\n0.57278 -0.50909 -0.817464 0 \r\n0.586581 -0.496499 -0.827006 0 \r\n0.587681 -0.517862 -0.830111 0 \r\n-0.1506 -0.370171 -0.874112 0 \r\n-0.16138 -0.362683 -0.868758 0 \r\n-0.149971 -0.360779 -0.860533 0 \r\n0.0737799 -0.522115 0.624243 0 \r\n-0.12766 0.221166 -0.909971 0 \r\n0.120636 -0.674034 0.580842 0 \r\n0.124069 -0.645215 0.579722 0 \r\n0.131934 -0.67913 0.583323 0 \r\n0.357153 -0.443219 0.350776 0 \r\n0.342398 -0.443554 0.370399 0 \r\n0.592261 -0.4238 -0.857792 0 \r\n0.587696 -0.430998 -0.845242 0 \r\n0.58768 -0.404422 -0.859864 0 \r\n-0.0391759 -0.481889 0.255955 0 \r\n0.0646977 -0.0174867 -0.906549 0 \r\n0.0433499 -0.0443134 -0.906522 0 \r\n-0.272937 0.557312 -0.499071 0 \r\n0.197633 -0.665985 -0.936969 0 \r\n-0.404597 0.285361 -0.441028 0 \r\n-0.398565 0.303262 -0.459403 0 \r\n-0.399117 0.306125 -0.425306 0 \r\n0.35279 -0.210021 -0.953637 0 \r\n0.345246 -0.2249 -0.959411 0 \r\n0.386436 -0.221428 -0.953406 0 \r\n-0.2029 -0.138265 0.86428 0 \r\n-0.222521 -0.106938 0.88053 0 \r\n-0.209207 -0.119111 0.889765 0 \r\n-0.0133677 -0.795619 0.444638 0 \r\n0.615822 -0.668385 0.0290025 0 \r\n0.626245 -0.657298 0.0406243 0 \r\n-0.212336 0.476956 -0.0773014 0 \r\n-0.209697 0.457318 -0.0615559 0 \r\n-0.221859 0.453385 -0.0851986 0 \r\n-0.22143 -0.505778 -0.42109 0 \r\n-0.211186 -0.499094 -0.4379 0 \r\n-0.432752 0.185461 -0.447182 0 \r\n-0.428331 0.206613 -0.43729 0 \r\n0.577034 -0.601026 -0.387424 0 \r\n0.588598 -0.595201 -0.363339 0 \r\n-0.247552 -0.368362 -0.318668 0 \r\n-0.249107 -0.346165 -0.30926 0 \r\n0.511361 -0.642645 -0.477619 0 \r\n0.493642 -0.653427 -0.488402 0 \r\n0.10933 0.799534 -0.289881 0 \r\n0.0955743 0.799026 -0.318496 0 \r\n0.0132586 -0.852358 -0.0600768 0 \r\n0.0182623 -0.861014 -0.0782904 0 \r\n0.76811 0.191894 -0.367406 0 \r\n-0.142253 -0.773344 0.617461 0 \r\n-0.11901 -0.770101 0.60447 0 \r\n0.418863 0.674055 -0.826773 0 \r\n0.421031 0.664031 -0.819721 0 \r\n0.42596 0.678117 -0.810027 0 \r\n-0.255881 0.0466574 0.901978 0 \r\n-0.257085 0.0544607 0.877743 0 \r\n0.0430365 0.16796 0.262902 0 \r\n0.0587825 0.145573 0.263763 0 \r\n0.521851 -0.601871 0.434251 0 \r\n-0.156863 -0.600268 -0.490572 0 \r\n0.65089 -0.0402095 -0.614154 0 \r\n0.642614 -0.0373466 -0.637701 0 \r\n0.635346 -0.0563503 -0.601553 0 \r\n-0.128069 -0.086972 -0.910146 0 \r\n-0.10789 -0.0946714 -0.910836 0 \r\n-0.0794301 -0.0507054 -0.905105 0 \r\n0.528607 -0.60545 0.378996 0 \r\n0.689153 0.421036 -0.53006 0 \r\n0.677194 0.446609 -0.513484 0 \r\n0.677879 0.433991 -0.54406 0 \r\n-0.137185 0.101664 -0.900431 0 \r\n-0.15215 0.102743 -0.906687 0 \r\n-0.728893 -0.655948 0.886419 0 \r\n-0.714463 -0.672192 0.902938 0 \r\n-0.710651 -0.679432 0.891436 0 \r\n0.573008 0.237795 -0.0396218 0 \r\n0.576214 0.253448 -0.0505193 0 \r\n0.58242 0.221945 -0.0625599 0 \r\n0.0772934 0.807529 -0.475041 0 \r\n0.0875133 0.806772 -0.444975 0 \r\n0.0628896 0.799742 -0.461874 0 \r\n0.712615 -0.747386 0.246046 0 \r\n0.701123 -0.744318 0.278265 0 \r\n0.704962 -0.730171 0.254176 0 \r\n0.741089 0.117779 -0.597921 0 \r\n0.745296 0.131725 -0.585946 0 \r\n0.742485 0.13434 -0.606668 0 \r\n0.0569609 -0.79555 0.557428 0 \r\n0.0786735 -0.80485 0.563456 0 \r\n0.0700739 -0.813137 0.55435 0 \r\n0.726686 0.328777 -0.551721 0 \r\n0.734406 0.311874 -0.543434 0 \r\n0.145994 0.798216 -0.242655 0 \r\n0.163805 0.800068 -0.261607 0 \r\n0.162342 0.797837 -0.233279 0 \r\n0.316171 -0.543154 0.586218 0 \r\n-0.241643 -0.211677 -0.0587283 0 \r\n-0.251691 -0.222732 -0.0903807 0 \r\n-0.246011 -0.191784 -0.0681794 0 \r\n0.0518406 -0.541268 -0.777471 0 \r\n0.0662657 -0.560686 -0.785089 0 \r\n0.0426266 -0.568963 -0.794165 0 \r\n0.342652 -0.267696 -0.965752 0 \r\n0.326744 -0.265727 -0.965797 0 \r\n0.344162 -0.282601 -0.966226 0 \r\n0.499629 -0.172121 -0.937492 0 \r\n0.488921 -0.147131 -0.930941 0 \r\n-0.113576 0.0271961 0.657925 0 \r\n-0.133135 0.0409347 0.674201 0 \r\n-0.213457 -0.147748 -0.936281 0 \r\n-0.184005 -0.156356 -0.925362 0 \r\n-0.185981 -0.122329 -0.926798 0 \r\n-0.295983 -0.0969996 -0.171712 0 \r\n-0.294167 -0.0784661 -0.161267 0 \r\n-0.288465 -0.0980394 -0.164015 0 \r\n0.351654 -0.949268 0.426028 0 \r\n0.377658 -0.943779 0.425784 0 \r\n-0.419739 0.239689 -0.299065 0 \r\n-0.416295 0.252156 -0.302648 0 \r\n-0.414631 0.251092 -0.284737 0 \r\n0.455934 -0.455653 -0.581681 0 \r\n0.484039 -0.43354 -0.577886 0 \r\n0.451233 -0.441808 -0.600306 0 \r\n0.0492252 -0.267352 0.520554 0 \r\n0.06191 -0.281883 0.517789 0 \r\n0.357729 -0.462281 0.411735 0 \r\n0.378524 -0.472731 0.413099 0 \r\n0.315668 0.588992 -0.940729 0 \r\n0.283946 0.595042 -0.946563 0 \r\n0.299801 0.572047 -0.948083 0 \r\n-0.192403 -0.292944 -0.461894 0 \r\n-0.195449 -0.30733 -0.456015 0 \r\n-0.186714 -0.306821 -0.477362 0 \r\n0.372158 -0.352725 0.1499 0 \r\n0.357568 -0.340394 0.162991 0 \r\n0.0497445 -0.905169 0.290318 0 \r\n0.0616148 -0.920946 0.268308 0 \r\n-0.158184 0.484438 -0.885065 0 \r\n-0.149501 0.474668 -0.90179 0 \r\n-0.127063 -0.378215 -0.629835 0 \r\n-0.122139 -0.367899 -0.647905 0 \r\n-0.132892 -0.358723 -0.619565 0 \r\n-0.0464806 0.711327 -0.662313 0 \r\n-0.044727 0.721911 -0.63299 0 \r\n-0.0560006 0.702896 -0.654395 0 \r\n-0.113761 -0.323824 -0.803406 0 \r\n-0.105723 -0.339558 -0.807161 0 \r\n-0.118462 -0.348911 -0.828085 0 \r\n-0.232523 -0.526253 -0.150794 0 \r\n-0.224586 -0.526507 -0.113727 0 \r\n0.195187 -0.504285 -0.811696 0 \r\n0.556032 -0.718612 -0.267155 0 \r\n0.559026 -0.711878 -0.241988 0 \r\n0.43271 0.525508 -0.92458 0 \r\n0.0140209 -0.507864 -0.748106 0 \r\n0.00504869 -0.510023 -0.761505 0 \r\n-0.214597 0.637025 -0.371879 0 \r\n-0.234466 0.614519 -0.379178 0 \r\n-0.365081 -0.592363 0.701642 0 \r\n-0.396786 -0.587427 0.702031 0 \r\n0.354476 0.132679 0.253828 0 \r\n0.338091 0.123283 0.257096 0 \r\n-0.311594 0.374766 -0.791721 0 \r\n-0.300164 0.405466 -0.804303 0 \r\n-0.0835677 0.51454 -0.878065 0 \r\n-0.0989965 0.529644 -0.852605 0 \r\n-0.106658 0.508215 -0.873814 0 \r\n0.57129 -0.616898 -0.925875 0 \r\n0.580002 -0.603447 -0.933793 0 \r\n0.558859 -0.621692 -0.940371 0 \r\n0.534541 -0.483117 -0.970347 0 \r\n0.0296994 -0.21165 0.549764 0 \r\n0.530718 -0.975479 0.177165 0 \r\n0.551933 -0.971129 0.173476 0 \r\n0.667876 0.400869 -0.190687 0 \r\n0.674834 0.380967 -0.190509 0 \r\n-0.359443 0.392386 -0.544192 0 \r\n-0.369575 0.367617 -0.528579 0 \r\n-0.273847 -0.781425 0.709548 0 \r\n-0.262666 -0.78342 0.699275 0 \r\n0.0620086 -0.420778 0.425223 0 \r\n0.0619427 -0.395303 0.439829 0 \r\n0.0463892 -0.402689 0.438158 0 \r\n-0.201102 0.62199 -0.605259 0 \r\n0.644286 0.117297 -0.843508 0 \r\n0.645899 0.104429 -0.834124 0 \r\n-0.195047 -0.673836 -0.242364 0 \r\n-0.201192 -0.655753 -0.245815 0 \r\n-0.227966 -0.578259 -0.262557 0 \r\n-0.225024 -0.578061 -0.234672 0 \r\n-0.221097 -0.592348 -0.245965 0 \r\n0.580624 0.013239 -0.948881 0 \r\n0.597923 0.0265003 -0.958171 0 \r\n0.586975 0.0424031 -0.951913 0 \r\n-0.344949 -0.109549 -0.206592 0 \r\n-0.34084 -0.136307 -0.219476 0 \r\n0.653598 -0.764886 0.0396281 0 \r\n0.6695 -0.760759 0.0575798 0 \r\n0.667897 -0.742593 0.0516858 0 \r\n0.0181736 0.911047 -0.573717 0 \r\n0.561821 -0.0978291 -0.941712 0 \r\n0.551015 -0.111173 -0.938129 0 \r\n-0.165341 -0.270009 -0.523614 0 \r\n-0.158353 -0.266895 -0.542066 0 \r\n-0.163387 -0.255372 -0.527987 0 \r\n-0.100945 -0.582546 0.121926 0 \r\n-0.111679 -0.583735 0.0992992 0 \r\n-0.109754 -0.558359 0.118299 0 \r\n0.066966 -0.504039 0.642614 0 \r\n0.0475005 -0.491623 0.657468 0 \r\n0.0547906 -0.483473 0.664856 0 \r\n-0.180003 -0.318245 -0.495296 0 \r\n-0.176956 -0.30386 -0.501175 0 \r\n-0.0832103 -0.820158 -0.324645 0 \r\n0.674377 0.429882 -0.575777 0 \r\n-0.345206 -0.285886 -0.977023 0 \r\n-0.334355 -0.283507 -0.981494 0 \r\n-0.347301 -0.26664 -0.9808 0 \r\n0.272225 -0.911735 -0.31122 0 \r\n0.268843 -0.902663 -0.337388 0 \r\n-0.597064 -0.701165 0.74692 0 \r\n-0.603171 -0.690274 0.725829 0 \r\n0.242072 -0.45849 0.503624 0 \r\n0.255531 -0.456783 0.490295 0 \r\n0.259281 -0.460566 0.505917 0 \r\n-0.665514 -0.608366 0.862064 0 \r\n-0.673119 -0.598898 0.85243 0 \r\n0.527844 -0.348105 -0.0377042 0 \r\n0.649292 0.515661 -0.344176 0 \r\n-0.351363 -0.120595 -0.931081 0 \r\n-0.269028 -0.190578 -0.147487 0 \r\n0.441386 0.310862 -0.926139 0 \r\n-0.228217 0.606425 -0.528732 0 \r\n-0.244785 0.586942 -0.544752 0 \r\n-0.616616 -0.677213 0.684977 0 \r\n-0.605757 -0.682984 0.699073 0 \r\n0.388927 -0.612212 -0.964561 0 \r\n0.620456 0.0503256 -0.964944 0 \r\n0.632617 0.0875104 -0.967764 0 \r\n0.337101 -0.611039 -0.609115 0 \r\n0.35817 -0.586622 -0.608763 0 \r\n0.27208 0.616262 0.112337 0 \r\n0.288803 0.604723 0.119528 0 \r\n0.283412 0.588235 0.138756 0 \r\n0.543325 0.653561 -0.370995 0 \r\n0.552193 0.645145 -0.346695 0 \r\n0.767679 0.188199 -0.407226 0 \r\n0.768914 0.178227 -0.396874 0 \r\n0.767736 0.194825 -0.391041 0 \r\n0.0770293 -0.274635 0.608081 0 \r\n0.0898103 -0.293927 0.601927 0 \r\n0.111375 -0.346284 -0.969791 0 \r\n0.088071 -0.340938 -0.971449 0 \r\n0.093779 -0.375197 -0.972835 0 \r\n0.097784 -0.646589 -0.626047 0 \r\n0.104228 -0.625745 -0.63553 0 \r\n0.0831448 -0.630773 -0.628686 0 \r\n0.288584 -0.969857 0.274918 0 \r\n0.302141 -0.961931 0.294514 0 \r\n0.657194 0.150512 -0.137086 0 \r\n0.0633473 -0.828975 0.535195 0 \r\n0.0443544 -0.81052 0.536565 0 \r\n0.0673542 -0.822293 0.546952 0 \r\n0.194553 -0.935363 -0.243014 0 \r\n0.208864 -0.93503 -0.247084 0 \r\n0.19194 -0.932063 -0.269744 0 \r\n-0.508821 -0.707769 0.659513 0 \r\n-0.527645 -0.70832 0.684448 0 \r\n-0.501506 -0.715105 0.675124 0 \r\n-0.301225 0.217582 -0.146656 0 \r\n-0.298509 0.18215 -0.143321 0 \r\n0.199881 -0.469993 -0.791064 0 \r\n0.206083 -0.474531 -0.801308 0 \r\n0.680583 0.452358 -0.48156 0 \r\n0.669308 0.465313 -0.49556 0 \r\n-0.00684394 -0.53252 0.392226 0 \r\n-0.0198926 -0.543214 0.378498 0 \r\n-0.0957361 0.711856 -0.17829 0 \r\n-0.0806942 0.725911 -0.193458 0 \r\n-0.0667343 0.730088 -0.175078 0 \r\n0.513996 -0.591508 -0.502473 0 \r\n0.518847 -0.608572 -0.490848 0 \r\n-0.0892878 -0.351737 0.600449 0 \r\n0.477527 -0.555336 0.436467 0 \r\n0.485056 -0.561406 0.447975 0 \r\n0.469558 -0.544879 0.452649 0 \r\n0.174828 -0.267598 -0.966092 0 \r\n0.181849 -0.257079 -0.966805 0 \r\n0.164194 -0.261465 -0.966838 0 \r\n-0.22839 -0.474746 -0.0742077 0 \r\n-0.0257071 -0.701138 -0.540539 0 \r\n0.17764 -0.921988 0.530204 0 \r\n0.199964 -0.926298 0.53904 0 \r\n-0.680158 -0.568741 0.771445 0 \r\n-0.686409 -0.567176 0.755668 0 \r\n-0.330963 0.0510261 0.85766 0 \r\n-0.320771 0.03061 0.862859 0 \r\n-0.316621 0.0372925 0.839978 0 \r\n0.345375 -0.166687 0.158705 0 \r\n0.336509 -0.141987 0.166311 0 \r\n0.363966 -0.14608 0.152225 0 \r\n0.0610664 -0.851539 0.474227 0 \r\n0.0753177 -0.860185 0.484536 0 \r\n0.0734852 -0.863506 0.464162 0 \r\n-0.125318 0.647735 -0.681742 0 \r\n-0.14103 0.646328 -0.669702 0 \r\n0.455238 0.7264 -0.39748 0 \r\n0.473668 0.712532 -0.413566 0 \r\n-0.143679 0.271052 -0.933006 0 \r\n-0.110836 0.150907 0.169118 0 \r\n-0.0981747 0.151814 0.181835 0 \r\n-0.10885 0.140083 0.170151 0 \r\n-0.438731 0.0543984 -0.593032 0 \r\n-0.434343 0.0710218 -0.599538 0 \r\n-0.442925 0.0678051 -0.566441 0 \r\n-0.518591 -0.683365 0.517125 0 \r\n-0.491489 -0.693565 0.515408 0 \r\n0.530604 -0.958609 0.240339 0 \r\n0.184855 -0.4763 -0.782557 0 \r\n0.195273 -0.457609 -0.776191 0 \r\n0.398742 -0.740471 0.580147 0 \r\n0.377185 -0.767559 0.580848 0 \r\n-0.145878 -0.73919 -0.157051 0 \r\n0.703769 -0.703781 0.23667 0 \r\n0.710052 -0.714635 0.22344 0 \r\n0.710171 -0.722385 0.235186 0 \r\n0.551186 0.260069 0.0399446 0 \r\n0.544794 0.284537 0.0435194 0 \r\n0.554351 0.270253 0.0214742 0 \r\n-0.274592 -0.141892 -0.977108 0 \r\n-0.262675 -0.119631 -0.974283 0 \r\n-0.446743 -0.0123586 -0.251261 0 \r\n-0.454196 0.0124623 -0.270335 0 \r\n-0.443981 0.0256863 -0.243868 0 \r\n-0.105707 0.663372 -0.672227 0 \r\n-0.107421 0.650329 -0.694727 0 \r\n0.605876 -0.276891 -0.919811 0 \r\n0.120808 0.296916 -0.969691 0 \r\n0.150509 0.288184 -0.969308 0 \r\n0.340016 -0.526904 -0.626974 0 \r\n-0.394678 -0.0755559 -0.651425 0 \r\n-0.38221 -0.0727465 -0.678062 0 \r\n-0.391475 -0.0658206 -0.671517 0 \r\n0.272745 -0.919942 -0.284173 0 \r\n0.27509 -0.926551 -0.250207 0 \r\n0.0206323 0.809361 -0.558707 0 \r\n0.0124638 0.823105 -0.569829 0 \r\n0.0258502 0.827297 -0.550033 0 \r\n0.62376 0.554189 -0.331851 0 \r\n0.28572 -0.456216 -0.81678 0 \r\n0.282862 -0.44273 -0.803825 0 \r\n0.296891 -0.45173 -0.809377 0 \r\n0.498996 -0.21326 -0.70163 0 \r\n0.494945 -0.196781 -0.688034 0 \r\n0.536052 -0.311368 -0.681937 0 \r\n0.530895 -0.313876 -0.711 0 \r\n0.659788 0.0913755 -0.78265 0 \r\n0.65405 0.0807862 -0.796463 0 \r\n0.660203 0.0662538 -0.782588 0 \r\n-0.319421 0.156514 -0.837496 0 \r\n0.472059 0.649992 -0.705624 0 \r\n0.477688 0.658023 -0.67919 0 \r\n-0.0858075 -0.648843 0.200974 0 \r\n-0.0858407 -0.640682 0.189944 0 \r\n-0.0855056 -0.63475 0.19866 0 \r\n-0.638415 -0.667361 0.640819 0 \r\n-0.650094 -0.658982 0.62391 0 \r\n-0.663695 -0.65479 0.645131 0 \r\n0.567991 -0.674065 -0.192617 0 \r\n0.575119 -0.671751 -0.219902 0 \r\n0.563565 -0.69227 -0.209951 0 \r\n0.158937 -0.89196 0.547958 0 \r\n0.180472 -0.9073 0.548379 0 \r\n0.157647 -0.902354 0.540742 0 \r\n0.497513 -0.487261 -0.776656 0 \r\n-0.355066 0.371472 -0.256128 0 \r\n-0.344936 0.370004 -0.236098 0 \r\n-0.35484 0.349017 -0.231706 0 \r\n0.646785 -0.627382 0.0798272 0 \r\n0.702083 0.357121 -0.638963 0 \r\n0.705424 0.345666 -0.648247 0 \r\n-0.267061 -0.226483 -0.419253 0 \r\n-0.255035 -0.221971 -0.447494 0 \r\n0.223856 -0.917893 -0.0846409 0 \r\n0.216276 -0.927482 -0.106625 0 \r\n0.60904 0.576136 -0.285966 0 \r\n0.610753 0.57033 -0.269836 0 \r\n0.605227 0.579596 -0.277061 0 \r\n0.246042 -0.451894 0.469858 0 \r\n0.22486 -0.449941 0.477771 0 \r\n-0.396508 0.11781 -0.702374 0 \r\n-0.403063 0.1141 -0.686746 0 \r\n0.653463 -0.901494 0.184585 0 \r\n0.644062 -0.912839 0.170296 0 \r\n0.240842 0.276075 0.27869 0 \r\n0.248962 0.267368 0.277663 0 \r\n0.228895 0.251565 0.28075 0 \r\n-0.0903121 0.598191 -0.775905 0 \r\n0.310744 -0.969655 0.0800866 0 \r\n0.314501 -0.866894 0.568857 0 \r\n0.326558 -0.886958 0.55833 0 \r\n0.368183 -0.088999 -0.912969 0 \r\n0.154604 -0.506522 -0.780702 0 \r\n0.749462 0.143264 -0.237304 0 \r\n0.747999 0.102245 -0.232112 0 \r\n0.741016 0.139227 -0.211122 0 \r\n0.59868 -0.366801 -0.957238 0 \r\n0.597658 -0.32764 -0.955207 0 \r\n-0.277745 -0.184992 -0.547918 0 \r\n-0.280001 -0.175045 -0.575633 0 \r\n0.623137 0.451154 -0.712072 0 \r\n0.615459 0.450215 -0.72824 0 \r\n0.625151 0.438982 -0.72204 0 \r\n0.600895 0.494788 -0.129342 0 \r\n0.598529 0.520625 -0.147761 0 \r\n0.608465 0.496972 -0.148798 0 \r\n0.739029 0.298462 -0.286515 0 \r\n0.739589 0.28767 -0.269476 0 \r\n0.424025 0.765561 -0.650998 0 \r\n0.41479 0.780062 -0.623767 0 \r\n-0.649477 -0.741175 0.882864 0 \r\n-0.66081 -0.727857 0.873142 0 \r\n-0.675333 -0.719038 0.888862 0 \r\n0.427647 -0.258669 -0.958974 0 \r\n0.41313 -0.235787 -0.956689 0 \r\n0.393409 -0.259189 -0.961465 0 \r\n0.188213 -0.635757 -0.634511 0 \r\n0.39136 0.684789 -0.037905 0 \r\n0.378145 0.675803 -0.0075736 0 \r\n0.615101 -0.264649 -0.949587 0 \r\n0.607256 -0.290338 -0.953605 0 \r\n0.610613 -0.28898 -0.943987 0 \r\n-0.0042057 -0.857244 -0.108137 0 \r\n-0.0261705 -0.840972 -0.0989165 0 \r\n0.225682 0.319651 -0.965171 0 \r\n0.218327 0.301814 -0.965595 0 \r\n0.658097 0.35172 -0.757484 0 \r\n0.657277 0.337768 -0.769933 0 \r\n0.66453 0.33917 -0.756725 0 \r\n0.41205 -0.406707 0.173668 0 \r\n0.432581 -0.420834 0.168387 0 \r\n0.420664 -0.414255 0.182463 0 \r\n0.597216 -0.491326 -0.351044 0 \r\n0.599375 -0.474389 -0.31588 0 \r\n0.606503 0.312294 -0.932106 0 \r\n0.610364 0.291541 -0.942549 0 \r\n0.0605102 -0.725322 -0.902383 0 \r\n0.0789402 -0.723837 -0.89625 0 \r\n-0.111173 -0.806795 -0.27349 0 \r\n0.698483 -0.667697 0.173331 0 \r\n0.69786 -0.660453 0.149252 0 \r\n0.708071 -0.679958 0.159639 0 \r\n-0.0607407 -0.779294 0.151452 0 \r\n-0.0579857 -0.791754 0.1773 0 \r\n-0.255705 -0.754135 0.725316 0 \r\n-0.313913 -0.758896 0.751361 0 \r\n0.511194 -0.772573 -0.197511 0 \r\n0.49824 -0.780454 -0.17187 0 \r\n0.163129 0.886262 -0.462668 0 \r\n0.668244 0.239227 -0.145312 0 \r\n0.650381 0.226386 -0.133883 0 \r\n0.0423174 0.793749 -0.295827 0 \r\n-0.272795 0.00486143 -0.0939077 0 \r\n-0.269559 -0.0226501 -0.0879546 0 \r\n-0.28694 -0.640426 0.463539 0 \r\n-0.264642 -0.633335 0.461106 0 \r\n0.500376 -0.41327 -0.571834 0 \r\n-0.258519 0.450433 -0.154636 0 \r\n-0.254155 0.447268 -0.146024 0 \r\n-0.261579 0.434474 -0.152568 0 \r\n0.523636 -0.238508 -0.780429 0 \r\n0.531294 -0.261272 -0.797966 0 \r\n0.58228 -0.679237 0.457344 0 \r\n0.561028 -0.67203 0.480385 0 \r\n0.7414 0.282518 -0.554283 0 \r\n0.738105 0.298285 -0.547058 0 \r\n0.363727 0.109291 0.24329 0 \r\n-0.0438258 0.0590212 -0.900046 0 \r\n-0.0128951 0.075458 -0.901917 0 \r\n0.412409 0.742909 -0.523707 0 \r\n0.400284 0.751698 -0.504938 0 \r\n0.398146 0.749322 -0.541382 0 \r\n-0.4013 -0.131318 -0.546136 0 \r\n-0.385682 -0.140923 -0.550209 0 \r\n-0.389286 -0.129282 -0.566036 0 \r\n0.112786 0.961233 -0.507492 0 \r\n0.121974 0.951863 -0.492972 0 \r\n0.102454 0.948823 -0.503774 0 \r\n-0.321707 0.0241661 0.890128 0 \r\n-0.334119 0.038875 0.896292 0 \r\n-0.320714 0.0186976 0.90588 0 \r\n0.582083 -0.281004 -0.269584 0 \r\n0.582524 -0.286968 -0.250799 0 \r\n0.582062 -0.265748 -0.247347 0 \r\n-0.0598353 -0.464042 -0.700534 0 \r\n-0.0682072 -0.452578 -0.723523 0 \r\n-0.182559 -0.618184 0.660649 0 \r\n-0.215337 -0.608271 0.664629 0 \r\n-0.756709 -0.57682 0.807042 0 \r\n-0.233543 0.0167593 -0.962134 0 \r\n-0.243169 0.0205727 -0.970384 0 \r\n-0.24185 -0.034686 -0.963329 0 \r\n0.59137 -0.505508 -0.378738 0 \r\n-0.174502 -0.512905 0.0377292 0 \r\n-0.173115 -0.537933 0.0224818 0 \r\n-0.608811 -0.579911 0.703277 0 \r\n-0.605435 -0.578674 0.715578 0 \r\n0.586944 -0.17624 -0.26398 0 \r\n0.583053 -0.188535 -0.271811 0 \r\n0.388682 0.908463 -0.601556 0 \r\n0.375805 0.923555 -0.592529 0 \r\n0.389757 -0.624075 0.588769 0 \r\n0.367068 -0.634161 0.592438 0 \r\n0.372038 -0.609134 0.590301 0 \r\n0.465387 -0.212303 -0.944899 0 \r\n0.479603 -0.201779 -0.941727 0 \r\n0.462746 -0.20065 -0.940439 0 \r\n0.574866 -0.0806063 -0.720766 0 \r\n0.579535 -0.0718426 -0.709643 0 \r\n0.599957 -0.0630604 -0.727641 0 \r\n-0.145274 -0.75435 -0.185833 0 \r\n-0.156837 -0.730955 -0.177027 0 \r\n0.593507 0.541088 -0.161907 0 \r\n0.588075 0.565006 -0.186956 0 \r\n-0.114737 -0.600526 0.0824112 0 \r\n-0.119109 -0.614564 0.0575538 0 \r\n0.561427 -0.235898 -0.426695 0 \r\n0.565656 -0.243928 -0.410358 0 \r\n0.369865 -0.31847 0.154 0 \r\n0.388952 -0.314741 0.137998 0 \r\n-0.314817 0.283193 -0.159556 0 \r\n-0.318971 0.260644 -0.159039 0 \r\n-0.28446 -0.222349 -0.25368 0 \r\n-0.25776 -0.056601 -0.0511248 0 \r\n-0.254591 -0.0731225 -0.0484549 0 \r\n0.275546 0.334697 -0.963445 0 \r\n-0.378853 -0.0273766 -0.730245 0 \r\n-0.367361 -0.0284569 -0.751157 0 \r\n0.240643 -0.721401 -0.583502 0 \r\n0.218877 -0.722466 -0.58634 0 \r\n-0.165241 -0.0495868 0.813232 0 \r\n-0.134469 -0.0888511 0.798694 0 \r\n0.358149 -0.811391 -0.452314 0 \r\n0.335316 -0.803358 -0.470675 0 \r\n0.572914 -0.241874 -0.342814 0 \r\n0.43491 -0.126577 -0.920002 0 \r\n0.403345 -0.137211 -0.923548 0 \r\n0.423979 -0.150779 -0.92771 0 \r\n0.679742 -0.117599 -0.96077 0 \r\n0.687214 -0.135734 -0.95568 0 \r\n0.694384 -0.102713 -0.956062 0 \r\n-0.158371 -0.465747 0.0849271 0 \r\n-0.170941 -0.442486 0.0728178 0 \r\n-0.159662 -0.433903 0.0926317 0 \r\n0.603619 -0.563562 -0.317971 0 \r\n-0.208842 -0.315154 0.013245 0 \r\n-0.196485 -0.283114 0.0375674 0 \r\n-0.153142 -0.312236 0.113261 0 \r\n-0.15391 -0.297026 0.108161 0 \r\n-0.142441 -0.298121 0.124701 0 \r\n-0.0416539 -0.834957 0.189477 0 \r\n-0.0396575 -0.834244 0.210977 0 \r\n-0.0329438 -0.847604 0.205519 0 \r\n0.277756 -0.886032 -0.0281432 0 \r\n0.280517 -0.889629 -0.0389519 0 \r\n-0.307365 0.0104326 0.872447 0 \r\n-0.150828 -0.264373 -0.787596 0 \r\n0.0594092 0.2655 0.27332 0 \r\n-0.0614261 -0.182067 0.15387 0 \r\n-0.0595007 -0.163183 0.153133 0 \r\n-0.0365366 -0.157692 0.16614 0 \r\n0.222683 -0.0648856 0.220965 0 \r\n0.236099 -0.0760162 0.216633 0 \r\n0.216612 -0.0878429 0.215466 0 \r\n0.638609 -0.143486 -0.266306 0 \r\n0.63315 -0.147599 -0.280873 0 \r\n0.625898 -0.148521 -0.270019 0 \r\n-0.286491 -0.791416 0.69719 0 \r\n-0.261078 -0.231782 -0.402072 0 \r\n-0.0792105 -0.796281 -0.100976 0 \r\n-0.0671358 -0.813309 -0.109917 0 \r\n-0.242612 -0.495086 -0.34346 0 \r\n-0.244188 -0.508495 -0.32219 0 \r\n-0.238966 -0.518762 -0.350367 0 \r\n0.269284 0.985358 -0.54381 0 \r\n0.24847 0.988991 -0.538102 0 \r\n0.255089 0.993878 -0.561252 0 \r\n-0.158655 -0.0537027 0.971066 0 \r\n0.302323 -0.917368 0.0325202 0 \r\n0.298385 -0.905876 0.0235288 0 \r\n0.277881 -0.91853 0.0286652 0 \r\n-0.148405 -0.382657 0.121157 0 \r\n-0.15752 -0.409402 0.103367 0 \r\n0.69649 -0.0696615 -0.953155 0 \r\n0.685143 -0.0218449 -0.954713 0 \r\n-0.325032 0.429473 -0.706203 0 \r\n-0.330413 0.403857 -0.721661 0 \r\n0.547471 -0.792011 -0.00818837 0 \r\n0.54165 -0.818452 -0.00460374 0 \r\n-0.256108 0.218158 -0.973903 0 \r\n-0.254601 0.243637 -0.968554 0 \r\n-0.339583 0.0812168 0.902201 0 \r\n-0.346345 0.0767497 0.903415 0 \r\n0.520539 -0.456283 -0.783669 0 \r\n0.537256 -0.453934 -0.792063 0 \r\n0.762024 0.0411734 -0.378893 0 \r\n0.762127 0.0512957 -0.389996 0 \r\n-0.0266301 -0.495338 0.300658 0 \r\n0.0620008 0.933948 -0.530622 0 \r\n0.0747522 0.951676 -0.531811 0 \r\n0.0805138 0.940464 -0.517105 0 \r\n0.0885441 0.266243 -0.964099 0 \r\n0.0952007 0.276853 -0.967777 0 \r\n0.331398 -0.919178 0.0389123 0 \r\n-0.058354 -0.614238 0.57997 0 \r\n-0.0437853 -0.607903 0.562828 0 \r\n-0.0329604 -0.62133 0.578985 0 \r\n0.240182 -0.149224 -0.933315 0 \r\n0.219327 -0.141762 -0.929345 0 \r\n0.0459482 0.87916 -0.783572 0 \r\n0.0619583 0.871937 -0.803338 0 \r\n-0.625516 -0.672338 0.631802 0 \r\n-0.610193 -0.67777 0.641447 0 \r\n-0.609491 -0.676986 0.629244 0 \r\n-0.42111 0.116399 -0.617649 0 \r\n-0.424444 0.118189 -0.60162 0 \r\n-0.426514 0.0957545 -0.61597 0 \r\n-0.25767 0.3071 -0.106734 0 \r\n-0.249369 0.299245 -0.0867172 0 \r\n-0.697222 -0.568169 0.739994 0 \r\n-0.680189 -0.570379 0.737316 0 \r\n-0.461847 0.0021375 -0.29912 0 \r\n-0.464239 -0.029108 -0.304128 0 \r\n-0.402943 0.0210376 -0.696146 0 \r\n-0.396597 0.0436068 -0.713273 0 \r\n-0.0205774 -0.510068 -0.782278 0 \r\n-0.00306586 -0.516057 -0.773159 0 \r\n-0.0142025 -0.51916 -0.788847 0 \r\n-0.331366 -0.631877 0.735501 0 \r\n-0.363982 -0.621412 0.737653 0 \r\n-0.312297 -0.619682 0.717663 0 \r\n-0.113988 -0.232938 0.604376 0 \r\n-0.119237 -0.202843 0.60972 0 \r\n0.406437 0.684804 -0.0569078 0 \r\n0.582461 -0.225311 -0.247981 0 \r\n0.580936 -0.242955 -0.268614 0 \r\n0.583146 -0.242141 -0.245498 0 \r\n0.747548 0.254237 -0.269823 0 \r\n0.752944 0.246797 -0.290313 0 \r\n0.752669 0.230521 -0.271367 0 \r\n-0.259979 -0.0510111 0.825534 0 \r\n-0.272503 -0.0333413 0.838307 0 \r\n-0.267521 -0.0484802 0.850551 0 \r\n0.441821 0.637731 -0.784895 0 \r\n0.451461 0.638027 -0.759656 0 \r\n-0.0984831 -0.348417 -0.973842 0 \r\n-0.199038 -0.238043 -0.935894 0 \r\n-0.208379 -0.221226 -0.935914 0 \r\n-0.211497 -0.240239 -0.94243 0 \r\n0.175073 0.916635 -0.805281 0 \r\n0.156047 0.909719 -0.806107 0 \r\n0.501061 -0.414228 -0.7389 0 \r\n0.109304 -0.804744 -0.499151 0 \r\n0.0912756 -0.788979 -0.512626 0 \r\n0.0847626 -0.807644 -0.489893 0 \r\n0.135052 0.942794 -0.482782 0 \r\n0.141152 -0.0769136 0.220151 0 \r\n0.166591 -0.0863596 0.219886 0 \r\n0.145739 -0.107066 0.214282 0 \r\n-0.25073 -0.322452 -0.302316 0 \r\n-0.245255 -0.313129 -0.325466 0 \r\n-0.249607 -0.303815 -0.307654 0 \r\n0.413213 -0.849012 -0.342224 0 \r\n0.423361 -0.852601 -0.310047 0 \r\n0.432114 -0.837605 -0.332568 0 \r\n0.359442 -0.441666 -0.715775 0 \r\n-0.0932144 -0.0336457 0.700671 0 \r\n-0.0954894 -0.0413712 0.705912 0 \r\n-0.106776 -0.026971 0.71028 0 \r\n-0.245675 -0.00633495 -0.0184535 0 \r\n-0.240049 0.0261377 -0.00500745 0 \r\n-0.232981 0.0052713 0.00786732 0 \r\n0.13688 -0.217808 -0.955182 0 \r\n-0.0954202 -0.743031 0.458533 0 \r\n-0.0787452 -0.740213 0.447274 0 \r\n0.136513 -0.163072 -0.92647 0 \r\n0.139772 -0.146558 -0.920797 0 \r\n0.241646 -0.349764 0.254513 0 \r\n0.224079 -0.35231 0.260983 0 \r\n-0.535791 -0.647036 0.819749 0 \r\n-0.550284 -0.654842 0.834359 0 \r\n-0.563143 -0.637889 0.827235 0 \r\n-0.277773 0.0559861 -0.107219 0 \r\n-0.275387 0.0266783 -0.102801 0 \r\n-0.280281 0.0279857 -0.116133 0 \r\n0.472717 -0.512668 0.303122 0 \r\n0.485035 -0.516111 0.283733 0 \r\n0.481196 -0.531113 0.312061 0 \r\n0.429125 0.694808 -0.801087 0 \r\n0.429379 0.715961 -0.794894 0 \r\n0.424046 0.709293 -0.810887 0 \r\n0.194788 0.613813 0.121189 0 \r\n0.216013 0.619904 0.114148 0 \r\n-0.150321 0.684639 -0.47642 0 \r\n-0.133512 0.696614 -0.482498 0 \r\n-0.0616554 0.312984 -0.937449 0 \r\n-0.0663228 0.328248 -0.946862 0 \r\n0.53215 0.2973 0.071225 0 \r\n-0.37936 0.103527 -0.745587 0 \r\n0.559991 0.202084 0.0323344 0 \r\n0.555757 0.230392 0.0381702 0 \r\n0.564976 0.217478 0.0120637 0 \r\n0.408736 -0.0966922 -0.91219 0 \r\n0.380278 -0.0946097 -0.913293 0 \r\n0.385819 -0.110926 -0.916942 0 \r\n-0.244539 -0.474289 -0.142156 0 \r\n-0.24088 -0.487536 -0.131595 0 \r\n-0.243349 -0.486944 -0.150808 0 \r\n-0.182193 -0.0569812 0.679249 0 \r\n-0.16028 -0.0723511 0.65778 0 \r\n0.135464 -0.933273 0.324212 0 \r\n0.391469 -0.961625 0.0795055 0 \r\n0.402629 -0.949131 0.0670121 0 \r\n0.375473 -0.951569 0.070426 0 \r\n0.461698 0.583788 0.0173158 0 \r\n-0.0681662 -0.599726 0.409793 0 \r\n-0.0715718 -0.61027 0.39909 0 \r\n-0.573973 -0.785136 0.842162 0 \r\n-0.561761 -0.786526 0.830187 0 \r\n-0.0925425 -0.626235 -0.538521 0 \r\n-0.0730577 -0.616126 -0.556978 0 \r\n-0.0942172 -0.603681 -0.545973 0 \r\n-0.0114091 -0.367925 0.775104 0 \r\n0.601865 -0.533057 -0.217445 0 \r\n0.604843 -0.525828 -0.238826 0 \r\n0.603079 -0.545632 -0.23171 0 \r\n0.0279665 -0.286366 -0.960088 0 \r\n0.0447097 -0.288593 -0.962936 0 \r\n0.616937 -0.542676 -0.869691 0 \r\n0.604818 -0.552422 -0.857469 0 \r\n0.612149 -0.532439 -0.857479 0 \r\n-0.157946 0.0376246 0.72681 0 \r\n-0.136099 0.0195745 0.714296 0 \r\n-0.152394 0.0224436 0.730878 0 \r\n0.451264 -0.429579 -0.611564 0 \r\n0.465231 -0.42227 -0.613481 0 \r\n0.687499 0.294768 -0.743868 0 \r\n0.689423 0.310811 -0.732715 0 \r\n0.679124 0.307703 -0.752438 0 \r\n0.346922 -0.742968 -0.526827 0 \r\n0.313743 -0.748101 -0.534137 0 \r\n0.323663 -0.767149 -0.512471 0 \r\n0.507262 -0.677405 -0.0334353 0 \r\n0.514292 -0.664831 -0.0399752 0 \r\n-0.460437 0.0997546 -0.390365 0 \r\n-0.459742 0.0926052 -0.42376 0 \r\n-0.456353 0.108679 -0.407686 0 \r\n-0.471335 -0.698849 0.823873 0 \r\n-0.468686 -0.709818 0.827261 0 \r\n-0.492359 -0.705642 0.835085 0 \r\n0.465247 -0.254933 -0.958073 0 \r\n0.598675 -0.579308 -0.876143 0 \r\n0.601565 -0.58488 -0.889654 0 \r\n-0.536745 -0.673431 0.522645 0 \r\n-0.555281 -0.664111 0.526116 0 \r\n-0.564802 -0.673486 0.532658 0 \r\n0.230004 -0.933303 -0.245255 0 \r\n0.227391 -0.930002 -0.271984 0 \r\n0.271655 0.989001 -0.641131 0 \r\n0.284948 0.989639 -0.624944 0 \r\n0.408886 -0.270229 0.122652 0 \r\n0.42608 -0.274578 0.103927 0 \r\n0.421198 -0.296133 0.109001 0 \r\n0.367016 0.459787 0.203703 0 \r\n0.367463 0.441312 0.212322 0 \r\n0.722908 -0.0496294 -0.244234 0 \r\n0.71441 -0.0386167 -0.222647 0 \r\n0.730785 -0.0222911 -0.23434 0 \r\n-0.176172 -0.175822 -0.744487 0 \r\n-0.0879649 -0.260976 -0.921225 0 \r\n0.348266 0.554173 0.153428 0 \r\n0.321723 0.555315 0.15841 0 \r\n-0.204228 0.0895544 0.710825 0 \r\n-0.20323 0.0884597 0.720039 0 \r\n-0.737197 -0.575 0.73271 0 \r\n-0.729531 -0.580525 0.706555 0 \r\n0.0211952 -0.538576 0.530977 0 \r\n0.016148 -0.531909 0.516554 0 \r\n0.564328 -0.635394 0.37443 0 \r\n0.556265 -0.627959 0.368573 0 \r\n-0.174246 -0.105187 -0.91892 0 \r\n-0.162847 -0.0786525 -0.913342 0 \r\n0.600579 0.449265 -0.754802 0 \r\n0.607832 0.453422 -0.738295 0 \r\n0.590939 0.464644 -0.754889 0 \r\n-0.0887701 -0.759562 0.626805 0 \r\n-0.0770186 -0.761191 0.609176 0 \r\n0.598338 0.175675 -0.0970027 0 \r\n0.604942 0.154922 -0.109447 0 \r\n0.596828 0.142039 -0.0984077 0 \r\n0.206443 -0.0591292 0.224327 0 \r\n0.22593 -0.0473024 0.225494 0 \r\n0.614478 -0.626336 0.0609937 0 \r\n0.620237 -0.641527 0.0504458 0 \r\n0.644285 -0.89317 0.277824 0 \r\n0.657665 -0.872813 0.282452 0 \r\n-0.0407942 -0.575467 0.398063 0 \r\n-0.0280611 -0.569718 0.411547 0 \r\n-0.144419 -0.270227 0.716926 0 \r\n-0.126298 -0.306289 0.69527 0 \r\n-0.281121 0.112611 0.780125 0 \r\n-0.262904 0.107703 0.772411 0 \r\n-0.201005 0.63081 -0.236304 0 \r\n-0.191193 0.646785 -0.241883 0 \r\n-0.193855 0.632901 -0.217741 0 \r\n-0.18699 0.486575 -0.0297863 0 \r\n-0.170925 0.263809 0.12426 0 \r\n-0.161072 0.251331 0.131799 0 \r\n0.385113 0.766257 -0.362782 0 \r\n0.364121 0.771881 -0.329566 0 \r\n-0.476721 -0.0546637 -0.382582 0 \r\n-0.476273 -0.0465215 -0.405552 0 \r\n0.237825 -0.220521 -0.964809 0 \r\n0.282135 -0.221413 -0.963136 0 \r\n0.26729 -0.212601 -0.961316 0 \r\n0.0605802 -0.543508 -0.651056 0 \r\n0.0379177 -0.551349 -0.6422 0 \r\n0.0635547 -0.555532 -0.646935 0 \r\n-0.0112369 0.870894 -0.744998 0 \r\n0.00571695 0.874308 -0.7589 0 \r\n-0.276748 -0.154234 -0.166474 0 \r\n-0.282861 -0.176849 -0.194225 0 \r\n-0.339126 0.448736 -0.436208 0 \r\n-0.331689 0.46343 -0.451038 0 \r\n-0.327058 0.471954 -0.425608 0 \r\n0.112169 -0.890438 -0.369825 0 \r\n0.131725 -0.89932 -0.356556 0 \r\n0.51756 -0.0761474 0.0297646 0 \r\n0.521909 -0.0523719 0.0373655 0 \r\n0.595375 0.386939 -0.851929 0 \r\n-0.208786 0.238615 0.0716556 0 \r\n-0.217254 0.225322 0.0570245 0 \r\n0.0229852 -0.563972 -0.796631 0 \r\n0.00579324 -0.564205 -0.80545 0 \r\n0.0110096 -0.549776 -0.795367 0 \r\n0.665511 -0.0398852 -0.578405 0 \r\n-0.124936 -0.389821 0.152464 0 \r\n-0.113427 -0.373105 0.164941 0 \r\n-0.10844 -0.38798 0.168438 0 \r\n-0.411559 0.265967 -0.314084 0 \r\n-0.416667 0.254564 -0.328412 0 \r\n0.635387 -0.860731 0.3513 0 \r\n0.104821 -0.35733 0.262181 0 \r\n0.110859 -0.345694 0.254186 0 \r\n0.123568 -0.352763 0.261766 0 \r\n-0.0262934 -0.812105 0.0869404 0 \r\n-0.0367609 -0.808693 0.105893 0 \r\n-0.0249636 -0.826485 0.106189 0 \r\n0.156227 -0.408347 0.583032 0 \r\n0.141461 -0.388001 0.598332 0 \r\n0.156895 -0.402938 0.565573 0 \r\n0.573578 0.430064 -0.929974 0 \r\n0.569454 0.452228 -0.914334 0 \r\n0.378882 -0.89125 -0.246062 0 \r\n0.371872 -0.890739 -0.273095 0 \r\n0.597124 -0.611724 -0.267088 0 \r\n0.601528 -0.590126 -0.254047 0 \r\n0.599743 -0.598372 -0.28108 0 \r\n0.501611 -0.533131 0.277429 0 \r\n0.566938 0.23338 -0.00129315 0 \r\n0.236189 -0.938676 -0.207072 0 \r\n0.258819 -0.937645 -0.211657 0 \r\n0.234108 -0.937299 -0.224939 0 \r\n0.271011 -0.951463 0.361786 0 \r\n0.0335689 0.420128 -0.966182 0 \r\n0.151476 0.482435 -0.9606 0 \r\n0.167201 0.482678 -0.959723 0 \r\n0.390519 -0.924455 0.499282 0 \r\n0.364012 -0.926134 0.515309 0 \r\n0.403075 -0.910614 0.512009 0 \r\n0.188443 -0.943399 0.452395 0 \r\n0.196468 -0.948003 0.461417 0 \r\n0.202632 0.0835826 -0.910558 0 \r\n0.156318 0.0558148 -0.907705 0 \r\n0.133217 -0.276592 0.229629 0 \r\n0.102392 -0.268576 0.228244 0 \r\n0.131718 -0.25449 0.224679 0 \r\n0.0946549 -0.725206 -0.94188 0 \r\n0.112927 -0.723879 -0.928017 0 \r\n0.120578 -0.714484 -0.941788 0 \r\n0.266198 -0.553473 -0.64758 0 \r\n0.249097 -0.585644 -0.644435 0 \r\n0.27742 -0.567932 -0.640641 0 \r\n-0.167628 0.00321775 0.089981 0 \r\n-0.184223 0.0023928 0.0714585 0 \r\n-0.173852 0.0356012 0.0883155 0 \r\n0.584885 -0.0326988 -0.0958506 0 \r\n0.579934 -0.019215 -0.0797212 0 \r\n0.585761 -0.0153756 -0.0938267 0 \r\n0.351031 0.470859 0.20538 0 \r\n0.373751 0.482165 0.190354 0 \r\n-0.444551 -0.717754 0.527725 0 \r\n-0.464759 -0.710232 0.520835 0 \r\n-0.471854 -0.710729 0.532643 0 \r\n-0.459152 -0.0904682 -0.316891 0 \r\n-0.456603 -0.0790477 -0.295599 0 \r\n-0.451497 -0.0995805 -0.302389 0 \r\n0.526868 -0.556396 -0.497221 0 \r\n-0.069745 -0.384584 0.691939 0 \r\n-0.0684391 -0.394118 0.663191 0 \r\n-0.0912475 -0.356363 0.696173 0 \r\n0.247563 -0.958531 0.413727 0 \r\n-0.303556 -0.168159 -0.808105 0 \r\n-0.310352 -0.180878 -0.819591 0 \r\n-0.288518 -0.00051995 0.965327 0 \r\n-0.278984 0.0001027 0.974313 0 \r\n-0.724126 -0.603485 0.669859 0 \r\n-0.731948 -0.606215 0.690274 0 \r\n0.719749 -0.0572044 -0.890077 0 \r\n0.72227 -0.0768626 -0.901183 0 \r\n0.621078 0.268229 -0.867126 0 \r\n0.620642 0.29455 -0.848064 0 \r\n0.615542 0.302612 -0.864331 0 \r\n0.394634 -0.986917 0.163489 0 \r\n0.396112 -0.984027 0.143773 0 \r\n0.588095 -0.445549 -0.163412 0 \r\n0.593782 -0.446366 -0.186246 0 \r\n-0.0537734 -0.792249 0.136992 0 \r\n-0.0602587 -0.77107 0.132743 0 \r\n-0.0440467 -0.479578 0.243845 0 \r\n-0.0338974 -0.469602 0.256531 0 \r\n0.455197 0.685277 -0.662334 0 \r\n0.450864 0.692131 -0.653988 0 \r\n0.28817 0.793531 -0.403872 0 \r\n0.265243 0.796826 -0.39671 0 \r\n-0.080094 0.382559 -0.967763 0 \r\n-0.0383734 0.751584 -0.49918 0 \r\n-0.0208685 0.759948 -0.491831 0 \r\n-0.0275069 0.76028 -0.472859 0 \r\n-0.108598 -0.310802 -0.683655 0 \r\n-0.109659 -0.334184 -0.688694 0 \r\n-0.102728 -0.319469 -0.702968 0 \r\n-0.627671 -0.662648 0.572286 0 \r\n0.5462 0.244675 0.0602154 0 \r\n-0.0573476 0.678537 -0.752016 0 \r\n-0.0578394 0.658536 -0.756605 0 \r\n0.268521 0.70726 -0.00366835 0 \r\n0.254828 0.696821 0.0137607 0 \r\n0.28957 0.843598 -0.486991 0 \r\n0.299158 0.856663 -0.489545 0 \r\n-0.0860296 -0.488732 0.178831 0 \r\n-0.0725586 -0.46352 0.196492 0 \r\n-0.0690825 -0.49054 0.199885 0 \r\n0.487779 -0.850541 0.504258 0 \r\n0.46576 -0.857343 0.516201 0 \r\n0.481735 -0.838517 0.516268 0 \r\n0.374887 -0.135128 -0.924651 0 \r\n0.344089 -0.132069 -0.926505 0 \r\n0.361615 -0.158353 -0.93311 0 \r\n-0.0257559 0.687503 -0.84569 0 \r\n0.0701989 0.598248 0.119331 0 \r\n0.0768353 0.576867 0.142554 0 \r\n0.539948 0.111568 -0.931113 0 \r\n0.552722 0.102478 -0.937454 0 \r\n0.549671 0.122832 -0.937775 0 \r\n-0.276921 0.514799 -0.721388 0 \r\n-0.286626 0.497325 -0.727921 0 \r\n-0.278385 0.502555 -0.742748 0 \r\n0.313815 -0.895877 -0.0718392 0 \r\n0.334013 -0.888638 -0.075101 0 \r\n0.130091 -0.817039 -0.487514 0 \r\n0.123627 -0.830217 -0.471607 0 \r\n0.150927 -0.823848 -0.482704 0 \r\n0.19724 -0.94376 0.369076 0 \r\n0.18724 -0.940464 0.383173 0 \r\n0.201483 -0.944545 0.391609 0 \r\n0.567773 -0.393256 -0.451856 0 \r\n0.568385 -0.413521 -0.452771 0 \r\n-0.306545 -0.20531 -0.821627 0 \r\n0.26145 -0.938594 -0.172839 0 \r\n0.27826 -0.934403 -0.159025 0 \r\n0.27771 -0.934833 -0.179976 0 \r\n-0.36164 -0.201289 -0.371109 0 \r\n-0.348885 -0.2075 -0.360076 0 \r\n0.0423013 -0.533291 0.589476 0 \r\n0.0235855 -0.515102 0.60173 0 \r\n0.653251 0.133536 -0.931684 0 \r\n0.667399 0.0962524 -0.936106 0 \r\n0.0242859 0.42833 0.22386 0 \r\n0.00290695 0.432066 0.214251 0 \r\n0.0255036 0.448471 0.214868 0 \r\n0.0913711 -0.892202 -0.358389 0 \r\n-0.0791447 0.557095 -0.830773 0 \r\n-0.0919935 0.544451 -0.837934 0 \r\n0.164185 0.167955 -0.920196 0 \r\n0.175228 0.189865 -0.928961 0 \r\n0.140336 0.178685 -0.924926 0 \r\n0.704064 0.278871 -0.71962 0 \r\n0.693112 0.270404 -0.739036 0 \r\n0.699379 0.251399 -0.734511 0 \r\n-0.153052 -0.603244 0.454153 0 \r\n-0.131654 -0.594252 0.459606 0 \r\n0.483048 -0.94389 0.302343 0 \r\n0.459893 -0.95312 0.280719 0 \r\n0.501736 -0.707844 -0.0385873 0 \r\n0.506292 -0.681754 -0.0235417 0 \r\n0.655643 -0.159 -0.817088 0 \r\n0.242175 0.218697 0.276947 0 \r\n0.225666 0.194991 0.278015 0 \r\n-0.14362 -0.24461 -0.59341 0 \r\n-0.124405 -0.250099 -0.630048 0 \r\n-0.202087 0.428289 -0.936009 0 \r\n-0.209525 0.411199 -0.943942 0 \r\n0.566829 0.032566 -0.0173442 0 \r\n0.569807 0.0610394 -0.0178382 0 \r\n0.575177 0.0348489 -0.0452309 0 \r\n0.114165 -0.0625115 -0.910102 0 \r\n0.148964 0.00476025 -0.9074 0 \r\n0.528108 0.11768 -0.925599 0 \r\n0.531159 0.0973264 -0.925277 0 \r\n0.758708 0.140359 -0.271894 0 \r\n0.763134 0.144821 -0.299753 0 \r\n0.760872 0.110744 -0.286154 0 \r\n-0.0240355 -0.584911 -0.842279 0 \r\n-0.0333038 -0.601587 -0.863734 0 \r\n0.244095 -0.0276175 0.229686 0 \r\n0.262841 -0.0108764 0.231699 0 \r\n0.710561 -0.79257 0.232982 0 \r\n0.700916 -0.805896 0.256469 0 \r\n0.626188 -0.230183 -0.876242 0 \r\n0.625125 -0.238728 -0.890481 0 \r\n-0.330247 0.459305 -0.592145 0 \r\n-0.337688 0.441914 -0.608016 0 \r\n-0.328341 0.461588 -0.609904 0 \r\n-0.0203959 -0.861498 0.208021 0 \r\n-0.0183755 -0.860287 0.239337 0 \r\n-0.00782406 -0.874894 0.220338 0 \r\n0.017412 0.930575 -0.621346 0 \r\n-0.198125 0.654977 -0.306836 0 \r\n-0.206809 0.647371 -0.325839 0 \r\n0.173065 -0.507047 -0.677851 0 \r\n0.321613 -0.456991 0.440483 0 \r\n0.135394 -0.921712 -0.292827 0 \r\n-0.423269 0.224554 -0.431058 0 \r\n-0.425555 0.222023 -0.413936 0 \r\n0.736632 0.191987 -0.653998 0 \r\n0.733757 0.205435 -0.666584 0 \r\n0.733172 0.182363 -0.668772 0 \r\n0.0028618 -0.481756 0.637514 0 \r\n0.00739746 -0.49507 0.612065 0 \r\n-0.134545 -0.278283 -0.603814 0 \r\n-0.127653 -0.293157 -0.624579 0 \r\n-0.125559 -0.276883 -0.62668 0 \r\n0.476604 -0.415928 -0.619197 0 \r\n0.462497 -0.418503 -0.636167 0 \r\n-0.149442 0.184402 -0.914051 0 \r\n-0.437996 -0.115334 -0.49656 0 \r\n-0.450707 -0.110768 -0.464162 0 \r\n0.361247 -0.257669 0.160998 0 \r\n0.362243 -0.2766 0.161803 0 \r\n0.344608 -0.265147 0.172848 0 \r\n0.113226 0.105721 0.264142 0 \r\n0.136605 -0.798374 -0.510247 0 \r\n-0.282327 0.0811649 0.86966 0 \r\n-0.291143 0.0739428 0.895653 0 \r\n-0.300695 0.0906128 0.871138 0 \r\n-0.166423 0.677743 -0.42665 0 \r\n-0.181061 0.665608 -0.420112 0 \r\n-0.175168 0.668181 -0.439642 0 \r\n0.441853 -0.648822 0.575151 0 \r\n0.448136 -0.625818 0.570984 0 \r\n-0.275975 0.277626 -0.131144 0 \r\n-0.271834 0.248555 -0.122915 0 \r\n-0.2805 0.246486 -0.132309 0 \r\n0.371644 0.660419 0.0208028 0 \r\n0.363577 0.649763 0.0427774 0 \r\n0.35197 0.674101 0.0164706 0 \r\n-0.0207803 0.210561 0.243161 0 \r\n-0.0170987 0.240721 0.245999 0 \r\n-0.00203076 0.221343 0.252977 0 \r\n-0.157203 -0.724092 -0.37666 0 \r\n-0.163715 -0.721794 -0.349229 0 \r\n0.59705 0.10914 -0.100593 0 \r\n0.590446 0.129894 -0.0881487 0 \r\n0.484226 -0.812083 -0.253863 0 \r\n0.0833098 -0.822207 -0.473117 0 \r\n0.0652814 -0.806442 -0.486592 0 \r\n-0.0973485 -0.542109 -0.975196 0 \r\n-0.0699142 -0.56424 -0.979009 0 \r\n0.00701558 0.351383 -0.965081 0 \r\n0.032375 0.333494 -0.965249 0 \r\n0.275411 0.754146 -0.890244 0 \r\n0.28805 0.772871 -0.878003 0 \r\n0.0118838 0.140706 -0.903798 0 \r\n-0.00027915 0.15558 -0.902321 0 \r\n0.374514 -0.474977 0.449537 0 \r\n0.387334 -0.481362 0.435216 0 \r\n0.39384 -0.485866 0.453718 0 \r\n0.519734 -0.693833 0.529955 0 \r\n0.532186 -0.679584 0.517228 0 \r\n0.546236 -0.704374 0.507671 0 \r\n-0.0736768 -0.60673 -0.965425 0 \r\n-0.0946095 -0.561739 -0.963693 0 \r\n0.47388 -0.0577802 0.0997192 0 \r\n0.489036 -0.0391755 0.0908265 0 \r\n0.273522 0.410311 0.249381 0 \r\n0.303802 0.419464 0.241516 0 \r\n0.288138 0.393797 0.251788 0 \r\n-0.262751 0.573448 -0.470847 0 \r\n-0.278022 0.552061 -0.47921 0 \r\n0.632617 0.273947 -0.835701 0 \r\n0.633245 0.254122 -0.838975 0 \r\n0.551005 -0.337679 -0.835889 0 \r\n0.562335 -0.332956 -0.856649 0 \r\n-0.434695 0.110365 -0.56045 0 \r\n-0.434192 0.0909864 -0.586444 0 \r\n-0.430351 0.116923 -0.573946 0 \r\n-0.0920095 -0.171043 0.908417 0 \r\n-0.381173 -0.674558 0.778709 0 \r\n-0.355916 -0.658776 0.76263 0 \r\n-0.341538 -0.672691 0.763487 0 \r\n0.311719 -0.146475 0.176444 0 \r\n0.2941 -0.159535 0.18198 0 \r\n0.531813 -0.417206 -0.793175 0 \r\n0.525639 -0.420054 -0.783355 0 \r\n0.526905 -0.402157 -0.787598 0 \r\n0.188513 0.821118 -0.870816 0 \r\n0.169783 0.819748 -0.870528 0 \r\n0.590145 -0.414149 -0.348878 0 \r\n0.58643 -0.394291 -0.358456 0 \r\n0.605819 0.465594 -0.728326 0 \r\n-0.202237 -0.215887 -0.527477 0 \r\n-0.184188 -0.218347 -0.541211 0 \r\n-0.200202 -0.210819 -0.543396 0 \r\n-0.151372 -0.278414 -0.934818 0 \r\n-0.0853515 -0.656289 0.21174 0 \r\n-0.0847284 -0.668902 0.206308 0 \r\n-0.339231 0.0501129 0.896125 0 \r\n-0.338238 0.0446444 0.911878 0 \r\n-0.0804673 -0.645259 0.253237 0 \r\n-0.0774124 -0.626104 0.256308 0 \r\n-0.313239 0.495109 -0.414348 0 \r\n-0.320677 0.480416 -0.399518 0 \r\n0.605461 -0.519411 -0.261405 0 \r\n0.60627 -0.544505 -0.276006 0 \r\n0.506328 -0.555686 0.0587419 0 \r\n0.517441 -0.569921 0.0572269 0 \r\n0.517825 -0.559025 0.0708618 0 \r\n0.216541 -0.526096 -0.841087 0 \r\n0.212199 -0.544808 -0.847483 0 \r\n-0.285797 0.134428 -0.952852 0 \r\n-0.27358 0.19083 -0.95541 0 \r\n0.398291 -0.48349 -0.777927 0 \r\n-0.632626 -0.744965 0.853395 0 \r\n-0.617653 -0.756521 0.850583 0 \r\n0.384263 -0.0770424 0.15857 0 \r\n0.375847 -0.055597 0.172926 0 \r\n0.0230101 -0.844607 -0.0178335 0 \r\n0.0152546 -0.843258 -0.0345128 0 \r\n-0.624674 -0.673693 0.653235 0 \r\n-0.608649 -0.678341 0.650677 0 \r\n0.520927 -0.399373 -0.559983 0 \r\n0.499889 -0.405798 -0.58466 0 \r\n0.445526 -0.278336 -0.962849 0 \r\n-0.0158577 -0.093323 0.651616 0 \r\n-0.0105142 -0.0841075 0.639979 0 \r\n-0.00208319 -0.113623 0.643657 0 \r\n-0.148702 -0.197634 0.0902921 0 \r\n0.0773516 0.507115 0.194245 0 \r\n0.0894528 0.475846 0.216715 0 \r\n0.580661 -0.567661 0.166192 0 \r\n0.559648 -0.548039 0.163847 0 \r\n-0.354535 -0.176697 -0.880963 0 \r\n-0.349254 -0.14897 -0.87358 0 \r\n-0.196041 0.0417415 -0.930032 0 \r\n-0.20176 0.0728377 -0.938555 0 \r\n0.328083 -0.914982 -0.151886 0 \r\n0.315392 -0.922925 -0.171232 0 \r\n0.307211 -0.9227 -0.146816 0 \r\n-0.398974 -0.796762 0.74692 0 \r\n-0.400976 -0.795114 0.739646 0 \r\n-0.124301 -0.79096 -0.263824 0 \r\n-0.13213 -0.781711 -0.291779 0 \r\n-0.140744 -0.773409 -0.260181 0 \r\n-0.439039 -0.132984 -0.333021 0 \r\n-0.444281 -0.119443 -0.309675 0 \r\n-0.429275 -0.141426 -0.319013 0 \r\n0.065382 -0.424985 0.706975 0 \r\n-0.266182 0.245836 -0.109847 0 \r\n-0.261658 0.276977 -0.108682 0 \r\n-0.360132 -0.183035 -0.466832 0 \r\n-0.342346 -0.19532 -0.446371 0 \r\n-0.334371 -0.190303 -0.475287 0 \r\n0.745732 0.273439 -0.53769 0 \r\n-0.0417987 -0.576123 0.36134 0 \r\n0.48242 -0.491696 0.0567548 0 \r\n0.469797 -0.466323 0.0702393 0 \r\n0.642558 -0.0302977 -0.775182 0 \r\n0.65363 -0.0178224 -0.785888 0 \r\n0.645551 -0.0431331 -0.781358 0 \r\n0.242417 -0.395681 0.316757 0 \r\n0.255291 -0.406974 0.335918 0 \r\n0.229701 -0.404505 0.337453 0 \r\n0.623246 -0.455008 -0.895823 0 \r\n0.621011 -0.437667 -0.906565 0 \r\n0.386037 0.845923 -0.557666 0 \r\n0.395744 0.853866 -0.570398 0 \r\n-0.46484 0.0649514 -0.429388 0 \r\n0.403199 0.620506 -0.861585 0 \r\n0.394992 0.630898 -0.867737 0 \r\n0.394966 0.616734 -0.873335 0 \r\n0.208768 -0.737735 -0.575507 0 \r\n0.199567 -0.745522 -0.570374 0 \r\n0.708495 -0.761966 0.145636 0 \r\n0.714441 -0.749035 0.16504 0 \r\n0.710976 -0.734692 0.139275 0 \r\n0.209829 0.246429 0.281653 0 \r\n0.526407 -0.271484 -0.702796 0 \r\n0.034107 -0.56332 0.526645 0 \r\n0.371431 -0.93899 0.38435 0 \r\n0.375302 -0.938217 0.369044 0 \r\n0.355348 -0.94201 0.370808 0 \r\n-0.236654 0.222853 0.00044235 0 \r\n-0.241609 0.206634 -0.0128429 0 \r\n-0.001003 -0.515185 0.382514 0 \r\n0.0003917 -0.502486 0.360178 0 \r\n0.423527 -0.944805 0.0614969 0 \r\n0.407531 -0.93475 0.0524174 0 \r\n-0.454978 -0.638465 0.78302 0 \r\n-0.419706 -0.630619 0.76537 0 \r\n-0.0375822 0.481205 -0.938349 0 \r\n0.374435 -0.0219025 0.188009 0 \r\n0.369492 -0.0448302 0.180605 0 \r\n-0.165955 -0.730714 -0.216314 0 \r\n-0.0455239 -0.756729 0.602659 0 \r\n-0.0609072 -0.761952 0.596065 0 \r\n-0.639117 -0.668146 0.653022 0 \r\n0.29494 -0.461886 0.496693 0 \r\n0.279831 -0.462421 0.509731 0 \r\n0.362736 0.772047 -0.492773 0 \r\n0.347098 0.777339 -0.465303 0 \r\n0.762563 0.216596 -0.443581 0 \r\n-0.0886715 -0.156664 0.586772 0 \r\n-0.0931261 -0.123424 0.599136 0 \r\n-0.08086 -0.666181 0.263587 0 \r\n-0.0817005 -0.658341 0.252816 0 \r\n0.497715 0.621782 -0.0885867 0 \r\n0.516351 0.604443 -0.0977996 0 \r\n0.506701 0.597533 -0.0711523 0 \r\n0.538843 -0.365404 -0.0539213 0 \r\n0.523439 -0.362849 -0.0263418 0 \r\n-0.00883008 -0.081406 0.63094 0 \r\n-0.43999 -0.648427 0.497845 0 \r\n-0.421705 -0.653746 0.490488 0 \r\n-0.385437 0.109748 -0.175606 0 \r\n-0.399435 0.0886621 -0.182263 0 \r\n-0.446115 -0.708949 0.508641 0 \r\n-0.473418 -0.701924 0.51356 0 \r\n-0.253371 -0.789342 0.674232 0 \r\n-0.242636 -0.786482 0.664328 0 \r\n0.547948 -0.427071 -0.060372 0 \r\n0.554719 -0.448848 -0.0703833 0 \r\n0.543429 -0.444162 -0.0519041 0 \r\n-0.0948583 -0.0472511 0.62017 0 \r\n-0.357981 0.272281 -0.727656 0 \r\n-0.354784 0.247051 -0.745577 0 \r\n-0.349259 0.266741 -0.752986 0 \r\n0.537104 -0.188962 -0.949758 0 \r\n0.545717 -0.18057 -0.950826 0 \r\n0.539169 -0.180686 -0.948278 0 \r\n0.26047 -0.536484 -0.653038 0 \r\n0.232148 -0.554196 -0.656832 0 \r\n-0.0291755 -0.225402 0.53863 0 \r\n-0.0438958 -0.188704 0.556986 0 \r\n0.447263 -0.797873 -0.0555945 0 \r\n0.586191 -0.48828 -0.397138 0 \r\n0.58848 -0.467222 -0.390974 0 \r\n0.123461 0.799492 -0.266171 0 \r\n0.121998 0.797261 -0.237842 0 \r\n-0.010454 -0.0470316 0.190307 0 \r\n0.0119839 -0.0202486 0.204653 0 \r\n0.0174343 -0.0487827 0.199901 0 \r\n0.253026 -0.177993 -0.950126 0 \r\n0.276765 -0.180734 -0.951126 0 \r\n0.588921 0.0025952 -0.0985558 0 \r\n0.593845 0.0155935 -0.104216 0 \r\n-0.444277 0.034247 -0.578574 0 \r\n-0.435694 0.0374637 -0.61167 0 \r\n0.574637 -0.518242 -0.429848 0 \r\n0.568094 -0.504075 -0.445083 0 \r\n0.563249 -0.524235 -0.452169 0 \r\n0.0823816 0.916992 -0.501615 0 \r\n0.069939 0.903477 -0.509416 0 \r\n-0.320558 0.00566882 -0.889027 0 \r\n-0.318488 0.00986612 -0.899062 0 \r\n0.391085 -0.57059 -0.970728 0 \r\n0.215344 0.838861 -0.462719 0 \r\n0.244192 0.840371 -0.470241 0 \r\n0.230359 0.829351 -0.467192 0 \r\n-0.0785853 -0.59165 0.42649 0 \r\n-0.0923229 -0.602768 0.430775 0 \r\n0.567394 -0.480407 -0.095487 0 \r\n0.559803 -0.462929 -0.0797046 0 \r\n-0.607731 -0.669538 0.877105 0 \r\n-0.624141 -0.654716 0.876727 0 \r\n-0.364572 -0.189629 -0.911968 0 \r\n-0.359837 -0.197737 -0.894519 0 \r\n0.758552 0.172588 -0.519157 0 \r\n-0.00159597 0.384235 0.230839 0 \r\n-0.0173856 0.402498 0.216275 0 \r\n-0.215721 -0.150345 0.00974709 0 \r\n-0.208638 -0.120785 0.0228326 0 \r\n-0.204605 -0.137057 0.0275804 0 \r\n-0.677594 -0.693052 0.831205 0 \r\n0.191245 0.902776 -0.81498 0 \r\n0.189922 0.914294 -0.807396 0 \r\n-0.154128 0.667714 -0.1943 0 \r\n-0.16171 0.666469 -0.211281 0 \r\n-0.147549 0.679808 -0.208564 0 \r\n0.526619 -0.588273 -0.0437684 0 \r\n0.517727 -0.608861 -0.0330986 0 \r\n-0.212582 0.560477 -0.745642 0 \r\n-0.212806 0.545057 -0.767591 0 \r\n-0.0316109 -0.307355 0.2134 0 \r\n-0.0114284 -0.279124 0.212269 0 \r\n-0.18565 -0.38208 -0.475345 0 \r\n-0.197778 -0.377869 -0.453327 0 \r\n-0.187573 -0.400074 -0.471086 0 \r\n0.152193 -0.335068 -0.966323 0 \r\n0.176512 -0.323492 -0.965139 0 \r\n0.276091 -0.518257 -0.867367 0 \r\n0.255522 -0.539347 -0.87273 0 \r\n0.252741 -0.511217 -0.850848 0 \r\n-0.0218268 -0.716529 0.629633 0 \r\n-0.0141019 -0.726151 0.622686 0 \r\n-0.0528913 -0.722101 0.642329 0 \r\n0.579623 -0.440709 -0.422328 0 \r\n0.571789 -0.446702 -0.443017 0 \r\n-0.503757 -0.60469 0.760778 0 \r\n-0.540634 -0.608947 0.786341 0 \r\n0.172679 0.930061 -0.469851 0 \r\n0.199539 0.932173 -0.468897 0 \r\n0.642874 -0.134993 -0.251136 0 \r\n0.650127 -0.134072 -0.261991 0 \r\n0.506135 0.360074 0.0875369 0 \r\n0.259084 -0.479681 -0.834709 0 \r\n0.258274 -0.458225 -0.81758 0 \r\n0.272501 -0.468672 -0.828356 0 \r\n-0.183977 -0.115513 0.0555148 0 \r\n-0.168792 -0.10067 0.0748257 0 \r\n0.600698 -0.160534 -0.237431 0 \r\n0.595343 -0.164258 -0.267049 0 \r\n-0.0864432 -0.589406 -0.924286 0 \r\n-0.0910145 -0.580283 -0.930931 0 \r\n0.422853 -0.948025 0.304352 0 \r\n0.399884 -0.944945 0.319481 0 \r\n0.428062 -0.94172 0.323855 0 \r\n0.344888 -0.330292 0.171411 0 \r\n0.655107 -0.220441 -0.926432 0 \r\n0.658132 -0.21412 -0.909719 0 \r\n0.185746 0.864798 -0.842075 0 \r\n0.148935 0.862121 -0.840884 0 \r\n0.156392 0.84019 -0.855102 0 \r\n-0.0556489 -0.755665 0.318334 0 \r\n-0.111132 -0.381226 -0.679407 0 \r\n-0.107076 -0.395938 -0.682706 0 \r\n-0.101898 -0.389773 -0.703938 0 \r\n-0.277703 0.0046425 0.977977 0 \r\n-0.265954 0.00454915 0.97683 0 \r\n0.191087 -0.944216 0.475291 0 \r\n0.566496 -0.257915 -0.423776 0 \r\n0.34055 0.0586944 -0.903167 0 \r\n0.379686 0.0519288 -0.900409 0 \r\n0.353091 0.0921901 -0.901389 0 \r\n0.359565 -0.943913 0.485637 0 \r\n0.335362 -0.953547 0.467649 0 \r\n0.327253 -0.94961 0.484594 0 \r\n-0.0934612 0.448721 -0.948898 0 \r\n-0.0598374 0.453229 -0.956234 0 \r\n-0.0680462 0.467435 -0.941566 0 \r\n0.438085 0.706154 -0.727153 0 \r\n0.436939 0.722898 -0.717411 0 \r\n-0.447714 0.149651 -0.360039 0 \r\n-0.440521 0.173968 -0.357782 0 \r\n-0.440786 0.173165 -0.332124 0 \r\n0.207474 0.0555762 0.255975 0 \r\n0.191043 0.0396843 0.251617 0 \r\n-0.186001 -0.669371 -0.174333 0 \r\n-0.18307 -0.65991 -0.146697 0 \r\n0.57567 0.0152941 -0.0542269 0 \r\n-0.414178 0.0478768 -0.188509 0 \r\n-0.41583 0.0691644 -0.192531 0 \r\n-0.409357 0.0783114 -0.185964 0 \r\n-0.0428597 -0.851867 -0.304747 0 \r\n-0.060155 -0.844901 -0.284882 0 \r\n-0.031944 -0.862149 -0.282565 0 \r\n0.162012 -0.491284 0.603464 0 \r\n0.14289 -0.472693 0.62321 0 \r\n0.322915 -0.23639 0.180942 0 \r\n0.325977 -0.254703 0.182416 0 \r\n-0.216504 -0.679402 0.445655 0 \r\n-0.242215 -0.68581 0.452276 0 \r\n-0.221865 -0.690987 0.448893 0 \r\n0.55599 -0.251835 -0.488889 0 \r\n0.561401 -0.258948 -0.46751 0 \r\n0.558174 -0.24608 -0.463296 0 \r\n-0.675773 -0.578321 0.697901 0 \r\n0.42758 -0.934422 0.428679 0 \r\n0.439259 -0.931578 0.413 0 \r\n0.421307 -0.935306 0.412896 0 \r\n-0.181911 -0.262507 -0.484189 0 \r\n-0.176877 -0.27403 -0.498268 0 \r\n0.59609 -0.58324 -0.930835 0 \r\n0.608351 -0.572739 -0.919659 0 \r\n0.413639 0.503281 -0.947842 0 \r\n0.407874 0.49141 -0.954942 0 \r\n0.457962 -0.479408 0.278504 0 \r\n0.459098 -0.490445 0.293223 0 \r\n0.440503 -0.472187 0.296933 0 \r\n0.280864 -0.991943 0.206811 0 \r\n0.372708 -0.616501 -0.903171 0 \r\n-0.474672 -0.0669029 -0.414055 0 \r\n-0.473077 -0.0807624 -0.399844 0 \r\n-0.250779 -0.358288 -0.130605 0 \r\n-0.254117 -0.344418 -0.149253 0 \r\n-0.252246 -0.336253 -0.134751 0 \r\n0.604246 -0.506836 -0.24714 0 \r\n0.0230179 -0.604405 -0.617225 0 \r\n0.0435684 -0.606608 -0.62542 0 \r\n-0.234044 0.142766 0.0137276 0 \r\n0.569532 0.25501 -0.029309 0 \r\n0.575737 0.223507 -0.0413495 0 \r\n0.195504 -0.978594 0.0966895 0 \r\n0.188821 -0.968872 0.0770099 0 \r\n0.165437 -0.971353 0.0931354 0 \r\n0.526645 -0.233886 -0.611756 0 \r\n0.516901 -0.217991 -0.620905 0 \r\n0.649199 0.0909086 -0.826582 0 \r\n0.650148 0.0790637 -0.806601 0 \r\n-0.0485912 0.143606 -0.896284 0 \r\n-0.0673589 0.112295 -0.895891 0 \r\n-0.311855 -0.574957 0.589952 0 \r\n-0.285096 -0.574625 0.602098 0 \r\n-0.332769 -0.576265 0.614343 0 \r\n0.165289 -0.236887 0.221022 0 \r\n0.52195 -0.536368 -0.799916 0 \r\n0.383458 0.768052 -0.565297 0 \r\n0.532778 -0.161377 -0.0286392 0 \r\n0.542858 -0.148203 -0.0422585 0 \r\n0.542454 -0.168249 -0.0483708 0 \r\n0.698731 -0.0531108 -0.215426 0 \r\n0.706607 -0.0257725 -0.205532 0 \r\n0.246089 -0.940289 -0.179211 0 \r\n0.246639 -0.939859 -0.15826 0 \r\n-0.104942 -0.612954 0.424533 0 \r\n-0.115362 -0.604877 0.441229 0 \r\n0.553998 -0.722137 -0.293156 0 \r\n-0.373694 -0.130053 -0.231847 0 \r\n-0.380935 -0.141928 -0.247377 0 \r\n0.396818 0.516179 -0.942185 0 \r\n-0.0190578 -0.51448 0.339669 0 \r\n-0.0258399 -0.534388 0.347939 0 \r\n-0.0322724 -0.524764 0.321229 0 \r\n-0.333573 -0.315101 -0.941535 0 \r\n-0.332798 -0.309596 -0.917462 0 \r\n-0.316787 -0.323807 -0.926855 0 \r\n0.069253 -0.935039 0.237775 0 \r\n0.0819183 -0.932013 0.266654 0 \r\n0.713642 0.390778 -0.391386 0 \r\n0.718934 0.373661 -0.382132 0 \r\n0.535518 0.628408 -0.604829 0 \r\n0.551669 0.609102 -0.59838 0 \r\n0.540908 0.626302 -0.585926 0 \r\n0.762153 0.0667984 -0.400911 0 \r\n0.631936 -0.148485 -0.302806 0 \r\n0.623085 -0.150625 -0.327787 0 \r\n0.611588 -0.154774 -0.309566 0 \r\n-0.119951 -0.781368 -0.169641 0 \r\n0.338735 -0.991511 0.184958 0 \r\n0.485756 -0.648777 -0.923015 0 \r\n0.580054 -0.343937 -0.367226 0 \r\n0.578014 -0.341718 -0.381375 0 \r\n0.730484 0.0880239 -0.192894 0 \r\n0.734728 0.0700411 -0.201912 0 \r\n0.725659 0.0598565 -0.188875 0 \r\n0.395567 -0.78591 -0.462169 0 \r\n-0.289185 -0.212407 -0.812708 0 \r\n-0.268979 -0.204626 -0.799733 0 \r\n-0.473055 -0.0139732 -0.439727 0 \r\n-0.472164 0.00771963 -0.440925 0 \r\n-0.475134 -0.0053559 -0.417906 0 \r\n-0.0083143 0.558645 -0.910842 0 \r\n-0.0191849 0.544212 -0.905836 0 \r\n-0.0083377 0.542183 -0.918325 0 \r\n-0.0367992 0.71207 -0.822361 0 \r\n-0.0388678 0.751257 -0.803165 0 \r\n-0.131272 -0.0163732 0.122117 0 \r\n-0.152472 -0.0084144 0.102209 0 \r\n0.598887 -0.472911 -0.202793 0 \r\n0.599105 -0.490775 -0.200922 0 \r\n0.408866 -0.439894 0.286608 0 \r\n0.421602 -0.455003 0.296092 0 \r\n0.0436279 -0.350388 0.76333 0 \r\n0.0279001 -0.350442 0.772986 0 \r\n0.322688 0.333872 -0.959233 0 \r\n0.305826 0.338579 -0.962788 0 \r\n0.691218 -0.816438 0.149314 0 \r\n0.690026 -0.825311 0.161164 0 \r\n0.698202 -0.81306 0.169284 0 \r\n0.459955 -0.418442 -0.64831 0 \r\n0.462554 -0.418338 -0.663829 0 \r\n0.448638 -0.424619 -0.670257 0 \r\n-0.0579608 0.0221998 -0.90153 0 \r\n-0.46376 0.00541083 -0.494426 0 \r\n-0.466973 -0.0212535 -0.47719 0 \r\n-0.238897 -0.220057 -0.474457 0 \r\n-0.231728 -0.229217 -0.449212 0 \r\n0.458014 0.346942 -0.941496 0 \r\n0.450507 0.358351 -0.947495 0 \r\n0.637966 0.485729 -0.210545 0 \r\n0.631527 0.482004 -0.183522 0 \r\n0.631496 0.49636 -0.204848 0 \r\n-0.426661 -0.119118 -0.51749 0 \r\n0.12756 -0.313785 -0.966964 0 \r\n0.1303 -0.333308 -0.967765 0 \r\n0.281695 -0.505626 -0.97325 0 \r\n0.285824 -0.4782 -0.971535 0 \r\n0.260879 -0.478478 -0.972143 0 \r\n-0.225578 -0.36694 -0.904926 0 \r\n-0.208921 -0.365323 -0.888628 0 \r\n-0.205296 -0.372371 -0.905257 0 \r\n-0.232998 -0.329456 -0.849245 0 \r\n-0.245097 -0.338266 -0.865496 0 \r\n-0.25747 -0.326966 -0.85982 0 \r\n-0.452249 0.133142 -0.379995 0 \r\n-0.451553 0.125992 -0.41339 0 \r\n-0.180404 -0.404252 -0.953907 0 \r\n-0.294784 -0.340926 -0.934936 0 \r\n-0.262018 -0.359358 -0.938483 0 \r\n0.111229 -0.863881 0.542951 0 \r\n0.111347 -0.871725 0.533779 0 \r\n0.0864647 -0.848592 0.536409 0 \r\n-0.216188 -0.282252 -0.002502 0 \r\n-0.224185 -0.262661 -0.0173037 0 \r\n-0.214541 -0.249254 0.00354185 0 \r\n0.20283 0.412496 0.254207 0 \r\n0.165304 0.403977 0.25787 0 \r\n0.186788 0.433582 0.246881 0 \r\n-0.241939 0.0907166 0.778641 0 \r\n-0.243728 0.100932 0.764109 0 \r\n-0.25413 0.254797 -0.0814267 0 \r\n-0.248089 0.280681 -0.0722843 0 \r\n-0.278764 0.0359799 0.958344 0 \r\n-0.272156 0.0389009 0.954318 0 \r\n-0.216278 -0.420048 -0.420681 0 \r\n-0.213516 -0.394504 -0.422135 0 \r\n-0.220628 -0.397943 -0.409203 0 \r\n0.56854 -0.268385 -0.422893 0 \r\n0.568836 -0.284057 -0.43439 0 \r\n0.569703 -0.278309 -0.417132 0 \r\n-0.0641193 0.670843 -0.709599 0 \r\n-0.0727822 0.679139 -0.684465 0 \r\n-0.0791472 0.65767 -0.710346 0 \r\n0.211755 0.742535 -0.0595237 0 \r\n0.499183 0.428746 -0.958983 0 \r\n0.528985 0.41082 -0.958125 0 \r\n0.266342 0.46452 -0.958208 0 \r\n0.246964 0.457893 -0.956604 0 \r\n0.273211 0.450739 -0.957565 0 \r\n-0.302279 0.0969165 0.782434 0 \r\n0.516258 -0.762968 -0.0157789 0 \r\n0.54263 -0.755404 -0.0112609 0 \r\n-0.121487 0.671757 -0.633973 0 \r\n-0.139841 0.66456 -0.623631 0 \r\n-0.141959 0.653582 -0.648899 0 \r\n-0.526558 -0.622671 0.795903 0 \r\n-0.562726 -0.616359 0.803063 0 \r\n0.501975 0.606046 -0.725002 0 \r\n0.500875 0.628465 -0.689451 0 \r\n0.48902 0.622296 -0.721372 0 \r\n0.11411 0.23518 0.279396 0 \r\n0.142895 0.231253 0.280952 0 \r\n0.126188 0.224052 0.279017 0 \r\n-0.275153 0.325592 -0.908158 0 \r\n-0.27006 0.319278 -0.922454 0 \r\n0.225732 -0.880485 -0.393591 0 \r\n0.259342 -0.88032 -0.385875 0 \r\n-0.358706 0.407484 -0.454881 0 \r\n-0.367916 0.383784 -0.47943 0 \r\n-0.352966 0.416512 -0.486189 0 \r\n0.0578128 0.664103 0.0433429 0 \r\n0.503671 0.584551 -0.755798 0 \r\n0.521695 0.573837 -0.738266 0 \r\n0.508143 0.589163 -0.73939 0 \r\n0.705678 -0.790247 0.164418 0 \r\n0.70436 -0.782552 0.151182 0 \r\n0.698077 -0.796492 0.144199 0 \r\n0.135196 -0.902936 0.500822 0 \r\n0.147519 -0.907348 0.516636 0 \r\n0.555336 -0.390804 -0.493887 0 \r\n0.564307 -0.373209 -0.465328 0 \r\n0.558061 -0.362422 -0.487894 0 \r\n0.0114749 0.769022 -0.531547 0 \r\n0.00964964 0.769732 -0.547881 0 \r\n-0.257017 -0.319317 -0.264175 0 \r\n-0.261214 -0.302406 -0.2455 0 \r\n-0.244861 -0.51766 -0.251126 0 \r\n0.571913 -0.922002 0.31601 0 \r\n0.544767 -0.927657 0.327788 0 \r\n0.559913 -0.9197 0.332312 0 \r\n0.434589 -0.519558 0.517815 0 \r\n0.76633 0.136499 -0.324425 0 \r\n0.766418 0.116046 -0.334966 0 \r\n0.341951 -0.871561 -0.0480093 0 \r\n0.343435 -0.877662 -0.0623171 0 \r\n-0.337578 -0.0928663 -0.845323 0 \r\n-0.340051 -0.108209 -0.865375 0 \r\n0.00660466 -0.581194 -0.814911 0 \r\n0.0209219 -0.598573 -0.816992 0 \r\n0.700464 -0.0962251 -0.261463 0 \r\n0.696729 -0.084993 -0.241432 0 \r\n0.71027 -0.0771872 -0.252572 0 \r\n-0.244082 -0.642612 0.70919 0 \r\n-0.262383 -0.655993 0.725139 0 \r\n-0.297982 -0.643529 0.731459 0 \r\n-0.524144 -0.633186 0.804956 0 \r\n-0.13001 -0.771742 0.59553 0 \r\n-0.136689 -0.768933 0.578606 0 \r\n-0.276919 0.0876762 -0.108043 0 \r\n-0.272024 0.0863689 -0.0947104 0 \r\n-0.406441 -0.105094 -0.583308 0 \r\n-0.421228 -0.0959371 -0.568331 0 \r\n-0.41969 -0.11052 -0.546987 0 \r\n-0.173945 0.484775 -0.877214 0 \r\n-0.17241 0.50008 -0.856835 0 \r\n-0.193636 0.490538 -0.860812 0 \r\n0.494514 -0.799446 -0.277348 0 \r\n0.510951 -0.784452 -0.264775 0 \r\n0.506836 -0.78536 -0.290527 0 \r\n0.156199 -0.430474 0.436005 0 \r\n0.148645 -0.428365 0.416346 0 \r\n0.520347 -0.132011 0.000752551 0 \r\n0.521333 -0.116512 0.0055751 0 \r\n0.534168 -0.125833 -0.0177043 0 \r\n0.597258 0.375171 -0.899675 0 \r\n0.600708 0.360436 -0.887617 0 \r\n0.0577376 -0.107834 0.201732 0 \r\n0.0439138 -0.127283 0.195574 0 \r\n0.516222 -0.431329 -0.773241 0 \r\n0.511314 -0.416281 -0.767664 0 \r\n0.268272 0.261941 0.27525 0 \r\n0.256324 0.237432 0.27731 0 \r\n-0.680229 -0.653976 0.711785 0 \r\n-0.699304 -0.645046 0.721715 0 \r\n-0.691235 -0.651133 0.739314 0 \r\n-0.158643 -0.747558 -0.228309 0 \r\n-0.144574 -0.764387 -0.219018 0 \r\n-0.146984 -0.765831 -0.241518 0 \r\n0.461848 -0.561583 0.528674 0 \r\n0.447736 -0.558112 0.546672 0 \r\n0.44221 -0.532277 0.528041 0 \r\n0.0830535 -0.339945 0.248178 0 \r\n0.110046 -0.33228 0.247898 0 \r\n-0.20392 0.149215 0.0635723 0 \r\n-0.188741 0.165408 0.0881805 0 \r\n0.568094 -0.630412 -0.386741 0 \r\n0.12105 -0.418916 0.430973 0 \r\n0.129933 -0.412072 0.444638 0 \r\n-0.0671 -0.815537 -0.370365 0 \r\n0.0683189 0.0589642 0.243856 0 \r\n-0.340824 0.316559 -0.752727 0 \r\n-0.345405 0.317145 -0.739971 0 \r\n-0.347876 0.291385 -0.747823 0 \r\n-0.327258 0.461417 -0.628986 0 \r\n-0.32797 -0.74042 0.542334 0 \r\n-0.357724 -0.735379 0.545572 0 \r\n-0.123983 -0.304471 -0.638409 0 \r\n-0.122413 -0.321351 -0.649377 0 \r\n-0.117097 -0.308636 -0.658413 0 \r\n-0.176224 -0.174984 -0.922628 0 \r\n-0.2037 -0.200402 -0.932111 0 \r\n-0.0700449 0.297228 -0.925317 0 \r\n-0.0466617 0.299946 -0.932602 0 \r\n0.489331 0.14825 -0.912177 0 \r\n0.496428 0.189362 -0.918698 0 \r\n0.47883 0.176272 -0.911273 0 \r\n-0.28444 0.390643 -0.853268 0 \r\n0.701195 0.424004 -0.442327 0 \r\n0.691265 0.447284 -0.439117 0 \r\n-0.408555 -0.728177 0.589356 0 \r\n-0.0500377 0.693957 -0.798771 0 \r\n-0.0572131 0.720272 -0.77414 0 \r\n0.739111 0.0496304 -0.517314 0 \r\n0.425027 -0.893713 0.513409 0 \r\n0.39852 -0.895393 0.529436 0 \r\n0.542542 -0.114783 -0.72723 0 \r\n0.554963 -0.111559 -0.73783 0 \r\n0.537956 -0.124803 -0.732108 0 \r\n0.53861 -0.587652 -0.47078 0 \r\n0.532544 -0.579199 -0.484604 0 \r\n0.531289 -0.604561 -0.476123 0 \r\n0.258049 0.796239 -0.366227 0 \r\n0.234676 0.800587 -0.385979 0 \r\n0.0654968 0.964082 -0.645736 0 \r\n0.0898283 0.977198 -0.629982 0 \r\n0.0716625 0.969576 -0.620432 0 \r\n0.458621 0.444026 0.134818 0 \r\n0.470056 0.444825 0.111819 0 \r\n0.478757 0.426079 0.110039 0 \r\n-0.148224 -0.425202 -0.936401 0 \r\n-0.166447 -0.403093 -0.932713 0 \r\n0.641307 0.207521 -0.129784 0 \r\n-0.0817461 0.493849 0.123471 0 \r\n-0.0989275 0.466211 0.121956 0 \r\n-0.32263 0.0450698 -0.850177 0 \r\n-0.319915 0.0395131 -0.860213 0 \r\n0.417883 -0.968341 0.0944633 0 \r\n0.00645575 0.079982 0.231258 0 \r\n-0.15343 -0.433611 -0.976434 0 \r\n-0.145366 -0.427557 -0.979295 0 \r\n-0.120685 -0.0792287 0.925756 0 \r\n-0.13444 -0.0711962 0.912786 0 \r\n-0.303293 -0.130404 -0.770519 0 \r\n-0.285963 -0.13941 -0.760086 0 \r\n-0.286871 -0.146122 -0.778061 0 \r\n-0.0170702 -0.221795 0.855865 0 \r\n0.00047675 -0.232321 0.833969 0 \r\n-0.656176 -0.641028 0.578923 0 \r\n-0.645849 -0.63526 0.576608 0 \r\n-0.662237 -0.63161 0.590959 0 \r\n-0.350992 -0.125047 -0.90176 0 \r\n-0.354482 -0.148634 -0.89102 0 \r\n-0.35565 -0.145503 -0.906608 0 \r\n0.205296 -0.916418 -0.322458 0 \r\n0.198314 -0.924046 -0.302568 0 \r\n-0.0523159 -0.525655 0.269481 0 \r\n-0.0175439 -0.19798 0.838862 0 \r\n-0.0124365 -0.204546 0.818763 0 \r\n0.00232017 -0.223547 0.808869 0 \r\n-0.320115 0.227885 -0.156391 0 \r\n-0.308847 0.251129 -0.15415 0 \r\n0.193832 -0.928275 -0.287458 0 \r\n0.210732 -0.9275 -0.288923 0 \r\n0.465553 0.221047 -0.91052 0 \r\n0.458455 0.179935 -0.903998 0 \r\n0.745131 -0.0167448 -0.253909 0 \r\n0.0905572 -0.782624 0.572017 0 \r\n0.0564955 -0.767264 0.57637 0 \r\n0.0814922 -0.762626 0.581854 0 \r\n0.135043 0.673447 0.0440538 0 \r\n0.154931 0.675611 0.0433643 0 \r\n-0.0411523 -0.171851 0.869214 0 \r\n0.292917 -0.431969 -0.770441 0 \r\n0.297773 -0.431544 -0.752069 0 \r\n-0.14495 -0.432664 0.115476 0 \r\n-0.131397 -0.428605 0.134502 0 \r\n-0.0467192 -0.646717 -0.916562 0 \r\n-0.0823698 -0.28633 0.56603 0 \r\n-0.0858002 -0.30742 0.575446 0 \r\n0.668707 0.275172 -0.779998 0 \r\n0.667156 0.295386 -0.777382 0 \r\n-0.143511 0.432331 -0.957361 0 \r\n-0.159663 0.438599 -0.946467 0 \r\n-0.264955 0.479581 -0.184781 0 \r\n-0.260365 0.461635 -0.163808 0 \r\n0.39838 0.732854 -0.164988 0 \r\n0.109977 0.809775 -0.43861 0 \r\n0.0955732 0.801988 -0.425444 0 \r\n-0.190881 -0.685238 -0.250416 0 \r\n0.540991 -0.191711 -0.774693 0 \r\n0.534573 -0.175718 -0.758811 0 \r\n0.519776 -0.715544 0.531361 0 \r\n0.505726 -0.690754 0.540918 0 \r\n-0.274133 -0.322531 -0.864437 0 \r\n0.575477 -0.411873 -0.838073 0 \r\n0.580058 -0.431251 -0.836001 0 \r\n-0.0907862 -0.536462 0.161575 0 \r\n-0.102409 -0.528836 0.142626 0 \r\n-0.0941757 -0.508127 0.163276 0 \r\n0.594877 -0.0882565 -0.74898 0 \r\n0.577008 -0.103114 -0.746073 0 \r\n0.577419 -0.0866815 -0.735858 0 \r\n0.25637 0.368525 -0.960828 0 \r\n0.269823 0.385258 -0.960059 0 \r\n-0.325619 -0.0215716 -0.914005 0 \r\n0.463052 -0.93904 0.328825 0 \r\n0.479504 -0.936277 0.334729 0 \r\n0.467483 -0.942037 0.314629 0 \r\n0.163293 0.227439 0.281404 0 \r\n0.125835 -0.818187 0.570839 0 \r\n0.107192 -0.806448 0.570361 0 \r\n0.126673 -0.811597 0.572531 0 \r\n0.530464 -0.789064 -0.0113782 0 \r\n0.546682 -0.776924 -0.00992441 0 \r\n-0.0718094 -0.820694 -0.348998 0 \r\n-0.154812 -0.756581 -0.269473 0 \r\n-0.0823926 -0.603677 0.199677 0 \r\n-0.0879275 -0.61522 0.170602 0 \r\n-0.0847813 -0.592309 0.182649 0 \r\n4.97699e-005 0.721014 -0.866194 0 \r\n0.00595614 0.698056 -0.880624 0 \r\n0.0152899 0.728791 -0.877142 0 \r\n0.0717701 -0.0311201 0.219232 0 \r\n0.0928248 -0.0559887 0.218506 0 \r\n0.733898 -0.0710322 -0.385851 0 \r\n0.731169 -0.0648545 -0.410424 0 \r\n0.724278 -0.0788121 -0.399042 0 \r\n0.324119 -0.502065 -0.835624 0 \r\n0.318422 -0.475976 -0.818818 0 \r\n0.0124566 -0.683169 -0.573035 0 \r\n0.0163914 -0.705462 -0.559921 0 \r\n0.0359218 -0.690607 -0.579592 0 \r\n-0.389524 0.291919 -0.244543 0 \r\n-0.377867 0.304247 -0.228731 0 \r\n-0.0191911 0.74584 -0.585311 0 \r\n-0.00633141 0.755429 -0.571037 0 \r\n0.663041 -0.660913 0.06282 0 \r\n0.657032 -0.645141 0.0726414 0 \r\n0.640799 -0.646021 0.057118 0 \r\n0.0906688 -0.126358 0.20786 0 \r\n0.102912 -0.102273 0.211019 0 \r\n-0.674191 -0.625033 0.884997 0 \r\n-0.0819106 -0.695192 0.198261 0 \r\n-0.0795458 -0.701593 0.230055 0 \r\n0.199684 0.818695 -0.44882 0 \r\n0.228704 0.819089 -0.461416 0 \r\n-0.159725 -0.7468 -0.290249 0 \r\n-0.165964 -0.739221 -0.271586 0 \r\n0.572421 -0.113135 -0.750952 0 \r\n0.362814 -0.195311 -0.947369 0 \r\n-0.400314 -0.663498 0.484661 0 \r\n-0.379034 -0.669248 0.478154 0 \r\n-0.16028 -0.224697 0.705181 0 \r\n-0.182792 -0.17857 0.731434 0 \r\n-0.17776 -0.201071 0.741286 0 \r\n-0.410303 0.2619 -0.467212 0 \r\n-0.410856 0.264764 -0.433116 0 \r\n-0.163087 0.0568472 -0.90868 0 \r\n-0.166548 0.0937051 -0.912778 0 \r\n0.265594 0.517066 -0.959409 0 \r\n0.256728 0.499488 -0.96036 0 \r\n0.290634 0.505429 -0.958923 0 \r\n-0.318978 -0.676063 0.46576 0 \r\n-0.344086 -0.672495 0.471254 0 \r\n0.551715 -0.574701 -0.0874811 0 \r\n0.223221 0.660388 -0.93591 0 \r\n0.206162 0.69391 -0.927068 0 \r\n0.501912 0.167161 0.144603 0 \r\n0.493461 0.154548 0.154933 0 \r\n0.48946 0.180304 0.162067 0 \r\n0.122975 -0.29218 -0.96778 0 \r\n0.122322 -0.301806 -0.967221 0 \r\n0.139629 -0.281961 -0.966596 0 \r\n0.359949 -0.308679 0.162544 0 \r\n0.35473 -0.322138 0.164848 0 \r\n0.0681288 -0.908599 -0.270256 0 \r\n0.06688 -0.909979 -0.247451 0 \r\n0.0909621 -0.918045 -0.247758 0 \r\n-0.105893 0.384609 -0.968493 0 \r\n-0.0820265 0.368795 -0.964141 0 \r\n0.579654 -0.152533 -0.124693 0 \r\n0.582507 -0.167985 -0.13943 0 \r\n-0.348258 0.202707 -0.777577 0 \r\n-0.355626 0.217244 -0.758963 0 \r\n0.317856 0.716262 -0.892778 0 \r\n0.299688 0.705283 -0.904048 0 \r\n0.314993 0.677225 -0.909884 0 \r\n-0.173321 0.0646039 0.0927825 0 \r\n0.423123 -0.433949 -0.68844 0 \r\n0.409125 -0.436287 -0.691843 0 \r\n0.469091 -0.468991 0.242413 0 \r\n0.479769 -0.489159 0.256329 0 \r\n0.465879 -0.477498 0.260879 0 \r\n0.595733 0.0430308 -0.101457 0 \r\n-0.444968 -0.619044 0.76247 0 \r\n-0.408313 -0.622032 0.752591 0 \r\n-0.0839588 -0.772494 -0.423781 0 \r\n-0.0848048 -0.757046 -0.442966 0 \r\n-0.109208 -0.747761 -0.428322 0 \r\n-0.0964569 -0.624884 0.417338 0 \r\n-0.0923961 -0.634943 0.409804 0 \r\n-0.077843 -0.620902 0.406546 0 \r\n0.317359 -0.124537 -0.924618 0 \r\n-0.028596 -0.676982 -0.936457 0 \r\n-0.00416262 -0.699682 -0.934374 0 \r\n0.271172 0.913407 -0.788339 0 \r\n0.241399 0.911119 -0.798035 0 \r\n0.262422 0.895056 -0.808529 0 \r\n0.137273 -0.180747 -0.934239 0 \r\n0.133742 -0.192441 -0.940265 0 \r\n0.492802 -0.490923 0.124006 0 \r\n0.481336 -0.481185 0.114579 0 \r\n0.494197 -0.499709 0.108182 0 \r\n-0.637665 -0.73704 0.907602 0 \r\n-0.621916 -0.749937 0.898237 0 \r\n-0.642059 -0.744044 0.902523 0 \r\n0.556016 -0.228785 -0.448074 0 \r\n0.552364 -0.211478 -0.435103 0 \r\n0.549111 -0.221659 -0.471703 0 \r\n0.335051 0.285143 -0.938051 0 \r\n-0.232699 -0.363922 -0.048085 0 \r\n0.36658 -0.266447 -0.964536 0 \r\n0.352064 -0.243565 -0.962251 0 \r\n-0.0729105 -0.386362 0.596147 0 \r\n-0.0579972 -0.407187 0.577749 0 \r\n-0.163842 0.684358 -0.380892 0 \r\n-0.159218 0.686257 -0.407506 0 \r\n0.238514 -0.500771 -0.840073 0 \r\n0.225885 -0.51053 -0.839739 0 \r\n0.336037 -0.932888 0.520056 0 \r\n0.348592 -0.919047 0.532783 0 \r\n0.438159 -0.0363867 0.142414 0 \r\n-0.0460832 -0.0924897 0.594602 0 \r\n-0.0350222 -0.0852302 0.60021 0 \r\n-0.0455665 -0.0711889 0.606312 0 \r\n-0.108012 -0.523575 -0.964437 0 \r\n0.168852 -0.724185 0.587198 0 \r\n0.152406 -0.699795 0.586933 0 \r\n0.192758 -0.71603 0.589689 0 \r\n0.551777 0.00318456 -0.930035 0 \r\n0.54898 0.0114132 -0.928729 0 \r\n-0.414404 -0.721057 0.513752 0 \r\n-0.393398 -0.716426 0.501912 0 \r\n-0.416449 -0.712626 0.504076 0 \r\n0.304435 -0.429088 0.361802 0 \r\n0.297421 -0.434901 0.378591 0 \r\n0.542039 -0.406027 -0.514342 0 \r\n0.548285 -0.416814 -0.491776 0 \r\n0.387536 0.799664 -0.813655 0 \r\n0.39961 0.80536 -0.80179 0 \r\n0.390395 0.273745 0.24095 0 \r\n0.405067 0.305238 0.228301 0 \r\n0.574414 -0.944186 0.0679667 0 \r\n0.117353 -0.396613 0.670745 0 \r\n0.0977875 -0.372624 0.697569 0 \r\n-0.0596699 -0.835155 -0.331417 0 \r\n0.186702 0.749861 -0.0704342 0 \r\n0.157983 0.75106 -0.0720338 0 \r\n0.602124 -0.564817 -0.239184 0 \r\n0.605102 -0.557588 -0.260565 0 \r\n-0.200797 -0.641335 0.444607 0 \r\n-0.203548 -0.632393 0.447471 0 \r\n0.0100518 -0.454048 -0.981948 0 \r\n0.0401497 -0.434293 -0.980141 0 \r\n-0.0003139 -0.417785 -0.981198 0 \r\n-0.716884 -0.595442 0.668292 0 \r\n-0.723737 -0.586461 0.689319 0 \r\n0.611038 -0.0655861 -0.61549 0 \r\n-0.368986 -0.725297 0.505315 0 \r\n-0.366818 -0.730645 0.520383 0 \r\n0.734645 0.232217 -0.655941 0 \r\n0.733379 0.219869 -0.666441 0 \r\n0.689231 -0.0770885 -0.225774 0 \r\n0.681428 -0.0642444 -0.208659 0 \r\n-0.24667 0.463227 -0.856881 0 \r\n-0.345524 0.428315 -0.523803 0 \r\n-0.336315 0.452016 -0.499253 0 \r\n0.270535 -0.932235 -0.135769 0 \r\n0.286794 -0.928473 -0.142905 0 \r\n0.389813 0.549322 0.140769 0 \r\n0.382312 0.568052 0.127669 0 \r\n0.102675 -0.332648 0.624061 0 \r\n0.11118 -0.345407 0.629545 0 \r\n0.570035 -0.345334 -0.149106 0 \r\n0.577143 -0.360223 -0.165908 0 \r\n0.569833 -0.362631 -0.135437 0 \r\n-0.310261 0.403417 -0.20846 0 \r\n-0.32679 0.365433 -0.201286 0 \r\n-0.328182 0.385532 -0.21885 0 \r\n0.390458 0.870562 -0.560676 0 \r\n0.4035 0.859324 -0.582078 0 \r\n0.0332389 -0.388507 0.451705 0 \r\n0.0275229 -0.354322 0.467793 0 \r\n-0.121687 0.0182151 0.650106 0 \r\n-0.139343 0.036753 0.658221 0 \r\n-0.120101 0.00969069 0.643039 0 \r\n-0.20261 -0.667496 0.442101 0 \r\n-0.198226 -0.655529 0.44179 0 \r\n0.573745 -0.542489 -0.12466 0 \r\n0.392055 0.641648 -0.869903 0 \r\n0.385772 0.667112 -0.868244 0 \r\n0.380475 0.652591 -0.877828 0 \r\n0.25773 -0.433789 -0.782458 0 \r\n0.273024 -0.438048 -0.793732 0 \r\n0.256396 -0.442958 -0.799954 0 \r\n0.58902 -0.0445381 -0.111003 0 \r\n0.593232 -0.0447052 -0.119719 0 \r\n0.591541 -0.0603838 -0.120766 0 \r\n0.724133 -0.0962493 -0.91461 0 \r\n0.722146 -0.0786874 -0.911793 0 \r\n0.722592 -0.0708086 -0.924449 0 \r\n-0.131379 -0.406429 0.141086 0 \r\n-0.119967 -0.426871 0.149377 0 \r\n-0.160724 -0.365726 -0.982252 0 \r\n-0.160874 -0.403295 -0.984197 0 \r\n-0.120906 -0.403147 -0.981789 0 \r\n0.641738 0.508443 -0.270826 0 \r\n0.647658 0.491151 -0.253058 0 \r\n-0.299453 0.107314 -0.913707 0 \r\n-0.2981 0.124134 -0.903889 0 \r\n-0.304332 0.0861716 -0.901178 0 \r\n-0.159223 0.514021 0.00335192 0 \r\n-0.000457675 -0.0981196 0.62335 0 \r\n0.0129972 -0.122179 0.621659 0 \r\n-0.260064 0.515069 -0.206528 0 \r\n-0.267382 0.518633 -0.227818 0 \r\n0.637234 -0.0942236 -0.500127 0 \r\n0.621436 -0.0959487 -0.515499 0 \r\n0.580428 -0.274264 -0.290267 0 \r\n0.400403 0.2466 -0.900535 0 \r\n0.422454 0.263711 -0.906847 0 \r\n0.409566 0.267566 -0.909662 0 \r\n0.450123 0.450309 0.145153 0 \r\n-0.204433 -0.406236 -0.441341 0 \r\n-0.208784 -0.384131 -0.429862 0 \r\n0.563306 -0.618024 0.0488426 0 \r\n0.545323 -0.605875 0.0479139 0 \r\n-0.132847 -0.350722 -0.845109 0 \r\n0.367987 0.567456 -0.925663 0 \r\n0.344665 0.575647 -0.932064 0 \r\n-0.311653 0.0389995 -0.916497 0 \r\n-0.308721 0.0462371 -0.929531 0 \r\n-0.302753 0.0765888 -0.92403 0 \r\n-0.226775 -0.267143 -0.973211 0 \r\n-0.208344 -0.288483 -0.96884 0 \r\n-0.169302 -0.693841 0.439923 0 \r\n-0.172687 -0.684551 0.437619 0 \r\n-0.192769 -0.693868 0.444577 0 \r\n-0.703352 -0.570498 0.806788 0 \r\n0.063465 -0.836819 0.526022 0 \r\n0.18191 -0.452228 0.573937 0 \r\n0.194231 -0.460191 0.570019 0 \r\n-0.0365761 0.471472 0.172044 0 \r\n0.236569 0.799207 -0.338548 0 \r\n0.267136 0.795446 -0.34928 0 \r\n0.181278 0.623458 0.110765 0 \r\n0.163119 0.638385 0.0912724 0 \r\n0.582232 -0.39206 -0.859331 0 \r\n0.0684847 0.678055 -0.923956 0 \r\n0.087822 0.681437 -0.92918 0 \r\n0.433468 0.58523 0.056952 0 \r\n0.438215 0.603208 0.0269614 0 \r\n0.495318 -0.205132 -0.945015 0 \r\n0.492678 -0.193478 -0.940554 0 \r\n0.157441 -0.845626 -0.455248 0 \r\n0.134403 -0.846184 -0.451948 0 \r\n0.147383 -0.854784 -0.4404 0 \r\n0.02528 0.118205 -0.903931 0 \r\n0.0424414 0.146236 -0.906587 0 \r\n-0.404097 -0.168341 -0.331443 0 \r\n-0.389944 -0.182324 -0.33633 0 \r\n-0.40988 -0.168951 -0.347245 0 \r\n0.314433 0.227362 -0.921368 0 \r\n0.331726 0.246791 -0.923267 0 \r\n0.305711 0.24551 -0.93156 0 \r\n0.504081 -0.386588 -0.681431 0 \r\n0.509436 -0.385963 -0.702106 0 \r\n0.523164 -0.408038 -0.0225237 0 \r\n0.522053 -0.38692 -0.0228568 0 \r\n0.535549 -0.401267 -0.0422258 0 \r\n-0.241842 -0.31131 -0.0759006 0 \r\n-0.239342 -0.305327 -0.0643825 0 \r\n-0.241422 0.481568 -0.837237 0 \r\n-0.234868 0.47033 -0.858351 0 \r\n-0.0158317 -0.666162 0.615183 0 \r\n-0.04806 -0.671314 0.632533 0 \r\n-0.209236 -0.107719 0.906144 0 \r\n-0.189615 -0.139045 0.889894 0 \r\n0.764218 0.177356 -0.466752 0 \r\n0.765079 0.166097 -0.445122 0 \r\n0.759434 0.0853104 -0.433788 0 \r\n0.52692 -0.543004 0.247622 0 \r\n0.527014 -0.531484 0.22964 0 \r\n-0.0959409 -0.625924 0.122979 0 \r\n-0.091123 -0.651029 0.115772 0 \r\n0.537837 -0.0330958 0.0212506 0 \r\n0.0642878 -0.37517 0.456037 0 \r\n0.0602907 -0.337022 0.477631 0 \r\n0.0423262 -0.339066 0.474357 0 \r\n0.595811 -0.429839 -0.229381 0 \r\n0.595209 -0.441413 -0.206822 0 \r\n0.592039 -0.418615 -0.206314 0 \r\n-0.113908 0.121001 0.162104 0 \r\n-0.101247 0.121909 0.17482 0 \r\n-0.337541 0.0947841 -0.160582 0 \r\n-0.234754 -0.729137 0.480681 0 \r\n-0.196937 -0.731177 0.475302 0 \r\n-0.115879 -0.148606 0.924584 0 \r\n-0.155253 -0.151379 0.657235 0 \r\n-0.17049 -0.137038 0.676759 0 \r\n-0.244298 -0.154687 -0.049697 0 \r\n0.270676 -0.955166 0.0561685 0 \r\n0.260429 -0.941076 0.0428968 0 \r\n0.712174 0.276572 -0.703583 0 \r\n0.716662 0.257516 -0.701173 0 \r\n0.157476 -0.39729 0.32496 0 \r\n0.137499 -0.40325 0.330573 0 \r\n0.142766 -0.396347 0.318707 0 \r\n0.315066 0.376536 0.251628 0 \r\n-0.285682 -0.0371431 -0.137025 0 \r\n-0.284422 -0.00977841 -0.126981 0 \r\n0.506935 -0.696027 -0.0210056 0 \r\n0.51246 -0.665588 -0.0158537 0 \r\n-0.619537 -0.732916 0.819095 0 \r\n-0.631711 -0.731208 0.830343 0 \r\n0.567794 0.4651 -0.85971 0 \r\n0.572225 0.459543 -0.872951 0 \r\n-0.218475 -0.622101 0.45749 0 \r\n0.614172 0.559735 -0.259172 0 \r\n0.60832 0.558163 -0.237363 0 \r\n-0.441733 -0.108022 -0.288382 0 \r\n-0.43644 -0.100265 -0.269635 0 \r\n-0.429223 -0.120127 -0.27692 0 \r\n-0.184171 -0.237001 -0.928751 0 \r\n0.572038 -0.304886 -0.413854 0 \r\n0.573516 -0.297475 -0.390437 0 \r\n0.571478 -0.286571 -0.405212 0 \r\n0.132568 -0.873026 0.549142 0 \r\n0.514577 -0.564102 0.303133 0 \r\n0.504288 -0.561094 0.316415 0 \r\n0.0964731 0.254771 -0.957667 0 \r\n0.0879565 0.248431 -0.950105 0 \r\n0.414152 -0.701075 0.581574 0 \r\n0.419268 -0.737987 0.575244 0 \r\n0.597507 0.593397 -0.328601 0 \r\n0.583971 0.61001 -0.336158 0 \r\n0.590944 0.599296 -0.347356 0 \r\n0.369673 -0.581517 -0.863105 0 \r\n-0.214719 -0.175866 -0.761238 0 \r\n-0.229401 -0.165755 -0.753435 0 \r\n-0.212588 0.0458948 0.69787 0 \r\n-0.386702 -0.150068 -0.528799 0 \r\n-0.383835 -0.159481 -0.508548 0 \r\n-0.26098 -0.0197644 -0.975592 0 \r\n-0.252673 0.0316809 -0.974396 0 \r\n0.0819173 -0.177067 0.210252 0 \r\n0.116061 -0.160567 0.210625 0 \r\n0.422739 -0.46604 0.310812 0 \r\n0.53807 -0.625099 -0.878623 0 \r\n0.520549 -0.624421 -0.869859 0 \r\n0.536529 -0.613313 -0.862867 0 \r\n0.571944 -0.285344 -0.872375 0 \r\n-0.756249 -0.595587 0.757946 0 \r\n-0.754176 -0.607131 0.785537 0 \r\n-0.0884136 -0.361424 0.608652 0 \r\n-0.100047 -0.339343 0.619698 0 \r\n0.306697 0.17582 0.269497 0 \r\n0.311984 0.205814 0.267831 0 \r\n0.336281 0.20334 0.264309 0 \r\n-0.186203 0.584929 -0.119526 0 \r\n-0.197232 0.588395 -0.149429 0 \r\n0.298956 -0.359957 0.232436 0 \r\n0.303169 -0.372832 0.248867 0 \r\n0.0141454 -0.745376 0.598975 0 \r\n-0.0010886 -0.732033 0.610867 0 \r\n-0.34247 0.426619 -0.621607 0 \r\n-0.347472 0.40628 -0.636925 0 \r\n0.153064 0.278633 0.281279 0 \r\n0.162514 0.265033 0.28255 0 \r\n0.137944 0.269366 0.281284 0 \r\n-0.254039 -0.354277 -0.283787 0 \r\n-0.255646 -0.363788 -0.27204 0 \r\n-0.253443 -0.370075 -0.286646 0 \r\n0.298084 -0.927734 -0.198209 0 \r\n0.281274 -0.931925 -0.212024 0 \r\n0.533774 -0.124258 -0.935201 0 \r\n0.539538 -0.141031 -0.940647 0 \r\n-0.226709 0.529248 -0.779304 0 \r\n-0.247747 0.515583 -0.775128 0 \r\n-0.238541 0.506332 -0.798853 0 \r\n-0.296921 0.518405 -0.587899 0 \r\n-0.309382 0.498886 -0.578853 0 \r\n0.294369 -0.889836 -0.0452159 0 \r\n0.313078 -0.883552 -0.0462348 0 \r\n0.307045 -0.891119 -0.057165 0 \r\n0.0922207 0.797013 -0.238883 0 \r\n0.0899685 -0.625553 -0.982171 0 \r\n0.0599255 -0.645275 -0.981274 0 \r\n-0.691444 -0.700698 0.893547 0 \r\n0.171221 0.976492 -0.702533 0 \r\n0.150324 0.974551 -0.704072 0 \r\n-0.0343067 0.222308 -0.906069 0 \r\n-0.0552038 0.220004 -0.902047 0 \r\n-0.120877 -0.502255 -0.956537 0 \r\n-0.123616 -0.482625 -0.96804 0 \r\n0.713757 0.147866 -0.704982 0 \r\n0.713809 0.129649 -0.698102 0 \r\n0.214417 0.467046 -0.956903 0 \r\n0.225399 0.479223 -0.957678 0 \r\n0.199722 0.474595 -0.957334 0 \r\n-0.0964496 0.478019 -0.916752 0 \r\n-0.296782 0.402483 -0.186774 0 \r\n-0.298173 0.422582 -0.204336 0 \r\n-0.366363 0.34113 -0.623837 0 \r\n-0.3707 0.31991 -0.628186 0 \r\n-0.363934 0.337919 -0.644637 0 \r\n0.0204279 -0.248067 0.683591 0 \r\n0.03995 -0.270626 0.681065 0 \r\n0.0221764 -0.253228 0.695104 0 \r\n-0.197293 -0.279991 -0.449695 0 \r\n-0.188558 -0.279482 -0.471042 0 \r\n-0.39456 -0.576916 0.620039 0 \r\n-0.437037 -0.581087 0.620995 0 \r\n-0.402005 -0.580768 0.603152 0 \r\n-0.411875 -0.128275 -0.532467 0 \r\n0.282426 -0.960696 0.448488 0 \r\n0.300726 -0.959875 0.447933 0 \r\n0.280101 -0.961325 0.429815 0 \r\n0.306121 0.151975 0.266809 0 \r\n0.529473 -0.0530625 -0.920406 0 \r\n0.126708 -0.231647 -0.9575 0 \r\n-0.415682 0.127901 -0.628262 0 \r\n0.495069 -0.938129 0.322443 0 \r\n0.4995 -0.941126 0.308248 0 \r\n-0.107115 -0.340222 0.65683 0 \r\n-0.104474 -0.342609 0.669573 0 \r\n0.50832 -0.568704 -0.51509 0 \r\n0.406349 -0.529369 -0.597691 0 \r\n0.408123 -0.549917 -0.594331 0 \r\n0.271613 -0.275618 -0.96505 0 \r\n0.292558 -0.287145 -0.965412 0 \r\n0.175638 -0.774383 -0.54067 0 \r\n0.169351 -0.760919 -0.553304 0 \r\n-0.154881 -0.379091 -0.890532 0 \r\n0.205469 0.889749 -0.823041 0 \r\n0.218425 0.905796 -0.810163 0 \r\n0.00323173 -0.506544 0.542599 0 \r\n0.0108783 -0.518474 0.525042 0 \r\n-0.0008634 -0.500092 0.525307 0 \r\n0.0696426 0.96818 -0.578655 0 \r\n0.0779803 0.974411 -0.600491 0 \r\n0.0876565 0.976461 -0.582842 0 \r\n-0.248951 -0.204363 -0.788245 0 \r\n0.257751 -0.666676 0.596086 0 \r\n0.256537 -0.643235 0.596433 0 \r\n0.278156 -0.657168 0.596838 0 \r\n0.00413037 -0.500795 -0.725077 0 \r\n0.0238818 -0.501288 -0.711151 0 \r\n0.028255 -0.50314 -0.725867 0 \r\n0.312549 0.0671358 -0.904057 0 \r\n0.653307 -0.634546 0.210313 0 \r\n0.63519 -0.628588 0.227425 0 \r\n0.127808 0.356784 0.270746 0 \r\n0.114175 0.331538 0.274409 0 \r\n0.101049 0.34951 0.269823 0 \r\n-0.0782362 -0.589001 0.537785 0 \r\n-0.0928091 -0.585648 0.531346 0 \r\n-0.328408 0.407988 -0.243271 0 \r\n-0.333626 0.418338 -0.269014 0 \r\n-0.316871 0.433867 -0.251765 0 \r\n-0.200836 -0.321985 -0.44466 0 \r\n-0.203883 -0.34132 -0.437711 0 \r\n-0.192807 -0.34054 -0.464534 0 \r\n0.406831 0.87023 -0.717677 0 \r\n0.420331 0.854473 -0.714117 0 \r\n0.571337 -0.863501 0.42403 0 \r\n0.581734 -0.867656 0.408102 0 \r\n-0.252142 -0.402396 -0.293325 0 \r\n-0.255471 -0.39018 -0.26084 0 \r\n0.172597 -0.491284 -0.78542 0 \r\n-0.0270447 -0.452999 0.250948 0 \r\n-0.0471899 -0.466309 0.230983 0 \r\n-0.0354664 -0.452017 0.237511 0 \r\n0.166362 -0.425335 0.574144 0 \r\n0.18041 -0.436069 0.553308 0 \r\n0.175113 -0.43812 0.57718 0 \r\n0.529732 -0.257261 -0.654512 0 \r\n-0.325912 -0.0546854 -0.953997 0 \r\n0.348104 0.751334 -0.865693 0 \r\n0.363721 0.740201 -0.861371 0 \r\n0.362466 0.763392 -0.851691 0 \r\n-0.0899549 -0.286846 0.172459 0 \r\n-0.224882 -0.292318 -0.822036 0 \r\n-0.222639 -0.313133 -0.833211 0 \r\n-0.453808 0.0755926 -0.288495 0 \r\n-0.448806 0.107931 -0.281276 0 \r\n-0.446431 0.0828461 -0.255722 0 \r\n0.351213 -0.894246 -0.113442 0 \r\n0.340026 -0.905403 -0.131168 0 \r\n-0.256937 -0.376235 -0.230125 0 \r\n-0.255309 -0.39792 -0.215618 0 \r\n0.669028 -0.642273 0.0855292 0 \r\n0.605922 -0.921646 0.0751058 0 \r\n0.602456 -0.905478 0.0591932 0 \r\n0.588884 -0.924771 0.060397 0 \r\n0.376983 -0.287067 0.150824 0 \r\n0.360344 -0.294545 0.162675 0 \r\n0.166925 -0.920017 -0.0967163 0 \r\n0.171651 -0.913666 -0.0768075 0 \r\n0.502903 -0.515324 0.103346 0 \r\n-0.304078 -0.168256 -0.983889 0 \r\n-0.295161 -0.215769 -0.983575 0 \r\n-0.2806 -0.176093 -0.982198 0 \r\n0.185437 0.478102 -0.958187 0 \r\n0.099655 -0.712683 0.587929 0 \r\n0.0689226 -0.703979 0.591628 0 \r\n0.50708 -0.117818 -0.927738 0 \r\n0.473704 -0.110833 -0.92096 0 \r\n0.605274 -0.0571909 -0.140801 0 \r\n0.430282 -0.484278 0.333158 0 \r\n0.213951 -0.526547 -0.667205 0 \r\n0.23053 -0.520733 -0.666154 0 \r\n0.21806 -0.510072 -0.67107 0 \r\n0.583359 0.0847032 -0.95266 0 \r\n0.566061 0.0714419 -0.94337 0 \r\n0.536394 -0.469335 -0.0407835 0 \r\n0.529624 -0.447558 -0.030772 0 \r\n-0.149523 -0.182046 0.882673 0 \r\n-0.150108 -0.168319 0.895519 0 \r\n-0.137549 -0.184197 0.889464 0 \r\n-0.310038 0.0481828 -0.905923 0 \r\n-0.307789 0.0618593 -0.901138 0 \r\n0.747994 0.249354 -0.55542 0 \r\n0.744518 0.267897 -0.554914 0 \r\n0.0253153 -0.175418 0.637665 0 \r\n0.0398643 -0.195321 0.626307 0 \r\n0.0369552 -0.206266 0.635314 0 \r\n0.372562 0.820646 -0.551318 0 \r\n0.359098 0.832153 -0.53298 0 \r\n0.375909 0.83825 -0.547999 0 \r\n-0.116668 -0.742627 0.469594 0 \r\n-0.0960381 -0.767555 0.572437 0 \r\n0.514748 0.674989 -0.449502 0 \r\n0.521794 0.664892 -0.468728 0 \r\n0.405524 -0.844376 -0.0849901 0 \r\n0.428737 -0.825361 -0.0897473 0 \r\n-0.0811287 -0.733071 0.652644 0 \r\n-0.313649 0.141152 -0.849002 0 \r\n-0.313012 0.11355 -0.855646 0 \r\n-0.308622 0.14259 -0.860212 0 \r\n-0.0420819 0.762167 -0.240915 0 \r\n-0.0370291 0.757187 -0.207684 0 \r\n-0.136399 -0.73815 0.466622 0 \r\n-0.137643 -0.746068 0.480028 0 \r\n-0.12317 -0.159764 0.916039 0 \r\n0.0599006 -0.7034 -0.580449 0 \r\n0.541567 0.474486 -0.0202787 0 \r\n0.544639 0.49073 -0.0323805 0 \r\n0.727506 0.234827 -0.197648 0 \r\n0.714929 0.237302 -0.180863 0 \r\n0.717409 0.257692 -0.192455 0 \r\n0.167989 -0.4789 -0.770546 0 \r\n-0.447641 0.13021 -0.297186 0 \r\n-0.440264 0.137463 -0.264412 0 \r\n-0.563148 -0.782829 0.855927 0 \r\n-0.545897 -0.789093 0.841192 0 \r\n-0.572594 -0.785082 0.850686 0 \r\n-0.0983538 -0.312155 -0.721138 0 \r\n0.715386 0.0412668 -0.601977 0 \r\n0.727573 0.0651331 -0.592036 0 \r\n0.68684 -0.0641634 -0.500387 0 \r\n0.667472 -0.0681943 -0.520192 0 \r\n0.674351 -0.0781833 -0.488873 0 \r\n-0.293108 -0.757568 0.603017 0 \r\n-0.264512 -0.760656 0.590253 0 \r\n-0.293181 -0.752678 0.584899 0 \r\n-0.325968 -0.0184953 -0.886335 0 \r\n-0.32394 -0.0055442 -0.878087 0 \r\n0.287199 0.238216 -0.936689 0 \r\n0.0247637 -0.208355 0.652664 0 \r\n-0.119933 -0.107106 0.946795 0 \r\n-0.137629 -0.0963669 0.957659 0 \r\n-0.143243 -0.663974 0.428866 0 \r\n-0.114566 -0.653053 0.421582 0 \r\n-0.139688 -0.649846 0.42788 0 \r\n-0.186803 0.594896 -0.717651 0 \r\n-0.17202 0.611001 -0.705909 0 \r\n0.512907 -0.492853 -0.00472825 0 \r\n0.498151 -0.483687 0.0159721 0 \r\n0.544321 -0.257622 -0.0774752 0 \r\n0.5327 -0.247861 -0.0503938 0 \r\n0.542604 -0.234582 -0.0710754 0 \r\n0.5032 -0.560987 0.0341181 0 \r\n0.497814 -0.541189 0.0525471 0 \r\n0.49507 -0.535594 0.0415582 0 \r\n-0.0364184 0.776197 -0.653085 0 \r\n-0.0219353 0.78705 -0.626127 0 \r\n-0.303912 -0.232056 -0.830392 0 \r\n-0.143842 -0.518991 -0.522503 0 \r\n-0.134273 -0.544192 -0.527768 0 \r\n0.130759 0.483732 -0.96233 0 \r\n0.135694 0.497009 -0.963231 0 \r\n0.663871 -0.887985 0.202609 0 \r\n0.652202 -0.904019 0.204648 0 \r\n0.251673 -0.462246 -0.971378 0 \r\n0.764166 0.166113 -0.310164 0 \r\n-0.411493 0.202177 -0.563684 0 \r\n-0.112917 -0.152826 0.606233 0 \r\n-0.118131 -0.174849 0.608231 0 \r\n-0.104195 -0.183215 0.594856 0 \r\n0.0141858 -0.662632 0.597719 0 \r\n-0.0173301 -0.653328 0.607157 0 \r\n-0.30997 0.0313779 0.964383 0 \r\n-0.297691 0.0166326 0.972601 0 \r\n-0.311252 0.026838 0.96072 0 \r\n0.397394 -0.372448 -0.967687 0 \r\n0.449837 -0.384522 -0.968192 0 \r\n0.421561 -0.352409 -0.967217 0 \r\n0.563435 0.42872 -0.0334587 0 \r\n0.56123 0.410245 -0.0255532 0 \r\n0.552063 0.429613 -0.01775 0 \r\n0.618089 -0.467288 -0.871381 0 \r\n0.605528 -0.467613 -0.852885 0 \r\n0.604838 -0.450051 -0.861665 0 \r\n-0.341115 0.402835 -0.678912 0 \r\n-0.332304 0.425026 -0.683118 0 \r\n-0.138012 -0.595184 0.592666 0 \r\n0.664618 -0.122895 -0.964078 0 \r\n-0.130471 -0.281891 -0.935518 0 \r\n-0.127201 -0.295694 -0.946226 0 \r\n-0.267695 -0.723341 0.477444 0 \r\n-0.259496 -0.733839 0.490483 0 \r\n0.623034 -0.213435 -0.839715 0 \r\n0.623672 -0.223049 -0.854069 0 \r\n0.605004 -0.228475 -0.844507 0 \r\n0.198782 -0.724578 -0.585809 0 \r\n-0.314434 0.0942758 0.875523 0 \r\n-0.323249 0.0876814 0.891041 0 \r\n-0.328173 0.0985666 0.869432 0 \r\n0.231288 -0.908434 -0.061611 0 \r\n0.256905 -0.9054 -0.0604472 0 \r\n0.252692 -0.289184 0.21862 0 \r\n0.27193 -0.301056 0.214978 0 \r\n0.254124 -0.309194 0.222392 0 \r\n0.431294 0.684784 -0.794034 0 \r\n0.432243 0.67531 -0.782377 0 \r\n0.435409 0.692001 -0.773437 0 \r\n0.489191 -0.490285 0.0318587 0 \r\n0.484116 -0.460997 0.0376359 0 \r\n-0.456813 -0.122001 -0.396951 0 \r\n-0.463464 -0.10845 -0.412914 0 \r\n0.18997 -0.609755 0.59014 0 \r\n0.176245 -0.645459 0.588962 0 \r\n0.17154 -0.604437 0.58725 0 \r\n-0.0103985 -0.232563 0.19768 0 \r\n-0.0367993 -0.23196 0.18583 0 \r\n-0.0152718 -0.211314 0.186904 0 \r\n0.128977 -0.892401 -0.0346151 0 \r\n0.154382 -0.901452 -0.046763 0 \r\n0.123364 -0.896307 -0.0494614 0 \r\n0.555938 0.0380761 -0.934962 0 \r\n0.562144 0.0492983 -0.939314 0 \r\n0.017885 -0.42617 0.284439 0 \r\n0.0042907 -0.426551 0.26698 0 \r\n-0.0882857 -0.730997 -0.468395 0 \r\n0.584682 -0.938524 0.256401 0 \r\n0.572883 -0.948451 0.237049 0 \r\n-0.116515 -0.679748 -0.00670505 0 \r\n0.655897 -0.0432467 -0.791094 0 \r\n0.644825 -0.055722 -0.780388 0 \r\n0.148728 -0.27216 -0.96664 0 \r\n-0.214288 -0.783353 0.656534 0 \r\n-0.216961 -0.783208 0.646879 0 \r\n0.365491 0.563253 0.141111 0 \r\n0.370041 0.579212 0.122543 0 \r\n0.233419 -0.843503 -0.450455 0 \r\n-0.0498986 -0.0547201 0.613939 0 \r\n-0.0440214 -0.0440826 0.621612 0 \r\n-0.0594146 -0.0348733 0.623631 0 \r\n0.263795 -0.558194 -0.893179 0 \r\n0.272952 -0.56575 -0.906661 0 \r\n-0.0663093 -0.658976 0.352027 0 \r\n-0.0649987 -0.638816 0.35265 0 \r\n-0.065239 -0.655437 0.371244 0 \r\n0.500283 -0.394835 -0.649282 0 \r\n0.514847 -0.379273 -0.651812 0 \r\n0.362725 0.208611 -0.904753 0 \r\n0.3649 0.175572 -0.899719 0 \r\n0.583317 -0.219402 -0.181109 0 \r\n0.585397 -0.209565 -0.200443 0 \r\n-0.0708278 -0.836838 -0.203962 0 \r\n-0.0483868 -0.849983 -0.191786 0 \r\n-0.0542277 -0.850697 -0.22049 0 \r\n0.220737 0.99846 -0.57839 0 \r\n0.214451 0.998755 -0.554161 0 \r\n0.200913 0.999704 -0.577006 0 \r\n0.0538754 -0.859166 0.425748 0 \r\n0.0287318 -0.839889 0.421053 0 \r\n0.0340903 -0.835585 0.449158 0 \r\n-0.0177617 -0.801077 0.039706 0 \r\n-0.288872 -0.312425 -0.862492 0 \r\n-0.304697 -0.29752 -0.865412 0 \r\n-0.260314 -0.310086 -0.223541 0 \r\n0.343959 0.818253 -0.831401 0 \r\n0.332358 0.798045 -0.849277 0 \r\n0.35845 0.794734 -0.838138 0 \r\n-0.289598 -0.597513 0.508128 0 \r\n-0.253072 -0.587856 0.515231 0 \r\n-0.311751 -0.591483 0.527605 0 \r\n0.559244 -0.972936 0.125609 0 \r\n0.5736 -0.966069 0.116171 0 \r\n0.554294 -0.973074 0.102173 0 \r\n-0.434541 -0.717111 0.813424 0 \r\n-0.455565 -0.723905 0.824636 0 \r\n-0.412746 -0.153854 -0.313174 0 \r\n-0.418527 0.240633 -0.433502 0 \r\n-0.475676 0.00959729 -0.408359 0 \r\n-0.184527 -0.391074 -0.936372 0 \r\n0.0210604 -0.634965 -0.839547 0 \r\n0.0031026 -0.632427 -0.85051 0 \r\n-0.00684708 -0.835493 -0.0510781 0 \r\n0.522453 -0.515347 0.146456 0 \r\n0.506214 -0.502168 0.138315 0 \r\n0.521903 -0.522626 0.125749 0 \r\n0.546962 -0.109544 -0.0352683 0 \r\n0.545977 -0.125042 -0.0400909 0 \r\n-0.00620526 -0.608531 -0.600209 0 \r\n0.0082302 -0.6265 -0.600244 0 \r\n-0.00620005 0.586995 -0.904086 0 \r\n0.0138678 0.59595 -0.919659 0 \r\n0.00513485 0.626327 -0.900414 0 \r\n0.58036 0.589023 -0.470856 0 \r\n0.587265 0.583337 -0.452478 0 \r\n0.572827 0.601776 -0.459602 0 \r\n0.487261 0.691939 -0.212667 0 \r\n0.472801 0.703342 -0.220078 0 \r\n-0.401207 0.287001 -0.492132 0 \r\n-0.404896 0.272458 -0.494015 0 \r\n-0.182687 -0.132441 0.0560907 0 \r\n0.0509544 -0.650514 0.575711 0 \r\n0.0683757 -0.659976 0.580271 0 \r\n0.101092 -0.146256 -0.918028 0 \r\n0.075318 -0.12391 -0.911108 0 \r\n0.0336571 -0.171581 -0.916098 0 \r\n-0.579437 -0.59042 0.649261 0 \r\n-0.60857 -0.590894 0.654464 0 \r\n0.575363 -0.193509 -0.317573 0 \r\n0.573277 -0.206295 -0.316036 0 \r\n0.579504 -0.19275 -0.29206 0 \r\n-0.237835 -0.210377 -0.960637 0 \r\n-0.133615 -0.772622 -0.199042 0 \r\n-0.357863 -0.279387 -0.967748 0 \r\n-0.344918 -0.296254 -0.968442 0 \r\n-0.22402 -0.271556 -0.809722 0 \r\n-0.121177 -0.614717 0.621337 0 \r\n-0.146895 -0.616841 0.640824 0 \r\n0.102943 -0.338808 0.50626 0 \r\n0.0920921 -0.33846 0.49331 0 \r\n0.256142 -0.44903 -0.699262 0 \r\n0.272117 -0.443694 -0.702231 0 \r\n0.249855 -0.438897 -0.715306 0 \r\n-0.169587 0.66372 -0.224432 0 \r\n-0.176166 0.651626 -0.210169 0 \r\n-0.0598998 -0.73185 0.38985 0 \r\n0.410043 -0.435516 -0.67642 0 \r\n0.409483 -0.436096 -0.663115 0 \r\n0.666729 -0.799411 0.0701146 0 \r\n0.66509 -0.782748 0.059048 0 \r\n0.656841 -0.799715 0.0565888 0 \r\n0.184162 -0.125064 -0.918972 0 \r\n0.167367 -0.125553 -0.917574 0 \r\n0.634417 -0.0419771 -0.758383 0 \r\n0.642496 -0.0166664 -0.762913 0 \r\n0.556997 -0.0954638 -0.71786 0 \r\n-0.047746 -0.567297 0.330781 0 \r\n-0.0463753 -0.550025 0.314691 0 \r\n0.555959 -0.219169 -0.0932109 0 \r\n0.544338 -0.209408 -0.0661294 0 \r\n0.167858 -0.464688 0.599541 0 \r\n0.146592 -0.457136 0.626764 0 \r\n0.153394 -0.448049 0.618753 0 \r\n-0.0280611 0.277247 -0.925678 0 \r\n-0.01449 0.259602 -0.921659 0 \r\n-0.0408638 -0.661762 -0.951443 0 \r\n-0.0511397 -0.648407 -0.941411 0 \r\n0.357693 0.259212 -0.918563 0 \r\n0.363981 0.239549 -0.908213 0 \r\n0.381227 0.270118 -0.913702 0 \r\n-0.334691 -0.110192 -0.968936 0 \r\n-0.341624 -0.137644 -0.968556 0 \r\n0.730147 0.122454 -0.191407 0 \r\n0.73161 0.163473 -0.196599 0 \r\n-0.15341 -0.137899 0.923214 0 \r\n-0.168463 -0.119755 0.932589 0 \r\n0.223402 -0.592206 -0.646899 0 \r\n0.642962 -0.847294 0.35377 0 \r\n0.651258 -0.82994 0.358642 0 \r\n0.356593 -0.854622 -0.0124999 0 \r\n0.377419 -0.847399 -0.0265255 0 \r\n0.337323 -0.865511 -0.0238089 0 \r\n-0.0603521 0.146797 0.211797 0 \r\n-0.062911 -0.406887 0.632606 0 \r\n-0.0520233 -0.423391 0.60034 0 \r\n0.406541 0.752185 -0.306263 0 \r\n0.438646 0.734836 -0.3049 0 \r\n0.421686 0.740252 -0.279543 0 \r\n0.226357 -0.626086 -0.926179 0 \r\n-0.132204 0.475856 0.075308 0 \r\n-0.126722 0.520631 0.049652 0 \r\n0.0793013 -0.481535 0.659284 0 \r\n0.0996857 -0.48913 0.645198 0 \r\n0.0946406 -0.503484 0.635916 0 \r\n-0.293108 -0.745821 0.544908 0 \r\n-0.289121 -0.750086 0.563814 0 \r\n-0.14379 -0.25537 0.107055 0 \r\n-0.16731 -0.247403 0.0791683 0 \r\n0.646251 0.480011 -0.229304 0 \r\n0.655974 0.471078 -0.25049 0 \r\n-0.00750133 -0.8497 0.107133 0 \r\n0.011174 -0.868827 0.100451 0 \r\n-0.0298624 -0.648574 -0.974862 0 \r\n-0.0525774 -0.62727 -0.978505 0 \r\n-0.0395272 -0.650909 -0.972098 0 \r\n0.142668 -0.32048 0.244302 0 \r\n0.14348 -0.333894 0.250591 0 \r\n0.128793 -0.327713 0.247483 0 \r\n0.597502 0.264152 -0.0895326 0 \r\n0.59594 0.245739 -0.0872642 0 \r\n0.587188 0.256011 -0.0757257 0 \r\n-0.00335738 0.783294 -0.35117 0 \r\n-0.00341553 0.784291 -0.323617 0 \r\n-0.0142253 0.779902 -0.337269 0 \r\n0.523133 0.306385 0.0890313 0 \r\n0.513041 0.304013 0.110848 0 \r\n0.746723 0.217161 -0.586428 0 \r\n0.751128 0.230209 -0.549039 0 \r\n-0.11482 -0.308914 0.634531 0 \r\n-0.113946 -0.318601 0.642734 0 \r\n0.0897041 -0.420803 0.42004 0 \r\n0.104162 -0.419977 0.423755 0 \r\n0.0920196 -0.412566 0.430609 0 \r\n-0.167737 -0.0391847 0.947142 0 \r\n-0.182512 -0.0270342 0.954971 0 \r\n-0.180057 -0.028612 0.940802 0 \r\n0.54815 -0.146686 -0.476377 0 \r\n0.174875 -0.426383 0.519859 0 \r\n0.193362 -0.439927 0.501814 0 \r\n0.190147 -0.436828 0.532228 0 \r\n-0.173991 -0.33242 0.082079 0 \r\n-0.159306 -0.334146 0.106412 0 \r\n-0.302131 0.145672 -0.876971 0 \r\n0.530132 -0.854994 0.00561882 0 \r\n0.53241 -0.833549 -0.00153381 0 \r\n0.510494 -0.85579 0.00365038 0 \r\n-0.167284 -0.332762 -0.978969 0 \r\n-0.207252 -0.33291 -0.981377 0 \r\n0.61907 0.392231 -0.780895 0 \r\n0.629592 0.385091 -0.770693 0 \r\n0.486264 0.64212 -0.10066 0 \r\n0.476615 0.63521 -0.0740126 0 \r\n-0.087254 -0.342108 0.744083 0 \r\n-0.10631 -0.315586 0.75559 0 \r\n-0.101011 -0.310865 0.77475 0 \r\n-0.246907 0.205456 -0.03041 0 \r\n-0.244205 0.603157 -0.3358 0 \r\n-0.24364 0.600842 -0.312883 0 \r\n-0.250848 0.590798 -0.327982 0 \r\n-0.162346 -0.732155 0.466969 0 \r\n-0.225921 0.625907 -0.315443 0 \r\n-0.222271 0.627723 -0.300241 0 \r\n-0.233346 0.615017 -0.305499 0 \r\n-0.0681823 -0.678715 0.346979 0 \r\n-0.0656945 -0.700891 0.344971 0 \r\n0.544846 -0.160528 -0.760143 0 \r\n0.52512 -0.161098 -0.745949 0 \r\n-0.326779 -0.766834 0.648804 0 \r\n0.712808 -0.704481 0.171198 0 \r\n0.712185 -0.697237 0.147119 0 \r\n0.196418 0.490279 -0.958961 0 \r\n-0.194789 -0.617247 -0.12683 0 \r\n-0.189138 -0.639966 -0.137242 0 \r\n-0.251979 -0.393898 -0.157729 0 \r\n-0.25262 -0.413548 -0.170755 0 \r\n0.377684 -0.937643 0.359576 0 \r\n-0.00446303 0.767439 -0.488132 0 \r\n-0.0153294 0.758744 -0.514453 0 \r\n0.0424045 -0.390256 0.26533 0 \r\n0.0347809 -0.378961 0.253636 0 \r\n0.05932 -0.374977 0.264116 0 \r\n-0.0640696 -0.539101 0.244261 0 \r\n0.580941 -0.599409 0.25334 0 \r\n0.562211 -0.59375 0.273466 0 \r\n0.56591 -0.584328 0.24839 0 \r\n-0.407228 -0.695749 0.797807 0 \r\n0.595198 -0.0746308 -0.133017 0 \r\n0.604719 -0.0712709 -0.144335 0 \r\n0.398753 0.4246 0.205187 0 \r\n0.415999 0.427916 0.191153 0 \r\n0.114754 0.795736 -0.215368 0 \r\n0.179365 -0.612595 -0.643689 0 \r\n0.15865 -0.635128 -0.635776 0 \r\n-0.264754 0.536155 -0.250217 0 \r\n-0.29822 -0.122163 -0.184787 0 \r\n0.306199 -0.468406 -0.662134 0 \r\n0.298655 -0.479259 -0.659651 0 \r\n0.312565 -0.476493 -0.656107 0 \r\n0.0561054 -0.509284 -0.685975 0 \r\n0.0668872 -0.515646 -0.676049 0 \r\n-0.031888 0.867688 -0.684703 0 \r\n-0.0186962 0.888078 -0.653883 0 \r\n-0.0144796 -0.797288 -0.456609 0 \r\n0.00764435 -0.812435 -0.451626 0 \r\n0.00639195 -0.794973 -0.471524 0 \r\n0.113862 0.395157 -0.963024 0 \r\n0.106845 0.413731 -0.962398 0 \r\n0.195132 0.229914 -0.95392 0 \r\n0.22179 0.234304 -0.952492 0 \r\n0.280532 0.793396 -0.332548 0 \r\n0.312742 0.78646 -0.346754 0 \r\n0.580442 -0.300053 -0.211349 0 \r\n0.580697 -0.277164 -0.212211 0 \r\n0.582249 -0.294601 -0.227701 0 \r\n-0.440182 -0.1388 -0.357862 0 \r\n-0.455188 -0.116816 -0.348523 0 \r\n0.451819 0.720257 -0.241468 0 \r\n0.575514 -0.335425 -0.401273 0 \r\n0.570554 -0.330308 -0.429207 0 \r\n-0.0548468 -0.771671 0.291511 0 \r\n-0.0469745 -0.794294 0.289259 0 \r\n0.385804 -0.213075 0.140692 0 \r\n0.398717 -0.212361 0.129988 0 \r\n-0.0835489 0.469603 -0.932266 0 \r\n-0.0783285 0.484697 -0.914788 0 \r\n0.0772181 -0.394436 -0.975295 0 \r\n0.100522 -0.399782 -0.973636 0 \r\n-0.270288 0.0328618 -0.0849926 0 \r\n-0.26695 0.0694083 -0.0752412 0 \r\n-0.264358 0.0475913 -0.0663479 0 \r\n0.446138 -0.87393 0.517514 0 \r\n0.440094 -0.861906 0.529525 0 \r\n0.0950385 -0.34629 0.695235 0 \r\n0.117984 -0.377299 0.663705 0 \r\n0.0982694 -0.357401 0.694659 0 \r\n-0.0790083 0.444114 0.153652 0 \r\n-0.0658849 0.468509 0.152909 0 \r\n-0.175822 -0.202546 0.800801 0 \r\n-0.168101 -0.210293 0.814052 0 \r\n-0.161475 -0.229193 0.786497 0 \r\n-0.00979248 -0.80988 0.0219158 0 \r\n0.00788097 -0.827398 0.0223739 0 \r\n0.479976 -0.488805 -0.553238 0 \r\n0.497549 -0.464812 -0.54601 0 \r\n0.471166 -0.471377 -0.566488 0 \r\n-0.177896 0.393906 -0.966468 0 \r\n-0.203079 0.372126 -0.965011 0 \r\n-0.184364 0.365947 -0.972111 0 \r\n0.734194 0.100844 -0.611377 0 \r\n0.737005 0.0982293 -0.590654 0 \r\n0.211534 0.342267 -0.962541 0 \r\n0.325853 -0.455963 -0.66896 0 \r\n0.305 -0.450056 -0.682758 0 \r\n0.299257 -0.459733 -0.67239 0 \r\n-0.317761 0.468846 -0.316504 0 \r\n-0.329699 0.453131 -0.337138 0 \r\n0.571182 -0.270898 -0.393715 0 \r\n0.572401 -0.265604 -0.372629 0 \r\n0.311449 -0.577638 -0.914476 0 \r\n0.32291 -0.582247 -0.907971 0 \r\n0.319004 -0.593502 -0.926352 0 \r\n0.536809 -0.356023 -0.797353 0 \r\n0.53669 -0.371482 -0.802922 0 \r\n0.527636 -0.364368 -0.781027 0 \r\n0.0716439 -0.517775 -0.981703 0 \r\n0.0416673 -0.523213 -0.982893 0 \r\n0.134335 -0.626763 -0.638922 0 \r\n-0.0229356 0.759283 -0.628623 0 \r\n-0.0197422 0.771055 -0.624481 0 \r\n0.580925 -0.0975665 -0.105653 0 \r\n0.568821 -0.093155 -0.0757139 0 \r\n0.0485533 0.919006 -0.53697 0 \r\n0.0522085 0.903217 -0.527301 0 \r\n0.202081 0.503972 0.208337 0 \r\n0.211436 0.482455 0.222687 0 \r\n0.174724 0.490399 0.217162 0 \r\n-0.150474 -0.052705 0.935381 0 \r\n-0.152929 -0.0511273 0.94955 0 \r\n0.334226 0.596904 -0.930149 0 \r\n0.347368 0.606555 -0.919963 0 \r\n-0.132414 0.693121 -0.211107 0 \r\n-0.111454 0.712806 -0.222165 0 \r\n0.521525 -0.0945985 0.015367 0 \r\n0.535346 -0.088421 -0.00308986 0 \r\n-0.11091 -0.26419 0.606773 0 \r\n0.4123 -0.932409 0.473179 0 \r\n0.411838 -0.922145 0.490856 0 \r\n0.430044 -0.919197 0.478305 0 \r\n0.341614 0.94846 -0.558262 0 \r\n0.323154 0.957659 -0.542284 0 \r\n0.326459 0.962131 -0.563331 0 \r\n0.620257 -0.594993 0.168745 0 \r\n0.636674 -0.602149 0.151332 0 \r\n0.144942 -0.411543 0.348442 0 \r\n0.168846 -0.405859 0.341277 0 \r\n0.645162 -0.117814 -0.795399 0 \r\n0.632638 -0.13306 -0.79009 0 \r\n0.634106 -0.106099 -0.78396 0 \r\n0.579073 0.128208 -0.0319514 0 \r\n0.582559 0.118993 -0.0473555 0 \r\n0.57883 0.115205 -0.0327499 0 \r\n-0.213735 0.212575 -0.97199 0 \r\n-0.211776 0.254117 -0.97252 0 \r\n-0.0774238 0.194042 0.202303 0 \r\n-0.083425 0.205186 0.196933 0 \r\n-0.297064 0.0671824 0.919924 0 \r\n0.682024 0.396843 -0.217014 0 \r\n0.683602 0.384977 -0.207036 0 \r\n0.713336 -0.0539959 -0.933395 0 \r\n0.343445 0.852808 -0.515686 0 \r\n0.334636 0.870344 -0.507078 0 \r\n-0.256679 -0.381489 -0.248097 0 \r\n-0.256259 -0.370895 -0.262157 0 \r\n0.709362 0.305669 -0.695026 0 \r\n0.711329 0.309658 -0.682791 0 \r\n0.308601 0.232669 0.268771 0 \r\n0.300507 0.262865 0.269538 0 \r\n0.333474 0.263529 0.263411 0 \r\n0.577595 0.588277 -0.491271 0 \r\n0.576167 -0.448329 -0.827235 0 \r\n-0.704571 -0.637043 0.698674 0 \r\n-0.681836 -0.64715 0.661204 0 \r\n-0.698109 -0.636303 0.665692 0 \r\n0.095383 0.978837 -0.562754 0 \r\n0.120219 0.984928 -0.547337 0 \r\n0.45129 0.0167635 0.155079 0 \r\n0.0782989 -0.908604 0.0524329 0 \r\n-0.18257 -0.57718 0.539492 0 \r\n0.577667 -0.399257 -0.846781 0 \r\n0.570029 -0.399511 -0.83754 0 \r\n-0.153271 0.0384028 0.659549 0 \r\n-0.14237 0.0157766 0.650703 0 \r\n-0.00103459 0.297648 -0.950431 0 \r\n0.0120602 0.289652 -0.951442 0 \r\n-0.235528 0.101524 0.0160498 0 \r\n-0.229576 0.097731 0.0264186 0 \r\n-0.233084 0.0864467 0.0195986 0 \r\n-0.0089727 -0.638765 -0.867971 0 \r\n0.0059707 -0.657522 -0.869285 0 \r\n0.566175 -0.288761 -0.966164 0 \r\n0.554122 -0.332448 -0.967009 0 \r\n0.57127 -0.344456 -0.967329 0 \r\n0.0614623 -0.727422 -0.937554 0 \r\n0.0691473 -0.734662 -0.924826 0 \r\n0.482746 -0.649917 -0.935187 0 \r\n0.0817067 -0.296425 0.232919 0 \r\n0.0802077 -0.274323 0.227969 0 \r\n0.423231 -0.504708 0.452057 0 \r\n0.606623 -0.0532814 -0.689078 0 \r\n0.614888 -0.0478212 -0.703846 0 \r\n0.596361 -0.0597569 -0.701751 0 \r\n-0.308848 -0.123147 -0.723278 0 \r\n-0.287371 -0.131747 -0.740754 0 \r\n-0.0512213 -0.16543 0.728429 0 \r\n-0.0249382 -0.19008 0.704983 0 \r\n-0.0236287 -0.206019 0.721077 0 \r\n0.128426 -0.456054 0.642422 0 \r\n0.26076 -0.816344 0.583395 0 \r\n0.282306 -0.798138 0.586834 0 \r\n0.289264 -0.821787 0.582767 0 \r\n-0.316574 -0.793077 0.692873 0 \r\n0.467566 -0.488349 -0.971437 0 \r\n0.0608284 0.0407583 -0.90655 0 \r\n0.0477308 0.0150969 -0.90592 0 \r\n0.0871855 0.0500091 -0.907146 0 \r\n-0.11569 0.340456 -0.953436 0 \r\n0.704807 0.378731 -0.55351 0 \r\n0.699878 0.399858 -0.526055 0 \r\n-0.253229 -0.465963 -0.255335 0 \r\n-0.177328 -0.589755 0.494343 0 \r\n-0.212692 -0.587235 0.506701 0 \r\n-0.314902 0.312366 -0.810428 0 \r\n0.372391 0.739951 -0.15495 0 \r\n0.352473 0.752128 -0.174552 0 \r\n0.538033 -0.979439 0.133106 0 \r\n0.180559 -0.479601 -0.694955 0 \r\n0.203315 -0.482866 -0.685074 0 \r\n0.206975 -0.46778 -0.697037 0 \r\n-0.259198 0.246729 -0.096081 0 \r\n-0.269374 0.218307 -0.110314 0 \r\n0.176004 0.017826 0.245838 0 \r\n0.223035 0.130838 -0.91203 0 \r\n0.246358 0.149879 -0.914119 0 \r\n0.216234 0.150247 -0.91557 0 \r\n0.536778 0.189196 0.0925905 0 \r\n0.538801 0.206904 0.0837339 0 \r\n0.548748 0.19729 0.0672974 0 \r\n0.230038 -0.28138 0.223118 0 \r\n0.210987 -0.299387 0.230839 0 \r\n0.20614 -0.283445 0.227922 0 \r\n0.158673 0.585594 0.146326 0 \r\n0.176001 0.601205 0.134196 0 \r\n0.478243 0.151135 0.173523 0 \r\n0.363223 0.769022 -0.298728 0 \r\n0.35885 0.765395 -0.253516 0 \r\n0.332493 0.776814 -0.271338 0 \r\n0.587924 0.200195 -0.0797103 0 \r\n0.584718 0.184543 -0.0688128 0 \r\n-0.330683 -0.155014 -0.231735 0 \r\n0.134388 -0.491947 -0.692598 0 \r\n0.146962 -0.388377 0.553136 0 \r\n0.161728 -0.408724 0.537836 0 \r\n0.599416 -0.884636 0.0414182 0 \r\n0.336338 0.692198 -0.00410157 0 \r\n0.322869 0.710072 -0.0283362 0 \r\n-0.452514 0.132337 -0.354336 0 \r\n-0.314166 0.0546216 -0.150908 0 \r\n-0.307321 0.0193867 -0.152462 0 \r\n0.180503 0.201565 -0.935095 0 \r\n0.170577 0.208824 -0.940619 0 \r\n0.0968895 0.0300808 -0.906754 0 \r\n0.109987 0.0557422 -0.907384 0 \r\n0.440955 0.650214 -0.0424759 0 \r\n0.441915 0.629751 -0.0130763 0 \r\n0.638635 0.0856631 -0.13407 0 \r\n-0.0850386 -0.765916 0.581377 0 \r\n-0.103401 -0.768054 0.593642 0 \r\n0.0746441 -0.707692 -0.96312 0 \r\n0.0414514 -0.709907 -0.958794 0 \r\n0.0691134 -0.718026 -0.951326 0 \r\n-0.158413 -0.762235 0.539953 0 \r\n-0.187705 -0.758973 0.536524 0 \r\n-0.0482633 0.805101 -0.742298 0 \r\n-0.0507969 0.775211 -0.760897 0 \r\n-0.0438315 0.792992 -0.764711 0 \r\n0.402364 -0.873608 -0.177947 0 \r\n0.388392 -0.882134 -0.163032 0 \r\n0.530645 0.140675 -0.928879 0 \r\n-0.313648 -0.119244 -0.782099 0 \r\n0.493445 0.51002 -0.917441 0 \r\n0.164972 -0.929166 -0.27643 0 \r\n0.17952 -0.928609 -0.283388 0 \r\n0.490784 -0.383047 0.0205352 0 \r\n0.511055 -0.369621 -0.00663967 0 \r\n-0.083869 -0.027179 0.625441 0 \r\n-0.0779916 -0.0165414 0.633115 0 \r\n0.601876 -0.00466845 -0.960819 0 \r\n0.595526 -0.0338325 -0.957787 0 \r\n0.325504 -0.435442 0.362585 0 \r\n0.330558 -0.445978 0.38462 0 \r\n0.0188652 0.404324 0.233319 0 \r\n0.01558 0.376634 0.240914 0 \r\n0.313696 -0.956118 0.420056 0 \r\n0.315465 -0.958413 0.436965 0 \r\n0.33076 -0.954027 0.427761 0 \r\n-0.0731227 -0.533643 -0.869817 0 \r\n-0.219135 0.136441 0.0437009 0 \r\n-0.200584 0.126723 0.0682573 0 \r\n0.665967 0.322277 -0.155329 0 \r\n0.662994 0.349676 -0.161526 0 \r\n0.677049 0.337157 -0.172945 0 \r\n-0.211584 -0.775972 0.678133 0 \r\n-0.209679 -0.780396 0.666786 0 \r\n-0.241868 -0.782202 0.685329 0 \r\n-0.107156 -0.715496 0.671353 0 \r\n-0.0888536 -0.72345 0.65959 0 \r\n0.37677 -0.965608 0.262991 0 \r\n0.398353 -0.959489 0.274716 0 \r\n0.458719 0.360623 -0.951015 0 \r\n0.473086 0.359109 -0.950207 0 \r\n0.231293 -0.175788 -0.949191 0 \r\n0.211778 -0.182255 -0.951168 0 \r\n0.189191 -0.505287 -0.677557 0 \r\n-0.180002 0.170799 -0.933417 0 \r\n-0.188962 0.127855 -0.934346 0 \r\n-0.180606 0.141007 -0.929208 0 \r\n0.0645286 -0.240406 0.563705 0 \r\n0.069885 -0.259342 0.546646 0 \r\n0.0810394 -0.272366 0.552472 0 \r\n0.066759 -0.315901 0.2372 0 \r\n0.047967 -0.341752 0.240146 0 \r\n-0.209988 -0.576507 0.580006 0 \r\n0.55022 -0.492247 -0.479791 0 \r\n0.534557 -0.496478 -0.500045 0 \r\n-0.05754 -0.583185 -0.579381 0 \r\n-0.0478627 -0.6121 -0.573829 0 \r\n-0.0306703 -0.601712 -0.588781 0 \r\n0.179374 0.610591 0.124504 0 \r\n-0.185733 -0.189623 0.792811 0 \r\n0.466933 -0.461776 0.224462 0 \r\n0.453682 -0.446178 0.210391 0 \r\n0.415859 0.688493 -0.829295 0 \r\n0.53216 -0.694737 -0.10924 0 \r\n0.529545 -0.67706 -0.0900113 0 \r\n0.53696 -0.675133 -0.106678 0 \r\n-0.662872 -0.716917 0.915385 0 \r\n-0.64273 -0.72281 0.911099 0 \r\n0.307994 -0.620568 0.596215 0 \r\n0.327186 -0.60877 0.594752 0 \r\n0.389751 0.651464 0.0187332 0 \r\n0.31837 0.619899 -0.928629 0 \r\n0.10697 0.426743 -0.962116 0 \r\n0.0761888 0.421783 -0.964322 0 \r\n0.161141 0.360851 0.270264 0 \r\n0.148015 0.378824 0.265678 0 \r\n0.319424 0.785215 -0.393954 0 \r\n0.635356 -0.0543435 -0.167896 0 \r\n0.644985 -0.080899 -0.196011 0 \r\n0.624425 -0.0803864 -0.180234 0 \r\n0.134464 -0.228871 0.219636 0 \r\n-0.0876961 0.658106 -0.045178 0 \r\n-0.0687982 0.658334 -0.0240014 0 \r\n-0.0820471 0.641861 -0.0139931 0 \r\n0.0879657 -0.727607 0.585325 0 \r\n-0.142397 0.623857 -0.0818626 0 \r\n-0.122237 0.6413 -0.0718185 0 \r\n0.281606 -0.409229 0.331009 0 \r\n0.295361 -0.402533 0.310355 0 \r\n0.308959 -0.413612 0.326142 0 \r\n0.667835 0.155633 -0.780061 0 \r\n0.0825237 -0.719345 -0.574193 0 \r\n0.0624797 -0.728845 -0.560223 0 \r\n0.495193 -0.403607 -0.608087 0 \r\n0.515744 -0.38971 -0.596236 0 \r\n0.014699 -0.884825 -0.286189 0 \r\n0.0361018 -0.89413 -0.294455 0 \r\n0.0067541 -0.878421 -0.310695 0 \r\n-0.751966 -0.57561 0.784961 0 \r\n-0.744053 -0.573846 0.755481 0 \r\n0.277254 0.532434 -0.959512 0 \r\n0.28379 0.550552 -0.955944 0 \r\n-0.247554 -0.328299 -0.104327 0 \r\n0.659767 -0.83073 0.0841437 0 \r\n0.64911 -0.836427 0.0670224 0 \r\n0.650397 -0.850779 0.0835107 0 \r\n0.63159 0.521326 -0.472582 0 \r\n0.542719 -0.251498 -0.553587 0 \r\n0.532876 -0.235922 -0.584737 0 \r\n0.564774 -0.198584 -0.360272 0 \r\n0.579156 -0.308559 -0.336843 0 \r\n0.580629 -0.327074 -0.33764 0 \r\n0.382307 -0.59394 -0.868549 0 \r\n0.401 -0.611549 -0.873852 0 \r\n0.641986 0.0556696 -0.137952 0 \r\n0.574253 0.486762 -0.755966 0 \r\n0.582747 0.477298 -0.753832 0 \r\n0.573314 0.503572 -0.738401 0 \r\n0.306059 -0.860889 -0.404638 0 \r\n0.318521 -0.847849 -0.421017 0 \r\n-0.284682 0.52102 -0.66523 0 \r\n-0.273311 0.540429 -0.652167 0 \r\n0.721846 0.200569 -0.697509 0 \r\n0.729918 0.210245 -0.681215 0 \r\n0.721466 0.215003 -0.697366 0 \r\n-0.243912 -0.336773 -0.0882654 0 \r\n-0.243753 -0.354237 -0.090334 0 \r\n-0.246042 -0.32394 -0.09462 0 \r\n0.00416824 -0.508621 0.555295 0 \r\n-0.0055837 -0.489995 0.584858 0 \r\n0.00522146 -0.506299 0.571898 0 \r\n-0.0202958 -0.815586 0.361672 0 \r\n-0.0222558 -0.820513 0.342984 0 \r\n-0.613779 -0.764462 0.857759 0 \r\n0.503412 -0.582507 0.441914 0 \r\n-0.346433 0.435631 -0.441599 0 \r\n-0.3545 0.419816 -0.422924 0 \r\n-0.351824 0.424398 -0.442964 0 \r\n-0.426156 0.145739 -0.222747 0 \r\n-0.433404 0.121914 -0.230609 0 \r\n-0.434179 0.13901 -0.24064 0 \r\n0.640804 -0.709621 0.37732 0 \r\n0.628736 -0.710855 0.40238 0 \r\n0.582269 -0.309857 -0.249938 0 \r\n-0.0524893 0.624086 0.0372535 0 \r\n0.352453 -0.779427 0.585434 0 \r\n0.52871 -0.28782 -0.0435416 0 \r\n0.539782 -0.292414 -0.0670494 0 \r\n0.130535 -0.954103 0.0851141 0 \r\n-0.127725 -0.101879 0.820724 0 \r\n-0.143719 -0.0814851 0.829358 0 \r\n-0.139166 -0.0889761 0.814047 0 \r\n-0.220266 0.348285 -0.0192582 0 \r\n-0.208968 0.379052 -0.00751555 0 \r\n-0.172976 0.409036 0.0614502 0 \r\n-0.161357 0.407998 0.0822865 0 \r\n-0.174105 0.380661 0.0781047 0 \r\n-0.486116 -0.738717 0.713487 0 \r\n-0.491304 -0.725146 0.69458 0 \r\n-0.515141 -0.729226 0.718966 0 \r\n0.106808 0.0914586 0.259821 0 \r\n0.119411 0.0700049 0.255903 0 \r\n0.0895137 0.0718987 0.253184 0 \r\n0.619745 0.185492 -0.965206 0 \r\n0.0320274 0.729917 -0.887002 0 \r\n0.026121 0.752876 -0.872573 0 \r\n0.574834 -0.221373 -0.815289 0 \r\n0.558481 -0.226681 -0.811183 0 \r\n0.565423 -0.209067 -0.80015 0 \r\n0.663622 -0.67277 0.2652 0 \r\n0.643278 -0.663212 0.286058 0 \r\n0.1826 -0.0664598 0.222776 0 \r\n0.187187 -0.0966122 0.216908 0 \r\n-0.242142 -0.0880455 0.832196 0 \r\n-0.233415 -0.0991687 0.815619 0 \r\n-0.246269 -0.0772732 0.821201 0 \r\n0.675031 0.0228482 -0.849124 0 \r\n0.686653 -0.0020728 -0.857492 0 \r\n-0.294748 0.160816 -0.901752 0 \r\n-0.299628 0.139674 -0.889223 0 \r\n0.568929 0.621787 -0.267605 0 \r\n0.462263 -0.779608 -0.0684408 0 \r\n0.459228 -0.793732 -0.0891568 0 \r\n0.484153 -0.271787 0.031593 0 \r\n0.111984 -0.0689304 0.219382 0 \r\n0.101141 -0.0846785 0.21367 0 \r\n-0.231766 -0.0400159 0.746806 0 \r\n-0.235595 -0.046576 0.757208 0 \r\n-0.221639 -0.0554143 0.737794 0 \r\n-0.150195 0.650588 -0.152353 0 \r\n-0.138938 0.667544 -0.159992 0 \r\n-0.00143671 -0.537579 -0.791957 0 \r\n0.0157553 -0.537346 -0.783138 0 \r\n-0.372108 0.0550937 -0.757569 0 \r\n-0.37126 0.0805424 -0.761386 0 \r\n-0.385356 0.0517057 -0.736652 0 \r\n-0.307433 0.478024 -0.686559 0 \r\n-0.29939 0.483182 -0.708776 0 \r\n-0.293205 0.504413 -0.684344 0 \r\n-0.44229 0.161672 -0.417305 0 \r\n-0.440946 0.163125 -0.432784 0 \r\n0.742598 0.0635713 -0.219503 0 \r\n-0.257237 -0.146672 -0.697874 0 \r\n-0.254876 -0.146842 -0.713174 0 \r\n0.493455 -0.787585 -0.331556 0 \r\n0.506219 -0.782054 -0.311599 0 \r\n0.344711 -0.0862813 0.175681 0 \r\n0.359317 -0.099755 0.164889 0 \r\n0.340494 -0.107906 0.170622 0 \r\n0.115864 -0.824579 0.567695 0 \r\n0.10858 -0.829278 0.56355 0 \r\n0.0990702 -0.817738 0.564525 0 \r\n0.586767 -0.238538 -0.842592 0 \r\n0.586129 -0.228924 -0.828238 0 \r\n-0.0609597 -0.0619797 0.60833 0 \r\n0.0483577 0.408495 -0.966542 0 \r\n0.0365434 0.433176 -0.965516 0 \r\n-0.268556 0.552876 -0.305391 0 \r\n-0.277586 0.537379 -0.309785 0 \r\n0.428851 -0.532241 -0.79577 0 \r\n0.429644 -0.55169 -0.807217 0 \r\n0.414904 -0.538288 -0.804888 0 \r\n0.429977 0.511468 -0.938657 0 \r\n0.302359 -0.954419 0.403672 0 \r\n0.287064 -0.958806 0.412875 0 \r\n0.477953 -0.393138 0.0375113 0 \r\n0.663005 0.0437105 -0.835204 0 \r\n-0.171356 0.653794 -0.561082 0 \r\n-0.145011 0.672924 -0.572946 0 \r\n0.510379 -0.791138 -0.0108137 0 \r\n-0.0842298 -0.678545 0.195241 0 \r\n0.113634 -0.175556 -0.927065 0 \r\n0.090913 -0.176162 -0.922652 0 \r\n-0.600494 -0.736511 0.89597 0 \r\n0.0750126 -0.426459 0.414027 0 \r\n0.0871545 -0.43387 0.407174 0 \r\n-0.0819573 -0.135273 0.846774 0 \r\n-0.0746251 -0.14894 0.824153 0 \r\n0.627319 -0.474877 -0.933613 0 \r\n0.630531 -0.478889 -0.919294 0 \r\n-0.22813 -0.781023 0.635143 0 \r\n-0.199782 -0.777894 0.62735 0 \r\n0.242959 -0.434231 -0.767972 0 \r\n-0.35291 -0.188811 -0.293779 0 \r\n-0.570275 -0.653569 0.536845 0 \r\n-0.542219 -0.653515 0.526832 0 \r\n-0.366117 0.382259 -0.337514 0 \r\n-0.363656 0.379758 -0.308096 0 \r\n-0.141175 -0.164308 0.636595 0 \r\n-0.127959 -0.172452 0.621098 0 \r\n-0.017909 0.542676 0.136266 0 \r\n-0.0297737 0.517586 0.147073 0 \r\n-0.0375988 0.537618 0.127835 0 \r\n-0.0340302 0.413923 0.202085 0 \r\n-0.0682497 0.502472 -0.901007 0 \r\n-0.0659856 0.491789 -0.913535 0 \r\n0.737213 0.235222 -0.634578 0 \r\n-0.0790363 -0.649514 0.402436 0 \r\n-0.0741094 -0.651673 0.388864 0 \r\n0.1272 -0.847578 0.562341 0 \r\n0.093202 -0.287383 0.560411 0 \r\n0.0803436 -0.265019 0.581018 0 \r\n0.059459 -0.433845 0.412356 0 \r\n0.0536356 -0.452959 0.399749 0 \r\n-0.213651 -0.623069 -0.271344 0 \r\n-0.216824 -0.606593 -0.252344 0 \r\n0.0173144 0.16424 0.25416 0 \r\n0.0200097 0.194903 0.258882 0 \r\n0.071442 0.358563 -0.967041 0 \r\n0.576095 -0.0557901 -0.945493 0 \r\n0.582959 -0.0534298 -0.949698 0 \r\n0.43711 -0.428563 -0.681549 0 \r\n0.43725 -0.429902 -0.692667 0 \r\n-0.183701 -0.232467 -0.513411 0 \r\n-0.200907 -0.225359 -0.500733 0 \r\n-0.198384 -0.234412 -0.488853 0 \r\n0.462902 0.680748 -0.657836 0 \r\n0.0751076 -0.26107 0.224623 0 \r\n0.0540363 -0.262249 0.223471 0 \r\n0.404097 0.796878 -0.600928 0 \r\n0.404289 0.776078 -0.608291 0 \r\n-0.188898 -0.0665864 0.689968 0 \r\n0.539513 0.453198 -0.00561345 0 \r\n0.526811 0.479596 -0.0002368 0 \r\n0.081952 -0.562207 -0.650658 0 \r\n0.100683 -0.57632 -0.649333 0 \r\n0.628362 0.161319 -0.125576 0 \r\n0.634505 0.176433 -0.127547 0 \r\n-0.168788 -0.246889 -0.523984 0 \r\n-0.175777 -0.250003 -0.505533 0 \r\n-0.0295829 0.538116 -0.895328 0 \r\n-0.317621 0.489958 -0.460696 0 \r\n-0.32969 0.46674 -0.471296 0 \r\n0.679649 0.0543102 -0.938143 0 \r\n-0.288484 0.533358 -0.555048 0 \r\n0.128565 -0.896514 -0.00328235 0 \r\n0.124791 -0.892642 -0.0242151 0 \r\n0.101733 -0.891128 -0.0163807 0 \r\n0.0351383 -0.543096 0.56521 0 \r\n-0.208371 -0.173983 -0.64333 0 \r\n-0.207354 -0.182428 -0.623037 0 \r\n0.445474 -0.91804 0.0367434 0 \r\n0.428689 -0.917884 0.038798 0 \r\n-0.191907 -0.363779 -0.877075 0 \r\n0.612382 0.280479 -0.951384 0 \r\n0.61921 0.252914 -0.946172 0 \r\n0.0695789 -0.698009 -0.972512 0 \r\n0.077269 -0.689984 -0.977035 0 \r\n0.0546723 -0.691548 -0.97511 0 \r\n-0.116604 0.119372 -0.896921 0 \r\n-0.0973583 0.135673 -0.895021 0 \r\n0.384537 -0.63061 -0.949852 0 \r\n0.187332 -0.169945 -0.940146 0 \r\n0.0967813 0.203366 0.275795 0 \r\n0.121708 0.206857 0.277429 0 \r\n-0.296189 0.51852 -0.365207 0 \r\n-0.124926 -0.302938 0.73754 0 \r\n-0.124605 -0.30781 0.718877 0 \r\n-0.133908 -0.288386 0.737482 0 \r\n0.216296 0.161822 0.276356 0 \r\n-0.0839522 0.718892 -0.548401 0 \r\n-0.101491 0.708951 -0.539338 0 \r\n-0.445091 -0.786171 0.748109 0 \r\n-0.466536 -0.786903 0.764063 0 \r\n0.438397 0.254694 -0.90961 0 \r\n0.452255 0.238968 -0.907939 0 \r\n0.669371 -0.645997 0.203475 0 \r\n0.684785 -0.655389 0.188855 0 \r\n0.247089 -0.32136 0.228768 0 \r\n0.22785 -0.309489 0.23241 0 \r\n-0.276105 -0.0364278 0.880494 0 \r\n-0.294173 -0.0134108 0.881521 0 \r\n-0.290233 -0.0190282 0.898689 0 \r\n-0.142152 -0.589718 0.482337 0 \r\n-0.11324 -0.590158 0.470201 0 \r\n-0.165058 -0.702619 0.441822 0 \r\n-0.727201 -0.646376 0.819282 0 \r\n-0.730703 -0.635633 0.792007 0 \r\n0.12563 0.575549 0.15042 0 \r\n0.122735 0.549986 0.169632 0 \r\n0.0901371 0.555813 0.160864 0 \r\n-0.00085354 -0.135649 0.585366 0 \r\n0.00542999 -0.161225 0.571326 0 \r\n0.592708 -0.608405 -0.196628 0 \r\n0.585979 -0.611022 -0.182893 0 \r\n0.143158 -0.674045 0.585258 0 \r\n0.167064 -0.665891 0.587748 0 \r\n0.57391 0.555839 -0.653286 0 \r\n0.587955 0.528175 -0.668896 0 \r\n-0.404023 -0.769816 0.700423 0 \r\n-0.394656 -0.779608 0.708885 0 \r\n0.197632 0.797962 -0.245381 0 \r\n-0.0612533 -0.616139 0.332747 0 \r\n-0.0694 -0.631463 0.306993 0 \r\n0.0639314 -0.437479 0.344037 0 \r\n0.0639838 -0.430219 0.330957 0 \r\n-0.170051 0.430074 0.0517066 0 \r\n-0.182799 0.402736 0.0475248 0 \r\n0.498198 -0.530293 0.066182 0 \r\n-0.568385 -0.581956 0.705466 0 \r\n-0.594405 -0.583019 0.690368 0 \r\n-0.569123 -0.584504 0.687472 0 \r\n0.525131 -0.122444 -0.617031 0 \r\n0.532337 -0.109581 -0.624439 0 \r\n0.515433 -0.121429 -0.64364 0 \r\n0.541987 -0.640239 0.490025 0 \r\n0.540841 -0.626395 0.477641 0 \r\n0.547035 -0.572554 0.0862194 0 \r\n0.54662 -0.586765 0.0673753 0 \r\n-0.0804341 -0.687473 0.246896 0 \r\n-0.0766658 -0.706035 0.256593 0 \r\n-0.397308 -0.574515 0.650106 0 \r\n-0.37579 -0.574863 0.651004 0 \r\n-0.394352 -0.575219 0.661204 0 \r\n-0.207612 0.631573 -0.486485 0 \r\n-0.202083 0.632377 -0.515153 0 \r\n0.719412 -0.735707 0.174011 0 \r\n0.716689 -0.7275 0.190317 0 \r\n-0.639709 -0.698965 0.909107 0 \r\n-0.629111 -0.690311 0.90051 0 \r\n-0.617649 -0.706854 0.900261 0 \r\n0.295008 -0.531891 -0.872597 0 \r\n0.313249 -0.541889 -0.876019 0 \r\n0.297114 -0.556385 -0.892672 0 \r\n0.317789 -0.957784 0.455638 0 \r\n0.350102 -0.952086 0.45668 0 \r\n0.589839 0.587062 -0.422975 0 \r\n0.579053 0.603608 -0.410088 0 \r\n0.568946 0.612635 -0.428337 0 \r\n0.532254 0.0308538 0.067697 0 \r\n-0.326551 -0.263352 -0.863841 0 \r\n-0.329316 -0.278184 -0.878868 0 \r\n0.394961 -0.683783 -0.549212 0 \r\n0.409483 -0.655766 -0.55539 0 \r\n0.393062 -0.658067 -0.563061 0 \r\n0.146996 -0.927785 -0.26405 0 \r\n0.159653 -0.931015 -0.253294 0 \r\n0.285985 -0.222183 0.195127 0 \r\n-0.012548 -0.0751175 0.62227 0 \r\n-0.0277129 -0.0611667 0.62089 0 \r\n-0.0193405 -0.0778802 0.6133 0 \r\n0.0759186 -0.768335 -0.528668 0 \r\n0.0538298 -0.750201 -0.53743 0 \r\n0.0124239 -0.238979 0.207465 0 \r\n0.0395749 -0.21013 0.205514 0 \r\n-0.115433 -0.372371 -0.667864 0 \r\n0.232191 -0.248462 -0.966992 0 \r\n0.253107 -0.242404 -0.966387 0 \r\n-0.0403875 -0.749727 0.613757 0 \r\n-0.0720906 -0.751872 0.6286 0 \r\n0.618307 0.0115476 -0.964599 0 \r\n-0.216991 -0.0888769 0.7479 0 \r\n-0.212575 -0.109448 0.750142 0 \r\n0.52761 -0.383074 -0.574378 0 \r\n0.529218 -0.386844 -0.560672 0 \r\n0.536389 -0.378018 -0.562241 0 \r\n0.379017 -0.440328 -0.700611 0 \r\n0.375692 -0.441302 -0.721528 0 \r\n0.0280506 -0.872237 0.336898 0 \r\n0.029055 -0.860796 0.366943 0 \r\n-0.387488 -0.115267 -0.596521 0 \r\n-0.0742636 -0.658744 -0.53609 0 \r\n-0.0579141 -0.654408 -0.549999 0 \r\n0.0238584 -0.824607 -0.444841 0 \r\n0.0433976 -0.844363 -0.42585 0 \r\n0.621243 -0.625669 0.242974 0 \r\n0.599225 -0.613162 0.252411 0 \r\n0.475281 -0.46133 0.181326 0 \r\n0.489331 -0.475662 0.159857 0 \r\n0.492714 -0.480556 0.180491 0 \r\n-0.739925 -0.640468 0.860628 0 \r\n-0.730852 -0.65277 0.85462 0 \r\n0.593513 -0.419975 -0.31512 0 \r\n0.00226825 0.827484 -0.58479 0 \r\n0.395314 -0.939452 0.41947 0 \r\n0.582907 0.427122 -0.865561 0 \r\n0.584895 0.421622 -0.882526 0 \r\n0.458481 -0.934116 0.346361 0 \r\n0.379946 0.729627 -0.125134 0 \r\n-0.0392522 -0.765902 0.563145 0 \r\n-0.053696 -0.767035 0.553121 0 \r\n0.273538 -0.984584 0.231472 0 \r\n-0.281596 0.00119953 -0.977772 0 \r\n-0.298545 -0.029783 -0.978001 0 \r\n-0.253002 -0.359313 -0.969846 0 \r\n-0.234885 -0.373062 -0.967297 0 \r\n-0.235856 -0.366199 -0.97912 0 \r\n-0.238207 0.397247 -0.093741 0 \r\n-0.269195 -0.258908 -0.250075 0 \r\n0.170102 -0.583148 0.586964 0 \r\n0.53546 0.397704 0.012872 0 \r\n0.535974 0.415262 0.0108138 0 \r\n0.549344 0.39358 -0.00778633 0 \r\n0.0929011 -0.950028 0.122979 0 \r\n0.0819023 -0.941505 0.114848 0 \r\n-0.139757 0.44745 0.0850465 0 \r\n-0.140886 0.419075 0.101701 0 \r\n-0.180676 -0.647711 -0.114533 0 \r\n-0.501177 -0.582843 0.659388 0 \r\n0.434947 -0.427257 0.198002 0 \r\n0.414416 -0.413129 0.203283 0 \r\n0.392516 0.756829 -0.481326 0 \r\n0.401041 0.754552 -0.461033 0 \r\n0.120348 0.793344 -0.194765 0 \r\n0.119883 0.789593 -0.169049 0 \r\n0.0555523 0.225172 -0.926143 0 \r\n-0.296356 0.0502685 -0.965753 0 \r\n-0.298072 0.0129178 -0.971819 0 \r\n0.458793 0.68274 -0.127371 0 \r\n0.473927 0.664265 -0.117035 0 \r\n0.450029 0.674024 -0.0964224 0 \r\n0.0686574 -0.408376 0.304227 0 \r\n0.0588079 -0.401055 0.28916 0 \r\n0.0799073 -0.393259 0.443103 0 \r\n0.576578 -0.322083 -0.379181 0 \r\n0.577579 -0.311411 -0.358671 0 \r\n0.575078 -0.305117 -0.378569 0 \r\n-0.0246507 -0.869034 -0.25226 0 \r\n-0.00735549 -0.876 -0.272124 0 \r\n0.150494 0.202929 0.278986 0 \r\n0.177364 0.195562 0.278197 0 \r\n0.00774147 -0.726817 -0.537128 0 \r\n-0.0165373 -0.718922 -0.531644 0 \r\n-0.64792 -0.724684 0.84155 0 \r\n0.511609 -0.532178 0.0933428 0 \r\n0.51437 -0.526299 0.107606 0 \r\n0.211149 -0.221565 -0.965421 0 \r\n0.0315205 -0.270854 0.221063 0 \r\n0.302339 0.805329 -0.489724 0 \r\n0.307647 0.810953 -0.498971 0 \r\n0.318527 0.801973 -0.500544 0 \r\n0.691058 0.0243747 -0.891513 0 \r\n0.690161 0.0132561 -0.874221 0 \r\n-0.188743 0.285807 -0.968943 0 \r\n0.514006 -0.206942 -0.609419 0 \r\n0.509264 -0.186745 -0.601892 0 \r\n0.5064 -0.195424 -0.635775 0 \r\n-0.161781 0.013818 0.745198 0 \r\n-0.177719 0.0087698 0.772094 0 \r\n-0.190179 0.0354455 0.770288 0 \r\n0.759076 0.158289 -0.514212 0 \r\n0.756799 0.1418 -0.518931 0 \r\n-0.124108 -0.627931 0.0364529 0 \r\n-0.128345 -0.638556 0.0160208 0 \r\n-0.0518854 0.313643 0.220488 0 \r\n-0.0288907 0.315733 0.235586 0 \r\n-0.0423918 0.300983 0.227674 0 \r\n0.558527 0.0915985 -0.940061 0 \r\n0.51548 0.365366 0.0654608 0 \r\n0.497969 0.377755 0.0966009 0 \r\n0.111792 -0.788922 0.574777 0 \r\n0.65959 -0.757257 0.38062 0 \r\n0.669412 -0.770335 0.361247 0 \r\n-0.00633395 0.458376 -0.957029 0 \r\n0.675555 0.419983 -0.232572 0 \r\n0.67763 0.410555 -0.22275 0 \r\n-0.397816 -0.789822 0.72528 0 \r\n-0.418724 -0.781608 0.726727 0 \r\n-0.183683 -0.696607 -0.226198 0 \r\n-0.182875 -0.703946 -0.251037 0 \r\n-0.188399 -0.166822 -0.728987 0 \r\n-0.176291 -0.170236 -0.72389 0 \r\n-0.17438 -0.172061 -0.735869 0 \r\n0.259234 0.168469 0.274498 0 \r\n0.239342 0.171618 0.276506 0 \r\n-0.380764 -0.190135 -0.370948 0 \r\n-0.396864 -0.181517 -0.370995 0 \r\n-0.379628 -0.191552 -0.352085 0 \r\n0.0342641 -0.885872 -0.33424 0 \r\n0.0497497 -0.894718 -0.318528 0 \r\n0.0558568 -0.892862 -0.333807 0 \r\n0.333992 0.491971 0.199724 0 \r\n-0.211196 -0.0969335 0.021727 0 \r\n-0.341914 0.436762 -0.368626 0 \r\n-0.336937 0.442459 -0.346 0 \r\n-0.177169 -0.312738 -0.821512 0 \r\n-0.0612087 0.739532 -0.50198 0 \r\n-0.0572287 -0.231273 0.174213 0 \r\n-0.169134 0.609885 -0.117872 0 \r\n0.705694 -0.125308 -0.854933 0 \r\n0.691291 -0.125427 -0.835996 0 \r\n-0.0650304 0.728905 -0.546248 0 \r\n-0.452357 -0.74641 0.699909 0 \r\n0.629861 -0.517599 -0.885938 0 \r\n0.632197 -0.529593 -0.896913 0 \r\n0.626603 -0.534687 -0.880676 0 \r\n0.0327616 0.84722 -0.542978 0 \r\n0.04093 0.833476 -0.531856 0 \r\n-0.167116 -0.776934 0.622722 0 \r\n0.52417 -0.730855 -0.372926 0 \r\n0.143759 -0.859334 0.562258 0 \r\n-0.212197 -0.629812 -0.2788 0 \r\n0.497321 0.301487 0.136717 0 \r\n0.507012 0.298223 0.12369 0 \r\n0.452219 -0.37314 0.0663947 0 \r\n0.461666 -0.386968 0.0568378 0 \r\n-0.199593 0.462537 -0.897104 0 \r\n0.644835 0.433311 -0.683983 0 \r\n0.642438 0.418016 -0.712819 0 \r\n-0.179405 -0.06382 0.977489 0 \r\n-0.162299 -0.074787 0.970719 0 \r\n-0.565099 -0.583173 0.723386 0 \r\n-0.105581 -0.257181 0.836776 0 \r\n-0.120366 -0.250549 0.829248 0 \r\n0.222883 -0.429868 0.393326 0 \r\n0.220175 -0.420175 0.370052 0 \r\n0.245283 -0.425491 0.379888 0 \r\n0.690975 -0.838143 0.195496 0 \r\n0.688563 -0.838217 0.176932 0 \r\n0.682528 -0.854427 0.191293 0 \r\n0.109517 -0.584288 -0.982102 0 \r\n0.100691 -0.60691 -0.982998 0 \r\n0.128465 -0.594989 -0.98193 0 \r\n-0.161517 0.0620201 0.682855 0 \r\n-0.190145 0.0789859 0.697185 0 \r\n-0.169556 0.0622432 0.679617 0 \r\n-0.722656 -0.657785 0.840714 0 \r\n-0.713233 -0.66181 0.825673 0 \r\n-0.0906394 -0.139017 0.807961 0 \r\n0.212927 0.867818 -0.837259 0 \r\n0.653572 0.481335 -0.51075 0 \r\n0.638952 0.498015 -0.524141 0 \r\n-0.171183 -0.173708 -0.708714 0 \r\n-0.190518 -0.167494 -0.697435 0 \r\n-0.17139 -0.176204 -0.689142 0 \r\n-0.152775 -0.300451 -0.953523 0 \r\n-0.122374 -0.309748 -0.957233 0 \r\n-0.177963 -0.355048 -0.860186 0 \r\n-0.174695 -0.362023 -0.872069 0 \r\n0.275411 -0.175003 0.191116 0 \r\n0.574268 -0.0033003 -0.944651 0 \r\n0.568862 0.010607 -0.941231 0 \r\n0.573454 -0.0218351 -0.94326 0 \r\n-0.0600211 -0.564111 -0.58363 0 \r\n-0.0772136 -0.574498 -0.568678 0 \r\n-0.0508668 -0.310126 0.20513 0 \r\n-0.0673314 -0.308361 0.195801 0 \r\n-0.256967 0.109229 -0.98004 0 \r\n-0.250789 0.0967872 -0.980465 0 \r\n0.133325 0.800488 -0.294694 0 \r\n0.0809118 -0.586825 0.569459 0 \r\n-0.329899 -0.781935 0.677356 0 \r\n-0.315206 -0.774363 0.657573 0 \r\n0.138022 -0.433576 0.639553 0 \r\n0.12281 -0.422657 0.662169 0 \r\n0.128704 -0.415735 0.655746 0 \r\n-0.695747 -0.630533 0.64209 0 \r\n-0.718482 -0.620426 0.679561 0 \r\n0.638324 -0.822533 0.381885 0 \r\n0.656774 -0.815203 0.361625 0 \r\n0.447186 -0.841172 -0.199023 0 \r\n0.526962 -0.142718 -0.531924 0 \r\n0.541131 -0.133941 -0.516665 0 \r\n0.575701 -0.218618 -0.306343 0 \r\n0.666755 -0.124838 -0.267594 0 \r\n0.670658 -0.114805 -0.248572 0 \r\n0.683021 -0.114064 -0.269344 0 \r\n0.739485 0.0378892 -0.502942 0 \r\n0.742033 0.0513839 -0.506215 0 \r\n-0.655189 -0.579801 0.696054 0 \r\n-0.642249 -0.582309 0.686175 0 \r\n0.127526 -0.887714 0.527174 0 \r\n0.102761 -0.872424 0.520632 0 \r\n-0.159826 -0.590258 0.0041022 0 \r\n-0.174612 -0.576422 -0.0130131 0 \r\n-0.167966 -0.561727 0.0137032 0 \r\n-0.461798 0.0832298 -0.331744 0 \r\n-0.461459 0.0652678 -0.31728 0 \r\n-0.467075 0.0478196 -0.334975 0 \r\n0.354149 -0.617864 -0.930152 0 \r\n0.33847 -0.606933 -0.930477 0 \r\n-0.156244 0.298581 0.137055 0 \r\n-0.166026 0.281008 0.129101 0 \r\n0.0857147 0.755506 -0.0908857 0 \r\n0.0643698 0.75024 -0.0866905 0 \r\n-0.197307 -0.748832 0.698685 0 \r\n-0.255709 -0.121757 -0.969903 0 \r\n0.536332 0.605366 -0.654531 0 \r\n0.516419 0.622124 -0.66915 0 \r\n0.533743 0.595457 -0.678463 0 \r\n0.0534204 -0.923225 0.120452 0 \r\n0.137841 -0.3717 0.569562 0 \r\n0.130105 -0.36466 0.591307 0 \r\n0.187765 0.309788 -0.966699 0 \r\n0.728305 0.044442 -0.560135 0 \r\n0.731174 0.0626633 -0.570606 0 \r\n0.386193 -0.937975 0.396475 0 \r\n-0.0976502 -0.653497 0.413229 0 \r\n0.531631 -0.568203 -0.0500275 0 \r\n0.540736 -0.556072 -0.0629812 0 \r\n0.505918 -0.185353 -0.736067 0 \r\n0.504984 -0.214617 -0.744362 0 \r\n0.355768 -0.187402 0.156142 0 \r\n0.512699 -0.512243 -0.0055164 0 \r\n-0.134988 -0.055749 0.638095 0 \r\n0.733202 -0.021626 -0.467497 0 \r\n0.726151 -0.023541 -0.481019 0 \r\n0.727199 -0.0447726 -0.456262 0 \r\n0.318666 0.0467976 0.238807 0 \r\n0.301239 0.0583467 0.246912 0 \r\n0.188338 -0.469539 0.58383 0 \r\n0.181535 -0.478626 0.591841 0 \r\n0.421275 -0.573981 -0.826079 0 \r\n0.435762 -0.566664 -0.816069 0 \r\n0.114141 -0.94256 0.0747271 0 \r\n0.397819 -0.0132193 -0.904484 0 \r\n-0.34177 -0.772763 0.75754 0 \r\n-0.364126 -0.763026 0.775118 0 \r\n0.400289 0.64542 -0.858153 0 \r\n0.633094 0.53784 -0.307827 0 \r\n0.636207 0.53315 -0.333804 0 \r\n0.0443787 -0.505147 -0.724238 0 \r\n0.0246273 -0.504654 -0.738164 0 \r\n-0.336616 -0.0627242 -0.817639 0 \r\n-0.335178 -0.0806934 -0.810599 0 \r\n-0.334351 -0.0748519 -0.832314 0 \r\n0.268164 -0.54237 0.586939 0 \r\n0.243078 -0.539073 0.585216 0 \r\n0.265657 -0.523349 0.582586 0 \r\n0.60875 0.169667 -0.112879 0 \r\n0.60724 0.136031 -0.114284 0 \r\n-0.0846091 -0.41658 0.186868 0 \r\n-0.0791389 -0.43713 0.188476 0 \r\n-0.0949759 -0.441162 0.173829 0 \r\n-0.423417 0.233204 -0.386572 0 \r\n-0.419137 0.247409 -0.352644 0 \r\n0.320623 -0.029991 0.209478 0 \r\n0.34163 -0.00653835 0.210007 0 \r\n0.528031 -0.149153 -0.51974 0 \r\n0.519594 -0.157968 -0.543754 0 \r\n0.195224 -0.571557 -0.849594 0 \r\n0.215198 -0.559055 -0.858323 0 \r\n0.252635 -0.932271 -0.24984 0 \r\n-0.21402 0.630763 -0.275371 0 \r\n-0.206594 0.641653 -0.285316 0 \r\n0.648674 -0.64816 0.245863 0 \r\n0.634728 -0.645241 0.261413 0 \r\n0.635226 -0.636764 0.24399 0 \r\n-0.389074 0.258517 -0.606513 0 \r\n-0.390759 0.235056 -0.623751 0 \r\n0.711863 0.232597 -0.714378 0 \r\n0.70091 0.224129 -0.733794 0 \r\n0.61013 -0.49506 -0.851127 0 \r\n0.596879 -0.477823 -0.841411 0 \r\n0.1724 0.331346 0.275759 0 \r\n0.299464 0.881447 -0.809664 0 \r\n0.315989 0.883689 -0.799077 0 \r\n0.00494698 -0.843237 0.361569 0 \r\n0.0244089 -0.845911 0.392268 0 \r\n0.722883 0.180568 -0.18147 0 \r\n0.733752 0.197342 -0.201185 0 \r\n0.188123 -0.675851 -0.94788 0 \r\n0.176597 -0.682043 -0.954751 0 \r\n0.168357 -0.69196 -0.945847 0 \r\n-0.0268107 0.748273 -0.163505 0 \r\n-0.0223741 0.740309 -0.131907 0 \r\n-0.0472557 0.736179 -0.158648 0 \r\n0.166021 0.0358865 -0.907313 0 \r\n0.39784 0.580577 -0.891881 0 \r\n0.41093 0.563808 -0.895896 0 \r\n-0.36221 0.377558 -0.291954 0 \r\n-0.35684 0.393922 -0.306087 0 \r\n0.760612 -0.0021568 -0.327146 0 \r\n0.759388 -0.00814409 -0.346862 0 \r\n-0.198608 -0.665561 -0.33937 0 \r\n0.132574 -0.128491 -0.917662 0 \r\n-0.250604 -0.356216 -0.903621 0 \r\n-0.246979 -0.363265 -0.920249 0 \r\n-0.312276 -0.74371 0.547382 0 \r\n-0.291727 -0.745124 0.536798 0 \r\n0.205651 0.993624 -0.634238 0 \r\n0.231496 0.994823 -0.622033 0 \r\n0.44605 0.165408 -0.899357 0 \r\n-0.102782 -0.34413 0.693179 0 \r\n-0.104088 -0.334595 0.721928 0 \r\n0.102691 0.597739 -0.95953 0 \r\n0.124455 0.612547 -0.95752 0 \r\n0.743237 0.0898812 -0.545728 0 \r\n0.639802 -0.89505 0.107206 0 \r\n0.63177 -0.891334 0.0857626 0 \r\n0.627527 -0.906067 0.0953455 0 \r\n-0.636418 -0.608793 0.611101 0 \r\n-0.305288 -0.017631 -0.971676 0 \r\n-0.0327648 -0.788599 0.384615 0 \r\n-0.0313572 -0.783772 0.404465 0 \r\n-0.0237704 -0.79826 0.39538 0 \r\n0.0650443 0.129588 0.261963 0 \r\n0.34412 0.0198572 0.219797 0 \r\n0.363203 0.0156546 0.209904 0 \r\n0.515568 -0.0061446 -0.915315 0 \r\n0.528466 -0.0369782 -0.919476 0 \r\n0.526708 -0.0007166 -0.918356 0 \r\n0.307143 -0.461008 0.483405 0 \r\n0.318713 -0.461026 0.463664 0 \r\n0.328711 -0.464931 0.481055 0 \r\n-0.216468 0.620459 -0.260607 0 \r\n-0.232145 0.606529 -0.275532 0 \r\n0.122173 0.658625 0.0608951 0 \r\n-0.00569894 -0.81835 0.397233 0 \r\n-0.00137599 -0.812329 0.426018 0 \r\n0.00462377 -0.82233 0.415677 0 \r\n0.403827 -0.648216 0.587052 0 \r\n0.408248 -0.675445 0.584837 0 \r\n0.389206 -0.67633 0.588692 0 \r\n0.528005 0.0385637 -0.920748 0 \r\n0.53076 0.0752241 -0.923532 0 \r\n0.526043 -0.520674 0.203989 0 \r\n0.527636 -0.516142 0.186769 0 \r\n0.25001 -0.935577 -0.136566 0 \r\n0.234648 -0.937272 -0.142938 0 \r\n-0.245811 0.030418 0.927203 0 \r\n-0.230682 0.0180854 0.926077 0 \r\n-0.759746 -0.605573 0.81882 0 \r\n0.5644 -0.528875 -0.0985851 0 \r\n0.552441 -0.538227 -0.0791901 0 \r\n-0.0055598 -0.607664 0.541821 0 \r\n-0.0020567 -0.614398 0.553676 0 \r\n-0.0218947 -0.608262 0.549987 0 \r\n0.346517 0.947775 -0.657416 0 \r\n0.361605 0.939058 -0.645224 0 \r\n0.692386 0.423277 -0.308813 0 \r\n0.702897 0.400682 -0.322531 0 \r\n-0.670419 -0.572853 0.719796 0 \r\n0.226017 -0.56317 -0.871848 0 \r\n0.240444 -0.551154 -0.87666 0 \r\n0.234289 -0.582018 -0.892296 0 \r\n0.297332 -0.457745 -0.970396 0 \r\n0.311849 -0.419381 -0.968498 0 \r\n0.544104 -0.557501 0.100347 0 \r\n0.530609 -0.539479 0.115746 0 \r\n0.666916 -0.129882 -0.357615 0 \r\n0.130359 0.97384 -0.691594 0 \r\n0.125975 0.966084 -0.711741 0 \r\n0.258756 -0.725169 0.593704 0 \r\n0.246243 -0.742428 0.591213 0 \r\n0.221716 -0.723161 0.592443 0 \r\n0.55929 -0.0851185 -0.938494 0 \r\n0.565848 -0.067457 -0.938895 0 \r\n0.71603 -0.75466 0.231845 0 \r\n0.576505 0.00224185 -0.0612172 0 \r\n-0.0579587 0.753368 -0.413092 0 \r\n-0.063007 0.754235 -0.383242 0 \r\n0.0265387 -0.478105 0.410546 0 \r\n0.0190276 -0.469897 0.429327 0 \r\n0.538506 -0.975632 0.0956932 0 \r\n0.0355435 -0.873948 -0.368147 0 \r\n0.0558802 -0.883516 -0.360105 0 \r\n0.0510525 -0.873448 -0.378732 0 \r\n0.69802 0.387084 -0.575517 0 \r\n0.712988 0.357396 -0.568392 0 \r\n0.241086 0.413373 0.251436 0 \r\n0.159858 -0.338134 0.255011 0 \r\n0.145984 -0.345367 0.258191 0 \r\n0.503013 0.678714 -0.217623 0 \r\n0.524523 0.661551 -0.242114 0 \r\n0.531781 0.65119 -0.224336 0 \r\n0.269772 -0.533432 -0.973682 0 \r\n0.231937 -0.529729 -0.975621 0 \r\n0.24496 -0.557256 -0.975444 0 \r\n0.520041 0.664804 -0.488086 0 \r\n0.52308 0.658557 -0.511036 0 \r\n0.535953 0.645887 -0.492128 0 \r\n0.628425 0.513305 -0.219797 0 \r\n-0.015649 0.89064 -0.704538 0 \r\n-0.0245211 0.881317 -0.695478 0 \r\n0.412217 0.619676 -0.847123 0 \r\n0.412243 0.63384 -0.841524 0 \r\n0.460785 0.304112 0.182992 0 \r\n0.441754 0.294804 0.204513 0 \r\n0.448893 0.311936 0.191895 0 \r\n-0.184734 -0.188195 0.770393 0 \r\n0.284559 0.803342 -0.47723 0 \r\n0.299698 0.796945 -0.473601 0 \r\n0.634759 0.417077 -0.728987 0 \r\n-0.159088 -0.183244 -0.679273 0 \r\n0.349941 0.185429 0.261268 0 \r\n0.365346 0.17527 0.256069 0 \r\n0.572551 -0.288297 -0.165289 0 \r\n0.555653 -0.131914 -0.0598225 0 \r\n0.398955 -0.850988 -0.356884 0 \r\n0.00898145 -0.345236 0.785303 0 \r\n0.00770765 -0.322817 0.797589 0 \r\n-0.00675525 0.209924 -0.908909 0 \r\n-0.00582965 0.182228 -0.903081 0 \r\n0.589024 -0.39209 -0.212379 0 \r\n0.589745 -0.403103 -0.204601 0 \r\n-0.0398583 0.72738 -0.601803 0 \r\n-0.0335799 0.731941 -0.608579 0 \r\n-0.180882 -0.198215 0.0571854 0 \r\n-0.063986 0.667387 -0.732022 0 \r\n-0.057621 0.688856 -0.706141 0 \r\n-0.171406 0.619609 -0.68988 0 \r\n0.659767 0.105814 -0.139531 0 \r\n0.650501 0.0902236 -0.138018 0 \r\n0.518028 -0.688797 -0.0117845 0 \r\n0.521659 -0.66919 -0.00452132 0 \r\n0.00843303 -0.236726 0.818321 0 \r\n0.0224773 -0.248261 0.789049 0 \r\n0.0336975 -0.268008 0.778403 0 \r\n-0.250497 -0.0649147 0.901838 0 \r\n-0.273601 -0.035374 0.914783 0 \r\n-0.101306 -0.112071 0.938976 0 \r\n-0.0433505 0.630198 -0.832126 0 \r\n0.681579 -0.841596 0.156962 0 \r\n0.143183 -0.649925 -0.629745 0 \r\n-0.456616 0.108253 -0.344171 0 \r\n-0.452081 0.124762 -0.324215 0 \r\n0.406012 -0.414196 0.228011 0 \r\n0.751984 0.239673 -0.531941 0 \r\n0.0116726 -0.517663 -0.658689 0 \r\n-0.00083175 -0.512552 -0.662713 0 \r\n0.525047 -0.478332 -0.512469 0 \r\n0.515869 -0.500385 -0.520336 0 \r\n-0.429734 0.100637 -0.215234 0 \r\n-0.437758 0.0939076 -0.233127 0 \r\n-0.0781667 -0.127324 0.891109 0 \r\n-0.0709534 -0.132089 0.900495 0 \r\n0.507837 -0.585532 0.481704 0 \r\n0.507033 -0.583383 0.472338 0 \r\n0.517509 -0.596708 0.48009 0 \r\n-0.232426 -0.550435 -0.213873 0 \r\n-0.278054 0.337696 -0.895443 0 \r\n-0.276226 0.360364 -0.892004 0 \r\n-0.220392 0.0116664 0.0274512 0 \r\n-0.201937 0.0101826 0.051691 0 \r\n-0.200783 -0.0741711 0.708521 0 \r\n-0.212313 -0.0713155 0.727957 0 \r\n0.733965 0.00882785 -0.222915 0 \r\n0.742463 -0.0021849 -0.244502 0 \r\n-0.0955211 -0.669156 0.0635462 0 \r\n-0.385599 -0.108263 -0.222321 0 \r\n0.038669 0.704489 -0.900936 0 \r\n0.0231995 0.670557 -0.903779 0 \r\n0.0406722 0.669214 -0.913143 0 \r\n-0.332149 -0.297597 -0.900937 0 \r\n0.500699 -0.936649 0.0450084 0 \r\n0.522645 -0.931877 0.0439396 0 \r\n0.674963 0.218012 -0.14599 0 \r\n0.676961 0.199116 -0.146073 0 \r\n-0.265693 -0.790198 0.683244 0 \r\n0.049155 -0.856756 -0.407667 0 \r\n0.0249583 -0.851487 -0.404958 0 \r\n0.386675 -0.618989 -0.584561 0 \r\n0.358041 -0.638816 -0.589669 0 \r\n0.37895 -0.649878 -0.574347 0 \r\n-0.281827 0.547428 -0.448147 0 \r\n-0.271251 0.563025 -0.42015 0 \r\n-0.186372 0.541306 -0.795904 0 \r\n-0.0907484 0.0358813 0.165906 0 \r\n-0.106314 0.0144951 0.148225 0 \r\n-0.111381 0.034548 0.148977 0 \r\n0.195995 0.155171 -0.918856 0 \r\n0.486342 -0.641037 -0.886536 0 \r\n0.429235 0.233727 -0.900483 0 \r\n0.482653 -0.538899 0.319932 0 \r\n-0.617869 -0.682955 0.890398 0 \r\n0.601574 -0.0674362 -0.630638 0 \r\n0.583135 -0.071621 -0.655557 0 \r\n-0.269367 -0.224948 -0.187018 0 \r\n0.568178 0.292158 -0.033868 0 \r\n0.558222 0.318536 -0.0161172 0 \r\n0.450693 -0.889151 0.500086 0 \r\n-0.603603 -0.732908 0.802238 0 \r\n-0.580922 -0.751474 0.804474 0 \r\n-0.0240915 -0.82852 -0.406845 0 \r\n-0.0238518 -0.815902 -0.427182 0 \r\n0.668369 -0.811013 0.0838897 0 \r\n0.590762 -0.636522 -0.275744 0 \r\n0.592547 -0.628277 -0.248711 0 \r\n0.144644 -0.595614 -0.825665 0 \r\n-0.435528 -0.587961 0.707806 0 \r\n-0.424024 -0.582224 0.693154 0 \r\n-0.0792366 0.0489455 0.176942 0 \r\n-0.0789465 0.0709181 0.182458 0 \r\n-0.0623683 0.0639293 0.19274 0 \r\n0.312046 -0.383001 0.263887 0 \r\n-0.107825 -0.130124 0.604978 0 \r\n0.370072 0.437239 -0.96331 0 \r\n0.24763 -0.914258 0.0198191 0 \r\n0.262155 -0.901304 0.0105544 0 \r\n0.235842 -0.908525 0.0106997 0 \r\n0.629 0.213181 -0.955448 0 \r\n0.625566 0.216839 -0.959464 0 \r\n-0.426664 0.0757899 -0.629063 0 \r\n0.229564 0.459611 -0.955836 0 \r\n-0.368786 0.263223 -0.691339 0 \r\n-0.362658 0.281185 -0.704249 0 \r\n-0.367939 0.291816 -0.675342 0 \r\n0.590881 -0.188432 -0.79792 0 \r\n0.568038 -0.189453 -0.78863 0 \r\n0.577143 -0.174126 -0.782295 0 \r\n0.308306 -0.443449 0.398229 0 \r\n0.428524 -0.934786 0.438039 0 \r\n0.568614 -0.0474093 -0.940083 0 \r\n0.568955 -0.0299719 -0.940017 0 \r\n-0.0962363 0.382845 0.166409 0 \r\n0.625618 0.453805 -0.148345 0 \r\n0.470316 0.239694 0.181279 0 \r\n0.486405 0.255513 0.160786 0 \r\n0.122359 0.756539 -0.0829977 0 \r\n-0.29337 -0.784922 0.665313 0 \r\n-0.26683 -0.782475 0.652742 0 \r\n-0.326878 0.0759403 0.912438 0 \r\n-0.31314 0.0716496 0.918529 0 \r\n0.135637 -0.922351 -0.123115 0 \r\n0.153997 -0.924295 -0.113679 0 \r\n0.150319 -0.928586 -0.135367 0 \r\n-0.0170473 0.589023 -0.891597 0 \r\n-0.476567 -0.0120955 -0.40716 0 \r\n0.0851039 0.178622 -0.915281 0 \r\n0.0551954 0.166705 -0.908842 0 \r\n0.15281 -0.414163 0.472251 0 \r\n0.166934 -0.426196 0.47429 0 \r\n0.0713388 -0.155443 0.203782 0 \r\n0.0555398 -0.146071 0.2003 0 \r\n0.0800146 -0.136417 0.204747 0 \r\n0.130655 -0.564448 0.592137 0 \r\n0.130447 -0.583418 0.585122 0 \r\n-0.17955 -0.362315 -0.494327 0 \r\n0.489108 0.0284413 -0.909128 0 \r\n0.406992 -0.936607 0.403791 0 \r\n0.0816946 -0.570331 0.577932 0 \r\n0.544675 0.64774 -0.394846 0 \r\n0.585626 -0.643454 -0.308039 0 \r\n0.0518354 0.953689 -0.66126 0 \r\n0.0700013 0.961311 -0.670811 0 \r\n-0.249386 -0.347834 -0.882184 0 \r\n0.765831 0.199868 -0.423742 0 \r\n0.767009 0.18327 -0.429575 0 \r\n0.0312067 -0.734255 -0.543685 0 \r\n0.420415 0.707514 -0.120965 0 \r\n0.410681 0.697614 -0.0864629 0 \r\n0.396201 0.712629 -0.100669 0 \r\n0.739242 0.304071 -0.308263 0 \r\n0.730058 0.331553 -0.299403 0 \r\n0.739066 0.309213 -0.323406 0 \r\n0.742552 -0.0599427 -0.368911 0 \r\n0.735662 -0.0739003 -0.357529 0 \r\n0.389175 0.783596 -0.580639 0 \r\n0.363504 0.602134 0.100275 0 \r\n0.361699 0.628169 0.0692794 0 \r\n0.496455 -0.514385 0.035091 0 \r\n0.50184 -0.534183 0.0166621 0 \r\n-0.358153 0.37555 -0.608967 0 \r\n-0.286808 0.0195294 -0.131399 0 \r\n0.441785 0.75741 -0.747691 0 \r\n0.436638 0.78234 -0.747792 0 \r\n-0.208939 -0.00075335 0.892229 0 \r\n-0.217009 0.0061004 0.908001 0 \r\n0.603526 -0.9374 0.0886113 0 \r\n0.508922 0.677562 -0.487636 0 \r\n-0.216143 -0.0778757 0.738359 0 \r\n-0.226316 -0.0729758 0.757738 0 \r\n-0.24111 -0.533558 -0.24979 0 \r\n-0.236398 -0.547181 -0.237529 0 \r\n-0.236604 -0.55035 -0.263525 0 \r\n0.0311273 -0.537853 -0.776849 0 \r\n0.286369 -0.445059 -0.697099 0 \r\n-0.11864 -0.415516 -0.882349 0 \r\n0.573251 -0.472619 -0.106977 0 \r\n-0.154857 0.0469273 0.666615 0 \r\n0.360795 -0.39539 0.246776 0 \r\n0.564084 -0.105878 -0.571983 0 \r\n0.567124 -0.113881 -0.536454 0 \r\n0.754573 0.254398 -0.329172 0 \r\n0.755652 0.253376 -0.348926 0 \r\n0.761977 0.226043 -0.345832 0 \r\n0.0343201 -0.667614 -0.975981 0 \r\n0.0420103 -0.659588 -0.980503 0 \r\n0.300715 0.715016 -0.0256606 0 \r\n0.284963 0.710227 -0.0132444 0 \r\n-0.438901 -0.138849 -0.432935 0 \r\n0.663922 -0.0715391 -0.20134 0 \r\n0.673422 -0.0475613 -0.190992 0 \r\n-0.246063 -0.0599246 0.790284 0 \r\n-0.236443 -0.0575774 0.76675 0 \r\n0.652705 -0.0254648 -0.168546 0 \r\n0.274482 -0.897195 -0.0498822 0 \r\n0.146336 -0.917737 0.422246 0 \r\n0.172919 -0.931153 0.425447 0 \r\n0.164901 -0.927835 0.402504 0 \r\n-0.461537 -0.717315 0.63053 0 \r\n-0.40981 -0.770352 0.795166 0 \r\n-0.449252 -0.774084 0.813305 0 \r\n0.455545 0.368904 -0.953917 0 \r\n0.478124 0.369662 -0.95663 0 \r\n0.617482 -0.0830084 -0.554145 0 \r\n0.716003 0.308906 -0.663505 0 \r\n0.718161 0.312196 -0.64699 0 \r\n0.710799 0.329328 -0.656998 0 \r\n0.0547662 -0.529577 -0.767773 0 \r\n0.448052 -0.813488 -0.110325 0 \r\n0.43516 -0.831304 -0.12402 0 \r\n0.563492 -0.232888 -0.118795 0 \r\n0.571249 -0.24615 -0.144956 0 \r\n0.289321 -0.953773 0.380412 0 \r\n0.315953 -0.951086 0.387593 0 \r\n0.600688 -0.580206 0.168496 0 \r\n0.603785 -0.586712 0.186696 0 \r\n-0.237792 0.0773775 0.797952 0 \r\n-0.202744 -0.201766 -0.567316 0 \r\n0.762604 0.184615 -0.299761 0 \r\n0.7658 0.176293 -0.324432 0 \r\n0.569574 -0.553207 -0.831818 0 \r\n0.005497 -0.64947 -0.587968 0 \r\n-0.0356723 -0.789494 0.0666592 0 \r\n-0.0471541 -0.768029 0.0676814 0 \r\n-0.0495723 -0.772848 0.0876667 0 \r\n0.199711 -0.0232509 0.234304 0 \r\n0.217876 -0.00356597 0.238496 0 \r\n0.227855 -0.021861 0.233048 0 \r\n0.587691 -0.960225 0.1237 0 \r\n0.599022 -0.951862 0.140391 0 \r\n0.594441 -0.41816 -0.28912 0 \r\n0.594929 -0.425822 -0.265029 0 \r\n0.489393 0.344223 -0.949062 0 \r\n0.104535 -0.469396 0.653717 0 \r\n-0.233049 -0.536504 -0.374635 0 \r\n-0.234625 -0.549913 -0.353365 0 \r\n-0.324477 -0.0523745 -0.175419 0 \r\n-0.188471 -0.372145 0.0571957 0 \r\n0.597658 0.382206 -0.0740495 0 \r\n0.59097 0.367591 -0.0646264 0 \r\n-0.112578 0.0592391 0.152734 0 \r\n-0.128145 0.037853 0.135051 0 \r\n0.54714 -0.616889 0.358513 0 \r\n-0.0320753 -0.146649 -0.908666 0 \r\n-0.0691064 -0.17383 -0.908289 0 \r\n0.306157 -0.729299 -0.555564 0 \r\n0.282898 -0.75348 -0.541209 0 \r\n-0.046188 -0.634653 -0.566377 0 \r\n0.293664 -0.271264 -0.965667 0 \r\n0.301753 -0.266534 -0.966007 0 \r\n0.291433 -0.264796 -0.965839 0 \r\n0.556852 -0.387632 -0.824039 0 \r\n-0.340018 0.15337 -0.802835 0 \r\n-0.0155229 0.687959 -0.0166459 0 \r\n-0.00443969 0.701334 -0.0277987 0 \r\n0.584661 -0.51531 -0.404363 0 \r\n-0.0588812 -0.1619 0.569999 0 \r\n-0.724728 -0.580166 0.840912 0 \r\n-0.707236 -0.582247 0.84155 0 \r\n-0.322788 0.0179453 -0.864771 0 \r\n-0.21848 -0.700276 0.451196 0 \r\n-0.245264 -0.708017 0.461578 0 \r\n0.537743 -0.742 -0.220374 0 \r\n0.524472 -0.760967 -0.214749 0 \r\n-0.147649 -0.768661 0.648715 0 \r\n-0.159141 -0.773532 0.644077 0 \r\n-0.267789 0.44884 -0.170353 0 \r\n0.204531 -0.488719 -0.810349 0 \r\n0.210255 -0.50432 -0.824614 0 \r\n0.494519 0.681578 -0.194889 0 \r\n0.650366 0.443605 -0.649029 0 \r\n0.651621 0.450044 -0.631977 0 \r\n-0.591224 -0.778873 0.856897 0 \r\n-0.341802 0.444155 -0.416168 0 \r\n0.509441 -0.405064 -0.753834 0 \r\n0.508605 -0.391736 -0.735184 0 \r\n0.577148 0.513352 -0.72069 0 \r\n-0.0152671 -0.409807 -0.981694 0 \r\n-0.0184673 -0.373066 -0.979061 0 \r\n0.541505 0.63493 -0.211173 0 \r\n0.558698 0.617243 -0.217826 0 \r\n0.546911 0.618145 -0.180171 0 \r\n0.266021 0.924703 -0.4728 0 \r\n0.276128 0.93951 -0.481712 0 \r\n-0.0600994 -0.493173 -0.6261 0 \r\n-0.0660821 -0.496614 -0.609259 0 \r\n0.132425 -0.930964 0.0392546 0 \r\n0.114502 -0.915794 0.0315656 0 \r\n0.0219652 0.607997 0.095745 0 \r\n0.0104223 0.579632 0.118382 0 \r\n-0.16783 -0.765399 0.559404 0 \r\n0.583193 -0.0483774 -0.0968976 0 \r\n0.578964 -0.0570476 -0.087759 0 \r\n0.104485 -0.595228 0.576313 0 \r\n0.0919675 -0.582968 0.578502 0 \r\n-0.144425 -0.257134 -0.576177 0 \r\n-0.155594 -0.239734 -0.563671 0 \r\n-0.404606 -0.791706 0.768695 0 \r\n-0.38008 -0.783291 0.765982 0 \r\n0.455404 0.724802 -0.31949 0 \r\n0.44026 0.736735 -0.34621 0 \r\n0.506706 -0.228395 -0.741624 0 \r\n0.513202 -0.246128 -0.750547 0 \r\n0.50693 -0.239707 -0.730965 0 \r\n-0.117824 0.0826851 0.152791 0 \r\n-0.10106 0.0793801 0.166716 0 \r\n-0.144164 -0.388451 -0.56653 0 \r\n-0.13555 -0.415324 -0.573302 0 \r\n-0.307514 0.0286695 0.830405 0 \r\n-0.317706 0.0490856 0.825207 0 \r\n0.504086 -0.581 0.494623 0 \r\n0.491578 -0.570754 0.508455 0 \r\n-0.221465 0.098302 0.0391768 0 \r\n-0.20891 0.0985406 0.0554733 0 \r\n0.0085046 -0.851933 -0.391406 0 \r\n-0.0925176 -0.428569 -0.690829 0 \r\n-0.0859611 -0.43857 -0.688887 0 \r\n0.162396 -0.575125 -0.826097 0 \r\n0.175676 -0.580577 -0.839494 0 \r\n0.169537 -0.933373 -0.149678 0 \r\n0.151177 -0.931428 -0.159113 0 \r\n0.330626 -0.88107 0.0104454 0 \r\n0.312804 -0.89669 0.0192169 0 \r\n0.340649 -0.889094 0.0186124 0 \r\n0.68257 -0.777097 0.0845693 0 \r\n0.676618 -0.794047 0.086349 0 \r\n0.684209 -0.7887 0.0983444 0 \r\n-0.164064 -0.179236 -0.73939 0 \r\n0.741763 0.204746 -0.626074 0 \r\n-0.273953 -0.343581 -0.978979 0 \r\n0.113098 -0.206631 -0.941926 0 \r\n0.114395 -0.193231 -0.934834 0 \r\n-0.325853 0.446251 -0.296723 0 \r\n-0.313996 0.466812 -0.297288 0 \r\n0.183652 0.696779 0.016246 0 \r\n0.201853 0.704956 0.00422312 0 \r\n0.211701 0.691763 0.0230915 0 \r\n-0.312006 0.0488054 0.953986 0 \r\n-0.29484 0.040447 0.956949 0 \r\n-0.0705419 -0.725047 0.274042 0 \r\n0.301104 -0.0109562 0.223029 0 \r\n0.288403 0.00482405 0.232529 0 \r\n0.309846 0.0134445 0.229401 0 \r\n0.079832 -0.00104545 -0.906841 0 \r\n0.0589537 0.00790646 -0.906224 0 \r\n0.437463 0.608096 -0.820654 0 \r\n0.445251 0.588333 -0.838276 0 \r\n0.454512 0.601024 -0.811507 0 \r\n-0.0174209 -0.638731 0.59291 0 \r\n0.00283019 -0.596073 0.518411 0 \r\n-0.0502779 -0.824548 -0.103607 0 \r\n-0.699167 -0.674944 0.83303 0 \r\n0.075243 -0.673482 0.584074 0 \r\n0.0933554 -0.665623 0.578782 0 \r\n0.0363566 -0.46553 0.362585 0 \r\n0.0275271 -0.461716 0.342439 0 \r\n0.050475 -0.446379 0.351047 0 \r\n-0.368329 0.0130901 -0.763295 0 \r\n-0.163054 -0.290718 0.0941055 0 \r\n-0.152353 -0.276602 0.105546 0 \r\n0.119319 -0.428093 0.664892 0 \r\n0.474809 -0.557056 0.513581 0 \r\n0.384091 0.759958 -0.538691 0 \r\n0.370502 0.766916 -0.516384 0 \r\n0.123911 0.520221 -0.963464 0 \r\n0.152996 0.54693 -0.963192 0 \r\n0.116352 0.547298 -0.963287 0 \r\n0.105709 0.231206 -0.944147 0 \r\n0.0684971 -0.416855 0.316762 0 \r\n0.632777 -0.789304 0.030612 0 \r\n0.673147 0.445048 -0.266333 0 \r\n0.663736 0.448622 -0.238921 0 \r\n0.66398 0.456363 -0.254147 0 \r\n-0.344679 0.266154 -0.765743 0 \r\n0.541681 -0.228288 -0.797848 0 \r\n0.530988 -0.225237 -0.788018 0 \r\n0.538376 -0.211325 -0.786213 0 \r\n-0.318125 0.0924909 -0.848014 0 \r\n-0.32531 0.070918 -0.83845 0 \r\n0.642848 0.358979 -0.774858 0 \r\n0.645095 0.341935 -0.784446 0 \r\n0.0158098 0.473926 0.196766 0 \r\n0.425842 -0.664059 -0.541806 0 \r\n0.426744 -0.680389 -0.531731 0 \r\n0.646942 0.467647 -0.597809 0 \r\n0.639429 0.472229 -0.620332 0 \r\n0.651403 0.455927 -0.613441 0 \r\n-0.196232 -0.124425 0.0412418 0 \r\n0.663481 0.414582 -0.196423 0 \r\n0.671196 0.41109 -0.207614 0 \r\n-0.25892 -0.25326 -0.136039 0 \r\n0.578678 -0.311608 -0.203469 0 \r\n0.577127 -0.294172 -0.187979 0 \r\n0.334948 -0.497236 0.567363 0 \r\n0.307133 -0.487747 0.564935 0 \r\n0.141604 0.903866 -0.46804 0 \r\n0.160587 0.914984 -0.467516 0 \r\n0.167911 0.902869 -0.463916 0 \r\n-0.239514 -0.0927155 0.847097 0 \r\n-0.252369 -0.07082 0.852679 0 \r\n0.285331 0.975901 -0.534006 0 \r\n-0.222266 -0.271631 -0.394551 0 \r\n-0.233579 -0.259611 -0.375623 0 \r\n-0.23312 -0.273618 -0.371248 0 \r\n0.562984 0.165049 0.0259216 0 \r\n0.553764 0.177963 0.0520281 0 \r\n0.245908 0.829201 -0.858384 0 \r\n-0.686059 -0.574005 0.807209 0 \r\n-0.69847 -0.576406 0.824097 0 \r\n-0.234514 -0.497889 -0.38588 0 \r\n-0.226132 -0.511724 -0.411598 0 \r\n-0.00171632 -0.230287 0.714026 0 \r\n-0.411016 -0.167534 -0.366109 0 \r\n0.0296133 0.913708 -0.73228 0 \r\n0.0467067 0.92878 -0.723055 0 \r\n0.553801 0.523578 -0.747424 0 \r\n0.563233 0.497304 -0.762854 0 \r\n-0.473619 -0.0731943 -0.374936 0 \r\n0.271993 0.15487 -0.912403 0 \r\n0.265191 0.17428 -0.915944 0 \r\n0.271583 0.0135244 0.238071 0 \r\n0.256386 0.0225313 0.243596 0 \r\n0.281949 0.0382317 0.244427 0 \r\n0.466808 -0.977636 0.196014 0 \r\n0.458138 -0.981476 0.179739 0 \r\n-0.258752 -0.0339794 -0.0490972 0 \r\n-0.253622 -0.0120048 -0.0343006 0 \r\n0.55791 -0.63629 0.438438 0 \r\n0.569843 -0.653355 0.445437 0 \r\n0.551435 -0.636869 0.458828 0 \r\n-0.124831 0.694367 -0.194126 0 \r\n-0.11321 0.699229 -0.180868 0 \r\n-0.128346 0.685915 -0.178324 0 \r\n-0.410942 -0.727103 0.538137 0 \r\n-0.417111 -0.726006 0.530723 0 \r\n-0.104986 -0.422534 -0.863242 0 \r\n0.0399147 -0.860912 0.0302217 0 \r\n0.0374429 -0.865735 0.0427359 0 \r\n0.0537302 -0.877204 0.0335163 0 \r\n-0.205942 -0.188958 -0.765741 0 \r\n-0.223553 -0.185655 -0.769794 0 \r\n-0.0359369 0.740766 -0.558053 0 \r\n-0.0390624 0.735972 -0.57364 0 \r\n0.658558 -0.712125 0.342071 0 \r\n0.672768 -0.711316 0.309244 0 \r\n0.0208295 -0.843379 0.0257255 0 \r\n-0.217643 0.463611 -0.879593 0 \r\n-0.222066 0.450915 -0.895505 0 \r\n-0.0333875 -0.00694825 0.189716 0 \r\n-0.0330715 -0.0302319 0.183521 0 \r\n-0.0505545 -0.0186827 0.178177 0 \r\n0.598332 -0.525567 -0.197663 0 \r\n0.592085 -0.540491 -0.17798 0 \r\n0.590317 -0.513197 -0.165312 0 \r\n0.13155 0.472867 -0.961362 0 \r\n0.12423 0.446428 -0.961642 0 \r\n0.519667 -0.680316 -0.436496 0 \r\n0.497782 -0.695282 -0.453335 0 \r\n0.511526 0.508952 -0.908864 0 \r\n0.526355 0.508034 -0.895056 0 \r\n-0.101135 -0.245299 -0.70164 0 \r\n-0.109838 -0.235442 -0.681404 0 \r\n-0.107656 -0.248045 -0.674415 0 \r\n-0.24876 -0.452864 -0.159212 0 \r\n-0.24521 -0.45541 -0.137205 0 \r\n-0.0457263 -0.8262 0.178068 0 \r\n-0.0486702 -0.815638 0.158451 0 \r\n-0.0513115 -0.811035 0.175318 0 \r\n0.391443 -0.280453 0.138839 0 \r\n-0.247441 0.219974 -0.0378573 0 \r\n-0.252331 0.22168 -0.0598407 0 \r\n-0.503659 -0.785599 0.832003 0 \r\n-0.486828 -0.789891 0.81567 0 \r\n-0.519619 -0.791133 0.830099 0 \r\n0.594804 0.483483 -0.109781 0 \r\n0.121592 0.5717 -0.963104 0 \r\n0.130938 0.58384 -0.962954 0 \r\n0.107092 0.581532 -0.963042 0 \r\n-0.629028 -0.629245 0.576157 0 \r\n0.252088 -0.73515 -0.569336 0 \r\n0.263867 -0.720928 -0.576801 0 \r\n0.0118879 0.771911 -0.51193 0 \r\n0.000663011 0.763345 -0.53037 0 \r\n-0.0660925 0.755003 -0.357495 0 \r\n-0.082996 0.743853 -0.379802 0 \r\n0.735278 0.150507 -0.652018 0 \r\n-0.449338 0.0145158 -0.561659 0 \r\n0.598119 -0.0612024 -0.671189 0 \r\n-0.0532997 0.184257 -0.896712 0 \r\n-0.0639466 0.182882 -0.89709 0 \r\n-0.0973428 -0.416959 -0.688819 0 \r\n0.701252 0.307967 -0.711064 0 \r\n0.692754 0.32225 -0.713959 0 \r\n-0.279617 0.292906 -0.904516 0 \r\n-0.279798 0.305005 -0.899995 0 \r\n-0.282792 0.29056 -0.894891 0 \r\n0.269185 -0.483285 0.560493 0 \r\n0.245181 -0.483929 0.561329 0 \r\n0.138708 -0.618325 -0.98139 0 \r\n0.69525 0.0411112 -0.675484 0 \r\n-0.199129 -0.144931 0.750272 0 \r\n-0.197151 -0.703612 0.712412 0 \r\n-0.227281 -0.696239 0.72473 0 \r\n0.398167 -0.856915 -0.100976 0 \r\n0.387847 -0.858114 -0.082524 0 \r\n-0.00185799 -0.491089 0.50681 0 \r\n0.359472 0.758183 -0.210465 0 \r\n0.17825 0.997853 -0.588556 0 \r\n-0.401123 -0.606596 0.530676 0 \r\n-0.364789 -0.594771 0.541343 0 \r\n0.492382 -0.818504 0.518178 0 \r\n0.507915 -0.796898 0.515786 0 \r\n0.440089 0.457255 -0.96114 0 \r\n0.414183 0.468919 -0.960446 0 \r\n0.604008 0.431516 -0.76688 0 \r\n0.598747 0.421202 -0.785411 0 \r\n0.116672 -0.915043 -0.113724 0 \r\n-0.666327 -0.574288 0.788375 0 \r\n-0.271987 0.30775 -0.129196 0 \r\n-0.263322 0.309819 -0.119801 0 \r\n0.0909424 -0.314907 0.628865 0 \r\n-0.203599 0.535807 -0.791316 0 \r\n0.573766 -0.741727 -0.00476617 0 \r\n0.559638 -0.758352 -0.00807113 0 \r\n0.0297601 0.757519 -0.124799 0 \r\n0.00668715 0.762796 -0.157494 0 \r\n0.0383763 0.767911 -0.145527 0 \r\n-0.238456 -0.313966 -0.347825 0 \r\n0.430656 -0.228016 0.098396 0 \r\n0.434179 -0.254794 0.0947019 0 \r\n-0.265639 0.246641 -0.953569 0 \r\n-0.103605 0.40146 0.151992 0 \r\n-0.123524 0.423558 0.120296 0 \r\n-0.0993659 0.43643 0.136156 0 \r\n-0.142102 0.024794 0.119066 0 \r\n0.698679 -0.719317 0.267406 0 \r\n0.686269 -0.708003 0.276755 0 \r\n0.691478 -0.700217 0.257766 0 \r\n-0.159851 0.678236 -0.465306 0 \r\n-0.174926 0.665603 -0.46002 0 \r\n0.466015 0.339999 -0.940879 0 \r\n0.472874 0.349894 -0.946069 0 \r\n0.577502 0.445597 -0.884946 0 \r\n0.156105 -0.906649 0.529783 0 \r\n-0.448794 -0.690092 0.810892 0 \r\n0.220266 -0.935083 -0.129771 0 \r\n0.67265 -0.195882 -0.900367 0 \r\n0.69111 -0.175734 -0.887413 0 \r\n0.415688 0.600873 -0.857303 0 \r\n0.424731 0.614208 -0.837242 0 \r\n-0.0188861 -0.817868 0.0772694 0 \r\n0.424596 0.745602 -0.661759 0 \r\n-0.442012 0.0942082 -0.541224 0 \r\n-0.438171 0.120145 -0.528726 0 \r\n0.438522 0.740564 -0.706399 0 \r\n0.433639 0.7519 -0.681628 0 \r\n0.437951 0.760523 -0.695638 0 \r\n0.33529 -0.95113 0.320628 0 \r\n0.336312 -0.946971 0.340136 0 \r\n0.56189 -0.869344 0.0138142 0 \r\n0.549334 -0.852978 0.00514197 0 \r\n-0.219765 -0.606791 -0.280228 0 \r\n0.446974 0.70204 -0.631469 0 \r\n0.439492 0.704006 -0.642342 0 \r\n0.526007 -0.558206 0.0834746 0 \r\n-0.222311 -0.110221 0.00389367 0 \r\n-0.227858 -0.157401 -0.0157639 0 \r\n-0.230417 -0.133549 -0.0168695 0 \r\n-0.442324 -0.579927 0.688816 0 \r\n0.422308 0.733041 -0.236492 0 \r\n0.493139 -0.511562 -0.539531 0 \r\n0.490483 0.38726 -0.961416 0 \r\n0.492724 0.362642 -0.95892 0 \r\n0.508258 0.37196 -0.960804 0 \r\n-0.18088 -0.307226 -0.971313 0 \r\n-0.175413 -0.295763 -0.962058 0 \r\n-0.0835008 0.260037 -0.90911 0 \r\n-0.090875 0.228711 -0.903506 0 \r\n-0.61719 -0.722473 0.804184 0 \r\n0.332602 -0.80235 0.584598 0 \r\n0.330662 -0.780657 0.587042 0 \r\n0.653603 0.43064 -0.18983 0 \r\n0.660685 0.44237 -0.220042 0 \r\n-0.576458 -0.677318 0.548965 0 \r\n-0.573918 -0.68312 0.562616 0 \r\n0.648229 0.316331 -0.794686 0 \r\n-0.2093 -0.467162 -0.0142598 0 \r\n-0.204712 -0.438073 0.0101596 0 \r\n-0.336141 -0.110836 -0.838284 0 \r\n0.49123 0.0900421 0.145937 0 \r\n0.603997 -0.595743 0.207605 0 \r\n0.584427 -0.580955 0.207356 0 \r\n0.576396 -0.627929 0.324887 0 \r\n0.293208 -0.56764 -0.911053 0 \r\n0.600755 -0.523728 -0.842455 0 \r\n0.586954 -0.536319 -0.832913 0 \r\n-0.207628 -0.276083 -0.424509 0 \r\n-0.208087 -0.262076 -0.428885 0 \r\n0.433661 -0.853587 -0.213618 0 \r\n-0.158792 -0.672646 0.434065 0 \r\n-0.18226 -0.672673 0.438719 0 \r\n0.329276 -0.870279 -0.0360601 0 \r\n0.537904 0.513414 -0.0381302 0 \r\n0.433992 0.626898 -0.810474 0 \r\n0.429089 0.643843 -0.801484 0 \r\n0.547081 -0.140251 -0.488562 0 \r\n0.554065 -0.132914 -0.49867 0 \r\n0.713014 -0.0249818 -0.906193 0 \r\n0.712278 -0.0303574 -0.892326 0 \r\n0.704438 -0.00574197 -0.898106 0 \r\n0.0219232 0.788021 -0.362208 0 \r\n0.0207216 0.790267 -0.333638 0 \r\n0.00865406 0.785438 -0.366087 0 \r\n-0.172989 -0.587323 -0.479488 0 \r\n-0.166398 -0.620178 -0.475257 0 \r\n0.362036 -0.619623 -0.950325 0 \r\n0.357132 -0.61564 -0.956277 0 \r\n0.341573 -0.611772 -0.947058 0 \r\n0.750785 0.152545 -0.567852 0 \r\n-0.262356 0.108372 -0.0644889 0 \r\n0.665385 0.467503 -0.277902 0 \r\n0.73863 0.246589 -0.230058 0 \r\n0.744876 0.209103 -0.233595 0 \r\n0.736233 0.217731 -0.212777 0 \r\n-0.266402 0.197336 -0.101466 0 \r\n-0.273386 0.196444 -0.115232 0 \r\n-0.452954 -0.0568713 -0.279412 0 \r\n-0.446464 -0.0445952 -0.259889 0 \r\n-0.44246 -0.0758838 -0.261573 0 \r\n-0.268611 -0.146969 -0.124171 0 \r\n-0.27414 -0.147192 -0.146706 0 \r\n-0.272629 -0.120456 -0.127264 0 \r\n0.316274 -0.426663 0.34758 0 \r\n0.478721 -0.982957 0.151695 0 \r\n-0.380251 0.353458 -0.470823 0 \r\n-0.374511 0.362485 -0.50213 0 \r\n0.371053 0.12964 0.245039 0 \r\n0.284377 -0.607127 -0.627921 0 \r\n0.2738 -0.637568 -0.617941 0 \r\n-0.0831266 -0.593684 0.553505 0 \r\n-0.520788 -0.776234 0.84665 0 \r\n-0.556141 -0.778638 0.861908 0 \r\n0.261748 0.0356374 -0.905801 0 \r\n0.268731 0.00120265 -0.907557 0 \r\n-0.103482 -0.549732 -0.942175 0 \r\n0.400621 -0.936345 0.351317 0 \r\n-0.418696 0.214494 -0.503736 0 \r\n0.640944 -0.908967 0.135379 0 \r\n0.627527 -0.923788 0.128982 0 \r\n0.632912 -0.922971 0.147571 0 \r\n0.271697 0.720968 -0.904297 0 \r\n0.330028 -0.419966 0.326926 0 \r\n0.342781 -0.418143 0.312523 0 \r\n0.350097 -0.431193 0.333961 0 \r\n-0.131316 0.70244 -0.454508 0 \r\n0.516611 -0.376313 -0.967947 0 \r\n0.535838 -0.433218 -0.969763 0 \r\n0.182492 -0.496135 0.587753 0 \r\n0.203514 -0.497923 0.578849 0 \r\n0.18399 -0.510581 0.590472 0 \r\n0.164187 -0.572287 0.588038 0 \r\n0.149024 -0.586702 0.586575 0 \r\n0.204772 0.0169025 0.245531 0 \r\n-0.242741 -0.456002 -0.117992 0 \r\n-0.488589 -0.596066 0.589481 0 \r\n-0.457027 -0.591361 0.589823 0 \r\n0.122285 -0.342206 0.541769 0 \r\n0.0897022 0.931095 -0.502585 0 \r\n0.104321 0.925351 -0.488283 0 \r\n0.313603 -0.945559 0.507313 0 \r\n0.559934 0.592525 -0.616025 0 \r\n-0.353103 -0.79009 0.704916 0 \r\n-0.334919 -0.788245 0.691857 0 \r\n0.299485 -0.920531 -0.12356 0 \r\n0.363302 -0.93636 0.0541866 0 \r\n-0.645154 -0.744648 0.895872 0 \r\n0.161081 0.801018 -0.298428 0 \r\n0.166232 0.800857 -0.277407 0 \r\n0.529665 -0.575366 0.296466 0 \r\n-0.404334 0.279156 -0.285319 0 \r\n0.254242 -0.0793258 0.21161 0 \r\n0.635237 0.388163 -0.759467 0 \r\n0.649094 0.384946 -0.738168 0 \r\n0.638189 0.399328 -0.741064 0 \r\n0.469792 0.294571 0.174161 0 \r\n0.480038 0.304356 0.159857 0 \r\n0.481906 0.277683 0.163644 0 \r\n-0.0706577 0.224912 0.209203 0 \r\n-0.0903016 0.226536 0.191568 0 \r\n-0.218183 0.300097 0.027724 0 \r\n-0.225186 0.297036 0.00439476 0 \r\n0.38145 -0.783668 -0.472096 0 \r\n0.376584 -0.798768 -0.458977 0 \r\n0.023667 0.265485 -0.938489 0 \r\n0.0253947 0.275239 -0.946586 0 \r\n-0.128984 0.710114 -0.271454 0 \r\n0.530298 -0.389567 -0.792008 0 \r\n0.720729 -0.0514219 -0.911022 0 \r\n-0.305721 0.509964 -0.46313 0 \r\n-0.301915 0.514597 -0.494194 0 \r\n-0.292014 0.531293 -0.476371 0 \r\n0.176185 -0.668039 -0.963848 0 \r\n0.15642 -0.684148 -0.961815 0 \r\n0.51202 -0.234493 -0.685352 0 \r\n0.508554 -0.221202 -0.668361 0 \r\n-0.264467 -0.181862 -0.120902 0 \r\n-0.0879114 -0.494235 -0.872867 0 \r\n-0.0744498 -0.513335 -0.859782 0 \r\n0.635704 0.524968 -0.443068 0 \r\n0.640316 0.524807 -0.420561 0 \r\n0.626567 0.539387 -0.428643 0 \r\n0.684048 -0.187724 -0.916465 0 \r\n0.0845529 -0.443965 0.683041 0 \r\n0.0095542 -0.696227 -0.957727 0 \r\n0.0150849 -0.685893 -0.969521 0 \r\n0.123436 -0.914088 0.368931 0 \r\n-0.0964842 -0.574799 -0.552464 0 \r\n-0.271385 -0.171905 -0.593567 0 \r\n0.563488 -0.691955 0.00144678 0 \r\n0.552354 -0.695181 -0.00084746 0 \r\n-0.135302 -0.44772 -0.941347 0 \r\n-0.127766 -0.459248 -0.930301 0 \r\n-0.128944 -0.472833 -0.949095 0 \r\n0.435735 0.707436 -0.646489 0 \r\n0.431466 0.717947 -0.638988 0 \r\n0.346979 -0.970773 0.257356 0 \r\n0.45088 0.299552 -0.924473 0 \r\n0.460649 0.325737 -0.934639 0 \r\n0.416155 0.0898397 0.205898 0 \r\n0.395381 0.0767293 0.215024 0 \r\n0.401078 0.119361 0.225375 0 \r\n-0.310076 0.0863584 0.792681 0 \r\n-0.318174 0.095993 0.804422 0 \r\n-0.217816 -0.575778 -0.41365 0 \r\n-0.227631 -0.560917 -0.391225 0 \r\n-0.143991 -0.260227 0.777946 0 \r\n-0.13691 -0.260642 0.793003 0 \r\n-0.127147 -0.283929 0.771201 0 \r\n-0.331482 -0.0407496 -0.890703 0 \r\n-0.337175 -0.0696797 -0.892734 0 \r\n0.126822 -0.903521 0.441473 0 \r\n0.1093 -0.890919 0.454517 0 \r\n0.136833 -0.908454 0.458232 0 \r\n0.0312912 -0.635969 -0.834373 0 \r\n0.044 -0.630484 -0.83013 0 \r\n0.575275 0.583218 -0.554296 0 \r\n0.562943 0.6012 -0.557304 0 \r\n0.0802777 -0.669209 -0.980402 0 \r\n-0.23674 0.330718 -0.0628873 0 \r\n-0.231387 0.356986 -0.0601058 0 \r\n0.442314 0.767102 -0.710009 0 \r\n0.44263 0.779621 -0.716673 0 \r\n0.44315 0.761706 -0.727072 0 \r\n-0.13403 0.619007 -0.722681 0 \r\n-0.112636 0.626426 -0.72568 0 \r\n0.152171 -0.193306 0.2145 0 \r\n-0.0681351 -0.765587 0.542843 0 \r\n0.404149 0.499296 0.162545 0 \r\n0.409052 0.515676 0.146658 0 \r\n0.489408 0.39967 0.102858 0 \r\n0.477973 0.398871 0.125858 0 \r\n0.603271 0.367025 -0.838074 0 \r\n0.602623 0.393517 -0.815153 0 \r\n-0.273296 0.397066 -0.875748 0 \r\n-0.271612 0.375716 -0.894369 0 \r\n0.76275 0.174072 -0.492357 0 \r\n0.21134 -0.949515 0.496719 0 \r\n0.020884 -0.404317 0.265667 0 \r\n0.418297 -0.866745 -0.222891 0 \r\n0.399126 -0.879078 -0.238003 0 \r\n-0.18024 -0.281709 -0.951051 0 \r\n0.0811749 0.958146 -0.692799 0 \r\n0.0948363 0.968538 -0.677274 0 \r\n-0.36747 -0.111172 -0.214563 0 \r\n-0.0550418 -0.802316 0.196917 0 \r\n-0.43016 -0.151681 -0.37356 0 \r\n-0.446309 -0.135513 -0.389063 0 \r\n0.329593 -0.579769 -0.896185 0 \r\n0.175518 0.598585 -0.956591 0 \r\n0.179033 0.566085 -0.962235 0 \r\n0.209114 0.590662 -0.955811 0 \r\n-0.134352 -0.340042 -0.972187 0 \r\n0.108227 0.69777 -0.927657 0 \r\n0.101232 0.669297 -0.936089 0 \r\n0.696868 0.378191 -0.60806 0 \r\n0.696905 0.37308 -0.623819 0 \r\n0.706239 0.360638 -0.606157 0 \r\n0.178268 -0.656765 -0.895148 0 \r\n0.213931 -0.769922 -0.542323 0 \r\n0.192807 -0.778211 -0.53605 0 \r\n-0.140714 -0.0663088 0.105649 0 \r\n-0.15649 -0.0822598 0.0888237 0 \r\n0.576635 -0.232803 -0.162815 0 \r\n0.0117131 0.639838 -0.905159 0 \r\n-0.111765 -0.329577 0.693123 0 \r\n-0.190367 -0.587445 -0.460357 0 \r\n-0.180831 -0.567533 -0.475673 0 \r\n0.679291 -0.75863 0.342174 0 \r\n0.679991 -0.773706 0.338102 0 \r\n0.717726 -0.772611 0.225432 0 \r\n0.440753 0.700526 -0.133206 0 \r\n0.140045 0.384158 -0.962368 0 \r\n0.164345 0.358377 -0.962516 0 \r\n0.161926 0.39291 -0.96034 0 \r\n-0.0711002 -0.8255 -0.154535 0 \r\n-0.0603558 -0.826113 -0.127501 0 \r\n0.764223 0.0508911 -0.332805 0 \r\n-0.0375391 -0.0618251 0.660296 0 \r\n0.0304216 0.788306 -0.389349 0 \r\n0.417167 -0.560063 -0.587292 0 \r\n-0.0872753 -0.635257 0.16533 0 \r\n-0.089664 -0.623888 0.148302 0 \r\n-0.231654 -0.0189929 0.734514 0 \r\n0.0662938 0.459486 -0.964125 0 \r\n0.0990497 0.497377 -0.963326 0 \r\n0.184696 -0.900301 -0.0389313 0 \r\n0.180723 -0.897134 -0.0241648 0 \r\n0.480568 -0.575305 -0.817248 0 \r\n0.489684 -0.562611 -0.808012 0 \r\n0.364428 -0.677894 -0.568169 0 \r\n-0.305483 0.10899 -0.879108 0 \r\n-0.372642 0.377849 -0.424511 0 \r\n-0.366773 0.39167 -0.436206 0 \r\n-0.365759 0.394763 -0.412594 0 \r\n-0.414257 0.184251 -0.571822 0 \r\n0.537141 0.522707 -0.789993 0 \r\n0.536129 0.520869 -0.805061 0 \r\n0.549708 0.499857 -0.804582 0 \r\n-0.154881 -0.465757 -0.514911 0 \r\n-0.142076 -0.480879 -0.528263 0 \r\n0.201965 -0.912516 -0.0689758 0 \r\n-0.0196773 -0.628729 0.58354 0 \r\n0.566247 0.263399 -0.0189256 0 \r\n0.217184 0.91818 -0.465795 0 \r\n0.237779 0.902367 -0.466195 0 \r\n0.0557157 0.0804179 0.247773 0 \r\n-0.0355675 0.216051 0.236473 0 \r\n0.162154 -0.835134 -0.469473 0 \r\n0.430651 0.679689 -0.0772038 0 \r\n-0.227246 0.135871 0.0309428 0 \r\n-0.238818 0.119704 0.0056545 0 \r\n-0.545376 -0.785203 0.812718 0 \r\n0.528606 0.531879 -0.814381 0 \r\n0.512076 0.549572 -0.808439 0 \r\n0.517119 0.537732 -0.832348 0 \r\n-0.35358 -0.295322 -0.945655 0 \r\n-0.362381 -0.275986 -0.945256 0 \r\n-0.163628 0.161776 -0.919532 0 \r\n-0.250511 0.588572 -0.474843 0 \r\n0.0363945 -0.263954 -0.949847 0 \r\n0.0283925 -0.2754 -0.953621 0 \r\n-0.611462 -0.678005 0.667508 0 \r\n-0.596982 -0.682081 0.65572 0 \r\n0.56355 -0.0160646 -0.936597 0 \r\n-0.0448432 -0.811772 0.140421 0 \r\n0.521317 -0.574599 -0.497131 0 \r\n-0.0806701 -0.606202 0.221894 0 \r\n-0.0759887 -0.600667 0.246139 0 \r\n0.583364 0.111475 -0.0532245 0 \r\n0.584427 0.104227 -0.0626507 0 \r\n0.760623 0.225286 -0.420166 0 \r\n0.617607 -0.0553375 -0.640248 0 \r\n0.415921 0.217783 0.228576 0 \r\n-0.0645043 -0.745944 0.281507 0 \r\n0.386716 -0.832563 -0.404354 0 \r\n0.396481 -0.840691 -0.378596 0 \r\n0.412201 -0.825888 -0.390503 0 \r\n-0.101836 -0.75895 0.503427 0 \r\n0.523154 -0.195511 -0.541694 0 \r\n0.524425 -0.182269 -0.519035 0 \r\n0.518142 -0.18502 -0.552876 0 \r\n-0.305618 0.101498 0.84953 0 \r\n0.523424 0.438847 0.0229503 0 \r\n0.508824 0.444487 0.0443547 0 \r\n0.510157 0.463948 0.0358329 0 \r\n0.272869 -0.960022 0.468665 0 \r\n-0.411258 -0.0002434 -0.673844 0 \r\n-0.0121391 0.329809 0.240603 0 \r\n-0.30772 0.506654 -0.442872 0 \r\n-0.126971 -0.694184 0.430667 0 \r\n-0.131215 -0.685405 0.428768 0 \r\n-0.144976 -0.693303 0.434864 0 \r\n0.290473 -0.916612 -0.102572 0 \r\n0.520445 -0.215102 -0.0235132 0 \r\n0.513177 -0.238731 -0.0149291 0 \r\n0.317691 -0.591267 -0.947966 0 \r\n-0.109581 -0.593194 0.570294 0 \r\n-0.09761 -0.6028 0.586186 0 \r\n0.374067 0.783601 -0.833816 0 \r\n0.245321 -0.975656 0.0785509 0 \r\n-0.590381 -0.581689 0.726282 0 \r\n0.762568 0.21093 -0.320054 0 \r\n0.761152 0.208937 -0.302943 0 \r\n0.759481 0.225073 -0.308968 0 \r\n0.698125 0.177159 -0.158128 0 \r\n0.714592 0.174929 -0.171246 0 \r\n0.704273 0.14893 -0.163765 0 \r\n0.35416 0.919462 -0.716272 0 \r\n-0.0683925 -0.752779 0.225121 0 \r\n0.600096 -0.505763 -0.204778 0 \r\n0.602638 -0.498265 -0.220705 0 \r\n-0.0980309 -0.321347 -0.763414 0 \r\n-0.0970315 -0.344483 -0.784563 0 \r\n0.419698 -0.980579 0.138045 0 \r\n-0.112891 -0.474774 0.14356 0 \r\n-0.104745 -0.455379 0.159115 0 \r\n-0.0976519 -0.481106 0.159883 0 \r\n0.322107 -0.598341 -0.942933 0 \r\n0.327009 -0.602324 -0.936981 0 \r\n0.0153553 0.77533 -0.484093 0 \r\n0.234355 0.628657 -0.945621 0 \r\n-0.0605508 -0.521623 0.238907 0 \r\n-0.0573542 -0.507186 0.233781 0 \r\n-0.253987 -0.424014 -0.196756 0 \r\n-0.255198 -0.411304 -0.205443 0 \r\n0.654335 -0.00928919 -0.713349 0 \r\n0.660612 -0.00605325 -0.69898 0 \r\n0.663554 0.00310826 -0.712144 0 \r\n0.0574424 -0.18672 0.205805 0 \r\n-0.213445 0.0540612 0.782953 0 \r\n-0.197508 0.0591094 0.756056 0 \r\n0.735921 0.319609 -0.505371 0 \r\n0.736076 0.321561 -0.486876 0 \r\n0.696563 -0.106258 -0.280484 0 \r\n0.760249 0.0832457 -0.28475 0 \r\n0.760477 0.0361252 -0.295222 0 \r\n0.0801843 -0.520379 -0.75749 0 \r\n0.0649831 -0.523484 -0.758866 0 \r\n0.0696879 -0.510873 -0.747961 0 \r\n0.714841 0.341888 -0.595144 0 \r\n0.721627 0.333535 -0.573138 0 \r\n-0.0930173 -0.416095 -0.709247 0 \r\n-0.0901937 -0.412264 -0.728283 0 \r\n0.551093 -0.240593 -0.812988 0 \r\n-0.462989 -0.714547 0.606727 0 \r\n-0.344292 0.404693 -0.278985 0 \r\n-0.332756 0.430572 -0.287479 0 \r\n0.589144 -0.414676 -0.182042 0 \r\n-0.237343 0.151363 -0.978678 0 \r\n-0.240823 0.097306 -0.974952 0 \r\n-0.344272 0.436404 -0.394846 0 \r\n-0.332137 0.457619 -0.384557 0 \r\n0.1054 -0.963076 0.146528 0 \r\n0.115849 -0.968085 0.164864 0 \r\n-0.392323 -0.0277607 -0.703075 0 \r\n0.104742 -0.44618 0.668193 0 \r\n-0.316747 0.391291 -0.773068 0 \r\n0.513358 -0.543925 0.272018 0 \r\n0.700895 -0.768211 0.125417 0 \r\n0.438469 0.678065 -0.749171 0 \r\n0.436638 0.668602 -0.768843 0 \r\n0.0115123 -0.285724 -0.954781 0 \r\n-0.153187 -0.231152 -0.772008 0 \r\n-0.155395 -0.248572 -0.780727 0 \r\n-0.467889 -0.0512844 -0.320315 0 \r\n-0.460608 -0.047759 -0.293914 0 \r\n-0.0762812 -0.0655829 0.610685 0 \r\n0.185847 -0.0488766 0.227305 0 \r\n0.306163 0.789391 -0.416088 0 \r\n0.336971 0.782127 -0.433084 0 \r\n0.470378 -0.413333 -0.682339 0 \r\n0.512372 0.195863 0.130382 0 \r\n-0.195092 -0.00859555 0.822529 0 \r\n-0.184604 -0.0251925 0.829118 0 \r\n-0.204374 -0.0031966 0.847864 0 \r\n-0.0149554 0.42335 0.209053 0 \r\n0.218963 -0.364864 0.274654 0 \r\n0.241277 -0.36959 0.278036 0 \r\n0.219368 -0.374493 0.287847 0 \r\n-0.0867851 -0.616227 0.602342 0 \r\n0.71881 0.357272 -0.296028 0 \r\n0.718987 0.35213 -0.280886 0 \r\n-0.0339358 -0.396798 0.513887 0 \r\n-0.0526822 -0.382822 0.540995 0 \r\n0.622784 -0.597841 0.108524 0 \r\n0.61839 -0.599776 0.0952677 0 \r\n0.545303 -0.440692 -0.800115 0 \r\n0.552011 -0.459525 -0.803247 0 \r\n0.140615 0.608604 0.122812 0 \r\n0.14017 0.592733 0.135675 0 \r\n-0.37527 0.24399 -0.682538 0 \r\n-0.164311 -0.263316 -0.789894 0 \r\n-0.183531 -0.257051 -0.790624 0 \r\n0.106004 0.802305 -0.396694 0 \r\n0.223478 -0.452539 0.501092 0 \r\n-0.554894 -0.692505 0.611666 0 \r\n-0.583733 -0.684938 0.617264 0 \r\n-0.565328 -0.689986 0.633291 0 \r\n0.0685915 0.144203 -0.908975 0 \r\n0.0925653 0.140254 -0.91144 0 \r\n0.105319 0.160722 -0.913696 0 \r\n0.147913 -0.566895 -0.811527 0 \r\n-0.0212586 -0.470096 0.583021 0 \r\n-0.0202054 -0.467775 0.599624 0 \r\n0.631781 0.18268 -0.861251 0 \r\n0.637603 0.170244 -0.876083 0 \r\n0.641826 0.142803 -0.865485 0 \r\n0.0474954 -0.457852 0.694201 0 \r\n0.0423854 -0.439849 0.710052 0 \r\n0.538604 -0.341775 -0.807603 0 \r\n0.529551 -0.334661 -0.785708 0 \r\n-0.199445 -0.249531 -0.791015 0 \r\n0.0815653 -0.236331 -0.948703 0 \r\n-0.428276 0.185622 -0.265004 0 \r\n-0.436346 0.178612 -0.305095 0 \r\n-0.425523 0.204491 -0.289775 0 \r\n-0.0419377 -0.81719 -0.408294 0 \r\n-0.047016 -0.799416 -0.428038 0 \r\n0.480335 -0.582891 0.532212 0 \r\n-0.396641 -0.139942 -0.261797 0 \r\n-0.412695 -0.132555 -0.271081 0 \r\n0.316145 -0.6617 -0.59693 0 \r\n0.32084 -0.629136 -0.609324 0 \r\n0.303739 -0.646715 -0.605953 0 \r\n0.510535 -0.173503 -0.579232 0 \r\n0.593159 0.380246 -0.928028 0 \r\n0.596428 0.378434 -0.909967 0 \r\n-0.631907 -0.618792 0.593616 0 \r\n0.192359 0.806622 -0.423093 0 \r\n0.177791 0.807773 -0.428829 0 \r\n-0.36538 -0.191359 -0.939592 0 \r\n-0.369536 -0.225993 -0.94294 0 \r\n-0.246251 -0.400683 -0.325347 0 \r\n-0.250535 -0.392885 -0.305072 0 \r\n0.419164 -0.57489 0.573023 0 \r\n0.586731 -0.174213 -0.16157 0 \r\n0.591789 -0.155023 -0.169517 0 \r\n0.591182 -0.175442 -0.183968 0 \r\n0.278255 0.981177 -0.656616 0 \r\n0.0657509 0.428154 0.236831 0 \r\n0.0791633 0.456223 0.224747 0 \r\n0.765152 0.211978 -0.359854 0 \r\n0.766014 0.204937 -0.373137 0 \r\n0.688686 0.399525 -0.593179 0 \r\n0.147841 -0.705655 -0.940322 0 \r\n0.129569 -0.706982 -0.954185 0 \r\n0.584541 0.115164 -0.0657797 0 \r\n0.584526 0.127896 -0.0614242 0 \r\n0.439534 0.796509 -0.721127 0 \r\n0.432705 0.804624 -0.735184 0 \r\n0.564286 0.3885 -0.0290117 0 \r\n-0.222751 -0.118016 0.840829 0 \r\n-0.00537725 -0.357377 -0.976681 0 \r\n0.00726925 -0.337528 -0.972376 0 \r\n0.326334 0.664384 0.0436958 0 \r\n0.342024 0.641851 0.0649471 0 \r\n0.324457 0.64279 0.0701977 0 \r\n-0.00072745 0.560549 0.129656 0 \r\n0.361796 -0.667964 0.592355 0 \r\n-0.141386 0.25199 0.148303 0 \r\n0.388076 0.0446289 0.207621 0 \r\n0.385585 0.0182333 0.19783 0 \r\n0.374384 -0.887632 0.0205943 0 \r\n0.356562 -0.903252 0.0293657 0 \r\n-0.105866 -0.153511 0.12178 0 \r\n-0.124167 -0.140302 0.110148 0 \r\n0.60199 0.338874 -0.9353 0 \r\n-0.248007 -0.157039 -0.754604 0 \r\n-0.270948 -0.147465 -0.748296 0 \r\n-0.249414 -0.149374 -0.735273 0 \r\n-0.333226 -0.576546 0.583436 0 \r\n-0.370415 -0.5825 0.582191 0 \r\n-0.344113 -0.582449 0.56343 0 \r\n-0.340436 0.185751 -0.796855 0 \r\n0.47621 0.590569 -0.793025 0 \r\n0.468422 0.610332 -0.775403 0 \r\n-0.11227 0.627712 -0.0323151 0 \r\n-0.12681 0.620718 -0.0452294 0 \r\n-0.115485 0.634639 -0.048084 0 \r\n0.650283 0.420419 -0.172903 0 \r\n0.670367 0.0277736 -0.723549 0 \r\n0.648493 0.36205 -0.763631 0 \r\n0.640498 0.370709 -0.767797 0 \r\n0.103524 -0.884002 0.472873 0 \r\n0.0935131 -0.879069 0.456115 0 \r\n0.597554 -0.457591 -0.209313 0 \r\n-0.37206 -0.169902 -0.492778 0 \r\n0.483214 -0.560431 0.407153 0 \r\n0.493881 -0.57013 0.381139 0 \r\n0.462383 0.346412 0.170322 0 \r\n0.472733 0.372022 0.144473 0 \r\n0.478274 0.346853 0.144525 0 \r\n0.222115 -0.128989 0.2087 0 \r\n0.252706 -0.104619 0.203947 0 \r\n0.244793 -0.134634 0.201514 0 \r\n0.0368173 -0.358779 0.24548 0 \r\n0.062846 -0.346655 0.247088 0 \r\n0.00011255 -0.356975 0.232312 0 \r\n-0.0020074 -0.378699 0.234646 0 \r\n0.523454 -0.254656 -0.680652 0 \r\n-0.146379 -0.271771 -0.571805 0 \r\n0.275147 -0.205665 0.19574 0 \r\n0.662122 0.0504969 -0.763588 0 \r\n0.67088 0.0399127 -0.739493 0 \r\n0.674699 0.066259 -0.744681 0 \r\n-0.141962 -0.366049 0.132536 0 \r\n-0.136365 -0.391555 0.137589 0 \r\n0.597709 -0.158054 -0.783035 0 \r\n0.227836 -0.923892 0.546978 0 \r\n0.201254 -0.915904 0.546257 0 \r\n0.149951 -0.116651 -0.916173 0 \r\n0.315014 -0.292697 -0.965798 0 \r\n0.335446 -0.32255 -0.966019 0 \r\n0.348686 -0.310483 -0.966492 0 \r\n0.0136675 -0.195843 0.554003 0 \r\n0.0229033 -0.227132 0.53711 0 \r\n0.2827 0.876493 -0.478974 0 \r\n0.250978 0.869913 -0.470785 0 \r\n0.259809 0.888939 -0.47238 0 \r\n-0.190915 0.63784 -0.55839 0 \r\n-0.204398 0.626545 -0.544776 0 \r\n0.432523 0.661385 -0.78944 0 \r\n0.424694 0.650552 -0.815019 0 \r\n-0.119301 -0.542192 0.106174 0 \r\n-0.130931 -0.536346 0.0923 0 \r\n0.116867 -0.375117 0.282441 0 \r\n-0.434453 -0.720525 0.523268 0 \r\n-0.420114 -0.722739 0.523371 0 \r\n-0.398072 -0.0532861 -0.19703 0 \r\n-0.26743 0.125333 -0.083958 0 \r\n-0.266095 0.101098 -0.0760655 0 \r\n-0.0444012 -0.15444 0.568567 0 \r\n0.279194 -0.930547 -0.229891 0 \r\n-0.260953 -0.0587676 0.882621 0 \r\n-0.264893 -0.0531503 0.865453 0 \r\n-0.394795 0.202281 -0.641335 0 \r\n0.122788 0.900509 -0.474613 0 \r\n-0.244599 0.490669 -0.816692 0 \r\n0.615184 0.180277 -0.115731 0 \r\n0.683498 0.43328 -0.287556 0 \r\n0.683254 0.425539 -0.27233 0 \r\n0.614821 -0.0500849 -0.742439 0 \r\n0.614883 -0.0637162 -0.754708 0 \r\n-0.737709 -0.59661 0.871979 0 \r\n-0.0386167 0.739427 -0.661582 0 \r\n-0.0407175 0.748434 -0.668726 0 \r\n-0.018939 -0.0262794 -0.905559 0 \r\n-0.029064 -0.0602966 -0.905836 0 \r\n-0.424947 0.137567 -0.575626 0 \r\n0.707634 -0.0733934 -0.446341 0 \r\n0.720849 -0.059661 -0.446699 0 \r\n0.459929 -0.447304 0.189571 0 \r\n0.456546 -0.442409 0.168937 0 \r\n0.387183 -0.431579 0.295994 0 \r\n0.167637 -0.724562 -0.584798 0 \r\n0.575135 -0.337136 -0.882581 0 \r\n0.576245 -0.322315 -0.891154 0 \r\n0.509721 -0.785136 -0.243541 0 \r\n0.507537 -0.783341 -0.21825 0 \r\n0.628284 0.501844 -0.569247 0 \r\n0.635823 0.488437 -0.579484 0 \r\n-0.0946738 -0.302818 -0.738885 0 \r\n-0.147837 -0.335241 0.122953 0 \r\n-0.668872 -0.659693 0.712875 0 \r\n-0.607936 -0.632708 0.848829 0 \r\n-0.633562 -0.62396 0.854878 0 \r\n-0.340367 0.0598826 0.87214 0 \r\n-0.344486 0.065652 0.887725 0 \r\n0.534474 0.556285 -0.738085 0 \r\n0.530002 0.551673 -0.754493 0 \r\n-0.345283 -0.243597 -0.980687 0 \r\n-0.356134 -0.245976 -0.976216 0 \r\n-0.398881 0.2816 -0.264839 0 \r\n0.66179 -0.0566938 -0.554856 0 \r\n0.137042 -0.401735 0.473512 0 \r\n0.14001 -0.410481 0.460396 0 \r\n0.0544664 0.954063 -0.577099 0 \r\n0.37896 -0.550303 -0.833477 0 \r\n0.49399 -0.606981 0.530764 0 \r\n0.513145 -0.647794 0.526868 0 \r\n0.493393 0.479248 -0.943481 0 \r\n0.513103 0.484457 -0.936312 0 \r\n0.324415 0.956221 -0.677244 0 \r\n0.337552 0.953207 -0.669532 0 \r\n0.76826 0.165787 -0.346718 0 \r\n0.767175 0.17373 -0.336042 0 \r\n0.523916 -0.934167 0.320026 0 \r\n0.535917 -0.936469 0.303724 0 \r\n0.651248 0.512454 -0.406779 0 \r\n-0.445922 0.148629 -0.413163 0 \r\n-0.443816 0.163498 -0.38984 0 \r\n-0.1234 -0.710123 -0.0568523 0 \r\n-0.125987 -0.231698 0.624984 0 \r\n-0.143144 -0.187516 0.643227 0 \r\n-0.140066 -0.218769 0.645624 0 \r\n-0.0158825 -0.579616 -0.605762 0 \r\n-0.00050539 -0.565875 -0.619966 0 \r\n-0.0249704 -0.559056 -0.608537 0 \r\n-0.211473 -0.289546 -0.415361 0 \r\n-0.21686 -0.304201 -0.404006 0 \r\n-0.206525 -0.308109 -0.429192 0 \r\n-0.308297 -0.195164 -0.486919 0 \r\n-0.326082 -0.182878 -0.50738 0 \r\n-0.0697398 -0.741053 0.247218 0 \r\n0.0254491 0.558614 -0.936597 0 \r\n0.0232156 0.535589 -0.94565 0 \r\n-0.142258 -0.635652 0.430698 0 \r\n-0.119496 -0.626994 0.427792 0 \r\n0.139704 0.242189 -0.960544 0 \r\n0.119579 0.247669 -0.960551 0 \r\n-0.112719 -0.251998 -0.658619 0 \r\n-0.104015 -0.261855 -0.678854 0 \r\n0.539647 -0.658336 0.504584 0 \r\n-0.641382 -0.574498 0.731615 0 \r\n0.353293 0.352852 -0.95698 0 \r\n-0.295484 0.0195761 -0.142714 0 \r\n-0.302785 -0.0184242 -0.151996 0 \r\n-0.0570311 -0.400191 0.210122 0 \r\n-0.0498146 0.216751 0.225375 0 \r\n0.478166 -0.546986 -0.972942 0 \r\n-0.184006 0.639137 -0.588275 0 \r\n-0.263044 0.501813 -0.776677 0 \r\n-0.277299 0.49802 -0.753979 0 \r\n-0.273834 0.488873 -0.771978 0 \r\n-0.216159 -0.202599 -0.938648 0 \r\n0.539922 -0.631419 -0.893682 0 \r\n0.536601 -0.637165 -0.909199 0 \r\n-0.460173 0.094395 -0.340308 0 \r\n-0.465788 0.0769469 -0.358003 0 \r\n0.0301445 -0.509872 -0.746477 0 \r\n-0.236513 -0.263409 -0.809116 0 \r\n-0.210678 -0.258442 -0.797619 0 \r\n0.496973 -0.561707 0.335669 0 \r\n0.492776 -0.560531 0.353464 0 \r\n-0.00383318 -0.113277 0.596864 0 \r\n0.137989 -0.973858 0.200907 0 \r\n0.122652 -0.971547 0.182645 0 \r\n0.119721 -0.965811 0.204118 0 \r\n0.752166 0.268681 -0.363254 0 \r\n-0.245118 0.431661 -0.894107 0 \r\n-0.319541 0.298727 -0.164671 0 \r\n-0.312427 0.299422 -0.161913 0 \r\n-0.0891467 -0.263761 0.838084 0 \r\n-0.241546 -0.760879 0.578102 0 \r\n-0.241473 -0.765769 0.59622 0 \r\n-0.121154 0.250553 0.166514 0 \r\n-0.0175662 -0.681275 -0.957471 0 \r\n0.00880035 -0.705289 -0.946744 0 \r\n-0.0173918 -0.492279 -0.732782 0 \r\n0.613741 -0.422628 -0.946095 0 \r\n0.425857 0.415982 0.186961 0 \r\n0.440224 0.400465 0.178048 0 \r\n0.596604 -0.563963 -0.194465 0 \r\n0.599022 -0.571785 -0.206777 0 \r\n0.331367 0.0310173 0.229308 0 \r\n-0.195601 -0.0203294 0.96581 0 \r\n-0.173843 -0.0399636 0.970464 0 \r\n-0.199252 -0.0226859 0.974962 0 \r\n-0.248533 -0.455013 -0.313517 0 \r\n-0.329728 0.043119 -0.837036 0 \r\n-0.112901 0.218473 0.171333 0 \r\n-0.125831 0.198146 0.156677 0 \r\n0.179083 -0.904207 -0.0537776 0 \r\n0.617607 0.562874 -0.292307 0 \r\n0.621026 0.552279 -0.281643 0 \r\n0.617985 0.556275 -0.268076 0 \r\n-0.249861 0.548865 -0.222381 0 \r\n0.361776 0.703099 -0.87577 0 \r\n0.341261 0.708173 -0.886993 0 \r\n0.353677 0.683129 -0.887391 0 \r\n0.127371 -0.361304 0.519584 0 \r\n-0.298271 -0.146831 -0.200209 0 \r\n-0.300404 -0.163153 -0.213115 0 \r\n0.552857 -0.712626 -0.318098 0 \r\n0.57031 -0.685181 -0.304764 0 \r\n0.55846 -0.694384 -0.335292 0 \r\n-0.0481627 -0.814397 0.222558 0 \r\n-0.00510847 -0.622395 0.566398 0 \r\n0.594602 -0.591004 0.0935971 0 \r\n-0.205923 -0.0412694 0.708838 0 \r\n-0.750176 -0.598721 0.867471 0 \r\n0.00795934 0.66278 -0.892831 0 \r\n0.14236 -0.950089 0.0630689 0 \r\n0.577605 -0.691757 0.00545943 0 \r\n0.595027 -0.69111 0.00954883 0 \r\n-0.308154 -0.0480199 -0.165354 0 \r\n-0.296317 -0.0478306 -0.155605 0 \r\n0.522251 -0.381199 -0.768358 0 \r\n0.0836377 -0.593326 -0.641849 0 \r\n0.139443 0.218396 -0.943905 0 \r\n0.158643 0.226624 -0.950833 0 \r\n-0.367667 -0.190385 -0.926506 0 \r\n-0.362235 -0.169845 -0.910405 0 \r\n0.486426 0.525186 0.0350936 0 \r\n0.498717 0.521907 0.0178408 0 \r\n0.338356 -0.0755145 0.18336 0 \r\n0.357179 -0.0673631 0.177627 0 \r\n0.120517 0.800997 -0.376084 0 \r\n0.13255 0.803684 -0.398468 0 \r\n-0.0400673 -0.193644 0.170965 0 \r\n-0.0630313 -0.199134 0.157959 0 \r\n-0.0896686 -0.752684 -0.0487818 0 \r\n-0.0755736 -0.76878 -0.0461726 0 \r\n-0.518326 -0.710524 0.849369 0 \r\n-0.520975 -0.699555 0.845981 0 \r\n0.51202 0.48147 0.0225508 0 \r\n0.514074 0.502757 0.0078855 0 \r\n0.638002 0.452374 -0.67049 0 \r\n0.625996 0.458983 -0.692379 0 \r\n0.588957 -0.121908 -0.136905 0 \r\n0.591136 -0.140018 -0.151698 0 \r\n0.585159 -0.135686 -0.132326 0 \r\n-0.214889 -0.347582 -0.414246 0 \r\n-0.206861 -0.366137 -0.434121 0 \r\n0.316877 0.647029 -0.919602 0 \r\n0.335046 0.658007 -0.908331 0 \r\n0.490514 -0.549865 0.327932 0 \r\n-0.117672 -0.582126 0.526952 0 \r\n-0.121937 -0.583035 0.538802 0 \r\n-0.33652 0.432606 -0.306695 0 \r\n-0.511284 -0.650139 0.81208 0 \r\n0.629301 0.48781 -0.620965 0 \r\n0.174314 0.812085 -0.441438 0 \r\n-0.186079 -0.682238 -0.202419 0 \r\n0.520056 -0.1551 -0.00651731 0 \r\n-0.761079 -0.585766 0.777537 0 \r\n0.584998 0.346137 -0.0593529 0 \r\n0.580417 0.320715 -0.0553408 0 \r\n0.574134 0.340441 -0.0441668 0 \r\n0.520393 0.556472 -0.772573 0 \r\n0.533172 0.53892 -0.772391 0 \r\n0.683213 -0.794073 0.322942 0 \r\n0.683011 -0.812672 0.313546 0 \r\n0.66991 -0.804011 0.347778 0 \r\n0.289389 -0.253148 -0.965734 0 \r\n0.276533 -0.25777 -0.966161 0 \r\n0.312379 -0.255444 -0.965751 0 \r\n0.398359 -0.566294 -0.833144 0 \r\n0.46863 -0.902459 0.470782 0 \r\n0.597502 0.0745031 -0.103046 0 \r\n0.603884 0.0866489 -0.113305 0 \r\n-0.430149 -0.76607 0.712294 0 \r\n0.571872 -0.0634832 -0.0704503 0 \r\n0.391552 0.768321 -0.827209 0 \r\n0.403221 0.755548 -0.822449 0 \r\n-0.22585 -0.589123 -0.296976 0 \r\n-0.229777 -0.574836 -0.285683 0 \r\n-0.255329 -0.233103 -0.108465 0 \r\n0.449407 0.669292 -0.712785 0 \r\n0.191027 -0.246198 -0.967695 0 \r\n0.190932 -0.752846 -0.562533 0 \r\n0.201825 -0.75852 -0.557931 0 \r\n-0.131602 -0.606497 0.0407955 0 \r\n0.759606 0.107527 -0.456645 0 \r\n-0.056821 -0.736587 0.369704 0 \r\n0.2894 -0.955194 0.489326 0 \r\n0.609176 -0.736808 0.0080412 0 \r\n0.298318 0.639117 -0.930182 0 \r\n-0.379268 0.361459 -0.398899 0 \r\n-0.380428 0.355186 -0.374848 0 \r\n-0.0592688 -0.760659 0.47733 0 \r\n0.390203 0.75039 -0.237854 0 \r\n-0.23546 0.312154 -0.0484544 0 \r\n-0.241452 0.305669 -0.0633869 0 \r\n-0.0541417 0.170254 -0.897045 0 \r\n-0.000278145 -0.380943 0.470757 0 \r\n-0.00395563 -0.354703 0.479369 0 \r\n-0.00788111 -0.366577 0.480178 0 \r\n0.574315 -0.276741 -0.173169 0 \r\n0.105218 -0.430985 0.401565 0 \r\n0.419947 0.748824 -0.364725 0 \r\n0.436705 0.738789 -0.379315 0 \r\n-0.283407 0.19359 -0.931706 0 \r\n-0.256164 0.0294219 0.955272 0 \r\n-0.177078 -0.766096 0.670055 0 \r\n-0.154886 -0.62789 -0.024143 0 \r\n0.00757434 -0.443784 0.45476 0 \r\n0.0138388 -0.440646 0.444078 0 \r\n0.001627 -0.434453 0.462938 0 \r\n0.535216 -0.147713 -0.494372 0 \r\n-0.0248941 0.571429 -0.885864 0 \r\n-0.0352921 0.565333 -0.875357 0 \r\n-0.0295595 0.554578 -0.887845 0 \r\n-0.0181945 0.758666 -0.184234 0 \r\n0.540166 -0.534243 0.157824 0 \r\n-0.0781974 -0.675398 0.273922 0 \r\n0.451809 0.606534 0.00150496 0 \r\n0.2568 -0.693255 0.595712 0 \r\n0.281326 -0.712523 0.594482 0 \r\n-0.186017 -0.167041 0.850936 0 \r\n-0.179563 -0.471741 -0.481342 0 \r\n-0.189801 -0.481714 -0.467014 0 \r\n0.566004 -0.58032 -0.955282 0 \r\n0.58366 -0.588035 -0.945331 0 \r\n0.298577 -0.0586622 0.205572 0 \r\n0.276921 -0.0849711 0.204425 0 \r\n-0.101099 0.355819 -0.956931 0 \r\n0.201095 0.800795 -0.340684 0 \r\n0.219124 0.800484 -0.333308 0 \r\n-0.0534511 0.722072 -0.596908 0 \r\n0.10046 -0.765435 -0.537925 0 \r\n0.023129 0.881333 -0.76684 0 \r\n0.0161833 0.896773 -0.743312 0 \r\n-0.300694 0.0554413 0.941321 0 \r\n-0.124481 -0.0946708 0.114407 0 \r\n-0.135919 -0.080985 0.107444 0 \r\n0.409622 -0.903567 0.0310207 0 \r\n0.409363 -0.916107 0.0391249 0 \r\n0.355228 0.215423 0.259602 0 \r\n-0.160504 0.56732 -0.0453767 0 \r\n-0.0320503 -0.772208 0.510733 0 \r\n-0.050858 -0.76786 0.509648 0 \r\n0.246594 -0.254391 0.212912 0 \r\n-0.207008 0.5739 -0.731063 0 \r\n-0.0178723 0.00943645 0.201846 0 \r\n0.010016 0.0076854 0.211439 0 \r\n0.593269 -0.0680593 -0.956575 0 \r\n0.58917 -0.0503718 -0.953557 0 \r\n-0.170507 -0.225312 -0.553098 0 \r\n0.544955 -0.147763 -0.944938 0 \r\n0.53504 -0.163205 -0.943532 0 \r\n0.136679 -0.918264 0.379369 0 \r\n0.160657 -0.927049 0.379972 0 \r\n-0.219768 -0.0114081 0.715962 0 \r\n-0.203005 -0.00305485 0.694389 0 \r\n-0.228734 0.0192217 0.720065 0 \r\n0.741758 0.224907 -0.608842 0 \r\n-0.281595 -0.703195 0.465246 0 \r\n-0.269646 -0.692293 0.458289 0 \r\n-0.303666 -0.698092 0.468022 0 \r\n0.231806 -0.457639 -0.699746 0 \r\n0.254068 -0.462435 -0.686672 0 \r\n0.391563 -0.442827 -0.719672 0 \r\n0.297648 0.448814 0.232364 0 \r\n0.290457 0.463964 0.226979 0 \r\n-0.472302 -0.649042 0.507697 0 \r\n-0.451391 -0.637821 0.50762 0 \r\n0.192611 -0.943572 0.423039 0 \r\n0.174047 -0.933474 0.442781 0 \r\n0.617098 -0.918106 0.0874076 0 \r\n-0.045829 -0.481968 -0.778106 0 \r\n0.486524 -0.944788 0.051333 0 \r\n0.407366 -0.604743 -0.579301 0 \r\n0.422407 -0.57733 -0.580202 0 \r\n-0.394178 -0.793685 0.755938 0 \r\n0.579234 -0.611346 0.0602258 0 \r\n0.0024229 -0.653934 -0.974914 0 \r\n-0.0351338 -0.352459 0.510992 0 \r\n-0.0504497 -0.317393 0.528684 0 \r\n0.0129676 -0.366385 -0.978004 0 \r\n-0.139365 -0.155651 0.914617 0 \r\n-0.152178 -0.152718 0.910907 0 \r\n-0.0554289 -0.716968 -0.508498 0 \r\n0.551741 0.160255 0.0608846 0 \r\n-0.0524684 -0.478596 0.230408 0 \r\n0.579669 -0.330208 -0.203207 0 \r\n0.389544 -0.298398 0.139711 0 \r\n-0.0469813 -0.184408 0.762511 0 \r\n-0.0279993 -0.205636 0.737472 0 \r\n-0.0250689 -0.208676 0.75546 0 \r\n-0.487997 -0.774992 0.832222 0 \r\n-0.136832 -0.457065 -0.969077 0 \r\n-0.210728 -0.0801745 0.943537 0 \r\n-0.21266 -0.0949461 0.918254 0 \r\n-0.0195097 -0.161666 0.565775 0 \r\n-0.0112722 -0.196284 0.548451 0 \r\n-0.00136614 -0.176707 0.558672 0 \r\n-0.00375584 0.669992 0.0147444 0 \r\n-0.162677 -0.645257 -0.462713 0 \r\n-0.155692 -0.670678 -0.45308 0 \r\n-0.143286 -0.658543 -0.476706 0 \r\n0.729182 0.130439 -0.662938 0 \r\n0.58105 -0.660006 -0.289662 0 \r\n-0.0521312 0.705495 -0.681527 0 \r\n-0.0408575 0.724511 -0.660122 0 \r\n0.716931 -0.76298 0.180371 0 \r\n0.587654 0.117914 -0.0774436 0 \r\n0.587556 0.0942447 -0.0786701 0 \r\n-0.0628249 -0.631395 -0.96607 0 \r\n-0.239111 0.609455 -0.351735 0 \r\n-0.246767 0.598176 -0.378341 0 \r\n-0.234102 -0.558935 -0.3246 0 \r\n-0.234489 -0.561213 -0.297944 0 \r\n0.579862 0.433078 -0.822958 0 \r\n0.496994 -0.182122 -0.661549 0 \r\n0.499609 -0.189886 -0.654733 0 \r\n-0.505464 -0.651247 0.516787 0 \r\n0.0601688 -0.677034 0.588038 0 \r\n-0.0514759 -0.488812 -0.644229 0 \r\n0.567203 0.481091 -0.780455 0 \r\n0.559503 0.481366 -0.802275 0 \r\n0.575987 0.460763 -0.793216 0 \r\n0.518007 -0.843876 0.484552 0 \r\n0.703961 -0.0877966 -0.948065 0 \r\n0.682814 0.267296 -0.758759 0 \r\n0.61233 -0.680537 0.0195598 0 \r\n0.66316 -0.106901 -0.232915 0 \r\n0.679425 -0.0961265 -0.234665 0 \r\n0.345209 -0.298212 0.173523 0 \r\n0.537308 0.434723 0.00229198 0 \r\n0.524124 -0.392416 -0.782187 0 \r\n-0.467087 0.0688323 -0.399348 0 \r\n-0.4681 0.0501024 -0.422297 0 \r\n0.60075 -0.198157 -0.966015 0 \r\n0.576214 -0.217073 -0.96573 0 \r\n0.573563 -0.257838 -0.966129 0 \r\n0.737773 0.035404 -0.215484 0 \r\n0.72059 0.0302105 -0.568907 0 \r\n0.710939 0.0225059 -0.590921 0 \r\n0.28805 0.911275 -0.478985 0 \r\n0.269502 0.908946 -0.474383 0 \r\n0.755497 0.141822 -0.254029 0 \r\n0.757758 0.175898 -0.267629 0 \r\n0.465397 0.610331 -0.0227219 0 \r\n-0.471911 -0.794574 0.800246 0 \r\n0.135128 -0.432198 0.397507 0 \r\n0.149671 -0.424766 0.382565 0 \r\n0.403884 0.757099 -0.370207 0 \r\n0.397622 0.760036 -0.390406 0 \r\n-0.196261 -0.381952 -0.918366 0 \r\n0.292647 0.939484 -0.49351 0 \r\n0.301089 0.927006 -0.489201 0 \r\n0.308809 0.626503 0.0922792 0 \r\n0.293119 0.649037 0.0710279 0 \r\n0.67653 0.349873 -0.724025 0 \r\n0.669879 0.371368 -0.711769 0 \r\n0.658698 0.374616 -0.732021 0 \r\n0.354917 0.842488 -0.809791 0 \r\n0.431356 0.0757172 0.191469 0 \r\n0.438039 0.0485565 0.176724 0 \r\n0.543943 -0.231699 -0.514571 0 \r\n0.54029 -0.214392 -0.501601 0 \r\n0.483644 0.695607 -0.539245 0 \r\n0.471779 0.700868 -0.557175 0 \r\n0.481221 0.692541 -0.569156 0 \r\n0.295169 -0.661713 0.596693 0 \r\n0.309088 -0.683718 0.595147 0 \r\n0.754122 0.206198 -0.268185 0 \r\n0.759517 0.198758 -0.288675 0 \r\n0.211388 0.800935 -0.366661 0 \r\n-0.0740996 0.227414 -0.900674 0 \r\n0.518858 -0.393789 -0.763949 0 \r\n0.327419 -0.56415 -0.883101 0 \r\n-0.442761 0.0615687 -0.240347 0 \r\n0.17844 -0.100555 -0.91425 0 \r\n0.226958 -0.079032 -0.913087 0 \r\n0.0164261 -0.411613 0.449199 0 \r\n0.00797544 -0.396309 0.461106 0 \r\n0.716735 0.208797 -0.175832 0 \r\n0.583566 -0.405972 -0.161356 0 \r\n0.585859 -0.421485 -0.163069 0 \r\n0.719381 0.287369 -0.208472 0 \r\n0.706805 0.289844 -0.191687 0 \r\n-0.251494 0.518789 -0.189458 0 \r\n-0.251284 0.534738 -0.20595 0 \r\n0.642226 0.16975 -0.929379 0 \r\n0.643678 0.16604 -0.942172 0 \r\n0.254992 -0.754339 -0.548595 0 \r\n-0.062954 -0.846367 -0.247683 0 \r\n-0.068231 -0.842497 -0.26746 0 \r\n-0.180066 -0.423547 -0.483597 0 \r\n-0.192194 -0.419336 -0.461578 0 \r\n-0.0638413 -0.522229 -0.84849 0 \r\n-0.363321 -0.265786 -0.958489 0 \r\n-0.368127 -0.252017 -0.944577 0 \r\n0.26325 -0.45397 0.472152 0 \r\n-0.201091 0.428424 -0.0224008 0 \r\n0.57734 -0.149705 -0.958932 0 \r\n0.411127 0.84434 -0.749864 0 \r\n0.416445 0.815883 -0.765143 0 \r\n0.424492 0.818913 -0.74657 0 \r\n0.222792 -0.516211 0.581216 0 \r\n0.22106 -0.502775 0.576359 0 \r\n-0.255779 -0.414158 -0.236605 0 \r\n0.648156 -0.609988 0.134585 0 \r\n0.628642 -0.596326 0.133796 0 \r\n-0.0233143 -0.333947 0.500133 0 \r\n-0.0196368 -0.360187 0.49152 0 \r\n-0.241987 -0.0634038 -0.961591 0 \r\n-0.246963 -0.104347 -0.962991 0 \r\n0.584184 -0.111512 -0.518541 0 \r\n0.565174 -0.124234 -0.508859 0 \r\n-0.670575 -0.622292 0.602633 0 \r\n-0.656421 -0.615842 0.60613 0 \r\n-0.675086 -0.612293 0.620118 0 \r\n0.543756 -0.891633 0.0194363 0 \r\n-0.167984 -0.234364 -0.541218 0 \r\n-0.372973 -0.792765 0.741649 0 \r\n0.426993 -0.144085 0.106391 0 \r\n-0.0572977 -0.479295 -0.664274 0 \r\n-0.112378 0.285253 -0.922799 0 \r\n-0.320891 0.452348 -0.687907 0 \r\n-0.314705 0.473578 -0.663475 0 \r\n0.543398 -0.864312 0.448774 0 \r\n0.560198 -0.855226 0.440036 0 \r\n-0.13145 -0.390593 -0.601744 0 \r\n0.0063535 -0.300779 0.810005 0 \r\n0.506737 -0.580528 0.0292282 0 \r\n0.516144 -0.589031 0.0377655 0 \r\n-0.00687611 0.162331 0.245173 0 \r\n-0.0234274 0.153221 0.235638 0 \r\n0.707323 -0.0898567 -0.407784 0 \r\n0.495193 -0.572035 0.452872 0 \r\n0.487224 -0.561578 0.469054 0 \r\n0.216896 -0.939365 -0.151466 0 \r\n0.540731 -0.369067 -0.564919 0 \r\n-0.0345506 0.858208 -0.704789 0 \r\n-0.0416077 0.83373 -0.720063 0 \r\n0.717721 -0.124921 -0.889665 0 \r\n0.712605 -0.125038 -0.870118 0 \r\n0.459835 -0.417006 0.0611441 0 \r\n0.456805 -0.429967 0.0708567 0 \r\n0.64801 -0.892496 0.127721 0 \r\n0.514894 -0.543972 0.0849896 0 \r\n0.492459 -0.39984 -0.630772 0 \r\n0.118804 -0.900203 0.418531 0 \r\n0.590088 -0.597305 -0.90095 0 \r\n0.603909 -0.586228 -0.908 0 \r\n-0.0611428 -0.490121 -0.819731 0 \r\n-0.0993755 -0.511868 -0.567662 0 \r\n-0.118081 -0.500633 -0.551334 0 \r\n-0.297392 0.445893 -0.21887 0 \r\n-0.303317 0.452592 -0.241526 0 \r\n0.549801 -0.298342 -0.09125 0 \r\n0.555098 -0.312531 -0.107196 0 \r\n-0.0156776 -0.866869 -0.173973 0 \r\n-0.242747 -0.261776 -0.979989 0 \r\n-0.173962 -0.283837 0.0741408 0 \r\n-0.179775 -0.260946 0.0618186 0 \r\n-0.543594 -0.584247 0.683706 0 \r\n-0.569615 -0.585311 0.668607 0 \r\n0.710629 -0.709387 0.130563 0 \r\n-0.257323 0.227268 -0.0818931 0 \r\n-0.641011 -0.659121 0.598482 0 \r\n-0.615731 -0.671692 0.594171 0 \r\n-0.103419 -0.0537142 0.718125 0 \r\n-0.123554 -0.0427948 0.733866 0 \r\n-0.332855 0.0560223 0.935977 0 \r\n-0.333441 0.0487328 0.932106 0 \r\n-0.342764 0.0631718 0.915581 0 \r\n0.527641 -0.592369 0.0498855 0 \r\n-0.269069 0.359186 -0.90906 0 \r\n-0.236914 -0.22287 -0.0454758 0 \r\n-0.22925 -0.205196 -0.0238934 0 \r\n-0.230201 -0.247337 -0.0328422 0 \r\n0.633763 0.47609 -0.636597 0 \r\n0.187171 -0.87246 -0.412091 0 \r\n0.165045 -0.865198 -0.425728 0 \r\n-0.322838 -0.165386 -0.234767 0 \r\n-0.309063 -0.171285 -0.230781 0 \r\n0.564322 -0.445839 -0.0881725 0 \r\n0.0156453 -0.877277 -0.335505 0 \r\n-0.162942 0.315381 0.126595 0 \r\n0.308451 -0.877502 -0.0220344 0 \r\n-0.369137 -0.575378 0.621051 0 \r\n-0.342378 -0.575046 0.633197 0 \r\n0.574517 -0.286803 -0.369927 0 \r\n0.57567 -0.279452 -0.347904 0 \r\n0.574108 -0.271809 -0.359773 0 \r\n0.624346 -0.468672 -0.882927 0 \r\n0.305685 -0.997095 0.133884 0 \r\n0.303314 -0.998473 0.151852 0 \r\n-0.0633997 -0.0296196 0.167666 0 \r\n0.0290825 -0.60315 0.529145 0 \r\n0.0303096 -0.613836 0.545987 0 \r\n0.0130512 -0.603114 0.528669 0 \r\n-0.20265 -0.491205 -0.451063 0 \r\n-0.337569 -0.309533 -0.955047 0 \r\n0.0249816 -0.885154 -0.148638 0 \r\n-0.425835 0.218054 -0.305511 0 \r\n0.473599 0.294846 -0.929049 0 \r\n-0.215456 -0.235491 -0.455671 0 \r\n0.495956 0.681962 -0.566512 0 \r\n0.508222 0.669858 -0.565781 0 \r\n0.455348 0.390658 0.165144 0 \r\n0.471239 0.3911 0.139347 0 \r\n0.597227 0.590575 -0.27725 0 \r\n0.0208606 0.800972 -0.840211 0 \r\n0.0568727 -0.408526 -0.977744 0 \r\n0.0672385 -0.444789 -0.978493 0 \r\n-0.274706 0.112757 0.762724 0 \r\n-0.293123 0.113669 0.78659 0 \r\n-0.154334 -0.191375 0.865795 0 \r\n-0.220274 -0.0127778 0.978215 0 \r\n-0.246224 -0.0007591 0.980047 0 \r\n-0.263393 -0.573684 0.565547 0 \r\n-0.285553 -0.574906 0.571191 0 \r\n0.0576946 -0.901121 -0.294022 0 \r\n-0.25096 -0.252995 -0.0990138 0 \r\n-0.0592371 -0.538217 0.258876 0 \r\n0.456769 -0.881019 0.0157412 0 \r\n-0.10071 0.625232 -0.0139256 0 \r\n-0.112035 0.611312 -0.011071 0 \r\n0.171495 0.689137 0.026689 0 \r\n0.0636979 0.415157 -0.96524 0 \r\n0.0148308 -0.390052 -0.979887 0 \r\n-0.166564 -0.501153 0.0567443 0 \r\n-0.177588 -0.486083 0.0460979 0 \r\n-0.32015 0.0507459 0.946214 0 \r\n-0.329473 0.0651849 0.929689 0 \r\n0.547938 0.0330122 -0.929541 0 \r\n0.543243 0.0254113 -0.926489 0 \r\n-0.153324 0.688831 -0.427035 0 \r\n0.0304719 0.718684 -0.0457559 0 \r\n0.0385865 0.73481 -0.0690302 0 \r\n0.594041 0.597475 -0.289786 0 \r\n0.597025 0.594756 -0.305296 0 \r\n0.568914 0.413456 -0.943084 0 \r\n0.551638 -0.371575 -0.0793514 0 \r\n0.552987 -0.3492 -0.0919599 0 \r\n0.561376 -0.370116 -0.106027 0 \r\n0.516367 -0.912704 0.40472 0 \r\n-0.10909 -0.334175 0.64981 0 \r\n0.0414618 0.42073 0.233936 0 \r\n-0.0644763 0.325021 0.208306 0 \r\n0.40873 -0.403942 0.162975 0 \r\n-0.0299284 -0.214204 0.868711 0 \r\n-0.0359084 -0.227314 0.864425 0 \r\n-0.130681 -0.557202 0.0811399 0 \r\n-0.141125 -0.534001 0.0777674 0 \r\n-0.151536 -0.612409 -0.00145975 0 \r\n-0.14489 -0.597713 0.0252565 0 \r\n0.442885 -0.473954 -0.763031 0 \r\n0.439627 0.697526 -0.669008 0 \r\n-0.128633 -0.332796 -0.633504 0 \r\n-0.0203891 -0.173898 0.175126 0 \r\n-0.0184637 -0.155013 0.174389 0 \r\n-0.173029 -0.0899506 0.957903 0 \r\n-0.150684 -0.0969361 0.957073 0 \r\n-0.123529 -0.586067 0.559985 0 \r\n0.599504 -0.57817 -0.225192 0 \r\n-0.127526 -0.187376 0.892634 0 \r\n-0.126942 -0.201102 0.879788 0 \r\n-0.656209 -0.622867 0.868369 0 \r\n-0.126807 -0.283962 0.137407 0 \r\n-0.752154 -0.617275 0.865416 0 \r\n-0.754084 -0.604228 0.866812 0 \r\n0.0393508 0.94351 -0.680943 0 \r\n0.572276 0.156795 -0.00555897 0 \r\n-0.093869 -0.58578 0.48173 0 \r\n-0.267594 0.515494 -0.747447 0 \r\n-0.0581922 0.736652 -0.721864 0 \r\n0.53228 -0.208596 -0.526161 0 \r\n0.595587 -0.141245 -0.174095 0 \r\n0.331066 -0.945838 0.359918 0 \r\n0.337827 0.922025 -0.732324 0 \r\n0.30912 0.936942 -0.736335 0 \r\n-0.150999 0.68672 -0.457294 0 \r\n0.0120202 -0.483775 0.646921 0 \r\n0.0235834 -0.385824 -0.979462 0 \r\n0.00863021 -0.377845 -0.979958 0 \r\n0.521561 -0.258473 -0.698645 0 \r\n0.516181 -0.246019 -0.695278 0 \r\n0.305275 -0.16275 -0.940513 0 \r\n0.304087 -0.147762 -0.933078 0 \r\n0.173737 -0.903409 -0.353952 0 \r\n0.151147 -0.905981 -0.345874 0 \r\n-0.0622977 0.722124 -0.143479 0 \r\n0.351695 -0.881467 -0.0792341 0 \r\n0.748311 0.0587203 -0.48049 0 \r\n0.528908 -0.609331 0.470642 0 \r\n-0.144498 -0.758183 -0.323932 0 \r\n0.694399 0.314639 -0.187227 0 \r\n0.577237 -0.705309 1.84148e-005 0 \r\n0.328166 -0.445687 -0.7711 0 \r\n0.350487 -0.449478 -0.757123 0 \r\n0.620626 -0.932823 0.206723 0 \r\n0.60172 -0.943449 0.20996 0 \r\n0.328197 -0.305925 0.183744 0 \r\n0.334973 -0.3205 0.179956 0 \r\n0.380185 -0.471992 -0.772247 0 \r\n0.501762 -0.215665 -0.687319 0 \r\n0.504351 -0.210083 -0.662261 0 \r\n-0.0101064 -0.300495 0.502265 0 \r\n-0.0202469 -0.304949 0.505248 0 \r\n-0.00141806 -0.335883 0.485807 0 \r\n-0.0966299 -0.267658 -0.714038 0 \r\n-0.098812 -0.255054 -0.721027 0 \r\n0.568898 -0.338939 -0.86982 0 \r\n-0.221361 -0.188708 -0.590897 0 \r\n0.109078 0.174674 -0.917747 0 \r\n0.275733 -0.693229 -0.592263 0 \r\n0.414079 -0.174623 -0.933517 0 \r\n0.198134 -0.675374 0.592459 0 \r\n0.203386 -0.666571 0.593346 0 \r\n0.0510587 -0.603257 0.545494 0 \r\n0.644503 -0.0638693 -0.967882 0 \r\n0.630033 -0.126281 -0.966691 0 \r\n0.535097 -0.31506 -0.808708 0 \r\n0.542355 -0.336423 -0.820352 0 \r\n0.232916 0.0182924 0.244276 0 \r\n-0.0818454 -0.145244 0.759616 0 \r\n-0.0831549 -0.129305 0.743522 0 \r\n-0.0240599 0.740372 -0.616498 0 \r\n-0.0251764 0.744367 -0.627163 0 \r\n0.478217 0.670511 -0.650824 0 \r\n0.442724 -0.966649 0.0849896 0 \r\n0.441983 -0.975804 0.103361 0 \r\n-0.196111 -0.191479 0.0361623 0 \r\n0.0344929 -0.669497 0.59499 0 \r\n0.0329945 -0.656664 0.586964 0 \r\n-0.18735 0.661712 -0.399154 0 \r\n-0.196095 0.652149 -0.412145 0 \r\n0.683576 0.205565 -0.759712 0 \r\n0.677023 0.229234 -0.771958 0 \r\n0.559633 -0.412124 -0.0861351 0 \r\n0.548343 -0.407438 -0.0676558 0 \r\n-0.366997 0.356939 -0.272848 0 \r\n-0.373472 0.339678 -0.263539 0 \r\n-0.375499 0.346133 -0.284653 0 \r\n-0.0802166 -0.6827 0.263099 0 \r\n-0.259968 0.564888 -0.291241 0 \r\n-0.242438 0.592355 -0.282917 0 \r\n-0.471292 -0.734378 0.834447 0 \r\n-0.505436 -0.727085 0.848284 0 \r\n-0.102878 -0.453101 -0.608442 0 \r\n-0.0829586 -0.463711 -0.633072 0 \r\n0.513052 0.583161 -0.0629163 0 \r\n0.108665 0.984186 -0.626596 0 \r\n0.102499 0.978691 -0.651901 0 \r\n-0.27208 -0.238609 -0.229071 0 \r\n-0.277082 -0.223646 -0.236929 0 \r\n-0.0142062 0.880793 -0.725468 0 \r\n0.425955 0.731386 -0.554542 0 \r\n-0.0342206 -0.448634 0.577361 0 \r\n-0.0221951 -0.468019 0.570325 0 \r\n0.55984 -0.204359 -0.395234 0 \r\n-0.374609 -0.79055 0.718266 0 \r\n0.254526 -0.956012 0.396787 0 \r\n0.257418 -0.954796 0.377865 0 \r\n0.236216 -0.953701 0.378161 0 \r\n0.473159 0.627573 -0.741174 0 \r\n-0.0787317 -0.239644 0.163873 0 \r\n-0.0631756 -0.219083 0.164714 0 \r\n0.36669 -0.421835 0.300788 0 \r\n0.408579 0.647319 -0.846227 0 \r\n-0.207635 -0.188828 0.0196474 0 \r\n0.327196 -0.946612 0.375224 0 \r\n-0.173835 -0.459094 -0.488676 0 \r\n0.531678 -0.203121 -0.0393727 0 \r\n0.545033 -0.187709 -0.0615082 0 \r\n-0.175519 -0.304261 0.0767558 0 \r\n-0.231843 0.0529768 0.0173361 0 \r\n-0.231731 0.0754319 0.0216631 0 \r\n-0.622885 -0.729221 0.906088 0 \r\n-0.648092 -0.709098 0.91387 0 \r\n0.575125 -0.25752 -0.168339 0 \r\n0.5797 -0.263395 -0.191028 0 \r\n0.630645 -0.92766 0.163899 0 \r\n-0.206059 -0.757723 0.541048 0 \r\n-0.235643 -0.751278 0.530537 0 \r\n0.563887 -0.329438 -0.127861 0 \r\n0.164216 -0.474609 -0.702356 0 \r\n0.159499 -0.472224 -0.711838 0 \r\n0.534879 0.171571 -0.935649 0 \r\n-0.0171122 -0.591931 -0.982471 0 \r\n-0.266849 -0.169326 -0.126329 0 \r\n0.538906 0.502918 -0.885543 0 \r\n0.552722 0.492381 -0.882227 0 \r\n0.535927 0.510083 -0.871653 0 \r\n-0.219843 0.574719 -0.714187 0 \r\n-0.22356 0.209643 0.0412728 0 \r\n0.587753 0.602647 -0.273845 0 \r\n0.685325 -0.642947 0.140489 0 \r\n0.694913 -0.655208 0.126797 0 \r\n-0.304415 0.33283 -0.163747 0 \r\n-0.317584 0.331569 -0.17369 0 \r\n-0.304847 0.349442 -0.17041 0 \r\n0.470191 -0.670388 -0.50128 0 \r\n0.486799 -0.681216 -0.476367 0 \r\n-0.247212 0.154211 -0.981001 0 \r\n-0.257396 0.140846 -0.980324 0 \r\n-0.183598 -0.103326 0.938084 0 \r\n-0.181358 -0.118537 0.924999 0 \r\n0.063521 -0.616152 -0.627715 0 \r\n0.457366 0.25984 0.193187 0 \r\n0.686575 -0.717007 0.0699954 0 \r\n0.694067 -0.71774 0.0860427 0 \r\n0.359161 -0.504507 0.562569 0 \r\n0.390234 -0.5233 0.560992 0 \r\n0.542148 -0.731339 -0.323684 0 \r\n0.310209 0.782941 -0.864741 0 \r\n0.3247 0.759423 -0.871477 0 \r\n0.32594 -0.821956 0.580593 0 \r\n0.0235258 -0.316174 0.489388 0 \r\n-0.0757594 -0.453482 -0.687615 0 \r\n-0.0605155 -0.469816 -0.680775 0 \r\n0.474331 -0.712243 -0.466213 0 \r\n-0.484134 -0.711785 0.626385 0 \r\n-0.242325 0.108419 -0.00116551 0 \r\n0.470041 0.71277 -0.449861 0 \r\n0.318417 -0.232158 -0.962482 0 \r\n0.269105 -0.670133 -0.605548 0 \r\n0.368977 -0.626742 -0.940633 0 \r\n0.708993 0.366818 -0.260531 0 \r\n0.603199 -0.502297 -0.300147 0 \r\n0.60104 -0.472512 -0.285452 0 \r\n0.138954 0.602715 -0.957582 0 \r\n0.02576 0.791762 -0.311883 0 \r\n0.0340867 0.79266 -0.27795 0 \r\n0.206911 0.502456 -0.96033 0 \r\n0.196121 0.515489 -0.962108 0 \r\n0.409602 -0.525057 -0.971875 0 \r\n0.40405 0.812847 -0.787742 0 \r\n0.0394005 -0.502789 -0.982185 0 \r\n0.588677 0.596972 -0.37982 0 \r\n-0.250935 -0.163846 -0.766459 0 \r\n-0.242047 -0.178849 -0.77313 0 \r\n0.458793 -0.558056 -0.558671 0 \r\n-0.376594 -0.742923 0.626027 0 \r\n0.414323 -0.804764 0.562838 0 \r\n0.404756 -0.834969 0.559316 0 \r\n0.394291 -0.807588 0.570294 0 \r\n0.202805 -0.87964 -0.39922 0 \r\n0.213863 -0.891375 -0.376383 0 \r\n-0.275506 0.345323 -0.13916 0 \r\n-0.279094 0.376484 -0.154087 0 \r\n0.220857 -0.954163 0.478446 0 \r\n0.420674 -0.220908 -0.950915 0 \r\n0.447949 -0.223221 -0.948905 0 \r\n0.0457749 -0.468141 0.682222 0 \r\n0.0370455 -0.460768 0.691691 0 \r\n0.530438 -0.950562 0.0592399 0 \r\n0.708537 0.402151 -0.45877 0 \r\n0.717445 0.376204 -0.475266 0 \r\n0.716066 0.387058 -0.442563 0 \r\n0.337485 -0.873103 2.885e-005 0 \r\n0.37758 -0.854991 -0.00268776 0 \r\n0.0951843 -0.675671 -0.977805 0 \r\n0.70875 -0.121854 -0.94118 0 \r\n0.563772 0.370943 -0.0269535 0 \r\n0.325956 0.736231 -0.881157 0 \r\n-0.0398448 -0.777892 0.0283643 0 \r\n-0.0252848 -0.793476 0.0288837 0 \r\n-0.429998 0.0775798 -0.613034 0 \r\n0.413592 0.184776 0.22963 0 \r\n0.398187 0.206634 0.239767 0 \r\n0.471229 -0.465268 0.121474 0 \r\n0.454969 -0.446849 0.126382 0 \r\n0.1504 0.987974 -0.530287 0 \r\n0.139146 0.989354 -0.553025 0 \r\n0.634712 0.193383 -0.947878 0 \r\n0.645738 0.157169 -0.950183 0 \r\n0.119107 0.780482 -0.888756 0 \r\n0.132971 0.81707 -0.869336 0 \r\n-0.101817 0.733004 -0.370272 0 \r\n0.276267 0.257724 -0.950231 0 \r\n-0.13366 0.181683 0.148375 0 \r\n-0.147877 0.168977 0.132789 0 \r\n0.145604 0.742898 -0.0579755 0 \r\n0.149514 0.729248 -0.0353643 0 \r\n0.127752 -0.180231 -0.931247 0 \r\n-0.209215 -0.372911 -0.980615 0 \r\n-0.185185 -0.390135 -0.979758 0 \r\n0.247845 -0.273242 0.215704 0 \r\n0.13112 -0.48469 -0.977022 0 \r\n0.487172 -0.560156 0.480869 0 \r\n0.493611 -0.567675 0.486871 0 \r\n0.340976 -0.471525 -0.796429 0 \r\n0.361112 -0.471161 -0.782878 0 \r\n0.0671046 0.848081 -0.507423 0 \r\n0.597373 0.574309 -0.434229 0 \r\n0.61095 0.558791 -0.427938 0 \r\n0.646407 0.0705446 -0.965556 0 \r\n-0.0513317 0.487826 0.152505 0 \r\n-0.0347078 0.496174 0.158181 0 \r\n-0.256519 0.193331 -0.0637802 0 \r\n-0.256442 0.206987 -0.0711782 0 \r\n-0.324887 0.471399 -0.56545 0 \r\n-0.319204 0.107724 0.814975 0 \r\n-0.325566 0.10196 0.820345 0 \r\n-0.175863 -0.146911 0.897501 0 \r\n-0.175834 -0.158303 0.881121 0 \r\n0.351778 0.622638 -0.91018 0 \r\n0.521057 0.527506 -0.0240206 0 \r\n0.696059 0.186763 -0.739579 0 \r\n0.544436 -0.276828 -0.0809943 0 \r\n0.540612 -0.0476345 -0.923447 0 \r\n0.631221 0.208793 -0.855572 0 \r\n0.635445 0.181351 -0.844975 0 \r\n-0.23999 0.602659 -0.297682 0 \r\n0.352717 -0.608566 -0.96131 0 \r\n0.332254 -0.600715 -0.958043 0 \r\n0.160555 -0.489695 -0.690393 0 \r\n0.474835 -0.968233 0.228535 0 \r\n0.460043 -0.97528 0.207112 0 \r\n0.453962 -0.968485 0.23129 0 \r\n-0.0520483 0.283639 0.223254 0 \r\n-0.0290536 0.285729 0.238351 0 \r\n0.230193 -0.169789 0.203071 0 \r\n-0.0179688 -0.846288 0.126086 0 \r\n0.260516 -0.998083 0.132162 0 \r\n0.281814 -0.995645 0.121297 0 \r\n0.552032 -0.356743 -0.528128 0 \r\n0.0748699 -0.116985 0.204378 0 \r\n0.0683918 -0.0977749 0.204845 0 \r\n0.0527822 -0.490979 -0.981598 0 \r\n-0.216864 -0.378419 -0.931913 0 \r\n-0.191173 -0.386382 -0.928725 0 \r\n-0.425108 -0.704318 0.496801 0 \r\n-0.40678 -0.693573 0.489253 0 \r\n0.0843173 -0.50332 -0.737597 0 \r\n-0.255984 0.178815 -0.0563328 0 \r\n-0.254571 0.160292 -0.0450192 0 \r\n0.481445 0.568343 -0.827767 0 \r\n0.471291 0.564493 -0.84903 0 \r\n-0.134647 -0.261678 0.12111 0 \r\n-0.118244 -0.262731 0.138916 0 \r\n0.341158 -0.22512 0.169854 0 \r\n0.359919 -0.238982 0.16077 0 \r\n-0.0739819 -0.247405 0.557972 0 \r\n-0.0764546 -0.271895 0.55847 0 \r\n-0.0633567 -0.282739 0.545396 0 \r\n0.247185 -0.0981607 -0.91601 0 \r\n0.206267 -0.652824 -0.962696 0 \r\n0.217224 -0.647736 -0.956552 0 \r\n-0.215948 -0.763059 0.569708 0 \r\n0.506141 0.423132 0.0592556 0 \r\n0.492875 0.448233 0.0721382 0 \r\n-0.714044 -0.646302 0.776742 0 \r\n-0.726968 -0.631534 0.764508 0 \r\n0.136008 -0.367566 -0.969151 0 \r\n-0.07542 -0.671833 0.388241 0 \r\n-0.476617 -0.642794 0.79404 0 \r\n-0.319192 0.0293441 0.946032 0 \r\n-0.329101 0.0364936 0.925637 0 \r\n-0.160396 0.0517421 0.716122 0 \r\n-0.176691 0.0546112 0.732704 0 \r\n0.573553 -0.258253 -0.350607 0 \r\n0.581978 -0.469051 -0.828764 0 \r\n0.413032 0.345281 -0.943848 0 \r\n-0.279524 0.319454 -0.896905 0 \r\n0.753987 -0.0153621 -0.391146 0 \r\n0.749364 -0.0260142 -0.402595 0 \r\n-0.0535439 -0.761453 0.57486 0 \r\n0.400667 -0.871477 -0.294247 0 \r\n-0.458597 -0.106801 -0.443875 0 \r\n-0.435308 0.0367478 -0.221273 0 \r\n-0.196255 0.142761 -0.944254 0 \r\n-0.19686 0.112969 -0.940044 0 \r\n-0.16855 0.357162 -0.972057 0 \r\n-0.0363914 -0.798265 -0.437568 0 \r\n-0.291669 -0.0123571 0.91581 0 \r\n-0.311577 0.0105468 0.919639 0 \r\n-0.294944 -0.005799 0.935733 0 \r\n-0.228867 0.300413 -0.0126556 0 \r\n-0.23063 0.274617 0.00140525 0 \r\n0.460333 0.644548 -0.0616945 0 \r\n0.445786 0.661214 -0.0668672 0 \r\n0.610924 -0.084429 -0.166793 0 \r\n0.488542 -0.434137 0.0262735 0 \r\n0.116944 -0.923149 -0.255738 0 \r\n0.0144442 -0.498042 0.410702 0 \r\n-0.0331072 -0.553499 0.360058 0 \r\n-0.250826 -0.475778 -0.217762 0 \r\n-0.250127 -0.46333 -0.185213 0 \r\n-0.251251 -0.0621343 0.808957 0 \r\n-0.107106 -0.28443 0.800946 0 \r\n-0.0880499 -0.310952 0.789438 0 \r\n0.467717 -0.543905 0.411828 0 \r\n-0.024037 -0.779216 0.50242 0 \r\n-0.0129661 -0.781461 0.519371 0 \r\n0.526744 -0.901543 0.414914 0 \r\n0.560571 -0.893999 0.392578 0 \r\n-0.743736 -0.633228 0.87213 0 \r\n-0.090379 -0.490369 -0.586936 0 \r\n0.656592 -0.095947 -0.474911 0 \r\n-0.462381 -0.0956976 -0.339579 0 \r\n-0.467488 -0.0751648 -0.332788 0 \r\n0.342901 -0.903131 0.545727 0 \r\n0.370876 -0.896377 0.54098 0 \r\n-0.097198 -0.355076 0.63492 0 \r\n0.210016 -0.447774 0.490861 0 \r\n0.225295 -0.950163 0.368376 0 \r\n0.211052 -0.946082 0.35994 0 \r\n-0.338504 0.187557 -0.161905 0 \r\n0.282992 -0.826572 -0.459205 0 \r\n-0.0853707 -0.164028 0.138207 0 \r\n0.0922374 -0.375336 0.272786 0 \r\n0.0795275 -0.368267 0.265206 0 \r\n0.182581 0.800479 -0.268031 0 \r\n0.201764 0.800385 -0.281588 0 \r\n0.199338 0.799597 -0.265788 0 \r\n-0.231278 0.43715 -0.903256 0 \r\n-0.220828 0.632205 -0.331378 0 \r\n-0.212791 0.640963 -0.347032 0 \r\n0.191611 -0.197376 -0.95461 0 \r\n0.740679 -0.0664805 -0.318255 0 \r\n0.729504 -0.0815439 -0.333631 0 \r\n-0.166212 0.574377 -0.0624769 0 \r\n0.555389 0.613907 -0.544206 0 \r\n0.716304 0.374709 -0.340108 0 \r\n0.725374 0.353058 -0.370259 0 \r\n0.619827 -0.560313 -0.908363 0 \r\n0.626603 -0.546752 -0.905836 0 \r\n-0.127929 -0.437747 -0.565102 0 \r\n0.23684 0.600629 -0.952042 0 \r\n0.304274 -0.909628 0.550133 0 \r\n0.535143 0.127279 0.090842 0 \r\n0.546973 0.147399 0.0689057 0 \r\n-0.287778 0.51535 -0.297242 0 \r\n-0.295712 0.511437 -0.329612 0 \r\n-0.0656426 -0.101234 -0.906975 0 \r\n-0.0354549 -0.103126 -0.907017 0 \r\n0.0239964 0.92986 -0.69443 0 \r\n0.00912361 0.922772 -0.684532 0 \r\n0.460178 -0.0631963 -0.912269 0 \r\n0.44645 -0.0090531 -0.905421 0 \r\n-0.329195 0.230412 -0.806481 0 \r\n-0.32354 0.225981 -0.818047 0 \r\n-0.322318 0.248794 -0.815065 0 \r\n-0.0875534 0.123045 -0.894976 0 \r\n0.661635 -0.135459 -0.329681 0 \r\n0.661276 -0.134217 -0.304696 0 \r\n0.442019 -0.0925089 -0.915472 0 \r\n-0.0196529 -0.211729 0.767336 0 \r\n0.63396 -0.907477 0.263416 0 \r\n-0.209167 0.439641 -0.049462 0 \r\n-0.199644 0.463212 -0.0415648 0 \r\n-0.0572568 0.536595 0.114516 0 \r\n-0.0530849 0.483373 -0.92905 0 \r\n-0.0499251 0.474113 -0.939602 0 \r\n0.65696 0.487083 -0.478826 0 \r\n0.645339 0.506747 -0.464502 0 \r\n0.20631 0.126532 0.271614 0 \r\n-0.328264 -0.585114 0.548447 0 \r\n0.062061 0.94243 -0.709569 0 \r\n0.51879 -0.113246 -0.666378 0 \r\n-0.166745 -0.34002 -0.525088 0 \r\n-0.155378 -0.345814 -0.555502 0 \r\n-0.378876 -0.191254 -0.390019 0 \r\n-0.36393 -0.19523 -0.414047 0 \r\n0.529047 0.0169647 -0.919936 0 \r\n-0.300281 0.428544 -0.783991 0 \r\n-0.29934 0.446703 -0.77076 0 \r\n0.409597 -0.855592 -0.12606 0 \r\n0.39192 -0.86933 -0.123594 0 \r\n-0.223422 -0.228032 -0.789663 0 \r\n-0.230457 -0.211169 -0.784909 0 \r\n0.416741 -0.866052 -0.197942 0 \r\n-0.181796 -0.543534 -0.475748 0 \r\n-0.187289 -0.510164 -0.472645 0 \r\n0.679996 0.465313 -0.441642 0 \r\n0.683965 0.453032 -0.461112 0 \r\n0.171517 -0.893891 -0.374517 0 \r\n0.175302 -0.88335 -0.394884 0 \r\n0.529706 -0.394317 -0.547846 0 \r\n0.535253 -0.393432 -0.531806 0 \r\n-0.131472 -0.00885235 -0.902244 0 \r\n-0.115924 -0.017963 -0.902441 0 \r\n-0.609258 -0.591557 0.790175 0 \r\n-0.00215575 0.781048 -0.37974 0 \r\n0.112948 0.255472 0.278737 0 \r\n0.129655 0.262673 0.280672 0 \r\n0.503199 -0.22438 -0.707731 0 \r\n0.478607 -0.787881 -0.369571 0 \r\n0.480547 -0.793607 -0.351687 0 \r\n-0.325717 -0.129617 -0.818946 0 \r\n-0.331932 -0.122735 -0.831358 0 \r\n0.00777412 0.777676 -0.844828 0 \r\n0.0224701 0.775046 -0.858096 0 \r\n-0.276551 -0.0209178 0.94681 0 \r\n0.739314 0.271394 -0.250529 0 \r\n0.438698 0.801905 -0.704064 0 \r\n-0.429968 0.211962 -0.347654 0 \r\n-0.43034 0.212548 -0.376128 0 \r\n0.534692 -0.103657 -0.692239 0 \r\n0.539989 -0.108708 -0.712139 0 \r\n0.64607 -0.803047 0.0436699 0 \r\n0.647709 -0.81971 0.0547365 0 \r\n0.541696 0.509793 -0.853315 0 \r\n0.239104 0.789998 -0.210972 0 \r\n0.239156 0.794387 -0.23819 0 \r\n0.564385 -0.572144 0.230662 0 \r\n0.127463 -0.40791 -0.972219 0 \r\n0.150511 -0.418186 -0.971337 0 \r\n0.140131 -0.390819 -0.970294 0 \r\n0.0602793 -0.249416 0.623806 0 \r\n0.0682543 -0.251388 0.608231 0 \r\n-0.0845343 -0.207506 0.147618 0 \r\n-0.0117755 0.724018 -0.853458 0 \r\n-0.00244167 0.754754 -0.849976 0 \r\n0.540929 0.260743 -0.950481 0 \r\n0.567088 0.25596 -0.96075 0 \r\n0.57759 0.276308 -0.0568061 0 \r\n-0.0401945 -0.432431 0.55477 0 \r\n-0.0503635 -0.424149 0.579913 0 \r\n0.0913477 -0.901549 -0.332092 0 \r\n0.547233 -0.386319 -0.0679889 0 \r\n-0.119787 -0.798494 -0.241893 0 \r\n0.195856 -0.109457 -0.915651 0 \r\n0.160169 -0.107486 -0.914438 0 \r\n-0.0557081 -0.613132 -0.981633 0 \r\n0.385798 -0.881464 -0.289196 0 \r\n0.360795 -0.893257 -0.2935 0 \r\n-0.19693 -0.563125 -0.055815 0 \r\n-0.191975 -0.545229 -0.0239381 0 \r\n-0.187707 -0.565786 -0.035289 0 \r\n0.378254 0.763242 -0.499002 0 \r\n0.0560104 -0.24508 -0.945063 0 \r\n-0.357134 0.300875 -0.711658 0 \r\n0.414909 0.531319 0.132603 0 \r\n0.511791 0.661126 -0.587085 0 \r\n0.0413602 -0.683004 0.598794 0 \r\n0.036783 -0.694251 0.604558 0 \r\n0.436431 0.690491 -0.736827 0 \r\n0.438013 0.698191 -0.752106 0 \r\n0.562709 -0.318204 -0.865701 0 \r\n-0.0757334 -0.439128 -0.983369 0 \r\n-0.233936 0.0451373 0.717062 0 \r\n0.531388 0.665146 -0.308802 0 \r\n0.533571 0.657426 -0.270393 0 \r\n-0.138829 -0.346891 0.135285 0 \r\n0.227634 -0.479076 0.563819 0 \r\n0.207909 -0.474128 0.56232 0 \r\n0.233527 -0.469728 0.550008 0 \r\n0.108064 -0.497988 -0.747279 0 \r\n0.55916 -0.0108223 -0.933872 0 \r\n0.0144738 -0.544834 0.475789 0 \r\n-0.343758 0.421934 -0.315558 0 \r\n-0.350854 0.406525 -0.309839 0 \r\n0.614763 -0.204522 -0.823231 0 \r\n0.593071 -0.21131 -0.817204 0 \r\n0.603469 -0.196972 -0.810282 0 \r\n0.590176 0.354962 -0.0643488 0 \r\n0.113672 0.975526 -0.673889 0 \r\n0.471695 -0.450036 0.0531801 0 \r\n0.460266 -0.447526 0.0711991 0 \r\n-0.225459 -0.378806 -0.393496 0 \r\n-0.225323 -0.35292 -0.387751 0 \r\n-0.232917 -0.359327 -0.370591 0 \r\n-0.680902 -0.62806 0.604947 0 \r\n0.577657 -0.291595 -0.336231 0 \r\n0.634427 -0.16748 -0.808919 0 \r\n0.56756 0.310577 -0.962314 0 \r\n0.573542 0.340928 -0.963919 0 \r\n0.554979 0.340617 -0.962703 0 \r\n0.285933 0.858686 -0.830605 0 \r\n-0.060183 -0.612599 0.351965 0 \r\n-0.320104 0.00068277 -0.909636 0 \r\n-0.316006 0.0178312 -0.911424 0 \r\n-0.322248 0.478544 -0.508911 0 \r\n0.250815 -0.478046 -0.67741 0 \r\n-0.0829473 -0.218998 0.569843 0 \r\n-0.407496 0.147409 -0.642601 0 \r\n-0.405729 0.124856 -0.670037 0 \r\n0.565225 -0.207715 -0.113849 0 \r\n0.284942 -0.457981 0.479302 0 \r\n0.498649 0.688545 -0.466919 0 \r\n-0.427498 0.219117 -0.323422 0 \r\n-0.00369364 -0.53256 -0.636024 0 \r\n0.012675 -0.54232 -0.634532 0 \r\n0.519132 -0.262848 -0.717422 0 \r\n0.513856 -0.253639 -0.726579 0 \r\n0.518701 -0.26665 -0.730731 0 \r\n0.117483 -0.656791 -0.625114 0 \r\n0.330429 -0.453458 -0.787285 0 \r\n0.326548 -0.468668 -0.80616 0 \r\n0.708574 0.113328 -0.168474 0 \r\n0.692106 0.115558 -0.155356 0 \r\n0.167092 -0.747921 -0.565747 0 \r\n0.681864 -0.159701 -0.950343 0 \r\n0.696506 -0.144814 -0.945634 0 \r\n0.351893 -0.859898 -0.382564 0 \r\n0.37347 -0.857662 -0.370736 0 \r\n0.463867 0.119403 0.18102 0 \r\n0.453718 0.131201 0.19191 0 \r\n0.465329 0.146377 0.185539 0 \r\n-0.164517 -0.200114 0.835609 0 \r\n-0.15017 -0.226761 0.821305 0 \r\n-0.323989 0.0252557 0.925803 0 \r\n0.331217 0.905905 -0.506722 0 \r\n0.318179 0.890174 -0.496506 0 \r\n0.304569 0.911249 -0.490783 0 \r\n-0.349667 -0.645258 0.751449 0 \r\n-0.0911686 0.293025 -0.921999 0 \r\n-0.0761749 0.279987 -0.917153 0 \r\n0.067779 0.957695 -0.553167 0 \r\n-0.0250342 -0.0806374 0.605456 0 \r\n0.388081 0.139939 0.237661 0 \r\n0.408854 0.153049 0.228535 0 \r\n0.361382 -0.881548 -0.0952639 0 \r\n0.370321 -0.883351 -0.116688 0 \r\n0.415496 -0.538631 0.55861 0 \r\n0.644648 -0.143451 -0.299093 0 \r\n0.66249 -0.133331 -0.282762 0 \r\n-0.0604974 -0.493917 0.220919 0 \r\n-0.247396 -0.345764 -0.106396 0 \r\n0.721078 0.112269 -0.178371 0 \r\n0.406946 0.591591 -0.874846 0 \r\n0.394069 0.595327 -0.884219 0 \r\n-0.155005 -0.0513462 0.961913 0 \r\n-0.346447 -0.104742 -0.898403 0 \r\n0.580687 -0.92453 0.300071 0 \r\n0.565542 -0.932487 0.295547 0 \r\n0.216085 -0.900893 -0.355819 0 \r\n0.193157 -0.900048 -0.361448 0 \r\n-0.42737 0.0556799 -0.206414 0 \r\n-0.422548 0.0861146 -0.203869 0 \r\n0.140698 -0.70587 -0.912759 0 \r\n0.124178 -0.716588 -0.914585 0 \r\n0.126024 -0.709301 -0.899418 0 \r\n0.391484 0.809817 -0.575895 0 \r\n0.374674 0.803721 -0.560876 0 \r\n0.57803 -0.126278 -0.955251 0 \r\n0.578393 -0.135748 -0.956523 0 \r\n0.588812 -0.120618 -0.959616 0 \r\n0.512522 -0.617657 -0.0173272 0 \r\n0.538854 -0.423467 -0.798929 0 \r\n-0.112079 -0.322881 -0.966185 0 \r\n-0.580989 -0.686377 0.650334 0 \r\n0.200036 0.469153 0.232099 0 \r\n0.220153 0.455761 0.237952 0 \r\n0.204197 0.455492 0.237365 0 \r\n0.0521903 -0.215329 0.61191 0 \r\n0.0689403 -0.240548 0.596184 0 \r\n0.65571 0.0025879 -0.794194 0 \r\n0.658704 -0.0102475 -0.80037 0 \r\n-0.70558 -0.622109 0.637032 0 \r\n0.36092 0.270591 0.252915 0 \r\n0.352826 0.300786 0.253683 0 \r\n-0.170238 -0.158011 0.683026 0 \r\n-0.0808076 -0.435416 -0.811242 0 \r\n-0.0753007 -0.435139 -0.790009 0 \r\n0.209944 0.824723 -0.866173 0 \r\n0.229169 0.847345 -0.848504 0 \r\n-0.345603 0.223761 -0.167487 0 \r\n0.514893 -0.26177 -0.0213289 0 \r\n-0.596913 -0.684783 0.878371 0 \r\n-0.566858 -0.687901 0.862671 0 \r\n0.526427 -0.171597 -0.942464 0 \r\n-0.0212063 -0.553081 -0.819775 0 \r\n-0.005371 -0.566998 -0.813647 0 \r\n-0.0203948 -0.57007 -0.829235 0 \r\n0.00250594 -0.37462 0.770102 0 \r\n-0.0716268 -0.739305 0.137402 0 \r\n-0.0641401 -0.75475 0.117946 0 \r\n0.43422 -0.359267 0.0880092 0 \r\n0.269035 0.188931 -0.921137 0 \r\n-0.387969 -0.731272 0.546397 0 \r\n-0.396139 -0.730155 0.553707 0 \r\n-0.282699 0.317109 -0.88728 0 \r\n-0.25094 -0.379592 -0.138055 0 \r\n0.183344 0.723251 -0.918656 0 \r\n0.144062 -0.559105 0.592329 0 \r\n0.665179 -0.85671 0.297503 0 \r\n0.222158 0.534644 -0.961151 0 \r\n0.243347 0.526494 -0.960949 0 \r\n0.548685 -0.928748 0.0443235 0 \r\n0.063823 0.428169 -0.964958 0 \r\n0.0490342 0.439802 -0.964598 0 \r\n-0.00549965 -0.133165 0.177642 0 \r\n0.19075 0.29909 0.279364 0 \r\n0.16618 0.303423 0.278098 0 \r\n-0.234443 0.445374 -0.108084 0 \r\n-0.231803 0.425736 -0.0923391 0 \r\n0.416736 0.403126 0.200269 0 \r\n-0.0600875 0.732517 -0.738019 0 \r\n-0.509586 -0.706053 0.638941 0 \r\n0.669853 0.431055 -0.232229 0 \r\n-0.0698836 -0.300282 0.813538 0 \r\n-0.0719117 -0.321876 0.791472 0 \r\n0.137881 0.805496 -0.419383 0 \r\n0.163998 0.239487 -0.957205 0 \r\n0.176195 0.245479 -0.96363 0 \r\n0.0144748 -0.467545 0.445546 0 \r\n-0.467969 0.022662 -0.457541 0 \r\n0.0116576 -0.507705 0.591125 0 \r\n-0.0847398 -0.585743 -0.91292 0 \r\n-0.0716756 -0.744704 0.153491 0 \r\n-0.0841492 -0.678102 0.654983 0 \r\n0.615562 0.55863 -0.405431 0 \r\n-0.572464 -0.626889 0.822981 0 \r\n0.0539429 -0.207426 0.589963 0 \r\n0.0653462 -0.231897 0.574798 0 \r\n0.0642795 -0.22896 0.584697 0 \r\n0.212919 -0.544393 0.584645 0 \r\n0.36851 0.123994 -0.900818 0 \r\n0.388615 0.137002 -0.897531 0 \r\n0.57251 0.579913 -0.171711 0 \r\n0.564265 0.57653 -0.146875 0 \r\n0.555861 0.597076 -0.161988 0 \r\n0.510717 -0.159692 -0.59277 0 \r\n0.126345 0.81459 -0.451524 0 \r\n0.12213 0.824603 -0.461048 0 \r\n0.756467 0.102297 -0.482994 0 \r\n0.753941 0.115102 -0.513528 0 \r\n-0.111956 -0.512669 0.130501 0 \r\n-0.108567 -0.541004 0.1288 0 \r\n0.441935 -0.983644 0.150705 0 \r\n0.439378 -0.980561 0.125494 0 \r\n0.0124908 0.789178 -0.315762 0 \r\n0.172991 -0.987729 0.176533 0 \r\n0.193275 -0.993318 0.162467 0 \r\n-0.118024 -0.0425448 -0.904464 0 \r\n-0.0975088 -0.0184242 -0.902391 0 \r\n-0.581995 -0.646757 0.541649 0 \r\n-0.385754 -0.154727 -0.269569 0 \r\n-0.366511 -0.167615 -0.268831 0 \r\n0.606664 0.505512 -0.660808 0 \r\n0.150929 -0.410398 0.606904 0 \r\n0.593201 0.555434 -0.559991 0 \r\n0.590747 0.554926 -0.58474 0 \r\n0.602223 0.53933 -0.571269 0 \r\n0.304394 -0.840163 0.577153 0 \r\n-0.415329 0.159057 -0.597233 0 \r\n-0.417967 0.164027 -0.577888 0 \r\n-0.0228188 0.748585 -0.83013 0 \r\n-0.0203274 0.714845 -0.846348 0 \r\n0.308326 0.483576 -0.960111 0 \r\n0.287179 0.472608 -0.959521 0 \r\n0.313738 0.468333 -0.959759 0 \r\n-0.446791 -0.134882 -0.412648 0 \r\n-0.0250144 0.772285 -0.246062 0 \r\n-0.00881085 0.779709 -0.255854 0 \r\n-0.0061622 0.777655 -0.234913 0 \r\n-0.223826 -0.173672 -0.0110161 0 \r\n0.434776 -0.793002 -0.422694 0 \r\n0.420705 -0.810456 -0.410462 0 \r\n0.356385 0.895134 -0.527499 0 \r\n0.342776 0.916209 -0.521776 0 \r\n-0.101733 -0.369569 -0.809242 0 \r\n0.318147 -0.484894 -0.971503 0 \r\n0.351669 -0.451454 -0.660195 0 \r\n0.330309 -0.125868 0.169964 0 \r\n-0.16168 0.62628 -0.129856 0 \r\n-0.150828 0.643853 -0.1396 0 \r\n-0.319969 -0.686418 0.466766 0 \r\n0.0714488 0.240229 0.274172 0 \r\n0.0853627 0.253251 0.27661 0 \r\n-0.339422 -0.57575 0.644295 0 \r\n-0.02565 -0.412906 0.715811 0 \r\n-0.00212312 -0.44301 0.696464 0 \r\n-0.357094 0.377926 -0.277241 0 \r\n0.228561 0.778142 -0.155848 0 \r\n0.258637 0.773348 -0.153079 0 \r\n0.716418 0.386368 -0.41941 0 \r\n0.102633 0.00468765 -0.907079 0 \r\n0.558491 0.471747 -0.911425 0 \r\n-0.151977 -0.625988 0.65394 0 \r\n-0.219023 -0.250651 -0.417047 0 \r\n-0.233833 -0.250602 -0.391135 0 \r\n-0.0914317 -0.691245 0.662413 0 \r\n-0.0432141 0.570558 -0.857765 0 \r\n0.503308 -0.623595 -0.863923 0 \r\n0.504849 -0.635382 -0.87968 0 \r\n-0.357381 0.316839 -0.701894 0 \r\n-0.352704 0.307936 -0.725301 0 \r\n0.703266 0.342376 -0.664761 0 \r\n-0.692139 -0.624152 0.617363 0 \r\n-0.70268 -0.616699 0.63629 0 \r\n0.608875 -0.69753 0.425727 0 \r\n0.589964 -0.672226 0.434209 0 \r\n-0.195037 -0.761375 0.550822 0 \r\n-0.186183 -0.764149 0.563928 0 \r\n0.760021 0.0142668 -0.302414 0 \r\n0.757495 -0.0043826 -0.30397 0 \r\n0.452535 -0.708581 0.567762 0 \r\n0.437126 -0.747977 0.566335 0 \r\n0.155715 -0.984571 0.166997 0 \r\n0.158197 -0.982754 0.188969 0 \r\n0.67432 0.250807 -0.775166 0 \r\n0.604153 -0.598154 0.0888912 0 \r\n0.231503 -0.766558 0.588708 0 \r\n0.268542 -0.768566 0.589968 0 \r\n-0.111332 -0.191489 0.894056 0 \r\n0.289622 0.202675 -0.921945 0 \r\n-0.0329662 0.745259 -0.642368 0 \r\n-0.0571727 -0.767704 0.103486 0 \r\n-0.0637992 -0.764769 0.496439 0 \r\n-0.176737 0.661628 -0.242996 0 \r\n-0.0593368 0.726337 -0.757199 0 \r\n-0.0585985 0.709367 -0.756658 0 \r\n0.30569 -0.177141 -0.946584 0 \r\n0.331232 -0.169684 -0.941035 0 \r\n0.577506 -0.503686 -0.962528 0 \r\n0.69138 -0.83258 0.245299 0 \r\n0.69523 -0.831705 0.217043 0 \r\n0.560109 -0.421008 -0.472232 0 \r\n0.566912 -0.432938 -0.453682 0 \r\n0.186592 0.539008 -0.962412 0 \r\n0.549458 -0.299461 -0.583797 0 \r\n0.547969 -0.290469 -0.600237 0 \r\n0.547113 -0.311365 -0.621329 0 \r\n0.221436 -0.910713 -0.332567 0 \r\n0.423709 0.0154145 0.173901 0 \r\n-0.376602 -0.601191 0.718249 0 \r\n-0.333393 -0.600389 0.703209 0 \r\n0.117644 0.213405 -0.933933 0 \r\n-0.0951658 -0.437674 -0.852858 0 \r\n-0.101912 -0.448583 -0.875008 0 \r\n0.260931 0.479762 -0.95856 0 \r\n-0.263792 0.0707623 0.860679 0 \r\n-0.248102 0.0607282 0.844247 0 \r\n0.400532 -0.974725 0.223761 0 \r\n0.420601 -0.97163 0.229661 0 \r\n-0.0401099 -0.6527 -0.962426 0 \r\n-0.091893 -0.238897 0.153797 0 \r\n0.0307427 -0.89377 -0.174575 0 \r\n0.0482643 -0.902448 -0.183622 0 \r\n0.0294753 -0.895805 -0.200552 0 \r\n-0.0965686 -0.503129 -0.894261 0 \r\n-0.100749 -0.472615 -0.886019 0 \r\n0.0392075 0.776171 -0.867956 0 \r\n0.412891 -0.84302 -0.00546558 0 \r\n0.441666 -0.827026 -0.00471533 0 \r\n0.450673 -0.529557 -0.789474 0 \r\n0.454201 0.335325 0.183334 0 \r\n0.44866 0.360493 0.183282 0 \r\n-0.117463 -0.43457 -0.593792 0 \r\n0.708579 0.167924 -0.71592 0 \r\n0.718571 0.185268 -0.702723 0 \r\n0.147754 -0.932573 -0.181435 0 \r\n-0.313443 0.365749 -0.185625 0 \r\n-0.331363 0.347865 -0.196014 0 \r\n-0.0988943 -0.185563 -0.912271 0 \r\n0.619563 -0.14389 -0.788007 0 \r\n0.608507 -0.132174 -0.776568 0 \r\n-0.589974 -0.679644 0.582191 0 \r\n-0.599056 -0.679506 0.607619 0 \r\n-0.296691 -0.73251 0.497445 0 \r\n-0.0677641 -0.160672 0.803831 0 \r\n-0.336856 0.437613 -0.324802 0 \r\n-0.267739 -0.186242 -0.138187 0 \r\n0.519413 -0.278535 -0.74386 0 \r\n-0.183526 0.0729363 -0.922454 0 \r\n-0.172589 0.118832 -0.920461 0 \r\n0.130231 -0.4106 0.34219 0 \r\n-0.116298 -0.494915 0.131793 0 \r\n-0.0753006 0.353769 -0.9562 0 \r\n-0.200274 0.525497 -0.807616 0 \r\n0.427387 0.833081 -0.719904 0 \r\n0.47787 -0.770081 -0.0267901 0 \r\n0.478539 -0.77824 -0.0160799 0 \r\n0.291039 -0.290275 0.202651 0 \r\n-0.234655 -0.236942 -0.796266 0 \r\n-0.211939 -0.241385 -0.790408 0 \r\n-0.343903 0.379218 -0.696262 0 \r\n-0.344858 0.349303 -0.717993 0 \r\n-0.337399 0.372235 -0.723145 0 \r\n-0.077428 -0.271233 -0.925832 0 \r\n-0.0291636 -0.442813 0.529239 0 \r\n0.219562 -0.488329 0.57364 0 \r\n0.392828 -0.879477 0.542381 0 \r\n-0.12679 -0.355788 0.151717 0 \r\n0.349506 -0.626024 -0.600092 0 \r\n-0.534936 -0.684213 0.843568 0 \r\n0.694861 -0.169133 -0.923705 0 \r\n0.611131 0.327563 -0.866167 0 \r\n-0.0930256 0.642063 -0.716166 0 \r\n0.328493 0.965234 -0.585983 0 \r\n-0.348136 -0.0549713 -0.777833 0 \r\n-0.353765 -0.0568433 -0.753663 0 \r\n-0.348068 0.0792297 0.875559 0 \r\n-0.346932 0.0694601 0.899544 0 \r\n-0.0959523 -0.346637 0.180491 0 \r\n-0.110294 -0.353948 0.167691 0 \r\n-0.109315 -0.32932 0.167266 0 \r\n0.513508 0.520034 -0.00494676 0 \r\n0.5057 0.546655 -0.0140653 0 \r\n0.517021 -0.642519 -0.0341612 0 \r\n-0.111422 0.438723 -0.9565 0 \r\n0.0513721 0.791705 -0.44462 0 \r\n-0.18264 -0.456535 0.0476182 0 \r\n0.429935 -0.500377 0.366378 0 \r\n0.519994 0.652093 -0.186682 0 \r\n-0.300855 -0.194187 -0.247501 0 \r\n-0.299043 -0.174042 -0.22297 0 \r\n-0.198515 -0.032412 0.982869 0 \r\n-0.157164 -0.178946 -0.715596 0 \r\n0.204406 -0.951315 0.472292 0 \r\n0.441251 0.731521 -0.731421 0 \r\n-0.171987 -0.286983 -0.510467 0 \r\n0.162492 0.61085 0.123772 0 \r\n0.594788 -0.107475 -0.146414 0 \r\n0.588812 -0.103143 -0.127042 0 \r\n0.073162 -0.890293 0.029153 0 \r\n0.0978145 -0.901603 0.0209279 0 \r\n0.0808545 -0.88369 0.0127771 0 \r\n-0.349113 -0.174447 -0.265561 0 \r\n-0.351358 -0.183669 -0.280214 0 \r\n0.363711 -0.603092 -0.89171 0 \r\n0.62941 0.211749 -0.924837 0 \r\n0.638983 0.179245 -0.91435 0 \r\n-0.0732217 -0.468735 -0.651353 0 \r\n-0.345652 0.333109 -0.730206 0 \r\n-0.352156 0.340093 -0.703323 0 \r\n-0.247741 0.440477 -0.131658 0 \r\n0.488651 -0.53828 -0.793823 0 \r\n0.504279 -0.550689 -0.804505 0 \r\n-0.162223 -0.234322 0.744139 0 \r\n0.247977 -0.625479 0.595281 0 \r\n0.240271 -0.601174 0.593714 0 \r\n0.140848 0.239984 0.281767 0 \r\n0.139105 0.249074 0.281943 0 \r\n0.587992 -0.190987 -0.194404 0 \r\n0.59305 -0.171797 -0.202351 0 \r\n0.540384 -0.0973102 -0.653383 0 \r\n0.353423 -0.951563 0.442937 0 \r\n0.355202 -0.472436 0.48478 0 \r\n0.343633 -0.472418 0.504522 0 \r\n-0.371169 0.295276 -0.65571 0 \r\n-0.365041 0.313239 -0.668619 0 \r\n0.688956 0.414468 -0.272673 0 \r\n0.700671 0.39581 -0.285532 0 \r\n-0.197749 -0.595204 -0.107873 0 \r\n-0.189703 -0.605724 -0.0861225 0 \r\n0.44646 -0.939876 0.326262 0 \r\n0.389943 0.49318 0.176044 0 \r\n0.403942 0.47721 0.175178 0 \r\n0.025887 0.527017 0.165278 0 \r\n0.0070976 0.540517 0.148894 0 \r\n0.707012 0.3878 -0.311129 0 \r\n0.714078 0.369838 -0.303109 0 \r\n0.521529 0.676908 -0.365842 0 \r\n0.502873 0.693241 -0.375207 0 \r\n0.113373 0.85327 -0.478918 0 \r\n-0.250921 -0.137795 -0.964791 0 \r\n0.678606 0.426235 -0.251451 0 \r\n-0.288186 0.386176 -0.171558 0 \r\n0.221195 0.498949 -0.959478 0 \r\n0.380044 -0.0986675 0.153511 0 \r\n0.54675 0.517908 -0.771913 0 \r\n-0.00670804 -0.80487 0.429846 0 \r\n-0.0170307 -0.800891 0.411402 0 \r\n-0.422192 0.187167 -0.241231 0 \r\n-0.413298 0.174394 -0.216486 0 \r\n0.200251 -0.769037 0.585667 0 \r\n0.0513337 -0.27644 0.657894 0 \r\n-0.152427 -0.52056 0.0686515 0 \r\n0.567799 -0.719549 0.485517 0 \r\n0.385756 -0.742966 -0.506364 0 \r\n0.378638 -0.766412 -0.490225 0 \r\n0.407552 -0.747362 -0.491427 0 \r\n0.562253 -0.153172 -0.0821285 0 \r\n0.555113 -0.174535 -0.0751275 0 \r\n-0.459085 0.0401824 -0.291726 0 \r\n0.6754 0.477055 -0.355563 0 \r\n0.683405 0.461406 -0.3581 0 \r\n-0.144233 -0.485155 0.0968342 0 \r\n0.583722 0.135414 -0.0555551 0 \r\n0.583607 0.124477 -0.0524261 0 \r\n-0.0830323 -0.643206 -0.539454 0 \r\n-0.237674 -0.290578 -0.0568371 0 \r\n-0.138853 0.116804 0.136603 0 \r\n-0.13125 0.0986287 0.141273 0 \r\n0.62694 0.222053 -0.947437 0 \r\n0.687245 0.184293 -0.151377 0 \r\n0.624923 0.233115 -0.938601 0 \r\n-0.00965135 -0.788641 0.495452 0 \r\n-0.232978 -0.100791 0.861313 0 \r\n-0.239285 -0.0816372 0.886797 0 \r\n-0.125114 -0.67193 -0.486584 0 \r\n0.407438 0.755045 -0.337102 0 \r\n0.0534915 -0.286564 0.713606 0 \r\n0.058217 -0.291418 0.721186 0 \r\n-0.291845 0.0938295 -0.134061 0 \r\n-0.302289 0.102447 -0.144005 0 \r\n-0.00568437 0.843215 -0.597061 0 \r\n-0.0119793 0.857296 -0.607003 0 \r\n0.0981104 -0.64827 0.576774 0 \r\n0.108016 -0.65747 0.579249 0 \r\n0.59953 -0.650388 0.340524 0 \r\n0.619874 -0.655755 0.309903 0 \r\n-0.187216 0.182866 -0.943321 0 \r\n-0.195112 0.167981 -0.949019 0 \r\n0.426687 0.349354 0.207444 0 \r\n0.419745 0.370247 0.207336 0 \r\n0.433536 0.3703 0.196186 0 \r\n0.60281 -0.103696 -0.518856 0 \r\n0.533571 -0.295026 -0.808869 0 \r\n0.537302 -0.277905 -0.812529 0 \r\n0.542578 -0.292587 -0.825118 0 \r\n0.348971 0.277361 -0.928756 0 \r\n0.361018 0.297565 -0.933348 0 \r\n-0.00757342 -0.490239 0.55556 0 \r\n0.051699 0.798372 -0.860704 0 \r\n0.05535 0.776202 -0.87518 0 \r\n0.305317 -0.577299 -0.96829 0 \r\n-0.323449 0.463269 -0.64851 0 \r\n-0.554852 -0.667678 0.845976 0 \r\n0.287033 -0.966702 0.0703689 0 \r\n-0.100134 0.2382 0.183603 0 \r\n-0.0985547 0.258615 0.186748 0 \r\n0.00043055 0.0220441 -0.904007 0 \r\n-0.0398821 -0.0100814 -0.904243 0 \r\n-0.32629 0.315858 -0.174071 0 \r\n-0.326723 0.332471 -0.180734 0 \r\n0.174816 -0.281979 0.230854 0 \r\n0.2959 0.791886 -0.271883 0 \r\n-0.468881 0.0598825 -0.370848 0 \r\n-0.469999 0.0513685 -0.355837 0 \r\n-0.471467 0.0454694 -0.377246 0 \r\n-0.0186557 -0.426912 0.495442 0 \r\n-0.0215866 -0.443195 0.511567 0 \r\n0.614769 -0.150593 -0.262543 0 \r\n0.620227 -0.14648 -0.247975 0 \r\n0.462653 0.277439 0.186779 0 \r\n0.448359 0.269382 0.202018 0 \r\n0.540301 -0.258833 -0.814216 0 \r\n0.67609 0.0371005 -0.155665 0 \r\n0.665157 0.0143498 -0.157302 0 \r\n0.704801 0.0455316 -0.649372 0 \r\n-0.105381 -0.23395 0.138497 0 \r\n-0.105237 -0.214002 0.131741 0 \r\n-0.42654 -0.00346792 -0.210817 0 \r\n-0.344596 -0.128514 -0.868732 0 \r\n-0.345279 -0.107873 -0.882815 0 \r\n-0.111596 -0.193866 0.120182 0 \r\n-0.13209 -0.183348 0.103756 0 \r\n-0.104885 -0.17704 0.124436 0 \r\n-0.441931 -0.775958 0.731714 0 \r\n0.0972822 -0.878247 0.483556 0 \r\n0.0107118 -0.364301 0.773033 0 \r\n0.441386 -0.805059 0.552696 0 \r\n0.469496 -0.791633 0.542781 0 \r\n-0.193186 -0.0599692 0.97628 0 \r\n0.224115 -0.667555 0.595261 0 \r\n0.235181 -0.679322 0.595307 0 \r\n0.409062 0.860035 -0.735142 0 \r\n0.401015 0.857005 -0.753715 0 \r\n-0.176043 0.616096 -0.145002 0 \r\n0.563871 -0.672357 -0.175393 0 \r\n0.0652405 -0.480558 0.667367 0 \r\n0.107572 0.598559 0.126906 0 \r\n-0.237683 0.0792245 0.0112942 0 \r\n-0.240844 0.0686819 0.00211614 0 \r\n-0.242197 0.0796967 5.168e-005 0 \r\n-0.186464 -0.599016 -0.0651493 0 \r\n-0.179568 -0.594317 -0.04489 0 \r\n-0.0797046 0.739323 -0.434267 0 \r\n0.248891 0.872295 -0.82947 0 \r\n0.278664 0.874583 -0.819775 0 \r\n0.455658 -0.314314 0.06847 0 \r\n0.437146 -0.322569 0.0888653 0 \r\n-0.23105 -0.680084 0.723791 0 \r\n-0.238116 -0.666635 0.720719 0 \r\n-0.311552 0.0569096 0.810248 0 \r\n0.598856 -0.0907557 -0.557503 0 \r\n0.60476 -0.0934117 -0.542778 0 \r\n0.552644 -0.18272 -0.410271 0 \r\n0.496917 -0.89014 0.463135 0 \r\n0.519968 -0.87601 0.455181 0 \r\n0.598426 -0.597095 -0.221639 0 \r\n0.672624 0.14398 -0.771388 0 \r\n0.439242 0.692136 -0.68665 0 \r\n-0.268627 -0.325091 -0.983896 0 \r\n0.264879 0.403048 -0.958969 0 \r\n0.484091 0.687223 -0.58444 0 \r\n-0.185977 0.635651 -0.20459 0 \r\n0.571722 0.455086 -0.853304 0 \r\n0.15249 -0.42702 0.615573 0 \r\n0.132565 -0.407533 0.648129 0 \r\n0.14114 -0.407898 0.630572 0 \r\n0.206723 0.868772 -0.463105 0 \r\n-0.21692 -0.217831 -0.502918 0 \r\n0.634313 -0.693023 0.367343 0 \r\n0.607126 -0.674785 0.386332 0 \r\n-0.107697 0.648294 -0.0589043 0 \r\n0.122536 -0.368748 0.63657 0 \r\n0.127773 -0.379799 0.640036 0 \r\n0.109516 -0.355137 0.660815 0 \r\n-0.389966 0.328093 -0.468601 0 \r\n0.0078815 -0.511365 0.492137 0 \r\n0.0120529 -0.525457 0.499261 0 \r\n0.0402379 -0.506904 -0.698691 0 \r\n0.0161133 -0.504559 -0.697901 0 \r\n-0.289218 0.467814 -0.76894 0 \r\n0.127654 -0.602663 0.582736 0 \r\n0.125146 -0.627224 0.580059 0 \r\n0.115278 -0.615556 0.579919 0 \r\n-0.0132723 0.523546 -0.921689 0 \r\n0.141798 -0.665155 -0.621967 0 \r\n0.0971989 -0.893857 -0.0603335 0 \r\n0.564178 -0.646414 -0.148528 0 \r\n0.712574 -0.71022 0.202837 0 \r\n0.585937 0.538904 -0.142451 0 \r\n0.577631 0.532174 -0.118183 0 \r\n0.572608 0.552637 -0.132329 0 \r\n0.293384 0.402997 -0.960101 0 \r\n0.0936795 0.833964 -0.850279 0 \r\n-0.231903 0.6195 -0.336636 0 \r\n-0.0185296 0.259944 0.244873 0 \r\n-0.154306 0.404729 -0.969428 0 \r\n0.551684 -0.194761 -0.784525 0 \r\n0.397581 -0.720812 -0.520748 0 \r\n0.368666 -0.739862 -0.519546 0 \r\n-0.557243 -0.690933 0.576064 0 \r\n-0.299056 -0.608361 0.70077 0 \r\n0.309732 0.942872 -0.506833 0 \r\n0.320082 0.951375 -0.524941 0 \r\n0.327958 0.935484 -0.519107 0 \r\n-0.1314 0.678589 -0.168665 0 \r\n-0.143021 0.673728 -0.181923 0 \r\n-0.0184384 -0.805718 0.391551 0 \r\n-0.0124386 -0.815719 0.381212 0 \r\n-0.45567 -0.593643 0.729529 0 \r\n-0.420933 -0.601811 0.733187 0 \r\n-0.468313 -0.602289 0.746033 0 \r\n0.7034 -0.145821 -0.935842 0 \r\n0.691795 0.0297503 -0.90538 0 \r\n-0.0973536 -0.704599 0.666828 0 \r\n-0.143894 -0.707615 0.688905 0 \r\n0.223086 -0.619938 -0.912358 0 \r\n0.629861 -0.529665 -0.911098 0 \r\n-0.0587022 0.743422 -0.755501 0 \r\n0.309695 0.900706 -0.787454 0 \r\n-0.0241797 -0.341288 0.222262 0 \r\n-0.0389285 -0.362872 0.218345 0 \r\n0.152677 -0.943511 0.048469 0 \r\n-0.149359 -0.0655871 0.875289 0 \r\n0.252288 -0.744719 -0.560526 0 \r\n0.231967 -0.764381 -0.546486 0 \r\n0.631278 -0.139683 -0.246095 0 \r\n0.642796 -0.130268 -0.241781 0 \r\n0.0719038 -0.356972 0.253511 0 \r\n-0.223909 0.113379 0.0356279 0 \r\n0.225719 0.517808 0.199672 0 \r\n0.235688 0.541644 0.182867 0 \r\n0.53697 -0.364029 -0.591056 0 \r\n0.608143 -0.279144 -0.932623 0 \r\n0.61619 -0.261038 -0.927155 0 \r\n-0.0547789 0.791659 -0.718879 0 \r\n-0.0580272 0.768404 -0.738522 0 \r\n0.575094 -0.612643 -0.910522 0 \r\n0.587561 0.432803 -0.801138 0 \r\n0.584868 0.507136 -0.108744 0 \r\n0.276916 -0.387816 0.293321 0 \r\n0.304268 -0.3922 0.288454 0 \r\n0.462595 -0.983167 0.15498 0 \r\n0.442916 -0.983186 0.167531 0 \r\n0.341034 -0.409611 -0.968104 0 \r\n-0.534053 -0.720997 0.859179 0 \r\n0.621498 -0.593261 0.120036 0 \r\n0.0346148 -0.665473 -0.85777 0 \r\n0.0225396 -0.671811 -0.875232 0 \r\n-0.25188 -0.442497 -0.183056 0 \r\n0.471784 0.62421 -0.0496213 0 \r\n0.589999 0.481454 -0.737324 0 \r\n0.0419994 -0.70556 0.600915 0 \r\n0.576749 0.0938711 -0.0315353 0 \r\n0.273678 0.812323 -0.475657 0 \r\n0.257553 0.820598 -0.468938 0 \r\n-0.0746039 -0.73745 0.177668 0 \r\n0.0678097 0.814409 -0.857288 0 \r\n0.426485 0.567901 -0.88106 0 \r\n0.435227 0.577183 -0.863517 0 \r\n0.41946 0.586123 -0.864966 0 \r\n-0.202147 0.328715 0.0562826 0 \r\n-0.211318 0.308523 0.04657 0 \r\n0.207269 0.852533 -0.463894 0 \r\n0.228632 0.86612 -0.464979 0 \r\n-0.190301 0.355087 0.0664206 0 \r\n0.441972 -0.610188 -0.853903 0 \r\n0.430044 -0.622772 -0.874169 0 \r\n0.307988 0.875688 -0.49114 0 \r\n0.383749 -0.841969 -0.0401054 0 \r\n0.502893 0.694247 -0.345908 0 \r\n0.51699 0.682885 -0.346345 0 \r\n-0.534325 -0.739032 0.752514 0 \r\n-0.537908 -0.728933 0.740399 0 \r\n-0.236356 0.053449 0.00609349 0 \r\n0.584594 -0.210802 -0.237445 0 \r\n0.103043 -0.542549 0.604942 0 \r\n-0.0495339 0.202862 0.225666 0 \r\n-0.051298 0.188262 0.222818 0 \r\n0.265595 0.606124 -0.947495 0 \r\n-0.0685361 0.183131 0.209587 0 \r\n0.503428 -0.532997 0.08073 0 \r\n0.232185 -0.487651 -0.678587 0 \r\n0.69346 -0.780274 0.113764 0 \r\n0.464188 -0.748273 0.556193 0 \r\n0.43092 -0.777678 0.563674 0 \r\n-0.0414085 -0.435107 0.628372 0 \r\n0.0214095 -0.526332 0.561562 0 \r\n-0.0206345 0.863724 -0.630342 0 \r\n-0.0596709 0.612231 -0.797408 0 \r\n0.0868705 -0.407219 0.703395 0 \r\n-0.230462 0.0537136 0.812184 0 \r\n-0.208975 -0.0641501 -0.933823 0 \r\n-0.203699 -0.0965782 -0.929839 0 \r\n-0.163131 -0.174118 -0.918128 0 \r\n-0.182827 -0.218165 -0.924878 0 \r\n0.534479 -0.201077 -0.953755 0 \r\n0.278426 -0.999928 0.152163 0 \r\n-0.212267 0.0897775 0.707587 0 \r\n0.222754 -0.899685 0.00100893 0 \r\n0.225908 -0.896146 -0.00748904 0 \r\n-0.0596045 -0.633968 -0.928436 0 \r\n0.601113 -0.583194 -0.324612 0 \r\n0.380734 -0.365035 0.151364 0 \r\n-0.0141579 -0.575964 0.462191 0 \r\n-0.0158452 -0.573107 0.443699 0 \r\n-0.20513 -0.387542 -0.94992 0 \r\n0.46217 -0.536977 0.458543 0 \r\n0.116596 0.725803 -0.916506 0 \r\n0.115114 0.753016 -0.902507 0 \r\n0.359654 -0.779271 -0.487032 0 \r\n0.332503 -0.786103 -0.488804 0 \r\n0.590737 -0.393532 -0.303053 0 \r\n-0.227086 0.330018 -0.0288104 0 \r\n-0.223928 0.355471 -0.0384025 0 \r\n0.631527 0.469277 -0.657425 0 \r\n0.465652 -0.799675 -0.12343 0 \r\n0.723858 0.0256811 -0.549079 0 \r\n0.635081 -0.0289352 -0.732586 0 \r\n0.619491 -0.0413212 -0.731316 0 \r\n0.620216 -0.0419107 -0.717788 0 \r\n-0.424165 -0.724102 0.558869 0 \r\n-0.401192 -0.728271 0.567129 0 \r\n0.496714 0.0178831 0.115295 0 \r\n0.50569 0.0400423 0.113037 0 \r\n0.493901 0.673168 -0.605443 0 \r\n0.727023 0.18051 -0.686571 0 \r\n0.0397513 0.777696 -0.167267 0 \r\n0.0628242 0.77242 -0.134572 0 \r\n-0.182665 0.264992 -0.959822 0 \r\n-0.19282 0.226552 -0.957714 0 \r\n-0.274962 0.471606 -0.791638 0 \r\n-0.120506 0.563082 0.0234147 0 \r\n-0.126482 0.541929 0.0328833 0 \r\n-0.428479 0.215262 -0.392804 0 \r\n0.420606 -0.312477 0.107289 0 \r\n0.403413 -0.308127 0.126014 0 \r\n-0.237242 0.28255 -0.0322996 0 \r\n-0.238393 0.254958 -0.0194585 0 \r\n0.242794 0.997805 -0.574584 0 \r\n0.229255 0.998755 -0.597428 0 \r\n0.186455 -0.936695 -0.155861 0 \r\n0.0739397 0.551304 0.161766 0 \r\n0.131972 0.399909 0.258352 0 \r\n0.200603 -0.107743 0.212575 0 \r\n0.590711 -0.269846 -0.966449 0 \r\n0.304928 0.965047 -0.53001 0 \r\n-0.203003 -0.519745 -0.0315898 0 \r\n-0.209143 -0.539988 -0.073406 0 \r\n-0.210948 -0.517164 -0.0605318 0 \r\n0.251523 0.853674 -0.471574 0 \r\n0.266539 0.844164 -0.476047 0 \r\n0.554579 -0.179085 -0.95464 0 \r\n0.713336 0.0743787 -0.66258 0 \r\n0.275837 -0.47417 0.551486 0 \r\n0.291771 -0.48278 0.560473 0 \r\n0.460588 0.417508 0.146528 0 \r\n-0.29801 -0.161388 -0.796219 0 \r\n0.679965 0.238641 -0.151429 0 \r\n-0.0492818 0.557126 -0.858177 0 \r\n-0.349409 0.404325 -0.293698 0 \r\n-0.219914 -0.502592 -0.0763863 0 \r\n-0.213775 -0.482349 -0.03457 0 \r\n-0.062193 -0.574767 -0.982781 0 \r\n-0.360704 0.334459 -0.66427 0 \r\n-0.356587 0.333032 -0.689681 0 \r\n-0.586958 -0.634695 0.837592 0 \r\n-0.279283 -0.713817 0.471312 0 \r\n0.522915 -0.380884 -0.597805 0 \r\n-0.188742 -0.767083 0.57829 0 \r\n-0.214729 -0.770851 0.599841 0 \r\n0.639117 0.316108 -0.130266 0 \r\n0.624601 0.323589 -0.113202 0 \r\n-0.238055 -0.478298 -0.110467 0 \r\n-0.10992 -0.724557 -0.0490822 0 \r\n-0.0125568 -0.213333 0.782341 0 \r\n0.432425 -0.557958 -0.57813 0 \r\n0.453552 -0.540789 -0.565761 0 \r\n-0.0351478 -0.24637 0.856062 0 \r\n0.700194 -0.0264465 -0.867509 0 \r\n0.171268 0.175369 0.277066 0 \r\n0.20262 0.185196 0.277865 0 \r\n0.0863865 0.209394 -0.926753 0 \r\n-0.212395 0.481952 -0.859949 0 \r\n-0.0741701 0.0288927 0.176189 0 \r\n0.495354 0.57765 -0.791664 0 \r\n-0.13995 -0.635345 -0.0029887 0 \r\n-0.395445 0.307329 -0.484323 0 \r\n0.396299 -0.541745 -0.816669 0 \r\n0.556826 0.276111 0.00738955 0 \r\n0.563218 0.251642 0.0038148 0 \r\n-0.116582 0.593459 0.00049949 0 \r\n0.509555 0.0619889 0.115066 0 \r\n0.517223 0.0896221 0.110215 0 \r\n0.680095 0.121286 -0.147787 0 \r\n0.667477 0.135688 -0.142391 0 \r\n0.621399 0.484857 -0.658058 0 \r\n0.469849 0.710612 -0.480168 0 \r\n-0.266245 -0.240938 -0.180064 0 \r\n0.403567 -0.940901 0.452701 0 \r\n0.465905 -0.531837 -0.789088 0 \r\n-0.056053 0.16783 0.217836 0 \r\n-0.228184 -0.576677 -0.348868 0 \r\n-0.222501 -0.598823 -0.348581 0 \r\n-0.370367 -0.0860856 -0.678302 0 \r\n-0.253459 -0.336851 -0.291449 0 \r\n-0.255661 -0.330564 -0.276843 0 \r\n0.159056 -0.377842 -0.968269 0 \r\n0.428544 0.840185 -0.702731 0 \r\n0.0403111 0.788924 -0.420736 0 \r\n-0.225564 -0.50956 -0.100169 0 \r\n-0.0363494 -0.539232 -0.607059 0 \r\n-0.0517265 -0.552973 -0.592854 0 \r\n0.6509 -0.0733446 -0.789696 0 \r\n0.640554 -0.073231 -0.779961 0 \r\n0.0758516 -0.943792 0.213229 0 \r\n-0.13774 -0.33764 -0.608786 0 \r\n0.441396 -0.431839 -0.969557 0 \r\n0.406847 -0.42473 -0.969118 0 \r\n0.577335 0.14728 -0.0261665 0 \r\n-0.0559037 0.762339 -0.755463 0 \r\n-0.264171 0.564892 -0.554929 0 \r\n0.646542 -0.0148262 -0.722785 0 \r\n0.6436 -0.0239877 -0.709621 0 \r\n0.524477 -0.513784 0.17039 0 \r\n-0.123177 -0.708138 -0.45729 0 \r\n-0.106175 -0.715224 -0.467895 0 \r\n-0.119299 -0.69105 -0.477678 0 \r\n-0.193068 -0.114881 0.918383 0 \r\n0.00454803 -0.580765 0.483374 0 \r\n0.201661 -0.252331 -0.96695 0 \r\n0.331508 -0.862895 -0.39048 0 \r\n-0.119824 -0.219241 -0.684559 0 \r\n0.446144 -0.436047 0.1262 0 \r\n0.432373 -0.421659 0.139213 0 \r\n0.0941424 0.828661 -0.474093 0 \r\n0.262404 -0.607233 -0.945163 0 \r\n0.637327 -0.919154 0.206672 0 \r\n0.625093 -0.931196 0.186676 0 \r\n0.197348 -0.591263 -0.650019 0 \r\n0.167785 -0.590634 -0.651283 0 \r\n0.437391 -0.956688 0.0695128 0 \r\n-0.21413 -0.248948 -0.948161 0 \r\n0.146603 -0.259126 -0.966397 0 \r\n0.155749 -0.26164 -0.967353 0 \r\n0.0586259 0.115325 0.257641 0 \r\n-0.00755634 -0.828218 0.367353 0 \r\n-0.244655 -0.514491 -0.22513 0 \r\n-0.242018 -0.519814 -0.203781 0 \r\n0.175255 -0.78675 -0.526631 0 \r\n0.477268 0.458631 0.0916981 0 \r\n0.214029 -0.411662 0.351171 0 \r\n0.32827 0.681542 0.017873 0 \r\n0.521551 0.147638 0.114833 0 \r\n0.516373 0.170108 0.123248 0 \r\n0.53201 0.17634 0.100612 0 \r\n0.399309 0.0070717 0.185726 0 \r\n0.633712 -0.504997 -0.914639 0 \r\n0.243282 0.0429997 0.250632 0 \r\n0.234078 0.0603079 0.255944 0 \r\n0.257548 0.0645467 0.255265 0 \r\n0.243779 0.795274 -0.263335 0 \r\n0.216816 0.797868 -0.258938 0 \r\n0.0867952 -0.79356 0.569293 0 \r\n0.258233 -0.168525 0.195522 0 \r\n0.248807 -0.352881 -0.965695 0 \r\n-0.436191 0.173144 -0.449567 0 \r\n0.496962 -0.780129 -0.0134785 0 \r\n0.235891 0.4914 -0.959047 0 \r\n-0.469661 0.0334065 -0.341374 0 \r\n0.62016 0.536103 -0.232566 0 \r\n0.62967 0.522882 -0.244642 0 \r\n0.263608 0.994174 -0.580291 0 \r\n0.598099 -0.44862 -0.265538 0 \r\n-0.0130756 0.773422 -0.407647 0 \r\n0.187258 -0.311709 -0.964734 0 \r\n-0.090278 -0.0168382 0.15388 0 \r\n-0.0866978 -0.037097 0.151846 0 \r\n-0.124882 -0.307694 -0.806302 0 \r\n0.299313 -0.958007 0.309851 0 \r\n0.134117 -0.976133 0.161653 0 \r\n0.446149 0.503235 0.113131 0 \r\n-0.463995 0.0858967 -0.386504 0 \r\n-0.467256 0.0710477 -0.379413 0 \r\n0.454906 -0.446254 0.0879159 0 \r\n0.454652 -0.450793 0.099569 0 \r\n0.0792618 -0.870423 0.445806 0 \r\n-0.315387 0.0396428 0.960274 0 \r\n-0.460606 0.10197 -0.37043 0 \r\n-0.308535 0.462942 -0.267268 0 \r\n-0.24442 -0.57539 0.586814 0 \r\n-0.265334 -0.576698 0.611204 0 \r\n0.362031 -0.172743 -0.939181 0 \r\n0.492272 -0.61147 -0.850675 0 \r\n0.485424 -0.592663 -0.83297 0 \r\n-0.213228 0.436076 -0.920767 0 \r\n-0.197835 -0.081393 0.951127 0 \r\n-0.20016 -0.0667986 0.963356 0 \r\n0.718193 0.230246 -0.700456 0 \r\n-0.386584 -0.062612 -0.197632 0 \r\n0.132129 -0.568539 -0.801811 0 \r\n0.200989 -0.832135 0.575773 0 \r\n0.0557604 0.54432 0.16118 0 \r\n-0.474173 0.0179392 -0.365027 0 \r\n-0.494822 -0.792273 0.789791 0 \r\n-0.48493 -0.795637 0.796167 0 \r\n0.281461 0.623069 -0.940141 0 \r\n0.453422 -0.826795 -0.321876 0 \r\n0.477491 -0.806374 -0.323231 0 \r\n-0.241986 -0.331802 -0.985391 0 \r\n-0.248545 -0.298839 -0.982108 0 \r\n-0.695439 -0.608655 0.634723 0 \r\n-0.539233 -0.774148 0.796406 0 \r\n-0.494286 -0.783328 0.775285 0 \r\n-0.510947 -0.768778 0.770678 0 \r\n-0.283585 0.537643 -0.571192 0 \r\n-0.274204 0.552207 -0.562567 0 \r\n0.463477 -0.461595 0.0997505 0 \r\n0.453692 -0.447336 0.112364 0 \r\n0.421385 -0.0789403 -0.911309 0 \r\n0.405913 -0.446016 -0.731121 0 \r\n0.187768 -0.93892 -0.172736 0 \r\n-0.253688 -0.380759 -0.16478 0 \r\n0.0405503 -0.184481 0.61426 0 \r\n-0.225682 -0.150066 -0.945332 0 \r\n-0.239053 -0.153399 -0.955413 0 \r\n0.107492 -0.49354 -0.738292 0 \r\n-0.283169 0.0937828 -0.122746 0 \r\n-0.27742 0.124166 -0.110238 0 \r\n0.108916 -0.636253 -0.982 0 \r\n-0.717057 -0.567262 0.752768 0 \r\n-0.0765376 -0.368468 0.19576 0 \r\n-0.0810447 -0.349654 0.191407 0 \r\n0.563658 -0.00268549 -0.937116 0 \r\n-0.258394 0.580546 -0.397548 0 \r\n0.146371 0.931058 -0.473976 0 \r\n0.475462 0.418131 -0.963532 0 \r\n0.431553 0.41673 -0.962592 0 \r\n0.462108 0.395178 -0.962358 0 \r\n-0.142173 0.608947 -0.0591247 0 \r\n0.371042 0.236488 0.250679 0 \r\n0.384703 0.218578 0.247638 0 \r\n0.587432 0.150813 -0.0752583 0 \r\n0.581927 0.172563 -0.0581077 0 \r\n0.242979 -0.453967 -0.806306 0 \r\n-0.0930308 -0.198877 0.581953 0 \r\n0.505134 -0.732285 0.538475 0 \r\n0.487447 -0.735338 0.546739 0 \r\n0.48808 -0.715518 0.550589 0 \r\n-0.00350585 -0.337271 0.22717 0 \r\n-0.282642 0.537254 -0.595417 0 \r\n-0.27024 -0.157576 -0.639631 0 \r\n0.28846 -0.486197 -0.660643 0 \r\n0.410048 0.883004 -0.647678 0 \r\n0.416502 0.872192 -0.667358 0 \r\n0.419693 0.865332 -0.651484 0 \r\n-0.0881636 -0.431448 -0.832145 0 \r\n0.0747407 -0.852327 0.51092 0 \r\n0.11564 0.913615 -0.479477 0 \r\n0.0715671 0.213301 0.272542 0 \r\n-0.313179 -0.298889 -0.880712 0 \r\n0.393782 -0.861502 0.00706316 0 \r\n0.114356 0.838706 -0.477 0 \r\n0.398639 0.833824 -0.782485 0 \r\n-0.0443612 -0.803549 0.121712 0 \r\n-0.045691 -0.789169 0.102464 0 \r\n-0.309865 -0.280997 -0.985696 0 \r\n-0.108002 -0.530818 -0.942068 0 \r\n-0.11334 -0.513784 -0.945492 0 \r\n-0.171078 -0.236136 -0.924251 0 \r\n-0.179109 0.0887814 0.0891663 0 \r\n0.530464 -0.136968 -0.734395 0 \r\n0.0317675 -0.427831 0.721321 0 \r\n0.530189 0.251887 -0.946004 0 \r\n0.526899 0.240125 -0.942076 0 \r\n-0.244828 0.0714991 -0.9747 0 \r\n-0.0125652 -0.295573 0.822322 0 \r\n-0.0290402 -0.272655 0.839812 0 \r\n0.525104 -0.370665 -0.612913 0 \r\n0.0837528 -0.0893314 0.210142 0 \r\n-0.270791 0.146766 -0.100959 0 \r\n-0.277041 0.152873 -0.115663 0 \r\n-0.00075962 -0.490432 0.491198 0 \r\n0.553951 -0.630887 -0.9171 0 \r\n-0.227333 -0.359161 -0.983165 0 \r\n0.409695 -0.875661 0.0178165 0 \r\n0.236398 -0.500557 -0.974104 0 \r\n0.185493 -0.671209 0.590638 0 \r\n0.223034 0.994308 -0.537648 0 \r\n0.203211 0.995553 -0.536265 0 \r\n-0.100734 -0.374806 -0.718499 0 \r\n0.435134 -0.567937 0.559243 0 \r\n0.61618 -0.809764 0.412461 0 \r\n0.541007 -0.315248 -0.655969 0 \r\n0.524912 -0.617025 -0.477024 0 \r\n-0.298449 -0.259314 -0.840057 0 \r\n0.467722 -0.407706 0.0501241 0 \r\n0.476121 -0.423176 0.0418176 0 \r\n0.073835 -0.928293 0.102376 0 \r\n0.481694 -0.407156 -0.660392 0 \r\n-0.318124 0.359518 -0.785406 0 \r\n-0.0650184 0.621886 -0.780967 0 \r\n-0.0643377 0.640522 -0.760062 0 \r\n0.397762 0.898122 -0.623891 0 \r\n-0.204477 -0.645992 -0.365344 0 \r\n-0.213775 -0.625844 -0.358536 0 \r\n0.50335 -0.734701 -0.0880314 0 \r\n-0.0402511 -0.415851 0.534935 0 \r\n0.308083 0.958784 -0.693296 0 \r\n0.277259 0.967791 -0.693415 0 \r\n0.284626 0.954457 -0.716312 0 \r\n0.00644745 -0.889059 0.236748 0 \r\n0.0829632 0.798569 -0.346448 0 \r\n0.0281481 -0.43846 0.714939 0 \r\n0.0264276 -0.448749 0.702959 0 \r\n-0.0324774 -0.143887 0.572027 0 \r\n-0.0198075 -0.107187 0.175479 0 \r\n0.496895 0.688457 -0.486277 0 \r\n-0.578124 -0.761323 0.81291 0 \r\n-0.562038 -0.770653 0.808111 0 \r\n0.435694 -0.424424 0.149906 0 \r\n0.420648 -0.410522 0.148899 0 \r\n0.71675 0.109877 -0.684324 0 \r\n0.716226 0.0911162 -0.670514 0 \r\n0.723329 0.110017 -0.664216 0 \r\n0.72515 0.349261 -0.321626 0 \r\n0.742355 0.306183 -0.452465 0 \r\n-0.0836695 -0.373968 0.615396 0 \r\n0.478348 -0.792696 -0.143663 0 \r\n-0.437585 -0.576568 0.664364 0 \r\n-0.422731 -0.576053 0.649094 0 \r\n0.552644 -0.306017 -0.551254 0 \r\n0.69084 0.00330075 -0.176882 0 \r\n0.697849 -0.00998295 -0.1892 0 \r\n0.683918 -0.0269829 -0.185993 0 \r\n0.151632 -0.125937 0.212918 0 \r\n0.134197 -0.155353 0.21242 0 \r\n-0.316436 0.0996821 -0.151733 0 \r\n0.739667 0.261553 -0.239766 0 \r\n0.170219 0.242319 0.282638 0 \r\n0.161245 0.236171 0.282219 0 \r\n0.0282768 -0.652188 -0.84665 0 \r\n0.197058 -0.947834 0.337795 0 \r\n0.184427 -0.949676 0.316155 0 \r\n-0.231798 0.304968 -0.0293101 0 \r\n0.0117463 -0.70927 0.613632 0 \r\n-0.128092 -0.204628 -0.685544 0 \r\n-0.0891328 -0.568968 0.176325 0 \r\n0.122961 0.927717 -0.480447 0 \r\n-0.0351706 -0.722037 -0.51882 0 \r\n-0.0306833 -0.800076 0.0769736 0 \r\n0.614473 -0.0801487 -0.764924 0 \r\n0.457869 -0.896615 0.488334 0 \r\n0.222403 -0.951378 0.387297 0 \r\n0.364594 -0.312452 -0.966447 0 \r\n0.60721 0.348846 -0.859125 0 \r\n0.469247 -0.644393 -0.943486 0 \r\n0.49593 -0.644455 -0.949294 0 \r\n0.651626 -0.123436 -0.967601 0 \r\n0.624995 -0.154547 -0.966525 0 \r\n-0.337018 0.247368 -0.787203 0 \r\n-0.33824 0.224555 -0.790185 0 \r\n0.445261 -0.456638 -0.743835 0 \r\n0.582648 -0.559072 -0.844162 0 \r\n-0.0948385 -0.00028745 0.154783 0 \r\n-0.0213629 0.310593 -0.949257 0 \r\n0.515345 -0.175474 -0.940781 0 \r\n0.00448677 -0.862776 0.314448 0 \r\n0.0174011 -0.87527 0.309846 0 \r\n-0.194932 -0.0165404 0.927426 0 \r\n-0.208604 -0.00455535 0.945503 0 \r\n-0.208703 -0.0046342 0.924298 0 \r\n0.00302882 -0.452736 0.298162 0 \r\n0.493357 -0.751077 -0.0265302 0 \r\n0.338118 -0.955054 0.305291 0 \r\n0.396185 -0.439193 -0.69094 0 \r\n0.437478 -0.981953 0.175463 0 \r\n0.445935 -0.977888 0.19877 0 \r\n0.562548 -0.489011 -0.459609 0 \r\n0.579857 -0.255974 -0.282552 0 \r\n-0.0035312 0.771709 -0.201672 0 \r\n0.443901 -0.506501 0.343056 0 \r\n0.455259 -0.505447 0.321551 0 \r\n-0.267712 0.529498 -0.708273 0 \r\n-0.259189 0.546106 -0.68916 0 \r\n-0.276639 0.526178 -0.687446 0 \r\n0.50736 -0.235906 -0.717656 0 \r\n0.554828 -0.550346 -0.458098 0 \r\n0.554714 -0.573319 -0.44844 0 \r\n-0.371862 0.180848 -0.736933 0 \r\n0.0952336 -0.906243 -0.104688 0 \r\n0.383806 -0.125542 0.140904 0 \r\n-0.144424 -0.732572 -0.390734 0 \r\n-0.139546 -0.727635 -0.416232 0 \r\n-0.00405111 0.78068 -0.832091 0 \r\n-0.234712 0.251581 -0.00240815 0 \r\n0.417597 0.646489 -0.831764 0 \r\n-0.277481 -0.260669 -0.984002 0 \r\n-0.30096 -0.252833 -0.985695 0 \r\n0.595878 -0.926576 0.274664 0 \r\n0.0333048 -0.413983 0.4371 0 \r\n0.658522 -0.125014 -0.405549 0 \r\n0.68438 0.335185 -0.722529 0 \r\n0.6732 0.338433 -0.742782 0 \r\n0.344001 0.327221 -0.9548 0 \r\n0.49387 -0.511709 -0.782611 0 \r\n-0.0298941 -0.526724 -0.620045 0 \r\n0.317193 0.501154 -0.959161 0 \r\n0.565869 -0.467004 -0.812829 0 \r\n-0.13748 0.418042 -0.969306 0 \r\n-0.117341 0.428123 -0.964427 0 \r\n0.382374 0.185569 0.248691 0 \r\n-0.149208 -0.186548 -0.734254 0 \r\n0.0969698 -0.954802 0.210988 0 \r\n0.669282 -0.626756 0.135078 0 \r\n-0.696451 -0.65399 0.763963 0 \r\n0.649723 0.133806 -0.899605 0 \r\n-0.17886 0.196019 -0.938182 0 \r\n0.134714 0.310888 0.277673 0 \r\n0.41036 0.0202764 -0.902705 0 \r\n-0.227294 -0.309539 -0.37751 0 \r\n-0.232969 -0.290065 -0.360489 0 \r\n0.0315543 -0.255885 -0.94353 0 \r\n0.148912 -0.981108 0.149216 0 \r\n0.509923 -0.497247 0.175402 0 \r\n-0.226734 0.588665 -0.65776 0 \r\n0.454575 -0.0482545 0.123098 0 \r\n0.665323 0.437312 -0.602798 0 \r\n0.680784 0.415847 -0.587657 0 \r\n0.766096 0.104854 -0.377178 0 \r\n0.766875 0.0983277 -0.35332 0 \r\n0.596039 0.213078 -0.0907497 0 \r\n0.684396 0.085684 -0.152497 0 \r\n-0.532924 -0.751198 0.764835 0 \r\n-0.155649 -0.740822 -0.326046 0 \r\n-0.0865577 -0.663568 0.135612 0 \r\n0.118734 -0.427153 0.420404 0 \r\n0.382737 0.40916 0.217733 0 \r\n0.354876 -0.566944 -0.967477 0 \r\n0.364048 -0.597287 -0.966326 0 \r\n0.129296 -0.278971 -0.967022 0 \r\n-0.371868 0.332938 -0.24673 0 \r\n-0.328705 -0.104721 -0.81835 0 \r\n-0.161846 0.000481965 0.659783 0 \r\n0.390478 0.760461 -0.311745 0 \r\n0.403091 -0.438248 -0.654595 0 \r\n0.748036 0.276121 -0.310518 0 \r\n-0.715577 -0.6342 0.726203 0 \r\n-0.0431139 0.151928 0.225028 0 \r\n0.313888 -0.270348 -0.966225 0 \r\n0.316119 -0.276816 -0.966053 0 \r\n0.00286439 -0.293709 0.500718 0 \r\n-0.0159645 -0.262774 0.520159 0 \r\n0.681937 0.0821869 -0.736326 0 \r\n0.551538 -0.258765 -0.52369 0 \r\n0.694996 -0.674893 0.199241 0 \r\n-0.10031 -0.276994 -0.69629 0 \r\n-0.0352703 0.782314 -0.788721 0 \r\n-0.0277731 0.770469 -0.808576 0 \r\n0.672624 -0.869981 0.177638 0 \r\n0.670289 -0.864855 0.15569 0 \r\n-0.228221 -0.40435 -0.392042 0 \r\n0.612257 0.346911 -0.0951513 0 \r\n0.615718 0.33545 -0.101813 0 \r\n0.332011 -0.9886 0.204461 0 \r\n-0.236992 -0.370081 -0.939789 0 \r\n0.332353 -0.550603 -0.972692 0 \r\n-0.0551467 -0.748489 0.392947 0 \r\n-0.0492885 -0.758932 0.403397 0 \r\n0.61921 0.377346 -0.108735 0 \r\n0.613052 0.359539 -0.095429 0 \r\n0.609383 0.387125 -0.0943799 0 \r\n-0.256242 0.192195 -0.975106 0 \r\n0.59427 -0.164383 -0.213139 0 \r\n0.215073 -0.96925 0.269305 0 \r\n0.216059 0.331792 -0.963831 0 \r\n0.208229 -0.91264 0.0102737 0 \r\n0.556618 0.44167 -0.939842 0 \r\n-0.349335 0.243207 -0.171912 0 \r\n0.60463 0.339153 -0.894659 0 \r\n-0.64224 -0.640628 0.877811 0 \r\n0.633473 0.531241 -0.283596 0 \r\n0.485206 0.318375 0.147234 0 \r\n0.130225 -0.683164 -0.879689 0 \r\n-0.0557153 0.687617 -0.787594 0 \r\n-0.0672562 0.550869 -0.847937 0 \r\n0.196445 0.279099 0.281964 0 \r\n0.730344 0.286705 -0.608618 0 \r\n0.723423 0.3049 -0.626693 0 \r\n0.375323 0.885271 -0.545775 0 \r\n0.75436 0.248789 -0.307424 0 \r\n0.545941 0.476862 -0.920938 0 \r\n0.543149 0.490332 -0.90563 0 \r\n-0.142015 -0.167708 0.0939757 0 \r\n-0.224407 0.059815 -0.958081 0 \r\n0.0718561 0.343009 0.266679 0 \r\n-0.21795 0.383587 -0.952338 0 \r\n-0.307421 -0.741835 0.531751 0 \r\n-0.32659 -0.739724 0.534225 0 \r\n0.416087 -0.891979 0.0247128 0 \r\n-0.0970754 -0.0501285 0.710524 0 \r\n0.232755 0.0832145 -0.909106 0 \r\n-0.0580071 -0.103042 0.591141 0 \r\n-0.0474628 -0.117084 0.585039 0 \r\n0.426531 -0.956265 0.27909 0 \r\n0.435393 -0.964584 0.251083 0 \r\n0.50363 0.109981 0.134205 0 \r\n0.519506 0.121047 0.113478 0 \r\n-0.354378 0.38409 -0.628864 0 \r\n0.59057 -0.0894219 -0.576007 0 \r\n0.630531 0.233815 -0.845077 0 \r\n0.637598 0.227771 -0.833194 0 \r\n-0.113391 -0.315171 0.740533 0 \r\n0.106583 0.800074 -0.346357 0 \r\n-0.170782 0.116964 0.10195 0 \r\n-0.193696 0.111314 0.0753446 0 \r\n0.0727609 -0.441293 0.364183 0 \r\n0.630479 -0.0354352 -0.705115 0 \r\n0.360651 -0.472215 0.464676 0 \r\n-0.102689 -0.303512 0.167639 0 \r\n-0.082239 -0.305343 0.184886 0 \r\n-0.0674461 -0.375852 0.717394 0 \r\n0.139344 0.779196 -0.133003 0 \r\n0.239348 -0.436998 -0.729801 0 \r\n0.338153 0.79735 -0.521026 0 \r\n-0.311131 0.0707728 0.800194 0 \r\n0.169071 -0.955053 0.058856 0 \r\n-0.0600606 -0.002382 -0.903553 0 \r\n-0.0444157 -0.495745 -0.799487 0 \r\n0.682279 0.442786 -0.302817 0 \r\n0.674517 0.46165 -0.306971 0 \r\n0.532643 0.621621 -0.631251 0 \r\n0.615506 -0.139361 -0.399348 0 \r\n0.517565 0.286731 0.110444 0 \r\n-0.449405 -0.125337 -0.440823 0 \r\n0.641893 -0.868396 0.0820062 0 \r\n0.727899 -0.057746 -0.433177 0 \r\n-0.404168 -0.575697 0.638894 0 \r\n-0.412522 0.157298 -0.206455 0 \r\n-0.00900542 0.802564 -0.810537 0 \r\n-0.33875 0.00859701 -0.821258 0 \r\n-0.343121 -0.0284797 -0.816554 0 \r\n0.514001 -0.139224 -0.596761 0 \r\n-0.350279 0.39209 -0.275233 0 \r\n0.638339 -0.839759 0.0541035 0 \r\n-0.209098 -0.169837 -0.659484 0 \r\n-0.0640166 0.493211 0.139046 0 \r\n-0.0671929 0.513165 0.123066 0 \r\n-0.043984 -0.537621 0.307469 0 \r\n-0.15053 -0.366897 -0.566281 0 \r\n-0.142664 -0.347955 -0.590716 0 \r\n-0.251873 0.193508 -0.0449954 0 \r\n0.657339 0.219392 -0.80243 0 \r\n0.188233 0.253759 0.283261 0 \r\n0.195814 0.256898 0.283141 0 \r\n0.0312698 -0.42689 0.297451 0 \r\n0.0372873 -0.415116 0.289497 0 \r\n0.10585 0.284656 -0.969527 0 \r\n0.731024 0.27018 -0.218947 0 \r\n-0.212466 -0.399433 -0.0008288 0 \r\n-0.203385 -0.4001 0.0191348 0 \r\n0.0658624 -0.331361 -0.972015 0 \r\n0.196873 -0.14598 -0.928771 0 \r\n0.176819 -0.162983 -0.933046 0 \r\n0.667611 0.300023 -0.154511 0 \r\n0.653556 0.312543 -0.143091 0 \r\n0.492319 -0.731194 -0.0316552 0 \r\n0.501804 -0.732076 -0.0235687 0 \r\n-0.0714604 0.272577 0.208207 0 \r\n0.247698 0.962903 -0.489691 0 \r\n0.666413 -0.0342776 -0.178674 0 \r\n0.370959 -0.600605 -0.881701 0 \r\n-0.225258 -0.379205 -0.957795 0 \r\n0.603235 0.347476 -0.880022 0 \r\n-0.328101 -0.0295366 -0.901643 0 \r\n-0.173276 -0.722377 -0.259591 0 \r\n0.506841 0.571798 -0.773697 0 \r\n0.596439 -0.671647 0.413819 0 \r\n-0.168086 -0.183509 0.858189 0 \r\n-0.0899105 -0.0272885 0.69373 0 \r\n-0.112346 -0.105821 0.857473 0 \r\n-0.0915079 -0.107242 0.733949 0 \r\n-0.0943353 0.00013387 0.642744 0 \r\n-0.433015 0.161288 -0.25655 0 \r\n-0.124852 0.717019 -0.302249 0 \r\n-0.109079 0.724837 -0.278455 0 \r\n-0.470048 0.0312793 -0.435721 0 \r\n0.134405 0.809807 -0.431993 0 \r\n0.437053 0.118349 0.20182 0 \r\n0.268765 -0.959626 0.413431 0 \r\n0.559191 0.34552 -0.0229414 0 \r\n0.00900895 -0.752377 0.587878 0 \r\n-0.0242762 -0.750488 0.600646 0 \r\n0.607215 0.280028 -0.955665 0 \r\n0.61606 0.241401 -0.959288 0 \r\n0.519496 -0.656034 -0.0557466 0 \r\n0.525556 -0.667902 -0.0745049 0 \r\n0.545697 -0.650077 -0.108193 0 \r\n0.523278 -0.426432 -0.021735 0 \r\n0.203826 -0.9394 -0.155174 0 \r\n0.655746 0.363451 -0.750424 0 \r\n0.533489 0.383774 -0.963804 0 \r\n0.527506 0.353422 -0.962198 0 \r\n0.621052 -0.717866 0.425514 0 \r\n-0.23327 -0.191942 -0.777634 0 \r\n-0.0888982 -0.181313 0.580748 0 \r\n0.383997 -0.283321 -0.964965 0 \r\n0.388522 -0.311204 -0.965232 0 \r\n-0.152802 -0.0342253 -0.90766 0 \r\n-0.147835 -0.00099415 -0.905391 0 \r\n0.581065 0.151067 -0.0407721 0 \r\n0.581984 0.154486 -0.0497702 0 \r\n0.21957 0.174799 0.276884 0 \r\n0.455747 -0.533234 0.400564 0 \r\n0.060394 -0.902137 0.31737 0 \r\n0.0358585 -0.889385 0.3105 0 \r\n0.00907171 -0.49791 0.465858 0 \r\n0.441469 0.744891 -0.741028 0 \r\n-0.178003 0.275167 0.116711 0 \r\n0.293954 -0.638272 0.59704 0 \r\n-0.297316 0.246963 -0.146021 0 \r\n-0.329867 -0.77916 0.742225 0 \r\n-0.297738 -0.776852 0.728102 0 \r\n0.549505 0.619702 -0.566379 0 \r\n-0.101203 0.735017 -0.352672 0 \r\n-0.133671 -0.675853 0.427766 0 \r\n-0.0219944 -0.190964 0.179215 0 \r\n-0.0162048 -0.218615 0.537084 0 \r\n-0.202356 -0.376027 0.0275502 0 \r\n0.652991 -0.097582 -0.213678 0 \r\n0.519999 0.595332 -0.70747 0 \r\n0.539912 0.578574 -0.69285 0 \r\n0.155393 -0.877972 0.556779 0 \r\n0.12012 0.196584 -0.926512 0 \r\n0.711173 -0.0379645 -0.881989 0 \r\n0.707666 -0.0532934 -0.86526 0 \r\n0.0344514 -0.850068 0.00092845 0 \r\n0.103986 -0.319577 0.595561 0 \r\n0.223836 0.558459 0.169979 0 \r\n0.618577 -0.177402 -0.964804 0 \r\n0.403205 0.328647 -0.935488 0 \r\n0.382431 0.310239 -0.931723 0 \r\n0.665236 -0.651134 0.221603 0 \r\n0.664737 -0.659611 0.239026 0 \r\n0.733711 0.078825 -0.582679 0 \r\n0.506172 -0.626382 -0.959687 0 \r\n-0.255398 0.291717 -0.953197 0 \r\n0.472625 -0.474055 0.10565 0 \r\n0.0859572 -0.800151 0.567602 0 \r\n-0.114281 -0.1375 -0.912017 0 \r\n-0.410854 0.158341 -0.617638 0 \r\n-0.0582784 0.693609 -0.756473 0 \r\n-0.0575276 0.68743 -0.775653 0 \r\n0.521747 -0.751413 0.522832 0 \r\n0.519143 -0.735364 0.527511 0 \r\n0.536389 -0.734672 0.515719 0 \r\n0.438361 -0.479646 -0.588908 0 \r\n0.419554 -0.506709 -0.591939 0 \r\n-0.418194 0.114121 -0.201351 0 \r\n-0.291344 0.0573402 -0.131866 0 \r\n0.574621 -0.248079 -0.329957 0 \r\n0.0887028 -0.55055 -0.779819 0 \r\n0.242772 -0.827365 -0.468449 0 \r\n0.069636 -0.600386 -0.635875 0 \r\n0.530915 -0.33731 -0.702078 0 \r\n-0.161204 -0.70446 -0.407665 0 \r\n-0.161754 -0.685166 -0.430413 0 \r\n-0.0485731 0.81595 -0.716249 0 \r\n-0.0481232 0.820287 -0.696644 0 \r\n0.451405 -0.59437 0.561085 0 \r\n0.428093 0.733762 -0.518098 0 \r\n0.673563 -0.7187 0.0572581 0 \r\n0.263153 0.0674575 -0.905891 0 \r\n0.283557 0.114713 -0.907363 0 \r\n-0.137403 0.508817 -0.860796 0 \r\n-0.156632 0.507671 -0.854397 0 \r\n0.0781892 -0.87891 -0.00280035 0 \r\n-0.141142 -0.179 -0.916133 0 \r\n-0.147744 -0.222181 -0.918383 0 \r\n0.563239 -0.305845 -0.866929 0 \r\n-0.294549 0.0847915 -0.950436 0 \r\n0.286042 0.0673537 0.252438 0 \r\n0.00477837 -0.523602 0.408361 0 \r\n0.522002 -0.711923 -0.103297 0 \r\n-0.034423 -0.808889 0.312643 0 \r\n-0.356969 0.412066 -0.401602 0 \r\n-0.30716 -0.200806 -0.262594 0 \r\n-0.42859 0.0197975 -0.209935 0 \r\n-0.293237 -0.00696695 0.854251 0 \r\n0.254824 0.245464 -0.95072 0 \r\n0.233522 0.253936 -0.958519 0 \r\n0.0467295 -0.0878368 -0.908172 0 \r\n0.0045034 -0.105712 -0.907528 0 \r\n-0.31274 -0.112532 -0.764124 0 \r\n-0.513145 -0.751593 0.852481 0 \r\n0.118011 -0.558901 -0.791884 0 \r\n0.113142 -0.546314 -0.782771 0 \r\n0.602457 -0.155409 -0.268829 0 \r\n0.608127 -0.157449 -0.290872 0 \r\n-0.326393 0.0715718 0.824724 0 \r\n-0.336218 0.0665651 0.849259 0 \r\n0.268443 -0.2625 -0.965822 0 \r\n0.480412 0.701688 -0.496412 0 \r\n-0.315809 -0.252217 -0.848976 0 \r\n-0.745633 -0.611294 0.885152 0 \r\n-0.418877 -0.575984 0.669505 0 \r\n-0.206479 0.426982 -0.0363122 0 \r\n0.198442 -0.962861 0.28654 0 \r\n-0.383788 0.324845 -0.538347 0 \r\n-0.388783 0.300901 -0.550645 0 \r\n-0.203643 -0.582517 -0.439514 0 \r\n-0.112595 -0.245394 0.13792 0 \r\n-0.0553952 0.67186 -0.787409 0 \r\n-0.217113 -0.19814 0.0016175 0 \r\n0.141242 0.636138 0.090313 0 \r\n0.0898371 -0.895416 0.379235 0 \r\n0.016242 -0.436702 0.441826 0 \r\n0.0199703 -0.42489 0.443274 0 \r\n0.00516596 -0.79867 0.502483 0 \r\n0.0176974 -0.802836 0.517933 0 \r\n0.325312 -0.539656 -0.863025 0 \r\n-0.091443 -0.0691462 0.713129 0 \r\n0.5889 0.0655222 -0.0887448 0 \r\n0.585787 0.0627724 -0.077081 0 \r\n0.0179178 -0.455046 0.317416 0 \r\n0.0386321 -0.271928 0.514411 0 \r\n0.680826 -0.648867 0.0981887 0 \r\n0.69168 -0.650447 0.111797 0 \r\n0.0470564 -0.458293 0.384766 0 \r\n0.297493 0.912889 -0.777655 0 \r\n0.557339 -0.972435 0.147104 0 \r\n-0.40836 -0.682816 0.79265 0 \r\n0.0131819 -0.445996 0.700734 0 \r\n0.400719 0.387686 0.212815 0 \r\n0.393871 0.36674 0.224073 0 \r\n0.167863 -0.441494 0.594773 0 \r\n-0.278967 0.410815 -0.851703 0 \r\n0.541956 0.166726 0.084175 0 \r\n0.0393128 -0.228258 0.641307 0 \r\n-0.0946677 -0.580511 0.14725 0 \r\n-0.0965931 -0.605887 0.12825 0 \r\n0.444307 -0.431972 0.1587 0 \r\n0.67596 -0.0919162 -0.455106 0 \r\n0.733244 0.333914 -0.466158 0 \r\n0.733597 0.333224 -0.443006 0 \r\n0.725326 0.360421 -0.435906 0 \r\n0.5962 -0.150584 -0.388462 0 \r\n-0.123546 -0.576339 0.0787844 0 \r\n0.41286 0.728578 -0.821272 0 \r\n0.416113 0.709646 -0.823102 0 \r\n-0.0474898 0.815374 -0.68042 0 \r\n0.0559144 -0.909508 0.0877705 0 \r\n0.044665 -0.888577 0.0707165 0 \r\n0.0341038 -0.889082 0.090925 0 \r\n0.564479 -0.00199228 -0.0262495 0 \r\n0.142369 0.769161 -0.898513 0 \r\n0.62184 -0.15894 -0.796556 0 \r\n0.612574 -0.181644 -0.803947 0 \r\n-0.307364 0.275208 -0.838601 0 \r\n0.370409 0.647761 -0.88924 0 \r\n-0.218906 -0.12167 0.786082 0 \r\n0.00635302 0.79241 -0.579154 0 \r\n0.237228 0.985789 -0.520205 0 \r\n0.496481 0.670667 -0.173914 0 \r\n0.0972408 -0.706128 -0.965044 0 \r\n0.129157 -0.692978 -0.963282 0 \r\n0.124092 -0.683295 -0.972675 0 \r\n0.625129 -0.921821 0.108851 0 \r\n0.0956337 -0.418219 0.690663 0 \r\n0.108444 -0.430623 0.671746 0 \r\n-0.114136 -0.0688625 0.738146 0 \r\n0.251976 0.946467 -0.747137 0 \r\n0.548872 0.539516 -0.73517 0 \r\n0.184446 -0.166485 -0.937011 0 \r\n0.168772 -0.178211 -0.941718 0 \r\n-0.104842 -0.508964 -0.910348 0 \r\n0.549967 0.594954 -0.640563 0 \r\n0.229508 -0.818823 0.580354 0 \r\n0.0353152 -0.32592 -0.971284 0 \r\n0.0267566 -0.440255 0.311647 0 \r\n0.0461588 -0.429201 0.316705 0 \r\n0.563083 -0.65709 0.0195846 0 \r\n-0.146484 -0.0865107 -0.910195 0 \r\n0.466756 -0.518128 -0.560009 0 \r\n-0.351579 0.423298 -0.400237 0 \r\n0.661729 -0.182568 -0.95431 0 \r\n0.675036 -0.869906 0.196202 0 \r\n0.211228 -0.760302 -0.554254 0 \r\n0.519599 0.234324 -0.937164 0 \r\n-0.260761 -0.787845 0.687929 0 \r\n0.506204 0.654407 -0.160751 0 \r\n0.570948 -0.928018 0.0520541 0 \r\n0.251568 -0.925751 0.0288105 0 \r\n-0.415038 0.237639 -0.482828 0 \r\n-0.408779 0.258237 -0.49074 0 \r\n0.513576 -0.723238 -0.0960278 0 \r\n0.0873225 -0.520572 -0.669434 0 \r\n0.0701252 -0.535295 -0.66069 0 \r\n0.595562 -0.611086 -0.223845 0 \r\n0.595079 -0.604702 -0.20543 0 \r\n0.636907 0.175805 -0.895063 0 \r\n0.547497 -0.310964 -0.836994 0 \r\n0.647735 -0.905646 0.224696 0 \r\n0.64167 -0.9088 0.241915 0 \r\n0.677521 0.165983 -0.145342 0 \r\n0.284195 -0.433562 -0.786329 0 \r\n-0.305451 0.0483073 -0.944634 0 \r\n0.530957 -0.625787 -0.956897 0 \r\n0.549785 -0.622991 -0.950152 0 \r\n0.548743 -0.611037 -0.955034 0 \r\n-0.0800656 -0.325027 0.190982 0 \r\n-0.405734 0.266004 -0.26784 0 \r\n0.740607 0.0957596 -0.569224 0 \r\n-0.0197006 -0.38509 0.491037 0 \r\n-0.762177 -0.579343 0.785854 0 \r\n0.546812 -0.43623 -0.492687 0 \r\n-0.107996 0.674407 -0.648148 0 \r\n-0.165734 -0.449472 -0.500324 0 \r\n0.572115 0.614887 -0.255068 0 \r\n-0.164153 -0.150567 0.904115 0 \r\n-0.133642 0.704552 -0.42425 0 \r\n-0.140847 0.696038 -0.443393 0 \r\n0.420716 0.85079 -0.641047 0 \r\n0.446574 0.385859 -0.960475 0 \r\n0.41547 0.748081 -0.442546 0 \r\n0.434926 0.738488 -0.415996 0 \r\n0.558491 0.479529 -0.817343 0 \r\n0.0323657 -0.776824 0.566326 0 \r\n0.0233007 -0.756826 0.576162 0 \r\n0.50558 -0.582679 0.462995 0 \r\n0.360536 0.543014 0.158555 0 \r\n0.511858 -0.704964 -0.0194725 0 \r\n-0.0405129 -0.859513 -0.235508 0 \r\n0.106349 -0.328987 0.606545 0 \r\n0.345474 -0.589442 0.591048 0 \r\n0.184144 0.997271 -0.616408 0 \r\n0.182597 0.991486 -0.649413 0 \r\n0.624771 -0.64918 0.287131 0 \r\n0.0454231 -0.400334 0.276148 0 \r\n0.195138 -0.540552 0.584998 0 \r\n-0.202517 -0.267038 -0.950999 0 \r\n-0.300274 0.36701 -0.175682 0 \r\n0.00442709 -0.89027 0.205432 0 \r\n0.263753 -0.378351 0.281325 0 \r\n0.0638795 -0.734695 -0.914306 0 \r\n0.159288 -0.441128 0.61233 0 \r\n-0.105504 -0.527424 -0.922241 0 \r\n0.35556 0.652933 -0.897108 0 \r\n0.663202 -0.00488634 -0.163548 0 \r\n-0.251212 0.524729 -0.757128 0 \r\n0.704682 -0.722319 0.11116 0 \r\n-0.213717 -0.119461 0.767409 0 \r\n-0.225623 0.405258 -0.070855 0 \r\n-0.357457 -0.0625986 -0.741499 0 \r\n0.599277 -0.159589 -0.315853 0 \r\n0.468629 0.450298 -0.959216 0 \r\n-0.151677 0.121452 0.123648 0 \r\n0.480656 -0.443438 0.0372934 0 \r\n0.273486 -0.343718 -0.965454 0 \r\n0.538257 0.301409 -0.956622 0 \r\n0.620901 0.420294 -0.750286 0 \r\n-0.52441 -0.58332 0.671072 0 \r\n-0.520854 -0.584578 0.653157 0 \r\n0.631921 0.265797 -0.122257 0 \r\n0.640762 0.293855 -0.129447 0 \r\n-0.372528 -0.732327 0.530002 0 \r\n-0.397062 -0.726538 0.521207 0 \r\n0.489523 -0.77294 -0.122495 0 \r\n0.289482 -0.54424 0.588215 0 \r\n0.447757 -0.674452 0.571887 0 \r\n0.00608638 -0.233062 0.771471 0 \r\n-0.0112156 -0.210384 0.799639 0 \r\n0.203286 -0.98862 0.120006 0 \r\n-0.309992 0.488946 -0.647162 0 \r\n0.491831 -0.731933 -0.0447613 0 \r\n0.307875 -0.457908 -0.809675 0 \r\n-0.16375 -0.776489 0.633825 0 \r\n-0.184004 -0.777122 0.649338 0 \r\n0.209042 -0.589919 -0.873958 0 \r\n-0.198338 0.189383 -0.956075 0 \r\n-0.131695 -0.654037 -0.0066625 0 \r\n0.294717 -0.533154 -0.973073 0 \r\n0.344276 -0.522798 -0.97226 0 \r\n0.155809 -0.897787 -0.0215167 0 \r\n-0.0310796 -0.184817 0.829632 0 \r\n0.613124 -0.409631 -0.914265 0 \r\n0.605009 -0.392254 -0.903863 0 \r\n0.383193 0.766505 -0.408893 0 \r\n0.600848 -0.101869 -0.159009 0 \r\n0.600994 -0.120633 -0.168871 0 \r\n-0.143832 -0.191947 0.0944791 0 \r\n-0.137121 -0.175122 0.0987334 0 \r\n0.598513 -0.613607 0.0664155 0 \r\n0.583582 -0.602531 0.0715934 0 \r\n-0.0763798 -0.717856 0.0552969 0 \r\n-0.0666066 -0.742358 0.0591518 0 \r\n-0.0289929 -0.770072 -0.478117 0 \r\n0.56575 -0.43047 -0.0939201 0 \r\n0.644223 -0.11626 -0.227585 0 \r\n0.232969 0.331885 0.273289 0 \r\n0.312088 -0.320989 -0.965565 0 \r\n0.297908 -0.339544 -0.965979 0 \r\n0.19592 0.979257 -0.694191 0 \r\n0.179406 0.985073 -0.675583 0 \r\n0.552935 -0.197233 -0.418863 0 \r\n0.531185 0.483389 -0.927736 0 \r\n0.512518 0.496516 -0.92372 0 \r\n-0.244687 -0.252589 -0.367832 0 \r\n0.679389 -0.760455 0.0711057 0 \r\n0.39909 -0.938655 0.46466 0 \r\n0.413063 -0.936192 0.459368 0 \r\n0.335954 0.960657 -0.642859 0 \r\n-0.0986886 -0.395939 0.176569 0 \r\n-0.0828518 -0.391906 0.191215 0 \r\n0.608024 -0.113017 -0.768923 0 \r\n0.620548 -0.0977713 -0.774232 0 \r\n0.145261 -0.288402 0.233629 0 \r\n-0.0596004 0.203127 -0.898335 0 \r\n-0.204875 -0.560544 -0.084757 0 \r\n0.587437 -0.569309 -0.856374 0 \r\n0.571124 -0.130544 -0.480756 0 \r\n-0.151392 -0.257351 0.746033 0 \r\n0.560815 -0.0298847 -0.0274449 0 \r\n0.670455 0.308439 -0.766382 0 \r\n0.660411 0.312164 -0.780173 0 \r\n-0.000357499 0.236513 -0.915271 0 \r\n-0.474005 0.0300757 -0.374913 0 \r\n0.0374103 -0.583391 -0.804248 0 \r\n0.0405632 -0.603564 -0.814525 0 \r\n-0.209052 0.0877436 -0.948462 0 \r\n0.585216 -0.0192031 -0.95091 0 \r\n0.0743911 0.606186 -0.950311 0 \r\n0.177516 0.723696 -0.024817 0 \r\n0.75091 0.207661 -0.250321 0 \r\n0.748513 0.178804 -0.233039 0 \r\n0.678865 0.00553695 -0.16743 0 \r\n0.28226 0.969617 -0.516663 0 \r\n0.0937365 -0.920552 0.314126 0 \r\n0.118818 -0.934754 0.30457 0 \r\n0.099362 -0.932123 0.28763 0 \r\n0.43517 0.326017 0.204856 0 \r\n0.421379 0.325965 0.216005 0 \r\n0.302878 -0.288883 -0.96558 0 \r\n0.205398 -0.720196 0.591509 0 \r\n-0.0376438 -0.780802 -0.457466 0 \r\n0.257006 -0.615718 -0.953471 0 \r\n0.290001 0.669147 0.0474781 0 \r\n0.274353 0.65286 0.0695596 0 \r\n0.626868 0.235144 -0.861353 0 \r\n0.527418 -0.875219 0.0103262 0 \r\n0.300502 -0.0310069 0.215995 0 \r\n-0.343948 -0.0343212 -0.794838 0 \r\n0.663227 -0.0500823 -0.800992 0 \r\n0.663954 -0.0374934 -0.801962 0 \r\n-0.071949 -0.0820517 0.603058 0 \r\n0.583686 -0.647664 0.364495 0 \r\n0.577813 0.440466 -0.855433 0 \r\n-0.316747 0.263052 -0.821714 0 \r\n-0.139159 0.578154 -0.774305 0 \r\n0.763595 0.038351 -0.318398 0 \r\n0.255396 -0.963664 0.0623375 0 \r\n0.457231 -0.0623491 0.113748 0 \r\n0.732118 0.339128 -0.400881 0 \r\n-0.202082 0.583274 -0.718828 0 \r\n-0.609549 -0.582458 0.685283 0 \r\n-0.627843 -0.585418 0.673267 0 \r\n-0.0966787 -0.389518 -0.721798 0 \r\n0.187789 -0.396737 -0.968461 0 \r\n-0.214061 -0.161936 -0.687623 0 \r\n-0.354641 -0.0207268 -0.776749 0 \r\n0.495027 0.650837 -0.131609 0 \r\n0.297047 -0.774009 0.58934 0 \r\n-0.242887 -0.432437 -0.343536 0 \r\n0.228597 -0.600003 -0.90244 0 \r\n0.00397677 0.742089 -0.107138 0 \r\n-0.0164683 0.729995 -0.10228 0 \r\n0.642319 -0.205964 -0.956111 0 \r\n0.631315 -0.240261 -0.953718 0 \r\n0.512896 -0.724846 -0.0143475 0 \r\n0.531901 -0.704847 -0.009417 0 \r\n-0.104399 0.578454 0.0302337 0 \r\n-0.0921177 0.573095 0.049901 0 \r\n0.452276 0.570112 -0.85437 0 \r\n0.408574 -0.226092 0.120914 0 \r\n-0.236966 -0.47251 -0.373479 0 \r\n-0.243312 -0.465279 -0.341694 0 \r\n-0.338752 0.266819 -0.777802 0 \r\n0.396008 0.530909 0.149356 0 \r\n0.332846 0.791726 -0.51178 0 \r\n0.143989 0.617989 0.11312 0 \r\n0.546526 0.464805 -0.93353 0 \r\n-0.689942 -0.585755 0.841971 0 \r\n0.458824 0.431563 0.143374 0 \r\n0.59483 0.314997 -0.955645 0 \r\n0.691244 0.14936 -0.741838 0 \r\n0.57154 0.520869 -0.0986221 0 \r\n-0.10237 -0.244638 -0.731172 0 \r\n0.0535366 -0.867601 0.0054247 0 \r\n0.331783 0.942887 -0.700141 0 \r\n0.743968 0.29757 -0.341895 0 \r\n0.388465 -0.920433 0.0446401 0 \r\n0.207666 -0.536242 -0.664873 0 \r\n0.03812 -0.783255 0.55777 0 \r\n0.0061927 -0.878511 -0.165568 0 \r\n-0.2659 0.148348 -0.0853262 0 \r\n0.679633 0.406955 -0.6202 0 \r\n-0.341293 -0.193962 -0.291479 0 \r\n0.00734035 0.0524269 0.223538 0 \r\n-0.115471 -0.0016208 0.137853 0 \r\n0.587934 -0.320691 -0.964446 0 \r\n-0.239267 -0.0171956 0.982906 0 \r\n-0.215358 0.595057 -0.667935 0 \r\n-0.280023 0.451522 -0.810787 0 \r\n-0.290228 0.427469 -0.80891 0 \r\n-0.279905 0.428445 -0.831098 0 \r\n-0.0698566 -0.162752 0.766641 0 \r\n-0.00907128 0.758551 -0.529058 0 \r\n-0.0221738 -0.45531 0.263058 0 \r\n-0.0439306 -0.0393789 0.653883 0 \r\n0.481086 0.352167 -0.949589 0 \r\n-0.389244 -0.609837 0.734753 0 \r\n0.254845 -0.388683 0.303226 0 \r\n0.44039 -0.518031 -0.579468 0 \r\n0.284771 0.955375 -0.499344 0 \r\n0.265175 0.966229 -0.50334 0 \r\n-0.0663586 -0.0539445 0.684479 0 \r\n-0.216532 0.421088 -0.0563033 0 \r\n-0.222346 -0.328102 -0.391342 0 \r\n0.316741 0.44223 0.228919 0 \r\n0.123204 -0.363339 0.619111 0 \r\n0.206095 -0.553254 -0.65995 0 \r\n0.211823 -0.570243 -0.654493 0 \r\n0.32895 -0.524697 -0.848938 0 \r\n-0.275015 -0.1635 -0.616365 0 \r\n0.1457 -0.4245 0.443378 0 \r\n0.166276 -0.428883 0.451762 0 \r\n0.126187 0.989914 -0.631287 0 \r\n0.242142 -0.90204 -0.347502 0 \r\n-0.214851 -0.565201 -0.422779 0 \r\n-0.46902 -0.612858 0.764436 0 \r\n0.0148878 -0.230508 0.678144 0 \r\n0.0326614 -0.247907 0.664104 0 \r\n0.50392 -0.929317 0.346507 0 \r\n0.0793049 -0.908443 0.328815 0 \r\n0.0987614 -0.911075 0.345755 0 \r\n-0.327545 -0.236097 -0.985269 0 \r\n0.227392 0.482725 0.223274 0 \r\n0.316233 -0.95663 0.309431 0 \r\n-0.00473075 -0.782055 0.530806 0 \r\n-0.00514995 -0.77685 0.538345 0 \r\n-0.317272 -0.683334 0.759066 0 \r\n-0.263979 -0.69435 0.739506 0 \r\n-0.400344 0.229265 -0.585849 0 \r\n-0.109303 -0.0892837 0.927338 0 \r\n-0.0948001 -0.105904 0.914778 0 \r\n-0.0983991 -0.101378 0.928392 0 \r\n0.373958 0.504251 0.177721 0 \r\n0.522521 -0.108628 -0.678267 0 \r\n0.526371 -0.103948 -0.662935 0 \r\n-0.0151208 -0.761938 0.577833 0 \r\n-0.226018 -0.0208062 0.0140051 0 \r\n-0.208367 -0.0023405 0.866345 0 \r\n-0.236933 -0.533644 -0.200137 0 \r\n-0.0421951 0.740958 -0.543449 0 \r\n-0.0254767 0.75106 -0.532757 0 \r\n0.0713658 -0.892362 -0.344392 0 \r\n-0.124263 0.679731 -0.156393 0 \r\n0.568178 -0.644708 0.419595 0 \r\n0.244642 -0.933598 0.540736 0 \r\n-0.0091035 -0.259624 0.206391 0 \r\n0.31491 -0.56075 0.590124 0 \r\n0.612875 -0.513982 -0.854677 0 \r\n-0.385258 0.284085 -0.593617 0 \r\n0.219752 0.982463 -0.506557 0 \r\n0.245187 0.977145 -0.50701 0 \r\n-0.0293197 -0.390086 0.744534 0 \r\n0.553936 -0.330835 -0.0979705 0 \r\n0.734437 0.332689 -0.422213 0 \r\n-0.129239 -0.722626 -0.434623 0 \r\n-0.120361 -0.737321 -0.429116 0 \r\n-0.0230045 0.766147 -0.443074 0 \r\n0.0349241 -0.555341 0.534624 0 \r\n-0.363174 -0.00780684 -0.768162 0 \r\n-0.231903 -0.374512 -0.950148 0 \r\n0.612029 0.12662 -0.117057 0 \r\n0.296621 -0.580078 0.593828 0 \r\n-0.687114 -0.691326 0.84528 0 \r\n-0.168364 -0.732158 -0.238815 0 \r\n0.229163 0.655231 0.0712976 0 \r\n0.213334 0.653493 0.0742342 0 \r\n-0.161783 -0.200479 -0.632729 0 \r\n-0.151226 -0.194928 -0.659307 0 \r\n0.205769 -0.499472 -0.676505 0 \r\n-0.315531 -0.111745 -0.74545 0 \r\n-0.0223923 -0.862211 0.18652 0 \r\n0.378031 -0.449674 -0.64977 0 \r\n0.706172 -0.691617 0.204321 0 \r\n-0.0527065 -0.759003 0.0381443 0 \r\n-0.152241 0.0526604 0.702565 0 \r\n0.324679 -0.674492 -0.586507 0 \r\n0.34178 -0.656913 -0.589878 0 \r\n0.540565 0.56168 -0.718943 0 \r\n-0.383687 0.0223502 -0.177161 0 \r\n0.693408 -0.0906157 -0.430511 0 \r\n0.140315 -0.595086 0.585263 0 \r\n0.432773 0.210183 -0.898605 0 \r\n0.394987 -0.856302 0.552892 0 \r\n0.493352 -0.483644 0.144713 0 \r\n-0.245486 0.0978765 -0.0103436 0 \r\n0.529748 0.328803 -0.959704 0 \r\n-0.0648852 -0.279527 0.835988 0 \r\n-0.247799 -0.170808 -0.962325 0 \r\n0.372775 -0.937666 0.494156 0 \r\n0.174185 -0.339019 0.255296 0 \r\n-0.161267 -0.188392 0.679597 0 \r\n-0.650248 -0.729715 0.855299 0 \r\n0.413027 -0.702699 -0.524553 0 \r\n0.113517 0.98842 -0.609367 0 \r\n0.0399946 -0.27281 0.713274 0 \r\n0.0215179 -0.252923 0.744071 0 \r\n-0.381911 0.337291 -0.519971 0 \r\n0.0217524 -0.875422 -0.350784 0 \r\n0.323911 0.396091 -0.961879 0 \r\n-0.170936 -0.646573 0.437982 0 \r\n0.553458 -0.598681 -0.439959 0 \r\n0.560624 -0.613734 -0.416936 0 \r\n-0.398632 0.210624 -0.614392 0 \r\n0.612283 0.525301 -0.565374 0 \r\n-0.144192 -0.194102 -0.680454 0 \r\n0.441718 0.381387 0.183174 0 \r\n0.17546 -0.463019 -0.717602 0 \r\n0.370804 -0.870571 -0.0824799 0 \r\n0.623645 -0.809299 0.0287597 0 \r\n0.0573682 0.512947 0.184175 0 \r\n0.662916 0.23711 -0.793196 0 \r\n0.32331 -0.578991 0.591831 0 \r\n0.0935735 0.45448 -0.963566 0 \r\n0.602924 -0.60374 0.227336 0 \r\n0.263492 -0.892844 -0.36064 0 \r\n0.597247 0.479114 -0.727446 0 \r\n0.604874 0.475908 -0.717391 0 \r\n0.526577 -0.32427 -0.761645 0 \r\n0.528373 -0.310021 -0.771894 0 \r\n0.507215 -0.638335 -0.954804 0 \r\n-0.548908 -0.693888 0.590726 0 \r\n0.0833289 0.107615 0.261424 0 \r\n0.0409856 0.937268 -0.699822 0 \r\n0.423818 0.858048 -0.684054 0 \r\n0.560551 -0.625206 0.348857 0 \r\n0.52542 -0.323063 -0.738909 0 \r\n0.557952 -0.749846 0.493565 0 \r\n0.555347 -0.733797 0.498244 0 \r\n0.457132 0.476577 0.116478 0 \r\n0.535045 -0.709103 -0.379065 0 \r\n0.126117 0.784473 -0.149186 0 \r\n-0.0540074 -0.15545 0.887415 0 \r\n-0.0669262 -0.165792 0.784629 0 \r\n0.450512 -0.77698 -0.426452 0 \r\n-0.258871 0.576473 -0.319216 0 \r\n-0.304958 0.110037 0.799083 0 \r\n-0.327428 0.295624 -0.16858 0 \r\n-0.553908 -0.590164 0.645494 0 \r\n0.744119 -0.0548561 -0.296544 0 \r\n-0.440591 -0.57768 0.673563 0 \r\n-0.0892043 -0.69128 0.0597796 0 \r\n0.481242 -0.76504 0.544078 0 \r\n-0.234554 0.0634572 0.716439 0 \r\n0.42263 -0.855319 0.541348 0 \r\n-0.0106272 -0.630294 -0.981323 0 \r\n-0.213059 -0.220352 0.00677 0 \r\n-0.106211 -0.537344 -0.931309 0 \r\n-0.00663074 -0.847254 0.316596 0 \r\n0.734785 0.325052 -0.333034 0 \r\n-0.336378 -0.215433 -0.980685 0 \r\n-0.20683 -0.5752 0.554335 0 \r\n-0.417988 -0.140312 -0.289827 0 \r\n0.357122 0.939972 -0.574195 0 \r\n-0.205085 0.207848 -0.965703 0 \r\n0.279141 0.990879 -0.58871 0 \r\n-0.288799 -0.0488703 -0.147909 0 \r\n0.683882 0.0646921 -0.155105 0 \r\n0.275495 0.683336 0.0312314 0 \r\n0.00405724 -0.606758 0.535253 0 \r\n-0.296458 0.0019861 0.950639 0 \r\n0.510567 -0.977156 0.182483 0 \r\n0.131004 -0.390911 0.63946 0 \r\n-0.110215 -0.43483 0.157507 0 \r\n0.460089 -0.828915 -0.00211394 0 \r\n0.602431 0.35669 -0.0807963 0 \r\n0.0112279 -0.513826 0.420979 0 \r\n0.625176 -0.841856 0.0400848 0 \r\n-0.0676339 0.710429 -0.614316 0 \r\n0.671752 -0.851949 0.139923 0 \r\n-0.467768 -0.713939 0.551674 0 \r\n-0.440431 -0.720235 0.555912 0 \r\n0.390862 0.399619 0.217007 0 \r\n0.59331 -0.597642 0.0824888 0 \r\n-0.265522 0.177056 -0.0907509 0 \r\n-0.144882 0.514483 0.0293864 0 \r\n-0.271274 0.552611 -0.595686 0 \r\n0.550589 -0.696636 -0.360881 0 \r\n-0.337369 0.291463 -0.772637 0 \r\n0.288953 -0.240078 -0.965976 0 \r\n0.242241 -0.157741 0.198718 0 \r\n-0.300443 0.485537 -0.287049 0 \r\n0.440965 -0.323278 -0.965735 0 \r\n0.705907 0.295577 -0.708107 0 \r\n0.756954 -0.0130268 -0.37099 0 \r\n0.350538 0.513586 0.181451 0 \r\n0.366731 0.5246 0.167141 0 \r\n0.0287023 -0.54169 0.545982 0 \r\n-0.290434 0.285668 -0.875386 0 \r\n0.727806 0.348758 -0.479777 0 \r\n0.247543 -0.489673 -0.973093 0 \r\n0.0032826 -0.789063 0.522494 0 \r\n0.0259328 -0.80343 0.529369 0 \r\n0.218372 -0.827914 -0.472941 0 \r\n0.701771 -0.0045538 -0.568328 0 \r\n0.035666 0.747205 -0.0951717 0 \r\n0.0686549 0.58121 -0.953016 0 \r\n0.205873 -0.656067 -0.945873 0 \r\n-0.306912 0.0145989 0.95425 0 \r\n0.520674 -0.457138 -0.522496 0 \r\n0.539361 -0.453231 -0.502204 0 \r\n0.576505 -0.585958 -0.862836 0 \r\n0.425462 -0.205435 0.101732 0 \r\n-0.035154 0.169071 -0.898947 0 \r\n0.276469 0.928952 -0.767161 0 \r\n0.278296 0.945948 -0.736454 0 \r\n0.0551954 -0.28954 0.69291 0 \r\n0.620398 0.216388 -0.963745 0 \r\n0.152926 0.228856 0.281388 0 \r\n0.309639 -0.8807 0.000633315 0 \r\n0.22255 -0.795174 0.584422 0 \r\n0.37883 0.163327 0.248199 0 \r\n-0.153724 0.0576774 0.691768 0 \r\n-0.0380169 -0.774521 0.419258 0 \r\n-0.253052 -0.465381 -0.227814 0 \r\n-0.292015 -0.667552 0.742988 0 \r\n-0.110197 -0.412654 0.164091 0 \r\n-0.232352 -0.0861868 0.785952 0 \r\n-0.423873 0.233597 -0.341208 0 \r\n-0.26151 0.198919 -0.0858326 0 \r\n0.580064 -0.426623 -0.418204 0 \r\n0.630718 0.203085 -0.125657 0 \r\n0.57347 -0.720972 -0.00268829 0 \r\n-0.133327 -0.250463 0.81456 0 \r\n0.0156495 -0.554344 -0.63041 0 \r\n0.381751 -0.882028 -0.141772 0 \r\n0.396584 0.328575 0.23089 0 \r\n0.574263 0.602337 -0.233071 0 \r\n0.613943 -0.941329 0.163951 0 \r\n-0.149229 0.589501 -0.754596 0 \r\n0.257102 0.649861 0.0746701 0 \r\n0.264536 0.238091 -0.944206 0 \r\n0.265756 0.225956 -0.937177 0 \r\n0.0854891 0.368255 0.263016 0 \r\n0.27812 0.764953 -0.140951 0 \r\n0.0126724 0.779133 -0.211464 0 \r\n-0.180624 0.0737457 0.711219 0 \r\n0.559659 -0.594976 -0.857349 0 \r\n0.267831 0.212336 -0.928854 0 \r\n0.509394 0.214302 -0.928828 0 \r\n0.480501 -0.519916 -0.785583 0 \r\n0.365133 -0.917717 0.0408942 0 \r\n-0.132746 -0.0860664 0.861909 0 \r\n-0.166982 0.164489 0.111092 0 \r\n-0.158928 0.0197591 -0.906698 0 \r\n-0.223706 -0.184094 -0.943896 0 \r\n0.472661 -0.80641 -0.0111146 0 \r\n-0.0493975 -0.586571 -0.982418 0 \r\n-0.142363 -0.698452 -0.444405 0 \r\n-0.284409 0.217104 -0.132946 0 \r\n-0.28855 0.246174 -0.141175 0 \r\n0.59263 -0.597109 -0.347125 0 \r\n0.490685 0.690704 -0.517128 0 \r\n-0.22975 -0.574435 0.570901 0 \r\n-0.241261 -0.574082 0.561142 0 \r\n0.0254792 -0.152212 0.619978 0 \r\n0.288361 -0.897852 0.0153619 0 \r\n0.276573 -0.892118 0.00624241 0 \r\n-0.141908 0.668913 -0.599836 0 \r\n0.576836 0.506513 -0.729277 0 \r\n-0.0191341 -0.832236 0.322381 0 \r\n-0.0259764 -0.824664 0.317551 0 \r\n0.0996507 0.393165 0.257672 0 \r\n0.0199018 -0.374058 0.246694 0 \r\n0.603817 0.400013 -0.0873555 0 \r\n0.319559 0.784202 -0.285711 0 \r\n0.611111 0.106385 -0.117371 0 \r\n-0.659606 -0.571859 0.735469 0 \r\n0.122106 -0.429923 0.408782 0 \r\n0.0371167 -0.854848 0.0165059 0 \r\n0.378135 -0.822008 -0.425992 0 \r\n0.587006 -0.655913 0.39756 0 \r\n0.616305 0.470216 -0.698578 0 \r\n0.378571 -0.392617 -0.968143 0 \r\n-0.176502 -0.342981 -0.501275 0 \r\n0.584417 0.342111 -0.960297 0 \r\n0.20626 0.254481 0.282384 0 \r\n0.180286 0.249287 0.283017 0 \r\n0.428773 -0.672961 0.579934 0 \r\n0.200317 -0.925838 0.0215936 0 \r\n0.192206 -0.916748 0.0145572 0 \r\n0.393196 -0.18398 -0.939444 0 \r\n-0.235129 0.529352 -0.164442 0 \r\n0.188953 -0.695807 0.591245 0 \r\n0.0933455 0.585599 -0.95968 0 \r\n-0.395002 0.286394 -0.537642 0 \r\n0.70516 -0.1576 -0.892244 0 \r\n0.130074 -0.92356 -0.26969 0 \r\n-0.415092 -0.629116 0.504553 0 \r\n-0.155513 -0.493738 0.0770203 0 \r\n0.18734 -0.552289 -0.662534 0 \r\n0.380884 -0.941603 0.47721 0 \r\n-0.148598 -0.0305499 0.648799 0 \r\n-0.373598 0.298488 -0.63491 0 \r\n-0.378341 0.298379 -0.611802 0 \r\n0.124719 -0.250118 -0.962805 0 \r\n-0.166264 0.143985 0.109826 0 \r\n0.401964 0.757348 -0.416317 0 \r\n0.25236 -0.998011 0.147198 0 \r\n0.69209 0.11961 -0.735122 0 \r\n0.226238 -0.95795 0.464572 0 \r\n-0.207922 -0.00975663 0.959469 0 \r\n-0.121938 -0.174583 0.903732 0 \r\n0.67957 0.138449 -0.758781 0 \r\n-0.199163 0.254953 0.0878899 0 \r\n-0.190939 0.267892 0.0999993 0 \r\n-0.178876 0.6709 -0.372925 0 \r\n0.569801 -0.311828 -0.8801 0 \r\n0.33999 0.515499 -0.954671 0 \r\n0.315512 0.544502 -0.950111 0 \r\n-0.443539 0.154294 -0.307351 0 \r\n0.765614 0.192231 -0.325639 0 \r\n0.538817 0.373937 0.0126592 0 \r\n0.525447 0.395618 0.0312594 0 \r\n0.659134 0.445463 -0.609455 0 \r\n-0.206953 -0.714509 0.716937 0 \r\n0.0370564 -0.875089 0.0599508 0 \r\n-0.189405 -0.347784 -0.853565 0 \r\n0.510126 -0.238311 -0.703344 0 \r\n0.0103988 -0.143656 0.641976 0 \r\n-0.00442052 -0.415204 0.472593 0 \r\n-0.0199175 -0.407476 0.492065 0 \r\n-0.0051619 0.904307 -0.640936 0 \r\n0.181808 -0.424759 -0.970449 0 \r\n-0.097987 -0.28675 -0.715677 0 \r\n0.0169247 -0.865353 -0.369411 0 \r\n0.0333494 0.781292 -0.189285 0 \r\n-0.300179 0.0492724 -0.958007 0 \r\n-0.0331274 -0.499394 -0.776585 0 \r\n0.08107 -0.513966 0.631631 0 \r\n0.101454 -0.521561 0.617545 0 \r\n-0.523918 -0.582512 0.689937 0 \r\n-0.177933 -0.13131 0.912889 0 \r\n0.191319 -0.944103 0.0375995 0 \r\n0.191283 -0.934963 0.0270828 0 \r\n-0.676105 -0.707577 0.861297 0 \r\n-0.231848 -0.280335 -0.0388861 0 \r\n0.602145 -0.30331 -0.960806 0 \r\n-0.605857 -0.7228 0.898741 0 \r\n0.539704 0.23433 0.0786702 0 \r\n-0.0189483 -0.53159 -0.801077 0 \r\n0.59165 -0.725867 0.00195318 0 \r\n0.230178 -0.936805 0.0340508 0 \r\n0.212283 -0.930606 0.0254537 0 \r\n0.221144 -0.94593 0.03954 0 \r\n0.302832 0.789333 -0.267456 0 \r\n0.157739 -0.796797 -0.51493 0 \r\n0.174908 -0.800624 -0.510311 0 \r\n0.549178 0.343435 -0.00455405 0 \r\n0.461267 0.553343 -0.874271 0 \r\n0.454248 0.549021 -0.886687 0 \r\n0.157534 -0.307875 0.238418 0 \r\n0.383956 0.533679 0.154824 0 \r\n-0.0290225 -0.784181 0.430023 0 \r\n-0.148891 -0.0739086 0.849416 0 \r\n0.395936 -0.699595 -0.537736 0 \r\n0.581465 -0.343735 -0.351548 0 \r\n-0.151713 -0.25248 0.764696 0 \r\n0.438019 -0.930077 0.444706 0 \r\n-0.329854 -0.0797706 -0.964574 0 \r\n-0.346153 -0.201091 -0.419706 0 \r\n-0.062458 -0.389109 0.206059 0 \r\n0.421011 -0.93417 0.453962 0 \r\n0.740876 0.312086 -0.410341 0 \r\n-0.720338 -0.658826 0.908287 0 \r\n0.312964 -0.441288 -0.693669 0 \r\n-0.120764 -0.26391 -0.634487 0 \r\n0.551897 -0.714192 -0.214703 0 \r\n0.0706902 -0.895116 0.0416671 0 \r\n0.546148 -0.0384335 -0.000529945 0 \r\n0.36393 -0.457147 -0.766923 0 \r\n0.583017 -0.342434 -0.329905 0 \r\n0.597533 -0.283388 -0.962844 0 \r\n0.536907 -0.769612 0.50529 0 \r\n0.092732 -0.0145149 0.229494 0 \r\n0.372267 -0.813633 -0.442388 0 \r\n0.058867 -0.895514 0.0567962 0 \r\n-0.00291019 -0.843104 0.342029 0 \r\n-0.351082 -0.167306 -0.963245 0 \r\n0.585522 -0.638999 0.334947 0 \r\n-0.0545703 0.7392 -0.520952 0 \r\n-0.00986925 -0.0945882 0.606835 0 \r\n-0.176323 0.513435 -0.837995 0 \r\n0.529821 -0.300379 -0.796118 0 \r\n0.0157423 -0.13444 0.630339 0 \r\n-0.0507169 -0.376751 0.214667 0 \r\n-0.108111 -0.679016 -0.497189 0 \r\n0.581393 -0.952677 0.212772 0 \r\n0.0217203 -0.362157 -0.977579 0 \r\n0.157613 -0.186403 -0.943779 0 \r\n0.651528 0.329385 -0.783686 0 \r\n0.672379 0.324481 -0.755229 0 \r\n-0.0192212 0.779642 -0.815686 0 \r\n-0.38317 -0.682399 0.479369 0 \r\n-0.0988736 -0.106847 0.932703 0 \r\n0.60199 -0.480603 -0.955128 0 \r\n0.587265 -0.20592 -0.218827 0 \r\n0.60998 -0.151884 -0.352123 0 \r\n0.229254 -0.386216 0.304761 0 \r\n-0.0137423 0.51276 -0.928279 0 \r\n0.747003 -0.0438231 -0.387095 0 \r\n0.403755 -0.441094 -0.642547 0 \r\n0.20694 -0.38149 0.301379 0 \r\n0.519661 -0.770305 0.517083 0 \r\n-0.708879 -0.606611 0.654392 0 \r\n0.57967 0.585552 -0.202069 0 \r\n-0.361738 0.33147 -0.2267 0 \r\n-0.363609 -0.255418 -0.96707 0 \r\n-0.347762 -0.192499 -0.975739 0 \r\n-0.412893 -0.586671 0.583146 0 \r\n-0.187573 0.51842 -0.826319 0 \r\n0.409923 -0.49525 0.464364 0 \r\n0.492755 -0.778699 0.533327 0 \r\n0.52788 0.520329 -0.85663 0 \r\n-0.0838163 -0.629114 0.209846 0 \r\n-0.200578 0.652191 -0.366341 0 \r\n0.154249 0.81031 -0.432297 0 \r\n3 5004 5002 5003 0 \r\n3 5007 5005 5006 1 \r\n3 5010 5008 5009 2 \r\n3 5013 5011 5012 3 \r\n3 5016 5014 5015 4 \r\n3 5019 5017 5018 5 \r\n3 5022 5020 5021 6 \r\n3 5025 5023 5024 7 \r\n3 5028 5026 5027 8 \r\n3 5031 5029 5030 9 \r\n3 5034 5032 5033 10 \r\n3 5037 5035 5036 11 \r\n3 5040 5038 5039 12 \r\n3 5043 5041 5042 13 \r\n3 5046 5044 5045 14 \r\n3 5049 5047 5048 15 \r\n3 5052 5050 5051 16 \r\n3 5055 5053 5054 17 \r\n3 5058 5056 5057 18 \r\n3 5061 5059 5060 19 \r\n3 5064 5062 5063 20 \r\n3 5067 5065 5066 21 \r\n3 5070 5068 5069 22 \r\n3 5073 5071 5072 23 \r\n3 5076 5074 5075 24 \r\n3 5079 5077 5078 25 \r\n3 5082 5080 5081 26 \r\n3 5085 5083 5084 27 \r\n3 5088 5086 5087 28 \r\n3 5091 5089 5090 29 \r\n3 5094 5092 5093 30 \r\n3 5097 5095 5096 31 \r\n3 5100 5098 5099 32 \r\n3 5103 5101 5102 33 \r\n3 5106 5104 5105 34 \r\n3 5109 5107 5108 35 \r\n3 5112 5110 5111 36 \r\n3 5115 5113 5114 37 \r\n3 5118 5116 5117 38 \r\n3 5121 5119 5120 39 \r\n3 5124 5122 5123 40 \r\n3 5127 5125 5126 41 \r\n3 5130 5128 5129 42 \r\n3 5133 5131 5132 43 \r\n3 5136 5134 5135 44 \r\n3 5139 5137 5138 45 \r\n3 5142 5140 5141 46 \r\n3 5145 5143 5144 47 \r\n3 5148 5146 5147 48 \r\n3 5151 5149 5150 49 \r\n3 5154 5152 5153 50 \r\n3 5157 5155 5156 51 \r\n3 5160 5158 5159 52 \r\n3 5163 5161 5162 53 \r\n3 5166 5164 5165 54 \r\n3 5169 5167 5168 55 \r\n3 5172 5170 5171 56 \r\n3 5175 5173 5174 57 \r\n3 5178 5176 5177 58 \r\n3 5181 5179 5180 59 \r\n3 5184 5182 5183 60 \r\n3 5187 5185 5186 61 \r\n3 5190 5188 5189 62 \r\n3 5193 5191 5192 63 \r\n3 5196 5194 5195 64 \r\n3 5199 5197 5198 65 \r\n3 5202 5200 5201 66 \r\n3 5205 5203 5204 67 \r\n3 5208 5206 5207 68 \r\n3 5211 5209 5210 69 \r\n3 5214 5212 5213 70 \r\n3 5217 5215 5216 71 \r\n3 5220 5218 5219 72 \r\n3 5223 5221 5222 73 \r\n3 5226 5224 5225 74 \r\n3 5229 5227 5228 75 \r\n3 5232 5230 5231 76 \r\n3 5235 5233 5234 77 \r\n3 5238 5236 5237 78 \r\n3 5241 5239 5240 79 \r\n3 5244 5242 5243 80 \r\n3 5247 5245 5246 81 \r\n3 5250 5248 5249 82 \r\n3 5253 5251 5252 83 \r\n3 5256 5254 5255 84 \r\n3 5259 5257 5258 85 \r\n3 5262 5260 5261 86 \r\n3 5265 5263 5264 87 \r\n3 5268 5266 5267 88 \r\n3 5271 5269 5270 89 \r\n3 5274 5272 5273 90 \r\n3 5277 5275 5276 91 \r\n3 5280 5278 5279 92 \r\n3 5283 5281 5282 93 \r\n3 5286 5284 5285 94 \r\n3 5289 5287 5288 95 \r\n3 5292 5290 5291 96 \r\n3 5295 5293 5294 97 \r\n3 5298 5296 5297 98 \r\n3 5301 5299 5300 99 \r\n3 5304 5302 5303 100 \r\n3 5307 5305 5306 101 \r\n3 5310 5308 5309 102 \r\n3 5313 5311 5312 103 \r\n3 5316 5314 5315 104 \r\n3 5319 5317 5318 105 \r\n3 5322 5320 5321 106 \r\n3 5325 5323 5324 107 \r\n3 5328 5326 5327 108 \r\n3 5331 5329 5330 109 \r\n3 5334 5332 5333 110 \r\n3 5337 5335 5336 111 \r\n3 5340 5338 5339 112 \r\n3 5343 5341 5342 113 \r\n3 5346 5344 5345 114 \r\n3 5349 5347 5348 115 \r\n3 5352 5350 5351 116 \r\n3 5355 5353 5354 117 \r\n3 5358 5356 5357 118 \r\n3 5361 5359 5360 119 \r\n3 5364 5362 5363 120 \r\n3 5367 5365 5366 121 \r\n3 5370 5368 5369 122 \r\n3 5373 5371 5372 123 \r\n3 5376 5374 5375 124 \r\n3 5379 5377 5378 125 \r\n3 5382 5380 5381 126 \r\n3 5385 5383 5384 127 \r\n3 5388 5386 5387 128 \r\n3 5391 5389 5390 129 \r\n3 5394 5392 5393 130 \r\n3 5397 5395 5396 131 \r\n3 5400 5398 5399 132 \r\n3 5403 5401 5402 133 \r\n3 5406 5404 5405 134 \r\n3 5409 5407 5408 135 \r\n3 5412 5410 5411 136 \r\n3 5415 5413 5414 137 \r\n3 5418 5416 5417 138 \r\n3 5421 5419 5420 139 \r\n3 5424 5422 5423 140 \r\n3 5427 5425 5426 141 \r\n3 5430 5428 5429 142 \r\n3 5433 5431 5432 143 \r\n3 5436 5434 5435 144 \r\n3 5439 5437 5438 145 \r\n3 5442 5440 5441 146 \r\n3 5445 5443 5444 147 \r\n3 5448 5446 5447 148 \r\n3 5451 5449 5450 149 \r\n3 5454 5452 5453 150 \r\n3 5457 5455 5456 151 \r\n3 5460 5458 5459 152 \r\n3 5463 5461 5462 153 \r\n3 5466 5464 5465 154 \r\n3 5469 5467 5468 155 \r\n3 5472 5470 5471 156 \r\n3 5475 5473 5474 157 \r\n3 5477 5417 5476 158 \r\n3 5480 5478 5479 159 \r\n3 5483 5481 5482 160 \r\n3 5486 5484 5485 161 \r\n3 5489 5487 5488 162 \r\n3 5492 5490 5491 163 \r\n3 5495 5493 5494 164 \r\n3 5498 5496 5497 165 \r\n3 5501 5499 5500 166 \r\n3 5504 5502 5503 167 \r\n3 5507 5505 5506 168 \r\n3 5510 5508 5509 169 \r\n3 5513 5511 5512 170 \r\n3 5516 5514 5515 171 \r\n3 5519 5517 5518 172 \r\n3 5522 5520 5521 173 \r\n3 5525 5523 5524 174 \r\n3 5528 5526 5527 175 \r\n3 5531 5529 5530 176 \r\n3 5534 5532 5533 177 \r\n3 5537 5535 5536 178 \r\n3 5540 5538 5539 179 \r\n3 5542 5048 5541 180 \r\n3 5545 5543 5544 181 \r\n3 5548 5546 5547 182 \r\n3 5551 5549 5550 183 \r\n3 5554 5552 5553 184 \r\n3 5557 5555 5556 185 \r\n3 5560 5558 5559 186 \r\n3 5563 5561 5562 187 \r\n3 5566 5564 5565 188 \r\n3 5569 5567 5568 189 \r\n3 5572 5570 5571 190 \r\n3 5575 5573 5574 191 \r\n3 5578 5576 5577 192 \r\n3 5581 5579 5580 193 \r\n3 5583 5582 5287 194 \r\n3 5586 5584 5585 195 \r\n3 5589 5587 5588 196 \r\n3 5592 5590 5591 197 \r\n3 5595 5593 5594 198 \r\n3 5598 5596 5597 199 \r\n3 5601 5599 5600 200 \r\n3 5604 5602 5603 201 \r\n3 5607 5605 5606 202 \r\n3 5610 5608 5609 203 \r\n3 5613 5611 5612 204 \r\n3 5616 5614 5615 205 \r\n3 5619 5617 5618 206 \r\n3 5622 5620 5621 207 \r\n3 5625 5623 5624 208 \r\n3 5628 5626 5627 209 \r\n3 5631 5629 5630 210 \r\n3 5634 5632 5633 211 \r\n3 5637 5635 5636 212 \r\n3 5640 5638 5639 213 \r\n3 5643 5641 5642 214 \r\n3 5646 5644 5645 215 \r\n3 5649 5647 5648 216 \r\n3 5652 5650 5651 217 \r\n3 5655 5653 5654 218 \r\n3 5658 5656 5657 219 \r\n3 5661 5659 5660 220 \r\n3 5664 5662 5663 221 \r\n3 5667 5665 5666 222 \r\n3 5670 5668 5669 223 \r\n3 5672 5671 5472 224 \r\n3 5675 5673 5674 225 \r\n3 5677 5487 5676 226 \r\n3 5680 5678 5679 227 \r\n3 5683 5681 5682 228 \r\n3 5686 5684 5685 229 \r\n3 5689 5687 5688 230 \r\n3 5692 5690 5691 231 \r\n3 5695 5693 5694 232 \r\n3 5194 5696 5697 233 \r\n3 5700 5698 5699 234 \r\n3 5703 5701 5702 235 \r\n3 5706 5704 5705 236 \r\n3 5709 5707 5708 237 \r\n3 5712 5710 5711 238 \r\n3 5715 5713 5714 239 \r\n3 5718 5716 5717 240 \r\n3 5721 5719 5720 241 \r\n3 5723 5087 5722 242 \r\n3 5726 5724 5725 243 \r\n3 5729 5727 5728 244 \r\n3 5732 5730 5731 245 \r\n3 5735 5733 5734 246 \r\n3 5067 5736 5737 247 \r\n3 5740 5738 5739 248 \r\n3 5743 5741 5742 249 \r\n3 5746 5744 5745 250 \r\n3 5749 5747 5748 251 \r\n3 5752 5750 5751 252 \r\n3 5755 5753 5754 253 \r\n3 5758 5756 5757 254 \r\n3 5761 5759 5760 255 \r\n3 5764 5762 5763 256 \r\n3 5767 5765 5766 257 \r\n3 5770 5768 5769 258 \r\n3 5773 5771 5772 259 \r\n3 5776 5774 5775 260 \r\n3 5779 5777 5778 261 \r\n3 5782 5780 5781 262 \r\n3 5785 5783 5784 263 \r\n3 5788 5786 5787 264 \r\n3 5791 5789 5790 265 \r\n3 5794 5792 5793 266 \r\n3 5797 5795 5796 267 \r\n3 5800 5798 5799 268 \r\n3 5803 5801 5802 269 \r\n3 5806 5804 5805 270 \r\n3 5809 5807 5808 271 \r\n3 5812 5810 5811 272 \r\n3 5815 5813 5814 273 \r\n3 5818 5816 5817 274 \r\n3 5821 5819 5820 275 \r\n3 5824 5822 5823 276 \r\n3 5827 5825 5826 277 \r\n3 5830 5828 5829 278 \r\n3 5833 5831 5832 279 \r\n3 5836 5834 5835 280 \r\n3 5839 5837 5838 281 \r\n3 5842 5840 5841 282 \r\n3 5845 5843 5844 283 \r\n3 5848 5846 5847 284 \r\n3 5851 5849 5850 285 \r\n3 5854 5852 5853 286 \r\n3 5857 5855 5856 287 \r\n3 5860 5858 5859 288 \r\n3 5863 5861 5862 289 \r\n3 5866 5864 5865 290 \r\n3 5869 5867 5868 291 \r\n3 5872 5870 5871 292 \r\n3 5875 5873 5874 293 \r\n3 5878 5876 5877 294 \r\n3 5881 5879 5880 295 \r\n3 5884 5882 5883 296 \r\n3 5887 5885 5886 297 \r\n3 5889 5777 5888 298 \r\n3 5892 5890 5891 299 \r\n3 5895 5893 5894 300 \r\n3 5898 5896 5897 301 \r\n3 5901 5899 5900 302 \r\n3 5904 5902 5903 303 \r\n3 5907 5905 5906 304 \r\n3 5910 5908 5909 305 \r\n3 5913 5911 5912 306 \r\n3 5916 5914 5915 307 \r\n3 5919 5917 5918 308 \r\n3 5922 5920 5921 309 \r\n3 5925 5923 5924 310 \r\n3 5928 5926 5927 311 \r\n3 5931 5929 5930 312 \r\n3 5934 5932 5933 313 \r\n3 5937 5935 5936 314 \r\n3 5940 5938 5939 315 \r\n3 5254 5941 5942 316 \r\n3 5945 5943 5944 317 \r\n3 5948 5946 5947 318 \r\n3 5951 5949 5950 319 \r\n3 5954 5952 5953 320 \r\n3 5957 5955 5956 321 \r\n3 5960 5958 5959 322 \r\n3 5963 5961 5962 323 \r\n3 5966 5964 5965 324 \r\n3 5969 5967 5968 325 \r\n3 5972 5970 5971 326 \r\n3 5975 5973 5974 327 \r\n3 5978 5976 5977 328 \r\n3 5981 5979 5980 329 \r\n3 5984 5982 5983 330 \r\n3 5987 5985 5986 331 \r\n3 5990 5988 5989 332 \r\n3 5993 5991 5992 333 \r\n3 5996 5994 5995 334 \r\n3 5999 5997 5998 335 \r\n3 6002 6000 6001 336 \r\n3 6005 6003 6004 337 \r\n3 6008 6006 6007 338 \r\n3 6011 6009 6010 339 \r\n3 6014 6012 6013 340 \r\n3 6017 6015 6016 341 \r\n3 6020 6018 6019 342 \r\n3 6022 6021 5659 343 \r\n3 6025 6023 6024 344 \r\n3 6028 6026 6027 345 \r\n3 6031 6029 6030 346 \r\n3 6034 6032 6033 347 \r\n3 6037 6035 6036 348 \r\n3 6040 6038 6039 349 \r\n3 6043 6041 6042 350 \r\n3 6046 6044 6045 351 \r\n3 6049 6047 6048 352 \r\n3 6052 6050 6051 353 \r\n3 6055 6053 6054 354 \r\n3 6057 5940 6056 355 \r\n3 6059 6058 5256 356 \r\n3 6062 6060 6061 357 \r\n3 6065 6063 6064 358 \r\n3 6068 6066 6067 359 \r\n3 6071 6069 6070 360 \r\n3 5857 6072 6073 361 \r\n3 6076 6074 6075 362 \r\n3 6079 6077 6078 363 \r\n3 6082 6080 6081 364 \r\n3 6085 6083 6084 365 \r\n3 5994 6086 6087 366 \r\n3 6090 6088 6089 367 \r\n3 6093 6091 6092 368 \r\n3 6096 6094 6095 369 \r\n3 6099 6097 6098 370 \r\n3 6102 6100 6101 371 \r\n3 6105 6103 6104 372 \r\n3 6108 6106 6107 373 \r\n3 6111 6109 6110 374 \r\n3 6114 6112 6113 375 \r\n3 6117 6115 6116 376 \r\n3 5563 6118 6119 377 \r\n3 6122 6120 6121 378 \r\n3 6124 5882 6123 379 \r\n3 6126 5082 6125 380 \r\n3 6129 6127 6128 381 \r\n3 6132 6130 6131 382 \r\n3 6134 5295 6133 383 \r\n3 6137 6135 6136 384 \r\n3 6140 6138 6139 385 \r\n3 6143 6141 6142 386 \r\n3 6146 6144 6145 387 \r\n3 6149 6147 6148 388 \r\n3 6152 6150 6151 389 \r\n3 6155 6153 6154 390 \r\n3 6158 6156 6157 391 \r\n3 6161 6159 6160 392 \r\n3 6164 6162 6163 393 \r\n3 6167 6165 6166 394 \r\n3 6170 6168 6169 395 \r\n3 6173 6171 6172 396 \r\n3 6175 6174 5615 397 \r\n3 6178 6176 6177 398 \r\n3 6181 6179 6180 399 \r\n3 6184 6182 6183 400 \r\n3 6187 6185 6186 401 \r\n3 6190 6188 6189 402 \r\n3 6193 6191 6192 403 \r\n3 6196 6194 6195 404 \r\n3 6198 5570 6197 405 \r\n3 6201 6199 6200 406 \r\n3 6204 6202 6203 407 \r\n3 6207 6205 6206 408 \r\n3 6210 6208 6209 409 \r\n3 6213 6211 6212 410 \r\n3 6216 6214 6215 411 \r\n3 6219 6217 6218 412 \r\n3 6221 6220 5193 413 \r\n3 6224 6222 6223 414 \r\n3 6227 6225 6226 415 \r\n3 6230 6228 6229 416 \r\n3 6232 6231 5884 417 \r\n3 6235 6233 6234 418 \r\n3 6238 6236 6237 419 \r\n3 6241 6239 6240 420 \r\n3 6244 6242 6243 421 \r\n3 6247 6245 6246 422 \r\n3 6250 6248 6249 423 \r\n3 6253 6251 6252 424 \r\n3 6256 6254 6255 425 \r\n3 6259 6257 6258 426 \r\n3 6262 6260 6261 427 \r\n3 6265 6263 6264 428 \r\n3 6268 6266 6267 429 \r\n3 6271 6269 6270 430 \r\n3 6274 6272 6273 431 \r\n3 6277 6275 6276 432 \r\n3 6280 6278 6279 433 \r\n3 6283 6281 6282 434 \r\n3 6286 6284 6285 435 \r\n3 6289 6287 6288 436 \r\n3 6292 6290 6291 437 \r\n3 6295 6293 6294 438 \r\n3 6298 6296 6297 439 \r\n3 6300 6299 5241 440 \r\n3 6303 6301 6302 441 \r\n3 6306 6304 6305 442 \r\n3 6309 6307 6308 443 \r\n3 6312 6310 6311 444 \r\n3 6315 6313 6314 445 \r\n3 6318 6316 6317 446 \r\n3 6321 6319 6320 447 \r\n3 6324 6322 6323 448 \r\n3 6327 6325 6326 449 \r\n3 6329 6328 6283 450 \r\n3 6332 6330 6331 451 \r\n3 6335 6333 6334 452 \r\n3 6338 6336 6337 453 \r\n3 6341 6339 6340 454 \r\n3 6344 6342 6343 455 \r\n3 6347 6345 6346 456 \r\n3 6350 6348 6349 457 \r\n3 6353 6351 6352 458 \r\n3 6356 6354 6355 459 \r\n3 6359 6357 6358 460 \r\n3 6361 5872 6360 461 \r\n3 6364 6362 6363 462 \r\n3 6366 5303 6365 463 \r\n3 6368 6367 5537 464 \r\n3 6370 6369 5123 465 \r\n3 6373 6371 6372 466 \r\n3 6376 6374 6375 467 \r\n3 6379 6377 6378 468 \r\n3 6382 6380 6381 469 \r\n3 5363 6383 6384 470 \r\n3 6387 6385 6386 471 \r\n3 6390 6388 6389 472 \r\n3 6041 6391 6392 473 \r\n3 6395 6393 6394 474 \r\n3 6398 6396 6397 475 \r\n3 6399 5562 6161 476 \r\n3 6402 6400 6401 477 \r\n3 6405 6403 6404 478 \r\n3 6408 6406 6407 479 \r\n3 6411 6409 6410 480 \r\n3 6414 6412 6413 481 \r\n3 6417 6415 6416 482 \r\n3 6420 6418 6419 483 \r\n3 6423 6421 6422 484 \r\n3 6426 6424 6425 485 \r\n3 6429 6427 6428 486 \r\n3 6432 6430 6431 487 \r\n3 6434 6433 6262 488 \r\n3 6437 6435 6436 489 \r\n3 6439 5622 6438 490 \r\n3 6442 6440 6441 491 \r\n3 6445 6443 6444 492 \r\n3 6448 6446 6447 493 \r\n3 6451 6449 6450 494 \r\n3 6454 6452 6453 495 \r\n3 6457 6455 6456 496 \r\n3 6460 6458 6459 497 \r\n3 6463 6461 6462 498 \r\n3 6466 6464 6465 499 \r\n3 5995 6467 6468 500 \r\n3 6471 6469 6470 501 \r\n3 6474 6472 6473 502 \r\n3 6476 6475 5278 503 \r\n3 6479 6477 6478 504 \r\n3 6482 6480 6481 505 \r\n3 6485 6483 6484 506 \r\n3 6488 6486 6487 507 \r\n3 6490 5695 6489 508 \r\n3 6493 6491 6492 509 \r\n3 6496 6494 6495 510 \r\n3 6499 6497 6498 511 \r\n3 6502 6500 6501 512 \r\n3 6505 6503 6504 513 \r\n3 6508 6506 6507 514 \r\n3 6511 6509 6510 515 \r\n3 6514 6512 6513 516 \r\n3 6517 6515 6516 517 \r\n3 6520 6518 6519 518 \r\n3 6523 6521 6522 519 \r\n3 6526 6524 6525 520 \r\n3 6529 6527 6528 521 \r\n3 6532 6530 6531 522 \r\n3 6535 6533 6534 523 \r\n3 6538 6536 6537 524 \r\n3 5219 6539 6540 525 \r\n3 6543 6541 6542 526 \r\n3 6545 6544 5191 527 \r\n3 6548 6546 6547 528 \r\n3 6551 6549 6550 529 \r\n3 6554 6552 6553 530 \r\n3 6557 6555 6556 531 \r\n3 6560 6558 6559 532 \r\n3 6563 6561 6562 533 \r\n3 5812 6564 6565 534 \r\n3 6567 5878 6566 535 \r\n3 6570 6568 6569 536 \r\n3 6573 6571 6572 537 \r\n3 6576 6574 6575 538 \r\n3 6579 6577 6578 539 \r\n3 6582 6580 6581 540 \r\n3 6584 5737 6583 541 \r\n3 6587 6585 6586 542 \r\n3 6589 6588 5667 543 \r\n3 6592 6590 6591 544 \r\n3 6595 6593 6594 545 \r\n3 6598 6596 6597 546 \r\n3 6601 6599 6600 547 \r\n3 6604 6602 6603 548 \r\n3 6606 6605 5377 549 \r\n3 6609 6607 6608 550 \r\n3 6612 6610 6611 551 \r\n3 6614 6194 6613 552 \r\n3 6617 6615 6616 553 \r\n3 6620 6618 6619 554 \r\n3 6623 6621 6622 555 \r\n3 6626 6624 6625 556 \r\n3 6629 6627 6628 557 \r\n3 6632 6630 6631 558 \r\n3 6635 6633 6634 559 \r\n3 6638 6636 6637 560 \r\n3 6640 5471 6639 561 \r\n3 6643 6641 6642 562 \r\n3 6646 6644 6645 563 \r\n3 6649 6647 6648 564 \r\n3 6652 6650 6651 565 \r\n3 6655 6653 6654 566 \r\n3 6658 6656 6657 567 \r\n3 5269 6659 6660 568 \r\n3 6663 6661 6662 569 \r\n3 6666 6664 6665 570 \r\n3 6669 6667 6668 571 \r\n3 6672 6670 6671 572 \r\n3 6675 6673 6674 573 \r\n3 6678 6676 6677 574 \r\n3 6681 6679 6680 575 \r\n3 6684 6682 6683 576 \r\n3 6687 6685 6686 577 \r\n3 6690 6688 6689 578 \r\n3 6693 6691 6692 579 \r\n3 6696 6694 6695 580 \r\n3 6699 6697 6698 581 \r\n3 6702 6700 6701 582 \r\n3 6705 6703 6704 583 \r\n3 6708 6706 6707 584 \r\n3 6711 6709 6710 585 \r\n3 6714 6712 6713 586 \r\n3 6717 6715 6716 587 \r\n3 6720 6718 6719 588 \r\n3 6723 6721 6722 589 \r\n3 6726 6724 6725 590 \r\n3 6729 6727 6728 591 \r\n3 6732 6730 6731 592 \r\n3 6735 6733 6734 593 \r\n3 6738 6736 6737 594 \r\n3 6741 6739 6740 595 \r\n3 6744 6742 6743 596 \r\n3 6747 6745 6746 597 \r\n3 6750 6748 6749 598 \r\n3 6753 6751 6752 599 \r\n3 6756 6754 6755 600 \r\n3 6759 6757 6758 601 \r\n3 6762 6760 6761 602 \r\n3 6765 6763 6764 603 \r\n3 6768 6766 6767 604 \r\n3 6771 6769 6770 605 \r\n3 6774 6772 6773 606 \r\n3 6777 6775 6776 607 \r\n3 6780 6778 6779 608 \r\n3 6783 6781 6782 609 \r\n3 6786 6784 6785 610 \r\n3 6789 6787 6788 611 \r\n3 6792 6790 6791 612 \r\n3 6795 6793 6794 613 \r\n3 6798 6796 6797 614 \r\n3 6801 6799 6800 615 \r\n3 6804 6802 6803 616 \r\n3 6433 5796 6805 617 \r\n3 6808 6806 6807 618 \r\n3 6811 6809 6810 619 \r\n3 5547 6812 6813 620 \r\n3 6816 6814 6815 621 \r\n3 6819 6817 6818 622 \r\n3 6822 6820 6821 623 \r\n3 6825 6823 6824 624 \r\n3 6828 6826 6827 625 \r\n3 6831 6829 6830 626 \r\n3 6834 6832 6833 627 \r\n3 5982 6835 6836 628 \r\n3 6839 6837 6838 629 \r\n3 6842 6840 6841 630 \r\n3 6845 6843 6844 631 \r\n3 6848 6846 6847 632 \r\n3 6851 6849 6850 633 \r\n3 6854 6852 6853 634 \r\n3 6857 6855 6856 635 \r\n3 6860 6858 6859 636 \r\n3 6863 6861 6862 637 \r\n3 6866 6864 6865 638 \r\n3 6869 6867 6868 639 \r\n3 6872 6870 6871 640 \r\n3 6875 6873 6874 641 \r\n3 6878 6876 6877 642 \r\n3 6881 6879 6880 643 \r\n3 6883 6882 6734 644 \r\n3 6886 6884 6885 645 \r\n3 6889 6887 6888 646 \r\n3 6892 6890 6891 647 \r\n3 6895 6893 6894 648 \r\n3 6898 6896 6897 649 \r\n3 6901 6899 6900 650 \r\n3 6904 6902 6903 651 \r\n3 6906 6860 6905 652 \r\n3 6909 6907 6908 653 \r\n3 6912 6910 6911 654 \r\n3 6915 6913 6914 655 \r\n3 6918 6916 6917 656 \r\n3 6920 6919 5580 657 \r\n3 6923 6921 6922 658 \r\n3 6926 6924 6925 659 \r\n3 6929 6927 6928 660 \r\n3 6932 6930 6931 661 \r\n3 5671 5182 6933 662 \r\n3 6936 6934 6935 663 \r\n3 6938 6937 5620 664 \r\n3 6941 6939 6940 665 \r\n3 6573 6942 6943 666 \r\n3 6946 6944 6945 667 \r\n3 6949 6947 6948 668 \r\n3 5404 6950 6951 669 \r\n3 6954 6952 6953 670 \r\n3 6957 6955 6956 671 \r\n3 6960 6958 6959 672 \r\n3 6963 6961 6962 673 \r\n3 6965 5097 6964 674 \r\n3 6967 5554 6966 675 \r\n3 6970 6968 6969 676 \r\n3 6973 6971 6972 677 \r\n3 6975 6974 6724 678 \r\n3 6978 6976 6977 679 \r\n3 6981 6979 6980 680 \r\n3 6984 6982 6983 681 \r\n3 6516 6985 6986 682 \r\n3 6989 6987 6988 683 \r\n3 6992 6990 6991 684 \r\n3 6995 6993 6994 685 \r\n3 6998 6996 6997 686 \r\n3 7001 6999 7000 687 \r\n3 7004 7002 7003 688 \r\n3 7007 7005 7006 689 \r\n3 7010 7008 7009 690 \r\n3 7013 7011 7012 691 \r\n3 7016 7014 7015 692 \r\n3 7019 7017 7018 693 \r\n3 7022 7020 7021 694 \r\n3 5424 7023 7024 695 \r\n3 7027 7025 7026 696 \r\n3 7030 7028 7029 697 \r\n3 7033 7031 7032 698 \r\n3 7036 7034 7035 699 \r\n3 7039 7037 7038 700 \r\n3 7042 7040 7041 701 \r\n3 7045 7043 7044 702 \r\n3 7048 7046 7047 703 \r\n3 7051 7049 7050 704 \r\n3 7054 7052 7053 705 \r\n3 7057 7055 7056 706 \r\n3 7059 7058 6627 707 \r\n3 5025 7060 6646 708 \r\n3 7062 7061 5264 709 \r\n3 7065 7063 7064 710 \r\n3 7068 7066 7067 711 \r\n3 7071 7069 7070 712 \r\n3 7074 7072 7073 713 \r\n3 7077 7075 7076 714 \r\n3 7079 7078 5865 715 \r\n3 7081 6695 7080 716 \r\n3 7084 7082 7083 717 \r\n3 7087 7085 7086 718 \r\n3 7090 7088 7089 719 \r\n3 7093 7091 7092 720 \r\n3 7096 7094 7095 721 \r\n3 7098 6299 7097 722 \r\n3 7101 7099 7100 723 \r\n3 7104 7102 7103 724 \r\n3 7107 7105 7106 725 \r\n3 7110 7108 7109 726 \r\n3 7113 7111 7112 727 \r\n3 7116 7114 7115 728 \r\n3 7118 6933 7117 729 \r\n3 7121 7119 7120 730 \r\n3 7124 7122 7123 731 \r\n3 7127 7125 7126 732 \r\n3 7130 7128 7129 733 \r\n3 7133 7131 7132 734 \r\n3 7136 7134 7135 735 \r\n3 7139 7137 7138 736 \r\n3 7142 7140 7141 737 \r\n3 7145 7143 7144 738 \r\n3 7148 7146 7147 739 \r\n3 7151 7149 7150 740 \r\n3 7154 7152 7153 741 \r\n3 7157 7155 7156 742 \r\n3 7160 7158 7159 743 \r\n3 7163 7161 7162 744 \r\n3 7166 7164 7165 745 \r\n3 7169 7167 7168 746 \r\n3 7172 7170 7171 747 \r\n3 7175 7173 7174 748 \r\n3 7178 7176 7177 749 \r\n3 7181 7179 7180 750 \r\n3 7184 7182 7183 751 \r\n3 7187 7185 7186 752 \r\n3 7189 7188 6050 753 \r\n3 7192 7190 7191 754 \r\n3 7195 7193 7194 755 \r\n3 7198 7196 7197 756 \r\n3 7200 7199 6807 757 \r\n3 7203 7201 7202 758 \r\n3 7206 7204 7205 759 \r\n3 7209 7207 7208 760 \r\n3 7212 7210 7211 761 \r\n3 7215 7213 7214 762 \r\n3 5176 7216 7036 763 \r\n3 7219 7217 7218 764 \r\n3 7221 7220 6903 765 \r\n3 7223 7222 5523 766 \r\n3 7226 7224 7225 767 \r\n3 7229 7227 7228 768 \r\n3 7232 7230 7231 769 \r\n3 7234 7233 6117 770 \r\n3 7237 7235 7236 771 \r\n3 7240 7238 7239 772 \r\n3 7242 7062 7241 773 \r\n3 6941 6400 7243 774 \r\n3 7245 7244 5938 775 \r\n3 7248 7246 7247 776 \r\n3 7251 7249 7250 777 \r\n3 7254 7252 7253 778 \r\n3 6839 7255 7256 779 \r\n3 7259 7257 7258 780 \r\n3 7262 7260 7261 781 \r\n3 7264 7263 6947 782 \r\n3 7266 7265 6783 783 \r\n3 7269 7267 7268 784 \r\n3 7272 7270 7271 785 \r\n3 7275 7273 7274 786 \r\n3 7278 7276 7277 787 \r\n3 7281 7279 7280 788 \r\n3 7284 7282 7283 789 \r\n3 7286 7285 5595 790 \r\n3 7289 7287 7288 791 \r\n3 7292 7290 7291 792 \r\n3 7295 7293 7294 793 \r\n3 7297 7296 5378 794 \r\n3 7300 7298 7299 795 \r\n3 7303 7301 7302 796 \r\n3 7306 7304 7305 797 \r\n3 7309 7307 7308 798 \r\n3 7312 7310 7311 799 \r\n3 7315 7313 7314 800 \r\n3 7318 7316 7317 801 \r\n3 7321 7319 7320 802 \r\n3 7324 7322 7323 803 \r\n3 5910 7325 7326 804 \r\n3 7329 7327 7328 805 \r\n3 7332 7330 7331 806 \r\n3 6279 5355 7333 807 \r\n3 7293 7334 7335 808 \r\n3 7338 7336 7337 809 \r\n3 7341 7339 7340 810 \r\n3 7344 7342 7343 811 \r\n3 7347 7345 7346 812 \r\n3 7350 7348 7349 813 \r\n3 7353 7351 7352 814 \r\n3 7356 7354 7355 815 \r\n3 7359 7357 7358 816 \r\n3 7362 7360 7361 817 \r\n3 7365 7363 7364 818 \r\n3 7367 7366 7111 819 \r\n3 7370 7368 7369 820 \r\n3 7373 7371 7372 821 \r\n3 7376 7374 7375 822 \r\n3 7379 7377 7378 823 \r\n3 7381 7380 5656 824 \r\n3 7384 7382 7383 825 \r\n3 7387 7385 7386 826 \r\n3 7389 7388 6158 827 \r\n3 7391 6046 7390 828 \r\n3 7394 7392 7393 829 \r\n3 5035 7395 7396 830 \r\n3 7399 7397 7398 831 \r\n3 7402 7400 7401 832 \r\n3 7405 7403 7404 833 \r\n3 7408 7406 7407 834 \r\n3 7411 7409 7410 835 \r\n3 7414 7412 7413 836 \r\n3 7417 7415 7416 837 \r\n3 7420 7418 7419 838 \r\n3 7422 7421 6332 839 \r\n3 7425 7423 7424 840 \r\n3 7409 7426 7427 841 \r\n3 7430 7428 7429 842 \r\n3 7433 7431 7432 843 \r\n3 7436 7434 7435 844 \r\n3 7439 7437 7438 845 \r\n3 7442 7440 7441 846 \r\n3 7445 7443 7444 847 \r\n3 7448 7446 7447 848 \r\n3 7451 7449 7450 849 \r\n3 7454 7452 7453 850 \r\n3 7457 7455 7456 851 \r\n3 7460 7458 7459 852 \r\n3 7463 7461 7462 853 \r\n3 7466 7464 7465 854 \r\n3 7469 7467 7468 855 \r\n3 5735 7470 7471 856 \r\n3 7474 7472 7473 857 \r\n3 5085 7475 7476 858 \r\n3 7479 7477 7478 859 \r\n3 7482 7480 7481 860 \r\n3 5530 7483 7484 861 \r\n3 7487 7485 7486 862 \r\n3 7490 7488 7489 863 \r\n3 5721 7491 7492 864 \r\n3 7495 7493 7494 865 \r\n3 7498 7496 7497 866 \r\n3 7501 7499 7500 867 \r\n3 7504 7502 7503 868 \r\n3 7507 7505 7506 869 \r\n3 7510 7508 7509 870 \r\n3 7512 5257 7511 871 \r\n3 7515 7513 7514 872 \r\n3 7518 7516 7517 873 \r\n3 7521 7519 7520 874 \r\n3 7523 7522 5096 875 \r\n3 7526 7524 7525 876 \r\n3 7529 7527 7528 877 \r\n3 7532 7530 7531 878 \r\n3 7534 6034 7533 879 \r\n3 7537 7535 7536 880 \r\n3 6633 7538 7539 881 \r\n3 7542 7540 7541 882 \r\n3 7545 7543 7544 883 \r\n3 7548 7546 7547 884 \r\n3 7550 7549 5836 885 \r\n3 7553 7551 7552 886 \r\n3 7555 6442 7554 887 \r\n3 7558 7556 7557 888 \r\n3 7561 7559 7560 889 \r\n3 7563 7562 6286 890 \r\n3 7566 7564 7565 891 \r\n3 7569 7567 7568 892 \r\n3 7572 7570 7571 893 \r\n3 7575 7573 7574 894 \r\n3 7578 7576 7577 895 \r\n3 7581 7579 7580 896 \r\n3 7584 7582 7583 897 \r\n3 7462 7585 7586 898 \r\n3 7588 5846 7587 899 \r\n3 7419 7589 7590 900 \r\n3 7592 7591 7057 901 \r\n3 7595 7593 7594 902 \r\n3 7598 7596 7597 903 \r\n3 7601 7599 7600 904 \r\n3 7604 7602 7603 905 \r\n3 7607 7605 7606 906 \r\n3 7610 7608 7609 907 \r\n3 7613 7611 7612 908 \r\n3 7616 7614 7615 909 \r\n3 7618 7617 6314 910 \r\n3 7621 7619 7620 911 \r\n3 7622 5070 7041 912 \r\n3 7625 7623 7624 913 \r\n3 7628 7626 7627 914 \r\n3 7631 7629 7630 915 \r\n3 7633 5135 7632 916 \r\n3 7636 7634 7635 917 \r\n3 7639 7637 7638 918 \r\n3 7642 7640 7641 919 \r\n3 7645 7643 7644 920 \r\n3 7648 7646 7647 921 \r\n3 7651 7649 7650 922 \r\n3 7654 7652 7653 923 \r\n3 7657 7655 7656 924 \r\n3 7660 7658 7659 925 \r\n3 7663 7661 7662 926 \r\n3 6530 7664 7665 927 \r\n3 7668 7666 7667 928 \r\n3 7671 7669 7670 929 \r\n3 6890 7672 7673 930 \r\n3 7675 7674 7499 931 \r\n3 7678 7676 7677 932 \r\n3 7679 7235 6181 933 \r\n3 7682 7680 7681 934 \r\n3 7684 6163 7683 935 \r\n3 7687 7685 7686 936 \r\n3 7690 7688 7689 937 \r\n3 7693 7691 7692 938 \r\n3 7696 7694 7695 939 \r\n3 7699 7697 7698 940 \r\n3 7702 7700 7701 941 \r\n3 7705 7703 7704 942 \r\n3 7707 6071 7706 943 \r\n3 7710 7708 7709 944 \r\n3 5329 7711 7712 945 \r\n3 7715 7713 7714 946 \r\n3 7718 7716 7717 947 \r\n3 7721 7719 7720 948 \r\n3 7724 7722 7723 949 \r\n3 6322 7725 7726 950 \r\n3 7729 7727 7728 951 \r\n3 7732 7730 7731 952 \r\n3 7305 7733 7734 953 \r\n3 7737 7735 7736 954 \r\n3 7740 7738 7739 955 \r\n3 7743 7741 7742 956 \r\n3 7746 7744 7745 957 \r\n3 7749 7747 7748 958 \r\n3 7752 7750 7751 959 \r\n3 6878 7753 7754 960 \r\n3 7757 7755 7756 961 \r\n3 7760 7758 7759 962 \r\n3 7763 7761 7762 963 \r\n3 7766 7764 7765 964 \r\n3 7769 7767 7768 965 \r\n3 7772 7770 7771 966 \r\n3 5531 7773 7774 967 \r\n3 7777 7775 7776 968 \r\n3 7780 7778 7779 969 \r\n3 5179 6919 7781 970 \r\n3 7783 7782 7083 971 \r\n3 7786 7784 7785 972 \r\n3 7788 5246 7787 973 \r\n3 7791 7789 7790 974 \r\n3 7794 7792 7793 975 \r\n3 7797 7795 7796 976 \r\n3 7800 7798 7799 977 \r\n3 7803 7801 7802 978 \r\n3 7806 7804 7805 979 \r\n3 7808 7807 6984 980 \r\n3 7811 7809 7810 981 \r\n3 7813 7812 6676 982 \r\n3 7816 7814 7815 983 \r\n3 7819 7817 7818 984 \r\n3 7821 7820 5144 985 \r\n3 7160 5771 7822 986 \r\n3 7825 7823 7824 987 \r\n3 7827 7129 7826 988 \r\n3 7046 7828 7829 989 \r\n3 7832 7830 7831 990 \r\n3 7835 7833 7834 991 \r\n3 7837 7836 6847 992 \r\n3 7839 6702 7838 993 \r\n3 7841 7176 7840 994 \r\n3 7844 7842 7843 995 \r\n3 7847 7845 7846 996 \r\n3 7849 6210 7848 997 \r\n3 7852 7850 7851 998 \r\n3 7855 7853 7854 999 \r\n3 7858 7856 7857 1000 \r\n3 7861 7859 7860 1001 \r\n3 7864 7862 7863 1002 \r\n3 7867 7865 7866 1003 \r\n3 7870 7868 7869 1004 \r\n3 7873 7871 7872 1005 \r\n3 6639 7874 7875 1006 \r\n3 7878 7876 7877 1007 \r\n3 7881 7879 7880 1008 \r\n3 7883 7783 7882 1009 \r\n3 7885 7884 7067 1010 \r\n3 7888 7886 7887 1011 \r\n3 7891 7889 7890 1012 \r\n3 5819 7892 7893 1013 \r\n3 7896 7894 7895 1014 \r\n3 7899 7897 7898 1015 \r\n3 7902 7900 7901 1016 \r\n3 6188 7903 6445 1017 \r\n3 7906 7904 7905 1018 \r\n3 7909 7907 7908 1019 \r\n3 7912 7910 7911 1020 \r\n3 7915 7913 7914 1021 \r\n3 7918 7916 7917 1022 \r\n3 7921 7919 7920 1023 \r\n3 7923 7922 6375 1024 \r\n3 7926 7924 7925 1025 \r\n3 7929 7927 7928 1026 \r\n3 5518 7930 7931 1027 \r\n3 7934 7932 7933 1028 \r\n3 7937 7935 7936 1029 \r\n3 7940 7938 7939 1030 \r\n3 7943 7941 7942 1031 \r\n3 7946 7944 7945 1032 \r\n3 6151 7947 7948 1033 \r\n3 5606 7949 7950 1034 \r\n3 7953 7951 7952 1035 \r\n3 7956 7954 7955 1036 \r\n3 7959 7957 7958 1037 \r\n3 7961 7960 6759 1038 \r\n3 7964 7962 7963 1039 \r\n3 7967 7965 7966 1040 \r\n3 7970 7968 7969 1041 \r\n3 7972 7487 7971 1042 \r\n3 7975 7973 7974 1043 \r\n3 7977 5120 7976 1044 \r\n3 7980 7978 7979 1045 \r\n3 7983 7981 7982 1046 \r\n3 7986 7984 7985 1047 \r\n3 7989 7987 7988 1048 \r\n3 7992 7990 7991 1049 \r\n3 7995 7993 7994 1050 \r\n3 7997 6018 7996 1051 \r\n3 8000 7998 7999 1052 \r\n3 8003 8001 8002 1053 \r\n3 5669 8004 8005 1054 \r\n3 8008 8006 8007 1055 \r\n3 8011 8009 8010 1056 \r\n3 8014 8012 8013 1057 \r\n3 8016 8015 5787 1058 \r\n3 8019 8017 8018 1059 \r\n3 8022 8020 8021 1060 \r\n3 8025 8023 8024 1061 \r\n3 8027 8026 8014 1062 \r\n3 8030 8028 8029 1063 \r\n3 6139 8031 5986 1064 \r\n3 8034 8032 8033 1065 \r\n3 8037 8035 8036 1066 \r\n3 6419 8038 8039 1067 \r\n3 8041 6508 8040 1068 \r\n3 8044 8042 8043 1069 \r\n3 8047 8045 8046 1070 \r\n3 8048 6378 5681 1071 \r\n3 8051 8049 8050 1072 \r\n3 7517 8052 8053 1073 \r\n3 8055 8054 6169 1074 \r\n3 8058 8056 8057 1075 \r\n3 8060 5390 8059 1076 \r\n3 8063 8061 8062 1077 \r\n3 8066 8064 8065 1078 \r\n3 8068 8067 7599 1079 \r\n3 8071 8069 8070 1080 \r\n3 8074 8072 8073 1081 \r\n3 8077 8075 8076 1082 \r\n3 8080 8078 8079 1083 \r\n3 8083 8081 8082 1084 \r\n3 8086 8084 8085 1085 \r\n3 8089 8087 8088 1086 \r\n3 8092 8090 8091 1087 \r\n3 8095 8093 8094 1088 \r\n3 8098 8096 8097 1089 \r\n3 8101 8099 8100 1090 \r\n3 8104 8102 8103 1091 \r\n3 8107 8105 8106 1092 \r\n3 8110 8108 8109 1093 \r\n3 8112 8111 7102 1094 \r\n3 5740 8113 8114 1095 \r\n3 8117 8115 8116 1096 \r\n3 6116 8118 8119 1097 \r\n3 8122 8120 8121 1098 \r\n3 8125 8123 8124 1099 \r\n3 8128 8126 8127 1100 \r\n3 8130 8129 7299 1101 \r\n3 8132 8131 5500 1102 \r\n3 8134 6499 8133 1103 \r\n3 8137 8135 8136 1104 \r\n3 8140 8138 8139 1105 \r\n3 5156 8141 8142 1106 \r\n3 7718 8143 8144 1107 \r\n3 8147 8145 8146 1108 \r\n3 8150 8148 8149 1109 \r\n3 8153 8151 8152 1110 \r\n3 8156 8154 8155 1111 \r\n3 8159 8157 8158 1112 \r\n3 8161 8160 6583 1113 \r\n3 8164 8162 8163 1114 \r\n3 8166 8165 8029 1115 \r\n3 8169 8167 8168 1116 \r\n3 7238 8170 8171 1117 \r\n3 8174 8172 8173 1118 \r\n3 8177 8175 8176 1119 \r\n3 8179 7999 8178 1120 \r\n3 8182 8180 8181 1121 \r\n3 8185 8183 8184 1122 \r\n3 8187 6823 8186 1123 \r\n3 8190 8188 8189 1124 \r\n3 8193 8191 8192 1125 \r\n3 8196 8194 8195 1126 \r\n3 8198 8197 5445 1127 \r\n3 8200 8199 7696 1128 \r\n3 8203 8201 8202 1129 \r\n3 8206 8204 8205 1130 \r\n3 8208 8207 5727 1131 \r\n3 8211 8209 8210 1132 \r\n3 8213 5928 8212 1133 \r\n3 8216 8214 8215 1134 \r\n3 8218 8217 7187 1135 \r\n3 6895 8219 8220 1136 \r\n3 8223 8221 8222 1137 \r\n3 8226 8224 8225 1138 \r\n3 8229 8227 8228 1139 \r\n3 8231 7922 8230 1140 \r\n3 8234 8232 8233 1141 \r\n3 7893 8235 8236 1142 \r\n3 8239 8237 8238 1143 \r\n3 8241 6052 8240 1144 \r\n3 8244 8242 8243 1145 \r\n3 8247 8245 8246 1146 \r\n3 7711 8248 8249 1147 \r\n3 5851 8250 8251 1148 \r\n3 8254 8252 8253 1149 \r\n3 8257 8255 8256 1150 \r\n3 8260 8258 8259 1151 \r\n3 8263 8261 8262 1152 \r\n3 8266 8264 8265 1153 \r\n3 5151 8267 6739 1154 \r\n3 8269 7845 8268 1155 \r\n3 8272 8270 8271 1156 \r\n3 5730 8273 7610 1157 \r\n3 8275 7430 8274 1158 \r\n3 8278 8276 8277 1159 \r\n3 8281 8279 8280 1160 \r\n3 8284 8282 8283 1161 \r\n3 8287 8285 8286 1162 \r\n3 8289 8076 8288 1163 \r\n3 8291 7489 8290 1164 \r\n3 8293 7473 8292 1165 \r\n3 8296 8294 8295 1166 \r\n3 8298 5981 8297 1167 \r\n3 8300 6904 8299 1168 \r\n3 8303 8301 8302 1169 \r\n3 8306 8304 8305 1170 \r\n3 8309 8307 8308 1171 \r\n3 8311 8310 7805 1172 \r\n3 8313 7207 8312 1173 \r\n3 8315 8314 8158 1174 \r\n3 8318 8316 8317 1175 \r\n3 8321 8319 8320 1176 \r\n3 8324 8322 8323 1177 \r\n3 8327 8325 8326 1178 \r\n3 5838 8328 8329 1179 \r\n3 8332 8330 8331 1180 \r\n3 6572 8333 8334 1181 \r\n3 8337 8335 8336 1182 \r\n3 7163 8338 8339 1183 \r\n3 8342 8340 8341 1184 \r\n3 8345 8343 8344 1185 \r\n3 8347 6773 8346 1186 \r\n3 8350 8348 8349 1187 \r\n3 8353 8351 8352 1188 \r\n3 8356 8354 8355 1189 \r\n3 8359 8357 8358 1190 \r\n3 8362 8360 8361 1191 \r\n3 8365 8363 8364 1192 \r\n3 8367 8366 7728 1193 \r\n3 8370 8368 8369 1194 \r\n3 8373 8371 8372 1195 \r\n3 6086 5148 8374 1196 \r\n3 7786 8375 8376 1197 \r\n3 6334 5052 8377 1198 \r\n3 8380 8378 8379 1199 \r\n3 8383 8381 8382 1200 \r\n3 8386 8384 8385 1201 \r\n3 6319 8387 8388 1202 \r\n3 8390 6571 8389 1203 \r\n3 8393 8391 8392 1204 \r\n3 8396 8394 8395 1205 \r\n3 8398 8397 7915 1206 \r\n3 8401 8399 8400 1207 \r\n3 8404 8402 8403 1208 \r\n3 5762 8405 8406 1209 \r\n3 8409 8407 8408 1210 \r\n3 8412 8410 8411 1211 \r\n3 8415 8413 8414 1212 \r\n3 8418 8416 8417 1213 \r\n3 8421 8419 8420 1214 \r\n3 8424 8422 8423 1215 \r\n3 8427 8425 8426 1216 \r\n3 6640 8428 6774 1217 \r\n3 8431 8429 8430 1218 \r\n3 8434 8432 8433 1219 \r\n3 8436 8435 8285 1220 \r\n3 8438 8437 6638 1221 \r\n3 8440 8439 6811 1222 \r\n3 8443 8441 8442 1223 \r\n3 8292 8444 8445 1224 \r\n3 8448 8446 8447 1225 \r\n3 8451 8449 8450 1226 \r\n3 8454 8452 8453 1227 \r\n3 8457 8455 8456 1228 \r\n3 8460 8458 8459 1229 \r\n3 5885 8461 8462 1230 \r\n3 8465 8463 8464 1231 \r\n3 8468 8466 8467 1232 \r\n3 8471 8469 8470 1233 \r\n3 8474 8472 8473 1234 \r\n3 8477 8475 8476 1235 \r\n3 8480 8478 8479 1236 \r\n3 6968 8481 8482 1237 \r\n3 8485 8483 8484 1238 \r\n3 8488 8486 8487 1239 \r\n3 8491 8489 8490 1240 \r\n3 8493 5091 8492 1241 \r\n3 8496 8494 8495 1242 \r\n3 8499 8497 8498 1243 \r\n3 8501 8306 8500 1244 \r\n3 8504 8502 8503 1245 \r\n3 8507 8505 8506 1246 \r\n3 8510 8508 8509 1247 \r\n3 8513 8511 8512 1248 \r\n3 5892 8514 8515 1249 \r\n3 6190 8516 8517 1250 \r\n3 8520 8518 8519 1251 \r\n3 8523 8521 8522 1252 \r\n3 8526 8524 8525 1253 \r\n3 8529 8527 8528 1254 \r\n3 8532 8530 8531 1255 \r\n3 8535 8533 8534 1256 \r\n3 8538 8536 8537 1257 \r\n3 8540 7189 8539 1258 \r\n3 8543 8541 8542 1259 \r\n3 8546 8544 8545 1260 \r\n3 8549 8547 8548 1261 \r\n3 8520 8550 8551 1262 \r\n3 8554 8552 8553 1263 \r\n3 8557 8555 8556 1264 \r\n3 8559 5587 8558 1265 \r\n3 8562 8560 8561 1266 \r\n3 5153 8563 8564 1267 \r\n3 8566 8565 5815 1268 \r\n3 7079 6578 8567 1269 \r\n3 8570 8568 8569 1270 \r\n3 8572 8441 8571 1271 \r\n3 8574 8573 7608 1272 \r\n3 8577 8575 8576 1273 \r\n3 8580 8578 8579 1274 \r\n3 8583 8581 8582 1275 \r\n3 8586 8584 8585 1276 \r\n3 8589 8587 8588 1277 \r\n3 8592 8590 8591 1278 \r\n3 8595 8593 8594 1279 \r\n3 8598 8596 8597 1280 \r\n3 8601 8599 8600 1281 \r\n3 5911 8602 8603 1282 \r\n3 8606 8604 8605 1283 \r\n3 8608 8607 6000 1284 \r\n3 8611 8609 8610 1285 \r\n3 8614 8612 8613 1286 \r\n3 8617 8615 8616 1287 \r\n3 8619 8006 8618 1288 \r\n3 8622 8620 8621 1289 \r\n3 8625 8623 8624 1290 \r\n3 7870 8626 8627 1291 \r\n3 8630 8628 8629 1292 \r\n3 8633 8631 8632 1293 \r\n3 8636 8634 8635 1294 \r\n3 8639 8637 8638 1295 \r\n3 8642 8640 8641 1296 \r\n3 8645 8643 8644 1297 \r\n3 8648 8646 8647 1298 \r\n3 8650 8649 5318 1299 \r\n3 8653 8651 8652 1300 \r\n3 8655 8633 8654 1301 \r\n3 8658 8656 8657 1302 \r\n3 8660 8659 8060 1303 \r\n3 8663 8661 8662 1304 \r\n3 8665 8664 8434 1305 \r\n3 8668 8666 8667 1306 \r\n3 8671 8669 8670 1307 \r\n3 8674 8672 8673 1308 \r\n3 8677 8675 8676 1309 \r\n3 8680 8678 8679 1310 \r\n3 8682 6403 8681 1311 \r\n3 8685 8683 8684 1312 \r\n3 6955 8686 8687 1313 \r\n3 8690 8688 8689 1314 \r\n3 7018 8691 8692 1315 \r\n3 8695 8693 8694 1316 \r\n3 8698 8696 8697 1317 \r\n3 8700 8699 7406 1318 \r\n3 8703 8701 8702 1319 \r\n3 8674 8704 8705 1320 \r\n3 8706 5368 6362 1321 \r\n3 8709 8707 8708 1322 \r\n3 8711 7858 8710 1323 \r\n3 8714 8712 8713 1324 \r\n3 5113 8715 8716 1325 \r\n3 6764 8717 8718 1326 \r\n3 8720 7773 8719 1327 \r\n3 8723 8721 8722 1328 \r\n3 8725 8724 7352 1329 \r\n3 8728 8726 8727 1330 \r\n3 8729 8667 6978 1331 \r\n3 8732 8730 8731 1332 \r\n3 8735 8733 8734 1333 \r\n3 8738 8736 8737 1334 \r\n3 8741 8739 8740 1335 \r\n3 8743 6600 8742 1336 \r\n3 8746 8744 8745 1337 \r\n3 8748 7312 8747 1338 \r\n3 8751 8749 8750 1339 \r\n3 8754 8752 8753 1340 \r\n3 8757 8755 8756 1341 \r\n3 8760 8758 8759 1342 \r\n3 8763 8761 8762 1343 \r\n3 8765 5543 8764 1344 \r\n3 8768 8766 8767 1345 \r\n3 8770 6781 8769 1346 \r\n3 8773 8771 8772 1347 \r\n3 8776 8774 8775 1348 \r\n3 8779 8777 8778 1349 \r\n3 8782 8780 8781 1350 \r\n3 8785 8783 8784 1351 \r\n3 8788 8786 8787 1352 \r\n3 8791 8789 8790 1353 \r\n3 7033 8792 8781 1354 \r\n3 8795 8793 8794 1355 \r\n3 8798 8796 8797 1356 \r\n3 5119 8799 8800 1357 \r\n3 8801 7764 7609 1358 \r\n3 8803 8802 6113 1359 \r\n3 8806 8804 8805 1360 \r\n3 8807 7443 6770 1361 \r\n3 8810 8808 8809 1362 \r\n3 8813 8811 8812 1363 \r\n3 8816 8814 8815 1364 \r\n3 8819 8817 8818 1365 \r\n3 8822 8820 8821 1366 \r\n3 8824 8823 6725 1367 \r\n3 8827 8825 8826 1368 \r\n3 8830 8828 8829 1369 \r\n3 7745 8831 8832 1370 \r\n3 8835 8833 8834 1371 \r\n3 7744 8836 8837 1372 \r\n3 8840 8838 8839 1373 \r\n3 8843 8841 8842 1374 \r\n3 8846 8844 8845 1375 \r\n3 8849 8847 8848 1376 \r\n3 8852 8850 8851 1377 \r\n3 6075 5243 8775 1378 \r\n3 8853 5505 7204 1379 \r\n3 8855 8854 7953 1380 \r\n3 8857 8856 7941 1381 \r\n3 8860 8858 8859 1382 \r\n3 8862 6738 8861 1383 \r\n3 8865 8863 8864 1384 \r\n3 8866 5017 5343 1385 \r\n3 8868 7871 8867 1386 \r\n3 8871 8869 8870 1387 \r\n3 8873 8872 7935 1388 \r\n3 8875 8874 8140 1389 \r\n3 8878 8876 8877 1390 \r\n3 8881 8879 8880 1391 \r\n3 8884 8882 8883 1392 \r\n3 8887 8885 8886 1393 \r\n3 8889 8888 8337 1394 \r\n3 8892 8890 8891 1395 \r\n3 8893 5552 5088 1396 \r\n3 8896 8894 8895 1397 \r\n3 8899 8897 8898 1398 \r\n3 8901 8872 8900 1399 \r\n3 6308 8902 8903 1400 \r\n3 6013 8904 8905 1401 \r\n3 8908 8906 8907 1402 \r\n3 8910 8909 6910 1403 \r\n3 8913 8911 8912 1404 \r\n3 8915 8571 8914 1405 \r\n3 8918 8916 8917 1406 \r\n3 8921 8919 8920 1407 \r\n3 8924 8922 8923 1408 \r\n3 7197 8925 5325 1409 \r\n3 7549 8926 8829 1410 \r\n3 8929 8927 8928 1411 \r\n3 8932 8930 8931 1412 \r\n3 8935 8933 8934 1413 \r\n3 8938 8936 8937 1414 \r\n3 8941 8939 8940 1415 \r\n3 8107 8942 8943 1416 \r\n3 8946 8944 8945 1417 \r\n3 8949 8947 8948 1418 \r\n3 8951 6203 8950 1419 \r\n3 8464 8952 8013 1420 \r\n3 8955 8953 8954 1421 \r\n3 8958 8956 8957 1422 \r\n3 8960 7758 8959 1423 \r\n3 8963 8961 8962 1424 \r\n3 8966 8964 8965 1425 \r\n3 8969 8967 8968 1426 \r\n3 8971 7972 8970 1427 \r\n3 8974 8972 8973 1428 \r\n3 8977 8975 8976 1429 \r\n3 8980 8978 8979 1430 \r\n3 8982 5058 8981 1431 \r\n3 8511 8983 8984 1432 \r\n3 8207 8985 8986 1433 \r\n3 8988 8987 8391 1434 \r\n3 8991 8989 8990 1435 \r\n3 8993 8992 6792 1436 \r\n3 8996 8994 8995 1437 \r\n3 7750 8997 6271 1438 \r\n3 9000 8998 8999 1439 \r\n3 9002 9001 7633 1440 \r\n3 9005 9003 9004 1441 \r\n3 9007 9006 5519 1442 \r\n3 9010 9008 9009 1443 \r\n3 9013 9011 9012 1444 \r\n3 9016 9014 9015 1445 \r\n3 9018 9017 7113 1446 \r\n3 5474 9019 9020 1447 \r\n3 7266 9021 9022 1448 \r\n3 6191 9023 9024 1449 \r\n3 9026 8650 9025 1450 \r\n3 9029 9027 9028 1451 \r\n3 9032 9030 9031 1452 \r\n3 9035 9033 9034 1453 \r\n3 9038 9036 9037 1454 \r\n3 9041 9039 9040 1455 \r\n3 9044 9042 9043 1456 \r\n3 9046 7260 9045 1457 \r\n3 9049 9047 9048 1458 \r\n3 7493 7989 9050 1459 \r\n3 9052 5499 9051 1460 \r\n3 9055 9053 9054 1461 \r\n3 9057 6525 9056 1462 \r\n3 9058 6147 8352 1463 \r\n3 5075 9059 9060 1464 \r\n3 7264 9061 9062 1465 \r\n3 9065 9063 9064 1466 \r\n3 9068 9066 9067 1467 \r\n3 9071 9069 9070 1468 \r\n3 9074 9072 9073 1469 \r\n3 9077 9075 9076 1470 \r\n3 9080 9078 9079 1471 \r\n3 5583 9081 9082 1472 \r\n3 9085 9083 9084 1473 \r\n3 8002 9086 9087 1474 \r\n3 9039 9088 9089 1475 \r\n3 9092 9090 9091 1476 \r\n3 9095 9093 9094 1477 \r\n3 9098 9096 9097 1478 \r\n3 9101 9099 9100 1479 \r\n3 9104 9102 9103 1480 \r\n3 9106 8105 9105 1481 \r\n3 9109 9107 9108 1482 \r\n3 9112 9110 9111 1483 \r\n3 9115 9113 9114 1484 \r\n3 9118 9116 9117 1485 \r\n3 7064 5068 9119 1486 \r\n3 9122 9120 9121 1487 \r\n3 9125 9123 9124 1488 \r\n3 9127 6733 9126 1489 \r\n3 9130 9128 9129 1490 \r\n3 9132 8704 9131 1491 \r\n3 9134 9133 6249 1492 \r\n3 9137 9135 9136 1493 \r\n3 9140 9138 9139 1494 \r\n3 7227 6359 9141 1495 \r\n3 9143 7342 9142 1496 \r\n3 9146 9144 9145 1497 \r\n3 6994 9147 9148 1498 \r\n3 9150 8247 9149 1499 \r\n3 9152 9151 8546 1500 \r\n3 9155 9153 9154 1501 \r\n3 7823 9156 9157 1502 \r\n3 9160 9158 9159 1503 \r\n3 9163 9161 9162 1504 \r\n3 9166 9164 9165 1505 \r\n3 9169 9167 9168 1506 \r\n3 9172 9170 9171 1507 \r\n3 8767 9173 9174 1508 \r\n3 9176 6834 9175 1509 \r\n3 9179 9177 9178 1510 \r\n3 9181 9180 8612 1511 \r\n3 9183 9088 9182 1512 \r\n3 9186 9184 9185 1513 \r\n3 9188 5370 9187 1514 \r\n3 9191 9189 9190 1515 \r\n3 8373 9192 9193 1516 \r\n3 9195 7515 9194 1517 \r\n3 9197 6479 9196 1518 \r\n3 9165 5232 9198 1519 \r\n3 9201 9199 9200 1520 \r\n3 9204 9202 9203 1521 \r\n3 9207 9205 9206 1522 \r\n3 9210 9208 9209 1523 \r\n3 9212 6224 9211 1524 \r\n3 9215 9213 9214 1525 \r\n3 7401 9216 9217 1526 \r\n3 9220 9218 9219 1527 \r\n3 6967 9221 9222 1528 \r\n3 9224 5157 9223 1529 \r\n3 9226 9225 5066 1530 \r\n3 8267 9227 9228 1531 \r\n3 9231 9229 9230 1532 \r\n3 8563 7125 6999 1533 \r\n3 9232 7975 5036 1534 \r\n3 9234 9233 6077 1535 \r\n3 9237 9235 9236 1536 \r\n3 9240 9238 9239 1537 \r\n3 9242 9241 7229 1538 \r\n3 9245 9243 9244 1539 \r\n3 9248 9246 9247 1540 \r\n3 9249 7905 8278 1541 \r\n3 9252 9250 9251 1542 \r\n3 9255 9253 9254 1543 \r\n3 5393 9256 9257 1544 \r\n3 7513 9005 9235 1545 \r\n3 9260 9258 9259 1546 \r\n3 8015 9261 9262 1547 \r\n3 9264 9263 8379 1548 \r\n3 7622 7387 9265 1549 \r\n3 9267 9266 7361 1550 \r\n3 9270 9268 9269 1551 \r\n3 7890 9271 9272 1552 \r\n3 9275 9273 9274 1553 \r\n3 9278 9276 9277 1554 \r\n3 9280 7537 9279 1555 \r\n3 9282 9281 7826 1556 \r\n3 9285 9283 9284 1557 \r\n3 5588 6200 9286 1558 \r\n3 7390 9287 9288 1559 \r\n3 6801 9289 9290 1560 \r\n3 9293 9291 9292 1561 \r\n3 7650 9294 9295 1562 \r\n3 9298 9296 9297 1563 \r\n3 9301 9299 9300 1564 \r\n3 9304 9302 9303 1565 \r\n3 9307 9305 9306 1566 \r\n3 9309 9308 6346 1567 \r\n3 9312 9310 9311 1568 \r\n3 9315 9313 9314 1569 \r\n3 9318 9316 9317 1570 \r\n3 9321 9319 9320 1571 \r\n3 9324 9322 9323 1572 \r\n3 9327 9325 9326 1573 \r\n3 9328 8237 8024 1574 \r\n3 9331 9329 9330 1575 \r\n3 8026 7004 9332 1576 \r\n3 9335 9333 9334 1577 \r\n3 9337 9202 9336 1578 \r\n3 9340 9338 9339 1579 \r\n3 9343 9341 9342 1580 \r\n3 9346 9344 9345 1581 \r\n3 9349 9347 9348 1582 \r\n3 9352 9350 9351 1583 \r\n3 9355 9353 9354 1584 \r\n3 9358 9356 9357 1585 \r\n3 9361 9359 9360 1586 \r\n3 8749 9362 9363 1587 \r\n3 9366 9364 9365 1588 \r\n3 9369 9367 9368 1589 \r\n3 9372 9370 9371 1590 \r\n3 9373 8809 5436 1591 \r\n3 9376 9374 9375 1592 \r\n3 9379 9377 9378 1593 \r\n3 9382 9380 9381 1594 \r\n3 9385 9383 9384 1595 \r\n3 9388 9386 9387 1596 \r\n3 9391 9389 9390 1597 \r\n3 9394 9392 9393 1598 \r\n3 9397 9395 9396 1599 \r\n3 9400 9398 9399 1600 \r\n3 9402 9401 6746 1601 \r\n3 9405 9403 9404 1602 \r\n3 9408 9406 9407 1603 \r\n3 9411 9409 9410 1604 \r\n3 6064 9412 9413 1605 \r\n3 9415 6333 9414 1606 \r\n3 9418 9416 9417 1607 \r\n3 9421 9419 9420 1608 \r\n3 9423 9422 8296 1609 \r\n3 9425 9424 6723 1610 \r\n3 9428 9426 9427 1611 \r\n3 9431 9429 9430 1612 \r\n3 9434 9432 9433 1613 \r\n3 9437 9435 9436 1614 \r\n3 7416 9438 9439 1615 \r\n3 9442 9440 9441 1616 \r\n3 9445 9443 9444 1617 \r\n3 9448 9446 9447 1618 \r\n3 9450 9449 7647 1619 \r\n3 9453 9451 9452 1620 \r\n3 6260 9454 9455 1621 \r\n3 9458 9456 9457 1622 \r\n3 9461 9459 9460 1623 \r\n3 9463 9462 7424 1624 \r\n3 9465 9464 9130 1625 \r\n3 9468 9466 9467 1626 \r\n3 6199 5398 9469 1627 \r\n3 9472 9470 9471 1628 \r\n3 9475 9473 9474 1629 \r\n3 9478 9476 9477 1630 \r\n3 9480 9479 7316 1631 \r\n3 9482 5006 9481 1632 \r\n3 9484 6993 9483 1633 \r\n3 9487 9485 9486 1634 \r\n3 9490 9488 9489 1635 \r\n3 9492 9491 7914 1636 \r\n3 9494 8251 9493 1637 \r\n3 9497 9495 9496 1638 \r\n3 8969 9498 9499 1639 \r\n3 9502 9500 9501 1640 \r\n3 9505 9503 9504 1641 \r\n3 9507 9506 9171 1642 \r\n3 9510 9508 9509 1643 \r\n3 9513 9511 9512 1644 \r\n3 9516 9514 9515 1645 \r\n3 9518 9517 5657 1646 \r\n3 8628 9519 9520 1647 \r\n3 9522 9521 6486 1648 \r\n3 9524 9523 8940 1649 \r\n3 9527 9525 9526 1650 \r\n3 9530 9528 9529 1651 \r\n3 9532 9121 9531 1652 \r\n3 9535 9533 9534 1653 \r\n3 9537 9536 8089 1654 \r\n3 9540 9538 9539 1655 \r\n3 9542 9541 8359 1656 \r\n3 9545 9543 9544 1657 \r\n3 9548 9546 9547 1658 \r\n3 5333 9549 9550 1659 \r\n3 8999 9551 9552 1660 \r\n3 5131 9553 9554 1661 \r\n3 9557 9555 9556 1662 \r\n3 9559 9558 6370 1663 \r\n3 9562 9560 9561 1664 \r\n3 9564 9563 7271 1665 \r\n3 9567 9565 9566 1666 \r\n3 9570 9568 9569 1667 \r\n3 9573 9571 9572 1668 \r\n3 9576 9574 9575 1669 \r\n3 9579 9577 9578 1670 \r\n3 7732 9580 9581 1671 \r\n3 9584 9582 9583 1672 \r\n3 9586 9585 7461 1673 \r\n3 5968 9587 9239 1674 \r\n3 9589 6484 9588 1675 \r\n3 9592 9590 9591 1676 \r\n3 9595 9593 9594 1677 \r\n3 9597 5345 9596 1678 \r\n3 9600 9598 9599 1679 \r\n3 9602 6744 9601 1680 \r\n3 9604 6667 9603 1681 \r\n3 9316 9605 9606 1682 \r\n3 9609 9607 9608 1683 \r\n3 9611 9610 9467 1684 \r\n3 9614 9612 9613 1685 \r\n3 9617 9615 9616 1686 \r\n3 9619 9618 6871 1687 \r\n3 9622 9620 9621 1688 \r\n3 9625 9623 9624 1689 \r\n3 9628 9626 9627 1690 \r\n3 9631 9629 9630 1691 \r\n3 9633 7058 9632 1692 \r\n3 9635 9634 6798 1693 \r\n3 6768 9636 7051 1694 \r\n3 9639 9637 9638 1695 \r\n3 9642 9640 9641 1696 \r\n3 9645 9643 9644 1697 \r\n3 9648 9646 9647 1698 \r\n3 9650 9649 9053 1699 \r\n3 9652 9651 7667 1700 \r\n3 9654 9653 7623 1701 \r\n3 9657 9655 9656 1702 \r\n3 6096 9658 9659 1703 \r\n3 9661 9660 7855 1704 \r\n3 9663 8299 9662 1705 \r\n3 9665 9664 6129 1706 \r\n3 9668 9666 9667 1707 \r\n3 9671 9669 9670 1708 \r\n3 9673 9672 5490 1709 \r\n3 8053 9674 9675 1710 \r\n3 9185 9676 9677 1711 \r\n3 9680 9678 9679 1712 \r\n3 8694 9681 9682 1713 \r\n3 9684 9601 9683 1714 \r\n3 9687 9685 9686 1715 \r\n3 5261 9688 9689 1716 \r\n3 5757 9690 9691 1717 \r\n3 9369 9692 9693 1718 \r\n3 9696 9694 9695 1719 \r\n3 9699 9697 9698 1720 \r\n3 9702 9700 9701 1721 \r\n3 9705 9703 9704 1722 \r\n3 9707 9046 9706 1723 \r\n3 9710 9708 9709 1724 \r\n3 9713 9711 9712 1725 \r\n3 9716 9714 9715 1726 \r\n3 9718 9717 6326 1727 \r\n3 9721 9719 9720 1728 \r\n3 5821 9722 9723 1729 \r\n3 9726 9724 9725 1730 \r\n3 6814 9727 9728 1731 \r\n3 9731 9729 9730 1732 \r\n3 9734 9732 9733 1733 \r\n3 9737 9735 9736 1734 \r\n3 9740 9738 9739 1735 \r\n3 7998 9741 9742 1736 \r\n3 9743 6373 9612 1737 \r\n3 9745 5342 9744 1738 \r\n3 9748 9746 9747 1739 \r\n3 9751 9749 9750 1740 \r\n3 9753 8380 9752 1741 \r\n3 9692 9754 5440 1742 \r\n3 6269 9755 9756 1743 \r\n3 9759 9757 9758 1744 \r\n3 9762 9760 9761 1745 \r\n3 9765 9763 9764 1746 \r\n3 7631 9766 9767 1747 \r\n3 9770 9768 9769 1748 \r\n3 9771 5005 7226 1749 \r\n3 9774 9772 9773 1750 \r\n3 9777 9775 9776 1751 \r\n3 9779 7494 9778 1752 \r\n3 9782 9780 9781 1753 \r\n3 9784 9783 7081 1754 \r\n3 9787 9785 9786 1755 \r\n3 9789 6428 9788 1756 \r\n3 9792 9790 9791 1757 \r\n3 8052 9793 9794 1758 \r\n3 9797 9795 9796 1759 \r\n3 6206 9798 9799 1760 \r\n3 9802 9800 9801 1761 \r\n3 9804 9138 9803 1762 \r\n3 9807 9805 9806 1763 \r\n3 9809 9808 7811 1764 \r\n3 9812 9810 9811 1765 \r\n3 9813 9595 7888 1766 \r\n3 5880 9814 9815 1767 \r\n3 9818 9816 9817 1768 \r\n3 9820 9819 9134 1769 \r\n3 9784 8044 9821 1770 \r\n3 9824 9822 9823 1771 \r\n3 9827 9825 9826 1772 \r\n3 9830 9828 9829 1773 \r\n3 8807 9831 6560 1774 \r\n3 9834 9832 9833 1775 \r\n3 9836 9835 8408 1776 \r\n3 7001 9837 6349 1777 \r\n3 9840 9838 9839 1778 \r\n3 9842 8904 9841 1779 \r\n3 9845 9843 9844 1780 \r\n3 9847 8320 9846 1781 \r\n3 9850 9848 9849 1782 \r\n3 9853 9851 9852 1783 \r\n3 9855 7373 9854 1784 \r\n3 9858 9856 9857 1785 \r\n3 9861 9859 9860 1786 \r\n3 9863 9862 7784 1787 \r\n3 9865 9864 7629 1788 \r\n3 9868 9866 9867 1789 \r\n3 9870 5271 9869 1790 \r\n3 9871 9636 6659 1791 \r\n3 9874 9872 9873 1792 \r\n3 9876 9875 9488 1793 \r\n3 9879 9877 9878 1794 \r\n3 6559 9156 9880 1795 \r\n3 9883 9881 9882 1796 \r\n3 9886 9884 9885 1797 \r\n3 9888 7236 9887 1798 \r\n3 9890 6225 9889 1799 \r\n3 9893 9891 9892 1800 \r\n3 9896 9894 9895 1801 \r\n3 9899 9897 9898 1802 \r\n3 9902 9900 9901 1803 \r\n3 9904 6390 9903 1804 \r\n3 9907 9905 9906 1805 \r\n3 9910 9908 9909 1806 \r\n3 8629 9911 9912 1807 \r\n3 9915 9913 9914 1808 \r\n3 9917 9916 8290 1809 \r\n3 9920 9918 9919 1810 \r\n3 9923 9921 9922 1811 \r\n3 9926 9924 9925 1812 \r\n3 9929 9927 9928 1813 \r\n3 9932 9930 9931 1814 \r\n3 9934 9933 8304 1815 \r\n3 7983 9935 5285 1816 \r\n3 9938 9936 9937 1817 \r\n3 9940 7700 9939 1818 \r\n3 8686 9941 9942 1819 \r\n3 5146 9943 8462 1820 \r\n3 9945 9944 9539 1821 \r\n3 9947 8388 9946 1822 \r\n3 7071 9948 9949 1823 \r\n3 9952 9950 9951 1824 \r\n3 9955 9953 9954 1825 \r\n3 9958 9956 9957 1826 \r\n3 9961 9959 9960 1827 \r\n3 7876 9962 9963 1828 \r\n3 9965 6237 9964 1829 \r\n3 9968 9966 9967 1830 \r\n3 9971 9969 9970 1831 \r\n3 5071 6412 9972 1832 \r\n3 9974 9973 8972 1833 \r\n3 6090 9975 9976 1834 \r\n3 9217 9977 9978 1835 \r\n3 9981 9979 9980 1836 \r\n3 9983 9982 9667 1837 \r\n3 9986 9984 9985 1838 \r\n3 9989 9987 9988 1839 \r\n3 9992 9990 9991 1840 \r\n3 9994 5904 9993 1841 \r\n3 8270 9995 9996 1842 \r\n3 5400 9145 6794 1843 \r\n3 9999 9997 9998 1844 \r\n3 10001 9158 10000 1845 \r\n3 10004 10002 10003 1846 \r\n3 10007 10005 10006 1847 \r\n3 10010 10008 10009 1848 \r\n3 8149 10011 10012 1849 \r\n3 10014 5249 10013 1850 \r\n3 6948 10015 10016 1851 \r\n3 10019 10017 10018 1852 \r\n3 10022 10020 10021 1853 \r\n3 10025 10023 10024 1854 \r\n3 10028 10026 10027 1855 \r\n3 10031 10029 10030 1856 \r\n3 10034 10032 10033 1857 \r\n3 10036 9332 10035 1858 \r\n3 10038 10037 5509 1859 \r\n3 10040 5608 10039 1860 \r\n3 10043 10041 10042 1861 \r\n3 10046 10044 10045 1862 \r\n3 10048 10047 5434 1863 \r\n3 10050 10049 9665 1864 \r\n3 10052 8924 10051 1865 \r\n3 10055 10053 10054 1866 \r\n3 10058 10056 10057 1867 \r\n3 5644 10059 9849 1868 \r\n3 10062 10060 10061 1869 \r\n3 10065 10063 10064 1870 \r\n3 10068 10066 10067 1871 \r\n3 10071 10069 10070 1872 \r\n3 10074 10072 10073 1873 \r\n3 10077 10075 10076 1874 \r\n3 5666 10078 10079 1875 \r\n3 10082 10080 10081 1876 \r\n3 10085 10083 10084 1877 \r\n3 10087 10086 6389 1878 \r\n3 10090 10088 10089 1879 \r\n3 10093 10091 10092 1880 \r\n3 10096 10094 10095 1881 \r\n3 10099 10097 10098 1882 \r\n3 10102 10100 10101 1883 \r\n3 10105 10103 10104 1884 \r\n3 10108 10106 10107 1885 \r\n3 10111 10109 10110 1886 \r\n3 10114 10112 10113 1887 \r\n3 10116 10115 5195 1888 \r\n3 10119 10117 10118 1889 \r\n3 10122 10120 10121 1890 \r\n3 10124 10123 8293 1891 \r\n3 10127 10125 10126 1892 \r\n3 10130 10128 10129 1893 \r\n3 10133 10131 10132 1894 \r\n3 10136 10134 10135 1895 \r\n3 10138 6574 10137 1896 \r\n3 10141 10139 10140 1897 \r\n3 10143 10142 6020 1898 \r\n3 10146 10144 10145 1899 \r\n3 9271 10147 10148 1900 \r\n3 10150 10149 8036 1901 \r\n3 9783 10151 10152 1902 \r\n3 10155 10153 10154 1903 \r\n3 10157 10156 9311 1904 \r\n3 5121 10158 10159 1905 \r\n3 7684 10160 10161 1906 \r\n3 10164 10162 10163 1907 \r\n3 10167 10165 10166 1908 \r\n3 9976 10168 10169 1909 \r\n3 5797 6434 10170 1910 \r\n3 10173 10171 10172 1911 \r\n3 8662 10174 10175 1912 \r\n3 10178 10176 10177 1913 \r\n3 10181 10179 10180 1914 \r\n3 10183 8917 10182 1915 \r\n3 10184 10034 6300 1916 \r\n3 8547 10185 10186 1917 \r\n3 6518 10187 10188 1918 \r\n3 10190 10189 10156 1919 \r\n3 10193 10191 10192 1920 \r\n3 10196 10194 10195 1921 \r\n3 10199 10197 10198 1922 \r\n3 8826 10200 10201 1923 \r\n3 10204 10202 10203 1924 \r\n3 10206 7566 10205 1925 \r\n3 10209 10207 10208 1926 \r\n3 10212 10210 10211 1927 \r\n3 10214 7618 10213 1928 \r\n3 7785 10215 10216 1929 \r\n3 9768 10217 10218 1930 \r\n3 6154 7548 10219 1931 \r\n3 10221 10220 8110 1932 \r\n3 7793 10222 10223 1933 \r\n3 10226 10224 10225 1934 \r\n3 10228 8765 10227 1935 \r\n3 10230 8111 10229 1936 \r\n3 10233 10231 10232 1937 \r\n3 10236 10234 10235 1938 \r\n3 10239 10237 10238 1939 \r\n3 10242 10240 10241 1940 \r\n3 10245 10243 10244 1941 \r\n3 10247 7345 10246 1942 \r\n3 7175 10248 10249 1943 \r\n3 10137 10250 10251 1944 \r\n3 10254 10252 10253 1945 \r\n3 10257 10255 10256 1946 \r\n3 10259 10258 6277 1947 \r\n3 10262 10260 10261 1948 \r\n3 10265 10263 10264 1949 \r\n3 10268 10266 10267 1950 \r\n3 10271 10269 10270 1951 \r\n3 10274 10272 10273 1952 \r\n3 10277 10275 10276 1953 \r\n3 10278 5798 7302 1954 \r\n3 10281 10279 10280 1955 \r\n3 10284 10282 10283 1956 \r\n3 10287 10285 10286 1957 \r\n3 10289 7156 10288 1958 \r\n3 5114 10290 10291 1959 \r\n3 10294 10292 10293 1960 \r\n3 5653 10295 10296 1961 \r\n3 5909 10297 9760 1962 \r\n3 10300 10298 10299 1963 \r\n3 10303 10301 10302 1964 \r\n3 8949 10304 10305 1965 \r\n3 10307 6983 10306 1966 \r\n3 10309 10308 6219 1967 \r\n3 5286 10310 10311 1968 \r\n3 10313 5206 10312 1969 \r\n3 10316 10314 10315 1970 \r\n3 10318 9412 10317 1971 \r\n3 10321 10319 10320 1972 \r\n3 10324 10322 10323 1973 \r\n3 10327 10325 10326 1974 \r\n3 10330 10328 10329 1975 \r\n3 10331 6977 6130 1976 \r\n3 10334 10332 10333 1977 \r\n3 9186 10335 10336 1978 \r\n3 10339 10337 10338 1979 \r\n3 10341 10340 9192 1980 \r\n3 10344 10342 10343 1981 \r\n3 10101 10345 5299 1982 \r\n3 10348 10346 10347 1983 \r\n3 7463 9248 10349 1984 \r\n3 10352 10350 10351 1985 \r\n3 10355 10353 10354 1986 \r\n3 10358 10356 10357 1987 \r\n3 10361 10359 10360 1988 \r\n3 10364 10362 10363 1989 \r\n3 10262 10365 10366 1990 \r\n3 10369 10367 10368 1991 \r\n3 7769 10370 10371 1992 \r\n3 10373 10372 7971 1993 \r\n3 10375 10374 7681 1994 \r\n3 10378 10376 10377 1995 \r\n3 10381 10379 10380 1996 \r\n3 10384 10382 10383 1997 \r\n3 9286 7910 10385 1998 \r\n3 10387 10386 9506 1999 \r\n3 10390 10388 10389 2000 \r\n3 10392 5513 10391 2001 \r\n3 10395 10393 10394 2002 \r\n3 10397 9476 10396 2003 \r\n3 10400 10398 10399 2004 \r\n3 10403 10401 10402 2005 \r\n3 10406 10404 10405 2006 \r\n3 10409 10407 10408 2007 \r\n3 10412 10410 10411 2008 \r\n3 7222 6952 6337 2009 \r\n3 10415 10413 10414 2010 \r\n3 10418 10416 10417 2011 \r\n3 6844 10419 10420 2012 \r\n3 10423 10421 10422 2013 \r\n3 10117 10424 7658 2014 \r\n3 10427 10425 10426 2015 \r\n3 10429 10428 6171 2016 \r\n3 6607 8178 10430 2017 \r\n3 10433 10431 10432 2018 \r\n3 10436 10434 10435 2019 \r\n3 10439 10437 10438 2020 \r\n3 10442 10440 10441 2021 \r\n3 10445 10443 10444 2022 \r\n3 5975 10446 10447 2023 \r\n3 10449 9917 10448 2024 \r\n3 10452 10450 10451 2025 \r\n3 10455 10453 10454 2026 \r\n3 10458 10456 10457 2027 \r\n3 7536 10269 10459 2028 \r\n3 5512 10460 10461 2029 \r\n3 10464 10462 10463 2030 \r\n3 10465 8342 6160 2031 \r\n3 10467 10466 9504 2032 \r\n3 10470 10468 10469 2033 \r\n3 10473 10471 10472 2034 \r\n3 10476 10474 10475 2035 \r\n3 10479 10477 10478 2036 \r\n3 10482 10480 10481 2037 \r\n3 10485 10483 10484 2038 \r\n3 10488 10486 10487 2039 \r\n3 8976 10489 10490 2040 \r\n3 10493 10491 10492 2041 \r\n3 10496 10494 10495 2042 \r\n3 10499 10497 10498 2043 \r\n3 10501 10500 10123 2044 \r\n3 10504 10502 10503 2045 \r\n3 10507 10505 10506 2046 \r\n3 10510 10508 10509 2047 \r\n3 10512 6426 10511 2048 \r\n3 10515 10513 10514 2049 \r\n3 10517 9305 10516 2050 \r\n3 10520 10518 10519 2051 \r\n3 10523 10521 10522 2052 \r\n3 10526 10524 10525 2053 \r\n3 10529 10527 10528 2054 \r\n3 10531 9468 10530 2055 \r\n3 10320 10532 10533 2056 \r\n3 9216 10534 10535 2057 \r\n3 10538 10536 10537 2058 \r\n3 10541 10539 10540 2059 \r\n3 10543 6769 10542 2060 \r\n3 10545 10544 8479 2061 \r\n3 10547 6998 10546 2062 \r\n3 10550 10548 10549 2063 \r\n3 10552 10551 5107 2064 \r\n3 10554 10553 7959 2065 \r\n3 10557 10555 10556 2066 \r\n3 10559 10558 6766 2067 \r\n3 10562 10560 10561 2068 \r\n3 10565 10563 10564 2069 \r\n3 10568 10566 10567 2070 \r\n3 9083 10569 10570 2071 \r\n3 10572 5288 10571 2072 \r\n3 10575 10573 10574 2073 \r\n3 10578 10576 10577 2074 \r\n3 10581 10579 10580 2075 \r\n3 10584 10582 10583 2076 \r\n3 10126 10585 9969 2077 \r\n3 10588 10586 10587 2078 \r\n3 10591 10589 10590 2079 \r\n3 10594 10592 10593 2080 \r\n3 10597 10595 10596 2081 \r\n3 5898 10598 7471 2082 \r\n3 10600 9498 10599 2083 \r\n3 10603 10601 10602 2084 \r\n3 10606 10604 10605 2085 \r\n3 10609 10607 10608 2086 \r\n3 10612 10610 10611 2087 \r\n3 10614 7824 10613 2088 \r\n3 10616 10615 5268 2089 \r\n3 10619 10617 10618 2090 \r\n3 9532 10620 10621 2091 \r\n3 10624 10622 10623 2092 \r\n3 10627 10625 10626 2093 \r\n3 10630 10628 10629 2094 \r\n3 10633 10631 10632 2095 \r\n3 10635 9344 10634 2096 \r\n3 10638 10636 10637 2097 \r\n3 10641 10639 10640 2098 \r\n3 10419 10642 10643 2099 \r\n3 10646 10644 10645 2100 \r\n3 10648 10647 10472 2101 \r\n3 10650 6959 10649 2102 \r\n3 10653 10651 10652 2103 \r\n3 10656 10654 10655 2104 \r\n3 6405 6072 10657 2105 \r\n3 10659 10658 5470 2106 \r\n3 10662 10660 10661 2107 \r\n3 10665 10663 10664 2108 \r\n3 10668 10666 10667 2109 \r\n3 10671 10669 10670 2110 \r\n3 10673 10672 10631 2111 \r\n3 10676 10674 10675 2112 \r\n3 6712 10677 10678 2113 \r\n3 8706 9749 8231 2114 \r\n3 6618 10679 10680 2115 \r\n3 10683 10681 10682 2116 \r\n3 6831 8964 10684 2117 \r\n3 10687 10685 10686 2118 \r\n3 10690 10688 10689 2119 \r\n3 10692 10691 9548 2120 \r\n3 8837 6654 10693 2121 \r\n3 10696 10694 10695 2122 \r\n3 10699 10697 10698 2123 \r\n3 10702 10700 10701 2124 \r\n3 9953 10703 10704 2125 \r\n3 10706 10705 5334 2126 \r\n3 10708 10707 5374 2127 \r\n3 8995 10709 6091 2128 \r\n3 10711 8926 10710 2129 \r\n3 10714 10712 10713 2130 \r\n3 10717 10715 10716 2131 \r\n3 10720 10718 10719 2132 \r\n3 10723 10721 10722 2133 \r\n3 10726 10724 10725 2134 \r\n3 10729 10727 10728 2135 \r\n3 7813 10730 10731 2136 \r\n3 10734 10732 10733 2137 \r\n3 10433 10735 9173 2138 \r\n3 10737 10736 6273 2139 \r\n3 10739 10738 8678 2140 \r\n3 10742 10740 10741 2141 \r\n3 10744 9968 10743 2142 \r\n3 10747 10745 10746 2143 \r\n3 8508 5597 10748 2144 \r\n3 10750 10749 8903 2145 \r\n3 8874 10751 9474 2146 \r\n3 10754 10752 10753 2147 \r\n3 10756 10755 5449 2148 \r\n3 10759 10757 10758 2149 \r\n3 10762 10760 10761 2150 \r\n3 10765 10763 10764 2151 \r\n3 10768 10766 10767 2152 \r\n3 10769 6753 5897 2153 \r\n3 9700 10770 10771 2154 \r\n3 6437 10772 10773 2155 \r\n3 10775 10756 10774 2156 \r\n3 10778 10776 10777 2157 \r\n3 5439 10779 10780 2158 \r\n3 10783 10781 10782 2159 \r\n3 10785 7185 10784 2160 \r\n3 10788 10786 10787 2161 \r\n3 10791 10789 10790 2162 \r\n3 10793 10792 9858 2163 \r\n3 10796 10794 10795 2164 \r\n3 10799 10797 10798 2165 \r\n3 10801 7069 10800 2166 \r\n3 10802 8800 5863 2167 \r\n3 10805 10803 10804 2168 \r\n3 10808 10806 10807 2169 \r\n3 10811 10809 10810 2170 \r\n3 10814 10812 10813 2171 \r\n3 10816 5004 10815 2172 \r\n3 6721 10817 10818 2173 \r\n3 10821 10819 10820 2174 \r\n3 10823 9231 10822 2175 \r\n3 10825 10152 10824 2176 \r\n3 6748 10826 8881 2177 \r\n3 10829 10827 10828 2178 \r\n3 9790 10830 10831 2179 \r\n3 5983 10832 10833 2180 \r\n3 10836 10834 10835 2181 \r\n3 5473 10837 10838 2182 \r\n3 10840 10839 7287 2183 \r\n3 10843 10841 10842 2184 \r\n3 6100 10844 8289 2185 \r\n3 10846 10845 6515 2186 \r\n3 10849 10847 10848 2187 \r\n3 10851 7191 10850 2188 \r\n3 10853 10094 10852 2189 \r\n3 10856 10854 10855 2190 \r\n3 10858 10857 7505 2191 \r\n3 10859 8596 9654 2192 \r\n3 10862 10860 10861 2193 \r\n3 7351 10863 10864 2194 \r\n3 5719 10865 10866 2195 \r\n3 10869 10867 10868 2196 \r\n3 10872 10870 10871 2197 \r\n3 10875 10873 10874 2198 \r\n3 10878 10876 10877 2199 \r\n3 10881 10879 10880 2200 \r\n3 10883 10284 10882 2201 \r\n3 10885 7943 10884 2202 \r\n3 10887 10886 7223 2203 \r\n3 9356 8889 10888 2204 \r\n3 10890 10889 10562 2205 \r\n3 10892 10891 7776 2206 \r\n3 6490 10893 9354 2207 \r\n3 10896 10894 10895 2208 \r\n3 10899 10897 10898 2209 \r\n3 10902 10900 10901 2210 \r\n3 9565 10903 10904 2211 \r\n3 9227 10905 10906 2212 \r\n3 10908 10298 10907 2213 \r\n3 10910 8845 10909 2214 \r\n3 6407 10911 10912 2215 \r\n3 10915 10913 10914 2216 \r\n3 10918 10916 10917 2217 \r\n3 10921 10919 10920 2218 \r\n3 10923 8865 10922 2219 \r\n3 10925 10924 10547 2220 \r\n3 10928 10926 10927 2221 \r\n3 9347 7249 10929 2222 \r\n3 10930 6293 9447 2223 \r\n3 10933 10931 10932 2224 \r\n3 10935 10934 9572 2225 \r\n3 10937 10246 10936 2226 \r\n3 10940 10938 10939 2227 \r\n3 10005 10941 10673 2228 \r\n3 10944 10942 10943 2229 \r\n3 10947 10945 10946 2230 \r\n3 10845 10948 6016 2231 \r\n3 10950 6889 10949 2232 \r\n3 10951 8830 10044 2233 \r\n3 10954 10952 10953 2234 \r\n3 5668 10955 10956 2235 \r\n3 10959 10957 10958 2236 \r\n3 10962 10960 10961 2237 \r\n3 10964 5430 10963 2238 \r\n3 7807 10965 7006 2239 \r\n3 10968 10966 10967 2240 \r\n3 10971 10969 10970 2241 \r\n3 10973 7846 10972 2242 \r\n3 6398 10974 10975 2243 \r\n3 10874 6867 10976 2244 \r\n3 10979 10977 10978 2245 \r\n3 10982 10980 10981 2246 \r\n3 5188 9321 10983 2247 \r\n3 10986 10984 10985 2248 \r\n3 10988 10987 5408 2249 \r\n3 10990 5725 10989 2250 \r\n3 10992 9059 10991 2251 \r\n3 10995 10993 10994 2252 \r\n3 9546 10996 10997 2253 \r\n3 11000 10998 10999 2254 \r\n3 11003 11001 11002 2255 \r\n3 11006 11004 11005 2256 \r\n3 11009 11007 11008 2257 \r\n3 11011 6522 11010 2258 \r\n3 11013 9748 11012 2259 \r\n3 11015 11014 6506 2260 \r\n3 11018 11016 11017 2261 \r\n3 11021 11019 11020 2262 \r\n3 7359 11022 5920 2263 \r\n3 7456 11023 6851 2264 \r\n3 11025 6159 11024 2265 \r\n3 5275 11026 11027 2266 \r\n3 11030 11028 11029 2267 \r\n3 11033 11031 11032 2268 \r\n3 6012 11034 11035 2269 \r\n3 11038 11036 11037 2270 \r\n3 11040 11039 7313 2271 \r\n3 11042 10357 11041 2272 \r\n3 11045 11043 11044 2273 \r\n3 11047 5501 11046 2274 \r\n3 11049 11010 11048 2275 \r\n3 11052 11050 11051 2276 \r\n3 11053 5697 5134 2277 \r\n3 11056 11054 11055 2278 \r\n3 11059 11057 11058 2279 \r\n3 11062 11060 11061 2280 \r\n3 5710 7258 11063 2281 \r\n3 11066 11064 11065 2282 \r\n3 10802 7902 7976 2283 \r\n3 11068 8514 11067 2284 \r\n3 11071 11069 11070 2285 \r\n3 11074 11072 11073 2286 \r\n3 11076 7760 11075 2287 \r\n3 11079 11077 11078 2288 \r\n3 11081 11061 11080 2289 \r\n3 11083 8590 11082 2290 \r\n3 11086 11084 11085 2291 \r\n3 11088 10220 11087 2292 \r\n3 6531 10078 11089 2293 \r\n3 11091 7103 11090 2294 \r\n3 11092 8372 7532 2295 \r\n3 11095 11093 11094 2296 \r\n3 8215 6877 11096 2297 \r\n3 9591 11097 11098 2298 \r\n3 9825 11099 11100 2299 \r\n3 11102 7374 11101 2300 \r\n3 11104 11103 5272 2301 \r\n3 11106 7143 11105 2302 \r\n3 11108 11107 8559 2303 \r\n3 9661 11109 11110 2304 \r\n3 11111 11042 5741 2305 \r\n3 11114 11112 11113 2306 \r\n3 9391 11115 11116 2307 \r\n3 11119 11117 11118 2308 \r\n3 11122 11120 11121 2309 \r\n3 11125 11123 11124 2310 \r\n3 11127 11126 5866 2311 \r\n3 11129 11128 6945 2312 \r\n3 9135 11130 11131 2313 \r\n3 11134 11132 11133 2314 \r\n3 10942 10793 11135 2315 \r\n3 11137 11136 7519 2316 \r\n3 8059 11138 11139 2317 \r\n3 11142 11140 11141 2318 \r\n3 11145 11143 11144 2319 \r\n3 11147 11146 8498 2320 \r\n3 11150 11148 11149 2321 \r\n3 11152 11151 10175 2322 \r\n3 11154 8094 11153 2323 \r\n3 8681 11155 11156 2324 \r\n3 8079 11157 11158 2325 \r\n3 11160 11159 5802 2326 \r\n3 11162 9000 11161 2327 \r\n3 7354 11163 11164 2328 \r\n3 11166 11165 10687 2329 \r\n3 11169 11167 11168 2330 \r\n3 11172 11170 11171 2331 \r\n3 11174 8879 11173 2332 \r\n3 11177 11175 11176 2333 \r\n3 8028 11178 11179 2334 \r\n3 11180 10423 9529 2335 \r\n3 11182 11181 9413 2336 \r\n3 11184 11183 9916 2337 \r\n3 11187 11185 11186 2338 \r\n3 11188 7572 10762 2339 \r\n3 11190 6222 11189 2340 \r\n3 9988 11191 11192 2341 \r\n3 11195 11193 11194 2342 \r\n3 8165 11196 10804 2343 \r\n3 11199 11197 11198 2344 \r\n3 11202 11200 11201 2345 \r\n3 11205 11203 11204 2346 \r\n3 6066 6542 11206 2347 \r\n3 11208 11207 7839 2348 \r\n3 11211 11209 11210 2349 \r\n3 11212 6688 6320 2350 \r\n3 11214 8616 11213 2351 \r\n3 11217 11215 11216 2352 \r\n3 7472 11218 11219 2353 \r\n3 11222 11220 11221 2354 \r\n3 11224 8850 11223 2355 \r\n3 11225 9833 6808 2356 \r\n3 8268 9455 11226 2357 \r\n3 9594 11227 7955 2358 \r\n3 11230 11228 11229 2359 \r\n3 11232 11231 8746 2360 \r\n3 11234 8751 11233 2361 \r\n3 10201 11235 7580 2362 \r\n3 11238 11236 11237 2363 \r\n3 11240 11239 5094 2364 \r\n3 11242 9832 11241 2365 \r\n3 11245 11243 11244 2366 \r\n3 11248 11246 11247 2367 \r\n3 11250 11249 6815 2368 \r\n3 11253 11251 11252 2369 \r\n3 11256 11254 11255 2370 \r\n3 5700 10987 11257 2371 \r\n3 11260 11258 11259 2372 \r\n3 11263 11261 11262 2373 \r\n3 11266 11264 11265 2374 \r\n3 11269 11267 11268 2375 \r\n3 11272 11270 11271 2376 \r\n3 11275 11273 11274 2377 \r\n3 11278 11276 11277 2378 \r\n3 11281 11279 11280 2379 \r\n3 11284 11282 11283 2380 \r\n3 11287 11285 11286 2381 \r\n3 11289 11288 8130 2382 \r\n3 11292 11290 11291 2383 \r\n3 7446 10573 5104 2384 \r\n3 11295 11293 11294 2385 \r\n3 11298 11296 11297 2386 \r\n3 11301 11299 11300 2387 \r\n3 11304 11302 11303 2388 \r\n3 11307 11305 11306 2389 \r\n3 11309 11308 8216 2390 \r\n3 11312 11310 11311 2391 \r\n3 11313 6439 10379 2392 \r\n3 11315 11073 11314 2393 \r\n3 11318 11316 11317 2394 \r\n3 11321 11319 11320 2395 \r\n3 11323 11322 10898 2396 \r\n3 11326 11324 11325 2397 \r\n3 11329 11327 11328 2398 \r\n3 8630 11330 11331 2399 \r\n3 11334 11332 11333 2400 \r\n3 11336 8975 11335 2401 \r\n3 11339 11337 11338 2402 \r\n3 9892 11340 11341 2403 \r\n3 11344 11342 11343 2404 \r\n3 11347 11345 11346 2405 \r\n3 11349 7705 11348 2406 \r\n3 11352 11350 11351 2407 \r\n3 11354 11353 6628 2408 \r\n3 5014 11355 9167 2409 \r\n3 11357 11356 8639 2410 \r\n3 11360 11358 11359 2411 \r\n3 11363 11361 11362 2412 \r\n3 11366 11364 11365 2413 \r\n3 7896 7132 11367 2414 \r\n3 11370 11368 11369 2415 \r\n3 11372 8482 11371 2416 \r\n3 11375 11373 11374 2417 \r\n3 11378 11376 11377 2418 \r\n3 11380 7927 11379 2419 \r\n3 11382 6558 11381 2420 \r\n3 11385 11383 11384 2421 \r\n3 11388 11386 11387 2422 \r\n3 11390 6546 11389 2423 \r\n3 11392 8993 11391 2424 \r\n3 11394 11393 10099 2425 \r\n3 11397 11395 11396 2426 \r\n3 11399 5489 11398 2427 \r\n3 11401 7121 11400 2428 \r\n3 11403 11402 10039 2429 \r\n3 11406 11404 11405 2430 \r\n3 7693 11407 11408 2431 \r\n3 11409 6401 5360 2432 \r\n3 11412 11410 11411 2433 \r\n3 11414 11413 10354 2434 \r\n3 11416 11415 8449 2435 \r\n3 9161 11417 11418 2436 \r\n3 8061 11419 11420 2437 \r\n3 8455 11421 9604 2438 \r\n3 11424 11422 11423 2439 \r\n3 11427 11425 11426 2440 \r\n3 7660 11428 11429 2441 \r\n3 11432 11430 11431 2442 \r\n3 11435 11433 11434 2443 \r\n3 11438 11436 11437 2444 \r\n3 11441 11439 11440 2445 \r\n3 11443 11442 7591 2446 \r\n3 11445 8249 11444 2447 \r\n3 11448 11446 11447 2448 \r\n3 11451 11449 11450 2449 \r\n3 11453 11452 7836 2450 \r\n3 11456 11454 11455 2451 \r\n3 11458 5834 11457 2452 \r\n3 11461 11459 11460 2453 \r\n3 11464 11462 11463 2454 \r\n3 11467 11465 11466 2455 \r\n3 7250 11468 9223 2456 \r\n3 11471 11469 11470 2457 \r\n3 11473 11472 7762 2458 \r\n3 5708 11474 11475 2459 \r\n3 11478 11476 11477 2460 \r\n3 11481 11479 11480 2461 \r\n3 11483 8513 11482 2462 \r\n3 11486 11484 11485 2463 \r\n3 9718 7940 11284 2464 \r\n3 11488 11487 7702 2465 \r\n3 11491 11489 11490 2466 \r\n3 11494 11492 11493 2467 \r\n3 11497 11495 11496 2468 \r\n3 11289 11498 11499 2469 \r\n3 11501 6896 11500 2470 \r\n3 11503 11502 6565 2471 \r\n3 11506 11504 11505 2472 \r\n3 11508 10770 11507 2473 \r\n3 8333 11509 11510 2474 \r\n3 11513 11511 11512 2475 \r\n3 11515 11514 10600 2476 \r\n3 11516 9911 6915 2477 \r\n3 11518 8115 11517 2478 \r\n3 8131 11519 11520 2479 \r\n3 11523 11521 11522 2480 \r\n3 5181 10273 11524 2481 \r\n3 10247 11525 5161 2482 \r\n3 11528 11526 11527 2483 \r\n3 11531 11529 11530 2484 \r\n3 11534 11532 11533 2485 \r\n3 11536 5877 11535 2486 \r\n3 11539 11537 11538 2487 \r\n3 11542 11540 11541 2488 \r\n3 11545 11543 11544 2489 \r\n3 11548 11546 11547 2490 \r\n3 11551 11549 11550 2491 \r\n3 9921 11552 11553 2492 \r\n3 5007 11554 11555 2493 \r\n3 11556 7877 6587 2494 \r\n3 11559 11557 11558 2495 \r\n3 11562 11560 11561 2496 \r\n3 11565 11563 11564 2497 \r\n3 11568 11566 11567 2498 \r\n3 11570 7540 11569 2499 \r\n3 11571 11391 8065 2500 \r\n3 6296 11572 11573 2501 \r\n3 11152 11574 11575 2502 \r\n3 11578 11576 11577 2503 \r\n3 5755 6307 11579 2504 \r\n3 11582 11580 11581 2505 \r\n3 5534 11583 11584 2506 \r\n3 11587 11585 11586 2507 \r\n3 5549 11588 11589 2508 \r\n3 11592 11590 11591 2509 \r\n3 11594 11593 8580 2510 \r\n3 11596 11298 11595 2511 \r\n3 11598 6001 11597 2512 \r\n3 11601 11599 11600 2513 \r\n3 11604 11602 11603 2514 \r\n3 11605 6856 5584 2515 \r\n3 11607 11606 7038 2516 \r\n3 11610 11608 11609 2517 \r\n3 11612 5970 11611 2518 \r\n3 11615 11613 11614 2519 \r\n3 11618 11616 11617 2520 \r\n3 11620 11619 10499 2521 \r\n3 11623 11621 11622 2522 \r\n3 11626 11624 11625 2523 \r\n3 11629 11627 11628 2524 \r\n3 11631 11630 5127 2525 \r\n3 11634 11632 11633 2526 \r\n3 11085 11635 11636 2527 \r\n3 10013 11637 11638 2528 \r\n3 11641 11639 11640 2529 \r\n3 11644 11642 11643 2530 \r\n3 6029 11645 7990 2531 \r\n3 5481 11646 11647 2532 \r\n3 6594 11648 9403 2533 \r\n3 11651 11649 11650 2534 \r\n3 11308 11652 11653 2535 \r\n3 11656 11654 11655 2536 \r\n3 9617 11657 11658 2537 \r\n3 7252 10968 11659 2538 \r\n3 11662 11660 11661 2539 \r\n3 9841 11663 8189 2540 \r\n3 11666 11664 11665 2541 \r\n3 11669 11667 11668 2542 \r\n3 11645 5833 11670 2543 \r\n3 11673 11671 11672 2544 \r\n3 11676 11674 11675 2545 \r\n3 11679 11677 11678 2546 \r\n3 11681 11680 8475 2547 \r\n3 11684 11682 11683 2548 \r\n3 11686 11685 8358 2549 \r\n3 8832 11687 11688 2550 \r\n3 11691 11689 11690 2551 \r\n3 8793 10274 11692 2552 \r\n3 11694 9949 11693 2553 \r\n3 11696 8543 11695 2554 \r\n3 6684 11697 11606 2555 \r\n3 11700 11698 11699 2556 \r\n3 11702 11701 7663 2557 \r\n3 11704 9619 11703 2558 \r\n3 11707 11705 11706 2559 \r\n3 6589 11708 11709 2560 \r\n3 11712 11710 11711 2561 \r\n3 11715 11713 11714 2562 \r\n3 11718 11716 11717 2563 \r\n3 11720 11226 11719 2564 \r\n3 11723 11721 11722 2565 \r\n3 11725 11724 7386 2566 \r\n3 11727 11726 8030 2567 \r\n3 11730 11728 11729 2568 \r\n3 11732 11731 9021 2569 \r\n3 11733 8494 11166 2570 \r\n3 11734 10919 9533 2571 \r\n3 11736 7178 11735 2572 \r\n3 11738 5638 11737 2573 \r\n3 11740 7868 11739 2574 \r\n3 11742 11741 6177 2575 \r\n3 11744 11743 6047 2576 \r\n3 11747 11745 11746 2577 \r\n3 11749 11748 7841 2578 \r\n3 11751 11750 8126 2579 \r\n3 11754 11752 11753 2580 \r\n3 5300 11755 11756 2581 \r\n3 11759 11757 11758 2582 \r\n3 11761 11760 9994 2583 \r\n3 11764 11762 11763 2584 \r\n3 11767 11765 11766 2585 \r\n3 6196 11768 11769 2586 \r\n3 11772 11770 11771 2587 \r\n3 11774 5714 11773 2588 \r\n3 5688 11775 11776 2589 \r\n3 5242 11777 11778 2590 \r\n3 11742 11779 11780 2591 \r\n3 11783 11781 11782 2592 \r\n3 11786 11784 11785 2593 \r\n3 9883 11787 11788 2594 \r\n3 11790 8483 11789 2595 \r\n3 11793 11791 11792 2596 \r\n3 9464 10681 11794 2597 \r\n3 11797 11795 11796 2598 \r\n3 11798 9844 9822 2599 \r\n3 11801 11799 11800 2600 \r\n3 11804 11802 11803 2601 \r\n3 11806 5030 11805 2602 \r\n3 11809 11807 11808 2603 \r\n3 11812 11810 11811 2604 \r\n3 11815 11813 11814 2605 \r\n3 11818 11816 11817 2606 \r\n3 11821 11819 11820 2607 \r\n3 11824 11822 11823 2608 \r\n3 6388 11825 11826 2609 \r\n3 11827 6691 11283 2610 \r\n3 11119 5319 11828 2611 \r\n3 11830 9034 11829 2612 \r\n3 11832 7180 11831 2613 \r\n3 11835 11833 11834 2614 \r\n3 11838 11836 11837 2615 \r\n3 11839 10356 8649 2616 \r\n3 11841 11840 7174 2617 \r\n3 11843 5150 11842 2618 \r\n3 8936 11072 11844 2619 \r\n3 7020 11845 11846 2620 \r\n3 5997 11847 9866 2621 \r\n3 11850 11848 11849 2622 \r\n3 8716 11851 11852 2623 \r\n3 11854 9543 11853 2624 \r\n3 6287 7308 10224 2625 \r\n3 9251 11855 5843 2626 \r\n3 8961 11856 11857 2627 \r\n3 11860 11858 11859 2628 \r\n3 11862 8562 11861 2629 \r\n3 7947 11863 11864 2630 \r\n3 11866 9577 11865 2631 \r\n3 11868 11867 10764 2632 \r\n3 5010 11869 11870 2633 \r\n3 11873 11871 11872 2634 \r\n3 11876 11874 11875 2635 \r\n3 6127 11877 11878 2636 \r\n3 11881 11879 11880 2637 \r\n3 8790 11882 8957 2638 \r\n3 11884 11883 7898 2639 \r\n3 11887 11885 11886 2640 \r\n3 11889 11888 6862 2641 \r\n3 11891 7643 11890 2642 \r\n3 9708 11892 11893 2643 \r\n3 11895 5044 11894 2644 \r\n3 11898 11896 11897 2645 \r\n3 8343 11420 6964 2646 \r\n3 11901 11899 11900 2647 \r\n3 11904 11902 11903 2648 \r\n3 9325 11905 11906 2649 \r\n3 7753 11907 11908 2650 \r\n3 11910 11909 7168 2651 \r\n3 11913 11911 11912 2652 \r\n3 11916 11914 11915 2653 \r\n3 11919 11917 11918 2654 \r\n3 11922 11920 11921 2655 \r\n3 11924 6666 11923 2656 \r\n3 9196 11925 11926 2657 \r\n3 11928 9198 11927 2658 \r\n3 11930 11929 6226 2659 \r\n3 11932 5886 11931 2660 \r\n3 11935 11933 11934 2661 \r\n3 11938 11936 11937 2662 \r\n3 11706 9503 11939 2663 \r\n3 7738 11940 6697 2664 \r\n3 6716 8599 7366 2665 \r\n3 11943 11941 11942 2666 \r\n3 11945 11944 7798 2667 \r\n3 10045 10711 8858 2668 \r\n3 11948 11946 11947 2669 \r\n3 8384 11949 10422 2670 \r\n3 11951 11950 10457 2671 \r\n3 11781 9154 11952 2672 \r\n3 11953 7503 6556 2673 \r\n3 11956 11954 11955 2674 \r\n3 6709 9732 11416 2675 \r\n3 11959 11957 11958 2676 \r\n3 11962 11960 11961 2677 \r\n3 6956 11963 5322 2678 \r\n3 11965 11964 11333 2679 \r\n3 11968 11966 11967 2680 \r\n3 11970 11969 6656 2681 \r\n3 11972 11971 6489 2682 \r\n3 11974 10830 11973 2683 \r\n3 11976 11975 7230 2684 \r\n3 11978 11977 10083 2685 \r\n3 11980 11979 6535 2686 \r\n3 11982 11981 5572 2687 \r\n3 10002 8550 11983 2688 \r\n3 11985 11984 6266 2689 \r\n3 11988 11986 11987 2690 \r\n3 11990 5507 11989 2691 \r\n3 11992 11991 7309 2692 \r\n3 11993 7448 5357 2693 \r\n3 11994 9970 6447 2694 \r\n3 11997 11995 11996 2695 \r\n3 12000 11998 11999 2696 \r\n3 10574 8675 12001 2697 \r\n3 12004 12002 12003 2698 \r\n3 12006 12005 8023 2699 \r\n3 12009 12007 12008 2700 \r\n3 12012 12010 12011 2701 \r\n3 12015 12013 12014 2702 \r\n3 12018 12016 12017 2703 \r\n3 12021 12019 12020 2704 \r\n3 12024 12022 12023 2705 \r\n3 7355 12025 12026 2706 \r\n3 12029 12027 12028 2707 \r\n3 12030 6874 9615 2708 \r\n3 12033 12031 12032 2709 \r\n3 12036 12034 12035 2710 \r\n3 12039 12037 12038 2711 \r\n3 12041 11486 12040 2712 \r\n3 12043 12042 8242 2713 \r\n3 12046 12044 12045 2714 \r\n3 12049 12047 12048 2715 \r\n3 12051 9099 12050 2716 \r\n3 12054 12052 12053 2717 \r\n3 12057 12055 12056 2718 \r\n3 12059 5403 12058 2719 \r\n3 12061 12060 7800 2720 \r\n3 12064 12062 12063 2721 \r\n3 12067 12065 12066 2722 \r\n3 11417 12068 12069 2723 \r\n3 12071 11094 12070 2724 \r\n3 12073 6491 12072 2725 \r\n3 12076 12074 12075 2726 \r\n3 12079 12077 12078 2727 \r\n3 9333 8884 11724 2728 \r\n3 12082 12080 12081 2729 \r\n3 6898 12083 12084 2730 \r\n3 12085 7719 5586 2731 \r\n3 10933 12086 12087 2732 \r\n3 12088 8535 5009 2733 \r\n3 12090 10894 12089 2734 \r\n3 10427 12091 12092 2735 \r\n3 9707 12093 12094 2736 \r\n3 6247 12095 12096 2737 \r\n3 12098 12097 11499 2738 \r\n3 12101 12099 12100 2739 \r\n3 12104 12102 12103 2740 \r\n3 10930 5933 12105 2741 \r\n3 5402 11196 12106 2742 \r\n3 12108 12107 10568 2743 \r\n3 8506 12109 12110 2744 \r\n3 12112 5208 12111 2745 \r\n3 11861 12113 12114 2746 \r\n3 12117 12115 12116 2747 \r\n3 5847 11012 12118 2748 \r\n3 12120 9383 12119 2749 \r\n3 7423 12121 12122 2750 \r\n3 12125 12123 12124 2751 \r\n3 12128 12126 12127 2752 \r\n3 12130 12129 7592 2753 \r\n3 12133 12131 12132 2754 \r\n3 8432 11905 12134 2755 \r\n3 6925 12135 12136 2756 \r\n3 12139 12137 12138 2757 \r\n3 12142 12140 12141 2758 \r\n3 12145 12143 12144 2759 \r\n3 12147 12067 12146 2760 \r\n3 7326 6675 12148 2761 \r\n3 12004 5853 12149 2762 \r\n3 12152 12150 12151 2763 \r\n3 12154 12153 11839 2764 \r\n3 12156 12155 6672 2765 \r\n3 12159 12157 12158 2766 \r\n3 12161 12160 7422 2767 \r\n3 6681 12162 8230 2768 \r\n3 12163 11156 11517 2769 \r\n3 12164 11290 11884 2770 \r\n3 7497 12165 6541 2771 \r\n3 5528 11116 9048 2772 \r\n3 7945 6311 12166 2773 \r\n3 12168 12167 9155 2774 \r\n3 5178 12169 12170 2775 \r\n3 11852 12171 10290 2776 \r\n3 12173 5578 12172 2777 \r\n3 10132 12174 12175 2778 \r\n3 12178 12176 12177 2779 \r\n3 9123 12179 12180 2780 \r\n3 12183 12181 12182 2781 \r\n3 12185 10355 12184 2782 \r\n3 12188 12186 12187 2783 \r\n3 12191 12189 12190 2784 \r\n3 7044 12192 12193 2785 \r\n3 9044 12194 9405 2786 \r\n3 12197 12195 12196 2787 \r\n3 12200 12198 12199 2788 \r\n3 12203 12201 12202 2789 \r\n3 9509 12204 12205 2790 \r\n3 12207 12206 10012 2791 \r\n3 12209 12003 12208 2792 \r\n3 12211 12210 9794 2793 \r\n3 12214 12212 12213 2794 \r\n3 12216 12215 10084 2795 \r\n3 12217 7596 9885 2796 \r\n3 12220 12218 12219 2797 \r\n3 12223 12221 12222 2798 \r\n3 8325 9567 7569 2799 \r\n3 11681 12224 8890 2800 \r\n3 12225 5237 5953 2801 \r\n3 7547 12226 12227 2802 \r\n3 12229 12228 9898 2803 \r\n3 9600 10100 11112 2804 \r\n3 12232 12230 12231 2805 \r\n3 12235 12233 12234 2806 \r\n3 12238 12236 12237 2807 \r\n3 6466 12239 12240 2808 \r\n3 12242 10515 12241 2809 \r\n3 12243 11428 11799 2810 \r\n3 12246 12244 12245 2811 \r\n3 12249 12247 12248 2812 \r\n3 10620 10863 7510 2813 \r\n3 12251 12250 11488 2814 \r\n3 12252 10566 10024 2815 \r\n3 12206 12253 12254 2816 \r\n3 12256 10561 12255 2817 \r\n3 9469 6793 12257 2818 \r\n3 12260 12258 12259 2819 \r\n3 12263 12261 12262 2820 \r\n3 12265 9182 12264 2821 \r\n3 12268 12266 12267 2822 \r\n3 12270 12269 12239 2823 \r\n3 12271 10616 9933 2824 \r\n3 12273 9060 12272 2825 \r\n3 10605 12274 10133 2826 \r\n3 12277 12275 12276 2827 \r\n3 12279 11041 12278 2828 \r\n3 12282 12280 12281 2829 \r\n3 6061 12283 6028 2830 \r\n3 12286 12284 12285 2831 \r\n3 12288 10923 12287 2832 \r\n3 12290 12289 11602 2833 \r\n3 12293 12291 12292 2834 \r\n3 6880 12294 5835 2835 \r\n3 12296 11897 12295 2836 \r\n3 12299 12297 12298 2837 \r\n3 12302 12300 12301 2838 \r\n3 12305 12303 12304 2839 \r\n3 12308 12306 12307 2840 \r\n3 11750 12309 8069 2841 \r\n3 12312 12310 12311 2842 \r\n3 12313 7804 7749 2843 \r\n3 12315 9937 12314 2844 \r\n3 12317 8328 12316 2845 \r\n3 12319 12318 10876 2846 \r\n3 12322 12320 12321 2847 \r\n3 12324 6125 12323 2848 \r\n3 6192 12325 12326 2849 \r\n3 12328 12327 6512 2850 \r\n3 12331 12329 12330 2851 \r\n3 12332 11402 9036 2852 \r\n3 12333 11569 6824 2853 \r\n3 12335 12334 9713 2854 \r\n3 12336 6309 8718 2855 \r\n3 8275 12337 6855 2856 \r\n3 12340 12338 12339 2857 \r\n3 12342 12341 6920 2858 \r\n3 12344 5633 12343 2859 \r\n3 12347 12345 12346 2860 \r\n3 12350 12348 12349 2861 \r\n3 11315 9359 10231 2862 \r\n3 5324 12351 12352 2863 \r\n3 12354 7420 12353 2864 \r\n3 12357 12355 12356 2865 \r\n3 12360 12358 12359 2866 \r\n3 12361 9106 5348 2867 \r\n3 10542 12362 12363 2868 \r\n3 12366 12364 12365 2869 \r\n3 12368 12367 9258 2870 \r\n3 8971 12369 12370 2871 \r\n3 12373 12371 12372 2872 \r\n3 12376 12374 12375 2873 \r\n3 11715 12377 12378 2874 \r\n3 12380 9220 12379 2875 \r\n3 12382 12381 6756 2876 \r\n3 11790 6673 12383 2877 \r\n3 12386 12384 12385 2878 \r\n3 12388 12387 7860 2879 \r\n3 12390 10487 12389 2880 \r\n3 12392 10038 12391 2881 \r\n3 12393 9722 5011 2882 \r\n3 12395 11711 12394 2883 \r\n3 12396 5197 6534 2884 \r\n3 12398 9288 12397 2885 \r\n3 12400 12399 5604 2886 \r\n3 12056 8912 12401 2887 \r\n3 12404 12402 12403 2888 \r\n3 11764 11678 5391 2889 \r\n3 12406 8446 12405 2890 \r\n3 12408 12407 5734 2891 \r\n3 11265 12409 12410 2892 \r\n3 6562 8331 12411 2893 \r\n3 8209 12412 12413 2894 \r\n3 12416 12414 12415 2895 \r\n3 12419 12417 12418 2896 \r\n3 12422 12420 12421 2897 \r\n3 12425 12423 12424 2898 \r\n3 12428 12426 12427 2899 \r\n3 12430 12429 11637 2900 \r\n3 12432 12431 11629 2901 \r\n3 12433 11305 8208 2902 \r\n3 12436 12434 12435 2903 \r\n3 9856 12377 12437 2904 \r\n3 9524 12438 12439 2905 \r\n3 12441 10179 12440 2906 \r\n3 9071 12442 12443 2907 \r\n3 12445 12444 11092 2908 \r\n3 12448 12446 12447 2909 \r\n3 12451 12449 12450 2910 \r\n3 12454 12452 12453 2911 \r\n3 12257 12455 12456 2912 \r\n3 12458 10739 12457 2913 \r\n3 12460 12459 8839 2914 \r\n3 12462 10780 12461 2915 \r\n3 11418 12463 12464 2916 \r\n3 12466 8842 12465 2917 \r\n3 8344 7522 12467 2918 \r\n3 12469 12468 5544 2919 \r\n3 6553 8970 12470 2920 \r\n3 12472 12471 5190 2921 \r\n3 12474 12473 11450 2922 \r\n3 12476 12475 8168 2923 \r\n3 12478 6663 12477 2924 \r\n3 5437 8223 12479 2925 \r\n3 12482 12480 12481 2926 \r\n3 12485 12483 12484 2927 \r\n3 12488 12486 12487 2928 \r\n3 5662 12489 11135 2929 \r\n3 12491 11899 12490 2930 \r\n3 12494 12492 12493 2931 \r\n3 12497 12495 12496 2932 \r\n3 11062 12498 12499 2933 \r\n3 12231 12423 12500 2934 \r\n3 12501 8316 7934 2935 \r\n3 12502 10546 11611 2936 \r\n3 12505 12503 12504 2937 \r\n3 12508 12506 12507 2938 \r\n3 12511 12509 12510 2939 \r\n3 9989 11862 12512 2940 \r\n3 12513 12316 5990 2941 \r\n3 5827 12514 12515 2942 \r\n3 12518 12516 12517 2943 \r\n3 6687 12513 8748 2944 \r\n3 12521 12519 12520 2945 \r\n3 7281 12522 9848 2946 \r\n3 12525 12523 12524 2947 \r\n3 10586 12526 12527 2948 \r\n3 12529 8773 12528 2949 \r\n3 9618 12530 12531 2950 \r\n3 10988 12532 12533 2951 \r\n3 12535 12534 10785 2952 \r\n3 6175 12536 12537 2953 \r\n3 12539 5192 12538 2954 \r\n3 12541 12540 6383 2955 \r\n3 12542 11247 10421 2956 \r\n3 12545 12543 12544 2957 \r\n3 12547 11530 12546 2958 \r\n3 8186 12548 12523 2959 \r\n3 12551 12549 12550 2960 \r\n3 12026 12410 7997 2961 \r\n3 12553 12552 5929 2962 \r\n3 12555 12554 10475 2963 \r\n3 12558 12556 12557 2964 \r\n3 12561 12559 12560 2965 \r\n3 12563 12562 7637 2966 \r\n3 12565 12229 12564 2967 \r\n3 9930 12566 12567 2968 \r\n3 5429 12568 12569 2969 \r\n3 12572 12570 12571 2970 \r\n3 7007 10603 8413 2971 \r\n3 12575 12573 12574 2972 \r\n3 12577 12576 11808 2973 \r\n3 12578 7442 12362 2974 \r\n3 12581 12579 12580 2975 \r\n3 12584 12582 12583 2976 \r\n3 12587 12585 12586 2977 \r\n3 12589 10418 12588 2978 \r\n3 5526 12590 11005 2979 \r\n3 12593 12591 12592 2980 \r\n3 11387 12594 12595 2981 \r\n3 7434 12596 8128 2982 \r\n3 12599 12597 12598 2983 \r\n3 6051 12600 12421 2984 \r\n3 12603 12601 12602 2985 \r\n3 12606 12604 12605 2986 \r\n3 12609 12607 12608 2987 \r\n3 9366 8791 12610 2988 \r\n3 12613 12611 12612 2989 \r\n3 12616 12614 12615 2990 \r\n3 8652 12617 11270 2991 \r\n3 12619 10190 12618 2992 \r\n3 12621 12620 9622 2993 \r\n3 10572 12622 12623 2994 \r\n3 12626 12624 12625 2995 \r\n3 12629 12627 12628 2996 \r\n3 12632 12630 12631 2997 \r\n3 12635 12633 12634 2998 \r\n3 7948 12636 12637 2999 \r\n3 12639 12638 11734 3000 \r\n3 12641 10724 12640 3001 \r\n3 12642 10628 12262 3002 \r\n3 9076 12432 6382 3003 \r\n3 12643 8043 9024 3004 \r\n3 12646 12644 12645 3005 \r\n3 12649 12647 12648 3006 \r\n3 12652 12650 12651 3007 \r\n3 5406 5397 8768 3008 \r\n3 12654 7924 12653 3009 \r\n3 12655 10176 9394 3010 \r\n3 12658 12656 12657 3011 \r\n3 10381 12659 6109 3012 \r\n3 9576 12660 12661 3013 \r\n3 12663 7917 12662 3014 \r\n3 12666 12664 12665 3015 \r\n3 5141 8213 12667 3016 \r\n3 12670 12668 12669 3017 \r\n3 12672 12671 9390 3018 \r\n3 12675 12673 12674 3019 \r\n3 12678 12676 12677 3020 \r\n3 5354 12679 12680 3021 \r\n3 12683 12681 12682 3022 \r\n3 12686 12684 12685 3023 \r\n3 8440 6126 7368 3024 \r\n3 6115 12687 12688 3025 \r\n3 12691 12689 12690 3026 \r\n3 12694 12692 12693 3027 \r\n3 9308 10327 12695 3028 \r\n3 12697 12696 6023 3029 \r\n3 12700 12698 12699 3030 \r\n3 12199 12701 12702 3031 \r\n3 12704 10777 12703 3032 \r\n3 12707 12705 12706 3033 \r\n3 12709 12708 8459 3034 \r\n3 12712 12710 12711 3035 \r\n3 12713 8960 9919 3036 \r\n3 5084 12714 6750 3037 \r\n3 11561 12715 12716 3038 \r\n3 12718 11635 12717 3039 \r\n3 11587 12719 12720 3040 \r\n3 12722 12721 8034 3041 \r\n3 12724 12723 10575 3042 \r\n3 12726 8314 12725 3043 \r\n3 12729 12727 12728 3044 \r\n3 6268 12730 12731 3045 \r\n3 12734 12732 12733 3046 \r\n3 12506 12735 12736 3047 \r\n3 12738 12737 8204 3048 \r\n3 12740 8493 12739 3049 \r\n3 8923 12741 12742 3050 \r\n3 7979 12743 12744 3051 \r\n3 9965 12745 12746 3052 \r\n3 12749 12747 12748 3053 \r\n3 10998 12750 10529 3054 \r\n3 12752 8582 12751 3055 \r\n3 10008 12753 12754 3056 \r\n3 10192 12755 12756 3057 \r\n3 12759 12757 12758 3058 \r\n3 12762 12760 12761 3059 \r\n3 12764 12763 11207 3060 \r\n3 12766 9631 12765 3061 \r\n3 12769 12767 12768 3062 \r\n3 5831 12770 12771 3063 \r\n3 12773 12772 9361 3064 \r\n3 12774 10438 7340 3065 \r\n3 12776 12775 6391 3066 \r\n3 12779 12777 12778 3067 \r\n3 11995 12780 10682 3068 \r\n3 12783 12781 12782 3069 \r\n3 12785 12784 12053 3070 \r\n3 12786 11771 5702 3071 \r\n3 12789 12787 12788 3072 \r\n3 12792 12790 12791 3073 \r\n3 12795 12793 12794 3074 \r\n3 12797 12796 8834 3075 \r\n3 12799 11111 12798 3076 \r\n3 12802 12800 12801 3077 \r\n3 11922 12803 12631 3078 \r\n3 8619 12646 12804 3079 \r\n3 12807 12805 12806 3080 \r\n3 8780 12808 10902 3081 \r\n3 8264 12809 6588 3082 \r\n3 12811 8978 12810 3083 \r\n3 12814 12812 12813 3084 \r\n3 12816 8418 12815 3085 \r\n3 12818 12817 6981 3086 \r\n3 12821 12819 12820 3087 \r\n3 12824 12822 12823 3088 \r\n3 12827 12825 12826 3089 \r\n3 12830 12828 12829 3090 \r\n3 12833 12831 12832 3091 \r\n3 12835 12708 12834 3092 \r\n3 12838 12836 12837 3093 \r\n3 12841 12839 12840 3094 \r\n3 12842 10254 11640 3095 \r\n3 12845 12843 12844 3096 \r\n3 9557 12846 10867 3097 \r\n3 6348 12847 12848 3098 \r\n3 12850 11401 12849 3099 \r\n3 12852 12851 6217 3100 \r\n3 12854 5175 12853 3101 \r\n3 12857 12855 12856 3102 \r\n3 7506 12858 12859 3103 \r\n3 11431 12860 12861 3104 \r\n3 12863 12387 12862 3105 \r\n3 12865 11949 12864 3106 \r\n3 12867 11021 12866 3107 \r\n3 9935 12868 12869 3108 \r\n3 12870 11708 10079 3109 \r\n3 12873 12871 12872 3110 \r\n3 12876 12874 12875 3111 \r\n3 6133 11244 12877 3112 \r\n3 12261 12645 12878 3113 \r\n3 12880 10186 12879 3114 \r\n3 5746 12881 12882 3115 \r\n3 10260 12883 12884 3116 \r\n3 12887 12885 12886 3117 \r\n3 12890 12888 12889 3118 \r\n3 12893 12891 12892 3119 \r\n3 11860 12894 11503 3120 \r\n3 12896 9095 12895 3121 \r\n3 12899 12897 12898 3122 \r\n3 12902 12900 12901 3123 \r\n3 9584 12903 12904 3124 \r\n3 12907 12905 12906 3125 \r\n3 12910 12908 12909 3126 \r\n3 6603 12911 12912 3127 \r\n3 12913 8564 12848 3128 \r\n3 12916 12914 12915 3129 \r\n3 10342 12917 12918 3130 \r\n3 10467 12919 12920 3131 \r\n3 10198 12921 12922 3132 \r\n3 12925 12923 12924 3133 \r\n3 6031 12926 12770 3134 \r\n3 12928 12927 8769 3135 \r\n3 12931 12929 12930 3136 \r\n3 10526 11456 9547 3137 \r\n3 12934 12932 12933 3138 \r\n3 11109 12935 12936 3139 \r\n3 12182 9605 10003 3140 \r\n3 12938 12937 7201 3141 \r\n3 12940 12687 12939 3142 \r\n3 12941 8135 9867 3143 \r\n3 12943 12942 5412 3144 \r\n3 12945 10130 12944 3145 \r\n3 9395 12946 12947 3146 \r\n3 12950 12948 12949 3147 \r\n3 12952 12951 9030 3148 \r\n3 12954 12897 12953 3149 \r\n3 12957 12955 12956 3150 \r\n3 12959 5308 12958 3151 \r\n3 6185 12960 12961 3152 \r\n3 11158 12962 12963 3153 \r\n3 8501 12964 12965 3154 \r\n3 12968 12966 12967 3155 \r\n3 12971 12969 12970 3156 \r\n3 11668 12972 9177 3157 \r\n3 12974 8719 12973 3158 \r\n3 12975 11652 8893 3159 \r\n3 7795 11478 12976 3160 \r\n3 8123 12977 5758 3161 \r\n3 12979 11972 12978 3162 \r\n3 12982 12980 12981 3163 \r\n3 12984 9282 12983 3164 \r\n3 12987 12985 12986 3165 \r\n3 12680 12988 12989 3166 \r\n3 12990 8025 11940 3167 \r\n3 12992 12991 9834 3168 \r\n3 12995 12993 12994 3169 \r\n3 12996 6288 5516 3170 \r\n3 12905 12997 12597 3171 \r\n3 13000 12998 12999 3172 \r\n3 13003 13001 13002 3173 \r\n3 13005 13004 11543 3174 \r\n3 13008 13006 13007 3175 \r\n3 13011 13009 13010 3176 \r\n3 13014 13012 13013 3177 \r\n3 13016 13015 8692 3178 \r\n3 13018 12734 13017 3179 \r\n3 13019 11415 9734 3180 \r\n3 13021 13020 12599 3181 \r\n3 7928 13022 13023 3182 \r\n3 8265 13024 13025 3183 \r\n3 7865 13026 13027 3184 \r\n3 13029 8210 13028 3185 \r\n3 13032 13030 13031 3186 \r\n3 13035 13033 13034 3187 \r\n3 13037 10154 13036 3188 \r\n3 13039 9360 13038 3189 \r\n3 13042 13040 13041 3190 \r\n3 13044 11952 13043 3191 \r\n3 13046 5670 13045 3192 \r\n3 13048 6422 13047 3193 \r\n3 13051 13049 13050 3194 \r\n3 8844 13052 6102 3195 \r\n3 13055 13053 13054 3196 \r\n3 9493 13056 13057 3197 \r\n3 13060 13058 13059 3198 \r\n3 13062 11182 13061 3199 \r\n3 7306 13063 13064 3200 \r\n3 12728 12346 13065 3201 \r\n3 13068 13066 13067 3202 \r\n3 11276 13069 7476 3203 \r\n3 13071 13070 11044 3204 \r\n3 13073 12424 13072 3205 \r\n3 13075 6178 13074 3206 \r\n3 13077 12769 13076 3207 \r\n3 13079 13078 10943 3208 \r\n3 13082 13080 13081 3209 \r\n3 13084 7720 13083 3210 \r\n3 13086 13085 10447 3211 \r\n3 6059 13087 7833 3212 \r\n3 9421 13088 13089 3213 \r\n3 11422 13090 13091 3214 \r\n3 13093 13092 6197 3215 \r\n3 12557 13094 13095 3216 \r\n3 12401 13096 13097 3217 \r\n3 12358 13098 12695 3218 \r\n3 13101 13099 13100 3219 \r\n3 11902 5276 13102 3220 \r\n3 13104 13103 10720 3221 \r\n3 13106 13105 9986 3222 \r\n3 13108 7000 13107 3223 \r\n3 6622 13109 13110 3224 \r\n3 13113 13111 13112 3225 \r\n3 13115 7538 13114 3226 \r\n3 13118 13116 13117 3227 \r\n3 10425 8102 9501 3228 \r\n3 13121 13119 13120 3229 \r\n3 11145 13122 11198 3230 \r\n3 13124 13123 13007 3231 \r\n3 13127 13125 13126 3232 \r\n3 13128 10958 6019 3233 \r\n3 12741 9575 13129 3234 \r\n3 13131 13130 11356 3235 \r\n3 13134 13132 13133 3236 \r\n3 13137 13135 13136 3237 \r\n3 13139 13138 9525 3238 \r\n3 7815 13140 13141 3239 \r\n3 12690 13142 10007 3240 \r\n3 13145 13143 13144 3241 \r\n3 13147 6510 13146 3242 \r\n3 13150 13148 13149 3243 \r\n3 12331 8003 13151 3244 \r\n3 13152 11603 6033 3245 \r\n3 11297 9511 13153 3246 \r\n3 13156 13154 13155 3247 \r\n3 13158 13157 10441 3248 \r\n3 13160 5217 13159 3249 \r\n3 13162 12657 13161 3250 \r\n3 13164 6682 13163 3251 \r\n3 10550 11453 13165 3252 \r\n3 11070 13166 13167 3253 \r\n3 13168 7911 12456 3254 \r\n3 13170 12731 13169 3255 \r\n3 13171 9484 13094 3256 \r\n3 13173 13172 7956 3257 \r\n3 13175 9214 13174 3258 \r\n3 10022 10296 13176 3259 \r\n3 13178 13177 7669 3260 \r\n3 13180 13179 11045 3261 \r\n3 13183 13181 13182 3262 \r\n3 13185 12162 13184 3263 \r\n3 13100 8613 13186 3264 \r\n3 6992 13187 13188 3265 \r\n3 13190 7117 13189 3266 \r\n3 13192 12837 13191 3267 \r\n3 13194 10840 13193 3268 \r\n3 13197 13195 13196 3269 \r\n3 13198 9927 5823 3270 \r\n3 13201 13199 13200 3271 \r\n3 13204 13202 13203 3272 \r\n3 12825 13205 13206 3273 \r\n3 13208 9664 13207 3274 \r\n3 13209 6454 9836 3275 \r\n3 7607 13210 13211 3276 \r\n3 12341 5961 7500 3277 \r\n3 5957 12057 12679 3278 \r\n3 13213 13212 12027 3279 \r\n3 13216 13214 13215 3280 \r\n3 13218 13217 10369 3281 \r\n3 10338 13219 13220 3282 \r\n3 12247 13221 13222 3283 \r\n3 13225 13223 13224 3284 \r\n3 13227 13226 5262 3285 \r\n3 13229 8626 13228 3286 \r\n3 5228 13230 11851 3287 \r\n3 13233 13231 13232 3288 \r\n3 12660 13234 13235 3289 \r\n3 13237 13236 10734 3290 \r\n3 13239 5224 13238 3291 \r\n3 13241 6008 13240 3292 \r\n3 5655 10666 13242 3293 \r\n3 13244 13243 8873 3294 \r\n3 13247 13245 13246 3295 \r\n3 8654 13248 10144 3296 \r\n3 13250 11386 13249 3297 \r\n3 13253 13251 13252 3298 \r\n3 13255 13254 7109 3299 \r\n3 8925 11608 5950 3300 \r\n3 13257 8699 13256 3301 \r\n3 11674 13258 13259 3302 \r\n3 13262 13260 13261 3303 \r\n3 11684 12672 10676 3304 \r\n3 13264 13263 11267 3305 \r\n3 13267 13265 13266 3306 \r\n3 13270 13268 13269 3307 \r\n3 7605 13271 13272 3308 \r\n3 13274 8472 13273 3309 \r\n3 13276 13275 7188 3310 \r\n3 13278 12509 13277 3311 \r\n3 10629 8403 13279 3312 \r\n3 13282 13280 13281 3313 \r\n3 13284 13283 7787 3314 \r\n3 13286 12442 13285 3315 \r\n3 13288 10306 13287 3316 \r\n3 13291 13289 13290 3317 \r\n3 13292 12069 11282 3318 \r\n3 13294 13293 8183 3319 \r\n3 13297 13295 13296 3320 \r\n3 5888 13298 6306 3321 \r\n3 7904 6248 11002 3322 \r\n3 13301 13299 13300 3323 \r\n3 13303 13302 5452 3324 \r\n3 13304 7968 7248 3325 \r\n3 8221 12462 13305 3326 \r\n3 13308 13306 13307 3327 \r\n3 13311 13309 13310 3328 \r\n3 13314 13312 13313 3329 \r\n3 13316 13315 7295 3330 \r\n3 13319 13317 13318 3331 \r\n3 11613 13320 13321 3332 \r\n3 13323 10385 13322 3333 \r\n3 13324 12950 5639 3334 \r\n3 13327 13325 13326 3335 \r\n3 13330 13328 13329 3336 \r\n3 13332 13331 9904 3337 \r\n3 13334 5814 13333 3338 \r\n3 13337 13335 13336 3339 \r\n3 13340 13338 13339 3340 \r\n3 11930 13341 11585 3341 \r\n3 13344 13342 13343 3342 \r\n3 13346 12137 13345 3343 \r\n3 5720 13347 13348 3344 \r\n3 13350 8323 13349 3345 \r\n3 13353 13351 13352 3346 \r\n3 13354 5636 5210 3347 \r\n3 10886 13355 6953 3348 \r\n3 10189 7405 11841 3349 \r\n3 5468 13356 13357 3350 \r\n3 13360 13358 13359 3351 \r\n3 13078 12669 13361 3352 \r\n3 13363 10707 13362 3353 \r\n3 13364 9380 10440 3354 \r\n3 13366 13365 12010 3355 \r\n3 13369 13367 13368 3356 \r\n3 10202 13370 13371 3357 \r\n3 13373 13372 8777 3358 \r\n3 8211 13374 13375 3359 \r\n3 13378 13376 13377 3360 \r\n3 11542 9205 13379 3361 \r\n3 6545 9452 13380 3362 \r\n3 8312 8144 13381 3363 \r\n3 13234 8922 11009 3364 \r\n3 13384 13382 13383 3365 \r\n3 13386 12711 13385 3366 \r\n3 12914 13387 13388 3367 \r\n3 13390 13389 13235 3368 \r\n3 9888 6301 12275 3369 \r\n3 13391 5876 12086 3370 \r\n3 13393 13392 6865 3371 \r\n3 13394 5008 9644 3372 \r\n3 13397 13395 13396 3373 \r\n3 13400 13398 13399 3374 \r\n3 13402 13401 12071 3375 \r\n3 11588 13403 13404 3376 \r\n3 5171 13381 11222 3377 \r\n3 13407 13405 13406 3378 \r\n3 13408 12541 5362 3379 \r\n3 13411 13409 13410 3380 \r\n3 5826 13412 6795 3381 \r\n3 5599 10857 13413 3382 \r\n3 9739 13414 6336 3383 \r\n3 13416 11407 13415 3384 \r\n3 13419 13417 13418 3385 \r\n3 11337 8463 13420 3386 \r\n3 13422 9795 13421 3387 \r\n3 13425 13423 13424 3388 \r\n3 13428 13426 13427 3389 \r\n3 11285 13429 13430 3390 \r\n3 13432 13431 5247 3391 \r\n3 13434 11432 13433 3392 \r\n3 13436 13435 11131 3393 \r\n3 13438 13437 11143 3394 \r\n3 10372 13439 13440 3395 \r\n3 13443 13441 13442 3396 \r\n3 13446 13444 13445 3397 \r\n3 6138 13447 12412 3398 \r\n3 13449 7199 13448 3399 \r\n3 11467 12083 11441 3400 \r\n3 13451 13450 12317 3401 \r\n3 7946 13452 13453 3402 \r\n3 13456 13454 13455 3403 \r\n3 12991 11911 13457 3404 \r\n3 13263 13458 13459 3405 \r\n3 13462 13460 13461 3406 \r\n3 13465 13463 13464 3407 \r\n3 13468 13466 13467 3408 \r\n3 13470 13469 12691 3409 \r\n3 9275 5222 13471 3410 \r\n3 13419 11822 5542 3411 \r\n3 13473 6849 13472 3412 \r\n3 13476 13474 13475 3413 \r\n3 13479 13477 13478 3414 \r\n3 13482 13480 13481 3415 \r\n3 8698 13483 13484 3416 \r\n3 5935 13485 13486 3417 \r\n3 7146 13487 13488 3418 \r\n3 13491 13489 13490 3419 \r\n3 13494 13492 13493 3420 \r\n3 13497 13495 13496 3421 \r\n3 13498 11382 5745 3422 \r\n3 13500 10947 13499 3423 \r\n3 13503 13501 13502 3424 \r\n3 13504 10392 6631 3425 \r\n3 13506 9804 13505 3426 \r\n3 13509 13507 13508 3427 \r\n3 13274 13510 13511 3428 \r\n3 13514 13512 13513 3429 \r\n3 13517 13515 13516 3430 \r\n3 13519 13518 8591 3431 \r\n3 13521 9882 13520 3432 \r\n3 13524 13522 13523 3433 \r\n3 8338 7678 13525 3434 \r\n3 13528 13526 13527 3435 \r\n3 13531 13529 13530 3436 \r\n3 13533 7246 13532 3437 \r\n3 13536 13534 13535 3438 \r\n3 6767 13537 13538 3439 \r\n3 13540 13539 10814 3440 \r\n3 8257 10314 13541 3441 \r\n3 13544 13542 13543 3442 \r\n3 13545 10375 7224 3443 \r\n3 13547 13546 6141 3444 \r\n3 13549 13548 9902 3445 \r\n3 13551 6905 13550 3446 \r\n3 13553 7771 13552 3447 \r\n3 13556 13554 13555 3448 \r\n3 13559 13557 13558 3449 \r\n3 13510 8521 13560 3450 \r\n3 11245 5294 7477 3451 \r\n3 13562 10827 13561 3452 \r\n3 13564 12627 13563 3453 \r\n3 13567 13565 13566 3454 \r\n3 13570 13568 13569 3455 \r\n3 13573 13571 13572 3456 \r\n3 7363 8011 5283 3457 \r\n3 8439 13574 13575 3458 \r\n3 13578 13576 13577 3459 \r\n3 7339 13579 13580 3460 \r\n3 9330 13581 13582 3461 \r\n3 13059 13583 13584 3462 \r\n3 13586 12330 13585 3463 \r\n3 13589 13587 13588 3464 \r\n3 13592 13590 13591 3465 \r\n3 13595 13593 13594 3466 \r\n3 5677 11319 12245 3467 \r\n3 13597 13596 9958 3468 \r\n3 13599 13598 6042 3469 \r\n3 8301 13600 7094 3470 \r\n3 13602 10332 13601 3471 \r\n3 9491 5590 13603 3472 \r\n3 11893 10862 13604 3473 \r\n3 13607 13605 13606 3474 \r\n3 13608 7029 12968 3475 \r\n3 13610 11106 13609 3476 \r\n3 13613 13611 13612 3477 \r\n3 13615 13614 12045 3478 \r\n3 12640 13616 13617 3479 \r\n3 13620 13618 13619 3480 \r\n3 7298 13621 11498 3481 \r\n3 13623 13622 6073 3482 \r\n3 10214 10810 13624 3483 \r\n3 13626 13625 11287 3484 \r\n3 8585 13627 9758 3485 \r\n3 13629 13628 12814 3486 \r\n3 13632 13630 13631 3487 \r\n3 13635 13633 13634 3488 \r\n3 13637 12869 13636 3489 \r\n3 13640 13638 13639 3490 \r\n3 13643 13641 13642 3491 \r\n3 13645 9639 13644 3492 \r\n3 13646 12395 9042 3493 \r\n3 13648 9289 13647 3494 \r\n3 13650 7620 13649 3495 \r\n3 13651 12656 7542 3496 \r\n3 8401 13652 9585 3497 \r\n3 13654 13653 11379 3498 \r\n3 13656 6536 13655 3499 \r\n3 13659 13657 13658 3500 \r\n3 11571 13660 13661 3501 \r\n3 13664 13662 13663 3502 \r\n3 13667 13665 13666 3503 \r\n3 13669 13668 9690 3504 \r\n3 13670 8385 11246 3505 \r\n3 13673 13671 13672 3506 \r\n3 13675 13674 12466 3507 \r\n3 13669 13676 13677 3508 \r\n3 13679 13620 13678 3509 \r\n3 5418 7656 13680 3510 \r\n3 13683 13681 13682 3511 \r\n3 13685 13684 7047 3512 \r\n3 13671 8077 13686 3513 \r\n3 13688 13687 10800 3514 \r\n3 13690 8552 13689 3515 \r\n3 13691 10602 8139 3516 \r\n3 6703 13692 13693 3517 \r\n3 13695 8004 13694 3518 \r\n3 9397 13696 13697 3519 \r\n3 13699 13698 9727 3520 \r\n3 8774 13700 6076 3521 \r\n3 12014 13701 13702 3522 \r\n3 13703 6974 12121 3523 \r\n3 13705 13704 6233 3524 \r\n3 13707 13033 13706 3525 \r\n3 11231 13468 13708 3526 \r\n3 10627 7016 6006 3527 \r\n3 13710 13709 11947 3528 \r\n3 13713 13711 13712 3529 \r\n3 13716 13714 13715 3530 \r\n3 13718 13717 10361 3531 \r\n3 13719 9008 5386 3532 \r\n3 13722 13720 13721 3533 \r\n3 6136 9087 13723 3534 \r\n3 13726 13724 13725 3535 \r\n3 13728 13727 12532 3536 \r\n3 5908 13729 13603 3537 \r\n3 13592 13118 13730 3538 \r\n3 13733 13731 13732 3539 \r\n3 13736 13734 13735 3540 \r\n3 8424 13737 13738 3541 \r\n3 13741 13739 13740 3542 \r\n3 13743 13742 5649 3543 \r\n3 13746 13744 13745 3544 \r\n3 7875 13747 13748 3545 \r\n3 11591 13749 13750 3546 \r\n3 13753 13751 13752 3547 \r\n3 13755 10285 13754 3548 \r\n3 11763 7421 13756 3549 \r\n3 13758 9609 13757 3550 \r\n3 10311 13759 13760 3551 \r\n3 13730 13761 13762 3552 \r\n3 9537 11813 13763 3553 \r\n3 11957 13764 10806 3554 \r\n3 8713 13765 13766 3555 \r\n3 13769 13767 13768 3556 \r\n3 13771 13770 11954 3557 \r\n3 13773 13772 12006 3558 \r\n3 13776 13774 13775 3559 \r\n3 13778 13777 7881 3560 \r\n3 5023 6645 13779 3561 \r\n3 13509 6647 12240 3562 \r\n3 13781 9238 13780 3563 \r\n3 13784 13782 13783 3564 \r\n3 13787 13785 13786 3565 \r\n3 13789 13788 12463 3566 \r\n3 13792 13790 13791 3567 \r\n3 13794 12870 13793 3568 \r\n3 9687 13795 13796 3569 \r\n3 6429 13797 13798 3570 \r\n3 13801 13799 13800 3571 \r\n3 12830 13802 10688 3572 \r\n3 13804 13803 6907 3573 \r\n3 13807 13805 13806 3574 \r\n3 13220 13808 7098 3575 \r\n3 13810 13164 13809 3576 \r\n3 13813 13811 13812 3577 \r\n3 13816 13814 13815 3578 \r\n3 5930 13817 8717 3579 \r\n3 13819 13818 8138 3580 \r\n3 13822 13820 13821 3581 \r\n3 8967 6358 9479 3582 \r\n3 13824 8047 13823 3583 \r\n3 13827 13825 13826 3584 \r\n3 13830 13828 13829 3585 \r\n3 13833 13831 13832 3586 \r\n3 7907 13834 5881 3587 \r\n3 11687 13835 9190 3588 \r\n3 13837 13836 12360 3589 \r\n3 13839 7597 13838 3590 \r\n3 13841 9683 13840 3591 \r\n3 9304 13842 13843 3592 \r\n3 13845 12813 13844 3593 \r\n3 11424 13846 8937 3594 \r\n3 13849 13847 13848 3595 \r\n3 13850 13037 13022 3596 \r\n3 13853 13851 13852 3597 \r\n3 13855 13854 6037 3598 \r\n3 13858 13856 13857 3599 \r\n3 11324 13859 13860 3600 \r\n3 13862 13534 13861 3601 \r\n3 9906 13863 13864 3602 \r\n3 13866 10103 13865 3603 \r\n3 13867 9495 6780 3604 \r\n3 13869 13868 10221 3605 \r\n3 13870 13729 12148 3606 \r\n3 13872 10613 13871 3607 \r\n3 13874 13873 12670 3608 \r\n3 5603 13875 13876 3609 \r\n3 13879 13877 13878 3610 \r\n3 13881 13880 11929 3611 \r\n3 13882 10074 11997 3612 \r\n3 13884 8822 13883 3613 \r\n3 13886 13885 7577 3614 \r\n3 13385 13887 13888 3615 \r\n3 7331 6410 13889 3616 \r\n3 13524 13890 13891 3617 \r\n3 13893 12915 13892 3618 \r\n3 11557 13894 13895 3619 \r\n3 5497 13896 13897 3620 \r\n3 13900 13898 13899 3621 \r\n3 13903 13901 13902 3622 \r\n3 13141 13904 13905 3623 \r\n3 13907 10555 13906 3624 \r\n3 13910 13908 13909 3625 \r\n3 9974 13911 13912 3626 \r\n3 13913 5711 5024 3627 \r\n3 13916 13914 13915 3628 \r\n3 13919 13917 13918 3629 \r\n3 13922 13920 13921 3630 \r\n3 13925 13923 13924 3631 \r\n3 13927 13690 13926 3632 \r\n3 13930 13928 13929 3633 \r\n3 13932 13931 8117 3634 \r\n3 13935 13933 13934 3635 \r\n3 11000 8202 13936 3636 \r\n3 13938 13937 11178 3637 \r\n3 13940 13939 9252 3638 \r\n3 13942 13941 11803 3639 \r\n3 12426 13943 9553 3640 \r\n3 13946 13944 13945 3641 \r\n3 13947 7458 5738 3642 \r\n3 13949 13490 13948 3643 \r\n3 13951 8041 13950 3644 \r\n3 13952 12082 9449 3645 \r\n3 9645 13953 13954 3646 \r\n3 13957 13955 13956 3647 \r\n3 5314 13958 13959 3648 \r\n3 13962 13960 13961 3649 \r\n3 13963 6837 9899 3650 \r\n3 12195 13476 13964 3651 \r\n3 13966 13965 10634 3652 \r\n3 9410 11078 13967 3653 \r\n3 13969 13968 13636 3654 \r\n3 9209 13970 13971 3655 \r\n3 8794 13972 6423 3656 \r\n3 13974 7961 13973 3657 \r\n3 13976 13975 10678 3658 \r\n3 12450 13977 13978 3659 \r\n3 13981 13979 13980 3660 \r\n3 13983 13028 13982 3661 \r\n3 13986 13984 13985 3662 \r\n3 13989 13987 13988 3663 \r\n3 7436 13990 13991 3664 \r\n3 13994 13992 13993 3665 \r\n3 13996 13995 7726 3666 \r\n3 10650 10006 10633 3667 \r\n3 13998 13997 13889 3668 \r\n3 14000 13999 11572 3669 \r\n3 11962 14001 14002 3670 \r\n3 14004 14003 9103 3671 \r\n3 14005 11228 13408 3672 \r\n3 14007 14006 11921 3673 \r\n3 14009 8840 14008 3674 \r\n3 12773 11049 14010 3675 \r\n3 14013 14011 14012 3676 \r\n3 14016 14014 14015 3677 \r\n3 14018 14017 12246 3678 \r\n3 14019 10124 8813 3679 \r\n3 11873 14020 14021 3680 \r\n3 11446 13052 14022 3681 \r\n3 14024 14023 5022 3682 \r\n3 12033 6131 14025 3683 \r\n3 14027 14026 8187 3684 \r\n3 6989 14028 14029 3685 \r\n3 12120 13372 6951 3686 \r\n3 10119 13793 7665 3687 \r\n3 14032 14030 14031 3688 \r\n3 11663 14033 7789 3689 \r\n3 14035 9287 14034 3690 \r\n3 14037 12940 14036 3691 \r\n3 9420 14038 14039 3692 \r\n3 14041 14040 10377 3693 \r\n3 7854 12400 14042 3694 \r\n3 14044 10164 14043 3695 \r\n3 14047 14045 14046 3696 \r\n3 14048 12591 11277 3697 \r\n3 14051 14049 14050 3698 \r\n3 6182 14052 13474 3699 \r\n3 14054 5716 14053 3700 \r\n3 14056 14055 6105 3701 \r\n3 12255 14057 14058 3702 \r\n3 14061 14059 14060 3703 \r\n3 14062 9428 8594 3704 \r\n3 14064 9920 14063 3705 \r\n3 14065 11721 11733 3706 \r\n3 14067 14066 11665 3707 \r\n3 14069 14068 12435 3708 \r\n3 14071 7241 14070 3709 \r\n3 13436 13353 14072 3710 \r\n3 14075 14073 14074 3711 \r\n3 8305 5267 14076 3712 \r\n3 14078 5054 14077 3713 \r\n3 14080 14079 12217 3714 \r\n3 14083 14081 14082 3715 \r\n3 14085 14084 11459 3716 \r\n3 9370 14086 14087 3717 \r\n3 8086 9955 8655 3718 \r\n3 11376 14088 14089 3719 \r\n3 6840 14090 14091 3720 \r\n3 14094 14092 14093 3721 \r\n3 14097 14095 14096 3722 \r\n3 12916 14098 14099 3723 \r\n3 14101 12136 14100 3724 \r\n3 14104 14102 14103 3725 \r\n3 14106 7028 14105 3726 \r\n3 14109 14107 14108 3727 \r\n3 6533 14110 8567 3728 \r\n3 14112 14111 8909 3729 \r\n3 9628 12009 14113 3730 \r\n3 14115 7318 14114 3731 \r\n3 14117 14116 10914 3732 \r\n3 14119 14118 13850 3733 \r\n3 14121 9199 14120 3734 \r\n3 14124 14122 14123 3735 \r\n3 8321 14125 6492 3736 \r\n3 14127 14126 13901 3737 \r\n3 14130 14128 14129 3738 \r\n3 14133 14131 14132 3739 \r\n3 14135 14134 12065 3740 \r\n3 14138 14136 14137 3741 \r\n3 14139 11666 12417 3742 \r\n3 14142 14140 14141 3743 \r\n3 14081 14143 7766 3744 \r\n3 14144 10319 8466 3745 \r\n3 12617 8651 14145 3746 \r\n3 12559 5689 14146 3747 \r\n3 13721 14147 14148 3748 \r\n3 8410 14149 14150 3749 \r\n3 11299 14151 11639 3750 \r\n3 14153 14152 10604 3751 \r\n3 14155 14154 7965 3752 \r\n3 14157 8656 14156 3753 \r\n3 11936 14158 9276 3754 \r\n3 14160 13249 14159 3755 \r\n3 14163 14161 14162 3756 \r\n3 14166 14164 14165 3757 \r\n3 11275 14167 13422 3758 \r\n3 14170 14168 14169 3759 \r\n3 14173 14171 14172 3760 \r\n3 13306 14174 10750 3761 \r\n3 5184 8812 13189 3762 \r\n3 14176 9865 14175 3763 \r\n3 14179 14177 14178 3764 \r\n3 8132 14180 14181 3765 \r\n3 14184 14182 14183 3766 \r\n3 14187 14185 14186 3767 \r\n3 11374 14188 14189 3768 \r\n3 9298 14190 14191 3769 \r\n3 14193 5446 14192 3770 \r\n3 14194 5585 12337 3771 \r\n3 14197 14195 14196 3772 \r\n3 14200 14198 14199 3773 \r\n3 6032 10592 14201 3774 \r\n3 5387 14202 10236 3775 \r\n3 14205 14203 14204 3776 \r\n3 14206 6787 7169 3777 \r\n3 10815 10402 8177 3778 \r\n3 11232 14207 14208 3779 \r\n3 14211 14209 14210 3780 \r\n3 9582 14212 14213 3781 \r\n3 14215 14214 8915 3782 \r\n3 12313 13752 14216 3783 \r\n3 14219 14217 14218 3784 \r\n3 12994 14220 14221 3785 \r\n3 14223 14222 7437 3786 \r\n3 14224 13827 8638 3787 \r\n3 14227 14225 14226 3788 \r\n3 11252 14228 12811 3789 \r\n3 14230 11469 14229 3790 \r\n3 12041 14231 14232 3791 \r\n3 10337 14233 13921 3792 \r\n3 14234 6601 14072 3793 \r\n3 14012 8726 7849 3794 \r\n3 14237 14235 14236 3795 \r\n3 8796 7141 12382 3796 \r\n3 12128 14238 14239 3797 \r\n3 13197 14240 14241 3798 \r\n3 14244 14242 14243 3799 \r\n3 14246 8627 14245 3800 \r\n3 6775 14247 14248 3801 \r\n3 14251 14249 14250 3802 \r\n3 14254 14252 14253 3803 \r\n3 12618 14255 7832 3804 \r\n3 13562 14256 9819 3805 \r\n3 6540 14257 14258 3806 \r\n3 14260 14259 6452 3807 \r\n3 14261 11037 7950 3808 \r\n3 14264 14262 14263 3809 \r\n3 14266 5900 14265 3810 \r\n3 14255 14267 14268 3811 \r\n3 5628 14022 14269 3812 \r\n3 14270 10174 13746 3813 \r\n3 14272 6478 14271 3814 \r\n3 14275 14273 14274 3815 \r\n3 8274 5162 14276 3816 \r\n3 14210 14277 14278 3817 \r\n3 14281 14279 14280 3818 \r\n3 6608 14282 12876 3819 \r\n3 14284 10330 14283 3820 \r\n3 14287 14285 14286 3821 \r\n3 14290 14288 14289 3822 \r\n3 14292 14291 13228 3823 \r\n3 14293 13989 7909 3824 \r\n3 9676 9990 14294 3825 \r\n3 14296 9850 14295 3826 \r\n3 14299 14297 14298 3827 \r\n3 14301 14300 9719 3828 \r\n3 10796 14302 14303 3829 \r\n3 14306 14304 14305 3830 \r\n3 14309 14307 14308 3831 \r\n3 14311 14310 7555 3832 \r\n3 14312 12913 13421 3833 \r\n3 14314 10490 14313 3834 \r\n3 14316 14315 8980 3835 \r\n3 14318 14317 12327 3836 \r\n3 14319 10001 11033 3837 \r\n3 13546 12956 14320 3838 \r\n3 14321 9074 9571 3839 \r\n3 14324 14322 14323 3840 \r\n3 14326 14325 13999 3841 \r\n3 14329 14327 14328 3842 \r\n3 14332 14330 14331 3843 \r\n3 14335 14333 14334 3844 \r\n3 14338 14336 14337 3845 \r\n3 14340 6841 14339 3846 \r\n3 14341 9077 8945 3847 \r\n3 14342 12483 8772 3848 \r\n3 9726 14343 14344 3849 \r\n3 14020 14345 14346 3850 \r\n3 14349 14347 14348 3851 \r\n3 13146 12474 14350 3852 \r\n3 14353 14351 14352 3853 \r\n3 14355 14354 11060 3854 \r\n3 14358 14356 14357 3855 \r\n3 13444 7333 12989 3856 \r\n3 14361 14359 14360 3857 \r\n3 13899 5556 8709 3858 \r\n3 14303 14362 14363 3859 \r\n3 5751 14364 14365 3860 \r\n3 14368 14366 14367 3861 \r\n3 14371 14369 14370 3862 \r\n3 14374 14372 14373 3863 \r\n3 6591 14375 14376 3864 \r\n3 14378 14377 5679 3865 \r\n3 13812 9668 14379 3866 \r\n3 10028 14380 14381 3867 \r\n3 6755 10929 8797 3868 \r\n3 11064 7065 14382 3869 \r\n3 14384 13134 14383 3870 \r\n3 11322 14385 13787 3871 \r\n3 14387 13194 14386 3872 \r\n3 13895 14388 14389 3873 \r\n3 14390 7731 9881 3874 \r\n3 14393 14391 14392 3875 \r\n3 11866 14394 14395 3876 \r\n3 14398 14396 14397 3877 \r\n3 13990 14399 14400 3878 \r\n3 14402 14401 6365 3879 \r\n3 8610 14403 14404 3880 \r\n3 7734 13211 11714 3881 \r\n3 14407 14405 14406 3882 \r\n3 14410 14408 14409 3883 \r\n3 14413 14411 14412 3884 \r\n3 10107 9610 14414 3885 \r\n3 8744 14415 14416 3886 \r\n3 14417 13540 11262 3887 \r\n3 14420 14418 14419 3888 \r\n3 14423 14421 14422 3889 \r\n3 14426 14424 14425 3890 \r\n3 14428 12693 14427 3891 \r\n3 13984 14429 8226 3892 \r\n3 14430 13771 6715 3893 \r\n3 13205 7398 14236 3894 \r\n3 7817 14431 6146 3895 \r\n3 13645 13471 14432 3896 \r\n3 14434 7772 14433 3897 \r\n3 9334 11725 14435 3898 \r\n3 14438 14436 14437 3899 \r\n3 14440 13578 14439 3900 \r\n3 13362 14441 14442 3901 \r\n3 14445 14443 14444 3902 \r\n3 14448 14446 14447 3903 \r\n3 14450 14449 5244 3904 \r\n3 10347 14451 14452 3905 \r\n3 14453 6830 7604 3906 \r\n3 14455 14454 5057 3907 \r\n3 14458 14456 14457 3908 \r\n3 14460 11024 14459 3909 \r\n3 14463 14461 14462 3910 \r\n3 11759 14464 5316 3911 \r\n3 13591 12455 14465 3912 \r\n3 12150 14466 14467 3913 \r\n3 14468 11746 14207 3914 \r\n3 9075 14469 14470 3915 \r\n3 5565 14471 14472 3916 \r\n3 14475 14473 14474 3917 \r\n3 14477 14476 13252 3918 \r\n3 7404 14478 8646 3919 \r\n3 14480 6278 14479 3920 \r\n3 14483 14481 14482 3921 \r\n3 14485 9621 14484 3922 \r\n3 14487 13132 14486 3923 \r\n3 14488 12452 13716 3924 \r\n3 14490 14489 8219 3925 \r\n3 14492 14491 14306 3926 \r\n3 12155 8085 8711 3927 \r\n3 13631 13715 13763 3928 \r\n3 14495 14493 14494 3929 \r\n3 14497 14496 10915 3930 \r\n3 13818 14498 14499 3931 \r\n3 14502 14500 14501 3932 \r\n3 10098 8318 5427 3933 \r\n3 10823 14503 14504 3934 \r\n3 10606 12175 5766 3935 \r\n3 14506 12340 14505 3936 \r\n3 6085 8382 13791 3937 \r\n3 14508 5626 14507 3938 \r\n3 14509 5347 12826 3939 \r\n3 6264 14510 14511 3940 \r\n3 14514 14512 14513 3941 \r\n3 14515 10349 11320 3942 \r\n3 14517 8411 14516 3943 \r\n3 14520 14518 14519 3944 \r\n3 6240 14521 9579 3945 \r\n3 14523 9290 14522 3946 \r\n3 14526 14524 14525 3947 \r\n3 11514 13296 11388 3948 \r\n3 14528 9293 14527 3949 \r\n3 11904 14529 14530 3950 \r\n3 14532 14531 13932 3951 \r\n3 14534 10531 14533 3952 \r\n3 14537 14535 14536 3953 \r\n3 6443 5736 11701 3954 \r\n3 14540 14538 14539 3955 \r\n3 6524 11007 10052 3956 \r\n3 10703 12156 12170 3957 \r\n3 14543 14541 14542 3958 \r\n3 14546 14544 14545 3959 \r\n3 14548 8404 14547 3960 \r\n3 14550 14549 10667 3961 \r\n3 14552 14080 14551 3962 \r\n3 14555 14553 14554 3963 \r\n3 13496 12079 6098 3964 \r\n3 14558 14556 14557 3965 \r\n3 14559 5037 9313 3966 \r\n3 14562 14560 14561 3967 \r\n3 14564 10588 14563 3968 \r\n3 14264 14565 7550 3969 \r\n3 14568 14566 14567 3970 \r\n3 13928 14569 14570 3971 \r\n3 14572 14571 6162 3972 \r\n3 14574 14573 13181 3973 \r\n3 14577 14575 14576 3974 \r\n3 7346 5163 10820 3975 \r\n3 9382 14578 13158 3976 \r\n3 14581 14579 14580 3977 \r\n3 14267 10157 14582 3978 \r\n3 14585 14583 14584 3979 \r\n3 14587 14586 8647 3980 \r\n3 14589 14588 13705 3981 \r\n3 10497 14590 5966 3982 \r\n3 14592 14591 12386 3983 \r\n3 14124 14593 14228 3984 \r\n3 14595 9462 14594 3985 \r\n3 14597 14596 5800 3986 \r\n3 13155 10016 14598 3987 \r\n3 14600 14599 12872 3988 \r\n3 14603 14601 14602 3989 \r\n3 14604 9997 10468 3990 \r\n3 14607 14605 14606 3991 \r\n3 14427 14608 9671 3992 \r\n3 14610 14609 14233 3993 \r\n3 14612 14611 8458 3994 \r\n3 14110 13213 14613 3995 \r\n3 14615 12361 14614 3996 \r\n3 5845 14616 13940 3997 \r\n3 12047 14617 11442 3998 \r\n3 14620 14618 14619 3999 \r\n3 14622 14621 7645 4000 \r\n3 14624 5419 14623 4001 \r\n3 14627 14625 14626 4002 \r\n3 8098 14628 14629 4003 \r\n3 14631 14630 11735 4004 \r\n3 5804 14632 14633 4005 \r\n3 14636 14634 14635 4006 \r\n3 13119 14637 14638 4007 \r\n3 9020 14450 14639 4008 \r\n3 10912 11011 13039 4009 \r\n3 10173 14640 14641 4010 \r\n3 7480 14642 14643 4011 \r\n3 14645 14644 11761 4012 \r\n3 14125 14646 14647 4013 \r\n3 12188 14648 14649 4014 \r\n3 14652 14650 14651 4015 \r\n3 11258 5546 11334 4016 \r\n3 11913 9127 11664 4017 \r\n3 12889 14653 14654 4018 \r\n3 14657 14655 14656 4019 \r\n3 14659 11077 14658 4020 \r\n3 14662 14660 14661 4021 \r\n3 14664 9568 14663 4022 \r\n3 14667 14665 14666 4023 \r\n3 14670 14668 14669 4024 \r\n3 12019 14671 14672 4025 \r\n3 6689 7375 14673 4026 \r\n3 14676 14674 14675 4027 \r\n3 7551 14677 14678 4028 \r\n3 8222 14679 14680 4029 \r\n3 14683 14681 14682 4030 \r\n3 14686 14684 14685 4031 \r\n3 14688 6912 14687 4032 \r\n3 12190 14689 5463 4033 \r\n3 9869 14690 14691 4034 \r\n3 14693 14692 8232 4035 \r\n3 14695 8433 14694 4036 \r\n3 14698 14696 14697 4037 \r\n3 14700 14556 14699 4038 \r\n3 14702 14701 13954 4039 \r\n3 14704 14703 9697 4040 \r\n3 14706 13577 14705 4041 \r\n3 13693 14707 9886 4042 \r\n3 14710 14708 14709 4043 \r\n3 14713 14711 14712 4044 \r\n3 14715 7630 14714 4045 \r\n3 14717 7170 14716 4046 \r\n3 14720 14718 14719 4047 \r\n3 14723 14721 14722 4048 \r\n3 14725 8217 14724 4049 \r\n3 14727 14726 11399 4050 \r\n3 5292 14728 12999 4051 \r\n3 14730 14729 5951 4052 \r\n3 7282 13925 14731 4053 \r\n3 14733 6122 14732 4054 \r\n3 14735 14734 14193 4055 \r\n3 9960 14736 14737 4056 \r\n3 14740 14738 14739 4057 \r\n3 9035 14446 14741 4058 \r\n3 13710 14742 5858 4059 \r\n3 14158 9450 9637 4060 \r\n3 14745 14743 14744 4061 \r\n3 14747 5365 14746 4062 \r\n3 14748 10397 6406 4063 \r\n3 7431 14749 9098 4064 \r\n3 8856 5062 14750 4065 \r\n3 14752 14751 13709 4066 \r\n3 14754 14753 8496 4067 \r\n3 8643 14755 14756 4068 \r\n3 14759 14757 14758 4069 \r\n3 14761 14760 14434 4070 \r\n3 14764 14762 14763 4071 \r\n3 14766 14765 9475 4072 \r\n3 14767 13414 7951 4073 \r\n3 14769 12820 14768 4074 \r\n3 5504 14770 7104 4075 \r\n3 14773 14771 14772 4076 \r\n3 14775 14774 9225 4077 \r\n3 14778 14776 14777 4078 \r\n3 14494 13332 14779 4079 \r\n3 14782 14780 14781 4080 \r\n3 9987 7288 14783 4081 \r\n3 6582 8133 12180 4082 \r\n3 8058 14784 10323 4083 \r\n3 14787 14785 14786 4084 \r\n3 14788 11429 10725 4085 \r\n3 14790 14789 11164 4086 \r\n3 14791 10315 5102 4087 \r\n3 14793 14792 5063 4088 \r\n3 14794 9115 10669 4089 \r\n3 8871 6861 7149 4090 \r\n3 14796 14795 7445 4091 \r\n3 10996 7091 14797 4092 \r\n3 14800 14798 14799 4093 \r\n3 14802 13123 14801 4094 \r\n3 10511 9710 14803 4095 \r\n3 14806 14804 14805 4096 \r\n3 14809 14807 14808 4097 \r\n3 10784 11051 5458 4098 \r\n3 14812 14810 14811 4099 \r\n3 14814 11864 14813 4100 \r\n3 6368 11558 6713 4101 \r\n3 13783 8072 14815 4102 \r\n3 14818 14816 14817 4103 \r\n3 12012 14819 14820 4104 \r\n3 6866 12130 14821 4105 \r\n3 14822 11907 8214 4106 \r\n3 12795 14823 14824 4107 \r\n3 10093 14825 14218 4108 \r\n3 14827 10543 14826 4109 \r\n3 13469 13317 14828 4110 \r\n3 10501 14829 14830 4111 \r\n3 14832 14831 11736 4112 \r\n3 14834 14787 14833 4113 \r\n3 14836 7440 14835 4114 \r\n3 6595 14837 5240 4115 \r\n3 14839 14838 14256 4116 \r\n3 14842 14840 14841 4117 \r\n3 14844 14843 7906 4118 \r\n3 14847 14845 14846 4119 \r\n3 14849 14848 11661 4120 \r\n3 12953 14850 6285 4121 \r\n3 5682 14851 6482 4122 \r\n3 6379 8019 7662 4123 \r\n3 14852 8336 7349 4124 \r\n3 14854 5756 14853 4125 \r\n3 9211 6244 7668 4126 \r\n3 14856 14855 5369 4127 \r\n3 14858 14857 14393 4128 \r\n3 14860 14859 12127 4129 \r\n3 14862 14861 11945 4130 \r\n3 13243 14863 14864 4131 \r\n3 14867 14865 14866 4132 \r\n3 5309 10965 14868 4133 \r\n3 14870 14869 13598 4134 \r\n3 14873 14871 14872 4135 \r\n3 14876 14874 14875 4136 \r\n3 5169 14877 14878 4137 \r\n3 14880 14879 6416 4138 \r\n3 14882 14881 13453 4139 \r\n3 14884 14883 10651 4140 \r\n3 14885 12975 5723 4141 \r\n3 14888 14886 14887 4142 \r\n3 14891 14889 14890 4143 \r\n3 8095 14892 14893 4144 \r\n3 8944 14894 11698 4145 \r\n3 14896 10253 14895 4146 \r\n3 14899 14897 14898 4147 \r\n3 12636 14900 13970 4148 \r\n3 6460 14660 14901 4149 \r\n3 14903 14902 9137 4150 \r\n3 14904 5916 11986 4151 \r\n3 14907 14905 14906 4152 \r\n3 13828 14908 14909 4153 \r\n3 10854 14910 14911 4154 \r\n3 14912 7441 10677 4155 \r\n3 14913 12062 14701 4156 \r\n3 14629 14914 14915 4157 \r\n3 14917 14916 14177 4158 \r\n3 13857 13883 5939 4159 \r\n3 14918 10009 14633 4160 \r\n3 14921 14919 14920 4161 \r\n3 12821 14922 13379 4162 \r\n3 14925 14923 14924 4163 \r\n3 14926 11378 14229 4164 \r\n3 14928 14927 10245 4165 \r\n3 14931 14929 14930 4166 \r\n3 14932 5464 8766 4167 \r\n3 13975 10380 6367 4168 \r\n3 14934 14933 14270 4169 \r\n3 14936 14935 13097 4170 \r\n3 14939 14937 14938 4171 \r\n3 14941 7255 14940 4172 \r\n3 14943 7026 14942 4173 \r\n3 13360 7741 14944 4174 \r\n3 14947 14945 14946 4175 \r\n3 11829 6124 14948 4176 \r\n3 12661 13816 7919 4177 \r\n3 14950 10594 14949 4178 \r\n3 8272 14951 14461 4179 \r\n3 14953 9554 14952 4180 \r\n3 14955 14954 6652 4181 \r\n3 14730 11610 12110 4182 \r\n3 14956 7873 10184 4183 \r\n3 14959 14957 14958 4184 \r\n3 14961 11787 14960 4185 \r\n3 14963 9843 14962 4186 \r\n3 14966 14964 14965 4187 \r\n3 14969 14967 14968 4188 \r\n3 14972 14970 14971 4189 \r\n3 14974 8642 14973 4190 \r\n3 13089 14975 7916 4191 \r\n3 14976 8676 11993 4192 \r\n3 14979 14977 14978 4193 \r\n3 14982 14980 14981 4194 \r\n3 14984 14983 6529 4195 \r\n3 12427 14985 14636 4196 \r\n3 10148 13325 7384 4197 \r\n3 10209 14986 9633 4198 \r\n3 14987 12256 6355 4199 \r\n3 14989 6376 14988 4200 \r\n3 13369 14990 10407 4201 \r\n3 14993 14991 14992 4202 \r\n3 7066 14994 14995 4203 \r\n3 14998 14996 14997 4204 \r\n3 15001 14999 15000 4205 \r\n3 15004 15002 15003 4206 \r\n3 15005 5559 5576 4207 \r\n3 15007 13736 15006 4208 \r\n3 15010 15008 15009 4209 \r\n3 10343 6918 11753 4210 \r\n3 15012 15011 7389 4211 \r\n3 12602 15013 15014 4212 \r\n3 15017 15015 15016 4213 \r\n3 15019 8334 15018 4214 \r\n3 12556 12300 13171 4215 \r\n3 12164 7897 9010 4216 \r\n3 13934 15020 15021 4217 \r\n3 6497 10843 15022 4218 \r\n3 15024 15023 8431 4219 \r\n3 11492 10158 15025 4220 \r\n3 15027 13738 15026 4221 \r\n3 15030 15028 15029 4222 \r\n3 15032 15031 11122 4223 \r\n3 15034 12779 15033 4224 \r\n3 15037 15035 15036 4225 \r\n3 15040 15038 15039 4226 \r\n3 11367 15041 15042 4227 \r\n3 12339 5476 15043 4228 \r\n3 15045 9226 15044 4229 \r\n3 8731 15046 15047 4230 \r\n3 11159 6916 12918 4231 \r\n3 15050 15048 15049 4232 \r\n3 15053 15051 15052 4233 \r\n3 11330 9912 5130 4234 \r\n3 14349 15054 15055 4235 \r\n3 13849 14391 15056 4236 \r\n3 15058 12809 15057 4237 \r\n3 15060 9945 15059 4238 \r\n3 15063 15061 15062 4239 \r\n3 7350 12088 15064 4240 \r\n3 15066 14865 15065 4241 \r\n3 14855 8180 15067 4242 \r\n3 11510 8778 15068 4243 \r\n3 15070 9534 15069 4244 \r\n3 15071 8615 13727 4245 \r\n3 13071 15072 11140 4246 \r\n3 6805 15073 15074 4247 \r\n3 11649 6112 15075 4248 \r\n3 15077 14553 15076 4249 \r\n3 15079 9891 15078 4250 \r\n3 9852 15080 15081 4251 \r\n3 15083 15082 14387 4252 \r\n3 10801 13917 15084 4253 \r\n3 12841 14045 13120 4254 \r\n3 15085 5801 8225 4255 \r\n3 15087 15086 12699 4256 \r\n3 11634 15088 15089 4257 \r\n3 7360 15090 15091 4258 \r\n3 15094 15092 15093 4259 \r\n3 7937 11079 15095 4260 \r\n3 7837 15096 15097 4261 \r\n3 15098 5905 13885 4262 \r\n3 7920 15099 15100 4263 \r\n3 6184 15052 15101 4264 \r\n3 15103 15102 8994 4265 \r\n3 15105 15104 11810 4266 \r\n3 15107 11482 15106 4267 \r\n3 15109 11991 15108 4268 \r\n3 9242 14160 13821 4269 \r\n3 11505 10992 15110 4270 \r\n3 15112 15111 9429 4271 \r\n3 15114 13803 15113 4272 \r\n3 15117 15115 15116 4273 \r\n3 12866 11898 15118 4274 \r\n3 15120 7061 15119 4275 \r\n3 15122 15121 12354 4276 \r\n3 5021 12653 15123 4277 \r\n3 15125 14271 15124 4278 \r\n3 15127 6966 15126 4279 \r\n3 9404 15128 15129 4280 \r\n3 15131 12139 15130 4281 \r\n3 15132 8090 6846 4282 \r\n3 15134 15133 12768 4283 \r\n3 6488 15135 7214 4284 \r\n3 15136 11782 9066 4285 \r\n3 15139 15137 15138 4286 \r\n3 12919 11595 15140 4287 \r\n3 5709 15141 15142 4288 \r\n3 14276 12253 14194 4289 \r\n3 15144 15143 10120 4290 \r\n3 15145 13464 11644 4291 \r\n3 15147 12380 15146 4292 \r\n3 15150 15148 15149 4293 \r\n3 15152 9328 15151 4294 \r\n3 5525 10291 15153 4295 \r\n3 8281 10653 15154 4296 \r\n3 10225 15155 15156 4297 \r\n3 10210 9944 15157 4298 \r\n3 9499 12595 9141 4299 \r\n3 15160 15158 15159 4300 \r\n3 6461 15161 8309 4301 \r\n3 7454 15162 15163 4302 \r\n3 7539 15164 15165 4303 \r\n3 11932 15166 15167 4304 \r\n3 15169 15168 9767 4305 \r\n3 15171 14358 15170 4306 \r\n3 15174 15172 15173 4307 \r\n3 15176 15175 12936 4308 \r\n3 11871 9310 15177 4309 \r\n3 15179 7715 15178 4310 \r\n3 15182 15180 15181 4311 \r\n3 8166 15183 15184 4312 \r\n3 15186 11063 15185 4313 \r\n3 13852 15187 15188 4314 \r\n3 15190 15189 9168 4315 \r\n3 15192 11620 15191 4316 \r\n3 15193 5890 12029 4317 \r\n3 7087 15194 15195 4318 \r\n3 9596 15196 15197 4319 \r\n3 15199 15198 14996 4320 \r\n3 13080 15200 14308 4321 \r\n3 15203 15201 15202 4322 \r\n3 15206 15204 15205 4323 \r\n3 15208 15207 10482 4324 \r\n3 8788 15209 15210 4325 \r\n3 13758 15211 15212 4326 \r\n3 15215 15213 15214 4327 \r\n3 10921 15216 15217 4328 \r\n3 15219 15218 5164 4329 \r\n3 15222 15220 15221 4330 \r\n3 15225 15223 15224 4331 \r\n3 12527 13689 12488 4332 \r\n3 15227 15226 13310 4333 \r\n3 15230 15228 15229 4334 \r\n3 11048 15231 11516 4335 \r\n3 15233 10626 15232 4336 \r\n3 15236 15234 15235 4337 \r\n3 14853 15237 15238 4338 \r\n3 15239 5813 8887 4339 \r\n3 15242 15240 15241 4340 \r\n3 10564 15243 15244 4341 \r\n3 5263 15245 15246 4342 \r\n3 13299 9560 15247 4343 \r\n3 15249 11523 15248 4344 \r\n3 11036 15250 15251 4345 \r\n3 14859 5392 15252 4346 \r\n3 6195 15253 15254 4347 \r\n3 15257 15255 15256 4348 \r\n3 15259 12610 15258 4349 \r\n3 11655 15260 15261 4350 \r\n3 15262 6302 13565 4351 \r\n3 15264 15263 5954 4352 \r\n3 15266 9352 15265 4353 \r\n3 15268 15267 8253 4354 \r\n3 5566 8727 10333 4355 \r\n3 11483 11501 9463 4356 \r\n3 15271 15269 15270 4357 \r\n3 15273 7714 15272 4358 \r\n3 15274 13063 11713 4359 \r\n3 11797 15275 12281 4360 \r\n3 15276 12051 7993 4361 \r\n3 11626 5781 12613 4362 \r\n3 7341 15277 15278 4363 \r\n3 5685 7263 15279 4364 \r\n3 13700 15280 14795 4365 \r\n3 15282 15281 11368 4366 \r\n3 8173 13354 15283 4367 \r\n3 15285 9089 15284 4368 \r\n3 15288 15286 15287 4369 \r\n3 15289 7638 10282 4370 \r\n3 15290 10813 8345 4371 \r\n3 8199 15291 14368 4372 \r\n3 15294 15292 15293 4373 \r\n3 15296 9558 15295 4374 \r\n3 15298 14997 15297 4375 \r\n3 8286 5589 15299 4376 \r\n3 11204 9253 15300 4377 \r\n3 12376 15301 15302 4378 \r\n3 5893 15303 15304 4379 \r\n3 14248 13128 12409 4380 \r\n3 15306 15305 8515 4381 \r\n3 15307 6251 8361 4382 \r\n3 5973 15308 15309 4383 \r\n3 15312 15310 15311 4384 \r\n3 10966 15313 15314 4385 \r\n3 14011 12116 15315 4386 \r\n3 11214 5258 14568 4387 \r\n3 15318 15316 15317 4388 \r\n3 15320 13330 15319 4389 \r\n3 15322 15321 9086 4390 \r\n3 9655 15323 15324 4391 \r\n3 6820 11574 14933 4392 \r\n3 15325 14039 10145 4393 \r\n3 15327 14224 15326 4394 \r\n3 12757 15328 11521 4395 \r\n3 15329 11153 11675 4396 \r\n3 15332 15330 15331 4397 \r\n3 15334 10908 15333 4398 \r\n3 15335 11052 14725 4399 \r\n3 15338 15336 15337 4400 \r\n3 15341 15339 15340 4401 \r\n3 9104 15342 15343 4402 \r\n3 15345 15344 11065 4403 \r\n3 15348 15346 15347 4404 \r\n3 6592 15349 12898 4405 \r\n3 15351 15350 13279 4406 \r\n3 13726 15352 8298 4407 \r\n3 6620 15353 15354 4408 \r\n3 5665 15355 13313 4409 \r\n3 15357 15356 10077 4410 \r\n3 15164 15358 15359 4411 \r\n3 6976 12469 10228 4412 \r\n3 15361 13703 15360 4413 \r\n3 9367 6708 14924 4414 \r\n3 15364 15362 15363 4415 \r\n3 15366 5411 15365 4416 \r\n3 15369 15367 15368 4417 \r\n3 15372 15370 15371 4418 \r\n3 5137 15373 12834 4419 \r\n3 7788 15374 8155 4420 \r\n3 10062 15375 15376 4421 \r\n3 7933 15377 11745 4422 \r\n3 13454 14531 6832 4423 \r\n3 10773 15378 11363 4424 \r\n3 7167 15379 14370 4425 \r\n3 6853 14084 15380 4426 \r\n3 15382 6943 15381 4427 \r\n3 10412 15383 15162 4428 \r\n3 14999 7636 15384 4429 \r\n3 15387 15385 15386 4430 \r\n3 15389 12282 15388 4431 \r\n3 10829 15083 15390 4432 \r\n3 15391 7003 8730 4433 \r\n3 15392 15101 6668 4434 \r\n3 8984 6946 15393 4435 \r\n3 15395 9541 15394 4436 \r\n3 10420 15396 15397 4437 \r\n3 15398 9838 7842 4438 \r\n3 9962 15399 15400 4439 \r\n3 15402 15401 7279 4440 \r\n3 8474 15403 7735 4441 \r\n3 15405 7393 15404 4442 \r\n3 15408 15406 15407 4443 \r\n3 15411 15409 15410 4444 \r\n3 15414 15412 15413 4445 \r\n3 15417 15415 15416 4446 \r\n3 15178 15418 15419 4447 \r\n3 15420 10491 9336 4448 \r\n3 13295 15421 14159 4449 \r\n3 5854 15422 15423 4450 \r\n3 15426 15424 15425 4451 \r\n3 14344 15427 15428 4452 \r\n3 15145 15429 15430 4453 \r\n3 15431 13057 9673 4454 \r\n3 15434 15432 15433 4455 \r\n3 15436 14897 15435 4456 \r\n3 15438 11909 15437 4457 \r\n3 15440 15439 10362 4458 \r\n3 11979 15441 13212 4459 \r\n3 11296 15442 9085 4460 \r\n3 15444 11619 15443 4461 \r\n3 15447 15445 15446 4462 \r\n3 14745 15448 15449 4463 \r\n3 15451 14511 15450 4464 \r\n3 6710 15452 10303 4465 \r\n3 15454 7688 15453 4466 \r\n3 15455 14462 5438 4467 \r\n3 15458 15456 15457 4468 \r\n3 15460 13627 15459 4469 \r\n3 10181 15461 15462 4470 \r\n3 13475 15463 15464 4471 \r\n3 15467 15465 15466 4472 \r\n3 15470 15468 15469 4473 \r\n3 9515 5763 8759 4474 \r\n3 15472 6624 15471 4475 \r\n3 11349 14590 15444 4476 \r\n3 15474 15473 5793 4477 \r\n3 15476 15475 7157 4478 \r\n3 7949 15477 5167 4479 \r\n3 5117 12265 15478 4480 \r\n3 15481 15479 15480 4481 \r\n3 15482 6575 6369 4482 \r\n3 6092 15483 15484 4483 \r\n3 11101 5076 15485 4484 \r\n3 8068 13829 6114 4485 \r\n3 15487 15486 9757 4486 \r\n3 15488 13154 9100 4487 \r\n3 14298 10248 15489 4488 \r\n3 6568 15362 9918 4489 \r\n3 15491 15490 7426 4490 \r\n3 15493 15492 6235 4491 \r\n3 15494 11760 11793 4492 \r\n3 14618 14676 10484 4493 \r\n3 7427 8163 15495 4494 \r\n3 15496 9266 5824 4495 \r\n3 15499 15497 15498 4496 \r\n3 8332 15500 15501 4497 \r\n3 15503 14493 15502 4498 \r\n3 10069 15504 15505 4499 \r\n3 9097 15506 7432 4500 \r\n3 15507 8902 5754 4501 \r\n3 12390 15508 15509 4502 \r\n3 13144 15510 13914 4503 \r\n3 15512 15511 12283 4504 \r\n3 14173 15513 15514 4505 \r\n3 15517 15515 15516 4506 \r\n3 15520 15518 15519 4507 \r\n3 15522 12733 15521 4508 \r\n3 15525 15523 15524 4509 \r\n3 15527 15526 6717 4510 \r\n3 11069 15528 15529 4511 \r\n3 15531 7395 15530 4512 \r\n3 15533 15532 13084 4513 \r\n3 12701 12807 15534 4514 \r\n3 15536 15535 14584 4515 \r\n3 7986 14093 5483 4516 \r\n3 15539 15537 15538 4517 \r\n3 10063 15540 15541 4518 \r\n3 15543 15542 12934 4519 \r\n3 15545 14337 15544 4520 \r\n3 15546 14916 10503 4521 \r\n3 15548 15547 11821 4522 \r\n3 15261 15549 15550 4523 \r\n3 15552 14506 15551 4524 \r\n3 15555 15553 15554 4525 \r\n3 15558 15556 15557 4526 \r\n3 12818 14834 15559 4527 \r\n3 13477 12490 8836 4528 \r\n3 15561 15560 11869 4529 \r\n3 15563 15562 15089 4530 \r\n3 15565 15564 10018 4531 \r\n3 15566 6944 6726 4532 \r\n3 14456 15074 15567 4533 \r\n3 15569 15568 13463 4534 \r\n3 15571 15570 14527 4535 \r\n3 15573 15572 8920 4536 \r\n3 12922 10429 15135 4537 \r\n3 11239 15574 11848 4538 \r\n3 15576 12845 15575 4539 \r\n3 10714 15577 15578 4540 \r\n3 9300 15579 9759 4541 \r\n3 15582 15580 15581 4542 \r\n3 11025 9889 15583 4543 \r\n3 15584 15309 10234 4544 \r\n3 15587 15585 15586 4545 \r\n3 6289 15588 11992 4546 \r\n3 15529 15589 15590 4547 \r\n3 8757 7512 8260 4548 \r\n3 15593 15591 15592 4549 \r\n3 15596 15594 15595 4550 \r\n3 7874 10658 5380 4551 \r\n3 15598 15535 15597 4552 \r\n3 15599 7677 13684 4553 \r\n3 15602 15600 15601 4554 \r\n3 15605 15603 15604 4555 \r\n3 15607 8762 15606 4556 \r\n3 15609 15608 10096 4557 \r\n3 15611 15610 13388 4558 \r\n3 15613 10140 15612 4559 \r\n3 15614 5728 8986 4560 \r\n3 15616 10732 15615 4561 \r\n3 15619 15617 15618 4562 \r\n3 15621 15620 8153 4563 \r\n3 15623 15622 11589 4564 \r\n3 13341 15461 15624 4565 \r\n3 15627 15625 15626 4566 \r\n3 15629 9159 15628 4567 \r\n3 15631 15630 9862 4568 \r\n3 5332 10851 15632 4569 \r\n3 14115 15633 15634 4570 \r\n3 15637 15635 15636 4571 \r\n3 15639 8467 15638 4572 \r\n3 15640 11157 12016 4573 \r\n3 15641 12832 5432 4574 \r\n3 15643 15642 9859 4575 \r\n3 15645 15644 11812 4576 \r\n3 15238 11125 12198 4577 \r\n3 9497 15646 14426 4578 \r\n3 15649 15647 15648 4579 \r\n3 15651 14789 15650 4580 \r\n3 10504 13480 15652 4581 \r\n3 15654 14539 15653 4582 \r\n3 15657 15655 15656 4583 \r\n3 15660 15658 15659 4584 \r\n3 15663 15661 15662 4585 \r\n3 8679 15664 13456 4586 \r\n3 15666 15665 10436 4587 \r\n3 15668 13143 15667 4588 \r\n3 15671 15669 15670 4589 \r\n3 10370 8620 6692 4590 \r\n3 14901 15672 9434 4591 \r\n3 15674 5284 15673 4592 \r\n3 15675 15400 12347 4593 \r\n3 15676 15426 11474 4594 \r\n3 15678 6246 15677 4595 \r\n3 15679 6972 7272 4596 \r\n3 13383 14440 15680 4597 \r\n3 12607 15681 11118 4598 \r\n3 15683 13438 15682 4599 \r\n3 9243 15684 15685 4600 \r\n3 8707 15686 15687 4601 \r\n3 13749 15688 15689 4602 \r\n3 5277 15690 6829 4603 \r\n3 15692 13495 15691 4604 \r\n3 6611 15693 6649 4605 \r\n3 15695 15694 8867 4606 \r\n3 15697 15696 11767 4607 \r\n3 15700 15698 15699 4608 \r\n3 11547 15701 15702 4609 \r\n3 15703 11447 14295 4610 \r\n3 5810 15704 8549 4611 \r\n3 15615 10150 13913 4612 \r\n3 15410 13442 15705 4613 \r\n3 15706 14615 14689 4614 \r\n3 15708 15707 14828 4615 \r\n3 15302 15709 7767 4616 \r\n3 11136 5978 15377 4617 \r\n3 14247 14550 15710 4618 \r\n3 8600 11956 5817 4619 \r\n3 8078 11397 12017 4620 \r\n3 15712 15711 11891 4621 \r\n3 15714 14896 15713 4622 \r\n3 15716 14981 15715 4623 \r\n3 15718 15717 9952 4624 \r\n3 15721 15719 15720 4625 \r\n3 12124 15722 6897 4626 \r\n3 15724 7300 15723 4627 \r\n3 15726 15725 8478 4628 \r\n3 15728 6614 15727 4629 \r\n3 15730 12712 15729 4630 \r\n3 15731 11066 8838 4631 \r\n3 15732 10905 11843 4632 \r\n3 15735 15733 15734 4633 \r\n3 7014 15736 13399 4634 \r\n3 15738 8755 15737 4635 \r\n3 9043 15739 15740 4636 \r\n3 7289 15741 13193 4637 \r\n3 15743 15742 15266 4638 \r\n3 9078 9801 15340 4639 \r\n3 15746 15744 15745 4640 \r\n3 10212 15747 15748 4641 \r\n3 12470 13440 10359 4642 \r\n3 7407 15749 11732 4643 \r\n3 15752 15750 15751 4644 \r\n3 11749 15753 14806 4645 \r\n3 6255 15754 6338 4646 \r\n3 15755 15166 13945 4647 \r\n3 12632 5717 15756 4648 \r\n3 15757 15221 11677 4649 \r\n3 5034 15758 15759 4650 \r\n3 7498 15760 5993 4651 \r\n3 15762 15761 9774 4652 \r\n3 15763 13628 14653 4653 \r\n3 15765 7856 15764 4654 \r\n3 15767 15766 8703 4655 \r\n3 15768 14945 6476 4656 \r\n3 10539 14471 7615 4657 \r\n3 11316 9806 5510 4658 \r\n3 12800 15769 15770 4659 \r\n3 15771 8010 8141 4660 \r\n3 15773 12094 15772 4661 \r\n3 15776 15774 15775 4662 \r\n3 15777 14087 8622 4663 \r\n3 13178 5822 15778 4664 \r\n3 10183 10736 15779 4665 \r\n3 15782 15780 15781 4666 \r\n3 10188 15783 15784 4667 \r\n3 15785 10964 5687 4668 \r\n3 15786 14122 11344 4669 \r\n3 15789 15787 15788 4670 \r\n3 15792 15790 15791 4671 \r\n3 15793 14862 7796 4672 \r\n3 12404 10882 7009 4673 \r\n3 13342 7995 15794 4674 \r\n3 15796 11103 15795 4675 \r\n3 15797 7936 10116 4676 \r\n3 10293 9175 15798 4677 \r\n3 7220 15492 8864 4678 \r\n3 10266 15799 15800 4679 \r\n3 5946 15801 15475 4680 \r\n3 15803 15802 10839 4681 \r\n3 15805 15804 14352 4682 \r\n3 15808 15806 15807 4683 \r\n3 15809 13426 14443 4684 \r\n3 7819 10193 15810 4685 \r\n3 15812 15811 9244 4686 \r\n3 15814 6360 15813 4687 \r\n3 15817 15815 15816 4688 \r\n3 11360 15818 15819 4689 \r\n3 13260 6888 15820 4690 \r\n3 15821 8761 11240 4691 \r\n3 15488 15822 6949 4692 \r\n3 11170 8243 10742 4693 \r\n3 15823 11596 11705 4694 \r\n3 11779 6176 15195 4695 \r\n3 15824 6580 12179 4696 \r\n3 15825 7138 8303 4697 \r\n3 6220 11933 9453 4698 \r\n3 15827 13638 15826 4699 \r\n3 9934 12965 8185 4700 \r\n3 15568 11923 15828 4701 \r\n3 12181 15829 15830 4702 \r\n3 13745 15323 15831 4703 \r\n3 15834 15832 15833 4704 \r\n3 15837 15835 15836 4705 \r\n3 15839 15838 13739 4706 \r\n3 15122 8313 15840 4707 \r\n3 15842 6714 15841 4708 \r\n3 14309 15843 15844 4709 \r\n3 5207 14128 15845 4710 \r\n3 11879 9480 15634 4711 \r\n3 14035 15846 12629 4712 \r\n3 15848 5423 15847 4713 \r\n3 5506 15849 15850 4714 \r\n3 10037 11187 11317 4715 \r\n3 6779 9398 15851 4716 \r\n3 14258 15852 15661 4717 \r\n3 15253 15853 15854 4718 \r\n3 5592 13811 10297 4719 \r\n3 15857 15855 15856 4720 \r\n3 15858 15034 11223 4721 \r\n3 15859 9948 14474 4722 \r\n3 9828 9638 15860 4723 \r\n3 8037 15861 7624 4724 \r\n3 13909 15862 14753 4725 \r\n3 15863 11134 10280 4726 \r\n3 8728 14472 6208 4727 \r\n3 15865 15864 7689 4728 \r\n3 15868 15866 15867 4729 \r\n3 10321 14231 14100 4730 \r\n3 15870 15869 15150 4731 \r\n3 15872 11381 15871 4732 \r\n3 15873 6883 11912 4733 \r\n3 13888 15874 15875 4734 \r\n3 9559 5122 10654 4735 \r\n3 10328 14671 8545 4736 \r\n3 7822 15876 15877 4737 \r\n3 10032 15878 14919 4738 \r\n3 8570 14355 15879 4739 \r\n3 15882 15880 15881 4740 \r\n3 11544 15603 12446 4741 \r\n3 15883 11597 10811 4742 \r\n3 15885 15884 11148 4743 \r\n3 15887 15886 14881 4744 \r\n3 11802 10073 15888 4745 \r\n3 15891 15889 15890 4746 \r\n3 15892 12034 15858 4747 \r\n3 15894 14260 15893 4748 \r\n3 9563 15895 15896 4749 \r\n3 15898 15897 15065 4750 \r\n3 15900 15899 14714 4751 \r\n3 13483 15901 6238 4752 \r\n3 10745 15902 13068 4753 \r\n3 15904 14320 15903 4754 \r\n3 5126 9451 15905 4755 \r\n3 14442 15906 8661 4756 \r\n3 15909 15907 15908 4757 \r\n3 10454 11095 6339 4758 \r\n3 15912 15910 15911 4759 \r\n3 15914 9399 15913 4760 \r\n3 12789 15654 8758 4761 \r\n3 15916 9551 15915 4762 \r\n3 5945 5996 15917 4763 \r\n3 10993 9562 12875 4764 \r\n3 15918 9903 14525 4765 \r\n3 15920 15919 12518 4766 \r\n3 10500 15921 7474 4767 \r\n3 11582 15922 10587 4768 \r\n3 15924 11695 15923 4769 \r\n3 15926 15925 15752 4770 \r\n3 6329 15927 12001 4771 \r\n3 8880 15928 15929 4772 \r\n3 15931 12685 15930 4773 \r\n3 14182 13903 12311 4774 \r\n3 15932 15264 5236 4775 \r\n3 13597 14540 12788 4776 \r\n3 15935 15933 15934 4777 \r\n3 6421 14752 15936 4778 \r\n3 10976 15937 9789 4779 \r\n3 15939 15938 9693 4780 \r\n3 9791 15940 13223 4781 \r\n3 7670 11877 15941 4782 \r\n3 6331 15942 15943 4783 \r\n3 15944 7869 13650 4784 \r\n3 15946 11872 15945 4785 \r\n3 11160 11346 5095 4786 \r\n3 15948 15947 6567 4787 \r\n3 15950 15949 6267 4788 \r\n3 15951 7008 7276 4789 \r\n3 7490 10242 7851 4790 \r\n3 12085 15952 15953 4791 \r\n3 14449 15655 15954 4792 \r\n3 15956 15955 9979 4793 \r\n3 12662 15957 14281 4794 \r\n3 12767 15958 14977 4795 \r\n3 15960 15959 12596 4796 \r\n3 8481 11355 15961 4797 \r\n3 15963 11004 15962 4798 \r\n3 15966 15964 15965 4799 \r\n3 15968 15967 10835 4800 \r\n3 15970 15969 10699 4801 \r\n3 7433 15971 15972 4802 \r\n3 15974 15973 9094 4803 \r\n3 9820 14843 15975 4804 \r\n3 15977 15976 7964 4805 \r\n3 15979 11358 15978 4806 \r\n3 15981 15980 12944 4807 \r\n3 15983 15982 11149 4808 \r\n3 9176 10292 13455 4809 \r\n3 11440 9915 12652 4810 \r\n3 15985 15984 14519 4811 \r\n3 12244 10646 5488 4812 \r\n3 15988 15986 15987 4813 \r\n3 15990 15925 15989 4814 \r\n3 15992 15991 6887 4815 \r\n3 15994 12232 15993 4816 \r\n3 15996 15995 10481 4817 \r\n3 14588 11814 8088 4818 \r\n3 15998 10544 15997 4819 \r\n3 15743 8701 15999 4820 \r\n3 8991 16000 16001 4821 \r\n3 16003 16002 7721 4822 \r\n3 16005 15808 16004 4823 \r\n3 16008 16006 16007 4824 \r\n3 16011 16009 16010 4825 \r\n3 16012 12713 15364 4826 \r\n3 15697 6507 14037 4827 \r\n3 5145 16013 12980 4828 \r\n3 6850 15286 16014 4829 \r\n3 5795 16015 16016 4830 \r\n3 16018 16017 14677 4831 \r\n3 16021 16019 16020 4832 \r\n3 5454 16022 16023 4833 \r\n3 6257 16024 15212 4834 \r\n3 16027 16025 16026 4835 \r\n3 13697 9846 9840 4836 \r\n3 13210 15940 12437 4837 \r\n3 11950 16028 16029 4838 \r\n3 16032 16030 16031 4839 \r\n3 7084 16033 14326 4840 \r\n3 9057 16034 11046 4841 \r\n3 16035 9335 12368 4842 \r\n3 15419 16036 8632 4843 \r\n3 6590 12954 15607 4844 \r\n3 16038 11470 16037 4845 \r\n3 16041 16039 16040 4846 \r\n3 15035 16042 10875 4847 \r\n3 12493 16043 16044 4848 \r\n3 11087 15446 16045 4849 \r\n3 7992 13020 9350 4850 \r\n3 15996 16046 11555 4851 \r\n3 11220 16047 16048 4852 \r\n3 16051 16049 16050 4853 \r\n3 14056 6252 16052 4854 \r\n3 15313 7254 16053 4855 \r\n3 14902 10853 13805 4856 \r\n3 16054 12131 6813 4857 \r\n3 16057 16055 16056 4858 \r\n3 13607 13201 16058 4859 \r\n3 16061 16059 16060 4860 \r\n3 16063 16062 6868 4861 \r\n3 16065 16064 6164 4862 \r\n3 9411 10350 16066 4863 \r\n3 9755 16067 16068 4864 \r\n3 16071 16069 16070 4865 \r\n3 7603 13247 16072 4866 \r\n3 12109 16073 16074 4867 \r\n3 8443 16075 7742 4868 \r\n3 14634 16076 16077 4869 \r\n3 16079 16078 6873 4870 \r\n3 16082 16080 16081 4871 \r\n3 7202 10026 12252 4872 \r\n3 16084 16083 15015 4873 \r\n3 16085 12519 10589 4874 \r\n3 16088 16086 16087 4875 \r\n3 16090 12644 16089 4876 \r\n3 16091 7866 7524 4877 \r\n3 13963 16092 16093 4878 \r\n3 16095 16094 8101 4879 \r\n3 7089 16096 14133 4880 \r\n3 16097 13986 15368 4881 \r\n3 16099 16098 5641 4882 \r\n3 15062 10938 15505 4883 \r\n3 16101 14957 16100 4884 \r\n3 11154 15119 14769 4885 \r\n3 13357 16102 5752 4886 \r\n3 16104 14805 16103 4887 \r\n3 16107 16105 16106 4888 \r\n3 16109 16108 10537 4889 \r\n3 16111 16110 5611 4890 \r\n3 16114 16112 16113 4891 \r\n3 16117 16115 16116 4892 \r\n3 8368 16118 16119 4893 \r\n3 16120 15860 7646 4894 \r\n3 16123 16121 16122 4895 \r\n3 14063 16124 16125 4896 \r\n3 11590 16126 16127 4897 \r\n3 11396 16128 16129 4898 \r\n3 16130 14664 9611 4899 \r\n3 16132 15398 16131 4900 \r\n3 16135 16133 16134 4901 \r\n3 16138 16136 16137 4902 \r\n3 16140 11253 16139 4903 \r\n3 10036 16141 16142 4904 \r\n3 10888 16143 16144 4905 \r\n3 16147 16145 16146 4906 \r\n3 16149 16148 5799 4907 \r\n3 16152 16150 16151 4908 \r\n3 7794 12705 16153 4909 \r\n3 12810 14315 16139 4910 \r\n3 5937 16154 16155 4911 \r\n3 16158 16156 16157 4912 \r\n3 9197 16159 8683 4913 \r\n3 16162 16160 16161 4914 \r\n3 7479 16163 13663 4915 \r\n3 16165 12473 16164 4916 \r\n3 16167 13537 16166 4917 \r\n3 16169 15643 16168 4918 \r\n3 16170 9151 5143 4919 \r\n3 5202 16171 7200 4920 \r\n3 6736 14771 16172 4921 \r\n3 16174 7724 16173 4922 \r\n3 16175 13300 8353 4923 \r\n3 11881 5643 8968 4924 \r\n3 16177 16176 9959 4925 \r\n3 16180 16178 16179 4926 \r\n3 16182 16181 6922 4927 \r\n3 16183 7488 15414 4928 \r\n3 9128 16184 9592 4929 \r\n3 16185 13768 11768 4930 \r\n3 16187 11888 16186 4931 \r\n3 16189 14259 16188 4932 \r\n3 11195 14163 16190 4933 \r\n3 16191 14796 11113 4934 \r\n3 14410 10978 16192 4935 \r\n3 10760 16193 16194 4936 \r\n3 11551 16195 16196 4937 \r\n3 7052 16197 16198 4938 \r\n3 16200 14571 16199 4939 \r\n3 15806 5341 16201 4940 \r\n3 9264 16202 12228 4941 \r\n3 13006 16203 16204 4942 \r\n3 8929 10353 16205 4943 \r\n3 16206 13257 14102 4944 \r\n3 16208 5407 16207 4945 \r\n3 16211 16209 16210 4946 \r\n3 16212 12605 7232 4947 \r\n3 16214 16213 10159 4948 \r\n3 13086 16215 11083 4949 \r\n3 16218 16216 16217 4950 \r\n3 15926 16219 10690 4951 \r\n3 9747 6648 10663 4952 \r\n3 16222 16220 16221 4953 \r\n3 16224 10920 16223 4954 \r\n3 16226 13452 16225 4955 \r\n3 11168 12451 11485 4956 \r\n3 15278 16227 8833 4957 \r\n3 8500 9401 15054 4958 \r\n3 12308 12226 16228 4959 \r\n3 12692 7039 16229 4960 \r\n3 12319 16230 11716 4961 \r\n3 16232 16231 7698 4962 \r\n3 12698 12250 6372 4963 \r\n3 16234 15667 16233 4964 \r\n3 10106 16235 10530 4965 \r\n3 6444 15262 12419 4966 \r\n3 16236 7294 7208 4967 \r\n3 16238 16237 13049 4968 \r\n3 16241 16239 16240 4969 \r\n3 8555 16242 16243 4970 \r\n3 16245 16244 11257 4971 \r\n3 16246 12125 15107 4972 \r\n3 16248 12867 16247 4973 \r\n3 16249 15209 15630 4974 \r\n3 16252 16250 16251 4975 \r\n3 7261 15773 16253 4976 \r\n3 16254 14639 6074 4977 \r\n3 9566 15597 12747 4978 \r\n3 15714 16255 11641 4979 \r\n3 16258 16256 16257 4980 \r\n3 16260 13959 16259 4981 \r\n3 16262 16261 6698 4982 \r\n3 16263 8084 10146 4983 \r\n3 14987 16264 16265 4984 \r\n3 16267 16266 6833 4985 \r\n3 11487 16268 16269 4986 \r\n3 16270 10161 8005 4987 \r\n3 8941 16271 16272 4988 \r\n3 16273 13550 15517 4989 \r\n3 16274 9477 9694 4990 \r\n3 16276 15900 16275 4991 \r\n3 6282 8252 16277 4992 \r\n3 14395 16278 8469 4993 \r\n3 16280 11935 16279 4994 \r\n3 16086 16281 16282 4995 \r\n3 8451 16283 15452 4996 \r\n3 16285 13961 16284 4997 \r\n3 13548 14108 16286 4998 \r\n3 16287 11925 14272 4999 \r\n3 16289 16288 12588 5000 \r\n3 16291 15454 16290 5001 \r\n3 16294 16292 16293 5002 \r\n3 16297 16295 16296 5003 \r\n3 16299 11994 16298 5004 \r\n3 15483 7152 14823 5005 \r\n3 16302 16300 16301 5006 \r\n3 16303 10668 7820 5007 \r\n3 7466 16304 9782 5008 \r\n3 16305 16057 14532 5009 \r\n3 16308 16306 16307 5010 \r\n3 16310 14802 16309 5011 \r\n3 16313 16311 16312 5012 \r\n3 9505 5840 12144 5013 \r\n3 11648 7687 15128 5014 \r\n3 10493 14991 9337 5015 \r\n3 16316 16314 16315 5016 \r\n3 13859 16317 14861 5017 \r\n3 15952 12207 9302 5018 \r\n3 7092 10691 16318 5019 \r\n3 13568 7844 12072 5020 \r\n3 13523 16319 16320 5021 \r\n3 5731 14143 6245 5022 \r\n3 16321 12411 12095 5023 \r\n3 11183 11511 10581 5024 \r\n3 16323 16322 5349 5025 \r\n3 14180 9052 16324 5026 \r\n3 8802 16325 16326 5027 \r\n3 10749 16327 16328 5028 \r\n3 13288 10155 16329 5029 \r\n3 10015 5684 16330 5030 \r\n3 16331 9353 9573 5031 \r\n3 16334 16332 16333 5032 \r\n3 13800 16335 11201 5033 \r\n3 16338 16336 16337 5034 \r\n3 12639 6436 16339 5035 \r\n3 16341 16340 9408 5036 \r\n3 16344 16342 16343 5037 \r\n3 16346 16345 15291 5038 \r\n3 14803 13321 16347 5039 \r\n3 15776 7586 8147 5040 \r\n3 16348 12650 16149 5041 \r\n3 16350 6118 16349 5042 \r\n3 10709 16351 7153 5043 \r\n3 16353 13226 16352 5044 \r\n3 13844 16354 10043 5045 \r\n3 16355 10758 13406 5046 \r\n3 16357 16356 14783 5047 \r\n3 16358 13113 13893 5048 \r\n3 6825 12658 16359 5049 \r\n3 11617 13830 16360 5050 \r\n3 16362 16361 6432 5051 \r\n3 16363 14053 9640 5052 \r\n3 12784 7367 16364 5053 \r\n3 12507 6187 16365 5054 \r\n3 16368 16366 16367 5055 \r\n3 16371 16369 16370 5056 \r\n3 16373 16372 14727 5057 \r\n3 7068 16374 16375 5058 \r\n3 6345 16340 14763 5059 \r\n3 16377 13420 16376 5060 \r\n3 5281 16003 15532 5061 \r\n3 16379 10388 16378 5062 \r\n3 5529 16380 9699 5063 \r\n3 6173 12529 7215 5064 \r\n3 10782 16381 14685 5065 \r\n3 9521 16382 16292 5066 \r\n3 16385 16383 16384 5067 \r\n3 16387 15554 16386 5068 \r\n3 16389 16388 10203 5069 \r\n3 5732 12096 8330 5070 \r\n3 6132 6067 16390 5071 \r\n3 16392 16391 6009 5072 \r\n3 16395 16393 16394 5073 \r\n3 7699 12964 14348 5074 \r\n3 16396 13294 16231 5075 \r\n3 16397 10089 13122 5076 \r\n3 16399 16398 14841 5077 \r\n3 10178 10263 16400 5078 \r\n3 6448 12666 16401 5079 \r\n3 8160 12344 16402 5080 \r\n3 9140 16403 16404 5081 \r\n3 16407 16405 16406 5082 \r\n3 10997 15646 10524 5083 \r\n3 15489 15099 13815 5084 \r\n3 7335 16408 16409 5085 \r\n3 7043 16410 8174 5086 \r\n3 8154 15726 12829 5087 \r\n3 12166 16411 16412 5088 \r\n3 16415 16413 16414 5089 \r\n3 16417 16416 13504 5090 \r\n3 9234 16418 16419 5091 \r\n3 16422 16420 16421 5092 \r\n3 16424 16423 6906 5093 \r\n3 16427 16425 16426 5094 \r\n3 16429 9349 16428 5095 \r\n3 10757 16430 16431 5096 \r\n3 16432 14112 15870 5097 \r\n3 11188 16349 6399 5098 \r\n3 15711 7611 7644 5099 \r\n3 16434 16433 7639 5100 \r\n3 16437 16435 16436 5101 \r\n3 16439 16438 11304 5102 \r\n3 16440 14922 7242 5103 \r\n3 7574 16441 15282 5104 \r\n3 8113 16442 16443 5105 \r\n3 13643 16444 16445 5106 \r\n3 16447 16446 7683 5107 \r\n3 16449 7400 16448 5108 \r\n3 9624 11770 10238 5109 \r\n3 14003 10295 16450 5110 \r\n3 16451 7247 7546 5111 \r\n3 11035 13042 14033 5112 \r\n3 16452 14378 11311 5113 \r\n3 16454 16453 9435 5114 \r\n3 15427 16455 16260 5115 \r\n3 16457 15827 16456 5116 \r\n3 15732 16458 13392 5117 \r\n3 16459 16152 12388 5118 \r\n3 16461 14637 16460 5119 \r\n3 16462 6625 14682 5120 \r\n3 16465 16463 16464 5121 \r\n3 16259 14569 16466 5122 \r\n3 16468 16467 13974 5123 \r\n3 16471 16469 16470 5124 \r\n3 6557 16472 8526 5125 \r\n3 16474 9425 16473 5126 \r\n3 5245 16475 16476 5127 \r\n3 10257 14403 16477 5128 \r\n3 11858 14445 16478 5129 \r\n3 15575 16479 15159 5130 \r\n3 16481 16480 16298 5131 \r\n3 15354 16482 16483 5132 \r\n3 7239 12962 16484 5133 \r\n3 12562 13124 16204 5134 \r\n3 16485 15832 8776 5135 \r\n3 16488 16486 16487 5136 \r\n3 9260 16489 16490 5137 \r\n3 16491 7182 6384 5138 \r\n3 16492 13099 5784 5139 \r\n3 16493 5198 16295 5140 \r\n3 5765 16494 14153 5141 \r\n3 15698 13661 8075 5142 \r\n3 16496 13732 16495 5143 \r\n3 16497 7158 15028 5144 \r\n3 5451 16498 16499 5145 \r\n3 16501 11080 16500 5146 \r\n3 16503 16502 10940 5147 \r\n3 16504 15236 15746 5148 \r\n3 14565 16505 15021 5149 \r\n3 16508 16506 16507 5150 \r\n3 14321 16509 11495 5151 \r\n3 16512 16510 16511 5152 \r\n3 16514 16513 10752 5153 \r\n3 14354 12318 16515 5154 \r\n3 16516 7565 16033 5155 \r\n3 11622 16517 13365 5156 \r\n3 10960 16518 16519 5157 \r\n3 14595 15299 13323 5158 \r\n3 15004 13604 16520 5159 \r\n3 13012 6165 16521 5160 \r\n3 16522 11728 12907 5161 \r\n3 15833 16523 12578 5162 \r\n3 16525 13364 16524 5163 \r\n3 10607 16526 12663 5164 \r\n3 16529 16527 16528 5165 \r\n3 16531 7015 16530 5166 \r\n3 14401 11834 14501 5167 \r\n3 12990 6718 16532 5168 \r\n3 8104 13043 16533 5169 \r\n3 11683 16534 16535 5170 \r\n3 16537 13095 16536 5171 \r\n3 15796 15434 16538 5172 \r\n3 10258 16539 16151 5173 \r\n3 14151 16540 12842 5174 \r\n3 13075 16541 16542 5175 \r\n3 16544 5042 16543 5176 \r\n3 15829 10723 16545 5177 \r\n3 15758 13882 16546 5178 \r\n3 8229 11312 14197 5179 \r\n3 14049 5045 14641 5180 \r\n3 10105 9166 16547 5181 \r\n3 13298 14642 16548 5182 \r\n3 7115 7377 5379 5183 \r\n3 16551 16549 16550 5184 \r\n3 6250 5307 16552 5185 \r\n3 6707 11354 14986 5186 \r\n3 16555 16553 16554 5187 \r\n3 13000 14351 16556 5188 \r\n3 16559 16557 16558 5189 \r\n3 16560 14140 9556 5190 \r\n3 12568 16561 5770 5191 \r\n3 6997 16562 7556 5192 \r\n3 10211 13076 16563 5193 \r\n3 16566 16564 16565 5194 \r\n3 15167 13678 5887 5195 \r\n3 16567 9583 16358 5196 \r\n3 13915 5914 6796 5197 \r\n3 16569 7977 16568 5198 \r\n3 5860 10783 15936 5199 \r\n3 8470 16570 8081 5200 \r\n3 14341 16571 16572 5201 \r\n3 14205 16573 14420 5202 \r\n3 10383 11774 16574 5203 \r\n3 16575 15201 15403 5204 \r\n3 16578 16576 16577 5205 \r\n3 16581 16579 16580 5206 \r\n3 8502 8151 16582 5207 \r\n3 10452 12542 11180 5208 \r\n3 7482 7859 16583 5209 \r\n3 16585 16584 13434 5210 \r\n3 16587 16586 10430 5211 \r\n3 12859 16588 7541 5212 \r\n3 11174 9454 14458 5213 \r\n3 16591 16589 16590 5214 \r\n3 10514 5475 15984 5215 \r\n3 16302 16592 16593 5216 \r\n3 16594 11566 14599 5217 \r\n3 13780 16595 11202 5218 \r\n3 8386 16596 16597 5219 \r\n3 16599 16598 7543 5220 \r\n3 16602 16600 16601 5221 \r\n3 11744 16603 15246 5222 \r\n3 16605 15341 16604 5223 \r\n3 16607 16606 10142 5224 \r\n3 6548 9550 16608 5225 \r\n3 5477 16609 16610 5226 \r\n3 16613 16611 16612 5227 \r\n3 16615 15651 16614 5228 \r\n3 16617 16616 8990 5229 \r\n3 16059 15009 16618 5230 \r\n3 16619 10213 6313 5231 \r\n3 14183 16620 16621 5232 \r\n3 14016 16622 15687 5233 \r\n3 16624 6021 16623 5234 \r\n3 15375 16625 16626 5235 \r\n3 16628 16627 10656 5236 \r\n3 16629 6179 9319 5237 \r\n3 15918 16397 16630 5238 \r\n3 6872 10463 16631 5239 \r\n3 9641 16632 14006 5240 \r\n3 13530 13148 16633 5241 \r\n3 16312 12266 6740 5242 \r\n3 16635 10417 16634 5243 \r\n3 16636 12671 16535 5244 \r\n3 16638 11147 16637 5245 \r\n3 16640 16639 12567 5246 \r\n3 14857 13198 16641 5247 \r\n3 16642 10512 15910 5248 \r\n3 16644 14918 16643 5249 \r\n3 7435 10700 16645 5250 \r\n3 16646 10267 11685 5251 \r\n3 16649 16647 16648 5252 \r\n3 13244 15095 16650 5253 \r\n3 9999 7085 16542 5254 \r\n3 6079 7017 11816 5255 \r\n3 13192 9613 12251 5256 \r\n3 16653 16651 16652 5257 \r\n3 7782 14469 16654 5258 \r\n3 16656 16655 15836 5259 \r\n3 16658 16657 6704 5260 \r\n3 16660 7806 16659 5261 \r\n3 16662 12539 16661 5262 \r\n3 16664 16663 14813 5263 \r\n3 10824 16665 10064 5264 \r\n3 16667 16666 11747 5265 \r\n3 13702 16668 9817 5266 \r\n3 14353 5614 7217 5267 \r\n3 12157 9345 16669 5268 \r\n3 16672 16670 16671 5269 \r\n3 16675 16673 16674 5270 \r\n3 16002 15771 16676 5271 \r\n3 14971 16677 16678 5272 \r\n3 16681 16679 16680 5273 \r\n3 13489 11508 5567 5274 \r\n3 10088 16682 16683 5275 \r\n3 8896 15336 13371 5276 \r\n3 16685 16684 14684 5277 \r\n3 9152 12021 7821 5278 \r\n3 16667 16686 11146 5279 \r\n3 16687 11682 8653 5280 \r\n3 16690 16688 16689 5281 \r\n3 16288 16234 16030 5282 \r\n3 12890 5924 16195 5283 \r\n3 5701 14191 7810 5284 \r\n3 16692 5591 16691 5285 \r\n3 13593 16046 16693 5286 \r\n3 16695 10906 16694 5287 \r\n3 16698 16696 16697 5288 \r\n3 16699 15337 16555 5289 \r\n3 16701 8835 16700 5290 \r\n3 10465 16702 16163 5291 \r\n3 16704 16703 10401 5292 \r\n3 16706 6351 16705 5293 \r\n3 16708 16707 11975 5294 \r\n3 16709 11545 11657 5295 \r\n3 16712 16710 16711 5296 \r\n3 11846 12703 16713 5297 \r\n3 11806 16714 16715 5298 \r\n3 16717 11983 16716 5299 \r\n3 15650 16718 16469 5300 \r\n3 12824 16719 16720 5301 \r\n3 16722 16721 16544 5302 \r\n3 16724 15848 16723 5303 \r\n3 16725 14334 11696 5304 \r\n3 9433 16726 6458 5305 \r\n3 10580 15660 8291 5306 \r\n3 5527 16727 16728 5307 \r\n3 16731 16729 16730 5308 \r\n3 16732 6629 15974 5309 \r\n3 15605 10560 16733 5310 \r\n3 5792 16734 12752 5311 \r\n3 15590 16735 16736 5312 \r\n3 16738 16737 16008 5313 \r\n3 11409 16739 16740 5314 \r\n3 16741 12379 7194 5315 \r\n3 16744 16742 16743 5316 \r\n3 16747 16745 16746 5317 \r\n3 16748 15937 6879 5318 \r\n3 14448 15230 5218 5319 \r\n3 16750 16032 16749 5320 \r\n3 16753 16751 16752 5321 \r\n3 5061 16754 8505 5322 \r\n3 16755 16602 9129 5323 \r\n3 16064 16756 16757 5324 \r\n3 16759 16758 16426 5325 \r\n3 12861 14015 16760 5326 \r\n3 13125 16761 9126 5327 \r\n3 15614 7713 14078 5328 \r\n3 16763 8677 16762 5329 \r\n3 16766 16764 16765 5330 \r\n3 10068 13677 12702 5331 \r\n3 16769 16767 16768 5332 \r\n3 16771 16770 14893 5333 \r\n3 9339 16772 16773 5334 \r\n3 14201 10204 16774 5335 \r\n3 8955 8456 8577 5336 \r\n3 12985 16775 8750 5337 \r\n3 7101 16776 8886 5338 \r\n3 16779 16777 16778 5339 \r\n3 16781 12526 16780 5340 \r\n3 16782 15792 8087 5341 \r\n3 16784 8457 16783 5342 \r\n3 12621 16785 15567 5343 \r\n3 16761 8516 14067 5344 \r\n3 16788 16786 16787 5345 \r\n3 16790 12106 16789 5346 \r\n3 16793 16791 16792 5347 \r\n3 5848 16794 16795 5348 \r\n3 16289 16796 16797 5349 \r\n3 15932 14898 12665 5350 \r\n3 16799 11383 16798 5351 \r\n3 8760 8406 16800 5352 \r\n3 16802 16801 16119 5353 \r\n3 7891 16803 5149 5354 \r\n3 16805 16804 16304 5355 \r\n3 15941 13208 16806 5356 \r\n3 16807 12279 15534 5357 \r\n3 16809 15172 16808 5358 \r\n3 10825 16810 6696 5359 \r\n3 16080 5013 16811 5360 \r\n3 13997 16812 7332 5361 \r\n3 7686 15521 16813 5362 \r\n3 16055 16814 16815 5363 \r\n3 16817 16816 14486 5364 \r\n3 16818 6330 10728 5365 \r\n3 16820 16819 10473 5366 \r\n3 10456 16821 16822 5367 \r\n3 12560 16823 13051 5368 \r\n3 16825 10275 16824 5369 \r\n3 16827 15269 16826 5370 \r\n3 16828 11133 13435 5371 \r\n3 8942 16829 14350 5372 \r\n3 16831 10272 16830 5373 \r\n3 16833 16832 9733 5374 \r\n3 16835 16834 7775 5375 \r\n3 16586 11393 16836 5376 \r\n3 12492 16837 14564 5377 \r\n3 16838 10704 6995 5378 \r\n3 6253 16378 8362 5379 \r\n3 10509 16839 16840 5380 \r\n3 16842 13072 16841 5381 \r\n3 16844 16843 13527 5382 \r\n3 12152 16845 16846 5383 \r\n3 14790 5384 12002 5384 \r\n3 9017 13747 16847 5385 \r\n3 14286 16848 11804 5386 \r\n3 15813 16849 16850 5387 \r\n3 15418 15273 9627 5388 \r\n3 6231 15423 6123 5389 \r\n3 11667 14164 16851 5390 \r\n3 14453 16072 13283 5391 \r\n3 15436 8977 16401 5392 \r\n3 5941 16852 8593 5393 \r\n3 16854 9855 16853 5394 \r\n3 16856 16855 10946 5395 \r\n3 10702 6908 15114 5396 \r\n3 10841 8134 14060 5397 \r\n3 16858 7021 16857 5398 \r\n3 8551 16859 16860 5399 \r\n3 16862 16861 13543 5400 \r\n3 10982 14487 9679 5401 \r\n3 15181 5867 10718 5402 \r\n3 16394 16863 9775 5403 \r\n3 13044 15747 16385 5404 \r\n3 16865 16864 15041 5405 \r\n3 6201 11107 16866 5406 \r\n3 16869 16867 16868 5407 \r\n3 16872 16870 16871 5408 \r\n3 16875 16873 16874 5409 \r\n3 16877 13127 16876 5410 \r\n3 9607 16878 16583 5411 \r\n3 16880 16879 9896 5412 \r\n3 10167 16881 16882 5413 \r\n3 16884 16883 8039 5414 \r\n3 12090 11224 12571 5415 \r\n3 11028 12637 9208 5416 \r\n3 16886 16147 16885 5417 \r\n3 15207 12408 16887 5418 \r\n3 10180 9752 16888 5419 \r\n3 6272 16889 8022 5420 \r\n3 16891 14830 16890 5421 \r\n3 8228 16892 9340 5422 \r\n3 6494 16893 16372 5423 \r\n3 8057 16894 6295 5424 \r\n3 10665 16895 12118 5425 \r\n3 16898 16896 16897 5426 \r\n3 13615 16899 12592 5427 \r\n3 9738 16900 16901 5428 \r\n3 15700 5204 11392 5429 \r\n3 16903 16902 15468 5430 \r\n3 9678 16755 16778 5431 \r\n3 5692 8851 16904 5432 \r\n3 12517 5103 8256 5433 \r\n3 14468 16905 16906 5434 \r\n3 8806 11835 11849 5435 \r\n3 16908 5594 16907 5436 \r\n3 16909 9458 15183 5437 \r\n3 16912 16910 16911 5438 \r\n3 12594 13250 7228 5439 \r\n3 10722 15867 16913 5440 \r\n3 6409 7402 16914 5441 \r\n3 16916 12465 16915 5442 \r\n3 6229 16917 15404 5443 \r\n3 16919 16918 14289 5444 \r\n3 16734 16920 10974 5445 \r\n3 13835 8831 10693 5446 \r\n3 16922 16398 16921 5447 \r\n3 16923 14171 10896 5448 \r\n3 11427 16924 7674 5449 \r\n3 16926 16925 7460 5450 \r\n3 16928 7259 16927 5451 \r\n3 6561 15589 16929 5452 \r\n3 16932 16930 16931 5453 \r\n3 16933 5448 5101 5454 \r\n3 13611 12986 9363 5455 \r\n3 16934 13649 16063 5456 \r\n3 14718 8389 8136 5457 \r\n3 16936 10975 16935 5458 \r\n3 16515 14223 16937 5459 \r\n3 14023 16868 15090 5460 \r\n3 16940 16938 16939 5461 \r\n3 11740 16505 7621 5462 \r\n3 14616 10903 16941 5463 \r\n3 16944 16942 16943 5464 \r\n3 16945 5870 7154 5465 \r\n3 8196 5081 10786 5466 \r\n3 13227 6457 14695 5467 \r\n3 7055 16946 16947 5468 \r\n3 16950 16948 16949 5469 \r\n3 16459 7481 16951 5470 \r\n3 12551 16952 16516 5471 \r\n3 10215 8787 16953 5472 \r\n3 12221 11323 8672 5473 \r\n3 15123 16954 15727 5474 \r\n3 11307 16818 16955 5475 \r\n3 13735 16956 15734 5476 \r\n3 12576 16867 14707 5477 \r\n3 14990 16957 15506 5478 \r\n3 16479 14150 12744 5479 \r\n3 16959 7414 16958 5480 \r\n3 16961 16960 16891 5481 \r\n3 16962 9827 14686 5482 \r\n3 15442 15823 15979 5483 \r\n3 5462 15127 16963 5484 \r\n3 16965 16964 14832 5485 \r\n3 14528 11105 14290 5486 \r\n3 16967 13240 16966 5487 \r\n3 16969 16968 6111 5488 \r\n3 16971 15048 16970 5489 \r\n3 16973 16972 16668 5490 \r\n3 16975 12503 16974 5491 \r\n3 6259 14587 6304 5492 \r\n3 9146 16976 16977 5493 \r\n3 15854 15029 15877 5494 \r\n3 16979 12694 16978 5495 \r\n3 16981 15125 16980 5496 \r\n3 16983 15399 16982 5497 \r\n3 14165 11669 13640 5498 \r\n3 13467 11642 15828 5499 \r\n3 16986 16984 16985 5500 \r\n3 14186 16987 16988 5501 \r\n3 13801 16989 16990 5502 \r\n3 14192 16708 14097 5503 \r\n3 16991 15756 14054 5504 \r\n3 12716 7508 7353 5505 \r\n3 16993 16992 14181 5506 \r\n3 16017 16621 16994 5507 \r\n3 12624 13560 16995 5508 \r\n3 14288 5964 11348 5509 \r\n3 7777 8754 16996 5510 \r\n3 16997 8235 13759 5511 \r\n3 7912 15360 16998 5512 \r\n3 7900 16999 13382 5513 \r\n3 14077 10308 17000 5514 \r\n3 17003 17001 17002 5515 \r\n3 16844 17004 17005 5516 \r\n3 17008 17006 17007 5517 \r\n3 17011 17009 17010 5518 \r\n3 6650 17012 15504 5519 \r\n3 8644 6103 11529 5520 \r\n3 17013 7626 14710 5521 \r\n3 17015 17014 13017 5522 \r\n3 7107 17016 15191 5523 \r\n3 14693 11177 17017 5524 \r\n3 8307 15365 7765 5525 \r\n3 17019 17018 9635 5526 \r\n3 6882 16460 16097 5527 \r\n3 17021 12123 17020 5528 \r\n3 17022 16075 6068 5529 \r\n3 17023 11411 10416 5530 \r\n3 17024 11522 7582 5531 \r\n3 17026 13147 17025 5532 \r\n3 12460 15344 17027 5533 \r\n3 11966 11249 10527 5534 \r\n3 14005 9317 17028 5535 \r\n3 5889 6305 17029 5536 \r\n3 17030 16560 6155 5537 \r\n3 6812 17031 5409 5538 \r\n3 14913 16989 17032 5539 \r\n3 17034 17033 9378 5540 \r\n3 7323 17035 5320 5541 \r\n3 5743 5350 11660 5542 \r\n3 16191 14817 17036 5543 \r\n3 17038 16433 17037 5544 \r\n3 12304 9703 10931 5545 \r\n3 16173 7723 17039 5546 \r\n3 17042 17040 17041 5547 \r\n3 17043 16077 15679 5548 \r\n3 17044 15077 5625 5549 \r\n3 17046 15985 17045 5550 \r\n3 11082 10046 17047 5551 \r\n3 6310 14502 13946 5552 \r\n3 10139 7147 17048 5553 \r\n3 15949 17049 5605 5554 \r\n3 8435 17050 8558 5555 \r\n3 9940 11237 6315 5556 \r\n3 17053 17051 17052 5557 \r\n3 11876 6619 5896 5558 \r\n3 17054 14559 16290 5559 \r\n3 17057 17055 17056 5560 \r\n3 16210 15556 17058 5561 \r\n3 9863 13106 17059 5562 \r\n3 11741 6258 17060 5563 \r\n3 13566 9887 11241 5564 \r\n3 12659 13976 17061 5565 \r\n3 17063 15635 17062 5566 \r\n3 11960 17064 6459 5567 \r\n3 17066 17065 5568 5568 \r\n3 17068 10866 17067 5569 \r\n3 17070 17069 5849 5570 \r\n3 14788 17071 10118 5571 \r\n3 17073 6430 17072 5572 \r\n3 15688 16127 17074 5573 \r\n3 17075 8657 6821 5574 \r\n3 14950 8894 13370 5575 \r\n3 12764 17076 17077 5576 \r\n3 14728 17078 15805 5577 \r\n3 17080 17079 8966 5578 \r\n3 17082 15144 17081 5579 \r\n3 11965 13753 12738 5580 \r\n3 15677 14083 17083 5581 \r\n3 8203 17084 11490 5582 \r\n3 17086 7573 17085 5583 \r\n3 8885 17087 9206 5584 \r\n3 17088 11856 13256 5585 \r\n3 13215 17089 17090 5586 \r\n3 15112 17091 17092 5587 \r\n3 17093 10746 13067 5588 \r\n3 17095 8122 17094 5589 \r\n3 17097 9392 17096 5590 \r\n3 17100 17098 17099 5591 \r\n3 16013 17101 15098 5592 \r\n3 17104 17102 17103 5593 \r\n3 14473 17105 17106 5594 \r\n3 17107 6934 15259 5595 \r\n3 9660 14421 9731 5596 \r\n3 17109 17108 9122 5597 \r\n3 17111 17110 13187 5598 \r\n3 13926 16781 12781 5599 \r\n3 17113 17112 15881 5600 \r\n3 14217 15851 17114 5601 \r\n3 12643 15036 9788 5602 \r\n3 5829 10014 17115 5603 \r\n3 17116 15737 8259 5604 \r\n3 17118 17117 7752 5605 \r\n3 6635 15982 17119 5606 \r\n3 13253 14703 16115 5607 \r\n3 13950 8205 17120 5608 \r\n3 16399 15869 17121 5609 \r\n3 17123 6705 17122 5610 \r\n3 5654 10021 7727 5611 \r\n3 17124 16727 15963 5612 \r\n3 14507 17125 17126 5613 \r\n3 17127 5952 5808 5614 \r\n3 14809 16090 17128 5615 \r\n3 8258 15143 8487 5616 \r\n3 14196 12864 17129 5617 \r\n3 6973 16076 17130 5618 \r\n3 11833 8805 13944 5619 \r\n3 14220 16153 17131 5620 \r\n3 17134 17132 17133 5621 \r\n3 17135 9423 15885 5622 \r\n3 11380 17136 14119 5623 \r\n3 15453 15530 17054 5624 \r\n3 17138 11546 17137 5625 \r\n3 17141 17139 17140 5626 \r\n3 11915 17142 8339 5627 \r\n3 17145 17143 17144 5628 \r\n3 9200 17146 16170 5629 \r\n3 17147 16949 10932 5630 \r\n3 17149 12077 17148 5631 \r\n3 5165 17150 7240 5632 \r\n3 17152 16721 17151 5633 \r\n3 17153 5038 13036 5634 \r\n3 13425 14431 15810 5635 \r\n3 17155 12092 17154 5636 \r\n3 17157 17156 8255 5637 \r\n3 8665 6456 15388 5638 \r\n3 13533 15463 16228 5639 \r\n3 17158 10790 10439 5640 \r\n3 11132 15709 9136 5641 \r\n3 17160 17159 12288 5642 \r\n3 5883 9033 9015 5643 \r\n3 17110 17161 6371 5644 \r\n3 16037 17162 14455 5645 \r\n3 15969 10135 17163 5646 \r\n3 17166 17164 17165 5647 \r\n3 11550 6081 17167 5648 \r\n3 12528 12485 17168 5649 \r\n3 17169 12933 12681 5650 \r\n3 16959 11259 17170 5651 \r\n3 14199 14562 10635 5652 \r\n3 17172 15457 17171 5653 \r\n3 12540 6817 10017 5654 \r\n3 13788 17173 14221 5655 \r\n3 15293 16557 17174 5656 \r\n3 12554 5642 17076 5657 \r\n3 16381 13060 17175 5658 \r\n3 17177 13142 17176 5659 \r\n3 15807 14222 11718 5660 \r\n3 17180 17178 17179 5661 \r\n3 11823 17181 15729 5662 \r\n3 17183 17182 14283 5663 \r\n3 15967 17184 17185 5664 \r\n3 12955 17186 17187 5665 \r\n3 17061 14836 17188 5666 \r\n3 15591 15821 10532 5667 \r\n3 11150 17189 16157 5668 \r\n3 17191 17190 5346 5669 \r\n3 17193 17192 12753 5670 \r\n3 9277 17194 13465 5671 \r\n3 15968 17195 17196 5672 \r\n3 16731 17197 17198 5673 \r\n3 17201 17199 17200 5674 \r\n3 17202 9905 9373 5675 \r\n3 6806 11242 7679 5676 \r\n3 17204 17203 9695 5677 \r\n3 17206 17205 13833 5678 \r\n3 17209 17207 17208 5679 \r\n3 17211 17210 10856 5680 \r\n3 6294 9407 14784 5681 \r\n3 17213 17212 12584 5682 \r\n3 13962 13337 15945 5683 \r\n3 17072 10816 17214 5684 \r\n3 8239 17215 16262 5685 \r\n3 15959 17216 13584 5686 \r\n3 16999 5862 13576 5687 \r\n3 17217 9427 16462 5688 \r\n3 17218 14211 15716 5689 \r\n3 9031 17219 17220 5690 \r\n3 10165 13390 12935 5691 \r\n3 17222 9324 17221 5692 \r\n3 17223 5456 14274 5693 \r\n3 17225 17224 16622 5694 \r\n3 17227 17226 14275 5695 \r\n3 17229 17228 13939 5696 \r\n3 12921 17230 17231 5697 \r\n3 15931 17232 6722 5698 \r\n3 11789 17233 17234 5699 \r\n3 17236 17235 13262 5700 \r\n3 5310 17237 10640 5701 \r\n3 16531 17238 17239 5702 \r\n3 12323 17240 12158 5703 \r\n3 9386 6678 17241 5704 \r\n3 9257 17242 6318 5705 \r\n3 17245 17243 17244 5706 \r\n3 17247 6921 17246 5707 \r\n3 5447 17248 7545 5708 \r\n3 17250 17249 14715 5709 \r\n3 13328 8398 13870 5710 \r\n3 17252 17042 17251 5711 \r\n3 10300 12119 16681 5712 \r\n3 5774 17253 17254 5713 \r\n3 17256 17255 15865 5714 \r\n3 17259 17257 17258 5715 \r\n3 17260 10057 16244 5716 \r\n3 11212 9947 16488 5717 \r\n3 13400 11924 13472 5718 \r\n3 15130 15981 17261 5719 \r\n3 9682 14214 14734 5720 \r\n3 11192 17262 8560 5721 \r\n3 5903 17263 11786 5722 \r\n3 10552 17264 17163 5723 \r\n3 17265 7739 6699 5724 \r\n3 17267 17266 15038 5725 \r\n3 14311 11796 14691 5726 \r\n3 13910 14754 9928 5727 \r\n3 17269 14190 17268 5728 \r\n3 12074 17270 8351 5729 \r\n3 17271 8066 6791 5730 \r\n3 17273 17272 11015 5731 \r\n3 6166 17274 17275 5732 \r\n3 10705 13741 17276 5733 \r\n3 12219 17277 17278 5734 \r\n3 16230 15611 17279 5735 \r\n3 13564 16805 14651 5736 \r\n3 15257 8738 17280 5737 \r\n3 6701 17281 17282 5738 \r\n3 17284 5173 17283 5739 \r\n3 17286 6845 17285 5740 \r\n3 16332 6514 17287 5741 \r\n3 17288 13082 16249 5742 \r\n3 17289 12988 14935 5743 \r\n3 16425 15880 17290 5744 \r\n3 17292 17291 12697 5745 \r\n3 5830 17293 6011 5746 \r\n3 17225 12860 9653 5747 \r\n3 10489 17294 17295 5748 \r\n3 11855 17296 17297 5749 \r\n3 17299 17298 7270 5750 \r\n3 14406 9259 17300 5751 \r\n3 17301 13958 10496 5752 \r\n3 17303 14530 17302 5753 \r\n3 6142 16859 10004 5754 \r\n3 7709 8438 16021 5755 \r\n3 5450 10548 15355 5756 \r\n3 8349 7011 15621 5757 \r\n3 10495 12264 14227 5758 \r\n3 17305 17304 15203 5759 \r\n3 17306 14592 7987 5760 \r\n3 13485 17307 14801 5761 \r\n3 17309 17308 12301 5762 \r\n3 11624 17310 17311 5763 \r\n3 17314 17312 17313 5764 \r\n3 13081 17273 17315 5765 \r\n3 17316 13519 10534 5766 \r\n3 17319 17317 17318 5767 \r\n3 16705 11292 16966 5768 \r\n3 16070 16996 17320 5769 \r\n3 17322 17321 7730 5770 \r\n3 9294 17323 17324 5771 \r\n3 13196 17325 13237 5772 \r\n3 8397 14939 17326 5773 \r\n3 17327 10082 7632 5774 \r\n3 12498 5336 17328 5775 \r\n3 17330 17329 13378 5776 \r\n3 17333 17331 17332 5777 \r\n3 13138 9028 17334 5778 \r\n3 16471 9936 16614 5779 \r\n3 17336 10858 17335 5780 \r\n3 13538 13750 6660 5781 \r\n3 10597 16135 17337 5782 \r\n3 17340 17338 17339 5783 \r\n3 17341 11507 11970 5784 \r\n3 16530 13398 17342 5785 \r\n3 15451 10679 17008 5786 \r\n3 17343 6204 5018 5787 \r\n3 12177 17197 11562 5788 \r\n3 16690 17344 5381 5789 \r\n3 11931 17345 16411 5790 \r\n3 16612 15892 8852 5791 \r\n3 10406 15117 17346 5792 \r\n3 7269 17347 17348 5793 \r\n3 16765 17349 17350 5794 \r\n3 17351 12322 10163 5795 \r\n3 7957 10474 17352 5796 \r\n3 17354 17353 13878 5797 \r\n3 17356 17355 12745 5798 \r\n3 17357 14242 7394 5799 \r\n3 7148 17358 17359 5800 \r\n3 17361 10884 17360 5801 \r\n3 9786 13656 14699 5802 \r\n3 9471 17362 13790 5803 \r\n3 17363 17022 12032 5804 \r\n3 7074 12329 6900 5805 \r\n3 11598 12203 15000 5806 \r\n3 6893 17364 13670 5807 \r\n3 15051 13724 6669 5808 \r\n3 8860 8740 17047 5809 \r\n3 10121 7511 17365 5810 \r\n3 16751 17366 17367 5811 \r\n3 16019 17368 7829 5812 \r\n3 15057 8096 17369 5813 \r\n3 13879 17370 15962 5814 \r\n3 16361 15441 5002 5815 \r\n3 17372 17371 12438 5816 \r\n3 17374 17373 17312 5817 \r\n3 13855 17375 17376 5818 \r\n3 17377 13841 13001 5819 \r\n3 10289 17378 17379 5820 \r\n3 10879 16900 14073 5821 \r\n3 17381 17380 10842 5822 \r\n3 10661 17382 9117 5823 \r\n3 17385 17383 17384 5824 \r\n3 8538 8530 17386 5825 \r\n3 12806 14099 16807 5826 \r\n3 7980 17387 14552 5827 \r\n3 16714 5160 17388 5828 \r\n3 15346 17389 8901 5829 \r\n3 10523 17390 10371 5830 \r\n3 6101 17391 17392 5831 \r\n3 16799 17393 17394 5832 \r\n3 17396 17395 15465 5833 \r\n3 17397 8071 7834 5834 \r\n3 8233 16986 13795 5835 \r\n3 15539 15267 14176 5836 \r\n3 17398 16248 16408 5837 \r\n3 17399 10994 13612 5838 \r\n3 17401 17400 12505 5839 \r\n3 11038 13269 14089 5840 \r\n3 5627 17402 17403 5841 \r\n3 16324 16571 17404 5842 \r\n3 13873 12801 17405 5843 \r\n3 17142 6706 15938 5844 \r\n3 14244 17406 17407 5845 \r\n3 12160 17408 13756 5846 \r\n3 17409 6616 12494 5847 \r\n3 15863 8621 7768 5848 \r\n3 17411 17410 8985 5849 \r\n3 15826 9179 17412 5850 \r\n3 17413 9519 16089 5851 \r\n3 6526 11520 17414 5852 \r\n3 12902 16897 17415 5853 \r\n3 6836 10647 17416 5854 \r\n3 17417 16553 8895 5855 \r\n3 11110 15175 14792 5856 \r\n3 17418 16711 16985 5857 \r\n3 16243 10900 17419 5858 \r\n3 16644 13175 5895 5859 \r\n3 10256 13796 16710 5860 \r\n3 10048 17420 17421 5861 \r\n3 16223 12638 17422 5862 \r\n3 10466 17423 5841 5863 \r\n3 17425 17370 17424 5864 \r\n3 17427 17426 16774 5865 \r\n3 6632 11086 17355 5866 \r\n3 17429 5917 17428 5867 \r\n3 17431 9691 17430 5868 \r\n3 15558 17432 12214 5869 \r\n3 17433 12904 13549 5870 \r\n3 12391 15948 16833 5871 \r\n3 9007 11229 17434 5872 \r\n3 15208 17435 16114 5873 \r\n3 13117 7325 17436 5874 \r\n3 17437 17227 11599 5875 \r\n3 17438 16958 16403 5876 \r\n3 17440 17439 9364 5877 \r\n3 17442 6214 17441 5878 \r\n3 7939 17443 17444 5879 \r\n3 13087 17445 8454 5880 \r\n3 17447 17446 16389 5881 \r\n3 17450 17448 17449 5882 \r\n3 16145 17451 17452 5883 \r\n3 16830 8795 17453 5884 \r\n3 17454 15142 9445 5885 \r\n3 15811 16675 17455 5886 \r\n3 17456 16165 9012 5887 \r\n3 11484 12482 17457 5888 \r\n3 7864 17458 17459 5889 \r\n3 9512 17460 17338 5890 \r\n3 17462 17461 5394 5891 \r\n3 16684 17463 17464 5892 \r\n3 17465 15911 16347 5893 \r\n3 17467 14776 17466 5894 \r\n3 17469 5270 17468 5895 \r\n3 11594 17470 12296 5896 \r\n3 17472 17471 13651 5897 \r\n3 17473 15690 11462 5898 \r\n3 17475 17474 14325 5899 \r\n3 17454 5072 15902 5900 \r\n3 12020 10576 16303 5901 \r\n3 17477 13002 17476 5902 \r\n3 5465 17478 17479 5903 \r\n3 17481 17480 13195 5904 \r\n3 17484 17482 17483 5905 \r\n3 17485 13179 17060 5906 \r\n3 17251 17449 10049 5907 \r\n3 17487 10904 17486 5908 \r\n3 17414 15176 11008 5909 \r\n3 17489 14428 17488 5910 \r\n3 17491 17490 10697 5911 \r\n3 17492 11584 13183 5912 \r\n3 17494 17493 13639 5913 \r\n3 17496 5991 17495 5914 \r\n3 17497 8907 15665 5915 \r\n3 8606 17498 7717 5916 \r\n3 11194 17499 17500 5917 \r\n3 12833 11737 13219 5918 \r\n3 10779 14951 17501 5919 \r\n3 17502 15358 13115 5920 \r\n3 17041 10556 17450 5921 \r\n3 17505 17503 17504 5922 \r\n3 12295 17506 13514 5923 \r\n3 15379 17507 17508 5924 \r\n3 16337 10281 17509 5925 \r\n3 15510 17510 5915 5926 \r\n3 17007 7319 6265 5927 \r\n3 17511 7602 17473 5928 \r\n3 17512 13156 17419 5929 \r\n3 7275 5791 5956 5930 \r\n3 10753 17513 17065 5931 \r\n3 14492 17514 17515 5932 \r\n3 12928 7265 12100 5933 \r\n3 14563 11900 17516 5934 \r\n3 17518 10545 17517 5935 \r\n3 17520 17519 14909 5936 \r\n3 17043 17521 17522 5937 \r\n3 17523 12328 16334 5938 \r\n3 17525 9292 17524 5939 \r\n3 17526 6971 13898 5940 \r\n3 17528 11908 17527 5941 \r\n3 17529 7563 14850 5942 \r\n3 8910 7779 17530 5943 \r\n3 10331 17531 16314 5944 \r\n3 7453 8688 10410 5945 \r\n3 17534 17532 17533 5946 \r\n3 13356 5873 12756 5947 \r\n3 11857 17535 10847 5948 \r\n3 16626 13077 7552 5949 \r\n3 17536 6043 10442 5950 \r\n3 17537 17380 17351 5951 \r\n3 12385 17538 17539 5952 \r\n3 17542 17540 17541 5953 \r\n3 11978 17543 17544 5954 \r\n3 17546 15439 17545 5955 \r\n3 17548 17547 14508 5956 \r\n3 12191 17549 8663 5957 \r\n3 17550 15799 9164 5958 \r\n3 7495 17551 17552 5959 \r\n3 12169 16536 9483 5960 \r\n3 13972 11948 14751 5961 \r\n3 17554 9616 17553 5962 \r\n3 9442 17290 6550 5963 \r\n3 11988 14359 12633 5964 \r\n3 17555 13391 16948 5965 \r\n3 16904 12089 15514 5966 \r\n3 14419 17556 17557 5967 \r\n3 17558 16264 6354 5968 \r\n3 14013 17559 13907 5969 \r\n3 17561 12429 17560 5970 \r\n3 10218 8012 17562 5971 \r\n3 17563 15883 16619 5972 \r\n3 10652 5918 12552 5973 \r\n3 17564 16525 14757 5974 \r\n3 12242 17565 11831 5975 \r\n3 17566 13837 11958 5976 \r\n3 11451 17456 17567 5977 \r\n3 17568 15153 16300 5978 \r\n3 16656 5323 17569 5979 \r\n3 12378 17570 17571 5980 \r\n3 17213 16577 15903 5981 \r\n3 16463 9240 17572 5982 \r\n3 17574 17573 12396 5983 \r\n3 17576 8979 17575 5984 \r\n3 10322 5629 17577 5985 \r\n3 7023 17244 17578 5986 \r\n3 6758 15006 15733 5987 \r\n3 17579 13877 7780 5988 \r\n3 17580 6581 15229 5989 \r\n3 14632 9650 13969 5990 \r\n3 17582 11274 17581 5991 \r\n3 7751 11300 17583 5992 \r\n3 17584 10809 8607 5993 \r\n3 16365 17070 16768 5994 \r\n3 17587 17585 17586 5995 \r\n3 13520 17588 17589 5996 \r\n3 7278 9250 13698 5997 \r\n3 17591 10283 17590 5998 \r\n3 17592 16451 6153 5999 \r\n3 11167 17593 17594 6000 \r\n3 16682 17595 17596 6001 \r\n3 9496 17597 10525 6002 \r\n3 17600 17598 17599 6003 \r\n3 17602 14512 17601 6004 \r\n3 15149 17603 16432 6005 \r\n3 16160 10774 16051 6006 \r\n3 7283 17168 17604 6007 \r\n3 16725 17605 15294 6008 \r\n3 14203 17557 17606 6009 \r\n3 6987 7578 5907 6010 \r\n3 17608 7042 17607 6011 \r\n3 12561 17609 15785 6012 \r\n3 17611 16547 17610 6013 \r\n3 17613 17612 5520 6014 \r\n3 10977 17614 17615 6015 \r\n3 17617 17231 17616 6016 \r\n3 8365 17618 17619 6017 \r\n3 15216 5328 9500 6018 \r\n3 16169 17620 8814 6019 \r\n3 7908 9815 17621 6020 \r\n3 16247 5313 8604 6021 \r\n3 17623 17622 10645 6022 \r\n3 6040 9013 15930 6023 \r\n3 6088 13182 5706 6024 \r\n3 7155 17624 17625 6025 \r\n3 16016 13823 17626 6026 \r\n3 11165 15862 15417 6027 \r\n3 17628 17627 5223 6028 \r\n3 17629 14356 14810 6029 \r\n3 7852 17630 9763 6030 \r\n3 11554 17631 17632 6031 \r\n3 5255 17633 17634 6032 \r\n3 9689 17635 6455 6033 \r\n3 17637 17636 11830 6034 \r\n3 17638 12173 5111 6035 \r\n3 15328 8491 7583 6036 \r\n3 17640 13967 17639 6037 \r\n3 16155 17641 17642 6038 \r\n3 6189 12418 14066 6039 \r\n3 11868 12966 17643 6040 \r\n3 15495 14302 7410 6041 \r\n3 17645 17644 5616 6042 \r\n3 14002 17646 17647 6043 \r\n3 7417 17648 14702 6044 \r\n3 16937 14373 16500 6045 \r\n3 17649 10168 16287 6046 \r\n3 17650 15543 17478 6047 \r\n3 17651 17298 14989 6048 \r\n3 8468 11104 17652 6049 \r\n3 17654 17653 16679 6050 \r\n3 15598 17487 17655 6051 \r\n3 17657 16301 17656 6052 \r\n3 14798 17527 17658 6053 \r\n3 17661 17659 17660 6054 \r\n3 17663 17662 15348 6055 \r\n3 11541 17664 7099 6056 \r\n3 17665 10259 10250 6057 \r\n3 10382 17666 17667 6058 \r\n3 17668 5051 8737 6059 \r\n3 10927 11057 15350 6060 \r\n3 17670 17669 13581 6061 \r\n3 14687 9765 17671 6062 \r\n3 17673 17672 17194 6063 \r\n3 15120 15329 5265 6064 \r\n3 9614 17674 17675 6065 \r\n3 5691 17676 16613 6066 \r\n3 16563 15133 16383 6067 \r\n3 17678 9781 17677 6068 \r\n3 9368 11217 9108 6069 \r\n3 9358 17679 17680 6070 \r\n3 17682 17409 17681 6071 \r\n3 14963 11293 9823 6072 \r\n3 17684 17683 11792 6073 \r\n3 17687 17685 17686 6074 \r\n3 15189 9507 9170 6075 \r\n3 17688 9064 5931 6076 \r\n3 17690 11512 17689 6077 \r\n3 17691 9291 16918 6078 \r\n3 17693 16558 17692 6079 \r\n3 17695 15179 17694 6080 \r\n3 11175 14439 14706 6081 \r\n3 11752 5988 5837 6082 \r\n3 17696 13459 12186 6083 \r\n3 8648 17697 11840 6084 \r\n3 8523 13163 17698 6085 \r\n3 17700 17313 17699 6086 \r\n3 17702 17701 12676 6087 \r\n3 17703 14680 17333 6088 \r\n3 17704 15545 11934 6089 \r\n3 11018 17705 8020 6090 \r\n3 15723 17706 13518 6091 \r\n3 17708 17707 7930 6092 \r\n3 17709 14838 13170 6093 \r\n3 16392 17237 14868 6094 \r\n3 12608 17710 9437 6095 \r\n3 17711 5469 14365 6096 \r\n3 17712 12268 17218 6097 \r\n3 14887 17713 17714 6098 \r\n3 7664 17715 10424 6099 \r\n3 15767 17716 16692 6100 \r\n3 11531 11506 13025 6101 \r\n3 17719 17717 17718 6102 \r\n3 17721 17720 16375 6103 \r\n3 17723 17722 14835 6104 \r\n3 17724 14921 11022 6105 \r\n3 10794 17725 8182 6106 \r\n3 17726 13792 6928 6107 \r\n3 15644 17727 5216 6108 \r\n3 13396 12211 17728 6109 \r\n3 9914 17729 17730 6110 \r\n3 15017 17731 12585 6111 \r\n3 7812 15199 7885 6112 \r\n3 16137 16927 5712 6113 \r\n3 17733 14577 17732 6114 \r\n3 12218 17734 16762 6115 \r\n3 17736 17735 17085 6116 \r\n3 17738 17737 9296 6117 \r\n3 17739 17410 7803 6118 \r\n3 13572 16832 6566 6119 \r\n3 17608 14414 14663 6120 \r\n3 9587 16468 10712 6121 \r\n3 8142 8009 7251 6122 \r\n3 6055 15970 17740 6123 \r\n3 11235 17741 13941 6124 \r\n3 13105 8376 15899 6125 \r\n3 12839 17742 17743 6126 \r\n3 17745 13845 17744 6127 \r\n3 17387 14149 17746 6128 \r\n3 14561 7369 17747 6129 \r\n3 14389 11560 15841 6130 \r\n3 16111 12614 5545 6131 \r\n3 12908 17748 17749 6132 \r\n3 6134 16268 12700 6133 \r\n3 17750 13674 9508 6134 \r\n3 11788 6661 17751 6135 \r\n3 14246 13935 11739 6136 \r\n3 5359 12504 17752 6137 \r\n3 12787 17753 17754 6138 \r\n3 5305 9133 16441 6139 \r\n3 17757 17755 17756 6140 \r\n3 17758 16914 9978 6141 \r\n3 12974 17759 17760 6142 \r\n3 6980 16674 6003 6143 \r\n3 17761 14884 8280 6144 \r\n3 10460 10970 7159 6145 \r\n3 13980 12906 7991 6146 \r\n3 6547 17762 17763 6147 \r\n3 17084 6485 17764 6148 \r\n3 17765 8783 10304 6149 \r\n3 17767 9651 17766 6150 \r\n3 17769 17768 6025 6151 \r\n3 10950 8877 17770 6152 \r\n3 6270 10085 11301 6153 \r\n3 16465 7027 17771 6154 \r\n3 16486 14628 10991 6155 \r\n3 17772 10042 8953 6156 \r\n3 11331 17773 17774 6157 \r\n3 15060 17775 17776 6158 \r\n3 16822 17777 17778 6159 \r\n3 8906 17779 17780 6160 \r\n3 12468 8666 16110 6161 \r\n3 5919 14883 13217 6162 \r\n3 17782 17781 10533 6163 \r\n3 17785 17783 17784 6164 \r\n3 15152 17786 7722 6165 \r\n3 9549 17787 17788 6166 \r\n3 14232 17781 17789 6167 \r\n3 17790 17134 7088 6168 \r\n3 12739 17791 10239 6169 \r\n3 17793 17792 11967 6170 \r\n3 12805 7166 13387 6171 \r\n3 6243 13176 16545 6172 \r\n3 16218 13648 14658 6173 \r\n3 17794 7059 15094 6174 \r\n3 9109 11209 17432 6175 \r\n3 13165 17795 17796 6176 \r\n3 17798 17797 5187 6177 \r\n3 16237 10632 12249 6178 \r\n3 17799 5514 6462 6179 \r\n3 16194 14423 17800 6180 \r\n3 11880 16456 17801 6181 \r\n3 17802 8300 15206 6182 \r\n3 17804 11234 17803 6183 \r\n3 6735 17805 17806 6184 \r\n3 17807 17376 15606 6185 \r\n3 6870 17808 17809 6186 \r\n3 16188 17810 17811 6187 \r\n3 13744 15906 5238 6188 \r\n3 17813 8499 17812 6189 \r\n3 17814 14848 10301 6190 \r\n3 17816 17815 11691 6191 \r\n3 13623 17817 17818 6192 \r\n3 5832 17819 17820 6193 \r\n3 17822 8736 17821 6194 \r\n3 11463 17303 12491 6195 \r\n3 11306 6838 15942 6196 \r\n3 17628 13654 13929 6197 \r\n3 17824 6140 17823 6198 \r\n3 10510 8587 17825 6199 \r\n3 14544 17826 16297 6200 \r\n3 13515 17827 17828 6201 \r\n3 16317 14931 16336 6202 \r\n3 12287 17829 17446 6203 \r\n3 17831 17830 9262 6204 \r\n3 17833 17832 9837 6205 \r\n3 17352 17834 17835 6206 \r\n3 11548 17836 11400 6207 \r\n3 12582 17837 12352 6208 \r\n3 15045 6569 16744 6209 \r\n3 16723 16436 17838 6210 \r\n3 17840 17839 7133 6211 \r\n3 17842 6902 17841 6212 \r\n3 17844 14483 17843 6213 \r\n3 9931 11885 10191 6214 \r\n3 10378 6892 17845 6215 \r\n3 16561 5200 6180 6216 \r\n3 17847 17846 5891 6217 \r\n3 9642 17848 14607 6218 \r\n3 17851 17849 17850 6219 \r\n3 17853 12184 17852 6220 \r\n3 15742 15649 6030 6221 \r\n3 17508 17854 16975 6222 \r\n3 17856 17855 13734 6223 \r\n3 17858 17857 7467 6224 \r\n3 12011 15761 17859 6225 \r\n3 12959 14760 10601 6226 \r\n3 17861 17860 13839 6227 \r\n3 8125 17862 9470 6228 \r\n3 17863 13184 17383 6229 \r\n3 12383 13116 17864 6230 \r\n3 6451 12496 16951 6231 \r\n3 17866 17865 17219 6232 \r\n3 12978 5694 14430 6233 \r\n3 17867 5039 14536 6234 \r\n3 12799 17868 17869 6235 \r\n3 17872 17870 17871 6236 \r\n3 6209 10541 12059 6237 \r\n3 16048 17873 13174 6238 \r\n3 16687 10170 17874 6239 \r\n3 15788 13199 17875 6240 \r\n3 6325 10571 15170 6241 \r\n3 5536 17876 11559 6242 \r\n3 17348 17877 8947 6243 \r\n3 11573 17878 17879 6244 \r\n3 17881 17880 13315 6245 \r\n3 17882 17453 13048 6246 \r\n3 17883 7929 7778 6247 \r\n3 16716 8519 15868 6248 \r\n3 8605 17208 9486 6249 \r\n3 10461 17100 17884 6250 \r\n3 17886 17885 6498 6251 \r\n3 17887 16837 6615 6252 \r\n3 17890 17888 17889 6253 \r\n3 17671 17579 14688 6254 \r\n3 16611 17891 7429 6255 \r\n3 13854 5273 17892 6256 \r\n3 16285 13911 13335 6257 \r\n3 8033 7518 17893 6258 \r\n3 16313 9228 14046 6259 \r\n3 9049 10972 9724 6260 \r\n3 10060 17894 17895 6261 \r\n3 17898 17896 17897 6262 \r\n3 11444 17001 17899 6263 \r\n3 7123 17900 15633 6264 \r\n3 17286 17901 17902 6265 \r\n3 17905 17903 17904 6266 \r\n3 8294 9670 10488 6267 \r\n3 11690 14313 10754 6268 \r\n3 17257 17906 13664 6269 \r\n3 17907 10443 17332 6270 \r\n3 16636 10973 11115 6271 \r\n3 17908 12941 8848 6272 \r\n3 17911 17909 17910 6273 \r\n3 17912 7526 11819 6274 \r\n3 7921 17913 9574 6275 \r\n3 12549 16654 16572 6276 \r\n3 17915 13229 17914 6277 \r\n3 17916 15134 13891 6278 \r\n3 7589 10112 17838 6279 \r\n3 17917 10485 17106 6280 \r\n3 6128 17918 17685 6281 \r\n3 17444 13789 13292 6282 \r\n3 8752 10891 10387 6283 \r\n3 6694 17919 17920 6284 \r\n3 5557 17130 11161 6285 \r\n3 10255 17921 9685 6286 \r\n3 8195 17922 17240 6287 \r\n3 11832 17923 14257 6288 \r\n3 17344 17924 12052 6289 \r\n3 7612 17925 17926 6290 \r\n3 15960 13991 11099 6291 \r\n3 12197 12024 6183 6292 \r\n3 17929 17927 17928 6293 \r\n3 17930 12189 11151 6294 \r\n3 17932 17931 17633 6295 \r\n3 17934 16581 17933 6296 \r\n3 14157 17025 17935 6297 \r\n3 17937 12484 17936 6298 \r\n3 17939 17938 5317 6299 \r\n3 6446 14314 11689 6300 \r\n3 17942 17940 17941 6301 \r\n3 17944 14661 17943 6302 \r\n3 12425 17945 17718 6303 \r\n3 13644 16405 9273 6304 \r\n3 17948 17946 17947 6305 \r\n3 17949 13054 6683 6306 \r\n3 13616 17950 17951 6307 \r\n3 16504 6038 9646 6308 \r\n3 17116 8486 11454 6309 \r\n3 17952 9877 16851 6310 \r\n3 17953 13848 9456 6311 \r\n3 17955 16415 17954 6312 \r\n3 16666 16638 12501 6313 \r\n3 17957 14212 17956 6314 \r\n3 9343 17958 17554 6315 \r\n3 17960 17788 17959 6316 \r\n3 17961 10470 12887 6317 \r\n3 17962 14968 7301 6318 \r\n3 17963 5541 17933 6319 \r\n3 15560 17964 17965 6320 \r\n3 10374 9341 7887 6321 \r\n3 5645 17966 14700 6322 \r\n3 16424 17967 9009 6323 \r\n3 16936 11398 17622 6324 \r\n3 17969 13542 17968 6325 \r\n3 12398 5612 8668 6326 \r\n3 15456 17960 13278 6327 \r\n3 17971 17970 17589 6328 \r\n3 13326 17972 17973 6329 \r\n3 13064 9112 7691 6330 \r\n3 17976 17974 17975 6331 \r\n3 8536 9625 13544 6332 \r\n3 14252 17977 17978 6333 \r\n3 11281 15283 9194 6334 \r\n3 17981 17979 17980 6335 \r\n3 17982 11014 8395 6336 \r\n3 17983 13058 10781 6337 \r\n3 17984 16466 12590 6338 \r\n3 17985 16537 5177 6339 \r\n3 13579 16701 7193 6340 \r\n3 17988 17986 17987 6341 \r\n3 17990 17853 17989 6342 \r\n3 13133 17991 17992 6343 \r\n3 16763 16908 6328 6344 \r\n3 14141 15226 14866 6345 \r\n3 11039 17993 15448 6346 \r\n3 17995 17994 14740 6347 \r\n3 14024 6613 17996 6348 \r\n3 17998 5828 17997 6349 \r\n3 18000 17999 16091 6350 \r\n3 18001 17750 5183 6351 \r\n3 14988 9751 18002 6352 \r\n3 11001 14268 8276 6353 \r\n3 9285 18003 18004 6354 \r\n3 9857 10831 5663 6355 \r\n3 18005 13204 17095 6356 \r\n3 18008 18006 18007 6357 \r\n3 18009 9142 12667 6358 \r\n3 9309 17179 6317 6359 \r\n3 18011 7116 18010 6360 \r\n3 15509 15884 8295 6361 \r\n3 10643 9163 18012 6362 \r\n3 16104 18013 11748 6363 \r\n3 17258 16702 15583 6364 \r\n3 18015 18014 16118 6365 \r\n3 5564 16849 5871 6366 \r\n3 18016 16179 17706 6367 \r\n3 18017 13358 7303 6368 \r\n3 18018 13781 11351 6369 \r\n3 11826 16345 18019 6370 \r\n3 16894 5229 9448 6371 \r\n3 7321 18020 6263 6372 \r\n3 18022 7025 18021 6373 \r\n3 18023 15738 17597 6374 \r\n3 9588 11250 11460 6375 \r\n3 18025 15058 18024 6376 \r\n3 6048 17401 18026 6377 \r\n3 18028 18027 14092 6378 \r\n3 18030 18029 11968 6379 \r\n3 9416 11916 13525 6380 \r\n3 14612 16925 18031 6381 \r\n3 8697 17702 16605 6382 \r\n3 18032 10832 17416 6383 \r\n3 12201 18033 7034 6384 \r\n3 18034 16267 16056 6385 \r\n3 18036 18035 5140 6386 \r\n3 10325 10507 13977 6387 \r\n3 18037 10403 16973 6388 \r\n3 16883 18038 18039 6389 \r\n3 18040 5673 15645 6390 \r\n3 10941 18041 13448 6391 \r\n3 12920 18042 12984 6392 \r\n3 13287 18043 8415 6393 \r\n3 18044 18010 7296 6394 \r\n3 17873 12415 15303 6395 \r\n3 8869 7882 7082 6396 \r\n3 15280 15834 6771 6397 \r\n3 8870 14000 18045 6398 \r\n3 17637 16395 18046 6399 \r\n3 10508 13511 18047 6400 \r\n3 18050 18048 18049 6401 \r\n3 12292 5405 13373 6402 \r\n3 10696 18051 15519 6403 \r\n3 18053 14402 18052 6404 \r\n3 18056 18054 18055 6405 \r\n3 16699 15531 18057 6406 \r\n3 18059 8236 18058 6407 \r\n3 9299 18060 18061 6408 \r\n3 18063 18062 13712 6409 \r\n3 16588 18064 18065 6410 \r\n3 18066 10415 14545 6411 \r\n3 18068 18067 9004 6412 \r\n3 17824 18069 18070 6413 \r\n3 12248 17609 13050 6414 \r\n3 8340 7478 18071 6415 \r\n3 18073 8224 18072 6416 \r\n3 7356 7996 16606 6417 \r\n3 6970 18074 15190 6418 \r\n3 14412 15550 15602 6419 \r\n3 18075 12793 14198 6420 \r\n3 18078 18076 18077 6421 \r\n3 17558 18079 14782 6422 \r\n3 13513 15480 11593 6423 \r\n3 17101 14549 6777 6424 \r\n3 18081 18080 16509 6425 \r\n3 12648 11579 12336 6426 \r\n3 18083 17855 18082 6427 \r\n3 11870 7415 13953 6428 \r\n3 18086 18084 18085 6429 \r\n3 12720 6218 13881 6430 \r\n3 16461 18087 14364 6431 \r\n3 18090 18088 18089 6432 \r\n3 13245 18091 16251 6433 \r\n3 18093 18092 11339 6434 \r\n3 18095 18094 17946 6435 \r\n3 7648 18096 9742 6436 \r\n3 15628 13461 18097 6437 \r\n3 18098 14674 7273 6438 \r\n3 5703 9623 17738 6439 \r\n3 16970 5850 11071 6440 \r\n3 13056 18099 12234 6441 \r\n3 18101 10243 18100 6442 \r\n3 18102 8973 13777 6443 \r\n3 18104 18103 12502 6444 \r\n3 18105 11564 9045 6445 \r\n3 18107 7130 18106 6446 \r\n3 18108 12310 17482 6447 \r\n3 18110 18109 9598 6448 \r\n3 5855 18111 13403 6449 \r\n3 17049 14874 10583 6450 \r\n3 18112 12952 15559 6451 \r\n3 12439 6170 15467 6452 \r\n3 18113 12797 10477 6453 \r\n3 7151 18114 7883 6454 \r\n3 16800 10967 17753 6455 \r\n3 16483 8080 17006 6456 \r\n3 18116 18115 6685 6457 \r\n3 18045 18117 11889 6458 \r\n3 5811 18118 17056 6459 \r\n3 18120 18119 14074 6460 \r\n3 18122 18121 17875 6461 \r\n3 12431 14470 18114 6462 \r\n3 12315 18123 15891 6463 \r\n3 17993 18124 18125 6464 \r\n3 18127 18126 12407 6465 \r\n3 15975 18128 18129 6466 \r\n3 18131 18130 15564 6467 \r\n3 14058 18132 18133 6468 \r\n3 18135 18067 18134 6469 \r\n3 13433 16760 8671 6470 \r\n3 17169 13694 18136 6471 \r\n3 15020 8859 10710 6472 \r\n3 16660 18137 7747 6473 \r\n3 8489 10367 17761 6474 \r\n3 18139 18138 15636 6475 \r\n3 6228 18140 8846 6476 \r\n3 18141 6366 13987 6477 \r\n3 14690 17469 18142 6478 \r\n3 12863 18143 18011 6479 \r\n3 10232 12772 14705 6480 \r\n3 17035 7831 18144 6481 \r\n3 14476 12748 18145 6482 \r\n3 18147 18146 18032 6483 \r\n3 18149 17428 18148 6484 \r\n3 5932 18150 8634 6485 \r\n3 5089 18151 18152 6486 \r\n3 12912 18153 18154 6487 \r\n3 17576 18021 18155 6488 \r\n3 18158 18156 18157 6489 \r\n3 18159 13668 10067 6490 \r\n3 14748 18160 17204 6491 \r\n3 18162 18161 12093 6492 \r\n3 6693 14086 9717 6493 \r\n3 16052 18163 16964 6494 \r\n3 16120 18164 18165 6495 \r\n3 13501 18085 18166 6496 \r\n3 18168 11990 18167 6497 \r\n3 18170 6962 18169 6498 \r\n3 16412 5943 16225 6499 \r\n3 14498 16921 18171 6500 \r\n3 17507 6789 18172 6501 \r\n3 18175 18173 18174 6502 \r\n3 18177 16391 18176 6503 \r\n3 15007 18178 17835 6504 \r\n3 17739 12007 15272 6505 \r\n3 18180 8409 18179 6506 \r\n3 18181 15061 7835 6507 \r\n3 18183 16764 18182 6508 \r\n3 17770 18184 15992 6509 \r\n3 17375 6036 14375 6510 \r\n3 18186 18185 14120 6511 \r\n3 5170 17978 15840 6512 \r\n3 6927 18187 11123 6513 \r\n3 13902 18188 18189 6514 \r\n3 12881 15872 10637 6515 \r\n3 6749 15929 18190 6516 \r\n3 14719 18191 18192 6517 \r\n3 18194 18193 17309 6518 \r\n3 6056 8821 18195 6519 \r\n3 5767 15744 17117 6520 \r\n3 18196 11340 15079 6521 \r\n3 14215 16599 17248 6522 \r\n3 14678 18197 15376 6523 \r\n3 17531 16390 18198 6524 \r\n3 18199 11604 17929 6525 \r\n3 9657 14627 10565 6526 \r\n3 18201 18200 13773 6527 \r\n3 7253 18202 9597 6528 \r\n3 16278 15225 14681 6529 \r\n3 18203 8553 16589 6530 \r\n3 5311 15118 17470 6531 \r\n3 18204 12641 11527 6532 \r\n3 15749 16206 18205 6533 \r\n3 18206 17245 16724 6534 \r\n3 12942 8001 13586 6535 \r\n3 18208 18207 8407 6536 \r\n3 14357 18209 7938 6537 \r\n3 18211 18210 17812 6538 \r\n3 18214 18212 18213 6539 \r\n3 18215 11720 12714 6540 \r\n3 11193 18216 17860 6541 \r\n3 15889 14737 6988 6542 \r\n3 18217 17247 16343 6543 \r\n3 18218 13629 17745 6544 \r\n3 17887 18219 16780 6545 \r\n3 12174 16697 18220 6546 \r\n3 7388 16221 16129 6547 \r\n3 6234 16060 12405 6548 \r\n3 7037 16979 18221 6549 \r\n3 16396 18222 7642 6550 \r\n3 18223 6471 12857 6551 \r\n3 16439 18224 12270 6552 \r\n3 17830 7002 5788 6553 \r\n3 7013 18225 6095 6554 \r\n3 18227 8048 18226 6555 \r\n3 13136 14929 11326 6556 \r\n3 18229 16842 18228 6557 \r\n3 18232 18230 18231 6558 \r\n3 11385 18203 18062 6559 \r\n3 17649 18233 18234 6560 \r\n3 17982 13255 18235 6561 \r\n3 18236 13312 9847 6562 \r\n3 18237 10559 12015 6563 \r\n3 16166 10558 16594 6564 \r\n3 12487 18238 11580 6565 \r\n3 7134 14746 14166 6566 \r\n3 15285 15584 8623 6567 \r\n3 10230 18239 11090 6568 \r\n3 15964 18240 15657 6569 \r\n3 18242 7755 18241 6570 \r\n3 18243 7280 10799 6571 \r\n3 15502 13966 17889 6572 \r\n3 15424 18244 15363 6573 \r\n3 18245 12816 13304 6574 \r\n3 18246 13316 16239 6575 \r\n3 18247 12147 11233 6576 \r\n3 10480 16853 16693 6577 \r\n3 18248 14900 14814 6578 \r\n3 6763 17220 17688 6579 \r\n3 18250 18249 16984 6580 \r\n3 18253 18251 18252 6581 \r\n3 7595 18209 8566 6582 \r\n3 18255 18254 7649 6583 \r\n3 13355 6626 18256 6584 \r\n3 18258 18257 17230 6585 \r\n3 18259 6148 17491 6586 \r\n3 18261 18260 18213 6587 \r\n3 13754 15817 17669 6588 \r\n3 10883 12403 18262 6589 \r\n3 16503 18263 18264 6590 \r\n3 16366 14572 16757 6591 \r\n3 15672 18265 13769 6592 \r\n3 18267 18266 5100 6593 \r\n3 18269 7985 18268 6594 \r\n3 18271 18270 16712 6595 \r\n3 18272 15205 5032 6596 \r\n3 10855 12447 16733 6597 \r\n3 8528 18273 15227 6598 \r\n3 18275 15596 18274 6599 \r\n3 18277 18276 15789 6600 \r\n3 18279 10075 18278 6601 \r\n3 14594 18280 18281 6602 \r\n3 13720 18282 15279 6603 \r\n3 18284 18283 16442 6604 \r\n3 18286 18285 10352 6605 \r\n3 18288 18279 18287 6606 \r\n3 16686 16906 18211 6607 \r\n3 11395 16482 6527 6608 \r\n3 18171 14537 17153 6609 \r\n3 7179 18289 18290 6610 \r\n3 18291 9688 5012 6611 \r\n3 17254 15478 18292 6612 \r\n3 18293 15356 18034 6613 \r\n3 17591 18294 7010 6614 \r\n3 17575 14593 18295 6615 \r\n3 13090 18296 15049 6616 \r\n3 5539 9461 17630 6617 \r\n3 17164 16101 18297 6618 \r\n3 18299 18298 15601 6619 \r\n3 18301 18300 10659 6620 \r\n3 5980 13851 18302 6621 \r\n3 14993 12476 9203 6622 \r\n3 18303 8928 14132 6623 \r\n3 10928 15351 16444 6624 \r\n3 17394 6168 18304 6625 \r\n3 5733 10598 18305 6626 \r\n3 13034 16854 16887 6627 \r\n3 18308 18306 18307 6628 \r\n3 18310 18309 9686 6629 \r\n3 18311 12267 12566 6630 \r\n3 18313 18312 10657 6631 \r\n3 11384 18314 8554 6632 \r\n3 5133 11162 14985 6633 \r\n3 18316 18315 16722 6634 \r\n3 18317 10125 15263 6635 \r\n3 13996 7725 18318 6636 \r\n3 15244 14934 15831 6637 \r\n3 18320 18319 14017 6638 \r\n3 14952 17907 15317 6639 \r\n3 15783 17616 18321 6640 \r\n3 5457 16579 18322 6641 \r\n3 15147 18321 18323 6642 \r\n3 18324 5321 17735 6643 \r\n3 18326 11961 18325 6644 \r\n3 14238 5577 7469 6645 \r\n3 17145 18327 9971 6646 \r\n3 18328 17192 17045 6647 \r\n3 6884 18329 18330 6648 \r\n3 17342 11023 14467 6649 \r\n3 10916 18331 18332 6650 \r\n3 18334 18333 7554 6651 \r\n3 16038 18335 18336 6652 \r\n3 18338 6157 18337 6653 \r\n3 14262 12294 6869 6654 \r\n3 5231 14815 17942 6655 \r\n3 17713 18339 18340 6656 \r\n3 18343 18341 18342 6657 \r\n3 17810 15894 10302 6658 \r\n3 8448 18199 15987 6659 \r\n3 7581 18344 17255 6660 \r\n3 18347 18345 18346 6661 \r\n3 18349 13834 18348 6662 \r\n3 11896 11020 17023 6663 \r\n3 18350 17500 16677 6664 \r\n3 18352 18351 18178 6665 \r\n3 18353 10579 8082 6666 \r\n3 18354 13608 6842 6667 \r\n3 12625 18355 5226 6668 \r\n3 7486 9814 10373 6669 \r\n3 18356 11773 12333 6670 \r\n3 18358 18357 16920 6671 \r\n3 18360 16821 18359 6672 \r\n3 16715 7653 13104 6673 \r\n3 18362 17541 18361 6674 \r\n3 9207 14812 18363 6675 \r\n3 17020 16246 11128 6676 \r\n3 5806 18364 11756 6677 \r\n3 18367 18365 18366 6678 \r\n3 18369 7451 18368 6679 \r\n3 18247 13346 14135 6680 \r\n3 12511 18370 18371 6681 \r\n3 18373 18372 17550 6682 \r\n3 18374 18346 12406 6683 \r\n3 9150 14405 8485 6684 \r\n3 18376 7872 18375 6685 \r\n3 12763 17497 6700 6686 \r\n3 13806 10852 11920 6687 \r\n3 16184 11794 18377 6688 \r\n3 13140 14254 6121 6689 \r\n3 18379 17854 18378 6690 \r\n3 7889 6741 18380 6691 \r\n3 18382 13551 18381 6692 \r\n3 18385 18383 18384 6693 \r\n3 15192 18386 15359 6694 \r\n3 16758 18387 5484 6695 \r\n3 18009 18388 11197 6696 \r\n3 5923 18389 18390 6697 \r\n3 6917 6965 7311 6698 \r\n3 11636 13484 12746 6699 \r\n3 17104 18102 7245 6700 \r\n3 18391 10797 15401 6701 \r\n3 18393 7862 18392 6702 \r\n3 18395 17243 18394 6703 \r\n3 7212 16417 17645 6704 \r\n3 18396 18100 15380 6705 \r\n3 18397 6643 12303 6706 \r\n3 18398 10090 14524 6707 \r\n3 15342 16450 13242 6708 \r\n3 12134 9327 9879 6709 \r\n3 9418 18399 12895 6710 \r\n3 9195 5209 9003 6711 \r\n3 18402 18400 18401 6712 \r\n3 8436 18403 18404 6713 \r\n3 6435 18405 8816 6714 \r\n3 13449 13423 5875 6715 \r\n3 13822 18406 18407 6716 \r\n3 18409 18408 9188 6717 \r\n3 15050 18099 8250 6718 \r\n3 18411 6863 18410 6719 \r\n3 10971 18412 15994 6720 \r\n3 15888 18413 18414 6721 \r\n3 8271 9232 18415 6722 \r\n3 18417 18416 10954 6723 \r\n3 17405 18418 16928 6724 \r\n3 18419 14932 5396 6725 \r\n3 17398 18420 11019 6726 \r\n3 16014 18421 7457 6727 \r\n3 6207 6321 18422 6728 \r\n3 17209 18423 17347 6729 \r\n3 18424 12749 14477 6730 \r\n3 7672 14040 18425 6731 \r\n3 17886 15656 9019 6732 \r\n3 18428 18426 18427 6733 \r\n3 17173 17443 7594 6734 \r\n3 10961 18429 9723 6735 \r\n3 18430 15116 13066 6736 \r\n3 18432 6156 18431 6737 \r\n3 16753 14928 18433 6738 \r\n3 18436 18434 18435 6739 \r\n3 18437 16319 5818 6740 \r\n3 16698 16323 17567 6741 \r\n3 7619 14263 16062 6742 \r\n3 18439 7327 18438 6743 \r\n3 18441 18440 14172 6744 \r\n3 10689 18320 15989 6745 \r\n3 13887 13555 17172 6746 \r\n3 17809 18442 11703 6747 \r\n3 12823 7142 17975 6748 \r\n3 18445 18443 18444 6749 \r\n3 13428 18446 9894 6750 \r\n3 7216 6671 12202 6751 \r\n3 18447 15706 17930 6752 \r\n3 14374 7439 18448 6753 \r\n3 15422 12209 17797 6754 \r\n3 13417 17963 14505 6755 \r\n3 6641 18449 7060 6756 \r\n3 15219 18450 14591 6757 \r\n3 18453 18451 18452 6758 \r\n3 13718 18454 18422 6759 \r\n3 10554 18455 11515 6760 \r\n3 5083 13069 14343 6761 \r\n3 17562 16142 17544 6762 \r\n3 9102 18060 17028 6763 \r\n3 17759 14583 18456 6764 \r\n3 13167 13091 16971 6765 \r\n3 18457 17663 6996 6766 \r\n3 14668 18458 9396 6767 \r\n3 13637 17214 8176 6768 \r\n3 18459 16061 13704 6769 \r\n3 18306 18460 18461 6770 \r\n3 18193 18462 16269 6771 \r\n3 12575 18463 11628 6772 \r\n3 18466 18464 18465 6773 \r\n3 15421 18000 18406 6774 \r\n3 10081 10271 9002 6775 \r\n3 18468 16117 18467 6776 \r\n3 18470 18469 15600 6777 \r\n3 18473 18471 18472 6778 \r\n3 13450 18430 9972 6779 \r\n3 18474 18222 5479 6780 \r\n3 15333 18475 16294 6781 \r\n3 16719 7504 15555 6782 \r\n3 18477 18476 14877 6783 \r\n3 14521 6555 18478 6784 \r\n3 7781 16924 9851 6785 \r\n3 8124 17431 12771 6786 \r\n3 18217 17888 16182 6787 \r\n3 15386 18479 17769 6788 \r\n3 13626 18480 18146 6789 \r\n3 5435 18481 15548 6790 \r\n3 5959 18482 18483 6791 \r\n3 5598 15971 18484 6792 \r\n3 9785 9966 18485 6793 \r\n3 18487 17232 18486 6794 \r\n3 13277 18488 18489 6795 \r\n3 18490 17754 14603 6796 \r\n3 18491 16524 14869 6797 \r\n3 8866 8383 18174 6798 \r\n3 18493 10864 18492 6799 \r\n3 11138 14908 11616 6800 \r\n3 8161 7903 5634 6801 \r\n3 17280 5050 18494 6802 \r\n3 18496 18495 12271 6803 \r\n3 9544 14444 16879 6804 \r\n3 18498 18497 10833 6805 \r\n3 18499 10881 17291 6806 \r\n3 17158 18500 17166 6807 \r\n3 8635 7501 5963 6808 \r\n3 10672 16171 13221 6809 \r\n3 17430 17971 17819 6810 \r\n3 18501 12348 16159 6811 \r\n3 14930 18502 18503 6812 \r\n3 18505 18504 18064 6813 \r\n3 18506 15629 5630 6814 \r\n3 11650 9283 18507 6815 \r\n3 11549 6751 6082 6816 \r\n3 13284 16476 8965 6817 \r\n3 10216 16659 18508 6818 \r\n3 18510 14761 18509 6819 \r\n3 15298 16217 5136 6820 \r\n3 12664 10585 18317 6821 \r\n3 16148 17730 18511 6822 \r\n3 18512 17722 14574 6823 \r\n3 18513 14958 12729 6824 \r\n3 11377 18514 14230 6825 \r\n3 16175 16000 16616 6826 \r\n3 12949 9520 18515 6827 \r\n3 6504 18516 18517 6828 \r\n3 7297 9608 18518 6829 \r\n3 18455 18519 8363 6830 \r\n3 18522 18520 18521 6831 \r\n3 18524 18523 10270 6832 \r\n3 18526 18525 18429 6833 \r\n3 18527 14998 9001 6834 \r\n3 18529 18528 6256 6835 \r\n3 18112 14833 16028 6836 \r\n3 17947 14733 18530 6837 \r\n3 6453 9900 18531 6838 \r\n3 18533 10837 18532 6839 \r\n3 18535 8710 18534 6840 \r\n3 11254 18536 12615 6841 \r\n3 12579 18537 5747 6842 \r\n3 11707 18538 11359 6843 \r\n3 18540 18539 6167 6844 \r\n3 17681 16044 14529 6845 \r\n3 10376 17533 10479 6846 \r\n3 17771 18541 16595 6847 \r\n3 12958 18008 7770 6848 \r\n3 18542 5676 14726 6849 \r\n3 15200 18543 8637 6850 \r\n3 17917 18544 7397 6851 \r\n3 18545 16633 5252 6852 \r\n3 18547 18133 18546 6853 \r\n3 12208 5383 17818 6854 \r\n3 14516 12844 18548 6855 \r\n3 18549 14972 18042 6856 \r\n3 5420 18550 6441 6857 \r\n3 5610 8548 18551 6858 \r\n3 18552 11144 8108 6859 \r\n3 17619 13062 13297 6860 \r\n3 18168 18553 7205 6861 \r\n3 8315 18554 18555 6862 \r\n3 18557 18556 13614 6863 \r\n3 10505 18558 13202 6864 \r\n3 17336 18559 5635 6865 \r\n3 12555 10553 10599 6866 \r\n3 18560 11084 10685 6867 \r\n3 18562 8392 18561 6868 \r\n3 8414 13691 18563 6869 \r\n3 12489 18564 6596 6870 \r\n3 7635 18386 17016 6871 \r\n3 10521 18565 10642 6872 \r\n3 18066 16296 17573 6873 \r\n3 18567 18566 10051 6874 \r\n3 17673 14432 18568 6875 \r\n3 18569 12220 9481 6876 \r\n3 7960 18570 18571 6877 \r\n3 12478 18572 18573 6878 \r\n3 18574 8998 9110 6879 \r\n3 18576 14994 18575 6880 \r\n3 18577 16982 15955 6881 \r\n3 18401 17517 18536 6882 \r\n3 15024 18578 15893 6883 \r\n3 18579 11538 8586 6884 \r\n3 18582 18580 18581 6885 \r\n3 18015 18583 18584 6886 \r\n3 8035 11430 16138 6887 \r\n3 5944 17345 9943 6888 \r\n3 6523 18585 18586 6889 \r\n3 18587 18423 5312 6890 \r\n3 18588 9201 12982 6891 \r\n3 18590 16211 18589 6892 \r\n3 11800 18591 18592 6893 \r\n3 18442 18593 16898 6894 \r\n3 5852 16835 16069 6895 \r\n3 16227 14041 10478 6896 \r\n3 18595 8201 18594 6897 \r\n3 9482 17278 17631 6898 \r\n3 12979 15526 18596 6899 \r\n3 12707 18597 18598 6900 \r\n3 8016 18093 16551 6901 \r\n3 5936 18599 18600 6902 \r\n3 6381 9706 11563 6903 \r\n3 18602 18601 14408 6904 \r\n3 15623 17766 18287 6905 \r\n3 16004 11717 18603 6906 \r\n3 14513 9835 18531 6907 \r\n3 18604 12896 15182 6908 \r\n3 7425 13322 16998 6909 \r\n3 13481 14917 18605 6910 \r\n3 18606 15014 12508 6911 \r\n3 18607 17180 14762 6912 \r\n3 9756 9769 17543 6913 \r\n3 12165 18198 11206 6914 \r\n3 7412 17170 11964 6915 \r\n3 6104 14756 16379 6916 \r\n3 14712 18465 18608 6917 \r\n3 14333 6477 8541 6918 \r\n3 17652 15592 14144 6919 \r\n3 18611 18609 18610 6920 \r\n3 13232 18612 18613 6921 \r\n3 18614 18558 6316 6922 \r\n3 18377 10329 18615 6923 \r\n3 6502 13074 13180 6924 \r\n3 15595 8194 12976 6925 \r\n3 17317 6324 12031 6926 \r\n3 15897 12808 17504 6927 \r\n3 16181 18616 18617 6928 \r\n3 17657 16570 16592 6929 \r\n3 8702 15265 14626 6930 \r\n3 16156 16325 17135 6931 \r\n3 18618 16445 17350 6932 \r\n3 6480 18619 12847 6933 \r\n3 18620 11600 5455 6934 \r\n3 18621 18118 5609 6935 \r\n3 17659 7203 10023 6936 \r\n3 17895 18622 15563 6937 \r\n3 18624 18611 18623 6938 \r\n3 8583 6397 6392 6939 \r\n3 16878 16024 16548 6940 \r\n3 5040 18625 13023 6941 \r\n3 8261 18626 18627 6942 \r\n3 17314 18229 12537 6943 \r\n3 18047 12626 18628 6944 \r\n3 18629 15946 17102 6945 \r\n3 18630 14936 15255 6946 \r\n3 11043 17485 15211 6947 \r\n3 10828 18631 18632 6948 \r\n3 18634 7527 18633 6949 \r\n3 18635 11465 12651 6950 \r\n3 9119 16976 18636 6951 \r\n3 8484 17864 8245 6952 \r\n3 17790 18637 11341 6953 \r\n3 18639 18638 17583 6954 \r\n3 18640 17392 8064 6955 \r\n3 18641 15019 15334 6956 \r\n3 11784 11436 8799 6957 \r\n3 10818 18573 12686 6958 \r\n3 18643 18642 15322 6959 \r\n3 18077 10759 10386 6960 \r\n3 18644 15307 9245 6961 \r\n3 9873 18645 13570 6962 \r\n3 15750 15774 18646 6963 \r\n3 10733 7411 14240 6964 \r\n3 15331 6503 10366 6965 \r\n3 18427 15447 13868 6966 \r\n3 18647 16749 17679 6967 \r\n3 18648 17050 17395 6968 \r\n3 18649 18437 11955 6969 \r\n3 17012 16852 18650 6970 \r\n3 12263 18651 18652 6971 \r\n3 13203 18614 8120 6972 \r\n3 11489 17367 18653 6973 \r\n3 18655 5129 18654 6974 \r\n3 13188 9743 13765 6975 \r\n3 18657 18656 15694 6976 \r\n3 8753 18074 18658 6977 \r\n3 17840 7895 18596 6978 \r\n3 14640 13416 15316 6979 \r\n3 10962 12393 16082 6980 \r\n3 6387 18659 17565 6981 \r\n3 8442 11261 18660 6982 \r\n3 18101 15031 10612 6983 \r\n3 14094 18269 17828 6984 \r\n3 18661 7994 8527 6985 \r\n3 14582 14021 8277 6986 \r\n3 18181 18662 10939 6987 \r\n3 18540 18663 18542 6988 \r\n3 18665 9233 18664 6989 \r\n3 6303 11702 18666 6990 \r\n3 18668 14095 18667 6991 \r\n3 17696 17851 18669 6992 \r\n3 16073 16754 16266 6993 \r\n3 14189 18206 18670 6994 \r\n3 14415 13708 6665 6995 \r\n3 18237 9816 18671 6996 \r\n3 18672 12224 18623 6997 \r\n3 16872 18673 18674 6998 \r\n3 14384 18675 18676 6999 \r\n3 18677 6340 13401 7000 \r\n3 17399 9362 18678 7001 \r\n3 11389 13556 12710 7002 \r\n3 11778 15310 16485 7003 \r\n3 5060 8684 15798 7004 \r\n3 18680 10324 18679 7005 \r\n3 17413 8618 18681 7006 \r\n3 18682 18498 18480 7007 \r\n3 16517 18651 9772 7008 \r\n3 7587 12168 18683 7009 \r\n3 18685 16600 18684 7010 \r\n3 17059 18686 14436 7011 \r\n3 18689 18687 18688 7012 \r\n3 18690 14001 17138 7013 \r\n3 6528 15353 11875 7014 \r\n3 18691 7516 9513 7015 \r\n3 18692 8705 15248 7016 \r\n3 17938 5026 18693 7017 \r\n3 6937 16980 16559 7018 \r\n3 16146 18694 10128 7019 \r\n3 14438 15327 15631 7020 \r\n3 18696 6729 18695 7021 \r\n3 12013 7050 18697 7022 \r\n3 9578 8471 18698 7023 \r\n3 18700 17441 18699 7024 \r\n3 14614 18701 18702 7025 \r\n3 18703 8488 13161 7026 \r\n3 12593 11757 18704 7027 \r\n3 18706 7584 18705 7028 \r\n3 8400 18707 16520 7029 \r\n3 6027 17381 14059 7030 \r\n3 14973 18470 18708 7031 \r\n3 18710 18709 9913 7032 \r\n3 6732 9027 15385 7033 \r\n3 15825 17147 15769 7034 \r\n3 18711 16474 14156 7035 \r\n3 17693 18712 5621 7036 \r\n3 13557 11627 7150 7037 \r\n3 10766 13137 18713 7038 \r\n3 13011 18714 14826 7039 \r\n3 18431 16128 14983 7040 \r\n3 18717 18715 18716 7041 \r\n3 13280 13267 13842 7042 \r\n3 18718 18160 11423 7043 \r\n3 18719 9029 15081 7044 \r\n3 16011 5280 18545 7045 \r\n3 18722 18720 18721 7046 \r\n3 18724 9649 18723 7047 \r\n3 11216 10244 10611 7048 \r\n3 12868 7982 16643 7049 \r\n3 13681 15352 18725 7050 \r\n3 17475 7564 14454 7051 \r\n3 15431 7100 18726 7052 \r\n3 11269 9160 18727 7053 \r\n3 6958 18728 15042 7054 \r\n3 18729 15071 13505 7055 \r\n3 17265 17950 10726 7056 \r\n3 18730 18166 13775 7057 \r\n3 10396 18585 10911 7058 \r\n3 5056 10570 18335 7059 \r\n3 18366 15470 18731 7060 \r\n3 15664 18732 18733 7061 \r\n3 12521 18601 18734 7062 \r\n3 18735 17571 8669 7063 \r\n3 17826 9860 18736 7064 \r\n3 8282 8673 18737 7065 \r\n3 9875 18738 18739 7066 \r\n3 7932 18740 7520 7067 \r\n3 10901 18741 7031 7068 \r\n3 16282 10404 18115 7069 \r\n3 16628 16911 18742 7070 \r\n3 18567 12742 9793 7071 \r\n3 15580 17287 5619 7072 \r\n3 18743 5535 6438 7073 \r\n3 8565 17629 17087 7074 \r\n3 18105 15214 17330 7075 \r\n3 17176 18744 18745 7076 \r\n3 17162 17878 17474 7077 \r\n3 6728 18746 18747 7078 \r\n3 16672 17985 7035 7079 \r\n3 16759 18748 12238 7080 \r\n3 18395 8503 8808 7081 \r\n3 5453 14327 18749 7082 \r\n3 15707 16902 18750 7083 \r\n3 6119 14137 11205 7084 \r\n3 17297 14184 18751 7085 \r\n3 5922 18488 18371 7086 \r\n3 6205 8916 13503 7087 \r\n3 13377 18752 18753 7088 \r\n3 16233 17964 18522 7089 \r\n3 12893 18149 18754 7090 \r\n3 11630 18755 18756 7091 \r\n3 17758 18757 16132 7092 \r\n3 17402 18758 18759 7093 \r\n3 7576 18760 14966 7094 \r\n3 8444 11219 18761 7095 \r\n3 11605 16676 18762 7096 \r\n3 18763 9603 8297 7097 \r\n3 18604 18764 9093 7098 \r\n3 9932 18765 18731 7099 \r\n3 18767 18766 10609 7100 \r\n3 10076 17569 5949 7101 \r\n3 18768 18541 12063 7102 \r\n3 18770 18769 6803 7103 \r\n3 18772 18771 14570 7104 \r\n3 9973 5602 7879 7105 \r\n3 5571 18448 8950 7106 \r\n3 17259 6227 18773 7107 \r\n3 18776 18774 18775 7108 \r\n3 15136 18777 18778 7109 \r\n3 18747 18779 18780 7110 \r\n3 18781 12480 17789 7111 \r\n3 17107 6909 18782 7112 \r\n3 7164 11124 18783 7113 \r\n3 18784 8914 13359 7114 \r\n3 18770 15046 17831 7115 \r\n3 18785 17989 14250 7116 \r\n3 18787 18786 5775 7117 \r\n3 17676 18788 17891 7118 \r\n3 5331 14541 8427 7119 \r\n3 18790 13563 18789 7120 \r\n3 18791 15413 14111 7121 \r\n3 18792 9897 7256 7122 \r\n3 5960 18793 18794 7123 \r\n3 8426 17002 8248 7124 \r\n3 18476 18117 6298 7125 \r\n3 6035 18795 15433 7126 \r\n3 18796 17155 9540 7127 \r\n3 13275 16081 18797 7128 \r\n3 13995 11688 14967 7129 \r\n3 17323 14821 7056 7130 \r\n3 13960 15177 16566 7131 \r\n3 18800 18798 18799 7132 \r\n3 6854 14927 18801 7133 \r\n3 18803 17083 18802 7134 \r\n3 14820 18804 18805 7135 \r\n3 10011 18806 9303 7136 \r\n3 18807 14324 11807 7137 \r\n3 18810 18808 18809 7138 \r\n3 16772 18811 8093 7139 \r\n3 14105 18812 18777 7140 \r\n3 18813 9443 5575 7141 \r\n3 7399 11054 18814 7142 \r\n3 16960 11443 15921 7143 \r\n3 18817 18815 18816 7144 \r\n3 12471 5768 16629 7145 \r\n3 18164 18818 6010 7146 \r\n3 16988 13949 13261 7147 \r\n3 13964 18819 9942 7148 \r\n3 5260 18820 16811 7149 \r\n3 10925 18103 18821 7150 \r\n3 17184 17196 17948 7151 \r\n3 18811 18482 11676 7152 \r\n3 7825 11067 18109 7153 \r\n3 18822 14416 6664 7154 \r\n3 13222 5201 5428 7155 \r\n3 18179 17602 18823 7156 \r\n3 18697 18824 18059 7157 \r\n3 9907 18825 8810 7158 \r\n3 18381 13108 13666 7159 \r\n3 12892 13817 17429 7160 \r\n3 15312 17723 16523 7161 \r\n3 18827 18826 12791 7162 \r\n3 8695 14735 14096 7163 \r\n3 6864 18254 18073 7164 \r\n3 7455 18828 12151 7165 \r\n3 6827 5395 12291 7166 \r\n3 18830 6474 18829 7167 \r\n3 17939 15681 16550 7168 \r\n3 12963 18151 7320 7169 \r\n3 12937 13722 14148 7170 \r\n3 6069 12370 15485 7171 \r\n3 18557 14048 18831 7172 \r\n3 10395 14800 17105 7173 \r\n3 18832 13802 8480 7174 \r\n3 11173 10826 11719 7175 \r\n3 18833 14589 7221 7176 \r\n3 11199 18834 9143 7177 \r\n3 18836 18835 8374 7178 \r\n3 14069 18837 10364 7179 \r\n3 18839 18838 5927 7180 \r\n3 15809 6564 17055 7181 \r\n3 18630 18494 18840 7182 \r\n3 12080 18740 10097 7183 \r\n3 17670 8422 18841 7184 \r\n3 18843 18842 18790 7185 \r\n3 16190 18438 18844 7186 \r\n3 18499 12102 18845 7187 \r\n3 16596 17364 14604 7188 \r\n3 17627 18846 15288 7189 \r\n3 18847 18823 16737 7190 \r\n3 10240 15659 18848 7191 \r\n3 15188 14367 18849 7192 \r\n3 11537 10276 15498 7193 \r\n3 18851 14409 18850 7194 \r\n3 9561 18852 6609 7195 \r\n3 17958 13594 18853 7196 \r\n3 10680 18854 10769 7197 \r\n3 18855 7533 12289 7198 \r\n3 9721 16438 6465 7199 \r\n3 11977 8932 18856 7200 \r\n3 11342 11251 9946 7201 \r\n3 8745 18857 9797 7202 \r\n3 17285 18858 18859 7203 \r\n3 8509 8988 15137 7204 \r\n3 15296 18860 15482 7205 \r\n3 15561 8534 18520 7206 \r\n3 16645 13445 18861 7207 \r\n3 9113 18862 10462 7208 \r\n3 18864 9037 18863 7209 \r\n3 7616 16945 16351 7210 \r\n3 18815 18865 8348 7211 \r\n3 18867 18866 6078 7212 \r\n3 18868 8429 7234 7213 \r\n3 18369 18869 18216 7214 \r\n3 18872 18870 18871 7215 \r\n3 17484 7112 11632 7216 \r\n3 18873 8603 11093 7217 \r\n3 5199 9818 18874 7218 \r\n3 18876 18875 17596 7219 \r\n3 18877 17139 9457 7220 \r\n3 9331 18026 18878 7221 \r\n3 9478 18654 18586 7222 \r\n3 18879 15852 17923 7223 \r\n3 12538 11751 13583 7224 \r\n3 18463 18162 6380 7225 \r\n3 18881 18880 7918 7226 \r\n3 18883 18696 18882 7227 \r\n3 18886 18884 18885 7228 \r\n3 16655 18288 18887 7229 \r\n3 9047 15428 17984 7230 \r\n3 18888 8367 11190 7231 \r\n3 13838 14079 18889 7232 \r\n3 18890 12392 6711 7233 \r\n3 5715 17667 17335 7234 \r\n3 14596 18784 18017 7235 \r\n3 13109 8157 18200 7236 \r\n3 13571 6802 13019 7237 \r\n3 9274 17136 13653 7238 \r\n3 18892 18891 11203 7239 \r\n3 18893 11894 9926 7240 \r\n3 18896 18894 18895 7241 \r\n3 13073 17700 17945 7242 \r\n3 18898 18897 11578 7243 \r\n3 14019 9510 18899 7244 \r\n3 17837 18900 7198 7245 \r\n3 10131 12827 16322 7246 \r\n3 7984 18901 18902 7247 \r\n3 8574 18721 13320 7248 \r\n3 14433 16428 18903 7249 \r\n3 18905 9393 18904 7250 \r\n3 18575 18906 17037 7251 \r\n3 17879 18514 18907 7252 \r\n3 6404 5185 17817 7253 \r\n3 18694 9518 18908 7254 \r\n3 10469 18909 13711 7255 \r\n3 18910 12600 18797 7256 \r\n3 12802 6597 7139 7257 \r\n3 7382 13327 13190 7258 \r\n3 16527 6891 16511 7259 \r\n3 18911 15324 12225 7260 \r\n3 18664 15920 17156 7261 \r\n3 10108 15907 18912 7262 \r\n3 14399 18861 17289 7263 \r\n3 18913 13714 16817 7264 \r\n3 17563 11236 18033 7265 \r\n3 18914 15763 10952 7266 \r\n3 17577 5227 8056 7267 \r\n3 6254 18755 18119 7268 \r\n3 17505 17748 18915 7269 \r\n3 12039 16788 18916 7270 \r\n3 16446 12774 18917 7271 \r\n3 16096 17133 14778 7272 \r\n3 18919 18918 14767 7273 \r\n3 12359 17593 11959 7274 \r\n3 6413 5073 12343 7275 \r\n3 18774 18881 16526 7276 \r\n3 18921 18920 17462 7277 \r\n3 18923 17783 18922 7278 \r\n3 17397 8453 18924 7279 \r\n3 15905 16280 18925 7280 \r\n3 13587 16838 9148 7281 \r\n3 12049 6044 9630 7282 \r\n3 10595 18738 18926 7283 \r\n3 11528 18927 8645 7284 \r\n3 18474 17604 17937 7285 \r\n3 18928 12040 13978 7286 \r\n3 8602 18929 18930 7287 \r\n3 17683 13333 5491 7288 \r\n3 12880 15691 18864 7289 \r\n3 18933 18931 18932 7290 \r\n3 9528 5680 18934 7291 \r\n3 18207 18935 9714 7292 \r\n3 17588 17321 17820 7293 \r\n3 18936 6417 7045 7294 \r\n3 18937 14479 13804 7295 \r\n3 5739 8460 18284 7296 \r\n3 18939 18938 6963 7297 \r\n3 14895 18940 9910 7298 \r\n3 18941 12580 6212 7299 \r\n3 18942 17058 14266 7300 \r\n3 18944 18943 14234 7301 \r\n3 16203 5493 17590 7302 \r\n3 18947 18945 18946 7303 \r\n3 16604 18553 15901 7304 \r\n3 18948 15988 17928 7305 \r\n3 12018 16220 12260 7306 \r\n3 11525 8150 12254 7307 \r\n3 18234 6110 5533 7308 \r\n3 18766 15165 18775 7309 \r\n3 14944 14969 17962 7310 \r\n3 9792 18949 18950 7311 \r\n3 11120 7567 18424 7312 \r\n3 6427 18951 9821 7313 \r\n3 5166 16484 15640 7314 \r\n3 13920 15976 12831 7315 \r\n3 16752 11491 18801 7316 \r\n3 18952 5019 8951 7317 \r\n3 11996 6737 16546 7318 \r\n3 15044 5065 5574 7319 \r\n3 18941 10444 13943 7320 \r\n3 17262 13114 17119 7321 \r\n3 12235 18953 5902 7322 \r\n3 14698 5031 10719 7323 \r\n3 18955 18954 9762 7324 \r\n3 17834 18956 17856 7325 \r\n3 9280 13157 18957 7326 \r\n3 15668 18958 17510 7327 \r\n3 18960 18959 14226 7328 \r\n3 18307 18572 16376 7329 \r\n3 7754 10821 18788 7330 \r\n3 18961 17968 10237 7331 \r\n3 17747 12324 16669 7332 \r\n3 16453 17814 16283 7333 \r\n3 12117 13906 18962 7334 \r\n3 13998 16131 18645 7335 \r\n3 7190 10200 18963 7336 \r\n3 18965 18964 17199 7337 \r\n3 16889 13439 18966 7338 \r\n3 10980 16777 12293 7339 \r\n3 6544 18967 12309 7340 \r\n3 6054 18673 18968 7341 \r\n3 18969 13776 18084 7342 \r\n3 6221 16662 18970 7343 \r\n3 16795 15217 12167 7344 \r\n3 9436 8450 6804 7345 \r\n3 18972 18971 11089 7346 \r\n3 7695 11942 18444 7347 \r\n3 18122 13606 18260 7348 \r\n3 18803 17611 18973 7349 \r\n3 7381 18974 18244 7350 \r\n3 18975 7337 16912 7351 \r\n3 10630 11059 9773 7352 \r\n3 15768 16010 14481 7353 \r\n3 18976 17538 9766 7354 \r\n3 18977 17694 8631 7355 \r\n3 10197 10907 18978 7356 \r\n3 18979 18339 14886 7357 \r\n3 18028 18980 15546 7358 \r\n3 18981 17782 5093 7359 \r\n3 11919 13905 9193 7360 \r\n3 15855 13541 18709 7361 \r\n3 16212 18982 18983 7362 \r\n3 18984 6261 7847 7363 \r\n3 8934 9729 16193 7364 \r\n3 18985 18742 18134 7365 \r\n3 18986 10095 15271 7366 \r\n3 13345 15131 10405 7367 \r\n3 11623 13366 8007 7368 \r\n3 18987 11013 11295 7369 \r\n3 6408 18988 13846 7370 \r\n3 12149 18989 18990 7371 \r\n3 10528 6483 10999 7372 \r\n3 18992 18991 5364 7373 \r\n3 12732 14819 18993 7374 \r\n3 18656 17934 18994 7375 \r\n3 11844 18953 18296 7376 \r\n3 18534 7857 18995 7377 \r\n3 13016 8823 18996 7378 \r\n3 11141 6606 18997 7379 \r\n3 13601 14554 18998 7380 \r\n3 6414 16876 8329 7381 \r\n3 12709 18999 7791 7382 \r\n3 19001 13230 19000 7383 \r\n3 19002 13785 18705 7384 \r\n3 17483 19003 9018 7385 \r\n3 11633 8601 17034 7386 \r\n3 18825 13864 17578 7387 \r\n3 19004 15516 5683 7388 \r\n3 11723 19005 8495 7389 \r\n3 16775 15980 12138 7390 \r\n3 9101 17512 15898 7391 \r\n3 10849 11294 18946 7392 \r\n3 12754 19006 14816 7393 \r\n3 18186 18588 14964 7394 \r\n3 8958 19007 14480 7395 \r\n3 14938 17362 15371 7396 \r\n3 12351 15835 19008 7397 \r\n3 12609 18769 9261 7398 \r\n3 17695 19009 5055 7399 \r\n3 9586 19010 17275 7400 \r\n3 19012 19011 15934 7401 \r\n3 17373 16022 18749 7402 \r\n3 19014 17448 19013 7403 \r\n3 19015 6828 16779 7404 \r\n3 19016 9925 13338 7405 \r\n3 12384 19017 15169 7406 \r\n3 11404 19018 16886 7407 \r\n3 19020 19019 13430 7408 \r\n3 19022 6513 19021 7409 \r\n3 19023 5373 10771 7410 \r\n3 11445 19024 19025 7411 \r\n3 10111 19026 8172 7412 \r\n3 14899 14441 16870 7413 \r\n3 18417 17268 9297 7414 \r\n3 19027 13473 15569 7415 \r\n3 19028 18353 19000 7416 \r\n3 5778 19029 19030 7417 \r\n3 19033 19031 19032 7418 \r\n3 7186 12534 19034 7419 \r\n3 19035 7357 13285 7420 \r\n3 7514 19036 11279 7421 \r\n3 19037 12369 6552 7422 \r\n3 18561 19038 15782 7423 \r\n3 11472 15779 7053 7424 \r\n3 8905 14739 13585 7425 \r\n3 17382 12796 19039 7426 \r\n3 19040 5672 8347 7427 \r\n3 7195 6469 19041 7428 \r\n3 15228 14447 17636 7429 \r\n3 18912 12790 16235 7430 \r\n3 16840 19042 17408 7431 \r\n3 10549 10755 16880 7432 \r\n3 16939 15511 19043 7433 \r\n3 14948 17798 16393 7434 \r\n3 19044 16766 8402 7435 \r\n3 11570 5713 7507 7436 \r\n3 19045 17976 8798 7437 \r\n3 17495 11263 15290 7438 \r\n3 13625 19046 5212 7439 \r\n3 19047 10040 12927 7440 \r\n3 7072 19048 18027 7441 \r\n3 19050 5906 19049 7442 \r\n3 19051 8371 13904 7443 \r\n3 16578 12583 19052 7444 \r\n3 19054 19053 18113 7445 \r\n3 18621 19047 8091 7446 \r\n3 19055 10684 16740 7447 \r\n3 12434 6623 19056 7448 \r\n3 7558 19057 11612 7449 \r\n3 6954 14955 18529 7450 \r\n3 15295 16627 10408 7451 \r\n3 5459 14669 19058 7452 \r\n3 11272 13824 16015 7453 \r\n3 15389 17635 7049 7454 \r\n3 9745 6929 8381 7455 \r\n3 16116 12212 11211 7456 \r\n3 19060 15571 19059 7457 \r\n3 19061 17081 10122 7458 \r\n3 17822 8911 13861 7459 \r\n3 19062 12612 8051 7460 \r\n3 5326 16224 13003 7461 \r\n3 14804 12817 19063 7462 \r\n3 19065 13847 19064 7463 \r\n3 19067 19066 12938 7464 \r\n3 19069 18655 19068 7465 \r\n3 15845 19070 10765 7466 \r\n3 19071 18413 10072 7467 \r\n3 19073 13046 19072 7468 \r\n3 15702 15174 17717 7469 \r\n3 19074 15576 15158 7470 \r\n3 5003 19075 16972 7471 \r\n3 19077 19076 18832 7472 \r\n3 19078 5344 5624 7473 \r\n3 6242 6223 10020 7474 \r\n3 8862 18685 19079 7475 \r\n3 18906 17720 18599 7476 \r\n3 13254 8164 15490 7477 \r\n3 19080 11477 13030 7478 \r\n3 19082 19081 14206 7479 \r\n3 14328 13302 12850 7480 \r\n3 18555 12046 12725 7481 \r\n3 19016 17205 14949 7482 \r\n3 19083 14575 5760 7483 \r\n3 16940 14043 12321 7484 \r\n3 5948 19084 10614 7485 \r\n3 19085 10936 10393 7486 \r\n3 19086 10365 5172 7487 \r\n3 17752 18385 16739 7488 \r\n3 5511 16416 19087 7489 \r\n3 5109 16923 11638 7490 \r\n3 18484 16957 19088 7491 \r\n3 11455 18703 17471 7492 \r\n3 12000 18360 19089 7493 \r\n3 18972 18236 13696 7494 \r\n3 10986 12780 16848 7495 \r\n3 19090 10641 17293 7496 \r\n3 5550 19091 19092 7497 \r\n3 8578 19093 13405 7498 \r\n3 12237 5340 18387 7499 \r\n3 8827 19094 11481 7500 \r\n3 18713 15407 7171 7501 \r\n3 14331 18679 9406 7502 \r\n3 8357 19095 6108 7503 \r\n3 17711 19096 12992 7504 \r\n3 19097 5618 14947 7505 \r\n3 15728 15030 15853 7506 \r\n3 15499 16825 19098 7507 \r\n3 14136 17329 19099 7508 \r\n3 5551 18313 5856 7509 \r\n3 14980 18301 19100 7510 \r\n3 11208 19101 10476 7511 \r\n3 15916 18735 14014 7512 \r\n3 19103 6859 19102 7513 \r\n3 15204 19104 7690 7514 \r\n3 13173 7291 12159 7515 \r\n3 12620 15073 17626 7516 \r\n3 18622 16620 19105 7517 \r\n3 18976 17249 8310 7518 \r\n3 17969 10027 16862 7519 \r\n3 17844 19106 14946 7520 \r\n3 17389 5079 10115 7521 \r\n3 15141 11475 19107 7522 \r\n3 19109 19108 13647 7523 \r\n3 11248 13397 19110 7524 \r\n3 18543 17288 15326 7525 \r\n3 16026 12961 16105 7526 \r\n3 15973 11353 11914 7527 \r\n3 15026 6424 12601 7528 \r\n3 18407 17912 15547 7529 \r\n3 17902 13131 18746 7530 \r\n3 16382 13924 12854 7531 \r\n3 14723 5041 18515 7532 \r\n3 19112 17804 19111 7533 \r\n3 8112 13031 12061 7534 \r\n3 13923 7284 5478 7535 \r\n3 18796 15748 8103 7536 \r\n3 10981 8779 17991 7537 \r\n3 19113 17677 17641 7538 \r\n3 5466 19114 10431 7539 \r\n3 11350 7867 10317 7540 \r\n3 7120 18391 18759 7541 \r\n3 19116 19115 11647 7542 \r\n3 11403 18551 18863 7543 \r\n3 19118 19117 14377 7544 \r\n3 11504 19119 12272 7545 \r\n3 18900 16306 19120 7546 \r\n3 16647 7206 9800 7547 \r\n3 16272 19121 19122 7548 \r\n3 8997 15235 16067 7549 \r\n3 11366 12187 19123 7550 \r\n3 19125 19124 9620 7551 \r\n3 14871 19126 19127 7552 \r\n3 13617 14496 10390 7553 \r\n3 17654 9385 10735 7554 \r\n3 19129 19128 18935 7555 \r\n3 17662 6495 19130 7556 \r\n3 19131 10834 8540 7557 \r\n3 15875 19132 18896 7558 \r\n3 14062 14954 19133 7559 \r\n3 9067 16384 17916 7560 \r\n3 5221 15287 19134 7561 \r\n3 19041 19135 13580 7562 \r\n3 13719 17914 19136 7563 \r\n3 7131 13318 16865 7564 \r\n3 10873 19102 16934 7565 \r\n3 15361 19137 8824 7566 \r\n3 13526 19138 17004 7567 \r\n3 19139 18127 16113 7568 \r\n3 9006 15459 8584 7569 \r\n3 13351 11130 13807 7570 \r\n3 8317 16637 11076 7571 \r\n3 17943 17064 19140 7572 \r\n3 19141 12611 5780 7573 \r\n3 6537 19142 15078 7574 \r\n3 12135 9430 15638 7575 \r\n3 18048 11727 10803 7576 \r\n3 17467 8167 19143 7577 \r\n3 13908 19144 12042 7578 \r\n3 18001 19040 8843 7579 \r\n3 10458 16029 14786 7580 \r\n3 14982 14278 19145 7581 \r\n3 6174 18228 7210 7582 \r\n3 19147 16380 19146 7583 \r\n3 19148 13424 18041 7584 \r\n3 13701 18058 19149 7585 \r\n3 17941 19150 11927 7586 \r\n3 14142 15066 19151 7587 \r\n3 7450 18040 17051 7588 \r\n3 17605 17003 19152 7589 \r\n3 9058 18184 17490 7590 \r\n3 19154 14088 19153 7591 \r\n3 14891 7614 15102 7592 \r\n3 19156 15146 19155 7593 \r\n3 19158 19157 7108 7594 \r\n3 6644 19159 7110 7595 \r\n3 18839 10909 18640 7596 \r\n3 16540 12215 13634 7597 \r\n3 7774 6743 19146 7598 \r\n3 7529 8507 14872 7599 \r\n3 8181 13992 19160 7600 \r\n3 17279 7165 19161 7601 \r\n3 14755 18927 10389 7602 \r\n3 14397 15194 17913 7603 \r\n3 16756 12371 19162 7604 \r\n3 14520 16254 17036 7605 \r\n3 19164 17911 19163 7606 \r\n3 19165 18126 14984 7607 \r\n3 17447 15338 17160 7608 \r\n3 16198 13350 7763 7609 \r\n3 19166 17813 14167 7610 \r\n3 15793 10788 13860 7611 \r\n3 13177 19167 11878 7612 \r\n3 19169 19168 18916 7613 \r\n3 19171 19170 17823 7614 \r\n3 19173 18315 19172 7615 \r\n3 18643 12943 19174 7616 \r\n3 5748 12443 14463 7617 \r\n3 19175 11091 7286 7618 \r\n3 10226 18642 6463 7619 \r\n3 19177 19176 12070 7620 \r\n3 18984 16534 17874 7621 \r\n3 15477 10582 12389 7622 \r\n3 19178 7329 5674 7623 \r\n3 16437 15847 19179 7624 \r\n3 12751 19180 15474 7625 \r\n3 19181 10398 14910 7626 \r\n3 5494 19182 13675 7627 \r\n3 8561 19183 19184 7628 \r\n3 18554 6621 5776 7629 \r\n3 12233 15494 9672 7630 \r\n3 17175 17216 16962 7631 \r\n3 8948 13407 19185 7632 \r\n3 10451 13160 13395 7633 \r\n3 9602 17620 19186 7634 \r\n3 16565 10249 19187 7635 \r\n3 8175 16703 10310 7636 \r\n3 10483 18814 14619 7637 \r\n3 19188 11743 14371 7638 \r\n3 14515 18663 19010 7639 \r\n3 13890 12111 11867 7640 \r\n3 13207 19014 19189 7641 \r\n3 6679 7923 6374 7642 \r\n3 14854 12200 13676 7643 \r\n3 11581 19122 19190 7644 \r\n3 15874 19191 14920 7645 \r\n3 19193 15481 19192 7646 \r\n3 15392 11421 19194 7647 \r\n3 17455 12931 19195 7648 \r\n3 18641 19196 19197 7649 \r\n3 9569 19198 13092 7650 \r\n3 11671 6395 18068 7651 \r\n3 13266 14394 15626 7652 \r\n3 7396 16554 10618 7653 \r\n3 5555 9552 15686 7654 \r\n3 9247 14018 11321 7655 \r\n3 12185 8996 19199 7656 \r\n3 14903 15301 16826 7657 \r\n3 5868 11863 19200 7658 \r\n3 8899 19201 17178 7659 \r\n3 19203 6312 19202 7660 \r\n3 19205 15537 19204 7661 \r\n3 9459 17849 14649 7662 \r\n3 14342 18920 6291 7663 \r\n3 15487 19206 14284 7664 \r\n3 9091 8715 19207 7665 \r\n3 14090 12967 10763 7666 \r\n3 16794 16895 15069 7667 \r\n3 16717 10721 12183 7668 \r\n3 19208 5460 10535 7669 \r\n3 12236 14413 8687 7670 \r\n3 11476 7797 12060 7671 \r\n3 9590 18615 18885 7672 \r\n3 17915 13955 14245 7673 \r\n3 17612 19209 13826 7674 \r\n3 14742 17704 18970 7675 \r\n3 19210 15053 12023 7676 \r\n3 13931 18733 19043 7677 \r\n3 17777 11999 19211 7678 \r\n3 14873 11609 17437 7679 \r\n3 11496 18080 19212 7680 \r\n3 6418 6070 12273 7681 \r\n3 19214 18147 19213 7682 \r\n3 12673 15387 6024 7683 \r\n3 17146 18886 8544 7684 \r\n3 19217 19215 19216 7685 \r\n3 16609 12957 7183 7686 \r\n3 9355 16823 18081 7687 \r\n3 18961 6215 14380 7688 \r\n3 17137 18758 17547 7689 \r\n3 17027 17396 8054 7690 \r\n3 19219 19218 5790 7691 \r\n3 15666 14623 17281 7692 \r\n3 7118 19220 19100 7693 \r\n3 19221 18331 18789 7694 \r\n3 17848 9984 16276 7695 \r\n3 19222 10445 6211 7696 \r\n3 10160 12856 13045 7697 \r\n3 17021 17157 15857 7698 \r\n3 12547 8038 19119 7699 \r\n3 12035 19223 9224 7700 \r\n3 19096 18087 15873 7701 \r\n3 17617 10187 10428 7702 \r\n3 14716 18202 14031 7703 \r\n3 15735 11854 13973 7704 \r\n3 11775 10963 6193 7705 \r\n3 19224 17751 10817 7706 \r\n3 13363 17549 19225 7707 \r\n3 19226 11100 9414 7708 \r\n3 19228 7019 19227 7709 \r\n3 19159 9807 14907 7710 \r\n3 18165 18177 9829 7711 \r\n3 18497 19229 19230 7712 \r\n3 9854 13005 19231 7713 \r\n3 7484 15536 12973 7714 \r\n3 6563 16414 16735 7715 \r\n3 12981 13886 14965 7716 \r\n3 6386 19232 9485 7717 \r\n3 9779 19233 17551 7718 \r\n3 15001 6670 18535 7719 \r\n3 9961 18123 6586 7720 \r\n3 19235 19063 19234 7721 \r\n3 16338 8742 11944 7722 \r\n3 19237 19236 9022 7723 \r\n3 5971 14178 18980 7724 \r\n3 5028 6662 14961 7725 \r\n3 19200 8725 18493 7726 \r\n3 15139 6198 19238 7727 \r\n3 19240 19239 18556 7728 \r\n3 17494 16457 17900 7729 \r\n3 19188 16974 17400 7730 \r\n3 6747 14076 19241 7731 \r\n3 17952 5367 12544 7732 \r\n3 13085 8739 19242 7733 \r\n3 16691 9492 15766 7734 \r\n3 19243 18722 8273 7735 \r\n3 19244 12210 13159 7736 \r\n3 19245 14905 11318 7737 \r\n3 6449 14643 19246 7738 \r\n3 19247 9379 16508 7739 \r\n3 9295 18241 19248 7740 \r\n3 10147 18380 19249 7741 \r\n3 10166 14042 13876 7742 \r\n3 18094 19051 6120 7743 \r\n3 12500 15173 19250 7744 \r\n3 19252 14631 19251 7745 \r\n3 19254 19253 11951 7746 \r\n3 10110 18169 5600 7747 \r\n3 13276 10836 16518 7748 \r\n3 14851 19255 13657 7749 \r\n3 12828 16219 13432 7750 \r\n3 19256 8803 11651 7751 \r\n3 6857 19257 19258 7752 \r\n3 7894 18728 11971 7753 \r\n3 19260 19259 18370 7754 \r\n3 19262 19261 7211 7755 \r\n3 6551 17096 16400 7756 \r\n3 14864 5159 7557 7757 \r\n3 18745 16903 18365 7758 \r\n3 14154 19263 9132 7759 \r\n3 14109 12903 8568 7760 \r\n3 18659 9487 19264 7761 \r\n3 15232 5154 19265 7762 \r\n3 7801 19266 10727 7763 \r\n3 7262 19267 15215 7764 \r\n3 19268 17241 5443 7765 \r\n3 7641 8421 13293 7766 \r\n3 5433 15977 17017 7767 \r\n3 19036 19269 8792 7768 \r\n3 10312 19270 19271 7769 \r\n3 19272 11818 16480 7770 \r\n3 15551 16580 17223 7771 \r\n3 18378 18172 19273 7772 \r\n3 19214 19274 19046 7773 \r\n3 19231 16709 18853 7774 \r\n3 18091 19275 17318 7775 \r\n3 7816 11918 7418 7776 \r\n3 17859 8425 14543 7777 \r\n3 6464 15693 14301 7778 \r\n3 15599 19276 9417 7779 \r\n3 12563 17038 13486 7780 \r\n3 6960 16238 10893 7781 \r\n3 19277 6549 10265 7782 \r\n3 17221 19278 19279 7783 \r\n3 9941 19280 19281 7784 \r\n3 17217 15224 19282 7785 \r\n3 18818 9741 17997 7786 \r\n3 6007 17239 16706 7787 \r\n3 16907 5593 16991 7788 \r\n3 17310 19062 19283 7789 \r\n3 19285 17152 19284 7790 \r\n3 19286 16040 10450 7791 \r\n3 7848 12058 19287 7792 \r\n3 9183 5116 14068 7793 \r\n3 19289 19288 9050 7794 \r\n3 6786 18847 19061 7795 \r\n3 10729 11762 8659 7796 \r\n3 16427 5486 7970 7797 \r\n3 14134 16281 16873 7798 \r\n3 13218 10807 18148 7799 \r\n3 18577 17320 18658 7800 \r\n3 19290 5623 15105 7801 \r\n3 19291 18481 10047 7802 \r\n3 19220 17973 15715 7803 \r\n3 19292 14424 14797 7804 \r\n3 16742 14064 17581 7805 \r\n3 11697 13053 19293 7806 \r\n3 5842 18107 19294 7807 \r\n3 18355 18221 18004 7808 \r\n3 18845 7952 16901 7809 \r\n3 19296 19295 18342 7810 \r\n3 14200 13965 19297 7811 \r\n3 19298 13621 16448 7812 \r\n3 19299 18717 14807 7813 \r\n3 11413 19300 17852 7814 \r\n3 12140 19301 19302 7815 \r\n3 16035 16490 12515 7816 \r\n3 15639 15111 15795 7817 \r\n3 16284 19187 14297 7818 \r\n3 18882 19303 12375 7819 \r\n3 17388 14863 12923 7820 \r\n3 14287 17741 19304 7821 \r\n3 19307 19305 19306 7822 \r\n3 19031 5059 7528 7823 \r\n3 19308 19094 9314 7824 \r\n3 19309 8055 17393 7825 \r\n3 11003 16552 7830 7826 \r\n3 19311 19310 6797 7827 \r\n3 5984 19312 6440 7828 \r\n3 8847 14347 17896 7829 \r\n3 18344 13942 18414 7830 \r\n3 17639 14659 19108 7831 \r\n3 14055 16884 12546 7832 \r\n3 19315 19313 19314 7833 \r\n3 15689 12078 17468 7834 \r\n3 12948 19316 6913 7835 \r\n3 19317 6065 11181 7836 \r\n3 12925 16066 7654 7837 \r\n3 19319 19318 17908 7838 \r\n3 16133 8145 17089 7839 \r\n3 11288 14794 19320 7840 \r\n3 17710 11117 17868 7841 \r\n3 13916 19321 9439 7842 \r\n3 8143 12416 16047 7843 \r\n3 19322 15016 9432 7844 \r\n3 11218 12129 16458 7845 \r\n3 11795 19323 9870 7846 \r\n3 19324 18850 12520 7847 \r\n3 15954 19325 11777 7848 \r\n3 18019 15818 10087 7849 \r\n3 19328 19326 19327 7850 \r\n3 14385 12223 18706 7851 \r\n3 16333 19329 9400 7852 \r\n3 19331 19330 16045 7853 \r\n3 8184 8420 18496 7854 \r\n3 6617 19081 18232 7855 \r\n3 19332 10335 19143 7856 \r\n3 11776 12326 17920 7857 \r\n3 19023 13491 17903 7858 \r\n3 19333 10717 9241 7859 \r\n3 5015 19334 16100 7860 \r\n3 19336 15154 19335 7861 \r\n3 5125 18264 13380 7862 \r\n3 6727 10522 6843 7863 \r\n3 17776 7553 15157 7864 \r\n3 7808 19337 18176 7865 \r\n3 12461 13831 13340 7866 \r\n3 16355 19338 9172 7867 \r\n3 19339 8575 18763 7868 \r\n3 15786 9798 13502 7869 \r\n3 19340 19123 10674 7870 \r\n3 19342 19341 19117 7871 \r\n3 17514 16568 7901 7872 \r\n3 13494 14051 14679 7873 \r\n3 7413 8206 19343 7874 \r\n3 19344 19170 12726 7875 \r\n3 16255 14665 19345 7876 \r\n3 13376 16745 17361 7877 \r\n3 19346 15958 16625 7878 \r\n3 9080 8169 9802 7879 \r\n3 8576 18079 12334 7880 \r\n3 6653 11680 9191 7881 \r\n3 7640 17936 19347 7882 \r\n3 17539 19289 7988 7883 \r\n3 8682 16863 5186 7884 \r\n3 14317 5090 19348 7885 \r\n3 7161 15939 5442 7886 \r\n3 12901 15039 11704 7887 \r\n3 18225 14713 10591 7888 \r\n3 18224 9038 13497 7889 \r\n3 17026 19349 6511 7890 \r\n3 19350 18836 5147 7891 \r\n3 15741 12512 19351 7892 \r\n3 17674 13191 13858 7893 \r\n3 15018 15068 10299 7894 \r\n3 15772 18471 7737 7895 \r\n3 19325 18240 19352 7896 \r\n3 11336 6053 17294 7897 \r\n3 12420 5366 8240 7898 \r\n3 7127 13241 13107 7899 \r\n3 18023 19353 10058 7900 \r\n3 12227 12307 16784 7901 \r\n3 17148 15692 10471 7902 \r\n3 17885 10838 9124 7903 \r\n3 19354 12525 15780 7904 \r\n3 13770 19355 19356 7905 \r\n3 18868 19357 11186 7906 \r\n3 19359 5553 19358 7907 \r\n3 19361 18418 19360 7908 \r\n3 18258 18978 19362 7909 \r\n3 15512 9776 12163 7910 \r\n3 18347 6745 19363 7911 \r\n3 8492 19364 19365 7912 \r\n3 12573 13559 17949 7913 \r\n3 18657 12194 19366 7914 \r\n3 15003 11614 9709 7915 \r\n3 11533 19367 13687 7916 \r\n3 19368 13956 5388 7917 \r\n3 17582 16125 19166 7918 \r\n3 19371 19369 19370 7919 \r\n3 8097 8266 15110 7920 \r\n3 19372 18794 18230 7921 \r\n3 5382 12054 19373 7922 \r\n3 16348 8891 18635 7923 \r\n3 13808 19284 17014 7924 \r\n3 15579 10577 19374 7925 \r\n3 17122 19375 17252 7926 \r\n3 19376 5729 17000 7927 \r\n3 18153 13862 19377 7928 \r\n3 19378 8689 13507 7929 \r\n3 17513 16513 19379 7930 \r\n3 16088 8063 18983 7931 \r\n3 17872 15466 18404 7932 \r\n3 9923 15198 10731 7933 \r\n3 15022 17537 19380 7934 \r\n3 17126 14243 19381 7935 \r\n3 19383 19382 17377 7936 \r\n3 19263 15935 17010 7937 \r\n3 17521 15896 16477 7938 \r\n3 5291 17048 13488 7939 \r\n3 17791 19365 6216 7940 \r\n3 10740 19144 14858 7941 \r\n3 13725 19210 18725 7942 \r\n3 19384 18817 10113 7943 \r\n3 19385 8021 15886 7944 \r\n3 19387 19386 6385 7945 \r\n3 10791 19388 7673 7946 \r\n3 13682 19389 19390 7947 \r\n3 18096 12081 16587 7948 \r\n3 15720 19391 5356 7949 \r\n3 17078 13487 16023 7950 \r\n3 7743 17363 6323 7951 \r\n3 12715 14388 19392 7952 \r\n3 19266 17411 16955 7953 \r\n3 12514 9144 8882 7954 \r\n3 15696 14036 19393 7955 \r\n3 19394 6344 15319 7956 \r\n3 13896 16205 19395 7957 \r\n3 11658 12448 19396 7958 \r\n3 15572 19397 19398 7959 \r\n3 18338 19399 15012 7960 \r\n3 11845 9659 12704 7961 \r\n3 17013 18914 18416 7962 \r\n3 11343 8387 9799 7963 \r\n3 14601 19400 16452 7964 \r\n3 18469 15587 18299 7965 \r\n3 18613 12883 6505 7966 \r\n3 6852 17764 9589 7967 \r\n3 16344 19401 11825 7968 \r\n3 19402 16455 11278 7969 \r\n3 14126 18294 19403 7970 \r\n3 14892 14768 9956 7971 \r\n3 15618 10205 16952 7972 \r\n3 18020 12740 11772 7973 \r\n3 17019 19310 7024 7974 \r\n3 10453 10138 19404 7975 \r\n3 8771 5110 17461 7976 \r\n3 8366 10143 10957 7977 \r\n3 17905 7231 5371 7978 \r\n3 15435 18674 11335 7979 \r\n3 19405 16652 9371 7980 \r\n3 17191 7172 6809 7981 \r\n3 10751 12381 19406 7982 \r\n3 17502 11191 16356 7983 \r\n3 19297 19407 18426 7984 \r\n3 8476 6655 19121 7985 \r\n3 6473 19337 19408 7986 \r\n3 7944 17705 19202 7987 \r\n3 19321 19409 17648 7988 \r\n3 11850 18053 5092 7989 \r\n3 19410 19132 15878 7990 \r\n3 14103 19411 16896 7991 \r\n3 18862 12097 16631 7992 \r\n3 19412 13150 17306 7993 \r\n3 11583 17188 18512 7994 \r\n3 17460 9084 8982 7995 \r\n3 18802 17994 13865 7996 \r\n3 19413 16185 15254 7997 \r\n3 13595 9342 13545 7998 \r\n3 7601 12355 16360 7999 \r\n3 15289 18030 19414 8000 \r\n3 14185 12066 16875 8001 \r\n3 19415 10983 8017 8002 \r\n3 17772 12335 17744 8003 \r\n3 10716 7317 6357 8004 \r\n3 7973 9996 19416 8005 \r\n3 19417 8324 16197 8006 \r\n3 10252 18949 13225 8007 \r\n3 10644 18319 19418 8008 \r\n3 19419 18859 17725 8009 \r\n3 19278 9323 17052 8010 \r\n3 17668 13536 11895 8011 \r\n3 6800 17794 19109 8012 \r\n3 17918 19167 18807 8013 \r\n3 19420 8283 18727 8014 \r\n3 19421 18835 17857 8015 \r\n3 18781 5753 12647 8016 \r\n3 16199 19422 12727 8017 \r\n3 12122 6975 8983 8018 \r\n3 15300 19423 19424 8019 \r\n3 18399 16664 15180 8020 \r\n3 19426 11712 19425 8021 \r\n3 14825 5698 10056 8022 \r\n3 13047 17464 19363 8023 \r\n3 16214 11494 12706 8024 \r\n3 19428 19427 13884 8025 \r\n3 12947 9977 19058 8026 \r\n3 18578 19429 18890 8027 \r\n3 15518 19430 11328 8028 \r\n3 7372 18132 19431 8029 \r\n3 19433 18637 19432 8030 \r\n3 10151 18951 10194 8031 \r\n3 10384 13367 19434 8032 \r\n3 19435 18354 17267 8033 \r\n3 11227 18616 7292 8034 \r\n3 18624 8477 16271 8035 \r\n3 15025 9750 6364 8036 \r\n3 9715 19128 19436 8037 \r\n3 13743 19437 17932 8038 \r\n3 19439 15950 19438 8039 \r\n3 13761 17436 18996 8040 \r\n3 19234 16327 14174 8041 \r\n3 15625 19440 15533 8042 \r\n3 9696 17940 8074 8043 \r\n3 14484 9065 17865 8044 \r\n3 16750 17506 12589 8045 \r\n3 16538 18795 17892 8046 \r\n3 18340 19441 5661 8047 \r\n3 11016 18966 5879 8048 \r\n3 16931 17966 12522 8049 \r\n3 19442 18648 15345 8050 \r\n3 12628 14650 12397 8051 \r\n3 19444 19443 19028 8052 \r\n3 18821 15155 7307 8053 \r\n3 19445 14372 15138 8054 \r\n3 15109 13014 10924 8055 \r\n3 15507 18981 13307 8056 \r\n3 19446 19433 13672 8057 \r\n3 19448 5180 19447 8058 \r\n3 15562 19105 18108 8059 \r\n3 17284 5998 15381 8060 \r\n3 19249 17712 17972 8061 \r\n3 10010 5894 19449 8062 \r\n3 18249 19450 19451 8063 \r\n3 18384 19452 19453 8064 \r\n3 17120 19454 19455 8065 \r\n3 15787 16665 10196 8066 \r\n3 18895 11824 13386 8067 \r\n3 17756 6431 9054 8068 \r\n3 19457 19456 7114 8069 \r\n3 15013 16642 12735 8070 \r\n3 19082 15438 19372 8071 \r\n3 13554 16608 15458 8072 \r\n3 19458 9656 9983 8073 \r\n3 12858 5601 6961 8074 \r\n3 18834 16683 18875 8075 \r\n3 10859 19459 17480 8076 \r\n3 19460 18489 5921 8077 \r\n3 5522 16827 19303 8078 \r\n3 19461 6014 7073 8079 \r\n3 5296 19462 19463 8080 \r\n3 13892 15610 10878 8081 \r\n3 19465 14114 19464 8082 \r\n3 10617 19466 18415 8083 \r\n3 10787 15408 11325 8084 \r\n3 19468 16856 19467 8085 \r\n3 16087 18116 19469 8086 \r\n3 12581 12428 8611 8087 \r\n3 7086 9998 8220 8088 \r\n3 16514 17295 8878 8089 \r\n3 19470 12132 14482 8090 \r\n3 19472 8529 19471 8091 \r\n3 19473 6094 7022 8092 \r\n3 15163 10772 9535 8093 \r\n3 15523 19474 19475 8094 \r\n3 8170 13529 13443 8095 \r\n3 13394 13349 15064 8096 \r\n3 14296 17403 15402 8097 \r\n3 14720 19476 19477 8098 \r\n3 10737 18799 7054 8099 \r\n3 12819 19478 9957 8100 \r\n3 19479 8238 16174 8101 \r\n3 17206 10619 17417 8102 \r\n3 12363 14912 13009 8103 \r\n3 8405 14032 11659 8104 \r\n3 7097 10033 10339 8105 \r\n3 15275 18333 8664 8106 \r\n3 18610 17870 19480 8107 \r\n3 19442 14382 11108 8108 \r\n3 18925 12674 19481 8109 \r\n3 9315 7579 19482 8110 \r\n3 19315 14534 6576 8111 \r\n3 19483 12743 18265 8112 \r\n3 7792 12993 17684 8113 \r\n3 11586 12564 18792 8114 \r\n3 19316 5431 19484 8115 \r\n3 13695 19485 19486 8116 \r\n3 7095 8930 16141 8117 \r\n3 11026 19055 19453 8118 \r\n3 8360 14497 19487 8119 \r\n3 6145 18367 19488 8120 \r\n3 13553 19489 19490 8121 \r\n3 19491 13110 17714 8122 \r\n3 19492 12126 15432 8123 \r\n3 11853 19493 10713 8124 \r\n3 17615 14747 7136 8125 \r\n3 8981 10206 17339 8126 \r\n3 14340 12530 17266 8127 \r\n3 16434 8198 18576 8128 \r\n3 16020 19494 5744 8129 \r\n3 19313 18860 9096 8130 \r\n3 15503 16342 13331 8131 \r\n3 8246 14465 13412 8132 \r\n3 19496 16307 19495 8133 \r\n3 17140 19189 10623 8134 \r\n3 18962 19279 11811 8135 \r\n3 18376 19497 19410 8136 \r\n3 17520 5389 15220 8137 \r\n3 16085 18608 19498 8138 \r\n3 8364 18352 6757 8139 \r\n3 7391 8729 16316 8140 \r\n3 18571 19317 17618 8141 \r\n3 7712 19025 18634 8142 \r\n3 19501 19499 19500 8143 \r\n3 5492 15239 16776 8144 \r\n3 12668 16136 16584 8145 \r\n3 14345 18629 6057 8146 \r\n3 19503 18341 19502 8147 \r\n3 12946 9839 18757 8148 \r\n3 19504 16786 19012 8149 \r\n3 5816 16506 17033 8150 \r\n3 7863 15637 19505 8151 \r\n3 9666 19506 19458 8152 \r\n3 6241 18698 19507 8153 \r\n3 8018 12276 18666 8154 \r\n3 19509 19508 17198 8155 \r\n3 19510 17653 19072 8156 \r\n3 15593 5274 17807 8157 \r\n3 19511 8756 17260 8158 \r\n3 9570 7385 7040 8159 \r\n3 8121 17242 17980 8160 \r\n3 19512 6186 16025 8161 \r\n3 16855 7348 8322 8162 \r\n3 19103 19513 15515 8163 \r\n3 10969 15993 5772 8164 \r\n3 19515 19514 14383 8165 \r\n3 12803 16632 5718 8166 \r\n3 5279 13441 13531 8167 \r\n3 17795 15097 14647 8168 \r\n3 19064 19516 7671 8169 \r\n3 5105 12723 19517 8170 \r\n3 10437 19518 15277 8171 \r\n3 6149 17560 16001 8172 \r\n3 16801 12836 8369 8173 \r\n3 19519 10671 17785 8174 \r\n3 7408 6782 19520 8175 \r\n3 16481 17815 6658 8176 \r\n3 9120 13040 15652 8177 \r\n3 19307 18111 17600 8178 \r\n3 10019 19521 16491 8179 \r\n3 10935 9073 10348 8180 \r\n3 15995 17632 15719 8181 \r\n3 9810 16574 19522 8182 \r\n3 18988 19523 8938 8183 \r\n3 19394 17233 14407 8184 \r\n3 15933 14155 19504 8185 \r\n3 17767 13404 19524 8186 \r\n3 13673 6885 15699 8187 \r\n3 19525 14300 6610 8188 \r\n3 14721 18681 19172 8189 \r\n3 11536 15047 13573 8190 \r\n3 13937 13186 15240 8191 \r\n3 19527 19526 15462 8192 \r\n3 13301 19528 18852 8193 \r\n3 11268 18669 19529 8194 \r\n3 13393 18072 16694 8195 \r\n3 5351 13111 14213 8196 \r\n3 19530 15425 6570 8197 \r\n3 16815 18278 18293 8198 \r\n3 19531 18226 19513 8199 \r\n3 15730 5416 13680 8200 \r\n3 11694 9365 13688 8201 \r\n3 5704 19532 19352 8202 \r\n3 18139 19533 14781 8203 \r\n3 16707 19534 5372 8204 \r\n3 19535 15627 11865 8205 \r\n3 19222 12479 17703 8206 \r\n3 19537 15557 19536 8207 \r\n3 19539 19538 8898 8208 \r\n3 19541 19540 9803 8209 \r\n3 19543 19542 10207 8210 \r\n3 19544 16031 18521 8211 \r\n3 15662 7267 10305 8212 \r\n3 12655 10519 19500 8213 \r\n3 19545 10223 14645 8214 \r\n3 11817 17143 16299 8215 \r\n3 7809 14510 12786 8216 \r\n3 19547 19546 19534 8217 \r\n3 18922 10670 19548 8218 \r\n3 17150 15218 13149 8219 \r\n3 15108 8399 17274 8220 \r\n3 16443 19549 17876 8221 \r\n3 15332 19086 19550 8222 \r\n3 19551 18248 16663 8223 \r\n3 19039 19552 10945 8224 \r\n3 18665 11129 18867 8225 \r\n3 19553 8588 12161 8226 \r\n3 9593 16079 18617 8227 \r\n3 13239 11679 19042 8228 \r\n3 19554 13947 13641 8229 \r\n3 8557 13290 6415 8230 \r\n3 9842 8188 17995 8231 \r\n3 17222 10557 17040 8232 \r\n3 6058 15063 18650 8233 \r\n3 19555 5560 19155 8234 \r\n3 17650 19556 18185 8235 \r\n3 14082 5410 14738 8236 \r\n3 18550 11906 18334 8237 \r\n3 8393 16501 19445 8238 \r\n3 19029 17029 14478 8239 \r\n3 18486 16164 6509 8240 \r\n3 17109 10621 5139 8241 \r\n3 17353 14648 11365 8242 \r\n3 18501 19557 18452 8243 \r\n3 19558 17452 11394 8244 \r\n3 5820 18824 18291 8245 \r\n3 9377 10061 15088 8246 \r\n3 19066 14880 13289 8247 \r\n3 18492 14696 5869 8248 \r\n3 19238 19559 18253 8249 \r\n3 14722 18316 16543 8250 \r\n3 16582 19560 17420 8251 \r\n3 15683 18838 17271 8252 \r\n3 7666 16913 19561 8253 \r\n3 18262 6816 18029 8254 \r\n3 11050 17715 14670 8255 \r\n3 9070 18271 19035 8256 \r\n3 16454 12798 11662 8257 \r\n3 13162 17082 19562 8258 \r\n3 14235 5722 19563 8259 \r\n3 11369 19389 19564 8260 \r\n3 19565 6342 17300 8261 \r\n3 16935 18357 16373 8262 \r\n3 12374 17390 18883 8263 \r\n3 18336 11941 11471 8264 \r\n3 18660 15760 6543 8265 \r\n3 19566 9780 16804 8266 \r\n3 11575 8106 18447 8267 \r\n3 9980 7878 19567 8268 \r\n3 12105 8636 16341 8269 \r\n3 17805 15367 12917 8270 \r\n3 19568 15085 18255 8271 \r\n3 15472 16593 14683 8272 \r\n3 10959 15710 7729 8273 \r\n3 19118 19400 15314 8274 \r\n3 15570 19060 13609 8275 \r\n3 7521 13952 11938 8276 \r\n3 7219 9964 16556 8277 \r\n3 18971 18458 6532 8278 \r\n3 13652 19569 7585 8279 \r\n3 12689 18750 18744 8280 \r\n3 13431 19570 9876 8281 \r\n3 5196 5078 5794 8282 \r\n3 8390 18675 19514 8283 \r\n3 10432 10955 19073 8284 \r\n3 5962 19571 14764 8285 \r\n3 7119 19572 10798 8286 \r\n3 10848 6612 19573 8287 \r\n3 17337 7243 18739 8288 \r\n3 9868 8137 15382 8289 \r\n3 19078 16041 15196 8290 \r\n3 18397 9805 18449 8291 \r\n3 19576 19574 19575 8292 \r\n3 17466 19577 9204 8293 \r\n3 16167 19578 11592 8294 \r\n3 8680 10294 12350 8295 \r\n3 14195 19579 12865 8296 \r\n3 10029 19580 16492 8297 \r\n3 18831 7475 19240 8298 \r\n3 18170 19067 17661 8299 \r\n3 18440 14621 11096 8300 \r\n3 19581 15917 6468 8301 \r\n3 18295 14123 18730 8302 \r\n3 19454 12737 7748 8303 \r\n3 13348 17292 17768 8304 \r\n3 8569 16567 10877 8305 \r\n3 19582 18472 18161 8306 \r\n3 8572 9681 14417 8307 \r\n3 18915 12910 10868 8308 \r\n3 10434 17780 9178 8309 \r\n3 17264 17561 18259 8310 \r\n3 14239 15349 14376 8311 \r\n3 18502 19583 19405 8312 \r\n3 7334 11412 18420 8313 \r\n3 7076 15087 17161 8314 \r\n3 19219 14152 19584 8315 \r\n3 19586 19498 19585 8316 \r\n3 13867 14219 19353 8317 \r\n3 10030 19587 19141 8318 \r\n3 17792 19268 19588 8319 \r\n3 19589 17904 16987 8320 \r\n3 14294 14251 19300 8321 \r\n3 5138 19590 17108 8322 \r\n3 8876 17740 10698 8323 \r\n3 19591 12794 18434 8324 \r\n3 12960 12736 15912 8325 \r\n3 19593 13206 19592 8326 \r\n3 19282 19594 8595 8327 \r\n3 18813 6584 19595 8328 \r\n3 19597 19596 13574 8329 \r\n3 15443 16357 15802 8330 \r\n3 9374 19598 7122 8331 \r\n3 17970 18159 19599 8332 \r\n3 18791 10448 16183 8333 \r\n3 10812 12606 8062 8334 \r\n3 19600 19272 6657 8335 \r\n3 9871 19323 12280 8336 \r\n3 9746 18987 19573 8337 \r\n3 13273 18473 19601 8338 \r\n3 19603 14131 19602 8339 \r\n3 19604 9062 8537 8340 \r\n3 19499 19605 19606 8341 \r\n3 18828 18960 19607 8342 \r\n3 11625 15339 12678 8343 \r\n3 14697 19608 17986 8344 \r\n3 18936 19609 16242 8345 \r\n3 14091 19070 8263 8346 \r\n3 11433 19610 19611 8347 \r\n3 18569 9771 5503 8348 \r\n3 9669 19612 19613 8349 \r\n3 19614 9269 9072 8350 \r\n3 19617 19615 19616 8351 \r\n3 19618 18283 12835 8352 \r\n3 19620 19619 17802 8353 \r\n3 11809 13692 17686 8354 \r\n3 19390 19621 19153 8355 \r\n3 12616 15725 19622 8356 \r\n3 15849 19623 9967 8357 \r\n3 9878 12543 14694 8358 \r\n3 16009 5251 19470 8359 \r\n3 16050 18155 16464 8360 \r\n3 19417 18798 13499 8361 \r\n3 11524 10615 5581 8362 \r\n3 17987 19608 9531 8363 \r\n3 18884 14121 11097 8364 \r\n3 15856 19624 15722 8365 \r\n3 13152 17426 17927 8366 \r\n3 19626 19625 16126 8367 \r\n3 13512 13528 19192 8368 \r\n3 19092 16305 8116 8369 \r\n3 7392 17407 6230 8370 \r\n3 15648 15372 19627 8371 \r\n3 18412 19087 19261 8372 \r\n3 5540 10241 11031 8373 \r\n3 15032 18467 19628 8374 \r\n3 10638 18714 16729 8375 \r\n3 17503 12846 19151 8376 \r\n3 18308 8465 10217 8377 \r\n3 19629 16112 7447 8378 \r\n3 10041 10219 19630 8379 \r\n3 13259 11910 19631 8380 \r\n3 19430 12030 19632 8381 \r\n3 16502 18756 10070 8382 \r\n3 19633 12675 16279 8383 \r\n3 19634 9270 15540 8384 \r\n3 19636 19635 19324 8385 \r\n3 5304 16103 19235 8386 \r\n3 5972 17827 18104 8387 \r\n3 19637 5142 7344 8388 \r\n3 17526 19638 17299 8389 \r\n3 13070 12297 6500 8390 \r\n3 9536 19476 18192 8391 \r\n3 6290 19538 19347 8392 \r\n3 19306 18888 19639 8393 \r\n3 19641 19640 18955 8394 \r\n3 7449 18844 19178 8395 \r\n3 13589 18977 9954 8396 \r\n3 8589 16092 16202 8397 \r\n3 12873 19642 11361 8398 \r\n3 12274 5789 11055 8399 \r\n3 13153 8032 19643 8400 \r\n3 15724 17316 16449 8401 \r\n3 9218 18323 18257 8402 \r\n3 8625 10822 9040 8403 \r\n3 15080 11426 7492 8404 \r\n3 17536 9279 12776 8405 \r\n3 17746 8412 18889 8406 \r\n3 12472 19531 19644 8407 \r\n3 15674 9215 7981 8408 \r\n3 12634 8722 5422 8409 \r\n3 19645 18568 19134 8410 \r\n3 7685 19646 15522 8411 \r\n3 19572 13303 17359 8412 \r\n3 18525 13231 7892 8413 \r\n3 19647 10400 11329 8414 \r\n3 16036 19648 13248 8415 \r\n3 12222 18692 17024 8416 \r\n3 13168 13590 19649 8417 \r\n3 19651 8437 19650 8418 \r\n3 5118 17253 12436 8419 \r\n3 5707 19652 19653 8420 \r\n3 12285 13918 19367 8421 \r\n3 14885 14237 19654 8422 \r\n3 19373 16364 16847 8423 \r\n3 19655 7661 14774 8424 \r\n3 17965 13145 9438 8425 \r\n3 6276 19656 10251 8426 \r\n3 16809 16084 12587 8427 \r\n3 18098 19657 11882 8428 \r\n3 19658 18450 12259 8429 \r\n3 5069 19659 17607 8430 \r\n3 17701 19660 8355 8431 \r\n3 13922 14609 7962 8432 \r\n3 16241 7590 16435 8433 \r\n3 9105 8943 11449 8434 \r\n3 10944 17570 10792 8435 \r\n3 16696 19661 19662 8436 \r\n3 9169 19193 19663 8437 \r\n3 17721 18957 18600 8438 \r\n3 16829 6822 17935 8439 \r\n3 19664 7383 8811 8440 \r\n3 12172 15252 5112 8441 \r\n3 16824 19665 17276 8442 \r\n3 18767 17189 6634 8443 \r\n3 5750 17742 14638 8444 \r\n3 15819 19666 18443 8445 \r\n3 8804 19667 15755 8446 \r\n3 19567 16718 18990 8447 \r\n3 17816 17066 17341 8448 \r\n3 19668 9712 17586 8449 \r\n3 5521 19669 15270 8450 \r\n3 14085 7568 18396 8451 \r\n3 19670 11256 7465 8452 \r\n3 16258 19671 19164 8453 \r\n3 6950 9174 9384 8454 \r\n3 10910 5926 19672 8455 \r\n3 7525 13027 17556 8456 \r\n3 19586 19131 19636 8457 \r\n3 14030 10767 14717 8458 \r\n3 10494 14464 19673 8459 \r\n3 15765 9419 18880 8460 \r\n3 9431 6932 17091 8461 \r\n3 19674 12812 14709 8462 \r\n3 5289 9516 19675 8463 \r\n3 17996 11769 19676 8464 \r\n3 15325 19677 13088 8465 \r\n3 9523 17871 18609 8466 \r\n3 18870 19560 16857 8467 \r\n3 19678 9770 16068 8468 \r\n3 17493 19598 19679 8469 \r\n3 7090 19680 19681 8470 \r\n3 17841 19619 10516 8471 \r\n3 5613 14652 11255 8472 \r\n3 10053 19270 19682 8473 \r\n3 17326 15370 19683 8474 \r\n3 19194 12306 14052 8475 \r\n3 18454 19684 10182 8476 \r\n3 14793 8857 14422 8477 \r\n3 15501 16107 19243 8478 \r\n3 19438 11984 15390 8479 \r\n3 19089 13447 18070 8480 \r\n3 16881 19685 14299 8481 \r\n3 9522 7213 14731 8482 \r\n3 10808 10368 12759 8483 \r\n3 15464 5338 18819 8484 \r\n3 19687 19686 8931 8485 \r\n3 5690 15513 6876 8486 \r\n3 19065 16806 18877 8487 \r\n3 15541 19688 16810 8488 \r\n3 19293 14608 16229 8489 \r\n3 18156 8377 18893 8490 \r\n3 16866 18636 5399 8491 \r\n3 6232 19689 16834 8492 \r\n3 19330 18552 11088 8493 \r\n3 18517 13760 13233 8494 \r\n3 19507 8083 11513 8495 \r\n3 15676 19653 19690 8496 \r\n3 17689 11184 16386 8497 \r\n3 16926 17349 19691 8498 \r\n3 5401 10540 14890 8499 \r\n3 19387 12241 17046 8500 \r\n3 19692 10394 7347 8501 \r\n3 15305 7078 14613 8502 \r\n3 17956 17433 19693 8503 \r\n3 7173 16564 9312 8504 \r\n3 15890 19050 9938 8505 \r\n3 8900 16562 15347 8506 \r\n3 18587 8579 17877 8507 \r\n3 13968 9055 17073 8508 \r\n3 5327 17477 10426 8509 \r\n3 15168 19204 14175 8510 \r\n3 17210 14170 19181 8511 \r\n3 13506 13728 16208 8512 \r\n3 17843 16054 19694 8513 \r\n3 18285 18764 19695 8514 \r\n3 19696 10956 19114 8515 \r\n3 19638 17384 6680 8516 \r\n3 19632 19697 19647 8517 \r\n3 12022 11434 19564 8518 \r\n3 14914 16140 19698 8519 \r\n3 14605 19699 15268 8520 \r\n3 13521 19700 9026 8521 \r\n3 11493 6363 18408 8522 \r\n3 14870 19077 15998 8523 \r\n3 19702 19701 13065 8524 \r\n3 19158 14906 8118 8525 \r\n3 19017 19658 11838 8526 \r\n3 8525 19535 18478 8527 \r\n3 17112 8417 10869 8528 \r\n3 19704 16685 19703 8529 \r\n3 6835 14310 16820 8530 \r\n3 9381 7464 17678 8531 \r\n3 16265 19533 10890 8532 \r\n3 14216 19288 8311 8533 \r\n3 12684 18461 9647 8534 \r\n3 14975 7600 15957 8535 \r\n3 19097 10091 15581 8536 \r\n3 15680 8234 18309 8537 \r\n3 19705 18919 8854 8538 \r\n3 13979 9581 16522 8539 \r\n3 6539 15824 7181 8540 \r\n3 19461 10502 11034 8541 \r\n3 9939 18462 19706 8542 \r\n3 19707 18707 15588 8543 \r\n3 17801 19708 16099 8544 \r\n3 15740 18322 19366 8545 \r\n3 5385 17598 13622 8546 \r\n3 18816 11375 19709 8547 \r\n3 19710 12724 15927 8548 \r\n3 17171 19460 19191 8549 \r\n3 16743 13658 14775 8550 \r\n3 11466 18672 12084 8551 \r\n3 18007 12778 13552 8552 \r\n3 10578 18061 15343 8553 \r\n3 18505 18938 16109 8554 \r\n3 17799 8308 8801 8555 \r\n3 14878 13270 14261 8556 \r\n3 19703 9826 19711 8557 \r\n3 17568 15471 10887 8558 \r\n3 16864 13470 10649 8559 \r\n3 19713 19712 19217 8560 \r\n3 14116 15684 19487 8561 \r\n3 8396 17272 14307 8562 \r\n3 12909 17097 15882 8563 \r\n3 6049 13582 15816 8564 \r\n3 18712 13642 19714 8565 \r\n3 17897 15055 15008 8566 \r\n3 18191 19318 16782 8567 \r\n3 18633 19127 19426 8568 \r\n3 11783 18778 18683 8569 \r\n3 12730 5607 15251 8570 \r\n3 5152 10625 7126 8571 \r\n3 11006 13930 17883 8572 \r\n3 19715 10035 15391 8573 \r\n3 16168 6985 6015 8574 \r\n3 18899 18332 14829 8575 \r\n3 10171 13535 12911 8576 \r\n3 19652 10747 10129 8577 \r\n3 11127 15306 19716 8578 \r\n3 13686 19717 9951 8579 \r\n3 17651 14304 9564 8580 \r\n3 17114 19329 15582 8581 \r\n3 19718 18196 15420 8582 \r\n3 8027 8952 19719 8583 \r\n3 13713 16591 12885 8584 \r\n3 8539 5415 19635 8585 \r\n3 19104 9663 18057 8586 \r\n3 6361 14560 14824 8587 \r\n3 19286 18934 19341 8588 \r\n3 18897 10286 12603 8589 \r\n3 19720 9538 14581 8590 \r\n3 15076 12115 15104 8591 \r\n3 17644 19721 7218 8592 \r\n3 11534 17439 17931 8593 \r\n3 19722 16915 8841 8594 \r\n3 19424 19723 5561 8595 \r\n3 15084 8148 10937 8596 \r\n3 17643 14106 9068 8597 \r\n3 11390 7655 19724 8598 \r\n3 16828 8743 17509 8599 \r\n3 5298 16787 19462 8600 \r\n3 5250 17998 8000 8601 \r\n3 19698 16498 18025 8602 \r\n3 19725 16253 9254 8603 \r\n3 10517 19620 18272 8604 \r\n3 5043 19285 5640 8605 \r\n3 13740 7560 19098 8606 \r\n3 17979 6930 6924 8607 \r\n3 7063 19726 19456 8608 \r\n3 18809 19727 18546 8609 \r\n3 19579 5678 9530 8610 \r\n3 11056 7274 14620 8611 \r\n3 15276 13344 15822 8612 \r\n3 13236 15861 10149 8613 \r\n3 10686 10391 19728 8614 \r\n3 14655 5203 18436 8615 \r\n3 7697 8849 11847 8616 \r\n3 13767 7978 9737 8617 \r\n3 18218 19668 19729 8618 \r\n3 17121 19730 14535 8619 \r\n3 6762 13492 13305 8620 \r\n3 13427 17057 15132 8621 \r\n3 5033 15864 19071 8622 \r\n3 19275 17511 19731 8623 \r\n3 19408 10307 19732 8624 \r\n3 17967 18382 13665 8625 \r\n3 10506 18005 18928 8626 \r\n3 18929 5913 19733 8627 \r\n3 9652 19734 18887 8628 \r\n3 10336 19283 8050 8629 \r\n3 8375 18508 17250 8630 \r\n3 19607 19735 16845 8631 \r\n3 15497 7559 5517 8632 \r\n3 11699 19736 14750 8633 \r\n3 19437 12286 11532 8634 \r\n3 14047 16695 19737 8635 \r\n3 17983 5859 16661 8636 \r\n3 17202 11820 14418 8637 \r\n3 15928 19254 17778 8638 \r\n3 6761 5046 13493 8639 \r\n3 15091 12577 14323 8640 \r\n3 8254 15538 19399 8641 \r\n3 19738 7531 14711 8642 \r\n3 18620 15739 12394 8643 \r\n3 10695 5099 14366 8644 \r\n3 17866 16785 14485 8645 \r\n3 14724 6022 19739 8646 \r\n3 19666 16346 8200 8647 \r\n3 19740 9658 10590 8648 \r\n3 19383 17422 16339 8649 \r\n3 19724 5726 17762 8650 \r\n3 19511 16245 14566 8651 \r\n3 19334 19663 16843 8652 \r\n3 9061 13343 8531 8653 \r\n3 13339 9924 6760 8654 \r\n3 11273 18619 13659 8655 \r\n3 12048 16961 19741 8656 \r\n3 5047 18375 19742 8657 \r\n3 7710 12882 19743 8658 \r\n3 18097 19444 5631 8659 \r\n3 17340 19744 16034 8660 \r\n3 19085 14475 7070 8661 \r\n3 17149 16819 18142 8662 \r\n3 19133 18256 9426 8663 \r\n3 19616 6538 15717 8664 \r\n3 5225 16839 18628 8665 \r\n3 17246 18051 19401 8666 \r\n3 8935 7571 7077 8667 \r\n3 8191 19045 7365 8668 \r\n3 9764 9460 17354 8669 \r\n3 19496 17186 12338 8670 \r\n3 13021 10563 9351 8671 \r\n3 12619 7322 7403 8672 \r\n3 19489 12777 12036 8673 \r\n3 7483 9698 18145 8674 \r\n3 17719 19745 17836 8675 \r\n3 17357 19140 17647 8676 \r\n3 11842 16803 18761 8677 \r\n3 8956 18937 15258 8678 \r\n3 19434 6393 11673 8679 \r\n3 8825 10850 18963 8680 \r\n3 10536 16318 18504 8681 \r\n3 15245 19631 14369 8682 \r\n3 11903 18383 18379 8683 \r\n3 15241 9180 14392 8684 \r\n3 6788 17682 19273 8685 \r\n3 18603 19161 18783 8686 \r\n3 12874 11406 13613 8687 \r\n3 19588 8197 19414 8688 \r\n3 19662 15745 18220 8689 \r\n3 16700 10660 16741 8690 \r\n3 19746 10538 10025 8691 \r\n3 19342 16053 15197 8692 \r\n3 19747 18075 18428 8693 \r\n3 16590 19748 15525 8694 \r\n3 11213 19749 6785 8695 \r\n3 17325 19459 7625 8696 \r\n3 5080 6810 15406 8697 \r\n3 19750 17899 15924 8698 \r\n3 5675 19751 17727 8699 \r\n3 5773 19250 12586 8700 \r\n3 19199 6093 19395 8701 \r\n3 19106 19752 10092 8702 \r\n3 17074 10411 19753 8703 \r\n3 6475 5617 19754 8704 \r\n3 18243 17358 16932 8705 \r\n3 8473 17825 8378 8706 \r\n3 19756 19755 7617 8707 \r\n3 11815 18833 13632 8708 \r\n3 15450 9808 18854 8709 \r\n3 6493 12101 19236 8710 \r\n3 18699 19364 14318 8711 \r\n3 19757 18999 14611 8712 \r\n3 19746 12107 7093 8713 \r\n3 6275 16150 12495 8714 \r\n3 18991 6143 9318 8715 \r\n3 16311 12840 16640 8716 \r\n3 19758 18137 16953 8717 \r\n3 14978 19346 19247 8718 \r\n3 19466 13832 17501 8719 \r\n3 19673 18787 18292 8720 \r\n3 19759 19566 18842 8721 \r\n3 18830 14118 16407 8722 \r\n3 17595 18398 12145 8723 \r\n3 14522 15297 9922 8724 \r\n3 13936 19760 11553 8725 \r\n3 19218 14667 12055 8726 \r\n3 7376 16487 5074 8727 \r\n3 6297 18907 13268 8728 \r\n3 7588 19761 9824 8729 \r\n3 19762 16950 8302 8730 \r\n3 18800 19385 16256 8731 \r\n3 9114 13605 19763 8732 \r\n3 8782 18904 17749 8733 \r\n3 17092 14860 19492 8734 \r\n3 6630 17356 19721 8735 \r\n3 15566 8691 18866 8736 \r\n3 11372 18513 19701 8737 \r\n3 16850 13602 19596 8738 \r\n3 11047 19744 15617 8739 \r\n3 8269 18215 9725 8740 \r\n3 10185 5213 19274 8741 \r\n3 14113 11618 12357 8742 \r\n3 12454 18581 16816 8743 \r\n3 18475 10199 6487 8744 \r\n3 12475 10743 16648 8745 \r\n3 13018 17151 18804 8746 \r\n3 19467 19552 19053 8747 \r\n3 19682 12112 16320 8748 \r\n3 13610 19427 18014 8749 \r\n3 19764 15249 17009 8750 \r\n3 18189 18362 6772 8751 \r\n3 9494 19765 16769 8752 \r\n3 11074 11437 17263 8753 \r\n3 19599 12154 19700 8754 \r\n3 11692 19448 9527 8755 \r\n3 13413 5637 19026 8756 \r\n3 5844 19766 17775 8757 \r\n3 6347 13098 19767 8758 \r\n3 9830 6472 16406 8759 \r\n3 9372 12622 6327 8760 \r\n3 19768 12932 14028 8761 \r\n3 19252 7485 7707 8762 \r\n3 17707 19769 6819 8763 \r\n3 18676 19477 18913 8764 \r\n3 5098 18392 17459 8765 \r\n3 15374 13246 16250 8766 \r\n3 19771 19618 19770 8767 \r\n3 19772 18549 15140 8768 \r\n3 16180 19773 8828 8769 \r\n3 12852 5053 15449 8770 \r\n3 19774 17599 11163 8771 \r\n3 9813 17553 16078 8772 \r\n3 5825 16489 9149 8773 \r\n3 11032 18848 19775 8774 \r\n3 14339 8262 18212 8775 \r\n3 19777 19281 19776 8776 \r\n3 18144 5306 17086 8777 \r\n3 19778 11729 9580 8778 \r\n3 15850 18933 15613 8779 \r\n3 7135 19679 9376 8780 \r\n3 15801 13872 17624 8781 \r\n3 16789 15184 17141 8782 \r\n3 19779 10985 11539 8783 \r\n3 14578 19113 16154 8784 \r\n3 10918 16310 18843 8785 \r\n3 19780 19536 16209 8786 \r\n3 9023 12569 15037 8787 \r\n3 19781 19493 9545 8788 \r\n3 18590 11126 5947 8789 \r\n3 19782 6239 17690 8790 \r\n3 7534 18157 10593 8791 \r\n3 15800 16371 9542 8792 \r\n3 19745 19783 12849 8793 \r\n3 19468 16143 14852 8794 \r\n3 17415 19411 8963 8795 \r\n3 7814 15121 17977 8796 \r\n3 18231 12782 18219 8797 \r\n3 15712 10551 10134 8798 \r\n3 19262 16841 12230 8799 \r\n3 19785 19784 15713 8800 \r\n3 9489 6402 17079 8801 \r\n3 19786 19481 12696 8802 \r\n3 15573 10776 18602 8803 \r\n3 9716 15023 13209 8804 \r\n3 19787 16213 19545 8805 \r\n3 9606 15830 14004 8806 \r\n3 17584 5965 7145 8807 \r\n3 19469 8747 11419 8808 \r\n3 11901 15922 19190 8809 \r\n3 17039 13374 19788 8810 \r\n3 16098 8908 17077 8811 \r\n3 17894 18197 16994 8812 \r\n3 5934 9446 9090 8813 \r\n3 13384 18310 17515 8814 \r\n3 9674 19244 19751 8815 \r\n3 10778 19740 18734 8816 \r\n3 19333 19789 19790 8817 \r\n3 17909 17858 5558 8818 \r\n3 16326 14279 8067 8819 \r\n3 18595 14523 19760 8820 \r\n3 14555 10334 15315 8821 \r\n3 5496 19791 8927 8822 \r\n3 15784 19156 19792 8823 \r\n3 19095 15395 14548 8824 \r\n3 10951 8592 16178 8825 \r\n3 18268 19793 13516 8826 \r\n3 17587 9711 6356 8827 \r\n3 16006 17601 19794 8828 \r\n3 19339 19795 14780 8829 \r\n3 9701 19546 16094 8830 \r\n3 16597 17961 17129 8831 \r\n3 13624 7144 18584 8832 \r\n3 19796 17954 16321 8833 \r\n3 16919 7704 18632 8834 \r\n3 19757 18031 19295 8835 \r\n3 16618 9402 18374 8836 \r\n3 5064 11519 16992 8837 \r\n3 15415 12043 19797 8838 \r\n3 7324 19798 19030 8839 \r\n3 17088 19525 17535 8840 \r\n3 16678 18548 9281 8841 \r\n3 19331 14779 16630 8842 \r\n3 16671 18194 12558 8843 \r\n3 17699 14329 19783 8844 \r\n3 7544 19799 14791 8845 \r\n3 12320 6026 16938 8846 \r\n3 13055 19800 19612 8847 \r\n3 12929 6979 15753 8848 \r\n3 19216 18808 13706 8849 \r\n3 14911 19697 19396 8850 \r\n3 17959 13409 12510 8851 \r\n3 8863 17159 9662 8852 \r\n3 12142 16798 18063 8853 \r\n3 6517 10414 18089 8854 \r\n3 19474 19801 12783 8855 \r\n3 19802 15876 17731 8856 \r\n3 17839 19803 17924 8857 \r\n3 16796 16635 14360 8858 \r\n3 7277 14127 17296 8859 \r\n3 19804 17307 17642 8860 \r\n3 7468 17529 12899 8861 \r\n3 19165 11874 7470 8862 \r\n3 12533 8617 14567 8863 \r\n3 7733 19805 13271 8864 \r\n3 13618 8763 6284 8865 \r\n3 10569 15978 18445 8866 \r\n3 15129 19806 13646 8867 \r\n3 17691 18631 18129 8868 \r\n3 9139 19807 17438 8869 \r\n3 17736 19610 19776 8870 \r\n3 11468 16429 19490 8871 \r\n3 19659 19457 15908 8872 \r\n3 15405 17732 19808 8873 \r\n3 15005 6519 19792 8874 \r\n3 19276 13971 19551 8875 \r\n3 11210 10610 19628 8876 \r\n3 10708 19809 16871 8877 \r\n3 12269 6097 19378 8878 \r\n3 7459 19554 18618 8879 \r\n3 17773 19069 18715 8880 \r\n3 19810 14849 5352 8881 \r\n3 19811 19503 13866 8882 \r\n3 15106 8512 15393 8883 \r\n3 12623 16651 9514 8884 \r\n3 5803 15369 13985 8885 \r\n3 5128 15231 6521 8886 \r\n3 14396 14586 11780 8887 \r\n3 19380 10162 19812 8888 \r\n3 18154 9908 13272 8889 \r\n3 19416 19260 13411 8890 \r\n3 19257 18762 5155 8891 \r\n3 15914 8817 19813 8892 \r\n3 16981 16969 18233 8893 \r\n3 8700 19814 9720 8894 \r\n3 8732 11535 17555 8895 \r\n3 11029 19650 19815 8896 \r\n3 19520 11302 19814 8897 \r\n3 13588 14743 19009 8898 \r\n3 19817 14293 19816 8899 \r\n3 6923 6875 15520 8900 \r\n3 10318 17999 13061 8901 \r\n3 17075 15243 12598 8902 \r\n3 14759 17518 18400 8903 \r\n3 19057 19818 14179 8904 \r\n3 14208 5977 13466 8905 \r\n3 18820 16353 18910 8906 \r\n3 6083 14937 15320 8907 \r\n3 11114 19819 18110 8908 \r\n3 17542 18188 19403 8909 \r\n3 19112 12076 18678 8910 \r\n3 8641 5779 15585 8911 \r\n3 11928 17955 17610 8912 \r\n3 18090 19820 18942 8913 \r\n3 19630 16783 8954 8914 \r\n3 19660 19821 19797 8915 \r\n3 10861 17090 19569 8916 \r\n3 14075 11631 19822 8917 \r\n3 11981 14435 13093 8918 \r\n3 17182 18579 15486 8919 \r\n3 7177 19823 19817 8920 \r\n3 8419 19539 12364 8921 \r\n3 16802 19428 13856 8922 \r\n3 13324 11738 15641 8923 \r\n3 14867 18273 12050 8924 \r\n3 6926 14101 17094 8925 \r\n3 15574 13679 19667 8926 \r\n3 19355 5693 16331 8927 \r\n3 7562 19824 13619 8928 \r\n3 8119 19245 19357 8929 \r\n3 15528 17069 19512 8930 \r\n3 10584 12113 19184 8931 \r\n3 5495 16916 17540 8932 \r\n3 19825 18263 18662 8933 \r\n3 18135 16910 9236 8934 \r\n3 9893 19446 9950 8935 \r\n3 15460 17434 9301 8936 \r\n3 6784 17365 5259 8937 \r\n3 16738 12548 19826 8938 \r\n3 10492 19142 19827 8939 \r\n3 18872 19790 17421 8940 \r\n3 11646 19048 6899 8941 \r\n3 19828 13599 6396 8942 \r\n3 10871 8820 19059 8943 \r\n3 8159 19829 13772 8944 \r\n3 11303 8770 12332 8945 \r\n3 19830 11758 16899 8946 \r\n3 19767 19169 14332 8947 \r\n3 12815 17113 7969 8948 \r\n3 14533 12792 17665 8949 \r\n3 12900 8962 18945 8950 \r\n3 15990 9246 15775 8951 \r\n3 18175 6084 6343 8952 \r\n3 19749 19831 18180 8953 \r\n3 19832 18625 17867 8954 \r\n3 19228 19833 17144 8955 \r\n3 15274 15915 18574 8956 \r\n3 13008 19834 19835 8957 \r\n3 19836 7137 18564 8958 \r\n3 18923 13797 16748 8959 \r\n3 5650 6470 9219 8960 \r\n3 18056 5705 15966 8961 \r\n3 19251 19816 17621 8962 \r\n3 11973 19687 13600 8963 \r\n3 19837 18879 19264 8964 \r\n3 13561 11985 14839 8965 \r\n3 9441 14411 18748 8966 \r\n3 19837 17207 7268 8967 \r\n3 11357 19209 18779 8968 \r\n3 6940 18878 5361 8969 \r\n3 9787 14558 18931 8970 \r\n3 13683 14926 5979 8971 \r\n3 19124 12553 9063 8972 \r\n3 19736 19838 19839 8973 \r\n3 19163 9118 13500 8974 \r\n3 13451 6686 17346 8975 \r\n3 19840 11726 18785 8976 \r\n3 14139 13567 13457 8977 \r\n3 8918 11473 18086 8978 \r\n3 19419 14363 17901 8979 \r\n3 19671 6087 19421 8980 \r\n3 15781 19841 19842 8981 \r\n3 10664 13508 19843 8982 \r\n3 18812 11798 19761 8983 \r\n3 7192 19665 19304 8984 \r\n3 11371 15961 19844 8985 \r\n3 19580 11172 8614 8986 \r\n3 19846 14974 19845 8987 \r\n3 14061 17580 6062 8988 \r\n3 11347 19568 7651 8989 \r\n3 5158 19847 19818 8990 \r\n3 15718 19717 5233 8991 \r\n3 10948 5899 19147 8992 \r\n3 6605 15072 13757 8993 \r\n3 19581 14882 16226 8994 \r\n3 11310 16773 19848 8995 \r\n3 19033 15923 19849 8996 \r\n3 18570 16467 5967 8997 \r\n3 8855 12104 19370 8998 \r\n3 19850 14818 10102 8999 \r\n3 15156 13517 15321 9000 \r\n3 16965 14630 18038 9001 \r\n3 19646 6593 19851 9002 \r\n3 19168 13836 12037 9003 \r\n3 13774 14942 18022 9004 \r\n3 14741 8784 9016 9005 \r\n3 5664 11974 19836 9006 \r\n3 11700 16993 17404 9007 \r\n3 9263 19852 16888 9008 \r\n3 17190 13575 19853 9009 \r\n3 19559 19198 19854 9010 \r\n3 15412 7850 6911 9011 \r\n3 16404 11765 19541 9012 \r\n3 8327 17229 16941 9013 \r\n3 16549 19855 5027 9014 \r\n3 16330 8556 14598 9015 \r\n3 15396 18012 9187 9016 \r\n3 15043 17181 13418 9017 \r\n3 19856 19629 5106 9018 \r\n3 8162 8394 15844 9019 \r\n3 19849 8542 8685 9020 \r\n3 18846 18771 18421 9021 \r\n3 19439 14386 14875 9022 \r\n3 14976 19391 17277 9023 \r\n3 19810 17957 17811 9024 \r\n3 18088 14265 10846 9025 \r\n3 18871 16713 8919 9026 \r\n3 19702 19857 6969 9027 \r\n3 9081 19675 15653 9028 \r\n3 18720 16106 17465 9029 \r\n3 13258 5958 15437 9030 \r\n3 9153 9502 16533 9031 \r\n3 5548 12133 19233 9032 \r\n3 18506 19858 5297 9033 \r\n3 12146 19859 17803 9034 \r\n3 17724 19450 14610 9035 \r\n3 18274 19080 7682 9036 \r\n3 11081 18562 5337 9037 \r\n3 18509 18903 9348 9038 \r\n3 12884 16791 18530 9039 \r\n3 17098 16497 16954 9040 \r\n3 19093 15479 19338 9041 \r\n3 17498 19232 12414 9042 \r\n3 16422 14576 19074 9043 \r\n3 17546 19034 10446 9044 \r\n3 10662 19860 19555 9045 \r\n3 12722 18439 14162 9046 \r\n3 19655 19255 6377 9047 \r\n3 18409 9162 18597 9048 \r\n3 14846 18682 11286 9049 \r\n3 19162 17201 16367 9050 \r\n3 7005 18043 6982 9051 \r\n3 6690 6554 13717 9052 \r\n3 12073 7843 8319 9053 \r\n3 13151 6135 19861 9054 \r\n3 19862 5482 19115 9055 \r\n3 19863 14057 15604 9056 \r\n3 16095 11969 9702 9057 \r\n3 16680 5651 19362 9058 \r\n3 12449 17594 10326 9059 \r\n3 17211 10889 17063 9060 \r\n3 19865 10748 19864 9061 \r\n3 18710 11439 19624 9062 \r\n3 19731 11464 13479 9063 \r\n3 14509 19593 18701 9064 \r\n3 6754 8875 18510 9065 \r\n3 12804 18652 11621 9066 \r\n3 13429 12894 18083 9067 \r\n3 13291 5686 18282 9068 \r\n3 11943 7694 15187 9069 \r\n3 19866 18754 13764 9070 \r\n3 16639 17743 11886 9071 \r\n3 11461 19867 8326 9072 \r\n3 19505 13853 19868 9073 \r\n3 12721 19772 19643 9074 \r\n3 8152 11373 8350 9075 \r\n3 19781 10775 19869 9076 \r\n3 16869 19676 9736 9077 \r\n3 17282 19229 14845 9078 \r\n3 16431 17765 19185 9079 \r\n3 19869 16162 15577 9080 \r\n3 13813 19641 9761 9081 \r\n3 16658 7598 18869 9082 \r\n3 11552 10730 9388 9083 \r\n3 10917 12205 19834 9084 \r\n3 10624 19013 17559 9085 \r\n3 10227 16252 14025 9086 \r\n3 19488 18765 7818 9087 \r\n3 18829 19732 16329 9088 \r\n3 19809 12761 17926 9089 \r\n3 14499 10153 18563 9090 \r\n3 16861 14147 19604 9091 \r\n3 18235 19157 12688 9092 \r\n3 9125 18533 18289 9093 \r\n3 16650 9409 12924 9094 \r\n3 18044 18518 7861 9095 \r\n3 13102 11027 19452 9096 \r\n3 19358 11309 14622 9097 \r\n3 5579 18495 12366 9098 \r\n3 19565 17343 18173 9099 \r\n3 19208 16215 12535 9100 \r\n3 15670 18373 10104 9101 \r\n3 9268 19271 19870 9102 \r\n3 13814 13389 16882 9103 \r\n3 14551 9884 9735 9104 \r\n3 16232 5999 19871 9105 \r\n3 12099 15096 8092 9106 \r\n3 14338 11946 9526 9107 \r\n3 9517 19558 5426 9108 \r\n3 19803 15527 12785 9109 \r\n3 17391 8288 13660 9110 \r\n3 7378 19726 15731 9111 \r\n3 10995 12075 15247 9112 \r\n3 18918 5115 5524 9113 \r\n3 13707 18810 7371 9114 \r\n3 5582 14811 15171 9115 \r\n3 19032 19024 19750 9116 \r\n3 19136 14291 16423 9117 \r\n3 13251 18468 11121 9118 \r\n3 17131 18598 12464 9119 \r\n3 15237 12977 19872 9120 \r\n3 19135 18223 18917 9121 \r\n3 10692 17472 18065 9122 \r\n3 7438 16201 18952 9123 \r\n3 19737 14429 13121 9124 \r\n3 19322 19413 19802 9125 \r\n3 17369 14915 18024 9126 \r\n3 9730 19873 6991 9127 \r\n3 11890 18441 5108 9128 \r\n3 19874 18304 17371 9129 \r\n3 19502 18182 15671 9130 \r\n3 15256 13096 17821 9131 \r\n3 19728 17884 14065 9132 \r\n3 17123 10050 17687 9133 \r\n3 11980 18874 19075 9134 \r\n3 7703 15803 15082 9135 \r\n3 17786 8031 13375 9136 \r\n3 19852 12565 15624 9137 \r\n3 5375 19225 16963 9138 \r\n3 18013 18141 19823 9139 \r\n3 16027 15500 16929 9140 \r\n3 9092 19371 17067 9141 \r\n3 11500 19480 18280 9142 \r\n3 13200 10195 13798 9143 \r\n3 19719 18092 5786 9144 \r\n3 7096 19715 19762 9145 \r\n3 10922 15493 15986 9146 \r\n3 19875 19592 19563 9147 \r\n3 5992 7756 12766 9148 \r\n3 19876 14708 19471 9149 \r\n3 15496 9929 19877 9150 \r\n3 19879 10065 19878 9151 \r\n3 19880 10675 19002 9152 \r\n3 11458 17784 6881 9153 \r\n3 17944 19808 16421 9154 \r\n3 15612 5290 11989 9155 \r\n3 18305 19713 13035 9156 \r\n3 13933 13957 8741 9157 \r\n3 18519 7958 18351 9158 \r\n3 19005 7925 19877 9159 \r\n3 11408 10172 6602 9160 \r\n3 17235 19379 10949 9161 \r\n3 15524 8227 12886 9162 \r\n3 13103 7652 19695 9163 \r\n3 18959 18772 17301 9164 \r\n3 19611 7575 11370 9165 \r\n3 14379 5807 18688 9166 \r\n3 12930 7840 14831 9167 \r\n3 8129 19773 18016 9168 \r\n3 18704 5315 19402 9169 \r\n3 19418 19076 19881 9170 \r\n3 19319 17898 15790 9171 \r\n3 17193 19449 19882 9172 \r\n3 19720 17486 15059 9173 \r\n3 19883 11672 5211 9174 \r\n3 15281 17709 19621 9175 \r\n3 6152 11030 12176 9176 \r\n3 12171 19001 17656 9177 \r\n3 19884 19015 11098 9178 \r\n3 5515 8573 11615 9179 \r\n3 19885 9555 8416 9180 \r\n3 8218 17545 16623 9181 \r\n3 16130 16121 19854 9182 \r\n3 12760 19359 7613 9183 \r\n3 7759 16012 18974 9184 \r\n3 8818 19292 12108 9185 \r\n3 14557 16930 19886 9186 \r\n3 15791 15010 18459 9187 \r\n3 18646 8146 10596 9188 \r\n3 5573 19107 19530 9189 \r\n3 18627 18121 18261 9190 \r\n3 17125 14269 19887 9191 \r\n3 10313 19634 19879 9192 \r\n3 19290 5215 16039 9193 \r\n3 16352 12545 12422 9194 \r\n3 19556 19888 19884 9195 \r\n3 7708 19509 19815 9196 \r\n3 19056 19491 5660 9197 \r\n3 15397 15067 18858 9198 \r\n3 10892 19689 18078 9199 \r\n3 11221 9213 19550 9200 \r\n3 18131 5724 7657 9201 \r\n3 14241 10795 19160 9202 \r\n3 8581 19889 19890 9203 \r\n3 19891 17476 13840 9204 \r\n3 9809 17269 6080 9205 \r\n3 5266 16831 19892 9206 \r\n3 17881 8723 14361 9207 \r\n3 15837 19734 19561 9208 \r\n3 19894 19893 9643 9209 \r\n3 18786 19830 12044 9210 \r\n3 19895 14277 15708 9211 \r\n3 6411 19576 19298 9212 \r\n3 15904 19896 16860 9213 \r\n3 19224 19778 14390 9214 \r\n3 19898 15292 19897 9215 \r\n3 15913 6778 14425 9216 \r\n3 18989 19899 9981 9217 \r\n3 17328 14514 16286 9218 \r\n3 10486 19900 5168 9219 \r\n3 16018 19766 18751 9220 \r\n3 9466 19901 16122 9221 \r\n3 8721 18246 19179 9222 \r\n3 5376 15126 12762 9223 \r\n3 5302 13308 18052 9224 \r\n3 10979 18851 5414 9225 \r\n3 18055 18453 6089 9226 \r\n3 15092 16732 18286 9227 \r\n3 19748 13927 19801 9228 \r\n3 19902 11137 15429 9229 \r\n3 12444 18865 10341 9230 \r\n3 16388 19903 17427 9231 \r\n3 14856 13185 13993 9232 \r\n3 12822 14842 14765 9233 \r\n3 6002 15384 7106 9234 \r\n3 17603 19328 10449 9235 \r\n3 7379 14009 18997 9236 \r\n3 14249 9992 19904 9237 \r\n3 16495 12298 11142 9238 \r\n3 19906 19905 19375 9239 \r\n3 15943 16093 19553 9240 \r\n3 9051 15619 12550 9241 \r\n3 17458 19868 18849 9242 \r\n3 12441 16575 9753 9243 \r\n3 10435 19907 14624 9244 \r\n3 19529 19908 10000 9245 \r\n3 8868 18994 19742 9246 \r\n3 19494 7828 17625 9247 \r\n3 19909 14282 16836 9248 \r\n3 17882 19241 19892 9249 \r\n3 12103 13347 17068 9250 \r\n3 19796 15678 18973 9251 \r\n3 19519 11457 19320 9252 \r\n3 18120 9740 15754 9253 \r\n3 18947 14962 15040 9254 \r\n3 15284 10363 5974 9255 \r\n3 19910 15999 7913 9256 \r\n3 18940 13224 7606 9257 \r\n3 7827 12843 19083 9258 \r\n3 18589 19911 5864 9259 \r\n3 15308 19912 10235 9260 \r\n3 10520 18905 19269 9261 \r\n3 19866 11169 17457 9262 \r\n3 19090 17115 19913 9263 \r\n3 14146 17919 19212 9264 \r\n3 19764 17566 12758 9265 \r\n3 17488 9422 19256 9266 \r\n3 8598 8708 17224 9267 \r\n3 10340 19384 11917 9268 \r\n3 14225 9041 9230 9269 \r\n3 19915 19914 14526 9270 \r\n3 15804 17374 12536 9271 \r\n3 17304 19423 19916 9272 \r\n3 19126 11601 11710 9273 \r\n3 17548 19917 18690 9274 \r\n3 8764 19622 8156 9275 \r\n3 7330 18593 19574 9276 \r\n3 8892 10278 9189 9277 \r\n3 19786 10880 19822 9278 \r\n3 15673 18516 15330 9279 \r\n3 19239 18190 19211 9280 \r\n3 19206 19374 14672 9281 \r\n3 15675 19422 16368 9282 \r\n3 17728 13129 14489 9283 \r\n3 19615 5646 13655 9284 \r\n3 5749 15455 6213 9285 \r\n3 15148 14840 19326 9286 \r\n3 14585 17655 14580 9287 \r\n3 19557 11926 9975 9288 \r\n3 16475 9490 17080 9289 \r\n3 5596 19918 19919 9290 \r\n3 18932 19886 10141 9291 \r\n3 19648 9626 19920 9292 \r\n3 19369 19207 19705 9293 \r\n3 14940 12433 19376 9294 \r\n3 7358 17418 19451 9295 \r\n3 16512 19388 17165 9296 \r\n3 8853 16649 19623 9297 \r\n3 15658 19443 13460 9298 \r\n3 12114 14876 19351 9299 \r\n3 7931 6818 11230 9300 \r\n3 8461 19824 19350 9301 \r\n3 7496 12765 16315 9302 \r\n3 19709 18670 10114 9303 \r\n3 19921 7746 18318 9304 \r\n3 13742 5942 19594 9305 \r\n3 12365 19922 12342 9306 \r\n3 16176 19768 14736 9307 \r\n3 12064 14943 19894 9308 \r\n3 17524 18128 14844 9309 \r\n3 8114 18743 19714 9310 \r\n3 9284 19923 15222 9311 \r\n3 18992 7184 13547 9312 \r\n3 12718 19821 8696 9313 \r\n3 18312 11518 11155 9314 \r\n3 15027 13755 18841 9315 \r\n3 15815 14070 16603 9316 \r\n3 14808 11686 19924 9317 \r\n3 10639 19925 18006 9318 \r\n3 13010 15842 16730 9319 \r\n3 18911 17127 9982 9320 \r\n3 19862 6137 18901 9321 \r\n3 5538 19908 17850 9322 \r\n3 8992 14657 13869 9323 \r\n3 19807 16207 19926 9324 \r\n3 16726 16083 18325 9325 \r\n3 18528 6651 10071 9326 \r\n3 16291 19482 17256 9327 \r\n3 19929 19927 19928 9328 \r\n3 5805 19850 19930 9329 \r\n3 16585 8670 13361 9330 \r\n3 14602 19848 16770 9331 \r\n3 17018 13863 16573 9332 \r\n3 13539 8693 18668 9333 \r\n3 19861 19116 6901 9334 \r\n3 14161 18350 14970 9335 \r\n3 8190 19296 19811 9336 \r\n3 9963 17200 6585 9337 \r\n3 19888 18419 6826 9338 \r\n3 19582 12574 13810 9339 \r\n3 16720 16387 19327 9340 \r\n3 14362 15843 13130 9341 \r\n3 18711 19931 19932 9342 \r\n3 10222 11791 14644 9343 \r\n3 6450 5912 12970 9344 \r\n3 19602 14777 9677 9345 \r\n3 19137 19649 13762 9346 \r\n3 19785 9909 19377 9347 \r\n3 7328 17893 9675 9348 \r\n3 11526 13024 11709 9349 \r\n3 5632 8517 16877 9350 \r\n3 19933 19897 19152 9351 \r\n3 7535 16374 18524 9352 \r\n3 14169 18266 10399 9353 \r\n3 14336 17334 6731 9354 \r\n3 18969 7761 19893 9355 \r\n3 19265 14312 18857 9356 \r\n3 9424 19932 11730 9357 \r\n3 17311 19332 9079 9358 \r\n3 14625 19506 17716 9359 \r\n3 19935 8888 19934 9360 \r\n3 12399 8714 7880 9361 \r\n3 15991 17270 19111 9362 \r\n3 17128 17774 19299 9363 \r\n3 9082 14538 19936 9364 \r\n3 12878 19924 6107 9365 \r\n3 19549 19937 13894 9366 \r\n3 7676 10288 7048 9367 \r\n3 11225 5874 5467 9368 \r\n3 15586 19798 19938 9369 \r\n3 13309 19674 19876 9370 \r\n3 19917 19381 17646 9371 \r\n3 19939 10744 14992 9372 \r\n3 17015 19851 5239 9373 \r\n3 10169 5532 17492 9374 \r\n3 19940 15234 9648 9375 \r\n3 7692 19941 13415 9376 \r\n3 19915 10086 18538 9377 \r\n3 18372 15669 16369 9378 \r\n3 16420 19942 14662 9379 \r\n3 11053 16216 15797 9380 \r\n3 19407 14495 15445 9381 \r\n3 19693 9901 16189 9382 \r\n3 15250 19154 13169 9383 \r\n3 19943 7628 8532 9384 \r\n3 11976 12604 18667 9385 \r\n3 16917 19672 18035 9386 \r\n3 19752 19694 5699 9387 \r\n3 14187 15820 19859 9388 \r\n3 8624 19944 14503 9389 \r\n3 5839 13126 19945 9390 \r\n3 18460 19678 19940 9391 \r\n3 19933 15762 11058 9392 \r\n3 19475 18793 19946 9393 \r\n3 19947 19943 15794 9394 \r\n3 11953 19782 15553 9395 \r\n3 19948 11189 9212 9396 \r\n3 16293 12853 19196 9397 \r\n3 6604 19805 7304 9398 \r\n3 13522 14979 16507 9399 \r\n3 9131 8284 7966 9400 \r\n3 16771 13596 18490 9401 \r\n3 19382 8815 9684 9402 \r\n3 19253 14457 12951 9403 \r\n3 19929 19918 9811 9404 \r\n3 12008 19949 11139 9405 \r\n3 19088 13368 9812 9406 \r\n3 19311 14904 12635 9407 \r\n3 18547 18389 17585 9408 \r\n3 8789 11693 19950 9409 \r\n3 18394 14188 8504 9410 \r\n3 19006 18328 14518 9411 \r\n3 15542 18760 14029 9412 \r\n3 19754 19022 15705 9413 \r\n3 12945 19951 16885 9414 \r\n3 18526 16792 18612 9415 \r\n3 14995 5444 6677 9416 \r\n3 12087 19952 12305 9417 \r\n3 11068 19084 19716 9418 \r\n3 19953 18251 16123 9419 \r\n3 8335 19935 8533 9420 \r\n3 19654 18544 14799 9421 \r\n3 19857 12345 16983 9422 \r\n3 19386 19882 15304 9423 \r\n3 19484 11176 19954 9424 \r\n3 14941 10309 12719 9425 \r\n3 19955 17440 6936 9426 \r\n3 17331 14050 15318 9427 \r\n3 16995 17698 11607 9428 \r\n3 19725 18891 19267 9429 \r\n3 5049 18894 19497 9430 \r\n3 18503 15777 10279 9431 \r\n3 16402 9444 19595 9432 \r\n3 19956 14953 19941 9433 \r\n3 8897 18607 19957 9434 \r\n3 19958 19712 6752 9435 \r\n3 19335 19125 8046 9436 \r\n3 6642 15186 9704 9437 \r\n3 19393 19129 19540 9438 \r\n3 17974 8193 7502 9439 \r\n3 18716 13782 16646 9440 \r\n3 19959 11892 6425 9441 \r\n3 19633 15544 6730 9442 \r\n3 19613 18410 16187 9443 \r\n3 14209 18311 15469 9444 \r\n3 16447 16200 18500 9445 \r\n3 10741 9181 11171 9446 \r\n3 17833 16273 19004 9447 \r\n3 19960 16377 12477 9448 \r\n3 19587 5783 8049 9449 \r\n3 18986 18686 15609 9450 \r\n3 9329 13216 8423 9451 \r\n3 13874 13079 6598 9452 \r\n3 19177 18930 15260 9453 \r\n3 19753 8690 6099 9454 \r\n3 10926 17692 19898 9455 \r\n3 7128 17423 12983 9456 \r\n3 19684 10360 6274 9457 \r\n3 17658 14822 11653 9458 \r\n3 11766 19343 8040 9459 \r\n3 17360 7942 19839 9460 \r\n3 16005 18187 9744 9461 \r\n3 19961 19901 19314 9462 \r\n3 18680 14330 19858 9463 \r\n3 19733 19845 19962 9464 \r\n3 13329 6674 17234 9465 \r\n3 19912 19242 19368 9466 \r\n3 18687 19833 19640 9467 \r\n3 17564 18402 19670 9468 \r\n3 12143 19914 11939 9469 \r\n3 16942 9634 14204 9470 \r\n3 19180 19890 10080 9471 \r\n3 8609 14635 17522 9472 \r\n3 16134 13214 6939 9473 \r\n3 19455 19758 8786 9474 \r\n3 16812 9872 14104 9475 \r\n3 19846 19246 8640 9476 \r\n3 17319 13478 19921 9477 \r\n3 10136 18968 17925 9478 \r\n3 16161 17572 15578 9479 \r\n3 19838 14894 18752 9480 \r\n3 7336 10518 9237 9481 \r\n3 15859 14675 19950 9482 \r\n3 5132 19956 9111 9483 \r\n3 13897 15484 19591 9484 \r\n3 5425 11075 5658 9485 \r\n3 13029 15685 19788 9486 \r\n3 18195 10870 14346 9487 \r\n3 13912 19685 13875 9488 \r\n3 17406 19887 18140 9489 \r\n3 14044 18732 10738 9490 \r\n3 17592 19885 18245 9491 \r\n3 8989 12430 5248 9492 \r\n3 19548 19763 16058 9493 \r\n3 14827 15871 9831 9494 \r\n3 19784 8913 14666 9495 \r\n3 12642 6106 14547 9496 \r\n3 9387 17793 12750 9497 \r\n3 19173 8008 18805 9498 \r\n3 8171 15409 18152 9499 \r\n3 18583 8370 19756 9500 \r\n3 11859 16478 16956 9501 \r\n3 19661 9011 6039 9502 \r\n3 11883 19963 14504 9503 \r\n3 19723 17305 14459 9504 \r\n3 19570 15751 18926 9505 \r\n3 14656 18435 19747 9506 \r\n3 18950 13633 19686 9507 \r\n3 18124 11040 17906 9508 \r\n3 8510 18252 15972 9509 \r\n3 18856 13635 12216 9510 \r\n3 17174 15124 14335 9511 \r\n3 19800 13558 18411 9512 \r\n3 14749 19953 19961 9513 \r\n3 10608 14280 16158 9514 \r\n3 16499 14316 16049 9515 \r\n3 19863 13004 19431 9516 \r\n3 17093 15115 17261 9517 \r\n3 12996 15002 19707 9518 \r\n3 19054 17532 16144 9519 \r\n3 16978 17489 18507 9520 \r\n3 18337 19517 19964 9521 \r\n3 17053 9322 19905 9522 \r\n3 19965 15383 19625 9523 \r\n3 19213 10648 12879 9524 \r\n3 18644 19195 18163 9525 \r\n3 11102 19037 14673 9526 \r\n3 19472 19947 18661 9527 \r\n3 11179 19966 16909 9528 \r\n3 13871 9157 13498 9529 \r\n3 9629 16946 14617 9530 \r\n3 14107 15879 12499 9531 \r\n3 7790 13041 19590 9532 \r\n3 19789 13820 19291 9533 \r\n3 19967 13569 19237 9534 \r\n3 18477 19900 16186 9535 \r\n3 16521 18539 16893 9536 \r\n3 19968 18345 17463 9537 \r\n3 19969 13938 19840 9538 \r\n3 12654 5020 7362 9539 \r\n3 19970 16892 19946 9540 \r\n3 18326 16808 15701 9541 \r\n3 18639 19345 19584 9542 \r\n3 17787 15632 11480 9543 \r\n3 15951 13699 12402 9544 \r\n3 17154 18456 14579 9545 \r\n3 12302 14744 9147 9546 \r\n3 8712 7853 6990 9547 \r\n3 7370 15814 19597 9548 \r\n3 7706 6420 18039 9549 \r\n3 19302 16496 14008 9550 \r\n3 12630 18944 13352 9551 \r\n3 19906 16657 18368 9552 \r\n3 5809 10127 19971 9553 \r\n3 5124 10455 6341 9554 \r\n3 18491 15997 14758 9555 \r\n3 5976 19902 11643 9556 \r\n3 19248 7523 11345 9557 \r\n3 16263 14038 15764 9558 \r\n3 7012 12445 19738 9559 \r\n3 19972 10567 14381 9560 \r\n3 17185 16793 16519 9561 \r\n3 15070 19843 7452 9562 \r\n3 15185 7257 19361 9563 \r\n3 17496 12467 7757 9564 \r\n3 12481 12649 12891 9565 \r\n3 18708 15549 19962 9566 \r\n3 18594 18653 19542 9567 \r\n3 14451 10054 18649 9568 \r\n3 17425 19973 17124 9569 \r\n3 17283 5480 19871 9570 \r\n3 16172 9306 15759 9571 \r\n3 15093 10351 17640 9572 \r\n3 12193 18741 19609 9573 \r\n3 14956 14837 15695 9574 \r\n3 18693 14960 9025 9575 \r\n3 9861 14546 6986 9576 \r\n3 19425 8733 5330 9577 \r\n3 19855 11338 19960 9578 \r\n3 18290 18532 10513 9579 \r\n3 13013 6496 18457 9580 \r\n3 11410 17880 16634 9581 \r\n3 18050 15103 17990 9582 \r\n3 6281 16363 14606 9583 \r\n3 19974 19336 8045 9584 \r\n3 18898 14071 10287 9585 \r\n3 15411 19021 19348 9586 \r\n3 16236 12353 16240 9587 \r\n3 10701 8127 18924 9588 \r\n3 19664 8445 9272 9589 \r\n3 15242 17953 19966 9590 \r\n3 15233 18822 15736 9591 \r\n3 9993 11785 19787 9592 \r\n3 19741 14034 6045 9593 \r\n3 17680 19544 19934 9594 \r\n3 13015 18954 19227 9595 \r\n3 10031 8356 8244 9596 \r\n3 15373 7509 19770 9597 \r\n3 15033 19925 12572 9598 \r\n3 19975 12372 16065 9599 \r\n3 16359 19562 19826 9600 \r\n3 16277 19964 19710 9601 \r\n3 8939 18238 17372 9602 \r\n3 19479 14117 17215 9603 \r\n3 6790 8109 13437 9604 \r\n3 15210 17315 13951 9605 \r\n3 10844 11448 5234 9606 \r\n3 19780 15476 17379 9607 \r\n3 18451 12457 12349 9608 \r\n3 18965 12373 19976 9609 \r\n3 12995 7593 13334 9610 \r\n3 10344 19945 17806 9611 \r\n3 19977 19020 18082 9612 \r\n3 19440 8524 5282 9613 \r\n3 17103 13336 8974 9614 \r\n3 9890 14460 19527 9615 \r\n3 19429 8430 11185 9616 \r\n3 19226 12290 19711 9617 \r\n3 16074 15357 14729 9618 \r\n3 6765 16328 9032 9619 \r\n3 18359 14785 6005 9620 \r\n3 10413 17574 6577 9621 \r\n3 18158 18855 6335 9622 \r\n3 19978 17675 7244 9623 \r\n3 18677 18975 10655 9624 \r\n3 19979 10059 19617 9625 \r\n3 12178 8724 6150 9626 \r\n3 17366 14925 10208 9627 \r\n3 11963 18298 19938 9628 \r\n3 17890 9346 7290 9629 \r\n3 7080 12325 8042 9630 \r\n3 16413 19150 17203 9631 \r\n3 19864 19919 19928 9632 \r\n3 19831 18729 18208 9633 \r\n3 19913 10895 12570 9634 \r\n3 8921 19464 10715 9635 \r\n3 19603 11414 18303 9636 \r\n3 15416 12717 18560 9637 \r\n3 11656 9440 19277 9638 \r\n3 15622 16814 19091 9639 \r\n3 19980 18150 10865 9640 \r\n3 5648 13282 12284 9641 \r\n3 17763 15839 10706 9642 \r\n3 13038 11314 19523 9643 \r\n3 17921 15895 14491 9644 \r\n3 18363 19936 19478 9645 \r\n3 10268 13784 5230 9646 \r\n3 18909 13733 19301 9647 \r\n3 14010 6914 19954 9648 \r\n3 14704 5901 12213 9649 \r\n3 17516 17302 16043 9650 \r\n3 5421 19312 19230 9651 \r\n3 18210 16905 9796 9652 \r\n3 17212 17187 19495 9653 \r\n3 19976 19485 12683 9654 \r\n3 19223 7428 19258 9655 \r\n3 19981 14404 18270 9656 \r\n3 5335 19842 19794 9657 \r\n3 5569 17236 13948 9658 \r\n3 16470 11556 12314 9659 \r\n3 5016 14959 19844 9660 \r\n3 12192 11280 7032 9661 \r\n3 18982 19589 16874 9662 \r\n3 19148 17177 6144 9663 \r\n3 9985 14007 15608 9664 \r\n3 5652 19510 12855 9665 \r\n3 15983 15508 19183 9666 \r\n3 8518 19896 16576 9667 \r\n3 18433 11215 14923 9668 \r\n3 17368 6637 13685 9669 \r\n3 19982 19308 7974 9670 \r\n3 7802 8660 19949 9671 \r\n3 18902 13723 19793 9672 \r\n3 13311 17030 16354 9673 \r\n3 9777 6060 18046 9674 \r\n3 12278 12153 10066 9675 \r\n3 19983 19583 13135 9676 \r\n3 8497 16124 8959 9677 \r\n3 9895 19984 11452 9678 \r\n3 12440 19526 15202 9679 \r\n3 17412 17779 19708 9680 \r\n3 16440 11577 11540 9681 \r\n3 16309 19804 19759 9682 \r\n3 5969 18018 6063 9683 \r\n3 5461 18702 9221 9684 \r\n3 18921 19201 6292 9685 \r\n3 19145 16688 18300 9686 \r\n3 14490 6894 19110 9687 \r\n3 15953 13843 13083 9688 \r\n3 19099 15213 18892 9689 \r\n3 16192 9375 19397 9690 \r\n3 19575 17808 12098 9691 \r\n3 19186 6017 6742 9692 \r\n3 13982 12413 6004 9693 \r\n3 18684 9680 18580 9694 \r\n3 19930 5301 18364 9695 \r\n3 19985 15838 10990 9696 \r\n3 18348 13988 14500 9697 \r\n3 7634 18995 18776 9698 \r\n3 7926 11722 17099 9699 \r\n3 19980 11425 7675 9700 \r\n3 18002 16569 14305 9701 \r\n3 10934 14452 19356 9702 \r\n3 7799 6599 10229 9703 \r\n3 8785 5220 15663 9704 \r\n3 9278 15430 11937 9705 \r\n3 12969 19656 12497 9706 \r\n3 12998 6236 18167 9707 \r\n3 11435 12196 19777 9708 \r\n3 19895 13319 16689 9709 \r\n3 17666 19883 18559 9710 \r\n3 15378 19965 12871 9711 \r\n3 19680 19791 18329 9712 \r\n3 19952 15947 5508 9713 \r\n3 17525 9249 10872 9714 \r\n3 19827 18485 19939 9715 \r\n3 10346 19870 10055 9716 \r\n3 13900 8597 17385 9717 \r\n3 19986 19657 5955 9718 \r\n3 19987 16653 19983 9719 \r\n3 17481 13994 17863 9720 \r\n3 16990 19409 16944 9721 \r\n3 18330 5498 5205 9722 \r\n3 11291 13667 16967 9723 \r\n3 18138 19795 18302 9724 \r\n3 8099 15919 16419 9725 \r\n3 19806 16813 8734 9726 \r\n3 15056 16641 19516 9727 \r\n3 12459 19309 12141 9728 \r\n3 8608 7105 10498 9729 \r\n3 8073 19068 16274 9730 \r\n3 17445 17634 19955 9731 \r\n3 6799 19543 9632 9732 \r\n3 7364 16472 8192 9733 \r\n3 15778 9267 14322 9734 \r\n3 18826 12862 16539 9735 \r\n3 15075 17519 19923 9736 \r\n3 6720 11801 18979 9737 \r\n3 19739 19441 18592 9738 \r\n3 18143 18827 15909 9739 \r\n3 7310 5989 11754 9740 \r\n3 7124 19465 19398 9741 \r\n3 17111 19873 8933 9742 \r\n3 9307 14773 12453 9743 \r\n3 19215 19958 19988 9744 \r\n3 12987 11405 19951 9745 \r\n3 8447 19968 19704 9746 \r\n3 15616 13779 15491 9747 \r\n3 19626 19578 14600 9748 \r\n3 18993 14542 8735 9749 \r\n3 18125 18773 19989 9750 \r\n3 16673 15812 13983 9751 \r\n3 16617 8179 19528 9752 \r\n3 15866 19052 19008 9753 \r\n3 17322 13981 11670 9754 \r\n3 5358 17435 15721 9755 \r\n3 15965 19812 19990 9756 \r\n3 12972 9326 19907 9757 \r\n3 19769 10989 15565 9758 \r\n3 17755 12028 16362 9759 \r\n3 12312 19991 19003 9760 \r\n3 18726 17664 19765 9761 \r\n3 10409 18985 6394 9762 \r\n3 19614 11497 19688 9763 \r\n3 17424 11364 19973 9764 \r\n3 17011 19011 12038 9765 \r\n3 19910 19683 15647 9766 \r\n3 19992 16846 6352 9767 \r\n3 5742 14098 13112 9768 \r\n3 7530 18095 18466 9769 \r\n3 14732 14253 10261 9770 \r\n3 11438 10233 5861 9771 \r\n3 19991 8428 13748 9772 \r\n3 18753 8946 11565 9773 \r\n3 12025 16615 11266 9774 \r\n3 12997 19931 8658 9775 \r\n3 14130 18277 18626 9776 \r\n3 11502 5214 15704 9777 \r\n3 19920 12356 19677 9778 \r\n3 11264 19049 6776 9779 \r\n3 19875 5086 9222 9780 \r\n3 18425 19518 10789 9781 \r\n3 17118 18638 16494 9782 \r\n3 11805 18605 19847 9783 \r\n3 19948 19524 19639 9784 \r\n3 17842 14488 13630 9785 \r\n3 8987 19865 19038 9786 \r\n3 10316 19799 17729 9787 \r\n3 19878 18276 14129 9788 \r\n3 19722 8346 18361 9789 \r\n3 19832 19730 17530 9790 \r\n3 18718 13166 16736 9791 \r\n3 13139 19447 9853 9792 \r\n3 19993 19963 6353 9793 \r\n3 5293 15086 18071 9794 \r\n3 9107 19537 9754 9795 \r\n3 18388 8212 15682 9796 \r\n3 15366 15161 19174 9797 \r\n3 18948 19903 17829 9798 \r\n3 8287 18281 18403 9799 \r\n3 10694 11327 18267 9800 \r\n3 6942 19197 5174 9801 \r\n3 18837 16624 15440 9802 \r\n3 17660 16108 18939 9803 \r\n3 15100 17697 14398 9804 \r\n3 13751 11332 9778 9805 \r\n3 19532 14573 15311 9806 \r\n3 19813 18700 17523 9807 \r\n3 19881 19828 17623 9808 \r\n3 19101 19977 18956 9809 \r\n3 16890 19221 15846 9810 \r\n3 7736 19916 9255 9811 \r\n3 15620 19473 16858 9812 \r\n3 19645 19027 17672 9813 \r\n3 16767 11576 18606 9814 \r\n3 14772 19079 18582 9815 \r\n3 19971 18327 18689 9816 \r\n3 9229 19993 19735 9817 \r\n3 13172 17922 15594 9818 \r\n3 10860 19959 13737 9819 \r\n3 14202 7899 19944 9820 \r\n3 8522 19601 13809 9821 \r\n3 8279 19974 11271 9822 \r\n3 12531 18214 10464 9823 \r\n3 19175 17734 5502 9824 \r\n3 13778 13766 19978 9825 \r\n3 18356 14026 19522 9826 \r\n3 19872 9472 17726 9827 \r\n3 18671 16493 11567 9828 \r\n3 17005 16510 18297 9829 \r\n3 16350 10761 19994 9830 \r\n3 17981 9256 6931 9831 \r\n3 15335 18591 7659 9832 \r\n3 13880 12851 19989 9833 \r\n3 10899 13786 13458 9834 \r\n3 17613 18695 18780 9835 \r\n3 5696 15473 17327 9836 \r\n3 8883 16977 9265 9837 \r\n3 12204 19182 19835 9838 \r\n3 18719 7491 18479 9839 \r\n3 18527 18523 7884 9840 \r\n3 14517 17499 17861 9841 \r\n3 17552 5253 19412 9842 \r\n3 14400 18840 9415 9843 \r\n3 12755 11887 16102 9844 \r\n3 9465 16601 8861 9845 \r\n3 8490 14145 19880 9846 \r\n3 19644 16042 5769 9847 \r\n3 7237 12277 9320 9848 \r\n3 15160 19483 19942 9849 \r\n3 18242 17324 16947 9850 \r\n3 7196 19120 17226 9851 \r\n3 19775 13462 14319 9852 \r\n3 19018 19909 17451 9853 \r\n3 17757 18724 15193 9854 \r\n3 13794 17071 18204 9855 \r\n3 7075 7570 8341 9856 \r\n3 18908 7380 19690 9857 \r\n3 19515 17992 11509 9858 \r\n3 9014 16430 18076 9859 \r\n3 13264 18737 10897 9860 \r\n3 14879 10109 16410 9861 \r\n3 15757 13238 18003 9862 \r\n3 18343 19691 18183 9863 \r\n3 17228 19867 9728 9864 \r\n3 16335 13026 11352 9865 \r\n3 12258 16222 11836 9866 \r\n3 7314 17308 12877 9867 \r\n3 11200 18768 17032 9868 \r\n3 19904 13101 19969 9869 \r\n3 9874 19995 18205 9870 \r\n3 10177 19606 10264 9871 \r\n3 17167 10953 12888 9872 \r\n3 19996 14770 7225 9873 \r\n3 6202 12367 11982 9874 \r\n3 19392 19937 19771 9875 \r\n3 19755 12838 7701 9876 \r\n3 19287 16790 10622 9877 \r\n3 7315 11243 13662 9878 \r\n3 19774 16607 19305 9879 \r\n3 13919 13281 18806 9880 \r\n3 16196 19997 19988 9881 \r\n3 18873 19404 12971 9882 \r\n3 18314 19874 12486 9883 \r\n3 14766 19406 7140 9884 \r\n3 17183 10683 19779 9885 \r\n3 19130 18358 5077 9886 \r\n3 8070 18967 19825 9887 \r\n3 9357 19998 16529 9888 \r\n3 16528 19138 18647 9889 \r\n3 18487 19349 16473 9890 \r\n3 19899 16071 15956 9891 \r\n3 16261 10913 17951 9892 \r\n3 18393 14168 17062 9893 \r\n3 16257 15887 6467 9894 \r\n3 7716 7209 16409 9895 \r\n3 5235 15703 19979 9896 \r\n3 9473 16922 13819 9897 \r\n3 6848 19984 18446 9898 \r\n3 7233 19436 12939 9899 \r\n3 19992 17238 14466 9900 \r\n3 17638 6172 6520 9901 \r\n3 10277 10984 14285 9902 \r\n3 9210 6636 19651 9903 \r\n3 13731 16541 19999 9904 \r\n3 6719 7740 12243 9905 \r\n3 16007 19841 12524 9906 \r\n3 6481 6350 17832 9907 \r\n3 19922 19957 19571 9908 \r\n3 16598 14597 18511 9909 \r\n3 11017 18349 19203 9910 \r\n3 20000 19891 8720 9911 \r\n3 19972 17442 8819 9912 \r\n3 13032 19996 7680 9913 \r\n3 5189 19415 18227 9914 \r\n3 11998 18069 19344 9915 \r\n3 19692 10819 17528 9916 \r\n3 18566 18691 9056 9917 \r\n3 17132 19718 19577 9918 \r\n3 5485 5339 13532 9919 \r\n3 12299 19999 6501 9920 \r\n3 19294 7343 18876 9921 \r\n3 11731 19995 19967 9922 \r\n3 19669 13825 14437 9923 \r\n3 10768 5764 19987 9924 \r\n3 19681 6886 19432 9925 \r\n3 19171 5985 19829 9926 \r\n3 17910 19860 9116 9927 \r\n3 14138 19994 16746 9928 \r\n3 13410 11479 19982 9929 \r\n3 16704 20001 16997 9930 \r\n3 18483 9338 19970 9931 \r\n3 9184 5785 9991 9932 \r\n3 19007 19986 5353 9933 \r\n3 6957 18324 19280 9934 \r\n3 11828 10358 17869 9935 \r\n3 11755 17847 18723 9936 \r\n3 19998 17534 17845 9937 \r\n3 18782 8452 6935 9938 \r\n3 7030 19435 9845 9939 \r\n3 14847 19019 7838 9940 \r\n3 13265 5647 15223 9941 \r\n3 16532 14888 18201 9942 \r\n3 6938 11313 16968 9943 \r\n3 18036 5761 17733 9944 \r\n3 13286 19259 9995 9945 \r\n3 17737 17386 7627 9946 \r\n3 19139 19856 18432 9947 \r\n3 12775 10459 19889 9948 \r\n3 19149 20001 18037 9949 \r\n3 19696 17479 18136 9950 \r\n3 9599 17846 10345 9951 \r\n3 17044 19853 18998 9952 \r\n3 9389 16728 19340 9953 \r\n3 15011 19205 11837 9954 \r\n3 19727 19997 18390 9955 \r\n3 10805 14889 18049 9956 \r\n3 8354 5782 12677 9957 \r\n3 12682 16177 18964 9958 \r\n3 19521 18130 16610 9959 \r\n3 13482 5029 17988 9960 \r\n3 13402 19501 7338 9961 \r\n3 16418 19600 8100 9962 \r\n3 12005 5987 15151 9963 \r\n3 19354 19927 14027 9964 \r\n3 19743 10636 19508 9965 \r\n3 19990 12458 18054 9966 \r\n3 7561 19985 17708 9967 \r\n3 5925 14654 19729 9968 \r\n3 15642 18405 11362 9969 \r\n3 17796 14646 13314 9970 \r\n3 16270 19486 19975 9971 \r\n3 19699 16275 9864 9972 \r\n3 6280 13446 15113 9973 \r\n3 17195 19585 18464 9974 \r\n3 18736 19642 11568 9975 \r\n3 18106 5759 19637 9976 \r\n3 19547 16933 12516 9977 \r\n3 19981 9069 18537 9978 \r\n3 15944 6858 14292 9979 \r\n3 19706 16670 11238 9980 \r\n3 10885 16747 17800 9981 \r\n3 17614 5413 8241 9982 \r\n3 6579 19911 19820 9983 \r\n3 18958 16797 11987 9984 \r\n3 17760 12091 20000 9985 \r\n3 17378 7162 5441 9986 \r\n3 19926 17031 11260 9987 \r\n3 15770 9705 19360 9988 \r\n3 18943 7285 18239 9989 \r\n3 19819 7444 9880 9990 \r\n3 16943 17606 13799 9991 \r\n3 19044 15394 16370 9992 \r\n3 16308 15552 14273 9993 \r\n3 19627 17862 12926 9994 \r\n3 19463 7967 19420 9995 \r\n3 7963 18250 14692 9996 \r\n3 11827 12068 18565 9997 \r\n3 7954 18275 7886 9998 \r\n3 19176 11654 19605 9999 \r\n3 2671 5004 5003 0 \r\n3 550 5002 5004 0 \r\n3 2664 5003 5002 0 \r\n3 3329 5007 5006 1 \r\n3 3563 5005 5007 1 \r\n3 1518 5006 5005 1 \r\n3 3026 5010 5009 2 \r\n3 1563 5008 5010 2 \r\n3 4143 5009 5008 2 \r\n3 3783 5013 5012 3 \r\n3 4734 5011 5013 3 \r\n3 2082 5012 5011 3 \r\n3 2957 5016 5015 4 \r\n3 4682 5014 5016 4 \r\n3 4130 5015 5014 4 \r\n3 889 5019 5018 5 \r\n3 4403 5017 5019 5 \r\n3 444 5018 5017 5 \r\n3 4895 5022 5021 6 \r\n3 4540 5020 5022 6 \r\n3 4443 5021 5020 6 \r\n3 2302 5025 5024 7 \r\n3 4267 5023 5025 7 \r\n3 715 5024 5023 7 \r\n3 1818 5028 5027 8 \r\n3 3883 5026 5028 8 \r\n3 4226 5027 5026 8 \r\n3 451 5031 5030 9 \r\n3 1931 5029 5031 9 \r\n3 3414 5030 5029 9 \r\n3 3842 5034 5033 10 \r\n3 113 5032 5034 10 \r\n3 4964 5033 5032 10 \r\n3 954 5037 5036 11 \r\n3 2461 5035 5037 11 \r\n3 3556 5036 5035 11 \r\n3 2929 5040 5039 12 \r\n3 313 5038 5040 12 \r\n3 247 5039 5038 12 \r\n3 3192 5043 5042 13 \r\n3 4164 5041 5043 13 \r\n3 4609 5042 5041 13 \r\n3 3341 5046 5045 14 \r\n3 2545 5044 5046 14 \r\n3 2594 5045 5044 14 \r\n3 71 5049 5048 15 \r\n3 3654 5047 5049 15 \r\n3 4994 5048 5047 15 \r\n3 3640 5052 5051 16 \r\n3 3597 5050 5052 16 \r\n3 2484 5051 5050 16 \r\n3 639 5055 5054 17 \r\n3 2876 5053 5055 17 \r\n3 4421 5054 5053 17 \r\n3 1497 5058 5057 18 \r\n3 2977 5056 5058 18 \r\n3 1620 5057 5056 18 \r\n3 2743 5061 5060 19 \r\n3 3034 5059 5061 19 \r\n3 2540 5060 5059 19 \r\n3 516 5064 5063 20 \r\n3 2541 5062 5064 20 \r\n3 2113 5063 5062 20 \r\n3 4984 5067 5066 21 \r\n3 165 5065 5067 21 \r\n3 1441 5066 5065 21 \r\n3 456 5070 5069 22 \r\n3 3562 5068 5070 22 \r\n3 4370 5069 5068 22 \r\n3 1918 5073 5072 23 \r\n3 622 5071 5073 23 \r\n3 3893 5072 5071 23 \r\n3 2474 5076 5075 24 \r\n3 1358 5074 5076 24 \r\n3 83 5075 5074 24 \r\n3 1509 5079 5078 25 \r\n3 4654 5077 5079 25 \r\n3 3269 5078 5077 25 \r\n3 282 5082 5081 26 \r\n3 1954 5080 5082 26 \r\n3 2607 5081 5080 26 \r\n3 1827 5085 5084 27 \r\n3 1708 5083 5085 27 \r\n3 3231 5084 5083 27 \r\n3 1577 5088 5087 28 \r\n3 529 5086 5088 28 \r\n3 4675 5087 5086 28 \r\n3 609 5091 5090 29 \r\n3 4896 5089 5091 29 \r\n3 3275 5090 5089 29 \r\n3 4529 5094 5093 30 \r\n3 498 5092 5094 30 \r\n3 3724 5093 5092 30 \r\n3 1085 5097 5096 31 \r\n3 224 5095 5097 31 \r\n3 1115 5096 5095 31 \r\n3 685 5100 5099 32 \r\n3 2286 5098 5100 32 \r\n3 273 5099 5098 32 \r\n3 4635 5103 5102 33 \r\n3 1007 5101 5103 33 \r\n3 4372 5102 5101 33 \r\n3 1519 5106 5105 34 \r\n3 3785 5104 5106 34 \r\n3 3144 5105 5104 34 \r\n3 2761 5109 5108 35 \r\n3 2268 5107 5109 35 \r\n3 999 5108 5107 35 \r\n3 218 5112 5111 36 \r\n3 4473 5110 5112 36 \r\n3 4513 5111 5110 36 \r\n3 3088 5115 5114 37 \r\n3 3054 5113 5115 37 \r\n3 3113 5114 5113 37 \r\n3 2172 5118 5117 38 \r\n3 4234 5116 5118 38 \r\n3 4830 5117 5116 38 \r\n3 3960 5121 5120 39 \r\n3 3615 5119 5121 39 \r\n3 3421 5120 5119 39 \r\n3 2132 5124 5123 40 \r\n3 3625 5122 5124 40 \r\n3 349 5123 5122 40 \r\n3 337 5127 5126 41 \r\n3 2224 5125 5127 41 \r\n3 1492 5126 5125 41 \r\n3 3426 5130 5129 42 \r\n3 646 5128 5130 42 \r\n3 3550 5129 5128 42 \r\n3 3381 5133 5132 43 \r\n3 1934 5131 5133 43 \r\n3 1541 5132 5131 43 \r\n3 3648 5136 5135 44 \r\n3 4048 5134 5136 44 \r\n3 4695 5135 5134 44 \r\n3 4574 5139 5138 45 \r\n3 2726 5137 5139 45 \r\n3 1431 5138 5137 45 \r\n3 2078 5142 5141 46 \r\n3 347 5140 5142 46 \r\n3 2118 5141 5140 46 \r\n3 3033 5145 5144 47 \r\n3 2863 5143 5145 47 \r\n3 880 5144 5143 47 \r\n3 4117 5148 5147 48 \r\n3 1334 5146 5148 48 \r\n3 238 5147 5146 48 \r\n3 599 5151 5150 49 \r\n3 4708 5149 5151 49 \r\n3 2931 5150 5149 49 \r\n3 1894 5154 5153 50 \r\n3 3600 5152 5154 50 \r\n3 4924 5153 5152 50 \r\n3 398 5157 5156 51 \r\n3 3682 5155 5157 51 \r\n3 3830 5156 5155 51 \r\n3 3116 5160 5159 52 \r\n3 1187 5158 5160 52 \r\n3 1904 5159 5158 52 \r\n3 1202 5163 5162 53 \r\n3 1045 5161 5163 53 \r\n3 4110 5162 5161 53 \r\n3 3719 5166 5165 54 \r\n3 2097 5164 5166 54 \r\n3 1025 5165 5164 54 \r\n3 1777 5169 5168 55 \r\n3 1564 5167 5169 55 \r\n3 887 5168 5167 55 \r\n3 1998 5172 5171 56 \r\n3 2651 5170 5172 56 \r\n3 3453 5171 5170 56 \r\n3 4677 5175 5174 57 \r\n3 305 5173 5175 57 \r\n3 3912 5174 5173 57 \r\n3 1095 5178 5177 58 \r\n3 3283 5176 5178 58 \r\n3 4064 5177 5176 58 \r\n3 2690 5181 5180 59 \r\n3 3836 5179 5181 59 \r\n3 2275 5180 5179 59 \r\n3 4419 5184 5183 60 \r\n3 1948 5182 5184 60 \r\n3 2215 5183 5182 60 \r\n3 1680 5187 5186 61 \r\n3 1624 5185 5187 61 \r\n3 4105 5186 5185 61 \r\n3 2289 5190 5189 62 \r\n3 758 5188 5190 62 \r\n3 2159 5189 5188 62 \r\n3 3722 5193 5192 63 \r\n3 1113 5191 5193 63 \r\n3 2554 5192 5191 63 \r\n3 1509 5196 5195 64 \r\n3 2579 5194 5196 64 \r\n3 1834 5195 5194 64 \r\n3 3417 5199 5198 65 \r\n3 1256 5197 5199 65 \r\n3 1906 5198 5197 65 \r\n3 1117 5202 5201 66 \r\n3 2812 5200 5202 66 \r\n3 2816 5201 5200 66 \r\n3 727 5205 5204 67 \r\n3 3518 5203 5205 67 \r\n3 2848 5204 5203 67 \r\n3 4214 5208 5207 68 \r\n3 4142 5206 5208 68 \r\n3 4875 5207 5206 68 \r\n3 167 5211 5210 69 \r\n3 3959 5209 5211 69 \r\n3 2421 5210 5209 69 \r\n3 660 5214 5213 70 \r\n3 4399 5212 5214 70 \r\n3 122 5213 5212 70 \r\n3 431 5217 5216 71 \r\n3 3186 5215 5217 71 \r\n3 58 5216 5215 71 \r\n3 2496 5220 5219 72 \r\n3 3325 5218 5220 72 \r\n3 3566 5219 5218 72 \r\n3 355 5223 5222 73 \r\n3 3456 5221 5223 73 \r\n3 1681 5222 5221 73 \r\n3 4666 5226 5225 74 \r\n3 4216 5224 5226 74 \r\n3 882 5225 5224 74 \r\n3 302 5229 5228 75 \r\n3 744 5227 5229 75 \r\n3 1505 5228 5227 75 \r\n3 1414 5232 5231 76 \r\n3 3986 5230 5232 76 \r\n3 4225 5231 5230 76 \r\n3 2628 5235 5234 77 \r\n3 3970 5233 5235 77 \r\n3 3525 5234 5233 77 \r\n3 2559 5238 5237 78 \r\n3 1222 5236 5238 78 \r\n3 3368 5237 5236 78 \r\n3 4483 5241 5240 79 \r\n3 46 5239 5241 79 \r\n3 255 5240 5239 79 \r\n3 3314 5244 5243 80 \r\n3 4334 5242 5244 80 \r\n3 142 5243 5242 80 \r\n3 1091 5247 5246 81 \r\n3 4033 5245 5247 81 \r\n3 2956 5246 5245 81 \r\n3 3409 5250 5249 82 \r\n3 4886 5248 5250 82 \r\n3 3587 5249 5248 82 \r\n3 2728 5253 5252 83 \r\n3 212 5251 5253 83 \r\n3 2724 5252 5251 83 \r\n3 3429 5256 5255 84 \r\n3 1125 5254 5256 84 \r\n3 4779 5255 5254 84 \r\n3 4052 5259 5258 85 \r\n3 2900 5257 5259 85 \r\n3 1920 5258 5257 85 \r\n3 3100 5262 5261 86 \r\n3 4302 5260 5262 86 \r\n3 3783 5261 5260 86 \r\n3 1189 5265 5264 87 \r\n3 16 5263 5265 87 \r\n3 4991 5264 5263 87 \r\n3 1814 5268 5267 88 \r\n3 3503 5266 5268 88 \r\n3 3928 5267 5266 88 \r\n3 2245 5271 5270 89 \r\n3 628 5269 5271 89 \r\n3 1438 5270 5269 89 \r\n3 2965 5274 5273 90 \r\n3 2895 5272 5274 90 \r\n3 3973 5273 5272 90 \r\n3 2649 5277 5276 91 \r\n3 4516 5275 5277 91 \r\n3 856 5276 5275 91 \r\n3 3653 5280 5279 92 \r\n3 747 5278 5280 92 \r\n3 383 5279 5278 92 \r\n3 3267 5283 5282 93 \r\n3 1481 5281 5283 93 \r\n3 2231 5282 5281 93 \r\n3 4192 5286 5285 94 \r\n3 2589 5284 5286 94 \r\n3 738 5285 5284 94 \r\n3 3095 5289 5288 95 \r\n3 606 5287 5289 95 \r\n3 2993 5288 5287 95 \r\n3 342 5292 5291 96 \r\n3 4366 5290 5292 96 \r\n3 1403 5291 5290 96 \r\n3 4374 5295 5294 97 \r\n3 140 5293 5295 97 \r\n3 3464 5294 5293 97 \r\n3 4162 5298 5297 98 \r\n3 4816 5296 5298 98 \r\n3 3769 5297 5296 98 \r\n3 4151 5301 5300 99 \r\n3 4579 5299 5301 99 \r\n3 2573 5300 5299 99 \r\n3 254 5304 5303 100 \r\n3 3225 5302 5304 100 \r\n3 4712 5303 5302 100 \r\n3 2942 5307 5306 101 \r\n3 4005 5305 5307 101 \r\n3 4333 5306 5305 101 \r\n3 1951 5310 5309 102 \r\n3 111 5308 5310 102 \r\n3 3210 5309 5308 102 \r\n3 1415 5313 5312 103 \r\n3 1623 5311 5313 103 \r\n3 119 5312 5311 103 \r\n3 1090 5316 5315 104 \r\n3 640 5314 5316 104 \r\n3 681 5315 5314 104 \r\n3 471 5319 5318 105 \r\n3 4406 5317 5319 105 \r\n3 4490 5318 5317 105 \r\n3 301 5322 5321 106 \r\n3 942 5320 5322 106 \r\n3 534 5321 5320 106 \r\n3 4648 5325 5324 107 \r\n3 3197 5323 5325 107 \r\n3 1947 5324 5323 107 \r\n3 3490 5328 5327 108 \r\n3 1986 5326 5328 108 \r\n3 587 5327 5326 108 \r\n3 2424 5331 5330 109 \r\n3 2719 5329 5331 109 \r\n3 4371 5330 5329 109 \r\n3 1760 5334 5333 110 \r\n3 448 5332 5334 110 \r\n3 3136 5333 5332 110 \r\n3 848 5337 5336 111 \r\n3 4046 5335 5337 111 \r\n3 3839 5336 5335 111 \r\n3 1221 5340 5339 112 \r\n3 1637 5338 5340 112 \r\n3 3060 5339 5338 112 \r\n3 2842 5343 5342 113 \r\n3 4403 5341 5343 113 \r\n3 4711 5342 5341 113 \r\n3 1530 5346 5345 114 \r\n3 200 5344 5346 114 \r\n3 3482 5345 5344 114 \r\n3 376 5349 5348 115 \r\n3 1950 5347 5349 115 \r\n3 2674 5348 5347 115 \r\n3 2820 5352 5351 116 \r\n3 2028 5350 5352 116 \r\n3 3240 5351 5350 116 \r\n3 2596 5355 5354 117 \r\n3 1280 5353 5355 117 \r\n3 4827 5354 5353 117 \r\n3 1613 5358 5357 118 \r\n3 4522 5356 5358 118 \r\n3 4615 5357 5356 118 \r\n3 3889 5361 5360 119 \r\n3 1576 5359 5361 119 \r\n3 1633 5360 5359 119 \r\n3 416 5364 5363 120 \r\n3 4683 5362 5364 120 \r\n3 3647 5363 5362 120 \r\n3 2128 5367 5366 121 \r\n3 970 5365 5367 121 \r\n3 17 5366 5365 121 \r\n3 1019 5370 5369 122 \r\n3 1584 5368 5370 122 \r\n3 464 5369 5368 122 \r\n3 2766 5373 5372 123 \r\n3 4673 5371 5373 123 \r\n3 354 5372 5371 123 \r\n3 420 5376 5375 124 \r\n3 320 5374 5376 124 \r\n3 3467 5375 5374 124 \r\n3 616 5379 5378 125 \r\n3 3593 5377 5379 125 \r\n3 261 5378 5377 125 \r\n3 4760 5382 5381 126 \r\n3 1967 5380 5382 126 \r\n3 1344 5381 5380 126 \r\n3 1604 5385 5384 127 \r\n3 3339 5383 5385 127 \r\n3 1790 5384 5383 127 \r\n3 1185 5388 5387 128 \r\n3 4545 5386 5388 128 \r\n3 4141 5387 5386 128 \r\n3 3937 5391 5390 129 \r\n3 3106 5389 5391 129 \r\n3 29 5390 5389 129 \r\n3 1895 5394 5393 130 \r\n3 4473 5392 5394 130 \r\n3 4493 5393 5392 130 \r\n3 2602 5397 5396 131 \r\n3 2532 5395 5397 131 \r\n3 3757 5396 5395 131 \r\n3 1130 5400 5399 132 \r\n3 4859 5398 5400 132 \r\n3 1401 5399 5398 132 \r\n3 3988 5403 5402 133 \r\n3 621 5401 5403 133 \r\n3 151 5402 5401 133 \r\n3 2532 5406 5405 134 \r\n3 4771 5404 5406 134 \r\n3 2359 5405 5404 134 \r\n3 1957 5409 5408 135 \r\n3 1288 5407 5409 135 \r\n3 442 5408 5407 135 \r\n3 1936 5412 5411 136 \r\n3 292 5410 5412 136 \r\n3 2697 5411 5410 136 \r\n3 708 5415 5414 137 \r\n3 1754 5413 5415 137 \r\n3 2999 5414 5413 137 \r\n3 4866 5418 5417 138 \r\n3 2604 5416 5418 138 \r\n3 2701 5417 5416 138 \r\n3 3150 5421 5420 139 \r\n3 47 5419 5421 139 \r\n3 2862 5420 5419 139 \r\n3 956 5424 5423 140 \r\n3 3121 5422 5424 140 \r\n3 1919 5423 5422 140 \r\n3 3040 5427 5426 141 \r\n3 1043 5425 5427 141 \r\n3 3012 5426 5425 141 \r\n3 4748 5430 5429 142 \r\n3 406 5428 5430 142 \r\n3 2816 5429 5428 142 \r\n3 894 5433 5432 143 \r\n3 3480 5431 5433 143 \r\n3 4849 5432 5431 143 \r\n3 3212 5436 5435 144 \r\n3 201 5434 5436 144 \r\n3 1556 5435 5434 144 \r\n3 2886 5439 5438 145 \r\n3 4245 5437 5439 145 \r\n3 475 5438 5437 145 \r\n3 2299 5442 5441 146 \r\n3 1674 5440 5442 146 \r\n3 2920 5441 5440 146 \r\n3 4240 5445 5444 147 \r\n3 3817 5443 5445 147 \r\n3 1084 5444 5443 147 \r\n3 4372 5448 5447 148 \r\n3 381 5446 5448 148 \r\n3 2452 5447 5446 148 \r\n3 3447 5451 5450 149 \r\n3 1422 5449 5451 149 \r\n3 1504 5450 5449 149 \r\n3 3049 5454 5453 150 \r\n3 250 5452 5454 150 \r\n3 1211 5453 5452 150 \r\n3 4861 5457 5456 151 \r\n3 3161 5455 5457 151 \r\n3 3037 5456 5455 151 \r\n3 3753 5460 5459 152 \r\n3 1272 5458 5460 152 \r\n3 4766 5459 5458 152 \r\n3 2552 5463 5462 153 \r\n3 4098 5461 5463 153 \r\n3 4646 5462 5461 153 \r\n3 2837 5466 5465 154 \r\n3 538 5464 5466 154 \r\n3 1257 5465 5464 154 \r\n3 2537 5469 5468 155 \r\n3 2204 5467 5469 155 \r\n3 4715 5468 5467 155 \r\n3 3103 5472 5471 156 \r\n3 826 5470 5472 156 \r\n3 4401 5471 5470 156 \r\n3 4610 5475 5474 157 \r\n3 4096 5473 5475 157 \r\n3 1078 5474 5473 157 \r\n3 3833 5477 5476 158 \r\n3 4866 5417 5477 158 \r\n3 2701 5476 5417 158 \r\n3 819 5480 5479 159 \r\n3 305 5478 5480 159 \r\n3 3499 5479 5478 159 \r\n3 2940 5483 5482 160 \r\n3 1370 5481 5483 160 \r\n3 515 5482 5481 160 \r\n3 2647 5486 5485 161 \r\n3 1482 5484 5486 161 \r\n3 1221 5485 5484 161 \r\n3 3886 5489 5488 162 \r\n3 4056 5487 5489 162 \r\n3 3596 5488 5487 162 \r\n3 3638 5492 5491 163 \r\n3 4000 5490 5492 163 \r\n3 1897 5491 5490 163 \r\n3 594 5495 5494 164 \r\n3 4770 5493 5495 164 \r\n3 2256 5494 5493 164 \r\n3 3518 5498 5497 165 \r\n3 2117 5496 5498 165 \r\n3 2096 5497 5496 165 \r\n3 4311 5501 5500 166 \r\n3 239 5499 5501 166 \r\n3 245 5500 5499 166 \r\n3 2162 5504 5503 167 \r\n3 394 5502 5504 167 \r\n3 575 5503 5502 167 \r\n3 1114 5507 5506 168 \r\n3 4422 5505 5507 168 \r\n3 2026 5506 5505 168 \r\n3 4358 5510 5509 169 \r\n3 2598 5508 5510 169 \r\n3 3046 5509 5508 169 \r\n3 3698 5513 5512 170 \r\n3 4029 5511 5513 170 \r\n3 4629 5512 5511 170 \r\n3 4582 5516 5515 171 \r\n3 4625 5514 5516 171 \r\n3 3441 5515 5514 171 \r\n3 1569 5519 5518 172 \r\n3 4237 5517 5519 172 \r\n3 2011 5518 5517 172 \r\n3 3208 5522 5521 173 \r\n3 3962 5520 5522 173 \r\n3 4938 5521 5520 173 \r\n3 3088 5525 5524 174 \r\n3 2681 5523 5525 174 \r\n3 4265 5524 5523 174 \r\n3 1471 5528 5527 175 \r\n3 3925 5526 5528 175 \r\n3 3611 5527 5526 175 \r\n3 1852 5531 5530 176 \r\n3 1856 5529 5531 176 \r\n3 4939 5530 5529 176 \r\n3 3251 5534 5533 177 \r\n3 2586 5532 5534 177 \r\n3 3214 5533 5532 177 \r\n3 1173 5537 5536 178 \r\n3 1672 5535 5537 178 \r\n3 2334 5536 5535 178 \r\n3 2200 5540 5539 179 \r\n3 1929 5538 5540 179 \r\n3 1851 5539 5538 179 \r\n3 3462 5542 5541 180 \r\n3 71 5048 5542 180 \r\n3 4994 5541 5048 180 \r\n3 125 5545 5544 181 \r\n3 2524 5543 5545 181 \r\n3 3915 5544 5543 181 \r\n3 4018 5548 5547 182 \r\n3 2855 5546 5548 182 \r\n3 1622 5547 5546 182 \r\n3 2595 5551 5550 183 \r\n3 4967 5549 5551 183 \r\n3 4973 5550 5549 183 \r\n3 759 5554 5553 184 \r\n3 529 5552 5554 184 \r\n3 1838 5553 5552 184 \r\n3 3755 5557 5556 185 \r\n3 1082 5555 5557 185 \r\n3 2047 5556 5555 185 \r\n3 2882 5560 5559 186 \r\n3 4730 5558 5560 186 \r\n3 1491 5559 5558 186 \r\n3 1603 5563 5562 187 \r\n3 3485 5561 5563 187 \r\n3 4348 5562 5561 187 \r\n3 2329 5566 5565 188 \r\n3 149 5564 5566 188 \r\n3 4396 5565 5564 188 \r\n3 4308 5569 5568 189 \r\n3 3659 5567 5569 189 \r\n3 3270 5568 5567 189 \r\n3 4768 5572 5571 190 \r\n3 1164 5570 5572 190 \r\n3 1927 5571 5570 190 \r\n3 165 5575 5574 191 \r\n3 4571 5573 5575 191 \r\n3 414 5574 5573 191 \r\n3 3974 5578 5577 192 \r\n3 204 5576 5578 192 \r\n3 1491 5577 5576 192 \r\n3 3836 5581 5580 193 \r\n3 1345 5579 5581 193 \r\n3 3290 5580 5579 193 \r\n3 606 5583 5287 194 \r\n3 1836 5582 5583 194 \r\n3 2993 5287 5582 194 \r\n3 3010 5586 5585 195 \r\n3 2032 5584 5586 195 \r\n3 4740 5585 5584 195 \r\n3 4392 5589 5588 196 \r\n3 145 5587 5589 196 \r\n3 3187 5588 5587 196 \r\n3 4986 5592 5591 197 \r\n3 2769 5590 5592 197 \r\n3 2335 5591 5590 197 \r\n3 2463 5595 5594 198 \r\n3 3125 5593 5595 198 \r\n3 4498 5594 5593 198 \r\n3 87 5598 5597 199 \r\n3 2288 5596 5598 199 \r\n3 3862 5597 5596 199 \r\n3 994 5601 5600 200 \r\n3 4068 5599 5601 200 \r\n3 3306 5600 5599 200 \r\n3 4470 5604 5603 201 \r\n3 1668 5602 5604 201 \r\n3 2080 5603 5602 201 \r\n3 2192 5607 5606 202 \r\n3 2525 5605 5607 202 \r\n3 3774 5606 5605 202 \r\n3 1152 5610 5609 203 \r\n3 2316 5608 5610 203 \r\n3 2896 5609 5608 203 \r\n3 707 5613 5612 204 \r\n3 3544 5611 5613 204 \r\n3 4031 5612 5611 204 \r\n3 619 5616 5615 205 \r\n3 3891 5614 5616 205 \r\n3 4301 5615 5614 205 \r\n3 4127 5619 5618 206 \r\n3 1050 5617 5619 206 \r\n3 2125 5618 5617 206 \r\n3 2330 5622 5621 207 \r\n3 4109 5620 5622 207 \r\n3 743 5621 5620 207 \r\n3 200 5625 5624 208 \r\n3 1926 5623 5625 208 \r\n3 4717 5624 5623 208 \r\n3 2093 5628 5627 209 \r\n3 3940 5626 5628 209 \r\n3 3052 5627 5626 209 \r\n3 2101 5631 5630 210 \r\n3 1505 5629 5631 210 \r\n3 389 5630 5629 210 \r\n3 1694 5634 5633 211 \r\n3 899 5632 5634 211 \r\n3 1313 5633 5632 211 \r\n3 4266 5637 5636 212 \r\n3 3247 5635 5637 212 \r\n3 167 5636 5635 212 \r\n3 4164 5640 5639 213 \r\n3 995 5638 5640 213 \r\n3 2083 5639 5638 213 \r\n3 486 5643 5642 214 \r\n3 3856 5641 5643 214 \r\n3 4447 5642 5641 214 \r\n3 249 5646 5645 215 \r\n3 214 5644 5646 215 \r\n3 697 5645 5644 215 \r\n3 4129 5649 5648 216 \r\n3 3153 5647 5649 216 \r\n3 3534 5648 5647 216 \r\n3 3256 5652 5651 217 \r\n3 988 5650 5652 217 \r\n3 31 5651 5650 217 \r\n3 3476 5655 5654 218 \r\n3 3717 5653 5655 218 \r\n3 4616 5654 5653 218 \r\n3 3012 5658 5657 219 \r\n3 4284 5656 5658 219 \r\n3 221 5657 5656 219 \r\n3 1810 5661 5660 220 \r\n3 397 5659 5661 220 \r\n3 3967 5660 5659 220 \r\n3 2168 5664 5663 221 \r\n3 3729 5662 5664 221 \r\n3 972 5663 5662 221 \r\n3 3651 5667 5666 222 \r\n3 3447 5665 5667 222 \r\n3 721 5666 5665 222 \r\n3 1468 5670 5669 223 \r\n3 4992 5668 5670 223 \r\n3 1363 5669 5668 223 \r\n3 3103 5672 5472 224 \r\n3 2215 5671 5672 224 \r\n3 826 5472 5671 224 \r\n3 4978 5675 5674 225 \r\n3 920 5673 5675 225 \r\n3 3343 5674 5673 225 \r\n3 4626 5677 5676 226 \r\n3 3596 5487 5677 226 \r\n3 4056 5676 5487 226 \r\n3 4592 5680 5679 227 \r\n3 4297 5678 5680 227 \r\n3 2566 5679 5678 227 \r\n3 3512 5683 5682 228 \r\n3 1394 5681 5683 228 \r\n3 3572 5682 5681 228 \r\n3 2522 5686 5685 229 \r\n3 4215 5684 5686 229 \r\n3 2099 5685 5684 229 \r\n3 183 5689 5688 230 \r\n3 2810 5687 5689 230 \r\n3 253 5688 5687 230 \r\n3 2141 5692 5691 231 \r\n3 2562 5690 5692 231 \r\n3 4264 5691 5690 231 \r\n3 4247 5695 5694 232 \r\n3 2314 5693 5695 232 \r\n3 3300 5694 5693 232 \r\n3 1834 5194 5697 233 \r\n3 2579 5696 5194 233 \r\n3 4695 5697 5696 233 \r\n3 1957 5700 5699 234 \r\n3 1065 5698 5700 234 \r\n3 4980 5699 5698 234 \r\n3 3397 5703 5702 235 \r\n3 186 5701 5703 235 \r\n3 1329 5702 5701 235 \r\n3 1534 5706 5705 236 \r\n3 626 5704 5706 236 \r\n3 724 5705 5704 236 \r\n3 2936 5709 5708 237 \r\n3 2221 5707 5709 237 \r\n3 2055 5708 5707 237 \r\n3 2620 5712 5711 238 \r\n3 577 5710 5712 238 \r\n3 2302 5711 5710 238 \r\n3 468 5715 5714 239 \r\n3 4233 5713 5715 239 \r\n3 3939 5714 5713 239 \r\n3 1023 5718 5717 240 \r\n3 3147 5716 5718 240 \r\n3 306 5717 5716 240 \r\n3 2138 5721 5720 241 \r\n3 816 5719 5721 241 \r\n3 4347 5720 5719 241 \r\n3 1353 5723 5722 242 \r\n3 1577 5087 5723 242 \r\n3 4675 5722 5087 242 \r\n3 445 5726 5725 243 \r\n3 1110 5724 5726 243 \r\n3 817 5725 5724 243 \r\n3 3558 5729 5728 244 \r\n3 3685 5727 5729 244 \r\n3 2175 5728 5727 244 \r\n3 3994 5732 5731 245 \r\n3 2938 5730 5732 245 \r\n3 4219 5731 5730 245 \r\n3 4298 5735 5734 246 \r\n3 3744 5733 5735 246 \r\n3 4019 5734 5733 246 \r\n3 165 5067 5737 247 \r\n3 4984 5736 5067 247 \r\n3 479 5737 5736 247 \r\n3 4931 5740 5739 248 \r\n3 1318 5738 5740 248 \r\n3 1051 5739 5738 248 \r\n3 3240 5743 5742 249 \r\n3 4257 5741 5743 249 \r\n3 870 5742 5741 249 \r\n3 3674 5746 5745 250 \r\n3 4103 5744 5746 250 \r\n3 2511 5745 5744 250 \r\n3 1348 5749 5748 251 \r\n3 936 5747 5749 251 \r\n3 2404 5748 5747 251 \r\n3 2537 5752 5751 252 \r\n3 4744 5750 5752 252 \r\n3 1060 5751 5750 252 \r\n3 3709 5755 5754 253 \r\n3 326 5753 5755 253 \r\n3 164 5754 5753 253 \r\n3 1354 5758 5757 254 \r\n3 980 5756 5758 254 \r\n3 656 5757 5756 254 \r\n3 2336 5761 5760 255 \r\n3 347 5759 5761 255 \r\n3 1819 5760 5759 255 \r\n3 544 5764 5763 256 \r\n3 1632 5762 5764 256 \r\n3 2614 5763 5762 256 \r\n3 3815 5767 5766 257 \r\n3 2845 5765 5767 257 \r\n3 4407 5766 5765 257 \r\n3 1132 5770 5769 258 \r\n3 2398 5768 5770 258 \r\n3 2788 5769 5768 258 \r\n3 3238 5773 5772 259 \r\n3 4982 5771 5773 259 \r\n3 4190 5772 5771 259 \r\n3 1004 5776 5775 260 \r\n3 2499 5774 5776 260 \r\n3 3483 5775 5774 260 \r\n3 4394 5779 5778 261 \r\n3 2948 5777 5779 261 \r\n3 2958 5778 5777 261 \r\n3 4891 5782 5781 262 \r\n3 3948 5780 5782 262 \r\n3 1098 5781 5780 262 \r\n3 1803 5785 5784 263 \r\n3 4640 5783 5785 263 \r\n3 3259 5784 5783 263 \r\n3 2796 5788 5787 264 \r\n3 1177 5786 5788 264 \r\n3 1273 5787 5786 264 \r\n3 2801 5791 5790 265 \r\n3 1205 5789 5791 265 \r\n3 3537 5790 5789 265 \r\n3 2579 5794 5793 266 \r\n3 3269 5792 5794 266 \r\n3 3182 5793 5792 266 \r\n3 4184 5797 5796 267 \r\n3 94 5795 5797 267 \r\n3 3321 5796 5795 267 \r\n3 1270 5800 5799 268 \r\n3 3947 5798 5800 268 \r\n3 2053 5799 5798 268 \r\n3 107 5803 5802 269 \r\n3 4086 5801 5803 269 \r\n3 4485 5802 5801 269 \r\n3 2734 5806 5805 270 \r\n3 3546 5804 5806 270 \r\n3 1151 5805 5804 270 \r\n3 3731 5809 5808 271 \r\n3 502 5807 5809 271 \r\n3 3501 5808 5807 271 \r\n3 1355 5812 5811 272 \r\n3 1057 5810 5812 272 \r\n3 1152 5811 5810 272 \r\n3 711 5815 5814 273 \r\n3 4650 5813 5815 273 \r\n3 3638 5814 5813 273 \r\n3 56 5818 5817 274 \r\n3 2605 5816 5818 274 \r\n3 1326 5817 5816 274 \r\n3 2082 5821 5820 275 \r\n3 1307 5819 5821 275 \r\n3 910 5820 5819 275 \r\n3 177 5824 5823 276 \r\n3 630 5822 5824 276 \r\n3 3141 5823 5822 276 \r\n3 4202 5827 5826 277 \r\n3 4548 5825 5827 277 \r\n3 3539 5826 5825 277 \r\n3 3644 5830 5829 278 \r\n3 3771 5828 5830 278 \r\n3 3409 5829 5828 278 \r\n3 2646 5833 5832 279 \r\n3 1283 5831 5833 279 \r\n3 3791 5832 5831 279 \r\n3 2090 5836 5835 280 \r\n3 3328 5834 5836 280 \r\n3 1651 5835 5834 280 \r\n3 3096 5839 5838 281 \r\n3 1831 5837 5839 281 \r\n3 1181 5838 5837 281 \r\n3 3750 5842 5841 282 \r\n3 790 5840 5842 282 \r\n3 638 5841 5840 282 \r\n3 4228 5845 5844 283 \r\n3 1730 5843 5845 283 \r\n3 4758 5844 5843 283 \r\n3 2281 5848 5847 284 \r\n3 4668 5846 5848 284 \r\n3 4808 5847 5846 284 \r\n3 3004 5851 5850 285 \r\n3 3852 5849 5851 285 \r\n3 2347 5850 5849 285 \r\n3 1074 5854 5853 286 \r\n3 1021 5852 5854 286 \r\n3 2290 5853 5852 286 \r\n3 624 5857 5856 287 \r\n3 3816 5855 5857 287 \r\n3 4967 5856 5855 287 \r\n3 3631 5860 5859 288 \r\n3 761 5858 5860 288 \r\n3 1306 5859 5858 288 \r\n3 2188 5863 5862 289 \r\n3 2530 5861 5863 289 \r\n3 3468 5862 5861 289 \r\n3 3679 5866 5865 290 \r\n3 1440 5864 5866 290 \r\n3 1705 5865 5864 290 \r\n3 3216 5869 5868 291 \r\n3 2266 5867 5869 291 \r\n3 2869 5868 5867 291 \r\n3 3954 5872 5871 292 \r\n3 2696 5870 5872 292 \r\n3 4396 5871 5870 292 \r\n3 1339 5875 5874 293 \r\n3 3333 5873 5875 293 \r\n3 4715 5874 5873 293 \r\n3 3887 5878 5877 294 \r\n3 2645 5876 5878 294 \r\n3 4865 5877 5876 294 \r\n3 3749 5881 5880 295 \r\n3 217 5879 5881 295 \r\n3 992 5880 5879 295 \r\n3 4949 5884 5883 296 \r\n3 1359 5882 5884 296 \r\n3 787 5883 5882 296 \r\n3 1039 5887 5886 297 \r\n3 4660 5885 5887 297 \r\n3 1275 5886 5885 297 \r\n3 4395 5889 5888 298 \r\n3 2958 5777 5889 298 \r\n3 2948 5888 5777 298 \r\n3 2448 5892 5891 299 \r\n3 3294 5890 5892 299 \r\n3 4619 5891 5890 299 \r\n3 19 5895 5894 300 \r\n3 3274 5893 5895 300 \r\n3 1436 5894 5893 300 \r\n3 489 5898 5897 301 \r\n3 950 5896 5898 301 \r\n3 244 5897 5896 301 \r\n3 2465 5901 5900 302 \r\n3 2774 5899 5901 302 \r\n3 4926 5900 5899 302 \r\n3 4639 5904 5903 303 \r\n3 2992 5902 5904 303 \r\n3 12 5903 5902 303 \r\n3 4210 5907 5906 304 \r\n3 917 5905 5907 304 \r\n3 3652 5906 5905 304 \r\n3 2557 5910 5909 305 \r\n3 3312 5908 5910 305 \r\n3 2769 5909 5908 305 \r\n3 3469 5913 5912 306 \r\n3 4678 5911 5913 306 \r\n3 2049 5912 5911 306 \r\n3 3246 5916 5915 307 \r\n3 625 5914 5916 307 \r\n3 4787 5915 5914 307 \r\n3 441 5919 5918 308 \r\n3 13 5917 5919 308 \r\n3 1316 5918 5917 308 \r\n3 687 5922 5921 309 \r\n3 2875 5920 5922 309 \r\n3 1155 5921 5920 309 \r\n3 714 5925 5924 310 \r\n3 2971 5923 5925 310 \r\n3 2114 5924 5923 310 \r\n3 1824 5928 5927 311 \r\n3 2118 5926 5928 311 \r\n3 3855 5927 5926 311 \r\n3 3705 5931 5930 312 \r\n3 861 5929 5931 312 \r\n3 1316 5930 5929 312 \r\n3 4732 5934 5933 313 \r\n3 1303 5932 5934 313 \r\n3 2877 5933 5932 313 \r\n3 1237 5937 5936 314 \r\n3 523 5935 5937 314 \r\n3 1341 5936 5935 314 \r\n3 3626 5940 5939 315 \r\n3 2706 5938 5940 315 \r\n3 1233 5939 5938 315 \r\n3 4779 5254 5942 316 \r\n3 1125 5941 5254 316 \r\n3 1826 5942 5941 316 \r\n3 1334 5945 5944 317 \r\n3 1292 5943 5945 317 \r\n3 4981 5944 5943 317 \r\n3 3821 5948 5947 318 \r\n3 4737 5946 5948 318 \r\n3 3279 5947 5946 318 \r\n3 2794 5951 5950 319 \r\n3 2418 5949 5951 319 \r\n3 3197 5950 5949 319 \r\n3 3368 5954 5953 320 \r\n3 3731 5952 5954 320 \r\n3 593 5953 5952 320 \r\n3 2801 5957 5956 321 \r\n3 4827 5955 5957 321 \r\n3 3548 5956 5955 321 \r\n3 3486 5960 5959 322 \r\n3 3728 5958 5960 322 \r\n3 3549 5959 5958 322 \r\n3 1901 5963 5962 323 \r\n3 3746 5961 5963 323 \r\n3 312 5962 5961 323 \r\n3 1197 5966 5965 324 \r\n3 457 5964 5966 324 \r\n3 2721 5965 5964 324 \r\n3 3152 5969 5968 325 \r\n3 1126 5967 5969 325 \r\n3 3188 5968 5967 325 \r\n3 4454 5972 5971 326 \r\n3 2006 5970 5972 326 \r\n3 1470 5971 5970 326 \r\n3 4912 5975 5974 327 \r\n3 4741 5973 5975 327 \r\n3 4032 5974 5973 327 \r\n3 202 5978 5977 328 \r\n3 410 5976 5978 328 \r\n3 1312 5977 5976 328 \r\n3 703 5981 5980 329 \r\n3 652 5979 5981 329 \r\n3 42 5980 5979 329 \r\n3 3875 5984 5983 330 \r\n3 3248 5982 5984 330 \r\n3 3250 5983 5982 330 \r\n3 2765 5987 5986 331 \r\n3 3632 5985 5987 331 \r\n3 4256 5986 5985 331 \r\n3 2978 5990 5989 332 \r\n3 1181 5988 5990 332 \r\n3 490 5989 5988 332 \r\n3 61 5993 5992 333 \r\n3 3868 5991 5993 333 \r\n3 4977 5992 5991 333 \r\n3 2668 5996 5995 334 \r\n3 1334 5994 5996 334 \r\n3 2417 5995 5994 334 \r\n3 1333 5999 5998 335 \r\n3 4554 5997 5999 335 \r\n3 2380 5998 5997 335 \r\n3 243 6002 6001 336 \r\n3 3870 6000 6002 336 \r\n3 906 6001 6000 336 \r\n3 2095 6005 6004 337 \r\n3 3176 6003 6005 337 \r\n3 642 6004 6003 337 \r\n3 4204 6008 6007 338 \r\n3 1259 6006 6008 338 \r\n3 2952 6007 6006 338 \r\n3 3771 6011 6010 339 \r\n3 3297 6009 6011 339 \r\n3 1993 6010 6009 339 \r\n3 4045 6014 6013 340 \r\n3 934 6012 6014 340 \r\n3 3543 6013 6012 340 \r\n3 4471 6017 6016 341 \r\n3 4826 6015 6017 341 \r\n3 4815 6016 6015 341 \r\n3 2182 6020 6019 342 \r\n3 4070 6018 6020 342 \r\n3 1642 6019 6018 342 \r\n3 397 6022 5659 343 \r\n3 3285 6021 6022 343 \r\n3 3967 5659 6021 343 \r\n3 2514 6025 6024 344 \r\n3 1763 6023 6025 344 \r\n3 169 6024 6023 344 \r\n3 3621 6028 6027 345 \r\n3 1388 6026 6028 345 \r\n3 4259 6027 6026 345 \r\n3 4369 6031 6030 346 \r\n3 1283 6029 6031 346 \r\n3 1001 6030 6029 346 \r\n3 2369 6034 6033 347 \r\n3 2713 6032 6034 347 \r\n3 2913 6033 6032 347 \r\n3 233 6037 6036 348 \r\n3 293 6035 6037 348 \r\n3 944 6036 6035 348 \r\n3 586 6040 6039 349 \r\n3 3953 6038 6040 349 \r\n3 3979 6039 6038 349 \r\n3 1873 6043 6042 350 \r\n3 527 6041 6043 350 \r\n3 1203 6042 6041 350 \r\n3 3203 6046 6045 351 \r\n3 1311 6044 6046 351 \r\n3 3265 6045 6044 351 \r\n3 59 6049 6048 352 \r\n3 2775 6047 6049 352 \r\n3 3017 6048 6047 352 \r\n3 3900 6052 6051 353 \r\n3 1754 6050 6052 353 \r\n3 1325 6051 6050 353 \r\n3 4467 6055 6054 354 \r\n3 1679 6053 6055 354 \r\n3 719 6054 6053 354 \r\n3 4039 6057 6056 355 \r\n3 2706 5940 6057 355 \r\n3 3626 6056 5940 355 \r\n3 3429 6059 5256 356 \r\n3 4343 6058 6059 356 \r\n3 1125 5256 6058 356 \r\n3 3621 6062 6061 357 \r\n3 4494 6060 6062 357 \r\n3 303 6061 6060 357 \r\n3 4102 6065 6064 358 \r\n3 1126 6063 6065 358 \r\n3 4718 6064 6063 358 \r\n3 3263 6068 6067 359 \r\n3 1770 6066 6068 359 \r\n3 1380 6067 6066 359 \r\n3 2819 6071 6070 360 \r\n3 1512 6069 6071 360 \r\n3 2474 6070 6069 360 \r\n3 3816 5857 6073 361 \r\n3 624 6072 5857 361 \r\n3 3787 6073 6072 361 \r\n3 4901 6076 6075 362 \r\n3 3281 6074 6076 362 \r\n3 3314 6075 6074 362 \r\n3 1198 6079 6078 363 \r\n3 1277 6077 6079 363 \r\n3 2569 6078 6077 363 \r\n3 1455 6082 6081 364 \r\n3 4524 6080 6082 364 \r\n3 1323 6081 6080 364 \r\n3 3877 6085 6084 365 \r\n3 3798 6083 6085 365 \r\n3 601 6084 6083 365 \r\n3 2417 5994 6087 366 \r\n3 1334 6086 5994 366 \r\n3 2571 6087 6086 366 \r\n3 365 6090 6089 367 \r\n3 1972 6088 6090 367 \r\n3 1534 6089 6088 367 \r\n3 1878 6093 6092 368 \r\n3 3388 6091 6093 368 \r\n3 1735 6092 6091 368 \r\n3 4093 6096 6095 369 \r\n3 2435 6094 6096 369 \r\n3 3786 6095 6094 369 \r\n3 2492 6099 6098 370 \r\n3 348 6097 6099 370 \r\n3 4893 6098 6097 370 \r\n3 784 6102 6101 371 \r\n3 3826 6100 6102 371 \r\n3 1808 6101 6100 371 \r\n3 463 6105 6104 372 \r\n3 3496 6103 6105 372 \r\n3 1014 6104 6103 372 \r\n3 2264 6108 6107 373 \r\n3 2469 6106 6108 373 \r\n3 997 6107 6106 373 \r\n3 1813 6111 6110 374 \r\n3 912 6109 6111 374 \r\n3 3251 6110 6109 374 \r\n3 3358 6114 6113 375 \r\n3 4273 6112 6114 375 \r\n3 4831 6113 6112 375 \r\n3 834 6117 6116 376 \r\n3 1761 6115 6117 376 \r\n3 2122 6116 6115 376 \r\n3 3485 5563 6119 377 \r\n3 1603 6118 5563 377 \r\n3 867 6119 6118 377 \r\n3 1871 6122 6121 378 \r\n3 3773 6120 6122 378 \r\n3 439 6121 6120 378 \r\n3 2079 6124 6123 379 \r\n3 787 5882 6124 379 \r\n3 1359 6123 5882 379 \r\n3 1593 6126 6125 380 \r\n3 1954 5082 6126 380 \r\n3 282 6125 5082 380 \r\n3 2669 6129 6128 381 \r\n3 4393 6127 6129 381 \r\n3 1924 6128 6127 381 \r\n3 3263 6132 6131 382 \r\n3 335 6130 6132 382 \r\n3 4344 6131 6130 382 \r\n3 4281 6134 6133 383 \r\n3 140 5295 6134 383 \r\n3 4374 6133 5295 383 \r\n3 4930 6137 6136 384 \r\n3 1527 6135 6137 384 \r\n3 2786 6136 6135 384 \r\n3 4256 6140 6139 385 \r\n3 1909 6138 6140 385 \r\n3 3708 6139 6138 385 \r\n3 101 6143 6142 386 \r\n3 933 6141 6143 386 \r\n3 4577 6142 6141 386 \r\n3 358 6146 6145 387 \r\n3 361 6144 6146 387 \r\n3 3858 6145 6144 387 \r\n3 4599 6149 6148 388 \r\n3 4567 6147 6149 388 \r\n3 582 6148 6147 388 \r\n3 2019 6152 6151 389 \r\n3 786 6150 6152 389 \r\n3 1300 6151 6150 389 \r\n3 4318 6155 6154 390 \r\n3 66 6153 6155 390 \r\n3 4735 6154 6153 390 \r\n3 1327 6158 6157 391 \r\n3 3304 6156 6158 391 \r\n3 1519 6157 6156 391 \r\n3 3084 6161 6160 392 \r\n3 4348 6159 6161 392 \r\n3 207 6160 6159 392 \r\n3 1210 6164 6163 393 \r\n3 4632 6162 6164 393 \r\n3 3444 6163 6162 393 \r\n3 4287 6167 6166 394 \r\n3 3252 6165 6167 394 \r\n3 815 6166 6165 394 \r\n3 3751 6170 6169 395 \r\n3 4499 6168 6170 395 \r\n3 4128 6169 6168 395 \r\n3 4513 6173 6172 396 \r\n3 1616 6171 6173 396 \r\n3 1309 6172 6171 396 \r\n3 4301 6175 5615 397 \r\n3 4544 6174 6175 397 \r\n3 619 5615 6174 397 \r\n3 1011 6178 6177 398 \r\n3 4546 6176 6178 398 \r\n3 1572 6177 6176 398 \r\n3 2812 6181 6180 399 \r\n3 4591 6179 6181 399 \r\n3 2398 6180 6179 399 \r\n3 3337 6184 6183 400 \r\n3 4530 6182 6184 400 \r\n3 2102 6183 6182 400 \r\n3 374 6187 6186 401 \r\n3 1387 6185 6187 401 \r\n3 4975 6186 6185 401 \r\n3 2105 6190 6189 402 \r\n3 899 6188 6190 402 \r\n3 4464 6189 6188 402 \r\n3 2061 6193 6192 403 \r\n3 4748 6191 6193 403 \r\n3 2872 6192 6191 403 \r\n3 2666 6196 6195 404 \r\n3 2320 6194 6196 404 \r\n3 2414 6195 6194 404 \r\n3 2507 6198 6197 405 \r\n3 1927 5570 6198 405 \r\n3 1164 6197 5570 405 \r\n3 3187 6201 6200 406 \r\n3 1401 6199 6201 406 \r\n3 2648 6200 6199 406 \r\n3 889 6204 6203 407 \r\n3 2944 6202 6204 407 \r\n3 4768 6203 6202 407 \r\n3 1626 6207 6206 408 \r\n3 4100 6205 6207 408 \r\n3 4042 6206 6205 408 \r\n3 3871 6210 6209 409 \r\n3 1058 6208 6210 409 \r\n3 178 6209 6208 409 \r\n3 936 6213 6212 410 \r\n3 475 6211 6213 410 \r\n3 896 6212 6211 410 \r\n3 4747 6216 6215 411 \r\n3 110 6214 6216 411 \r\n3 4099 6215 6214 411 \r\n3 2829 6219 6218 412 \r\n3 4421 6217 6219 412 \r\n3 3532 6218 6217 412 \r\n3 3722 6221 5193 413 \r\n3 1753 6220 6221 413 \r\n3 1113 5193 6220 413 \r\n3 2206 6224 6223 414 \r\n3 3233 6222 6224 414 \r\n3 2623 6223 6222 414 \r\n3 3305 6227 6226 415 \r\n3 4011 6225 6227 415 \r\n3 3827 6226 6225 415 \r\n3 1010 6230 6229 416 \r\n3 3194 6228 6230 416 \r\n3 3956 6229 6228 416 \r\n3 4949 6232 5884 417 \r\n3 1021 6231 6232 417 \r\n3 1359 5884 6231 417 \r\n3 2494 6235 6234 418 \r\n3 3331 6233 6235 418 \r\n3 1418 6234 6233 418 \r\n3 3808 6238 6237 419 \r\n3 4840 6236 6238 419 \r\n3 3087 6237 6236 419 \r\n3 1870 6241 6240 420 \r\n3 2342 6239 6241 420 \r\n3 3039 6240 6239 420 \r\n3 4588 6244 6243 421 \r\n3 2206 6242 6244 421 \r\n3 3854 6243 6242 421 \r\n3 3053 6247 6246 422 \r\n3 3994 6245 6247 422 \r\n3 3199 6246 6245 422 \r\n3 4005 6250 6249 423 \r\n3 2731 6248 6250 423 \r\n3 555 6249 6248 423 \r\n3 463 6253 6252 424 \r\n3 680 6251 6253 424 \r\n3 3309 6252 6251 424 \r\n3 500 6256 6255 425 \r\n3 392 6254 6256 425 \r\n3 3634 6255 6254 425 \r\n3 1765 6259 6258 426 \r\n3 4390 6257 6259 426 \r\n3 4960 6258 6257 426 \r\n3 1669 6262 6261 427 \r\n3 2217 6260 6262 427 \r\n3 4232 6261 6260 427 \r\n3 470 6265 6264 428 \r\n3 3964 6263 6265 428 \r\n3 2196 6264 6263 428 \r\n3 2525 6268 6267 429 \r\n3 505 6266 6268 429 \r\n3 418 6267 6266 429 \r\n3 4925 6271 6270 430 \r\n3 916 6269 6271 430 \r\n3 4633 6270 6269 430 \r\n3 4271 6274 6273 431 \r\n3 4643 6272 6274 431 \r\n3 662 6273 6272 431 \r\n3 1666 6277 6276 432 \r\n3 3567 6275 6277 432 \r\n3 1088 6276 6275 432 \r\n3 346 6280 6279 433 \r\n3 3280 6278 6280 433 \r\n3 1280 6279 6278 433 \r\n3 3173 6283 6282 434 \r\n3 1445 6281 6283 434 \r\n3 4294 6282 6281 434 \r\n3 597 6286 6285 435 \r\n3 1501 6284 6286 435 \r\n3 1653 6285 6284 435 \r\n3 3235 6289 6288 436 \r\n3 3775 6287 6289 436 \r\n3 4625 6288 6287 436 \r\n3 3171 6292 6291 437 \r\n3 4746 6290 6292 437 \r\n3 4461 6291 6290 437 \r\n3 3403 6295 6294 438 \r\n3 1144 6293 6295 438 \r\n3 3903 6294 6293 438 \r\n3 1953 6298 6297 439 \r\n3 3942 6296 6298 439 \r\n3 3396 6297 6296 439 \r\n3 4483 6300 5241 440 \r\n3 3076 6299 6300 440 \r\n3 46 5241 6299 440 \r\n3 2757 6303 6302 441 \r\n3 1752 6301 6303 441 \r\n3 2165 6302 6301 441 \r\n3 4395 6306 6305 442 \r\n3 4390 6304 6306 442 \r\n3 4097 6305 6304 442 \r\n3 3882 6309 6308 443 \r\n3 3820 6307 6309 443 \r\n3 3709 6308 6307 443 \r\n3 3913 6312 6311 444 \r\n3 1979 6310 6312 444 \r\n3 3931 6311 6310 444 \r\n3 1536 6315 6314 445 \r\n3 907 6313 6315 445 \r\n3 3461 6314 6313 445 \r\n3 1895 6318 6317 446 \r\n3 2488 6316 6318 446 \r\n3 3172 6317 6316 446 \r\n3 2912 6321 6320 447 \r\n3 1626 6319 6321 447 \r\n3 4342 6320 6319 447 \r\n3 1260 6324 6323 448 \r\n3 2046 6322 6324 448 \r\n3 1405 6323 6322 448 \r\n3 116 6327 6326 449 \r\n3 450 6325 6327 449 \r\n3 1293 6326 6325 449 \r\n3 3173 6329 6283 450 \r\n3 2495 6328 6329 450 \r\n3 1445 6283 6328 450 \r\n3 2768 6332 6331 451 \r\n3 4009 6330 6332 451 \r\n3 689 6331 6330 451 \r\n3 4199 6335 6334 452 \r\n3 2947 6333 6335 452 \r\n3 3597 6334 6333 452 \r\n3 500 6338 6337 453 \r\n3 3678 6336 6338 453 \r\n3 4265 6337 6336 453 \r\n3 3625 6341 6340 454 \r\n3 191 6339 6341 454 \r\n3 3345 6340 6339 454 \r\n3 601 6344 6343 455 \r\n3 2658 6342 6344 455 \r\n3 3892 6343 6342 455 \r\n3 4119 6347 6346 456 \r\n3 554 6345 6347 456 \r\n3 400 6346 6345 456 \r\n3 1398 6350 6349 457 \r\n3 4809 6348 6350 457 \r\n3 1421 6349 6348 457 \r\n3 2679 6353 6352 458 \r\n3 1026 6351 6353 458 \r\n3 935 6352 6351 458 \r\n3 3993 6356 6355 459 \r\n3 2225 6354 6356 459 \r\n3 3211 6355 6354 459 \r\n3 4423 6359 6358 460 \r\n3 3982 6357 6359 460 \r\n3 730 6358 6357 460 \r\n3 1605 6361 6360 461 \r\n3 2696 5872 6361 461 \r\n3 3954 6360 5872 461 \r\n3 3091 6364 6363 462 \r\n3 4313 6362 6364 462 \r\n3 1584 6363 6362 462 \r\n3 2985 6366 6365 463 \r\n3 254 5303 6366 463 \r\n3 4712 6365 5303 463 \r\n3 1173 6368 5537 464 \r\n3 105 6367 6368 464 \r\n3 1672 5537 6367 464 \r\n3 349 6370 5123 465 \r\n3 4404 6369 6370 465 \r\n3 2132 5123 6369 465 \r\n3 4974 6373 6372 466 \r\n3 215 6371 6373 466 \r\n3 4512 6372 6371 466 \r\n3 998 6376 6375 467 \r\n3 4076 6374 6376 467 \r\n3 2419 6375 6374 467 \r\n3 802 6379 6378 468 \r\n3 4085 6377 6379 468 \r\n3 3572 6378 6377 468 \r\n3 3721 6382 6381 469 \r\n3 4200 6380 6382 469 \r\n3 2007 6381 6380 469 \r\n3 416 5363 6384 470 \r\n3 3647 6383 5363 470 \r\n3 3078 6384 6383 470 \r\n3 2867 6387 6386 471 \r\n3 549 6385 6387 471 \r\n3 308 6386 6385 471 \r\n3 2627 6390 6389 472 \r\n3 3553 6388 6390 472 \r\n3 309 6389 6388 472 \r\n3 1203 6041 6392 473 \r\n3 527 6391 6041 473 \r\n3 4405 6392 6391 473 \r\n3 3160 6395 6394 474 \r\n3 2265 6393 6395 474 \r\n3 3832 6394 6393 474 \r\n3 919 6398 6397 475 \r\n3 1560 6396 6398 475 \r\n3 1203 6397 6396 475 \r\n3 3084 6399 6161 476 \r\n3 1603 5562 6399 476 \r\n3 4348 6161 5562 476 \r\n3 2064 6402 6401 477 \r\n3 1463 6400 6402 477 \r\n3 3889 6401 6400 477 \r\n3 3787 6405 6404 478 \r\n3 276 6403 6405 478 \r\n3 4105 6404 6403 478 \r\n3 4834 6408 6407 479 \r\n3 1120 6406 6408 479 \r\n3 3253 6407 6406 479 \r\n3 2005 6411 6410 480 \r\n3 163 6409 6411 480 \r\n3 2111 6410 6409 480 \r\n3 1313 6414 6413 481 \r\n3 4856 6412 6414 481 \r\n3 622 6413 6412 481 \r\n3 3043 6417 6416 482 \r\n3 2154 6415 6417 482 \r\n3 4455 6416 6415 482 \r\n3 1687 6420 6419 483 \r\n3 2819 6418 6420 483 \r\n3 2767 6419 6418 483 \r\n3 1977 6423 6422 484 \r\n3 923 6421 6423 484 \r\n3 378 6422 6421 484 \r\n3 2790 6426 6425 485 \r\n3 2546 6424 6426 485 \r\n3 4193 6425 6424 485 \r\n3 4446 6429 6428 486 \r\n3 4821 6427 6429 486 \r\n3 3691 6428 6427 486 \r\n3 28 6432 6431 487 \r\n3 550 6430 6432 487 \r\n3 4223 6431 6430 487 \r\n3 1669 6434 6262 488 \r\n3 4184 6433 6434 488 \r\n3 2217 6262 6433 488 \r\n3 3045 6437 6436 489 \r\n3 559 6435 6437 489 \r\n3 3921 6436 6435 489 \r\n3 1672 6439 6438 490 \r\n3 4109 5622 6439 490 \r\n3 2330 6438 5622 490 \r\n3 4359 6442 6441 491 \r\n3 3248 6440 6442 491 \r\n3 3150 6441 6440 491 \r\n3 4464 6445 6444 492 \r\n3 479 6443 6445 492 \r\n3 2757 6444 6443 492 \r\n3 1232 6448 6447 493 \r\n3 4387 6446 6448 493 \r\n3 3264 6447 6446 493 \r\n3 3295 6451 6450 494 \r\n3 3111 6449 6451 494 \r\n3 3469 6450 6449 494 \r\n3 2337 6454 6453 495 \r\n3 608 6452 6454 495 \r\n3 1848 6453 6452 495 \r\n3 2013 6457 6456 496 \r\n3 3100 6455 6457 496 \r\n3 2284 6456 6455 496 \r\n3 635 6460 6459 497 \r\n3 1802 6458 6460 497 \r\n3 1496 6459 6458 497 \r\n3 4625 6463 6462 498 \r\n3 3981 6461 6463 498 \r\n3 2339 6462 6461 498 \r\n3 2509 6466 6465 499 \r\n3 3564 6464 6466 499 \r\n3 3645 6465 6464 499 \r\n3 2668 5995 6468 500 \r\n3 2417 6467 5995 500 \r\n3 4772 6468 6467 500 \r\n3 988 6471 6470 501 \r\n3 3342 6469 6471 501 \r\n3 3157 6470 6469 501 \r\n3 2372 6474 6473 502 \r\n3 5001 6472 6474 502 \r\n3 2542 6473 6472 502 \r\n3 747 6476 5278 503 \r\n3 2125 6475 6476 503 \r\n3 383 5278 6475 503 \r\n3 4605 6479 6478 504 \r\n3 2908 6477 6479 504 \r\n3 1298 6478 6477 504 \r\n3 3512 6482 6481 505 \r\n3 2189 6480 6482 505 \r\n3 4809 6481 6480 505 \r\n3 266 6485 6484 506 \r\n3 325 6483 6485 506 \r\n3 3584 6484 6483 506 \r\n3 2903 6488 6487 507 \r\n3 4492 6486 6488 507 \r\n3 1714 6487 6486 507 \r\n3 2213 6490 6489 508 \r\n3 2314 5695 6490 508 \r\n3 4247 6489 5695 508 \r\n3 2733 6493 6492 509 \r\n3 2295 6491 6493 509 \r\n3 4495 6492 6491 509 \r\n3 3627 6496 6495 510 \r\n3 2197 6494 6496 510 \r\n3 4773 6495 6494 510 \r\n3 4268 6499 6498 511 \r\n3 2155 6497 6499 511 \r\n3 146 6498 6497 511 \r\n3 2873 6502 6501 512 \r\n3 341 6500 6502 512 \r\n3 4680 6501 6500 512 \r\n3 4383 6505 6504 513 \r\n3 1585 6503 6505 513 \r\n3 4044 6504 6503 513 \r\n3 3726 6508 6507 514 \r\n3 1291 6506 6508 514 \r\n3 4587 6507 6506 514 \r\n3 43 6511 6510 515 \r\n3 1030 6509 6511 515 \r\n3 1923 6510 6509 515 \r\n3 1050 6514 6513 516 \r\n3 1407 6512 6514 516 \r\n3 3442 6513 6512 516 \r\n3 4941 6517 6516 517 \r\n3 3092 6515 6517 517 \r\n3 4815 6516 6515 517 \r\n3 204 6520 6519 518 \r\n3 1309 6518 6520 518 \r\n3 1744 6519 6518 518 \r\n3 3066 6523 6522 519 \r\n3 3550 6521 6523 519 \r\n3 2808 6522 6521 519 \r\n3 4311 6526 6525 520 \r\n3 615 6524 6526 520 \r\n3 2439 6525 6524 520 \r\n3 1142 6529 6528 521 \r\n3 1314 6527 6529 521 \r\n3 1356 6528 6527 521 \r\n3 4686 6532 6531 522 \r\n3 324 6530 6532 522 \r\n3 2300 6531 6530 522 \r\n3 1256 6535 6534 523 \r\n3 495 6533 6535 523 \r\n3 1989 6534 6533 523 \r\n3 4721 6538 6537 524 \r\n3 1005 6536 6538 524 \r\n3 1111 6537 6536 524 \r\n3 2496 5219 6540 525 \r\n3 3566 6539 5219 525 \r\n3 459 6540 6539 525 \r\n3 1770 6543 6542 526 \r\n3 3697 6541 6543 526 \r\n3 4081 6542 6541 526 \r\n3 1113 6545 5191 527 \r\n3 137 6544 6545 527 \r\n3 2554 5191 6544 527 \r\n3 1760 6548 6547 528 \r\n3 751 6546 6548 528 \r\n3 4835 6547 6546 528 \r\n3 4543 6551 6550 529 \r\n3 1635 6549 6551 529 \r\n3 4612 6550 6549 529 \r\n3 3782 6554 6553 530 \r\n3 2667 6552 6554 530 \r\n3 437 6553 6552 530 \r\n3 3902 6557 6556 531 \r\n3 2638 6555 6557 531 \r\n3 3039 6556 6555 531 \r\n3 2824 6560 6559 532 \r\n3 155 6558 6560 532 \r\n3 3561 6559 6558 532 \r\n3 1433 6563 6562 533 \r\n3 1335 6561 6563 533 \r\n3 859 6562 6561 533 \r\n3 1057 5812 6565 534 \r\n3 1355 6564 5812 534 \r\n3 2549 6565 6564 534 \r\n3 4213 6567 6566 535 \r\n3 2645 5878 6567 535 \r\n3 3887 6566 5878 535 \r\n3 414 6570 6569 536 \r\n3 2613 6568 6570 536 \r\n3 2258 6569 6568 536 \r\n3 3195 6573 6572 537 \r\n3 3142 6571 6573 537 \r\n3 35 6572 6571 537 \r\n3 4729 6576 6575 538 \r\n3 653 6574 6576 538 \r\n3 2132 6575 6574 538 \r\n3 1705 6579 6578 539 \r\n3 3222 6577 6579 539 \r\n3 1989 6578 6577 539 \r\n3 1377 6582 6581 540 \r\n3 1570 6580 6582 540 \r\n3 3566 6581 6580 540 \r\n3 3606 6584 6583 541 \r\n3 165 5737 6584 541 \r\n3 479 6583 5737 541 \r\n3 1717 6587 6586 542 \r\n3 3324 6585 6587 542 \r\n3 2918 6586 6585 542 \r\n3 3651 6589 5667 543 \r\n3 4620 6588 6589 543 \r\n3 3447 5667 6588 543 \r\n3 2387 6592 6591 544 \r\n3 1106 6590 6592 544 \r\n3 564 6591 6590 544 \r\n3 424 6595 6594 545 \r\n3 255 6593 6595 545 \r\n3 2860 6594 6593 545 \r\n3 4410 6598 6597 546 \r\n3 4140 6596 6598 546 \r\n3 1435 6597 6596 546 \r\n3 1278 6601 6600 547 \r\n3 3936 6599 6601 547 \r\n3 2395 6600 6599 547 \r\n3 4252 6604 6603 548 \r\n3 3951 6602 6604 548 \r\n3 3969 6603 6602 548 \r\n3 3593 6606 5377 549 \r\n3 1264 6605 6606 549 \r\n3 261 5377 6605 549 \r\n3 4812 6609 6608 550 \r\n3 53 6607 6609 550 \r\n3 1411 6608 6607 550 \r\n3 561 6612 6611 551 \r\n3 4541 6610 6612 551 \r\n3 3330 6611 6610 551 \r\n3 4895 6614 6613 552 \r\n3 2414 6194 6614 552 \r\n3 2320 6613 6194 552 \r\n3 1700 6617 6616 553 \r\n3 2427 6615 6617 553 \r\n3 939 6616 6615 553 \r\n3 798 6620 6619 554 \r\n3 104 6618 6620 554 \r\n3 244 6619 6618 554 \r\n3 4868 6623 6622 555 \r\n3 2499 6621 6623 555 \r\n3 898 6622 6621 555 \r\n3 3410 6626 6625 556 \r\n3 3133 6624 6626 556 \r\n3 3296 6625 6624 556 \r\n3 369 6629 6628 557 \r\n3 76 6627 6629 557 \r\n3 3028 6628 6627 557 \r\n3 1452 6632 6631 558 \r\n3 3352 6630 6632 558 \r\n3 3090 6631 6630 558 \r\n3 2730 6635 6634 559 \r\n3 4714 6633 6635 559 \r\n3 1876 6634 6633 559 \r\n3 3590 6638 6637 560 \r\n3 2384 6636 6638 560 \r\n3 1392 6637 6636 560 \r\n3 4354 6640 6639 561 \r\n3 3103 5471 6640 561 \r\n3 4401 6639 5471 561 \r\n3 1 6643 6642 562 \r\n3 2654 6641 6643 562 \r\n3 2302 6642 6641 562 \r\n3 4267 6646 6645 563 \r\n3 2637 6644 6646 563 \r\n3 4785 6645 6644 563 \r\n3 561 6649 6648 564 \r\n3 3564 6647 6649 564 \r\n3 4705 6648 6647 564 \r\n3 4145 6652 6651 565 \r\n3 4665 6650 6652 565 \r\n3 332 6651 6650 565 \r\n3 1138 6655 6654 566 \r\n3 252 6653 6655 566 \r\n3 469 6654 6653 566 \r\n3 1877 6658 6657 567 \r\n3 1494 6656 6658 567 \r\n3 4279 6657 6656 567 \r\n3 1438 5269 6660 568 \r\n3 628 6659 5269 568 \r\n3 830 6660 6659 568 \r\n3 1818 6663 6662 569 \r\n3 2787 6661 6663 569 \r\n3 1643 6662 6661 569 \r\n3 4124 6666 6665 570 \r\n3 1599 6664 6666 570 \r\n3 1721 6665 6664 570 \r\n3 1103 6669 6668 571 \r\n3 1208 6667 6669 571 \r\n3 1741 6668 6667 571 \r\n3 3283 6672 6671 572 \r\n3 1652 6670 6672 572 \r\n3 1174 6671 6670 572 \r\n3 1184 6675 6674 573 \r\n3 3552 6673 6675 573 \r\n3 467 6674 6673 573 \r\n3 1084 6678 6677 574 \r\n3 1227 6676 6678 574 \r\n3 1385 6677 6676 574 \r\n3 4305 6681 6680 575 \r\n3 3714 6679 6681 575 \r\n3 4076 6680 6679 575 \r\n3 1364 6684 6683 576 \r\n3 3801 6682 6684 576 \r\n3 2582 6683 6682 576 \r\n3 1070 6687 6686 577 \r\n3 4139 6685 6687 577 \r\n3 979 6686 6685 577 \r\n3 2667 6690 6689 578 \r\n3 2912 6688 6690 578 \r\n3 2564 6689 6688 578 \r\n3 280 6693 6692 579 \r\n3 2934 6691 6693 579 \r\n3 1829 6692 6691 579 \r\n3 403 6696 6695 580 \r\n3 474 6694 6696 580 \r\n3 2487 6695 6694 580 \r\n3 4963 6699 6698 581 \r\n3 1410 6697 6699 581 \r\n3 4508 6698 6697 581 \r\n3 3710 6702 6701 582 \r\n3 547 6700 6702 582 \r\n3 1503 6701 6700 582 \r\n3 1123 6705 6704 583 \r\n3 2493 6703 6705 583 \r\n3 4497 6704 6703 583 \r\n3 3007 6708 6707 584 \r\n3 4725 6706 6708 584 \r\n3 462 6707 6706 584 \r\n3 3451 6711 6710 585 \r\n3 775 6709 6711 585 \r\n3 4523 6710 6709 585 \r\n3 2020 6714 6713 586 \r\n3 336 6712 6714 586 \r\n3 105 6713 6712 586 \r\n3 4456 6717 6716 587 \r\n3 855 6715 6717 587 \r\n3 2327 6716 6715 587 \r\n3 1416 6720 6719 588 \r\n3 2737 6718 6720 588 \r\n3 776 6719 6718 588 \r\n3 570 6723 6722 589 \r\n3 1881 6721 6723 589 \r\n3 40 6722 6721 589 \r\n3 3578 6726 6725 590 \r\n3 1137 6724 6726 590 \r\n3 2085 6725 6724 590 \r\n3 1225 6729 6728 591 \r\n3 1551 6727 6729 591 \r\n3 4500 6728 6727 591 \r\n3 1685 6732 6731 592 \r\n3 2486 6730 6732 592 \r\n3 1867 6731 6730 592 \r\n3 813 6735 6734 593 \r\n3 3221 6733 6735 593 \r\n3 1086 6734 6733 593 \r\n3 334 6738 6737 594 \r\n3 2074 6736 6738 594 \r\n3 1644 6737 6736 594 \r\n3 3531 6741 6740 595 \r\n3 4708 6739 6741 595 \r\n3 4220 6740 6739 595 \r\n3 1857 6744 6743 596 \r\n3 1069 6742 6744 596 \r\n3 4471 6743 6742 596 \r\n3 1907 6747 6746 597 \r\n3 4326 6745 6747 597 \r\n3 2267 6746 6745 597 \r\n3 1827 6750 6749 598 \r\n3 4556 6748 6750 598 \r\n3 4649 6749 6748 598 \r\n3 489 6753 6752 599 \r\n3 4524 6751 6753 599 \r\n3 1678 6752 6751 599 \r\n3 3196 6756 6755 600 \r\n3 3375 6754 6756 600 \r\n3 4424 6755 6754 600 \r\n3 3811 6759 6758 601 \r\n3 4561 6757 6759 601 \r\n3 710 6758 6757 601 \r\n3 377 6762 6761 602 \r\n3 4549 6760 6762 602 \r\n3 2545 6761 6760 602 \r\n3 3882 6765 6764 603 \r\n3 3411 6763 6765 603 \r\n3 3705 6764 6763 603 \r\n3 830 6768 6767 604 \r\n3 4463 6766 6768 604 \r\n3 1720 6767 6766 604 \r\n3 535 6771 6770 605 \r\n3 508 6769 6771 605 \r\n3 262 6770 6769 605 \r\n3 3103 6774 6773 606 \r\n3 1600 6772 6774 606 \r\n3 1609 6773 6772 606 \r\n3 3652 6777 6776 607 \r\n3 3134 6775 6777 607 \r\n3 663 6776 6775 607 \r\n3 384 6780 6779 608 \r\n3 3945 6778 6780 608 \r\n3 3261 6779 6778 608 \r\n3 1547 6783 6782 609 \r\n3 666 6781 6783 609 \r\n3 2753 6782 6781 609 \r\n3 3457 6786 6785 610 \r\n3 2002 6784 6786 610 \r\n3 4052 6785 6784 610 \r\n3 1990 6789 6788 611 \r\n3 1305 6787 6789 611 \r\n3 1700 6788 6787 611 \r\n3 2673 6792 6791 612 \r\n3 1921 6790 6792 612 \r\n3 2784 6791 6790 612 \r\n3 4202 6795 6794 613 \r\n3 2892 6793 6795 613 \r\n3 4859 6794 6793 613 \r\n3 951 6798 6797 614 \r\n3 2157 6796 6798 614 \r\n3 625 6797 6796 614 \r\n3 230 6801 6800 615 \r\n3 4945 6799 6801 615 \r\n3 3586 6800 6799 615 \r\n3 2 6804 6803 616 \r\n3 876 6802 6804 616 \r\n3 4088 6803 6802 616 \r\n3 2217 6433 6805 617 \r\n3 4184 5796 6433 617 \r\n3 3321 6805 5796 617 \r\n3 1339 6808 6807 618 \r\n3 1430 6806 6808 618 \r\n3 2812 6807 6806 618 \r\n3 1954 6811 6810 619 \r\n3 1955 6809 6811 619 \r\n3 2458 6810 6809 619 \r\n3 4018 5547 6813 620 \r\n3 1622 6812 5547 620 \r\n3 1957 6813 6812 620 \r\n3 1764 6816 6815 621 \r\n3 4958 6814 6816 621 \r\n3 1149 6815 6814 621 \r\n3 632 6819 6818 622 \r\n3 2282 6817 6819 622 \r\n3 1665 6818 6817 622 \r\n3 3109 6822 6821 623 \r\n3 4782 6820 6822 623 \r\n3 4999 6821 6820 623 \r\n3 4700 6825 6824 624 \r\n3 3327 6823 6825 624 \r\n3 803 6824 6823 624 \r\n3 3162 6828 6827 625 \r\n3 977 6826 6828 625 \r\n3 3757 6827 6826 625 \r\n3 2106 6831 6830 626 \r\n3 4516 6829 6831 626 \r\n3 3671 6830 6829 626 \r\n3 2743 6834 6833 627 \r\n3 2115 6832 6834 627 \r\n3 2685 6833 6832 627 \r\n3 3250 5982 6836 628 \r\n3 3248 6835 5982 628 \r\n3 3471 6836 6835 628 \r\n3 557 6839 6838 629 \r\n3 2710 6837 6839 629 \r\n3 4553 6838 6837 629 \r\n3 1315 6842 6841 630 \r\n3 4208 6840 6842 630 \r\n3 3795 6841 6840 630 \r\n3 2176 6845 6844 631 \r\n3 4500 6843 6845 631 \r\n3 2094 6844 6843 631 \r\n3 1992 6848 6847 632 \r\n3 3145 6846 6848 632 \r\n3 2317 6847 6846 632 \r\n3 3262 6851 6850 633 \r\n3 3911 6849 6851 633 \r\n3 14 6850 6849 633 \r\n3 1015 6854 6853 634 \r\n3 4414 6852 6854 634 \r\n3 520 6853 6852 634 \r\n3 4400 6857 6856 635 \r\n3 4179 6855 6857 635 \r\n3 4740 6856 6855 635 \r\n3 2961 6860 6859 636 \r\n3 3190 6858 6860 636 \r\n3 1962 6859 6858 636 \r\n3 447 6863 6862 637 \r\n3 2016 6861 6863 637 \r\n3 4323 6862 6861 637 \r\n3 2644 6866 6865 638 \r\n3 3670 6864 6866 638 \r\n3 4450 6865 6864 638 \r\n3 3003 6869 6868 639 \r\n3 1966 6867 6869 639 \r\n3 2741 6868 6867 639 \r\n3 3473 6872 6871 640 \r\n3 3581 6870 6872 640 \r\n3 1510 6871 6870 640 \r\n3 1230 6875 6874 641 \r\n3 2485 6873 6875 641 \r\n3 1193 6874 6873 641 \r\n3 533 6878 6877 642 \r\n3 4264 6876 6878 642 \r\n3 2233 6877 6876 642 \r\n3 1651 6881 6880 643 \r\n3 562 6879 6881 643 \r\n3 1966 6880 6879 643 \r\n3 1086 6883 6734 644 \r\n3 4121 6882 6883 644 \r\n3 813 6734 6882 644 \r\n3 2251 6886 6885 645 \r\n3 481 6884 6886 645 \r\n3 727 6885 6884 645 \r\n3 1686 6889 6888 646 \r\n3 2050 6887 6889 646 \r\n3 260 6888 6887 646 \r\n3 3872 6892 6891 647 \r\n3 2506 6890 6892 647 \r\n3 2828 6891 6890 647 \r\n3 405 6895 6894 648 \r\n3 3217 6893 6895 648 \r\n3 2503 6894 6893 648 \r\n3 330 6898 6897 649 \r\n3 2890 6896 6898 649 \r\n3 3668 6897 6896 649 \r\n3 3754 6901 6900 650 \r\n3 2244 6899 6901 650 \r\n3 88 6900 6899 650 \r\n3 1776 6904 6903 651 \r\n3 2707 6902 6904 651 \r\n3 2951 6903 6902 651 \r\n3 3058 6906 6905 652 \r\n3 3190 6860 6906 652 \r\n3 2961 6905 6860 652 \r\n3 4761 6909 6908 653 \r\n3 4996 6907 6909 653 \r\n3 688 6908 6907 653 \r\n3 2996 6912 6911 654 \r\n3 603 6910 6912 654 \r\n3 1361 6911 6910 654 \r\n3 4335 6915 6914 655 \r\n3 2703 6913 6915 655 \r\n3 1704 6914 6913 655 \r\n3 1614 6918 6917 656 \r\n3 1781 6916 6918 656 \r\n3 224 6917 6916 656 \r\n3 3290 6920 5580 657 \r\n3 3740 6919 6920 657 \r\n3 3836 5580 6919 657 \r\n3 2485 6923 6922 658 \r\n3 3081 6921 6923 658 \r\n3 156 6922 6921 658 \r\n3 2056 6926 6925 659 \r\n3 2939 6924 6926 659 \r\n3 1056 6925 6924 659 \r\n3 3617 6929 6928 660 \r\n3 4496 6927 6929 660 \r\n3 2222 6928 6927 660 \r\n3 4493 6932 6931 661 \r\n3 1056 6930 6932 661 \r\n3 3510 6931 6930 661 \r\n3 826 5671 6933 662 \r\n3 2215 5182 5671 662 \r\n3 1948 6933 5182 662 \r\n3 3516 6936 6935 663 \r\n3 205 6934 6936 663 \r\n3 961 6935 6934 663 \r\n3 4109 6938 5620 664 \r\n3 1636 6937 6938 664 \r\n3 743 5620 6937 664 \r\n3 3889 6941 6940 665 \r\n3 4131 6939 6941 665 \r\n3 3583 6940 6939 665 \r\n3 3142 6573 6943 666 \r\n3 3195 6942 6573 666 \r\n3 3912 6943 6942 666 \r\n3 4445 6946 6945 667 \r\n3 1137 6944 6946 667 \r\n3 1731 6945 6944 667 \r\n3 4275 6949 6948 668 \r\n3 563 6947 6949 668 \r\n3 2099 6948 6947 668 \r\n3 2359 5404 6951 669 \r\n3 4771 6950 5404 669 \r\n3 4242 6951 6950 669 \r\n3 1719 6954 6953 670 \r\n3 500 6952 6954 670 \r\n3 3944 6953 6952 670 \r\n3 301 6957 6956 671 \r\n3 2763 6955 6957 671 \r\n3 4754 6956 6955 671 \r\n3 873 6960 6959 672 \r\n3 2213 6958 6960 672 \r\n3 1707 6959 6958 672 \r\n3 4502 6963 6962 673 \r\n3 4829 6961 6963 673 \r\n3 994 6962 6961 673 \r\n3 3102 6965 6964 674 \r\n3 224 5097 6965 674 \r\n3 1085 6964 5097 674 \r\n3 4646 6967 6966 675 \r\n3 529 5554 6967 675 \r\n3 759 6966 5554 675 \r\n3 1792 6970 6969 676 \r\n3 3661 6968 6970 676 \r\n3 1645 6969 6968 676 \r\n3 4692 6973 6972 677 \r\n3 3755 6971 6973 677 \r\n3 375 6972 6971 677 \r\n3 1137 6975 6724 678 \r\n3 1779 6974 6975 678 \r\n3 2085 6724 6974 678 \r\n3 591 6978 6977 679 \r\n3 1029 6976 6978 679 \r\n3 4344 6977 6976 679 \r\n3 3176 6981 6980 680 \r\n3 649 6979 6981 680 \r\n3 4181 6980 6979 680 \r\n3 4380 6984 6983 681 \r\n3 905 6982 6984 681 \r\n3 929 6983 6982 681 \r\n3 4941 6516 6986 682 \r\n3 4815 6985 6516 682 \r\n3 1172 6986 6985 682 \r\n3 1628 6989 6988 683 \r\n3 1408 6987 6989 683 \r\n3 4210 6988 6987 683 \r\n3 706 6992 6991 684 \r\n3 1331 6990 6992 684 \r\n3 4253 6991 6990 684 \r\n3 2428 6995 6994 685 \r\n3 3958 6993 6995 685 \r\n3 2308 6994 6993 685 \r\n3 4491 6998 6997 686 \r\n3 4521 6996 6998 686 \r\n3 2092 6997 6996 686 \r\n3 2612 7001 7000 687 \r\n3 1421 6999 7001 687 \r\n3 3042 7000 6999 687 \r\n3 3373 7004 7003 688 \r\n3 1177 7002 7004 688 \r\n3 4814 7003 7002 688 \r\n3 3210 7007 7006 689 \r\n3 4188 7005 7007 689 \r\n3 905 7006 7005 689 \r\n3 3848 7010 7009 690 \r\n3 2489 7008 7010 690 \r\n3 1036 7009 7008 690 \r\n3 552 7013 7012 691 \r\n3 3786 7011 7013 691 \r\n3 1346 7012 7011 691 \r\n3 2952 7016 7015 692 \r\n3 455 7014 7016 692 \r\n3 3437 7015 7014 692 \r\n3 4172 7019 7018 693 \r\n3 2718 7017 7019 693 \r\n3 1198 7018 7017 693 \r\n3 3898 7022 7021 694 \r\n3 2435 7020 7022 694 \r\n3 4724 7021 7020 694 \r\n3 3121 5424 7024 695 \r\n3 956 7023 5424 695 \r\n3 667 7024 7023 695 \r\n3 2889 7027 7026 696 \r\n3 2584 7025 7027 696 \r\n3 1749 7026 7025 696 \r\n3 54 7030 7029 697 \r\n3 3193 7028 7030 697 \r\n3 1244 7029 7028 697 \r\n3 4442 7033 7032 698 \r\n3 1072 7031 7033 698 \r\n3 3299 7032 7031 698 \r\n3 4064 7036 7035 699 \r\n3 1773 7034 7036 699 \r\n3 985 7035 7034 699 \r\n3 1472 7039 7038 700 \r\n3 4880 7037 7039 700 \r\n3 4756 7038 7037 700 \r\n3 456 7042 7041 701 \r\n3 427 7040 7042 701 \r\n3 4367 7041 7040 701 \r\n3 2580 7045 7044 702 \r\n3 3043 7043 7045 702 \r\n3 1124 7044 7043 702 \r\n3 2795 7048 7047 703 \r\n3 421 7046 7048 703 \r\n3 3219 7047 7046 703 \r\n3 4463 7051 7050 704 \r\n3 4910 7049 7051 704 \r\n3 3430 7050 7049 704 \r\n3 1347 7054 7053 705 \r\n3 1321 7052 7054 705 \r\n3 2849 7053 7052 705 \r\n3 1940 7057 7056 706 \r\n3 1759 7055 7057 706 \r\n3 2830 7056 7055 706 \r\n3 76 7059 6627 707 \r\n3 3586 7058 7059 707 \r\n3 3028 6627 7058 707 \r\n3 4267 5025 6646 708 \r\n3 2302 7060 5025 708 \r\n3 2637 6646 7060 708 \r\n3 4991 7062 5264 709 \r\n3 4457 7061 7062 709 \r\n3 1189 5264 7061 709 \r\n3 1937 7065 7064 710 \r\n3 3020 7063 7065 710 \r\n3 4370 7064 7063 710 \r\n3 2619 7068 7067 711 \r\n3 148 7066 7068 711 \r\n3 1385 7067 7066 711 \r\n3 4209 7071 7070 712 \r\n3 581 7069 7071 712 \r\n3 4801 7070 7069 712 \r\n3 4045 7074 7073 713 \r\n3 88 7072 7074 713 \r\n3 1448 7073 7072 713 \r\n3 3335 7077 7076 714 \r\n3 2797 7075 7077 714 \r\n3 316 7076 7075 714 \r\n3 1705 7079 5865 715 \r\n3 2702 7078 7079 715 \r\n3 3679 5865 7078 715 \r\n3 1524 7081 7080 716 \r\n3 403 6695 7081 716 \r\n3 2487 7080 6695 716 \r\n3 2973 7084 7083 717 \r\n3 2207 7082 7084 717 \r\n3 3367 7083 7082 717 \r\n3 267 7087 7086 718 \r\n3 4546 7085 7087 718 \r\n3 1602 7086 7085 718 \r\n3 3303 7090 7089 719 \r\n3 674 7088 7090 719 \r\n3 2606 7089 7088 719 \r\n3 92 7093 7092 720 \r\n3 1450 7091 7093 720 \r\n3 1507 7092 7091 720 \r\n3 3131 7096 7095 721 \r\n3 1772 7094 7096 721 \r\n3 321 7095 7094 721 \r\n3 4555 7098 7097 722 \r\n3 46 6299 7098 722 \r\n3 3076 7097 6299 722 \r\n3 4000 7101 7100 723 \r\n3 2887 7099 7101 723 \r\n3 3767 7100 7099 723 \r\n3 394 7104 7103 724 \r\n3 4075 7102 7104 724 \r\n3 701 7103 7102 724 \r\n3 4807 7107 7106 725 \r\n3 1246 7105 7107 725 \r\n3 3870 7106 7105 725 \r\n3 4785 7110 7109 726 \r\n3 1514 7108 7110 726 \r\n3 1400 7109 7108 726 \r\n3 4282 7113 7112 727 \r\n3 4444 7111 7113 727 \r\n3 3307 7112 7111 727 \r\n3 616 7116 7115 728 \r\n3 1793 7114 7116 728 \r\n3 4918 7115 7114 728 \r\n3 404 7118 7117 729 \r\n3 826 6933 7118 729 \r\n3 1948 7117 6933 729 \r\n3 3009 7121 7120 730 \r\n3 4916 7119 7121 730 \r\n3 223 7120 7119 730 \r\n3 1252 7124 7123 731 \r\n3 3688 7122 7124 731 \r\n3 4468 7123 7122 731 \r\n3 1259 7127 7126 732 \r\n3 3042 7125 7127 732 \r\n3 4924 7126 7125 732 \r\n3 1819 7130 7129 733 \r\n3 3750 7128 7130 733 \r\n3 2516 7129 7128 733 \r\n3 532 7133 7132 734 \r\n3 4792 7131 7133 734 \r\n3 4025 7132 7131 734 \r\n3 4012 7136 7135 735 \r\n3 971 7134 7136 735 \r\n3 3805 7135 7134 735 \r\n3 2909 7139 7138 736 \r\n3 1435 7137 7139 736 \r\n3 1446 7138 7137 736 \r\n3 3245 7142 7141 737 \r\n3 1545 7140 7142 737 \r\n3 2180 7141 7140 737 \r\n3 1131 7145 7144 738 \r\n3 2721 7143 7145 738 \r\n3 2663 7144 7143 738 \r\n3 2254 7148 7147 739 \r\n3 250 7146 7148 739 \r\n3 1502 7147 7146 739 \r\n3 4007 7151 7150 740 \r\n3 3809 7149 7151 740 \r\n3 2016 7150 7149 740 \r\n3 2946 7154 7153 741 \r\n3 2696 7152 7154 741 \r\n3 1735 7153 7152 741 \r\n3 3139 7157 7156 742 \r\n3 3941 7155 7157 742 \r\n3 421 7156 7155 742 \r\n3 4190 7160 7159 743 \r\n3 1960 7158 7160 743 \r\n3 2431 7159 7158 743 \r\n3 1928 7163 7162 744 \r\n3 1787 7161 7163 744 \r\n3 2299 7162 7161 744 \r\n3 984 7166 7165 745 \r\n3 3850 7164 7166 745 \r\n3 2252 7165 7164 745 \r\n3 2030 7169 7168 746 \r\n3 1305 7167 7169 746 \r\n3 2691 7168 7167 746 \r\n3 2458 7172 7171 747 \r\n3 1530 7170 7172 747 \r\n3 2528 7171 7170 747 \r\n3 1984 7175 7174 748 \r\n3 1159 7173 7175 748 \r\n3 3847 7174 7173 748 \r\n3 323 7178 7177 749 \r\n3 4272 7176 7178 749 \r\n3 2349 7177 7176 749 \r\n3 459 7181 7180 750 \r\n3 2140 7179 7181 750 \r\n3 2917 7180 7179 750 \r\n3 3271 7184 7183 751 \r\n3 416 7182 7184 751 \r\n3 1517 7183 7182 751 \r\n3 3191 7187 7186 752 \r\n3 1862 7185 7187 752 \r\n3 1465 7186 7185 752 \r\n3 1754 7189 6050 753 \r\n3 788 7188 7189 753 \r\n3 1325 6050 7188 753 \r\n3 448 7192 7191 754 \r\n3 2333 7190 7192 754 \r\n3 864 7191 7190 754 \r\n3 3157 7195 7194 755 \r\n3 3288 7193 7195 755 \r\n3 2109 7194 7193 755 \r\n3 4648 7198 7197 756 \r\n3 3598 7196 7198 756 \r\n3 2346 7197 7196 756 \r\n3 2812 7200 6807 757 \r\n3 3098 7199 7200 757 \r\n3 1339 6807 7199 757 \r\n3 208 7203 7202 758 \r\n3 3376 7201 7203 758 \r\n3 2163 7202 7201 758 \r\n3 74 7206 7205 759 \r\n3 1797 7204 7206 759 \r\n3 4422 7205 7204 759 \r\n3 3104 7209 7208 760 \r\n3 686 7207 7209 760 \r\n3 2226 7208 7207 760 \r\n3 2974 7212 7211 761 \r\n3 619 7210 7212 761 \r\n3 4317 7211 7210 761 \r\n3 1616 7215 7214 762 \r\n3 522 7213 7215 762 \r\n3 4492 7214 7213 762 \r\n3 4064 5176 7036 763 \r\n3 3283 7216 5176 763 \r\n3 1773 7036 7216 763 \r\n3 241 7219 7218 764 \r\n3 3718 7217 7219 764 \r\n3 3891 7218 7217 764 \r\n3 2951 7221 6903 765 \r\n3 3331 7220 7221 765 \r\n3 1776 6903 7220 765 \r\n3 2681 7223 5523 766 \r\n3 3944 7222 7223 766 \r\n3 4265 5523 7222 766 \r\n3 2162 7226 7225 767 \r\n3 3563 7224 7226 767 \r\n3 3405 7225 7224 767 \r\n3 2497 7229 7228 768 \r\n3 3982 7227 7229 768 \r\n3 3780 7228 7227 768 \r\n3 908 7232 7231 769 \r\n3 22 7230 7232 769 \r\n3 354 7231 7230 769 \r\n3 834 7234 6117 770 \r\n3 432 7233 7234 770 \r\n3 1761 6117 7233 770 \r\n3 4752 7237 7236 771 \r\n3 4591 7235 7237 771 \r\n3 1092 7236 7235 771 \r\n3 3719 7240 7239 772 \r\n3 4165 7238 7240 772 \r\n3 2413 7239 7238 772 \r\n3 2075 7242 7241 773 \r\n3 4457 7062 7242 773 \r\n3 4991 7241 7062 773 \r\n3 4131 6941 7243 774 \r\n3 3889 6400 6941 774 \r\n3 1463 7243 6400 774 \r\n3 2706 7245 5938 775 \r\n3 2069 7244 7245 775 \r\n3 1233 5938 7244 775 \r\n3 4402 7248 7247 776 \r\n3 2647 7246 7248 776 \r\n3 700 7247 7246 776 \r\n3 398 7251 7250 777 \r\n3 3910 7249 7251 777 \r\n3 2214 7250 7249 777 \r\n3 4361 7254 7253 778 \r\n3 2678 7252 7254 778 \r\n3 3991 7253 7252 778 \r\n3 2710 6839 7256 779 \r\n3 557 7255 6839 779 \r\n3 30 7256 7255 779 \r\n3 577 7259 7258 780 \r\n3 2954 7257 7259 780 \r\n3 3918 7258 7257 780 \r\n3 2504 7262 7261 781 \r\n3 3446 7260 7262 781 \r\n3 3415 7261 7260 781 \r\n3 563 7264 6947 782 \r\n3 1301 7263 7264 782 \r\n3 2099 6947 7263 782 \r\n3 1547 7266 6783 783 \r\n3 226 7265 7266 783 \r\n3 666 6783 7265 783 \r\n3 3776 7269 7268 784 \r\n3 4749 7267 7269 784 \r\n3 3860 7268 7267 784 \r\n3 1701 7272 7271 785 \r\n3 375 7270 7272 785 \r\n3 2360 7271 7270 785 \r\n3 1205 7275 7274 786 \r\n3 3548 7273 7275 786 \r\n3 1379 7274 7273 786 \r\n3 537 7278 7277 787 \r\n3 3739 7276 7278 787 \r\n3 2489 7277 7276 787 \r\n3 3114 7281 7280 788 \r\n3 3318 7279 7281 788 \r\n3 2640 7280 7279 788 \r\n3 3499 7284 7283 789 \r\n3 4657 7282 7284 789 \r\n3 522 7283 7282 789 \r\n3 2463 7286 5595 790 \r\n3 3923 7285 7286 790 \r\n3 3125 5595 7285 790 \r\n3 1825 7289 7288 791 \r\n3 4251 7287 7289 791 \r\n3 503 7288 7287 791 \r\n3 4887 7292 7291 792 \r\n3 1975 7290 7292 792 \r\n3 4501 7291 7290 792 \r\n3 4194 7295 7294 793 \r\n3 3559 7293 7295 793 \r\n3 3104 7294 7293 793 \r\n3 261 7297 5378 794 \r\n3 2276 7296 7297 794 \r\n3 616 5378 7296 794 \r\n3 4320 7300 7299 795 \r\n3 3949 7298 7300 795 \r\n3 1935 7299 7298 795 \r\n3 3947 7303 7302 796 \r\n3 2394 7301 7303 796 \r\n3 1160 7302 7301 796 \r\n3 3122 7306 7305 797 \r\n3 3951 7304 7306 797 \r\n3 2328 7305 7304 797 \r\n3 3775 7309 7308 798 \r\n3 4377 7307 7309 798 \r\n3 2462 7308 7307 798 \r\n3 3102 7312 7311 799 \r\n3 2978 7310 7312 799 \r\n3 1614 7311 7310 799 \r\n3 4460 7315 7314 800 \r\n3 1553 7313 7315 800 \r\n3 3218 7314 7313 800 \r\n3 1880 7318 7317 801 \r\n3 1968 7316 7318 801 \r\n3 730 7317 7316 801 \r\n3 4896 7321 7320 802 \r\n3 3964 7319 7321 802 \r\n3 99 7320 7319 802 \r\n3 942 7324 7323 803 \r\n3 57 7322 7324 803 \r\n3 962 7323 7322 803 \r\n3 3312 5910 7326 804 \r\n3 2557 7325 5910 804 \r\n3 3552 7326 7325 804 \r\n3 4978 7329 7328 805 \r\n3 4291 7327 7329 805 \r\n3 4078 7328 7327 805 \r\n3 3369 7332 7331 806 \r\n3 1171 7330 7332 806 \r\n3 2005 7331 7330 806 \r\n3 346 6279 7333 807 \r\n3 1280 5355 6279 807 \r\n3 2596 7333 5355 807 \r\n3 3104 7293 7335 808 \r\n3 3559 7334 7293 808 \r\n3 4532 7335 7334 808 \r\n3 3395 7338 7337 809 \r\n3 2471 7336 7338 809 \r\n3 4590 7337 7336 809 \r\n3 3677 7341 7340 810 \r\n3 4825 7339 7341 810 \r\n3 1823 7340 7339 810 \r\n3 480 7344 7343 811 \r\n3 2078 7342 7344 811 \r\n3 435 7343 7342 811 \r\n3 2133 7347 7346 812 \r\n3 3825 7345 7347 812 \r\n3 1045 7346 7345 812 \r\n3 737 7350 7349 813 \r\n3 1963 7348 7350 813 \r\n3 3779 7349 7348 813 \r\n3 4562 7353 7352 814 \r\n3 893 7351 7353 814 \r\n3 1742 7352 7351 814 \r\n3 1302 7356 7355 815 \r\n3 1976 7354 7356 815 \r\n3 723 7355 7354 815 \r\n3 1853 7359 7358 816 \r\n3 2875 7357 7359 816 \r\n3 2535 7358 7357 816 \r\n3 412 7362 7361 817 \r\n3 4540 7360 7362 817 \r\n3 4147 7361 7360 817 \r\n3 4539 7365 7364 818 \r\n3 3910 7363 7365 818 \r\n3 3267 7364 7363 818 \r\n3 4444 7367 7111 819 \r\n3 4456 7366 7367 819 \r\n3 3307 7111 7366 819 \r\n3 1605 7370 7369 820 \r\n3 4514 7368 7370 820 \r\n3 1593 7369 7368 820 \r\n3 1702 7373 7372 821 \r\n3 3063 7371 7373 821 \r\n3 3547 7372 7371 821 \r\n3 2564 7376 7375 822 \r\n3 1358 7374 7376 822 \r\n3 3108 7375 7374 822 \r\n3 4034 7379 7378 823 \r\n3 3593 7377 7379 823 \r\n3 4918 7378 7377 823 \r\n3 4284 7381 5656 824 \r\n3 1846 7380 7381 824 \r\n3 221 5656 7380 824 \r\n3 2072 7384 7383 825 \r\n3 2570 7382 7384 825 \r\n3 2832 7383 7382 825 \r\n3 407 7387 7386 826 \r\n3 4367 7385 7387 826 \r\n3 4080 7386 7385 826 \r\n3 1327 7389 6158 827 \r\n3 2160 7388 7389 827 \r\n3 3304 6158 7388 827 \r\n3 2866 7391 7390 828 \r\n3 1311 6046 7391 828 \r\n3 3203 7390 6046 828 \r\n3 2859 7394 7393 829 \r\n3 2789 7392 7394 829 \r\n3 1010 7393 7392 829 \r\n3 3556 5035 7396 830 \r\n3 2461 7395 5035 830 \r\n3 102 7396 7395 830 \r\n3 1243 7399 7398 831 \r\n3 36 7397 7399 831 \r\n3 1961 7398 7397 831 \r\n3 4024 7402 7401 832 \r\n3 163 7400 7402 832 \r\n3 558 7401 7400 832 \r\n3 1067 7405 7404 833 \r\n3 716 7403 7405 833 \r\n3 57 7404 7403 833 \r\n3 1547 7408 7407 834 \r\n3 4167 7406 7408 834 \r\n3 612 7407 7406 834 \r\n3 631 7411 7410 835 \r\n3 644 7409 7411 835 \r\n3 3540 7410 7409 835 \r\n3 1712 7414 7413 836 \r\n3 2603 7412 7414 836 \r\n3 2861 7413 7412 836 \r\n3 2279 7417 7416 837 \r\n3 1386 7415 7417 837 \r\n3 2422 7416 7415 837 \r\n3 2296 7420 7419 838 \r\n3 1820 7418 7420 838 \r\n3 1568 7419 7418 838 \r\n3 2768 7422 6332 839 \r\n3 4319 7421 7422 839 \r\n3 4009 6332 7421 839 \r\n3 2292 7425 7424 840 \r\n3 285 7423 7425 840 \r\n3 3206 7424 7423 840 \r\n3 3540 7409 7427 841 \r\n3 644 7426 7409 841 \r\n3 3051 7427 7426 841 \r\n3 1202 7430 7429 842 \r\n3 4179 7428 7430 842 \r\n3 4054 7429 7428 842 \r\n3 2324 7433 7432 843 \r\n3 4243 7431 7433 843 \r\n3 75 7432 7431 843 \r\n3 2491 7436 7435 844 \r\n3 3526 7434 7436 844 \r\n3 458 7435 7434 844 \r\n3 4802 7439 7438 845 \r\n3 3226 7437 7439 845 \r\n3 1018 7438 7437 845 \r\n3 1592 7442 7441 846 \r\n3 2878 7440 7442 846 \r\n3 2234 7441 7440 846 \r\n3 2311 7445 7444 847 \r\n3 535 7443 7445 847 \r\n3 2824 7444 7443 847 \r\n3 1613 7448 7447 848 \r\n3 850 7446 7448 848 \r\n3 3785 7447 7446 848 \r\n3 3571 7451 7450 849 \r\n3 4841 7449 7451 849 \r\n3 3343 7450 7449 849 \r\n3 2444 7454 7453 850 \r\n3 4961 7452 7454 850 \r\n3 1768 7453 7452 850 \r\n3 3262 7457 7456 851 \r\n3 949 7455 7457 851 \r\n3 4364 7456 7455 851 \r\n3 271 7460 7459 852 \r\n3 1051 7458 7460 852 \r\n3 3529 7459 7458 852 \r\n3 1223 7463 7462 853 \r\n3 2199 7461 7463 853 \r\n3 4972 7462 7461 853 \r\n3 1583 7466 7465 854 \r\n3 1596 7464 7466 854 \r\n3 387 7465 7464 854 \r\n3 1969 7469 7468 855 \r\n3 1491 7467 7469 855 \r\n3 3336 7468 7467 855 \r\n3 3744 5735 7471 856 \r\n3 4298 7470 5735 856 \r\n3 950 7471 7470 856 \r\n3 4261 7474 7473 857 \r\n3 1047 7472 7474 857 \r\n3 618 7473 7472 857 \r\n3 1708 5085 7476 858 \r\n3 1827 7475 5085 858 \r\n3 725 7476 7475 858 \r\n3 4507 7479 7478 859 \r\n3 854 7477 7479 859 \r\n3 3464 7478 7477 859 \r\n3 3822 7482 7481 860 \r\n3 2021 7480 7482 860 \r\n3 3111 7481 7480 860 \r\n3 1852 5530 7484 861 \r\n3 4939 7483 5530 861 \r\n3 1156 7484 7483 861 \r\n3 496 7487 7486 862 \r\n3 1512 7485 7487 862 \r\n3 4517 7486 7485 862 \r\n3 4888 7490 7489 863 \r\n3 283 7488 7490 863 \r\n3 722 7489 7488 863 \r\n3 816 5721 7492 864 \r\n3 2138 7491 5721 864 \r\n3 943 7492 7491 864 \r\n3 4583 7495 7494 865 \r\n3 95 7493 7495 865 \r\n3 2029 7494 7493 865 \r\n3 3697 7498 7497 866 \r\n3 61 7496 7498 866 \r\n3 1994 7497 7496 866 \r\n3 3746 7501 7500 867 \r\n3 246 7499 7501 867 \r\n3 3740 7500 7499 867 \r\n3 264 7504 7503 868 \r\n3 350 7502 7504 868 \r\n3 3902 7503 7502 868 \r\n3 600 7507 7506 869 \r\n3 4233 7505 7507 869 \r\n3 4068 7506 7505 869 \r\n3 2726 7510 7509 870 \r\n3 893 7508 7510 870 \r\n3 2529 7509 7508 870 \r\n3 588 7512 7511 871 \r\n3 1920 5257 7512 871 \r\n3 2900 7511 5257 871 \r\n3 3758 7515 7514 872 \r\n3 3179 7513 7515 872 \r\n3 691 7514 7513 872 \r\n3 4022 7518 7517 873 \r\n3 1915 7516 7518 873 \r\n3 4995 7517 7516 873 \r\n3 1734 7521 7520 874 \r\n3 3502 7519 7521 874 \r\n3 1699 7520 7519 874 \r\n3 1115 7523 5096 875 \r\n3 604 7522 7523 875 \r\n3 1085 5096 7522 875 \r\n3 955 7526 7525 876 \r\n3 2077 7524 7526 876 \r\n3 1054 7525 7524 876 \r\n3 3034 7529 7528 877 \r\n3 3535 7527 7529 877 \r\n3 1254 7528 7527 877 \r\n3 3432 7532 7531 878 \r\n3 209 7530 7532 878 \r\n3 4685 7531 7530 878 \r\n3 2772 7534 7533 879 \r\n3 2713 6034 7534 879 \r\n3 2369 7533 6034 879 \r\n3 2587 7537 7536 880 \r\n3 1762 7535 7537 880 \r\n3 4300 7536 7535 880 \r\n3 1876 6633 7539 881 \r\n3 4714 7538 6633 881 \r\n3 4084 7539 7538 881 \r\n3 2618 7542 7541 882 \r\n3 4700 7540 7542 882 \r\n3 600 7541 7540 882 \r\n3 4372 7545 7544 883 \r\n3 2371 7543 7545 883 \r\n3 1540 7544 7543 883 \r\n3 4528 7548 7547 884 \r\n3 4735 7546 7548 884 \r\n3 700 7547 7546 884 \r\n3 2090 7550 5836 885 \r\n3 2044 7549 7550 885 \r\n3 3328 5836 7549 885 \r\n3 2186 7553 7552 886 \r\n3 1317 7551 7553 886 \r\n3 4900 7552 7551 886 \r\n3 434 7555 7554 887 \r\n3 3248 6442 7555 887 \r\n3 4359 7554 6442 887 \r\n3 1904 7558 7557 888 \r\n3 4491 7556 7558 888 \r\n3 871 7557 7556 888 \r\n3 9 7561 7560 889 \r\n3 2011 7559 7561 889 \r\n3 3019 7560 7559 889 \r\n3 597 7563 6286 890 \r\n3 3336 7562 7563 890 \r\n3 1501 6286 7562 890 \r\n3 539 7566 7565 891 \r\n3 1497 7564 7566 891 \r\n3 2815 7565 7564 891 \r\n3 1268 7569 7568 892 \r\n3 1691 7567 7569 892 \r\n3 2692 7568 7567 892 \r\n3 2353 7572 7571 893 \r\n3 3084 7570 7572 893 \r\n3 2797 7571 7570 893 \r\n3 2575 7575 7574 894 \r\n3 507 7573 7575 894 \r\n3 4333 7574 7573 894 \r\n3 917 7578 7577 895 \r\n3 1408 7576 7578 895 \r\n3 136 7577 7576 895 \r\n3 228 7581 7580 896 \r\n3 2659 7579 7581 896 \r\n3 97 7580 7579 896 \r\n3 290 7584 7583 897 \r\n3 4862 7582 7584 897 \r\n3 1946 7583 7582 897 \r\n3 1223 7462 7586 898 \r\n3 4972 7585 7462 898 \r\n3 1031 7586 7585 898 \r\n3 2910 7588 7587 899 \r\n3 4808 5846 7588 899 \r\n3 4668 7587 5846 899 \r\n3 2296 7419 7590 900 \r\n3 1568 7589 7419 900 \r\n3 425 7590 7589 900 \r\n3 1940 7592 7057 901 \r\n3 1047 7591 7592 901 \r\n3 1759 7057 7591 901 \r\n3 4433 7595 7594 902 \r\n3 711 7593 7595 902 \r\n3 2750 7594 7593 902 \r\n3 2120 7598 7597 903 \r\n3 4497 7596 7598 903 \r\n3 27 7597 7596 903 \r\n3 3642 7601 7600 904 \r\n3 2843 7599 7601 904 \r\n3 4324 7600 7599 904 \r\n3 4349 7604 7603 905 \r\n3 3671 7602 7604 905 \r\n3 3599 7603 7602 905 \r\n3 26 7607 7606 906 \r\n3 3237 7605 7607 906 \r\n3 32 7606 7605 906 \r\n3 4219 7610 7609 907 \r\n3 2237 7608 7610 907 \r\n3 3441 7609 7608 907 \r\n3 1727 7613 7612 908 \r\n3 2482 7611 7613 908 \r\n3 3189 7612 7611 908 \r\n3 4396 7616 7615 909 \r\n3 3348 7614 7616 909 \r\n3 993 7615 7614 909 \r\n3 3461 7618 6314 910 \r\n3 4952 7617 7618 910 \r\n3 1536 6314 7617 910 \r\n3 2759 7621 7620 911 \r\n3 4051 7619 7621 911 \r\n3 3428 7620 7619 911 \r\n3 4367 7622 7041 912 \r\n3 3562 5070 7622 912 \r\n3 456 7041 5070 912 \r\n3 2103 7625 7624 913 \r\n3 1965 7623 7625 913 \r\n3 4780 7624 7623 913 \r\n3 2899 7628 7627 914 \r\n3 3137 7626 7628 914 \r\n3 4533 7627 7626 914 \r\n3 3990 7631 7630 915 \r\n3 3667 7629 7631 915 \r\n3 3257 7630 7629 915 \r\n3 1340 7633 7632 916 \r\n3 3648 5135 7633 916 \r\n3 4695 7632 5135 916 \r\n3 4807 7636 7635 917 \r\n3 1042 7634 7636 917 \r\n3 2149 7635 7634 917 \r\n3 4942 7639 7638 918 \r\n3 967 7637 7639 918 \r\n3 1116 7638 7637 918 \r\n3 3924 7642 7641 919 \r\n3 4838 7640 7642 919 \r\n3 791 7641 7640 919 \r\n3 2482 7645 7644 920 \r\n3 4316 7643 7645 920 \r\n3 2813 7644 7643 920 \r\n3 3378 7648 7647 921 \r\n3 918 7646 7648 921 \r\n3 1543 7647 7646 921 \r\n3 422 7651 7650 922 \r\n3 4231 7649 7651 922 \r\n3 3670 7650 7649 922 \r\n3 821 7654 7653 923 \r\n3 3080 7652 7654 923 \r\n3 1319 7653 7652 923 \r\n3 4866 7657 7656 924 \r\n3 1110 7655 7657 924 \r\n3 2561 7656 7655 924 \r\n3 3952 7660 7659 925 \r\n3 4527 7658 7660 925 \r\n3 2343 7659 7658 925 \r\n3 868 7663 7662 926 \r\n3 4984 7661 7663 926 \r\n3 4085 7662 7661 926 \r\n3 2300 6530 7665 927 \r\n3 324 7664 6530 927 \r\n3 1006 7665 7664 927 \r\n3 4968 7668 7667 928 \r\n3 4588 7666 7668 928 \r\n3 4611 7667 7666 928 \r\n3 885 7671 7670 929 \r\n3 3141 7669 7671 929 \r\n3 2130 7670 7669 929 \r\n3 2828 6890 7673 930 \r\n3 2506 7672 6890 930 \r\n3 3073 7673 7672 930 \r\n3 246 7675 7499 931 \r\n3 2776 7674 7675 931 \r\n3 3740 7499 7674 931 \r\n3 294 7678 7677 932 \r\n3 1928 7676 7678 932 \r\n3 2795 7677 7676 932 \r\n3 2812 7679 6181 933 \r\n3 1092 7235 7679 933 \r\n3 4591 6181 7235 933 \r\n3 736 7682 7681 934 \r\n3 2436 7680 7682 934 \r\n3 3405 7681 7680 934 \r\n3 1250 7684 7683 935 \r\n3 1210 6163 7684 935 \r\n3 3444 7683 6163 935 \r\n3 3711 7687 7686 936 \r\n3 2860 7685 7687 936 \r\n3 4763 7686 7685 936 \r\n3 4964 7690 7689 937 \r\n3 2950 7688 7690 937 \r\n3 982 7689 7688 937 \r\n3 832 7693 7692 938 \r\n3 3951 7691 7693 938 \r\n3 126 7692 7691 938 \r\n3 1988 7696 7695 939 \r\n3 922 7694 7696 939 \r\n3 1847 7695 7694 939 \r\n3 3730 7699 7698 940 \r\n3 3209 7697 7699 940 \r\n3 4554 7698 7697 940 \r\n3 4510 7702 7701 941 \r\n3 3686 7700 7702 941 \r\n3 1536 7701 7700 941 \r\n3 4159 7705 7704 942 \r\n3 265 7703 7705 942 \r\n3 3359 7704 7703 942 \r\n3 1139 7707 7706 943 \r\n3 1512 6071 7707 943 \r\n3 2819 7706 6071 943 \r\n3 4103 7710 7709 944 \r\n3 3800 7708 7710 944 \r\n3 1362 7709 7708 944 \r\n3 4371 5329 7712 945 \r\n3 2719 7711 5329 945 \r\n3 3865 7712 7711 945 \r\n3 952 7715 7714 946 \r\n3 639 7713 7715 946 \r\n3 4288 7714 7713 946 \r\n3 1453 7718 7717 947 \r\n3 686 7716 7718 947 \r\n3 1498 7717 7716 947 \r\n3 2995 7721 7720 948 \r\n3 2032 7719 7721 948 \r\n3 3814 7720 7719 948 \r\n3 2746 7724 7723 949 \r\n3 4144 7722 7724 949 \r\n3 1673 7723 7722 949 \r\n3 1405 6322 7726 950 \r\n3 2046 7725 6322 950 \r\n3 2968 7726 7725 950 \r\n3 677 7729 7728 951 \r\n3 3476 7727 7729 951 \r\n3 2623 7728 7727 951 \r\n3 3995 7732 7731 952 \r\n3 4684 7730 7732 952 \r\n3 2208 7731 7730 952 \r\n3 3122 7305 7734 953 \r\n3 2328 7733 7305 953 \r\n3 3237 7734 7733 953 \r\n3 3493 7737 7736 954 \r\n3 1473 7735 7737 954 \r\n3 1200 7736 7735 954 \r\n3 3289 7740 7739 955 \r\n3 776 7738 7740 955 \r\n3 1410 7739 7738 955 \r\n3 768 7743 7742 956 \r\n3 1405 7741 7743 956 \r\n3 2727 7742 7741 956 \r\n3 2735 7746 7745 957 \r\n3 166 7744 7746 957 \r\n3 4003 7745 7744 957 \r\n3 536 7749 7748 958 \r\n3 3812 7747 7749 958 \r\n3 3818 7748 7747 958 \r\n3 1738 7752 7751 959 \r\n3 2955 7750 7752 959 \r\n3 4925 7751 7750 959 \r\n3 4264 6878 7754 960 \r\n3 533 7753 6878 960 \r\n3 304 7754 7753 960 \r\n3 4977 7757 7756 961 \r\n3 604 7755 7757 961 \r\n3 1722 7756 7755 961 \r\n3 4284 7760 7759 962 \r\n3 1999 7758 7760 962 \r\n3 3716 7759 7758 962 \r\n3 2849 7763 7762 963 \r\n3 4701 7761 7763 963 \r\n3 211 7762 7761 963 \r\n3 2697 7766 7765 964 \r\n3 4219 7764 7766 964 \r\n3 2191 7765 7764 964 \r\n3 1351 7769 7768 965 \r\n3 2415 7767 7769 965 \r\n3 858 7768 7767 965 \r\n3 1458 7772 7771 966 \r\n3 1664 7770 7772 966 \r\n3 1489 7771 7770 966 \r\n3 1856 5531 7774 967 \r\n3 1852 7773 5531 967 \r\n3 1857 7774 7773 967 \r\n3 3311 7777 7776 968 \r\n3 3806 7775 7777 968 \r\n3 0 7776 7775 968 \r\n3 603 7780 7779 969 \r\n3 4187 7778 7780 969 \r\n3 1866 7779 7778 969 \r\n3 2275 5179 7781 970 \r\n3 3836 6919 5179 970 \r\n3 3740 7781 6919 970 \r\n3 3367 7783 7083 971 \r\n3 3492 7782 7783 971 \r\n3 2973 7083 7782 971 \r\n3 251 7786 7785 972 \r\n3 4933 7784 7786 972 \r\n3 2894 7785 7784 972 \r\n3 2600 7788 7787 973 \r\n3 1091 5246 7788 973 \r\n3 2956 7787 5246 973 \r\n3 1431 7791 7790 974 \r\n3 4339 7789 7791 974 \r\n3 3094 7790 7789 974 \r\n3 4135 7794 7793 975 \r\n3 753 7792 7794 975 \r\n3 1213 7793 7792 975 \r\n3 33 7797 7796 976 \r\n3 2578 7795 7797 976 \r\n3 2437 7796 7795 976 \r\n3 3130 7800 7799 977 \r\n3 33 7798 7800 977 \r\n3 2395 7799 7798 977 \r\n3 3268 7803 7802 978 \r\n3 690 7801 7803 978 \r\n3 454 7802 7801 978 \r\n3 4486 7806 7805 979 \r\n3 3812 7804 7806 979 \r\n3 1865 7805 7804 979 \r\n3 4380 7808 6984 980 \r\n3 1409 7807 7808 980 \r\n3 905 6984 7807 980 \r\n3 4015 7811 7810 981 \r\n3 4477 7809 7811 981 \r\n3 1329 7810 7809 981 \r\n3 1227 7813 6676 982 \r\n3 1641 7812 7813 982 \r\n3 1385 6676 7812 982 \r\n3 79 7816 7815 983 \r\n3 1820 7814 7816 983 \r\n3 2216 7815 7814 983 \r\n3 3383 7819 7818 984 \r\n3 453 7817 7819 984 \r\n3 358 7818 7817 984 \r\n3 880 7821 5144 985 \r\n3 983 7820 7821 985 \r\n3 3033 5144 7820 985 \r\n3 1960 7160 7822 986 \r\n3 4190 5771 7160 986 \r\n3 4982 7822 5771 986 \r\n3 1555 7825 7824 987 \r\n3 2409 7823 7825 987 \r\n3 2749 7824 7823 987 \r\n3 4459 7827 7826 988 \r\n3 1819 7129 7827 988 \r\n3 2516 7826 7129 988 \r\n3 3219 7046 7829 989 \r\n3 421 7828 7046 989 \r\n3 4739 7829 7828 989 \r\n3 962 7832 7831 990 \r\n3 838 7830 7832 990 \r\n3 2942 7831 7830 990 \r\n3 3866 7835 7834 991 \r\n3 4343 7833 7835 991 \r\n3 2793 7834 7833 991 \r\n3 2317 7837 6847 992 \r\n3 3989 7836 7837 992 \r\n3 1992 6847 7836 992 \r\n3 3070 7839 7838 993 \r\n3 547 6702 7839 993 \r\n3 3710 7838 6702 993 \r\n3 4824 7841 7840 994 \r\n3 2349 7176 7841 994 \r\n3 4272 7840 7176 994 \r\n3 3595 7844 7843 995 \r\n3 543 7842 7844 995 \r\n3 2087 7843 7842 995 \r\n3 579 7847 7846 996 \r\n3 4232 7845 7847 996 \r\n3 4757 7846 7845 996 \r\n3 2178 7849 7848 997 \r\n3 1058 6210 7849 997 \r\n3 3871 7848 6210 997 \r\n3 2200 7852 7851 998 \r\n3 2996 7850 7852 998 \r\n3 283 7851 7850 998 \r\n3 2711 7855 7854 999 \r\n3 4253 7853 7855 999 \r\n3 3828 7854 7853 999 \r\n3 1535 7858 7857 1000 \r\n3 2593 7856 7858 1000 \r\n3 4951 7857 7856 1000 \r\n3 960 7861 7860 1001 \r\n3 670 7859 7861 1001 \r\n3 3822 7860 7859 1001 \r\n3 4928 7864 7863 1002 \r\n3 629 7862 7864 1002 \r\n3 4417 7863 7862 1002 \r\n3 3059 7867 7866 1003 \r\n3 1713 7865 7867 1003 \r\n3 1054 7866 7865 1003 \r\n3 3681 7870 7869 1004 \r\n3 4412 7868 7870 1004 \r\n3 2759 7869 7868 1004 \r\n3 2355 7873 7872 1005 \r\n3 4892 7871 7873 1005 \r\n3 757 7872 7871 1005 \r\n3 4354 6639 7875 1006 \r\n3 4401 7874 6639 1006 \r\n3 1967 7875 7874 1006 \r\n3 2547 7878 7877 1007 \r\n3 3349 7876 7878 1007 \r\n3 3324 7877 7876 1007 \r\n3 3338 7881 7880 1008 \r\n3 2017 7879 7881 1008 \r\n3 1668 7880 7879 1008 \r\n3 3809 7883 7882 1009 \r\n3 3492 7783 7883 1009 \r\n3 3367 7882 7783 1009 \r\n3 1385 7885 7067 1010 \r\n3 2881 7884 7885 1010 \r\n3 2619 7067 7884 1010 \r\n3 595 7888 7887 1011 \r\n3 159 7886 7888 1011 \r\n3 736 7887 7886 1011 \r\n3 2194 7891 7890 1012 \r\n3 4708 7889 7891 1012 \r\n3 2693 7890 7889 1012 \r\n3 910 5819 7893 1013 \r\n3 1307 7892 5819 1013 \r\n3 1885 7893 7892 1013 \r\n3 532 7896 7895 1014 \r\n3 2104 7894 7896 1014 \r\n3 11 7895 7894 1014 \r\n3 158 7899 7898 1015 \r\n3 4141 7897 7899 1015 \r\n3 1811 7898 7897 1015 \r\n3 4429 7902 7901 1016 \r\n3 2188 7900 7902 1016 \r\n3 4428 7901 7900 1016 \r\n3 4464 6188 6445 1017 \r\n3 899 7903 6188 1017 \r\n3 479 6445 7903 1017 \r\n3 2219 7906 7905 1018 \r\n3 555 7904 7906 1018 \r\n3 1710 7905 7904 1018 \r\n3 2364 7909 7908 1019 \r\n3 2699 7907 7909 1019 \r\n3 3749 7908 7907 1019 \r\n3 1692 7912 7911 1020 \r\n3 1869 7910 7912 1020 \r\n3 2648 7911 7910 1020 \r\n3 3454 7915 7914 1021 \r\n3 767 7913 7915 1021 \r\n3 3576 7914 7913 1021 \r\n3 2341 7918 7917 1022 \r\n3 671 7916 7918 1022 \r\n3 4133 7917 7916 1022 \r\n3 4195 7921 7920 1023 \r\n3 4634 7919 7921 1023 \r\n3 2014 7920 7919 1023 \r\n3 2419 7923 6375 1024 \r\n3 3714 7922 7923 1024 \r\n3 998 6375 7922 1024 \r\n3 1945 7926 7925 1025 \r\n3 360 7924 7926 1025 \r\n3 412 7925 7924 1025 \r\n3 1866 7929 7928 1026 \r\n3 3072 7927 7929 1026 \r\n3 1996 7928 7927 1026 \r\n3 1569 5518 7931 1027 \r\n3 2011 7930 5518 1027 \r\n3 632 7931 7930 1027 \r\n3 2536 7934 7933 1028 \r\n3 4965 7932 7934 1028 \r\n3 1699 7933 7932 1028 \r\n3 1251 7937 7936 1029 \r\n3 4783 7935 7937 1029 \r\n3 1194 7936 7935 1029 \r\n3 1987 7940 7939 1030 \r\n3 1293 7938 7940 1030 \r\n3 4433 7939 7938 1030 \r\n3 846 7943 7942 1031 \r\n3 3286 7941 7943 1031 \r\n3 232 7942 7941 1031 \r\n3 2137 7946 7945 1032 \r\n3 3164 7944 7946 1032 \r\n3 3913 7945 7944 1032 \r\n3 2019 6151 7948 1033 \r\n3 1300 7947 6151 1033 \r\n3 3605 7948 7947 1033 \r\n3 2192 5606 7950 1034 \r\n3 3774 7949 5606 1034 \r\n3 1564 7950 7949 1034 \r\n3 4376 7953 7952 1035 \r\n3 2879 7951 7953 1035 \r\n3 4224 7952 7951 1035 \r\n3 4887 7956 7955 1036 \r\n3 3387 7954 7956 1036 \r\n3 159 7955 7954 1036 \r\n3 289 7959 7958 1037 \r\n3 367 7957 7959 1037 \r\n3 1726 7958 7957 1037 \r\n3 3811 7961 6759 1038 \r\n3 3885 7960 7961 1038 \r\n3 4561 6759 7960 1038 \r\n3 2003 7964 7963 1039 \r\n3 3313 7962 7964 1039 \r\n3 4534 7963 7962 1039 \r\n3 2301 7967 7966 1040 \r\n3 3707 7965 7967 1040 \r\n3 135 7966 7965 1040 \r\n3 4475 7970 7969 1041 \r\n3 2647 7968 7970 1041 \r\n3 1454 7969 7968 1041 \r\n3 2058 7972 7971 1042 \r\n3 1512 7487 7972 1042 \r\n3 496 7971 7487 1042 \r\n3 954 7975 7974 1043 \r\n3 4276 7973 7975 1043 \r\n3 2350 7974 7973 1043 \r\n3 4429 7977 7976 1044 \r\n3 3960 5120 7977 1044 \r\n3 3421 7976 5120 1044 \r\n3 1066 7980 7979 1045 \r\n3 3347 7978 7980 1045 \r\n3 4487 7979 7978 1045 \r\n3 2871 7983 7982 1046 \r\n3 738 7981 7983 1046 \r\n3 3524 7982 7981 1046 \r\n3 4547 7986 7985 1047 \r\n3 2940 7984 7986 1047 \r\n3 1157 7985 7984 1047 \r\n3 4836 7989 7988 1048 \r\n3 95 7987 7989 1048 \r\n3 3317 7988 7987 1048 \r\n3 4338 7992 7991 1049 \r\n3 1001 7990 7992 1049 \r\n3 493 7991 7990 1049 \r\n3 222 7995 7994 1050 \r\n3 4458 7993 7995 1050 \r\n3 429 7994 7993 1050 \r\n3 1302 7997 7996 1051 \r\n3 1642 6018 7997 1051 \r\n3 4070 7996 6018 1051 \r\n3 4886 8000 7999 1052 \r\n3 497 7998 8000 1052 \r\n3 3582 7999 7998 1052 \r\n3 2786 8003 8002 1053 \r\n3 2665 8001 8003 1053 \r\n3 2376 8002 8001 1053 \r\n3 1468 5669 8005 1054 \r\n3 1363 8004 5669 1054 \r\n3 1775 8005 8004 1054 \r\n3 2034 8008 8007 1055 \r\n3 4040 8006 8008 1055 \r\n3 3920 8007 8006 1055 \r\n3 1481 8011 8010 1056 \r\n3 3910 8009 8011 1056 \r\n3 3005 8010 8009 1056 \r\n3 3693 8014 8013 1057 \r\n3 4126 8012 8014 1057 \r\n3 3030 8013 8012 1057 \r\n3 1273 8016 5787 1058 \r\n3 3735 8015 8016 1058 \r\n3 2796 5787 8015 1058 \r\n3 868 8019 8018 1059 \r\n3 802 8017 8019 1059 \r\n3 2930 8018 8017 1059 \r\n3 662 8022 8021 1060 \r\n3 3363 8020 8022 1060 \r\n3 3164 8021 8020 1060 \r\n3 4508 8025 8024 1061 \r\n3 3107 8023 8025 1061 \r\n3 928 8024 8023 1061 \r\n3 3693 8027 8014 1062 \r\n3 1177 8026 8027 1062 \r\n3 4126 8014 8026 1062 \r\n3 865 8030 8029 1063 \r\n3 1195 8028 8030 1063 \r\n3 311 8029 8028 1063 \r\n3 4256 6139 5986 1064 \r\n3 3708 8031 6139 1064 \r\n3 2765 5986 8031 1064 \r\n3 4078 8034 8033 1065 \r\n3 4568 8032 8034 1065 \r\n3 1915 8033 8032 1065 \r\n3 877 8037 8036 1066 \r\n3 4780 8035 8037 1066 \r\n3 2620 8036 8035 1066 \r\n3 1687 6419 8039 1067 \r\n3 2767 8038 6419 1067 \r\n3 314 8039 8038 1067 \r\n3 2716 8041 8040 1068 \r\n3 1291 6508 8041 1068 \r\n3 3726 8040 6508 1068 \r\n3 3691 8044 8043 1069 \r\n3 1524 8042 8044 1069 \r\n3 2872 8043 8042 1069 \r\n3 2039 8047 8046 1070 \r\n3 4889 8045 8047 1070 \r\n3 3977 8046 8045 1070 \r\n3 1394 8048 5681 1071 \r\n3 802 6378 8048 1071 \r\n3 3572 5681 6378 1071 \r\n3 2392 8051 8050 1072 \r\n3 4101 8049 8051 1072 \r\n3 4640 8050 8049 1072 \r\n3 4022 7517 8053 1073 \r\n3 4995 8052 7517 1073 \r\n3 969 8053 8052 1073 \r\n3 4128 8055 6169 1074 \r\n3 2076 8054 8055 1074 \r\n3 3751 6169 8054 1074 \r\n3 3403 8058 8057 1075 \r\n3 3536 8056 8058 1075 \r\n3 744 8057 8056 1075 \r\n3 2846 8060 8059 1076 \r\n3 3937 5390 8060 1076 \r\n3 29 8059 5390 1076 \r\n3 3425 8063 8062 1077 \r\n3 4111 8061 8063 1077 \r\n3 4885 8062 8061 1077 \r\n3 2673 8066 8065 1078 \r\n3 4116 8064 8066 1078 \r\n3 4408 8065 8064 1078 \r\n3 2843 8068 7599 1079 \r\n3 3358 8067 8068 1079 \r\n3 4324 7599 8067 1079 \r\n3 3866 8071 8070 1080 \r\n3 556 8069 8071 1080 \r\n3 2088 8070 8069 1080 \r\n3 488 8074 8073 1081 \r\n3 269 8072 8074 1081 \r\n3 3720 8073 8072 1081 \r\n3 3525 8077 8076 1082 \r\n3 2460 8075 8077 1082 \r\n3 2195 8076 8075 1082 \r\n3 99 8080 8079 1083 \r\n3 4664 8078 8080 1083 \r\n3 2817 8079 8078 1083 \r\n3 4431 8083 8082 1084 \r\n3 2662 8081 8083 1084 \r\n3 281 8082 8081 1084 \r\n3 572 8086 8085 1085 \r\n3 1000 8084 8086 1085 \r\n3 2593 8085 8084 1085 \r\n3 1571 8089 8088 1086 \r\n3 3402 8087 8089 1086 \r\n3 4325 8088 8087 1086 \r\n3 1166 8092 8091 1087 \r\n3 2317 8090 8092 1087 \r\n3 4624 8091 8090 1087 \r\n3 2468 8095 8094 1088 \r\n3 2025 8093 8095 1088 \r\n3 2888 8094 8093 1088 \r\n3 4879 8098 8097 1089 \r\n3 3223 8096 8098 1089 \r\n3 1332 8097 8096 1089 \r\n3 4279 8101 8100 1090 \r\n3 553 8099 8101 1090 \r\n3 401 8100 8099 1090 \r\n3 693 8104 8103 1091 \r\n3 2177 8102 8104 1091 \r\n3 2378 8103 8102 1091 \r\n3 4782 8107 8106 1092 \r\n3 1079 8105 8107 1092 \r\n3 4805 8106 8105 1092 \r\n3 1921 8110 8109 1093 \r\n3 4570 8108 8110 1093 \r\n3 351 8109 8108 1093 \r\n3 4075 8112 7102 1094 \r\n3 3130 8111 8112 1094 \r\n3 701 7102 8111 1094 \r\n3 1318 5740 8114 1095 \r\n3 4931 8113 5740 1095 \r\n3 2334 8114 8113 1095 \r\n3 3163 8117 8116 1096 \r\n3 828 8115 8117 1096 \r\n3 2595 8116 8115 1096 \r\n3 834 6116 8119 1097 \r\n3 2122 8118 6116 1097 \r\n3 927 8119 8118 1097 \r\n3 2939 8122 8121 1098 \r\n3 2126 8120 8122 1098 \r\n3 2488 8121 8120 1098 \r\n3 4688 8125 8124 1099 \r\n3 1648 8123 8125 1099 \r\n3 1354 8124 8123 1099 \r\n3 458 8128 8127 1100 \r\n3 3205 8126 8128 1100 \r\n3 556 8127 8126 1100 \r\n3 1935 8130 7299 1101 \r\n3 3328 8129 8130 1101 \r\n3 4320 7299 8129 1101 \r\n3 245 8132 5500 1102 \r\n3 3015 8131 8132 1102 \r\n3 4311 5500 8131 1102 \r\n3 1377 8134 8133 1103 \r\n3 2155 6499 8134 1103 \r\n3 4268 8133 6499 1103 \r\n3 3142 8137 8136 1104 \r\n3 2534 8135 8137 1104 \r\n3 1638 8136 8135 1104 \r\n3 4230 8140 8139 1105 \r\n3 1378 8138 8140 1105 \r\n3 4585 8139 8138 1105 \r\n3 398 5156 8142 1106 \r\n3 3830 8141 5156 1106 \r\n3 3005 8142 8141 1106 \r\n3 686 7718 8144 1107 \r\n3 1453 8143 7718 1107 \r\n3 3703 8144 8143 1107 \r\n3 1751 8147 8146 1108 \r\n3 1031 8145 8147 1108 \r\n3 193 8146 8145 1108 \r\n3 2381 8150 8149 1109 \r\n3 1771 8148 8150 1109 \r\n3 2239 8149 8148 1109 \r\n3 2423 8153 8152 1110 \r\n3 1587 8151 8153 1110 \r\n3 203 8152 8151 1110 \r\n3 2676 8156 8155 1111 \r\n3 4411 8154 8156 1111 \r\n3 1091 8155 8154 1111 \r\n3 4852 8159 8158 1112 \r\n3 1922 8157 8159 1112 \r\n3 898 8158 8157 1112 \r\n3 479 8161 6583 1113 \r\n3 1694 8160 8161 1113 \r\n3 3606 6583 8160 1113 \r\n3 3051 8164 8163 1114 \r\n3 3031 8162 8164 1114 \r\n3 3509 8163 8162 1114 \r\n3 311 8166 8029 1115 \r\n3 4531 8165 8166 1115 \r\n3 865 8029 8165 1115 \r\n3 2599 8169 8168 1116 \r\n3 120 8167 8169 1116 \r\n3 1973 8168 8167 1116 \r\n3 2413 7238 8171 1117 \r\n3 4165 8170 7238 1117 \r\n3 3390 8171 8170 1117 \r\n3 1124 8174 8173 1118 \r\n3 4356 8172 8174 1118 \r\n3 4266 8173 8172 1118 \r\n3 4959 8177 8176 1119 \r\n3 2223 8175 8177 1119 \r\n3 4192 8176 8175 1119 \r\n3 53 8179 8178 1120 \r\n3 4886 7999 8179 1120 \r\n3 3582 8178 7999 1120 \r\n3 4681 8182 8181 1121 \r\n3 795 8180 8182 1121 \r\n3 4971 8181 8180 1121 \r\n3 1381 8185 8184 1122 \r\n3 3730 8183 8185 1122 \r\n3 2851 8184 8183 1122 \r\n3 4439 8187 8186 1123 \r\n3 803 6823 8187 1123 \r\n3 3327 8186 6823 1123 \r\n3 4339 8190 8189 1124 \r\n3 2563 8188 8190 1124 \r\n3 2203 8189 8188 1124 \r\n3 3902 8193 8192 1125 \r\n3 734 8191 8193 1125 \r\n3 4539 8192 8191 1125 \r\n3 282 8196 8195 1126 \r\n3 2437 8194 8196 1126 \r\n3 1374 8195 8194 1126 \r\n3 4240 8198 5445 1127 \r\n3 4942 8197 8198 1127 \r\n3 3817 5445 8197 1127 \r\n3 1988 8200 7696 1128 \r\n3 2331 8199 8200 1128 \r\n3 922 7696 8199 1128 \r\n3 325 8203 8202 1129 \r\n3 2708 8201 8203 1129 \r\n3 284 8202 8201 1129 \r\n3 2716 8206 8205 1130 \r\n3 2861 8204 8206 1130 \r\n3 1746 8205 8204 1130 \r\n3 3685 8208 5727 1131 \r\n3 2783 8207 8208 1131 \r\n3 2175 5727 8207 1131 \r\n3 2902 8211 8210 1132 \r\n3 3708 8209 8211 1132 \r\n3 1748 8210 8209 1132 \r\n3 1447 8213 8212 1133 \r\n3 2118 5928 8213 1133 \r\n3 1824 8212 5928 1133 \r\n3 1129 8216 8215 1134 \r\n3 875 8214 8216 1134 \r\n3 533 8215 8214 1134 \r\n3 3191 8218 7187 1135 \r\n3 3285 8217 8218 1135 \r\n3 1862 7187 8217 1135 \r\n3 3217 6895 8220 1136 \r\n3 405 8219 6895 1136 \r\n3 267 8220 8219 1136 \r\n3 1511 8223 8222 1137 \r\n3 4245 8221 8223 1137 \r\n3 1214 8222 8221 1137 \r\n3 4086 8226 8225 1138 \r\n3 2089 8224 8226 1138 \r\n3 2655 8225 8224 1138 \r\n3 2358 8229 8228 1139 \r\n3 50 8227 8229 1139 \r\n3 546 8228 8227 1139 \r\n3 464 8231 8230 1140 \r\n3 998 7922 8231 1140 \r\n3 3714 8230 7922 1140 \r\n3 2885 8234 8233 1141 \r\n3 3804 8232 8234 1141 \r\n3 4153 8233 8232 1141 \r\n3 910 7893 8236 1142 \r\n3 1885 8235 7893 1142 \r\n3 124 8236 8235 1142 \r\n3 3149 8239 8238 1143 \r\n3 4508 8237 8239 1143 \r\n3 4144 8238 8237 1143 \r\n3 17 8241 8240 1144 \r\n3 1754 6052 8241 1144 \r\n3 3900 8240 6052 1144 \r\n3 1716 8244 8243 1145 \r\n3 3366 8242 8244 1145 \r\n3 4851 8243 8242 1145 \r\n3 3539 8247 8246 1146 \r\n3 2825 8245 8247 1146 \r\n3 78 8246 8245 1146 \r\n3 3865 7711 8249 1147 \r\n3 2719 8248 7711 1147 \r\n3 3620 8249 8248 1147 \r\n3 3852 5851 8251 1148 \r\n3 3004 8250 5851 1148 \r\n3 2964 8251 8250 1148 \r\n3 2650 8254 8253 1149 \r\n3 197 8252 8254 1149 \r\n3 4294 8253 8252 1149 \r\n3 4635 8257 8256 1150 \r\n3 3700 8255 8257 1150 \r\n3 4217 8256 8255 1150 \r\n3 1833 8260 8259 1151 \r\n3 588 8258 8260 1151 \r\n3 2891 8259 8258 1151 \r\n3 3795 8263 8262 1152 \r\n3 2778 8261 8263 1152 \r\n3 560 8262 8261 1152 \r\n3 1296 8266 8265 1153 \r\n3 1332 8264 8266 1153 \r\n3 4620 8265 8264 1153 \r\n3 4708 5151 6739 1154 \r\n3 599 8267 5151 1154 \r\n3 4220 6739 8267 1154 \r\n3 4108 8269 8268 1155 \r\n3 4757 7845 8269 1155 \r\n3 4232 8268 7845 1155 \r\n3 4854 8272 8271 1156 \r\n3 3498 8270 8272 1156 \r\n3 4276 8271 8270 1156 \r\n3 4219 5730 7610 1157 \r\n3 2938 8273 5730 1157 \r\n3 2237 7610 8273 1157 \r\n3 2201 8275 8274 1158 \r\n3 4179 7430 8275 1158 \r\n3 1202 8274 7430 1158 \r\n3 4795 8278 8277 1159 \r\n3 1710 8276 8278 1159 \r\n3 2037 8277 8276 1159 \r\n3 2742 8281 8280 1160 \r\n3 613 8279 8281 1160 \r\n3 3881 8280 8279 1160 \r\n3 2301 8284 8283 1161 \r\n3 21 8282 8284 1161 \r\n3 3361 8283 8282 1161 \r\n3 2865 8287 8286 1162 \r\n3 4742 8285 8287 1162 \r\n3 145 8286 8285 1162 \r\n3 1808 8289 8288 1163 \r\n3 3525 8076 8289 1163 \r\n3 2195 8288 8076 1163 \r\n3 4156 8291 8290 1164 \r\n3 4888 7489 8291 1164 \r\n3 722 8290 7489 1164 \r\n3 2916 8293 8292 1165 \r\n3 4261 7473 8293 1165 \r\n3 618 8292 7473 1165 \r\n3 733 8296 8295 1166 \r\n3 2193 8294 8296 1166 \r\n3 3788 8295 8294 1166 \r\n3 1208 8298 8297 1167 \r\n3 652 5981 8298 1167 \r\n3 703 8297 5981 1167 \r\n3 2513 8300 8299 1168 \r\n3 2707 6904 8300 1168 \r\n3 1776 8299 6904 1168 \r\n3 4398 8303 8302 1169 \r\n3 1446 8301 8303 1169 \r\n3 1772 8302 8301 1169 \r\n3 1907 8306 8305 1170 \r\n3 799 8304 8306 1170 \r\n3 1814 8305 8304 1170 \r\n3 2339 8309 8308 1171 \r\n3 2366 8307 8309 1171 \r\n3 2191 8308 8307 1171 \r\n3 1865 8311 7805 1172 \r\n3 1049 8310 8311 1172 \r\n3 4486 7805 8310 1172 \r\n3 3453 8313 8312 1173 \r\n3 2226 7207 8313 1173 \r\n3 686 8312 7207 1173 \r\n3 898 8315 8158 1174 \r\n3 3500 8314 8315 1174 \r\n3 4852 8158 8314 1174 \r\n3 1043 8318 8317 1175 \r\n3 4965 8316 8318 1175 \r\n3 2760 8317 8316 1175 \r\n3 1217 8321 8320 1176 \r\n3 4495 8319 8321 1176 \r\n3 2087 8320 8319 1176 \r\n3 3436 8324 8323 1177 \r\n3 1706 8322 8324 1177 \r\n3 1963 8323 8322 1177 \r\n3 720 8327 8326 1178 \r\n3 2926 8325 8327 1178 \r\n3 1268 8326 8325 1178 \r\n3 3096 5838 8329 1179 \r\n3 1181 8328 5838 1179 \r\n3 4856 8329 8328 1179 \r\n3 859 8332 8331 1180 \r\n3 2938 8330 8332 1180 \r\n3 4614 8331 8330 1180 \r\n3 3195 6572 8334 1181 \r\n3 35 8333 6572 1181 \r\n3 3519 8334 8333 1181 \r\n3 3135 8337 8336 1182 \r\n3 466 8335 8337 1182 \r\n3 737 8336 8335 1182 \r\n3 1787 7163 8339 1183 \r\n3 1928 8338 7163 1183 \r\n3 1107 8339 8338 1183 \r\n3 3084 8342 8341 1184 \r\n3 4507 8340 8342 1184 \r\n3 316 8341 8340 1184 \r\n3 735 8345 8344 1185 \r\n3 4885 8343 8345 1185 \r\n3 1085 8344 8343 1185 \r\n3 4828 8347 8346 1186 \r\n3 3103 6773 8347 1186 \r\n3 1609 8346 6773 1186 \r\n3 2423 8350 8349 1187 \r\n3 4652 8348 8350 1187 \r\n3 1346 8349 8348 1187 \r\n3 4567 8353 8352 1188 \r\n3 4613 8351 8353 1188 \r\n3 4315 8352 8351 1188 \r\n3 3366 8356 8355 1189 \r\n3 3948 8354 8356 1189 \r\n3 2261 8355 8354 1189 \r\n3 3241 8359 8358 1190 \r\n3 1913 8357 8359 1190 \r\n3 2264 8358 8357 1190 \r\n3 680 8362 8361 1191 \r\n3 3781 8360 8362 1191 \r\n3 3433 8361 8360 1191 \r\n3 4561 8365 8364 1192 \r\n3 1858 8363 8365 1192 \r\n3 3138 8364 8363 1192 \r\n3 2623 8367 7728 1193 \r\n3 623 8366 8367 1193 \r\n3 677 7728 8366 1193 \r\n3 1231 8370 8369 1194 \r\n3 2043 8368 8370 1194 \r\n3 4552 8369 8368 1194 \r\n3 344 8373 8372 1195 \r\n3 2840 8371 8373 1195 \r\n3 209 8372 8371 1195 \r\n3 2571 6086 8374 1196 \r\n3 1334 5148 6086 1196 \r\n3 4117 8374 5148 1196 \r\n3 4933 7786 8376 1197 \r\n3 251 8375 7786 1197 \r\n3 3612 8376 8375 1197 \r\n3 4199 6334 8377 1198 \r\n3 3597 5052 6334 1198 \r\n3 3640 8377 5052 1198 \r\n3 2322 8380 8379 1199 \r\n3 1590 8378 8380 1199 \r\n3 801 8379 8378 1199 \r\n3 3877 8383 8382 1200 \r\n3 2842 8381 8383 1200 \r\n3 3617 8382 8381 1200 \r\n3 2972 8386 8385 1201 \r\n3 4778 8384 8386 1201 \r\n3 862 8385 8384 1201 \r\n3 4342 6319 8388 1202 \r\n3 1626 8387 6319 1202 \r\n3 3747 8388 8387 1202 \r\n3 2262 8390 8389 1203 \r\n3 35 6571 8390 1203 \r\n3 3142 8389 6571 1203 \r\n3 175 8393 8392 1204 \r\n3 2588 8391 8393 1204 \r\n3 2576 8392 8391 1204 \r\n3 1052 8396 8395 1205 \r\n3 1554 8394 8396 1205 \r\n3 3031 8395 8394 1205 \r\n3 3454 8398 7915 1206 \r\n3 1816 8397 8398 1206 \r\n3 767 7915 8397 1206 \r\n3 3706 8401 8400 1207 \r\n3 2312 8399 8401 1207 \r\n3 1478 8400 8399 1207 \r\n3 1104 8404 8403 1208 \r\n3 2805 8402 8404 1208 \r\n3 2519 8403 8402 1208 \r\n3 2614 5762 8406 1209 \r\n3 1632 8405 5762 1209 \r\n3 4823 8406 8405 1209 \r\n3 4465 8409 8408 1210 \r\n3 3159 8407 8409 1210 \r\n3 3955 8408 8407 1210 \r\n3 4488 8412 8411 1211 \r\n3 1457 8410 8412 1211 \r\n3 1068 8411 8410 1211 \r\n3 3906 8415 8414 1212 \r\n3 4188 8413 8415 1212 \r\n3 70 8414 8413 1212 \r\n3 1508 8418 8417 1213 \r\n3 3837 8416 8418 1213 \r\n3 1864 8417 8416 1213 \r\n3 2851 8421 8420 1214 \r\n3 791 8419 8421 1214 \r\n3 2641 8420 8419 1214 \r\n3 3554 8424 8423 1215 \r\n3 4174 8422 8424 1215 \r\n3 4844 8423 8422 1215 \r\n3 2719 8427 8426 1216 \r\n3 356 8425 8427 1216 \r\n3 2653 8426 8425 1216 \r\n3 3103 6640 6774 1217 \r\n3 4354 8428 6640 1217 \r\n3 1600 6774 8428 1217 \r\n3 4794 8431 8430 1218 \r\n3 432 8429 8431 1218 \r\n3 974 8430 8429 1218 \r\n3 2013 8434 8433 1219 \r\n3 3413 8432 8434 1219 \r\n3 1286 8433 8432 1219 \r\n3 4742 8436 8285 1220 \r\n3 3577 8435 8436 1220 \r\n3 145 8285 8435 1220 \r\n3 3590 8438 6638 1221 \r\n3 1362 8437 8438 1221 \r\n3 2384 6638 8437 1221 \r\n3 1954 8440 6811 1222 \r\n3 4514 8439 8440 1222 \r\n3 1955 6811 8439 1222 \r\n3 1770 8443 8442 1223 \r\n3 2727 8441 8443 1223 \r\n3 860 8442 8441 1223 \r\n3 2916 8292 8445 1224 \r\n3 618 8444 8292 1224 \r\n3 2194 8445 8444 1224 \r\n3 990 8448 8447 1225 \r\n3 2494 8446 8448 1225 \r\n3 4296 8447 8446 1225 \r\n3 4987 8451 8450 1226 \r\n3 4523 8449 8451 1226 \r\n3 876 8450 8449 1226 \r\n3 2793 8454 8453 1227 \r\n3 3516 8452 8454 1227 \r\n3 4761 8453 8452 1227 \r\n3 3602 8457 8456 1228 \r\n3 216 8455 8457 1228 \r\n3 1578 8456 8455 1228 \r\n3 866 8460 8459 1229 \r\n3 1051 8458 8460 1229 \r\n3 60 8459 8458 1229 \r\n3 1275 5885 8462 1230 \r\n3 4660 8461 5885 1230 \r\n3 238 8462 8461 1230 \r\n3 3030 8465 8464 1231 \r\n3 1634 8463 8465 1231 \r\n3 2773 8464 8463 1231 \r\n3 4876 8468 8467 1232 \r\n3 2373 8466 8468 1232 \r\n3 4292 8467 8466 1232 \r\n3 2662 8471 8470 1233 \r\n3 2709 8469 8471 1233 \r\n3 4437 8470 8469 1233 \r\n3 1590 8474 8473 1234 \r\n3 1473 8472 8474 1234 \r\n3 1372 8473 8472 1234 \r\n3 296 8477 8476 1235 \r\n3 2377 8475 8477 1235 \r\n3 252 8476 8475 1235 \r\n3 131 8480 8479 1236 \r\n3 4907 8478 8480 1236 \r\n3 2420 8479 8478 1236 \r\n3 1645 6968 8482 1237 \r\n3 3661 8481 6968 1237 \r\n3 4937 8482 8481 1237 \r\n3 2825 8485 8484 1238 \r\n3 3588 8483 8485 1238 \r\n3 4800 8484 8483 1238 \r\n3 4753 8488 8487 1239 \r\n3 4663 8486 8488 1239 \r\n3 2891 8487 8486 1239 \r\n3 290 8491 8490 1240 \r\n3 338 8489 8491 1240 \r\n3 3881 8490 8489 1240 \r\n3 2091 8493 8492 1241 \r\n3 4896 5091 8493 1241 \r\n3 609 8492 5091 1241 \r\n3 4727 8496 8495 1242 \r\n3 1607 8494 8496 1242 \r\n3 3389 8495 8494 1242 \r\n3 3515 8499 8498 1243 \r\n3 1248 8497 8499 1243 \r\n3 1999 8498 8497 1243 \r\n3 947 8501 8500 1244 \r\n3 799 8306 8501 1244 \r\n3 1907 8500 8306 1244 \r\n3 2841 8504 8503 1245 \r\n3 203 8502 8504 1245 \r\n3 201 8503 8502 1245 \r\n3 3174 8507 8506 1246 \r\n3 3034 8505 8507 1246 \r\n3 1868 8506 8505 1246 \r\n3 651 8510 8509 1247 \r\n3 87 8508 8510 1247 \r\n3 1683 8509 8508 1247 \r\n3 986 8513 8512 1248 \r\n3 3206 8511 8513 1248 \r\n3 2791 8512 8511 1248 \r\n3 3294 5892 8515 1249 \r\n3 2448 8514 5892 1249 \r\n3 4909 8515 8514 1249 \r\n3 899 6190 8517 1250 \r\n3 2105 8516 6190 1250 \r\n3 3763 8517 8516 1250 \r\n3 2643 8520 8519 1251 \r\n3 2352 8518 8520 1251 \r\n3 964 8519 8518 1251 \r\n3 578 8523 8522 1252 \r\n3 352 8521 8523 1252 \r\n3 1404 8522 8521 1252 \r\n3 2638 8526 8525 1253 \r\n3 3267 8524 8526 1253 \r\n3 2689 8525 8524 1253 \r\n3 1215 8529 8528 1254 \r\n3 4855 8527 8529 1254 \r\n3 429 8528 8527 1254 \r\n3 3420 8532 8531 1255 \r\n3 2899 8530 8532 1255 \r\n3 1581 8531 8530 1255 \r\n3 3026 8535 8534 1256 \r\n3 737 8533 8535 1256 \r\n3 1365 8534 8533 1256 \r\n3 1581 8538 8537 1257 \r\n3 4988 8536 8538 1257 \r\n3 1279 8537 8536 1257 \r\n3 2997 8540 8539 1258 \r\n3 788 7189 8540 1258 \r\n3 1754 8539 7189 1258 \r\n3 3438 8543 8542 1259 \r\n3 2558 8541 8543 1259 \r\n3 2908 8542 8541 1259 \r\n3 1916 8546 8545 1260 \r\n3 2127 8544 8546 1260 \r\n3 4053 8545 8544 1260 \r\n3 1152 8549 8548 1261 \r\n3 660 8547 8549 1261 \r\n3 2315 8548 8547 1261 \r\n3 2352 8520 8551 1262 \r\n3 2643 8550 8520 1262 \r\n3 2370 8551 8550 1262 \r\n3 4191 8554 8553 1263 \r\n3 1083 8552 8554 1263 \r\n3 3736 8553 8552 1263 \r\n3 4215 8557 8556 1264 \r\n3 2154 8555 8557 1264 \r\n3 3048 8556 8555 1264 \r\n3 1258 8559 8558 1265 \r\n3 3187 5587 8559 1265 \r\n3 145 8558 5587 1265 \r\n3 363 8562 8561 1266 \r\n3 3158 8560 8562 1266 \r\n3 3680 8561 8560 1266 \r\n3 1894 5153 8564 1267 \r\n3 4924 8563 5153 1267 \r\n3 1421 8564 8563 1267 \r\n3 711 8566 5815 1268 \r\n3 576 8565 8566 1268 \r\n3 4650 5815 8565 1268 \r\n3 2702 7079 8567 1269 \r\n3 1705 6578 7079 1269 \r\n3 1989 8567 6578 1269 \r\n3 1845 8570 8569 1270 \r\n3 3166 8568 8570 1270 \r\n3 4857 8569 8568 1270 \r\n3 4576 8572 8571 1271 \r\n3 860 8441 8572 1271 \r\n3 2727 8571 8441 1271 \r\n3 2237 8574 7608 1272 \r\n3 3834 8573 8574 1272 \r\n3 3441 7608 8573 1272 \r\n3 2170 8577 8576 1273 \r\n3 1578 8575 8577 1273 \r\n3 1383 8576 8575 1273 \r\n3 119 8580 8579 1274 \r\n3 91 8578 8580 1274 \r\n3 3055 8579 8578 1274 \r\n3 919 8583 8582 1275 \r\n3 4405 8581 8583 1275 \r\n3 130 8582 8581 1275 \r\n3 4934 8586 8585 1276 \r\n3 4237 8584 8586 1276 \r\n3 726 8585 8584 1276 \r\n3 1794 8589 8588 1277 \r\n3 801 8587 8589 1277 \r\n3 2108 8588 8587 1277 \r\n3 2009 8592 8591 1278 \r\n3 1806 8590 8592 1278 \r\n3 3169 8591 8590 1278 \r\n3 2800 8595 8594 1279 \r\n3 1826 8593 8595 1279 \r\n3 4665 8594 8593 1279 \r\n3 3029 8598 8597 1280 \r\n3 4236 8596 8598 1280 \r\n3 2263 8597 8596 1280 \r\n3 1326 8601 8600 1281 \r\n3 3307 8599 8601 1281 \r\n3 2327 8600 8599 1281 \r\n3 2049 5911 8603 1282 \r\n3 4678 8602 5911 1282 \r\n3 3455 8603 8602 1282 \r\n3 3243 8606 8605 1283 \r\n3 1498 8604 8606 1283 \r\n3 1415 8605 8604 1283 \r\n3 3870 8608 6000 1284 \r\n3 1197 8607 8608 1284 \r\n3 906 6000 8607 1284 \r\n3 4069 8611 8610 1285 \r\n3 1044 8609 8611 1285 \r\n3 3272 8610 8609 1285 \r\n3 3533 8614 8613 1286 \r\n3 2941 8612 8614 1286 \r\n3 3656 8613 8612 1286 \r\n3 3601 8617 8616 1287 \r\n3 1003 8615 8617 1287 \r\n3 4484 8616 8615 1287 \r\n3 1898 8619 8618 1288 \r\n3 3920 8006 8619 1288 \r\n3 4040 8618 8006 1288 \r\n3 2477 8622 8621 1289 \r\n3 280 8620 8622 1289 \r\n3 1351 8621 8620 1289 \r\n3 1500 8625 8624 1290 \r\n3 1048 8623 8625 1290 \r\n3 4966 8624 8623 1290 \r\n3 4412 7870 8627 1291 \r\n3 3681 8626 7870 1291 \r\n3 2112 8627 8626 1291 \r\n3 4647 8630 8629 1292 \r\n3 879 8628 8630 1292 \r\n3 2703 8629 8628 1292 \r\n3 2781 8633 8632 1293 \r\n3 1140 8631 8633 1293 \r\n3 3022 8632 8631 1293 \r\n3 1901 8636 8635 1294 \r\n3 2877 8634 8636 1294 \r\n3 246 8635 8634 1294 \r\n3 4743 8639 8638 1295 \r\n3 1027 8637 8639 1295 \r\n3 3943 8638 8637 1295 \r\n3 3487 8642 8641 1296 \r\n3 1839 8640 8642 1296 \r\n3 2948 8641 8640 1296 \r\n3 1439 8645 8644 1297 \r\n3 2393 8643 8645 1297 \r\n3 1014 8644 8643 1297 \r\n3 4331 8648 8647 1298 \r\n3 1067 8646 8648 1298 \r\n3 4097 8647 8646 1298 \r\n3 4490 8650 5318 1299 \r\n3 4998 8649 8650 1299 \r\n3 471 5318 8649 1299 \r\n3 94 8653 8652 1300 \r\n3 2544 8651 8653 1300 \r\n3 41 8652 8651 1300 \r\n3 1000 8655 8654 1301 \r\n3 1140 8633 8655 1301 \r\n3 2781 8654 8633 1301 \r\n3 3489 8658 8657 1302 \r\n3 4249 8656 8658 1302 \r\n3 3109 8657 8656 1302 \r\n3 2846 8660 8060 1303 \r\n3 454 8659 8660 1303 \r\n3 3937 8060 8659 1303 \r\n3 3713 8663 8662 1304 \r\n3 1982 8661 8663 1304 \r\n3 2880 8662 8661 1304 \r\n3 2013 8665 8434 1305 \r\n3 2169 8664 8665 1305 \r\n3 3413 8434 8664 1305 \r\n3 2866 8668 8667 1306 \r\n3 4031 8666 8668 1306 \r\n3 1029 8667 8666 1306 \r\n3 789 8671 8670 1307 \r\n3 3079 8669 8671 1307 \r\n3 2015 8670 8669 1307 \r\n3 21 8674 8673 1308 \r\n3 3401 8672 8674 1308 \r\n3 620 8673 8672 1308 \r\n3 770 8677 8676 1309 \r\n3 2495 8675 8677 1309 \r\n3 850 8676 8675 1309 \r\n3 4352 8680 8679 1310 \r\n3 1786 8678 8680 1310 \r\n3 1640 8679 8678 1310 \r\n3 4221 8682 8681 1311 \r\n3 4105 6403 8682 1311 \r\n3 276 8681 6403 1311 \r\n3 2540 8685 8684 1312 \r\n3 2908 8683 8685 1312 \r\n3 129 8684 8683 1312 \r\n3 4754 6955 8687 1313 \r\n3 2763 8686 6955 1313 \r\n3 1637 8687 8686 1313 \r\n3 348 8690 8689 1314 \r\n3 1352 8688 8690 1314 \r\n3 1768 8689 8688 1314 \r\n3 4172 7018 8692 1315 \r\n3 1198 8691 7018 1315 \r\n3 3578 8692 8691 1315 \r\n3 3904 8695 8694 1316 \r\n3 3888 8693 8695 1316 \r\n3 2297 8694 8693 1316 \r\n3 4136 8698 8697 1317 \r\n3 2357 8696 8698 1317 \r\n3 4341 8697 8696 1317 \r\n3 4167 8700 7406 1318 \r\n3 188 8699 8700 1318 \r\n3 612 7406 8699 1318 \r\n3 2211 8703 8702 1319 \r\n3 3576 8701 8703 1319 \r\n3 3580 8702 8701 1319 \r\n3 3401 8674 8705 1320 \r\n3 21 8704 8674 1320 \r\n3 4089 8705 8704 1320 \r\n3 4313 8706 6362 1321 \r\n3 464 5368 8706 1321 \r\n3 1584 6362 5368 1321 \r\n3 3029 8709 8708 1322 \r\n3 2047 8707 8709 1322 \r\n3 2501 8708 8707 1322 \r\n3 1652 8711 8710 1323 \r\n3 2593 7858 8711 1323 \r\n3 1535 8710 7858 1323 \r\n3 3338 8714 8713 1324 \r\n3 3828 8712 8714 1324 \r\n3 1331 8713 8712 1324 \r\n3 3113 5113 8716 1325 \r\n3 3054 8715 5113 1325 \r\n3 302 8716 8715 1325 \r\n3 3882 6764 8718 1326 \r\n3 3705 8717 6764 1326 \r\n3 3649 8718 8717 1326 \r\n3 596 8720 8719 1327 \r\n3 1857 7773 8720 1327 \r\n3 1852 8719 7773 1327 \r\n3 3569 8723 8722 1328 \r\n3 2897 8721 8723 1328 \r\n3 1919 8722 8721 1328 \r\n3 1742 8725 7352 1329 \r\n3 1300 8724 8725 1329 \r\n3 4562 7352 8724 1329 \r\n3 2329 8728 8727 1330 \r\n3 1058 8726 8728 1330 \r\n3 3838 8727 8726 1330 \r\n3 591 8729 6978 1331 \r\n3 2866 8667 8729 1331 \r\n3 1029 6978 8667 1331 \r\n3 3778 8732 8731 1332 \r\n3 1525 8730 8732 1332 \r\n3 4814 8731 8730 1332 \r\n3 742 8735 8734 1333 \r\n3 2424 8733 8735 1333 \r\n3 1565 8734 8733 1333 \r\n3 2484 8738 8737 1334 \r\n3 436 8736 8738 1334 \r\n3 132 8737 8736 1334 \r\n3 2725 8741 8740 1335 \r\n3 3323 8739 8741 1335 \r\n3 73 8740 8739 1335 \r\n3 3630 8743 8742 1336 \r\n3 1278 6600 8743 1336 \r\n3 2395 8742 6600 1336 \r\n3 2498 8746 8745 1337 \r\n3 4058 8744 8746 1337 \r\n3 2018 8745 8744 1337 \r\n3 4139 8748 8747 1338 \r\n3 2978 7312 8748 1338 \r\n3 3102 8747 7312 1338 \r\n3 4055 8751 8750 1339 \r\n3 3508 8749 8751 1339 \r\n3 1183 8750 8749 1339 \r\n3 872 8754 8753 1340 \r\n3 3311 8752 8754 1340 \r\n3 4850 8753 8752 1340 \r\n3 1920 8757 8756 1341 \r\n3 1833 8755 8757 1341 \r\n3 2905 8756 8755 1341 \r\n3 2614 8760 8759 1342 \r\n3 517 8758 8760 1342 \r\n3 1212 8759 8758 1342 \r\n3 1653 8763 8762 1343 \r\n3 3687 8761 8763 1343 \r\n3 1528 8762 8761 1343 \r\n3 2676 8765 8764 1344 \r\n3 3915 5543 8765 1344 \r\n3 2524 8764 5543 1344 \r\n3 4771 8768 8767 1345 \r\n3 2602 8766 8768 1345 \r\n3 538 8767 8766 1345 \r\n3 2975 8770 8769 1346 \r\n3 2753 6781 8770 1346 \r\n3 666 8769 6781 1346 \r\n3 571 8773 8772 1347 \r\n3 4513 8771 8773 1347 \r\n3 2682 8772 8771 1347 \r\n3 142 8776 8775 1348 \r\n3 1486 8774 8776 1348 \r\n3 4901 8775 8774 1348 \r\n3 4418 8779 8778 1349 \r\n3 153 8777 8779 1349 \r\n3 2844 8778 8777 1349 \r\n3 3689 8782 8781 1350 \r\n3 1625 8780 8782 1350 \r\n3 1072 8781 8780 1350 \r\n3 3325 8785 8784 1351 \r\n3 4706 8783 8785 1351 \r\n3 3934 8784 8783 1351 \r\n3 2894 8788 8787 1352 \r\n3 837 8786 8788 1352 \r\n3 4811 8787 8786 1352 \r\n3 373 8791 8790 1353 \r\n3 4307 8789 8791 1353 \r\n3 2008 8790 8789 1353 \r\n3 1072 7033 8781 1354 \r\n3 4442 8792 7033 1354 \r\n3 3689 8781 8792 1354 \r\n3 1977 8795 8794 1355 \r\n3 731 8793 8795 1355 \r\n3 2153 8794 8793 1355 \r\n3 3910 8798 8797 1356 \r\n3 3245 8796 8798 1356 \r\n3 3196 8797 8796 1356 \r\n3 3421 5119 8800 1357 \r\n3 3615 8799 5119 1357 \r\n3 2530 8800 8799 1357 \r\n3 3441 8801 7609 1358 \r\n3 2191 7764 8801 1358 \r\n3 4219 7609 7764 1358 \r\n3 4831 8803 6113 1359 \r\n3 2694 8802 8803 1359 \r\n3 3358 6113 8802 1359 \r\n3 121 8806 8805 1360 \r\n3 569 8804 8806 1360 \r\n3 1121 8805 8804 1360 \r\n3 262 8807 6770 1361 \r\n3 2824 7443 8807 1361 \r\n3 535 6770 7443 1361 \r\n3 3177 8810 8809 1362 \r\n3 2626 8808 8810 1362 \r\n3 201 8809 8808 1362 \r\n3 4419 8813 8812 1363 \r\n3 2916 8811 8813 1363 \r\n3 2832 8812 8811 1363 \r\n3 3921 8816 8815 1364 \r\n3 2687 8814 8816 1364 \r\n3 1062 8815 8814 1364 \r\n3 1912 8819 8818 1365 \r\n3 2367 8817 8819 1365 \r\n3 2210 8818 8817 1365 \r\n3 3626 8822 8821 1366 \r\n3 3124 8820 8822 1366 \r\n3 3370 8821 8820 1366 \r\n3 2085 8824 6725 1367 \r\n3 2979 8823 8824 1367 \r\n3 3578 6725 8823 1367 \r\n3 97 8827 8826 1368 \r\n3 491 8825 8827 1368 \r\n3 63 8826 8825 1368 \r\n3 4375 8830 8829 1369 \r\n3 504 8828 8830 1369 \r\n3 3328 8829 8828 1369 \r\n3 2735 7745 8832 1370 \r\n3 4003 8831 7745 1370 \r\n3 3639 8832 8831 1370 \r\n3 3932 8835 8834 1371 \r\n3 4825 8833 8835 1371 \r\n3 2834 8834 8833 1371 \r\n3 4003 7744 8837 1372 \r\n3 166 8836 7744 1372 \r\n3 1138 8837 8836 1372 \r\n3 2852 8840 8839 1373 \r\n3 4034 8838 8840 1373 \r\n3 4138 8839 8838 1373 \r\n3 1226 8843 8842 1374 \r\n3 4828 8841 8843 1374 \r\n3 4607 8842 8841 1374 \r\n3 3956 8846 8845 1375 \r\n3 4083 8844 8846 1375 \r\n3 784 8845 8844 1375 \r\n3 4976 8849 8848 1376 \r\n3 3209 8847 8849 1376 \r\n3 2023 8848 8847 1376 \r\n3 2141 8852 8851 1377 \r\n3 4161 8850 8852 1377 \r\n3 3766 8851 8850 1377 \r\n3 4901 6075 8775 1378 \r\n3 3314 5243 6075 1378 \r\n3 142 8775 5243 1378 \r\n3 1797 8853 7204 1379 \r\n3 2026 5505 8853 1379 \r\n3 4422 7204 5505 1379 \r\n3 4376 8855 7953 1380 \r\n3 2915 8854 8855 1380 \r\n3 2879 7953 8854 1380 \r\n3 3286 8857 7941 1381 \r\n3 2113 8856 8857 1381 \r\n3 232 7941 8856 1381 \r\n3 2725 8860 8859 1382 \r\n3 4248 8858 8860 1382 \r\n3 4122 8859 8858 1382 \r\n3 1978 8862 8861 1383 \r\n3 2074 6738 8862 1383 \r\n3 334 8861 6738 1383 \r\n3 2611 8865 8864 1384 \r\n3 4858 8863 8865 1384 \r\n3 1776 8864 8863 1384 \r\n3 2842 8866 5343 1385 \r\n3 444 5017 8866 1385 \r\n3 4403 5343 5017 1385 \r\n3 3354 8868 8867 1386 \r\n3 757 7871 8868 1386 \r\n3 4892 8867 7871 1386 \r\n3 4323 8871 8870 1387 \r\n3 3809 8869 8871 1387 \r\n3 2207 8870 8869 1387 \r\n3 4783 8873 7935 1388 \r\n3 871 8872 8873 1388 \r\n3 1194 7935 8872 1388 \r\n3 4230 8875 8140 1389 \r\n3 3375 8874 8875 1389 \r\n3 1378 8140 8874 1389 \r\n3 4183 8878 8877 1390 \r\n3 1679 8876 8878 1390 \r\n3 4023 8877 8876 1390 \r\n3 4649 8881 8880 1391 \r\n3 3495 8879 8881 1391 \r\n3 583 8880 8879 1391 \r\n3 407 8884 8883 1392 \r\n3 4906 8882 8884 1392 \r\n3 3002 8883 8882 1392 \r\n3 1349 8887 8886 1393 \r\n3 4650 8885 8887 1393 \r\n3 2887 8886 8885 1393 \r\n3 3135 8889 8337 1394 \r\n3 3663 8888 8889 1394 \r\n3 466 8337 8888 1394 \r\n3 2053 8892 8891 1395 \r\n3 4767 8890 8892 1395 \r\n3 4602 8891 8890 1395 \r\n3 1577 8893 5088 1396 \r\n3 1838 5552 8893 1396 \r\n3 529 5088 5552 1396 \r\n3 4586 8896 8895 1397 \r\n3 3344 8894 8896 1397 \r\n3 2809 8895 8894 1397 \r\n3 4746 8899 8898 1398 \r\n3 676 8897 8899 1398 \r\n3 3465 8898 8897 1398 \r\n3 3732 8901 8900 1399 \r\n3 1194 8872 8901 1399 \r\n3 871 8900 8872 1399 \r\n3 3882 6308 8903 1400 \r\n3 3709 8902 6308 1400 \r\n3 1932 8903 8902 1400 \r\n3 4045 6013 8905 1401 \r\n3 3543 8904 6013 1401 \r\n3 4438 8905 8904 1401 \r\n3 3742 8908 8907 1402 \r\n3 755 8906 8908 1402 \r\n3 1538 8907 8906 1402 \r\n3 603 8910 6910 1403 \r\n3 4704 8909 8910 1403 \r\n3 1361 6910 8909 1403 \r\n3 171 8913 8912 1404 \r\n3 3291 8911 8913 1404 \r\n3 399 8912 8911 1404 \r\n3 1630 8915 8914 1405 \r\n3 4576 8571 8915 1405 \r\n3 2727 8914 8571 1405 \r\n3 3014 8918 8917 1406 \r\n3 2167 8916 8918 1406 \r\n3 4100 8917 8916 1406 \r\n3 2632 8921 8920 1407 \r\n3 3568 8919 8921 1407 \r\n3 257 8920 8919 1407 \r\n3 4180 8924 8923 1408 \r\n3 2949 8922 8924 1408 \r\n3 143 8923 8922 1408 \r\n3 4648 7197 5325 1409 \r\n3 2346 8925 7197 1409 \r\n3 3197 5325 8925 1409 \r\n3 3328 7549 8829 1410 \r\n3 2044 8926 7549 1410 \r\n3 4375 8829 8926 1410 \r\n3 1695 8929 8928 1411 \r\n3 2096 8927 8929 1411 \r\n3 3303 8928 8927 1411 \r\n3 1240 8932 8931 1412 \r\n3 2278 8930 8932 1412 \r\n3 321 8931 8930 1412 \r\n3 2353 8935 8934 1413 \r\n3 3335 8933 8935 1413 \r\n3 4244 8934 8933 1413 \r\n3 780 8938 8937 1414 \r\n3 2826 8936 8938 1414 \r\n3 1887 8937 8936 1414 \r\n3 4846 8941 8940 1415 \r\n3 774 8939 8941 1415 \r\n3 4819 8940 8939 1415 \r\n3 1079 8107 8943 1416 \r\n3 4782 8942 8107 1416 \r\n3 1093 8943 8942 1416 \r\n3 3721 8946 8945 1417 \r\n3 3591 8944 8946 1417 \r\n3 2935 8945 8944 1417 \r\n3 1477 8949 8948 1418 \r\n3 4749 8947 8949 1418 \r\n3 3055 8948 8947 1418 \r\n3 4802 8951 8950 1419 \r\n3 889 6203 8951 1419 \r\n3 4768 8950 6203 1419 \r\n3 3030 8464 8013 1420 \r\n3 2773 8952 8464 1420 \r\n3 3693 8013 8952 1420 \r\n3 3602 8955 8954 1421 \r\n3 2170 8953 8955 1421 \r\n3 2762 8954 8953 1421 \r\n3 524 8958 8957 1422 \r\n3 3692 8956 8958 1422 \r\n3 373 8957 8956 1422 \r\n3 4993 8960 8959 1423 \r\n3 3716 7758 8960 1423 \r\n3 1999 8959 7758 1423 \r\n3 1914 8963 8962 1424 \r\n3 1557 8961 8963 1424 \r\n3 4693 8962 8961 1424 \r\n3 2307 8966 8965 1425 \r\n3 2064 8964 8966 1425 \r\n3 2106 8965 8964 1425 \r\n3 486 8969 8968 1426 \r\n3 4423 8967 8969 1426 \r\n3 2374 8968 8967 1426 \r\n3 437 8971 8970 1427 \r\n3 1512 7972 8971 1427 \r\n3 2058 8970 7972 1427 \r\n3 822 8974 8973 1428 \r\n3 779 8972 8974 1428 \r\n3 2017 8973 8972 1428 \r\n3 4387 8977 8976 1429 \r\n3 4877 8975 8977 1429 \r\n3 402 8976 8975 1429 \r\n3 1830 8980 8979 1430 \r\n3 2922 8978 8980 1430 \r\n3 513 8979 8978 1430 \r\n3 4573 8982 8981 1431 \r\n3 2977 5058 8982 1431 \r\n3 1497 8981 5058 1431 \r\n3 2791 8511 8984 1432 \r\n3 3206 8983 8511 1432 \r\n3 1137 8984 8983 1432 \r\n3 2175 8207 8986 1433 \r\n3 2783 8985 8207 1433 \r\n3 4288 8986 8985 1433 \r\n3 2588 8988 8391 1434 \r\n3 1683 8987 8988 1434 \r\n3 2576 8391 8987 1434 \r\n3 2035 8991 8990 1435 \r\n3 4943 8989 8991 1435 \r\n3 4886 8990 8989 1435 \r\n3 2673 8993 6792 1436 \r\n3 2848 8992 8993 1436 \r\n3 1921 6792 8992 1436 \r\n3 3388 8996 8995 1437 \r\n3 4262 8994 8996 1437 \r\n3 3348 8995 8994 1437 \r\n3 4925 7750 6271 1438 \r\n3 2955 8997 7750 1438 \r\n3 916 6271 8997 1438 \r\n3 1082 9000 8999 1439 \r\n3 3381 8998 9000 1439 \r\n3 1287 8999 8998 1439 \r\n3 1340 9002 7633 1440 \r\n3 3224 9001 9002 1440 \r\n3 3648 7633 9001 1440 \r\n3 1842 9005 9004 1441 \r\n3 3179 9003 9005 1441 \r\n3 3959 9004 9003 1441 \r\n3 1569 9007 5519 1442 \r\n3 4563 9006 9007 1442 \r\n3 4237 5519 9006 1442 \r\n3 3761 9010 9009 1443 \r\n3 4141 9008 9010 1443 \r\n3 1376 9009 9008 1443 \r\n3 5 9013 9012 1444 \r\n3 586 9011 9013 1444 \r\n3 1199 9012 9011 1444 \r\n3 3302 9016 9015 1445 \r\n3 3934 9014 9016 1445 \r\n3 4949 9015 9014 1445 \r\n3 4282 9018 7113 1446 \r\n3 4206 9017 9018 1446 \r\n3 4444 7113 9017 1446 \r\n3 4610 5474 9020 1447 \r\n3 1078 9019 5474 1447 \r\n3 4322 9020 9019 1447 \r\n3 226 7266 9022 1448 \r\n3 1547 9021 7266 1448 \r\n3 4843 9022 9021 1448 \r\n3 2872 6191 9024 1449 \r\n3 4748 9023 6191 1449 \r\n3 2780 9024 9023 1449 \r\n3 413 9026 9025 1450 \r\n3 4998 8650 9026 1450 \r\n3 4490 9025 8650 1450 \r\n3 1859 9029 9028 1451 \r\n3 818 9027 9029 1451 \r\n3 1685 9028 9027 1451 \r\n3 3411 9032 9031 1452 \r\n3 2642 9030 9032 1452 \r\n3 1179 9031 9030 1452 \r\n3 827 9035 9034 1453 \r\n3 3302 9033 9035 1453 \r\n3 787 9034 9033 1453 \r\n3 3696 9038 9037 1454 \r\n3 1757 9036 9038 1454 \r\n3 206 9037 9036 1454 \r\n3 2567 9041 9040 1455 \r\n3 2901 9039 9041 1455 \r\n3 1048 9040 9039 1455 \r\n3 2785 9044 9043 1456 \r\n3 3869 9042 9044 1456 \r\n3 518 9043 9042 1456 \r\n3 3772 9046 9045 1457 \r\n3 3415 7260 9046 1457 \r\n3 3446 9045 7260 1457 \r\n3 45 9049 9048 1458 \r\n3 4751 9047 9049 1458 \r\n3 3925 9048 9047 1458 \r\n3 2029 7493 9050 1459 \r\n3 95 7989 7493 1459 \r\n3 4836 9050 7989 1459 \r\n3 2631 9052 9051 1460 \r\n3 245 5499 9052 1460 \r\n3 239 9051 5499 1460 \r\n3 4223 9055 9054 1461 \r\n3 1900 9053 9055 1461 \r\n3 1241 9054 9053 1461 \r\n3 229 9057 9056 1462 \r\n3 4311 6525 9057 1462 \r\n3 2439 9056 6525 1462 \r\n3 4315 9058 8352 1463 \r\n3 582 6147 9058 1463 \r\n3 4567 8352 6147 1463 \r\n3 2474 5075 9060 1464 \r\n3 83 9059 5075 1464 \r\n3 4073 9060 9059 1464 \r\n3 1301 7264 9062 1465 \r\n3 563 9061 7264 1465 \r\n3 1581 9062 9061 1465 \r\n3 4212 9065 9064 1466 \r\n3 3069 9063 9065 1466 \r\n3 861 9064 9063 1466 \r\n3 1740 9068 9067 1467 \r\n3 2442 9066 9068 1467 \r\n3 2677 9067 9066 1467 \r\n3 4990 9071 9070 1468 \r\n3 2404 9069 9071 1468 \r\n3 227 9070 9069 1468 \r\n3 3975 9074 9073 1469 \r\n3 2831 9072 9074 1469 \r\n3 492 9073 9072 1469 \r\n3 3721 9077 9076 1470 \r\n3 4694 9075 9077 1470 \r\n3 740 9076 9075 1470 \r\n3 120 9080 9079 1471 \r\n3 315 9078 9080 1471 \r\n3 3664 9079 9078 1471 \r\n3 1836 5583 9082 1472 \r\n3 606 9081 5583 1472 \r\n3 2202 9082 9081 1472 \r\n3 1420 9085 9084 1473 \r\n3 1911 9083 9085 1473 \r\n3 2977 9084 9083 1473 \r\n3 2786 8002 9087 1474 \r\n3 2376 9086 8002 1474 \r\n3 835 9087 9086 1474 \r\n3 1048 9039 9089 1475 \r\n3 2901 9088 9039 1475 \r\n3 2847 9089 9088 1475 \r\n3 4817 9092 9091 1476 \r\n3 1303 9090 9092 1476 \r\n3 302 9091 9090 1476 \r\n3 851 9095 9094 1477 \r\n3 240 9093 9095 1477 \r\n3 3234 9094 9093 1477 \r\n3 75 9098 9097 1478 \r\n3 4535 9096 9098 1478 \r\n3 1520 9097 9096 1478 \r\n3 2883 9101 9100 1479 \r\n3 2683 9099 9101 1479 \r\n3 4608 9100 9099 1479 \r\n3 3909 9104 9103 1480 \r\n3 1725 9102 9104 1480 \r\n3 331 9103 9102 1480 \r\n3 376 9106 9105 1481 \r\n3 4805 8105 9106 1481 \r\n3 1079 9105 8105 1481 \r\n3 3573 9109 9108 1482 \r\n3 2305 9107 9109 1482 \r\n3 1784 9108 9107 1482 \r\n3 126 9112 9111 1483 \r\n3 1239 9110 9112 1483 \r\n3 3381 9111 9110 1483 \r\n3 668 9115 9114 1484 \r\n3 1879 9113 9115 1484 \r\n3 782 9114 9113 1484 \r\n3 2248 9118 9117 1485 \r\n3 2508 9116 9118 1485 \r\n3 4793 9117 9116 1485 \r\n3 1937 7064 9119 1486 \r\n3 4370 5068 7064 1486 \r\n3 3562 9119 5068 1486 \r\n3 2490 9122 9121 1487 \r\n3 2531 9120 9122 1487 \r\n3 2836 9121 9120 1487 \r\n3 3683 9125 9124 1488 \r\n3 2140 9123 9125 1488 \r\n3 4268 9124 9123 1488 \r\n3 4584 9127 9126 1489 \r\n3 1086 6733 9127 1489 \r\n3 3221 9126 6733 1489 \r\n3 1169 9130 9129 1490 \r\n3 3743 9128 9130 1490 \r\n3 2451 9129 9128 1490 \r\n3 135 9132 9131 1491 \r\n3 4089 8704 9132 1491 \r\n3 21 9131 8704 1491 \r\n3 555 9134 6249 1492 \r\n3 2455 9133 9134 1492 \r\n3 4005 6249 9133 1492 \r\n3 2386 9137 9136 1493 \r\n3 4037 9135 9137 1493 \r\n3 1513 9136 9135 1493 \r\n3 3479 9140 9139 1494 \r\n3 3399 9138 9140 1494 \r\n3 566 9139 9138 1494 \r\n3 3780 7227 9141 1495 \r\n3 3982 6359 7227 1495 \r\n3 4423 9141 6359 1495 \r\n3 4818 9143 9142 1496 \r\n3 435 7342 9143 1496 \r\n3 2078 9142 7342 1496 \r\n3 1130 9146 9145 1497 \r\n3 3002 9144 9146 1497 \r\n3 4202 9145 9144 1497 \r\n3 2428 6994 9148 1498 \r\n3 2308 9147 6994 1498 \r\n3 810 9148 9147 1498 \r\n3 3097 9150 9149 1499 \r\n3 2825 8247 9150 1499 \r\n3 3539 9149 8247 1499 \r\n3 1916 9152 8546 1500 \r\n3 880 9151 9152 1500 \r\n3 2127 8546 9151 1500 \r\n3 2042 9155 9154 1501 \r\n3 98 9153 9155 1501 \r\n3 778 9154 9153 1501 \r\n3 2749 7823 9157 1502 \r\n3 2409 9156 7823 1502 \r\n3 3561 9157 9156 1502 \r\n3 3769 9160 9159 1503 \r\n3 4351 9158 9160 1503 \r\n3 4239 9159 9158 1503 \r\n3 4306 9163 9162 1504 \r\n3 2656 9161 9163 1504 \r\n3 4413 9162 9161 1504 \r\n3 2953 9166 9165 1505 \r\n3 4950 9164 9166 1505 \r\n3 3986 9165 9164 1505 \r\n3 732 9169 9168 1506 \r\n3 4130 9167 9169 1506 \r\n3 3661 9168 9167 1506 \r\n3 598 9172 9171 1507 \r\n3 732 9170 9172 1507 \r\n3 2246 9171 9170 1507 \r\n3 4771 8767 9174 1508 \r\n3 538 9173 8767 1508 \r\n3 1561 9174 9173 1508 \r\n3 4726 9176 9175 1509 \r\n3 2115 6834 9176 1509 \r\n3 2743 9175 6834 1509 \r\n3 4205 9179 9178 1510 \r\n3 138 9177 9179 1510 \r\n3 1617 9178 9177 1510 \r\n3 2941 9181 8612 1511 \r\n3 2054 9180 9181 1511 \r\n3 3656 8612 9180 1511 \r\n3 4830 9183 9182 1512 \r\n3 2847 9088 9183 1512 \r\n3 2901 9182 9088 1512 \r\n3 141 9186 9185 1513 \r\n3 4640 9184 9186 1513 \r\n3 1437 9185 9184 1513 \r\n3 4306 9188 9187 1514 \r\n3 1584 5370 9188 1514 \r\n3 1019 9187 5370 1514 \r\n3 469 9191 9190 1515 \r\n3 4767 9189 9191 1515 \r\n3 1160 9190 9189 1515 \r\n3 2840 8373 9193 1516 \r\n3 344 9192 8373 1516 \r\n3 4515 9193 9192 1516 \r\n3 2421 9195 9194 1517 \r\n3 3179 7515 9195 1517 \r\n3 3758 9194 7515 1517 \r\n3 2110 9197 9196 1518 \r\n3 2908 6479 9197 1518 \r\n3 4605 9196 6479 1518 \r\n3 2953 9165 9198 1519 \r\n3 3986 5232 9165 1519 \r\n3 1414 9198 5232 1519 \r\n3 2863 9201 9200 1520 \r\n3 794 9199 9201 1520 \r\n3 3843 9200 9199 1520 \r\n3 1973 9204 9203 1521 \r\n3 3799 9202 9204 1521 \r\n3 2351 9203 9202 1521 \r\n3 781 9207 9206 1522 \r\n3 2856 9205 9207 1522 \r\n3 2887 9206 9205 1522 \r\n3 1392 9210 9209 1523 \r\n3 4293 9208 9210 1523 \r\n3 2771 9209 9208 1523 \r\n3 4968 9212 9211 1524 \r\n3 3233 6224 9212 1524 \r\n3 2206 9211 6224 1524 \r\n3 3524 9215 9214 1525 \r\n3 542 9213 9215 1525 \r\n3 3254 9214 9213 1525 \r\n3 4024 7401 9217 1526 \r\n3 558 9216 7401 1526 \r\n3 3753 9217 9216 1526 \r\n3 3157 9220 9219 1527 \r\n3 3391 9218 9220 1527 \r\n3 31 9219 9218 1527 \r\n3 529 6967 9222 1528 \r\n3 4646 9221 6967 1528 \r\n3 4061 9222 9221 1528 \r\n3 1391 9224 9223 1529 \r\n3 3682 5157 9224 1529 \r\n3 398 9223 5157 1529 \r\n3 1441 9226 5066 1530 \r\n3 4511 9225 9226 1530 \r\n3 4984 5066 9225 1530 \r\n3 4220 8267 9228 1531 \r\n3 599 9227 8267 1531 \r\n3 2416 9228 9227 1531 \r\n3 2567 9231 9230 1532 \r\n3 1235 9229 9231 1532 \r\n3 1671 9230 9229 1532 \r\n3 1421 8563 6999 1533 \r\n3 4924 7125 8563 1533 \r\n3 3042 6999 7125 1533 \r\n3 3556 9232 5036 1534 \r\n3 4276 7975 9232 1534 \r\n3 954 5036 7975 1534 \r\n3 1277 9234 6077 1535 \r\n3 2610 9233 9234 1535 \r\n3 2569 6077 9233 1535 \r\n3 4590 9237 9236 1536 \r\n3 691 9235 9237 1536 \r\n3 1842 9236 9235 1536 \r\n3 4822 9240 9239 1537 \r\n3 4589 9238 9240 1537 \r\n3 3152 9239 9238 1537 \r\n3 2497 9242 7229 1538 \r\n3 4558 9241 9242 1538 \r\n3 3982 7229 9241 1538 \r\n3 1429 9245 9244 1539 \r\n3 3433 9243 9245 1539 \r\n3 2344 9244 9243 1539 \r\n3 2338 9248 9247 1540 \r\n3 1223 9246 9248 1540 \r\n3 1282 9247 9246 1540 \r\n3 4795 9249 8278 1541 \r\n3 2219 7905 9249 1541 \r\n3 1710 8278 7905 1541 \r\n3 1730 9252 9251 1542 \r\n3 2758 9250 9252 1542 \r\n3 537 9251 9250 1542 \r\n3 3493 9255 9254 1543 \r\n3 1162 9253 9255 1543 \r\n3 1767 9254 9253 1543 \r\n3 1895 5393 9257 1544 \r\n3 4493 9256 5393 1544 \r\n3 1099 9257 9256 1544 \r\n3 691 7513 9235 1545 \r\n3 3179 9005 7513 1545 \r\n3 1842 9235 9005 1545 \r\n3 3097 9260 9259 1546 \r\n3 4065 9258 9260 1546 \r\n3 2944 9259 9258 1546 \r\n3 2796 8015 9262 1547 \r\n3 3735 9261 8015 1547 \r\n3 3523 9262 9261 1547 \r\n3 801 9264 8379 1548 \r\n3 2823 9263 9264 1548 \r\n3 2322 8379 9263 1548 \r\n3 3562 7622 9265 1549 \r\n3 4367 7387 7622 1549 \r\n3 407 9265 7387 1549 \r\n3 4147 9267 7361 1550 \r\n3 630 9266 9267 1550 \r\n3 412 7361 9266 1550 \r\n3 4551 9270 9269 1551 \r\n3 3676 9268 9270 1551 \r\n3 492 9269 9268 1551 \r\n3 2194 7890 9272 1552 \r\n3 2693 9271 7890 1552 \r\n3 2072 9272 9271 1552 \r\n3 355 9275 9274 1553 \r\n3 760 9273 9275 1553 \r\n3 973 9274 9273 1553 \r\n3 2218 9278 9277 1554 \r\n3 1322 9276 9278 1554 \r\n3 3204 9277 9276 1554 \r\n3 3863 9280 9279 1555 \r\n3 1762 7537 9280 1555 \r\n3 2587 9279 7537 1555 \r\n3 2516 9282 7826 1556 \r\n3 2240 9281 9282 1556 \r\n3 4459 7826 9281 1556 \r\n3 3727 9285 9284 1557 \r\n3 2401 9283 9285 1557 \r\n3 4781 9284 9283 1557 \r\n3 4392 5588 9286 1558 \r\n3 3187 6200 5588 1558 \r\n3 2648 9286 6200 1558 \r\n3 2866 7390 9288 1559 \r\n3 3203 9287 7390 1559 \r\n3 1077 9288 9287 1559 \r\n3 4945 6801 9290 1560 \r\n3 230 9289 6801 1560 \r\n3 584 9290 9289 1560 \r\n3 1766 9293 9292 1561 \r\n3 1204 9291 9293 1561 \r\n3 2004 9292 9291 1561 \r\n3 422 7650 9295 1562 \r\n3 3670 9294 7650 1562 \r\n3 682 9295 9294 1562 \r\n3 965 9298 9297 1563 \r\n3 186 9296 9298 1563 \r\n3 4533 9297 9296 1563 \r\n3 4091 9301 9300 1564 \r\n3 3119 9299 9301 1564 \r\n3 1884 9300 9299 1564 \r\n3 769 9304 9303 1565 \r\n3 3984 9302 9304 1565 \r\n3 51 9303 9302 1565 \r\n3 2967 9307 9306 1566 \r\n3 4595 9305 9307 1566 \r\n3 113 9306 9305 1566 \r\n3 400 9309 6346 1567 \r\n3 3172 9308 9309 1567 \r\n3 4119 6346 9308 1567 \r\n3 3847 9312 9311 1568 \r\n3 2397 9310 9312 1568 \r\n3 3394 9311 9310 1568 \r\n3 97 9315 9314 1569 \r\n3 2313 9313 9315 1569 \r\n3 954 9314 9313 1569 \r\n3 4683 9318 9317 1570 \r\n3 101 9316 9318 1570 \r\n3 331 9317 9316 1570 \r\n3 2930 9321 9320 1571 \r\n3 758 9319 9321 1571 \r\n3 4591 9320 9319 1571 \r\n3 1192 9324 9323 1572 \r\n3 1594 9322 9324 1572 \r\n3 3657 9323 9322 1572 \r\n3 1373 9327 9326 1573 \r\n3 3068 9325 9327 1573 \r\n3 2862 9326 9325 1573 \r\n3 928 9328 8024 1574 \r\n3 4144 8237 9328 1574 \r\n3 4508 8024 8237 1574 \r\n3 59 9331 9330 1575 \r\n3 3583 9329 9331 1575 \r\n3 4844 9330 9329 1575 \r\n3 4126 8026 9332 1576 \r\n3 1177 7004 8026 1576 \r\n3 3373 9332 7004 1576 \r\n3 1087 9335 9334 1577 \r\n3 4906 9333 9335 1577 \r\n3 2257 9334 9333 1577 \r\n3 2270 9337 9336 1578 \r\n3 2351 9202 9337 1578 \r\n3 3799 9336 9202 1578 \r\n3 2358 9340 9339 1579 \r\n3 2143 9338 9340 1579 \r\n3 4804 9339 9338 1579 \r\n3 2063 9343 9342 1580 \r\n3 595 9341 9343 1580 \r\n3 3301 9342 9341 1580 \r\n3 4501 9346 9345 1581 \r\n3 4160 9344 9346 1581 \r\n3 1573 9345 9344 1581 \r\n3 1529 9349 9348 1582 \r\n3 2214 9347 9349 1582 \r\n3 4424 9348 9347 1582 \r\n3 4258 9352 9351 1583 \r\n3 1001 9350 9352 1583 \r\n3 702 9351 9350 1583 \r\n3 449 9355 9354 1584 \r\n3 1357 9353 9355 1584 \r\n3 2314 9354 9353 1584 \r\n3 2987 9358 9357 1585 \r\n3 3663 9356 9358 1585 \r\n3 2986 9357 9356 1585 \r\n3 1774 9361 9360 1586 \r\n3 235 9359 9361 1586 \r\n3 2363 9360 9359 1586 \r\n3 1183 8749 9363 1587 \r\n3 3508 9362 8749 1587 \r\n3 3416 9363 9362 1587 \r\n3 4307 9366 9365 1588 \r\n3 205 9364 9366 1588 \r\n3 18 9365 9364 1588 \r\n3 1784 9369 9368 1589 \r\n3 4725 9367 9369 1589 \r\n3 1135 9368 9367 1589 \r\n3 3035 9372 9371 1590 \r\n3 116 9370 9372 1590 \r\n3 3594 9371 9370 1590 \r\n3 3212 9373 5436 1591 \r\n3 3177 8809 9373 1591 \r\n3 201 5436 8809 1591 \r\n3 4012 9376 9375 1592 \r\n3 1274 9374 9376 1592 \r\n3 3688 9375 9374 1592 \r\n3 842 9379 9378 1593 \r\n3 3609 9377 9379 1593 \r\n3 353 9378 9377 1593 \r\n3 694 9382 9381 1594 \r\n3 1040 9380 9382 1594 \r\n3 387 9381 9380 1594 \r\n3 1561 9385 9384 1595 \r\n3 1285 9383 9385 1595 \r\n3 4242 9384 9383 1595 \r\n3 1075 9388 9387 1596 \r\n3 1227 9386 9388 1596 \r\n3 1176 9387 9386 1596 \r\n3 809 9391 9390 1597 \r\n3 1471 9389 9391 1597 \r\n3 3514 9390 9389 1597 \r\n3 4154 9394 9393 1598 \r\n3 989 9392 9394 1598 \r\n3 345 9393 9392 1598 \r\n3 3355 9397 9396 1599 \r\n3 4837 9395 9397 1599 \r\n3 904 9396 9395 1599 \r\n3 1320 9400 9399 1600 \r\n3 3123 9398 9400 1600 \r\n3 3261 9399 9398 1600 \r\n3 2267 9402 6746 1601 \r\n3 1689 9401 9402 1601 \r\n3 1907 6746 9401 1601 \r\n3 3869 9405 9404 1602 \r\n3 424 9403 9405 1602 \r\n3 1860 9404 9403 1602 \r\n3 3903 9408 9407 1603 \r\n3 554 9406 9408 1603 \r\n3 519 9407 9406 1603 \r\n3 4954 9411 9410 1604 \r\n3 2466 9409 9411 1604 \r\n3 1696 9410 9409 1604 \r\n3 4102 6064 9413 1605 \r\n3 4718 9412 6064 1605 \r\n3 3890 9413 9412 1605 \r\n3 3756 9415 9414 1606 \r\n3 3597 6333 9415 1606 \r\n3 2947 9414 6333 1606 \r\n3 4360 9418 9417 1607 \r\n3 851 9416 9418 1607 \r\n3 294 9417 9416 1607 \r\n3 213 9421 9420 1608 \r\n3 671 9419 9421 1608 \r\n3 2059 9420 9419 1608 \r\n3 733 9423 8296 1609 \r\n3 2694 9422 9423 1609 \r\n3 2193 8296 9422 1609 \r\n3 570 9425 6723 1610 \r\n3 1238 9424 9425 1610 \r\n3 1881 6723 9424 1610 \r\n3 2800 9428 9427 1611 \r\n3 1546 9426 9428 1611 \r\n3 3410 9427 9426 1611 \r\n3 1056 9431 9430 1612 \r\n3 1938 9429 9431 1612 \r\n3 3443 9430 9429 1612 \r\n3 1802 9434 9433 1613 \r\n3 1995 9432 9434 1613 \r\n3 1732 9433 9432 1613 \r\n3 2 9437 9436 1614 \r\n3 4774 9435 9437 1614 \r\n3 4987 9436 9435 1614 \r\n3 2279 7416 9439 1615 \r\n3 2422 9438 7416 1615 \r\n3 2705 9439 9438 1615 \r\n3 2720 9442 9441 1616 \r\n3 4612 9440 9442 1616 \r\n3 2777 9441 9440 1616 \r\n3 1918 9445 9444 1617 \r\n3 4571 9443 9445 1617 \r\n3 2183 9444 9443 1617 \r\n3 1144 9448 9447 1618 \r\n3 302 9446 9448 1618 \r\n3 4732 9447 9446 1618 \r\n3 1543 9450 7647 1619 \r\n3 2521 9449 9450 1619 \r\n3 3378 7647 9449 1619 \r\n3 1113 9453 9452 1620 \r\n3 567 9451 9453 1620 \r\n3 1492 9452 9451 1620 \r\n3 4232 6260 9455 1621 \r\n3 2217 9454 6260 1621 \r\n3 2858 9455 9454 1621 \r\n3 2260 9458 9457 1622 \r\n3 2752 9456 9458 1622 \r\n3 4504 9457 9456 1622 \r\n3 2853 9461 9460 1623 \r\n3 1851 9459 9461 1623 \r\n3 419 9460 9459 1623 \r\n3 3206 9463 7424 1624 \r\n3 3660 9462 9463 1624 \r\n3 2292 7424 9462 1624 \r\n3 1169 9465 9130 1625 \r\n3 334 9464 9465 1625 \r\n3 3743 9130 9464 1625 \r\n3 2548 9468 9467 1626 \r\n3 38 9466 9468 1626 \r\n3 52 9467 9466 1626 \r\n3 2648 6199 9469 1627 \r\n3 1401 5398 6199 1627 \r\n3 4859 9469 5398 1627 \r\n3 278 9472 9471 1628 \r\n3 1648 9470 9472 1628 \r\n3 4797 9471 9470 1628 \r\n3 2181 9475 9474 1629 \r\n3 1533 9473 9475 1629 \r\n3 1378 9474 9473 1629 \r\n3 4707 9478 9477 1630 \r\n3 20 9476 9478 1630 \r\n3 3424 9477 9476 1630 \r\n3 1968 9480 7316 1631 \r\n3 2374 9479 9480 1631 \r\n3 730 7316 9479 1631 \r\n3 1874 9482 9481 1632 \r\n3 3329 5006 9482 1632 \r\n3 1518 9481 5006 1632 \r\n3 1182 9484 9483 1633 \r\n3 2308 6993 9484 1633 \r\n3 3958 9483 6993 1633 \r\n3 2833 9487 9486 1634 \r\n3 2867 9485 9487 1634 \r\n3 3243 9486 9485 1634 \r\n3 3316 9490 9489 1635 \r\n3 4033 9488 9490 1635 \r\n3 1463 9489 9488 1635 \r\n3 3576 9492 7914 1636 \r\n3 2335 9491 9492 1636 \r\n3 3454 7914 9491 1636 \r\n3 1933 9494 9493 1637 \r\n3 3852 8251 9494 1637 \r\n3 2964 9493 8251 1637 \r\n3 4509 9497 9496 1638 \r\n3 3945 9495 9497 1638 \r\n3 2242 9496 9495 1638 \r\n3 4423 8969 9499 1639 \r\n3 486 9498 8969 1639 \r\n3 2319 9499 9498 1639 \r\n3 2177 9502 9501 1640 \r\n3 98 9500 9502 1640 \r\n3 3490 9501 9500 1640 \r\n3 638 9505 9504 1641 \r\n3 2173 9503 9505 1641 \r\n3 408 9504 9503 1641 \r\n3 2246 9507 9171 1642 \r\n3 4850 9506 9507 1642 \r\n3 598 9171 9506 1642 \r\n3 2081 9510 9509 1643 \r\n3 4419 9508 9510 1643 \r\n3 772 9509 9508 1643 \r\n3 229 9513 9512 1644 \r\n3 1915 9511 9513 1644 \r\n3 1420 9512 9511 1644 \r\n3 1212 9516 9515 1645 \r\n3 3095 9514 9516 1645 \r\n3 544 9515 9514 1645 \r\n3 221 9518 5657 1646 \r\n3 1310 9517 9518 1646 \r\n3 3012 5657 9517 1646 \r\n3 2703 8628 9520 1647 \r\n3 879 9519 8628 1647 \r\n3 2134 9520 9519 1647 \r\n3 4492 9522 6486 1648 \r\n3 182 9521 9522 1648 \r\n3 1714 6486 9521 1648 \r\n3 4819 9524 8940 1649 \r\n3 1646 9523 9524 1649 \r\n3 4846 8940 9523 1649 \r\n3 2153 9527 9526 1650 \r\n3 3380 9525 9527 1650 \r\n3 4021 9526 9525 1650 \r\n3 4353 9530 9529 1651 \r\n3 4297 9528 9530 1651 \r\n3 1930 9529 9528 1651 \r\n3 4869 9532 9531 1652 \r\n3 2490 9121 9532 1652 \r\n3 2836 9531 9121 1652 \r\n3 4961 9535 9534 1653 \r\n3 3045 9533 9535 1653 \r\n3 793 9534 9533 1653 \r\n3 1571 9537 8089 1654 \r\n3 2310 9536 9537 1654 \r\n3 3402 8089 9536 1654 \r\n3 371 9540 9539 1655 \r\n3 3792 9538 9540 1655 \r\n3 3013 9539 9538 1655 \r\n3 3241 9542 8359 1656 \r\n3 2187 9541 9542 1656 \r\n3 1913 8359 9541 1656 \r\n3 4114 9545 9544 1657 \r\n3 2818 9543 9545 1657 \r\n3 210 9544 9543 1657 \r\n3 1840 9548 9547 1658 \r\n3 1507 9546 9548 1658 \r\n3 180 9547 9546 1658 \r\n3 1760 5333 9550 1659 \r\n3 3136 9549 5333 1659 \r\n3 1758 9550 9549 1659 \r\n3 1082 8999 9552 1660 \r\n3 1287 9551 8999 1660 \r\n3 4270 9552 9551 1660 \r\n3 1541 5131 9554 1661 \r\n3 1934 9553 5131 1661 \r\n3 1580 9554 9553 1661 \r\n3 3021 9557 9556 1662 \r\n3 1864 9555 9557 1662 \r\n3 66 9556 9555 1662 \r\n3 349 9559 6370 1663 \r\n3 134 9558 9559 1663 \r\n3 4404 6370 9558 1663 \r\n3 4812 9562 9561 1664 \r\n3 4125 9560 9562 1664 \r\n3 3284 9561 9560 1664 \r\n3 2360 9564 7271 1665 \r\n3 362 9563 9564 1665 \r\n3 1701 7271 9563 1665 \r\n3 1691 9567 9566 1666 \r\n3 2926 9565 9567 1666 \r\n3 746 9566 9565 1666 \r\n3 4080 9570 9569 1667 \r\n3 427 9568 9570 1667 \r\n3 2989 9569 9568 1667 \r\n3 3802 9573 9572 1668 \r\n3 1357 9571 9573 1668 \r\n3 3975 9572 9571 1668 \r\n3 143 9576 9575 1669 \r\n3 4634 9574 9576 1669 \r\n3 267 9575 9574 1669 \r\n3 1870 9579 9578 1670 \r\n3 3207 9577 9579 1670 \r\n3 2709 9578 9577 1670 \r\n3 4684 7732 9581 1671 \r\n3 3995 9580 7732 1671 \r\n3 849 9581 9580 1671 \r\n3 4857 9584 9583 1672 \r\n3 4505 9582 9584 1672 \r\n3 2517 9583 9582 1672 \r\n3 2199 9586 7461 1673 \r\n3 2312 9585 9586 1673 \r\n3 4972 7461 9585 1673 \r\n3 3152 5968 9239 1674 \r\n3 3188 9587 5968 1674 \r\n3 4822 9239 9587 1674 \r\n3 520 9589 9588 1675 \r\n3 266 6484 9589 1675 \r\n3 3584 9588 6484 1675 \r\n3 2451 9592 9591 1676 \r\n3 2325 9590 9592 1676 \r\n3 2038 9591 9590 1676 \r\n3 159 9595 9594 1677 \r\n3 484 9593 9595 1677 \r\n3 339 9594 9593 1677 \r\n3 4361 9597 9596 1678 \r\n3 1530 5345 9597 1678 \r\n3 3482 9596 5345 1678 \r\n3 752 9600 9599 1679 \r\n3 4601 9598 9600 1679 \r\n3 2448 9599 9598 1679 \r\n3 1062 9602 9601 1680 \r\n3 1069 6744 9602 1680 \r\n3 1857 9601 6744 1680 \r\n3 1578 9604 9603 1681 \r\n3 1741 6667 9604 1681 \r\n3 1208 9603 6667 1681 \r\n3 331 9316 9606 1682 \r\n3 101 9605 9316 1682 \r\n3 4448 9606 9605 1682 \r\n3 261 9609 9608 1683 \r\n3 3715 9607 9609 1683 \r\n3 670 9608 9607 1683 \r\n3 52 9611 9467 1684 \r\n3 1255 9610 9611 1684 \r\n3 2548 9467 9610 1684 \r\n3 4946 9614 9613 1685 \r\n3 1558 9612 9614 1685 \r\n3 4974 9613 9612 1685 \r\n3 3835 9617 9616 1686 \r\n3 807 9615 9617 1686 \r\n3 1193 9616 9615 1686 \r\n3 1510 9619 6871 1687 \r\n3 4155 9618 9619 1687 \r\n3 3473 6871 9618 1687 \r\n3 1983 9622 9621 1688 \r\n3 2039 9620 9622 1688 \r\n3 3069 9621 9620 1688 \r\n3 590 9625 9624 1689 \r\n3 4988 9623 9625 1689 \r\n3 3397 9624 9623 1689 \r\n3 3077 9628 9627 1690 \r\n3 3790 9626 9628 1690 \r\n3 2597 9627 9626 1690 \r\n3 1311 9631 9630 1691 \r\n3 1722 9629 9631 1691 \r\n3 3542 9630 9629 1691 \r\n3 3520 9633 9632 1692 \r\n3 3028 7058 9633 1692 \r\n3 3586 9632 7058 1692 \r\n3 951 9635 6798 1693 \r\n3 2443 9634 9635 1693 \r\n3 2157 6798 9634 1693 \r\n3 4463 6768 7051 1694 \r\n3 830 9636 6768 1694 \r\n3 4910 7051 9636 1694 \r\n3 4997 9639 9638 1695 \r\n3 3204 9637 9639 1695 \r\n3 1543 9638 9637 1695 \r\n3 825 9642 9641 1696 \r\n3 611 9640 9642 1696 \r\n3 3147 9641 9640 1696 \r\n3 1563 9645 9644 1697 \r\n3 2453 9643 9645 1697 \r\n3 4701 9644 9643 1697 \r\n3 4709 9648 9647 1698 \r\n3 1522 9646 9648 1698 \r\n3 3953 9647 9646 1698 \r\n3 1900 9650 9053 1699 \r\n3 3546 9649 9650 1699 \r\n3 1241 9053 9649 1699 \r\n3 4611 9652 7667 1700 \r\n3 1073 9651 9652 1700 \r\n3 4968 7667 9651 1700 \r\n3 1965 9654 7623 1701 \r\n3 4236 9653 9654 1701 \r\n3 4780 7623 9653 1701 \r\n3 1427 9657 9656 1702 \r\n3 3478 9655 9657 1702 \r\n3 4722 9656 9655 1702 \r\n3 2435 6096 9659 1703 \r\n3 4093 9658 6096 1703 \r\n3 2827 9659 9658 1703 \r\n3 2711 9661 7855 1704 \r\n3 319 9660 9661 1704 \r\n3 4253 7855 9660 1704 \r\n3 2868 9663 9662 1705 \r\n3 2513 8299 9663 1705 \r\n3 1776 9662 8299 1705 \r\n3 2669 9665 6129 1706 \r\n3 3873 9664 9665 1706 \r\n3 4393 6129 9664 1706 \r\n3 3501 9668 9667 1707 \r\n3 4986 9666 9668 1707 \r\n3 3770 9667 9666 1707 \r\n3 2193 9671 9670 1708 \r\n3 2928 9669 9671 1708 \r\n3 2988 9670 9669 1708 \r\n3 4000 9673 5490 1709 \r\n3 4197 9672 9673 1709 \r\n3 1897 5490 9672 1709 \r\n3 4022 8053 9675 1710 \r\n3 969 9674 8053 1710 \r\n3 4978 9675 9674 1710 \r\n3 141 9185 9677 1711 \r\n3 1437 9676 9185 1711 \r\n3 1542 9677 9676 1711 \r\n3 4940 9680 9679 1712 \r\n3 1697 9678 9680 1712 \r\n3 1621 9679 9678 1712 \r\n3 3904 8694 9682 1713 \r\n3 2297 9681 8694 1713 \r\n3 4576 9682 9681 1713 \r\n3 3978 9684 9683 1714 \r\n3 1062 9601 9684 1714 \r\n3 1857 9683 9601 1714 \r\n3 2885 9687 9686 1715 \r\n3 1550 9685 9687 1715 \r\n3 1675 9686 9685 1715 \r\n3 3100 5261 9689 1716 \r\n3 3783 9688 5261 1716 \r\n3 3430 9689 9688 1716 \r\n3 1354 5757 9691 1717 \r\n3 656 9690 5757 1717 \r\n3 3723 9691 9690 1717 \r\n3 4725 9369 9693 1718 \r\n3 1784 9692 9369 1718 \r\n3 1674 9693 9692 1718 \r\n3 4260 9696 9695 1719 \r\n3 488 9694 9696 1719 \r\n3 3424 9695 9694 1719 \r\n3 4939 9699 9698 1720 \r\n3 2774 9697 9699 1720 \r\n3 661 9698 9697 1720 \r\n3 1650 9702 9701 1721 \r\n3 2429 9700 9702 1721 \r\n3 2766 9701 9700 1721 \r\n3 3128 9705 9704 1722 \r\n3 1828 9703 9705 1722 \r\n3 1 9704 9703 1722 \r\n3 2007 9707 9706 1723 \r\n3 3415 9046 9707 1723 \r\n3 3772 9706 9046 1723 \r\n3 2754 9710 9709 1724 \r\n3 2790 9708 9710 1724 \r\n3 2405 9709 9708 1724 \r\n3 3439 9713 9712 1725 \r\n3 2225 9711 9713 1725 \r\n3 4731 9712 9711 1725 \r\n3 432 9716 9715 1726 \r\n3 3955 9714 9716 1726 \r\n3 4919 9715 9714 1726 \r\n3 1293 9718 6326 1727 \r\n3 2934 9717 9718 1727 \r\n3 116 6326 9717 1727 \r\n3 3511 9721 9720 1728 \r\n3 3645 9719 9721 1728 \r\n3 188 9720 9719 1728 \r\n3 1307 5821 9723 1729 \r\n3 2082 9722 5821 1729 \r\n3 3643 9723 9722 1729 \r\n3 3231 9726 9725 1730 \r\n3 4751 9724 9726 1730 \r\n3 4757 9725 9724 1730 \r\n3 1149 6814 9728 1731 \r\n3 4958 9727 6814 1731 \r\n3 2758 9728 9727 1731 \r\n3 4253 9731 9730 1732 \r\n3 2870 9729 9731 1732 \r\n3 4244 9730 9729 1732 \r\n3 3574 9734 9733 1733 \r\n3 3047 9732 9734 1733 \r\n3 775 9733 9732 1733 \r\n3 1330 9737 9736 1734 \r\n3 3347 9735 9737 1734 \r\n3 3859 9736 9735 1734 \r\n3 3678 9740 9739 1735 \r\n3 1406 9738 9740 1735 \r\n3 4224 9739 9738 1735 \r\n3 3582 7998 9742 1736 \r\n3 497 9741 7998 1736 \r\n3 918 9742 9741 1736 \r\n3 1558 9743 9612 1737 \r\n3 215 6373 9743 1737 \r\n3 4974 9612 6373 1737 \r\n3 4496 9745 9744 1738 \r\n3 2842 5342 9745 1738 \r\n3 4711 9744 5342 1738 \r\n3 4008 9748 9747 1739 \r\n3 1466 9746 9748 1739 \r\n3 561 9747 9746 1739 \r\n3 3960 9751 9750 1740 \r\n3 998 9749 9751 1740 \r\n3 4313 9750 9749 1740 \r\n3 617 9753 9752 1741 \r\n3 1590 8380 9753 1741 \r\n3 2322 9752 8380 1741 \r\n3 1674 9692 5440 1742 \r\n3 1784 9754 9692 1742 \r\n3 2920 5440 9754 1742 \r\n3 4633 6269 9756 1743 \r\n3 916 9755 6269 1743 \r\n3 461 9756 9755 1743 \r\n3 4091 9759 9758 1744 \r\n3 68 9757 9759 1744 \r\n3 4934 9758 9757 1744 \r\n3 932 9762 9761 1745 \r\n3 2557 9760 9762 1745 \r\n3 2933 9761 9760 1745 \r\n3 3105 9765 9764 1746 \r\n3 2996 9763 9765 1746 \r\n3 2853 9764 9763 1746 \r\n3 3667 7631 9767 1747 \r\n3 3990 9766 7631 1747 \r\n3 4905 9767 9766 1747 \r\n3 461 9770 9769 1748 \r\n3 3239 9768 9770 1748 \r\n3 3146 9769 9768 1748 \r\n3 2162 9771 7226 1749 \r\n3 1518 5005 9771 1749 \r\n3 3563 7226 5005 1749 \r\n3 4350 9774 9773 1750 \r\n3 3038 9772 9774 1750 \r\n3 3427 9773 9772 1750 \r\n3 303 9777 9776 1751 \r\n3 114 9775 9777 1751 \r\n3 4221 9776 9775 1751 \r\n3 2855 9779 9778 1752 \r\n3 4583 7494 9779 1752 \r\n3 2029 9778 7494 1752 \r\n3 1596 9782 9781 1753 \r\n3 3622 9780 9782 1753 \r\n3 3618 9781 9780 1753 \r\n3 1524 9784 7081 1754 \r\n3 4947 9783 9784 1754 \r\n3 403 7081 9783 1754 \r\n3 3027 9787 9786 1755 \r\n3 4435 9785 9787 1755 \r\n3 1111 9786 9785 1755 \r\n3 4479 9789 9788 1756 \r\n3 4446 6428 9789 1756 \r\n3 3691 9788 6428 1756 \r\n3 4653 9792 9791 1757 \r\n3 112 9790 9792 1757 \r\n3 2440 9791 9790 1757 \r\n3 969 8052 9794 1758 \r\n3 4995 9793 8052 1758 \r\n3 4957 9794 9793 1758 \r\n3 2498 9797 9796 1759 \r\n3 1615 9795 9797 1759 \r\n3 446 9796 9795 1759 \r\n3 1626 6206 9799 1760 \r\n3 4042 9798 6206 1760 \r\n3 1484 9799 9798 1760 \r\n3 315 9802 9801 1761 \r\n3 2599 9800 9802 1761 \r\n3 74 9801 9800 1761 \r\n3 438 9804 9803 1762 \r\n3 566 9138 9804 1762 \r\n3 3399 9803 9138 1762 \r\n3 1809 9807 9806 1763 \r\n3 2637 9805 9807 1763 \r\n3 2598 9806 9805 1763 \r\n3 4015 9809 7811 1764 \r\n3 4524 9808 9809 1764 \r\n3 4477 7811 9808 1764 \r\n3 2288 9812 9811 1765 \r\n3 4062 9810 9812 1765 \r\n3 3229 9811 9810 1765 \r\n3 595 9813 7888 1766 \r\n3 484 9595 9813 1766 \r\n3 159 7888 9595 1766 \r\n3 3749 5880 9815 1767 \r\n3 992 9814 5880 1767 \r\n3 4517 9815 9814 1767 \r\n3 4915 9818 9817 1768 \r\n3 3417 9816 9818 1768 \r\n3 4698 9817 9816 1768 \r\n3 555 9820 9134 1769 \r\n3 2396 9819 9820 1769 \r\n3 2455 9134 9819 1769 \r\n3 4947 9784 9821 1770 \r\n3 1524 8044 9784 1770 \r\n3 3691 9821 8044 1770 \r\n3 4808 9824 9823 1771 \r\n3 2309 9822 9824 1771 \r\n3 4346 9823 9822 1771 \r\n3 645 9827 9826 1772 \r\n3 2518 9825 9827 1772 \r\n3 1718 9826 9825 1772 \r\n3 2542 9830 9829 1773 \r\n3 4997 9828 9830 1773 \r\n3 2704 9829 9828 1773 \r\n3 2824 8807 6560 1774 \r\n3 262 9831 8807 1774 \r\n3 155 6560 9831 1774 \r\n3 2204 9834 9833 1775 \r\n3 1161 9832 9834 1775 \r\n3 1430 9833 9832 1775 \r\n3 3955 9836 8408 1776 \r\n3 2337 9835 9836 1776 \r\n3 4465 8408 9835 1776 \r\n3 1421 7001 6349 1777 \r\n3 2612 9837 7001 1777 \r\n3 1398 6349 9837 1777 \r\n3 4837 9840 9839 1778 \r\n3 2087 9838 9840 1778 \r\n3 704 9839 9838 1778 \r\n3 2203 9842 9841 1779 \r\n3 4438 8904 9842 1779 \r\n3 3543 9841 8904 1779 \r\n3 3193 9845 9844 1780 \r\n3 3184 9843 9845 1780 \r\n3 4346 9844 9843 1780 \r\n3 4071 9847 9846 1781 \r\n3 1217 8320 9847 1781 \r\n3 2087 9846 8320 1781 \r\n3 1562 9850 9849 1782 \r\n3 3318 9848 9850 1782 \r\n3 697 9849 9848 1782 \r\n3 1859 9853 9852 1783 \r\n3 2275 9851 9853 1783 \r\n3 3899 9852 9851 1783 \r\n3 540 9855 9854 1784 \r\n3 3063 7373 9855 1784 \r\n3 1702 9854 7373 1784 \r\n3 972 9858 9857 1785 \r\n3 2040 9856 9858 1785 \r\n3 2440 9857 9856 1785 \r\n3 4038 9861 9860 1786 \r\n3 1172 9859 9861 1786 \r\n3 1451 9860 9859 1786 \r\n3 4933 9863 7784 1787 \r\n3 1136 9862 9863 1787 \r\n3 2894 7784 9862 1787 \r\n3 3667 9865 7629 1788 \r\n3 1412 9864 9865 1788 \r\n3 3257 7629 9864 1788 \r\n3 2534 9868 9867 1789 \r\n3 2380 9866 9868 1789 \r\n3 4976 9867 9866 1789 \r\n3 654 9870 9869 1790 \r\n3 628 5271 9870 1790 \r\n3 2245 9869 5271 1790 \r\n3 628 9871 6659 1791 \r\n3 4910 9636 9871 1791 \r\n3 830 6659 9636 1791 \r\n3 3434 9874 9873 1792 \r\n3 2383 9872 9874 1792 \r\n3 3987 9873 9872 1792 \r\n3 4033 9876 9488 1793 \r\n3 3976 9875 9876 1793 \r\n3 1463 9488 9875 1793 \r\n3 1286 9879 9878 1794 \r\n3 1373 9877 9879 1794 \r\n3 2354 9878 9877 1794 \r\n3 2824 6559 9880 1795 \r\n3 3561 9156 6559 1795 \r\n3 2409 9880 9156 1795 \r\n3 413 9883 9882 1796 \r\n3 1745 9881 9883 1796 \r\n3 2208 9882 9881 1796 \r\n3 4497 9886 9885 1797 \r\n3 3859 9884 9886 1797 \r\n3 2982 9885 9884 1797 \r\n3 2165 9888 9887 1798 \r\n3 4752 7236 9888 1798 \r\n3 1092 9887 7236 1798 \r\n3 2924 9890 9889 1799 \r\n3 3827 6225 9890 1799 \r\n3 4011 9889 6225 1799 \r\n3 857 9893 9892 1800 \r\n3 4721 9891 9893 1800 \r\n3 1526 9892 9891 1800 \r\n3 3488 9896 9895 1801 \r\n3 4176 9894 9896 1801 \r\n3 3851 9895 9894 1801 \r\n3 4989 9899 9898 1802 \r\n3 2710 9897 9899 1802 \r\n3 1925 9898 9897 1802 \r\n3 1627 9902 9901 1803 \r\n3 288 9900 9902 1803 \r\n3 1848 9901 9900 1803 \r\n3 3603 9904 9903 1804 \r\n3 3553 6390 9904 1804 \r\n3 2627 9903 6390 1804 \r\n3 3273 9907 9906 1805 \r\n3 3177 9905 9907 1805 \r\n3 1167 9906 9905 1805 \r\n3 2241 9910 9909 1806 \r\n3 32 9908 9910 1806 \r\n3 1531 9909 9908 1806 \r\n3 4647 8629 9912 1807 \r\n3 2703 9911 8629 1807 \r\n3 646 9912 9911 1807 \r\n3 3287 9915 9914 1808 \r\n3 1516 9913 9915 1808 \r\n3 1647 9914 9913 1808 \r\n3 722 9917 8290 1809 \r\n3 3408 9916 9917 1809 \r\n3 4156 8290 9916 1809 \r\n3 4993 9920 9919 1810 \r\n3 2258 9918 9920 1810 \r\n3 1769 9919 9918 1810 \r\n3 118 9923 9922 1811 \r\n3 1657 9921 9923 1811 \r\n3 4917 9922 9921 1811 \r\n3 763 9926 9925 1812 \r\n3 2545 9924 9926 1812 \r\n3 1443 9925 9924 1812 \r\n3 4727 9929 9928 1813 \r\n3 177 9927 9929 1813 \r\n3 4363 9928 9927 1813 \r\n3 3383 9932 9931 1814 \r\n3 4362 9930 9932 1814 \r\n3 3129 9931 9930 1814 \r\n3 799 9934 8304 1815 \r\n3 1381 9933 9934 1815 \r\n3 1814 8304 9933 1815 \r\n3 738 7983 5285 1816 \r\n3 2871 9935 7983 1816 \r\n3 4192 5285 9935 1816 \r\n3 1064 9938 9937 1817 \r\n3 3762 9936 9938 1817 \r\n3 1844 9937 9936 1817 \r\n3 3431 9940 9939 1818 \r\n3 1536 7700 9940 1818 \r\n3 3686 9939 7700 1818 \r\n3 1637 8686 9942 1819 \r\n3 2763 9941 8686 1819 \r\n3 3258 9942 9941 1819 \r\n3 238 5146 8462 1820 \r\n3 1334 9943 5146 1820 \r\n3 1275 8462 9943 1820 \r\n3 3013 9945 9539 1821 \r\n3 705 9944 9945 1821 \r\n3 371 9539 9944 1821 \r\n3 4158 9947 9946 1822 \r\n3 4342 8388 9947 1822 \r\n3 3747 9946 8388 1822 \r\n3 581 7071 9949 1823 \r\n3 4209 9948 7071 1823 \r\n3 1552 9949 9948 1823 \r\n3 4813 9952 9951 1824 \r\n3 4721 9950 9952 1824 \r\n3 4384 9951 9950 1824 \r\n3 1140 9955 9954 1825 \r\n3 572 9953 9955 1825 \r\n3 2073 9954 9953 1825 \r\n3 2362 9958 9957 1826 \r\n3 739 9956 9958 1826 \r\n3 1890 9957 9956 1826 \r\n3 4542 9961 9960 1827 \r\n3 2918 9959 9961 1827 \r\n3 2577 9960 9959 1827 \r\n3 3324 7876 9963 1828 \r\n3 3349 9962 7876 1828 \r\n3 4777 9963 9962 1828 \r\n3 241 9965 9964 1829 \r\n3 3808 6237 9965 1829 \r\n3 3087 9964 6237 1829 \r\n3 3067 9968 9967 1830 \r\n3 1096 9966 9968 1830 \r\n3 4435 9967 9966 1830 \r\n3 3057 9971 9970 1831 \r\n3 728 9969 9971 1831 \r\n3 1232 9970 9969 1831 \r\n3 3893 5071 9972 1832 \r\n3 622 6412 5071 1832 \r\n3 4856 9972 6412 1832 \r\n3 779 9974 8972 1833 \r\n3 2080 9973 9974 1833 \r\n3 2017 8972 9973 1833 \r\n3 1972 6090 9976 1834 \r\n3 365 9975 6090 1834 \r\n3 1097 9976 9975 1834 \r\n3 4024 9217 9978 1835 \r\n3 3753 9977 9217 1835 \r\n3 3404 9978 9977 1835 \r\n3 4932 9981 9980 1836 \r\n3 1733 9979 9981 1836 \r\n3 3349 9980 9979 1836 \r\n3 3770 9983 9667 1837 \r\n3 4722 9982 9983 1837 \r\n3 3501 9667 9982 1837 \r\n3 2066 9986 9985 1838 \r\n3 2533 9984 9986 1838 \r\n3 825 9985 9984 1838 \r\n3 3158 9989 9988 1839 \r\n3 1825 9987 9989 1839 \r\n3 1207 9988 9987 1839 \r\n3 1803 9992 9991 1840 \r\n3 4430 9990 9992 1840 \r\n3 1437 9991 9990 1840 \r\n3 1902 9994 9993 1841 \r\n3 2992 5904 9994 1841 \r\n3 4639 9993 5904 1841 \r\n3 4276 8270 9996 1842 \r\n3 3498 9995 8270 1842 \r\n3 1459 9996 9995 1842 \r\n3 4859 5400 6794 1843 \r\n3 1130 9145 5400 1843 \r\n3 4202 6794 9145 1843 \r\n3 1602 9999 9998 1844 \r\n3 4719 9997 9999 1844 \r\n3 3217 9998 9997 1844 \r\n3 1929 10001 10000 1845 \r\n3 4239 9158 10001 1845 \r\n3 4351 10000 9158 1845 \r\n3 101 10004 10003 1846 \r\n3 2370 10002 10004 1846 \r\n3 4388 10003 10002 1846 \r\n3 2136 10007 10006 1847 \r\n3 903 10005 10007 1847 \r\n3 2060 10006 10005 1847 \r\n3 19 10010 10009 1848 \r\n3 1425 10008 10010 1848 \r\n3 1151 10009 10008 1848 \r\n3 2381 8149 10012 1849 \r\n3 2239 10011 8149 1849 \r\n3 51 10012 10011 1849 \r\n3 4340 10014 10013 1850 \r\n3 3409 5249 10014 1850 \r\n3 3587 10013 5249 1850 \r\n3 4275 6948 10016 1851 \r\n3 2099 10015 6948 1851 \r\n3 4482 10016 10015 1851 \r\n3 4074 10019 10018 1852 \r\n3 3078 10017 10019 1852 \r\n3 2282 10018 10017 1852 \r\n3 4616 10022 10021 1853 \r\n3 3854 10020 10022 1853 \r\n3 2623 10021 10020 1853 \r\n3 4207 10025 10024 1854 \r\n3 2391 10023 10025 1854 \r\n3 208 10024 10023 1854 \r\n3 62 10028 10027 1855 \r\n3 2000 10026 10028 1855 \r\n3 2163 10027 10026 1855 \r\n3 3948 10031 10030 1856 \r\n3 1716 10029 10031 1856 \r\n3 3259 10030 10029 1856 \r\n3 3076 10034 10033 1857 \r\n3 2355 10032 10034 1857 \r\n3 2969 10033 10032 1857 \r\n3 3131 10036 10035 1858 \r\n3 4126 9332 10036 1858 \r\n3 3373 10035 9332 1858 \r\n3 3046 10038 5509 1859 \r\n3 3752 10037 10038 1859 \r\n3 4358 5509 10037 1859 \r\n3 2975 10040 10039 1860 \r\n3 2896 5608 10040 1860 \r\n3 2316 10039 5608 1860 \r\n3 2012 10043 10042 1861 \r\n3 4318 10041 10043 1861 \r\n3 2762 10042 10041 1861 \r\n3 4248 10046 10045 1862 \r\n3 1806 10044 10046 1862 \r\n3 4375 10045 10044 1862 \r\n3 201 10048 5434 1863 \r\n3 773 10047 10048 1863 \r\n3 1556 5434 10047 1863 \r\n3 2669 10050 9665 1864 \r\n3 4691 10049 10050 1864 \r\n3 3873 9665 10049 1864 \r\n3 2439 10052 10051 1865 \r\n3 2949 8924 10052 1865 \r\n3 4180 10051 8924 1865 \r\n3 4636 10055 10054 1866 \r\n3 1186 10053 10055 1866 \r\n3 2764 10054 10053 1866 \r\n3 2905 10058 10057 1867 \r\n3 3592 10056 10058 1867 \r\n3 1065 10057 10056 1867 \r\n3 697 5644 9849 1868 \r\n3 214 10059 5644 1868 \r\n3 1562 9849 10059 1868 \r\n3 3609 10062 10061 1869 \r\n3 829 10060 10062 1869 \r\n3 568 10061 10060 1869 \r\n3 1736 10065 10064 1870 \r\n3 4263 10063 10065 1870 \r\n3 2884 10064 10063 1870 \r\n3 991 10068 10067 1871 \r\n3 2139 10066 10068 1871 \r\n3 4630 10067 10066 1871 \r\n3 392 10071 10070 1872 \r\n3 332 10069 10071 1872 \r\n3 1154 10070 10069 1872 \r\n3 1267 10074 10073 1873 \r\n3 3842 10072 10074 1873 \r\n3 1337 10073 10072 1873 \r\n3 2418 10077 10076 1874 \r\n3 4330 10075 10077 1874 \r\n3 4254 10076 10075 1874 \r\n3 3651 5666 10079 1875 \r\n3 721 10078 5666 1875 \r\n3 2300 10079 10078 1875 \r\n3 1340 10082 10081 1876 \r\n3 806 10080 10082 1876 \r\n3 2306 10081 10080 1876 \r\n3 2147 10085 10084 1877 \r\n3 4633 10083 10085 1877 \r\n3 2475 10084 10083 1877 \r\n3 309 10087 6389 1878 \r\n3 4079 10086 10087 1878 \r\n3 2627 6389 10086 1878 \r\n3 2688 10090 10089 1879 \r\n3 3896 10088 10090 1879 \r\n3 2822 10089 10088 1879 \r\n3 4980 10093 10092 1880 \r\n3 3356 10091 10093 1880 \r\n3 4409 10092 10091 1880 \r\n3 2803 10096 10095 1881 \r\n3 4169 10094 10096 1881 \r\n3 602 10095 10094 1881 \r\n3 3040 10099 10098 1882 \r\n3 1796 10097 10099 1882 \r\n3 4965 10098 10097 1882 \r\n3 4579 10102 10101 1883 \r\n3 3507 10100 10102 1883 \r\n3 752 10101 10100 1883 \r\n3 4950 10105 10104 1884 \r\n3 2520 10103 10105 1884 \r\n3 3382 10104 10103 1884 \r\n3 3472 10108 10107 1885 \r\n3 4520 10106 10108 1885 \r\n3 2548 10107 10106 1885 \r\n3 3306 10111 10110 1886 \r\n3 4356 10109 10111 1886 \r\n3 1843 10110 10109 1886 \r\n3 268 10114 10113 1887 \r\n3 385 10112 10114 1887 \r\n3 1568 10113 10112 1887 \r\n3 1834 10116 5195 1888 \r\n3 1194 10115 10116 1888 \r\n3 1509 5195 10115 1888 \r\n3 4953 10119 10118 1889 \r\n3 1006 10117 10119 1889 \r\n3 4527 10118 10117 1889 \r\n3 2002 10122 10121 1890 \r\n3 380 10120 10122 1890 \r\n3 588 10121 10120 1890 \r\n3 2916 10124 8293 1891 \r\n3 1807 10123 10124 1891 \r\n3 4261 8293 10123 1891 \r\n3 728 10127 10126 1892 \r\n3 3731 10125 10127 1892 \r\n3 4381 10126 10125 1892 \r\n3 357 10130 10129 1893 \r\n3 820 10128 10130 1893 \r\n3 2184 10129 10128 1893 \r\n3 4921 10133 10132 1894 \r\n3 1243 10131 10133 1894 \r\n3 2921 10132 10131 1894 \r\n3 4467 10136 10135 1895 \r\n3 3189 10134 10136 1895 \r\n3 372 10135 10134 1895 \r\n3 2158 10138 10137 1896 \r\n3 2132 6574 10138 1896 \r\n3 653 10137 6574 1896 \r\n3 196 10141 10140 1897 \r\n3 2254 10139 10141 1897 \r\n3 1403 10140 10139 1897 \r\n3 2182 10143 6020 1898 \r\n3 623 10142 10143 1898 \r\n3 4070 6020 10142 1898 \r\n3 37 10146 10145 1899 \r\n3 1000 10144 10146 1899 \r\n3 1952 10145 10144 1899 \r\n3 2072 9271 10148 1900 \r\n3 2693 10147 9271 1900 \r\n3 4041 10148 10147 1900 \r\n3 2620 10150 8036 1901 \r\n3 1395 10149 10150 1901 \r\n3 877 8036 10149 1901 \r\n3 403 9783 10152 1902 \r\n3 4947 10151 9783 1902 \r\n3 853 10152 10151 1902 \r\n3 4881 10155 10154 1903 \r\n3 3906 10153 10155 1903 \r\n3 4157 10154 10153 1903 \r\n3 3394 10157 9311 1904 \r\n3 2927 10156 10157 1904 \r\n3 3847 9311 10156 1904 \r\n3 3615 5121 10159 1905 \r\n3 3960 10158 5121 1905 \r\n3 1715 10159 10158 1905 \r\n3 1210 7684 10161 1906 \r\n3 1250 10160 7684 1906 \r\n3 1468 10161 10160 1906 \r\n3 2698 10164 10163 1907 \r\n3 2581 10162 10164 1907 \r\n3 545 10163 10162 1907 \r\n3 2205 10167 10166 1908 \r\n3 3704 10165 10167 1908 \r\n3 2711 10166 10165 1908 \r\n3 1972 9976 10169 1909 \r\n3 1097 10168 9976 1909 \r\n3 3214 10169 10168 1909 \r\n3 94 5797 10170 1910 \r\n3 4184 6434 5797 1910 \r\n3 1669 10170 6434 1910 \r\n3 2717 10173 10172 1911 \r\n3 2594 10171 10173 1911 \r\n3 3969 10172 10171 1911 \r\n3 3713 8662 10175 1912 \r\n3 2880 10174 8662 1912 \r\n3 1460 10175 10174 1912 \r\n3 1336 10178 10177 1913 \r\n3 989 10176 10178 1913 \r\n3 1328 10177 10176 1913 \r\n3 3741 10181 10180 1914 \r\n3 3154 10179 10181 1914 \r\n3 617 10180 10179 1914 \r\n3 4271 10183 10182 1915 \r\n3 3014 8917 10183 1915 \r\n3 4100 10182 8917 1915 \r\n3 4483 10184 6300 1916 \r\n3 2355 10034 10184 1916 \r\n3 3076 6300 10034 1916 \r\n3 2315 8547 10186 1917 \r\n3 660 10185 8547 1917 \r\n3 3874 10186 10185 1917 \r\n3 1744 6518 10188 1918 \r\n3 1309 10187 6518 1918 \r\n3 1263 10188 10187 1918 \r\n3 2927 10190 10156 1919 \r\n3 716 10189 10190 1919 \r\n3 3847 10156 10189 1919 \r\n3 3333 10193 10192 1920 \r\n3 3383 10191 10193 1920 \r\n3 521 10192 10191 1920 \r\n3 3504 10196 10195 1921 \r\n3 853 10194 10196 1921 \r\n3 4821 10195 10194 1921 \r\n3 2903 10199 10198 1922 \r\n3 3198 10197 10199 1922 \r\n3 1055 10198 10197 1922 \r\n3 97 8826 10201 1923 \r\n3 63 10200 8826 1923 \r\n3 2333 10201 10200 1923 \r\n3 528 10204 10203 1924 \r\n3 2326 10202 10204 1924 \r\n3 4569 10203 10202 1924 \r\n3 4017 10206 10205 1925 \r\n3 1497 7566 10206 1925 \r\n3 539 10205 7566 1925 \r\n3 3007 10209 10208 1926 \r\n3 3520 10207 10209 1926 \r\n3 1206 10208 10207 1926 \r\n3 2635 10212 10211 1927 \r\n3 371 10210 10212 1927 \r\n3 2186 10211 10210 1927 \r\n3 3844 10214 10213 1928 \r\n3 4952 7618 10214 1928 \r\n3 3461 10213 7618 1928 \r\n3 251 7785 10216 1929 \r\n3 2894 10215 7785 1929 \r\n3 3332 10216 10215 1929 \r\n3 3146 9768 10218 1930 \r\n3 3239 10217 9768 1930 \r\n3 3030 10218 10217 1930 \r\n3 4318 6154 10219 1931 \r\n3 4735 7548 6154 1931 \r\n3 4528 10219 7548 1931 \r\n3 1921 10221 8110 1932 \r\n3 1850 10220 10221 1932 \r\n3 4570 8110 10220 1932 \r\n3 4135 7793 10223 1933 \r\n3 1213 10222 7793 1933 \r\n3 1991 10223 10222 1933 \r\n3 417 10226 10225 1934 \r\n3 4625 10224 10226 1934 \r\n3 2462 10225 10224 1934 \r\n3 4344 10228 10227 1935 \r\n3 3915 8765 10228 1935 \r\n3 2676 10227 8765 1935 \r\n3 3936 10230 10229 1936 \r\n3 701 8111 10230 1936 \r\n3 3130 10229 8111 1936 \r\n3 3468 10233 10232 1937 \r\n3 2287 10231 10233 1937 \r\n3 235 10232 10231 1937 \r\n3 1185 10236 10235 1938 \r\n3 4966 10234 10236 1938 \r\n3 3277 10235 10234 1938 \r\n3 1382 10239 10238 1939 \r\n3 4747 10237 10239 1939 \r\n3 590 10238 10237 1939 \r\n3 2200 10242 10241 1940 \r\n3 4888 10240 10242 1940 \r\n3 2321 10241 10240 1940 \r\n3 4536 10245 10244 1941 \r\n3 1015 10243 10245 1941 \r\n3 1456 10244 10243 1941 \r\n3 1771 10247 10246 1942 \r\n3 1045 7345 10247 1942 \r\n3 3825 10246 7345 1942 \r\n3 1159 7175 10249 1943 \r\n3 1984 10248 7175 1943 \r\n3 762 10249 10248 1943 \r\n3 2158 10137 10251 1944 \r\n3 653 10250 10137 1944 \r\n3 1666 10251 10250 1944 \r\n3 3819 10254 10253 1945 \r\n3 430 10252 10254 1945 \r\n3 1812 10253 10252 1945 \r\n3 3023 10257 10256 1946 \r\n3 3914 10255 10257 1946 \r\n3 1550 10256 10255 1946 \r\n3 1666 10259 6277 1947 \r\n3 963 10258 10259 1947 \r\n3 3567 6277 10258 1947 \r\n3 2651 10262 10261 1948 \r\n3 1585 10260 10262 1948 \r\n3 160 10261 10260 1948 \r\n3 2070 10265 10264 1949 \r\n3 1635 10263 10265 1949 \r\n3 1336 10264 10263 1949 \r\n3 4557 10268 10267 1950 \r\n3 3986 10266 10268 1950 \r\n3 3241 10267 10266 1950 \r\n3 3224 10271 10270 1951 \r\n3 2306 10269 10271 1951 \r\n3 4300 10270 10269 1951 \r\n3 2690 10274 10273 1952 \r\n3 731 10272 10274 1952 \r\n3 3503 10273 10272 1952 \r\n3 888 10277 10276 1953 \r\n3 3148 10275 10277 1953 \r\n3 1800 10276 10275 1953 \r\n3 1160 10278 7302 1954 \r\n3 2053 5798 10278 1954 \r\n3 3947 7302 5798 1954 \r\n3 2700 10281 10280 1955 \r\n3 909 10279 10281 1955 \r\n3 2477 10280 10279 1955 \r\n3 3848 10284 10283 1956 \r\n3 6 10282 10284 1956 \r\n3 1116 10283 10282 1956 \r\n3 3018 10287 10286 1957 \r\n3 1703 10285 10287 1957 \r\n3 783 10286 10285 1957 \r\n3 1928 10289 10288 1958 \r\n3 3139 7156 10289 1958 \r\n3 421 10288 7156 1958 \r\n3 3088 5114 10291 1959 \r\n3 3113 10290 5114 1959 \r\n3 3315 10291 10290 1959 \r\n3 129 10294 10293 1960 \r\n3 4352 10292 10294 1960 \r\n3 4726 10293 10292 1960 \r\n3 4616 5653 10296 1961 \r\n3 3717 10295 5653 1961 \r\n3 2445 10296 10295 1961 \r\n3 2557 5909 9760 1962 \r\n3 2769 10297 5909 1962 \r\n3 2933 9760 10297 1962 \r\n3 2844 10300 10299 1963 \r\n3 298 10298 10300 1963 \r\n3 4687 10299 10298 1963 \r\n3 3451 10303 10302 1964 \r\n3 4600 10301 10303 1964 \r\n3 1013 10302 10301 1964 \r\n3 4749 8949 10305 1965 \r\n3 1477 10304 8949 1965 \r\n3 4706 10305 10304 1965 \r\n3 814 10307 10306 1966 \r\n3 4380 6983 10307 1966 \r\n3 929 10306 6983 1966 \r\n3 2829 10309 6219 1967 \r\n3 3180 10308 10309 1967 \r\n3 4421 6219 10308 1967 \r\n3 2589 5286 10311 1968 \r\n3 4192 10310 5286 1968 \r\n3 4196 10311 10310 1968 \r\n3 3676 10313 10312 1969 \r\n3 4875 5206 10313 1969 \r\n3 4142 10312 5206 1969 \r\n3 4229 10316 10315 1970 \r\n3 1647 10314 10316 1970 \r\n3 4635 10315 10314 1970 \r\n3 3059 10318 10317 1971 \r\n3 3890 9412 10318 1971 \r\n3 4718 10317 9412 1971 \r\n3 712 10321 10320 1972 \r\n3 4292 10319 10321 1972 \r\n3 1020 10320 10319 1972 \r\n3 519 10324 10323 1973 \r\n3 389 10322 10324 1973 \r\n3 3536 10323 10322 1973 \r\n3 3777 10327 10326 1974 \r\n3 3172 10325 10327 1974 \r\n3 1094 10326 10325 1974 \r\n3 4864 10330 10329 1975 \r\n3 4469 10328 10330 1975 \r\n3 4053 10329 10328 1975 \r\n3 335 10331 6130 1976 \r\n3 591 6977 10331 1976 \r\n3 4344 6130 6977 1976 \r\n3 3838 10334 10333 1977 \r\n3 1606 10332 10334 1977 \r\n3 149 10333 10332 1977 \r\n3 4640 9186 10336 1978 \r\n3 141 10335 9186 1978 \r\n3 4870 10336 10335 1978 \r\n3 4555 10339 10338 1979 \r\n3 2969 10337 10339 1979 \r\n3 3374 10338 10337 1979 \r\n3 344 10341 9192 1980 \r\n3 3996 10340 10341 1980 \r\n3 4515 9192 10340 1980 \r\n3 1831 10344 10343 1981 \r\n3 2433 10342 10344 1981 \r\n3 1781 10343 10342 1981 \r\n3 4579 10101 5299 1982 \r\n3 752 10345 10101 1982 \r\n3 2573 5299 10345 1982 \r\n3 1108 10348 10347 1983 \r\n3 492 10346 10348 1983 \r\n3 4636 10347 10346 1983 \r\n3 2199 7463 10349 1984 \r\n3 1223 9248 7463 1984 \r\n3 2338 10349 9248 1984 \r\n3 3699 10352 10351 1985 \r\n3 3080 10350 10352 1985 \r\n3 4954 10351 10350 1985 \r\n3 2712 10355 10354 1986 \r\n3 187 10353 10355 1986 \r\n3 1695 10354 10353 1986 \r\n3 4689 10358 10357 1987 \r\n3 471 10356 10358 1987 \r\n3 2212 10357 10356 1987 \r\n3 1009 10361 10360 1988 \r\n3 3782 10359 10361 1988 \r\n3 4643 10360 10359 1988 \r\n3 2847 10364 10363 1989 \r\n3 698 10362 10364 1989 \r\n3 4912 10363 10362 1989 \r\n3 1585 10262 10366 1990 \r\n3 2651 10365 10262 1990 \r\n3 2990 10366 10365 1990 \r\n3 1822 10369 10368 1991 \r\n3 2024 10367 10369 1991 \r\n3 338 10368 10367 1991 \r\n3 2415 7769 10371 1992 \r\n3 1351 10370 7769 1992 \r\n3 1829 10371 10370 1992 \r\n3 496 10373 7971 1993 \r\n3 992 10372 10373 1993 \r\n3 2058 7971 10372 1993 \r\n3 3405 10375 7681 1994 \r\n3 3301 10374 10375 1994 \r\n3 736 7681 10374 1994 \r\n3 2506 10378 10377 1995 \r\n3 2116 10376 10378 1995 \r\n3 1964 10377 10376 1995 \r\n3 2375 10381 10380 1996 \r\n3 912 10379 10381 1996 \r\n3 1672 10380 10379 1996 \r\n3 4062 10384 10383 1997 \r\n3 1655 10382 10384 1997 \r\n3 468 10383 10382 1997 \r\n3 4392 9286 10385 1998 \r\n3 2648 7910 9286 1998 \r\n3 1869 10385 7910 1998 \r\n3 4850 10387 9506 1999 \r\n3 1017 10386 10387 1999 \r\n3 598 9506 10386 1999 \r\n3 2670 10390 10389 2000 \r\n3 3781 10388 10390 2000 \r\n3 3867 10389 10388 2000 \r\n3 1452 10392 10391 2001 \r\n3 4029 5513 10392 2001 \r\n3 3698 10391 5513 2001 \r\n3 3215 10395 10394 2002 \r\n3 2438 10393 10395 2002 \r\n3 3825 10394 10393 2002 \r\n3 3253 10397 10396 2003 \r\n3 3424 9476 10397 2003 \r\n3 20 10396 9476 2003 \r\n3 756 10400 10399 2004 \r\n3 3494 10398 10400 2004 \r\n3 1396 10399 10398 2004 \r\n3 2671 10403 10402 2005 \r\n3 647 10401 10403 2005 \r\n3 2223 10402 10401 2005 \r\n3 2630 10406 10405 2006 \r\n3 979 10404 10406 2006 \r\n3 4113 10405 10404 2006 \r\n3 4415 10409 10408 2007 \r\n3 3832 10407 10409 2007 \r\n3 1520 10408 10407 2007 \r\n3 55 10412 10411 2008 \r\n3 2444 10410 10412 2008 \r\n3 1352 10411 10410 2008 \r\n3 4265 7222 6337 2009 \r\n3 3944 6952 7222 2009 \r\n3 500 6337 6952 2009 \r\n3 4941 10415 10414 2010 \r\n3 3793 10413 10415 2010 \r\n3 3222 10414 10413 2010 \r\n3 4182 10418 10417 2011 \r\n3 669 10416 10418 2011 \r\n3 2874 10417 10416 2011 \r\n3 2176 6844 10420 2012 \r\n3 2094 10419 6844 2012 \r\n3 2821 10420 10419 2012 \r\n3 4353 10423 10422 2013 \r\n3 3857 10421 10423 2013 \r\n3 862 10422 10421 2013 \r\n3 4527 10117 7658 2014 \r\n3 1006 10424 10117 2014 \r\n3 2343 7658 10424 2014 \r\n3 123 10427 10426 2015 \r\n3 2378 10425 10427 2015 \r\n3 3490 10426 10425 2015 \r\n3 1616 10429 6171 2016 \r\n3 4321 10428 10429 2016 \r\n3 1309 6171 10428 2016 \r\n3 1411 6607 10430 2017 \r\n3 53 8178 6607 2017 \r\n3 3582 10430 8178 2017 \r\n3 370 10433 10432 2018 \r\n3 538 10431 10433 2018 \r\n3 3024 10432 10431 2018 \r\n3 1882 10436 10435 2019 \r\n3 1538 10434 10436 2019 \r\n3 1617 10435 10434 2019 \r\n3 1597 10439 10438 2020 \r\n3 4149 10437 10439 2020 \r\n3 3677 10438 10437 2020 \r\n3 3863 10442 10441 2021 \r\n3 1873 10440 10442 2021 \r\n3 1040 10441 10440 2021 \r\n3 896 10445 10444 2022 \r\n3 3056 10443 10445 2022 \r\n3 1580 10444 10443 2022 \r\n3 4741 5975 10447 2023 \r\n3 4912 10446 5975 2023 \r\n3 299 10447 10446 2023 \r\n3 161 10449 10448 2024 \r\n3 3408 9917 10449 2024 \r\n3 722 10448 9917 2024 \r\n3 3220 10452 10451 2025 \r\n3 1930 10450 10452 2025 \r\n3 3186 10451 10450 2025 \r\n3 191 10455 10454 2026 \r\n3 2132 10453 10455 2026 \r\n3 2123 10454 10453 2026 \r\n3 659 10458 10457 2027 \r\n3 3789 10456 10458 2027 \r\n3 4134 10457 10456 2027 \r\n3 2587 7536 10459 2028 \r\n3 4300 10269 7536 2028 \r\n3 2306 10459 10269 2028 \r\n3 3698 5512 10461 2029 \r\n3 4629 10460 5512 2029 \r\n3 2431 10461 10460 2029 \r\n3 3473 10464 10463 2030 \r\n3 782 10462 10464 2030 \r\n3 4745 10463 10462 2030 \r\n3 207 10465 6160 2031 \r\n3 4507 8342 10465 2031 \r\n3 3084 6160 8342 2031 \r\n3 408 10467 9504 2032 \r\n3 86 10466 10467 2032 \r\n3 638 9504 10466 2032 \r\n3 1196 10470 10469 2033 \r\n3 3961 10468 10470 2033 \r\n3 4719 10469 10468 2033 \r\n3 3471 10473 10472 2034 \r\n3 3292 10471 10473 2034 \r\n3 4871 10472 10471 2034 \r\n3 2209 10476 10475 2035 \r\n3 895 10474 10476 2035 \r\n3 367 10475 10474 2035 \r\n3 1964 10479 10478 2036 \r\n3 1804 10477 10479 2036 \r\n3 2834 10478 10477 2036 \r\n3 1886 10482 10481 2037 \r\n3 3249 10480 10482 2037 \r\n3 4235 10481 10480 2037 \r\n3 1682 10485 10484 2038 \r\n3 36 10483 10485 2038 \r\n3 4671 10484 10483 2038 \r\n3 3788 10488 10487 2039 \r\n3 2988 10486 10488 2039 \r\n3 887 10487 10486 2039 \r\n3 4387 8976 10490 2040 \r\n3 402 10489 8976 2040 \r\n3 2464 10490 10489 2040 \r\n3 1629 10493 10492 2041 \r\n3 2270 10491 10493 2041 \r\n3 636 10492 10491 2041 \r\n3 987 10496 10495 2042 \r\n3 640 10494 10496 2042 \r\n3 3156 10495 10494 2042 \r\n3 1246 10499 10498 2043 \r\n3 3641 10497 10499 2043 \r\n3 1197 10498 10497 2043 \r\n3 1807 10501 10123 2044 \r\n3 3168 10500 10501 2044 \r\n3 4261 10123 10500 2044 \r\n3 4899 10504 10503 2045 \r\n3 2622 10502 10504 2045 \r\n3 1448 10503 10502 2045 \r\n3 1778 10507 10506 2046 \r\n3 3172 10505 10507 2046 \r\n3 627 10506 10505 2046 \r\n3 2108 10510 10509 2047 \r\n3 1372 10508 10510 2047 \r\n3 931 10509 10508 2047 \r\n3 1639 10512 10511 2048 \r\n3 2546 6426 10512 2048 \r\n3 2790 10511 6426 2048 \r\n3 551 10515 10514 2049 \r\n3 2917 10513 10515 2049 \r\n3 4096 10514 10513 2049 \r\n3 192 10517 10516 2050 \r\n3 113 9305 10517 2050 \r\n3 4595 10516 9305 2050 \r\n3 4154 10520 10519 2051 \r\n3 691 10518 10520 2051 \r\n3 2471 10519 10518 2051 \r\n3 1551 10523 10522 2052 \r\n3 1829 10521 10523 2052 \r\n3 2094 10522 10521 2052 \r\n3 1483 10526 10525 2053 \r\n3 180 10524 10526 2053 \r\n3 4509 10525 10524 2053 \r\n3 2174 10529 10528 2054 \r\n3 883 10527 10529 2054 \r\n3 3584 10528 10527 2054 \r\n3 4878 10531 10530 2055 \r\n3 38 9468 10531 2055 \r\n3 2548 10530 9468 2055 \r\n3 712 10320 10533 2056 \r\n3 1020 10532 10320 2056 \r\n3 4529 10533 10532 2056 \r\n3 3753 9216 10535 2057 \r\n3 558 10534 9216 2057 \r\n3 3169 10535 10534 2057 \r\n3 2391 10538 10537 2058 \r\n3 92 10536 10538 2058 \r\n3 2583 10537 10536 2058 \r\n3 621 10541 10540 2059 \r\n3 178 10539 10541 2059 \r\n3 993 10540 10539 2059 \r\n3 3061 10543 10542 2060 \r\n3 262 6769 10543 2060 \r\n3 508 10542 6769 2060 \r\n3 2420 10545 8479 2061 \r\n3 443 10544 10545 2061 \r\n3 131 8479 10544 2061 \r\n3 1595 10547 10546 2062 \r\n3 4521 6998 10547 2062 \r\n3 4491 10546 6998 2062 \r\n3 3488 10550 10549 2063 \r\n3 4118 10548 10550 2063 \r\n3 1504 10549 10548 2063 \r\n3 2268 10552 5107 2064 \r\n3 372 10551 10552 2064 \r\n3 999 5107 10551 2064 \r\n3 289 10554 7959 2065 \r\n3 785 10553 10554 2065 \r\n3 367 7959 10553 2065 \r\n3 3916 10557 10556 2066 \r\n3 2230 10555 10557 2066 \r\n3 580 10556 10555 2066 \r\n3 4463 10559 6766 2067 \r\n3 2255 10558 10559 2067 \r\n3 1720 6766 10558 2067 \r\n3 881 10562 10561 2068 \r\n3 1728 10560 10562 2068 \r\n3 2107 10561 10560 2068 \r\n3 3478 10565 10564 2069 \r\n3 4258 10563 10565 2069 \r\n3 2340 10564 10563 2069 \r\n3 1912 10568 10567 2070 \r\n3 4207 10566 10568 2070 \r\n3 2000 10567 10566 2070 \r\n3 2977 9083 10570 2071 \r\n3 1911 10569 9083 2071 \r\n3 300 10570 10569 2071 \r\n3 450 10572 10571 2072 \r\n3 3095 5288 10572 2072 \r\n3 2993 10571 5288 2072 \r\n3 2556 10575 10574 2073 \r\n3 3144 10573 10575 2073 \r\n3 850 10574 10573 2073 \r\n3 1884 10578 10577 2074 \r\n3 4956 10576 10578 2074 \r\n3 236 10577 10576 2074 \r\n3 4156 10581 10580 2075 \r\n3 4431 10579 10581 2075 \r\n3 2723 10580 10579 2075 \r\n3 4651 10584 10583 2076 \r\n3 2479 10582 10584 2076 \r\n3 3774 10583 10582 2076 \r\n3 728 10126 9969 2077 \r\n3 4381 10585 10126 2077 \r\n3 1232 9969 10585 2077 \r\n3 2526 10588 10587 2078 \r\n3 548 10586 10588 2078 \r\n3 2171 10587 10586 2078 \r\n3 4093 10591 10590 2079 \r\n3 695 10589 10591 2079 \r\n3 4902 10590 10589 2079 \r\n3 763 10594 10593 2080 \r\n3 2326 10592 10594 2080 \r\n3 2713 10593 10592 2080 \r\n3 193 10597 10596 2081 \r\n3 1588 10595 10597 2081 \r\n3 657 10596 10595 2081 \r\n3 950 5898 7471 2082 \r\n3 489 10598 5898 2082 \r\n3 3744 7471 10598 2082 \r\n3 785 10600 10599 2083 \r\n3 2319 9498 10600 2083 \r\n3 486 10599 9498 2083 \r\n3 70 10603 10602 2084 \r\n3 3210 10601 10603 2084 \r\n3 4230 10602 10601 2084 \r\n3 4921 10606 10605 2085 \r\n3 4407 10604 10606 2085 \r\n3 3537 10605 10604 2085 \r\n3 4480 10609 10608 2086 \r\n3 3310 10607 10609 2086 \r\n3 4789 10608 10607 2086 \r\n3 1456 10612 10611 2087 \r\n3 3110 10610 10612 2087 \r\n3 3573 10611 10610 2087 \r\n3 4737 10614 10613 2088 \r\n3 1555 7824 10614 2088 \r\n3 2749 10613 7824 2088 \r\n3 1814 10616 5268 2089 \r\n3 1345 10615 10616 2089 \r\n3 3503 5268 10615 2089 \r\n3 4001 10619 10618 2090 \r\n3 3528 10617 10619 2090 \r\n3 3556 10618 10617 2090 \r\n3 2490 9532 10621 2091 \r\n3 4869 10620 9532 2091 \r\n3 2726 10621 10620 2091 \r\n3 641 10624 10623 2092 \r\n3 2178 10622 10624 2092 \r\n3 3560 10623 10622 2092 \r\n3 455 10627 10626 2093 \r\n3 1259 10625 10627 2093 \r\n3 3600 10626 10625 2093 \r\n3 2850 10630 10629 2094 \r\n3 3427 10628 10630 2094 \r\n3 1104 10629 10628 2094 \r\n3 873 10633 10632 2095 \r\n3 2060 10631 10633 2095 \r\n3 1033 10632 10631 2095 \r\n3 4969 10635 10634 2096 \r\n3 1573 9344 10635 2096 \r\n3 4160 10634 9344 2096 \r\n3 4148 10638 10637 2097 \r\n3 926 10636 10638 2097 \r\n3 15 10637 10636 2097 \r\n3 3297 10641 10640 2098 \r\n3 2500 10639 10641 2098 \r\n3 111 10640 10639 2098 \r\n3 2821 10419 10643 2099 \r\n3 2094 10642 10419 2099 \r\n3 2656 10643 10642 2099 \r\n3 3886 10646 10645 2100 \r\n3 3505 10644 10646 2100 \r\n3 847 10645 10644 2100 \r\n3 4871 10648 10472 2101 \r\n3 220 10647 10648 2101 \r\n3 3471 10472 10647 2101 \r\n3 2136 10650 10649 2102 \r\n3 873 6959 10650 2102 \r\n3 1707 10649 6959 2102 \r\n3 1910 10653 10652 2103 \r\n3 2742 10651 10653 2103 \r\n3 441 10652 10651 2103 \r\n3 592 10656 10655 2104 \r\n3 134 10654 10656 2104 \r\n3 3625 10655 10654 2104 \r\n3 276 6405 10657 2105 \r\n3 3787 6072 6405 2105 \r\n3 624 10657 6072 2105 \r\n3 826 10659 5470 2106 \r\n3 1344 10658 10659 2106 \r\n3 4401 5470 10658 2106 \r\n3 4793 10662 10661 2107 \r\n3 650 10660 10662 2107 \r\n3 3932 10661 10660 2107 \r\n3 915 10665 10664 2108 \r\n3 4008 10663 10665 2108 \r\n3 4705 10664 10663 2108 \r\n3 3033 10668 10667 2109 \r\n3 4956 10666 10668 2109 \r\n3 3476 10667 10666 2109 \r\n3 1677 10671 10670 2110 \r\n3 2747 10669 10671 2110 \r\n3 668 10670 10669 2110 \r\n3 2060 10673 10631 2111 \r\n3 3098 10672 10673 2111 \r\n3 1033 10631 10672 2111 \r\n3 2544 10676 10675 2112 \r\n3 3514 10674 10676 2112 \r\n3 4733 10675 10674 2112 \r\n3 105 6712 10678 2113 \r\n3 336 10677 6712 2113 \r\n3 2234 10678 10677 2113 \r\n3 464 8706 8231 2114 \r\n3 4313 9749 8706 2114 \r\n3 998 8231 9749 2114 \r\n3 244 6618 10680 2115 \r\n3 104 10679 6618 2115 \r\n3 3690 10680 10679 2115 \r\n3 2389 10683 10682 2116 \r\n3 4864 10681 10683 2116 \r\n3 334 10682 10681 2116 \r\n3 4516 6831 10684 2117 \r\n3 2106 8964 6831 2117 \r\n3 2064 10684 8964 2117 \r\n3 4798 10687 10686 2118 \r\n3 185 10685 10687 2118 \r\n3 1452 10686 10685 2118 \r\n3 2639 10690 10689 2119 \r\n3 574 10688 10690 2119 \r\n3 3637 10689 10688 2119 \r\n3 1840 10692 9548 2120 \r\n3 4702 10691 10692 2120 \r\n3 1507 9548 10691 2120 \r\n3 4003 8837 10693 2121 \r\n3 1138 6654 8837 2121 \r\n3 469 10693 6654 2121 \r\n3 4152 10696 10695 2122 \r\n3 840 10694 10696 2122 \r\n3 685 10695 10694 2122 \r\n3 4357 10699 10698 2123 \r\n3 2811 10697 10699 2123 \r\n3 4023 10698 10697 2123 \r\n3 4761 10702 10701 2124 \r\n3 1684 10700 10702 2124 \r\n3 458 10701 10700 2124 \r\n3 2073 9953 10704 2125 \r\n3 572 10703 9953 2125 \r\n3 3958 10704 10703 2125 \r\n3 1760 10706 5334 2126 \r\n3 3733 10705 10706 2126 \r\n3 448 5334 10705 2126 \r\n3 320 10708 5374 2127 \r\n3 3392 10707 10708 2127 \r\n3 3467 5374 10707 2127 \r\n3 3388 8995 6091 2128 \r\n3 3348 10709 8995 2128 \r\n3 1735 6091 10709 2128 \r\n3 4122 10711 10710 2129 \r\n3 4375 8926 10711 2129 \r\n3 2044 10710 8926 2129 \r\n3 800 10714 10713 2130 \r\n3 4822 10712 10714 2130 \r\n3 4803 10713 10712 2130 \r\n3 3982 10717 10716 2131 \r\n3 3568 10715 10717 2131 \r\n3 1880 10716 10715 2131 \r\n3 451 10720 10719 2132 \r\n3 510 10718 10720 2132 \r\n3 2266 10719 10718 2132 \r\n3 4588 10723 10722 2133 \r\n3 4030 10721 10723 2133 \r\n3 259 10722 10721 2133 \r\n3 3289 10726 10725 2134 \r\n3 3538 10724 10726 2134 \r\n3 2755 10725 10724 2134 \r\n3 4009 10729 10728 2135 \r\n3 454 10727 10729 2135 \r\n3 274 10728 10727 2135 \r\n3 1641 7813 10731 2136 \r\n3 1227 10730 7813 2136 \r\n3 1657 10731 10730 2136 \r\n3 82 10734 10733 2137 \r\n3 1395 10732 10734 2137 \r\n3 644 10733 10732 2137 \r\n3 538 10433 9173 2138 \r\n3 370 10735 10433 2138 \r\n3 1561 9173 10735 2138 \r\n3 662 10737 6273 2139 \r\n3 1347 10736 10737 2139 \r\n3 4271 6273 10736 2139 \r\n3 1786 10739 8678 2140 \r\n3 2581 10738 10739 2140 \r\n3 1640 8678 10738 2140 \r\n3 465 10742 10741 2141 \r\n3 4851 10740 10742 2141 \r\n3 2054 10741 10740 2141 \r\n3 85 10744 10743 2142 \r\n3 1096 9968 10744 2142 \r\n3 3067 10743 9968 2142 \r\n3 357 10747 10746 2143 \r\n3 2221 10745 10747 2143 \r\n3 3764 10746 10745 2143 \r\n3 1683 8508 10748 2144 \r\n3 87 5597 8508 2144 \r\n3 3862 10748 5597 2144 \r\n3 1932 10750 8903 2145 \r\n3 4566 10749 10750 2145 \r\n3 3882 8903 10749 2145 \r\n3 1378 8874 9474 2146 \r\n3 3375 10751 8874 2146 \r\n3 2181 9474 10751 2146 \r\n3 3610 10754 10753 2147 \r\n3 2464 10752 10754 2147 \r\n3 878 10753 10752 2147 \r\n3 1422 10756 5449 2148 \r\n3 4114 10755 10756 2148 \r\n3 1504 5449 10755 2148 \r\n3 598 10759 10758 2149 \r\n3 1783 10757 10759 2149 \r\n3 1747 10758 10757 2149 \r\n3 2280 10762 10761 2150 \r\n3 2353 10760 10762 2150 \r\n3 2454 10761 10760 2150 \r\n3 4214 10765 10764 2151 \r\n3 3849 10763 10765 2151 \r\n3 1413 10764 10763 2151 \r\n3 1632 10768 10767 2152 \r\n3 4255 10766 10768 2152 \r\n3 2528 10767 10766 2152 \r\n3 244 10769 5897 2153 \r\n3 4524 6753 10769 2153 \r\n3 489 5897 6753 2153 \r\n3 2766 9700 10771 2154 \r\n3 2429 10770 9700 2154 \r\n3 3575 10771 10770 2154 \r\n3 559 6437 10773 2155 \r\n3 3045 10772 6437 2155 \r\n3 4627 10773 10772 2155 \r\n3 1662 10775 10774 2156 \r\n3 4114 10756 10775 2156 \r\n3 1422 10774 10756 2156 \r\n3 2827 10778 10777 2157 \r\n3 1266 10776 10778 2157 \r\n3 257 10777 10776 2157 \r\n3 4245 5439 10780 2158 \r\n3 2886 10779 5439 2158 \r\n3 2835 10780 10779 2158 \r\n3 378 10783 10782 2159 \r\n3 3631 10781 10783 2159 \r\n3 4884 10782 10781 2159 \r\n3 1272 10785 10784 2160 \r\n3 1465 7185 10785 2160 \r\n3 1862 10784 7185 2160 \r\n3 4674 10788 10787 2161 \r\n3 2437 10786 10788 2161 \r\n3 2607 10787 10786 2161 \r\n3 2179 10791 10790 2162 \r\n3 3073 10789 10791 2162 \r\n3 4149 10790 10789 2162 \r\n3 972 10793 9858 2163 \r\n3 4526 10792 10793 2163 \r\n3 2040 9858 10792 2163 \r\n3 631 10796 10795 2164 \r\n3 4389 10794 10796 2164 \r\n3 4681 10795 10794 2164 \r\n3 4894 10799 10798 2165 \r\n3 2640 10797 10799 2165 \r\n3 223 10798 10797 2165 \r\n3 3759 10801 10800 2166 \r\n3 4801 7069 10801 2166 \r\n3 581 10800 7069 2166 \r\n3 2188 10802 5863 2167 \r\n3 3421 8800 10802 2167 \r\n3 2530 5863 8800 2167 \r\n3 151 10805 10804 2168 \r\n3 1676 10803 10805 2168 \r\n3 865 10804 10803 2168 \r\n3 1822 10808 10807 2169 \r\n3 4451 10806 10808 2169 \r\n3 423 10807 10806 2169 \r\n3 3844 10811 10810 2170 \r\n3 906 10809 10811 2170 \r\n3 1131 10810 10809 2170 \r\n3 1338 10814 10813 2171 \r\n3 3521 10812 10814 2171 \r\n3 4885 10813 10812 2171 \r\n3 4959 10816 10815 2172 \r\n3 550 5004 10816 2172 \r\n3 2671 10815 5004 2172 \r\n3 40 6721 10818 2173 \r\n3 1881 10817 6721 2173 \r\n3 2787 10818 10817 2173 \r\n3 1202 10821 10820 2174 \r\n3 304 10819 10821 2174 \r\n3 2133 10820 10819 2174 \r\n3 1500 10823 10822 2175 \r\n3 1235 9231 10823 2175 \r\n3 2567 10822 9231 2175 \r\n3 2884 10825 10824 2176 \r\n3 403 10152 10825 2176 \r\n3 853 10824 10152 2176 \r\n3 4649 6748 8881 2177 \r\n3 4556 10826 6748 2177 \r\n3 3495 8881 10826 2177 \r\n3 3359 10829 10828 2178 \r\n3 1835 10827 10829 2178 \r\n3 2396 10828 10827 2178 \r\n3 2440 9790 10831 2179 \r\n3 112 10830 9790 2179 \r\n3 2168 10831 10830 2179 \r\n3 3875 5983 10833 2180 \r\n3 3250 10832 5983 2180 \r\n3 1234 10833 10832 2180 \r\n3 1479 10836 10835 2181 \r\n3 788 10834 10836 2181 \r\n3 4277 10835 10834 2181 \r\n3 1078 5473 10838 2182 \r\n3 4096 10837 5473 2182 \r\n3 3683 10838 10837 2182 \r\n3 4251 10840 7287 2183 \r\n3 796 10839 10840 2183 \r\n3 503 7287 10839 2183 \r\n3 3185 10843 10842 2184 \r\n3 2155 10841 10843 2184 \r\n3 4580 10842 10841 2184 \r\n3 1808 6100 8289 2185 \r\n3 3826 10844 6100 2185 \r\n3 3525 8289 10844 2185 \r\n3 3092 10846 6515 2186 \r\n3 4926 10845 10846 2186 \r\n3 4815 6515 10845 2186 \r\n3 4453 10849 10848 2187 \r\n3 4693 10847 10849 2187 \r\n3 4541 10848 10847 2187 \r\n3 491 10851 10850 2188 \r\n3 448 7191 10851 2188 \r\n3 864 10850 7191 2188 \r\n3 258 10853 10852 2189 \r\n3 602 10094 10853 2189 \r\n3 4169 10852 10094 2189 \r\n3 1728 10856 10855 2190 \r\n3 1224 10854 10856 2190 \r\n3 4166 10855 10854 2190 \r\n3 4233 10858 7505 2191 \r\n3 3247 10857 10858 2191 \r\n3 4068 7505 10857 2191 \r\n3 1965 10859 9654 2192 \r\n3 2263 8596 10859 2192 \r\n3 4236 9654 8596 2192 \r\n3 3706 10862 10861 2193 \r\n3 633 10860 10862 2193 \r\n3 3554 10861 10860 2193 \r\n3 1742 7351 10864 2194 \r\n3 893 10863 7351 2194 \r\n3 4869 10864 10863 2194 \r\n3 4347 5719 10866 2195 \r\n3 816 10865 5719 2195 \r\n3 1303 10866 10865 2195 \r\n3 1575 10869 10868 2196 \r\n3 1864 10867 10869 2196 \r\n3 2293 10868 10867 2196 \r\n3 1766 10872 10871 2197 \r\n3 4795 10870 10872 2197 \r\n3 3370 10871 10870 2197 \r\n3 4479 10875 10874 2198 \r\n3 4481 10873 10875 2198 \r\n3 2741 10874 10873 2198 \r\n3 231 10878 10877 2199 \r\n3 1817 10876 10878 2199 \r\n3 1845 10877 10876 2199 \r\n3 958 10881 10880 2200 \r\n3 4696 10879 10881 2200 \r\n3 4572 10880 10879 2200 \r\n3 4211 10883 10882 2201 \r\n3 6 10284 10883 2201 \r\n3 3848 10882 10284 2201 \r\n3 4578 10885 10884 2202 \r\n3 3286 7943 10885 2202 \r\n3 846 10884 7943 2202 \r\n3 2681 10887 7223 2203 \r\n3 3133 10886 10887 2203 \r\n3 3944 7223 10886 2203 \r\n3 2986 9356 10888 2204 \r\n3 3663 8889 9356 2204 \r\n3 3135 10888 8889 2204 \r\n3 881 10890 10562 2205 \r\n3 2227 10889 10890 2205 \r\n3 1728 10562 10889 2205 \r\n3 0 10892 7776 2206 \r\n3 1017 10891 10892 2206 \r\n3 3311 7776 10891 2206 \r\n3 2314 6490 9354 2207 \r\n3 2213 10893 6490 2207 \r\n3 449 9354 10893 2207 \r\n3 4340 10896 10895 2208 \r\n3 4466 10894 10896 2208 \r\n3 4368 10895 10894 2208 \r\n3 2361 10899 10898 2209 \r\n3 748 10897 10899 2209 \r\n3 620 10898 10897 2209 \r\n3 1072 10902 10901 2210 \r\n3 4903 10900 10902 2210 \r\n3 34 10901 10900 2210 \r\n3 746 9565 10904 2211 \r\n3 2926 10903 9565 2211 \r\n3 4228 10904 10903 2211 \r\n3 2416 9227 10906 2212 \r\n3 599 10905 9227 2212 \r\n3 3064 10906 10905 2212 \r\n3 3198 10908 10907 2213 \r\n3 4687 10298 10908 2213 \r\n3 298 10907 10298 2213 \r\n3 3855 10910 10909 2214 \r\n3 3956 8845 10910 2214 \r\n3 784 10909 8845 2214 \r\n3 4834 6407 10912 2215 \r\n3 3253 10911 6407 2215 \r\n3 3066 10912 10911 2215 \r\n3 173 10915 10914 2216 \r\n3 717 10913 10915 2216 \r\n3 4072 10914 10913 2216 \r\n3 93 10918 10917 2217 \r\n3 2198 10916 10918 2217 \r\n3 2081 10917 10916 2217 \r\n3 1986 10921 10920 2218 \r\n3 793 10919 10921 2218 \r\n3 1428 10920 10919 2218 \r\n3 844 10923 10922 2219 \r\n3 4858 8865 10923 2219 \r\n3 2611 10922 8865 2219 \r\n3 1595 10925 10547 2220 \r\n3 4377 10924 10925 2220 \r\n3 4521 10547 10924 2220 \r\n3 4092 10928 10927 2221 \r\n3 1485 10926 10928 2221 \r\n3 4788 10927 10926 2221 \r\n3 4424 9347 10929 2222 \r\n3 2214 7249 9347 2222 \r\n3 3910 10929 7249 2222 \r\n3 4732 10930 9447 2223 \r\n3 3903 6293 10930 2223 \r\n3 1144 9447 6293 2223 \r\n3 2285 10933 10932 2224 \r\n3 4379 10931 10933 2224 \r\n3 1828 10932 10931 2224 \r\n3 3975 10935 9572 2225 \r\n3 1108 10934 10935 2225 \r\n3 3802 9572 10934 2225 \r\n3 4801 10937 10936 2226 \r\n3 1771 10246 10937 2226 \r\n3 3825 10936 10246 2226 \r\n3 2672 10940 10939 2227 \r\n3 1154 10938 10940 2227 \r\n3 396 10939 10938 2227 \r\n3 2060 10005 10673 2228 \r\n3 903 10941 10005 2228 \r\n3 3098 10673 10941 2228 \r\n3 2015 10944 10943 2229 \r\n3 4526 10942 10944 2229 \r\n3 4140 10943 10942 2229 \r\n3 1706 10947 10946 2230 \r\n3 2248 10945 10947 2230 \r\n3 3901 10946 10945 2230 \r\n3 4815 10845 6016 2231 \r\n3 4926 10948 10845 2231 \r\n3 4471 6016 10948 2231 \r\n3 4183 10950 10949 2232 \r\n3 2050 6889 10950 2232 \r\n3 1686 10949 6889 2232 \r\n3 1806 10951 10044 2233 \r\n3 504 8830 10951 2233 \r\n3 4375 10044 8830 2233 \r\n3 1323 10954 10953 2234 \r\n3 272 10952 10954 2234 \r\n3 4150 10953 10952 2234 \r\n3 1363 5668 10956 2235 \r\n3 4992 10955 5668 2235 \r\n3 3024 10956 10955 2235 \r\n3 4656 10959 10958 2236 \r\n3 677 10957 10959 2236 \r\n3 2182 10958 10957 2236 \r\n3 3643 10962 10961 2237 \r\n3 3619 10960 10962 2237 \r\n3 3992 10961 10960 2237 \r\n3 253 10964 10963 2238 \r\n3 406 5430 10964 2238 \r\n3 4748 10963 5430 2238 \r\n3 905 7807 7006 2239 \r\n3 1409 10965 7807 2239 \r\n3 3210 7006 10965 2239 \r\n3 4823 10968 10967 2240 \r\n3 2678 10966 10968 2240 \r\n3 2854 10967 10966 2240 \r\n3 4629 10971 10970 2241 \r\n3 2332 10969 10971 2241 \r\n3 4190 10970 10969 2241 \r\n3 45 10973 10972 2242 \r\n3 579 7846 10973 2242 \r\n3 4757 10972 7846 2242 \r\n3 1560 6398 10975 2243 \r\n3 919 10974 6398 2243 \r\n3 2467 10975 10974 2243 \r\n3 4479 10874 10976 2244 \r\n3 2741 6867 10874 2244 \r\n3 1966 10976 6867 2244 \r\n3 2001 10979 10978 2245 \r\n3 2999 10977 10979 2245 \r\n3 4012 10978 10977 2245 \r\n3 333 10982 10981 2246 \r\n3 1621 10980 10982 2246 \r\n3 153 10981 10980 2246 \r\n3 2159 5188 10983 2247 \r\n3 758 9321 5188 2247 \r\n3 2930 10983 9321 2247 \r\n3 2389 10986 10985 2248 \r\n3 2621 10984 10986 2248 \r\n3 888 10985 10984 2248 \r\n3 442 10988 5408 2249 \r\n3 4764 10987 10988 2249 \r\n3 1957 5408 10987 2249 \r\n3 777 10990 10989 2250 \r\n3 445 5725 10990 2250 \r\n3 817 10989 5725 2250 \r\n3 4879 10992 10991 2251 \r\n3 4073 9059 10992 2251 \r\n3 83 10991 9059 2251 \r\n3 3673 10995 10994 2252 \r\n3 4125 10993 10995 2252 \r\n3 957 10994 10993 2252 \r\n3 180 9546 10997 2253 \r\n3 1507 10996 9546 2253 \r\n3 3919 10997 10996 2253 \r\n3 325 11000 10999 2254 \r\n3 1075 10998 11000 2254 \r\n3 2174 10999 10998 2254 \r\n3 2731 11003 11002 2255 \r\n3 838 11001 11003 2255 \r\n3 1710 11002 11001 2255 \r\n3 4560 11006 11005 2256 \r\n3 4187 11004 11006 2256 \r\n3 3611 11005 11004 2256 \r\n3 379 11009 11008 2257 \r\n3 2949 11007 11009 2257 \r\n3 615 11008 11007 2257 \r\n3 1774 11011 11010 2258 \r\n3 3066 6522 11011 2258 \r\n3 2808 11010 6522 2258 \r\n3 4808 11013 11012 2259 \r\n3 1466 9748 11013 2259 \r\n3 4008 11012 9748 2259 \r\n3 1291 11015 6506 2260 \r\n3 1052 11014 11015 2260 \r\n3 4587 6506 11014 2260 \r\n3 1841 11018 11017 2261 \r\n3 3363 11016 11018 2261 \r\n3 217 11017 11016 2261 \r\n3 3491 11021 11020 2262 \r\n3 1294 11019 11021 2262 \r\n3 1059 11020 11019 2262 \r\n3 2875 7359 5920 2263 \r\n3 1853 11022 7359 2263 \r\n3 1155 5920 11022 2263 \r\n3 3262 7456 6851 2264 \r\n3 4364 11023 7456 2264 \r\n3 3911 6851 11023 2264 \r\n3 2924 11025 11024 2265 \r\n3 207 6159 11025 2265 \r\n3 4348 11024 6159 2265 \r\n3 856 5275 11027 2266 \r\n3 4516 11026 5275 2266 \r\n3 1426 11027 11026 2266 \r\n3 2585 11030 11029 2267 \r\n3 2019 11028 11030 2267 \r\n3 4293 11029 11028 2267 \r\n3 4303 11033 11032 2268 \r\n3 1929 11031 11033 2268 \r\n3 2321 11032 11031 2268 \r\n3 3543 6012 11035 2269 \r\n3 934 11034 6012 2269 \r\n3 2622 11035 11034 2269 \r\n3 1276 11038 11037 2270 \r\n3 1980 11036 11038 2270 \r\n3 2192 11037 11036 2270 \r\n3 1553 11040 7313 2271 \r\n3 4617 11039 11040 2271 \r\n3 3218 7313 11039 2271 \r\n3 870 11042 11041 2272 \r\n3 4689 10357 11042 2272 \r\n3 2212 11041 10357 2272 \r\n3 341 11045 11044 2273 \r\n3 3950 11043 11045 2273 \r\n3 4416 11044 11043 2273 \r\n3 2960 11047 11046 2274 \r\n3 239 5501 11047 2274 \r\n3 4311 11046 5501 2274 \r\n3 4335 11049 11048 2275 \r\n3 1774 11010 11049 2275 \r\n3 2808 11048 11010 2275 \r\n3 1862 11052 11051 2276 \r\n3 2343 11050 11052 2276 \r\n3 4766 11051 11050 2276 \r\n3 4048 11053 5134 2277 \r\n3 1834 5697 11053 2277 \r\n3 4695 5134 5697 2277 \r\n3 1205 11056 11055 2278 \r\n3 2253 11054 11056 2278 \r\n3 1243 11055 11054 2278 \r\n3 4350 11059 11058 2279 \r\n3 2850 11057 11059 2279 \r\n3 4788 11058 11057 2279 \r\n3 848 11062 11061 2280 \r\n3 2483 11060 11062 2280 \r\n3 3527 11061 11060 2280 \r\n3 2302 5710 11063 2281 \r\n3 577 7258 5710 2281 \r\n3 3918 11063 7258 2281 \r\n3 4138 11066 11065 2282 \r\n3 3020 11064 11066 2282 \r\n3 4985 11065 11064 2282 \r\n3 3421 10802 7976 2283 \r\n3 2188 7902 10802 2283 \r\n3 4429 7976 7902 2283 \r\n3 1555 11068 11067 2284 \r\n3 4909 8514 11068 2284 \r\n3 2448 11067 8514 2284 \r\n3 3930 11071 11070 2285 \r\n3 2347 11069 11071 2285 \r\n3 3650 11070 11069 2285 \r\n3 2287 11074 11073 2286 \r\n3 12 11072 11074 2286 \r\n3 2826 11073 11072 2286 \r\n3 1043 11076 11075 2287 \r\n3 1999 7760 11076 2287 \r\n3 4284 11075 7760 2287 \r\n3 1696 11079 11078 2288 \r\n3 1251 11077 11079 2288 \r\n3 4775 11078 11077 2288 \r\n3 175 11081 11080 2289 \r\n3 848 11061 11081 2289 \r\n3 3527 11080 11061 2289 \r\n3 73 11083 11082 2290 \r\n3 3169 8590 11083 2290 \r\n3 1806 11082 8590 2290 \r\n3 2164 11086 11085 2291 \r\n3 1452 11084 11086 2291 \r\n3 1261 11085 11084 2291 \r\n3 3183 11088 11087 2292 \r\n3 4570 10220 11088 2292 \r\n3 1850 11087 10220 2292 \r\n3 4686 6531 11089 2293 \r\n3 2300 10078 6531 2293 \r\n3 721 11089 10078 2293 \r\n3 3923 11091 11090 2294 \r\n3 394 7103 11091 2294 \r\n3 701 11090 7103 2294 \r\n3 3432 11092 7532 2295 \r\n3 344 8372 11092 2295 \r\n3 209 7532 8372 2295 \r\n3 3345 11095 11094 2296 \r\n3 2123 11093 11095 2296 \r\n3 3455 11094 11093 2296 \r\n3 1129 8215 11096 2297 \r\n3 533 6877 8215 2297 \r\n3 2233 11096 6877 2297 \r\n3 2451 9591 11098 2298 \r\n3 2038 11097 9591 2298 \r\n3 4661 11098 11097 2298 \r\n3 1718 9825 11100 2299 \r\n3 2518 11099 9825 2299 \r\n3 3756 11100 11099 2299 \r\n3 1134 11102 11101 2300 \r\n3 3108 7374 11102 2300 \r\n3 1358 11101 7374 2300 \r\n3 2895 11104 5272 2301 \r\n3 4876 11103 11104 2301 \r\n3 3973 5272 11103 2301 \r\n3 3001 11106 11105 2302 \r\n3 2663 7143 11106 2302 \r\n3 2721 11105 7143 2302 \r\n3 1258 11108 8559 2303 \r\n3 1937 11107 11108 2303 \r\n3 3187 8559 11107 2303 \r\n3 319 9661 11110 2304 \r\n3 2711 11109 9661 2304 \r\n3 4839 11110 11109 2304 \r\n3 4257 11111 5741 2305 \r\n3 4689 11042 11111 2305 \r\n3 870 5741 11042 2305 \r\n3 2311 11114 11113 2306 \r\n3 4601 11112 11114 2306 \r\n3 3507 11113 11112 2306 \r\n3 1471 9391 11116 2307 \r\n3 809 11115 9391 2307 \r\n3 45 11116 11115 2307 \r\n3 4406 11119 11118 2308 \r\n3 310 11117 11119 2308 \r\n3 1795 11118 11117 2308 \r\n3 3165 11122 11121 2309 \r\n3 2692 11120 11122 2309 \r\n3 2984 11121 11120 2309 \r\n3 3850 11125 11124 2310 \r\n3 2222 11123 11125 2310 \r\n3 2675 11124 11123 2310 \r\n3 3679 11127 5866 2311 \r\n3 3821 11126 11127 2311 \r\n3 1440 5866 11126 2311 \r\n3 1731 11129 6945 2312 \r\n3 2385 11128 11129 2312 \r\n3 4445 6945 11128 2312 \r\n3 1513 9135 11131 2313 \r\n3 4037 11130 9135 2313 \r\n3 1417 11131 11130 2313 \r\n3 2700 11134 11133 2314 \r\n3 858 11132 11134 2314 \r\n3 1513 11133 11132 2314 \r\n3 4140 10942 11135 2315 \r\n3 4526 10793 10942 2315 \r\n3 972 11135 10793 2315 \r\n3 3502 11137 7519 2316 \r\n3 410 11136 11137 2316 \r\n3 1699 7519 11136 2316 \r\n3 2846 8059 11139 2317 \r\n3 29 11138 8059 2317 \r\n3 4238 11139 11138 2317 \r\n3 4697 11142 11141 2318 \r\n3 4755 11140 11142 2318 \r\n3 1264 11141 11140 2318 \r\n3 4847 11145 11144 2319 \r\n3 1034 11143 11145 2319 \r\n3 351 11144 11143 2319 \r\n3 1999 11147 8498 2320 \r\n3 3364 11146 11147 2320 \r\n3 3515 8498 11146 2320 \r\n3 2730 11150 11149 2321 \r\n3 2161 11148 11150 2321 \r\n3 981 11149 11148 2321 \r\n3 1460 11152 10175 2322 \r\n3 684 11151 11152 2322 \r\n3 3713 10175 11151 2322 \r\n3 4014 11154 11153 2323 \r\n3 2468 8094 11154 2323 \r\n3 2888 11153 8094 2323 \r\n3 4221 8681 11156 2324 \r\n3 276 11155 8681 2324 \r\n3 675 11156 11155 2324 \r\n3 99 8079 11158 2325 \r\n3 2817 11157 8079 2325 \r\n3 996 11158 11157 2325 \r\n3 4485 11160 5802 2326 \r\n3 224 11159 11160 2326 \r\n3 107 5802 11159 2326 \r\n3 839 11162 11161 2327 \r\n3 3381 9000 11162 2327 \r\n3 1082 11161 9000 2327 \r\n3 723 7354 11164 2328 \r\n3 1976 11163 7354 2328 \r\n3 1604 11164 11163 2328 \r\n3 4798 11166 10687 2329 \r\n3 1607 11165 11166 2329 \r\n3 185 10687 11165 2329 \r\n3 2601 11169 11168 2330 \r\n3 2478 11167 11169 2330 \r\n3 1397 11168 11167 2330 \r\n3 2941 11172 11171 2331 \r\n3 1716 11170 11172 2331 \r\n3 465 11171 11170 2331 \r\n3 2858 11174 11173 2332 \r\n3 583 8879 11174 2332 \r\n3 3495 11173 8879 2332 \r\n3 3480 11177 11176 2333 \r\n3 3804 11175 11177 2333 \r\n3 4935 11176 11175 2333 \r\n3 311 8028 11179 2334 \r\n3 1195 11178 8028 2334 \r\n3 4765 11179 11178 2334 \r\n3 1930 11180 9529 2335 \r\n3 3857 10423 11180 2335 \r\n3 4353 9529 10423 2335 \r\n3 3890 11182 9413 2336 \r\n3 2806 11181 11182 2336 \r\n3 4102 9413 11181 2336 \r\n3 3408 11184 9916 2337 \r\n3 2062 11183 11184 2337 \r\n3 4156 9916 11183 2337 \r\n3 1981 11187 11186 2338 \r\n3 3752 11185 11187 2338 \r\n3 974 11186 11185 2338 \r\n3 2280 11188 10762 2339 \r\n3 3084 7572 11188 2339 \r\n3 2353 10762 7572 2339 \r\n3 3725 11190 11189 2340 \r\n3 2623 6222 11190 2340 \r\n3 3233 11189 6222 2340 \r\n3 3158 9988 11192 2341 \r\n3 1207 11191 9988 2341 \r\n3 279 11192 11191 2341 \r\n3 4518 11195 11194 2342 \r\n3 4841 11193 11195 2342 \r\n3 913 11194 11193 2342 \r\n3 865 8165 10804 2343 \r\n3 4531 11196 8165 2343 \r\n3 151 10804 11196 2343 \r\n3 2822 11199 11198 2344 \r\n3 4818 11197 11199 2344 \r\n3 1034 11198 11197 2344 \r\n3 901 11202 11201 2345 \r\n3 2657 11200 11202 2345 \r\n3 1076 11201 11200 2345 \r\n3 3485 11205 11204 2346 \r\n3 3997 11203 11205 2346 \r\n3 1767 11204 11203 2346 \r\n3 1380 6066 11206 2347 \r\n3 1770 6542 6066 2347 \r\n3 4081 11206 6542 2347 \r\n3 3070 11208 7839 2348 \r\n3 2209 11207 11208 2348 \r\n3 547 7839 11207 2348 \r\n3 1661 11211 11210 2349 \r\n3 1342 11209 11211 2349 \r\n3 3573 11210 11209 2349 \r\n3 4342 11212 6320 2350 \r\n3 2564 6688 11212 2350 \r\n3 2912 6320 6688 2350 \r\n3 4052 11214 11213 2351 \r\n3 3601 8616 11214 2351 \r\n3 4484 11213 8616 2351 \r\n3 3573 11217 11216 2352 \r\n3 1135 11215 11217 2352 \r\n3 4536 11216 11215 2352 \r\n3 618 7472 11219 2353 \r\n3 1047 11218 7472 2353 \r\n3 4047 11219 11218 2353 \r\n3 1998 11222 11221 2354 \r\n3 3703 11220 11222 2354 \r\n3 3254 11221 11220 2354 \r\n3 2412 11224 11223 2355 \r\n3 3766 8850 11224 2355 \r\n3 4161 11223 8850 2355 \r\n3 1339 11225 6808 2356 \r\n3 2204 9833 11225 2356 \r\n3 1430 6808 9833 2356 \r\n3 4108 8268 11226 2357 \r\n3 4232 9455 8268 2357 \r\n3 2858 11226 9455 2357 \r\n3 159 9594 7955 2358 \r\n3 339 11227 9594 2358 \r\n3 4887 7955 11227 2358 \r\n3 1569 11230 11229 2359 \r\n3 1665 11228 11230 2359 \r\n3 3119 11229 11228 2359 \r\n3 2498 11232 8746 2360 \r\n3 1943 11231 11232 2360 \r\n3 4058 8746 11231 2360 \r\n3 1490 11234 11233 2361 \r\n3 3508 8751 11234 2361 \r\n3 4055 11233 8751 2361 \r\n3 97 10201 7580 2362 \r\n3 2333 11235 10201 2362 \r\n3 228 7580 11235 2362 \r\n3 3431 11238 11237 2363 \r\n3 985 11236 11238 2363 \r\n3 907 11237 11236 2363 \r\n3 4529 11240 5094 2364 \r\n3 3687 11239 11240 2364 \r\n3 498 5094 11239 2364 \r\n3 1092 11242 11241 2365 \r\n3 1430 9832 11242 2365 \r\n3 1161 11241 9832 2365 \r\n3 4374 11245 11244 2366 \r\n3 854 11243 11245 2366 \r\n3 4460 11244 11243 2366 \r\n3 3220 11248 11247 2367 \r\n3 2503 11246 11248 2367 \r\n3 862 11247 11246 2367 \r\n3 1149 11250 6815 2368 \r\n3 3584 11249 11250 2368 \r\n3 1764 6815 11249 2368 \r\n3 2121 11253 11252 2369 \r\n3 4158 11251 11253 2369 \r\n3 2729 11252 11251 2369 \r\n3 1583 11256 11255 2370 \r\n3 3227 11254 11256 2370 \r\n3 3544 11255 11254 2370 \r\n3 1065 5700 11257 2371 \r\n3 1957 10987 5700 2371 \r\n3 4764 11257 10987 2371 \r\n3 3745 11260 11259 2372 \r\n3 1622 11258 11260 2372 \r\n3 2232 11259 11258 2372 \r\n3 1338 11263 11262 2373 \r\n3 3868 11261 11263 2373 \r\n3 860 11262 11261 2373 \r\n3 49 11266 11265 2374 \r\n3 3762 11264 11266 2374 \r\n3 663 11265 11264 2374 \r\n3 4351 11269 11268 2375 \r\n3 3361 11267 11269 2375 \r\n3 1889 11268 11267 2375 \r\n3 4889 11272 11271 2376 \r\n3 94 11270 11272 2376 \r\n3 3881 11271 11270 2376 \r\n3 1941 11275 11274 2377 \r\n3 2608 11273 11275 2377 \r\n3 940 11274 11273 2377 \r\n3 1582 11278 11277 2378 \r\n3 3628 11276 11278 2378 \r\n3 725 11277 11276 2378 \r\n3 1124 11281 11280 2379 \r\n3 3758 11279 11281 2379 \r\n3 4442 11280 11279 2379 \r\n3 2934 11284 11283 2380 \r\n3 1987 11282 11284 2380 \r\n3 2150 11283 11282 2380 \r\n3 3484 11287 11286 2381 \r\n3 4399 11285 11287 2381 \r\n3 4476 11286 11285 2381 \r\n3 1935 11289 8130 2382 \r\n3 1879 11288 11289 2382 \r\n3 3328 8130 11288 2382 \r\n3 1883 11292 11291 2383 \r\n3 1026 11290 11292 2383 \r\n3 3761 11291 11290 2383 \r\n3 3785 7446 5104 2384 \r\n3 850 10573 7446 2384 \r\n3 3144 5104 10573 2384 \r\n3 4453 11295 11294 2385 \r\n3 4808 11293 11295 2385 \r\n3 1444 11294 11293 2385 \r\n3 2998 11298 11297 2386 \r\n3 2779 11296 11298 2386 \r\n3 1420 11297 11296 2386 \r\n3 4925 11301 11300 2387 \r\n3 2147 11299 11301 2387 \r\n3 2456 11300 11299 2387 \r\n3 1757 11304 11303 2388 \r\n3 3511 11302 11304 2388 \r\n3 2753 11303 11302 2388 \r\n3 689 11307 11306 2389 \r\n3 2783 11305 11307 2389 \r\n3 557 11306 11305 2389 \r\n3 1129 11309 8216 2390 \r\n3 1838 11308 11309 2390 \r\n3 875 8216 11308 2390 \r\n3 2566 11312 11311 2391 \r\n3 2358 11310 11312 2391 \r\n3 2247 11311 11310 2391 \r\n3 912 11313 10379 2392 \r\n3 4109 6439 11313 2392 \r\n3 1672 10379 6439 2392 \r\n3 2363 11315 11314 2393 \r\n3 2287 11073 11315 2393 \r\n3 2826 11314 11073 2393 \r\n3 1981 11318 11317 2394 \r\n3 1809 11316 11318 2394 \r\n3 4358 11317 11316 2394 \r\n3 2338 11321 11320 2395 \r\n3 4314 11319 11321 2395 \r\n3 4626 11320 11319 2395 \r\n3 620 11323 10898 2396 \r\n3 1574 11322 11323 2396 \r\n3 2361 10898 11322 2396 \r\n3 4378 11326 11325 2397 \r\n3 3908 11324 11326 2397 \r\n3 4674 11325 11324 2397 \r\n3 771 11329 11328 2398 \r\n3 756 11327 11329 2398 \r\n3 840 11328 11327 2398 \r\n3 879 8630 11331 2399 \r\n3 4647 11330 8630 2399 \r\n3 3426 11331 11330 2399 \r\n3 2232 11334 11333 2400 \r\n3 2855 11332 11334 2400 \r\n3 4107 11333 11332 2400 \r\n3 719 11336 11335 2401 \r\n3 402 8975 11336 2401 \r\n3 4877 11335 8975 2401 \r\n3 4658 11339 11338 2402 \r\n3 2773 11337 11339 2402 \r\n3 3308 11338 11337 2402 \r\n3 857 9892 11341 2403 \r\n3 1526 11340 9892 2403 \r\n3 4622 11341 11340 2403 \r\n3 1484 11344 11343 2404 \r\n3 2729 11342 11344 2404 \r\n3 3747 11343 11342 2404 \r\n3 4485 11347 11346 2405 \r\n3 422 11345 11347 2405 \r\n3 1115 11346 11345 2405 \r\n3 457 11349 11348 2406 \r\n3 265 7705 11349 2406 \r\n3 4159 11348 7705 2406 \r\n3 901 11352 11351 2407 \r\n3 1713 11350 11352 2407 \r\n3 4718 11351 11350 2407 \r\n3 3028 11354 6628 2408 \r\n3 462 11353 11354 2408 \r\n3 369 6628 11353 2408 \r\n3 4130 5014 9167 2409 \r\n3 4682 11355 5014 2409 \r\n3 3661 9167 11355 2409 \r\n3 4743 11357 8639 2410 \r\n3 96 11356 11357 2410 \r\n3 1027 8639 11356 2410 \r\n3 4079 11360 11359 2411 \r\n3 3613 11358 11360 2411 \r\n3 3765 11359 11358 2411 \r\n3 559 11363 11362 2412 \r\n3 3393 11361 11363 2412 \r\n3 1451 11362 11361 2412 \r\n3 3878 11366 11365 2413 \r\n3 2098 11364 11366 2413 \r\n3 287 11365 11364 2413 \r\n3 2104 7896 11367 2414 \r\n3 532 7132 7896 2414 \r\n3 4025 11367 7132 2414 \r\n3 3350 11370 11369 2415 \r\n3 2575 11368 11370 2415 \r\n3 3926 11369 11368 2415 \r\n3 1905 11372 11371 2416 \r\n3 1645 8482 11372 2416 \r\n3 4937 11371 8482 2416 \r\n3 1284 11375 11374 2417 \r\n3 4652 11373 11375 2417 \r\n3 203 11374 11373 2417 \r\n3 2274 11378 11377 2418 \r\n3 3266 11376 11378 2418 \r\n3 2527 11377 11376 2418 \r\n3 3132 11380 11379 2419 \r\n3 1996 7927 11380 2419 \r\n3 3072 11379 7927 2419 \r\n3 3674 11382 11381 2420 \r\n3 3561 6558 11382 2420 \r\n3 155 11381 6558 2420 \r\n3 4191 11385 11384 2421 \r\n3 4106 11383 11385 2421 \r\n3 482 11384 11383 2421 \r\n3 2319 11388 11387 2422 \r\n3 4806 11386 11388 2422 \r\n3 322 11387 11386 2422 \r\n3 2561 11390 11389 2423 \r\n3 4835 6546 11390 2423 \r\n3 751 11389 6546 2423 \r\n3 4564 11392 11391 2424 \r\n3 2848 8993 11392 2424 \r\n3 2673 11391 8993 2424 \r\n3 3040 11394 10099 2425 \r\n3 1229 11393 11394 2425 \r\n3 1796 10099 11393 2425 \r\n3 3006 11397 11396 2426 \r\n3 4664 11395 11397 2426 \r\n3 1314 11396 11395 2426 \r\n3 665 11399 11398 2427 \r\n3 4056 5489 11399 2427 \r\n3 3886 11398 5489 2427 \r\n3 1896 11401 11400 2428 \r\n3 4916 7121 11401 2428 \r\n3 3009 11400 7121 2428 \r\n3 2316 11403 10039 2429 \r\n3 206 11402 11403 2429 \r\n3 2975 10039 11402 2429 \r\n3 1467 11406 11405 2430 \r\n3 3400 11404 11406 2430 \r\n3 3530 11405 11404 2430 \r\n3 3951 7693 11408 2431 \r\n3 832 11407 7693 2431 \r\n3 2717 11408 11407 2431 \r\n3 1633 11409 5360 2432 \r\n3 2064 6401 11409 2432 \r\n3 3889 5360 6401 2432 \r\n3 1059 11412 11411 2433 \r\n3 3559 11410 11412 2433 \r\n3 2874 11411 11410 2433 \r\n3 1695 11414 10354 2434 \r\n3 1542 11413 11414 2434 \r\n3 2712 10354 11413 2434 \r\n3 4523 11416 8449 2435 \r\n3 3047 11415 11416 2435 \r\n3 876 8449 11415 2435 \r\n3 4413 9161 11418 2436 \r\n3 2656 11417 9161 2436 \r\n3 692 11418 11417 2436 \r\n3 4885 8061 11420 2437 \r\n3 4111 11419 8061 2437 \r\n3 3102 11420 11419 2437 \r\n3 1578 8455 9604 2438 \r\n3 216 11421 8455 2438 \r\n3 1741 9604 11421 2438 \r\n3 1120 11424 11423 2439 \r\n3 1887 11422 11424 2439 \r\n3 1974 11423 11422 2439 \r\n3 3899 11427 11426 2440 \r\n3 2776 11425 11427 2440 \r\n3 816 11426 11425 2440 \r\n3 4527 7660 11429 2441 \r\n3 3952 11428 7660 2441 \r\n3 3289 11429 11428 2441 \r\n3 4897 11432 11431 2442 \r\n3 976 11430 11432 2442 \r\n3 4780 11431 11430 2442 \r\n3 3422 11435 11434 2443 \r\n3 65 11433 11435 2443 \r\n3 3350 11434 11433 2443 \r\n3 2287 11438 11437 2444 \r\n3 2530 11436 11438 2444 \r\n3 1402 11437 11436 2444 \r\n3 4478 11441 11440 2445 \r\n3 330 11439 11441 2445 \r\n3 1516 11440 11439 2445 \r\n3 1047 11443 7591 2446 \r\n3 4059 11442 11443 2446 \r\n3 1759 7591 11442 2446 \r\n3 4604 11445 11444 2447 \r\n3 3865 8249 11445 2447 \r\n3 3620 11444 8249 2447 \r\n3 2628 11448 11447 2448 \r\n3 3826 11446 11448 2448 \r\n3 2093 11447 11446 2448 \r\n3 4703 11451 11450 2449 \r\n3 376 11449 11451 2449 \r\n3 1093 11450 11449 2449 \r\n3 3989 11453 7836 2450 \r\n3 3488 11452 11453 2450 \r\n3 1992 7836 11452 2450 \r\n3 1840 11456 11455 2451 \r\n3 1483 11454 11456 2451 \r\n3 4663 11455 11454 2451 \r\n3 836 11458 11457 2452 \r\n3 1651 5834 11458 2452 \r\n3 3328 11457 5834 2452 \r\n3 1149 11461 11460 2453 \r\n3 1268 11459 11461 2453 \r\n3 520 11460 11459 2453 \r\n3 4472 11464 11463 2454 \r\n3 3117 11462 11464 2454 \r\n3 2649 11463 11462 2454 \r\n3 1128 11467 11466 2455 \r\n3 4478 11465 11467 2455 \r\n3 4602 11466 11465 2455 \r\n3 398 7250 9223 2456 \r\n3 2214 11468 7250 2456 \r\n3 1391 9223 11468 2456 \r\n3 4036 11471 11470 2457 \r\n3 42 11469 11471 2457 \r\n3 4784 11470 11469 2457 \r\n3 211 11473 7762 2458 \r\n3 3014 11472 11473 2458 \r\n3 2849 7762 11472 2458 \r\n3 2936 5708 11475 2459 \r\n3 2055 11474 5708 2459 \r\n3 4 11475 11474 2459 \r\n3 3319 11478 11477 2460 \r\n3 2578 11476 11478 2460 \r\n3 3966 11477 11476 2460 \r\n3 491 11481 11480 2461 \r\n3 2100 11479 11481 2461 \r\n3 1515 11480 11479 2461 \r\n3 3668 11483 11482 2462 \r\n3 3206 8513 11483 2462 \r\n3 986 11482 8513 2462 \r\n3 4002 11486 11485 2463 \r\n3 10 11484 11486 2463 \r\n3 2601 11485 11484 2463 \r\n3 2934 9718 11284 2464 \r\n3 1293 7940 9718 2464 \r\n3 1987 11284 7940 2464 \r\n3 4510 11488 7702 2465 \r\n3 1985 11487 11488 2465 \r\n3 3686 7702 11487 2465 \r\n3 4414 11491 11490 2466 \r\n3 4289 11489 11491 2466 \r\n3 2708 11490 11489 2466 \r\n3 1832 11494 11493 2467 \r\n3 1715 11492 11494 2467 \r\n3 3091 11493 11492 2467 \r\n3 474 11497 11496 2468 \r\n3 2831 11495 11497 2468 \r\n3 4246 11496 11495 2468 \r\n3 1879 11289 11499 2469 \r\n3 1935 11498 11289 2469 \r\n3 754 11499 11498 2469 \r\n3 3660 11501 11500 2470 \r\n3 3668 6896 11501 2470 \r\n3 2890 11500 6896 2470 \r\n3 2549 11503 6565 2471 \r\n3 4399 11502 11503 2471 \r\n3 1057 6565 11502 2471 \r\n3 1296 11506 11505 2472 \r\n3 696 11504 11506 2472 \r\n3 4073 11505 11504 2472 \r\n3 3270 11508 11507 2473 \r\n3 3575 10770 11508 2473 \r\n3 2429 11507 10770 2473 \r\n3 3519 8333 11510 2474 \r\n3 35 11509 8333 2474 \r\n3 4418 11510 11509 2474 \r\n3 2342 11513 11512 2475 \r\n3 4431 11511 11513 2475 \r\n3 2062 11512 11511 2475 \r\n3 785 11515 10600 2476 \r\n3 1858 11514 11515 2476 \r\n3 2319 10600 11514 2476 \r\n3 4335 11516 6915 2477 \r\n3 646 9911 11516 2477 \r\n3 2703 6915 9911 2477 \r\n3 675 11518 11517 2478 \r\n3 2595 8115 11518 2478 \r\n3 828 11517 8115 2478 \r\n3 4311 8131 11520 2479 \r\n3 3015 11519 8131 2479 \r\n3 516 11520 11519 2479 \r\n3 4594 11523 11522 2480 \r\n3 3831 11521 11523 2480 \r\n3 1946 11522 11521 2480 \r\n3 3836 5181 11524 2481 \r\n3 2690 10273 5181 2481 \r\n3 3503 11524 10273 2481 \r\n3 1045 10247 5161 2482 \r\n3 1771 11525 10247 2482 \r\n3 4110 5161 11525 2482 \r\n3 2670 11528 11527 2483 \r\n3 1439 11526 11528 2483 \r\n3 3032 11527 11526 2483 \r\n3 696 11531 11530 2484 \r\n3 1439 11529 11531 2484 \r\n3 3496 11530 11529 2484 \r\n3 18 11534 11533 2485 \r\n3 4185 11532 11534 2485 \r\n3 1201 11533 11532 2485 \r\n3 3778 11536 11535 2486 \r\n3 3887 5877 11536 2486 \r\n3 4865 11535 5877 2486 \r\n3 3201 11539 11538 2487 \r\n3 888 11537 11539 2487 \r\n3 4237 11538 11537 2487 \r\n3 2887 11542 11541 2488 \r\n3 3927 11540 11542 2488 \r\n3 975 11541 11540 2488 \r\n3 655 11545 11544 2489 \r\n3 3917 11543 11545 2489 \r\n3 2907 11544 11543 2489 \r\n3 4845 11548 11547 2490 \r\n3 3009 11546 11548 2490 \r\n3 3151 11547 11546 2490 \r\n3 890 11551 11550 2491 \r\n3 1678 11549 11551 2491 \r\n3 1455 11550 11549 2491 \r\n3 4917 9921 11553 2492 \r\n3 1657 11552 9921 2492 \r\n3 1075 11553 11552 2492 \r\n3 3563 5007 11555 2493 \r\n3 3329 11554 5007 2493 \r\n3 106 11555 11554 2493 \r\n3 1717 11556 6587 2494 \r\n3 2547 7877 11556 2494 \r\n3 3324 6587 7877 2494 \r\n3 1173 11559 11558 2495 \r\n3 3980 11557 11559 2495 \r\n3 2020 11558 11557 2495 \r\n3 4562 11562 11561 2496 \r\n3 3118 11560 11562 2496 \r\n3 3127 11561 11560 2496 \r\n3 812 11565 11564 2497 \r\n3 3721 11563 11565 2497 \r\n3 3772 11564 11563 2497 \r\n3 3099 11568 11567 2498 \r\n3 1148 11566 11568 2498 \r\n3 2255 11567 11566 2498 \r\n3 3939 11570 11569 2499 \r\n3 600 7540 11570 2499 \r\n3 4700 11569 7540 2499 \r\n3 4408 11571 8065 2500 \r\n3 4564 11391 11571 2500 \r\n3 2673 8065 11391 2500 \r\n3 3396 6296 11573 2501 \r\n3 3942 11572 6296 2501 \r\n3 277 11573 11572 2501 \r\n3 684 11152 11575 2502 \r\n3 1460 11574 11152 2502 \r\n3 4782 11575 11574 2502 \r\n3 2075 11578 11577 2503 \r\n3 409 11576 11578 2503 \r\n3 975 11577 11576 2503 \r\n3 326 5755 11579 2504 \r\n3 3709 6307 5755 2504 \r\n3 3820 11579 6307 2504 \r\n3 4013 11582 11581 2505 \r\n3 2171 11580 11582 2505 \r\n3 774 11581 11580 2505 \r\n3 2586 5534 11584 2506 \r\n3 3251 11583 5534 2506 \r\n3 4327 11584 11583 2506 \r\n3 30 11587 11586 2507 \r\n3 1360 11585 11587 2507 \r\n3 699 11586 11585 2507 \r\n3 4973 5549 11589 2508 \r\n3 4967 11588 5549 2508 \r\n3 709 11589 11588 2508 \r\n3 3298 11592 11591 2509 \r\n3 4645 11590 11592 2509 \r\n3 3458 11591 11590 2509 \r\n3 119 11594 8580 2510 \r\n3 2695 11593 11594 2510 \r\n3 91 8580 11593 2510 \r\n3 408 11596 11595 2511 \r\n3 2779 11298 11596 2511 \r\n3 2998 11595 11298 2511 \r\n3 3175 11598 11597 2512 \r\n3 243 6001 11598 2512 \r\n3 906 11597 6001 2512 \r\n3 3998 11601 11600 2513 \r\n3 3202 11599 11601 2513 \r\n3 3037 11600 11599 2513 \r\n3 1143 11604 11603 2514 \r\n3 990 11602 11604 2514 \r\n3 2369 11603 11602 2514 \r\n3 2032 11605 5584 2515 \r\n3 4400 6856 11605 2515 \r\n3 4740 5584 6856 2515 \r\n3 4756 11607 7038 2516 \r\n3 3801 11606 11607 2516 \r\n3 1472 7038 11606 2516 \r\n3 3174 11610 11609 2517 \r\n3 2794 11608 11610 2517 \r\n3 2346 11609 11608 2517 \r\n3 4491 11612 11611 2518 \r\n3 1470 5970 11612 2518 \r\n3 2006 11611 5970 2518 \r\n3 4582 11615 11614 2519 \r\n3 3834 11613 11615 2519 \r\n3 2754 11614 11613 2519 \r\n3 3957 11618 11617 2520 \r\n3 4238 11616 11618 2520 \r\n3 3794 11617 11616 2520 \r\n3 1246 11620 10499 2521 \r\n3 1723 11619 11620 2521 \r\n3 3641 10499 11619 2521 \r\n3 2298 11623 11622 2522 \r\n3 3920 11621 11623 2522 \r\n3 4955 11622 11621 2522 \r\n3 4891 11626 11625 2523 \r\n3 1165 11624 11626 2523 \r\n3 3664 11625 11624 2523 \r\n3 4200 11629 11628 2524 \r\n3 4007 11627 11629 2524 \r\n3 4432 11628 11627 2524 \r\n3 337 11631 5127 2525 \r\n3 863 11630 11631 2525 \r\n3 2224 5127 11630 2525 \r\n3 353 11634 11633 2526 \r\n3 3074 11632 11634 2526 \r\n3 3307 11633 11632 2526 \r\n3 2164 11085 11636 2527 \r\n3 1261 11635 11085 2527 \r\n3 2357 11636 11635 2527 \r\n3 4340 10013 11638 2528 \r\n3 3587 11637 10013 2528 \r\n3 2268 11638 11637 2528 \r\n3 3819 11641 11640 2529 \r\n3 2456 11639 11641 2529 \r\n3 3452 11640 11639 2529 \r\n3 3181 11644 11643 2530 \r\n3 4173 11642 11644 2530 \r\n3 1312 11643 11642 2530 \r\n3 1001 6029 7990 2531 \r\n3 1283 11645 6029 2531 \r\n3 493 7990 11645 2531 \r\n3 515 5481 11647 2532 \r\n3 1370 11646 5481 2532 \r\n3 2244 11647 11646 2532 \r\n3 424 6594 9403 2533 \r\n3 2860 11648 6594 2533 \r\n3 1860 9403 11648 2533 \r\n3 3933 11651 11650 2534 \r\n3 4831 11649 11651 2534 \r\n3 4781 11650 11649 2534 \r\n3 875 11308 11653 2535 \r\n3 1838 11652 11308 2535 \r\n3 2802 11653 11652 2535 \r\n3 2777 11656 11655 2536 \r\n3 2070 11654 11656 2536 \r\n3 924 11655 11654 2536 \r\n3 807 9617 11658 2537 \r\n3 3835 11657 9617 2537 \r\n3 655 11658 11657 2537 \r\n3 3991 7252 11659 2538 \r\n3 2678 10968 7252 2538 \r\n3 4823 11659 10968 2538 \r\n3 3322 11662 11661 2539 \r\n3 4257 11660 11662 2539 \r\n3 2028 11661 11660 2539 \r\n3 2203 9841 8189 2540 \r\n3 3543 11663 9841 2540 \r\n3 4339 8189 11663 2540 \r\n3 4094 11666 11665 2541 \r\n3 683 11664 11666 2541 \r\n3 4584 11665 11664 2541 \r\n3 138 11669 11668 2542 \r\n3 1145 11667 11669 2542 \r\n3 1373 11668 11667 2542 \r\n3 493 11645 11670 2543 \r\n3 1283 5833 11645 2543 \r\n3 2646 11670 5833 2543 \r\n3 1655 11673 11672 2544 \r\n3 2265 11671 11673 2544 \r\n3 3959 11672 11671 2544 \r\n3 2888 11676 11675 2545 \r\n3 3549 11674 11676 2545 \r\n3 16 11675 11674 2545 \r\n3 4799 11679 11678 2546 \r\n3 2131 11677 11679 2546 \r\n3 3106 11678 11677 2546 \r\n3 2377 11681 8475 2547 \r\n3 4767 11680 11681 2547 \r\n3 252 8475 11680 2547 \r\n3 1216 11684 11683 2548 \r\n3 2544 11682 11684 2548 \r\n3 3565 11683 11682 2548 \r\n3 2264 11686 8358 2549 \r\n3 1785 11685 11686 2549 \r\n3 3241 8358 11685 2549 \r\n3 2735 8832 11688 2550 \r\n3 3639 11687 8832 2550 \r\n3 1160 11688 11687 2550 \r\n3 3610 11691 11690 2551 \r\n3 3264 11689 11691 2551 \r\n3 4810 11690 11689 2551 \r\n3 2153 8793 11692 2552 \r\n3 731 10274 8793 2552 \r\n3 2690 11692 10274 2552 \r\n3 4307 11694 11693 2553 \r\n3 581 9949 11694 2553 \r\n3 1552 11693 9949 2553 \r\n3 2068 11696 11695 2554 \r\n3 2558 8543 11696 2554 \r\n3 3438 11695 8543 2554 \r\n3 3801 6684 11606 2555 \r\n3 1364 11697 6684 2555 \r\n3 1472 11606 11697 2555 \r\n3 2541 11700 11699 2556 \r\n3 2935 11698 11700 2556 \r\n3 4606 11699 11698 2556 \r\n3 868 11702 7663 2557 \r\n3 2757 11701 11702 2557 \r\n3 4984 7663 11701 2557 \r\n3 4890 11704 11703 2558 \r\n3 4155 9619 11704 2558 \r\n3 1510 11703 9619 2558 \r\n3 2356 11707 11706 2559 \r\n3 3765 11705 11707 2559 \r\n3 408 11706 11705 2559 \r\n3 4620 6589 11709 2560 \r\n3 3651 11708 6589 2560 \r\n3 3032 11709 11708 2560 \r\n3 1565 11712 11711 2561 \r\n3 2229 11710 11712 2561 \r\n3 3998 11711 11710 2561 \r\n3 4538 11715 11714 2562 \r\n3 2052 11713 11715 2562 \r\n3 3122 11714 11713 2562 \r\n3 3435 11718 11717 2563 \r\n3 2190 11716 11718 2563 \r\n3 4853 11717 11716 2563 \r\n3 4556 11720 11719 2564 \r\n3 4108 11226 11720 2564 \r\n3 2858 11719 11226 2564 \r\n3 1945 11723 11722 2565 \r\n3 3389 11721 11723 2565 \r\n3 2634 11722 11721 2565 \r\n3 4080 11725 7386 2566 \r\n3 2257 11724 11725 2566 \r\n3 407 7386 11724 2566 \r\n3 865 11727 8030 2567 \r\n3 3357 11726 11727 2567 \r\n3 1195 8030 11726 2567 \r\n3 1881 11730 11729 2568 \r\n3 2243 11728 11730 2568 \r\n3 849 11729 11728 2568 \r\n3 1547 11732 9021 2569 \r\n3 797 11731 11732 2569 \r\n3 4843 9021 11731 2569 \r\n3 4798 11733 11166 2570 \r\n3 3389 8494 11733 2570 \r\n3 1607 11166 8494 2570 \r\n3 3045 11734 9533 2571 \r\n3 1428 10919 11734 2571 \r\n3 793 9533 10919 2571 \r\n3 3570 11736 11735 2572 \r\n3 4272 7178 11736 2572 \r\n3 323 11735 7178 2572 \r\n3 948 11738 11737 2573 \r\n3 2083 5638 11738 2573 \r\n3 995 11737 5638 2573 \r\n3 4283 11740 11739 2574 \r\n3 2759 7868 11740 2574 \r\n3 4412 11739 7868 2574 \r\n3 1572 11742 6177 2575 \r\n3 1765 11741 11742 2575 \r\n3 1011 6177 11741 2575 \r\n3 2775 11744 6047 2576 \r\n3 3623 11743 11744 2576 \r\n3 3017 6047 11743 2576 \r\n3 3276 11747 11746 2577 \r\n3 2536 11745 11747 2577 \r\n3 202 11746 11745 2577 \r\n3 4824 11749 7841 2578 \r\n3 2617 11748 11749 2578 \r\n3 2349 7841 11748 2578 \r\n3 3205 11751 8126 2579 \r\n3 2554 11750 11751 2579 \r\n3 556 8126 11750 2579 \r\n3 1614 11754 11753 2580 \r\n3 490 11752 11754 2580 \r\n3 1831 11753 11752 2580 \r\n3 4151 5300 11756 2581 \r\n3 2573 11755 5300 2581 \r\n3 3546 11756 11755 2581 \r\n3 1693 11759 11758 2582 \r\n3 1090 11757 11759 2582 \r\n3 4598 11758 11757 2582 \r\n3 1902 11761 9994 2583 \r\n3 189 11760 11761 2583 \r\n3 2992 9994 11760 2583 \r\n3 4799 11764 11763 2584 \r\n3 3937 11762 11764 2584 \r\n3 4009 11763 11762 2584 \r\n3 3726 11767 11766 2585 \r\n3 2152 11765 11767 2585 \r\n3 1712 11766 11765 2585 \r\n3 2320 6196 11769 2586 \r\n3 2666 11768 6196 2586 \r\n3 1330 11769 11768 2586 \r\n3 2196 11772 11771 2587 \r\n3 1382 11770 11772 2587 \r\n3 3397 11771 11770 2587 \r\n3 750 11774 11773 2588 \r\n3 468 5714 11774 2588 \r\n3 3939 11773 5714 2588 \r\n3 183 5688 11776 2589 \r\n3 253 11775 5688 2589 \r\n3 2061 11776 11775 2589 \r\n3 142 5242 11778 2590 \r\n3 4334 11777 5242 2590 \r\n3 3346 11778 11777 2590 \r\n3 1765 11742 11780 2591 \r\n3 1572 11779 11742 2591 \r\n3 286 11780 11779 2591 \r\n3 3894 11783 11782 2592 \r\n3 2042 11781 11783 2592 \r\n3 2677 11782 11781 2592 \r\n3 4639 11786 11785 2593 \r\n3 1402 11784 11786 2593 \r\n3 3615 11785 11784 2593 \r\n3 1745 9883 11788 2594 \r\n3 413 11787 9883 2594 \r\n3 1643 11788 11787 2594 \r\n3 467 11790 11789 2595 \r\n3 4800 8483 11790 2595 \r\n3 3588 11789 8483 2595 \r\n3 1897 11793 11792 2596 \r\n3 189 11791 11793 2596 \r\n3 1213 11792 11791 2596 \r\n3 3743 9464 11794 2597 \r\n3 334 10681 9464 2597 \r\n3 4864 11794 10681 2597 \r\n3 434 11797 11796 2598 \r\n3 3922 11795 11797 2598 \r\n3 654 11796 11795 2598 \r\n3 2309 11798 9822 2599 \r\n3 3193 9844 11798 2599 \r\n3 4346 9822 9844 2599 \r\n3 1242 11801 11800 2600 \r\n3 1416 11799 11801 2600 \r\n3 3952 11800 11799 2600 \r\n3 2480 11804 11803 2601 \r\n3 1267 11802 11804 2601 \r\n3 4203 11803 11802 2601 \r\n3 1187 11806 11805 2602 \r\n3 451 5030 11806 2602 \r\n3 3414 11805 5030 2602 \r\n3 718 11809 11808 2603 \r\n3 941 11807 11809 2603 \r\n3 4295 11808 11807 2603 \r\n3 3011 11812 11811 2604 \r\n3 58 11810 11812 2604 \r\n3 1118 11811 11810 2604 \r\n3 3155 11815 11814 2605 \r\n3 2512 11813 11815 2605 \r\n3 1571 11814 11813 2605 \r\n3 525 11818 11817 2606 \r\n3 1277 11816 11818 2606 \r\n3 2718 11817 11816 2606 \r\n3 3212 11821 11820 2607 \r\n3 1369 11819 11821 2607 \r\n3 955 11820 11819 2607 \r\n3 428 11824 11823 2608 \r\n3 71 11822 11824 2608 \r\n3 1709 11823 11822 2608 \r\n3 309 6388 11826 2609 \r\n3 3553 11825 6388 2609 \r\n3 4152 11826 11825 2609 \r\n3 2150 11827 11283 2610 \r\n3 1829 6691 11827 2610 \r\n3 2934 11283 6691 2610 \r\n3 310 11119 11828 2611 \r\n3 4406 5319 11119 2611 \r\n3 471 11828 5319 2611 \r\n3 3655 11830 11829 2612 \r\n3 827 9034 11830 2612 \r\n3 787 11829 9034 2612 \r\n3 3666 11832 11831 2613 \r\n3 459 7180 11832 2613 \r\n3 2917 11831 7180 2613 \r\n3 4373 11835 11834 2614 \r\n3 121 11833 11835 2614 \r\n3 2323 11834 11833 2614 \r\n3 2814 11838 11837 2615 \r\n3 1589 11836 11838 2615 \r\n3 2160 11837 11836 2615 \r\n3 4998 11839 8649 2616 \r\n3 2212 10356 11839 2616 \r\n3 471 8649 10356 2616 \r\n3 3847 11841 7174 2617 \r\n3 1067 11840 11841 2617 \r\n3 1984 7174 11840 2617 \r\n3 4047 11843 11842 2618 \r\n3 599 5150 11843 2618 \r\n3 2931 11842 5150 2618 \r\n3 1887 8936 11844 2619 \r\n3 2826 11072 8936 2619 \r\n3 12 11844 11072 2619 \r\n3 4724 7020 11846 2620 \r\n3 2435 11845 7020 2620 \r\n3 2238 11846 11845 2620 \r\n3 2380 5997 9866 2621 \r\n3 4554 11847 5997 2621 \r\n3 4976 9866 11847 2621 \r\n3 4373 11850 11849 2622 \r\n3 498 11848 11850 2622 \r\n3 569 11849 11848 2622 \r\n3 3113 8716 11852 2623 \r\n3 302 11851 8716 2623 \r\n3 3407 11852 11851 2623 \r\n3 4803 11854 11853 2624 \r\n3 210 9543 11854 2624 \r\n3 2818 11853 9543 2624 \r\n3 4625 6287 10224 2625 \r\n3 3775 7308 6287 2625 \r\n3 2462 10224 7308 2625 \r\n3 1730 9251 5843 2626 \r\n3 537 11855 9251 2626 \r\n3 4758 5843 11855 2626 \r\n3 4693 8961 11857 2627 \r\n3 1557 11856 8961 2627 \r\n3 1461 11857 11856 2627 \r\n3 1506 11860 11859 2628 \r\n3 2549 11858 11860 2628 \r\n3 1610 11859 11858 2628 \r\n3 4979 11862 11861 2629 \r\n3 3158 8562 11862 2629 \r\n3 363 11861 8562 2629 \r\n3 3605 7947 11864 2630 \r\n3 1300 11863 7947 2630 \r\n3 2869 11864 11863 2630 \r\n3 2839 11866 11865 2631 \r\n3 2709 9577 11866 2631 \r\n3 3207 11865 9577 2631 \r\n3 1413 11868 10764 2632 \r\n3 1740 11867 11868 2632 \r\n3 4214 10764 11867 2632 \r\n3 1563 5010 11870 2633 \r\n3 3026 11869 5010 2633 \r\n3 2422 11870 11869 2633 \r\n3 3093 11873 11872 2634 \r\n3 3394 11871 11873 2634 \r\n3 485 11872 11871 2634 \r\n3 798 11876 11875 2635 \r\n3 950 11874 11876 2635 \r\n3 1142 11875 11874 2635 \r\n3 1924 6127 11878 2636 \r\n3 4393 11877 6127 2636 \r\n3 2130 11878 11877 2636 \r\n3 3856 11881 11880 2637 \r\n3 2374 11879 11881 2637 \r\n3 4175 11880 11879 2637 \r\n3 373 8790 8957 2638 \r\n3 2008 11882 8790 2638 \r\n3 524 8957 11882 2638 \r\n3 1811 11884 7898 2639 \r\n3 1026 11883 11884 2639 \r\n3 158 7898 11883 2639 \r\n3 4744 11887 11886 2640 \r\n3 521 11885 11887 2640 \r\n3 3129 11886 11885 2640 \r\n3 4323 11889 6862 2641 \r\n3 3929 11888 11889 2641 \r\n3 447 6862 11888 2641 \r\n3 999 11891 11890 2642 \r\n3 2813 7643 11891 2642 \r\n3 4316 11890 7643 2642 \r\n3 2405 9708 11893 2643 \r\n3 2790 11892 9708 2643 \r\n3 633 11893 11892 2643 \r\n3 3640 11895 11894 2644 \r\n3 2594 5044 11895 2644 \r\n3 2545 11894 5044 2644 \r\n3 852 11898 11897 2645 \r\n3 3491 11896 11898 2645 \r\n3 669 11897 11896 2645 \r\n3 1085 8343 6964 2646 \r\n3 4885 11420 8343 2646 \r\n3 3102 6964 11420 2646 \r\n3 2526 11901 11900 2647 \r\n3 1138 11899 11901 2647 \r\n3 340 11900 11899 2647 \r\n3 2348 11904 11903 2648 \r\n3 2649 11902 11904 2648 \r\n3 1089 11903 11902 2648 \r\n3 2862 9325 11906 2649 \r\n3 3068 11905 9325 2649 \r\n3 3413 11906 11905 2649 \r\n3 304 7753 11908 2650 \r\n3 533 11907 7753 2650 \r\n3 3823 11908 11907 2650 \r\n3 2691 11910 7168 2651 \r\n3 2249 11909 11910 2651 \r\n3 2030 7168 11909 2651 \r\n3 1086 11913 11912 2652 \r\n3 683 11911 11913 2652 \r\n3 3895 11912 11911 2652 \r\n3 1107 11916 11915 2653 \r\n3 851 11914 11916 2653 \r\n3 462 11915 11914 2653 \r\n3 79 11919 11918 2654 \r\n3 4515 11917 11919 2654 \r\n3 1568 11918 11917 2654 \r\n3 4198 11922 11921 2655 \r\n3 2259 11920 11922 2655 \r\n3 4169 11921 11920 2655 \r\n3 634 11924 11923 2656 \r\n3 1599 6666 11924 2656 \r\n3 4124 11923 6666 2656 \r\n3 2110 9196 11926 2657 \r\n3 4605 11925 9196 2657 \r\n3 1097 11926 11925 2657 \r\n3 3278 11928 11927 2658 \r\n3 2953 9198 11928 2658 \r\n3 1414 11927 9198 2658 \r\n3 3827 11930 6226 2659 \r\n3 1360 11929 11930 2659 \r\n3 3305 6226 11929 2659 \r\n3 3931 11932 11931 2660 \r\n3 1039 5886 11932 2660 \r\n3 1275 11931 5886 2660 \r\n3 39 11935 11934 2661 \r\n3 567 11933 11935 2661 \r\n3 1753 11934 11933 2661 \r\n3 3502 11938 11937 2662 \r\n3 2521 11936 11938 2662 \r\n3 1322 11937 11936 2662 \r\n3 2356 11706 11939 2663 \r\n3 408 9503 11706 2663 \r\n3 2173 11939 9503 2663 \r\n3 1410 7738 6697 2664 \r\n3 776 11940 7738 2664 \r\n3 4508 6697 11940 2664 \r\n3 4456 6716 7366 2665 \r\n3 2327 8599 6716 2665 \r\n3 3307 7366 8599 2665 \r\n3 1847 11943 11942 2666 \r\n3 42 11941 11943 2666 \r\n3 300 11942 11941 2666 \r\n3 33 11945 7798 2667 \r\n3 4049 11944 11945 2667 \r\n3 2395 7798 11944 2667 \r\n3 4248 10045 8858 2668 \r\n3 4375 10711 10045 2668 \r\n3 4122 8858 10711 2668 \r\n3 3824 11948 11947 2669 \r\n3 2153 11946 11948 2669 \r\n3 3 11947 11946 2669 \r\n3 862 8384 10422 2670 \r\n3 4778 11949 8384 2670 \r\n3 4353 10422 11949 2670 \r\n3 4134 11951 10457 2671 \r\n3 3083 11950 11951 2671 \r\n3 659 10457 11950 2671 \r\n3 2677 11781 11952 2672 \r\n3 2042 9154 11781 2672 \r\n3 778 11952 9154 2672 \r\n3 3039 11953 6556 2673 \r\n3 264 7503 11953 2673 \r\n3 3902 6556 7503 2673 \r\n3 56 11956 11955 2674 \r\n3 2327 11954 11956 2674 \r\n3 3669 11955 11954 2674 \r\n3 4523 6709 11416 2675 \r\n3 775 9732 6709 2675 \r\n3 3047 11416 9732 2675 \r\n3 5000 11959 11958 2676 \r\n3 2478 11957 11959 2676 \r\n3 4451 11958 11957 2676 \r\n3 3151 11962 11961 2677 \r\n3 3386 11960 11962 2677 \r\n3 1496 11961 11960 2677 \r\n3 301 6956 5322 2678 \r\n3 4754 11963 6956 2678 \r\n3 942 5322 11963 2678 \r\n3 4107 11965 11333 2679 \r\n3 2861 11964 11965 2679 \r\n3 2232 11333 11964 2679 \r\n3 1289 11968 11967 2680 \r\n3 1764 11966 11968 2680 \r\n3 883 11967 11966 2680 \r\n3 1494 11970 6656 2681 \r\n3 2429 11969 11970 2681 \r\n3 4279 6656 11969 2681 \r\n3 4247 11972 6489 2682 \r\n3 11 11971 11972 2682 \r\n3 2213 6489 11971 2682 \r\n3 1446 11974 11973 2683 \r\n3 2168 10830 11974 2683 \r\n3 112 11973 10830 2683 \r\n3 22 11976 7230 2684 \r\n3 4146 11975 11976 2684 \r\n3 354 7230 11975 2684 \r\n3 4633 11978 10083 2685 \r\n3 2278 11977 11978 2685 \r\n3 2475 10083 11977 2685 \r\n3 1256 11980 6535 2686 \r\n3 2664 11979 11980 2686 \r\n3 495 6535 11979 2686 \r\n3 4768 11982 5572 2687 \r\n3 1087 11981 11982 2687 \r\n3 1164 5572 11981 2687 \r\n3 4388 10002 11983 2688 \r\n3 2370 8550 10002 2688 \r\n3 2643 11983 8550 2688 \r\n3 505 11985 6266 2689 \r\n3 1835 11984 11985 2689 \r\n3 418 6266 11984 2689 \r\n3 1688 11988 11987 2690 \r\n3 3879 11986 11988 2690 \r\n3 3246 11987 11986 2690 \r\n3 4366 11990 11989 2691 \r\n3 4422 5507 11990 2691 \r\n3 1114 11989 5507 2691 \r\n3 3775 11992 7309 2692 \r\n3 1478 11991 11992 2692 \r\n3 4377 7309 11991 2692 \r\n3 4615 11993 5357 2693 \r\n3 850 7448 11993 2693 \r\n3 1613 5357 7448 2693 \r\n3 3264 11994 6447 2694 \r\n3 3057 9970 11994 2694 \r\n3 1232 6447 9970 2694 \r\n3 1041 11997 11996 2695 \r\n3 1267 11995 11997 2695 \r\n3 334 11996 11995 2695 \r\n3 3968 12000 11999 2696 \r\n3 2071 11998 12000 2696 \r\n3 4090 11999 11998 2696 \r\n3 2556 10574 12001 2697 \r\n3 850 8675 10574 2697 \r\n3 2495 12001 8675 2697 \r\n3 1074 12004 12003 2698 \r\n3 2838 12002 12004 2698 \r\n3 1790 12003 12002 2698 \r\n3 3107 12006 8023 2699 \r\n3 3632 12005 12006 2699 \r\n3 928 8023 12005 2699 \r\n3 4238 12009 12008 2700 \r\n3 3077 12007 12009 2700 \r\n3 3268 12008 12007 2700 \r\n3 4186 12012 12011 2701 \r\n3 2034 12010 12012 2701 \r\n3 3038 12011 12010 2701 \r\n3 4698 12015 12014 2702 \r\n3 4463 12013 12015 2702 \r\n3 824 12014 12013 2702 \r\n3 3006 12018 12017 2703 \r\n3 2097 12016 12018 2703 \r\n3 2817 12017 12016 2703 \r\n3 983 12021 12020 2704 \r\n3 1916 12019 12021 2704 \r\n3 236 12020 12019 2704 \r\n3 3337 12024 12023 2705 \r\n3 3422 12022 12024 2705 \r\n3 605 12023 12022 2705 \r\n3 1302 7355 12026 2706 \r\n3 723 12025 7355 2706 \r\n3 49 12026 12025 2706 \r\n3 4434 12029 12028 2707 \r\n3 3294 12027 12029 2707 \r\n3 4304 12028 12027 2707 \r\n3 807 12030 9615 2708 \r\n3 1230 6874 12030 2708 \r\n3 1193 9615 6874 2708 \r\n3 3263 12033 12032 2709 \r\n3 1008 12031 12033 2709 \r\n3 1260 12032 12031 2709 \r\n3 1391 12036 12035 2710 \r\n3 72 12034 12036 2710 \r\n3 4054 12035 12034 2710 \r\n3 925 12039 12038 2711 \r\n3 3784 12037 12039 2711 \r\n3 4913 12038 12037 2711 \r\n3 2411 12041 12040 2712 \r\n3 10 11486 12041 2712 \r\n3 4002 12040 11486 2712 \r\n3 3366 12043 8242 2713 \r\n3 4345 12042 12043 2713 \r\n3 4851 8242 12042 2713 \r\n3 4090 12046 12045 2714 \r\n3 1004 12044 12046 2714 \r\n3 3200 12045 12044 2714 \r\n3 3265 12049 12048 2715 \r\n3 3542 12047 12049 2715 \r\n3 4059 12048 12047 2715 \r\n3 429 12051 12050 2716 \r\n3 4608 9099 12051 2716 \r\n3 2683 12050 9099 2716 \r\n3 3513 12054 12053 2717 \r\n3 4760 12052 12054 2717 \r\n3 2027 12053 12052 2717 \r\n3 4914 12057 12056 2718 \r\n3 2801 12055 12057 2718 \r\n3 171 12056 12055 2718 \r\n3 3871 12059 12058 2719 \r\n3 621 5403 12059 2719 \r\n3 3988 12058 5403 2719 \r\n3 3130 12061 7800 2720 \r\n3 3966 12060 12061 2720 \r\n3 33 7800 12060 2720 \r\n3 2889 12064 12063 2721 \r\n3 2453 12062 12064 2721 \r\n3 2045 12063 12062 2721 \r\n3 511 12067 12066 2722 \r\n3 501 12065 12067 2722 \r\n3 4736 12066 12065 2722 \r\n3 692 11417 12069 2723 \r\n3 2656 12068 11417 2723 \r\n3 2150 12069 12068 2723 \r\n3 328 12071 12070 2724 \r\n3 3345 11094 12071 2724 \r\n3 3455 12070 11094 2724 \r\n3 3595 12073 12072 2725 \r\n3 4495 6491 12073 2725 \r\n3 2295 12072 6491 2725 \r\n3 3673 12076 12075 2726 \r\n3 2048 12074 12076 2726 \r\n3 4613 12075 12074 2726 \r\n3 2492 12079 12078 2727 \r\n3 23 12077 12079 2727 \r\n3 1658 12078 12077 2727 \r\n3 2257 9333 11724 2728 \r\n3 4906 8884 9333 2728 \r\n3 407 11724 8884 2728 \r\n3 3378 12082 12081 2729 \r\n3 1734 12080 12082 2729 \r\n3 1796 12081 12080 2729 \r\n3 2890 6898 12084 2730 \r\n3 330 12083 6898 2730 \r\n3 1128 12084 12083 2730 \r\n3 3010 12085 5586 2731 \r\n3 3814 7719 12085 2731 \r\n3 2032 5586 7719 2731 \r\n3 4379 10933 12087 2732 \r\n3 2285 12086 10933 2732 \r\n3 2645 12087 12086 2732 \r\n3 4143 12088 5009 2733 \r\n3 737 8535 12088 2733 \r\n3 3026 5009 8535 2733 \r\n3 3766 12090 12089 2734 \r\n3 4368 10894 12090 2734 \r\n3 4466 12089 10894 2734 \r\n3 2378 10427 12092 2735 \r\n3 123 12091 10427 2735 \r\n3 900 12092 12091 2735 \r\n3 3415 9707 12094 2736 \r\n3 2007 12093 9707 2736 \r\n3 3379 12094 12093 2736 \r\n3 3994 6247 12096 2737 \r\n3 3053 12095 6247 2737 \r\n3 4614 12096 12095 2737 \r\n3 754 12098 11499 2738 \r\n3 3581 12097 12098 2738 \r\n3 1879 11499 12097 2738 \r\n3 226 12101 12100 2739 \r\n3 2733 12099 12101 2739 \r\n3 1166 12100 12099 2739 \r\n3 2457 12104 12103 2740 \r\n3 4376 12102 12104 2740 \r\n3 2714 12103 12102 2740 \r\n3 3903 10930 12105 2741 \r\n3 4732 5933 10930 2741 \r\n3 2877 12105 5933 2741 \r\n3 3988 5402 12106 2742 \r\n3 151 11196 5402 2742 \r\n3 4531 12106 11196 2742 \r\n3 1912 12108 10568 2743 \r\n3 1450 12107 12108 2743 \r\n3 4207 10568 12107 2743 \r\n3 3174 8506 12110 2744 \r\n3 1868 12109 8506 2744 \r\n3 225 12110 12109 2744 \r\n3 2432 12112 12111 2745 \r\n3 4142 5208 12112 2745 \r\n3 4214 12111 5208 2745 \r\n3 4979 11861 12114 2746 \r\n3 363 12113 11861 2746 \r\n3 4651 12114 12113 2746 \r\n3 2010 12117 12116 2747 \r\n3 1118 12115 12117 2747 \r\n3 4970 12116 12115 2747 \r\n3 2281 5847 12118 2748 \r\n3 4808 11012 5847 2748 \r\n3 4008 12118 11012 2748 \r\n3 2844 12120 12119 2749 \r\n3 4242 9383 12120 2749 \r\n3 1285 12119 9383 2749 \r\n3 3206 7423 12122 2750 \r\n3 285 12121 7423 2750 \r\n3 1779 12122 12121 2750 \r\n3 3668 12125 12124 2751 \r\n3 573 12123 12125 2751 \r\n3 1801 12124 12123 2751 \r\n3 3974 12128 12127 2752 \r\n3 944 12126 12128 2752 \r\n3 2652 12127 12126 2752 \r\n3 1940 12130 7592 2753 \r\n3 2644 12129 12130 2753 \r\n3 1047 7592 12129 2753 \r\n3 212 12133 12132 2754 \r\n3 4018 12131 12133 2754 \r\n3 1586 12132 12131 2754 \r\n3 1286 8432 12134 2755 \r\n3 3413 11905 8432 2755 \r\n3 3068 12134 11905 2755 \r\n3 2056 6925 12136 2756 \r\n3 1056 12135 6925 2756 \r\n3 4292 12136 12135 2756 \r\n3 3351 12139 12138 2757 \r\n3 234 12137 12139 2757 \r\n3 4055 12138 12137 2757 \r\n3 2472 12142 12141 2758 \r\n3 2680 12140 12142 2758 \r\n3 2852 12141 12140 2758 \r\n3 790 12145 12144 2759 \r\n3 388 12143 12145 2759 \r\n3 2173 12144 12143 2759 \r\n3 1490 12147 12146 2760 \r\n3 501 12067 12147 2760 \r\n3 511 12146 12067 2760 \r\n3 3312 7326 12148 2761 \r\n3 3552 6675 7326 2761 \r\n3 1184 12148 6675 2761 \r\n3 2838 12004 12149 2762 \r\n3 1074 5853 12004 2762 \r\n3 2290 12149 5853 2762 \r\n3 295 12152 12151 2763 \r\n3 4112 12150 12152 2763 \r\n3 4364 12151 12150 2763 \r\n3 4998 12154 11839 2764 \r\n3 4630 12153 12154 2764 \r\n3 2212 11839 12153 2764 \r\n3 3283 12156 6672 2765 \r\n3 572 12155 12156 2765 \r\n3 1652 6672 12155 2765 \r\n3 1805 12159 12158 2766 \r\n3 4501 12157 12159 2766 \r\n3 1756 12158 12157 2766 \r\n3 2768 12161 7422 2767 \r\n3 2108 12160 12161 2767 \r\n3 4319 7422 12160 2767 \r\n3 3714 6681 8230 2768 \r\n3 4305 12162 6681 2768 \r\n3 464 8230 12162 2768 \r\n3 828 12163 11517 2769 \r\n3 4221 11156 12163 2769 \r\n3 675 11517 11156 2769 \r\n3 1811 12164 11884 2770 \r\n3 3761 11290 12164 2770 \r\n3 1026 11884 11290 2770 \r\n3 3697 7497 6541 2771 \r\n3 1994 12165 7497 2771 \r\n3 4081 6541 12165 2771 \r\n3 3925 5528 9048 2772 \r\n3 1471 11116 5528 2772 \r\n3 45 9048 11116 2772 \r\n3 2137 7945 12166 2773 \r\n3 3913 6311 7945 2773 \r\n3 3931 12166 6311 2773 \r\n3 2042 12168 9155 2774 \r\n3 4668 12167 12168 2774 \r\n3 98 9155 12167 2774 \r\n3 3283 5178 12170 2775 \r\n3 1095 12169 5178 2775 \r\n3 3958 12170 12169 2775 \r\n3 3113 11852 10290 2776 \r\n3 3407 12171 11852 2776 \r\n3 3315 10290 12171 2776 \r\n3 218 12173 12172 2777 \r\n3 204 5578 12173 2777 \r\n3 3974 12172 5578 2777 \r\n3 4921 10132 12175 2778 \r\n3 2921 12174 10132 2778 \r\n3 3815 12175 12174 2778 \r\n3 4562 12178 12177 2779 \r\n3 786 12176 12178 2779 \r\n3 2585 12177 12176 2779 \r\n3 4268 9123 12180 2780 \r\n3 2140 12179 9123 2780 \r\n3 1570 12180 12179 2780 \r\n3 4388 12183 12182 2781 \r\n3 4030 12181 12183 2781 \r\n3 4448 12182 12181 2781 \r\n3 4262 12185 12184 2782 \r\n3 187 10355 12185 2782 \r\n3 2712 12184 10355 2782 \r\n3 3878 12188 12187 2783 \r\n3 4170 12186 12188 2783 \r\n3 4733 12187 12186 2783 \r\n3 2552 12191 12190 2784 \r\n3 3713 12189 12191 2784 \r\n3 4596 12190 12189 2784 \r\n3 2580 7044 12193 2785 \r\n3 1124 12192 7044 2785 \r\n3 3299 12193 12192 2785 \r\n3 3869 9044 9405 2786 \r\n3 2785 12194 9044 2786 \r\n3 424 9405 12194 2786 \r\n3 3422 12197 12196 2787 \r\n3 2102 12195 12197 2787 \r\n3 3258 12196 12195 2787 \r\n3 514 12200 12199 2788 \r\n3 765 12198 12200 2788 \r\n3 3850 12199 12198 2788 \r\n3 1174 12203 12202 2789 \r\n3 3175 12201 12203 2789 \r\n3 1773 12202 12201 2789 \r\n3 2081 9509 12205 2790 \r\n3 772 12204 9509 2790 \r\n3 3738 12205 12204 2790 \r\n3 51 12207 10012 2791 \r\n3 3010 12206 12207 2791 \r\n3 2381 10012 12206 2791 \r\n3 1624 12209 12208 2792 \r\n3 1074 12003 12209 2792 \r\n3 1790 12208 12003 2792 \r\n3 4957 12211 9794 2793 \r\n3 1559 12210 12211 2793 \r\n3 969 9794 12210 2793 \r\n3 2465 12214 12213 2794 \r\n3 1342 12212 12214 2794 \r\n3 3228 12213 12212 2794 \r\n3 2475 12216 10084 2795 \r\n3 2893 12215 12216 2795 \r\n3 2147 10084 12215 2795 \r\n3 2982 12217 9885 2796 \r\n3 27 7596 12217 2796 \r\n3 4497 9885 7596 2796 \r\n3 1874 12220 12219 2797 \r\n3 575 12218 12220 2797 \r\n3 770 12219 12218 2797 \r\n3 4862 12223 12222 2798 \r\n3 1574 12221 12223 2798 \r\n3 3401 12222 12221 2798 \r\n3 1268 8325 7569 2799 \r\n3 2926 9567 8325 2799 \r\n3 1691 7569 9567 2799 \r\n3 4767 11681 8890 2800 \r\n3 2377 12224 11681 2800 \r\n3 4602 8890 12224 2800 \r\n3 593 12225 5953 2801 \r\n3 2559 5237 12225 2801 \r\n3 3368 5953 5237 2801 \r\n3 4528 7547 12227 2802 \r\n3 700 12226 7547 2802 \r\n3 2269 12227 12226 2802 \r\n3 1925 12229 9898 2803 \r\n3 2823 12228 12229 2803 \r\n3 4989 9898 12228 2803 \r\n3 4601 9600 11112 2804 \r\n3 752 10100 9600 2804 \r\n3 3507 11112 10100 2804 \r\n3 3238 12232 12231 2805 \r\n3 4791 12230 12232 2805 \r\n3 531 12231 12230 2805 \r\n3 4087 12235 12234 2806 \r\n3 2992 12233 12235 2806 \r\n3 4197 12234 12233 2806 \r\n3 172 12238 12237 2807 \r\n3 3629 12236 12238 2807 \r\n3 1637 12237 12236 2807 \r\n3 3564 6466 12240 2808 \r\n3 2509 12239 6466 2808 \r\n3 745 12240 12239 2808 \r\n3 549 12242 12241 2809 \r\n3 2917 10515 12242 2809 \r\n3 551 12241 10515 2809 \r\n3 1416 12243 11799 2810 \r\n3 3289 11428 12243 2810 \r\n3 3952 11799 11428 2810 \r\n3 4314 12246 12245 2811 \r\n3 3505 12244 12246 2811 \r\n3 3596 12245 12244 2811 \r\n3 3126 12249 12248 2812 \r\n3 1033 12247 12249 2812 \r\n3 406 12248 12247 2812 \r\n3 2726 10620 7510 2813 \r\n3 4869 10863 10620 2813 \r\n3 893 7510 10863 2813 \r\n3 4510 12251 11488 2814 \r\n3 4974 12250 12251 2814 \r\n3 1985 11488 12250 2814 \r\n3 208 12252 10024 2815 \r\n3 2000 10566 12252 2815 \r\n3 4207 10024 10566 2815 \r\n3 2381 12206 12254 2816 \r\n3 3010 12253 12206 2816 \r\n3 4110 12254 12253 2816 \r\n3 3993 12256 12255 2817 \r\n3 881 10561 12256 2817 \r\n3 2107 12255 10561 2817 \r\n3 2648 9469 12257 2818 \r\n3 4859 6793 9469 2818 \r\n3 2892 12257 6793 2818 \r\n3 2097 12260 12259 2819 \r\n3 2031 12258 12260 2819 \r\n3 1589 12259 12258 2819 \r\n3 3427 12263 12262 2820 \r\n3 317 12261 12263 2820 \r\n3 997 12262 12261 2820 \r\n3 3156 12265 12264 2821 \r\n3 4830 9182 12265 2821 \r\n3 2901 12264 9182 2821 \r\n3 4420 12268 12267 2822 \r\n3 3531 12266 12268 2822 \r\n3 3541 12267 12266 2822 \r\n3 2509 12270 12239 2823 \r\n3 4893 12269 12270 2823 \r\n3 745 12239 12269 2823 \r\n3 1381 12271 9933 2824 \r\n3 1345 10616 12271 2824 \r\n3 1814 9933 10616 2824 \r\n3 2767 12273 12272 2825 \r\n3 2474 9060 12273 2825 \r\n3 4073 12272 9060 2825 \r\n3 4921 10605 10133 2826 \r\n3 3537 12274 10605 2826 \r\n3 1243 10133 12274 2826 \r\n3 2930 12277 12276 2827 \r\n3 4752 12275 12277 2827 \r\n3 1752 12276 12275 2827 \r\n3 2139 12279 12278 2828 \r\n3 870 11041 12279 2828 \r\n3 2212 12278 11041 2828 \r\n3 2169 12282 12281 2829 \r\n3 4910 12280 12282 2829 \r\n3 3922 12281 12280 2829 \r\n3 3621 6061 6028 2830 \r\n3 303 12283 6061 2830 \r\n3 1388 6028 12283 2830 \r\n3 1201 12286 12285 2831 \r\n3 4129 12284 12286 2831 \r\n3 3459 12285 12284 2831 \r\n3 1384 12288 12287 2832 \r\n3 4858 10923 12288 2832 \r\n3 844 12287 10923 2832 \r\n3 990 12290 11602 2833 \r\n3 2947 12289 12290 2833 \r\n3 2369 11602 12289 2833 \r\n3 153 12293 12292 2834 \r\n3 3162 12291 12293 2834 \r\n3 2532 12292 12291 2834 \r\n3 1651 6880 5835 2835 \r\n3 1966 12294 6880 2835 \r\n3 2090 5835 12294 2835 \r\n3 2695 12296 12295 2836 \r\n3 852 11897 12296 2836 \r\n3 669 12295 11897 2836 \r\n3 2318 12299 12298 2837 \r\n3 4680 12297 12299 2837 \r\n3 4755 12298 12297 2837 \r\n3 3218 12302 12301 2838 \r\n3 2308 12300 12302 2838 \r\n3 386 12301 12300 2838 \r\n3 4379 12305 12304 2839 \r\n3 2598 12303 12305 2839 \r\n3 1 12304 12303 2839 \r\n3 2269 12308 12307 2840 \r\n3 3326 12306 12308 2840 \r\n3 216 12307 12306 2840 \r\n3 556 11750 8069 2841 \r\n3 2554 12309 11750 2841 \r\n3 2088 8069 12309 2841 \r\n3 1600 12312 12311 2842 \r\n3 2473 12310 12312 2842 \r\n3 1656 12311 12310 2842 \r\n3 536 12313 7749 2843 \r\n3 1865 7804 12313 2843 \r\n3 3812 7749 7804 2843 \r\n3 1717 12315 12314 2844 \r\n3 1064 9937 12315 2844 \r\n3 1844 12314 9937 2844 \r\n3 1070 12317 12316 2845 \r\n3 4856 8328 12317 2845 \r\n3 1181 12316 8328 2845 \r\n3 1817 12319 10876 2846 \r\n3 2190 12318 12319 2846 \r\n3 1845 10876 12318 2846 \r\n3 2698 12322 12321 2847 \r\n3 4259 12320 12322 2847 \r\n3 103 12321 12320 2847 \r\n3 1756 12324 12323 2848 \r\n3 1593 6125 12324 2848 \r\n3 282 12323 6125 2848 \r\n3 2061 6192 12326 2849 \r\n3 2872 12325 6192 2849 \r\n3 2487 12326 12325 2849 \r\n3 1407 12328 6512 2850 \r\n3 3418 12327 12328 2850 \r\n3 3442 6512 12327 2850 \r\n3 2665 12331 12330 2851 \r\n3 3754 12329 12331 2851 \r\n3 4045 12330 12329 2851 \r\n3 1757 12332 9036 2852 \r\n3 2975 11402 12332 2852 \r\n3 206 9036 11402 2852 \r\n3 803 12333 6824 2853 \r\n3 3939 11569 12333 2853 \r\n3 4700 6824 11569 2853 \r\n3 3439 12335 9713 2854 \r\n3 2170 12334 12335 2854 \r\n3 2225 9713 12334 2854 \r\n3 3649 12336 8718 2855 \r\n3 3820 6309 12336 2855 \r\n3 3882 8718 6309 2855 \r\n3 4179 8275 6855 2856 \r\n3 2201 12337 8275 2856 \r\n3 4740 6855 12337 2856 \r\n3 4519 12340 12339 2857 \r\n3 2129 12338 12340 2857 \r\n3 3833 12339 12338 2857 \r\n3 3290 12342 6920 2858 \r\n3 312 12341 12342 2858 \r\n3 3740 6920 12341 2858 \r\n3 1918 12344 12343 2859 \r\n3 1694 5633 12344 2859 \r\n3 1313 12343 5633 2859 \r\n3 3636 12347 12346 2860 \r\n3 1908 12345 12347 2860 \r\n3 4312 12346 12345 2860 \r\n3 1786 12350 12349 2861 \r\n3 129 12348 12350 2861 \r\n3 2283 12349 12348 2861 \r\n3 2287 11315 10231 2862 \r\n3 2363 9359 11315 2862 \r\n3 235 10231 9359 2862 \r\n3 4648 5324 12352 2863 \r\n3 1947 12351 5324 2863 \r\n3 589 12352 12351 2863 \r\n3 2226 12354 12353 2864 \r\n3 1820 7420 12354 2864 \r\n3 2296 12353 7420 2864 \r\n3 3790 12357 12356 2865 \r\n3 3957 12355 12357 2865 \r\n3 3642 12356 12355 2865 \r\n3 5000 12360 12359 2866 \r\n3 3140 12358 12360 2866 \r\n3 3777 12359 12358 2866 \r\n3 2674 12361 5348 2867 \r\n3 4805 9106 12361 2867 \r\n3 376 5348 9106 2867 \r\n3 3061 10542 12363 2868 \r\n3 508 12362 10542 2868 \r\n3 1592 12363 12362 2868 \r\n3 3290 12366 12365 2869 \r\n3 2641 12364 12366 2869 \r\n3 3465 12365 12364 2869 \r\n3 4065 12368 9258 2870 \r\n3 1087 12367 12368 2870 \r\n3 2944 9258 12367 2870 \r\n3 1512 8971 12370 2871 \r\n3 437 12369 8971 2871 \r\n3 1134 12370 12369 2871 \r\n3 2166 12373 12372 2872 \r\n3 1464 12371 12373 2872 \r\n3 637 12372 12371 2872 \r\n3 3604 12376 12375 2873 \r\n3 2415 12374 12376 2873 \r\n3 2722 12375 12374 2873 \r\n3 2052 11715 12378 2874 \r\n3 4538 12377 11715 2874 \r\n3 2040 12378 12377 2874 \r\n3 650 12380 12379 2875 \r\n3 3391 9220 12380 2875 \r\n3 3157 12379 9220 2875 \r\n3 3196 12382 6756 2876 \r\n3 2180 12381 12382 2876 \r\n3 3375 6756 12381 2876 \r\n3 4800 11790 12383 2877 \r\n3 467 6673 11790 2877 \r\n3 3552 12383 6673 2877 \r\n3 3317 12386 12385 2878 \r\n3 2538 12384 12386 2878 \r\n3 4905 12385 12384 2878 \r\n3 3822 12388 7860 2879 \r\n3 3075 12387 12388 2879 \r\n3 960 7860 12387 2879 \r\n3 2479 12390 12389 2880 \r\n3 3788 10487 12390 2880 \r\n3 887 12389 10487 2880 \r\n3 775 12392 12391 2881 \r\n3 3752 10038 12392 2881 \r\n3 3046 12391 10038 2881 \r\n3 4734 12393 5011 2882 \r\n3 3643 9722 12393 2882 \r\n3 2082 5011 9722 2882 \r\n3 518 12395 12394 2883 \r\n3 1565 11711 12395 2883 \r\n3 3998 12394 11711 2883 \r\n3 1989 12396 6534 2884 \r\n3 1906 5197 12396 2884 \r\n3 1256 6534 5197 2884 \r\n3 707 12398 12397 2885 \r\n3 2866 9288 12398 2885 \r\n3 1077 12397 9288 2885 \r\n3 4470 12400 5604 2886 \r\n3 3828 12399 12400 2886 \r\n3 1668 5604 12399 2886 \r\n3 4914 12056 12401 2887 \r\n3 171 8912 12056 2887 \r\n3 399 12401 8912 2887 \r\n3 4211 12404 12403 2888 \r\n3 1036 12402 12404 2888 \r\n3 4958 12403 12402 2888 \r\n3 3937 11764 5391 2889 \r\n3 4799 11678 11764 2889 \r\n3 3106 5391 11678 2889 \r\n3 4898 12406 12405 2890 \r\n3 4296 8446 12406 2890 \r\n3 2494 12405 8446 2890 \r\n3 4019 12408 5734 2891 \r\n3 3633 12407 12408 2891 \r\n3 4298 5734 12407 2891 \r\n3 49 11265 12410 2892 \r\n3 663 12409 11265 2892 \r\n3 1642 12410 12409 2892 \r\n3 1433 6562 12411 2893 \r\n3 859 8331 6562 2893 \r\n3 4614 12411 8331 2893 \r\n3 1748 8209 12413 2894 \r\n3 3708 12412 8209 2894 \r\n3 2095 12413 12412 2894 \r\n3 307 12416 12415 2895 \r\n3 1453 12414 12416 2895 \r\n3 308 12415 12414 2895 \r\n3 4464 12419 12418 2896 \r\n3 3748 12417 12419 2896 \r\n3 4094 12418 12417 2896 \r\n3 1109 12422 12421 2897 \r\n3 2128 12420 12422 2897 \r\n3 3900 12421 12420 2897 \r\n3 1297 12425 12424 2898 \r\n3 2565 12423 12425 2898 \r\n3 531 12424 12423 2898 \r\n3 1044 12428 12427 2899 \r\n3 3016 12426 12428 2899 \r\n3 1934 12427 12426 2899 \r\n3 3587 12430 11637 2900 \r\n3 4943 12429 12430 2900 \r\n3 2268 11637 12429 2900 \r\n3 4200 12432 11629 2901 \r\n3 740 12431 12432 2901 \r\n3 4007 11629 12431 2901 \r\n3 3685 12433 8208 2902 \r\n3 557 11305 12433 2902 \r\n3 2783 8208 11305 2902 \r\n3 4234 12436 12435 2903 \r\n3 2499 12434 12436 2903 \r\n3 3967 12435 12434 2903 \r\n3 2440 9856 12437 2904 \r\n3 2040 12377 9856 2904 \r\n3 4538 12437 12377 2904 \r\n3 1646 9524 12439 2905 \r\n3 4819 12438 9524 2905 \r\n3 4499 12439 12438 2905 \r\n3 1032 12441 12440 2906 \r\n3 617 10179 12441 2906 \r\n3 3154 12440 10179 2906 \r\n3 2404 9071 12443 2907 \r\n3 4990 12442 9071 2907 \r\n3 3498 12443 12442 2907 \r\n3 3432 12445 11092 2908 \r\n3 1346 12444 12445 2908 \r\n3 344 11092 12444 2908 \r\n3 4166 12448 12447 2909 \r\n3 655 12446 12448 2909 \r\n3 4662 12447 12446 2909 \r\n3 4002 12451 12450 2910 \r\n3 1397 12449 12451 2910 \r\n3 1094 12450 12449 2910 \r\n3 1532 12454 12453 2911 \r\n3 4537 12452 12454 2911 \r\n3 4595 12453 12452 2911 \r\n3 2648 12257 12456 2912 \r\n3 2892 12455 12257 2912 \r\n3 4050 12456 12455 2912 \r\n3 4908 12458 12457 2913 \r\n3 2581 10739 12458 2913 \r\n3 1786 12457 10739 2913 \r\n3 4138 12460 8839 2914 \r\n3 2076 12459 12460 2914 \r\n3 2852 8839 12459 2914 \r\n3 4549 12462 12461 2915 \r\n3 4245 10780 12462 2915 \r\n3 2835 12461 10780 2915 \r\n3 4413 11418 12464 2916 \r\n3 692 12463 11418 2916 \r\n3 4759 12464 12463 2916 \r\n3 594 12466 12465 2917 \r\n3 1226 8842 12466 2917 \r\n3 4607 12465 8842 2917 \r\n3 735 8344 12467 2918 \r\n3 1085 7522 8344 2918 \r\n3 604 12467 7522 2918 \r\n3 3915 12469 5544 2919 \r\n3 1029 12468 12469 2919 \r\n3 125 5544 12468 2919 \r\n3 3782 6553 12470 2920 \r\n3 437 8970 6553 2920 \r\n3 2058 12470 8970 2920 \r\n3 2289 12472 5190 2921 \r\n3 2788 12471 12472 2921 \r\n3 758 5190 12471 2921 \r\n3 1093 12474 11450 2922 \r\n3 1923 12473 12474 2922 \r\n3 4703 11450 12473 2922 \r\n3 1973 12476 8168 2923 \r\n3 85 12475 12476 2923 \r\n3 2599 8168 12475 2923 \r\n3 2057 12478 12477 2924 \r\n3 2787 6663 12478 2924 \r\n3 1818 12477 6663 2924 \r\n3 475 5437 12479 2925 \r\n3 4245 8223 5437 2925 \r\n3 1511 12479 8223 2925 \r\n3 3470 12482 12481 2926 \r\n3 10 12480 12482 2926 \r\n3 4095 12481 12480 2926 \r\n3 3085 12485 12484 2927 \r\n3 571 12483 12485 2927 \r\n3 4461 12484 12483 2927 \r\n3 2171 12488 12487 2928 \r\n3 1083 12486 12488 2928 \r\n3 3353 12487 12486 2928 \r\n3 972 5662 11135 2929 \r\n3 3729 12489 5662 2929 \r\n3 4140 11135 12489 2929 \r\n3 4472 12491 12490 2930 \r\n3 340 11899 12491 2930 \r\n3 1138 12490 11899 2930 \r\n3 1469 12494 12493 2931 \r\n3 939 12492 12494 2931 \r\n3 4067 12493 12492 2931 \r\n3 3295 12497 12496 2932 \r\n3 1088 12495 12497 2932 \r\n3 679 12496 12495 2932 \r\n3 2483 11062 12499 2933 \r\n3 848 12498 11062 2933 \r\n3 4882 12499 12498 2933 \r\n3 3238 12231 12500 2934 \r\n3 531 12423 12231 2934 \r\n3 2565 12500 12423 2934 \r\n3 2536 12501 7934 2935 \r\n3 2760 8316 12501 2935 \r\n3 4965 7934 8316 2935 \r\n3 2006 12502 11611 2936 \r\n3 1595 10546 12502 2936 \r\n3 4491 11611 10546 2936 \r\n3 1576 12505 12504 2937 \r\n3 2345 12503 12505 2937 \r\n3 4842 12504 12503 2937 \r\n3 3840 12508 12507 2938 \r\n3 4832 12506 12508 2938 \r\n3 1387 12507 12506 2938 \r\n3 938 12511 12510 2939 \r\n3 426 12509 12511 2939 \r\n3 4506 12510 12509 2939 \r\n3 1825 9989 12512 2940 \r\n3 3158 11862 9989 2940 \r\n3 4979 12512 11862 2940 \r\n3 2978 12513 5990 2941 \r\n3 1070 12316 12513 2941 \r\n3 1181 5990 12316 2941 \r\n3 4548 5827 12515 2942 \r\n3 4202 12514 5827 2942 \r\n3 4906 12515 12514 2942 \r\n3 4217 12518 12517 2943 \r\n3 553 12516 12518 2943 \r\n3 1007 12517 12516 2943 \r\n3 4139 6687 8748 2944 \r\n3 1070 12513 6687 2944 \r\n3 2978 8748 12513 2944 \r\n3 366 12521 12520 2945 \r\n3 4902 12519 12521 2945 \r\n3 487 12520 12519 2945 \r\n3 3318 7281 9848 2946 \r\n3 3114 12522 7281 2946 \r\n3 697 9848 12522 2946 \r\n3 2450 12525 12524 2947 \r\n3 4439 12523 12525 2947 \r\n3 4474 12524 12523 2947 \r\n3 2171 10586 12527 2948 \r\n3 548 12526 10586 2948 \r\n3 415 12527 12526 2948 \r\n3 522 12529 12528 2949 \r\n3 4513 8773 12529 2949 \r\n3 571 12528 8773 2949 \r\n3 3473 9618 12531 2950 \r\n3 4155 12530 9618 2950 \r\n3 2250 12531 12530 2950 \r\n3 4764 10988 12533 2951 \r\n3 442 12532 10988 2951 \r\n3 1003 12533 12532 2951 \r\n3 1272 12535 10785 2952 \r\n3 299 12534 12535 2952 \r\n3 1465 10785 12534 2952 \r\n3 4544 6175 12537 2953 \r\n3 4301 12536 6175 2953 \r\n3 4927 12537 12536 2953 \r\n3 1739 12539 12538 2954 \r\n3 3722 5192 12539 2954 \r\n3 2554 12538 5192 2954 \r\n3 3647 12541 6383 2955 \r\n3 1665 12540 12541 2955 \r\n3 3078 6383 12540 2955 \r\n3 3857 12542 10421 2956 \r\n3 3220 11247 12542 2956 \r\n3 862 10421 11247 2956 \r\n3 2128 12545 12544 2957 \r\n3 1743 12543 12545 2957 \r\n3 2354 12544 12543 2957 \r\n3 314 12547 12546 2958 \r\n3 696 11530 12547 2958 \r\n3 3496 12546 11530 2958 \r\n3 4439 8186 12523 2959 \r\n3 3327 12548 8186 2959 \r\n3 4474 12523 12548 2959 \r\n3 4010 12551 12550 2960 \r\n3 2973 12549 12551 2960 \r\n3 2631 12550 12549 2960 \r\n3 1302 12026 7997 2961 \r\n3 49 12410 12026 2961 \r\n3 1642 7997 12410 2961 \r\n3 861 12553 5929 2962 \r\n3 1910 12552 12553 2962 \r\n3 1316 5929 12552 2962 \r\n3 367 12555 10475 2963 \r\n3 486 12554 12555 2963 \r\n3 2209 10475 12554 2963 \r\n3 2146 12558 12557 2964 \r\n3 386 12556 12558 2964 \r\n3 874 12557 12556 2964 \r\n3 4565 12561 12560 2965 \r\n3 2810 12559 12561 2965 \r\n3 526 12560 12559 2965 \r\n3 967 12563 7637 2966 \r\n3 2447 12562 12563 2966 \r\n3 1116 7637 12562 2966 \r\n3 699 12565 12564 2967 \r\n3 2823 12229 12565 2967 \r\n3 1925 12564 12229 2967 \r\n3 3129 9930 12567 2968 \r\n3 4362 12566 9930 2968 \r\n3 3541 12567 12566 2968 \r\n3 4748 5429 12569 2969 \r\n3 2816 12568 5429 2969 \r\n3 1132 12569 12568 2969 \r\n3 2412 12572 12571 2970 \r\n3 2500 12570 12572 2970 \r\n3 4368 12571 12570 2970 \r\n3 4188 7007 8413 2971 \r\n3 3210 10603 7007 2971 \r\n3 70 8413 10603 2971 \r\n3 2991 12575 12574 2972 \r\n3 4432 12573 12575 2972 \r\n3 2582 12574 12573 2972 \r\n3 4295 12577 11808 2973 \r\n3 884 12576 12577 2973 \r\n3 718 11808 12576 2973 \r\n3 508 12578 12362 2974 \r\n3 2878 7442 12578 2974 \r\n3 1592 12362 7442 2974 \r\n3 3016 12581 12580 2975 \r\n3 4069 12579 12581 2975 \r\n3 936 12580 12579 2975 \r\n3 4559 12584 12583 2976 \r\n3 2660 12582 12584 2976 \r\n3 589 12583 12582 2976 \r\n3 3579 12587 12586 2977 \r\n3 2470 12585 12587 2977 \r\n3 4982 12586 12585 2977 \r\n3 2770 12589 12588 2978 \r\n3 669 10418 12589 2978 \r\n3 4182 12588 10418 2978 \r\n3 3611 5526 11005 2979 \r\n3 3925 12590 5526 2979 \r\n3 4560 11005 12590 2979 \r\n3 4598 12593 12592 2980 \r\n3 1582 12591 12593 2980 \r\n3 3897 12592 12591 2980 \r\n3 2319 11387 12595 2981 \r\n3 322 12594 11387 2981 \r\n3 3780 12595 12594 2981 \r\n3 458 7434 8128 2982 \r\n3 3526 12596 7434 2982 \r\n3 3205 8128 12596 2982 \r\n3 2340 12599 12598 2983 \r\n3 4338 12597 12599 2983 \r\n3 3489 12598 12597 2983 \r\n3 3900 6051 12421 2984 \r\n3 1325 12600 6051 2984 \r\n3 1109 12421 12600 2984 \r\n3 409 12603 12602 2985 \r\n3 783 12601 12603 2985 \r\n3 2546 12602 12601 2985 \r\n3 3425 12606 12605 2986 \r\n3 3521 12604 12606 2986 \r\n3 22 12605 12604 2986 \r\n3 2 12609 12608 2987 \r\n3 3735 12607 12609 2987 \r\n3 1795 12608 12607 2987 \r\n3 205 9366 12610 2988 \r\n3 4307 8791 9366 2988 \r\n3 373 12610 8791 2988 \r\n3 1165 12613 12612 2989 \r\n3 1098 12611 12613 2989 \r\n3 4101 12612 12611 2989 \r\n3 2420 12616 12615 2990 \r\n3 2524 12614 12616 2990 \r\n3 3544 12615 12614 2990 \r\n3 94 8652 11270 2991 \r\n3 41 12617 8652 2991 \r\n3 3881 11270 12617 2991 \r\n3 962 12619 12618 2992 \r\n3 716 10190 12619 2992 \r\n3 2927 12618 10190 2992 \r\n3 1983 12621 9622 2993 \r\n3 1290 12620 12621 2993 \r\n3 2039 9622 12620 2993 \r\n3 3095 10572 12623 2994 \r\n3 450 12622 10572 2994 \r\n3 3035 12623 12622 2994 \r\n3 4666 12626 12625 2995 \r\n3 176 12624 12626 2995 \r\n3 4756 12625 12624 2995 \r\n3 1077 12629 12628 2996 \r\n3 3702 12627 12629 2996 \r\n3 4618 12628 12627 2996 \r\n3 1023 12632 12631 2997 \r\n3 3125 12630 12632 2997 \r\n3 2259 12631 12630 2997 \r\n3 3121 12635 12634 2998 \r\n3 3879 12633 12635 2998 \r\n3 3569 12634 12633 2998 \r\n3 2019 7948 12637 2999 \r\n3 3605 12636 7948 2999 \r\n3 2771 12637 12636 2999 \r\n3 3045 12639 11734 3000 \r\n3 4027 12638 12639 3000 \r\n3 1428 11734 12638 3000 \r\n3 2670 12641 12640 3001 \r\n3 2755 10724 12641 3001 \r\n3 3538 12640 10724 3001 \r\n3 997 12642 12262 3002 \r\n3 1104 10628 12642 3002 \r\n3 3427 12262 10628 3002 \r\n3 3721 9076 6382 3003 \r\n3 740 12432 9076 3003 \r\n3 4200 6382 12432 3003 \r\n3 2780 12643 9024 3004 \r\n3 3691 8043 12643 3004 \r\n3 2872 9024 8043 3004 \r\n3 317 12646 12645 3005 \r\n3 1898 12644 12646 3005 \r\n3 4603 12645 12644 3005 \r\n3 3649 12649 12648 3006 \r\n3 4095 12647 12649 3006 \r\n3 326 12648 12647 3006 \r\n3 4478 12652 12651 3007 \r\n3 3287 12650 12652 3007 \r\n3 2629 12651 12650 3007 \r\n3 4771 5406 8768 3008 \r\n3 2532 5397 5406 3008 \r\n3 2602 8768 5397 3008 \r\n3 4443 12654 12653 3009 \r\n3 412 7924 12654 3009 \r\n3 360 12653 7924 3009 \r\n3 4154 12655 9394 3010 \r\n3 1328 10176 12655 3010 \r\n3 989 9394 10176 3010 \r\n3 1798 12658 12657 3011 \r\n3 4700 12656 12658 3011 \r\n3 658 12657 12656 3011 \r\n3 912 10381 6109 3012 \r\n3 2375 12659 10381 3012 \r\n3 3251 6109 12659 3012 \r\n3 4634 9576 12661 3013 \r\n3 143 12660 9576 3013 \r\n3 4250 12661 12660 3013 \r\n3 4789 12663 12662 3014 \r\n3 2341 7917 12663 3014 \r\n3 4133 12662 7917 3014 \r\n3 1253 12666 12665 3015 \r\n3 1232 12664 12666 3015 \r\n3 1236 12665 12664 3015 \r\n3 2078 5141 12667 3016 \r\n3 2118 8213 5141 3016 \r\n3 1447 12667 8213 3016 \r\n3 1899 12670 12669 3017 \r\n3 1875 12668 12670 3017 \r\n3 2980 12669 12668 3017 \r\n3 3514 12672 9390 3018 \r\n3 1216 12671 12672 3018 \r\n3 809 9390 12671 3018 \r\n3 2505 12675 12674 3019 \r\n3 2486 12673 12675 3019 \r\n3 169 12674 12673 3019 \r\n3 4891 12678 12677 3020 \r\n3 4863 12676 12678 3020 \r\n3 2261 12677 12676 3020 \r\n3 2596 5354 12680 3021 \r\n3 4827 12679 5354 3021 \r\n3 4914 12680 12679 3021 \r\n3 1649 12683 12682 3022 \r\n3 3589 12681 12683 3022 \r\n3 1112 12682 12681 3022 \r\n3 40 12686 12685 3023 \r\n3 3260 12684 12686 3023 \r\n3 3953 12685 12684 3023 \r\n3 4514 8440 7368 3024 \r\n3 1954 6126 8440 3024 \r\n3 1593 7368 6126 3024 \r\n3 2122 6115 12688 3025 \r\n3 1761 12687 6115 3025 \r\n3 4587 12688 12687 3025 \r\n3 2136 12691 12690 3026 \r\n3 2067 12689 12691 3026 \r\n3 3608 12690 12689 3026 \r\n3 3236 12694 12693 3027 \r\n3 4880 12692 12694 3027 \r\n3 4290 12693 12692 3027 \r\n3 4119 9308 12695 3028 \r\n3 3172 10327 9308 3028 \r\n3 3777 12695 10327 3028 \r\n3 1763 12697 6023 3029 \r\n3 958 12696 12697 3029 \r\n3 169 6023 12696 3029 \r\n3 140 12700 12699 3030 \r\n3 1985 12698 12700 3030 \r\n3 4512 12699 12698 3030 \r\n3 514 12199 12702 3031 \r\n3 3850 12701 12199 3031 \r\n3 2139 12702 12701 3031 \r\n3 2238 12704 12703 3032 \r\n3 2827 10777 12704 3032 \r\n3 257 12703 10777 3032 \r\n3 1832 12707 12706 3033 \r\n3 2539 12705 12707 3033 \r\n3 4135 12706 12705 3033 \r\n3 60 12709 8459 3034 \r\n3 1431 12708 12709 3034 \r\n3 866 8459 12708 3034 \r\n3 428 12712 12711 3035 \r\n3 2561 12710 12712 3035 \r\n3 1375 12711 12710 3035 \r\n3 1769 12713 9919 3036 \r\n3 3716 8960 12713 3036 \r\n3 4993 9919 8960 3036 \r\n3 1827 5084 6750 3037 \r\n3 3231 12714 5084 3037 \r\n3 4556 6750 12714 3037 \r\n3 4562 11561 12716 3038 \r\n3 3127 12715 11561 3038 \r\n3 2529 12716 12715 3038 \r\n3 2144 12718 12717 3039 \r\n3 2357 11635 12718 3039 \r\n3 1261 12717 11635 3039 \r\n3 1360 11587 12720 3040 \r\n3 30 12719 11587 3040 \r\n3 2829 12720 12719 3040 \r\n3 4078 12722 8034 3041 \r\n3 2407 12721 12722 3041 \r\n3 4568 8034 12721 3041 \r\n3 2556 12724 10575 3042 \r\n3 808 12723 12724 3042 \r\n3 3144 10575 12723 3042 \r\n3 4090 12726 12725 3043 \r\n3 4852 8314 12726 3043 \r\n3 3500 12725 8314 3043 \r\n3 3607 12729 12728 3044 \r\n3 1178 12727 12729 3044 \r\n3 3636 12728 12727 3044 \r\n3 505 6268 12731 3045 \r\n3 2525 12730 6268 3045 \r\n3 4104 12731 12730 3045 \r\n3 3320 12734 12733 3046 \r\n3 4222 12732 12734 3046 \r\n3 742 12733 12732 3046 \r\n3 1387 12506 12736 3047 \r\n3 4832 12735 12506 3047 \r\n3 4723 12736 12735 3047 \r\n3 2861 12738 8204 3048 \r\n3 536 12737 12738 3048 \r\n3 1746 8204 12737 3048 \r\n3 1382 12740 12739 3049 \r\n3 4896 8493 12740 3049 \r\n3 2091 12739 8493 3049 \r\n3 4180 8923 12742 3050 \r\n3 143 12741 8923 3050 \r\n3 4957 12742 12741 3050 \r\n3 1066 7979 12744 3051 \r\n3 4487 12743 7979 3051 \r\n3 2898 12744 12743 3051 \r\n3 3808 9965 12746 3052 \r\n3 241 12745 9965 3052 \r\n3 2164 12746 12745 3052 \r\n3 1611 12749 12748 3053 \r\n3 1691 12747 12749 3053 \r\n3 1156 12748 12747 3053 \r\n3 2174 10998 10529 3054 \r\n3 1075 12750 10998 3054 \r\n3 883 10529 12750 3054 \r\n3 3182 12752 12751 3055 \r\n3 919 8582 12752 3055 \r\n3 130 12751 8582 3055 \r\n3 1151 10008 12754 3056 \r\n3 1425 12753 10008 3056 \r\n3 1228 12754 12753 3056 \r\n3 3333 10192 12756 3057 \r\n3 521 12755 10192 3057 \r\n3 1944 12756 12755 3057 \r\n3 4451 12759 12758 3058 \r\n3 338 12757 12759 3058 \r\n3 3831 12758 12757 3058 \r\n3 320 12762 12761 3059 \r\n3 759 12760 12762 3059 \r\n3 1727 12761 12760 3059 \r\n3 2209 12764 11207 3060 \r\n3 3742 12763 12764 3060 \r\n3 547 11207 12763 3060 \r\n3 61 12766 12765 3061 \r\n3 1722 9631 12766 3061 \r\n3 1311 12765 9631 3061 \r\n3 2966 12769 12768 3062 \r\n3 3232 12767 12769 3062 \r\n3 1917 12768 12767 3062 \r\n3 3791 5831 12771 3063 \r\n3 1283 12770 5831 3063 \r\n3 4688 12771 12770 3063 \r\n3 1774 12773 9361 3064 \r\n3 4935 12772 12773 3064 \r\n3 235 9361 12772 3064 \r\n3 1823 12774 7340 3065 \r\n3 1597 10438 12774 3065 \r\n3 3677 7340 10438 3065 \r\n3 527 12776 6391 3066 \r\n3 2587 12775 12776 3066 \r\n3 4405 6391 12775 3066 \r\n3 2185 12779 12778 3067 \r\n3 72 12777 12779 3067 \r\n3 3242 12778 12777 3067 \r\n3 334 11995 10682 3068 \r\n3 1267 12780 11995 3068 \r\n3 2389 10682 12780 3068 \r\n3 4123 12783 12782 3069 \r\n3 2976 12781 12783 3069 \r\n3 3050 12782 12781 3069 \r\n3 2027 12785 12053 3070 \r\n3 4456 12784 12785 3070 \r\n3 3513 12053 12784 3070 \r\n3 1329 12786 5702 3071 \r\n3 2196 11771 12786 3071 \r\n3 3397 5702 11771 3071 \r\n3 678 12789 12788 3072 \r\n3 517 12787 12789 3072 \r\n3 2745 12788 12787 3072 \r\n3 963 12792 12791 3073 \r\n3 4878 12790 12792 3073 \r\n3 1002 12791 12790 3073 \r\n3 343 12795 12794 3074 \r\n3 1598 12793 12795 3074 \r\n3 1147 12794 12793 3074 \r\n3 2834 12797 8834 3075 \r\n3 886 12796 12797 3075 \r\n3 3932 8834 12796 3075 \r\n3 4774 12799 12798 3076 \r\n3 4689 11111 12799 3076 \r\n3 4257 12798 11111 3076 \r\n3 4410 12802 12801 3077 \r\n3 2909 12800 12802 3077 \r\n3 2388 12801 12800 3077 \r\n3 2259 11922 12631 3078 \r\n3 4198 12803 11922 3078 \r\n3 1023 12631 12803 3078 \r\n3 3920 8619 12804 3079 \r\n3 1898 12646 8619 3079 \r\n3 317 12804 12646 3079 \r\n3 792 12807 12806 3080 \r\n3 3850 12805 12807 3080 \r\n3 2402 12806 12805 3080 \r\n3 1072 8780 10902 3081 \r\n3 1625 12808 8780 3081 \r\n3 4903 10902 12808 3081 \r\n3 4620 8264 6588 3082 \r\n3 1332 12809 8264 3082 \r\n3 3447 6588 12809 3082 \r\n3 2121 12811 12810 3083 \r\n3 513 8978 12811 3083 \r\n3 2922 12810 8978 3083 \r\n3 4028 12814 12813 3084 \r\n3 184 12812 12814 3084 \r\n3 190 12813 12812 3084 \r\n3 1454 12816 12815 3085 \r\n3 3837 8418 12816 3085 \r\n3 1508 12815 8418 3085 \r\n3 3176 12818 6981 3086 \r\n3 2642 12817 12818 3086 \r\n3 649 6981 12817 3086 \r\n3 4457 12821 12820 3087 \r\n3 2856 12819 12821 3087 \r\n3 1890 12820 12819 3087 \r\n3 350 12824 12823 3088 \r\n3 1101 12822 12824 3088 \r\n3 1545 12823 12822 3088 \r\n3 1950 12827 12826 3089 \r\n3 1243 12825 12827 3089 \r\n3 2962 12826 12825 3089 \r\n3 4907 12830 12829 3090 \r\n3 574 12828 12830 3090 \r\n3 1091 12829 12828 3090 \r\n3 948 12833 12832 3091 \r\n3 3374 12831 12833 3091 \r\n3 894 12832 12831 3091 \r\n3 2022 12835 12834 3092 \r\n3 866 12708 12835 3092 \r\n3 1431 12834 12708 3092 \r\n3 4510 12838 12837 3093 \r\n3 1231 12836 12838 3093 \r\n3 1158 12837 12836 3093 \r\n3 729 12841 12840 3094 \r\n3 162 12839 12841 3094 \r\n3 411 12840 12839 3094 \r\n3 3452 12842 11640 3095 \r\n3 430 10254 12842 3095 \r\n3 3819 11640 10254 3095 \r\n3 1068 12845 12844 3096 \r\n3 1269 12843 12845 3096 \r\n3 4459 12844 12843 3096 \r\n3 1864 9557 10867 3097 \r\n3 3021 12846 9557 3097 \r\n3 2293 10867 12846 3097 \r\n3 1421 6348 12848 3098 \r\n3 4809 12847 6348 3098 \r\n3 2608 12848 12847 3098 \r\n3 843 12850 12849 3099 \r\n3 4916 11401 12850 3099 \r\n3 1896 12849 11401 3099 \r\n3 4421 12852 6217 3100 \r\n3 3983 12851 12852 3100 \r\n3 3532 6217 12851 3100 \r\n3 1038 12854 12853 3101 \r\n3 305 5175 12854 3101 \r\n3 4677 12853 5175 3101 \r\n3 1250 12857 12856 3102 \r\n3 988 12855 12857 3102 \r\n3 2864 12856 12855 3102 \r\n3 600 7506 12859 3103 \r\n3 4068 12858 7506 3103 \r\n3 4829 12859 12858 3103 \r\n3 4897 11431 12861 3104 \r\n3 4780 12860 11431 3104 \r\n3 3846 12861 12860 3104 \r\n3 3658 12863 12862 3105 \r\n3 960 12387 12863 3105 \r\n3 3075 12862 12387 3105 \r\n3 4642 12865 12864 3106 \r\n3 4353 11949 12865 3106 \r\n3 4778 12864 11949 3106 \r\n3 1623 12867 12866 3107 \r\n3 1294 11021 12867 3107 \r\n3 3491 12866 11021 3107 \r\n3 4192 9935 12869 3108 \r\n3 2871 12868 9935 3108 \r\n3 2633 12869 12868 3108 \r\n3 2300 12870 10079 3109 \r\n3 3032 11708 12870 3109 \r\n3 3651 10079 11708 3109 \r\n3 1148 12873 12872 3110 \r\n3 3393 12871 12873 3110 \r\n3 2937 12872 12871 3110 \r\n3 4812 12876 12875 3111 \r\n3 3400 12874 12876 3111 \r\n3 957 12875 12874 3111 \r\n3 4281 6133 12877 3112 \r\n3 4374 11244 6133 3112 \r\n3 4460 12877 11244 3112 \r\n3 997 12261 12878 3113 \r\n3 317 12645 12261 3113 \r\n3 4603 12878 12645 3113 \r\n3 4871 12880 12879 3114 \r\n3 2315 10186 12880 3114 \r\n3 3874 12879 10186 3114 \r\n3 4103 5746 12882 3115 \r\n3 3674 12881 5746 3115 \r\n3 15 12882 12881 3115 \r\n3 160 10260 12884 3116 \r\n3 1585 12883 10260 3116 \r\n3 3178 12884 12883 3116 \r\n3 50 12887 12886 3117 \r\n3 1196 12885 12887 3117 \r\n3 4525 12886 12885 3117 \r\n3 714 12890 12889 3118 \r\n3 890 12888 12890 3118 \r\n3 4150 12889 12888 3118 \r\n3 4923 12893 12892 3119 \r\n3 3470 12891 12893 3119 \r\n3 3649 12892 12891 3119 \r\n3 2549 11860 11503 3120 \r\n3 1506 12894 11860 3120 \r\n3 4399 11503 12894 3120 \r\n3 3475 12896 12895 3121 \r\n3 240 9095 12896 3121 \r\n3 851 12895 9095 3121 \r\n3 1969 12899 12898 3122 \r\n3 3935 12897 12899 3122 \r\n3 1106 12898 12897 3122 \r\n3 4890 12902 12901 3123 \r\n3 1914 12900 12902 3123 \r\n3 3684 12901 12900 3123 \r\n3 4505 9584 12904 3124 \r\n3 4857 12903 9584 3124 \r\n3 3440 12904 12903 3124 \r\n3 2065 12907 12906 3125 \r\n3 2243 12905 12907 3125 \r\n3 4338 12906 12905 3125 \r\n3 1575 12910 12909 3126 \r\n3 1780 12908 12910 3126 \r\n3 345 12909 12908 3126 \r\n3 4252 6603 12912 3127 \r\n3 3969 12911 6603 3127 \r\n3 3244 12912 12911 3127 \r\n3 2608 12913 12848 3128 \r\n3 1894 8564 12913 3128 \r\n3 1421 12848 8564 3128 \r\n3 968 12916 12915 3129 \r\n3 2402 12914 12916 3129 \r\n3 4575 12915 12914 3129 \r\n3 1781 10342 12918 3130 \r\n3 2433 12917 10342 3130 \r\n3 107 12918 12917 3130 \r\n3 86 10467 12920 3131 \r\n3 408 12919 10467 3131 \r\n3 4132 12920 12919 3131 \r\n3 2903 10198 12922 3132 \r\n3 1055 12921 10198 3132 \r\n3 4321 12922 12921 3132 \r\n3 2466 12925 12924 3133 \r\n3 821 12923 12925 3133 \r\n3 2446 12924 12923 3133 \r\n3 1283 6031 12770 3134 \r\n3 4369 12926 6031 3134 \r\n3 4688 12770 12926 3134 \r\n3 666 12928 8769 3135 \r\n3 1166 12927 12928 3135 \r\n3 2975 8769 12927 3135 \r\n3 1724 12931 12930 3136 \r\n3 4181 12929 12931 3136 \r\n3 4824 12930 12929 3136 \r\n3 180 10526 9547 3137 \r\n3 1483 11456 10526 3137 \r\n3 1840 9547 11456 3137 \r\n3 766 12934 12933 3138 \r\n3 3506 12932 12934 3138 \r\n3 1112 12933 12932 3138 \r\n3 4839 11109 12936 3139 \r\n3 2711 12935 11109 3139 \r\n3 379 12936 12935 3139 \r\n3 4388 12182 10003 3140 \r\n3 4448 9605 12182 3140 \r\n3 101 10003 9605 3140 \r\n3 3376 12938 7201 3141 \r\n3 2476 12937 12938 3141 \r\n3 2163 7201 12937 3141 \r\n3 4452 12940 12939 3142 \r\n3 4587 12687 12940 3142 \r\n3 1761 12939 12687 3142 \r\n3 4976 12941 9867 3143 \r\n3 1638 8135 12941 3143 \r\n3 2534 9867 8135 3143 \r\n3 1936 12943 5412 3144 \r\n3 2376 12942 12943 3144 \r\n3 292 5412 12942 3144 \r\n3 2792 12945 12944 3145 \r\n3 820 10130 12945 3145 \r\n3 357 12944 10130 3145 \r\n3 904 9395 12947 3146 \r\n3 4837 12946 9395 3146 \r\n3 3404 12947 12946 3146 \r\n3 4164 12950 12949 3147 \r\n3 4849 12948 12950 3147 \r\n3 2703 12949 12948 3147 \r\n3 2642 12952 9030 3148 \r\n3 3083 12951 12952 3148 \r\n3 1179 9030 12951 3148 \r\n3 1653 12954 12953 3149 \r\n3 1106 12897 12954 3149 \r\n3 3935 12953 12897 3149 \r\n3 3271 12957 12956 3150 \r\n3 3833 12955 12957 3150 \r\n3 133 12956 12955 3150 \r\n3 1664 12959 12958 3151 \r\n3 3210 5308 12959 3151 \r\n3 111 12958 5308 3151 \r\n3 4975 6185 12961 3152 \r\n3 1387 12960 6185 3152 \r\n3 4427 12961 12960 3152 \r\n3 99 11158 12963 3153 \r\n3 996 12962 11158 3153 \r\n3 2413 12963 12962 3153 \r\n3 799 8501 12965 3154 \r\n3 947 12964 8501 3154 \r\n3 3730 12965 12964 3154 \r\n3 4208 12968 12967 3155 \r\n3 1244 12966 12968 3155 \r\n3 1413 12967 12966 3155 \r\n3 2049 12971 12970 3156 \r\n3 2158 12969 12971 3156 \r\n3 3295 12970 12969 3156 \r\n3 138 11668 9177 3157 \r\n3 1373 12972 11668 3157 \r\n3 1617 9177 12972 3157 \r\n3 978 12974 12973 3158 \r\n3 596 8719 12974 3158 \r\n3 1852 12973 8719 3158 \r\n3 1577 12975 8893 3159 \r\n3 2802 11652 12975 3159 \r\n3 1838 8893 11652 3159 \r\n3 2437 7795 12976 3160 \r\n3 2578 11478 7795 3160 \r\n3 3319 12976 11478 3160 \r\n3 1354 8123 5758 3161 \r\n3 1648 12977 8123 3161 \r\n3 980 5758 12977 3161 \r\n3 855 12979 12978 3162 \r\n3 11 11972 12979 3162 \r\n3 4247 12978 11972 3162 \r\n3 1247 12982 12981 3163 \r\n3 2863 12980 12982 3163 \r\n3 3398 12981 12980 3163 \r\n3 86 12984 12983 3164 \r\n3 2240 9282 12984 3164 \r\n3 2516 12983 9282 3164 \r\n3 1467 12987 12986 3165 \r\n3 2792 12985 12987 3165 \r\n3 1183 12986 12985 3165 \r\n3 2596 12680 12989 3166 \r\n3 4914 12988 12680 3166 \r\n3 3477 12989 12988 3166 \r\n3 776 12990 11940 3167 \r\n3 3107 8025 12990 3167 \r\n3 4508 11940 8025 3167 \r\n3 2204 12992 9834 3168 \r\n3 3895 12991 12992 3168 \r\n3 1161 9834 12991 3168 \r\n3 2750 12995 12994 3169 \r\n3 3419 12993 12995 3169 \r\n3 753 12994 12993 3169 \r\n3 4582 12996 5516 3170 \r\n3 3235 6288 12996 3170 \r\n3 4625 5516 6288 3170 \r\n3 4338 12905 12597 3171 \r\n3 2243 12997 12905 3171 \r\n3 3489 12597 12997 3171 \r\n3 242 13000 12999 3172 \r\n3 3087 12998 13000 3172 \r\n3 4366 12999 12998 3172 \r\n3 587 13003 13002 3173 \r\n3 1729 13001 13003 3173 \r\n3 3985 13002 13001 3173 \r\n3 3917 13005 11543 3174 \r\n3 1702 13004 13005 3174 \r\n3 2907 11543 13004 3174 \r\n3 93 13008 13007 3175 \r\n3 2256 13006 13008 3175 \r\n3 4436 13007 13006 3175 \r\n3 664 13011 13010 3176 \r\n3 3061 13009 13011 3176 \r\n3 336 13010 13009 3176 \r\n3 4521 13014 13013 3177 \r\n3 815 13012 13014 3177 \r\n3 2197 13013 13012 3177 \r\n3 3578 13016 8692 3178 \r\n3 2557 13015 13016 3178 \r\n3 4172 8692 13015 3178 \r\n3 4883 13018 13017 3179 \r\n3 4222 12734 13018 3179 \r\n3 3320 13017 12734 3179 \r\n3 3574 13019 9734 3180 \r\n3 876 11415 13019 3180 \r\n3 3047 9734 11415 3180 \r\n3 2340 13021 12599 3181 \r\n3 702 13020 13021 3181 \r\n3 4338 12599 13020 3181 \r\n3 1866 7928 13023 3182 \r\n3 1996 13022 7928 3182 \r\n3 313 13023 13022 3182 \r\n3 1296 8265 13025 3183 \r\n3 4620 13024 8265 3183 \r\n3 1439 13025 13024 3183 \r\n3 1054 7865 13027 3184 \r\n3 1713 13026 7865 3184 \r\n3 2609 13027 13026 3184 \r\n3 2344 13029 13028 3185 \r\n3 2902 8210 13029 3185 \r\n3 1748 13028 8210 3185 \r\n3 4075 13032 13031 3186 \r\n3 2436 13030 13032 3186 \r\n3 3966 13031 13030 3186 \r\n3 4019 13035 13034 3187 \r\n3 3371 13033 13035 3187 \r\n3 3063 13034 13033 3187 \r\n3 313 13037 13036 3188 \r\n3 4881 10154 13037 3188 \r\n3 4157 13036 10154 3188 \r\n3 4834 13039 13038 3189 \r\n3 1774 9360 13039 3189 \r\n3 2363 13038 9360 3189 \r\n3 3094 13042 13041 3190 \r\n3 2622 13040 13042 3190 \r\n3 2531 13041 13040 3190 \r\n3 693 13044 13043 3191 \r\n3 2677 11952 13044 3191 \r\n3 778 13043 11952 3191 \r\n3 2864 13046 13045 3192 \r\n3 4992 5670 13046 3192 \r\n3 1468 13045 5670 3192 \r\n3 4326 13048 13047 3193 \r\n3 1977 6422 13048 3193 \r\n3 378 13047 6422 3193 \r\n3 4565 13051 13050 3194 \r\n3 449 13049 13051 3194 \r\n3 3126 13050 13049 3194 \r\n3 784 8844 6102 3195 \r\n3 4083 13052 8844 3195 \r\n3 3826 6102 13052 3195 \r\n3 2272 13055 13054 3196 \r\n3 2928 13053 13055 3196 \r\n3 1364 13054 13053 3196 \r\n3 1933 9493 13057 3197 \r\n3 2964 13056 9493 3197 \r\n3 4197 13057 13056 3197 \r\n3 1127 13060 13059 3198 \r\n3 4884 13058 13060 3198 \r\n3 1739 13059 13058 3198 \r\n3 1449 13062 13061 3199 \r\n3 2806 11182 13062 3199 \r\n3 3890 13061 11182 3199 \r\n3 3951 7306 13064 3200 \r\n3 3122 13063 7306 3200 \r\n3 1239 13064 13063 3200 \r\n3 3607 12728 13065 3201 \r\n3 3636 12346 12728 3201 \r\n3 4312 13065 12346 3201 \r\n3 3764 13068 13067 3202 \r\n3 3893 13066 13068 3202 \r\n3 2236 13067 13066 3202 \r\n3 725 11276 7476 3203 \r\n3 3628 13069 11276 3203 \r\n3 1708 7476 13069 3203 \r\n3 4416 13071 11044 3204 \r\n3 4755 13070 13071 3204 \r\n3 341 11044 13070 3204 \r\n3 3760 13073 13072 3205 \r\n3 1297 12424 13073 3205 \r\n3 531 13072 12424 3205 \r\n3 2873 13075 13074 3206 \r\n3 4546 6178 13075 3206 \r\n3 1011 13074 6178 3206 \r\n3 2186 13077 13076 3207 \r\n3 3232 12769 13077 3207 \r\n3 2966 13076 12769 3207 \r\n3 4140 13079 10943 3208 \r\n3 1899 13078 13079 3208 \r\n3 2015 10943 13078 3208 \r\n3 275 13082 13081 3209 \r\n3 2738 13080 13082 3209 \r\n3 1799 13081 13080 3209 \r\n3 3665 13084 13083 3210 \r\n3 2995 7720 13084 3210 \r\n3 3814 13083 7720 3210 \r\n3 299 13086 10447 3211 \r\n3 73 13085 13086 3211 \r\n3 4741 10447 13085 3211 \r\n3 4343 6059 7833 3212 \r\n3 3429 13087 6059 3212 \r\n3 2793 7833 13087 3212 \r\n3 671 9421 13089 3213 \r\n3 213 13088 9421 3213 \r\n3 3642 13089 13088 3213 \r\n3 1974 11422 13091 3214 \r\n3 1887 13090 11422 3214 \r\n3 2715 13091 13090 3214 \r\n3 1164 13093 6197 3215 \r\n3 4080 13092 13093 3215 \r\n3 2507 6197 13092 3215 \r\n3 2146 12557 13095 3216 \r\n3 874 13094 12557 3216 \r\n3 1182 13095 13094 3216 \r\n3 4914 12401 13097 3217 \r\n3 399 13096 12401 3217 \r\n3 1442 13097 13096 3217 \r\n3 3777 12358 12695 3218 \r\n3 3140 13098 12358 3218 \r\n3 4119 12695 13098 3218 \r\n3 219 13101 13100 3219 \r\n3 1803 13099 13101 3219 \r\n3 3533 13100 13099 3219 \r\n3 1089 11902 13102 3220 \r\n3 2649 5276 11902 3220 \r\n3 856 13102 5276 3220 \r\n3 451 13104 10720 3221 \r\n3 1319 13103 13104 3221 \r\n3 510 10720 13103 3221 \r\n3 2066 13106 9986 3222 \r\n3 4933 13105 13106 3222 \r\n3 2533 9986 13105 3222 \r\n3 764 13108 13107 3223 \r\n3 2612 7000 13108 3223 \r\n3 3042 13107 7000 3223 \r\n3 4868 6622 13110 3224 \r\n3 898 13109 6622 3224 \r\n3 3170 13110 13109 3224 \r\n3 968 13113 13112 3225 \r\n3 2517 13111 13113 3225 \r\n3 3240 13112 13111 3225 \r\n3 279 13115 13114 3226 \r\n3 4084 7538 13115 3226 \r\n3 4714 13114 7538 3226 \r\n3 4163 13118 13117 3227 \r\n3 78 13116 13118 3227 \r\n3 3552 13117 13116 3227 \r\n3 3490 10425 9501 3228 \r\n3 2378 8102 10425 3228 \r\n3 2177 9501 8102 3228 \r\n3 914 13121 13120 3229 \r\n3 2459 13119 13121 3229 \r\n3 162 13120 13119 3229 \r\n3 1034 11145 11198 3230 \r\n3 4847 13122 11145 3230 \r\n3 2822 11198 13122 3230 \r\n3 4436 13124 13007 3231 \r\n3 2447 13123 13124 3231 \r\n3 93 13007 13123 3231 \r\n3 3096 13127 13126 3232 \r\n3 3763 13125 13127 3232 \r\n3 3221 13126 13125 3232 \r\n3 1642 13128 6019 3233 \r\n3 4656 10958 13128 3233 \r\n3 2182 6019 10958 3233 \r\n3 4957 12741 13129 3234 \r\n3 143 9575 12741 3234 \r\n3 267 13129 9575 3234 \r\n3 96 13131 11356 3235 \r\n3 2592 13130 13131 3235 \r\n3 1027 11356 13130 3235 \r\n3 4016 13134 13133 3236 \r\n3 393 13132 13134 3236 \r\n3 333 13133 13132 3236 \r\n3 4378 13137 13136 3237 \r\n3 4255 13135 13137 3237 \r\n3 4227 13136 13135 3237 \r\n3 3380 13139 9525 3238 \r\n3 1859 13138 13139 3238 \r\n3 4021 9525 13138 3238 \r\n3 79 7815 13141 3239 \r\n3 2216 13140 7815 3239 \r\n3 439 13141 13140 3239 \r\n3 2136 12690 10007 3240 \r\n3 3608 13142 12690 3240 \r\n3 903 10007 13142 3240 \r\n3 2705 13145 13144 3241 \r\n3 2684 13143 13145 3241 \r\n3 1012 13144 13143 3241 \r\n3 2426 13147 13146 3242 \r\n3 43 6510 13147 3242 \r\n3 1923 13146 6510 3242 \r\n3 181 13150 13149 3243 \r\n3 2728 13148 13150 3243 \r\n3 4165 13149 13148 3243 \r\n3 3754 12331 13151 3244 \r\n3 2665 8003 12331 3244 \r\n3 2786 13151 8003 3244 \r\n3 2913 13152 6033 3245 \r\n3 1143 11603 13152 3245 \r\n3 2369 6033 11603 3245 \r\n3 2998 11297 13153 3246 \r\n3 1420 9511 11297 3246 \r\n3 1915 13153 9511 3246 \r\n3 3048 13156 13155 3247 \r\n3 2883 13154 13156 3247 \r\n3 4275 13155 13154 3247 \r\n3 1040 13158 10441 3248 \r\n3 1237 13157 13158 3248 \r\n3 3863 10441 13157 3248 \r\n3 1559 13160 13159 3249 \r\n3 3186 5217 13160 3249 \r\n3 431 13159 5217 3249 \r\n3 4753 13162 13161 3250 \r\n3 1798 12657 13162 3250 \r\n3 658 13161 12657 3250 \r\n3 578 13164 13163 3251 \r\n3 2582 6682 13164 3251 \r\n3 3801 13163 6682 3251 \r\n3 4118 10550 13165 3252 \r\n3 3488 11453 10550 3252 \r\n3 3989 13165 11453 3252 \r\n3 3930 11070 13167 3253 \r\n3 3650 13166 11070 3253 \r\n3 1974 13167 13166 3253 \r\n3 4050 13168 12456 3254 \r\n3 1692 7911 13168 3254 \r\n3 2648 12456 7911 3254 \r\n3 359 13170 13169 3255 \r\n3 505 12731 13170 3255 \r\n3 4104 13169 12731 3255 \r\n3 874 13171 13094 3256 \r\n3 2308 9484 13171 3256 \r\n3 1182 13094 9484 3256 \r\n3 4887 13173 7956 3257 \r\n3 1805 13172 13173 3257 \r\n3 3387 7956 13172 3257 \r\n3 3274 13175 13174 3258 \r\n3 3524 9214 13175 3258 \r\n3 3254 13174 9214 3258 \r\n3 3854 10022 13176 3259 \r\n3 4616 10296 10022 3259 \r\n3 2445 13176 10296 3259 \r\n3 3141 13178 7669 3260 \r\n3 1956 13177 13178 3260 \r\n3 2130 7669 13177 3260 \r\n3 341 13180 11045 3261 \r\n3 1011 13179 13180 3261 \r\n3 3950 11045 13179 3261 \r\n3 1972 13183 13182 3262 \r\n3 4327 13181 13183 3262 \r\n3 626 13182 13181 3262 \r\n3 4672 13185 13184 3263 \r\n3 464 12162 13185 3263 \r\n3 4305 13184 12162 3263 \r\n3 219 13100 13186 3264 \r\n3 3533 8613 13100 3264 \r\n3 3656 13186 8613 3264 \r\n3 1331 6992 13188 3265 \r\n3 706 13187 6992 3265 \r\n3 215 13188 13187 3265 \r\n3 2832 13190 13189 3266 \r\n3 404 7117 13190 3266 \r\n3 1948 13189 7117 3266 \r\n3 4946 13192 13191 3267 \r\n3 4510 12837 13192 3267 \r\n3 1158 13191 12837 3267 \r\n3 2798 13194 13193 3268 \r\n3 796 10840 13194 3268 \r\n3 4251 13193 10840 3268 \r\n3 82 13197 13196 3269 \r\n3 3522 13195 13197 3269 \r\n3 804 13196 13195 3269 \r\n3 3141 13198 5823 3270 \r\n3 4363 9927 13198 3270 \r\n3 177 5823 9927 3270 \r\n3 198 13201 13200 3271 \r\n3 902 13199 13201 3271 \r\n3 3504 13200 13199 3271 \r\n3 2126 13204 13203 3272 \r\n3 627 13202 13204 3272 \r\n3 80 13203 13202 3272 \r\n3 2962 12825 13206 3273 \r\n3 1243 13205 12825 3273 \r\n3 2923 13206 13205 3273 \r\n3 959 13208 13207 3274 \r\n3 4393 9664 13208 3274 \r\n3 3873 13207 9664 3274 \r\n3 3955 13209 9836 3275 \r\n3 608 6454 13209 3275 \r\n3 2337 9836 6454 3275 \r\n3 3237 7607 13211 3276 \r\n3 26 13210 7607 3276 \r\n3 4538 13211 13210 3276 \r\n3 3740 12341 7500 3277 \r\n3 312 5961 12341 3277 \r\n3 3746 7500 5961 3277 \r\n3 4827 5957 12679 3278 \r\n3 2801 12057 5957 3278 \r\n3 4914 12679 12057 3278 \r\n3 3294 13213 12027 3279 \r\n3 495 13212 13213 3279 \r\n3 4304 12027 13212 3279 \r\n3 3554 13216 13215 3280 \r\n3 3583 13214 13216 3280 \r\n3 1141 13215 13214 3280 \r\n3 1822 13218 10369 3281 \r\n3 13 13217 13218 3281 \r\n3 2024 10369 13217 3281 \r\n3 4555 10338 13220 3282 \r\n3 3374 13219 10338 3282 \r\n3 995 13220 13219 3282 \r\n3 406 12247 13222 3283 \r\n3 1033 13221 12247 3283 \r\n3 1117 13222 13221 3283 \r\n3 1812 13225 13224 3284 \r\n3 4653 13223 13225 3284 \r\n3 26 13224 13223 3284 \r\n3 3100 13227 5262 3285 \r\n3 1743 13226 13227 3285 \r\n3 4302 5262 13226 3285 \r\n3 7 13229 13228 3286 \r\n3 2112 8626 13229 3286 \r\n3 3681 13228 8626 3286 \r\n3 302 5228 11851 3287 \r\n3 1505 13230 5228 3287 \r\n3 3407 11851 13230 3287 \r\n3 4383 13233 13232 3288 \r\n3 1885 13231 13233 3288 \r\n3 2228 13232 13231 3288 \r\n3 4250 12660 13235 3289 \r\n3 143 13234 12660 3289 \r\n3 379 13235 13234 3289 \r\n3 82 13237 10734 3290 \r\n3 2103 13236 13237 3290 \r\n3 1395 10734 13236 3290 \r\n3 2131 13239 13238 3291 \r\n3 882 5224 13239 3291 \r\n3 4216 13238 5224 3291 \r\n3 764 13241 13240 3292 \r\n3 1259 6008 13241 3292 \r\n3 4204 13240 6008 3292 \r\n3 3717 5655 13242 3293 \r\n3 3476 10666 5655 3293 \r\n3 4956 13242 10666 3293 \r\n3 4783 13244 8873 3294 \r\n3 2446 13243 13244 3294 \r\n3 871 8873 13243 3294 \r\n3 2600 13247 13246 3295 \r\n3 3599 13245 13247 3295 \r\n3 2568 13246 13245 3295 \r\n3 1000 8654 10144 3296 \r\n3 2781 13248 8654 3296 \r\n3 1952 10144 13248 3296 \r\n3 2497 13250 13249 3297 \r\n3 322 11386 13250 3297 \r\n3 4806 13249 11386 3297 \r\n3 661 13253 13252 3298 \r\n3 2625 13251 13253 3298 \r\n3 2984 13252 13251 3298 \r\n3 1400 13255 7109 3299 \r\n3 3031 13254 13255 3299 \r\n3 4785 7109 13254 3299 \r\n3 3197 8925 5950 3300 \r\n3 2346 11608 8925 3300 \r\n3 2794 5950 11608 3300 \r\n3 1557 13257 13256 3301 \r\n3 612 8699 13257 3301 \r\n3 188 13256 8699 3301 \r\n3 16 11674 13259 3302 \r\n3 3549 13258 11674 3302 \r\n3 2249 13259 13258 3302 \r\n3 48 13262 13261 3303 \r\n3 1686 13260 13262 3303 \r\n3 100 13261 13260 3303 \r\n3 2544 11684 10676 3304 \r\n3 1216 12672 11684 3304 \r\n3 3514 10676 12672 3304 \r\n3 3361 13264 11267 3305 \r\n3 748 13263 13264 3305 \r\n3 1889 11267 13263 3305 \r\n3 3665 13267 13266 3306 \r\n3 3534 13265 13267 3306 \r\n3 297 13266 13265 3306 \r\n3 1276 13270 13269 3307 \r\n3 1953 13268 13270 3307 \r\n3 2527 13269 13268 3307 \r\n3 32 7605 13272 3308 \r\n3 3237 13271 7605 3308 \r\n3 4252 13272 13271 3308 \r\n3 1404 13274 13273 3309 \r\n3 1372 8472 13274 3309 \r\n3 1473 13273 8472 3309 \r\n3 788 13276 7188 3310 \r\n3 3619 13275 13276 3310 \r\n3 1325 7188 13275 3310 \r\n3 4550 13278 13277 3311 \r\n3 4506 12509 13278 3311 \r\n3 426 13277 12509 3311 \r\n3 2850 10629 13279 3312 \r\n3 1104 8403 10629 3312 \r\n3 2519 13279 8403 3312 \r\n3 3459 13282 13281 3313 \r\n3 3534 13280 13282 3313 \r\n3 769 13281 13280 3313 \r\n3 2956 13284 7787 3314 \r\n3 2106 13283 13284 3314 \r\n3 2600 7787 13283 3314 \r\n3 2875 13286 13285 3315 \r\n3 3498 12442 13286 3315 \r\n3 4990 13285 12442 3315 \r\n3 3906 13288 13287 3316 \r\n3 814 10306 13288 3316 \r\n3 929 13287 10306 3316 \r\n3 4215 13291 13290 3317 \r\n3 2476 13289 13291 3317 \r\n3 4455 13290 13289 3317 \r\n3 1987 13292 11282 3318 \r\n3 692 12069 13292 3318 \r\n3 2150 11282 12069 3318 \r\n3 3730 13294 8183 3319 \r\n3 3924 13293 13294 3319 \r\n3 2851 8183 13293 3319 \r\n3 1858 13297 13296 3320 \r\n3 1449 13295 13297 3320 \r\n3 4806 13296 13295 3320 \r\n3 4395 5888 6306 3321 \r\n3 2948 13298 5888 3321 \r\n3 4390 6306 13298 3321 \r\n3 1710 7904 11002 3322 \r\n3 555 6248 7904 3322 \r\n3 2731 11002 6248 3322 \r\n3 1399 13301 13300 3323 \r\n3 3284 13299 13301 3323 \r\n3 4613 13300 13299 3323 \r\n3 250 13303 5452 3324 \r\n3 4916 13302 13303 3324 \r\n3 1211 5452 13302 3324 \r\n3 4402 13304 7248 3325 \r\n3 1454 7968 13304 3325 \r\n3 2647 7248 7968 3325 \r\n3 1214 8221 13305 3326 \r\n3 4245 12462 8221 3326 \r\n3 4549 13305 12462 3326 \r\n3 3724 13308 13307 3327 \r\n3 3225 13306 13308 3327 \r\n3 1932 13307 13306 3327 \r\n3 478 13311 13310 3328 \r\n3 190 13309 13311 3328 \r\n3 1215 13310 13309 3328 \r\n3 4118 13314 13313 3329 \r\n3 1217 13312 13314 3329 \r\n3 721 13313 13312 3329 \r\n3 4194 13316 7295 3330 \r\n3 2897 13315 13316 3330 \r\n3 3559 7295 13315 3330 \r\n3 4792 13319 13318 3331 \r\n3 127 13317 13319 3331 \r\n3 1549 13318 13317 3331 \r\n3 2754 11613 13321 3332 \r\n3 3834 13320 11613 3332 \r\n3 3044 13321 13320 3332 \r\n3 2292 13323 13322 3333 \r\n3 4392 10385 13323 3333 \r\n3 1869 13322 10385 3333 \r\n3 2083 13324 5639 3334 \r\n3 4849 12950 13324 3334 \r\n3 4164 5639 12950 3334 \r\n3 404 13327 13326 3335 \r\n3 2570 13325 13327 3335 \r\n3 4041 13326 13325 3335 \r\n3 892 13330 13329 3336 \r\n3 1816 13328 13330 3336 \r\n3 1184 13329 13328 3336 \r\n3 3603 13332 9904 3337 \r\n3 891 13331 13332 3337 \r\n3 3553 9904 13331 3337 \r\n3 3419 13334 13333 3338 \r\n3 711 5814 13334 3338 \r\n3 3638 13333 5814 3338 \r\n3 483 13337 13336 3339 \r\n3 2945 13335 13337 3339 \r\n3 779 13336 13335 3339 \r\n3 4549 13340 13339 3340 \r\n3 147 13338 13340 3340 \r\n3 1443 13339 13338 3340 \r\n3 1360 11930 11585 3341 \r\n3 3827 13341 11930 3341 \r\n3 699 11585 13341 3341 \r\n3 563 13344 13343 3342 \r\n3 4458 13342 13344 3342 \r\n3 3420 13343 13342 3342 \r\n3 4113 13346 13345 3343 \r\n3 4055 12137 13346 3343 \r\n3 234 13345 12137 3343 \r\n3 2138 5720 13348 3344 \r\n3 4347 13347 5720 3344 \r\n3 2714 13348 13347 3344 \r\n3 4701 13350 13349 3345 \r\n3 3436 8323 13350 3345 \r\n3 1963 13349 8323 3345 \r\n3 2502 13353 13352 3346 \r\n3 1417 13351 13353 3346 \r\n3 2259 13352 13351 3346 \r\n3 2421 13354 5210 3347 \r\n3 4266 5636 13354 3347 \r\n3 167 5210 5636 3347 \r\n3 3944 10886 6953 3348 \r\n3 3133 13355 10886 3348 \r\n3 1719 6953 13355 3348 \r\n3 3847 10189 11841 3349 \r\n3 716 7405 10189 3349 \r\n3 1067 11841 7405 3349 \r\n3 2537 5468 13357 3350 \r\n3 4715 13356 5468 3350 \r\n3 1944 13357 13356 3350 \r\n3 2727 13360 13359 3351 \r\n3 2394 13358 13360 3351 \r\n3 1487 13359 13358 3351 \r\n3 2015 13078 13361 3352 \r\n3 1899 12669 13078 3352 \r\n3 2980 13361 12669 3352 \r\n3 1982 13363 13362 3353 \r\n3 3467 10707 13363 3353 \r\n3 3392 13362 10707 3353 \r\n3 1873 13364 10440 3354 \r\n3 387 9380 13364 3354 \r\n3 1040 10440 9380 3354 \r\n3 2034 13366 12010 3355 \r\n3 2298 13365 13366 3355 \r\n3 3038 12010 13365 3355 \r\n3 3864 13369 13368 3356 \r\n3 3832 13367 13369 3356 \r\n3 4062 13368 13367 3356 \r\n3 4569 10202 13371 3357 \r\n3 2326 13370 10202 3357 \r\n3 3344 13371 13370 3357 \r\n3 153 13373 8777 3358 \r\n3 2359 13372 13373 3358 \r\n3 2844 8777 13372 3358 \r\n3 3708 8211 13375 3359 \r\n3 2902 13374 8211 3359 \r\n3 1673 13375 13374 3359 \r\n3 812 13378 13377 3360 \r\n3 3334 13376 13378 3360 \r\n3 194 13377 13376 3360 \r\n3 3927 11542 13379 3361 \r\n3 2887 9205 11542 3361 \r\n3 2856 13379 9205 3361 \r\n3 137 6545 13380 3362 \r\n3 1113 9452 6545 3362 \r\n3 1492 13380 9452 3362 \r\n3 3453 8312 13381 3363 \r\n3 686 8144 8312 3363 \r\n3 3703 13381 8144 3363 \r\n3 379 13234 11009 3364 \r\n3 143 8922 13234 3364 \r\n3 2949 11009 8922 3364 \r\n3 1188 13384 13383 3365 \r\n3 4428 13382 13384 3365 \r\n3 1168 13383 13382 3365 \r\n3 25 13386 13385 3366 \r\n3 428 12711 13386 3366 \r\n3 1375 13385 12711 3366 \r\n3 4575 12914 13388 3367 \r\n3 2402 13387 12914 3367 \r\n3 984 13388 13387 3367 \r\n3 379 13390 13235 3368 \r\n3 3704 13389 13390 3368 \r\n3 4250 13235 13389 3368 \r\n3 4752 9888 12275 3369 \r\n3 2165 6301 9888 3369 \r\n3 1752 12275 6301 3369 \r\n3 2285 13391 12086 3370 \r\n3 4865 5876 13391 3370 \r\n3 2645 12086 5876 3370 \r\n3 4450 13393 6865 3371 \r\n3 3064 13392 13393 3371 \r\n3 2644 6865 13392 3371 \r\n3 4701 13394 9644 3372 \r\n3 4143 5008 13394 3372 \r\n3 1563 9644 5008 3372 \r\n3 3255 13397 13396 3373 \r\n3 3220 13395 13397 3373 \r\n3 1559 13396 13395 3373 \r\n3 1599 13400 13399 3374 \r\n3 3911 13398 13400 3374 \r\n3 3437 13399 13398 3374 \r\n3 328 13402 12071 3375 \r\n3 3395 13401 13402 3375 \r\n3 3345 12071 13401 3375 \r\n3 709 11588 13404 3376 \r\n3 4967 13403 11588 3376 \r\n3 1350 13404 13403 3376 \r\n3 1998 5171 11222 3377 \r\n3 3453 13381 5171 3377 \r\n3 3703 11222 13381 3377 \r\n3 1747 13407 13406 3378 \r\n3 3055 13405 13407 3378 \r\n3 1080 13406 13405 3378 \r\n3 4683 13408 5362 3379 \r\n3 1665 12541 13408 3379 \r\n3 3647 5362 12541 3379 \r\n3 2350 13411 13410 3380 \r\n3 938 13409 13411 3380 \r\n3 1515 13410 13409 3380 \r\n3 4202 5826 6795 3381 \r\n3 3539 13412 5826 3381 \r\n3 2892 6795 13412 3381 \r\n3 3306 5599 13413 3382 \r\n3 4068 10857 5599 3382 \r\n3 3247 13413 10857 3382 \r\n3 3678 9739 6336 3383 \r\n3 4224 13414 9739 3383 \r\n3 4265 6336 13414 3383 \r\n3 1389 13416 13415 3384 \r\n3 2717 11407 13416 3384 \r\n3 832 13415 11407 3384 \r\n3 1709 13419 13418 3385 \r\n3 3462 13417 13419 3385 \r\n3 4519 13418 13417 3385 \r\n3 3308 11337 13420 3386 \r\n3 2773 8463 11337 3386 \r\n3 1634 13420 8463 3386 \r\n3 2608 13422 13421 3387 \r\n3 446 9795 13422 3387 \r\n3 1615 13421 9795 3387 \r\n3 361 13425 13424 3388 \r\n3 3333 13423 13425 3388 \r\n3 2740 13424 13423 3388 \r\n3 3145 13428 13427 3389 \r\n3 4176 13426 13428 3389 \r\n3 1295 13427 13426 3389 \r\n3 4476 11285 13430 3390 \r\n3 4399 13429 11285 3390 \r\n3 1299 13430 13429 3390 \r\n3 1091 13432 5247 3391 \r\n3 1100 13431 13432 3391 \r\n3 4033 5247 13431 3391 \r\n3 789 13434 13433 3392 \r\n3 976 11432 13434 3392 \r\n3 4897 13433 11432 3392 \r\n3 1417 13436 11131 3393 \r\n3 1278 13435 13436 3393 \r\n3 1513 11131 13435 3393 \r\n3 1034 13438 11143 3394 \r\n3 2784 13437 13438 3394 \r\n3 351 11143 13437 3394 \r\n3 2058 10372 13440 3395 \r\n3 992 13439 10372 3395 \r\n3 4643 13440 13439 3395 \r\n3 3390 13443 13442 3396 \r\n3 4820 13441 13443 3396 \r\n3 383 13442 13441 3396 \r\n3 1684 13446 13445 3397 \r\n3 346 13444 13446 3397 \r\n3 3477 13445 13444 3397 \r\n3 3708 6138 12412 3398 \r\n3 1909 13447 6138 3398 \r\n3 2095 12412 13447 3398 \r\n3 2740 13449 13448 3399 \r\n3 1339 7199 13449 3399 \r\n3 3098 13448 7199 3399 \r\n3 4478 11467 11441 3400 \r\n3 1128 12083 11467 3400 \r\n3 330 11441 12083 3400 \r\n3 1070 13451 12317 3401 \r\n3 69 13450 13451 3401 \r\n3 4856 12317 13450 3401 \r\n3 3164 7946 13453 3402 \r\n3 2137 13452 7946 3402 \r\n3 1219 13453 13452 3402 \r\n3 4352 13456 13455 3403 \r\n3 4637 13454 13456 3403 \r\n3 2115 13455 13454 3403 \r\n3 1161 12991 13457 3404 \r\n3 3895 11911 12991 3404 \r\n3 683 13457 11911 3404 \r\n3 1889 13263 13459 3405 \r\n3 748 13458 13263 3405 \r\n3 4733 13459 13458 3405 \r\n3 4239 13462 13461 3406 \r\n3 2303 13460 13462 3406 \r\n3 4286 13461 13460 3406 \r\n3 2218 13465 13464 3407 \r\n3 1061 13463 13465 3407 \r\n3 4173 13464 13463 3407 \r\n3 4124 13468 13467 3408 \r\n3 1943 13466 13468 3408 \r\n3 1312 13467 13466 3408 \r\n3 2136 13470 12691 3409 \r\n3 1549 13469 13470 3409 \r\n3 2067 12691 13469 3409 \r\n3 760 9275 13471 3410 \r\n3 355 5222 9275 3410 \r\n3 1681 13471 5222 3410 \r\n3 3462 13419 5542 3411 \r\n3 1709 11822 13419 3411 \r\n3 71 5542 11822 3411 \r\n3 634 13473 13472 3412 \r\n3 14 6849 13473 3412 \r\n3 3911 13472 6849 3412 \r\n3 237 13476 13475 3413 \r\n3 2102 13474 13476 3413 \r\n3 3326 13475 13474 3413 \r\n3 1191 13479 13478 3414 \r\n3 4472 13477 13479 3414 \r\n3 166 13478 13477 3414 \r\n3 3414 13482 13481 3415 \r\n3 2836 13480 13482 3415 \r\n3 4899 13481 13480 3415 \r\n3 2357 8698 13484 3416 \r\n3 4136 13483 8698 3416 \r\n3 3808 13484 13483 3416 \r\n3 1341 5935 13486 3417 \r\n3 523 13485 5935 3417 \r\n3 2447 13486 13485 3417 \r\n3 1502 7146 13488 3418 \r\n3 250 13487 7146 3418 \r\n3 342 13488 13487 3418 \r\n3 3701 13491 13490 3419 \r\n3 3575 13489 13491 3419 \r\n3 3659 13490 13489 3419 \r\n3 3341 13494 13493 3420 \r\n3 1214 13492 13494 3420 \r\n3 377 13493 13492 3420 \r\n3 4893 13497 13496 3421 \r\n3 3696 13495 13497 3421 \r\n3 23 13496 13495 3421 \r\n3 2511 13498 5745 3422 \r\n3 3561 11382 13498 3422 \r\n3 3674 5745 11382 3422 \r\n3 1690 13500 13499 3423 \r\n3 2248 10947 13500 3423 \r\n3 1706 13499 10947 3423 \r\n3 4042 13503 13502 3424 \r\n3 2167 13501 13503 3424 \r\n3 2145 13502 13501 3424 \r\n3 3090 13504 6631 3425 \r\n3 4029 10392 13504 3425 \r\n3 1452 6631 10392 3425 \r\n3 390 13506 13505 3426 \r\n3 566 9804 13506 3426 \r\n3 438 13505 9804 3426 \r\n3 4705 13509 13508 3427 \r\n3 745 13507 13509 3427 \r\n3 1768 13508 13507 3427 \r\n3 1372 13274 13511 3428 \r\n3 1404 13510 13274 3428 \r\n3 176 13511 13510 3428 \r\n3 2695 13514 13513 3429 \r\n3 4750 13512 13514 3429 \r\n3 3907 13513 13512 3429 \r\n3 835 13517 13516 3430 \r\n3 3036 13515 13517 3430 \r\n3 2572 13516 13515 3430 \r\n3 3169 13519 8591 3431 \r\n3 2686 13518 13519 3431 \r\n3 2009 8591 13518 3431 \r\n3 3423 13521 13520 3432 \r\n3 413 9882 13521 3432 \r\n3 2208 13520 9882 3432 \r\n3 2432 13524 13523 3433 \r\n3 1917 13522 13524 3433 \r\n3 2605 13523 13522 3433 \r\n3 1107 8338 13525 3434 \r\n3 1928 7678 8338 3434 \r\n3 294 13525 7678 3434 \r\n3 4679 13528 13527 3435 \r\n3 4750 13526 13528 3435 \r\n3 4833 13527 13526 3435 \r\n3 3653 13531 13530 3436 \r\n3 4820 13529 13531 3436 \r\n3 4165 13530 13529 3436 \r\n3 3060 13533 13532 3437 \r\n3 700 7246 13533 3437 \r\n3 2647 13532 7246 3437 \r\n3 2594 13536 13535 3438 \r\n3 132 13534 13536 3438 \r\n3 3244 13535 13534 3438 \r\n3 830 6767 13538 3439 \r\n3 1720 13537 6767 3439 \r\n3 3298 13538 13537 3439 \r\n3 1338 13540 10814 3440 \r\n3 2297 13539 13540 3440 \r\n3 3521 10814 13539 3440 \r\n3 3700 8257 13541 3441 \r\n3 4635 10314 8257 3441 \r\n3 1647 13541 10314 3441 \r\n3 1279 13544 13543 3442 \r\n3 590 13542 13544 3442 \r\n3 256 13543 13542 3442 \r\n3 3563 13545 7224 3443 \r\n3 3301 10375 13545 3443 \r\n3 3405 7224 10375 3443 \r\n3 933 13547 6141 3444 \r\n3 3271 13546 13547 3444 \r\n3 4577 6141 13546 3444 \r\n3 1627 13549 9902 3445 \r\n3 3440 13548 13549 3445 \r\n3 288 9902 13548 3445 \r\n3 2612 13551 13550 3446 \r\n3 3058 6905 13551 3446 \r\n3 2961 13550 6905 3446 \r\n3 3242 13553 13552 3447 \r\n3 1458 7771 13553 3447 \r\n3 1489 13552 7771 3447 \r\n3 1375 13556 13555 3448 \r\n3 751 13554 13556 3448 \r\n3 117 13555 13554 3448 \r\n3 2272 13559 13558 3449 \r\n3 4432 13557 13559 3449 \r\n3 2016 13558 13557 3449 \r\n3 176 13510 13560 3450 \r\n3 1404 8521 13510 3450 \r\n3 352 13560 8521 3450 \r\n3 854 11245 7477 3451 \r\n3 4374 5294 11245 3451 \r\n3 3464 7477 5294 3451 \r\n3 4425 13562 13561 3452 \r\n3 2396 10827 13562 3452 \r\n3 1835 13561 10827 3452 \r\n3 4178 13564 13563 3453 \r\n3 4618 12627 13564 3453 \r\n3 3702 13563 12627 3453 \r\n3 1161 13567 13566 3454 \r\n3 3748 13565 13567 3454 \r\n3 2165 13566 13565 3454 \r\n3 3434 13570 13569 3455 \r\n3 543 13568 13570 3455 \r\n3 2295 13569 13568 3455 \r\n3 3887 13573 13572 3456 \r\n3 4088 13571 13573 3456 \r\n3 3574 13572 13571 3456 \r\n3 3267 7363 5283 3457 \r\n3 3910 8011 7363 3457 \r\n3 1481 5283 8011 3457 \r\n3 1955 8439 13575 3458 \r\n3 4514 13574 8439 3458 \r\n3 3449 13575 13574 3458 \r\n3 643 13578 13577 3459 \r\n3 1168 13576 13578 3459 \r\n3 3468 13577 13576 3459 \r\n3 1823 7339 13580 3460 \r\n3 4825 13579 7339 3460 \r\n3 3288 13580 13579 3460 \r\n3 59 9330 13582 3461 \r\n3 4844 13581 9330 3461 \r\n3 4285 13582 13581 3461 \r\n3 1127 13059 13584 3462 \r\n3 1739 13583 13059 3462 \r\n3 3205 13584 13583 3462 \r\n3 292 13586 13585 3463 \r\n3 2665 12330 13586 3463 \r\n3 4045 13585 12330 3463 \r\n3 4641 13589 13588 3464 \r\n3 2073 13587 13589 3464 \r\n3 810 13588 13587 3464 \r\n3 78 13592 13591 3465 \r\n3 1789 13590 13592 3465 \r\n3 4050 13591 13590 3465 \r\n3 2063 13595 13594 3466 \r\n3 3563 13593 13595 3466 \r\n3 540 13594 13593 3466 \r\n3 3596 5677 12245 3467 \r\n3 4626 11319 5677 3467 \r\n3 4314 12245 11319 3467 \r\n3 2362 13597 9958 3468 \r\n3 2745 13596 13597 3468 \r\n3 739 9958 13596 3468 \r\n3 1203 13599 6042 3469 \r\n3 4872 13598 13599 3469 \r\n3 1873 6042 13598 3469 \r\n3 1772 8301 7094 3470 \r\n3 1446 13600 8301 3470 \r\n3 321 7094 13600 3470 \r\n3 3449 13602 13601 3471 \r\n3 149 10332 13602 3471 \r\n3 1606 13601 10332 3471 \r\n3 3454 9491 13603 3472 \r\n3 2335 5590 9491 3472 \r\n3 2769 13603 5590 3472 \r\n3 2405 11893 13604 3473 \r\n3 633 10862 11893 3473 \r\n3 3706 13604 10862 3473 \r\n3 902 13607 13606 3474 \r\n3 1146 13605 13607 3474 \r\n3 782 13606 13605 3474 \r\n3 4208 13608 12968 3475 \r\n3 54 7029 13608 3475 \r\n3 1244 12968 7029 3475 \r\n3 3124 13610 13609 3476 \r\n3 2663 11106 13610 3476 \r\n3 3001 13609 11106 3476 \r\n3 957 13613 13612 3477 \r\n3 1467 13611 13613 3477 \r\n3 3416 13612 13611 3477 \r\n3 3200 13615 12045 3478 \r\n3 3897 13614 13615 3478 \r\n3 4090 12045 13614 3478 \r\n3 2670 12640 13617 3479 \r\n3 3538 13616 12640 3479 \r\n3 717 13617 13616 3479 \r\n3 4660 13620 13619 3480 \r\n3 3687 13618 13620 3480 \r\n3 1501 13619 13618 3480 \r\n3 1935 7298 11498 3481 \r\n3 3949 13621 7298 3481 \r\n3 754 11498 13621 3481 \r\n3 3787 13623 6073 3482 \r\n3 3339 13622 13623 3482 \r\n3 3816 6073 13622 3482 \r\n3 4952 10214 13624 3483 \r\n3 3844 10810 10214 3483 \r\n3 1131 13624 10810 3483 \r\n3 3484 13626 11287 3484 \r\n3 869 13625 13626 3484 \r\n3 4399 11287 13625 3484 \r\n3 4934 8585 9758 3485 \r\n3 726 13627 8585 3485 \r\n3 4091 9758 13627 3485 \r\n3 4028 13629 12814 3486 \r\n3 3497 13628 13629 3486 \r\n3 184 12814 13628 3486 \r\n3 2512 13632 13631 3487 \r\n3 2951 13630 13632 3487 \r\n3 1153 13631 13630 3487 \r\n3 2893 13635 13634 3488 \r\n3 1240 13633 13635 3488 \r\n3 430 13634 13633 3488 \r\n3 1737 13637 13636 3489 \r\n3 4192 12869 13637 3489 \r\n3 2633 13636 12869 3489 \r\n3 3805 13640 13639 3490 \r\n3 138 13638 13640 3490 \r\n3 1495 13639 13638 3490 \r\n3 1485 13643 13642 3491 \r\n3 170 13641 13643 3491 \r\n3 1318 13642 13641 3491 \r\n3 760 13645 13644 3492 \r\n3 3204 9639 13645 3492 \r\n3 4997 13644 9639 3492 \r\n3 3869 13646 9042 3493 \r\n3 1565 12395 13646 3493 \r\n3 518 9042 12395 3493 \r\n3 1949 13648 13647 3494 \r\n3 584 9289 13648 3494 \r\n3 230 13647 9289 3494 \r\n3 1962 13650 13649 3495 \r\n3 2759 7620 13650 3495 \r\n3 3428 13649 7620 3495 \r\n3 2618 13651 7542 3496 \r\n3 658 12656 13651 3496 \r\n3 4700 7542 12656 3496 \r\n3 2312 8401 9585 3497 \r\n3 3706 13652 8401 3497 \r\n3 4972 9585 13652 3497 \r\n3 3072 13654 11379 3498 \r\n3 355 13653 13654 3498 \r\n3 3132 11379 13653 3498 \r\n3 249 13656 13655 3499 \r\n3 1111 6536 13656 3499 \r\n3 1005 13655 6536 3499 \r\n3 940 13659 13658 3500 \r\n3 2189 13657 13659 3500 \r\n3 2959 13658 13657 3500 \r\n3 4564 11571 13661 3501 \r\n3 4408 13660 11571 3501 \r\n3 2195 13661 13660 3501 \r\n3 1591 13664 13663 3502 \r\n3 1553 13662 13664 3502 \r\n3 854 13663 13662 3502 \r\n3 764 13667 13666 3503 \r\n3 3761 13665 13667 3503 \r\n3 2555 13666 13665 3503 \r\n3 656 13669 9690 3504 \r\n3 991 13668 13669 3504 \r\n3 3723 9690 13668 3504 \r\n3 2503 13670 11246 3505 \r\n3 2972 8385 13670 3505 \r\n3 862 11246 8385 3505 \r\n3 2251 13673 13672 3506 \r\n3 2460 13671 13673 3506 \r\n3 4384 13672 13671 3506 \r\n3 594 13675 12466 3507 \r\n3 772 13674 13675 3507 \r\n3 1226 12466 13674 3507 \r\n3 991 13669 13677 3508 \r\n3 656 13676 13669 3508 \r\n3 514 13677 13676 3508 \r\n3 607 13679 13678 3509 \r\n3 3687 13620 13679 3509 \r\n3 4660 13678 13620 3509 \r\n3 2604 5418 13680 3510 \r\n3 4866 7656 5418 3510 \r\n3 2561 13680 7656 3510 \r\n3 3266 13683 13682 3511 \r\n3 652 13681 13683 3511 \r\n3 605 13682 13681 3511 \r\n3 3219 13685 7047 3512 \r\n3 1392 13684 13685 3512 \r\n3 2795 7047 13684 3512 \r\n3 4384 13671 13686 3513 \r\n3 2460 8077 13671 3513 \r\n3 3525 13686 8077 3513 \r\n3 581 13688 10800 3514 \r\n3 18 13687 13688 3514 \r\n3 3759 10800 13687 3514 \r\n3 415 13690 13689 3515 \r\n3 3736 8552 13690 3515 \r\n3 1083 13689 8552 3515 \r\n3 4585 13691 8139 3516 \r\n3 70 10602 13691 3516 \r\n3 4230 8139 10602 3516 \r\n3 4497 6703 13693 3517 \r\n3 2493 13692 6703 3517 \r\n3 718 13693 13692 3517 \r\n3 3589 13695 13694 3518 \r\n3 1775 8004 13695 3518 \r\n3 1363 13694 8004 3518 \r\n3 4837 9397 13697 3519 \r\n3 3355 13696 9397 3519 \r\n3 4071 13697 13696 3519 \r\n3 4958 13699 9727 3520 \r\n3 3739 13698 13699 3520 \r\n3 2758 9727 13698 3520 \r\n3 4901 8774 6076 3521 \r\n3 1486 13700 8774 3521 \r\n3 3281 6076 13700 3521 \r\n3 4698 12014 13702 3522 \r\n3 824 13701 12014 3522 \r\n3 4929 13702 13701 3522 \r\n3 285 13703 12121 3523 \r\n3 2085 6974 13703 3523 \r\n3 1779 12121 6974 3523 \r\n3 3331 13705 6233 3524 \r\n3 4325 13704 13705 3524 \r\n3 1418 6233 13704 3524 \r\n3 2732 13707 13706 3525 \r\n3 3063 13033 13707 3525 \r\n3 3371 13706 13033 3525 \r\n3 4058 11231 13708 3526 \r\n3 1943 13468 11231 3526 \r\n3 4124 13708 13468 3526 \r\n3 1259 10627 6006 3527 \r\n3 455 7016 10627 3527 \r\n3 2952 6006 7016 3527 \r\n3 3 13710 11947 3528 \r\n3 761 13709 13710 3528 \r\n3 3824 11947 13709 3528 \r\n3 3412 13713 13712 3529 \r\n3 1196 13711 13713 3529 \r\n3 2680 13712 13711 3529 \r\n3 1153 13716 13715 3530 \r\n3 4537 13714 13716 3530 \r\n3 2310 13715 13714 3530 \r\n3 1009 13718 10361 3531 \r\n3 2912 13717 13718 3531 \r\n3 3782 10361 13717 3531 \r\n3 4545 13719 5386 3532 \r\n3 1376 9008 13719 3532 \r\n3 4141 5386 9008 3532 \r\n3 3803 13722 13721 3533 \r\n3 2476 13720 13722 3533 \r\n3 1301 13721 13720 3533 \r\n3 4930 6136 13723 3534 \r\n3 2786 9087 6136 3534 \r\n3 835 13723 9087 3534 \r\n3 4309 13726 13725 3535 \r\n3 1208 13724 13726 3535 \r\n3 4848 13725 13724 3535 \r\n3 442 13728 12532 3536 \r\n3 390 13727 13728 3536 \r\n3 1003 12532 13727 3536 \r\n3 2769 5908 13603 3537 \r\n3 3312 13729 5908 3537 \r\n3 3454 13603 13729 3537 \r\n3 1789 13592 13730 3538 \r\n3 78 13118 13592 3538 \r\n3 4163 13730 13118 3538 \r\n3 1368 13733 13732 3539 \r\n3 4719 13731 13733 3539 \r\n3 2318 13732 13731 3539 \r\n3 2543 13736 13735 3540 \r\n3 1119 13734 13736 3540 \r\n3 1506 13735 13734 3540 \r\n3 4174 8424 13738 3541 \r\n3 3554 13737 8424 3541 \r\n3 4193 13738 13737 3541 \r\n3 1567 13741 13740 3542 \r\n3 3733 13739 13741 3542 \r\n3 9 13740 13739 3542 \r\n3 4129 13743 5649 3543 \r\n3 4779 13742 13743 3543 \r\n3 3153 5649 13742 3543 \r\n3 2807 13746 13745 3544 \r\n3 2880 13744 13746 3544 \r\n3 2559 13745 13744 3544 \r\n3 4354 7875 13748 3545 \r\n3 1967 13747 7875 3545 \r\n3 4206 13748 13747 3545 \r\n3 3298 11591 13750 3546 \r\n3 3458 13749 11591 3546 \r\n3 1438 13750 13749 3546 \r\n3 536 13753 13752 3547 \r\n3 4107 13751 13753 3547 \r\n3 2029 13752 13751 3547 \r\n3 3450 13755 13754 3548 \r\n3 783 10285 13755 3548 \r\n3 1703 13754 10285 3548 \r\n3 4799 11763 13756 3549 \r\n3 4009 7421 11763 3549 \r\n3 4319 13756 7421 3549 \r\n3 4416 13758 13757 3550 \r\n3 3715 9609 13758 3550 \r\n3 261 13757 9609 3550 \r\n3 2589 10311 13760 3551 \r\n3 4196 13759 10311 3551 \r\n3 1885 13760 13759 3551 \r\n3 1789 13730 13762 3552 \r\n3 4163 13761 13730 3552 \r\n3 2979 13762 13761 3552 \r\n3 2310 9537 13763 3553 \r\n3 1571 11813 9537 3553 \r\n3 2512 13763 11813 3553 \r\n3 4451 11957 10806 3554 \r\n3 2478 13764 11957 3554 \r\n3 423 10806 13764 3554 \r\n3 3338 8713 13766 3555 \r\n3 1331 13765 8713 3555 \r\n3 1558 13766 13765 3555 \r\n3 1995 13769 13768 3556 \r\n3 4487 13767 13769 3556 \r\n3 1330 13768 13767 3556 \r\n3 2327 13771 11954 3557 \r\n3 3300 13770 13771 3557 \r\n3 3669 11954 13770 3557 \r\n3 3107 13773 12006 3558 \r\n3 1922 13772 13773 3558 \r\n3 3632 12006 13772 3558 \r\n3 1324 13776 13775 3559 \r\n3 3362 13774 13776 3559 \r\n3 1618 13775 13774 3559 \r\n3 3338 13778 7881 3560 \r\n3 2069 13777 13778 3560 \r\n3 2017 7881 13777 3560 \r\n3 715 5023 13779 3561 \r\n3 4267 6645 5023 3561 \r\n3 4785 13779 6645 3561 \r\n3 745 13509 12240 3562 \r\n3 4705 6647 13509 3562 \r\n3 3564 12240 6647 3562 \r\n3 901 13781 13780 3563 \r\n3 3152 9238 13781 3563 \r\n3 4589 13780 9238 3563 \r\n3 4225 13784 13783 3564 \r\n3 4557 13782 13784 3564 \r\n3 3720 13783 13782 3564 \r\n3 2361 13787 13786 3565 \r\n3 4796 13785 13787 3565 \r\n3 4733 13786 13785 3565 \r\n3 692 13789 12463 3566 \r\n3 3999 13788 13789 3566 \r\n3 4759 12463 13788 3566 \r\n3 3617 13792 13791 3567 \r\n3 278 13790 13792 3567 \r\n3 3798 13791 13790 3567 \r\n3 4953 13794 13793 3568 \r\n3 3032 12870 13794 3568 \r\n3 2300 13793 12870 3568 \r\n3 1550 9687 13796 3569 \r\n3 2885 13795 9687 3569 \r\n3 291 13796 13795 3569 \r\n3 4821 6429 13798 3570 \r\n3 4446 13797 6429 3570 \r\n3 198 13798 13797 3570 \r\n3 1076 13801 13800 3571 \r\n3 4713 13799 13801 3571 \r\n3 2609 13800 13799 3571 \r\n3 574 12830 10688 3572 \r\n3 4907 13802 12830 3572 \r\n3 3637 10688 13802 3572 \r\n3 4996 13804 6907 3573 \r\n3 3280 13803 13804 3573 \r\n3 688 6907 13803 3573 \r\n3 2259 13807 13806 3574 \r\n3 4037 13805 13807 3574 \r\n3 258 13806 13805 3574 \r\n3 4555 13220 7098 3575 \r\n3 995 13808 13220 3575 \r\n3 46 7098 13808 3575 \r\n3 4004 13810 13809 3576 \r\n3 2582 13164 13810 3576 \r\n3 578 13809 13164 3576 \r\n3 2041 13813 13812 3577 \r\n3 2933 13811 13813 3577 \r\n3 4986 13812 13811 3577 \r\n3 2014 13816 13815 3578 \r\n3 4250 13814 13816 3578 \r\n3 2408 13815 13814 3578 \r\n3 3705 5930 8717 3579 \r\n3 1316 13817 5930 3579 \r\n3 3649 8717 13817 3579 \r\n3 1378 13819 8138 3580 \r\n3 382 13818 13819 3580 \r\n3 4585 8138 13818 3580 \r\n3 4676 13822 13821 3581 \r\n3 4426 13820 13822 3581 \r\n3 4558 13821 13820 3581 \r\n3 2374 8967 9479 3582 \r\n3 4423 6358 8967 3582 \r\n3 730 9479 6358 3582 \r\n3 3694 13824 13823 3583 \r\n3 4889 8047 13824 3583 \r\n3 2039 13823 8047 3583 \r\n3 4743 13827 13826 3584 \r\n3 1488 13825 13827 3584 \r\n3 4938 13826 13825 3584 \r\n3 2843 13830 13829 3585 \r\n3 3794 13828 13830 3585 \r\n3 4273 13829 13828 3585 \r\n3 3528 13833 13832 3586 \r\n3 147 13831 13833 3586 \r\n3 2835 13832 13831 3586 \r\n3 3749 7907 5881 3587 \r\n3 2699 13834 7907 3587 \r\n3 217 5881 13834 3587 \r\n3 1160 11687 9190 3588 \r\n3 3639 13835 11687 3588 \r\n3 469 9190 13835 3588 \r\n3 5000 13837 12360 3589 \r\n3 4913 13836 13837 3589 \r\n3 3140 12360 13836 3589 \r\n3 4488 13839 13838 3590 \r\n3 2120 7597 13839 3590 \r\n3 27 13838 7597 3590 \r\n3 3985 13841 13840 3591 \r\n3 3978 9683 13841 3591 \r\n3 1857 13840 9683 3591 \r\n3 3984 9304 13843 3592 \r\n3 769 13842 9304 3592 \r\n3 3665 13843 13842 3592 \r\n3 2012 13845 13844 3593 \r\n3 4028 12813 13845 3593 \r\n3 190 13844 12813 3593 \r\n3 1887 11424 8937 3594 \r\n3 1120 13846 11424 3594 \r\n3 780 8937 13846 3594 \r\n3 3474 13849 13848 3595 \r\n3 1063 13847 13849 3595 \r\n3 4504 13848 13847 3595 \r\n3 1996 13850 13022 3596 \r\n3 4881 13037 13850 3596 \r\n3 313 13022 13037 3596 \r\n3 4593 13853 13852 3597 \r\n3 823 13851 13853 3597 \r\n3 42 13852 13851 3597 \r\n3 233 13855 6037 3598 \r\n3 2965 13854 13855 3598 \r\n3 293 6037 13854 3598 \r\n3 1233 13858 13857 3599 \r\n3 1158 13856 13858 3599 \r\n3 3797 13857 13856 3599 \r\n3 4674 11324 13860 3600 \r\n3 3908 13859 11324 3600 \r\n3 1163 13860 13859 3600 \r\n3 3291 13862 13861 3601 \r\n3 3244 13534 13862 3601 \r\n3 132 13861 13534 3601 \r\n3 3273 9906 13864 3602 \r\n3 1167 13863 9906 3602 \r\n3 667 13864 13863 3602 \r\n3 2563 13866 13865 3603 \r\n3 3382 10103 13866 3603 \r\n3 2520 13865 10103 3603 \r\n3 384 13867 6780 3604 \r\n3 2242 9495 13867 3604 \r\n3 3945 6780 9495 3604 \r\n3 1921 13869 10221 3605 \r\n3 4329 13868 13869 3605 \r\n3 1850 10221 13868 3605 \r\n3 1184 13870 12148 3606 \r\n3 3454 13729 13870 3606 \r\n3 3312 12148 13729 3606 \r\n3 2511 13872 13871 3607 \r\n3 4737 10613 13872 3607 \r\n3 2749 13871 10613 3607 \r\n3 1899 13874 12670 3608 \r\n3 4410 13873 13874 3608 \r\n3 1875 12670 13873 3608 \r\n3 4470 5603 13876 3609 \r\n3 2080 13875 5603 3609 \r\n3 2205 13876 13875 3609 \r\n3 287 13879 13878 3610 \r\n3 4187 13877 13879 3610 \r\n3 3105 13878 13877 3610 \r\n3 1360 13881 11929 3611 \r\n3 3532 13880 13881 3611 \r\n3 3305 11929 13880 3611 \r\n3 1041 13882 11997 3612 \r\n3 3842 10074 13882 3612 \r\n3 1267 11997 10074 3612 \r\n3 3797 13884 13883 3613 \r\n3 3124 8822 13884 3613 \r\n3 3626 13883 8822 3613 \r\n3 136 13886 7577 3614 \r\n3 3398 13885 13886 3614 \r\n3 917 7577 13885 3614 \r\n3 25 13385 13888 3615 \r\n3 1375 13887 13385 3615 \r\n3 1249 13888 13887 3615 \r\n3 3369 7331 13889 3616 \r\n3 2005 6410 7331 3616 \r\n3 2111 13889 6410 3616 \r\n3 1917 13524 13891 3617 \r\n3 2432 13890 13524 3617 \r\n3 1740 13891 13890 3617 \r\n3 231 13893 13892 3618 \r\n3 968 12915 13893 3618 \r\n3 4575 13892 12915 3618 \r\n3 2020 11557 13895 3619 \r\n3 3980 13894 11557 3619 \r\n3 4189 13895 13894 3619 \r\n3 3518 5497 13897 3620 \r\n3 2096 13896 5497 3620 \r\n3 1878 13897 13896 3620 \r\n3 3029 13900 13899 3621 \r\n3 4655 13898 13900 3621 \r\n3 3755 13899 13898 3621 \r\n3 1600 13903 13902 3622 \r\n3 3662 13901 13903 3622 \r\n3 1304 13902 13901 3622 \r\n3 79 13141 13905 3623 \r\n3 439 13904 13141 3623 \r\n3 2840 13905 13904 3623 \r\n3 2010 13907 13906 3624 \r\n3 580 10555 13907 3624 \r\n3 2230 13906 10555 3624 \r\n3 1891 13910 13909 3625 \r\n3 4363 13908 13910 3625 \r\n3 4345 13909 13908 3625 \r\n3 2080 9974 13912 3626 \r\n3 779 13911 9974 3626 \r\n3 3082 13912 13911 3626 \r\n3 715 13913 5024 3627 \r\n3 2620 5711 13913 3627 \r\n3 2302 5024 5711 3627 \r\n3 2157 13916 13915 3628 \r\n3 2705 13914 13916 3628 \r\n3 4787 13915 13914 3628 \r\n3 3459 13919 13918 3629 \r\n3 2239 13917 13919 3629 \r\n3 3759 13918 13917 3629 \r\n3 2751 13922 13921 3630 \r\n3 3313 13920 13922 3630 \r\n3 3374 13921 13920 3630 \r\n3 182 13925 13924 3631 \r\n3 4657 13923 13925 3631 \r\n3 305 13924 13923 3631 \r\n3 2976 13927 13926 3632 \r\n3 3736 13690 13927 3632 \r\n3 415 13926 13690 3632 \r\n3 3072 13930 13929 3633 \r\n3 4560 13928 13930 3633 \r\n3 4690 13929 13928 3633 \r\n3 3163 13932 8117 3634 \r\n3 4637 13931 13932 3634 \r\n3 828 8117 13931 3634 \r\n3 4283 13935 13934 3635 \r\n3 1053 13933 13935 3635 \r\n3 2725 13934 13933 3635 \r\n3 1075 11000 13936 3636 \r\n3 325 8202 11000 3636 \r\n3 284 13936 8202 3636 \r\n3 1195 13938 11178 3637 \r\n3 219 13937 13938 3637 \r\n3 4765 11178 13937 3637 \r\n3 1730 13940 9252 3638 \r\n3 2756 13939 13940 3638 \r\n3 2758 9252 13939 3638 \r\n3 4203 13942 11803 3639 \r\n3 228 13941 13942 3639 \r\n3 2480 11803 13941 3639 \r\n3 1934 12426 9553 3640 \r\n3 3016 13943 12426 3640 \r\n3 1580 9553 13943 3640 \r\n3 3931 13946 13945 3641 \r\n3 2323 13944 13946 3641 \r\n3 1121 13945 13944 3641 \r\n3 1318 13947 5738 3642 \r\n3 3529 7458 13947 3642 \r\n3 1051 5738 7458 3642 \r\n3 48 13949 13948 3643 \r\n3 3701 13490 13949 3643 \r\n3 3659 13948 13490 3643 \r\n3 837 13951 13950 3644 \r\n3 1291 8041 13951 3644 \r\n3 2716 13950 8041 3644 \r\n3 2521 13952 9449 3645 \r\n3 1734 12082 13952 3645 \r\n3 3378 9449 12082 3645 \r\n3 2453 9645 13954 3646 \r\n3 1563 13953 9645 3646 \r\n3 1386 13954 13953 3646 \r\n3 3323 13957 13956 3647 \r\n3 1053 13955 13957 3647 \r\n3 4545 13956 13955 3647 \r\n3 681 5314 13959 3648 \r\n3 640 13958 5314 3648 \r\n3 2220 13959 13958 3648 \r\n3 2945 13962 13961 3649 \r\n3 485 13960 13962 3649 \r\n3 4920 13961 13960 3649 \r\n3 4989 13963 9899 3650 \r\n3 4553 6837 13963 3650 \r\n3 2710 9899 6837 3650 \r\n3 3258 12195 13964 3651 \r\n3 2102 13476 12195 3651 \r\n3 237 13964 13476 3651 \r\n3 4160 13966 10634 3652 \r\n3 741 13965 13966 3652 \r\n3 4969 10634 13965 3652 \r\n3 4954 9410 13967 3653 \r\n3 1696 11078 9410 3653 \r\n3 4775 13967 11078 3653 \r\n3 2633 13969 13636 3654 \r\n3 1900 13968 13969 3654 \r\n3 1737 13636 13968 3654 \r\n3 1392 9209 13971 3655 \r\n3 2771 13970 9209 3655 \r\n3 3293 13971 13970 3655 \r\n3 1977 8794 6423 3656 \r\n3 2153 13972 8794 3656 \r\n3 923 6423 13972 3656 \r\n3 4803 13974 13973 3657 \r\n3 3885 7961 13974 3657 \r\n3 3811 13973 7961 3657 \r\n3 2234 13976 10678 3658 \r\n3 2375 13975 13976 3658 \r\n3 105 10678 13975 3658 \r\n3 4002 12450 13978 3659 \r\n3 1094 13977 12450 3659 \r\n3 1778 13978 13977 3659 \r\n3 493 13981 13980 3660 \r\n3 4684 13979 13981 3660 \r\n3 2065 13980 13979 3660 \r\n3 642 13983 13982 3661 \r\n3 2344 13028 13983 3661 \r\n3 1748 13982 13028 3661 \r\n3 364 13986 13985 3662 \r\n3 2459 13984 13986 3662 \r\n3 4086 13985 13984 3662 \r\n3 2699 13989 13988 3663 \r\n3 4631 13987 13989 3663 \r\n3 2985 13988 13987 3663 \r\n3 3526 7436 13991 3664 \r\n3 2491 13990 7436 3664 \r\n3 3756 13991 13990 3664 \r\n3 4672 13994 13993 3665 \r\n3 3522 13992 13994 3665 \r\n3 4971 13993 13992 3665 \r\n3 2968 13996 7726 3666 \r\n3 2735 13995 13996 3666 \r\n3 1405 7726 13995 3666 \r\n3 873 10650 10633 3667 \r\n3 2136 10006 10650 3667 \r\n3 2060 10633 10006 3667 \r\n3 2111 13998 13889 3668 \r\n3 3987 13997 13998 3668 \r\n3 3369 13889 13997 3668 \r\n3 3942 14000 11572 3669 \r\n3 2207 13999 14000 3669 \r\n3 277 11572 13999 3669 \r\n3 3386 11962 14002 3670 \r\n3 3151 14001 11962 3670 \r\n3 89 14002 14001 3670 \r\n3 331 14004 9103 3671 \r\n3 2445 14003 14004 3671 \r\n3 3909 9103 14003 3671 \r\n3 4683 14005 13408 3672 \r\n3 3119 11228 14005 3672 \r\n3 1665 13408 11228 3672 \r\n3 4169 14007 11921 3673 \r\n3 825 14006 14007 3673 \r\n3 4198 11921 14006 3673 \r\n3 4697 14009 14008 3674 \r\n3 4034 8840 14009 3674 \r\n3 2852 14008 8840 3674 \r\n3 4935 12773 14010 3675 \r\n3 1774 11049 12773 3675 \r\n3 4335 14010 11049 3675 \r\n3 2178 14013 14012 3676 \r\n3 2010 14011 14013 3676 \r\n3 3838 14012 14011 3676 \r\n3 3846 14016 14015 3677 \r\n3 4270 14014 14016 3677 \r\n3 3079 14015 14014 3677 \r\n3 4314 14018 12246 3678 \r\n3 1282 14017 14018 3678 \r\n3 3505 12246 14017 3678 \r\n3 4419 14019 8813 3679 \r\n3 1807 10124 14019 3679 \r\n3 2916 8813 10124 3679 \r\n3 3394 11873 14021 3680 \r\n3 3093 14020 11873 3680 \r\n3 4795 14021 14020 3680 \r\n3 2093 11446 14022 3681 \r\n3 3826 13052 11446 3681 \r\n3 4083 14022 13052 3681 \r\n3 4895 14024 5022 3682 \r\n3 2574 14023 14024 3682 \r\n3 4540 5022 14023 3682 \r\n3 1008 12033 14025 3683 \r\n3 3263 6131 12033 3683 \r\n3 4344 14025 6131 3683 \r\n3 4439 14027 8187 3684 \r\n3 3229 14026 14027 3684 \r\n3 803 8187 14026 3684 \r\n3 1408 6989 14029 3685 \r\n3 1628 14028 6989 3685 \r\n3 3506 14029 14028 3685 \r\n3 4242 12120 6951 3686 \r\n3 2844 13372 12120 3686 \r\n3 2359 6951 13372 3686 \r\n3 1006 10119 7665 3687 \r\n3 4953 13793 10119 3687 \r\n3 2300 7665 13793 3687 \r\n3 3991 14032 14031 3688 \r\n3 1632 14030 14032 3688 \r\n3 2983 14031 14030 3688 \r\n3 4339 11663 7789 3689 \r\n3 3543 14033 11663 3689 \r\n3 3094 7789 14033 3689 \r\n3 3672 14035 14034 3690 \r\n3 1077 9287 14035 3690 \r\n3 3203 14034 9287 3690 \r\n3 4274 14037 14036 3691 \r\n3 4587 12940 14037 3691 \r\n3 4452 14036 12940 3691 \r\n3 213 9420 14039 3692 \r\n3 2059 14038 9420 3692 \r\n3 37 14039 14038 3692 \r\n3 1964 14041 10377 3693 \r\n3 1308 14040 14041 3693 \r\n3 2506 10377 14040 3693 \r\n3 2711 7854 14042 3694 \r\n3 3828 12400 7854 3694 \r\n3 4470 14042 12400 3694 \r\n3 4077 14044 14043 3695 \r\n3 2581 10164 14044 3695 \r\n3 2698 14043 10164 3695 \r\n3 2416 14047 14046 3696 \r\n3 914 14045 14047 3696 \r\n3 729 14046 14045 3696 \r\n3 725 14048 11277 3697 \r\n3 3897 12591 14048 3697 \r\n3 1582 11277 12591 3697 \r\n3 1892 14051 14050 3698 \r\n3 3341 14049 14051 3698 \r\n3 24 14050 14049 3698 \r\n3 2102 6182 13474 3699 \r\n3 4530 14052 6182 3699 \r\n3 3326 13474 14052 3699 \r\n3 1445 14054 14053 3700 \r\n3 306 5716 14054 3700 \r\n3 3147 14053 5716 3700 \r\n3 463 14056 6105 3701 \r\n3 4391 14055 14056 3701 \r\n3 3496 6105 14055 3701 \r\n3 3993 12255 14058 3702 \r\n3 2107 14057 12255 3702 \r\n3 3695 14058 14057 3702 \r\n3 1377 14061 14060 3703 \r\n3 3621 14059 14061 3703 \r\n3 4580 14060 14059 3703 \r\n3 4665 14062 8594 3704 \r\n3 1546 9428 14062 3704 \r\n3 2800 8594 9428 3704 \r\n3 3813 14064 14063 3705 \r\n3 2258 9920 14064 3705 \r\n3 4993 14063 9920 3705 \r\n3 4798 14065 11733 3706 \r\n3 2634 11721 14065 3706 \r\n3 3389 11733 11721 3706 \r\n3 4584 14067 11665 3707 \r\n3 2105 14066 14067 3707 \r\n3 4094 11665 14066 3707 \r\n3 3967 14069 12435 3708 \r\n3 2847 14068 14069 3708 \r\n3 4234 12435 14068 3708 \r\n3 1703 14071 14070 3709 \r\n3 2075 7241 14071 3709 \r\n3 4991 14070 7241 3709 \r\n3 1278 13436 14072 3710 \r\n3 1417 13353 13436 3710 \r\n3 2502 14072 13353 3710 \r\n3 863 14075 14074 3711 \r\n3 4572 14073 14075 3711 \r\n3 1406 14074 14073 3711 \r\n3 1907 8305 14076 3712 \r\n3 1814 5267 8305 3712 \r\n3 3928 14076 5267 3712 \r\n3 3558 14078 14077 3713 \r\n3 639 5054 14078 3713 \r\n3 4421 14077 5054 3713 \r\n3 2982 14080 12217 3714 \r\n3 4310 14079 14080 3714 \r\n3 27 12217 14079 3714 \r\n3 937 14083 14082 3715 \r\n3 3199 14081 14083 3715 \r\n3 2697 14082 14081 3715 \r\n3 1268 14085 11459 3716 \r\n3 157 14084 14085 3716 \r\n3 520 11459 14084 3716 \r\n3 3594 9370 14087 3717 \r\n3 116 14086 9370 3717 \r\n3 280 14087 14086 3717 \r\n3 1000 8086 8655 3718 \r\n3 572 9955 8086 3718 \r\n3 1140 8655 9955 3718 \r\n3 2527 11376 14089 3719 \r\n3 3266 14088 11376 3719 \r\n3 1980 14089 14088 3719 \r\n3 3795 6840 14091 3720 \r\n3 4208 14090 6840 3720 \r\n3 3849 14091 14090 3720 \r\n3 4547 14094 14093 3721 \r\n3 4454 14092 14094 3721 \r\n3 1370 14093 14092 3721 \r\n3 4728 14097 14096 3722 \r\n3 4146 14095 14097 3722 \r\n3 3888 14096 14095 3722 \r\n3 2402 12916 14099 3723 \r\n3 968 14098 12916 3723 \r\n3 870 14099 14098 3723 \r\n3 2411 14101 14100 3724 \r\n3 2056 12136 14101 3724 \r\n3 4292 14100 12136 3724 \r\n3 1171 14104 14103 3725 \r\n3 2383 14102 14104 3725 \r\n3 1557 14103 14102 3725 \r\n3 2442 14106 14105 3726 \r\n3 1244 7028 14106 3726 \r\n3 3193 14105 7028 3726 \r\n3 3440 14109 14108 3727 \r\n3 3166 14107 14109 3727 \r\n3 4882 14108 14107 3727 \r\n3 1989 6533 8567 3728 \r\n3 495 14110 6533 3728 \r\n3 2702 8567 14110 3728 \r\n3 4704 14112 8909 3729 \r\n3 161 14111 14112 3729 \r\n3 1361 8909 14111 3729 \r\n3 3790 9628 14113 3730 \r\n3 3077 12009 9628 3730 \r\n3 4238 14113 12009 3730 \r\n3 1252 14115 14114 3731 \r\n3 1968 7318 14115 3731 \r\n3 1880 14114 7318 3731 \r\n3 4072 14117 10914 3732 \r\n3 395 14116 14117 3732 \r\n3 173 10914 14116 3732 \r\n3 1996 14119 13850 3733 \r\n3 973 14118 14119 3733 \r\n3 4881 13850 14118 3733 \r\n3 4661 14121 14120 3734 \r\n3 3843 9199 14121 3734 \r\n3 794 14120 9199 3734 \r\n3 1371 14124 14123 3735 \r\n3 2729 14122 14124 3735 \r\n3 2145 14123 14122 3735 \r\n3 4495 8321 6492 3736 \r\n3 1217 14125 8321 3736 \r\n3 2733 6492 14125 3736 \r\n3 3662 14127 13901 3737 \r\n3 2489 14126 14127 3737 \r\n3 1304 13901 14126 3737 \r\n3 1480 14130 14129 3738 \r\n3 2778 14128 14130 3738 \r\n3 4875 14129 14128 3738 \r\n3 3303 14133 14132 3739 \r\n3 2365 14131 14133 3739 \r\n3 4382 14132 14131 3739 \r\n3 501 14135 12065 3740 \r\n3 4113 14134 14135 3740 \r\n3 4736 12065 14134 3740 \r\n3 867 14138 14137 3741 \r\n3 3334 14136 14138 3741 \r\n3 3997 14137 14136 3741 \r\n3 3748 14139 12417 3742 \r\n3 683 11666 14139 3742 \r\n3 4094 12417 11666 3742 \r\n3 4035 14142 14141 3743 \r\n3 3021 14140 14142 3743 \r\n3 478 14141 14140 3743 \r\n3 2697 14081 7766 3744 \r\n3 3199 14143 14081 3744 \r\n3 4219 7766 14143 3744 \r\n3 2373 14144 8466 3745 \r\n3 1020 10319 14144 3745 \r\n3 4292 8466 10319 3745 \r\n3 3881 12617 14145 3746 \r\n3 41 8651 12617 3746 \r\n3 2544 14145 8651 3746 \r\n3 526 12559 14146 3747 \r\n3 2810 5689 12559 3747 \r\n3 183 14146 5689 3747 \r\n3 3803 13721 14148 3748 \r\n3 1301 14147 13721 3748 \r\n3 2163 14148 14147 3748 \r\n3 1068 8410 14150 3749 \r\n3 1457 14149 8410 3749 \r\n3 1066 14150 14149 3749 \r\n3 2456 11299 11639 3750 \r\n3 2147 14151 11299 3750 \r\n3 3452 11639 14151 3750 \r\n3 4407 14153 10604 3751 \r\n3 4874 14152 14153 3751 \r\n3 3537 10604 14152 3751 \r\n3 3707 14155 7965 3752 \r\n3 506 14154 14155 3752 \r\n3 135 7965 14154 3752 \r\n3 1579 14157 14156 3753 \r\n3 3109 8656 14157 3753 \r\n3 4249 14156 8656 3753 \r\n3 1322 11936 9276 3754 \r\n3 2521 14158 11936 3754 \r\n3 3204 9276 14158 3754 \r\n3 4676 14160 14159 3755 \r\n3 2497 13249 14160 3755 \r\n3 4806 14159 13249 3755 \r\n3 2925 14163 14162 3756 \r\n3 4518 14161 14163 3756 \r\n3 2407 14162 14161 3756 \r\n3 3805 14166 14165 3757 \r\n3 970 14164 14166 3757 \r\n3 1145 14165 14164 3757 \r\n3 2608 11275 13422 3758 \r\n3 1941 14167 11275 3758 \r\n3 446 13422 14167 3758 \r\n3 1396 14170 14169 3759 \r\n3 494 14168 14170 3759 \r\n3 2286 14169 14168 3759 \r\n3 2233 14173 14172 3760 \r\n3 4466 14171 14173 3760 \r\n3 2761 14172 14171 3760 \r\n3 1932 13306 10750 3761 \r\n3 3225 14174 13306 3761 \r\n3 4566 10750 14174 3761 \r\n3 1948 5184 13189 3762 \r\n3 4419 8812 5184 3762 \r\n3 2832 13189 8812 3762 \r\n3 2390 14176 14175 3763 \r\n3 1412 9865 14176 3763 \r\n3 3667 14175 9865 3763 \r\n3 1470 14179 14178 3764 \r\n3 1837 14177 14179 3764 \r\n3 1180 14178 14177 3764 \r\n3 3015 8132 14181 3765 \r\n3 245 14180 8132 3765 \r\n3 3807 14181 14180 3765 \r\n3 4168 14184 14183 3766 \r\n3 3662 14182 14184 3766 \r\n3 1656 14183 14182 3766 \r\n3 100 14187 14186 3767 \r\n3 511 14185 14187 3767 \r\n3 3734 14186 14185 3767 \r\n3 1284 11374 14189 3768 \r\n3 203 14188 11374 3768 \r\n3 4720 14189 14188 3768 \r\n3 186 9298 14191 3769 \r\n3 965 14190 9298 3769 \r\n3 4015 14191 14190 3769 \r\n3 4728 14193 14192 3770 \r\n3 2452 5446 14193 3770 \r\n3 381 14192 5446 3770 \r\n3 2201 14194 12337 3771 \r\n3 3010 5585 14194 3771 \r\n3 4740 12337 5585 3771 \r\n3 50 14197 14196 3772 \r\n3 2566 14195 14197 3772 \r\n3 4642 14196 14195 3772 \r\n3 4969 14200 14199 3773 \r\n3 921 14198 14200 3773 \r\n3 1598 14199 14198 3773 \r\n3 2913 6032 14201 3774 \r\n3 2713 10592 6032 3774 \r\n3 2326 14201 10592 3774 \r\n3 1185 5387 10236 3775 \r\n3 4141 14202 5387 3775 \r\n3 4966 10236 14202 3775 \r\n3 2443 14205 14204 3776 \r\n3 1942 14203 14205 3776 \r\n3 3517 14204 14203 3776 \r\n3 2030 14206 7169 3777 \r\n3 1700 6787 14206 3777 \r\n3 1305 7169 6787 3777 \r\n3 4959 10815 8177 3778 \r\n3 2671 10402 10815 3778 \r\n3 2223 8177 10402 3778 \r\n3 1943 11232 14208 3779 \r\n3 2498 14207 11232 3779 \r\n3 202 14208 14207 3779 \r\n3 4218 14211 14210 3780 \r\n3 4420 14209 14211 3780 \r\n3 530 14210 14209 3780 \r\n3 2517 9582 14213 3781 \r\n3 4505 14212 9582 3781 \r\n3 2820 14213 14212 3781 \r\n3 1630 14215 8915 3782 \r\n3 2452 14214 14215 3782 \r\n3 4576 8915 14214 3782 \r\n3 1865 12313 14216 3783 \r\n3 536 13752 12313 3783 \r\n3 2029 14216 13752 3783 \r\n3 3592 14219 14218 3784 \r\n3 384 14217 14219 3784 \r\n3 3356 14218 14217 3784 \r\n3 2750 12994 14221 3785 \r\n3 753 14220 12994 3785 \r\n3 4759 14221 14220 3785 \r\n3 3226 14223 7437 3786 \r\n3 2190 14222 14223 3786 \r\n3 1018 7437 14222 3786 \r\n3 3943 14224 8638 3787 \r\n3 1488 13827 14224 3787 \r\n3 4743 8638 13827 3787 \r\n3 987 14227 14226 3788 \r\n3 2901 14225 14227 3788 \r\n3 1671 14226 14225 3788 \r\n3 2121 11252 12811 3789 \r\n3 2729 14228 11252 3789 \r\n3 513 12811 14228 3789 \r\n3 2274 14230 14229 3790 \r\n3 4784 11469 14230 3790 \r\n3 42 14229 11469 3790 \r\n3 10 12041 14232 3791 \r\n3 2411 14231 12041 3791 \r\n3 712 14232 14231 3791 \r\n3 3374 10337 13921 3792 \r\n3 2969 14233 10337 3792 \r\n3 2751 13921 14233 3792 \r\n3 2502 14234 14072 3793 \r\n3 3936 6601 14234 3793 \r\n3 1278 14072 6601 3793 \r\n3 2178 14012 7849 3794 \r\n3 3838 8726 14012 3794 \r\n3 1058 7849 8726 3794 \r\n3 1961 14237 14236 3795 \r\n3 1353 14235 14237 3795 \r\n3 2923 14236 14235 3795 \r\n3 3196 8796 12382 3796 \r\n3 3245 7141 8796 3796 \r\n3 2180 12382 7141 3796 \r\n3 944 12128 14239 3797 \r\n3 3974 14238 12128 3797 \r\n3 1969 14239 14238 3797 \r\n3 3522 13197 14241 3798 \r\n3 82 14240 13197 3798 \r\n3 631 14241 14240 3798 \r\n3 2523 14244 14243 3799 \r\n3 2789 14242 14244 3799 \r\n3 440 14243 14242 3799 \r\n3 1053 14246 14245 3800 \r\n3 4412 8627 14246 3800 \r\n3 2112 14245 8627 3800 \r\n3 663 6775 14248 3801 \r\n3 3134 14247 6775 3801 \r\n3 4656 14248 14247 3801 \r\n3 1245 14251 14250 3802 \r\n3 4430 14249 14251 3802 \r\n3 4762 14250 14249 3802 \r\n3 1871 14254 14253 3803 \r\n3 2216 14252 14254 3803 \r\n3 2651 14253 14252 3803 \r\n3 962 12618 7832 3804 \r\n3 2927 14255 12618 3804 \r\n3 838 7832 14255 3804 \r\n3 2396 13562 9819 3805 \r\n3 4425 14256 13562 3805 \r\n3 2455 9819 14256 3805 \r\n3 2496 6540 14258 3806 \r\n3 459 14257 6540 3806 \r\n3 1262 14258 14257 3806 \r\n3 608 14260 6452 3807 \r\n3 1523 14259 14260 3807 \r\n3 1848 6452 14259 3807 \r\n3 1564 14261 7950 3808 \r\n3 1276 11037 14261 3808 \r\n3 2192 7950 11037 3808 \r\n3 4051 14264 14263 3809 \r\n3 2090 14262 14264 3809 \r\n3 3003 14263 14262 3809 \r\n3 713 14266 14265 3810 \r\n3 2465 5900 14266 3810 \r\n3 4926 14265 5900 3810 \r\n3 838 14255 14268 3811 \r\n3 2927 14267 14255 3811 \r\n3 2037 14268 14267 3811 \r\n3 3940 5628 14269 3812 \r\n3 2093 14022 5628 3812 \r\n3 4083 14269 14022 3812 \r\n3 2807 14270 13746 3813 \r\n3 1460 10174 14270 3813 \r\n3 2880 13746 10174 3813 \r\n3 3938 14272 14271 3814 \r\n3 4605 6478 14272 3814 \r\n3 1298 14271 6478 3814 \r\n3 3037 14275 14274 3815 \r\n3 1861 14273 14275 3815 \r\n3 4503 14274 14273 3815 \r\n3 2201 8274 14276 3816 \r\n3 1202 5162 8274 3816 \r\n3 4110 14276 5162 3816 \r\n3 4218 14210 14278 3817 \r\n3 530 14277 14210 3817 \r\n3 1105 14278 14277 3817 \r\n3 4789 14281 14280 3818 \r\n3 4324 14279 14281 3818 \r\n3 4332 14280 14279 3818 \r\n3 4812 6608 12876 3819 \r\n3 1411 14282 6608 3819 \r\n3 3400 12876 14282 3819 \r\n3 3120 14284 14283 3820 \r\n3 4469 10330 14284 3820 \r\n3 4864 14283 10330 3820 \r\n3 2480 14287 14286 3821 \r\n3 3148 14285 14287 3821 \r\n3 2621 14286 14285 3821 \r\n3 1204 14290 14289 3822 \r\n3 2721 14288 14290 3822 \r\n3 4159 14289 14288 3822 \r\n3 3681 14292 13228 3823 \r\n3 3190 14291 14292 3823 \r\n3 7 13228 14291 3823 \r\n3 2364 14293 7909 3824 \r\n3 4631 13989 14293 3824 \r\n3 2699 7909 13989 3824 \r\n3 1542 9676 14294 3825 \r\n3 1437 9990 9676 3825 \r\n3 4430 14294 9990 3825 \r\n3 2093 14296 14295 3826 \r\n3 3318 9850 14296 3826 \r\n3 1562 14295 9850 3826 \r\n3 2408 14299 14298 3827 \r\n3 3082 14297 14299 3827 \r\n3 762 14298 14297 3827 \r\n3 3645 14301 9719 3828 \r\n3 3330 14300 14301 3828 \r\n3 188 9719 14300 3828 \r\n3 4389 10796 14303 3829 \r\n3 631 14302 10796 3829 \r\n3 3509 14303 14302 3829 \r\n3 2304 14306 14305 3830 \r\n3 362 14304 14306 3830 \r\n3 3557 14305 14304 3830 \r\n3 1027 14309 14308 3831 \r\n3 1554 14307 14309 3831 \r\n3 1799 14308 14307 3831 \r\n3 434 14311 7555 3832 \r\n3 270 14310 14311 3832 \r\n3 3248 7555 14310 3832 \r\n3 1615 14312 13421 3833 \r\n3 1894 12913 14312 3833 \r\n3 2608 13421 12913 3833 \r\n3 4810 14314 14313 3834 \r\n3 4387 10490 14314 3834 \r\n3 2464 14313 10490 3834 \r\n3 1830 14316 8980 3835 \r\n3 3365 14315 14316 3835 \r\n3 2922 8980 14315 3835 \r\n3 3418 14318 12327 3836 \r\n3 609 14317 14318 3836 \r\n3 3442 12327 14317 3836 \r\n3 4303 14319 11033 3837 \r\n3 4239 10001 14319 3837 \r\n3 1929 11033 10001 3837 \r\n3 4577 13546 14320 3838 \r\n3 3271 12956 13546 3838 \r\n3 133 14320 12956 3838 \r\n3 1357 14321 9571 3839 \r\n3 2831 9074 14321 3839 \r\n3 3975 9571 9074 3839 \r\n3 4295 14324 14323 3840 \r\n3 1956 14322 14324 3840 \r\n3 4147 14323 14322 3840 \r\n3 2207 14326 13999 3841 \r\n3 2815 14325 14326 3841 \r\n3 277 13999 14325 3841 \r\n3 843 14329 14328 3842 \r\n3 2235 14327 14329 3842 \r\n3 1211 14328 14327 3842 \r\n3 554 14332 14331 3843 \r\n3 4162 14330 14332 3843 \r\n3 2135 14331 14330 3843 \r\n3 1619 14335 14334 3844 \r\n3 1298 14333 14335 3844 \r\n3 2558 14334 14333 3844 \r\n3 3 14338 14337 3845 \r\n3 4021 14336 14338 3845 \r\n3 1867 14337 14336 3845 \r\n3 2250 14340 14339 3846 \r\n3 1315 6841 14340 3846 \r\n3 3795 14339 6841 3846 \r\n3 2935 14341 8945 3847 \r\n3 4694 9077 14341 3847 \r\n3 3721 8945 9077 3847 \r\n3 2682 14342 8772 3848 \r\n3 4461 12483 14342 3848 \r\n3 571 8772 12483 3848 \r\n3 4751 9726 14344 3849 \r\n3 3231 14343 9726 3849 \r\n3 3628 14344 14343 3849 \r\n3 4795 14020 14346 3850 \r\n3 3093 14345 14020 3850 \r\n3 4039 14346 14345 3850 \r\n3 947 14349 14348 3851 \r\n3 1220 14347 14349 3851 \r\n3 3209 14348 14347 3851 \r\n3 2426 13146 14350 3852 \r\n3 1923 12474 13146 3852 \r\n3 1093 14350 12474 3852 \r\n3 4301 14353 14352 3853 \r\n3 3718 14351 14353 3853 \r\n3 242 14352 14351 3853 \r\n3 2483 14355 11060 3854 \r\n3 1845 14354 14355 3854 \r\n3 3527 11060 14354 3854 \r\n3 1293 14358 14357 3855 \r\n3 512 14356 14358 3855 \r\n3 576 14357 14356 3855 \r\n3 3477 13444 12989 3856 \r\n3 346 7333 13444 3856 \r\n3 2596 12989 7333 3856 \r\n3 3143 14361 14360 3857 \r\n3 3569 14359 14361 3857 \r\n3 1688 14360 14359 3857 \r\n3 3029 13899 8709 3858 \r\n3 3755 5556 13899 3858 \r\n3 2047 8709 5556 3858 \r\n3 4389 14303 14363 3859 \r\n3 3509 14362 14303 3859 \r\n3 2592 14363 14362 3859 \r\n3 2537 5751 14365 3860 \r\n3 1060 14364 5751 3860 \r\n3 433 14365 14364 3860 \r\n3 922 14368 14367 3861 \r\n3 4152 14366 14368 3861 \r\n3 273 14367 14366 3861 \r\n3 1821 14371 14370 3862 \r\n3 3623 14369 14371 3862 \r\n3 2691 14370 14369 3862 \r\n3 3226 14374 14373 3863 \r\n3 1927 14372 14374 3863 \r\n3 1755 14373 14372 3863 \r\n3 2387 6591 14376 3864 \r\n3 564 14375 6591 3864 \r\n3 944 14376 14375 3864 \r\n3 2566 14378 5679 3865 \r\n3 3737 14377 14378 3865 \r\n3 4592 5679 14377 3865 \r\n3 2041 13812 14379 3866 \r\n3 4986 9668 13812 3866 \r\n3 3501 14379 9668 3866 \r\n3 2000 10028 14381 3867 \r\n3 62 14380 10028 3867 \r\n3 4099 14381 14380 3867 \r\n3 3196 6755 8797 3868 \r\n3 4424 10929 6755 3868 \r\n3 3910 8797 10929 3868 \r\n3 4985 11064 14382 3869 \r\n3 3020 7065 11064 3869 \r\n3 1937 14382 7065 3869 \r\n3 4873 14384 14383 3870 \r\n3 393 13134 14384 3870 \r\n3 4016 14383 13134 3870 \r\n3 2361 11322 13787 3871 \r\n3 1574 14385 11322 3871 \r\n3 4796 13787 14385 3871 \r\n3 1959 14387 14386 3872 \r\n3 796 13194 14387 3872 \r\n3 2798 14386 13194 3872 \r\n3 2020 13895 14389 3873 \r\n3 4189 14388 13895 3873 \r\n3 3127 14389 14388 3873 \r\n3 1745 14390 9881 3874 \r\n3 3995 7731 14390 3874 \r\n3 2208 9881 7731 3874 \r\n3 2054 14393 14392 3875 \r\n3 1997 14391 14393 3875 \r\n3 3474 14392 14391 3875 \r\n3 2709 11866 14395 3876 \r\n3 2839 14394 11866 3876 \r\n3 297 14395 14394 3876 \r\n3 4195 14398 14397 3877 \r\n3 4331 14396 14398 3877 \r\n3 286 14397 14396 3877 \r\n3 3756 13990 14400 3878 \r\n3 2491 14399 13990 3878 \r\n3 3230 14400 14399 3878 \r\n3 4712 14402 6365 3879 \r\n3 4373 14401 14402 3879 \r\n3 2985 6365 14401 3879 \r\n3 4069 8610 14404 3880 \r\n3 3272 14403 8610 3880 \r\n3 3023 14404 14403 3880 \r\n3 3122 7734 11714 3881 \r\n3 3237 13211 7734 3881 \r\n3 4538 11714 13211 3881 \r\n3 2658 14407 14406 3882 \r\n3 3588 14405 14407 3882 \r\n3 3097 14406 14405 3882 \r\n3 2001 14410 14409 3883 \r\n3 3853 14408 14410 3883 \r\n3 366 14409 14408 3883 \r\n3 4754 14413 14412 3884 \r\n3 3629 14411 14413 3884 \r\n3 2777 14412 14411 3884 \r\n3 3472 10107 14414 3885 \r\n3 2548 9610 10107 3885 \r\n3 1255 14414 9610 3885 \r\n3 2018 8744 14416 3886 \r\n3 4058 14415 8744 3886 \r\n3 1721 14416 14415 3886 \r\n3 860 14417 11262 3887 \r\n3 2297 13540 14417 3887 \r\n3 1338 11262 13540 3887 \r\n3 1942 14420 14419 3888 \r\n3 1167 14418 14420 3888 \r\n3 955 14419 14418 3888 \r\n3 3286 14423 14422 3889 \r\n3 2870 14421 14423 3889 \r\n3 319 14422 14421 3889 \r\n3 3945 14426 14425 3890 \r\n3 3919 14424 14426 3890 \r\n3 2210 14425 14424 3890 \r\n3 2193 14428 14427 3891 \r\n3 3236 12693 14428 3891 \r\n3 4290 14427 12693 3891 \r\n3 4086 13984 8226 3892 \r\n3 2459 14429 13984 3892 \r\n3 2089 8226 14429 3892 \r\n3 855 14430 6715 3893 \r\n3 3300 13771 14430 3893 \r\n3 2327 6715 13771 3893 \r\n3 2923 13205 14236 3894 \r\n3 1243 7398 13205 3894 \r\n3 1961 14236 7398 3894 \r\n3 358 7817 6146 3895 \r\n3 453 14431 7817 3895 \r\n3 361 6146 14431 3895 \r\n3 3204 13645 14432 3896 \r\n3 760 13471 13645 3896 \r\n3 1681 14432 13471 3896 \r\n3 4623 14434 14433 3897 \r\n3 1664 7772 14434 3897 \r\n3 1458 14433 7772 3897 \r\n3 1087 9334 14435 3898 \r\n3 2257 11725 9334 3898 \r\n3 4080 14435 11725 3898 \r\n3 1488 14438 14437 3899 \r\n3 1136 14436 14438 3899 \r\n3 3463 14437 14436 3899 \r\n3 3804 14440 14439 3900 \r\n3 1168 13578 14440 3900 \r\n3 643 14439 13578 3900 \r\n3 1982 13362 14442 3901 \r\n3 3392 14441 13362 3901 \r\n3 1222 14442 14441 3901 \r\n3 210 14445 14444 3902 \r\n3 2549 14443 14445 3902 \r\n3 4176 14444 14443 3902 \r\n3 1711 14448 14447 3903 \r\n3 3325 14446 14448 3903 \r\n3 827 14447 14446 3903 \r\n3 3314 14450 5244 3904 \r\n3 4322 14449 14450 3904 \r\n3 4334 5244 14449 3904 \r\n3 1108 10347 14452 3905 \r\n3 4636 14451 10347 3905 \r\n3 3669 14452 14451 3905 \r\n3 4349 14453 7604 3906 \r\n3 2106 6830 14453 3906 \r\n3 3671 7604 6830 3906 \r\n3 1620 14455 5057 3907 \r\n3 4057 14454 14455 3907 \r\n3 1497 5057 14454 3907 \r\n3 583 14458 14457 3908 \r\n3 2217 14456 14458 3908 \r\n3 1179 14457 14456 3908 \r\n3 946 14460 14459 3909 \r\n3 2924 11024 14460 3909 \r\n3 4348 14459 11024 3909 \r\n3 1348 14463 14462 3910 \r\n3 3498 14461 14463 3910 \r\n3 2886 14462 14461 3910 \r\n3 1090 11759 5316 3911 \r\n3 1693 14464 11759 3911 \r\n3 640 5316 14464 3911 \r\n3 78 13591 14465 3912 \r\n3 4050 12455 13591 3912 \r\n3 2892 14465 12455 3912 \r\n3 4364 12150 14467 3913 \r\n3 4112 14466 12150 3913 \r\n3 179 14467 14466 3913 \r\n3 2498 14468 14207 3914 \r\n3 3276 11746 14468 3914 \r\n3 202 14207 11746 3914 \r\n3 740 9075 14470 3915 \r\n3 4694 14469 9075 3915 \r\n3 3492 14470 14469 3915 \r\n3 2329 5565 14472 3916 \r\n3 4396 14471 5565 3916 \r\n3 178 14472 14471 3916 \r\n3 4209 14475 14474 3917 \r\n3 2438 14473 14475 3917 \r\n3 1682 14474 14473 3917 \r\n3 2984 14477 13252 3918 \r\n3 1611 14476 14477 3918 \r\n3 661 13252 14476 3918 \r\n3 1067 7404 8646 3919 \r\n3 57 14478 7404 3919 \r\n3 4097 8646 14478 3919 \r\n3 3692 14480 14479 3920 \r\n3 1280 6278 14480 3920 \r\n3 3280 14479 6278 3920 \r\n3 1586 14483 14482 3921 \r\n3 1190 14481 14483 3921 \r\n3 318 14482 14481 3921 \r\n3 3861 14485 14484 3922 \r\n3 1983 9621 14485 3922 \r\n3 3069 14484 9621 3922 \r\n3 4940 14487 14486 3923 \r\n3 333 13132 14487 3923 \r\n3 393 14486 13132 3923 \r\n3 1153 14488 13716 3924 \r\n3 4595 12452 14488 3924 \r\n3 4537 13716 12452 3924 \r\n3 405 14490 8219 3925 \r\n3 3255 14489 14490 3925 \r\n3 267 8219 14489 3925 \r\n3 2304 14492 14306 3926 \r\n3 1675 14491 14492 3926 \r\n3 362 14306 14491 3926 \r\n3 1652 12155 8711 3927 \r\n3 572 8085 12155 3927 \r\n3 2593 8711 8085 3927 \r\n3 2512 13631 13763 3928 \r\n3 1153 13715 13631 3928 \r\n3 2310 13763 13715 3928 \r\n3 4644 14495 14494 3929 \r\n3 741 14493 14495 3929 \r\n3 891 14494 14493 3929 \r\n3 173 14497 10915 3930 \r\n3 3781 14496 14497 3930 \r\n3 717 10915 14496 3930 \r\n3 4585 13818 14499 3931 \r\n3 382 14498 13818 3931 \r\n3 4157 14499 14498 3931 \r\n3 2323 14502 14501 3932 \r\n3 1979 14500 14502 3932 \r\n3 2985 14501 14500 3932 \r\n3 3040 10098 5427 3933 \r\n3 4965 8318 10098 3933 \r\n3 1043 5427 8318 3933 \r\n3 1235 10823 14504 3934 \r\n3 1500 14503 10823 3934 \r\n3 158 14504 14503 3934 \r\n3 4407 10606 5766 3935 \r\n3 4921 12175 10606 3935 \r\n3 3815 5766 12175 3935 \r\n3 3545 14506 14505 3936 \r\n3 2129 12340 14506 3936 \r\n3 4519 14505 12340 3936 \r\n3 3798 6085 13791 3937 \r\n3 3877 8382 6085 3937 \r\n3 3617 13791 8382 3937 \r\n3 3041 14508 14507 3938 \r\n3 3052 5626 14508 3938 \r\n3 3940 14507 5626 3938 \r\n3 2962 14509 12826 3939 \r\n3 2674 5347 14509 3939 \r\n3 1950 12826 5347 3939 \r\n3 470 6264 14511 3940 \r\n3 2196 14510 6264 3940 \r\n3 4477 14511 14510 3940 \r\n3 288 14514 14513 3941 \r\n3 3839 14512 14514 3941 \r\n3 4465 14513 14512 3941 \r\n3 4626 14515 11320 3942 \r\n3 2199 10349 14515 3942 \r\n3 2338 11320 10349 3942 \r\n3 67 14517 14516 3943 \r\n3 4488 8411 14517 3943 \r\n3 1068 14516 8411 3943 \r\n3 4610 14520 14519 3944 \r\n3 90 14518 14520 3944 \r\n3 1393 14519 14518 3944 \r\n3 1870 6240 9579 3945 \r\n3 3039 14521 6240 3945 \r\n3 3207 9579 14521 3945 \r\n3 4917 14523 14522 3946 \r\n3 4945 9290 14523 3946 \r\n3 584 14522 9290 3946 \r\n3 2627 14526 14525 3947 \r\n3 388 14524 14526 3947 \r\n3 2688 14525 14524 3947 \r\n3 2319 11514 11388 3948 \r\n3 1858 13296 11514 3948 \r\n3 4806 11388 13296 3948 \r\n3 3001 14528 14527 3949 \r\n3 1204 9293 14528 3949 \r\n3 1766 14527 9293 3949 \r\n3 2649 11904 14530 3950 \r\n3 2348 14529 11904 3950 \r\n3 472 14530 14529 3950 \r\n3 3163 14532 13932 3951 \r\n3 2685 14531 14532 3951 \r\n3 4637 13932 14531 3951 \r\n3 653 14534 14533 3952 \r\n3 38 10531 14534 3952 \r\n3 4878 14533 10531 3952 \r\n3 247 14537 14536 3953 \r\n3 2124 14535 14537 3953 \r\n3 84 14536 14535 3953 \r\n3 2757 6443 11701 3954 \r\n3 479 5736 6443 3954 \r\n3 4984 11701 5736 3954 \r\n3 678 14540 14539 3955 \r\n3 2362 14538 14540 3955 \r\n3 2202 14539 14538 3955 \r\n3 2439 6524 10052 3956 \r\n3 615 11007 6524 3956 \r\n3 2949 10052 11007 3956 \r\n3 3958 10703 12170 3957 \r\n3 572 12156 10703 3957 \r\n3 3283 12170 12156 3957 \r\n3 4186 14543 14542 3958 \r\n3 356 14541 14543 3958 \r\n3 2424 14542 14541 3958 \r\n3 4941 14546 14545 3959 \r\n3 4038 14544 14546 3959 \r\n3 3971 14545 14544 3959 \r\n3 2469 14548 14547 3960 \r\n3 2805 8404 14548 3960 \r\n3 1104 14547 8404 3960 \r\n3 3476 14550 10667 3961 \r\n3 3134 14549 14550 3961 \r\n3 3033 10667 14549 3961 \r\n3 3347 14552 14551 3962 \r\n3 4310 14080 14552 3962 \r\n3 2982 14551 14080 3962 \r\n3 1606 14555 14554 3963 \r\n3 4970 14553 14555 3963 \r\n3 174 14554 14553 3963 \r\n3 4893 13496 6098 3964 \r\n3 23 12079 13496 3964 \r\n3 2492 6098 12079 3964 \r\n3 150 14558 14557 3965 \r\n3 3027 14556 14558 3965 \r\n3 168 14557 14556 3965 \r\n3 2313 14559 9313 3966 \r\n3 2461 5037 14559 3966 \r\n3 954 9313 5037 3966 \r\n3 1573 14562 14561 3967 \r\n3 1598 14560 14562 3967 \r\n3 1605 14561 14560 3967 \r\n3 4067 14564 14563 3968 \r\n3 548 10588 14564 3968 \r\n3 2526 14563 10588 3968 \r\n3 2090 14264 7550 3969 \r\n3 4051 14565 14264 3969 \r\n3 2044 7550 14565 3969 \r\n3 3601 14568 14567 3970 \r\n3 1920 14566 14568 3970 \r\n3 4764 14567 14566 3970 \r\n3 4690 13928 14570 3971 \r\n3 4560 14569 13928 3971 \r\n3 2220 14570 14569 3971 \r\n3 4632 14572 6162 3972 \r\n3 1343 14571 14572 3972 \r\n3 3444 6162 14571 3972 \r\n3 4327 14574 13181 3973 \r\n3 4638 14573 14574 3973 \r\n3 626 13181 14573 3973 \r\n3 2963 14577 14576 3974 \r\n3 2336 14575 14577 3974 \r\n3 1269 14576 14575 3974 \r\n3 2133 7346 10820 3975 \r\n3 1045 5163 7346 3975 \r\n3 1202 10820 5163 3975 \r\n3 1040 9382 13158 3976 \r\n3 694 14578 9382 3976 \r\n3 1237 13158 14578 3976 \r\n3 4365 14581 14580 3977 \r\n3 3792 14579 14581 3977 \r\n3 1971 14580 14579 3977 \r\n3 2037 14267 14582 3978 \r\n3 2927 10157 14267 3978 \r\n3 3394 14582 10157 3978 \r\n3 841 14585 14584 3979 \r\n3 1971 14583 14585 3979 \r\n3 978 14584 14583 3979 \r\n3 4097 14587 8647 3980 \r\n3 1765 14586 14587 3980 \r\n3 4331 8647 14586 3980 \r\n3 3331 14589 13705 3981 \r\n3 3155 14588 14589 3981 \r\n3 4325 13705 14588 3981 \r\n3 1197 10497 5966 3982 \r\n3 3641 14590 10497 3982 \r\n3 457 5966 14590 3982 \r\n3 3317 14592 12386 3983 \r\n3 181 14591 14592 3983 \r\n3 2538 12386 14591 3983 \r\n3 2729 14124 14228 3984 \r\n3 1371 14593 14124 3984 \r\n3 513 14228 14593 3984 \r\n3 2865 14595 14594 3985 \r\n3 2292 9462 14595 3985 \r\n3 3660 14594 9462 3985 \r\n3 1270 14597 5800 3986 \r\n3 1630 14596 14597 3986 \r\n3 3947 5800 14596 3986 \r\n3 3048 13155 14598 3987 \r\n3 4275 10016 13155 3987 \r\n3 4482 14598 10016 3987 \r\n3 2937 14600 12872 3988 \r\n3 3585 14599 14600 3988 \r\n3 1148 12872 14599 3988 \r\n3 3448 14603 14602 3989 \r\n3 2854 14601 14603 3989 \r\n3 2247 14602 14601 3989 \r\n3 3961 14604 10468 3990 \r\n3 3217 9997 14604 3990 \r\n3 4719 10468 9997 3990 \r\n3 611 14607 14606 3991 \r\n3 109 14605 14607 3991 \r\n3 4294 14606 14605 3991 \r\n3 2193 14427 9671 3992 \r\n3 4290 14608 14427 3992 \r\n3 2928 9671 14608 3992 \r\n3 2969 14610 14233 3993 \r\n3 4534 14609 14610 3993 \r\n3 2751 14233 14609 3993 \r\n3 1051 14612 8458 3994 \r\n3 4355 14611 14612 3994 \r\n3 60 8458 14611 3994 \r\n3 2702 14110 14613 3995 \r\n3 495 13213 14110 3995 \r\n3 3294 14613 13213 3995 \r\n3 4098 14615 14614 3996 \r\n3 4805 12361 14615 3996 \r\n3 2674 14614 12361 3996 \r\n3 1730 5845 13940 3997 \r\n3 4228 14616 5845 3997 \r\n3 2756 13940 14616 3997 \r\n3 4059 12047 11442 3998 \r\n3 3542 14617 12047 3998 \r\n3 1759 11442 14617 3998 \r\n3 2253 14620 14619 3999 \r\n3 1379 14618 14620 3999 \r\n3 4671 14619 14618 3999 \r\n3 2482 14622 7645 4000 \r\n3 1129 14621 14622 4000 \r\n3 4316 7645 14621 4000 \r\n3 1882 14624 14623 4001 \r\n3 2862 5419 14624 4001 \r\n3 47 14623 5419 4001 \r\n3 4258 14627 14626 4002 \r\n3 1427 14625 14627 4002 \r\n3 2211 14626 14625 4002 \r\n3 3223 8098 14629 4003 \r\n3 4879 14628 8098 4003 \r\n3 4158 14629 14628 4003 \r\n3 323 14631 11735 4004 \r\n3 1139 14630 14631 4004 \r\n3 3570 11735 14630 4004 \r\n3 1151 5804 14633 4005 \r\n3 3546 14632 5804 4005 \r\n3 2633 14633 14632 4005 \r\n3 1044 14636 14635 4006 \r\n3 839 14634 14636 4006 \r\n3 1265 14635 14634 4006 \r\n3 162 13119 14638 4007 \r\n3 2459 14637 13119 4007 \r\n3 1060 14638 14637 4007 \r\n3 4610 9020 14639 4008 \r\n3 4322 14450 9020 4008 \r\n3 3314 14639 14450 4008 \r\n3 4834 10912 13039 4009 \r\n3 3066 11011 10912 4009 \r\n3 1774 13039 11011 4009 \r\n3 2594 10173 14641 4010 \r\n3 2717 14640 10173 4010 \r\n3 24 14641 14640 4010 \r\n3 3111 7480 14643 4011 \r\n3 2021 14642 7480 4011 \r\n3 2948 14643 14642 4011 \r\n3 1902 14645 11761 4012 \r\n3 1991 14644 14645 4012 \r\n3 189 11761 14644 4012 \r\n3 2733 14125 14647 4013 \r\n3 1217 14646 14125 4013 \r\n3 1893 14647 14646 4013 \r\n3 4170 12188 14649 4014 \r\n3 3878 14648 12188 4014 \r\n3 419 14649 14648 4014 \r\n3 1583 14652 14651 4015 \r\n3 707 14650 14652 4015 \r\n3 4618 14651 14650 4015 \r\n3 2232 11258 11334 4016 \r\n3 1622 5546 11258 4016 \r\n3 2855 11334 5546 4016 \r\n3 683 11913 11664 4017 \r\n3 1086 9127 11913 4017 \r\n3 4584 11664 9127 4017 \r\n3 714 12889 14654 4018 \r\n3 4150 14653 12889 4018 \r\n3 3497 14654 14653 4018 \r\n3 4329 14657 14656 4019 \r\n3 2848 14655 14657 4019 \r\n3 1028 14656 14655 4019 \r\n3 1949 14659 14658 4020 \r\n3 4775 11077 14659 4020 \r\n3 1251 14658 11077 4020 \r\n3 4115 14662 14661 4021 \r\n3 1434 14660 14662 4021 \r\n3 635 14661 14660 4021 \r\n3 1255 14664 14663 4022 \r\n3 2989 9568 14664 4022 \r\n3 427 14663 9568 4022 \r\n3 171 14667 14666 4023 \r\n3 452 14665 14667 4023 \r\n3 4063 14666 14665 4023 \r\n3 4766 14670 14669 4024 \r\n3 324 14668 14670 4024 \r\n3 904 14669 14668 4024 \r\n3 236 12019 14672 4025 \r\n3 1916 14671 12019 4025 \r\n3 4469 14672 14671 4025 \r\n3 2667 6689 14673 4026 \r\n3 2564 7375 6689 4026 \r\n3 3108 14673 7375 4026 \r\n3 1682 14676 14675 4027 \r\n3 1379 14674 14676 4027 \r\n3 2008 14675 14674 4027 \r\n3 4900 7551 14678 4028 \r\n3 1317 14677 7551 4028 \r\n3 4269 14678 14677 4028 \r\n3 1511 8222 14680 4029 \r\n3 1214 14679 8222 4029 \r\n3 1892 14680 14679 4029 \r\n3 3296 14683 14682 4030 \r\n3 4437 14681 14683 4030 \r\n3 4922 14682 14681 4030 \r\n3 368 14686 14685 4031 \r\n3 645 14684 14686 4031 \r\n3 378 14685 14684 4031 \r\n3 3460 14688 14687 4032 \r\n3 603 6912 14688 4032 \r\n3 2996 14687 6912 4032 \r\n3 2552 12190 5463 4033 \r\n3 4596 14689 12190 4033 \r\n3 4098 5463 14689 4033 \r\n3 654 9869 14691 4034 \r\n3 2245 14690 9869 4034 \r\n3 270 14691 14690 4034 \r\n3 3804 14693 8232 4035 \r\n3 2003 14692 14693 4035 \r\n3 4153 8232 14692 4035 \r\n3 1743 14695 14694 4036 \r\n3 2013 8433 14695 4036 \r\n3 1286 14694 8433 4036 \r\n3 1931 14698 14697 4037 \r\n3 2266 14696 14698 4037 \r\n3 4869 14697 14696 4037 \r\n3 249 14700 14699 4038 \r\n3 168 14556 14700 4038 \r\n3 3027 14699 14556 4038 \r\n3 1386 14702 13954 4039 \r\n3 509 14701 14702 4039 \r\n3 2453 13954 14701 4039 \r\n3 2774 14704 9697 4040 \r\n3 3228 14703 14704 4040 \r\n3 661 9697 14703 4040 \r\n3 4935 14706 14705 4041 \r\n3 643 13577 14706 4041 \r\n3 3468 14705 13577 4041 \r\n3 4497 13693 9886 4042 \r\n3 718 14707 13693 4042 \r\n3 3859 9886 14707 4042 \r\n3 184 14710 14709 4043 \r\n3 3137 14708 14710 4043 \r\n3 2590 14709 14708 4043 \r\n3 695 14713 14712 4044 \r\n3 552 14711 14713 4044 \r\n3 4685 14712 14711 4044 \r\n3 3612 14715 14714 4045 \r\n3 3990 7630 14715 4045 \r\n3 3257 14714 7630 4045 \r\n3 2983 14717 14716 4046 \r\n3 2528 7170 14717 4046 \r\n3 1530 14716 7170 4046 \r\n3 2799 14720 14719 4047 \r\n3 2262 14718 14720 4047 \r\n3 1638 14719 14718 4047 \r\n3 4609 14723 14722 4048 \r\n3 2134 14721 14723 4048 \r\n3 4278 14722 14721 4048 \r\n3 2550 14725 14724 4049 \r\n3 1862 8217 14725 4049 \r\n3 3285 14724 8217 4049 \r\n3 665 14727 11399 4050 \r\n3 3385 14726 14727 4050 \r\n3 4056 11399 14726 4050 \r\n3 4366 5292 12999 4051 \r\n3 342 14728 5292 4051 \r\n3 242 12999 14728 4051 \r\n3 2794 14730 5951 4052 \r\n3 225 14729 14730 4052 \r\n3 2418 5951 14729 4052 \r\n3 522 7282 14731 4053 \r\n3 4657 13925 7282 4053 \r\n3 182 14731 13925 4053 \r\n3 160 14733 14732 4054 \r\n3 3773 6122 14733 4054 \r\n3 1871 14732 6122 4054 \r\n3 4728 14735 14193 4055 \r\n3 3904 14734 14735 4055 \r\n3 2452 14193 14734 4055 \r\n3 4542 9960 14737 4056 \r\n3 2577 14736 9960 4056 \r\n3 1628 14737 14736 4056 \r\n3 4438 14740 14739 4057 \r\n3 937 14738 14740 4057 \r\n3 292 14739 14738 4057 \r\n3 3302 9035 14741 4058 \r\n3 827 14446 9035 4058 \r\n3 3325 14741 14446 4058 \r\n3 761 13710 5858 4059 \r\n3 3 14742 13710 4059 \r\n3 1306 5858 14742 4059 \r\n3 3204 14158 9637 4060 \r\n3 2521 9450 14158 4060 \r\n3 1543 9637 9450 4060 \r\n3 3218 14745 14744 4061 \r\n3 2876 14743 14745 4061 \r\n3 810 14744 14743 4061 \r\n3 971 14747 14746 4062 \r\n3 17 5365 14747 4062 \r\n3 970 14746 5365 4062 \r\n3 1120 14748 6406 4063 \r\n3 3424 10397 14748 4063 \r\n3 3253 6406 10397 4063 \r\n3 75 7431 9098 4064 \r\n3 4243 14749 7431 4064 \r\n3 4535 9098 14749 4064 \r\n3 232 8856 14750 4065 \r\n3 2113 5062 8856 4065 \r\n3 2541 14750 5062 4065 \r\n3 761 14752 13709 4066 \r\n3 923 14751 14752 4066 \r\n3 3824 13709 14751 4066 \r\n3 4727 14754 8496 4067 \r\n3 1891 14753 14754 4067 \r\n3 1607 8496 14753 4067 \r\n3 1014 8643 14756 4068 \r\n3 2393 14755 8643 4068 \r\n3 3867 14756 14755 4068 \r\n3 443 14759 14758 4069 \r\n3 4441 14757 14759 4069 \r\n3 833 14758 14757 4069 \r\n3 4623 14761 14434 4070 \r\n3 4230 14760 14761 4070 \r\n3 1664 14434 14760 4070 \r\n3 1901 14764 14763 4071 \r\n3 1367 14762 14764 4071 \r\n3 400 14763 14762 4071 \r\n3 2181 14766 9475 4072 \r\n3 1545 14765 14766 4072 \r\n3 1533 9475 14765 4072 \r\n3 2879 14767 7951 4073 \r\n3 4265 13414 14767 4073 \r\n3 4224 7951 13414 4073 \r\n3 2468 14769 14768 4074 \r\n3 4457 12820 14769 4074 \r\n3 1890 14768 12820 4074 \r\n3 394 5504 7104 4075 \r\n3 2162 14770 5504 4075 \r\n3 4075 7104 14770 4075 \r\n3 1532 14773 14772 4076 \r\n3 2967 14771 14773 4076 \r\n3 2074 14772 14771 4076 \r\n3 4511 14775 9225 4077 \r\n3 2959 14774 14775 4077 \r\n3 4984 9225 14774 4077 \r\n3 2365 14778 14777 4078 \r\n3 565 14776 14778 4078 \r\n3 141 14777 14776 4078 \r\n3 4644 14494 14779 4079 \r\n3 891 13332 14494 4079 \r\n3 3603 14779 13332 4079 \r\n3 3884 14782 14781 4080 \r\n3 1383 14780 14782 4080 \r\n3 3112 14781 14780 4080 \r\n3 1207 9987 14783 4081 \r\n3 1825 7288 9987 4081 \r\n3 503 14783 7288 4081 \r\n3 1570 6582 12180 4082 \r\n3 1377 8133 6582 4082 \r\n3 4268 12180 8133 4082 \r\n3 3536 8058 10323 4083 \r\n3 3403 14784 8058 4083 \r\n3 519 10323 14784 4083 \r\n3 648 14787 14786 4084 \r\n3 3176 14785 14787 4084 \r\n3 3789 14786 14785 4084 \r\n3 2755 14788 10725 4085 \r\n3 4527 11429 14788 4085 \r\n3 3289 10725 11429 4085 \r\n3 1604 14790 11164 4086 \r\n3 2838 14789 14790 4086 \r\n3 723 11164 14789 4086 \r\n3 4372 14791 5102 4087 \r\n3 4229 10315 14791 4087 \r\n3 4635 5102 10315 4087 \r\n3 2113 14793 5063 4088 \r\n3 319 14792 14793 4088 \r\n3 516 5063 14792 4088 \r\n3 2747 14794 10669 4089 \r\n3 1879 9115 14794 4089 \r\n3 668 10669 9115 4089 \r\n3 3809 8871 7149 4090 \r\n3 4323 6861 8871 4090 \r\n3 2016 7149 6861 4090 \r\n3 2311 14796 7445 4091 \r\n3 3281 14795 14796 4091 \r\n3 535 7445 14795 4091 \r\n3 3919 10996 14797 4092 \r\n3 1507 7091 10996 4092 \r\n3 1450 14797 7091 4092 \r\n3 3845 14800 14799 4093 \r\n3 3215 14798 14800 4093 \r\n3 2802 14799 14798 4093 \r\n3 4790 14802 14801 4094 \r\n3 93 13123 14802 4094 \r\n3 2447 14801 13123 4094 \r\n3 1639 10511 14803 4095 \r\n3 2790 9710 10511 4095 \r\n3 2754 14803 9710 4095 \r\n3 2617 14806 14805 4096 \r\n3 649 14804 14806 4096 \r\n3 108 14805 14804 4096 \r\n3 4603 14809 14808 4097 \r\n3 1022 14807 14809 4097 \r\n3 1785 14808 14807 4097 \r\n3 1272 10784 5458 4098 \r\n3 1862 11051 10784 4098 \r\n3 4766 5458 11051 4098 \r\n3 1836 14812 14811 4099 \r\n3 781 14810 14812 4099 \r\n3 512 14811 14810 4099 \r\n3 4328 14814 14813 4100 \r\n3 3605 11864 14814 4100 \r\n3 2869 14813 11864 4100 \r\n3 105 6368 6713 4101 \r\n3 1173 11558 6368 4101 \r\n3 2020 6713 11558 4101 \r\n3 4225 13783 14815 4102 \r\n3 3720 8072 13783 4102 \r\n3 269 14815 8072 4102 \r\n3 3507 14818 14817 4103 \r\n3 1151 14816 14818 4103 \r\n3 90 14817 14816 4103 \r\n3 2034 12012 14820 4104 \r\n3 4186 14819 12012 4104 \r\n3 4222 14820 14819 4104 \r\n3 3670 6866 14821 4105 \r\n3 2644 12130 6866 4105 \r\n3 1940 14821 12130 4105 \r\n3 875 14822 8214 4106 \r\n3 3823 11907 14822 4106 \r\n3 533 8214 11907 4106 \r\n3 1598 12795 14824 4107 \r\n3 343 14823 12795 4107 \r\n3 2696 14824 14823 4107 \r\n3 3356 10093 14218 4108 \r\n3 4980 14825 10093 4108 \r\n3 3592 14218 14825 4108 \r\n3 4148 14827 14826 4109 \r\n3 262 10543 14827 4109 \r\n3 3061 14826 10543 4109 \r\n3 2067 13469 14828 4110 \r\n3 1549 13317 13469 4110 \r\n3 127 14828 13317 4110 \r\n3 3168 10501 14830 4111 \r\n3 1807 14829 10501 4111 \r\n3 3089 14830 14829 4111 \r\n3 3570 14832 11736 4112 \r\n3 1724 14831 14832 4112 \r\n3 4272 11736 14831 4112 \r\n3 3972 14834 14833 4113 \r\n3 3176 14787 14834 4113 \r\n3 648 14833 14787 4113 \r\n3 1791 14836 14835 4114 \r\n3 2234 7440 14836 4114 \r\n3 2878 14835 7440 4114 \r\n3 255 6595 5240 4115 \r\n3 424 14837 6595 4115 \r\n3 4483 5240 14837 4115 \r\n3 4425 14839 14256 4116 \r\n3 505 14838 14839 4116 \r\n3 2455 14256 14838 4116 \r\n3 1533 14842 14841 4117 \r\n3 1101 14840 14842 4117 \r\n3 3282 14841 14840 4117 \r\n3 2219 14844 7906 4118 \r\n3 4776 14843 14844 4118 \r\n3 555 7906 14843 4118 \r\n3 4476 14847 14846 4119 \r\n3 3710 14845 14847 4119 \r\n3 673 14846 14845 4119 \r\n3 2028 14849 11661 4120 \r\n3 1013 14848 14849 4120 \r\n3 3322 11661 14848 4120 \r\n3 1653 12953 6285 4121 \r\n3 3935 14850 12953 4121 \r\n3 597 6285 14850 4121 \r\n3 3512 5682 6482 4122 \r\n3 3572 14851 5682 4122 \r\n3 2189 6482 14851 4122 \r\n3 4085 6379 7662 4123 \r\n3 802 8019 6379 4123 \r\n3 868 7662 8019 4123 \r\n3 3779 14852 7349 4124 \r\n3 3135 8336 14852 4124 \r\n3 737 7349 8336 4124 \r\n3 765 14854 14853 4125 \r\n3 656 5756 14854 4125 \r\n3 980 14853 5756 4125 \r\n3 4968 9211 7668 4126 \r\n3 2206 6244 9211 4126 \r\n3 4588 7668 6244 4126 \r\n3 464 14856 5369 4127 \r\n3 4971 14855 14856 4127 \r\n3 1019 5369 14855 4127 \r\n3 2054 14858 14393 4128 \r\n3 4363 14857 14858 4128 \r\n3 1997 14393 14857 4128 \r\n3 2652 14860 12127 4129 \r\n3 4493 14859 14860 4129 \r\n3 3974 12127 14859 4129 \r\n3 33 14862 11945 4130 \r\n3 1163 14861 14862 4130 \r\n3 4049 11945 14861 4130 \r\n3 871 13243 14864 4131 \r\n3 2446 14863 13243 4131 \r\n3 3116 14864 14863 4131 \r\n3 4597 14867 14866 4132 \r\n3 2683 14865 14867 4132 \r\n3 4035 14866 14865 4132 \r\n3 1951 5309 14868 4133 \r\n3 3210 10965 5309 4133 \r\n3 1409 14868 10965 4133 \r\n3 4872 14870 13598 4134 \r\n3 2119 14869 14870 4134 \r\n3 1873 13598 14869 4134 \r\n3 3174 14873 14872 4135 \r\n3 3202 14871 14873 4135 \r\n3 3535 14872 14871 4135 \r\n3 2798 14876 14875 4136 \r\n3 4651 14874 14876 4136 \r\n3 4043 14875 14874 4136 \r\n3 1564 5169 14878 4137 \r\n3 1777 14877 5169 4137 \r\n3 1953 14878 14877 4137 \r\n3 4455 14880 6416 4138 \r\n3 1843 14879 14880 4138 \r\n3 3043 6416 14879 4138 \r\n3 1219 14882 13453 4139 \r\n3 4772 14881 14882 4139 \r\n3 3164 13453 14881 4139 \r\n3 2742 14884 10651 4140 \r\n3 2024 14883 14884 4140 \r\n3 441 10651 14883 4140 \r\n3 1353 14885 5723 4141 \r\n3 2802 12975 14885 4141 \r\n3 1577 5723 12975 4141 \r\n3 3170 14888 14887 4142 \r\n3 2737 14886 14888 4142 \r\n3 1432 14887 14886 4142 \r\n3 993 14891 14890 4143 \r\n3 8 14889 14891 4143 \r\n3 151 14890 14889 4143 \r\n3 2025 8095 14893 4144 \r\n3 2468 14892 8095 4144 \r\n3 739 14893 14892 4144 \r\n3 2935 8944 11698 4145 \r\n3 3591 14894 8944 4145 \r\n3 4606 11698 14894 4145 \r\n3 2241 14896 14895 4146 \r\n3 3819 10253 14896 4146 \r\n3 1812 14895 10253 4146 \r\n3 1222 14899 14898 4147 \r\n3 4020 14897 14899 4147 \r\n3 1253 14898 14897 4147 \r\n3 2771 12636 13970 4148 \r\n3 3605 14900 12636 4148 \r\n3 3293 13970 14900 4148 \r\n3 1802 6460 14901 4149 \r\n3 635 14660 6460 4149 \r\n3 1434 14901 14660 4149 \r\n3 2386 14903 9137 4150 \r\n3 602 14902 14903 4150 \r\n3 4037 9137 14902 4150 \r\n3 3879 14904 11986 4151 \r\n3 625 5916 14904 4151 \r\n3 3246 11986 5916 4151 \r\n3 1514 14907 14906 4152 \r\n3 1809 14905 14907 4152 \r\n3 927 14906 14905 4152 \r\n3 4273 13828 14909 4153 \r\n3 3794 14908 13828 4153 \r\n3 29 14909 14908 4153 \r\n3 4166 10854 14911 4154 \r\n3 1224 14910 10854 4154 \r\n3 3494 14911 14910 4154 \r\n3 336 14912 10677 4155 \r\n3 1592 7441 14912 4155 \r\n3 2234 10677 7441 4155 \r\n3 509 14913 14701 4156 \r\n3 2045 12062 14913 4156 \r\n3 2453 14701 12062 4156 \r\n3 3223 14629 14915 4157 \r\n3 4158 14914 14629 4157 \r\n3 1046 14915 14914 4157 \r\n3 1837 14917 14177 4158 \r\n3 4899 14916 14917 4158 \r\n3 1180 14177 14916 4158 \r\n3 1233 13857 5939 4159 \r\n3 3797 13883 13857 4159 \r\n3 3626 5939 13883 4159 \r\n3 2633 14918 14633 4160 \r\n3 19 10009 14918 4160 \r\n3 1151 14633 10009 4160 \r\n3 1155 14921 14920 4161 \r\n3 2969 14919 14921 4161 \r\n3 3963 14920 14919 4161 \r\n3 2856 12821 13379 4162 \r\n3 4457 14922 12821 4162 \r\n3 3927 13379 14922 4162 \r\n3 3007 14925 14924 4163 \r\n3 1855 14923 14925 4163 \r\n3 1135 14924 14923 4163 \r\n3 42 14926 14229 4164 \r\n3 3266 11378 14926 4164 \r\n3 2274 14229 11378 4164 \r\n3 4536 14928 10245 4165 \r\n3 4581 14927 14928 4165 \r\n3 1015 10245 14927 4165 \r\n3 909 14931 14930 4166 \r\n3 3908 14929 14931 4166 \r\n3 4227 14930 14929 4166 \r\n3 2602 14932 8766 4167 \r\n3 1257 5464 14932 4167 \r\n3 538 8766 5464 4167 \r\n3 105 13975 6367 4168 \r\n3 2375 10380 13975 4168 \r\n3 1672 6367 10380 4168 \r\n3 2807 14934 14270 4169 \r\n3 4999 14933 14934 4169 \r\n3 1460 14270 14933 4169 \r\n3 1442 14936 13097 4170 \r\n3 3230 14935 14936 4170 \r\n3 4914 13097 14935 4170 \r\n3 2914 14939 14938 4171 \r\n3 1816 14937 14939 4171 \r\n3 3798 14938 14937 4171 \r\n3 3180 14941 14940 4172 \r\n3 30 7255 14941 4172 \r\n3 557 14940 7255 4172 \r\n3 3362 14943 14942 4173 \r\n3 2889 7026 14943 4173 \r\n3 1749 14942 7026 4173 \r\n3 2394 13360 14944 4174 \r\n3 2727 7741 13360 4174 \r\n3 1405 14944 7741 4174 \r\n3 4409 14947 14946 4175 \r\n3 2125 14945 14947 4175 \r\n3 1190 14946 14945 4175 \r\n3 3655 11829 14948 4176 \r\n3 787 6124 11829 4176 \r\n3 2079 14948 6124 4176 \r\n3 4634 12661 7919 4177 \r\n3 4250 13816 12661 4177 \r\n3 2014 7919 13816 4177 \r\n3 2809 14950 14949 4178 \r\n3 2326 10594 14950 4178 \r\n3 763 14949 10594 4178 \r\n3 3498 8272 14461 4179 \r\n3 4854 14951 8272 4179 \r\n3 2886 14461 14951 4179 \r\n3 1389 14953 14952 4180 \r\n3 1541 9554 14953 4180 \r\n3 1580 14952 9554 4180 \r\n3 4145 14955 6652 4181 \r\n3 1719 14954 14955 4181 \r\n3 4665 6652 14954 4181 \r\n3 225 14730 12110 4182 \r\n3 2794 11610 14730 4182 \r\n3 3174 12110 11610 4182 \r\n3 4483 14956 10184 4183 \r\n3 4892 7873 14956 4183 \r\n3 2355 10184 7873 4183 \r\n3 1905 14959 14958 4184 \r\n3 2957 14957 14959 4184 \r\n3 1178 14958 14957 4184 \r\n3 3883 14961 14960 4185 \r\n3 1643 11787 14961 4185 \r\n3 413 14960 11787 4185 \r\n3 1444 14963 14962 4186 \r\n3 4346 9843 14963 4186 \r\n3 3184 14962 9843 4186 \r\n3 136 14966 14965 4187 \r\n3 4177 14964 14966 4187 \r\n3 1247 14965 14964 4187 \r\n3 3167 14969 14968 4188 \r\n3 1405 14967 14969 4188 \r\n3 1160 14968 14967 4188 \r\n3 2240 14972 14971 4189 \r\n3 2407 14970 14972 4189 \r\n3 1424 14971 14970 4189 \r\n3 585 14974 14973 4190 \r\n3 1839 8642 14974 4190 \r\n3 3487 14973 8642 4190 \r\n3 671 13089 7916 4191 \r\n3 3642 14975 13089 4191 \r\n3 4133 7916 14975 4191 \r\n3 4615 14976 11993 4192 \r\n3 770 8676 14976 4192 \r\n3 850 11993 8676 4192 \r\n3 476 14979 14978 4193 \r\n3 1917 14977 14979 4193 \r\n3 1863 14978 14977 4193 \r\n3 4218 14982 14981 4194 \r\n3 4386 14980 14982 4194 \r\n3 44 14981 14980 4194 \r\n3 1142 14984 6529 4195 \r\n3 4137 14983 14984 4195 \r\n3 1314 6529 14983 4195 \r\n3 1044 12427 14636 4196 \r\n3 1934 14985 12427 4196 \r\n3 839 14636 14985 4196 \r\n3 2072 10148 7384 4197 \r\n3 4041 13325 10148 4197 \r\n3 2570 7384 13325 4197 \r\n3 3520 10209 9633 4198 \r\n3 3007 14986 10209 4198 \r\n3 3028 9633 14986 4198 \r\n3 3211 14987 6355 4199 \r\n3 881 12256 14987 4199 \r\n3 3993 6355 12256 4199 \r\n3 3557 14989 14988 4200 \r\n3 4076 6376 14989 4200 \r\n3 998 14988 6376 4200 \r\n3 3832 13369 10407 4201 \r\n3 3864 14990 13369 4201 \r\n3 1520 10407 14990 4201 \r\n3 85 14993 14992 4202 \r\n3 2351 14991 14993 4202 \r\n3 1629 14992 14991 4202 \r\n3 1385 7066 14995 4203 \r\n3 148 14994 7066 4203 \r\n3 4240 14995 14994 4203 \r\n3 3648 14998 14997 4204 \r\n3 2881 14996 14998 4204 \r\n3 118 14997 14996 4204 \r\n3 1174 15001 15000 4205 \r\n3 1042 14999 15001 4205 \r\n3 243 15000 14999 4205 \r\n3 2405 15004 15003 4206 \r\n3 845 15002 15004 4206 \r\n3 4582 15003 15002 4206 \r\n3 204 15005 5576 4207 \r\n3 2882 5559 15005 4207 \r\n3 1491 5576 5559 4207 \r\n3 710 15007 15006 4208 \r\n3 1119 13736 15007 4208 \r\n3 2543 15006 13736 4208 \r\n3 2981 15010 15009 4209 \r\n3 4026 15008 15010 4209 \r\n3 1689 15009 15008 4209 \r\n3 1831 10343 11753 4210 \r\n3 1781 6918 10343 4210 \r\n3 1614 11753 6918 4210 \r\n3 1327 15012 7389 4211 \r\n3 4983 15011 15012 4211 \r\n3 2160 7389 15011 4211 \r\n3 409 12602 15014 4212 \r\n3 2546 15013 12602 4212 \r\n3 4832 15014 15013 4212 \r\n3 263 15017 15016 4213 \r\n3 2470 15015 15017 4213 \r\n3 1732 15016 15015 4213 \r\n3 4687 15019 15018 4214 \r\n3 3195 8334 15019 4214 \r\n3 3519 15018 8334 4214 \r\n3 874 12556 13171 4215 \r\n3 386 12300 12556 4215 \r\n3 2308 13171 12300 4215 \r\n3 3761 12164 9010 4216 \r\n3 1811 7897 12164 4216 \r\n3 4141 9010 7897 4216 \r\n3 4283 13934 15021 4217 \r\n3 2725 15020 13934 4217 \r\n3 2044 15021 15020 4217 \r\n3 146 6497 15022 4218 \r\n3 2155 10843 6497 4218 \r\n3 3185 15022 10843 4218 \r\n3 4794 15024 8431 4219 \r\n3 608 15023 15024 4219 \r\n3 432 8431 15023 4219 \r\n3 3091 11492 15025 4220 \r\n3 1715 10158 11492 4220 \r\n3 3960 15025 10158 4220 \r\n3 783 15027 15026 4221 \r\n3 4174 13738 15027 4221 \r\n3 4193 15026 13738 4221 \r\n3 1903 15030 15029 4222 \r\n3 1659 15028 15030 4222 \r\n3 1960 15029 15028 4222 \r\n3 3165 15032 11122 4223 \r\n3 3110 15031 15032 4223 \r\n3 2692 11122 15031 4223 \r\n3 2412 15034 15033 4224 \r\n3 72 12779 15034 4224 \r\n3 2185 15033 12779 4224 \r\n3 2780 15037 15036 4225 \r\n3 1132 15035 15037 4225 \r\n3 4479 15036 15035 4225 \r\n3 3684 15040 15039 4226 \r\n3 3184 15038 15040 4226 \r\n3 4155 15039 15038 4226 \r\n3 2104 11367 15042 4227 \r\n3 4025 15041 11367 4227 \r\n3 1707 15042 15041 4227 \r\n3 4519 12339 15043 4228 \r\n3 3833 5476 12339 4228 \r\n3 2701 15043 5476 4228 \r\n3 414 15045 15044 4229 \r\n3 4511 9226 15045 4229 \r\n3 1441 15044 9226 4229 \r\n3 3778 8731 15047 4230 \r\n3 4814 15046 8731 4230 \r\n3 4088 15047 15046 4230 \r\n3 107 11159 12918 4231 \r\n3 224 6916 11159 4231 \r\n3 1781 12918 6916 4231 \r\n3 4087 15050 15049 4232 \r\n3 3004 15048 15050 4232 \r\n3 2715 15049 15048 4232 \r\n3 3337 15053 15052 4233 \r\n3 4848 15051 15053 4233 \r\n3 1103 15052 15051 4233 \r\n3 3426 11330 5130 4234 \r\n3 4647 9912 11330 4234 \r\n3 646 5130 9912 4234 \r\n3 1220 14349 15055 4235 \r\n3 947 15054 14349 4235 \r\n3 1689 15055 15054 4235 \r\n3 1063 13849 15056 4236 \r\n3 3474 14391 13849 4236 \r\n3 1997 15056 14391 4236 \r\n3 139 15058 15057 4237 \r\n3 3447 12809 15058 4237 \r\n3 1332 15057 12809 4237 \r\n3 4228 15060 15059 4238 \r\n3 705 9945 15060 4238 \r\n3 3013 15059 9945 4238 \r\n3 2591 15063 15062 4239 \r\n3 4343 15061 15063 4239 \r\n3 396 15062 15061 4239 \r\n3 1963 7350 15064 4240 \r\n3 737 12088 7350 4240 \r\n3 4143 15064 12088 4240 \r\n3 4962 15066 15065 4241 \r\n3 4035 14865 15066 4241 \r\n3 2683 15065 14865 4241 \r\n3 1019 14855 15067 4242 \r\n3 4971 8180 14855 4242 \r\n3 795 15067 8180 4242 \r\n3 3519 11510 15068 4243 \r\n3 4418 8778 11510 4243 \r\n3 2844 15068 8778 4243 \r\n3 915 15070 15069 4244 \r\n3 4961 9534 15070 4244 \r\n3 793 15069 9534 4244 \r\n3 390 15071 13727 4245 \r\n3 4484 8615 15071 4245 \r\n3 1003 13727 8615 4245 \r\n3 4755 13071 11140 4246 \r\n3 4416 15072 13071 4246 \r\n3 1264 11140 15072 4246 \r\n3 2217 6805 15074 4247 \r\n3 3321 15073 6805 4247 \r\n3 1290 15074 15073 4247 \r\n3 4781 11649 15075 4248 \r\n3 4831 6112 11649 4248 \r\n3 4273 15075 6112 4248 \r\n3 1926 15077 15076 4249 \r\n3 174 14553 15077 4249 \r\n3 4970 15076 14553 4249 \r\n3 636 15079 15078 4250 \r\n3 1526 9891 15079 4250 \r\n3 4721 15078 9891 4250 \r\n3 1859 9852 15081 4251 \r\n3 3899 15080 9852 4251 \r\n3 943 15081 15080 4251 \r\n3 1959 15083 14387 4252 \r\n3 3359 15082 15083 4252 \r\n3 796 14387 15082 4252 \r\n3 4801 10801 15084 4253 \r\n3 3759 13917 10801 4253 \r\n3 2239 15084 13917 4253 \r\n3 162 12841 13120 4254 \r\n3 729 14045 12841 4254 \r\n3 914 13120 14045 4254 \r\n3 2655 15085 8225 4255 \r\n3 4485 5801 15085 4255 \r\n3 4086 8225 5801 4255 \r\n3 4512 15087 12699 4256 \r\n3 316 15086 15087 4256 \r\n3 140 12699 15086 4256 \r\n3 3074 11634 15089 4257 \r\n3 353 15088 11634 4257 \r\n3 568 15089 15088 4257 \r\n3 4147 7360 15091 4258 \r\n3 4540 15090 7360 4258 \r\n3 884 15091 15090 4258 \r\n3 1366 15094 15093 4259 \r\n3 76 15092 15094 4259 \r\n3 3699 15093 15092 4259 \r\n3 4783 7937 15095 4260 \r\n3 1251 11079 7937 4260 \r\n3 1696 15095 11079 4260 \r\n3 3989 7837 15097 4261 \r\n3 2317 15096 7837 4261 \r\n3 2733 15097 15096 4261 \r\n3 3398 15098 13885 4262 \r\n3 3652 5905 15098 4262 \r\n3 917 13885 5905 4262 \r\n3 4195 7920 15100 4263 \r\n3 2014 15099 7920 4263 \r\n3 1984 15100 15099 4263 \r\n3 4530 6184 15101 4264 \r\n3 3337 15052 6184 4264 \r\n3 1103 15101 15052 4264 \r\n3 4262 15103 8994 4265 \r\n3 8 15102 15103 4265 \r\n3 3348 8994 15102 4265 \r\n3 58 15105 11810 4266 \r\n3 1926 15104 15105 4266 \r\n3 1118 11810 15104 4266 \r\n3 4445 15107 15106 4267 \r\n3 3668 11482 15107 4267 \r\n3 986 15106 11482 4267 \r\n3 815 15109 15108 4268 \r\n3 4377 11991 15109 4268 \r\n3 1478 15108 11991 4268 \r\n3 4558 9242 13821 4269 \r\n3 2497 14160 9242 4269 \r\n3 4676 13821 14160 4269 \r\n3 1296 11505 15110 4270 \r\n3 4073 10992 11505 4270 \r\n3 4879 15110 10992 4270 \r\n3 1938 15112 9429 4271 \r\n3 953 15111 15112 4271 \r\n3 3443 9429 15111 4271 \r\n3 1684 15114 15113 4272 \r\n3 688 13803 15114 4272 \r\n3 3280 15113 13803 4272 \r\n3 69 15117 15116 4273 \r\n3 2630 15115 15117 4273 \r\n3 2236 15116 15115 4273 \r\n3 1623 12866 15118 4274 \r\n3 3491 11898 12866 4274 \r\n3 852 15118 11898 4274 \r\n3 4014 15120 15119 4275 \r\n3 1189 7061 15120 4275 \r\n3 4457 15119 7061 4275 \r\n3 2226 15122 12354 4276 \r\n3 1122 15121 15122 4276 \r\n3 1820 12354 15121 4276 \r\n3 4895 5021 15123 4277 \r\n3 4443 12653 5021 4277 \r\n3 360 15123 12653 4277 \r\n3 1667 15125 15124 4278 \r\n3 3938 14271 15125 4278 \r\n3 1298 15124 14271 4278 \r\n3 420 15127 15126 4279 \r\n3 4646 6966 15127 4279 \r\n3 759 15126 6966 4279 \r\n3 3869 9404 15129 4280 \r\n3 1860 15128 9404 4280 \r\n3 3711 15129 15128 4280 \r\n3 2630 15131 15130 4281 \r\n3 234 12139 15131 4281 \r\n3 3351 15130 12139 4281 \r\n3 3145 15132 6846 4282 \r\n3 4624 8090 15132 4282 \r\n3 2317 6846 8090 4282 \r\n3 1917 15134 12768 4283 \r\n3 4280 15133 15134 4283 \r\n3 2966 12768 15133 4283 \r\n3 4492 6488 7214 4284 \r\n3 2903 15135 6488 4284 \r\n3 1616 7214 15135 4284 \r\n3 2442 15136 9066 4285 \r\n3 3894 11782 15136 4285 \r\n3 2677 9066 11782 4285 \r\n3 1927 15139 15138 4286 \r\n3 651 15137 15139 4286 \r\n3 2588 15138 15137 4286 \r\n3 4132 12919 15140 4287 \r\n3 408 11595 12919 4287 \r\n3 2998 15140 11595 4287 \r\n3 2221 5709 15142 4288 \r\n3 2936 15141 5709 4288 \r\n3 4571 15142 15141 4288 \r\n3 2201 14276 14194 4289 \r\n3 4110 12253 14276 4289 \r\n3 3010 14194 12253 4289 \r\n3 380 15144 10120 4290 \r\n3 4753 15143 15144 4290 \r\n3 588 10120 15143 4290 \r\n3 3181 15145 11644 4291 \r\n3 2218 13464 15145 4291 \r\n3 4173 11644 13464 4291 \r\n3 3384 15147 15146 4292 \r\n3 3391 12380 15147 4292 \r\n3 650 15146 12380 4292 \r\n3 3025 15150 15149 4293 \r\n3 3282 15148 15150 4293 \r\n3 3965 15149 15148 4293 \r\n3 2765 15152 15151 4294 \r\n3 4144 9328 15152 4294 \r\n3 928 15151 9328 4294 \r\n3 2681 5525 15153 4295 \r\n3 3088 10291 5525 4295 \r\n3 3315 15153 10291 4295 \r\n3 613 8281 15154 4296 \r\n3 2742 10653 8281 4296 \r\n3 1910 15154 10653 4296 \r\n3 417 10225 15156 4297 \r\n3 2462 15155 10225 4297 \r\n3 3036 15156 15155 4297 \r\n3 2186 10210 15157 4298 \r\n3 371 9944 10210 4298 \r\n3 705 15157 9944 4298 \r\n3 4423 9499 9141 4299 \r\n3 2319 12595 9499 4299 \r\n3 3780 9141 12595 4299 \r\n3 2898 15160 15159 4300 \r\n3 749 15158 15160 4300 \r\n3 3213 15159 15158 4300 \r\n3 2339 6461 8309 4301 \r\n3 3981 15161 6461 4301 \r\n3 2366 8309 15161 4301 \r\n3 4961 7454 15163 4302 \r\n3 2444 15162 7454 4302 \r\n3 4627 15163 15162 4302 \r\n3 1876 7539 15165 4303 \r\n3 4084 15164 7539 4303 \r\n3 2149 15165 15164 4303 \r\n3 1039 11932 15167 4304 \r\n3 3931 15166 11932 4304 \r\n3 607 15167 15166 4304 \r\n3 4905 15169 9767 4305 \r\n3 2814 15168 15169 4305 \r\n3 3667 9767 15168 4305 \r\n3 2993 15171 15170 4306 \r\n3 512 14358 15171 4306 \r\n3 1293 15170 14358 4306 \r\n3 2565 15174 15173 4307 \r\n3 897 15172 15174 4307 \r\n3 3579 15173 15172 4307 \r\n3 379 15176 12936 4308 \r\n3 516 15175 15176 4308 \r\n3 4839 12936 15175 4308 \r\n3 485 11871 15177 4309 \r\n3 3394 9310 11871 4309 \r\n3 2397 15177 9310 4309 \r\n3 3022 15179 15178 4310 \r\n3 639 7715 15179 4310 \r\n3 952 15178 7715 4310 \r\n3 510 15182 15181 4311 \r\n3 3475 15180 15182 4311 \r\n3 2869 15181 15180 4311 \r\n3 4531 8166 15184 4312 \r\n3 311 15183 8166 4312 \r\n3 2260 15184 15183 4312 \r\n3 3128 15186 15185 4313 \r\n3 2302 11063 15186 4313 \r\n3 3918 15185 11063 4313 \r\n3 4593 13852 15188 4314 \r\n3 42 15187 13852 4314 \r\n3 922 15188 15187 4314 \r\n3 3661 15190 9168 4315 \r\n3 4850 15189 15190 4315 \r\n3 732 9168 15189 4315 \r\n3 2624 15192 15191 4316 \r\n3 1723 11620 15192 4316 \r\n3 1246 15191 11620 4316 \r\n3 4434 15193 12029 4317 \r\n3 4619 5890 15193 4317 \r\n3 3294 12029 5890 4317 \r\n3 4546 7087 15195 4318 \r\n3 267 15194 7087 4318 \r\n3 286 15195 15194 4318 \r\n3 4361 9596 15197 4319 \r\n3 3482 15196 9596 4319 \r\n3 2661 15197 15196 4319 \r\n3 2881 15199 14996 4320 \r\n3 1641 15198 15199 4320 \r\n3 118 14996 15198 4320 \r\n3 1799 13080 14308 4321 \r\n3 2738 15200 13080 4321 \r\n3 1027 14308 15200 4321 \r\n3 946 15203 15202 4322 \r\n3 1200 15201 15203 4322 \r\n3 1032 15202 15201 4322 \r\n3 3796 15206 15205 4323 \r\n3 2513 15204 15206 4323 \r\n3 4964 15205 15204 4323 \r\n3 1886 15208 10482 4324 \r\n3 3633 15207 15208 4324 \r\n3 3249 10482 15207 4324 \r\n3 837 8788 15210 4325 \r\n3 2894 15209 8788 4325 \r\n3 275 15210 15209 4325 \r\n3 3715 13758 15212 4326 \r\n3 4416 15211 13758 4326 \r\n3 4960 15212 15211 4326 \r\n3 3446 15215 15214 4327 \r\n3 3614 15213 15215 4327 \r\n3 2970 15214 15213 4327 \r\n3 793 10921 15217 4328 \r\n3 1986 15216 10921 4328 \r\n3 98 15217 15216 4328 \r\n3 2097 15219 5164 4329 \r\n3 181 15218 15219 4329 \r\n3 1025 5164 15218 4329 \r\n3 3727 15222 15221 4330 \r\n3 4667 15220 15222 4330 \r\n3 3106 15221 15220 4330 \r\n3 4922 15225 15224 4331 \r\n3 297 15223 15225 4331 \r\n3 3153 15224 15223 4331 \r\n3 2171 12527 12488 4332 \r\n3 415 13689 12527 4332 \r\n3 1083 12488 13689 4332 \r\n3 1215 15227 13310 4333 \r\n3 4597 15226 15227 4333 \r\n3 478 13310 15226 4333 \r\n3 3566 15230 15229 4334 \r\n3 1711 15228 15230 4334 \r\n3 4494 15229 15228 4334 \r\n3 4335 11048 11516 4335 \r\n3 2808 15231 11048 4335 \r\n3 646 11516 15231 4335 \r\n3 2018 15233 15232 4336 \r\n3 455 10626 15233 4336 \r\n3 3600 15232 10626 4336 \r\n3 2955 15236 15235 4337 \r\n3 1522 15234 15236 4337 \r\n3 1544 15235 15234 4337 \r\n3 765 14853 15238 4338 \r\n3 980 15237 14853 4338 \r\n3 2222 15238 15237 4338 \r\n3 1349 15239 8887 4339 \r\n3 3638 5813 15239 4339 \r\n3 4650 8887 5813 4339 \r\n3 3474 15242 15241 4340 \r\n3 4765 15240 15242 4340 \r\n3 3656 15241 15240 4340 \r\n3 3478 10564 15244 4341 \r\n3 2340 15243 10564 4341 \r\n3 4999 15244 15243 4341 \r\n3 4991 5263 15246 4342 \r\n3 16 15245 5263 4342 \r\n3 3623 15246 15245 4342 \r\n3 4613 13299 15247 4343 \r\n3 3284 9560 13299 4343 \r\n3 4125 15247 9560 4343 \r\n3 4089 15249 15248 4344 \r\n3 3831 11523 15249 4344 \r\n3 4594 15248 11523 4344 \r\n3 2192 11036 15251 4345 \r\n3 1980 15250 11036 4345 \r\n3 4104 15251 15250 4345 \r\n3 3974 14859 15252 4346 \r\n3 4493 5392 14859 4346 \r\n3 4473 15252 5392 4346 \r\n3 2666 6195 15254 4347 \r\n3 2414 15253 6195 4347 \r\n3 3829 15254 15253 4347 \r\n3 436 15257 15256 4348 \r\n3 3646 15255 15257 4348 \r\n3 1442 15256 15255 4348 \r\n3 4996 15259 15258 4349 \r\n3 205 12610 15259 4349 \r\n3 373 15258 12610 4349 \r\n3 2777 11655 15261 4350 \r\n3 924 15260 11655 4350 \r\n3 1849 15261 15260 4350 \r\n3 3748 15262 13565 4351 \r\n3 2757 6302 15262 4351 \r\n3 2165 13565 6302 4351 \r\n3 3368 15264 5954 4352 \r\n3 1236 15263 15264 4352 \r\n3 3731 5954 15263 4352 \r\n3 3580 15266 15265 4353 \r\n3 1001 9352 15266 4353 \r\n3 4258 15265 9352 4353 \r\n3 4294 15268 8253 4354 \r\n3 1412 15267 15268 4354 \r\n3 2650 8253 15267 4354 \r\n3 149 5566 10333 4355 \r\n3 2329 8727 5566 4355 \r\n3 3838 10333 8727 4355 \r\n3 3206 11483 9463 4356 \r\n3 3668 11501 11483 4356 \r\n3 3660 9463 11501 4356 \r\n3 3463 15271 15270 4357 \r\n3 602 15269 15271 4357 \r\n3 3208 15270 15269 4357 \r\n3 3077 15273 15272 4358 \r\n3 952 7714 15273 4358 \r\n3 4288 15272 7714 4358 \r\n3 2052 15274 11713 4359 \r\n3 1239 13063 15274 4359 \r\n3 3122 11713 13063 4359 \r\n3 3922 11797 12281 4360 \r\n3 434 15275 11797 4360 \r\n3 2169 12281 15275 4360 \r\n3 4458 15276 7993 4361 \r\n3 4608 12051 15276 4361 \r\n3 429 7993 12051 4361 \r\n3 1165 11626 12613 4362 \r\n3 4891 5781 11626 4362 \r\n3 1098 12613 5781 4362 \r\n3 4825 7341 15278 4363 \r\n3 3677 15277 7341 4363 \r\n3 1308 15278 15277 4363 \r\n3 2522 5685 15279 4364 \r\n3 2099 7263 5685 4364 \r\n3 1301 15279 7263 4364 \r\n3 3281 13700 14795 4365 \r\n3 1486 15280 13700 4365 \r\n3 535 14795 15280 4365 \r\n3 2575 15282 11368 4366 \r\n3 2455 15281 15282 4366 \r\n3 3926 11368 15281 4366 \r\n3 1124 8173 15283 4367 \r\n3 4266 13354 8173 4367 \r\n3 2421 15283 13354 4367 \r\n3 4032 15285 15284 4368 \r\n3 1048 9089 15285 4368 \r\n3 2847 15284 9089 4368 \r\n3 3456 15288 15287 4369 \r\n3 1663 15286 15288 4369 \r\n3 14 15287 15286 4369 \r\n3 6 15289 10282 4370 \r\n3 4942 7638 15289 4370 \r\n3 1116 10282 7638 4370 \r\n3 735 15290 8345 4371 \r\n3 1338 10813 15290 4371 \r\n3 4885 8345 10813 4371 \r\n3 922 8199 14368 4372 \r\n3 2331 15291 8199 4372 \r\n3 4152 14368 15291 4372 \r\n3 1619 15294 15293 4373 \r\n3 2857 15292 15294 4373 \r\n3 4867 15293 15292 4373 \r\n3 1520 15296 15295 4374 \r\n3 4404 9558 15296 4374 \r\n3 134 15295 9558 4374 \r\n3 584 15298 15297 4375 \r\n3 3648 14997 15298 4375 \r\n3 118 15297 14997 4375 \r\n3 2865 8286 15299 4376 \r\n3 145 5589 8286 4376 \r\n3 4392 15299 5589 4376 \r\n3 3485 11204 15300 4377 \r\n3 1767 9253 11204 4377 \r\n3 1162 15300 9253 4377 \r\n3 2415 12376 15302 4378 \r\n3 3604 15301 12376 4378 \r\n3 2386 15302 15301 4378 \r\n3 1436 5893 15304 4379 \r\n3 3274 15303 5893 4379 \r\n3 308 15304 15303 4379 \r\n3 663 14248 12409 4380 \r\n3 4656 13128 14248 4380 \r\n3 1642 12409 13128 4380 \r\n3 4909 15306 8515 4381 \r\n3 3679 15305 15306 4381 \r\n3 3294 8515 15305 4381 \r\n3 3433 15307 8361 4382 \r\n3 3309 6251 15307 4382 \r\n3 680 8361 6251 4382 \r\n3 4032 5973 15309 4383 \r\n3 4741 15308 5973 4383 \r\n3 3277 15309 15308 4383 \r\n3 4638 15312 15311 4384 \r\n3 1939 15310 15312 4384 \r\n3 3346 15311 15310 4384 \r\n3 2854 10966 15314 4385 \r\n3 2678 15313 10966 4385 \r\n3 460 15314 15313 4385 \r\n3 3838 14011 15315 4386 \r\n3 2010 12116 14011 4386 \r\n3 4970 15315 12116 4386 \r\n3 3601 11214 14568 4387 \r\n3 4052 5258 11214 4387 \r\n3 1920 14568 5258 4387 \r\n3 4337 15318 15317 4388 \r\n3 24 15316 15318 4388 \r\n3 1389 15317 15316 4388 \r\n3 601 15320 15319 4389 \r\n3 1816 13330 15320 4389 \r\n3 892 15319 13330 4389 \r\n3 2376 15322 9086 4390 \r\n3 417 15321 15322 4390 \r\n3 835 9086 15321 4390 \r\n3 4722 9655 15324 4391 \r\n3 3478 15323 9655 4391 \r\n3 2559 15324 15323 4391 \r\n3 4999 6820 14933 4392 \r\n3 4782 11574 6820 4392 \r\n3 1460 14933 11574 4392 \r\n3 1952 15325 10145 4393 \r\n3 213 14039 15325 4393 \r\n3 37 10145 14039 4393 \r\n3 811 15327 15326 4394 \r\n3 1488 14224 15327 4394 \r\n3 3943 15326 14224 4394 \r\n3 3831 12757 11521 4395 \r\n3 338 15328 12757 4395 \r\n3 1946 11521 15328 4395 \r\n3 16 15329 11675 4396 \r\n3 4014 11153 15329 4396 \r\n3 2888 11675 11153 4396 \r\n3 2990 15332 15331 4397 \r\n3 542 15330 15332 4397 \r\n3 4044 15331 15330 4397 \r\n3 1071 15334 15333 4398 \r\n3 4687 10908 15334 4398 \r\n3 3198 15333 10908 4398 \r\n3 2550 15335 14725 4399 \r\n3 2343 11052 15335 4399 \r\n3 1862 14725 11052 4399 \r\n3 2868 15338 15337 4400 \r\n3 4569 15336 15338 4400 \r\n3 4586 15337 15336 4400 \r\n3 74 15341 15340 4401 \r\n3 4863 15339 15341 4401 \r\n3 3664 15340 15339 4401 \r\n3 1725 9104 15343 4402 \r\n3 3909 15342 9104 4402 \r\n3 4956 15343 15342 4402 \r\n3 4985 15345 11065 4403 \r\n3 248 15344 15345 4403 \r\n3 4138 11065 15344 4403 \r\n3 2092 15348 15347 4404 \r\n3 4654 15346 15348 4404 \r\n3 3732 15347 15346 4404 \r\n3 1106 6592 12898 4405 \r\n3 2387 15349 6592 4405 \r\n3 1969 12898 15349 4405 \r\n3 2519 15351 13279 4406 \r\n3 4092 15350 15351 4406 \r\n3 2850 13279 15350 4406 \r\n3 1208 13726 8298 4407 \r\n3 4309 15352 13726 4407 \r\n3 652 8298 15352 4407 \r\n3 104 6620 15354 4408 \r\n3 798 15353 6620 4408 \r\n3 1356 15354 15353 4408 \r\n3 721 5665 13313 4409 \r\n3 3447 15355 5665 4409 \r\n3 4118 13313 15355 4409 \r\n3 2418 15357 10077 4410 \r\n3 3946 15356 15357 4410 \r\n3 4330 10077 15356 4410 \r\n3 2149 15164 15359 4411 \r\n3 4084 15358 15164 4411 \r\n3 1723 15359 15358 4411 \r\n3 4344 6976 10228 4412 \r\n3 1029 12469 6976 4412 \r\n3 3915 10228 12469 4412 \r\n3 1692 15361 15360 4413 \r\n3 2085 13703 15361 4413 \r\n3 285 15360 13703 4413 \r\n3 1135 9367 14924 4414 \r\n3 4725 6708 9367 4414 \r\n3 3007 14924 6708 4414 \r\n3 477 15364 15363 4415 \r\n3 1769 15362 15364 4415 \r\n3 2613 15363 15362 4415 \r\n3 2366 15366 15365 4416 \r\n3 1936 5411 15366 4416 \r\n3 2697 15365 5411 4416 \r\n3 364 15369 15368 4417 \r\n3 107 15367 15369 4417 \r\n3 813 15368 15367 4417 \r\n3 4797 15372 15371 4418 \r\n3 2616 15370 15372 4418 \r\n3 2914 15371 15370 4418 \r\n3 1431 5137 12834 4419 \r\n3 2726 15373 5137 4419 \r\n3 2022 12834 15373 4419 \r\n3 1091 7788 8155 4420 \r\n3 2600 15374 7788 4420 \r\n3 2676 8155 15374 4420 \r\n3 829 10062 15376 4421 \r\n3 3609 15375 10062 4421 \r\n3 4900 15376 15375 4421 \r\n3 2536 7933 11745 4422 \r\n3 1699 15377 7933 4422 \r\n3 202 11745 15377 4422 \r\n3 2115 13454 6832 4423 \r\n3 4637 14531 13454 4423 \r\n3 2685 6832 14531 4423 \r\n3 559 10773 11363 4424 \r\n3 4627 15378 10773 4424 \r\n3 3393 11363 15378 4424 \r\n3 2691 7167 14370 4425 \r\n3 1305 15379 7167 4425 \r\n3 1821 14370 15379 4425 \r\n3 1015 6853 15380 4426 \r\n3 520 14084 6853 4426 \r\n3 157 15380 14084 4426 \r\n3 2380 15382 15381 4427 \r\n3 3142 6943 15382 4427 \r\n3 3912 15381 6943 4427 \r\n3 2444 10412 15162 4428 \r\n3 55 15383 10412 4428 \r\n3 4627 15162 15383 4428 \r\n3 243 14999 15384 4429 \r\n3 1042 7636 14999 4429 \r\n3 4807 15384 7636 4429 \r\n3 2514 15387 15386 4430 \r\n3 2486 15385 15387 4430 \r\n3 818 15386 15385 4430 \r\n3 2284 15389 15388 4431 \r\n3 4910 12282 15389 4431 \r\n3 2169 15388 12282 4431 \r\n3 1835 10829 15390 4432 \r\n3 3359 15083 10829 4432 \r\n3 1959 15390 15083 4432 \r\n3 1525 15391 8730 4433 \r\n3 3373 7003 15391 4433 \r\n3 4814 8730 7003 4433 \r\n3 1741 15392 6668 4434 \r\n3 4530 15101 15392 4434 \r\n3 1103 6668 15101 4434 \r\n3 2791 8984 15393 4435 \r\n3 1137 6946 8984 4435 \r\n3 4445 15393 6946 4435 \r\n3 2805 15395 15394 4436 \r\n3 1913 9541 15395 4436 \r\n3 2187 15394 9541 4436 \r\n3 2176 10420 15397 4437 \r\n3 2821 15396 10420 4437 \r\n3 1019 15397 15396 4437 \r\n3 543 15398 7842 4438 \r\n3 704 9838 15398 4438 \r\n3 2087 7842 9838 4438 \r\n3 4777 9962 15400 4439 \r\n3 3349 15399 9962 4439 \r\n3 1908 15400 15399 4439 \r\n3 3318 15402 7279 4440 \r\n3 3062 15401 15402 4440 \r\n3 2640 7279 15401 4440 \r\n3 1473 8474 7735 4441 \r\n3 1590 15403 8474 4441 \r\n3 1200 7735 15403 4441 \r\n3 4710 15405 15404 4442 \r\n3 2859 7393 15405 4442 \r\n3 1010 15404 7393 4442 \r\n3 4378 15408 15407 4443 \r\n3 2607 15406 15408 4443 \r\n3 2458 15407 15406 4443 \r\n3 2403 15411 15410 4444 \r\n3 3275 15409 15411 4444 \r\n3 3390 15410 15409 4444 \r\n3 2481 15414 15413 4445 \r\n3 283 15412 15414 4445 \r\n3 1361 15413 15412 4445 \r\n3 185 15417 15416 4446 \r\n3 4345 15415 15417 4446 \r\n3 2144 15416 15415 4446 \r\n3 3022 15178 15419 4447 \r\n3 952 15418 15178 4447 \r\n3 2597 15419 15418 4447 \r\n3 3799 15420 9336 4448 \r\n3 636 10491 15420 4448 \r\n3 2270 9336 10491 4448 \r\n3 4806 13295 14159 4449 \r\n3 1449 15421 13295 4449 \r\n3 4676 14159 15421 4449 \r\n3 1021 5854 15423 4450 \r\n3 1074 15422 5854 4450 \r\n3 2079 15423 15422 4450 \r\n3 4 15426 15425 4451 \r\n3 1846 15424 15426 4451 \r\n3 2613 15425 15424 4451 \r\n3 4751 14344 15428 4452 \r\n3 3628 15427 14344 4452 \r\n3 1037 15428 15427 4452 \r\n3 2218 15145 15430 4453 \r\n3 3181 15429 15145 4453 \r\n3 3502 15430 15429 4453 \r\n3 4000 15431 9673 4454 \r\n3 1933 13057 15431 4454 \r\n3 4197 9673 13057 4454 \r\n3 4936 15434 15433 4455 \r\n3 953 15432 15434 4455 \r\n3 944 15433 15432 4455 \r\n3 4877 15436 15435 4456 \r\n3 1253 14897 15436 4456 \r\n3 4020 15435 14897 4456 \r\n3 3728 15438 15437 4457 \r\n3 2030 11909 15438 4457 \r\n3 2249 15437 11909 4457 \r\n3 698 15440 10362 4458 \r\n3 3065 15439 15440 4458 \r\n3 4912 10362 15439 4458 \r\n3 495 11979 13212 4459 \r\n3 2664 15441 11979 4459 \r\n3 4304 13212 15441 4459 \r\n3 1420 11296 9085 4460 \r\n3 2779 15442 11296 4460 \r\n3 1911 9085 15442 4460 \r\n3 265 15444 15443 4461 \r\n3 3641 11619 15444 4461 \r\n3 1723 15443 11619 4461 \r\n3 1850 15447 15446 4462 \r\n3 2294 15445 15447 4462 \r\n3 4644 15446 15445 4462 \r\n3 2876 14745 15449 4463 \r\n3 3218 15448 14745 4463 \r\n3 3983 15449 15448 4463 \r\n3 3690 15451 15450 4464 \r\n3 470 14511 15451 4464 \r\n3 4477 15450 14511 4464 \r\n3 3451 6710 10303 4465 \r\n3 4523 15452 6710 4465 \r\n3 4600 10303 15452 4465 \r\n3 2406 15454 15453 4466 \r\n3 982 7688 15454 4466 \r\n3 2950 15453 7688 4466 \r\n3 475 15455 5438 4467 \r\n3 1348 14462 15455 4467 \r\n3 2886 5438 14462 4467 \r\n3 117 15458 15457 4468 \r\n3 1758 15456 15458 4468 \r\n3 4550 15457 15456 4468 \r\n3 4563 15460 15459 4469 \r\n3 4091 13627 15460 4469 \r\n3 726 15459 13627 4469 \r\n3 3154 10181 15462 4470 \r\n3 3741 15461 10181 4470 \r\n3 3827 15462 15461 4470 \r\n3 237 13475 15464 4471 \r\n3 3326 15463 13475 4471 \r\n3 3060 15464 15463 4471 \r\n3 1646 15467 15466 4472 \r\n3 3751 15465 15467 4472 \r\n3 3577 15466 15465 4472 \r\n3 4362 15470 15469 4473 \r\n3 4670 15468 15470 4473 \r\n3 530 15469 15468 4473 \r\n3 1212 9515 8759 4474 \r\n3 544 5763 9515 4474 \r\n3 2614 8759 5763 4474 \r\n3 4449 15472 15471 4475 \r\n3 3296 6624 15472 4475 \r\n3 3133 15471 6624 4475 \r\n3 265 11349 15444 4476 \r\n3 457 14590 11349 4476 \r\n3 3641 15444 14590 4476 \r\n3 3182 15474 5793 4477 \r\n3 806 15473 15474 4477 \r\n3 2579 5793 15473 4477 \r\n3 3139 15476 7157 4478 \r\n3 3279 15475 15476 4478 \r\n3 3941 7157 15475 4478 \r\n3 1564 7949 5167 4479 \r\n3 3774 15477 7949 4479 \r\n3 887 5167 15477 4479 \r\n3 2172 5117 15478 4480 \r\n3 4830 12265 5117 4480 \r\n3 3156 15478 12265 4480 \r\n3 3907 15481 15480 4481 \r\n3 732 15479 15481 4481 \r\n3 91 15480 15479 4481 \r\n3 4404 15482 6369 4482 \r\n3 4729 6575 15482 4482 \r\n3 2132 6369 6575 4482 \r\n3 1878 6092 15484 4483 \r\n3 1735 15483 6092 4483 \r\n3 343 15484 15483 4483 \r\n3 1134 11101 15485 4484 \r\n3 1358 5076 11101 4484 \r\n3 2474 15485 5076 4484 \r\n3 3358 8068 6114 4485 \r\n3 2843 13829 8068 4485 \r\n3 4273 6114 13829 4485 \r\n3 68 15487 9757 4486 \r\n3 3120 15486 15487 4486 \r\n3 4934 9757 15486 4486 \r\n3 4608 15488 9100 4487 \r\n3 4275 13154 15488 4487 \r\n3 2883 9100 13154 4487 \r\n3 2408 14298 15489 4488 \r\n3 762 10248 14298 4488 \r\n3 1984 15489 10248 4488 \r\n3 2258 6568 9918 4489 \r\n3 2613 15362 6568 4489 \r\n3 1769 9918 15362 4489 \r\n3 644 15491 7426 4490 \r\n3 4785 15490 15491 4490 \r\n3 3051 7426 15490 4490 \r\n3 2494 15493 6235 4491 \r\n3 2611 15492 15493 4491 \r\n3 3331 6235 15492 4491 \r\n3 1897 15494 11793 4492 \r\n3 2992 11760 15494 4492 \r\n3 189 11793 11760 4492 \r\n3 4671 14618 10484 4493 \r\n3 1379 14676 14618 4493 \r\n3 1682 10484 14676 4493 \r\n3 3540 7427 15495 4494 \r\n3 3051 8163 7427 4494 \r\n3 3509 15495 8163 4494 \r\n3 177 15496 5824 4495 \r\n3 412 9266 15496 4495 \r\n3 630 5824 9266 4495 \r\n3 1800 15499 15498 4496 \r\n3 3019 15497 15499 4496 \r\n3 4237 15498 15497 4496 \r\n3 2938 8332 15501 4497 \r\n3 859 15500 8332 4497 \r\n3 3616 15501 15500 4497 \r\n3 2271 15503 15502 4498 \r\n3 891 14493 15503 4498 \r\n3 741 15502 14493 4498 \r\n3 1154 10069 15505 4499 \r\n3 332 15504 10069 4499 \r\n3 2591 15505 15504 4499 \r\n3 75 9097 7432 4500 \r\n3 1520 15506 9097 4500 \r\n3 2324 7432 15506 4500 \r\n3 164 15507 5754 4501 \r\n3 1932 8902 15507 4501 \r\n3 3709 5754 8902 4501 \r\n3 3788 12390 15509 4502 \r\n3 2479 15508 12390 4502 \r\n3 981 15509 15508 4502 \r\n3 2705 13144 13914 4503 \r\n3 1012 15510 13144 4503 \r\n3 4787 13914 15510 4503 \r\n3 303 15512 12283 4504 \r\n3 828 15511 15512 4504 \r\n3 1388 12283 15511 4504 \r\n3 4466 14173 15514 4505 \r\n3 2233 15513 14173 4505 \r\n3 2562 15514 15513 4505 \r\n3 1024 15517 15516 4506 \r\n3 2961 15515 15517 4506 \r\n3 1394 15516 15515 4506 \r\n3 3081 15520 15519 4507 \r\n3 1230 15518 15520 4507 \r\n3 840 15519 15518 4507 \r\n3 4763 15522 15521 4508 \r\n3 3320 12733 15522 4508 \r\n3 742 15521 12733 4508 \r\n3 4525 15525 15524 4509 \r\n3 2551 15523 15525 4509 \r\n3 546 15524 15523 4509 \r\n3 4456 15527 6717 4510 \r\n3 3377 15526 15527 4510 \r\n3 855 6717 15526 4510 \r\n3 3650 11069 15529 4511 \r\n3 2347 15528 11069 4511 \r\n3 2804 15529 15528 4511 \r\n3 2950 15531 15530 4512 \r\n3 102 7395 15531 4512 \r\n3 2461 15530 7395 4512 \r\n3 3665 15533 13084 4513 \r\n3 2231 15532 15533 4513 \r\n3 2995 13084 15532 4513 \r\n3 2139 12701 15534 4514 \r\n3 3850 12807 12701 4514 \r\n3 792 15534 12807 4514 \r\n3 978 15536 14584 4515 \r\n3 1156 15535 15536 4515 \r\n3 841 14584 15535 4515 \r\n3 2940 7986 5483 4516 \r\n3 4547 14093 7986 4516 \r\n3 1370 5483 14093 4516 \r\n3 2650 15539 15538 4517 \r\n3 2390 15537 15539 4517 \r\n3 4983 15538 15537 4517 \r\n3 2884 10063 15541 4518 \r\n3 4263 15540 10063 4518 \r\n3 4551 15541 15540 4518 \r\n3 766 15543 12934 4519 \r\n3 4177 15542 15543 4519 \r\n3 3506 12934 15542 4519 \r\n3 39 15545 15544 4520 \r\n3 3 14337 15545 4520 \r\n3 1867 15544 14337 4520 \r\n3 1448 15546 10503 4521 \r\n3 1180 14916 15546 4521 \r\n3 4899 10503 14916 4521 \r\n3 3212 15548 11821 4522 \r\n3 4426 15547 15548 4522 \r\n3 1369 11821 15547 4522 \r\n3 2777 15261 15550 4523 \r\n3 1849 15549 15261 4523 \r\n3 1016 15550 15549 4523 \r\n3 4503 15552 15551 4524 \r\n3 2129 14506 15552 4524 \r\n3 3545 15551 14506 4524 \r\n3 3466 15555 15554 4525 \r\n3 264 15553 15555 4525 \r\n3 2553 15554 15553 4525 \r\n3 2305 15558 15557 4526 \r\n3 2465 15556 15558 4526 \r\n3 1209 15557 15556 4526 \r\n3 2642 12818 15559 4527 \r\n3 3176 14834 12818 4527 \r\n3 3972 15559 14834 4527 \r\n3 166 13477 8836 4528 \r\n3 4472 12490 13477 4528 \r\n3 1138 8836 12490 4528 \r\n3 3026 15561 11869 4529 \r\n3 2510 15560 15561 4529 \r\n3 2422 11869 15560 4529 \r\n3 568 15563 15089 4530 \r\n3 2382 15562 15563 4530 \r\n3 3074 15089 15562 4530 \r\n3 2282 15565 10018 4531 \r\n3 817 15564 15565 4531 \r\n3 4074 10018 15564 4531 \r\n3 3578 15566 6726 4532 \r\n3 1731 6944 15566 4532 \r\n3 1137 6726 6944 4532 \r\n3 1179 14456 15567 4533 \r\n3 2217 15074 14456 4533 \r\n3 1290 15567 15074 4533 \r\n3 1061 15569 13463 4534 \r\n3 634 15568 15569 4534 \r\n3 4173 13463 15568 4534 \r\n3 1766 15571 14527 4535 \r\n3 3675 15570 15571 4535 \r\n3 3001 14527 15570 4535 \r\n3 257 15573 8920 4536 \r\n3 3853 15572 15573 4536 \r\n3 2632 8920 15572 4536 \r\n3 2903 12922 15135 4537 \r\n3 4321 10429 12922 4537 \r\n3 1616 15135 10429 4537 \r\n3 498 11239 11848 4538 \r\n3 3687 15574 11239 4538 \r\n3 569 11848 15574 4538 \r\n3 3213 15576 15575 4539 \r\n3 1269 12845 15576 4539 \r\n3 1068 15575 12845 4539 \r\n3 4822 10714 15578 4540 \r\n3 800 15577 10714 4540 \r\n3 1750 15578 15577 4540 \r\n3 4091 9300 9759 4541 \r\n3 1884 15579 9300 4541 \r\n3 68 9759 15579 4541 \r\n3 3356 15582 15581 4542 \r\n3 3360 15580 15582 4542 \r\n3 4127 15581 15580 4542 \r\n3 207 11025 15583 4543 \r\n3 2924 9889 11025 4543 \r\n3 4011 15583 9889 4543 \r\n3 4966 15584 10234 4544 \r\n3 4032 15309 15584 4544 \r\n3 3277 10234 15309 4544 \r\n3 966 15587 15586 4545 \r\n3 3487 15585 15587 4545 \r\n3 4394 15586 15585 4545 \r\n3 3775 6289 11992 4546 \r\n3 3235 15588 6289 4546 \r\n3 1478 11992 15588 4546 \r\n3 3650 15529 15590 4547 \r\n3 2804 15589 15529 4547 \r\n3 1335 15590 15589 4547 \r\n3 1833 8757 8260 4548 \r\n3 1920 7512 8757 4548 \r\n3 588 8260 7512 4548 \r\n3 2895 15593 15592 4549 \r\n3 1528 15591 15593 4549 \r\n3 1020 15592 15591 4549 \r\n3 3319 15596 15595 4550 \r\n3 3387 15594 15596 4550 \r\n3 1374 15595 15594 4550 \r\n3 1967 7874 5380 4551 \r\n3 4401 10658 7874 4551 \r\n3 1344 5380 10658 4551 \r\n3 746 15598 15597 4552 \r\n3 841 15535 15598 4552 \r\n3 1156 15597 15535 4552 \r\n3 1392 15599 13684 4553 \r\n3 294 7677 15599 4553 \r\n3 2795 13684 7677 4553 \r\n3 4754 15602 15601 4554 \r\n3 1016 15600 15602 4554 \r\n3 541 15601 15600 4554 \r\n3 2107 15605 15604 4555 \r\n3 4662 15603 15605 4555 \r\n3 2907 15604 15603 4555 \r\n3 564 15607 15606 4556 \r\n3 1653 8762 15607 4556 \r\n3 1528 15606 8762 4556 \r\n3 2803 15609 10096 4557 \r\n3 2066 15608 15609 4557 \r\n3 4169 10096 15608 4557 \r\n3 984 15611 13388 4558 \r\n3 1817 15610 15611 4558 \r\n3 4575 13388 15610 4558 \r\n3 1114 15613 15612 4559 \r\n3 196 10140 15613 4559 \r\n3 1403 15612 10140 4559 \r\n3 4288 15614 8986 4560 \r\n3 3558 5728 15614 4560 \r\n3 2175 8986 5728 4560 \r\n3 715 15616 15615 4561 \r\n3 644 10732 15616 4561 \r\n3 1395 15615 10732 4561 \r\n3 4010 15619 15618 4562 \r\n3 239 15617 15619 4562 \r\n3 4017 15618 15617 4562 \r\n3 2423 15621 8153 4563 \r\n3 3786 15620 15621 4563 \r\n3 1587 8153 15620 4563 \r\n3 709 15623 11589 4564 \r\n3 1133 15622 15623 4564 \r\n3 4973 11589 15622 4564 \r\n3 699 13341 15624 4565 \r\n3 3827 15461 13341 4565 \r\n3 3741 15624 15461 4565 \r\n3 2839 15627 15626 4566 \r\n3 2689 15625 15627 4566 \r\n3 3665 15626 15625 4566 \r\n3 2101 15629 15628 4567 \r\n3 3769 9159 15629 4567 \r\n3 4239 15628 9159 4567 \r\n3 1136 15631 9862 4568 \r\n3 811 15630 15631 4568 \r\n3 2894 9862 15630 4568 \r\n3 3136 5332 15632 4569 \r\n3 448 10851 5332 4569 \r\n3 491 15632 10851 4569 \r\n3 1968 14115 15634 4570 \r\n3 1252 15633 14115 4570 \r\n3 4175 15634 15633 4570 \r\n3 823 15637 15636 4571 \r\n3 4417 15635 15637 4571 \r\n3 2227 15636 15635 4571 \r\n3 3443 15639 15638 4572 \r\n3 4876 8467 15639 4572 \r\n3 4292 15638 8467 4572 \r\n3 2097 15640 12016 4573 \r\n3 996 11157 15640 4573 \r\n3 2817 12016 11157 4573 \r\n3 4849 15641 5432 4574 \r\n3 948 12832 15641 4574 \r\n3 894 5432 12832 4574 \r\n3 1172 15643 9859 4575 \r\n3 2687 15642 15643 4575 \r\n3 1451 9859 15642 4575 \r\n3 3011 15645 11812 4576 \r\n3 920 15644 15645 4576 \r\n3 58 11812 15644 4576 \r\n3 765 15238 12198 4577 \r\n3 2222 11125 15238 4577 \r\n3 3850 12198 11125 4577 \r\n3 3945 9497 14426 4578 \r\n3 4509 15646 9497 4578 \r\n3 3919 14426 15646 4578 \r\n3 4369 15649 15648 4579 \r\n3 2142 15647 15649 4579 \r\n3 2616 15648 15647 4579 \r\n3 4669 15651 15650 4580 \r\n3 723 14789 15651 4580 \r\n3 2838 15650 14789 4580 \r\n3 2622 10504 15652 4581 \r\n3 4899 13480 10504 4581 \r\n3 2836 15652 13480 4581 \r\n3 1212 15654 15653 4582 \r\n3 678 14539 15654 4582 \r\n3 2202 15653 14539 4582 \r\n3 146 15657 15656 4583 \r\n3 1612 15655 15657 4583 \r\n3 4322 15656 15655 4583 \r\n3 4888 15660 15659 4584 \r\n3 2723 15658 15660 4584 \r\n3 2303 15659 15658 4584 \r\n3 4706 15663 15662 4585 \r\n3 2496 15661 15663 4585 \r\n3 3860 15662 15661 4585 \r\n3 4352 8679 13456 4586 \r\n3 1640 15664 8679 4586 \r\n3 4637 13456 15664 4586 \r\n3 1882 15666 10436 4587 \r\n3 1503 15665 15666 4587 \r\n3 1538 10436 15665 4587 \r\n3 3551 15668 15667 4588 \r\n3 1012 13143 15668 4588 \r\n3 2684 15667 13143 4588 \r\n3 3382 15671 15670 4589 \r\n3 2911 15669 15671 4589 \r\n3 2748 15670 15669 4589 \r\n3 1829 10370 6692 4590 \r\n3 1351 8620 10370 4590 \r\n3 280 6692 8620 4590 \r\n3 1802 14901 9434 4591 \r\n3 1434 15672 14901 4591 \r\n3 1995 9434 15672 4591 \r\n3 542 15674 15673 4592 \r\n3 738 5284 15674 4592 \r\n3 2589 15673 5284 4592 \r\n3 3636 15675 12347 4593 \r\n3 4777 15400 15675 4593 \r\n3 1908 12347 15400 4593 \r\n3 2055 15676 11474 4594 \r\n3 1846 15426 15676 4594 \r\n3 4 11474 15426 4594 \r\n3 1271 15678 15677 4595 \r\n3 3053 6246 15678 4595 \r\n3 3199 15677 6246 4595 \r\n3 1701 15679 7272 4596 \r\n3 4692 6972 15679 4596 \r\n3 375 7272 6972 4596 \r\n3 1188 13383 15680 4597 \r\n3 1168 14440 13383 4597 \r\n3 3804 15680 14440 4597 \r\n3 1795 12607 11118 4598 \r\n3 3735 15681 12607 4598 \r\n3 4406 11118 15681 4598 \r\n3 1824 15683 15682 4599 \r\n3 2784 13438 15683 4599 \r\n3 1034 15682 13438 4599 \r\n3 2344 9243 15685 4600 \r\n3 3433 15684 9243 4600 \r\n3 395 15685 15684 4600 \r\n3 2501 8707 15687 4601 \r\n3 2047 15686 8707 4601 \r\n3 4270 15687 15686 4601 \r\n3 1438 13749 15689 4602 \r\n3 3458 15688 13749 4602 \r\n3 2492 15689 15688 4602 \r\n3 4516 5277 6829 4603 \r\n3 2649 15690 5277 4603 \r\n3 3671 6829 15690 4603 \r\n3 4871 15692 15691 4604 \r\n3 23 13495 15692 4604 \r\n3 3696 15691 13495 4604 \r\n3 561 6611 6649 4605 \r\n3 3330 15693 6611 4605 \r\n3 3564 6649 15693 4605 \r\n3 4892 15695 8867 4606 \r\n3 424 15694 15695 4606 \r\n3 3354 8867 15694 4606 \r\n3 3726 15697 11767 4607 \r\n3 4274 15696 15697 4607 \r\n3 2152 11767 15696 4607 \r\n3 727 15700 15699 4608 \r\n3 4564 15698 15700 4608 \r\n3 2460 15699 15698 4608 \r\n3 4845 11547 15702 4609 \r\n3 3151 15701 11547 4609 \r\n3 897 15702 15701 4609 \r\n3 1562 15703 14295 4610 \r\n3 2628 11447 15703 4610 \r\n3 2093 14295 11447 4610 \r\n3 1152 5810 8549 4611 \r\n3 1057 15704 5810 4611 \r\n3 660 8549 15704 4611 \r\n3 715 15615 13913 4612 \r\n3 1395 10150 15615 4612 \r\n3 2620 13913 10150 4612 \r\n3 2403 15410 15705 4613 \r\n3 3390 13442 15410 4613 \r\n3 383 15705 13442 4613 \r\n3 4596 15706 14689 4614 \r\n3 4805 14615 15706 4614 \r\n3 4098 14689 14615 4614 \r\n3 127 15708 14828 4615 \r\n3 530 15707 15708 4615 \r\n3 2067 14828 15707 4615 \r\n3 2415 15302 7767 4616 \r\n3 2386 15709 15302 4616 \r\n3 858 7767 15709 4616 \r\n3 1699 11136 15377 4617 \r\n3 410 5978 11136 4617 \r\n3 202 15377 5978 4617 \r\n3 4656 14247 15710 4618 \r\n3 3134 14550 14247 4618 \r\n3 3476 15710 14550 4618 \r\n3 1326 8600 5817 4619 \r\n3 2327 11956 8600 4619 \r\n3 56 5817 11956 4619 \r\n3 2817 8078 12017 4620 \r\n3 4664 11397 8078 4620 \r\n3 3006 12017 11397 4620 \r\n3 999 15712 11891 4621 \r\n3 3189 15711 15712 4621 \r\n3 2813 11891 15711 4621 \r\n3 4063 15714 15713 4622 \r\n3 3819 14896 15714 4622 \r\n3 2241 15713 14896 4622 \r\n3 2036 15716 15715 4623 \r\n3 4218 14981 15716 4623 \r\n3 44 15715 14981 4623 \r\n3 4813 15718 9952 4624 \r\n3 3970 15717 15718 4624 \r\n3 4721 9952 15717 4624 \r\n3 4522 15721 15720 4625 \r\n3 1886 15719 15721 4625 \r\n3 1698 15720 15719 4625 \r\n3 3668 12124 6897 4626 \r\n3 1801 15722 12124 4626 \r\n3 330 6897 15722 4626 \r\n3 2686 15724 15723 4627 \r\n3 3949 7300 15724 4627 \r\n3 4320 15723 7300 4627 \r\n3 4907 15726 8478 4628 \r\n3 4411 15725 15726 4628 \r\n3 2420 8478 15725 4628 \r\n3 1659 15728 15727 4629 \r\n3 2414 6614 15728 4629 \r\n3 4895 15727 6614 4629 \r\n3 2701 15730 15729 4630 \r\n3 2561 12712 15730 4630 \r\n3 428 15729 12712 4630 \r\n3 4034 15731 8838 4631 \r\n3 3020 11066 15731 4631 \r\n3 4138 8838 11066 4631 \r\n3 4047 15732 11843 4632 \r\n3 3064 10905 15732 4632 \r\n3 599 11843 10905 4632 \r\n3 210 15735 15734 4633 \r\n3 3811 15733 15735 4633 \r\n3 2543 15734 15733 4633 \r\n3 3437 7014 13399 4634 \r\n3 455 15736 7014 4634 \r\n3 1599 13399 15736 4634 \r\n3 1483 15738 15737 4635 \r\n3 2905 8755 15738 4635 \r\n3 1833 15737 8755 4635 \r\n3 2785 9043 15740 4636 \r\n3 518 15739 9043 4636 \r\n3 3161 15740 15739 4636 \r\n3 4251 7289 13193 4637 \r\n3 1825 15741 7289 4637 \r\n3 2798 13193 15741 4637 \r\n3 3580 15743 15266 4638 \r\n3 2142 15742 15743 4638 \r\n3 1001 15266 15742 4638 \r\n3 3664 9078 15340 4639 \r\n3 315 9801 9078 4639 \r\n3 74 15340 9801 4639 \r\n3 3979 15746 15745 4640 \r\n3 2955 15744 15746 4640 \r\n3 3815 15745 15744 4640 \r\n3 371 10212 15748 4641 \r\n3 2635 15747 10212 4641 \r\n3 693 15748 15747 4641 \r\n3 3782 12470 10359 4642 \r\n3 2058 13440 12470 4642 \r\n3 4643 10359 13440 4642 \r\n3 1547 7407 11732 4643 \r\n3 612 15749 7407 4643 \r\n3 797 11732 15749 4643 \r\n3 1100 15752 15751 4644 \r\n3 4659 15750 15752 4644 \r\n3 657 15751 15750 4644 \r\n3 2617 11749 14806 4645 \r\n3 4824 15753 11749 4645 \r\n3 649 14806 15753 4645 \r\n3 500 6255 6338 4646 \r\n3 3634 15754 6255 4646 \r\n3 3678 6338 15754 4646 \r\n3 1121 15755 13945 4647 \r\n3 607 15166 15755 4647 \r\n3 3931 13945 15166 4647 \r\n3 3125 12632 15756 4648 \r\n3 1023 5717 12632 4648 \r\n3 306 15756 5717 4648 \r\n3 2131 15757 11677 4649 \r\n3 3727 15221 15757 4649 \r\n3 3106 11677 15221 4649 \r\n3 113 5034 15759 4650 \r\n3 3842 15758 5034 4650 \r\n3 1644 15759 15758 4650 \r\n3 61 7498 5993 4651 \r\n3 3697 15760 7498 4651 \r\n3 3868 5993 15760 4651 \r\n3 4350 15762 9774 4652 \r\n3 2653 15761 15762 4652 \r\n3 3038 9774 15761 4652 \r\n3 4150 15763 14653 4653 \r\n3 184 13628 15763 4653 \r\n3 3497 14653 13628 4653 \r\n3 2059 15765 15764 4654 \r\n3 4951 7856 15765 4654 \r\n3 2593 15764 7856 4654 \r\n3 2211 15767 8703 4655 \r\n3 2051 15766 15767 4655 \r\n3 3576 8703 15766 4655 \r\n3 747 15768 6476 4656 \r\n3 1190 14945 15768 4656 \r\n3 2125 6476 14945 4656 \r\n3 993 10539 7615 4657 \r\n3 178 14471 10539 4657 \r\n3 4396 7615 14471 4657 \r\n3 4358 11316 5510 4658 \r\n3 1809 9806 11316 4658 \r\n3 2598 5510 9806 4658 \r\n3 2388 12800 15770 4659 \r\n3 2909 15769 12800 4659 \r\n3 1828 15770 15769 4659 \r\n3 3830 15771 8141 4660 \r\n3 1481 8010 15771 4660 \r\n3 3005 8141 8010 4660 \r\n3 3493 15773 15772 4661 \r\n3 3415 12094 15773 4661 \r\n3 3379 15772 12094 4661 \r\n3 1223 15776 15775 4662 \r\n3 1751 15774 15776 4662 \r\n3 4659 15775 15774 4662 \r\n3 2477 15777 8622 4663 \r\n3 3594 14087 15777 4663 \r\n3 280 8622 14087 4663 \r\n3 1956 13178 15778 4664 \r\n3 3141 5822 13178 4664 \r\n3 630 15778 5822 4664 \r\n3 3014 10183 15779 4665 \r\n3 4271 10736 10183 4665 \r\n3 1347 15779 10736 4665 \r\n3 4046 15782 15781 4666 \r\n3 1539 15780 15782 4666 \r\n3 2450 15781 15780 4666 \r\n3 1744 10188 15784 4667 \r\n3 1263 15783 10188 4667 \r\n3 3384 15784 15783 4667 \r\n3 2810 15785 5687 4668 \r\n3 406 10964 15785 4668 \r\n3 253 5687 10964 4668 \r\n3 1484 15786 11344 4669 \r\n3 2145 14122 15786 4669 \r\n3 2729 11344 14122 4669 \r\n3 2636 15789 15788 4670 \r\n3 1736 15787 15789 4670 \r\n3 3504 15788 15787 4670 \r\n3 4325 15792 15791 4671 \r\n3 2943 15790 15792 4671 \r\n3 4026 15791 15790 4671 \r\n3 2437 15793 7796 4672 \r\n3 1163 14862 15793 4672 \r\n3 33 7796 14862 4672 \r\n3 1036 12404 7009 4673 \r\n3 4211 10882 12404 4673 \r\n3 3848 7009 10882 4673 \r\n3 3420 13342 15794 4674 \r\n3 4458 7995 13342 4674 \r\n3 222 15794 7995 4674 \r\n3 953 15796 15795 4675 \r\n3 3973 11103 15796 4675 \r\n3 4876 15795 11103 4675 \r\n3 1834 15797 10116 4676 \r\n3 1251 7936 15797 4676 \r\n3 1194 10116 7936 4676 \r\n3 129 10293 15798 4677 \r\n3 4726 9175 10293 4677 \r\n3 2743 15798 9175 4677 \r\n3 1776 7220 8864 4678 \r\n3 3331 15492 7220 4678 \r\n3 2611 8864 15492 4678 \r\n3 3241 10266 15800 4679 \r\n3 3986 15799 10266 4679 \r\n3 2932 15800 15799 4679 \r\n3 3279 5946 15475 4680 \r\n3 4737 15801 5946 4680 \r\n3 3941 15475 15801 4680 \r\n3 796 15803 10839 4681 \r\n3 265 15802 15803 4681 \r\n3 503 10839 15802 4681 \r\n3 242 15805 14352 4682 \r\n3 4621 15804 15805 4682 \r\n3 4301 14352 15804 4682 \r\n3 3435 15808 15807 4683 \r\n3 4711 15806 15808 4683 \r\n3 1018 15807 15806 4683 \r\n3 2549 15809 14443 4684 \r\n3 1295 13426 15809 4684 \r\n3 4176 14443 13426 4684 \r\n3 453 7819 15810 4685 \r\n3 3383 10193 7819 4685 \r\n3 3333 15810 10193 4685 \r\n3 2344 15812 9244 4686 \r\n3 1601 15811 15812 4686 \r\n3 1429 9244 15811 4686 \r\n3 1462 15814 15813 4687 \r\n3 1605 6360 15814 4687 \r\n3 3954 15813 6360 4687 \r\n3 4285 15817 15816 4688 \r\n3 1703 15815 15817 4688 \r\n3 2775 15816 15815 4688 \r\n3 3613 11360 15819 4689 \r\n3 4079 15818 11360 4689 \r\n3 2430 15819 15818 4689 \r\n3 100 13260 15820 4690 \r\n3 1686 6888 13260 4690 \r\n3 260 15820 6888 4690 \r\n3 4529 15821 11240 4691 \r\n3 1528 8761 15821 4691 \r\n3 3687 11240 8761 4691 \r\n3 4275 15488 6949 4692 \r\n3 4608 15822 15488 4692 \r\n3 563 6949 15822 4692 \r\n3 465 11170 10742 4693 \r\n3 1716 8243 11170 4693 \r\n3 4851 10742 8243 4693 \r\n3 3765 15823 11705 4694 \r\n3 2779 11596 15823 4694 \r\n3 408 11705 11596 4694 \r\n3 286 11779 15195 4695 \r\n3 1572 6176 11779 4695 \r\n3 4546 15195 6176 4695 \r\n3 2140 15824 12179 4696 \r\n3 3566 6580 15824 4696 \r\n3 1570 12179 6580 4696 \r\n3 4398 15825 8303 4697 \r\n3 2909 7138 15825 4697 \r\n3 1446 8303 7138 4697 \r\n3 1113 6220 9453 4698 \r\n3 1753 11933 6220 4698 \r\n3 567 9453 11933 4698 \r\n3 945 15827 15826 4699 \r\n3 1495 13638 15827 4699 \r\n3 138 15826 13638 4699 \r\n3 1381 9934 8185 4700 \r\n3 799 12965 9934 4700 \r\n3 3730 8185 12965 4700 \r\n3 4173 15568 15828 4701 \r\n3 634 11923 15568 4701 \r\n3 4124 15828 11923 4701 \r\n3 4448 12181 15830 4702 \r\n3 4030 15829 12181 4702 \r\n3 2445 15830 15829 4702 \r\n3 2807 13745 15831 4703 \r\n3 2559 15323 13745 4703 \r\n3 3478 15831 15323 4703 \r\n3 508 15834 15833 4704 \r\n3 1486 15832 15834 4704 \r\n3 1939 15833 15832 4704 \r\n3 1499 15837 15836 4705 \r\n3 152 15835 15837 4705 \r\n3 1947 15836 15835 4705 \r\n3 3733 15839 13739 4706 \r\n3 445 15838 15839 4706 \r\n3 9 13739 15838 4706 \r\n3 1122 15122 15840 4707 \r\n3 2226 8313 15122 4707 \r\n3 3453 15840 8313 4707 \r\n3 3118 15842 15841 4708 \r\n3 336 6714 15842 4708 \r\n3 2020 15841 6714 4708 \r\n3 1554 14309 15844 4709 \r\n3 1027 15843 14309 4709 \r\n3 3509 15844 15843 4709 \r\n3 4214 5207 15845 4710 \r\n3 4875 14128 5207 4710 \r\n3 2778 15845 14128 4710 \r\n3 4175 11879 15634 4711 \r\n3 2374 9480 11879 4711 \r\n3 1968 15634 9480 4711 \r\n3 1077 14035 12629 4712 \r\n3 3672 15846 14035 4712 \r\n3 3702 12629 15846 4712 \r\n3 2033 15848 15847 4713 \r\n3 956 5423 15848 4713 \r\n3 1919 15847 5423 4713 \r\n3 1114 5506 15850 4714 \r\n3 2026 15849 5506 4714 \r\n3 4435 15850 15849 4714 \r\n3 4358 10037 11317 4715 \r\n3 3752 11187 10037 4715 \r\n3 1981 11317 11187 4715 \r\n3 384 6779 15851 4716 \r\n3 3261 9398 6779 4716 \r\n3 3123 15851 9398 4716 \r\n3 2496 14258 15661 4717 \r\n3 1262 15852 14258 4717 \r\n3 3860 15661 15852 4717 \r\n3 3829 15253 15854 4718 \r\n3 2414 15853 15253 4718 \r\n3 1903 15854 15853 4718 \r\n3 2769 5592 10297 4719 \r\n3 4986 13811 5592 4719 \r\n3 2933 10297 13811 4719 \r\n3 1801 15857 15856 4720 \r\n3 3700 15855 15857 4720 \r\n3 2441 15856 15855 4720 \r\n3 4161 15858 11223 4721 \r\n3 72 15034 15858 4721 \r\n3 2412 11223 15034 4721 \r\n3 1682 15859 14474 4722 \r\n3 1552 9948 15859 4722 \r\n3 4209 14474 9948 4722 \r\n3 2704 9828 15860 4723 \r\n3 4997 9638 9828 4723 \r\n3 1543 15860 9638 4723 \r\n3 4780 8037 7624 4724 \r\n3 877 15861 8037 4724 \r\n3 2103 7624 15861 4724 \r\n3 1891 13909 14753 4725 \r\n3 4345 15862 13909 4725 \r\n3 1607 14753 15862 4725 \r\n3 2477 15863 10280 4726 \r\n3 858 11134 15863 4726 \r\n3 2700 10280 11134 4726 \r\n3 1058 8728 6208 4727 \r\n3 2329 14472 8728 4727 \r\n3 178 6208 14472 4727 \r\n3 982 15865 7689 4728 \r\n3 2744 15864 15865 4728 \r\n3 4964 7689 15864 4728 \r\n3 259 15868 15867 4729 \r\n3 964 15866 15868 4729 \r\n3 152 15867 15866 4729 \r\n3 4292 10321 14100 4730 \r\n3 712 14231 10321 4730 \r\n3 2411 14100 14231 4730 \r\n3 3025 15870 15150 4731 \r\n3 4704 15869 15870 4731 \r\n3 3282 15150 15869 4731 \r\n3 4148 15872 15871 4732 \r\n3 3674 11381 15872 4732 \r\n3 155 15871 11381 4732 \r\n3 3895 15873 11912 4733 \r\n3 4121 6883 15873 4733 \r\n3 1086 11912 6883 4733 \r\n3 25 13888 15875 4734 \r\n3 1249 15874 13888 4734 \r\n3 3963 15875 15874 4734 \r\n3 134 9559 10654 4735 \r\n3 349 5122 9559 4735 \r\n3 3625 10654 5122 4735 \r\n3 4053 10328 8545 4736 \r\n3 4469 14671 10328 4736 \r\n3 1916 8545 14671 4736 \r\n3 1960 7822 15877 4737 \r\n3 4982 15876 7822 4737 \r\n3 3829 15877 15876 4737 \r\n3 2969 10032 14919 4738 \r\n3 2355 15878 10032 4738 \r\n3 3963 14919 15878 4738 \r\n3 3166 8570 15879 4739 \r\n3 1845 14355 8570 4739 \r\n3 2483 15879 14355 4739 \r\n3 1575 15882 15881 4740 \r\n3 4543 15880 15882 4740 \r\n3 4475 15881 15880 4740 \r\n3 655 11544 12446 4741 \r\n3 2907 15603 11544 4741 \r\n3 4662 12446 15603 4741 \r\n3 3844 15883 10811 4742 \r\n3 3175 11597 15883 4742 \r\n3 906 10811 11597 4742 \r\n3 2161 15885 11148 4743 \r\n3 733 15884 15885 4743 \r\n3 981 11148 15884 4743 \r\n3 4772 15887 14881 4744 \r\n3 3712 15886 15887 4744 \r\n3 3164 14881 15886 4744 \r\n3 4203 11802 15888 4745 \r\n3 1267 10073 11802 4745 \r\n3 1337 15888 10073 4745 \r\n3 1064 15891 15890 4746 \r\n3 4542 15889 15891 4746 \r\n3 4210 15890 15889 4746 \r\n3 4161 15892 15858 4747 \r\n3 4054 12034 15892 4747 \r\n3 72 15858 12034 4747 \r\n3 3451 15894 15893 4748 \r\n3 1523 14260 15894 4748 \r\n3 608 15893 14260 4748 \r\n3 1701 9563 15896 4749 \r\n3 362 15895 9563 4749 \r\n3 3914 15896 15895 4749 \r\n3 2683 15898 15065 4750 \r\n3 4903 15897 15898 4750 \r\n3 4962 15065 15897 4750 \r\n3 3257 15900 14714 4751 \r\n3 2533 15899 15900 4751 \r\n3 3612 14714 15899 4751 \r\n3 3808 13483 6238 4752 \r\n3 4136 15901 13483 4752 \r\n3 4840 6238 15901 4752 \r\n3 3764 10745 13068 4753 \r\n3 2221 15902 10745 4753 \r\n3 3893 13068 15902 4753 \r\n3 499 15904 15903 4754 \r\n3 4577 14320 15904 4754 \r\n3 133 15903 14320 4754 \r\n3 337 5126 15905 4755 \r\n3 1492 9451 5126 4755 \r\n3 567 15905 9451 4755 \r\n3 1982 14442 8661 4756 \r\n3 1222 15906 14442 4756 \r\n3 2880 8661 15906 4756 \r\n3 1793 15909 15908 4757 \r\n3 1002 15907 15909 4757 \r\n3 3472 15908 15907 4757 \r\n3 191 10454 6339 4758 \r\n3 2123 11095 10454 4758 \r\n3 3345 6339 11095 4758 \r\n3 4427 15912 15911 4759 \r\n3 4723 15910 15912 4759 \r\n3 1639 15911 15910 4759 \r\n3 2210 15914 15913 4760 \r\n3 1320 9399 15914 4760 \r\n3 3261 15913 9399 4760 \r\n3 517 12789 8758 4761 \r\n3 678 15654 12789 4761 \r\n3 1212 8758 15654 4761 \r\n3 2052 15916 15915 4762 \r\n3 4270 9551 15916 4762 \r\n3 1287 15915 9551 4762 \r\n3 1292 5945 15917 4763 \r\n3 1334 5996 5945 4763 \r\n3 2668 15917 5996 4763 \r\n3 957 10993 12875 4764 \r\n3 4125 9562 10993 4764 \r\n3 4812 12875 9562 4764 \r\n3 2688 15918 14525 4765 \r\n3 3603 9903 15918 4765 \r\n3 2627 14525 9903 4765 \r\n3 4217 15920 12518 4766 \r\n3 2610 15919 15920 4766 \r\n3 553 12518 15919 4766 \r\n3 4261 10500 7474 4767 \r\n3 3168 15921 10500 4767 \r\n3 1047 7474 15921 4767 \r\n3 2171 11582 10587 4768 \r\n3 4013 15922 11582 4768 \r\n3 2526 10587 15922 4768 \r\n3 2736 15924 15923 4769 \r\n3 2068 11695 15924 4769 \r\n3 3438 15923 11695 4769 \r\n3 1100 15926 15752 4770 \r\n3 2639 15925 15926 4770 \r\n3 4659 15752 15925 4770 \r\n3 2495 6329 12001 4771 \r\n3 3173 15927 6329 4771 \r\n3 2556 12001 15927 4771 \r\n3 4649 8880 15929 4772 \r\n3 583 15928 8880 4772 \r\n3 1521 15929 15928 4772 \r\n3 5 15931 15930 4773 \r\n3 40 12685 15931 4773 \r\n3 3953 15930 12685 4773 \r\n3 1656 14182 12311 4774 \r\n3 3662 13903 14182 4774 \r\n3 1600 12311 13903 4774 \r\n3 1222 15932 5236 4775 \r\n3 1236 15264 15932 4775 \r\n3 3368 5236 15264 4775 \r\n3 2745 13597 12788 4776 \r\n3 2362 14540 13597 4776 \r\n3 678 12788 14540 4776 \r\n3 3372 15935 15934 4777 \r\n3 506 15933 15935 4777 \r\n3 3768 15934 15933 4777 \r\n3 378 6421 15936 4778 \r\n3 923 14752 6421 4778 \r\n3 761 15936 14752 4778 \r\n3 4479 10976 9789 4779 \r\n3 1966 15937 10976 4779 \r\n3 4446 9789 15937 4779 \r\n3 1674 15939 9693 4780 \r\n3 1787 15938 15939 4780 \r\n3 4725 9693 15938 4780 \r\n3 4653 9791 13223 4781 \r\n3 2440 15940 9791 4781 \r\n3 26 13223 15940 4781 \r\n3 885 7670 15941 4782 \r\n3 2130 11877 7670 4782 \r\n3 4393 15941 11877 4782 \r\n3 2768 6331 15943 4783 \r\n3 689 15942 6331 4783 \r\n3 4553 15943 15942 4783 \r\n3 1962 15944 13650 4784 \r\n3 3681 7869 15944 4784 \r\n3 2759 13650 7869 4784 \r\n3 483 15946 15945 4785 \r\n3 3093 11872 15946 4785 \r\n3 485 15945 11872 4785 \r\n3 224 11160 5095 4786 \r\n3 4485 11346 11160 4786 \r\n3 1115 5095 11346 4786 \r\n3 4213 15948 6567 4787 \r\n3 3046 15947 15948 4787 \r\n3 2645 6567 15947 4787 \r\n3 418 15950 6267 4788 \r\n3 4043 15949 15950 4788 \r\n3 2525 6267 15949 4788 \r\n3 3739 15951 7276 4789 \r\n3 1036 7008 15951 4789 \r\n3 2489 7276 7008 4789 \r\n3 283 7490 7851 4790 \r\n3 4888 10242 7490 4790 \r\n3 2200 7851 10242 4790 \r\n3 3814 12085 15953 4791 \r\n3 3010 15952 12085 4791 \r\n3 3984 15953 15952 4791 \r\n3 4334 14449 15954 4792 \r\n3 4322 15655 14449 4792 \r\n3 1612 15954 15655 4792 \r\n3 1733 15956 9979 4793 \r\n3 3635 15955 15956 4793 \r\n3 3349 9979 15955 4793 \r\n3 4789 12662 14281 4794 \r\n3 4133 15957 12662 4794 \r\n3 4324 14281 15957 4794 \r\n3 1917 12767 14977 4795 \r\n3 3232 15958 12767 4795 \r\n3 1863 14977 15958 4795 \r\n3 3526 15960 12596 4796 \r\n3 2518 15959 15960 4796 \r\n3 3205 12596 15959 4796 \r\n3 4937 8481 15961 4797 \r\n3 3661 11355 8481 4797 \r\n3 4682 15961 11355 4797 \r\n3 2449 15963 15962 4798 \r\n3 3611 11004 15963 4798 \r\n3 4187 15962 11004 4798 \r\n3 4489 15966 15965 4799 \r\n3 724 15964 15966 4799 \r\n3 146 15965 15964 4799 \r\n3 4277 15968 10835 4800 \r\n3 2425 15967 15968 4800 \r\n3 1479 10835 15967 4800 \r\n3 4357 15970 10699 4801 \r\n3 4467 15969 15970 4801 \r\n3 2811 10699 15969 4801 \r\n3 4243 7433 15972 4802 \r\n3 2324 15971 7433 4802 \r\n3 87 15972 15971 4802 \r\n3 3234 15974 9094 4803 \r\n3 369 15973 15974 4803 \r\n3 851 9094 15973 4803 \r\n3 2396 9820 15975 4804 \r\n3 555 14843 9820 4804 \r\n3 4776 15975 14843 4804 \r\n3 2003 15977 7964 4805 \r\n3 894 15976 15977 4805 \r\n3 3313 7964 15976 4805 \r\n3 1911 15979 15978 4806 \r\n3 3765 11358 15979 4806 \r\n3 3613 15978 11358 4806 \r\n3 357 15981 12944 4807 \r\n3 3351 15980 15981 4807 \r\n3 2792 12944 15980 4807 \r\n3 981 15983 11149 4808 \r\n3 3680 15982 15983 4808 \r\n3 2730 11149 15982 4808 \r\n3 2115 9176 13455 4809 \r\n3 4726 10292 9176 4809 \r\n3 4352 13455 10292 4809 \r\n3 4478 11440 12652 4810 \r\n3 1516 9915 11440 4810 \r\n3 3287 12652 9915 4810 \r\n3 1393 15985 14519 4811 \r\n3 551 15984 15985 4811 \r\n3 4610 14519 15984 4811 \r\n3 3596 12244 5488 4812 \r\n3 3505 10646 12244 4812 \r\n3 3886 5488 10646 4812 \r\n3 4628 15988 15987 4813 \r\n3 844 15986 15988 4813 \r\n3 2494 15987 15986 4813 \r\n3 1282 15990 15989 4814 \r\n3 4659 15925 15990 4814 \r\n3 2639 15989 15925 4814 \r\n3 2050 15992 6887 4815 \r\n3 4315 15991 15992 4815 \r\n3 260 6887 15991 4815 \r\n3 2332 15994 15993 4816 \r\n3 4791 12232 15994 4816 \r\n3 3238 15993 12232 4816 \r\n3 4235 15996 10481 4817 \r\n3 106 15995 15996 4817 \r\n3 1886 10481 15995 4817 \r\n3 4325 14588 8088 4818 \r\n3 3155 11814 14588 4818 \r\n3 1571 8088 11814 4818 \r\n3 2119 15998 15997 4819 \r\n3 131 10544 15998 4819 \r\n3 443 15997 10544 4819 \r\n3 2142 15743 15999 4820 \r\n3 3580 8701 15743 4820 \r\n3 3576 15999 8701 4820 \r\n3 4943 8991 16001 4821 \r\n3 2035 16000 8991 4821 \r\n3 4567 16001 16000 4821 \r\n3 2995 16003 7721 4822 \r\n3 1481 16002 16003 4822 \r\n3 2032 7721 16002 4822 \r\n3 2675 16005 16004 4823 \r\n3 4711 15808 16005 4823 \r\n3 3435 16004 15808 4823 \r\n3 4474 16008 16007 4824 \r\n3 2273 16006 16008 4824 \r\n3 3406 16007 16006 4824 \r\n3 747 16011 16010 4825 \r\n3 2724 16009 16011 4825 \r\n3 318 16010 16009 4825 \r\n3 477 16012 15364 4826 \r\n3 3716 12713 16012 4826 \r\n3 1769 15364 12713 4826 \r\n3 4274 15697 14037 4827 \r\n3 3726 6507 15697 4827 \r\n3 4587 14037 6507 4827 \r\n3 2863 5145 12980 4828 \r\n3 3033 16013 5145 4828 \r\n3 3398 12980 16013 4828 \r\n3 3262 6850 16014 4829 \r\n3 14 15286 6850 4829 \r\n3 1663 16014 15286 4829 \r\n3 3321 5795 16016 4830 \r\n3 94 16015 5795 4830 \r\n3 3694 16016 16015 4830 \r\n3 1317 16018 14677 4831 \r\n3 4168 16017 16018 4831 \r\n3 4269 14677 16017 4831 \r\n3 4103 16021 16020 4832 \r\n3 3590 16019 16021 4832 \r\n3 4739 16020 16019 4832 \r\n3 250 5454 16023 4833 \r\n3 3049 16022 5454 4833 \r\n3 4621 16023 16022 4833 \r\n3 4960 6257 15212 4834 \r\n3 4390 16024 6257 4834 \r\n3 3715 15212 16024 4834 \r\n3 3616 16027 16026 4835 \r\n3 2804 16025 16027 4835 \r\n3 4975 16026 16025 4835 \r\n3 4837 13697 9840 4836 \r\n3 4071 9846 13697 4836 \r\n3 2087 9840 9846 4836 \r\n3 4538 13210 12437 4837 \r\n3 26 15940 13210 4837 \r\n3 2440 12437 15940 4837 \r\n3 659 11950 16029 4838 \r\n3 3083 16028 11950 4838 \r\n3 648 16029 16028 4838 \r\n3 64 16032 16031 4839 \r\n3 2770 16030 16032 4839 \r\n3 4699 16031 16030 4839 \r\n3 2207 7084 14326 4840 \r\n3 2973 16033 7084 4840 \r\n3 2815 14326 16033 4840 \r\n3 4311 9057 11046 4841 \r\n3 229 16034 9057 4841 \r\n3 2960 11046 16034 4841 \r\n3 4065 16035 12368 4842 \r\n3 4906 9335 16035 4842 \r\n3 1087 12368 9335 4842 \r\n3 3022 15419 8632 4843 \r\n3 2597 16036 15419 4843 \r\n3 2781 8632 16036 4843 \r\n3 564 6590 15607 4844 \r\n3 1106 12954 6590 4844 \r\n3 1653 15607 12954 4844 \r\n3 1620 16038 16037 4845 \r\n3 4036 11470 16038 4845 \r\n3 4784 16037 11470 4845 \r\n3 2661 16041 16040 4846 \r\n3 4717 16039 16041 4846 \r\n3 3186 16040 16039 4846 \r\n3 4479 15035 10875 4847 \r\n3 1132 16042 15035 4847 \r\n3 4481 10875 16042 4847 \r\n3 1469 12493 16044 4848 \r\n3 4067 16043 12493 4848 \r\n3 472 16044 16043 4848 \r\n3 3183 11087 16045 4849 \r\n3 1850 15446 11087 4849 \r\n3 4644 16045 15446 4849 \r\n3 1001 7992 9350 4850 \r\n3 4338 13020 7992 4850 \r\n3 702 9350 13020 4850 \r\n3 106 15996 11555 4851 \r\n3 4235 16046 15996 4851 \r\n3 3563 11555 16046 4851 \r\n3 3254 11220 16048 4852 \r\n3 3703 16047 11220 4852 \r\n3 307 16048 16047 4852 \r\n3 1423 16051 16050 4853 \r\n3 1422 16049 16051 4853 \r\n3 1830 16050 16049 4853 \r\n3 4391 14056 16052 4854 \r\n3 463 6252 14056 4854 \r\n3 3309 16052 6252 4854 \r\n3 460 15313 16053 4855 \r\n3 2678 7254 15313 4855 \r\n3 4361 16053 7254 4855 \r\n3 4037 14902 13805 4856 \r\n3 602 10853 14902 4856 \r\n3 258 13805 10853 4856 \r\n3 1957 16054 6813 4857 \r\n3 1586 12131 16054 4857 \r\n3 4018 6813 12131 4857 \r\n3 2685 16057 16056 4858 \r\n3 4120 16055 16057 4858 \r\n3 4006 16056 16055 4858 \r\n3 1146 13607 16058 4859 \r\n3 902 13201 13607 4859 \r\n3 198 16058 13201 4859 \r\n3 1418 16061 16060 4860 \r\n3 2981 16059 16061 4860 \r\n3 4898 16060 16059 4860 \r\n3 2741 16063 6868 4861 \r\n3 3428 16062 16063 4861 \r\n3 3003 6868 16062 4861 \r\n3 1210 16065 6164 4862 \r\n3 637 16064 16065 4862 \r\n3 4632 6164 16064 4862 \r\n3 2466 9411 16066 4863 \r\n3 4954 10350 9411 4863 \r\n3 3080 16066 10350 4863 \r\n3 461 9755 16068 4864 \r\n3 916 16067 9755 4864 \r\n3 1544 16068 16067 4864 \r\n3 3635 16071 16070 4865 \r\n3 2290 16069 16071 4865 \r\n3 3806 16070 16069 4865 \r\n3 4349 7603 16072 4866 \r\n3 3599 13247 7603 4866 \r\n3 2600 16072 13247 4866 \r\n3 225 12109 16074 4867 \r\n3 1868 16073 12109 4867 \r\n3 3946 16074 16073 4867 \r\n3 2727 8443 7742 4868 \r\n3 1770 16075 8443 4868 \r\n3 768 7742 16075 4868 \r\n3 1265 14634 16077 4869 \r\n3 839 16076 14634 4869 \r\n3 4692 16077 16076 4869 \r\n3 2485 16079 6873 4870 \r\n3 484 16078 16079 4870 \r\n3 1193 6873 16078 4870 \r\n3 3619 16082 16081 4871 \r\n3 4734 16080 16082 4871 \r\n3 4769 16081 16080 4871 \r\n3 208 7202 12252 4872 \r\n3 2163 10026 7202 4872 \r\n3 2000 12252 10026 4872 \r\n3 2470 16084 15015 4873 \r\n3 4462 16083 16084 4873 \r\n3 1732 15015 16083 4873 \r\n3 695 16085 10589 4874 \r\n3 487 12519 16085 4874 \r\n3 4902 10589 12519 4874 \r\n3 4111 16088 16087 4875 \r\n3 4336 16086 16088 4875 \r\n3 3624 16087 16086 4875 \r\n3 879 16090 16089 4876 \r\n3 4603 12644 16090 4876 \r\n3 1898 16089 12644 4876 \r\n3 2077 16091 7524 4877 \r\n3 3059 7866 16091 4877 \r\n3 1054 7524 7866 4877 \r\n3 4553 13963 16093 4878 \r\n3 4989 16092 13963 4878 \r\n3 1794 16093 16092 4878 \r\n3 4279 16095 8101 4879 \r\n3 1650 16094 16095 4879 \r\n3 553 8101 16094 4879 \r\n3 3303 7089 14133 4880 \r\n3 2606 16096 7089 4880 \r\n3 2365 14133 16096 4880 \r\n3 813 16097 15368 4881 \r\n3 2459 13986 16097 4881 \r\n3 364 15368 13986 4881 \r\n3 3856 16099 5641 4882 \r\n3 755 16098 16099 4882 \r\n3 4447 5641 16098 4882 \r\n3 2591 15062 15505 4883 \r\n3 396 10938 15062 4883 \r\n3 1154 15505 10938 4883 \r\n3 3008 16101 16100 4884 \r\n3 1178 14957 16101 4884 \r\n3 2957 16100 14957 4884 \r\n3 2468 11154 14769 4885 \r\n3 4014 15119 11154 4885 \r\n3 4457 14769 15119 4885 \r\n3 2537 13357 5752 4886 \r\n3 1944 16102 13357 4886 \r\n3 4744 5752 16102 4886 \r\n3 254 16104 16103 4887 \r\n3 2617 14805 16104 4887 \r\n3 108 16103 14805 4887 \r\n3 1608 16107 16106 4888 \r\n3 3616 16105 16107 4888 \r\n3 4427 16106 16105 4888 \r\n3 2583 16109 10537 4889 \r\n3 1175 16108 16109 4889 \r\n3 2391 10537 16108 4889 \r\n3 3544 16111 5611 4890 \r\n3 125 16110 16111 4890 \r\n3 4031 5611 16110 4890 \r\n3 3633 16114 16113 4891 \r\n3 1613 16112 16114 4891 \r\n3 1970 16113 16112 4891 \r\n3 1661 16117 16116 4892 \r\n3 2625 16115 16117 4892 \r\n3 3228 16116 16115 4892 \r\n3 4552 8368 16119 4893 \r\n3 2043 16118 8368 4893 \r\n3 1476 16119 16118 4893 \r\n3 918 16120 7646 4894 \r\n3 2704 15860 16120 4894 \r\n3 1543 7646 15860 4894 \r\n3 327 16123 16122 4895 \r\n3 4948 16121 16123 4895 \r\n3 52 16122 16121 4895 \r\n3 3813 14063 16125 4896 \r\n3 4993 16124 14063 4896 \r\n3 1248 16125 16124 4896 \r\n3 3458 11590 16127 4897 \r\n3 4645 16126 11590 4897 \r\n3 55 16127 16126 4897 \r\n3 3006 11396 16129 4898 \r\n3 1314 16128 11396 4898 \r\n3 3304 16129 16128 4898 \r\n3 52 16130 9611 4899 \r\n3 2989 14664 16130 4899 \r\n3 1255 9611 14664 4899 \r\n3 2111 16132 16131 4900 \r\n3 704 15398 16132 4900 \r\n3 543 16131 15398 4900 \r\n3 4131 16135 16134 4901 \r\n3 193 16133 16135 4901 \r\n3 1141 16134 16133 4901 \r\n3 2620 16138 16137 4902 \r\n3 976 16136 16138 4902 \r\n3 1875 16137 16136 4902 \r\n3 3365 16140 16139 4903 \r\n3 4158 11253 16140 4903 \r\n3 2121 16139 11253 4903 \r\n3 4126 10036 16142 4904 \r\n3 3131 16141 10036 4904 \r\n3 2278 16142 16141 4904 \r\n3 2986 10888 16144 4905 \r\n3 3135 16143 10888 4905 \r\n3 1788 16144 16143 4905 \r\n3 820 16147 16146 4906 \r\n3 4060 16145 16147 4906 \r\n3 1310 16146 16145 4906 \r\n3 2053 16149 5799 4907 \r\n3 3287 16148 16149 4907 \r\n3 1270 5799 16148 4907 \r\n3 3075 16152 16151 4908 \r\n3 679 16150 16152 4908 \r\n3 3567 16151 16150 4908 \r\n3 753 7794 16153 4909 \r\n3 4135 12705 7794 4909 \r\n3 2539 16153 12705 4909 \r\n3 2121 12810 16139 4910 \r\n3 2922 14315 12810 4910 \r\n3 3365 16139 14315 4910 \r\n3 523 5937 16155 4911 \r\n3 1237 16154 5937 4911 \r\n3 2782 16155 16154 4911 \r\n3 4480 16158 16157 4912 \r\n3 4332 16156 16158 4912 \r\n3 2161 16157 16156 4912 \r\n3 2908 9197 8683 4913 \r\n3 2110 16159 9197 4913 \r\n3 129 8683 16159 4913 \r\n3 1750 16162 16161 4914 \r\n3 1662 16160 16162 4914 \r\n3 1423 16161 16160 4914 \r\n3 854 7479 13663 4915 \r\n3 4507 16163 7479 4915 \r\n3 1591 13663 16163 4915 \r\n3 5 16165 16164 4916 \r\n3 4703 12473 16165 4916 \r\n3 1923 16164 12473 4916 \r\n3 3585 16167 16166 4917 \r\n3 3298 13537 16167 4917 \r\n3 1720 16166 13537 4917 \r\n3 4826 16169 16168 4918 \r\n3 2687 15643 16169 4918 \r\n3 1172 16168 15643 4918 \r\n3 2863 16170 5143 4919 \r\n3 2127 9151 16170 4919 \r\n3 880 5143 9151 4919 \r\n3 2812 5202 7200 4920 \r\n3 1117 16171 5202 4920 \r\n3 3098 7200 16171 4920 \r\n3 1644 6736 16172 4921 \r\n3 2074 14771 6736 4921 \r\n3 2967 16172 14771 4921 \r\n3 395 16174 16173 4922 \r\n3 4144 7724 16174 4922 \r\n3 2746 16173 7724 4922 \r\n3 4567 16175 8353 4923 \r\n3 1399 13300 16175 4923 \r\n3 4613 8353 13300 4923 \r\n3 2374 11881 8968 4924 \r\n3 3856 5643 11881 4924 \r\n3 486 8968 5643 4924 \r\n3 2918 16177 9959 4925 \r\n3 1112 16176 16177 4925 \r\n3 2577 9959 16176 4925 \r\n3 1218 16180 16179 4926 \r\n3 504 16178 16180 4926 \r\n3 2009 16179 16178 4926 \r\n3 156 16182 6922 4927 \r\n3 1975 16181 16182 4927 \r\n3 2485 6922 16181 4927 \r\n3 2481 16183 15414 4928 \r\n3 722 7488 16183 4928 \r\n3 283 15414 7488 4928 \r\n3 2451 9128 9592 4929 \r\n3 3743 16184 9128 4929 \r\n3 2325 9592 16184 4929 \r\n3 2666 16185 11768 4930 \r\n3 1995 13768 16185 4930 \r\n3 1330 11768 13768 4930 \r\n3 2988 16187 16186 4931 \r\n3 447 11888 16187 4931 \r\n3 3929 16186 11888 4931 \r\n3 3880 16189 16188 4932 \r\n3 1848 14259 16189 4932 \r\n3 1523 16188 14259 4932 \r\n3 4841 11195 16190 4933 \r\n3 4518 14163 11195 4933 \r\n3 2925 16190 14163 4933 \r\n3 3507 16191 11113 4934 \r\n3 3281 14796 16191 4934 \r\n3 2311 11113 14796 4934 \r\n3 3853 14410 16192 4935 \r\n3 2001 10978 14410 4935 \r\n3 4012 16192 10978 4935 \r\n3 2454 10760 16194 4936 \r\n3 2353 16193 10760 4936 \r\n3 2870 16194 16193 4936 \r\n3 1678 11551 16196 4937 \r\n3 890 16195 11551 4937 \r\n3 2114 16196 16195 4937 \r\n3 2849 7052 16198 4938 \r\n3 1321 16197 7052 4938 \r\n3 3436 16198 16197 4938 \r\n3 1178 16200 16199 4939 \r\n3 3444 14571 16200 4939 \r\n3 1343 16199 14571 4939 \r\n3 1018 15806 16201 4940 \r\n3 4711 5341 15806 4940 \r\n3 4403 16201 5341 4940 \r\n3 2823 9264 12228 4941 \r\n3 801 16202 9264 4941 \r\n3 4989 12228 16202 4941 \r\n3 4436 13006 16204 4942 \r\n3 2256 16203 13006 4942 \r\n3 1116 16204 16203 4942 \r\n3 2096 8929 16205 4943 \r\n3 1695 10353 8929 4943 \r\n3 187 16205 10353 4943 \r\n3 2383 16206 14102 4944 \r\n3 612 13257 16206 4944 \r\n3 1557 14102 13257 4944 \r\n3 566 16208 16207 4945 \r\n3 442 5407 16208 4945 \r\n3 1288 16207 5407 4945 \r\n3 3481 16211 16210 4946 \r\n3 3279 16209 16211 4946 \r\n3 1209 16210 16209 4946 \r\n3 908 16212 7232 4947 \r\n3 3425 12605 16212 4947 \r\n3 22 7232 12605 4947 \r\n3 1715 16214 10159 4948 \r\n3 4135 16213 16214 4948 \r\n3 3615 10159 16213 4948 \r\n3 73 13086 11083 4949 \r\n3 299 16215 13086 4949 \r\n3 3169 11083 16215 4949 \r\n3 584 16218 16217 4950 \r\n3 1251 16216 16218 4950 \r\n3 4048 16217 16216 4950 \r\n3 2639 15926 10690 4951 \r\n3 1100 16219 15926 4951 \r\n3 574 10690 16219 4951 \r\n3 4008 9747 10663 4952 \r\n3 561 6648 9747 4952 \r\n3 4705 10663 6648 4952 \r\n3 2160 16222 16221 4953 \r\n3 2031 16220 16222 4953 \r\n3 3006 16221 16220 4953 \r\n3 1729 16224 16223 4954 \r\n3 1986 10920 16224 4954 \r\n3 1428 16223 10920 4954 \r\n3 1292 16226 16225 4955 \r\n3 1219 13452 16226 4955 \r\n3 2137 16225 13452 4955 \r\n3 2601 11168 11485 4956 \r\n3 1397 12451 11168 4956 \r\n3 4002 11485 12451 4956 \r\n3 4825 15278 8833 4957 \r\n3 1308 16227 15278 4957 \r\n3 2834 8833 16227 4957 \r\n3 947 8500 15054 4958 \r\n3 1907 9401 8500 4958 \r\n3 1689 15054 9401 4958 \r\n3 3326 12308 16228 4959 \r\n3 2269 12226 12308 4959 \r\n3 700 16228 12226 4959 \r\n3 4290 12692 16229 4960 \r\n3 4880 7039 12692 4960 \r\n3 1472 16229 7039 4960 \r\n3 2190 12319 11716 4961 \r\n3 1817 16230 12319 4961 \r\n3 4853 11716 16230 4961 \r\n3 4554 16232 7698 4962 \r\n3 819 16231 16232 4962 \r\n3 3730 7698 16231 4962 \r\n3 4512 12698 6372 4963 \r\n3 1985 12250 12698 4963 \r\n3 4974 6372 12250 4963 \r\n3 4699 16234 16233 4964 \r\n3 3551 15667 16234 4964 \r\n3 2684 16233 15667 4964 \r\n3 2548 10106 10530 4965 \r\n3 4520 16235 10106 4965 \r\n3 4878 10530 16235 4965 \r\n3 4464 6444 12419 4966 \r\n3 2757 15262 6444 4966 \r\n3 3748 12419 15262 4966 \r\n3 2226 16236 7208 4967 \r\n3 4194 7294 16236 4967 \r\n3 3104 7208 7294 4967 \r\n3 449 16238 13049 4968 \r\n3 873 16237 16238 4968 \r\n3 3126 13049 16237 4968 \r\n3 2296 16241 16240 4969 \r\n3 1474 16239 16241 4969 \r\n3 4194 16240 16239 4969 \r\n3 3048 8555 16243 4970 \r\n3 2154 16242 8555 4970 \r\n3 34 16243 16242 4970 \r\n3 4764 16245 11257 4971 \r\n3 391 16244 16245 4971 \r\n3 1065 11257 16244 4971 \r\n3 4445 16246 15107 4972 \r\n3 573 12125 16246 4972 \r\n3 3668 15107 12125 4972 \r\n3 1498 16248 16247 4973 \r\n3 1294 12867 16248 4973 \r\n3 1623 16247 12867 4973 \r\n3 811 16249 15630 4974 \r\n3 275 15209 16249 4974 \r\n3 2894 15630 15209 4974 \r\n3 1008 16252 16251 4975 \r\n3 2676 16250 16252 4975 \r\n3 2568 16251 16250 4975 \r\n3 2504 7261 16253 4976 \r\n3 3415 15773 7261 4976 \r\n3 3493 16253 15773 4976 \r\n3 3281 16254 6074 4977 \r\n3 4610 14639 16254 4977 \r\n3 3314 6074 14639 4977 \r\n3 1691 9566 12747 4978 \r\n3 746 15597 9566 4978 \r\n3 1156 12747 15597 4978 \r\n3 3819 15714 11641 4979 \r\n3 4063 16255 15714 4979 \r\n3 2456 11641 16255 4979 \r\n3 2417 16258 16257 4980 \r\n3 1690 16256 16258 4980 \r\n3 3712 16257 16256 4980 \r\n3 1037 16260 16259 4981 \r\n3 681 13959 16260 4981 \r\n3 2220 16259 13959 4981 \r\n3 4508 16262 6698 4982 \r\n3 4072 16261 16262 4982 \r\n3 4963 6698 16261 4982 \r\n3 37 16263 10146 4983 \r\n3 2593 8084 16263 4983 \r\n3 1000 10146 8084 4983 \r\n3 881 14987 16265 4984 \r\n3 3211 16264 14987 4984 \r\n3 3884 16265 16264 4984 \r\n3 2685 16267 6833 4985 \r\n3 3946 16266 16267 4985 \r\n3 2743 6833 16266 4985 \r\n3 3686 11487 16269 4986 \r\n3 1985 16268 11487 4986 \r\n3 4281 16269 16268 4986 \r\n3 1775 16270 8005 4987 \r\n3 1210 10161 16270 4987 \r\n3 1468 8005 10161 4987 \r\n3 774 8941 16272 4988 \r\n3 4846 16271 8941 4988 \r\n3 296 16272 16271 4988 \r\n3 1024 16273 15517 4989 \r\n3 2612 13550 16273 4989 \r\n3 2961 15517 13550 4989 \r\n3 488 16274 9694 4990 \r\n3 4707 9477 16274 4990 \r\n3 3424 9694 9477 4990 \r\n3 109 16276 16275 4991 \r\n3 2533 15900 16276 4991 \r\n3 3257 16275 15900 4991 \r\n3 3173 6282 16277 4992 \r\n3 4294 8252 6282 4992 \r\n3 197 16277 8252 4992 \r\n3 2709 14395 8469 4993 \r\n3 297 16278 14395 4993 \r\n3 4437 8469 16278 4993 \r\n3 2505 16280 16279 4994 \r\n3 567 11935 16280 4994 \r\n3 39 16279 11935 4994 \r\n3 3624 16086 16282 4995 \r\n3 4336 16281 16086 4995 \r\n3 4113 16282 16281 4995 \r\n3 4523 8451 15452 4996 \r\n3 4987 16283 8451 4996 \r\n3 4600 15452 16283 4996 \r\n3 3082 16285 16284 4997 \r\n3 2945 13961 16285 4997 \r\n3 4920 16284 13961 4997 \r\n3 288 13548 16286 4998 \r\n3 3440 14108 13548 4998 \r\n3 4882 16286 14108 4998 \r\n3 3938 16287 14272 4999 \r\n3 1097 11925 16287 4999 \r\n3 4605 14272 11925 4999 \r\n3 4182 16289 12588 5000 \r\n3 3551 16288 16289 5000 \r\n3 2770 12588 16288 5000 \r\n3 2313 16291 16290 5001 \r\n3 982 15454 16291 5001 \r\n3 2406 16290 15454 5001 \r\n3 1071 16294 16293 5002 \r\n3 1714 16292 16294 5002 \r\n3 1038 16293 16292 5002 \r\n3 3971 16297 16296 5003 \r\n3 3099 16295 16297 5003 \r\n3 1906 16296 16295 5003 \r\n3 525 16299 16298 5004 \r\n3 3057 11994 16299 5004 \r\n3 3264 16298 11994 5004 \r\n3 343 15483 14823 5005 \r\n3 1735 7152 15483 5005 \r\n3 2696 14823 7152 5005 \r\n3 4738 16302 16301 5006 \r\n3 4449 16300 16302 5006 \r\n3 3315 16301 16300 5006 \r\n3 983 16303 7820 5007 \r\n3 4956 10668 16303 5007 \r\n3 3033 7820 10668 5007 \r\n3 1596 7466 9782 5008 \r\n3 1583 16304 7466 5008 \r\n3 3622 9782 16304 5008 \r\n3 3163 16305 14532 5009 \r\n3 4120 16057 16305 5009 \r\n3 2685 14532 16057 5009 \r\n3 2129 16308 16307 5010 \r\n3 1861 16306 16308 5010 \r\n3 2660 16307 16306 5010 \r\n3 1815 16310 16309 5011 \r\n3 93 14802 16310 5011 \r\n3 4790 16309 14802 5011 \r\n3 4220 16313 16312 5012 \r\n3 729 16311 16313 5012 \r\n3 3541 16312 16311 5012 \r\n3 2173 9505 12144 5013 \r\n3 638 5840 9505 5013 \r\n3 790 12144 5840 5013 \r\n3 1860 11648 15128 5014 \r\n3 2860 7687 11648 5014 \r\n3 3711 15128 7687 5014 \r\n3 2270 10493 9337 5015 \r\n3 1629 14991 10493 5015 \r\n3 2351 9337 14991 5015 \r\n3 1311 16316 16315 5016 \r\n3 591 16314 16316 5016 \r\n3 1994 16315 16314 5016 \r\n3 1163 13859 14861 5017 \r\n3 3908 16317 13859 5017 \r\n3 4049 14861 16317 5017 \r\n3 3984 15952 9302 5018 \r\n3 3010 12207 15952 5018 \r\n3 51 9302 12207 5018 \r\n3 92 7092 16318 5019 \r\n3 1507 10691 7092 5019 \r\n3 4702 16318 10691 5019 \r\n3 2295 13568 12072 5020 \r\n3 543 7844 13568 5020 \r\n3 3595 12072 7844 5020 \r\n3 2432 13523 16320 5021 \r\n3 2605 16319 13523 5021 \r\n3 2764 16320 16319 5021 \r\n3 3994 5731 6245 5022 \r\n3 4219 14143 5731 5022 \r\n3 3199 6245 14143 5022 \r\n3 3053 16321 12095 5023 \r\n3 1433 12411 16321 5023 \r\n3 4614 12095 12411 5023 \r\n3 4156 11183 10581 5024 \r\n3 2062 11511 11183 5024 \r\n3 4431 10581 11511 5024 \r\n3 376 16323 5349 5025 \r\n3 2921 16322 16323 5025 \r\n3 1950 5349 16322 5025 \r\n3 3807 14180 16324 5026 \r\n3 245 9052 14180 5026 \r\n3 2631 16324 9052 5026 \r\n3 3358 8802 16326 5027 \r\n3 2694 16325 8802 5027 \r\n3 4332 16326 16325 5027 \r\n3 3882 10749 16328 5028 \r\n3 4566 16327 10749 5028 \r\n3 2642 16328 16327 5028 \r\n3 814 13288 16329 5029 \r\n3 3906 10155 13288 5029 \r\n3 4881 16329 10155 5029 \r\n3 4482 10015 16330 5030 \r\n3 2099 5684 10015 5030 \r\n3 4215 16330 5684 5030 \r\n3 3802 16331 9573 5031 \r\n3 2314 9353 16331 5031 \r\n3 1357 9573 9353 5031 \r\n3 1320 16334 16333 5032 \r\n3 1407 16332 16334 5032 \r\n3 3360 16333 16332 5032 \r\n3 1076 13800 11201 5033 \r\n3 2609 16335 13800 5033 \r\n3 901 11201 16335 5033 \r\n3 3630 16338 16337 5034 \r\n3 4049 16336 16338 5034 \r\n3 909 16337 16336 5034 \r\n3 4027 12639 16339 5035 \r\n3 3045 6436 12639 5035 \r\n3 3921 16339 6436 5035 \r\n3 3903 16341 9408 5036 \r\n3 1901 16340 16341 5036 \r\n3 554 9408 16340 5036 \r\n3 3810 16344 16343 5037 \r\n3 3553 16342 16344 5037 \r\n3 2271 16343 16342 5037 \r\n3 2331 16346 15291 5038 \r\n3 2430 16345 16346 5038 \r\n3 4152 15291 16345 5038 \r\n3 1639 14803 16347 5039 \r\n3 2754 13321 14803 5039 \r\n3 3044 16347 13321 5039 \r\n3 1751 15776 8147 5040 \r\n3 1223 7586 15776 5040 \r\n3 1031 8147 7586 5040 \r\n3 2053 16348 16149 5041 \r\n3 2629 12650 16348 5041 \r\n3 3287 16149 12650 5041 \r\n3 2280 16350 16349 5042 \r\n3 867 6118 16350 5042 \r\n3 1603 16349 6118 5042 \r\n3 1735 10709 7153 5043 \r\n3 3348 16351 10709 5043 \r\n3 2946 7153 16351 5043 \r\n3 1109 16353 16352 5044 \r\n3 4302 13226 16353 5044 \r\n3 1743 16352 13226 5044 \r\n3 2012 13844 10043 5045 \r\n3 190 16354 13844 5045 \r\n3 4318 10043 16354 5045 \r\n3 1080 16355 13406 5046 \r\n3 598 10758 16355 5046 \r\n3 1747 13406 10758 5046 \r\n3 503 16357 14783 5047 \r\n3 1723 16356 16357 5047 \r\n3 1207 14783 16356 5047 \r\n3 231 16358 13893 5048 \r\n3 2517 13113 16358 5048 \r\n3 968 13893 13113 5048 \r\n3 3327 6825 16359 5049 \r\n3 4700 12658 6825 5049 \r\n3 1798 16359 12658 5049 \r\n3 3957 11617 16360 5050 \r\n3 3794 13830 11617 5050 \r\n3 2843 16360 13830 5050 \r\n3 28 16362 6432 5051 \r\n3 4304 16361 16362 5051 \r\n3 550 6432 16361 5051 \r\n3 611 16363 9640 5052 \r\n3 1445 14053 16363 5052 \r\n3 3147 9640 14053 5052 \r\n3 3513 12784 16364 5053 \r\n3 4456 7367 12784 5053 \r\n3 4444 16364 7367 5053 \r\n3 3840 12507 16365 5054 \r\n3 1387 6187 12507 5054 \r\n3 374 16365 6187 5054 \r\n3 4777 16368 16367 5055 \r\n3 1343 16366 16368 5055 \r\n3 1872 16367 16366 5055 \r\n3 2187 16371 16370 5056 \r\n3 2932 16369 16371 5056 \r\n3 2911 16370 16369 5056 \r\n3 665 16373 14727 5057 \r\n3 4773 16372 16373 5057 \r\n3 3385 14727 16372 5057 \r\n3 148 7068 16375 5058 \r\n3 2619 16374 7068 5058 \r\n3 1762 16375 16374 5058 \r\n3 400 6345 14763 5059 \r\n3 554 16340 6345 5059 \r\n3 1901 14763 16340 5059 \r\n3 2057 16377 16376 5060 \r\n3 3308 13420 16377 5060 \r\n3 1634 16376 13420 5060 \r\n3 2231 5281 15532 5061 \r\n3 1481 16003 5281 5061 \r\n3 2995 15532 16003 5061 \r\n3 463 16379 16378 5062 \r\n3 3867 10388 16379 5062 \r\n3 3781 16378 10388 5062 \r\n3 4939 5529 9699 5063 \r\n3 1856 16380 5529 5063 \r\n3 2774 9699 16380 5063 \r\n3 1616 6173 7215 5064 \r\n3 4513 12529 6173 5064 \r\n3 522 7215 12529 5064 \r\n3 378 10782 14685 5065 \r\n3 4884 16381 10782 5065 \r\n3 368 14685 16381 5065 \r\n3 1714 9521 16292 5066 \r\n3 182 16382 9521 5066 \r\n3 1038 16292 16382 5066 \r\n3 2677 16385 16384 5067 \r\n3 2635 16383 16385 5067 \r\n3 4280 16384 16383 5067 \r\n3 3408 16387 16386 5068 \r\n3 3466 15554 16387 5068 \r\n3 2553 16386 15554 5068 \r\n3 4569 16389 10203 5069 \r\n3 1888 16388 16389 5069 \r\n3 528 10203 16388 5069 \r\n3 2938 5732 8330 5070 \r\n3 3994 12096 5732 5070 \r\n3 4614 8330 12096 5070 \r\n3 335 6132 16390 5071 \r\n3 3263 6067 6132 5071 \r\n3 1380 16390 6067 5071 \r\n3 3297 16392 6009 5072 \r\n3 1409 16391 16392 5072 \r\n3 1993 6009 16391 5072 \r\n3 114 16395 16394 5073 \r\n3 3655 16393 16395 5073 \r\n3 1680 16394 16393 5073 \r\n3 3209 7699 14348 5074 \r\n3 3730 12964 7699 5074 \r\n3 947 14348 12964 5074 \r\n3 819 16396 16231 5075 \r\n3 3924 13294 16396 5075 \r\n3 3730 16231 13294 5075 \r\n3 4847 16397 13122 5076 \r\n3 2688 10089 16397 5076 \r\n3 2822 13122 10089 5076 \r\n3 3282 16399 14841 5077 \r\n3 2124 16398 16399 5077 \r\n3 1533 14841 16398 5077 \r\n3 989 10178 16400 5078 \r\n3 1336 10263 10178 5078 \r\n3 1635 16400 10263 5078 \r\n3 4387 6448 16401 5079 \r\n3 1232 12666 6448 5079 \r\n3 1253 16401 12666 5079 \r\n3 3606 8160 16402 5080 \r\n3 1694 12344 8160 5080 \r\n3 1918 16402 12344 5080 \r\n3 3399 9140 16404 5081 \r\n3 3479 16403 9140 5081 \r\n3 1712 16404 16403 5081 \r\n3 5001 16407 16406 5082 \r\n3 973 16405 16407 5082 \r\n3 4997 16406 16405 5082 \r\n3 180 10997 10524 5083 \r\n3 3919 15646 10997 5083 \r\n3 4509 10524 15646 5083 \r\n3 2408 15489 13815 5084 \r\n3 1984 15099 15489 5084 \r\n3 2014 13815 15099 5084 \r\n3 3104 7335 16409 5085 \r\n3 4532 16408 7335 5085 \r\n3 1498 16409 16408 5085 \r\n3 1124 7043 8174 5086 \r\n3 3043 16410 7043 5086 \r\n3 4356 8174 16410 5086 \r\n3 1091 8154 12829 5087 \r\n3 4411 15726 8154 5087 \r\n3 4907 12829 15726 5087 \r\n3 2137 12166 16412 5088 \r\n3 3931 16411 12166 5088 \r\n3 4981 16412 16411 5088 \r\n3 1433 16415 16414 5089 \r\n3 3278 16413 16415 5089 \r\n3 2151 16414 16413 5089 \r\n3 3090 16417 13504 5090 \r\n3 2974 16416 16417 5090 \r\n3 4029 13504 16416 5090 \r\n3 2610 9234 16419 5091 \r\n3 1277 16418 9234 5091 \r\n3 401 16419 16418 5091 \r\n3 2963 16422 16421 5092 \r\n3 749 16420 16422 5092 \r\n3 4115 16421 16420 5092 \r\n3 3058 16424 6906 5093 \r\n3 1376 16423 16424 5093 \r\n3 3190 6906 16423 5093 \r\n3 1482 16427 16426 5094 \r\n3 4475 16425 16427 5094 \r\n3 2720 16426 16425 5094 \r\n3 1458 16429 16428 5095 \r\n3 2214 9349 16429 5095 \r\n3 1529 16428 9349 5095 \r\n3 1747 10757 16431 5096 \r\n3 1783 16430 10757 5096 \r\n3 3934 16431 16430 5096 \r\n3 3025 16432 15870 5097 \r\n3 161 14112 16432 5097 \r\n3 4704 15870 14112 5097 \r\n3 3084 11188 6399 5098 \r\n3 2280 16349 11188 5098 \r\n3 1603 6399 16349 5098 \r\n3 2813 15711 7644 5099 \r\n3 3189 7611 15711 5099 \r\n3 2482 7644 7611 5099 \r\n3 4942 16434 7639 5100 \r\n3 2086 16433 16434 5100 \r\n3 967 7639 16433 5100 \r\n3 2033 16437 16436 5101 \r\n3 1474 16435 16437 5101 \r\n3 425 16436 16435 5101 \r\n3 1757 16439 11304 5102 \r\n3 2509 16438 16439 5102 \r\n3 3511 11304 16438 5102 \r\n3 2075 16440 7242 5103 \r\n3 3927 14922 16440 5103 \r\n3 4457 7242 14922 5103 \r\n3 2575 7574 15282 5104 \r\n3 4333 16441 7574 5104 \r\n3 2455 15282 16441 5104 \r\n3 2334 8113 16443 5105 \r\n3 4931 16442 8113 5105 \r\n3 1150 16443 16442 5105 \r\n3 170 13643 16445 5106 \r\n3 1485 16444 13643 5106 \r\n3 2519 16445 16444 5106 \r\n3 3444 16447 7683 5107 \r\n3 1597 16446 16447 5107 \r\n3 1250 7683 16446 5107 \r\n3 3949 16449 16448 5108 \r\n3 558 7400 16449 5108 \r\n3 163 16448 7400 5108 \r\n3 590 9624 10238 5109 \r\n3 3397 11770 9624 5109 \r\n3 1382 10238 11770 5109 \r\n3 3909 14003 16450 5110 \r\n3 2445 10295 14003 5110 \r\n3 3717 16450 10295 5110 \r\n3 4735 16451 7546 5111 \r\n3 4402 7247 16451 5111 \r\n3 700 7546 7247 5111 \r\n3 3543 11035 14033 5112 \r\n3 2622 13042 11035 5112 \r\n3 3094 14033 13042 5112 \r\n3 2247 16452 11311 5113 \r\n3 3737 14378 16452 5113 \r\n3 2566 11311 14378 5113 \r\n3 4774 16454 9435 5114 \r\n3 3322 16453 16454 5114 \r\n3 4987 9435 16453 5114 \r\n3 1037 15427 16260 5115 \r\n3 3628 16455 15427 5115 \r\n3 681 16260 16455 5115 \r\n3 4175 16457 16456 5116 \r\n3 1495 15827 16457 5116 \r\n3 945 16456 15827 5116 \r\n3 3064 15732 13392 5117 \r\n3 4047 16458 15732 5117 \r\n3 2644 13392 16458 5117 \r\n3 3822 16459 12388 5118 \r\n3 679 16152 16459 5118 \r\n3 3075 12388 16152 5118 \r\n3 4121 16461 16460 5119 \r\n3 1060 14637 16461 5119 \r\n3 2459 16460 14637 5119 \r\n3 4922 16462 14682 5120 \r\n3 3410 6625 16462 5120 \r\n3 3296 14682 6625 5120 \r\n3 2584 16465 16464 5121 \r\n3 4589 16463 16465 5121 \r\n3 1423 16464 16463 5121 \r\n3 1037 16259 16466 5122 \r\n3 2220 14569 16259 5122 \r\n3 4560 16466 14569 5122 \r\n3 4803 16468 13974 5123 \r\n3 3188 16467 16468 5123 \r\n3 3885 13974 16467 5123 \r\n3 1844 16471 16470 5124 \r\n3 4669 16469 16471 5124 \r\n3 2547 16470 16469 5124 \r\n3 2638 6557 8526 5125 \r\n3 3902 16472 6557 5125 \r\n3 3267 8526 16472 5125 \r\n3 1579 16474 16473 5126 \r\n3 1238 9425 16474 5126 \r\n3 570 16473 9425 5126 \r\n3 2956 5245 16476 5127 \r\n3 4033 16475 5245 5127 \r\n3 2307 16476 16475 5127 \r\n3 3914 10257 16477 5128 \r\n3 3023 14403 10257 5128 \r\n3 3272 16477 14403 5128 \r\n3 1610 11858 16478 5129 \r\n3 2549 14445 11858 5129 \r\n3 210 16478 14445 5129 \r\n3 3213 15575 15159 5130 \r\n3 1068 16479 15575 5130 \r\n3 2898 15159 16479 5130 \r\n3 3264 16481 16298 5131 \r\n3 1877 16480 16481 5131 \r\n3 525 16298 16480 5131 \r\n3 104 15354 16483 5132 \r\n3 1356 16482 15354 5132 \r\n3 4664 16483 16482 5132 \r\n3 3719 7239 16484 5133 \r\n3 2413 12962 7239 5133 \r\n3 996 16484 12962 5133 \r\n3 1116 12562 16204 5134 \r\n3 2447 13124 12562 5134 \r\n3 4436 16204 13124 5134 \r\n3 142 16485 8776 5135 \r\n3 1939 15832 16485 5135 \r\n3 1486 8776 15832 5135 \r\n3 2564 16488 16487 5136 \r\n3 4158 16486 16488 5136 \r\n3 83 16487 16486 5136 \r\n3 4065 9260 16490 5137 \r\n3 3097 16489 9260 5137 \r\n3 4548 16490 16489 5137 \r\n3 3078 16491 6384 5138 \r\n3 1517 7182 16491 5138 \r\n3 416 6384 7182 5138 \r\n3 3259 16492 5784 5139 \r\n3 3533 13099 16492 5139 \r\n3 1803 5784 13099 5139 \r\n3 3099 16493 16295 5140 \r\n3 3417 5198 16493 5140 \r\n3 1906 16295 5198 5140 \r\n3 4407 5765 14153 5141 \r\n3 2845 16494 5765 5141 \r\n3 4874 14153 16494 5141 \r\n3 2460 15698 8075 5142 \r\n3 4564 13661 15698 5142 \r\n3 2195 8075 13661 5142 \r\n3 4697 16496 16495 5143 \r\n3 1368 13732 16496 5143 \r\n3 2318 16495 13732 5143 \r\n3 1659 16497 15028 5144 \r\n3 2431 7158 16497 5144 \r\n3 1960 15028 7158 5144 \r\n3 1422 5451 16499 5145 \r\n3 3447 16498 5451 5145 \r\n3 3365 16499 16498 5145 \r\n3 1755 16501 16500 5146 \r\n3 175 11080 16501 5146 \r\n3 3527 16500 11080 5146 \r\n3 2672 16503 10940 5147 \r\n3 2224 16502 16503 5147 \r\n3 1154 10940 16502 5147 \r\n3 3979 16504 15746 5148 \r\n3 1522 15236 16504 5148 \r\n3 2955 15746 15236 5148 \r\n3 2044 14565 15021 5149 \r\n3 4051 16505 14565 5149 \r\n3 4283 15021 16505 5149 \r\n3 476 16508 16507 5150 \r\n3 842 16506 16508 5150 \r\n3 2605 16507 16506 5150 \r\n3 2831 14321 11495 5151 \r\n3 1357 16509 14321 5151 \r\n3 4246 11495 16509 5151 \r\n3 2828 16512 16511 5152 \r\n3 1281 16510 16512 5152 \r\n3 1493 16511 16510 5152 \r\n3 2464 16514 10752 5153 \r\n3 4183 16513 16514 5153 \r\n3 878 10752 16513 5153 \r\n3 3527 14354 16515 5154 \r\n3 1845 12318 14354 5154 \r\n3 2190 16515 12318 5154 \r\n3 2973 16516 16033 5155 \r\n3 539 7565 16516 5155 \r\n3 2815 16033 7565 5155 \r\n3 2298 11622 13365 5156 \r\n3 4955 16517 11622 5156 \r\n3 3038 13365 16517 5156 \r\n3 3992 10960 16519 5157 \r\n3 3619 16518 10960 5157 \r\n3 1479 16519 16518 5157 \r\n3 2292 14595 13323 5158 \r\n3 2865 15299 14595 5158 \r\n3 4392 13323 15299 5158 \r\n3 845 15004 16520 5159 \r\n3 2405 13604 15004 5159 \r\n3 3706 16520 13604 5159 \r\n3 2197 13012 16521 5160 \r\n3 815 6165 13012 5160 \r\n3 3252 16521 6165 5160 \r\n3 2065 16522 12907 5161 \r\n3 849 11728 16522 5161 \r\n3 2243 12907 11728 5161 \r\n3 508 15833 12578 5162 \r\n3 1939 16523 15833 5162 \r\n3 2878 12578 16523 5162 \r\n3 833 16525 16524 5163 \r\n3 387 13364 16525 5163 \r\n3 1873 16524 13364 5163 \r\n3 4789 10607 12663 5164 \r\n3 3310 16526 10607 5164 \r\n3 2341 12663 16526 5164 \r\n3 2987 16529 16528 5165 \r\n3 3872 16527 16529 5165 \r\n3 1493 16528 16527 5165 \r\n3 179 16531 16530 5166 \r\n3 2952 7015 16531 5166 \r\n3 3437 16530 7015 5166 \r\n3 2985 14401 14501 5167 \r\n3 4373 11834 14401 5167 \r\n3 2323 14501 11834 5167 \r\n3 3107 12990 16532 5168 \r\n3 776 6718 12990 5168 \r\n3 2737 16532 6718 5168 \r\n3 2177 8104 16533 5169 \r\n3 693 13043 8104 5169 \r\n3 778 16533 13043 5169 \r\n3 1216 11683 16535 5170 \r\n3 3565 16534 11683 5170 \r\n3 579 16535 16534 5170 \r\n3 1095 16537 16536 5171 \r\n3 2146 13095 16537 5171 \r\n3 1182 16536 13095 5171 \r\n3 3973 15796 16538 5172 \r\n3 953 15434 15796 5172 \r\n3 4936 16538 15434 5172 \r\n3 3567 10258 16151 5173 \r\n3 963 16539 10258 5173 \r\n3 3075 16151 16539 5173 \r\n3 3452 14151 12842 5174 \r\n3 2147 16540 14151 5174 \r\n3 430 12842 16540 5174 \r\n3 4546 13075 16542 5175 \r\n3 2873 16541 13075 5175 \r\n3 4719 16542 16541 5175 \r\n3 2148 16544 16543 5176 \r\n3 3192 5042 16544 5176 \r\n3 4609 16543 5042 5176 \r\n3 2445 15829 16545 5177 \r\n3 4030 10723 15829 5177 \r\n3 4588 16545 10723 5177 \r\n3 1644 15758 16546 5178 \r\n3 3842 13882 15758 5178 \r\n3 1041 16546 13882 5178 \r\n3 50 8229 14197 5179 \r\n3 2358 11312 8229 5179 \r\n3 2566 14197 11312 5179 \r\n3 24 14049 14641 5180 \r\n3 3341 5045 14049 5180 \r\n3 2594 14641 5045 5180 \r\n3 2520 10105 16547 5181 \r\n3 4950 9166 10105 5181 \r\n3 2953 16547 9166 5181 \r\n3 4390 13298 16548 5182 \r\n3 2948 14642 13298 5182 \r\n3 2021 16548 14642 5182 \r\n3 616 7115 5379 5183 \r\n3 4918 7377 7115 5183 \r\n3 3593 5379 7377 5183 \r\n3 3735 16551 16550 5184 \r\n3 4658 16549 16551 5184 \r\n3 4226 16550 16549 5184 \r\n3 2731 6250 16552 5185 \r\n3 4005 5307 6250 5185 \r\n3 2942 16552 5307 5185 \r\n3 3007 6707 14986 5186 \r\n3 462 11354 6707 5186 \r\n3 3028 14986 11354 5186 \r\n3 102 16555 16554 5187 \r\n3 4586 16553 16555 5187 \r\n3 4001 16554 16553 5187 \r\n3 3087 13000 16556 5188 \r\n3 242 14351 13000 5188 \r\n3 3718 16556 14351 5188 \r\n3 743 16559 16558 5189 \r\n3 1667 16557 16559 5189 \r\n3 4867 16558 16557 5189 \r\n3 66 16560 9556 5190 \r\n3 478 14140 16560 5190 \r\n3 3021 9556 14140 5190 \r\n3 1132 12568 5770 5191 \r\n3 2816 16561 12568 5191 \r\n3 2398 5770 16561 5191 \r\n3 4491 6997 7556 5192 \r\n3 2092 16562 6997 5192 \r\n3 871 7556 16562 5192 \r\n3 2635 10211 16563 5193 \r\n3 2186 13076 10211 5193 \r\n3 2966 16563 13076 5193 \r\n3 4920 16566 16565 5194 \r\n3 2397 16564 16566 5194 \r\n3 1159 16565 16564 5194 \r\n3 1039 15167 5887 5195 \r\n3 607 13678 15167 5195 \r\n3 4660 5887 13678 5195 \r\n3 231 16567 16358 5196 \r\n3 4857 9583 16567 5196 \r\n3 2517 16358 9583 5196 \r\n3 2157 13915 6796 5197 \r\n3 4787 5914 13915 5197 \r\n3 625 6796 5914 5197 \r\n3 2304 16569 16568 5198 \r\n3 3960 7977 16569 5198 \r\n3 4429 16568 7977 5198 \r\n3 761 5860 15936 5199 \r\n3 3631 10783 5860 5199 \r\n3 378 15936 10783 5199 \r\n3 2662 8470 8081 5200 \r\n3 4437 16570 8470 5200 \r\n3 281 8081 16570 5200 \r\n3 4694 14341 16572 5201 \r\n3 2935 16571 14341 5201 \r\n3 2631 16572 16571 5201 \r\n3 1942 14205 14420 5202 \r\n3 2443 16573 14205 5202 \r\n3 1167 14420 16573 5202 \r\n3 4062 10383 16574 5203 \r\n3 468 11774 10383 5203 \r\n3 750 16574 11774 5203 \r\n3 1590 16575 15403 5204 \r\n3 1032 15201 16575 5204 \r\n3 1200 15403 15201 5204 \r\n3 4559 16578 16577 5205 \r\n3 964 16576 16578 5205 \r\n3 499 16577 16576 5205 \r\n3 3545 16581 16580 5206 \r\n3 1854 16579 16581 5206 \r\n3 4861 16580 16579 5206 \r\n3 201 8502 16582 5207 \r\n3 203 8151 8502 5207 \r\n3 1587 16582 8151 5207 \r\n3 1930 10452 11180 5208 \r\n3 3220 12542 10452 5208 \r\n3 3857 11180 12542 5208 \r\n3 2021 7482 16583 5209 \r\n3 3822 7859 7482 5209 \r\n3 670 16583 7859 5209 \r\n3 789 16585 13434 5210 \r\n3 2980 16584 16585 5210 \r\n3 976 13434 16584 5210 \r\n3 3582 16587 10430 5211 \r\n3 1796 16586 16587 5211 \r\n3 1411 10430 16586 5211 \r\n3 600 12859 7541 5212 \r\n3 4829 16588 12859 5212 \r\n3 2618 7541 16588 5212 \r\n3 583 11174 14458 5213 \r\n3 2858 9454 11174 5213 \r\n3 2217 14458 9454 5213 \r\n3 4525 16591 16590 5214 \r\n3 3412 16589 16591 5214 \r\n3 3736 16590 16589 5214 \r\n3 551 10514 15984 5215 \r\n3 4096 5475 10514 5215 \r\n3 4610 15984 5475 5215 \r\n3 4449 16302 16593 5216 \r\n3 4738 16592 16302 5216 \r\n3 4437 16593 16592 5216 \r\n3 3585 16594 14599 5217 \r\n3 2255 11566 16594 5217 \r\n3 1148 14599 11566 5217 \r\n3 901 13780 11202 5218 \r\n3 4589 16595 13780 5218 \r\n3 2657 11202 16595 5218 \r\n3 4778 8386 16597 5219 \r\n3 2972 16596 8386 5219 \r\n3 3961 16597 16596 5219 \r\n3 2371 16599 7543 5220 \r\n3 1630 16598 16599 5220 \r\n3 1540 7543 16598 5220 \r\n3 1169 16602 16601 5221 \r\n3 1697 16600 16602 5221 \r\n3 1978 16601 16600 5221 \r\n3 3623 11744 15246 5222 \r\n3 2775 16603 11744 5222 \r\n3 4991 15246 16603 5222 \r\n3 4136 16605 16604 5223 \r\n3 4863 15341 16605 5223 \r\n3 74 16604 15341 5223 \r\n3 623 16607 10142 5224 \r\n3 1976 16606 16607 5224 \r\n3 4070 10142 16606 5224 \r\n3 751 6548 16608 5225 \r\n3 1760 9550 6548 5225 \r\n3 1758 16608 9550 5225 \r\n3 4866 5477 16610 5226 \r\n3 3833 16609 5477 5226 \r\n3 1517 16610 16609 5226 \r\n3 2141 16613 16612 5227 \r\n3 1537 16611 16613 5227 \r\n3 4054 16612 16611 5227 \r\n3 3762 16615 16614 5228 \r\n3 723 15651 16615 5228 \r\n3 4669 16614 15651 5228 \r\n3 4886 16617 8990 5229 \r\n3 1399 16616 16617 5229 \r\n3 2035 8990 16616 5229 \r\n3 4898 16059 16618 5230 \r\n3 2981 15009 16059 5230 \r\n3 1689 16618 15009 5230 \r\n3 907 16619 6313 5231 \r\n3 3844 10213 16619 5231 \r\n3 3461 6313 10213 5231 \r\n3 4168 14183 16621 5232 \r\n3 1656 16620 14183 5232 \r\n3 2739 16621 16620 5232 \r\n3 4270 14016 15687 5233 \r\n3 3846 16622 14016 5233 \r\n3 2501 15687 16622 5233 \r\n3 3065 16624 16623 5234 \r\n3 3967 6021 16624 5234 \r\n3 3285 16623 6021 5234 \r\n3 4900 15375 16626 5235 \r\n3 3609 16625 15375 5235 \r\n3 3232 16626 16625 5235 \r\n3 592 16628 10656 5236 \r\n3 4415 16627 16628 5236 \r\n3 134 10656 16627 5236 \r\n3 758 16629 9319 5237 \r\n3 2398 6179 16629 5237 \r\n3 4591 9319 6179 5237 \r\n3 3603 15918 16630 5238 \r\n3 2688 16397 15918 5238 \r\n3 4847 16630 16397 5238 \r\n3 3581 6872 16631 5239 \r\n3 3473 10463 6872 5239 \r\n3 4745 16631 10463 5239 \r\n3 825 9641 14006 5240 \r\n3 3147 16632 9641 5240 \r\n3 4198 14006 16632 5240 \r\n3 3653 13530 16633 5241 \r\n3 4165 13148 13530 5241 \r\n3 2728 16633 13148 5241 \r\n3 4220 16312 6740 5242 \r\n3 3541 12266 16312 5242 \r\n3 3531 6740 12266 5242 \r\n3 3143 16635 16634 5243 \r\n3 4182 10417 16635 5243 \r\n3 2874 16634 10417 5243 \r\n3 579 16636 16535 5244 \r\n3 809 12671 16636 5244 \r\n3 1216 16535 12671 5244 \r\n3 2760 16638 16637 5245 \r\n3 3364 11147 16638 5245 \r\n3 1999 16637 11147 5245 \r\n3 3541 16640 12567 5246 \r\n3 411 16639 16640 5246 \r\n3 3129 12567 16639 5246 \r\n3 1997 14857 16641 5247 \r\n3 4363 13198 14857 5247 \r\n3 3141 16641 13198 5247 \r\n3 4723 16642 15910 5248 \r\n3 2546 10512 16642 5248 \r\n3 1639 15910 10512 5248 \r\n3 3524 16644 16643 5249 \r\n3 19 14918 16644 5249 \r\n3 2633 16643 14918 5249 \r\n3 2491 7435 16645 5250 \r\n3 458 10700 7435 5250 \r\n3 1684 16645 10700 5250 \r\n3 1785 16646 11685 5251 \r\n3 4557 10267 16646 5251 \r\n3 3241 11685 10267 5251 \r\n3 3067 16649 16648 5252 \r\n3 1797 16647 16649 5252 \r\n3 2599 16648 16647 5252 \r\n3 2446 13244 16650 5253 \r\n3 4783 15095 13244 5253 \r\n3 1696 16650 15095 5253 \r\n3 4719 9999 16542 5254 \r\n3 1602 7085 9999 5254 \r\n3 4546 16542 7085 5254 \r\n3 1277 6079 11816 5255 \r\n3 1198 7017 6079 5255 \r\n3 2718 11816 7017 5255 \r\n3 4510 13192 12251 5256 \r\n3 4946 9613 13192 5256 \r\n3 4974 12251 9613 5256 \r\n3 3115 16653 16652 5257 \r\n3 544 16651 16653 5257 \r\n3 3035 16652 16651 5257 \r\n3 2973 7782 16654 5258 \r\n3 3492 14469 7782 5258 \r\n3 4694 16654 14469 5258 \r\n3 1947 16656 15836 5259 \r\n3 4254 16655 16656 5259 \r\n3 1499 15836 16655 5259 \r\n3 4497 16658 6704 5260 \r\n3 4299 16657 16658 5260 \r\n3 1123 6704 16657 5260 \r\n3 3332 16660 16659 5261 \r\n3 3812 7806 16660 5261 \r\n3 4486 16659 7806 5261 \r\n3 1306 16662 16661 5262 \r\n3 3722 12539 16662 5262 \r\n3 1739 16661 12539 5262 \r\n3 2869 16664 14813 5263 \r\n3 4360 16663 16664 5263 \r\n3 4328 14813 16663 5263 \r\n3 2884 10824 10064 5264 \r\n3 853 16665 10824 5264 \r\n3 1736 10064 16665 5264 \r\n3 3276 16667 11747 5265 \r\n3 3364 16666 16667 5265 \r\n3 2536 11747 16666 5265 \r\n3 4698 13702 9817 5266 \r\n3 4929 16668 13702 5266 \r\n3 4915 9817 16668 5266 \r\n3 3718 14353 7217 5267 \r\n3 4301 5614 14353 5267 \r\n3 3891 7217 5614 5267 \r\n3 1756 12157 16669 5268 \r\n3 4501 9345 12157 5268 \r\n3 1573 16669 9345 5268 \r\n3 2146 16672 16671 5269 \r\n3 985 16670 16672 5269 \r\n3 4385 16671 16670 5269 \r\n3 4181 16675 16674 5270 \r\n3 1601 16673 16675 5270 \r\n3 642 16674 16673 5270 \r\n3 2032 16002 16676 5271 \r\n3 1481 15771 16002 5271 \r\n3 3830 16676 15771 5271 \r\n3 2240 14971 16678 5272 \r\n3 1424 16677 14971 5272 \r\n3 67 16678 16677 5272 \r\n3 298 16681 16680 5273 \r\n3 1285 16679 16681 5273 \r\n3 3256 16680 16679 5273 \r\n3 3659 13489 5567 5274 \r\n3 3575 11508 13489 5274 \r\n3 3270 5567 11508 5274 \r\n3 2822 10088 16683 5275 \r\n3 3896 16682 10088 5275 \r\n3 1654 16683 16682 5275 \r\n3 3344 8896 13371 5276 \r\n3 4586 15336 8896 5276 \r\n3 4569 13371 15336 5276 \r\n3 645 16685 14684 5277 \r\n3 4066 16684 16685 5277 \r\n3 378 14684 16684 5277 \r\n3 880 9152 7821 5278 \r\n3 1916 12021 9152 5278 \r\n3 983 7821 12021 5278 \r\n3 3364 16667 11146 5279 \r\n3 3276 16686 16667 5279 \r\n3 3515 11146 16686 5279 \r\n3 94 16687 8653 5280 \r\n3 3565 11682 16687 5280 \r\n3 2544 8653 11682 5280 \r\n3 4792 16690 16689 5281 \r\n3 1344 16688 16690 5281 \r\n3 1105 16689 16688 5281 \r\n3 2770 16288 16030 5282 \r\n3 3551 16234 16288 5282 \r\n3 4699 16030 16234 5282 \r\n3 890 12890 16195 5283 \r\n3 714 5924 12890 5283 \r\n3 2114 16195 5924 5283 \r\n3 1329 5701 7810 5284 \r\n3 186 14191 5701 5284 \r\n3 4015 7810 14191 5284 \r\n3 2051 16692 16691 5285 \r\n3 4986 5591 16692 5285 \r\n3 2335 16691 5591 5285 \r\n3 540 13593 16693 5286 \r\n3 3563 16046 13593 5286 \r\n3 4235 16693 16046 5286 \r\n3 2089 16695 16694 5287 \r\n3 2416 10906 16695 5287 \r\n3 3064 16694 10906 5287 \r\n3 2921 16698 16697 5288 \r\n3 1199 16696 16698 5288 \r\n3 2291 16697 16696 5288 \r\n3 102 16699 16555 5289 \r\n3 2868 15337 16699 5289 \r\n3 4586 16555 15337 5289 \r\n3 2109 16701 16700 5290 \r\n3 4825 8835 16701 5290 \r\n3 3932 16700 8835 5290 \r\n3 4507 10465 16163 5291 \r\n3 207 16702 10465 5291 \r\n3 1591 16163 16702 5291 \r\n3 647 16704 10401 5292 \r\n3 4196 16703 16704 5292 \r\n3 2223 10401 16703 5292 \r\n3 4204 16706 16705 5293 \r\n3 935 6351 16706 5293 \r\n3 1026 16705 6351 5293 \r\n3 4146 16708 11975 5294 \r\n3 381 16707 16708 5294 \r\n3 354 11975 16707 5294 \r\n3 3835 16709 11657 5295 \r\n3 3917 11545 16709 5295 \r\n3 655 11657 11545 5295 \r\n3 2535 16712 16711 5296 \r\n3 3023 16710 16712 5296 \r\n3 291 16711 16710 5296 \r\n3 4724 11846 16713 5297 \r\n3 2238 12703 11846 5297 \r\n3 257 16713 12703 5297 \r\n3 451 11806 16715 5298 \r\n3 1187 16714 11806 5298 \r\n3 821 16715 16714 5298 \r\n3 259 16717 16716 5299 \r\n3 4388 11983 16717 5299 \r\n3 2643 16716 11983 5299 \r\n3 4669 15650 16469 5300 \r\n3 2838 16718 15650 5300 \r\n3 2547 16469 16718 5300 \r\n3 1101 12824 16720 5301 \r\n3 350 16719 12824 5301 \r\n3 3466 16720 16719 5301 \r\n3 2148 16722 16544 5302 \r\n3 1782 16721 16722 5302 \r\n3 3192 16544 16721 5302 \r\n3 385 16724 16723 5303 \r\n3 956 15848 16724 5303 \r\n3 2033 16723 15848 5303 \r\n3 2068 16725 11696 5304 \r\n3 1619 14334 16725 5304 \r\n3 2558 11696 14334 5304 \r\n3 1802 9433 6458 5305 \r\n3 1732 16726 9433 5305 \r\n3 1496 6458 16726 5305 \r\n3 4156 10580 8291 5306 \r\n3 2723 15660 10580 5306 \r\n3 4888 8291 15660 5306 \r\n3 1471 5527 16728 5307 \r\n3 3611 16727 5527 5307 \r\n3 2098 16728 16727 5307 \r\n3 3118 16731 16730 5308 \r\n3 926 16729 16731 5308 \r\n3 664 16730 16729 5308 \r\n3 3234 16732 15974 5309 \r\n3 76 6629 16732 5309 \r\n3 369 15974 6629 5309 \r\n3 4662 15605 16733 5310 \r\n3 2107 10560 15605 5310 \r\n3 1728 16733 10560 5310 \r\n3 3182 5792 12752 5311 \r\n3 3269 16734 5792 5311 \r\n3 919 12752 16734 5311 \r\n3 3650 15590 16736 5312 \r\n3 1335 16735 15590 5312 \r\n3 2151 16736 16735 5312 \r\n3 4474 16738 16008 5313 \r\n3 4440 16737 16738 5313 \r\n3 2273 16008 16737 5313 \r\n3 2064 11409 16740 5314 \r\n3 1633 16739 11409 5314 \r\n3 3340 16740 16739 5314 \r\n3 2109 16741 7194 5315 \r\n3 650 12379 16741 5315 \r\n3 3157 7194 12379 5315 \r\n3 4511 16744 16743 5316 \r\n3 2258 16742 16744 5316 \r\n3 940 16743 16742 5316 \r\n3 2454 16747 16746 5317 \r\n3 4578 16745 16747 5317 \r\n3 3334 16746 16745 5317 \r\n3 562 16748 6879 5318 \r\n3 4446 15937 16748 5318 \r\n3 1966 6879 15937 5318 \r\n3 3325 14448 5218 5319 \r\n3 1711 15230 14448 5319 \r\n3 3566 5218 15230 5319 \r\n3 4750 16750 16749 5320 \r\n3 2770 16032 16750 5320 \r\n3 64 16749 16032 5320 \r\n3 4581 16753 16752 5321 \r\n3 1855 16751 16753 5321 \r\n3 4289 16752 16751 5321 \r\n3 3034 5061 8505 5322 \r\n3 2743 16754 5061 5322 \r\n3 1868 8505 16754 5322 \r\n3 2451 16755 9129 5323 \r\n3 1697 16602 16755 5323 \r\n3 1169 9129 16602 5323 \r\n3 4632 16064 16757 5324 \r\n3 637 16756 16064 5324 \r\n3 1872 16757 16756 5324 \r\n3 2720 16759 16426 5325 \r\n3 172 16758 16759 5325 \r\n3 1482 16426 16758 5325 \r\n3 4897 12861 16760 5326 \r\n3 3846 14015 12861 5326 \r\n3 3079 16760 14015 5326 \r\n3 3221 13125 9126 5327 \r\n3 3763 16761 13125 5327 \r\n3 4584 9126 16761 5327 \r\n3 3558 15614 14078 5328 \r\n3 4288 7713 15614 5328 \r\n3 639 14078 7713 5328 \r\n3 2463 16763 16762 5329 \r\n3 2495 8677 16763 5329 \r\n3 770 16762 8677 5329 \r\n3 2519 16766 16765 5330 \r\n3 2911 16764 16766 5330 \r\n3 1566 16765 16764 5330 \r\n3 2139 10068 12702 5331 \r\n3 991 13677 10068 5331 \r\n3 514 12702 13677 5331 \r\n3 3852 16769 16768 5332 \r\n3 975 16767 16769 5332 \r\n3 3840 16768 16767 5332 \r\n3 739 16771 14893 5333 \r\n3 3448 16770 16771 5333 \r\n3 2025 14893 16770 5333 \r\n3 2358 9339 16773 5334 \r\n3 4804 16772 9339 5334 \r\n3 2025 16773 16772 5334 \r\n3 2913 14201 16774 5335 \r\n3 2326 10204 14201 5335 \r\n3 528 16774 10204 5335 \r\n3 2170 8955 8577 5336 \r\n3 3602 8456 8955 5336 \r\n3 1578 8577 8456 5336 \r\n3 1183 12985 8750 5337 \r\n3 2792 16775 12985 5337 \r\n3 4055 8750 16775 5337 \r\n3 2887 7101 8886 5338 \r\n3 4000 16776 7101 5338 \r\n3 1349 8886 16776 5338 \r\n3 2451 16779 16778 5339 \r\n3 3162 16777 16779 5339 \r\n3 1621 16778 16777 5339 \r\n3 3050 16781 16780 5340 \r\n3 415 12526 16781 5340 \r\n3 548 16780 12526 5340 \r\n3 3402 16782 8087 5341 \r\n3 2943 15792 16782 5341 \r\n3 4325 8087 15792 5341 \r\n3 4528 16784 16783 5342 \r\n3 216 8457 16784 5342 \r\n3 3602 16783 8457 5342 \r\n3 1290 12621 15567 5343 \r\n3 1983 16785 12621 5343 \r\n3 1179 15567 16785 5343 \r\n3 4584 16761 14067 5344 \r\n3 3763 8516 16761 5344 \r\n3 2105 14067 8516 5344 \r\n3 4162 16788 16787 5345 \r\n3 925 16786 16788 5345 \r\n3 3707 16787 16786 5345 \r\n3 3560 16790 16789 5346 \r\n3 3988 12106 16790 5346 \r\n3 4531 16789 12106 5346 \r\n3 3992 16793 16792 5347 \r\n3 115 16791 16793 5347 \r\n3 3178 16792 16791 5347 \r\n3 4668 5848 16795 5348 \r\n3 2281 16794 5848 5348 \r\n3 793 16795 16794 5348 \r\n3 3551 16289 16797 5349 \r\n3 4182 16796 16289 5349 \r\n3 1688 16797 16796 5349 \r\n3 1236 15932 12665 5350 \r\n3 1222 14898 15932 5350 \r\n3 1253 12665 14898 5350 \r\n3 2472 16799 16798 5351 \r\n3 482 11383 16799 5351 \r\n3 4106 16798 11383 5351 \r\n3 517 8760 16800 5352 \r\n3 2614 8406 8760 5352 \r\n3 4823 16800 8406 5352 \r\n3 1476 16802 16119 5353 \r\n3 1158 16801 16802 5353 \r\n3 4552 16119 16801 5353 \r\n3 4708 7891 5149 5354 \r\n3 2194 16803 7891 5354 \r\n3 2931 5149 16803 5354 \r\n3 1583 16805 16304 5355 \r\n3 4178 16804 16805 5355 \r\n3 3622 16304 16804 5355 \r\n3 885 15941 16806 5356 \r\n3 4393 13208 15941 5356 \r\n3 959 16806 13208 5356 \r\n3 792 16807 15534 5357 \r\n3 870 12279 16807 5357 \r\n3 2139 15534 12279 5357 \r\n3 4462 16809 16808 5358 \r\n3 3579 15172 16809 5358 \r\n3 897 16808 15172 5358 \r\n3 403 10825 6696 5359 \r\n3 2884 16810 10825 5359 \r\n3 474 6696 16810 5359 \r\n3 4769 16080 16811 5360 \r\n3 4734 5013 16080 5360 \r\n3 3783 16811 5013 5360 \r\n3 3369 13997 7332 5361 \r\n3 3987 16812 13997 5361 \r\n3 1171 7332 16812 5361 \r\n3 3711 7686 16813 5362 \r\n3 4763 15521 7686 5362 \r\n3 742 16813 15521 5362 \r\n3 4006 16055 16815 5363 \r\n3 4120 16814 16055 5363 \r\n3 1133 16815 16814 5363 \r\n3 393 16817 14486 5364 \r\n3 4537 16816 16817 5364 \r\n3 4940 14486 16816 5364 \r\n3 274 16818 10728 5365 \r\n3 689 6330 16818 5365 \r\n3 4009 10728 6330 5365 \r\n3 3471 16820 10473 5366 \r\n3 270 16819 16820 5366 \r\n3 3292 10473 16819 5366 \r\n3 4134 10456 16822 5367 \r\n3 3789 16821 10456 5367 \r\n3 3968 16822 16821 5367 \r\n3 4565 12560 13051 5368 \r\n3 526 16823 12560 5368 \r\n3 449 13051 16823 5368 \r\n3 1567 16825 16824 5369 \r\n3 1800 10275 16825 5369 \r\n3 3148 16824 10275 5369 \r\n3 3604 16827 16826 5370 \r\n3 3208 15269 16827 5370 \r\n3 602 16826 15269 5370 \r\n3 1278 16828 13435 5371 \r\n3 2700 11133 16828 5371 \r\n3 1513 13435 11133 5371 \r\n3 1093 8942 14350 5372 \r\n3 4782 16829 8942 5372 \r\n3 2426 14350 16829 5372 \r\n3 930 16831 16830 5373 \r\n3 3503 10272 16831 5373 \r\n3 731 16830 10272 5373 \r\n3 775 16833 9733 5374 \r\n3 4213 16832 16833 5374 \r\n3 3574 9733 16832 5374 \r\n3 3806 16835 7775 5375 \r\n3 1021 16834 16835 5375 \r\n3 0 7775 16834 5375 \r\n3 1411 16586 16836 5376 \r\n3 1796 11393 16586 5376 \r\n3 1229 16836 11393 5376 \r\n3 4067 12492 14564 5377 \r\n3 939 16837 12492 5377 \r\n3 548 14564 16837 5377 \r\n3 2428 16838 6995 5378 \r\n3 2073 10704 16838 5378 \r\n3 3958 6995 10704 5378 \r\n3 680 6253 8362 5379 \r\n3 463 16378 6253 5379 \r\n3 3781 8362 16378 5379 \r\n3 2108 10509 16840 5380 \r\n3 931 16839 10509 5380 \r\n3 882 16840 16839 5380 \r\n3 4317 16842 16841 5381 \r\n3 3760 13072 16842 5381 \r\n3 531 16841 13072 5381 \r\n3 4833 16844 13527 5382 \r\n3 3008 16843 16844 5382 \r\n3 4679 13527 16843 5382 \r\n3 4112 12152 16846 5383 \r\n3 295 16845 12152 5383 \r\n3 2679 16846 16845 5383 \r\n3 2838 14790 12002 5384 \r\n3 1604 5384 14790 5384 \r\n3 1790 12002 5384 5384 \r\n3 4444 9017 16847 5385 \r\n3 4206 13747 9017 5385 \r\n3 1967 16847 13747 5385 \r\n3 2480 14286 11804 5386 \r\n3 2621 16848 14286 5386 \r\n3 1267 11804 16848 5386 \r\n3 1462 15813 16850 5387 \r\n3 3954 16849 15813 5387 \r\n3 149 16850 16849 5387 \r\n3 2597 15418 9627 5388 \r\n3 952 15273 15418 5388 \r\n3 3077 9627 15273 5388 \r\n3 1359 6231 6123 5389 \r\n3 1021 15423 6231 5389 \r\n3 2079 6123 15423 5389 \r\n3 1373 11667 16851 5390 \r\n3 1145 14164 11667 5390 \r\n3 970 16851 14164 5390 \r\n3 2106 14453 13283 5391 \r\n3 4349 16072 14453 5391 \r\n3 2600 13283 16072 5391 \r\n3 1253 15436 16401 5392 \r\n3 4877 8977 15436 5392 \r\n3 4387 16401 8977 5392 \r\n3 1826 5941 8593 5393 \r\n3 1125 16852 5941 5393 \r\n3 4665 8593 16852 5393 \r\n3 3249 16854 16853 5394 \r\n3 3063 9855 16854 5394 \r\n3 540 16853 9855 5394 \r\n3 3901 16856 10946 5395 \r\n3 3779 16855 16856 5395 \r\n3 1706 10946 16855 5395 \r\n3 1684 10702 15114 5396 \r\n3 4761 6908 10702 5396 \r\n3 688 15114 6908 5396 \r\n3 4580 10841 14060 5397 \r\n3 2155 8134 10841 5397 \r\n3 1377 14060 8134 5397 \r\n3 1587 16858 16857 5398 \r\n3 3898 7021 16858 5398 \r\n3 4724 16857 7021 5398 \r\n3 2352 8551 16860 5399 \r\n3 2370 16859 8551 5399 \r\n3 4577 16860 16859 5399 \r\n3 256 16862 13543 5400 \r\n3 2163 16861 16862 5400 \r\n3 1279 13543 16861 5400 \r\n3 1621 10982 9679 5401 \r\n3 333 14487 10982 5401 \r\n3 4940 9679 14487 5401 \r\n3 510 15181 10718 5402 \r\n3 2869 5867 15181 5402 \r\n3 2266 10718 5867 5402 \r\n3 114 16394 9775 5403 \r\n3 1680 16863 16394 5403 \r\n3 4221 9775 16863 5403 \r\n3 2677 13044 16385 5404 \r\n3 693 15747 13044 5404 \r\n3 2635 16385 15747 5404 \r\n3 4025 16865 15041 5405 \r\n3 1549 16864 16865 5405 \r\n3 1707 15041 16864 5405 \r\n3 1401 6201 16866 5406 \r\n3 3187 11107 6201 5406 \r\n3 1937 16866 11107 5406 \r\n3 2574 16869 16868 5407 \r\n3 3859 16867 16869 5407 \r\n3 884 16868 16867 5407 \r\n3 2410 16872 16871 5408 \r\n3 4020 16870 16872 5408 \r\n3 3392 16871 16870 5408 \r\n3 3734 16875 16874 5409 \r\n3 4736 16873 16875 5409 \r\n3 4336 16874 16873 5409 \r\n3 1313 16877 16876 5410 \r\n3 3763 13127 16877 5410 \r\n3 3096 16876 13127 5410 \r\n3 670 9607 16583 5411 \r\n3 3715 16878 9607 5411 \r\n3 2021 16583 16878 5411 \r\n3 3488 16880 9896 5412 \r\n3 4114 16879 16880 5412 \r\n3 4176 9896 16879 5412 \r\n3 3704 10167 16882 5413 \r\n3 2205 16881 10167 5413 \r\n3 2408 16882 16881 5413 \r\n3 314 16884 8039 5414 \r\n3 4391 16883 16884 5414 \r\n3 1687 8039 16883 5414 \r\n3 4368 12090 12571 5415 \r\n3 3766 11224 12090 5415 \r\n3 2412 12571 11224 5415 \r\n3 4293 11028 9208 5416 \r\n3 2019 12637 11028 5416 \r\n3 2771 9208 12637 5416 \r\n3 3530 16886 16885 5417 \r\n3 4060 16147 16886 5417 \r\n3 820 16885 16147 5417 \r\n3 3249 15207 16887 5418 \r\n3 3633 12408 15207 5418 \r\n3 4019 16887 12408 5418 \r\n3 3741 10180 16888 5419 \r\n3 617 9752 10180 5419 \r\n3 2322 16888 9752 5419 \r\n3 662 6272 8022 5420 \r\n3 4643 16889 6272 5420 \r\n3 3363 8022 16889 5420 \r\n3 3672 16891 16890 5421 \r\n3 3168 14830 16891 5421 \r\n3 3089 16890 14830 5421 \r\n3 2358 8228 9340 5422 \r\n3 546 16892 8228 5422 \r\n3 2143 9340 16892 5422 \r\n3 4773 6494 16372 5423 \r\n3 2197 16893 6494 5423 \r\n3 3385 16372 16893 5423 \r\n3 3403 8057 6295 5424 \r\n3 744 16894 8057 5424 \r\n3 1144 6295 16894 5424 \r\n3 4008 10665 12118 5425 \r\n3 915 16895 10665 5425 \r\n3 2281 12118 16895 5425 \r\n3 4890 16898 16897 5426 \r\n3 1171 16896 16898 5426 \r\n3 2434 16897 16896 5426 \r\n3 3897 13615 12592 5427 \r\n3 3200 16899 13615 5427 \r\n3 4598 12592 16899 5427 \r\n3 4224 9738 16901 5428 \r\n3 1406 16900 9738 5428 \r\n3 4696 16901 16900 5428 \r\n3 4564 15700 11392 5429 \r\n3 727 5204 15700 5429 \r\n3 2848 11392 5204 5429 \r\n3 4670 16903 15468 5430 \r\n3 2906 16902 16903 5430 \r\n3 530 15468 16902 5430 \r\n3 1621 9678 16778 5431 \r\n3 1697 16755 9678 5431 \r\n3 2451 16778 16755 5431 \r\n3 2562 5692 16904 5432 \r\n3 2141 8851 5692 5432 \r\n3 3766 16904 8851 5432 \r\n3 4217 12517 8256 5433 \r\n3 1007 5103 12517 5433 \r\n3 4635 8256 5103 5433 \r\n3 3276 14468 16906 5434 \r\n3 2498 16905 14468 5434 \r\n3 3445 16906 16905 5434 \r\n3 569 8806 11849 5435 \r\n3 121 11835 8806 5435 \r\n3 4373 11849 11835 5435 \r\n3 1445 16908 16907 5436 \r\n3 2463 5594 16908 5436 \r\n3 4498 16907 5594 5436 \r\n3 311 16909 15183 5437 \r\n3 2752 9458 16909 5437 \r\n3 2260 15183 9458 5437 \r\n3 592 16912 16911 5438 \r\n3 4590 16910 16912 5438 \r\n3 1102 16911 16910 5438 \r\n3 3780 12594 7228 5439 \r\n3 322 13250 12594 5439 \r\n3 2497 7228 13250 5439 \r\n3 4588 10722 16913 5440 \r\n3 259 15867 10722 5440 \r\n3 152 16913 15867 5440 \r\n3 2111 6409 16914 5441 \r\n3 163 7402 6409 5441 \r\n3 4024 16914 7402 5441 \r\n3 4171 16916 16915 5442 \r\n3 594 12465 16916 5442 \r\n3 4607 16915 12465 5442 \r\n3 1010 6229 15404 5443 \r\n3 3956 16917 6229 5443 \r\n3 4710 15404 16917 5443 \r\n3 4159 16919 14289 5444 \r\n3 2904 16918 16919 5444 \r\n3 1204 14289 16918 5444 \r\n3 919 16734 10974 5445 \r\n3 3269 16920 16734 5445 \r\n3 2467 10974 16920 5445 \r\n3 469 13835 10693 5446 \r\n3 3639 8831 13835 5446 \r\n3 4003 10693 8831 5446 \r\n3 382 16922 16921 5447 \r\n3 1533 16398 16922 5447 \r\n3 2124 16921 16398 5447 \r\n3 4340 16923 10896 5448 \r\n3 2761 14171 16923 5448 \r\n3 4466 10896 14171 5448 \r\n3 2776 11427 7674 5449 \r\n3 3899 16924 11427 5449 \r\n3 3740 7674 16924 5449 \r\n3 271 16926 7460 5450 \r\n3 2277 16925 16926 5450 \r\n3 1051 7460 16925 5450 \r\n3 1875 16928 16927 5451 \r\n3 2954 7259 16928 5451 \r\n3 577 16927 7259 5451 \r\n3 859 6561 16929 5452 \r\n3 1335 15589 6561 5452 \r\n3 2804 16929 15589 5452 \r\n3 3114 16932 16931 5453 \r\n3 2254 16930 16932 5453 \r\n3 168 16931 16930 5453 \r\n3 1007 16933 5101 5454 \r\n3 381 5448 16933 5454 \r\n3 4372 5101 5448 5454 \r\n3 3416 13611 9363 5455 \r\n3 1467 12986 13611 5455 \r\n3 1183 9363 12986 5455 \r\n3 2741 16934 16063 5456 \r\n3 1962 13649 16934 5456 \r\n3 3428 16063 13649 5456 \r\n3 1638 14718 8136 5457 \r\n3 2262 8389 14718 5457 \r\n3 3142 8136 8389 5457 \r\n3 665 16936 16935 5458 \r\n3 1560 10975 16936 5458 \r\n3 2467 16935 10975 5458 \r\n3 3527 16515 16937 5459 \r\n3 2190 14223 16515 5459 \r\n3 3226 16937 14223 5459 \r\n3 4540 14023 15090 5460 \r\n3 2574 16868 14023 5460 \r\n3 884 15090 16868 5460 \r\n3 4077 16940 16939 5461 \r\n3 103 16938 16940 5461 \r\n3 1388 16939 16938 5461 \r\n3 2759 11740 7621 5462 \r\n3 4283 16505 11740 5462 \r\n3 4051 7621 16505 5462 \r\n3 2756 14616 16941 5463 \r\n3 4228 10903 14616 5463 \r\n3 2926 16941 10903 5463 \r\n3 4713 16944 16943 5464 \r\n3 2157 16942 16944 5464 \r\n3 3517 16943 16942 5464 \r\n3 2946 16945 7154 5465 \r\n3 4396 5870 16945 5465 \r\n3 2696 7154 5870 5465 \r\n3 2437 8196 10786 5466 \r\n3 282 5081 8196 5466 \r\n3 2607 10786 5081 5466 \r\n3 1743 13227 14695 5467 \r\n3 3100 6457 13227 5467 \r\n3 2013 14695 6457 5467 \r\n3 2830 7055 16947 5468 \r\n3 1759 16946 7055 5468 \r\n3 1722 16947 16946 5468 \r\n3 4398 16950 16949 5469 \r\n3 1525 16948 16950 5469 \r\n3 2285 16949 16948 5469 \r\n3 679 16459 16951 5470 \r\n3 3822 7481 16459 5470 \r\n3 3111 16951 7481 5470 \r\n3 2973 12551 16516 5471 \r\n3 4010 16952 12551 5471 \r\n3 539 16516 16952 5471 \r\n3 3332 10215 16953 5472 \r\n3 2894 8787 10215 5472 \r\n3 4811 16953 8787 5472 \r\n3 3401 12221 8672 5473 \r\n3 1574 11323 12221 5473 \r\n3 620 8672 11323 5473 \r\n3 4895 15123 15727 5474 \r\n3 360 16954 15123 5474 \r\n3 1659 15727 16954 5474 \r\n3 2783 11307 16955 5475 \r\n3 689 16818 11307 5475 \r\n3 274 16955 16818 5475 \r\n3 2543 13735 15734 5476 \r\n3 1506 16956 13735 5476 \r\n3 210 15734 16956 5476 \r\n3 718 12576 14707 5477 \r\n3 884 16867 12576 5477 \r\n3 3859 14707 16867 5477 \r\n3 1520 14990 15506 5478 \r\n3 3864 16957 14990 5478 \r\n3 2324 15506 16957 5478 \r\n3 2898 16479 12744 5479 \r\n3 1068 14150 16479 5479 \r\n3 1066 12744 14150 5479 \r\n3 3745 16959 16958 5480 \r\n3 2603 7414 16959 5480 \r\n3 1712 16958 7414 5480 \r\n3 3672 16961 16891 5481 \r\n3 4059 16960 16961 5481 \r\n3 3168 16891 16960 5481 \r\n3 368 16962 14686 5482 \r\n3 2518 9827 16962 5482 \r\n3 645 14686 9827 5482 \r\n3 1911 15442 15979 5483 \r\n3 2779 15823 15442 5483 \r\n3 3765 15979 15823 5483 \r\n3 2552 5462 16963 5484 \r\n3 4646 15127 5462 5484 \r\n3 420 16963 15127 5484 \r\n3 3570 16965 14832 5485 \r\n3 4391 16964 16965 5485 \r\n3 1724 14832 16964 5485 \r\n3 1204 14528 14290 5486 \r\n3 3001 11105 14528 5486 \r\n3 2721 14290 11105 5486 \r\n3 1883 16967 16966 5487 \r\n3 764 13240 16967 5487 \r\n3 4204 16966 13240 5487 \r\n3 1813 16969 6111 5488 \r\n3 1636 16968 16969 5488 \r\n3 912 6111 16968 5488 \r\n3 3930 16971 16970 5489 \r\n3 2715 15048 16971 5489 \r\n3 3004 16970 15048 5489 \r\n3 4929 16973 16668 5490 \r\n3 2671 16972 16973 5490 \r\n3 4915 16668 16972 5490 \r\n3 1821 16975 16974 5491 \r\n3 4842 12503 16975 5491 \r\n3 2345 16974 12503 5491 \r\n3 4390 6259 6304 5492 \r\n3 1765 14587 6259 5492 \r\n3 4097 6304 14587 5492 \r\n3 3002 9146 16977 5493 \r\n3 1130 16976 9146 5493 \r\n3 3562 16977 16976 5493 \r\n3 3829 15854 15877 5494 \r\n3 1903 15029 15854 5494 \r\n3 1960 15877 15029 5494 \r\n3 2401 16979 16978 5495 \r\n3 4880 12694 16979 5495 \r\n3 3236 16978 12694 5495 \r\n3 1636 16981 16980 5496 \r\n3 3938 15125 16981 5496 \r\n3 1667 16980 15125 5496 \r\n3 1792 16983 16982 5497 \r\n3 1908 15399 16983 5497 \r\n3 3349 16982 15399 5497 \r\n3 3805 14165 13640 5498 \r\n3 1145 11669 14165 5498 \r\n3 138 13640 11669 5498 \r\n3 4124 13467 15828 5499 \r\n3 1312 11642 13467 5499 \r\n3 4173 15828 11642 5499 \r\n3 291 16986 16985 5500 \r\n3 4153 16984 16986 5500 \r\n3 4786 16985 16984 5500 \r\n3 100 14186 16988 5501 \r\n3 3734 16987 14186 5501 \r\n3 3701 16988 16987 5501 \r\n3 4713 13801 16990 5502 \r\n3 1076 16989 13801 5502 \r\n3 509 16990 16989 5502 \r\n3 4728 14192 14097 5503 \r\n3 381 16708 14192 5503 \r\n3 4146 14097 16708 5503 \r\n3 1445 16991 14054 5504 \r\n3 3125 15756 16991 5504 \r\n3 306 14054 15756 5504 \r\n3 4562 12716 7353 5505 \r\n3 2529 7508 12716 5505 \r\n3 893 7353 7508 5505 \r\n3 3807 16993 14181 5506 \r\n3 2541 16992 16993 5506 \r\n3 3015 14181 16992 5506 \r\n3 4269 16017 16994 5507 \r\n3 4168 16621 16017 5507 \r\n3 2739 16994 16621 5507 \r\n3 4756 12624 16995 5508 \r\n3 176 13560 12624 5508 \r\n3 352 16995 13560 5508 \r\n3 4159 14288 11348 5509 \r\n3 2721 5964 14288 5509 \r\n3 457 11348 5964 5509 \r\n3 3806 7777 16996 5510 \r\n3 3311 8754 7777 5510 \r\n3 872 16996 8754 5510 \r\n3 4196 16997 13759 5511 \r\n3 124 8235 16997 5511 \r\n3 1885 13759 8235 5511 \r\n3 1869 7912 16998 5512 \r\n3 1692 15360 7912 5512 \r\n3 285 16998 15360 5512 \r\n3 4428 7900 13382 5513 \r\n3 2188 16999 7900 5513 \r\n3 1168 13382 16999 5513 \r\n3 3558 14077 17000 5514 \r\n3 4421 10308 14077 5514 \r\n3 3180 17000 10308 5514 \r\n3 2653 17003 17002 5515 \r\n3 2068 17001 17003 5515 \r\n3 3620 17002 17001 5515 \r\n3 3008 16844 17005 5516 \r\n3 4833 17004 16844 5516 \r\n3 1493 17005 17004 5516 \r\n3 470 17008 17007 5517 \r\n3 104 17006 17008 5517 \r\n3 99 17007 17006 5517 \r\n3 3372 17011 17010 5518 \r\n3 4913 17009 17011 5518 \r\n3 4089 17010 17009 5518 \r\n3 332 6650 15504 5519 \r\n3 4665 17012 6650 5519 \r\n3 2591 15504 17012 5519 \r\n3 1439 8644 11529 5520 \r\n3 1014 6103 8644 5520 \r\n3 3496 11529 6103 5520 \r\n3 184 17013 14710 5521 \r\n3 4533 7626 17013 5521 \r\n3 3137 14710 7626 5521 \r\n3 3320 17015 13017 5522 \r\n3 46 17014 17015 5522 \r\n3 4883 13017 17014 5522 \r\n3 1246 7107 15191 5523 \r\n3 4807 17016 7107 5523 \r\n3 2624 15191 17016 5523 \r\n3 2003 14693 17017 5524 \r\n3 3804 11177 14693 5524 \r\n3 3480 17017 11177 5524 \r\n3 2191 8307 7765 5525 \r\n3 2366 15365 8307 5525 \r\n3 2697 7765 15365 5525 \r\n3 951 17019 9635 5526 \r\n3 667 17018 17019 5526 \r\n3 2443 9635 17018 5526 \r\n3 813 6882 16097 5527 \r\n3 4121 16460 6882 5527 \r\n3 2459 16097 16460 5527 \r\n3 2385 17021 17020 5528 \r\n3 1801 12123 17021 5528 \r\n3 573 17020 12123 5528 \r\n3 3263 17022 6068 5529 \r\n3 768 16075 17022 5529 \r\n3 1770 6068 16075 5529 \r\n3 669 17023 10416 5530 \r\n3 1059 11411 17023 5530 \r\n3 2874 10416 11411 5530 \r\n3 4862 17024 7582 5531 \r\n3 4594 11522 17024 5531 \r\n3 1946 7582 11522 5531 \r\n3 1579 17026 17025 5532 \r\n3 43 13147 17026 5532 \r\n3 2426 17025 13147 5532 \r\n3 2076 12460 17027 5533 \r\n3 4138 15344 12460 5533 \r\n3 248 17027 15344 5533 \r\n3 883 11966 10527 5534 \r\n3 1764 11249 11966 5534 \r\n3 3584 10527 11249 5534 \r\n3 3119 14005 17028 5535 \r\n3 4683 9317 14005 5535 \r\n3 331 17028 9317 5535 \r\n3 2958 5889 17029 5536 \r\n3 4395 6305 5889 5536 \r\n3 4097 17029 6305 5536 \r\n3 4318 17030 6155 5537 \r\n3 478 16560 17030 5537 \r\n3 66 6155 16560 5537 \r\n3 1957 6812 5409 5538 \r\n3 1622 17031 6812 5538 \r\n3 1288 5409 17031 5538 \r\n3 2045 14913 17032 5539 \r\n3 509 16989 14913 5539 \r\n3 1076 17032 16989 5539 \r\n3 353 17034 9378 5540 \r\n3 1326 17033 17034 5540 \r\n3 842 9378 17033 5540 \r\n3 942 7323 5320 5541 \r\n3 962 17035 7323 5541 \r\n3 534 5320 17035 5541 \r\n3 4257 5743 11660 5542 \r\n3 3240 5350 5743 5542 \r\n3 2028 11660 5350 5542 \r\n3 3281 16191 17036 5543 \r\n3 3507 14817 16191 5543 \r\n3 90 17036 14817 5543 \r\n3 1341 17038 17037 5544 \r\n3 967 16433 17038 5544 \r\n3 2086 17037 16433 5544 \r\n3 4379 12304 10931 5545 \r\n3 1 9703 12304 5545 \r\n3 1828 10931 9703 5545 \r\n3 395 16173 17039 5546 \r\n3 2746 7723 16173 5546 \r\n3 1673 17039 7723 5546 \r\n3 1390 17042 17041 5547 \r\n3 1594 17040 17042 5547 \r\n3 3916 17041 17040 5547 \r\n3 1701 17043 15679 5548 \r\n3 1265 16077 17043 5548 \r\n3 4692 15679 16077 5548 \r\n3 200 17044 5625 5549 \r\n3 174 15077 17044 5549 \r\n3 1926 5625 15077 5549 \r\n3 195 17046 17045 5550 \r\n3 551 15985 17046 5550 \r\n3 1393 17045 15985 5550 \r\n3 73 11082 17047 5551 \r\n3 1806 10046 11082 5551 \r\n3 4248 17047 10046 5551 \r\n3 3931 6310 13946 5552 \r\n3 1979 14502 6310 5552 \r\n3 2323 13946 14502 5552 \r\n3 1403 10139 17048 5553 \r\n3 2254 7147 10139 5553 \r\n3 1502 17048 7147 5553 \r\n3 2525 15949 5605 5554 \r\n3 4043 17049 15949 5554 \r\n3 3774 5605 17049 5554 \r\n3 145 8435 8558 5555 \r\n3 3577 17050 8435 5555 \r\n3 1258 8558 17050 5555 \r\n3 1536 9940 6315 5556 \r\n3 3431 11237 9940 5556 \r\n3 907 6315 11237 5556 \r\n3 3657 17053 17052 5557 \r\n3 3571 17051 17053 5557 \r\n3 3011 17052 17051 5557 \r\n3 950 11876 5896 5558 \r\n3 798 6619 11876 5558 \r\n3 244 5896 6619 5558 \r\n3 2406 17054 16290 5559 \r\n3 2461 14559 17054 5559 \r\n3 2313 16290 14559 5559 \r\n3 4624 17057 17056 5560 \r\n3 1295 17055 17057 5560 \r\n3 1355 17056 17055 5560 \r\n3 3481 16210 17058 5561 \r\n3 1209 15556 16210 5561 \r\n3 2465 17058 15556 5561 \r\n3 1136 9863 17059 5562 \r\n3 4933 13106 9863 5562 \r\n3 2066 17059 13106 5562 \r\n3 1011 11741 17060 5563 \r\n3 1765 6258 11741 5563 \r\n3 4960 17060 6258 5563 \r\n3 1161 13566 11241 5564 \r\n3 2165 9887 13566 5564 \r\n3 1092 11241 9887 5564 \r\n3 3251 12659 17061 5565 \r\n3 2375 13976 12659 5565 \r\n3 2234 17061 13976 5565 \r\n3 494 17063 17062 5566 \r\n3 2227 15635 17063 5566 \r\n3 4417 17062 15635 5566 \r\n3 1496 11960 6459 5567 \r\n3 3386 17064 11960 5567 \r\n3 635 6459 17064 5567 \r\n3 3270 17066 5568 5568 \r\n3 3610 17065 17066 5568 \r\n3 4308 5568 17065 5568 \r\n3 2457 17068 17067 5569 \r\n3 4347 10866 17068 5569 \r\n3 1303 17067 10866 5569 \r\n3 3852 17070 5849 5570 \r\n3 374 17069 17070 5570 \r\n3 2347 5849 17069 5570 \r\n3 4527 14788 10118 5571 \r\n3 2755 17071 14788 5571 \r\n3 4953 10118 17071 5571 \r\n3 1737 17073 17072 5572 \r\n3 4223 6430 17073 5572 \r\n3 550 17072 6430 5572 \r\n3 2492 15688 17074 5573 \r\n3 3458 16127 15688 5573 \r\n3 55 17074 16127 5573 \r\n3 4999 17075 6821 5574 \r\n3 3489 8657 17075 5574 \r\n3 3109 6821 8657 5574 \r\n3 2326 14950 13370 5575 \r\n3 2809 8894 14950 5575 \r\n3 3344 13370 8894 5575 \r\n3 3742 12764 17077 5576 \r\n3 2209 17076 12764 5576 \r\n3 4447 17077 17076 5576 \r\n3 242 14728 15805 5577 \r\n3 342 17078 14728 5577 \r\n3 4621 15805 17078 5577 \r\n3 2307 17080 8966 5578 \r\n3 3316 17079 17080 5578 \r\n3 2064 8966 17079 5578 \r\n3 4440 17082 17081 5579 \r\n3 4753 15144 17082 5579 \r\n3 380 17081 15144 5579 \r\n3 2861 11965 12738 5580 \r\n3 4107 13753 11965 5580 \r\n3 536 12738 13753 5580 \r\n3 1271 15677 17083 5581 \r\n3 3199 14083 15677 5581 \r\n3 937 17083 14083 5581 \r\n3 2708 8203 11490 5582 \r\n3 325 17084 8203 5582 \r\n3 4414 11490 17084 5582 \r\n3 534 17086 17085 5583 \r\n3 4333 7573 17086 5583 \r\n3 507 17085 7573 5583 \r\n3 2887 8885 9206 5584 \r\n3 4650 17087 8885 5584 \r\n3 781 9206 17087 5584 \r\n3 188 17088 13256 5585 \r\n3 1461 11856 17088 5585 \r\n3 1557 13256 11856 5585 \r\n3 3554 13215 17090 5586 \r\n3 1141 17089 13215 5586 \r\n3 1031 17090 17089 5586 \r\n3 953 15112 17092 5587 \r\n3 1938 17091 15112 5587 \r\n3 4493 17092 17091 5587 \r\n3 2236 17093 13067 5588 \r\n3 357 10746 17093 5588 \r\n3 3764 13067 10746 5588 \r\n3 2411 17095 17094 5589 \r\n3 2126 8122 17095 5589 \r\n3 2939 17094 8122 5589 \r\n3 4543 17097 17096 5590 \r\n3 345 9392 17097 5590 \r\n3 989 17096 9392 5590 \r\n3 2634 17100 17099 5591 \r\n3 2431 17098 17100 5591 \r\n3 360 17099 17098 5591 \r\n3 3398 16013 15098 5592 \r\n3 3033 17101 16013 5592 \r\n3 3652 15098 17101 5592 \r\n3 822 17104 17103 5593 \r\n3 2706 17102 17104 5593 \r\n3 483 17103 17102 5593 \r\n3 1682 14473 17106 5594 \r\n3 2438 17105 14473 5594 \r\n3 3845 17106 17105 5594 \r\n3 4996 17107 15259 5595 \r\n3 961 6934 17107 5595 \r\n3 205 15259 6934 5595 \r\n3 4253 9660 9731 5596 \r\n3 319 14421 9660 5596 \r\n3 2870 9731 14421 5596 \r\n3 2490 17109 9122 5597 \r\n3 4574 17108 17109 5597 \r\n3 2531 9122 17108 5597 \r\n3 706 17111 13187 5598 \r\n3 3335 17110 17111 5598 \r\n3 215 13187 17110 5598 \r\n3 2976 13926 12781 5599 \r\n3 415 16781 13926 5599 \r\n3 3050 12781 16781 5599 \r\n3 4475 17113 15881 5600 \r\n3 1508 17112 17113 5600 \r\n3 1575 15881 17112 5600 \r\n3 3356 14217 17114 5601 \r\n3 384 15851 14217 5601 \r\n3 3123 17114 15851 5601 \r\n3 3691 12643 9788 5602 \r\n3 2780 15036 12643 5602 \r\n3 4479 9788 15036 5602 \r\n3 3644 5829 17115 5603 \r\n3 3409 10014 5829 5603 \r\n3 4340 17115 10014 5603 \r\n3 2891 17116 8259 5604 \r\n3 1483 15737 17116 5604 \r\n3 1833 8259 15737 5604 \r\n3 1738 17118 7752 5605 \r\n3 2845 17117 17118 5605 \r\n3 2955 7752 17117 5605 \r\n3 4714 6635 17119 5606 \r\n3 2730 15982 6635 5606 \r\n3 3680 17119 15982 5606 \r\n3 2625 13253 16115 5607 \r\n3 661 14703 13253 5607 \r\n3 3228 16115 14703 5607 \r\n3 837 13950 17120 5608 \r\n3 2716 8205 13950 5608 \r\n3 1746 17120 8205 5608 \r\n3 2124 16399 17121 5609 \r\n3 3282 15869 16399 5609 \r\n3 4704 17121 15869 5609 \r\n3 4691 17123 17122 5610 \r\n3 2493 6705 17123 5610 \r\n3 1123 17122 6705 5610 \r\n3 3476 5654 7727 5611 \r\n3 4616 10021 5654 5611 \r\n3 2623 7727 10021 5611 \r\n3 2449 17124 15963 5612 \r\n3 2098 16727 17124 5612 \r\n3 3611 15963 16727 5612 \r\n3 3041 14507 17126 5613 \r\n3 3940 17125 14507 5613 \r\n3 2523 17126 17125 5613 \r\n3 3501 17127 5808 5614 \r\n3 593 5952 17127 5614 \r\n3 3731 5808 5952 5614 \r\n3 1022 14809 17128 5615 \r\n3 4603 16090 14809 5615 \r\n3 879 17128 16090 5615 \r\n3 2891 8258 8487 5616 \r\n3 588 15143 8258 5616 \r\n3 4753 8487 15143 5616 \r\n3 50 14196 17129 5617 \r\n3 4642 12864 14196 5617 \r\n3 4778 17129 12864 5617 \r\n3 3755 6973 17130 5618 \r\n3 4692 16076 6973 5618 \r\n3 839 17130 16076 5618 \r\n3 2323 11833 13944 5619 \r\n3 121 8805 11833 5619 \r\n3 1121 13944 8805 5619 \r\n3 4759 14220 17131 5620 \r\n3 753 16153 14220 5620 \r\n3 2539 17131 16153 5620 \r\n3 2606 17134 17133 5621 \r\n3 4622 17132 17134 5621 \r\n3 565 17133 17132 5621 \r\n3 2161 17135 15885 5622 \r\n3 2694 9423 17135 5622 \r\n3 733 15885 9423 5622 \r\n3 1996 11380 14119 5623 \r\n3 3132 17136 11380 5623 \r\n3 973 14119 17136 5623 \r\n3 2406 15453 17054 5624 \r\n3 2950 15530 15453 5624 \r\n3 2461 17054 15530 5624 \r\n3 4716 17138 17137 5625 \r\n3 3151 11546 17138 5625 \r\n3 3009 17137 11546 5625 \r\n3 3560 17141 17140 5626 \r\n3 2260 17139 17141 5626 \r\n3 959 17140 17139 5626 \r\n3 1107 11915 8339 5627 \r\n3 462 17142 11915 5627 \r\n3 1787 8339 17142 5627 \r\n3 805 17145 17144 5628 \r\n3 3057 17143 17145 5628 \r\n3 2718 17144 17143 5628 \r\n3 2863 9200 16170 5629 \r\n3 3843 17146 9200 5629 \r\n3 2127 16170 17146 5629 \r\n3 1828 17147 10932 5630 \r\n3 4398 16949 17147 5630 \r\n3 2285 10932 16949 5630 \r\n3 3292 17149 17148 5631 \r\n3 1658 12077 17149 5631 \r\n3 23 17148 12077 5631 \r\n3 3719 5165 7240 5632 \r\n3 1025 17150 5165 5632 \r\n3 4165 7240 17150 5632 \r\n3 4883 17152 17151 5633 \r\n3 3192 16721 17152 5633 \r\n3 1782 17151 16721 5633 \r\n3 4157 17153 13036 5634 \r\n3 247 5038 17153 5634 \r\n3 313 13036 5038 5634 \r\n3 3333 13425 15810 5635 \r\n3 361 14431 13425 5635 \r\n3 453 15810 14431 5635 \r\n3 3792 17155 17154 5636 \r\n3 2378 12092 17155 5636 \r\n3 900 17154 12092 5636 \r\n3 3700 17157 8255 5637 \r\n3 2385 17156 17157 5637 \r\n3 4217 8255 17156 5637 \r\n3 2169 8665 15388 5638 \r\n3 2013 6456 8665 5638 \r\n3 2284 15388 6456 5638 \r\n3 700 13533 16228 5639 \r\n3 3060 15463 13533 5639 \r\n3 3326 16228 15463 5639 \r\n3 1597 17158 10439 5640 \r\n3 2179 10790 17158 5640 \r\n3 4149 10439 10790 5640 \r\n3 1513 11132 9136 5641 \r\n3 858 15709 11132 5641 \r\n3 2386 9136 15709 5641 \r\n3 1384 17160 12288 5642 \r\n3 2868 17159 17160 5642 \r\n3 4858 12288 17159 5642 \r\n3 4949 5883 9015 5643 \r\n3 787 9033 5883 5643 \r\n3 3302 9015 9033 5643 \r\n3 215 17110 6371 5644 \r\n3 3335 17161 17110 5644 \r\n3 4512 6371 17161 5644 \r\n3 1620 16037 14455 5645 \r\n3 4784 17162 16037 5645 \r\n3 4057 14455 17162 5645 \r\n3 2811 15969 17163 5646 \r\n3 4467 10135 15969 5646 \r\n3 372 17163 10135 5646 \r\n3 2179 17166 17165 5647 \r\n3 1178 17164 17166 5647 \r\n3 1281 17165 17164 5647 \r\n3 890 11550 17167 5648 \r\n3 1455 6081 11550 5648 \r\n3 1323 17167 6081 5648 \r\n3 522 12528 17168 5649 \r\n3 571 12485 12528 5649 \r\n3 3085 17168 12485 5649 \r\n3 3589 17169 12681 5650 \r\n3 766 12933 17169 5650 \r\n3 1112 12681 12933 5650 \r\n3 2603 16959 17170 5651 \r\n3 3745 11259 16959 5651 \r\n3 2232 17170 11259 5651 \r\n3 4969 14199 10635 5652 \r\n3 1598 14562 14199 5652 \r\n3 1573 10635 14562 5652 \r\n3 1249 17172 17171 5653 \r\n3 117 15457 17172 5653 \r\n3 4550 17171 15457 5653 \r\n3 3078 12540 10017 5654 \r\n3 1665 6817 12540 5654 \r\n3 2282 10017 6817 5654 \r\n3 4759 13788 14221 5655 \r\n3 3999 17173 13788 5655 \r\n3 2750 14221 17173 5655 \r\n3 1619 15293 17174 5656 \r\n3 4867 16557 15293 5656 \r\n3 1667 17174 16557 5656 \r\n3 2209 12554 17076 5657 \r\n3 486 5642 12554 5657 \r\n3 4447 17076 5642 5657 \r\n3 368 16381 17175 5658 \r\n3 4884 13060 16381 5658 \r\n3 1127 17175 13060 5658 \r\n3 3858 17177 17176 5659 \r\n3 903 13142 17177 5659 \r\n3 3608 17176 13142 5659 \r\n3 3435 15807 11718 5660 \r\n3 1018 14222 15807 5660 \r\n3 2190 11718 14222 5660 \r\n3 400 17180 17179 5661 \r\n3 676 17178 17180 5661 \r\n3 1895 17179 17178 5661 \r\n3 428 11823 15729 5662 \r\n3 1709 17181 11823 5662 \r\n3 2701 15729 17181 5662 \r\n3 4864 17183 14283 5663 \r\n3 3201 17182 17183 5663 \r\n3 3120 14283 17182 5663 \r\n3 1479 15967 17185 5664 \r\n3 2425 17184 15967 5664 \r\n3 115 17185 17184 5664 \r\n3 133 12955 17187 5665 \r\n3 3833 17186 12955 5665 \r\n3 3905 17187 17186 5665 \r\n3 3251 17061 17188 5666 \r\n3 2234 14836 17061 5666 \r\n3 1791 17188 14836 5666 \r\n3 1020 15591 10532 5667 \r\n3 1528 15821 15591 5667 \r\n3 4529 10532 15821 5667 \r\n3 2161 11150 16157 5668 \r\n3 2730 17189 11150 5668 \r\n3 4480 16157 17189 5668 \r\n3 1530 17191 5346 5669 \r\n3 1955 17190 17191 5669 \r\n3 200 5346 17190 5669 \r\n3 1425 17193 12753 5670 \r\n3 195 17192 17193 5670 \r\n3 1228 12753 17192 5670 \r\n3 2218 9277 13465 5671 \r\n3 3204 17194 9277 5671 \r\n3 1061 13465 17194 5671 \r\n3 2425 15968 17196 5672 \r\n3 4277 17195 15968 5672 \r\n3 1660 17196 17195 5672 \r\n3 926 16731 17198 5673 \r\n3 3118 17197 16731 5673 \r\n3 2585 17198 17197 5673 \r\n3 4777 17201 17200 5674 \r\n3 1464 17199 17201 5674 \r\n3 2918 17200 17199 5674 \r\n3 3212 17202 9373 5675 \r\n3 1167 9905 17202 5675 \r\n3 3177 9373 9905 5675 \r\n3 2812 6806 7679 5676 \r\n3 1430 11242 6806 5676 \r\n3 1092 7679 11242 5676 \r\n3 3424 17204 9695 5677 \r\n3 2151 17203 17204 5677 \r\n3 4260 9695 17203 5677 \r\n3 3528 17206 13833 5678 \r\n3 2809 17205 17206 5678 \r\n3 147 13833 17205 5678 \r\n3 1415 17209 17208 5679 \r\n3 3776 17207 17209 5679 \r\n3 2833 17208 17207 5679 \r\n3 1728 17211 10856 5680 \r\n3 494 17210 17211 5680 \r\n3 1224 10856 17210 5680 \r\n3 3403 6294 14784 5681 \r\n3 3903 9407 6294 5681 \r\n3 519 14784 9407 5681 \r\n3 4559 17213 12584 5682 \r\n3 133 17212 17213 5682 \r\n3 2660 12584 17212 5682 \r\n3 485 13962 15945 5683 \r\n3 2945 13337 13962 5683 \r\n3 483 15945 13337 5683 \r\n3 1737 17072 17214 5684 \r\n3 550 10816 17072 5684 \r\n3 4959 17214 10816 5684 \r\n3 4508 8239 16262 5685 \r\n3 3149 17215 8239 5685 \r\n3 4072 16262 17215 5685 \r\n3 3205 15959 13584 5686 \r\n3 2518 17216 15959 5686 \r\n3 1127 13584 17216 5686 \r\n3 1168 16999 13576 5687 \r\n3 2188 5862 16999 5687 \r\n3 3468 13576 5862 5687 \r\n3 4922 17217 16462 5688 \r\n3 2800 9427 17217 5688 \r\n3 3410 16462 9427 5688 \r\n3 2036 17218 15716 5689 \r\n3 4420 14211 17218 5689 \r\n3 4218 15716 14211 5689 \r\n3 3411 9031 17220 5690 \r\n3 1179 17219 9031 5690 \r\n3 4212 17220 17219 5690 \r\n3 2711 10165 12935 5691 \r\n3 3704 13390 10165 5691 \r\n3 379 12935 13390 5691 \r\n3 2230 17222 17221 5692 \r\n3 1594 9324 17222 5692 \r\n3 1192 17221 9324 5692 \r\n3 4503 17223 14274 5693 \r\n3 4861 5456 17223 5693 \r\n3 3037 14274 5456 5693 \r\n3 3846 17225 16622 5694 \r\n3 4236 17224 17225 5694 \r\n3 2501 16622 17224 5694 \r\n3 3037 17227 14275 5695 \r\n3 2346 17226 17227 5695 \r\n3 1861 14275 17226 5695 \r\n3 2756 17229 13939 5696 \r\n3 720 17228 17229 5696 \r\n3 2758 13939 17228 5696 \r\n3 4321 12921 17231 5697 \r\n3 1055 17230 12921 5697 \r\n3 81 17231 17230 5697 \r\n3 40 15931 6722 5698 \r\n3 5 17232 15931 5698 \r\n3 570 6722 17232 5698 \r\n3 467 11789 17234 5699 \r\n3 3588 17233 11789 5699 \r\n3 892 17234 17233 5699 \r\n3 48 17236 13262 5700 \r\n3 4308 17235 17236 5700 \r\n3 1686 13262 17235 5700 \r\n3 111 5310 10640 5701 \r\n3 1951 17237 5310 5701 \r\n3 3297 10640 17237 5701 \r\n3 2952 16531 17239 5702 \r\n3 179 17238 16531 5702 \r\n3 935 17239 17238 5702 \r\n3 1756 12323 12158 5703 \r\n3 282 17240 12323 5703 \r\n3 1805 12158 17240 5703 \r\n3 1176 9386 17241 5704 \r\n3 1227 6678 9386 5704 \r\n3 1084 17241 6678 5704 \r\n3 1895 9257 6318 5705 \r\n3 1099 17242 9257 5705 \r\n3 2488 6318 17242 5705 \r\n3 956 17245 17244 5706 \r\n3 4720 17243 17245 5706 \r\n3 2626 17244 17243 5706 \r\n3 3810 17247 17246 5707 \r\n3 156 6921 17247 5707 \r\n3 3081 17246 6921 5707 \r\n3 4372 5447 7545 5708 \r\n3 2452 17248 5447 5708 \r\n3 2371 7545 17248 5708 \r\n3 3612 17250 14715 5709 \r\n3 4486 17249 17250 5709 \r\n3 3990 14715 17249 5709 \r\n3 1184 13328 13870 5710 \r\n3 1816 8398 13328 5710 \r\n3 3454 13870 8398 5710 \r\n3 4691 17252 17251 5711 \r\n3 1594 17042 17252 5711 \r\n3 1390 17251 17042 5711 \r\n3 298 10300 16681 5712 \r\n3 2844 12119 10300 5712 \r\n3 1285 16681 12119 5712 \r\n3 3483 5774 17254 5713 \r\n3 2499 17253 5774 5713 \r\n3 2172 17254 17253 5713 \r\n3 982 17256 15865 5714 \r\n3 2659 17255 17256 5714 \r\n3 2744 15865 17255 5714 \r\n3 4011 17259 17258 5715 \r\n3 1958 17257 17259 5715 \r\n3 1591 17258 17257 5715 \r\n3 391 17260 16244 5716 \r\n3 2905 10057 17260 5716 \r\n3 1065 16244 10057 5716 \r\n3 2564 11212 16488 5717 \r\n3 4342 9947 11212 5717 \r\n3 4158 16488 9947 5717 \r\n3 3911 13400 13472 5718 \r\n3 1599 11924 13400 5718 \r\n3 634 13472 11924 5718 \r\n3 2630 15130 17261 5719 \r\n3 3351 15981 15130 5719 \r\n3 357 17261 15981 5719 \r\n3 3904 9682 14734 5720 \r\n3 4576 14214 9682 5720 \r\n3 2452 14734 14214 5720 \r\n3 3158 11192 8560 5721 \r\n3 279 17262 11192 5721 \r\n3 3680 8560 17262 5721 \r\n3 4639 5903 11786 5722 \r\n3 12 17263 5903 5722 \r\n3 1402 11786 17263 5722 \r\n3 372 10552 17163 5723 \r\n3 2268 17264 10552 5723 \r\n3 2811 17163 17264 5723 \r\n3 4963 17265 6699 5724 \r\n3 3289 7739 17265 5724 \r\n3 1410 6699 7739 5724 \r\n3 3184 17267 15038 5725 \r\n3 1315 17266 17267 5725 \r\n3 4155 15038 17266 5725 \r\n3 270 14311 14691 5726 \r\n3 434 11796 14311 5726 \r\n3 654 14691 11796 5726 \r\n3 4363 13910 9928 5727 \r\n3 1891 14754 13910 5727 \r\n3 4727 9928 14754 5727 \r\n3 1323 17269 17268 5728 \r\n3 4015 14190 17269 5728 \r\n3 965 17268 14190 5728 \r\n3 4613 12074 8351 5729 \r\n3 2048 17270 12074 5729 \r\n3 4315 8351 17270 5729 \r\n3 2784 17271 6791 5730 \r\n3 4116 8066 17271 5730 \r\n3 2673 6791 8066 5730 \r\n3 1291 17273 11015 5731 \r\n3 1799 17272 17273 5731 \r\n3 1052 11015 17272 5731 \r\n3 4287 6166 17275 5732 \r\n3 815 17274 6166 5732 \r\n3 2312 17275 17274 5732 \r\n3 448 10705 17276 5733 \r\n3 3733 13741 10705 5733 \r\n3 1567 17276 13741 5733 \r\n3 1874 12219 17278 5734 \r\n3 770 17277 12219 5734 \r\n3 1698 17278 17277 5734 \r\n3 4853 16230 17279 5735 \r\n3 1817 15611 16230 5735 \r\n3 984 17279 15611 5735 \r\n3 4618 13564 14651 5736 \r\n3 4178 16805 13564 5736 \r\n3 1583 14651 16805 5736 \r\n3 3646 15257 17280 5737 \r\n3 436 8738 15257 5737 \r\n3 2484 17280 8738 5737 \r\n3 3710 6701 17282 5738 \r\n3 1503 17281 6701 5738 \r\n3 47 17282 17281 5738 \r\n3 1333 17284 17283 5739 \r\n3 3912 5173 17284 5739 \r\n3 305 17283 5173 5739 \r\n3 3876 17286 17285 5740 \r\n3 4500 6845 17286 5740 \r\n3 2176 17285 6845 5740 \r\n3 3360 16332 17287 5741 \r\n3 1407 6514 16332 5741 \r\n3 1050 17287 6514 5741 \r\n3 811 17288 16249 5742 \r\n3 2738 13082 17288 5742 \r\n3 275 16249 13082 5742 \r\n3 3230 17289 14935 5743 \r\n3 3477 12988 17289 5743 \r\n3 4914 14935 12988 5743 \r\n3 2720 16425 17290 5744 \r\n3 4475 15880 16425 5744 \r\n3 4543 17290 15880 5744 \r\n3 1763 17292 12697 5745 \r\n3 2714 17291 17292 5745 \r\n3 958 12697 17291 5745 \r\n3 3771 5830 6011 5746 \r\n3 3644 17293 5830 5746 \r\n3 3297 6011 17293 5746 \r\n3 4236 17225 9653 5747 \r\n3 3846 12860 17225 5747 \r\n3 4780 9653 12860 5747 \r\n3 2464 10489 17295 5748 \r\n3 402 17294 10489 5748 \r\n3 1679 17295 17294 5748 \r\n3 4758 11855 17297 5749 \r\n3 537 17296 11855 5749 \r\n3 3662 17297 17296 5749 \r\n3 375 17299 7270 5750 \r\n3 4076 17298 17299 5750 \r\n3 2360 7270 17298 5750 \r\n3 2658 14406 17300 5751 \r\n3 3097 9259 14406 5751 \r\n3 2944 17300 9259 5751 \r\n3 987 17301 10496 5752 \r\n3 2220 13958 17301 5752 \r\n3 640 10496 13958 5752 \r\n3 340 17303 17302 5753 \r\n3 2649 14530 17303 5753 \r\n3 472 17302 14530 5753 \r\n3 101 6142 10004 5754 \r\n3 4577 16859 6142 5754 \r\n3 2370 10004 16859 5754 \r\n3 4103 7709 16021 5755 \r\n3 1362 8438 7709 5755 \r\n3 3590 16021 8438 5755 \r\n3 3447 5450 15355 5756 \r\n3 1504 10548 5450 5756 \r\n3 4118 15355 10548 5756 \r\n3 2423 8349 15621 5757 \r\n3 1346 7011 8349 5757 \r\n3 3786 15621 7011 5757 \r\n3 987 10495 14227 5758 \r\n3 3156 12264 10495 5758 \r\n3 2901 14227 12264 5758 \r\n3 946 17305 15203 5759 \r\n3 199 17304 17305 5759 \r\n3 1200 15203 17304 5759 \r\n3 95 17306 7987 5760 \r\n3 181 14592 17306 5760 \r\n3 3317 7987 14592 5760 \r\n3 2447 13485 14801 5761 \r\n3 523 17307 13485 5761 \r\n3 4790 14801 17307 5761 \r\n3 386 17309 12301 5762 \r\n3 4281 17308 17309 5762 \r\n3 3218 12301 17308 5762 \r\n3 3664 11624 17311 5763 \r\n3 1165 17310 11624 5763 \r\n3 4870 17311 17310 5763 \r\n3 3760 17314 17313 5764 \r\n3 4927 17312 17314 5764 \r\n3 2235 17313 17312 5764 \r\n3 275 13081 17315 5765 \r\n3 1799 17273 13081 5765 \r\n3 1291 17315 17273 5765 \r\n3 558 17316 10534 5766 \r\n3 2686 13519 17316 5766 \r\n3 3169 10534 13519 5766 \r\n3 1191 17319 17318 5767 \r\n3 2046 17317 17319 5767 \r\n3 1008 17318 17317 5767 \r\n3 4204 16705 16966 5768 \r\n3 1026 11292 16705 5768 \r\n3 1883 16966 11292 5768 \r\n3 3635 16070 17320 5769 \r\n3 3806 16996 16070 5769 \r\n3 872 17320 16996 5769 \r\n3 4684 17322 7730 5770 \r\n3 2646 17321 17322 5770 \r\n3 2208 7730 17321 5770 \r\n3 682 9294 17324 5771 \r\n3 3670 17323 9294 5771 \r\n3 2830 17324 17323 5771 \r\n3 82 13196 13237 5772 \r\n3 804 17325 13196 5772 \r\n3 2103 13237 17325 5772 \r\n3 767 8397 17326 5773 \r\n3 1816 14939 8397 5773 \r\n3 2914 17326 14939 5773 \r\n3 4695 17327 7632 5774 \r\n3 806 10082 17327 5774 \r\n3 1340 7632 10082 5774 \r\n3 4882 12498 17328 5775 \r\n3 848 5336 12498 5775 \r\n3 3839 17328 5336 5775 \r\n3 812 17330 13378 5776 \r\n3 2970 17329 17330 5776 \r\n3 3334 13378 17329 5776 \r\n3 3056 17333 17332 5777 \r\n3 1892 17331 17333 5777 \r\n3 4337 17332 17331 5777 \r\n3 4021 13138 17334 5778 \r\n3 1859 9028 13138 5778 \r\n3 1685 17334 9028 5778 \r\n3 4669 16471 16614 5779 \r\n3 1844 9936 16471 5779 \r\n3 3762 16614 9936 5779 \r\n3 4201 17336 17335 5780 \r\n3 3247 10858 17336 5780 \r\n3 4233 17335 10858 5780 \r\n3 830 13538 6660 5781 \r\n3 3298 13750 13538 5781 \r\n3 1438 6660 13750 5781 \r\n3 1588 10597 17337 5782 \r\n3 193 16135 10597 5782 \r\n3 4131 17337 16135 5782 \r\n3 4017 17340 17339 5783 \r\n3 229 17338 17340 5783 \r\n3 4573 17339 17338 5783 \r\n3 1494 17341 11970 5784 \r\n3 3270 11507 17341 5784 \r\n3 2429 11970 11507 5784 \r\n3 179 16530 17342 5785 \r\n3 3437 13398 16530 5785 \r\n3 3911 17342 13398 5785 \r\n3 470 15451 17008 5786 \r\n3 3690 10679 15451 5786 \r\n3 104 17008 10679 5786 \r\n3 444 17343 5018 5787 \r\n3 2944 6204 17343 5787 \r\n3 889 5018 6204 5787 \r\n3 4562 12177 11562 5788 \r\n3 2585 17197 12177 5788 \r\n3 3118 11562 17197 5788 \r\n3 1344 16690 5381 5789 \r\n3 4792 17344 16690 5789 \r\n3 4760 5381 17344 5789 \r\n3 3931 11931 16411 5790 \r\n3 1275 17345 11931 5790 \r\n3 4981 16411 17345 5790 \r\n3 2141 16612 8852 5791 \r\n3 4054 15892 16612 5791 \r\n3 4161 8852 15892 5791 \r\n3 979 10406 17346 5792 \r\n3 2630 15117 10406 5792 \r\n3 69 17346 15117 5792 \r\n3 4749 7269 17348 5793 \r\n3 3776 17347 7269 5793 \r\n3 3086 17348 17347 5793 \r\n3 2519 16765 17350 5794 \r\n3 1566 17349 16765 5794 \r\n3 271 17350 17349 5794 \r\n3 545 17351 10163 5795 \r\n3 4259 12322 17351 5795 \r\n3 2698 10163 12322 5795 \r\n3 1726 7957 17352 5796 \r\n3 367 10474 7957 5796 \r\n3 895 17352 10474 5796 \r\n3 3105 17354 13878 5797 \r\n3 419 17353 17354 5797 \r\n3 287 13878 17353 5797 \r\n3 241 17356 12745 5798 \r\n3 3352 17355 17356 5798 \r\n3 2164 12745 17355 5798 \r\n3 2859 17357 7394 5799 \r\n3 440 14242 17357 5799 \r\n3 2789 7394 14242 5799 \r\n3 250 7148 17359 5800 \r\n3 2254 17358 7148 5800 \r\n3 4894 17359 17358 5800 \r\n3 194 17361 17360 5801 \r\n3 4578 10884 17361 5801 \r\n3 846 17360 10884 5801 \r\n3 3027 9786 14699 5802 \r\n3 1111 13656 9786 5802 \r\n3 249 14699 13656 5802 \r\n3 278 9471 13790 5803 \r\n3 4797 17362 9471 5803 \r\n3 3798 13790 17362 5803 \r\n3 1260 17363 12032 5804 \r\n3 768 17022 17363 5804 \r\n3 3263 12032 17022 5804 \r\n3 88 7074 6900 5805 \r\n3 4045 12329 7074 5805 \r\n3 3754 6900 12329 5805 \r\n3 243 11598 15000 5806 \r\n3 3175 12203 11598 5806 \r\n3 1174 15000 12203 5806 \r\n3 2503 6893 13670 5807 \r\n3 3217 17364 6893 5807 \r\n3 2972 13670 17364 5807 \r\n3 1103 15051 6669 5808 \r\n3 4848 13724 15051 5808 \r\n3 1208 6669 13724 5808 \r\n3 4248 8860 17047 5809 \r\n3 2725 8740 8860 5809 \r\n3 73 17047 8740 5809 \r\n3 2002 10121 17365 5810 \r\n3 588 7511 10121 5810 \r\n3 2900 17365 7511 5810 \r\n3 4289 16751 17367 5811 \r\n3 1855 17366 16751 5811 \r\n3 1206 17367 17366 5811 \r\n3 4739 16019 7829 5812 \r\n3 3590 17368 16019 5812 \r\n3 3219 7829 17368 5812 \r\n3 139 15057 17369 5813 \r\n3 1332 8096 15057 5813 \r\n3 3223 17369 8096 5813 \r\n3 4187 13879 15962 5814 \r\n3 287 17370 13879 5814 \r\n3 2449 15962 17370 5814 \r\n3 550 16361 5002 5815 \r\n3 4304 15441 16361 5815 \r\n3 2664 5002 15441 5815 \r\n3 4819 17372 12438 5816 \r\n3 3353 17371 17372 5816 \r\n3 4499 12438 17371 5816 \r\n3 4927 17374 17312 5817 \r\n3 4621 17373 17374 5817 \r\n3 2235 17312 17373 5817 \r\n3 2965 13855 17376 5818 \r\n3 233 17375 13855 5818 \r\n3 564 17376 17375 5818 \r\n3 1729 17377 13001 5819 \r\n3 3978 13841 17377 5819 \r\n3 3985 13001 13841 5819 \r\n3 3139 10289 17379 5820 \r\n3 1928 17378 10289 5820 \r\n3 2920 17379 17378 5820 \r\n3 4572 10879 14073 5821 \r\n3 4696 16900 10879 5821 \r\n3 1406 14073 16900 5821 \r\n3 4580 17381 10842 5822 \r\n3 4259 17380 17381 5822 \r\n3 3185 10842 17380 5822 \r\n3 4793 10661 9117 5823 \r\n3 3932 17382 10661 5823 \r\n3 2248 9117 17382 5823 \r\n3 4655 17385 17384 5824 \r\n3 2263 17383 17385 5824 \r\n3 4305 17384 17383 5824 \r\n3 4988 8538 17386 5825 \r\n3 1581 8530 8538 5825 \r\n3 2899 17386 8530 5825 \r\n3 792 12806 16807 5826 \r\n3 2402 14099 12806 5826 \r\n3 870 16807 14099 5826 \r\n3 3347 7980 14552 5827 \r\n3 1066 17387 7980 5827 \r\n3 4310 14552 17387 5827 \r\n3 821 16714 17388 5828 \r\n3 1187 5160 16714 5828 \r\n3 3116 17388 5160 5828 \r\n3 3732 15346 8901 5829 \r\n3 4654 17389 15346 5829 \r\n3 1194 8901 17389 5829 \r\n3 1829 10523 10371 5830 \r\n3 1551 17390 10523 5830 \r\n3 2415 10371 17390 5830 \r\n3 784 6101 17392 5831 \r\n3 1808 17391 6101 5831 \r\n3 4408 17392 17391 5831 \r\n3 482 16799 17394 5832 \r\n3 2472 17393 16799 5832 \r\n3 4128 17394 17393 5832 \r\n3 3751 17396 15465 5833 \r\n3 248 17395 17396 5833 \r\n3 3577 15465 17395 5833 \r\n3 2793 17397 7834 5834 \r\n3 556 8071 17397 5834 \r\n3 3866 7834 8071 5834 \r\n3 2885 8233 13795 5835 \r\n3 4153 16986 8233 5835 \r\n3 291 13795 16986 5835 \r\n3 2390 15539 14176 5836 \r\n3 2650 15267 15539 5836 \r\n3 1412 14176 15267 5836 \r\n3 4532 17398 16408 5837 \r\n3 1294 16248 17398 5837 \r\n3 1498 16408 16248 5837 \r\n3 3416 17399 13612 5838 \r\n3 3673 10994 17399 5838 \r\n3 957 13612 10994 5838 \r\n3 1576 17401 12505 5839 \r\n3 3017 17400 17401 5839 \r\n3 2345 12505 17400 5839 \r\n3 1980 11038 14089 5840 \r\n3 1276 13269 11038 5840 \r\n3 2527 14089 13269 5840 \r\n3 2093 5627 17403 5841 \r\n3 3052 17402 5627 5841 \r\n3 3062 17403 17402 5841 \r\n3 3807 16324 17404 5842 \r\n3 2631 16571 16324 5842 \r\n3 2935 17404 16571 5842 \r\n3 1875 13873 17405 5843 \r\n3 4410 12801 13873 5843 \r\n3 2388 17405 12801 5843 \r\n3 1787 17142 15938 5844 \r\n3 462 6706 17142 5844 \r\n3 4725 15938 6706 5844 \r\n3 2789 14244 17407 5845 \r\n3 2523 17406 14244 5845 \r\n3 3194 17407 17406 5845 \r\n3 4319 12160 13756 5846 \r\n3 2108 17408 12160 5846 \r\n3 4799 13756 17408 5846 \r\n3 1469 17409 12494 5847 \r\n3 1700 6616 17409 5847 \r\n3 939 12494 6616 5847 \r\n3 858 15863 7768 5848 \r\n3 2477 8621 15863 5848 \r\n3 1351 7768 8621 5848 \r\n3 2783 17411 8985 5849 \r\n3 690 17410 17411 5849 \r\n3 4288 8985 17410 5849 \r\n3 945 15826 17412 5850 \r\n3 138 9179 15826 5850 \r\n3 4205 17412 9179 5850 \r\n3 1898 17413 16089 5851 \r\n3 2134 9519 17413 5851 \r\n3 879 16089 9519 5851 \r\n3 615 6526 17414 5852 \r\n3 4311 11520 6526 5852 \r\n3 516 17414 11520 5852 \r\n3 1914 12902 17415 5853 \r\n3 4890 16897 12902 5853 \r\n3 2434 17415 16897 5853 \r\n3 3250 6836 17416 5854 \r\n3 3471 10647 6836 5854 \r\n3 220 17416 10647 5854 \r\n3 2809 17417 8895 5855 \r\n3 4001 16553 17417 5855 \r\n3 4586 8895 16553 5855 \r\n3 319 11110 14792 5856 \r\n3 4839 15175 11110 5856 \r\n3 516 14792 15175 5856 \r\n3 4786 17418 16985 5857 \r\n3 2535 16711 17418 5857 \r\n3 291 16985 16711 5857 \r\n3 3048 16243 17419 5858 \r\n3 34 10900 16243 5858 \r\n3 4903 17419 10900 5858 \r\n3 19 16644 5895 5859 \r\n3 3524 13175 16644 5859 \r\n3 3274 5895 13175 5859 \r\n3 3023 10256 16710 5860 \r\n3 1550 13796 10256 5860 \r\n3 291 16710 13796 5860 \r\n3 773 10048 17421 5861 \r\n3 201 17420 10048 5861 \r\n3 2400 17421 17420 5861 \r\n3 1729 16223 17422 5862 \r\n3 1428 12638 16223 5862 \r\n3 4027 17422 12638 5862 \r\n3 638 10466 5841 5863 \r\n3 86 17423 10466 5863 \r\n3 3750 5841 17423 5863 \r\n3 1475 17425 17424 5864 \r\n3 2449 17370 17425 5864 \r\n3 287 17424 17370 5864 \r\n3 528 17427 16774 5865 \r\n3 4911 17426 17427 5865 \r\n3 2913 16774 17426 5865 \r\n3 3352 6632 17355 5866 \r\n3 1452 11086 6632 5866 \r\n3 2164 17355 11086 5866 \r\n3 4923 17429 17428 5867 \r\n3 1316 5917 17429 5867 \r\n3 13 17428 5917 5867 \r\n3 3791 17431 17430 5868 \r\n3 1354 9691 17431 5868 \r\n3 3723 17430 9691 5868 \r\n3 2465 15558 12214 5869 \r\n3 2305 17432 15558 5869 \r\n3 1342 12214 17432 5869 \r\n3 1627 17433 13549 5870 \r\n3 4505 12904 17433 5870 \r\n3 3440 13549 12904 5870 \r\n3 775 12391 16833 5871 \r\n3 3046 15948 12391 5871 \r\n3 4213 16833 15948 5871 \r\n3 4563 9007 17434 5872 \r\n3 1569 11229 9007 5872 \r\n3 3119 17434 11229 5872 \r\n3 3633 15208 16114 5873 \r\n3 1886 17435 15208 5873 \r\n3 1613 16114 17435 5873 \r\n3 4163 13117 17436 5874 \r\n3 3552 7325 13117 5874 \r\n3 2557 17436 7325 5874 \r\n3 3202 17437 11599 5875 \r\n3 2346 17227 17437 5875 \r\n3 3037 11599 17227 5875 \r\n3 3479 17438 16403 5876 \r\n3 3745 16958 17438 5876 \r\n3 1712 16403 16958 5876 \r\n3 205 17440 9364 5877 \r\n3 4860 17439 17440 5877 \r\n3 18 9364 17439 5877 \r\n3 2367 17442 17441 5878 \r\n3 4099 6214 17442 5878 \r\n3 110 17441 6214 5878 \r\n3 1987 7939 17444 5879 \r\n3 4433 17443 7939 5879 \r\n3 3999 17444 17443 5879 \r\n3 2793 13087 8454 5880 \r\n3 3429 17445 13087 5880 \r\n3 3516 8454 17445 5880 \r\n3 4569 17447 16389 5881 \r\n3 1384 17446 17447 5881 \r\n3 1888 16389 17446 5881 \r\n3 1390 17450 17449 5882 \r\n3 580 17448 17450 5882 \r\n3 3873 17449 17448 5882 \r\n3 1310 16145 17452 5883 \r\n3 4060 17451 16145 5883 \r\n3 1229 17452 17451 5883 \r\n3 930 16830 17453 5884 \r\n3 731 8795 16830 5884 \r\n3 1977 17453 8795 5884 \r\n3 1918 17454 9445 5885 \r\n3 2221 15142 17454 5885 \r\n3 4571 9445 15142 5885 \r\n3 1429 15811 17455 5886 \r\n3 1601 16675 15811 5886 \r\n3 4181 17455 16675 5886 \r\n3 1199 17456 9012 5887 \r\n3 4703 16165 17456 5887 \r\n3 5 9012 16165 5887 \r\n3 2601 11484 17457 5888 \r\n3 10 12482 11484 5888 \r\n3 3470 17457 12482 5888 \r\n3 629 7864 17459 5889 \r\n3 4928 17458 7864 5889 \r\n3 273 17459 17458 5889 \r\n3 229 9512 17338 5890 \r\n3 1420 17460 9512 5890 \r\n3 4573 17338 17460 5890 \r\n3 1895 17462 5394 5891 \r\n3 2682 17461 17462 5891 \r\n3 4473 5394 17461 5891 \r\n3 378 16684 17464 5892 \r\n3 4066 17463 16684 5892 \r\n3 3841 17464 17463 5892 \r\n3 3044 17465 16347 5893 \r\n3 4427 15911 17465 5893 \r\n3 1639 16347 15911 5893 \r\n3 1973 17467 17466 5894 \r\n3 141 14776 17467 5894 \r\n3 565 17466 14776 5894 \r\n3 1658 17469 17468 5895 \r\n3 2245 5270 17469 5895 \r\n3 1438 17468 5270 5895 \r\n3 2695 11594 12296 5896 \r\n3 119 17470 11594 5896 \r\n3 852 12296 17470 5896 \r\n3 2618 17472 13651 5897 \r\n3 1840 17471 17472 5897 \r\n3 658 13651 17471 5897 \r\n3 3117 17473 11462 5898 \r\n3 3671 15690 17473 5898 \r\n3 2649 11462 15690 5898 \r\n3 2815 17475 14325 5899 \r\n3 4057 17474 17475 5899 \r\n3 277 14325 17474 5899 \r\n3 2221 17454 15902 5900 \r\n3 1918 5072 17454 5900 \r\n3 3893 15902 5072 5900 \r\n3 983 12020 16303 5901 \r\n3 236 10576 12020 5901 \r\n3 4956 16303 10576 5901 \r\n3 123 17477 17476 5902 \r\n3 587 13002 17477 5902 \r\n3 3985 17476 13002 5902 \r\n3 2837 5465 17479 5903 \r\n3 1257 17478 5465 5903 \r\n3 766 17479 17478 5903 \r\n3 3522 17481 13195 5904 \r\n3 2263 17480 17481 5904 \r\n3 804 13195 17480 5904 \r\n3 4282 17484 17483 5905 \r\n3 3074 17482 17484 5905 \r\n3 2473 17483 17482 5905 \r\n3 4960 17485 17060 5906 \r\n3 3950 13179 17485 5906 \r\n3 1011 17060 13179 5906 \r\n3 4691 17251 10049 5907 \r\n3 1390 17449 17251 5907 \r\n3 3873 10049 17449 5907 \r\n3 4365 17487 17486 5908 \r\n3 746 10904 17487 5908 \r\n3 4228 17486 10904 5908 \r\n3 615 17414 11008 5909 \r\n3 516 15176 17414 5909 \r\n3 379 11008 15176 5909 \r\n3 3933 17489 17488 5910 \r\n3 3236 14428 17489 5910 \r\n3 2193 17488 14428 5910 \r\n3 2811 17491 10697 5911 \r\n3 582 17490 17491 5911 \r\n3 4023 10697 17490 5911 \r\n3 1972 17492 13183 5912 \r\n3 2586 11584 17492 5912 \r\n3 4327 13183 11584 5912 \r\n3 1495 17494 13639 5913 \r\n3 4468 17493 17494 5913 \r\n3 3805 13639 17493 5913 \r\n3 735 17496 17495 5914 \r\n3 4977 5991 17496 5914 \r\n3 3868 17495 5991 5914 \r\n3 1503 17497 15665 5915 \r\n3 3742 8907 17497 5915 \r\n3 1538 15665 8907 5915 \r\n3 1498 8606 7717 5916 \r\n3 3243 17498 8606 5916 \r\n3 1453 7717 17498 5916 \r\n3 4518 11194 17500 5917 \r\n3 913 17499 11194 5917 \r\n3 67 17500 17499 5917 \r\n3 3374 12833 13219 5918 \r\n3 948 11737 12833 5918 \r\n3 995 13219 11737 5918 \r\n3 2835 10779 17501 5919 \r\n3 2886 14951 10779 5919 \r\n3 4854 17501 14951 5919 \r\n3 279 17502 13115 5920 \r\n3 1723 15358 17502 5920 \r\n3 4084 13115 15358 5920 \r\n3 1390 17041 17450 5921 \r\n3 3916 10556 17041 5921 \r\n3 580 17450 10556 5921 \r\n3 1625 17505 17504 5922 \r\n3 2293 17503 17505 5922 \r\n3 4962 17504 17503 5922 \r\n3 2695 12295 13514 5923 \r\n3 669 17506 12295 5923 \r\n3 4750 13514 17506 5923 \r\n3 1821 15379 17508 5924 \r\n3 1305 17507 15379 5924 \r\n3 1170 17508 17507 5924 \r\n3 3630 16337 17509 5925 \r\n3 909 10281 16337 5925 \r\n3 2700 17509 10281 5925 \r\n3 4787 15510 5915 5926 \r\n3 1012 17510 15510 5926 \r\n3 3246 5915 17510 5926 \r\n3 470 17007 6265 5927 \r\n3 99 7319 17007 5927 \r\n3 3964 6265 7319 5927 \r\n3 3117 17511 17473 5928 \r\n3 3599 7602 17511 5928 \r\n3 3671 17473 7602 5928 \r\n3 4903 17512 17419 5929 \r\n3 2883 13156 17512 5929 \r\n3 3048 17419 13156 5929 \r\n3 3548 7275 5956 5930 \r\n3 1205 5791 7275 5930 \r\n3 2801 5956 5791 5930 \r\n3 3610 10753 17065 5931 \r\n3 878 17513 10753 5931 \r\n3 4308 17065 17513 5931 \r\n3 1675 14492 17515 5932 \r\n3 2304 17514 14492 5932 \r\n3 4428 17515 17514 5932 \r\n3 1166 12928 12100 5933 \r\n3 666 7265 12928 5933 \r\n3 226 12100 7265 5933 \r\n3 4067 14563 17516 5934 \r\n3 2526 11900 14563 5934 \r\n3 340 17516 11900 5934 \r\n3 614 17518 17517 5935 \r\n3 443 10545 17518 5935 \r\n3 2420 17517 10545 5935 \r\n3 29 17520 14909 5936 \r\n3 4667 17519 17520 5936 \r\n3 4273 14909 17519 5936 \r\n3 1265 17043 17522 5937 \r\n3 1701 17521 17043 5937 \r\n3 3272 17522 17521 5937 \r\n3 1320 17523 16334 5938 \r\n3 3418 12328 17523 5938 \r\n3 1407 16334 12328 5938 \r\n3 2219 17525 17524 5939 \r\n3 1766 9292 17525 5939 \r\n3 2004 17524 9292 5939 \r\n3 4655 17526 13898 5940 \r\n3 375 6971 17526 5940 \r\n3 3755 13898 6971 5940 \r\n3 3215 17528 17527 5941 \r\n3 304 11908 17528 5941 \r\n3 3823 17527 11908 5941 \r\n3 3935 17529 14850 5942 \r\n3 3336 7563 17529 5942 \r\n3 597 14850 7563 5942 \r\n3 4704 8910 17530 5943 \r\n3 603 7779 8910 5943 \r\n3 1866 17530 7779 5943 \r\n3 591 10331 16314 5944 \r\n3 335 17531 10331 5944 \r\n3 1994 16314 17531 5944 \r\n3 2444 7453 10410 5945 \r\n3 1768 8688 7453 5945 \r\n3 1352 10410 8688 5945 \r\n3 2116 17534 17533 5946 \r\n3 2986 17532 17534 5946 \r\n3 1804 17533 17532 5946 \r\n3 1944 13356 12756 5947 \r\n3 4715 5873 13356 5947 \r\n3 3333 12756 5873 5947 \r\n3 4693 11857 10847 5948 \r\n3 1461 17535 11857 5948 \r\n3 4541 10847 17535 5948 \r\n3 4900 16626 7552 5949 \r\n3 3232 13077 16626 5949 \r\n3 2186 7552 13077 5949 \r\n3 3863 17536 10442 5950 \r\n3 527 6043 17536 5950 \r\n3 1873 10442 6043 5950 \r\n3 545 17537 17351 5951 \r\n3 3185 17380 17537 5951 \r\n3 4259 17351 17380 5951 \r\n3 3317 12385 17539 5952 \r\n3 4905 17538 12385 5952 \r\n3 1049 17539 17538 5952 \r\n3 610 17542 17541 5953 \r\n3 4770 17540 17542 5953 \r\n3 4171 17541 17540 5953 \r\n3 2278 11978 17544 5954 \r\n3 4633 17543 11978 5954 \r\n3 3146 17544 17543 5954 \r\n3 3191 17546 17545 5955 \r\n3 4912 15439 17546 5955 \r\n3 3065 17545 15439 5955 \r\n3 3041 17548 14508 5956 \r\n3 4716 17547 17548 5956 \r\n3 3052 14508 17547 5956 \r\n3 3713 12191 8663 5957 \r\n3 2552 17549 12191 5957 \r\n3 1982 8663 17549 5957 \r\n3 4950 17550 9164 5958 \r\n3 2932 15799 17550 5958 \r\n3 3986 9164 15799 5958 \r\n3 95 7495 17552 5959 \r\n3 4583 17551 7495 5959 \r\n3 212 17552 17551 5959 \r\n3 3958 12169 9483 5960 \r\n3 1095 16536 12169 5960 \r\n3 1182 9483 16536 5960 \r\n3 923 13972 14751 5961 \r\n3 2153 11948 13972 5961 \r\n3 3824 14751 11948 5961 \r\n3 595 17554 17553 5962 \r\n3 3835 9616 17554 5962 \r\n3 1193 17553 9616 5962 \r\n3 4612 9442 6550 5963 \r\n3 2720 17290 9442 5963 \r\n3 4543 6550 17290 5963 \r\n3 3879 11988 12633 5964 \r\n3 1688 14359 11988 5964 \r\n3 3569 12633 14359 5964 \r\n3 1525 17555 16948 5965 \r\n3 4865 13391 17555 5965 \r\n3 2285 16948 13391 5965 \r\n3 2562 16904 15514 5966 \r\n3 3766 12089 16904 5966 \r\n3 4466 15514 12089 5966 \r\n3 1942 14419 17557 5967 \r\n3 955 17556 14419 5967 \r\n3 2609 17557 17556 5967 \r\n3 2225 17558 6354 5968 \r\n3 3884 16264 17558 5968 \r\n3 3211 6354 16264 5968 \r\n3 2010 14013 13907 5969 \r\n3 2178 17559 14013 5969 \r\n3 580 13907 17559 5969 \r\n3 4599 17561 17560 5970 \r\n3 2268 12429 17561 5970 \r\n3 4943 17560 12429 5970 \r\n3 3146 10218 17562 5971 \r\n3 3030 8012 10218 5971 \r\n3 4126 17562 8012 5971 \r\n3 907 17563 16619 5972 \r\n3 3175 15883 17563 5972 \r\n3 3844 16619 15883 5972 \r\n3 1910 10652 12552 5973 \r\n3 441 5918 10652 5973 \r\n3 1316 12552 5918 5973 \r\n3 4441 17564 14757 5974 \r\n3 387 16525 17564 5974 \r\n3 833 14757 16525 5974 \r\n3 2917 12242 11831 5975 \r\n3 549 17565 12242 5975 \r\n3 3666 11831 17565 5975 \r\n3 4451 17566 11958 5976 \r\n3 4913 13837 17566 5976 \r\n3 5000 11958 13837 5976 \r\n3 376 11451 17567 5977 \r\n3 4703 17456 11451 5977 \r\n3 1199 17567 17456 5977 \r\n3 4449 17568 16300 5978 \r\n3 2681 15153 17568 5978 \r\n3 3315 16300 15153 5978 \r\n3 4254 16656 17569 5979 \r\n3 1947 5323 16656 5979 \r\n3 3197 17569 5323 5979 \r\n3 2052 12378 17571 5980 \r\n3 2040 17570 12378 5980 \r\n3 2015 17571 17570 5980 \r\n3 133 17213 15903 5981 \r\n3 4559 16577 17213 5981 \r\n3 499 15903 16577 5981 \r\n3 1423 16463 17572 5982 \r\n3 4589 9240 16463 5982 \r\n3 4822 17572 9240 5982 \r\n3 1989 17574 12396 5983 \r\n3 3793 17573 17574 5983 \r\n3 1906 12396 17573 5983 \r\n3 1618 17576 17575 5984 \r\n3 1830 8979 17576 5984 \r\n3 513 17575 8979 5984 \r\n3 3536 10322 17577 5985 \r\n3 389 5629 10322 5985 \r\n3 1505 17577 5629 5985 \r\n3 667 7023 17578 5986 \r\n3 956 17244 7023 5986 \r\n3 2626 17578 17244 5986 \r\n3 3811 6758 15733 5987 \r\n3 710 15006 6758 5987 \r\n3 2543 15733 15006 5987 \r\n3 603 17579 7780 5988 \r\n3 3105 13877 17579 5988 \r\n3 4187 7780 13877 5988 \r\n3 4494 17580 15229 5989 \r\n3 1377 6581 17580 5989 \r\n3 3566 15229 6581 5989 \r\n3 2633 14632 13969 5990 \r\n3 3546 9650 14632 5990 \r\n3 1900 13969 9650 5990 \r\n3 3813 17582 17581 5991 \r\n3 1941 11274 17582 5991 \r\n3 940 17581 11274 5991 \r\n3 1738 7751 17583 5992 \r\n3 4925 11300 7751 5992 \r\n3 2456 17583 11300 5992 \r\n3 1197 17584 8607 5993 \r\n3 1131 10809 17584 5993 \r\n3 906 8607 10809 5993 \r\n3 3840 16365 16768 5994 \r\n3 374 17070 16365 5994 \r\n3 3852 16768 17070 5994 \r\n3 4731 17587 17586 5995 \r\n3 3993 17585 17587 5995 \r\n3 2971 17586 17585 5995 \r\n3 3423 13520 17589 5996 \r\n3 2208 17588 13520 5996 \r\n3 2994 17589 17588 5996 \r\n3 3739 7278 13698 5997 \r\n3 537 9250 7278 5997 \r\n3 2758 13698 9250 5997 \r\n3 4770 17591 17590 5998 \r\n3 3848 10283 17591 5998 \r\n3 1116 17590 10283 5998 \r\n3 66 17592 6153 5999 \r\n3 4402 16451 17592 5999 \r\n3 4735 6153 16451 5999 \r\n3 1397 11167 17594 6000 \r\n3 2478 17593 11167 6000 \r\n3 3777 17594 17593 6000 \r\n3 1654 16682 17596 6001 \r\n3 3896 17595 16682 6001 \r\n3 790 17596 17595 6001 \r\n3 4509 9496 10525 6002 \r\n3 2242 17597 9496 6002 \r\n3 1483 10525 17597 6002 \r\n3 3555 17600 17599 6003 \r\n3 3816 17598 17600 6003 \r\n3 1604 17599 17598 6003 \r\n3 2273 17602 17601 6004 \r\n3 4465 14512 17602 6004 \r\n3 3839 17601 14512 6004 \r\n3 3025 15149 16432 6005 \r\n3 3965 17603 15149 6005 \r\n3 161 16432 17603 6005 \r\n3 1423 16160 16051 6006 \r\n3 1662 10774 16160 6006 \r\n3 1422 16051 10774 6006 \r\n3 3499 7283 17604 6007 \r\n3 522 17168 7283 6007 \r\n3 3085 17604 17168 6007 \r\n3 1619 16725 15294 6008 \r\n3 2068 17605 16725 6008 \r\n3 2857 15294 17605 6008 \r\n3 3517 14203 17606 6009 \r\n3 1942 17557 14203 6009 \r\n3 2609 17606 17557 6009 \r\n3 4210 6987 5907 6010 \r\n3 1408 7578 6987 6010 \r\n3 917 5907 7578 6010 \r\n3 3472 17608 17607 6011 \r\n3 427 7042 17608 6011 \r\n3 456 17607 7042 6011 \r\n3 2810 12561 15785 6012 \r\n3 4565 17609 12561 6012 \r\n3 406 15785 17609 6012 \r\n3 831 17611 17610 6013 \r\n3 2520 16547 17611 6013 \r\n3 2953 17610 16547 6013 \r\n3 3962 17613 5520 6014 \r\n3 2156 17612 17613 6014 \r\n3 4938 5520 17612 6014 \r\n3 4012 10977 17615 6015 \r\n3 2999 17614 10977 6015 \r\n3 17 17615 17614 6015 \r\n3 1263 17617 17616 6016 \r\n3 4321 17231 17617 6016 \r\n3 81 17616 17231 6016 \r\n3 1858 8365 17619 6017 \r\n3 4561 17618 8365 6017 \r\n3 2806 17619 17618 6017 \r\n3 98 15216 9500 6018 \r\n3 1986 5328 15216 6018 \r\n3 3490 9500 5328 6018 \r\n3 2687 16169 8814 6019 \r\n3 4826 17620 16169 6019 \r\n3 1062 8814 17620 6019 \r\n3 2364 7908 17621 6020 \r\n3 3749 9815 7908 6020 \r\n3 4517 17621 9815 6020 \r\n3 1498 16247 8604 6021 \r\n3 1623 5313 16247 6021 \r\n3 1415 8604 5313 6021 \r\n3 847 17623 10645 6022 \r\n3 1560 17622 17623 6022 \r\n3 3886 10645 17622 6022 \r\n3 3953 6040 15930 6023 \r\n3 586 9013 6040 6023 \r\n3 5 15930 9013 6023 \r\n3 1534 6088 5706 6024 \r\n3 1972 13182 6088 6024 \r\n3 626 5706 13182 6024 \r\n3 421 7155 17625 6025 \r\n3 3941 17624 7155 6025 \r\n3 2511 17625 17624 6025 \r\n3 3321 16016 17626 6026 \r\n3 3694 13823 16016 6026 \r\n3 2039 17626 13823 6026 \r\n3 185 11165 15417 6027 \r\n3 1607 15862 11165 6027 \r\n3 4345 15417 15862 6027 \r\n3 355 17628 5223 6028 \r\n3 4690 17627 17628 6028 \r\n3 3456 5223 17627 6028 \r\n3 781 17629 14810 6029 \r\n3 576 14356 17629 6029 \r\n3 512 14810 14356 6029 \r\n3 2996 7852 9763 6030 \r\n3 2200 17630 7852 6030 \r\n3 2853 9763 17630 6030 \r\n3 106 11554 17632 6031 \r\n3 3329 17631 11554 6031 \r\n3 1698 17632 17631 6031 \r\n3 3429 5255 17634 6032 \r\n3 4779 17633 5255 6032 \r\n3 4860 17634 17633 6032 \r\n3 3100 9689 6455 6033 \r\n3 3430 17635 9689 6033 \r\n3 2284 6455 17635 6033 \r\n3 3655 17637 11830 6034 \r\n3 4494 17636 17637 6034 \r\n3 827 11830 17636 6034 \r\n3 4513 17638 5111 6035 \r\n3 204 12173 17638 6035 \r\n3 218 5111 12173 6035 \r\n3 1946 15328 7583 6036 \r\n3 338 8491 15328 6036 \r\n3 290 7583 8491 6036 \r\n3 1366 17640 17639 6037 \r\n3 4954 13967 17640 6037 \r\n3 4775 17639 13967 6037 \r\n3 523 16155 17642 6038 \r\n3 2782 17641 16155 6038 \r\n3 3618 17642 17641 6038 \r\n3 2105 6189 14066 6039 \r\n3 4464 12418 6189 6039 \r\n3 4094 14066 12418 6039 \r\n3 1740 11868 17643 6040 \r\n3 1413 12966 11868 6040 \r\n3 1244 17643 12966 6040 \r\n3 3540 15495 7410 6041 \r\n3 3509 14302 15495 6041 \r\n3 631 7410 14302 6041 \r\n3 619 17645 5616 6042 \r\n3 3090 17644 17645 6042 \r\n3 3891 5616 17644 6042 \r\n3 3386 14002 17647 6043 \r\n3 89 17646 14002 6043 \r\n3 440 17647 17646 6043 \r\n3 1386 7417 14702 6044 \r\n3 2279 17648 7417 6044 \r\n3 509 14702 17648 6044 \r\n3 3527 16937 16500 6045 \r\n3 3226 14373 16937 6045 \r\n3 1755 16500 14373 6045 \r\n3 3938 17649 16287 6046 \r\n3 3214 10168 17649 6046 \r\n3 1097 16287 10168 6046 \r\n3 1257 17650 17478 6047 \r\n3 4177 15543 17650 6047 \r\n3 766 17478 15543 6047 \r\n3 3557 17651 14989 6048 \r\n3 2360 17298 17651 6048 \r\n3 4076 14989 17298 6048 \r\n3 2373 8468 17652 6049 \r\n3 4876 11104 8468 6049 \r\n3 2895 17652 11104 6049 \r\n3 1285 17654 16679 6050 \r\n3 370 17653 17654 6050 \r\n3 3256 16679 17653 6050 \r\n3 841 15598 17655 6051 \r\n3 746 17487 15598 6051 \r\n3 4365 17655 17487 6051 \r\n3 281 17657 17656 6052 \r\n3 4738 16301 17657 6052 \r\n3 3315 17656 16301 6052 \r\n3 2802 14798 17658 6053 \r\n3 3215 17527 14798 6053 \r\n3 3823 17658 17527 6053 \r\n3 4502 17661 17660 6054 \r\n3 3376 17659 17661 6054 \r\n3 2391 17660 17659 6054 \r\n3 2092 17663 15348 6055 \r\n3 3627 17662 17663 6055 \r\n3 4654 15348 17662 6055 \r\n3 2887 11541 7099 6056 \r\n3 975 17664 11541 6056 \r\n3 3767 7099 17664 6056 \r\n3 653 17665 10250 6057 \r\n3 963 10259 17665 6057 \r\n3 1666 10250 10259 6057 \r\n3 468 10382 17667 6058 \r\n3 1655 17666 10382 6058 \r\n3 4201 17667 17666 6058 \r\n3 132 17668 8737 6059 \r\n3 3640 5051 17668 6059 \r\n3 2484 8737 5051 6059 \r\n3 4092 10927 15350 6060 \r\n3 4788 11057 10927 6060 \r\n3 2850 15350 11057 6060 \r\n3 4844 17670 13581 6061 \r\n3 3450 17669 17670 6061 \r\n3 4285 13581 17669 6061 \r\n3 3460 14687 17671 6062 \r\n3 2996 9765 14687 6062 \r\n3 3105 17671 9765 6062 \r\n3 3204 17673 17194 6063 \r\n3 77 17672 17673 6063 \r\n3 1061 17194 17672 6063 \r\n3 1189 15120 5265 6064 \r\n3 4014 15329 15120 6064 \r\n3 16 5265 15329 6064 \r\n3 1558 9614 17675 6065 \r\n3 4946 17674 9614 6065 \r\n3 1233 17675 17674 6065 \r\n3 2141 5691 16613 6066 \r\n3 4264 17676 5691 6066 \r\n3 1537 16613 17676 6066 \r\n3 2635 16563 16383 6067 \r\n3 2966 15133 16563 6067 \r\n3 4280 16383 15133 6067 \r\n3 694 17678 17677 6068 \r\n3 1596 9781 17678 6068 \r\n3 3618 17677 9781 6068 \r\n3 1784 9368 9108 6069 \r\n3 1135 11217 9368 6069 \r\n3 3573 9108 11217 6069 \r\n3 3663 9358 17680 6070 \r\n3 2987 17679 9358 6070 \r\n3 64 17680 17679 6070 \r\n3 2348 17682 17681 6071 \r\n3 1700 17409 17682 6071 \r\n3 1469 17681 17409 6071 \r\n3 4346 14963 9823 6072 \r\n3 1444 11293 14963 6072 \r\n3 4808 9823 11293 6072 \r\n3 1213 17684 11792 6073 \r\n3 3419 17683 17684 6073 \r\n3 1897 11792 17683 6073 \r\n3 2493 17687 17686 6074 \r\n3 2669 17685 17687 6074 \r\n3 941 17686 17685 6074 \r\n3 732 15189 9170 6075 \r\n3 4850 9507 15189 6075 \r\n3 2246 9170 9507 6075 \r\n3 3705 17688 5931 6076 \r\n3 4212 9064 17688 6076 \r\n3 861 5931 9064 6076 \r\n3 2553 17690 17689 6077 \r\n3 2342 11512 17690 6077 \r\n3 2062 17689 11512 6077 \r\n3 2904 17691 16918 6078 \r\n3 2004 9291 17691 6078 \r\n3 1204 16918 9291 6078 \r\n3 1485 17693 17692 6079 \r\n3 743 16558 17693 6079 \r\n3 4867 17692 16558 6079 \r\n3 4641 17695 17694 6080 \r\n3 639 15179 17695 6080 \r\n3 3022 17694 15179 6080 \r\n3 4935 11175 14706 6081 \r\n3 3804 14439 11175 6081 \r\n3 643 14706 14439 6081 \r\n3 1831 11752 5837 6082 \r\n3 490 5988 11752 6082 \r\n3 1181 5837 5988 6082 \r\n3 4170 17696 12186 6083 \r\n3 1889 13459 17696 6083 \r\n3 4733 12186 13459 6083 \r\n3 1067 8648 11840 6084 \r\n3 4331 17697 8648 6084 \r\n3 1984 11840 17697 6084 \r\n3 352 8523 17698 6085 \r\n3 578 13163 8523 6085 \r\n3 3801 17698 13163 6085 \r\n3 2399 17700 17699 6086 \r\n3 3760 17313 17700 6086 \r\n3 2235 17699 17313 6086 \r\n3 4863 17702 12676 6087 \r\n3 4341 17701 17702 6087 \r\n3 2261 12676 17701 6087 \r\n3 3056 17703 17333 6088 \r\n3 1511 14680 17703 6088 \r\n3 1892 17333 14680 6088 \r\n3 1753 17704 11934 6089 \r\n3 3 15545 17704 6089 \r\n3 39 11934 15545 6089 \r\n3 3363 11018 8020 6090 \r\n3 1841 17705 11018 6090 \r\n3 3164 8020 17705 6090 \r\n3 2686 15723 13518 6091 \r\n3 4320 17706 15723 6091 \r\n3 2009 13518 17706 6091 \r\n3 2011 17708 7930 6092 \r\n3 777 17707 17708 6092 \r\n3 632 7930 17707 6092 \r\n3 359 17709 13170 6093 \r\n3 2455 14838 17709 6093 \r\n3 505 13170 14838 6093 \r\n3 1409 16392 14868 6094 \r\n3 3297 17237 16392 6094 \r\n3 1951 14868 17237 6094 \r\n3 2 12608 9437 6095 \r\n3 1795 17710 12608 6095 \r\n3 4774 9437 17710 6095 \r\n3 433 17711 14365 6096 \r\n3 2204 5469 17711 6096 \r\n3 2537 14365 5469 6096 \r\n3 2036 17712 17218 6097 \r\n3 3531 12268 17712 6097 \r\n3 4420 17218 12268 6097 \r\n3 3170 14887 17714 6098 \r\n3 1432 17713 14887 6098 \r\n3 1810 17714 17713 6098 \r\n3 1006 7664 10424 6099 \r\n3 324 17715 7664 6099 \r\n3 2343 10424 17715 6099 \r\n3 2051 15767 16692 6100 \r\n3 2211 17716 15767 6100 \r\n3 4986 16692 17716 6100 \r\n3 1439 11531 13025 6101 \r\n3 696 11506 11531 6101 \r\n3 1296 13025 11506 6101 \r\n3 2399 17719 17718 6102 \r\n3 4845 17717 17719 6102 \r\n3 2565 17718 17717 6102 \r\n3 1762 17721 16375 6103 \r\n3 2615 17720 17721 6103 \r\n3 148 16375 17720 6103 \r\n3 2878 17723 14835 6104 \r\n3 4638 17722 17723 6104 \r\n3 1791 14835 17722 6104 \r\n3 1853 17724 11022 6105 \r\n3 2969 14921 17724 6105 \r\n3 1155 11022 14921 6105 \r\n3 4681 10794 8182 6106 \r\n3 4389 17725 10794 6106 \r\n3 795 8182 17725 6106 \r\n3 2222 17726 6928 6107 \r\n3 278 13792 17726 6107 \r\n3 3617 6928 13792 6107 \r\n3 58 15644 5216 6108 \r\n3 920 17727 15644 6108 \r\n3 431 5216 17727 6108 \r\n3 3255 13396 17728 6109 \r\n3 1559 12211 13396 6109 \r\n3 4957 17728 12211 6109 \r\n3 3287 9914 17730 6110 \r\n3 1647 17729 9914 6110 \r\n3 1540 17730 17729 6110 \r\n3 2470 15017 12585 6111 \r\n3 263 17731 15017 6111 \r\n3 4982 12585 17731 6111 \r\n3 1385 7812 7885 6112 \r\n3 1641 15199 7812 6112 \r\n3 2881 7885 15199 6112 \r\n3 2620 16137 5712 6113 \r\n3 1875 16927 16137 6113 \r\n3 577 5712 16927 6113 \r\n3 4710 17733 17732 6114 \r\n3 2336 14577 17733 6114 \r\n3 2963 17732 14577 6114 \r\n3 770 12218 16762 6115 \r\n3 575 17734 12218 6115 \r\n3 2463 16762 17734 6115 \r\n3 507 17736 17085 6116 \r\n3 473 17735 17736 6116 \r\n3 534 17085 17735 6116 \r\n3 186 17738 9296 6117 \r\n3 4988 17737 17738 6117 \r\n3 4533 9296 17737 6117 \r\n3 3268 17739 7803 6118 \r\n3 4288 17410 17739 6118 \r\n3 690 7803 17410 6118 \r\n3 3887 13572 6566 6119 \r\n3 3574 16832 13572 6119 \r\n3 4213 6566 16832 6119 \r\n3 427 17608 14663 6120 \r\n3 3472 14414 17608 6120 \r\n3 1255 14663 14414 6120 \r\n3 4822 9587 10712 6121 \r\n3 3188 16468 9587 6121 \r\n3 4803 10712 16468 6121 \r\n3 398 8142 7251 6122 \r\n3 3005 8009 8142 6122 \r\n3 3910 7251 8009 6122 \r\n3 1679 6055 17740 6123 \r\n3 4467 15970 6055 6123 \r\n3 4357 17740 15970 6123 \r\n3 228 11235 13941 6124 \r\n3 2333 17741 11235 6124 \r\n3 2480 13941 17741 6124 \r\n3 2533 13105 15899 6125 \r\n3 4933 8376 13105 6125 \r\n3 3612 15899 8376 6125 \r\n3 411 12839 17743 6126 \r\n3 162 17742 12839 6126 \r\n3 4744 17743 17742 6126 \r\n3 3439 17745 17744 6127 \r\n3 4028 13845 17745 6127 \r\n3 2012 17744 13845 6127 \r\n3 4310 17387 17746 6128 \r\n3 1066 14149 17387 6128 \r\n3 1457 17746 14149 6128 \r\n3 1573 14561 17747 6129 \r\n3 1605 7369 14561 6129 \r\n3 1593 17747 7369 6129 \r\n3 2020 14389 15841 6130 \r\n3 3127 11560 14389 6130 \r\n3 3118 15841 11560 6130 \r\n3 125 16111 5545 6131 \r\n3 3544 12614 16111 6131 \r\n3 2524 5545 12614 6131 \r\n3 345 12908 17749 6132 \r\n3 1780 17748 12908 6132 \r\n3 1625 17749 17748 6132 \r\n3 140 6134 12700 6133 \r\n3 4281 16268 6134 6133 \r\n3 1985 12700 16268 6133 \r\n3 4419 17750 9508 6134 \r\n3 1226 13674 17750 6134 \r\n3 772 9508 13674 6134 \r\n3 1745 11788 17751 6135 \r\n3 1643 6661 11788 6135 \r\n3 2787 17751 6661 6135 \r\n3 4412 14246 11739 6136 \r\n3 1053 13935 14246 6136 \r\n3 4283 11739 13935 6136 \r\n3 1633 5359 17752 6137 \r\n3 1576 12504 5359 6137 \r\n3 4842 17752 12504 6137 \r\n3 2745 12787 17754 6138 \r\n3 517 17753 12787 6138 \r\n3 2854 17754 17753 6138 \r\n3 4333 5305 16441 6139 \r\n3 4005 9133 5305 6139 \r\n3 2455 16441 9133 6139 \r\n3 1241 17757 17756 6140 \r\n3 4434 17755 17757 6140 \r\n3 28 17756 17755 6140 \r\n3 3404 17758 9978 6141 \r\n3 2111 16914 17758 6141 \r\n3 4024 9978 16914 6141 \r\n3 596 12974 17760 6142 \r\n3 978 17759 12974 6142 \r\n3 900 17760 17759 6142 \r\n3 3176 6980 6003 6143 \r\n3 4181 16674 6980 6143 \r\n3 642 6003 16674 6143 \r\n3 3881 17761 8280 6144 \r\n3 2024 14884 17761 6144 \r\n3 2742 8280 14884 6144 \r\n3 2431 10460 7159 6145 \r\n3 4629 10970 10460 6145 \r\n3 4190 7159 10970 6145 \r\n3 493 13980 7991 6146 \r\n3 2065 12906 13980 6146 \r\n3 4338 7991 12906 6146 \r\n3 1760 6547 17763 6147 \r\n3 4835 17762 6547 6147 \r\n3 445 17763 17762 6147 \r\n3 4414 17084 17764 6148 \r\n3 325 6485 17084 6148 \r\n3 266 17764 6485 6148 \r\n3 1477 17765 10304 6149 \r\n3 3934 8783 17765 6149 \r\n3 4706 10304 8783 6149 \r\n3 709 17767 17766 6150 \r\n3 4968 9651 17767 6150 \r\n3 1073 17766 9651 6150 \r\n3 2514 17769 6025 6151 \r\n3 2138 17768 17769 6151 \r\n3 1763 6025 17768 6151 \r\n3 2050 10950 17770 6152 \r\n3 4183 8877 10950 6152 \r\n3 4023 17770 8877 6152 \r\n3 4925 6270 11301 6153 \r\n3 4633 10085 6270 6153 \r\n3 2147 11301 10085 6153 \r\n3 4589 16465 17771 6154 \r\n3 2584 7027 16465 6154 \r\n3 2889 17771 7027 6154 \r\n3 83 16486 10991 6155 \r\n3 4158 14628 16486 6155 \r\n3 4879 10991 14628 6155 \r\n3 2170 17772 8953 6156 \r\n3 2012 10042 17772 6156 \r\n3 2762 8953 10042 6156 \r\n3 879 11331 17774 6157 \r\n3 3426 17773 11331 6157 \r\n3 3071 17774 17773 6157 \r\n3 705 15060 17776 6158 \r\n3 4228 17775 15060 6158 \r\n3 1317 17776 17775 6158 \r\n3 4134 16822 17778 6159 \r\n3 3968 17777 16822 6159 \r\n3 1521 17778 17777 6159 \r\n3 1538 8906 17780 6160 \r\n3 755 17779 8906 6160 \r\n3 4205 17780 17779 6160 \r\n3 125 12468 16110 6161 \r\n3 1029 8666 12468 6161 \r\n3 4031 16110 8666 6161 \r\n3 13 5919 13217 6162 \r\n3 441 14883 5919 6162 \r\n3 2024 13217 14883 6162 \r\n3 4529 17782 10533 6163 \r\n3 164 17781 17782 6163 \r\n3 712 10533 17781 6163 \r\n3 836 17785 17784 6164 \r\n3 1677 17783 17785 6164 \r\n3 562 17784 17783 6164 \r\n3 4144 15152 7722 6165 \r\n3 2765 17786 15152 6165 \r\n3 1673 7722 17786 6165 \r\n3 1758 9549 17788 6166 \r\n3 3136 17787 9549 6166 \r\n3 1515 17788 17787 6166 \r\n3 10 14232 17789 6167 \r\n3 712 17781 14232 6167 \r\n3 164 17789 17781 6167 \r\n3 674 17790 7088 6168 \r\n3 4622 17134 17790 6168 \r\n3 2606 7088 17134 6168 \r\n3 1382 12739 10239 6169 \r\n3 2091 17791 12739 6169 \r\n3 4747 10239 17791 6169 \r\n3 883 17793 11967 6170 \r\n3 1176 17792 17793 6170 \r\n3 1289 11967 17792 6170 \r\n3 2402 12805 13387 6171 \r\n3 3850 7166 12805 6171 \r\n3 984 13387 7166 6171 \r\n3 4588 6243 16545 6172 \r\n3 3854 13176 6243 6172 \r\n3 2445 16545 13176 6172 \r\n3 1251 16218 14658 6173 \r\n3 584 13648 16218 6173 \r\n3 1949 14658 13648 6173 \r\n3 1366 17794 15094 6174 \r\n3 3586 7059 17794 6174 \r\n3 76 15094 7059 6174 \r\n3 2305 9109 17432 6175 \r\n3 3573 11209 9109 6175 \r\n3 1342 17432 11209 6175 \r\n3 4118 13165 17796 6176 \r\n3 3989 17795 13165 6176 \r\n3 1893 17796 17795 6176 \r\n3 1680 17798 5187 6177 \r\n3 2079 17797 17798 6177 \r\n3 1624 5187 17797 6177 \r\n3 3126 16237 12249 6178 \r\n3 873 10632 16237 6178 \r\n3 1033 12249 10632 6178 \r\n3 2339 17799 6462 6179 \r\n3 3441 5514 17799 6179 \r\n3 4625 6462 5514 6179 \r\n3 2454 16194 17800 6180 \r\n3 2870 14423 16194 6180 \r\n3 3286 17800 14423 6180 \r\n3 3856 11880 17801 6181 \r\n3 4175 16456 11880 6181 \r\n3 945 17801 16456 6181 \r\n3 3796 17802 15206 6182 \r\n3 2707 8300 17802 6182 \r\n3 2513 15206 8300 6182 \r\n3 260 17804 17803 6183 \r\n3 3508 11234 17804 6183 \r\n3 1490 17803 11234 6183 \r\n3 3221 6735 17806 6184 \r\n3 813 17805 6735 6184 \r\n3 2433 17806 17805 6184 \r\n3 1528 17807 15606 6185 \r\n3 2965 17376 17807 6185 \r\n3 564 15606 17376 6185 \r\n3 1510 6870 17809 6186 \r\n3 3581 17808 6870 6186 \r\n3 329 17809 17808 6186 \r\n3 3880 16188 17811 6187 \r\n3 1523 17810 16188 6187 \r\n3 1013 17811 17810 6187 \r\n3 2559 13744 5238 6188 \r\n3 2880 15906 13744 6188 \r\n3 1222 5238 15906 6188 \r\n3 446 17813 17812 6189 \r\n3 1248 8499 17813 6189 \r\n3 3515 17812 8499 6189 \r\n3 4600 17814 10301 6190 \r\n3 3322 14848 17814 6190 \r\n3 1013 10301 14848 6190 \r\n3 3610 17816 11691 6191 \r\n3 1494 17815 17816 6191 \r\n3 3264 11691 17815 6191 \r\n3 3339 13623 17818 6192 \r\n3 3787 17817 13623 6192 \r\n3 1624 17818 17817 6192 \r\n3 2646 5832 17820 6193 \r\n3 3791 17819 5832 6193 \r\n3 2994 17820 17819 6193 \r\n3 399 17822 17821 6194 \r\n3 132 8736 17822 6194 \r\n3 436 17821 8736 6194 \r\n3 4472 11463 12491 6195 \r\n3 2649 17303 11463 6195 \r\n3 340 12491 17303 6195 \r\n3 689 11306 15942 6196 \r\n3 557 6838 11306 6196 \r\n3 4553 15942 6838 6196 \r\n3 4690 17628 13929 6197 \r\n3 355 13654 17628 6197 \r\n3 3072 13929 13654 6197 \r\n3 1548 17824 17823 6198 \r\n3 1909 6140 17824 6198 \r\n3 4256 17823 6140 6198 \r\n3 1372 10510 17825 6199 \r\n3 2108 8587 10510 6199 \r\n3 801 17825 8587 6199 \r\n3 3971 14544 16297 6200 \r\n3 4038 17826 14544 6200 \r\n3 3099 16297 17826 6200 \r\n3 2572 13515 17828 6201 \r\n3 3036 17827 13515 6201 \r\n3 4454 17828 17827 6201 \r\n3 4049 16317 16336 6202 \r\n3 3908 14931 16317 6202 \r\n3 909 16336 14931 6202 \r\n3 1384 12287 17446 6203 \r\n3 844 17829 12287 6203 \r\n3 1888 17446 17829 6203 \r\n3 3523 17831 9262 6204 \r\n3 4814 17830 17831 6204 \r\n3 2796 9262 17830 6204 \r\n3 2612 17833 9837 6205 \r\n3 3512 17832 17833 6205 \r\n3 1398 9837 17832 6205 \r\n3 1726 17352 17835 6206 \r\n3 895 17834 17352 6206 \r\n3 1119 17835 17834 6206 \r\n3 3009 11548 11400 6207 \r\n3 4845 17836 11548 6207 \r\n3 1896 11400 17836 6207 \r\n3 589 12582 12352 6208 \r\n3 2660 17837 12582 6208 \r\n3 4648 12352 17837 6208 \r\n3 4511 15045 16744 6209 \r\n3 414 6569 15045 6209 \r\n3 2258 16744 6569 6209 \r\n3 385 16723 17838 6210 \r\n3 2033 16436 16723 6210 \r\n3 425 17838 16436 6210 \r\n3 532 17840 7133 6211 \r\n3 3377 17839 17840 6211 \r\n3 4792 7133 17839 6211 \r\n3 4595 17842 17841 6212 \r\n3 2951 6902 17842 6212 \r\n3 2707 17841 6902 6212 \r\n3 1631 17844 17843 6213 \r\n3 1190 14483 17844 6213 \r\n3 1586 17843 14483 6213 \r\n3 3383 9931 10191 6214 \r\n3 3129 11885 9931 6214 \r\n3 521 10191 11885 6214 \r\n3 2116 10378 17845 6215 \r\n3 2506 6892 10378 6215 \r\n3 3872 17845 6892 6215 \r\n3 2398 16561 6180 6216 \r\n3 2816 5200 16561 6216 \r\n3 2812 6180 5200 6216 \r\n3 4619 17847 5891 6217 \r\n3 2573 17846 17847 6217 \r\n3 2448 5891 17846 6217 \r\n3 611 9642 14607 6218 \r\n3 825 17848 9642 6218 \r\n3 109 14607 17848 6218 \r\n3 3101 17851 17850 6219 \r\n3 4170 17849 17851 6219 \r\n3 1851 17850 17849 6219 \r\n3 1245 17853 17852 6220 \r\n3 4262 12184 17853 6220 \r\n3 2712 17852 12184 6220 \r\n3 1001 15742 6030 6221 \r\n3 2142 15649 15742 6221 \r\n3 4369 6030 15649 6221 \r\n3 1821 17508 16975 6222 \r\n3 1170 17854 17508 6222 \r\n3 4842 16975 17854 6222 \r\n3 1119 17856 13734 6223 \r\n3 2379 17855 17856 6223 \r\n3 1506 13734 17855 6223 \r\n3 1491 17858 7467 6224 \r\n3 1081 17857 17858 6224 \r\n3 3336 7467 17857 6224 \r\n3 4186 12011 17859 6225 \r\n3 3038 15761 12011 6225 \r\n3 2653 17859 15761 6225 \r\n3 3210 12959 10601 6226 \r\n3 1664 14760 12959 6226 \r\n3 4230 10601 14760 6226 \r\n3 4488 17861 13839 6227 \r\n3 913 17860 17861 6227 \r\n3 2120 13839 17860 6227 \r\n3 1648 8125 9470 6228 \r\n3 4688 17862 8125 6228 \r\n3 4797 9470 17862 6228 \r\n3 2263 17863 17383 6229 \r\n3 4672 13184 17863 6229 \r\n3 4305 17383 13184 6229 \r\n3 4800 12383 17864 6230 \r\n3 3552 13116 12383 6230 \r\n3 78 17864 13116 6230 \r\n3 3111 6451 16951 6231 \r\n3 3295 12496 6451 6231 \r\n3 679 16951 12496 6231 \r\n3 1179 17866 17219 6232 \r\n3 3861 17865 17866 6232 \r\n3 4212 17219 17865 6232 \r\n3 855 12978 14430 6233 \r\n3 4247 5694 12978 6233 \r\n3 3300 14430 5694 6233 \r\n3 84 17867 14536 6234 \r\n3 2929 5039 17867 6234 \r\n3 247 14536 5039 6234 \r\n3 4689 12799 17869 6235 \r\n3 4774 17868 12799 6235 \r\n3 310 17869 17868 6235 \r\n3 1646 17872 17871 6236 \r\n3 154 17870 17872 6236 \r\n3 4944 17871 17870 6236 \r\n3 3871 6209 12059 6237 \r\n3 178 10541 6209 6237 \r\n3 621 12059 10541 6237 \r\n3 3254 16048 13174 6238 \r\n3 307 17873 16048 6238 \r\n3 3274 13174 17873 6238 \r\n3 3565 16687 17874 6239 \r\n3 94 10170 16687 6239 \r\n3 1669 17874 10170 6239 \r\n3 2636 15788 17875 6240 \r\n3 3504 13199 15788 6240 \r\n3 902 17875 13199 6240 \r\n3 1293 6325 15170 6241 \r\n3 450 10571 6325 6241 \r\n3 2993 15170 10571 6241 \r\n3 1173 5536 11559 6242 \r\n3 2334 17876 5536 6242 \r\n3 3980 11559 17876 6242 \r\n3 4749 17348 8947 6243 \r\n3 3086 17877 17348 6243 \r\n3 3055 8947 17877 6243 \r\n3 3396 11573 17879 6244 \r\n3 277 17878 11573 6244 \r\n3 4784 17879 17878 6244 \r\n3 2897 17881 13315 6245 \r\n3 3143 17880 17881 6245 \r\n3 3559 13315 17880 6245 \r\n3 4326 17882 13048 6246 \r\n3 930 17453 17882 6246 \r\n3 1977 13048 17453 6246 \r\n3 4187 17883 7778 6247 \r\n3 3072 7929 17883 6247 \r\n3 1866 7778 7929 6247 \r\n3 259 16716 15868 6248 \r\n3 2643 8519 16716 6248 \r\n3 964 15868 8519 6248 \r\n3 3243 8605 9486 6249 \r\n3 1415 17208 8605 6249 \r\n3 2833 9486 17208 6249 \r\n3 3698 10461 17884 6250 \r\n3 2431 17100 10461 6250 \r\n3 2634 17884 17100 6250 \r\n3 146 17886 6498 6251 \r\n3 1078 17885 17886 6251 \r\n3 4268 6498 17885 6251 \r\n3 2427 17887 6615 6252 \r\n3 548 16837 17887 6252 \r\n3 939 6615 16837 6252 \r\n3 4160 17890 17889 6253 \r\n3 1975 17888 17890 6253 \r\n3 2271 17889 17888 6253 \r\n3 3460 17671 14688 6254 \r\n3 3105 17579 17671 6254 \r\n3 603 14688 17579 6254 \r\n3 4054 16611 7429 6255 \r\n3 1537 17891 16611 6255 \r\n3 1202 7429 17891 6255 \r\n3 293 13854 17892 6256 \r\n3 2965 5273 13854 6256 \r\n3 3973 17892 5273 6256 \r\n3 2945 16285 13335 6257 \r\n3 3082 13911 16285 6257 \r\n3 779 13335 13911 6257 \r\n3 4078 8033 17893 6258 \r\n3 1915 7518 8033 6258 \r\n3 4022 17893 7518 6258 \r\n3 729 16313 14046 6259 \r\n3 4220 9228 16313 6259 \r\n3 2416 14046 9228 6259 \r\n3 4751 9049 9724 6260 \r\n3 45 10972 9049 6260 \r\n3 4757 9724 10972 6260 \r\n3 568 10060 17895 6261 \r\n3 829 17894 10060 6261 \r\n3 2739 17895 17894 6261 \r\n3 4026 17898 17897 6262 \r\n3 2023 17896 17898 6262 \r\n3 1220 17897 17896 6262 \r\n3 4604 11444 17899 6263 \r\n3 3620 17001 11444 6263 \r\n3 2068 17899 17001 6263 \r\n3 1252 7123 15633 6264 \r\n3 4468 17900 7123 6264 \r\n3 4175 15633 17900 6264 \r\n3 4500 17286 17902 6265 \r\n3 3876 17901 17286 6265 \r\n3 2592 17902 17901 6265 \r\n3 908 17905 17904 6266 \r\n3 4673 17903 17905 6266 \r\n3 3701 17904 17903 6266 \r\n3 3788 8294 10488 6267 \r\n3 2193 9670 8294 6267 \r\n3 2988 10488 9670 6267 \r\n3 3610 11690 10754 6268 \r\n3 4810 14313 11690 6268 \r\n3 2464 10754 14313 6268 \r\n3 1591 17257 13664 6269 \r\n3 1958 17906 17257 6269 \r\n3 1553 13664 17906 6269 \r\n3 4337 17907 17332 6270 \r\n3 1580 10443 17907 6270 \r\n3 3056 17332 10443 6270 \r\n3 809 16636 11115 6271 \r\n3 579 10973 16636 6271 \r\n3 45 11115 10973 6271 \r\n3 2023 17908 8848 6272 \r\n3 1638 12941 17908 6272 \r\n3 4976 8848 12941 6272 \r\n3 2508 17911 17910 6273 \r\n3 1081 17909 17911 6273 \r\n3 4730 17910 17909 6273 \r\n3 1369 17912 11819 6274 \r\n3 2077 7526 17912 6274 \r\n3 955 11819 7526 6274 \r\n3 4634 7921 9574 6275 \r\n3 4195 17913 7921 6275 \r\n3 267 9574 17913 6275 \r\n3 2631 12549 16572 6276 \r\n3 2973 16654 12549 6276 \r\n3 4694 16572 16654 6276 \r\n3 4545 17915 17914 6277 \r\n3 2112 13229 17915 6277 \r\n3 7 17914 13229 6277 \r\n3 1740 17916 13891 6278 \r\n3 4280 15134 17916 6278 \r\n3 1917 13891 15134 6278 \r\n3 425 7589 17838 6279 \r\n3 1568 10112 7589 6279 \r\n3 385 17838 10112 6279 \r\n3 3845 17917 17106 6280 \r\n3 36 10485 17917 6280 \r\n3 1682 17106 10485 6280 \r\n3 2669 6128 17685 6281 \r\n3 1924 17918 6128 6281 \r\n3 941 17685 17918 6281 \r\n3 1987 17444 13292 6282 \r\n3 3999 13789 17444 6282 \r\n3 692 13292 13789 6282 \r\n3 4850 8752 10387 6283 \r\n3 3311 10891 8752 6283 \r\n3 1017 10387 10891 6283 \r\n3 2487 6694 17920 6284 \r\n3 474 17919 6694 6284 \r\n3 183 17920 17919 6284 \r\n3 1082 5557 11161 6285 \r\n3 3755 17130 5557 6285 \r\n3 839 11161 17130 6285 \r\n3 1550 10255 9685 6286 \r\n3 3914 17921 10255 6286 \r\n3 1675 9685 17921 6286 \r\n3 282 8195 17240 6287 \r\n3 1374 17922 8195 6287 \r\n3 1805 17240 17922 6287 \r\n3 459 11832 14257 6288 \r\n3 3666 17923 11832 6288 \r\n3 1262 14257 17923 6288 \r\n3 4760 17344 12052 6289 \r\n3 4792 17924 17344 6289 \r\n3 2027 12052 17924 6289 \r\n3 1727 7612 17926 6290 \r\n3 3189 17925 7612 6290 \r\n3 2410 17926 17925 6290 \r\n3 2518 15960 11099 6291 \r\n3 3526 13991 15960 6291 \r\n3 3756 11099 13991 6291 \r\n3 2102 12197 6183 6292 \r\n3 3422 12024 12197 6292 \r\n3 3337 6183 12024 6292 \r\n3 4628 17929 17928 6293 \r\n3 1143 17927 17929 6293 \r\n3 4911 17928 17927 6293 \r\n3 684 17930 11151 6294 \r\n3 4596 12189 17930 6294 \r\n3 3713 11151 12189 6294 \r\n3 4779 17932 17633 6295 \r\n3 4185 17931 17932 6295 \r\n3 4860 17633 17931 6295 \r\n3 4994 17934 17933 6296 \r\n3 1854 16581 17934 6296 \r\n3 3545 17933 16581 6296 \r\n3 3109 14157 17935 6297 \r\n3 1579 17025 14157 6297 \r\n3 2426 17935 17025 6297 \r\n3 4838 17937 17936 6298 \r\n3 3085 12484 17937 6298 \r\n3 4461 17936 12484 6298 \r\n3 4406 17939 5317 6299 \r\n3 4226 17938 17939 6299 \r\n3 4490 5317 17938 6299 \r\n3 3264 6446 11689 6300 \r\n3 4387 14314 6446 6300 \r\n3 4810 11689 14314 6300 \r\n3 1414 17942 17941 6301 \r\n3 269 17940 17942 6301 \r\n3 4260 17941 17940 6301 \r\n3 2859 17944 17943 6302 \r\n3 4115 14661 17944 6302 \r\n3 635 17943 14661 6302 \r\n3 2565 12425 17718 6303 \r\n3 1297 17945 12425 6303 \r\n3 2399 17718 17945 6303 \r\n3 760 13644 9273 6304 \r\n3 4997 16405 13644 6304 \r\n3 973 9273 16405 6304 \r\n3 115 17948 17947 6305 \r\n3 1660 17946 17948 6305 \r\n3 3773 17947 17946 6305 \r\n3 2582 17949 6683 6306 \r\n3 2272 13054 17949 6306 \r\n3 1364 6683 13054 6306 \r\n3 717 13616 17951 6307 \r\n3 3538 17950 13616 6307 \r\n3 4963 17951 17950 6307 \r\n3 1522 16504 9646 6308 \r\n3 3979 6038 16504 6308 \r\n3 3953 9646 6038 6308 \r\n3 1483 17116 11454 6309 \r\n3 2891 8486 17116 6309 \r\n3 4663 11454 8486 6309 \r\n3 970 17952 16851 6310 \r\n3 2354 9877 17952 6310 \r\n3 1373 16851 9877 6310 \r\n3 2752 17953 9456 6311 \r\n3 3474 13848 17953 6311 \r\n3 4504 9456 13848 6311 \r\n3 831 17955 17954 6312 \r\n3 3278 16415 17955 6312 \r\n3 1433 17954 16415 6312 \r\n3 2536 16666 12501 6313 \r\n3 3364 16638 16666 6313 \r\n3 2760 12501 16638 6313 \r\n3 3880 17957 17956 6314 \r\n3 2820 14212 17957 6314 \r\n3 4505 17956 14212 6314 \r\n3 595 9343 17554 6315 \r\n3 2063 17958 9343 6315 \r\n3 3835 17554 17958 6315 \r\n3 4506 17960 17959 6316 \r\n3 1758 17788 17960 6316 \r\n3 1515 17959 17788 6316 \r\n3 50 17961 12887 6317 \r\n3 3961 10470 17961 6317 \r\n3 1196 12887 10470 6317 \r\n3 2394 17962 7301 6318 \r\n3 3167 14968 17962 6318 \r\n3 1160 7301 14968 6318 \r\n3 3545 17963 17933 6319 \r\n3 3462 5541 17963 6319 \r\n3 4994 17933 5541 6319 \r\n3 2422 15560 17965 6320 \r\n3 2510 17964 15560 6320 \r\n3 2684 17965 17964 6320 \r\n3 736 10374 7887 6321 \r\n3 3301 9341 10374 6321 \r\n3 595 7887 9341 6321 \r\n3 249 5645 14700 6322 \r\n3 697 17966 5645 6322 \r\n3 168 14700 17966 6322 \r\n3 1376 16424 9009 6323 \r\n3 3058 17967 16424 6323 \r\n3 3761 9009 17967 6323 \r\n3 1560 16936 17622 6324 \r\n3 665 11398 16936 6324 \r\n3 3886 17622 11398 6324 \r\n3 62 17969 17968 6325 \r\n3 256 13542 17969 6325 \r\n3 590 17968 13542 6325 \r\n3 2866 12398 8668 6326 \r\n3 707 5612 12398 6326 \r\n3 4031 8668 5612 6326 \r\n3 4550 15456 13278 6327 \r\n3 1758 17960 15456 6327 \r\n3 4506 13278 17960 6327 \r\n3 2994 17971 17589 6328 \r\n3 3723 17970 17971 6328 \r\n3 3423 17589 17970 6328 \r\n3 404 13326 17973 6329 \r\n3 4041 17972 13326 6329 \r\n3 2036 17973 17972 6329 \r\n3 3951 13064 7691 6330 \r\n3 1239 9112 13064 6330 \r\n3 126 7691 9112 6330 \r\n3 3245 17976 17975 6331 \r\n3 734 17974 17976 6331 \r\n3 350 17975 17974 6331 \r\n3 1279 8536 13544 6332 \r\n3 4988 9625 8536 6332 \r\n3 590 13544 9625 6332 \r\n3 2651 14252 17978 6333 \r\n3 2216 17977 14252 6333 \r\n3 1122 17978 17977 6333 \r\n3 3758 11281 9194 6334 \r\n3 1124 15283 11281 6334 \r\n3 2421 9194 15283 6334 \r\n3 1099 17981 17980 6335 \r\n3 3510 17979 17981 6335 \r\n3 2939 17980 17979 6335 \r\n3 3031 17982 8395 6336 \r\n3 4587 11014 17982 6336 \r\n3 1052 8395 11014 6336 \r\n3 3631 17983 10781 6337 \r\n3 1739 13058 17983 6337 \r\n3 4884 10781 13058 6337 \r\n3 3925 17984 12590 6338 \r\n3 1037 16466 17984 6338 \r\n3 4560 12590 16466 6338 \r\n3 4064 17985 5177 6339 \r\n3 2146 16537 17985 6339 \r\n3 1095 5177 16537 6339 \r\n3 3288 13579 7193 6340 \r\n3 4825 16701 13579 6340 \r\n3 2109 7193 16701 6340 \r\n3 2836 17988 17987 6341 \r\n3 1931 17986 17988 6341 \r\n3 1670 17987 17986 6341 \r\n3 3357 17990 17989 6342 \r\n3 4262 17853 17990 6342 \r\n3 1245 17989 17853 6342 \r\n3 4016 13133 17992 6343 \r\n3 333 17991 13133 6343 \r\n3 4418 17992 17991 6343 \r\n3 2495 16763 6328 6344 \r\n3 2463 16908 16763 6344 \r\n3 1445 6328 16908 6344 \r\n3 4035 14141 14866 6345 \r\n3 478 15226 14141 6345 \r\n3 4597 14866 15226 6345 \r\n3 3218 11039 15448 6346 \r\n3 4617 17993 11039 6346 \r\n3 3983 15448 17993 6346 \r\n3 4438 17995 14740 6347 \r\n3 2563 17994 17995 6347 \r\n3 937 14740 17994 6347 \r\n3 2574 14024 17996 6348 \r\n3 4895 6613 14024 6348 \r\n3 2320 17996 6613 6348 \r\n3 497 17998 17997 6349 \r\n3 3409 5828 17998 6349 \r\n3 3771 17997 5828 6349 \r\n3 2077 18000 16091 6350 \r\n3 1449 17999 18000 6350 \r\n3 3059 16091 17999 6350 \r\n3 2215 18001 5183 6351 \r\n3 1226 17750 18001 6351 \r\n3 4419 5183 17750 6351 \r\n3 3557 14988 18002 6352 \r\n3 998 9751 14988 6352 \r\n3 3960 18002 9751 6352 \r\n3 1710 11001 8276 6353 \r\n3 838 14268 11001 6353 \r\n3 2037 8276 14268 6353 \r\n3 2401 9285 18004 6354 \r\n3 3727 18003 9285 6354 \r\n3 4216 18004 18003 6354 \r\n3 972 9857 5663 6355 \r\n3 2440 10831 9857 6355 \r\n3 2168 5663 10831 6355 \r\n3 2411 18005 17095 6356 \r\n3 627 13204 18005 6356 \r\n3 2126 17095 13204 6356 \r\n3 1489 18008 18007 6357 \r\n3 111 18006 18008 6357 \r\n3 2185 18007 18006 6357 \r\n3 1447 18009 12667 6358 \r\n3 4818 9142 18009 6358 \r\n3 2078 12667 9142 6358 \r\n3 3172 9309 6317 6359 \r\n3 400 17179 9309 6359 \r\n3 1895 6317 17179 6359 \r\n3 960 18011 18010 6360 \r\n3 1793 7116 18011 6360 \r\n3 616 18010 7116 6360 \r\n3 3788 15509 8295 6361 \r\n3 981 15884 15509 6361 \r\n3 733 8295 15884 6361 \r\n3 2821 10643 18012 6362 \r\n3 2656 9163 10643 6362 \r\n3 4306 18012 9163 6362 \r\n3 2617 16104 11748 6363 \r\n3 254 18013 16104 6363 \r\n3 2349 11748 18013 6363 \r\n3 4011 17258 15583 6364 \r\n3 1591 16702 17258 6364 \r\n3 207 15583 16702 6364 \r\n3 2043 18015 16118 6365 \r\n3 2663 18014 18015 6365 \r\n3 1476 16118 18014 6365 \r\n3 4396 5564 5871 6366 \r\n3 149 16849 5564 6366 \r\n3 3954 5871 16849 6366 \r\n3 4320 18016 17706 6367 \r\n3 1218 16179 18016 6367 \r\n3 2009 17706 16179 6367 \r\n3 3947 18017 7303 6368 \r\n3 1487 13358 18017 6368 \r\n3 2394 7303 13358 6368 \r\n3 4718 18018 11351 6369 \r\n3 3152 13781 18018 6369 \r\n3 901 11351 13781 6369 \r\n3 309 11826 18019 6370 \r\n3 4152 16345 11826 6370 \r\n3 2430 18019 16345 6370 \r\n3 1144 16894 9448 6371 \r\n3 744 5229 16894 6371 \r\n3 302 9448 5229 6371 \r\n3 3964 7321 6263 6372 \r\n3 4896 18020 7321 6372 \r\n3 2196 6263 18020 6372 \r\n3 1618 18022 18021 6373 \r\n3 1749 7025 18022 6373 \r\n3 2584 18021 7025 6373 \r\n3 2242 18023 17597 6374 \r\n3 2905 15738 18023 6374 \r\n3 1483 17597 15738 6374 \r\n3 520 9588 11460 6375 \r\n3 3584 11250 9588 6375 \r\n3 1149 11460 11250 6375 \r\n3 1046 18025 18024 6376 \r\n3 3447 15058 18025 6376 \r\n3 139 18024 15058 6376 \r\n3 59 6048 18026 6377 \r\n3 3017 17401 6048 6377 \r\n3 1576 18026 17401 6377 \r\n3 4454 18028 14092 6378 \r\n3 1448 18027 18028 6378 \r\n3 1370 14092 18027 6378 \r\n3 1289 18030 11968 6379 \r\n3 6 18029 18030 6379 \r\n3 1764 11968 18029 6379 \r\n3 294 9416 13525 6380 \r\n3 851 11916 9416 6380 \r\n3 1107 13525 11916 6380 \r\n3 4355 14612 18031 6381 \r\n3 1051 16925 14612 6381 \r\n3 2277 18031 16925 6381 \r\n3 4136 8697 16605 6382 \r\n3 4341 17702 8697 6382 \r\n3 4863 16605 17702 6382 \r\n3 220 18032 17416 6383 \r\n3 1234 10832 18032 6383 \r\n3 3250 17416 10832 6383 \r\n3 1773 12201 7034 6384 \r\n3 3175 18033 12201 6384 \r\n3 985 7034 18033 6384 \r\n3 4006 18034 16056 6385 \r\n3 3946 16267 18034 6385 \r\n3 2685 16056 16267 6385 \r\n3 347 18036 5140 6386 \r\n3 4710 18035 18036 6386 \r\n3 2118 5140 18035 6386 \r\n3 1094 10325 13977 6387 \r\n3 3172 10507 10325 6387 \r\n3 1778 13977 10507 6387 \r\n3 4929 18037 16973 6388 \r\n3 647 10403 18037 6388 \r\n3 2671 16973 10403 6388 \r\n3 1687 16883 18039 6389 \r\n3 4391 18038 16883 6389 \r\n3 1139 18039 18038 6389 \r\n3 3011 18040 15645 6390 \r\n3 3343 5673 18040 6390 \r\n3 920 15645 5673 6390 \r\n3 3098 10941 13448 6391 \r\n3 903 18041 10941 6391 \r\n3 2740 13448 18041 6391 \r\n3 86 12920 12984 6392 \r\n3 4132 18042 12920 6392 \r\n3 2240 12984 18042 6392 \r\n3 3906 13287 8415 6393 \r\n3 929 18043 13287 6393 \r\n3 4188 8415 18043 6393 \r\n3 2276 18044 7296 6394 \r\n3 960 18010 18044 6394 \r\n3 616 7296 18010 6394 \r\n3 3274 17873 15303 6395 \r\n3 307 12415 17873 6395 \r\n3 308 15303 12415 6395 \r\n3 2207 8869 7082 6396 \r\n3 3809 7882 8869 6396 \r\n3 3367 7082 7882 6396 \r\n3 535 15280 6771 6397 \r\n3 1486 15834 15280 6397 \r\n3 508 6771 15834 6397 \r\n3 4323 8870 18045 6398 \r\n3 2207 14000 8870 6398 \r\n3 3942 18045 14000 6398 \r\n3 4494 17637 18046 6399 \r\n3 3655 16395 17637 6399 \r\n3 114 18046 16395 6399 \r\n3 931 10508 18047 6400 \r\n3 1372 13511 10508 6400 \r\n3 176 18047 13511 6400 \r\n3 8 18050 18049 6401 \r\n3 3357 18048 18050 6401 \r\n3 1676 18049 18048 6401 \r\n3 153 12292 13373 6402 \r\n3 2532 5405 12292 6402 \r\n3 2359 13373 5405 6402 \r\n3 840 10696 15519 6403 \r\n3 4152 18051 10696 6403 \r\n3 3081 15519 18051 6403 \r\n3 3724 18053 18052 6404 \r\n3 4373 14402 18053 6404 \r\n3 4712 18052 14402 6404 \r\n3 1534 18056 18055 6405 \r\n3 4489 18054 18056 6405 \r\n3 4908 18055 18054 6405 \r\n3 2868 16699 18057 6406 \r\n3 102 15531 16699 6406 \r\n3 2950 18057 15531 6406 \r\n3 824 18059 18058 6407 \r\n3 910 8236 18059 6407 \r\n3 124 18058 8236 6407 \r\n3 1884 9299 18061 6408 \r\n3 3119 18060 9299 6408 \r\n3 1725 18061 18060 6408 \r\n3 2680 18063 13712 6409 \r\n3 4106 18062 18063 6409 \r\n3 3412 13712 18062 6409 \r\n3 2618 16588 18065 6410 \r\n3 4829 18064 16588 6410 \r\n3 4702 18065 18064 6410 \r\n3 3971 18066 14545 6411 \r\n3 3793 10415 18066 6411 \r\n3 4941 14545 10415 6411 \r\n3 3959 18068 9004 6412 \r\n3 3160 18067 18068 6412 \r\n3 1842 9004 18067 6412 \r\n3 1909 17824 18070 6413 \r\n3 1548 18069 17824 6413 \r\n3 2071 18070 18069 6413 \r\n3 3126 12248 13050 6414 \r\n3 406 17609 12248 6414 \r\n3 4565 13050 17609 6414 \r\n3 316 8340 18071 6415 \r\n3 4507 7478 8340 6415 \r\n3 3464 18071 7478 6415 \r\n3 4450 18073 18072 6416 \r\n3 2655 8224 18073 6416 \r\n3 2089 18072 8224 6416 \r\n3 1976 7356 16606 6417 \r\n3 1302 7996 7356 6417 \r\n3 4070 16606 7996 6417 \r\n3 3661 6970 15190 6418 \r\n3 1792 18074 6970 6418 \r\n3 4850 15190 18074 6418 \r\n3 4754 14412 15602 6419 \r\n3 2777 15550 14412 6419 \r\n3 1016 15602 15550 6419 \r\n3 921 18075 14198 6420 \r\n3 1147 12793 18075 6420 \r\n3 1598 14198 12793 6420 \r\n3 1017 18078 18077 6421 \r\n3 4949 18076 18078 6421 \r\n3 1783 18077 18076 6421 \r\n3 3884 17558 14782 6422 \r\n3 2225 18079 17558 6422 \r\n3 1383 14782 18079 6422 \r\n3 2695 13513 11593 6423 \r\n3 3907 15480 13513 6423 \r\n3 91 11593 15480 6423 \r\n3 3652 17101 6777 6424 \r\n3 3033 14549 17101 6424 \r\n3 3134 6777 14549 6424 \r\n3 1357 18081 16509 6425 \r\n3 526 18080 18081 6425 \r\n3 4246 16509 18080 6425 \r\n3 3649 12648 12336 6426 \r\n3 326 11579 12648 6426 \r\n3 3820 12336 11579 6426 \r\n3 1299 18083 18082 6427 \r\n3 1506 17855 18083 6427 \r\n3 2379 18082 17855 6427 \r\n3 1563 11870 13953 6428 \r\n3 2422 7415 11870 6428 \r\n3 1386 13953 7415 6428 \r\n3 2167 18086 18085 6429 \r\n3 211 18084 18086 6429 \r\n3 1324 18085 18084 6429 \r\n3 1360 12720 13881 6430 \r\n3 2829 6218 12720 6430 \r\n3 3532 13881 6218 6430 \r\n3 1060 16461 14364 6431 \r\n3 4121 18087 16461 6431 \r\n3 433 14364 18087 6431 \r\n3 3222 18090 18089 6432 \r\n3 713 18088 18090 6432 \r\n3 3092 18089 18088 6432 \r\n3 2568 13245 16251 6433 \r\n3 3599 18091 13245 6433 \r\n3 1008 16251 18091 6433 \r\n3 4658 18093 11339 6434 \r\n3 1273 18092 18093 6434 \r\n3 2773 11339 18092 6434 \r\n3 1660 18095 17946 6435 \r\n3 209 18094 18095 6435 \r\n3 3773 17946 18094 6435 \r\n3 918 7648 9742 6436 \r\n3 3378 18096 7648 6436 \r\n3 3582 9742 18096 6436 \r\n3 2101 15628 18097 6437 \r\n3 4239 13461 15628 6437 \r\n3 4286 18097 13461 6437 \r\n3 3548 18098 7273 6438 \r\n3 2008 14674 18098 6438 \r\n3 1379 7273 14674 6438 \r\n3 186 5703 17738 6439 \r\n3 3397 9623 5703 6439 \r\n3 4988 17738 9623 6439 \r\n3 3930 16970 11071 6440 \r\n3 3004 5850 16970 6440 \r\n3 2347 11071 5850 6440 \r\n3 4197 13056 12234 6441 \r\n3 2964 18099 13056 6441 \r\n3 4087 12234 18099 6441 \r\n3 2692 18101 18100 6442 \r\n3 1456 10243 18101 6442 \r\n3 1015 18100 10243 6442 \r\n3 2069 18102 13777 6443 \r\n3 822 8973 18102 6443 \r\n3 2017 13777 8973 6443 \r\n3 2006 18104 12502 6444 \r\n3 3036 18103 18104 6444 \r\n3 1595 12502 18103 6444 \r\n3 3446 18105 9045 6445 \r\n3 812 11564 18105 6445 \r\n3 3772 9045 11564 6445 \r\n3 480 18107 18106 6446 \r\n3 3750 7130 18107 6446 \r\n3 1819 18106 7130 6446 \r\n3 3074 18108 17482 6447 \r\n3 1656 12310 18108 6447 \r\n3 2473 17482 12310 6447 \r\n3 4601 18110 9598 6448 \r\n3 2409 18109 18110 6448 \r\n3 2448 9598 18109 6448 \r\n3 4967 5855 13403 6449 \r\n3 3816 18111 5855 6449 \r\n3 1350 13403 18111 6449 \r\n3 3774 17049 10583 6450 \r\n3 4043 14874 17049 6450 \r\n3 4651 10583 14874 6450 \r\n3 3972 18112 15559 6451 \r\n3 3083 12952 18112 6451 \r\n3 2642 15559 12952 6451 \r\n3 1646 12439 15467 6452 \r\n3 4499 6170 12439 6452 \r\n3 3751 15467 6170 6452 \r\n3 1804 18113 10477 6453 \r\n3 886 12797 18113 6453 \r\n3 2834 10477 12797 6453 \r\n3 3809 7151 7883 6454 \r\n3 4007 18114 7151 6454 \r\n3 3492 7883 18114 6454 \r\n3 517 16800 17753 6455 \r\n3 4823 10967 16800 6455 \r\n3 2854 17753 10967 6455 \r\n3 104 16483 17006 6456 \r\n3 4664 8080 16483 6456 \r\n3 99 17006 8080 6456 \r\n3 4139 18116 6685 6457 \r\n3 3624 18115 18116 6457 \r\n3 979 6685 18115 6457 \r\n3 4323 18045 11889 6458 \r\n3 3942 18117 18045 6458 \r\n3 3929 11889 18117 6458 \r\n3 1355 5811 17056 6459 \r\n3 1152 18118 5811 6459 \r\n3 4624 17056 18118 6459 \r\n3 1406 18120 14074 6460 \r\n3 3634 18119 18120 6460 \r\n3 863 14074 18119 6460 \r\n3 902 18122 17875 6461 \r\n3 672 18121 18122 6461 \r\n3 2636 17875 18121 6461 \r\n3 4007 12431 18114 6462 \r\n3 740 14470 12431 6462 \r\n3 3492 18114 14470 6462 \r\n3 1064 12315 15891 6463 \r\n3 1717 18123 12315 6463 \r\n3 4542 15891 18123 6463 \r\n3 3983 17993 18125 6464 \r\n3 4617 18124 17993 6464 \r\n3 1958 18125 18124 6464 \r\n3 3633 18127 12407 6465 \r\n3 4137 18126 18127 6465 \r\n3 4298 12407 18126 6465 \r\n3 2396 15975 18129 6466 \r\n3 4776 18128 15975 6466 \r\n3 2004 18129 18128 6466 \r\n3 817 18131 15564 6467 \r\n3 4866 18130 18131 6467 \r\n3 4074 15564 18130 6467 \r\n3 3993 14058 18133 6468 \r\n3 3695 18132 14058 6468 \r\n3 3547 18133 18132 6468 \r\n3 1102 18135 18134 6469 \r\n3 1842 18067 18135 6469 \r\n3 3160 18134 18067 6469 \r\n3 789 13433 8671 6470 \r\n3 4897 16760 13433 6470 \r\n3 3079 8671 16760 6470 \r\n3 766 17169 18136 6471 \r\n3 3589 13694 17169 6471 \r\n3 1363 18136 13694 6471 \r\n3 2044 15020 10710 6472 \r\n3 2725 8859 15020 6472 \r\n3 4122 10710 8859 6472 \r\n3 3812 16660 7747 6473 \r\n3 3332 18137 16660 6473 \r\n3 3818 7747 18137 6473 \r\n3 3881 8489 17761 6474 \r\n3 338 10367 8489 6474 \r\n3 2024 17761 10367 6474 \r\n3 2227 18139 15636 6475 \r\n3 3112 18138 18139 6475 \r\n3 823 15636 18138 6475 \r\n3 3956 6228 8846 6476 \r\n3 3194 18140 6228 6476 \r\n3 4083 8846 18140 6476 \r\n3 4631 18141 13987 6477 \r\n3 254 6366 18141 6477 \r\n3 2985 13987 6366 6477 \r\n3 270 14690 18142 6478 \r\n3 2245 17469 14690 6478 \r\n3 1658 18142 17469 6478 \r\n3 960 12863 18011 6479 \r\n3 3658 18143 12863 6479 \r\n3 1793 18011 18143 6479 \r\n3 3468 10232 14705 6480 \r\n3 235 12772 10232 6480 \r\n3 4935 14705 12772 6480 \r\n3 534 17035 18144 6481 \r\n3 962 7831 17035 6481 \r\n3 2942 18144 7831 6481 \r\n3 661 14476 18145 6482 \r\n3 1611 12748 14476 6482 \r\n3 1156 18145 12748 6482 \r\n3 220 18147 18032 6483 \r\n3 869 18146 18147 6483 \r\n3 1234 18032 18146 6483 \r\n3 423 18149 18148 6484 \r\n3 4923 17428 18149 6484 \r\n3 13 18148 17428 6484 \r\n3 2877 5932 8634 6485 \r\n3 1303 18150 5932 6485 \r\n3 246 8634 18150 6485 \r\n3 3275 5089 18152 6486 \r\n3 4896 18151 5089 6486 \r\n3 2413 18152 18151 6486 \r\n3 4252 12912 18154 6487 \r\n3 3244 18153 12912 6487 \r\n3 1531 18154 18153 6487 \r\n3 1830 17576 18155 6488 \r\n3 1618 18021 17576 6488 \r\n3 2584 18155 18021 6488 \r\n3 2772 18158 18157 6489 \r\n3 4199 18156 18158 6489 \r\n3 763 18157 18156 6489 \r\n3 4630 18159 10067 6490 \r\n3 3723 13668 18159 6490 \r\n3 991 10067 13668 6490 \r\n3 3424 14748 17204 6491 \r\n3 1120 18160 14748 6491 \r\n3 2151 17204 18160 6491 \r\n3 2007 18162 12093 6492 \r\n3 2991 18161 18162 6492 \r\n3 3379 12093 18161 6492 \r\n3 2934 6693 9717 6493 \r\n3 280 14086 6693 6493 \r\n3 116 9717 14086 6493 \r\n3 4391 16052 16964 6494 \r\n3 3309 18163 16052 6494 \r\n3 1724 16964 18163 6494 \r\n3 2704 16120 18165 6495 \r\n3 918 18164 16120 6495 \r\n3 1993 18165 18164 6495 \r\n3 2145 13501 18166 6496 \r\n3 2167 18085 13501 6496 \r\n3 1324 18166 18085 6496 \r\n3 4840 18168 18167 6497 \r\n3 4422 11990 18168 6497 \r\n3 4366 18167 11990 6497 \r\n3 1843 18170 18169 6498 \r\n3 4502 6962 18170 6498 \r\n3 994 18169 6962 6498 \r\n3 2137 16412 16225 6499 \r\n3 4981 5943 16412 6499 \r\n3 1292 16225 5943 6499 \r\n3 4157 14498 18171 6500 \r\n3 382 16921 14498 6500 \r\n3 2124 18171 16921 6500 \r\n3 1170 17507 18172 6501 \r\n3 1305 6789 17507 6501 \r\n3 1990 18172 6789 6501 \r\n3 3877 18175 18174 6502 \r\n3 3892 18173 18175 6502 \r\n3 444 18174 18173 6502 \r\n3 2542 18177 18176 6503 \r\n3 1993 16391 18177 6503 \r\n3 1409 18176 16391 6503 \r\n3 1119 15007 17835 6504 \r\n3 710 18178 15007 6504 \r\n3 1726 17835 18178 6504 \r\n3 4288 17739 15272 6505 \r\n3 3268 12007 17739 6505 \r\n3 3077 15272 12007 6505 \r\n3 3457 18180 18179 6506 \r\n3 3159 8409 18180 6506 \r\n3 4465 18179 8409 6506 \r\n3 3866 18181 7835 6507 \r\n3 396 15061 18181 6507 \r\n3 4343 7835 15061 6507 \r\n3 1419 18183 18182 6508 \r\n3 1566 16764 18183 6508 \r\n3 2911 18182 16764 6508 \r\n3 2050 17770 15992 6509 \r\n3 4023 18184 17770 6509 \r\n3 4315 15992 18184 6509 \r\n3 564 17375 14375 6510 \r\n3 233 6036 17375 6510 \r\n3 944 14375 6036 6510 \r\n3 794 18186 14120 6511 \r\n3 4177 18185 18186 6511 \r\n3 4661 14120 18185 6511 \r\n3 3453 5170 15840 6512 \r\n3 2651 17978 5170 6512 \r\n3 1122 15840 17978 6512 \r\n3 2222 6927 11123 6513 \r\n3 4496 18187 6927 6513 \r\n3 2675 11123 18187 6513 \r\n3 1600 13902 18189 6514 \r\n3 1304 18188 13902 6514 \r\n3 610 18189 18188 6514 \r\n3 15 12881 10637 6515 \r\n3 3674 15872 12881 6515 \r\n3 4148 10637 15872 6515 \r\n3 1827 6749 18190 6516 \r\n3 4649 15929 6749 6516 \r\n3 1521 18190 15929 6516 \r\n3 2799 14719 18192 6517 \r\n3 1638 18191 14719 6517 \r\n3 3402 18192 18191 6517 \r\n3 386 18194 17309 6518 \r\n3 4385 18193 18194 6518 \r\n3 4281 17309 18193 6518 \r\n3 4039 6056 18195 6519 \r\n3 3626 8821 6056 6519 \r\n3 3370 18195 8821 6519 \r\n3 2845 5767 17117 6520 \r\n3 3815 15744 5767 6520 \r\n3 2955 17117 15744 6520 \r\n3 636 18196 15079 6521 \r\n3 4622 11340 18196 6521 \r\n3 1526 15079 11340 6521 \r\n3 2452 14215 17248 6522 \r\n3 1630 16599 14215 6522 \r\n3 2371 17248 16599 6522 \r\n3 4900 14678 15376 6523 \r\n3 4269 18197 14678 6523 \r\n3 829 15376 18197 6523 \r\n3 1994 17531 18198 6524 \r\n3 335 16390 17531 6524 \r\n3 1380 18198 16390 6524 \r\n3 4628 18199 17929 6525 \r\n3 990 11604 18199 6525 \r\n3 1143 17929 11604 6525 \r\n3 3478 9657 10565 6526 \r\n3 1427 14627 9657 6526 \r\n3 4258 10565 14627 6526 \r\n3 3107 18201 13773 6527 \r\n3 3170 18200 18201 6527 \r\n3 1922 13773 18200 6527 \r\n3 4361 7253 9597 6528 \r\n3 3991 18202 7253 6528 \r\n3 1530 9597 18202 6528 \r\n3 4437 16278 14681 6529 \r\n3 297 15225 16278 6529 \r\n3 4922 14681 15225 6529 \r\n3 3412 18203 16589 6530 \r\n3 4191 8553 18203 6530 \r\n3 3736 16589 8553 6530 \r\n3 119 5311 17470 6531 \r\n3 1623 15118 5311 6531 \r\n3 852 17470 15118 6531 \r\n3 3032 18204 11527 6532 \r\n3 2755 12641 18204 6532 \r\n3 2670 11527 12641 6532 \r\n3 797 15749 18205 6533 \r\n3 612 16206 15749 6533 \r\n3 2383 18205 16206 6533 \r\n3 385 18206 16724 6534 \r\n3 4720 17245 18206 6534 \r\n3 956 16724 17245 6534 \r\n3 292 12942 13586 6535 \r\n3 2376 8001 12942 6535 \r\n3 2665 13586 8001 6535 \r\n3 3159 18208 8407 6536 \r\n3 438 18207 18208 6536 \r\n3 3955 8407 18207 6536 \r\n3 1293 14357 7938 6537 \r\n3 576 18209 14357 6537 \r\n3 4433 7938 18209 6537 \r\n3 3515 18211 17812 6538 \r\n3 3445 18210 18211 6538 \r\n3 446 17812 18210 6538 \r\n3 782 18214 18213 6539 \r\n3 2250 18212 18214 6539 \r\n3 560 18213 18212 6539 \r\n3 3231 18215 12714 6540 \r\n3 4108 11720 18215 6540 \r\n3 4556 12714 11720 6540 \r\n3 913 11193 17860 6541 \r\n3 4841 18216 11193 6541 \r\n3 2120 17860 18216 6541 \r\n3 4210 15889 6988 6542 \r\n3 4542 14737 15889 6542 \r\n3 1628 6988 14737 6542 \r\n3 2271 18217 16343 6543 \r\n3 156 17247 18217 6543 \r\n3 3810 16343 17247 6543 \r\n3 3439 18218 17745 6544 \r\n3 3497 13629 18218 6544 \r\n3 4028 17745 13629 6544 \r\n3 548 17887 16780 6545 \r\n3 2427 18219 17887 6545 \r\n3 3050 16780 18219 6545 \r\n3 3815 12174 18220 6546 \r\n3 2921 16697 12174 6546 \r\n3 2291 18220 16697 6546 \r\n3 3304 7388 16129 6547 \r\n3 2160 16221 7388 6547 \r\n3 3006 16129 16221 6547 \r\n3 2494 6234 12405 6548 \r\n3 1418 16060 6234 6548 \r\n3 4898 12405 16060 6548 \r\n3 4756 7037 18221 6549 \r\n3 4880 16979 7037 6549 \r\n3 2401 18221 16979 6549 \r\n3 3924 16396 7642 6550 \r\n3 819 18222 16396 6550 \r\n3 4838 7642 18222 6550 \r\n3 1250 18223 12857 6551 \r\n3 3342 6471 18223 6551 \r\n3 988 12857 6471 6551 \r\n3 2509 16439 12270 6552 \r\n3 1757 18224 16439 6552 \r\n3 4893 12270 18224 6552 \r\n3 2796 17830 5788 6553 \r\n3 4814 7002 17830 6553 \r\n3 1177 5788 7002 6553 \r\n3 3786 7013 6095 6554 \r\n3 552 18225 7013 6554 \r\n3 4093 6095 18225 6554 \r\n3 2289 18227 18226 6555 \r\n3 802 8048 18227 6555 \r\n3 1394 18226 8048 6555 \r\n3 4378 13136 11326 6556 \r\n3 4227 14929 13136 6556 \r\n3 3908 11326 14929 6556 \r\n3 4544 18229 18228 6557 \r\n3 3760 16842 18229 6557 \r\n3 4317 18228 16842 6557 \r\n3 2427 18232 18231 6558 \r\n3 2560 18230 18232 6558 \r\n3 4123 18231 18230 6558 \r\n3 4106 11385 18062 6559 \r\n3 4191 18203 11385 6559 \r\n3 3412 18062 18203 6559 \r\n3 3214 17649 18234 6560 \r\n3 3938 18233 17649 6560 \r\n3 1813 18234 18233 6560 \r\n3 4587 17982 18235 6561 \r\n3 3031 13255 17982 6561 \r\n3 1400 18235 13255 6561 \r\n3 4071 18236 9847 6562 \r\n3 721 13312 18236 6562 \r\n3 1217 9847 13312 6562 \r\n3 4698 18237 12015 6563 \r\n3 2255 10559 18237 6563 \r\n3 4463 12015 10559 6563 \r\n3 3585 16166 16594 6564 \r\n3 1720 10558 16166 6564 \r\n3 2255 16594 10558 6564 \r\n3 2171 12487 11580 6565 \r\n3 3353 18238 12487 6565 \r\n3 774 11580 18238 6565 \r\n3 3805 7134 14166 6566 \r\n3 971 14746 7134 6566 \r\n3 970 14166 14746 6566 \r\n3 1048 15285 8623 6567 \r\n3 4032 15584 15285 6567 \r\n3 4966 8623 15584 6567 \r\n3 701 10230 11090 6568 \r\n3 3936 18239 10230 6568 \r\n3 3923 11090 18239 6568 \r\n3 146 15964 15657 6569 \r\n3 724 18240 15964 6569 \r\n3 1612 15657 18240 6569 \r\n3 682 18242 18241 6570 \r\n3 1722 7755 18242 6570 \r\n3 604 18241 7755 6570 \r\n3 4894 18243 10799 6571 \r\n3 3114 7280 18243 6571 \r\n3 2640 10799 7280 6571 \r\n3 2271 15502 17889 6572 \r\n3 741 13966 15502 6572 \r\n3 4160 17889 13966 6572 \r\n3 2613 15424 15363 6573 \r\n3 1846 18244 15424 6573 \r\n3 477 15363 18244 6573 \r\n3 4402 18245 13304 6574 \r\n3 3837 12816 18245 6574 \r\n3 1454 13304 12816 6574 \r\n3 1474 18246 16239 6575 \r\n3 2897 13316 18246 6575 \r\n3 4194 16239 13316 6575 \r\n3 4055 18247 11233 6576 \r\n3 501 12147 18247 6576 \r\n3 1490 11233 12147 6576 \r\n3 4235 10480 16693 6577 \r\n3 3249 16853 10480 6577 \r\n3 540 16693 16853 6577 \r\n3 4328 18248 14814 6578 \r\n3 3293 14900 18248 6578 \r\n3 3605 14814 14900 6578 \r\n3 3705 6763 17688 6579 \r\n3 3411 17220 6763 6579 \r\n3 4212 17688 17220 6579 \r\n3 4153 18250 16984 6580 \r\n3 4534 18249 18250 6580 \r\n3 4786 16984 18249 6580 \r\n3 651 18253 18252 6581 \r\n3 4948 18251 18253 6581 \r\n3 4243 18252 18251 6581 \r\n3 711 7595 8566 6582 \r\n3 4433 18209 7595 6582 \r\n3 576 8566 18209 6582 \r\n3 4231 18255 7649 6583 \r\n3 2655 18254 18255 6583 \r\n3 3670 7649 18254 6583 \r\n3 1719 13355 18256 6584 \r\n3 3133 6626 13355 6584 \r\n3 3410 18256 6626 6584 \r\n3 1055 18258 17230 6585 \r\n3 31 18257 18258 6585 \r\n3 81 17230 18257 6585 \r\n3 2811 18259 17491 6586 \r\n3 4599 6148 18259 6586 \r\n3 582 17491 6148 6586 \r\n3 560 18261 18213 6587 \r\n3 672 18260 18261 6587 \r\n3 782 18213 18260 6587 \r\n3 3450 13754 17669 6588 \r\n3 1703 15817 13754 6588 \r\n3 4285 17669 15817 6588 \r\n3 6 10883 18262 6589 \r\n3 4211 12403 10883 6589 \r\n3 4958 18262 12403 6589 \r\n3 2224 16503 18264 6590 \r\n3 2672 18263 16503 6590 \r\n3 137 18264 18263 6590 \r\n3 1872 16366 16757 6591 \r\n3 1343 14572 16366 6591 \r\n3 4632 16757 14572 6591 \r\n3 1995 15672 13769 6592 \r\n3 1434 18265 15672 6592 \r\n3 4487 13769 18265 6592 \r\n3 685 18267 5100 6593 \r\n3 756 18266 18267 6593 \r\n3 2286 5100 18266 6593 \r\n3 2572 18269 18268 6594 \r\n3 4547 7985 18269 6594 \r\n3 1157 18268 7985 6594 \r\n3 2535 18271 16712 6595 \r\n3 227 18270 18271 6595 \r\n3 3023 16712 18270 6595 \r\n3 113 18272 5032 6596 \r\n3 3796 15205 18272 6596 \r\n3 4964 5032 15205 6596 \r\n3 1728 10855 16733 6597 \r\n3 4166 12447 10855 6597 \r\n3 4662 16733 12447 6597 \r\n3 1215 8528 15227 6598 \r\n3 429 18273 8528 6598 \r\n3 4597 15227 18273 6598 \r\n3 736 18275 18274 6599 \r\n3 3387 15596 18275 6599 \r\n3 3319 18274 15596 6599 \r\n3 2636 18277 15789 6600 \r\n3 1480 18276 18277 6600 \r\n3 1736 15789 18276 6600 \r\n3 1133 18279 18278 6601 \r\n3 4254 10075 18279 6601 \r\n3 4330 18278 10075 6601 \r\n3 2865 14594 18281 6602 \r\n3 3660 18280 14594 6602 \r\n3 154 18281 18280 6602 \r\n3 1301 13720 15279 6603 \r\n3 2476 18282 13720 6603 \r\n3 2522 15279 18282 6603 \r\n3 4931 18284 16442 6604 \r\n3 866 18283 18284 6604 \r\n3 1150 16442 18283 6604 \r\n3 3699 18286 10352 6605 \r\n3 3234 18285 18286 6605 \r\n3 3080 10352 18285 6605 \r\n3 1073 18288 18287 6606 \r\n3 4254 18279 18288 6606 \r\n3 1133 18287 18279 6606 \r\n3 3515 16686 18211 6607 \r\n3 3276 16906 16686 6607 \r\n3 3445 18211 16906 6607 \r\n3 1314 11395 6527 6608 \r\n3 4664 16482 11395 6608 \r\n3 1356 6527 16482 6608 \r\n3 4157 18171 17153 6609 \r\n3 2124 14537 18171 6609 \r\n3 247 17153 14537 6609 \r\n3 2917 7179 18290 6610 \r\n3 2140 18289 7179 6610 \r\n3 2515 18290 18289 6610 \r\n3 2082 18291 5012 6611 \r\n3 3430 9688 18291 6611 \r\n3 3783 5012 9688 6611 \r\n3 3483 17254 18292 6612 \r\n3 2172 15478 17254 6612 \r\n3 3156 18292 15478 6612 \r\n3 4006 18293 18034 6613 \r\n3 4330 15356 18293 6613 \r\n3 3946 18034 15356 6613 \r\n3 3848 17591 7010 6614 \r\n3 4770 18294 17591 6614 \r\n3 2489 7010 18294 6614 \r\n3 1618 17575 18295 6615 \r\n3 513 14593 17575 6615 \r\n3 1371 18295 14593 6615 \r\n3 2715 13090 15049 6616 \r\n3 1887 18296 13090 6616 \r\n3 4087 15049 18296 6616 \r\n3 2200 5539 17630 6617 \r\n3 1851 9461 5539 6617 \r\n3 2853 17630 9461 6617 \r\n3 1281 17164 18297 6618 \r\n3 1178 16101 17164 6618 \r\n3 3008 18297 16101 6618 \r\n3 541 18299 15601 6619 \r\n3 966 18298 18299 6619 \r\n3 4754 15601 18298 6619 \r\n3 826 18301 10659 6620 \r\n3 4386 18300 18301 6620 \r\n3 1344 10659 18300 6620 \r\n3 703 5980 18302 6621 \r\n3 42 13851 5980 6621 \r\n3 823 18302 13851 6621 \r\n3 2351 14993 9203 6622 \r\n3 85 12476 14993 6622 \r\n3 1973 9203 12476 6622 \r\n3 4382 18303 14132 6623 \r\n3 1695 8928 18303 6623 \r\n3 3303 14132 8928 6623 \r\n3 1485 10928 16444 6624 \r\n3 4092 15351 10928 6624 \r\n3 2519 16444 15351 6624 \r\n3 482 17394 18304 6625 \r\n3 4128 6168 17394 6625 \r\n3 4499 18304 6168 6625 \r\n3 4019 5733 18305 6626 \r\n3 3744 10598 5733 6626 \r\n3 489 18305 10598 6626 \r\n3 4019 13034 16887 6627 \r\n3 3063 16854 13034 6627 \r\n3 3249 16887 16854 6627 \r\n3 1634 18308 18307 6628 \r\n3 3239 18306 18308 6628 \r\n3 3260 18307 18306 6628 \r\n3 1675 18310 9686 6629 \r\n3 1188 18309 18310 6629 \r\n3 2885 9686 18309 6629 \r\n3 4362 18311 12566 6630 \r\n3 4420 12267 18311 6630 \r\n3 3541 12566 12267 6630 \r\n3 624 18313 10657 6631 \r\n3 2595 18312 18313 6631 \r\n3 276 10657 18312 6631 \r\n3 4191 11384 8554 6632 \r\n3 482 18314 11384 6632 \r\n3 1083 8554 18314 6632 \r\n3 1934 5133 14985 6633 \r\n3 3381 11162 5133 6633 \r\n3 839 14985 11162 6633 \r\n3 2148 18316 16722 6634 \r\n3 4278 18315 18316 6634 \r\n3 1782 16722 18315 6634 \r\n3 1236 18317 15263 6635 \r\n3 4381 10125 18317 6635 \r\n3 3731 15263 10125 6635 \r\n3 2735 13996 18318 6636 \r\n3 2968 7725 13996 6636 \r\n3 2046 18318 7725 6636 \r\n3 3478 15244 15831 6637 \r\n3 4999 14934 15244 6637 \r\n3 2807 15831 14934 6637 \r\n3 1282 18320 14017 6638 \r\n3 3637 18319 18320 6638 \r\n3 3505 14017 18319 6638 \r\n3 1389 14952 15317 6639 \r\n3 1580 17907 14952 6639 \r\n3 4337 15317 17907 6639 \r\n3 3384 15783 18321 6640 \r\n3 1263 17616 15783 6640 \r\n3 81 18321 17616 6640 \r\n3 3161 5457 18322 6641 \r\n3 4861 16579 5457 6641 \r\n3 1854 18322 16579 6641 \r\n3 3391 15147 18323 6642 \r\n3 3384 18321 15147 6642 \r\n3 81 18323 18321 6642 \r\n3 473 18324 17735 6643 \r\n3 301 5321 18324 6643 \r\n3 534 17735 5321 6643 \r\n3 4462 18326 18325 6644 \r\n3 3151 11961 18326 6644 \r\n3 1496 18325 11961 6644 \r\n3 1969 14238 7469 6645 \r\n3 3974 5577 14238 6645 \r\n3 1491 7469 5577 6645 \r\n3 3057 17145 9971 6646 \r\n3 805 18327 17145 6646 \r\n3 728 9971 18327 6646 \r\n3 1393 18328 17045 6647 \r\n3 1228 17192 18328 6647 \r\n3 195 17045 17192 6647 \r\n3 727 6884 18330 6648 \r\n3 481 18329 6884 6648 \r\n3 2117 18330 18329 6648 \r\n3 179 17342 14467 6649 \r\n3 3911 11023 17342 6649 \r\n3 4364 14467 11023 6649 \r\n3 2081 10916 18332 6650 \r\n3 2198 18331 10916 6650 \r\n3 3089 18332 18331 6650 \r\n3 4359 18334 7554 6651 \r\n3 3413 18333 18334 6651 \r\n3 434 7554 18333 6651 \r\n3 4036 16038 18336 6652 \r\n3 1620 18335 16038 6652 \r\n3 300 18336 18335 6652 \r\n3 197 18338 18337 6653 \r\n3 1327 6157 18338 6653 \r\n3 1519 18337 6157 6653 \r\n3 3003 14262 6869 6654 \r\n3 2090 12294 14262 6654 \r\n3 1966 6869 12294 6654 \r\n3 1414 5231 17942 6655 \r\n3 4225 14815 5231 6655 \r\n3 269 17942 14815 6655 \r\n3 1810 17713 18340 6656 \r\n3 1432 18339 17713 6656 \r\n3 1242 18340 18339 6656 \r\n3 2277 18343 18342 6657 \r\n3 1419 18341 18343 6657 \r\n3 4241 18342 18341 6657 \r\n3 1013 17810 10302 6658 \r\n3 1523 15894 17810 6658 \r\n3 3451 10302 15894 6658 \r\n3 2494 8448 15987 6659 \r\n3 990 18199 8448 6659 \r\n3 4628 15987 18199 6659 \r\n3 2659 7581 17255 6660 \r\n3 228 18344 7581 6660 \r\n3 2744 17255 18344 6660 \r\n3 2267 18347 18346 6661 \r\n3 3841 18345 18347 6661 \r\n3 4296 18346 18345 6661 \r\n3 1979 18349 18348 6662 \r\n3 217 13834 18349 6662 \r\n3 2699 18348 13834 6662 \r\n3 669 11896 17023 6663 \r\n3 3491 11020 11896 6663 \r\n3 1059 17023 11020 6663 \r\n3 1424 18350 16677 6664 \r\n3 4518 17500 18350 6664 \r\n3 67 16677 17500 6664 \r\n3 710 18352 18178 6665 \r\n3 3138 18351 18352 6665 \r\n3 1726 18178 18351 6665 \r\n3 281 18353 8082 6666 \r\n3 2723 10579 18353 6666 \r\n3 4431 8082 10579 6666 \r\n3 1315 18354 6842 6667 \r\n3 54 13608 18354 6667 \r\n3 4208 6842 13608 6667 \r\n3 4666 12625 5226 6668 \r\n3 4756 18355 12625 6668 \r\n3 4216 5226 18355 6668 \r\n3 496 7486 10373 6669 \r\n3 4517 9814 7486 6669 \r\n3 992 10373 9814 6669 \r\n3 803 18356 12333 6670 \r\n3 750 11773 18356 6670 \r\n3 3939 12333 11773 6670 \r\n3 3269 18358 16920 6671 \r\n3 4773 18357 18358 6671 \r\n3 2467 16920 18357 6671 \r\n3 2095 18360 18359 6672 \r\n3 3968 16821 18360 6672 \r\n3 3789 18359 16821 6672 \r\n3 451 16715 13104 6673 \r\n3 821 7653 16715 6673 \r\n3 1319 13104 7653 6673 \r\n3 1609 18362 18361 6674 \r\n3 610 17541 18362 6674 \r\n3 4171 18361 17541 6674 \r\n3 2856 9207 18363 6675 \r\n3 781 14812 9207 6675 \r\n3 1836 18363 14812 6675 \r\n3 2385 17020 11128 6676 \r\n3 573 16246 17020 6676 \r\n3 4445 11128 16246 6676 \r\n3 3546 5806 11756 6677 \r\n3 2734 18364 5806 6677 \r\n3 4151 11756 18364 6677 \r\n3 3000 18367 18366 6678 \r\n3 3858 18365 18367 6678 \r\n3 4670 18366 18365 6678 \r\n3 4299 18369 18368 6679 \r\n3 4841 7451 18369 6679 \r\n3 3571 18368 7451 6679 \r\n3 501 18247 14135 6680 \r\n3 4055 13346 18247 6680 \r\n3 4113 14135 13346 6680 \r\n3 426 12511 18371 6681 \r\n3 938 18370 12511 6681 \r\n3 2875 18371 18370 6681 \r\n3 4950 18373 17550 6682 \r\n3 2748 18372 18373 6682 \r\n3 2932 17550 18372 6682 \r\n3 4898 18374 12406 6683 \r\n3 2267 18346 18374 6683 \r\n3 4296 12406 18346 6683 \r\n3 2825 9150 8485 6684 \r\n3 3097 14405 9150 6684 \r\n3 3588 8485 14405 6684 \r\n3 3654 18376 18375 6685 \r\n3 2355 7872 18376 6685 \r\n3 757 18375 7872 6685 \r\n3 547 12763 6700 6686 \r\n3 3742 17497 12763 6686 \r\n3 1503 6700 17497 6686 \r\n3 2259 13806 11920 6687 \r\n3 258 10852 13806 6687 \r\n3 4169 11920 10852 6687 \r\n3 2325 16184 18377 6688 \r\n3 3743 11794 16184 6688 \r\n3 4864 18377 11794 6688 \r\n3 439 13140 6121 6689 \r\n3 2216 14254 13140 6689 \r\n3 1871 6121 14254 6689 \r\n3 2348 18379 18378 6690 \r\n3 4842 17854 18379 6690 \r\n3 1170 18378 17854 6690 \r\n3 2693 7889 18380 6691 \r\n3 4708 6741 7889 6691 \r\n3 3531 18380 6741 6691 \r\n3 2555 18382 18381 6692 \r\n3 3058 13551 18382 6692 \r\n3 2612 18381 13551 6692 \r\n3 3340 18385 18384 6693 \r\n3 4842 18383 18385 6693 \r\n3 1089 18384 18383 6693 \r\n3 1723 15192 15359 6694 \r\n3 2624 18386 15192 6694 \r\n3 2149 15359 18386 6694 \r\n3 1482 16758 5484 6695 \r\n3 172 18387 16758 6695 \r\n3 1221 5484 18387 6695 \r\n3 4818 18009 11197 6696 \r\n3 1447 18388 18009 6696 \r\n3 1034 11197 18388 6696 \r\n3 2114 5923 18390 6697 \r\n3 2971 18389 5923 6697 \r\n3 2084 18390 18389 6697 \r\n3 1614 6917 7311 6698 \r\n3 224 6965 6917 6698 \r\n3 3102 7311 6965 6698 \r\n3 2164 11636 12746 6699 \r\n3 2357 13484 11636 6699 \r\n3 3808 12746 13484 6699 \r\n3 2706 17104 7245 6700 \r\n3 822 18102 17104 6700 \r\n3 2069 7245 18102 6700 \r\n3 3062 18391 15401 6701 \r\n3 223 10797 18391 6701 \r\n3 2640 15401 10797 6701 \r\n3 2286 18393 18392 6702 \r\n3 4417 7862 18393 6702 \r\n3 629 18392 7862 6702 \r\n3 2841 18395 18394 6703 \r\n3 2626 17243 18395 6703 \r\n3 4720 18394 17243 6703 \r\n3 619 7212 17645 6704 \r\n3 2974 16417 7212 6704 \r\n3 3090 17645 16417 6704 \r\n3 157 18396 15380 6705 \r\n3 2692 18100 18396 6705 \r\n3 1015 15380 18100 6705 \r\n3 2598 18397 12303 6706 \r\n3 2654 6643 18397 6706 \r\n3 1 12303 6643 6706 \r\n3 388 18398 14524 6707 \r\n3 3896 10090 18398 6707 \r\n3 2688 14524 10090 6707 \r\n3 4956 15342 13242 6708 \r\n3 3909 16450 15342 6708 \r\n3 3717 13242 16450 6708 \r\n3 1286 12134 9879 6709 \r\n3 3068 9327 12134 6709 \r\n3 1373 9879 9327 6709 \r\n3 851 9418 12895 6710 \r\n3 4360 18399 9418 6710 \r\n3 3475 12895 18399 6710 \r\n3 3179 9195 9003 6711 \r\n3 2421 5209 9195 6711 \r\n3 3959 9003 5209 6711 \r\n3 3227 18402 18401 6712 \r\n3 4441 18400 18402 6712 \r\n3 614 18401 18400 6712 \r\n3 3577 8436 18404 6713 \r\n3 4742 18403 8436 6713 \r\n3 154 18404 18403 6713 \r\n3 3921 6435 8816 6714 \r\n3 559 18405 6435 6714 \r\n3 2687 8816 18405 6714 \r\n3 1339 13449 5875 6715 \r\n3 2740 13423 13449 6715 \r\n3 3333 5875 13423 6715 \r\n3 4426 13822 18407 6716 \r\n3 4676 18406 13822 6716 \r\n3 2077 18407 18406 6716 \r\n3 4306 18409 9188 6717 \r\n3 1832 18408 18409 6717 \r\n3 1584 9188 18408 6717 \r\n3 3004 15050 8250 6718 \r\n3 4087 18099 15050 6718 \r\n3 2964 8250 18099 6718 \r\n3 128 18411 18410 6719 \r\n3 2016 6863 18411 6719 \r\n3 447 18410 6863 6719 \r\n3 2332 10971 15994 6720 \r\n3 4629 18412 10971 6720 \r\n3 4791 15994 18412 6720 \r\n3 4203 15888 18414 6721 \r\n3 1337 18413 15888 6721 \r\n3 2744 18414 18413 6721 \r\n3 4854 8271 18415 6722 \r\n3 4276 9232 8271 6722 \r\n3 3556 18415 9232 6722 \r\n3 1323 18417 10954 6723 \r\n3 4533 18416 18417 6723 \r\n3 272 10954 18416 6723 \r\n3 1875 17405 16928 6724 \r\n3 2388 18418 17405 6724 \r\n3 2954 16928 18418 6724 \r\n3 3757 18419 5396 6725 \r\n3 1257 14932 18419 6725 \r\n3 2602 5396 14932 6725 \r\n3 1294 17398 11019 6726 \r\n3 4532 18420 17398 6726 \r\n3 1059 11019 18420 6726 \r\n3 3262 16014 7457 6727 \r\n3 1663 18421 16014 6727 \r\n3 949 7457 18421 6727 \r\n3 4100 6207 18422 6728 \r\n3 1626 6321 6207 6728 \r\n3 2912 18422 6321 6728 \r\n3 3776 17209 17347 6729 \r\n3 1415 18423 17209 6729 \r\n3 3086 17347 18423 6729 \r\n3 2984 18424 14477 6730 \r\n3 1691 12749 18424 6730 \r\n3 1611 14477 12749 6730 \r\n3 3073 7672 18425 6731 \r\n3 2506 14040 7672 6731 \r\n3 1308 18425 14040 6731 \r\n3 1078 17886 9019 6732 \r\n3 146 15656 17886 6732 \r\n3 4322 9019 15656 6732 \r\n3 4329 18428 18427 6733 \r\n3 921 18426 18428 6733 \r\n3 2294 18427 18426 6733 \r\n3 2750 17173 7594 6734 \r\n3 3999 17443 17173 6734 \r\n3 4433 7594 17443 6734 \r\n3 3643 10961 9723 6735 \r\n3 3992 18429 10961 6735 \r\n3 1307 9723 18429 6735 \r\n3 3893 18430 13066 6736 \r\n3 69 15116 18430 6736 \r\n3 2236 13066 15116 6736 \r\n3 4137 18432 18431 6737 \r\n3 1519 6156 18432 6737 \r\n3 3304 18431 6156 6737 \r\n3 1855 16753 18433 6738 \r\n3 4581 14928 16753 6738 \r\n3 4536 18433 14928 6738 \r\n3 1028 18436 18435 6739 \r\n3 3518 18434 18436 6739 \r\n3 1147 18435 18434 6739 \r\n3 56 18437 5818 6740 \r\n3 2764 16319 18437 6740 \r\n3 2605 5818 16319 6740 \r\n3 1199 16698 17567 6741 \r\n3 2921 16323 16698 6741 \r\n3 376 17567 16323 6741 \r\n3 3428 7619 16062 6742 \r\n3 4051 14263 7619 6742 \r\n3 3003 16062 14263 6742 \r\n3 2925 18439 18438 6743 \r\n3 4078 7327 18439 6743 \r\n3 4291 18438 7327 6743 \r\n3 2761 18441 14172 6744 \r\n3 4316 18440 18441 6744 \r\n3 2233 14172 18440 6744 \r\n3 2639 10689 15989 6745 \r\n3 3637 18320 10689 6745 \r\n3 1282 15989 18320 6745 \r\n3 1249 13887 17172 6746 \r\n3 1375 13555 13887 6746 \r\n3 117 17172 13555 6746 \r\n3 1510 17809 11703 6747 \r\n3 329 18442 17809 6747 \r\n3 4890 11703 18442 6747 \r\n3 350 12823 17975 6748 \r\n3 1545 7142 12823 6748 \r\n3 3245 17975 7142 6748 \r\n3 300 18445 18444 6749 \r\n3 3613 18443 18445 6749 \r\n3 1988 18444 18443 6749 \r\n3 4176 13428 9894 6750 \r\n3 3145 18446 13428 6750 \r\n3 3851 9894 18446 6750 \r\n3 1773 7216 12202 6751 \r\n3 3283 6671 7216 6751 \r\n3 1174 12202 6671 6751 \r\n3 684 18447 17930 6752 \r\n3 4805 15706 18447 6752 \r\n3 4596 17930 15706 6752 \r\n3 1927 14374 18448 6753 \r\n3 3226 7439 14374 6753 \r\n3 4802 18448 7439 6753 \r\n3 2079 15422 17797 6754 \r\n3 1074 12209 15422 6754 \r\n3 1624 17797 12209 6754 \r\n3 4519 13417 14505 6755 \r\n3 3462 17963 13417 6755 \r\n3 3545 14505 17963 6755 \r\n3 2302 6641 7060 6756 \r\n3 2654 18449 6641 6756 \r\n3 2637 7060 18449 6756 \r\n3 181 15219 14591 6757 \r\n3 2097 18450 15219 6757 \r\n3 2538 14591 18450 6757 \r\n3 365 18453 18452 6758 \r\n3 4908 18451 18453 6758 \r\n3 2283 18452 18451 6758 \r\n3 2912 13718 18422 6759 \r\n3 1009 18454 13718 6759 \r\n3 4100 18422 18454 6759 \r\n3 785 10554 11515 6760 \r\n3 289 18455 10554 6760 \r\n3 1858 11515 18455 6760 \r\n3 3231 5083 14343 6761 \r\n3 1708 13069 5083 6761 \r\n3 3628 14343 13069 6761 \r\n3 3146 17562 17544 6762 \r\n3 4126 16142 17562 6762 \r\n3 2278 17544 16142 6762 \r\n3 331 9102 17028 6763 \r\n3 1725 18060 9102 6763 \r\n3 3119 17028 18060 6763 \r\n3 900 17759 18456 6764 \r\n3 978 14583 17759 6764 \r\n3 1971 18456 14583 6764 \r\n3 3930 13167 16971 6765 \r\n3 1974 13091 13167 6765 \r\n3 2715 16971 13091 6765 \r\n3 4521 18457 6996 6766 \r\n3 3627 17663 18457 6766 \r\n3 2092 6996 17663 6766 \r\n3 904 14668 9396 6767 \r\n3 324 18458 14668 6767 \r\n3 3355 9396 18458 6767 \r\n3 4192 13637 8176 6768 \r\n3 1737 17214 13637 6768 \r\n3 4959 8176 17214 6768 \r\n3 4325 18459 13704 6769 \r\n3 2981 16061 18459 6769 \r\n3 1418 13704 16061 6769 \r\n3 3260 18306 18461 6770 \r\n3 3239 18460 18306 6770 \r\n3 4709 18461 18460 6770 \r\n3 4281 18193 16269 6771 \r\n3 4385 18462 18193 6771 \r\n3 3686 16269 18462 6771 \r\n3 4432 12575 11628 6772 \r\n3 2991 18463 12575 6772 \r\n3 4200 11628 18463 6772 \r\n3 4685 18466 18465 6773 \r\n3 1660 18464 18466 6773 \r\n3 2919 18465 18464 6773 \r\n3 4676 15421 18406 6774 \r\n3 1449 18000 15421 6774 \r\n3 2077 18406 18000 6774 \r\n3 1340 10081 9002 6775 \r\n3 2306 10271 10081 6775 \r\n3 3224 9002 10271 6775 \r\n3 3165 18468 18467 6776 \r\n3 2625 16117 18468 6776 \r\n3 1661 18467 16117 6776 \r\n3 1016 18470 15600 6777 \r\n3 3487 18469 18470 6777 \r\n3 541 15600 18469 6777 \r\n3 4004 18473 18472 6778 \r\n3 1473 18471 18473 6778 \r\n3 3379 18472 18471 6778 \r\n3 4856 13450 9972 6779 \r\n3 69 18430 13450 6779 \r\n3 3893 9972 18430 6779 \r\n3 3499 18474 5479 6780 \r\n3 4838 18222 18474 6780 \r\n3 819 5479 18222 6780 \r\n3 1071 15333 16294 6781 \r\n3 3198 18475 15333 6781 \r\n3 1714 16294 18475 6781 \r\n3 3466 16719 15555 6782 \r\n3 350 7504 16719 6782 \r\n3 264 15555 7504 6782 \r\n3 1777 18477 14877 6783 \r\n3 3929 18476 18477 6783 \r\n3 1953 14877 18476 6783 \r\n3 3207 14521 18478 6784 \r\n3 3039 6555 14521 6784 \r\n3 2638 18478 6555 6784 \r\n3 2275 7781 9851 6785 \r\n3 3740 16924 7781 6785 \r\n3 3899 9851 16924 6785 \r\n3 4688 8124 12771 6786 \r\n3 1354 17431 8124 6786 \r\n3 3791 12771 17431 6786 \r\n3 156 18217 16182 6787 \r\n3 2271 17888 18217 6787 \r\n3 1975 16182 17888 6787 \r\n3 2514 15386 17769 6788 \r\n3 818 18479 15386 6788 \r\n3 2138 17769 18479 6788 \r\n3 869 13626 18146 6789 \r\n3 3484 18480 13626 6789 \r\n3 1234 18146 18480 6789 \r\n3 3212 5435 15548 6790 \r\n3 1556 18481 5435 6790 \r\n3 4426 15548 18481 6790 \r\n3 3486 5959 18483 6791 \r\n3 3549 18482 5959 6791 \r\n3 4804 18483 18482 6791 \r\n3 2288 5598 18484 6792 \r\n3 87 15971 5598 6792 \r\n3 2324 18484 15971 6792 \r\n3 1111 9785 18485 6793 \r\n3 4435 9966 9785 6793 \r\n3 1096 18485 9966 6793 \r\n3 1030 18487 18486 6794 \r\n3 570 17232 18487 6794 \r\n3 5 18486 17232 6794 \r\n3 4550 13277 18489 6795 \r\n3 426 18488 13277 6795 \r\n3 687 18489 18488 6795 \r\n3 3448 18490 14603 6796 \r\n3 2745 17754 18490 6796 \r\n3 2854 14603 17754 6796 \r\n3 2119 18491 14869 6797 \r\n3 833 16524 18491 6797 \r\n3 1873 14869 16524 6797 \r\n3 444 8866 18174 6798 \r\n3 2842 8383 8866 6798 \r\n3 3877 18174 8383 6798 \r\n3 3216 18493 18492 6799 \r\n3 1742 10864 18493 6799 \r\n3 4869 18492 10864 6799 \r\n3 4238 11138 11616 6800 \r\n3 29 14908 11138 6800 \r\n3 3794 11616 14908 6800 \r\n3 1694 8161 5634 6801 \r\n3 479 7903 8161 6801 \r\n3 899 5634 7903 6801 \r\n3 3646 17280 18494 6802 \r\n3 2484 5050 17280 6802 \r\n3 3597 18494 5050 6802 \r\n3 1381 18496 12271 6803 \r\n3 2641 18495 18496 6803 \r\n3 1345 12271 18495 6803 \r\n3 4114 9544 16879 6804 \r\n3 210 14444 9544 6804 \r\n3 4176 16879 14444 6804 \r\n3 1234 18498 10833 6805 \r\n3 673 18497 18498 6805 \r\n3 3875 10833 18497 6805 \r\n3 2714 18499 17291 6806 \r\n3 4696 10881 18499 6806 \r\n3 958 17291 10881 6806 \r\n3 2179 17158 17166 6807 \r\n3 1597 18500 17158 6807 \r\n3 1178 17166 18500 6807 \r\n3 1901 8635 5963 6808 \r\n3 246 7501 8635 6808 \r\n3 3746 5963 7501 6808 \r\n3 1033 10672 13221 6809 \r\n3 3098 16171 10672 6809 \r\n3 1117 13221 16171 6809 \r\n3 3791 17430 17819 6810 \r\n3 3723 17971 17430 6810 \r\n3 2994 17819 17971 6810 \r\n3 2110 18501 16159 6811 \r\n3 2283 12348 18501 6811 \r\n3 129 16159 12348 6811 \r\n3 909 14930 18503 6812 \r\n3 4227 18502 14930 6812 \r\n3 3594 18503 18502 6812 \r\n3 4829 18505 18064 6813 \r\n3 2583 18504 18505 6813 \r\n3 4702 18064 18504 6813 \r\n3 389 18506 5630 6814 \r\n3 3769 15629 18506 6814 \r\n3 2101 5630 15629 6814 \r\n3 3933 11650 18507 6815 \r\n3 4781 9283 11650 6815 \r\n3 2401 18507 9283 6815 \r\n3 1455 11549 6082 6816 \r\n3 1678 6751 11549 6816 \r\n3 4524 6082 6751 6816 \r\n3 2106 13284 8965 6817 \r\n3 2956 16476 13284 6817 \r\n3 2307 8965 16476 6817 \r\n3 251 10216 18508 6818 \r\n3 3332 16659 10216 6818 \r\n3 4486 18508 16659 6818 \r\n3 4424 18510 18509 6819 \r\n3 4230 14761 18510 6819 \r\n3 4623 18509 14761 6819 \r\n3 3648 15298 5136 6820 \r\n3 584 16217 15298 6820 \r\n3 4048 5136 16217 6820 \r\n3 1236 12664 18317 6821 \r\n3 1232 10585 12664 6821 \r\n3 4381 18317 10585 6821 \r\n3 1270 16148 18511 6822 \r\n3 3287 17730 16148 6822 \r\n3 1540 18511 17730 6822 \r\n3 4327 18512 14574 6823 \r\n3 1791 17722 18512 6823 \r\n3 4638 14574 17722 6823 \r\n3 3607 18513 12729 6824 \r\n3 1905 14958 18513 6824 \r\n3 1178 12729 14958 6824 \r\n3 2274 11377 14230 6825 \r\n3 2527 18514 11377 6825 \r\n3 4784 14230 18514 6825 \r\n3 1399 16175 16616 6826 \r\n3 4567 16000 16175 6826 \r\n3 2035 16616 16000 6826 \r\n3 4164 12949 18515 6827 \r\n3 2703 9520 12949 6827 \r\n3 2134 18515 9520 6827 \r\n3 4383 6504 18517 6828 \r\n3 4044 18516 6504 6828 \r\n3 2589 18517 18516 6828 \r\n3 2276 7297 18518 6829 \r\n3 261 9608 7297 6829 \r\n3 670 18518 9608 6829 \r\n3 1858 18455 8363 6830 \r\n3 289 18519 18455 6830 \r\n3 3138 8363 18519 6830 \r\n3 4699 18522 18521 6831 \r\n3 2510 18520 18522 6831 \r\n3 1365 18521 18520 6831 \r\n3 4300 18524 10270 6832 \r\n3 2619 18523 18524 6832 \r\n3 3224 10270 18523 6832 \r\n3 3992 18526 18429 6833 \r\n3 2228 18525 18526 6833 \r\n3 1307 18429 18525 6833 \r\n3 3224 18527 9001 6834 \r\n3 2881 14998 18527 6834 \r\n3 3648 9001 14998 6834 \r\n3 500 18529 6256 6835 \r\n3 4145 18528 18529 6835 \r\n3 392 6256 18528 6835 \r\n3 3083 18112 16028 6836 \r\n3 3972 14833 18112 6836 \r\n3 648 16028 14833 6836 \r\n3 115 17947 18530 6837 \r\n3 3773 14733 17947 6837 \r\n3 160 18530 14733 6837 \r\n3 2337 6453 18531 6838 \r\n3 1848 9900 6453 6838 \r\n3 288 18531 9900 6838 \r\n3 2515 18533 18532 6839 \r\n3 3683 10837 18533 6839 \r\n3 4096 18532 10837 6839 \r\n3 1042 18535 18534 6840 \r\n3 1652 8710 18535 6840 \r\n3 1535 18534 8710 6840 \r\n3 3544 11254 12615 6841 \r\n3 3227 18536 11254 6841 \r\n3 2420 12615 18536 6841 \r\n3 936 12579 5747 6842 \r\n3 4069 18537 12579 6842 \r\n3 2404 5747 18537 6842 \r\n3 3765 11707 11359 6843 \r\n3 2356 18538 11707 6843 \r\n3 4079 11359 18538 6843 \r\n3 4287 18540 6167 6844 \r\n3 3385 18539 18540 6844 \r\n3 3252 6167 18539 6844 \r\n3 2348 17681 14529 6845 \r\n3 1469 16044 17681 6845 \r\n3 472 14529 16044 6845 \r\n3 1964 10376 10479 6846 \r\n3 2116 17533 10376 6846 \r\n3 1804 10479 17533 6846 \r\n3 4589 17771 16595 6847 \r\n3 2889 18541 17771 6847 \r\n3 2657 16595 18541 6847 \r\n3 1664 12958 7770 6848 \r\n3 111 18008 12958 6848 \r\n3 1489 7770 18008 6848 \r\n3 3385 18542 14726 6849 \r\n3 4626 5676 18542 6849 \r\n3 4056 14726 5676 6849 \r\n3 1027 15200 8637 6850 \r\n3 2738 18543 15200 6850 \r\n3 3943 8637 18543 6850 \r\n3 36 17917 7397 6851 \r\n3 3845 18544 17917 6851 \r\n3 1961 7397 18544 6851 \r\n3 2724 18545 5252 6852 \r\n3 3653 16633 18545 6852 \r\n3 2728 5252 16633 6852 \r\n3 2084 18547 18546 6853 \r\n3 3993 18133 18547 6853 \r\n3 3547 18546 18133 6853 \r\n3 1624 12208 17818 6854 \r\n3 1790 5383 12208 6854 \r\n3 3339 17818 5383 6854 \r\n3 67 14516 18548 6855 \r\n3 1068 12844 14516 6855 \r\n3 4459 18548 12844 6855 \r\n3 4132 18549 18042 6856 \r\n3 2407 14972 18549 6856 \r\n3 2240 18042 14972 6856 \r\n3 3150 5420 6441 6857 \r\n3 2862 18550 5420 6857 \r\n3 4359 6441 18550 6857 \r\n3 2316 5610 18551 6858 \r\n3 1152 8548 5610 6858 \r\n3 2315 18551 8548 6858 \r\n3 4570 18552 8108 6859 \r\n3 4847 11144 18552 6859 \r\n3 351 8108 11144 6859 \r\n3 1858 17619 13297 6860 \r\n3 2806 13062 17619 6860 \r\n3 1449 13297 13062 6860 \r\n3 4422 18168 7205 6861 \r\n3 4840 18553 18168 6861 \r\n3 74 7205 18553 6861 \r\n3 3500 8315 18555 6862 \r\n3 898 18554 8315 6862 \r\n3 1004 18555 18554 6862 \r\n3 3897 18557 13614 6863 \r\n3 144 18556 18557 6863 \r\n3 4090 13614 18556 6863 \r\n3 627 10505 13202 6864 \r\n3 3172 18558 10505 6864 \r\n3 80 13202 18558 6864 \r\n3 3247 17336 5635 6865 \r\n3 4201 18559 17336 6865 \r\n3 167 5635 18559 6865 \r\n3 486 12555 10599 6866 \r\n3 367 10553 12555 6866 \r\n3 785 10599 10553 6866 \r\n3 185 18560 10685 6867 \r\n3 1261 11084 18560 6867 \r\n3 1452 10685 11084 6867 \r\n3 4046 18562 18561 6868 \r\n3 175 8392 18562 6868 \r\n3 2576 18561 8392 6868 \r\n3 3906 8414 18563 6869 \r\n3 70 13691 8414 6869 \r\n3 4585 18563 13691 6869 \r\n3 4140 12489 6596 6870 \r\n3 3729 18564 12489 6870 \r\n3 1435 6596 18564 6870 \r\n3 4807 7635 17016 6871 \r\n3 2149 18386 7635 6871 \r\n3 2624 17016 18386 6871 \r\n3 2094 10521 10642 6872 \r\n3 1829 18565 10521 6872 \r\n3 2656 10642 18565 6872 \r\n3 3793 18066 17573 6873 \r\n3 3971 16296 18066 6873 \r\n3 1906 17573 16296 6873 \r\n3 4180 18567 10051 6874 \r\n3 4995 18566 18567 6874 \r\n3 2439 10051 18566 6874 \r\n3 77 17673 18568 6875 \r\n3 3204 14432 17673 6875 \r\n3 1681 18568 14432 6875 \r\n3 1518 18569 9481 6876 \r\n3 575 12220 18569 6876 \r\n3 1874 9481 12220 6876 \r\n3 4561 7960 18571 6877 \r\n3 3885 18570 7960 6877 \r\n3 1126 18571 18570 6877 \r\n3 2787 12478 18573 6878 \r\n3 2057 18572 12478 6878 \r\n3 3260 18573 18572 6878 \r\n3 1239 18574 9110 6879 \r\n3 1287 8998 18574 6879 \r\n3 3381 9110 8998 6879 \r\n3 2086 18576 18575 6880 \r\n3 4240 14994 18576 6880 \r\n3 148 18575 14994 6880 \r\n3 3635 18577 15955 6881 \r\n3 1792 16982 18577 6881 \r\n3 3349 15955 16982 6881 \r\n3 3227 18401 18536 6882 \r\n3 614 17517 18401 6882 \r\n3 2420 18536 17517 6882 \r\n3 608 15024 15893 6883 \r\n3 4794 18578 15024 6883 \r\n3 3451 15893 18578 6883 \r\n3 4934 18579 8586 6884 \r\n3 3201 11538 18579 6884 \r\n3 4237 8586 11538 6884 \r\n3 1532 18582 18581 6885 \r\n3 4082 18580 18582 6885 \r\n3 4940 18581 18580 6885 \r\n3 2663 18015 18584 6886 \r\n3 2043 18583 18015 6886 \r\n3 4952 18584 18583 6886 \r\n3 2620 8035 16138 6887 \r\n3 4780 11430 8035 6887 \r\n3 976 16138 11430 6887 \r\n3 1334 5944 9943 6888 \r\n3 4981 17345 5944 6888 \r\n3 1275 9943 17345 6888 \r\n3 3550 6523 18586 6889 \r\n3 3066 18585 6523 6889 \r\n3 20 18586 18585 6889 \r\n3 119 18587 5312 6890 \r\n3 3086 18423 18587 6890 \r\n3 1415 5312 18423 6890 \r\n3 1247 18588 12982 6891 \r\n3 794 9201 18588 6891 \r\n3 2863 12982 9201 6891 \r\n3 1440 18590 18589 6892 \r\n3 3279 16211 18590 6892 \r\n3 3481 18589 16211 6892 \r\n3 1242 11800 18592 6893 \r\n3 3952 18591 11800 6893 \r\n3 2550 18592 18591 6893 \r\n3 4890 18442 16898 6894 \r\n3 329 18593 18442 6894 \r\n3 1171 16898 18593 6894 \r\n3 2290 5852 16069 6895 \r\n3 1021 16835 5852 6895 \r\n3 3806 16069 16835 6895 \r\n3 2834 16227 10478 6896 \r\n3 1308 14041 16227 6896 \r\n3 1964 10478 14041 6896 \r\n3 4945 18595 18594 6897 \r\n3 284 8201 18595 6897 \r\n3 2708 18594 8201 6897 \r\n3 3329 9482 17631 6898 \r\n3 1874 17278 9482 6898 \r\n3 1698 17631 17278 6898 \r\n3 11 12979 18596 6899 \r\n3 855 15526 12979 6899 \r\n3 3377 18596 15526 6899 \r\n3 2539 12707 18598 6900 \r\n3 1832 18597 12707 6900 \r\n3 4413 18598 18597 6900 \r\n3 3735 8016 16551 6901 \r\n3 1273 18093 8016 6901 \r\n3 4658 16551 18093 6901 \r\n3 1237 5936 18600 6902 \r\n3 1341 18599 5936 6902 \r\n3 2615 18600 18599 6902 \r\n3 3721 6381 11563 6903 \r\n3 2007 9706 6381 6903 \r\n3 3772 11563 9706 6903 \r\n3 3853 18602 14408 6904 \r\n3 1266 18601 18602 6904 \r\n3 366 14408 18601 6904 \r\n3 1133 15623 18287 6905 \r\n3 709 17766 15623 6905 \r\n3 1073 18287 17766 6905 \r\n3 2675 16004 18603 6906 \r\n3 3435 11717 16004 6906 \r\n3 4853 18603 11717 6906 \r\n3 288 14513 18531 6907 \r\n3 4465 9835 14513 6907 \r\n3 2337 18531 9835 6907 \r\n3 510 18604 15182 6908 \r\n3 240 12896 18604 6908 \r\n3 3475 15182 12896 6908 \r\n3 285 7425 16998 6909 \r\n3 2292 13322 7425 6909 \r\n3 1869 16998 13322 6909 \r\n3 3414 13481 18605 6910 \r\n3 4899 14917 13481 6910 \r\n3 1837 18605 14917 6910 \r\n3 3840 18606 12508 6911 \r\n3 409 15014 18606 6911 \r\n3 4832 12508 15014 6911 \r\n3 1367 18607 14762 6912 \r\n3 676 17180 18607 6912 \r\n3 400 14762 17180 6912 \r\n3 4633 9756 17543 6913 \r\n3 461 9769 9756 6913 \r\n3 3146 17543 9769 6913 \r\n3 4081 12165 11206 6914 \r\n3 1994 18198 12165 6914 \r\n3 1380 11206 18198 6914 \r\n3 2861 7412 11964 6915 \r\n3 2603 17170 7412 6915 \r\n3 2232 11964 17170 6915 \r\n3 463 6104 16379 6916 \r\n3 1014 14756 6104 6916 \r\n3 3867 16379 14756 6916 \r\n3 695 14712 18608 6917 \r\n3 4685 18465 14712 6917 \r\n3 2919 18608 18465 6917 \r\n3 2558 14333 8541 6918 \r\n3 1298 6477 14333 6918 \r\n3 2908 8541 6477 6918 \r\n3 2373 17652 14144 6919 \r\n3 2895 15592 17652 6919 \r\n3 1020 14144 15592 6919 \r\n3 2890 18611 18610 6920 \r\n3 4846 18609 18611 6920 \r\n3 4944 18610 18609 6920 \r\n3 4383 13232 18613 6921 \r\n3 2228 18612 13232 6921 \r\n3 3178 18613 18612 6921 \r\n3 2488 18614 6316 6922 \r\n3 80 18558 18614 6922 \r\n3 3172 6316 18558 6922 \r\n3 2325 18377 18615 6923 \r\n3 4864 10329 18377 6923 \r\n3 4053 18615 10329 6923 \r\n3 341 6502 13180 6924 \r\n3 2873 13074 6502 6924 \r\n3 1011 13180 13074 6924 \r\n3 3319 15595 12976 6925 \r\n3 1374 8194 15595 6925 \r\n3 2437 12976 8194 6925 \r\n3 1008 17317 12031 6926 \r\n3 2046 6324 17317 6926 \r\n3 1260 12031 6324 6926 \r\n3 4962 15897 17504 6927 \r\n3 4903 12808 15897 6927 \r\n3 1625 17504 12808 6927 \r\n3 2485 16181 18617 6928 \r\n3 1975 18616 16181 6928 \r\n3 339 18617 18616 6928 \r\n3 4738 17657 16592 6929 \r\n3 281 16570 17657 6929 \r\n3 4437 16592 16570 6929 \r\n3 2211 8702 14626 6930 \r\n3 3580 15265 8702 6930 \r\n3 4258 14626 15265 6930 \r\n3 2161 16156 17135 6931 \r\n3 4332 16325 16156 6931 \r\n3 2694 17135 16325 6931 \r\n3 271 18618 17350 6932 \r\n3 170 16445 18618 6932 \r\n3 2519 17350 16445 6932 \r\n3 4809 6480 12847 6933 \r\n3 2189 18619 6480 6933 \r\n3 2608 12847 18619 6933 \r\n3 3161 18620 5455 6934 \r\n3 3998 11600 18620 6934 \r\n3 3037 5455 11600 6934 \r\n3 2896 18621 5609 6935 \r\n3 4624 18118 18621 6935 \r\n3 1152 5609 18118 6935 \r\n3 2391 17659 10023 6936 \r\n3 3376 7203 17659 6936 \r\n3 208 10023 7203 6936 \r\n3 568 17895 15563 6937 \r\n3 2739 18622 17895 6937 \r\n3 2382 15563 18622 6937 \r\n3 2377 18624 18623 6938 \r\n3 4846 18611 18624 6938 \r\n3 2890 18623 18611 6938 \r\n3 4405 8583 6392 6939 \r\n3 919 6397 8583 6939 \r\n3 1203 6392 6397 6939 \r\n3 2021 16878 16548 6940 \r\n3 3715 16024 16878 6940 \r\n3 4390 16548 16024 6940 \r\n3 313 5040 13023 6941 \r\n3 2929 18625 5040 6941 \r\n3 1866 13023 18625 6941 \r\n3 560 8261 18627 6942 \r\n3 2778 18626 8261 6942 \r\n3 2636 18627 18626 6942 \r\n3 4927 17314 12537 6943 \r\n3 3760 18229 17314 6943 \r\n3 4544 12537 18229 6943 \r\n3 931 18047 18628 6944 \r\n3 176 12626 18047 6944 \r\n3 4666 18628 12626 6944 \r\n3 2706 18629 17102 6945 \r\n3 3093 15946 18629 6945 \r\n3 483 17102 15946 6945 \r\n3 3646 18630 15255 6946 \r\n3 3230 14936 18630 6946 \r\n3 1442 15255 14936 6946 \r\n3 4416 11043 15211 6947 \r\n3 3950 17485 11043 6947 \r\n3 4960 15211 17485 6947 \r\n3 3359 10828 18632 6948 \r\n3 2396 18631 10828 6948 \r\n3 2904 18632 18631 6948 \r\n3 4371 18634 18633 6949 \r\n3 1254 7527 18634 6949 \r\n3 3535 18633 7527 6949 \r\n3 2629 18635 12651 6950 \r\n3 4602 11465 18635 6950 \r\n3 4478 12651 11465 6950 \r\n3 1937 9119 18636 6951 \r\n3 3562 16976 9119 6951 \r\n3 1130 18636 16976 6951 \r\n3 2825 8484 8245 6952 \r\n3 4800 17864 8484 6952 \r\n3 78 8245 17864 6952 \r\n3 4622 17790 11341 6953 \r\n3 674 18637 17790 6953 \r\n3 857 11341 18637 6953 \r\n3 2456 18639 17583 6954 \r\n3 4874 18638 18639 6954 \r\n3 1738 17583 18638 6954 \r\n3 4116 18640 8064 6955 \r\n3 784 17392 18640 6955 \r\n3 4408 8064 17392 6955 \r\n3 1071 18641 15334 6956 \r\n3 3195 15019 18641 6956 \r\n3 4687 15334 15019 6956 \r\n3 3615 11784 8799 6957 \r\n3 1402 11436 11784 6957 \r\n3 2530 8799 11436 6957 \r\n3 40 10818 12686 6958 \r\n3 2787 18573 10818 6958 \r\n3 3260 12686 18573 6958 \r\n3 2376 18643 15322 6959 \r\n3 3981 18642 18643 6959 \r\n3 417 15322 18642 6959 \r\n3 1017 18077 10386 6960 \r\n3 1783 10759 18077 6960 \r\n3 598 10386 10759 6960 \r\n3 1429 18644 9245 6961 \r\n3 3309 15307 18644 6961 \r\n3 3433 9245 15307 6961 \r\n3 3434 9873 13570 6962 \r\n3 3987 18645 9873 6962 \r\n3 543 13570 18645 6962 \r\n3 657 15750 18646 6963 \r\n3 4659 15774 15750 6963 \r\n3 1751 18646 15774 6963 \r\n3 82 10733 14240 6964 \r\n3 644 7411 10733 6964 \r\n3 631 14240 7411 6964 \r\n3 2990 15331 10366 6965 \r\n3 4044 6503 15331 6965 \r\n3 1585 10366 6503 6965 \r\n3 4329 18427 13868 6966 \r\n3 2294 15447 18427 6966 \r\n3 1850 13868 15447 6966 \r\n3 2987 18647 17679 6967 \r\n3 4750 16749 18647 6967 \r\n3 64 17679 16749 6967 \r\n3 248 18648 17395 6968 \r\n3 1258 17050 18648 6968 \r\n3 3577 17395 17050 6968 \r\n3 3669 18649 11955 6969 \r\n3 2764 18437 18649 6969 \r\n3 56 11955 18437 6969 \r\n3 2591 17012 18650 6970 \r\n3 4665 16852 17012 6970 \r\n3 1125 18650 16852 6970 \r\n3 317 12263 18652 6971 \r\n3 3427 18651 12263 6971 \r\n3 4955 18652 18651 6971 \r\n3 2126 13203 8120 6972 \r\n3 80 18614 13203 6972 \r\n3 2488 8120 18614 6972 \r\n3 2708 11489 18653 6973 \r\n3 4289 17367 11489 6973 \r\n3 1206 18653 17367 6973 \r\n3 4707 18655 18654 6974 \r\n3 3426 5129 18655 6974 \r\n3 3550 18654 5129 6974 \r\n3 1331 13188 13765 6975 \r\n3 215 9743 13188 6975 \r\n3 1558 13765 9743 6975 \r\n3 424 18657 15694 6976 \r\n3 1854 18656 18657 6976 \r\n3 3354 15694 18656 6976 \r\n3 872 8753 18658 6977 \r\n3 4850 18074 8753 6977 \r\n3 1792 18658 18074 6977 \r\n3 3377 17840 18596 6978 \r\n3 532 7895 17840 6978 \r\n3 11 18596 7895 6978 \r\n3 24 14640 15316 6979 \r\n3 2717 13416 14640 6979 \r\n3 1389 15316 13416 6979 \r\n3 3619 10962 16082 6980 \r\n3 3643 12393 10962 6980 \r\n3 4734 16082 12393 6980 \r\n3 549 6387 17565 6981 \r\n3 2867 18659 6387 6981 \r\n3 3666 17565 18659 6981 \r\n3 1770 8442 18660 6982 \r\n3 860 11261 8442 6982 \r\n3 3868 18660 11261 6982 \r\n3 1456 18101 10612 6983 \r\n3 2692 15031 18101 6983 \r\n3 3110 10612 15031 6983 \r\n3 4454 14094 17828 6984 \r\n3 4547 18269 14094 6984 \r\n3 2572 17828 18269 6984 \r\n3 4855 18661 8527 6985 \r\n3 222 7994 18661 6985 \r\n3 429 8527 7994 6985 \r\n3 2037 14582 8277 6986 \r\n3 3394 14021 14582 6986 \r\n3 4795 8277 14021 6986 \r\n3 396 18181 10939 6987 \r\n3 3866 18662 18181 6987 \r\n3 2672 10939 18662 6987 \r\n3 3385 18540 18542 6988 \r\n3 4287 18663 18540 6988 \r\n3 4626 18542 18663 6988 \r\n3 2385 18665 18664 6989 \r\n3 2569 9233 18665 6989 \r\n3 2610 18664 9233 6989 \r\n3 1752 6303 18666 6990 \r\n3 2757 11702 6303 6990 \r\n3 868 18666 11702 6990 \r\n3 3521 18668 18667 6991 \r\n3 3888 14095 18668 6991 \r\n3 4146 18667 14095 6991 \r\n3 1889 17696 18669 6992 \r\n3 4170 17851 17696 6992 \r\n3 3101 18669 17851 6992 \r\n3 3946 16073 16266 6993 \r\n3 1868 16754 16073 6993 \r\n3 2743 16266 16754 6993 \r\n3 1284 14189 18670 6994 \r\n3 4720 18206 14189 6994 \r\n3 385 18670 18206 6994 \r\n3 1721 14415 6665 6995 \r\n3 4058 13708 14415 6995 \r\n3 4124 6665 13708 6995 \r\n3 2255 18237 18671 6996 \r\n3 4698 9816 18237 6996 \r\n3 3417 18671 9816 6996 \r\n3 2890 18672 18623 6997 \r\n3 4602 12224 18672 6997 \r\n3 2377 18623 12224 6997 \r\n3 4020 16872 18674 6998 \r\n3 2410 18673 16872 6998 \r\n3 719 18674 18673 6998 \r\n3 393 14384 18676 6999 \r\n3 4873 18675 14384 6999 \r\n3 2262 18676 18675 6999 \r\n3 3395 18677 13401 7000 \r\n3 3625 6340 18677 7000 \r\n3 3345 13401 6340 7000 \r\n3 3673 17399 18678 7001 \r\n3 3416 9362 17399 7001 \r\n3 3508 18678 9362 7001 \r\n3 2561 11389 12710 7002 \r\n3 751 13556 11389 7002 \r\n3 1375 12710 13556 7002 \r\n3 142 11778 16485 7003 \r\n3 3346 15310 11778 7003 \r\n3 1939 16485 15310 7003 \r\n3 2743 5060 15798 7004 \r\n3 2540 8684 5060 7004 \r\n3 129 15798 8684 7004 \r\n3 2135 18680 18679 7005 \r\n3 389 10324 18680 7005 \r\n3 519 18679 10324 7005 \r\n3 2134 17413 18681 7006 \r\n3 1898 8618 17413 7006 \r\n3 4040 18681 8618 7006 \r\n3 3484 18682 18480 7007 \r\n3 673 18498 18682 7007 \r\n3 1234 18480 18498 7007 \r\n3 3038 16517 9772 7008 \r\n3 4955 18651 16517 7008 \r\n3 3427 9772 18651 7008 \r\n3 2910 7587 18683 7009 \r\n3 4668 12168 7587 7009 \r\n3 2042 18683 12168 7009 \r\n3 4082 18685 18684 7010 \r\n3 1978 16600 18685 7010 \r\n3 1697 18684 16600 7010 \r\n3 1136 17059 14436 7011 \r\n3 2066 18686 17059 7011 \r\n3 3463 14436 18686 7011 \r\n3 502 18689 18688 7012 \r\n3 805 18687 18689 7012 \r\n3 2041 18688 18687 7012 \r\n3 4716 18690 17138 7013 \r\n3 89 14001 18690 7013 \r\n3 3151 17138 14001 7013 \r\n3 1142 6528 11875 7014 \r\n3 1356 15353 6528 7014 \r\n3 798 11875 15353 7014 \r\n3 229 18691 9513 7015 \r\n3 4995 7516 18691 7015 \r\n3 1915 9513 7516 7015 \r\n3 4594 18692 15248 7016 \r\n3 3401 8705 18692 7016 \r\n3 4089 15248 8705 7016 \r\n3 4490 17938 18693 7017 \r\n3 4226 5026 17938 7017 \r\n3 3883 18693 5026 7017 \r\n3 743 6937 16559 7018 \r\n3 1636 16980 6937 7018 \r\n3 1667 16559 16980 7018 \r\n3 820 16146 10128 7019 \r\n3 1310 18694 16146 7019 \r\n3 2184 10128 18694 7019 \r\n3 1136 14438 15631 7020 \r\n3 1488 15327 14438 7020 \r\n3 811 15631 15327 7020 \r\n3 3962 18696 18695 7021 \r\n3 1551 6729 18696 7021 \r\n3 1225 18695 6729 7021 \r\n3 824 12013 18697 7022 \r\n3 4463 7050 12013 7022 \r\n3 3430 18697 7050 7022 \r\n3 1870 9578 18698 7023 \r\n3 2709 8471 9578 7023 \r\n3 2662 18698 8471 7023 \r\n3 3418 18700 18699 7024 \r\n3 2367 17441 18700 7024 \r\n3 110 18699 17441 7024 \r\n3 4098 14614 18702 7025 \r\n3 2674 18701 14614 7025 \r\n3 4061 18702 18701 7025 \r\n3 658 18703 13161 7026 \r\n3 4663 8488 18703 7026 \r\n3 4753 13161 8488 7026 \r\n3 1582 12593 18704 7027 \r\n3 4598 11757 12593 7027 \r\n3 1090 18704 11757 7027 \r\n3 4796 18706 18705 7028 \r\n3 4862 7584 18706 7028 \r\n3 290 18705 7584 7028 \r\n3 3706 8400 16520 7029 \r\n3 1478 18707 8400 7029 \r\n3 845 16520 18707 7029 \r\n3 3621 6027 14059 7030 \r\n3 4259 17381 6027 7030 \r\n3 4580 14059 17381 7030 \r\n3 585 14973 18708 7031 \r\n3 3487 18470 14973 7031 \r\n3 1016 18708 18470 7031 \r\n3 1516 18710 9913 7032 \r\n3 2441 18709 18710 7032 \r\n3 1647 9913 18709 7032 \r\n3 2486 6732 15385 7033 \r\n3 1685 9027 6732 7033 \r\n3 818 15385 9027 7033 \r\n3 2909 15825 15769 7034 \r\n3 4398 17147 15825 7034 \r\n3 1828 15769 17147 7034 \r\n3 4249 18711 14156 7035 \r\n3 1238 16474 18711 7035 \r\n3 1579 14156 16474 7035 \r\n3 743 17693 5621 7036 \r\n3 1485 18712 17693 7036 \r\n3 2330 5621 18712 7036 \r\n3 2016 13557 7150 7037 \r\n3 4432 11627 13557 7037 \r\n3 4007 7150 11627 7037 \r\n3 2528 10766 18713 7038 \r\n3 4255 13137 10766 7038 \r\n3 4378 18713 13137 7038 \r\n3 3061 13011 14826 7039 \r\n3 664 18714 13011 7039 \r\n3 4148 14826 18714 7039 \r\n3 4137 18431 14983 7040 \r\n3 3304 16128 18431 7040 \r\n3 1314 14983 16128 7040 \r\n3 1785 18717 18716 7041 \r\n3 3071 18715 18717 7041 \r\n3 3720 18716 18715 7041 \r\n3 769 13280 13842 7042 \r\n3 3534 13267 13280 7042 \r\n3 3665 13842 13267 7042 \r\n3 1974 18718 11423 7043 \r\n3 2151 18160 18718 7043 \r\n3 1120 11423 18160 7043 \r\n3 943 18719 15081 7044 \r\n3 818 9029 18719 7044 \r\n3 1859 15081 9029 7044 \r\n3 2724 16011 18545 7045 \r\n3 747 5280 16011 7045 \r\n3 3653 18545 5280 7045 \r\n3 2237 18722 18721 7046 \r\n3 1608 18720 18722 7046 \r\n3 3044 18721 18720 7046 \r\n3 4619 18724 18723 7047 \r\n3 1241 9649 18724 7047 \r\n3 3546 18723 9649 7047 \r\n3 3573 11216 10611 7048 \r\n3 4536 10244 11216 7048 \r\n3 1456 10611 10244 7048 \r\n3 2633 12868 16643 7049 \r\n3 2871 7982 12868 7049 \r\n3 3524 16643 7982 7049 \r\n3 605 13681 18725 7050 \r\n3 652 15352 13681 7050 \r\n3 4309 18725 15352 7050 \r\n3 4057 17475 14454 7051 \r\n3 2815 7564 17475 7051 \r\n3 1497 14454 7564 7051 \r\n3 1933 15431 18726 7052 \r\n3 4000 7100 15431 7052 \r\n3 3767 18726 7100 7052 \r\n3 3361 11269 18727 7053 \r\n3 4351 9160 11269 7053 \r\n3 3769 18727 9160 7053 \r\n3 1707 6958 15042 7054 \r\n3 2213 18728 6958 7054 \r\n3 2104 15042 18728 7054 \r\n3 438 18729 13505 7055 \r\n3 4484 15071 18729 7055 \r\n3 390 13505 15071 7055 \r\n3 3289 17265 10726 7056 \r\n3 4963 17950 17265 7056 \r\n3 3538 10726 17950 7056 \r\n3 1618 18730 13775 7057 \r\n3 2145 18166 18730 7057 \r\n3 1324 13775 18166 7057 \r\n3 3253 10396 10911 7058 \r\n3 20 18585 10396 7058 \r\n3 3066 10911 18585 7058 \r\n3 1620 5056 18335 7059 \r\n3 2977 10570 5056 7059 \r\n3 300 18335 10570 7059 \r\n3 3000 18366 18731 7060 \r\n3 4670 15470 18366 7060 \r\n3 4362 18731 15470 7060 \r\n3 4637 15664 18733 7061 \r\n3 1640 18732 15664 7061 \r\n3 4077 18733 18732 7061 \r\n3 4902 12521 18734 7062 \r\n3 366 18601 12521 7062 \r\n3 1266 18734 18601 7062 \r\n3 3079 18735 8669 7063 \r\n3 2052 17571 18735 7063 \r\n3 2015 8669 17571 7063 \r\n3 3099 17826 18736 7064 \r\n3 4038 9860 17826 7064 \r\n3 1451 18736 9860 7064 \r\n3 3361 8282 18737 7065 \r\n3 21 8673 8282 7065 \r\n3 620 18737 8673 7065 \r\n3 1463 9875 18739 7066 \r\n3 3976 18738 9875 7066 \r\n3 1588 18739 18738 7066 \r\n3 1699 7932 7520 7067 \r\n3 4965 18740 7932 7067 \r\n3 1734 7520 18740 7067 \r\n3 1072 10901 7031 7068 \r\n3 34 18741 10901 7068 \r\n3 3299 7031 18741 7068 \r\n3 3624 16282 18115 7069 \r\n3 4113 10404 16282 7069 \r\n3 979 18115 10404 7069 \r\n3 4415 16628 18742 7070 \r\n3 592 16911 16628 7070 \r\n3 1102 18742 16911 7070 \r\n3 4995 18567 9793 7071 \r\n3 4180 12742 18567 7071 \r\n3 4957 9793 12742 7071 \r\n3 4127 15580 5619 7072 \r\n3 3360 17287 15580 7072 \r\n3 1050 5619 17287 7072 \r\n3 2330 18743 6438 7073 \r\n3 2334 5535 18743 7073 \r\n3 1672 6438 5535 7073 \r\n3 4650 8565 17087 7074 \r\n3 576 17629 8565 7074 \r\n3 781 17087 17629 7074 \r\n3 812 18105 17330 7075 \r\n3 3446 15214 18105 7075 \r\n3 2970 17330 15214 7075 \r\n3 3858 17176 18745 7076 \r\n3 3608 18744 17176 7076 \r\n3 2906 18745 18744 7076 \r\n3 4057 17162 17474 7077 \r\n3 4784 17878 17162 7077 \r\n3 277 17474 17878 7077 \r\n3 1225 6728 18747 7078 \r\n3 4500 18746 6728 7078 \r\n3 96 18747 18746 7078 \r\n3 985 16672 7035 7079 \r\n3 2146 17985 16672 7079 \r\n3 4064 7035 17985 7079 \r\n3 172 16759 12238 7080 \r\n3 2720 18748 16759 7080 \r\n3 3629 12238 18748 7080 \r\n3 2626 18395 8808 7081 \r\n3 2841 8503 18395 7081 \r\n3 201 8808 8503 7081 \r\n3 3049 5453 18749 7082 \r\n3 1211 14327 5453 7082 \r\n3 2235 18749 14327 7082 \r\n3 2067 15707 18750 7083 \r\n3 530 16902 15707 7083 \r\n3 2906 18750 16902 7083 \r\n3 3485 6119 11205 7084 \r\n3 867 14137 6119 7084 \r\n3 3997 11205 14137 7084 \r\n3 4758 17297 18751 7085 \r\n3 3662 14184 17297 7085 \r\n3 4168 18751 14184 7085 \r\n3 2875 5922 18371 7086 \r\n3 687 18488 5922 7086 \r\n3 426 18371 18488 7086 \r\n3 4042 6205 13503 7087 \r\n3 4100 8916 6205 7087 \r\n3 2167 13503 8916 7087 \r\n3 812 13377 18753 7088 \r\n3 194 18752 13377 7088 \r\n3 3591 18753 18752 7088 \r\n3 4699 16233 18522 7089 \r\n3 2684 17964 16233 7089 \r\n3 2510 18522 17964 7089 \r\n3 3470 12893 18754 7090 \r\n3 4923 18149 12893 7090 \r\n3 423 18754 18149 7090 \r\n3 2224 11630 18756 7091 \r\n3 863 18755 11630 7091 \r\n3 392 18756 18755 7091 \r\n3 2111 17758 16132 7092 \r\n3 3404 18757 17758 7092 \r\n3 704 16132 18757 7092 \r\n3 3062 17402 18759 7093 \r\n3 3052 18758 17402 7093 \r\n3 3009 18759 18758 7093 \r\n3 136 7576 14966 7094 \r\n3 1408 18760 7576 7094 \r\n3 4177 14966 18760 7094 \r\n3 2194 8444 18761 7095 \r\n3 618 11219 8444 7095 \r\n3 4047 18761 11219 7095 \r\n3 4400 11605 18762 7096 \r\n3 2032 16676 11605 7096 \r\n3 3830 18762 16676 7096 \r\n3 703 18763 8297 7097 \r\n3 1578 9603 18763 7097 \r\n3 1208 8297 9603 7097 \r\n3 240 18604 9093 7098 \r\n3 510 18764 18604 7098 \r\n3 3234 9093 18764 7098 \r\n3 4362 9932 18731 7099 \r\n3 3383 18765 9932 7099 \r\n3 3000 18731 18765 7099 \r\n3 4480 18767 10609 7100 \r\n3 1876 18766 18767 7100 \r\n3 3310 10609 18766 7100 \r\n3 2418 10076 5949 7101 \r\n3 4254 17569 10076 7101 \r\n3 3197 5949 17569 7101 \r\n3 2045 18768 12063 7102 \r\n3 2657 18541 18768 7102 \r\n3 2889 12063 18541 7102 \r\n3 4088 18770 6803 7103 \r\n3 3523 18769 18770 7103 \r\n3 2 6803 18769 7103 \r\n3 2220 18772 14570 7104 \r\n3 949 18771 18772 7104 \r\n3 4690 14570 18771 7104 \r\n3 2017 9973 7879 7105 \r\n3 2080 5602 9973 7105 \r\n3 1668 7879 5602 7105 \r\n3 4768 5571 8950 7106 \r\n3 1927 18448 5571 7106 \r\n3 4802 8950 18448 7106 \r\n3 1958 17259 18773 7107 \r\n3 4011 6227 17259 7107 \r\n3 3305 18773 6227 7107 \r\n3 2149 18776 18775 7108 \r\n3 4951 18774 18776 7108 \r\n3 3310 18775 18774 7108 \r\n3 3894 15136 18778 7109 \r\n3 2442 18777 15136 7109 \r\n3 2910 18778 18777 7109 \r\n3 1225 18747 18780 7110 \r\n3 96 18779 18747 7110 \r\n3 2156 18780 18779 7110 \r\n3 164 18781 17789 7111 \r\n3 4095 12480 18781 7111 \r\n3 10 17789 12480 7111 \r\n3 961 17107 18782 7112 \r\n3 4996 6909 17107 7112 \r\n3 4761 18782 6909 7112 \r\n3 2252 7164 18783 7113 \r\n3 3850 11124 7164 7113 \r\n3 2675 18783 11124 7113 \r\n3 1487 18784 13359 7114 \r\n3 1630 8914 18784 7114 \r\n3 2727 13359 8914 7114 \r\n3 3523 18770 17831 7115 \r\n3 4088 15046 18770 7115 \r\n3 4814 17831 15046 7115 \r\n3 4762 18785 14250 7116 \r\n3 3357 17989 18785 7116 \r\n3 1245 14250 17989 7116 \r\n3 3483 18787 5775 7117 \r\n3 1693 18786 18787 7117 \r\n3 1004 5775 18786 7117 \r\n3 1537 17676 17891 7118 \r\n3 4264 18788 17676 7118 \r\n3 1202 17891 18788 7118 \r\n3 2719 5331 8427 7119 \r\n3 2424 14541 5331 7119 \r\n3 356 8427 14541 7119 \r\n3 2198 18790 18789 7120 \r\n3 4178 13563 18790 7120 \r\n3 3702 18789 13563 7120 \r\n3 161 18791 14111 7121 \r\n3 2481 15413 18791 7121 \r\n3 1361 14111 15413 7121 \r\n3 30 18792 7256 7122 \r\n3 1925 9897 18792 7122 \r\n3 2710 7256 9897 7122 \r\n3 3728 5960 18794 7123 \r\n3 3486 18793 5960 7123 \r\n3 4123 18794 18793 7123 \r\n3 2719 8426 8248 7124 \r\n3 2653 17002 8426 7124 \r\n3 3620 8248 17002 7124 \r\n3 1953 18476 6298 7125 \r\n3 3929 18117 18476 7125 \r\n3 3942 6298 18117 7125 \r\n3 944 6035 15433 7126 \r\n3 293 18795 6035 7126 \r\n3 4936 15433 18795 7126 \r\n3 371 18796 9540 7127 \r\n3 2378 17155 18796 7127 \r\n3 3792 9540 17155 7127 \r\n3 1325 13275 18797 7128 \r\n3 3619 16081 13275 7128 \r\n3 4769 18797 16081 7128 \r\n3 1405 13995 14967 7129 \r\n3 2735 11688 13995 7129 \r\n3 1160 14967 11688 7129 \r\n3 2830 17323 7056 7130 \r\n3 3670 14821 17323 7130 \r\n3 1940 7056 14821 7130 \r\n3 4920 13960 16566 7131 \r\n3 485 15177 13960 7131 \r\n3 2397 16566 15177 7131 \r\n3 662 18800 18799 7132 \r\n3 1690 18798 18800 7132 \r\n3 1321 18799 18798 7132 \r\n3 4414 6854 18801 7133 \r\n3 1015 14927 6854 7133 \r\n3 4581 18801 14927 7133 \r\n3 2520 18803 18802 7134 \r\n3 1271 17083 18803 7134 \r\n3 937 18802 17083 7134 \r\n3 2034 14820 18805 7135 \r\n3 4222 18804 14820 7135 \r\n3 1782 18805 18804 7135 \r\n3 51 10011 9303 7136 \r\n3 2239 18806 10011 7136 \r\n3 769 9303 18806 7136 \r\n3 941 18807 11807 7137 \r\n3 1956 14324 18807 7137 \r\n3 4295 11807 14324 7137 \r\n3 3547 18810 18809 7138 \r\n3 2732 18808 18810 7138 \r\n3 4397 18809 18808 7138 \r\n3 2025 16772 8093 7139 \r\n3 4804 18811 16772 7139 \r\n3 2888 8093 18811 7139 \r\n3 2442 14105 18777 7140 \r\n3 3193 18812 14105 7140 \r\n3 2910 18777 18812 7140 \r\n3 165 18813 5575 7141 \r\n3 2183 9443 18813 7141 \r\n3 4571 5575 9443 7141 \r\n3 36 7399 18814 7142 \r\n3 1243 11054 7399 7142 \r\n3 2253 18814 11054 7142 \r\n3 3168 16960 15921 7143 \r\n3 4059 11443 16960 7143 \r\n3 1047 15921 11443 7143 \r\n3 268 18817 18816 7144 \r\n3 3996 18815 18817 7144 \r\n3 4652 18816 18815 7144 \r\n3 758 12471 16629 7145 \r\n3 2788 5768 12471 7145 \r\n3 2398 16629 5768 7145 \r\n3 1993 18164 6010 7146 \r\n3 918 18818 18164 7146 \r\n3 3771 6010 18818 7146 \r\n3 100 16988 13261 7147 \r\n3 3701 13949 16988 7147 \r\n3 48 13261 13949 7147 \r\n3 3258 13964 9942 7148 \r\n3 237 18819 13964 7148 \r\n3 1637 9942 18819 7148 \r\n3 3783 5260 16811 7149 \r\n3 4302 18820 5260 7149 \r\n3 4769 16811 18820 7149 \r\n3 4377 10925 18821 7150 \r\n3 1595 18103 10925 7150 \r\n3 3036 18821 18103 7150 \r\n3 115 17184 17948 7151 \r\n3 2425 17196 17184 7151 \r\n3 1660 17948 17196 7151 \r\n3 2888 18811 11676 7152 \r\n3 4804 18482 18811 7152 \r\n3 3549 11676 18482 7152 \r\n3 2409 7825 18109 7153 \r\n3 1555 11067 7825 7153 \r\n3 2448 18109 11067 7153 \r\n3 1599 18822 6664 7154 \r\n3 2018 14416 18822 7154 \r\n3 1721 6664 14416 7154 \r\n3 406 13222 5428 7155 \r\n3 1117 5201 13222 7155 \r\n3 2816 5428 5201 7155 \r\n3 3457 18179 18823 7156 \r\n3 4465 17602 18179 7156 \r\n3 2273 18823 17602 7156 \r\n3 824 18697 18059 7157 \r\n3 3430 18824 18697 7157 \r\n3 910 18059 18824 7157 \r\n3 3177 9907 8810 7158 \r\n3 3273 18825 9907 7158 \r\n3 2626 8810 18825 7158 \r\n3 2555 18381 13666 7159 \r\n3 2612 13108 18381 7159 \r\n3 764 13666 13108 7159 \r\n3 4923 12892 17429 7160 \r\n3 3649 13817 12892 7160 \r\n3 1316 17429 13817 7160 \r\n3 1939 15312 16523 7161 \r\n3 4638 17723 15312 7161 \r\n3 2878 16523 17723 7161 \r\n3 1002 18827 12791 7162 \r\n3 3658 18826 18827 7162 \r\n3 963 12791 18826 7162 \r\n3 3888 8695 14096 7163 \r\n3 3904 14735 8695 7163 \r\n3 4728 14096 14735 7163 \r\n3 4450 6864 18073 7164 \r\n3 3670 18254 6864 7164 \r\n3 2655 18073 18254 7164 \r\n3 4364 7455 12151 7165 \r\n3 949 18828 7455 7165 \r\n3 295 12151 18828 7165 \r\n3 3162 6827 12291 7166 \r\n3 3757 5395 6827 7166 \r\n3 2532 12291 5395 7166 \r\n3 4881 18830 18829 7167 \r\n3 5001 6474 18830 7167 \r\n3 2372 18829 6474 7167 \r\n3 4226 17939 16550 7168 \r\n3 4406 15681 17939 7168 \r\n3 3735 16550 15681 7168 \r\n3 99 12963 7320 7169 \r\n3 2413 18151 12963 7169 \r\n3 4896 7320 18151 7169 \r\n3 2163 12937 14148 7170 \r\n3 2476 13722 12937 7170 \r\n3 3803 14148 13722 7170 \r\n3 2474 6069 15485 7171 \r\n3 1512 12370 6069 7171 \r\n3 1134 15485 12370 7171 \r\n3 144 18557 18831 7172 \r\n3 3897 14048 18557 7172 \r\n3 725 18831 14048 7172 \r\n3 2438 10395 17105 7173 \r\n3 3215 14800 10395 7173 \r\n3 3845 17105 14800 7173 \r\n3 131 18832 8480 7174 \r\n3 3637 13802 18832 7174 \r\n3 4907 8480 13802 7174 \r\n3 2858 11173 11719 7175 \r\n3 3495 10826 11173 7175 \r\n3 4556 11719 10826 7175 \r\n3 2951 18833 7221 7176 \r\n3 3155 14589 18833 7176 \r\n3 3331 7221 14589 7176 \r\n3 4818 11199 9143 7177 \r\n3 2822 18834 11199 7177 \r\n3 435 9143 18834 7177 \r\n3 4117 18836 8374 7178 \r\n3 3336 18835 18836 7178 \r\n3 2571 8374 18835 7178 \r\n3 2847 14069 10364 7179 \r\n3 3967 18837 14069 7179 \r\n3 698 10364 18837 7179 \r\n3 3855 18839 5927 7180 \r\n3 4116 18838 18839 7180 \r\n3 1824 5927 18838 7180 \r\n3 1295 15809 17055 7181 \r\n3 2549 6564 15809 7181 \r\n3 1355 17055 6564 7181 \r\n3 3230 18630 18840 7182 \r\n3 3646 18494 18630 7182 \r\n3 3597 18840 18494 7182 \r\n3 1796 12080 10097 7183 \r\n3 1734 18740 12080 7183 \r\n3 4965 10097 18740 7183 \r\n3 3450 17670 18841 7184 \r\n3 4844 8422 17670 7184 \r\n3 4174 18841 8422 7184 \r\n3 2198 18843 18790 7185 \r\n3 1815 18842 18843 7185 \r\n3 4178 18790 18842 7185 \r\n3 4841 16190 18844 7186 \r\n3 2925 18438 16190 7186 \r\n3 4291 18844 18438 7186 \r\n3 4696 18499 18845 7187 \r\n3 2714 12102 18499 7187 \r\n3 4376 18845 12102 7187 \r\n3 3961 16596 14604 7188 \r\n3 2972 17364 16596 7188 \r\n3 3217 14604 17364 7188 \r\n3 3456 17627 15288 7189 \r\n3 4690 18846 17627 7189 \r\n3 1663 15288 18846 7189 \r\n3 4440 18847 16737 7190 \r\n3 3457 18823 18847 7190 \r\n3 2273 16737 18823 7190 \r\n3 2321 10240 18848 7191 \r\n3 4888 15659 10240 7191 \r\n3 2303 18848 15659 7191 \r\n3 4593 15188 18849 7192 \r\n3 922 14367 15188 7192 \r\n3 273 18849 14367 7192 \r\n3 4237 11537 15498 7193 \r\n3 888 10276 11537 7193 \r\n3 1800 15498 10276 7193 \r\n3 708 18851 18850 7194 \r\n3 2001 14409 18851 7194 \r\n3 366 18850 14409 7194 \r\n3 4812 9561 6609 7195 \r\n3 3284 18852 9561 7195 \r\n3 53 6609 18852 7195 \r\n3 3835 17958 18853 7196 \r\n3 2063 13594 17958 7196 \r\n3 540 18853 13594 7196 \r\n3 244 10680 10769 7197 \r\n3 3690 18854 10680 7197 \r\n3 4524 10769 18854 7197 \r\n3 2947 18855 12289 7198 \r\n3 2772 7533 18855 7198 \r\n3 2369 12289 7533 7198 \r\n3 3645 9721 6465 7199 \r\n3 3511 16438 9721 7199 \r\n3 2509 6465 16438 7199 \r\n3 2475 11977 18856 7200 \r\n3 2278 8932 11977 7200 \r\n3 1240 18856 8932 7200 \r\n3 3747 11342 9946 7201 \r\n3 2729 11251 11342 7201 \r\n3 4158 9946 11251 7201 \r\n3 2498 8745 9797 7202 \r\n3 2018 18857 8745 7202 \r\n3 1615 9797 18857 7202 \r\n3 3876 17285 18859 7203 \r\n3 2176 18858 17285 7203 \r\n3 795 18859 18858 7203 \r\n3 651 8509 15137 7204 \r\n3 1683 8988 8509 7204 \r\n3 2588 15137 8988 7204 \r\n3 4404 15296 15482 7205 \r\n3 1520 18860 15296 7205 \r\n3 4729 15482 18860 7205 \r\n3 2510 15561 18520 7206 \r\n3 3026 8534 15561 7206 \r\n3 1365 18520 8534 7206 \r\n3 2491 16645 18861 7207 \r\n3 1684 13445 16645 7207 \r\n3 3477 18861 13445 7207 \r\n3 782 9113 10462 7208 \r\n3 1879 18862 9113 7208 \r\n3 4745 10462 18862 7208 \r\n3 2315 18864 18863 7209 \r\n3 3696 9037 18864 7209 \r\n3 206 18863 9037 7209 \r\n3 3348 7616 16351 7210 \r\n3 4396 16945 7616 7210 \r\n3 2946 16351 16945 7210 \r\n3 4652 18815 8348 7211 \r\n3 3996 18865 18815 7211 \r\n3 1346 8348 18865 7211 \r\n3 2569 18867 6078 7212 \r\n3 1731 18866 18867 7212 \r\n3 1198 6078 18866 7212 \r\n3 834 18868 7234 7213 \r\n3 974 8429 18868 7213 \r\n3 432 7234 8429 7213 \r\n3 4841 18369 18216 7214 \r\n3 4299 18869 18369 7214 \r\n3 2120 18216 18869 7214 \r\n3 3568 18872 18871 7215 \r\n3 2400 18870 18872 7215 \r\n3 4724 18871 18870 7215 \r\n3 3074 17484 11632 7216 \r\n3 4282 7112 17484 7216 \r\n3 3307 11632 7112 7216 \r\n3 2123 18873 11093 7217 \r\n3 2049 8603 18873 7217 \r\n3 3455 11093 8603 7217 \r\n3 1256 5199 18874 7218 \r\n3 3417 9818 5199 7218 \r\n3 4915 18874 9818 7218 \r\n3 790 18876 17596 7219 \r\n3 435 18875 18876 7219 \r\n3 1654 17596 18875 7219 \r\n3 4504 18877 9457 7220 \r\n3 959 17139 18877 7220 \r\n3 2260 9457 17139 7220 \r\n3 3583 9331 18878 7221 \r\n3 59 18026 9331 7221 \r\n3 1576 18878 18026 7221 \r\n3 20 9478 18586 7222 \r\n3 4707 18654 9478 7222 \r\n3 3550 18586 18654 7222 \r\n3 3666 18879 17923 7223 \r\n3 3860 15852 18879 7223 \r\n3 1262 17923 15852 7223 \r\n3 1739 12538 13583 7224 \r\n3 2554 11751 12538 7224 \r\n3 3205 13583 11751 7224 \r\n3 4200 18463 6380 7225 \r\n3 2991 18162 18463 7225 \r\n3 2007 6380 18162 7225 \r\n3 2341 18881 7918 7226 \r\n3 4951 18880 18881 7226 \r\n3 671 7918 18880 7226 \r\n3 2722 18883 18882 7227 \r\n3 1551 18696 18883 7227 \r\n3 3962 18882 18696 7227 \r\n3 4053 18886 18885 7228 \r\n3 3843 18884 18886 7228 \r\n3 2038 18885 18884 7228 \r\n3 1499 16655 18887 7229 \r\n3 4254 18288 16655 7229 \r\n3 1073 18887 18288 7229 \r\n3 3925 9047 17984 7230 \r\n3 4751 15428 9047 7230 \r\n3 1037 17984 15428 7230 \r\n3 3725 18888 11190 7231 \r\n3 623 8367 18888 7231 \r\n3 2623 11190 8367 7231 \r\n3 4488 13838 18889 7232 \r\n3 27 14079 13838 7232 \r\n3 4310 18889 14079 7232 \r\n3 3451 18890 6711 7233 \r\n3 3752 12392 18890 7233 \r\n3 775 6711 12392 7233 \r\n3 4233 5715 17335 7234 \r\n3 468 17667 5715 7234 \r\n3 4201 17335 17667 7234 \r\n3 3947 14596 18017 7235 \r\n3 1630 18784 14596 7235 \r\n3 1487 18017 18784 7235 \r\n3 3170 13109 18200 7236 \r\n3 898 8157 13109 7236 \r\n3 1922 18200 8157 7236 \r\n3 3574 13571 13019 7237 \r\n3 4088 6802 13571 7237 \r\n3 876 13019 6802 7237 \r\n3 355 9274 13653 7238 \r\n3 973 17136 9274 7238 \r\n3 3132 13653 17136 7238 \r\n3 3997 18892 11203 7239 \r\n3 3614 18891 18892 7239 \r\n3 1767 11203 18891 7239 \r\n3 763 18893 9926 7240 \r\n3 3640 11894 18893 7240 \r\n3 2545 9926 11894 7240 \r\n3 25 18896 18895 7241 \r\n3 911 18894 18896 7241 \r\n3 71 18895 18894 7241 \r\n3 1297 13073 17945 7242 \r\n3 3760 17700 13073 7242 \r\n3 2399 17945 17700 7242 \r\n3 2075 18898 11578 7243 \r\n3 3018 18897 18898 7243 \r\n3 409 11578 18897 7243 \r\n3 1807 14019 18899 7244 \r\n3 4419 9510 14019 7244 \r\n3 2081 18899 9510 7244 \r\n3 4648 17837 7198 7245 \r\n3 2660 18900 17837 7245 \r\n3 3598 7198 18900 7245 \r\n3 2921 10131 16322 7246 \r\n3 1243 12827 10131 7246 \r\n3 1950 16322 12827 7246 \r\n3 1157 7984 18902 7247 \r\n3 2940 18901 7984 7247 \r\n3 4930 18902 18901 7247 \r\n3 3834 8574 13320 7248 \r\n3 2237 18721 8574 7248 \r\n3 3044 13320 18721 7248 \r\n3 4623 14433 18903 7249 \r\n3 1458 16428 14433 7249 \r\n3 1529 18903 16428 7249 \r\n3 3689 18905 18904 7250 \r\n3 4154 9393 18905 7250 \r\n3 345 18904 9393 7250 \r\n3 2086 18575 17037 7251 \r\n3 148 18906 18575 7251 \r\n3 1341 17037 18906 7251 \r\n3 3396 17879 18907 7252 \r\n3 4784 18514 17879 7252 \r\n3 2527 18907 18514 7252 \r\n3 3787 6404 17817 7253 \r\n3 4105 5185 6404 7253 \r\n3 1624 17817 5185 7253 \r\n3 2184 18694 18908 7254 \r\n3 1310 9518 18694 7254 \r\n3 221 18908 9518 7254 \r\n3 1196 10469 13711 7255 \r\n3 4719 18909 10469 7255 \r\n3 2680 13711 18909 7255 \r\n3 4769 18910 18797 7256 \r\n3 1109 12600 18910 7256 \r\n3 1325 18797 12600 7256 \r\n3 2909 12802 7139 7257 \r\n3 4410 6597 12802 7257 \r\n3 1435 7139 6597 7257 \r\n3 2832 7382 13190 7258 \r\n3 2570 13327 7382 7258 \r\n3 404 13190 13327 7258 \r\n3 1493 16527 16511 7259 \r\n3 3872 6891 16527 7259 \r\n3 2828 16511 6891 7259 \r\n3 593 18911 12225 7260 \r\n3 4722 15324 18911 7260 \r\n3 2559 12225 15324 7260 \r\n3 2385 18664 17156 7261 \r\n3 2610 15920 18664 7261 \r\n3 4217 17156 15920 7261 \r\n3 4520 10108 18912 7262 \r\n3 3472 15907 10108 7262 \r\n3 1002 18912 15907 7262 \r\n3 3230 14399 17289 7263 \r\n3 2491 18861 14399 7263 \r\n3 3477 17289 18861 7263 \r\n3 393 18913 16817 7264 \r\n3 2310 13714 18913 7264 \r\n3 4537 16817 13714 7264 \r\n3 3175 17563 18033 7265 \r\n3 907 11236 17563 7265 \r\n3 985 18033 11236 7265 \r\n3 272 18914 10952 7266 \r\n3 184 15763 18914 7266 \r\n3 4150 10952 15763 7266 \r\n3 3536 17577 8056 7267 \r\n3 1505 5227 17577 7267 \r\n3 744 8056 5227 7267 \r\n3 3634 6254 18119 7268 \r\n3 392 18755 6254 7268 \r\n3 863 18119 18755 7268 \r\n3 2293 17505 18915 7269 \r\n3 1625 17748 17505 7269 \r\n3 1780 18915 17748 7269 \r\n3 3784 12039 18916 7270 \r\n3 925 16788 12039 7270 \r\n3 4162 18916 16788 7270 \r\n3 1250 16446 18917 7271 \r\n3 1597 12774 16446 7271 \r\n3 1823 18917 12774 7271 \r\n3 2365 16096 14778 7272 \r\n3 2606 17133 16096 7272 \r\n3 565 14778 17133 7272 \r\n3 2879 18919 14767 7273 \r\n3 3054 18918 18919 7273 \r\n3 4265 14767 18918 7273 \r\n3 5000 12359 11959 7274 \r\n3 3777 17593 12359 7274 \r\n3 2478 11959 17593 7274 \r\n3 1313 6413 12343 7275 \r\n3 622 5073 6413 7275 \r\n3 1918 12343 5073 7275 \r\n3 3310 18774 16526 7276 \r\n3 4951 18881 18774 7276 \r\n3 2341 16526 18881 7276 \r\n3 1895 18921 17462 7277 \r\n3 3171 18920 18921 7277 \r\n3 2682 17462 18920 7277 \r\n3 198 18923 18922 7278 \r\n3 562 17783 18923 7278 \r\n3 1677 18922 17783 7278 \r\n3 556 17397 18924 7279 \r\n3 2793 8453 17397 7279 \r\n3 4761 18924 8453 7279 \r\n3 337 15905 18925 7280 \r\n3 567 16280 15905 7280 \r\n3 2505 18925 16280 7280 \r\n3 810 13587 9148 7281 \r\n3 2073 16838 13587 7281 \r\n3 2428 9148 16838 7281 \r\n3 3542 12049 9630 7282 \r\n3 3265 6044 12049 7282 \r\n3 1311 9630 6044 7282 \r\n3 657 10595 18926 7283 \r\n3 1588 18738 10595 7283 \r\n3 3976 18926 18738 7283 \r\n3 1439 11528 8645 7284 \r\n3 2670 18927 11528 7284 \r\n3 2393 8645 18927 7284 \r\n3 4838 18474 17937 7285 \r\n3 3499 17604 18474 7285 \r\n3 3085 17937 17604 7285 \r\n3 1778 18928 13978 7286 \r\n3 2411 12040 18928 7286 \r\n3 4002 13978 12040 7286 \r\n3 3455 8602 18930 7287 \r\n3 4678 18929 8602 7287 \r\n3 1849 18930 18929 7287 \r\n3 1897 17683 5491 7288 \r\n3 3419 13333 17683 7288 \r\n3 3638 5491 13333 7288 \r\n3 2315 12880 18864 7289 \r\n3 4871 15691 12880 7289 \r\n3 3696 18864 15691 7289 \r\n3 196 18933 18932 7290 \r\n3 4435 18931 18933 7290 \r\n3 150 18932 18931 7290 \r\n3 1930 9528 18934 7291 \r\n3 4297 5680 9528 7291 \r\n3 4592 18934 5680 7291 \r\n3 3955 18207 9714 7292 \r\n3 438 18935 18207 7292 \r\n3 4919 9714 18935 7292 \r\n3 2994 17588 17820 7293 \r\n3 2208 17321 17588 7293 \r\n3 2646 17820 17321 7293 \r\n3 2580 18936 7045 7294 \r\n3 2154 6417 18936 7294 \r\n3 3043 7045 6417 7294 \r\n3 4996 18937 13804 7295 \r\n3 3692 14479 18937 7295 \r\n3 3280 13804 14479 7295 \r\n3 4931 5739 18284 7296 \r\n3 1051 8460 5739 7296 \r\n3 866 18284 8460 7296 \r\n3 4502 18939 6963 7297 \r\n3 1175 18938 18939 7297 \r\n3 4829 6963 18938 7297 \r\n3 2241 14895 9910 7298 \r\n3 1812 18940 14895 7298 \r\n3 32 9910 18940 7298 \r\n3 896 18941 6212 7299 \r\n3 3016 12580 18941 7299 \r\n3 936 6212 12580 7299 \r\n3 713 18942 14266 7300 \r\n3 3481 17058 18942 7300 \r\n3 2465 14266 17058 7300 \r\n3 2502 18944 14234 7301 \r\n3 3125 18943 18944 7301 \r\n3 3936 14234 18943 7301 \r\n3 1116 16203 17590 7302 \r\n3 2256 5493 16203 7302 \r\n3 4770 17590 5493 7302 \r\n3 1444 18947 18946 7303 \r\n3 3684 18945 18947 7303 \r\n3 4693 18946 18945 7303 \r\n3 4136 16604 15901 7304 \r\n3 74 18553 16604 7304 \r\n3 4840 15901 18553 7304 \r\n3 4911 18948 17928 7305 \r\n3 844 15988 18948 7305 \r\n3 4628 17928 15988 7305 \r\n3 2097 12018 12260 7306 \r\n3 3006 16220 12018 7306 \r\n3 2031 12260 16220 7306 \r\n3 4110 11525 12254 7307 \r\n3 1771 8150 11525 7307 \r\n3 2381 12254 8150 7307 \r\n3 3214 18234 5533 7308 \r\n3 1813 6110 18234 7308 \r\n3 3251 5533 6110 7308 \r\n3 3310 18766 18775 7309 \r\n3 1876 15165 18766 7309 \r\n3 2149 18775 15165 7309 \r\n3 2394 14944 17962 7310 \r\n3 1405 14969 14944 7310 \r\n3 3167 17962 14969 7310 \r\n3 112 9792 18950 7311 \r\n3 4653 18949 9792 7311 \r\n3 430 18950 18949 7311 \r\n3 2984 11120 18424 7312 \r\n3 2692 7567 11120 7312 \r\n3 1691 18424 7567 7312 \r\n3 3691 6427 9821 7313 \r\n3 4821 18951 6427 7313 \r\n3 4947 9821 18951 7313 \r\n3 2097 5166 15640 7314 \r\n3 3719 16484 5166 7314 \r\n3 996 15640 16484 7314 \r\n3 3374 13920 12831 7315 \r\n3 3313 15976 13920 7315 \r\n3 894 12831 15976 7315 \r\n3 4581 16752 18801 7316 \r\n3 4289 11491 16752 7316 \r\n3 4414 18801 11491 7316 \r\n3 4802 18952 8951 7317 \r\n3 4403 5019 18952 7317 \r\n3 889 8951 5019 7317 \r\n3 1041 11996 16546 7318 \r\n3 334 6737 11996 7318 \r\n3 1644 16546 6737 7318 \r\n3 414 15044 5574 7319 \r\n3 1441 5065 15044 7319 \r\n3 165 5574 5065 7319 \r\n3 3016 18941 13943 7320 \r\n3 896 10444 18941 7320 \r\n3 1580 13943 10444 7320 \r\n3 3680 17262 17119 7321 \r\n3 279 13114 17262 7321 \r\n3 4714 17119 13114 7321 \r\n3 2992 12235 5902 7322 \r\n3 4087 18953 12235 7322 \r\n3 12 5902 18953 7322 \r\n3 2266 14698 10719 7323 \r\n3 1931 5031 14698 7323 \r\n3 451 10719 5031 7323 \r\n3 932 18955 9762 7324 \r\n3 1035 18954 18955 7324 \r\n3 2557 9762 18954 7324 \r\n3 1119 17834 17856 7325 \r\n3 895 18956 17834 7325 \r\n3 2379 17856 18956 7325 \r\n3 1762 9280 18957 7326 \r\n3 3863 13157 9280 7326 \r\n3 1237 18957 13157 7326 \r\n3 1012 15668 17510 7327 \r\n3 3551 18958 15668 7327 \r\n3 3246 17510 18958 7327 \r\n3 1671 18960 14226 7328 \r\n3 949 18959 18960 7328 \r\n3 987 14226 18959 7328 \r\n3 1634 18307 16376 7329 \r\n3 3260 18572 18307 7329 \r\n3 2057 16376 18572 7329 \r\n3 4264 7754 18788 7330 \r\n3 304 10821 7754 7330 \r\n3 1202 18788 10821 7330 \r\n3 4747 18961 10237 7331 \r\n3 62 17968 18961 7331 \r\n3 590 10237 17968 7331 \r\n3 1573 17747 16669 7332 \r\n3 1593 12324 17747 7332 \r\n3 1756 16669 12324 7332 \r\n3 4987 16453 16283 7333 \r\n3 3322 17814 16453 7333 \r\n3 4600 16283 17814 7333 \r\n3 1118 12117 18962 7334 \r\n3 2010 13906 12117 7334 \r\n3 2230 18962 13906 7334 \r\n3 3987 13998 18645 7335 \r\n3 2111 16131 13998 7335 \r\n3 543 18645 16131 7335 \r\n3 864 7190 18963 7336 \r\n3 2333 10200 7190 7336 \r\n3 63 18963 10200 7336 \r\n3 1464 18965 17199 7337 \r\n3 1649 18964 18965 7337 \r\n3 2918 17199 18964 7337 \r\n3 3363 16889 18966 7338 \r\n3 4643 13439 16889 7338 \r\n3 992 18966 13439 7338 \r\n3 153 10980 12293 7339 \r\n3 1621 16777 10980 7339 \r\n3 3162 12293 16777 7339 \r\n3 2554 6544 12309 7340 \r\n3 137 18967 6544 7340 \r\n3 2088 12309 18967 7340 \r\n3 4467 6054 18968 7341 \r\n3 719 18673 6054 7341 \r\n3 2410 18968 18673 7341 \r\n3 211 18969 18084 7342 \r\n3 3362 13776 18969 7342 \r\n3 1324 18084 13776 7342 \r\n3 1753 6221 18970 7343 \r\n3 3722 16662 6221 7343 \r\n3 1306 18970 16662 7343 \r\n3 4668 16795 12167 7344 \r\n3 793 15217 16795 7344 \r\n3 98 12167 15217 7344 \r\n3 2 9436 6804 7345 \r\n3 4987 8450 9436 7345 \r\n3 876 6804 8450 7345 \r\n3 721 18972 11089 7346 \r\n3 3355 18971 18972 7346 \r\n3 4686 11089 18971 7346 \r\n3 1988 7695 18444 7347 \r\n3 1847 11942 7695 7347 \r\n3 300 18444 11942 7347 \r\n3 672 18122 18260 7348 \r\n3 902 13606 18122 7348 \r\n3 782 18260 13606 7348 \r\n3 1271 18803 18973 7349 \r\n3 2520 17611 18803 7349 \r\n3 831 18973 17611 7349 \r\n3 1846 7381 18244 7350 \r\n3 4284 18974 7381 7350 \r\n3 477 18244 18974 7350 \r\n3 592 18975 16912 7351 \r\n3 3395 7337 18975 7351 \r\n3 4590 16912 7337 7351 \r\n3 3427 10630 9773 7352 \r\n3 2850 11059 10630 7352 \r\n3 4350 9773 11059 7352 \r\n3 1190 15768 14481 7353 \r\n3 747 16010 15768 7353 \r\n3 318 14481 16010 7353 \r\n3 3990 18976 9766 7354 \r\n3 1049 17538 18976 7354 \r\n3 4905 9766 17538 7354 \r\n3 1140 18977 8631 7355 \r\n3 4641 17694 18977 7355 \r\n3 3022 8631 17694 7355 \r\n3 1055 10197 18978 7356 \r\n3 3198 10907 10197 7356 \r\n3 298 18978 10907 7356 \r\n3 2737 18979 14886 7357 \r\n3 1242 18339 18979 7357 \r\n3 1432 14886 18339 7357 \r\n3 1448 18028 15546 7358 \r\n3 4454 18980 18028 7358 \r\n3 1180 15546 18980 7358 \r\n3 3724 18981 5093 7359 \r\n3 164 17782 18981 7359 \r\n3 4529 5093 17782 7359 \r\n3 4515 11919 9193 7360 \r\n3 79 13905 11919 7360 \r\n3 2840 9193 13905 7360 \r\n3 2441 15855 18709 7361 \r\n3 3700 13541 15855 7361 \r\n3 1647 18709 13541 7361 \r\n3 3425 16212 18983 7362 \r\n3 908 18982 16212 7362 \r\n3 4336 18983 18982 7362 \r\n3 579 18984 7847 7363 \r\n3 1669 6261 18984 7363 \r\n3 4232 7847 6261 7363 \r\n3 2353 8934 16193 7364 \r\n3 4244 9729 8934 7364 \r\n3 2870 16193 9729 7364 \r\n3 3160 18985 18134 7365 \r\n3 4415 18742 18985 7365 \r\n3 1102 18134 18742 7365 \r\n3 3463 18986 15271 7366 \r\n3 2803 10095 18986 7366 \r\n3 602 15271 10095 7366 \r\n3 4113 13345 10405 7367 \r\n3 234 15131 13345 7367 \r\n3 2630 10405 15131 7367 \r\n3 3920 11623 8007 7368 \r\n3 2298 13366 11623 7368 \r\n3 2034 8007 13366 7368 \r\n3 4453 18987 11295 7369 \r\n3 1466 11013 18987 7369 \r\n3 4808 11295 11013 7369 \r\n3 1120 6408 13846 7370 \r\n3 4834 18988 6408 7370 \r\n3 780 13846 18988 7370 \r\n3 2838 12149 18990 7371 \r\n3 2290 18989 12149 7371 \r\n3 4932 18990 18989 7371 \r\n3 2174 10528 10999 7372 \r\n3 3584 6483 10528 7372 \r\n3 325 10999 6483 7372 \r\n3 416 18992 5364 7373 \r\n3 933 18991 18992 7373 \r\n3 4683 5364 18991 7373 \r\n3 742 12732 18993 7374 \r\n3 4222 14819 12732 7374 \r\n3 4186 18993 14819 7374 \r\n3 3354 18656 18994 7375 \r\n3 1854 17934 18656 7375 \r\n3 4994 18994 17934 7375 \r\n3 1887 11844 18296 7376 \r\n3 12 18953 11844 7376 \r\n3 4087 18296 18953 7376 \r\n3 1042 18534 18995 7377 \r\n3 1535 7857 18534 7377 \r\n3 4951 18995 7857 7377 \r\n3 2557 13016 18996 7378 \r\n3 3578 8823 13016 7378 \r\n3 2979 18996 8823 7378 \r\n3 4697 11141 18997 7379 \r\n3 1264 6606 11141 7379 \r\n3 3593 18997 6606 7379 \r\n3 3449 13601 18998 7380 \r\n3 1606 14554 13601 7380 \r\n3 174 18998 14554 7380 \r\n3 4856 6414 8329 7381 \r\n3 1313 16876 6414 7381 \r\n3 3096 8329 16876 7381 \r\n3 1431 12709 7791 7382 \r\n3 60 18999 12709 7382 \r\n3 4339 7791 18999 7382 \r\n3 281 19001 19000 7383 \r\n3 3407 13230 19001 7383 \r\n3 1505 19000 13230 7383 \r\n3 290 19002 18705 7384 \r\n3 4733 13785 19002 7384 \r\n3 4796 18705 13785 7384 \r\n3 4282 17483 9018 7385 \r\n3 2473 19003 17483 7385 \r\n3 4206 9018 19003 7385 \r\n3 353 11633 17034 7386 \r\n3 3307 8601 11633 7386 \r\n3 1326 17034 8601 7386 \r\n3 2626 18825 17578 7387 \r\n3 3273 13864 18825 7387 \r\n3 667 17578 13864 7387 \r\n3 3512 19004 5683 7388 \r\n3 1024 15516 19004 7388 \r\n3 1394 5683 15516 7388 \r\n3 3389 11723 8495 7389 \r\n3 1945 19005 11723 7389 \r\n3 4727 8495 19005 7389 \r\n3 4055 16775 12138 7390 \r\n3 2792 15980 16775 7390 \r\n3 3351 12138 15980 7390 \r\n3 2683 9101 15898 7391 \r\n3 2883 17512 9101 7391 \r\n3 4903 15898 17512 7391 \r\n3 4693 10849 18946 7392 \r\n3 4453 11294 10849 7392 \r\n3 1444 18946 11294 7392 \r\n3 1151 12754 14816 7393 \r\n3 1228 19006 12754 7393 \r\n3 90 14816 19006 7393 \r\n3 4177 18186 14964 7394 \r\n3 794 18588 18186 7394 \r\n3 1247 14964 18588 7394 \r\n3 3692 8958 14480 7395 \r\n3 524 19007 8958 7395 \r\n3 1280 14480 19007 7395 \r\n3 2914 14938 15371 7396 \r\n3 3798 17362 14938 7396 \r\n3 4797 15371 17362 7396 \r\n3 589 12351 19008 7397 \r\n3 1947 15835 12351 7397 \r\n3 152 19008 15835 7397 \r\n3 3735 12609 9261 7398 \r\n3 2 18769 12609 7398 \r\n3 3523 9261 18769 7398 \r\n3 639 17695 5055 7399 \r\n3 4641 19009 17695 7399 \r\n3 2876 5055 19009 7399 \r\n3 2312 9586 17275 7400 \r\n3 2199 19010 9586 7400 \r\n3 4287 17275 19010 7400 \r\n3 3768 19012 15934 7401 \r\n3 925 19011 19012 7401 \r\n3 3372 15934 19011 7401 \r\n3 2235 17373 18749 7402 \r\n3 4621 16022 17373 7402 \r\n3 3049 18749 16022 7402 \r\n3 641 19014 19013 7403 \r\n3 3873 17448 19014 7403 \r\n3 580 19013 17448 7403 \r\n3 2451 19015 16779 7404 \r\n3 977 6828 19015 7404 \r\n3 3162 16779 6828 7404 \r\n3 147 19016 13338 7405 \r\n3 763 9925 19016 7405 \r\n3 1443 13338 9925 7405 \r\n3 4905 12384 15169 7406 \r\n3 2538 19017 12384 7406 \r\n3 2814 15169 19017 7406 \r\n3 3530 11404 16886 7407 \r\n3 3400 19018 11404 7407 \r\n3 4060 16886 19018 7407 \r\n3 1299 19020 13430 7408 \r\n3 3070 19019 19020 7408 \r\n3 4476 13430 19019 7408 \r\n3 2403 19022 19021 7409 \r\n3 1050 6513 19022 7409 \r\n3 3442 19021 6513 7409 \r\n3 3575 19023 10771 7410 \r\n3 4673 5373 19023 7410 \r\n3 2766 10771 5373 7410 \r\n3 3865 11445 19025 7411 \r\n3 4604 19024 11445 7411 \r\n3 1254 19025 19024 7411 \r\n3 4356 10111 8172 7412 \r\n3 3306 19026 10111 7412 \r\n3 4266 8172 19026 7412 \r\n3 4020 14899 16870 7413 \r\n3 1222 14441 14899 7413 \r\n3 3392 16870 14441 7413 \r\n3 4533 18417 9297 7414 \r\n3 1323 17268 18417 7414 \r\n3 965 9297 17268 7414 \r\n3 1061 19027 15569 7415 \r\n3 14 13473 19027 7415 \r\n3 634 15569 13473 7415 \r\n3 1505 19028 19000 7416 \r\n3 2723 18353 19028 7416 \r\n3 281 19000 18353 7416 \r\n3 4394 5778 19030 7417 \r\n3 2958 19029 5778 7417 \r\n3 57 19030 19029 7417 \r\n3 2736 19033 19032 7418 \r\n3 2540 19031 19033 7418 \r\n3 1254 19032 19031 7418 \r\n3 3191 7186 19034 7419 \r\n3 1465 12534 7186 7419 \r\n3 299 19034 12534 7419 \r\n3 4990 19035 13285 7420 \r\n3 2535 7357 19035 7420 \r\n3 2875 13285 7357 7420 \r\n3 3758 7514 11279 7421 \r\n3 691 19036 7514 7421 \r\n3 4442 11279 19036 7421 \r\n3 2667 19037 6552 7422 \r\n3 1134 12369 19037 7422 \r\n3 437 6552 12369 7422 \r\n3 4046 18561 15782 7423 \r\n3 2576 19038 18561 7423 \r\n3 1539 15782 19038 7423 \r\n3 2849 11472 7053 7424 \r\n3 3014 15779 11472 7424 \r\n3 1347 7053 15779 7424 \r\n3 4045 8905 13585 7425 \r\n3 4438 14739 8905 7425 \r\n3 292 13585 14739 7425 \r\n3 2248 17382 19039 7426 \r\n3 3932 12796 17382 7426 \r\n3 886 19039 12796 7426 \r\n3 4828 19040 8347 7427 \r\n3 2215 5672 19040 7427 \r\n3 3103 8347 5672 7427 \r\n3 3288 7195 19041 7428 \r\n3 3157 6469 7195 7428 \r\n3 3342 19041 6469 7428 \r\n3 4494 15228 17636 7429 \r\n3 1711 14447 15228 7429 \r\n3 827 17636 14447 7429 \r\n3 4520 18912 16235 7430 \r\n3 1002 12790 18912 7430 \r\n3 4878 16235 12790 7430 \r\n3 2108 16840 17408 7431 \r\n3 882 19042 16840 7431 \r\n3 4799 17408 19042 7431 \r\n3 3488 10549 16880 7432 \r\n3 1504 10755 10549 7432 \r\n3 4114 16880 10755 7432 \r\n3 4077 16939 19043 7433 \r\n3 1388 15511 16939 7433 \r\n3 828 19043 15511 7433 \r\n3 3655 14948 16393 7434 \r\n3 2079 17798 14948 7434 \r\n3 1680 16393 17798 7434 \r\n3 2805 19044 8402 7435 \r\n3 2911 16766 19044 7435 \r\n3 2519 8402 16766 7435 \r\n3 600 11570 7507 7436 \r\n3 3939 5713 11570 7436 \r\n3 4233 7507 5713 7436 \r\n3 3910 19045 8798 7437 \r\n3 734 17976 19045 7437 \r\n3 3245 8798 17976 7437 \r\n3 735 17495 15290 7438 \r\n3 3868 11263 17495 7438 \r\n3 1338 15290 11263 7438 \r\n3 4399 13625 5212 7439 \r\n3 869 19046 13625 7439 \r\n3 122 5212 19046 7439 \r\n3 1166 19047 12927 7440 \r\n3 2896 10040 19047 7440 \r\n3 2975 12927 10040 7440 \r\n3 1448 7072 18027 7441 \r\n3 88 19048 7072 7441 \r\n3 1370 18027 19048 7441 \r\n3 3762 19050 19049 7442 \r\n3 4210 5906 19050 7442 \r\n3 3652 19049 5906 7442 \r\n3 439 19051 13904 7443 \r\n3 209 8371 19051 7443 \r\n3 2840 13904 8371 7443 \r\n3 964 16578 19052 7444 \r\n3 4559 12583 16578 7444 \r\n3 589 19052 12583 7444 \r\n3 1804 19054 18113 7445 \r\n3 1788 19053 19054 7445 \r\n3 886 18113 19053 7445 \r\n3 4624 18621 8091 7446 \r\n3 2896 19047 18621 7446 \r\n3 1166 8091 19047 7446 \r\n3 3340 19055 16740 7447 \r\n3 4516 10684 19055 7447 \r\n3 2064 16740 10684 7447 \r\n3 3967 12434 19056 7448 \r\n3 2499 6623 12434 7448 \r\n3 4868 19056 6623 7448 \r\n3 4491 7558 11612 7449 \r\n3 1904 19057 7558 7449 \r\n3 1470 11612 19057 7449 \r\n3 500 6954 18529 7450 \r\n3 1719 14955 6954 7450 \r\n3 4145 18529 14955 7450 \r\n3 1520 15295 10408 7451 \r\n3 134 16627 15295 7451 \r\n3 4415 10408 16627 7451 \r\n3 3753 5459 19058 7452 \r\n3 4766 14669 5459 7452 \r\n3 904 19058 14669 7452 \r\n3 94 11272 16015 7453 \r\n3 4889 13824 11272 7453 \r\n3 3694 16015 13824 7453 \r\n3 4910 15389 7049 7454 \r\n3 2284 17635 15389 7454 \r\n3 3430 7049 17635 7454 \r\n3 2842 9745 8381 7455 \r\n3 4496 6929 9745 7455 \r\n3 3617 8381 6929 7455 \r\n3 1661 16116 11211 7456 \r\n3 3228 12212 16116 7456 \r\n3 1342 11211 12212 7456 \r\n3 3124 19060 19059 7457 \r\n3 3675 15571 19060 7457 \r\n3 1766 19059 15571 7457 \r\n3 2002 19061 10122 7458 \r\n3 4440 17081 19061 7458 \r\n3 380 10122 17081 7458 \r\n3 132 17822 13861 7459 \r\n3 399 8911 17822 7459 \r\n3 3291 13861 8911 7459 \r\n3 2392 19062 8051 7460 \r\n3 1165 12612 19062 7460 \r\n3 4101 8051 12612 7460 \r\n3 587 5326 13003 7461 \r\n3 1986 16224 5326 7461 \r\n3 1729 13003 16224 7461 \r\n3 108 14804 19063 7462 \r\n3 649 12817 14804 7462 \r\n3 2642 19063 12817 7462 \r\n3 885 19065 19064 7463 \r\n3 4504 13847 19065 7463 \r\n3 1063 19064 13847 7463 \r\n3 3376 19067 12938 7464 \r\n3 1843 19066 19067 7464 \r\n3 2476 12938 19066 7464 \r\n3 3720 19069 19068 7465 \r\n3 3426 18655 19069 7465 \r\n3 4707 19068 18655 7465 \r\n3 4214 15845 10765 7466 \r\n3 2778 19070 15845 7466 \r\n3 3849 10765 19070 7466 \r\n3 3842 19071 10072 7467 \r\n3 2744 18413 19071 7467 \r\n3 1337 10072 18413 7467 \r\n3 370 19073 19072 7468 \r\n3 4992 13046 19073 7468 \r\n3 2864 19072 13046 7468 \r\n3 4845 15702 17717 7469 \r\n3 897 15174 15702 7469 \r\n3 2565 17717 15174 7469 \r\n3 749 19074 15158 7470 \r\n3 1269 15576 19074 7470 \r\n3 3213 15158 15576 7470 \r\n3 2671 5003 16972 7471 \r\n3 2664 19075 5003 7471 \r\n3 4915 16972 19075 7471 \r\n3 131 19077 18832 7472 \r\n3 4872 19076 19077 7472 \r\n3 3637 18832 19076 7472 \r\n3 4717 19078 5624 7473 \r\n3 3482 5344 19078 7473 \r\n3 200 5624 5344 7473 \r\n3 3854 6242 10020 7474 \r\n3 2206 6223 6242 7474 \r\n3 2623 10020 6223 7474 \r\n3 2074 8862 19079 7475 \r\n3 1978 18685 8862 7475 \r\n3 4082 19079 18685 7475 \r\n3 1341 18906 18599 7476 \r\n3 148 17720 18906 7476 \r\n3 2615 18599 17720 7476 \r\n3 4785 13254 15490 7477 \r\n3 3031 8164 13254 7477 \r\n3 3051 15490 8164 7477 \r\n3 2436 19080 13030 7478 \r\n3 3319 11477 19080 7478 \r\n3 3966 13030 11477 7478 \r\n3 2030 19082 14206 7479 \r\n3 2560 19081 19082 7479 \r\n3 1700 14206 19081 7479 \r\n3 843 14328 12850 7480 \r\n3 1211 13302 14328 7480 \r\n3 4916 12850 13302 7480 \r\n3 3500 18555 12725 7481 \r\n3 1004 12046 18555 7481 \r\n3 4090 12725 12046 7481 \r\n3 763 19016 14949 7482 \r\n3 147 17205 19016 7482 \r\n3 2809 14949 17205 7482 \r\n3 1819 19083 5760 7483 \r\n3 1269 14575 19083 7483 \r\n3 2336 5760 14575 7483 \r\n3 103 16940 12321 7484 \r\n3 4077 14043 16940 7484 \r\n3 2698 12321 14043 7484 \r\n3 4737 5948 10614 7485 \r\n3 3821 19084 5948 7485 \r\n3 1555 10614 19084 7485 \r\n3 2438 19085 10393 7486 \r\n3 4801 10936 19085 7486 \r\n3 3825 10393 10936 7486 \r\n3 1998 19086 5172 7487 \r\n3 2990 10365 19086 7487 \r\n3 2651 5172 10365 7487 \r\n3 1633 17752 16739 7488 \r\n3 4842 18385 17752 7488 \r\n3 3340 16739 18385 7488 \r\n3 4629 5511 19087 7489 \r\n3 4029 16416 5511 7489 \r\n3 2974 19087 16416 7489 \r\n3 2268 5109 11638 7490 \r\n3 2761 16923 5109 7490 \r\n3 4340 11638 16923 7490 \r\n3 2288 18484 19088 7491 \r\n3 2324 16957 18484 7491 \r\n3 3864 19088 16957 7491 \r\n3 1840 11455 17471 7492 \r\n3 4663 18703 11455 7492 \r\n3 658 17471 18703 7492 \r\n3 2071 12000 19089 7493 \r\n3 3968 18360 12000 7493 \r\n3 2095 19089 18360 7493 \r\n3 3355 18972 13696 7494 \r\n3 721 18236 18972 7494 \r\n3 4071 13696 18236 7494 \r\n3 2621 10986 16848 7495 \r\n3 2389 12780 10986 7495 \r\n3 1267 16848 12780 7495 \r\n3 3644 19090 17293 7496 \r\n3 2500 10641 19090 7496 \r\n3 3297 17293 10641 7496 \r\n3 2595 5550 19092 7497 \r\n3 4973 19091 5550 7497 \r\n3 4120 19092 19091 7497 \r\n3 3055 8578 13405 7498 \r\n3 91 19093 8578 7498 \r\n3 1080 13405 19093 7498 \r\n3 172 12237 18387 7499 \r\n3 1637 5340 12237 7499 \r\n3 1221 18387 5340 7499 \r\n3 491 8827 11481 7500 \r\n3 97 19094 8827 7500 \r\n3 2100 11481 19094 7500 \r\n3 2528 18713 7171 7501 \r\n3 4378 15407 18713 7501 \r\n3 2458 7171 15407 7501 \r\n3 554 14331 9406 7502 \r\n3 2135 18679 14331 7502 \r\n3 519 9406 18679 7502 \r\n3 2264 8357 6108 7503 \r\n3 1913 19095 8357 7503 \r\n3 2469 6108 19095 7503 \r\n3 2204 17711 12992 7504 \r\n3 433 19096 17711 7504 \r\n3 3895 12992 19096 7504 \r\n3 4409 19097 14947 7505 \r\n3 4127 5618 19097 7505 \r\n3 2125 14947 5618 7505 \r\n3 2414 15728 15853 7506 \r\n3 1659 15030 15728 7506 \r\n3 1903 15853 15030 7506 \r\n3 3019 15499 19098 7507 \r\n3 1800 16825 15499 7507 \r\n3 1567 19098 16825 7507 \r\n3 3997 14136 19099 7508 \r\n3 3334 17329 14136 7508 \r\n3 2970 19099 17329 7508 \r\n3 4967 5551 5856 7509 \r\n3 2595 18313 5551 7509 \r\n3 624 5856 18313 7509 \r\n3 44 14980 19100 7510 \r\n3 4386 18301 14980 7510 \r\n3 826 19100 18301 7510 \r\n3 2209 11208 10476 7511 \r\n3 3070 19101 11208 7511 \r\n3 895 10476 19101 7511 \r\n3 4270 15916 14014 7512 \r\n3 2052 18735 15916 7512 \r\n3 3079 14014 18735 7512 \r\n3 4481 19103 19102 7513 \r\n3 2961 6859 19103 7513 \r\n3 1962 19102 6859 7513 \r\n3 4964 15204 7690 7514 \r\n3 2513 19104 15204 7514 \r\n3 2950 7690 19104 7514 \r\n3 1805 13173 12159 7515 \r\n3 4887 7291 13173 7515 \r\n3 4501 12159 7291 7515 \r\n3 2039 12620 17626 7516 \r\n3 1290 15073 12620 7516 \r\n3 3321 17626 15073 7516 \r\n3 2382 18622 19105 7517 \r\n3 2739 16620 18622 7517 \r\n3 1656 19105 16620 7517 \r\n3 1049 18976 8310 7518 \r\n3 3990 17249 18976 7518 \r\n3 4486 8310 17249 7518 \r\n3 256 17969 16862 7519 \r\n3 62 10027 17969 7519 \r\n3 2163 16862 10027 7519 \r\n3 1190 17844 14946 7520 \r\n3 1631 19106 17844 7520 \r\n3 4409 14946 19106 7520 \r\n3 1194 17389 10115 7521 \r\n3 4654 5079 17389 7521 \r\n3 1509 10115 5079 7521 \r\n3 4571 15141 19107 7522 \r\n3 2936 11475 15141 7522 \r\n3 4 19107 11475 7522 \r\n3 230 19109 13647 7523 \r\n3 1366 19108 19109 7523 \r\n3 1949 13647 19108 7523 \r\n3 2503 11248 19110 7524 \r\n3 3220 13397 11248 7524 \r\n3 3255 19110 13397 7524 \r\n3 3943 18543 15326 7525 \r\n3 2738 17288 18543 7525 \r\n3 811 15326 17288 7525 \r\n3 3616 16026 16105 7526 \r\n3 4975 12961 16026 7526 \r\n3 4427 16105 12961 7526 \r\n3 851 15973 11914 7527 \r\n3 369 11353 15973 7527 \r\n3 462 11914 11353 7527 \r\n3 783 15026 12601 7528 \r\n3 4193 6424 15026 7528 \r\n3 2546 12601 6424 7528 \r\n3 4426 18407 15547 7529 \r\n3 2077 17912 18407 7529 \r\n3 1369 15547 17912 7529 \r\n3 4500 17902 18746 7530 \r\n3 2592 13131 17902 7530 \r\n3 96 18746 13131 7530 \r\n3 1038 16382 12854 7531 \r\n3 182 13924 16382 7531 \r\n3 305 12854 13924 7531 \r\n3 2134 14723 18515 7532 \r\n3 4609 5041 14723 7532 \r\n3 4164 18515 5041 7532 \r\n3 2048 19112 19111 7533 \r\n3 3508 17804 19112 7533 \r\n3 260 19111 17804 7533 \r\n3 3130 8112 12061 7534 \r\n3 4075 13031 8112 7534 \r\n3 3966 12061 13031 7534 \r\n3 305 13923 5478 7535 \r\n3 4657 7284 13923 7535 \r\n3 3499 5478 7284 7535 \r\n3 2378 18796 8103 7536 \r\n3 371 15748 18796 7536 \r\n3 693 8103 15748 7536 \r\n3 333 10981 17991 7537 \r\n3 153 8779 10981 7537 \r\n3 4418 17991 8779 7537 \r\n3 2782 19113 17641 7538 \r\n3 694 17677 19113 7538 \r\n3 3618 17641 17677 7538 \r\n3 538 5466 10431 7539 \r\n3 2837 19114 5466 7539 \r\n3 3024 10431 19114 7539 \r\n3 4718 11350 10317 7540 \r\n3 1713 7867 11350 7540 \r\n3 3059 10317 7867 7540 \r\n3 3009 7120 18759 7541 \r\n3 223 18391 7120 7541 \r\n3 3062 18759 18391 7541 \r\n3 2244 19116 11647 7542 \r\n3 1527 19115 19116 7542 \r\n3 515 11647 19115 7542 \r\n3 206 11403 18863 7543 \r\n3 2316 18551 11403 7543 \r\n3 2315 18863 18551 7543 \r\n3 3737 19118 14377 7544 \r\n3 460 19117 19118 7544 \r\n3 4592 14377 19117 7544 \r\n3 4073 11504 12272 7545 \r\n3 696 19119 11504 7545 \r\n3 2767 12272 19119 7545 \r\n3 3598 18900 19120 7546 \r\n3 2660 16306 18900 7546 \r\n3 1861 19120 16306 7546 \r\n3 2599 16647 9800 7547 \r\n3 1797 7206 16647 7547 \r\n3 74 9800 7206 7547 \r\n3 774 16272 19122 7548 \r\n3 296 19121 16272 7548 \r\n3 1138 19122 19121 7548 \r\n3 916 8997 16067 7549 \r\n3 2955 15235 8997 7549 \r\n3 1544 16067 15235 7549 \r\n3 2098 11366 19123 7550 \r\n3 3878 12187 11366 7550 \r\n3 4733 19123 12187 7550 \r\n3 2039 19125 9620 7551 \r\n3 1910 19124 19125 7551 \r\n3 3069 9620 19124 7551 \r\n3 3535 14871 19127 7552 \r\n3 3202 19126 14871 7552 \r\n3 2229 19127 19126 7552 \r\n3 2670 13617 10390 7553 \r\n3 717 14496 13617 7553 \r\n3 3781 10390 14496 7553 \r\n3 370 17654 10735 7554 \r\n3 1285 9385 17654 7554 \r\n3 1561 10735 9385 7554 \r\n3 438 19129 18935 7555 \r\n3 4452 19128 19129 7555 \r\n3 4919 18935 19128 7555 \r\n3 4654 17662 19130 7556 \r\n3 3627 6495 17662 7556 \r\n3 4773 19130 6495 7556 \r\n3 2997 19131 8540 7557 \r\n3 4277 10834 19131 7557 \r\n3 788 8540 10834 7557 \r\n3 25 15875 18896 7558 \r\n3 3963 19132 15875 7558 \r\n3 911 18896 19132 7558 \r\n3 1546 14062 19133 7559 \r\n3 4665 14954 14062 7559 \r\n3 1719 19133 14954 7559 \r\n3 1740 9067 17916 7560 \r\n3 2677 16384 9067 7560 \r\n3 4280 17916 16384 7560 \r\n3 1681 5221 19134 7561 \r\n3 3456 15287 5221 7561 \r\n3 14 19134 15287 7561 \r\n3 3288 19041 13580 7562 \r\n3 3342 19135 19041 7562 \r\n3 1823 13580 19135 7562 \r\n3 1376 13719 19136 7563 \r\n3 4545 17914 13719 7563 \r\n3 7 19136 17914 7563 \r\n3 4025 7131 16865 7564 \r\n3 4792 13318 7131 7564 \r\n3 1549 16865 13318 7564 \r\n3 2741 10873 16934 7565 \r\n3 4481 19102 10873 7565 \r\n3 1962 16934 19102 7565 \r\n3 2085 15361 8824 7566 \r\n3 1692 19137 15361 7566 \r\n3 2979 8824 19137 7566 \r\n3 4833 13526 17004 7567 \r\n3 4750 19138 13526 7567 \r\n3 1493 17004 19138 7567 \r\n3 1970 19139 16113 7568 \r\n3 4137 18127 19139 7568 \r\n3 3633 16113 18127 7568 \r\n3 4237 9006 8584 7569 \r\n3 4563 15459 9006 7569 \r\n3 726 8584 15459 7569 \r\n3 2259 13351 13807 7570 \r\n3 1417 11130 13351 7570 \r\n3 4037 13807 11130 7570 \r\n3 1043 8317 11076 7571 \r\n3 2760 16637 8317 7571 \r\n3 1999 11076 16637 7571 \r\n3 2859 17943 19140 7572 \r\n3 635 17064 17943 7572 \r\n3 3386 19140 17064 7572 \r\n3 3948 19141 5780 7573 \r\n3 4101 12611 19141 7573 \r\n3 1098 5780 12611 7573 \r\n3 4721 6537 15078 7574 \r\n3 1111 19142 6537 7574 \r\n3 636 15078 19142 7574 \r\n3 4292 12135 15638 7575 \r\n3 1056 9430 12135 7575 \r\n3 3443 15638 9430 7575 \r\n3 1676 18048 10803 7576 \r\n3 3357 11727 18048 7576 \r\n3 865 10803 11727 7576 \r\n3 141 17467 19143 7577 \r\n3 1973 8167 17467 7577 \r\n3 120 19143 8167 7577 \r\n3 4345 13908 12042 7578 \r\n3 4363 19144 13908 7578 \r\n3 4851 12042 19144 7578 \r\n3 1226 18001 8843 7579 \r\n3 2215 19040 18001 7579 \r\n3 4828 8843 19040 7579 \r\n3 3789 10458 14786 7580 \r\n3 659 16029 10458 7580 \r\n3 648 14786 16029 7580 \r\n3 4386 14982 19145 7581 \r\n3 4218 14278 14982 7581 \r\n3 1105 19145 14278 7581 \r\n3 619 6174 7210 7582 \r\n3 4544 18228 6174 7582 \r\n3 4317 7210 18228 7582 \r\n3 4471 19147 19146 7583 \r\n3 2774 16380 19147 7583 \r\n3 1856 19146 16380 7583 \r\n3 903 19148 18041 7584 \r\n3 361 13424 19148 7584 \r\n3 2740 18041 13424 7584 \r\n3 4929 13701 19149 7585 \r\n3 824 18058 13701 7585 \r\n3 124 19149 18058 7585 \r\n3 1414 17941 11927 7586 \r\n3 4260 19150 17941 7586 \r\n3 3278 11927 19150 7586 \r\n3 3021 14142 19151 7587 \r\n3 4035 15066 14142 7587 \r\n3 4962 19151 15066 7587 \r\n3 3571 7450 17051 7588 \r\n3 3343 18040 7450 7588 \r\n3 3011 17051 18040 7588 \r\n3 2857 17605 19152 7589 \r\n3 2068 17003 17605 7589 \r\n3 2653 19152 17003 7589 \r\n3 582 9058 17490 7590 \r\n3 4315 18184 9058 7590 \r\n3 4023 17490 18184 7590 \r\n3 359 19154 19153 7591 \r\n3 1980 14088 19154 7591 \r\n3 3266 19153 14088 7591 \r\n3 8 14891 15102 7592 \r\n3 993 7614 14891 7592 \r\n3 3348 15102 7614 7592 \r\n3 2882 19156 19155 7593 \r\n3 3384 15146 19156 7593 \r\n3 650 19155 15146 7593 \r\n3 1514 19158 7108 7594 \r\n3 2122 19157 19158 7594 \r\n3 1400 7108 19157 7594 \r\n3 4785 6644 7110 7595 \r\n3 2637 19159 6644 7595 \r\n3 1514 7110 19159 7595 \r\n3 4116 18839 18640 7596 \r\n3 3855 10909 18839 7596 \r\n3 784 18640 10909 7596 \r\n3 430 16540 13634 7597 \r\n3 2147 12215 16540 7597 \r\n3 2893 13634 12215 7597 \r\n3 1856 7774 19146 7598 \r\n3 1857 6743 7774 7598 \r\n3 4471 19146 6743 7598 \r\n3 3535 7529 14872 7599 \r\n3 3034 8507 7529 7599 \r\n3 3174 14872 8507 7599 \r\n3 4681 8181 19160 7600 \r\n3 4971 13992 8181 7600 \r\n3 3522 19160 13992 7600 \r\n3 4853 17279 19161 7601 \r\n3 984 7165 17279 7601 \r\n3 2252 19161 7165 7601 \r\n3 3867 14755 10389 7602 \r\n3 2393 18927 14755 7602 \r\n3 2670 10389 18927 7602 \r\n3 4195 14397 17913 7603 \r\n3 286 15194 14397 7603 \r\n3 267 17913 15194 7603 \r\n3 1872 16756 19162 7604 \r\n3 637 12371 16756 7604 \r\n3 1464 19162 12371 7604 \r\n3 90 14520 17036 7605 \r\n3 4610 16254 14520 7605 \r\n3 3281 17036 16254 7605 \r\n3 1690 19164 19163 7606 \r\n3 1081 17911 19164 7606 \r\n3 2508 19163 17911 7606 \r\n3 1142 19165 14984 7607 \r\n3 4298 18126 19165 7607 \r\n3 4137 14984 18126 7607 \r\n3 1384 17447 17160 7608 \r\n3 4569 15338 17447 7608 \r\n3 2868 17160 15338 7608 \r\n3 2849 16198 7763 7609 \r\n3 3436 13350 16198 7609 \r\n3 4701 7763 13350 7609 \r\n3 1941 19166 14167 7610 \r\n3 1248 17813 19166 7610 \r\n3 446 14167 17813 7610 \r\n3 1163 15793 13860 7611 \r\n3 2437 10788 15793 7611 \r\n3 4674 13860 10788 7611 \r\n3 2130 13177 11878 7612 \r\n3 1956 19167 13177 7612 \r\n3 1924 11878 19167 7612 \r\n3 4162 19169 18916 7613 \r\n3 3140 19168 19169 7613 \r\n3 3784 18916 19168 7613 \r\n3 4256 19171 17823 7614 \r\n3 4852 19170 19171 7614 \r\n3 1548 17823 19170 7614 \r\n3 4040 19173 19172 7615 \r\n3 1782 18315 19173 7615 \r\n3 4278 19172 18315 7615 \r\n3 3981 18643 19174 7616 \r\n3 2376 12943 18643 7616 \r\n3 1936 19174 12943 7616 \r\n3 1348 5748 14463 7617 \r\n3 2404 12443 5748 7617 \r\n3 3498 14463 12443 7617 \r\n3 2463 19175 7286 7618 \r\n3 394 11091 19175 7618 \r\n3 3923 7286 11091 7618 \r\n3 4625 10226 6463 7619 \r\n3 417 18642 10226 7619 \r\n3 3981 6463 18642 7619 \r\n3 3455 19177 12070 7620 \r\n3 924 19176 19177 7620 \r\n3 328 12070 19176 7620 \r\n3 1669 18984 17874 7621 \r\n3 579 16534 18984 7621 \r\n3 3565 17874 16534 7621 \r\n3 887 15477 12389 7622 \r\n3 3774 10582 15477 7622 \r\n3 2479 12389 10582 7622 \r\n3 3343 19178 5674 7623 \r\n3 4291 7329 19178 7623 \r\n3 4978 5674 7329 7623 \r\n3 1474 16437 19179 7624 \r\n3 2033 15847 16437 7624 \r\n3 1919 19179 15847 7624 \r\n3 3182 12751 15474 7625 \r\n3 130 19180 12751 7625 \r\n3 806 15474 19180 7625 \r\n3 1224 19181 14910 7626 \r\n3 1396 10398 19181 7626 \r\n3 3494 14910 10398 7626 \r\n3 594 5494 13675 7627 \r\n3 2256 19182 5494 7627 \r\n3 772 13675 19182 7627 \r\n3 363 8561 19184 7628 \r\n3 3680 19183 8561 7628 \r\n3 2479 19184 19183 7628 \r\n3 1004 18554 5776 7629 \r\n3 898 6621 18554 7629 \r\n3 2499 5776 6621 7629 \r\n3 4197 12233 9672 7630 \r\n3 2992 15494 12233 7630 \r\n3 1897 9672 15494 7630 \r\n3 368 17175 16962 7631 \r\n3 1127 17216 17175 7631 \r\n3 2518 16962 17216 7631 \r\n3 1477 8948 19185 7632 \r\n3 3055 13407 8948 7632 \r\n3 1747 19185 13407 7632 \r\n3 3220 10451 13395 7633 \r\n3 3186 13160 10451 7633 \r\n3 1559 13395 13160 7633 \r\n3 1069 9602 19186 7634 \r\n3 1062 17620 9602 7634 \r\n3 4826 19186 17620 7634 \r\n3 4920 16565 19187 7635 \r\n3 1159 10249 16565 7635 \r\n3 762 19187 10249 7635 \r\n3 4192 8175 10310 7636 \r\n3 2223 16703 8175 7636 \r\n3 4196 10310 16703 7636 \r\n3 4671 10483 14619 7637 \r\n3 36 18814 10483 7637 \r\n3 2253 14619 18814 7637 \r\n3 1821 19188 14371 7638 \r\n3 3017 11743 19188 7638 \r\n3 3623 14371 11743 7638 \r\n3 2199 14515 19010 7639 \r\n3 4626 18663 14515 7639 \r\n3 4287 19010 18663 7639 \r\n3 1740 13890 11867 7640 \r\n3 2432 12111 13890 7640 \r\n3 4214 11867 12111 7640 \r\n3 959 13207 19189 7641 \r\n3 3873 19014 13207 7641 \r\n3 641 19189 19014 7641 \r\n3 4076 6679 6374 7642 \r\n3 3714 7923 6679 7642 \r\n3 2419 6374 7923 7642 \r\n3 656 14854 13676 7643 \r\n3 765 12200 14854 7643 \r\n3 514 13676 12200 7643 \r\n3 4013 11581 19190 7644 \r\n3 774 19122 11581 7644 \r\n3 1138 19190 19122 7644 \r\n3 3963 15874 14920 7645 \r\n3 1249 19191 15874 7645 \r\n3 1155 14920 19191 7645 \r\n3 4679 19193 19192 7646 \r\n3 732 15481 19193 7646 \r\n3 3907 19192 15481 7646 \r\n3 4530 15392 19194 7647 \r\n3 1741 11421 15392 7647 \r\n3 216 19194 11421 7647 \r\n3 1429 17455 19195 7648 \r\n3 4181 12931 17455 7648 \r\n3 1724 19195 12931 7648 \r\n3 3195 18641 19197 7649 \r\n3 1071 19196 18641 7649 \r\n3 4677 19197 19196 7649 \r\n3 4080 9569 13092 7650 \r\n3 2989 19198 9569 7650 \r\n3 2507 13092 19198 7650 \r\n3 3959 11671 18068 7651 \r\n3 2265 6395 11671 7651 \r\n3 3160 18068 6395 7651 \r\n3 3665 13266 15626 7652 \r\n3 297 14394 13266 7652 \r\n3 2839 15626 14394 7652 \r\n3 3556 7396 10618 7653 \r\n3 102 16554 7396 7653 \r\n3 4001 10618 16554 7653 \r\n3 2047 5555 15686 7654 \r\n3 1082 9552 5555 7654 \r\n3 4270 15686 9552 7654 \r\n3 2338 9247 11321 7655 \r\n3 1282 14018 9247 7655 \r\n3 4314 11321 14018 7655 \r\n3 187 12185 19199 7656 \r\n3 4262 8996 12185 7656 \r\n3 3388 19199 8996 7656 \r\n3 602 14903 16826 7657 \r\n3 2386 15301 14903 7657 \r\n3 3604 16826 15301 7657 \r\n3 3216 5868 19200 7658 \r\n3 2869 11863 5868 7658 \r\n3 1300 19200 11863 7658 \r\n3 676 8899 17178 7659 \r\n3 4746 19201 8899 7659 \r\n3 1895 17178 19201 7659 \r\n3 1841 19203 19202 7660 \r\n3 1979 6312 19203 7660 \r\n3 3913 19202 6312 7660 \r\n3 2814 19205 19204 7661 \r\n3 4983 15537 19205 7661 \r\n3 2390 19204 15537 7661 \r\n3 419 9459 14649 7662 \r\n3 1851 17849 9459 7662 \r\n3 4170 14649 17849 7662 \r\n3 4461 14342 6291 7663 \r\n3 2682 18920 14342 7663 \r\n3 3171 6291 18920 7663 \r\n3 3120 15487 14284 7664 \r\n3 68 19206 15487 7664 \r\n3 4469 14284 19206 7664 \r\n3 4817 9091 19207 7665 \r\n3 302 8715 9091 7665 \r\n3 3054 19207 8715 7665 \r\n3 3849 14090 10763 7666 \r\n3 4208 12967 14090 7666 \r\n3 1413 10763 12967 7666 \r\n3 793 16794 15069 7667 \r\n3 2281 16895 16794 7667 \r\n3 915 15069 16895 7667 \r\n3 4388 16717 12183 7668 \r\n3 259 10721 16717 7668 \r\n3 4030 12183 10721 7668 \r\n3 3169 19208 10535 7669 \r\n3 1272 5460 19208 7669 \r\n3 3753 10535 5460 7669 \r\n3 1637 12236 8687 7670 \r\n3 3629 14413 12236 7670 \r\n3 4754 8687 14413 7670 \r\n3 3966 11476 12060 7671 \r\n3 2578 7797 11476 7671 \r\n3 33 12060 7797 7671 \r\n3 2038 9590 18885 7672 \r\n3 2325 18615 9590 7672 \r\n3 4053 18885 18615 7672 \r\n3 2112 17915 14245 7673 \r\n3 4545 13955 17915 7673 \r\n3 1053 14245 13955 7673 \r\n3 4938 17612 13826 7674 \r\n3 2156 19209 17612 7674 \r\n3 4743 13826 19209 7674 \r\n3 1306 14742 18970 7675 \r\n3 3 17704 14742 7675 \r\n3 1753 18970 17704 7675 \r\n3 605 19210 12023 7676 \r\n3 4848 15053 19210 7676 \r\n3 3337 12023 15053 7676 \r\n3 828 13931 19043 7677 \r\n3 4637 18733 13931 7677 \r\n3 4077 19043 18733 7677 \r\n3 1521 17777 19211 7678 \r\n3 3968 11999 17777 7678 \r\n3 4090 19211 11999 7678 \r\n3 3202 14873 17437 7679 \r\n3 3174 11609 14873 7679 \r\n3 2346 17437 11609 7679 \r\n3 474 11496 19212 7680 \r\n3 4246 18080 11496 7680 \r\n3 526 19212 18080 7680 \r\n3 2767 6418 12273 7681 \r\n3 2819 6070 6418 7681 \r\n3 2474 12273 6070 7681 \r\n3 3874 19214 19213 7682 \r\n3 869 18147 19214 7682 \r\n3 220 19213 18147 7682 \r\n3 169 12673 6024 7683 \r\n3 2486 15387 12673 7683 \r\n3 2514 6024 15387 7683 \r\n3 2127 17146 8544 7684 \r\n3 3843 18886 17146 7684 \r\n3 4053 8544 18886 7684 \r\n3 3371 19217 19216 7685 \r\n3 2368 19215 19217 7685 \r\n3 4397 19216 19215 7685 \r\n3 1517 16609 7183 7686 \r\n3 3833 12957 16609 7686 \r\n3 3271 7183 12957 7686 \r\n3 1357 9355 18081 7687 \r\n3 449 16823 9355 7687 \r\n3 526 18081 16823 7687 \r\n3 62 18961 14380 7688 \r\n3 4747 6215 18961 7688 \r\n3 4099 14380 6215 7688 \r\n3 4716 17137 17547 7689 \r\n3 3009 18758 17137 7689 \r\n3 3052 17547 18758 7689 \r\n3 2076 17027 8054 7690 \r\n3 248 17396 17027 7690 \r\n3 3751 8054 17396 7690 \r\n3 3537 19219 5790 7691 \r\n3 452 19218 19219 7691 \r\n3 2801 5790 19218 7691 \r\n3 1503 15666 17281 7692 \r\n3 1882 14623 15666 7692 \r\n3 47 17281 14623 7692 \r\n3 826 7118 19100 7693 \r\n3 404 19220 7118 7693 \r\n3 44 19100 19220 7693 \r\n3 3702 19221 18789 7694 \r\n3 3089 18331 19221 7694 \r\n3 2198 18789 18331 7694 \r\n3 109 17848 16276 7695 \r\n3 825 9984 17848 7695 \r\n3 2533 16276 9984 7695 \r\n3 475 19222 6211 7696 \r\n3 3056 10445 19222 7696 \r\n3 896 6211 10445 7696 \r\n3 1468 10160 13045 7697 \r\n3 1250 12856 10160 7697 \r\n3 2864 13045 12856 7697 \r\n3 1801 17021 15857 7698 \r\n3 2385 17157 17021 7698 \r\n3 3700 15857 17157 7698 \r\n3 696 12547 19119 7699 \r\n3 314 8038 12547 7699 \r\n3 2767 19119 8038 7699 \r\n3 1391 12035 9224 7700 \r\n3 4054 19223 12035 7700 \r\n3 3682 9224 19223 7700 \r\n3 3895 19096 15873 7701 \r\n3 433 18087 19096 7701 \r\n3 4121 15873 18087 7701 \r\n3 4321 17617 10428 7702 \r\n3 1263 10187 17617 7702 \r\n3 1309 10428 10187 7702 \r\n3 2983 14716 14031 7703 \r\n3 1530 18202 14716 7703 \r\n3 3991 14031 18202 7703 \r\n3 3811 15735 13973 7704 \r\n3 210 11854 15735 7704 \r\n3 4803 13973 11854 7704 \r\n3 2061 11775 6193 7705 \r\n3 253 10963 11775 7705 \r\n3 4748 6193 10963 7705 \r\n3 1881 19224 10817 7706 \r\n3 1745 17751 19224 7706 \r\n3 2787 10817 17751 7706 \r\n3 3467 13363 19225 7707 \r\n3 1982 17549 13363 7707 \r\n3 2552 19225 17549 7707 \r\n3 2947 19226 9414 7708 \r\n3 1718 11100 19226 7708 \r\n3 3756 9414 11100 7708 \r\n3 1035 19228 19227 7709 \r\n3 2718 7019 19228 7709 \r\n3 4172 19227 7019 7709 \r\n3 1514 19159 14907 7710 \r\n3 2637 9807 19159 7710 \r\n3 1809 14907 9807 7710 \r\n3 2704 18165 9829 7711 \r\n3 1993 18177 18165 7711 \r\n3 2542 9829 18177 7711 \r\n3 3875 18497 19230 7712 \r\n3 673 19229 18497 7712 \r\n3 47 19230 19229 7712 \r\n3 540 9854 19231 7713 \r\n3 1702 13005 9854 7713 \r\n3 3917 19231 13005 7713 \r\n3 1852 7484 12973 7714 \r\n3 1156 15536 7484 7714 \r\n3 978 12973 15536 7714 \r\n3 1335 6563 16735 7715 \r\n3 1433 16414 6563 7715 \r\n3 2151 16735 16414 7715 \r\n3 1247 12981 14965 7716 \r\n3 3398 13886 12981 7716 \r\n3 136 14965 13886 7716 \r\n3 2867 6386 9485 7717 \r\n3 308 19232 6386 7717 \r\n3 3243 9485 19232 7717 \r\n3 4583 9779 17551 7718 \r\n3 2855 19233 9779 7718 \r\n3 212 17551 19233 7718 \r\n3 1042 15001 18535 7719 \r\n3 1174 6670 15001 7719 \r\n3 1652 18535 6670 7719 \r\n3 2918 9961 6586 7720 \r\n3 4542 18123 9961 7720 \r\n3 1717 6586 18123 7720 \r\n3 3225 19235 19234 7721 \r\n3 108 19063 19235 7721 \r\n3 2642 19234 19063 7721 \r\n3 4049 16338 11944 7722 \r\n3 3630 8742 16338 7722 \r\n3 2395 11944 8742 7722 \r\n3 4843 19237 9022 7723 \r\n3 2295 19236 19237 7723 \r\n3 226 9022 19236 7723 \r\n3 4454 5971 18980 7724 \r\n3 1470 14178 5971 7724 \r\n3 1180 18980 14178 7724 \r\n3 3883 5028 14961 7725 \r\n3 1818 6662 5028 7725 \r\n3 1643 14961 6662 7725 \r\n3 3216 19200 18493 7726 \r\n3 1300 8725 19200 7726 \r\n3 1742 18493 8725 7726 \r\n3 651 15139 19238 7727 \r\n3 1927 6198 15139 7727 \r\n3 2507 19238 6198 7727 \r\n3 144 19240 18556 7728 \r\n3 1827 19239 19240 7728 \r\n3 4090 18556 19239 7728 \r\n3 4468 17494 17900 7729 \r\n3 1495 16457 17494 7729 \r\n3 4175 17900 16457 7729 \r\n3 3017 19188 17400 7730 \r\n3 1821 16974 19188 7730 \r\n3 2345 17400 16974 7730 \r\n3 4326 6747 19241 7731 \r\n3 1907 14076 6747 7731 \r\n3 3928 19241 14076 7731 \r\n3 2354 17952 12544 7732 \r\n3 970 5367 17952 7732 \r\n3 2128 12544 5367 7732 \r\n3 4741 13085 19242 7733 \r\n3 73 8739 13085 7733 \r\n3 3323 19242 8739 7733 \r\n3 2051 16691 15766 7734 \r\n3 2335 9492 16691 7734 \r\n3 3576 15766 9492 7734 \r\n3 2938 19243 8273 7735 \r\n3 1608 18722 19243 7735 \r\n3 2237 8273 18722 7735 \r\n3 431 19244 13159 7736 \r\n3 969 12210 19244 7736 \r\n3 1559 13159 12210 7736 \r\n3 1981 19245 11318 7737 \r\n3 927 14905 19245 7737 \r\n3 1809 11318 14905 7737 \r\n3 3469 6449 19246 7738 \r\n3 3111 14643 6449 7738 \r\n3 2948 19246 14643 7738 \r\n3 476 19247 16508 7739 \r\n3 3609 9379 19247 7739 \r\n3 842 16508 9379 7739 \r\n3 422 9295 19248 7740 \r\n3 682 18241 9295 7740 \r\n3 604 19248 18241 7740 \r\n3 4041 10147 19249 7741 \r\n3 2693 18380 10147 7741 \r\n3 3531 19249 18380 7741 \r\n3 2205 10166 13876 7742 \r\n3 2711 14042 10166 7742 \r\n3 4470 13876 14042 7742 \r\n3 3773 18094 6120 7743 \r\n3 209 19051 18094 7743 \r\n3 439 6120 19051 7743 \r\n3 3238 12500 19250 7744 \r\n3 2565 15173 12500 7744 \r\n3 3579 19250 15173 7744 \r\n3 4517 19252 19251 7745 \r\n3 1139 14631 19252 7745 \r\n3 323 19251 14631 7745 \r\n3 4134 19254 11951 7746 \r\n3 583 19253 19254 7746 \r\n3 3083 11951 19253 7746 \r\n3 3306 10110 5600 7747 \r\n3 1843 18169 10110 7747 \r\n3 994 5600 18169 7747 \r\n3 3619 13276 16518 7748 \r\n3 788 10836 13276 7748 \r\n3 1479 16518 10836 7748 \r\n3 2189 14851 13657 7749 \r\n3 3572 19255 14851 7749 \r\n3 2959 13657 19255 7749 \r\n3 1091 12828 13432 7750 \r\n3 574 16219 12828 7750 \r\n3 1100 13432 16219 7750 \r\n3 3933 19256 11651 7751 \r\n3 2694 8803 19256 7751 \r\n3 4831 11651 8803 7751 \r\n3 4179 6857 19258 7752 \r\n3 4400 19257 6857 7752 \r\n3 3682 19258 19257 7752 \r\n3 11 7894 11971 7753 \r\n3 2104 18728 7894 7753 \r\n3 2213 11971 18728 7753 \r\n3 938 19260 18370 7754 \r\n3 1459 19259 19260 7754 \r\n3 2875 18370 19259 7754 \r\n3 4317 19262 7211 7755 \r\n3 4791 19261 19262 7755 \r\n3 2974 7211 19261 7755 \r\n3 1635 6551 16400 7756 \r\n3 4543 17096 6551 7756 \r\n3 989 16400 17096 7756 \r\n3 871 14864 7557 7757 \r\n3 3116 5159 14864 7757 \r\n3 1904 7557 5159 7757 \r\n3 3858 18745 18365 7758 \r\n3 2906 16903 18745 7758 \r\n3 4670 18365 16903 7758 \r\n3 135 14154 9132 7759 \r\n3 506 19263 14154 7759 \r\n3 4089 9132 19263 7759 \r\n3 3166 14109 8568 7760 \r\n3 3440 12903 14109 7760 \r\n3 4857 8568 12903 7760 \r\n3 3666 18659 19264 7761 \r\n3 2867 9487 18659 7761 \r\n3 2833 19264 9487 7761 \r\n3 2018 15232 19265 7762 \r\n3 3600 5154 15232 7762 \r\n3 1894 19265 5154 7762 \r\n3 454 7801 10727 7763 \r\n3 690 19266 7801 7763 \r\n3 274 10727 19266 7763 \r\n3 3446 7262 15215 7764 \r\n3 2504 19267 7262 7764 \r\n3 3614 15215 19267 7764 \r\n3 3817 19268 5443 7765 \r\n3 1176 17241 19268 7765 \r\n3 1084 5443 17241 7765 \r\n3 3924 7641 13293 7766 \r\n3 791 8421 7641 7766 \r\n3 2851 13293 8421 7766 \r\n3 3480 5433 17017 7767 \r\n3 894 15977 5433 7767 \r\n3 2003 17017 15977 7767 \r\n3 4442 19036 8792 7768 \r\n3 691 19269 19036 7768 \r\n3 3689 8792 19269 7768 \r\n3 3676 10312 19271 7769 \r\n3 4142 19270 10312 7769 \r\n3 1186 19271 19270 7769 \r\n3 1877 19272 16480 7770 \r\n3 1277 11818 19272 7770 \r\n3 525 16480 11818 7770 \r\n3 4503 15551 17223 7771 \r\n3 3545 16580 15551 7771 \r\n3 4861 17223 16580 7771 \r\n3 2348 18378 19273 7772 \r\n3 1170 18172 18378 7772 \r\n3 1990 19273 18172 7772 \r\n3 869 19214 19046 7773 \r\n3 3874 19274 19214 7773 \r\n3 122 19046 19274 7773 \r\n3 540 19231 18853 7774 \r\n3 3917 16709 19231 7774 \r\n3 3835 18853 16709 7774 \r\n3 1008 18091 17318 7775 \r\n3 3599 19275 18091 7775 \r\n3 1191 17318 19275 7775 \r\n3 1820 7816 7418 7776 \r\n3 79 11918 7816 7776 \r\n3 1568 7418 11918 7776 \r\n3 4186 17859 14543 7777 \r\n3 2653 8425 17859 7777 \r\n3 356 14543 8425 7777 \r\n3 3645 6464 14301 7778 \r\n3 3564 15693 6464 7778 \r\n3 3330 14301 15693 7778 \r\n3 294 15599 9417 7779 \r\n3 1392 19276 15599 7779 \r\n3 4360 9417 19276 7779 \r\n3 2447 12563 13486 7780 \r\n3 967 17038 12563 7780 \r\n3 1341 13486 17038 7780 \r\n3 2213 6960 10893 7781 \r\n3 873 16238 6960 7781 \r\n3 449 10893 16238 7781 \r\n3 2070 19277 10265 7782 \r\n3 4612 6549 19277 7782 \r\n3 1635 10265 6549 7782 \r\n3 2230 17221 19279 7783 \r\n3 1192 19278 17221 7783 \r\n3 3011 19279 19278 7783 \r\n3 3258 9941 19281 7784 \r\n3 2763 19280 9941 7784 \r\n3 473 19281 19280 7784 \r\n3 2800 17217 19282 7785 \r\n3 4922 15224 17217 7785 \r\n3 3153 19282 15224 7785 \r\n3 3771 18818 17997 7786 \r\n3 918 9741 18818 7786 \r\n3 497 17997 9741 7786 \r\n3 4204 6007 16706 7787 \r\n3 2952 17239 6007 7787 \r\n3 935 16706 17239 7787 \r\n3 1445 16907 16991 7788 \r\n3 4498 5593 16907 7788 \r\n3 3125 16991 5593 7788 \r\n3 4870 17310 19283 7789 \r\n3 1165 19062 17310 7789 \r\n3 2392 19283 19062 7789 \r\n3 995 19285 19284 7790 \r\n3 3192 17152 19285 7790 \r\n3 4883 19284 17152 7790 \r\n3 1930 19286 10450 7791 \r\n3 2661 16040 19286 7791 \r\n3 3186 10450 16040 7791 \r\n3 2178 7848 19287 7792 \r\n3 3871 12058 7848 7792 \r\n3 3988 19287 12058 7792 \r\n3 2847 9183 14068 7793 \r\n3 4830 5116 9183 7793 \r\n3 4234 14068 5116 7793 \r\n3 4836 19289 9050 7794 \r\n3 1049 19288 19289 7794 \r\n3 2029 9050 19288 7794 \r\n3 2002 6786 19061 7795 \r\n3 3457 18847 6786 7795 \r\n3 4440 19061 18847 7795 \r\n3 454 10729 8659 7796 \r\n3 4009 11762 10729 7796 \r\n3 3937 8659 11762 7796 \r\n3 4475 16427 7970 7797 \r\n3 1482 5486 16427 7797 \r\n3 2647 7970 5486 7797 \r\n3 4736 14134 16873 7798 \r\n3 4113 16281 14134 7798 \r\n3 4336 16873 16281 7798 \r\n3 13 13218 18148 7799 \r\n3 1822 10807 13218 7799 \r\n3 423 18148 10807 7799 \r\n3 1792 18577 18658 7800 \r\n3 3635 17320 18577 7800 \r\n3 872 18658 17320 7800 \r\n3 58 19290 15105 7801 \r\n3 4717 5623 19290 7801 \r\n3 1926 15105 5623 7801 \r\n3 773 19291 10047 7802 \r\n3 4426 18481 19291 7802 \r\n3 1556 10047 18481 7802 \r\n3 44 19220 15715 7803 \r\n3 404 17973 19220 7803 \r\n3 2036 15715 17973 7803 \r\n3 1450 19292 14797 7804 \r\n3 2210 14424 19292 7804 \r\n3 3919 14797 14424 7804 \r\n3 940 16742 17581 7805 \r\n3 2258 14064 16742 7805 \r\n3 3813 17581 14064 7805 \r\n3 1472 11697 19293 7806 \r\n3 1364 13053 11697 7806 \r\n3 2928 19293 13053 7806 \r\n3 790 5842 19294 7807 \r\n3 3750 18107 5842 7807 \r\n3 480 19294 18107 7807 \r\n3 4216 18355 18004 7808 \r\n3 4756 18221 18355 7808 \r\n3 2401 18004 18221 7808 \r\n3 4696 18845 16901 7809 \r\n3 4376 7952 18845 7809 \r\n3 4224 16901 7952 7809 \r\n3 4241 19296 18342 7810 \r\n3 4339 19295 19296 7810 \r\n3 2277 18342 19295 7810 \r\n3 921 14200 19297 7811 \r\n3 4969 13965 14200 7811 \r\n3 741 19297 13965 7811 \r\n3 163 19298 16448 7812 \r\n3 754 13621 19298 7812 \r\n3 3949 16448 13621 7812 \r\n3 1022 19299 14807 7813 \r\n3 3071 18717 19299 7813 \r\n3 1785 14807 18717 7813 \r\n3 2712 11413 17852 7814 \r\n3 1542 19300 11413 7814 \r\n3 1245 17852 19300 7814 \r\n3 2852 12140 19302 7815 \r\n3 2680 19301 12140 7815 \r\n3 1368 19302 19301 7815 \r\n3 4906 16035 12515 7816 \r\n3 4065 16490 16035 7816 \r\n3 4548 12515 16490 7816 \r\n3 4876 15639 15795 7817 \r\n3 3443 15111 15639 7817 \r\n3 953 15795 15111 7817 \r\n3 3082 16284 14297 7818 \r\n3 4920 19187 16284 7818 \r\n3 762 14297 19187 7818 \r\n3 2722 18882 12375 7819 \r\n3 3962 19303 18882 7819 \r\n3 3604 12375 19303 7819 \r\n3 821 17388 12923 7820 \r\n3 3116 14863 17388 7820 \r\n3 2446 12923 14863 7820 \r\n3 3148 14287 19304 7821 \r\n3 2480 17741 14287 7821 \r\n3 2333 19304 17741 7821 \r\n3 1350 19307 19306 7822 \r\n3 3555 19305 19307 7822 \r\n3 623 19306 19305 7822 \r\n3 1254 19031 7528 7823 \r\n3 2540 5059 19031 7823 \r\n3 3034 7528 5059 7823 \r\n3 954 19308 9314 7824 \r\n3 2100 19094 19308 7824 \r\n3 97 9314 19094 7824 \r\n3 2472 19309 17393 7825 \r\n3 2076 8055 19309 7825 \r\n3 4128 17393 8055 7825 \r\n3 838 11003 7830 7826 \r\n3 2731 16552 11003 7826 \r\n3 2942 7830 16552 7826 \r\n3 625 19311 6797 7827 \r\n3 3121 19310 19311 7827 \r\n3 951 6797 19310 7827 \r\n3 3248 5984 6440 7828 \r\n3 3875 19312 5984 7828 \r\n3 3150 6440 19312 7828 \r\n3 2023 8847 17896 7829 \r\n3 3209 14347 8847 7829 \r\n3 1220 17896 14347 7829 \r\n3 2744 18344 18414 7830 \r\n3 228 13942 18344 7830 \r\n3 4203 18414 13942 7830 \r\n3 1366 17639 19108 7831 \r\n3 4775 14659 17639 7831 \r\n3 1949 19108 14659 7831 \r\n3 3496 14055 12546 7832 \r\n3 4391 16884 14055 7832 \r\n3 314 12546 16884 7832 \r\n3 38 19315 19314 7833 \r\n3 4729 19313 19315 7833 \r\n3 4535 19314 19313 7833 \r\n3 1438 15689 17468 7834 \r\n3 2492 12078 15689 7834 \r\n3 1658 17468 12078 7834 \r\n3 2703 12948 6913 7835 \r\n3 4849 19316 12948 7835 \r\n3 1704 6913 19316 7835 \r\n3 2806 19317 11181 7836 \r\n3 1126 6065 19317 7836 \r\n3 4102 11181 6065 7836 \r\n3 821 12925 7654 7837 \r\n3 2466 16066 12925 7837 \r\n3 3080 7654 16066 7837 \r\n3 2023 19319 17908 7838 \r\n3 2943 19318 19319 7838 \r\n3 1638 17908 19318 7838 \r\n3 1141 16133 17089 7839 \r\n3 193 8145 16133 7839 \r\n3 1031 17089 8145 7839 \r\n3 3328 11288 19320 7840 \r\n3 1879 14794 11288 7840 \r\n3 2747 19320 14794 7840 \r\n3 4774 17710 17868 7841 \r\n3 1795 11117 17710 7841 \r\n3 310 17868 11117 7841 \r\n3 2705 13916 9439 7842 \r\n3 2157 19321 13916 7842 \r\n3 2279 9439 19321 7842 \r\n3 3703 8143 16047 7843 \r\n3 1453 12416 8143 7843 \r\n3 307 16047 12416 7843 \r\n3 1995 19322 9432 7844 \r\n3 263 15016 19322 7844 \r\n3 1732 9432 15016 7844 \r\n3 4047 11218 16458 7845 \r\n3 1047 12129 11218 7845 \r\n3 2644 16458 12129 7845 \r\n3 654 11795 9870 7846 \r\n3 3922 19323 11795 7846 \r\n3 628 9870 19323 7846 \r\n3 487 19324 12520 7847 \r\n3 708 18850 19324 7847 \r\n3 366 12520 18850 7847 \r\n3 4334 15954 11777 7848 \r\n3 1612 19325 15954 7848 \r\n3 3346 11777 19325 7848 \r\n3 309 18019 10087 7849 \r\n3 2430 15818 18019 7849 \r\n3 4079 10087 15818 7849 \r\n3 3408 19328 19327 7850 \r\n3 3965 19326 19328 7850 \r\n3 1101 19327 19326 7850 \r\n3 4796 14385 18706 7851 \r\n3 1574 12223 14385 7851 \r\n3 4862 18706 12223 7851 \r\n3 1320 16333 9400 7852 \r\n3 3360 19329 16333 7852 \r\n3 3123 9400 19329 7852 \r\n3 4644 19331 16045 7853 \r\n3 4847 19330 19331 7853 \r\n3 3183 16045 19330 7853 \r\n3 1381 8184 18496 7854 \r\n3 2851 8420 8184 7854 \r\n3 2641 18496 8420 7854 \r\n3 2427 6617 18232 7855 \r\n3 1700 19081 6617 7855 \r\n3 2560 18232 19081 7855 \r\n3 120 19332 19143 7856 \r\n3 4870 10335 19332 7856 \r\n3 141 19143 10335 7856 \r\n3 183 11776 17920 7857 \r\n3 2061 12326 11776 7857 \r\n3 2487 17920 12326 7857 \r\n3 4673 19023 17903 7858 \r\n3 3575 13491 19023 7858 \r\n3 3701 17903 13491 7858 \r\n3 4558 19333 9241 7859 \r\n3 3568 10717 19333 7859 \r\n3 3982 9241 10717 7859 \r\n3 2957 5015 16100 7860 \r\n3 4130 19334 5015 7860 \r\n3 3008 16100 19334 7860 \r\n3 3977 19336 19335 7861 \r\n3 613 15154 19336 7861 \r\n3 1910 19335 15154 7861 \r\n3 1492 5125 13380 7862 \r\n3 2224 18264 5125 7862 \r\n3 137 13380 18264 7862 \r\n3 4500 6727 6843 7863 \r\n3 1551 10522 6727 7863 \r\n3 2094 6843 10522 7863 \r\n3 705 17776 15157 7864 \r\n3 1317 7553 17776 7864 \r\n3 2186 15157 7553 7864 \r\n3 1409 7808 18176 7865 \r\n3 4380 19337 7808 7865 \r\n3 2542 18176 19337 7865 \r\n3 4549 12461 13340 7866 \r\n3 2835 13831 12461 7866 \r\n3 147 13340 13831 7866 \r\n3 598 16355 9172 7867 \r\n3 1080 19338 16355 7867 \r\n3 732 9172 19338 7867 \r\n3 703 19339 18763 7868 \r\n3 1383 8575 19339 7868 \r\n3 1578 18763 8575 7868 \r\n3 2145 15786 13502 7869 \r\n3 1484 9798 15786 7869 \r\n3 4042 13502 9798 7869 \r\n3 3514 19340 10674 7870 \r\n3 2098 19123 19340 7870 \r\n3 4733 10674 19123 7870 \r\n3 460 19342 19117 7871 \r\n3 2661 19341 19342 7871 \r\n3 4592 19117 19341 7871 \r\n3 4428 17514 7901 7872 \r\n3 2304 16568 17514 7872 \r\n3 4429 7901 16568 7872 \r\n3 1214 13494 14679 7873 \r\n3 3341 14051 13494 7873 \r\n3 1892 14679 14051 7873 \r\n3 1712 7413 19343 7874 \r\n3 2861 8206 7413 7874 \r\n3 2716 19343 8206 7874 \r\n3 4090 19344 12726 7875 \r\n3 1548 19170 19344 7875 \r\n3 4852 12726 19170 7875 \r\n3 2456 16255 19345 7876 \r\n3 4063 14665 16255 7876 \r\n3 452 19345 14665 7876 \r\n3 194 13376 17361 7877 \r\n3 3334 16745 13376 7877 \r\n3 4578 17361 16745 7877 \r\n3 3609 19346 16625 7878 \r\n3 1863 15958 19346 7878 \r\n3 3232 16625 15958 7878 \r\n3 315 9080 9802 7879 \r\n3 120 8169 9080 7879 \r\n3 2599 9802 8169 7879 \r\n3 2170 8576 12334 7880 \r\n3 1383 18079 8576 7880 \r\n3 2225 12334 18079 7880 \r\n3 469 6653 9191 7881 \r\n3 252 11680 6653 7881 \r\n3 4767 9191 11680 7881 \r\n3 791 7640 19347 7882 \r\n3 4838 17936 7640 7882 \r\n3 4461 19347 17936 7882 \r\n3 3317 17539 7988 7883 \r\n3 1049 19289 17539 7883 \r\n3 4836 7988 19289 7883 \r\n3 4105 8682 5186 7884 \r\n3 4221 16863 8682 7884 \r\n3 1680 5186 16863 7884 \r\n3 3442 14317 19348 7885 \r\n3 609 5090 14317 7885 \r\n3 3275 19348 5090 7885 \r\n3 2299 7161 5442 7886 \r\n3 1787 15939 7161 7886 \r\n3 1674 5442 15939 7886 \r\n3 4890 12901 11704 7887 \r\n3 3684 15039 12901 7887 \r\n3 4155 11704 15039 7887 \r\n3 4093 18225 10591 7888 \r\n3 552 14713 18225 7888 \r\n3 695 10591 14713 7888 \r\n3 4893 18224 13497 7889 \r\n3 1757 9038 18224 7889 \r\n3 3696 13497 9038 7889 \r\n3 43 17026 6511 7890 \r\n3 1579 19349 17026 7890 \r\n3 1030 6511 19349 7890 \r\n3 238 19350 5147 7891 \r\n3 3336 18836 19350 7891 \r\n3 4117 5147 18836 7891 \r\n3 2798 15741 19351 7892 \r\n3 1825 12512 15741 7892 \r\n3 4979 19351 12512 7892 \r\n3 1233 17674 13858 7893 \r\n3 4946 13191 17674 7893 \r\n3 1158 13858 13191 7893 \r\n3 4687 15018 10299 7894 \r\n3 3519 15068 15018 7894 \r\n3 2844 10299 15068 7894 \r\n3 3493 15772 7737 7895 \r\n3 3379 18471 15772 7895 \r\n3 1473 7737 18471 7895 \r\n3 3346 19325 19352 7896 \r\n3 1612 18240 19325 7896 \r\n3 724 19352 18240 7896 \r\n3 402 11336 17294 7897 \r\n3 719 6053 11336 7897 \r\n3 1679 17294 6053 7897 \r\n3 3900 12420 8240 7898 \r\n3 2128 5366 12420 7898 \r\n3 17 8240 5366 7898 \r\n3 3042 7127 13107 7899 \r\n3 1259 13241 7127 7899 \r\n3 764 13107 13241 7899 \r\n3 2905 18023 10058 7900 \r\n3 2242 19353 18023 7900 \r\n3 3592 10058 19353 7900 \r\n3 4528 12227 16784 7901 \r\n3 2269 12307 12227 7901 \r\n3 216 16784 12307 7901 \r\n3 3292 17148 10471 7902 \r\n3 23 15692 17148 7902 \r\n3 4871 10471 15692 7902 \r\n3 4268 17885 9124 7903 \r\n3 1078 10838 17885 7903 \r\n3 3683 9124 10838 7903 \r\n3 1539 19354 15780 7904 \r\n3 4439 12525 19354 7904 \r\n3 2450 15780 12525 7904 \r\n3 3669 13770 19356 7905 \r\n3 3300 19355 13770 7905 \r\n3 3802 19356 19355 7905 \r\n3 974 18868 11186 7906 \r\n3 834 19357 18868 7906 \r\n3 1981 11186 19357 7906 \r\n3 2482 19359 19358 7907 \r\n3 759 5553 19359 7907 \r\n3 1838 19358 5553 7907 \r\n3 3128 19361 19360 7908 \r\n3 2954 18418 19361 7908 \r\n3 2388 19360 18418 7908 \r\n3 31 18258 19362 7909 \r\n3 1055 18978 18258 7909 \r\n3 298 19362 18978 7909 \r\n3 828 15512 12163 7910 \r\n3 303 9776 15512 7910 \r\n3 4221 12163 9776 7910 \r\n3 3841 18347 19363 7911 \r\n3 2267 6745 18347 7911 \r\n3 4326 19363 6745 7911 \r\n3 2091 8492 19365 7912 \r\n3 609 19364 8492 7912 \r\n3 110 19365 19364 7912 \r\n3 2582 12573 17949 7913 \r\n3 4432 13559 12573 7913 \r\n3 2272 17949 13559 7913 \r\n3 1854 18657 19366 7914 \r\n3 424 12194 18657 7914 \r\n3 2785 19366 12194 7914 \r\n3 2405 15003 9709 7915 \r\n3 4582 11614 15003 7915 \r\n3 2754 9709 11614 7915 \r\n3 18 11533 13687 7916 \r\n3 1201 19367 11533 7916 \r\n3 3759 13687 19367 7916 \r\n3 1185 19368 5388 7917 \r\n3 3323 13956 19368 7917 \r\n3 4545 5388 13956 7917 \r\n3 1941 17582 19166 7918 \r\n3 3813 16125 17582 7918 \r\n3 1248 19166 16125 7918 \r\n3 2457 19371 19370 7919 \r\n3 4817 19369 19371 7919 \r\n3 2915 19370 19369 7919 \r\n3 4879 8097 15110 7920 \r\n3 1332 8266 8097 7920 \r\n3 1296 15110 8266 7920 \r\n3 2560 19372 18230 7921 \r\n3 3728 18794 19372 7921 \r\n3 4123 18230 18794 7921 \r\n3 1967 5382 19373 7922 \r\n3 4760 12054 5382 7922 \r\n3 3513 19373 12054 7922 \r\n3 2629 16348 18635 7923 \r\n3 2053 8891 16348 7923 \r\n3 4602 18635 8891 7923 \r\n3 46 13808 17014 7924 \r\n3 995 19284 13808 7924 \r\n3 4883 17014 19284 7924 \r\n3 68 15579 19374 7925 \r\n3 1884 10577 15579 7925 \r\n3 236 19374 10577 7925 \r\n3 4691 17122 17252 7926 \r\n3 1123 19375 17122 7926 \r\n3 1594 17252 19375 7926 \r\n3 3180 19376 17000 7927 \r\n3 3685 5729 19376 7927 \r\n3 3558 17000 5729 7927 \r\n3 1531 18153 19377 7928 \r\n3 3244 13862 18153 7928 \r\n3 3291 19377 13862 7928 \r\n3 745 19378 13507 7929 \r\n3 348 8689 19378 7929 \r\n3 1768 13507 8689 7929 \r\n3 4308 17513 19379 7930 \r\n3 878 16513 17513 7930 \r\n3 4183 19379 16513 7930 \r\n3 4336 16088 18983 7931 \r\n3 4111 8063 16088 7931 \r\n3 3425 18983 8063 7931 \r\n3 154 17872 18404 7932 \r\n3 1646 15466 17872 7932 \r\n3 3577 18404 15466 7932 \r\n3 1657 9923 10731 7933 \r\n3 118 15198 9923 7933 \r\n3 1641 10731 15198 7933 \r\n3 146 15022 19380 7934 \r\n3 3185 17537 15022 7934 \r\n3 545 19380 17537 7934 \r\n3 3041 17126 19381 7935 \r\n3 2523 14243 17126 7935 \r\n3 440 19381 14243 7935 \r\n3 1729 19383 17377 7936 \r\n3 3921 19382 19383 7936 \r\n3 3978 17377 19382 7936 \r\n3 4089 19263 17010 7937 \r\n3 506 15935 19263 7937 \r\n3 3372 17010 15935 7937 \r\n3 3272 17521 16477 7938 \r\n3 1701 15896 17521 7938 \r\n3 3914 16477 15896 7938 \r\n3 342 5291 13488 7939 \r\n3 1403 17048 5291 7939 \r\n3 1502 13488 17048 7939 \r\n3 4747 17791 6216 7940 \r\n3 2091 19365 17791 7940 \r\n3 110 6216 19365 7940 \r\n3 2054 10740 14858 7941 \r\n3 4851 19144 10740 7941 \r\n3 4363 14858 19144 7941 \r\n3 4309 13725 18725 7942 \r\n3 4848 19210 13725 7942 \r\n3 605 18725 19210 7942 \r\n3 1568 19384 10113 7943 \r\n3 3996 18817 19384 7943 \r\n3 268 10113 18817 7943 \r\n3 3712 19385 15886 7944 \r\n3 662 8021 19385 7944 \r\n3 3164 15886 8021 7944 \r\n3 549 19387 6385 7945 \r\n3 195 19386 19387 7945 \r\n3 308 6385 19386 7945 \r\n3 3073 10791 7673 7946 \r\n3 2179 19388 10791 7946 \r\n3 2828 7673 19388 7946 \r\n3 3266 13682 19390 7947 \r\n3 605 19389 13682 7947 \r\n3 3926 19390 19389 7947 \r\n3 3582 18096 16587 7948 \r\n3 3378 12081 18096 7948 \r\n3 1796 16587 12081 7948 \r\n3 4522 15720 5356 7949 \r\n3 1698 19391 15720 7949 \r\n3 4615 5356 19391 7949 \r\n3 4621 17078 16023 7950 \r\n3 342 13487 17078 7950 \r\n3 250 16023 13487 7950 \r\n3 1405 7743 6323 7951 \r\n3 768 17363 7743 7951 \r\n3 1260 6323 17363 7951 \r\n3 2529 12715 19392 7952 \r\n3 3127 14388 12715 7952 \r\n3 4189 19392 14388 7952 \r\n3 274 19266 16955 7953 \r\n3 690 17411 19266 7953 \r\n3 2783 16955 17411 7953 \r\n3 4906 12514 8882 7954 \r\n3 4202 9144 12514 7954 \r\n3 3002 8882 9144 7954 \r\n3 2152 15696 19393 7955 \r\n3 4274 14036 15696 7955 \r\n3 4452 19393 14036 7955 \r\n3 892 19394 15319 7956 \r\n3 2658 6344 19394 7956 \r\n3 601 15319 6344 7956 \r\n3 1878 13896 19395 7957 \r\n3 2096 16205 13896 7957 \r\n3 187 19395 16205 7957 \r\n3 807 11658 19396 7958 \r\n3 655 12448 11658 7958 \r\n3 4166 19396 12448 7958 \r\n3 2632 15572 19398 7959 \r\n3 3853 19397 15572 7959 \r\n3 3688 19398 19397 7959 \r\n3 1327 18338 15012 7960 \r\n3 197 19399 18338 7960 \r\n3 4983 15012 19399 7960 \r\n3 2238 11845 12704 7961 \r\n3 2435 9659 11845 7961 \r\n3 2827 12704 9659 7961 \r\n3 4533 17013 18416 7962 \r\n3 184 18914 17013 7962 \r\n3 272 18416 18914 7962 \r\n3 1484 11343 9799 7963 \r\n3 3747 8387 11343 7963 \r\n3 1626 9799 8387 7963 \r\n3 2247 14601 16452 7964 \r\n3 2854 19400 14601 7964 \r\n3 3737 16452 19400 7964 \r\n3 541 18469 18299 7965 \r\n3 3487 15587 18469 7965 \r\n3 966 18299 15587 7965 \r\n3 4383 18613 6505 7966 \r\n3 3178 12883 18613 7966 \r\n3 1585 6505 12883 7966 \r\n3 520 6852 9589 7967 \r\n3 4414 17764 6852 7967 \r\n3 266 9589 17764 7967 \r\n3 3553 16344 11825 7968 \r\n3 3810 19401 16344 7968 \r\n3 4152 11825 19401 7968 \r\n3 1582 19402 11278 7969 \r\n3 681 16455 19402 7969 \r\n3 3628 11278 16455 7969 \r\n3 1304 14126 19403 7970 \r\n3 2489 18294 14126 7970 \r\n3 4770 19403 18294 7970 \r\n3 739 14892 9956 7971 \r\n3 2468 14768 14892 7971 \r\n3 1890 9956 14768 7971 \r\n3 4010 15618 16952 7972 \r\n3 4017 10205 15618 7972 \r\n3 539 16952 10205 7972 \r\n3 2196 18020 11772 7973 \r\n3 4896 12740 18020 7973 \r\n3 1382 11772 12740 7973 \r\n3 667 17019 7024 7974 \r\n3 951 19310 17019 7974 \r\n3 3121 7024 19310 7974 \r\n3 2123 10453 19404 7975 \r\n3 2132 10138 10453 7975 \r\n3 2158 19404 10138 7975 \r\n3 2682 8771 17461 7976 \r\n3 4513 5110 8771 7976 \r\n3 4473 17461 5110 7976 \r\n3 677 8366 10957 7977 \r\n3 623 10143 8366 7977 \r\n3 2182 10957 10143 7977 \r\n3 4673 17905 5371 7978 \r\n3 908 7231 17905 7978 \r\n3 354 5371 7231 7978 \r\n3 4877 15435 11335 7979 \r\n3 4020 18674 15435 7979 \r\n3 719 11335 18674 7979 \r\n3 3594 19405 9371 7980 \r\n3 3115 16652 19405 7980 \r\n3 3035 9371 16652 7980 \r\n3 1955 17191 6809 7981 \r\n3 1530 7172 17191 7981 \r\n3 2458 6809 7172 7981 \r\n3 2181 10751 19406 7982 \r\n3 3375 12381 10751 7982 \r\n3 2180 19406 12381 7982 \r\n3 1723 17502 16356 7983 \r\n3 279 11191 17502 7983 \r\n3 1207 16356 11191 7983 \r\n3 921 19297 18426 7984 \r\n3 741 19407 19297 7984 \r\n3 2294 18426 19407 7984 \r\n3 296 8476 19121 7985 \r\n3 252 6655 8476 7985 \r\n3 1138 19121 6655 7985 \r\n3 2372 6473 19408 7986 \r\n3 2542 19337 6473 7986 \r\n3 4380 19408 19337 7986 \r\n3 3913 7944 19202 7987 \r\n3 3164 17705 7944 7987 \r\n3 1841 19202 17705 7987 \r\n3 2279 19321 17648 7988 \r\n3 2157 19409 19321 7988 \r\n3 509 17648 19409 7988 \r\n3 498 11850 5092 7989 \r\n3 4373 18053 11850 7989 \r\n3 3724 5092 18053 7989 \r\n3 2355 19410 15878 7990 \r\n3 911 19132 19410 7990 \r\n3 3963 15878 19132 7990 \r\n3 1171 14103 16896 7991 \r\n3 1557 19411 14103 7991 \r\n3 2434 16896 19411 7991 \r\n3 4745 18862 16631 7992 \r\n3 1879 12097 18862 7992 \r\n3 3581 16631 12097 7992 \r\n3 95 19412 17306 7993 \r\n3 2728 13150 19412 7993 \r\n3 181 17306 13150 7993 \r\n3 4327 11583 18512 7994 \r\n3 3251 17188 11583 7994 \r\n3 1791 18512 17188 7994 \r\n3 4573 17460 8982 7995 \r\n3 1420 9084 17460 7995 \r\n3 2977 8982 9084 7995 \r\n3 2520 18802 13865 7996 \r\n3 937 17994 18802 7996 \r\n3 2563 13865 17994 7996 \r\n3 3829 19413 15254 7997 \r\n3 1995 16185 19413 7997 \r\n3 2666 15254 16185 7997 \r\n3 3563 13595 13545 7998 \r\n3 2063 9342 13595 7998 \r\n3 3301 13545 9342 7998 \r\n3 2843 7601 16360 7999 \r\n3 3642 12355 7601 7999 \r\n3 3957 16360 12355 7999 \r\n3 4942 15289 19414 8000 \r\n3 6 18030 15289 8000 \r\n3 1289 19414 18030 8000 \r\n3 3734 14185 16875 8001 \r\n3 511 12066 14185 8001 \r\n3 4736 16875 12066 8001 \r\n3 802 19415 8017 8002 \r\n3 2159 10983 19415 8002 \r\n3 2930 8017 10983 8002 \r\n3 2012 17772 17744 8003 \r\n3 2170 12335 17772 8003 \r\n3 3439 17744 12335 8003 \r\n3 3982 10716 6357 8004 \r\n3 1880 7317 10716 8004 \r\n3 730 6357 7317 8004 \r\n3 2350 7973 19416 8005 \r\n3 4276 9996 7973 8005 \r\n3 1459 19416 9996 8005 \r\n3 1321 19417 16197 8006 \r\n3 1706 8324 19417 8006 \r\n3 3436 16197 8324 8006 \r\n3 1812 10252 13225 8007 \r\n3 430 18949 10252 8007 \r\n3 4653 13225 18949 8007 \r\n3 847 10644 19418 8008 \r\n3 3505 18319 10644 8008 \r\n3 3637 19418 18319 8008 \r\n3 4389 19419 17725 8009 \r\n3 3876 18859 19419 8009 \r\n3 795 17725 18859 8009 \r\n3 3011 19278 17052 8010 \r\n3 1192 9323 19278 8010 \r\n3 3657 17052 9323 8010 \r\n3 3640 17668 11895 8011 \r\n3 132 13536 17668 8011 \r\n3 2594 11895 13536 8011 \r\n3 230 6800 19109 8012 \r\n3 3586 17794 6800 8012 \r\n3 1366 19109 17794 8012 \r\n3 941 17918 18807 8013 \r\n3 1924 19167 17918 8013 \r\n3 1956 18807 19167 8013 \r\n3 3769 19420 18727 8014 \r\n3 2301 8283 19420 8014 \r\n3 3361 18727 8283 8014 \r\n3 1081 19421 17857 8015 \r\n3 2571 18835 19421 8015 \r\n3 3336 17857 18835 8015 \r\n3 4095 18781 12647 8016 \r\n3 164 5753 18781 8016 \r\n3 326 12647 5753 8016 \r\n3 1178 16199 12727 8017 \r\n3 1343 19422 16199 8017 \r\n3 3636 12727 19422 8017 \r\n3 3206 12122 8983 8018 \r\n3 1779 6975 12122 8018 \r\n3 1137 8983 6975 8018 \r\n3 3485 15300 19424 8019 \r\n3 1162 19423 15300 8019 \r\n3 199 19424 19423 8019 \r\n3 3475 18399 15180 8020 \r\n3 4360 16664 18399 8020 \r\n3 2869 15180 16664 8020 \r\n3 4371 19426 19425 8021 \r\n3 2229 11712 19426 8021 \r\n3 1565 19425 11712 8021 \r\n3 3592 14825 10056 8022 \r\n3 4980 5698 14825 8022 \r\n3 1065 10056 5698 8022 \r\n3 4326 13047 19363 8023 \r\n3 378 17464 13047 8023 \r\n3 3841 19363 17464 8023 \r\n3 4135 16214 12706 8024 \r\n3 1715 11494 16214 8024 \r\n3 1832 12706 11494 8024 \r\n3 3797 19428 13884 8025 \r\n3 1476 19427 19428 8025 \r\n3 3124 13884 19427 8025 \r\n3 904 12947 19058 8026 \r\n3 3404 9977 12947 8026 \r\n3 3753 19058 9977 8026 \r\n3 3451 18578 18890 8027 \r\n3 4794 19429 18578 8027 \r\n3 3752 18890 19429 8027 \r\n3 840 15518 11328 8028 \r\n3 1230 19430 15518 8028 \r\n3 771 11328 19430 8028 \r\n3 1702 7372 19431 8029 \r\n3 3547 18132 7372 8029 \r\n3 3695 19431 18132 8029 \r\n3 2251 19433 19432 8030 \r\n3 857 18637 19433 8030 \r\n3 674 19432 18637 8030 \r\n3 853 10151 10194 8031 \r\n3 4947 18951 10151 8031 \r\n3 4821 10194 18951 8031 \r\n3 1655 10384 19434 8032 \r\n3 4062 13367 10384 8032 \r\n3 3832 19434 13367 8032 \r\n3 3184 19435 17267 8033 \r\n3 54 18354 19435 8033 \r\n3 1315 17267 18354 8033 \r\n3 4887 11227 7292 8034 \r\n3 339 18616 11227 8034 \r\n3 1975 7292 18616 8034 \r\n3 4846 18624 16271 8035 \r\n3 2377 8477 18624 8035 \r\n3 296 16271 8477 8035 \r\n3 3091 15025 6364 8036 \r\n3 3960 9750 15025 8036 \r\n3 4313 6364 9750 8036 \r\n3 432 9715 19436 8037 \r\n3 4919 19128 9715 8037 \r\n3 4452 19436 19128 8037 \r\n3 4779 13743 17932 8038 \r\n3 4129 19437 13743 8038 \r\n3 4185 17932 19437 8038 \r\n3 1959 19439 19438 8039 \r\n3 4043 15950 19439 8039 \r\n3 418 19438 15950 8039 \r\n3 2979 13761 18996 8040 \r\n3 4163 17436 13761 8040 \r\n3 2557 18996 17436 8040 \r\n3 3225 19234 14174 8041 \r\n3 2642 16327 19234 8041 \r\n3 4566 14174 16327 8041 \r\n3 3665 15625 15533 8042 \r\n3 2689 19440 15625 8042 \r\n3 2231 15533 19440 8042 \r\n3 488 9696 8074 8043 \r\n3 4260 17940 9696 8043 \r\n3 269 8074 17940 8043 \r\n3 3861 14484 17865 8044 \r\n3 3069 9065 14484 8044 \r\n3 4212 17865 9065 8044 \r\n3 2770 16750 12589 8045 \r\n3 4750 17506 16750 8045 \r\n3 669 12589 17506 8045 \r\n3 3973 16538 17892 8046 \r\n3 4936 18795 16538 8046 \r\n3 293 17892 18795 8046 \r\n3 1810 18340 5661 8047 \r\n3 1242 19441 18340 8047 \r\n3 397 5661 19441 8047 \r\n3 217 11016 5879 8048 \r\n3 3363 18966 11016 8048 \r\n3 992 5879 18966 8048 \r\n3 3114 16931 12522 8049 \r\n3 168 17966 16931 8049 \r\n3 697 12522 17966 8049 \r\n3 4985 19442 15345 8050 \r\n3 1258 18648 19442 8050 \r\n3 248 15345 18648 8050 \r\n3 1077 12628 12397 8051 \r\n3 4618 14650 12628 8051 \r\n3 707 12397 14650 8051 \r\n3 1505 19444 19028 8052 \r\n3 4286 19443 19444 8052 \r\n3 2723 19028 19443 8052 \r\n3 4377 18821 7307 8053 \r\n3 3036 15155 18821 8053 \r\n3 2462 7307 15155 8053 \r\n3 2588 19445 15138 8054 \r\n3 1755 14372 19445 8054 \r\n3 1927 15138 14372 8054 \r\n3 4377 15109 10924 8055 \r\n3 815 13014 15109 8055 \r\n3 4521 10924 13014 8055 \r\n3 1932 15507 13307 8056 \r\n3 164 18981 15507 8056 \r\n3 3724 13307 18981 8056 \r\n3 4384 19446 13672 8057 \r\n3 857 19433 19446 8057 \r\n3 2251 13672 19433 8057 \r\n3 3380 19448 19447 8058 \r\n3 2690 5180 19448 8058 \r\n3 2275 19447 5180 8058 \r\n3 3074 15562 18108 8059 \r\n3 2382 19105 15562 8059 \r\n3 1656 18108 19105 8059 \r\n3 3912 17284 15381 8060 \r\n3 1333 5998 17284 8060 \r\n3 2380 15381 5998 8060 \r\n3 4041 19249 17972 8061 \r\n3 3531 17712 19249 8061 \r\n3 2036 17972 17712 8061 \r\n3 1425 10010 19449 8062 \r\n3 19 5894 10010 8062 \r\n3 1436 19449 5894 8062 \r\n3 4786 18249 19451 8063 \r\n3 4534 19450 18249 8063 \r\n3 1853 19451 19450 8063 \r\n3 3340 18384 19453 8064 \r\n3 1089 19452 18384 8064 \r\n3 1426 19453 19452 8064 \r\n3 837 17120 19455 8065 \r\n3 1746 19454 17120 8065 \r\n3 3818 19455 19454 8065 \r\n3 3504 15787 10196 8066 \r\n3 1736 16665 15787 8066 \r\n3 853 10196 16665 8066 \r\n3 25 18895 13386 8067 \r\n3 71 11824 18895 8067 \r\n3 428 13386 11824 8067 \r\n3 1241 17756 9054 8068 \r\n3 28 6431 17756 8068 \r\n3 4223 9054 6431 8068 \r\n3 1793 19457 7114 8069 \r\n3 4370 19456 19457 8069 \r\n3 4918 7114 19456 8069 \r\n3 4832 15013 12735 8070 \r\n3 2546 16642 15013 8070 \r\n3 4723 12735 16642 8070 \r\n3 2560 19082 19372 8071 \r\n3 2030 15438 19082 8071 \r\n3 3728 19372 15438 8071 \r\n3 117 13554 15458 8072 \r\n3 751 16608 13554 8072 \r\n3 1758 15458 16608 8072 \r\n3 3770 19458 9983 8073 \r\n3 1427 9656 19458 8073 \r\n3 4722 9983 9656 8073 \r\n3 4829 12858 6961 8074 \r\n3 4068 5601 12858 8074 \r\n3 994 6961 5601 8074 \r\n3 435 18834 18875 8075 \r\n3 2822 16683 18834 8075 \r\n3 1654 18875 16683 8075 \r\n3 2263 10859 17480 8076 \r\n3 1965 19459 10859 8076 \r\n3 804 17480 19459 8076 \r\n3 1155 19460 5921 8077 \r\n3 4550 18489 19460 8077 \r\n3 687 5921 18489 8077 \r\n3 3962 5522 19303 8078 \r\n3 3208 16827 5522 8078 \r\n3 3604 19303 16827 8078 \r\n3 1448 19461 7073 8079 \r\n3 934 6014 19461 8079 \r\n3 4045 7073 6014 8079 \r\n3 3769 5296 19463 8080 \r\n3 4816 19462 5296 8080 \r\n3 3707 19463 19462 8080 \r\n3 231 13892 10878 8081 \r\n3 4575 15610 13892 8081 \r\n3 1817 10878 15610 8081 \r\n3 2632 19465 19464 8082 \r\n3 1252 14114 19465 8082 \r\n3 1880 19464 14114 8082 \r\n3 3556 10617 18415 8083 \r\n3 3528 19466 10617 8083 \r\n3 4854 18415 19466 8083 \r\n3 4674 10787 11325 8084 \r\n3 2607 15408 10787 8084 \r\n3 4378 11325 15408 8084 \r\n3 1788 19468 19467 8085 \r\n3 3779 16856 19468 8085 \r\n3 3901 19467 16856 8085 \r\n3 4111 16087 19469 8086 \r\n3 3624 18116 16087 8086 \r\n3 4139 19469 18116 8086 \r\n3 4069 12581 8611 8087 \r\n3 3016 12428 12581 8087 \r\n3 1044 8611 12428 8087 \r\n3 267 7086 8220 8088 \r\n3 1602 9998 7086 8088 \r\n3 3217 8220 9998 8088 \r\n3 4183 16514 8878 8089 \r\n3 2464 17295 16514 8089 \r\n3 1679 8878 17295 8089 \r\n3 318 19470 14482 8090 \r\n3 212 12132 19470 8090 \r\n3 1586 14482 12132 8090 \r\n3 3137 19472 19471 8091 \r\n3 4855 8529 19472 8091 \r\n3 1215 19471 8529 8091 \r\n3 3898 19473 7022 8092 \r\n3 3786 6094 19473 8092 \r\n3 2435 7022 6094 8092 \r\n3 4961 15163 9535 8093 \r\n3 4627 10772 15163 8093 \r\n3 3045 9535 10772 8093 \r\n3 546 15523 19475 8094 \r\n3 2551 19474 15523 8094 \r\n3 4123 19475 19474 8094 \r\n3 3390 8170 13443 8095 \r\n3 4165 13529 8170 8095 \r\n3 4820 13443 13529 8095 \r\n3 4143 13394 15064 8096 \r\n3 4701 13349 13394 8096 \r\n3 1963 15064 13349 8096 \r\n3 3318 14296 15402 8097 \r\n3 2093 17403 14296 8097 \r\n3 3062 15402 17403 8097 \r\n3 2262 14720 19477 8098 \r\n3 2799 19476 14720 8098 \r\n3 2310 19477 19476 8098 \r\n3 1347 10737 7054 8099 \r\n3 662 18799 10737 8099 \r\n3 1321 7054 18799 8099 \r\n3 1890 12819 9957 8100 \r\n3 2856 19478 12819 8100 \r\n3 2362 9957 19478 8100 \r\n3 395 19479 16174 8101 \r\n3 3149 8238 19479 8101 \r\n3 4144 16174 8238 8101 \r\n3 2809 17206 17417 8102 \r\n3 3528 10619 17206 8102 \r\n3 4001 17417 10619 8102 \r\n3 3061 12363 13009 8103 \r\n3 1592 14912 12363 8103 \r\n3 336 13009 14912 8103 \r\n3 4823 8405 11659 8104 \r\n3 1632 14032 8405 8104 \r\n3 3991 11659 14032 8104 \r\n3 4555 7097 10339 8105 \r\n3 3076 10033 7097 8105 \r\n3 2969 10339 10033 8105 \r\n3 2169 15275 8664 8106 \r\n3 434 18333 15275 8106 \r\n3 3413 8664 18333 8106 \r\n3 2890 18610 19480 8107 \r\n3 4944 17870 18610 8107 \r\n3 154 19480 17870 8107 \r\n3 1258 19442 11108 8108 \r\n3 4985 14382 19442 8108 \r\n3 1937 11108 14382 8108 \r\n3 337 18925 19481 8109 \r\n3 2505 12674 18925 8109 \r\n3 169 19481 12674 8109 \r\n3 2313 9315 19482 8110 \r\n3 97 7579 9315 8110 \r\n3 2659 19482 7579 8110 \r\n3 4729 19315 6576 8111 \r\n3 38 14534 19315 8111 \r\n3 653 6576 14534 8111 \r\n3 1434 19483 18265 8112 \r\n3 2898 12743 19483 8112 \r\n3 4487 18265 12743 8112 \r\n3 1213 7792 17684 8113 \r\n3 753 12993 7792 8113 \r\n3 3419 17684 12993 8113 \r\n3 30 11586 18792 8114 \r\n3 699 12564 11586 8114 \r\n3 1925 18792 12564 8114 \r\n3 1704 19316 19484 8115 \r\n3 4849 5431 19316 8115 \r\n3 3480 19484 5431 8115 \r\n3 1775 13695 19486 8116 \r\n3 3589 19485 13695 8116 \r\n3 2166 19486 19485 8116 \r\n3 3131 7095 16141 8117 \r\n3 321 8930 7095 8117 \r\n3 2278 16141 8930 8117 \r\n3 1426 11026 19453 8118 \r\n3 4516 19055 11026 8118 \r\n3 3340 19453 19055 8118 \r\n3 3433 8360 19487 8119 \r\n3 3781 14497 8360 8119 \r\n3 173 19487 14497 8119 \r\n3 358 6145 19488 8120 \r\n3 3858 18367 6145 8120 \r\n3 3000 19488 18367 8120 \r\n3 1458 13553 19490 8121 \r\n3 3242 19489 13553 8121 \r\n3 1391 19490 19489 8121 \r\n3 1810 19491 17714 8122 \r\n3 4868 13110 19491 8122 \r\n3 3170 17714 13110 8122 \r\n3 953 19492 15432 8123 \r\n3 2652 12126 19492 8123 \r\n3 944 15432 12126 8123 \r\n3 4803 11853 10713 8124 \r\n3 2818 19493 11853 8124 \r\n3 800 10713 19493 8124 \r\n3 4012 17615 7136 8125 \r\n3 17 14747 17615 8125 \r\n3 971 7136 14747 8125 \r\n3 4573 8981 17339 8126 \r\n3 1497 10206 8981 8126 \r\n3 4017 17339 10206 8126 \r\n3 1315 14340 17266 8127 \r\n3 2250 12530 14340 8127 \r\n3 4155 17266 12530 8127 \r\n3 2086 16434 18576 8128 \r\n3 4942 8198 16434 8128 \r\n3 4240 18576 8198 8128 \r\n3 4103 16020 5744 8129 \r\n3 4739 19494 16020 8129 \r\n3 2511 5744 19494 8129 \r\n3 4535 19313 9096 8130 \r\n3 4729 18860 19313 8130 \r\n3 1520 9096 18860 8130 \r\n3 891 15503 13331 8131 \r\n3 2271 16342 15503 8131 \r\n3 3553 13331 16342 8131 \r\n3 3539 8246 13412 8132 \r\n3 78 14465 8246 8132 \r\n3 2892 13412 14465 8132 \r\n3 3905 19496 19495 8133 \r\n3 2129 16307 19496 8133 \r\n3 2660 19495 16307 8133 \r\n3 3560 17140 10623 8134 \r\n3 959 19189 17140 8134 \r\n3 641 10623 19189 8134 \r\n3 1118 18962 11811 8135 \r\n3 2230 19279 18962 8135 \r\n3 3011 11811 19279 8135 \r\n3 2355 18376 19410 8136 \r\n3 3654 19497 18376 8136 \r\n3 911 19410 19497 8136 \r\n3 4667 17520 15220 8137 \r\n3 29 5389 17520 8137 \r\n3 3106 15220 5389 8137 \r\n3 487 16085 19498 8138 \r\n3 695 18608 16085 8138 \r\n3 2919 19498 18608 8138 \r\n3 4561 8364 6757 8139 \r\n3 3138 18352 8364 8139 \r\n3 710 6757 18352 8139 \r\n3 1311 7391 16316 8140 \r\n3 2866 8729 7391 8140 \r\n3 591 16316 8729 8140 \r\n3 4561 18571 17618 8141 \r\n3 1126 19317 18571 8141 \r\n3 2806 17618 19317 8141 \r\n3 4371 7712 18634 8142 \r\n3 3865 19025 7712 8142 \r\n3 1254 18634 19025 8142 \r\n3 2471 19501 19500 8143 \r\n3 328 19499 19501 8143 \r\n3 1328 19500 19499 8143 \r\n3 4000 5492 16776 8144 \r\n3 3638 15239 5492 8144 \r\n3 1349 16776 15239 8144 \r\n3 2980 12668 16584 8145 \r\n3 1875 16136 12668 8145 \r\n3 976 16584 16136 8145 \r\n3 4039 14345 6057 8146 \r\n3 3093 18629 14345 8146 \r\n3 2706 6057 18629 8146 \r\n3 3382 19503 19502 8147 \r\n3 4241 18341 19503 8147 \r\n3 1419 19502 18341 8147 \r\n3 3404 12946 18757 8148 \r\n3 4837 9839 12946 8148 \r\n3 704 18757 9839 8148 \r\n3 3768 19504 19012 8149 \r\n3 3707 16786 19504 8149 \r\n3 925 19012 16786 8149 \r\n3 1326 5816 17033 8150 \r\n3 2605 16506 5816 8150 \r\n3 842 17033 16506 8150 \r\n3 4928 7863 19505 8151 \r\n3 4417 15637 7863 8151 \r\n3 823 19505 15637 8151 \r\n3 3770 9666 19458 8152 \r\n3 4986 19506 9666 8152 \r\n3 1427 19458 19506 8152 \r\n3 2342 6241 19507 8153 \r\n3 1870 18698 6241 8153 \r\n3 2662 19507 18698 8153 \r\n3 868 8018 18666 8154 \r\n3 2930 12276 8018 8154 \r\n3 1752 18666 12276 8154 \r\n3 2585 19509 17198 8155 \r\n3 3800 19508 19509 8155 \r\n3 926 17198 19508 8155 \r\n3 2864 19510 19072 8156 \r\n3 3256 17653 19510 8156 \r\n3 370 19072 17653 8156 \r\n3 1528 15593 17807 8157 \r\n3 2895 5274 15593 8157 \r\n3 2965 17807 5274 8157 \r\n3 391 19511 17260 8158 \r\n3 1920 8756 19511 8158 \r\n3 2905 17260 8756 8158 \r\n3 427 9570 7040 8159 \r\n3 4080 7385 9570 8159 \r\n3 4367 7040 7385 8159 \r\n3 2939 8121 17980 8160 \r\n3 2488 17242 8121 8160 \r\n3 1099 17980 17242 8160 \r\n3 2804 19512 16025 8161 \r\n3 374 6186 19512 8161 \r\n3 4975 16025 6186 8161 \r\n3 1706 16855 8322 8162 \r\n3 3779 7348 16855 8162 \r\n3 1963 8322 7348 8162 \r\n3 2961 19103 15515 8163 \r\n3 4481 19513 19103 8163 \r\n3 1394 15515 19513 8163 \r\n3 4190 10969 5772 8164 \r\n3 2332 15993 10969 8164 \r\n3 3238 5772 15993 8164 \r\n3 4016 19515 14383 8165 \r\n3 35 19514 19515 8165 \r\n3 4873 14383 19514 8165 \r\n3 1023 12803 5718 8166 \r\n3 4198 16632 12803 8166 \r\n3 3147 5718 16632 8166 \r\n3 3653 5279 13531 8167 \r\n3 383 13441 5279 8167 \r\n3 4820 13531 13441 8167 \r\n3 1893 17795 14647 8168 \r\n3 3989 15097 17795 8168 \r\n3 2733 14647 15097 8168 \r\n3 885 19064 7671 8169 \r\n3 1063 19516 19064 8169 \r\n3 3141 7671 19516 8169 \r\n3 1519 5105 19517 8170 \r\n3 3144 12723 5105 8170 \r\n3 808 19517 12723 8170 \r\n3 3677 10437 15277 8171 \r\n3 4149 19518 10437 8171 \r\n3 1308 15277 19518 8171 \r\n3 4567 6149 16001 8172 \r\n3 4599 17560 6149 8172 \r\n3 4943 16001 17560 8172 \r\n3 4552 16801 8369 8173 \r\n3 1158 12836 16801 8173 \r\n3 1231 8369 12836 8173 \r\n3 836 19519 17785 8174 \r\n3 2747 10671 19519 8174 \r\n3 1677 17785 10671 8174 \r\n3 4167 7408 19520 8175 \r\n3 1547 6782 7408 8175 \r\n3 2753 19520 6782 8175 \r\n3 1877 16481 6658 8176 \r\n3 3264 17815 16481 8176 \r\n3 1494 6658 17815 8176 \r\n3 2836 9120 15652 8177 \r\n3 2531 13040 9120 8177 \r\n3 2622 15652 13040 8177 \r\n3 3555 19307 17600 8178 \r\n3 1350 18111 19307 8178 \r\n3 3816 17600 18111 8178 \r\n3 3078 10019 16491 8179 \r\n3 4074 19521 10019 8179 \r\n3 1517 16491 19521 8179 \r\n3 1108 10935 10348 8180 \r\n3 3975 9073 10935 8180 \r\n3 492 10348 9073 8180 \r\n3 1886 15995 15719 8181 \r\n3 106 17632 15995 8181 \r\n3 1698 15719 17632 8181 \r\n3 3229 9810 19522 8182 \r\n3 4062 16574 9810 8182 \r\n3 750 19522 16574 8182 \r\n3 780 18988 8938 8183 \r\n3 4834 19523 18988 8183 \r\n3 2826 8938 19523 8183 \r\n3 2658 19394 14407 8184 \r\n3 892 17233 19394 8184 \r\n3 3588 14407 17233 8184 \r\n3 3768 15933 19504 8185 \r\n3 506 14155 15933 8185 \r\n3 3707 19504 14155 8185 \r\n3 4968 17767 19524 8186 \r\n3 709 13404 17767 8186 \r\n3 1350 19524 13404 8186 \r\n3 2460 13673 15699 8187 \r\n3 2251 6885 13673 8187 \r\n3 727 15699 6885 8187 \r\n3 4541 19525 6610 8188 \r\n3 188 14300 19525 8188 \r\n3 3330 6610 14300 8188 \r\n3 4278 14721 19172 8189 \r\n3 2134 18681 14721 8189 \r\n3 4040 19172 18681 8189 \r\n3 3887 11536 13573 8190 \r\n3 3778 15047 11536 8190 \r\n3 4088 13573 15047 8190 \r\n3 4765 13937 15240 8191 \r\n3 219 13186 13937 8191 \r\n3 3656 15240 13186 8191 \r\n3 3827 19527 15462 8192 \r\n3 946 19526 19527 8192 \r\n3 3154 15462 19526 8192 \r\n3 3284 13301 18852 8193 \r\n3 1399 19528 13301 8193 \r\n3 53 18852 19528 8193 \r\n3 4351 11268 19529 8194 \r\n3 1889 18669 11268 8194 \r\n3 3101 19529 18669 8194 \r\n3 3064 13393 16694 8195 \r\n3 4450 18072 13393 8195 \r\n3 2089 16694 18072 8195 \r\n3 2820 5351 14213 8196 \r\n3 3240 13111 5351 8196 \r\n3 2517 14213 13111 8196 \r\n3 414 19530 6570 8197 \r\n3 4 15425 19530 8197 \r\n3 2613 6570 15425 8197 \r\n3 4006 16815 18293 8198 \r\n3 1133 18278 16815 8198 \r\n3 4330 18293 18278 8198 \r\n3 4481 19531 19513 8199 \r\n3 2289 18226 19531 8199 \r\n3 1394 19513 18226 8199 \r\n3 2561 15730 13680 8200 \r\n3 2701 5416 15730 8200 \r\n3 2604 13680 5416 8200 \r\n3 581 11694 13688 8201 \r\n3 4307 9365 11694 8201 \r\n3 18 13688 9365 8201 \r\n3 724 5704 19352 8202 \r\n3 626 19532 5704 8202 \r\n3 3346 19352 19532 8202 \r\n3 3112 18139 14781 8203 \r\n3 2227 19533 18139 8203 \r\n3 3884 14781 19533 8203 \r\n3 354 16707 5372 8204 \r\n3 381 19534 16707 8204 \r\n3 2766 5372 19534 8204 \r\n3 3207 19535 11865 8205 \r\n3 2689 15627 19535 8205 \r\n3 2839 11865 15627 8205 \r\n3 3056 19222 17703 8206 \r\n3 475 12479 19222 8206 \r\n3 1511 17703 12479 8206 \r\n3 2920 19537 19536 8207 \r\n3 2305 15557 19537 8207 \r\n3 1209 19536 15557 8207 \r\n3 3465 19539 8898 8208 \r\n3 791 19538 19539 8208 \r\n3 4746 8898 19538 8208 \r\n3 3399 19541 9803 8209 \r\n3 2152 19540 19541 8209 \r\n3 438 9803 19540 8209 \r\n3 3520 19543 10207 8210 \r\n3 4945 19542 19543 8210 \r\n3 1206 10207 19542 8210 \r\n3 1365 19544 18521 8211 \r\n3 64 16031 19544 8211 \r\n3 4699 18521 16031 8211 \r\n3 4706 15662 10305 8212 \r\n3 3860 7267 15662 8212 \r\n3 4749 10305 7267 8212 \r\n3 1328 12655 19500 8213 \r\n3 4154 10519 12655 8213 \r\n3 2471 19500 10519 8213 \r\n3 1902 19545 14645 8214 \r\n3 4135 10223 19545 8214 \r\n3 1991 14645 10223 8214 \r\n3 525 11817 16299 8215 \r\n3 2718 17143 11817 8215 \r\n3 3057 16299 17143 8215 \r\n3 1329 7809 12786 8216 \r\n3 4477 14510 7809 8216 \r\n3 2196 12786 14510 8216 \r\n3 381 19547 19534 8217 \r\n3 553 19546 19547 8217 \r\n3 2766 19534 19546 8217 \r\n3 198 18922 19548 8218 \r\n3 1677 10670 18922 8218 \r\n3 668 19548 10670 8218 \r\n3 4165 17150 13149 8219 \r\n3 1025 15218 17150 8219 \r\n3 181 13149 15218 8219 \r\n3 815 15108 17274 8220 \r\n3 1478 8399 15108 8220 \r\n3 2312 17274 8399 8220 \r\n3 2334 16443 17876 8221 \r\n3 1150 19549 16443 8221 \r\n3 3980 17876 19549 8221 \r\n3 542 15332 19550 8222 \r\n3 2990 19086 15332 8222 \r\n3 1998 19550 19086 8222 \r\n3 4360 19551 16663 8223 \r\n3 3293 18248 19551 8223 \r\n3 4328 16663 18248 8223 \r\n3 2248 19039 10945 8224 \r\n3 886 19552 19039 8224 \r\n3 3901 10945 19552 8224 \r\n3 2569 18665 18867 8225 \r\n3 2385 11129 18665 8225 \r\n3 1731 18867 11129 8225 \r\n3 2768 19553 12161 8226 \r\n3 1794 8588 19553 8226 \r\n3 2108 12161 8588 8226 \r\n3 339 9593 18617 8227 \r\n3 484 16079 9593 8227 \r\n3 2485 18617 16079 8227 \r\n3 882 13239 19042 8228 \r\n3 2131 11679 13239 8228 \r\n3 4799 19042 11679 8228 \r\n3 170 19554 13641 8229 \r\n3 3529 13947 19554 8229 \r\n3 1318 13641 13947 8229 \r\n3 2154 8557 6415 8230 \r\n3 4215 13290 8557 8230 \r\n3 4455 6415 13290 8230 \r\n3 4438 9842 17995 8231 \r\n3 2203 8188 9842 8231 \r\n3 2563 17995 8188 8231 \r\n3 1594 17222 17040 8232 \r\n3 2230 10557 17222 8232 \r\n3 3916 17040 10557 8232 \r\n3 1125 6058 18650 8233 \r\n3 4343 15063 6058 8233 \r\n3 2591 18650 15063 8233 \r\n3 650 19555 19155 8234 \r\n3 4730 5560 19555 8234 \r\n3 2882 19155 5560 8234 \r\n3 4177 17650 18185 8235 \r\n3 1257 19556 17650 8235 \r\n3 4661 18185 19556 8235 \r\n3 937 14082 14738 8236 \r\n3 2697 5410 14082 8236 \r\n3 292 14738 5410 8236 \r\n3 4359 18550 18334 8237 \r\n3 2862 11906 18550 8237 \r\n3 3413 18334 11906 8237 \r\n3 2588 8393 19445 8238 \r\n3 175 16501 8393 8238 \r\n3 1755 19445 16501 8238 \r\n3 57 19029 14478 8239 \r\n3 2958 17029 19029 8239 \r\n3 4097 14478 17029 8239 \r\n3 1030 18486 6509 8240 \r\n3 5 16164 18486 8240 \r\n3 1923 6509 16164 8240 \r\n3 4574 17109 5139 8241 \r\n3 2490 10621 17109 8241 \r\n3 2726 5139 10621 8241 \r\n3 287 17353 11365 8242 \r\n3 419 14648 17353 8242 \r\n3 3878 11365 14648 8242 \r\n3 2283 18501 18452 8243 \r\n3 2110 19557 18501 8243 \r\n3 365 18452 19557 8243 \r\n3 3040 19558 11394 8244 \r\n3 1310 17452 19558 8244 \r\n3 1229 11394 17452 8244 \r\n3 2082 5820 18291 8245 \r\n3 910 18824 5820 8245 \r\n3 3430 18291 18824 8245 \r\n3 353 9377 15088 8246 \r\n3 3609 10061 9377 8246 \r\n3 568 15088 10061 8246 \r\n3 2476 19066 13289 8247 \r\n3 1843 14880 19066 8247 \r\n3 4455 13289 14880 8247 \r\n3 3216 18492 5869 8248 \r\n3 4869 14696 18492 8248 \r\n3 2266 5869 14696 8248 \r\n3 651 19238 18253 8249 \r\n3 2507 19559 19238 8249 \r\n3 4948 18253 19559 8249 \r\n3 4609 14722 16543 8250 \r\n3 4278 18316 14722 8250 \r\n3 2148 16543 18316 8250 \r\n3 201 16582 17420 8251 \r\n3 1587 19560 16582 8251 \r\n3 2400 17420 19560 8251 \r\n3 2784 15683 17271 8252 \r\n3 1824 18838 15683 8252 \r\n3 4116 17271 18838 8252 \r\n3 4611 7666 19561 8253 \r\n3 4588 16913 7666 8253 \r\n3 152 19561 16913 8253 \r\n3 6 18262 18029 8254 \r\n3 4958 6816 18262 8254 \r\n3 1764 18029 6816 8254 \r\n3 4766 11050 14670 8255 \r\n3 2343 17715 11050 8255 \r\n3 324 14670 17715 8255 \r\n3 4990 9070 19035 8256 \r\n3 227 18271 9070 8256 \r\n3 2535 19035 18271 8256 \r\n3 3322 16454 11662 8257 \r\n3 4774 12798 16454 8257 \r\n3 4257 11662 12798 8257 \r\n3 1798 13162 19562 8258 \r\n3 4753 17082 13162 8258 \r\n3 4440 19562 17082 8258 \r\n3 2923 14235 19563 8259 \r\n3 1353 5722 14235 8259 \r\n3 4675 19563 5722 8259 \r\n3 3350 11369 19564 8260 \r\n3 3926 19389 11369 8260 \r\n3 605 19564 19389 8260 \r\n3 2944 19565 17300 8261 \r\n3 3892 6342 19565 8261 \r\n3 2658 17300 6342 8261 \r\n3 665 16935 16373 8262 \r\n3 2467 18357 16935 8262 \r\n3 4773 16373 18357 8262 \r\n3 2722 12374 18883 8263 \r\n3 2415 17390 12374 8263 \r\n3 1551 18883 17390 8263 \r\n3 4036 18336 11471 8264 \r\n3 300 11941 18336 8264 \r\n3 42 11471 11941 8264 \r\n3 1770 18660 6543 8265 \r\n3 3868 15760 18660 8265 \r\n3 3697 6543 15760 8265 \r\n3 4178 19566 16804 8266 \r\n3 3618 9780 19566 8266 \r\n3 3622 16804 9780 8266 \r\n3 684 11575 18447 8267 \r\n3 4782 8106 11575 8267 \r\n3 4805 18447 8106 8267 \r\n3 4932 9980 19567 8268 \r\n3 3349 7878 9980 8268 \r\n3 2547 19567 7878 8268 \r\n3 3903 12105 16341 8269 \r\n3 2877 8636 12105 8269 \r\n3 1901 16341 8636 8269 \r\n3 2433 17805 12917 8270 \r\n3 813 15367 17805 8270 \r\n3 107 12917 15367 8270 \r\n3 4231 19568 18255 8271 \r\n3 4485 15085 19568 8271 \r\n3 2655 18255 15085 8271 \r\n3 3296 15472 14683 8272 \r\n3 4449 16593 15472 8272 \r\n3 4437 14683 16593 8272 \r\n3 677 10959 7729 8273 \r\n3 4656 15710 10959 8273 \r\n3 3476 7729 15710 8273 \r\n3 460 19118 15314 8274 \r\n3 3737 19400 19118 8274 \r\n3 2854 15314 19400 8274 \r\n3 3001 15570 13609 8275 \r\n3 3675 19060 15570 8275 \r\n3 3124 13609 19060 8275 \r\n3 3502 7521 11938 8276 \r\n3 1734 13952 7521 8276 \r\n3 2521 11938 13952 8276 \r\n3 3718 7219 16556 8277 \r\n3 241 9964 7219 8277 \r\n3 3087 16556 9964 8277 \r\n3 4686 18971 6532 8278 \r\n3 3355 18458 18971 8278 \r\n3 324 6532 18458 8278 \r\n3 4972 13652 7585 8279 \r\n3 3706 19569 13652 8279 \r\n3 1031 7585 19569 8279 \r\n3 3608 12689 18744 8280 \r\n3 2067 18750 12689 8280 \r\n3 2906 18744 18750 8280 \r\n3 4033 13431 9876 8281 \r\n3 1100 19570 13431 8281 \r\n3 3976 9876 19570 8281 \r\n3 2579 5196 5794 8282 \r\n3 1509 5078 5196 8282 \r\n3 3269 5794 5078 8282 \r\n3 35 8390 19514 8283 \r\n3 2262 18675 8390 8283 \r\n3 4873 19514 18675 8283 \r\n3 370 10432 19073 8284 \r\n3 3024 10955 10432 8284 \r\n3 4992 19073 10955 8284 \r\n3 1901 5962 14764 8285 \r\n3 312 19571 5962 8285 \r\n3 1367 14764 19571 8285 \r\n3 223 7119 10798 8286 \r\n3 4916 19572 7119 8286 \r\n3 4894 10798 19572 8286 \r\n3 4453 10848 19573 8287 \r\n3 4541 6612 10848 8287 \r\n3 561 19573 6612 8287 \r\n3 1588 17337 18739 8288 \r\n3 4131 7243 17337 8288 \r\n3 1463 18739 7243 8288 \r\n3 2380 9868 15382 8289 \r\n3 2534 8137 9868 8289 \r\n3 3142 15382 8137 8289 \r\n3 3482 19078 15196 8290 \r\n3 4717 16041 19078 8290 \r\n3 2661 15196 16041 8290 \r\n3 2654 18397 18449 8291 \r\n3 2598 9805 18397 8291 \r\n3 2637 18449 9805 8291 \r\n3 754 19576 19575 8292 \r\n3 2005 19574 19576 8292 \r\n3 329 19575 19574 8292 \r\n3 1973 17466 9204 8293 \r\n3 565 19577 17466 8293 \r\n3 3799 9204 19577 8293 \r\n3 3298 16167 11592 8294 \r\n3 3585 19578 16167 8294 \r\n3 4645 11592 19578 8294 \r\n3 1786 8680 12350 8295 \r\n3 4352 10294 8680 8295 \r\n3 129 12350 10294 8295 \r\n3 4642 14195 12865 8296 \r\n3 2566 19579 14195 8296 \r\n3 4353 12865 19579 8296 \r\n3 3259 10029 16492 8297 \r\n3 1716 19580 10029 8297 \r\n3 3533 16492 19580 8297 \r\n3 144 18831 19240 8298 \r\n3 725 7475 18831 8298 \r\n3 1827 19240 7475 8298 \r\n3 4502 18170 17661 8299 \r\n3 1843 19067 18170 8299 \r\n3 3376 17661 19067 8299 \r\n3 2233 18440 11096 8300 \r\n3 4316 14621 18440 8300 \r\n3 1129 11096 14621 8300 \r\n3 4772 19581 6468 8301 \r\n3 1292 15917 19581 8301 \r\n3 2668 6468 15917 8301 \r\n3 1618 18295 18730 8302 \r\n3 1371 14123 18295 8302 \r\n3 2145 18730 14123 8302 \r\n3 3818 19454 7748 8303 \r\n3 1746 12737 19454 8303 \r\n3 536 7748 12737 8303 \r\n3 2138 13348 17768 8304 \r\n3 2714 17292 13348 8304 \r\n3 1763 17768 17292 8304 \r\n3 1845 8569 10877 8305 \r\n3 4857 16567 8569 8305 \r\n3 231 10877 16567 8305 \r\n3 2991 19582 18161 8306 \r\n3 4004 18472 19582 8306 \r\n3 3379 18161 18472 8306 \r\n3 860 8572 14417 8307 \r\n3 4576 9681 8572 8307 \r\n3 2297 14417 9681 8307 \r\n3 2293 18915 10868 8308 \r\n3 1780 12910 18915 8308 \r\n3 1575 10868 12910 8308 \r\n3 1617 10434 9178 8309 \r\n3 1538 17780 10434 8309 \r\n3 4205 9178 17780 8309 \r\n3 2811 17264 18259 8310 \r\n3 2268 17561 17264 8310 \r\n3 4599 18259 17561 8310 \r\n3 944 14239 14376 8311 \r\n3 1969 15349 14239 8311 \r\n3 2387 14376 15349 8311 \r\n3 3594 18502 19405 8312 \r\n3 4227 19583 18502 8312 \r\n3 3115 19405 19583 8312 \r\n3 4532 7334 18420 8313 \r\n3 3559 11412 7334 8313 \r\n3 1059 18420 11412 8313 \r\n3 3335 7076 17161 8314 \r\n3 316 15087 7076 8314 \r\n3 4512 17161 15087 8314 \r\n3 452 19219 19584 8315 \r\n3 3537 14152 19219 8315 \r\n3 4874 19584 14152 8315 \r\n3 4277 19586 19585 8316 \r\n3 487 19498 19586 8316 \r\n3 2919 19585 19498 8316 \r\n3 2242 13867 19353 8317 \r\n3 384 14219 13867 8317 \r\n3 3592 19353 14219 8317 \r\n3 3948 10030 19141 8318 \r\n3 3259 19587 10030 8318 \r\n3 4101 19141 19587 8318 \r\n3 1289 17792 19588 8319 \r\n3 1176 19268 17792 8319 \r\n3 3817 19588 19268 8319 \r\n3 3734 19589 16987 8320 \r\n3 908 17904 19589 8320 \r\n3 3701 16987 17904 8320 \r\n3 1542 14294 19300 8321 \r\n3 4430 14251 14294 8321 \r\n3 1245 19300 14251 8321 \r\n3 4574 5138 17108 8322 \r\n3 1431 19590 5138 8322 \r\n3 2531 17108 19590 8322 \r\n3 4023 8876 10698 8323 \r\n3 1679 17740 8876 8323 \r\n3 4357 10698 17740 8323 \r\n3 3518 19591 18434 8324 \r\n3 343 12794 19591 8324 \r\n3 1147 18434 12794 8324 \r\n3 4427 12960 15912 8325 \r\n3 1387 12736 12960 8325 \r\n3 4723 15912 12736 8325 \r\n3 4061 19593 19592 8326 \r\n3 2962 13206 19593 8326 \r\n3 2923 19592 13206 8326 \r\n3 2800 19282 8595 8327 \r\n3 3153 19594 19282 8327 \r\n3 1826 8595 19594 8327 \r\n3 2183 18813 19595 8328 \r\n3 165 6584 18813 8328 \r\n3 3606 19595 6584 8328 \r\n3 4514 19597 13574 8329 \r\n3 1462 19596 19597 8329 \r\n3 3449 13574 19596 8329 \r\n3 265 15443 15802 8330 \r\n3 1723 16357 15443 8330 \r\n3 503 15802 16357 8330 \r\n3 3688 9374 7122 8331 \r\n3 1274 19598 9374 8331 \r\n3 4468 7122 19598 8331 \r\n3 3423 17970 19599 8332 \r\n3 3723 18159 17970 8332 \r\n3 4630 19599 18159 8332 \r\n3 2481 18791 16183 8333 \r\n3 161 10448 18791 8333 \r\n3 722 16183 10448 8333 \r\n3 4885 10812 8062 8334 \r\n3 3521 12606 10812 8334 \r\n3 3425 8062 12606 8334 \r\n3 4279 19600 6657 8335 \r\n3 1277 19272 19600 8335 \r\n3 1877 6657 19272 8335 \r\n3 4910 9871 12280 8336 \r\n3 628 19323 9871 8336 \r\n3 3922 12280 19323 8336 \r\n3 561 9746 19573 8337 \r\n3 1466 18987 9746 8337 \r\n3 4453 19573 18987 8337 \r\n3 1404 13273 19601 8338 \r\n3 1473 18473 13273 8338 \r\n3 4004 19601 18473 8338 \r\n3 1542 19603 19602 8339 \r\n3 4382 14131 19603 8339 \r\n3 2365 19602 14131 8339 \r\n3 1279 19604 8537 8340 \r\n3 1301 9062 19604 8340 \r\n3 1581 8537 9062 8340 \r\n3 1328 19499 19606 8341 \r\n3 328 19605 19499 8341 \r\n3 2070 19606 19605 8341 \r\n3 295 18828 19607 8342 \r\n3 949 18960 18828 8342 \r\n3 1671 19607 18960 8342 \r\n3 4891 11625 12678 8343 \r\n3 3664 15339 11625 8343 \r\n3 4863 12678 15339 8343 \r\n3 1931 14697 17986 8344 \r\n3 4869 19608 14697 8344 \r\n3 1670 17986 19608 8344 \r\n3 2154 18936 16242 8345 \r\n3 2580 19609 18936 8345 \r\n3 34 16242 19609 8345 \r\n3 3795 14091 8263 8346 \r\n3 3849 19070 14091 8346 \r\n3 2778 8263 19070 8346 \r\n3 3350 11433 19611 8347 \r\n3 65 19610 11433 8347 \r\n3 507 19611 19610 8347 \r\n3 575 18569 5503 8348 \r\n3 1518 9771 18569 8348 \r\n3 2162 5503 9771 8348 \r\n3 2988 9669 19613 8349 \r\n3 2928 19612 9669 8349 \r\n3 128 19613 19612 8349 \r\n3 2831 19614 9072 8350 \r\n3 4551 9269 19614 8350 \r\n3 492 9072 9269 8350 \r\n3 3970 19617 19616 8351 \r\n3 214 19615 19617 8351 \r\n3 1005 19616 19615 8351 \r\n3 2022 19618 12835 8352 \r\n3 1150 18283 19618 8352 \r\n3 866 12835 18283 8352 \r\n3 3796 19620 17802 8353 \r\n3 192 19619 19620 8353 \r\n3 2707 17802 19619 8353 \r\n3 941 11809 17686 8354 \r\n3 718 13692 11809 8354 \r\n3 2493 17686 13692 8354 \r\n3 3266 19390 19153 8355 \r\n3 3926 19621 19390 8355 \r\n3 359 19153 19621 8355 \r\n3 2524 12616 19622 8356 \r\n3 2420 15725 12616 8356 \r\n3 4411 19622 15725 8356 \r\n3 4435 15849 9967 8357 \r\n3 2026 19623 15849 8357 \r\n3 3067 9967 19623 8357 \r\n3 1286 9878 14694 8358 \r\n3 2354 12543 9878 8358 \r\n3 1743 14694 12543 8358 \r\n3 318 16009 19470 8359 \r\n3 2724 5251 16009 8359 \r\n3 212 19470 5251 8359 \r\n3 1423 16050 16464 8360 \r\n3 1830 18155 16050 8360 \r\n3 2584 16464 18155 8360 \r\n3 1706 19417 13499 8361 \r\n3 1321 18798 19417 8361 \r\n3 1690 13499 18798 8361 \r\n3 3836 11524 5581 8362 \r\n3 3503 10615 11524 8362 \r\n3 1345 5581 10615 8362 \r\n3 2836 17987 9531 8363 \r\n3 1670 19608 17987 8363 \r\n3 4869 9531 19608 8363 \r\n3 2038 18884 11097 8364 \r\n3 3843 14121 18884 8364 \r\n3 4661 11097 14121 8364 \r\n3 1801 15856 15722 8365 \r\n3 2441 19624 15856 8365 \r\n3 330 15722 19624 8365 \r\n3 1143 13152 17927 8366 \r\n3 2913 17426 13152 8366 \r\n3 4911 17927 17426 8366 \r\n3 4645 19626 16126 8367 \r\n3 2937 19625 19626 8367 \r\n3 55 16126 19625 8367 \r\n3 3907 13512 19192 8368 \r\n3 4750 13528 13512 8368 \r\n3 4679 19192 13528 8368 \r\n3 2595 19092 8116 8369 \r\n3 4120 16305 19092 8369 \r\n3 3163 8116 16305 8369 \r\n3 1010 7392 6230 8370 \r\n3 2789 17407 7392 8370 \r\n3 3194 6230 17407 8370 \r\n3 4369 15648 19627 8371 \r\n3 2616 15372 15648 8371 \r\n3 4797 19627 15372 8371 \r\n3 4791 18412 19261 8372 \r\n3 4629 19087 18412 8372 \r\n3 2974 19261 19087 8372 \r\n3 1929 5540 11031 8373 \r\n3 2200 10241 5540 8373 \r\n3 2321 11031 10241 8373 \r\n3 3110 15032 19628 8374 \r\n3 3165 18467 15032 8374 \r\n3 1661 19628 18467 8374 \r\n3 926 10638 16729 8375 \r\n3 4148 18714 10638 8375 \r\n3 664 16729 18714 8375 \r\n3 4962 17503 19151 8376 \r\n3 2293 12846 17503 8376 \r\n3 3021 19151 12846 8376 \r\n3 3239 18308 10217 8377 \r\n3 1634 8465 18308 8377 \r\n3 3030 10217 8465 8377 \r\n3 3785 19629 7447 8378 \r\n3 1970 16112 19629 8378 \r\n3 1613 7447 16112 8378 \r\n3 2762 10041 19630 8379 \r\n3 4318 10219 10041 8379 \r\n3 4528 19630 10219 8379 \r\n3 16 13259 19631 8380 \r\n3 2249 11910 13259 8380 \r\n3 2691 19631 11910 8380 \r\n3 771 19430 19632 8381 \r\n3 1230 12030 19430 8381 \r\n3 807 19632 12030 8381 \r\n3 1154 16502 10070 8382 \r\n3 2224 18756 16502 8382 \r\n3 392 10070 18756 8382 \r\n3 39 19633 16279 8383 \r\n3 2486 12675 19633 8383 \r\n3 2505 16279 12675 8383 \r\n3 4263 19634 15540 8384 \r\n3 3676 9270 19634 8384 \r\n3 4551 15540 9270 8384 \r\n3 487 19636 19324 8385 \r\n3 2997 19635 19636 8385 \r\n3 708 19324 19635 8385 \r\n3 3225 5304 19235 8386 \r\n3 254 16103 5304 8386 \r\n3 108 19235 16103 8386 \r\n3 2006 5972 18104 8387 \r\n3 4454 17827 5972 8387 \r\n3 3036 18104 17827 8387 \r\n3 480 19637 7344 8388 \r\n3 347 5142 19637 8388 \r\n3 2078 7344 5142 8388 \r\n3 375 17526 17299 8389 \r\n3 4655 19638 17526 8389 \r\n3 4076 17299 19638 8389 \r\n3 341 13070 6500 8390 \r\n3 4755 12297 13070 8390 \r\n3 4680 6500 12297 8390 \r\n3 3402 9536 18192 8391 \r\n3 2310 19476 9536 8391 \r\n3 2799 18192 19476 8391 \r\n3 4461 6290 19347 8392 \r\n3 4746 19538 6290 8392 \r\n3 791 19347 19538 8392 \r\n3 1350 19306 19639 8393 \r\n3 623 18888 19306 8393 \r\n3 3725 19639 18888 8393 \r\n3 932 19641 18955 8394 \r\n3 2041 19640 19641 8394 \r\n3 1035 18955 19640 8394 \r\n3 3343 7449 19178 8395 \r\n3 4841 18844 7449 8395 \r\n3 4291 19178 18844 8395 \r\n3 2073 13589 9954 8396 \r\n3 4641 18977 13589 8396 \r\n3 1140 9954 18977 8396 \r\n3 801 8589 16202 8397 \r\n3 1794 16092 8589 8397 \r\n3 4989 16202 16092 8397 \r\n3 3393 12873 11361 8398 \r\n3 1148 19642 12873 8398 \r\n3 1451 11361 19642 8398 \r\n3 1243 12274 11055 8399 \r\n3 3537 5789 12274 8399 \r\n3 1205 11055 5789 8399 \r\n3 2998 13153 19643 8400 \r\n3 1915 8032 13153 8400 \r\n3 4568 19643 8032 8400 \r\n3 3949 15724 16449 8401 \r\n3 2686 17316 15724 8401 \r\n3 558 16449 17316 8401 \r\n3 31 9218 18257 8402 \r\n3 3391 18323 9218 8402 \r\n3 81 18257 18323 8402 \r\n3 1048 8625 9040 8403 \r\n3 1500 10822 8625 8403 \r\n3 2567 9040 10822 8403 \r\n3 943 15080 7492 8404 \r\n3 3899 11426 15080 8404 \r\n3 816 7492 11426 8404 \r\n3 527 17536 12776 8405 \r\n3 3863 9279 17536 8405 \r\n3 2587 12776 9279 8405 \r\n3 4310 17746 18889 8406 \r\n3 1457 8412 17746 8406 \r\n3 4488 18889 8412 8406 \r\n3 2788 12472 19644 8407 \r\n3 2289 19531 12472 8407 \r\n3 4481 19644 19531 8407 \r\n3 738 15674 7981 8408 \r\n3 542 9215 15674 8408 \r\n3 3524 7981 9215 8408 \r\n3 3121 12634 5422 8409 \r\n3 3569 8722 12634 8409 \r\n3 1919 5422 8722 8409 \r\n3 14 19645 19134 8410 \r\n3 77 18568 19645 8410 \r\n3 1681 19134 18568 8410 \r\n3 4763 7685 15522 8411 \r\n3 2860 19646 7685 8411 \r\n3 3320 15522 19646 8411 \r\n3 4894 19572 17359 8412 \r\n3 4916 13303 19572 8412 \r\n3 250 17359 13303 8412 \r\n3 1307 18525 7892 8413 \r\n3 2228 13231 18525 8413 \r\n3 1885 7892 13231 8413 \r\n3 771 19647 11329 8414 \r\n3 3494 10400 19647 8414 \r\n3 756 11329 10400 8414 \r\n3 2781 16036 13248 8415 \r\n3 2597 19648 16036 8415 \r\n3 1952 13248 19648 8415 \r\n3 4862 12222 17024 8416 \r\n3 3401 18692 12222 8416 \r\n3 4594 17024 18692 8416 \r\n3 1692 13168 19649 8417 \r\n3 4050 13590 13168 8417 \r\n3 1789 19649 13590 8417 \r\n3 4293 19651 19650 8418 \r\n3 2384 8437 19651 8418 \r\n3 1362 19650 8437 8418 \r\n3 4234 5118 12436 8419 \r\n3 2172 17253 5118 8419 \r\n3 2499 12436 17253 8419 \r\n3 2055 5707 19653 8420 \r\n3 2221 19652 5707 8420 \r\n3 2184 19653 19652 8420 \r\n3 1201 12285 19367 8421 \r\n3 3459 13918 12285 8421 \r\n3 3759 19367 13918 8421 \r\n3 2802 14885 19654 8422 \r\n3 1353 14237 14885 8422 \r\n3 1961 19654 14237 8422 \r\n3 1967 19373 16847 8423 \r\n3 3513 16364 19373 8423 \r\n3 4444 16847 16364 8423 \r\n3 2959 19655 14774 8424 \r\n3 4085 7661 19655 8424 \r\n3 4984 14774 7661 8424 \r\n3 2422 17965 9438 8425 \r\n3 2684 13145 17965 8425 \r\n3 2705 9438 13145 8425 \r\n3 1666 6276 10251 8426 \r\n3 1088 19656 6276 8426 \r\n3 2158 10251 19656 8426 \r\n3 3579 16809 12587 8427 \r\n3 4462 16084 16809 8427 \r\n3 2470 12587 16084 8427 \r\n3 2008 18098 11882 8428 \r\n3 3548 19657 18098 8428 \r\n3 524 11882 19657 8428 \r\n3 1589 19658 12259 8429 \r\n3 2538 18450 19658 8429 \r\n3 2097 12259 18450 8429 \r\n3 456 5069 17607 8430 \r\n3 4370 19659 5069 8430 \r\n3 3472 17607 19659 8430 \r\n3 2261 17701 8355 8431 \r\n3 4341 19660 17701 8431 \r\n3 3366 8355 19660 8431 \r\n3 3313 13922 7962 8432 \r\n3 2751 14609 13922 8432 \r\n3 4534 7962 14609 8432 \r\n3 1474 16241 16435 8433 \r\n3 2296 7590 16241 8433 \r\n3 425 16435 7590 8433 \r\n3 376 9105 11449 8434 \r\n3 1079 8943 9105 8434 \r\n3 1093 11449 8943 8434 \r\n3 4526 10944 10792 8435 \r\n3 2015 17570 10944 8435 \r\n3 2040 10792 17570 8435 \r\n3 2291 16696 19662 8436 \r\n3 1199 19661 16696 8436 \r\n3 3979 19662 19661 8436 \r\n3 4130 9169 19663 8437 \r\n3 732 19193 9169 8437 \r\n3 4679 19663 19193 8437 \r\n3 2615 17721 18600 8438 \r\n3 1762 18957 17721 8438 \r\n3 1237 18600 18957 8438 \r\n3 2426 16829 17935 8439 \r\n3 4782 6822 16829 8439 \r\n3 3109 17935 6822 8439 \r\n3 2916 19664 8811 8440 \r\n3 2072 7383 19664 8440 \r\n3 2832 8811 7383 8440 \r\n3 218 12172 5112 8441 \r\n3 3974 15252 12172 8441 \r\n3 4473 5112 15252 8441 \r\n3 1567 16824 17276 8442 \r\n3 3148 19665 16824 8442 \r\n3 448 17276 19665 8442 \r\n3 1876 18767 6634 8443 \r\n3 4480 17189 18767 8443 \r\n3 2730 6634 17189 8443 \r\n3 1060 5750 14638 8444 \r\n3 4744 17742 5750 8444 \r\n3 162 14638 17742 8444 \r\n3 3613 15819 18443 8445 \r\n3 2430 19666 15819 8445 \r\n3 1988 18443 19666 8445 \r\n3 1121 8804 15755 8446 \r\n3 569 19667 8804 8446 \r\n3 607 15755 19667 8446 \r\n3 4932 19567 18990 8447 \r\n3 2547 16718 19567 8447 \r\n3 2838 18990 16718 8447 \r\n3 1494 17816 17341 8448 \r\n3 3610 17066 17816 8448 \r\n3 3270 17341 17066 8448 \r\n3 2971 19668 17586 8449 \r\n3 3439 9712 19668 8449 \r\n3 4731 17586 9712 8449 \r\n3 3208 5521 15270 8450 \r\n3 4938 19669 5521 8450 \r\n3 3463 15270 19669 8450 \r\n3 157 14085 18396 8451 \r\n3 1268 7568 14085 8451 \r\n3 2692 18396 7568 8451 \r\n3 387 19670 7465 8452 \r\n3 3227 11256 19670 8452 \r\n3 1583 7465 11256 8452 \r\n3 1690 16258 19164 8453 \r\n3 2417 19671 16258 8453 \r\n3 1081 19164 19671 8453 \r\n3 4242 6950 9384 8454 \r\n3 4771 9174 6950 8454 \r\n3 1561 9384 9174 8454 \r\n3 3956 10910 19672 8455 \r\n3 3855 5926 10910 8455 \r\n3 2118 19672 5926 8455 \r\n3 955 7525 17556 8456 \r\n3 1054 13027 7525 8456 \r\n3 2609 17556 13027 8456 \r\n3 487 19586 19636 8457 \r\n3 4277 19131 19586 8457 \r\n3 2997 19636 19131 8457 \r\n3 2983 14030 14717 8458 \r\n3 1632 10767 14030 8458 \r\n3 2528 14717 10767 8458 \r\n3 3156 10494 19673 8459 \r\n3 640 14464 10494 8459 \r\n3 1693 19673 14464 8459 \r\n3 4951 15765 18880 8460 \r\n3 2059 9419 15765 8460 \r\n3 671 18880 9419 8460 \r\n3 1938 9431 17091 8461 \r\n3 1056 6932 9431 8461 \r\n3 4493 17091 6932 8461 \r\n3 2590 19674 14709 8462 \r\n3 190 12812 19674 8462 \r\n3 184 14709 12812 8462 \r\n3 606 5289 19675 8463 \r\n3 3095 9516 5289 8463 \r\n3 1212 19675 9516 8463 \r\n3 2574 17996 19676 8464 \r\n3 2320 11769 17996 8464 \r\n3 1330 19676 11769 8464 \r\n3 213 15325 13088 8465 \r\n3 1952 19677 15325 8465 \r\n3 3642 13088 19677 8465 \r\n3 4846 9523 18609 8466 \r\n3 1646 17871 9523 8466 \r\n3 4944 18609 17871 8466 \r\n3 4724 18870 16857 8467 \r\n3 2400 19560 18870 8467 \r\n3 1587 16857 19560 8467 \r\n3 1544 19678 16068 8468 \r\n3 3239 9770 19678 8468 \r\n3 461 16068 9770 8468 \r\n3 3805 17493 19679 8469 \r\n3 4468 19598 17493 8469 \r\n3 1274 19679 19598 8469 \r\n3 674 7090 19681 8470 \r\n3 3303 19680 7090 8470 \r\n3 481 19681 19680 8470 \r\n3 4595 17841 10516 8471 \r\n3 2707 19619 17841 8471 \r\n3 192 10516 19619 8471 \r\n3 3544 5613 11255 8472 \r\n3 707 14652 5613 8472 \r\n3 1583 11255 14652 8472 \r\n3 2764 10053 19682 8473 \r\n3 1186 19270 10053 8473 \r\n3 4142 19682 19270 8473 \r\n3 767 17326 19683 8474 \r\n3 2914 15370 17326 8474 \r\n3 2616 19683 15370 8474 \r\n3 4530 19194 14052 8475 \r\n3 216 12306 19194 8475 \r\n3 3326 14052 12306 8475 \r\n3 4100 18454 10182 8476 \r\n3 1009 19684 18454 8476 \r\n3 4271 10182 19684 8476 \r\n3 319 14793 14422 8477 \r\n3 2113 8857 14793 8477 \r\n3 3286 14422 8857 8477 \r\n3 2938 15501 19243 8478 \r\n3 3616 16107 15501 8478 \r\n3 1608 19243 16107 8478 \r\n3 1959 19438 15390 8479 \r\n3 418 11984 19438 8479 \r\n3 1835 15390 11984 8479 \r\n3 2071 19089 18070 8480 \r\n3 2095 13447 19089 8480 \r\n3 1909 18070 13447 8480 \r\n3 2408 16881 14299 8481 \r\n3 2205 19685 16881 8481 \r\n3 3082 14299 19685 8481 \r\n3 182 9522 14731 8482 \r\n3 4492 7213 9522 8482 \r\n3 522 14731 7213 8482 \r\n3 4451 10808 12759 8483 \r\n3 1822 10368 10808 8483 \r\n3 338 12759 10368 8483 \r\n3 237 15464 18819 8484 \r\n3 3060 5338 15464 8484 \r\n3 1637 18819 5338 8484 \r\n3 321 19687 8931 8485 \r\n3 112 19686 19687 8485 \r\n3 1240 8931 19686 8485 \r\n3 4264 5690 6876 8486 \r\n3 2562 15513 5690 8486 \r\n3 2233 6876 15513 8486 \r\n3 4504 19065 18877 8487 \r\n3 885 16806 19065 8487 \r\n3 959 18877 16806 8487 \r\n3 2884 15541 16810 8488 \r\n3 4551 19688 15541 8488 \r\n3 474 16810 19688 8488 \r\n3 1472 19293 16229 8489 \r\n3 2928 14608 19293 8489 \r\n3 4290 16229 14608 8489 \r\n3 763 18156 18893 8490 \r\n3 4199 8377 18156 8490 \r\n3 3640 18893 8377 8490 \r\n3 1401 16866 5399 8491 \r\n3 1937 18636 16866 8491 \r\n3 1130 5399 18636 8491 \r\n3 1021 6232 16834 8492 \r\n3 4949 19689 6232 8492 \r\n3 0 16834 19689 8492 \r\n3 3183 19330 11088 8493 \r\n3 4847 18552 19330 8493 \r\n3 4570 11088 18552 8493 \r\n3 4383 18517 13233 8494 \r\n3 2589 13760 18517 8494 \r\n3 1885 13233 13760 8494 \r\n3 2342 19507 11513 8495 \r\n3 2662 8083 19507 8495 \r\n3 4431 11513 8083 8495 \r\n3 1846 15676 19690 8496 \r\n3 2055 19653 15676 8496 \r\n3 2184 19690 19653 8496 \r\n3 2553 17689 16386 8497 \r\n3 2062 11184 17689 8497 \r\n3 3408 16386 11184 8497 \r\n3 2277 16926 19691 8498 \r\n3 271 17349 16926 8498 \r\n3 1566 19691 17349 8498 \r\n3 151 5401 14890 8499 \r\n3 621 10540 5401 8499 \r\n3 993 14890 10540 8499 \r\n3 195 19387 17046 8500 \r\n3 549 12241 19387 8500 \r\n3 551 17046 12241 8500 \r\n3 2133 19692 7347 8501 \r\n3 3215 10394 19692 8501 \r\n3 3825 7347 10394 8501 \r\n3 3294 15305 14613 8502 \r\n3 3679 7078 15305 8502 \r\n3 2702 14613 7078 8502 \r\n3 3880 17956 19693 8503 \r\n3 4505 17433 17956 8503 \r\n3 1627 19693 17433 8503 \r\n3 3847 7173 9312 8504 \r\n3 1159 16564 7173 8504 \r\n3 2397 9312 16564 8504 \r\n3 1064 15890 9938 8505 \r\n3 4210 19050 15890 8505 \r\n3 3762 9938 19050 8505 \r\n3 3732 8900 15347 8506 \r\n3 871 16562 8900 8506 \r\n3 2092 15347 16562 8506 \r\n3 3086 18587 17877 8507 \r\n3 119 8579 18587 8507 \r\n3 3055 17877 8579 8507 \r\n3 1737 13968 17073 8508 \r\n3 1900 9055 13968 8508 \r\n3 4223 17073 9055 8508 \r\n3 3490 5327 10426 8509 \r\n3 587 17477 5327 8509 \r\n3 123 10426 17477 8509 \r\n3 3667 15168 14175 8510 \r\n3 2814 19204 15168 8510 \r\n3 2390 14175 19204 8510 \r\n3 1224 17210 19181 8511 \r\n3 494 14170 17210 8511 \r\n3 1396 19181 14170 8511 \r\n3 566 13506 16208 8512 \r\n3 390 13728 13506 8512 \r\n3 442 16208 13728 8512 \r\n3 1631 17843 19694 8513 \r\n3 1586 16054 17843 8513 \r\n3 1957 19694 16054 8513 \r\n3 3080 18285 19695 8514 \r\n3 3234 18764 18285 8514 \r\n3 510 19695 18764 8514 \r\n3 2837 19696 19114 8515 \r\n3 1363 10956 19696 8515 \r\n3 3024 19114 10956 8515 \r\n3 4076 19638 6680 8516 \r\n3 4655 17384 19638 8516 \r\n3 4305 6680 17384 8516 \r\n3 771 19632 19647 8517 \r\n3 807 19697 19632 8517 \r\n3 3494 19647 19697 8517 \r\n3 605 12022 19564 8518 \r\n3 3422 11434 12022 8518 \r\n3 3350 19564 11434 8518 \r\n3 1046 14914 19698 8519 \r\n3 4158 16140 14914 8519 \r\n3 3365 19698 16140 8519 \r\n3 4294 14605 15268 8520 \r\n3 109 19699 14605 8520 \r\n3 1412 15268 19699 8520 \r\n3 413 13521 9026 8521 \r\n3 3423 19700 13521 8521 \r\n3 4998 9026 19700 8521 \r\n3 1832 11493 18408 8522 \r\n3 3091 6363 11493 8522 \r\n3 1584 18408 6363 8522 \r\n3 2119 14870 15998 8523 \r\n3 4872 19077 14870 8523 \r\n3 131 15998 19077 8523 \r\n3 4312 19702 13065 8524 \r\n3 1645 19701 19702 8524 \r\n3 3607 13065 19701 8524 \r\n3 2122 19158 8118 8525 \r\n3 1514 14906 19158 8525 \r\n3 927 8118 14906 8525 \r\n3 2814 19017 11838 8526 \r\n3 2538 19658 19017 8526 \r\n3 1589 11838 19658 8526 \r\n3 2638 8525 18478 8527 \r\n3 2689 19535 8525 8527 \r\n3 3207 18478 19535 8527 \r\n3 1575 17112 10869 8528 \r\n3 1508 8417 17112 8528 \r\n3 1864 10869 8417 8528 \r\n3 990 19704 19703 8529 \r\n3 4066 16685 19704 8529 \r\n3 645 19703 16685 8529 \r\n3 3471 6835 16820 8530 \r\n3 3248 14310 6835 8530 \r\n3 270 16820 14310 8530 \r\n3 694 9381 17678 8531 \r\n3 387 7464 9381 8531 \r\n3 1596 17678 7464 8531 \r\n3 881 16265 10890 8532 \r\n3 3884 19533 16265 8532 \r\n3 2227 10890 19533 8532 \r\n3 1865 14216 8311 8533 \r\n3 2029 19288 14216 8533 \r\n3 1049 8311 19288 8533 \r\n3 3953 12684 9647 8534 \r\n3 3260 18461 12684 8534 \r\n3 4709 9647 18461 8534 \r\n3 4133 14975 15957 8535 \r\n3 3642 7600 14975 8535 \r\n3 4324 15957 7600 8535 \r\n3 4127 19097 15581 8536 \r\n3 4409 10091 19097 8536 \r\n3 3356 15581 10091 8536 \r\n3 1188 15680 18309 8537 \r\n3 3804 8234 15680 8537 \r\n3 2885 18309 8234 8537 \r\n3 2915 19705 8854 8538 \r\n3 3054 18919 19705 8538 \r\n3 2879 8854 18919 8538 \r\n3 2065 13979 16522 8539 \r\n3 4684 9581 13979 8539 \r\n3 849 16522 9581 8539 \r\n3 459 6539 7181 8540 \r\n3 3566 15824 6539 8540 \r\n3 2140 7181 15824 8540 \r\n3 934 19461 11034 8541 \r\n3 1448 10502 19461 8541 \r\n3 2622 11034 10502 8541 \r\n3 3431 9939 19706 8542 \r\n3 3686 18462 9939 8542 \r\n3 4385 19706 18462 8542 \r\n3 3235 19707 15588 8543 \r\n3 845 18707 19707 8543 \r\n3 1478 15588 18707 8543 \r\n3 3856 17801 16099 8544 \r\n3 945 19708 17801 8544 \r\n3 755 16099 19708 8544 \r\n3 2785 15740 19366 8545 \r\n3 3161 18322 15740 8545 \r\n3 1854 19366 18322 8545 \r\n3 3339 5385 13622 8546 \r\n3 1604 17598 5385 8546 \r\n3 3816 13622 17598 8546 \r\n3 268 18816 19709 8547 \r\n3 4652 11375 18816 8547 \r\n3 1284 19709 11375 8547 \r\n3 3173 19710 15927 8548 \r\n3 808 12724 19710 8548 \r\n3 2556 15927 12724 8548 \r\n3 1249 17171 19191 8549 \r\n3 4550 19460 17171 8549 \r\n3 1155 19191 19460 8549 \r\n3 4511 16743 14775 8550 \r\n3 940 13658 16743 8550 \r\n3 2959 14775 13658 8550 \r\n3 1128 11466 12084 8551 \r\n3 4602 18672 11466 8551 \r\n3 2890 12084 18672 8551 \r\n3 1489 18007 13552 8552 \r\n3 2185 12778 18007 8552 \r\n3 3242 13552 12778 8552 \r\n3 4956 10578 15343 8553 \r\n3 1884 18061 10578 8553 \r\n3 1725 15343 18061 8553 \r\n3 2583 18505 16109 8554 \r\n3 4829 18938 18505 8554 \r\n3 1175 16109 18938 8554 \r\n3 3441 17799 8801 8555 \r\n3 2339 8308 17799 8555 \r\n3 2191 8801 8308 8555 \r\n3 1564 14878 14261 8556 \r\n3 1953 13270 14878 8556 \r\n3 1276 14261 13270 8556 \r\n3 990 19703 19711 8557 \r\n3 645 9826 19703 8557 \r\n3 1718 19711 9826 8557 \r\n3 2681 17568 10887 8558 \r\n3 4449 15471 17568 8558 \r\n3 3133 10887 15471 8558 \r\n3 1707 16864 10649 8559 \r\n3 1549 13470 16864 8559 \r\n3 2136 10649 13470 8559 \r\n3 3371 19713 19217 8560 \r\n3 489 19712 19713 8560 \r\n3 2368 19217 19712 8560 \r\n3 173 14116 19487 8561 \r\n3 395 15684 14116 8561 \r\n3 3433 19487 15684 8561 \r\n3 1554 8396 14307 8562 \r\n3 1052 17272 8396 8562 \r\n3 1799 14307 17272 8562 \r\n3 1575 12909 15882 8563 \r\n3 345 17097 12909 8563 \r\n3 4543 15882 17097 8563 \r\n3 2775 6049 15816 8564 \r\n3 59 13582 6049 8564 \r\n3 4285 15816 13582 8564 \r\n3 2330 18712 19714 8565 \r\n3 1485 13642 18712 8565 \r\n3 1318 19714 13642 8565 \r\n3 4026 17897 15008 8566 \r\n3 1220 15055 17897 8566 \r\n3 1689 15008 15055 8566 \r\n3 3402 18191 16782 8567 \r\n3 1638 19318 18191 8567 \r\n3 2943 16782 19318 8567 \r\n3 4371 18633 19426 8568 \r\n3 3535 19127 18633 8568 \r\n3 2229 19426 19127 8568 \r\n3 2042 11783 18683 8569 \r\n3 3894 18778 11783 8569 \r\n3 2910 18683 18778 8569 \r\n3 4104 12730 15251 8570 \r\n3 2525 5607 12730 8570 \r\n3 2192 15251 5607 8570 \r\n3 4924 5152 7126 8571 \r\n3 3600 10625 5152 8571 \r\n3 1259 7126 10625 8571 \r\n3 4187 11006 17883 8572 \r\n3 4560 13930 11006 8572 \r\n3 3072 17883 13930 8572 \r\n3 1525 19715 15391 8573 \r\n3 3131 10035 19715 8573 \r\n3 3373 15391 10035 8573 \r\n3 4826 16168 6015 8574 \r\n3 1172 6985 16168 8574 \r\n3 4815 6015 6985 8574 \r\n3 1807 18899 14829 8575 \r\n3 2081 18332 18899 8575 \r\n3 3089 14829 18332 8575 \r\n3 3969 10171 12911 8576 \r\n3 2594 13535 10171 8576 \r\n3 3244 12911 13535 8576 \r\n3 2184 19652 10129 8577 \r\n3 2221 10747 19652 8577 \r\n3 357 10129 10747 8577 \r\n3 3821 11127 19716 8578 \r\n3 3679 15306 11127 8578 \r\n3 4909 19716 15306 8578 \r\n3 4384 13686 9951 8579 \r\n3 3525 19717 13686 8579 \r\n3 4813 9951 19717 8579 \r\n3 2360 17651 9564 8580 \r\n3 3557 14304 17651 8580 \r\n3 362 9564 14304 8580 \r\n3 3356 17114 15582 8581 \r\n3 3123 19329 17114 8581 \r\n3 3360 15582 19329 8581 \r\n3 3799 19718 15420 8582 \r\n3 4622 18196 19718 8582 \r\n3 636 15420 18196 8582 \r\n3 1177 8027 19719 8583 \r\n3 3693 8952 8027 8583 \r\n3 2773 19719 8952 8583 \r\n3 1196 13713 12885 8584 \r\n3 3412 16591 13713 8584 \r\n3 4525 12885 16591 8584 \r\n3 2997 8539 19635 8585 \r\n3 1754 5415 8539 8585 \r\n3 708 19635 5415 8585 \r\n3 2950 19104 18057 8586 \r\n3 2513 9663 19104 8586 \r\n3 2868 18057 9663 8586 \r\n3 2696 6361 14824 8587 \r\n3 1605 14560 6361 8587 \r\n3 1598 14824 14560 8587 \r\n3 2661 19286 19341 8588 \r\n3 1930 18934 19286 8588 \r\n3 4592 19341 18934 8588 \r\n3 409 18897 12603 8589 \r\n3 3018 10286 18897 8589 \r\n3 783 12603 10286 8589 \r\n3 4365 19720 14581 8590 \r\n3 3013 9538 19720 8590 \r\n3 3792 14581 9538 8590 \r\n3 1926 15076 15104 8591 \r\n3 4970 12115 15076 8591 \r\n3 1118 15104 12115 8591 \r\n3 3891 17644 7218 8592 \r\n3 3090 19721 17644 8592 \r\n3 241 7218 19721 8592 \r\n3 4185 11534 17931 8593 \r\n3 18 17439 11534 8593 \r\n3 4860 17931 17439 8593 \r\n3 4828 19722 8841 8594 \r\n3 4171 16915 19722 8594 \r\n3 4607 8841 16915 8594 \r\n3 3485 19424 5561 8595 \r\n3 199 19723 19424 8595 \r\n3 4348 5561 19723 8595 \r\n3 4801 15084 10937 8596 \r\n3 2239 8148 15084 8596 \r\n3 1771 10937 8148 8596 \r\n3 1740 17643 9068 8597 \r\n3 1244 14106 17643 8597 \r\n3 2442 9068 14106 8597 \r\n3 4835 11390 19724 8598 \r\n3 2561 7655 11390 8598 \r\n3 1110 19724 7655 8598 \r\n3 2700 16828 17509 8599 \r\n3 1278 8743 16828 8599 \r\n3 3630 17509 8743 8599 \r\n3 4816 5298 19462 8600 \r\n3 4162 16787 5298 8600 \r\n3 3707 19462 16787 8600 \r\n3 4886 5250 8000 8601 \r\n3 3409 17998 5250 8601 \r\n3 497 8000 17998 8601 \r\n3 1046 19698 18025 8602 \r\n3 3365 16498 19698 8602 \r\n3 3447 18025 16498 8602 \r\n3 1767 19725 9254 8603 \r\n3 2504 16253 19725 8603 \r\n3 3493 9254 16253 8603 \r\n3 113 10517 18272 8604 \r\n3 192 19620 10517 8604 \r\n3 3796 18272 19620 8604 \r\n3 4164 5043 5640 8605 \r\n3 3192 19285 5043 8605 \r\n3 995 5640 19285 8605 \r\n3 1567 13740 19098 8606 \r\n3 9 7560 13740 8606 \r\n3 3019 19098 7560 8606 \r\n3 2939 17979 6924 8607 \r\n3 3510 6930 17979 8607 \r\n3 1056 6924 6930 8607 \r\n3 4370 7063 19456 8608 \r\n3 3020 19726 7063 8608 \r\n3 4918 19456 19726 8608 \r\n3 3547 18809 18546 8609 \r\n3 4397 19727 18809 8609 \r\n3 2084 18546 19727 8609 \r\n3 4353 19579 9530 8610 \r\n3 2566 5678 19579 8610 \r\n3 4297 9530 5678 8610 \r\n3 2253 11056 14620 8611 \r\n3 1205 7274 11056 8611 \r\n3 1379 14620 7274 8611 \r\n3 4608 15276 15822 8612 \r\n3 4458 13344 15276 8612 \r\n3 563 15822 13344 8612 \r\n3 1395 13236 10149 8613 \r\n3 2103 15861 13236 8613 \r\n3 877 10149 15861 8613 \r\n3 4798 10686 19728 8614 \r\n3 1452 10391 10686 8614 \r\n3 3698 19728 10391 8614 \r\n3 1028 14655 18436 8615 \r\n3 2848 5203 14655 8615 \r\n3 3518 18436 5203 8615 \r\n3 4554 7697 11847 8616 \r\n3 3209 8849 7697 8616 \r\n3 4976 11847 8849 8616 \r\n3 1330 13767 9737 8617 \r\n3 4487 7978 13767 8617 \r\n3 3347 9737 7978 8617 \r\n3 3497 18218 19729 8618 \r\n3 3439 19668 18218 8618 \r\n3 2971 19729 19668 8618 \r\n3 2124 17121 14535 8619 \r\n3 4704 19730 17121 8619 \r\n3 84 14535 19730 8619 \r\n3 4549 6762 13305 8620 \r\n3 377 13492 6762 8620 \r\n3 1214 13305 13492 8620 \r\n3 3145 13427 15132 8621 \r\n3 1295 17057 13427 8621 \r\n3 4624 15132 17057 8621 \r\n3 3842 5033 19071 8622 \r\n3 4964 15864 5033 8622 \r\n3 2744 19071 15864 8622 \r\n3 1191 19275 19731 8623 \r\n3 3599 17511 19275 8623 \r\n3 3117 19731 17511 8623 \r\n3 2372 19408 19732 8624 \r\n3 4380 10307 19408 8624 \r\n3 814 19732 10307 8624 \r\n3 3761 17967 13665 8625 \r\n3 3058 18382 17967 8625 \r\n3 2555 13665 18382 8625 \r\n3 1778 10506 18928 8626 \r\n3 627 18005 10506 8626 \r\n3 2411 18928 18005 8626 \r\n3 1849 18929 19733 8627 \r\n3 4678 5913 18929 8627 \r\n3 3469 19733 5913 8627 \r\n3 1073 9652 18887 8628 \r\n3 4611 19734 9652 8628 \r\n3 1499 18887 19734 8628 \r\n3 4640 10336 8050 8629 \r\n3 4870 19283 10336 8629 \r\n3 2392 8050 19283 8629 \r\n3 3612 8375 17250 8630 \r\n3 251 18508 8375 8630 \r\n3 4486 17250 18508 8630 \r\n3 295 19607 16845 8631 \r\n3 1671 19735 19607 8631 \r\n3 2679 16845 19735 8631 \r\n3 4237 15497 5517 8632 \r\n3 3019 7559 15497 8632 \r\n3 2011 5517 7559 8632 \r\n3 2541 11699 14750 8633 \r\n3 4606 19736 11699 8633 \r\n3 232 14750 19736 8633 \r\n3 4185 19437 11532 8634 \r\n3 4129 12286 19437 8634 \r\n3 1201 11532 12286 8634 \r\n3 914 14047 19737 8635 \r\n3 2416 16695 14047 8635 \r\n3 2089 19737 16695 8635 \r\n3 1739 17983 16661 8636 \r\n3 3631 5859 17983 8636 \r\n3 1306 16661 5859 8636 \r\n3 1167 17202 14418 8637 \r\n3 3212 11820 17202 8637 \r\n3 955 14418 11820 8637 \r\n3 1521 15928 17778 8638 \r\n3 583 19254 15928 8638 \r\n3 4134 17778 19254 8638 \r\n3 377 6761 13493 8639 \r\n3 2545 5046 6761 8639 \r\n3 3341 13493 5046 8639 \r\n3 4147 15091 14323 8640 \r\n3 884 12577 15091 8640 \r\n3 4295 14323 12577 8640 \r\n3 197 8254 19399 8641 \r\n3 2650 15538 8254 8641 \r\n3 4983 19399 15538 8641 \r\n3 552 19738 14711 8642 \r\n3 3432 7531 19738 8642 \r\n3 4685 14711 7531 8642 \r\n3 3998 18620 12394 8643 \r\n3 3161 15739 18620 8643 \r\n3 518 12394 15739 8643 \r\n3 4152 10695 14366 8644 \r\n3 685 5099 10695 8644 \r\n3 273 14366 5099 8644 \r\n3 3861 17866 14485 8645 \r\n3 1179 16785 17866 8645 \r\n3 1983 14485 16785 8645 \r\n3 2550 14724 19739 8646 \r\n3 3285 6022 14724 8646 \r\n3 397 19739 6022 8646 \r\n3 1988 19666 8200 8647 \r\n3 2430 16346 19666 8647 \r\n3 2331 8200 16346 8647 \r\n3 4902 19740 10590 8648 \r\n3 2827 9658 19740 8648 \r\n3 4093 10590 9658 8648 \r\n3 3921 19383 16339 8649 \r\n3 1729 17422 19383 8649 \r\n3 4027 16339 17422 8649 \r\n3 4835 19724 17762 8650 \r\n3 1110 5726 19724 8650 \r\n3 445 17762 5726 8650 \r\n3 1920 19511 14566 8651 \r\n3 391 16245 19511 8651 \r\n3 4764 14566 16245 8651 \r\n3 3008 19334 16843 8652 \r\n3 4130 19663 19334 8652 \r\n3 4679 16843 19663 8652 \r\n3 1581 9061 8531 8653 \r\n3 563 13343 9061 8653 \r\n3 3420 8531 13343 8653 \r\n3 4549 13339 6760 8654 \r\n3 1443 9924 13339 8654 \r\n3 2545 6760 9924 8654 \r\n3 940 11273 13659 8655 \r\n3 2608 18619 11273 8655 \r\n3 2189 13659 18619 8655 \r\n3 3265 12048 19741 8656 \r\n3 4059 16961 12048 8656 \r\n3 3672 19741 16961 8656 \r\n3 4994 5047 19742 8657 \r\n3 3654 18375 5047 8657 \r\n3 757 19742 18375 8657 \r\n3 3800 7710 19743 8658 \r\n3 4103 12882 7710 8658 \r\n3 15 19743 12882 8658 \r\n3 2101 18097 5631 8659 \r\n3 4286 19444 18097 8659 \r\n3 1505 5631 19444 8659 \r\n3 229 17340 16034 8660 \r\n3 4017 19744 17340 8660 \r\n3 2960 16034 19744 8660 \r\n3 4801 19085 7070 8661 \r\n3 2438 14475 19085 8661 \r\n3 4209 7070 14475 8661 \r\n3 1658 17149 18142 8662 \r\n3 3292 16819 17149 8662 \r\n3 270 18142 16819 8662 \r\n3 1546 19133 9426 8663 \r\n3 1719 18256 19133 8663 \r\n3 3410 9426 18256 8663 \r\n3 3970 19616 15717 8664 \r\n3 1005 6538 19616 8664 \r\n3 4721 15717 6538 8664 \r\n3 4666 5225 18628 8665 \r\n3 882 16839 5225 8665 \r\n3 931 18628 16839 8665 \r\n3 3810 17246 19401 8666 \r\n3 3081 18051 17246 8666 \r\n3 4152 19401 18051 8666 \r\n3 3335 8935 7077 8667 \r\n3 2353 7571 8935 8667 \r\n3 2797 7077 7571 8667 \r\n3 4539 8191 7365 8668 \r\n3 734 19045 8191 8668 \r\n3 3910 7365 19045 8668 \r\n3 3105 9764 17354 8669 \r\n3 2853 9460 9764 8669 \r\n3 419 17354 9460 8669 \r\n3 2129 19496 12338 8670 \r\n3 3905 17186 19496 8670 \r\n3 3833 12338 17186 8670 \r\n3 702 13021 9351 8671 \r\n3 2340 10563 13021 8671 \r\n3 4258 9351 10563 8671 \r\n3 716 12619 7403 8672 \r\n3 962 7322 12619 8672 \r\n3 57 7403 7322 8672 \r\n3 1391 19489 12036 8673 \r\n3 3242 12777 19489 8673 \r\n3 72 12036 12777 8673 \r\n3 1156 7483 18145 8674 \r\n3 4939 9698 7483 8674 \r\n3 661 18145 9698 8674 \r\n3 4845 17719 17836 8675 \r\n3 2399 19745 17719 8675 \r\n3 1896 17836 19745 8675 \r\n3 440 17357 17647 8676 \r\n3 2859 19140 17357 8676 \r\n3 3386 17647 19140 8676 \r\n3 4047 11842 18761 8677 \r\n3 2931 16803 11842 8677 \r\n3 2194 18761 16803 8677 \r\n3 373 8956 15258 8678 \r\n3 3692 18937 8956 8678 \r\n3 4996 15258 18937 8678 \r\n3 1655 19434 11673 8679 \r\n3 3832 6393 19434 8679 \r\n3 2265 11673 6393 8679 \r\n3 63 8825 18963 8680 \r\n3 491 10850 8825 8680 \r\n3 864 18963 10850 8680 \r\n3 2583 10536 18504 8681 \r\n3 92 16318 10536 8681 \r\n3 4702 18504 16318 8681 \r\n3 3623 15245 14369 8682 \r\n3 16 19631 15245 8682 \r\n3 2691 14369 19631 8682 \r\n3 2348 11903 18379 8683 \r\n3 1089 18383 11903 8683 \r\n3 4842 18379 18383 8683 \r\n3 3474 15241 14392 8684 \r\n3 3656 9180 15241 8684 \r\n3 2054 14392 9180 8684 \r\n3 1990 6788 19273 8685 \r\n3 1700 17682 6788 8685 \r\n3 2348 19273 17682 8685 \r\n3 2675 18603 18783 8686 \r\n3 4853 19161 18603 8686 \r\n3 2252 18783 19161 8686 \r\n3 957 12874 13613 8687 \r\n3 3400 11406 12874 8687 \r\n3 1467 13613 11406 8687 \r\n3 1289 19588 19414 8688 \r\n3 3817 8197 19588 8688 \r\n3 4942 19414 8197 8688 \r\n3 2291 19662 18220 8689 \r\n3 3979 15745 19662 8689 \r\n3 3815 18220 15745 8689 \r\n3 2109 16700 16741 8690 \r\n3 3932 10660 16700 8690 \r\n3 650 16741 10660 8690 \r\n3 4207 19746 10025 8691 \r\n3 92 10538 19746 8691 \r\n3 2391 10025 10538 8691 \r\n3 2661 19342 15197 8692 \r\n3 460 16053 19342 8692 \r\n3 4361 15197 16053 8692 \r\n3 4329 19747 18428 8693 \r\n3 1147 18075 19747 8693 \r\n3 921 18428 18075 8693 \r\n3 4525 16590 15525 8694 \r\n3 3736 19748 16590 8694 \r\n3 2551 15525 19748 8694 \r\n3 4052 11213 6785 8695 \r\n3 4484 19749 11213 8695 \r\n3 3457 6785 19749 8695 \r\n3 2103 17325 7625 8696 \r\n3 804 19459 17325 8696 \r\n3 1965 7625 19459 8696 \r\n3 2607 5080 15406 8697 \r\n3 1954 6810 5080 8697 \r\n3 2458 15406 6810 8697 \r\n3 2736 19750 15924 8698 \r\n3 4604 17899 19750 8698 \r\n3 2068 15924 17899 8698 \r\n3 920 5675 17727 8699 \r\n3 4978 19751 5675 8699 \r\n3 431 17727 19751 8699 \r\n3 4982 5773 12586 8700 \r\n3 3238 19250 5773 8700 \r\n3 3579 12586 19250 8700 \r\n3 187 19199 19395 8701 \r\n3 3388 6093 19199 8701 \r\n3 1878 19395 6093 8701 \r\n3 4409 19106 10092 8702 \r\n3 1631 19752 19106 8702 \r\n3 4980 10092 19752 8702 \r\n3 2492 17074 19753 8703 \r\n3 55 10411 17074 8703 \r\n3 1352 19753 10411 8703 \r\n3 383 6475 19754 8704 \r\n3 2125 5617 6475 8704 \r\n3 1050 19754 5617 8704 \r\n3 3114 18243 16932 8705 \r\n3 4894 17358 18243 8705 \r\n3 2254 16932 17358 8705 \r\n3 1590 8473 8378 8706 \r\n3 1372 17825 8473 8706 \r\n3 801 8378 17825 8706 \r\n3 4952 19756 7617 8707 \r\n3 1231 19755 19756 8707 \r\n3 1536 7617 19755 8707 \r\n3 2512 11815 13632 8708 \r\n3 3155 18833 11815 8708 \r\n3 2951 13632 18833 8708 \r\n3 3690 15450 18854 8709 \r\n3 4477 9808 15450 8709 \r\n3 4524 18854 9808 8709 \r\n3 2295 6493 19236 8710 \r\n3 2733 12101 6493 8710 \r\n3 226 19236 12101 8710 \r\n3 3418 18699 14318 8711 \r\n3 110 19364 18699 8711 \r\n3 609 14318 19364 8711 \r\n3 4355 19757 14611 8712 \r\n3 4339 18999 19757 8712 \r\n3 60 14611 18999 8712 \r\n3 92 19746 7093 8713 \r\n3 4207 12107 19746 8713 \r\n3 1450 7093 12107 8713 \r\n3 1088 6275 12495 8714 \r\n3 3567 16150 6275 8714 \r\n3 679 12495 16150 8714 \r\n3 4683 18991 9318 8715 \r\n3 933 6143 18991 8715 \r\n3 101 9318 6143 8715 \r\n3 3541 16311 16640 8716 \r\n3 729 12840 16311 8716 \r\n3 411 16640 12840 8716 \r\n3 4811 19758 16953 8717 \r\n3 3818 18137 19758 8717 \r\n3 3332 16953 18137 8717 \r\n3 476 14978 19247 8718 \r\n3 1863 19346 14978 8718 \r\n3 3609 19247 19346 8718 \r\n3 4854 19466 17501 8719 \r\n3 3528 13832 19466 8719 \r\n3 2835 17501 13832 8719 \r\n3 3156 19673 18292 8720 \r\n3 1693 18787 19673 8720 \r\n3 3483 18292 18787 8720 \r\n3 1815 19759 18842 8721 \r\n3 3618 19566 19759 8721 \r\n3 4178 18842 19566 8721 \r\n3 5001 18830 16407 8722 \r\n3 4881 14118 18830 8722 \r\n3 973 16407 14118 8722 \r\n3 790 17595 12145 8723 \r\n3 3896 18398 17595 8723 \r\n3 388 12145 18398 8723 \r\n3 4917 14522 9922 8724 \r\n3 584 15297 14522 8724 \r\n3 118 9922 15297 8724 \r\n3 1075 13936 11553 8725 \r\n3 284 19760 13936 8725 \r\n3 4917 11553 19760 8725 \r\n3 2801 19218 12055 8726 \r\n3 452 14667 19218 8726 \r\n3 171 12055 14667 8726 \r\n3 1358 7376 5074 8727 \r\n3 2564 16487 7376 8727 \r\n3 83 5074 16487 8727 \r\n3 1953 6297 13268 8728 \r\n3 3396 18907 6297 8728 \r\n3 2527 13268 18907 8728 \r\n3 4808 7588 9824 8729 \r\n3 2910 19761 7588 8729 \r\n3 2309 9824 19761 8729 \r\n3 1772 19762 8302 8730 \r\n3 1525 16950 19762 8730 \r\n3 4398 8302 16950 8730 \r\n3 1690 18800 16256 8731 \r\n3 662 19385 18800 8731 \r\n3 3712 16256 19385 8731 \r\n3 668 9114 19763 8732 \r\n3 782 13605 9114 8732 \r\n3 1146 19763 13605 8732 \r\n3 1625 8782 17749 8733 \r\n3 3689 18904 8782 8733 \r\n3 345 17749 18904 8733 \r\n3 953 17092 19492 8734 \r\n3 4493 14860 17092 8734 \r\n3 2652 19492 14860 8734 \r\n3 3090 6630 19721 8735 \r\n3 3352 17356 6630 8735 \r\n3 241 19721 17356 8735 \r\n3 1731 15566 18866 8736 \r\n3 3578 8691 15566 8736 \r\n3 1198 18866 8691 8736 \r\n3 1645 11372 19701 8737 \r\n3 1905 18513 11372 8737 \r\n3 3607 19701 18513 8737 \r\n3 1462 16850 19596 8738 \r\n3 149 13602 16850 8738 \r\n3 3449 19596 13602 8738 \r\n3 239 11047 15617 8739 \r\n3 2960 19744 11047 8739 \r\n3 4017 15617 19744 8739 \r\n3 4757 8269 9725 8740 \r\n3 4108 18215 8269 8740 \r\n3 3231 9725 18215 8740 \r\n3 3874 10185 19274 8741 \r\n3 660 5213 10185 8741 \r\n3 122 19274 5213 8741 \r\n3 3790 14113 12357 8742 \r\n3 4238 11618 14113 8742 \r\n3 3957 12357 11618 8742 \r\n3 4537 12454 16816 8743 \r\n3 1532 18581 12454 8743 \r\n3 4940 16816 18581 8743 \r\n3 1714 18475 6487 8744 \r\n3 3198 10199 18475 8744 \r\n3 2903 6487 10199 8744 \r\n3 2599 12475 16648 8745 \r\n3 85 10743 12475 8745 \r\n3 3067 16648 10743 8745 \r\n3 4222 13018 18804 8746 \r\n3 4883 17151 13018 8746 \r\n3 1782 18804 17151 8746 \r\n3 1788 19467 19053 8747 \r\n3 3901 19552 19467 8747 \r\n3 886 19053 19552 8747 \r\n3 2764 19682 16320 8748 \r\n3 4142 12112 19682 8748 \r\n3 2432 16320 12112 8748 \r\n3 2663 13610 18014 8749 \r\n3 3124 19427 13610 8749 \r\n3 1476 18014 19427 8749 \r\n3 4913 19764 17009 8750 \r\n3 3831 15249 19764 8750 \r\n3 4089 17009 15249 8750 \r\n3 1600 18189 6772 8751 \r\n3 610 18362 18189 8751 \r\n3 1609 6772 18362 8751 \r\n3 3852 9494 16769 8752 \r\n3 1933 19765 9494 8752 \r\n3 975 16769 19765 8752 \r\n3 12 11074 17263 8753 \r\n3 2287 11437 11074 8753 \r\n3 1402 17263 11437 8753 \r\n3 3423 19599 19700 8754 \r\n3 4630 12154 19599 8754 \r\n3 4998 19700 12154 8754 \r\n3 2153 11692 9527 8755 \r\n3 2690 19448 11692 8755 \r\n3 3380 9527 19448 8755 \r\n3 3306 13413 19026 8756 \r\n3 3247 5637 13413 8756 \r\n3 4266 19026 5637 8756 \r\n3 4228 5844 17775 8757 \r\n3 4758 19766 5844 8757 \r\n3 1317 17775 19766 8757 \r\n3 554 6347 19767 8758 \r\n3 4119 13098 6347 8758 \r\n3 3140 19767 13098 8758 \r\n3 4997 9830 16406 8759 \r\n3 2542 6472 9830 8759 \r\n3 5001 16406 6472 8759 \r\n3 116 9372 6327 8760 \r\n3 3035 12622 9372 8760 \r\n3 450 6327 12622 8760 \r\n3 1628 19768 14028 8761 \r\n3 1112 12932 19768 8761 \r\n3 3506 14028 12932 8761 \r\n3 1139 19252 7707 8762 \r\n3 4517 7485 19252 8762 \r\n3 1512 7707 7485 8762 \r\n3 632 17707 6819 8763 \r\n3 777 19769 17707 8763 \r\n3 2282 6819 19769 8763 \r\n3 393 18676 18913 8764 \r\n3 2262 19477 18676 8764 \r\n3 2310 18913 19477 8764 \r\n3 273 5098 17459 8765 \r\n3 2286 18392 5098 8765 \r\n3 629 17459 18392 8765 \r\n3 2676 15374 16250 8766 \r\n3 2600 13246 15374 8766 \r\n3 2568 16250 13246 8766 \r\n3 2529 19771 19770 8767 \r\n3 1150 19618 19771 8767 \r\n3 2022 19770 19618 8767 \r\n3 2998 19772 15140 8768 \r\n3 2407 18549 19772 8768 \r\n3 4132 15140 18549 8768 \r\n3 504 16180 8828 8769 \r\n3 1218 19773 16180 8769 \r\n3 3328 8828 19773 8769 \r\n3 3983 12852 15449 8770 \r\n3 4421 5053 12852 8770 \r\n3 2876 15449 5053 8770 \r\n3 1976 19774 11163 8771 \r\n3 3555 17599 19774 8771 \r\n3 1604 11163 17599 8771 \r\n3 484 9813 16078 8772 \r\n3 595 17553 9813 8772 \r\n3 1193 16078 17553 8772 \r\n3 3539 5825 9149 8773 \r\n3 4548 16489 5825 8773 \r\n3 3097 9149 16489 8773 \r\n3 4303 11032 19775 8774 \r\n3 2321 18848 11032 8774 \r\n3 2303 19775 18848 8774 \r\n3 2250 14339 18212 8775 \r\n3 3795 8262 14339 8775 \r\n3 560 18212 8262 8775 \r\n3 65 19777 19776 8776 \r\n3 3258 19281 19777 8776 \r\n3 473 19776 19281 8776 \r\n3 534 18144 17086 8777 \r\n3 2942 5306 18144 8777 \r\n3 4333 17086 5306 8777 \r\n3 3995 19778 9580 8778 \r\n3 1881 11729 19778 8778 \r\n3 849 9580 11729 8778 \r\n3 1114 15850 15613 8779 \r\n3 4435 18933 15850 8779 \r\n3 196 15613 18933 8779 \r\n3 4012 7135 9376 8780 \r\n3 3805 19679 7135 8780 \r\n3 1274 9376 19679 8780 \r\n3 3941 15801 17624 8781 \r\n3 4737 13872 15801 8781 \r\n3 2511 17624 13872 8781 \r\n3 3560 16789 17141 8782 \r\n3 4531 15184 16789 8782 \r\n3 2260 17141 15184 8782 \r\n3 3201 19779 11539 8783 \r\n3 2389 10985 19779 8783 \r\n3 888 11539 10985 8783 \r\n3 1237 14578 16154 8784 \r\n3 694 19113 14578 8784 \r\n3 2782 16154 19113 8784 \r\n3 2198 10918 18843 8785 \r\n3 93 16310 10918 8785 \r\n3 1815 18843 16310 8785 \r\n3 3279 19780 16209 8786 \r\n3 2920 19536 19780 8786 \r\n3 1209 16209 19536 8786 \r\n3 2780 9023 15037 8787 \r\n3 4748 12569 9023 8787 \r\n3 1132 15037 12569 8787 \r\n3 4114 19781 9545 8788 \r\n3 800 19493 19781 8788 \r\n3 2818 9545 19493 8788 \r\n3 3279 18590 5947 8789 \r\n3 1440 11126 18590 8789 \r\n3 3821 5947 11126 8789 \r\n3 2553 19782 17690 8790 \r\n3 3039 6239 19782 8790 \r\n3 2342 17690 6239 8790 \r\n3 2713 7534 10593 8791 \r\n3 2772 18157 7534 8791 \r\n3 763 10593 18157 8791 \r\n3 3241 15800 9542 8792 \r\n3 2932 16371 15800 8792 \r\n3 2187 9542 16371 8792 \r\n3 1896 19745 12849 8793 \r\n3 2399 19783 19745 8793 \r\n3 843 12849 19783 8793 \r\n3 3779 19468 14852 8794 \r\n3 1788 16143 19468 8794 \r\n3 3135 14852 16143 8794 \r\n3 1914 17415 8963 8795 \r\n3 2434 19411 17415 8795 \r\n3 1557 8963 19411 8795 \r\n3 2216 7814 17977 8796 \r\n3 1820 15121 7814 8796 \r\n3 1122 17977 15121 8796 \r\n3 2427 18231 18219 8797 \r\n3 4123 12782 18231 8797 \r\n3 3050 18219 12782 8797 \r\n3 3189 15712 10134 8798 \r\n3 999 10551 15712 8798 \r\n3 372 10134 10551 8798 \r\n3 4791 19262 12230 8799 \r\n3 4317 16841 19262 8799 \r\n3 531 12230 16841 8799 \r\n3 2241 19785 15713 8800 \r\n3 3291 19784 19785 8800 \r\n3 4063 15713 19784 8800 \r\n3 3316 9489 17079 8801 \r\n3 1463 6402 9489 8801 \r\n3 2064 17079 6402 8801 \r\n3 958 19786 12696 8802 \r\n3 337 19481 19786 8802 \r\n3 169 12696 19481 8802 \r\n3 3853 15573 18602 8803 \r\n3 257 10776 15573 8803 \r\n3 1266 18602 10776 8803 \r\n3 3955 9716 13209 8804 \r\n3 432 15023 9716 8804 \r\n3 608 13209 15023 8804 \r\n3 1902 19787 19545 8805 \r\n3 3615 16213 19787 8805 \r\n3 4135 19545 16213 8805 \r\n3 331 9606 14004 8806 \r\n3 4448 15830 9606 8806 \r\n3 2445 14004 15830 8806 \r\n3 1131 17584 7145 8807 \r\n3 1197 5965 17584 8807 \r\n3 2721 7145 5965 8807 \r\n3 4111 19469 11419 8808 \r\n3 4139 8747 19469 8808 \r\n3 3102 11419 8747 8808 \r\n3 1138 11901 19190 8809 \r\n3 2526 15922 11901 8809 \r\n3 4013 19190 15922 8809 \r\n3 395 17039 19788 8810 \r\n3 1673 13374 17039 8810 \r\n3 2902 19788 13374 8810 \r\n3 4447 16098 17077 8811 \r\n3 755 8908 16098 8811 \r\n3 3742 17077 8908 8811 \r\n3 2739 17894 16994 8812 \r\n3 829 18197 17894 8812 \r\n3 4269 16994 18197 8812 \r\n3 1303 5934 9090 8813 \r\n3 4732 9446 5934 8813 \r\n3 302 9090 9446 8813 \r\n3 4428 13384 17515 8814 \r\n3 1188 18310 13384 8814 \r\n3 1675 17515 18310 8814 \r\n3 4978 9674 19751 8815 \r\n3 969 19244 9674 8815 \r\n3 431 19751 19244 8815 \r\n3 1266 10778 18734 8816 \r\n3 2827 19740 10778 8816 \r\n3 4902 18734 19740 8816 \r\n3 3568 19333 19790 8817 \r\n3 4558 19789 19333 8817 \r\n3 773 19790 19789 8817 \r\n3 4730 17909 5558 8818 \r\n3 1081 17858 17909 8818 \r\n3 1491 5558 17858 8818 \r\n3 3358 16326 8067 8819 \r\n3 4332 14279 16326 8819 \r\n3 4324 8067 14279 8819 \r\n3 284 18595 19760 8820 \r\n3 4945 14523 18595 8820 \r\n3 4917 19760 14523 8820 \r\n3 4970 14555 15315 8821 \r\n3 1606 10334 14555 8821 \r\n3 3838 15315 10334 8821 \r\n3 2096 5496 8927 8822 \r\n3 2117 19791 5496 8822 \r\n3 3303 8927 19791 8822 \r\n3 1744 15784 19792 8823 \r\n3 3384 19156 15784 8823 \r\n3 2882 19792 19156 8823 \r\n3 2469 19095 14548 8824 \r\n3 1913 15395 19095 8824 \r\n3 2805 14548 15395 8824 \r\n3 504 10951 16178 8825 \r\n3 1806 8592 10951 8825 \r\n3 2009 16178 8592 8825 \r\n3 2572 18268 13516 8826 \r\n3 1157 19793 18268 8826 \r\n3 835 13516 19793 8826 \r\n3 3993 17587 6356 8827 \r\n3 4731 9711 17587 8827 \r\n3 2225 6356 9711 8827 \r\n3 3406 16006 19794 8828 \r\n3 2273 17601 16006 8828 \r\n3 3839 19794 17601 8828 \r\n3 1383 19339 14780 8829 \r\n3 703 19795 19339 8829 \r\n3 3112 14780 19795 8829 \r\n3 1650 9701 16094 8830 \r\n3 2766 19546 9701 8830 \r\n3 553 16094 19546 8830 \r\n3 4778 16597 17129 8831 \r\n3 3961 17961 16597 8831 \r\n3 50 17129 17961 8831 \r\n3 4952 13624 18584 8832 \r\n3 1131 7144 13624 8832 \r\n3 2663 18584 7144 8832 \r\n3 3053 19796 16321 8833 \r\n3 831 17954 19796 8833 \r\n3 1433 16321 17954 8833 \r\n3 2904 16919 18632 8834 \r\n3 4159 7704 16919 8834 \r\n3 3359 18632 7704 8834 \r\n3 4339 19757 19295 8835 \r\n3 4355 18031 19757 8835 \r\n3 2277 19295 18031 8835 \r\n3 4898 16618 18374 8836 \r\n3 1689 9402 16618 8836 \r\n3 2267 18374 9402 8836 \r\n3 2541 5064 16992 8837 \r\n3 516 11519 5064 8837 \r\n3 3015 16992 11519 8837 \r\n3 2144 15415 19797 8838 \r\n3 4345 12043 15415 8838 \r\n3 3366 19797 12043 8838 \r\n3 57 7324 19030 8839 \r\n3 942 19798 7324 8839 \r\n3 4394 19030 19798 8839 \r\n3 1461 17088 17535 8840 \r\n3 188 19525 17088 8840 \r\n3 4541 17535 19525 8840 \r\n3 2240 16678 9281 8841 \r\n3 67 18548 16678 8841 \r\n3 4459 9281 18548 8841 \r\n3 4847 19331 16630 8842 \r\n3 4644 14779 19331 8842 \r\n3 3603 16630 14779 8842 \r\n3 2146 16671 12558 8843 \r\n3 4385 18194 16671 8843 \r\n3 386 12558 18194 8843 \r\n3 2399 17699 19783 8844 \r\n3 2235 14329 17699 8844 \r\n3 843 19783 14329 8844 \r\n3 4372 7544 14791 8845 \r\n3 1540 19799 7544 8845 \r\n3 4229 14791 19799 8845 \r\n3 103 12320 16938 8846 \r\n3 4259 6026 12320 8846 \r\n3 1388 16938 6026 8846 \r\n3 2928 13055 19612 8847 \r\n3 2272 19800 13055 8847 \r\n3 128 19612 19800 8847 \r\n3 4824 12929 15753 8848 \r\n3 4181 6979 12929 8848 \r\n3 649 15753 6979 8848 \r\n3 3371 19216 13706 8849 \r\n3 4397 18808 19216 8849 \r\n3 2732 13706 18808 8849 \r\n3 4166 14911 19396 8850 \r\n3 3494 19697 14911 8850 \r\n3 807 19396 19697 8850 \r\n3 4506 17959 12510 8851 \r\n3 1515 13409 17959 8851 \r\n3 938 12510 13409 8851 \r\n3 1776 8863 9662 8852 \r\n3 4858 17159 8863 8852 \r\n3 2868 9662 17159 8852 \r\n3 2680 12142 18063 8853 \r\n3 2472 16798 12142 8853 \r\n3 4106 18063 16798 8853 \r\n3 3092 6517 18089 8854 \r\n3 4941 10414 6517 8854 \r\n3 3222 18089 10414 8854 \r\n3 4123 19474 12783 8855 \r\n3 2551 19801 19474 8855 \r\n3 2976 12783 19801 8855 \r\n3 263 19802 17731 8856 \r\n3 3829 15876 19802 8856 \r\n3 4982 17731 15876 8856 \r\n3 4792 17839 17924 8857 \r\n3 3377 19803 17839 8857 \r\n3 2027 17924 19803 8857 \r\n3 1688 16796 14360 8858 \r\n3 4182 16635 16796 8858 \r\n3 3143 14360 16635 8858 \r\n3 537 7277 17296 8859 \r\n3 2489 14127 7277 8859 \r\n3 3662 17296 14127 8859 \r\n3 3618 19804 17642 8860 \r\n3 4790 17307 19804 8860 \r\n3 523 17642 17307 8860 \r\n3 1969 7468 12899 8861 \r\n3 3336 17529 7468 8861 \r\n3 3935 12899 17529 8861 \r\n3 4298 19165 7470 8862 \r\n3 1142 11874 19165 8862 \r\n3 950 7470 11874 8862 \r\n3 4764 12533 14567 8863 \r\n3 1003 8617 12533 8863 \r\n3 3601 14567 8617 8863 \r\n3 3237 7733 13271 8864 \r\n3 2328 19805 7733 8864 \r\n3 4252 13271 19805 8864 \r\n3 1501 13618 6284 8865 \r\n3 3687 8763 13618 8865 \r\n3 1653 6284 8763 8865 \r\n3 300 10569 18445 8866 \r\n3 1911 15978 10569 8866 \r\n3 3613 18445 15978 8866 \r\n3 3869 15129 13646 8867 \r\n3 3711 19806 15129 8867 \r\n3 1565 13646 19806 8867 \r\n3 2004 17691 18129 8868 \r\n3 2904 18631 17691 8868 \r\n3 2396 18129 18631 8868 \r\n3 3479 9139 17438 8869 \r\n3 566 19807 9139 8869 \r\n3 3745 17438 19807 8869 \r\n3 473 17736 19776 8870 \r\n3 507 19610 17736 8870 \r\n3 65 19776 19610 8870 \r\n3 1391 11468 19490 8871 \r\n3 2214 16429 11468 8871 \r\n3 1458 19490 16429 8871 \r\n3 3472 19659 15908 8872 \r\n3 4370 19457 19659 8872 \r\n3 1793 15908 19457 8872 \r\n3 2859 15405 19808 8873 \r\n3 4710 17732 15405 8873 \r\n3 2963 19808 17732 8873 \r\n3 2882 15005 19792 8874 \r\n3 204 6519 15005 8874 \r\n3 1744 19792 6519 8874 \r\n3 4360 19276 19551 8875 \r\n3 1392 13971 19276 8875 \r\n3 3293 19551 13971 8875 \r\n3 1661 11210 19628 8876 \r\n3 3573 10610 11210 8876 \r\n3 3110 19628 10610 8876 \r\n3 3392 10708 16871 8877 \r\n3 320 19809 10708 8877 \r\n3 2410 16871 19809 8877 \r\n3 745 12269 19378 8878 \r\n3 4893 6097 12269 8878 \r\n3 348 19378 6097 8878 \r\n3 271 7459 18618 8879 \r\n3 3529 19554 7459 8879 \r\n3 170 18618 19554 8879 \r\n3 3071 17773 18715 8880 \r\n3 3426 19069 17773 8880 \r\n3 3720 18715 19069 8880 \r\n3 2820 19810 5352 8881 \r\n3 1013 14849 19810 8881 \r\n3 2028 5352 14849 8881 \r\n3 2563 19811 13866 8882 \r\n3 4241 19503 19811 8882 \r\n3 3382 13866 19503 8882 \r\n3 4445 15106 15393 8883 \r\n3 986 8512 15106 8883 \r\n3 2791 15393 8512 8883 \r\n3 3095 12623 9514 8884 \r\n3 3035 16651 12623 8884 \r\n3 544 9514 16651 8884 \r\n3 4086 5803 13985 8885 \r\n3 107 15369 5803 8885 \r\n3 364 13985 15369 8885 \r\n3 3550 5128 6521 8886 \r\n3 646 15231 5128 8886 \r\n3 2808 6521 15231 8886 \r\n3 286 14396 11780 8887 \r\n3 4331 14586 14396 8887 \r\n3 1765 11780 14586 8887 \r\n3 146 19380 19812 8888 \r\n3 545 10162 19380 8888 \r\n3 2581 19812 10162 8888 \r\n3 4252 18154 13272 8889 \r\n3 1531 9908 18154 8889 \r\n3 32 13272 9908 8889 \r\n3 2350 19416 13411 8890 \r\n3 1459 19260 19416 8890 \r\n3 938 13411 19260 8890 \r\n3 3682 19257 5155 8891 \r\n3 4400 18762 19257 8891 \r\n3 3830 5155 18762 8891 \r\n3 1320 15914 19813 8892 \r\n3 2210 8817 15914 8892 \r\n3 2367 19813 8817 8892 \r\n3 3938 16981 18233 8893 \r\n3 1636 16969 16981 8893 \r\n3 1813 18233 16969 8893 \r\n3 188 8700 9720 8894 \r\n3 4167 19814 8700 8894 \r\n3 3511 9720 19814 8894 \r\n3 1525 8732 17555 8895 \r\n3 3778 11535 8732 8895 \r\n3 4865 17555 11535 8895 \r\n3 2585 11029 19815 8896 \r\n3 4293 19650 11029 8896 \r\n3 1362 19815 19650 8896 \r\n3 4167 19520 19814 8897 \r\n3 2753 11302 19520 8897 \r\n3 3511 19814 11302 8897 \r\n3 4641 13588 19009 8898 \r\n3 810 14743 13588 8898 \r\n3 2876 19009 14743 8898 \r\n3 323 19817 19816 8899 \r\n3 4631 14293 19817 8899 \r\n3 2364 19816 14293 8899 \r\n3 3081 6923 15520 8900 \r\n3 2485 6875 6923 8900 \r\n3 1230 15520 6875 8900 \r\n3 3890 10318 13061 8901 \r\n3 3059 17999 10318 8901 \r\n3 1449 13061 17999 8901 \r\n3 3489 17075 12598 8902 \r\n3 4999 15243 17075 8902 \r\n3 2340 12598 15243 8902 \r\n3 4441 14759 18400 8903 \r\n3 443 17518 14759 8903 \r\n3 614 18400 17518 8903 \r\n3 1470 19057 14179 8904 \r\n3 1904 19818 19057 8904 \r\n3 1837 14179 19818 8904 \r\n3 1943 14208 13466 8905 \r\n3 202 5977 14208 8905 \r\n3 1312 13466 5977 8905 \r\n3 4769 18820 18910 8906 \r\n3 4302 16353 18820 8906 \r\n3 1109 18910 16353 8906 \r\n3 601 6083 15320 8907 \r\n3 3798 14937 6083 8907 \r\n3 1816 15320 14937 8907 \r\n3 4601 11114 18110 8908 \r\n3 2311 19819 11114 8908 \r\n3 2409 18110 19819 8908 \r\n3 4770 17542 19403 8909 \r\n3 610 18188 17542 8909 \r\n3 1304 19403 18188 8909 \r\n3 3508 19112 18678 8910 \r\n3 2048 12076 19112 8910 \r\n3 3673 18678 12076 8910 \r\n3 3487 8641 15585 8911 \r\n3 2948 5779 8641 8911 \r\n3 4394 15585 5779 8911 \r\n3 2953 11928 17610 8912 \r\n3 3278 17955 11928 8912 \r\n3 831 17610 17955 8912 \r\n3 713 18090 18942 8913 \r\n3 3222 19820 18090 8913 \r\n3 3481 18942 19820 8913 \r\n3 2762 19630 8954 8914 \r\n3 4528 16783 19630 8914 \r\n3 3602 8954 16783 8914 \r\n3 3366 19660 19797 8915 \r\n3 4341 19821 19660 8915 \r\n3 2144 19797 19821 8915 \r\n3 3706 10861 19569 8916 \r\n3 3554 17090 10861 8916 \r\n3 1031 19569 17090 8916 \r\n3 4572 14075 19822 8917 \r\n3 863 11631 14075 8917 \r\n3 337 19822 11631 8917 \r\n3 1164 11981 13093 8918 \r\n3 1087 14435 11981 8918 \r\n3 4080 13093 14435 8918 \r\n3 3120 17182 15486 8919 \r\n3 3201 18579 17182 8919 \r\n3 4934 15486 18579 8919 \r\n3 323 7177 19817 8920 \r\n3 2349 19823 7177 8920 \r\n3 4631 19817 19823 8920 \r\n3 2641 8419 12364 8921 \r\n3 791 19539 8419 8921 \r\n3 3465 12364 19539 8921 \r\n3 1158 16802 13856 8922 \r\n3 1476 19428 16802 8922 \r\n3 3797 13856 19428 8922 \r\n3 4849 13324 15641 8923 \r\n3 2083 11738 13324 8923 \r\n3 948 15641 11738 8923 \r\n3 2683 14867 12050 8924 \r\n3 4597 18273 14867 8924 \r\n3 429 12050 18273 8924 \r\n3 2939 6926 17094 8925 \r\n3 2056 14101 6926 8925 \r\n3 2411 17094 14101 8925 \r\n3 569 15574 19667 8926 \r\n3 3687 13679 15574 8926 \r\n3 607 19667 13679 8926 \r\n3 3802 19355 16331 8927 \r\n3 3300 5693 19355 8927 \r\n3 2314 16331 5693 8927 \r\n3 1501 7562 13619 8928 \r\n3 3336 19824 7562 8928 \r\n3 4660 13619 19824 8928 \r\n3 834 8119 19357 8929 \r\n3 927 19245 8119 8929 \r\n3 1981 19357 19245 8929 \r\n3 2804 15528 19512 8930 \r\n3 2347 17069 15528 8930 \r\n3 374 19512 17069 8930 \r\n3 2479 10584 19184 8931 \r\n3 4651 12113 10584 8931 \r\n3 363 19184 12113 8931 \r\n3 4770 5495 17540 8932 \r\n3 594 16916 5495 8932 \r\n3 4171 17540 16916 8932 \r\n3 3866 19825 18662 8933 \r\n3 137 18263 19825 8933 \r\n3 2672 18662 18263 8933 \r\n3 1842 18135 9236 8934 \r\n3 1102 16910 18135 8934 \r\n3 4590 9236 16910 8934 \r\n3 4721 9893 9950 8935 \r\n3 857 19446 9893 8935 \r\n3 4384 9950 19446 8935 \r\n3 4091 15460 9301 8936 \r\n3 4563 17434 15460 8936 \r\n3 3119 9301 17434 8936 \r\n3 4052 6784 5259 8937 \r\n3 2002 17365 6784 8937 \r\n3 2900 5259 17365 8937 \r\n3 4440 16738 19826 8938 \r\n3 4474 12548 16738 8938 \r\n3 3327 19826 12548 8938 \r\n3 1629 10492 19827 8939 \r\n3 636 19142 10492 8939 \r\n3 1111 19827 19142 8939 \r\n3 2400 18872 17421 8940 \r\n3 3568 19790 18872 8940 \r\n3 773 17421 19790 8940 \r\n3 2244 11646 6899 8941 \r\n3 1370 19048 11646 8941 \r\n3 88 6899 19048 8941 \r\n3 1560 19828 6396 8942 \r\n3 4872 13599 19828 8942 \r\n3 1203 6396 13599 8942 \r\n3 1766 10871 19059 8943 \r\n3 3370 8820 10871 8943 \r\n3 3124 19059 8820 8943 \r\n3 1922 8159 13772 8944 \r\n3 4852 19829 8159 8944 \r\n3 3632 13772 19829 8944 \r\n3 1757 11303 12332 8945 \r\n3 2753 8770 11303 8945 \r\n3 2975 12332 8770 8945 \r\n3 3200 19830 16899 8946 \r\n3 1693 11758 19830 8946 \r\n3 4598 16899 11758 8946 \r\n3 554 19767 14332 8947 \r\n3 3140 19169 19767 8947 \r\n3 4162 14332 19169 8947 \r\n3 1454 12815 7969 8948 \r\n3 1508 17113 12815 8948 \r\n3 4475 7969 17113 8948 \r\n3 653 14533 17665 8949 \r\n3 4878 12792 14533 8949 \r\n3 963 17665 12792 8949 \r\n3 3684 12900 18945 8950 \r\n3 1914 8962 12900 8950 \r\n3 4693 18945 8962 8950 \r\n3 4659 15990 15775 8951 \r\n3 1282 9246 15990 8951 \r\n3 1223 15775 9246 8951 \r\n3 3892 18175 6343 8952 \r\n3 3877 6084 18175 8952 \r\n3 601 6343 6084 8952 \r\n3 3457 19749 18180 8953 \r\n3 4484 19831 19749 8953 \r\n3 3159 18180 19831 8953 \r\n3 84 19832 17867 8954 \r\n3 1866 18625 19832 8954 \r\n3 2929 17867 18625 8954 \r\n3 2718 19228 17144 8955 \r\n3 1035 19833 19228 8955 \r\n3 805 17144 19833 8955 \r\n3 1239 15274 18574 8956 \r\n3 2052 15915 15274 8956 \r\n3 1287 18574 15915 8956 \r\n3 2256 13008 19835 8957 \r\n3 93 19834 13008 8957 \r\n3 3738 19835 19834 8957 \r\n3 3729 19836 18564 8958 \r\n3 1446 7137 19836 8958 \r\n3 1435 18564 7137 8958 \r\n3 562 18923 16748 8959 \r\n3 198 13797 18923 8959 \r\n3 4446 16748 13797 8959 \r\n3 31 5650 9219 8960 \r\n3 988 6470 5650 8960 \r\n3 3157 9219 6470 8960 \r\n3 4489 18056 15966 8961 \r\n3 1534 5705 18056 8961 \r\n3 724 15966 5705 8961 \r\n3 4517 19251 17621 8962 \r\n3 323 19816 19251 8962 \r\n3 2364 17621 19816 8962 \r\n3 1446 11973 13600 8963 \r\n3 112 19687 11973 8963 \r\n3 321 13600 19687 8963 \r\n3 2833 19837 19264 8964 \r\n3 3860 18879 19837 8964 \r\n3 3666 19264 18879 8964 \r\n3 4425 13561 14839 8965 \r\n3 1835 11985 13561 8965 \r\n3 505 14839 11985 8965 \r\n3 2720 9441 18748 8966 \r\n3 2777 14411 9441 8966 \r\n3 3629 18748 14411 8966 \r\n3 3860 19837 7268 8967 \r\n3 2833 17207 19837 8967 \r\n3 3776 7268 17207 8967 \r\n3 96 11357 18779 8968 \r\n3 4743 19209 11357 8968 \r\n3 2156 18779 19209 8968 \r\n3 3889 6940 5361 8969 \r\n3 3583 18878 6940 8969 \r\n3 1576 5361 18878 8969 \r\n3 4435 9787 18931 8970 \r\n3 3027 14558 9787 8970 \r\n3 150 18931 14558 8970 \r\n3 652 13683 5979 8971 \r\n3 3266 14926 13683 8971 \r\n3 42 5979 14926 8971 \r\n3 3069 19124 9063 8972 \r\n3 1910 12553 19124 8972 \r\n3 861 9063 12553 8972 \r\n3 232 19736 19839 8973 \r\n3 4606 19838 19736 8973 \r\n3 194 19839 19838 8973 \r\n3 1690 19163 13500 8974 \r\n3 2508 9118 19163 8974 \r\n3 2248 13500 9118 8974 \r\n3 69 13451 17346 8975 \r\n3 1070 6686 13451 8975 \r\n3 979 17346 6686 8975 \r\n3 4762 19840 18785 8976 \r\n3 1195 11726 19840 8976 \r\n3 3357 18785 11726 8976 \r\n3 683 14139 13457 8977 \r\n3 3748 13567 14139 8977 \r\n3 1161 13457 13567 8977 \r\n3 2167 8918 18086 8978 \r\n3 3014 11473 8918 8978 \r\n3 211 18086 11473 8978 \r\n3 3876 19419 17901 8979 \r\n3 4389 14363 19419 8979 \r\n3 2592 17901 14363 8979 \r\n3 1081 19671 19421 8980 \r\n3 2417 6087 19671 8980 \r\n3 2571 19421 6087 8980 \r\n3 4046 15781 19842 8981 \r\n3 2450 19841 15781 8981 \r\n3 3406 19842 19841 8981 \r\n3 915 10664 19843 8982 \r\n3 4705 13508 10664 8982 \r\n3 1768 19843 13508 8982 \r\n3 2910 18812 19761 8983 \r\n3 3193 11798 18812 8983 \r\n3 2309 19761 11798 8983 \r\n3 2333 7192 19304 8984 \r\n3 448 19665 7192 8984 \r\n3 3148 19304 19665 8984 \r\n3 1905 11371 19844 8985 \r\n3 4937 15961 11371 8985 \r\n3 4682 19844 15961 8985 \r\n3 3533 19580 8614 8986 \r\n3 1716 11172 19580 8986 \r\n3 2941 8614 11172 8986 \r\n3 3469 19846 19845 8987 \r\n3 1839 14974 19846 8987 \r\n3 585 19845 14974 8987 \r\n3 3621 14061 6062 8988 \r\n3 1377 17580 14061 8988 \r\n3 4494 6062 17580 8988 \r\n3 422 11347 7651 8989 \r\n3 4485 19568 11347 8989 \r\n3 4231 7651 19568 8989 \r\n3 1904 5158 19818 8990 \r\n3 1187 19847 5158 8990 \r\n3 1837 19818 19847 8990 \r\n3 3970 15718 5233 8991 \r\n3 4813 19717 15718 8991 \r\n3 3525 5233 19717 8991 \r\n3 4471 10948 19147 8992 \r\n3 4926 5899 10948 8992 \r\n3 2774 19147 5899 8992 \r\n3 261 6605 13757 8993 \r\n3 1264 15072 6605 8993 \r\n3 4416 13757 15072 8993 \r\n3 1292 19581 16226 8994 \r\n3 4772 14882 19581 8994 \r\n3 1219 16226 14882 8994 \r\n3 2247 11310 19848 8995 \r\n3 2358 16773 11310 8995 \r\n3 2025 19848 16773 8995 \r\n3 2540 19033 19849 8996 \r\n3 2736 15923 19033 8996 \r\n3 3438 19849 15923 8996 \r\n3 1126 18570 5967 8997 \r\n3 3885 16467 18570 8997 \r\n3 3188 5967 16467 8997 \r\n3 2915 8855 19370 8998 \r\n3 4376 12104 8855 8998 \r\n3 2457 19370 12104 8998 \r\n3 4579 19850 10102 8999 \r\n3 1151 14818 19850 8999 \r\n3 3507 10102 14818 8999 \r\n3 417 15156 15321 9000 \r\n3 3036 13517 15156 9000 \r\n3 835 15321 13517 9000 \r\n3 4391 16965 18038 9001 \r\n3 3570 14630 16965 9001 \r\n3 1139 18038 14630 9001 \r\n3 3320 19646 19851 9002 \r\n3 2860 6593 19646 9002 \r\n3 255 19851 6593 9002 \r\n3 3784 19168 12037 9003 \r\n3 3140 13836 19168 9003 \r\n3 4913 12037 13836 9003 \r\n3 1618 13774 18022 9004 \r\n3 3362 14942 13774 9004 \r\n3 1749 18022 14942 9004 \r\n3 3302 14741 9016 9005 \r\n3 3325 8784 14741 9005 \r\n3 3934 9016 8784 9005 \r\n3 3729 5664 19836 9006 \r\n3 2168 11974 5664 9006 \r\n3 1446 19836 11974 9006 \r\n3 2935 11700 17404 9007 \r\n3 2541 16993 11700 9007 \r\n3 3807 17404 16993 9007 \r\n3 2322 9263 16888 9008 \r\n3 2823 19852 9263 9008 \r\n3 3741 16888 19852 9008 \r\n3 200 17190 19853 9009 \r\n3 1955 13575 17190 9009 \r\n3 3449 19853 13575 9009 \r\n3 4948 19559 19854 9010 \r\n3 2507 19198 19559 9010 \r\n3 2989 19854 19198 9010 \r\n3 1361 15412 6911 9011 \r\n3 283 7850 15412 9011 \r\n3 2996 6911 7850 9011 \r\n3 3399 16404 19541 9012 \r\n3 1712 11765 16404 9012 \r\n3 2152 19541 11765 9012 \r\n3 2926 8327 16941 9013 \r\n3 720 17229 8327 9013 \r\n3 2756 16941 17229 9013 \r\n3 4226 16549 5027 9014 \r\n3 4658 19855 16549 9014 \r\n3 1818 5027 19855 9014 \r\n3 4482 16330 14598 9015 \r\n3 4215 8556 16330 9015 \r\n3 3048 14598 8556 9015 \r\n3 1019 15396 9187 9016 \r\n3 2821 18012 15396 9016 \r\n3 4306 9187 18012 9016 \r\n3 4519 15043 13418 9017 \r\n3 2701 17181 15043 9017 \r\n3 1709 13418 17181 9017 \r\n3 1519 19856 5106 9018 \r\n3 1970 19629 19856 9018 \r\n3 3785 5106 19629 9018 \r\n3 3509 8162 15844 9019 \r\n3 3031 8394 8162 9019 \r\n3 1554 15844 8394 9019 \r\n3 2540 19849 8685 9020 \r\n3 3438 8542 19849 9020 \r\n3 2908 8685 8542 9020 \r\n3 1663 18846 18421 9021 \r\n3 4690 18771 18846 9021 \r\n3 949 18421 18771 9021 \r\n3 4043 19439 14875 9022 \r\n3 1959 14386 19439 9022 \r\n3 2798 14875 14386 9022 \r\n3 770 14976 17277 9023 \r\n3 4615 19391 14976 9023 \r\n3 1698 17277 19391 9023 \r\n3 1013 19810 17811 9024 \r\n3 2820 17957 19810 9024 \r\n3 3880 17811 17957 9024 \r\n3 3092 18088 10846 9025 \r\n3 713 14265 18088 9025 \r\n3 4926 10846 14265 9025 \r\n3 3568 18871 8919 9026 \r\n3 4724 16713 18871 9026 \r\n3 257 8919 16713 9026 \r\n3 1645 19702 6969 9027 \r\n3 4312 19857 19702 9027 \r\n3 1792 6969 19857 9027 \r\n3 2202 9081 15653 9028 \r\n3 606 19675 9081 9028 \r\n3 1212 15653 19675 9028 \r\n3 3044 18720 17465 9029 \r\n3 1608 16106 18720 9029 \r\n3 4427 17465 16106 9029 \r\n3 2249 13258 15437 9030 \r\n3 3549 5958 13258 9030 \r\n3 3728 15437 5958 9030 \r\n3 778 9153 16533 9031 \r\n3 98 9502 9153 9031 \r\n3 2177 16533 9502 9031 \r\n3 2855 5548 19233 9032 \r\n3 4018 12133 5548 9032 \r\n3 212 19233 12133 9032 \r\n3 3769 18506 5297 9033 \r\n3 389 19858 18506 9033 \r\n3 4162 5297 19858 9033 \r\n3 1490 12146 17803 9034 \r\n3 511 19859 12146 9034 \r\n3 260 17803 19859 9034 \r\n3 2969 17724 14610 9035 \r\n3 1853 19450 17724 9035 \r\n3 4534 14610 19450 9035 \r\n3 736 18274 7682 9036 \r\n3 3319 19080 18274 9036 \r\n3 2436 7682 19080 9036 \r\n3 848 11081 5337 9037 \r\n3 175 18562 11081 9037 \r\n3 4046 5337 18562 9037 \r\n3 4424 18509 9348 9038 \r\n3 4623 18903 18509 9038 \r\n3 1529 9348 18903 9038 \r\n3 160 12884 18530 9039 \r\n3 3178 16791 12884 9039 \r\n3 115 18530 16791 9039 \r\n3 360 17098 16954 9040 \r\n3 2431 16497 17098 9040 \r\n3 1659 16954 16497 9040 \r\n3 1080 19093 19338 9041 \r\n3 91 15479 19093 9041 \r\n3 732 19338 15479 9041 \r\n3 1453 17498 12414 9042 \r\n3 3243 19232 17498 9042 \r\n3 308 12414 19232 9042 \r\n3 749 16422 19074 9043 \r\n3 2963 14576 16422 9043 \r\n3 1269 19074 14576 9043 \r\n3 4912 17546 10446 9044 \r\n3 3191 19034 17546 9044 \r\n3 299 10446 19034 9044 \r\n3 650 10662 19555 9045 \r\n3 4793 19860 10662 9045 \r\n3 4730 19555 19860 9045 \r\n3 2407 12722 14162 9046 \r\n3 4078 18439 12722 9046 \r\n3 2925 14162 18439 9046 \r\n3 4085 19655 6377 9047 \r\n3 2959 19255 19655 9047 \r\n3 3572 6377 19255 9047 \r\n3 1832 18409 18597 9048 \r\n3 4306 9162 18409 9048 \r\n3 4413 18597 9162 9048 \r\n3 4476 14846 11286 9049 \r\n3 673 18682 14846 9049 \r\n3 3484 11286 18682 9049 \r\n3 1872 19162 16367 9050 \r\n3 1464 17201 19162 9050 \r\n3 4777 16367 17201 9050 \r\n3 905 7005 6982 9051 \r\n3 4188 18043 7005 9051 \r\n3 929 6982 18043 9051 \r\n3 2912 6690 13717 9052 \r\n3 2667 6554 6690 9052 \r\n3 3782 13717 6554 9052 \r\n3 4495 12073 8319 9053 \r\n3 3595 7843 12073 9053 \r\n3 2087 8319 7843 9053 \r\n3 3754 13151 19861 9054 \r\n3 2786 6135 13151 9054 \r\n3 1527 19861 6135 9054 \r\n3 1527 19862 19115 9055 \r\n3 2940 5482 19862 9055 \r\n3 515 19115 5482 9055 \r\n3 2907 19863 15604 9056 \r\n3 3695 14057 19863 9056 \r\n3 2107 15604 14057 9056 \r\n3 1650 16095 9702 9057 \r\n3 4279 11969 16095 9057 \r\n3 2429 9702 11969 9057 \r\n3 298 16680 19362 9058 \r\n3 3256 5651 16680 9058 \r\n3 31 19362 5651 9058 \r\n3 1094 12449 10326 9059 \r\n3 1397 17594 12449 9059 \r\n3 3777 10326 17594 9059 \r\n3 494 17211 17063 9060 \r\n3 1728 10889 17211 9060 \r\n3 2227 17063 10889 9060 \r\n3 1539 19865 19864 9061 \r\n3 1683 10748 19865 9061 \r\n3 3862 19864 10748 9061 \r\n3 2441 18710 19624 9062 \r\n3 1516 11439 18710 9062 \r\n3 330 19624 11439 9062 \r\n3 1191 19731 13479 9063 \r\n3 3117 11464 19731 9063 \r\n3 4472 13479 11464 9063 \r\n3 2674 14509 18701 9064 \r\n3 2962 19593 14509 9064 \r\n3 4061 18701 19593 9064 \r\n3 4424 6754 18510 9065 \r\n3 3375 8875 6754 9065 \r\n3 4230 18510 8875 9065 \r\n3 3920 12804 11621 9066 \r\n3 317 18652 12804 9066 \r\n3 4955 11621 18652 9066 \r\n3 1299 13429 18083 9067 \r\n3 4399 12894 13429 9067 \r\n3 1506 18083 12894 9067 \r\n3 2476 13291 18282 9068 \r\n3 4215 5686 13291 9068 \r\n3 2522 18282 5686 9068 \r\n3 42 11943 15187 9069 \r\n3 1847 7694 11943 9069 \r\n3 922 15187 7694 9069 \r\n3 2478 19866 13764 9070 \r\n3 3470 18754 19866 9070 \r\n3 423 13764 18754 9070 \r\n3 3129 16639 11886 9071 \r\n3 411 17743 16639 9071 \r\n3 4744 11886 17743 9071 \r\n3 1268 11461 8326 9072 \r\n3 1149 19867 11461 9072 \r\n3 720 8326 19867 9072 \r\n3 4928 19505 19868 9073 \r\n3 823 13853 19505 9073 \r\n3 4593 19868 13853 9073 \r\n3 4568 12721 19643 9074 \r\n3 2407 19772 12721 9074 \r\n3 2998 19643 19772 9074 \r\n3 2423 8152 8350 9075 \r\n3 203 11373 8152 9075 \r\n3 4652 8350 11373 9075 \r\n3 800 19781 19869 9076 \r\n3 4114 10775 19781 9076 \r\n3 1662 19869 10775 9076 \r\n3 3859 16869 9736 9077 \r\n3 2574 19676 16869 9077 \r\n3 1330 9736 19676 9077 \r\n3 3710 17282 14845 9078 \r\n3 47 19229 17282 9078 \r\n3 673 14845 19229 9078 \r\n3 1747 16431 19185 9079 \r\n3 3934 17765 16431 9079 \r\n3 1477 19185 17765 9079 \r\n3 800 19869 15577 9080 \r\n3 1662 16162 19869 9080 \r\n3 1750 15577 16162 9080 \r\n3 2933 13813 9761 9081 \r\n3 2041 19641 13813 9081 \r\n3 932 9761 19641 9081 \r\n3 4299 16658 18869 9082 \r\n3 4497 7598 16658 9082 \r\n3 2120 18869 7598 9082 \r\n3 1075 11552 9388 9083 \r\n3 1657 10730 11552 9083 \r\n3 1227 9388 10730 9083 \r\n3 93 10917 19834 9084 \r\n3 2081 12205 10917 9084 \r\n3 3738 19834 12205 9084 \r\n3 2178 10624 17559 9085 \r\n3 641 19013 10624 9085 \r\n3 580 17559 19013 9085 \r\n3 4344 10227 14025 9086 \r\n3 2676 16252 10227 9086 \r\n3 1008 14025 16252 9086 \r\n3 358 19488 7818 9087 \r\n3 3000 18765 19488 9087 \r\n3 3383 7818 18765 9087 \r\n3 4881 18829 16329 9088 \r\n3 2372 19732 18829 9088 \r\n3 814 16329 19732 9088 \r\n3 2410 19809 17926 9089 \r\n3 320 12761 19809 9089 \r\n3 1727 17926 12761 9089 \r\n3 4585 14499 18563 9090 \r\n3 4157 10153 14499 9090 \r\n3 3906 18563 10153 9090 \r\n3 1279 16861 19604 9091 \r\n3 2163 14147 16861 9091 \r\n3 1301 19604 14147 9091 \r\n3 4587 18235 12688 9092 \r\n3 1400 19157 18235 9092 \r\n3 2122 12688 19157 9092 \r\n3 2140 9125 18289 9093 \r\n3 3683 18533 9125 9093 \r\n3 2515 18289 18533 9093 \r\n3 2446 16650 12924 9094 \r\n3 1696 9409 16650 9094 \r\n3 2466 12924 9409 9094 \r\n3 960 18044 7861 9095 \r\n3 2276 18518 18044 9095 \r\n3 670 7861 18518 9095 \r\n3 1089 13102 19452 9096 \r\n3 856 11027 13102 9096 \r\n3 1426 19452 11027 9096 \r\n3 2482 19358 14622 9097 \r\n3 1838 11309 19358 9097 \r\n3 1129 14622 11309 9097 \r\n3 3290 5579 12366 9098 \r\n3 1345 18495 5579 9098 \r\n3 2641 12366 18495 9098 \r\n3 3892 19565 18173 9099 \r\n3 2944 17343 19565 9099 \r\n3 444 18173 17343 9099 \r\n3 1272 19208 12535 9100 \r\n3 3169 16215 19208 9100 \r\n3 299 12535 16215 9100 \r\n3 3382 15670 10104 9101 \r\n3 2748 18373 15670 9101 \r\n3 4950 10104 18373 9101 \r\n3 492 9268 19870 9102 \r\n3 3676 19271 9268 9102 \r\n3 1186 19870 19271 9102 \r\n3 2408 13814 16882 9103 \r\n3 4250 13389 13814 9103 \r\n3 3704 16882 13389 9103 \r\n3 3347 14551 9735 9104 \r\n3 2982 9884 14551 9104 \r\n3 3859 9735 9884 9104 \r\n3 819 16232 19871 9105 \r\n3 4554 5999 16232 9105 \r\n3 1333 19871 5999 9105 \r\n3 1166 12099 8092 9106 \r\n3 2733 15096 12099 9106 \r\n3 2317 8092 15096 9106 \r\n3 4021 14338 9526 9107 \r\n3 3 11946 14338 9107 \r\n3 2153 9526 11946 9107 \r\n3 3012 9517 5426 9108 \r\n3 1310 19558 9517 9108 \r\n3 3040 5426 19558 9108 \r\n3 2027 19803 12785 9109 \r\n3 3377 15527 19803 9109 \r\n3 4456 12785 15527 9109 \r\n3 4408 17391 13660 9110 \r\n3 1808 8288 17391 9110 \r\n3 2195 13660 8288 9110 \r\n3 4034 7378 15731 9111 \r\n3 4918 19726 7378 9111 \r\n3 3020 15731 19726 9111 \r\n3 4125 10995 15247 9112 \r\n3 3673 12075 10995 9112 \r\n3 4613 15247 12075 9112 \r\n3 4265 18918 5524 9113 \r\n3 3054 5115 18918 9113 \r\n3 3088 5524 5115 9113 \r\n3 3063 13707 7371 9114 \r\n3 2732 18810 13707 9114 \r\n3 3547 7371 18810 9114 \r\n3 2993 5582 15171 9115 \r\n3 1836 14811 5582 9115 \r\n3 512 15171 14811 9115 \r\n3 2736 19032 19750 9116 \r\n3 1254 19024 19032 9116 \r\n3 4604 19750 19024 9116 \r\n3 1376 19136 16423 9117 \r\n3 7 14291 19136 9117 \r\n3 3190 16423 14291 9117 \r\n3 2984 13251 11121 9118 \r\n3 2625 18468 13251 9118 \r\n3 3165 11121 18468 9118 \r\n3 4759 17131 12464 9119 \r\n3 2539 18598 17131 9119 \r\n3 4413 12464 18598 9119 \r\n3 2222 15237 19872 9120 \r\n3 980 12977 15237 9120 \r\n3 1648 19872 12977 9120 \r\n3 1823 19135 18917 9121 \r\n3 3342 18223 19135 9121 \r\n3 1250 18917 18223 9121 \r\n3 4702 10692 18065 9122 \r\n3 1840 17472 10692 9122 \r\n3 2618 18065 17472 9122 \r\n3 4802 7438 18952 9123 \r\n3 1018 16201 7438 9123 \r\n3 4403 18952 16201 9123 \r\n3 914 19737 13121 9124 \r\n3 2089 14429 19737 9124 \r\n3 2459 13121 14429 9124 \r\n3 263 19322 19802 9125 \r\n3 1995 19413 19322 9125 \r\n3 3829 19802 19413 9125 \r\n3 139 17369 18024 9126 \r\n3 3223 14915 17369 9126 \r\n3 1046 18024 14915 9126 \r\n3 4253 9730 6991 9127 \r\n3 4244 19873 9730 9127 \r\n3 706 6991 19873 9127 \r\n3 999 11890 5108 9128 \r\n3 4316 18441 11890 9128 \r\n3 2761 5108 18441 9128 \r\n3 3353 19874 17371 9129 \r\n3 482 18304 19874 9129 \r\n3 4499 17371 18304 9129 \r\n3 3382 19502 15671 9130 \r\n3 1419 18182 19502 9130 \r\n3 2911 15671 18182 9130 \r\n3 436 15256 17821 9131 \r\n3 1442 13096 15256 9131 \r\n3 399 17821 13096 9131 \r\n3 4798 19728 14065 9132 \r\n3 3698 17884 19728 9132 \r\n3 2634 14065 17884 9132 \r\n3 2493 17123 17687 9133 \r\n3 4691 10050 17123 9133 \r\n3 2669 17687 10050 9133 \r\n3 2664 11980 19075 9134 \r\n3 1256 18874 11980 9134 \r\n3 4915 19075 18874 9134 \r\n3 3359 7703 15082 9135 \r\n3 265 15803 7703 9135 \r\n3 796 15082 15803 9135 \r\n3 1673 17786 13375 9136 \r\n3 2765 8031 17786 9136 \r\n3 3708 13375 8031 9136 \r\n3 3741 19852 15624 9137 \r\n3 2823 12565 19852 9137 \r\n3 699 15624 12565 9137 \r\n3 420 5375 16963 9138 \r\n3 3467 19225 5375 9138 \r\n3 2552 16963 19225 9138 \r\n3 2349 18013 19823 9139 \r\n3 254 18141 18013 9139 \r\n3 4631 19823 18141 9139 \r\n3 2804 16027 16929 9140 \r\n3 3616 15500 16027 9140 \r\n3 859 16929 15500 9140 \r\n3 1303 9092 17067 9141 \r\n3 4817 19371 9092 9141 \r\n3 2457 17067 19371 9141 \r\n3 3660 11500 18280 9142 \r\n3 2890 19480 11500 9142 \r\n3 154 18280 19480 9142 \r\n3 198 13200 13798 9143 \r\n3 3504 10195 13200 9143 \r\n3 4821 13798 10195 9143 \r\n3 1177 19719 5786 9144 \r\n3 2773 18092 19719 9144 \r\n3 1273 5786 18092 9144 \r\n3 1772 7096 19762 9145 \r\n3 3131 19715 7096 9145 \r\n3 1525 19762 19715 9145 \r\n3 844 10922 15986 9146 \r\n3 2611 15493 10922 9146 \r\n3 2494 15986 15493 9146 \r\n3 4675 19875 19563 9147 \r\n3 4061 19592 19875 9147 \r\n3 2923 19563 19592 9147 \r\n3 61 5992 12766 9148 \r\n3 4977 7756 5992 9148 \r\n3 1722 12766 7756 9148 \r\n3 1215 19876 19471 9149 \r\n3 2590 14708 19876 9149 \r\n3 3137 19471 14708 9149 \r\n3 412 15496 19877 9150 \r\n3 177 9929 15496 9150 \r\n3 4727 19877 9929 9150 \r\n3 4875 19879 19878 9151 \r\n3 4263 10065 19879 9151 \r\n3 1736 19878 10065 9151 \r\n3 290 19880 19002 9152 \r\n3 2544 10675 19880 9152 \r\n3 4733 19002 10675 9152 \r\n3 1651 11458 6881 9153 \r\n3 836 17784 11458 9153 \r\n3 562 6881 17784 9153 \r\n3 4115 17944 16421 9154 \r\n3 2859 19808 17944 9154 \r\n3 2963 16421 19808 9154 \r\n3 1114 15612 11989 9155 \r\n3 1403 5290 15612 9155 \r\n3 4366 11989 5290 9155 \r\n3 4019 18305 13035 9156 \r\n3 489 19713 18305 9156 \r\n3 3371 13035 19713 9156 \r\n3 2725 13933 8741 9157 \r\n3 1053 13957 13933 9157 \r\n3 3323 8741 13957 9157 \r\n3 3138 18519 18351 9158 \r\n3 289 7958 18519 9158 \r\n3 1726 18351 7958 9158 \r\n3 4727 19005 19877 9159 \r\n3 1945 7925 19005 9159 \r\n3 412 19877 7925 9159 \r\n3 3951 11408 6602 9160 \r\n3 2717 10172 11408 9160 \r\n3 3969 6602 10172 9160 \r\n3 1686 17235 10949 9161 \r\n3 4308 19379 17235 9161 \r\n3 4183 10949 19379 9161 \r\n3 4525 15524 12886 9162 \r\n3 546 8227 15524 9162 \r\n3 50 12886 8227 9162 \r\n3 510 13103 19695 9163 \r\n3 1319 7652 13103 9163 \r\n3 3080 19695 7652 9163 \r\n3 987 18959 17301 9164 \r\n3 949 18772 18959 9164 \r\n3 2220 17301 18772 9164 \r\n3 3350 19611 11370 9165 \r\n3 507 7575 19611 9165 \r\n3 2575 11370 7575 9165 \r\n3 2041 14379 18688 9166 \r\n3 3501 5807 14379 9166 \r\n3 502 18688 5807 9166 \r\n3 1724 12930 14831 9167 \r\n3 4824 7840 12930 9167 \r\n3 4272 14831 7840 9167 \r\n3 4320 8129 18016 9168 \r\n3 3328 19773 8129 9168 \r\n3 1218 18016 19773 9168 \r\n3 1582 18704 19402 9169 \r\n3 1090 5315 18704 9169 \r\n3 681 19402 5315 9169 \r\n3 847 19418 19881 9170 \r\n3 3637 19076 19418 9170 \r\n3 4872 19881 19076 9170 \r\n3 2943 19319 15790 9171 \r\n3 2023 17898 19319 9171 \r\n3 4026 15790 17898 9171 \r\n3 195 17193 19882 9172 \r\n3 1425 19449 17193 9172 \r\n3 1436 19882 19449 9172 \r\n3 3013 19720 15059 9173 \r\n3 4365 17486 19720 9173 \r\n3 4228 15059 17486 9173 \r\n3 167 19883 5211 9174 \r\n3 1655 11672 19883 9174 \r\n3 3959 5211 11672 9174 \r\n3 3926 15281 19621 9175 \r\n3 2455 17709 15281 9175 \r\n3 359 19621 17709 9175 \r\n3 786 6152 12176 9176 \r\n3 2019 11030 6152 9176 \r\n3 2585 12176 11030 9176 \r\n3 3315 12171 17656 9177 \r\n3 3407 19001 12171 9177 \r\n3 281 17656 19001 9177 \r\n3 4661 19884 11098 9178 \r\n3 977 19015 19884 9178 \r\n3 2451 11098 19015 9178 \r\n3 4582 5515 11615 9179 \r\n3 3441 8573 5515 9179 \r\n3 3834 11615 8573 9179 \r\n3 3837 19885 8416 9180 \r\n3 66 9555 19885 9180 \r\n3 1864 8416 9555 9180 \r\n3 3285 8218 16623 9181 \r\n3 3191 17545 8218 9181 \r\n3 3065 16623 17545 9181 \r\n3 2989 16130 19854 9182 \r\n3 52 16121 16130 9182 \r\n3 4948 19854 16121 9182 \r\n3 1727 12760 7613 9183 \r\n3 759 19359 12760 9183 \r\n3 2482 7613 19359 9183 \r\n3 4284 7759 18974 9184 \r\n3 3716 16012 7759 9184 \r\n3 477 18974 16012 9184 \r\n3 1912 8818 12108 9185 \r\n3 2210 19292 8818 9185 \r\n3 1450 12108 19292 9185 \r\n3 150 14557 19886 9186 \r\n3 168 16930 14557 9186 \r\n3 2254 19886 16930 9186 \r\n3 4325 15791 18459 9187 \r\n3 4026 15010 15791 9187 \r\n3 2981 18459 15010 9187 \r\n3 657 18646 10596 9188 \r\n3 1751 8146 18646 9188 \r\n3 193 10596 8146 9188 \r\n3 414 5573 19530 9189 \r\n3 4571 19107 5573 9189 \r\n3 4 19530 19107 9189 \r\n3 560 18627 18261 9190 \r\n3 2636 18121 18627 9190 \r\n3 672 18261 18121 9190 \r\n3 2523 17125 19887 9191 \r\n3 3940 14269 17125 9191 \r\n3 4083 19887 14269 9191 \r\n3 4875 10313 19879 9192 \r\n3 3676 19634 10313 9192 \r\n3 4263 19879 19634 9192 \r\n3 4717 19290 16039 9193 \r\n3 58 5215 19290 9193 \r\n3 3186 16039 5215 9193 \r\n3 1109 16352 12422 9194 \r\n3 1743 12545 16352 9194 \r\n3 2128 12422 12545 9194 \r\n3 4661 19556 19884 9195 \r\n3 1257 19888 19556 9195 \r\n3 977 19884 19888 9195 \r\n3 1362 7708 19815 9196 \r\n3 3800 19509 7708 9196 \r\n3 2585 19815 19509 9196 \r\n3 3967 19056 5660 9197 \r\n3 4868 19491 19056 9197 \r\n3 1810 5660 19491 9197 \r\n3 2176 15397 18858 9198 \r\n3 1019 15067 15397 9198 \r\n3 795 18858 15067 9198 \r\n3 1017 10892 18078 9199 \r\n3 0 19689 10892 9199 \r\n3 4949 18078 19689 9199 \r\n3 1998 11221 19550 9200 \r\n3 3254 9213 11221 9200 \r\n3 542 19550 9213 9200 \r\n3 4866 18131 7657 9201 \r\n3 817 5724 18131 9201 \r\n3 1110 7657 5724 9201 \r\n3 3522 14241 19160 9202 \r\n3 631 10795 14241 9202 \r\n3 4681 19160 10795 9202 \r\n3 130 8581 19890 9203 \r\n3 4405 19889 8581 9203 \r\n3 2306 19890 19889 9203 \r\n3 1857 19891 13840 9204 \r\n3 123 17476 19891 9204 \r\n3 3985 13840 17476 9204 \r\n3 4524 9809 6080 9205 \r\n3 4015 17269 9809 9205 \r\n3 1323 6080 17269 9205 \r\n3 3928 5266 19892 9206 \r\n3 3503 16831 5266 9206 \r\n3 930 19892 16831 9206 \r\n3 3143 17881 14361 9207 \r\n3 2897 8723 17881 9207 \r\n3 3569 14361 8723 9207 \r\n3 152 15837 19561 9208 \r\n3 1499 19734 15837 9208 \r\n3 4611 19561 19734 9208 \r\n3 2453 19894 9643 9209 \r\n3 3362 19893 19894 9209 \r\n3 4701 9643 19893 9209 \r\n3 1004 18786 12044 9210 \r\n3 1693 19830 18786 9210 \r\n3 3200 12044 19830 9210 \r\n3 127 19895 15708 9211 \r\n3 1105 14277 19895 9211 \r\n3 530 15708 14277 9211 \r\n3 163 6411 19298 9212 \r\n3 2005 19576 6411 9212 \r\n3 754 19298 19576 9212 \r\n3 4577 15904 16860 9213 \r\n3 499 19896 15904 9213 \r\n3 2352 16860 19896 9213 \r\n3 1745 19224 14390 9214 \r\n3 1881 19778 19224 9214 \r\n3 3995 14390 19778 9214 \r\n3 4788 19898 19897 9215 \r\n3 4867 15292 19898 9215 \r\n3 2857 19897 15292 9215 \r\n3 2210 15913 14425 9216 \r\n3 3261 6778 15913 9216 \r\n3 3945 14425 6778 9216 \r\n3 4932 18989 9981 9217 \r\n3 2290 19899 18989 9217 \r\n3 1733 9981 19899 9217 \r\n3 4882 17328 16286 9218 \r\n3 3839 14514 17328 9218 \r\n3 288 16286 14514 9218 \r\n3 887 10486 5168 9219 \r\n3 2988 19900 10486 9219 \r\n3 1777 5168 19900 9219 \r\n3 4168 16018 18751 9220 \r\n3 1317 19766 16018 9220 \r\n3 4758 18751 19766 9220 \r\n3 52 9466 16122 9221 \r\n3 38 19901 9466 9221 \r\n3 327 16122 19901 9221 \r\n3 1919 8721 19179 9222 \r\n3 2897 18246 8721 9222 \r\n3 1474 19179 18246 9222 \r\n3 320 5376 12762 9223 \r\n3 420 15126 5376 9223 \r\n3 759 12762 15126 9223 \r\n3 4712 5302 18052 9224 \r\n3 3225 13308 5302 9224 \r\n3 3724 18052 13308 9224 \r\n3 2999 10979 5414 9225 \r\n3 2001 18851 10979 9225 \r\n3 708 5414 18851 9225 \r\n3 1534 18055 6089 9226 \r\n3 4908 18453 18055 9226 \r\n3 365 6089 18453 9226 \r\n3 3699 15092 18286 9227 \r\n3 76 16732 15092 9227 \r\n3 3234 18286 16732 9227 \r\n3 2551 19748 19801 9228 \r\n3 3736 13927 19748 9228 \r\n3 2976 19801 13927 9228 \r\n3 3181 19902 15429 9229 \r\n3 410 11137 19902 9229 \r\n3 3502 15429 11137 9229 \r\n3 344 12444 10341 9230 \r\n3 1346 18865 12444 9230 \r\n3 3996 10341 18865 9230 \r\n3 528 16388 17427 9231 \r\n3 1888 19903 16388 9231 \r\n3 4911 17427 19903 9231 \r\n3 4971 14856 13993 9232 \r\n3 464 13185 14856 9232 \r\n3 4672 13993 13185 9232 \r\n3 1545 12822 14765 9233 \r\n3 1101 14842 12822 9233 \r\n3 1533 14765 14842 9233 \r\n3 3870 6002 7106 9234 \r\n3 243 15384 6002 9234 \r\n3 4807 7106 15384 9234 \r\n3 161 17603 10449 9235 \r\n3 3965 19328 17603 9235 \r\n3 3408 10449 19328 9235 \r\n3 3593 7379 18997 9236 \r\n3 4034 14009 7379 9236 \r\n3 4697 18997 14009 9236 \r\n3 4762 14249 19904 9237 \r\n3 4430 9992 14249 9237 \r\n3 1803 19904 9992 9237 \r\n3 4697 16495 11142 9238 \r\n3 2318 12298 16495 9238 \r\n3 4755 11142 12298 9238 \r\n3 1123 19906 19375 9239 \r\n3 3571 19905 19906 9239 \r\n3 1594 19375 19905 9239 \r\n3 2768 15943 19553 9240 \r\n3 4553 16093 15943 9240 \r\n3 1794 19553 16093 9240 \r\n3 2631 9051 12550 9241 \r\n3 239 15619 9051 9241 \r\n3 4010 12550 15619 9241 \r\n3 273 17458 18849 9242 \r\n3 4928 19868 17458 9242 \r\n3 4593 18849 19868 9242 \r\n3 617 12441 9753 9243 \r\n3 1032 16575 12441 9243 \r\n3 1590 9753 16575 9243 \r\n3 1882 10435 14624 9244 \r\n3 1617 19907 10435 9244 \r\n3 2862 14624 19907 9244 \r\n3 4351 19529 10000 9245 \r\n3 3101 19908 19529 9245 \r\n3 1929 10000 19908 9245 \r\n3 757 8868 19742 9246 \r\n3 3354 18994 8868 9246 \r\n3 4994 19742 18994 9246 \r\n3 2511 19494 17625 9247 \r\n3 4739 7828 19494 9247 \r\n3 421 17625 7828 9247 \r\n3 1229 19909 16836 9248 \r\n3 3400 14282 19909 9248 \r\n3 1411 16836 14282 9248 \r\n3 930 17882 19892 9249 \r\n3 4326 19241 17882 9249 \r\n3 3928 19892 19241 9249 \r\n3 2457 12103 17068 9250 \r\n3 2714 13347 12103 9250 \r\n3 4347 17068 13347 9250 \r\n3 831 19796 18973 9251 \r\n3 3053 15678 19796 9251 \r\n3 1271 18973 15678 9251 \r\n3 2747 19519 19320 9252 \r\n3 836 11457 19519 9252 \r\n3 3328 19320 11457 9252 \r\n3 3634 18120 15754 9253 \r\n3 1406 9740 18120 9253 \r\n3 3678 15754 9740 9253 \r\n3 3684 18947 15040 9254 \r\n3 1444 14962 18947 9254 \r\n3 3184 15040 14962 9254 \r\n3 4032 15284 5974 9255 \r\n3 2847 10363 15284 9255 \r\n3 4912 5974 10363 9255 \r\n3 767 19910 7913 9256 \r\n3 2142 15999 19910 9256 \r\n3 3576 7913 15999 9256 \r\n3 32 18940 7606 9257 \r\n3 1812 13224 18940 9257 \r\n3 26 7606 13224 9257 \r\n3 1819 7827 19083 9258 \r\n3 4459 12843 7827 9258 \r\n3 1269 19083 12843 9258 \r\n3 1440 18589 5864 9259 \r\n3 3481 19911 18589 9259 \r\n3 1705 5864 19911 9259 \r\n3 3277 15308 10235 9260 \r\n3 4741 19912 15308 9260 \r\n3 1185 10235 19912 9260 \r\n3 691 10520 19269 9261 \r\n3 4154 18905 10520 9261 \r\n3 3689 19269 18905 9261 \r\n3 3470 19866 17457 9262 \r\n3 2478 11169 19866 9262 \r\n3 2601 17457 11169 9262 \r\n3 2500 19090 19913 9263 \r\n3 3644 17115 19090 9263 \r\n3 4340 19913 17115 9263 \r\n3 526 14146 19212 9264 \r\n3 183 17919 14146 9264 \r\n3 474 19212 17919 9264 \r\n3 3831 19764 12758 9265 \r\n3 4913 17566 19764 9265 \r\n3 4451 12758 17566 9265 \r\n3 3933 17488 19256 9266 \r\n3 2193 9422 17488 9266 \r\n3 2694 19256 9422 9266 \r\n3 4236 8598 17224 9267 \r\n3 3029 8708 8598 9267 \r\n3 2501 17224 8708 9267 \r\n3 4515 10340 11917 9268 \r\n3 3996 19384 10340 9268 \r\n3 1568 11917 19384 9268 \r\n3 1671 14225 9230 9269 \r\n3 2901 9041 14225 9269 \r\n3 2567 9230 9041 9269 \r\n3 2627 19915 14526 9270 \r\n3 2356 19914 19915 9270 \r\n3 388 14526 19914 9270 \r\n3 4301 15804 12536 9271 \r\n3 4621 17374 15804 9271 \r\n3 4927 12536 17374 9271 \r\n3 1200 17304 19916 9272 \r\n3 199 19423 17304 9272 \r\n3 1162 19916 19423 9272 \r\n3 2229 19126 11710 9273 \r\n3 3202 11601 19126 9273 \r\n3 3998 11710 11601 9273 \r\n3 4716 17548 18690 9274 \r\n3 3041 19917 17548 9274 \r\n3 89 18690 19917 9274 \r\n3 2676 8764 8156 9275 \r\n3 2524 19622 8764 9275 \r\n3 4411 8156 19622 9275 \r\n3 2005 7330 19574 9276 \r\n3 1171 18593 7330 9276 \r\n3 329 19574 18593 9276 \r\n3 4767 8892 9189 9277 \r\n3 2053 10278 8892 9277 \r\n3 1160 9189 10278 9277 \r\n3 337 19786 19822 9278 \r\n3 958 10880 19786 9278 \r\n3 4572 19822 10880 9278 \r\n3 542 15673 15330 9279 \r\n3 2589 18516 15673 9279 \r\n3 4044 15330 18516 9279 \r\n3 4090 19239 19211 9280 \r\n3 1827 18190 19239 9280 \r\n3 1521 19211 18190 9280 \r\n3 4469 19206 14672 9281 \r\n3 68 19374 19206 9281 \r\n3 236 14672 19374 9281 \r\n3 4777 15675 16368 9282 \r\n3 3636 19422 15675 9282 \r\n3 1343 16368 19422 9282 \r\n3 3255 17728 14489 9283 \r\n3 4957 13129 17728 9283 \r\n3 267 14489 13129 9283 \r\n3 1005 19615 13655 9284 \r\n3 214 5646 19615 9284 \r\n3 249 13655 5646 9284 \r\n3 936 5749 6213 9285 \r\n3 1348 15455 5749 9285 \r\n3 475 6213 15455 9285 \r\n3 3965 15148 19326 9286 \r\n3 3282 14840 15148 9286 \r\n3 1101 19326 14840 9286 \r\n3 1971 14585 14580 9287 \r\n3 841 17655 14585 9287 \r\n3 4365 14580 17655 9287 \r\n3 365 19557 9975 9288 \r\n3 2110 11926 19557 9288 \r\n3 1097 9975 11926 9288 \r\n3 2307 16475 17080 9289 \r\n3 4033 9490 16475 9289 \r\n3 3316 17080 9490 9289 \r\n3 3862 5596 19919 9290 \r\n3 2288 19918 5596 9290 \r\n3 4904 19919 19918 9290 \r\n3 196 18932 10141 9291 \r\n3 150 19886 18932 9291 \r\n3 2254 10141 19886 9291 \r\n3 1952 19648 19920 9292 \r\n3 2597 9626 19648 9292 \r\n3 3790 19920 9626 9292 \r\n3 2915 19369 19705 9293 \r\n3 4817 19207 19369 9293 \r\n3 3054 19705 19207 9293 \r\n3 3180 14940 19376 9294 \r\n3 557 12433 14940 9294 \r\n3 3685 19376 12433 9294 \r\n3 1853 7358 19451 9295 \r\n3 2535 17418 7358 9295 \r\n3 4786 19451 17418 9295 \r\n3 1281 16512 17165 9296 \r\n3 2828 19388 16512 9296 \r\n3 2179 17165 19388 9296 \r\n3 2026 8853 19623 9297 \r\n3 1797 16649 8853 9297 \r\n3 3067 19623 16649 9297 \r\n3 2303 15658 13460 9298 \r\n3 2723 19443 15658 9298 \r\n3 4286 13460 19443 9298 \r\n3 4979 12114 19351 9299 \r\n3 4651 14876 12114 9299 \r\n3 2798 19351 14876 9299 \r\n3 1569 7931 11230 9300 \r\n3 632 6818 7931 9300 \r\n3 1665 11230 6818 9300 \r\n3 238 8461 19350 9301 \r\n3 4660 19824 8461 9301 \r\n3 3336 19350 19824 9301 \r\n3 1994 7496 16315 9302 \r\n3 61 12765 7496 9302 \r\n3 1311 16315 12765 9302 \r\n3 268 19709 10114 9303 \r\n3 1284 18670 19709 9303 \r\n3 385 10114 18670 9303 \r\n3 2046 19921 18318 9304 \r\n3 166 7746 19921 9304 \r\n3 2735 18318 7746 9304 \r\n3 3153 13742 19594 9305 \r\n3 4779 5942 13742 9305 \r\n3 1826 19594 5942 9305 \r\n3 3290 12365 12342 9306 \r\n3 3465 19922 12365 9306 \r\n3 312 12342 19922 9306 \r\n3 2577 16176 14736 9307 \r\n3 1112 19768 16176 9307 \r\n3 1628 14736 19768 9307 \r\n3 2453 12064 19894 9308 \r\n3 2889 14943 12064 9308 \r\n3 3362 19894 14943 9308 \r\n3 2219 17524 14844 9309 \r\n3 2004 18128 17524 9309 \r\n3 4776 14844 18128 9309 \r\n3 1318 8114 19714 9310 \r\n3 2334 18743 8114 9310 \r\n3 2330 19714 18743 9310 \r\n3 3727 9284 15222 9311 \r\n3 4781 19923 9284 9311 \r\n3 4667 15222 19923 9311 \r\n3 933 18992 13547 9312 \r\n3 416 7184 18992 9312 \r\n3 3271 13547 7184 9312 \r\n3 2357 12718 8696 9313 \r\n3 2144 19821 12718 9313 \r\n3 4341 8696 19821 9313 \r\n3 276 18312 11155 9314 \r\n3 2595 11518 18312 9314 \r\n3 675 11155 11518 9314 \r\n3 4174 15027 18841 9315 \r\n3 783 13755 15027 9315 \r\n3 3450 18841 13755 9315 \r\n3 2775 15815 16603 9316 \r\n3 1703 14070 15815 9316 \r\n3 4991 16603 14070 9316 \r\n3 4603 14808 19924 9317 \r\n3 1785 11686 14808 9317 \r\n3 2264 19924 11686 9317 \r\n3 111 10639 18006 9318 \r\n3 2500 19925 10639 9318 \r\n3 2185 18006 19925 9318 \r\n3 664 13010 16730 9319 \r\n3 336 15842 13010 9319 \r\n3 3118 16730 15842 9319 \r\n3 4722 18911 9982 9320 \r\n3 593 17127 18911 9320 \r\n3 3501 9982 17127 9320 \r\n3 2940 19862 18901 9321 \r\n3 1527 6137 19862 9321 \r\n3 4930 18901 6137 9321 \r\n3 1851 5538 17850 9322 \r\n3 1929 19908 5538 9322 \r\n3 3101 17850 19908 9322 \r\n3 1921 8992 13869 9323 \r\n3 2848 14657 8992 9323 \r\n3 4329 13869 14657 9323 \r\n3 3745 19807 19926 9324 \r\n3 566 16207 19807 9324 \r\n3 1288 19926 16207 9324 \r\n3 1496 16726 18325 9325 \r\n3 1732 16083 16726 9325 \r\n3 4462 18325 16083 9325 \r\n3 392 18528 10071 9326 \r\n3 4145 6651 18528 9326 \r\n3 332 10071 6651 9326 \r\n3 982 16291 17256 9327 \r\n3 2313 19482 16291 9327 \r\n3 2659 17256 19482 9327 \r\n3 4904 19929 19928 9328 \r\n3 3229 19927 19929 9328 \r\n3 1539 19928 19927 9328 \r\n3 2734 5805 19930 9329 \r\n3 1151 19850 5805 9329 \r\n3 4579 19930 19850 9329 \r\n3 2980 16585 13361 9330 \r\n3 789 8670 16585 9330 \r\n3 2015 13361 8670 9330 \r\n3 3448 14602 16770 9331 \r\n3 2247 19848 14602 9331 \r\n3 2025 16770 19848 9331 \r\n3 2443 17018 16573 9332 \r\n3 667 13863 17018 9332 \r\n3 1167 16573 13863 9332 \r\n3 3521 13539 18668 9333 \r\n3 2297 8693 13539 9333 \r\n3 3888 18668 8693 9333 \r\n3 3754 19861 6901 9334 \r\n3 1527 19116 19861 9334 \r\n3 2244 6901 19116 9334 \r\n3 2407 14161 14970 9335 \r\n3 4518 18350 14161 9335 \r\n3 1424 14970 18350 9335 \r\n3 2563 8190 19811 9336 \r\n3 4339 19296 8190 9336 \r\n3 4241 19811 19296 9336 \r\n3 3324 9963 6585 9337 \r\n3 4777 17200 9963 9337 \r\n3 2918 6585 17200 9337 \r\n3 977 19888 6826 9338 \r\n3 1257 18419 19888 9338 \r\n3 3757 6826 18419 9338 \r\n3 4004 19582 13810 9339 \r\n3 2991 12574 19582 9339 \r\n3 2582 13810 12574 9339 \r\n3 1101 16720 19327 9340 \r\n3 3466 16387 16720 9340 \r\n3 3408 19327 16387 9340 \r\n3 2592 14362 13130 9341 \r\n3 3509 15843 14362 9341 \r\n3 1027 13130 15843 9341 \r\n3 1238 18711 19932 9342 \r\n3 4249 19931 18711 9342 \r\n3 2243 19932 19931 9342 \r\n3 1991 10222 14644 9343 \r\n3 1213 11791 10222 9343 \r\n3 189 14644 11791 9343 \r\n3 3295 6450 12970 9344 \r\n3 3469 5912 6450 9344 \r\n3 2049 12970 5912 9344 \r\n3 1542 19602 9677 9345 \r\n3 2365 14777 19602 9345 \r\n3 141 9677 14777 9345 \r\n3 2979 19137 13762 9346 \r\n3 1692 19649 19137 9346 \r\n3 1789 13762 19649 9346 \r\n3 3291 19785 19377 9347 \r\n3 2241 9909 19785 9347 \r\n3 1531 19377 9909 9347 \r\n3 4978 7328 9675 9348 \r\n3 4078 17893 7328 9348 \r\n3 4022 9675 17893 9348 \r\n3 3032 11526 11709 9349 \r\n3 1439 13024 11526 9349 \r\n3 4620 11709 13024 9349 \r\n3 1313 5632 16877 9350 \r\n3 899 8517 5632 9350 \r\n3 3763 16877 8517 9350 \r\n3 2653 19933 19152 9351 \r\n3 4788 19897 19933 9351 \r\n3 2857 19152 19897 9351 \r\n3 4300 7535 18524 9352 \r\n3 1762 16374 7535 9352 \r\n3 2619 18524 16374 9352 \r\n3 1396 14169 10399 9353 \r\n3 2286 18266 14169 9353 \r\n3 756 10399 18266 9353 \r\n3 1867 14336 6731 9354 \r\n3 4021 17334 14336 9354 \r\n3 1685 6731 17334 9354 \r\n3 3362 18969 19893 9355 \r\n3 211 7761 18969 9355 \r\n3 4701 19893 7761 9355 \r\n3 2018 19265 18857 9356 \r\n3 1894 14312 19265 9356 \r\n3 1615 18857 14312 9356 \r\n3 1881 9424 11730 9357 \r\n3 1238 19932 9424 9357 \r\n3 2243 11730 19932 9357 \r\n3 3664 17311 9079 9358 \r\n3 4870 19332 17311 9358 \r\n3 120 9079 19332 9358 \r\n3 2211 14625 17716 9359 \r\n3 1427 19506 14625 9359 \r\n3 4986 17716 19506 9359 \r\n3 1365 19935 19934 9360 \r\n3 466 8888 19935 9360 \r\n3 3663 19934 8888 9360 \r\n3 1668 12399 7880 9361 \r\n3 3828 8714 12399 9361 \r\n3 3338 7880 8714 9361 \r\n3 260 15991 19111 9362 \r\n3 4315 17270 15991 9362 \r\n3 2048 19111 17270 9362 \r\n3 1022 17128 19299 9363 \r\n3 879 17774 17128 9363 \r\n3 3071 19299 17774 9363 \r\n3 1836 9082 19936 9364 \r\n3 2202 14538 9082 9364 \r\n3 2362 19936 14538 9364 \r\n3 997 12878 6107 9365 \r\n3 4603 19924 12878 9365 \r\n3 2264 6107 19924 9365 \r\n3 3980 19549 13894 9366 \r\n3 1150 19937 19549 9366 \r\n3 4189 13894 19937 9366 \r\n3 2795 7676 7048 9367 \r\n3 1928 10288 7676 9367 \r\n3 421 7048 10288 9367 \r\n3 2204 11225 5467 9368 \r\n3 1339 5874 11225 9368 \r\n3 4715 5467 5874 9368 \r\n3 966 15586 19938 9369 \r\n3 4394 19798 15586 9369 \r\n3 942 19938 19798 9369 \r\n3 1215 13309 19876 9370 \r\n3 190 19674 13309 9370 \r\n3 2590 19876 19674 9370 \r\n3 89 19917 17646 9371 \r\n3 3041 19381 19917 9371 \r\n3 440 17646 19381 9371 \r\n3 1629 19939 14992 9372 \r\n3 1096 10744 19939 9372 \r\n3 85 14992 10744 9372 \r\n3 46 17015 5239 9373 \r\n3 3320 19851 17015 9373 \r\n3 255 5239 19851 9373 \r\n3 1972 10169 17492 9374 \r\n3 3214 5532 10169 9374 \r\n3 2586 17492 5532 9374 \r\n3 4709 19940 9648 9375 \r\n3 1544 15234 19940 9375 \r\n3 1522 9648 15234 9375 \r\n3 832 7692 13415 9376 \r\n3 126 19941 7692 9376 \r\n3 1389 13415 19941 9376 \r\n3 2356 19915 18538 9377 \r\n3 2627 10086 19915 9377 \r\n3 4079 18538 10086 9377 \r\n3 2932 18372 16369 9378 \r\n3 2748 15669 18372 9378 \r\n3 2911 16369 15669 9378 \r\n3 4115 16420 14662 9379 \r\n3 749 19942 16420 9379 \r\n3 1434 14662 19942 9379 \r\n3 1834 11053 15797 9380 \r\n3 4048 16216 11053 9380 \r\n3 1251 15797 16216 9380 \r\n3 2294 19407 15445 9381 \r\n3 741 14495 19407 9381 \r\n3 4644 15445 14495 9381 \r\n3 3880 19693 16189 9382 \r\n3 1627 9901 19693 9382 \r\n3 1848 16189 9901 9382 \r\n3 4104 15250 13169 9383 \r\n3 1980 19154 15250 9383 \r\n3 359 13169 19154 9383 \r\n3 3420 19943 8532 9384 \r\n3 3137 7628 19943 9384 \r\n3 2899 8532 7628 9384 \r\n3 4146 11976 18667 9385 \r\n3 22 12604 11976 9385 \r\n3 3521 18667 12604 9385 \r\n3 4710 16917 18035 9386 \r\n3 3956 19672 16917 9386 \r\n3 2118 18035 19672 9386 \r\n3 4980 19752 5699 9387 \r\n3 1631 19694 19752 9387 \r\n3 1957 5699 19694 9387 \r\n3 511 14187 19859 9388 \r\n3 100 15820 14187 9388 \r\n3 260 19859 15820 9388 \r\n3 1500 8624 14503 9389 \r\n3 4966 19944 8624 9389 \r\n3 158 14503 19944 9389 \r\n3 1831 5839 19945 9390 \r\n3 3096 13126 5839 9390 \r\n3 3221 19945 13126 9390 \r\n3 4709 18460 19940 9391 \r\n3 3239 19678 18460 9391 \r\n3 1544 19940 19678 9391 \r\n3 4788 19933 11058 9392 \r\n3 2653 15762 19933 9392 \r\n3 4350 11058 15762 9392 \r\n3 546 19475 19946 9393 \r\n3 4123 18793 19475 9393 \r\n3 3486 19946 18793 9393 \r\n3 222 19947 15794 9394 \r\n3 3137 19943 19947 9394 \r\n3 3420 15794 19943 9394 \r\n3 264 11953 15553 9395 \r\n3 3039 19782 11953 9395 \r\n3 2553 15553 19782 9395 \r\n3 4968 19948 9212 9396 \r\n3 3725 11189 19948 9396 \r\n3 3233 9212 11189 9396 \r\n3 1071 16293 19196 9397 \r\n3 1038 12853 16293 9397 \r\n3 4677 19196 12853 9397 \r\n3 3951 6604 7304 9398 \r\n3 4252 19805 6604 9398 \r\n3 2328 7304 19805 9398 \r\n3 2605 13522 16507 9399 \r\n3 1917 14979 13522 9399 \r\n3 476 16507 14979 9399 \r\n3 135 9131 7966 9400 \r\n3 21 8284 9131 9400 \r\n3 2301 7966 8284 9400 \r\n3 3448 16771 18490 9401 \r\n3 739 13596 16771 9401 \r\n3 2745 18490 13596 9401 \r\n3 3978 19382 9684 9402 \r\n3 3921 8815 19382 9402 \r\n3 1062 9684 8815 9402 \r\n3 3083 19253 12951 9403 \r\n3 583 14457 19253 9403 \r\n3 1179 12951 14457 9403 \r\n3 3229 19929 9811 9404 \r\n3 4904 19918 19929 9404 \r\n3 2288 9811 19918 9404 \r\n3 4238 12008 11139 9405 \r\n3 3268 19949 12008 9405 \r\n3 2846 11139 19949 9405 \r\n3 2288 19088 9812 9406 \r\n3 3864 13368 19088 9406 \r\n3 4062 9812 13368 9406 \r\n3 3121 19311 12635 9407 \r\n3 625 14904 19311 9407 \r\n3 3879 12635 14904 9407 \r\n3 3993 18547 17585 9408 \r\n3 2084 18389 18547 9408 \r\n3 2971 17585 18389 9408 \r\n3 2008 8789 19950 9409 \r\n3 4307 11693 8789 9409 \r\n3 1552 19950 11693 9409 \r\n3 2841 18394 8504 9410 \r\n3 4720 14188 18394 9410 \r\n3 203 8504 14188 9410 \r\n3 90 19006 14518 9411 \r\n3 1228 18328 19006 9411 \r\n3 1393 14518 18328 9411 \r\n3 3506 15542 14029 9412 \r\n3 4177 18760 15542 9412 \r\n3 1408 14029 18760 9412 \r\n3 383 19754 15705 9413 \r\n3 1050 19022 19754 9413 \r\n3 2403 15705 19022 9413 \r\n3 820 12945 16885 9414 \r\n3 2792 19951 12945 9414 \r\n3 3530 16885 19951 9414 \r\n3 2228 18526 18612 9415 \r\n3 3992 16792 18526 9415 \r\n3 3178 18612 16792 9415 \r\n3 1385 14995 6677 9416 \r\n3 4240 5444 14995 9416 \r\n3 1084 6677 5444 9416 \r\n3 4379 12087 12305 9417 \r\n3 2645 19952 12087 9417 \r\n3 2598 12305 19952 9417 \r\n3 4909 11068 19716 9418 \r\n3 1555 19084 11068 9418 \r\n3 3821 19716 19084 9418 \r\n3 327 19953 16123 9419 \r\n3 4243 18251 19953 9419 \r\n3 4948 16123 18251 9419 \r\n3 737 8335 8533 9420 \r\n3 466 19935 8335 9420 \r\n3 1365 8533 19935 9420 \r\n3 2802 19654 14799 9421 \r\n3 1961 18544 19654 9421 \r\n3 3845 14799 18544 9421 \r\n3 1792 19857 16983 9422 \r\n3 4312 12345 19857 9422 \r\n3 1908 16983 12345 9422 \r\n3 308 19386 15304 9423 \r\n3 195 19882 19386 9423 \r\n3 1436 15304 19882 9423 \r\n3 1704 19484 19954 9424 \r\n3 3480 11176 19484 9424 \r\n3 4935 19954 11176 9424 \r\n3 30 14941 12719 9425 \r\n3 3180 10309 14941 9425 \r\n3 2829 12719 10309 9425 \r\n3 3516 19955 6936 9426 \r\n3 4860 17440 19955 9426 \r\n3 205 6936 17440 9426 \r\n3 4337 17331 15318 9427 \r\n3 1892 14050 17331 9427 \r\n3 24 15318 14050 9427 \r\n3 4756 16995 11607 9428 \r\n3 352 17698 16995 9428 \r\n3 3801 11607 17698 9428 \r\n3 2504 19725 19267 9429 \r\n3 1767 18891 19725 9429 \r\n3 3614 19267 18891 9429 \r\n3 3654 5049 19497 9430 \r\n3 71 18894 5049 9430 \r\n3 911 19497 18894 9430 \r\n3 909 18503 10279 9431 \r\n3 3594 15777 18503 9431 \r\n3 2477 10279 15777 9431 \r\n3 3606 16402 19595 9432 \r\n3 1918 9444 16402 9432 \r\n3 2183 19595 9444 9432 \r\n3 126 19956 19941 9433 \r\n3 1541 14953 19956 9433 \r\n3 1389 19941 14953 9433 \r\n3 3465 8897 19957 9434 \r\n3 676 18607 8897 9434 \r\n3 1367 19957 18607 9434 \r\n3 1678 19958 6752 9435 \r\n3 2368 19712 19958 9435 \r\n3 489 6752 19712 9435 \r\n3 3977 19335 8046 9436 \r\n3 1910 19125 19335 9436 \r\n3 2039 8046 19125 9436 \r\n3 1 6642 9704 9437 \r\n3 2302 15186 6642 9437 \r\n3 3128 9704 15186 9437 \r\n3 2152 19393 19540 9438 \r\n3 4452 19129 19393 9438 \r\n3 438 19540 19129 9438 \r\n3 350 17974 7502 9439 \r\n3 734 8193 17974 9439 \r\n3 3902 7502 8193 9439 \r\n3 1785 18716 16646 9440 \r\n3 3720 13782 18716 9440 \r\n3 4557 16646 13782 9440 \r\n3 4193 19959 6425 9441 \r\n3 633 11892 19959 9441 \r\n3 2790 6425 11892 9441 \r\n3 2486 19633 6730 9442 \r\n3 39 15544 19633 9442 \r\n3 1867 6730 15544 9442 \r\n3 2988 19613 16187 9443 \r\n3 128 18410 19613 9443 \r\n3 447 16187 18410 9443 \r\n3 530 14209 15469 9444 \r\n3 4420 18311 14209 9444 \r\n3 4362 15469 18311 9444 \r\n3 1597 16447 18500 9445 \r\n3 3444 16200 16447 9445 \r\n3 1178 18500 16200 9445 \r\n3 465 10741 11171 9446 \r\n3 2054 9181 10741 9446 \r\n3 2941 11171 9181 9446 \r\n3 3512 17833 19004 9447 \r\n3 2612 16273 17833 9447 \r\n3 1024 19004 16273 9447 \r\n3 1818 19960 12477 9448 \r\n3 3308 16377 19960 9448 \r\n3 2057 12477 16377 9448 \r\n3 4101 19587 8049 9449 \r\n3 3259 5783 19587 9449 \r\n3 4640 8049 5783 9449 \r\n3 2803 18986 15609 9450 \r\n3 3463 18686 18986 9450 \r\n3 2066 15609 18686 9450 \r\n3 4844 9329 8423 9451 \r\n3 3583 13216 9329 9451 \r\n3 3554 8423 13216 9451 \r\n3 4410 13874 6598 9452 \r\n3 1899 13079 13874 9452 \r\n3 4140 6598 13079 9452 \r\n3 924 19177 15260 9453 \r\n3 3455 18930 19177 9453 \r\n3 1849 15260 18930 9453 \r\n3 2492 19753 6099 9454 \r\n3 1352 8690 19753 9454 \r\n3 348 6099 8690 9454 \r\n3 4788 10926 19898 9455 \r\n3 1485 17692 10926 9455 \r\n3 4867 19898 17692 9455 \r\n3 2516 7128 12983 9456 \r\n3 3750 17423 7128 9456 \r\n3 86 12983 17423 9456 \r\n3 4271 19684 6274 9457 \r\n3 1009 10360 19684 9457 \r\n3 4643 6274 10360 9457 \r\n3 2802 17658 11653 9458 \r\n3 3823 14822 17658 9458 \r\n3 875 11653 14822 9458 \r\n3 3726 11766 8040 9459 \r\n3 1712 19343 11766 9459 \r\n3 2716 8040 19343 9459 \r\n3 194 17360 19839 9460 \r\n3 846 7942 17360 9460 \r\n3 232 19839 7942 9460 \r\n3 4711 16005 9744 9461 \r\n3 2675 18187 16005 9461 \r\n3 4496 9744 18187 9461 \r\n3 4535 19961 19314 9462 \r\n3 327 19901 19961 9462 \r\n3 38 19314 19901 9462 \r\n3 389 18680 19858 9463 \r\n3 2135 14330 18680 9463 \r\n3 4162 19858 14330 9463 \r\n3 1849 19733 19962 9464 \r\n3 3469 19845 19733 9464 \r\n3 585 19962 19845 9464 \r\n3 892 13329 17234 9465 \r\n3 1184 6674 13329 9465 \r\n3 467 17234 6674 9465 \r\n3 1185 19912 19368 9466 \r\n3 4741 19242 19912 9466 \r\n3 3323 19368 19242 9466 \r\n3 2041 18687 19640 9467 \r\n3 805 19833 18687 9467 \r\n3 1035 19640 19833 9467 \r\n3 387 17564 19670 9468 \r\n3 4441 18402 17564 9468 \r\n3 3227 19670 18402 9468 \r\n3 2173 12143 11939 9469 \r\n3 388 19914 12143 9469 \r\n3 2356 11939 19914 9469 \r\n3 3517 16942 14204 9470 \r\n3 2157 9634 16942 9470 \r\n3 2443 14204 9634 9470 \r\n3 806 19180 10080 9471 \r\n3 130 19890 19180 9471 \r\n3 2306 10080 19890 9471 \r\n3 3272 8609 17522 9472 \r\n3 1044 14635 8609 9472 \r\n3 1265 17522 14635 9472 \r\n3 4131 16134 6939 9473 \r\n3 1141 13214 16134 9473 \r\n3 3583 6939 13214 9473 \r\n3 837 19455 8786 9474 \r\n3 3818 19758 19455 9474 \r\n3 4811 8786 19758 9474 \r\n3 1171 16812 14104 9475 \r\n3 3987 9872 16812 9475 \r\n3 2383 14104 9872 9475 \r\n3 1839 19846 8640 9476 \r\n3 3469 19246 19846 9476 \r\n3 2948 8640 19246 9476 \r\n3 2046 17319 19921 9477 \r\n3 1191 13478 17319 9477 \r\n3 166 19921 13478 9477 \r\n3 3189 10136 17925 9478 \r\n3 4467 18968 10136 9478 \r\n3 2410 17925 18968 9478 \r\n3 1750 16161 15578 9479 \r\n3 1423 17572 16161 9479 \r\n3 4822 15578 17572 9479 \r\n3 194 19838 18752 9480 \r\n3 4606 14894 19838 9480 \r\n3 3591 18752 14894 9480 \r\n3 4590 7336 9237 9481 \r\n3 2471 10518 7336 9481 \r\n3 691 9237 10518 9481 \r\n3 1552 15859 19950 9482 \r\n3 1682 14675 15859 9482 \r\n3 2008 19950 14675 9482 \r\n3 3381 5132 9111 9483 \r\n3 1541 19956 5132 9483 \r\n3 126 9111 19956 9483 \r\n3 3518 13897 19591 9484 \r\n3 1878 15484 13897 9484 \r\n3 343 19591 15484 9484 \r\n3 3012 5425 5658 9485 \r\n3 1043 11075 5425 9485 \r\n3 4284 5658 11075 9485 \r\n3 2902 13029 19788 9486 \r\n3 2344 15685 13029 9486 \r\n3 395 19788 15685 9486 \r\n3 4039 18195 14346 9487 \r\n3 3370 10870 18195 9487 \r\n3 4795 14346 10870 9487 \r\n3 2080 13912 13875 9488 \r\n3 3082 19685 13912 9488 \r\n3 2205 13875 19685 9488 \r\n3 3194 17406 18140 9489 \r\n3 2523 19887 17406 9489 \r\n3 4083 18140 19887 9489 \r\n3 2581 14044 10738 9490 \r\n3 4077 18732 14044 9490 \r\n3 1640 10738 18732 9490 \r\n3 4402 17592 18245 9491 \r\n3 66 19885 17592 9491 \r\n3 3837 18245 19885 9491 \r\n3 4886 8989 5248 9492 \r\n3 4943 12430 8989 9492 \r\n3 3587 5248 12430 9492 \r\n3 198 19548 16058 9493 \r\n3 668 19763 19548 9493 \r\n3 1146 16058 19763 9493 \r\n3 262 14827 9831 9494 \r\n3 4148 15871 14827 9494 \r\n3 155 9831 15871 9494 \r\n3 4063 19784 14666 9495 \r\n3 3291 8913 19784 9495 \r\n3 171 14666 8913 9495 \r\n3 1104 12642 14547 9496 \r\n3 997 6106 12642 9496 \r\n3 2469 14547 6106 9496 \r\n3 1075 9387 12750 9497 \r\n3 1176 17793 9387 9497 \r\n3 883 12750 17793 9497 \r\n3 1782 19173 18805 9498 \r\n3 4040 8008 19173 9498 \r\n3 2034 18805 8008 9498 \r\n3 2413 8171 18152 9499 \r\n3 3390 15409 8171 9499 \r\n3 3275 18152 15409 9499 \r\n3 4952 18583 19756 9500 \r\n3 2043 8370 18583 9500 \r\n3 1231 19756 8370 9500 \r\n3 1506 11859 16956 9501 \r\n3 1610 16478 11859 9501 \r\n3 210 16956 16478 9501 \r\n3 3979 19661 6039 9502 \r\n3 1199 9011 19661 9502 \r\n3 586 6039 9011 9502 \r\n3 158 11883 14504 9503 \r\n3 1026 19963 11883 9503 \r\n3 1235 14504 19963 9503 \r\n3 4348 19723 14459 9504 \r\n3 199 17305 19723 9504 \r\n3 946 14459 17305 9504 \r\n3 3976 19570 18926 9505 \r\n3 1100 15751 19570 9505 \r\n3 657 18926 15751 9505 \r\n3 4329 14656 19747 9506 \r\n3 1028 18435 14656 9506 \r\n3 1147 19747 18435 9506 \r\n3 112 18950 19686 9507 \r\n3 430 13633 18950 9507 \r\n3 1240 19686 13633 9507 \r\n3 1958 18124 17906 9508 \r\n3 4617 11040 18124 9508 \r\n3 1553 17906 11040 9508 \r\n3 87 8510 15972 9509 \r\n3 651 18252 8510 9509 \r\n3 4243 15972 18252 9509 \r\n3 2475 18856 12216 9510 \r\n3 1240 13635 18856 9510 \r\n3 2893 12216 13635 9510 \r\n3 1619 17174 14335 9511 \r\n3 1667 15124 17174 9511 \r\n3 1298 14335 15124 9511 \r\n3 128 19800 18411 9512 \r\n3 2272 13558 19800 9512 \r\n3 2016 18411 13558 9512 \r\n3 4535 14749 19961 9513 \r\n3 4243 19953 14749 9513 \r\n3 327 19961 19953 9513 \r\n3 4480 10608 16158 9514 \r\n3 4789 14280 10608 9514 \r\n3 4332 16158 14280 9514 \r\n3 1422 16499 16049 9515 \r\n3 3365 14316 16499 9515 \r\n3 1830 16049 14316 9515 \r\n3 3695 19863 19431 9516 \r\n3 2907 13004 19863 9516 \r\n3 1702 19431 13004 9516 \r\n3 357 17093 17261 9517 \r\n3 2236 15115 17093 9517 \r\n3 2630 17261 15115 9517 \r\n3 3235 12996 19707 9518 \r\n3 4582 15002 12996 9518 \r\n3 845 19707 15002 9518 \r\n3 1788 19054 16144 9519 \r\n3 1804 17532 19054 9519 \r\n3 2986 16144 17532 9519 \r\n3 2401 16978 18507 9520 \r\n3 3236 17489 16978 9520 \r\n3 3933 18507 17489 9520 \r\n3 197 18337 19964 9521 \r\n3 1519 19517 18337 9521 \r\n3 808 19964 19517 9521 \r\n3 3571 17053 19905 9522 \r\n3 3657 9322 17053 9522 \r\n3 1594 19905 9322 9522 \r\n3 2937 19965 19625 9523 \r\n3 4627 15383 19965 9523 \r\n3 55 19625 15383 9523 \r\n3 3874 19213 12879 9524 \r\n3 220 10648 19213 9524 \r\n3 4871 12879 10648 9524 \r\n3 3309 18644 18163 9525 \r\n3 1429 19195 18644 9525 \r\n3 1724 18163 19195 9525 \r\n3 3108 11102 14673 9526 \r\n3 1134 19037 11102 9526 \r\n3 2667 14673 19037 9526 \r\n3 4855 19472 18661 9527 \r\n3 3137 19947 19472 9527 \r\n3 222 18661 19947 9527 \r\n3 311 11179 16909 9528 \r\n3 4765 19966 11179 9528 \r\n3 2752 16909 19966 9528 \r\n3 2511 13871 13498 9529 \r\n3 2749 9157 13871 9529 \r\n3 3561 13498 9157 9529 \r\n3 3542 9629 14617 9530 \r\n3 1722 16946 9629 9530 \r\n3 1759 14617 16946 9530 \r\n3 4882 14107 12499 9531 \r\n3 3166 15879 14107 9531 \r\n3 2483 12499 15879 9531 \r\n3 1431 7790 19590 9532 \r\n3 3094 13041 7790 9532 \r\n3 2531 19590 13041 9532 \r\n3 773 19789 19291 9533 \r\n3 4558 13820 19789 9533 \r\n3 4426 19291 13820 9533 \r\n3 4843 19967 19237 9534 \r\n3 3434 13569 19967 9534 \r\n3 2295 19237 13569 9534 \r\n3 3929 18477 16186 9535 \r\n3 1777 19900 18477 9535 \r\n3 2988 16186 19900 9535 \r\n3 2197 16521 16893 9536 \r\n3 3252 18539 16521 9536 \r\n3 3385 16893 18539 9536 \r\n3 4066 19968 17463 9537 \r\n3 4296 18345 19968 9537 \r\n3 3841 17463 18345 9537 \r\n3 4762 19969 19840 9538 \r\n3 219 13938 19969 9538 \r\n3 1195 19840 13938 9538 \r\n3 412 12654 7362 9539 \r\n3 4443 5020 12654 9539 \r\n3 4540 7362 5020 9539 \r\n3 3486 19970 19946 9540 \r\n3 2143 16892 19970 9540 \r\n3 546 19946 16892 9540 \r\n3 3151 18326 15701 9541 \r\n3 4462 16808 18326 9541 \r\n3 897 15701 16808 9541 \r\n3 4874 18639 19584 9542 \r\n3 2456 19345 18639 9542 \r\n3 452 19584 19345 9542 \r\n3 1515 17787 11480 9543 \r\n3 3136 15632 17787 9543 \r\n3 491 11480 15632 9543 \r\n3 1036 15951 12402 9544 \r\n3 3739 13699 15951 9544 \r\n3 4958 12402 13699 9544 \r\n3 3792 17154 14579 9545 \r\n3 900 18456 17154 9545 \r\n3 1971 14579 18456 9545 \r\n3 2308 12302 9147 9546 \r\n3 3218 14744 12302 9546 \r\n3 810 9147 14744 9546 \r\n3 1331 8712 6990 9547 \r\n3 3828 7853 8712 9547 \r\n3 4253 6990 7853 9547 \r\n3 4514 7370 19597 9548 \r\n3 1605 15814 7370 9548 \r\n3 1462 19597 15814 9548 \r\n3 1139 7706 18039 9549 \r\n3 2819 6420 7706 9549 \r\n3 1687 18039 6420 9549 \r\n3 2852 19302 14008 9550 \r\n3 1368 16496 19302 9550 \r\n3 4697 14008 16496 9550 \r\n3 2259 12630 13352 9551 \r\n3 3125 18944 12630 9551 \r\n3 2502 13352 18944 9551 \r\n3 3571 19906 18368 9552 \r\n3 1123 16657 19906 9552 \r\n3 4299 18368 16657 9552 \r\n3 502 5809 19971 9553 \r\n3 3731 10127 5809 9553 \r\n3 728 19971 10127 9553 \r\n3 3625 5124 6341 9554 \r\n3 2132 10455 5124 9554 \r\n3 191 6341 10455 9554 \r\n3 833 18491 14758 9555 \r\n3 2119 15997 18491 9555 \r\n3 443 14758 15997 9555 \r\n3 1312 5976 11643 9556 \r\n3 410 19902 5976 9556 \r\n3 3181 11643 19902 9556 \r\n3 422 19248 11345 9557 \r\n3 604 7523 19248 9557 \r\n3 1115 11345 7523 9557 \r\n3 2593 16263 15764 9558 \r\n3 37 14038 16263 9558 \r\n3 2059 15764 14038 9558 \r\n3 552 7012 19738 9559 \r\n3 1346 12445 7012 9559 \r\n3 3432 19738 12445 9559 \r\n3 4099 19972 14381 9560 \r\n3 1912 10567 19972 9560 \r\n3 2000 14381 10567 9560 \r\n3 1479 17185 16519 9561 \r\n3 115 16793 17185 9561 \r\n3 3992 16519 16793 9561 \r\n3 4961 15070 7452 9562 \r\n3 915 19843 15070 9562 \r\n3 1768 7452 19843 9562 \r\n3 3128 15185 19361 9563 \r\n3 3918 7257 15185 9563 \r\n3 2954 19361 7257 9563 \r\n3 4977 17496 7757 9564 \r\n3 735 12467 17496 9564 \r\n3 604 7757 12467 9564 \r\n3 3470 12481 12891 9565 \r\n3 4095 12649 12481 9565 \r\n3 3649 12891 12649 9565 \r\n3 585 18708 19962 9566 \r\n3 1016 15549 18708 9566 \r\n3 1849 19962 15549 9566 \r\n3 4945 18594 19542 9567 \r\n3 2708 18653 18594 9567 \r\n3 1206 19542 18653 9567 \r\n3 3669 14451 18649 9568 \r\n3 4636 10054 14451 9568 \r\n3 2764 18649 10054 9568 \r\n3 2449 17425 17124 9569 \r\n3 1475 19973 17425 9569 \r\n3 2098 17124 19973 9569 \r\n3 1333 17283 19871 9570 \r\n3 305 5480 17283 9570 \r\n3 819 19871 5480 9570 \r\n3 1644 16172 15759 9571 \r\n3 2967 9306 16172 9571 \r\n3 113 15759 9306 9571 \r\n3 1366 15093 17640 9572 \r\n3 3699 10351 15093 9572 \r\n3 4954 17640 10351 9572 \r\n3 2580 12193 19609 9573 \r\n3 3299 18741 12193 9573 \r\n3 34 19609 18741 9573 \r\n3 4892 14956 15695 9574 \r\n3 4483 14837 14956 9574 \r\n3 424 15695 14837 9574 \r\n3 4490 18693 9025 9575 \r\n3 3883 14960 18693 9575 \r\n3 413 9025 14960 9575 \r\n3 1172 9861 6986 9576 \r\n3 4038 14546 9861 9576 \r\n3 4941 6986 14546 9576 \r\n3 4371 19425 5330 9577 \r\n3 1565 8733 19425 9577 \r\n3 2424 5330 8733 9577 \r\n3 1818 19855 19960 9578 \r\n3 4658 11338 19855 9578 \r\n3 3308 19960 11338 9578 \r\n3 2917 18290 10513 9579 \r\n3 2515 18532 18290 9579 \r\n3 4096 10513 18532 9579 \r\n3 4521 13013 18457 9580 \r\n3 2197 6496 13013 9580 \r\n3 3627 18457 6496 9580 \r\n3 2874 11410 16634 9581 \r\n3 3559 17880 11410 9581 \r\n3 3143 16634 17880 9581 \r\n3 3357 18050 17990 9582 \r\n3 8 15103 18050 9582 \r\n3 4262 17990 15103 9582 \r\n3 4294 6281 14606 9583 \r\n3 1445 16363 6281 9583 \r\n3 611 14606 16363 9583 \r\n3 4889 19974 8045 9584 \r\n3 613 19336 19974 9584 \r\n3 3977 8045 19336 9584 \r\n3 3018 18898 10287 9585 \r\n3 2075 14071 18898 9585 \r\n3 1703 10287 14071 9585 \r\n3 3275 15411 19348 9586 \r\n3 2403 19021 15411 9586 \r\n3 3442 19348 19021 9586 \r\n3 4194 16236 16240 9587 \r\n3 2226 12353 16236 9587 \r\n3 2296 16240 12353 9587 \r\n3 4761 10701 18924 9588 \r\n3 458 8127 10701 9588 \r\n3 556 18924 8127 9588 \r\n3 2072 19664 9272 9589 \r\n3 2916 8445 19664 9589 \r\n3 2194 9272 8445 9589 \r\n3 4765 15242 19966 9590 \r\n3 3474 17953 15242 9590 \r\n3 2752 19966 17953 9590 \r\n3 455 15233 15736 9591 \r\n3 2018 18822 15233 9591 \r\n3 1599 15736 18822 9591 \r\n3 1902 9993 19787 9592 \r\n3 4639 11785 9993 9592 \r\n3 3615 19787 11785 9592 \r\n3 3265 19741 6045 9593 \r\n3 3672 14034 19741 9593 \r\n3 3203 6045 14034 9593 \r\n3 3663 17680 19934 9594 \r\n3 64 19544 17680 9594 \r\n3 1365 19934 19544 9594 \r\n3 4172 13015 19227 9595 \r\n3 2557 18954 13015 9595 \r\n3 1035 19227 18954 9595 \r\n3 1716 10031 8244 9596 \r\n3 3948 8356 10031 9596 \r\n3 3366 8244 8356 9596 \r\n3 2022 15373 19770 9597 \r\n3 2726 7509 15373 9597 \r\n3 2529 19770 7509 9597 \r\n3 2412 15033 12572 9598 \r\n3 2185 19925 15033 9598 \r\n3 2500 12572 19925 9598 \r\n3 1210 19975 16065 9599 \r\n3 2166 12372 19975 9599 \r\n3 637 16065 12372 9599 \r\n3 3327 16359 19826 9600 \r\n3 1798 19562 16359 9600 \r\n3 4440 19826 19562 9600 \r\n3 3173 16277 19710 9601 \r\n3 197 19964 16277 9601 \r\n3 808 19710 19964 9601 \r\n3 4819 8939 17372 9602 \r\n3 774 18238 8939 9602 \r\n3 3353 17372 18238 9602 \r\n3 3149 19479 17215 9603 \r\n3 395 14117 19479 9603 \r\n3 4072 17215 14117 9603 \r\n3 2784 6790 13437 9604 \r\n3 1921 8109 6790 9604 \r\n3 351 13437 8109 9604 \r\n3 837 15210 13951 9605 \r\n3 275 17315 15210 9605 \r\n3 1291 13951 17315 9605 \r\n3 3525 10844 5234 9606 \r\n3 3826 11448 10844 9606 \r\n3 2628 5234 11448 9606 \r\n3 2920 19780 17379 9607 \r\n3 3279 15476 19780 9607 \r\n3 3139 17379 15476 9607 \r\n3 2283 18451 12349 9608 \r\n3 4908 12457 18451 9608 \r\n3 1786 12349 12457 9608 \r\n3 1649 18965 19976 9609 \r\n3 1464 12373 18965 9609 \r\n3 2166 19976 12373 9609 \r\n3 3419 12995 13334 9610 \r\n3 2750 7593 12995 9610 \r\n3 711 13334 7593 9610 \r\n3 2433 10344 17806 9611 \r\n3 1831 19945 10344 9611 \r\n3 3221 17806 19945 9611 \r\n3 2379 19977 18082 9612 \r\n3 3070 19020 19977 9612 \r\n3 1299 18082 19020 9612 \r\n3 2231 19440 5282 9613 \r\n3 2689 8524 19440 9613 \r\n3 3267 5282 8524 9613 \r\n3 822 17103 8974 9614 \r\n3 483 13336 17103 9614 \r\n3 779 8974 13336 9614 \r\n3 3827 9890 19527 9615 \r\n3 2924 14460 9890 9615 \r\n3 946 19527 14460 9615 \r\n3 3752 19429 11185 9616 \r\n3 4794 8430 19429 9616 \r\n3 974 11185 8430 9616 \r\n3 1718 19226 19711 9617 \r\n3 2947 12290 19226 9617 \r\n3 990 19711 12290 9617 \r\n3 225 16074 14729 9618 \r\n3 3946 15357 16074 9618 \r\n3 2418 14729 15357 9618 \r\n3 3411 6765 9032 9619 \r\n3 3882 16328 6765 9619 \r\n3 2642 9032 16328 9619 \r\n3 2095 18359 6005 9620 \r\n3 3789 14785 18359 9620 \r\n3 3176 6005 14785 9620 \r\n3 3222 10413 6577 9621 \r\n3 3793 17574 10413 9621 \r\n3 1989 6577 17574 9621 \r\n3 4199 18158 6335 9622 \r\n3 2772 18855 18158 9622 \r\n3 2947 6335 18855 9622 \r\n3 2069 19978 7244 9623 \r\n3 1558 17675 19978 9623 \r\n3 1233 7244 17675 9623 \r\n3 3625 18677 10655 9624 \r\n3 3395 18975 18677 9624 \r\n3 592 10655 18975 9624 \r\n3 3970 19979 19617 9625 \r\n3 1562 10059 19979 9625 \r\n3 214 19617 10059 9625 \r\n3 786 12178 6150 9626 \r\n3 4562 8724 12178 9626 \r\n3 1300 6150 8724 9626 \r\n3 1206 17366 10208 9627 \r\n3 1855 14925 17366 9627 \r\n3 3007 10208 14925 9627 \r\n3 942 11963 19938 9628 \r\n3 4754 18298 11963 9628 \r\n3 966 19938 18298 9628 \r\n3 1975 17890 7290 9629 \r\n3 4160 9346 17890 9629 \r\n3 4501 7290 9346 9629 \r\n3 1524 7080 8042 9630 \r\n3 2487 12325 7080 9630 \r\n3 2872 8042 12325 9630 \r\n3 2151 16413 17203 9631 \r\n3 3278 19150 16413 9631 \r\n3 4260 17203 19150 9631 \r\n3 1539 19864 19928 9632 \r\n3 3862 19919 19864 9632 \r\n3 4904 19928 19919 9632 \r\n3 3159 19831 18208 9633 \r\n3 4484 18729 19831 9633 \r\n3 438 18208 18729 9633 \r\n3 2500 19913 12570 9634 \r\n3 4340 10895 19913 9634 \r\n3 4368 12570 10895 9634 \r\n3 3568 8921 10715 9635 \r\n3 2632 19464 8921 9635 \r\n3 1880 10715 19464 9635 \r\n3 4382 19603 18303 9636 \r\n3 1542 11414 19603 9636 \r\n3 1695 18303 11414 9636 \r\n3 185 15416 18560 9637 \r\n3 2144 12717 15416 9637 \r\n3 1261 18560 12717 9637 \r\n3 2070 11656 19277 9638 \r\n3 2777 9440 11656 9638 \r\n3 4612 19277 9440 9638 \r\n3 4973 15622 19091 9639 \r\n3 1133 16814 15622 9639 \r\n3 4120 19091 16814 9639 \r\n3 816 19980 10865 9640 \r\n3 246 18150 19980 9640 \r\n3 1303 10865 18150 9640 \r\n3 4129 5648 12284 9641 \r\n3 3534 13282 5648 9641 \r\n3 3459 12284 13282 9641 \r\n3 1760 17763 10706 9642 \r\n3 445 15839 17763 9642 \r\n3 3733 10706 15839 9642 \r\n3 4834 13038 19523 9643 \r\n3 2363 11314 13038 9643 \r\n3 2826 19523 11314 9643 \r\n3 1675 17921 14491 9644 \r\n3 3914 15895 17921 9644 \r\n3 362 14491 15895 9644 \r\n3 2856 18363 19478 9645 \r\n3 1836 19936 18363 9645 \r\n3 2362 19478 19936 9645 \r\n3 3986 10268 5230 9646 \r\n3 4557 13784 10268 9646 \r\n3 4225 5230 13784 9646 \r\n3 2680 18909 19301 9647 \r\n3 4719 13733 18909 9647 \r\n3 1368 19301 13733 9647 \r\n3 4935 14010 19954 9648 \r\n3 4335 6914 14010 9648 \r\n3 1704 19954 6914 9648 \r\n3 3228 14704 12213 9649 \r\n3 2774 5901 14704 9649 \r\n3 2465 12213 5901 9649 \r\n3 4067 17516 16043 9650 \r\n3 340 17302 17516 9650 \r\n3 472 16043 17302 9650 \r\n3 47 5421 19230 9651 \r\n3 3150 19312 5421 9651 \r\n3 3875 19230 19312 9651 \r\n3 446 18210 9796 9652 \r\n3 3445 16905 18210 9652 \r\n3 2498 9796 16905 9652 \r\n3 2660 17212 19495 9653 \r\n3 133 17187 17212 9653 \r\n3 3905 19495 17187 9653 \r\n3 1649 19976 12683 9654 \r\n3 2166 19485 19976 9654 \r\n3 3589 12683 19485 9654 \r\n3 3682 19223 19258 9655 \r\n3 4054 7428 19223 9655 \r\n3 4179 19258 7428 9655 \r\n3 227 19981 18270 9656 \r\n3 4069 14404 19981 9656 \r\n3 3023 18270 14404 9656 \r\n3 3839 5335 19794 9657 \r\n3 4046 19842 5335 9657 \r\n3 3406 19794 19842 9657 \r\n3 3659 5569 13948 9658 \r\n3 4308 17236 5569 9658 \r\n3 48 13948 17236 9658 \r\n3 1844 16470 12314 9659 \r\n3 2547 11556 16470 9659 \r\n3 1717 12314 11556 9659 \r\n3 4682 5016 19844 9660 \r\n3 2957 14959 5016 9660 \r\n3 1905 19844 14959 9660 \r\n3 3299 12192 7032 9661 \r\n3 1124 11280 12192 9661 \r\n3 4442 7032 11280 9661 \r\n3 4336 18982 16874 9662 \r\n3 908 19589 18982 9662 \r\n3 3734 16874 19589 9662 \r\n3 361 19148 6144 9663 \r\n3 903 17177 19148 9663 \r\n3 3858 6144 17177 9663 \r\n3 2066 9985 15608 9664 \r\n3 825 14007 9985 9664 \r\n3 4169 15608 14007 9664 \r\n3 988 5652 12855 9665 \r\n3 3256 19510 5652 9665 \r\n3 2864 12855 19510 9665 \r\n3 3680 15983 19183 9666 \r\n3 981 15508 15983 9666 \r\n3 2479 19183 15508 9666 \r\n3 964 8518 16576 9667 \r\n3 2352 19896 8518 9667 \r\n3 499 16576 19896 9667 \r\n3 1855 18433 14923 9668 \r\n3 4536 11215 18433 9668 \r\n3 1135 14923 11215 9668 \r\n3 3219 17368 13685 9669 \r\n3 3590 6637 17368 9669 \r\n3 1392 13685 6637 9669 \r\n3 2350 19982 7974 9670 \r\n3 2100 19308 19982 9670 \r\n3 954 7974 19308 9670 \r\n3 3268 7802 19949 9671 \r\n3 454 8660 7802 9671 \r\n3 2846 19949 8660 9671 \r\n3 1157 18902 19793 9672 \r\n3 4930 13723 18902 9672 \r\n3 835 19793 13723 9672 \r\n3 190 13311 16354 9673 \r\n3 478 17030 13311 9673 \r\n3 4318 16354 17030 9673 \r\n3 114 9777 18046 9674 \r\n3 303 6060 9777 9674 \r\n3 4494 18046 6060 9674 \r\n3 2139 12278 10066 9675 \r\n3 2212 12153 12278 9675 \r\n3 4630 10066 12153 9675 \r\n3 4255 19983 13135 9676 \r\n3 3115 19583 19983 9676 \r\n3 4227 13135 19583 9676 \r\n3 1999 8497 8959 9677 \r\n3 1248 16124 8497 9677 \r\n3 4993 8959 16124 9677 \r\n3 3488 9895 11452 9678 \r\n3 3851 19984 9895 9678 \r\n3 1992 11452 19984 9678 \r\n3 1032 12440 15202 9679 \r\n3 3154 19526 12440 9679 \r\n3 946 15202 19526 9679 \r\n3 945 17412 19708 9680 \r\n3 4205 17779 17412 9680 \r\n3 755 19708 17779 9680 \r\n3 3927 16440 11540 9681 \r\n3 2075 11577 16440 9681 \r\n3 975 11540 11577 9681 \r\n3 1815 16309 19759 9682 \r\n3 4790 19804 16309 9682 \r\n3 3618 19759 19804 9682 \r\n3 1126 5969 6063 9683 \r\n3 3152 18018 5969 9683 \r\n3 4718 6063 18018 9683 \r\n3 4646 5461 9221 9684 \r\n3 4098 18702 5461 9684 \r\n3 4061 9221 18702 9684 \r\n3 3171 18921 6292 9685 \r\n3 1895 19201 18921 9685 \r\n3 4746 6292 19201 9685 \r\n3 4386 19145 18300 9686 \r\n3 1105 16688 19145 9686 \r\n3 1344 18300 16688 9686 \r\n3 3255 14490 19110 9687 \r\n3 405 6894 14490 9687 \r\n3 2503 19110 6894 9687 \r\n3 3814 15953 13083 9688 \r\n3 3984 13843 15953 9688 \r\n3 3665 13083 13843 9688 \r\n3 3997 19099 18892 9689 \r\n3 2970 15213 19099 9689 \r\n3 3614 18892 15213 9689 \r\n3 3853 16192 19397 9690 \r\n3 4012 9375 16192 9690 \r\n3 3688 19397 9375 9690 \r\n3 754 19575 12098 9691 \r\n3 329 17808 19575 9691 \r\n3 3581 12098 17808 9691 \r\n3 1069 19186 6742 9692 \r\n3 4826 6017 19186 9692 \r\n3 4471 6742 6017 9692 \r\n3 642 13982 6004 9693 \r\n3 1748 12413 13982 9693 \r\n3 2095 6004 12413 9693 \r\n3 4082 18684 18580 9694 \r\n3 1697 9680 18684 9694 \r\n3 4940 18580 9680 9694 \r\n3 2734 19930 18364 9695 \r\n3 4579 5301 19930 9695 \r\n3 4151 18364 5301 9695 \r\n3 777 19985 10990 9696 \r\n3 9 15838 19985 9696 \r\n3 445 10990 15838 9696 \r\n3 1979 18348 14500 9697 \r\n3 2699 13988 18348 9697 \r\n3 2985 14500 13988 9697 \r\n3 2149 7634 18776 9698 \r\n3 1042 18995 7634 9698 \r\n3 4951 18776 18995 9698 \r\n3 360 7926 17099 9699 \r\n3 1945 11722 7926 9699 \r\n3 2634 17099 11722 9699 \r\n3 246 19980 7675 9700 \r\n3 816 11425 19980 9700 \r\n3 2776 7675 11425 9700 \r\n3 3557 18002 14305 9701 \r\n3 3960 16569 18002 9701 \r\n3 2304 14305 16569 9701 \r\n3 3802 10934 19356 9702 \r\n3 1108 14452 10934 9702 \r\n3 3669 19356 14452 9702 \r\n3 3130 7799 10229 9703 \r\n3 2395 6599 7799 9703 \r\n3 3936 10229 6599 9703 \r\n3 4706 8785 15663 9704 \r\n3 3325 5220 8785 9704 \r\n3 2496 15663 5220 9704 \r\n3 1322 9278 11937 9705 \r\n3 2218 15430 9278 9705 \r\n3 3502 11937 15430 9705 \r\n3 3295 12969 12497 9706 \r\n3 2158 19656 12969 9706 \r\n3 1088 12497 19656 9706 \r\n3 4366 12998 18167 9707 \r\n3 3087 6236 12998 9707 \r\n3 4840 18167 6236 9707 \r\n3 65 11435 19777 9708 \r\n3 3422 12196 11435 9708 \r\n3 3258 19777 12196 9708 \r\n3 1105 19895 16689 9709 \r\n3 127 13319 19895 9709 \r\n3 4792 16689 13319 9709 \r\n3 4201 17666 18559 9710 \r\n3 1655 19883 17666 9710 \r\n3 167 18559 19883 9710 \r\n3 3393 15378 12871 9711 \r\n3 4627 19965 15378 9711 \r\n3 2937 12871 19965 9711 \r\n3 481 19680 18329 9712 \r\n3 3303 19791 19680 9712 \r\n3 2117 18329 19791 9712 \r\n3 2598 19952 5508 9713 \r\n3 2645 15947 19952 9713 \r\n3 3046 5508 15947 9713 \r\n3 1766 17525 10872 9714 \r\n3 2219 9249 17525 9714 \r\n3 4795 10872 9249 9714 \r\n3 1629 19827 19939 9715 \r\n3 1111 18485 19827 9715 \r\n3 1096 19939 18485 9715 \r\n3 4636 10346 10055 9716 \r\n3 492 19870 10346 9716 \r\n3 1186 10055 19870 9716 \r\n3 4655 13900 17385 9717 \r\n3 3029 8597 13900 9717 \r\n3 2263 17385 8597 9717 \r\n3 4827 19986 5955 9718 \r\n3 524 19657 19986 9718 \r\n3 3548 5955 19657 9718 \r\n3 4255 19987 19983 9719 \r\n3 544 16653 19987 9719 \r\n3 3115 19983 16653 9719 \r\n3 2263 17481 17863 9720 \r\n3 3522 13994 17481 9720 \r\n3 4672 17863 13994 9720 \r\n3 4713 16990 16944 9721 \r\n3 509 19409 16990 9721 \r\n3 2157 16944 19409 9721 \r\n3 727 18330 5205 9722 \r\n3 2117 5498 18330 9722 \r\n3 3518 5205 5498 9722 \r\n3 1883 11291 16967 9723 \r\n3 3761 13667 11291 9723 \r\n3 764 16967 13667 9723 \r\n3 823 18138 18302 9724 \r\n3 3112 19795 18138 9724 \r\n3 703 18302 19795 9724 \r\n3 401 8099 16419 9725 \r\n3 553 15919 8099 9725 \r\n3 2610 16419 15919 9725 \r\n3 1565 19806 8734 9726 \r\n3 3711 16813 19806 9726 \r\n3 742 8734 16813 9726 \r\n3 1063 15056 19516 9727 \r\n3 1997 16641 15056 9727 \r\n3 3141 19516 16641 9727 \r\n3 2852 12459 12141 9728 \r\n3 2076 19309 12459 9728 \r\n3 2472 12141 19309 9728 \r\n3 1197 8608 10498 9729 \r\n3 3870 7105 8608 9729 \r\n3 1246 10498 7105 9729 \r\n3 488 8073 16274 9730 \r\n3 3720 19068 8073 9730 \r\n3 4707 16274 19068 9730 \r\n3 3516 17445 19955 9731 \r\n3 3429 17634 17445 9731 \r\n3 4860 19955 17634 9731 \r\n3 3586 6799 9632 9732 \r\n3 4945 19543 6799 9732 \r\n3 3520 9632 19543 9732 \r\n3 4539 7364 8192 9733 \r\n3 3267 16472 7364 9733 \r\n3 3902 8192 16472 9733 \r\n3 1956 15778 14322 9734 \r\n3 630 9267 15778 9734 \r\n3 4147 14322 9267 9734 \r\n3 963 18826 16539 9735 \r\n3 3658 12862 18826 9735 \r\n3 3075 16539 12862 9735 \r\n3 4781 15075 19923 9736 \r\n3 4273 17519 15075 9736 \r\n3 4667 19923 17519 9736 \r\n3 2737 6720 18979 9737 \r\n3 1416 11801 6720 9737 \r\n3 1242 18979 11801 9737 \r\n3 2550 19739 18592 9738 \r\n3 397 19441 19739 9738 \r\n3 1242 18592 19441 9738 \r\n3 1793 18143 15909 9739 \r\n3 3658 18827 18143 9739 \r\n3 1002 15909 18827 9739 \r\n3 1614 7310 11754 9740 \r\n3 2978 5989 7310 9740 \r\n3 490 11754 5989 9740 \r\n3 3688 7124 19398 9741 \r\n3 1252 19465 7124 9741 \r\n3 2632 19398 19465 9741 \r\n3 3335 17111 8933 9742 \r\n3 706 19873 17111 9742 \r\n3 4244 8933 19873 9742 \r\n3 4595 9307 12453 9743 \r\n3 2967 14773 9307 9743 \r\n3 1532 12453 14773 9743 \r\n3 4397 19215 19988 9744 \r\n3 2368 19958 19215 9744 \r\n3 1678 19988 19958 9744 \r\n3 2792 12987 19951 9745 \r\n3 1467 11405 12987 9745 \r\n3 3530 19951 11405 9745 \r\n3 990 8447 19704 9746 \r\n3 4296 19968 8447 9746 \r\n3 4066 19704 19968 9746 \r\n3 644 15616 15491 9747 \r\n3 715 13779 15616 9747 \r\n3 4785 15491 13779 9747 \r\n3 2937 19626 14600 9748 \r\n3 4645 19578 19626 9748 \r\n3 3585 14600 19578 9748 \r\n3 742 18993 8735 9749 \r\n3 4186 14542 18993 9749 \r\n3 2424 8735 14542 9749 \r\n3 3983 18125 19989 9750 \r\n3 1958 18773 18125 9750 \r\n3 3305 19989 18773 9750 \r\n3 642 16673 13983 9751 \r\n3 1601 15812 16673 9751 \r\n3 2344 13983 15812 9751 \r\n3 1399 16617 19528 9752 \r\n3 4886 8179 16617 9752 \r\n3 53 19528 8179 9752 \r\n3 152 15866 19008 9753 \r\n3 964 19052 15866 9753 \r\n3 589 19008 19052 9753 \r\n3 2646 17322 11670 9754 \r\n3 4684 13981 17322 9754 \r\n3 493 11670 13981 9754 \r\n3 4522 5358 15721 9755 \r\n3 1613 17435 5358 9755 \r\n3 1886 15721 17435 9755 \r\n3 4489 15965 19990 9756 \r\n3 146 19812 15965 9756 \r\n3 2581 19990 19812 9756 \r\n3 1617 12972 19907 9757 \r\n3 1373 9326 12972 9757 \r\n3 2862 19907 9326 9757 \r\n3 2282 19769 15565 9758 \r\n3 777 10989 19769 9758 \r\n3 817 15565 10989 9758 \r\n3 28 17755 16362 9759 \r\n3 4434 12028 17755 9759 \r\n3 4304 16362 12028 9759 \r\n3 2473 12312 19003 9760 \r\n3 1600 19991 12312 9760 \r\n3 4206 19003 19991 9760 \r\n3 1933 18726 19765 9761 \r\n3 3767 17664 18726 9761 \r\n3 975 19765 17664 9761 \r\n3 3832 10409 6394 9762 \r\n3 4415 18985 10409 9762 \r\n3 3160 6394 18985 9762 \r\n3 4551 19614 19688 9763 \r\n3 2831 11497 19614 9763 \r\n3 474 19688 11497 9763 \r\n3 1475 17424 19973 9764 \r\n3 287 11364 17424 9764 \r\n3 2098 19973 11364 9764 \r\n3 4913 17011 12038 9765 \r\n3 3372 19011 17011 9765 \r\n3 925 12038 19011 9765 \r\n3 2142 19910 15647 9766 \r\n3 767 19683 19910 9766 \r\n3 2616 15647 19683 9766 \r\n3 935 19992 6352 9767 \r\n3 4112 16846 19992 9767 \r\n3 2679 6352 16846 9767 \r\n3 3240 5742 13112 9768 \r\n3 870 14098 5742 9768 \r\n3 968 13112 14098 9768 \r\n3 4685 7530 18466 9769 \r\n3 209 18095 7530 9769 \r\n3 1660 18466 18095 9769 \r\n3 160 14732 10261 9770 \r\n3 1871 14253 14732 9770 \r\n3 2651 10261 14253 9770 \r\n3 2530 11438 5861 9771 \r\n3 2287 10233 11438 9771 \r\n3 3468 5861 10233 9771 \r\n3 4206 19991 13748 9772 \r\n3 1600 8428 19991 9772 \r\n3 4354 13748 8428 9772 \r\n3 812 18753 11565 9773 \r\n3 3591 8946 18753 9773 \r\n3 3721 11565 8946 9773 \r\n3 49 12025 11266 9774 \r\n3 723 16615 12025 9774 \r\n3 3762 11266 16615 9774 \r\n3 3489 12997 8658 9775 \r\n3 2243 19931 12997 9775 \r\n3 4249 8658 19931 9775 \r\n3 2778 14130 18626 9776 \r\n3 1480 18277 14130 9776 \r\n3 2636 18626 18277 9776 \r\n3 1057 11502 15704 9777 \r\n3 4399 5214 11502 9777 \r\n3 660 15704 5214 9777 \r\n3 1952 19920 19677 9778 \r\n3 3790 12356 19920 9778 \r\n3 3642 19677 12356 9778 \r\n3 663 11264 6776 9779 \r\n3 3762 19049 11264 9779 \r\n3 3652 6776 19049 9779 \r\n3 4061 19875 9222 9780 \r\n3 4675 5086 19875 9780 \r\n3 529 9222 5086 9780 \r\n3 3073 18425 10789 9781 \r\n3 1308 19518 18425 9781 \r\n3 4149 10789 19518 9781 \r\n3 2845 17118 16494 9782 \r\n3 1738 18638 17118 9782 \r\n3 4874 16494 18638 9782 \r\n3 1187 11805 19847 9783 \r\n3 3414 18605 11805 9783 \r\n3 1837 19847 18605 9783 \r\n3 3725 19948 19639 9784 \r\n3 4968 19524 19948 9784 \r\n3 1350 19639 19524 9784 \r\n3 2951 17842 13630 9785 \r\n3 4595 14488 17842 9785 \r\n3 1153 13630 14488 9785 \r\n3 2576 8987 19038 9786 \r\n3 1683 19865 8987 9786 \r\n3 1539 19038 19865 9786 \r\n3 1647 10316 17729 9787 \r\n3 4229 19799 10316 9787 \r\n3 1540 17729 19799 9787 \r\n3 4875 19878 14129 9788 \r\n3 1736 18276 19878 9788 \r\n3 1480 14129 18276 9788 \r\n3 4171 19722 18361 9789 \r\n3 4828 8346 19722 9789 \r\n3 1609 18361 8346 9789 \r\n3 1866 19832 17530 9790 \r\n3 84 19730 19832 9790 \r\n3 4704 17530 19730 9790 \r\n3 2151 18718 16736 9791 \r\n3 1974 13166 18718 9791 \r\n3 3650 16736 13166 9791 \r\n3 1859 13139 9853 9792 \r\n3 3380 19447 13139 9792 \r\n3 2275 9853 19447 9792 \r\n3 2679 19993 6353 9793 \r\n3 1235 19963 19993 9793 \r\n3 1026 6353 19963 9793 \r\n3 3464 5293 18071 9794 \r\n3 140 15086 5293 9794 \r\n3 316 18071 15086 9794 \r\n3 1784 9107 9754 9795 \r\n3 2305 19537 9107 9795 \r\n3 2920 9754 19537 9795 \r\n3 1034 18388 15682 9796 \r\n3 1447 8212 18388 9796 \r\n3 1824 15682 8212 9796 \r\n3 1936 15366 19174 9797 \r\n3 2366 15161 15366 9797 \r\n3 3981 19174 15161 9797 \r\n3 844 18948 17829 9798 \r\n3 4911 19903 18948 9798 \r\n3 1888 17829 19903 9798 \r\n3 4742 8287 18403 9799 \r\n3 2865 18281 8287 9799 \r\n3 154 18403 18281 9799 \r\n3 685 10694 18267 9800 \r\n3 840 11327 10694 9800 \r\n3 756 18267 11327 9800 \r\n3 3912 6942 5174 9801 \r\n3 3195 19197 6942 9801 \r\n3 4677 5174 19197 9801 \r\n3 698 18837 15440 9802 \r\n3 3967 16624 18837 9802 \r\n3 3065 15440 16624 9802 \r\n3 4502 17660 18939 9803 \r\n3 2391 16108 17660 9803 \r\n3 1175 18939 16108 9803 \r\n3 4195 15100 14398 9804 \r\n3 1984 17697 15100 9804 \r\n3 4331 14398 17697 9804 \r\n3 2029 13751 9778 9805 \r\n3 4107 11332 13751 9805 \r\n3 2855 9778 11332 9805 \r\n3 3346 19532 15311 9806 \r\n3 626 14573 19532 9806 \r\n3 4638 15311 14573 9806 \r\n3 1320 19813 17523 9807 \r\n3 2367 18700 19813 9807 \r\n3 3418 17523 18700 9807 \r\n3 847 19881 17623 9808 \r\n3 4872 19828 19881 9808 \r\n3 1560 17623 19828 9808 \r\n3 895 19101 18956 9809 \r\n3 3070 19977 19101 9809 \r\n3 2379 18956 19977 9809 \r\n3 3672 16890 15846 9810 \r\n3 3089 19221 16890 9810 \r\n3 3702 15846 19221 9810 \r\n3 3493 7736 9255 9811 \r\n3 1200 19916 7736 9811 \r\n3 1162 9255 19916 9811 \r\n3 1587 15620 16858 9812 \r\n3 3786 19473 15620 9812 \r\n3 3898 16858 19473 9812 \r\n3 77 19645 17672 9813 \r\n3 14 19027 19645 9813 \r\n3 1061 17672 19027 9813 \r\n3 3840 16767 18606 9814 \r\n3 975 11576 16767 9814 \r\n3 409 18606 11576 9814 \r\n3 1532 14772 18582 9815 \r\n3 2074 19079 14772 9815 \r\n3 4082 18582 19079 9815 \r\n3 502 19971 18689 9816 \r\n3 728 18327 19971 9816 \r\n3 805 18689 18327 9816 \r\n3 1671 9229 19735 9817 \r\n3 1235 19993 9229 9817 \r\n3 2679 19735 19993 9817 \r\n3 3387 13172 15594 9818 \r\n3 1805 17922 13172 9818 \r\n3 1374 15594 17922 9818 \r\n3 3554 10860 13737 9819 \r\n3 633 19959 10860 9819 \r\n3 4193 13737 19959 9819 \r\n3 4966 14202 19944 9820 \r\n3 4141 7899 14202 9820 \r\n3 158 19944 7899 9820 \r\n3 578 8522 13809 9821 \r\n3 1404 19601 8522 9821 \r\n3 4004 13809 19601 9821 \r\n3 3881 8279 11271 9822 \r\n3 613 19974 8279 9822 \r\n3 4889 11271 19974 9822 \r\n3 3473 12531 10464 9823 \r\n3 2250 18214 12531 9823 \r\n3 782 10464 18214 9823 \r\n3 394 19175 5502 9824 \r\n3 2463 17734 19175 9824 \r\n3 575 5502 17734 9824 \r\n3 2069 13778 19978 9825 \r\n3 3338 13766 13778 9825 \r\n3 1558 19978 13766 9825 \r\n3 750 18356 19522 9826 \r\n3 803 14026 18356 9826 \r\n3 3229 19522 14026 9826 \r\n3 2222 19872 17726 9827 \r\n3 1648 9472 19872 9827 \r\n3 278 17726 9472 9827 \r\n3 2255 18671 11567 9828 \r\n3 3417 16493 18671 9828 \r\n3 3099 11567 16493 9828 \r\n3 3008 17005 18297 9829 \r\n3 1493 16510 17005 9829 \r\n3 1281 18297 16510 9829 \r\n3 867 16350 19994 9830 \r\n3 2280 10761 16350 9830 \r\n3 2454 19994 10761 9830 \r\n3 3510 17981 6931 9831 \r\n3 1099 9256 17981 9831 \r\n3 4493 6931 9256 9831 \r\n3 2343 15335 7659 9832 \r\n3 2550 18591 15335 9832 \r\n3 3952 7659 18591 9832 \r\n3 3305 13880 19989 9833 \r\n3 3532 12851 13880 9833 \r\n3 3983 19989 12851 9833 \r\n3 748 10899 13458 9834 \r\n3 2361 13786 10899 9834 \r\n3 4733 13458 13786 9834 \r\n3 2156 17613 18780 9835 \r\n3 3962 18695 17613 9835 \r\n3 1225 18780 18695 9835 \r\n3 4695 5696 17327 9836 \r\n3 2579 15473 5696 9836 \r\n3 806 17327 15473 9836 \r\n3 407 8883 9265 9837 \r\n3 3002 16977 8883 9837 \r\n3 3562 9265 16977 9837 \r\n3 3738 12204 19835 9838 \r\n3 772 19182 12204 9838 \r\n3 2256 19835 19182 9838 \r\n3 818 18719 18479 9839 \r\n3 943 7491 18719 9839 \r\n3 2138 18479 7491 9839 \r\n3 2881 18527 7884 9840 \r\n3 3224 18523 18527 9840 \r\n3 2619 7884 18523 9840 \r\n3 4488 14517 17861 9841 \r\n3 67 17499 14517 9841 \r\n3 913 17861 17499 9841 \r\n3 95 17552 19412 9842 \r\n3 212 5253 17552 9842 \r\n3 2728 19412 5253 9842 \r\n3 3756 14400 9415 9843 \r\n3 3230 18840 14400 9843 \r\n3 3597 9415 18840 9843 \r\n3 1944 12755 16102 9844 \r\n3 521 11887 12755 9844 \r\n3 4744 16102 11887 9844 \r\n3 334 9465 8861 9845 \r\n3 1169 16601 9465 9845 \r\n3 1978 8861 16601 9845 \r\n3 290 8490 19880 9846 \r\n3 3881 14145 8490 9846 \r\n3 2544 19880 14145 9846 \r\n3 2788 19644 5769 9847 \r\n3 4481 16042 19644 9847 \r\n3 1132 5769 16042 9847 \r\n3 4591 7237 9320 9848 \r\n3 4752 12277 7237 9848 \r\n3 2930 9320 12277 9848 \r\n3 749 15160 19942 9849 \r\n3 2898 19483 15160 9849 \r\n3 1434 19942 19483 9849 \r\n3 1722 18242 16947 9850 \r\n3 682 17324 18242 9850 \r\n3 2830 16947 17324 9850 \r\n3 2346 7196 17226 9851 \r\n3 3598 19120 7196 9851 \r\n3 1861 17226 19120 9851 \r\n3 4303 19775 14319 9852 \r\n3 2303 13462 19775 9852 \r\n3 4239 14319 13462 9852 \r\n3 4060 19018 17451 9853 \r\n3 3400 19909 19018 9853 \r\n3 1229 17451 19909 9853 \r\n3 4434 17757 15193 9854 \r\n3 1241 18724 17757 9854 \r\n3 4619 15193 18724 9854 \r\n3 3032 13794 18204 9855 \r\n3 4953 17071 13794 9855 \r\n3 2755 18204 17071 9855 \r\n3 316 7075 8341 9856 \r\n3 2797 7570 7075 9856 \r\n3 3084 8341 7570 9856 \r\n3 2184 18908 19690 9857 \r\n3 221 7380 18908 9857 \r\n3 1846 19690 7380 9857 \r\n3 35 19515 11509 9858 \r\n3 4016 17992 19515 9858 \r\n3 4418 11509 17992 9858 \r\n3 4949 9014 18076 9859 \r\n3 3934 16430 9014 9859 \r\n3 1783 18076 16430 9859 \r\n3 748 13264 10897 9860 \r\n3 3361 18737 13264 9860 \r\n3 620 10897 18737 9860 \r\n3 3043 14879 16410 9861 \r\n3 1843 10109 14879 9861 \r\n3 4356 16410 10109 9861 \r\n3 3727 15757 18003 9862 \r\n3 2131 13238 15757 9862 \r\n3 4216 18003 13238 9862 \r\n3 1419 18343 18183 9863 \r\n3 2277 19691 18343 9863 \r\n3 1566 18183 19691 9863 \r\n3 2758 17228 9728 9864 \r\n3 720 19867 17228 9864 \r\n3 1149 9728 19867 9864 \r\n3 901 16335 11352 9865 \r\n3 2609 13026 16335 9865 \r\n3 1713 11352 13026 9865 \r\n3 1589 12258 11836 9866 \r\n3 2031 16222 12258 9866 \r\n3 2160 11836 16222 9866 \r\n3 4460 7314 12877 9867 \r\n3 3218 17308 7314 9867 \r\n3 4281 12877 17308 9867 \r\n3 1076 11200 17032 9868 \r\n3 2657 18768 11200 9868 \r\n3 2045 17032 18768 9868 \r\n3 4762 19904 19969 9869 \r\n3 1803 13101 19904 9869 \r\n3 219 19969 13101 9869 \r\n3 2383 9874 18205 9870 \r\n3 3434 19995 9874 9870 \r\n3 797 18205 19995 9870 \r\n3 1336 10177 10264 9871 \r\n3 1328 19606 10177 9871 \r\n3 2070 10264 19606 9871 \r\n3 890 17167 12888 9872 \r\n3 1323 10953 17167 9872 \r\n3 4150 12888 10953 9872 \r\n3 3405 19996 7225 9873 \r\n3 4075 14770 19996 9873 \r\n3 2162 7225 14770 9873 \r\n3 4768 6202 11982 9874 \r\n3 2944 12367 6202 9874 \r\n3 1087 11982 12367 9874 \r\n3 2529 19392 19771 9875 \r\n3 4189 19937 19392 9875 \r\n3 1150 19771 19937 9875 \r\n3 1536 19755 7701 9876 \r\n3 1231 12838 19755 9876 \r\n3 4510 7701 12838 9876 \r\n3 2178 19287 10622 9877 \r\n3 3988 16790 19287 9877 \r\n3 3560 10622 16790 9877 \r\n3 1553 7315 13662 9878 \r\n3 4460 11243 7315 9878 \r\n3 854 13662 11243 9878 \r\n3 3555 19774 19305 9879 \r\n3 1976 16607 19774 9879 \r\n3 623 19305 16607 9879 \r\n3 2239 13919 18806 9880 \r\n3 3459 13281 13919 9880 \r\n3 769 18806 13281 9880 \r\n3 1678 16196 19988 9881 \r\n3 2114 19997 16196 9881 \r\n3 4397 19988 19997 9881 \r\n3 2049 18873 12971 9882 \r\n3 2123 19404 18873 9882 \r\n3 2158 12971 19404 9882 \r\n3 1083 18314 12486 9883 \r\n3 482 19874 18314 9883 \r\n3 3353 12486 19874 9883 \r\n3 1545 14766 7140 9884 \r\n3 2181 19406 14766 9884 \r\n3 2180 7140 19406 9884 \r\n3 3201 17183 19779 9885 \r\n3 4864 10683 17183 9885 \r\n3 2389 19779 10683 9885 \r\n3 4654 19130 5077 9886 \r\n3 4773 18358 19130 9886 \r\n3 3269 5077 18358 9886 \r\n3 3866 8070 19825 9887 \r\n3 2088 18967 8070 9887 \r\n3 137 19825 18967 9887 \r\n3 2987 9357 16529 9888 \r\n3 2986 19998 9357 9888 \r\n3 3872 16529 19998 9888 \r\n3 2987 16528 18647 9889 \r\n3 1493 19138 16528 9889 \r\n3 4750 18647 19138 9889 \r\n3 570 18487 16473 9890 \r\n3 1030 19349 18487 9890 \r\n3 1579 16473 19349 9890 \r\n3 1733 19899 15956 9891 \r\n3 2290 16071 19899 9891 \r\n3 3635 15956 16071 9891 \r\n3 4963 16261 17951 9892 \r\n3 4072 10913 16261 9892 \r\n3 717 17951 10913 9892 \r\n3 4417 18393 17062 9893 \r\n3 2286 14168 18393 9893 \r\n3 494 17062 14168 9893 \r\n3 2417 16257 6467 9894 \r\n3 3712 15887 16257 9894 \r\n3 4772 6467 15887 9894 \r\n3 1498 7716 16409 9895 \r\n3 686 7209 7716 9895 \r\n3 3104 16409 7209 9895 \r\n3 3970 5235 19979 9896 \r\n3 2628 15703 5235 9896 \r\n3 1562 19979 15703 9896 \r\n3 1378 9473 13819 9897 \r\n3 1533 16922 9473 9897 \r\n3 382 13819 16922 9897 \r\n3 3145 6848 18446 9898 \r\n3 1992 19984 6848 9898 \r\n3 3851 18446 19984 9898 \r\n3 1761 7233 12939 9899 \r\n3 432 19436 7233 9899 \r\n3 4452 12939 19436 9899 \r\n3 4112 19992 14466 9900 \r\n3 935 17238 19992 9900 \r\n3 179 14466 17238 9900 \r\n3 204 17638 6520 9901 \r\n3 4513 6172 17638 9901 \r\n3 1309 6520 6172 9901 \r\n3 3148 10277 14285 9902 \r\n3 888 10984 10277 9902 \r\n3 2621 14285 10984 9902 \r\n3 4293 9210 19651 9903 \r\n3 1392 6636 9210 9903 \r\n3 2384 19651 6636 9903 \r\n3 2318 13731 19999 9904 \r\n3 4719 16541 13731 9904 \r\n3 2873 19999 16541 9904 \r\n3 1416 6719 12243 9905 \r\n3 776 7740 6719 9905 \r\n3 3289 12243 7740 9905 \r\n3 4474 16007 12524 9906 \r\n3 3406 19841 16007 9906 \r\n3 2450 12524 19841 9906 \r\n3 3512 6481 17832 9907 \r\n3 4809 6350 6481 9907 \r\n3 1398 17832 6350 9907 \r\n3 312 19922 19571 9908 \r\n3 3465 19957 19922 9908 \r\n3 1367 19571 19957 9908 \r\n3 1540 16598 18511 9909 \r\n3 1630 14597 16598 9909 \r\n3 1270 18511 14597 9909 \r\n3 1841 11017 19203 9910 \r\n3 217 18349 11017 9910 \r\n3 1979 19203 18349 9910 \r\n3 596 20000 8720 9911 \r\n3 123 19891 20000 9911 \r\n3 1857 8720 19891 9911 \r\n3 1912 19972 8819 9912 \r\n3 4099 17442 19972 9912 \r\n3 2367 8819 17442 9912 \r\n3 2436 13032 7680 9913 \r\n3 4075 19996 13032 9913 \r\n3 3405 7680 19996 9913 \r\n3 2289 5189 18227 9914 \r\n3 2159 19415 5189 9914 \r\n3 802 18227 19415 9914 \r\n3 4090 11998 19344 9915 \r\n3 2071 18069 11998 9915 \r\n3 1548 19344 18069 9915 \r\n3 3215 19692 17528 9916 \r\n3 2133 10819 19692 9916 \r\n3 304 17528 10819 9916 \r\n3 2439 18566 9056 9917 \r\n3 4995 18691 18566 9917 \r\n3 229 9056 18691 9917 \r\n3 565 17132 19577 9918 \r\n3 4622 19718 17132 9918 \r\n3 3799 19577 19718 9918 \r\n3 2647 5485 13532 9919 \r\n3 1221 5339 5485 9919 \r\n3 3060 13532 5339 9919 \r\n3 4680 12299 6501 9920 \r\n3 2318 19999 12299 9920 \r\n3 2873 6501 19999 9920 \r\n3 790 19294 18876 9921 \r\n3 480 7343 19294 9921 \r\n3 435 18876 7343 9921 \r\n3 4843 11731 19967 9922 \r\n3 797 19995 11731 9922 \r\n3 3434 19967 19995 9922 \r\n3 3463 19669 14437 9923 \r\n3 4938 13825 19669 9923 \r\n3 1488 14437 13825 9923 \r\n3 4255 10768 19987 9924 \r\n3 1632 5764 10768 9924 \r\n3 544 19987 5764 9924 \r\n3 674 19681 19432 9925 \r\n3 481 6886 19681 9925 \r\n3 2251 19432 6886 9925 \r\n3 4852 19171 19829 9926 \r\n3 4256 5985 19171 9926 \r\n3 3632 19829 5985 9926 \r\n3 2508 17910 9116 9927 \r\n3 4730 19860 17910 9927 \r\n3 4793 9116 19860 9927 \r\n3 3334 14138 16746 9928 \r\n3 867 19994 14138 9928 \r\n3 2454 16746 19994 9928 \r\n3 2350 13410 19982 9929 \r\n3 1515 11479 13410 9929 \r\n3 2100 19982 11479 9929 \r\n3 4196 16704 16997 9930 \r\n3 647 20001 16704 9930 \r\n3 124 16997 20001 9930 \r\n3 3486 18483 19970 9931 \r\n3 4804 9338 18483 9931 \r\n3 2143 19970 9338 9931 \r\n3 1437 9184 9991 9932 \r\n3 4640 5785 9184 9932 \r\n3 1803 9991 5785 9932 \r\n3 1280 19007 5353 9933 \r\n3 524 19986 19007 9933 \r\n3 4827 5353 19986 9933 \r\n3 2763 6957 19280 9934 \r\n3 301 18324 6957 9934 \r\n3 473 19280 18324 9934 \r\n3 310 11828 17869 9935 \r\n3 471 10358 11828 9935 \r\n3 4689 17869 10358 9935 \r\n3 3546 11755 18723 9936 \r\n3 2573 17847 11755 9936 \r\n3 4619 18723 17847 9936 \r\n3 3872 19998 17845 9937 \r\n3 2986 17534 19998 9937 \r\n3 2116 17845 17534 9937 \r\n3 961 18782 6935 9938 \r\n3 4761 8452 18782 9938 \r\n3 3516 6935 8452 9938 \r\n3 3193 7030 9845 9939 \r\n3 54 19435 7030 9939 \r\n3 3184 9845 19435 9939 \r\n3 3710 14847 7838 9940 \r\n3 4476 19019 14847 9940 \r\n3 3070 7838 19019 9940 \r\n3 297 13265 15223 9941 \r\n3 3534 5647 13265 9941 \r\n3 3153 15223 5647 9941 \r\n3 3107 16532 18201 9942 \r\n3 2737 14888 16532 9942 \r\n3 3170 18201 14888 9942 \r\n3 1636 6938 16968 9943 \r\n3 4109 11313 6938 9943 \r\n3 912 16968 11313 9943 \r\n3 4710 18036 17733 9944 \r\n3 347 5761 18036 9944 \r\n3 2336 17733 5761 9944 \r\n3 3498 13286 9995 9945 \r\n3 2875 19259 13286 9945 \r\n3 1459 9995 19259 9945 \r\n3 4533 17737 7627 9946 \r\n3 4988 17386 17737 9946 \r\n3 2899 7627 17386 9946 \r\n3 4137 19139 18432 9947 \r\n3 1970 19856 19139 9947 \r\n3 1519 18432 19856 9947 \r\n3 4405 12775 19889 9948 \r\n3 2587 10459 12775 9948 \r\n3 2306 19889 10459 9948 \r\n3 4929 19149 18037 9949 \r\n3 124 20001 19149 9949 \r\n3 647 18037 20001 9949 \r\n3 1363 19696 18136 9950 \r\n3 2837 17479 19696 9950 \r\n3 766 18136 17479 9950 \r\n3 752 9599 10345 9951 \r\n3 2448 17846 9599 9951 \r\n3 2573 10345 17846 9951 \r\n3 174 17044 18998 9952 \r\n3 200 19853 17044 9952 \r\n3 3449 18998 19853 9952 \r\n3 3514 9389 19340 9953 \r\n3 1471 16728 9389 9953 \r\n3 2098 19340 16728 9953 \r\n3 2160 15011 11837 9954 \r\n3 4983 19205 15011 9954 \r\n3 2814 11837 19205 9954 \r\n3 2084 19727 18390 9955 \r\n3 4397 19997 19727 9955 \r\n3 2114 18390 19997 9955 \r\n3 1676 10805 18049 9956 \r\n3 151 14889 10805 9956 \r\n3 8 18049 14889 9956 \r\n3 2261 8354 12677 9957 \r\n3 3948 5782 8354 9957 \r\n3 4891 12677 5782 9957 \r\n3 1649 12682 18964 9958 \r\n3 1112 16177 12682 9958 \r\n3 2918 18964 16177 9958 \r\n3 1517 19521 16610 9959 \r\n3 4074 18130 19521 9959 \r\n3 4866 16610 18130 9959 \r\n3 2836 13482 17988 9960 \r\n3 3414 5029 13482 9960 \r\n3 1931 17988 5029 9960 \r\n3 3395 13402 7338 9961 \r\n3 328 19501 13402 9961 \r\n3 2471 7338 19501 9961 \r\n3 401 16418 8100 9962 \r\n3 1277 19600 16418 9962 \r\n3 4279 8100 19600 9962 \r\n3 928 12005 15151 9963 \r\n3 3632 5987 12005 9963 \r\n3 2765 15151 5987 9963 \r\n3 4439 19354 14027 9964 \r\n3 1539 19927 19354 9964 \r\n3 3229 14027 19927 9964 \r\n3 3800 19743 19508 9965 \r\n3 15 10636 19743 9965 \r\n3 926 19508 10636 9965 \r\n3 4489 19990 18054 9966 \r\n3 2581 12458 19990 9966 \r\n3 4908 18054 12458 9966 \r\n3 2011 7561 17708 9967 \r\n3 9 19985 7561 9967 \r\n3 777 17708 19985 9967 \r\n3 2971 5925 19729 9968 \r\n3 714 14654 5925 9968 \r\n3 3497 19729 14654 9968 \r\n3 1451 15642 11362 9969 \r\n3 2687 18405 15642 9969 \r\n3 559 11362 18405 9969 \r\n3 4118 17796 13314 9970 \r\n3 1893 14646 17796 9970 \r\n3 1217 13314 14646 9970 \r\n3 1210 16270 19975 9971 \r\n3 1775 19486 16270 9971 \r\n3 2166 19975 19486 9971 \r\n3 1412 19699 9864 9972 \r\n3 109 16275 19699 9972 \r\n3 3257 9864 16275 9972 \r\n3 3280 6280 15113 9973 \r\n3 346 13446 6280 9973 \r\n3 1684 15113 13446 9973 \r\n3 1660 17195 18464 9974 \r\n3 4277 19585 17195 9974 \r\n3 2919 18464 19585 9974 \r\n3 3099 18736 11568 9975 \r\n3 1451 19642 18736 9975 \r\n3 1148 11568 19642 9975 \r\n3 480 18106 19637 9976 \r\n3 1819 5759 18106 9976 \r\n3 347 19637 5759 9976 \r\n3 553 19547 12516 9977 \r\n3 381 16933 19547 9977 \r\n3 1007 12516 16933 9977 \r\n3 4069 19981 18537 9978 \r\n3 227 9069 19981 9978 \r\n3 2404 18537 9069 9978 \r\n3 3681 15944 14292 9979 \r\n3 1962 6858 15944 9979 \r\n3 3190 14292 6858 9979 \r\n3 3431 19706 11238 9980 \r\n3 4385 16670 19706 9980 \r\n3 985 11238 16670 9980 \r\n3 3286 10885 17800 9981 \r\n3 4578 16747 10885 9981 \r\n3 2454 17800 16747 9981 \r\n3 17 17614 8241 9982 \r\n3 2999 5413 17614 9982 \r\n3 1754 8241 5413 9982 \r\n3 3222 6579 19820 9983 \r\n3 1705 19911 6579 9983 \r\n3 3481 19820 19911 9983 \r\n3 3246 18958 11987 9984 \r\n3 3551 16797 18958 9984 \r\n3 1688 11987 16797 9984 \r\n3 596 17760 20000 9985 \r\n3 900 12091 17760 9985 \r\n3 123 20000 12091 9985 \r\n3 2920 17378 5441 9986 \r\n3 1928 7162 17378 9986 \r\n3 2299 5441 7162 9986 \r\n3 3745 19926 11260 9987 \r\n3 1288 17031 19926 9987 \r\n3 1622 11260 17031 9987 \r\n3 2388 15770 19360 9988 \r\n3 1828 9705 15770 9988 \r\n3 3128 19360 9705 9988 \r\n3 3936 18943 18239 9989 \r\n3 3125 7285 18943 9989 \r\n3 3923 18239 7285 9989 \r\n3 2409 19819 9880 9990 \r\n3 2311 7444 19819 9990 \r\n3 2824 9880 7444 9990 \r\n3 4713 16943 13799 9991 \r\n3 3517 17606 16943 9991 \r\n3 2609 13799 17606 9991 \r\n3 2911 19044 16370 9992 \r\n3 2805 15394 19044 9992 \r\n3 2187 16370 15394 9992 \r\n3 1861 16308 14273 9993 \r\n3 2129 15552 16308 9993 \r\n3 4503 14273 15552 9993 \r\n3 4369 19627 12926 9994 \r\n3 4797 17862 19627 9994 \r\n3 4688 12926 17862 9994 \r\n3 3769 19463 19420 9995 \r\n3 3707 7967 19463 9995 \r\n3 2301 19420 7967 9995 \r\n3 2003 7963 14692 9996 \r\n3 4534 18250 7963 9996 \r\n3 4153 14692 18250 9996 \r\n3 1829 11827 18565 9997 \r\n3 2150 12068 11827 9997 \r\n3 2656 18565 12068 9997 \r\n3 159 7954 7886 9998 \r\n3 3387 18275 7954 9998 \r\n3 736 7886 18275 9998 \r\n3 328 19176 19605 9999 \r\n3 924 11654 19176 9999 \r\n3 2070 19605 11654 9999 \r\nPress any key to continue"
  },
  {
    "path": "tests/meshes/mesh.modifier.PGPRemesh.bunny.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0.46674991336038735 -0.54163089327802727 0.49647159474970187 0.58306609329913084 0.095629742988895441 -0.057346049590021146 -0.23894174367147158 -0.19505699584389338 -0.55208031914523592 0.64064916610612399 0.0093104283358789834 -0.96753124005200863 0.47733284180043445 -0.22297110974361667 0.040340478909815181 0.42460059288202651 -0.55173420433313058 -0.97193051473034564 -0.22803676204730053 -0.24451576896777891 -0.96148875677778067 0.35005116070899051 -0.87336315925967201 -0.35732418406825595 0.69764181154147464 0.41867876032223655 -0.48786787973620988 -0.29491367551319353 0.30997111144312628 -0.15411066079821603 -0.23344730077176207 0.026754844799864383 0.88860081001513636 -0.28516567201159787 0.069826568295066782 0.76713172421500964 0.077127567620159668 -0.44287635682643539 0.38342782646029316 -0.42208305437157606 0.21973742581746938 -0.46249179557247461 0.33104573118736413 -0.91542618028327538 -0.2063044357469693 -0.062318253374713396 -0.36503021646064993 0.74512188211834873 0.47594036242620352 0.2467853002151334 -0.91899867612348796 0.25880446619534558 -0.15888992063785093 -0.94059488955965975 -0.24461540741252374 0.25990010834746358 -0.050419070532485302 0.016539722254631271 -0.15528948034763546 0.18885431865409821 0.48273938899470409 0.55208583095755925 0.017135599680426751 0.40031390486440088 0.30297636007741047 -0.92556959277990425 0.26770414349859617 -0.33479042516886348 0.23063104374104526 -0.27309189864778471 -0.59237734222866156 0.66350849879174034 -0.27516429107835516 -0.19975769467016966 -0.50321442097972602 0.56183157091661873 -0.36681121649294524 -0.84217517539964049 0.07223620209404337 0.79689507885490496 -0.2871794845586994 0.51846162779206817 -0.51039885850678501 -0.7903655902340504 0.64562953931359413 -0.77380533283586506 0.39524221505354257 -0.2146485690258392 0.0075156000797419412 -0.94348587000811879 0.061780224060510695 -0.70518773769389076 -0.88359494843032349 0.36485772673832417 0.71998699314027859 -0.085701868973155071 -0.22489824180952844 -0.55957845212030388 -0.18415644105598586 0.60255827500212589 -0.34569673737373113 -0.9454860568742145 0.59063072270765649 0.50477206986304324 -0.70454832859437688 0.30874802173806776 0.97360410570810552 -0.65420144983496153 -0.54043545118031977 -0.69777298330564619 0.64769690255162327 -0.093764097811270194 -0.70554198049431449 0.015034487233003893 -0.39947592085634631 0.12853629959661428 -0.18710622860498027 -0.013372272139962997 -0.44868197654693653 0.6742707862953744 0.11946533974459368 0.98892059350624917 -0.58259263728184396 0.76508109869728846 0.090689478084054476 -0.3203798959101255 0.43955437572103984 -0.51930387262454336 0.48546182145574185 -0.24269566458993352 -0.34945859518055489 -0.33560351011808998 0.53737782373343534 -0.16572634371100611 -0.47225137295633701 0.26441881968449765 -0.50719057308697746 -0.66155543842191689 0.52945974333354562 -0.52440102821535128 -0.035620490059010405 -0.19520074505053406 -0.16006438502036324 0.039305137129265227 0.2478396267305028 0.10719824342440486 0.265330541151516 0.65771372460725508 -0.20130084337880846 -0.86412930660742693 0.37330037154504292 -0.3929460996717824 0.22300842128132944 0.0044554364317930016 -0.61223822293004171 -0.83661434589287775 -0.26294933769624917 -0.018614802805399851 0.7897211646889537 -0.14460876858048161 -0.29574783565815649 -0.8032472011292533 0.58651086344612924 -0.1614237919262379 -0.3550409813805851 -0.33383829531959586 -0.082549825761679588 -0.77834094139536258 -0.042983756933331528 0.022174919026924863 0.19277818672686856 -0.20611056139435074 -0.042398848639355127 0.035952396879726498 -0.048664002742919488 -0.42515925480584638 0.21738283798824168 0.46716571223691961 0.47527374046654952 -0.95220776705425969 0.74865755648730048 0.27638120336642186 -0.48340964351101684 -0.025501746401839664 -0.85491381151072532 -0.33294646166503866 0.20904166079223782 -0.89483323117718994 0.5599677550641835 -0.36065865635099514 -0.16558460628733027 -0.52084924369301999 0.51808698741164227 -0.922558339959061 0.36747228508431207 0.36179777396369939 -0.94470854079012123 0.33703711227418759 0.2780238192487347 -0.90459314538275948 -0.067971960962547012 0.0090459881007473094 0.29845470350315956 -0.955160752827242 0.61394877489236066 0.5192499614767413 -0.1839584584807131 0.6054589839161455 0.43361968419480762 -0.103102543592806 0.33908071950048913 -0.44224472737344922 -0.69302667667494589 0.10972296156581862 -0.69288809209700286 -0.87927302967108023 -0.18437738144489249 -0.70069272233155266 -0.30453043094464349 0.089274036191677245 -0.91418505813818107 -0.15002445215177276 -0.093581427706577208 -0.65965888471688183 0.64994984304866521 -0.23844056068962968 -0.45351256284200386 -0.10110562764159776 -0.25585287571645077 -0.35031795104227348 -0.17569038998915487 -0.19827654360521577 -0.47210251237810019 0.0083894660605437037 0.30635044964447383 -0.88091809792621489 -0.36751784074442317 -0.3022782014776903 -0.1093902437346657 -0.98168824395656584 -0.14179439134700136 -0.037069923725660259 0.75252700302926201 0.20158396612439616 -0.66549508990853723 -0.6198018087810685 0.44017881615992122 -0.44067839938192782 0.23381037351088632 0.1861003844967431 0.93439506535722727 -0.78234773410081904 0.46445516833579065 -0.3480056567802744 0.054684470228291038 -0.16290263554135884 -0.68997783226759812 -0.12495066628509405 0.22468831951917545 -0.47377341353382307 -0.81567656347680517 0.76650489733146487 0.13657556067598925 -0.41514044905804337 -0.10605998748067359 -0.12721629679954624 0.79803434216611502 0.082214958941208838 -0.8818624370183249 0.40772036313901644 -0.25016246426490374 -0.17108852526966584 -0.61624218363300809 -0.19723389501611563 -0.6296946346066582 -0.1598832854525723 -0.13003640314431056 -0.060166528988130595 0.11535210175346389 -0.32666092391974255 0.15986364727049951 -0.15516314104594037 -0.14460032517421637 0.67826288325811379 -0.53810202996300949 -0.085144872068328978 -0.28882413140455865 -0.93847604784168959 0.23460792671726299 0.43969496651794382 -0.95518524150607109 -0.11325354968042933 -0.457116155050318 -0.90062058346362517 0.30230140398194755 0.73460892617612794 -0.067580406072911353 0.47808995502475615 -0.64080398345350076 0.55247089055794263 -0.11074556105503455 -0.29770289988426957 0.61773339501066171 0.63104162784005868 -0.010281462182011751 -0.14776418963331031 0.36496309399803611 -0.9770406937519831 0.23219870711046731 -0.34983187961652501 0.0058178956072904124 -0.17031509569142186 0.32292929167600243 -0.55726466030004695 -0.6287962713405485 0.52851269826450231 0.55764513441063512 -0.062624480993965032 0.12483437337666316 0.17748948629720118 0.27543733470438209 0.40352124207528439 -0.49564029555798084 0.50390855144678715 0.027452312047771953 -0.0096263357220639032 -0.90564551503960267 0.02066571127680401 0.84259070850655726 -0.80374312654206193 -0.1925797054139527 0.51247524132820277 -0.059207300609308684 -0.21857523340098942 0.061803331096138989 0.037160354340706345 0.16266825487959974 0.76703847717939311 -0.10394540624893249 -0.40344454846322131 0.22292090643966372 -0.22523539923536587 0.082164917981412303 -0.29482673395695042 -0.96593623877005541 0.10330507564156899 0.62827818843321648 -0.94915362550492333 0.13084847592609544 0.5080979336698046 0.20070967880560431 -0.1708542276119733 -0.047987006870851938 0.84782848541727285 0.32656075973163096 0.0029877379145659588 -0.90517150117871792 0.59570342397850573 -0.77132237280934191 0.44939377978646294 0.57398798016317676 -0.41551908767714918 -0.12198610632079464 0.26262704443270735 0.5178889618411805 0.19681664972243776 0.30459514748369204 -0.95201506637065547 0.34308520846591001 0.5719287935181695 -0.68666640844670568 -0.26474266058791257 0.45741039745531797 -0.55617201123712479 -0.8031703178602414 0.75237961214868254 -0.036833198971685015 -0.34559576880082843 0.3435700507442736 -0.03995761350961663 0.19546692314997721 -0.20422571889731175 -0.59884344139783285 0.47955381813172965 -0.014382540674401964 -0.30653924692356904 -0.96090883254718484 0.088278326037821347 0.7852571694236542 -0.15890589335006955 0.55970991331775832 -0.077012394394215644 -0.047230780993914631 0.036880786139203738 -0.19827803451585729 0.5673988432407906 0.028330697400652683 -0.40188346873888731 0.7422637602709018 -0.025215680139901116 -0.25418225232810021 -0.92499628784762644 0.75525476359352339 0.054179245205390955 -0.44136324097218937 0.62834341356740164 -0.11635438702147065 -0.45504424014415817 -0.010793763868882726 -0.40823840355495022 0.24351115113348165 -0.32551584836709963 -0.20375086459309644 -0.29345750705804141 -0.073435350219076642 0.59086211809067879 -0.79965115263355424 0.45651696729801011 -0.14251323768218085 0.079743150174786254 -0.20332714478262887 0.56717389161726506 -0.13655724613711984 0.64001915590321756 -0.1416829929348235 -0.34956906720416731 -0.033870054849932267 0.64581353498439176 -0.84666007141330346 -0.085883118322020946 -0.58714728736822452 0.50229712104511115 0.71321608370144784 -0.010395879252921078 -0.53287937163484478 0.0048396336296696423 0.77719247266794034 -0.43592935564115159 0.17148775264246721 -0.1483394580361673 0.21150223444610372 0.052680395214700977 -0.55276933442090992 0.57263458533618694 0.061304819494471828 0.30627483962216517 0.26980518989721558 0.13099618683354186 -0.86814268690352236 -0.41632444113416706 0.28598579219512082 -0.8479944249326451 -0.43078702174001876 0.35073848198908436 -0.35958728345936564 0.17784478215473098 0.43521631786733012 -0.61025966361749917 -0.96819479580572843 -0.19316565038481442 -0.71231983180851743 0.45411894723381846 -0.2630100111527281 0.56948399840177955 -0.513347857107746 0.37080080795281983 -0.46663847568027716 0.39898520204996141 0.060523856590546717 -0.41157298772691686 0.43074117568535314 0.5847315806979958 0.022182972138367351 -0.95099655691010787 0.25852395881022511 -0.45980229684775509 0.5027632673422231 0.40953907397278533 -0.61634849242798806 -0.96627546996397384 -0.085592468744253192 -0.34331755235540146 0.58783332304338221 0.59613480357412607 -0.47607029956275654 -0.34333089600900718 0.52601094489537403 -0.25026511969621262 -0.78673724285710689 -0.38944952934052618 -0.13816003641468771 -0.55001984361382439 -0.20542117997407111 -0.31554608629432529 0.019846146778632813 0.50927902501713829 -0.68436857187537303 -0.046673148289819881 -0.10112885440658295 -0.24542406059465971 -0.91839336930230964 0.3257593995957036 0.57016658705151135 0.14552035649782194 0.60548465566513954 -0.63483748408510621 0.049469534095401557 -0.41619205146292709 0.25398143770584675 -0.31453930517386847 0.62491446227639214 -0.86891385852890601 0.35435603521062364 0.57442039795516242 0.43650005011833148 -0.92060819228498558 0.16046863311092369 0.081220077722862688 -0.90947061947379382 0.11904925415009604 -0.27089823357562176 0.22854053898609197 -0.4607546720754328 -0.7120346396104742 0.5236153683895145 0.031749321337903896 -0.52019743897947557 0.60244965737497591 -0.19799493103767493 0.4246465625830822 -0.94098288960730925 0.12376101535382773 0.11003706410702672 0.26556522502303193 0.3844813740095992 -0.48055214662185897 0.45086033086019239 0.58803041093935327 -0.40455560923301176 -0.35641099412125199 0.60578381076053844 -0.52936606871506642 -0.26957434439228073 0.50189269890828569 -0.40742585122041419 -0.57870796415563897 -0.1559772428844117 -0.20518557389177161 0.083317360424927767 0.23690921716917041 -0.40348340137377425 0.33361527058509804 0.0028864914973130845 -0.50545338404858842 0.37383156738193651 0.29474055666699334 -0.46440266735105573 0.51217935260080194 -0.097437990090571552 -0.052811063426899438 0.61930656057305355 0.45013209396594889 -0.43396005679326333 -0.60849589647686331 0.012910692516534313 -0.030108444443037865 0.202667771303191 0.52825261841257243 -0.60331100613065203 -0.051830372027430974 0.57699287162290502 0.037792040364775098 -0.050828408317698082 0.38390344742337551 -0.62288577229816366 -0.90518767752278217 0.54441536047321692 0.61943458740451318 -0.5948570731154692 -0.4325554500842036 -0.1192634135939325 -0.50256618397071551 0.13086636611700042 -0.32090874169162731 -0.96709492438781264 -0.54710826136075452 -0.61310423279356174 0.79341707598957589 0.051421773393450561 0.68364957264758908 0.015664047862288217 0.55899145576486753 -0.36719069986868785 -0.48416429214810219 0.43474866128982859 -0.51709575360264315 0.50037921769871696 0.43472645872149079 -0.51743815465652754 0.50280384516153609 0.41350566327225352 -0.50122933885175969 0.50769171387460388 0.434704256153153 -0.51778055571041193 0.50522847262435522 0.41756708829539968 -0.50476011218187788 0.50964183060029478 0.43468205358481515 -0.51812295676429643 0.50765310008717435 0.42162851331854584 -0.50829088551199619 0.51159194732598567 0.43465985101647736 -0.51846535781818082 0.51007772754999348 0.425689938341692 -0.51182165884211439 0.51354206405167657 0.43463764844813951 -0.51880775887206532 0.5125023550128126 0.42975136336483816 -0.5153524321722327 0.51549218077736758 0.43461544587980172 -0.51915015992594971 0.51492698247563184 0.43381278838798426 -0.5188832055023509 0.51744229750305848 0.43459324331146387 -0.51949256097983421 0.51735160993845097 0.11905488882501128 -0.40985877256837594 0.44273865077428332 -0.065816652697676059 -0.81195776728698787 -0.38158012098359373 0.063945000171608729 0.041961259786582106 0.23856600355137489 -0.049735464261354362 0.70532232759946101 -0.79731763857759119 0.0049656700306113704 0.095827754229909232 0.23496287068591529 0.28195074718985058 -0.42915347518073504 -0.76033232931186678 -0.15025281171396893 -0.76201805339057471 -0.26313696018371824 -0.084511239317987666 -0.6065686227497683 0.18812935590279989 -0.011355836692738406 0.7516824795853172 -0.5766127939183997 0.59526513843118256 0.018048109044745377 -0.10635237292855193 0.13550283868025198 0.94389005990321928 -0.75709371854785923 -0.39669993914802543 -0.71687813387535038 0.50343686266201959 0.38825598770652464 0.56102079068423538 0.1304694947208716 0.39562053995574825 0.86077757624362994 -0.56960819202230295 0.57623386268319887 -0.55904933462342177 -0.13588053366144162 0.26658044250525847 -0.65015757458626011 0.59661380950022913 -0.22972212005580875 -0.30263979577368322 -0.82953732029963689 -0.25679057191222204 -0.37568813299080922 -0.22269426398692266 -0.10629479945484907 -0.74469295176747907 0.4671959942973038 -0.083548301261804722 -0.73744087699051175 0.65033166002415232 -0.040480301883806628 0.75913209611809773 -0.2243498660423032 0.71887071962592464 0.24793087200758684 -0.19064768363500037 -0.1332896289335182 -0.65550556909039992 0.42630742540254374 0.229863876484281 -0.45856920839356641 -0.97156151737729035 0.55799294575910385 0.42794737429120427 -0.025628617440508004 0.20422953417549791 -0.7244834380676306 -0.58559746001410062 0.21468044240333792 0.99875069432764452 -0.55659102745911715 0.55620794115588679 -0.97285482821620284 0.10924985798650368 0.014139508525927368 -0.61738508951444737 -0.60714923225347017 -0.20736265580903518 -0.28574318383176317 -0.81238281025462866 0.48170846601657191 0.63345400149484354 -0.079805248069381898 -0.24424619328319888 0.60204115967763594 -0.32847129022758786 -0.25221996488376491 -0.41242484052984979 -0.1665315264202048 -0.078755502411427855 0.48359158238887007 -0.91605170860553153 -0.26596438200645006 0.048979403376460784 -0.071540136463715598 -0.40402862950021179 -0.15735603267010584 -0.47592872232910632 0.73791633863197703 0.10839008554084383 -0.60155714242821567 0.53152758833350322 -0.36351796025389893 -0.78896631006296369 -0.14406222590518089 -0.65599710995288218 0.67278615891465376 -0.22985934624308552 0.29108169413678137 -0.9720993469338286 0.16761021142490293 -0.92576938300093281 -0.29260594102990273 0.49424640593179398 -0.36560864093321416 0.01482852746824855 -0.066033491595447427 -0.555260124982493 -0.87311260623658049 -0.043547098070551953 -0.60592183369033914 -0.57901696253631563 0.29195435165754258 -0.4065388899700742 0.32027251866807926 -0.25140114215579001 -0.3252521204866578 -0.12780500971918002 -0.13989673618427786 -0.086931423208230663 0.82292835887661553 0.17366891950289193 -0.084047154506641839 0.21995247808728119 -0.44101756048761492 0.16394005016350999 -0.42858795511655823 0.30241073481051273 -0.95679093261739423 0.41482831341485737 0.099836259388330614 -0.18144467847124854 -0.92649859965392078 0.55112097488785661 -0.58086993601763626 0.079009243471176133 0.71879764056317708 -0.73815329483120407 0.19785607330826688 -0.2471330826606945 0.36873065369845226 -0.10226078921979644 -0.25270734483764906 -0.098342231161879928 -0.0525312496109719 0.25231661860361365 0.1739135816016108 0.27547333150101089 -0.1669055191348614 -0.071205110565724733 0.97294669203661277 -0.16179136106501715 0.28408558877062973 0.13288163313114512 -0.030850817845079665 0.74542798539352717 -0.16114170720376123 -0.23054934380410744 0.60804242724017399 -0.2742138996238459 0.54921606031168246 -0.13459247478279687 -0.049132562646265018 0.39262001804722213 -0.86285635628398827 -0.33826321949273286 0.030826604588383957 -0.26350802942389484 0.78179553001475188 -0.17970534333673363 -0.31646370237459759 -0.82477134839244093 -0.21321479981097469 0.011633120066019164 0.036942248198985568 -0.27765811240941979 0.55355098206580233 -0.42965348251026919 0.441962661398695 -0.88745708037811488 0.50766773147452771 0.36438014204601282 0.42216728070501353 -0.96312663306967028 -0.36675222782495115 0.27580778315568455 -0.6911129111837393 0.09835127492650711 0.76078639285202299 -0.098706671546397007 0.067139192219274141 -0.14981208679272995 0.20273341790578517 0.38367751598144784 0.6096260086382721 0.079417010035385593 -0.28487719239300369 0.014601128639773637 -0.12714964670157083 0.53412063435066814 -0.74783162360758615 -0.221471873985993 -0.016146040251323945 -0.39999416129766863 -0.98098983998621059 -0.16560317392957294 -0.76500830015974686 0.55675663735189307 0.58610532953566596 -0.49211425034057782 -0.3976718303815846 0.00076387914175274742 0.47861475846257023 0.18737766891216126 0.0045109232600263529 -0.23735418150016835 0.7127845390776425 0.068671279182191167 -0.27341802803070603 0.22690100998869142 -0.3841740291483417 -0.59851542444819905 0.54126208623697647 0.51194989430206894 -0.80655284540817607 0.50880035932062551 -0.10854121962027508 0.42577269656463979 0.13341569422074523 0.64133534084264898 0.31031512494896762 -0.80670008868621901 0.71196463244536001 -0.027582697597933727 -0.89591423462670428 -0.27086170838234458 0.20744279521512074 -0.11175156131432261 -0.098117201179639638 -0.58602893336318307 -0.547933249081757 0.06430578322353328 -0.66257694409858325 -0.98055793529047264 0.44299010454918958 0.76537342067616498 -0.72384728892103889 0.20806281259400985 -0.77309999539344354 -0.53958262417334935 0.082411388766773855 0.48228244190230535 -0.96372560472828206 0.22542105527960465 -0.91394692229119101 -0.074882041913463454 0.22500100178724453 -0.90987024885444412 -0.064599479115843114 0.16013886929945498 -0.82573902491040874 -0.48065895819987542 -0.15325838567309708 0.18722670994263821 -0.91696514940226359 0.035977753774149808 -0.27129951898493021 -0.95369166779207715 -0.58000042227203852 -0.58199287026334068 0.71963594702380485 -0.33564720905431533 0.41621499834501163 -0.27170564787071183 0.22705486912940442 -0.37241135274869064 0.28390746451457466 0.095878471754522923 0.15308409134810497 -0.91234053163310802 0.46552458896677928 0.60181022052962307 -0.79289648756968645 -0.75563540213862124 -0.60818134204591667 0.80200395598154017 0.12451957434469679 -0.37601121751109157 0.28478005368378789 -0.049440154554977606 -0.15851099299221411 0.56857269720696468 -0.342040978057772 0.058422039873934337 0.8916333129047983 -0.3428004344203866 0.063291062380426907 0.88134735019221289 -0.34058594620523197 0.054119492688433871 0.89395914878706972 -0.34179735483016921 0.061886069084044218 0.87755201263126648 -0.3402394466916035 0.053094889340722332 0.89451302051199444 -0.34176087249793541 0.061834969019079492 0.87741397496487561 -0.34127270465298459 0.056150245913071897 0.89286138076402077 -0.34242394192925968 0.062763716962046828 0.87992282106518871 -0.34230596261436569 0.059205602485421449 0.89120974101604722 -0.343087011360584 0.063692464905014165 0.8824316671655017 -0.34333922057574678 0.062260959057771008 0.88955810126807366 -0.34375008079190833 0.064621212847981502 0.88494051326581469 -0.34437247853712788 0.065316315630120553 0.88790646152010011 -0.34441315022323266 0.065549960790948839 0.88744935936612779 0.5293725000743732 -0.63785616192414307 -0.90154755221908256 -0.22343458792897927 -0.27098059197276525 -0.80919095200902691 -0.011299680790958245 -0.49469884645848067 -0.73184448017552639 0.17604207057364882 -0.91177093751123828 -0.071697059764819465 0.17685061930246287 -0.90926010277055269 -0.065783097608720975 0.17765916803127696 -0.90674926802986722 -0.059869135452622492 0.55606638277239351 -0.70729811921352226 -0.31628609976228778 -0.054871545485694138 -0.80228683927225819 0.19871751726325651 0.12714266358763635 -0.94869207287025503 0.075730285117764834 -0.23284971931454304 -0.059142428095587993 0.76076498176383567 0.57966632468117596 0.33759264234659692 -0.052497302910658808 0.4336125373612908 0.74065010010311016 -0.37213322954723671 -0.2092899183595047 -0.0044814719101236291 0.70211605265436106 0.35801005322170598 -0.30114416408181871 0.16416986695534108 0.71563228787507771 0.033295241813588942 -0.59003101729700602 0.54578589274618283 -0.22348678445373732 -0.4910712630091974 0.19315586545081939 0.80146067944222343 -0.35539903212383422 0.26274930022998827 -0.76143057640445089 -0.53906428444240206 0.55274485470258783 -0.86069369453248967 0.44288639064558705 -0.26712042983219486 0.092349279663774514 -0.078553321646251562 -0.296801230844708 0.46125328631095208 -0.23633541153297949 0.17138354770476205 -0.86501682052219686 -0.42560090227036934 0.44229357403376002 -0.48750838357942744 -0.76945708713437877 0.58275683403171641 -0.17183374673328314 -0.1436187142296253 -0.2163654238936018 -0.18468163412572713 -0.60763222827813368 -0.23426325774146231 -0.17873438874316488 -0.60779685474131928 0.67907731068012123 -0.82285553803405143 0.31648417350230063 0.15336559312236461 0.61362445598037785 -0.95467779727312685 0.11309179896690343 0.55194592815943022 -0.96326503532931762 0.53007091267795703 0.59665716537373314 -0.11090016523588699 -0.32923972711482835 0.46212742461823586 -0.56832522374597971 -0.19049736215261501 0.39224552473666818 0.035361580613446388 0.47709691069459209 -0.55452647164939861 0.42660954313426547 0.59449309493838187 -0.57546686235227618 0.1594169150502244 0.084136302470637025 0.95209872537299267 -0.70836576828233866 -0.15917066210429406 -0.33557397107631798 -0.54658057151037598 0.53245059000902029 0.032686685166481384 -0.92230419271288988 0.39790468603586182 -0.861747796518055 -0.11532178783369461 -0.16008131311988058 -0.41098250442080558 -0.98080401178478804 0.46947767377635691 -0.80115047631289926 -0.35885351699573975 0.053878193156938245 -0.86958831015237714 -0.38687141375612555 -0.2444189101367561 0.036800223338233351 0.73161054946633275 -0.066285572155002637 -0.30466021124327197 -0.9528420280396882 -0.067226772310397004 -0.3031345638900062 -0.95145131977680153 -0.068167972465791371 -0.30160891653674043 -0.95006061151391485 -0.069109172621185738 -0.30008326918347467 -0.94866990325102818 -0.070050372776580092 -0.2985576218302089 -0.9472791949881415 -0.2258585421365488 -0.36227981547200072 -0.38863286458545093 -0.36109902278967854 -0.65656951472430747 0.76299345982417155 -0.082920362089993177 0.2906301915875989 -0.9214805352307015 0.65696347346870376 -0.13651902309956471 -0.29344992741467224 -0.11898283220568699 -0.32824345241422315 -0.96805897211177971 -0.19740879342169332 0.54288419847053548 -0.09718092902985899 0.057882640858287593 0.64354735666994389 0.066903985179450454 0.39373890202192874 0.75521253662160659 -0.50145321939494458 0.18435804293143673 -0.99064470159300799 0.17070036191888438 0.1619864053712545 -0.41948699642134329 0.5805952035923162 -0.10272861105039865 -0.38904341057953967 -0.83229697841664563 -0.1007070911986485 -0.3901887159781679 -0.82704076164203133 0.41984225758176269 -0.83380580632943746 -0.0085011250127866676 0.47312667158951205 0.67522818874892387 -0.64968707727261443 0.32272085134985823 -0.62768400069897612 -0.60910241935304865 -0.18196271130997621 -0.44840184746977113 0.051375409554140619 0.58867799362448781 -0.18816379622869384 -0.19449200990821774 0.36060910322691087 -0.64422336654856849 0.59277773960327906 -0.19396431010368725 -0.60969607830688588 -0.11179959727170799 -0.45832628656584212 0.031788312802419595 -0.28804895353139071 0.5881860224903358 -0.11100380031540139 -0.51522293192909041 -0.10833875674554228 0.25487741735189701 0.17796640801698968 -0.11613364647727092 -0.18989771840343916 0.11645408262312797 -0.25153793268712871 0.10514262098040701 0.76174852993094788 -0.16763429037618671 0.61556829688360604 -0.1245426879694341 0.073379525413304836 -0.4806220692060163 0.66310361150751851 -0.38375010724845143 0.34548586948255161 -0.46311197125926751 0.65765505500665644 0.47981558333859603 -0.49859083185642067 -0.13186334273578673 0.67863799056486684 -0.16972121549678085 -0.44005663908669573 -0.60048372412775075 0.7360383602373779 -0.22514465076352577 -0.21700476258542575 -0.49718339226289521 0.21890643476437149 -0.63277828788266066 -0.92271312505927872 -0.22378541936862711 0.11728892763708479 0.035919065823834279 -0.24555449120651773 0.03783571341622545 -0.014015802341949823 -0.17772706295610649 -0.18592285695196503 -0.92313967100745697 0.28527893075269223 -0.99933408457982298 0.15733645055326889 0.38835978267647769 -0.37400555777367289 0.14445387712695684 0.62218931182400738 -0.039615128212072505 -0.72643331826130941 0.58870414553115824 -0.49470518535316271 -0.15862513082495036 -0.081942353775837126 -0.65421774142036226 0.24826639156162247 0.39018633189660701 -0.55486608936960347 -0.82989491543255911 -0.11725048409639294 0.60353602172193233 -0.010484511583145494 -0.25480901674655432 -0.33521523170823736 -0.28205069791775361 0.07424146326359457 0.81929470670958582 -0.48535445727727128 0.09808434706911745 -0.78847271834749411 0.57232469957676346 0.064353669838164596 0.55117662707441939 0.15902734833540086 0.46101563175565047 -0.4581619036793142 0.10206031339389289 -0.25760245723130937 0.58260715739348645 -0.38097649269117567 -0.2640620915046562 -0.15911131130822664 -0.64049398483617992 -0.091534793417618637 -0.43978561340143907 -0.84598768911767452 -0.087927178691608016 -0.4487733602774166 -0.84415524654307261 -0.20352751835837826 -0.37662503000623804 -0.44111143315935658 0.067811136986906759 0.79635688178944841 -0.35145926091794233 0.50647054618302867 0.045495181990468418 0.11377289418701707 -0.11023318473846341 -0.3183070908715756 -0.96231608103863298 0.60591778437231869 -0.083411941849896157 -0.757783836663243 -0.19844431958130659 -0.013469076672438463 0.93108828459680537 -0.27136397438243809 0.53124252980950393 -0.69074880690125362 -0.22333629937435417 0.061984797778402718 0.79079126720726711 -0.48608408372556089 -0.79051647754508714 0.78168847252674933 0.58586168296865293 -0.037791554863185216 -0.10024046930008543 -0.13772371141296669 -0.74223039660762413 -0.3897144127563737 -0.29340486479039829 -0.24610849483926528 -0.98474674613313951 0.30667918718368015 0.49732516456644665 -0.95936584905965483 -0.18180501941559063 -0.25510513692705133 -0.49001055126068477 -0.16393829392966219 -0.72168447119946499 -0.34855389069013171 0.32911445017760732 -0.94731503995894506 0.3825649421837527 -0.35024119706213969 0.2434074307658351 -0.17270140250454777 0.63585393289788261 0.52444453699786719 -0.44421371938243476 0.5146690429720816 0.1122763755006955 0.1186629832990552 0.1312513088721092 0.80136830031374851 -0.34985647126284175 0.66226574054598519 -0.62144038905038523 0.12695776365641889 -0.03525245607532667 -0.52336841257559941 0.31164657398195394 -0.057750729315871455 0.2780037303862451 0.21886914087438317 0.19624321647077222 0.57203783639767969 0.1580661508986374 0.65145662149057804 -0.65008213982779117 0.24455870972876684 0.041356878465856901 -0.83750477488581265 0.4659875391850215 0.6178651517156315 -0.5423957880454795 -0.8710367986704044 -0.19448646703290867 0.65383539710157179 -0.28442146404270563 0.35907914408203262 -0.44292202881868331 0.34855995289438141 0.12658578102070403 0.3129708990168053 0.27697430160139441 0.33344117450674776 -0.83995181748491188 -0.42552658821135958 -0.42419926951499465 0.0082569694904209134 -0.20540585453059379 0.20400679913233685 0.92985903839047501 -0.46844819998122034 -0.52408393850033996 -0.75522410039825727 0.8581843948190705 0.12343110049321097 0.65533246792679534 0.064998866523980389 -0.43613803684827779 0.1440221628769634 -0.50301807289084188 0.30040126713243609 0.91124116841528602 -0.77845738902206685 0.039064712667264814 -0.89236415660006341 0.087756723548514506 0.032978541122558644 -0.4353773449676332 0.31137076833464267 0.51123925224210987 -0.58884251891664452 0.46574492599904521 0.1873010290850422 -0.52723917862966352 0.58864507369423991 -0.2144333550630475 -0.40579219942798406 -0.0063612445177043961 -0.20233497135825074 -0.31049069108579613 -0.43965607009536356 0.33596265325878599 -0.89975710434495959 0.54909555472851113 -0.1445676151786727 0.12278227741521945 0.13128153149761987 0.013119665345932454 -0.43643963391817642 0.44548677680396975 0.36711616662925201 0.77220918402890582 -0.40721593477445212 0.20065685206519748 0.80088049532618832 -0.29446538602109917 0.25803176330663607 0.31559437114601768 0.27327250046658952 0.41364489963841156 0.42053210737552238 -0.96323198722040371 0.58047230473214484 -0.13317611280927791 -0.46327207542597065 -0.71315137388685235 -0.56838839492504911 0.74559381579126649 0.2913757163743807 -0.030738657498976373 0.21874183376083137 -0.29453380529012196 0.018080329895635527 0.81681866379899382 -0.071274436079788589 -0.10480572302439645 0.59372728313570533 0.27940780295742162 -0.78136116735347105 0.58860231327838464 -0.24504975136085014 -0.41052124068227208 -0.33176993938452998 0.0013076137095518834 0.15945800537860366 0.24765875552914382 0.1974863065448553 0.51631629770618803 0.20032478287779315 -0.18818965271052746 0.34758628704893163 -0.97123979097259772 0.20229101303311761 -0.53051960487670935 -0.66735147818176421 0.14076094201341263 -0.675688176848801 -0.61540749226889613 -0.14390574549905905 -0.35137807404019089 -0.84870543564324719 0.28259894904199634 -0.91391792329501231 -0.092285536113589375 0.28470660413904919 -0.91709343806525156 -0.10081169095164369 0.13096044194870829 0.9902802965102171 -0.63303831485955653 0.0083012868371744042 -0.75415059348793401 0.58497478026954242 0.25018993856114374 -0.95779307763376198 0.40857892017310382 0.73580301214103294 0.32706960500029009 -0.43846457130025668 -0.67287340506251458 -0.57494161399784482 0.79743627145854512 -0.25930588302877333 -0.060866388412006527 0.85671064757122062 0.15231488980566829 -0.88208003303486526 0.55213468006390165 -0.14853219405441589 -0.77425886916702868 0.62115393351485937 0.54976167338609172 -0.33659531068395343 -0.085575370155024408 0.26807866545652403 -0.88661182062843613 -0.37097307780816913 0.52619349912398561 -0.32386992605242065 -0.75410889289795846 0.32568662859140335 -0.48452757797539897 -0.64608933666857205 0.57208111940783968 -0.47874519632371904 -0.10518007021372264 0.57339736381244977 -0.096013847137098735 -0.58665406910573115 -0.18926481066891604 -0.57651628672918032 0.54694294597406301 0.49813534752648048 -0.97551278078374037 0.19506180865747649 -0.26305205213881855 0.56042789334963927 -0.60324053085653717 0.27313152879568187 -0.24275837623165245 -0.96612748161049955 0.52881241341038709 -0.46103971284914386 -0.51232079781719508 0.014195198138591965 0.9043692500533137 -0.72989440506524172 -0.11281311879761476 -0.27185294785719905 0.81055596295651988 0.19553653500115284 0.81454908514997881 -0.87428871097541749 0.0094723196441300374 0.032487141303023583 0.21850838272328837 0.54321276821609377 -0.60463821195587419 -0.85827310144922464 0.51604059785304357 -0.71856258121299976 -0.096609365648725215 0.071618037356524084 -0.86706070087070286 0.43966960547165435 -0.032721104726325619 -0.10093706617566245 0.16909307715158048 -0.21304357359150131 -0.24755523535216123 0.0063934781186416488 -0.15648201238535497 -0.20020090459155668 0.67426672765563123 0.022685055945171284 -0.88541005644268556 -0.15576052984495048 0.43916825512096841 0.28356157726017717 0.20795280242217098 -0.41867320229946697 -0.14198585940453556 -0.29581469525729004 -0.15411634812958508 -0.51347146059283399 0.069544749273157028 0.1976752658411261 0.19118979769388458 -0.93033719111397828 -0.26701703601753302 0.55567835860259229 -0.30478089271608338 0.072780984558219741 -0.55951008433009586 -0.64863452333251903 0.34667453446522029 0.12297745129168416 -0.90228515330089643 0.096918975177105446 -0.51452591116861579 0.62537896709264551 0.75315172425175303 0.019368384905380419 -0.4250208406514363 0.30551345038771432 0.55998330520500372 -0.94923066321416516 0.58045963056992078 -0.42123056567206746 -0.41360174583143205 -0.22984955435621032 -0.27541555730802819 -0.033242663464816032 -0.3382508370964914 0.28185373874470149 -0.77394143288072648 -0.18781674868199594 0.47509885760562443 -0.02436881379485456 -0.28396030749527446 -0.21354588173947786 -0.2396495991829283 0.58515276751022927 -0.068990354256492345 -0.66856985443084094 0.11963454051717123 -0.14777060143680826 0.21075411438019745 0.41172919275048336 -0.19092012499209959 0.11592747747631992 -0.087423272280510833 -0.0033255766887907816 0.67634787192660273 -0.058843448208729512 0.20988510773130784 -0.8996767060111085 -0.34568421448218523 -0.20432188571653589 -0.40649232691247017 -0.021961661640862936 0.77653913163003163 -0.8135123255773884 0.043867677570634339 0.047273400953698128 -0.90561061362813544 -0.20692859884868062 0.088588445464879012 0.70776209092233722 0.72888814384870226 -0.082371312777529571 -0.34039166974417567 0.48202854701172565 0.19666145306782204 0.17003937052433396 -0.060477602331469309 0.73991785825897327 -0.50189035486847611 0.34924490257909269 0.6769515575894659 -0.89244511751472511 -0.201993686481302 0.21007003469788188 -0.96323584746651925 -0.049738898992432987 -0.77607599436193386 0.093594113543170959 -0.70550428314557345 -0.61035399157856918 0.64626416764356787 -0.036447020920979525 -0.59026435532452326 -0.98239130220100723 -0.022777770945046356 0.72611317313387891 -0.09983890099901542 -0.067945249809293978 -0.65444620934174513 0.37659510656154771 -0.19527963609765484 0.35048811868114021 0.056999875830387334 0.12984203463391369 -0.24383746100737241 -0.96164864373788861 0.69338205879599046 -0.69981495819822137 0.25301993055853311 0.50854649842433663 -0.85454198954467331 0.48484248945449882 0.4968685329932836 -0.48877717883463051 0.14278536061624528 -0.019491246622367956 -0.13468031152562557 0.67067122417391112 -0.300279253066977 0.50662990335384206 -0.63446835194953743 -0.20115087382096125 0.25572046893460509 0.084521878769319547 0.29299423378102518 0.75758268505438986 -0.12667936577416272 0.27561372641040466 -0.33422813252972899 -0.96530231181875914 0.12965710406748907 0.44832501731707586 0.23672034721614854 -0.076866141541683503 -0.59152174860633089 -0.97715796141809197 0.2007496429102115 -0.64106561051037281 0.59205609275211779 0.52141176971546022 -0.56758729131229091 -0.81904219425167757 0.58294546873566078 -0.32884295160211274 -0.30738252778139535 0.7424799678568641 0.18374289119691348 -0.62126708255388297 0.10340461723548902 -0.60272716463519393 -0.81164089218980384 0.06182673971370288 0.3737767892423759 0.25700082002801183 0.14108549228546638 -0.48328815907710515 -0.7518589051614728 -0.13444265035277672 -0.7350377686994255 0.67793229979188085 -0.18706402874530895 -0.73502851311026562 0.70299727704314718 0.37198197193899629 0.78398443541942975 -0.55852612459342599 -0.58917440884238892 -0.68646293055278351 0.68057553728275921 -0.1128002982799034 0.31345366901042104 0.17368794053236739 -0.035542335795904642 -0.66888452349233951 -0.55544724556179015 0.47348574196049403 0.69791879758139663 -0.18841256154345823 0.68945009602021767 -0.74875225706962589 0.086060336124186274 0.24491522127543605 0.80243385503205489 -0.42418499169577772 0.27408604306279821 0.79187421227296029 -0.2452043564407545 0.71827179963484833 0.34042780434314679 -0.25338500321876001 0.68933678026944423 -0.11797842596700424 -0.34391668016004795 0.12007279920204263 0.97996691015735082 -0.53513868272021403 0.60621127477564085 -0.13152175675625102 -0.9652358049161156 -0.11137770021894962 -0.74297735100864037 -0.076261533589730132 0.057933532482320964 -0.25213198471229326 0.5397556281810848 0.56942368951768296 -0.019405878504796026 -0.047560015806062034 -0.21553217432915689 0.38858613474740306 -0.034478138960835285 0.034615023598900271 0.50234325211919129 -0.95828227773559593 0.75334005719323405 0.079580962876070929 -0.2519521039865828 0.7466112183384418 0.027627626379721618 -0.23701177962519493 -0.28492795058228348 0.27694700634440944 -0.14100666235589437 0.084715189855753562 -0.31676362765439597 0.65420048326528757 0.18570094549104973 0.11130731413175871 0.26796821749665967 0.4449348981000576 -0.64753310695034938 -0.93607060934304431 -0.04984111639244132 -0.33095614307034282 -0.96898366747437426 -0.034949897057091825 -0.35489672717040072 -0.97556762870772984 -0.15095146967035958 0.69630040269520554 -0.29019517425624169 0.43885202639949888 0.53717665740921283 0.098394410037348182 0.65082792209408724 -0.7102188619904729 0.035065967133884685 0.58968078946986768 0.21325014159684438 -0.96108735421503 0.10031333421281127 -0.360472513526786 0.48030316661433553 -0.26959374820998272 -0.1509764152015258 -0.66315280634683793 0.16152502946105726 -0.51979431956990141 -0.79422469970748155 -0.15769251826909608 -0.66840977779054711 -0.078633926882557034 0.36517747838128106 -0.98726931765721215 0.18725982359628399 -0.26420641487978397 0.0053111660442574952 -0.065472586525496479 -0.12933810072376106 -0.11890806746891969 0.94319843581865115 -0.30787588818911338 -0.16921176555623957 -0.56672013882736438 0.52784577428015045 0.63179573069941231 -0.16267331124958417 0.30958461074898724 0.099023903433550386 0.25691196762606006 0.17576906423298269 -0.37269819651985908 0.28727022021885806 -0.23784895121378605 -0.11767766421552379 -0.95471390982092386 -0.076299234068400501 -0.71378546529409825 -0.49490816105749535 -0.28469079583258022 0.49736584285026542 -0.25005524793518302 0.69472094697691955 0.44221047651190176 -0.38157139862345757 0.4870619119033136 -0.15969519643847965 0.038742774104211175 -0.46650781797935259 -0.046136728182516171 -0.4747657478284662 0.61168998479511616 0.53770512995132214 -0.50756122530572978 0.20930248073126123 0.79568780942297657 -0.23328182615556675 0.7311218786668886 0.25953148258949321 -0.65104402359008751 -0.099656061698632156 -0.79955210524497766 -0.34613265445238056 -0.017050990404009293 -0.31043002240143952 0.81539317608685047 0.55096179860614636 -0.54280133820513199 -0.96595959417730515 -0.33060864750959668 -0.71654051330212454 0.4860581058084284 -0.34265239610875986 -0.75668501775632935 0.64040269074603529 0.15268333683397578 0.69091520820092978 -0.9323035896795131 -0.19923788198929276 -0.33586111787000877 -0.84447090013793835 -0.19140674454227483 -0.32696596327272909 -0.83505787610215376 -0.29226545916849717 -0.22428277217395617 -0.39890118118715823 0.068511380961594898 0.099938240212722879 -0.90688818755044731 -0.22746793152511166 0.14965718282487703 -0.97294380070716457 0.093114369589761686 -0.86934547720625055 -0.40367552663033901 0.13469714561773935 0.96288015945139294 -0.49504835370048833 0.37986640814942463 -0.52085978183713433 -0.81200325640840854 0.17802562743835199 0.75577457081545052 -0.90563308849630486 -0.26374387852939296 -0.21152459639926147 -0.13528008510722503 0.57602997471287687 -0.81651967529386726 0.44904033673878535 0.52118951735923913 0.30771408182539528 -0.95308503284803703 -0.58582352433517981 -0.75086820224152151 0.88910496682494489 0.35518198624158892 0.86560262586639281 -0.52255310037598623 0.19042055515296075 0.24592626081147925 0.28278927584032526 -0.10045473485273079 -0.76183062692788484 0.52232919419453405 -0.039283873757312154 -0.83711779494401906 0.16444046346532287 0.52733062075478732 -0.58595231130394343 0.3249474809834933 0.66346704702800297 -0.15385987236952128 -0.96241973582767104 0.48687315854756813 -0.51406203381248783 -0.97229484779824182 0.37625921082901392 -0.066105411677912201 -0.90774002245039265 -0.71471947066097041 -0.60375760980441484 0.87756930507351694 -0.72669004600130005 -0.5914352005005008 0.86262094352353602 0.04375151160339915 -0.92730691012225019 0.20846370239163359 -0.19485924538211097 0.20007397290573911 0.08647681182271727 -0.56004161756442894 -0.59739859550863894 0.6195145705436742 0.38487547670527 -0.95158937979248015 0.30194860513445759 0.12112361591521906 -0.019521580417187379 0.2320514657772437 -0.041166472517802949 0.79563269244040946 -0.66040906799658172 -0.34208317674074967 -0.13392966302287684 -0.61732854538076121 0.55164870985667225 0.645122848498343 -0.31382515320571164 0.2907355275246673 0.82067919324276817 -0.48856837127237934 0.52249443223257608 -0.65247910492562256 -0.0031872280481788939 -0.14538602244301524 0.39784448692002367 -0.9734427902318008 -0.10998005329323766 -0.093763973562678266 0.90145092596735821 0.36769592985652666 0.090578715461308329 0.2349870243038801 0.52443095958937858 -0.76845887851876105 -0.2735787561239425 -0.11872958229056493 -0.31638800189404265 0.15447825318204236 0.18851730936435665 0.663282256041136 0.061366591136583361 0.40086666665379017 -0.58363614467024494 -0.84591015667836045 0.12815828220523615 -0.83754040016942666 0.5668375018067876 -0.1878325587547261 0.43553222325490443 0.0070824804293954631 0.22775342738492246 0.37461094468121425 -0.95985683681548484 -0.0366074200482462 0.83482852385723483 -0.74151435037661106 -0.39443586865187791 -0.17774797948988197 -0.41254076347423491 0.3067664702271195 -0.052435571268217289 -0.91032062836401539 -0.35519396110850593 0.29046470510041877 -0.19050080146022602 0.74686572352041303 0.24085704282656933 -0.57307896520283474 -0.11622465365302243 0.55406548060717131 -0.81406229450904499 -0.11198965760677242 -0.76964467121857993 -0.12108556665413266 0.40204875942493362 0.71965101862378578 -0.8390842665475291 0.18746582510556625 -0.42732779960983402 0.39300436395134741 -0.22765477696225492 0.48799836922825029 -0.11777340669175505 0.14525686469001436 -0.73038072272722909 -0.57724511348864049 0.66937907179873568 0.10960111030426571 -0.77035647499173099 -0.33675426578063089 0.4370265150029008 -0.63610399183924571 -0.16246559927647161 0.5912474292380836 -0.077281682083843603 -0.36283126933284437 -0.14664894558482988 -0.24137753114750074 -0.31391292587026531 0.41346536745944606 -0.76336642165346669 -0.22364004799438256 -0.53750454088127175 -0.13357207018969255 0.55421470064285394 0.0059096860282755927 0.0050161680803553436 -0.31540406345776573 -0.22030201310849237 -0.34537213564918384 0.25974020645574825 -0.50793697753057276 0.57596466871032959 0.48123725448780841 0.5048477762721284 0.059897525522125857 0.69734453711610489 -0.066651379318043963 -0.84769106616018874 0.43735287487889607 -0.97628983440012851 0.20573097499723958 0.13862222466076934 -0.5478353701461296 -0.66217222105791229 -0.00166157987617397 0.29315502488467926 0.2508513271939003 -0.34333147044258561 -0.15220530583960398 -0.85679828333842678 0.34275738499237884 -0.96419021041857156 0.27686731542553006 0.11633455234811045 0.69506439578372581 0.013662290995500353 0.067407659029456321 -0.21252204531762295 0.21319784463246469 -0.38972013621900686 0.15763017524527551 -0.69910780353730639 0.55310153298854436 -0.65781090519524432 -0.39964241769041114 0.43082454326027153 -0.51082664340180839 0.41668915805209616 0.15321932612341968 0.98249784305027466 -0.68217200233323805 0.59569148103733127 -0.61634919745438865 -0.29840217355847787 -0.37395769865984102 -0.73451473560370573 0.56699057628145133 0.10755614739630695 0.73054819721512421 -0.040898994234324776 -0.44330309698424425 -0.01851676583707549 -0.57344425900845231 0.47562823559930378 -0.96144700014415319 0.25100166427801274 -0.23541679859637943 0.039372099427849375 0.85413155605197888 0.69339749174058551 -0.0066763025872130883 -0.9465782908817183 0.41317787598021838 -0.64011457110567416 -0.92111912379958027 0.4493078829451701 -0.52785641795720595 0.49079459106372764 0.4510973008627352 -0.52986940479619082 0.49570422523634 0.45288671878030029 -0.5318823916351757 0.50061385940895231 -0.41312500144603237 -0.053113651899025893 -0.6404451193101276 0.1182155951532386 -0.21025684122721974 0.21798832238321666 0.15500548097689065 -0.91910411712373163 0.49038985434311505 0.56661232098564407 -0.29183359627735661 -0.1414701019766407 0.24742220095815082 -0.46241743933518414 0.5195428987520524 0.26346361762452952 -0.4638653896984819 0.5225191978007071 -0.27987195800293457 0.36474512294280609 -0.87882100451400358 0.60483509865897744 -0.13206523786476124 -0.19627873231160045 -0.15192569968322275 -0.10074298671174134 0.6491583152916266 0.1814488298902259 -0.43527221018016987 0.45500967951571653 0.37991210366544165 0.59110825204429918 -0.90247083571679432 -0.6924604071342545 -0.60647517875226598 0.87621811551960416 -0.19856922981521402 -0.64756444198562302 -0.20783844415363395 -0.0066856638750915562 -0.46372490816261636 0.49172106090881457 -0.061847660390628549 -0.77107218100297514 0.24053614516553734 0.62552345230211859 -0.52637680364789396 -0.92539150033943018 0.34259618878028819 -0.99172349147625283 0.13873705070466966 0.32705213804304367 0.51384061736347875 0.18806860841438708 0.46971818162036483 -0.89600823604946445 0.021520120471656069 0.19382332513676548 -0.97351920056061103 0.25059589127100912 -0.00042949806749133896 -0.56772066558613898 0.45748611626197305 -0.1367906104653776 -0.33700994927872807 -0.83158728994659037 0.63330517091558969 0.35041396351609294 -0.12344479867073717 0.54190244990822811 -0.28732290300286589 -0.64525056986878271 -0.4296499273609049 -0.79478072250717369 0.75179583422876639 0.40367376513681069 -0.97935821551525937 0.11588832808609155 -0.048633250267501892 0.085285278265117434 0.20599528891920563 0.3134747539754788 -0.28833300828631375 0.19206813134050241 0.45619879376952127 -0.9215136821588028 0.44975090212848728 -0.16134704744188039 0.33909415546373539 0.1203540635009241 -0.24369419155966981 0.33682520801469196 -0.083916014856829577 -0.10489659211333072 -0.40820328442772719 -0.85040786198908758 0.59909534772347062 -0.44130191634463178 -0.95843083993990508 -0.52259456919296043 -0.69841939390064878 0.55078987327199713 0.61588464200787163 0.3024229931442402 -0.10446144928182337 0.21173673166566348 -0.8597176407141065 -0.43061227138561814 0.43811550545497896 -0.58308420163376928 -0.56763603045014999 0.38447350609586606 0.48048834894285347 -0.95823653326049363 -0.16981076304896192 -0.075720132650072811 0.076517958413900827 0.31347962700645532 -0.45199225672532228 0.4212368783266725 0.10373854290866555 -0.53520936858996282 -0.98088073102389739 0.65342072830708908 0.038454405344852262 -0.14676800010833557 -0.40258356522268374 -0.037778506050333248 -0.19649224236273924 0.18569733671848399 0.83467947967372602 -0.46104744898140204 0.51424910898339526 -0.17741334236957312 -0.0042689416514020799 -0.16512793338069667 -0.71141812477676414 -0.17141382638049127 -0.057226630249861729 0.40106586724682536 0.1901388321171753 0.29992480108069197 0.79206586347694463 -0.44197897528705504 0.39371740772821168 0.35775413849689486 -0.95351948499045236 0.13757854132937308 0.2571042145552187 -0.96779708511042384 -0.057862290625558706 -0.094846908694935284 0.69218861617934502 0.47799889806604218 0.12915196819862684 0.1703761947864888 0.7045725310265879 -0.76258648366255022 0.28068881624348629 -0.045026460555883698 0.52649281580241292 -0.8909700285226585 0.023293598947571714 -0.33917944440936976 0.23535774687813077 0.43900302429832383 0.48174008454349992 0.13789844570066995 0.015470231855255116 -0.14266828478009494 0.59199736210670317 -0.01706487054651978 0.127009015946494 -0.8997134219986993 -0.060751778268444023 -0.55573174497966615 0.27224987876061041 -0.37436119989362504 -0.17617923453901752 -0.29426303730188524 0.52701489488335085 -0.320990854945436 -0.036400754314083829 -0.10640373390259109 -0.80963872914936386 -0.21539983287062267 0.043242631592647227 0.35267834110497248 -0.96815321519648379 -0.18030497612595037 -0.74803143196087518 0.49829559042187632 0.1673174035628858 -0.19149276313944763 -0.94869063872568427 0.22644436102975032 -0.29956283083592805 -0.96439095127224517 -0.40746517451775022 -0.75400058310773876 0.80111697453601127 0.15105649132018867 -0.78882497287057696 0.5790604235779433 0.57901510796166777 -0.63707678998187511 -0.35102373585745028 0.40144893301498347 0.76526972616658906 -0.60576133036903168 -0.1449795633643767 0.46084031033794404 -0.92314985446847941 0.67867589320678379 -0.0066142383672512586 -0.83656047263190469 -0.28277980268122982 -0.23584018623425682 -0.28863262276995583 -0.098770941806213042 -0.42780653359799775 -0.66624803649037112 -0.62996189927649293 -0.57683991383812905 0.75440436531596211 0.65899899035785592 -0.068372610552231983 -0.80061231496624796 0.50944056928439685 -0.58168843864504172 -0.0013850151912025762 -0.26014536321936504 -0.29294803362988575 -0.17876375833036548 0.38132281260541595 0.89335263454651059 -0.72494443290176169 0.14692006229762536 -0.91055911135518319 0.011197149018188007 0.38918724560998608 -0.94407690269198585 0.45656567375971652 0.48556357331769673 -0.92147773425757773 0.41194429822253936 0.21716479194950516 0.97245047240115345 -0.49268718974128833 0.079440128475445682 0.79527610992028819 -0.22287674449395556 0.23383653691621703 -0.86224636834350232 0.57185388859226682 -0.27322782769582338 0.2978290514885365 -0.92091601729000283 0.4610194514841463 0.70401123209412098 -0.58223229685017353 -0.39808077317588575 -0.74926100013624952 0.66726284687397863 0.58117690201251326 -0.24646787514662827 -0.19590981284264897 0.15154168806317392 -0.78059364731404968 -0.53263679257760765 0.65751975166632637 0.50786144520365994 -0.38635723618548434 -0.19637399362089322 -0.65845059868820777 -0.3851102278671294 -0.3349856180265291 -0.65219217529179885 0.47117236797417572 0.26100028693864663 0.57390614807146789 0.15381515624261383 -0.25895727587227468 -0.27805717260897839 -0.82732763613857674 0.48050167190610515 0.11391840832601936 -0.90675179012875096 -0.23331711978289479 -0.070441361356297777 -0.0072678796600719291 0.65436335153062775 0.060014810393603304 -0.81196557152738025 0.25530907695752331 -0.9557915819235665 0.33369116484379086 -0.37228913312327111 0.040862670116892173 -0.17278230177412496 -0.22299562679395088 -0.34115981311858479 -0.019387928137899534 -0.066337786583760175 -0.21381089773510445 0.88105087605649135 0.64954074286995922 -0.02190940241798869 -0.68843757248437065 -0.0066191884367316533 -0.1615263056989798 -0.90903697259327465 0.26924020672300059 -0.21853665029675451 0.20066674751515795 0.53071214856930082 -0.22264930818694539 -0.56278302392486146 0.61679582480013051 -0.21929322445658939 -0.96483126278206943 0.30298859287295138 0.43003424636482124 -0.95983707861492429 0.20728184086633844 0.98798642624100363 -0.66574142464953401 0.22940821368336647 0.98176996221440138 -0.67501777397538154 0.23639868142276596 0.97593132771497093 -0.68849906887962775 -0.28847958404487228 0.22665162814199125 -0.89741755853315719 0.43502091896258671 -0.066155162787605373 0.13057649279906069 0.52481144811149005 0.65396786002970142 -0.55099713267618045 0.26860821606120122 -0.9046226328095659 0.55858592816904773 0.7369901980725897 0.0068820885387889741 -0.48072248388984506 -0.38638813429176444 0.31804419637153919 -0.27558119710152063 0.22341111964562113 -0.040146758294350257 -0.91028816327434769 -0.036536688093002458 -0.30526974076475383 -0.95646298035817334 -0.036038349938897818 -0.30581435252821815 -0.95684170588498429 -0.042817401378907056 -0.30524058561114914 -0.95578282936219283 -0.039997833097066129 -0.30832196728247713 -0.95792563635805317 -0.049098114664811655 -0.30521143045754445 -0.95510267836621232 -0.043957316255234441 -0.31082958203673611 -0.95900956683112193 -0.055378827950716254 -0.30518227530393977 -0.95442252737023181 -0.047916799413402746 -0.31333719679099514 -0.9600934973041908 -0.061659541236620853 -0.30515312015033508 -0.9537423763742513 -0.05187628257157105 -0.31584481154525412 -0.96117742777725956 -0.067077966920828236 -0.30512796774710838 -0.95315560422624845 0.15431699872930502 0.32140790257134205 -0.96678662367960266 0.47166470638241514 -0.93307779417800396 0.35371100089626745 0.4424871088833931 -0.93155230100876441 0.39336536821279783 -0.16557846171709922 -0.59932621341934844 0.6198771210575631 0.16975120984785255 -0.32735417449103144 0.24762297819768506 0.085174041577902093 -0.60587337698311827 0.56649114677639634 0.51523691649363301 -0.57472831964569948 -0.96666679492214436 0.093753000615960799 -0.93090761388433874 0.070843639974519451 0.3716149856144334 -0.94175171611804687 0.40471676041046151 -0.076445011986387174 0.69599184759868349 -0.10564427857542184 0.26248450161570336 0.45732577108806249 0.23320080988732028 0.55408290931348492 -0.72984261508911197 -0.00873359698572726 0.22810964927211036 0.76519047100014603 -0.11338773517203148 0.43613288356590435 0.21258471778519664 0.21427385656086403 0.6453906787755046 0.16893217885078401 -0.81678314805492069 0.24227644548517835 -0.98670581121165024 0.22715029361813327 0.56722932225055211 0.47492893635245725 -0.058309938614419216 0.61938396066724599 0.2541839298734187 -0.92453381425990011 0.56428160565473395 -0.16387742594759419 -0.41195137747295629 -0.040189496949503863 -0.84830759003496781 -0.15910044899260356 -0.22875683381365677 0.22086264272457326 0.028725047508101856 -0.22696204728330352 0.2657892532608212 0.02016876294354402 -0.27792987934789842 -0.02864878813757429 -0.11738254253696517 -0.10926707665556461 0.52196216395621042 0.070945493409851221 -0.10826704182258848 0.47695214771736638 0.10492278431610359 0.52709530229994528 -0.27436902869429058 -0.9643027044970488 -0.11754374007631566 -0.70800855742428859 0.43403618129406935 0.014829791942437814 -0.091838121990473115 0.19035632131052566 0.49782000302321361 -0.74477404364500166 -0.40471731852120996 0.49220995462086814 0.55209128505802252 -0.84429254492204242 0.49912805160243351 0.54858809929129992 -0.8431561767532233 -0.24926564598073092 0.17280240751061285 -0.029807383561162647 -0.46483098842144521 -0.75422554511114348 0.82873981395477203 -0.20403561023679054 -0.15350459903679992 0.80531611231838163 0.47507666220672712 -0.54829785160772682 0.47007988712124016 -0.23583086328711905 0.60620734696551215 -0.46051953771079701 0.56886856992544022 0.12232766825775444 0.0026135333753580792 0.58934791358950078 -0.38064157689226247 -0.24415882958447407 -0.21902965966935423 0.60075014065283971 -0.22557671984876707 -0.056641302537158475 -0.59089199830137895 0.33606084375612355 0.36077965710386056 -0.53151844456407116 0.57576348455286197 0.034362880958183857 0.80760876752650435 -0.53413809239499865 0.72836651246513961 0.34217551482417502 -0.34356771313060736 0.50691855569296396 -0.14023351101837322 -0.63937250337793328 -0.053186594748282384 -0.77137630242292032 -0.45640795751369428 0.46630312281027603 0.059879769242592452 0.16053461092753282 -0.32882495511578319 -0.59020523523041235 0.68607304197323027 0.12241620935508066 0.044952620761194696 0.24960407108447463 0.30906515436663623 -0.34657433649276775 0.20690930376647509 -0.082201359519327333 -0.29925310568488894 -0.94660031929037747 -0.098553883078770013 -0.29758570413200963 -0.94419240792216841 -0.086294113355516733 -0.30086150890905783 -0.94753579547602773 -0.097511233513201026 -0.30198616031716441 -0.94760648350623156 -0.09398901363620013 -0.30388551253020701 -0.94929461026226847 -0.096989908730416532 -0.30418638840974177 -0.94931352129826307 -0.23363266853423781 0.51413292838966052 -0.14785143742877629 -0.13385344693498893 -0.24936824565132659 0.64622312050680419 -0.097916813126115818 -0.40931764908209872 -0.83770864756065144 -0.097401859228156265 -0.41207711894010984 -0.83871088581377784 -0.097267689095439772 -0.40468044228170957 -0.83090894283514272 -0.095717804750196131 -0.41298576660501246 -0.8339254330197593 -0.096618565064763726 -0.40004323548132037 -0.82410923810963399 0.50179804259802696 -0.30315431115197866 0.0060435896294824456 0.73987433049581386 0.063807243011700654 -0.5307077166242693 0.42529012209553735 -0.71546731001313502 -0.50589136272901525 0.44852986477280288 -0.52698119460882387 0.48865993902494331 0.45886644675493915 -0.53549136086869642 0.49555463605806804 0.45006404757443103 -0.52870705739244717 0.49286928343575426 0.45836573527560198 -0.53554188371091482 0.49840666723071758 0.45159823037605917 -0.53043292017607047 0.4970786278465652 0.45786502379626481 -0.53559240655313334 0.50125869840336712 0.45313241317768727 -0.53215878295969377 0.50128797225737609 0.45736431231692765 -0.53564292939535174 0.50411072957601666 0.45466659597931541 -0.53388464574331707 0.50549731666818709 0.45686360083759042 -0.53569345223757026 0.5069627607486662 0.45620077878094351 -0.53561050852694037 0.50970666107899798 0.45636288935825325 -0.53574397507978866 0.50981479192131585 0.4534467701421947 -0.53251241551589268 0.50215047490708942 0.45716553722812064 -0.53566298622021635 0.50524294398095526 -0.35933591350320099 0.1461133215515461 -0.77234845882598679 -0.24969361161500847 -0.24563229506693046 -0.80716117482640481 -0.17942933383133108 -0.010083723091625654 0.78778782405685344 0.59654726800382307 -0.8191173077324897 0.4273447655737469 0.52609394813243271 -0.34717816542424051 -0.74281840258501075 0.32319923967501774 0.31214502280733974 0.26208867738066433 0.54933702397800277 -0.54753661801509412 0.12855872162763329 0.63268208746402976 -0.61086384295125473 0.19225259067426209 0.24810293383055815 -0.85369757954035563 -0.43170404336335866 -0.24641842560281238 -0.4992847243527469 -0.2039430088891645 -0.15331758401041023 0.47809268349992157 0.044268922750365751 -0.12910124898530934 -0.0016516298972152265 0.64407290252296445 -0.47307413129841974 0.0074636854024031562 -0.3535204268419071 -0.28416467822484121 0.5361171915273607 -0.34446153692986431 -0.67041834216243257 -0.6682493240610401 0.76199310595628911 -0.28498590094556958 0.1009897778439621 0.8258947815782075 -0.14013305201494647 -0.63404650327859857 -0.49486340566430798 0.017475440962209036 -0.17985761793538393 0.64947414188394348 -0.07568214381977359 -0.58278435626982039 0.23123073461123592 0.39346769974900936 -0.93481096941146313 0.3768766553532773 0.76149662679800412 0.010619977425274285 -0.35761448997318018 0.52332272677737202 -0.74155225117211043 -0.15594339449905856 0.30699504310832582 -0.93123740496099427 0.5333966531962373 0.34010573369232666 0.90560799827094129 -0.75802872433110435 -0.39549376083268745 0.29739540800306463 -0.51681399427300723 0.57197910541538832 -0.90668542677511732 0.038522242519401402 -0.3538707024194423 0.4081927727074674 -0.33872750027869741 0.22177791770829228 -0.92212517504846936 -0.30431201284964271 0.48647385180176272 -0.62821633733195659 -0.51131449481235236 0.050283464463376164 -0.44354825790369246 0.70370748784307191 0.57292100236698662 -0.3514754257681329 -0.42637358418576915 -0.36482578464480797 0.2182902544390723 -0.73461776332684048 0.11137002018543084 -0.40369745540311963 0.68105910034961914 0.53148920079818296 -0.53588698997217687 -0.49605572967941697 -0.20030841545395442 0.30613145439382633 0.074037297104689273 0.58294398883521026 -0.34637271278774046 -0.89138472529109503 0.70704984651771141 -0.034808794525435838 -0.51293186616711706 -0.24661875551293824 -0.38792723579913813 -0.11598351918603014 -0.25088508828328915 0.39661422658184353 -0.12001340480074153 0.76255200548391988 0.19753804003967768 -0.48231843751755826 0.71243411017664593 0.04970982485037035 -0.62356160898586599 -0.26449990010735702 -0.12714057601738712 -0.099040058058729438 0.30257315378134242 -0.90930604254437863 -0.30052624808330403 0.28979225122779512 0.36437550615893172 -0.96200330180749039 0.2796629072953225 0.30037477446104205 -0.96284484161966821 0.40760450454485975 -0.49895445921606224 0.51293589873048251 0.56265505484839851 0.48024602367122132 -0.87190240081836867 0.0093720091819258031 0.78760808941293181 -0.28905397836391261 0.44048939672998599 0.6653392723729209 -0.749865636271834 0.42058902363819162 -0.39014079711820077 0.10699443677072458 -0.21629775787228669 0.63191943400462713 -0.4035691237751442 -0.22555732433874004 0.16864507557449743 0.032564845039915004 0.57819479076695501 -0.26735715593034931 -0.30926258948246638 -0.24104697308957873 -0.73884683614290203 0.72676324268133297 -0.5986632472465705 -0.61469655747090413 0.82349130145408289 0.17745819957785147 -0.020047539407712488 0.23548059742548641 0.15997884678710206 -0.9477697779647738 0.30527323593295957 0.14855349032860424 -0.94610970418133977 0.30035195284788413 -0.24287260152902021 0.36797515421606086 -0.94054795164842231 0.048029069351645602 -0.78407536423708846 -0.50287556461759042 0.083596357499026927 -0.61380413093855424 0.5662149995082737 0.094791754878286102 -0.63220960448869956 0.57007515141483589 0.21951709712538331 -0.32871744474836484 0.2436274214495899 -0.1779622537964215 -0.35866502808947848 0.075981751945640663 0.37998753548970976 -0.53639711394231182 -0.60993291495279944 -0.44805319106039415 0.063452480410636433 -0.54209886363314164 0.093440105250603339 -0.95788563561310702 0.18294963543013015 -0.18693230682110776 0.63045092880149911 -0.62170103125851217 0.6741743924311896 -0.011880677522699456 -0.6261755558112001 -0.16146565349553946 -0.1412772656870874 0.077942797451206372 -0.14120677948488417 0.063350207970895425 0.12683203001096527 -0.63143716011682771 -0.6785678973003757 0.7192065518079005 0.1146390162259687 -0.32882091694395654 0.56227358662062632 0.19737687875242987 0.96900480772174502 -0.72165154532916687 -0.443798746948735 -0.59870163650486019 0.56421303715690552 0.1830663077842713 -0.40365627711300867 0.33835232542881288 0.6055774026391163 -0.77227280807031917 0.43967656806758337 0.5662520784557824 -0.21283538225942053 -0.3645157311835503 0.53974246928460057 -0.40389219364603646 -0.80318576717616108 -0.26066850655197349 -0.28155693837745505 -0.28401258685586667 0.25525272608255728 -0.80978884725179212 -0.48624152624121858 0.30088859098335607 -0.80128946146821023 -0.48434857323707986 0.58898557441054433 -0.56817007936707231 -0.37879317531502887 -0.059813095384154004 0.75550569710724336 -0.73182347211763243 0.25673288638582747 0.9359404230449142 -0.47636301024874927 0.25465615232006578 0.93709416399325651 -0.47649708932615964 0.25076631335724026 0.92719924892457273 -0.47110248464691479 0.2340449910745159 0.93648887081023824 -0.47218205448771033 0.25495424630588076 0.93333467221244459 -0.47479484345816797 0.24780325990504382 0.93689291336922065 -0.47506240696340102 0.25166775703263139 0.92851988576057909 -0.47189725704143443 0.23556292473297386 0.93653344835173591 -0.47249984039703724 0.21523369960515337 0.95044748073935559 -0.47503967702169003 0.22474129868461656 0.9440785032141632 -0.47391668551706245 -0.048286528822548164 0.76470257787882201 -0.29012869313851725 -0.25737656734348069 0.42740705151190977 -0.14252976299317746 0.3068685673284553 -0.73076655246493571 0.59223125222051476 -0.25561419686229708 0.55928100577520168 -0.26291965493787722 -0.40382809421169391 -0.11362725161803056 -0.23885846657639973 0.10173617043845089 -0.66268200966473811 -0.85538398867872023 0.52691765720400807 0.45932442906587528 -0.94624235417826996 -0.14762381991253104 -0.41909769370362576 -0.54119301013837839 0.52870878268610233 -0.85754704030309747 0.46652405833937 0.19205216788510271 0.88864153856422468 -0.46227403573382675 -0.15465326641777127 0.22935364986405771 0.13420464419327832 0.57013557839221829 -0.81514101435301822 0.0038059831770241204 -0.095868678046384548 -0.37866274599406097 -0.98021762293859926 -0.30772914468057155 -0.3267776939210395 -0.97025633684024026 -0.035810960965637025 -0.74276151266410018 0.62111825873757565 0.1527059774521955 0.78801142806540159 -0.16425164861434127 0.41876687368310539 -0.12783925237626084 0.11701629183002646 0.021704286700998426 -0.90402105845822434 0.23198384730967525 0.28365051194339619 0.77695770020170352 -0.18547553601090164 -0.21185996268410667 -0.63459179046894876 -0.33745137353637705 0.39609022542840078 -0.42395174379462941 0.27059951209978378 0.079831662281587973 -0.68020746268437926 -0.60269475597686706 -0.013607010403910394 -0.20844507598779255 -0.91396209043637422 -0.36925034191372003 -0.075798058544181562 -0.19649411652973425 -0.44607134302444379 -0.073497537291172088 -0.53615217212463517 0.16879317783149481 0.45239658099632962 -0.95806017836605561 0.17254689677019186 -0.36122332873529545 -0.96700078828532898 0.48772296414841237 -0.55912043872857475 -0.53491435331342241 -0.74692597255348214 -0.57460701542911274 0.81014952222684022 0.47270474929761602 -0.079636053730719664 0.088958374727326303 -0.059819515392035241 0.74758259709648356 -0.44974180177896611 0.065417167113815067 -0.36901057546383659 -0.9747358767517762 0.40755824260833112 0.88426009311457909 -0.67926667966312937 0.73767286364024276 -0.058909597913618314 -0.28361468256006578 0.05874057708729917 -0.31038944238983829 0.75037217510505239 -0.10376875612762669 0.19844884305119534 0.17826753555118716 -0.078463957941836832 -0.11167941474760125 0.14244375007532531 -0.26744297659452632 -0.24711001646117259 -0.33745997119365573 -0.13589002550565535 0.31937935824106767 -0.94805272795189843 0.46351424064100305 -0.9667268588364506 0.082369134328531129 -0.18833122525649834 -0.2243410274638831 0.045589123817419294 0.105749353783633 -0.70041295769865786 0.5869196975538582 0.46607258089577019 -0.16655357448934052 -0.93106924151733128 -0.30960001445194263 0.35172867264928792 -0.80792312852252857 0.66962416154876847 0.48130757684046099 -0.33179435257839474 0.20650965375071798 -0.44262616011769723 -0.7611836630782387 -0.043493957184331335 0.33093510531771508 -0.95034764385173853 0.21663195183502354 -0.21346950149296273 0.21040556747033715 0.0061449001301622846 -0.68450365997154794 0.61323904316019762 0.48330728692257924 0.59497588534732782 -0.030034209771322037 -0.47311028929597931 -0.67154431692796535 0.81160449667850032 0.68737900123885232 0.36719601976174671 -0.20213034019127729 0.56972036948202975 0.23786321729021764 -0.015907181993895424 0.51730167629267487 -0.58473085111216727 -0.83116685492263631 -0.37173314413372888 0.36082122643996239 -0.30753088082726315 0.034771879670966621 0.94276825619035198 -0.59518866272006987 -0.64094617736416226 -0.66900810435099578 0.89621857407958994 -0.22926586668107521 -0.42950519155138767 -0.053546409769191658 0.52097111096438609 0.24297584320170371 0.11240163238020269 -0.41703719213654611 -0.66300493593061716 0.78645333706896481 -0.014369791361985181 -0.82287143406338847 -0.03446893685812575 0.20953360163188153 -0.81828360334616812 -0.48557826161911466 -0.18085601858248379 -0.1518619580444184 0.70260866812027645 -0.083979784823411216 -0.83216615131119875 -0.2582187710839956 0.66543402061124768 -0.0105922475158363 -0.6533694092249529 0.62992960217132032 -0.080467011581061454 -0.54383050738572802 -0.18501413588256488 -0.61034219096508047 -0.45713627921182942 0.41960239176595049 0.1849815877244988 -0.89429494840599211 0.45774790110988517 -0.60341809526419621 -0.96869674622604174 -0.23777131147837374 0.54086712300873629 -0.74793501983405752 0.43001882879269221 0.14293373934792339 0.21197199302283898 0.5772677605795733 -0.52175735340767859 -0.82232378890553393 -0.1477005022910359 -0.36272267960359816 -0.86217861166731924 -0.12113419701948232 0.24175967726118244 -0.91008711421145727 -0.3995807973259346 0.30049982795239899 -0.34436883399703999 -0.40481684383945954 0.28715179676322378 -0.42276756784034464 0.47995315213014084 -0.81472461467473289 -0.22122545820957848 -0.22211836493775738 0.45927151517627818 -0.088795138796373851 -0.21732685269990487 -0.51548205746918319 -0.42811913704293358 0.76877366508638578 0.18342494906259088 -0.3696944760799098 0.061619372931676922 0.17189706122788548 0.26794413591724131 0.52405611094666305 -0.60193839239185654 0.38919176660526877 0.31517708477567252 -0.52850893947233313 0.58215913207226822 -0.17448911148436055 -0.12866094837447106 -0.92247461037062295 0.35244336723025449 -0.94916716514600441 0.42645704383444422 -0.038913613456982285 0.72439001381763091 -0.6469257682165146 0.55657270582993001 -0.96746517182451652 0.18551048335585424 -0.22331161179669815 -0.58295755190328247 -0.23514937889758092 -0.33552339086714228 -0.10703848875040207 -0.20108593436695402 0.5547427491753828 -0.11373522493972033 -0.94042509093364557 0.67573624090798801 0.43129853535674051 -0.56402883622727895 0.26466200303815346 -0.4578845784697354 0.49151225482156696 0.24095347305287471 -0.45736133174188742 0.49896436587520221 0.23960052059242998 -0.45599611251246802 0.49332814631865096 -0.051870448873904705 -0.32672505634525556 -0.96724519791526231 -0.038530269587578603 -0.3073925318581564 -0.9575238827085103 -0.03423156770846305 -0.30604731316593325 -0.95711498984441634 -0.042785859389321536 -0.31008767648906865 -0.95868887401740732 -0.033013286070594311 -0.30702948620996562 -0.95775930606730686 -0.047041449191064469 -0.31278282111998085 -0.95985386532630435 -0.031795004432725579 -0.30801165925399798 -0.95840362229019738 -0.051297038992807395 -0.3154779657508931 -0.96101885663520126 -0.030576722794856844 -0.30899383229803035 -0.95904793851308789 -0.055552628794550328 -0.31817311038180529 -0.96218384794409828 -0.029358441156988109 -0.30997600534206277 -0.95969225473597841 0.53462031070475013 0.6627173669761226 -0.37283631188176936 0.083828061628586761 -0.27729235403336971 0.59593963931147298 0.29170416764315754 -0.97571046736982414 0.2569975285786722 -0.0027330704695634456 -0.53952229245155459 0.41213509021611405 -0.084136366702578236 0.71587969944568919 -0.16504129084123634 -0.21032699372342312 0.58684747414315819 -0.1800808788401648 0.17871316887478447 -0.92097081209893172 0.53338775427095586 -0.32584393569789188 0.04655190479740022 0.8506356734956978 0.47748494636355443 0.71021529141047246 -0.40393509875733036 0.38980802622154409 -0.75563078482841339 0.57987811088209207 0.54726245642756499 0.27333746783902468 0.043449809045682006 -0.45259313739770818 -0.018496955273212403 -0.26640881540998923 0.29776661801036669 -0.45752437702299709 -0.81503367941448179 -0.63407910851053628 -0.66740054377182967 0.62451795000702248 0.57599307523272802 -0.66544506511009127 -0.21093705642237578 -0.34595586318823868 0.37580066967724279 -0.24415420680168445 -0.26026877624227251 -0.22025629697807644 -0.44826568976778919 0.22756054486096461 -0.92824310965670043 -0.10927686097568577 0.22606378238106895 -0.91812163744131536 -0.085347404664615156 0.7432632760729686 0.16508498360723911 -0.21849212223009062 -0.27631197339008634 -0.18238970207673899 -0.5570474735405827 0.37245890754063793 0.69012089141437116 -0.028287926914827434 0.21704828570126714 0.31097476491462889 -0.96539244404367131 -0.29555880218134811 -0.74626850229697095 0.75043609838539083 -0.043088673546021319 0.073999969777480495 -0.89954718460261152 0.38574757327978226 -0.60476836190751382 0.58818506227662204 0.41076756964303779 -0.14444316039984634 -0.92578777201129525 0.60384485328451265 -0.54845244607142318 -0.32529055655141198 -0.3190722364551804 0.021037021510511622 0.88903586315920691 0.22819971295120323 -0.087299836712769502 0.21443039262329142 0.28602122559516158 -0.92111678294181287 0.032080310200902899 0.76425219935104283 0.056745585931304535 -0.37418178617371911 0.070303852254771287 0.27390122201632205 -0.96228317636824023 0.73967069409654695 0.29773282518631494 -0.5367602838322254 -0.089217348536264202 -0.34127785059111426 -0.971345107350846 -0.085797306368525311 -0.3415088174870296 -0.97135444230233847 -0.085715172595243222 -0.34510976379621805 -0.97252251937244294 0.42971982323402874 -0.84833974169317905 -0.30797622625215487 -0.24074092335879804 -0.017103791419200032 -0.0092183705115056452 -0.21846694576467457 -0.59511227594687932 0.64134340481833829 0.55120557728703723 0.21574617092038387 0.056837317696810725 -0.24530347984513215 -0.47720641574650674 -0.15259852072975238 -0.17947748344799574 -0.052263933424475384 0.67633639247445687 0.31589968995296441 -0.74712936712766753 -0.53426564998706194 0.48106377458029492 -0.25299030884365065 -0.9586483594018701 0.59905602284949744 -0.58469866657061764 -0.88502929799708041 0.38853533917320232 0.44017308510540754 0.20392658589075807 0.72576973707449954 -0.026739236766960075 -0.23031912763409915 -0.1676238270066471 -0.070537076976426402 -0.91406369981246482 0.38177696207518536 0.76665677843550417 -0.34569344629537646 0.64462715735414511 -0.057007804755998058 -0.58179316108668588 0.67849180458942782 -0.02114728214341547 -0.599463648386933 -0.10622857233087862 -0.38063423468115803 0.17119267079793427 0.38653450090492292 -0.88594875798928885 -0.25619037757110658 0.29455437465830758 -0.95186930830413286 0.355653171016447 0.29057690531135422 -0.95134271352609523 0.35984939336618099 0.40042827140629478 -0.9182186994113738 0.50202575798967886 0.26405772709138414 -0.57927697587769034 -0.64167448107572267 -0.17464693777370333 -0.016519768558882642 0.079013935261010651 -0.45381595772343902 -0.097324959954465037 -0.30735732311386371 -0.03859622529246453 -0.4811628600150103 0.25654686837941743 -0.05077176570244292 0.40503764947338261 -0.96924270272207902 0.2463329469352063 0.70539299026843405 0.0011588531986707563 0.35241363825207217 -0.12453107215513841 -0.92339318934119297 0.06225161712239357 0.59985857829403533 0.11589156389467858 -0.29489056893315996 -0.18930335635721865 -0.80753023587400963 0.67827708454346658 0.067469540885273641 -0.92719878021406255 -0.1449867064135241 -0.60089828897752562 0.45459176484112634 0.11853430694584374 -0.025698823952078856 -0.9081615691956727 0.53677341940843182 0.10417900654327099 -0.92879677029961616 0.75840896546929693 0.1295562396684509 -0.27022254347231617 -0.16918292435063867 0.67587621436213474 -0.42233938638376778 -0.27597886141279182 0.24086793014071645 -0.12657497957659566 0.26083676955973523 0.38867126182643214 0.25795383912946962 -0.19132561340384033 -0.21203980396319089 -0.55012025755246818 -0.34001936976894281 0.051217153591876327 0.89910813455177041 -0.28345783169927458 0.16172013395860735 -0.94743130961129773 0.39239333987971542 -0.051238817490529463 0.16539553292388726 -0.19783691550779212 0.069872730529540419 -0.93466564075628522 -0.36127294509973523 -0.18396766889980853 -0.46191722302246374 0.47958635429297847 -0.48295375128191431 0.05625688792668454 0.64880873357327273 -0.011604772720624436 -0.77886866219884243 0.34941024451636621 0.77650936511102719 -0.46797389886002499 -0.40074922840982291 -0.65044519126709088 0.48658283214373099 -0.39027315628398684 0.081299579784003095 -0.17625188765250491 -0.25852041016367572 -0.79033237428380165 0.67359508783771715 0.14410130425946713 0.79689596596446477 -0.22621533993656812 0.56522499425788042 -0.51258051717822251 -0.4497488426445837 0.080111474156565873 0.89740666450746009 -0.49897163753297041 0.40076352130221388 -0.55878840502070626 -0.97119220470233725 0.40789491595850363 -0.55691639847579111 -0.97127282396289527 0.23984048135214167 0.83098308608851212 -0.46960264092508897 -0.083097900317132919 -0.60491120899407225 0.42007062446806381 0.1680881671710123 0.94099374802377189 -0.47392546091411225 0.18808387316640318 -0.94290491706834301 0.47155766665490734 0.33802672818591667 0.062760544645652019 -0.9032538061579799 0.1819169618226805 0.044895040691442074 0.25307217019475353 -0.05445147625858484 -0.8461198333676182 -0.29779439661548196 0.41677784936731666 -0.93658349460256995 0.42552239607457643 0.59973269679682872 -0.57114078179474237 -0.93838936176474563 0.43642287633228966 0.47828442837790341 -0.95654060207189973 -0.30106313397918749 -0.5747280834644537 0.59177984371872416 0.40016699716186943 0.53292767429797216 -0.93212160143136524 -0.11260091728692324 -0.78987647852035736 -0.16897877039561177 0.57949716298839771 -0.33876202167490399 -0.36645170680741818 0.40550383079193153 -0.77895716967020101 -0.46275784295612638 -0.13610009927725081 0.00290291860165897 0.12045084388553458 -0.064978151308555152 0.020425351854013903 -0.90123548854481061 -0.46176455611360467 0.0066681409424462169 -0.5043863801444699 -0.45565399927218619 0.11322307474889716 -0.40169645899175604 0.72200544047261495 0.059682920416409706 -0.18546335278925499 -0.2744784132219758 0.025454873874708229 0.96929077029817934 0.56877722227589311 -0.281625526290257 -0.43277827560224275 0.23796909924552931 0.73883472455158827 -0.05526709878732497 0.70500113607475912 -0.78478722006848867 0.15594900526497241 -0.24430692102183635 -0.52081276760769035 -0.25707231105885542 0.55467559775693698 -0.92943276036705724 0.31461867474692312 0.4346422119638943 -0.51873738176162976 0.51200399709954114 0.43470799654913889 -0.51772287249520743 0.50482000335668775 0.7672660878191967 0.13822591622531624 -0.34147638882767634 -0.30515662745596128 -0.65388355930340092 0.74099052466436865 -0.24998419453677947 -0.65377732621254436 0.71873000217678162 -0.40758811369430836 -0.1024492636763637 -0.58539562197278938 -0.19449201457916482 0.47851842563044611 -0.87696686640892119 0.52684008119343928 -0.11593639480648089 -0.0025480212450820681 0.2546953301004084 0.24366261568652695 0.27739606952953216 0.45576723553927673 -0.5517978649740839 0.52773234370910527 -0.18845678104987182 0.14952070326521236 0.085613353939382603 0.48059458867204807 0.18108129178500687 -0.91236166160786092 -0.43230888800760675 -0.72179089104962157 0.59028222285804977 0.25373403330357142 0.79683782528706115 -0.36599947035790104 -0.16479956072972357 -0.40659911295913598 -0.93612544050760671 0.65459162535915882 0.22089950585651136 -0.13585929603786753 -0.00050887391149051671 -0.21990638183629793 0.81431596735770106 0.41852415762844175 0.72632851033307688 -0.16463210560633931 -0.1969344682509041 -0.67262728467272104 -0.25667353388186576 -0.35274308649002001 -0.27269522237398747 -0.90621453173664512 -0.33006923801364829 -0.043393434740977101 -0.92706955544605585 0.73530651205583486 -0.064218215967559431 -0.39801721264413786 0.31250737432808323 -0.50596643834061572 -0.8461126004303251 0.021247136634983267 -0.67744235745574344 -0.58124120034133042 0.66867014697028404 -0.65701194118330697 0.071680192649050622 -0.082113249216503939 -0.69190012904624343 0.20897481654809952 0.37440812572951521 -0.20757812922552019 -0.95027036429798206 0.19502131148638002 0.67613565552751953 -0.93420631291612899 -0.17987361665093329 0.040624677540142679 0.082306174410562274 -0.098005389319165345 -0.75903133857883454 -0.42592089394019156 0.2820792257138236 -0.10519748609303765 -0.92004427883675111 0.26703622812868538 0.91655571978785733 -0.78628543556815145 0.55661619541087271 -0.21881681696826027 -0.42610296692363858 0.33894545618114358 0.29910478244218258 -0.94342223377989598 -0.23755969155551418 -0.3638195916204866 -0.067123034109508387 0.37324894163720868 -0.91513600474940482 0.52579292879176209 0.30297218693292804 -0.43273832135168727 0.3708086598520236 0.38445793435512243 0.30174751905233044 0.24133185673448901 0.62911666677111744 -0.057496716529472441 -0.60894446517013767 0.56781873183271825 -0.35315065753647895 -0.13459248216466174 -0.26890045097416532 0.51289116484982566 -0.22533032903036346 0.4098221487042194 0.24686861586569034 -0.89992579516245608 0.54211906586766601 -0.61800155534599888 0.034943696583221127 -0.31390633385747868 0.025415835586425177 -0.92293413349702091 0.072565518972030688 -0.83512720566919574 0.53765880072077432 0.20643244541038147 -0.46171634145507606 0.5540744497837683 0.43719553594193739 0.58523725750447997 0.051752001192548386 0.50368650873329235 -0.39417098329598849 -0.70910455489076452 -0.24339471346020464 -0.30048578162924183 -0.079785425230335175 -0.45464791735587812 0.088301410340141939 -0.46945930670325564 -0.0436540330292184 -0.66837989518766305 0.6289906904413689 -0.18982690423289111 -0.12912136955862658 0.90388770421625553 0.76506389160653798 0.16965259716671718 -0.44584424316132271 0.51981262616724411 -0.032526631964951369 0.051816467718933307 -0.10174774633350543 0.13781612204840718 0.17684378961667799 -0.097968038778093569 -0.16676636241228579 0.9116435272671829 -0.25504237169072175 -0.1835532298854376 -0.089878653350342855 0.32506662051773771 0.38351815231061531 0.24651508463724034 0.58512694184850333 0.60663736402158708 -0.34918981605453348 -0.65158823054467385 -0.69382851946148316 0.79751620249848232 -0.13070629969799424 -0.47312905347721174 -0.96171488770025193 0.70979870816041679 0.13186256259882717 -0.7068114389962924 -0.36866404537697101 0.32214869233239085 -0.63803197899545616 0.27988503176954488 -0.96097191379852553 0.442781176246893 0.31626526948190203 0.16582651134749779 0.26706388983088336 -0.1514693516911699 -0.3745932762062481 -0.88168896172094269 -0.25392404857154377 -0.3943237047722733 -0.27719380140306676 -0.2442602687559548 -0.30998284571691714 -0.83852707285226868 -0.22538472309608312 -0.29200005627759834 -0.82201955324672649 -0.24849290848029956 -0.28916982291818222 -0.82800819390394842 -0.23373726469697917 -0.28671754948848399 -0.82174629707053892 -0.24895783685553607 -0.28485337147725981 -0.82569081005324907 -0.24208980629787524 -0.28143504269936964 -0.82147304089435136 -0.24942276523077259 -0.28053692003633746 -0.82337342620254972 -0.21993289237841021 -0.2977755562559547 -0.82353006240194537 0.34358336765923941 -0.89650848200910105 -0.10777860028641438 0.17446159028479943 -0.91629259855926048 -0.08326264088193347 -0.30579179020752029 -0.17720468593194055 -0.98408274756754754 0.41141560539804822 -0.45922062196899432 0.31702846976777266 0.54632663619176569 -0.46174955989297989 -0.056064113320796312 0.50267478422704759 -0.50240437432102869 0.010442042379710411 0.65192451077910363 -0.90365206580680379 0.18595655209631651 0.59994895130024239 -0.45184545808496196 -0.85353686106030235 -0.10350340788983092 -0.28698800556929038 -0.93627290761633253 0.22517103100231464 -0.90454358305222482 -0.052242069082117773 0.58253489500579447 -0.36772967169156834 -0.18804296212333901 -0.031258597075344161 -0.22628518759087629 0.18595974800770554 0.13524114368328391 -0.89945182173603944 -0.051915220226623357 -0.20273871998209533 -0.78186853354942154 0.64840832791777947 0.34787206481944333 0.18327155093455075 -0.90504566063039604 -0.034599932370628264 -0.86192564595163834 -0.20818259689260968 0.053420843329352569 -0.85208294444637789 0.44736005696828757 0.041734919139658655 -0.85219208537261704 0.41596114693890274 -0.32427658786286856 -0.59705541931448358 0.52064548947783351 0.58962220609910643 0.57928138505726978 -0.45631225948746751 0.11302971778726738 -0.13159077954738377 -0.91640380384671394 -0.22409398138927974 -0.27333790441325562 -0.81077885246820303 -0.20691904045129011 -0.29818271493346643 -0.81944024270717919 0.26864998962455616 -0.4469756624015605 -0.69859860280529129 0.65960517511746375 -0.80463308963420699 0.063011521092331615 -0.60398305665875784 -0.7162736312837602 0.77911280466800714 -0.021457580225616481 0.25695619666826297 -0.91823323287174508 0.73518271997950702 0.11460111772049625 -0.19951840908934995 0.07249096552378434 -0.91242036463513387 -0.23939613605772253 -0.053181423165225158 -0.42163861380444101 0.61337916876430909 -0.079990017934534696 -0.38098449222004771 0.64478283392980962 0.39462165034151026 0.75548865521646613 -0.28494332587551713 0.15130660839202739 0.88849868690348022 -0.82205441133301693 -0.35675983490919705 -0.11414206604651354 -0.64519242300800961 -0.035957724336451002 -0.58362853037145335 0.46680933026498062 0.59896429486415714 0.25352017399314397 -0.091368046639244999 0.51878351177741078 0.30468148810463436 0.098900413452481212 -0.30850230439799825 0.14967507531892599 -0.8592618203157123 0.52046093007721417 -0.85865586270083671 0.005779717428299417 -0.18596669642958846 -0.35613228726967566 -0.98269271088116461 0.61161762115856044 -0.058937213051768085 -0.14954628721337571 0.067517421873261207 -0.51032560698917151 -0.68402201552926445 -0.021036076084732819 0.88816309844536878 -0.66622186130478944 0.11515852560169704 0.39903300012569076 -0.96272090794608611 0.32298022840651253 0.78368049488790259 -0.32276269014599862 -0.45437066122702013 -0.12308754609822085 -0.36634171789696807 0.46099192399313643 0.71476862176999822 -0.2495426187114454 0.49100654278711026 -0.017758892139152018 0.10224449146345232 -0.05755341505322923 0.45746668456002337 0.16542228010526572 0.48615155054046144 -0.48357780146445634 -0.54965066401170537 0.13847363607720789 -0.61447032000647994 -0.64286865412715621 0.57701882968743079 -0.096056205272690959 -0.095960552229923612 0.044151559705646139 0.91693523902779162 -0.54137688437167375 -0.14076829892039133 0.69097162828431047 -0.2289095205748112 0.42926589817612387 -0.92003390868026402 0.47764783705182129 -0.28972960162923966 0.072735949433946678 0.89670362003954662 0.31965670126416601 0.23717671986955541 0.26661197591355718 -0.15770770687341959 -0.39037189143383944 -0.90336818829047261 0.45129608790961323 -0.0054182295689889706 0.1460514837959547 0.58233742085870899 -0.41039445047708156 -0.84697759884406265 0.57041772639328603 -0.30186530160597819 -0.96645116287771504 0.43736616230685388 -0.51535339211858333 0.46226434132327493 -0.27473675094229194 -0.13874430579937 -0.72823891036648292 0.13671161094151671 -0.44906394534022531 0.63847993042061013 -0.31541783225163394 -0.79431830449528906 0.69945628304587915 -0.19590405745265643 -0.65414387207208224 0.69634993662642941 0.35602801217508545 0.74329020635967313 -0.14439219635735778 0.20111848620739659 -0.46754943026024182 -0.69905068554784511 0.33402996683516051 0.77524627563561777 -0.26243051211204044 0.43370749364113081 0.62808368482317389 0.00061764275962453228 -0.094903828597862921 -0.76703321243145028 0.58939092349530742 -0.34829348860357051 -0.076943960054345686 -0.73938987392036648 0.48572344252638644 0.52204771128033878 -0.90622730794845474 0.46014290765287935 0.52489518722071205 -0.91464704747543168 0.74463131097516044 0.29728128802218884 -0.39433900368284008 0.19310988628504031 0.62122663049795468 0.11324965626211392 0.31263331700757935 0.78676210691993165 -0.38311985106741719 0.63441330274639263 -0.086986774675448159 -0.19290096914656713 0.018781307217868866 -0.886973765433138 -0.28427004770295866 0.41451058259187201 -0.60781377021790473 -0.8608965846482165 0.72820989351979382 0.20168515018576075 -0.68505970550964634 -0.60132509841489334 -0.76346359858101343 0.8362670973852192 -0.06348492191049869 0.60161180881475507 0.053507369916168113 0.35555670854423338 -0.79508184142568938 0.58327899562729624 0.16292134343115172 -0.96859821295136683 0.088285063966276722 -0.21802661273437693 0.3468200571694468 -0.011153541782785808 -0.50557972774878424 -0.73362949614246009 0.71929957109546294 0.019587877664724768 0.71476711473166055 -0.88638483518566646 -0.34937679078675571 -0.11430302839296641 -0.93493821579411918 0.47364612232607173 -0.28604547566993127 0.047598853725728918 -0.30944905522552701 0.46674970655353226 -0.70499717796045913 0.49913734268424959 -0.78635123716472399 -0.31910385357172805 0.54530967204533098 0.091938911990723848 0.064186750531421491 0.031285066964539643 0.42879931919914155 -0.96579650484998458 -0.12744875587158122 -0.14942211501243893 0.62034424343207684 0.2311035746841773 0.92436921048852017 -0.78855525412091132 0.095677242012587677 0.33508989994282035 -0.96810710805458855 0.63696088433084952 0.17188532458789602 -0.12869235328536707 -0.29405433347162729 0.5249037070393292 -0.55586347128940017 -0.21963600520067336 -0.36109240023207151 -0.88581344624147385 -0.093740434160323016 0.7105061680129886 -0.56084747244646649 -0.090535329920208268 0.71720475472596168 -0.53238996599161881 -0.29021833571721706 -0.018318407534801327 0.87750830496076238 0.13051473945133407 0.56418704002607445 0.1597736635022744 -0.071068083817147798 -0.62279388418318515 0.29077192392608298 0.50230263894511296 -0.55498115596228215 0.048702456103604033 -0.18710930806515619 0.65071364318746461 -0.48854196126137528 -0.16162072204620731 -0.42486629372724566 0.092393550384239992 0.33164349125377346 -0.95589936598319714 0.45046548004529108 0.53560751091416103 0.029682127942965736 0.06031823809333299 -0.0080054228605955461 -0.086680561368707901 0.61583968971872227 0.016976883045387796 -0.21792426684072361 0.20211706872480356 -0.20551065452995571 -0.10456895860084779 0.73190197288102399 0.3002122023969177 -0.99016131893938197 0.20961817641777264 -0.28972712377098409 -0.042300661059606344 -0.97976336131266351 -0.23015515049062946 -0.37475166133108101 -0.97025586531059105 0.16523776349179894 -0.59258655060149334 0.58652596550482106 -0.15472987526812382 0.43246782632566838 0.075238876470005558 -0.47081065006008316 -0.57956647985425636 0.66544996724985084 0.41159661710829204 -0.40847960457785215 0.18760537868136198 0.048093659047339268 0.2274377867167546 -0.92521471171025826 -0.0078930957448531125 -0.87805620547099783 -0.24923049304278458 0.088129684281915505 -0.73395042649411313 -0.56337106562108918 0.50393117550344968 -0.52159909505146584 0.095507644758626484 0.22315485511317087 -0.21222286186305531 -0.96310476109014198 0.016754151670817872 -0.27870172847848917 0.21991286014478495 0.68036187622567124 0.04022691534857651 -0.87916120568685452 0.51134169844224608 0.36182252347855381 0.075787054534499257 -0.0016327160537945784 0.44651413246667443 -0.96293429871392544 -0.032051568824938766 0.46307230965364549 -0.95324918370245104 0.68111504487994401 0.41281891292662859 -0.23766274371847182 -0.071945043421880586 0.67210781368479622 -0.048597158990802122 -0.2015189440982568 -0.098370228152075745 0.035483309687350986 0.64440885154694572 0.48384889751580007 -0.22896400809431255 -0.055693549803541666 0.72930807363662176 -0.56783285701743247 -0.13561062401699578 -0.22475494034790944 0.84450464286992666 0.24499128384980168 -0.42790884228720111 0.38581364270044943 -0.73092846411401102 -0.64572691494748102 0.8280879770385855 0.2152108460484187 0.87359446173344413 -0.83308352418679588 -0.14744045988443477 -0.29218206784519141 -0.94597375142127527 0.27192032890331463 -0.1568683755864313 0.19055478210814938 0.13675849765304707 0.8004614304684966 -0.2882024603547047 0.57510945962845739 -0.20688888310247222 -0.30512738148693941 -0.19617576241070697 -0.16600923026177172 -0.7385771007073878 0.3689162316523234 -0.17771128509333081 0.14760314266730704 0.73320374746915695 -0.021853841358938655 -0.46725227053326651 0.30104183764688786 0.03342180770765886 0.23920012552779338 0.62968118495591874 0.54423718439630164 -0.33530658942270086 -0.081436182723197637 -0.44212091480916343 0.1856585504558709 -0.42235814451446335 0.23612993574254379 -0.38701872269602777 0.22298973334223332 -0.93572175193092466 -0.23322117135946574 0.35664536537115443 0.024488856164842299 0.21634282189578458 0.52119312260973283 -0.03198384306056111 -0.91734330055087598 0.32803464705538055 -0.46338475361012782 0.46852282803691953 -0.24549783335323369 0.029615973890579544 0.92951313903497645 0.69987682366204251 0.41319587855377832 -0.33332342671979742 -0.6668903873605867 -0.57959371053423048 0.69468005260479271 0.71037161848096153 0.36654329583097878 -0.55509038466638516 0.19418768648784623 0.38771099189056057 0.26279868986733163 0.520836882161818 0.66104349439838739 -0.21826396967275544 0.41927891737641965 0.63107710322159705 -0.83106916502679895 -0.17886049850666139 -0.20176175028536142 0.77778912933738265 0.6362339152178933 0.4286289883491326 -0.71249094401792801 0.015728456736974747 0.17799736576498684 -0.90605549687205655 -0.45091878317758161 0.13412338516908234 -0.33491838096456505 -0.00029021573280657055 -0.51063115130206904 -0.66696719780593627 -0.43960942660919772 0.10653668237158295 -0.24144288223163754 -0.071981991862450204 -0.13584418156483388 0.87339937767218234 0.45336014704131017 -0.63684440982765045 -0.88729300589717064 0.48387501279097489 -0.64601943923771354 -0.89677237175429703 -0.02535439132191581 -0.82392549201575926 -0.41327296973704503 0.3271152676370942 -0.38237921469725789 0.25153134061346283 -0.42662070749483294 0.065179270006051879 -0.63536490417181724 0.50829488981171511 -0.17969574647198933 -0.73489623740502819 -0.17700256321808039 -0.39488456430190366 -0.49191521967011453 0.4735650825942338 0.048468514013917476 -0.90578095827042071 0.4250905544043776 0.69855154855567114 -0.10731323925786569 0.60775862726046004 -0.94067683388934453 0.10144494348816181 -0.16705548482315274 0.047906236246387242 0.66739245914426182 0.49834543007626303 -0.096534413121193513 -0.92193008607305249 -0.43631104321243402 -0.14375301320528514 -0.42333018790495752 0.44497665462866343 0.36062485713947523 -0.94954486491226497 0.31683785061868902 -0.95199284356707226 0.39785848247119393 0.76177593523769338 0.17747552946198439 -0.29230336117241379 -0.32473299959695989 -0.029016139189639946 -0.16847892072984222 0.12016071676406442 -0.32882628599604546 0.24721558454392725 -0.017508930389049958 0.70322628560590328 -0.039894003453639172 -0.70885567014061024 -0.58107117276446485 0.8394191834190784 0.44824182019887615 0.72892161549774515 -0.31090309279659362 0.18224859946169394 -0.5582157954076209 -0.83158974767927685 0.16160074194864196 -0.93038183819246068 -0.13484993794655023 -0.31869430371664714 0.45593076313694225 -0.29087017685351957 0.1810126019461975 0.70195490962433138 0.0088275047615539604 -0.026651056397798852 -0.83955224746649071 -0.096486852679973548 0.066702811400874668 -0.83064712723426171 -0.45633895591629409 -0.32172346823625664 0.075849265345433112 -0.84433742886737306 -0.25690729789666955 -0.26636268910494976 -0.13159599996012841 0.57755461302665934 -0.30637950464892516 -0.19454555901649384 0.53387868238031821 -0.95466792196024741 0.25051610728689755 -0.41488567136545096 -0.16384171961224256 -0.35621761444635575 0.57088539012633366 0.48559510508616954 -0.76349650012397463 -0.47482327933618684 -0.071442094873253065 -0.38867855176442612 -0.10825756179688074 -0.40647568318851923 -0.85511137821558325 0.11569877855308629 0.46825065128829962 -0.96261729139779773 0.50664590546416255 0.51527508679768574 -0.9016636370714487 0.49856148281933449 0.51897677035448908 -0.90294830036316354 0.52419819283001223 0.50700443430915954 -0.89933302652527647 0.40799193162138797 -0.25341598796123666 0.12297697969146769 -0.053539516889694556 0.76145475442824873 -0.36037953041581661 0.68710693278876511 0.050495480737836017 -0.70582665263030664 0.34547980537852446 0.76147576380245408 -0.20319185919050414 0.61655741617600079 0.40070545523917966 -0.77668462589440113 0.026700214689237355 0.76923248373037423 -0.15847838067729031 -0.22717844373919416 -0.12197999762118704 -0.0081815029266640443 0.50343563381415057 0.36786258700246616 -0.96009074825316265 -0.19479239249329186 -0.30120076686395564 -0.97228593735344793 0.64693198377547989 0.44075314883175909 -0.18642234531187668 0.27548234469709698 -0.56008990939639425 -0.9016745819426234 0.75087130103868194 0.1651557957878981 -0.56813136892671601 0.49815444084815547 -0.98375532874190685 0.13176395121998469 0.54124909225567885 -0.40382096194707262 -0.96876503476513187 0.33668265136435976 -0.94106392257445592 0.50623928503004656 0.29886102112943191 -0.92747020363160315 -0.15726710964129617 0.36713358309748373 -0.9531082181785181 0.0716866591342359 -0.6566876752892733 -0.73216844535269654 0.9109404498091358 -0.22248939689568387 0.30685249298231282 0.0064975793463899522 0.48787233303615779 -0.36522143468582252 -0.96772937329743303 -0.30880479478097639 0.50473436891397971 -0.46931777615480891 -0.091504583863890002 -0.46800749976344391 -0.86578257510078671 -0.21496436646151887 -0.58670702110364847 -0.41136871157776661 -0.50248493914340453 -0.59862642485265405 0.59027776383241126 -0.0401868698823575 -0.7679137057039781 0.54814245478375012 0.59665980356872772 -0.90320521562148948 0.3307789550375857 0.21429872242993098 -0.94715541225062749 0.50777905197463691 -0.14157942010472024 -0.34240697784300278 -0.97551459326420975 0.16600172185870007 0.38583965244247842 -0.96055049619506694 0.064736675874825983 0.49033271197900502 -0.96411402616051278 0.069354218693195607 0.48820572050113481 -0.96401249299472214 0.18150537099523456 -0.89802895963796503 -0.028431066351554027 0.37873515039008859 -0.67254834098072169 -0.56339013270439064 -0.1421272330337757 -0.49208611839389177 -0.52633062444946999 0.76318294307914614 0.21945763033398791 -0.40337254857905758 0.60968414992759545 -0.060714200894049497 -0.63786778113309817 -0.39836033728434789 0.016883814799931385 -0.70497352410983294 -0.40549298306995263 -0.0081511497860631867 -0.68436339586135131 0.28905652423168143 -0.9223859443962058 -0.11830300126449204 0.50555680402822367 -0.23981669110237944 -0.0016019099280361162 -0.1149274978513726 -0.60293727621969961 0.59720792909243448 0.2590946934775647 -0.98441923053732716 0.093819264734089691 0.76066802009720846 0.22565044379946672 -0.3217537861156336 -0.11067126984808635 -0.46313300357383719 0.14970453445144249 0.33508734016200942 -0.60758632647674748 -0.94231781340727183 -0.25459853907388857 -0.43635242252629164 -0.21673715513347724 -0.18205651914056528 0.046184285164251722 0.74822175291680348 0.70216708776942693 -0.10241092498297706 -0.28611104137618287 0.51557202358190979 -0.54909173185267113 0.27502742657163665 -0.20987045727704248 -0.44405684997829387 -0.43489110966966443 -0.42627610288821033 0.20271692263746993 -0.29090326023316015 0.58581626282096522 -0.86517834334822108 0.40641020376053366 0.4832391900898112 -0.57055219359590992 0.51860619594876467 0.18755218823598074 0.80500581645211267 -0.41486583685424255 -0.3622595651173085 -0.18364662908485926 -0.95122261067436742 0.063129760052431011 0.43633675311523279 0.23203688671452491 -0.0015685765233842712 0.58251273035559359 0.11076990661332556 0.3340336696184637 -0.89758227328699913 0.023647286341361477 -0.12182430081595941 -0.1248471008367924 0.11250146652803204 0.64506465040740824 0.39426751815665284 -0.15184075355436558 0.22052924635661705 -0.15113893697985631 0.2057200041645503 0.071758854944813044 -0.3327841426595729 0.24269227299670101 -0.13486409908557112 -0.27453092776891858 -0.60221981814695003 0.24611492598945267 0.88595736402018632 -0.46885052622433893 -0.22217459464338801 0.60880601987199101 -0.55486187563670797 0.13315564319477691 0.89105803506218639 -0.47011357394046505 -0.24332230589561957 0.48800767840090137 -0.82312592216368796 0.67351936053199379 0.45171155512261513 -0.28011146827056072 -0.73636002137642265 -0.60249561047620404 0.8799930618172519 -0.73156701183566142 -0.60522045120050461 0.88279208795226871 -0.73487407046695807 -0.60027185760755619 0.87652887943199109 -0.73658145711299472 -0.59403436307414492 0.86809645750235098 -0.73516957632883684 -0.59080921543276255 0.86323483564363246 -0.72767377576627923 -0.59805243740461356 0.87182184185686951 -0.73375769554467896 -0.58758406779138017 0.85837321378491405 0.47480716786171023 -0.46161330926336769 0.19049776963350021 0.63307017456802683 0.49518120256397802 -0.56763164421202494 -0.15249179063553225 -0.33636386141983782 0.11638186993176138 -0.34438066252271265 0.064746088422663661 0.88994914148786441 -0.34353412614133744 0.062837297226043129 0.88924654907949863 -0.34184723879270074 0.053777412767809549 0.90602465958315936 -0.34272635502936744 0.055008773101828751 0.90935117224756523 -0.34343394974386443 0.05660427518717677 0.9099384484539319 -0.34044133011572397 0.052860013247985144 0.89706716912102891 -0.34162172361895488 0.054770701023579192 0.90064373024756628 -0.34173806355178998 0.055783919912345346 0.89814340764768741 -0.34185440348462509 0.056797138801111507 0.89564308504780843 -0.34280211712218578 0.056681388799173241 0.90422029137410354 -0.34291845705502089 0.057694607687939395 0.90171996877422478 -0.34303479698785605 0.058707826576705549 0.89921964617434591 -0.34315113692069116 0.059721045465471703 0.89671932357446693 -0.34326747685352627 0.060734264354237857 0.89421900097458817 -0.34338381678636137 0.061747483243004012 0.89171867837470931 -0.39898296550486834 0.27213403403853537 -0.24852576301033075 0.65047201398323251 -0.073082231739617587 -0.53620287577631176 0.65533248028985469 -0.061585367656263726 -0.55416505125399107 0.48646593864204729 -0.60549129740156382 0.53665048774426427 -0.32065456643340601 -0.18431006694047317 -0.50847087206550934 0.55492702984188069 -0.6690401310016395 0.48784786506525252 0.34480418400386864 0.35920066456174177 -0.95983094945815062 -0.055715762987275159 0.21356266393535325 0.22080502758759357 0.66337751323976324 0.027017265018769398 -0.74569431921594453 -0.23300900074813802 -0.2724408597387285 -0.81322915149931096 0.47676711331851662 -0.55035641971378446 0.37184969815511604 0.75300170657987964 0.26462111053256743 -0.35538333780403897 -0.24672467644385776 0.43336024069819767 -0.88944586232820388 -0.22677430641088428 -0.76501955612364647 0.58512763030649551 0.44000770630464253 0.42148911034272762 0.16988585536272213 0.59506680872808404 -0.57810186113851725 -0.18829372528011126 -0.25274448140857175 -0.45697142030882409 -0.27199898553867558 0.65729153999272427 -0.12485744356082823 -0.80751997721532731 0.17840614254713272 -0.90449203780905252 -0.054549036047217725 -0.24753968586962991 0.55341684937215252 -0.22301928508999652 0.14459583811114851 -0.3851407261843981 0.52262062288835121 0.25240921473267525 -0.4443476207920371 0.43477790359562446 -0.30084291157131621 -0.14237148826717477 -0.19971949410807405 0.17745983743732999 -0.26853762706729423 -0.96599275181343591 -0.74510651039314058 -0.59025579174664056 0.85561895590389025 -0.13216742932218875 -0.2957863268241373 0.71440004240774058 -0.10660263512504856 -0.33865240750720021 0.67897950915299543 0.58628007995073994 -0.68065790082190092 0.011114506732162934 -0.30173080976684641 -0.06486499870025457 -0.16519696178271343 -0.066997734933207639 -0.69926438952560932 0.33188237720372349 -0.28592388799375867 -0.76223926866430802 0.61246866608121631 0.60403886047109856 0.06991699627847256 -0.11438284089241124 0.75625817876399637 0.085792138198053092 -0.46082372961071044 0.25216615809203929 -0.95951586718830528 0.4752209732370149 0.61675017774324625 -0.76568042739478692 0.015598116430795252 -0.14925434359338585 -0.64631120177822166 -0.033118554828038341 0.56818521153956236 -0.60660591786123985 -0.94837003573697554 0.2804958331833004 -0.093765765028705386 0.20036207128303879 -0.15764989604540613 0.55914992099164706 -0.032083772529312091 -0.26427694595607665 -0.5972172445710503 0.50101731392722171 -0.46522997637459407 -0.649545585878328 0.50516934304189987 -0.13841743276292945 -0.40256003069854412 0.13287050683510815 0.034445448239073806 -0.68984650903669809 -0.97112234956388699 0.7553180262496394 0.22120103882083783 -0.5226194258828607 -0.033383946478551189 -0.19964761849046372 0.74149767346822881 -0.22197830045049252 -0.080913595127634463 0.92629726587891703 -0.47606401257586228 -0.017635123462254654 -0.41340863549389079 -0.23867768318555033 -0.54247928130618539 -0.31005638933505958 -0.063566212273951636 -0.48661594428190347 -0.63111999218027148 0.6900941017479415 -0.084608357886692312 -0.9586875256383498 0.074949958802498245 0.89933638906544033 -0.78209319211999118 0.71637540352824081 0.0127315159680327 -0.55884987170219347 0.13025381207368017 -0.43059432326037134 0.39063370699460098 0.33456565743458172 -0.68611597876750918 0.59400673141541249 0.20427087743540448 -0.09041200067220323 -0.91378363110199223 0.25629666006370366 -0.45687537042609533 0.49039707021072382 0.64824171221478666 0.1087022072064967 -0.85338830476813299 0.55096523253744933 -0.1248027734007085 -0.52790779465683213 -0.65536342848611429 -0.62515435469738245 0.5912806293513696 -0.30493185911974341 -0.32933323253433189 -0.91646385730037017 0.70377210654011002 -0.096729724359557734 -0.39633666668119022 0.45336190724721165 -0.40783116087210153 0.068540042108589452 0.13898174283065901 -0.91199207666858029 0.43422734109979744 0.58953053079555096 -0.43038433276007082 -0.17545980637938502 -0.099685086910583878 -0.51837020361334374 -0.56556536935931412 -0.18525295725882648 -0.29174869328308395 0.057794073467059073 0.70748223269663557 -0.69560792462080046 0.12130205604387369 -0.31940016617088118 -0.17650555121136835 -0.24336580512098091 0.27425209679008788 -0.88625418447156556 -0.025679057600329704 -0.35684406225762694 -0.57575315217156753 0.61747671546766658 0.32183864705629522 0.62017283629849507 0.095804985986887858 0.46338578038455819 0.30546541947420802 -0.92907392443128467 0.60309661360422595 0.58566338386689532 -0.29174393328331027 -0.15299577326956199 -0.053567752596249726 0.92184136804234007 -0.24859222129827244 -0.24034018347660477 -0.085004206831872833 0.044079552189917062 0.71834056430470572 -0.03873767568370174 -0.058906232408326084 0.34084579856726022 0.20970894074056534 -0.030597818885988365 -0.16419364025427416 0.16949192923816173 0.5996773305237314 -0.59885444706383073 -0.24359346242018312 -0.01067786871030596 0.66737797555610301 0.013369119976296013 0.049964779584386568 0.95420795457809737 -0.6540018935693287 0.16155603716368055 -0.9005196308591763 -0.35991783585981818 0.33008157600576138 -0.88432434698543771 -0.061805206195346102 0.54158740789349968 -0.62729830988483681 0.47720050360569971 -0.12620645586763973 -0.78413979442895765 -0.30624719627353064 0.26346885409185977 -0.71037592206091738 -0.58453309256749542 0.63008256803912521 -0.062296998148217146 -0.96754437055511189 -0.028221639398866509 -0.45900918869589163 0.5810034379627218 -0.077711745563715864 -0.23784638600560903 0.16372236773361307 0.34537728157678277 -0.41283297632809624 0.29938249613330808 0.34328637343776031 -0.94388407684588582 0.36254884122266112 0.38844568869528401 -0.46029364093739855 -0.6281690346873704 -0.17915105839471546 -0.46570807441809775 -0.48178130217975068 0.53772473883436422 -0.19514134957824827 -0.049118283537316496 0.010657160759732181 -0.62213055340522028 -0.98170966608914401 0.015027322733355343 -0.58824871926906019 -0.98240874030337533 -0.031647775701825143 -0.5493486844698916 -0.98343658770772724 -0.33013086923948021 0.45881553413615545 -0.36828110690918126 0.075005111264827007 -0.62059630330398641 -0.62975284093846207 0.039556230744085964 -0.36249159344519644 0.46175667120774599 -0.013600897668523602 -0.44659646211190385 -0.98262592154688655 0.56487298969708877 0.62129981229497377 -0.41190910805562292 0.2629262185939964 0.79580444045253285 -0.30569772066143003 0.40941481889263431 -0.82720855241596158 0.55932556022929758 -0.26762179268427333 0.48877751361045335 -0.19669486740104772 0.17242712904596039 0.7368656789570901 -0.046591681182953808 0.36913219495577715 -0.48137650374977103 -0.78860983170610077 -0.0098938761991555404 -0.86243111783031412 0.13535384486654478 0.066210236920484764 -0.50836293570472901 -0.74189905841844439 -0.081357431811307515 -0.24918443577486057 0.56474915818335225 0.57346494177234786 -0.27442182759994044 -0.37034185462089586 0.74909414321565548 -0.021850606665024617 -0.40899250800999293 -0.46137050863911216 -0.098008784106220492 -0.44673478063847205 -0.43546429886671018 0.057161610416006682 -0.22147443378167705 -0.089131210396910548 -0.3192915491048981 0.77774441888152357 0.52242843699341646 -0.89741536775416664 0.42714313756859351 -0.014008791629543313 -0.80560999820399815 0.016239334611901322 0.64546917805162007 -0.091976244407146746 -0.49634592229211766 -0.075567741848762804 -0.17560400326603237 0.14491826569920213 -0.20593778833988821 0.64837685373962006 -0.34430372424279038 0.11220284670809204 -0.82932964892767658 -0.47031886871061773 -0.2612941400545421 -0.043484514118366201 -0.058882389368741288 0.4594173385284851 -0.016287025385644364 -0.90764131499966116 -0.088157505347203721 0.15593347491067244 -0.89463966238392423 -0.060124241246973485 0.55784097714615177 0.096098916733990042 -0.22571021063252045 -0.21001133979116426 -0.7828004847234814 -0.1849054344264742 -0.53805335708138891 -0.47265994585774052 0.54077942519163091 -0.38286710485043068 -0.53713645850954461 0.0053623875479101562 0.78531125274626556 -0.3569279101825294 0.12650110370942216 0.2457929634710472 0.28069816395382857 -0.26271691240913392 -0.035422104447368721 0.9392212471810385 0.74573988997762608 0.263305681858366 -0.27134464028904293 0.56842486454485897 0.28987222702915738 -0.034251667778186098 0.07921114395878473 -0.30604199280578426 0.5110134179531558 0.077449453973912577 -0.2286865424109111 -0.94287775941538843 0.015723139891443628 -0.54600904225092228 0.47981395585838715 -0.43683943499854461 -0.068796787299646986 -0.24725778263673187 -0.092245909015952768 -0.30501113782918426 -0.95043011746964134 -0.084190715726856907 -0.30003489884086093 -0.94705502422290089 -0.064120282909743601 -0.30514169735515317 -0.95347589773979724 -0.058074286861602098 -0.30516976294825587 -0.95413063073693416 -0.052028290813460588 -0.30519782854135857 -0.95478536373407108 -0.045982294765319079 -0.30522589413446127 -0.95544009673120789 -0.039936298717177569 -0.30525395972756392 -0.95609482972834481 0.57528539984929228 0.33338742995981979 -0.96372944954521222 -0.067617669279383952 -0.6078220407276399 0.57497137229864603 0.60093080836300772 0.52712803341851999 -0.62998939775664275 0.26225505255678344 -0.45321442780587679 0.4686664832443137 0.51564362733783653 0.67464229600946291 -0.44090729911984899 0.69423327839634852 0.14323397093750945 -0.15602608456889155 -0.14679565932005595 -0.56082023031917383 -0.51216268270058574 0.384861358544478 -0.50480589421087851 0.55157423333719402 -0.064176552897017985 -0.50797158647660967 0.21969988163189763 0.21520045644817581 -0.89452037788376748 -0.36948642623583122 -0.083469803674483894 -0.33163213686071424 -0.96815614657722637 0.60069444641183789 0.35805054911403034 -0.91355351736621881 -0.33957600728113313 0.19897527963302777 -0.16312793967455011 -0.58480932891234327 -0.67681507569016841 0.8669512842303847 0.57134545310254192 -0.19901341130253722 -0.96307836663641355 -0.066245635907574388 -0.753451101883445 0.13006256762458512 -0.35110324556893918 -0.7520180308201051 0.77514038612897207 0.27008294953205181 0.18683421268524164 -0.92016491303862802 0.51811269676866545 -0.94360167652529714 0.052525262467012723 0.19269066953894123 0.3143889902742899 0.27723880885819469 0.12753290758703756 0.8046907012482003 -0.41248369877108948 0.20787819253521581 -0.55582136599556231 0.5868810170517097 0.51861101075292471 -0.164915229066327 -0.54205093303188212 -0.10275504543309076 -0.54345008794824767 0.13814630767804975 -0.59568050433467856 -0.63899185863702268 0.55389393629340056 0.58921512704249734 0.55913848783567011 -0.57441157031312806 0.325299983097257 -0.83673543439444364 0.57682181775315744 -0.095854951980086728 -0.39458814273819315 -0.81611023752583067 -0.096393836918309578 -0.39263241862528836 -0.81582573474933673 -0.096288369489957046 -0.39768438710629206 -0.82065037307883748 -0.097918401391345236 -0.39176866657258758 -0.81978980235431875 -0.096721786999827364 -0.40078063147439102 -0.82519050863184429 -0.099442965864380894 -0.39090491451988685 -0.82375386995930089 -0.097155204509697682 -0.40387687584248994 -0.8297306441848511 -0.10203438612032475 -0.3955077347751042 -0.83669260827503356 -0.10483493501686481 -0.3861957446575584 -0.83608409300918973 -0.10546902515512184 -0.38375077135689234 -0.83560259252009306 -0.10610311529337887 -0.38130579805622627 -0.83512109203099638 -0.10291228814408113 -0.368900858840012 -0.81230833914163447 -0.10737129556989294 -0.37641585145489415 -0.83415809105280303 -0.10447257755903097 -0.36801685641460491 -0.81636534296156738 -0.10800538570814996 -0.37397087815422808 -0.83367659056370635 -0.10603286697398082 -0.36713285398919782 -0.82042234678150028 -0.108639475846407 -0.37152590485356202 -0.83319509007460968 -0.10759315638893066 -0.36624885156379072 -0.82447935060143318 -0.10927356598466402 -0.36908093155289595 -0.83271358958551289 -0.10915344580388052 -0.36536484913838363 -0.82853635442136608 -0.10990765612292105 -0.36663595825222989 -0.83223208909641622 -0.10262859568807488 -0.36906158852052917 -0.81157069305708385 0.55671600976233759 -0.89991833746758298 0.38551576483946015 -0.036560715858162313 -0.40847246288983019 0.71071758474719016 0.13309134988595014 0.02918703822175123 -0.90712870609217355 -0.17044280051760918 -0.53844297977908939 0.027121009094224213 0.076313741980894759 -0.38361872552145954 0.27637913509232859 0.51554789925372768 -0.62101708640252651 -0.86402371746229423 0.42784330721920499 -0.72031420489897091 0.57523112128773413 0.1471245810552741 -0.98157625089269329 0.17517518080649425 0.60990673016829322 -0.594454147855771 0.098227023703922986 0.50281256839772082 -0.095707431325017051 0.043411042797431139 -0.18493054419974192 0.64921467981416914 -0.22780182261654433 -0.38529483175526918 -0.59308843834803027 0.70919125236210567 -0.096371417326913789 -0.43035067010568567 -0.85028205462048767 -0.25424235085996288 0.069818675899079474 0.84032425517149323 -0.24257519229350555 0.045181358922387768 0.86254792986453721 -0.24169662600199773 0.045159712633691125 0.86054455587832235 0.042272840697620648 -0.9016142295273466 -0.20186290427399728 0.45095481147152383 -0.52428279631584407 -0.78712576127155109 0.12785711689226872 -0.92923687224929941 -0.19243712877223504 -0.099288873589814919 -0.19749208922577771 -0.91252377042969657 0.38273126413287406 -0.60479856903983498 -0.5922087679683915 -0.003445687368556825 -0.77994083352016064 -0.48246146562651965 -0.18980179771400757 0.53035772380254098 -0.80834774424966538 0.41163851416857561 -0.88109279231172766 0.53302715355992647 -0.52976572265562927 -0.6769257046835524 0.83717657332849293 0.69159108527566759 -0.17624393508418917 -0.91729075981138686 -0.34415205130743315 0.062780011847032954 0.89477613850344095 -0.34597921732779818 0.065848516368893981 0.90278032238209927 -0.34385116071069766 0.06019232622825952 0.9011292739376815 -0.34499286300934401 0.062109677266407461 0.90613067776809353 -0.34355027011396216 0.057604640609486085 0.90748240937192204 -0.34400650869088989 0.058370838163920941 0.9094810331540879 -0.3442913574432177 0.063978056877644379 0.89183476792867966 -0.34644946495404255 0.067631020059463712 0.90118302956565166 -0.34400528274112918 0.061517789257050856 0.89787507409443257 -0.34550755014819501 0.064060631770564577 0.90438243700360443 -0.34371920803904066 0.05905752163645734 0.90391538026018547 -0.34456563534234746 0.060490243481665443 0.90758184444155732 -0.34343313333695213 0.056597254015863824 0.90995568642593838 -0.34362372053649992 0.056919855192766308 0.9107812518795102 0.5248107415730634 0.51461924577253648 -0.019562047076728904 -0.097391699372431806 0.43702130815345569 -0.95975264179399622 0.42146470164328687 -0.49105149467429704 0.36486868486979041 0.5936995957710417 -0.11356661652621532 -0.14634864146506291 -0.34289698476086444 0.34148970725652134 -0.73128503950596779 0.54202552918206115 -0.106493242482049 -0.61381433882822323 0.00025796101806079398 0.53306486667597586 0.15176630366101551 0.70806751686401759 0.38041098781171917 -0.29089649082730767 0.11547251050601041 -0.46273521095978698 -0.97637929239709531 0.15915407782402244 -0.72639141935432394 0.58583912139902883 0.044002601451804478 -0.27559711174400459 0.68306417350602155 0.56808838795293426 -0.15405361844444301 -0.095012448068547112 -0.13397920669435456 -0.4878371106457603 0.10992605794823702 0.58283081097721856 -0.31858835819411163 -0.25026847355926224 -0.091057447706050329 -0.65404547536932289 -0.52805472722924296 0.03190429684520138 -0.73283299675252855 -0.54524776840948641 0.58869241659968874 0.091786180011740201 -0.95568704264574589 0.58986468354681998 0.15374454221088499 -0.95988969326160445 0.056193334479272945 0.77872538471764918 -0.87409711973129134 0.31247875986302642 -0.9723652074639606 0.083778893069739332 0.16769433441208609 -0.27031375405565738 0.22796014736045048 0.21619664619770501 -0.27247768137846651 0.2233877336508395 -0.21892384254934785 -0.61024159116736698 -0.28787035299388647 0.50070256854715323 -0.50154821019661633 0.23372899781624337 0.46038999716130746 -0.79332333456088944 0.54692126005579522 -0.32584022744304764 0.092861825601071146 0.81731436946496905 -0.19025955693948865 -0.58629488221153592 -0.063625425051746759 -0.11768879268336112 0.71433975392514371 -0.4380770519861461 0.33064500783331746 -0.10172062360915793 0.17703164073687916 0.51038906778914461 0.68214211624429788 -0.2796326397707859 -0.12152523968419232 0.63555995099428242 -0.060298386049281158 0.26284502494253575 -0.64758768470125283 -0.61671620760746471 0.69474095946836456 -0.07668396677280663 -0.23106885054411233 0.12728510082633357 -0.62363535330651243 0.58067640476049187 0.56878283383834094 -0.64250249826917183 -0.15709501265697251 0.097165725803009445 0.83593145357152154 -0.84965042674683955 0.47450016367583869 -0.696667022878662 -0.47805691884565316 0.75797477642948785 0.11577239662133722 -0.48764874850716128 -0.58271666130417399 -0.68226884332682325 0.58181061892585417 0.32302861483666495 0.94600739100043763 -0.52326497193827159 0.13073902537232521 -0.90177949255221856 -0.35040283852833687 -0.023296097974215852 -0.34820636195320998 0.2236585788020348 -0.32921316161400666 -0.15278645449588449 -0.58920699006605448 0.56895250152851684 -0.61549545910081849 -0.89628351080941249 0.19015170619162741 -0.89787762232148971 -0.36610831126212201 0.43047191308479454 -0.9836487567831691 0.15823411796420442 0.54025533974848827 -0.81172890915457507 0.48472546418185153 0.55209017045414555 -0.81334399840209615 0.47309059878373605 0.56481255190659307 -0.81503520750027414 0.46060227370254841 -0.15752423975290125 0.38797521089213632 0.10000224457261642 0.055282641958995016 -0.71649665641313565 0.59671240562695205 0.56356281451297807 0.066709634682790925 0.0052847206210934802 -0.0777398030382494 -0.72228990049661779 0.16781696574878024 0.43209364007244722 -0.62419390354666215 -0.87547671317446574 -0.55504835542637643 -0.72614323166924688 0.75048361216467785 0.58444258932881843 -0.19968462772935486 -0.24860576342594284 -0.15670549344503293 -0.27149205273270244 0.097950819181719426 -0.05131524630777131 -0.64515491464631824 -0.92637728668423602 0.35238178204280429 -0.79108417887110849 -0.47753295715166955 0.59072942570416687 -0.39242876593099107 -0.3000957108089839 -0.1713593616682394 0.26681465618871097 -0.95190104216987026 -0.27913415029228733 0.48458026442901314 -0.76718511791412469 0.42955756258188982 -0.81610562625156935 -0.390347032944586 0.21643199973573338 0.9990741029032747 -0.59735209277308543 0.12766235236593029 0.38255874761954928 0.26393262243896265 0.70676296745283207 0.057520263823410869 -0.66191156739028034 -0.23710919543734582 -0.20996875219568917 -0.044262063659253864 0.272781034779358 -0.95434060561352174 0.37931204976026633 0.28571497536660112 -0.95137240570615067 0.36521686512225493 0.021383318775150109 -0.82915431219877644 -0.43745338162331504 0.47919764287168287 0.39484912736749678 0.125393004252424 -0.21066040268255917 -0.49551020013712882 -0.037361269477504115 -0.21804308671542644 -0.51629660660988874 -0.084001882340858591 -0.06516013958406533 -0.74001288284972366 0.28839371290502441 -0.26414915232533537 -0.71525862030986265 0.4694374436296741 -0.10071646389188266 -0.72286219063567503 -0.030270444741221734 0.44753544924538308 -0.20580028953045967 0.079382037352757506 0.18855475701941155 0.17814475718663847 0.27736552476661352 -0.13927347815007324 -0.62332862344910411 0.010889264288542484 0.45812528926851881 0.71984032372946194 -0.47163659472812752 -0.27707726972621005 -0.32438662515927724 -0.86827336124900012 0.066863319809833829 0.79741321882339256 -0.41833231193375275 -0.048197155111660631 -0.54181991781463401 -0.59852342618654786 0.57166143204855691 0.18046139790040483 -0.0036513248033754461 -0.12459059873554287 -0.6993121707556833 -0.46432102579535073 0.51930020714459801 0.4677474158411013 0.018188338889513413 0.062539377587641609 0.10644818230821314 0.25644380980432557 0.51970379415220325 0.17704696486693466 0.11863665216880112 0.24427548512051506 -0.51835307999606983 -0.85216252814255433 0.40659313053143348 0.012343472742703388 0.18336154954362935 0.6299221042784241 -0.46853645830699669 -0.91238585345388079 -0.12501484657194284 0.65885686834773438 -0.11382101654806319 0.50937505771686364 -0.76895964995711008 -0.014982454526676054 0.5993940713850946 -0.46015607156975064 -0.2877244648042806 -0.21078971248451334 -0.24980409827572714 -0.43826048083037933 0.11828544228901156 -0.96951014471477082 0.17879098130038307 0.64359726368994397 -0.88886643382447239 0.10916170555619255 0.26646401662212493 -0.27858269434580796 0.2118297999089907 0.078038674405879638 -0.86910703041792614 0.44871132898590121 0.5105495935301444 -0.60129778039330573 -0.84304698536460265 0.47055669245725162 -0.60817703769085441 -0.84575643998811467 0.18270824833994775 -0.84541435978796409 0.57187667326613056 -0.25190578133762132 -0.3077240775320893 -0.98360576907172437 -0.27007946701185842 -0.65271386173786261 0.45665645033598429 0.09612738045838097 -0.8904281022406485 -0.050473730478136816 0.43738145763631942 -0.081350163596584424 -0.91328823708375306 -0.06838107691382142 -0.36312259641840539 0.2014636539230982 0.4544937457168074 0.42025675766096426 -0.96319317087094292 0.38161835007178524 0.22586722257349767 0.24790510368570928 0.58514178009208129 0.153295902386264 -0.067550639957802194 -0.10421271108969066 -0.19939232875408622 0.59265152404147914 -0.26641111944721463 -0.15493659530217585 -0.65110229385170681 -0.26017388264632901 -0.16403451338204803 -0.62898564529357748 -0.088352857375211535 -0.45958427075489861 -0.85297573999113352 -0.092492341826106481 -0.46032721183877506 -0.8630914284285498 -0.0954062270304053 -0.4175352341283548 -0.83881927800853895 -0.094073202643813955 -0.43496527553976561 -0.84836700340564319 0.061324046198750676 0.23896633023563385 0.27251893863286636 0.21883324045032473 0.78393231415789089 -0.17286238506004115 -0.43171291895503178 0.04763574558356333 -0.62237354608220108 0.12888227061555127 0.83215282154903492 -0.46600380501217786 0.4301072773322735 0.6660830441876735 -0.051833773289038418 0.70276713616263242 -0.81040254296606062 0.23591173604640425 0.5019440916855914 -0.9422535831804445 0.30297219465395009 -0.17301953078379598 -0.24263592567089048 -0.92607751143949757 -0.029510621558678063 0.58363634620911498 -0.87456184801904024 0.065836656848689473 -0.085849730231482207 0.20630544945794735 0.37823405904858531 -0.86721500567657983 0.0085576397816154517 0.24298660455200879 -0.51613949395553915 -0.97469219981393951 0.174073352541493 -0.68438647018912113 0.58900830503196899 0.44049650828217668 -0.56409931201217223 0.55404921128364071 -0.30800835395163062 -0.277495519391944 -0.85612593929943548 -0.032392429651239646 -0.42669980906732546 0.52458864210662415 0.51023370639608401 -0.47271527478669001 -0.77696453320765402 0.50439332453877839 -0.43392573670154411 -0.76165154108243949 -0.080726043725800431 -0.32594736131045005 -0.96427085340694452 -0.10637099437621719 -0.31258154074486538 -0.95725844020197881 0.56106263582374261 -0.28910834139057634 -0.49687514083435125 0.69818500690992669 0.0062300784481946515 -0.1815305757272887 -0.31358296433795274 0.12562726713138792 -0.14945825190786549 0.20118228954547393 -0.95105344640234613 0.3272891067512661 0.68041133939093768 0.46615425911826536 -0.43612613884856183 -0.084278768776152674 -0.52439178431959976 0.17913979575837058 -0.022875020294900666 -0.72632317500552268 -0.52229014507927185 -0.23056776358749731 -0.56423625007492395 -0.36104703363492618 -0.032164673815392189 -0.7898959492244424 0.05623717892603864 -0.48726805287708397 -0.71017273051080732 0.61882585569872939 0.49568822286851438 -0.62891525458059527 -0.86868948606422425 0.47972974870866175 -0.62354702676925855 -0.86189417801510881 0.50527133986632966 -0.61203594971590392 -0.85234124542646283 0.48239952584476831 -0.64432201994414684 -0.94655663006964175 0.42935619912151296 -0.22952263891397778 -0.95337871241149597 -0.54412088976814355 -0.78445095417295319 0.81103785363409953 0.43063155331014735 -0.45265980676073525 -0.73731289617436713 0.5739134389889694 -0.55587982573322892 -0.83636567230343228 -0.28201927484314498 -0.10950406361179643 -0.15417553487951555 0.31936546210468675 -0.22783533628290525 0.18135020564236676 -0.060658001291924356 0.64287538251694787 -0.76654653076650892 -0.006358497216524709 -0.45452376307977738 0.28836152865284986 0.41158171288851814 -0.43545032762288988 -0.6842013720978164 -0.17433812302119328 0.63468149975020371 -0.17486017366168916 -0.27433248207975608 -0.14345381689315817 -0.68644612443079212 0.41003542623736461 -0.87257832718176986 -0.21199901626757081 0.57054938738026395 -0.48404182627645853 -0.81401143233379492 0.45564883236092724 -0.83505456671930289 -0.26747695130928584 0.54037213109594928 0.32764369203062671 0.022695272429216803 0.65098585613335325 0.13212376813429175 -0.9030304419619235 0.40953874871684265 0.057639116870370932 -0.90067069127848776 -0.22979704469647091 0.58485964791792067 -0.66075040457870815 0.58835315751657025 0.20513846213161649 -0.079969475116806757 0.67624829527074704 0.090744706231887018 -0.14729250218770332 0.37784294809104474 -0.11288006510621876 0.14937303720165221 -0.31298313240500097 -0.20318693284825121 -0.45626990393654232 -0.38287984773182027 0.35006042176442731 -0.38230904556293743 0.39749025646271507 0.82522672956127763 -0.79107014948750376 -0.15728077477933711 -0.26260752789601088 -0.54458176023503779 0.052765944690394355 -0.89655241163750288 -0.31301529655339555 0.73863705746264807 0.30509192677144059 -0.30499604773338274 -0.0040466612773031345 -0.26231879301463684 0.51630118384507595 0.69381688638214789 -0.66305565798855159 0.17766517256650113 -0.23254335957695163 -0.4262328280707034 -0.38388843948475215 -0.22991355089187346 -0.37078451848048327 -0.92269390032334342 -0.64743089260490128 -0.61304949339282733 0.85249310971999348 0.48099351149020103 0.33075312653877087 0.14774991760642384 0.11017741427321587 -0.71582927639632388 -0.89808130930479668 -0.26617848370837449 -0.2625413821528641 -0.23250221272967631 0.72427453613045567 0.31362753963176176 -0.60245377650878762 0.4129774587925869 -0.96357508678039228 0.2596876592924488 0.44471049962178394 -0.94905487123527099 0.29705245362797317 0.60187380171210214 -0.087326438203640069 -0.56327086096573331 -0.18401198091606169 0.094841060135435695 0.084339995424231637 0.75736790099706341 0.24965612010509761 -0.43930662021500527 -0.078837841447941787 -0.2995543480556912 0.18572846874871102 0.33579944351434016 0.80403962753515235 -0.51942537933052912 -0.081594955534429303 -0.034849186206982019 -0.9044332373461611 0.68055286349293975 -0.030955830956679732 -0.57112258144483075 0.45241798715112524 -0.44146936531284769 -0.96990168644627117 0.72203825028312774 -0.053485112511336613 -0.45408522813418584 -0.40468521922940459 0.17587270821703271 -0.20320772595063413 0.59800393540372943 -0.44576854159428375 -0.23216945321463645 0.25362406362807027 -0.46297723960050946 0.52069358253193676 -0.057951131910211437 0.5095009974105319 0.13339997466051076 -0.0053531985642067846 0.62690083962943566 0.064321803033284844 0.12086393538468244 -0.084219939159104154 0.2171555315414235 0.27281050750045172 0.8585884274208947 -0.83366027589234382 0.72345130824947579 -0.10156012178843388 -0.90932797818048228 -0.20937224611977906 0.01792688505487303 0.8218288661246993 0.43514801096381084 -0.65202604231518269 -0.54238274795993624 0.18909519507563563 -0.14258709545946727 -0.92586192107699072 0.24870454791761218 0.95142954681102865 -0.48204700855469451 0.26209367641754733 0.95182276290152801 -0.48485018092991061 0.23702290411671303 0.95108658467681628 -0.47960134026081375 0.23257678826766731 0.95095617467749649 -0.47867052687500533 0.21923844072053011 0.95056494467953701 -0.47587808671757997 0.66769626684557826 -0.043707722275459826 -0.18498332222541899 -0.4377077561632135 0.18405111731224688 -0.36052573288109857 0.73925926400202824 0.035592702388870301 -0.50134152857272984 0.45908009954609108 -0.48042772634464936 0.27815149473974921 -0.43617251826709758 0.15605924473975108 -0.26476749690357454 -0.11182078086712187 -0.45040423268877428 -0.58867607736048233 0.54970754602338179 -0.6223550271251217 -0.10463871727587931 -0.040425892738933149 -0.26210989224069714 0.84904445316411825 0.22613574999310226 -0.94101725250548096 -0.16182931584659638 0.40515796419629724 0.74032312846155901 -0.22479588806849951 0.50721113953732633 -0.20750736220035695 -0.6480352115756558 0.37233081452804312 -0.31249578057015054 -0.96606203086931608 -0.15509101623219523 -0.012300058839181663 -0.907331994535167 0.0098492952433903384 -0.49559070685604423 0.45299908426979751 -0.22859691805558213 -0.054720938145534172 -0.95132934754814868 0.32249009869804046 -0.16531975152564832 0.17074120628391001 -0.10868956169269947 0.72952859686438465 -0.35997261859459534 -0.053476358434880862 0.14784786167031749 0.21693627256598089 -0.026108655611566299 -0.21099280045956018 0.54314956797319924 -0.19874063344845347 -0.38236874405236798 0.035453975850870539 0.099464339842873964 -0.40972357417180427 -0.97436434422247853 0.48080014939987131 -0.5945050370372047 -0.96843303372959011 0.051697400674140137 -0.84908324498459753 0.45244572879241984 0.052383468322047919 -0.84898435067686284 0.45522190645446686 0.63966166346876485 0.51710323117130796 -0.2810095847211922 -0.092472536715710582 -0.091288183696853917 -0.90934841751358797 0.67998631007238952 0.321711062381974 -0.17109157108417275 0.73169043299897218 0.12449675309438141 -0.65030462079450835 0.58823169399175335 -0.93785845182676708 0.25359496848443536 -0.1295365817880671 -0.59643343872802368 0.053668732192753095 0.56121902117735556 -0.56476038275729046 0.22016248675735858 0.62626036228667736 0.26949857433149038 -0.84753012372454184 0.08190940241631138 -0.55251163634158318 -0.7807309439617125 0.64593034993084686 0.14408890447633765 -0.95721568731976925 0.12805961328113755 -0.40770942105446822 0.3360908789556557 -0.16583295085726046 -0.68081285301467509 -0.4279517808111683 0.69741371589078616 0.33779391793639052 -0.68867894517618544 0.25950864499304288 0.06787431998152621 -0.90618403114393586 0.0109982122038775 -0.063458474181301447 -0.9062223912678411 0.21066922861010068 0.9481808461938217 -0.47374204731651332 0.20861093600580582 0.94522054478531947 -0.47284606167161936 0.22589765716721133 0.9379214691501635 -0.47156262004367111 0.2137161064466247 0.93534281946501863 -0.47035207229321652 0.20010883288857664 0.93299255165127859 -0.46914505126690337 0.20153455572603804 0.93276416977987375 -0.46914152454276187 0.22409335648928413 0.92495696092000756 -0.46793720295263408 -0.0013120535958031196 0.35907081430109422 0.23911671674288879 -0.46875491526296992 0.061570898193114218 -0.37724324046670377 0.21781198227218795 -0.95901572385465672 0.30640277450563858 0.71109496495015978 0.19605349555342041 -0.16834291675255852 -0.2201499732522498 -0.1819107709790318 -0.0038294067438341965 -0.24298553846430673 0.29923943709655698 -0.065085940731770625 0.0059573272650056217 -0.79645098856862906 0.5111010569781349 0.3288767760539591 -0.55063819715377771 -0.86963957294818228 -0.094043302601307804 -0.41388926021960437 -0.82916712437128015 -0.094529489704844358 -0.41572977955170781 -0.83342616126368418 -0.09984542721125772 -0.061746096404106519 0.71807789775741615 -0.70881753635991551 -0.64649331269776844 0.91155991569716299 0.3195818887889999 -0.18302949542430513 -0.94784938068848967 0.051544402389220742 -0.22817581051519009 0.6249036468673117 0.57555074039865395 -0.047248462533284442 -0.94482094755945178 0.44178091586590801 -0.43014137429665605 0.14648247801534944 0.66993372531270268 -0.07964818709989227 -0.49214418979331065 0.66714907915681243 -0.099798284770562046 -0.45030455807377917 0.61391797041323937 -0.13880666337555564 -0.40377859511538827 0.61987849493143776 -0.10116687379966546 -0.5040679231279277 -0.30188109144723219 0.28731803602542022 -0.84584564497095549 0.12508374941588976 -0.55081911710093756 0.59657900361673377 0.63503674321114678 -0.24049160417691778 -0.92583778978392095 0.52282229713983019 -0.54309330512674037 -0.80395884294268338 -0.30476042701459805 0.50432343326922957 -0.37397159244529449 0.55262216822181953 0.58971072866047525 -0.64371156527767115 0.20025284030785703 -0.80602636310843001 0.58051426603751155 0.29624775850836793 -0.87151001449064769 0.56858312616732976 0.33226299930488323 0.96134563397832906 -0.57904724786573525 -0.35665118488184316 -0.20880061568141248 -0.88350567904282473 -0.056186406198072206 0.69041117773976357 -0.71637031340402457 0.73982731109048139 0.087969837430055139 -0.56286719112409089 -0.033866264202110044 -0.34532336990955287 0.50957446586712363 -0.24287771269785957 -0.2931023698357596 -0.33473901300853942 -0.18246055223462421 -0.5612854543689777 -0.01699190950129429 0.56495478205157978 0.62281833864567893 -0.25510982042302111 0.57246799778102209 -0.23149116132741093 -0.14315517641306588 0.6342851677995569 -0.90743910414169771 0.26278530950947604 0.41644130770449456 0.7479859411244516 -0.43609123045698545 -0.1071935843927791 -0.34740580911755997 -0.81488117703241769 -0.1041739744978044 -0.36818603389400656 -0.81558892690155149 -0.10820762289226221 -0.35281725005279352 -0.82020460952098262 -0.10613587886323989 -0.36707449125272196 -0.82069019428736567 -0.10922166139174533 -0.35822869098802707 -0.82552804200954755 -0.10809778322867537 -0.36596294861143736 -0.82579146167317985 -0.11023569989122844 -0.36364013192326056 -0.83085147449811247 -0.11005968759411086 -0.36485140597015281 -0.83089272905899414 -0.10262859568807488 -0.36906158852052923 -0.81157069305708396 0.38430208536327748 -0.60121058486612411 0.58803944726605339 0.49371628177649818 -0.89533812160873449 0.45871007172520506 0.46876486854917337 -0.89268234585079098 0.4842586416127061 0.030899416686503305 -0.39462378493398287 0.26267052380488692 -0.30233159394329073 0.39069732944080154 -0.18744145738370838 0.66292311937449055 -0.86630763717024517 0.28254992051370204 0.27900980200279529 -0.37589413180240822 0.2719026069063934 -0.37276220698550333 -0.79349665576989348 0.72420967686659254 -0.10720169585734105 -0.52335289159257248 -0.92452095277901847 0.41870365038853757 0.1212972450249354 -0.8960264415581406 0.42833792804479187 -0.5168191792400848 0.52357678818450626 0.48591385283239075 -0.42658093952335163 0.029192107845912384 0.53322947842376978 0.24507753569394586 -0.94569477291617221 0.55043466311594158 -0.32652500952051922 -0.83799353108691332 0.44182734723375294 -0.26945749447506723 0.086212665787417014 0.45874973347249998 -0.67938274619516892 0.56647107188174783 0.20840835311037373 -0.98006293272837619 0.095291999079713946 -0.00091892376310383293 0.22581204191473112 0.25358560736383173 0.39277630345164383 -0.004860922544630779 -0.90392190609545298 0.70204041826643904 -0.13594453359133107 -0.85154492018836858 -0.2395194534299129 -0.24746389139789848 -0.38633775068059661 0.58223109238624704 -0.2586343183136986 -0.25103285532455843 0.37821638622361486 0.65298011305801607 0.026275048664253127 -0.0047853364998454249 0.83688377244259649 -0.5956584647419032 0.015313055700949147 -0.87775466241717282 0.10914885788558483 -0.1553553899006539 -0.24901792269471276 0.74679907242441634 0.3655743874978884 -0.23988849196702564 0.15706314190309581 0.51808205851384659 -0.67611395388237017 -0.44220658505808508 0.029701457711109026 -0.62026833981080109 0.55159418266902938 0.064513517953277907 -0.91089292536161093 0.07578904357825994 0.16210081906881529 -0.49237659900850123 0.60318785179458345 0.74713988604461246 0.21536018127821946 -0.24232757248988335 -0.27163110684928976 -0.07573538228279314 -0.10747966790076828 0.11941450176911876 -0.93863427606545202 0.29405436841634375 0.09561974911904883 -0.92802623684544705 0.29479958145986462 0.60165264475415037 -0.51073079674864719 -0.21369002546413032 0.32039555447673485 -0.27846299313549944 -0.96612544278069334 -0.36172063586458736 -0.086217268793253268 -0.69289874437389021 0.6274897523281745 0.23499194119646194 -0.85855008730782856 0.49133913483284081 0.46920594119159176 -0.94999987056043167 0.71230575667128471 0.39804501091659955 -0.43307902232496237 0.71992557279330172 0.37150972588107883 -0.38605160200303729 -0.18929250425256278 0.58654291118766166 -0.72874910904264112 0.13522542705543697 -0.94343116580600062 0.29610662787350567 0.12862727918471706 0.61376629873088029 0.11532673343549936 0.57319161348436243 0.51788250597250329 -0.098785074149496124 -0.10190981537447531 -0.24742381367826652 -0.73381975108327946 0.42019884737338686 -0.92940141502544082 0.047162264202192355 0.1114372864976499 -0.65216394663249921 0.57859785092035276 -0.26719804134599706 -0.23737650475259661 -0.18403206645213513 -0.26766025416743866 0.13484779210097098 -0.087706393323799398 0.51903783025873407 -0.46801164454330235 -0.97092931056252307 -0.31228459651928786 -0.74347504537018516 0.54535721600533649 -0.085196520104166298 -0.048332362359637407 0.14959909945461719 -0.28096358270556848 0.4269786088290235 -0.83000971897951537 0.61307058727677477 0.47642864072465679 -0.13955645988226181 0.22943098772779538 0.50692463007773425 -0.96040152078585195 0.28051359674302406 -0.91085127845550096 -0.084026614495153626 -0.25978115385584821 -0.31738179193317417 -0.22776064846077229 -0.52972646732224971 -0.64498464342446549 0.52790437313981653 0.43572257222683719 -0.51098195920741518 -0.58258695270377159 -0.21750252550182209 0.42681387944681937 -0.061684524835806796 0.32652215476289892 0.45227975619923438 0.2227084412615164 0.12225379405392992 -0.36274679504445068 0.62202167354219773 0.23496402564836774 -0.024198804983670229 0.23163172999340353 -0.49376060376921799 -0.60876475626056281 0.76479834852855622 0.32133080351243154 -0.95361983144012807 0.31794366908785598 0.38863404617544262 0.50371665546363276 0.17071814380135286 -0.20102880004653845 -0.010793051035484117 0.8714078956547564 0.49340147413305152 0.41691267275419797 -0.96156855206412029 0.52097580723125825 -0.26774597954508711 -0.71890026469028268 0.31710763428778305 0.66613923294014654 0.0446077607961477 0.24213815328135818 -0.93440349617514373 0.5391658699267543 -0.031846659983905415 -0.28678748905131274 0.20808736541203796 0.4622818424668857 -0.57897738645484287 -0.8192483432289196 0.46553718044810843 -0.59384650767513392 -0.83265400922715238 0.21377507042632699 0.99037984763037612 -0.51918974392689021 0.26908913335306667 0.12646744075473024 -0.90936856956857981 0.63234272172344308 0.20346455267418939 -0.93969281517483405 -0.16428428092243963 -0.73422328451117436 -0.21777132748633138 0.53484081350824542 0.5684986939061264 -0.71985587111404559 0.69588443564557245 -0.082058159316851689 -0.44647224260677665 0.37193382792910118 -0.86623345189645851 0.55810543126630063 -0.24828318543725725 0.089903535222170192 -0.018511743204342096 0.28935810551919672 0.78880656927366144 -0.86952912090612133 -0.2396621235489825 -0.18155367262604688 -0.95590636726231004 -0.65501554859637057 -0.72195614904745586 0.84885424303330126 0.095726105218776988 -0.86589328687256761 0.52232943633661844 0.55079173786777158 -0.29860615235137639 -0.56821218320380917 0.048231807190510172 -0.7967750220176758 0.55297448020357332 0.5858584706724812 -0.60488828969967079 0.25672079056805536 0.2402259991906891 -0.89134118869066348 -0.37128075782564418 0.52935730480559195 -0.31893581901344742 -0.78100255514792971 -0.24915395988034658 0.13167432658937897 -0.023551140547528875 0.37106521136175868 -0.73275067582139042 -0.52480975037498001 0.65465359808922408 -0.11775076722441447 -0.23810708711059944 0.75607543535997102 0.14304720153789752 -0.52381180574291397 0.52678235113698169 -0.32856529033550841 -0.76405308200871402 0.52716923290727513 -0.33665762210123878 -0.76858991118938769 0.52646367593399079 -0.34756387109103454 -0.75008353790776272 0.4776366724693436 0.45144357364250415 0.095056382905702827 0.53110897699474835 -0.72672898249612505 -0.3634674384275321 -0.30226054808584468 0.091194693459672363 -0.14409202167420734 -0.16921445958339848 -0.20832994023866447 -0.60251036227562105 0.54947891773457302 -0.27520145865905615 -0.092394563460169957 0.45609659776066691 -0.76365716577403608 -0.43899682648307103 -0.0084577087692320977 -0.65416916157210425 -0.9742852444938489 0.52320598119106665 -0.18237657845432403 -0.9440750446407129 0.55684180932130933 -0.44479553713947867 -0.80892830747954647 0.33402577006486112 0.84550269457281746 -0.818468909410766 -0.00034954893590019142 -0.11407201563937419 -0.90778764744540674 -0.27893384685418932 -0.15205048738430077 -0.7742634888022718 0.35335434629658363 -0.59306987038887948 -0.88746983568349835 0.14703725594218536 -0.69152674077249587 -0.89416505592170725 -0.30685572484296869 0.0090744332546791352 0.94085145806722559 -0.16130962018702244 -0.17698175570993938 0.87556634377175058 0.66513263325677996 -0.12347164628512923 -0.40137970854169963 -0.12024853782612394 -0.25297727718227958 0.13320188095044275 -0.11560901027167574 -0.31129675685783231 -0.66370562477593986 0.077859827802103973 -0.41934046260162322 0.32679834062280005 0.62043080214405921 -0.8584352106717178 0.045113767893175505 0.67573070556851156 -0.83507995841999128 0.12894469511824258 -0.21685976307502994 -0.023030197733252728 0.98507865691372809 0.63425841086473178 -0.82320944195018408 0.38571173710604489 -0.13613449978338468 0.50898137688205491 -0.86109117173490834 0.76530698229215743 0.10058245147580269 -0.39440117554915716 -0.35956257303905287 0.40918417268574553 -0.42351404250484054 -0.26824920928108675 0.17191762295788721 -0.098480322410502918 -0.15367195380139723 0.5212393049986771 0.0077401034935736012 0.61037550725760625 -0.41112423818506022 -0.89948543636541356 -0.29976333350939416 0.49125977347189903 -0.29607911822976946 0.20574536540303887 0.24703708605439062 -0.96054596713435636 -0.7424469507428737 -0.60164484085149939 0.71574223142058546 0.72611603829703386 0.35069763507338425 -0.48923613682928568 -0.34156782037025785 0.39344781218874092 -0.68884293130985585 -0.24794396326775309 0.21727132475131455 -0.038779274858246615 0.035917249407495286 0.74801776798370267 -0.096954448556637013 0.48359193097762704 0.2649646288695432 0.1631433888742187 0.011228649483731394 -0.51383531005095195 0.42100650036346654 0.011207429561387061 -0.51388675307285392 0.42101304064589729 0.0068544366993883062 -0.51744054690367869 0.40490902235526544 0.0091779619203652303 -0.51635142928117994 0.41551836574175838 0.25892382167233163 0.95668611289219296 -0.72609763623280277 0.5852113106606206 0.27235913494382319 -0.96238804619537133 0.25563186754341327 -0.82704753708754519 0.58087716202986162 -0.23646921021727912 -0.49456403850926395 -0.37613112913530428 0.3768355136561764 0.15694285495011215 0.24789663061360728 -0.13622226506286564 -0.58118031594256248 0.5253719827444232 0.18872541710087404 0.13296663782961468 -0.91367441402574401 0.33926220105608967 -0.584456083819896 0.59104242931800766 -0.30119959155116915 0.42763526098330829 -0.21247861208051078 0.53647849969006967 0.17597767340492501 -0.93719977674765997 0.62389616129101777 -0.7209461953718288 0.42257671600689972 0.0097545940046868153 -0.55638240555982577 -0.62729282776754469 -0.36796583561848673 -0.19727440109818045 -0.34983531564114134 0.56130688768174797 -0.44068618732572229 -0.46698153474142801 0.60277352723318256 -0.15917144380437295 -0.29936006921927194 -0.70821560004272888 -0.64118087817781977 0.73548733742712114 0.27336252988236753 0.24179405843964769 -0.94327193474802584 0.098844364658872752 -0.7838062513720776 -0.51964018675013923 -0.30051278699539302 0.35038991423598626 -0.16740869345232093 -0.13985730908703345 -0.35839771906905055 -0.59735221916062176 0.56183268802229447 -0.58347290563800336 -0.84814195344104604 -0.034897290579693603 -0.17755835930134722 0.84451543476348312 0.25592912804348128 0.96194286115744188 -0.71816894063618308 0.43177440212449225 -0.33841407751608898 -0.96650340246688893 -0.097421549825270945 0.076319747752217962 0.16901115951327728 0.61071021456312269 0.2995849142013558 -0.91298803267960926 0.49419315673894032 0.6884409434091987 -0.50951242038499311 0.069738980361380501 -0.86395277198132692 0.44631234617295457 0.070594155248618007 -0.86639380741735594 0.43962122710335161 -0.24473793474621533 -0.57395799347951137 0.56827061045871163 0.55315861105901987 0.39465641961895553 -0.95966769746762992 -0.038061443804935251 -0.034350517408459895 0.64375570247705538 -0.10087239917218734 0.73219803273090878 -0.29183205174947002 0.59631825213184608 0.38796475732484864 -0.072817615151685888 0.61792757903882334 0.12094345474863163 -0.12177800376052865 0.56920173650614359 0.59639322416185958 -0.52368926808149852 0.38383666840018787 -0.82844759819479696 -0.4124807955501269 0.24186267079225171 0.040786991521256304 0.25010282605191775 0.32433497534362077 -0.37500548966450298 -0.96702719203027843 -0.18094226656342791 -0.3203402765552088 -0.492823477086337 0.22641013716173072 -0.89364560943532712 -0.018362554516662022 0.30212141622983263 0.87763482140531013 -0.48807559183308596 0.4304777657654888 0.73005141044638044 -0.54009253060900431 0.01081911550280755 -0.52036494467829786 0.51290754877132771 0.4321491187635218 -0.33117752159661612 0.093003591427158624 0.63325206316114879 0.18820693883416717 -0.87899601766527313 0.20291157046828281 -0.59818694849920595 -0.6474157028607096 0.41820094636714039 -0.93833638852728452 0.33729371675701941 -0.47001006794837197 -0.044959470085470361 -0.32912780348045789 -0.24006877829094034 0.53717432794758568 -0.18231332041758436 -0.05831900908131174 -0.38590467296465841 0.55652544153754646 0.017968486950281408 -0.31352878704641418 0.49084455528508747 -0.24431968554283148 -0.15160582427430541 -0.049222503006280435 -0.00015508600132312913 0.42156959612697986 0.21766439172441782 -0.25957654436630251 0.22806932288442397 -0.96684659957007646 -0.092507076189216275 -0.68271326136771371 0.057597580941049172 0.39792859389470775 -0.3155816232933083 0.12988087670746898 0.072124809100843207 0.41239211864184 -0.96477314648332257 -0.057664591729816111 -0.29809099015992113 0.53801983633285078 -0.2792038037373018 -0.18579383290621229 -0.19318254768393395 -0.32515771247020941 0.21727889102847944 -0.81684397722447488 0.5469493973351387 -0.71254093631848348 0.50691597089976537 -0.2996965469072343 0.093084620378922497 -0.92770937077121951 0.064164102353926403 0.49560079127870699 0.19890743626305107 0.23077737425766784 -0.99763762079619078 0.16490504400961889 0.2575096404614618 0.62305200972298458 0.10670069998342983 0.37555760118369041 -0.62018136520573841 -0.96036156002007811 0.22178622932966649 -0.95695477547085095 0.44451217649947022 0.031940079109264968 -0.46838323391503245 0.38176229734853973 0.25286334446143816 0.66692287534299999 0.054833671241068416 0.75566405711336426 -0.0059502466735994759 -0.29142175805157705 0.51712236501705477 -0.44475240248542003 -0.012088538364747057 0.54507693828901349 0.37861057282050903 0.0003439570891637868 0.5756576515073446 0.55831847513709087 -0.14531542426760496 0.52432578660125173 -0.38299481194950896 -0.026619652437989107 -0.45268058967308861 -0.74231901582286464 0.69415474160893353 -0.091749647794595296 -0.65788905847461021 0.1010207079607791 -0.010401164759345846 -0.39174227445811727 0.47942043041118604 -0.020579667092401232 -0.61324637102385127 0.55955584661476143 0.2063268116197631 -0.40771214486700036 -0.96867368634693662 -0.27294383978567349 0.023136065460044875 -0.9789803454062751 0.010411473479636854 -0.86516487583020174 -0.3632240060076109 0.18998703804216957 -0.96477579731137753 0.27542629224475884 0.17733686059759773 -0.94993828272178704 0.31077965125702584 0.4137356455172061 0.87122941733450476 -0.62483737264767125 -0.33026390771770642 0.081307306538243043 0.90323561220508264 -0.52717983122098822 -0.58276955947320996 0.68964059184933613 0.66847348541070262 0.27200817311100856 -0.14936583866949377 -0.097779467255065242 -0.14581409343535803 -0.91071761055016176 0.52778110214497731 -0.63504258854889972 -0.95360240304917787 -0.27267606878842665 -0.15707665405974791 -0.14574590683196847 0.083910949496922044 -0.35810309800018991 0.7172360159478931 -0.23108204628211421 -0.10673099140031828 0.83195494191775632 -0.0058928876929154475 -0.49248441053502184 0.5474960522033463 0.38661985446448166 0.37251484258113587 0.22634665556944553 0.10546899441399499 -0.71322172350169788 -0.95648546609990104 -0.0051421643468041794 0.37624809261160969 -0.96700527503924438 -0.31003696445911938 -0.2311504848284974 -0.83433559210323571 0.55023804030238965 0.15571726463076055 0.063312118194104927 0.36174817516098967 -0.94463163659730986 0.48204868315087979 -0.1116901034243013 0.37109516777221685 0.15775745630556234 0.11334261163482301 -0.079254962951633812 -0.91082183008544682 0.54097248402328846 -0.055095638790553923 0.0013384322879491416 0.35727485971778566 -0.44823856352166086 -0.74959127575236784 0.61598519494079329 -0.49360109983210909 -0.85887244836398458 -0.45807007425417284 0.082475699891013443 -0.31195198213039665 -0.33022797710760238 -0.10569605537850552 -0.8223540154421235 0.53310953020760643 -0.52251151881625613 0.18276543824188737 0.51262398083976402 0.41647865453218236 0.049220300220692702 0.0095076178056011929 -0.48668583327802761 0.63789928178782651 0.13475988310776796 -0.49178973774869378 -0.6926846033330244 0.3855437354543137 -0.41152746150454833 -0.96867551876920255 -0.037171828400556432 -0.039251558033969597 0.17914312446938482 -0.20368856409704755 -0.65348822797804473 0.44317904827734672 0.61078483798450467 0.55397778493339034 -0.23723208639761365 0.31054191823450683 0.70397535549580292 -0.0098708449300346796 0.32171142414099552 -0.69185288503863196 -0.57803254603462739 -0.092497471577153184 0.014843210924404214 0.15946146125478666 0.5633504895904774 -0.58593084627386383 -0.42790065594104448 0.53199555077493965 -0.60606426243629141 -0.4741814555767212 0.57741215871826868 -0.64145835733358336 0.35870118498964754 -0.039579075486985082 0.74353245902917497 -0.53712239323285038 0.12043942506753652 0.20677022173865653 -0.93131482751361783 -0.26497214093828825 0.4597774376169112 -0.1710594420158433 -0.67590748654438004 -0.65213969794008064 0.67558967738083942 -0.089361914225971839 -0.63455685870210143 0.14531885047504628 0.46954025808917788 -0.52066440281328363 0.32009900852600337 -0.20801074085312429 -0.34767593680797082 -0.85887017741861749 -0.13621553957040194 0.67303319170443854 -0.59934533081314534 -0.11223796000932781 0.56451550789425919 0.032873863004041673 0.49569910845129062 0.69946271169842078 -0.34177072147870374 0.68285412134805767 -0.85606439920186872 0.20056098805512335 0.4243602047263636 0.75306672827869625 -0.65767825426286852 -0.0073447106703917655 -0.53968766519248068 -0.79790120159521039 0.20451204089237701 -0.58834019671368731 -0.86839901566794209 -0.61583751930929387 -0.59151544897966657 0.65244219231996758 0.24373927506795021 0.01182885745538137 -0.90779083228455026 0.068812674432102053 -0.94462680023646672 0.19128406242744125 -0.067527950651848703 0.63985571303680266 0.005065814208705042 0.41918230641612791 0.077107614157385818 0.19976269326650342 0.19078371499470323 -0.93053502565920609 0.024128862222883334 0.462004954788718 -0.8004634874901787 -0.013596854070233349 0.58002401783280044 -0.49861882401977448 -0.96207789667784982 0.55714703699534018 -0.21401348150440636 -0.094447289655420943 -0.091912838865248175 0.72686523236962375 -0.22721110793152688 0.68972038865171859 0.38400487963777974 -0.63183357340482438 -0.22369450122594076 -0.30210884623363049 -0.38631441740448647 -0.46874690815223857 0.036052684115378535 -0.44062727865752599 0.30680995226025959 -0.95550443055863943 0.47717498610535264 0.27920738336723427 -0.95214998910641035 0.50635358868393754 0.61176339929661949 0.56444271612369379 -0.39458256157766963 -0.0069009385811028938 0.51604614496891232 -0.93276144735163657 0.16803986623293357 -0.21065751719479162 0.21589686171033109 -0.41324551359721706 -0.57593934593205198 0.64290841396466003 0.34142856157894785 0.24377104280503678 -0.91855327934937137 0.52899262651773449 -0.25788746444667415 -0.045394640673740411 0.54506956114538352 0.63502943273666757 -0.47919757672274049 -0.067003191008949012 0.73263763229163337 -0.52247594152623555 -0.24859231319059022 -0.7469692933932891 0.52365818947777565 0.55039854285918288 -0.39961904203004722 -0.072828438849491042 0.21684532863827674 -0.75104195157537779 0.58932267195680577 -0.11739482296817745 -0.56919350000291469 0.096230397151938041 0.51580527005231824 -0.75824775561825331 0.52437849200350295 0.5548249197307189 -0.54230834702294362 -0.084519370822850548 0.57223901078599915 0.59360018860387664 -0.19770481518803457 -0.36072420618610762 -0.26128210787068351 -0.97179756836925379 -0.35290961437192647 0.33551278182991989 -0.21454295732524239 0.55022863588204396 -0.096122754517696557 -0.70744358073938085 0.0052483121225519718 -0.35724128823327606 0.77943757955985671 0.23032960875963723 -0.59287611094806025 0.5920857688416522 -0.25128835030524055 0.087198896547838911 -0.97981949830434012 0.47893324056664999 0.66806364712870836 -0.13265923227709459 0.60951711139513642 -0.94414719583619466 0.18213559879446281 -0.14847473184312426 0.17970397011478959 0.1332037630059543 -0.29391764931963543 0.054333479060804248 -0.13565778886121299 0.065242369367118858 -0.022379512069003595 0.22033647093802633 0.11179843118875389 -0.92045862617548846 -0.26847989535563171 0.72335131724725898 0.29521936306028401 -0.21933654066665531 -0.09459886180799415 0.36294056887416021 -0.96083178263446301 0.44044104881725377 0.3558277865880009 0.1939723006912899 0.27538917612774289 0.63874532463826894 -0.93628133373445199 0.48797347326701107 -0.85121289483748652 0.50364164566050995 0.49578073306432374 0.58145230328662645 -0.78217415420934877 0.64658845745347027 0.45803544464290186 -0.63064032563660466 0.24329348059867034 -0.69560045615988819 0.59531463698234166 0.64452877739080983 0.078288479209441431 -0.9655799581498723 0.69202217985070746 -0.060355905071076563 -0.49694031757319707 -0.15870872643396672 0.69060128236934337 -0.35435749493368424 -0.069639909143094897 -0.16300997667974498 0.77028164946155397 0.12293000667532542 -0.89268163018113167 0.507529672102629 -0.13848264022471693 0.046419840726821322 -0.90140257237860733 0.35139165369607184 -0.89924612575491736 -0.28360037471823191 -0.17834378037137702 0.13019567542403693 -0.92614486965595499 0.60764861139976423 -0.15016566280861324 -0.24418007374535872 0.024210840715653943 -0.33637232585258597 -0.9728290929022898 -0.13583342021262756 0.023735881299092904 0.71130129901939654 0.76199542534888598 0.042447513149611364 -0.30393233464578556 0.19690007787227479 0.4573297228300115 0.23655654979100718 -0.11623063244479054 0.10237847209512567 -0.8969883703679542 0.23847804364824912 -0.93154550617306831 0.031224983654211783 0.45586851965311564 -0.84433226747501589 0.53058513812665931 -0.24615624616943999 -0.47622831839922997 -0.3251734675324669 0.017141124415070017 0.78285479028648353 -0.22258858195755116 0.093632405062300417 -0.90098340335342131 -0.33522912814205413 0.35449504225254713 -0.47710641211175714 0.51828477348688995 0.43955437572103984 -0.51930387262454336 0.48546182145574185 0.061780224060510695 -0.70518773769389076 -0.88359494843032349 0.3167464806298903 -0.59297136182182564 -0.93930337902849337 -0.091534793417618637 -0.43978561340143907 -0.84598768911767452 -0.096371417326913789 -0.43035067010568567 -0.85028205462048767 -0.094529489704844358 -0.41572977955170781 -0.83342616126368418 -0.1367906104653776 -0.33700994927872807 -0.83158728994659037 -0.10190981537447531 -0.24742381367826652 -0.73381975108327946 -0.14460876858048161 -0.29574783565815649 -0.8032472011292533 -0.20691904045129011 -0.29818271493346643 -0.81944024270717919 -0.20736265580903518 -0.28574318383176317 -0.81238281025462866 -0.24969361161500847 -0.24563229506693046 -0.80716117482640481 0.070594155248618007 -0.86639380741735594 0.43962122710335161 -0.11023318473846341 -0.3183070908715756 -0.96231608103863298 -0.10637099437621719 -0.31258154074486538 -0.95725844020197881 -0.083469803674483894 -0.33163213686071424 -0.96815614657722637 -0.085797306368525311 -0.3415088174870296 -0.97135444230233847 -0.051870448873904705 -0.32672505634525556 -0.96724519791526231 -0.1121741348154061 -0.46893022091594522 -0.93495379838190196 0.43738595257479207 -0.56898075762341849 0.55199736282104839 0.43473551746817996 -0.56076224759227256 0.55194317386472747 0.65533248028985469 -0.061585367656263726 -0.55416505125399107 -0.011355836692738406 0.7516824795853172 -0.5766127939183997 -0.055693549803541666 0.72930807363662176 -0.56783285701743247 -0.090535329920208268 0.71720475472596168 -0.53238996599161881 0.20643244541038147 -0.46171634145507606 0.5540744497837683 0.28284725734084137 -0.58570666242715996 0.59107874559860185 0.29830791232898024 -0.57684939641437316 0.58983463642362544 0.31517708477567252 -0.52850893947233313 0.58215913207226822 0.21716479194950516 0.97245047240115345 -0.49268718974128833 0.22474129868461656 0.9440785032141632 -0.47391668551706245 0.22589765716721133 0.9379214691501635 -0.47156262004367111 0.2137161064466247 0.93534281946501863 -0.47035207229321652 0.20153455572603804 0.93276416977987375 -0.46914152454276187 -0.74638579670254268 -0.59750161733382157 0.82364840080353141 -0.7253607078103087 -0.61199544701183151 0.87284804421635631 0.47972974870866175 -0.62354702676925855 -0.86189417801510881 0.51554789925372768 -0.62101708640252651 -0.86402371746229423 0.052383468322047919 -0.84898435067686284 0.45522190645446686 -0.72669004600130005 -0.5914352005005008 0.86262094352353602 -0.72767377576627923 -0.59805243740461356 0.87182184185686951 -0.73487407046695807 -0.60027185760755619 0.87652887943199109 -0.3190722364551804 0.021037021510511622 0.88903586315920691 -0.34280211712218578 0.056681388799173241 0.90422029137410354 -0.34326747685352627 0.060734264354237857 0.89421900097458817</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<polyhedra>\n\t\t\t<first_faces>0</first_faces>\n\t\t\t<face_counts>2598</face_counts>\n\t\t\t<types>polygons</types>\n\t\t\t<face_first_loops>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597</face_first_loops>\n\t\t\t<face_loop_counts>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</face_loop_counts>\n\t\t\t<face_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_selection>\n\t\t\t<face_materials>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_materials>\n\t\t\t<loop_first_edges>0 3 7 11 15 19 23 27 31 35 39 43 47 51 55 59 63 67 71 75 78 82 86 90 94 98 102 106 110 114 118 122 126 130 134 138 142 146 150 154 158 162 166 170 174 178 182 186 190 194 198 202 206 210 214 218 222 226 230 234 238 242 246 250 254 258 262 266 270 274 278 282 286 290 294 298 302 306 310 314 318 322 326 330 334 338 342 346 350 354 358 362 366 370 374 378 382 386 389 393 397 401 405 409 413 417 421 425 429 433 437 441 445 449 453 457 461 465 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 718 722 726 730 734 738 742 746 750 754 758 762 766 770 774 778 782 786 790 794 798 802 806 810 814 818 822 826 830 834 838 842 846 850 854 858 862 866 870 874 878 882 886 890 894 898 902 906 910 914 918 922 926 930 934 938 942 946 950 954 958 962 966 970 974 978 982 986 990 994 998 1002 1006 1010 1014 1018 1022 1026 1030 1034 1038 1042 1046 1050 1054 1058 1062 1066 1070 1074 1078 1082 1086 1090 1094 1098 1102 1106 1110 1114 1118 1122 1126 1130 1134 1138 1142 1146 1150 1154 1158 1162 1166 1170 1174 1178 1182 1186 1190 1194 1198 1202 1206 1210 1214 1218 1222 1226 1230 1234 1238 1242 1246 1250 1254 1258 1262 1266 1270 1274 1278 1282 1286 1290 1294 1298 1302 1306 1310 1314 1318 1322 1326 1330 1334 1338 1342 1346 1350 1354 1358 1362 1366 1370 1374 1378 1382 1386 1390 1394 1398 1402 1406 1410 1414 1418 1422 1426 1430 1434 1438 1442 1446 1450 1454 1458 1462 1466 1470 1474 1478 1482 1486 1490 1494 1498 1502 1506 1510 1514 1518 1522 1526 1530 1534 1538 1542 1546 1550 1554 1558 1562 1566 1570 1574 1578 1582 1586 1590 1594 1598 1602 1606 1610 1614 1618 1622 1626 1630 1634 1638 1642 1646 1650 1654 1658 1662 1666 1670 1674 1678 1682 1686 1690 1694 1698 1702 1706 1710 1714 1718 1722 1726 1730 1734 1738 1742 1746 1750 1754 1758 1762 1766 1770 1774 1778 1782 1786 1790 1794 1798 1802 1806 1810 1814 1818 1822 1826 1830 1834 1838 1842 1846 1850 1854 1858 1862 1866 1870 1873 1877 1881 1885 1889 1893 1897 1901 1905 1909 1913 1917 1921 1925 1929 1933 1937 1941 1945 1949 1953 1957 1961 1965 1969 1973 1977 1981 1985 1989 1993 1997 2001 2005 2009 2013 2017 2021 2025 2029 2033 2037 2041 2045 2049 2053 2057 2061 2065 2069 2073 2077 2081 2085 2089 2093 2097 2101 2105 2109 2113 2117 2121 2125 2129 2133 2137 2141 2145 2149 2153 2157 2161 2165 2169 2173 2177 2181 2185 2189 2193 2197 2201 2205 2209 2213 2217 2221 2225 2229 2233 2237 2241 2245 2249 2253 2257 2261 2265 2269 2273 2277 2281 2285 2289 2293 2297 2301 2305 2309 2313 2317 2321 2325 2329 2333 2337 2341 2344 2348 2352 2356 2360 2364 2368 2372 2376 2380 2384 2388 2392 2396 2400 2404 2408 2412 2416 2420 2424 2428 2432 2436 2440 2444 2448 2452 2456 2460 2464 2468 2472 2476 2480 2484 2488 2492 2496 2500 2504 2508 2512 2516 2520 2524 2528 2532 2536 2540 2544 2548 2552 2556 2560 2564 2568 2572 2576 2580 2584 2588 2592 2596 2600 2604 2608 2612 2616 2620 2624 2628 2632 2636 2640 2644 2648 2652 2656 2660 2664 2668 2672 2676 2680 2684 2688 2692 2696 2700 2704 2708 2712 2716 2720 2724 2728 2732 2736 2740 2744 2748 2752 2756 2760 2764 2768 2772 2776 2780 2784 2788 2792 2796 2800 2804 2808 2812 2816 2820 2824 2828 2832 2836 2840 2844 2848 2852 2856 2860 2864 2868 2872 2876 2880 2884 2888 2892 2896 2900 2904 2908 2912 2916 2920 2924 2928 2932 2936 2940 2944 2948 2952 2956 2960 2964 2968 2972 2976 2980 2984 2988 2992 2996 3000 3004 3008 3012 3016 3020 3024 3028 3032 3036 3040 3044 3048 3052 3056 3060 3064 3068 3072 3076 3080 3084 3088 3092 3096 3100 3104 3108 3112 3116 3120 3124 3128 3132 3136 3140 3144 3148 3152 3156 3160 3164 3168 3172 3176 3180 3184 3188 3192 3196 3200 3204 3208 3212 3216 3220 3224 3228 3232 3236 3240 3244 3248 3252 3256 3260 3264 3268 3272 3276 3280 3284 3288 3292 3296 3300 3304 3308 3312 3316 3320 3324 3328 3332 3336 3340 3344 3348 3352 3356 3360 3364 3368 3372 3376 3380 3384 3388 3392 3396 3400 3404 3408 3412 3416 3420 3424 3428 3432 3436 3440 3444 3448 3452 3456 3460 3464 3468 3472 3476 3480 3484 3488 3492 3496 3500 3504 3508 3512 3516 3520 3524 3528 3532 3536 3540 3544 3548 3552 3556 3560 3564 3568 3572 3576 3580 3584 3588 3592 3596 3600 3604 3608 3612 3616 3620 3624 3628 3632 3636 3640 3644 3648 3652 3656 3660 3664 3668 3672 3676 3680 3684 3688 3692 3696 3700 3704 3708 3712 3716 3720 3724 3728 3732 3736 3740 3744 3748 3752 3756 3760 3764 3768 3772 3776 3780 3784 3788 3792 3796 3800 3804 3808 3812 3816 3820 3824 3828 3832 3836 3840 3844 3848 3852 3856 3860 3864 3868 3872 3876 3880 3884 3888 3892 3896 3900 3904 3908 3912 3916 3920 3924 3928 3932 3936 3940 3944 3948 3952 3956 3960 3964 3968 3972 3976 3980 3984 3988 3992 3996 4000 4004 4008 4012 4016 4020 4024 4028 4032 4036 4040 4044 4048 4052 4056 4060 4064 4068 4072 4076 4080 4084 4088 4090 4094 4098 4102 4106 4110 4114 4118 4122 4126 4130 4134 4138 4142 4146 4150 4154 4158 4162 4166 4170 4174 4178 4182 4186 4190 4194 4198 4202 4206 4210 4214 4218 4222 4226 4230 4234 4238 4242 4246 4250 4254 4257 4261 4265 4269 4273 4277 4281 4285 4289 4293 4297 4301 4305 4309 4313 4317 4321 4325 4329 4333 4337 4341 4345 4349 4353 4357 4361 4365 4369 4373 4377 4381 4385 4389 4393 4397 4401 4405 4409 4413 4417 4421 4425 4429 4433 4437 4441 4445 4449 4453 4457 4461 4465 4469 4473 4477 4481 4485 4489 4493 4497 4501 4505 4509 4513 4517 4521 4525 4529 4533 4537 4541 4545 4549 4553 4557 4561 4565 4569 4573 4577 4581 4585 4589 4593 4597 4601 4605 4609 4613 4617 4621 4625 4629 4633 4637 4641 4645 4649 4653 4657 4661 4665 4669 4673 4677 4681 4685 4689 4693 4697 4701 4705 4709 4713 4717 4721 4725 4729 4733 4737 4741 4745 4749 4753 4757 4761 4765 4769 4773 4777 4781 4785 4789 4793 4797 4801 4805 4809 4813 4817 4821 4825 4829 4833 4837 4841 4845 4849 4853 4857 4861 4865 4869 4873 4877 4881 4885 4889 4893 4897 4901 4905 4909 4913 4917 4921 4925 4929 4933 4937 4941 4945 4949 4953 4957 4961 4965 4969 4973 4977 4981 4985 4989 4993 4997 5001 5005 5009 5013 5017 5021 5025 5029 5033 5037 5041 5045 5049 5053 5057 5061 5065 5069 5073 5077 5081 5085 5089 5093 5097 5101 5105 5109 5113 5117 5121 5125 5129 5133 5137 5141 5145 5149 5153 5157 5161 5165 5169 5173 5177 5181 5185 5189 5193 5197 5201 5205 5209 5213 5217 5221 5225 5229 5233 5237 5241 5245 5249 5253 5257 5261 5265 5269 5273 5277 5281 5285 5289 5293 5297 5301 5305 5309 5313 5317 5321 5325 5329 5333 5337 5341 5345 5349 5353 5357 5361 5365 5369 5373 5377 5381 5385 5389 5393 5397 5401 5405 5409 5413 5417 5421 5425 5429 5433 5437 5441 5445 5449 5453 5457 5461 5465 5469 5473 5477 5481 5485 5489 5493 5497 5501 5505 5509 5513 5517 5521 5525 5529 5533 5537 5541 5545 5549 5553 5557 5561 5565 5569 5573 5577 5581 5585 5589 5593 5597 5601 5605 5609 5613 5617 5621 5625 5629 5633 5637 5641 5645 5649 5653 5657 5661 5665 5669 5673 5677 5681 5685 5689 5693 5697 5701 5705 5709 5713 5717 5721 5725 5729 5733 5737 5741 5745 5749 5753 5757 5761 5765 5769 5773 5776 5780 5784 5788 5792 5796 5800 5804 5808 5812 5816 5820 5823 5827 5831 5835 5839 5843 5847 5851 5855 5859 5863 5867 5871 5875 5879 5883 5887 5891 5895 5899 5903 5907 5911 5915 5919 5923 5927 5931 5935 5939 5943 5947 5951 5955 5959 5963 5967 5971 5975 5979 5983 5987 5991 5995 5999 6003 6007 6011 6015 6019 6023 6027 6031 6035 6039 6043 6047 6051 6055 6059 6063 6067 6071 6075 6079 6083 6087 6091 6095 6099 6103 6107 6111 6115 6119 6123 6127 6131 6135 6139 6143 6147 6151 6155 6159 6163 6167 6171 6175 6179 6183 6187 6191 6195 6199 6203 6207 6211 6215 6219 6223 6227 6231 6235 6239 6243 6247 6251 6255 6259 6263 6267 6271 6275 6279 6283 6287 6291 6295 6299 6303 6307 6311 6315 6319 6323 6327 6331 6335 6339 6343 6347 6351 6355 6359 6363 6367 6371 6375 6379 6383 6387 6391 6395 6399 6403 6407 6411 6415 6419 6423 6427 6431 6435 6439 6443 6447 6451 6455 6459 6463 6467 6471 6475 6479 6483 6487 6491 6495 6499 6503 6507 6511 6515 6519 6523 6527 6531 6535 6538 6542 6546 6550 6554 6558 6562 6566 6570 6574 6578 6582 6586 6588 6592 6596 6600 6604 6608 6612 6616 6620 6624 6628 6632 6636 6640 6644 6648 6652 6656 6660 6664 6668 6672 6676 6680 6684 6688 6692 6696 6700 6704 6708 6712 6716 6720 6724 6728 6732 6736 6740 6744 6748 6752 6756 6760 6764 6768 6772 6776 6780 6784 6788 6792 6796 6800 6804 6808 6812 6816 6820 6824 6828 6832 6834 6838 6842 6846 6850 6854 6858 6862 6866 6870 6874 6878 6882 6886 6890 6894 6898 6902 6906 6910 6914 6918 6922 6926 6929 6933 6937 6941 6945 6949 6953 6957 6961 6965 6969 6973 6977 6981 6985 6988 6992 6996 7000 7004 7008 7012 7016 7020 7024 7028 7032 7036 7040 7044 7048 7052 7056 7060 7064 7068 7072 7076 7080 7084 7088 7092 7096 7098 7100 7104 7108 7112 7116 7120 7124 7128 7132 7136 7140 7144 7148 7152 7156 7160 7164 7168 7172 7176 7180 7184 7188 7192 7196 7200 7204 7208 7212 7216 7220 7224 7228 7232 7236 7240 7244 7248 7252 7256 7260 7264 7268 7272 7276 7279 7283 7287 7291 7295 7299 7303 7307 7311 7315 7319 7323 7327 7331 7335 7339 7343 7347 7351 7355 7359 7363 7367 7371 7375 7379 7383 7387 7391 7395 7399 7403 7407 7411 7415 7419 7423 7427 7431 7435 7439 7443 7447 7451 7455 7459 7463 7467 7471 7475 7479 7483 7487 7491 7495 7499 7503 7507 7511 7515 7519 7523 7527 7531 7535 7539 7543 7547 7551 7555 7559 7563 7567 7571 7575 7579 7583 7587 7591 7595 7599 7603 7607 7611 7615 7619 7623 7627 7630 7634 7638 7642 7646 7650 7654 7658 7662 7666 7670 7674 7678 7682 7686 7690 7694 7698 7702 7703 7707 7711 7715 7719 7723 7727 7731 7735 7739 7743 7747 7751 7755 7759 7763 7767 7771 7775 7779 7783 7787 7791 7795 7798 7802 7806 7810 7814 7818 7822 7826 7830 7834 7838 7842 7846 7850 7854 7858 7862 7866 7870 7874 7878 7882 7886 7890 7894 7898 7902 7906 7910 7914 7918 7922 7926 7930 7934 7937 7941 7945 7949 7953 7957 7961 7965 7969 7973 7977 7981 7985 7989 7993 7997 8001 8005 8009 8013 8017 8021 8025 8029 8033 8037 8041 8045 8049 8053 8057 8061 8065 8069 8073 8077 8079 8082 8085 8088 8091 8095 8099 8102 8106 8110 8114 8118 8122 8126 8130 8134 8138 8142 8146 8150 8154 8158 8162 8166 8170 8172 8175 8179 8181 8183 8187 8191 8194 8198 8202 8206 8210 8214 8218 8222 8226 8230 8234 8238 8242 8246 8250 8252 8255 8258 8261 8264 8267 8270 8273 8276 8279 8282 8285 8288 8291 8294 8297 8300 8303 8306 8309 8312 8315 8318 8321 8324 8327 8330 8333 8336 8339 8342 8345 8348 8351 8354 8357 8360 8363 8366 8369 8372 8375 8378 8381 8384 8387 8390 8393 8396 8399 8402 8405 8408 8411 8414 8417 8420 8423 8426 8429 8432 8435 8438 8441 8444 8447 8450 8453 8456 8459 8462 8465 8468 8471 8474 8477 8480 8483 8486 8489 8492 8495 8498 8501 8504 8507 8510 8513 8516 8519 8522 8525 8528 8531 8534 8537 8540 8543 8546 8549 8552 8555 8558 8561 8564 8567 8570 8573 8576 8579 8582 8585 8588 8591 8594 8597 8600 8603 8606 8609 8612 8615 8618 8621 8624 8627 8630 8633 8636 8639 8642 8645 8648 8651 8654 8657 8660 8663 8666 8669 8672 8675 8678 8681 8684 8687 8690 8693 8696 8699 8702 8705 8708 8711 8714 8717 8720 8723 8726 8729 8732 8735 8738 8741 8744 8747 8750 8753 8756 8759 8762 8765 8768 8771 8774 8777 8780 8783 8786 8789 8792 8795 8798 8801 8804 8807 8810 8813 8816 8819 8822 8825 8828 8831 8834 8837 8840 8843 8846 8849 8852 8855 8858 8861 8864 8867 8870 8873 8876 8879 8882 8885 8888 8891 8894 8897 8900 8903 8906 8909 8912 8915 8918 8921 8924 8927 8930 8933 8936 8939 8942 8945 8948 8951 8954 8957 8960 8963 8966 8969 8972 8975 8978 8981 8984 8987 8990 8993 8996 8999 9002 9005 9008 9011 9014 9017 9020 9023 9026 9029 9032 9035 9038 9041 9044 9047 9050 9053 9056 9059 9062 9065 9068 9071 9074 9077 9080 9083 9086 9089 9092 9095 9098 9101 9104 9107 9110 9113 9116 9119 9122 9125 9128 9131 9134 9137 9140 9143 9146 9149 9152 9155 9158 9161 9164 9167 9170 9173 9176 9179 9182 9185 9188 9191 9194 9197 9200 9203 9206 9209 9212 9215 9218 9221 9224 9227 9230 9233 9236 9239 9242 9245 9248 9251 9254 9257 9260 9263 9266 9269 9272 9275 9278 9281 9284 9287 9290 9293 9296 9299 9302 9305 9308 9311 9314 9317 9320 9323 9326 9329 9332 9335 9338 9341 9344 9347 9350 9353 9356 9359 9362 9365 9368 9371 9374 9377 9380 9383 9386 9389 9392 9395 9398 9401 9404 9407 9410 9413 9416 9419 9422 9425 9428 9431 9434 9437 9440 9443 9446 9449 9452 9455 9458 9461 9464 9467 9470 9473 9476 9479 9482 9485 9488 9491 9494 9497 9500 9503 9506 9509 9512 9515 9518 9521 9524 9527 9530 9533 9536 9539 9542 9545 9548 9551 9554 9557 9560 9563 9566 9569 9572 9575 9578 9581 9584 9587 9590 9593 9596 9599 9602 9605 9608 9611 9614 9617 9620 9623 9626 9629 9632 9635 9638 9641 9644 9647 9650 9653 9656 9659 9662 9665 9668 9671 9674 9677 9680 9683 9686 9689 9692 9695 9698 9701 9704 9707 9710 9713 9716 9719 9722 9725 9728 9731 9734 9737 9740 9743 9746 9749 9752 9755 9758 9761 9764 9767 9770 9773 9776 9779 9782 9785 9788 9791 9794 9797 9800 9803 9806 9809 9812 9815 9818</loop_first_edges>\n\t\t\t<edge_points>0 1578 1253 467 1578 0 883 1 1650 221 190 190 1903 885 1 1961 2336 1650 1 1935 1961 1 885 355 1147 2 354 1147 1623 24 2 1201 2263 354 2 407 1201 2 24 157 2126 1705 3 3 1705 1668 715 3 2487 1868 157 1193 2487 3 715 4 1565 911 1408 1408 2174 1928 4 764 1565 4 622 4 1928 139 622 5 855 629 652 652 1217 5 439 1954 1534 6 1458 1976 6 1534 6 2245 1321 439 411 2245 6 1976 970 2493 273 7 7 2338 458 78 1914 2338 7 273 1476 2293 2200 8 8 2200 621 1993 1112 2447 1476 8 8 1993 404 1112 679 2468 2320 9 9 2320 966 265 444 679 9 597 265 750 597 9 10 2228 433 1473 2058 2228 10 714 943 1877 11 400 11 1877 1134 481 371 546 400 11 11 481 52 371 12 1671 212 156 473 2370 12 156 12 2279 2100 1671 12 2370 466 2279 1468 2067 260 13 1097 1468 13 952 1469 2074 1541 14 1644 1733 15 1645 628 2470 15 1733 15 1813 1349 1645 15 2470 132 1813 16 1285 1089 1255 1255 2311 2172 16 16 1690 21 1285 16 2172 644 1690 17 2060 784 1443 510 2124 17 1443 1673 2060 17 1274 17 2124 1190 1274 870 2295 18 1544 18 2295 2287 297 18 2117 1404 1544 1199 2117 18 297 19 1696 519 876 876 1978 282 19 1330 1696 19 1430 704 1430 19 282 1852 1937 696 20 604 1290 20 696 105 1852 20 1071 1290 1388 1071 20 1277 2456 1285 21 768 1625 1277 21 21 1690 1500 768 1490 2166 22 897 22 2166 310 990 22 1949 747 897 1873 1949 22 990 1228 2331 1166 23 1166 1384 1248 23 895 1688 1228 23 23 1248 1247 895 1206 2024 24 1623 24 2024 1143 407 963 1378 25 49 1378 2268 1006 25 2173 2179 49 25 249 2173 25 1006 975 1747 429 26 447 1460 26 429 803 2504 975 26 26 1460 1213 803 1093 2135 27 2015 27 2135 124 1829 1985 2268 2015 27 352 1985 27 1829 28 1004 772 772 1974 356 28 29 2382 1433 2080 29 2080 1175 2078 1205 2472 2382 29 2078 2492 1205 29 1495 1973 1148 31 1148 2417 98 31 1261 1495 31 1385 565 1385 31 98 1109 1242 937 32 937 1168 692 32 732 1109 32 91 32 692 395 91 1379 1539 752 33 1942 2289 33 752 33 2134 826 1379 33 2289 963 2134 1481 2485 34 1519 34 2485 1602 1765 879 1519 34 35 2386 225 2140 36 1890 1140 579 579 1906 1405 36 36 1998 753 1890 1405 2377 1998 36 37 1927 610 1654 1930 2357 37 1654 552 1997 1927 37 37 2357 1778 552 1485 2070 2050 38 38 2050 1775 93 1211 1732 1485 38 93 1991 1211 38 1349 1813 39 1348 39 1813 132 957 39 2411 1706 1348 402 2411 39 957 493 1915 238 40 238 2236 588 40 1077 1699 493 40 588 1371 1077 40 1197 1502 1246 41 1246 2285 1158 41 41 2498 595 1197 948 2498 41 1158 42 1380 362 883 377 2448 2145 43 43 2145 1007 419 484 2032 377 43 419 1310 484 43 867 2130 478 44 1676 1785 44 478 345 1276 867 44 44 1785 825 345 70 1342 45 504 1342 1386 488 45 45 1184 104 504 488 2348 1184 45 1324 2373 1323 46 505 2465 46 1323 796 1424 1324 46 46 2465 189 796 182 1062 47 997 520 2116 47 1062 47 1451 758 997 47 2116 1532 1451 1465 2339 48 616 48 2339 1223 599 267 1308 616 48 599 1929 267 48 1837 2134 963 49 49 2179 2057 1837 50 1490 897 151 413 1438 50 151 1042 1708 1490 50 50 1438 82 1042 1661 2266 1909 51 51 2435 2098 573 254 2435 51 1909 481 1421 498 52 342 371 52 339 498 2394 339 52 53 241 867 1276 1005 54 1461 2316 54 1005 141 2130 867 54 54 2316 380 141 1390 2013 1381 55 55 2408 1264 1287 2271 2408 55 1381 56 2419 2326 746 56 746 216 515 2213 2419 56 2414 188 2414 56 515 816 1165 276 57 276 1272 1185 57 1451 1532 816 57 758 1451 57 1185 136 2010 1187 58 1187 1771 1467 58 58 1958 1893 136 1179 1958 58 1467 477 1959 59 1227 1959 2229 2199 59 1391 1392 1227 59 59 2199 1524 1391 967 2043 60 1662 60 2043 1393 496 680 1662 60 1160 496 2293 1160 60 1224 1440 1397 61 2028 2383 61 1397 627 1224 61 213 61 2383 1489 213 834 2232 62 804 62 2232 1552 1133 1953 2138 804 62 499 1953 62 1133 614 1894 163 63 193 247 63 163 63 1623 1147 614 1206 1623 63 247 850 851 801 64 1734 1812 64 801 1243 1975 850 64 64 1812 1551 1243 65 2349 2040 659 659 2226 122 65 947 2349 65 1709 1181 1709 65 122 1328 2342 1687 66 66 2217 304 1328 379 1345 67 1068 1345 1439 1159 67 782 2398 1068 67 1159 1415 782 67 1535 2215 68 1452 2205 2375 68 2215 68 2416 2090 1452 2375 2466 2416 68 742 2335 69 1585 69 2335 236 865 69 2215 1535 1585 2205 2215 69 865 2005 2405 70 2011 70 2405 217 1342 1710 2011 70 504 1262 2239 218 72 218 1703 442 72 1041 1874 1262 72 811 1041 72 442 73 1830 1347 1828 231 576 250 74 852 1566 74 250 74 1294 1036 231 1566 1764 1294 74 75 1168 244 965 965 1278 1079 75 75 1924 692 1168 1923 1924 75 1079 257 965 244 76 244 1571 229 76 797 1515 257 76 229 2218 797 76 77 1923 1079 469 469 2085 392 77 1815 2146 1923 77 525 1815 77 392 150 502 78 458 1407 1580 1321 79 1321 2245 618 79 79 1433 1264 1407 618 2080 1433 79 117 930 80 258 1572 2497 80 930 80 2122 88 258 80 2497 541 2122 1184 2348 81 1883 81 2348 1369 489 1704 1883 81 237 489 686 237 81 1875 2069 82 1601 82 2069 1322 1042 1438 2127 1601 82 83 2302 1001 222 1351 1457 1414 83 222 1669 1351 83 84 2346 2174 1408 84 1408 911 253 977 2346 84 1680 253 2171 1680 84 85 765 732 91 395 610 85 91 682 765 85 590 610 1927 590 85 1266 1940 86 1139 86 1940 1508 609 217 1139 86 1067 575 1067 86 609 134 2285 87 1651 87 2285 1246 1101 1296 1889 1651 87 1101 1560 1296 87 88 1486 667 258 88 2490 2323 1486 770 2490 88 2122 337 1336 89 649 614 1147 355 90 90 1964 1894 614 1185 1233 92 758 1233 2419 2213 92 92 1584 997 758 92 2213 1058 1584 93 1775 1199 297 297 2287 1991 93 94 1879 1198 1425 1425 1590 995 94 166 1327 95 133 128 307 133 95 1047 1554 675 96 675 971 827 96 440 2216 96 827 1258 1376 97 1304 98 1240 861 565 98 2417 1189 1240 1622 1702 1624 99 1624 2363 2175 99 1728 1962 905 100 1644 1645 100 905 160 2360 1728 100 100 1645 1349 160 221 1650 761 101 1990 2066 101 761 101 1359 437 221 101 2066 1396 1359 702 2039 698 102 611 1432 1129 102 698 1897 611 102 459 819 103 762 2262 2476 103 819 103 1503 1045 762 103 2476 284 1503 992 1710 504 104 391 1832 992 104 1184 1883 391 104 105 1071 242 359 359 2375 2205 105 105 2205 865 1852 106 1929 599 177 177 1938 1102 106 647 1929 106 1748 1102 1969 1748 106 1770 2506 107 973 707 1380 107 178 107 2506 1472 178 1195 1814 545 108 1151 1234 108 545 2104 2403 1195 108 2046 2104 108 1234 676 1011 544 109 1870 1887 109 544 109 1669 512 676 109 1887 1351 1669 1657 2288 536 110 536 2221 1099 110 689 1657 110 382 110 1099 685 382 410 2243 409 111 1254 2042 111 409 276 1165 410 111 111 2042 1272 276 129 1037 112 281 1037 1970 861 112 112 1724 711 281 1240 1724 112 861 1775 2050 113 444 2050 2070 1576 113 113 1619 679 444 169 1619 113 1576 128 2496 114 307 114 2496 1053 194 558 1753 307 114 194 1642 558 114 357 1271 632 115 632 1406 142 115 115 1977 358 357 138 1977 115 142 486 2499 567 116 1581 2365 116 567 116 1422 451 486 116 2365 422 1422 667 1692 117 258 117 2228 2058 930 433 2228 117 1692 118 2178 2019 1222 2103 2438 118 1222 653 2178 118 678 118 2438 837 678 119 2464 2363 2312 120 1682 415 505 1323 2461 120 505 1329 1682 120 1283 120 2461 501 1283 451 813 121 486 121 813 167 737 859 2499 486 121 737 2222 859 121 336 669 285 123 949 1141 123 285 709 788 336 123 1141 1697 709 123 570 2234 124 2135 124 2234 672 417 640 1829 124 417 1265 1679 547 125 1055 2372 125 547 948 1730 1265 125 2372 2498 948 125 1204 2023 1880 126 126 1880 1656 480 1470 1941 1204 126 1465 1470 126 480 507 2331 1658 127 1955 2415 127 1658 1194 2307 507 127 127 2415 234 1194 281 2296 1531 129 803 1213 1037 129 1531 2504 803 129 1370 1863 272 130 1251 2404 130 272 437 1370 130 592 130 2404 693 592 131 2125 945 776 315 2084 131 776 1128 2125 131 591 131 2084 2030 591 132 2470 1056 2393 132 2393 960 957 1044 1831 166 133 307 1753 1044 133 835 1464 531 134 1158 2285 134 531 1651 2068 835 134 135 2276 1679 2129 2129 2131 397 135 2130 2276 135 478 397 1676 478 135 774 2163 136 1893 136 2163 466 2010 694 2314 779 137 690 1686 137 779 792 1059 694 137 137 1686 537 792 138 2202 681 1977 2020 2202 138 995 832 1051 139 1038 1051 1821 622 139 139 1928 540 1038 904 2351 1132 140 1132 2012 401 140 685 904 140 382 401 689 382 140 587 2276 2130 141 380 1573 587 141 215 2009 142 1406 1566 2307 143 1764 143 2307 1194 1219 1353 2380 1764 143 888 1353 143 1219 835 2068 144 964 1670 2047 144 144 2068 912 1670 420 1933 145 890 145 1747 1527 1052 145 1933 429 1747 539 2055 259 146 1156 1586 146 259 146 2454 721 539 1069 2454 146 1586 1754 2345 147 854 530 2133 147 175 2345 2395 175 147 700 2112 574 148 574 1916 457 148 1969 2177 700 148 1748 1969 148 457 305 1739 149 351 149 1739 1513 638 1700 1896 351 149 638 1892 1700 149 936 2251 502 150 150 1009 1008 936 458 1910 1009 150 343 2358 413 151 151 897 747 343 600 2002 1090 152 159 716 600 152 153 2415 1955 1926 1926 2460 783 153 234 2415 153 875 230 875 153 783 1546 2286 1417 154 509 1590 154 1417 277 1546 154 884 154 1590 1425 884 155 1854 707 178 178 1472 759 155 1322 1854 155 456 759 1280 456 155 607 1718 156 212 1718 2379 473 156 157 1868 1196 366 1471 2126 157 366 159 2368 191 716 2144 2360 160 2352 1348 2352 160 1349 161 1945 1911 179 179 533 288 161 180 1945 161 1154 1010 1154 161 288 1636 2252 162 795 432 1208 795 162 162 2230 1492 432 163 1894 662 1249 163 1249 1046 193 164 820 534 520 1062 1684 164 520 164 2085 469 820 991 2085 164 1684 517 1944 860 165 860 1646 665 165 165 2072 1886 517 189 2072 165 665 166 1976 1458 1327 411 1976 166 1831 813 2367 1689 167 167 1689 283 224 224 2227 737 167 168 1646 605 1268 448 1820 168 1268 665 1646 168 1286 168 1820 263 1286 169 1468 1097 1096 836 1619 169 1096 1576 2067 1468 169 170 2283 356 2165 170 2165 2149 1551 931 2283 170 1577 1551 1812 1577 170 974 1525 171 295 171 1525 1523 1028 1028 2332 1774 171 545 1814 172 636 1814 2438 2103 172 172 2308 311 636 2237 2308 172 2103 704 721 173 291 721 2454 1872 173 1504 1587 291 173 173 1872 853 1504 1659 2219 753 174 753 1998 1256 174 1210 1659 174 223 174 1256 710 223 1706 2411 175 2395 175 2411 402 530 666 1853 790 176 1250 1631 176 790 176 986 487 666 176 1631 726 986 599 1223 896 177 214 1938 177 896 179 1231 958 533 179 1911 571 1231 709 1697 180 1154 1634 2195 180 1697 180 2195 2051 1945 187 2220 1368 181 511 1746 181 1368 1746 2248 743 181 399 2277 1908 182 182 1908 1684 1062 997 1584 399 182 183 1003 617 310 310 2166 256 183 183 1455 684 1003 1280 1455 183 256 1187 2010 184 449 184 1130 449 1472 2506 185 1766 185 2506 1770 889 728 1413 482 186 1429 2333 186 482 939 1169 728 186 186 2333 541 939 992 2220 187 1710 1291 2011 1710 187 188 2477 1978 876 519 2414 188 876 214 2477 188 515 665 1286 796 189 189 2465 226 2072 437 592 190 221 693 1903 190 592 1398 1905 716 191 191 2272 672 1398 191 2368 1570 2272 1788 2337 192 2137 2337 2458 833 192 390 976 192 833 623 1731 193 1046 193 1731 1499 247 785 1642 194 1048 1053 2086 1048 194 308 2388 2225 195 195 2225 1072 1836 195 982 794 308 195 1836 1776 982 196 1698 1505 1694 196 1694 711 703 383 2054 1698 196 196 703 462 383 1239 1989 197 958 1989 2248 1746 197 197 2315 533 958 511 2315 197 1746 729 1639 607 212 212 1671 684 729 213 1273 438 627 213 1489 893 1273 660 2477 214 896 216 1938 214 515 1011 2142 215 544 1406 1870 544 215 746 2083 485 216 1102 1938 216 485 1067 1386 1342 217 217 2405 1725 1139 218 2239 1230 781 1085 1703 218 781 2427 2463 1786 219 1786 1994 946 219 1269 2427 219 416 946 1423 416 219 220 1453 1107 661 1361 2183 220 661 512 1669 222 364 222 1001 708 364 812 1210 223 630 710 2212 630 223 283 1290 604 224 775 2227 224 604 225 2386 789 578 578 2045 646 225 1891 2140 225 646 226 2465 505 415 415 2195 1634 226 1886 2072 226 1634 483 2486 227 1024 227 2486 569 2471 633 2429 1311 228 228 1318 634 633 1571 1635 1310 229 419 2218 229 1310 734 1925 230 648 230 1925 1648 875 230 783 287 648 1036 1550 1389 231 231 1389 500 576 232 2504 1531 270 1131 2446 232 270 975 2504 232 1022 232 2446 2334 1022 2092 2479 233 2389 233 2479 1750 2191 1259 2389 233 2115 233 2191 1146 2115 556 1219 1194 234 875 1648 556 234 1980 2413 2340 235 566 2381 235 2340 235 2381 1860 760 236 1937 1852 865 2374 2410 1937 236 340 2374 236 2335 686 809 301 237 347 1704 237 301 953 1781 239 1496 239 1781 1061 1538 1108 2474 1496 239 239 1538 508 1108 528 2313 240 1717 240 2313 1934 255 1043 1717 240 1267 581 1267 240 255 1495 2473 242 1973 242 2473 615 359 1388 1973 242 1071 527 941 424 243 978 1738 243 424 271 1025 527 243 243 1738 455 271 937 1571 244 1168 245 2284 1250 790 790 1853 1448 245 245 2453 773 2284 594 2453 245 1448 246 2243 410 612 612 871 284 246 349 2253 2243 246 284 2476 349 246 247 1499 677 1206 572 2093 248 1537 248 2093 1917 968 2143 2256 1537 248 344 2143 248 968 249 2252 1636 2173 1006 1986 1291 249 250 1384 1166 852 577 1384 250 576 831 2356 251 805 251 2356 551 1912 487 986 805 251 251 1912 1060 487 252 2505 2028 2478 253 2376 2373 2171 780 2376 253 911 255 1934 1683 298 298 1866 581 255 256 1708 456 1280 256 2166 1490 1708 1515 1693 1292 257 257 1292 1278 965 259 2055 660 983 983 2224 1156 259 1236 1293 463 260 260 2067 1483 1236 261 1919 495 1307 1307 2450 1427 261 1501 1920 1919 261 1106 1501 261 1427 1044 1753 262 823 262 1753 558 784 1339 2270 823 262 784 2060 1339 262 263 1820 363 934 263 1424 796 1286 934 1442 1424 263 559 2031 1685 264 264 1685 583 1241 1241 1974 772 264 1099 2221 265 966 265 2221 593 750 969 2192 1740 266 266 1740 1165 816 266 2354 1300 969 1532 2354 266 816 267 1929 647 1252 1252 1375 1308 267 268 1692 667 613 1295 1664 268 613 268 2282 433 1692 1749 2282 268 1664 564 962 749 269 749 2402 580 269 269 1032 657 564 398 1032 269 580 858 1131 270 555 1531 2296 555 270 887 1638 1025 271 455 1822 887 271 1863 2445 1712 272 272 1712 764 1251 369 1914 273 1164 273 2493 1180 1164 290 1862 1056 274 1056 2470 628 274 1260 1663 290 274 628 2073 1260 274 275 741 490 634 1318 1341 275 634 277 2136 1716 1546 941 2136 277 424 884 978 424 277 278 2483 560 2162 278 2162 1373 1183 1835 2502 2483 278 1279 1835 278 1183 971 1625 279 827 279 1625 768 477 440 827 279 757 477 1227 757 279 1065 1856 280 535 1694 2296 281 711 1978 2055 539 282 539 721 704 282 1689 2231 2182 283 283 2182 1388 1290 871 1647 1503 284 389 2443 949 285 602 1034 368 286 1053 2496 602 286 1719 2086 1053 286 500 1389 648 287 287 1632 1332 500 783 2460 1632 287 533 2315 1214 288 1214 2420 1010 288 1367 2053 1858 289 422 2365 289 1858 289 2355 766 1367 289 2365 1581 2355 290 1663 562 945 945 2125 1862 290 291 1444 1430 704 291 1587 774 1444 1688 2455 1002 292 1002 1659 1210 292 1228 1688 292 1337 812 1337 292 1210 2483 2502 293 1898 293 2502 1722 1876 294 1901 1436 873 873 2053 1367 294 294 2402 749 1901 766 2402 294 1367 295 2102 1530 974 2038 2102 295 626 791 1445 296 697 296 1445 1193 715 2057 2179 697 296 1668 2057 296 715 944 1866 298 1769 1559 1769 298 1683 1713 2266 1661 299 300 2026 976 390 806 2434 300 390 951 2026 300 798 300 2434 1054 798 305 1083 301 809 301 1083 1008 347 302 2359 1362 1522 1412 2359 302 1556 492 1145 303 491 303 1145 333 334 304 2217 491 303 334 335 304 303 335 1637 1328 304 755 1083 305 351 809 2319 1739 305 306 1742 542 1095 1095 1912 551 306 2494 2500 1742 306 637 2494 306 551 1475 2437 308 794 308 2437 658 2388 309 2310 2164 1142 309 1142 1076 954 350 2310 309 1510 954 1716 1510 309 853 990 310 617 526 2424 311 2308 311 2424 1439 1482 311 1482 777 636 312 2484 2240 2137 313 2292 479 1050 1456 2317 2292 313 314 1816 1587 1504 314 1504 853 617 2100 2279 1816 314 1003 2100 314 617 776 1429 482 315 1413 1962 315 482 1728 2084 315 1962 330 2391 2002 1488 1655 2391 330 1895 516 1895 330 1817 793 1667 1484 332 1360 1727 332 1484 2098 2435 332 1727 1144 1320 333 1145 706 2261 336 788 336 2261 1410 669 552 1778 337 649 1778 1904 734 337 856 1947 1819 338 338 1819 385 1403 339 2394 882 1431 339 1431 1169 342 340 2335 742 754 2017 2374 340 1751 1354 1751 340 754 1135 2432 1507 341 341 1507 1350 1176 341 2150 1931 1135 474 2150 341 1176 342 1497 546 371 939 1497 342 1169 1526 2358 343 2186 2008 2186 343 747 1178 2047 1670 344 912 2143 344 1670 996 1178 344 968 345 1989 1239 1276 825 2248 1989 345 1257 1721 475 346 475 1460 447 346 346 1579 584 1257 447 1783 1579 346 1170 2418 1704 347 1009 1170 347 1008 931 1577 348 643 1577 1812 1734 348 1030 1900 643 348 1734 2161 1030 348 349 2476 2262 2210 880 2253 349 2210 1510 2290 620 350 1284 1723 350 620 1723 2425 2310 350 351 1896 1772 755 1725 2405 2005 352 352 2005 1986 1985 352 1829 640 1725 808 2148 353 393 2148 2445 1863 353 353 1855 727 393 353 1863 1370 1855 1974 2433 2165 356 532 2482 1271 357 615 2466 2375 359 509 1417 360 563 361 1404 593 674 938 1436 361 674 557 1544 1404 361 1436 1901 557 361 362 1103 467 883 362 1629 650 1103 707 1629 362 1380 2096 2409 934 363 935 2250 2096 363 363 1820 448 935 493 1699 364 708 364 1699 1361 512 365 2341 1493 1029 2071 2321 365 1029 441 2341 365 2027 365 2321 1588 2027 1494 1741 1471 366 815 1494 366 1196 1358 1434 368 1034 1434 2033 1258 368 1164 2016 1410 369 877 2265 1914 369 1410 2261 877 369 1513 1921 370 638 1489 2383 370 1921 370 2505 1892 638 2028 2505 370 2383 377 2032 1575 428 470 2448 377 428 378 1823 895 1247 1150 1779 378 1247 406 1823 378 1081 378 1779 786 1081 1068 2480 1060 379 542 1345 379 1095 1060 1912 1095 379 380 2255 1884 1573 2316 2495 2255 380 1327 1458 381 431 1534 1553 381 1458 462 2204 1191 383 1582 2054 383 1191 1209 2045 578 384 789 2344 384 578 384 2150 474 1209 384 2344 1931 2150 385 2366 2176 1403 864 2366 385 739 960 2223 386 1382 386 2223 1000 1639 1979 2207 738 389 1357 2443 389 738 833 2328 806 390 391 2418 1558 1832 1704 2418 391 1883 1426 1864 525 392 392 2085 991 1426 1907 2181 808 393 727 2495 1907 393 394 2309 2160 1152 394 1818 1136 1672 1152 2175 1818 394 692 1924 1878 395 395 1878 1654 610 2113 2407 396 940 396 2407 1485 1732 1138 2350 940 396 396 1732 459 1138 397 2131 2041 506 506 1857 1676 397 580 1695 450 398 1057 2475 1032 398 450 1626 1057 398 1058 1737 399 1584 1707 2277 399 1737 546 1572 435 400 435 1825 943 400 401 2012 405 1943 401 1943 1882 689 960 1382 402 957 1382 2190 530 402 403 2025 1096 1097 624 1602 404 445 1602 2485 1112 404 404 1993 810 445 405 2012 1822 1372 1372 2446 1131 405 858 1943 405 1131 1072 2225 406 1081 2225 2388 1437 406 1437 2455 1823 406 1143 1946 441 407 441 2027 1201 407 408 1216 657 1254 409 979 2243 2253 979 409 1165 1740 612 410 618 2245 411 1105 1831 2390 1105 411 736 1871 1567 412 2176 2366 412 1567 412 1432 611 736 412 2366 864 1432 977 2127 1438 413 413 2358 2346 977 414 2469 538 822 1528 1627 414 822 1492 2469 414 432 414 1627 1208 432 2051 2195 415 1682 1648 1925 1269 416 556 1648 416 1423 672 2272 2119 417 417 2119 1266 640 689 1882 418 1657 1450 2440 418 1882 418 2431 2288 1657 418 2440 1401 2431 2037 2218 419 1007 420 1972 1783 1933 1591 1972 420 1215 890 1371 1215 420 1288 2249 1902 421 1902 2188 1063 421 673 2247 1288 421 421 1063 787 673 1191 2204 1422 422 422 1858 1582 1191 423 2127 977 1680 1680 2171 1207 423 1601 2127 423 561 1207 1442 561 423 1894 1964 425 662 425 1963 1352 662 1967 2121 426 1968 427 1965 426 1493 2341 470 428 1575 1711 1493 428 429 1933 1783 447 430 894 771 446 1411 1428 430 446 1366 1377 894 430 430 1428 1297 1366 433 2282 1238 1473 688 1409 434 563 1409 1913 1091 434 434 2020 509 563 1091 2202 2020 434 930 2058 435 1572 435 2058 714 1825 436 881 786 744 744 2377 1405 436 436 2004 461 881 1906 2004 436 1405 1359 1855 1370 437 1936 2101 438 1273 438 2101 811 442 442 1703 627 438 439 2467 1035 1954 1580 2467 439 1321 757 1229 532 440 470 2341 441 1946 947 1709 443 857 443 1709 1181 1182 443 1501 1106 857 1182 1920 1501 443 1199 1775 444 597 445 2452 1338 624 1466 2452 445 810 548 1939 446 771 1939 2400 1411 446 1685 2031 448 1268 448 2031 452 935 778 1771 1187 449 700 2177 1626 450 1695 2112 700 450 1422 2204 1394 451 1394 2367 813 451 1702 2422 452 1624 452 2422 2250 935 453 2249 1288 2089 494 2249 453 2118 1093 2406 454 2006 454 2406 1942 735 1172 2322 2006 454 735 1226 1172 454 1372 1822 455 603 1738 2489 603 455 456 1708 1042 1322 457 1782 647 1748 457 1916 1477 1782 458 2338 1232 1910 762 1755 1138 459 459 1732 1211 819 2108 2111 460 2110 1031 1591 1220 460 460 2111 1589 1031 461 1836 1072 881 1776 1836 461 645 461 2004 1400 645 703 1511 671 462 1394 2204 462 671 2056 2269 464 1275 464 2269 2026 951 656 2439 465 2184 465 2439 994 2189 1735 2184 465 1082 465 2189 1512 1082 1816 2279 466 2163 467 1702 1622 1578 1103 2422 1702 467 1435 2133 468 1784 530 2190 468 2133 1079 1278 820 469 2180 2448 470 1946 834 2139 471 950 1789 2242 471 2139 1279 1540 950 471 471 2242 1835 1279 1254 2475 472 2042 472 2475 1057 1298 1272 2042 472 998 1298 2326 998 472 2079 2370 473 733 473 2379 1984 733 474 1395 767 1209 1363 1395 474 1176 475 1721 585 625 1213 1460 475 625 476 1782 1477 1200 1200 1301 933 476 647 1782 476 1252 933 1375 1252 476 1500 1959 477 768 479 2292 553 1475 479 1475 794 497 497 1506 1050 479 1156 2224 480 1656 2224 2339 1465 480 1155 1421 481 1134 2462 2486 483 2304 2139 2304 483 1789 1402 1789 483 1024 1635 2503 484 1310 484 2503 2305 2032 1626 2177 485 2083 485 2177 1969 1102 1060 2480 666 487 1386 2412 699 488 1369 2348 488 699 1043 1441 686 489 1369 1717 1043 489 490 1094 633 634 492 1564 1144 1145 1902 2249 494 1070 1036 1294 1070 494 494 2118 1550 1036 495 2369 1652 1307 2200 2293 496 2201 891 2201 496 1393 497 2034 731 1506 982 2034 497 794 1421 1749 1664 498 1295 2394 498 1664 499 2491 2247 673 787 1953 499 673 722 2491 499 1133 500 1332 577 576 780 2457 2264 501 501 2264 723 1283 501 2461 2376 780 538 1857 506 1561 506 2041 1282 1561 507 2307 1566 852 1166 2331 507 852 1538 1897 698 508 713 1517 1108 508 698 2039 713 508 509 2020 995 1590 510 2196 1270 2124 566 2196 510 785 1443 1642 785 510 1214 2315 511 961 511 1368 1049 961 512 1361 661 676 513 2073 628 1733 1644 2185 513 1733 821 2073 513 1454 513 2185 1480 1454 514 1887 1870 641 550 2244 514 641 1351 1887 514 1457 514 2244 2056 1457 516 2322 1172 1895 1075 2322 516 1951 949 2443 1944 517 517 1886 1141 949 2213 2414 519 1058 1696 1737 1058 519 1918 2116 520 534 521 2185 1644 905 905 1962 1413 521 1480 2185 521 1084 521 1413 728 1084 522 1828 1440 1334 2396 2481 523 1281 523 2481 2035 2297 862 1960 1281 523 523 2297 548 862 524 1026 690 779 779 2314 1518 524 1186 1755 1026 524 524 1518 1364 1186 1786 2463 525 1864 525 2463 2095 1815 526 2308 2237 1780 769 2424 526 2291 1780 2318 2291 526 528 1717 1369 699 1484 2313 528 1360 699 2412 1360 528 529 2237 2103 1222 2019 2169 529 1222 1780 2237 529 1333 529 2169 1089 1333 1464 2049 1730 531 531 1730 948 1158 730 2482 532 1229 1693 1918 534 1292 1278 1292 534 820 535 2132 726 1065 959 2362 2132 535 536 2288 938 674 593 2221 536 674 537 2361 2209 2037 537 2037 1007 792 1641 2361 537 1686 538 2469 892 1857 538 1561 1086 822 1463 2023 1038 540 1526 2186 1463 540 1928 2174 1526 540 541 2497 1497 939 541 2333 770 2122 542 1482 1439 1345 542 1742 777 1482 543 2314 694 635 1143 2024 543 635 1518 2314 543 677 543 2024 1206 677 777 1151 545 636 1497 2497 1572 546 587 1573 1055 547 1679 2276 587 547 548 2297 1080 1939 771 1092 862 548 683 2244 550 1479 551 2356 1203 637 1726 1997 552 649 553 2426 1140 1677 1677 2437 1475 553 2317 2426 553 2292 1715 2168 568 554 1714 1715 554 1713 555 1505 1450 858 555 2296 1694 1505 556 1423 888 1219 557 1901 749 962 870 1544 557 962 558 1642 1443 784 1899 1900 1030 560 2161 2162 560 1030 560 2483 1898 1899 561 2409 1875 1601 934 2409 561 1442 1663 2490 770 562 770 2333 1429 562 562 1429 776 945 657 979 869 564 870 962 564 869 861 1970 1040 565 1040 1529 1385 565 566 2340 2077 2196 1048 2381 566 785 567 1916 574 1581 567 2499 1477 1916 569 1981 1885 1435 1784 2471 569 1435 569 2486 2462 1981 570 2135 1093 2006 1075 2235 2234 570 2006 2322 1075 570 571 1911 886 1865 980 1729 1231 571 1865 2181 980 571 626 1399 572 680 1305 2093 572 1399 1537 1662 680 572 1508 2436 1027 573 573 2098 609 1508 2112 2355 1581 574 1360 2412 575 1727 575 2412 1386 1067 609 2098 1727 575 577 1332 1212 981 1248 1384 577 981 1140 2426 999 579 1344 1906 579 999 580 2402 766 1695 619 1995 581 1866 581 1995 1867 1267 615 2473 582 1478 582 2473 1495 1261 1365 1881 1478 582 1261 2075 1365 582 583 1685 1268 605 605 1653 1343 583 1343 2281 1241 583 584 1579 763 1218 584 1218 664 767 767 1395 1257 584 585 1721 1363 1387 1040 1970 625 585 1387 1529 1040 585 1449 1859 586 1073 891 2029 586 1859 586 2479 2092 1073 1750 2479 586 2029 588 2236 802 639 1215 1371 588 639 1668 1705 589 651 1705 2126 1111 589 589 1777 826 651 1111 2267 1777 589 1927 1997 1735 590 590 1735 1082 682 2030 2353 1752 591 591 1752 1000 1128 1404 2117 750 593 1447 1555 594 1448 595 1346 1146 1197 1237 1346 595 596 595 2498 2372 596 596 2372 1055 1174 1174 1990 1237 596 750 2117 1199 597 1000 2223 598 1128 960 2393 598 2223 1862 2125 1128 598 598 2393 1056 1862 1488 2002 600 1487 716 1905 1487 600 1162 1163 601 1116 601 1163 1034 602 2334 2446 1372 603 603 2489 2082 2334 696 2260 775 604 860 1653 605 1646 2172 2311 1869 606 2099 2238 606 1869 606 2303 644 2172 866 2303 606 2238 1752 2353 1718 607 1000 1752 607 1639 608 2197 1352 1963 1390 2197 608 2013 611 1897 745 736 1740 2192 871 612 667 1486 1299 613 1299 2275 1295 613 2147 2466 615 1478 668 1470 1465 616 1308 2306 668 616 1175 2080 618 1105 619 1936 1273 893 1833 1995 619 893 944 1936 619 1866 810 1993 621 1066 1474 1593 1066 621 2200 2201 1474 621 622 1821 1251 764 712 1235 623 1046 1235 2449 1665 623 1520 1731 623 1665 1338 2337 1788 624 624 1788 1765 1602 625 1970 1037 1213 1160 2038 626 680 627 1703 1085 1224 735 2444 629 1226 629 2444 2211 652 855 1655 1226 629 2212 2460 1926 630 1926 1955 812 630 710 1256 807 631 807 2167 1383 631 1649 2212 710 631 1212 1649 631 1383 641 1870 1406 632 1309 2429 633 1094 635 2180 1946 1143 1059 2180 635 694 2364 2472 637 1203 1205 2494 637 2472 1220 1591 1215 639 1139 1725 640 1266 2361 2392 642 2209 642 2392 969 1300 797 2209 642 1515 1300 1693 1515 642 1500 1690 644 1533 644 2303 1763 1533 1078 1776 645 1543 1400 2246 1543 645 664 2343 646 2045 646 2343 1891 1629 2428 1574 650 2096 2250 650 1574 2250 2422 1103 650 1837 2057 1668 651 826 2134 1837 651 678 1274 1190 653 1153 1957 653 1190 1741 2178 653 1957 655 1506 731 654 656 2184 1726 1039 2193 2439 656 2194 1039 2194 656 1032 2475 1254 657 658 2437 1677 1787 1437 2388 658 1549 1787 2219 1549 658 659 2040 713 2039 702 2226 659 2039 896 1223 983 660 1978 2477 660 2055 661 1107 1011 676 662 1352 720 1249 1881 2432 1127 663 1127 1720 1302 663 663 2147 1478 1881 1691 2147 663 1302 664 2045 1209 767 1589 2343 664 1218 666 2480 1188 1853 1092 2441 668 2306 668 2441 1941 1470 1410 2016 1098 669 670 2044 1958 1179 1179 1660 1603 670 670 2277 1707 2044 1908 2277 670 1603 671 2371 2367 1394 1189 2371 671 1511 2234 2235 1398 672 675 1149 972 971 675 1554 849 1149 1364 1518 677 1499 837 1673 1274 678 836 2468 679 1619 1834 2284 773 681 681 2202 1091 1834 1082 1512 1230 682 1230 2239 765 682 2026 2269 683 976 683 2269 2056 2244 1671 2100 1003 684 1455 1640 729 684 685 1099 966 1023 1023 2425 904 685 1441 2319 809 686 863 1675 817 687 1208 1627 687 817 1305 1399 863 687 687 1627 1528 1305 1045 1110 690 1026 1641 1686 690 1110 691 2294 1306 1856 1065 2214 691 1856 1409 2294 691 1913 691 2214 1592 1913 693 2404 1297 1428 1411 1903 693 1428 1937 2410 2260 696 697 1636 795 791 697 2179 2173 1636 1264 2408 701 1407 701 2408 2271 1192 701 2141 1580 1407 1192 2399 2141 701 711 1724 1511 703 928 2362 959 705 959 1971 1491 705 1491 1562 928 705 1010 2420 706 788 2420 2421 2187 706 877 2261 706 2187 1854 2428 1629 707 709 1154 1010 788 1563 1971 712 720 1046 1249 720 712 713 2040 1975 1517 1950 2491 722 1681 1133 1552 1221 722 723 1516 1329 1283 723 2148 808 1516 2264 2445 2148 723 1631 2214 1065 726 726 2132 805 986 727 1855 1359 1396 2255 2495 727 1396 1169 1431 1084 728 1078 2123 731 2034 1262 1874 1109 732 765 2239 1262 732 1706 2395 733 1984 733 2395 2345 2079 1269 1925 734 1904 752 2444 735 1942 1542 1871 736 745 737 2227 1173 2222 738 2207 1061 1781 738 1781 953 1357 739 2384 2114 864 2188 2380 1353 740 2092 2389 754 742 1073 2092 742 1585 743 2248 825 2076 1492 2230 743 2076 807 2377 744 2167 1779 2167 744 786 745 1897 1538 1061 1061 2207 1542 745 746 2326 1298 2083 824 2008 747 1949 800 1373 748 1225 1373 2162 2161 748 851 1225 748 801 748 2161 1734 801 2211 2444 752 1539 753 2219 1787 1890 754 2389 1259 1354 1772 2251 936 755 1008 1083 755 936 1368 2220 756 1049 756 2220 992 1832 756 2059 956 1049 1558 2059 756 1832 1227 1392 1229 757 759 1640 1455 1280 1472 1766 1640 759 760 1860 1715 1714 1650 2336 2022 761 761 2022 1237 1990 1026 1755 762 1045 1783 1972 763 1579 1031 1589 1218 763 763 1972 1591 1031 1712 2457 1565 764 766 2355 2112 1695 1439 2424 769 1159 849 1415 1159 769 769 2291 1149 849 894 2441 1092 771 1816 2163 774 1587 1893 2233 1444 774 775 2260 1922 1633 1173 2227 775 1633 1742 2500 1151 777 946 1994 1771 778 888 1423 946 778 1565 2457 780 911 868 1334 1085 781 1230 1512 868 781 1362 2359 782 1415 1412 2398 782 2359 1072 1081 786 881 1063 2208 1861 787 1861 2138 1953 787 1054 2434 789 2386 789 2434 806 2344 795 1208 817 791 817 1675 1445 791 1007 2145 1059 792 793 2321 2071 1667 1588 2321 793 2278 797 2218 2037 2209 2176 2442 799 1403 800 1225 857 1106 800 2401 1183 1373 1427 2401 800 1106 2138 2462 2304 804 804 2304 2139 834 2132 2362 831 805 1931 2344 806 2328 1998 2377 807 1256 808 2181 1865 1516 1066 2090 1466 810 811 2101 1088 1548 1548 1996 1041 811 812 1955 1658 1337 1932 1983 814 1311 1983 2399 929 814 815 2169 2019 1494 1089 2169 815 1255 1196 2311 1255 815 818 2114 1992 1991 2262 819 1211 821 2323 1260 2073 1486 2323 821 1299 1454 2275 1299 821 1086 1917 1528 822 2091 2390 823 2270 823 2390 1831 1044 1069 1586 1459 824 1459 2081 2008 824 824 1949 1873 1069 892 2076 825 1785 826 1777 874 1379 830 2324 1203 2356 831 1356 831 2362 928 1356 1204 1941 1377 832 832 1377 1366 1051 1038 2023 1204 832 833 2458 1767 2328 950 2451 2232 834 964 2488 1464 835 1096 2025 1076 836 1142 2468 836 1076 837 2438 1814 1195 1195 2403 1673 837 849 1554 1362 1415 2040 2349 850 1975 850 2349 947 851 857 1225 851 947 1872 1873 990 853 2087 2391 1655 855 1512 2189 856 868 856 2189 994 1947 1882 1943 858 1450 1477 2499 859 1200 859 2222 1301 1200 860 1944 1033 1653 1092 2306 1960 862 863 2347 2018 1675 2238 2347 2198 866 866 2327 1763 2303 2097 2327 866 2198 979 2253 880 869 880 2295 870 869 871 2192 2007 1647 2288 2431 872 938 872 2431 1401 1743 873 1436 938 872 1743 2053 873 872 1777 2267 1171 874 874 1545 1539 1379 1171 2325 1545 874 1888 2265 877 2187 2287 2295 880 2210 882 2275 1454 1480 882 1480 1084 1431 882 2394 1295 2275 884 1425 1198 978 885 2400 1167 1935 1411 2400 885 1903 1516 1865 886 1329 886 2051 1682 1329 1945 2051 886 1911 1822 2012 1132 887 1132 2351 1638 887 2160 2309 1104 889 890 2183 1077 1371 1474 2201 891 1859 1630 2029 891 1393 1676 1857 892 1785 892 2469 1492 2076 1489 1921 1833 893 1941 2441 894 1377 1823 2455 1688 895 898 899 904 2425 1723 2351 1889 2256 2143 912 912 2068 1651 1889 913 2254 1910 1232 1232 2265 1888 913 1558 2254 913 2059 956 2059 913 1888 929 2399 1192 1744 1281 1960 1375 933 1301 2396 1281 933 1242 1635 1571 937 1665 2449 2113 940 940 2350 1520 1665 999 2426 2317 942 1303 1344 999 942 1374 2387 1877 943 1088 2101 1936 944 944 1769 1745 1088 2450 2451 950 1540 1948 2280 953 1496 953 2280 1033 1357 2025 2286 954 1076 954 2286 1546 1716 955 2493 970 2187 2421 956 1888 956 2421 961 1049 1231 1729 1239 958 961 2421 2420 1214 963 2289 1326 1378 966 2320 2164 1023 967 2256 1889 1296 1560 2043 967 1296 1537 2256 967 1662 968 1917 1086 996 969 2392 2007 2192 1277 1625 971 972 2291 2318 972 1149 2318 2456 1277 972 973 2170 1982 1527 1747 975 1022 1198 2489 1738 978 980 2181 1907 1461 1005 1729 980 1461 1247 1248 981 1150 1212 1383 1150 981 1078 2034 982 1776 1223 2339 2224 983 1819 1947 985 984 994 2203 985 1947 1833 1921 1513 987 1739 2319 987 1513 1867 1995 1833 987 987 2319 1441 1867 1684 1908 1603 991 1603 1660 1426 991 1293 2449 1235 993 994 2439 2193 2203 1086 1561 1282 996 996 1282 1177 1178 2326 2419 1233 998 1185 1272 998 1233 1002 2455 1437 1549 1549 2219 1659 1002 1239 1729 1005 1276 1006 2268 1985 1986 1910 2254 1170 1009 1020 2105 1021 2107 1022 2334 2082 1527 2310 2425 1023 2164 1024 1672 1136 1402 1524 2199 1028 1523 2229 2332 1028 2199 1683 2071 1029 1559 1493 1711 1559 1029 1033 2280 1343 1653 1944 2443 1357 1033 1678 2033 1434 1035 1358 1954 1035 1434 1035 2467 1263 1678 1041 1996 1666 1874 1267 1867 1441 1043 1503 1647 1110 1045 1362 1554 1047 1522 1860 2381 1048 2086 1297 1821 1051 1366 1527 2082 1879 1052 1573 1884 1174 1055 1626 2083 1298 1057 2145 2448 2180 1059 1064 2267 1111 1498 1498 1957 1153 1064 1171 2267 1064 2003 1270 2003 1064 1153 1452 2090 1066 1593 1188 2480 1068 2398 1872 2454 1069 1873 1070 2380 2188 1902 1764 2380 1070 1294 1073 1585 1535 1449 1074 2021 1961 1935 1074 1935 1167 1137 1354 2021 1074 1751 1137 2017 1751 1074 1952 2235 1075 1951 1077 2183 1361 1699 1080 2297 2035 1355 1080 1355 1137 1167 1167 2400 1939 1080 1334 1440 1224 1085 1282 2041 1087 1177 2041 2131 1736 1087 1736 2128 1087 1088 1745 1100 1548 1285 2456 1333 1089 2002 2391 2087 1090 1091 1913 1592 1834 1326 2406 1093 2015 1100 2305 1996 1548 2032 2305 1100 1575 1100 1745 1711 1575 1568 1630 1560 1101 1502 1568 1101 1246 1105 2390 2091 1175 2094 2474 1108 1517 1109 1874 1666 1242 1647 2007 1641 1110 1111 2126 1471 1498 1112 2485 1481 2447 1127 2432 1135 1767 1767 2458 1720 1127 1931 2328 1767 1135 1818 2464 1876 1136 1136 1876 1722 1402 1446 2017 1137 1355 1186 2350 1138 1755 1140 1890 1787 1677 1141 1886 1634 1697 2320 2468 1142 2164 1541 2074 1144 1564 1144 2074 1509 1320 1146 2191 1502 1197 1768 2115 1146 1346 2231 2417 1148 2182 1388 2182 1148 1973 1383 2167 1779 1150 1151 2500 2492 1234 1190 2124 1270 1153 1155 2274 1749 1421 1156 1656 1459 1586 1157 2501 1567 1871 1157 1871 1542 1583 2342 2501 1157 1687 1583 1701 1687 1157 1160 2293 1476 2038 2014 2016 1164 1180 1558 2418 1170 2254 2077 2325 1171 2003 1655 1895 1172 1226 1633 2481 2396 1173 1173 2396 1301 2222 1884 2066 1990 1174 1175 2091 2046 2078 1350 1387 1363 1176 1621 2047 1178 1177 1569 1660 1179 1467 1183 2401 1540 1279 1520 2350 1186 1364 1188 2398 1412 1447 1448 1853 1188 1447 1189 2417 2231 2371 1511 1724 1240 1189 1192 2271 1462 1744 1675 2018 1193 1445 2099 2487 1193 2018 1869 2311 1196 1868 2082 2489 1198 1879 1588 2263 1201 2027 1514 2364 1203 1356 2492 2500 2494 1205 2171 2373 1324 1207 1424 1442 1207 1324 1632 1649 1212 1332 1652 2369 1221 1552 1658 2331 1228 1337 1232 2338 1914 2265 1234 2492 2078 2046 1483 2407 2113 1236 2113 2449 1293 1236 1237 2022 1768 1346 1238 2387 1374 1473 1238 2282 1749 2274 2281 2433 1974 1241 1666 2503 1635 1242 1551 2149 2094 1243 1243 2094 1517 1975 1592 2214 1631 1250 1250 2284 1834 1592 1297 2404 1251 1821 1622 1982 1253 1578 1982 2170 1253 1363 1721 1257 1395 1258 2033 1418 1376 1416 2021 1354 1259 1259 2115 1768 1416 2323 2490 1663 1260 1529 2075 1261 1385 1263 1983 1932 1678 2141 2399 1983 1263 1263 2467 1580 2141 1433 2382 1287 1264 2049 2241 1265 1730 1265 2241 2129 1679 1266 2119 1536 1940 2378 2427 1269 1904 1270 2196 2077 2003 1457 2056 1275 1414 1638 2351 1723 1284 2382 2472 2364 1287 1289 2005 2011 1291 1986 1300 2354 1918 1693 1338 2452 1302 1720 1302 2452 1466 1691 1303 2246 1400 1344 1917 2093 1305 1528 1652 2451 2450 1307 1960 2306 1308 1375 1418 2429 1309 1376 1311 2429 1418 1932 2069 2428 1854 1322 2376 2461 1323 2373 1325 2474 2094 2149 2165 2433 1325 2149 1496 2474 1325 1948 1325 2433 2281 1948 2015 2268 1378 1326 1942 2406 1326 2289 1557 2342 1328 1637 1707 1737 1696 1330 1330 2233 2044 1707 1444 2233 1330 1430 1333 2456 2318 1780 2329 2330 1335 1720 2458 2337 1338 1673 2403 1339 2060 1339 2403 2104 2270 1948 2281 1343 2280 1400 2004 1906 1344 1469 2478 1347 1830 1440 1828 1347 1397 1347 2478 2028 1397 1984 2352 1348 1706 1350 2075 1529 1387 1365 2075 1350 1507 1355 2035 1922 1446 1534 1954 1358 1553 1499 1731 1520 1364 1507 2432 1881 1365 1393 2043 1560 1630 1884 2255 1396 2066 1398 2235 1952 1905 1401 2054 1582 1743 1401 2440 1698 2054 1722 2242 1789 1402 1412 1556 1555 1447 1416 2336 1961 2021 2022 2336 1416 1768 1418 2033 1678 1932 1569 1864 1426 1660 1427 2450 1540 2401 1446 2410 2374 2017 2260 2410 1446 1922 1452 1593 1449 1535 1474 1859 1449 1593 1698 2440 1450 1505 1880 2081 1459 1656 1907 2495 2316 1461 1462 2206 1744 1463 2081 1880 2023 1463 2186 2008 2081 1464 2488 2128 2049 2090 2416 1691 1466 1771 1994 1569 1467 1509 2074 1469 1830 1741 1957 1498 1471 1476 2447 2102 2038 2102 2447 1481 1530 1576 2070 1483 2067 1485 2407 1483 2070 1934 2313 1484 1667 1952 2000 1487 1905 1491 1971 1563 1562 2019 2178 1741 1494 1533 2229 1959 1500 1502 2191 1750 1568 1536 2436 1508 1940 2136 2290 1510 1716 2346 2358 1526 2174 1918 2354 1532 2116 1763 2332 2229 1533 2119 2272 1570 1536 2048 2211 1539 1545 1542 2207 1979 1583 2325 2413 2048 1545 2232 2451 1652 1552 2442 2501 2342 1557 1745 1769 1559 1711 1567 2501 2442 2176 1750 2029 1630 1568 1569 1994 1786 1864 1875 2409 2096 1574 1574 2428 2069 1875 1858 2053 1743 1582 1594 1643 1594 1596 1595 1609 1611 1610 1609 1612 1611 1610 1614 1613 1611 1615 1614 1610 1612 1616 1615 1611 1612 1617 1616 1632 2460 2212 1649 2035 2481 1633 1922 2007 2392 2361 1641 1878 2146 1930 1654 2305 2503 1666 1996 1667 2071 1683 1934 2367 2371 2231 1689 2416 2466 2147 1691 2264 2457 1712 2445 2144 2379 1718 2353 1722 2502 1835 2242 1726 2184 1735 1997 1728 2360 2030 2084 1736 2241 2049 2128 2129 2241 1736 2131 1774 2332 1763 2327 2137 2240 1765 1788 1773 1988 1774 2327 2097 2357 2378 1904 1778 1796 1797 1800 1811 1930 2146 1815 2095 2363 2464 1818 2175 1967 1968 1824 1861 2208 1885 1981 1981 2462 2138 1861 1868 2487 2099 1869 1923 2146 1878 1924 2044 2233 1893 1958 2095 2378 2357 1930 1984 2379 2144 2352 1991 2287 2210 2262 2384 2385 1992 2114 2018 2347 2238 2099 2030 2360 2144 2353 2091 2270 2104 2046 2340 2413 2325 2077 2095 2463 2427 2378 2301 2300 2170 973 1253 107 1253 973 1253 107 199 2507 199 107 199 2507 0 883 0 2507 199 0 1253 2507 107 1380 2508 1027 71 2436 71 1027 71 2436 408 1536 408 2436 408 1536 2509 2397 2508 71 2397 71 408 1216 1217 159 5 159 1217 159 5 152 855 152 5 152 855 1090 2087 1090 855 1216 159 2368 1216 2368 1570 1216 1570 2509 1892 2505 252 1892 252 955 1892 955 970 1892 970 7 1892 7 78 1892 78 502 1892 502 2251 1892 2251 1772 1892 1772 1896 1892 1896 1700 943 1825 714 943 714 10 943 10 1473 943 1473 1374 1306 2294 13 1306 13 260 1306 260 463 13 2294 1409 13 1409 688 13 688 952 491 2217 66 491 66 1687 491 1687 1701 491 1701 1319 491 1319 2014 491 2014 1180 491 1180 14 491 14 1541 491 1541 1564 491 1564 492 1180 2493 955 1180 955 252 1180 252 2478 1180 2478 1469 1180 1469 14 643 119 931 1004 931 119 931 1004 2283 28 2283 1004 2283 28 356 119 643 1900 119 1900 1899 119 1899 1898 119 1898 2464 293 1876 2464 293 2464 1898 30 2397 1661 30 1661 51 30 51 573 30 573 1027 2240 2484 878 2240 878 879 2240 879 34 2240 34 1765 1054 2386 35 1054 35 2302 1054 2302 83 1054 83 1414 1054 1414 1275 1054 1275 464 1054 464 951 1054 951 798 1001 2302 35 1001 35 2140 1001 2140 1891 1001 1891 1915 1001 1915 493 1001 493 708 2514 1462 2278 2514 2278 910 2514 910 2159 2514 2159 2515 2514 2515 2517 2514 2517 814 2514 814 1628 2514 1628 2518 2514 2518 1744 2515 2159 2513 910 2513 2159 2513 910 751 2120 751 910 751 2120 2512 793 2512 2120 2512 793 2510 427 2510 793 2278 793 2120 2278 2120 910 427 793 332 427 332 2435 427 2435 254 2513 275 2515 2516 2515 275 2515 2516 2517 1318 2517 2516 2517 1318 814 228 814 1318 814 228 1311 490 2513 1094 1521 1094 2513 1094 1521 1376 2511 1376 1521 1376 2511 1968 1521 2513 751 1521 751 2512 1521 2512 1967 1521 1967 2511 2510 1965 97 2510 97 1376 2510 1376 1968 97 1965 2168 1094 1376 1309 2518 1628 814 1287 2364 1514 1287 1514 1390 1287 1390 55 522 1956 1331 522 1331 73 522 73 1828 1557 1637 1331 1557 1331 799 1557 799 2442 1331 1637 335 1331 335 334 1331 334 333 1331 333 1320 1331 1320 1509 1331 1509 73 73 1509 1830 1726 649 1039 89 1039 649 1039 89 2194 2203 2194 89 2194 2203 2193 818 1992 89 818 89 122 818 122 2226 818 2226 702 818 702 1129 1919 89 495 1681 495 89 495 1681 2369 722 2369 1681 2369 722 1221 89 1919 1920 89 1920 1182 89 1182 1181 89 1181 122 89 1992 2385 89 2385 984 89 984 985 89 985 2203 1129 702 102 89 1336 1681 2519 1681 1336 1681 2519 518 2329 518 2519 518 2329 1950 2519 1336 1335 1681 518 1950 608 1963 2271 608 2271 1381 608 1381 2013 1963 425 2271 1964 2271 425 2271 1964 1462 90 1462 1964 1462 90 355 1462 355 354 1462 354 2263 1462 2263 1588 1462 1588 2278 94 2430 1419 94 1419 1420 94 1420 1052 94 1052 1879 995 138 2009 995 2009 2430 995 2430 94 2009 138 142 128 95 848 128 848 2524 128 2524 601 128 601 602 128 602 2496 2524 848 1987 95 1987 848 1987 95 2522 1327 2522 95 2522 1327 2521 2520 2521 1327 2521 2520 1034 381 1034 2520 1034 381 1553 1161 1163 2523 1161 2523 2522 1161 2522 2521 1161 2521 1034 1161 1034 1163 2522 2523 2524 2522 2524 1987 1034 1553 1358 1556 302 358 1522 358 302 358 1522 2216 1047 2216 1522 2216 1047 96 358 1977 2453 358 2453 594 358 594 1555 358 1555 1556 1977 681 773 1977 773 2453 1719 2525 2168 1719 2168 1715 1719 1715 1860 1719 1860 2086 2525 97 1304 2526 1622 99 2527 2526 1982 973 2527 1770 99 2175 1152 99 1152 2160 99 2160 889 99 889 1770 119 2312 559 119 559 264 119 264 772 119 772 1004 1620 2528 1177 1620 1177 1087 1620 1087 2128 1620 2128 2488 1620 2488 2528 2047 2528 2488 2047 2488 964 2047 964 144 2459 549 2531 2459 2531 1419 2459 1419 2530 2459 2530 2423 2459 2423 890 2459 890 145 2459 145 549 1107 2530 1419 1107 1419 2142 1107 2142 1011 1052 2531 549 1052 549 145 2529 2183 890 2529 890 2423 2529 2423 2530 147 2133 1435 147 1435 1885 147 1885 854 2230 2259 2230 2230 2230 162 2230 162 2252 2230 2252 249 2230 249 1291 2230 1291 187 2230 187 181 2230 181 743 171 1774 295 2097 295 1774 295 2097 626 2198 626 2097 626 2198 1399 2347 1399 2198 1399 2347 863 466 2370 2010 2079 2010 2370 2010 2079 184 2345 184 2079 184 2345 1130 1754 1130 2345 1130 1754 740 725 2532 1766 725 1766 185 725 185 2535 725 2535 468 725 468 2190 725 2190 2532 2532 2190 1382 2532 1382 386 2535 2534 1784 2535 1784 468 394 1672 227 394 227 2471 394 2471 2533 227 1672 1024 2534 2533 2309 2535 185 889 312 2137 192 312 192 976 312 976 683 312 683 1479 2142 1419 2430 2142 2430 2009 2142 2009 215 299 1980 235 299 235 760 299 760 1714 299 1714 1713 238 1891 2236 2343 2236 1891 2236 2343 2536 2065 2536 2343 2536 2065 1220 2537 1220 2065 1220 2537 2106 2538 2106 2537 2106 2538 2109 2539 2109 2538 2109 2539 2540 2109 2540 460 2109 460 1220 2109 1220 2106 1589 2111 2539 1589 2539 2538 1589 2538 2537 1589 2537 2065 1589 2065 2343 1891 238 1915 2536 1220 639 1909 2266 1713 1909 1713 554 1909 554 568 1909 568 254 254 568 2168 254 2168 1965 254 1965 427 712 1971 959 712 959 535 712 535 280 712 280 993 712 993 1235 280 1856 1306 280 1306 463 280 463 1293 280 1293 993 367 1979 389 367 389 285 367 285 669 367 669 1098 1304 1719 286 1304 286 368 1304 368 1258 2048 2413 1980 2048 1980 299 2048 299 1661 2048 1661 2397 878 2484 312 878 312 1479 878 1479 550 878 550 730 2123 2542 654 2123 654 731 2541 2542 1643 1599 1643 2542 1643 1599 1594 1595 1594 1599 2541 313 1050 1456 313 2123 1456 2123 1078 1456 1078 1543 2001 1952 1951 2001 1951 516 2001 516 2544 2001 2544 2543 2001 2543 1952 330 1488 2544 1487 2544 1488 2544 1487 1999 2543 1999 1487 1999 2543 2544 2329 1335 1950 2088 1950 1335 1950 2088 2491 2545 2491 2088 2491 2545 2247 1288 2247 2545 648 1389 1550 648 1550 2118 648 2118 453 648 453 2545 648 2545 2088 648 2088 1335 648 1335 1336 648 1336 734 734 1336 337 338 1956 522 338 522 1334 338 1334 868 338 868 856 799 1331 1956 799 1956 338 799 338 1403 358 2216 440 358 440 532 358 532 357 403 1097 952 403 952 688 403 688 563 403 563 360 1417 2286 2025 1417 2025 403 1417 403 360 1583 1979 367 1583 367 1319 1583 1319 1701 1098 2016 2014 1098 2014 1319 1098 1319 367 984 2385 2384 984 2384 739 984 739 385 984 385 1819 1640 1766 1289 1640 1289 386 1640 386 1639 1640 1639 729 2048 2397 408 2048 408 1216 2048 1216 1217 2048 1217 652 2048 652 2211 740 1353 888 740 888 778 740 778 449 740 449 1130 2312 2363 1624 2312 1624 452 2312 452 2031 2312 2031 559 620 2290 2136 620 2136 941 620 941 527 620 527 1025 620 1025 1638 620 1638 1284 1271 2482 730 1271 730 550 1271 550 641 1271 641 632 1595 2548 2547 1597 2547 2548 2547 1597 1598 1643 1598 1597 1598 1643 1600 1506 1600 1643 1600 1506 2546 1594 1643 1597 1594 1597 2548 1598 1600 2546 1598 2546 654 1598 654 2547 1506 1643 1050 1352 2197 1562 1352 1562 1563 1352 1563 720 1523 1525 878 974 878 1525 878 974 879 1530 879 974 879 1530 1519 1481 1519 1530 730 1229 1392 730 1392 1391 730 1391 1524 730 1524 1523 730 1523 878 854 1885 2208 854 2208 1063 854 1063 2188 854 2188 1754 1754 2188 740 864 2114 818 864 818 1129 864 1129 1432 1562 2197 1390 1562 1390 1514 1562 1514 1356 1562 1356 928 942 2317 1456 942 1456 1543 942 1543 2246 942 2246 1303 1202 2387 1238 1202 1238 2549 1202 2549 1134 1202 1134 1877 1202 1877 2387 2549 1238 2274 1610 2550 1612 1614 1612 2550 1612 1614 1616 1615 1616 1614 1610 1612 1609 1612 1616 2551</edge_points>\n\t\t\t<clockwise_edges>1 2 0 4 5 6 3 8 9 10 7 12 13 14 11 16 17 18 15 20 21 22 19 24 25 26 23 28 29 30 27 32 33 34 31 36 37 38 35 40 41 42 39 44 45 46 43 48 49 50 47 52 53 54 51 56 57 58 55 60 61 62 59 64 65 66 63 68 69 70 67 72 73 74 71 76 77 75 79 80 81 78 83 84 85 82 87 88 89 86 91 92 93 90 95 96 97 94 99 100 101 98 103 104 105 102 107 108 109 106 111 112 113 110 115 116 117 114 119 120 121 118 123 124 125 122 127 128 129 126 131 132 133 130 135 136 137 134 139 140 141 138 143 144 145 142 147 148 149 146 151 152 153 150 155 156 157 154 159 160 161 158 163 164 165 162 167 168 169 166 171 172 173 170 175 176 177 174 179 180 181 178 183 184 185 182 187 188 189 186 191 192 193 190 195 196 197 194 199 200 201 198 203 204 205 202 207 208 209 206 211 212 213 210 215 216 217 214 219 220 221 218 223 224 225 222 227 228 229 226 231 232 233 230 235 236 237 234 239 240 241 238 243 244 245 242 247 248 249 246 251 252 253 250 255 256 257 254 259 260 261 258 263 264 265 262 267 268 269 266 271 272 273 270 275 276 277 274 279 280 281 278 283 284 285 282 287 288 289 286 291 292 293 290 295 296 297 294 299 300 301 298 303 304 305 302 307 308 309 306 311 312 313 310 315 316 317 314 319 320 321 318 323 324 325 322 327 328 329 326 331 332 333 330 335 336 337 334 339 340 341 338 343 344 345 342 347 348 349 346 351 352 353 350 355 356 357 354 359 360 361 358 363 364 365 362 367 368 369 366 371 372 373 370 375 376 377 374 379 380 381 378 383 384 385 382 387 388 386 390 391 392 389 394 395 396 393 398 399 400 397 402 403 404 401 406 407 408 405 410 411 412 409 414 415 416 413 418 419 420 417 422 423 424 421 426 427 428 425 430 431 432 429 434 435 436 433 438 439 440 437 442 443 444 441 446 447 448 445 450 451 452 449 454 455 456 453 458 459 460 457 462 463 464 461 466 467 465 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 716 719 720 721 718 723 724 725 722 727 728 729 726 731 732 733 730 735 736 737 734 739 740 741 738 743 744 745 742 747 748 749 746 751 752 753 750 755 756 757 754 759 760 761 758 763 764 765 762 767 768 769 766 771 772 773 770 775 776 777 774 779 780 781 778 783 784 785 782 787 788 789 786 791 792 793 790 795 796 797 794 799 800 801 798 803 804 805 802 807 808 809 806 811 812 813 810 815 816 817 814 819 820 821 818 823 824 825 822 827 828 829 826 831 832 833 830 835 836 837 834 839 840 841 838 843 844 845 842 847 848 849 846 851 852 853 850 855 856 857 854 859 860 861 858 863 864 865 862 867 868 869 866 871 872 873 870 875 876 877 874 879 880 881 878 883 884 885 882 887 888 889 886 891 892 893 890 895 896 897 894 899 900 901 898 903 904 905 902 907 908 909 906 911 912 913 910 915 916 917 914 919 920 921 918 923 924 925 922 927 928 929 926 931 932 933 930 935 936 937 934 939 940 941 938 943 944 945 942 947 948 949 946 951 952 953 950 955 956 957 954 959 960 961 958 963 964 965 962 967 968 969 966 971 972 973 970 975 976 977 974 979 980 981 978 983 984 985 982 987 988 989 986 991 992 993 990 995 996 997 994 999 1000 1001 998 1003 1004 1005 1002 1007 1008 1009 1006 1011 1012 1013 1010 1015 1016 1017 1014 1019 1020 1021 1018 1023 1024 1025 1022 1027 1028 1029 1026 1031 1032 1033 1030 1035 1036 1037 1034 1039 1040 1041 1038 1043 1044 1045 1042 1047 1048 1049 1046 1051 1052 1053 1050 1055 1056 1057 1054 1059 1060 1061 1058 1063 1064 1065 1062 1067 1068 1069 1066 1071 1072 1073 1070 1075 1076 1077 1074 1079 1080 1081 1078 1083 1084 1085 1082 1087 1088 1089 1086 1091 1092 1093 1090 1095 1096 1097 1094 1099 1100 1101 1098 1103 1104 1105 1102 1107 1108 1109 1106 1111 1112 1113 1110 1115 1116 1117 1114 1119 1120 1121 1118 1123 1124 1125 1122 1127 1128 1129 1126 1131 1132 1133 1130 1135 1136 1137 1134 1139 1140 1141 1138 1143 1144 1145 1142 1147 1148 1149 1146 1151 1152 1153 1150 1155 1156 1157 1154 1159 1160 1161 1158 1163 1164 1165 1162 1167 1168 1169 1166 1171 1172 1173 1170 1175 1176 1177 1174 1179 1180 1181 1178 1183 1184 1185 1182 1187 1188 1189 1186 1191 1192 1193 1190 1195 1196 1197 1194 1199 1200 1201 1198 1203 1204 1205 1202 1207 1208 1209 1206 1211 1212 1213 1210 1215 1216 1217 1214 1219 1220 1221 1218 1223 1224 1225 1222 1227 1228 1229 1226 1231 1232 1233 1230 1235 1236 1237 1234 1239 1240 1241 1238 1243 1244 1245 1242 1247 1248 1249 1246 1251 1252 1253 1250 1255 1256 1257 1254 1259 1260 1261 1258 1263 1264 1265 1262 1267 1268 1269 1266 1271 1272 1273 1270 1275 1276 1277 1274 1279 1280 1281 1278 1283 1284 1285 1282 1287 1288 1289 1286 1291 1292 1293 1290 1295 1296 1297 1294 1299 1300 1301 1298 1303 1304 1305 1302 1307 1308 1309 1306 1311 1312 1313 1310 1315 1316 1317 1314 1319 1320 1321 1318 1323 1324 1325 1322 1327 1328 1329 1326 1331 1332 1333 1330 1335 1336 1337 1334 1339 1340 1341 1338 1343 1344 1345 1342 1347 1348 1349 1346 1351 1352 1353 1350 1355 1356 1357 1354 1359 1360 1361 1358 1363 1364 1365 1362 1367 1368 1369 1366 1371 1372 1373 1370 1375 1376 1377 1374 1379 1380 1381 1378 1383 1384 1385 1382 1387 1388 1389 1386 1391 1392 1393 1390 1395 1396 1397 1394 1399 1400 1401 1398 1403 1404 1405 1402 1407 1408 1409 1406 1411 1412 1413 1410 1415 1416 1417 1414 1419 1420 1421 1418 1423 1424 1425 1422 1427 1428 1429 1426 1431 1432 1433 1430 1435 1436 1437 1434 1439 1440 1441 1438 1443 1444 1445 1442 1447 1448 1449 1446 1451 1452 1453 1450 1455 1456 1457 1454 1459 1460 1461 1458 1463 1464 1465 1462 1467 1468 1469 1466 1471 1472 1473 1470 1475 1476 1477 1474 1479 1480 1481 1478 1483 1484 1485 1482 1487 1488 1489 1486 1491 1492 1493 1490 1495 1496 1497 1494 1499 1500 1501 1498 1503 1504 1505 1502 1507 1508 1509 1506 1511 1512 1513 1510 1515 1516 1517 1514 1519 1520 1521 1518 1523 1524 1525 1522 1527 1528 1529 1526 1531 1532 1533 1530 1535 1536 1537 1534 1539 1540 1541 1538 1543 1544 1545 1542 1547 1548 1549 1546 1551 1552 1553 1550 1555 1556 1557 1554 1559 1560 1561 1558 1563 1564 1565 1562 1567 1568 1569 1566 1571 1572 1573 1570 1575 1576 1577 1574 1579 1580 1581 1578 1583 1584 1585 1582 1587 1588 1589 1586 1591 1592 1593 1590 1595 1596 1597 1594 1599 1600 1601 1598 1603 1604 1605 1602 1607 1608 1609 1606 1611 1612 1613 1610 1615 1616 1617 1614 1619 1620 1621 1618 1623 1624 1625 1622 1627 1628 1629 1626 1631 1632 1633 1630 1635 1636 1637 1634 1639 1640 1641 1638 1643 1644 1645 1642 1647 1648 1649 1646 1651 1652 1653 1650 1655 1656 1657 1654 1659 1660 1661 1658 1663 1664 1665 1662 1667 1668 1669 1666 1671 1672 1673 1670 1675 1676 1677 1674 1679 1680 1681 1678 1683 1684 1685 1682 1687 1688 1689 1686 1691 1692 1693 1690 1695 1696 1697 1694 1699 1700 1701 1698 1703 1704 1705 1702 1707 1708 1709 1706 1711 1712 1713 1710 1715 1716 1717 1714 1719 1720 1721 1718 1723 1724 1725 1722 1727 1728 1729 1726 1731 1732 1733 1730 1735 1736 1737 1734 1739 1740 1741 1738 1743 1744 1745 1742 1747 1748 1749 1746 1751 1752 1753 1750 1755 1756 1757 1754 1759 1760 1761 1758 1763 1764 1765 1762 1767 1768 1769 1766 1771 1772 1773 1770 1775 1776 1777 1774 1779 1780 1781 1778 1783 1784 1785 1782 1787 1788 1789 1786 1791 1792 1793 1790 1795 1796 1797 1794 1799 1800 1801 1798 1803 1804 1805 1802 1807 1808 1809 1806 1811 1812 1813 1810 1815 1816 1817 1814 1819 1820 1821 1818 1823 1824 1825 1822 1827 1828 1829 1826 1831 1832 1833 1830 1835 1836 1837 1834 1839 1840 1841 1838 1843 1844 1845 1842 1847 1848 1849 1846 1851 1852 1853 1850 1855 1856 1857 1854 1859 1860 1861 1858 1863 1864 1865 1862 1867 1868 1869 1866 1871 1872 1870 1874 1875 1876 1873 1878 1879 1880 1877 1882 1883 1884 1881 1886 1887 1888 1885 1890 1891 1892 1889 1894 1895 1896 1893 1898 1899 1900 1897 1902 1903 1904 1901 1906 1907 1908 1905 1910 1911 1912 1909 1914 1915 1916 1913 1918 1919 1920 1917 1922 1923 1924 1921 1926 1927 1928 1925 1930 1931 1932 1929 1934 1935 1936 1933 1938 1939 1940 1937 1942 1943 1944 1941 1946 1947 1948 1945 1950 1951 1952 1949 1954 1955 1956 1953 1958 1959 1960 1957 1962 1963 1964 1961 1966 1967 1968 1965 1970 1971 1972 1969 1974 1975 1976 1973 1978 1979 1980 1977 1982 1983 1984 1981 1986 1987 1988 1985 1990 1991 1992 1989 1994 1995 1996 1993 1998 1999 2000 1997 2002 2003 2004 2001 2006 2007 2008 2005 2010 2011 2012 2009 2014 2015 2016 2013 2018 2019 2020 2017 2022 2023 2024 2021 2026 2027 2028 2025 2030 2031 2032 2029 2034 2035 2036 2033 2038 2039 2040 2037 2042 2043 2044 2041 2046 2047 2048 2045 2050 2051 2052 2049 2054 2055 2056 2053 2058 2059 2060 2057 2062 2063 2064 2061 2066 2067 2068 2065 2070 2071 2072 2069 2074 2075 2076 2073 2078 2079 2080 2077 2082 2083 2084 2081 2086 2087 2088 2085 2090 2091 2092 2089 2094 2095 2096 2093 2098 2099 2100 2097 2102 2103 2104 2101 2106 2107 2108 2105 2110 2111 2112 2109 2114 2115 2116 2113 2118 2119 2120 2117 2122 2123 2124 2121 2126 2127 2128 2125 2130 2131 2132 2129 2134 2135 2136 2133 2138 2139 2140 2137 2142 2143 2144 2141 2146 2147 2148 2145 2150 2151 2152 2149 2154 2155 2156 2153 2158 2159 2160 2157 2162 2163 2164 2161 2166 2167 2168 2165 2170 2171 2172 2169 2174 2175 2176 2173 2178 2179 2180 2177 2182 2183 2184 2181 2186 2187 2188 2185 2190 2191 2192 2189 2194 2195 2196 2193 2198 2199 2200 2197 2202 2203 2204 2201 2206 2207 2208 2205 2210 2211 2212 2209 2214 2215 2216 2213 2218 2219 2220 2217 2222 2223 2224 2221 2226 2227 2228 2225 2230 2231 2232 2229 2234 2235 2236 2233 2238 2239 2240 2237 2242 2243 2244 2241 2246 2247 2248 2245 2250 2251 2252 2249 2254 2255 2256 2253 2258 2259 2260 2257 2262 2263 2264 2261 2266 2267 2268 2265 2270 2271 2272 2269 2274 2275 2276 2273 2278 2279 2280 2277 2282 2283 2284 2281 2286 2287 2288 2285 2290 2291 2292 2289 2294 2295 2296 2293 2298 2299 2300 2297 2302 2303 2304 2301 2306 2307 2308 2305 2310 2311 2312 2309 2314 2315 2316 2313 2318 2319 2320 2317 2322 2323 2324 2321 2326 2327 2328 2325 2330 2331 2332 2329 2334 2335 2336 2333 2338 2339 2340 2337 2342 2343 2341 2345 2346 2347 2344 2349 2350 2351 2348 2353 2354 2355 2352 2357 2358 2359 2356 2361 2362 2363 2360 2365 2366 2367 2364 2369 2370 2371 2368 2373 2374 2375 2372 2377 2378 2379 2376 2381 2382 2383 2380 2385 2386 2387 2384 2389 2390 2391 2388 2393 2394 2395 2392 2397 2398 2399 2396 2401 2402 2403 2400 2405 2406 2407 2404 2409 2410 2411 2408 2413 2414 2415 2412 2417 2418 2419 2416 2421 2422 2423 2420 2425 2426 2427 2424 2429 2430 2431 2428 2433 2434 2435 2432 2437 2438 2439 2436 2441 2442 2443 2440 2445 2446 2447 2444 2449 2450 2451 2448 2453 2454 2455 2452 2457 2458 2459 2456 2461 2462 2463 2460 2465 2466 2467 2464 2469 2470 2471 2468 2473 2474 2475 2472 2477 2478 2479 2476 2481 2482 2483 2480 2485 2486 2487 2484 2489 2490 2491 2488 2493 2494 2495 2492 2497 2498 2499 2496 2501 2502 2503 2500 2505 2506 2507 2504 2509 2510 2511 2508 2513 2514 2515 2512 2517 2518 2519 2516 2521 2522 2523 2520 2525 2526 2527 2524 2529 2530 2531 2528 2533 2534 2535 2532 2537 2538 2539 2536 2541 2542 2543 2540 2545 2546 2547 2544 2549 2550 2551 2548 2553 2554 2555 2552 2557 2558 2559 2556 2561 2562 2563 2560 2565 2566 2567 2564 2569 2570 2571 2568 2573 2574 2575 2572 2577 2578 2579 2576 2581 2582 2583 2580 2585 2586 2587 2584 2589 2590 2591 2588 2593 2594 2595 2592 2597 2598 2599 2596 2601 2602 2603 2600 2605 2606 2607 2604 2609 2610 2611 2608 2613 2614 2615 2612 2617 2618 2619 2616 2621 2622 2623 2620 2625 2626 2627 2624 2629 2630 2631 2628 2633 2634 2635 2632 2637 2638 2639 2636 2641 2642 2643 2640 2645 2646 2647 2644 2649 2650 2651 2648 2653 2654 2655 2652 2657 2658 2659 2656 2661 2662 2663 2660 2665 2666 2667 2664 2669 2670 2671 2668 2673 2674 2675 2672 2677 2678 2679 2676 2681 2682 2683 2680 2685 2686 2687 2684 2689 2690 2691 2688 2693 2694 2695 2692 2697 2698 2699 2696 2701 2702 2703 2700 2705 2706 2707 2704 2709 2710 2711 2708 2713 2714 2715 2712 2717 2718 2719 2716 2721 2722 2723 2720 2725 2726 2727 2724 2729 2730 2731 2728 2733 2734 2735 2732 2737 2738 2739 2736 2741 2742 2743 2740 2745 2746 2747 2744 2749 2750 2751 2748 2753 2754 2755 2752 2757 2758 2759 2756 2761 2762 2763 2760 2765 2766 2767 2764 2769 2770 2771 2768 2773 2774 2775 2772 2777 2778 2779 2776 2781 2782 2783 2780 2785 2786 2787 2784 2789 2790 2791 2788 2793 2794 2795 2792 2797 2798 2799 2796 2801 2802 2803 2800 2805 2806 2807 2804 2809 2810 2811 2808 2813 2814 2815 2812 2817 2818 2819 2816 2821 2822 2823 2820 2825 2826 2827 2824 2829 2830 2831 2828 2833 2834 2835 2832 2837 2838 2839 2836 2841 2842 2843 2840 2845 2846 2847 2844 2849 2850 2851 2848 2853 2854 2855 2852 2857 2858 2859 2856 2861 2862 2863 2860 2865 2866 2867 2864 2869 2870 2871 2868 2873 2874 2875 2872 2877 2878 2879 2876 2881 2882 2883 2880 2885 2886 2887 2884 2889 2890 2891 2888 2893 2894 2895 2892 2897 2898 2899 2896 2901 2902 2903 2900 2905 2906 2907 2904 2909 2910 2911 2908 2913 2914 2915 2912 2917 2918 2919 2916 2921 2922 2923 2920 2925 2926 2927 2924 2929 2930 2931 2928 2933 2934 2935 2932 2937 2938 2939 2936 2941 2942 2943 2940 2945 2946 2947 2944 2949 2950 2951 2948 2953 2954 2955 2952 2957 2958 2959 2956 2961 2962 2963 2960 2965 2966 2967 2964 2969 2970 2971 2968 2973 2974 2975 2972 2977 2978 2979 2976 2981 2982 2983 2980 2985 2986 2987 2984 2989 2990 2991 2988 2993 2994 2995 2992 2997 2998 2999 2996 3001 3002 3003 3000 3005 3006 3007 3004 3009 3010 3011 3008 3013 3014 3015 3012 3017 3018 3019 3016 3021 3022 3023 3020 3025 3026 3027 3024 3029 3030 3031 3028 3033 3034 3035 3032 3037 3038 3039 3036 3041 3042 3043 3040 3045 3046 3047 3044 3049 3050 3051 3048 3053 3054 3055 3052 3057 3058 3059 3056 3061 3062 3063 3060 3065 3066 3067 3064 3069 3070 3071 3068 3073 3074 3075 3072 3077 3078 3079 3076 3081 3082 3083 3080 3085 3086 3087 3084 3089 3090 3091 3088 3093 3094 3095 3092 3097 3098 3099 3096 3101 3102 3103 3100 3105 3106 3107 3104 3109 3110 3111 3108 3113 3114 3115 3112 3117 3118 3119 3116 3121 3122 3123 3120 3125 3126 3127 3124 3129 3130 3131 3128 3133 3134 3135 3132 3137 3138 3139 3136 3141 3142 3143 3140 3145 3146 3147 3144 3149 3150 3151 3148 3153 3154 3155 3152 3157 3158 3159 3156 3161 3162 3163 3160 3165 3166 3167 3164 3169 3170 3171 3168 3173 3174 3175 3172 3177 3178 3179 3176 3181 3182 3183 3180 3185 3186 3187 3184 3189 3190 3191 3188 3193 3194 3195 3192 3197 3198 3199 3196 3201 3202 3203 3200 3205 3206 3207 3204 3209 3210 3211 3208 3213 3214 3215 3212 3217 3218 3219 3216 3221 3222 3223 3220 3225 3226 3227 3224 3229 3230 3231 3228 3233 3234 3235 3232 3237 3238 3239 3236 3241 3242 3243 3240 3245 3246 3247 3244 3249 3250 3251 3248 3253 3254 3255 3252 3257 3258 3259 3256 3261 3262 3263 3260 3265 3266 3267 3264 3269 3270 3271 3268 3273 3274 3275 3272 3277 3278 3279 3276 3281 3282 3283 3280 3285 3286 3287 3284 3289 3290 3291 3288 3293 3294 3295 3292 3297 3298 3299 3296 3301 3302 3303 3300 3305 3306 3307 3304 3309 3310 3311 3308 3313 3314 3315 3312 3317 3318 3319 3316 3321 3322 3323 3320 3325 3326 3327 3324 3329 3330 3331 3328 3333 3334 3335 3332 3337 3338 3339 3336 3341 3342 3343 3340 3345 3346 3347 3344 3349 3350 3351 3348 3353 3354 3355 3352 3357 3358 3359 3356 3361 3362 3363 3360 3365 3366 3367 3364 3369 3370 3371 3368 3373 3374 3375 3372 3377 3378 3379 3376 3381 3382 3383 3380 3385 3386 3387 3384 3389 3390 3391 3388 3393 3394 3395 3392 3397 3398 3399 3396 3401 3402 3403 3400 3405 3406 3407 3404 3409 3410 3411 3408 3413 3414 3415 3412 3417 3418 3419 3416 3421 3422 3423 3420 3425 3426 3427 3424 3429 3430 3431 3428 3433 3434 3435 3432 3437 3438 3439 3436 3441 3442 3443 3440 3445 3446 3447 3444 3449 3450 3451 3448 3453 3454 3455 3452 3457 3458 3459 3456 3461 3462 3463 3460 3465 3466 3467 3464 3469 3470 3471 3468 3473 3474 3475 3472 3477 3478 3479 3476 3481 3482 3483 3480 3485 3486 3487 3484 3489 3490 3491 3488 3493 3494 3495 3492 3497 3498 3499 3496 3501 3502 3503 3500 3505 3506 3507 3504 3509 3510 3511 3508 3513 3514 3515 3512 3517 3518 3519 3516 3521 3522 3523 3520 3525 3526 3527 3524 3529 3530 3531 3528 3533 3534 3535 3532 3537 3538 3539 3536 3541 3542 3543 3540 3545 3546 3547 3544 3549 3550 3551 3548 3553 3554 3555 3552 3557 3558 3559 3556 3561 3562 3563 3560 3565 3566 3567 3564 3569 3570 3571 3568 3573 3574 3575 3572 3577 3578 3579 3576 3581 3582 3583 3580 3585 3586 3587 3584 3589 3590 3591 3588 3593 3594 3595 3592 3597 3598 3599 3596 3601 3602 3603 3600 3605 3606 3607 3604 3609 3610 3611 3608 3613 3614 3615 3612 3617 3618 3619 3616 3621 3622 3623 3620 3625 3626 3627 3624 3629 3630 3631 3628 3633 3634 3635 3632 3637 3638 3639 3636 3641 3642 3643 3640 3645 3646 3647 3644 3649 3650 3651 3648 3653 3654 3655 3652 3657 3658 3659 3656 3661 3662 3663 3660 3665 3666 3667 3664 3669 3670 3671 3668 3673 3674 3675 3672 3677 3678 3679 3676 3681 3682 3683 3680 3685 3686 3687 3684 3689 3690 3691 3688 3693 3694 3695 3692 3697 3698 3699 3696 3701 3702 3703 3700 3705 3706 3707 3704 3709 3710 3711 3708 3713 3714 3715 3712 3717 3718 3719 3716 3721 3722 3723 3720 3725 3726 3727 3724 3729 3730 3731 3728 3733 3734 3735 3732 3737 3738 3739 3736 3741 3742 3743 3740 3745 3746 3747 3744 3749 3750 3751 3748 3753 3754 3755 3752 3757 3758 3759 3756 3761 3762 3763 3760 3765 3766 3767 3764 3769 3770 3771 3768 3773 3774 3775 3772 3777 3778 3779 3776 3781 3782 3783 3780 3785 3786 3787 3784 3789 3790 3791 3788 3793 3794 3795 3792 3797 3798 3799 3796 3801 3802 3803 3800 3805 3806 3807 3804 3809 3810 3811 3808 3813 3814 3815 3812 3817 3818 3819 3816 3821 3822 3823 3820 3825 3826 3827 3824 3829 3830 3831 3828 3833 3834 3835 3832 3837 3838 3839 3836 3841 3842 3843 3840 3845 3846 3847 3844 3849 3850 3851 3848 3853 3854 3855 3852 3857 3858 3859 3856 3861 3862 3863 3860 3865 3866 3867 3864 3869 3870 3871 3868 3873 3874 3875 3872 3877 3878 3879 3876 3881 3882 3883 3880 3885 3886 3887 3884 3889 3890 3891 3888 3893 3894 3895 3892 3897 3898 3899 3896 3901 3902 3903 3900 3905 3906 3907 3904 3909 3910 3911 3908 3913 3914 3915 3912 3917 3918 3919 3916 3921 3922 3923 3920 3925 3926 3927 3924 3929 3930 3931 3928 3933 3934 3935 3932 3937 3938 3939 3936 3941 3942 3943 3940 3945 3946 3947 3944 3949 3950 3951 3948 3953 3954 3955 3952 3957 3958 3959 3956 3961 3962 3963 3960 3965 3966 3967 3964 3969 3970 3971 3968 3973 3974 3975 3972 3977 3978 3979 3976 3981 3982 3983 3980 3985 3986 3987 3984 3989 3990 3991 3988 3993 3994 3995 3992 3997 3998 3999 3996 4001 4002 4003 4000 4005 4006 4007 4004 4009 4010 4011 4008 4013 4014 4015 4012 4017 4018 4019 4016 4021 4022 4023 4020 4025 4026 4027 4024 4029 4030 4031 4028 4033 4034 4035 4032 4037 4038 4039 4036 4041 4042 4043 4040 4045 4046 4047 4044 4049 4050 4051 4048 4053 4054 4055 4052 4057 4058 4059 4056 4061 4062 4063 4060 4065 4066 4067 4064 4069 4070 4071 4068 4073 4074 4075 4072 4077 4078 4079 4076 4081 4082 4083 4080 4085 4086 4087 4084 4089 4088 4091 4092 4093 4090 4095 4096 4097 4094 4099 4100 4101 4098 4103 4104 4105 4102 4107 4108 4109 4106 4111 4112 4113 4110 4115 4116 4117 4114 4119 4120 4121 4118 4123 4124 4125 4122 4127 4128 4129 4126 4131 4132 4133 4130 4135 4136 4137 4134 4139 4140 4141 4138 4143 4144 4145 4142 4147 4148 4149 4146 4151 4152 4153 4150 4155 4156 4157 4154 4159 4160 4161 4158 4163 4164 4165 4162 4167 4168 4169 4166 4171 4172 4173 4170 4175 4176 4177 4174 4179 4180 4181 4178 4183 4184 4185 4182 4187 4188 4189 4186 4191 4192 4193 4190 4195 4196 4197 4194 4199 4200 4201 4198 4203 4204 4205 4202 4207 4208 4209 4206 4211 4212 4213 4210 4215 4216 4217 4214 4219 4220 4221 4218 4223 4224 4225 4222 4227 4228 4229 4226 4231 4232 4233 4230 4235 4236 4237 4234 4239 4240 4241 4238 4243 4244 4245 4242 4247 4248 4249 4246 4251 4252 4253 4250 4255 4256 4254 4258 4259 4260 4257 4262 4263 4264 4261 4266 4267 4268 4265 4270 4271 4272 4269 4274 4275 4276 4273 4278 4279 4280 4277 4282 4283 4284 4281 4286 4287 4288 4285 4290 4291 4292 4289 4294 4295 4296 4293 4298 4299 4300 4297 4302 4303 4304 4301 4306 4307 4308 4305 4310 4311 4312 4309 4314 4315 4316 4313 4318 4319 4320 4317 4322 4323 4324 4321 4326 4327 4328 4325 4330 4331 4332 4329 4334 4335 4336 4333 4338 4339 4340 4337 4342 4343 4344 4341 4346 4347 4348 4345 4350 4351 4352 4349 4354 4355 4356 4353 4358 4359 4360 4357 4362 4363 4364 4361 4366 4367 4368 4365 4370 4371 4372 4369 4374 4375 4376 4373 4378 4379 4380 4377 4382 4383 4384 4381 4386 4387 4388 4385 4390 4391 4392 4389 4394 4395 4396 4393 4398 4399 4400 4397 4402 4403 4404 4401 4406 4407 4408 4405 4410 4411 4412 4409 4414 4415 4416 4413 4418 4419 4420 4417 4422 4423 4424 4421 4426 4427 4428 4425 4430 4431 4432 4429 4434 4435 4436 4433 4438 4439 4440 4437 4442 4443 4444 4441 4446 4447 4448 4445 4450 4451 4452 4449 4454 4455 4456 4453 4458 4459 4460 4457 4462 4463 4464 4461 4466 4467 4468 4465 4470 4471 4472 4469 4474 4475 4476 4473 4478 4479 4480 4477 4482 4483 4484 4481 4486 4487 4488 4485 4490 4491 4492 4489 4494 4495 4496 4493 4498 4499 4500 4497 4502 4503 4504 4501 4506 4507 4508 4505 4510 4511 4512 4509 4514 4515 4516 4513 4518 4519 4520 4517 4522 4523 4524 4521 4526 4527 4528 4525 4530 4531 4532 4529 4534 4535 4536 4533 4538 4539 4540 4537 4542 4543 4544 4541 4546 4547 4548 4545 4550 4551 4552 4549 4554 4555 4556 4553 4558 4559 4560 4557 4562 4563 4564 4561 4566 4567 4568 4565 4570 4571 4572 4569 4574 4575 4576 4573 4578 4579 4580 4577 4582 4583 4584 4581 4586 4587 4588 4585 4590 4591 4592 4589 4594 4595 4596 4593 4598 4599 4600 4597 4602 4603 4604 4601 4606 4607 4608 4605 4610 4611 4612 4609 4614 4615 4616 4613 4618 4619 4620 4617 4622 4623 4624 4621 4626 4627 4628 4625 4630 4631 4632 4629 4634 4635 4636 4633 4638 4639 4640 4637 4642 4643 4644 4641 4646 4647 4648 4645 4650 4651 4652 4649 4654 4655 4656 4653 4658 4659 4660 4657 4662 4663 4664 4661 4666 4667 4668 4665 4670 4671 4672 4669 4674 4675 4676 4673 4678 4679 4680 4677 4682 4683 4684 4681 4686 4687 4688 4685 4690 4691 4692 4689 4694 4695 4696 4693 4698 4699 4700 4697 4702 4703 4704 4701 4706 4707 4708 4705 4710 4711 4712 4709 4714 4715 4716 4713 4718 4719 4720 4717 4722 4723 4724 4721 4726 4727 4728 4725 4730 4731 4732 4729 4734 4735 4736 4733 4738 4739 4740 4737 4742 4743 4744 4741 4746 4747 4748 4745 4750 4751 4752 4749 4754 4755 4756 4753 4758 4759 4760 4757 4762 4763 4764 4761 4766 4767 4768 4765 4770 4771 4772 4769 4774 4775 4776 4773 4778 4779 4780 4777 4782 4783 4784 4781 4786 4787 4788 4785 4790 4791 4792 4789 4794 4795 4796 4793 4798 4799 4800 4797 4802 4803 4804 4801 4806 4807 4808 4805 4810 4811 4812 4809 4814 4815 4816 4813 4818 4819 4820 4817 4822 4823 4824 4821 4826 4827 4828 4825 4830 4831 4832 4829 4834 4835 4836 4833 4838 4839 4840 4837 4842 4843 4844 4841 4846 4847 4848 4845 4850 4851 4852 4849 4854 4855 4856 4853 4858 4859 4860 4857 4862 4863 4864 4861 4866 4867 4868 4865 4870 4871 4872 4869 4874 4875 4876 4873 4878 4879 4880 4877 4882 4883 4884 4881 4886 4887 4888 4885 4890 4891 4892 4889 4894 4895 4896 4893 4898 4899 4900 4897 4902 4903 4904 4901 4906 4907 4908 4905 4910 4911 4912 4909 4914 4915 4916 4913 4918 4919 4920 4917 4922 4923 4924 4921 4926 4927 4928 4925 4930 4931 4932 4929 4934 4935 4936 4933 4938 4939 4940 4937 4942 4943 4944 4941 4946 4947 4948 4945 4950 4951 4952 4949 4954 4955 4956 4953 4958 4959 4960 4957 4962 4963 4964 4961 4966 4967 4968 4965 4970 4971 4972 4969 4974 4975 4976 4973 4978 4979 4980 4977 4982 4983 4984 4981 4986 4987 4988 4985 4990 4991 4992 4989 4994 4995 4996 4993 4998 4999 5000 4997 5002 5003 5004 5001 5006 5007 5008 5005 5010 5011 5012 5009 5014 5015 5016 5013 5018 5019 5020 5017 5022 5023 5024 5021 5026 5027 5028 5025 5030 5031 5032 5029 5034 5035 5036 5033 5038 5039 5040 5037 5042 5043 5044 5041 5046 5047 5048 5045 5050 5051 5052 5049 5054 5055 5056 5053 5058 5059 5060 5057 5062 5063 5064 5061 5066 5067 5068 5065 5070 5071 5072 5069 5074 5075 5076 5073 5078 5079 5080 5077 5082 5083 5084 5081 5086 5087 5088 5085 5090 5091 5092 5089 5094 5095 5096 5093 5098 5099 5100 5097 5102 5103 5104 5101 5106 5107 5108 5105 5110 5111 5112 5109 5114 5115 5116 5113 5118 5119 5120 5117 5122 5123 5124 5121 5126 5127 5128 5125 5130 5131 5132 5129 5134 5135 5136 5133 5138 5139 5140 5137 5142 5143 5144 5141 5146 5147 5148 5145 5150 5151 5152 5149 5154 5155 5156 5153 5158 5159 5160 5157 5162 5163 5164 5161 5166 5167 5168 5165 5170 5171 5172 5169 5174 5175 5176 5173 5178 5179 5180 5177 5182 5183 5184 5181 5186 5187 5188 5185 5190 5191 5192 5189 5194 5195 5196 5193 5198 5199 5200 5197 5202 5203 5204 5201 5206 5207 5208 5205 5210 5211 5212 5209 5214 5215 5216 5213 5218 5219 5220 5217 5222 5223 5224 5221 5226 5227 5228 5225 5230 5231 5232 5229 5234 5235 5236 5233 5238 5239 5240 5237 5242 5243 5244 5241 5246 5247 5248 5245 5250 5251 5252 5249 5254 5255 5256 5253 5258 5259 5260 5257 5262 5263 5264 5261 5266 5267 5268 5265 5270 5271 5272 5269 5274 5275 5276 5273 5278 5279 5280 5277 5282 5283 5284 5281 5286 5287 5288 5285 5290 5291 5292 5289 5294 5295 5296 5293 5298 5299 5300 5297 5302 5303 5304 5301 5306 5307 5308 5305 5310 5311 5312 5309 5314 5315 5316 5313 5318 5319 5320 5317 5322 5323 5324 5321 5326 5327 5328 5325 5330 5331 5332 5329 5334 5335 5336 5333 5338 5339 5340 5337 5342 5343 5344 5341 5346 5347 5348 5345 5350 5351 5352 5349 5354 5355 5356 5353 5358 5359 5360 5357 5362 5363 5364 5361 5366 5367 5368 5365 5370 5371 5372 5369 5374 5375 5376 5373 5378 5379 5380 5377 5382 5383 5384 5381 5386 5387 5388 5385 5390 5391 5392 5389 5394 5395 5396 5393 5398 5399 5400 5397 5402 5403 5404 5401 5406 5407 5408 5405 5410 5411 5412 5409 5414 5415 5416 5413 5418 5419 5420 5417 5422 5423 5424 5421 5426 5427 5428 5425 5430 5431 5432 5429 5434 5435 5436 5433 5438 5439 5440 5437 5442 5443 5444 5441 5446 5447 5448 5445 5450 5451 5452 5449 5454 5455 5456 5453 5458 5459 5460 5457 5462 5463 5464 5461 5466 5467 5468 5465 5470 5471 5472 5469 5474 5475 5476 5473 5478 5479 5480 5477 5482 5483 5484 5481 5486 5487 5488 5485 5490 5491 5492 5489 5494 5495 5496 5493 5498 5499 5500 5497 5502 5503 5504 5501 5506 5507 5508 5505 5510 5511 5512 5509 5514 5515 5516 5513 5518 5519 5520 5517 5522 5523 5524 5521 5526 5527 5528 5525 5530 5531 5532 5529 5534 5535 5536 5533 5538 5539 5540 5537 5542 5543 5544 5541 5546 5547 5548 5545 5550 5551 5552 5549 5554 5555 5556 5553 5558 5559 5560 5557 5562 5563 5564 5561 5566 5567 5568 5565 5570 5571 5572 5569 5574 5575 5576 5573 5578 5579 5580 5577 5582 5583 5584 5581 5586 5587 5588 5585 5590 5591 5592 5589 5594 5595 5596 5593 5598 5599 5600 5597 5602 5603 5604 5601 5606 5607 5608 5605 5610 5611 5612 5609 5614 5615 5616 5613 5618 5619 5620 5617 5622 5623 5624 5621 5626 5627 5628 5625 5630 5631 5632 5629 5634 5635 5636 5633 5638 5639 5640 5637 5642 5643 5644 5641 5646 5647 5648 5645 5650 5651 5652 5649 5654 5655 5656 5653 5658 5659 5660 5657 5662 5663 5664 5661 5666 5667 5668 5665 5670 5671 5672 5669 5674 5675 5676 5673 5678 5679 5680 5677 5682 5683 5684 5681 5686 5687 5688 5685 5690 5691 5692 5689 5694 5695 5696 5693 5698 5699 5700 5697 5702 5703 5704 5701 5706 5707 5708 5705 5710 5711 5712 5709 5714 5715 5716 5713 5718 5719 5720 5717 5722 5723 5724 5721 5726 5727 5728 5725 5730 5731 5732 5729 5734 5735 5736 5733 5738 5739 5740 5737 5742 5743 5744 5741 5746 5747 5748 5745 5750 5751 5752 5749 5754 5755 5756 5753 5758 5759 5760 5757 5762 5763 5764 5761 5766 5767 5768 5765 5770 5771 5772 5769 5774 5775 5773 5777 5778 5779 5776 5781 5782 5783 5780 5785 5786 5787 5784 5789 5790 5791 5788 5793 5794 5795 5792 5797 5798 5799 5796 5801 5802 5803 5800 5805 5806 5807 5804 5809 5810 5811 5808 5813 5814 5815 5812 5817 5818 5819 5816 5821 5822 5820 5824 5825 5826 5823 5828 5829 5830 5827 5832 5833 5834 5831 5836 5837 5838 5835 5840 5841 5842 5839 5844 5845 5846 5843 5848 5849 5850 5847 5852 5853 5854 5851 5856 5857 5858 5855 5860 5861 5862 5859 5864 5865 5866 5863 5868 5869 5870 5867 5872 5873 5874 5871 5876 5877 5878 5875 5880 5881 5882 5879 5884 5885 5886 5883 5888 5889 5890 5887 5892 5893 5894 5891 5896 5897 5898 5895 5900 5901 5902 5899 5904 5905 5906 5903 5908 5909 5910 5907 5912 5913 5914 5911 5916 5917 5918 5915 5920 5921 5922 5919 5924 5925 5926 5923 5928 5929 5930 5927 5932 5933 5934 5931 5936 5937 5938 5935 5940 5941 5942 5939 5944 5945 5946 5943 5948 5949 5950 5947 5952 5953 5954 5951 5956 5957 5958 5955 5960 5961 5962 5959 5964 5965 5966 5963 5968 5969 5970 5967 5972 5973 5974 5971 5976 5977 5978 5975 5980 5981 5982 5979 5984 5985 5986 5983 5988 5989 5990 5987 5992 5993 5994 5991 5996 5997 5998 5995 6000 6001 6002 5999 6004 6005 6006 6003 6008 6009 6010 6007 6012 6013 6014 6011 6016 6017 6018 6015 6020 6021 6022 6019 6024 6025 6026 6023 6028 6029 6030 6027 6032 6033 6034 6031 6036 6037 6038 6035 6040 6041 6042 6039 6044 6045 6046 6043 6048 6049 6050 6047 6052 6053 6054 6051 6056 6057 6058 6055 6060 6061 6062 6059 6064 6065 6066 6063 6068 6069 6070 6067 6072 6073 6074 6071 6076 6077 6078 6075 6080 6081 6082 6079 6084 6085 6086 6083 6088 6089 6090 6087 6092 6093 6094 6091 6096 6097 6098 6095 6100 6101 6102 6099 6104 6105 6106 6103 6108 6109 6110 6107 6112 6113 6114 6111 6116 6117 6118 6115 6120 6121 6122 6119 6124 6125 6126 6123 6128 6129 6130 6127 6132 6133 6134 6131 6136 6137 6138 6135 6140 6141 6142 6139 6144 6145 6146 6143 6148 6149 6150 6147 6152 6153 6154 6151 6156 6157 6158 6155 6160 6161 6162 6159 6164 6165 6166 6163 6168 6169 6170 6167 6172 6173 6174 6171 6176 6177 6178 6175 6180 6181 6182 6179 6184 6185 6186 6183 6188 6189 6190 6187 6192 6193 6194 6191 6196 6197 6198 6195 6200 6201 6202 6199 6204 6205 6206 6203 6208 6209 6210 6207 6212 6213 6214 6211 6216 6217 6218 6215 6220 6221 6222 6219 6224 6225 6226 6223 6228 6229 6230 6227 6232 6233 6234 6231 6236 6237 6238 6235 6240 6241 6242 6239 6244 6245 6246 6243 6248 6249 6250 6247 6252 6253 6254 6251 6256 6257 6258 6255 6260 6261 6262 6259 6264 6265 6266 6263 6268 6269 6270 6267 6272 6273 6274 6271 6276 6277 6278 6275 6280 6281 6282 6279 6284 6285 6286 6283 6288 6289 6290 6287 6292 6293 6294 6291 6296 6297 6298 6295 6300 6301 6302 6299 6304 6305 6306 6303 6308 6309 6310 6307 6312 6313 6314 6311 6316 6317 6318 6315 6320 6321 6322 6319 6324 6325 6326 6323 6328 6329 6330 6327 6332 6333 6334 6331 6336 6337 6338 6335 6340 6341 6342 6339 6344 6345 6346 6343 6348 6349 6350 6347 6352 6353 6354 6351 6356 6357 6358 6355 6360 6361 6362 6359 6364 6365 6366 6363 6368 6369 6370 6367 6372 6373 6374 6371 6376 6377 6378 6375 6380 6381 6382 6379 6384 6385 6386 6383 6388 6389 6390 6387 6392 6393 6394 6391 6396 6397 6398 6395 6400 6401 6402 6399 6404 6405 6406 6403 6408 6409 6410 6407 6412 6413 6414 6411 6416 6417 6418 6415 6420 6421 6422 6419 6424 6425 6426 6423 6428 6429 6430 6427 6432 6433 6434 6431 6436 6437 6438 6435 6440 6441 6442 6439 6444 6445 6446 6443 6448 6449 6450 6447 6452 6453 6454 6451 6456 6457 6458 6455 6460 6461 6462 6459 6464 6465 6466 6463 6468 6469 6470 6467 6472 6473 6474 6471 6476 6477 6478 6475 6480 6481 6482 6479 6484 6485 6486 6483 6488 6489 6490 6487 6492 6493 6494 6491 6496 6497 6498 6495 6500 6501 6502 6499 6504 6505 6506 6503 6508 6509 6510 6507 6512 6513 6514 6511 6516 6517 6518 6515 6520 6521 6522 6519 6524 6525 6526 6523 6528 6529 6530 6527 6532 6533 6534 6531 6536 6537 6535 6539 6540 6541 6538 6543 6544 6545 6542 6547 6548 6549 6546 6551 6552 6553 6550 6555 6556 6557 6554 6559 6560 6561 6558 6563 6564 6565 6562 6567 6568 6569 6566 6571 6572 6573 6570 6575 6576 6577 6574 6579 6580 6581 6578 6583 6584 6585 6582 6587 6586 6589 6590 6591 6588 6593 6594 6595 6592 6597 6598 6599 6596 6601 6602 6603 6600 6605 6606 6607 6604 6609 6610 6611 6608 6613 6614 6615 6612 6617 6618 6619 6616 6621 6622 6623 6620 6625 6626 6627 6624 6629 6630 6631 6628 6633 6634 6635 6632 6637 6638 6639 6636 6641 6642 6643 6640 6645 6646 6647 6644 6649 6650 6651 6648 6653 6654 6655 6652 6657 6658 6659 6656 6661 6662 6663 6660 6665 6666 6667 6664 6669 6670 6671 6668 6673 6674 6675 6672 6677 6678 6679 6676 6681 6682 6683 6680 6685 6686 6687 6684 6689 6690 6691 6688 6693 6694 6695 6692 6697 6698 6699 6696 6701 6702 6703 6700 6705 6706 6707 6704 6709 6710 6711 6708 6713 6714 6715 6712 6717 6718 6719 6716 6721 6722 6723 6720 6725 6726 6727 6724 6729 6730 6731 6728 6733 6734 6735 6732 6737 6738 6739 6736 6741 6742 6743 6740 6745 6746 6747 6744 6749 6750 6751 6748 6753 6754 6755 6752 6757 6758 6759 6756 6761 6762 6763 6760 6765 6766 6767 6764 6769 6770 6771 6768 6773 6774 6775 6772 6777 6778 6779 6776 6781 6782 6783 6780 6785 6786 6787 6784 6789 6790 6791 6788 6793 6794 6795 6792 6797 6798 6799 6796 6801 6802 6803 6800 6805 6806 6807 6804 6809 6810 6811 6808 6813 6814 6815 6812 6817 6818 6819 6816 6821 6822 6823 6820 6825 6826 6827 6824 6829 6830 6831 6828 6833 6832 6835 6836 6837 6834 6839 6840 6841 6838 6843 6844 6845 6842 6847 6848 6849 6846 6851 6852 6853 6850 6855 6856 6857 6854 6859 6860 6861 6858 6863 6864 6865 6862 6867 6868 6869 6866 6871 6872 6873 6870 6875 6876 6877 6874 6879 6880 6881 6878 6883 6884 6885 6882 6887 6888 6889 6886 6891 6892 6893 6890 6895 6896 6897 6894 6899 6900 6901 6898 6903 6904 6905 6902 6907 6908 6909 6906 6911 6912 6913 6910 6915 6916 6917 6914 6919 6920 6921 6918 6923 6924 6925 6922 6927 6928 6926 6930 6931 6932 6929 6934 6935 6936 6933 6938 6939 6940 6937 6942 6943 6944 6941 6946 6947 6948 6945 6950 6951 6952 6949 6954 6955 6956 6953 6958 6959 6960 6957 6962 6963 6964 6961 6966 6967 6968 6965 6970 6971 6972 6969 6974 6975 6976 6973 6978 6979 6980 6977 6982 6983 6984 6981 6986 6987 6985 6989 6990 6991 6988 6993 6994 6995 6992 6997 6998 6999 6996 7001 7002 7003 7000 7005 7006 7007 7004 7009 7010 7011 7008 7013 7014 7015 7012 7017 7018 7019 7016 7021 7022 7023 7020 7025 7026 7027 7024 7029 7030 7031 7028 7033 7034 7035 7032 7037 7038 7039 7036 7041 7042 7043 7040 7045 7046 7047 7044 7049 7050 7051 7048 7053 7054 7055 7052 7057 7058 7059 7056 7061 7062 7063 7060 7065 7066 7067 7064 7069 7070 7071 7068 7073 7074 7075 7072 7077 7078 7079 7076 7081 7082 7083 7080 7085 7086 7087 7084 7089 7090 7091 7088 7093 7094 7095 7092 7097 7096 7099 7098 7101 7102 7103 7100 7105 7106 7107 7104 7109 7110 7111 7108 7113 7114 7115 7112 7117 7118 7119 7116 7121 7122 7123 7120 7125 7126 7127 7124 7129 7130 7131 7128 7133 7134 7135 7132 7137 7138 7139 7136 7141 7142 7143 7140 7145 7146 7147 7144 7149 7150 7151 7148 7153 7154 7155 7152 7157 7158 7159 7156 7161 7162 7163 7160 7165 7166 7167 7164 7169 7170 7171 7168 7173 7174 7175 7172 7177 7178 7179 7176 7181 7182 7183 7180 7185 7186 7187 7184 7189 7190 7191 7188 7193 7194 7195 7192 7197 7198 7199 7196 7201 7202 7203 7200 7205 7206 7207 7204 7209 7210 7211 7208 7213 7214 7215 7212 7217 7218 7219 7216 7221 7222 7223 7220 7225 7226 7227 7224 7229 7230 7231 7228 7233 7234 7235 7232 7237 7238 7239 7236 7241 7242 7243 7240 7245 7246 7247 7244 7249 7250 7251 7248 7253 7254 7255 7252 7257 7258 7259 7256 7261 7262 7263 7260 7265 7266 7267 7264 7269 7270 7271 7268 7273 7274 7275 7272 7277 7278 7276 7280 7281 7282 7279 7284 7285 7286 7283 7288 7289 7290 7287 7292 7293 7294 7291 7296 7297 7298 7295 7300 7301 7302 7299 7304 7305 7306 7303 7308 7309 7310 7307 7312 7313 7314 7311 7316 7317 7318 7315 7320 7321 7322 7319 7324 7325 7326 7323 7328 7329 7330 7327 7332 7333 7334 7331 7336 7337 7338 7335 7340 7341 7342 7339 7344 7345 7346 7343 7348 7349 7350 7347 7352 7353 7354 7351 7356 7357 7358 7355 7360 7361 7362 7359 7364 7365 7366 7363 7368 7369 7370 7367 7372 7373 7374 7371 7376 7377 7378 7375 7380 7381 7382 7379 7384 7385 7386 7383 7388 7389 7390 7387 7392 7393 7394 7391 7396 7397 7398 7395 7400 7401 7402 7399 7404 7405 7406 7403 7408 7409 7410 7407 7412 7413 7414 7411 7416 7417 7418 7415 7420 7421 7422 7419 7424 7425 7426 7423 7428 7429 7430 7427 7432 7433 7434 7431 7436 7437 7438 7435 7440 7441 7442 7439 7444 7445 7446 7443 7448 7449 7450 7447 7452 7453 7454 7451 7456 7457 7458 7455 7460 7461 7462 7459 7464 7465 7466 7463 7468 7469 7470 7467 7472 7473 7474 7471 7476 7477 7478 7475 7480 7481 7482 7479 7484 7485 7486 7483 7488 7489 7490 7487 7492 7493 7494 7491 7496 7497 7498 7495 7500 7501 7502 7499 7504 7505 7506 7503 7508 7509 7510 7507 7512 7513 7514 7511 7516 7517 7518 7515 7520 7521 7522 7519 7524 7525 7526 7523 7528 7529 7530 7527 7532 7533 7534 7531 7536 7537 7538 7535 7540 7541 7542 7539 7544 7545 7546 7543 7548 7549 7550 7547 7552 7553 7554 7551 7556 7557 7558 7555 7560 7561 7562 7559 7564 7565 7566 7563 7568 7569 7570 7567 7572 7573 7574 7571 7576 7577 7578 7575 7580 7581 7582 7579 7584 7585 7586 7583 7588 7589 7590 7587 7592 7593 7594 7591 7596 7597 7598 7595 7600 7601 7602 7599 7604 7605 7606 7603 7608 7609 7610 7607 7612 7613 7614 7611 7616 7617 7618 7615 7620 7621 7622 7619 7624 7625 7626 7623 7628 7629 7627 7631 7632 7633 7630 7635 7636 7637 7634 7639 7640 7641 7638 7643 7644 7645 7642 7647 7648 7649 7646 7651 7652 7653 7650 7655 7656 7657 7654 7659 7660 7661 7658 7663 7664 7665 7662 7667 7668 7669 7666 7671 7672 7673 7670 7675 7676 7677 7674 7679 7680 7681 7678 7683 7684 7685 7682 7687 7688 7689 7686 7691 7692 7693 7690 7695 7696 7697 7694 7699 7700 7701 7698 7702 7704 7705 7706 7703 7708 7709 7710 7707 7712 7713 7714 7711 7716 7717 7718 7715 7720 7721 7722 7719 7724 7725 7726 7723 7728 7729 7730 7727 7732 7733 7734 7731 7736 7737 7738 7735 7740 7741 7742 7739 7744 7745 7746 7743 7748 7749 7750 7747 7752 7753 7754 7751 7756 7757 7758 7755 7760 7761 7762 7759 7764 7765 7766 7763 7768 7769 7770 7767 7772 7773 7774 7771 7776 7777 7778 7775 7780 7781 7782 7779 7784 7785 7786 7783 7788 7789 7790 7787 7792 7793 7794 7791 7796 7797 7795 7799 7800 7801 7798 7803 7804 7805 7802 7807 7808 7809 7806 7811 7812 7813 7810 7815 7816 7817 7814 7819 7820 7821 7818 7823 7824 7825 7822 7827 7828 7829 7826 7831 7832 7833 7830 7835 7836 7837 7834 7839 7840 7841 7838 7843 7844 7845 7842 7847 7848 7849 7846 7851 7852 7853 7850 7855 7856 7857 7854 7859 7860 7861 7858 7863 7864 7865 7862 7867 7868 7869 7866 7871 7872 7873 7870 7875 7876 7877 7874 7879 7880 7881 7878 7883 7884 7885 7882 7887 7888 7889 7886 7891 7892 7893 7890 7895 7896 7897 7894 7899 7900 7901 7898 7903 7904 7905 7902 7907 7908 7909 7906 7911 7912 7913 7910 7915 7916 7917 7914 7919 7920 7921 7918 7923 7924 7925 7922 7927 7928 7929 7926 7931 7932 7933 7930 7935 7936 7934 7938 7939 7940 7937 7942 7943 7944 7941 7946 7947 7948 7945 7950 7951 7952 7949 7954 7955 7956 7953 7958 7959 7960 7957 7962 7963 7964 7961 7966 7967 7968 7965 7970 7971 7972 7969 7974 7975 7976 7973 7978 7979 7980 7977 7982 7983 7984 7981 7986 7987 7988 7985 7990 7991 7992 7989 7994 7995 7996 7993 7998 7999 8000 7997 8002 8003 8004 8001 8006 8007 8008 8005 8010 8011 8012 8009 8014 8015 8016 8013 8018 8019 8020 8017 8022 8023 8024 8021 8026 8027 8028 8025 8030 8031 8032 8029 8034 8035 8036 8033 8038 8039 8040 8037 8042 8043 8044 8041 8046 8047 8048 8045 8050 8051 8052 8049 8054 8055 8056 8053 8058 8059 8060 8057 8062 8063 8064 8061 8066 8067 8068 8065 8070 8071 8072 8069 8074 8075 8076 8073 8078 8077 8080 8081 8079 8083 8084 8082 8086 8087 8085 8089 8090 8088 8092 8093 8094 8091 8096 8097 8098 8095 8100 8101 8099 8103 8104 8105 8102 8107 8108 8109 8106 8111 8112 8113 8110 8115 8116 8117 8114 8119 8120 8121 8118 8123 8124 8125 8122 8127 8128 8129 8126 8131 8132 8133 8130 8135 8136 8137 8134 8139 8140 8141 8138 8143 8144 8145 8142 8147 8148 8149 8146 8151 8152 8153 8150 8155 8156 8157 8154 8159 8160 8161 8158 8163 8164 8165 8162 8167 8168 8169 8166 8171 8170 8173 8174 8172 8176 8177 8178 8175 8180 8179 8182 8181 8184 8185 8186 8183 8188 8189 8190 8187 8192 8193 8191 8195 8196 8197 8194 8199 8200 8201 8198 8203 8204 8205 8202 8207 8208 8209 8206 8211 8212 8213 8210 8215 8216 8217 8214 8219 8220 8221 8218 8223 8224 8225 8222 8227 8228 8229 8226 8231 8232 8233 8230 8235 8236 8237 8234 8239 8240 8241 8238 8243 8244 8245 8242 8247 8248 8249 8246 8251 8250 8253 8254 8252 8256 8257 8255 8259 8260 8258 8262 8263 8261 8265 8266 8264 8268 8269 8267 8271 8272 8270 8274 8275 8273 8277 8278 8276 8280 8281 8279 8283 8284 8282 8286 8287 8285 8289 8290 8288 8292 8293 8291 8295 8296 8294 8298 8299 8297 8301 8302 8300 8304 8305 8303 8307 8308 8306 8310 8311 8309 8313 8314 8312 8316 8317 8315 8319 8320 8318 8322 8323 8321 8325 8326 8324 8328 8329 8327 8331 8332 8330 8334 8335 8333 8337 8338 8336 8340 8341 8339 8343 8344 8342 8346 8347 8345 8349 8350 8348 8352 8353 8351 8355 8356 8354 8358 8359 8357 8361 8362 8360 8364 8365 8363 8367 8368 8366 8370 8371 8369 8373 8374 8372 8376 8377 8375 8379 8380 8378 8382 8383 8381 8385 8386 8384 8388 8389 8387 8391 8392 8390 8394 8395 8393 8397 8398 8396 8400 8401 8399 8403 8404 8402 8406 8407 8405 8409 8410 8408 8412 8413 8411 8415 8416 8414 8418 8419 8417 8421 8422 8420 8424 8425 8423 8427 8428 8426 8430 8431 8429 8433 8434 8432 8436 8437 8435 8439 8440 8438 8442 8443 8441 8445 8446 8444 8448 8449 8447 8451 8452 8450 8454 8455 8453 8457 8458 8456 8460 8461 8459 8463 8464 8462 8466 8467 8465 8469 8470 8468 8472 8473 8471 8475 8476 8474 8478 8479 8477 8481 8482 8480 8484 8485 8483 8487 8488 8486 8490 8491 8489 8493 8494 8492 8496 8497 8495 8499 8500 8498 8502 8503 8501 8505 8506 8504 8508 8509 8507 8511 8512 8510 8514 8515 8513 8517 8518 8516 8520 8521 8519 8523 8524 8522 8526 8527 8525 8529 8530 8528 8532 8533 8531 8535 8536 8534 8538 8539 8537 8541 8542 8540 8544 8545 8543 8547 8548 8546 8550 8551 8549 8553 8554 8552 8556 8557 8555 8559 8560 8558 8562 8563 8561 8565 8566 8564 8568 8569 8567 8571 8572 8570 8574 8575 8573 8577 8578 8576 8580 8581 8579 8583 8584 8582 8586 8587 8585 8589 8590 8588 8592 8593 8591 8595 8596 8594 8598 8599 8597 8601 8602 8600 8604 8605 8603 8607 8608 8606 8610 8611 8609 8613 8614 8612 8616 8617 8615 8619 8620 8618 8622 8623 8621 8625 8626 8624 8628 8629 8627 8631 8632 8630 8634 8635 8633 8637 8638 8636 8640 8641 8639 8643 8644 8642 8646 8647 8645 8649 8650 8648 8652 8653 8651 8655 8656 8654 8658 8659 8657 8661 8662 8660 8664 8665 8663 8667 8668 8666 8670 8671 8669 8673 8674 8672 8676 8677 8675 8679 8680 8678 8682 8683 8681 8685 8686 8684 8688 8689 8687 8691 8692 8690 8694 8695 8693 8697 8698 8696 8700 8701 8699 8703 8704 8702 8706 8707 8705 8709 8710 8708 8712 8713 8711 8715 8716 8714 8718 8719 8717 8721 8722 8720 8724 8725 8723 8727 8728 8726 8730 8731 8729 8733 8734 8732 8736 8737 8735 8739 8740 8738 8742 8743 8741 8745 8746 8744 8748 8749 8747 8751 8752 8750 8754 8755 8753 8757 8758 8756 8760 8761 8759 8763 8764 8762 8766 8767 8765 8769 8770 8768 8772 8773 8771 8775 8776 8774 8778 8779 8777 8781 8782 8780 8784 8785 8783 8787 8788 8786 8790 8791 8789 8793 8794 8792 8796 8797 8795 8799 8800 8798 8802 8803 8801 8805 8806 8804 8808 8809 8807 8811 8812 8810 8814 8815 8813 8817 8818 8816 8820 8821 8819 8823 8824 8822 8826 8827 8825 8829 8830 8828 8832 8833 8831 8835 8836 8834 8838 8839 8837 8841 8842 8840 8844 8845 8843 8847 8848 8846 8850 8851 8849 8853 8854 8852 8856 8857 8855 8859 8860 8858 8862 8863 8861 8865 8866 8864 8868 8869 8867 8871 8872 8870 8874 8875 8873 8877 8878 8876 8880 8881 8879 8883 8884 8882 8886 8887 8885 8889 8890 8888 8892 8893 8891 8895 8896 8894 8898 8899 8897 8901 8902 8900 8904 8905 8903 8907 8908 8906 8910 8911 8909 8913 8914 8912 8916 8917 8915 8919 8920 8918 8922 8923 8921 8925 8926 8924 8928 8929 8927 8931 8932 8930 8934 8935 8933 8937 8938 8936 8940 8941 8939 8943 8944 8942 8946 8947 8945 8949 8950 8948 8952 8953 8951 8955 8956 8954 8958 8959 8957 8961 8962 8960 8964 8965 8963 8967 8968 8966 8970 8971 8969 8973 8974 8972 8976 8977 8975 8979 8980 8978 8982 8983 8981 8985 8986 8984 8988 8989 8987 8991 8992 8990 8994 8995 8993 8997 8998 8996 9000 9001 8999 9003 9004 9002 9006 9007 9005 9009 9010 9008 9012 9013 9011 9015 9016 9014 9018 9019 9017 9021 9022 9020 9024 9025 9023 9027 9028 9026 9030 9031 9029 9033 9034 9032 9036 9037 9035 9039 9040 9038 9042 9043 9041 9045 9046 9044 9048 9049 9047 9051 9052 9050 9054 9055 9053 9057 9058 9056 9060 9061 9059 9063 9064 9062 9066 9067 9065 9069 9070 9068 9072 9073 9071 9075 9076 9074 9078 9079 9077 9081 9082 9080 9084 9085 9083 9087 9088 9086 9090 9091 9089 9093 9094 9092 9096 9097 9095 9099 9100 9098 9102 9103 9101 9105 9106 9104 9108 9109 9107 9111 9112 9110 9114 9115 9113 9117 9118 9116 9120 9121 9119 9123 9124 9122 9126 9127 9125 9129 9130 9128 9132 9133 9131 9135 9136 9134 9138 9139 9137 9141 9142 9140 9144 9145 9143 9147 9148 9146 9150 9151 9149 9153 9154 9152 9156 9157 9155 9159 9160 9158 9162 9163 9161 9165 9166 9164 9168 9169 9167 9171 9172 9170 9174 9175 9173 9177 9178 9176 9180 9181 9179 9183 9184 9182 9186 9187 9185 9189 9190 9188 9192 9193 9191 9195 9196 9194 9198 9199 9197 9201 9202 9200 9204 9205 9203 9207 9208 9206 9210 9211 9209 9213 9214 9212 9216 9217 9215 9219 9220 9218 9222 9223 9221 9225 9226 9224 9228 9229 9227 9231 9232 9230 9234 9235 9233 9237 9238 9236 9240 9241 9239 9243 9244 9242 9246 9247 9245 9249 9250 9248 9252 9253 9251 9255 9256 9254 9258 9259 9257 9261 9262 9260 9264 9265 9263 9267 9268 9266 9270 9271 9269 9273 9274 9272 9276 9277 9275 9279 9280 9278 9282 9283 9281 9285 9286 9284 9288 9289 9287 9291 9292 9290 9294 9295 9293 9297 9298 9296 9300 9301 9299 9303 9304 9302 9306 9307 9305 9309 9310 9308 9312 9313 9311 9315 9316 9314 9318 9319 9317 9321 9322 9320 9324 9325 9323 9327 9328 9326 9330 9331 9329 9333 9334 9332 9336 9337 9335 9339 9340 9338 9342 9343 9341 9345 9346 9344 9348 9349 9347 9351 9352 9350 9354 9355 9353 9357 9358 9356 9360 9361 9359 9363 9364 9362 9366 9367 9365 9369 9370 9368 9372 9373 9371 9375 9376 9374 9378 9379 9377 9381 9382 9380 9384 9385 9383 9387 9388 9386 9390 9391 9389 9393 9394 9392 9396 9397 9395 9399 9400 9398 9402 9403 9401 9405 9406 9404 9408 9409 9407 9411 9412 9410 9414 9415 9413 9417 9418 9416 9420 9421 9419 9423 9424 9422 9426 9427 9425 9429 9430 9428 9432 9433 9431 9435 9436 9434 9438 9439 9437 9441 9442 9440 9444 9445 9443 9447 9448 9446 9450 9451 9449 9453 9454 9452 9456 9457 9455 9459 9460 9458 9462 9463 9461 9465 9466 9464 9468 9469 9467 9471 9472 9470 9474 9475 9473 9477 9478 9476 9480 9481 9479 9483 9484 9482 9486 9487 9485 9489 9490 9488 9492 9493 9491 9495 9496 9494 9498 9499 9497 9501 9502 9500 9504 9505 9503 9507 9508 9506 9510 9511 9509 9513 9514 9512 9516 9517 9515 9519 9520 9518 9522 9523 9521 9525 9526 9524 9528 9529 9527 9531 9532 9530 9534 9535 9533 9537 9538 9536 9540 9541 9539 9543 9544 9542 9546 9547 9545 9549 9550 9548 9552 9553 9551 9555 9556 9554 9558 9559 9557 9561 9562 9560 9564 9565 9563 9567 9568 9566 9570 9571 9569 9573 9574 9572 9576 9577 9575 9579 9580 9578 9582 9583 9581 9585 9586 9584 9588 9589 9587 9591 9592 9590 9594 9595 9593 9597 9598 9596 9600 9601 9599 9603 9604 9602 9606 9607 9605 9609 9610 9608 9612 9613 9611 9615 9616 9614 9618 9619 9617 9621 9622 9620 9624 9625 9623 9627 9628 9626 9630 9631 9629 9633 9634 9632 9636 9637 9635 9639 9640 9638 9642 9643 9641 9645 9646 9644 9648 9649 9647 9651 9652 9650 9654 9655 9653 9657 9658 9656 9660 9661 9659 9663 9664 9662 9666 9667 9665 9669 9670 9668 9672 9673 9671 9675 9676 9674 9678 9679 9677 9681 9682 9680 9684 9685 9683 9687 9688 9686 9690 9691 9689 9693 9694 9692 9696 9697 9695 9699 9700 9698 9702 9703 9701 9705 9706 9704 9708 9709 9707 9711 9712 9710 9714 9715 9713 9717 9718 9716 9720 9721 9719 9723 9724 9722 9726 9727 9725 9729 9730 9728 9732 9733 9731 9735 9736 9734 9738 9739 9737 9741 9742 9740 9744 9745 9743 9747 9748 9746 9750 9751 9749 9753 9754 9752 9756 9757 9755 9759 9760 9758 9762 9763 9761 9765 9766 9764 9768 9769 9767 9771 9772 9770 9774 9775 9773 9777 9778 9776 9780 9781 9779 9783 9784 9782 9786 9787 9785 9789 9790 9788 9792 9793 9791 9795 9796 9794 9798 9799 9797 9801 9802 9800 9804 9805 9803 9807 9808 9806 9810 9811 9809 9813 9814 9812 9816 9817 9815 9819 9820 9818</clockwise_edges>\n\t\t\t<edge_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</edge_selection>\n\t\t</polyhedra>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.PGPRemesh.high.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-0.53841059992404749 -2.9603659014509289 0.0673397898595961 -0.54069475119360422 -2.9833815450896988 0.184178240926995 -0.54297890246316083 -3.0063971887284691 0.30101669199439401 -0.54526305373271766 -3.0294128323672389 0.41785514306179294 -0.54754720500227438 -3.0524284760060088 0.53469359412919193 -0.54983135627183122 -3.0754441196447786 0.65153204519659091 -0.47232587827838268 -2.9663498824669139 0.064701462407776675 -0.47461002954793929 -2.9893655261056837 0.18153991347517559 -0.47689418081749596 -3.012381169744454 0.2983783645425746 -0.47917833208705285 -3.0353968133832239 0.41521681560997353 -0.48146248335660957 -3.0584124570219937 0.53205526667737257 -0.40624115663271787 -2.9723338634828989 0.062063134955957257 -0.40852530790227437 -2.9953495071216687 0.17890158602335618 -0.41080945917183115 -3.018365150760439 0.29574003709075519 -0.41309361044138798 -3.0413807943992088 0.41257848815815412 -0.34015643498705306 -2.9783178444988838 0.059424807504137839 -0.3424405862566095 -3.0013334881376537 0.17626325857153674 -0.34472473752616634 -3.0243491317764239 0.29310170963893578 -0.34700888879572311 -3.0473647754151938 0.40994016070633471 -0.27407171334138819 -2.9843018255148688 0.056786480052318414 -0.27635586461094469 -3.0073174691536386 0.17362493111971733 -0.27864001588050147 -3.0303331127924089 0.29046338218711631 -0.20798699169572335 -2.9902858065308537 0.054148152600498996 -0.21027114296527991 -3.0133014501696236 0.17098660366789789 -0.1419022700500584 -2.9962697875468387 0.051509825148679578 -0.14418642131961504 -3.0192854311856085 0.16834827621607848 -0.075817548404393531 -3.0022537685628237 0.04887149769686016 -0.0078473668123311708 -3.008421121760243 0.046221459486727651 -0.0038321756513216079 -3.032049413875213 0.1630207847817246 -0.074315983989324819 -3.0256375955431207 0.16568643534966263 -0.070300792828315306 -3.0492658876580903 0.28248576064465963 -0.066285601667305641 -3.0728941797730602 0.39928508593965661 -0.062270410506296073 -3.0965224718880302 0.51608441123465354 -0.058255219345286442 -3.1201507640029997 0.63288373652965058 -0.05424002818427686 -3.1437790561179697 0.7496830618246475 -0.14078460116631863 -3.0428540693259984 0.28515141121259763 -0.13676941000530898 -3.0664823614409684 0.40195073650759461 -0.13275421884429939 -3.0901106535559384 0.51875006180259153 -0.12873902768328979 -3.1137389456709079 0.63554938709758857 -0.12472383652228017 -3.1373672377858779 0.75234871239258549 -0.21126840950432191 -3.0364422509939062 0.28781706178053568 -0.20725321834331223 -3.0600705431088766 0.4046163870755326 -0.20323802718230261 -3.0836988352238466 0.52141571237052953 -0.19922283602129304 -3.1073271273388161 0.63821503766552656 -0.19520764486028339 -3.1309554194537861 0.75501436296052349 -0.2777370266813155 -3.0536587247767848 0.4072820376434706 -0.27372183552030582 -3.0772870168917543 0.52408136293846752 -0.26970664435929631 -3.1009153090067243 0.64088068823346456 -0.26569145319828663 -3.1245436011216943 0.75768001352846148 -0.3442056438583091 -3.0708751985596625 0.52674701350640551 -0.34019045269729958 -3.0945034906746325 0.64354633880140255 -0.33617526153628985 -3.1181317827896025 0.76034566409639948 -0.41468945219631248 -3.0644633802275703 0.52941266407434351 -0.41067426103530302 -3.0880916723425407 0.64621198936934054 -0.40665906987429323 -3.1117199644575102 0.76301131466433747 -0.48115806937330624 -3.0816798540104484 0.64887763993727854 -1.1166465747020586 -2.7996188087231375 0.089209231478507817 -1.1248559628925476 -2.8213803326705982 0.20644593878360659 -1.1330653510830364 -2.843141856618058 0.32368264608870545 -1.1412747392735254 -2.8649033805655186 0.44091935339380428 -1.1494841274640142 -2.8866649045129784 0.55815606069890311 -1.1576935156545032 -2.9084264284604386 0.67539276800400183 -1.0529848446780663 -2.8184374297963291 0.08682622393577874 -1.0611942328685553 -2.8401989537437897 0.20406293124087752 -1.0694036210590441 -2.8619604776912495 0.32129963854597637 -1.0776130092495331 -2.8837220016387102 0.4385363458510752 -1.0858223974400221 -2.90548352558617 0.55577305315617398 -0.98932311465407419 -2.8372560508695206 0.084443216393049664 -0.99753250284456307 -2.8590175748169813 0.20167992369814844 -1.005741891035052 -2.880779098764441 0.3189166310032473 -1.013951279225541 -2.9025406227119017 0.43615333830834613 -0.92566138463008207 -2.8560746719427126 0.082060208850320587 -0.93387077282057085 -2.8778361958901728 0.19929691615541936 -0.94208016101105985 -2.899597719837633 0.31653362346051822 -0.95028954920154884 -2.9213592437850933 0.43377033076561705 -0.86199965460608985 -2.8748932930159041 0.079677201307591511 -0.87020904279657874 -2.8966548169633644 0.19691390861269029 -0.87841843098706773 -2.9184163409108246 0.31415061591778914 -0.79833792458209751 -2.8937119140890961 0.077294193764862434 -0.8065473127725864 -2.9154734380365563 0.19453090106996121 -0.73467619455810529 -2.9125305351622877 0.074911186222133372 -0.74288558274859418 -2.9342920591097479 0.19214789352723213 -0.67101446453411318 -2.9313491562354796 0.072528178679404295 -1.0914597246446986 -2.9279898010634482 0.67283827102508209 -1.0213239706861861 -2.9245444158640899 0.55333425974706962 -1.0235457479738372 -2.9480396787875849 0.67017174945059488 -0.95340999401532467 -2.9445942935882266 0.55066773817258241 -0.95563177130297583 -2.968089556511722 0.66750522787610767 -0.88327424005681254 -2.9411489083888682 0.43116372689457005 -0.88549601734446326 -2.9646441713123637 0.5480012165980952 -0.88771779463211431 -2.9881394342358587 0.66483870630162045 -0.81313848609830019 -2.9377035231895099 0.31165971561655764 -0.81536026338595113 -2.9611987861130054 0.42849720532008284 -0.81758204067360185 -2.9846940490365004 0.54533469502360798 -0.81980381796125279 -3.0081893119599958 0.66217218472713324 -0.74522450942743879 -2.957753400913647 0.30899319404207043 -0.74744628671508972 -2.9812486638371425 0.42583068374559563 -0.74966806400274044 -3.0047439267606375 0.54266817344912077 -0.75188984129039138 -3.0282391896841325 0.65950566315264603 -0.67508875546892666 -2.9543080157142887 0.18948918276405802 -0.67731053275657738 -2.9778032786377842 0.30632667246758322 -0.67953231004422832 -3.0012985415612792 0.42316416217110847 -0.68175408733187903 -3.0247938044847742 0.54000165187463367 -0.68397586461952986 -3.0482890674082697 0.65683914157815881 -0.60495300151041442 -2.9508626305149304 0.069985171486045647 -0.60717477879806525 -2.9743578934384254 0.18682266118957083 -0.60939655608571597 -2.9978531563619208 0.30366015089309606 -0.6116183333733668 -3.0213484192854163 0.42049764059662126 -0.61384011066101751 -3.0448436822089113 0.53733513030014646 -0.61606188794866845 -3.0683389451324063 0.6541726200036716 -1.6552373654165138 -2.5254317022736115 0.11089026552782905 -1.668895580816613 -2.544539932966098 0.22854552097242287 -1.6825537962167123 -2.5636481636585842 0.34620077641701674 -1.6962120116168116 -2.5827563943510707 0.46385603186161062 -1.7098702270169106 -2.6018646250435573 0.58151128730620449 -1.7235284424170099 -2.6209728557360439 0.69916654275079837 -1.5961642525066022 -2.5564744444299561 0.10851791162835132 -1.6098224679067015 -2.5755826751224427 0.22617316707294516 -1.6234806833068007 -2.5946909058149288 0.34382842251753903 -1.6371388987069 -2.6137991365074154 0.46148367796213291 -1.650797114106999 -2.6329073671999019 0.57913893340672684 -1.5370911395966904 -2.5875171865863007 0.1061455577288736 -1.5507493549967897 -2.6066254172787873 0.22380081317346742 -1.5644075703968889 -2.6257336479712734 0.34145606861806133 -1.5780657857969882 -2.64484187866376 0.4591113240626552 -1.4780180266867788 -2.6185599287426449 0.10377320382939588 -1.4916762420868781 -2.6376681594351314 0.22142845927398971 -1.5053344574869774 -2.6567763901276176 0.33908371471858362 -1.5189926728870764 -2.6758846208201046 0.45673897016317744 -1.4189449137768673 -2.6496026708989895 0.10140084992991816 -1.4326031291769665 -2.6687109015914761 0.21905610537451201 -1.4462613445770656 -2.6878191322839622 0.33671136081910591 -1.3598718008669555 -2.6806454130553337 0.099028496030440435 -1.373530016267055 -2.6997536437478202 0.21668375147503427 -1.3007986879570437 -2.7116881552116783 0.096656142130962713 -1.2417255750471321 -2.7427308973680224 0.094283788231485005 -1.6621989752053419 -2.6531823800542713 0.6966192595276397 -1.5909727013529742 -2.6643386136153753 0.57670833317000048 -1.5991894325175133 -2.6862606873001953 0.69394172439034263 -1.5279631586651456 -2.6974169208612992 0.5740307980327034 -1.5361798898296848 -2.7193389945461193 0.69126418925304556 -1.456736884812778 -2.7085731544224037 0.45411987167506435 -1.4649536159773171 -2.7304952281072232 0.57135326289540633 -1.4731703471418562 -2.7524173017920432 0.68858665411574849 -1.3855106109604103 -2.7197293879835076 0.33420894531742518 -1.3937273421249494 -2.7416514616683276 0.45144233653776727 -1.4019440732894886 -2.7635735353531472 0.56867572775810926 -1.4101608044540277 -2.7854956090379668 0.68590911897845142 -1.3142843371080426 -2.7308856215446125 0.21429801895978601 -1.3225010682725817 -2.7528076952294316 0.33153141018012811 -1.3307177994371209 -2.7747297689142516 0.4487648014004702 -1.33893453060166 -2.7966518425990712 0.56599819262081219 -1.3471512617661991 -2.8185739162838903 0.68323158384115434 -1.2512747944202138 -2.7639639287905364 0.21162048382248896 -1.259491525584753 -2.7858860024753556 0.32885387504283103 -1.2677082567492921 -2.8078080761601756 0.44608726626317313 -1.2759249879138312 -2.8297301498449952 0.56332065748351523 -1.2841417190783704 -2.8516522235298143 0.68055404870385738 -1.1800485205678461 -2.7751201623516404 0.091709557464849892 -1.1882652517323853 -2.79704223603646 0.20894294868519192 -1.1964819828969244 -2.8189643097212795 0.32617633990553402 -1.2046987140614636 -2.8408863834060991 0.44340973112587612 -1.2129154452260027 -2.8628084570909187 0.56064312234621816 -1.2211321763905418 -2.8847305307757378 0.67787651356656031 -2.1129945415441083 -2.1318897257256451 0.014591278738084299 -2.1310275133510403 -2.1473132962213097 0.13261118499226465 -2.1490604851579729 -2.1627368667169748 0.25063109124644484 -2.1670934569649045 -2.1781604372126395 0.36865099750062508 -2.185126428771837 -2.1935840077083046 0.48667090375480532 -2.2031594005787691 -2.2090075782039693 0.60469081000898561 -2.2211923723857012 -2.224431148699634 0.72271071626316585 -2.0609128193177426 -2.1740238857504801 0.01221624535129882 -2.0789457911246751 -2.1894474562461448 0.13023615160547916 -2.0969787629316077 -2.2048710267418099 0.24825605785965935 -2.1150117347385393 -2.2202945972374746 0.36627596411383961 -2.1330447065454714 -2.2357181677331392 0.48429587036801985 -2.1510776783524035 -2.2511417382288039 0.60231577662220015 -2.008831097091377 -2.2161580457753152 0.0098412119645133397 -2.0268640688983095 -2.2315816162709798 0.12786111821869367 -2.044897040705242 -2.247005186766645 0.24588102447287385 -2.0629300125121737 -2.2624287572623096 0.36390093072705415 -2.0809629843191058 -2.2778523277579743 0.48192083698123439 -1.9567493748650115 -2.2582922058001498 0.0074661785777278633 -1.9747823466719441 -2.2737157762958149 0.12548608483190818 -1.9928153184788766 -2.2891393467914796 0.24350599108608836 -2.0108482902858085 -2.3045629172871442 0.36152589734026869 -2.0288812620927406 -2.3199864877828089 0.47954580359444893 -1.9046676526386461 -2.3004263658249844 0.0050911451909423861 -1.9227006244455787 -2.3158499363206499 0.1231110514451227 -1.9407335962525112 -2.3312735068163146 0.24113095769930287 -1.958766568059443 -2.3466970773119793 0.35915086395348317 -1.8525859304122809 -2.3425605258498194 0.0027161118041569088 -1.8706189022192132 -2.3579840963454846 0.12073601805833722 -1.8886518740261455 -2.3734076668411492 0.23875592431251741 -1.8005042081859155 -2.3846946858746545 0.0003410784173714257 -1.8185371799928478 -2.4001182563703196 0.11836098467155175 -1.7664554577664824 -2.4422524163951542 0.11598595128476627 -2.1673882475992574 -2.2679427296925221 0.72019464136074607 -2.0984525735735811 -2.2937104462151763 0.59989624754053816 -2.1120689078656105 -2.3126660418380234 0.71755449081096101 -2.0431332338399342 -2.3384337583606771 0.5972560969907531 -2.0567495681319636 -2.3573893539835242 0.71491434026117595 -1.9741975598142576 -2.3642014748833313 0.47695770317054514 -1.9878138941062873 -2.383157070506178 0.59461594644096805 -2.0014302283983167 -2.4021126661290251 0.71227418971139089 -1.905261885788581 -2.3899691914059851 0.35665930935033718 -1.9188782200806107 -2.4089247870288322 0.47431755262076003 -1.9324945543726404 -2.4278803826516793 0.59197579589118299 -1.9461108886646699 -2.4468359782745264 0.70963403916160583 -1.8363262117629044 -2.4157369079286393 0.2363609155301292 -1.8499425460549339 -2.4346925035514864 0.35401915880055207 -1.8635588803469636 -2.4536480991743335 0.47167740207097492 -1.8771752146389933 -2.4726036947971806 0.58933564534139782 -1.8907915489310227 -2.4915592904200277 0.70699388861182078 -1.7810068720292576 -2.4604602200741401 0.23372076498034411 -1.794623206321287 -2.4794158156969872 0.35137900825076701 -1.8082395406133167 -2.4983714113198343 0.46903725152118986 -1.8218558749053464 -2.5173270069426814 0.58669549479161276 -1.8354722091973759 -2.5362826025655285 0.70435373806203561 -1.712071198003581 -2.4862279365967943 0.11342237116013619 -1.7256875322956107 -2.5051835322196414 0.23108061443055899 -1.7393038665876401 -2.5241391278424881 0.3487388577009819 -1.7529202008796698 -2.5430947234653352 0.46639710097140474 -1.7665365351716993 -2.5620503190881823 0.5840553442418277 -1.780152869463729 -2.5810059147110298 0.70171358751225055 -2.4588206517709281 -1.7205143932318667 0.033455473091964588 -2.4799546093485056 -1.7316819330478106 0.15177244227857839 -2.5010885669260823 -1.7428494728637547 0.270089411465192 -2.5222225245036594 -1.7540170126796986 0.38840638065180572 -2.543356482081236 -1.7651845524956427 0.50672334983841938 -2.5644904396588131 -1.7763520923115863 0.6250403190250331 -2.4158749752891446 -1.7721097170321922 0.031102761653575582 -2.4370089328667222 -1.7832772568481361 0.14941973084018939 -2.4581428904442988 -1.79444479666408 0.267736700026803 -2.4792768480218759 -1.8056123364800241 0.38605366921341672 -2.5004108055994525 -1.8167798762959682 0.50437063840003038 -2.3729292988073611 -1.8237050408325177 0.028750050215186569 -2.3940632563849382 -1.8348725806484616 0.14706701940180036 -2.4151972139625149 -1.8460401204644055 0.265383988588414 -2.4363311715400919 -1.8572076602803496 0.38370095777502766 -2.4574651291176686 -1.8683752000962937 0.50201792696164138 -2.3299836223255777 -1.8753003646328432 0.026397338776797563 -2.3511175799031547 -1.8864679044487871 0.14471430796341136 -2.3722515374807314 -1.897635444264731 0.263031277150025 -2.3933854950583084 -1.9088029840806751 0.38134824633663866 -2.2870379458437942 -1.9268956884331687 0.024044627338408557 -2.3081719034213712 -1.9380632282491126 0.14236159652502234 -2.3293058609989479 -1.9492307680650565 0.260678565711636 -2.2440922693620102 -1.9784910122334942 0.021691915900019548 -2.2652262269395873 -1.9896585520494381 0.14000888508663334 -2.2011465928802263 -2.0300863360338197 0.019339204461630535 -2.2222805504578034 -2.0412538758497636 0.13765617364824431 -2.1582009163984428 -2.0816816598341448 0.016986493023241532 -2.5843942941019091 -1.7889844500890628 0.7432481121186818 -2.5211757652047515 -1.8283868222416997 0.62265485768478945 -2.5390228882159258 -1.8434683544494146 0.74068010844054688 -2.4758043593187682 -1.8828707266020515 0.62008685400665453 -2.4936514823299425 -1.8979522588097664 0.73811210476241196 -2.4125858304216101 -1.9222730987546885 0.49949359957276218 -2.4304329534327849 -1.9373546309624032 0.61751885032851961 -2.4482800764439592 -1.9524361631701181 0.73554410108427704 -2.3493673015244521 -1.9616754709073256 0.37890034513886983 -2.3672144245356268 -1.9767570031150403 0.4969255958946272 -2.3850615475468016 -1.991838535322755 0.61495084665038469 -2.4029086705579759 -2.0069200675304697 0.73297609740614211 -2.286148772627294 -2.0010778430599627 0.25830709070497754 -2.3039958956384687 -2.0161593752676774 0.37633234146073485 -2.3218430186496435 -2.0312409074753921 0.49435759221649223 -2.3396901416608182 -2.0463224396831068 0.61238284297224976 -2.3575372646719925 -2.0614039718908215 0.73040809372800719 -2.2407773667413111 -2.0555617474203145 0.25573908702684256 -2.2586244897524854 -2.0706432796280292 0.37376433778259988 -2.2764716127636602 -2.0857248118357439 0.4917895885383573 -2.2943187357748349 -2.1008063440434586 0.60981483929411473 -2.3121658587860097 -2.1158878762511732 0.72784009004987216 -2.1775588378441531 -2.0949641195729516 0.13514583259295024 -2.1954059608553278 -2.1100456517806663 0.25317108334870758 -2.2132530838665021 -2.125127183988381 0.3711963341044649 -2.2311002068776769 -2.1402087161960957 0.48922158486022232 -2.2489473298888516 -2.1552902484038103 0.60724683561597981 -2.2667944529000263 -2.170371780611525 0.72527208637173723 -2.7586619152233469 -1.1951099965802634 0.054251729525494771 -2.7817060521319155 -1.2017824772920203 0.17280672104617792 -2.8047501890404845 -1.2084549580037773 0.29136171256686094 -2.8277943259490534 -1.2151274387155342 0.40991670408754399 -2.8508384628576224 -1.221799919427291 0.52847169560822704 -2.8738825997661914 -1.2284724001390481 0.64702668712891009 -2.7265913910617239 -1.2541453070776432 0.051955119060896053 -2.7496355279702924 -1.2608177877894002 0.17051011058157919 -2.7726796648788614 -1.2674902685011571 0.28906510210226222 -2.7957238017874304 -1.2741627492129139 0.40762009362294527 -2.8187679386959994 -1.280835229924671 0.52617508514362832 -2.6945208669001008 -1.3131806175750231 0.049658508596297335 -2.7175650038086694 -1.3198530982867802 0.16821350011698047 -2.7406091407172384 -1.3265255789985371 0.28676849163766349 -2.7636532776258074 -1.3331980597102939 0.40532348315834654 -2.7866974145343764 -1.339870540422051 0.52387847467902959 -2.6624503427384778 -1.3722159280724031 0.047361898131698617 -2.6854944796470464 -1.37888840878416 0.16591688965238177 -2.7085386165556153 -1.3855608894959168 0.28447188117306477 -2.7315827534641843 -1.3922333702076739 0.40302687269374782 -2.6303798185768548 -1.4312512385697829 0.045065287667099899 -2.6534239554854233 -1.4379237192815397 0.16362027918778305 -2.6764680923939923 -1.4445961999932968 0.28217527070846604 -2.5983092944152317 -1.4902865490671626 0.04276867720250118 -2.6213534313238003 -1.4969590297789197 0.16132366872318432 -2.5662387702536087 -1.5493218595645426 0.040472066737902462 -2.5892829071621772 -1.5559943402762997 0.15902705825858562 -2.5341682460919852 -1.6083571700619226 0.038175456273303744 -2.8415632190642341 -1.2879624283301316 0.64470421498189434 -2.8623582694200884 -1.298744503464506 0.76302547681206379 -2.8078300299569436 -1.3500358071398 0.64223481696373985 -2.8286250803127979 -1.3608178822741743 0.7605560787939093 -2.7533017904937989 -1.4013271108150938 0.52144415711541592 -2.7740968408496536 -1.4121091859494683 0.63976541894558536 -2.7948918912055079 -1.4228912610838427 0.75808668077575481 -2.6987735510306541 -1.4526184144903875 0.40065349726709204 -2.7195686013865088 -1.4634004896247621 0.51897475909726154 -2.7403636517423635 -1.4741825647591367 0.63729602092743098 -2.7611587020982178 -1.484964639893511 0.75561728275760043 -2.6442453115675089 -1.5039097181656813 0.27986283741876822 -2.665040361923364 -1.5146917933000559 0.39818409924893761 -2.6858354122792187 -1.5254738684344304 0.51650536107910705 -2.706630462635073 -1.536255943568805 0.63482662290927649 -2.7274255129909277 -1.5470380187031794 0.75314788473944594 -2.6105121224602188 -1.5659830969753499 0.27739343940061378 -2.6313071728160735 -1.5767651721097242 0.39571470123078317 -2.6521022231719282 -1.5875472472440988 0.51403596306095267 -2.6728972735277825 -1.5983293223784736 0.63235722489112212 -2.6936923238836372 -1.6091113975128479 0.75067848672129156 -2.5559838829970745 -1.6172744006506437 0.15660277955228991 -2.5767789333529287 -1.6280564757850182 0.27492404138245935 -2.5975739837087835 -1.6388385509193926 0.39324530321262874 -2.6183690340646382 -1.6496206260537671 0.51156656504279818 -2.6391640844204924 -1.6604027011881419 0.62988782687296763 -2.6599591347763472 -1.6711847763225163 0.74820908870313707 -2.5014556435339297 -1.6685657043259374 0.035812119703965931 -2.5222506938897844 -1.6793477794603118 0.15413338153413547 -2.5430457442456387 -1.6901298545946866 0.27245464336430486 -2.5638407946014934 -1.7009119297290609 0.3907759051944743 -2.5846358449573477 -1.7116940048634355 0.5090971670246438 -2.6054308953132024 -1.7224760799978103 0.62741842885481325 -2.6262259456690566 -1.7332581551321846 0.74573969068498269 -2.9474089411075965 -0.61923255166568325 0.074229377579573833 -2.9713328621290964 -0.62134398869152685 0.19297725599103174 -2.9952567831505967 -0.62345542571737034 0.3117251344024895 -3.0191807041720966 -0.62556686274321405 0.43047301281394729 -3.0431046251935965 -0.62767829976905776 0.54922089122540507 -3.0670285462150964 -0.62978973679490147 0.66796876963686291 -2.9274872148603155 -0.68340421261942752 0.072027591792479209 -2.9514111358818149 -0.68551564964527123 0.19077547020393712 -2.9753350569033152 -0.68762708667111472 0.30952334861539488 -2.9992589779248151 -0.68973852369695843 0.42827122702685266 -3.023182898946315 -0.69184996072280214 0.54701910543831045 -2.907565488613034 -0.7475758735731719 0.069825806005384586 -2.9314894096345339 -0.74968731059901561 0.1885736844168425 -2.9554133306560337 -0.7517987476248591 0.3073215628283002 -2.9793372516775336 -0.7539101846507027 0.42606944123975804 -3.0032611726990339 -0.75602162167654641 0.54481731965121583 -2.8876437623657525 -0.81174753452691639 0.067624020218289949 -2.9115676833872524 -0.8138589715527601 0.18637189862974785 -2.9354916044087522 -0.81597040857860359 0.30511977704120558 -2.9594155254302521 -0.81808184560444719 0.42386765545266336 -2.8677220361184714 -0.87591919548066066 0.065422234431195325 -2.8916459571399709 -0.87803063250650437 0.18417011284265322 -2.9155698781614712 -0.88014206953234786 0.3029179912541109 -2.8478003098711899 -0.94009085643440504 0.063220448644100702 -2.8717242308926898 -0.94220229346024864 0.18196832705555857 -2.8278785836239089 -1.0042625173881494 0.061018662857006072 -2.8518025046454083 -1.0063739544139929 0.17976654126846395 -2.8079568573766274 -1.0684341783418938 0.058816877069911434 -3.0469567338561383 -0.69444139163020835 0.66574531935605363 -3.0260575890671118 -0.76173895753625831 0.66340244604515275 -2.9825580636742468 -0.822692241049363 0.54250274353273842 -3.0051584442780852 -0.82903652344230827 0.66105957273425187 -2.9390585382813819 -0.88364552456246748 0.42160304102032409 -2.9616589188852203 -0.88998980695541308 0.54015987022183753 -2.9842592994890587 -0.89633408934835823 0.65871669942335087 -2.8955590128885174 -0.94459880807557206 0.30070333850790976 -2.9181593934923553 -0.95094309046851755 0.41926016770942315 -2.9407597740961937 -0.95728737286146304 0.53781699691093665 -2.9633601547000321 -0.9636316552544083 0.65637382611244999 -2.8746598680994908 -1.0118963739816222 0.29836046519700882 -2.8972602487033288 -1.0182406563745676 0.41691729439852221 -2.9198606293071672 -1.024584938767513 0.53547412360003566 -2.9424610099110056 -1.0309292211604584 0.65403095280154899 -2.8311603427066259 -1.0728496574947268 0.17746076268459457 -2.8537607233104643 -1.0791939398876722 0.29601759188610788 -2.8763611039143027 -1.0855382222806176 0.41457442108762133 -2.8989614845181406 -1.091882504673563 0.53313125028913477 -2.921561865121979 -1.0982267870665083 0.65168807949064811 -2.7876608173137614 -1.1338029410078314 0.056561060172180169 -2.8102611979175993 -1.140147223400777 0.17511788937369366 -2.8328615785214377 -1.1464915057937224 0.29367471857520699 -2.8554619591252761 -1.1528357881866678 0.41223154777672039 -2.8780623397291145 -1.1591800705796131 0.53078837697823378 -2.9006627203329529 -1.1655243529725585 0.64934520617974711 -3.0168775422157328 -0.016338240469697674 0.09293900973334307 -3.0407689086126877 -0.013911212281199459 0.21184727720943072 -3.0646602750096426 -0.01148418409270141 0.33075554468551821 -3.0885516414065974 -0.0090571559042033067 0.44966381216160578 -3.1124430078035519 -0.0066301277157052863 0.56857207963769341 -3.1363343742005068 -0.004203099527207238 0.68748034711378092 -3.0098869083294733 -0.083155982373445736 0.090879506232383611 -3.0337782747264281 -0.080728954184947521 0.20978777370847126 -3.057669641123383 -0.078301925996449473 0.32869604118455875 -3.0815610075203379 -0.075874897807951397 0.44760430866064632 -3.1054523739172923 -0.073447869619453376 0.566512576136734 -3.0028962744432137 -0.14997372427719374 0.088820002731424152 -3.0267876408401686 -0.14754669608869553 0.20772827020751181 -3.0506790072371235 -0.14511966790019751 0.32663653768359929 -3.0745703736340784 -0.14269263971169949 0.44554480515968692 -3.0984617400310328 -0.14026561152320144 0.5644530726357746 -2.9959056405569542 -0.21679146618094186 0.086760499230464694 -3.0197970069539091 -0.21436443799244367 0.20566876670655235 -3.043688373350864 -0.21193740980394565 0.32457703418263983 -3.0675797397478184 -0.20951038161544769 0.44348530165872746 -2.9889150066706947 -0.28360920808468992 0.084700995729505235 -3.0128063730676495 -0.28118217989619176 0.20360926320559289 -3.0366977394646044 -0.27875515170769372 0.32251753068168043 -2.9819243727844351 -0.35042694998843793 0.082641492228545763 -3.00581573918139 -0.34799992179993983 0.20154975970463343 -2.974933738898176 -0.41724469189218599 0.080581988727586304 -2.9988251052951305 -0.41481766370368783 0.19949025620367397 -2.9679431050119165 -0.48406243379593417 0.078522485226626831 -3.1292927111595272 -0.071502558486089551 0.6854028247938514 -3.1219653314685063 -0.14149919289332064 0.68322441354832453 -3.0912033779937329 -0.20961071679801635 0.56229903209783538 -3.1146379517774854 -0.21149582730055183 0.68104600230279766 -3.0604414245189591 -0.27772224070271184 0.44137365064734635 -3.083875998302712 -0.27960735120524743 0.56012062085230852 -3.1073105720864644 -0.28149246170778291 0.67886759105727079 -3.0296794710441861 -0.34583376460740739 0.32044826919685721 -3.0531140448279386 -0.34771887510994293 0.43919523940181948 -3.076548618611691 -0.34960398561247852 0.55794220960678165 -3.0999831923954435 -0.35148909611501405 0.67668917981174392 -3.0223520913531652 -0.41583039901463847 0.31826985795133034 -3.0457866651369181 -0.41771550951717396 0.43701682815629261 -3.0692212389206706 -0.4196006200197096 0.55576379836125478 -3.092655812704423 -0.42148573052224514 0.67451076856621706 -2.9915901378783918 -0.48394192291933413 0.19734447650084133 -3.0150247116621447 -0.48582703342186973 0.31609144670580352 -3.0384592854458972 -0.48771214392440521 0.43483841691076575 -3.0618938592296496 -0.48959725442694085 0.55358538711572791 -3.0853284330134021 -0.49148236492947639 0.67233235732069019 -2.9608281844036184 -0.55205344682402979 0.076419095050352159 -2.9842627581873709 -0.55393855732656527 0.19516606525531449 -3.0076973319711238 -0.55582366782910075 0.31391303546027666 -3.0311319057548762 -0.55770877833163623 0.43266000566523893 -3.0545664795386291 -0.55959388883417194 0.55140697587020115 -3.0780010533223816 -0.56147899933670753 0.67015394607516332 -2.9638244027796907 0.58902377181540444 0.10978794815125011 -2.9700424477475709 0.52214689531443648 0.10793410439230401 -2.9930464273400648 0.52900750959071818 0.22697995072351948 -3.0160504069325582 0.53586812386699989 0.3460257970547348 -3.0390543865250521 0.54272873814328149 0.46507164338595014 -3.062058366117546 0.54958935241956319 0.58411748971716548 -2.976260492715451 0.45527001881346851 0.10608026063335792 -2.9992644723079449 0.46213063308975022 0.22512610696457339 -3.0222684519004384 0.46899124736603193 0.3441719532957887 -3.0452724314929323 0.47585186164231358 0.46321779962700405 -3.0682764110854266 0.48271247591859523 0.58226364595821944 -2.9824785376833312 0.38839314231250055 0.10422641687441184 -3.005482517275825 0.39525375658878226 0.22327226320562729 -3.0284864968683185 0.40211437086506402 0.34231810953684261 -3.0514904764608128 0.40897498514134567 0.46136395586805795 -2.9886965826512113 0.32151626581153242 0.10237257311546574 -3.0117005622437052 0.32837688008781418 0.2214184194466812 -3.0347045418361991 0.33523749436409589 0.34046426577789651 -2.9949146276190914 0.25463938931056451 0.10051872935651965 -3.0179186072115853 0.26150000358684627 0.2195645756877351 -3.0011326725869716 0.18776251280959658 0.098664885597573568 -3.0241366521794659 0.19462312708587837 0.21771073192878901 -3.0073507175548517 0.12088563630862867 0.096811041838627473 -3.0851005332093266 0.5560347978095761 0.70314974681314246 -3.0916109217791043 0.48597960458521083 0.70119187094811841 -3.0747203430755845 0.41337978887193916 0.58032941903880486 -3.0981213103488821 0.41592441136084546 0.69923399508309436 -3.0578297643720647 0.34077997315866759 0.45946696712949137 -3.0812307316453622 0.34332459564757384 0.57837154317378081 -3.1046316989186598 0.34586921813648014 0.69727611921807031 -3.0409391856685448 0.26818015744539597 0.33860451522017787 -3.0643401529418424 0.27072477993430227 0.45750909126446726 -3.0877411202151399 0.27326940242320852 0.57641366730875676 -3.1111420874884375 0.27581402491211482 0.69531824335304615 -3.0474495742383225 0.19812496422103065 0.33664663935515382 -3.0708505415116201 0.20066958670993693 0.45555121539944315 -3.0942515087849176 0.20321420919884317 0.57445579144373271 -3.1176524760582152 0.20575883168774947 0.6933603674880221 -3.0305589955348027 0.12552514850775906 0.21578418744584038 -3.0539599628080998 0.12806977099666533 0.33468876349012971 -3.0773609300813978 0.13061439348557161 0.45359333953441905 -3.1007618973546949 0.13315901597447785 0.57249791557870855 -3.1241628646279929 0.13570363846338415 0.69140249162299794 -3.0136684168312824 0.052925332794487447 0.094921735536526858 -3.0370693841045799 0.055469955283393796 0.2138263115808163 -3.0604703513778775 0.058014577772300062 0.33273088762510566 -3.083871318651175 0.060559200261206328 0.451635463669395 -3.1072722859244726 0.063103822750112573 0.5705400397136845 -3.1306732531977701 0.065648445239018846 0.68944461575797389 -2.7878864024412615 1.0966762376472219 0.0032081991396141637 -2.809176969966396 1.1077550327165964 0.12237599442893085 -2.8304675374915313 1.1188338277859713 0.24154378971824769 -2.8517581050166658 1.1299126228553455 0.36071158500756439 -2.8730486725418007 1.1409914179247203 0.47987938029688121 -2.8943392400669357 1.152070212994095 0.59904717558619802 -2.8070822261504311 1.0323336279056734 0.0016501863650422483 -2.8283727936755656 1.0434124229750479 0.12081798165435895 -2.849663361200701 1.0544912180444228 0.23998577694367579 -2.8709539287258354 1.0655700131137971 0.35915357223299249 -2.8922444962509704 1.0766488081831718 0.4783213675223093 -2.9135350637761053 1.0877276032525465 0.59748916281162612 -2.8262780498596007 0.96799101816412481 9.217359047033311e-005 -2.8475686173847352 0.97906981323349929 0.11925996887978704 -2.8688591849098706 0.99014860830287421 0.23842776416910388 -2.8901497524350055 1.0012274033722486 0.35759555945842059 -2.9114403199601404 1.0123061984416233 0.4767633547477374 -2.8667644410939053 0.91472720349195069 0.11770195610521512 -2.8880550086190406 0.9258059985613255 0.23686975139453198 -2.9093455761441751 0.93688479363069999 0.35603754668384868 -2.8859602648030749 0.8503845937504021 0.11614394333064321 -2.9072508323282102 0.86146338881977691 0.23531173861996008 -2.9051560885122445 0.7860419840088535 0.1145859305560713 -2.9264466560373799 0.79712077907822831 0.23375372584538814 -2.9243519122214146 0.72169937426730502 0.11302791778149938 -2.915701205136398 1.1629086182352899 0.71820760406505435 -2.9358159430129604 1.0954720978993002 0.71655477757434949 -2.933392858396219 1.0211561903351887 0.59586284776871867 -2.9559306808895229 1.0280355775633105 0.71490195108364474 -2.930969773779478 0.94684028277107712 0.47517091796308769 -2.9535075962727815 0.95371966999919899 0.59421002127801392 -2.9760454187660854 0.96059905722732086 0.71324912459293988 -2.9285466891627365 0.87252437520696557 0.35447898815745676 -2.9510845116560405 0.87940376243508744 0.47351809147238288 -2.973622334149344 0.88628314966320931 0.59255719478730906 -2.9961601566426479 0.89316253689133118 0.71159629810223513 -2.948661427039299 0.80508785487097589 0.35282616166675196 -2.9711992495326029 0.81196724209909776 0.47186526498167808 -2.9937370720259064 0.81884662932721963 0.59090436829660431 -3.0162748945192104 0.8257260165553415 0.70994347161153026 -2.9462383424225576 0.73077194730686446 0.23213423186112117 -2.9687761649158615 0.73765133453498632 0.35117333517604721 -2.9913139874091654 0.74453072176310819 0.47021243849097327 -3.0138518099024689 0.75141010899123006 0.58925154180589945 -3.0363896323957729 0.75828949621935193 0.70829064512082551 -2.9438152578058161 0.65645603974275268 0.11144230205549019 -2.96635308029912 0.66333542697087466 0.23048140537041639 -2.988890902792424 0.67021481419899653 0.3495205086853424 -3.0114287252857279 0.6770942014271184 0.46855961200026852 -3.0339665477790319 0.68397358865524027 0.5875987153151947 -3.0565043702723358 0.69085297588336214 0.70663781863012065 -2.9864678181756825 0.59589890663488498 0.22882857887971159 -3.009005640668986 0.60277829386300685 0.34786768219463765 -3.0315434631622904 0.60965768109112883 0.46690678550956372 -3.0540812856555943 0.6165370683192507 0.58594588882448984 -3.0766191081488983 0.62341645554737257 0.7049849921394159 -2.5146654473806827 1.6345702850965476 0.013709456328590598 -2.5334496909456954 1.6495167753537459 0.13298911205465391 -2.5522339345107081 1.6644632656109439 0.25226876778071738 -2.5710181780757209 1.6794097558681422 0.37154842350678063 -2.5898024216407332 1.6943562461253403 0.49082807923284405 -2.6085866652057459 1.7093027363825384 0.61010773495890747 -2.6273709087707586 1.7242492266397367 0.72938739068497072 -2.5461081752796724 1.5752714490316175 0.012581583918526162 -2.5648924188446851 1.5902179392888158 0.13186123964458948 -2.5836766624096978 1.6051644295460139 0.25114089537065293 -2.6024609059747106 1.6201109198032122 0.37042055109671623 -2.6212451495397229 1.6350574100604103 0.48970020682277959 -2.6400293931047356 1.6500039003176084 0.60897986254884307 -2.5775509031786621 1.5159726129666875 0.011453711508461728 -2.5963351467436748 1.5309191032238858 0.13073336723452506 -2.6151193903086876 1.5458655934810839 0.25001302296058847 -2.6339036338737003 1.560812083738282 0.36929267868665183 -2.6526878774387126 1.57575857399548 0.48857233441271519 -2.6089936310776518 1.4566737769017575 0.010325839098397294 -2.6277778746426645 1.4716202671589558 0.12960549482446063 -2.6465621182076773 1.4865667574161539 0.24888515055052404 -2.66534636177269 1.5015132476733519 0.36816480627658738 -2.640436358976642 1.3973749408368272 0.0091979666883328579 -2.6592206025416547 1.4123214310940255 0.1284776224143962 -2.678004846106667 1.4272679213512236 0.24775727814045961 -2.6967890896716797 1.4422144116084217 0.36703693386652297 -2.6718790868756317 1.338076104771897 0.0080700942782684255 -2.6906633304406444 1.3530225950290955 0.12734975000433177 -2.7094475740056567 1.3679690852862936 0.24662940573039518 -2.7033218147746214 1.278777268706967 0.0069422218682039932 -2.7221060583396341 1.2937237589641652 0.12622187759426731 -2.7347645426736116 1.2194784326420369 0.00581434945813956 -2.7662072705726013 1.1601795965771067 0.0046864770480751243 -2.6603123878046224 1.6621092849350083 0.72817107660094271 -2.6724286242558963 1.5888918701065693 0.60779554664605639 -2.6932884132066359 1.5999038554524216 0.72695272392721322 -2.6845448607071702 1.5156744552781303 0.48742001669117002 -2.7054046496579103 1.5266864406239826 0.6065771939723269 -2.7262644386086499 1.537698425969835 0.72573437125348372 -2.7175208861091837 1.4534690257955436 0.48620166401744053 -2.7383806750599238 1.4644810111413959 0.60535884129859741 -2.7592404640106638 1.4754929964872483 0.72451601857975423 -2.7296371225604577 1.3802516109671046 0.36582613406255415 -2.7504969115111977 1.3912635963129569 0.48498331134371103 -2.7713567004619377 1.4022755816588093 0.60414048862486791 -2.7922164894126773 1.4132875670046616 0.72329766590602473 -2.7417533590117316 1.3070341961386656 0.24545060410766784 -2.7626131479624716 1.3180461814845179 0.36460778138882466 -2.7834729369132116 1.3290581668303703 0.48376495866998154 -2.8043327258639517 1.3400701521762226 0.60292213595113842 -2.8251925148146908 1.351082137522075 0.72207931323229524 -2.7538695954630059 1.2338167813102268 0.12507507415278135 -2.7747293844137455 1.2448287666560791 0.24423225143393834 -2.7955891733644851 1.2558407520019312 0.36338942871509511 -2.8164489623152251 1.2668527373477836 0.48254660599625199 -2.8373087512659652 1.2778647226936359 0.60170378327740892 -2.8581685402167047 1.2888767080394883 0.72086096055856574 -2.7868456208650194 1.1716113518276401 0.12385672147905188 -2.8077054098157594 1.1826233371734924 0.24301389876020885 -2.828565198766499 1.1936353225193446 0.36217107604136561 -2.8494249877172391 1.2046473078651969 0.48132825332252249 -2.8702847766679787 1.2156592932110493 0.60048543060367932 -2.8911445656187182 1.2266712785569018 0.71964260788483614 -2.1382681243819857 2.106442104759334 0.018499988823533934 -2.1538026647336639 2.1247659520940543 0.13788541226392731 -2.1693372050853426 2.1430897994287745 0.2572708357043208 -2.1848717454370208 2.1614136467634948 0.37665625914471412 -2.200406285788699 2.1797374940982146 0.49604168258510756 -2.2159408261403772 2.1980613414329349 0.61542710602550099 -2.231475366492055 2.2163851887676547 0.73481252946589437 -2.1807485181641746 2.0545265959368102 0.018009665744985019 -2.1962830585158528 2.0728504432715305 0.13739508918537838 -2.2118175988675315 2.0911742906062503 0.2567805126257719 -2.2273521392192093 2.1094981379409705 0.37616593606616522 -2.2428866795708879 2.1278219852756908 0.49555135950655865 -2.2584212199225662 2.1461458326104106 0.61493678294695209 -2.2232289119463635 2.0026110871142864 0.017519342666436101 -2.2387634522980417 2.0209349344490066 0.13690476610682947 -2.25429799264972 2.0392587817837264 0.25629018954722299 -2.2698325330013978 2.0575826291184467 0.37567561298761631 -2.2853670733530764 2.0759064764531665 0.49506103642800975 -2.2657093057285524 1.9506955782917623 0.017029019587887186 -2.2812438460802307 1.9690194256264826 0.13641444302828054 -2.2967783864319085 1.9873432729612024 0.25579986646867403 -2.3123129267835867 2.0056671202959224 0.37518528990906735 -2.3081896995107414 1.8987800694692383 0.016538696509338268 -2.3237242398624196 1.9171039168039585 0.13592411994973164 -2.3392587802140974 1.9354277641386783 0.25530954339012513 -2.3547933205657756 1.9537516114733984 0.37469496683051845 -2.3506700932929299 1.8468645606467142 0.016048373430789353 -2.3662046336446081 1.8651884079814345 0.1354337968711827 -2.3817391739962863 1.8835122553161543 0.25481922031157617 -2.3931504870751183 1.7949490518241902 0.015558050352240437 -2.408685027426797 1.8132728991589104 0.1349434737926338 -2.4356308808573073 1.7430335430016664 0.01506772727369152 -2.4781112746394962 1.6911180341791423 0.014577404195142602 -2.275672819381136 2.1623545449547197 0.7342488421006953 -2.301884622970876 2.0930194177181267 0.61440445911648378 -2.3202763348923101 2.1078236986404031 0.73366780501556783 -2.3280964265606165 2.0236842904815333 0.49456007613227215 -2.3464881384820502 2.0384885714038097 0.61382342203135631 -2.3648798504034843 2.053292852326086 0.73308676793044036 -2.3726999420717907 1.9691534441672165 0.49397903904714474 -2.3910916539932243 1.9839577250894929 0.61324238494622885 -2.4094833659146584 1.9987620060117692 0.73250573084531301 -2.3989117456615312 1.8998183169306233 0.37413465606293317 -2.4173034575829648 1.9146225978528997 0.49339800196201733 -2.4356951695043985 1.929426878775176 0.61266134786110149 -2.4540868814258325 1.9442311596974524 0.73192469376018554 -2.4251235492512713 1.8304831896940301 0.2542902730787216 -2.4435152611727053 1.8452874706163065 0.37355361897780576 -2.461906973094139 1.8600917515385829 0.49281696487688992 -2.4802986850155726 1.8748960324608592 0.61208031077597413 -2.4986903969370067 1.8897003133831356 0.73134365667505818 -2.4513353528410118 1.7611480624574369 0.13444589009450988 -2.4697270647624454 1.7759523433797133 0.25370923599359418 -2.4881187766838795 1.7907566243019897 0.37297258189267835 -2.5065104886053131 1.805560905224266 0.49223592779176251 -2.5249022005267467 1.8203651861465424 0.61149927369084667 -2.5432939124481808 1.8351694670688188 0.73076261958993072 -2.4959388683521859 1.7066172161431199 0.13386485300938247 -2.51433058027362 1.7214214970653965 0.25312819890846677 -2.5327222921950536 1.7362257779876729 0.37239154480755093 -2.5511140041164877 1.7510300589099492 0.49165489070663509 -2.5695057160379209 1.7658343398322256 0.6109182366057192 -2.587897427959355 1.780638620754502 0.73018158250480336 -1.6741166352629655 2.4920613086993368 0.014567042519764192 -1.6857074623627417 2.5131469391823704 0.13405182149360459 -1.6972982894625175 2.5342325696654036 0.25353660046744508 -1.7088891165622937 2.5553182001484371 0.37302137944128549 -1.7259766988303182 2.4496225944053736 0.015042435820588972 -1.7375675259300944 2.4707082248884071 0.13452721479442936 -1.7491583530298702 2.4917938553714403 0.25401199376826988 -1.7607491801296464 2.5128794858544738 0.37349677274211029 -1.7723400072294222 2.5339651163375065 0.49298155171595076 -1.7839308343291982 2.5550507468205401 0.61246633068979117 -1.777836762397671 2.4071838801114103 0.015517829121413751 -1.7894275894974472 2.4282695105944434 0.13500260809525413 -1.8010184165972229 2.449355141077477 0.25448738706909468 -1.8126092436969992 2.4704407715605101 0.37397216604293509 -1.8242000707967749 2.4915264020435433 0.49345694501677556 -1.8296968259650237 2.3647451658174465 0.01599322242223853 -1.8412876530647997 2.3858307963004801 0.13547800139607891 -1.8528784801645757 2.4069164267835137 0.25496278036991943 -1.8644693072643517 2.4280020572665468 0.37444755934375984 -1.8760601343641277 2.44908768774958 0.49393233831760031 -1.8815568895323764 2.3223064515234828 0.01646861572306331 -1.8931477166321522 2.3433920820065164 0.13595339469690368 -1.9047385437319282 2.36447771248955 0.25543817367074423 -1.9163293708317044 2.3855633429725831 0.37492295264458464 -1.9334169530997292 2.2798677372295191 0.016944009023888089 -1.9450077801995049 2.3009533677125527 0.13642878799772845 -1.9565986072992809 2.3220389981955862 0.25591356697156897 -1.9852770166670819 2.2374290229355558 0.017419402324712868 -1.9968678437668574 2.2585146534185894 0.13690418129855322 -2.0371370802344346 2.1949903086415925 0.017894795625537648 -2.04872790733421 2.2160759391246261 0.13737957459937802 -2.0889971438017874 2.1525515943476288 0.018370188926362427 -1.7969736095034969 2.5749318250609856 0.73190046486808102 -1.8363498127469706 2.5121483505614282 0.61292222871469915 -1.8515275903599355 2.5302582070753155 0.73228189276289046 -1.8909037936034092 2.467474732575758 0.61330365660950859 -1.9060815712163741 2.4855845890896453 0.7326633206576999 -1.9302799968468829 2.4046912580762005 0.49432542045612665 -1.9454577744598478 2.4228011145900878 0.61368508450431802 -1.9606355520728127 2.4409109711039751 0.73304474855250934 -1.9696562000903568 2.3419077835766431 0.37534718430274466 -1.9848339777033215 2.3600176400905304 0.49470684835093609 -2.0000117553162866 2.3781274966044177 0.61406651239912746 -2.0151895329292513 2.396237353118305 0.73342617644731878 -2.0090324033338303 2.2791243090770861 0.25636894814936284 -2.0242101809467954 2.2972341655909729 0.3757286121975541 -2.0393879585597601 2.3153440221048602 0.49508827624574547 -2.0545657361727252 2.3334538786187475 0.6144479402939369 -2.0697435137856899 2.3515637351326344 0.73380760434212822 -2.0635863841902689 2.2344506910914159 0.25675037604417222 -2.078764161803234 2.2525605476053028 0.37611004009236354 -2.0939419394161987 2.2706704041191901 0.49546970414055491 -2.1091197170291638 2.2887802606330769 0.61482936818874623 -2.1242974946421285 2.3068901171469642 0.73418903223693766 -2.1029625874337423 2.1716672165918585 0.13777213989079026 -2.1181403650467079 2.1897770731057458 0.25713180393898166 -2.1333181426596726 2.2078869296196326 0.37649146798717292 -2.1484959202726377 2.2259967861335199 0.49585113203536429 -2.1636736978856024 2.2441066426474068 0.61521079608355567 -2.1788514754985671 2.2622164991612936 0.73457046013174698 -1.2081162092170317 2.7661660053322183 0.11865592146983818 -1.2150524886931546 2.7892947161945489 0.23821589845294797 -1.2219887681692776 2.8124234270568795 0.3577758754360576 -1.2289250476454003 2.8355521379192106 0.47733585241916726 -1.2358613271215233 2.8586808487815416 0.59689582940227692 -1.2603317745282567 2.7118591142068604 0.0010523857628549956 -1.2672680540043795 2.734987825069191 0.12061236274596462 -1.2742043334805024 2.7581165359315216 0.24017233972907442 -1.2811406129566254 2.7812452467938522 0.35973231671218403 -1.2880768924327481 2.8043739576561832 0.47929229369529369 -1.2950131719088711 2.8275026685185143 0.59885227067840341 -1.3194836193156045 2.6806809339438331 0.0030088270389814452 -1.3264198987917273 2.7038096448061637 0.12256880402209108 -1.3333561782678502 2.7269383556684943 0.24212878100520085 -1.3402924577439732 2.7500670665308249 0.36168875798831046 -1.347228737220096 2.7731957773931559 0.48124873497142012 -1.3786354641029523 2.6495027536808058 0.0049652683151078948 -1.3855717435790751 2.6726314645431364 0.12452524529821753 -1.3925080230551981 2.695760175405467 0.24408522228132729 -1.399444302531321 2.718888886267798 0.36364519926443689 -1.4377873088903002 2.6183245734177785 0.0069217095912343469 -1.4447235883664229 2.6414532842801091 0.12648168657434397 -1.4516598678425459 2.6645819951424397 0.24604166355745374 -1.496939153677648 2.5871463931547511 0.0088781508673607956 -1.5038754331537707 2.6102751040170817 0.12843812785047043 -1.5108117126298937 2.6334038148794123 0.24799810483358017 -1.5560909984649958 2.5559682128917234 0.010834592143487245 -1.5630272779411187 2.579096923754054 0.13039456912659689 -1.6152428432523436 2.5247900326286961 0.012791033419613695 -1.2431850547559207 2.8816000812469973 0.71644518952850511 -1.3056452777453482 2.8486331874561652 0.71831097460423099 -1.3568447880417507 2.7948756384068925 0.60073528084318484 -1.3681055007347758 2.8156662936653336 0.72017675967995687 -1.4080442983381531 2.7411180893576201 0.48315958708213874 -1.4193050110311782 2.7619087446160608 0.60260106591891072 -1.4305657237242033 2.7826993998745015 0.72204254475568275 -1.4592438086345558 2.6873605403083474 0.36558389332109253 -1.4705045213275807 2.7081511955667881 0.48502537215786462 -1.4817652340206058 2.7289418508252288 0.6044668509946366 -1.4930259467136309 2.7497325060836699 0.72390832983140863 -1.5217040316239832 2.6543936465175153 0.36744967839681841 -1.5329647443170082 2.675184301775956 0.48689115723359044 -1.5442254570100331 2.6959749570343972 0.60633263607036247 -1.5554861697030582 2.7167656122928379 0.7257741149071345 -1.5729035419203858 2.600636097468243 0.24987398463577234 -1.5841642546134107 2.6214267527266832 0.36931546347254429 -1.5954249673064356 2.6422174079851239 0.48875694230931632 -1.6066856799994607 2.6630080632435651 0.60819842114608835 -1.6179463926924855 2.6837987185020062 0.72763989998286038 -1.6241030522167881 2.5468785484189702 0.13229829087472611 -1.6353637649098132 2.5676692036774109 0.2517397697114982 -1.6466244776028383 2.5884598589358516 0.37118124854827017 -1.6578851902958629 2.6092505141942923 0.49062272738504215 -1.669145902988888 2.6300411694527335 0.61006420622181423 -1.6804066156819129 2.6508318247111742 0.72950568505858626 -1.7203454132852907 2.5762836204034603 0.49248851246076802 -1.7316061259783158 2.5970742756619014 0.61192999129754011 -1.7428668386713404 2.6178649309203426 0.73137147013431203 -0.63203003308363104 2.9453717687280938 0.083147891160738396 -0.6332859491358529 2.9697154049914278 0.20267017872191867 -0.63454186518807476 2.9940590412547614 0.32219246628309878 -0.63579778124029662 3.0184026775180954 0.441714753844279 -0.63705369729251859 3.042746313781429 0.56123704140545927 -0.63830961334474046 3.0670899500447626 0.68075932896663938 -0.69589418533456726 2.9268597484219026 0.087309886414503407 -0.69715010138678912 2.9512033846852366 0.20683217397568368 -0.69840601743901098 2.9755470209485702 0.32635446153686376 -0.69966193349123285 2.9998906572119042 0.44587674909804398 -0.70091784954345471 3.0242342934752378 0.56539903665922431 -0.7597583375855036 2.9083477281157113 0.091471881668268418 -0.76101425363772535 2.9326913643790453 0.21099416922944869 -0.76227016968994721 2.9570350006423789 0.3305164567906288 -0.76352608574216907 2.9813786369057129 0.45003874435180902 -0.82362248983643993 2.88983570780952 0.095633876922033415 -0.82487840588866168 2.9141793440728541 0.21515616448321367 -0.82613432194088354 2.9385229803361881 0.33467845204439378 -0.82739023799310529 2.9628666165995221 0.454200739605574 -0.88748664208737615 2.8713236875033292 0.099795872175798411 -0.88874255813959802 2.8956673237666632 0.21931815973697869 -0.88999847419181977 2.9200109600299968 0.33884044729815882 -0.9513507943383126 2.852811667197138 0.10395786742956342 -0.95260671039053446 2.877155303460472 0.2234801549907437 -1.0152149465892488 2.8342996468909472 0.10811986268332842 -0.70414814373848988 3.0479758030264446 0.68490582765267127 -0.76563273047191949 3.0054628261814589 0.56955435468420113 -0.77224098527307483 3.0281741580431167 0.68903463262313358 -0.83372557200650443 2.9856611811981311 0.57368315965466343 -0.84033382680765967 3.0083725130597889 0.693163437593596 -0.89521015873993393 2.9431482043531454 0.45833168668619328 -0.90181841354108938 2.9658595362148032 0.57781196462512585 -0.90842666834224461 2.9885708680764611 0.69729224256405831 -0.95669474547336364 2.9006352275081597 0.34298021371772314 -0.96330300027451887 2.9233465593698176 0.46246049165665565 -0.96991125507567433 2.9460578912314754 0.58194076959558816 -0.97651950987682956 2.9687692230931333 0.70142104753452073 -1.0181793322067931 2.858122250663174 0.22762874074925302 -1.0247875870079486 2.8808335825248319 0.3471090186881855 -1.0313958418091038 2.9035449143864898 0.46658929662711801 -1.0380040966102593 2.9262562462481476 0.58606957456605047 -1.0446123514114145 2.9489675781098055 0.70554985250498303 -1.0796639189402228 2.8156092738181884 0.11227726778078276 -1.0862721737413781 2.8383206056798462 0.23175754571971535 -1.0928804285425335 2.8610319375415041 0.35123782365864781 -1.0994886833436888 2.8837432694031619 0.47071810159758037 -1.1060969381448442 2.9064546012648198 0.59019837953651288 -1.1127051929459995 2.9291659331264777 0.70967865747544545 -1.1477567604748078 2.7958076288348601 0.11640607275124509 -1.154365015275963 2.8185189606965184 0.23588635069017769 -1.1609732700771187 2.8412302925581758 0.35536662862911017 -1.1675815248782739 2.8639416244198341 0.47484690656804268 -1.1741897796794292 2.886652956281492 0.5943271845069753 -1.1807980344805844 2.9093642881431503 0.71380746244590776 -0.042906108630844764 3.0002472056998082 0.022487734726505962 -0.035437357984994255 3.0246441233012771 0.14144117226652889 -0.027968607339143747 3.049041040902746 0.26039460980655166 -0.020499856693293184 3.0734379585042144 0.37934804734657451 -0.01303110604744262 3.0978348761056838 0.49830148488659731 -0.0055623554015920146 3.1222317937071522 0.61725492242662006 -0.10779616184776908 2.9952321250750207 0.029405513638875329 -0.10032741120191857 3.0196290426764896 0.14835895117889825 -0.092858660556068062 3.0440259602779585 0.26731238871892099 -0.085389909910217471 3.0684228778794269 0.38626582625894385 -0.077921159264366893 3.0928197954808962 0.50521926379896664 -0.07045240861851626 3.1172167130823647 0.62417270133898939 -0.17268621506469345 2.9902170444502332 0.036323292551244696 -0.16521746441884294 3.0146139620517021 0.15527673009126761 -0.1577487137729924 3.039010879653171 0.27423016763129038 -0.15027996312714184 3.0634077972546394 0.39318360517131318 -0.14281121248129125 3.0878047148561083 0.51213704271133598 -0.23757626828161776 2.9852019638254457 0.043241071463614056 -0.23010751763576726 3.0095988814269146 0.16219450900363697 -0.22263876698991669 3.0339957990283835 0.28114794654365971 -0.21517001634406613 3.0583927166298519 0.40010138408368257 -0.30246632149854208 2.9801868832006582 0.050158850375983416 -0.29499757085269157 3.0045838008021271 0.16911228791600633 -0.28752882020684095 3.028980718403596 0.2880657254560291 -0.36735637471546645 2.9751718025758707 0.05707662928835279 -0.35988762406961594 2.9995687201773396 0.17603006682837571 -0.35241887342376532 3.0239656377788084 0.29498350436839843 -0.43224642793239076 2.9701567219510832 0.06399440820072215 -0.42477767728654026 2.994553639552552 0.18294784574074507 -0.49713648114931508 2.9651416413262957 0.07091218711309151 -0.067553966661886317 3.1412077982099857 0.74334886833174918 -0.13858927092126055 3.1119133235810854 0.6312487102660036 -0.13942031544407985 3.1355732392348137 0.75060663007657979 -0.20962457518063476 3.0826188489521851 0.51914855220025791 -0.21045561970345406 3.1062787646059133 0.63850647201083421 -0.21128666422627329 3.1299386802596416 0.75786439182141041 -0.28065987944000903 3.0533243743232847 0.40704839413451205 -0.28149092396282827 3.076984289977013 0.52640631394508852 -0.2823219684856475 3.1006442056307413 0.64576423375566483 -0.28315301300846679 3.12430412128447 0.76512215356624114 -0.35252622822220259 3.0476898153481127 0.41430615587934266 -0.35335727274502182 3.0713497310018409 0.53366407568991914 -0.35418831726784106 3.0950096466555697 0.65302199550049544 -0.42356153248157674 3.0183953407192128 0.30220599781359692 -0.42439257700439603 3.0420552563729411 0.42156391762417328 -0.42522362152721527 3.0657151720266693 0.54092183743474975 -0.4260546660500345 3.0893750876803976 0.66027975724532606 -0.49459683674095101 2.9891008660903124 0.19010583974785125 -0.49542788126377019 3.0127607817440407 0.30946375955842753 -0.49625892578658948 3.036420697397769 0.42882167936900389 -0.49708997030940871 3.0600806130514973 0.54817959917958026 -0.497921014832228 3.083740528705226 0.66753751899015668 -0.56563214100032511 2.9598063914614121 0.078005681682105407 -0.56646318552314434 2.9834663071151404 0.19736360149268181 -0.56729423004596369 3.0071262227688687 0.31672152130325809 -0.56812527456878292 3.0307861384225974 0.43607944111383445 -0.56895631909160216 3.0544460540763256 0.55543736092441087 -0.5697873636144215 3.0781059697300539 0.67479528073498729 0.080127451059110955 2.993394855980446 0.0064687837143598236 0.20080140757522036 3.0019705451339163 0.10933336045709166 0.36448299781935334 2.9811713743601653 0.085815761684837594 0.32147536409133026 3.0105462342873865 0.21219793719982327 0.52816458806348621 2.9603722035864144 0.062298162912583568 0.48515695433546313 2.9897470635136356 0.18868033842756923 0.35197629234587074 3.0783021975016718 0.56793269303184146 0.36587748046034108 3.1003699232342665 0.68575781153534765 0.21729870141661189 3.0714558927347682 0.46682842302984806 0.23119988953108228 3.0935236184673629 0.58465354153335425 0.24510107764555264 3.1155913441999576 0.70247866003686044 0.054818734258412299 3.0204741365026742 0.13007391602084237 0.06871992237288263 3.0425418622352693 0.24789903452434847 0.082621110487353031 3.0646095879678641 0.36572415302785466 0.096522298601823431 3.0866773137004593 0.48354927153136079 0.1104234867162938 3.1087450394330545 0.60137439003486703 0.12432467483076418 3.1308127651656492 0.71919950853837322 0.0035482720159757345 3.1460341861313403 0.73592035703988601 0.74805996008476283 2.8992058709335713 0.030124104511336902 0.77956835470887942 2.9136135443106399 0.14597740501486678 0.81107674933299589 2.9280212176877085 0.26183070551839627 0.86993403612399789 2.8585015688235487 0.012072426998225604 0.90144243074811448 2.8729092422006173 0.12792572750175549 0.93295082537223095 2.8873169155776859 0.243779028005285 0.96445921999634743 2.9017245889547545 0.35963232850881455 0.99596761462046401 2.9161322623318235 0.47548562901234409 1.0233165067873495 2.8322049400905946 0.10987404998864418 1.0548249014114661 2.8466126134676633 0.22572735049217371 1.0863332960355825 2.8610202868447319 0.34158065099570328 1.1178416906596991 2.8754279602218009 0.45743395149923283 1.1493500852838159 2.8898356335988695 0.57328725200276265 1.1808584799079325 2.9042433069759381 0.68914055250629214 1.1451905828265845 2.7915006379805725 0.091822372475532876 0.78946002375594382 2.9352337095953698 0.26499769622545116 0.65674712706550842 2.9545932526993712 0.16397151264181231 0.95568745337061523 2.9295718712133016 0.48138693427258056 0.82297455668017994 2.9489314143173027 0.38036075068894171 0.69026165998974454 2.9682909574213046 0.27933456710530291 1.121914882985287 2.9239100328312331 0.6977761723197099 0.98920198629485145 2.9432695759352345 0.5967499887360711 0.85648908960441617 2.962629119039236 0.49572380515243231 0.72377619291398076 2.9819886621432374 0.39469762156879346 0.62457782914778159 3.0150459099691718 0.4090344924486452 0.75729072583821699 2.9956863668651703 0.510060676032284 0.89000362252865228 2.9763268237611689 0.61108685961592291 1.0227165192190877 2.9569672806571674 0.7121130431995617 0.79080525876245311 3.0093840715871036 0.6254237304957746 0.92351815545288851 2.9900245284831022 0.72644991407941339 0.82431979168668934 3.0230817763090365 0.7407867849592652 0.72512142792049017 3.0561390241349713 0.75512365583911689 1.7137831011593452 2.6100123674185673 0.62712874525814799 1.7076672732270159 2.5864126150067785 0.50742397050001442 1.7015514452946865 2.5628128625949902 0.38771919574188046 1.6954356173623573 2.5392131101832018 0.26801442098374689 1.6256613578669401 2.5242844904436721 0.035348763917569574 1.6317771857992693 2.5478842428554604 0.15505353867570321 1.6378930137315986 2.5714839952672497 0.27475831343383683 1.644008841663928 2.595083747679038 0.3944630881919704 1.6501246695962575 2.6186835000908264 0.5141678629501043 1.6562404975285865 2.6422832525026148 0.63387263770823787 1.5681187542361816 2.5565553755277199 0.042092656367659506 1.5742345821685109 2.5801551279395083 0.16179743112579315 1.5803504101008401 2.6037548803512975 0.28150220588392677 1.5864662380331696 2.6273546327630859 0.40120698064206034 1.592582065965499 2.6509543851748743 0.52091175540019419 1.5105761506054229 2.5888262606117678 0.048836548817749452 1.5166919785377524 2.6124260130235561 0.16854132357588308 1.5228078064700816 2.6360257654353454 0.28824609833401671 1.5289236344024109 2.6596255178471337 0.40795087309215028 1.4530335469746645 2.6210971456958156 0.055580441267839384 1.4591493749069939 2.644696898107604 0.17528521602597302 1.4652652028393232 2.6682966505193932 0.29498999078410659 1.395490943343906 2.6533680307798635 0.062324333717929316 1.4016067712762355 2.6769677831916519 0.18202910847606293 1.4077225992085647 2.7005675356034406 0.30173388323419653 1.3379483397131473 2.6856389158639113 0.069068226168019262 1.3440641676454768 2.7092386682756997 0.18877300092615287 1.2804057360823888 2.7179098009479592 0.075812118618109187 1.2228631324516304 2.7501806860320075 0.082556011068199125 1.718226699613141 2.6345410009614429 0.74698969981694241 1.6544217209853402 2.6702904767803268 0.75431847400201912 1.5932912555064203 2.6775573883060533 0.64112148938614577 1.5906167423575397 2.7060399525992112 0.76164724818709584 1.5321607900275005 2.6848242998317793 0.52792450477027253 1.5294862768786195 2.7133068641249372 0.64845026357122248 1.4710303245485807 2.6920912113575057 0.41472752015439895 1.4683558113996997 2.7205737756506632 0.53525327895534924 1.4656812982508187 2.749056339943821 0.6557790377562992 1.40722534592078 2.7278406871763896 0.42205629433947572 1.404550832771899 2.756323251469547 0.54258205314042596 1.401876319623018 2.7848058157627049 0.66310781194137602 1.34609488044186 2.7351075987021161 0.30885930972360243 1.3434203672929792 2.7635901629952735 0.42938506852455249 1.3407458541440982 2.7920727272884309 0.54991082732550278 1.3380713409952172 2.8205552915815888 0.67043658612645274 1.2849644149629402 2.7423745102278421 0.19566232510772918 1.2822899018140592 2.7708570745209999 0.31618808390867914 1.2796153886651784 2.7993396388141574 0.43671384270962921 1.2769408755162974 2.8278222031073148 0.5572396015105795 1.2742663623674164 2.8563047674004727 0.67776536031152956 1.2211594363351395 2.7781239860467259 0.20299109929280593 1.2184849231862587 2.8066065503398838 0.32351685809375591 1.2158104100373777 2.8350891146330413 0.44404261689470598 1.2131358968884967 2.8635716789261991 0.56456837569565632 1.2104613837396156 2.8920542432193566 0.68509413449660628 1.1600289708562197 2.7853908975724524 0.089794114676932657 2.2112324343272447 2.2289581194131025 0.70846945668147232 2.1999412429752727 2.2077200588523422 0.5893496951453514 2.1035963584476791 2.165778493899325 0.11680781184614178 2.1148875497996515 2.1870165544600861 0.23592757338226267 2.1261787411516235 2.2082546150208469 0.35504733491838353 2.1374699325035955 2.2294926755816076 0.47416709645450467 2.1487611238555671 2.2507307361423683 0.59328685799062553 2.0411250479760019 2.1875511106285912 0.0016252131552950376 2.0524162393279735 2.2087891711893515 0.12074497469141593 2.0637074306799459 2.2300272317501126 0.23986473622753682 2.0749986220319179 2.2512652923108734 0.35898449776365771 2.0862898133838899 2.2725033528716341 0.47810425929977884 1.9899449288562963 2.2305617879186177 0.005562376000569174 2.0012361202082678 2.251799848479378 0.12468213753669007 2.0125273115602402 2.2730379090401391 0.24380189907281097 2.0238185029122122 2.2942759696008999 0.36292166060893183 2.0351096942641842 2.3155140301616606 0.48204142214505297 1.9387648097365906 2.2735724652086442 0.0094995388458433069 1.9500560010885624 2.2948105257694045 0.1286193003819642 1.9613471924405346 2.3160485863301656 0.24773906191808512 1.9726383837925066 2.3372866468909264 0.36685882345420595 1.8875846906168849 2.3165831424986707 0.013436701691117442 1.8988758819688569 2.337821203059431 0.13255646322723835 1.9101670733208289 2.3590592636201921 0.25167622476335927 1.8364045714971795 2.3595938197886972 0.01737386453639158 1.8476957628491515 2.3808318803494575 0.13649362607251248 1.8589869542011235 2.4020699409102182 0.25561338760863339 1.7852244523774738 2.4026044970787237 0.021311027381665723 1.7965156437294458 2.423842557639484 0.14043078891778663 1.7340443332577684 2.4456151743687498 0.025248190226939856 2.1581559420477876 2.2735518826327628 0.71251116663297798 2.0970838930707534 2.2941564005769042 0.59725142661613539 2.103559196647268 2.3194147480399647 0.7166366881822851 2.0424871476702338 2.3400192659841061 0.60137694816544252 2.0489624512467484 2.3652776134471667 0.72076220973159222 1.9814150986931995 2.360623783928248 0.48611720814859999 1.9878904022697144 2.3858821313913081 0.60550246971474964 1.994365705846229 2.4111404788543687 0.72488773128089934 1.9203430497161651 2.3812283018723894 0.37085746813175707 1.9268183532926799 2.40648664933545 0.49024272969790716 1.933293656869195 2.4317449967985101 0.60962799126405676 1.9397689604457096 2.4570033442615706 0.72901325283020646 1.8657463043156457 2.4270911672795914 0.37498298968106425 1.8722216078921605 2.4523495147426519 0.49436825124721434 1.8786969114686753 2.4776078622057121 0.61375351281336399 1.8851722150451902 2.5028662096687726 0.73313877437951369 1.8046742553386113 2.4476956852237324 0.25972324966422167 1.8111495589151261 2.4729540326867934 0.37910851123037143 1.8176248624916411 2.4982123801498539 0.49849377279652152 1.8241001660681559 2.523470727612914 0.61787903436267111 1.8305754696446708 2.5487290750759746 0.73726429592882081 1.743602206361577 2.4683002031678738 0.14446350964737903 1.7500775099380916 2.4935585506309348 0.26384877121352884 1.7565528135146067 2.5188168980939953 0.38323403277967855 1.7630281170911215 2.5440752455570559 0.50261929434582864 1.7695034206676363 2.5693335930201164 0.62200455591197834 1.7759787242441514 2.5945919404831765 0.74138981747812804 1.6825301573845426 2.4889047211120152 0.029203769630536409 1.6890054609610574 2.5141630685750758 0.14858903119668621 2.492684973521611 1.6998157941106968 0.099361623962083409 2.5080735025235938 1.7181254511754243 0.21813139844855672 2.5234620315255762 1.7364351082401519 0.33690117293503002 2.5388505605275591 1.7547447653048798 0.45567094742150366 2.5542390895295415 1.7730544223696074 0.5744407219079769 2.4504458286294915 1.751835499747421 0.10112794535991096 2.4658343576314743 1.7701451568121485 0.21989771984638426 2.4812228866334567 1.7884548138768761 0.33866749433285759 2.4966114156354395 1.806764470941604 0.45743726881933117 2.5119999446374219 1.8250741280063316 0.57620704330580441 2.4082066837373723 1.803855205384145 0.10289426675773851 2.4235952127393547 1.8221648624488727 0.2216640412442118 2.4389837417413371 1.8404745195136003 0.34043381573068515 2.45437227074332 1.8587841765783282 0.45920359021715873 2.3659675388452528 1.8558749110208692 0.10466058815556606 2.3813560678472352 1.8741845680855969 0.22343036264203936 2.3967445968492176 1.8924942251503245 0.34220013712851266 2.3237283939531337 1.9078946166575932 0.10642690955339361 2.3391169229551161 1.9262042737223211 0.2251966840398669 2.3545054519570985 1.9445139307870487 0.34396645852634022 2.2814892490610141 1.9599143222943172 0.10819323095122114 2.2968777780629965 1.978223979359045 0.22696300543769446 2.239250104168895 2.0119340279310411 0.10995955234904869 2.1970109592767755 2.0639537335677653 0.11172587374687624 2.5693944308667964 1.791651005649858 0.69321942552363069 2.524778597204715 1.8465951126053111 0.69507675414121595 2.4681783612678863 1.8790409481448158 0.57803395880753294 2.4801627635426335 1.9015392195607639 0.6969340827588012 2.411578125331058 1.911486783684321 0.46099116347385 2.4235625276058048 1.9339850551002689 0.5798912874251182 2.4355469298805521 1.9564833265162169 0.69879141137638645 2.3669622916689765 1.9664308906397738 0.46284849209143525 2.3789466939437238 1.9889291620557219 0.58174861604270345 2.3909310962184711 2.01142743347167 0.7006487399939717 2.3103620557321478 1.9988767261792786 0.34580569675775202 2.3223464580068955 2.0213749975952267 0.4647058207090205 2.3343308602816428 2.0438732690111747 0.5836059446602887 2.3463152625563897 2.0663715404271228 0.70250606861155696 2.2537618197953191 2.0313225617187833 0.22876290142406908 2.2657462220700664 2.0538208331347314 0.34766302537533728 2.2777306243448141 2.0763191045506795 0.46656314932660575 2.2897150266195614 2.0988173759666275 0.58546327327787395 2.3016994288943087 2.1213156473825756 0.70436339722914221 2.2091459861332381 2.0862666686742366 0.23062023004165433 2.2211303884079854 2.1087649400901842 0.34952035399292253 2.2331147906827327 2.1312632115061323 0.468420477944191 2.2450991929574799 2.1537614829220808 0.5873206018954592 2.2570835952322272 2.1762597543380284 0.70622072584672746 2.1525457501964089 2.1187125042137414 0.11357743470797137 2.1645301524711567 2.1412107756296894 0.23247755865923955 2.1765145547459039 2.163709047045637 0.35137768261050778 2.1884989570206517 2.1862073184615856 0.47027780656177626 2.7830202419293273 1.1670047291323029 0.09584407951148749 2.801693339949761 1.1818469470553392 0.21438025519480941 2.8203664379701947 1.1966891649783755 0.33291643087813139 2.8390395359906284 1.2115313829014123 0.45145260656145364 2.8577126340110617 1.2263736008244486 0.56998878224477556 2.8763857320314954 1.2412158187474849 0.68852495792809743 2.7514725543164373 1.2261580677073378 0.096157859769732304 2.770145652336871 1.2410002856303741 0.21469403545305424 2.7888187503573048 1.2558425035534104 0.33323021113637619 2.8074918483777385 1.2706847214764472 0.45176638681969844 2.8261649463981717 1.2855269393994835 0.57030256250302036 2.7199248667035474 1.2853114062823727 0.096471640027977118 2.7385979647239811 1.300153624205409 0.21500781571129907 2.7572710627444144 1.3149958421284456 0.33354399139462099 2.7759441607648481 1.3298380600514821 0.4520801670779433 2.6883771790906574 1.3444647448574076 0.096785420286221932 2.7070502771110911 1.3593069627804439 0.21532159596954389 2.7257233751315244 1.3741491807034805 0.33385777165286584 2.7443964731519581 1.388991398626517 0.4523939473361881 2.6568294914777675 1.4036180834324425 0.097099200544466746 2.6755025894982012 1.4184603013554788 0.21563537622778872 2.6941756875186345 1.4333025192785154 0.33417155191111064 2.6252818038648771 1.4627714220074775 0.09741298080271156 2.6439549018853108 1.4776136399305138 0.21594915648603352 2.5937341162519871 1.5219247605825124 0.097726761060956374 2.5621864286390967 1.5810780991575473 0.098040541319201188 2.843511859353073 1.3028724730598302 0.68889159910851516 2.7940312861150072 1.345786363878557 0.57063969927199942 2.8103254334427863 1.3651191049284079 0.68927069846878564 2.7608448602047204 1.4080329957471347 0.5710187986322699 2.7771390075324995 1.4273657367969856 0.68964979782905611 2.7113642869666545 1.4509468865658612 0.45276689879575427 2.7276584342944337 1.4702796276157124 0.57139789799254037 2.7439525816222128 1.4896123686655633 0.69002889718932658 2.6618837137285887 1.493860777384588 0.33451499895923831 2.6781778610563678 1.5131935184344389 0.45314599815602474 2.6944720083841465 1.5325262594842901 0.57177699735281085 2.7107661557119256 1.5518590005341411 0.69040799654959706 2.6124031404905228 1.5367746682033148 0.21626309912272262 2.6286972878183019 1.5561074092531657 0.33489409831950878 2.6449914351460806 1.5754401503030167 0.45352509751629522 2.6612855824738597 1.5947728913528678 0.57215609671308132 2.6775797298016384 1.6141056324027188 0.69078709590986753 2.579216714580236 1.5990213000718922 0.21664219848299313 2.5955108619080147 1.6183540411217434 0.33527319767977931 2.6118050092357938 1.6376867821715944 0.45390419687656575 2.6280991565635725 1.6570195232214453 0.57253519607335179 2.6443933038913516 1.6763522642712965 0.69116619527013801 2.5297361413421697 1.6419351908906192 0.098390298646477456 2.5460302886699488 1.66126793194047 0.21702129784326363 2.562324435997728 1.6806006729903209 0.33565229704004979 2.5786185833255066 1.6999334140401721 0.45428329623683622 2.5949127306532858 1.719266155090023 0.57291429543362238 2.6112068779810644 1.738598896139874 0.69154529463040848 3.0685364697355886 0.64197582463194869 0.69312821869057162 3.0473661518065214 0.63105576510051742 0.57477450008331943 3.0261958338774542 0.62013570556908626 0.45642078147606735 3.0050255159483865 0.60921564603765488 0.33806706286881488 2.9838551980193189 0.59829558650622372 0.21971334426156272 2.9431027970947463 0.65149139889594965 0.10071791325842323 2.9642731150238135 0.66241145842738081 0.21907163186567538 2.9854434329528812 0.67333151795881196 0.33742535047292754 3.0066137508819488 0.68425157749024335 0.45577906908018001 3.027784068811016 0.6951716370216745 0.57413278768743214 2.923520714099241 0.71560727081710673 0.10007620086253591 2.9446910320283082 0.726527330348538 0.21842991946978807 2.9658613499573758 0.73744738987996916 0.3367836380770402 2.9870316678864435 0.74836744941140043 0.45513735668429267 2.9039386311037356 0.77972314273826382 0.099434488466648582 2.9251089490328033 0.79064320226969509 0.21778820707390073 2.9462792669618705 0.80156326180112625 0.33614192568115286 2.9674495848909381 0.81248332133255752 0.45449564428840539 2.8843565481082303 0.84383901465942091 0.098792776070761257 2.9055268660372979 0.85475907419085217 0.21714649467801342 2.9266971839663656 0.86567913372228333 0.33550021328526558 2.8647744651127249 0.90795488658057799 0.098151063674873945 2.885944783041793 0.91887494611200926 0.21650478228212608 2.84519238211722 0.97207075850173508 0.097509351278986633 2.8663627000462877 0.98299081803316624 0.21586306988623877 2.8256102991217147 1.0361866304228922 0.096867638883099308 3.0483428329220881 0.70813566325289479 0.69252748387190044 3.0080402407028539 0.75982810179728943 0.57350191313221921 3.0277959790094675 0.7754760422729895 0.69195041660386392 2.9874933867902334 0.82716848081738414 0.57292484586418269 3.0072491250968469 0.84281642129308421 0.69137334933582739 2.9471907945709992 0.8788609193617789 0.4538992751245014 2.9669465328776128 0.89450885983747885 0.57234777859614616 2.9867022711842264 0.91015680031317903 0.69079628206779087 2.9068882023517646 0.93055335790617355 0.33487370438481989 2.9266439406583786 0.94620129838187361 0.45332220785646488 2.9463996789649922 0.96184923885757356 0.57177071132810964 2.9661554172716063 0.97749717933327362 0.69021921479975434 2.886341348439144 0.99789373692626815 0.33429663711678337 2.9060970867457581 1.0135416774019683 0.45274514058842835 2.9258528250523721 1.0291896178776683 0.57119364406007311 2.9456085633589857 1.0448375583533682 0.68964214753171782 2.8460387562199099 1.049586175470663 0.21527106637710217 2.8657944945265235 1.065234115946363 0.33371956984874684 2.8855502328331379 1.0808820564220631 0.45216807332039183 2.9053059711397515 1.0965299968977631 0.57061657679203659 2.9250617094463656 1.112177937373463 0.6890650802636813 2.8057361640006753 1.1012786140150577 0.096245495637420964 2.8254919023072893 1.1169265544907576 0.21469399910906564 2.8452476406139033 1.1325744949664576 0.33314250258071032 2.8650033789205174 1.1482224354421577 0.45159100605235536 2.8847591172271314 1.1638703759178579 0.57003950952400007 2.904514855533745 1.1795183163935579 0.68848801299564477 3.1383513590149938 0.016652785984541094 0.70378487331167361 3.1154992272288498 0.0099832915909993311 0.5855970504108714 3.0926470954427061 0.0033137971974575259 0.46740922751006903 3.0172676505925957 0.04998783810259283 0.11156180588688909 3.0401197823787394 0.056657332496134638 0.22974962878769145 3.062971914164883 0.063326826889676557 0.34793745168849377 3.0858240459510267 0.069996321283218366 0.46612527458929642 3.1086761777371708 0.07666581567676016 0.58431309749009874 3.0104446011009163 0.11667036218835364 0.11027785296611653 3.0332967328870599 0.1233398565818955 0.22846567586691888 3.0561488646732036 0.13000935097543739 0.34665349876772122 3.0790009964593477 0.13667884536897923 0.46484132166852388 3.0036215516092368 0.18335288627411467 0.10899390004534396 3.0264736833953805 0.19002238066765653 0.2271817229461463 3.0493258151815241 0.1966918750611984 0.34536954584694868 3.0721779469676682 0.20336136945474026 0.46355736874775127 2.9967985021175574 0.25003541035987553 0.1077099471245714 3.019650633903701 0.2567049047534174 0.22589777002537373 3.0425027656898447 0.26337439914695926 0.34408559292617608 2.9899754526258779 0.3167179344456364 0.10642599420379882 3.0128275844120216 0.32338742883917826 0.22461381710460115 2.9831524031341985 0.38340045853139726 0.10514204128302626 3.0060045349203426 0.39006995292493912 0.22332986418382861 2.976329353642519 0.45008298261715812 0.10385808836225369 3.1313635410642719 0.085088864047768498 0.70254084517368476 3.1018348305505139 0.14354307360898932 0.5830335782546423 3.1242334936908827 0.15503862362067317 0.70133128042048709 3.0947047831771246 0.21349283318189399 0.58182401350144464 3.1171034463174934 0.22498838319357783 0.70012171566728942 3.065176072663367 0.27194704274311482 0.46231674658240207 3.0875747358037353 0.28344259275479866 0.58061444874824697 3.1099733989441041 0.29493814276648245 0.69891215091409176 3.035647362149609 0.33040125230433565 0.34280947966335923 3.0580460252899777 0.34189680231601949 0.4611071818292044 3.0804446884303465 0.35339235232770327 0.5794048839950493 3.1028433515707148 0.36488790233938706 0.69770258616089409 3.0285173147762197 0.40035101187724026 0.34159991491016156 3.0509159779165889 0.4118465618889241 0.45989761707600674 3.0733146410569572 0.42334211190060789 0.57819531924185164 3.0957133041973259 0.43483766191229167 0.69649302140769642 2.9989886042624621 0.45880522143846109 0.22209264799111911 3.0213872674028304 0.47030077145014487 0.34039035015696389 3.0437859305431996 0.48179632146182871 0.45868805232280907 3.0661845936835683 0.4932918714735125 0.57698575448865397 3.0885832568239366 0.50478742148519629 0.69528345665449875 2.969459893748704 0.51725943099968186 0.10258538107207661 2.9918585568890728 0.52875498101136575 0.22088308323792144 3.0142572200294415 0.54025053102304954 0.33918078540376623 3.0366558831698107 0.55174608103473333 0.4574784875696114 3.059054546310179 0.56324163104641711 0.57577618973545619 3.0814532094505478 0.57473718105810101 0.69407389190130109 2.9623298463753147 0.58720919057258658 0.10137581631887894 3.0828071276186639 -0.61033247573814087 0.71850549843278222 2.9468615253063253 -0.55700922387468976 0.0086578098250751096 2.9705571822529619 -0.55477465113762037 0.12667747371581531 2.9942528391995982 -0.55254007840055108 0.24469713760655554 3.0179484961462339 -0.5503055056634818 0.36271680149729574 3.0416441530928706 -0.54807093292641251 0.48073646538803627 3.0653398100395068 -0.54583636018934323 0.59875612927877642 2.9530898646738044 -0.49027853558882295 0.0069281045618095555 2.9767855216204411 -0.48804396285175355 0.12494776845254976 3.0004811785670773 -0.48580939011468427 0.24296743234328999 3.0241768355137135 -0.48357481737761498 0.36098709623403019 3.0478724924603497 -0.4813402446405457 0.47900676012477073 2.959318204041284 -0.42354784730295614 0.0051983992985440014 2.9830138609879202 -0.42131327456588674 0.1232180631892842 3.0067095179345564 -0.41907870182881746 0.24123772708002444 3.0304051748811931 -0.41684412909174817 0.35925739097076465 3.0541008318278293 -0.41460955635467894 0.47727705486150518 2.9655465434087631 -0.35681715901708932 0.0034686940352784482 2.9892422003553993 -0.35458258628001998 0.12148835792601866 3.012937857302036 -0.3523480135429507 0.23950802181675887 3.0366335142486722 -0.35011344080588142 0.3575276857074991 2.9717748827762427 -0.29008647073122246 0.0017389887720128932 2.9954705397228789 -0.28785189799415312 0.1197586526627531 3.0191661966695151 -0.28561732525708389 0.23777831655349332 2.9780032221437218 -0.22335578244535564 9.2835087473399548e-006 3.001698879090358 -0.22112120970828639 0.11802894739948755 3.0253945360369947 -0.21888663697121713 0.23604861129022775 3.0079272184578376 -0.15439052142241966 0.11629924213622199 3.0892003934044752 -0.54201638213149372 0.71681992126227312 3.071571234013613 -0.47907602018480178 0.59702724933997209 3.0957620896710827 -0.47208119933866516 0.71517940973955285 3.0781329302802205 -0.40914083739197327 0.59538673781725182 3.1023237859376902 -0.40214601654583659 0.7135388982168327 3.0605037708893583 -0.34620047544528143 0.47559406589495073 3.084694626546828 -0.33920565459914476 0.59374622629453166 3.1088854822042977 -0.33221083375300808 0.71189838669411243 3.0428746114984966 -0.28326011349858954 0.35580139397264937 3.0670654671559658 -0.27626529265245281 0.47395355437223052 3.0912563228134355 -0.26927047180631614 0.5921057147718114 3.1154471784709052 -0.26227565096017946 0.71025787517139227 3.0494363077651041 -0.213324930705761 0.35416088244992916 3.0736271634225734 -0.2063301098596243 0.47231304284951031 3.0978180190800431 -0.19933528901348757 0.59046520324909124 3.1220088747375128 -0.19234046816735093 0.70861736364867201 3.0318071483742419 -0.15038456875906928 0.23436821052762799 3.0559980040317116 -0.14338974791293246 0.35252037092720895 3.0801888596891809 -0.13639492706679579 0.4706725313267901 3.1043797153466506 -0.12940010622065906 0.58882469172637097 3.1285705710041203 -0.1224052853745224 0.70697685212595185 3.0141779889833797 -0.087444206812377398 0.11457553860532688 3.0383688446408494 -0.080449385966240683 0.23272769900490778 3.0625597002983191 -0.073454565120103843 0.35087985940448874 3.0867505559557884 -0.06645974427396717 0.46903201980406989 3.1109414116132581 -0.059464923427830468 0.58718418020365082 3.1351322672707278 -0.052470102581693802 0.70533634060323158 3.0207396852499873 -0.017509024019548871 0.11293502708260665 3.044930540907457 -0.010514203173412182 0.23108718748218757 3.0691213965649262 -0.0035193823272753324 0.34923934788176847 2.7806871523016796 -1.1366011510688072 0.026952729196120202 2.8043819146361777 -1.1388483460749799 0.14479190038460737 2.8280766769706762 -1.141095541081153 0.26263107157309451 2.8517714393051743 -1.1433427360873258 0.38047024276158165 2.8754662016396728 -1.1455899310934989 0.49830941395006917 2.8991609639741713 -1.147837126099672 0.6161485851385563 2.7997511838857108 -1.07235797090964 0.024903420231265093 2.8234459462202088 -1.0746051659158127 0.14274259141975226 2.8471407085547074 -1.0768523609219858 0.2605817626082394 2.8708354708892054 -1.0790995559281586 0.37842093379672659 2.894530233223704 -1.0813467509343317 0.49626010498521406 2.9182249955582025 -1.0835939459405046 0.61409927617370119 2.8188152154697419 -1.0081147907504728 0.022854111266409984 2.84250997780424 -1.0103619857566455 0.14069328245489715 2.8662047401387385 -1.0126091807628186 0.25853245364338429 2.889899502473237 -1.0148563757689915 0.37637162483187148 2.9135942648077351 -1.0171035707751646 0.494210796020359 2.837879247053773 -0.94387161059130542 0.020804802301554869 2.8615740093882711 -0.94611880559747819 0.13864397349004204 2.8852687717227696 -0.94836600060365117 0.25648314467852917 2.9089635340572682 -0.95061319560982416 0.37432231586701642 2.8569432786378042 -0.87962843043213823 0.01875549333669976 2.8806380409723022 -0.88187562543831099 0.13659466452518693 2.9043328033068008 -0.88412282044448398 0.25443383571367412 2.8760073102218353 -0.81538525027297104 0.016706184371844651 2.8997020725563338 -0.8176324452791438 0.13454535556033181 2.9233968348908319 -0.81987964028531679 0.252384526748819 2.8950713418058664 -0.75114207011380385 0.014656875406989543 2.918766104140365 -0.75338926511997661 0.1324960465954767 2.9141353733898976 -0.68689888995463666 0.012607566442134434 2.9331994049739292 -0.62265570979546925 0.01055825747727932 2.9233201497351677 -1.1485889788169648 0.73404004386458455 2.9433289081079712 -1.0813039841452505 0.73209709783194943 2.9382333586236919 -1.0163102240722508 0.61215628563502955 2.9633376664807747 -1.0140189894735363 0.73015415179931442 2.9331378091394118 -0.95131646399925085 0.49221547343810945 2.9582421169964954 -0.94902522940053657 0.61021333960239443 2.9833464248535781 -0.94673399480182208 0.7282112057666793 2.9280422596551325 -0.8863227039262509 0.37227466124118913 2.9531465675122153 -0.88403146932753662 0.49027252740547439 2.9782508753692989 -0.88174023472882235 0.60827039356975932 3.0033551832263816 -0.87944900013010785 0.7262682597340443 2.948051018027936 -0.81903770925453667 0.37033171520855407 2.9731553258850187 -0.8167464746558224 0.48832958137283933 2.9982596337421024 -0.81445524005710812 0.6063274475371242 3.0233639415991851 -0.81216400545839362 0.72432531370140918 2.9429554685436559 -0.75404394918153683 0.25039090301163403 2.968059776400739 -0.75175271458282245 0.36838876917591901 2.9931640842578222 -0.74946147998410817 0.48638663534020427 3.0182683921149058 -0.74717024538539389 0.60438450150448919 3.0433726999719886 -0.7448790107866794 0.72238236766877417 2.9378599190593766 -0.68905018910853688 0.13045009081471398 2.9629642269164593 -0.68675895450982261 0.24844795697899896 2.9880685347735425 -0.68446771991110822 0.36644582314328394 3.0131728426306257 -0.68217648531239394 0.4844436893075692 3.0382771504877089 -0.67988525071367967 0.60244155547185407 3.063381458344792 -0.67759401611496517 0.72043942163613905 2.9578686774321796 -0.62176519443682265 0.12850714478207892 2.9829729852892628 -0.61947395983810838 0.2465050109463639 3.0080772931463455 -0.61718272523939388 0.36450287711064888 3.0331816010034292 -0.61489149064067961 0.48250074327493414 3.0582859088605123 -0.61260025604196533 0.60049860943921907 2.6162923324822254 -1.7056088357484169 0.63564136943710114 2.5934479837118967 -1.698945693223413 0.51799870551018157 2.570603634941568 -1.6922825506984094 0.40035604158326188 2.5477592861712393 -1.6856194081734055 0.28271337765634236 2.5249149374009106 -1.6789562656484018 0.16507071372942292 2.5332570403106147 -1.6129878398892257 0.045143070260368387 2.5561013890809434 -1.6196509824142293 0.16278573418728781 2.5789457378512721 -1.626314124939233 0.28042839811420728 2.6017900866216008 -1.6329772674642369 0.3980710620411268 2.6246344353919295 -1.6396404099892405 0.51571372596804654 2.564443491990648 -1.5536825566550532 0.042858090718233294 2.5872878407609767 -1.5603456991800568 0.16050075464515273 2.610132189531305 -1.5670088417050605 0.2781434185720722 2.6329765383016337 -1.5736719842300644 0.39578608249899172 2.6558208870719628 -1.5803351267550683 0.51342874642591141 2.5956299436706809 -1.4943772734208807 0.040573111176098201 2.61847429244101 -1.5010404159458843 0.15821577510301763 2.6413186412113383 -1.507703558470888 0.27585843902993712 2.664162989981667 -1.5143667009958919 0.39350110295685659 2.6268163953507142 -1.4350719901867084 0.038288131633963107 2.6496607441210429 -1.4417351327117118 0.15593079556088255 2.6725050928913712 -1.4483982752367157 0.27357345948780204 2.6580028470307475 -1.3757667069525359 0.036003152091828007 2.6808471958010762 -1.3824298494775393 0.15364581601874744 2.7036915445714045 -1.3890929920025432 0.2712884799456669 2.6891892987107804 -1.3164614237183634 0.033718172549692914 2.7120336474811091 -1.3231245662433671 0.15136083647661236 2.7203757503908133 -1.2571561404841911 0.031433193007557821 2.7515622020708466 -1.1978508572500186 0.02914821346542272 2.6399188156713858 -1.7108352958595119 0.75334734877544585 2.6475037280024964 -1.6462577338215203 0.63335840915082431 2.6726300932574771 -1.6487290994948585 0.75118580706863602 2.6802150055885878 -1.5841515374568669 0.63119686744401449 2.7053413708435685 -1.586622903130205 0.7490242653618262 2.687799917919699 -1.5195739754188753 0.51120792781939295 2.7129262831746792 -1.5220453410922135 0.62903532573720466 2.7380526484296599 -1.5245167067655516 0.74686272365501649 2.6953848302508097 -1.4549964133808837 0.39121898819477108 2.7205111955057903 -1.4574677790542219 0.50904638611258313 2.7456375607607706 -1.45993914472756 0.62687378403039495 2.7707639260157513 -1.4624105104008982 0.74470118194820667 2.728096107836901 -1.3928902170162303 0.38905744648796131 2.7532224730918817 -1.3953615826895684 0.50688484440577342 2.778348838346862 -1.3978329483629066 0.62471224232358513 2.8034752036018427 -1.4003043140362448 0.74253964024139685 2.7356810201680117 -1.3283126549782387 0.26906850686333977 2.7608073854229924 -1.3307840206515769 0.38689590478115155 2.7859337506779731 -1.333255386324915 0.50472330269896371 2.8110601159329534 -1.3357267519982532 0.62255070061677542 2.836186481187934 -1.3381981176715914 0.74037809853458714 2.7432659324991229 -1.2637350929402473 0.14907956723871829 2.7683922977541031 -1.2662064586135853 0.26690696515653001 2.7935186630090838 -1.2686778242869234 0.38473436307434178 2.8186450282640645 -1.2711491899602616 0.50256176099215388 2.8437713935190447 -1.2736205556335998 0.6203891589099656 2.8688977587740254 -1.2760919213069382 0.73821655682777743 2.7759772100852143 -1.2016288965755937 0.14691802553190852 2.8011035753401949 -1.2041002622489319 0.26474542344972024 2.8262299405951752 -1.20657162792227 0.38257282136753201 2.8513563058501559 -1.2090429935956082 0.50040021928534406 2.8764826711051366 -1.2115143592689464 0.61822761720315589 2.9016090363601168 -1.2139857249422847 0.7360550151209676 2.2272448430964027 -2.1971578601888342 0.65667374996433003 2.2061374898211152 -2.1862337415541138 0.53924077241316493 2.1850301365458273 -2.1753096229193938 0.4218077948619996 2.1638334677553961 -2.0904391452155733 0.067047029606245048 2.1849408210306831 -2.1013632638502933 0.18448000715741011 2.2060481743059706 -2.1122873824850132 0.30191298470857519 2.227155527581258 -2.1232115011197337 0.41934596225974025 2.2482628808565459 -2.1341356197544536 0.53677893981090563 2.2059588587908268 -2.0383410234159132 0.064585197003985656 2.2270662120661138 -2.0492651420506331 0.18201817455515074 2.2481735653414012 -2.0601892606853531 0.29945115210631579 2.2692809186166887 -2.0711133793200736 0.4168841296574809 2.2903882718919766 -2.0820374979547935 0.53431710720864622 2.2480842498262574 -1.9862429016162531 0.062123364401726278 2.2691916031015444 -1.997167020250973 0.17955634195289136 2.2902989563768319 -2.008091138885693 0.29698931950405644 2.3114063096521194 -2.0190152575204134 0.41442229705522149 2.2902096408616881 -1.9341447798165929 0.059661531799466885 2.3113169941369751 -1.9450688984513129 0.17709450935063198 2.3324243474122626 -1.9559930170860329 0.29452748690179703 2.3323350318971188 -1.8820466580169328 0.057199699197207507 2.3534423851724058 -1.892970776651653 0.1746326767483726 2.3745497384476932 -1.903894895286373 0.29206565429953768 2.3744604229325494 -1.8299485362172729 0.054737866594948122 2.3955677762078365 -1.8408726548519929 0.17217084414611322 2.4165858139679801 -1.777850414417613 0.052276033992688743 2.4587112050034108 -1.7257522926179529 0.049814201390429358 2.2694640203318688 -2.144947376809156 0.65421806160703633 2.3136822523794183 -2.0903419040051952 0.65189333795948323 2.3336575693455921 -2.0285689065925374 0.53193021570911314 2.3579004844269678 -2.0357364312012343 0.64956861431193014 2.3536328863117659 -1.9667959091798797 0.41196709345874283 2.3778758013931416 -1.9739634337885767 0.52960549206156005 2.4021187164745168 -1.9811309583972736 0.64724389066437704 2.426361631555892 -1.9882984830059709 0.76488228926719404 2.3978511183593154 -1.912190436375919 0.40964236981118973 2.4220940334406911 -1.9193579609846161 0.52728076841400695 2.4463369485220663 -1.9265254855933129 0.64491916701682395 2.4705798636034415 -1.93369301020201 0.76255756561964094 2.4178264353254892 -1.8504174389632611 0.28967924756081964 2.4420693504068649 -1.8575849635719583 0.40731764616363664 2.4663122654882401 -1.8647524881806552 0.52495604476645386 2.4905551805696153 -1.8719200127893521 0.64259444336927085 2.514798095650991 -1.8790875373980491 0.76023284197208785 2.4378017522916631 -1.7886444415506033 0.16971612531044958 2.4620446673730387 -1.7958119661593004 0.28735452391326655 2.4862875824544144 -1.8029794907679975 0.40499292251608354 2.5105304975357896 -1.8101470153766945 0.52263132111890076 2.5347734126171648 -1.8173145399853914 0.64026971972171776 2.55901632769854 -1.8244820645940885 0.75790811832453475 2.4820199843392126 -1.7340389687466427 0.16739140166289648 2.5062628994205882 -1.7412064933553397 0.28502980026571345 2.5305058145019634 -1.7483740179640368 0.40266819886853045 2.5547487295833387 -1.7555415425727336 0.52030659747134766 2.5789916446647139 -1.7627090671814307 0.63794499607416455 2.6032345597460891 -1.7698765917901276 0.75558339467698155 2.5019953013053868 -1.6722659713339851 0.047428279412526426 1.7463462185136982 -2.6029000154187383 0.67886822422261428 1.7058523274671695 -2.4853774415805212 0.090171320641884989 1.7242413756918347 -2.500304111109612 0.20739196689714764 1.7426304239164996 -2.5152307806387038 0.32461261315241025 1.7610194721411645 -2.530157450167795 0.44183325940767293 1.7794085203658296 -2.5450841196968863 0.55905390566293589 1.7573036775439659 -2.4424882153877605 0.087577648337469283 1.775692725768631 -2.4574148849168513 0.20479829459273194 1.7940817739932959 -2.4723415544459431 0.32201894084799454 1.8124708222179611 -2.4872682239750343 0.43923958710325722 1.830859870442626 -2.5021948935041256 0.55646023335852024 1.8087550276207622 -2.3995989891949998 0.084983976033053577 1.8271440758454274 -2.4145256587240906 0.20220462228831623 1.8455331240700923 -2.4294523282531824 0.31942526854357883 1.8639221722947574 -2.4443789977822736 0.43664591479884152 1.8602063776975586 -2.3567097630022391 0.08239030372863787 1.8785954259222239 -2.3716364325313299 0.19961094998390053 1.8969844741468889 -2.3865631020604217 0.31683159623916313 1.9116577277743549 -2.3138205368094784 0.079796631424222164 1.9300467759990203 -2.3287472063385692 0.19701727767948482 1.9484358242236852 -2.343673875867661 0.31423792393474748 1.9631090778511515 -2.2709313106167177 0.077202959119806444 1.9814981260758167 -2.2858579801458085 0.19442360537506911 2.0145604279279481 -2.228042084423957 0.074609286815390724 2.0660117780047442 -2.1851528582311959 0.072015614510975018 1.7979812782756264 -2.559862523454469 0.67628431779239351 1.8521186756334613 -2.5148054808390383 0.67383343382169936 1.8838505185005745 -2.4580633528269997 0.553948389023173 1.9062560729912963 -2.4697484382236077 0.67138254985100509 1.9155823613676874 -2.4013212248149611 0.43406334422464649 1.9379879158584095 -2.4130063102115691 0.55149750505247874 1.9603934703491313 -2.424691395608177 0.66893166588031094 1.9697197587255224 -2.3562641821995305 0.43161246025395228 1.9921253132162444 -2.3679492675961384 0.54904662108178459 2.0145308677069664 -2.3796343529927464 0.66648078190961668 2.0014516015926356 -2.2995220541874914 0.31172741545542593 2.0238571560833574 -2.3112071395840998 0.42916157628325807 2.0462627105740796 -2.3228922249807078 0.54659573711109033 2.0686682650648014 -2.3345773103773158 0.66402989793892253 2.0331834444597487 -2.2427799261754529 0.19184237065689966 2.0555889989504705 -2.2544650115720608 0.30927653148473172 2.0779945534411923 -2.2661500969686692 0.42671069231256387 2.1004001079319146 -2.2778351823652772 0.54414485314039618 2.1228056624226364 -2.2895202677618851 0.66157901396822827 2.0873208418175837 -2.1977228835600222 0.18939148668620545 2.1097263963083055 -2.2094079689566302 0.30682564751403751 2.1321319507990273 -2.2210930543532386 0.4242598083418696 2.1545375052897495 -2.2327781397498465 0.54169396916970192 2.1769430597804713 -2.2444632251464545 0.65912812999753412 2.1190526846846969 -2.1409807555479836 0.069506441887679168 2.1414582391754187 -2.1526658409445911 0.18694060271551124 2.1638637936661405 -2.1643509263411995 0.30437476354334331 1.1773492084481163 -2.7815983922022971 0.11414320062464099 1.191914725089017 -2.8000801469887007 0.23116799024276885 1.2064802417299174 -2.8185619017751038 0.34819277986089675 1.2210457583708176 -2.8370436565615069 0.46521756947902465 1.2356112750117181 -2.85552541134791 0.58224235909715283 1.23613314843002 -2.7495749549201594 0.11145777201742091 1.2506986650709206 -2.7680567097065629 0.22848256163554878 1.2652641817118211 -2.786538464492966 0.34550735125367671 1.2798296983527213 -2.8050202192793692 0.46253214087180461 1.2943952149936218 -2.8235019740657723 0.57955693048993284 1.2949170884119239 -2.7175515176380216 0.10877234341020083 1.3094826050528243 -2.7360332724244252 0.22579713302832871 1.3240481216937248 -2.7545150272108283 0.34282192264645661 1.338613638334625 -2.7729967819972314 0.45984671226458457 1.3537010283938278 -2.6855280803558834 0.10608691480298074 1.368266545034728 -2.704009835142287 0.22311170442110864 1.3828320616756284 -2.7224915899286906 0.34013649403923657 1.4124849683757317 -2.6535046430737452 0.10340148619576066 1.4270504850166319 -2.6719863978601488 0.22042627581388857 1.4416160016575323 -2.6904681526465524 0.33745106543201647 1.4712689083576354 -2.6214812057916075 0.10071605758854058 1.4858344249985356 -2.6399629605780111 0.2177408472066685 1.530052848339539 -2.5894577685094697 0.098030628981320506 1.5888367883214429 -2.5574343312273315 0.095345200374100436 1.2504156103825972 -2.8738816878242619 0.6992768296251457 1.3125257537946802 -2.8401106221825509 0.69672623414262702 1.3551271541178229 -2.7904550339772172 0.57695046723067933 1.3746358972067632 -2.80633955654084 0.69417563866010834 1.3977285544409657 -2.7407994457718838 0.45717470031873114 1.4172372975299059 -2.7566839683355062 0.57439987174816065 1.4367460406188461 -2.772568490899129 0.69162504317758966 1.4598386978530487 -2.7070283801301729 0.45462410483621246 1.4793474409419889 -2.7229129026937953 0.57184927626564197 1.4988561840309291 -2.7387974252574181 0.68907444769507098 1.5024400981761916 -2.6573727919248396 0.33484833792426461 1.5219488412651316 -2.6732573144884619 0.45207350935369378 1.5414575843540719 -2.6891418370520848 0.56929868078312329 1.5609663274430119 -2.7050263596157071 0.68652385221255241 1.5450414984993344 -2.6077172037195062 0.21507257101231675 1.5645502415882746 -2.6236017262831286 0.33229774244174592 1.5840589846772146 -2.639486248846751 0.4495229138711751 1.6035677277661549 -2.6553707714103738 0.56674808530060461 1.6230764708550949 -2.6712552939739966 0.68397325673003373 1.6071516419114174 -2.5739461380777953 0.21252197552979807 1.6266603850003576 -2.5898306606414176 0.3297471469592273 1.6461691280892976 -2.6057151832050405 0.44697231838865642 1.6656778711782376 -2.6215997057686629 0.56419748981808593 1.6851866142671779 -2.6374842283322857 0.68142266124751516 1.6497530422345601 -2.5242905498724619 0.092746208617850212 1.6692617853235003 -2.5401750724360843 0.20997138004727942 1.6887705284124404 -2.5560595949997071 0.32719655147670862 1.7082792715013804 -2.5719441175633295 0.44442172290613779 1.7277880145903206 -2.5878286401269524 0.56164689433556725 0.58995388141449323 -2.9454264651825524 0.021710955933942785 0.59956154551699892 -2.9666884733153989 0.13858339396853694 0.60916920961950449 -2.9879504814482445 0.25545583200313077 0.61877687372201007 -3.0092124895810906 0.37232827003772467 0.62838453782451587 -3.0304744977139366 0.48920070807231858 0.63799220192702155 -3.0517365058467827 0.60607314610691276 0.65375426769060252 -2.9255073616026444 0.018977403568139664 0.66336193179310832 -2.9467693697354909 0.13584984160273383 0.67296959589561378 -2.9680313778683365 0.25272227963732763 0.68257725999811936 -2.9892933860011826 0.36959471767192154 0.69218492410062515 -3.0105553941340286 0.48646715570651544 0.70179258820313084 -3.0318174022668747 0.60333959374110957 0.71755465396671181 -2.9055882580227363 0.016243851202336543 0.72716231806921761 -2.9268502661555829 0.13311628923693072 0.73676998217172307 -2.9481122742884285 0.24998872727152452 0.74637764627422865 -2.9693742824212745 0.36686116530611845 0.75598531037673444 -2.9906362905541206 0.4837336033407123 0.7813550402428211 -2.8856691544428283 0.013510298836533419 0.79096270434532689 -2.9069311625756749 0.13038273687112761 0.80057036844783247 -2.9281931707085205 0.24725517490572141 0.81017803255033805 -2.9494551788413665 0.36412761294031532 0.8451554265189305 -2.8657500508629203 0.010776746470730295 0.85476309062143618 -2.8870120589957668 0.12764918450532448 0.86437075472394176 -2.9082740671286125 0.2445216225399183 0.87397841882644733 -2.9295360752614585 0.36139406057451223 0.90895581279503979 -2.8458309472830123 0.0080431941049271729 0.91856347689754547 -2.8670929554158588 0.12491563213952135 0.92817114100005105 -2.8883549635487045 0.24178807017411519 0.97275619907114919 -2.8259118437031043 0.0053096417391240479 0.98236386317365487 -2.8471738518359508 0.12218207977371823 1.0365565853472585 -2.8059927401231968 0.0025760893733209268 1.046164249449764 -2.8272547482560428 0.1194485274079151 0.64779688945785474 -3.0729398546275735 0.72295093578537639 0.71555450780317043 -3.0518425730457728 0.72032487163518255 0.76788594983953873 -3.0112156161752672 0.60066832426031413 0.78331212614848622 -3.0307452914639721 0.71769880748498871 0.82021739187590681 -2.9705886593047612 0.48101177688544539 0.83564356818485452 -2.9901183345934665 0.59804226011012029 0.85106974449380202 -3.0096480098821714 0.71507274333479487 0.88797501022122272 -2.9494913777229606 0.47838571273525154 0.90340118653017032 -2.9690210530116659 0.59541619595992645 0.91882736283911781 -2.9885507283003707 0.71244667918460103 0.94030645225759091 -2.908864420852455 0.35872916536038307 0.95573262856653851 -2.9283940961411599 0.47575964858505765 0.97115880487548611 -2.9479237714298652 0.59279013180973261 0.98658498118443361 -2.96745344671857 0.70982061503440719 0.99263789429395921 -2.868237463981949 0.23907261798551466 1.0080640706029067 -2.8877671392706543 0.35610310121018918 1.0234902469118543 -2.9072968145593592 0.47313358443486381 1.0389164232208019 -2.9268264898480645 0.59016406765953866 1.0543425995297495 -2.9463561651367693 0.70719455088421335 1.060395512639275 -2.8471401824001483 0.23644655383532079 1.0758216889482226 -2.8666698576888536 0.35347703705999534 1.09124786525717 -2.8861995329775589 0.47050752028466991 1.1066740415661176 -2.9057292082662638 0.58753800350934482 1.1221002178750652 -2.9252588835549691 0.70456848673401951 1.1127269546756433 -2.8065132255296423 0.11679000646045232 1.1281531309845909 -2.8260429008183481 0.23382048968512689 1.1435793072935383 -2.8455725761070534 0.3508509729098015 1.1590054836024859 -2.8651022513957582 0.46788145613447607 1.1744316599114333 -2.8846319266844636 0.58491193935915087 1.1898578362203809 -2.9041616019731689 0.70194242258382555 0.52271410877206748 -2.9533751299643862 0.024422695058799182 0.45645268714149667 -2.9604434820286549 0.027148376053776704 0.46022734519020975 -2.9833038607419424 0.14394428164649417 0.39019126551092587 -2.9675118340929232 0.029874057048754225 0.39396592355963894 -2.9903722128062107 0.1466699626414717 0.32392984388035506 -2.9745801861571919 0.032599738043731744 0.32770450192906814 -2.9974405648704789 0.14939564363644922 0.33147915997778127 -3.0203009435837669 0.26619154922916671 0.25766842224978426 -2.9816485382214601 0.035325419038709269 0.26144308029849728 -3.0045089169347476 0.15212132463142675 0.26521773834721041 -3.0273692956480351 0.26891723022414427 0.26899239639592365 -3.0502296743613226 0.38571313581686179 0.1914070006192134 -2.9887168902857288 0.038051100033686794 0.19518165866792647 -3.0115772689990159 0.15484700562640427 0.19895631671663958 -3.0344376477123034 0.27164291121912182 0.20273097476535279 -3.0572980264255909 0.38843881681183934 0.12514557898864259 -2.9957852423499971 0.040776781028664312 0.12892023703735567 -3.0186456210632846 0.1575726866213818 0.1326948950860688 -3.0415059997765717 0.27436859221409932 0.13646955313478198 -3.0643663784898592 0.39116449780681684 0.14024421118349512 -3.0872267572031467 0.5079604033995343 0.058884157358071718 -3.0028535944142658 0.043502462023641837 0.062658815406784793 -3.0257139731275529 0.16029836761635935 0.066433473455497924 -3.0485743518408404 0.27709427320907687 0.07020813150421111 -3.0714347305541274 0.39389017880179439 0.073982789552924227 -3.0942951092674149 0.5106860843945118 0.077757447601637358 -3.1171554879807024 0.62748198998722926 0.011496025971066593 -3.1242238400449707 0.63020767098220687 0.0077213679223534165 -3.1013634613316832 0.51341176538948929 0.0039467098736403108 -3.0785030826183961 0.39661585979677194 0.0001720518249271266 -3.0556427039051086 0.27981995420405442 0.015354839965998957 -3.1470761443731887 0.7470046536933429 0.086012947072123813 -3.1395859500844123 0.74433524621341496 0.1465190852090833 -3.109847251422694 0.62478830944854657 0.15667105417824867 -3.1320957557956359 0.74166583873348702 0.20702522334604284 -3.0801085527609757 0.50524137268367786 0.2171771923152081 -3.1023570571339176 0.62211890196861863 0.22732916128437347 -3.1246055615068595 0.73899643125355918 0.27768333045216764 -3.0726183584721993 0.50257196520374992 0.28783529942133296 -3.0948668628451412 0.61944949448869069 0.29798726839049827 -3.1171153672180831 0.73632702377363124 0.33818946858912718 -3.0428796598104819 0.38302502843888148 0.34834143755829244 -3.0651281641834229 0.49990255772382203 0.35849340652745781 -3.0873766685563648 0.61678008700876286 0.36864537549662313 -3.1096251729293067 0.73365761629370341 0.39869560672608673 -3.0131409611487636 0.26347809167401298 0.40884757569525199 -3.0353894655217055 0.38035562095895359 0.41899954466441724 -3.0576379698946465 0.49723315024389414 0.42915151363358262 -3.0798864742675884 0.61411067952883491 0.43930348260274793 -3.1021349786405299 0.73098820881377546 0.46935371383221153 -3.0056507668599872 0.26080868419408509 0.47950568280137679 -3.0278992712329291 0.37768621347902565 0.48965765177054205 -3.0501477756058701 0.49456374276396625 0.49980962073970742 -3.0723962799788116 0.61144127204890708 0.50996158970887273 -3.0946447843517535 0.72831880133384763 0.52985985196917107 -2.9759120681982694 0.14126174742921666 0.54001182093833633 -2.9981605725712108 0.25813927671415721 0.55016378990750159 -3.0204090769441523 0.37501680599909776 0.56031575887666685 -3.0426575813170937 0.49189433528403831 0.57046772784583222 -3.0649060856900352 0.60877186456897914 0.58061969681499759 -3.0871545900629767 0.72564939385391969 -0.67828472123600447 -3.485181297419301 1.3636283981382737 -0.66836783660671473 -3.4200658043852141 1.2647143994447996 -0.65845095197742487 -3.3549503113511268 1.1658004007513254 -0.64853406734813523 -3.2898348183170398 1.066886402057851 -0.63861718271884549 -3.2247193252829529 0.96797240336437684 -0.54798164056511167 -3.0999533166262325 0.76788694296445037 -0.55789852519440153 -3.1650688096603199 0.86680094165792443 -0.56781540982369116 -3.2301843026944068 0.96571494035139849 -0.57773229445298091 -3.2952997957284937 1.0646289390448727 -0.58764917908227055 -3.3604152887625807 1.163542937738347 -0.5975660637115604 -3.425530781796668 1.2624569364318212 -0.47717986766995729 -3.1054182940376864 0.76562947995147201 -0.48709675229924704 -3.1705337870717738 0.86454347864494607 -0.49701363692853667 -3.2356492801058607 0.96345747733842013 -0.50693052155782636 -3.3007647731399476 1.0623714760318943 -0.51684740618711611 -3.3658802661740346 1.1612854747253687 -0.41629497940409266 -3.1759987644832277 0.86228601563196783 -0.42621186403338229 -3.2411142575173146 0.96120001432544189 -0.43612874866267204 -3.3062297505514016 1.0601140130189159 -0.44604563329196179 -3.3713452435854889 1.1590280117123903 -0.34549320650893833 -3.1814637418946816 0.86002855261898947 -0.35541009113822797 -3.2465792349287685 0.95894255131246353 -0.36532697576751771 -3.3116947279628555 1.0578565500059376 -0.27469143361378401 -3.1869287193061355 0.85777108960601123 -0.28460831824307364 -3.2520442123402225 0.95668508829948529 -0.20388966071862949 -3.1923936967175894 0.85551362659303287 -0.21380654534791918 -3.2575091897516764 0.95442762528650693 -0.1330878878234753 -3.1978586741290433 0.85325616358005463 -0.056396202389210774 -3.2038626926116844 0.85093724292968653 -0.047346417609958204 -3.2707140032367699 0.94965333602044366 -0.038296632830705689 -3.3375653138618557 1.0483694291112005 -0.029246848051453167 -3.4044166244869416 1.1470855222019576 -0.020197063272200628 -3.471267935112027 1.2458016152927147 -0.011147278492948092 -3.5381192457371129 1.3445177083834716 -0.13155408303832844 -3.2640221270176788 0.95205068132823079 -0.12250429825907597 -3.3308734376427642 1.0507667744189877 -0.11345451347982347 -3.3977247482678501 1.1494828675097448 -0.10440472870057091 -3.4645760588929355 1.2481989606005019 -0.095354943921318366 -3.5314273695180214 1.3469150536912589 -0.20671196368744615 -3.3241815614236732 1.0531641197267747 -0.19766217890819368 -3.3910328720487586 1.1518802128175318 -0.1886123941289411 -3.457884182673844 1.250596305908289 -0.17956260934968854 -3.5247354932989299 1.3493123989990461 -0.29091962911581637 -3.3174896852045817 1.0555614650345619 -0.28186984433656387 -3.3843409958296675 1.1542775581253191 -0.27282005955731126 -3.4511923064547529 1.2529936512160762 -0.2637702747780587 -3.5180436170798384 1.3517097443068331 -0.36607750976493408 -3.377649119610576 1.1566749034331061 -0.35702772498568147 -3.4445004302356614 1.2553909965238632 -0.34797794020642886 -3.5113517408607473 1.3541070896146203 -0.44123539041405185 -3.4378085540165704 1.2577883418316504 -0.43218560563479924 -3.5046598646416558 1.3565044349224074 -0.52544305584242201 -3.4311166777974789 1.2601856871394375 -0.51639327106316935 -3.4979679884225647 1.3589017802301946 -0.60060093649153945 -3.4912761122034732 1.3612991255379816 -1.1673161351100152 -2.9400730340751946 0.78832524354935973 -1.1943155509237249 -3.0009810433301443 0.88776390253007953 -1.2213149667374341 -3.0618890525850935 0.98720256151079944 -1.2483143825511434 -3.1227970618400436 1.0866412204915192 -1.275313798364853 -3.1837050710949932 1.1860798794722391 -1.3023132141785623 -3.2446130803499429 1.285518538452959 -1.0988366712152993 -2.9592690600475797 0.78605580648611062 -1.1258360870290087 -3.0201770693025294 0.88549446546683042 -1.1528355028427182 -3.0810850785574786 0.98493312444755032 -1.1798349186564274 -3.1419930878124287 1.08437178342827 -1.2068343344701371 -3.2029010970673784 1.1838104424089901 -1.2338337502838463 -3.263809106322328 1.2832491013897098 -1.0303572073205833 -2.9784650860199648 0.78378636942286151 -1.0573566231342928 -3.0393730952749145 0.8832250284035813 -1.0843560389480023 -3.1002811045298637 0.98266368738430121 -1.1113554547617115 -3.1611891137848138 1.082102346365021 -1.1383548705754212 -3.2220971230397635 1.1815410053457409 -0.9618777434258674 -2.99766111199235 0.78151693235961239 -0.98887715923957686 -3.0585691212472996 0.88095559134033219 -1.0158765750532863 -3.1194771305022488 0.9803942503210521 -1.0428759908669956 -3.1803851397571989 1.0798329093017718 -0.89339827953115147 -3.0168571379647351 0.77924749529636328 -0.92039769534486082 -3.0777651472196847 0.87868615427708308 -0.94739711115857028 -3.138673156474634 0.97812481325780298 -0.82491881563643532 -3.0360531639371202 0.77697805823311417 -0.85191823145014467 -3.0969611731920699 0.87641671721383396 -0.87891764726385413 -3.1578691824470195 0.97585537619455387 -0.75643935174171939 -3.0552491899095053 0.77470862116986505 -0.78343876755542874 -3.116157199164455 0.87414728015058496 -0.68795988784700335 -3.0744452158818905 0.77243918410661594 -1.3275872252224927 -3.3060074133542825 1.3849038473193576 -1.246147680974999 -3.3288563762953993 1.3822336800735189 -1.1552404152174787 -3.2858558348285132 1.2806669399195914 -1.1647081367275052 -3.3517053392365161 1.3795635128276802 -1.0643331494599586 -3.2428552933616279 1.1791001997656638 -1.0738008709699849 -3.30870479776963 1.2779967726737527 -1.0832685924800116 -3.374554302177633 1.3768933455818415 -0.9734258837024381 -3.1998547518947418 1.0775334596117361 -0.98289360521246483 -3.2657042563027447 1.1764300325198251 -0.99236132672249122 -3.3315537607107468 1.275326605427914 -1.0018290482325178 -3.3974032651187498 1.3742231783360028 -0.89198633945494421 -3.2227037148358586 1.0748632923658974 -0.90145406096497083 -3.2885532192438616 1.1737598652739865 -0.91092178247499733 -3.3544027236518636 1.2726564381820753 -0.92038950398502406 -3.4202522280598666 1.3715530110901641 -0.80107907369742393 -3.1797031733689733 0.97329655221196987 -0.81054679520745054 -3.2455526777769754 1.0721931251200587 -0.82001451671747705 -3.3114021821849784 1.1710896980281478 -0.82948223822750367 -3.3772516865929805 1.2699862709362366 -0.83894995973753039 -3.4431011910009834 1.3688828438443252 -0.71017180793990375 -3.1367026319020872 0.87172981205804234 -0.71963952944993026 -3.2025521363100902 0.97062638496613118 -0.72910725095995688 -3.2684016407180922 1.06952295787422 -0.73857497246998338 -3.3342511451260952 1.1684195307823089 -0.74804269398001 -3.4001006495340973 1.2673161036903977 -0.75751041549003673 -3.4659501539421003 1.3662126765984866 -0.61926454218238336 -3.0937020904352015 0.77016307190411493 -0.6287322636924102 -3.1595515948432045 0.86905964481220377 -1.7480011576554104 -2.6556254090390983 0.80896719489294888 -1.7896164868086559 -2.7087082367633659 0.9088710800964328 -1.831231815961901 -2.7617910644876336 1.0087749652999167 -1.8728471451151463 -2.8148738922119012 1.1086788505034009 -1.9144624742683916 -2.8679567199361689 1.208582735706885 -1.684228812503878 -2.6879920247355686 0.80668545450993756 -1.7258441416571235 -2.7410748524598363 0.90658933971342148 -1.7674594708103686 -2.7941576801841039 1.0064932249169054 -1.8090747999636139 -2.8472405079083716 1.1063971101203895 -1.8506901291168592 -2.9003233356326392 1.2063009953238737 -1.8923054582701044 -2.9534061633569069 1.3062048805273578 -1.6204564673523458 -2.720358640432039 0.80440371412692624 -1.6620717965055913 -2.7734414681563067 0.90430759933041016 -1.7036871256588362 -2.8265242958805743 1.0042114845338941 -1.7453024548120815 -2.8796071236048419 1.1041153697373782 -1.786917783965327 -2.93268995132911 1.2040192549408624 -1.5566841222008136 -2.7527252561285094 0.80212197374391492 -1.5982994513540589 -2.805808083852777 0.90202585894739884 -1.639914780507304 -2.8588909115770447 1.0019297441508828 -1.6815301096605493 -2.9119737393013123 1.1018336293543669 -1.4929117770492812 -2.7850918718249797 0.7998402333609036 -1.5345271062025265 -2.8381746995492474 0.89974411856438752 -1.5761424353557718 -2.891257527273515 0.99964800376787155 -1.6177577645090169 -2.9443403549977827 1.0995518889713556 -1.4291394318977491 -2.8174584875214501 0.79755849297789227 -1.4707547610509941 -2.8705413152457178 0.8974623781813762 -1.5123700902042394 -2.9236241429699854 0.99736626338486034 -1.3653670867462169 -2.8498251032179205 0.79527675259488095 -1.4069824158994619 -2.9029079309421881 0.89518063779836499 -1.3015947415946845 -2.8821917189143909 0.79299501221186963 -1.2378223964431521 -2.9145583346108612 0.79071327182885831 -1.925096405299354 -3.0109956366456405 1.4058301353528606 -1.8230573173143205 -2.988569288828951 1.3037502415738578 -1.8502052576625601 -3.0490406671249564 1.4031973181357282 -1.7210182293292871 -2.9661429410122619 1.2016703477948545 -1.7481661696775266 -3.0266143193082669 1.3011174243567254 -1.7753141100257661 -3.0870856976042722 1.4005645009185961 -1.6461270816924931 -3.0041879714915778 1.1990375305777223 -1.6732750220407326 -3.0646593497875827 1.298484607139593 -1.7004229623889722 -3.125130728083588 1.3979316837014637 -1.5440879937074594 -2.9817616236748878 1.096957636798719 -1.5712359340556992 -3.0422330019708936 1.19640471336059 -1.5983838744039387 -3.1027043802668985 1.2958517899224606 -1.6255318147521784 -3.1631757585629039 1.3952988664843315 -1.4420489057224259 -2.9593352758581988 0.9948777430197161 -1.4691968460706657 -3.0198066541542037 1.0943248195815867 -1.4963447864189054 -3.0802780324502095 1.1937718961434578 -1.523492726767145 -3.1407494107462144 1.2932189727053285 -1.5506406671153847 -3.2012207890422197 1.3926660492671992 -1.3400098177373925 -2.9369089280415088 0.89279784924071304 -1.3671577580856322 -2.9973803063375142 0.99224492580258383 -1.3943056984338718 -3.0578516846335195 1.0916920023644545 -1.4214536387821115 -3.1183230629295253 1.1911390789263254 -1.4486015791303513 -3.1787944412255302 1.2905861554881961 -1.4757495194785908 -3.2392658195215356 1.390033232050067 -1.2651186701005988 -2.9749539585208247 0.89016503202358077 -1.2922666104488383 -3.03542533681683 0.98961210858545157 -1.319414550797078 -3.0958967151128354 1.0890591851473221 -1.3465624911453178 -3.1563680934088407 1.1885062617091933 -1.3737104314935575 -3.2168394717048461 1.287953338271064 -1.4008583718417971 -3.2773108500008514 1.3874004148329346 -2.2053028751797994 -2.3015341516530246 0.82714078449404449 -2.258359842392506 -2.3442464057053414 0.92741130409592398 -2.311416809605213 -2.3869586597576582 1.0276818236978034 -2.3644737768179196 -2.4296709138099746 1.127952343299683 -2.4175307440306266 -2.4723831678622914 1.2282228629015628 -2.4705877112433337 -2.5150954219146082 1.3284933825034422 -2.1490985213086384 -2.3457243846612701 0.82489079962179301 -2.202155488521345 -2.3884366387135869 0.92516131922367251 -2.255212455734052 -2.4311488927659037 1.0254318388255519 -2.3082694229467586 -2.4738611468182201 1.1257023584274315 -2.3613263901594657 -2.5165734008705369 1.2259728780293113 -2.0928941674374775 -2.3899146176695152 0.82264081474954154 -2.1459511346501841 -2.4326268717218325 0.92291133435142103 -2.1990081018628911 -2.4753391257741488 1.0231818539533004 -2.2520650690755977 -2.5180513798264657 1.12345237355518 -2.0366898135663165 -2.4341048506777607 0.82039082987729006 -2.0897467807790231 -2.4768171047300775 0.92066134947916944 -2.1428037479917301 -2.5195293587823939 1.0209318690810489 -2.1958607152044367 -2.5622416128347112 1.1212023886829285 -1.9804854596951553 -2.4782950836860058 0.81814084500503848 -2.0335424269078621 -2.5210073377383226 0.91841136460691797 -2.0865993941205687 -2.5637195917906395 1.0186818842087975 -1.9242811058239941 -2.5224853166942514 0.815890860132787 -1.9773380730367007 -2.5651975707465682 0.91616137973466638 -1.868076751952833 -2.5666755497024965 0.81364087526053541 -1.8118723980816718 -2.610865782710742 0.81139089038828394 -2.4119151318238452 -2.5612459259067903 1.3261674296626211 -2.3050935337323772 -2.5607862706809135 1.2237220158947388 -2.3468051388751388 -2.6125090400335997 1.3236433437018393 -2.2399835407836712 -2.6120493848077229 1.221197929933957 -2.2816951459264327 -2.6637721541604096 1.3211192577410578 -2.1331619426922033 -2.611589729581846 1.1187525161660745 -2.1748735478349648 -2.6633124989345323 1.2186738439731752 -2.2165851529777263 -2.715035268287219 1.318595171780276 -2.0263403446007358 -2.6111300743559691 1.0163071023981922 -2.0680519497434968 -2.6628528437086558 1.1162284302052929 -2.1097635548862588 -2.7145756130613421 1.2161497580123937 -2.1514751600290198 -2.7662983824140288 1.3160710858194944 -1.9195187465092678 -2.6106704191300922 0.91386168863031003 -1.9612303516520295 -2.6623931884827785 1.0137830164374104 -2.0029419567947908 -2.7141159578354652 1.1137043442445111 -2.0446535619375523 -2.7658387271881519 1.2136256720516119 -2.0863651670803138 -2.8175614965408382 1.3135469998587126 -2.1280767722230749 -2.8692842658935249 1.4134683276658133 -1.8544087535605616 -2.6619335332569016 0.91133760266952835 -1.8961203587033233 -2.7136563026095883 1.0112589304766288 -1.9378319638460846 -2.7653790719622746 1.1111802582837296 -1.9795435689888461 -2.8171018413149613 1.2111015860908303 -2.0212551741316074 -2.868824610667648 1.311022913897931 -2.0629667792743689 -2.9205473800203343 1.4109442417050315 -1.9561451811829014 -2.9200877247944574 1.3084988279371492 -1.9978567863256627 -2.9718104941471442 1.4084201557442499 -2.6374282130317628 -1.8169030412229821 0.84706882680845696 -2.6985772028814816 -1.8477822214321153 0.94761357349518816 -2.7597261927312 -1.8786614016412486 1.0481583201819196 -2.8208751825809188 -1.9095405818503819 1.1487030668686506 -2.8820241724306377 -1.9404197620595152 1.2492478135553824 -2.9431731622803565 -1.9712989422686484 1.3497925602421137 -2.5911146413583785 -1.8710432189831889 0.84488116545925129 -2.6522636312080974 -1.9019223991923222 0.94542591214598248 -2.7134126210578158 -1.9328015794014555 1.045970658832714 -2.7745616109075346 -1.9636807596105887 1.1465154055194451 -2.8357106007572539 -1.994559939819722 1.2470601522061768 -2.5448010696849943 -1.9251833967433958 0.84269350411004562 -2.6059500595347131 -1.9560625769525291 0.94323825079677681 -2.667099049384432 -1.9869417571616623 1.0437829974835082 -2.7282480392341508 -2.0178209373707956 1.1443277441702395 -2.7893970290838697 -2.0487001175799286 1.244872490856971 -2.4984874980116101 -1.9793235745036026 0.84050584276083995 -2.5596364878613294 -2.0102027547127359 0.94105058944757125 -2.6207854777110478 -2.041081934921869 1.0415953361343027 -2.6819344675607666 -2.0719611151310025 1.142140082821034 -2.4521739263382258 -2.0334637522638097 0.83831818141163439 -2.5133229161879451 -2.0643429324729428 0.93886292809836558 -2.574471906037664 -2.0952221126820758 1.0394076747850969 -2.405860354664842 -2.0876039300240166 0.83613052006242872 -2.4670093445145609 -2.1184831102331496 0.93667526674916002 -2.3595467829914578 -2.1417441077842234 0.83394285871322316 -2.313233211318074 -2.1958842855444303 0.83175519736401748 -2.8957408681575743 -2.0267661671636961 1.3475704392003112 -2.842776257044302 -2.0887959182824845 1.3451779077560491 -2.7370885035846384 -2.1099516090555035 1.2425001686331369 -2.7898116459310298 -2.1508256694012728 1.342785376311787 -2.6314007501249743 -2.1311072998285225 1.1398224295102244 -2.6841238924713657 -2.1719813601742919 1.2401076371888748 -2.7368470348177576 -2.2128554205200612 1.3403928448675251 -2.5257129966653107 -2.1522629906015416 1.0371446903873123 -2.5784361390117017 -2.1931370509473109 1.1374298980659625 -2.6311592813580935 -2.2340111112930803 1.2377151057446127 -2.6838824237044854 -2.2748851716388496 1.338000313423263 -2.420025243205647 -2.1734186813745606 0.93446695126440005 -2.4727483855520385 -2.21429274172033 1.0347521589430502 -2.5254715278984294 -2.2551668020660993 1.1350373666217004 -2.5781946702448213 -2.2960408624118687 1.2353225743003509 -2.6309178125912132 -2.336914922757638 1.3356077819790011 -2.3670606320923744 -2.235448432493349 0.93207441982013806 -2.4197837744387658 -2.2763224928391184 1.0323596274987883 -2.4725069167851568 -2.3171965531848877 1.1326448351774385 -2.5252300591315486 -2.3580706135306571 1.2329300428560888 -2.5779532014779405 -2.3989446738764264 1.333215250534739 -2.2613728786327107 -2.2566041232663681 0.82939668069722594 -2.3140960209791017 -2.2974781836121374 0.92968188837587606 -2.3668191633254936 -2.3383522439579068 1.0299670960545262 -2.4195423056718846 -2.3792263043036757 1.1302523037331764 -2.4722654480182764 -2.4201003646494454 1.2305375114118269 -2.5249885903646678 -2.4609744249952148 1.3308227190904771 -2.8961405307402459 -1.2366793145622752 0.76547586162820869 -2.962293612575241 -1.2550314187958027 0.86622299413159665 -3.0284466944102357 -1.2733835230293302 0.96697012663498461 -3.0945997762452309 -1.2917356272628577 1.0677172591383723 -3.1607528580802255 -1.310087731496385 1.1684643916417603 -2.9276137885917715 -1.3169468089687233 0.86412037313609291 -2.9937668704267661 -1.3352989132022508 0.96486750563948087 -3.0599199522617613 -1.3536510174357783 1.0656146381428686 -3.126073034096756 -1.3720031216693056 1.1663617706462566 -3.1922261159317511 -1.3903552259028333 1.2671089031496445 -2.8929339646083019 -1.3788621991416439 0.86201775214058918 -2.9590870464432966 -1.3972143033751714 0.96276488464397714 -3.0252401282782917 -1.4155664076086989 1.0635120171473649 -3.0913932101132864 -1.4339185118422264 1.1642591496507528 -3.1575462919482815 -1.4522706160757539 1.2650062821541406 -2.8582541406248323 -1.4407775893145645 0.85991513114508544 -2.924407222459827 -1.459129693548092 0.9606622636484734 -2.9905603042948221 -1.4774817977816195 1.0614093961518611 -3.0567133861298168 -1.495833902015147 1.1621565286552489 -2.8235743166413627 -1.502692979487485 0.85781251014958171 -2.8897273984763574 -1.5210450837210125 0.95855964265296956 -2.9558804803113525 -1.5393971879545401 1.0593067751563574 -2.7888944926578931 -1.5646083696604056 0.85570988915407797 -2.8550475744928878 -1.5829604738939331 0.95645702165746582 -2.7542146686744235 -1.6265237598333264 0.85360726815857413 -2.719534844690954 -1.6884391500062472 0.85150464716307039 -3.2576690596746682 -1.4100025021706295 1.3678323560548349 -3.2184061025547885 -1.4802767537168964 1.3655769102040438 -3.1188210841589816 -1.5215641035957228 1.2627687675877313 -3.1791431454349088 -1.5505510052631633 1.3633214643532527 -3.0192360657631743 -1.5628514534745492 1.1599606249714181 -3.0795581270391019 -1.5918383551419897 1.2605133217369402 -3.1398801883150291 -1.6208252568094299 1.3610660185024617 -2.9196510473673665 -1.6041388033533761 1.0571524823551055 -2.9799731086432946 -1.6331257050208161 1.157705179120627 -3.0402951699192222 -1.6621126066882566 1.2582578758861491 -3.1006172311951494 -1.6910995083556966 1.3588105726516708 -2.8200660289715591 -1.6454261532322023 0.95434433973879262 -2.8803880902474868 -1.674413054899643 1.0548970365043144 -2.9407101515234149 -1.703399956567083 1.1554497332698359 -3.0010322127993425 -1.7323868582345234 1.2560024300353581 -3.0613542740752697 -1.7613737599019634 1.3565551268008798 -2.7808030718516794 -1.7157004047784692 0.95208889388800155 -2.8411251331276071 -1.7446873064459096 1.0526415906535234 -2.9014471944035352 -1.7736742081133499 1.1531942874190451 -2.9617692556794628 -1.8026611097807901 1.253746984184567 -3.0220913169553905 -1.8316480114482303 1.3542996809500889 -2.6812180534558721 -1.7569877546572958 0.84928075127168889 -2.7415401147317997 -1.7859746563247361 0.94983344803721059 -2.8018621760077274 -1.8149615579921763 1.0503861448027323 -2.8621842372836555 -1.8439484596596165 1.150938841568254 -2.9225062985595831 -1.8729353613270567 1.2514915383337761 -2.9828283598355112 -1.901922262994497 1.3520442350992978 -3.0986840470652974 -0.63333809393340823 0.78347628778643286 -3.1671277038750185 -0.63884653298528637 0.88437768456927723 -3.2355713606847396 -0.64435497203716463 0.9852790813521215 -3.0768789655282118 -0.70065217744598551 0.78148231416933034 -3.1453226223379329 -0.70616061649786377 0.88238371095217472 -3.213766279147654 -0.71166905554974191 0.98328510773501898 -3.2822099359573746 -0.71717749460162017 1.0841865045178631 -3.3506535927670957 -0.72268593365349831 1.1850879013007076 -3.4190972495768168 -0.72819437270537657 1.2859892980835523 -3.0550738839911262 -0.76796626095856291 0.77948834055222782 -3.1235175408008473 -0.77347470001044105 0.8803897373350722 -3.1919611976105684 -0.7789831390623192 0.98129113411791646 -3.260404854420289 -0.78449157811419745 1.0821925309007607 -3.3288485112300101 -0.7900000171660756 1.183093927683605 -3.3972921680397312 -0.79550845621795385 1.2839953244664497 -3.0332688024540406 -0.83528034447114041 0.77749436693512519 -3.1017124592637617 -0.84078878352301856 0.87839576371796957 -3.1701561160734828 -0.8462972225748967 0.97929716050081395 -3.2385997728832034 -0.85180566162677496 1.0801985572836581 -3.3070434296929245 -0.8573141006786531 1.1810999540665026 -3.011463720916955 -0.9025944279837177 0.77550039331802267 -3.0799073777266761 -0.90810286703559584 0.87640179010086705 -3.1483510345363972 -0.91361130608747398 0.97730318688371132 -3.2167946913461178 -0.91911974513935224 1.0782045836665557 -2.9896586393798694 -0.96990851149629509 0.77350641970092004 -3.0581022961895905 -0.97541695054817312 0.87440781648376453 -3.1265459529993112 -0.98092538960005127 0.9753092132666088 -2.9678535578427838 -1.0372225950088725 0.77151244608381753 -3.0362972146525049 -1.0427310340607505 0.8724138428666619 -2.9460484763056982 -1.1045366785214499 0.7695184724667149 -3.0144921331154193 -1.1100451175733279 0.87041986924955939 -2.9242433947686126 -1.171850762034027 0.76752449884961238 -3.4870099170249858 -0.73539999622381069 1.3868674476553171 -3.4624793642573644 -0.81142541704640669 1.3847541503576006 -3.3729997741762223 -0.87077265728381037 1.2818924539883934 -3.437948811489743 -0.8874508378690027 1.3826408530598839 -3.2835201840950803 -0.93011989752121393 1.1790307576191859 -3.3484692214086009 -0.94679807810640637 1.2797791566906767 -3.4134182587221216 -0.96347625869159859 1.3805275557621675 -3.1940405940139383 -0.98946713775861772 1.0761690612499786 -3.2589896313274589 -1.00614531834381 1.1769174603214692 -3.3239386686409795 -1.0228234989290024 1.27766585939296 -3.3888877059545002 -1.0395016795141947 1.3784142584644508 -3.1045610039327958 -1.0488143779960213 0.9733073648807713 -3.1695100412463169 -1.0654925585812136 1.0740557639522619 -3.2344590785598375 -1.0821707391664059 1.1748041630237525 -3.2994081158733581 -1.0988489197515985 1.2755525620952433 -3.3643571531868788 -1.1155271003367906 1.3763009611667341 -3.0800304511651748 -1.1248397988186174 0.9711940675830546 -3.1449794884786955 -1.1415179794038095 1.0719424666545452 -3.2099285257922161 -1.1581961599890018 1.172690865726036 -3.2748775631057367 -1.1748743405741944 1.2734392647975268 -3.3398266004192574 -1.1915525211593865 1.3741876638690176 -2.9905508610840328 -1.1841870390560212 0.86833237121384732 -3.0554998983975534 -1.2008652196412135 0.96908077028533801 -3.1204489357110741 -1.2175434002264056 1.0698291693568285 -3.1853979730245947 -1.2342215808115979 1.1705775684283193 -3.2503470103381153 -1.2508997613967905 1.2713259674998101 -3.315296047651636 -1.2675779419819826 1.3720743665713009 -3.2258164575704944 -1.3269251822193864 1.2692126702020936 -3.290765494884015 -1.3436033628045787 1.3699610692735844 -3.1755090360403528 -0.00017281438300964513 0.8002155121914919 -3.1673597600144219 -0.070340600583897683 0.79836218701426653 -3.2355965720319126 -0.06289608749784914 0.89938845101836584 -3.3038333840494025 -0.055451574411800653 1.0004147150224652 -3.3720701960668933 -0.048007061325752221 1.1014409790265645 -3.4403070080843832 -0.040562548239703761 1.2024672430306635 -3.5085438201018739 -0.033118035153655287 1.3034935070347631 -3.1592104839884909 -0.14050838678478572 0.79650886183704117 -3.2274472960059817 -0.13306387369873718 0.89753512584114048 -3.2956841080234716 -0.12561936061268869 0.99856138984523979 -3.3639209200409623 -0.11817484752664026 1.099587653849339 -3.4321577320584522 -0.11073033444059178 1.2006139178534383 -3.500394544075943 -0.10328582135454326 1.3016401818575378 -3.15106120796256 -0.21067617298567387 0.7946555366598157 -3.2192980199800507 -0.20323165989962527 0.89568180066391512 -3.2875348319975406 -0.19578714681357681 0.99670806466801432 -3.3557716440150314 -0.18834263372752835 1.0977343286721135 -3.4240084560325212 -0.18089812064147986 1.1987605926762128 -3.142911931936629 -0.28084395918656191 0.79280221148259034 -3.2111487439541198 -0.27339944610051325 0.89382847548668964 -3.2793855559716096 -0.26595493301446482 0.99485473949078895 -3.3476223679891004 -0.25851041992841634 1.095881003494888 -3.134762655910698 -0.35101174538744995 0.79094888630536486 -3.2029994679281888 -0.34356723230140129 0.89197515030946428 -3.2712362799456787 -0.33612271921535286 0.99300141431356348 -3.1266133798847671 -0.42117953158833799 0.7890955611281395 -3.1948501919022578 -0.41373501850228933 0.89012182513223881 -3.1184641038588361 -0.49134731778922613 0.78724223595091403 -3.1867009158763264 -0.48390280470317748 0.88826849995501345 -3.1103148278329051 -0.56151510399011417 0.78538891077368866 -3.5765509686143173 -0.027841404398706859 1.4044956072433934 -3.5674486580226294 -0.10700525114309223 1.4025420095726466 -3.4913397426342732 -0.1820012109229876 1.2996915828102498 -3.5583463474309416 -0.18616909788747771 1.4005884119018999 -3.4152308272459169 -0.2569971707028828 1.1968411560478527 -3.4822374320425853 -0.26116505766737302 1.297737985139503 -3.5492440368392537 -0.26533294463186308 1.3986348142311531 -3.3391219118575601 -0.33199313048277795 1.0939907292854558 -3.406128516654229 -0.33616101744726823 1.1948875583771059 -3.4731351214508974 -0.34032890441175845 1.2957843874687562 -3.5401417262475658 -0.3444967913762485 1.3966812165604063 -3.2630129964692038 -0.40698909026267316 0.99114030252305896 -3.3300196012658723 -0.41115697722716338 1.0920371316147091 -3.3970262060625411 -0.41532486419165365 1.1929339607063592 -3.4640328108592096 -0.41949275115614382 1.2938307897980095 -3.531039415655878 -0.42366063812063393 1.3947276188896596 -3.253910685877516 -0.48615293700705881 0.98918670485231219 -3.3209172906741844 -0.49032082397154897 1.0900835339439623 -3.3879238954708533 -0.49448871093603924 1.1909803630356124 -3.4549305002675217 -0.49865659790052941 1.2918771921272627 -3.5219371050641901 -0.50282448486501952 1.3927740212189128 -3.1778017704891597 -0.56114889678695401 0.88633627808991533 -3.2448083752858281 -0.56531678375144423 0.98723310718156543 -3.3118149800824965 -0.56948467071593445 1.0881299362732155 -3.378821584879165 -0.57365255768042467 1.1890267653648656 -3.4458281896758338 -0.57782044464491478 1.2899235944565162 -3.5128347944725022 -0.58198833160940489 1.390820423548166 -3.3027126694908087 -0.64864851746031982 1.0861763386024688 -3.3697192742874771 -0.65281640442481004 1.1870731676941191 -3.4367258790841455 -0.65698429138930015 1.2879699967857694 -3.5037324838808139 -0.66115217835379025 1.3888668258774193 -3.1286115766245777 0.56700725919003969 0.81358148951794307 -3.1941943625377167 0.58722966515127395 0.91471390414578169 -3.2597771484508549 0.60745207111250799 1.0158463187736202 -3.3253599343639939 0.62767447707374213 1.1169787334014587 -3.3909427202771325 0.64789688303497628 1.2181111480292972 -3.4565255061902715 0.66811928899621054 1.3192435626571359 -3.134427401810798 0.49666098460649527 0.81191624903386195 -3.2000101877239371 0.51688339056772947 0.91304866366170057 -3.2655929736370752 0.53710579652896362 1.0141810782895391 -3.3311757595502143 0.55732820249019777 1.1153134929173776 -3.3967585454633529 0.57755060845143191 1.2164459075452161 -3.4623413313764915 0.59777301441266606 1.3175783221730546 -3.1402432269970184 0.4263147100229509 0.81025100854978083 -3.2058260129101575 0.446537115984185 0.91138342317761944 -3.2714087988232956 0.4667595219454192 1.012515837805458 -3.3369915847364346 0.48698192790665329 1.1136482524332965 -3.4025743706495732 0.50720433386788744 1.214780667061135 -3.1460590521832388 0.35596843543940632 0.80858576806569971 -3.2116418380963778 0.37619084140064041 0.90971818269353832 -3.277224624009516 0.39641324736187455 1.0108505973213768 -3.3428074099226546 0.4166356533231087 1.1119830119492153 -3.1518748773694591 0.2856221608558619 0.80692052758161859 -3.2174576632825982 0.30584456681709604 0.9080529422094572 -3.2830404491957363 0.32606697277833013 1.0091853568372957 -3.1576907025556795 0.21527588627231747 0.80525528709753746 -3.2232734884688181 0.23549829223355162 0.90638770172537597 -3.1635065277418999 0.14492961168877305 0.80359004661345634 -3.2290893136550385 0.16515201765000723 0.90472246124129485 -3.1693223529281203 0.074583337105228464 0.80192480612937522 -3.4689641953068788 0.51864382328247971 1.3158262740169098 -3.4089500058268323 0.43076570688018878 1.2130552116214874 -3.4756164377084642 0.43919490938474931 1.314071065818311 -3.3489358163467857 0.34288759047789796 1.1102841492260658 -3.4156022482284176 0.35131679298245838 1.2113000034228887 -3.4822686801100495 0.35974599548701891 1.3123158576197123 -3.5489351119916819 0.36817519799157949 1.4133317118165352 -3.2889216268667396 0.25500947407560703 1.0075130868306437 -3.3555880587483715 0.26343867658016756 1.1085289410274668 -3.422254490630003 0.27186787908472798 1.2095447952242899 -3.4889209225116353 0.28029708158928851 1.3105606494211135 -3.5555873543932672 0.28872628409384909 1.4115765036179364 -3.295573869268325 0.17556056017787666 1.0057578786320449 -3.3622403011499569 0.18398976268243716 1.106773732828868 -3.4289067330315888 0.19241896518699758 1.2077895870256912 -3.4955731649132207 0.20084816769155808 1.3088054412225145 -3.5622395967948526 0.20927737019611864 1.4098212954193377 -3.2355596797882784 0.087682443775585747 0.90298681623662291 -3.3022261116699103 0.096111646280146304 1.0040026704334462 -3.3688925435515427 0.10454084878470679 1.1050185246302691 -3.4355589754331741 0.11297005128926725 1.2060343788270924 -3.5022254073148065 0.12139925379382774 1.3070502330239158 -3.5688918391964379 0.12982845629838827 1.4080660872207387 -3.2422119221898642 0.0082335298778552814 0.90123160803802416 -3.3088783540714961 0.016662732382415855 1.0022474622348472 -3.375544785953128 0.025091934886976332 1.1032633164316703 -3.4422112178347599 0.033521137391536809 1.2042791706284937 -3.5088776497163918 0.041950339896097283 1.3052950248253168 -3.5755440815980237 0.050379542400657791 1.4063108790221399 -2.9611667785486007 1.18520342476031 0.82648966873667185 -3.0216748971610943 1.2176120511002466 0.92771420558597373 -3.0821830157735883 1.2500206774401832 1.0289387424352758 -3.1426911343860819 1.2824293037801198 1.1301632792845775 -3.203199252998576 1.3148379301200563 1.2313878161338794 -3.2637073716110701 1.3472465564599931 1.3326123529831815 -2.980754308898073 1.117412437685942 0.82508419279343292 -3.0412624275105666 1.1498210640258786 0.92630872964273492 -3.1017705461230607 1.1822296903658149 1.0275332664920369 -3.1622786647355543 1.2146383167057515 1.1287578033413386 -3.2227867833480484 1.2470469430456881 1.2299823401906405 -3.283294901960542 1.2794555693856247 1.3312068770399426 -3.0003418392475454 1.049621450611574 0.82367871685019411 -3.060849957860039 1.0820300769515105 0.924903253699496 -3.121358076472533 1.1144387032914467 1.026127790548798 -3.1818661950850267 1.1468473296313832 1.1273523273980997 -3.2423743136975207 1.1792559559713198 1.2285768642474018 -3.0199293695970177 0.98183046353720571 0.82227324090695519 -3.0804374882095114 1.0142390898771423 0.92349777775625719 -3.1409456068220054 1.0466477162170784 1.0247223146055591 -3.201453725434499 1.079056342557015 1.125946851454861 -3.0395168999464901 0.91403947646283745 0.82086776496371638 -3.1000250185589837 0.94644810280277403 0.92209230181301827 -3.1605331371714778 0.97885672914271027 1.0233168386623201 -3.0591044302959625 0.84624848938846919 0.81946228902047746 -3.1196125489084561 0.87865711572840577 0.92068682586977946 -3.0786919606454348 0.77845750231410105 0.81805681307723865 -3.1392000792579289 0.81086612865403762 0.91928134992654054 -3.0982794909949072 0.71066651523973268 0.81665133713399973 -3.3053625018063624 1.2033070275634481 1.3297220106779799 -3.2636593457966412 1.105744579275582 1.2271170489500087 -3.3275943600671507 1.1266049533915108 1.3282318861793554 -3.2219561897869196 1.0081821309877159 1.1245120872220375 -3.2858912040574295 1.0290425051036447 1.2256269244513842 -3.349826218327939 1.0499028792195735 1.3267417616807309 -3.1802530337771984 0.91061968269985005 1.0219071254940664 -3.2441880480477079 0.93148005681577872 1.123021962723413 -3.3081230623182178 0.9523404309317075 1.2241367999527597 -3.3720580765887274 0.97320080504763629 1.3252516371821064 -3.2024848920379867 0.83391760852791275 1.0204170009954419 -3.2664199063084962 0.85477798264384153 1.1215318382247885 -3.3303549205790057 0.87563835675977031 1.2226466754541352 -3.3942899348495157 0.89649873087569909 1.3237615126834821 -3.1607817360282655 0.73635516024004666 0.91781203926747079 -3.224716750298775 0.75721553435597533 1.0189268764968176 -3.2886517645692845 0.77807590847190411 1.1200417137261642 -3.3525867788397941 0.79893628258783289 1.2211565509555107 -3.416521793110304 0.81979665670376178 1.3222713881848576 -3.1190785800185443 0.63879271195218057 0.81520707753949961 -3.1830135942890538 0.65965308606810946 0.91632191476884639 -3.2469486085595629 0.68051346018403802 1.0174367519981931 -3.3108836228300724 0.70137383429996691 1.1185515892275397 -3.3748186371005824 0.7222342084158957 1.2196664264568864 -3.4387536513710919 0.74309458253182459 1.3207812636862333 -2.6707134736845251 1.7580247770547384 0.83608394576300726 -2.723829921648909 1.8015523576690742 0.93738803226879386 -2.776946369613293 1.8450799382834102 1.0386921187745803 -2.830062817577677 1.888607518897746 1.1399962052803669 -2.7033596827242214 1.695486883650656 0.83504813652792598 -2.7564761306886054 1.7390144642649918 0.93635222303371246 -2.8095925786529894 1.7825420448793277 1.0376563095394991 -2.8627090266173734 1.8260696254936637 1.1389603960452857 -2.9158254745817573 1.8695972061079997 1.2402644825510722 -2.9689419225461413 1.9131247867223355 1.3415685690568591 -2.7360058917639178 1.6329489902465735 0.83401232729284458 -2.7891223397283018 1.6764765708609093 0.93531641379863117 -2.8422387876926858 1.7200041514752453 1.0366205003044178 -2.8953552356570698 1.7635317320895814 1.1379245868102044 -2.9484716836214537 1.8070593127039172 1.239228673315991 -2.7686521008036142 1.5704110968424911 0.83297651805776329 -2.8217685487679982 1.613938677456827 0.93428060456354978 -2.8748849967323822 1.657466258071163 1.0355846910693365 -2.9280014446967662 1.700993838685499 1.1368887775751231 -2.8012983098433106 1.5078732034384086 0.8319407088226819 -2.8544147578076946 1.5514007840527444 0.93324479532846849 -2.907531205772079 1.5949283646670804 1.0345488818342552 -2.833944518883007 1.4453353100343262 0.83090489958760061 -2.887060966847391 1.4888628906486621 0.93220898609338709 -2.9401774148117754 1.5323904712629979 1.0335130725991737 -2.8665907279227039 1.3827974166302439 0.82986909035251921 -2.9197071758870878 1.4263249972445795 0.93117317685830581 -2.8992369369624003 1.3202595232261614 0.82883328111743793 -3.0053566152438878 1.8434365161163349 1.3404618404817643 -2.9835986062666495 1.7398144762376404 1.2381461793695965 -3.0424159604520291 1.7725250722046355 1.3393429801489858 -2.9618405972894113 1.6361924363589462 1.1358305182574289 -3.0206579514747909 1.6689030323259411 1.237027319036818 -3.0794753056601705 1.7016136282929362 1.3382241198162073 -2.9988999424975527 1.5652809924472466 1.1347116579246503 -3.0577172966829322 1.5979915884142417 1.2359084587040394 -3.1165346508683118 1.6307021843812368 1.3371052594834287 -2.9771419335203149 1.4616589525685524 1.0323959968124827 -3.035959287705694 1.4943695485355473 1.1335927975918718 -3.0947766418910736 1.5270801445025424 1.2347895983712609 -3.1535939960764532 1.5597907404695375 1.3359863991506502 -2.9553839245430766 1.3580369126898579 0.9300803357003149 -3.0142012787284562 1.3907475086568528 1.0312771364797042 -3.0730186329138354 1.4234581046238479 1.1324739372590933 -3.1318359870992154 1.456168700590843 1.2336707380384824 -3.190653341284595 1.4888792965578381 1.3348675388178717 -2.9336259155658388 1.2544148728111637 0.82776467458814729 -2.992443269751218 1.2871254687781586 0.92896147536753637 -3.0512606239365976 1.3198360647451535 1.0301582761469257 -3.1100779781219772 1.3525466607121486 1.1313550769263148 -3.1688953323073568 1.3852572566791437 1.2325518777057038 -3.2277126864927363 1.4179678526461386 1.3337486784850932 -2.2682153481997651 2.260199577958077 0.84078115409963639 -2.3126960483199719 2.2054820305046876 0.84028729298894733 -2.3562967784427995 2.2586084824189672 0.94165694731540217 -2.3998975085656271 2.3117349343332458 1.0430266016418568 -2.4434982386884547 2.364861386247525 1.1443962559683116 -2.4870989688112828 2.4179878381618041 1.2457659102947665 -2.5306996989341108 2.4711142900760836 1.3471355646212215 -2.3571767484401787 2.1507644830512986 0.83979343187825828 -2.4007774785630063 2.2038909349655778 0.94116308620471312 -2.4443782086858339 2.2570173868798569 1.0425327405311677 -2.4879789388086615 2.310143838794136 1.1439023948576226 -2.5315796689314896 2.3632702907084151 1.2452720491840774 -2.4016574485603854 2.0960469355979097 0.83929957076756923 -2.445258178683213 2.1491733875121888 0.94066922509402406 -2.4888589088060407 2.2022998394264679 1.0420388794204787 -2.5324596389288683 2.255426291340747 1.1434085337469335 -2.4461381486805922 2.0413293881445203 0.83880570965688017 -2.4897388788034198 2.0944558400587994 0.94017536398333501 -2.5333396089262474 2.1475822919730785 1.0415450183097896 -2.490618848800799 1.9866118406911311 0.83831184854619112 -2.5342195789236266 2.03973829260541 0.93968150287264596 -2.5778203090464546 2.0928647445196895 1.0410511571991006 -2.5350995489210058 1.9318942932377419 0.83781798743550207 -2.5787002790438334 1.985020745152021 0.9391876417619569 -2.5795802490412125 1.8771767457843527 0.83732412632481301 -2.5793957532313327 2.4111985839126562 1.3465828066400536 -2.5785570009579013 2.3054740247549859 1.2447433051667953 -2.6299658123681651 2.3489719510345077 1.346003865089088 -2.5777182486844699 2.1997494655973155 1.1429038036935373 -2.6291270600947336 2.2432473918768374 1.2441643636158297 -2.6805358715049974 2.2867453181563593 1.3454249235381224 -2.6282883078213022 2.1375228327191671 1.1423248621425717 -2.6796971192315659 2.181020758998689 1.2435854220648641 -2.7311059306418297 2.2245186852782108 1.3448459819871568 -2.6274495555478712 2.0317982735614972 1.0404853606693139 -2.6788583669581345 2.0752961998410187 1.1417459205916061 -2.7302671783683983 2.1187941261205405 1.2430064805138985 -2.781675989778662 2.1622920524000624 1.3442670404361912 -2.6266108032744397 1.9260737144038271 0.93864585919605592 -2.6780196146847035 1.9695716406833488 1.0399064191183482 -2.7294284260949668 2.0130695669628702 1.1411669790406405 -2.7808372375052306 2.0565674932423921 1.2424275389629329 -2.8322460489154944 2.1000654195219139 1.3436880988852256 -2.6257720510010087 1.8203491552461568 0.8368063577227981 -2.6771808624112725 1.8638470815256785 0.93806691764509031 -2.7285896738215358 1.9073450078052003 1.0393274775673826 -2.7799984852317992 1.9508429340847218 1.1405880374896749 -2.8314072966420629 1.9943408603642436 1.2418485974119671 -2.8828161080523267 2.0378387866437655 1.3431091573342597 -2.8819773557788952 1.9321142274860954 1.2412696558610015 -2.933386167189159 1.9756121537656171 1.3425302157832941 -1.8243918676044342 2.6237778205148583 0.83834495666049236 -1.8565793566619124 2.6845994688412778 0.93975733885623713 -1.8887668457193905 2.7454211171676977 1.0411697210519819 -1.9209543347768685 2.8062427654941171 1.1425821032477266 -1.9531418238343465 2.8670644138205366 1.2439944854434715 -1.9853293128918248 2.9278860621469565 1.3454068676392166 -1.8790002050014958 2.5792406931013132 0.83866903189777608 -1.911187694058974 2.6400623414277327 0.94008141409352086 -1.9433751831164521 2.7008839897541526 1.0414937962892656 -1.9755626721739301 2.761705638080572 1.1429061784850103 -2.0077501612314084 2.8225272864069915 1.2443185606807552 -1.9336085423985576 2.5347035656877681 0.83899310713505981 -1.9657960314560357 2.5955252140141876 0.94040548933080459 -1.9979835205135137 2.656346862340607 1.0418178715265494 -2.0301710095709917 2.7171685106670265 1.143230253722294 -1.9882168797956195 2.490166438274223 0.83931718237234354 -2.0204043688530975 2.5509880866006425 0.94072956456808832 -2.0525918579105755 2.6118097349270619 1.0421419467638331 -2.0847793469680536 2.6726313832534814 1.1435543289595778 -2.0428252171926813 2.4456293108606775 0.83964125760962727 -2.0750127062501593 2.5064509591870969 0.94105363980537204 -2.1072001953076374 2.5672726075135164 1.0424660220011168 -2.0974335545897431 2.4010921834471324 0.83996533284691111 -2.1296210436472207 2.4619138317735514 0.94137771504265588 -2.152041891986805 2.3565550560335873 0.84028940808419483 -2.0431329654567389 2.8806946805903135 1.3456938283559143 -2.0635241523767411 2.7770218847769015 1.2446290965086964 -2.1054154303400963 2.8297828816326005 1.345928766357086 -2.1258066172600985 2.7261100858191885 1.244864034509868 -2.1676978952234536 2.778871082674887 1.3461637043582577 -2.1461978041801011 2.622437290005776 1.1437993026626503 -2.1880890821434558 2.675198286861475 1.2450989725110397 -2.2299803601068109 2.727959283717174 1.3463986423594294 -2.1665889911001037 2.5187644941923635 1.0427345708154325 -2.2084802690634584 2.5715254910480625 1.144034240663822 -2.2503715470268131 2.6242864879037615 1.2453339105122114 -2.2922628249901682 2.677047484759461 1.3466335803606011 -2.1869801780201064 2.4150916983789514 0.94166983896821488 -2.228871455983461 2.46785269523465 1.0429695088166042 -2.2707627339468157 2.5206136920903495 1.1442691786649937 -2.3126540119101704 2.5733746889460485 1.2455688485133831 -2.3545452898735251 2.6261356858017475 1.3468685183617728 -2.207371364940109 2.3114189025655389 0.84060510712099723 -2.2492626429034637 2.364179899421238 0.94190477696938657 -2.2911539208668179 2.416940896276937 1.0432044468177759 -2.333045198830173 2.469701893132636 1.1445041166661654 -2.3749364767935277 2.5224628899883355 1.2458037865145548 -2.4168277547568824 2.5752238868440345 1.3471034563629445 -2.311545107786821 2.3132681004635249 0.94213971497055826 -2.3534363857501752 2.3660290973192235 1.0434393848189476 -2.3953276637135299 2.418790094174923 1.1447390546673371 -2.4372189416768846 2.471551091030622 1.2460387245157265 -2.4791102196402393 2.5243120878863214 1.347338394364116 -1.2590140176550451 2.9292588271156852 0.82523308874704093 -1.2780121109445379 2.9955567627490685 0.92663028443334028 -1.2970102042340304 3.0618546983824522 1.0280274801196396 -1.316008297523523 3.1281526340158363 1.129424675805939 -1.3350063908130156 3.19445056964922 1.2308218714922383 -1.3540044841025083 3.2607485052826037 1.3322190671785381 -1.3215951056017947 2.8970027986405489 0.82681700562645677 -1.3405931988912876 2.9633007342739321 0.92821420131275612 -1.35959129218078 3.0295986699073159 1.0296113969990555 -1.3785893854702729 3.0958966055407 1.1310085926853548 -1.3975874787597653 3.1621945411740837 1.2324057883716542 -1.4165855720492582 3.228492476807467 1.3338029840579537 -1.3841761935485444 2.8647467701654126 0.82840092250587261 -1.4031742868380372 2.9310447057987958 0.92979811819217195 -1.4221723801275297 2.9973426414321795 1.0311953138784713 -1.4411704734170225 3.0636405770655637 1.1325925095647706 -1.4601685667065152 3.1299385126989474 1.23398970525107 -1.446757281495294 2.8324907416902763 0.82998483938528844 -1.4657553747847869 2.8987886773236595 0.93138203507158779 -1.4847534680742793 2.9650866129570432 1.0327792307578871 -1.5037515613637722 3.0313845485904274 1.1341764264441865 -1.5093383694420437 2.8002347132151399 0.83156875626470428 -1.5283364627315366 2.8665326488485232 0.93296595195100362 -1.5473345560210292 2.9328305844819069 1.034363147637303 -1.5719194573887934 2.7679786847400036 0.83315267314412012 -1.590917550678286 2.8342766203733869 0.93454986883041957 -1.634500545335543 2.7357226562648673 0.83473659002353606 -1.6970816332822924 2.703466627789731 0.8363205069029519 -1.4880853237219631 3.1914090658312664 1.3353069830360631 -1.529510899614591 3.094022842307194 1.2355130363158242 -1.559967795916364 3.1541185006887016 1.3368075525518872 -1.5709364755072193 2.9966366187831213 1.1357190895955858 -1.6013933718089921 3.0567322771646288 1.2370136058316483 -1.6318502681107652 3.1168279355461364 1.3383081220677113 -1.6123620513998473 2.8992503952590485 1.0359251428753475 -1.6428189477016204 2.9593460536405565 1.1372196591114099 -1.673275844003393 3.019441712022064 1.2385141753474724 -1.7037327403051661 3.0795373704035716 1.3398086915835354 -1.6537876272924754 2.8018641717349766 0.9361311961551092 -1.6842445235942483 2.8619598301164837 1.0374257123911717 -1.7147014198960213 2.9220554884979912 1.138720228627234 -1.7451583161977942 2.9821511468794988 1.2400147448632965 -1.775615212499567 3.0422468052610068 1.3413092610993596 -1.7256700994868766 2.7645736065924114 0.93763176567093331 -1.7561269957886494 2.8246692649739189 1.0389262819069958 -1.7865838920904222 2.8847649233554264 1.1402207981430581 -1.8170407883921951 2.9448605817369335 1.2415153143791207 -1.8474976846939681 3.0049562401184415 1.3428098306151834 -1.7670956753795046 2.667187383068339 0.83783781895069487 -1.7975525716812777 2.7272830414498461 0.93913233518675743 -1.8280094679830505 2.7873786998313541 1.0404268514228197 -1.8584663642848234 2.8474743582128612 1.1417213676588822 -1.8889232605865962 2.9075700165943688 1.2430158838949448 -1.9193801568883693 2.9676656749758763 1.3443104001310076 -0.64181166482916296 3.1040638489228778 0.79491740265567823 -0.64550266418907609 3.1732622189051285 0.89611150913281035 -0.64919366354898922 3.2424605888873783 0.99730561560994246 -0.7098036965985407 3.0858686273373301 0.79841430387662971 -0.71349469595845383 3.1550669973195808 0.89960841035376193 -0.71718569531836707 3.2242653673018307 1.0008025168308941 -0.72087669467828008 3.2934637372840814 1.1019966233080261 -0.72456769403819321 3.3626621072663316 1.2031907297851583 -0.72825869339810623 3.4318604772485819 1.3043848362622905 -0.77779572836791844 3.0676734057517825 0.80191120509758129 -0.78148672772783156 3.1368717757340332 0.90310531157471341 -0.7851777270877448 3.206070145716283 1.0042994180518456 -0.78886872644765793 3.2752685156985337 1.1054935245289776 -0.79255972580757095 3.344466885680784 1.2066876310061099 -0.84578776013729617 3.0494781841662348 0.80540810631853277 -0.8494787594972093 3.1186765541484855 0.906602212795665 -0.85316975885712254 3.1878749241307354 1.0077963192727972 -0.85686075821703567 3.2570732941129861 1.1089904257499292 -0.91377979190667391 3.0312829625806872 0.80890500753948436 -0.91747079126658715 3.1004813325629379 0.91009911401661658 -0.92116179062650039 3.1696797025451882 1.0112932204937488 -0.9248527899864134 3.2388780725274384 1.1124873269708808 -0.98177182367605187 3.01308774099514 0.81240190876043594 -0.98546282303596511 3.0822861109773902 0.91359601523756806 -0.98915382239587835 3.1514844809596405 1.0147901217147002 -1.0497638554454296 2.9948925194095923 0.81589880998138742 -1.0534548548053428 3.0640908893918426 0.91709291645851965 -1.1177558872148072 2.9766972978240451 0.81939571120233889 -0.73611288920918172 3.4997939673414749 1.405576081748614 -0.7984662130802016 3.4129921367894034 1.3078802149774875 -0.81558218699450458 3.4781116744301621 1.4090650956760007 -0.86081953695122149 3.3261903062373319 1.2101843482063606 -0.87793551086552446 3.3913098438780906 1.3113692289048742 -0.89505148477982743 3.4564293815188494 1.4125541096033876 -0.94028883473654434 3.3045080133260192 1.2136733621337472 -0.95740480865084732 3.3696275509667779 1.3148582428322608 -1.0026421586075642 3.2177061827739477 1.1159774953626205 -1.0197581325218672 3.2828257204147064 1.2171623760611339 -1.0368741064361702 3.3479452580554652 1.3183472567596475 -1.0649954824785841 3.1309043522218767 1.0182816285914937 -1.0821114563928871 3.196023889862635 1.1194665092900071 -1.0992274303071901 3.2611434275033937 1.2206513899885205 -1.116343404221493 3.3262629651441524 1.3218362706870341 -1.127348806349604 3.0441025216698052 0.920585761820367 -1.144464780263907 3.1092220593105639 1.0217706425188804 -1.1615807541782099 3.1743415969513222 1.1229555232173938 -1.1786967280925129 3.239461134592081 1.2241404039159072 -1.1958127020068159 3.3045806722328401 1.325325284614421 -1.1897021302206237 2.9573006911177342 0.82288989504924026 -1.2068181041349269 3.0224202287584925 0.92407477574775365 -1.2239340780492298 3.0875397663992512 1.025259656446267 -1.2410500519635326 3.1526593040400099 1.1264445371447807 -1.2581660258778358 3.2177788416807687 1.227629417843294 -1.2752819997921387 3.2828983793215274 1.3288142985418077 -0.054995187324732409 3.2015093949227045 0.84720877050117094 -0.039407670310477372 3.270099229116084 0.94756306793366529 -0.02382015329622228 3.3386890633094639 1.0479173653661595 -0.0082326362819672982 3.4072788975028443 1.148271662798654 -0.12586317748926534 3.1986068762218012 0.85331098459798849 -0.11027566047501036 3.2671967104151807 0.95366528203048273 -0.094688143460755297 3.3357865446085606 1.054019579462977 -0.079100626446500344 3.404376378801941 1.1543738768954714 -0.063513109432245279 3.4729662129953209 1.2547281743279659 -0.047925592417990291 3.5415560471887009 1.3550824717604601 -0.19673116765379822 3.1957043575208979 0.85941319869480592 -0.18114365063954327 3.2642941917142774 0.95976749612730017 -0.16555613362528823 3.3328840259076578 1.0601217935597944 -0.14996861661103328 3.4014738601010377 1.1604760909922889 -0.13438109959677821 3.4700636942944176 1.2608303884247833 -0.2675991578183311 3.1928018388199946 0.86551541279162336 -0.25201164080407618 3.2613916730133745 0.96586971022411772 -0.23642412378982119 3.3299815072067545 1.0662240076566121 -0.22083660677556624 3.3985713414001348 1.1665783050891063 -0.35405466499711929 3.1213094859257118 0.77126332945594644 -0.33846714798286409 3.1898993201190917 0.87161762688844091 -0.32287963096860917 3.2584891543124712 0.97197192432093527 -0.30729211395435424 3.3270789885058516 1.0723262217534295 -0.42492265516165217 3.1184069672248085 0.77736554355276399 -0.40933513814739703 3.1869968014181884 0.87771984098525835 -0.3937476211331421 3.2555866356115684 0.9780741384177527 -0.49579064532618511 3.1155044485239052 0.78346775764958143 -0.48020312831192991 3.1840942827172856 0.8838220550820759 -0.56665863549071804 3.1126019298230023 0.78956997174639898 -0.13311641520910689 3.5374828562988987 1.3615438767725849 -0.21897089302265815 3.4660396283494457 1.2672767207000093 -0.22000390693006222 3.5332709887114269 1.3680478311938782 -0.30482537083620959 3.3945964003999931 1.1730095646274334 -0.3058583847436136 3.4618277607619738 1.2737806751213026 -0.30689139865101767 3.529059121123955 1.3745517856151714 -0.39067984864976085 3.3231531724505401 1.0787424085548578 -0.39171286255716492 3.3903845328125208 1.1795135190487267 -0.39274587646456893 3.457615893174502 1.2802846295425958 -0.393778890371973 3.5248472535364828 1.3810557400364647 -0.47653432646331206 3.2517099445010871 0.98447525248228218 -0.47756734037071613 3.3189413048630678 1.0852463629761511 -0.47860035427812025 3.386172665225049 1.18601747347002 -0.47963336818552427 3.4534040255870297 1.2867885839638891 -0.48066638209292833 3.5206353859490109 1.387559694457758 -0.56238880427686344 3.1802667165516345 0.89020809640970655 -0.5634218181842674 3.2474980769136153 0.99097920690357544 -0.56445483209167147 3.314729437275596 1.0917503173974443 -0.56548784599907553 3.3819607976375767 1.1925214278913132 -0.5665208599064796 3.4491921579995579 1.2932925383851823 -0.56755387381388367 3.5164235183615387 1.3940636488790512 -0.65134232381262702 3.3105175696881237 1.0982542718187376 -0.65237533772003109 3.3777489300501049 1.1990253823126062 -0.65340835162743516 3.4449802904120856 1.2997964928064756 -0.65444136553483923 3.5122116507740668 1.4005676033003442 0.6700167557997132 3.4982800360643536 1.3820133246073054 0.66186372222840795 3.4308720352780764 1.2799283421889183 0.65371068865710291 3.3634640344917988 1.1778433597705311 0.64555765508579777 3.2960560337055207 1.0757583773521435 0.63740462151449262 3.2286480329192431 0.9736733949337566 0.49950641699641357 3.1154878007757505 0.78399055768893711 0.50765945056771877 3.1828958015620281 0.88607554010732403 0.51581248413902392 3.2503038023483053 0.98816052252571107 0.52396551771032907 3.3177118031345829 1.0902455049440982 0.53211855128163421 3.385119803920861 1.1923304873624856 0.3779142796209447 3.1371435702048127 0.79847768528089158 0.38606731319224991 3.2045515709910903 0.90056266769927851 0.39422034676355505 3.2719595717773675 1.0026476501176655 0.4023733803348602 3.3393675725636451 1.1047326325360527 0.25632214224547611 3.1587993396338749 0.81296481287284605 0.26447517581678132 3.2262073404201526 0.91504979529123298 0.27262820938808646 3.2936153412064302 1.0171347777096202 0.13473000487000758 3.1804551090629372 0.82745194046480042 0.54451101087942688 3.4515655541901955 1.293600263386574 0.56700762297569973 3.5157178982521344 1.3929270948530101 0.41973449857095374 3.4046855535752201 1.2050469767946796 0.44223111066722659 3.4688378976371599 1.304373808261116 0.46472772276349944 3.5329902416990988 1.4037006397275522 0.2949579862624806 3.3578055529602446 1.1164936902027851 0.3174545983587535 3.4219578970221844 1.2158205216692217 0.3399512104550263 3.4861102410841243 1.3151473531356581 0.14768486185773458 3.2467732082833298 0.9286135721444545 0.1701814739540074 3.3109255523452692 1.0279404036108908 0.19267808605028033 3.375077896407209 1.1272672350773272 0.21517469814655321 3.4392302404691488 1.2265940665437638 0.23767131024282603 3.5033825845310886 1.3259208980102 0.02290834954926136 3.1998932076683548 0.84006028555256029 0.045404961645534259 3.2640455517302942 0.93938711701899658 0.067901573741807136 3.3281978957922336 1.0387139484854329 0.090398185838080042 3.3923502398541734 1.1380407799518693 0.11289479793435292 3.4565025839161132 1.2373676114183056 0.13539141003062577 3.5206549279780526 1.336694442884742 0.01061489772215269 3.4737749273630771 1.2481411562928477 0.033111509818425568 3.537927271425017 1.3474679877592839 1.2743924937962179 3.2726364718805807 1.3136581608762929 1.2848654733780995 3.1960360018471206 1.2079949482867351 1.1653472544306434 3.2427111680104499 1.2229898712058285 1.175820234012525 3.1661106979769897 1.1173266586162709 1.1862932135944066 3.0895102279435296 1.0116634460267131 1.1967661931762885 3.0129097579100694 0.90600023343715552 1.2072391727581699 2.9363092878766097 0.80033702084759817 1.0877209538107138 2.9829844540399391 0.81533194376669127 1.0772479742288321 3.0595849240733988 0.92099515635624862 1.0667749946469502 3.1361853941068594 1.0266583689458062 1.0563020150650688 3.2127858641403195 1.132321581535364 0.96820273486325714 3.0296596202032688 0.83032686668578437 0.95772975528137561 3.1062600902367286 0.93599007927534184 0.94725677569949374 3.1828605602701887 1.0416532918648993 0.84868451591580085 3.0763347863665982 0.84532178960487747 0.83821153633391932 3.1529352564000583 0.95098500219443494 0.72916629696834456 3.1230099525299275 0.86031671252397068 0.62012105760276981 3.0930846486597972 0.76964842285350632 1.1720412495114305 3.3118365294887404 1.325389850884751 1.063467809295827 3.2817057875649298 1.234631877939065 1.0725430795307735 3.349794257533397 1.3365792061983275 0.95489436908022307 3.2515750456411197 1.1438739049933793 0.96396963931516966 3.3196635156095864 1.2458212332526415 0.97304490955011624 3.3877519855780536 1.3477685615119039 0.84632092886461918 3.2214443037173091 1.0531159320476928 0.85539619909956599 3.2895327736857762 1.1550632603069557 0.86447146933451258 3.357621243654243 1.2570105885662179 0.87354673956945916 3.4257097136227102 1.3589579168254804 0.73774748864901529 3.1913135617934985 0.96235795910200694 0.7468227588839621 3.2594020317619656 1.0643052873612693 0.75589802911890891 3.3274905017304328 1.166252615620532 0.7649732993538555 3.3955789716989 1.2681999438797942 0.77404856958880219 3.4636674416673672 1.3701472721390568 0.62917404843341151 3.1611828198696879 0.87159998615632095 1.8934059200121349 2.9138914699490499 1.2545776644137758 1.8700194035000366 2.8493325977079835 1.1523759534847688 1.8466328869879385 2.7847737254669167 1.0501742425557621 1.7376395606622645 2.6935991381960256 0.85198536992090779 1.7610260771743629 2.7581580104370924 0.95418708084991466 1.7844125936864614 2.8227168826781588 1.0563887917789219 1.8077991101985595 2.8872757549192256 1.1585905027079286 1.8311856267106579 2.9518346271602924 1.2607922136369356 1.6754192673607875 2.7315422954072677 0.85819991914406757 1.6988057838728858 2.7961011676483345 0.96040163007307444 1.7221923003849842 2.8606600398894013 1.0626033410020816 1.7455788168970825 2.9252189121304681 1.1648050519310884 1.6131989740593105 2.7694854526185098 0.86441446836722724 1.6365854905714088 2.8340443248595766 0.96661617929623422 1.6599720070835071 2.8986031971006434 1.0688178902252414 1.5275921642457353 2.7428697375886859 0.76842730666138004 1.5509786807578334 2.8074286098297523 0.87062901759038702 1.5743651972699317 2.8719874820708191 0.97283072851939389 1.5977517137820301 2.9365463543118859 1.075032439448401 1.4653718709442582 2.780812894799928 0.77464185588453982 1.4887583874563564 2.8453717670409944 0.8768435668135468 1.5121449039684547 2.9099306392820612 0.97904527774255368 1.4031515776427814 2.8187560520111701 0.7808564051076996 1.4265380941548795 2.8833149242522369 0.88305811603670648 1.3409312843413044 2.8566992092224126 0.78707095433085938 1.3643178008534025 2.921258081463479 0.88927266525986626 1.2787109910398273 2.8946423664336547 0.79328550355401906 1.9155875149733692 2.9791381872269551 1.3568374675725237 1.8388845766704836 3.0253489494763546 1.3637502607104641 1.759641543307445 2.9951003904294979 1.2674562856993692 1.7621816383675979 3.071559711725754 1.3706630538484046 1.6803985099444063 2.9648518313826422 1.1711623106882743 1.6829386050045594 3.0413111526788974 1.2743690788373097 1.6854787000647122 3.1177704739751535 1.3775758469863451 1.6036955716415204 3.0110625936320417 1.1780751038262147 1.6062356667016735 3.0875219149282973 1.2812818719752501 1.6087757617618264 3.163981236224553 1.3844886401242855 1.5244525382784821 2.980814034585185 1.0817811288151198 1.5269926333386348 3.0572733558814411 1.1849878969641552 1.5295327283987876 3.1337326771776968 1.2881946651131906 1.5320728234589405 3.2101919984739524 1.391401433262226 1.4452095049154436 2.9505654755383288 0.98548715380402474 1.4477495999755965 3.0270247968345845 1.0886939219530603 1.4502896950357491 3.1034841181308406 1.1919006901020957 1.452829790095902 3.1799434394270962 1.295107458251131 1.4553698851560546 3.2564027607233523 1.3983142264001664 1.368506566612558 2.9967762377877283 0.99239994694196509 1.3710466616727106 3.0732355590839839 1.0956067150910007 1.3735867567328632 3.14969488038024 1.1988134832400361 1.3761268517930161 3.2261542016764961 1.3020202513890715 1.3786669468531687 3.3026135229727518 1.4052270195381069 1.2892635332495195 2.9665276787408716 0.89610597193087016 1.2918036283096723 3.0429870000371277 0.99931274007990545 1.2943437233698249 3.1194463213333838 1.1025195082289412 2.4737860332080905 2.5063359018850071 1.3213618284345199 2.4367750073621992 2.4495624709059589 1.220053655304066 2.2351893623661985 2.2694206593569333 0.81832180573294422 2.2722003882120898 2.3261940903359819 0.91962997886339803 2.3092114140579816 2.3829675213150305 1.0209381519938523 2.3462224399038725 2.4397409522940792 1.1222463251243062 2.3832334657497634 2.4965143832731274 1.2235544982547601 2.1816478207537626 2.3163725717241017 0.8218226486836383 2.218658846599654 2.3731460027031503 0.92313082181409223 2.2556698724455457 2.429919433682199 1.0244389949445465 2.2926808982914366 2.4866928646612476 1.1257471680750004 2.3296919241373275 2.5434662956402958 1.2270553412054541 2.1281062791413268 2.3633244840912702 0.8253234916343325 2.1651173049872181 2.4200979150703188 0.92663166476478642 2.2021283308331099 2.4768713460493674 1.0279398378952407 2.2391393566790008 2.5336447770284161 1.1292480110256946 2.0745647375288909 2.4102763964584386 0.82882433458502658 2.1115757633747823 2.4670498274374872 0.93013250771548051 2.148586789220674 2.5238232584165359 1.0314406808459349 2.0210231959164555 2.4572283088256071 0.83232517753572066 2.0580342217623464 2.5140017398046557 0.9336333506661747 2.0950452476082382 2.5707751707837043 1.0349415237966288 1.9674816543040199 2.5041802211927755 0.83582602048641486 2.004492680149911 2.5609536521718246 0.93713419361686878 1.9139401126915843 2.5511321335599439 0.83932686343710894 1.8603985710791484 2.5980840459271128 0.84282770638780313 2.4190692746874136 2.5542766828865568 1.3248910280443096 2.3562186838591517 2.6090615550425857 1.3286164878578715 2.2701237273866623 2.5954892465490618 1.2307016005503848 2.2933680930308897 2.6638464271986146 1.3323419476714335 2.184028770914173 2.5819169380555378 1.1327867132428979 2.2072731365584004 2.6502741187050907 1.2344270603639467 2.2305175022026278 2.7186312993546435 1.3360674074849954 2.1211781800859115 2.6367018102115667 1.1365121730564598 2.1444225457301389 2.7050589908611196 1.2381525201775085 2.1676669113743663 2.7734161715106724 1.3397928672985575 2.0350832236134222 2.6231295017180423 1.0385972857489731 2.0583275892576496 2.6914866823675956 1.1402376328700219 2.081571954901877 2.7598438630171485 1.2418779799910706 2.1048163205461048 2.8282010436667013 1.3435183271121194 1.9489882671409329 2.6095571932245178 0.94068239844148605 1.9722326327851605 2.6779143738740712 1.042322745562535 1.9954769984293879 2.7462715545236245 1.1439630926835838 2.0187213640736155 2.8146287351731774 1.2456034398046325 2.0419657297178428 2.8829859158227307 1.3472437869256815 1.8861376763126712 2.6643420653805467 0.94440785825504792 1.9093820419568988 2.7326992460301001 1.0460482053760969 1.9326264076011261 2.8010564266796534 1.1476885524971459 1.9558707732453537 2.8694136073292063 1.2493288996181946 1.9791151388895811 2.9377707879787596 1.3509692467392433 1.8000427198401818 2.6507697568870223 0.84649297094756104 1.8232870854844092 2.7191269375365756 0.9481333180686099 2.8777973535142332 2.006567092067618 1.3074407549811033 2.8301314065599419 1.9589887020926542 1.2066383490032981 2.7824654596056502 1.9114103121176904 1.1058359430254929 2.7347995126513585 1.8638319221427264 1.0050335370476877 2.6871335656970667 1.8162535321677622 0.90423113106988251 2.639467618742775 1.768675142192798 0.80342872509207741 2.5954091634235468 1.8240110235247955 0.80500335081257501 2.6430751103778385 1.8715894134997597 0.90580575679038011 2.6907410573321302 1.9191678034747239 1.0066081627681853 2.7384070042864215 1.9667461934496879 1.1074105687459905 2.7860729512407132 2.0143245834246519 1.2082129747237957 2.5513507081043185 1.879346904856793 0.80657797653307262 2.5990166550586102 1.9269252948317572 0.90738038251087771 2.646682602012902 1.9745036848067214 1.0081827884886829 2.6943485489671932 2.0220820747816854 1.1089851944664881 2.5072922527850903 1.9346827861887905 0.80815260225357022 2.554958199739382 1.9822611761637547 0.90895500823137532 2.6026241466936737 2.029839566138719 1.0097574142091805 2.650290093647965 2.077417956113683 1.110559820186986 2.4632337974658616 1.9900186675207883 0.80972722797406782 2.5108997444201533 2.0375970574957525 0.91052963395187292 2.558565691374445 2.0851754474707165 1.0113320399296784 2.4191753421466333 2.045354548852786 0.81130185369456542 2.466841289100925 2.09293293882775 0.91210425967237063 2.3751168868274051 2.1006904301847835 0.81287647941506314 2.4227828337816968 2.1482688201597475 0.91367888539286823 2.3310584315081764 2.156026311516781 0.81445110513556074 2.9690545897174578 1.9993859174422914 1.4066752833141163 2.9182981762807874 2.0629846962251048 1.4083466590584748 2.8299830313599217 2.0665363768866269 1.3090696330871103 2.8675417628441169 2.1265834750079184 1.4100180348028333 2.741667886439056 2.0700880575481495 1.2097926071157457 2.7792266179232512 2.1301351556694406 1.3107410088314688 2.8167853494074464 2.1901822537907321 1.4116894105471918 2.6909114730023855 2.1336868363309631 1.2114639828601041 2.7284702044865807 2.1937339344522542 1.3124123845758273 2.7660289359707759 2.2537810325735457 1.4133607862915505 2.6025963280815203 2.1372385169924852 1.1121869568887397 2.6401550595657151 2.1972856151137767 1.2131353586044626 2.6777137910499103 2.2573327132350678 1.3140837603201858 2.5142811831606546 2.1407901976540074 1.0129099309173752 2.5518399146448498 2.2008372957752989 1.1138583326330982 2.5893986461290446 2.2608843938965903 1.2148067343488211 2.6269573776132398 2.3209314920178814 1.3157551360645443 2.4635247697239842 2.204388976436821 1.0145813066617337 2.5010835012081793 2.2644360745581125 1.1155297083774567 2.5386422326923741 2.324483172679404 1.2164781100931799 2.5762009641765693 2.384530270800695 1.3174265118089028 2.3752096248031189 2.2079406570983431 0.91530428069036907 2.4127683562873137 2.2679877552196346 1.0162526824060922 2.4503270877715089 2.3280348533409261 1.1172010841218154 2.4878858192557036 2.3880819514622171 1.2181494858375383 2.5254445507398988 2.4481290495835086 1.3190978875532615 2.2868944798822537 2.2114923377598652 0.8160272547190045 2.3244532113664484 2.2715394358811567 0.91697565643472756 2.3620119428506436 2.3315865340024482 1.0179240581504507 2.3995706743348384 2.3916336321237397 1.1188724598661739 3.2200138204641804 1.3887851982561354 1.3028500298402115 3.1640177114870949 1.3518023843878446 1.2023663632725319 3.1080216025100098 1.3148195705195538 1.1018826967048523 3.0520254935329247 1.2778367566512627 1.0013990301371725 2.9069737219730469 1.2661741636742356 0.80075280441868857 2.962969830950132 1.3031569775425265 0.90123647098636817 3.018965939927218 1.3401397914108175 1.0017201375540479 3.074962048904303 1.3771226052791086 1.1022038041217277 3.1309581578813881 1.4141054191473992 1.2026874706894073 2.8739141683673401 1.3284771984337904 0.80107391183556409 2.9299102773444252 1.3654600123020812 0.90155757840324369 2.9859063863215112 1.4024428261703723 1.0020412449709235 3.0419024952985962 1.4394256400386631 1.1025249115386031 3.0978986042756813 1.476408453906954 1.2030085781062829 2.8408546147616334 1.3907802331933454 0.80139501925243961 2.8968507237387184 1.427763047061636 0.90187868582011921 2.9528468327158039 1.4647458609299271 1.0023623523877989 3.008842941692889 1.5017286747982179 1.1028460189554787 2.8077950611559266 1.4530832679529002 0.80171612666931513 2.8637911701330117 1.4900660818211908 0.90219979323699473 2.9197872791100972 1.5270488956894819 1.0026834598046745 2.7747355075502198 1.515386302712455 0.80203723408619065 2.8307316165273049 1.5523691165807456 0.90252090065387025 2.8867277255043904 1.5893519304490364 1.00300456722155 2.741675953944513 1.5776893374720096 0.80235834150306617 2.7976720629215981 1.6146721513403004 0.90284200807074566 2.7086164003388058 1.6399923722315641 0.80267944891994158 2.675556846733099 1.7022954069911189 0.80300055633681711 3.2724804719119707 1.43243936937604 1.4033820486923756 3.1859076510232121 1.4530665393373476 1.3031854755133749 3.2347471576392492 1.5035767156011373 1.4037671849305382 3.1481743367504906 1.5242038855624449 1.3035706117515375 3.1970138433665278 1.5747140618262345 1.4041523211687008 3.0616015158617316 1.5448310555237528 1.2033740385725367 3.1104410224777692 1.5953412317875422 1.3039557479897002 3.1592805290938064 1.6458514080513318 1.4045374574068634 2.9750286949729725 1.5654582254850604 1.1031774653935362 3.0238682015890102 1.61596840174885 1.2037591748106993 3.0727077082050478 1.6664785780126394 1.3043408842278628 3.121547214821085 1.7169887542764291 1.404922593645026 2.9372953807002511 1.6365955717101577 1.1035626016316988 2.9861348873162887 1.6871057479739473 1.2041443110488619 3.0349743939323264 1.7376159242377367 1.3047260204660251 3.0838139005483636 1.7881261005015263 1.4053077298831884 2.8507225598114925 1.6572227416714655 1.0033660284526982 2.8995620664275297 1.7077329179352549 1.1039477378698614 2.9484015730435673 1.7582430941990446 1.2045294472870245 2.997241079659605 1.808753270462834 1.3051111567041878 3.0460805862756426 1.8592634467266238 1.405692866121351 2.7641497389227334 1.6778499116327732 0.90316945527369741 2.8129892455387711 1.7283600878965628 1.0037511646908606 2.8618287521548083 1.7788702641603524 1.1043328741080238 2.9106682587708459 1.8293804404241418 1.2049145835251871 2.9595077653868835 1.8798906166879314 1.3054962929423501 3.0083472720029212 1.9304007929517211 1.4060780023595134 2.726416424650012 1.7489872578578705 0.90355459151185991 2.7752559312660496 1.7994974341216601 1.0041363009290232 2.8240954378820873 1.8500076103854497 1.1047180103461864 2.8729349444981245 1.9005177866492393 1.2052997197633495 2.9217744511141621 1.9510279629130287 1.3058814291805128 3.4359127006102312 0.71908034539830734 1.3062096077567189 3.3739048295732204 0.69384209304859423 1.2059569714259268 3.3118969585362095 0.66860384069888101 1.1057043350951345 3.1051206440591157 0.6601827397910276 0.80445800697321823 3.1671285150961266 0.68542099214074081 0.90471064330401041 3.2291363861331379 0.71065924449045403 1.0049632796348029 3.2911442571701488 0.73589749684016725 1.105215915965595 3.3531521282071597 0.76113574918988036 1.2054685522963873 3.084367942693055 0.72747639593231384 0.80396958784367878 3.1463758137300659 0.75271464828202705 0.90422222417447096 3.2083836847670772 0.77795290063174027 1.0044748605052636 3.2703915558040881 0.80319115298145349 1.1047274968360556 3.332399426841099 0.8284294053311666 1.2049801331668477 3.0636152413269944 0.79477005207360008 0.80348116871413933 3.1256231123640053 0.82000830442331329 0.9037338050449315 3.1876309834010166 0.84524655677302651 1.003986441375724 3.2496388544380275 0.87048480912273962 1.1042390777065161 3.0428625399609337 0.86206370821488632 0.80299274958459987 3.1048704109979446 0.88730196056459942 0.90324538591539205 3.1668782820349559 0.91254021291431264 1.0034980222461847 3.2288861530719668 0.93777846526402575 1.1037506585769767 3.022109838594873 0.92935736435617256 0.80250433045506042 3.0841177096318839 0.95459561670588566 0.9027569667858526 3.1461255806688952 0.97983386905559888 1.0030096031166451 3.0013571372288124 0.99665102049745879 0.80201591132552097 3.0633650082658233 1.0218892728471718 0.90226854765631326 2.9806044358627517 1.063944676638745 0.80152749219598152 3.0426123068997626 1.089182928988458 0.90178012852677381 2.959851734496691 1.1312383327800313 0.80103907306644218 3.4963199738213362 0.74967671358232313 1.4064978887321062 3.4150736799091872 0.78666296169441663 1.3057231109226917 3.4728007354408739 0.82623155047940389 1.406071079225572 3.3915544415287249 0.8632177985914975 1.3052963014161574 3.4492814970604115 0.90278638737648476 1.4056442697190377 3.3103081476165754 0.90020404670359111 1.2045215236067426 3.3680352031482621 0.93977263548857826 1.3048694919096231 3.4257622586799488 0.97934122427356551 1.4052174602125034 3.2867889092361131 0.97675888360067176 1.2040947141002083 3.3445159647677998 1.016327472385659 1.3044426824030888 3.4022430202994864 1.0558960611706463 1.4047906507059691 3.2055426153239641 1.0137451317127655 1.1033199362907935 3.2632696708556503 1.0533137204977527 1.203667904593674 3.320996726387337 1.0928823092827398 1.3040158728965543 3.3787237819190237 1.132450898067727 1.4043638411994348 3.1242963214118147 1.0507313798248592 1.0025451584813792 3.1820233769435013 1.0902999686098462 1.1028931267842592 3.239750432475188 1.1298685573948335 1.2032410950871397 3.2974774880068747 1.1694371461798205 1.30358906339002 3.3552045435385613 1.2090057349648078 1.4039370316929005 3.1007770830313524 1.12728621672194 1.0021183489748449 3.1585041385630386 1.166854805506927 1.1024663172777249 3.2162311940947252 1.2064233942919143 1.2028142855806052 3.2739582496264119 1.2459919830769013 1.3031622538834855 3.3316853051580986 1.2855605718618885 1.403510222186366 3.0195307891192029 1.1642724648340337 0.90134357116542985 3.0772578446508896 1.2038410536190209 1.0016915394683104 3.1349849001825763 1.243409642404008 1.1020395077711906 3.1927119557142629 1.282978231188995 1.2023874760740709 3.2504390112459496 1.322546819973982 1.3027354443769512 3.3081660667776362 1.3621154087589693 1.4030834126798317 2.9382844952070535 1.2012587129461274 0.80056879335601538 2.9960115507387401 1.2408273017311144 0.90091676165889545 3.5171763894690167 0.020979088414709798 1.314623745335564 3.4515740490428644 0.0082417840574276549 1.2145653902593232 3.1815928930475832 0.027229629570067915 0.81330889801511275 3.2471952334737351 0.039966933927350234 0.9133672530913538 3.3127975738998874 0.052704238284632443 1.013425608167595 3.3783999143260401 0.065441542641914568 1.1134839632438363 3.4440022547521925 0.078178846999196763 1.2135423183200771 3.5096045951783448 0.090916151356478944 1.3136006733963179 3.1740210987569113 0.097166692511837127 0.81228582607586675 3.2396234391830632 0.10990399686911939 0.91234418115210769 3.3052257796092155 0.12264130122640166 1.0124025362283489 3.3708281200353682 0.13537860558368375 1.1124608913045901 3.4364304604615201 0.14811590994096591 1.212519246380831 3.1664493044662394 0.16710375545360634 0.81126275413662075 3.2320516448923913 0.17984105981088855 0.91132110921286169 3.2976539853185436 0.19257836416817084 1.0113794642891027 3.3632563257446964 0.20531566852545291 1.111437819365344 3.1588775101755671 0.23704081839537572 0.81023968219737474 3.2244798506017194 0.24977812275265793 0.91029803727361558 3.2900821910278717 0.26251542710994019 1.0103563923498566 3.355684531454024 0.27525273146722223 1.1104147474260977 3.1513057158848952 0.30697788133714488 0.80921661025812874 3.2169080563110475 0.31971518569442708 0.90927496533436958 3.2825103967371998 0.33245249005170935 1.0093333204106105 3.1437339215942228 0.37691494427891403 0.80819353831888274 3.2093362620203751 0.3896522486361963 0.90825189339512347 3.1361621273035509 0.44685200722068324 0.80717046637963674 3.2017644677297032 0.45958931157796545 0.90722882145587747 3.1285903330128786 0.51678907016245246 0.80614739444039063 3.5738916875599385 0.1177259429647749 1.4137649447193583 3.5012098966712455 0.16965787220470763 1.312643869509277 3.5654403129958334 0.1970740688884226 1.412812704925962 3.4285281057825525 0.2215898014446403 1.2115227942991955 3.4927585221071404 0.24900599812835544 1.3116916297158807 3.5569889384317284 0.27642219481207042 1.4118604651325657 3.4200767312184475 0.30093792736828812 1.2105705545057992 3.4843071475430349 0.32835412405200326 1.3107393899224844 3.5485375638676233 0.35577032073571824 1.4109082253391694 3.347394940329754 0.35286985660822073 1.1094494792957179 3.411625356654342 0.38028605329193588 1.2096183147124029 3.4758557729789299 0.40770224997565102 1.3097871501290881 3.5400861893035178 0.43511844665936605 1.4099559855457731 3.2747131494410611 0.40480178584815341 1.0083284040856366 3.338943565765649 0.43221798253186849 1.1084972395023216 3.4031739820902369 0.45963417921558369 1.2086660749190066 3.4674043984148244 0.48705037589929878 1.3088349103356918 3.5316348147394128 0.51446657258301387 1.4090037457523767 3.266261774876956 0.48414991177180117 1.0073761642922403 3.3304921912015439 0.51156610845551631 1.1075449997089253 3.3947226075261314 0.53898230513923151 1.2077138351256103 3.4589530238507193 0.56639850182294649 1.3078826705422955 3.5231834401753073 0.59381469850666169 1.4080515059589804 3.1935799839882626 0.53608184101173373 0.90625508908215868 3.257810400312851 0.56349803769544893 1.006423924498844 3.3220408166374384 0.59091423437916402 1.106592759915529 3.3862712329620264 0.61833043106287922 1.2067615953322139 3.4505016492866138 0.6457466277465943 1.3069304307488989 3.5147320656112022 0.6731628244303095 1.4070992661655839 3.1208981930995696 0.58801377025166635 0.80513401387207739 3.1851286094241575 0.61542996693538143 0.90530284928876237 3.2493590257487455 0.64284616361909663 1.0054716847054475 3.4601482712407186 -0.67949823082475169 1.3263427016158893 3.1324794322639602 -0.60920589285044435 0.82559034139225207 3.199207415956363 -0.60925775561879225 0.92546347103471716 3.2659353996487663 -0.60930961838714026 1.0253366006771822 3.3326633833411696 -0.60936148115548838 1.1252097303196473 3.3993913670335729 -0.60941334392383639 1.2250828599621122 3.4661193507259767 -0.6094652066921844 1.3249559896045771 3.1384505117492179 -0.53917286871787706 0.82420362938093983 3.2051784954416207 -0.53922473148622496 0.92407675902340491 3.271906479134024 -0.53927659425457297 1.02394988866587 3.3386344628264277 -0.53932845702292109 1.1238230183083351 3.4053624465188306 -0.5393803197912691 1.2236961479507997 3.1444215912344755 -0.46913984458530972 0.82281691736962759 3.2111495749268784 -0.46919170735365767 0.92269004701209256 3.2778775586192817 -0.46924357012200568 1.0225631766545578 3.3446055423116854 -0.46929543289035375 1.1224363062970226 3.1503926707197332 -0.39910682045274237 0.82143020535831524 3.217120654412136 -0.39915868322109033 0.92130333500078032 3.2838486381045398 -0.39921054598943839 1.0211764646432455 3.3505766217969435 -0.3992624087577864 1.1210495942857104 3.1563637502049908 -0.32907379632017508 0.82004349334700299 3.2230917338973941 -0.32912565908852309 0.91991662298946797 3.2898197175897974 -0.3291775218568711 1.0197897526319333 3.1623348296902485 -0.25904077218760768 0.81865678133569064 3.2290628133826518 -0.25909263495595569 0.91852991097815573 3.1683059091755066 -0.18900774805504036 0.8172700693243784 3.2350338928679099 -0.18905961082338843 0.91714319896684338 3.1742769886607642 -0.11897472392247307 0.81588335731306605 3.4729697213446147 -0.53103398789746148 1.3236473123469656 3.4116619492634497 -0.46621049334262638 1.2223385826318409 3.4799067042075063 -0.45177552718052288 1.3223463216960891 3.4185989321263412 -0.38695203262568784 1.2210375919809644 3.4868436870703978 -0.37251706646358435 1.3210453310452126 3.3572911600451762 -0.32212853807085273 1.1197288622658401 3.4255359149892328 -0.3076935719087493 1.2197366013300879 3.4937806699332894 -0.29325860574664581 1.3197443403943359 3.2959833879640108 -0.25730504351601763 1.0184201325507154 3.3642281429080678 -0.24287007735391411 1.1184278716149636 3.4324728978521244 -0.22843511119181065 1.2184356106792114 3.500717652796181 -0.21400014502970721 1.3184433497434593 3.3029203708269024 -0.17804658279907909 1.0171191418998389 3.3711651257709589 -0.1636116166369756 1.1171268809640871 3.439409880715016 -0.14917665047487211 1.2171346200283348 3.5076546356590725 -0.1347416843127687 1.3171423590925826 3.2416125987457369 -0.11322308824424412 0.91581041218471426 3.3098573536897939 -0.098788122082140564 1.0158181512489624 3.3781021086338505 -0.084353155920037087 1.1158258903132103 3.4463468635779071 -0.069918189757933569 1.2158336293774581 3.5145916185219641 -0.055483223595830147 1.3158413684417061 3.1803048266645724 -0.048399593689408951 0.81450168246958976 3.2485495816086285 -0.033964627527305495 0.91450942153383763 3.3167943365526851 -0.019529661365201945 1.0145171605980858 3.3850390914967416 -0.005094695203098497 1.1145248996623338 3.2858357482034046 -1.2880890537283265 1.338632282698563 3.2204081344946798 -1.2754328369910184 1.238950931520592 3.1549805207859545 -1.2627766202537101 1.1392695803426207 3.0895529070772296 -1.2501204035164017 1.0395882291646497 3.0241252933685043 -1.2374641867790936 0.93990687798667827 2.9586976796597795 -1.2248079700417853 0.84022552680870688 2.9780424768129952 -1.1572768515017726 0.8385841794513802 3.04347009052172 -1.1699330682390809 0.93826553062935147 3.1088977042304453 -1.182589284976389 1.037946881807323 3.1743253179391702 -1.1952455017136974 1.137628232985294 3.2397529316478955 -1.2079017184510057 1.2373095841632653 2.9973872739662109 -1.0897457329617599 0.83694283209405351 3.0628148876749357 -1.1024019496990682 0.93662418327202468 3.128242501383661 -1.1150581664363763 1.0363055344499963 3.1936701150923859 -1.1277143831736847 1.1359868856279673 3.0167320711194265 -1.0222146144217472 0.83530148473672672 3.0821596848281514 -1.0348708311590555 0.934982835914698 3.1475872985368767 -1.0475270478963636 1.0346641870926694 3.213014912245602 -1.060183264633672 1.1343455382706404 3.0360768682726422 -0.95468349588173429 0.83366013737940003 3.1015044819813675 -0.9673397126190425 0.9333414885573712 3.1669320956900924 -0.97999592935635071 1.0330228397353427 3.0554216654258579 -0.88715237734172148 0.83201879002207324 3.1208492791345832 -0.89980859407902969 0.93170014120004452 3.074766462579074 -0.81962125880170866 0.83037744266474656 3.1401940762877989 -0.83227747553901688 0.93005879384271772 3.0941112597322897 -0.75209014026169574 0.82873609530741976 3.3077248880792052 -1.2123930016892821 1.3370881276225504 3.2600683338476575 -1.1372558757865534 1.2357053133042779 3.3297825767676961 -1.1361560673882922 1.3355504110044831 3.2821260225361484 -1.0610189414855635 1.2341675966862107 3.351840265456187 -1.0599191330873023 1.3340126943864159 3.2344694683046011 -0.98588181558283461 1.1327847823679382 3.3041837112246393 -0.98478200718457365 1.2326298800681434 3.3738979541446779 -0.98368219878631247 1.3324749777683487 3.1868129140730534 -0.91074468968010591 1.0314019680496658 3.256527156993092 -0.90964488128184473 1.131247065749871 3.3262413999131302 -0.90854507288358377 1.2310921634500762 3.3959556428331692 -0.90744526448532259 1.3309372611502814 3.2088706027615443 -0.83450775537911603 1.0298642514315985 3.2785848456815829 -0.83340794698085485 1.1297093491318038 3.3482990886016215 -0.83230813858259389 1.229554446832009 3.4180133315216601 -0.83120833018433271 1.3293995445322142 3.1612140485299962 -0.75937062947638734 0.92848143711332554 3.2309282914500352 -0.75827082107812616 1.0283265348135313 3.3006425343700738 -0.75717101267986497 1.1281716325137365 3.3703567772901124 -0.75607120428160401 1.2280167302139418 3.4400710202101514 -0.75497139588334283 1.3278618279141472 3.113557494298449 -0.68423350357365864 0.82709862279505297 3.1832717372184871 -0.68313369517539746 0.92694372049525831 3.2529859801385261 -0.68203388677713628 1.0267888181954639 3.3227002230585647 -0.6809340783788751 1.1266339158956693 3.3924144659786037 -0.67983426998061403 1.2264790135958747 2.9750064588701921 -1.9191749426164098 1.353900818810462 2.9131950999271634 -1.8944929945496012 1.2544247229424392 2.8513837409841343 -1.8698110464827924 1.1549486270744163 2.7895723820411051 -1.8451290984159838 1.0554725312063933 2.727761023098076 -1.820447150349175 0.9559964353383702 2.6979879561259752 -1.7332515531433632 0.85469545210247622 2.7597993150690043 -1.7579335012101718 0.95417154797049908 2.8216106740120335 -1.7826154492769806 1.0536476438385221 2.8834220329550626 -1.8072973973437891 1.153123739706545 2.9452333918980913 -1.8319793454105979 1.252599835574568 2.7300262480969035 -1.6707379040043602 0.8528705647346051 2.7918376070399327 -1.6954198520711685 0.95234666060262796 2.8536489659829618 -1.7201018001379773 1.051822756470651 2.9154603249259909 -1.7447837482047861 1.151298852338674 2.7620645400678319 -1.6082242548653571 0.85104567736673398 2.823875899010861 -1.6329062029321655 0.95052177323475684 2.8856872579538901 -1.6575881509989743 1.0499978691027798 2.9474986168969188 -1.6822700990657828 1.1494739649708028 2.7941028320387602 -1.5457106057263539 0.84922078999886286 2.8559141909817893 -1.5703925537931624 0.94869688586688572 2.9177255499248185 -1.595074501859971 1.0481729817349088 2.8261411240096885 -1.4831969565873506 0.84739590263099174 2.8879524829527177 -1.5078789046541592 0.9468719984990146 2.8581794159806169 -1.4206833074483474 0.84557101526312062 2.9199907749236456 -1.4453652555151559 0.94504711113114348 2.8902177079515452 -1.3581696583093443 0.84374612789524939 3.0113647917163351 -1.8487506493572416 1.3521975687490853 2.9790461800054322 -1.7662163271491165 1.2508249118382115 3.0477278624903592 -1.7783176802400389 1.3504944520912578 3.0154092507794563 -1.6957833580319137 1.2491217951803841 3.0840909332643833 -1.7078847111228361 1.3487913354334304 2.9830906390685534 -1.6132490358237888 1.1477491382695104 3.0517723215534804 -1.625350388914711 1.2474186785225567 3.1204540040384074 -1.6374517420056334 1.347088218775603 2.9507720273576505 -1.530714713615664 1.0463764813586369 3.0194537098425775 -1.542816066706586 1.146046021611683 3.0881353923275046 -1.5549174197975082 1.2457155618647293 3.1568170748124316 -1.5670187728884306 1.3453851021177756 2.9871350981316751 -1.4602817444984613 1.0446733647008095 3.0558167806166021 -1.4723830975893832 1.1443429049538556 3.1244984631015291 -1.4844844506803054 1.2440124452069019 3.1931801455864561 -1.4965858037712276 1.3436819854599482 2.9548164864207718 -1.3777474222903363 0.94330070778993558 3.0234981689056992 -1.3898487753812585 1.0429702480429821 3.0921798513906262 -1.4019501284721805 1.1426397882960282 3.1608615338755532 -1.4140514815631027 1.2423093285490745 3.2295432163604803 -1.4261528346540249 1.3419788688021208 2.9224978747098689 -1.2952131000822111 0.84192805087906186 2.9911795571947959 -1.3073144531731336 0.94159759113210817 3.0598612396797233 -1.3194158062640555 1.0412671313851547 3.1285429221646504 -1.3315171593549777 1.140936671638201 3.1972246046495774 -1.3436185124458999 1.2406062118912473 3.2659062871345044 -1.3557198655368221 1.3402757521442934 2.4880062633339932 -2.4434018925003276 1.2710664153090201 2.432059504921281 -2.4075302748250178 1.1718062706613195 2.3761127465085687 -2.3716586571497076 1.0725461260136187 2.2518641844671126 -2.2088710923508574 0.77280415223095134 2.3078109428798244 -2.2447427100261672 0.87206429687865206 2.3637577012925366 -2.2806143277014774 0.97132444152635278 2.4197044597052493 -2.3164859453767872 1.0705845861740537 2.475651218117962 -2.3523575630520974 1.1698447308217543 2.5315979765306742 -2.3882291807274076 1.2691048754694549 2.2954558976637931 -2.1536983805779371 0.77084261239138629 2.3514026560765049 -2.1895699982532468 0.87010275703908702 2.4073494144892171 -2.225441615928557 0.96936290168678774 2.4632961729019298 -2.2613132336038668 1.0686230463344888 2.5192429313146429 -2.297184851279177 1.1678831909821894 2.3390476108604736 -2.0985256688050167 0.76888107255182125 2.3949943692731854 -2.1343972864803264 0.86814121719952209 2.4509411276858977 -2.1702689041556367 0.9674013618472227 2.5068878860986104 -2.2061405218309464 1.0666615064949239 2.5628346445113235 -2.2420121395062567 1.1659216511426242 2.3826393240571542 -2.0433529570320963 0.76691953271225632 2.438586082469866 -2.0792245747074061 0.86617967735995705 2.4945328408825787 -2.1150961923827163 0.96543982200765777 2.5504795992952913 -2.1509678100580265 1.0646999666553587 2.4821777956665465 -2.0240518629344857 0.86421813752039212 2.5381245540792596 -2.0599234806097959 0.96347828216809273 2.525769508863227 -1.9688791511615655 0.86225659768082707 2.5817162672759402 -2.0047507688368755 0.9615167423285278 2.569361222059908 -1.9137064393886454 0.86029505784126215 2.5443089713874416 -2.4788484287973844 1.3703348070871948 2.5937459012196764 -2.4166952555791252 1.3685086972599871 2.577925975165396 -2.3297887483216022 1.2672067336515189 2.6431828310519112 -2.354542082360866 1.3666825874327795 2.6273629049976308 -2.267635575103343 1.2653806238243113 2.692619760884146 -2.2923889091426068 1.3648564776055718 2.61154297894335 -2.18072906784582 1.1640786602158431 2.6767998348298656 -2.2054824018850838 1.2635545139971036 2.7420566907163808 -2.2302357359243477 1.3630303677783642 2.5957230528890691 -2.0938225605882974 1.0627766966073748 2.6609799087755848 -2.1185758946275608 1.1622525503886354 2.7262367646621004 -2.1433292286668246 1.261728404169896 2.7914936205486161 -2.1680825627060885 1.3612042579511565 2.6451599827213039 -2.0316693873700382 1.0609505867801672 2.7104168386078196 -2.056422721409302 1.1604264405614277 2.7756736944943352 -2.0811760554485659 1.2599022943426883 2.8409305503808508 -2.1059293894878297 1.3593781481239491 2.6293400566670231 -1.9447628801125154 0.95964862317169874 2.6945969125535392 -1.9695162141517792 1.0591244769529595 2.7598537684400548 -1.9942695481910431 1.1586003307342201 2.8251106243265705 -2.0190228822303067 1.2580761845154809 2.8903674802130861 -2.0437762162695705 1.3575520382967414 2.6135201306127422 -1.8578563728549924 0.85834665956323053 2.6787769864992579 -1.8826097068942562 0.95782251334449109 2.744033842385774 -1.9073630409335203 1.0572983671257521 2.8092906982722896 -1.9321163749727841 1.1567742209070124 2.8745475541588053 -1.9568697090120477 1.2562500746882732 2.9398044100453209 -1.9816230430513115 1.355725928469534 2.662957060444977 -1.7957031996367334 0.85652054973602287 1.9579440869094142 -2.9015395048866615 1.2886529261589621 1.9102120005552874 -2.8555090330493655 1.1896051119596249 1.772892480652275 -2.6256133052083821 0.79134669941779634 1.8206245670064019 -2.671643777045678 0.8903945136171334 1.8683566533605287 -2.7176742488829735 0.98944232781647046 1.9160887397146555 -2.763704720720269 1.0884901420158077 1.9638208260687824 -2.8097351925575644 1.1875379562151449 2.0115529124229092 -2.8557656643948599 1.2865857704144819 1.82650130616577 -2.5798394647165805 0.78927954367331621 1.8742333925198968 -2.6258699365538765 0.88832735787265327 1.9219654788740237 -2.6719004083911719 0.98737517207199033 1.9696975652281505 -2.7179308802284674 1.0864229862713277 2.0174296515822774 -2.7639613520657629 1.1854708004706649 1.880110131679265 -2.5340656242247794 0.78721238792883608 1.9278422180333918 -2.5800960960620749 0.88626020212817314 1.9755743043875187 -2.6261265678993704 0.98530801632751019 2.0233063907416455 -2.6721570397366659 1.0843558305268477 2.0710384770957724 -2.7181875115739618 1.1834036447261846 1.93371895719276 -2.4882917837329779 0.78514523218435595 1.9814510435468868 -2.5343222555702734 0.884193046383693 2.0291831299010137 -2.5803527274075688 0.98324086058303006 2.0769152162551405 -2.6263831992448647 1.0822886747823675 1.987327782706255 -2.4425179432411763 0.78307807643987581 2.0350598690603818 -2.4885484150784718 0.88212589063921287 2.0827919554145087 -2.5345788869157677 0.98117370483855004 2.04093660821975 -2.3967441027493748 0.78101092069539568 2.0886686945738768 -2.4427745745866702 0.88005873489473274 2.1364007809280037 -2.4888050464239662 0.97910654909406991 2.094545433733245 -2.3509702622575737 0.77894376495091555 2.1422775200873718 -2.3970007340948691 0.87799157915025272 2.14815425924674 -2.3051964217657721 0.77687660920643553 2.2017630847602345 -2.259422581273971 0.7748094534619554 2.0062148398592843 -2.9471365321739089 1.3877107699703304 2.0672314529295637 -2.8954019263965405 1.3857815422796647 2.0687594723827512 -2.8070968636426454 1.2845856020810906 2.1282480659998431 -2.843667320619172 1.3838523145889989 2.1297760854530305 -2.755362257865277 1.2826563743904249 2.1892646790701225 -2.7919327148418036 1.3819230868983332 2.131304104906218 -2.667057195111382 1.1814604341918509 2.1907926985233099 -2.7036276520879086 1.2807271466997592 2.2502812921404018 -2.7401981090644352 1.3799938592076675 2.1328321243594055 -2.5787521323574865 1.0802644939932768 2.1923207179764974 -2.6153225893340135 1.1795312065011851 2.2518093115935893 -2.6518930463105401 1.2787979190090935 2.3112979052106812 -2.6884635032870667 1.3780646315170018 2.1938487374296849 -2.527017526580118 1.0783352663026111 2.2533373310467768 -2.5635879835566451 1.1776019788105194 2.3128259246638687 -2.6001584405331717 1.2768686913184277 2.3723145182809606 -2.6367288975096983 1.376135403826336 2.1953767568828719 -2.438712463826223 0.97713932610403675 2.2548653504999643 -2.4752829208027496 1.0764060386119454 2.3143539441170562 -2.5118533777792766 1.1756727511198537 2.3738425377341481 -2.5484238347558033 1.274939463627762 2.43333113135124 -2.5849942917323294 1.3742061761356703 2.1969047763360594 -2.3504074010723279 0.87594338590546283 2.2563933699531509 -2.3869778580488545 0.97521009841337103 2.3158819635702432 -2.4235483150253812 1.0744768109212797 2.3753705571873351 -2.4601187720019082 1.173743523429188 2.4348591508044275 -2.4966892289784348 1.2730102359370963 2.494347744421519 -2.533259685954961 1.3722769484450044 2.2579213894063384 -2.2986727952949595 0.874014158214797 2.3174099830234303 -2.3352432522714861 0.9732808707227053 1.3756887215708054 -3.3047717357824244 1.4059781131490843 1.4004823736117029 -3.2153548100064757 1.3049631305019405 1.3635450938581386 -3.1605556577715164 1.206099237052964 1.3266078141045747 -3.1057565055365575 1.1072353436039877 1.2896705343510104 -3.0509573533015981 1.0083714501550112 1.2527332545974463 -2.9961582010666388 0.90950755670603467 1.2775269066383439 -2.9067412752906905 0.80849257405889086 1.314464186391908 -2.9615404275256494 0.90735646750786725 1.3514014661454721 -3.0163395797606087 1.0062203609568436 1.3883387458990364 -3.0711387319955681 1.1050842544058201 1.4252760256526003 -3.125937884230527 1.2039481478547966 1.3392578384328053 -2.8721235017497011 0.80634148486072343 1.3761951181863696 -2.92692265398466 0.90520537830969983 1.4131323979399337 -2.9817218062196194 1.0040692717586763 1.4500696776934978 -3.0365209584545787 1.1029331652076526 1.4870069574470619 -3.0913201106895376 1.2017970586566291 1.4009887702272668 -2.8375057282087117 0.80419039566255601 1.4379260499808311 -2.8923048804436706 0.9030542891115324 1.4748633297343954 -2.94710403267863 1.0019181825605088 1.5118006094879595 -3.0019031849135893 1.1007820760094853 1.4627197020217284 -2.8028879546677223 0.80203930646438859 1.4996569817752927 -2.8576871069026812 0.90090319991336498 1.5365942615288568 -2.9124862591376406 0.99976709336234137 1.5244506338161901 -2.7682701811267325 0.79988821726622128 1.5613879135697544 -2.8230693333616919 0.89875211071519756 1.5983251933233185 -2.8778684855966508 0.99761600416417395 1.5861815656106517 -2.7336524075857431 0.79773712806805386 1.623118845364216 -2.7884515598207025 0.89660102151703025 1.6479124974051134 -2.6990346340447537 0.79558603886988655 1.7096434291995748 -2.6644168605037644 0.79343494967171913 1.4463301041156336 -3.2654814716866349 1.4039467130885708 1.4659668837631745 -3.1787687230870514 1.3028624610377746 1.5171739652785829 -3.226085031207941 1.401918032810914 1.5368107449261237 -3.1393722826083579 1.3008337807601178 1.5880178264415321 -3.1866885907292475 1.3998893525332572 1.5564475245736644 -3.0526595340087743 1.1997495287093216 1.6076546060890728 -3.0999758421296639 1.298805100482461 1.6588616876044813 -3.1472921502505535 1.3978606722556006 1.5760843042212054 -2.9659467854091912 1.0986652766585254 1.6272913857366136 -3.0132630935300808 1.1977208484316648 1.678498467252022 -3.06057940165097 1.2967764202048042 1.7297055487674304 -3.10789570977186 1.3958319919779441 1.6469281653841548 -2.9265503449304973 1.0966365963808686 1.698135246899563 -2.9738666530513869 1.195692168154008 1.7493423284149714 -3.021182961172276 1.2947477399271476 1.8005494099303798 -3.0684992692931661 1.3938033117002873 1.6665649450316953 -2.8398375963309137 0.99555234433007223 1.7177720265471039 -2.8871539044518033 1.0946079161032118 1.7689791080625121 -2.9344702125726934 1.1936634878763512 1.8201861895779206 -2.9817865206935825 1.2927190596494909 1.871393271093329 -3.0291028288144726 1.3917746314226305 1.6862017246792362 -2.7531248477313306 0.89446809227927604 1.7374088061946444 -2.8004411558522198 0.99352366405241554 1.7886158877100531 -2.8477574639731098 1.0925792358255553 1.8398229692254615 -2.8950737720939994 1.1916348075986947 1.8910300507408699 -2.942390080214889 1.2906903793718343 1.9422371322562784 -2.9897063883357786 1.3897459511449739 1.7570455858421854 -2.7137284072526366 0.89243941200161925 1.8082526673575938 -2.7610447153735262 0.99149498377475875 1.8594597488730022 -2.8083610234944159 1.0905505555478985 0.71810015147971951 -3.4487444139774714 1.3242477267788251 0.6946344366195939 -3.3872484759823642 1.2255055994636277 0.6711687217594684 -3.325752537987257 1.1267634721484301 0.66834879514160417 -3.1192257553060241 0.82832140114891328 0.69181451000173011 -3.1807216933011309 0.927063528464111 0.7152802248618555 -3.2422176312962381 1.0258056557793085 0.7387459397219811 -3.3037135692913449 1.1245477830945063 0.7622116545821066 -3.3652095072864521 1.2232899104097039 0.73592601310411709 -3.0971867866101119 0.82610571209498951 0.75939172796424304 -3.1586827246052187 0.92484783941018722 0.78285744282436842 -3.2201786626003259 1.0235899667253847 0.80632315768449403 -3.2816746005954327 1.1223320940405825 0.82978887254461953 -3.3431705385905399 1.2210742213557801 0.80350323106662991 -3.0751478179141998 0.82389002304106573 0.82696894592675574 -3.136643755909307 0.92263215035626345 0.85043466078688124 -3.1981396939044138 1.0213742776714609 0.87390037564700673 -3.259635631899521 1.1201164049866588 0.87108044902914261 -3.0531088492182881 0.82167433398714196 0.89454616388926844 -3.1146047872133953 0.92041646130233967 0.91801187874939405 -3.1761007252085021 1.0191585886175372 0.93865766699165532 -3.0310698805223759 0.81945864493321818 0.96212338185178115 -3.0925658185174831 0.9182007722484159 0.98558909671190675 -3.1540617565125899 1.0169428995636134 1.0062348849541682 -3.0090309118264638 0.81724295587929452 1.0297005998142941 -3.070526849821571 0.91598508319449212 1.0738121029166807 -2.9869919431305521 0.81502726682537074 1.1413893208791936 -2.9649529744346403 0.81281157777144708 0.78800932430574633 -3.4260102556486869 1.3220495962902508 0.86645352428207933 -3.4007316816950492 1.3199157306956171 0.90483207044775327 -3.3189058527784177 1.2189147477538516 0.94489772425841223 -3.3754531077414116 1.3177818651009834 0.94321061661342709 -3.2370800238617865 1.117913764812086 0.98327627042408627 -3.29362727882478 1.2167808821592179 1.0233419242347452 -3.350174533787774 1.3156479995063497 1.0216548165897601 -3.2118014499081489 1.1157798992174524 1.0617204704004193 -3.2683487048711424 1.2146470165645842 1.1017861242110782 -3.3248959598341363 1.3135141339117162 1.1418517780217372 -3.3814432147971303 1.4123812512588483 1.0600333627554339 -3.1299756209915177 1.0147789162756866 1.1000990165660931 -3.1865228759545112 1.1136460336228189 1.1401646703767523 -3.2430701309175047 1.2125131509699507 1.1802303241874113 -3.2996173858804987 1.3113802683170825 1.2202959779980702 -3.3561646408434926 1.4102473856642146 1.098411908921108 -3.0481497920748861 0.9137779333339211 1.1384775627317669 -3.1046970470378801 1.0126450506810531 1.1785432165424261 -3.1612443020008736 1.1115121680281852 1.2186088703530853 -3.2177915569638675 1.210379285375317 1.2586745241637443 -3.2743388119268615 1.3092464027224491 1.2987401779744032 -3.330886066889855 1.4081135200695809 1.1768561088974407 -3.0228712181212485 0.91164406773928752 1.2169217627080997 -3.0794184730842424 1.0105111850864195 1.2569874165187589 -3.1359657280472364 1.1093783024335517 1.2970530703294181 -3.1925129830102299 1.2082454197806836 1.337118724140077 -3.2490602379732239 1.3071125371278154 1.2152346550631146 -2.9410453892046173 0.81064308479752212 0.51837043580030173 -3.1462447489699081 0.83280219282392209 0.44765404062727743 -3.1547164230500528 0.83505715428734983 0.45525392067887221 -3.2199381092698141 0.93378854934783773 0.37693764545425312 -3.1631880971301976 0.83731211575077746 0.38453752550584797 -3.2284097833499588 0.93604351081126547 0.30622125028122882 -3.1716597712103418 0.8395670772142052 0.31382113033282366 -3.2368814574301035 0.9382984722746931 0.32142101038441845 -3.3021031436498647 1.0370298673351812 0.23550485510820451 -3.1801314452904865 0.84182203867763283 0.24310473515979936 -3.2453531315102477 0.94055343373812084 0.25070461521139414 -3.3105748177300094 1.039284828798609 0.25830449526298899 -3.375796503949771 1.138016223859097 0.16478845993518026 -3.1886031193706308 0.84407700014106057 0.17238833998677508 -3.2538248055903924 0.94280839520154847 0.17998822003836989 -3.3190464918101537 1.0415397902620367 0.18758810008996474 -3.3842681780299153 1.1402711853225247 0.094072064762155905 -3.1970747934507755 0.8463319616044882 0.10167194481375073 -3.2622964796705367 0.94506335666497621 0.10927182486534555 -3.3275181658902984 1.0437947517254644 0.11687170491694039 -3.3927398521100596 1.1425261467859524 0.12447158496853522 -3.4579615383298212 1.2412575418464402 0.023355669589131628 -3.2055464675309198 0.84858692306791594 0.030955549640726471 -3.2707681537506814 0.94731831812840384 0.038555429692321286 -3.3359898399704426 1.0460497131888919 0.046155309743916115 -3.4012115261902043 1.14478110824938 0.053755189795510958 -3.4664332124099655 1.243512503309868 0.06135506984710578 -3.5316548986297271 1.3422438983703557 0.14322989277180531 -3.522086313012438 1.3399920762940003 0.20045324861691383 -3.44897227038562 1.2390040617490392 0.22634439732436368 -3.5123958624594929 1.3377406029980075 0.28356775316947219 -3.4392818198326749 1.2367525884530464 0.3094589018769221 -3.5027054119065477 1.3354891297020146 0.34079110901458082 -3.3661677772058578 1.1357645739080853 0.36668225772203061 -3.4295913692797297 1.2345011151570535 0.39257340642948046 -3.4930149613536026 1.3332376564060218 0.39801446485968944 -3.2930537345790398 1.0347765593631237 0.42390561356713941 -3.3564773266529127 1.1335131006120924 0.4497967622745892 -3.419900918726785 1.2322496418610607 0.47568791098203905 -3.4833245108006574 1.3309861831100289 0.48112896941224792 -3.2833632840260947 1.0325250860671309 0.50702011811969783 -3.3467868760999675 1.1312616273160996 0.53291126682714762 -3.4102104681738399 1.2299981685650678 0.55880241553459742 -3.4736340602477127 1.3287347098140361 0.53835232525735643 -3.2102492413992771 0.93153707152216991 0.56424347396480634 -3.27367283347315 1.030273612771138 0.59013462267225625 -3.3370964255470223 1.1290101540201067 0.61602577137970604 -3.4005200176208952 1.227746695269075 0.64191692008715584 -3.4639436096947676 1.3264832365180432 0.59557568110246495 -3.1371351987724601 0.83054905697720882 0.62146682980991497 -3.2005587908463324 0.92928559822617707 0.64735797851736476 -3.2639823829202048 1.0280221394751452 -0.68776769959839335 -3.5666959513206242 1.44671959757922 -0.70331323671712132 -3.6648020075463359 1.5132950180927824 -0.71885877383584895 -3.7629080637720471 1.5798704386063449 -0.73440431095457692 -3.8610141199977588 1.6464458591199074 -0.74994984807330467 -3.9591201762234705 1.7130212796334698 -0.76549538519203275 -4.0572262324491817 1.7795967001470323 -0.60296273055214777 -3.5726287981315838 1.4451027966404368 -0.61850826767087574 -3.670734854357296 1.5116782171539993 -0.63405380478960338 -3.7688409105830072 1.5782536376675618 -0.64959934190833135 -3.8669469668087189 1.6448290581811242 -0.66514487902705921 -3.9650530230344305 1.7114044786946867 -0.51815776150590198 -3.5785616449425435 1.4434859957016537 -0.53370329862462995 -3.6766677011682556 1.5100614162152162 -0.54924883574335759 -3.7747737573939673 1.5766368367287786 -0.56479437286208556 -3.8728798136196789 1.6432122572423411 -0.58033990998081353 -3.9709858698453906 1.7097876777559036 -0.43335279245965641 -3.5844944917535035 1.4418691947628706 -0.44889832957838433 -3.6826005479792157 1.508444615276433 -0.46444386669711207 -3.7807066042049273 1.5750200357899955 -0.47998940381584004 -3.8788126604306385 1.6415954563035577 -0.34854782341341084 -3.5904273385644632 1.4402523938240874 -0.3640933605321387 -3.6885333947901753 1.5068278143376499 -0.37963889765086656 -3.7866394510158869 1.5734032348512124 -0.26374285436716527 -3.5963601853754232 1.4386355928853043 -0.27928839148589313 -3.6944662416011353 1.5052110133988668 -0.1789378853209195 -3.6022930321863829 1.4370187919465209 -0.19448342243964731 -3.700399088412095 1.5035942124600834 -0.094132916274674142 -3.6082258789973429 1.4354019910077378 -0.0021955869138013269 -3.6148062102042187 1.4337484457358161 -0.094999135670574136 -3.7076645416463072 1.5019017869430595 -0.082155406507785175 -3.8083478101997654 1.5683309522743554 -0.069311677344996145 -3.9090310787532241 1.6347601176056514 -0.056467948182207135 -4.0097143473066819 1.701189282936947 -0.04362421901941823 -4.1103976158601405 1.7676184482682429 -0.030780489856629248 -4.2110808844135983 1.8340476135995389 -0.18780268442734693 -3.8005228730883958 1.570055128150303 -0.17495895526455787 -3.901206141641854 1.6364842934815991 -0.16211522610176882 -4.0018894101953117 1.7029134588128947 -0.14927149693897987 -4.1025726787487704 1.7693426241441905 -0.13642776777619089 -4.2032559473022282 1.8357717894754866 -0.29344996234690868 -3.7926979359770256 1.5717793040262507 -0.28060623318411959 -3.8933812045304843 1.6382084693575467 -0.26776250402133051 -3.9940644730839421 1.7046376346888423 -0.25491877485854153 -4.0947477416374003 1.7710668000201382 -0.24207504569575256 -4.1954310101908581 1.8374959653514342 -0.38625351110368134 -3.8855562674191142 1.6399326452334944 -0.37340978194089219 -3.9862395359725724 1.70636181056479 -0.36056605277810316 -4.0869228045260311 1.7727909758960858 -0.34772232361531419 -4.187606073079488 1.8392201412273819 -0.4790570598604541 -3.9784145988612027 1.7080859864407378 -0.46621333069766502 -4.079097867414661 1.7745151517720337 -0.4533696015348761 -4.1797811359681178 1.8409443171033295 -0.57186060861722665 -4.0712729303032917 1.7762393276479813 -0.55901687945443779 -4.1719561988567486 1.8426684929792772 -0.67750788653678828 -4.0634479931919216 1.7779635035239292 -0.66466415737399942 -4.1641312617453785 1.8443926688552248 -0.77031143529356105 -4.1563063246340093 1.8461168447311727 -1.3589365354412064 -3.3899389640640223 1.4611639624378054 -1.3995022860877531 -3.4814866026534834 1.5278896891947473 -1.4400680367342995 -3.5730342412429446 1.594615415951689 -1.4806337873808459 -3.6645818798324061 1.6613411427086306 -1.5211995380273926 -3.7561295184218673 1.7280668694655725 -1.561765288673939 -3.8476771570113284 1.7947925962225142 -1.2766573570550488 -3.412094087834046 1.4593623949536949 -1.3172231077015955 -3.5036417264235071 1.5260881217106368 -1.3577888583481421 -3.5951893650129683 1.5928138484675785 -1.3983546089946883 -3.6867370036024298 1.6595395752245201 -1.438920359641235 -3.778284642191891 1.726265301981462 -1.1943781786688914 -3.4342492116040697 1.4575608274695844 -1.2349439293154381 -3.5257968501935308 1.5242865542265263 -1.2755096799619847 -3.617344488782992 1.5910122809834679 -1.3160754306085309 -3.7088921273724536 1.6577380077404096 -1.112099000282734 -3.4564043353740934 1.4557592599854741 -1.1526647509292807 -3.5479519739635546 1.5224849867424157 -1.1932305015758273 -3.6394996125530157 1.5892107134993576 -1.2337962522223735 -3.7310472511424773 1.6559364402562993 -1.0298198218965766 -3.4785594591441171 1.4539576925013635 -1.0703855725431233 -3.5701070977335783 1.5206834192583054 -1.1109513231896699 -3.6616547363230394 1.5874091460152471 -0.947540643510419 -3.5007145829141408 1.4521561250172532 -0.98810639415696566 -3.592262221503602 1.5188818517741949 -0.86526146512426172 -3.5228697066841645 1.4503545575331427 -0.78298228673810433 -3.5450248304541878 1.4485529900490324 -1.4731820997756007 -3.8716820027838708 1.7929508218798511 -1.3561385370566894 -3.8005872517618515 1.7244605286422616 -1.3708762542270376 -3.8997133488120648 1.7910215246953669 -1.2538326915081264 -3.8286185977900455 1.7225312314577774 -1.2685704086784746 -3.9277446948402588 1.7890922275108827 -1.1367891287892151 -3.7575238467680254 1.6540409382201877 -1.1515268459595633 -3.8566499438182396 1.7206019342732932 -1.1662645631299116 -3.9557760408684528 1.7871629303263985 -1.0197455660703034 -3.6864290957460057 1.5855506449825982 -1.0344832832406519 -3.7855551927962194 1.6521116410357035 -1.0492210004110001 -3.8846812898464336 1.718672637088809 -1.0639587175813485 -3.9838073868966468 1.7852336331419145 -0.90270200335139206 -3.6153343447239865 1.5170603517450085 -0.91743972052174039 -3.7144604417741998 1.583621347798114 -0.93217743769208883 -3.8135865388244135 1.6501823438512193 -0.94691515486243716 -3.9127126358746271 1.7167433399043248 -0.9616528720327856 -4.0118387329248408 1.7833043359574303 -0.80039615780282913 -3.6433656907521801 1.5151310545605245 -0.81513387497317735 -3.7424917878023938 1.5816920506136298 -0.8298715921435259 -3.8416178848526075 1.6482530466667353 -0.84460930931387423 -3.9407439819028207 1.7148140427198408 -0.85934702648422268 -4.0398700789530348 1.7813750387729463 -1.9841400217725518 -3.0892293856421564 1.475482778628348 -2.0461199918226218 -3.1690983594426823 1.5423925112218797 -2.1080999618726919 -3.2489673332432081 1.6093022438154112 -2.1700799319227615 -3.3288363070437335 1.6762119764089429 -2.232059901972832 -3.4087052808442593 1.7431217090024744 -2.294039872022902 -3.4885742546447851 1.8100314415960062 -1.9083267116079374 -3.1267608733891881 1.4737113731526288 -1.9703066816580077 -3.2066298471897139 1.5406211057461605 -2.0322866517080778 -3.2864988209902397 1.607530838339692 -2.0942666217581474 -3.3663677947907651 1.6744405709332237 -2.1562465918082174 -3.4462367685912909 1.7413503035267552 -1.8325134014433231 -3.1642923611362197 1.4719399676769096 -1.8944933714933934 -3.2441613349367455 1.5388497002704413 -1.9564733415434634 -3.3240303087372713 1.6057594328639728 -2.0184533115935333 -3.4038992825377967 1.6726691654575045 -1.756700091278709 -3.2018238488832513 1.4701685622011904 -1.818680061328779 -3.2816928226837772 1.5370782947947221 -1.8806600313788491 -3.361561796484303 1.6039880273882536 -1.6808867811140946 -3.239355336630283 1.4683971567254712 -1.7428667511641647 -3.3192243104308088 1.5353068893190029 -1.8048467212142347 -3.3990932842313346 1.6022166219125344 -1.6050734709494805 -3.2768868243773146 1.466625751249752 -1.6670534409995506 -3.3567557981778404 1.5335354838432838 -1.5292601607848662 -3.3144183121243462 1.4648543457740328 -2.2075715472085844 -3.5316469586947754 1.8081688432090397 -2.0739189783872951 -3.4871560661718153 1.7395231441831889 -2.1147885640534527 -3.5780036458171596 1.806252199652117 -1.9402664095660056 -3.4426651736488547 1.670877445157338 -1.981135995232163 -3.5335127532941994 1.7376065006262662 -2.0220055808983206 -3.6243603329395437 1.8043355560951944 -1.8474834264108737 -3.4890218607712393 1.6689608016004154 -1.8883530120770311 -3.5798694404165836 1.7356898570693435 -1.9292225977431885 -3.6707170200619279 1.8024189125382717 -1.7138308575895842 -3.4445309682482792 1.6003151025745646 -1.7547004432557418 -3.5353785478936235 1.6670441580434927 -1.7955700289218992 -3.6262261275389682 1.7337732135124209 -1.8364396145880566 -3.7170737071843125 1.8005022689813492 -1.5801782887682947 -3.4000400757253195 1.5316694035487137 -1.6210478744344523 -3.4908876553706638 1.5983984590176419 -1.6619174601006097 -3.5817352350160081 1.66512751448657 -1.7027870457667671 -3.6725828146613524 1.7318565699554984 -1.7436566314329245 -3.7634303943066971 1.7985856254244266 -1.4465257199470054 -3.3555491832023594 1.4630237045228627 -1.4873953056131628 -3.4463967628477037 1.5297527599917911 -1.5282648912793204 -3.537244342493048 1.5964818154607192 -1.5691344769454778 -3.6280919221383927 1.6632108709296476 -1.6100040626116352 -3.718939501783737 1.7299399263985757 -1.6508736482777926 -3.8097870814290813 1.7966689818675041 -2.5240211498873184 -2.5636025989930471 1.4238777128982341 -2.6024030761515298 -2.628489396655707 1.4909404189284603 -2.6807850024157411 -2.6933761943183665 1.5580031249586868 -2.4579848377557978 -2.6145331801184071 1.4221836598016848 -2.5363667640200092 -2.679419977781067 1.4892463658319111 -2.6147486902842205 -2.7443067754437265 1.5563090718621375 -2.693130616548431 -2.809193573106386 1.6233717778923638 -2.7715125428126424 -2.8740803707690454 1.69043448392259 -2.8498944690768537 -2.9389671684317054 1.7574971899528165 -2.3919485256242772 -2.665463761243767 1.4204896067051356 -2.4703304518884885 -2.730350558906427 1.4875523127353618 -2.5487123781526999 -2.7952373565690865 1.5546150187655883 -2.6270943044169104 -2.8601241542317459 1.6216777247958145 -2.7054762306811218 -2.9250109518944054 1.6887404308260408 -2.7838581569453331 -2.9898977495570653 1.7558031368562672 -2.3259122134927566 -2.716394342369127 1.4187955536085863 -2.4042941397569679 -2.7812811400317869 1.4858582596388126 -2.4826760660211789 -2.8461679376944464 1.552920965669039 -2.5610579922853898 -2.9110547353571059 1.6199836716992653 -2.6394399185496011 -2.9759415330197654 1.6870463777294915 -2.259875901361236 -2.767324923494487 1.4171015005120373 -2.3382578276254469 -2.8322117211571469 1.4841642065422636 -2.4166397538896582 -2.8970985188198064 1.55122691257249 -2.4950216801538692 -2.9619853164824654 1.6182896186027163 -2.1938395892297149 -2.818255504619847 1.4154074474154881 -2.2722215154939258 -2.8831423022825069 1.4824701534457143 -2.3506034417581372 -2.9480290999451664 1.5495328594759408 -2.2061852033624052 -2.9340728834078669 1.4807761003491653 -2.9256608523040155 -3.0059538309727918 1.8245356812288327 -2.8465576145006759 -3.0673750742278094 1.8227206542507841 -2.7051935403363325 -3.0509668497856142 1.7539921706427564 -2.7674543766973363 -3.128796317482827 1.8209056272727355 -2.5638294661719891 -3.0345586253434185 1.6852636870347286 -2.6260903025329929 -3.1123880930406318 1.7521771436647078 -2.6883511388939967 -3.1902175607378447 1.8190906002946869 -2.4224653920076458 -3.0181504009012232 1.6165352034267009 -2.4847262283686495 -3.0959798685984361 1.68344866005668 -2.5469870647296533 -3.1738093362956494 1.7503621166866592 -2.6092479010906571 -3.2516388039928623 1.8172755733166384 -2.2811013178433019 -3.001742176459028 1.5478067198186731 -2.3433621542043062 -3.0795716441562409 1.6147201764486523 -2.4056229905653099 -3.1574011118534537 1.6816336330786315 -2.4678838269263137 -3.2352305795506666 1.7485470897086106 -2.5301446632873175 -3.3130600472478795 1.8154605463385898 -2.1397372436789586 -2.9853339520168332 1.4790782362106452 -2.2019980800399628 -3.0631634197140456 1.5459916928406245 -2.2642589164009665 -3.1409928874112585 1.6129051494706037 -2.3265197527619703 -3.2188223551084714 1.6798186061005829 -2.3887805891229741 -3.2966518228056843 1.746732062730562 -2.4510414254839779 -3.3744812905028971 1.8136455193605412 -2.0606340058756194 -3.0467551952718508 1.4772632092325966 -2.1228948422366236 -3.1245846629690632 1.544176665862576 -2.1851556785976269 -3.2024141306662761 1.6110901224925549 -2.2474165149586307 -3.2802435983634886 1.6780035791225343 -2.3096773513196345 -3.3580730660607014 1.7449170357525134 -2.3719381876806387 -3.4359025337579143 1.8118304923824928 -2.9608666961754317 -2.0701645848025074 1.4367458163890832 -3.0505615638653891 -2.1185636157054275 1.5039132290702875 -3.1402564315553474 -2.166962646608348 1.571080641751492 -3.2299512992453052 -2.2153616775112686 1.6382480544326963 -3.319646166935263 -2.2637607084141886 1.7054154671139008 -3.4093410346252209 -2.3121597393171092 1.7725828797951051 -2.9070200405664592 -2.1320148106543906 1.4351433851772493 -2.9967149082564166 -2.1804138415573107 1.5023107978584536 -3.0864097759463749 -2.2288128724602312 1.5694782105396581 -3.1761046436363327 -2.2772119033631517 1.6366456232208624 -3.2657995113262905 -2.3256109342660718 1.7038130359020669 -3.3554943790162484 -2.3740099651689923 1.7709804485832714 -2.8531733849574867 -2.1938650365062742 1.4335409539654154 -2.9428682526474441 -2.2422640674091943 1.5007083666466197 -3.0325631203374024 -2.2906630983121143 1.5678757793278244 -3.1222579880273602 -2.3390621292150349 1.6350431920090287 -3.211952855717318 -2.3874611601179554 1.702210604690233 -2.7993267293485142 -2.2557152623581578 1.4319385227535817 -2.8890215970384716 -2.3041142932610774 1.499105935434786 -2.9787164647284299 -2.3525133241639979 1.5662733481159905 -3.0684113324183877 -2.4009123550669185 1.6334407607971948 -2.7454800737395417 -2.3175654882100409 1.4303360915417478 -2.8351749414294991 -2.365964519112961 1.4975035042229521 -2.9248698091194574 -2.4143635500158815 1.5646709169041568 -2.6916334181305692 -2.3794157140619241 1.4287336603299141 -2.7813282858205266 -2.4278147449648442 1.4959010730111184 -2.6377867625215963 -2.4412659399138077 1.4271312291180802 -2.7274816302115537 -2.4896649708167278 1.4942986417992845 -2.5839401069126238 -2.5031161657656908 1.4255287979062465 -3.4983461399124791 -2.3613845712960915 1.8397440410355042 -3.4352135248825304 -2.4343521837322504 1.8380574495020683 -3.294033999460936 -2.4449755348017472 1.7693090128209259 -3.3720809098525817 -2.5073197961684097 1.8363708579686324 -3.1528544740393412 -2.4555988858712441 1.7005605761397833 -3.2309013844309873 -2.5179431472379066 1.76762242128749 -3.308948294822633 -2.5802874086045691 1.8346842664351966 -3.0116749486177463 -2.4662222369407409 1.6318121394586409 -3.0897218590093924 -2.528566498307403 1.6988739846063474 -3.1677687694010386 -2.5909107596740659 1.7659358297540542 -3.2458156797926843 -2.6532550210407284 1.8329976749017607 -2.8704954231961515 -2.4768455880102374 1.5630637027774985 -2.9485423335877976 -2.5391898493768998 1.630125547925205 -3.0265892439794437 -2.6015341107435619 1.6971873930729116 -3.1046361543710899 -2.6638783721102248 1.7642492382206183 -3.182683064762736 -2.7262226334768873 1.8313110833683248 -2.8073628081662028 -2.5498132004463967 1.5613771112440626 -2.8854097185578489 -2.6121574618130592 1.6284389563917692 -2.963456628949495 -2.6745017231797212 1.6955008015394759 -3.0415035393411411 -2.7368459845463842 1.7625626466871824 -3.1195504497327873 -2.7991902459130467 1.829624491834889 -2.6661832827446079 -2.5604365515158936 1.4926286745629203 -2.7442301931362545 -2.622780812882556 1.559690519710627 -2.8222771035279002 -2.6851250742492185 1.6267523648583335 -2.9003240139195468 -2.7474693356158806 1.69381421000604 -2.9783709243111929 -2.8098135969825431 1.7608760551537466 -3.056417834702839 -2.8721578583492056 1.8279379003014531 -2.7591444884979519 -2.7580926866853774 1.6250657733248977 -2.837191398889598 -2.8204369480520395 1.6921276184726044 -2.9152383092812446 -2.882781209418702 1.7591894636203109 -2.9932852196728903 -2.9451254707853649 1.8262513087680174 -3.3376889744850917 -1.4401714353475525 1.4504369602046852 -3.4345740373884919 -1.4713524146554451 1.5176745478712594 -3.531459100291892 -1.5025333939633376 1.5849121355378339 -3.6283441631952913 -1.5337143732712299 1.6521497232044082 -3.725229226098691 -1.5648953525791225 1.7193873108709825 -3.8221142890020912 -1.5960763318870148 1.786624898537557 -3.2976058914713691 -1.5103964726661592 1.448928788440049 -3.3944909543747692 -1.5415774519740517 1.5161663761066233 -3.4913760172781694 -1.5727584312819443 1.5834039637731978 -3.5882610801815686 -1.6039394105898366 1.6506415514397721 -3.6851461430849684 -1.6351203898977291 1.7178791391063464 -3.7820312059883685 -1.6663013692056214 1.7851167267729209 -3.2575228084576464 -1.5806215099847658 1.4474206166754129 -3.3544078713610466 -1.6118024892926581 1.5146582043419872 -3.4512929342644467 -1.6429834686005507 1.5818957920085617 -3.548177997167846 -1.674164447908443 1.649133379675136 -3.6450630600712457 -1.7053454272163355 1.7163709673417105 -3.2174397254439238 -1.6508465473033722 1.4459124449107768 -3.3143247883473239 -1.6820275266112645 1.513150032577351 -3.4112098512507241 -1.7132085059191571 1.5803876202439255 -3.5080949141541233 -1.7443894852270496 1.6476252079104998 -3.1773566424302011 -1.7210715846219786 1.4444042731461408 -3.2742417053336013 -1.7522525639298709 1.5116418608127149 -3.3711267682370014 -1.7834335432377635 1.5788794484792894 -3.1372735594164785 -1.7912966219405853 1.4428961013815047 -3.2341586223198786 -1.8224776012484776 1.510133689048079 -3.0971904764027562 -1.8615216592591917 1.4413879296168688 -3.194075539306156 -1.8927026385670842 1.5086255172834429 -3.0571073933890336 -1.9317466965777981 1.4398797578522327 -3.7364016135943188 -1.7467415539987523 1.7835573951984154 -3.6012410912050878 -1.7824564657573514 1.7148283088979366 -3.6900521148995535 -1.8285076085462435 1.7819914233629921 -3.4660805688158574 -1.8181713775159505 1.6460992225974578 -3.5548915925103226 -1.8642225203048426 1.7132623370625133 -3.6437026162047883 -1.9102736630937347 1.7804254515275688 -3.7325136398992536 -1.9563248058826268 1.8475885659926241 -3.3309200464266269 -1.8538862892745498 1.577370136296979 -3.4197310701210921 -1.8999374320634417 1.6445332507620345 -3.5085420938155574 -1.9459885748523338 1.71169636522709 -3.5973531175100231 -1.9920397176412259 1.7788594796921455 -3.6861641412044883 -2.0380908604301182 1.8460225941572008 -3.2845705477318616 -1.935652343822041 1.5758041644615557 -3.3733815714263269 -1.9817034866109329 1.6429672789266112 -3.4621925951207921 -2.027754629399825 1.7101303933916667 -3.5510036188152578 -2.0738057721887171 1.7772935078567222 -3.6398146425097231 -2.1198569149776092 1.8444566223217775 -3.1494100253426311 -1.9713672555806401 1.5070750781610769 -3.2382210490370964 -2.0174183983695322 1.5742381926261324 -3.3270320727315617 -2.0634695411584243 1.6414013070911879 -3.4158430964260269 -2.1095206839473164 1.7085644215562434 -3.5046541201204926 -2.1555718267362085 1.775727536021299 -3.5934651438149579 -2.2016229695251006 1.8428906504863543 -3.0142495029534007 -2.0070821673392394 1.4383459918605983 -3.1030605266478659 -2.0531333101281315 1.5055091063256536 -3.1918715503423312 -2.0991844529170236 1.5726722207907091 -3.2806825740367964 -2.1452355957059153 1.6398353352557646 -3.3694935977312617 -2.1912867384948074 1.7069984497208202 -3.4583046214257274 -2.2373378812836999 1.7741615641858755 -3.5471156451201926 -2.2833890240725916 1.841324678650931 -3.5780734741034754 -0.74941135050175878 1.4632437806745131 -3.6788660288498205 -0.76242917523532827 1.5305402693803678 -3.7796585835961656 -0.77544699996889777 1.5978367580862227 -3.8804511383425111 -0.78846482470246726 1.6651332467920774 -3.9812436930888557 -0.80148264943603675 1.7324297354979321 -4.0820362478352008 -0.81450047416960625 1.799726224203787 -3.5527910681130779 -0.82551355090796319 1.461832170276347 -3.653583622859423 -0.83853137564153257 1.5291286589822017 -3.754376177605768 -0.85154920037510218 1.5964251476880567 -3.8551687323521135 -0.86456702510867156 1.6637216363939114 -3.9559612870984586 -0.87758484984224105 1.731018125099766 -3.5275086621226803 -0.90161575131416749 1.460420559878181 -3.6283012168690254 -0.91463357604773687 1.5277170485840357 -3.7290937716153705 -0.92765140078130648 1.5950135372898906 -3.829886326361716 -0.94066922551487586 1.6623100259957453 -3.9306788811080611 -0.95368705024844536 1.7296065147016002 -3.5022262561322828 -0.97771795172037179 1.4590089494800149 -3.6030188108786279 -0.99073577645394117 1.5263054381858696 -3.7038113656249729 -1.0037536011875108 1.5936019268917245 -3.8046039203713184 -1.0167714259210803 1.6608984155975792 -3.4769438501418852 -1.0538201521265762 1.4575973390818489 -3.5777364048882303 -1.0668379768601455 1.5248938277877035 -3.6785289596345754 -1.079855801593715 1.5921903164935585 -3.4516614441514877 -1.1299223525327804 1.4561857286836828 -3.5524539988978328 -1.1429401772663499 1.5234822173895375 -3.4263790381610901 -1.2060245529389848 1.4547741182855167 -3.5271715929074352 -1.2190423776725543 1.5220706069913714 -3.4010966321706926 -1.2821267533451892 1.4533625078873509 -4.0566411284251531 -0.89096691192293298 1.798313185379385 -4.0275290941569137 -0.97944468968903819 1.7968530417939284 -3.9026628798175764 -1.0386229592165548 1.7281602612302556 -3.9984170598886739 -1.0679224674551433 1.7953928982084717 -3.7777966654782396 -1.0978012287440715 1.6594674806665828 -3.8735508455493366 -1.1271007369826598 1.7267001176447989 -3.9693050256204341 -1.1564002452212483 1.793932754623015 -3.6529304511389027 -1.1569794982715882 1.59077470010291 -3.7486846312099997 -1.1862790065101767 1.6580073370811261 -3.8444388112810968 -1.215578514748765 1.7252399740593423 -3.9401929913521943 -1.2448780229873535 1.7924726110375584 -3.6238184168706629 -1.2454572760376934 1.5893145565174533 -3.7195725969417599 -1.2747567842762817 1.6565471934956695 -3.8153267770128569 -1.3040562925148702 1.7237798304738856 -3.9110809570839544 -1.3333558007534585 1.791012467452102 -3.498952202531326 -1.3046355455652103 1.5206217759537806 -3.5947063826024235 -1.3339350538037986 1.5878544129319969 -3.6904605626735205 -1.3632345620423869 1.6550870499102128 -3.7862147427446171 -1.3925340702809754 1.7223196868884292 -3.8819689228157146 -1.4218335785195637 1.7895523238666453 -3.3740859881919891 -1.363813815092727 1.4519289953901078 -3.4698401682630862 -1.3931133233313155 1.5191616323683239 -3.5655943483341836 -1.4224128315699038 1.5863942693465403 -3.6613485284052807 -1.4517123398084921 1.6536269063247564 -3.7571027084763777 -1.4810118480470804 1.7208595433029725 -3.8528568885474752 -1.5103113562856689 1.7880921802811889 -3.6746389165624156 -0.022749462771007645 1.4750800294961468 -3.7760395518139624 -0.016670597365272266 1.5424337186115662 -3.8774401870655093 -0.010591731959536776 1.609787407726986 -3.9788408223170566 -0.0045128665538012314 1.6771410968424054 -3.6648706574132839 -0.10211171051315882 1.4737759051608561 -3.7662712926648307 -0.096032845107423437 1.5411295942762755 -3.8676719279163776 -0.089953979701687947 1.6084832833916953 -3.9690725631679249 -0.08387511429595243 1.6758369725071147 -4.0704731984194717 -0.07779624889021701 1.7431906616225341 -3.6551023982641522 -0.1814739582553101 1.4724717808255654 -3.756503033515699 -0.17539509284957472 1.5398254699409848 -3.8579036687672459 -0.16931622744383923 1.6071791590564046 -3.9593043040187932 -0.16323736203810374 1.674532848171824 -4.06070493927034 -0.15715849663236828 1.7418865372872434 -3.6453341391150205 -0.26083620599746127 1.4711676564902747 -3.7467347743665673 -0.25475734059172589 1.5385213456056941 -3.8481354096181142 -0.24867847518599043 1.6058750347211139 -3.9495360448696615 -0.24259960978025494 1.6732287238365333 -3.6355658799658888 -0.34019845373961244 1.469863532154984 -3.7369665152174356 -0.33411958833387706 1.5372172212704034 -3.8383671504689825 -0.32804072292814163 1.604570910385823 -3.625797620816757 -0.41956070148176361 1.4685594078196933 -3.7271982560683039 -0.41348183607602823 1.5359130969351127 -3.6160293616676253 -0.498922949223915 1.4672552834844028 -3.7174299969191726 -0.49284408381817957 1.5346089725998222 -3.6062611025184936 -0.57828519696606617 1.4659511591491121 -4.171665362934827 -0.073726110887377239 1.8105372490979736 -4.1605168826040222 -0.16638753030385456 1.8091861069696633 -4.0498007340409874 -0.2474661943750186 1.7405437164891027 -4.1493684022732173 -0.25904894972033188 1.807834964841353 -3.9390845854779526 -0.32854485844618242 1.6719013260085422 -4.0386522537101825 -0.34012761379149586 1.7391925743607923 -4.1382199219424125 -0.35171036913680914 1.8064838227130426 -3.8283684369149182 -0.40962352251734629 1.6032589355279816 -3.9279361051471473 -0.42120627786265974 1.6705501838802319 -4.0275037733793777 -0.43278903320797318 1.737841432232482 -4.1270714416116077 -0.44437178855328641 1.8051326805847323 -3.8172199565841129 -0.50228494193382356 1.6019077933996713 -3.916787624816342 -0.51386769727913706 1.6691990417519216 -4.0163552930485729 -0.52545045262445045 1.7364902901041717 -4.1159229612808019 -0.53703320796976373 1.803781538456422 -3.7065038080210782 -0.5833636060049876 1.5332654029191108 -3.8060714762533077 -0.59494636135030088 1.6005566512713609 -3.9056391444855372 -0.60652911669561438 1.6678478996236112 -4.0052068127177671 -0.61811187204092777 1.7351391479758613 -4.1047744809499971 -0.62969462738624105 1.8024303963281116 -3.5957876594580438 -0.66444227007615153 1.4646230124385504 -3.6953553276902729 -0.67602502542146481 1.5319142607908005 -3.7949229959225028 -0.6876077807667782 1.5992055091430506 -3.8944906641547319 -0.69919053611209159 1.6664967574953009 -3.9940583323869618 -0.71077329145740498 1.733788005847551 -4.0936260006191914 -0.72235604680271837 1.8010792541998011 -3.524253348074422 0.6870027821812611 1.4183100176506072 -3.6226316047102896 0.71241218512221138 1.4857164562108316 -3.7210098613461571 0.73782158806316156 1.553122894771056 -3.5303545793971653 0.60725882759653393 1.4171387922569305 -3.6287328360330329 0.63266823053748422 1.4845452308171549 -3.7271110926689004 0.6580776334784344 1.5519516693773794 -3.8254893493047675 0.6834870364193848 1.619358107937604 -3.923867605940635 0.70889643936033497 1.6867645464978285 -4.0222458625765025 0.73430584230128526 1.7541709850580529 -3.5364558107199087 0.52751487301180677 1.4159675668632539 -3.6348340673557762 0.55292427595275706 1.4833740054234783 -3.7332123239916437 0.57833367889370724 1.5507804439837027 -3.8315905806275108 0.60374308183465764 1.6181868825439274 -3.9299688372633783 0.62915248477560781 1.6855933211041518 -4.0283470938992458 0.65456188771655799 1.7529997596643765 -3.542557042042652 0.44777091842707939 1.4147963414695772 -3.6409352986785195 0.47318032136802973 1.4822027800298017 -3.7393135553143866 0.49858972430897991 1.5496092185900261 -3.8376918119502541 0.52399912724993025 1.6170156571502508 -3.9360700685861212 0.54940853019088043 1.6844220957104752 -3.6470365300012624 0.39343636678330252 1.481031554636125 -3.7454147866371299 0.41884576972425275 1.5484379931963494 -3.843793043272997 0.44425517266520304 1.6158444317565741 -3.6531377613240057 0.3136924121985753 1.4798603292424484 -3.7515160179598728 0.33910181513952559 1.5472667678026728 -3.6592389926467486 0.23394845761384811 1.4786891038487717 -3.7576172492826161 0.25935786055479843 1.5460955424089964 -3.6653402239694919 0.15420450302912075 1.4775178784550951 -4.1208982067407014 0.75678733324051684 1.8215678775948823 -4.1282846313950818 0.66331443227456344 1.82035189100508 -4.0355844084543415 0.56268184014283307 1.751788966337124 -4.1356710560494614 0.56984153130860993 1.8191359044152777 -3.9428841855136021 0.46204924801110275 1.6832260416691678 -4.042970833108722 0.4692089391768795 1.7505729797473217 -4.1430574807038418 0.47636863034265636 1.8179199178254755 -3.8501839625728622 0.36141665587937233 1.6146631170012116 -3.9502706101679821 0.36857634704514924 1.6820100550793655 -4.0503572577631015 0.37573603821092599 1.7493569931575195 -4.1504439053582214 0.38289572937670285 1.8167039312356732 -3.8575703872272422 0.26794375491341887 1.6134471304114093 -3.9576570348223621 0.27510344607919573 1.6807940684895633 -4.057743682417482 0.28226313724497248 1.7481410065677172 -4.1578303300126018 0.28942282841074934 1.8154879446458709 -3.7648701642865023 0.16731116278168859 1.5448842057434531 -3.8649568118816222 0.17447085394746542 1.612231143821607 -3.9650434594767421 0.18163054511324228 1.679578081899761 -4.0651301070718615 0.18879023627901909 1.7469250199779149 -4.1652167546669814 0.19594992744479595 1.8142719580560687 -3.6721699413457625 0.066678570649958246 1.4763212810754971 -3.7722565889408823 0.07383826181573501 1.5436682191536508 -3.8723432365360022 0.080997952981511898 1.6110151572318048 -3.9724298841311221 0.088157644147288744 1.6783620953099587 -4.072516531726242 0.095317335313065521 1.7457090333881127 -4.1726031793213618 0.1024770264788424 1.8130559714662666 -4.0799029563806215 0.0018444343471120885 1.7444930467983104 -4.1799896039757414 0.0090041255128889604 1.8118399848764644 -3.3520256570925739 1.3050211002201946 1.4262964819639175 -3.4436489707274895 1.3490571669050686 1.4937471964050484 -3.5352722843624051 1.3930932335899426 1.5611979108461793 -3.6268955979973208 1.4371293002748171 1.6286486252873102 -3.7185189116322364 1.4811653669596914 1.6960993397284412 -3.810142225267152 1.5252014336445658 1.7635500541695719 -3.3738494742157932 1.2279774869802447 1.425302464025576 -3.4654727878507088 1.2720135536651187 1.492753178466707 -3.5570961014856244 1.3160496203499927 1.5602038929078377 -3.64871941512054 1.3600856870348672 1.6276546073489686 -3.7403427287554556 1.4041217537197415 1.6951053217900995 -3.8319660423903712 1.4481578204046159 1.7625560362312305 -3.3956732913390124 1.1509338737402945 1.4243084460872346 -3.487296604973928 1.1949699404251686 1.4917591605283653 -3.5789199186088441 1.2390060071100428 1.5592098749694963 -3.6705432322437597 1.2830420737949173 1.6266605894106272 -3.7621665458786753 1.3270781404797916 1.6941113038517579 -3.4174971084622316 1.0738902605003444 1.4233144281488932 -3.5091204220971473 1.1179263271852187 1.4907651425900239 -3.6007437357320633 1.1619623938700929 1.5582158570311546 -3.6923670493669789 1.2059984605549674 1.6256665714722855 -3.4393209255854509 0.9968466472603944 1.4223204102105516 -3.5309442392203665 1.0408827139452688 1.4897711246516823 -3.6225675528552825 1.084918780630143 1.5572218390928132 -3.4611447427086706 0.91980303402044439 1.4213263922722101 -3.5527680563435862 0.96383910070531886 1.4887771067133408 -3.6443913699785022 1.0078751673901931 1.5562278211544716 -3.4829685598318902 0.84275942078049426 1.4203323743338685 -3.5745918734668054 0.88679548746536863 1.4877830887749992 -3.5047923769551095 0.76571580754054425 1.4193383563955271 -3.9026080429757704 1.5664162520967153 1.8309922154964176 -3.928456210259299 1.4758965131832726 1.8299573422934912 -3.8573507800641664 1.3591899433850978 1.7615258677728138 -3.9543043775428277 1.38537677426983 1.8289224690905648 -3.7862453498690343 1.242483373586923 1.6930943932521365 -3.8831989473476951 1.2686702044716553 1.7604909945698874 -3.9801525448263564 1.2948570353563873 1.8278875958876384 -3.7151399196739012 1.1257768037887483 1.624662918731459 -3.8120935171525629 1.1519636346734803 1.6920595200492101 -3.9090471146312238 1.1781504655582127 1.7594561213669611 -4.0060007121098851 1.2043372964429446 1.826852722684712 -3.7409880869574299 1.0352570648753057 1.6236280455285326 -3.8379416844360912 1.0614438957600378 1.6910246468462837 -3.9348952819147525 1.08763072664477 1.7584212481640347 -4.0318488793934133 1.113817557529502 1.8258178494817854 -3.6698826567622977 0.91855049507713082 1.5551965710078552 -3.7668362542409586 0.94473732596186288 1.6225931723256062 -3.8637898517196199 0.97092415684659505 1.6899897736433573 -3.9607434491982811 0.99711098773132711 1.7573863749611081 -4.0576970466769415 1.0232978186160591 1.824782976278859 -3.5987772265671651 0.8018439252789562 1.4867650964871779 -3.6957308240458264 0.82803075616368815 1.5541616978049289 -3.7926844215244873 0.85421758704842032 1.6215582991226798 -3.8896380190031481 0.88040441793315249 1.6889549004404307 -3.9865916164818094 0.90659124881788455 1.7563515017581817 -4.0835452139604698 0.9327780797026165 1.8237481030759324 -3.8185325888080159 0.76369784813497776 1.6205234259197534 -3.9154861862866768 0.78988467901970993 1.6879200272375043 -4.0124397837653376 0.81607150990444199 1.7553166285552551 -4.1093933812439989 0.84225834078917394 1.822713229873006 -3.0334634451173148 1.9550720398095942 1.4332619148387649 -3.1147735079745758 2.0161729400291555 1.500746735988286 -3.1960835708318371 2.0772738402487168 1.5682315571378076 -3.277393633689099 2.1383747404682785 1.635716378287329 -3.3587036965463604 2.1994756406878397 1.7032011994368501 -3.4400137594036222 2.260576540907401 1.7706860205863715 -3.0702741046030235 1.8838467046975893 1.4325157836481806 -3.1515841674602845 1.9449476049171506 1.5000006047977017 -3.2328942303175459 2.0060485051367118 1.5674854259472233 -3.3142042931748077 2.0671494053562736 1.6349702470967447 -3.3955143560320691 2.1282503055758348 1.7024550682462658 -3.4768244188893309 2.1893512057953961 1.7699398893957869 -3.1070847640887322 1.8126213695855846 1.4317696524575962 -3.1883948269459932 1.8737222698051457 1.4992544736071174 -3.2697048898032546 1.9348231700247072 1.566739294756639 -3.3510149526605164 1.9959240702442687 1.6342241159061601 -3.4323250155177778 2.0570249704638299 1.7017089370556813 -3.143895423574441 1.7413960344735797 1.4310235212670119 -3.2252054864317019 1.8024969346931408 1.4985083424165331 -3.3065155492889633 1.8635978349127023 1.5659931635660544 -3.3878256121462251 1.9246987351322637 1.6334779847155758 -3.1807060830601492 1.670170699361575 1.4302773900764276 -3.2620161459174106 1.7312715995811361 1.4977622112259488 -3.343326208774672 1.7923724998006976 1.5652470323754701 -3.217516742545858 1.5989453642495701 1.4295312588858433 -3.2988268054031193 1.6600462644691314 1.4970160800353645 -3.3801368682603807 1.7211471646886927 1.5645009011848856 -3.2543274020315662 1.5277200291375654 1.428785127695259 -3.3356374648888281 1.5888209293571265 1.4962699488447802 -3.2911380615172749 1.4564946940255605 1.4280389965046745 -3.5222140566092506 2.3199962376505288 1.8381658751489167 -3.5656984258291597 2.2361676323699111 1.837382511560022 -3.5190904687323936 2.1078233910600064 1.7691633227690189 -3.6091827950490685 2.1523390270892939 1.8365991479711272 -3.4724825116356284 1.9794791497501021 1.7009441339780162 -3.5625748379523028 2.0239947857793892 1.7683799591801241 -3.6526671642689772 2.0685104218086767 1.8358157843822325 -3.4258745545388627 1.8511349084401976 1.6327249451870134 -3.5159668808555371 1.8956505444694847 1.7001607703891213 -3.6060592071722115 1.9401661804987718 1.7675965955912294 -3.6961515334888864 1.9846818165280593 1.8350324207933375 -3.4693589237587714 1.7673063031595801 1.6319415815981184 -3.5594512500754458 1.8118219391888672 1.6993774068002265 -3.6495435763921202 1.8563375752181543 1.7668132320023344 -3.7396359027087955 1.9008532112474419 1.8342490572044428 -3.4227509666620057 1.6389620618496756 1.5637223928071156 -3.5128432929786806 1.6834776978789627 1.6311582180092237 -3.602935619295355 1.7279933339082498 1.6985940432113316 -3.6930279456120294 1.7725089699375369 1.7660298684134397 -3.7831202719287043 1.8170246059668242 1.8334656936155478 -3.3761430095652405 1.5106178205397711 1.4955032040161129 -3.4662353358819145 1.5551334565690582 1.5629390292182208 -3.5563276621985893 1.5996490925983453 1.6303748544203287 -3.6464199885152637 1.6441647286276324 1.6978106796224368 -3.7365123148319381 1.6886803646569195 1.7652465048245447 -3.826604641148613 1.7331960006862068 1.832682330026653 -3.3295350524684748 1.3822735792298668 1.4272840152251101 -3.4196273787851492 1.4267892152591537 1.4947198404272179 -3.5097197051018236 1.4713048512884406 1.5621556656293258 -3.5998120314184985 1.5158204873177277 1.629591490831434 -3.6899043577351729 1.560336123347015 1.6970273160335418 -3.7799966840518473 1.6048517593763021 1.76446314123565 -3.8700890103685222 1.6493673954055892 1.8318989664377581 -2.5857699245494348 2.5278647899381257 1.4370198938894008 -2.6535640087821681 2.603750845753857 1.5045284169043092 -2.7213580930149011 2.6796369015695878 1.5720369399192176 -2.789152177247634 2.7555229573853186 1.639545462934126 -2.8569462614803673 2.8314090132010494 1.7070539859490343 -2.9247403457131003 2.9072950690167807 1.7745625089639427 -2.9925344299458336 2.9831811248325115 1.8420710319788511 -2.6362463034294317 2.4654529829511143 1.4366339243762196 -2.7040403876621646 2.5413390387668455 1.504142447391128 -2.771834471894898 2.6172250945825764 1.5716509704060364 -2.8396285561276309 2.6931111503983072 1.6391594934209448 -2.9074226403603642 2.7689972062140384 1.7066680164358532 -2.9752167245930972 2.8448832620297693 1.7741765394507616 -2.6867226823094286 2.4030411759641028 1.4362479548630385 -2.7545167665421615 2.4789272317798341 1.5037564778779469 -2.8223108507748944 2.5548132875955649 1.5712650008928553 -2.8901049350076278 2.6306993434112962 1.6387735239077637 -2.9578990192403607 2.706585399227027 1.706282046922672 -2.7371990611894255 2.3406293689770914 1.4358619853498573 -2.8049931454221584 2.4165154247928227 1.5033705083647657 -2.8727872296548913 2.4924014806085535 1.5708790313796741 -2.9405813138876242 2.5682875364242848 1.6383875543945825 -2.7876754400694219 2.2782175619900804 1.4354760158366764 -2.8554695243021548 2.3541036178058112 1.5029845388515848 -2.9232636085348878 2.4299896736215425 1.5704930618664932 -2.8381518189494188 2.215805755003069 1.4350900463234952 -2.9059459031821513 2.2916918108187998 1.5025985693384036 -2.9737399874148847 2.3675778666345311 1.570107092353312 -2.8886281978294153 2.153393948016058 1.4347040768103143 -2.9564222820621482 2.2292800038317888 1.5022125998252227 -2.9391045767094122 2.0909821410290466 1.4343181072971332 -3.0518507058394078 2.9099165901526263 1.8416504412807118 -3.0317639616080849 2.7750182720362213 1.7737667936082835 -3.1114627566030268 2.8362889331288867 1.8412286921893846 -3.0116772173767625 2.6401199539198159 1.7058831459358552 -3.0913760123717045 2.7013906150124818 1.7733450445169563 -3.1710748073666464 2.7626612761051472 1.8408069430980574 -2.9915904731454401 2.5052216358034114 1.6379994982634272 -3.0712892681403821 2.5664922968960764 1.705461396844528 -3.150988063135324 2.6277629579887423 1.7729232954256291 -3.2306868581302659 2.6890336190814077 1.8403851940067302 -3.0512025239090597 2.4315939787796719 1.6375777491721 -3.1309013189040016 2.4928646398723369 1.7050396477532008 -3.2106001138989435 2.5541353009650027 1.7725015463343019 -3.290298908893885 2.6154059620576682 1.839963444915403 -3.0311157796777373 2.2966956606632665 1.5696941014996715 -3.1108145746726792 2.3579663217559323 1.6371560000807728 -3.1905133696676211 2.4192369828485973 1.7046178986618736 -3.270212164662563 2.4805076439412632 1.7720797972429747 -3.3499109596575045 2.5417783050339287 1.8395416958240758 -3.0110290354464149 2.1617973425468615 1.5018104538272432 -3.0907278304413568 2.2230680036395269 1.5692723524083443 -3.1704266254362987 2.2843386647321928 1.6367342509894456 -3.2501254204312406 2.3456093258248578 1.7041961495705464 -3.3298242154261826 2.4068799869175233 1.7716580481516475 -3.409523010421124 2.4681506480101891 1.8391199467327486 -2.9909422912150929 2.0268990244304566 1.4339268061548149 -3.0706410862100344 2.088169685523122 1.501388704735916 -3.1503398812049763 2.1494403466157874 1.5688506033170171 -3.2300386761999182 2.2107110077084533 1.6363125018981182 -3.3097374711948597 2.2719816688011183 1.7037744004792192 -3.3894362661898016 2.3332523298937837 1.7712362990603203 -3.4691350611847431 2.3945229909864496 1.8386981976414214 -2.0258409851870027 2.9956249446041099 1.4359064816071603 -2.0773788642072515 3.0834259748923851 1.5034279350709074 -2.1289167432275002 3.1712270051806604 1.5709493885346548 -2.180454622247749 3.259028035468936 1.6384708419984022 -2.088145822830052 2.9447944118087439 1.4360630798995013 -2.1396837018503008 3.0325954420970191 1.5035845333632485 -2.1912215808705495 3.1203964723852944 1.5711059868269959 -2.2427594598907983 3.2081975026735701 1.6386274402907433 -2.294297338911047 3.2959985329618458 1.7061488937544904 -2.3458352179312958 3.383799563250121 1.7736703472182376 -2.1504506604731013 2.8939638790133779 1.4362196781918424 -2.20198853949335 2.9817649093016532 1.5037411316555898 -2.2535264185135988 3.0695659395899284 1.5712625851193369 -2.3050642975338476 3.1573669698782041 1.6387840385830843 -2.3566021765540963 3.2451680001664798 1.7063054920468315 -2.2127554981161506 2.8431333462180124 1.4363762764841834 -2.2642933771363993 2.9309343765062876 1.5038977299479308 -2.3158312561566481 3.0187354067945629 1.571419183411678 -2.3673691351768968 3.1065364370828386 1.6389406368754256 -2.2750603357591999 2.7923028134226464 1.4365328747765247 -2.3265982147794486 2.8801038437109217 1.5040543282402721 -2.3781360937996974 2.9679048739991969 1.5715757817040192 -2.4296739728199461 3.0557059042874726 1.6390972351677666 -2.3373651734022491 2.7414722806272809 1.4366894730688657 -2.3889030524224979 2.8292733109155557 1.5042109265326131 -2.4404409314427467 2.9170743412038314 1.5717323799963603 -2.3996700110452984 2.6906417478319149 1.436846071361207 -2.4512078900655472 2.7784427781201901 1.5043675248249544 -2.4619748486883477 2.6398112150365494 1.4370026696535481 -2.524279686331397 2.5889806822411834 1.4371592679458893 -2.4050261346486366 3.4652703146558537 1.8411660614238321 -2.4125740737160912 3.3293013925156174 1.773812032695286 -2.4787049753882933 3.4050316730202832 1.8412844058340518 -2.4201220127835459 3.1933324703753807 1.7064580039667401 -2.4862529144557479 3.2690627508800469 1.7739303771055057 -2.5523838161279504 3.3447930313847127 1.8414027502442716 -2.4938008535232026 3.1330938287398102 1.7065763483769598 -2.5599317551954051 3.2088241092444765 1.7740487215157255 -2.6260626568676075 3.2845543897491423 1.8415210946544913 -2.5013487925906572 2.997124906599574 1.6392223196484139 -2.5674796942628593 3.0728551871042398 1.7066946927871796 -2.6336105959350622 3.148585467608906 1.7741670659259452 -2.6997414976072642 3.2243157481135718 1.8416394390647111 -2.5088967316581119 2.8611559844593377 1.5718682909198678 -2.5750276333303144 2.9368862649640035 1.6393406640586337 -2.6411585350025164 3.0126165454686693 1.7068130371973993 -2.7072894366747189 3.0883468259733355 1.7742854103361649 -2.7734203383469214 3.1640771064780013 1.8417577834749308 -2.5164446707255665 2.725187062319101 1.5045142621913219 -2.582575572397769 2.8009173428237673 1.5719866353300875 -2.6487064740699711 2.876647623328433 1.6394590084688534 -2.7148373757421735 2.9523779038330988 1.706931381607619 -2.780968277414376 3.0281081843377646 1.7744037547463847 -2.8470991790865785 3.1038384648424304 1.8418761278851505 -2.5901235114652232 2.6649484206835305 1.5046326066015416 -2.6562544131374257 2.7406787011881963 1.5721049797403073 -2.7223853148096282 2.8164089816928621 1.6395773528790729 -2.7885162164818302 2.8921392621975284 1.7070497260178388 -2.8546471181540327 2.9678695427021942 1.7745220991566044 -2.9207780198262352 3.04359982320686 1.8419944722953701 -1.4471937465635827 3.2962742633456803 1.4281365454544765 -1.4802403011245289 3.3926396458333872 1.4956568705350477 -1.5132868556854748 3.4890050283210936 1.5631771956156191 -1.546333410246421 3.5853704108088009 1.6306975206961905 -1.579379964807367 3.6817357932965078 1.6982178457767618 -1.6124265193683129 3.7781011757842142 1.7657381708573332 -1.51911458176503 3.2595209952292867 1.4291367865857765 -1.5521611363259762 3.3558863777169936 1.4966571116663476 -1.5852076908869221 3.4522517602047 1.564177436746919 -1.6182542454478683 3.5486171426924074 1.6316977618274904 -1.6513008000088143 3.6449825251801142 1.6992180869080618 -1.68434735456976 3.7413479076678211 1.7667384119886331 -1.5910354169664773 3.2227677271128932 1.4301370277170764 -1.6240819715274235 3.3191331096006 1.4976573527976476 -1.6571285260883695 3.4154984920883065 1.5651776778782189 -1.6901750806493157 3.5118638745760138 1.6326980029587903 -1.7232216352102614 3.6082292570637207 1.7002183280393617 -1.6629562521679246 3.1860144589964996 1.4311372688483763 -1.6960028067288708 3.2823798414842065 1.4986575939289475 -1.729049361289817 3.3787452239719129 1.5661779190095189 -1.762095915850763 3.4751106064596202 1.6336982440900902 -1.734877087369372 3.149261190880106 1.4321375099796763 -1.7679236419303181 3.2456265733678129 1.4996578350602474 -1.8009701964912643 3.3419919558555193 1.5671781601408188 -1.8067979225708193 3.1125079227637125 1.4331377511109762 -1.8398444771317655 3.2088733052514193 1.5006580761915473 -1.8787187577722666 3.0757546546473189 1.4341379922422761 -1.9117653123332128 3.1721200371350258 1.5016583173228475 -1.9506395929737141 3.0390013865309253 1.4351382333735758 -1.6477841047496433 3.8732178200982652 1.8332505220102007 -1.7331395718610287 3.8292053075066406 1.8342044085958877 -1.7686641058864021 3.6978966528720836 1.7676958825354594 -1.8184950389724139 3.7851927949150159 1.8351582951815746 -1.8041886399117761 3.5665879982375266 1.7011873564750311 -1.8540195729977875 3.6538841402804589 1.7686497691211462 -1.9038505060837994 3.7411802823233913 1.8361121817672617 -1.8397131739371499 3.4352793436029696 1.6346788304146027 -1.8895441070231613 3.5225754856459019 1.7021412430607179 -1.9393750401091729 3.6098716276888343 1.7696036557068331 -1.9892059731951846 3.6971677697317666 1.8370660683529485 -1.875237707962524 3.3039706889684131 1.5681703043541741 -1.9250686410485351 3.391266831011345 1.6356327170002896 -1.9748995741345465 3.4785629730542773 1.7030951296464047 -2.0247305072205584 3.5658591150972092 1.7705575422925202 -2.07456144030657 3.6531552571401416 1.8380199549386356 -1.9605931750739092 3.259958176376788 1.569124190939861 -2.0104241081599206 3.3472543184197203 1.6365866035859764 -2.0602550412459317 3.4345504604626527 1.7040490162320916 -2.1100859743319438 3.5218466025055846 1.771511428878207 -2.1599169074179549 3.6091427445485169 1.8389738415243224 -1.9961177090992832 3.128649521742231 1.5026156648794329 -2.0459486421852948 3.2159456637851633 1.5700780775255481 -2.095779575271306 3.3032418058280957 1.6375404901716635 -2.1456105083573171 3.3905379478710276 1.7050029028177787 -2.1954414414433292 3.4778340899139595 1.7724653154638941 -2.2452723745293404 3.5651302319568918 1.8399277281100095 -2.2309659754687026 3.3465254352794029 1.7059567894034655 -2.2807969085547142 3.4338215773223348 1.7734192020495809 -2.3306278416407258 3.5211177193652672 1.8408816146956963 -0.74936683897981082 3.5978555242521488 1.4759450905301343 -0.76226034471110893 3.6989915711317205 1.5434380434052046 -0.77515385044240692 3.8001276180112926 1.6109309962802751 -0.78804735617370514 3.9012636648908643 1.6784239491553454 -0.80094086190500335 4.002399711770436 1.7459169020304159 -0.82869053941702442 3.5774151372607976 1.4782723537630991 -0.84158404514832252 3.6785511841403693 1.5457653066381694 -0.85447755087962052 3.7796872310199414 1.6132582595132399 -0.86737105661091873 3.8808232778995131 1.6807512123883102 -0.88026456234221695 3.9819593247790848 1.7482441652633807 -0.90801423985423801 3.5569747502694464 1.4805996169960638 -0.92090774558553612 3.6581107971490181 1.5480925698711341 -0.93380125131683422 3.7592468440285902 1.6155855227462046 -0.94669475704813233 3.8603828909081619 1.6830784756212749 -0.97444443456015351 3.4353983163985236 1.4154339273539585 -0.98733794029145161 3.5365343632780952 1.4829268802290285 -1.0002314460227497 3.6376704101576669 1.5504198331040988 -1.0131249517540479 3.738806457037239 1.6179127859791693 -1.0260184574853459 3.8399425039168107 1.6854057388542396 -1.0537681349973673 3.4149579294071724 1.4177611905869232 -1.0666616407286653 3.516093976286744 1.4852541434619932 -1.0795551464599635 3.6172300231663157 1.5527470963370638 -1.0924486521912617 3.7183660700458878 1.620240049212134 -1.1330918354345809 3.3945175424158212 1.4200884538198879 -1.1459853411658789 3.4956535892953928 1.487581406694958 -1.1588788468971771 3.5967896361749645 1.5550743595700285 -1.2124155358717945 3.37407715542447 1.4224157170528526 -1.2253090416030925 3.4752132023040416 1.4899086699279229 -1.2917392363090081 3.3536367684331188 1.4247429802858174 -0.89816112387400759 4.0815469800214617 1.815717373281013 -0.96165726740507884 3.960878603242723 1.750563263046468 -0.99290478018367434 4.0563342835314904 1.8179837807405186 -1.0564009237147456 3.9356659067527517 1.7528296705059736 -1.0876484364933412 4.0311215870415191 1.8202501882000239 -1.1198970672458168 3.8149975299740131 1.6876755602714286 -1.1511445800244124 3.9104532102627805 1.755096077965479 -1.1823920928030081 4.0059088905515479 1.8225165956595295 -1.1833932107768881 3.694329153195274 1.6225214500368836 -1.2146407235554837 3.7897848334840418 1.6899419677309342 -1.2458882363340793 3.8852405137728092 1.7573624854249845 -1.2771357491126749 3.9806961940615766 1.8247830031190349 -1.2468893543079593 3.5736607764165345 1.5573673398023387 -1.2781368670865549 3.6691164567053027 1.6247878574963892 -1.3093843798651505 3.7645721369940706 1.6922083751904398 -1.3406318926437462 3.8600278172828379 1.7596288928844899 -1.3718794054223418 3.9554834975716053 1.8270494105785404 -1.3103854978390308 3.4529923996377958 1.4922132295677939 -1.3416330106176262 3.5484480799265632 1.5596337472618442 -1.3728805233962218 3.6439037602153315 1.6270542649558948 -1.4041280361748174 3.7393594405040989 1.6944747826499451 -1.4353755489534128 3.8348151207928667 1.7618953003439954 -1.4666230617320084 3.9302708010816341 1.8293158180380458 -1.3738816413701018 3.3323240228590567 1.4270591193332489 -1.4051291541486977 3.4277797031478245 1.4944796370272992 -1.436376666927293 3.5232353834365919 1.5619001547213498 -1.4676241797058887 3.6186910637253602 1.6293206724154001 -1.498871692484484 3.7141467440141276 1.6967411901094507 -1.5301192052630794 3.809602424302895 1.7641617078035008 -1.561366718041675 3.9050581045916628 1.8315822254975513 -0.04393932889695118 3.6231420247606949 1.4420654084231754 -0.036923224808933452 3.7248119241945554 1.5095373345744458 -0.029907120720915836 3.8264818236284164 1.5770092607257167 -0.022891016632898109 3.9281517230622769 1.6444811868769871 -0.015874912544880354 4.0298216224961374 1.7119531130282575 -0.0088588084568626269 4.1314915219299984 1.7794250391795283 -0.1303073156098018 3.6211528843751135 1.4464201717105307 -0.12329121152178413 3.722822783808974 1.5138920978618011 -0.11627510743376646 3.824492683242835 1.581364024013072 -0.1092590033457487 3.9261625826766955 1.6488359501643424 -0.10224289925773096 4.027832482110556 1.7163078763156128 -0.095226795169713219 4.129502381544417 1.7837798024668836 -0.21667530232265242 3.6191637439895317 1.450774934997886 -0.2096591982346348 3.7208336434233926 1.5182468611491564 -0.20264309414661705 3.8225035428572536 1.5857187873004273 -0.19562699005859932 3.9241734422911136 1.6531907134516977 -0.18861088597058157 4.0258433417249746 1.7206626396029683 -0.3030432890355032 3.6171746036039503 1.4551296982852413 -0.29602718494748559 3.7188445030378112 1.5226016244365117 -0.28901108085946775 3.8205144024716717 1.5900735505877825 -0.28199497677145002 3.9221843019055322 1.6575454767390529 -0.38941127574835388 3.6151854632183684 1.4594844615725966 -0.38239517166033621 3.7168553626522294 1.526956387723867 -0.37537906757231837 3.8185252620860903 1.5944283138751376 -0.4757792624612045 3.613196322832787 1.4638392248599519 -0.46876315837318688 3.714866222266648 1.5313111510112223 -0.56214724917405512 3.6112071824472052 1.4681939881473072 -0.0019219866438964055 4.2331526622009177 1.8468963302000023 -0.19658342384474126 4.1258572851821436 1.7880144916506229 -0.28848258488411471 4.0223623014739704 1.7249092245682263 -0.29934570000621286 4.1220568918715434 1.7922379201836403 -0.38038174592348806 3.9188673177657969 1.6618039574858297 -0.39124486104558615 4.0185619081633703 1.7291326531012436 -0.40210797616768434 4.1182564985609433 1.7964613487166576 -0.47228090696286151 3.8153723340576233 1.598698690403433 -0.48314402208495949 3.9150669244551968 1.666027386018847 -0.49400713720705763 4.0147615148527702 1.733356081634261 -0.50487025232915572 4.1144561052503432 1.800684777249675 -0.56418006800223486 3.7118773503494498 1.5355934233210367 -0.57504318312433289 3.8115719407470232 1.6029221189364504 -0.58590629824643092 3.9112665311445967 1.6702508145518644 -0.59676941336852907 4.0109611215421701 1.7375795101672784 -0.60763252849062721 4.1106557119397431 1.8049082057826922 -0.65607922904160842 3.6083823666412762 1.47248815623864 -0.66694234416370657 3.7080769570388497 1.5398168518540538 -0.67780545928580449 3.8077715474364231 1.6071455474694678 -0.68866857440790263 3.9074661378339961 1.6744742430848818 -0.69953168953000078 4.00716072823157 1.7418029387002956 -0.71039480465209892 4.106855318629143 1.8091316343157096 -0.81315708081357041 4.103054925318542 1.8133550628487267 0.68661623109915915 3.5873850000783567 1.4604678000267872 0.70148186621298314 3.6881382159895022 1.5287672518431761 0.7163475013268068 3.7888914319006473 1.5970667036595649 0.73121313644063068 3.8896446478117928 1.6653661554759538 0.74607877155445446 3.9903978637229383 1.7336656072923426 0.76094440666827801 4.0911510796340833 1.8019650591087313 0.58350863235129391 3.6086272792364791 1.4678759413938973 0.59837426746511801 3.7093804951476246 1.5361753932102862 0.61323990257894156 3.8101337110587696 1.604474845026675 0.62810553769276534 3.9108869269699151 1.6727742968430639 0.642971172806589 4.0116401428810597 1.7410737486594527 0.48040103360342845 3.6298695583946015 1.4752840827610076 0.49526666871725256 3.730622774305747 1.5435835345773963 0.51013230383107611 3.831375990216892 1.6118829863937851 0.52499793894489977 3.9321292061280371 1.680182438210174 0.36242779974173966 3.5503586216415783 1.4143927723117289 0.37729343485556321 3.6511118375527238 1.4826922241281177 0.39215906996938732 3.7518650534638689 1.5509916759445066 0.40702470508321092 3.8526182693750139 1.6192911277608955 0.25932020099387443 3.5716009007997007 1.421800913678839 0.27418583610769809 3.6723541167108458 1.4901003654952278 0.28905147122152203 3.7731073326219913 1.5583998173116167 0.15621260224600925 3.5928431799578227 1.4292090550459493 0.17107823735983294 3.6935963958689682 1.4975085068623382 0.053105003498143802 3.614085459115945 1.4366171964130594 0.65288891599134624 4.1116534106176719 1.8085531628781633 0.53481466169330183 4.0321273664434383 1.747645109832819 0.54368577936618978 4.1319841132519395 1.8149510618412132 0.41674040739525742 3.952601322269206 1.6867370567874744 0.42561152506814542 4.0524580690777059 1.7540430087958687 0.43448264274103332 4.1523148158862071 1.8213489608042632 0.29866615309721306 3.8730752780949738 1.6258290037421301 0.3075372707701009 3.9729320249034741 1.6931349557505244 0.31640838844298891 4.0727887717119744 1.7604409077589187 0.3252795061158768 4.1726455185204747 1.8277468597673132 0.18059189879916857 3.7935492339207411 1.5649209506967858 0.18946301647205652 3.8934059807292418 1.6322269027051801 0.19833413414494439 3.9932627275377421 1.6995328547135744 0.20720525181783236 4.093119474346242 1.7668388067219687 0.21607636949072026 4.1929762211547423 1.834144758730363 0.06251764450112425 3.7140231897465084 1.5040128976514413 0.071388762174012077 3.8138799365550091 1.5713188496598358 0.080259879846900029 3.9137366833635099 1.6386248016682301 0.089130997519787938 4.0135934301720102 1.7059307536766242 0.09800211519267589 4.1134501769805105 1.7732367056850185 0.10687323286556381 4.2133069237890108 1.840542657693413 1.4866281888249859 3.807642387531732 1.7544259607004602 1.4650990019858663 3.7063122626441545 1.6851252137946946 1.4435698151467466 3.6049821377565765 1.6158244668889286 1.4220406283076272 3.5036520128689994 1.546523719983163 1.4005114414685078 3.4023218879814214 1.4772229730773971 1.2808509796945275 3.3425979701565609 1.4155284155035659 1.302380166533647 3.4439280950441384 1.4848291624093317 1.3239093533727664 3.5452582199317164 1.5541299093150975 1.3454385402118858 3.6465883448192935 1.6234306562208634 1.3669677270510057 3.7479184697068715 1.6927314031266292 1.1827197047596667 3.3842041772192779 1.4231346048355005 1.2042488915987861 3.4855343021068554 1.4924353517412665 1.2257780784379055 3.586864426994433 1.5617360986470323 1.2473072652770252 3.6881945518820105 1.6310368455527979 1.0845884298248059 3.4258103842819949 1.4307407941674353 1.1061176166639253 3.5271405091695724 1.5000415410732011 1.1276468035030447 3.62847063405715 1.5693422879789669 0.98645715488994468 3.4674165913447119 1.4383469834993701 1.0079863417290642 3.5687467162322895 1.5076477304051359 0.88832587995508372 3.5090227984074285 1.4459531728313046 0.79019460502022276 3.5506290054701455 1.4535593621632392 1.5048799316928272 3.9091791549798978 1.8232207001062166 1.385828614391486 3.8494168306484124 1.7616201888912082 1.4006396324753398 3.9511705354983682 1.8298837117265445 1.2667772970901445 3.7896545063169271 1.7000196776762 1.2815883151739986 3.8914082111668828 1.7682832005115363 1.2963993332578525 3.9931619160168386 1.8365467233468724 1.1477259797888031 3.7298921819854423 1.6384191664611918 1.1625369978726572 3.8316458868353975 1.7066826892965279 1.1773480159565115 3.9333995916853532 1.7749462121318642 1.1921590340403654 4.0351532965353094 1.8432097349672005 1.0286746624874614 3.6701298576539569 1.5768186552461836 1.0434856805713157 3.7718835625039127 1.6450821780815197 1.0582966986551696 3.8736372673538684 1.713345700916856 1.0731077167390239 3.9753909722038241 1.7816092237521923 0.90962334518612009 3.6103675333224716 1.5152181440311754 0.9244343632699743 3.7121212381724273 1.5834816668665115 0.93924538135382851 3.8138749430223831 1.6517451897018476 0.9540563994376825 3.9156286478723388 1.7200087125371839 0.9688674175215366 4.0173823527222945 1.7882722353725202 0.80538304596863297 3.6523589138409425 1.5218811556515033 0.82019406405248707 3.7541126186908982 1.5901446784868394 0.83500508213634128 3.8558663235408535 1.6584082013221755 0.84981610022019538 3.9576200283908096 1.726671724157512 0.86462711830404937 4.0593737332407649 1.7949352469928483 2.2244582262627244 3.4812943502495175 1.7836980963613793 2.1815752425130142 3.3881696847570422 1.7149834619273918 2.1386922587633039 3.2950450192645668 1.6462688274934043 2.0958092750135937 3.2019203537720915 1.5775541930594166 2.052926291263883 3.1087956882796162 1.5088395586254291 2.0100433075141728 3.0156710227871408 1.4401249241914416 1.9360425373839707 3.0629980304055908 1.4447274329407265 1.9789255211336809 3.1561226958980662 1.513442067374714 2.0218085048833916 3.2492473613905415 1.5821567018087015 2.0646914886331018 3.3423720268830168 1.6508713362426892 2.107574472382812 3.4354966923754922 1.7195859706766767 1.8620417672537686 3.1103250380240413 1.4493299416900114 1.9049247510034788 3.2034497035165161 1.5180445761239989 1.9478077347531895 3.2965743690089915 1.5867592105579864 1.9906907185028997 3.3896990345014668 1.6554738449919741 1.7880409971235665 3.1576520456424912 1.4539324504392963 1.8309239808732767 3.2507767111349661 1.5226470848732838 1.8738069646229873 3.3439013766274419 1.5913617193072713 1.7140402269933643 3.2049790532609417 1.4585349591885812 1.7569232107430746 3.2981037187534166 1.5272495936225687 1.799806194492785 3.3912283842458919 1.5959642280565562 1.6400394568631622 3.2523060608793921 1.4631374679378661 1.6829224406128724 3.345430726371867 1.5318521023718537 1.5660386867329603 3.2996330684978421 1.4677399766871511 2.1386019275962598 3.535021401993665 1.7883379876619616 2.0266373297746636 3.4865682053355087 1.7242103510193858 2.0498239564247087 3.5903256784812054 1.7929870915060389 1.9146727319530674 3.4381150086773529 1.66008271437681 1.9378593586031125 3.5418724818230491 1.728859454863463 1.9610459852531577 3.6456299549687459 1.7976361953501161 1.8258947607815164 3.4934192851648933 1.6647318182208872 1.8490813874315615 3.5971767583105896 1.7335085587075403 1.8722680140816066 3.7009342314562863 1.8022852991941933 1.7139301629599202 3.444966088506737 1.6006041815783114 1.7371167896099653 3.5487235616524337 1.6693809220649647 1.7603034162600104 3.65248103479813 1.7381576625516175 1.7834900429100555 3.7562385079438267 1.8069344030382708 1.601965565138324 3.3965128918485812 1.5364765449357356 1.6251521917883691 3.5002703649942775 1.6052532854223887 1.6483388184384142 3.6040278381399737 1.6740300259090419 1.6715254450884593 3.7077853112856705 1.742806766395695 1.6947120717385047 3.8115427844313667 1.811583506882348 1.4900009673167278 3.3480596951904253 1.47234890829316 1.5131875939667729 3.4518171683361216 1.5411256487798131 1.5363742206168181 3.5555746414818179 1.6099023892664661 1.5595608472668632 3.6593321146275142 1.6786791297531194 1.5827474739169085 3.7630895877732105 1.7474558702397722 1.6059341005669536 3.8668470609189072 1.8162326107264255 2.8744477646777455 2.9208053718752494 1.7585292754048221 2.8135220390423847 2.8393822498838506 1.6903193583891427 2.7525963134070235 2.7579591278924522 1.6221094413734636 2.5083496939700187 2.5689535446720373 1.4199798126885199 2.56927541960538 2.6503766666634361 1.488189729704199 2.6302011452407408 2.731799788654834 1.5563996467198782 2.6911268708761025 2.8132229106462328 1.6246095637355573 2.7520525965114633 2.8946460326376311 1.6928194807512364 2.8129783221468245 2.9760691546290299 1.761029397766916 2.4468802514390973 2.6242173274258178 1.4224799350506137 2.5078059770744585 2.7056404494172166 1.4906898520662928 2.5687317027098193 2.7870635714086145 1.5588997690819719 2.629657428345181 2.8684866934000133 1.6271096860976513 2.6905831539805423 2.9499098153914116 1.6953196031133304 2.3854108089081763 2.6794811101795983 1.4249800574127074 2.4463365345435371 2.7609042321709971 1.4931899744283867 2.5072622601788983 2.842327354162395 1.5613998914440659 2.56818798581426 2.9237504761537938 1.629609808459745 2.3239413663772548 2.7347448929333789 1.4274801797748011 2.3848670920126156 2.8161680149247776 1.4956900967904805 2.4457928176479768 2.8975911369161755 1.5639000138061596 2.5067185432833385 2.9790142589075743 1.632109930821839 2.2624719238463333 2.7900086756871594 1.4299803021368949 2.3233976494816941 2.8714317976785577 1.4981902191525744 2.3843233751170554 2.9528549196699561 1.5664001361682536 2.2010024813154119 2.8452724584409399 1.4324804244989888 2.2619282069507731 2.9266955804323382 1.5006903415146682 2.1395330387844909 2.90053624119472 1.4349805468610826 2.2004587644198521 2.9819593631861183 1.5031904638767621 2.0780635962535694 2.9558000239485005 1.4374806692231765 2.9334384297486387 3.0038449069932853 1.8267539062845486 2.8594261642402046 3.0695860794878422 1.8293494020915106 2.7425330199202476 3.0388307375557471 1.7635977710053368 2.78541389873177 3.1353272519823991 1.8319448978984727 2.6256398756002906 3.0080753956236519 1.6978461399191627 2.668520754411813 3.104571910050304 1.7661932668122988 2.7114016332233359 3.2010684244769561 1.8345403937054348 2.551627610091856 3.0738165681182088 1.7004416357261247 2.5945084889033789 3.1703130825448609 1.7687887626192609 2.6373893677149018 3.2668095969715125 1.8371358895123968 2.434734465771899 3.0430612261861141 1.6346900046399506 2.4776153445834219 3.1395577406127657 1.7030371315330868 2.5204962233949448 3.2360542550394178 1.7713842584262229 2.5633771022064673 3.3325507694660694 1.8397313853193589 2.317841321451942 3.0123058842540189 1.5689383735537763 2.3607222002634649 3.108802398680671 1.6372855004469127 2.4036030790749878 3.2052989131073226 1.7056326273400488 2.4464839578865103 3.3017954275339747 1.773979754233185 2.4893648366980328 3.3982919419606263 1.8423268811263209 2.2438290559435079 3.0780470567485754 1.5715338693607384 2.2867099347550308 3.1745435711752275 1.6398809962538747 2.3295908135665533 3.2710400856018795 1.7082281231470109 2.3724716923780762 3.3675366000285312 1.776575250040147 2.4153525711895987 3.4640331144551828 1.844922376933283 2.1269359116235509 3.0472917148164806 1.5057822382745643 2.1698167904350738 3.1437882292431323 1.5741293651677004 2.2126976692465963 3.2402847436697844 1.6424764920608368 2.2555785480581192 3.3367812580964364 1.7108236189539729 2.2984594268696417 3.4332777725230881 1.7791707458471091 3.4702584477515677 2.3380945166211462 1.8152461535639173 3.3946046295490397 2.270935143264567 1.747375398734109 3.0418636734855813 2.0660141846638886 1.4770160973880773 3.1175174916881088 2.1331735580204678 1.5448868522178854 3.1931713098906367 2.2003329313770466 1.6127576070476937 3.2688251280931642 2.2674923047336257 1.6806283618775015 3.3444789462956921 2.3346516780902049 1.7484991167073098 2.9917379902322332 2.1297307194895261 1.4781398153612779 3.0673918084347607 2.1968900928461053 1.546010570191086 3.1430456266372886 2.2640494662026844 1.6138813250208943 3.2186994448398161 2.3312088395592632 1.6817520798507024 2.9416123069788851 2.193447254315164 1.4792635333344786 3.0172661251814126 2.2606066276717431 1.5471342881642867 3.0929199433839405 2.3277660010283219 1.615005042994095 3.168573761586468 2.3949253743849011 1.6828757978239031 2.891486623725537 2.2571637891408018 1.4803872513076792 2.9671404419280645 2.3243231624973806 1.5482580061374875 3.0427942601305924 2.3914825358539598 1.6161287609672956 2.8413609404721889 2.3208803239664393 1.4815109692808801 2.9170147586747164 2.388039697323018 1.5493817241106882 2.7155814390163129 2.3174374854354975 1.4147639324242729 2.7912352572188404 2.3845968587920772 1.4826346872540808 2.8668890754213678 2.4517562321486559 1.5505054420838891 2.6654557557629648 2.381154020261135 1.4158876503974736 2.7411095739654923 2.4483133936177146 1.4837584052272816 2.6153300725096167 2.4448705550867729 1.4170113683706744 2.5652043892562681 2.5085870899124103 1.4181350863438751 3.4147180958067476 2.4085061381902295 1.8164113127887724 3.2937005074763364 2.3991753269584009 1.7496278305554609 3.3549196456610804 2.4841827793646081 1.8176090614349139 3.2339020573306687 2.4748519681327794 1.7508255792016023 3.2951211955154132 2.5598594205389866 1.8188068100810553 3.1128844690002575 2.4655211569009507 1.6840420969682905 3.1741036071850015 2.550528609307158 1.7520233278477437 3.2353227453697455 2.6355360617133652 1.8200045587271969 2.9918668806698463 2.4561903456691225 1.6172586147349788 3.0530860188545903 2.5411977980753293 1.6852398456144322 3.1143051570393343 2.6262052504815365 1.7532210764938851 3.1755242952240783 2.7112127028877437 1.8212023073733383 2.9320684305241791 2.5318669868435011 1.6184563633811204 2.9932875687089227 2.6168744392497079 1.6864375942605736 3.0545067068936667 2.7018818916559151 1.7544188251400268 3.1157258450784111 2.7868893440621223 1.82240005601948 2.811050842193767 2.5225361756116724 1.5516728811478087 2.8722699803785119 2.6075436280178796 1.6196541120272621 2.9334891185632554 2.6925510804240864 1.6876353429067152 2.9947082567479995 2.7775585328302936 1.7556165737861682 3.0559273949327439 2.8625659852365009 1.8235978046656214 2.6900332538633558 2.5132053643798438 1.4848893989144969 2.7512523920480998 2.5982128167860505 1.5528706297939503 2.8124715302328442 2.6832202691922582 1.6208518606734035 2.8736906684175882 2.768227721598465 1.6888330915528567 2.9349098066023318 2.8532351740046722 1.7568143224323098 2.9961289447870763 2.9382426264108794 1.824795553311763 2.6302348037176886 2.5888820055542223 1.4860871475606388 2.6914539419024326 2.6738894579604291 1.5540683784400919 3.7416042688065394 1.6147602907252789 1.7448658176225242 3.654472109892942 1.5640644972870057 1.6772267752725207 3.5673399509793451 1.5133687038487325 1.6095877329225172 3.4802077920657477 1.4626729104104592 1.5419486905725139 3.3930756331521503 1.4119771169721862 1.4743096482225104 3.3554889448230583 1.4831151739418189 1.4745686440824393 3.4426211037366556 1.5338109673800919 1.5422076864324425 3.529753262650253 1.5845067608183652 1.6098467287824461 3.61688542156385 1.6352025542566384 1.6774857711324496 3.7040175804774478 1.6858983476949116 1.7451248134824529 3.3179022564939662 1.5542532309114514 1.4748276399423681 3.4050344154075636 1.6049490243497244 1.5424666822923714 3.492166574321161 1.6556448177879979 1.6101057246423749 3.5792987332347583 1.7063406112262711 1.6777447669923782 3.2803155681648741 1.6253912878810841 1.4750866358022967 3.3674477270784715 1.6760870813193571 1.5427256781523 3.4545798859920689 1.7267828747576304 1.6103647205023037 3.2427288798357821 1.6965293448507168 1.4753456316622255 3.3298610387493794 1.7472251382889898 1.5429846740122288 3.4169931976629773 1.7979209317272631 1.6106237163622323 3.2051421915066904 1.7676674018203495 1.4756046275221542 3.2922743504202878 1.8183631952586226 1.5432436698721574 3.1675555031775984 1.838805458789982 1.475863623382083 3.1299688148485068 1.9099435157596147 1.4761226192420116 3.8273128113052968 1.6681599377264709 1.8125176638990588 3.7828211422151243 1.7524125223442184 1.8128387627703346 3.6617130329258951 1.7659969647810354 1.7454262415047532 3.7383294731249519 1.8366651069619659 1.8131598616416105 3.5406049236366655 1.7795814072178522 1.6780137202391716 3.6172213638357227 1.8502495493987827 1.7457473403760291 3.6938378040347795 1.9209176915797135 1.8134809605128863 3.496113254546493 1.8638339918355997 1.6783348191104475 3.5727296947455502 1.9345021340165303 1.7460684392473049 3.649346134944607 2.005170276197461 1.8138020593841622 3.3750051452572638 1.8774184342724165 1.6109222978448661 3.4516215854563206 1.9480865764533473 1.6786559179817233 3.5282380256553778 2.0187547186342778 1.7463895381185808 3.6048544658544346 2.0894228608152083 1.814123158255438 3.2538970359680346 1.8910028767092333 1.5435097765792845 3.3305134761670914 1.961671018890164 1.6112433967161417 3.4071299163661481 2.0323391610710946 1.6789770168529992 3.4837463565652054 2.1030073032520251 1.7467106369898566 3.5603627967642621 2.1736754454329557 1.8144442571267139 3.2094053668778622 1.9752554613269808 1.5438308754505601 3.2860218070769189 2.0459236035079114 1.6115644955874175 3.3626382472759762 2.1165917456888419 1.6792981157242748 3.4392546874750329 2.1872598878697724 1.7470317358611323 3.5158711276740902 2.257928030050703 1.8147653559979897 3.0882972575886329 1.9888399037637976 1.4764183541849787 3.1649136977876897 2.0595080459447286 1.5441519743218359 3.2415301379867469 2.1301761881256591 1.6118855944586932 3.3181465781858037 2.2008443303065897 1.6796192145955506 3.9928189374084773 0.83627253751932884 1.7466474077406078 3.8976794959666532 0.80374468741869465 1.6791805353834925 3.8025400545248291 0.77121683731806046 1.6117136630263773 3.7074006130830046 0.73868898721742604 1.5442467906692618 3.5885828073487676 0.78274592035214252 1.4764929618048535 3.6837222487905916 0.81527377045277682 1.5439598341619687 3.7788616902324161 0.84780162055341113 1.6114267065190842 3.8740011316742402 0.88032947065404532 1.6788935788761994 3.9691405731160643 0.91285732075467951 1.7463604512333146 3.5649044430563546 0.85933070358749331 1.4762060052975603 3.6600438844981786 0.89185855368812761 1.5436728776546755 3.7551833259400031 0.92438640378876191 1.611139750011791 3.8503227673818272 0.95691425388939599 1.6786066223689062 3.5412260787639416 0.93591548682284409 1.4759190487902671 3.6363655202057656 0.96844333692347839 1.5433859211473824 3.7315049616475902 1.0009711870241127 1.6108527935044978 3.8266444030894142 1.0334990371247468 1.6783196658616131 3.5175477144715286 1.0125002700581949 1.475632092282974 3.6126871559133527 1.0450281201588292 1.5430989646400892 3.7078265973551772 1.0775559702594635 1.6105658369972047 3.4938693501791156 1.0890850532935457 1.4753451357756808 3.5890087916209397 1.12161290339418 1.5428120081327963 3.4701909858867026 1.1656698365288964 1.4750581792683879 3.5653304273285267 1.1981976866295307 1.5425250516255031 3.4465126215942896 1.2422546197642472 1.4747712227610947 4.0879428921764287 0.86885256550569501 1.8141144993927416 4.0601393604387068 0.95933591194161438 1.8138859562464174 3.9435558457821944 0.99586504501392792 1.7461004892841709 4.0323358287009849 1.0498192583775339 1.8136574131000931 3.9157523140444725 1.0863483914498473 1.7458719461378467 4.0045322969632631 1.1403026048134532 1.8134288699537688 3.7991687993879597 1.1228775245221607 1.6780864791756003 3.8879487823067507 1.1768317378857667 1.7456434029915224 3.9767287652255416 1.2307859512493726 1.8132003268074446 3.6825852847314469 1.1594066575944741 1.6103010122133539 3.7713652676502378 1.2133608709580801 1.677857936029276 3.8601452505690288 1.267315084321686 1.7454148598451982 3.9489252334878198 1.321269297685292 1.8129717836611201 3.654781752993725 1.2498900040303935 1.6100724690670296 3.743561735912516 1.3038442173939995 1.6776293928829518 3.8323417188313069 1.3577984307576054 1.7451863166988737 3.9211217017500983 1.4117526441212114 1.8127432405147959 3.5381982383372121 1.2864191371027067 1.5422870021047834 3.6269782212560031 1.3403733504663129 1.6098439259207054 3.7157582041747941 1.3943275638299188 1.6774008497366273 3.804538187093585 1.4482817771935248 1.7449577735525494 3.8933181700123765 1.5022359905571308 1.8125146973684714 3.4216147236806993 1.3229482701750204 1.474501535142537 3.5103947065994903 1.3769024835386261 1.5420584589584589 3.5991746895182812 1.4308566969022323 1.6096153827743811 3.6879546724370726 1.4848109102658382 1.677172306590303 3.7767346553558636 1.5387651236294442 1.744729230406225 3.865514638274655 1.5927193369930501 1.8122861542221471 4.1880006094036641 0.038592771312370357 1.8191399919649662 4.0885515590290513 0.025298050834198862 1.751815337359671 3.9891025086544385 0.012003330356027322 1.6844906827543753 3.5825201320057327 0.03830681803198218 1.4145520527475026 3.6819691823803455 0.051601538510153699 1.4818767073527981 3.7814182327549579 0.064896258988325128 1.5492013619580935 3.8808672831295707 0.078190979466496668 1.6165260165633892 3.9803163335041831 0.091485699944668153 1.6838506711686845 4.0797653838787955 0.10478042042283975 1.7511753257739802 3.6731830072300902 0.1310839080987945 1.4812366957671073 3.7726320576047025 0.14437862857696593 1.5485613503724027 3.8720811079793154 0.15767334905513744 1.6158860049776984 3.9715301583539278 0.17096806953330895 1.6832106595829937 3.6643968320798348 0.2105662776874353 1.4805966841814164 3.7638458824544472 0.22386099816560673 1.5479213387867119 3.86329493282906 0.23715571864377821 1.6152459933920076 3.9627439832036724 0.25045043912194975 1.682570647997303 3.6556106569295794 0.2900486472760761 1.4799566725957256 3.7550597073041918 0.30334336775424753 1.5472813272010213 3.8545087576788042 0.31663808823241896 1.6146059818063168 3.6468244817793241 0.36953101686471701 1.479316661010035 3.7462735321539364 0.38282573734288849 1.5466413156153305 3.6380383066290682 0.44901338645335775 1.4786766494243442 3.7374873570036806 0.46230810693152929 1.5460013040296399 3.6292521314788129 0.5284957560419985 1.4780366378386536 4.1780305724374047 0.1309179251643231 1.8185541309318962 4.0705216887907163 0.18922606340893811 1.7505562414258546 4.1679338049837824 0.22461787824266566 1.8179740666276605 4.060424921337094 0.28292601648728055 1.7499761771216189 4.1578370375301601 0.31831783132100816 1.8173940023234247 3.9529160376904056 0.34123415473189578 1.6819782876155775 4.0503281538834717 0.37662596956562311 1.7493961128173832 4.1477402700765378 0.41201778439935066 1.816813938019189 3.8454071540437171 0.39954229297651089 1.613980398109536 3.9428192702367832 0.43493410781023834 1.6813982233113418 4.0402313864298494 0.47032592264396567 1.7488160485131474 4.1376435026229155 0.50571773747769322 1.8162338737149533 3.8353103865900948 0.49324224605485345 1.6134003338053002 3.9327225027831609 0.52863406088858089 1.6808181590071061 4.030134618976227 0.56402587572230822 1.7482359842089117 4.1275467351692932 0.59941769055603578 1.8156538094107175 3.7278015029434064 0.55155038429946845 1.5454024442992587 3.8252136191364725 0.58694219913319601 1.6128202695010645 3.9226257353295386 0.62233401396692345 1.6802380947028703 4.0200378515226047 0.65772582880065078 1.7476559199046759 4.1174499677156708 0.69311764363437833 1.8150737451064818 3.6202926192967175 0.60985852254408368 1.4774045547932171 3.7177047354897841 0.64525033737781101 1.5448223799950229 3.8151168516828502 0.68064215221153856 1.6122402051968288 3.9125289678759163 0.7160339670452659 1.6796580303986346 4.0099410840689824 0.75142578187899334 1.7470758556004402 4.1073532002620485 0.78681759671272078 1.814493680802246 3.6101958518430957 0.70355847562242613 1.4768244904889816 4.1243234379172318 -0.79462160579624286 1.8263464117646317 4.0243751753508636 -0.78837370604304446 1.759151944464179 3.5311584176297997 -0.67760668523105161 1.4223054818736107 3.6311066801961673 -0.68385458498424989 1.4894999491740635 3.7310549427625346 -0.6901024847374484 1.5566944164745158 3.8310032053289023 -0.6963503844906469 1.6238888837749685 3.9309514678952704 -0.70259828424384529 1.6910833510754208 4.0308997304616376 -0.70884618399704369 1.7582778183758734 3.5376829727405736 -0.59807916318505061 1.4214313557853051 3.6376312353069413 -0.60432706293824878 1.4886258230857579 3.7375794978733086 -0.6105749626914474 1.5558202903862102 3.8375277604396767 -0.6168228624446459 1.6230147576866629 3.9374760230060444 -0.6230707621978443 1.6902092249871152 3.5442075278513476 -0.51855164113904983 1.4205572296969995 3.6441557904177153 -0.52479954089224801 1.4877516969974522 3.7441040529840826 -0.53104744064544662 1.5549461642979046 3.8440523155504507 -0.53729534039864502 1.6221406315983573 3.9440005781168184 -0.54354324015184352 1.6893350988988096 3.5507320829621216 -0.439024119093049 1.4196831036086939 3.6506803455284893 -0.44527201884624718 1.4868775709091466 3.7506286080948565 -0.45151991859944574 1.5540720382095989 3.8505768706612251 -0.45776781835264413 1.6212665055100517 3.5572566380728956 -0.35949659704704823 1.4188089775203883 3.6572049006392633 -0.36574449680024634 1.486003444820841 3.757153163205631 -0.3719923965534449 1.5531979121212933 3.5637811931836696 -0.27996907500104717 1.4179348514320826 3.6637294557500373 -0.28621697475424535 1.4851293187325354 3.763677718316405 -0.29246487450744391 1.5523237860329877 3.5703057482944436 -0.20044155295504654 1.417060725343777 3.6702540108608113 -0.20668945270824471 1.4842551926442296 3.5768303034052176 -0.1209140309090455 1.4161865992554714 3.5833548585159916 -0.041386508863044867 1.4153124731671658 4.1321478218267789 -0.70276873177090082 1.8255296739261908 4.0378913801893326 -0.62488953592564644 1.7574243148054038 4.14014826596686 -0.60924640380443551 1.8247207092564244 4.0458918243294137 -0.53136720795918113 1.7566153501356376 4.1481487101069412 -0.5157240758379702 1.8239117445866582 3.9516353826919683 -0.45348801211392697 1.6885099910148507 4.0538922684694949 -0.43784487999271582 1.7558063854658712 4.1561491542470224 -0.42220174787150488 1.8231027799168917 3.8573789410545225 -0.37560881626867265 1.6204046318940637 3.9596358268320495 -0.35996568414746166 1.6877010263450845 4.0618927126095761 -0.34432255202625051 1.754997420796105 4.1641495983871035 -0.32867941990503952 1.8222938152471255 3.8653793851946037 -0.28208648830220739 1.6195956672242975 3.9676362709721307 -0.2664433561809964 1.686892061675318 4.0698931567496572 -0.25080022405978525 1.7541884561263386 4.1721500425271847 -0.23515709193857423 1.8214848505773591 3.7711229435571578 -0.20420729245695318 1.5514903081035105 3.8733798293346848 -0.18856416033574203 1.6187867025545311 3.9756367151122118 -0.17292102821453101 1.6860830970055518 4.0778936008897384 -0.15727789609331988 1.7533794914565723 4.1801504866672659 -0.14163476397210881 1.8206758859075929 3.676866501919712 -0.12632809661169897 1.4833849489827233 3.779123387697239 -0.11068496449048792 1.5506813434337441 3.881380273474766 -0.095041832369276796 1.6179777378847648 3.9836371592522926 -0.079398700248065709 1.6852741323357854 4.0858940450298196 -0.063755568126854595 1.7525705267868059 4.1881509308073461 -0.048112436005643501 1.8198669212378265 3.6848669460597931 -0.032805768645233657 1.4825759843129571 3.7871238318373197 -0.017162636524022657 1.5498723787639777 3.8893807176148467 -0.0015195044028115468 1.6171687732149984 3.8989945774114871 -1.5986762822621412 1.834958057231141 3.8022720864459849 -1.5734328224200738 1.7678938055641678 3.340301365665213 -1.3705728756360833 1.4315396891657417 3.4370238566307161 -1.3958163354781508 1.498603940832715 3.5337463475962183 -1.4210597953202182 1.5656681924996885 3.630468838561721 -1.4463032551622859 1.6327324441666617 3.7271913295272232 -1.4715467150043531 1.699796695833635 3.8239138204927254 -1.4967901748464205 1.7668609475006083 3.3619430997119539 -1.2939302280624299 1.4305068311021822 3.458665590677457 -1.3191736879044973 1.4975710827691555 3.5553880816429593 -1.3444171477465647 1.564635334436129 3.6521105726084619 -1.3696606075886324 1.6316995861031023 3.7488330635739642 -1.3949040674306996 1.6987638377700756 3.3835848337586949 -1.2172875804887766 1.4294739730386228 3.480307324724198 -1.242531040330844 1.4965382247055961 3.5770298156897002 -1.2677745001729115 1.5636024763725693 3.6737523066552029 -1.2930179600149789 1.6306667280395426 3.7704747976207051 -1.3182614198570461 1.6977309797065159 3.4052265678054359 -1.1406449329151234 1.4284411149750633 3.501949058770939 -1.1658883927571906 1.4955053666420366 3.5986715497364412 -1.1911318525992582 1.5625696183090099 3.6953940407019439 -1.2163753124413257 1.6296338699759831 3.4268683018521768 -1.0640022853414699 1.4274082569115036 3.5235907928176795 -1.0892457451835373 1.4944725085784769 3.6203132837831822 -1.1144892050256048 1.5615367602454502 3.4485100358989178 -0.98735963776781643 1.4263753988479442 3.5452325268644205 -1.0126030976098839 1.4934396505149174 3.6419550178299227 -1.0378465574519513 1.5605039021818907 3.4701517699456588 -0.91071699019416308 1.4253425407843845 3.566874260911161 -0.93596045003623052 1.4924067924513578 3.4917935039923997 -0.83407434262050972 1.424309682720825 3.5134352380391407 -0.75743169504685637 1.4232768246572653 3.9244496738097703 -1.5098130862020389 1.8339934966904397 3.8470086543111157 -1.4154908294355142 1.7658541145313673 3.9501997400236659 -1.4200046107267044 1.833034219074849 3.8727587205250114 -1.3256823539601799 1.7648948369157766 3.9759498062375616 -1.33019613525137 1.8320749414592583 3.7953177010263568 -1.2313600971936551 1.6967554547567043 3.898508786738907 -1.2358738784848455 1.763935559300186 4.0016998724514572 -1.2403876597760357 1.8311156638436679 3.7178766815277027 -1.1370378404271306 1.628616072597632 3.8210677672402524 -1.1415516217183208 1.6957961771411136 3.9242588529528022 -1.1460654030095112 1.7629762816845953 4.0274499386653524 -1.1505791843007014 1.8301563862280772 3.7436267477415983 -1.0472293649517961 1.6276567949820413 3.8468178334541481 -1.0517431462429863 1.694836899525523 3.9500089191666978 -1.0562569275341767 1.7620170040690049 4.0532000048792476 -1.0607707088253668 1.8291971086124867 3.6661857282429438 -0.95290710818527136 1.559517412822969 3.7693768139554935 -0.95742088947646176 1.6266975173664506 3.8725678996680433 -0.96193467076765204 1.6938776219099323 3.975758985380593 -0.96644845205884233 1.7610577264534142 4.0789500710931428 -0.97096223335003262 1.8282378309968961 3.5887447087442892 -0.85858485141874663 1.4913780306638964 3.6919357944568389 -0.86309863270993703 1.5585581352073783 3.7951268801693887 -0.86761241400112743 1.62573823975086 3.8983179658819389 -0.87212619529231783 1.6929183442943416 4.0015090515944882 -0.87663997658350812 1.7600984488378237 4.1047001373070389 -0.88115375787469841 1.8272785533813056 3.6144947749581848 -0.7687763759434123 1.4904187530483057 3.7176858606707341 -0.77329015723460282 1.5575988575917876 3.8208769463832843 -0.7778039385257931 1.6247789621352695 3.9240680320958341 -0.7823177198169835 1.6919590666787512 3.4668392067841269 -2.2284699927109939 1.7764084692341173 3.3767031011776014 -2.1856505056318642 1.7094835541998299 3.2865669955710755 -2.1428310185527346 1.6425586391655427 3.196430889964549 -2.1000115314736045 1.5756337241312555 3.1062947843580231 -2.0571920443944749 1.508708809096968 3.0161586787514971 -2.0143725573153453 1.4417838940626808 3.0521551441884274 -1.9434146879572076 1.4406403055869119 3.1422912497949533 -1.9862341750363373 1.5075652206211991 3.2324273554014793 -2.0290536621154671 1.5744901356554863 3.3225634610080053 -2.0718731491945972 1.6414150506897738 3.4126995666145312 -2.1146926362737264 1.7083399657240608 3.0881516096253576 -1.87245681859907 1.4394967171111428 3.1782877152318836 -1.9152763056781994 1.50642163214543 3.2684238208384095 -1.9580957927573293 1.5733465471797174 3.3585599264449355 -2.0009152798364593 1.6402714622140047 3.4486960320514615 -2.0437347669155885 1.7071963772482919 3.1241480750622879 -1.8014989492409323 1.4383531286353739 3.2142841806688138 -1.8443184363200618 1.5052780436696611 3.3044202862753393 -1.8871379233991916 1.5722029587039483 3.3945563918818653 -1.9299574104783215 1.6391278737382358 3.1601445404992181 -1.7305410798827947 1.4372095401596048 3.2502806461057441 -1.7733605669619243 1.504134455193892 3.3404167517122696 -1.816180054041054 1.5710593702281794 3.1961410059361479 -1.6595832105246571 1.4360659516838359 3.2862771115426739 -1.7024026976037867 1.5029908667181231 3.3764132171491994 -1.7452221846829163 1.5699157817524103 3.2321374713730782 -1.5886253411665194 1.4349223632080668 3.3222735769796041 -1.6314448282456491 1.501847278242354 3.268133936810008 -1.517667471808382 1.4337787747322979 3.3041304022469382 -1.4467096024502444 1.4326351862565287 3.5212571897247225 -2.3417382560567779 1.8444806598593995 3.5636684965872023 -2.2590475457810189 1.8434220466801237 3.5057616760366792 -2.1521604186082444 1.7753036405694298 3.6060798034496822 -2.1763568355052598 1.8423634335008479 3.5481729828991591 -2.0694697083324853 1.774245027390154 3.648491110312162 -2.0936661252295008 1.8413048203215721 3.490266162348636 -1.9625825811597104 1.7061266212794601 3.5905842897616389 -1.9867789980567263 1.7731864142108782 3.6909024171746418 -2.0109754149537418 1.8402462071422963 3.4323593417981133 -1.8556954539869355 1.6380082151687663 3.5326774692111158 -1.8798918708839514 1.7050680081001843 3.6329955966241188 -1.9040882877809671 1.7721278010316024 3.7333137240371217 -1.9282847046779827 1.8391875939630205 3.4747706486605932 -1.7730047437111764 1.6369496019894905 3.5750887760735957 -1.7972011606081923 1.7040093949209085 3.6754069034865986 -1.8213975775052078 1.7710691878523266 3.7757250308996011 -1.8455939944022237 1.8381289807837449 3.4168638281100701 -1.6661176165384015 1.5688311958787966 3.517181955523073 -1.6903140334354174 1.6358909888102147 3.6175000829360755 -1.7145104503324333 1.7029507817416327 3.717818210349078 -1.7387068672294488 1.770010574673051 3.8181363377620805 -1.7629032841264647 1.8370703676044691 3.3589570075595474 -1.5592304893656266 1.5007127897681027 3.4592751349725499 -1.5834269062626423 1.5677725826995208 3.5595932623855528 -1.6076233231596582 1.6348323756309389 3.6599113897985553 -1.6318197400566741 1.7018921685623571 3.7602295172115578 -1.6560161569536895 1.7689519614937752 3.8605476446245603 -1.6802125738507054 1.8360117544251935 3.4013683144220273 -1.4765397790898676 1.4996541765888269 3.5016864418350298 -1.5007361959868832 1.566713969520245 3.6020045692480327 -1.5249326128838991 1.6337737624516633 3.7023226966610352 -1.5491290297809148 1.7008335553830813 2.9726968076086435 -2.8771780954367583 1.7866243125495691 2.8919693325613829 -2.8187780308122883 1.7198512196892752 2.8112418575141223 -2.7603779661878187 1.6530781268289814 2.7305143824668612 -2.7019779015633487 1.5863050339686873 2.6497869074196005 -2.6435778369388792 1.5195319411083936 2.618212363137379 -2.5224069353813943 1.4515330733848513 2.6989398381846392 -2.5808070000058643 1.5183061662451454 2.7796673132318999 -2.6392070646303338 1.585079259105439 2.8603947882791609 -2.6976071292548038 1.6518523519657331 2.9411222633264216 -2.7560071938792734 1.718625444826027 2.6673652939024177 -2.4596360984483794 1.450307298521603 2.7480927689496779 -2.5180361630728489 1.5170803913818971 2.8288202439969385 -2.5764362276973189 1.5838534842421907 2.9095477190441996 -2.6348362923217885 1.6506265771024848 2.9902751940914603 -2.6932363569462585 1.7173996699627787 2.7165182246674564 -2.3968652615153645 1.4490815236583547 2.7972456997147166 -2.4552653261398341 1.5158546165186488 2.8779731747619772 -2.5136653907643041 1.5826277093789425 2.9587006498092383 -2.5720654553887736 1.6494008022392366 2.7656711554324951 -2.3340944245823496 1.4478557487951065 2.8463986304797553 -2.3924944892068192 1.5146288416554006 2.9271261055270159 -2.4508945538312887 1.5814019345156944 2.8148240861975338 -2.2713235876493347 1.4466299739318582 2.895551561244794 -2.3297236522738043 1.5134030667921523 2.976279036292055 -2.3881237168982739 1.5801761596524462 2.8639770169625725 -2.2085527507163194 1.44540419906861 2.9447044920098331 -2.266952815340789 1.512177291928904 2.9131299477276111 -2.1457819137833045 1.4441784242053617 2.9622828784926503 -2.0830110768502896 1.4429526493421134 3.0268263734331233 -2.8084784106131178 1.7854561244226772 3.0843163843853674 -2.7357753042467396 1.7843268214190264 3.0477322847972999 -2.6205724696769455 1.7162699860251178 3.141806395337611 -2.6630721978803615 1.7831975184153757 3.0111481852092328 -2.5053696351071513 1.6482131506312092 3.1052222957495434 -2.5478693633105673 1.715140683021467 3.1992964062898546 -2.5903690915139834 1.7820682154117249 3.0686381961614764 -2.4326665287407732 1.6470838476275584 3.1627123067017875 -2.4751662569441892 1.7140113800178163 3.2567864172420982 -2.5176659851476053 1.7809389124080741 3.0320540965734093 -2.317463694170979 1.5790270122336494 3.1261282071137204 -2.359963422374395 1.6459545446239074 3.2202023176540315 -2.4024631505778111 1.7128820770141653 3.3142764281943422 -2.4449628787812272 1.7798096094044231 3.4083505387346533 -2.4874626069846437 1.846737141794681 2.9954699969853418 -2.2022608596011848 1.5109701768397408 3.0895441075256533 -2.2447605878046009 1.5778977092299986 3.1836182180659645 -2.2872603160080174 1.6448252416202567 3.2776923286062751 -2.3297600442114335 1.7117527740105145 3.3717664391465858 -2.3722597724148495 1.7786803064007723 3.4658405496868969 -2.4147595006182656 1.8456078387910302 3.0529600079375858 -2.1295577532348067 1.50984087383609 3.1470341184778969 -2.1720574814382227 1.5767684062263478 3.2411082290182081 -2.2145572096416393 1.6436959386166057 3.3351823395585192 -2.2570569378450553 1.7106234710068635 3.4292564500988298 -2.2995566660484714 1.7775510033971214 2.3546561030713846 -3.4223714678004238 1.7974466429162204 2.2860363874347405 -3.3503243669302827 1.7308257872867994 2.2174166717980959 -3.278277266060142 1.6642049316573788 2.1487969561614513 -3.2062301651900009 1.597584076027958 2.0723966765214517 -3.0097118765558482 1.4630476024443757 2.1410163921580958 -3.0817589774259893 1.5296684580737965 2.2096361077947404 -3.1538060782961304 1.596289313703217 2.278255823431385 -3.2258531791662715 1.6629101693326378 2.3468755390680291 -3.2979002800364121 1.7295310249620586 2.1332358281547403 -2.9572877896619776 1.4617528401196347 2.2018555437913849 -3.0293348905321187 1.5283736957490555 2.2704752594280295 -3.1013819914022598 1.594994551378476 2.3390949750646737 -3.1734290922724009 1.6616154070078968 2.1940749797880295 -2.904863702768107 1.4604580777948939 2.2626946954246741 -2.9769108036382477 1.5270789334243147 2.3313144110613186 -3.0489579045083888 1.5936997890537352 2.3999341266979628 -3.1210050053785299 1.660320644683156 2.2549141314213186 -2.8524396158742364 1.4591633154701529 2.3235338470579627 -2.9244867167443771 1.5257841710995736 2.3921535626946078 -2.9965338176145182 1.5924050267289942 2.3157532830546077 -2.8000155289803659 1.4578685531454121 2.3843729986912519 -2.8720626298505065 1.5244894087748329 2.4529927143278965 -2.9441097307206476 1.5911102644042534 2.3765924346878964 -2.7475914420864953 1.4565737908206711 2.4452121503245405 -2.819638542956636 1.5231946464500918 2.4374315863211855 -2.6951673551926243 1.4552790284959303 2.4982707379544742 -2.6427432682987537 1.4539842661711893 2.4224998469535195 -3.3643282929005549 1.7962190570168342 2.4085084473791216 -3.2448394410705474 1.7282438750342028 2.4936176417323224 -3.3036586724531203 1.7950228703806532 2.4796262421579245 -3.1841698206231128 1.7270476883980219 2.5647354365111252 -3.2429890520056857 1.7938266837444723 2.4656348425835266 -3.0646809687931054 1.6590725064153906 2.5507440369367274 -3.1235002001756782 1.725851501761841 2.6358532312899281 -3.182319431558251 1.7926304971082914 2.5367526373623295 -3.0040113483456707 1.6578763197792097 2.6218618317155302 -3.0628305797282436 1.7246553151256601 2.706971026068731 -3.1216498111108164 1.7914343104721104 2.5227612377879316 -2.8845224965156633 1.5899011377965784 2.6078704321411323 -2.9433417278982361 1.6566801331430288 2.6929796264943331 -3.0021609592808089 1.7234591284894791 2.7780888208475334 -3.0609801906633822 1.7902381238359295 2.5087698382135333 -2.7650336446856558 1.5219259558139473 2.593879032566734 -2.8238528760682287 1.5887049511603974 2.6789882269199352 -2.8826721074508015 1.6554839465068478 2.7640974212731355 -2.9414913388333748 1.7222629418532982 2.8492066156263363 -3.000310570215948 1.7890419371997486 2.5798876329923361 -2.7043640242382212 1.5207297691777664 2.6649968273455369 -2.763183255620794 1.5875087645242165 2.7501060216987376 -2.8220024870033673 1.6542877598706669 2.8352152160519384 -2.8808217183859401 1.7210667552171173 2.9203244104051387 -2.9396409497685134 1.7878457505635679 2.5658962334179383 -2.5848751724082137 1.4527545871951351 1.6232010622406639 -3.8454528795201521 1.8090294417280397 1.5700880358632443 -3.7615407787852124 1.7425320423063571 1.4284407573392086 -3.3857464453442172 1.4751805629979526 1.4815537837166279 -3.4696585460791565 1.5416779624196353 1.5346668100940473 -3.5535706468140962 1.6081753618413179 1.5877798364714668 -3.6374827475490354 1.6746727612630006 1.6408928628488864 -3.7213948482839752 1.7411701606846832 1.4992455843248507 -3.3456005148429799 1.4738186813762788 1.55235861070227 -3.4295126155779188 1.5403160807979615 1.6054716370796893 -3.5134247163128585 1.6068134802196441 1.6585846634571089 -3.5973368170477977 1.6733108796413267 1.7116976898345282 -3.6812489177827374 1.7398082790630094 1.5700504113104927 -3.3054545843417422 1.472456799754605 1.623163437687912 -3.389366685076681 1.5389541991762876 1.6762764640653314 -3.4732787858116208 1.6054515985979703 1.7293894904427509 -3.5571908865465605 1.6719489980196529 1.6408552382961348 -3.2653086538405045 1.4710949181329311 1.6939682646735541 -3.3492207545754438 1.5375923175546138 1.7470812910509734 -3.4331328553103835 1.6040897169762967 1.7116600652817768 -3.2251627233392668 1.4697330365112573 1.7647730916591962 -3.3090748240742061 1.5362304359329402 1.8178861180366155 -3.3929869248091458 1.6027278353546228 1.7824648922674189 -3.1850167928380295 1.4683711548895837 1.8355779186448382 -3.2689288935729688 1.5348685543112663 1.8532697192530609 -3.1448708623367918 1.4670092732679099 1.924074546238703 -3.1047249318355545 1.4656473916462363 1.701249091235959 -3.8015110635394032 1.8077123766137539 1.7849489181422604 -3.7546073561748532 1.8064302813708728 1.7951455078604406 -3.6344772786455408 1.7385246245431905 1.8686487450485618 -3.7077036488103032 1.8051481861279917 1.8053420975786212 -3.5143472011162284 1.6706189677155081 1.878845334766742 -3.5875735712809909 1.7372425293003093 1.9523485719548632 -3.6607999414457533 1.8038660908851105 1.8890419244849226 -3.4674434937516785 1.669336872472627 1.9625451616730434 -3.5406698639164409 1.7359604340574282 2.0360483988611646 -3.6138962340812033 1.8025839956422294 1.8992385142031027 -3.3473134162223661 1.6014312156449446 1.972741751391224 -3.4205397863871285 1.6680547772297458 2.0462449885793448 -3.4937661565518909 1.734678338814547 2.119748225767466 -3.5669925267166533 1.8013019003993482 1.9094351039212836 -3.2271833386930537 1.5335255588172623 1.9829383411094044 -3.3004097088578161 1.6001491204020635 2.0564415782975254 -3.3736360790225786 1.6667726819868647 2.1299448154856466 -3.4468624491873405 1.7333962435716659 2.2034480526737674 -3.5200888193521029 1.8000198051564671 1.993134930827585 -3.1802796313285038 1.5322434635743811 2.066638168015706 -3.2535060014932662 1.5988670251591823 2.1401414052038268 -3.3267323716580286 1.6654905867439835 2.213644642391948 -3.3999587418227906 1.7321141483287847 2.2871478795800688 -3.4731851119875525 1.7987377099135859 2.0033315205457654 -3.0601495537991918 1.4643378067466986 2.0768347577338861 -3.1333759239639538 1.5309613683315 0.83806852896424122 -4.0033363342314043 1.7537548844104329 0.80454690590156419 -3.9101061110864532 1.6873209996752359 0.77102528283888705 -3.8168758879415021 1.6208871149400383 0.74904585454164108 -3.511114909891246 1.4201516070451905 0.78256747760431822 -3.6043451330361971 1.486585491780388 0.81608910066699514 -3.6975753561811482 1.5530193765155851 0.84961072372967206 -3.7908055793260993 1.6194532612507824 0.8831323467923492 -3.8840358024710504 1.6858871459859799 0.91665396985502623 -3.9772660256160015 1.752321030721177 0.82763129543242608 -3.4850446012758431 1.4187177533559345 0.86115291849510323 -3.5782748244207943 1.485151638091132 0.89467454155778015 -3.6715050475657454 1.5515855228263291 0.92819616462045706 -3.7647352707106965 1.6180194075615264 0.96171778768313421 -3.8579654938556476 1.6844532922967237 0.90621673632321131 -3.4589742926604403 1.4172838996666786 0.93973835938588834 -3.5522045158053914 1.4837177844018761 0.97325998244856538 -3.6454347389503425 1.5501516691370731 1.0067816055112422 -3.7386649620952941 1.6165855538722702 0.98480217721399632 -3.4329039840450379 1.4158500459774226 1.0183238002766735 -3.526134207189989 1.4822839307126199 1.0518454233393504 -3.6193644303349402 1.5487178154478172 1.0853670464020273 -3.7125946534798913 1.6151517001830142 1.0633876181047812 -3.4068336754296356 1.4144161922881664 1.0969092411674584 -3.5000638985745867 1.4808500770233639 1.1304308642301353 -3.5932941217195378 1.547283961758561 1.1754946820582433 -3.4739935899591838 1.4794162233341077 1.2540801229490284 -3.447923281343781 1.4779823696448517 0.87384262380225097 -4.0958912728015973 1.8201939061127104 0.96854997965087275 -4.0649876603438058 1.818796819919196 1.0051263103824479 -3.9482316528600765 1.7509097250072228 1.0632573354994945 -4.0340840478860143 1.8173997337256815 1.0417026411140236 -3.8314756453763477 1.6830226300952495 1.0998336662310697 -3.917328040402285 1.7495126388137083 1.1579646913481163 -4.0031804354282228 1.8160026475321671 1.1364099969626453 -3.8005720329185562 1.6816255439017351 1.1945410220796915 -3.8864244279444935 1.7481155526201939 1.2526720471967381 -3.9722768229704308 1.8146055613386527 1.1729863276942205 -3.6838160254348273 1.6137384489897619 1.2311173528112671 -3.7696684204607647 1.6802284577082207 1.2892483779283133 -3.8555208154867016 1.7467184664266795 1.3473794030453599 -3.9413732105126389 1.8132084751451383 1.2095626584257959 -3.5670600179510989 1.5458513540777885 1.2676936835428423 -3.6529124129770358 1.6123413627962475 1.3258247086598889 -3.7387648080029727 1.6788313715147063 1.383955733776935 -3.8246172030289101 1.7453213802331651 1.4420867588939816 -3.910469598054847 1.8118113889516239 1.3042700142744175 -3.5361564054933075 1.5444542678842743 1.3624010393914638 -3.6220088005192443 1.6109442766027331 1.4205320645085104 -3.7078611955451812 1.6774342853211921 1.4786630896255568 -3.7937135905711181 1.7439242940396509 1.5367941147426034 -3.8795659855970555 1.8104143027581097 1.3408463450059929 -3.4194003980095782 1.4765671729723011 1.3989773701230392 -3.5052527930355155 1.5430571816907599 1.4571083952400856 -3.5911051880614524 1.6095471904092187 1.5152394203571322 -3.6769575830873897 1.6760371991276777 0.66605317401849184 -3.531272369312167 1.4216212870935259 0.58257968151373674 -3.541761675795688 1.4231366394462823 0.49910618900898157 -3.552250982279209 1.4246519917990388 0.50925421128760051 -3.6507077553735683 1.4911065441807869 0.41563269650422641 -3.5627402887627304 1.4261673441517952 0.42578071878284535 -3.6611970618570893 1.4926218965335434 0.43592874106146445 -3.7596538349514481 1.5590764489152915 0.33215920399947124 -3.5732295952462514 1.4276826965045517 0.34230722627809018 -3.6716863683406102 1.4941372488862998 0.35245524855670929 -3.7701431414349691 1.560591801268048 0.24868571149471613 -3.5837189017297728 1.4291980488573084 0.25883373377333507 -3.6821756748241317 1.4956526012390563 0.26898175605195418 -3.7806324479184905 1.5621071536208044 0.27912977833057329 -3.8790892210128494 1.6285617060025528 0.16521221898996091 -3.5942082082132938 1.4307134012100649 0.17536024126857988 -3.6926649813076526 1.497167953591813 0.18550826354719896 -3.7911217544020115 1.5636225059735609 0.19565628582581807 -3.8895785274963703 1.6300770583553092 0.20580430810443717 -3.9880353005907292 1.6965316107370574 0.081738726485205776 -3.6046975146968152 1.4322287535628215 0.091886748763824785 -3.7031542877911741 1.4986833059445694 0.10203477104244386 -3.8016110608855329 1.5651378583263176 0.11218279332106296 -3.9000678339798918 1.6315924107080657 0.12233081559968204 -3.9985246070742502 1.6980469630898138 0.13247883787830103 -4.0969813801686099 1.764501515471562 0.049005345373545957 -4.1074706866521309 1.7660168678243184 0.038857323094926913 -4.0090139135577711 1.6995623154425703 0.028709300816307837 -3.9105571404634127 1.6331077630608224 0.018561278537688766 -3.8121003673690539 1.566653210679074 0.0084132562590696989 -3.713643594274695 1.5001986582973261 0.067280454151523506 -4.2051093353221178 1.8324596093001584 0.16984946813488533 -4.1926977517077946 1.8309165058698817 0.23460896910285844 -4.0846139772953727 1.7629590498593977 0.27241848211824726 -4.1802861680934713 1.8293734024396051 0.29936847007083145 -3.9765302028829512 1.6950015938489138 0.33717798308622027 -4.0722023936810494 1.761415946429121 0.37498749610160914 -4.1678745844791489 1.8278302990093285 0.36412797103880462 -3.8684464284705289 1.6270441378384297 0.40193748405419333 -3.9641186192686284 1.6934584904186372 0.43974699706958209 -4.059790810066727 1.7598728429988444 0.47755651008497096 -4.1554630008648257 1.8262871955790518 0.46669698502216639 -3.8560348448562061 1.6255010344081531 0.5045064980375551 -3.9517070356543056 1.6919153869883605 0.54231601105294391 -4.0473792264524038 1.7583297395685678 0.58012552406833273 -4.1430514172505033 1.8247440921487752 0.53145648599013973 -3.7479510704437837 1.5575435783976692 0.56926599900552843 -3.8436232612418832 1.6239579309778764 0.60707551202091725 -3.9392954520399823 1.6903722835580839 0.64488502503630596 -4.0349676428380814 1.7567866361382909 0.68269453805169489 -4.13063983363618 1.8232009887184983 0.59621598695811273 -3.6398672960313618 1.4895861223871854 0.63402549997350144 -3.7355394868294609 1.5560004749673926 0.67183501298889015 -3.8312116776275604 1.6224148275475998 0.70964452600427907 -3.9268838684256595 1.688829180127807 0.74745403901966778 -4.0225560592237581 1.7552435327080143 0.78526355203505671 -4.1182282500218577 1.8216578852882217 0.69878500094147455 -3.627455712417039 1.4880430189569089 0.73659451395686326 -3.7231279032151381 1.5544573715371159 -0.7884912036447409 -4.2723888307117157 1.8707165957014575 -0.80745735599807289 -4.3888616768543658 1.8942560541544959 -0.82642350835140466 -4.5053345229970168 1.9177955126075346 -0.84538966070473665 -4.6218073691396668 1.941334971060573 -0.86435581305806841 -4.7382802152823169 1.9648744295136114 -0.68201829695123151 -4.2798039476991248 1.8701056266158882 -0.70098444930456349 -4.3962767938417748 1.8936450850689266 -0.71995060165789537 -4.5127496399844258 1.9171845435219652 -0.73891675401122725 -4.6292224861270759 1.9407240019750036 -0.75788290636455913 -4.7456953322697251 1.964263460428042 -0.57554539025772189 -4.2872190646865338 1.8694946575303188 -0.59451154261105388 -4.4036919108291839 1.8930341159833572 -0.61347769496438576 -4.5201647569718348 1.9165735744363959 -0.63244384731771763 -4.6366376031144849 1.940113032889434 -0.46907248356421261 -4.2946341816739428 1.8688836884447495 -0.48803863591754459 -4.4111070278165929 1.8924231468977879 -0.50700478827087636 -4.527579873959243 1.9159626053508263 -0.36259957687070332 -4.3020492986613519 1.8682727193591799 -0.3815657292240352 -4.418522144804002 1.8918121778122186 -0.25612667017719393 -4.3094644156487609 1.8676617502736106 -0.14965376348368434 -4.31687953263617 1.867050781188041 -0.023365860525843885 -4.3261724068997252 1.8664251225209225 -0.0081836172623218073 -4.4458813070634244 1.8899392655191662 -0.14121692242250514 -4.4359492084519561 1.8905699247996794 -0.126034679158983 -4.5556581086156545 1.9140840677979232 -0.11085243589546098 -4.6753670087793537 1.9375982107961669 -0.09567019263193878 -4.7950759089430521 1.9611123537944104 -0.080487949368416689 -4.9147848091067514 1.9846264967926541 -0.27425022758268847 -4.4260171098404868 1.8912005840801926 -0.25906798431916622 -4.5457260100041861 1.9147147270784364 -0.24388574105564431 -4.6654349101678854 1.9382288700766801 -0.22870349779212218 -4.7851438103315838 1.9617430130749236 -0.21352125452860002 -4.904852710495283 1.9852571560731673 -0.39210128947934952 -4.5357939113927177 1.9153453863589494 -0.37691904621582761 -4.6555028115564161 1.9388595293571933 -0.36173680295230559 -4.7752117117201154 1.9623736723554368 -0.34655455968878335 -4.8949206118838147 1.9858878153536805 -0.50995235137601125 -4.6455707129449477 1.9394901886377065 -0.49477010811248928 -4.7652796131086461 1.96300433163595 -0.47958786484896698 -4.8849885132723463 1.9865184746341937 -0.62780341327267264 -4.7553475144971777 1.9636349909164634 -0.61262117000915028 -4.875056414660877 1.9871491339147069 -0.7456544751693337 -4.8651243160494086 1.9877797931952201 -0.878687780329517 -4.8551922174379394 1.9884104524757333 -1.5972566486719 -3.9446710658508719 1.8526023847884074 -1.6461989945314914 -4.0530126894979848 1.8761643645781572 -1.6951413403910824 -4.1613543131450985 1.8997263443679067 -1.7440836862506739 -4.2696959367922123 1.9232883241576564 -1.7930260321102651 -4.378037560439326 1.9468503039474061 -1.8419683779698564 -4.4863791840864398 1.9704122837371558 -1.8909107238294476 -4.5947208077335535 1.9939742635269055 -1.4939593682329422 -3.9724352961420544 1.8519194313477323 -1.5429017140925336 -4.0807769197891677 1.875481411137482 -1.5918440599521246 -4.1891185434362814 1.8990433909272315 -1.6407864058117161 -4.2974601670833952 1.9226053707169812 -1.6897287516713071 -4.4058017907305089 1.946167350506731 -1.7386710975308983 -4.5141434143776227 1.9697293302964807 -1.3906620877939844 -4.0001995264332368 1.8512364779070571 -1.4396044336535758 -4.1085411500803497 1.8747984576968069 -1.4885467795131668 -4.2168827737274643 1.8983604374865564 -1.5374891253727583 -4.3252243973745781 1.9219224172763061 -1.5864314712323493 -4.4335660210216918 1.9454843970660558 -1.2873648073550266 -4.0279637567244198 1.850553524466382 -1.336307153214618 -4.1363053803715326 1.8741155042561317 -1.385249499074209 -4.2446470040186464 1.8976774840458812 -1.4341918449338005 -4.352988627665761 1.9212394638356309 -1.1840675269160688 -4.0557279870156018 1.8498705710257068 -1.2330098727756602 -4.1640696106627146 1.8734325508154566 -1.2819522186352514 -4.2724112343098293 1.8969945306052061 -1.0807702464771107 -4.0834922173067847 1.8491876175850317 -1.1297125923367022 -4.1918338409538975 1.8727495973747812 -1.1786549381962934 -4.3001754646010113 1.8963115771645309 -0.97747296603815292 -4.1112564475979667 1.8485046641443563 -1.0264153118977444 -4.2195980712450796 1.872066643934106 -0.87417568559919523 -4.1390206778891496 1.8478217107036812 -1.7674818411655662 -4.6285026089915284 1.9932742329269368 -1.6206475827274194 -4.5463094880676591 1.9690338849414895 -1.6387472255817406 -4.663870355770376 1.9925697015999404 -1.4738133242892726 -4.4641163671437889 1.9447935369560423 -1.4919129671435938 -4.5816772348465067 1.968329353614493 -1.510012609997915 -4.6992381025492236 1.991865170272944 -1.326979065851126 -4.3819232462199196 1.9205531889705949 -1.345078708705447 -4.4994841139226365 1.9440890056290459 -1.3631783515597682 -4.6170449816253543 1.9676248222874966 -1.3812779944140894 -4.7346058493280712 1.9911606389459477 -1.1982444502673 -4.4172909929987672 1.9198486576435985 -1.216344093121621 -4.534851860701484 1.9433844743020494 -1.2344437359759421 -4.6524127284042018 1.9669202909605004 -1.2525433788302633 -4.7699735961069187 1.9904561076189513 -1.0514101918291532 -4.3350978720748961 1.8956083096581513 -1.0695098346834744 -4.4526587397776147 1.9191441263166023 -1.0876094775377954 -4.5702196074803316 1.942679942975053 -1.1057091203921166 -4.6877804751830494 1.9662157596335039 -1.1238087632464377 -4.8053413428857663 1.9897515762919551 -0.90457593339100628 -4.2529047511510258 1.8713679616727039 -0.92267557624532737 -4.3704656188537436 1.8949037783311549 -0.94077521909964856 -4.4880264865564623 1.9184395949896058 -0.95887486195396976 -4.6055873542591792 1.9419754116480565 -0.97697450480829096 -4.723148221961897 1.9655112283065077 -0.99507414766261215 -4.8407090896646148 1.9890470449649587 -2.3554028040768538 -3.5777552638966381 1.8580297170250395 -2.4288352850019637 -3.6723174072222822 1.8816173835488601 -2.5022677659270731 -3.7668795505479258 1.9052050500726809 -2.575700246852183 -3.8614416938735703 1.9287927165965015 -2.2616845242514145 -3.6240052584471796 1.8573522138182577 -2.3351170051765244 -3.7185674017728236 1.8809398803420783 -2.4085494861016343 -3.8131295450984672 1.9045275468658991 -2.4819819670267438 -3.9076916884241117 1.9281152133897197 -2.5554144479518537 -4.0022538317497558 1.9517028799135405 -2.6288469288769631 -4.0968159750753994 1.9752905464373613 -2.1679662444259757 -3.670255252997721 1.8566747106114758 -2.2413987253510856 -3.7648173963233651 1.8802623771352964 -2.3148312062761951 -3.8593795396490087 1.9038500436591173 -2.388263687201305 -3.9539416829746532 1.9274377101829381 -2.4616961681264145 -4.0485038263002968 1.9510253767067589 -2.074247964600537 -3.7165052475482625 1.855997207404694 -2.1476804455256469 -3.8110673908739066 1.8795848739285146 -2.2211129264507559 -3.9056295341995502 1.9031725404523354 -2.2945454073758658 -4.0001916775251942 1.9267602069761562 -1.9805296847750979 -3.762755242098804 1.8553197041979121 -2.0539621657002076 -3.857317385424448 1.8789073707217328 -2.1273946466253171 -3.9518795287500916 1.9024950372455536 -1.8868114049496589 -3.8090052366493454 1.8546422009911303 -1.9602438858747686 -3.903567379974989 1.8782298675149511 -2.0336763667998778 -3.9981295233006326 1.9018175340387717 -1.7930931251242199 -3.8552552311998869 1.8539646977843485 -1.8665256060493296 -3.9498173745255305 1.8775523643081693 -1.6993748452987811 -3.9015052257504284 1.8532871945775669 -2.6870095911933016 -4.1994497163805544 1.9988622971754302 -2.5238017179577117 -4.1490533645304462 1.9746012371303805 -2.5731192377014596 -4.2563626319008803 1.9981637685451725 -2.3605938447221222 -4.0986570126803379 1.950340177085331 -2.4099113644658696 -4.205966280050772 1.9739027085001228 -2.4592288842096175 -4.3132755474212061 1.9974652399149151 -2.1973859714865323 -4.0482606608302296 1.9260791170402813 -2.2467034912302801 -4.1555699282006637 1.9496416484550734 -2.2960210109740276 -4.2628791955710978 1.9732041798698654 -2.3453385307177754 -4.370188462941532 1.9967667112846574 -2.0834956179946902 -4.1051735763505555 1.9253805884100237 -2.1328131377384381 -4.2124828437209896 1.9489431198248157 -2.1821306574821855 -4.3197921110914237 1.9725056512396077 -2.2314481772259334 -4.4271013784618578 1.9960681826544 -1.9202877447591002 -4.0547772245004472 1.901119528364974 -1.9696052645028481 -4.1620864918708813 1.924682059779766 -2.018922784246596 -4.2693957592413154 1.9482445911945581 -2.0682403039903434 -4.3767050266117495 1.9718071226093503 -2.1175578237340913 -4.4840142939821837 1.9953696540241423 -1.7570798715235108 -4.0043808726503389 1.8768584683199245 -1.8063973912672584 -4.111690140020773 1.9004209997347163 -1.8557149110110063 -4.2189994073912072 1.9239835311495086 -1.9050324307547539 -4.3263086747616413 1.9475460625643006 -1.9543499504985016 -4.4336179421320754 1.9711085939790927 -2.0036674702422492 -4.5409272095025095 1.9946711253938849 -3.0066699993543677 -3.0839469534002415 1.8631678682759365 -3.0976447790154746 -3.1620270662207757 1.8867671946510254 -3.1886195586765811 -3.2401071790413103 1.910366521026114 -3.279594338337688 -3.3181872918618449 1.9339658474012029 -3.3705691179987949 -3.3962674046823791 1.9575651737762916 -3.4615438976599018 -3.4743475175029137 1.9811645001513805 -2.9267878960677511 -3.1453613979082853 1.8625277367360069 -3.017762675728858 -3.2234415107288195 1.8861270631110958 -3.1087374553899645 -3.3015216235493541 1.9097263894861845 -3.1997122350510714 -3.3796017363698887 1.9333257158612733 -3.2906870147121783 -3.4576818491904233 1.956925042236362 -2.8469057927811345 -3.2067758424163291 1.8618876051960773 -2.9378805724422414 -3.2848559552368637 1.8854869315711662 -3.0288553521033479 -3.3629360680573979 1.9090862579462549 -3.1198301317644548 -3.4410161808779329 1.9326855843213437 -3.2108049114255621 -3.5190962936984675 1.9562849106964326 -2.7670236894945179 -3.2681902869243733 1.8612474736561477 -2.8579984691556248 -3.3462703997449079 1.8848468000312366 -2.9489732488167313 -3.4243505125654421 1.9084461264063253 -3.0399480284778386 -3.5024306253859767 1.9320454527814142 -2.6871415862079013 -3.3296047314324175 1.8606073421162181 -2.7781163658690082 -3.4076848442529521 1.884206668491307 -2.8690911455301147 -3.4857649570734863 1.9078059948663957 -2.6072594829212847 -3.3910191759404613 1.8599672105762886 -2.6982342625823916 -3.4690992887609959 1.8835665369513774 -2.5273773796346681 -3.4524336204485055 1.859327079036359 -2.447495276348052 -3.5138480649565498 1.8586869474964296 -3.3811787677458907 -3.5361559060129757 1.9805239876466689 -3.2870977951134068 -3.609150580464886 1.9798726574090788 -3.1195545160232845 -3.58978242270206 1.9556358129449534 -3.193016822480923 -3.6821452549167963 1.9792213271714887 -2.9520112369331617 -3.5704142649392341 1.9313989684808279 -3.0254735433908007 -3.6627770971539704 1.9549844827073632 -3.0989358498484392 -3.7551399293687067 1.9785699969338986 -2.7844679578430389 -3.5510461071764077 1.907162124016702 -2.8579302643006779 -3.6434089393911444 1.9307476382432378 -2.9313925707583168 -3.7357717716058807 1.9543331524697731 -3.0048548772159558 -3.828134603820617 1.9779186666963084 -2.6169246787529166 -3.5316779494135817 1.8829252795525766 -2.6903869852105551 -3.624040781628318 1.9065107937791119 -2.763849291668194 -3.7164036138430547 1.9300963080056477 -2.837311598125833 -3.808766446057791 1.953681822232183 -2.910773904583472 -3.9011292782725273 1.9772673364587183 -2.5228437061204327 -3.604672623865492 1.8822739493149865 -2.5963060125780717 -3.6970354560802283 1.9058594635415218 -2.6697683190357107 -3.7893982882949646 1.9294449777680573 -2.7432306254933492 -3.8817611205097009 1.9530304919945929 -2.8166929319509881 -3.9741239527244372 1.9766160062211282 -2.6491496528608658 -3.9547557949616108 1.9523791617570025 -2.7226119593185047 -4.0471186271763475 1.9759646759835379 -2.7960742657761433 -4.1394814593910843 1.9995501902100734 -3.598312885713788 -2.4222623018039462 1.8685376899783481 -3.7012550331226297 -2.4829409652023422 1.8921368084706978 -3.8041971805314714 -2.5436196286007386 1.915735926963047 -3.5345541606225432 -2.4952718036844712 1.8679441770298439 -3.6374963080313849 -2.5559504670828672 1.8915432955221936 -3.7404384554402261 -2.6166291304812637 1.9151424140145428 -3.8433806028490682 -2.6773077938796601 1.9387415325068924 -3.9463227502579099 -2.7379864572780566 1.9623406509992418 -3.470795435531298 -2.5682813055649962 1.8673506640813398 -3.5737375829401397 -2.6289599689633922 1.8909497825736894 -3.6766797303489813 -2.6896386323617887 1.9145489010660386 -3.779621877757823 -2.7503172957601851 1.9381480195583882 -3.8825640251666647 -2.8109959591585811 1.9617471380507376 -3.4070367104400532 -2.6412908074455212 1.8667571511328356 -3.5099788578488944 -2.7019694708439173 1.8903562696251852 -3.6129210052577361 -2.7626481342423137 1.9139553881175344 -3.7158631526665777 -2.8233267976407097 1.937554506609884 -3.3432779853488084 -2.7143003093260463 1.8661636381843314 -3.4462201327576496 -2.7749789727244423 1.889762756676681 -3.5491622801664913 -2.8356576361228387 1.9133618751690304 -3.2795192602575636 -2.7873098112065708 1.8655701252358272 -3.3824614076664048 -2.8479884746049668 1.8891692437281769 -3.2157605351663183 -2.8603193130870959 1.8649766122873233 -3.3187026825751595 -2.9209979764854919 1.8885757307796727 -3.1520018100750731 -2.9333288149676209 1.8643830993388191 -4.049155557909816 -2.7987980919093456 1.9859397365686215 -3.9757777741840359 -2.8835056085078845 1.9853433272539291 -3.8120187924172999 -2.8922587287948076 1.9611515816370604 -3.9023999904582558 -2.9682131251064234 1.9847469179392367 -3.6482598106505635 -2.9010118490817312 1.9369598360201916 -3.7386410086915198 -2.9769662453933465 1.960555172322368 -3.8290222067324757 -3.0529206417049624 1.9841505086245443 -3.4845008288838271 -2.9097649693686543 1.9127680904033229 -3.5748820269247834 -2.9857193656802701 1.9363634267054992 -3.6652632249657398 -3.0616737619918855 1.9599587630076756 -3.7556444230066961 -3.1376281583035013 1.9835540993098519 -3.411123045158047 -2.9944724859671932 1.9121716810886304 -3.5015042431990033 -3.070426882278809 1.9357670173908068 -3.5918854412399597 -3.1463812785904244 1.9593623536929832 -3.682266639280916 -3.2223356749020402 1.9829576899951595 -3.2473640633913106 -3.0032256062541167 1.8879799354717617 -3.3377452614322669 -3.0791800025657321 1.911575271773938 -3.4281264594732233 -3.1551343988773479 1.9351706080761144 -3.5185076575141796 -3.2310887951889633 1.9587659443782908 -3.6088888555551364 -3.3070431915005791 1.9823612806804671 -3.0836050816245741 -3.0119787265410403 1.8637881898548929 -3.1739862796655305 -3.0879331228526556 1.8873835261570691 -3.2643674777064868 -3.163887519164271 1.9109788624592454 -3.3547486757474436 -3.2398419154758868 1.934574198761422 -3.4451298737884 -3.3157963117875022 1.9581695350635984 -3.5355110718293563 -3.3917507080991181 1.9817648713657749 -3.9199839224159536 -1.6288574714573176 1.8499003348748131 -4.0316363097995414 -1.6704653487801 1.8735020396782573 -3.8731018556217975 -1.7107271249613589 1.8493500386998285 -3.9847542430053853 -1.7523350022841413 1.8729517435032728 -4.096406630388973 -1.7939428796069241 1.8965534483067168 -4.2080590177725608 -1.8355507569297067 1.9201551531101611 -4.3197114051561485 -1.8771586342524895 1.9437568579136053 -4.4313637925397371 -1.9187665115752721 1.9673585627170493 -3.8262197888276415 -1.7925967784654002 1.8487997425248439 -3.9378721762112292 -1.8342046557881826 1.8724014473282882 -4.0495245635948169 -1.8758125331109654 1.8960031521317322 -4.1611769509784047 -1.917420410433748 1.9196048569351765 -4.2728293383619924 -1.9590282877565308 1.9432065617386207 -4.384481725745581 -2.0006361650793134 1.9668082665420648 -3.7793377220334854 -1.8744664319694415 1.8482494463498593 -3.8909901094170731 -1.9160743092922239 1.8718511511533036 -4.0026424968006609 -1.9576821866150067 1.8954528559567476 -4.1142948841842486 -1.9992900639377893 1.9190545607601919 -4.2259472715678363 -2.0408979412605719 1.9426562655636361 -3.8441080426229171 -1.9979439627962652 1.871300854978319 -3.9557604300065048 -2.039551840119048 1.894902559781763 -4.0674128173900925 -2.0811597174418304 1.9185042645852073 -3.797225975828761 -2.0798136163003065 1.8707505588033344 -3.9088783632123487 -2.1214214936230893 1.8943522636067787 -3.7503439090346049 -2.1616832698043478 1.87020026262835 -3.8619962964181926 -2.2032911471271306 1.8938019674317941 -3.7034618422404488 -2.2435529233083891 1.8696499664533655 -4.5412252123505503 -1.9637142633425606 1.9909592508628935 -4.4874561419169963 -2.0584271016167208 1.9904050452231614 -4.3314452592534955 -2.0939828115701902 1.9662544767710373 -4.4336870714834422 -2.153139939890881 1.9898508395834293 -4.1754343765899948 -2.1295385215236591 1.9421039083189131 -4.2776761888199415 -2.1886956498443504 1.9657002711313052 -4.3799180010498882 -2.2478527781650413 1.9892966339436973 -4.0194234939264932 -2.165094231477128 1.9179533398667892 -4.1216653061564408 -2.2242513597978193 1.941549702679181 -4.2239071183863874 -2.2834084881185106 1.9651460654915731 -4.3261489306163341 -2.3425656164392015 1.9887424283039652 -3.9656544234929396 -2.2598070697512882 1.9173991342270571 -4.0678962357228867 -2.3189641980719795 1.940995497039449 -4.1701380479528343 -2.3781213263926704 1.964591859851841 -4.2723798601827809 -2.4372784547133617 1.9881882226642331 -3.8096435408294385 -2.2953627797047575 1.8932485657749329 -3.911885353059386 -2.3545199080254484 1.916844928587325 -4.0141271652893336 -2.4136770363461397 1.9404412913997169 -4.1163689775192802 -2.4728341646668306 1.964037654212109 -4.2186107897492269 -2.5319912929875215 1.987634017024501 -3.6536326581659373 -2.3309184896582265 1.8690979973228088 -3.7558744703958848 -2.3900756179789178 1.8926943601352009 -3.8581162826258324 -2.4492327462996086 1.9162907229475927 -3.9603580948557799 -2.5083898746202999 1.9398870857599848 -4.0625999070857262 -2.5675470029409908 1.9634834485723769 -4.1648417193156737 -2.6267041312616817 1.987079811384769 -3.9065890244222259 -2.6031027128944597 1.9393328801202527 -4.008830836652173 -2.6622598412151506 1.9629292429326448 -4.1110726488821197 -2.7214169695358414 1.9865256057450371 -4.1581009251307499 -0.91785846709609642 1.8540056577903126 -4.2754219172237775 -0.93805608951823705 1.8776173198821489 -4.3927429093168033 -0.95825371194037778 1.9012289819739847 -4.51006390140983 -0.97845133436251841 1.924840644065821 -4.6273848935028568 -0.99864895678465926 1.9484523061576571 -4.7447058855958835 -1.0188465792067998 1.9720639682494934 -4.1285205075943843 -1.0065339176114461 1.853492864919247 -4.2458414996874119 -1.0267315400335866 1.8771045270110833 -4.3631624917804377 -1.0469291624557273 1.9007161891029192 -4.4804834838734644 -1.0671267848778681 1.9243278511947555 -4.5978044759664911 -1.0873244073000088 1.9479395132865918 -4.0989400900580186 -1.0952093681267958 1.8529800720481815 -4.2162610821510462 -1.1154069905489363 1.8765917341400178 -4.333582074244072 -1.1356046129710768 1.9002033962318536 -4.4509030663370988 -1.1558022353932178 1.9238150583236899 -4.5682240584301255 -1.1759998578153583 1.9474267204155262 -4.069359672521653 -1.1838848186421456 1.852467279177116 -4.1866806646146806 -1.2040824410642861 1.8760789412689522 -4.3040016567077073 -1.2242800634864266 1.8996906033607883 -4.421322648800734 -1.2444776859085673 1.9233022654526246 -4.0397792549852882 -1.2725602691574953 1.8519544863060504 -4.1571002470783149 -1.2927578915796358 1.8755661483978867 -4.2744212391713416 -1.3129555140017763 1.8991778104897228 -4.0101988374489226 -1.3612357196728448 1.8514416934349851 -4.1275198295419493 -1.3814333420949854 1.8750533555268214 -4.2448408216349769 -1.4016309645171259 1.8986650176186575 -3.9806184199125574 -1.4499111701881946 1.8509289005639196 -4.0979394120055845 -1.4701087926103351 1.8745405626557559 -3.9510380023761922 -1.5385866207035441 1.8504161076928543 -4.859671983432257 -1.0467339069115453 1.9956713750695012 -4.7145258074812872 -1.1094801699244794 1.9715500917973889 -4.8255917415012028 -1.1501031481654276 1.9951504510579718 -4.6804455655502331 -1.2128494111783616 1.9710291677858596 -4.7915114995701487 -1.2534723894193096 1.9946295270464425 -4.5352993895992633 -1.2755956741912957 1.9469078845137473 -4.6463653236191789 -1.3162186524322439 1.9705082437743302 -4.7574312576390945 -1.3568416306731916 1.9941086030349131 -4.3901532136482944 -1.33834193720423 1.922786601241635 -4.5012191476682091 -1.378964915445178 1.9463869605022179 -4.6122850816881247 -1.4195878936861261 1.9699873197628008 -4.7233510157080394 -1.4602108719270739 1.9935876790233835 -4.3560729717172402 -1.441711178458112 1.9222656772301057 -4.4671389057371549 -1.4823341566990602 1.9458660364906886 -4.5782048397570696 -1.5229571349400082 1.9694663957512715 -4.6892707737769852 -1.5635801131809559 1.9930667550118542 -4.2109267957662704 -1.5044574414710465 1.8981443939579932 -4.3219927297861851 -1.5450804197119943 1.9217447532185763 -4.4330586638060998 -1.5857033979529425 1.9453451124791592 -4.5441245978260154 -1.6263263761938904 1.9689454717397419 -4.6551905318459301 -1.6669493544348382 1.9925458310003246 -4.0657806198153015 -1.5672037044839806 1.8740231106858811 -4.1768465538352153 -1.6078266827249286 1.8976234699464638 -4.2879124878551309 -1.6484496609658765 1.9212238292070467 -4.3989784218750456 -1.6890726392068245 1.9448241884676298 -4.5100443558949603 -1.7296956174477724 1.9684245477282125 -4.6211102899148759 -1.7703185956887204 1.9920249069887952 -4.1427663119041611 -1.7111959239788106 1.8971025459349344 -4.2538322459240758 -1.7518189022197586 1.9207029051955173 -4.3648981799439905 -1.7924418804607067 1.9443032644561002 -4.4759641139639061 -1.8330648587016545 1.9679036237166829 -4.5870300479838209 -1.8736878369426024 1.9915039829772656 -4.2799330669592059 -0.078906989434315178 1.8583156609907956 -4.3989702170505165 -0.076163226226393044 1.8819398688224931 -4.5180073671418262 -0.073419463018471076 1.9055640766541908 -4.6370445172331358 -0.070675699810549109 1.9291882844858885 -4.7560816673244464 -0.067931936602627058 1.952812492317586 -4.875118817415756 -0.065188173394705062 1.9764367001492837 -4.2683936585686553 -0.1718560712622248 1.857841310117079 -4.3874308086599658 -0.16911230805430266 1.8814655179487767 -4.5064679587512755 -0.16636854484638075 1.9050897257804744 -4.625505108842586 -0.16362478163845878 1.9287139336121719 -4.7445422589338957 -0.1608810184305367 1.9523381414438696 -4.2568542501781055 -0.2648051530901343 1.8573669592433624 -4.3758914002694151 -0.26206138988221223 1.8809911670750603 -4.4949285503607257 -0.25931762667429026 1.9046153749067578 -4.6139657004520354 -0.25657386346636835 1.9282395827384555 -4.7330028505433459 -0.25383010025844627 1.951863790570153 -4.2453148417875548 -0.35775423491804381 1.8568926083696458 -4.3643519918788654 -0.35501047171012173 1.8805168162013437 -4.483389141970175 -0.35226670850219977 1.9041410240330414 -4.6024262920614856 -0.34952294529427785 1.9277652318647389 -4.233775433397005 -0.45070331674595332 1.8564182574959294 -4.3528125834883147 -0.4479595535380313 1.8800424653276273 -4.4718497335796252 -0.44521579033010933 1.9036666731593248 -4.2222360250064543 -0.54365239857386305 1.8559439066222128 -4.3412731750977649 -0.54090863536594103 1.8795681144539107 -4.2106966166159046 -0.63660148040177256 1.8554695557484964 -4.3297337667072142 -0.63385771719385064 1.8790937635801943 -4.1991572082253539 -0.72955056222968218 1.8549952048747798 -4.8630802429826865 -0.16305325112082447 1.9759593690297275 -4.9798564180130436 -0.18257651567282718 1.999570077823138 -4.8499120530873272 -0.2720432542347665 1.9754752935976669 -4.9666882281176843 -0.2915665187867692 1.9990860023910777 -4.7199676881616108 -0.3615099927967057 1.9513805093721956 -4.8367438631919679 -0.3810332573487083 1.9749912181656064 -4.953520038222325 -0.40055652190071112 1.9986019269590174 -4.5900233232358945 -0.45097673135864502 1.9272857251467246 -4.7067994982662515 -0.47049999591064767 1.9508964339401351 -4.8235756732966086 -0.49002326046265027 1.9745071427335461 -4.9403518483269657 -0.50954652501465303 1.9981178515269569 -4.460078958310179 -0.54044346992058434 1.9031909409212535 -4.5768551333405352 -0.55996673447258694 1.9268016497146641 -4.6936313083708923 -0.57948999902458964 1.9504123585080748 -4.8104074834012494 -0.59901326357659213 1.9740230673014856 -4.9271836584316064 -0.61853652812859494 1.9976337760948966 -4.4469107684148197 -0.64943347303452625 1.902706865489193 -4.5636869434451759 -0.66895673758652885 1.9263175742826035 -4.6804631184755339 -0.68848000213853155 1.9499282830760143 -4.797239293505891 -0.70800326669053404 1.9735389918694253 -4.9140154685362472 -0.72752653124253686 1.997149700662836 -4.3169664034891033 -0.73890021159646557 1.8786120812637217 -4.4337425785194604 -0.75842347614846828 1.9022227900571325 -4.5505187535498175 -0.77794674070047087 1.925833498850543 -4.6672949285801746 -0.79747000525247347 1.949444207643954 -4.7840711036105317 -0.81699326980447595 1.9730549164373647 -4.9008472786408888 -0.83651653435647877 1.9966656252307757 -4.1870220385633869 -0.828366950158405 1.8545172970382504 -4.3037982135937449 -0.8478902147104076 1.8781280058316612 -4.420574388624102 -0.86741347926241019 1.9017387146250719 -4.5373505636544582 -0.88693674381441279 1.9253494234184827 -4.6541267386848162 -0.90646000836641538 1.9489601322118935 -4.7709029137151733 -0.92598327291841798 1.9725708410053044 -4.8876790887455295 -0.94550653747042068 1.9961815497987152 -4.2308742822224321 0.77539782251929434 1.8622023240796464 -4.3471439097652276 0.80129550726490728 1.8858371565876153 -4.463413537308023 0.82719319201052 1.9094719890955842 -4.5796831648508185 0.85309087675613271 1.9331068216035532 -4.695952792393614 0.87898856150174565 1.9567416541115221 -4.8122224199364085 0.90488624624735836 1.9803764866194911 -4.2379685141333709 0.68158659661143428 1.8617755839753143 -4.3542381416761664 0.70748428135704722 1.8854104164832832 -4.4705077692189619 0.73338196610265993 1.9090452489912522 -4.5867773967617573 0.75927965084827265 1.9326800814992211 -4.7030470243045528 0.78517733559388558 1.95631491400719 -4.2450627460443098 0.587775370703574 1.8613488438709822 -4.3613323735871052 0.61367305544918682 1.8849836763789511 -4.4776020011299007 0.63957074019479954 1.9086185088869201 -4.5938716286726962 0.66546842494041236 1.9322533413948892 -4.2521569779552486 0.49396414479571388 1.8609221037666503 -4.3684266054980441 0.51986182954132665 1.8845569362746193 -4.4846962330408395 0.54575951428693936 1.9081917687825882 -4.600965860583635 0.5716571990325523 1.9318266012905572 -4.2592512098661874 0.40015291888785381 1.8604953636623183 -4.3755208374089829 0.42605060363346658 1.8841301961702872 -4.4917904649517784 0.45194828837907924 1.9077650286782561 -4.2663454417771263 0.3063416929799937 1.8600686235579864 -4.3826150693199217 0.33223937772560647 1.8837034560659554 -4.273439673688066 0.21253046707213341 1.8596418834536543 -4.3897093012308614 0.23842815181774615 1.8832767159616233 -4.2805339055990048 0.11871924116427357 1.8592151433493225 -4.8199376411155788 0.8045980478222422 1.9799463775673238 -4.7101663023728388 0.69110487606878912 1.9558880380241854 -4.8286069126033944 0.69435902102488178 1.979511092667704 -4.7188355738606544 0.5808658492714287 1.9554527531245656 -4.83727618409121 0.58411999422752137 1.9790758077680841 -4.6090642351179145 0.46737267751797579 1.9313944135814272 -4.72750484534847 0.47062682247406834 1.9550174682249457 -4.8459454555790256 0.473880967430161 1.9786405228684643 -4.4992928963751755 0.35387950576452271 1.9073360740382885 -4.6177335066057301 0.35713365072061537 1.9309591286818073 -4.7361741168362856 0.36038779567670792 1.9545821833253259 -4.8546147270668412 0.36364194063280059 1.9782052379688444 -4.5079621678629911 0.24364047896716234 1.9069007891386687 -4.6264027780935457 0.24689462392325501 1.9305238437821874 -4.7448433883241012 0.25014876887934756 1.954146898425706 -4.8632839985546559 0.25340291383544022 1.9777699530692245 -4.3981908291202503 0.13014730721370929 1.8828424495955303 -4.5166314393508058 0.1334014521698019 1.9064655042390488 -4.6350720495813604 0.13665559712589451 1.9300885588825676 -4.7535126598119168 0.13990974208198706 1.9537116135260861 -4.8719532700424715 0.14316388703807967 1.9773346681696049 -4.2884194903775112 0.01665413546025642 1.8587841100523919 -4.4068601006080659 0.01990828041634898 1.8824071646959104 -4.5253007108386214 0.023162425372441554 1.906030219339429 -4.643741321069176 0.026416570328534131 1.9296532739829477 -4.7621819312997316 0.029670715284626701 1.9532763286264665 -4.8806225415302862 0.032924860240719285 1.976899383269985 -4.0086115353998899 1.6090996632499239 1.8655193069882621 -4.1176120448230789 1.65724617997387 1.8891611362430325 -4.2266125542462678 1.7053926966978161 1.9128029654978029 -4.3356130636694568 1.7535392134217622 1.9364447947525736 -4.4446135730926457 1.8016857301457083 1.9600866240073442 -4.5536140825158347 1.8498322468696544 1.9837284532621147 -4.0342747226383473 1.5182427338851032 1.8651562872649294 -4.1432752320615363 1.5663892506090493 1.8887981165196999 -4.2522757414847252 1.6145357673329954 1.9124399457744705 -4.3612762509079142 1.6626822840569415 1.9360817750292412 -4.4702767603311031 1.7108288007808876 1.9597236042840118 -4.0599379098768047 1.4273858045202823 1.8647932675415968 -4.1689384192999936 1.4755323212442284 1.8884350967963672 -4.2779389287231826 1.5236788379681745 1.9120769260511381 -4.3869394381463716 1.5718253546921206 1.9357187553059085 -4.0856010971152621 1.3365288751554616 1.8644302478182642 -4.194601606538451 1.3846753918794077 1.8880720770730348 -4.30360211596164 1.4328219086033538 1.9117139063278055 -4.4126026253848289 1.4809684253272999 1.9353557355825761 -4.1112642843537195 1.2456719457906409 1.8640672280949317 -4.2202647937769084 1.293818462514587 1.8877090573497022 -4.3292653032000974 1.3419649792385331 1.9113508866044731 -4.1369274715921769 1.1548150164258202 1.8637042083715991 -4.2459279810153658 1.2029615331497663 1.8873460376263698 -4.1625906588306343 1.0639580870609993 1.8633411886482667 -4.2715911682538232 1.1121046037849451 1.8869830179030371 -4.1882538460690917 0.97310115769617844 1.8629781689249341 -4.58122279852787 1.752517664555673 1.9833628745925584 -4.4961148943723881 1.6193911831463446 1.9593603544538483 -4.6117041418389686 1.645668178208632 1.9829935175677915 -4.5265962376834867 1.5125416967993037 1.9589909974290813 -4.6421854851500672 1.5388186918615911 1.9826241605430246 -4.4414883335280031 1.379415215389975 1.9349884772903709 -4.5570775809945854 1.4056922104522629 1.9586216404043144 -4.6726668284611659 1.4319692055145503 1.9822548035182577 -4.3563804293725203 1.2462887339806463 1.9109859571516608 -4.4719696768391017 1.2725657290429342 1.934619120265604 -4.5875589243056831 1.2988427241052221 1.9582522833795475 -4.7031481717722645 1.3251197191675095 1.9818854464934907 -4.386861772683619 1.1394392476336053 1.9106166001268938 -4.5024510201502004 1.1657162426958931 1.9342497632408371 -4.6180402676167818 1.191993237758181 1.9578829263547806 -4.7336295150833632 1.2182702328204686 1.9815160894687238 -4.3017538685281362 1.0063127662242768 1.8866140799881836 -4.4173431159947176 1.0325897612865647 1.9102472431021269 -4.532932363461299 1.0588667563488523 1.9338804062160702 -4.6485216109278795 1.0851437514111402 1.9575135693300136 -4.7641108583944609 1.1114207464734278 1.9811467324439569 -4.2166459643726535 0.8731862848149482 1.8626115598494735 -4.332235211839234 0.89946327987723607 1.8862447229634167 -4.4478244593058154 0.92574027493952382 1.90987788607736 -4.5634137067723968 0.95201727000181158 1.9335110491913032 -4.6790029542389782 0.97829426506409944 1.9571442123052467 -4.7945922017055596 1.0045712601263872 1.98077737541919 -3.6186597368621736 2.3851222094306772 1.8680402784976096 -3.7161591196357184 2.4536664014059308 1.8916851273020079 -3.8136585024092629 2.5222105933811845 1.915329976106406 -3.9111578851828073 2.5907547853564381 1.9389748249108043 -4.0086572679563517 2.6592989773316922 1.9626196737152026 -4.1061566507298961 2.7278431693069454 1.9862645225196007 -3.6620580625241992 2.3010144780955422 1.867765609750504 -3.7595574452977436 2.3695586700707958 1.8914104585549023 -3.857056828071288 2.4381028620460499 1.9150553073593004 -3.9545562108448329 2.5066470540213031 1.9387001561636987 -4.0520555936183777 2.5751912459965571 1.9623450049680971 -3.7054563881862244 2.2169067467604071 1.8674909410033984 -3.8029557709597688 2.2854509387356612 1.8911357898077967 -3.9004551537333132 2.3539951307109148 1.9147806386121948 -3.9979545365068581 2.4225393226861685 1.9384254874165932 -4.0954539192804029 2.4910835146614225 1.9620703362209913 -3.74885471384825 2.1327990154252721 1.8672162722562928 -3.8463540966217944 2.2013432074005261 1.8908611210606912 -3.9438534793953388 2.2698873993757798 1.9145059698650893 -4.0413528621688837 2.3384315913510334 1.9381508186694876 -3.7922530395102756 2.048691284090137 1.8669416035091873 -3.8897524222838196 2.1172354760653915 1.8905864523135856 -3.987251805057364 2.1857796680406452 1.9142313011179837 -3.8356513651723008 1.9645835527550024 1.8666669347620819 -3.9331507479458447 2.0331277447302565 1.8903117835664802 -3.8790496908343259 1.8804758214198676 1.8663922660149763 -3.9765490736078704 1.9490200133951217 1.8900371148193746 -3.9224480164963516 1.7963680900847325 1.866117597267871 -4.1522225339539522 2.6387302718599983 1.9859884859822257 -4.2035448542138463 2.539754666708018 1.9857097542065054 -4.1466244088815225 2.3923927909601179 1.9617916822964487 -4.2548671744737394 2.4407790615560376 1.9854310224307852 -4.0897039635491979 2.2450309152122179 1.9378736103863921 -4.1979467291414156 2.2934171858081376 1.9615129505207285 -4.3061894947336334 2.3418034564040573 1.9851522906550649 -4.0327835182168732 2.0976690394643183 1.9139555384763354 -4.141026283809091 2.1460553100602375 1.9375948786106718 -4.2492690494013088 2.1944415806561572 1.9612342187450083 -4.3575118149935275 2.242827851252077 1.9848735588793445 -4.0841058384767672 1.9986934343123377 1.9136768067006151 -4.192348604068985 2.0470797049082572 1.9373161468349516 -4.3005913696612028 2.0954659755041769 1.9609554869692878 -4.4088341352534206 2.1438522461000966 1.9845948271036242 -4.0271853931444435 1.8513315585644377 1.8897587347905587 -4.1354281587366613 1.8997178291603574 1.9133980749248947 -4.2436709243288782 1.9481040997562769 1.9370374150592311 -4.351913689921096 1.9964903703521966 1.9606767551935675 -4.4601564555133137 2.0448766409481163 1.9843160953279038 -3.9702649478121197 1.7039696828165374 1.865840662880502 -4.0785077134043375 1.7523559534124571 1.8894800030148382 -4.1867504789965544 1.8007422240083768 1.9131193431491744 -4.2949932445887722 1.8491284946042963 1.9367586832835109 -4.40323601018099 1.897514765200216 1.9603980234178471 -4.5114787757732078 1.9459010357961357 1.9840373635521835 -3.0742409755886251 3.0677277801933482 1.8694103234136417 -3.1564553536619631 3.1540206224784875 1.8930547496687113 -3.1338372997732451 2.9939436929118943 1.8692625064162287 -3.2160516778465831 3.0802365351970336 1.8929069326712984 -3.2982660559199211 3.1665293774821723 1.9165513589263681 -3.380480433993259 3.2528222197673116 1.9401957851814378 -3.462694812066597 3.3391150620524508 1.9638402114365074 -3.1934336239578651 2.9201596056304404 1.869114689418816 -3.2756480020312031 3.0064524479155796 1.8927591156738857 -3.3578623801045411 3.0927452902007184 1.9164035419289553 -3.4400767581778795 3.1790381324858576 1.940047968184025 -3.5222911362512175 3.2653309747709973 1.9636923944390947 -3.2530299481424856 2.8463755183489865 1.868966872421403 -3.3352443262158236 2.9326683606341257 1.8926112986764727 -3.4174587042891615 3.0189612029192645 1.9162557249315424 -3.4996730823625 3.1052540452044037 1.9399001511866121 -3.3126262723271056 2.7725914310675326 1.8688190554239903 -3.394840650400444 2.8588842733526718 1.89246348167906 -3.4770550284737816 2.9451771156378106 1.9161079079341297 -3.3722225965117256 2.6988073437860787 1.8686712384265773 -3.454436974585064 2.7851001860712179 1.892315664681647 -3.4318189206963461 2.6250232565046243 1.8685234214291646 -3.5140332987696845 2.7113160987897635 1.8921678476842343 -3.4914152448809666 2.55123916922317 1.8683756044317517 -3.5468232351841236 3.4230721782980904 1.9874841995488362 -3.617211284035275 3.3361188542783147 1.9873339122251157 -3.5909106011330709 3.1805358693588111 1.9635425119607202 -3.6875993328864265 3.2491655302585389 1.9871836249013952 -3.5646099182308664 3.024952884439307 1.9397511116963249 -3.6612986499842224 3.0935825453390353 1.9633922246369997 -3.757987381737578 3.1622122062387632 1.9870333375776748 -3.5383092353286614 2.8693698995198029 1.9159597114319293 -3.6349979670820178 2.9379995604195313 1.9396008243726044 -3.7316866988353738 3.0066292213192596 1.9632419373132792 -3.8283754305887294 3.0752588822189875 1.9868830502539543 -3.6086972841798128 2.7824165755000272 1.9158094241082089 -3.7053860159331693 2.8510462363997555 1.9394505370488839 -3.8020747476865253 2.9196758972994838 1.9630916499895588 -3.8987634794398813 2.9883055581992122 1.986732762930234 -3.5823966012776087 2.6268335905805231 1.8920180238438136 -3.6790853330309647 2.6954632514802515 1.9156591367844884 -3.7757740647843212 2.7640929123799798 1.9393002497251635 -3.8724627965376772 2.8327225732797081 1.9629413626658385 -3.9691515282910332 2.9013522341794364 1.9865824756065136 -3.5560959183754042 2.4712506056610191 1.868226623579418 -3.6527846501287602 2.5398802665607474 1.8918677365200931 -3.7494733818821162 2.6085099274604757 1.9155088494607679 -3.8461621136354727 2.677139588360204 1.939149962401443 -3.9428508453888287 2.7457692492599328 1.9627910753421181 -4.0395395771421851 2.8143989101596607 1.9864321882827933 -2.4690110155444147 3.5635296180882721 1.8690911914355022 -2.5327634905725094 3.6642287288045226 1.8927335058032648 -2.5965159656006045 3.7649278395207726 1.9163758201710277 -2.6602684406286992 3.8656269502370231 1.9400181345387904 -2.7240209156567943 3.966326060953274 1.9636604489065532 -2.7877733906848889 4.0670251716695249 1.9873027632743157 -2.5426856845989008 3.5033347709918266 1.8691326593077575 -2.6064381596269959 3.604033881708077 1.8927749736755202 -2.6701906346550905 3.7047329924243271 1.916417288043283 -2.7339431096831852 3.8054321031405776 1.9400596024110457 -2.7976955847112803 3.906131213856828 1.9637019167788083 -2.6163603536533868 3.443139923895381 1.8691741271800129 -2.6801128286814819 3.5438390346116315 1.8928164415477755 -2.743865303709577 3.6445381453278816 1.9164587559155384 -2.8076177787376717 3.745237256044132 1.940101070283301 -2.6900350227078733 3.3829450767989351 1.8692155950522682 -2.7537874977359684 3.4836441875151856 1.8928579094200308 -2.8175399727640635 3.5843432982314356 1.9165002237877937 -2.7637096917623598 3.3227502297024891 1.8692570629245235 -2.8274621667904549 3.4234493404187396 1.8928993772922862 -2.8912146418185496 3.5241484511349901 1.9165416916600488 -2.8373843608168459 3.2625553826060436 1.8692985307967789 -2.901136835844941 3.3632544933222941 1.8929408451645415 -2.9110590298713324 3.2023605355095976 1.8693399986690342 -2.8733210923995554 3.997070712256853 1.9873418106307426 -2.8789649993853232 3.8396934989936815 1.9637418363354386 -2.9603408328727729 3.9259062395300521 1.987380557887505 -2.8846089063710907 3.6823162857305101 1.9401418620401345 -2.9659847398585413 3.7685290262668811 1.9637805835922011 -3.047360573345991 3.8547417668032518 1.9874193051442675 -2.9716286468443087 3.6111518130037092 1.940180609296897 -3.0530044803317589 3.6973645535400803 1.9638193308489635 -3.1343803138192086 3.7835772940764514 1.9874580524010299 -2.9772725538300762 3.4537745997405382 1.916580635001593 -3.0586483873175263 3.5399873402769089 1.9402193565536594 -3.1400242208049765 3.6262000808132795 1.963858078105726 -3.2214000542924266 3.7124128213496506 1.9874967996577924 -2.9829164608158441 3.2963973864773668 1.8929806607062891 -3.0642922943032938 3.3826101270137374 1.9166193822583555 -3.1456681277907439 3.468822867550108 1.9402581038104219 -3.227043961278194 3.5550356080864791 1.9638968253624884 -3.3084197947656442 3.6412483486228502 1.9875355469145548 -2.9885603678016119 3.1390201732141954 1.869380686410985 -3.0699362012890616 3.225232913750566 1.8930194079630516 -3.1513120347765118 3.3114456542869366 1.9166581295151179 -3.2326878682639615 3.3976583948233077 1.9402968510671843 -3.3140637017514121 3.4838711353596787 1.9639355726192509 -3.3954395352388622 3.5700838758960494 1.9875742941713173 -3.2383317752497294 3.2402811815601358 1.9166968767718804 -3.3197076087371795 3.3264939220965069 1.940335598323947 -3.4010834422246297 3.4127066626328779 1.9639743198760133 -3.4824592757120802 3.498919403169249 1.9876130414280799 -1.6921513943089193 3.9792895152739067 1.8663179350287686 -1.7350217298653965 4.0905054222340915 1.8899616489870354 -1.7778920654218735 4.2017213291942763 1.9136053629453018 -1.8207624009783507 4.3129372361544611 1.9372490769035684 -1.863632736534828 4.4241531431146459 1.9608927908618352 -1.9065030720913052 4.5353690500748307 1.9845365048201018 -1.777408441865602 3.9356152168372818 1.8666522459538599 -1.8202787774220792 4.0468311237974666 1.8902959599121267 -1.8631491129785562 4.1580470307576514 1.9139396738703931 -1.9060194485350335 4.2692629377178362 1.9375833878286597 -1.9488897840915107 4.380478844678021 1.9612271017869263 -1.8626654894222847 3.8919409184006568 1.8669865568789512 -1.9055358249787619 4.0031568253608416 1.890630270837218 -1.948406160535239 4.1143727323210264 1.9142739847954844 -1.9912764960917162 4.2255886392812112 1.937917698753751 -1.9479225369789677 3.8482666199640319 1.8673208678040425 -1.9907928725354447 3.9594825269242166 1.8909645817623093 -2.0336632080919217 4.0706984338844014 1.9146082957205757 -2.0765335436483991 4.1819143408445862 1.9382520096788423 -2.0331795845356506 3.8045923215274073 1.8676551787291338 -2.0760499200921276 3.9158082284875921 1.8912988926874006 -2.1189202556486046 4.0270241354477774 1.914942606645667 -2.1184366320923331 3.7609180230907824 1.8679894896542251 -2.1613069676488101 3.8721339300509676 1.8916332036124917 -2.2036936796490156 3.7172437246541579 1.8683238005793161 -2.2889507272056986 3.6735694262175329 1.8686581115044074 -1.9980194110034537 4.48833095424399 1.9848676187612284 -2.0359208668888926 4.3358511643358391 1.9615605066090906 -2.0988316584398614 4.4362971566483695 1.9851939847414759 -2.1367331143253003 4.2838173667402186 1.9618868725893381 -2.1996439058762691 4.3842633590527491 1.9855203507217234 -2.1746345702107397 4.1313375768320677 1.9385797604372006 -2.237545361761708 4.2317835691445982 1.9622132385695856 -2.3004561533126768 4.3322295614571287 1.9858467167019707 -2.2125360260961791 3.9788577869239168 1.9152726482850628 -2.2754468176471474 4.0793037792364473 1.9389061264174479 -2.3383576091981157 4.1797497715489778 1.9625396045498331 -2.4012684007490845 4.2801957638615082 1.9861730826822181 -2.2504374819816184 3.8263779970157654 1.8919655361329253 -2.3133482735325868 3.9268239893282959 1.9155990142653103 -2.3762590650835551 4.0272699816408268 1.9392324923976954 -2.4391698566345235 4.1277159739533573 1.9628659705300806 -2.5020806481854923 4.2281619662658878 1.9864994486624654 -2.3512497294180266 3.7743441994201445 1.8922919021131726 -2.4141605209689949 3.874790191732675 1.9159253802455578 -2.4770713125199633 3.975236184045206 1.9395588583779426 -2.5399821040709316 4.075682176357736 1.9631923365103279 -2.6028928956219 4.1761281686702665 1.9868258146427129 -2.3891511853034659 3.6218644095119936 1.868984789961035 -2.4520619768544343 3.7223104018245241 1.8926182680934198 -2.5149727684054026 3.8227563941370541 1.9162517462258051 -2.577883559956371 3.9232023864495851 1.9398852243581901 -2.6407943515073393 4.0236483787621156 1.9635187024905754 -2.7037051430583077 4.124094371074646 1.9871521806229602 -0.92381500745142453 4.1885569529703215 1.8601765317787353 -0.94440288508445402 4.3060313512848953 1.8838401784546699 -0.96499076271748363 4.4235057495994692 1.907503825130604 -0.98557864035051312 4.540980147914043 1.9311674718065381 -1.0061665179835426 4.6584545462286169 1.9548311184824723 -1.0267543956165723 4.7759289445431916 1.9784947651584066 -1.0182003295709097 4.1640844374888806 1.8609720086925854 -1.0387882072039392 4.2815588358034544 1.88463565536852 -1.0593760848369689 4.3990332341180283 1.9082993020444541 -1.0799639624699984 4.5165076324326021 1.9319629487203882 -1.1005518401030276 4.633982030747176 1.9556265953963223 -1.1125856516903949 4.1396119220074397 1.8617674856064355 -1.1331735293234244 4.2570863203220135 1.88543113228237 -1.1537614069564541 4.3745607186365874 1.9090947789583042 -1.1743492845894836 4.4920351169511612 1.9327584256342383 -1.2069709738098804 4.1151394065259987 1.8625629625202855 -1.2275588514429099 4.2326138048405726 1.8862266091962201 -1.2481467290759394 4.3500882031551464 1.9098902558721542 -1.3013562959293656 4.0906668910445578 1.8633584394341356 -1.3219441735623949 4.2081412893591317 1.8870220861100702 -1.3425320511954246 4.3256156876737055 1.9106857327860041 -1.3957416180488507 4.0661943755631169 1.8641539163479857 -1.4163294956818802 4.1836687738776916 1.88781756302392 -1.4901269401683357 4.0417218600816769 1.8649493932618357 -1.1314289822154153 4.7482515940006422 1.9792742480650807 -1.2011241699231001 4.6075824252155213 1.9564124550002318 -1.2431751303871252 4.7183716381590477 1.9800427386790822 -1.2708193576307849 4.4669132564304013 1.9335506619353826 -1.31287031809481 4.5777024693739268 1.9571809456142333 -1.3549212785588352 4.6884916823174532 1.9808112292930837 -1.3825655058024948 4.4370333005888067 1.9343191525493841 -1.4246164662665199 4.5478225135323322 1.9579494362282348 -1.4666674267305451 4.6586117264758586 1.9815797199070853 -1.4522606935101796 4.2963641318036867 1.9114573594845352 -1.4943116539742047 4.4071533447472122 1.9350876431633857 -1.5363626144382299 4.5179425576907377 1.9587179268422363 -1.578413574902255 4.6287317706342641 1.9823482105210868 -1.5219558812178646 4.1556949630185667 1.8885955664196863 -1.5640068416818895 4.2664841759620922 1.9122258500985367 -1.6060578021459146 4.3772733889056177 1.9358561337773872 -1.6481087626099398 4.4880626018491432 1.9594864174562379 -1.6901597230739649 4.5988518147926687 1.9831167011350883 -1.5916510689255492 4.0150257942334466 1.8657337733548374 -1.6337020293895745 4.1258150071769721 1.8893640570336878 -1.6757529898535994 4.2366042201204976 1.9129943407125383 -1.7178039503176246 4.3473934330640231 1.9366246243913887 -1.7598549107816497 4.4581826460075487 1.9602549080702394 -1.8019058712456748 4.5689718589510742 1.9838851917490898 -0.00095496799530458976 4.3523936232734934 1.8712017914042478 -0.10408610014161257 4.230340584777216 1.8489443908971539 -0.10296552517279467 4.349835259697227 1.8726914062132576 -0.10184495020397666 4.4693299346172379 1.896438421529361 -0.10072437523515854 4.5888246095372489 1.9201854368454647 -0.099603800266340581 4.7083192844572599 1.9439324521615686 -0.098483225297522542 4.8278139593772718 1.9676794674776725 -0.20609665731910265 4.2277822212009486 1.8504340057061637 -0.20497608235028469 4.3472768961209596 1.8741810210222674 -0.20385550738146674 4.4667715710409706 1.8979280363383708 -0.20273493241264862 4.5862662459609815 1.9216750516544745 -0.20161435744383066 4.7057609208809934 1.9454220669705784 -0.3081072144965929 4.2252238576246812 1.8519236205151735 -0.30698663952777494 4.3447185325446931 1.8756706358312771 -0.30586606455895693 4.4642132074647041 1.8994176511473806 -0.30474548959013881 4.583707882384715 1.9231646664634843 -0.41011777167408298 4.2226654940484138 1.8534132353241832 -0.40899719670526502 4.3421601689684257 1.8771602506402869 -0.40787662173644701 4.4616548438884367 1.9009072659563904 -0.40675604676762889 4.5811495188084477 1.924654281272494 -0.512128328851573 4.2201071304721474 1.854902850133193 -0.5110077538827551 4.3396018053921592 1.8786498654492967 -0.50988717891393709 4.4590964803121702 1.9023968807654004 -0.61413888602906319 4.21754876689588 1.8563924649422028 -0.61301831106024518 4.3370434418158919 1.8801394802583065 -0.7161494432065536 4.2149904033196135 1.8578820797512123 -0.10571552488878322 4.9462851060241846 1.9913865328488949 -0.20594692954712712 4.8245873886867328 1.9691430010947053 -0.22581477995433363 4.9415102248193099 1.992789633431167 -0.30617833420547136 4.70288967134928 1.9468994693405157 -0.32604618461267776 4.8198125074818581 1.9705461016769774 -0.34591403501988427 4.9367353436144352 1.9941927340134391 -0.42627758927102177 4.6981147901444054 1.9483025699227878 -0.44614543967822828 4.8150376262769834 1.9719492022592495 -0.46601329008543468 4.9319604624095605 1.9955958345957112 -0.52650899392936568 4.5764170728069526 1.926059038168598 -0.54637684433657219 4.6933399089395307 1.9497056705050599 -0.5662446947437787 4.8102627450721087 1.9733523028415216 -0.58611254515098521 4.9271855812046859 1.9969989351779833 -0.62674039858770969 4.454719355469499 1.9038155064144087 -0.64660824899491609 4.571642191602078 1.9274621387508701 -0.6664760994021226 4.688565027734656 1.951108771087332 -0.68634394980932911 4.805487863867234 1.9747554034237937 -0.70621180021653562 4.9224106999998112 1.9984020357602554 -0.72697180324605393 4.3330216381320463 1.8815719746602191 -0.74683965365326044 4.4499444742646244 1.9052186069966808 -0.76670750406046684 4.5668673103972024 1.9288652393331422 -0.78657535446767346 4.6837901465297804 1.9525118716696042 -0.80644320487487997 4.8007129826623585 1.9761585040060659 -0.82631105528208637 4.9176358187949356 1.9998051363425275 -0.82720320790439794 4.2113239207945945 1.8593284429060295 -0.84707105831160434 4.3282467569271716 1.8829750752424912 -0.86693890871881096 4.4451695930597497 1.9066217075789529 -0.88680675912601736 4.5620924291923277 1.9302683399154146 -0.90667460953322387 4.6790152653249057 1.9539149722518763 -0.9265424599404305 4.7959381014574838 1.977561604588338 0.77419289619006504 4.1972614353001161 1.855492707221613 0.79308052224792114 4.3159805285216652 1.8794774335777567 0.81196814830577768 4.4346996217432144 1.9034621599339006 0.830855774363634 4.5534187149647645 1.9274468862900442 0.84974340042149032 4.6721378081863145 1.9514316126461879 0.86863102647934665 4.7908569014078637 1.9754163390023318 0.66594189836834716 4.2193851351798832 1.8577726223153608 0.68482952442620348 4.3381042284014324 1.8817573486715045 0.70371715048405981 4.4568233216229816 1.9057420750276484 0.72260477654191635 4.5755424148445316 1.929726801383792 0.74149240259977267 4.6942615080660817 1.9537115277399357 0.55769090054662906 4.2415088350596495 1.8600525374091086 0.57657852660448539 4.3602279282811995 1.8840372637652523 0.59546615266234171 4.4789470215027487 1.9080219901213962 0.61435377872019836 4.5976661147242988 1.9320067164775399 0.44943990272491136 4.2636325349394166 1.8623324525028564 0.46832752878276762 4.3823516281609667 1.8863171788590001 0.48721515484062394 4.5010707213825158 1.910301905215144 0.34118890490319359 4.2857562348191829 1.8646123675966042 0.36007653096104991 4.4044753280407329 1.8885970939527479 0.23293790708147583 4.30787993469895 1.8668922826903522 0.87658598579555502 4.9098876031993246 1.999248864553038 0.75099834690165124 4.8132480028744924 1.9775656455672219 0.62541070800774734 4.7166084025496602 1.9558824265814057 0.62677528494594892 4.8358269468571793 1.9796232031078549 0.49982306911384355 4.6199688022248271 1.9341992075955896 0.50118764605204502 4.7391873465323471 1.9579399841220386 0.50255222299024671 4.8584058908398662 1.9816807606484879 0.37423543021993971 4.523329201899994 1.9125159886097736 0.37560000715814118 4.642547746207514 1.9362567651362226 0.37696458409634265 4.761766290515034 1.9599975416626718 0.37832916103454434 4.8809848348225531 1.9837383181891208 0.24864779132603584 4.4266896015751618 1.8908327696239573 0.25001236826423739 4.5459081458826809 1.9145735461504065 0.25137694520243886 4.6651266901902009 1.9383143226768556 0.25274152214064033 4.78434523449772 1.9620550992033048 0.25410609907884202 4.90356377880524 1.985795875729754 0.12306015243213211 4.3300500012503287 1.8691495506381415 0.12442472937033358 4.4492685455578478 1.8928903271645905 0.12578930630853516 4.5684870898653678 1.9166311036910395 0.12715388324673657 4.6877056341728869 1.9403718802174887 0.12851846018493815 4.8069241784804069 1.964112656743938 0.12988303712313978 4.926142722787926 1.987853433270387 0.00020166741463114687 4.4718474895405347 1.8949478847052237 0.0015662443528327477 4.5910660338480538 1.9186886612316727 0.0029308212910341986 4.7102845781555738 1.9424294377581217 0.0042953982292357976 4.8295031224630929 1.9661702142845709 0.0056599751674373993 4.9487216667706129 1.9899109908110202 1.635695481146985 3.9764380224057283 1.8609086398467871 1.6721746434266112 4.0919993582704475 1.8851284001934872 1.7086538057062373 4.2075606941351662 1.9093481605401876 1.7451329679858634 4.3231220299998858 1.9335679208868877 1.7816121302654893 4.4386833658646045 1.9577876812335877 1.8180912925451151 4.5542447017293233 1.982007441580288 1.5335701489070388 4.0197771271856979 1.8632726629432934 1.5700493111866649 4.1353384630504166 1.8874924232899934 1.606528473466291 4.2508997989151363 1.9117121836366939 1.6430076357459171 4.3664611347798559 1.935931943983394 1.679486798025543 4.4820224706445737 1.960151704330094 1.4314448166670928 4.0631162319656671 1.8656366860397997 1.4679239789467189 4.1786775678303858 1.8898564463864997 1.504403141226345 4.2942389036951054 1.9140762067332002 1.5408823035059711 4.409800239559825 1.9382959670799003 1.3293194844271468 4.1064553367456362 1.868000709136306 1.3657986467067729 4.222016672610355 1.892220469483006 1.402277808986399 4.3375780084750746 1.9164402298297065 1.2271941521872007 4.1497944415256063 1.8703647322328123 1.2636733144668268 4.265355777390325 1.8945844925795126 1.0885896576676288 4.0775722104408567 1.8485089949826188 1.1250688199472545 4.1931335463055763 1.8727287553293186 0.98646432542768281 4.1209113152208259 1.8508730180791251 1.0229434877073085 4.2364726510855455 1.8750927784258251 0.88433899318773679 4.1642504200007959 1.8532370411756314 1.7046512034152292 4.6002260571632041 1.984220354451641 1.5683516949274137 4.5274655599089817 1.9623954006253972 1.5868380766070853 4.647228615418971 1.9863748647682955 1.4320521864395981 4.4547050626547593 1.9405704467991531 1.4505385681192695 4.5744681181647486 1.9645499109420517 1.4690249497989412 4.694231173674738 1.98852937508495 1.2957526779517821 4.3819445654005378 1.9187454929729095 1.3142390596314539 4.5017076209105262 1.9427249571158076 1.3327254413111254 4.6214706764205156 1.9667044212587061 1.351211822990797 4.7412337319305049 1.9906838854016045 1.1594531694639658 4.3091840681463145 1.8969205391466655 1.1779395511436377 4.4289471236563038 1.920900003289564 1.1964259328233093 4.5487101791662932 1.9448794674324623 1.214912314502981 4.6684732346762825 1.9688589315753606 1.2333986961826526 4.7882362901862718 1.9928383957182592 1.0416400426558219 4.3561866264020814 1.8990750494633202 1.0601264243354935 4.4759496819120699 1.9230545136062185 1.0786128060151652 4.5957127374220592 1.9470339777491168 1.0970991876948368 4.7154757929320485 1.9710134418920153 1.1155855693745085 4.8352388484420379 1.9949929060349136 0.90534053416800597 4.283426129147859 1.8772500956370763 0.92382691584767773 4.4031891846578475 1.9012295597799747 0.94231329752734938 4.5229522401678368 1.925209023922873 0.96079967920702103 4.6427152956778261 1.9491884880657715 0.97928606088669257 4.7624783511878155 1.9731679522086698 0.99777244256636433 4.8822414066978039 1.9971474163515683 2.3393731085960638 3.5281727427726199 1.8477792916498408 2.3968095926832311 3.6348277928526582 1.8719914732231484 2.4542460767703989 3.7414828429326965 1.896203654796456 2.5116825608575666 3.8481378930127339 1.9204158363697634 2.5691190449447339 3.9547929430927717 1.9446280179430711 2.6265555290319016 4.06144799317281 1.9688401995163787 2.2529103262913206 3.5836728868742496 1.8494159633738783 2.3103468103784879 3.6903279369542878 1.8736281449471857 2.3677832944656556 3.7969829870343261 1.8978403265204933 2.4252197785528233 3.9036380371143635 1.9220525080938009 2.4826562626399906 4.0102930871944018 1.9462646896671085 2.1664475439865774 3.6391730309758792 1.8510526350979157 2.2238840280737446 3.7458280810559175 1.8752648166712231 2.2813205121609124 3.8524831311359558 1.8994769982445308 2.3387569962480801 3.9591381812159931 1.9236891798178384 2.3961934803352474 4.0657932312960314 1.9479013613911458 2.0799847616818341 3.6946731750775088 1.852689306821953 2.1374212457690014 3.8013282251575471 1.8769014883952604 2.1948577298561691 3.9079832752375849 1.901113669968568 2.2522942139433364 4.0146383253176223 1.9253258515418756 1.9935219793770909 3.7501733191791384 1.8543259785459905 2.0509584634642581 3.8568283692591763 1.8785381601192979 2.1083949475514254 3.9634834193392146 1.9027503416926055 1.9070591970723474 3.8056734632807681 1.8559626502700277 1.9644956811595149 3.9123285133608059 1.8801748318433351 1.8205964147676039 3.8611736073823977 1.8575993219940652 1.7341336324628607 3.9166737514840273 1.8592359937181024 2.6771754153257756 4.1716246484104733 1.9930308858554853 2.5378796772468162 4.1180914579062984 1.9704698926202562 2.5742864143976854 4.2356109402911564 1.9946157596845828 2.4349906763187259 4.1820777497869823 1.9720547664493537 2.4713974134695951 4.2995972321718403 1.9962006335136806 2.295694938239766 4.1285445592828074 1.9494937732141244 2.3321016753906356 4.2460640416676654 1.9736396402784513 2.3685084125415052 4.3635835240525234 1.9977855073427782 2.1563992001608066 4.0750113687786325 1.9269327799788951 2.1928059373116762 4.1925308511634904 1.951078647043222 2.2292126744625458 4.3100503335483484 1.9752245141075488 2.265619411613415 4.4275698159332073 1.9993703811718759 2.0171034620818467 4.0214781782744575 1.9043717867436658 2.0535101992327167 4.1389976606593155 1.9285176538079929 2.0899169363835863 4.2565171430441735 1.9526635208723198 2.1263236735344555 4.3740366254290324 1.9768093879366466 1.8778077240028872 3.9679449877702822 1.8818107935084363 1.9142144611537566 4.0854644701551406 1.9059566605727636 1.9506211983046264 4.2029839525399986 1.9301025276370904 1.9870279354554961 4.3205034349248574 1.9542483947014173 2.0234346726063652 4.4380229173097163 1.9783942617657442 1.7749187230747971 4.0319312796509656 1.8833956673375341 1.8113254602256668 4.1494507620358236 1.9075415344018614 1.8477321973765364 4.2669702444206825 1.9316874014661882 1.884138934527406 4.3844897268055405 1.9558332685305151 1.9205456716782752 4.5020092091903994 1.979979135594842 3.4577516649242126 3.496745240876276 1.984144215432522 3.3807370756799453 3.4038453099625912 1.9600252898288111 3.3037224864356785 3.3109453790489063 1.9359063642251002 2.9999626876717569 3.0978501778245144 1.864465508435355 3.0769772769160242 3.1907501087381998 1.8885844340390661 3.1539918661602915 3.2836500396518846 1.9127033596427767 3.2310064554045583 3.3765499705655695 1.9368222852464878 3.3080210446488252 3.4694499014792544 1.9609412108501987 2.9272466566406368 3.1634547693411772 1.8653814294567426 3.0042612458849041 3.256354700254863 1.8895003550604534 3.0812758351291714 3.3492546311685478 1.9136192806641643 3.1582904243734382 3.4421545620822322 1.9377382062678754 2.8545306256095166 3.22905936085784 1.8662973504781299 2.9315452148537839 3.3219592917715257 1.890416276081841 3.0085598040980512 3.4148592226852106 1.9145352016855519 3.0855743933423181 3.5077591535988955 1.9386541272892628 2.7818145945783965 3.2946639523745032 1.8672132714995175 2.8588291838226638 3.3875638832881885 1.8913321971032284 2.9358437730669311 3.4804638142018733 1.9154511227069395 2.7090985635472764 3.3602685438911664 1.8681291925209049 2.7861131527915437 3.4531684748048517 1.892248118124616 2.6363825325161563 3.4258731354078291 1.8690451135422925 2.7133971217604236 3.5187730663215149 1.8931640391460034 2.5636665014850362 3.4914777269244923 1.8699610345636799 3.3789158461169571 3.5673998449843873 1.9850644058314399 3.2346182304797022 3.5356212223697745 1.9618576109954715 3.2920045095207686 3.64471831849588 1.9859902299933996 3.1477068938835142 3.6129396958812667 1.9627834351574311 3.2050931729245802 3.7220367920073723 1.9869160541553592 3.0034092782462594 3.5811610732666543 1.9395766403214629 3.0607955572873258 3.6902581693927594 1.9637092593193908 3.1181818363283922 3.7993552655188649 1.9878418783173186 2.8591116626090041 3.5493824506520419 1.9163698454854945 2.9164979416500709 3.658479546778147 1.9405024644834223 2.9738842206911373 3.7675766429042516 1.9646350834813502 3.0312704997322042 3.8766737390303572 1.9887677024792783 2.7722003260128161 3.6267009241635342 1.9172956696474539 2.8295866050538825 3.7357980202896393 1.9414282886453818 2.8869728840949489 3.8448951164157443 1.9655609076433098 2.9443591631360158 3.9539922125418498 1.9896935266412377 2.6279027103755612 3.5949223015489213 1.8940888748114855 2.6852889894166276 3.7040193976750269 1.9182214938094133 2.742675268457694 3.8131164938011315 1.9423541128073414 2.8000615474987609 3.9222135899272366 1.9664867318052692 2.8574478265398273 4.0313106860533425 1.9906193508031973 2.4836050947383059 3.5631436789343085 1.870882079975517 2.5409913737793728 3.6722407750604136 1.8950146989734451 2.5983776528204396 3.7813378711865191 1.9191473179713729 2.6557639318615056 3.8904349673126242 1.9432799369693008 2.7131502109025725 3.9995320634387292 1.9674125559672289 2.7705364899436393 4.1086291595648348 1.9915451749651567 3.5525352453348118 2.4129610165779232 1.8602854048638575 3.6459832905709106 2.4886142968975284 1.8843164041077443 3.7394313358070099 2.5642675772171337 1.9083474033516312 3.8328793810431088 2.6399208575367386 1.932378402595518 3.9263274262792081 2.7155741378563438 1.9564094018394047 4.0197754715153078 2.7912274181759487 1.9804404010832912 3.4933046303002184 2.4884728483364151 1.8607088025640379 3.5867526755363173 2.5641261286560204 1.8847398018079247 3.6802007207724166 2.6397794089756257 1.9087708010518116 3.7736487660085154 2.7154326892952305 1.9328018002956984 3.8670968112446147 2.7910859696148358 1.9568327995395849 3.4340740152656251 2.5639846800949071 1.8611322002642183 3.5275220605017239 2.6396379604145124 1.8851631995081051 3.6209701057378232 2.7152912407341177 1.909194198751992 3.7144181509739225 2.7909445210537225 1.9332251979958786 3.3748434002310317 2.6394965118533991 1.8615555979643987 3.4682914454671305 2.7151497921730043 1.8855865972082855 3.5617394907032298 2.7908030724926096 1.9096175964521724 3.6551875359393291 2.8664563528122144 1.933648595696059 3.3156127851964383 2.715008343611891 1.8619789956645791 3.4090608304325372 2.7906616239314963 1.8860099949084659 3.5025088756686364 2.8663149042511016 1.9100409941523526 3.2563821701618449 2.790520175370383 1.8624023933647595 3.3498302153979438 2.8661734556899883 1.8864333926086463 3.1971515551272516 2.866032007128875 1.86282579106494 3.1379209400926578 2.9415438388873669 1.8632491887651201 3.9514629474021619 2.8779565040143344 1.9808829347988341 3.8037483321483525 2.8716838605979556 1.9572648737756415 3.8810244875714632 2.9673113771068143 1.9813299479622772 3.7333098723176543 2.9610387336904354 1.9577118869390846 3.810586027740765 3.0566662501992941 1.9817769611257203 3.585595257063845 2.9547660902740569 1.934093825915892 3.6628714124869557 3.0503936067829152 1.9581589001025277 3.7401475679100669 3.1460211232917739 1.9822239742891632 3.4378806418100356 2.9484934468576784 1.9104757648926993 3.5151567972331468 3.0441209633665367 1.9345408390793351 3.5924329526562575 3.139748479875395 1.9586059132659706 3.6697091080793687 3.2353759963842532 1.9826709874526063 3.2901660265562263 2.9422208034413 1.8868577038695067 3.3674421819793374 3.0378483199501582 1.9109227780561422 3.4447183374024481 3.1334758364590165 1.9349878522427781 3.5219944928255589 3.2291033529678748 1.9590529264294136 3.59927064824867 3.324730869476733 1.9831180006160491 3.2197275667255281 3.0315756765337798 1.8873047170329498 3.2970037221486392 3.1272031930426381 1.9113697912195853 3.37427987757175 3.2228307095514963 1.935434865406221 3.4515560329948607 3.3184582260603541 1.9594999395928565 3.5288321884179714 3.4140857425692124 1.9835650137794922 3.0720129514717187 3.0253030331174009 1.8636866560097569 3.1492891068948299 3.1209305496262596 1.8877517301963926 3.2265652623179406 3.2165580661351179 1.9118168043830281 3.9624561678575301 1.6474610485892132 1.859139916555359 4.0686226548824695 1.7031503144312543 1.8831013537434815 4.174789141907409 1.7588395802732952 1.9070627909316038 4.2809556289323485 1.8145288461153362 1.9310242281197263 4.387122115957288 1.8702181119573771 1.9549856653078486 4.4932886029822274 1.925907377799418 1.9789471024959711 3.9181045840996163 1.7316426241530274 1.8592535084528496 4.0242710711245557 1.7873318899950685 1.8832149456409721 4.1304375581494952 1.8430211558371095 1.9071763828290944 4.2366040451744347 1.8987104216791504 1.9311378200172169 4.3427705321993741 1.9543996875211913 1.9550992572053392 3.8737530003417024 1.8158241997168416 1.8593671003503403 3.9799194873666419 1.8715134655588828 1.8833285375384627 4.0860859743915814 1.9272027314009237 1.907289974726585 4.1922524614165209 1.9828919972429646 1.9312514119147075 4.2984189484414603 2.0385812630850055 1.95521284910283 3.8294014165837886 1.9000057752806558 1.8594806922478309 3.9355679036087281 1.955695041122697 1.8834421294359533 4.0417343906336676 2.0113843069647377 1.9074035666240756 4.147900877658607 2.0670735728067791 1.9313650038121981 3.7850498328258748 1.9841873508444698 1.8595942841453215 3.8912163198508138 2.0398766166865112 1.883555721333444 3.9973828068757533 2.0955658825285517 1.9075171585215662 3.7406982490679606 2.0683689264082843 1.8597078760428121 3.8468647360928996 2.1240581922503257 1.8836693132309346 3.9530312231178391 2.1797474580923661 1.9076307504190568 3.6963466653100467 2.1525505019720983 1.8598214679403027 3.8025131523349858 2.2082397678141397 1.8837829051284252 3.6519950815521325 2.2367320775359123 1.8599350598377933 4.4454688322657931 2.0166911214113501 1.9790714022164795 4.3930344301170781 2.1162594468697713 1.9792099493398125 4.2463717103427721 2.1374125688409018 1.9553502008799557 4.3406000279683621 2.2158277723281925 1.9793484964631456 4.099708990568466 2.1585656908120323 1.9314904524200991 4.1939373081940561 2.236980894299323 1.9554887480032888 4.288165625819647 2.3153960977866137 1.9794870435864784 4.0472745884197501 2.2581340162704535 1.9316289995434321 4.1415029060453401 2.3365492197577442 1.9556272951266218 4.235731223670931 2.4149644232450349 1.9796255907098115 3.9006118686454441 2.279287138241584 1.9077692510835753 3.9948401862710345 2.3577023417288747 1.931767546666765 4.089068503896625 2.4361175452161654 1.9557658422499546 4.1832968215222159 2.5145327487034561 1.9797641378331443 3.7539491488711381 2.3004402602127145 1.8839095026237185 3.8481774664967285 2.3788554637000052 1.9079077982069084 3.942405784122319 2.4572706671872959 1.931906093790098 4.0366341017479099 2.5356858706745862 1.9559043893732877 4.1308624193735 2.6141010741618769 1.9799026849564774 3.6072864290968325 2.3215933821838446 1.8600497541638619 3.7015147467224225 2.4000085856711357 1.8840480497470515 3.7957430643480135 2.4784237891584264 1.9080463453302412 3.8899713819736035 2.5568389926457167 1.9320446409134309 3.9841996995991944 2.6352541961330074 1.9560429364966205 4.0784280172247849 2.7136693996202981 1.9800412320798102 4.7914163643635588 0.99078300162251942 1.979369935488331 4.6766635269162435 0.95704752010829175 1.9554640052376924 4.5619106894689265 0.92331203859406419 1.9315580749870538 4.4471578520216113 0.88957655707983663 1.907652144736415 4.1897607799632173 0.91265733988044295 1.8597594111549751 4.3045136174105343 0.94639282139467051 1.8836653414056139 4.4192664548578504 0.98012830290889796 1.9075712716562525 4.5340192923051656 1.0138637844231255 1.9314772019068913 4.6487721297524827 1.0475992659373532 1.9553831321575299 4.1618693827994564 1.0032090857095044 1.8596785380748126 4.2766222202467734 1.0369445672237321 1.8835844683254515 4.3913750576940895 1.0706800487379595 1.90749039857609 4.5061278951414048 1.104415530252187 1.9313963288267288 4.6208807325887218 1.1381510117664146 1.9553022590773674 4.1339779856356955 1.0937608315385656 1.8595976649946502 4.2487308230830125 1.1274963130527933 1.883503595245289 4.3634836605303287 1.1612317945670207 1.9074095254959276 4.4782364979776448 1.1949672760812484 1.9313154557465664 4.1060865884719346 1.1843125773676269 1.8595167919144877 4.2208394259192517 1.2180480588818545 1.8834227221651265 4.3355922633665678 1.2517835403960822 1.9073286524157651 4.0781951913081738 1.2748643231966883 1.8594359188343252 4.1929480287554908 1.3085998047109157 1.883341849084964 4.3077008662028078 1.3423352862251434 1.9072477793356026 4.0503037941444129 1.3654160690257497 1.8593550457541628 4.1650566315917299 1.3991515505399774 1.8832609760048016 4.0224123969806529 1.455967814854811 1.8592741726740005 3.994520999816892 1.5465195606838724 1.8591932995938381 4.7625503045192259 1.0846311805914373 1.9792939013770079 4.7298085369215839 1.1915874960808974 1.979237109234647 4.5895741967886767 1.2402531907886778 1.9552383413498333 4.6970667693239418 1.2985438115703576 1.9791803170922861 4.4493398566557705 1.2889188854964582 1.9312395734650196 4.5568324291910347 1.347209506278138 1.9551815492074724 4.6643250017262998 1.4055001270598177 1.9791235249499253 4.4165980890581285 1.3958752009859183 1.9311827813226587 4.5240906615933927 1.4541658217675981 1.9551247570651116 4.6315832341286569 1.5124564425492779 1.9790667328075644 4.2763637489252213 1.4445408956936985 1.9071840134378448 4.3838563214604855 1.5028315164753785 1.9311259891802979 4.4913488939957507 1.5611221372570583 1.9550679649227507 4.5988414665310149 1.6194127580387381 1.9790099406652035 4.1361294087923133 1.4932065904014786 1.8831852455530314 4.2436219813275784 1.5514972111831589 1.907127221295484 4.3511145538628435 1.6097878319648387 1.9310691970379368 4.4586071263981077 1.6680784527465187 1.9550111727803896 4.566099698933372 1.7263690735281985 1.9789531485228424 4.1033876411946713 1.6001629058909388 1.8831284534106705 4.2108802137299364 1.658453526672619 1.9070704291531231 4.3183727862652006 1.7167441474542988 1.9310124048955759 4.4258653588004657 1.7750347682359788 1.9549543806380287 4.53335793133573 1.8333253890176586 1.9788963563804816 4.9027014791338557 0.01743398803951814 1.9809876728898603 4.7837986120925189 0.0068334605697099437 1.9571287455076865 4.2979054696273087 0.058344608496654349 1.8614877532949192 4.4168083366686464 0.068945135966462456 1.8853466806770929 4.535711203709984 0.079545663436270564 1.9092056080592668 4.6546140707513208 0.090146190906078727 1.9330645354414404 4.7735169377926585 0.10074671837588686 1.9569234628236141 4.2876237953274483 0.15225786630283134 1.8612824706108468 4.406526662368786 0.1628583937726395 1.8851413979930205 4.5254295294101237 0.17345892124244761 1.9090003253751944 4.6443323964514605 0.18405944871225577 1.932859252757368 4.7632352634927972 0.1946599761820639 1.9567181801395417 4.2773421210275879 0.24617112410900821 1.8610771879267745 4.3962449880689256 0.25677165157881637 1.8849361153089481 4.5151478551102633 0.26737217904862454 1.908795042691122 4.6340507221516001 0.27797270651843264 1.9326539700732956 4.2670604467277276 0.34008438191518514 1.8608719052427021 4.3859633137690652 0.3506849093849933 1.8847308326248757 4.504866180810402 0.36128543685480152 1.9085897600070496 4.2567787724278672 0.43399763972136207 1.8606666225586297 4.3756816394692049 0.44459816719117018 1.8845255499408033 4.4945845065105416 0.45519869466097845 1.908384477322977 4.2464970981280068 0.52791089752753917 1.8604613398745573 4.3653999651693436 0.53851142499734739 1.884320267256731 4.2362154238281464 0.62182415533371604 1.8602560571904847 4.2259337495282852 0.71573741313989303 1.8600507745064123 4.8923025300006966 0.11262946321943912 1.9807841829144888 4.8804799672092374 0.2233899331628183 1.9806024548510335 4.7520803515978516 0.29812072499151576 1.9565262461048836 4.8686574044177782 0.33415040310619737 1.9804207267875782 4.6236807359864649 0.37285151682021322 1.9324500373587334 4.7402577888063924 0.40888119493489483 1.9563445180414283 4.856834841626319 0.44491087304957644 1.9802389987241229 4.6118581731950057 0.48361198676359224 1.9322683092952782 4.7284352260149332 0.5196416648782739 1.956162789977973 4.8450122788348597 0.55567134299295551 1.9800572706606676 4.483458557583619 0.55834277859229009 1.908192100549128 4.6000356104035465 0.59437245670697147 1.9320865812318229 4.7166126632234739 0.63040213482165319 1.9559810619145175 4.8331897160434005 0.66643181293633491 1.9798755425972121 4.3550589419722323 0.63307357042098733 1.8841158918029781 4.4716359947921598 0.66910324853566905 1.9080103724856727 4.5882130476120873 0.70513292665035054 1.9319048531683676 4.7047901004320147 0.74116260476503226 1.9557993338510622 4.8213671532519413 0.77719228287971398 1.9796938145337568 4.3432363791807731 0.7438340403643664 1.8839341637395228 4.4598134320007006 0.77986371847904801 1.9078286444222174 4.576390484820628 0.81589339659372961 1.9317231251049121 4.6929675376405555 0.85192307470841133 1.9556176057876067 4.8095445904604821 0.88795275282309305 1.9795120864703013 4.2148367635693864 0.81856483219306375 1.8598579549933727 4.3314138163893148 0.85459451030774547 1.8837524356760675 4.8219837777825116 -0.95817556142858251 1.9833621408220279 4.2374546613683517 -0.80007038757737203 1.8639946069992748 4.3559216015212181 -0.81291845865134815 1.8878108551143875 4.4743885416740836 -0.82576652972532427 1.9116271032295002 4.5928554818269491 -0.8386146007993005 1.935443351344613 4.7113224219798147 -0.85146267187327662 1.9592595994597257 4.2452602457185193 -0.70620556909604248 1.8637083137520853 4.3637271858713857 -0.71905364017001849 1.8875245618671981 4.4821941260242513 -0.73190171124399472 1.9113408099823108 4.6006610661771168 -0.74474978231797095 1.9351570580974238 4.7191280063299823 -0.75759785339194707 1.9589733062125363 4.253065830068687 -0.61234075061471271 1.8634220205048959 4.3715327702215534 -0.62518882168868872 1.8872382686200089 4.4899997103744189 -0.63803689276266495 1.9110545167351216 4.6084666505272844 -0.65088496383664107 1.9348707648502343 4.2608714144188546 -0.51847593213338317 1.8631357272577067 4.379338354571721 -0.53132400320735917 1.8869519753728194 4.4978052947245866 -0.54417207428133541 1.9107682234879322 4.6162722348774521 -0.55702014535531152 1.9345844716030451 4.2686769987690223 -0.42461111365205356 1.8628494340105173 4.3871439389218887 -0.43745918472602963 1.8866656821256302 4.5056108790747542 -0.45030725580000575 1.910481930240743 4.2764825831191899 -0.33074629517072396 1.8625631407633281 4.3949495232720563 -0.34359436624470002 1.8863793888784408 4.2842881674693585 -0.2368814766893941 1.8622768475161386 4.402755107622224 -0.24972954776337017 1.8860930956312516 4.2920937518195261 -0.14301665820806472 1.8619905542689494 4.8298411289657652 -0.86382091152615892 1.983076548273293 4.8394092862520344 -0.75327816328525532 1.9828141126209959 4.7278340122793541 -0.65521300837557483 1.9586992007694974 4.8489774435383026 -0.64273541504435172 1.9825516769686988 4.7374021695656232 -0.54467026013467135 1.9584367651172003 4.8585456008245718 -0.53219266680344823 1.9822892413164015 4.6258268955929429 -0.44660510522499092 1.9343218532657016 4.7469703268518915 -0.43412751189376786 1.958174329464903 4.86811375811084 -0.42164991856254475 1.9820268056641044 4.5142516216202626 -0.34853995031531032 1.9102069414142033 4.6353950528792121 -0.33606235698408737 1.9340594176134045 4.7565384841381606 -0.32358476365286432 1.9579118938126059 4.8776819153971092 -0.3111071703216412 1.9817643700118071 4.5238197789065318 -0.23799720207440686 1.909944505761906 4.6449632101654812 -0.22551960874318386 1.9337969819611074 4.7661066414244289 -0.21304201541196083 1.9576494581603086 4.8872500726833774 -0.20056442208073774 1.9815019343595099 4.4122445049338515 -0.13993204716472629 1.8858295939104075 4.5333879361928009 -0.12745445383350329 1.9096820701096089 4.6545313674517494 -0.11497686050228022 1.9335345463088101 4.775674798710698 -0.10249926717105724 1.9573870225080114 4.8968182299696466 -0.090021673839834143 1.9812394987072126 4.3006692309611712 -0.04186689225504589 1.861714682058909 4.4218126622201206 -0.029389298923822818 1.8855671582581104 4.54295609347907 -0.01691170559259984 1.9094196344573116 4.6640995247380186 -0.0044341122613767419 1.9332721106565129 4.0102255758476195 -1.6293293775211963 1.8670017618304346 4.1237146017069257 -1.6649709711910616 1.8907765587826066 4.2372036275662328 -1.7006125648609272 1.9145513557347784 4.3506926534255399 -1.7362541585307925 1.93832615268695 4.464181679284847 -1.771895752200658 1.9621009496391215 4.035828595796306 -1.5390764220344049 1.8666622769384951 4.1493176216556122 -1.5747180157042704 1.8904370738906671 4.2628066475149193 -1.6103596093741359 1.9142118708428388 4.3762956733742264 -1.6460012030440012 1.9379866677950104 4.4897846992335335 -1.6816427967138667 1.9617614647471819 4.0614316157449926 -1.4488234665476134 1.8663227920465555 4.1749206416042988 -1.4844650602174791 1.8900975889987275 4.2884096674636059 -1.5201066538873447 1.9138723859508993 4.4018986933229129 -1.55574824755721 1.9376471829030708 4.0870346356936791 -1.3585705110608222 1.8659833071546159 4.2005236615529853 -1.3942121047306879 1.8897581041067879 4.3140126874122924 -1.4298536984005534 1.9135329010589597 4.1126376556423656 -1.2683175555740309 1.8656438222626766 4.2261266815016718 -1.3039591492438967 1.8894186192148483 4.3396157073609789 -1.3396007429137622 1.9131934161670201 4.1382406755910512 -1.1780646000872397 1.865304337370737 4.2517297014503583 -1.2137061937571054 1.8890791343229087 4.1638436955397378 -1.0878116446004482 1.8649648524787976 4.277332721399044 -1.123453238270314 1.8887396494309694 4.1894467154884234 -0.99755868911365697 1.864625367586858 4.5779517391122129 -1.8066355313969142 1.9858771756595404 4.6084848224203094 -1.7005624153650203 1.9855627603243233 4.5179984079841198 -1.5830123594447112 1.9614352553055221 4.639017905728406 -1.5944892993331261 1.9852483449891061 4.4275119935479292 -1.4654623035244021 1.9373077502867211 4.5485314912922163 -1.4769392434128172 1.9611208399703051 4.6695509890365026 -1.4884161833012324 1.984933929653889 4.4580450768560258 -1.3593891874925081 1.9369933349515041 4.5790645746003129 -1.3708661273809235 1.960806424635088 4.7000840723445991 -1.3823430672693386 1.9846195143186718 4.3675586624198361 -1.2418391315721993 1.912865829932703 4.4885781601641224 -1.2533160714606142 1.936678919616287 4.6095976579084095 -1.2647930113490296 1.9604920092998708 4.7306171556526957 -1.2762699512374449 1.9843050989834548 4.3980917457279327 -1.1357660155403051 1.912551414597486 4.5191112434722189 -1.14724295542872 1.9363645042810698 4.640130741216506 -1.1587198953171354 1.9601775939646537 4.7611502389607931 -1.1701968352055507 1.9839906836482375 4.3076053312917431 -1.0182159596199962 1.888423909578685 4.4286248290360293 -1.0296928995084111 1.912236999262269 4.5496443267803155 -1.0411698393968263 1.9360500889458527 4.6706638245246035 -1.0526467792852414 1.9598631786294365 4.7916833222688897 -1.0641237191736568 1.9836762683130205 4.2171189168555525 -0.90066590369968713 1.864296404559884 4.3381384145998396 -0.91214284358810227 1.888109494243468 4.4591579123441267 -0.92361978347651719 1.9119225839270517 4.5801774100884129 -0.93509672336493233 1.9357356736106355 4.7011969078327001 -0.94657366325334769 1.9595487632942195 3.6253831200974815 -2.39685259540523 1.8703306760942469 3.7297047740397713 -2.4535561362456244 1.894062482778901 3.8340264279820611 -2.5102596770860188 1.9177942894635549 3.9383480819243504 -2.5669632179264128 1.9415260961482088 4.0426697358666397 -2.6236667587668072 1.9652579028328629 3.6677312268550666 -2.3136487241380257 1.8699560432147495 3.7720528807973563 -2.3703522649784201 1.8936878498994036 3.8763745347396461 -2.4270558058188141 1.9174196565840576 3.9806961886819354 -2.4837593466592081 1.9411514632687115 4.0850178426242252 -2.5404628874996025 1.9648832699533654 3.7100793336126516 -2.2304448528708214 1.8695814103352522 3.8144009875549414 -2.2871483937112158 1.8933132170199063 3.9187226414972312 -2.3438519345516093 1.91704502370456 4.0230442954395205 -2.4005554753920038 1.9407768303892141 3.7524274403702367 -2.1472409816036166 1.8692067774557548 3.8567490943125264 -2.2039445224440111 1.8929385841404087 3.9610707482548162 -2.2606480632844046 1.9166703908250626 3.7947755471278217 -2.0640371103364124 1.8688321445762572 3.8990972010701115 -2.1207406511768063 1.8925639512609114 4.0034188550124012 -2.1774441920172003 1.9162957579455651 3.8371236538854068 -1.9808332390692078 1.8684575116967599 3.9414453078276965 -2.0375367799096016 1.8921893183814138 3.8794717606429918 -1.8976293678020033 1.8680828788172623 3.9218198674005769 -1.8144254965347986 1.867708245937765 4.1483202079898209 -2.6779340482026734 1.9889944009888685 4.1984164133825903 -2.5805248353365657 1.98864712323086 4.1322631149603755 -2.4482805670430703 1.9645259268072157 4.2485126187753597 -2.483115622470458 1.9882998454728515 4.0661098165381597 -2.3160362987495748 1.9404047303835714 4.1823593203531448 -2.3508713541769621 1.9641786490492072 4.2986088241681299 -2.3857064096043499 1.9879525677148431 4.1162060219309291 -2.2186270858834671 1.940057452625563 4.2324555257459142 -2.2534621413108544 1.9638313712911988 4.3487050295608993 -2.2882971967382417 1.9876052899568346 4.0500527235087143 -2.0863828175899717 1.9159362562019187 4.1663022273236994 -2.1212178730173594 1.9397101748675547 4.2825517311386845 -2.1560529284447467 1.9634840935331905 4.3988012349536696 -2.190887983872134 1.9872580121988261 3.983899425086499 -1.9541385492964767 1.8918150597782746 4.1001489289014836 -1.988973604723864 1.9155889784439104 4.2163984327164687 -2.0238086601512513 1.9393628971095462 4.3326479365314539 -2.0586437155786386 1.9631368157751821 4.448897440346439 -2.0934787710060259 1.9869107344408179 4.0339956304792688 -1.856729336430369 1.8914677820202661 4.1502451342942539 -1.8915643918577563 1.9152417006859022 4.266494638109239 -1.9263994472851436 1.939015619351538 4.3827441419242241 -1.9612345027125306 1.9627895380171738 4.4989936457392092 -1.9960695581399179 1.9865634566828094 3.9678423320570531 -1.7244850681368737 1.8673465855966218 4.0840918358720382 -1.759320123564261 1.8911205042622576 4.2003413396870233 -1.7941551789916483 1.9148944229278937 4.3165908435020084 -1.8289902344190356 1.9386683415935295 4.4328403473169935 -1.8638252898464227 1.9624422602591653 4.5490898511319786 -1.89866034527381 1.9862161789248012 3.0056916694091225 -2.9997127906648844 1.8501948414214797 3.0975411557847377 -3.0745759963196697 1.87387867394022 3.1893906421603533 -3.149439201974455 1.8975625064589603 3.2812401285359685 -3.2243024076292395 1.9212463389777006 3.3730896149115841 -3.2991656132840248 1.9449301714964411 3.4649391012871997 -3.3740288189388101 1.9686140040151814 3.0632192175999502 -2.9264635985399385 1.8497952118184424 3.1550687039755654 -3.0013268041947239 1.8734790443371829 3.246918190351181 -3.0761900098495092 1.8971628768559232 3.3387676767267966 -3.1510532155042936 1.9208467093746635 3.4306171631024123 -3.225916421159079 1.944530541893404 3.5224666494780275 -3.3007796268138643 1.9682143744121443 3.1207467657907779 -2.8532144064149927 1.8493955822154053 3.2125962521663931 -2.928077612069778 1.8730794147341459 3.3044457385420092 -3.0029408177245633 1.8967632472528861 3.3962952249176244 -3.0778040233793478 1.9204470797716264 3.48814471129324 -3.1526672290341331 1.9441309122903667 3.1782743139816061 -2.7799652142900468 1.848995952612368 3.2701238003572213 -2.8548284199448317 1.8726797851311086 3.3619732867328374 -2.929691625599617 1.8963636176498488 3.4538227731084525 -3.0045548312544019 1.9200474501685894 3.2358018621724338 -2.706716022165101 1.848596323009331 3.3276513485480494 -2.7815792278198859 1.8722801555280715 3.4195008349236651 -2.8564424334746712 1.8959639880468118 3.5113503212992807 -2.9313056391294561 1.9196478205655521 3.293329410363262 -2.6334668300401547 1.8481966934062937 3.3851788967388772 -2.7083300356949396 1.8718805259250342 3.4770283831144928 -2.7831932413497249 1.8955643584437745 3.3508569585540897 -2.5602176379152088 1.8477970638032566 3.4427064449297049 -2.6350808435699937 1.8714808963219971 3.5002339931205331 -2.5618316514450474 1.8710812667189598 3.5605680685331196 -3.4443810160383945 1.9923097939827843 3.6279889016394593 -3.3593236697186324 1.9919414645642224 3.5881643618517369 -3.2177789154218281 1.96784059341736 3.6954097347457986 -3.2742663233988702 1.9915731351456603 3.5483398220640145 -3.0762341611250235 1.9437397222704975 3.6555851949580762 -3.132721569102066 1.967472263998798 3.7628305678521379 -3.1892089770791081 1.9912048057270983 3.6157606551703538 -2.9911768148052613 1.9433713928519356 3.7230060280644155 -3.0476642227823039 1.9671039345802359 3.8302514009584776 -3.104151630759346 1.9908364763085362 3.5759361153826315 -2.8496320605084571 1.9192705217050732 3.6831814882766931 -2.9061194684854992 1.9430030634333737 3.7904268611707548 -2.9626068764625417 1.966735605161674 3.8976722340648169 -3.0190942844395838 1.9904681468899743 3.5361115755949091 -2.7080873062116528 1.895169650558211 3.6433569484889707 -2.7645747141886949 1.9189021922865113 3.7506023213830324 -2.821062122165737 1.9426347340148116 3.8578476942770941 -2.8775495301427796 1.9663672757431119 3.9650930671711566 -2.9340369381198217 1.9900998174714122 3.6035324087012488 -2.6230299598918907 1.8948013211396491 3.7107777815953105 -2.6795173678689328 1.9185338628679494 3.8180231544893721 -2.7360047758459749 1.9422664045962497 3.9252685273834338 -2.792492183823017 1.96599894632455 4.0325139002774959 -2.8489795918000591 1.9897314880528503 3.563707868913526 -2.4814852055950865 1.8707004499927866 3.6709532418075881 -2.5379726135721286 1.8944329917210869 3.7781986147016497 -2.5944600215491707 1.9181655334493872 3.8854439875957114 -2.6509474295262128 1.9418980751776875 3.9926893604897735 -2.7074348375032549 1.9656306169059878 4.0999347333838356 -2.763922245480297 1.9893631586342881 2.7493064840356398 -4.0004803336129218 1.9721436568218935 2.6721024449912498 -3.9109056641818665 1.948514479731879 2.5948984059468603 -3.8213309947508112 1.9248853026418642 2.5176943669024707 -3.7317563253197559 1.9012561255518496 2.4404903278580803 -3.6421816558887006 1.8776269484618349 2.4345456856200207 -3.4913864555960514 1.8535745109482036 2.5117497246644107 -3.5809611250271063 1.8772036880382184 2.5889537637088011 -3.6705357944581616 1.9008328651282331 2.6661578027531907 -3.7601104638892173 1.9244620422182477 2.7433618417975802 -3.8496851333202726 1.9480912193082625 2.5058050824263516 -3.4301659247344571 1.8531512505245871 2.5830091214707416 -3.519740594165512 1.8767804276146018 2.6602131605151316 -3.6093152635965673 1.9004096047046164 2.7374171995595211 -3.6988899330276235 1.9240387817946312 2.8146212386039107 -3.7884646024586783 1.9476679588846457 2.577064479232682 -3.3689453938728628 1.8527279901009706 2.654268518277072 -3.4585200633039177 1.8763571671909851 2.731472557321462 -3.5480947327349734 1.8999863442809999 2.8086765963658515 -3.6376694021660292 1.9236155213710144 2.6483238760390129 -3.3077248630112686 1.8523047296773538 2.7255279150834029 -3.3972995324423234 1.8759339067673686 2.8027319541277929 -3.4868742018733792 1.8995630838573832 2.8799359931721824 -3.5764488713044349 1.9231922609473979 2.7195832728453433 -3.2465043321496743 1.8518814692537373 2.7967873118897333 -3.3360790015807291 1.8755106463437519 2.8739913509341233 -3.4256536710117849 1.8991398234337666 2.7908426696516742 -3.18528380128808 1.8514582088301206 2.8680467086960642 -3.2748584707191348 1.8750873859201354 2.8621020664580046 -3.1240632704264857 1.8510349484065041 2.9393061055023946 -3.213637939857541 1.8746641254965186 2.9333614632643354 -3.0628427395648914 1.8506116879828873 2.8334050482970814 -4.0845369262898759 1.9957944822500113 2.8209702106778813 -3.9389361948162929 1.9717216659663352 2.9160869343570068 -4.0141743340912175 1.9954070876621925 2.9036520967378068 -3.8685736026176345 1.9713342713785165 2.9987688204169323 -3.9438117418925591 1.9950196930743738 2.8912172591186072 -3.7229728711440515 1.9472614550948408 2.9863339827977322 -3.7982110104189761 1.9709468767906977 3.0814507064768577 -3.8734491496939008 1.994632298486555 2.9738991451785326 -3.6526102789453931 1.9468740605070221 3.0690158688576576 -3.7278484182203178 1.9705594822028791 3.1641325925367831 -3.8030865574952424 1.9942449038987362 2.9614643075593325 -3.5070095474718097 1.9228012442233462 3.056581031238458 -3.5822476867467348 1.9464866659192033 3.1516977549175831 -3.6574858260216594 1.9701720876150604 3.2468144785967086 -3.732723965296584 1.9938575093109177 2.9490294699401329 -3.3614088159982267 1.8987284279396701 3.044146193619258 -3.4366469552731513 1.9224138496355274 3.1392629172983835 -3.5118850945480764 1.9460992713313845 3.2343796409775085 -3.587123233823001 1.9697846930272418 3.329496364656634 -3.6623613730979256 1.9934701147230989 3.0317113560000584 -3.2910462237995683 1.8983410333518516 3.1268280796791834 -3.366284363074493 1.9220264550477086 3.2219448033583089 -3.441522502349418 1.9457118767435659 3.317061527037434 -3.5167606416243427 1.969397298439423 3.4121782507165594 -3.5919987808992673 1.9930827201352803 3.0192765183808588 -3.1454454923259854 1.8742682170681757 3.1143932420599838 -3.22068363160091 1.8979536387640328 3.2095099657391088 -3.2959217708758346 1.9216390604598901 3.3046266894182343 -3.3711599101507592 1.9453244821557472 3.3997434130973594 -3.4463980494256843 1.9690099038516045 3.4948601367764849 -3.5216361887006089 1.9926953255474615 1.9023696901529594 -4.48883858515629 1.9759449518306607 1.8421998819649055 -4.3872600759416933 1.9523700969577429 1.7820300737768513 -4.2856815667270967 1.9287952420848256 1.685477062910294 -3.9334967268045693 1.8576170059936203 1.7456468710983484 -4.035075236019166 1.8811918608665379 1.8058166792864025 -4.1366537452337635 1.9047667157394557 1.8659864874744567 -4.2382322544483593 1.9283415706123734 1.9261562956625107 -4.3398107636629568 1.9519164254852908 1.7694334766078992 -3.8860474145258324 1.8571633345211682 1.8296032847959536 -3.987625923740429 1.8807381893940858 1.8897730929840078 -4.0892044329550261 1.9043130442670035 1.9499429011720619 -4.1907829421696228 1.9278878991399213 2.0101127093601159 -4.2923614513842203 1.9514627540128386 1.8533898903055044 -3.8385981022470954 1.8567096630487161 1.9135596984935588 -3.9401766114616921 1.8802845179216336 1.973729506681613 -4.0417551206762896 1.9038593727945514 2.0338993148696671 -4.1433336298908863 1.9274342276674692 1.9373463040031098 -3.7911487899683585 1.856255991576264 1.997516112191164 -3.8927272991829551 1.8798308464491815 2.0576859203792179 -3.9943058083975527 1.9034057013220993 2.1178557285672723 -4.0958843176121489 1.9269805561950168 2.0213027177007152 -3.7436994776896215 1.8558023201038119 2.0814725258887692 -3.8452779869042182 1.8793771749767294 2.1416423340768231 -3.9468564961188153 1.9029520298496472 2.1052591313983204 -3.6962501654108846 1.8553486486313597 2.1654289395863744 -3.7978286746254812 1.8789235035042773 2.1892155450959256 -3.6488008531321476 1.8548949771589076 2.2493853532839796 -3.7503793623467443 1.8784698320318252 2.2731719587935313 -3.6013515408534107 1.8544413056864555 1.9703986299744332 -4.5863327413752852 1.999540332098283 1.9866884082600635 -4.4412009850145573 1.9754922265748331 2.0679616487485051 -4.5318121417334876 1.9991221964779855 2.0842514270341352 -4.3866803853727596 1.9750740909545357 2.1655246675225768 -4.4772915420916899 1.998704060857688 2.1005412053197658 -4.2415486290120326 1.9510259854310861 2.1818144458082069 -4.3321597857309619 1.9746559553342382 2.2630876862966485 -4.4227709424498931 1.9982859252373906 2.198104224093838 -4.1870280293702349 1.9506078498107886 2.2793774645822791 -4.2776391860891652 1.974237819713941 2.3606507050707206 -4.3682503428080954 1.9978677896170933 2.2143940023794682 -4.0418962730095069 1.9265597442873388 2.2956672428679097 -4.1325074297284372 1.9501897141904911 2.3769404833563508 -4.2231185864473684 1.9738196840936435 2.4582137238447923 -4.3137297431662986 1.9974496539967959 2.2306837806650983 -3.8967645166487794 1.902511638763889 2.3119570211535398 -3.9873756733677097 1.9261416086670413 2.3932302616419814 -4.0779868300866404 1.9497715785701939 2.4745035021304229 -4.1685979868055707 1.9734015484733463 2.555776742618864 -4.259209143524501 1.9970315183764986 2.32824679943917 -3.8422439170069822 1.9020935031435915 2.409520039927612 -3.9328550737259125 1.9257234730467438 2.4907932804160531 -4.0234662304448428 1.9493534429498964 2.5720665209044946 -4.114077387163773 1.9729834128530488 2.6533397613929361 -4.2046885438827042 1.9966133827562011 2.3445365777248002 -3.6971121606462538 1.8780453976201414 2.4258098182132422 -3.7877233173651845 1.901675367523294 2.5070830587016841 -3.8783344740841148 1.9253053374264466 2.5883562991901252 -3.9689456308030455 1.9489353073295992 2.6696295396785668 -4.0595567875219762 1.9725652772327515 2.7509027801670083 -4.1501679442409065 1.9961952471359039 2.3608263560104308 -3.5519804042855259 1.8539972920966918 1.0188415498269316 -4.7846991805623 1.9797131250477544 0.98016671194085248 -4.673377855767872 1.9561769499010697 0.94149187405477308 -4.562056530973444 1.9326407747543848 0.9028170361686938 -4.4507352061790151 1.9091045996077001 0.86414219828261429 -4.3394138813845862 1.8855684244610151 0.92058352910415187 -4.1966537916962494 1.8615377078639779 0.95925836699023126 -4.3079751164906774 1.8850738830106628 0.99793320487631076 -4.4192964412851063 1.9086100581573477 1.03660804276239 -4.5306177660795353 1.9321462333040325 1.0752828806484696 -4.6419390908739633 1.9556824084507174 1.0156996978117689 -4.1652150268023407 1.8610431664136255 1.0543745356978484 -4.2765363515967687 1.8845793415603105 1.093049373583928 -4.3878576763911976 1.9081155167069954 1.1317242114700072 -4.4991790011856256 1.9316516918536801 1.1108158665193861 -4.1337762619084319 1.8605486249632732 1.1494907044054654 -4.24509758670286 1.8840848001099582 1.1881655422915449 -4.356418911497288 1.9076209752566431 1.2268403801776242 -4.467740236291716 1.9311571504033278 1.2059320352270033 -4.1023374970145223 1.8600540835129209 1.2446068731130826 -4.2136588218089503 1.8835902586596056 1.2832817109991621 -4.3249801466033784 1.9071264338062905 1.3010482039346203 -4.0708987321206136 1.8595595420625686 1.3397230418206996 -4.1822200569150416 1.8830957172092533 1.3961643726422373 -4.0394599672267049 1.859065000612216 1.4348392105283168 -4.150781292021132 1.8826011757589007 1.4912805413498544 -4.0080212023327952 1.8585704591618637 1.1236402078118515 -4.7503913738060293 1.9792316107169499 1.1713721327068178 -4.6102119892942222 1.9551891762167013 1.2366086128124887 -4.713662769512915 1.9787610882156226 1.2843405377074548 -4.5734833850011078 1.954718653715374 1.3495770178131257 -4.6769341652198007 1.9782905657142953 1.3320724626024212 -4.4333040004893016 1.9306762192151254 1.3973089427080918 -4.5367547807079935 1.9542481312140467 1.4625454228137627 -4.6402055609266855 1.977820043212968 1.3798043874973875 -4.2931246159774945 1.9066337847148767 1.4450408676030584 -4.3965753961961873 1.9302056967137982 1.510277347708729 -4.5000261764148792 1.9537776087127194 1.5755138278143999 -4.6034769566335711 1.9773495207116407 1.4927727924980247 -4.2563960116843802 1.9061632622135494 1.5580092726036956 -4.359846791903073 1.9297351742124709 1.6232457527093662 -4.4632975721217649 1.9533070862113922 1.6884822328150371 -4.566748352340456 1.9768789982103134 1.5405047173929909 -4.116216627172574 1.8821208277133008 1.605741197498662 -4.2196674073912659 1.9056927397122221 1.6709776776043326 -4.3231181876099587 1.9292646517111436 1.7362141577100034 -4.4265689678286497 1.9528365637100649 1.8014506378156743 -4.5300197480473416 1.9764084757089861 1.8666871179213451 -4.6334705282660327 1.9999803877079074 1.588236642287957 -3.9760372426607677 1.8580783932130522 1.6534731223936279 -4.0794880228794597 1.8816503052119733 1.7187096024992989 -4.1829388030981525 1.9052222172108948 0.70409607274653863 -4.2398178045061332 1.8625844174094819 0.60092215049414432 -4.252727301872266 1.8631309794584414 0.61269673268768965 -4.3698294362622248 1.8866547199377497 0.49774822824175002 -4.2656367992383988 1.8636775415074009 0.50952281043529535 -4.3827389336283575 1.8872012819867092 0.39457430598935572 -4.2785462966045316 1.8642241035563605 0.40634888818290105 -4.3956484309944903 1.8877478440356688 0.41812347037644626 -4.51275056538445 1.911271584514977 0.29140038373696131 -4.2914557939706643 1.86477066560532 0.30317496593050663 -4.4085579283606231 1.8882944060846283 0.31494954812405185 -4.5256600627505827 1.9118181465639366 0.32672413031759706 -4.6427621971405415 1.9353418870432448 0.18822646148456706 -4.3043652913367971 1.8653172276542795 0.20000104367811233 -4.4214674257267559 1.8888409681335878 0.21177562587165755 -4.5385695601167155 1.9123647086128961 0.22355020806520276 -4.6556716945066743 1.9358884490922044 0.085052539232172791 -4.3172747887029299 1.8658637897032391 0.096827121425718046 -4.4343769230928896 1.8893875301825473 0.10860170361926326 -4.5514790574828483 1.9129112706618556 0.12037628581280849 -4.668581191872808 1.9364350111411639 0.13215086800635387 -4.7856833262627667 1.9599587516204722 0.040751527947504695 -4.9156949580188591 1.98402905414874 0.028976945753959444 -4.7985928236288995 1.9605053136694317 0.017202363560414085 -4.6814906892389407 1.9369815731901234 0.0054277813668688543 -4.5643885548489811 1.9134578327108152 0.15637096928697125 -4.9015684457295343 1.9834842349136916 0.23878038297518789 -4.77243591547776 1.9594126734770065 0.28251539262037895 -4.8864127228413308 1.9829408895492708 0.3649248063085957 -4.7572801925895565 1.9588693281125857 0.40865981595378686 -4.8712569999531272 1.98239754418485 0.44733421999681233 -4.6281476623377822 1.9347977666759006 0.49106922964200345 -4.7421244697013529 1.9583259827481649 0.53480423928719456 -4.8561012770649237 1.9818541988204292 0.52974363368502919 -4.4990151320860079 1.9107262052392155 0.57347864333022003 -4.6129919394495786 1.9342544213114798 0.61721365297541109 -4.7269687468131494 1.9577826373837441 0.66094866262060226 -4.8409455541767201 1.9813108534560084 0.65588805701843678 -4.4838594091978043 1.9101828598747947 0.69962306666362772 -4.5978362165613751 1.933711075947059 0.74335807630881878 -4.7118130239249458 1.9572392920193233 0.78709308595400995 -4.8257898312885166 1.9807675080915876 0.73829747070665364 -4.3547268789460292 1.8861112984381094 0.78203248035184458 -4.4687036863096008 1.9096395145103739 0.82576748999703575 -4.5826804936731715 1.9331677305826382 0.86950249964222681 -4.6966573010367414 1.9566959466549025 0.91323750928741787 -4.8106341084003121 1.9802241627271668 0.82070688439487005 -4.2255943486942549 1.8620397370014243 -0.88130170377726658 -4.9736683174589196 1.9879719762033747 -0.90121177117389517 -5.0909462555906249 1.964253882607887 -0.92112183857052354 -5.2082241937223293 1.9405357890123989 -0.9410319059671518 -5.3255021318540328 1.9168176954169109 -0.96094197336378018 -5.4427800699857372 1.893099601821423 -0.98085204076040844 -5.5600580081174416 1.8693815082259349 -0.74732720797304697 -4.9836656155023284 1.9886081055253404 -0.76723727536967556 -5.1009435536340337 1.9648900119298527 -0.78714734276630394 -5.2182214917657381 1.9411719183343645 -0.8070574101629322 -5.3354994298974416 1.9174538247388766 -0.82696747755956057 -5.452777368029146 1.8937357311433887 -0.61335271216882703 -4.9936629135457382 1.9892442348473061 -0.63326277956545562 -5.1109408516774426 1.9655261412518183 -0.653172846962084 -5.228218789809147 1.9418080476563302 -0.67308291435871215 -5.3454967279408514 1.9180899540608423 -0.47937821636460753 -5.0036602115891471 1.9898803641692717 -0.49928828376123602 -5.1209381497208515 1.9661622705737838 -0.51919835115786439 -5.2382160878525559 1.9424441769782959 -0.34540372056038798 -5.013657509632556 1.9905164934912374 -0.36531378795701647 -5.1309354477642612 1.9667983998957494 -0.21142922475616832 -5.0236548076759657 1.991152622813203 -0.077454728951948409 -5.0336521057193746 1.9917887521351687 -0.066050579773431942 -5.1539662155237593 1.9680802082155899 -0.050851283054806198 -5.274648296196176 1.9443728216754061 -0.035651986336180448 -5.3953303768685927 1.9206654351352224 -0.020452689617554521 -5.5160124575410112 1.8969580485950388 -0.0052533928989285826 -5.6366945382134279 1.8732506620548552 -0.22924684563952358 -5.1411356257620495 1.9674351673363795 -0.21404754892089783 -5.2618177064344662 1.9437277807961957 -0.19884825220227201 -5.3824997871068829 1.9200203942560119 -0.18364895548364618 -5.5031818677793014 1.8963130077158283 -0.16844965876502035 -5.6238639484517181 1.8726056211756448 -0.15325036204639467 -5.7445460291241357 1.8488982346354612 -0.37724381478698943 -5.2489871166727573 1.9430827399169852 -0.36204451806836363 -5.369669197345174 1.9193753533768014 -0.34684522134973783 -5.4903512780175916 1.8956679668366179 -0.33164592463111209 -5.6110333586900083 1.8719605802964343 -0.31644662791248629 -5.7317154393624259 1.8482531937562507 -0.52524078393445561 -5.3568386075834642 1.918730312497591 -0.51004148721582987 -5.4775206882558818 1.8950229259574074 -0.49484219049720424 -5.5982027689282985 1.8713155394172238 -0.67323775308192157 -5.464690098494172 1.8943778850781969 -0.65803845636329594 -5.5853721791665887 1.8706704985380134 -0.82123472222938765 -5.5725415894048789 1.8700254576588029 -1.9388009076968777 -4.7040165254603679 1.9823423158203048 -1.989802848189997 -4.8126019839161103 1.9586141992558777 -1.8090813804886503 -4.7396529460260179 1.9830526035359537 -1.8600833209817695 -4.8482384044817604 1.9593244869715265 -1.9110852614748888 -4.9568238629375028 1.9355963704070993 -1.9620872019680078 -5.0654093213932461 1.9118682538426723 -2.0130891424611272 -5.1739947798489885 1.8881401372782456 -1.6793618532804233 -4.775289366591668 1.9837628912516025 -1.7303637937735425 -4.8838748250474104 1.9600347746871754 -1.7813657342666618 -4.9924602835031529 1.9363066581227482 -1.8323676747597808 -5.1010457419588953 1.9125785415583212 -1.8833696152528998 -5.2096312004146386 1.8888504249938942 -1.5496423260721961 -4.8109257871573181 1.9844731789672514 -1.6006442665653153 -4.9195112456130596 1.9607450624028242 -1.6516462070584346 -5.0280967040688029 1.937016945838397 -1.7026481475515536 -5.1366821625245453 1.91328882927397 -1.4199227988639689 -4.8465622077229673 1.9851834666829 -1.4709247393570881 -4.9551476661787097 1.9614553501184731 -1.5219266798502074 -5.0637331246344521 1.9377272335540459 -1.2902032716557414 -4.8821986282886174 1.9858937543985489 -1.3412052121488607 -4.9907840867443589 1.9621656378341217 -1.1604837444475145 -4.9178350488542666 1.9866040421141975 -2.0623854603680898 -5.2830942121226139 1.8644126750688186 -1.9047733809682623 -5.3271357990226837 1.8651336636459235 -1.7278454574733497 -5.2530436111679322 1.8895706125485674 -1.7471613015684349 -5.3711773859227536 1.8658546522230284 -1.5509175339784373 -5.1789514233131815 1.9140075614512111 -1.5702333780735223 -5.297085198068002 1.8902916011256723 -1.5895492221686072 -5.4152189728228235 1.8665756408001333 -1.3739896104835245 -5.1048592354584299 1.9384445103538548 -1.3933054545786094 -5.2229930102132514 1.914728550028316 -1.4126212986736943 -5.3411267849680719 1.8910125897027772 -1.4319371427687793 -5.4592605597228934 1.8672966293772382 -1.1970616869886119 -5.0307670476036792 1.9628814592564987 -1.2163775310836971 -5.1489008223584998 1.9391654989309599 -1.2356933751787817 -5.2670345971133212 1.9154495386054209 -1.2550092192738667 -5.3851683718681418 1.8917335782798821 -1.2743250633689516 -5.5033021466229632 1.8680176179543433 -1.0201337634936993 -4.9566748597489276 1.9873184081591424 -1.0394496075887845 -5.0748086345037491 1.9636024478336038 -1.0587654516838694 -5.1929424092585705 1.9398864875080648 -1.0780812957789543 -5.3110761840133911 1.916170527182526 -1.0973971398740392 -5.4292099587682117 1.892454566856987 -1.1167129839691241 -5.5473437335230331 1.8687386065314482 -2.7592897546478028 -4.2953409206111139 1.9774243293548202 -2.8327349064768734 -4.3906528400264921 1.9537033030536874 -2.9061800583059441 -4.4859647594418695 1.929982276752555 -2.9796252101350142 -4.5812766788572477 1.9062612504514223 -3.0530703619640849 -4.6765885982726259 1.8825402241502898 -3.1265155137931555 -4.7719005176880049 1.8588191978491571 -2.6446841196993454 -4.352609506364244 1.9781275566829344 -2.718129271528416 -4.4479214257796222 1.9544065303818017 -2.7915744233574866 -4.5432333451950004 1.9306855040806692 -2.8650195751865568 -4.6385452646103786 1.9069644777795365 -2.9384647270156274 -4.7338571840257568 1.883243451478404 -2.5300784847508879 -4.4098780921173741 1.9788307840110486 -2.6035236365799586 -4.5051900115327532 1.9551097577099159 -2.6769687884090292 -4.6005019309481314 1.9313887314087834 -2.7504139402380994 -4.6958138503635096 1.9076677051076507 -2.4154728498024305 -4.4671466778705051 1.9795340113391628 -2.4889180016315011 -4.5624585972858833 1.9558129850380301 -2.5623631534605718 -4.6577705167012615 1.9320919587368977 -2.3008672148539731 -4.5244152636236352 1.9802372386672771 -2.3743123666830437 -4.6197271830390143 1.9565162123661444 -2.1862615799055156 -4.5816838493767662 1.9809404659953915 -2.0716559449570582 -4.6389524351298963 1.9816436933235058 -2.9959179172613473 -4.8377437056403734 1.8595177150258191 -2.8111613116644594 -4.797934091272098 1.883942938898284 -2.8623247695127358 -4.9051930542827655 1.8602153499154745 -2.6264047060675715 -4.7581244769038227 1.9083681627707492 -2.677568163915848 -4.8653834399144902 1.8846405737879395 -2.7287316217641244 -4.9726424029251577 1.86091298480513 -2.4416481004706836 -4.7183148625355482 1.9327933866432143 -2.4928115583189601 -4.8255738255462148 1.9090657976604046 -2.5439750161672365 -4.9328327885568823 1.8853382086775949 -2.595138474015513 -5.0400917515675498 1.8616106196947855 -2.2568914948737953 -4.6785052481672729 1.9572186105156792 -2.3080549527220722 -4.7857642111779404 1.9334910215328698 -2.3592184105703486 -4.893023174188607 1.9097634325500601 -2.4103818684186251 -5.0002821371992745 1.8860358435672504 -2.4615453262669016 -5.107541100209942 1.8623082545844409 -2.1232983471251838 -4.745954596809665 1.9579162454053347 -2.1744618049734608 -4.8532135598203325 1.9341886564225252 -2.2256252628217372 -4.9604725228309992 1.9104610674397156 -2.2767887206700137 -5.0677314858416667 1.8867334784569059 -2.3279521785182906 -5.1749904488523342 1.8630058894740964 -2.0408686572248493 -4.9206629084627247 1.9348862913121807 -2.0920321150731258 -5.0279218714733922 1.911158702329371 -2.1431955729214027 -5.1351808344840597 1.8874311133465616 -2.1943590307696792 -5.2424397974947272 1.8637035243637516 -3.5517479841456616 -3.55318635085179 1.9952166704232071 -3.4572530325235897 -3.6265008481999459 1.9958710785428844 -3.5457060561089135 -3.7072824777711761 1.9721741102066439 -3.6341590796942378 -3.7880641073424068 1.9484771418704034 -3.7226121032795616 -3.8688457369136371 1.924780173534163 -3.8110651268648854 -3.9496273664848669 1.9010832051979225 -3.8995181504502092 -4.0304089960560967 1.8773862368616823 -3.3627580809015178 -3.6998153455481022 1.9965254866625617 -3.4512111044868417 -3.780596975119332 1.9728285183263212 -3.5396641280721659 -3.8613786046905627 1.9491315499900808 -3.6281171516574897 -3.942160234261793 1.9254345816538403 -3.7165701752428135 -4.0229418638330223 1.9017376133175998 -3.268263129279446 -3.7731298428962585 1.997179894782239 -3.3567161528647698 -3.8539114724674883 1.9734829264459985 -3.445169176450094 -3.9346931020387186 1.9497859581097581 -3.5336222000354178 -4.0154747316099488 1.9260889897735176 -3.6220752236207416 -4.0962563611811786 1.9023920214372774 -3.1737681776573736 -3.8464443402444148 1.9978343029019163 -3.2622212012426974 -3.9272259698156446 1.9741373345656759 -3.3506742248280217 -4.0080075993868745 1.9504403662294354 -3.4391272484133455 -4.0887892289581051 1.9267433978931952 -3.0792732260353013 -3.9197588375925707 1.9984887110215936 -3.1677262496206255 -4.000540467163801 1.9747917426853532 -3.2561792732059498 -4.0813220967350308 1.9510947743491129 -2.9847782744132294 -3.9930733349407266 1.999143119141271 -3.0732312979985537 -4.0738549645119564 1.9754461508050307 -2.8902833227911575 -4.0663878322888829 1.9997975272609485 -3.9827637927017867 -4.1155075350396428 1.8536825750463923 -3.8032012823666967 -4.1052338587523556 1.8780383031210495 -3.876137038405008 -4.1988792741756038 1.8543213891540644 -3.6965745280699185 -4.1886055978883165 1.8786771172287215 -3.7695102841082297 -4.2822510133115648 1.8549602032617365 -3.5170120177348281 -4.1783319216010293 1.9030328453033789 -3.5899477737731398 -4.2719773370242775 1.8793159313363936 -3.662883529811451 -4.3656227524475257 1.8555990173694086 -3.3374495073997386 -4.168058245313742 1.927388573378036 -3.4103852634380494 -4.2617036607369903 1.903671659411051 -3.4833210194763611 -4.3553490761602385 1.8799547454440657 -3.5562567755146723 -4.4489944915834867 1.8562378314770807 -3.1578869970646486 -4.1577845690264548 1.9517443014526932 -3.2308227531029599 -4.251429984449703 1.9280273874857081 -3.3037585091412707 -4.3450753998729512 1.9043104735187231 -3.3766942651795824 -4.4387208152961994 1.8805935595517378 -3.4496300212178941 -4.5323662307194477 1.8568766455847527 -2.9783244867295582 -4.1475108927391675 1.9761000295273505 -3.0512602427678699 -4.2411563081624157 1.9523831155603653 -3.1241959988061812 -4.334801723585664 1.9286662015933802 -3.1971317548444924 -4.4284471390089122 1.9049492876263951 -3.2700675108828037 -4.5220925544321604 1.8812323736594099 -3.3430032669211154 -4.6157379698554086 1.8575154596924248 -2.8716977324327795 -4.2308826318751285 1.9767388436350226 -2.9446334884710912 -4.3245280472983767 1.9530219296680373 -3.0175692445094024 -4.4181734627216249 1.9293050157010523 -3.0905050005477142 -4.5118188781448731 1.9055881017340672 -3.1634407565860254 -4.6054642935681214 1.881871187767082 -3.2363765126243367 -4.6991097089913696 1.8581542738000969 -4.1434661059533147 -2.8702223754272223 1.9904322365043918 -4.2435708096260853 -2.9349666282713018 1.9667560045135535 -4.3436755132988552 -2.9997108811153814 1.9430797725227151 -4.4437802169716258 -3.0644551339594601 1.9194035405318768 -4.5438849206443965 -3.1291993868035402 1.8957273085410387 -4.6439896243171672 -3.1939436396476197 1.8720510765502003 -4.0698425452970426 -2.955213246070707 1.9910306905851185 -4.1699472489698133 -3.0199574989147866 1.9673544585942802 -4.2700519526425831 -3.0847017517588662 1.9436782266034418 -4.3701566563153538 -3.1494460046029449 1.9200019946126035 -4.4702613599881245 -3.2141902574470249 1.8963257626217653 -3.9962189846407705 -3.0402041167141918 1.9916291446658452 -4.0963236883135412 -3.1049483695582714 1.9679529126750068 -4.196428391986311 -3.1696926224023509 1.9442766806841685 -4.2965330956590817 -3.2344368752464296 1.9206004486933301 -4.3966377993318524 -3.2991811280905097 1.8969242167024918 -3.9225954239844985 -3.1251949873576765 1.9922275987465716 -4.0227001276572691 -3.1899392402017561 1.9685513667557335 -4.1228048313300389 -3.2546834930458353 1.9448751347648952 -4.2229095350028105 -3.3194277458899144 1.9211989027740568 -3.8489718633282268 -3.2101858580011609 1.9928260528272983 -3.9490765670009971 -3.2749301108452404 1.96914982083646 -4.0491812706737678 -3.33967436368932 1.9454735888456216 -3.7753483026719548 -3.2951767286446456 1.9934245069080248 -3.875453006344725 -3.3599209814887252 1.9697482749171866 -3.7017247420156831 -3.3801675992881299 1.9940229609887514 -3.8018294456884534 -3.4449118521322095 1.9703467289979131 -3.6281011813594111 -3.4651584699316147 1.9946214150694779 -4.7384056400522043 -3.265684275255559 1.8483666410977455 -4.5681114364847053 -3.2817074229358272 1.8726462793104639 -4.6560112824902831 -3.3614621415943033 1.8489524471133034 -4.485717078922784 -3.3774852892745715 1.8732320853260218 -4.5736169249283609 -3.4572400079330476 1.8495382531288613 -4.315422875355285 -3.3935084369548396 1.8975117235387402 -4.4033227213608619 -3.4732631556133158 1.8738178913415797 -4.4912225673664388 -3.5530178742717919 1.8501240591444192 -4.145128671787786 -3.4095315846351073 1.9217913617514586 -4.2330285177933629 -3.4892863032935839 1.8980975295542981 -4.3209283637989406 -3.5690410219520601 1.8744036973571376 -4.4088282098045175 -3.6487957406105362 1.8507098651599772 -3.9748344682202879 -3.4255547323153759 1.946070999964177 -4.0627343142258638 -3.5053094509738516 1.9223771677670165 -4.1506341602314416 -3.5850641696323282 1.898683335569856 -4.2385340062370185 -3.6648188882908044 1.8749895033726955 -4.3264338522425954 -3.7445736069492805 1.8512956711755351 -3.8924401106583661 -3.5213325986541202 1.9466568059797347 -3.9803399566639426 -3.6010873173125959 1.9229629737825742 -4.0682398026695203 -3.6808420359710725 1.8992691415854137 -4.1561396486750972 -3.7605967546295482 1.8755753093882532 -4.2440394946806741 -3.8403514732880244 1.8518814771910928 -3.7221459070908671 -3.5373557463343879 1.9709364441924533 -3.8100457530964444 -3.6171104649928645 1.9472426119952926 -3.8979455991020209 -3.6968651836513402 1.9235487797981321 -3.9858454451075986 -3.7766199023098164 1.8998549476009716 -4.0737452911131751 -3.8563746209682925 1.8761611154038111 -4.1616451371187519 -3.9361293396267687 1.8524672832066507 -3.6397515495289454 -3.6331336126731322 1.971522250208011 -3.7276513955345223 -3.7128883313316088 1.9478284180108503 -3.8155512415400992 -3.7926430499900845 1.9241345858136898 -3.9034510875456765 -3.8723977686485607 1.9004407536165293 -3.9913509335512534 -3.9521524873070368 1.8767469214193688 -4.0792507795568307 -4.0319072059655126 1.8530530892222083 -4.6483314836648182 -2.0142684820154759 1.9853974784287578 -4.7584591565668273 -2.0594792813238891 1.9617250723964472 -4.8685868294688364 -2.1046900806323023 1.9380526663641364 -4.9787145023708455 -2.149900879940716 1.9143802603318258 -5.0888421752728545 -2.1951116792491296 1.890707854299515 -5.1989698481748636 -2.2403224785575433 1.8670354482672045 -4.5943771987347191 -2.1093088764580852 1.98595347008872 -4.7045048716367281 -2.1545196757664984 1.9622810640564095 -4.8146325445387372 -2.1997304750749116 1.9386086580240987 -4.9247602174407463 -2.2449412743833252 1.9149362519917881 -5.0348878903427554 -2.2901520736917389 1.8912638459594773 -4.5404229138046199 -2.2043492709006944 1.9865094617486823 -4.650550586706629 -2.2495600702091076 1.9628370557163717 -4.7606782596086381 -2.2947708695175209 1.9391646496840609 -4.8708059325106472 -2.3399816688259345 1.9154922436517503 -4.4864686288745208 -2.2993896653433037 1.9870654534086445 -4.5965963017765299 -2.3446004646517169 1.9633930473763339 -4.706723974678539 -2.3898112639601301 1.9397206413440231 -4.8168516475805481 -2.4350220632685438 1.9160482353117125 -4.4325143439444217 -2.3944300597859129 1.9876214450686067 -4.5426420168464308 -2.4396408590943262 1.9639490390362961 -4.6527696897484399 -2.4848516584027398 1.9402766330039853 -4.3785600590143225 -2.4894704542285222 1.9881774367285689 -4.4886877319163316 -2.5346812535369354 1.9645050306962584 -4.3246057740842234 -2.5845108486711315 1.9887334283885312 -4.4347334469862325 -2.6297216479795447 1.9650610223562206 -4.2706514891541243 -2.6795512431137407 1.9892894200484934 -5.1408523598476776 -2.3431651331314174 1.8675901722486985 -4.97990651194511 -2.3871173441609503 1.8918195248736642 -5.0798102297640497 -2.4514888592739985 1.8681440056886969 -4.9188643818614821 -2.4954410703035315 1.8923733583136626 -5.0187680996804218 -2.5598125854165796 1.8686978391286952 -4.7579185339589145 -2.5393932813330644 1.9166027109386286 -4.8578222517778542 -2.6037647964461126 1.892927191753661 -4.9577259695967948 -2.6681363115591608 1.8692516725686936 -4.5969726860563469 -2.5833454923625974 1.9408320635635943 -4.6968764038752866 -2.6477170074756455 1.9171565443786269 -4.7967801216942272 -2.7120885225886937 1.8934810251936594 -4.8966838395131678 -2.7764600377017419 1.869805506008692 -4.535930555972719 -2.6916692185051785 1.9413858970035927 -4.6358342737916587 -2.7560407336182267 1.9177103778186253 -4.7357379916105993 -2.8204122487312748 1.8940348586336577 -4.8356417094295399 -2.884783763844323 1.8703593394486902 -4.3749847080701505 -2.7356214295347119 1.9656152496285586 -4.4748884258890911 -2.7999929446477596 1.941939730443591 -4.5747921437080317 -2.8643644597608078 1.9182642112586235 -4.6746958615269723 -2.928735974873856 1.8945886920736561 -4.7745995793459128 -2.9931074899869041 1.8709131728886885 -4.2140388601675829 -2.7795736405642448 1.9898446022535243 -4.3139425779865226 -2.843945155677293 1.9661690830685568 -4.4138462958054632 -2.9083166707903412 1.9424935638835892 -4.5137500136244038 -2.9726881859033889 1.9188180446986218 -4.6136537314433443 -3.0370597010164371 1.8951425255136543 -4.7135574492622849 -3.1014312161294852 1.8714670063286867 -4.8134611670812255 -3.1658027312425339 1.8477914871437193 -4.9753511009569742 -1.0731983383559389 1.9806673973545483 -5.0920663857921076 -1.0964826181028526 1.9569924981441273 -5.2087816706272418 -1.1197668978497664 1.9333175989337064 -5.3254969554623752 -1.1430511775966801 1.9096426997232852 -5.4422122402975086 -1.1663354573435938 1.8859678005128642 -5.558927525132642 -1.1896197370905075 1.862292901302443 -4.9411461625136042 -1.1769502917657881 1.9811899666651709 -5.0578614473487367 -1.2002345715127016 1.9575150674547499 -5.1745767321838709 -1.2235188512596153 1.9338401682443289 -5.2912920170190043 -1.2468031310065291 1.9101652690339077 -5.4080073018541386 -1.2700874107534428 1.8864903698234867 -4.9069412240702333 -1.2807022451756374 1.9817125359757934 -5.0236565089053666 -1.3039865249225506 1.9580376367653725 -5.1403717937405009 -1.3272708046694643 1.9343627375549515 -5.2570870785756343 -1.3505550844163781 1.9106878383445303 -4.8727362856268623 -1.3844541985854866 1.982235105286416 -4.9894515704619957 -1.4077384783323998 1.958560206075995 -5.10616685529713 -1.4310227580793136 1.934885306865574 -4.8385313471834923 -1.4882061519953356 1.9827576745970386 -4.9552466320186257 -1.5114904317422488 1.9590827753866176 -5.07196191685376 -1.5347747114891626 1.9354078761761964 -4.8043264087401223 -1.5919581054051846 1.9832802439076611 -4.9210416935752557 -1.6152423851520981 1.9596053446972401 -4.7701214702967514 -1.6957100588150338 1.9838028132182837 -4.7359165318533814 -1.7994620122248828 1.9843253825289064 -5.5205997367535309 -1.3069350551091357 1.8628170864977915 -5.3717217282598257 -1.3806842441880116 1.8870137546055945 -5.4817970527116735 -1.4258126863638392 1.8633414578208574 -5.2228437197661215 -1.4544334332668876 1.9112104227133977 -5.3329190442179684 -1.4995618754427151 1.8875381259286603 -5.4429943686698161 -1.5446903176185427 1.8638658291439232 -5.1840410357242632 -1.5733110645215909 1.9117347940364635 -5.294116360176111 -1.6184395066974184 1.8880624972517261 -5.4041916846279587 -1.663567948873246 1.864390200466989 -5.0351630272305572 -1.6470602536004668 1.9359314621442665 -5.1452383516824058 -1.6921886957762942 1.9122591653595293 -5.2553136761342536 -1.7373171379521217 1.888586868574792 -5.3653890005861005 -1.7824455801279493 1.8649145717900548 -4.8862850187368521 -1.7208094426793428 1.9601281302520694 -4.9963603431886998 -1.7659378848551701 1.9364558334673323 -5.1064356676405476 -1.8110663270309977 1.9127835366825952 -5.2165109920923953 -1.8561947692068252 1.8891112398978578 -5.3265863165442431 -1.9013232113826528 1.8654389431131204 -4.8474823346949947 -1.8396870739340461 1.9606525015751353 -4.9575576591468424 -1.8848155161098734 1.9369802047903981 -5.0676329835986902 -1.929943958285701 1.913307908005661 -5.1777083080505379 -1.9750724004615285 1.8896356112209236 -5.2877836325023848 -2.0202008426373559 1.8659633144361862 -4.6986043262012887 -1.913436263012922 1.9848491696829382 -4.8086796506531364 -1.9585647051887494 1.9611768728982013 -4.918754975104985 -2.0036931473645767 1.9375045761134639 -5.0288302995568328 -2.0488215895404043 1.9138322793287266 -5.1389056240086797 -2.0939500317162318 1.8901599825439892 -5.2489809484605274 -2.1390784738920594 1.8664876857592518 -4.9930298319068704 -0.073541497898163444 1.9999456895162389 -5.1120836596122672 -0.073438462205803301 1.9762664293902987 -5.2311374873176639 -0.073335426513442825 1.9525871692643584 -5.3501913150230616 -0.073232390821082571 1.928907909138418 -5.4692451427284583 -0.073129355128722151 1.9052286490124777 -5.588298970433855 -0.073026319436361786 1.8815493888865373 -5.0988687724443951 -0.18283085094288209 1.9767519102869813 -5.2179226001497918 -0.18272781525052162 1.9530726501610409 -5.3369764278551894 -0.18262477955816131 1.9293933900351006 -5.4560302555605862 -0.18252174386580095 1.9057141299091602 -5.5750840832659829 -0.18241870817344058 1.8820348697832201 -5.085653885276523 -0.29222323967996067 1.9772373911836638 -5.2047077129819197 -0.29212020398760025 1.9535581310577235 -5.3237615406873173 -0.29201716829523994 1.9298788709317831 -5.4428153683927141 -0.29191413260287957 1.9061996108058428 -5.0724389981086508 -0.40161562841703929 1.9777228720803464 -5.1914928258140476 -0.40151259272467887 1.954043611954406 -5.3105466535194452 -0.40140955703231851 1.9303643518284657 -5.0592241109407787 -0.51100801715411792 1.9782083529770289 -5.1782779386461755 -0.51090498146175756 1.9545290928510886 -5.2973317663515731 -0.51080194576939719 1.9308498327251482 -5.0460092237729066 -0.62040040589119683 1.9786938338737114 -5.1650630514783034 -0.62029737019883646 1.9550145737477711 -5.0327943366050345 -0.7297927946282754 1.979179314770394 -5.0195794494371624 -0.83918518336535408 1.9796647956670765 -5.7072279060673408 -0.07417944280540123 1.8578703617273813 -5.6923820925726298 -0.19997561804857 1.8583588848641008 -5.5608090578506788 -0.30247392158360875 1.8825223282033308 -5.6775362790779189 -0.32577179329173889 1.8588474080008204 -5.4292360231287287 -0.4049722251186475 1.9066857715425609 -5.5459632443559679 -0.42827009682677752 1.8830108513400503 -5.662690465583208 -0.45156796853490755 1.8593359311375399 -5.4143902096340177 -0.53076840036181627 1.9071742946792805 -5.531117430861257 -0.5540662720699463 1.8834993744767698 -5.6478446520884971 -0.57736414377807632 1.8598244542742595 -5.2828171749120667 -0.63326670389685513 1.9313377380185104 -5.3995443961393068 -0.65656457560498516 1.907662817816 -5.516271617366546 -0.67986244731311518 1.8839878976134894 -5.6329988385937861 -0.70316031902124521 1.860312977410979 -5.1512441401901157 -0.73576500743189399 1.9555011813577403 -5.2679713614173558 -0.75906287914002391 1.9318262611552299 -5.3846985826445959 -0.78236075084815393 1.9081513409527195 -5.5014258038718351 -0.80565862255628395 1.8844764207502089 -5.6181530250990752 -0.82895649426441398 1.8608015005476986 -5.1363983266954047 -0.86156118267506276 1.9559897044944599 -5.2531255479226449 -0.88485905438319268 1.9323147842919495 -5.369852769149885 -0.9081569260913227 1.9086398640894391 -5.4865799903771251 -0.93145479779945273 1.8849649438869285 -5.6033072116043652 -0.95475266950758275 1.8612900236844181 -5.0048252919734546 -0.96405948621010151 1.9801531478336898 -5.1215525132006947 -0.98735735791823154 1.9564782276311794 -5.2382797344279348 -1.0106552296263616 1.932803307428669 -5.3550069556551749 -1.0339531013344916 1.9091283872261584 -5.4717341768824141 -1.0572509730426216 1.885453467023648 -5.5884613981096543 -1.0805488447507516 1.8617785468211376 -4.9294215616295505 0.92150877279927479 1.9959855001039615 -5.046166747105632 0.94492240575936015 1.9723047386931845 -5.1629119325817134 0.96833603871944529 1.948623977282407 -5.2796571180577958 0.99174967167953065 1.9249432158716298 -5.3964023035338773 1.0151633046396158 1.9012624544608525 -5.5131474890099588 1.0385769375997012 1.8775816930500753 -4.9381220734800202 0.81089828173344347 1.9964218483243403 -5.0548672589561017 0.83431191469352872 1.9727410869135633 -5.1716124444321832 0.85772554765361397 1.9490603255027859 -5.2883576299082655 0.88113918061369922 1.9253795640920086 -5.405102815384347 0.90455281357378448 1.9016988026812314 -5.5218480008604285 0.92796644653386973 1.8780180412704541 -4.9468225853304899 0.70028779066761182 1.9968581965447192 -5.0635677708065714 0.72370142362769707 1.9731774351339422 -5.1803129562826529 0.74711505658778243 1.9494966737231647 -5.2970581417587352 0.77052868954786757 1.9258159123123875 -5.4138033272348167 0.79394232250795282 1.9021351509016102 -4.9555230971809596 0.58967729960178039 1.997294544765098 -5.0722682826570411 0.61309093256186564 1.973613783354321 -5.1890134681331226 0.63650456552195112 1.9499330219435436 -5.305758653609205 0.65991819848203626 1.9262522605327663 -4.9642236090314293 0.47906680853594902 1.9977308929854769 -5.0809687945075108 0.50248044149603421 1.9740501315746999 -5.1977139799835914 0.5258940744561198 1.9503693701639224 -5.3144591654596738 0.54930770741620494 1.9266886087531452 -4.9729241208818991 0.36845631747011759 1.9981672412058558 -5.0896693063579797 0.3918699504302029 1.9744864797950785 -5.2064144918340611 0.41528358339028848 1.9508057183843013 -4.9816246327323679 0.25784582640428594 1.9986035894262346 -5.0983698182084494 0.2812594593643713 1.9749228280154574 -4.9903251445828376 0.14723533533845481 1.9990399376466135 -4.9990256564333064 0.036624844272623136 1.9994762858669921 -5.6301552095469054 1.0593159433664725 1.8539011092133137 -5.6404759826967883 0.93219872395204406 1.8543385533494317 -5.5317650961648823 0.80496177398904156 1.8784552123661036 -5.6507967558466712 0.80508150453761551 1.8547759974855496 -5.4230542096329764 0.67772482402603929 1.9025718713827755 -5.5420858693147652 0.67784455457461301 1.8788926565022215 -5.6611175289965541 0.67796428512318696 1.8552134416216675 -5.4333749827828592 0.55060760461161073 1.9030093155188934 -5.5524066424646481 0.55072733516018446 1.8793301006383394 -5.6714383021464378 0.55084706570875841 1.8556508857577854 -5.3246640962509542 0.42337065464860835 1.9271259745355653 -5.443695755932743 0.42349038519718213 1.9034467596550113 -5.5627274156145319 0.42361011574575591 1.8797675447744573 -5.6817590752963207 0.4237298462943298 1.8560883298939033 -5.2159532097190473 0.29613370468560601 1.9512426335522373 -5.334984869400837 0.2962534352341798 1.9275634186716832 -5.4540165290826259 0.29637316578275358 1.9038842037911292 -5.5730481887644148 0.29649289633132742 1.8802049889105752 -5.6920798484462045 0.29661262687990131 1.8565257740300212 -5.1072423231871413 0.16889675472260351 1.9753592925689092 -5.2262739828689302 0.16901648527117735 1.9516800776883552 -5.3453056425507199 0.16913621581975111 1.9280008628078011 -5.4643373022325097 0.16925594636832492 1.9043216479272471 -5.5833689619142985 0.16937567691689875 1.8806424330466931 -5.7024006215960874 0.16949540746547262 1.8569632181661391 -5.1175630963370242 0.041779535308175027 1.9757967367050271 -5.236594756018814 0.041899265856748878 1.9521175218244731 -5.3556264157006037 0.042018996405322584 1.928438306943919 -5.4746580753823926 0.042138726953896422 1.904759092063365 -5.5936897350641814 0.042258457502470259 1.881079877182811 -5.7127213947459712 0.042378188051044118 1.857400662302257 -4.6645560101862422 1.8917419570261815 1.9926202490036289 -4.774450844957836 1.9375848502792441 1.9689410212906715 -4.8843456797294307 1.9834277435323067 1.9452617935777143 -4.9942405145010254 2.0292706367853692 1.921582565864757 -5.1041353492726209 2.0751135300384318 1.8979033381517996 -5.2140301840442147 2.1209564232914944 1.8742241104388424 -4.695126350104383 1.7845866799600656 1.9929903259609396 -4.8050211848759767 1.8304295732131279 1.9693110982479822 -4.9149160196475714 1.8762724664661907 1.9456318705350251 -5.0248108544191661 1.9221153597192533 1.9219526428220677 -5.1347056891907616 1.9679582529723159 1.8982734151091103 -5.2446005239623563 2.0138011462253784 1.8745941873961531 -4.7256966900225237 1.6774314028939492 1.9933604029182503 -4.8355915247941175 1.7232742961470118 1.969681175205293 -4.9454863595657121 1.7691171894000746 1.9460019474923358 -5.0553811943373068 1.8149600826531371 1.9223227197793784 -5.1652760291089015 1.8608029759061997 1.898643492066421 -4.7562670299406644 1.5702761258278333 1.9937304798755611 -4.8661618647122582 1.6161190190808958 1.9700512521626037 -4.9760566994838529 1.6619619123339584 1.9463720244496465 -5.0859515342554475 1.7078048055870212 1.9226927967366891 -4.7868373698588051 1.4631208487617173 1.9941005568328718 -4.8967322046303989 1.5089637420147797 1.9704213291199144 -5.0066270394019936 1.5548066352678425 1.9467421014069572 -5.1165218741735883 1.600649528520905 1.9230628736939999 -4.8174077097769459 1.3559655716956012 1.9944706337901825 -4.9273025445485397 1.4018084649486635 1.9707914060772251 -5.0371973793201343 1.4476513582017263 1.9471121783642678 -4.8479780496950857 1.2488102946294848 1.9948407107474933 -4.9578728844666804 1.2946531878825471 1.9711614830345359 -4.8785483896132265 1.1416550175633686 1.995210787704804 -4.9091187295313663 1.0344997404972527 1.9955808646621145 -5.3247189522231917 2.1641849222254459 1.850544717171517 -5.3601573855994156 2.0409991874869693 1.8509137790132919 -5.2788962288219938 1.894378375627559 1.8749634875245345 -5.3955958189756394 1.9178134527484927 1.8512828408550668 -5.1976350720445703 1.7477575637681488 1.8990131960357772 -5.3143346621982177 1.7711926408890823 1.8753325493663093 -5.4310342523518633 1.7946277180100161 1.8516519026968417 -5.2330735054207942 1.6245718290296722 1.8993822578775521 -5.3497730955744416 1.6480069061506057 1.8757016112080842 -5.4664726857280872 1.6714419832715395 1.8520209645386165 -5.1518123486433725 1.4779510171702621 1.9234319663887947 -5.2685119387970181 1.5013860942911956 1.899751319719327 -5.3852115289506655 1.5248211714121291 1.8760706730498591 -5.5019111191043111 1.5482562485330629 1.8523900263803914 -5.0705511918659489 1.3313302053108513 1.9474816749000372 -5.1872507820195963 1.3547652824317851 1.9238010282305695 -5.3039503721732419 1.3782003595527188 1.9001203815611019 -5.4206499623268893 1.4016354366736523 1.876439734891634 -5.5373495524805358 1.4250705137945863 1.8527590882221663 -4.9892900350885272 1.184709393451441 1.9715313834112798 -5.1059896252421728 1.2081444705723747 1.9478507367418121 -5.2226892153958202 1.2315795476933085 1.9241700900723442 -5.3393888055494667 1.2550146248142422 1.9004894434028765 -5.4560883957031132 1.2784497019351759 1.8768087967334086 -5.5727879858567597 1.3018847790561097 1.8531281500639409 -5.0247284684647511 1.0615236587129644 1.9719004452530546 -5.1414280586183976 1.0849587358338981 1.948219798583587 -5.2581276487720441 1.1083938129548319 1.9245391519141191 -5.3748272389256906 1.1318288900757656 1.9008585052446514 -5.491526829079338 1.1552639671966993 1.8771778585751835 -5.6082264192329845 1.1786990443176333 1.8534972119057158 -4.2051848821145352 2.7936519987208657 1.9900788594241041 -4.3039827117012353 2.860077823899474 1.966404721631311 -4.4027805412879353 2.9265036490780814 1.9427305838385178 -4.5015783708746353 2.9929294742566888 1.9190564460457247 -4.6003762004613362 3.0593552994352962 1.8953823082529313 -4.6991740300480362 3.125781124613904 1.8717081704601384 -4.2566185677412038 2.6944636889395066 1.9903580014994806 -4.3554163973279039 2.7608895141181149 1.9666838637066877 -4.4542142269146039 2.8273153392967219 1.9430097259138945 -4.5530120565013039 2.8937411644753293 1.9193355881211014 -4.6518098860880048 2.9601669896539371 1.895661450328308 -4.7506077156747049 3.0265928148325445 1.8719873125355151 -4.3080522533678725 2.5952753791581475 1.9906371435748573 -4.4068500829545725 2.6617012043367554 1.9669630057820642 -4.5056479125412725 2.7281270295153628 1.9432888679892713 -4.6044457421279725 2.7945528546939702 1.9196147301964781 -4.7032435717146726 2.8609786798725776 1.8959405924036847 -4.3594859389945411 2.496087069376788 1.9909162856502338 -4.4582837685812411 2.5625128945553959 1.9672421478574409 -4.5570815981679411 2.6289387197340033 1.943568010064648 -4.6558794277546411 2.6953645449126107 1.9198938722718548 -4.4109196246212097 2.396898759595429 1.9911954277256105 -4.5097174542079097 2.4633245847740364 1.9675212899328174 -4.6085152837946097 2.5297504099526442 1.9438471521400245 -4.7073131133813106 2.5961762351312512 1.9201730143472313 -4.4623533102478783 2.2977104498140699 1.991474569800987 -4.5611511398345783 2.3641362749926773 1.9678004320081941 -4.6599489694212783 2.4305621001712847 1.9441262942154012 -4.5137869958745469 2.1985221400327108 1.9917537118763637 -4.6125848254612469 2.2649479652113178 1.9680795740835706 -4.5652206815012155 2.0993338302513513 1.9920328539517402 -4.6166543671278841 2.0001455204699923 1.9923119960271169 -4.7986726832185544 3.1908990650223856 1.8480337251382808 -4.858061403709157 3.0768649806629496 1.8483093764572278 -4.8076329676978196 2.9169694616252482 1.8722640009703126 -4.9174501241997595 2.9628308963035135 1.8485850277761748 -4.7572045316864822 2.7570739425875472 1.8962186254833977 -4.8670216881884221 2.8029353772658121 1.8725396522892597 -4.976838844690362 2.8487968119440774 1.8488606790951219 -4.8165932521770847 2.6430398582281112 1.8964942768023447 -4.9264104086790246 2.688901292906376 1.8728153036082067 -5.0362275651809645 2.7347627275846413 1.8491363304140689 -4.7661648161657491 2.4831443391904098 1.9204489013154296 -4.8759819726676881 2.5290057738686751 1.8967699281212917 -4.985799129169628 2.57486720854694 1.8730909549271537 -5.095616285671567 2.6207286432252053 1.8494119817330159 -4.7157363801544117 2.3232488201527088 1.9444035258285146 -4.8255535366563516 2.3691102548309737 1.9207245526343766 -4.9353706931582906 2.414971689509239 1.8970455794402388 -5.0451878496602305 2.4608331241875039 1.8733666062461007 -5.1550050061621704 2.5066945588657688 1.8496876330519629 -4.6653079441430751 2.1633533011150075 1.9683581503415997 -4.7751251006450142 2.2092147357932728 1.9446791771474616 -4.8849422571469541 2.2550761704715376 1.9210002039533236 -4.994759413648894 2.3009376051498029 1.8973212307591858 -5.1045765701508339 2.3467990398280678 1.8736422575650478 -5.2143937266527729 2.3926604745063327 1.84996328437091 -4.7246966646336777 2.0493192167555714 1.9686338016605465 -4.8345138211356167 2.0951806514338367 1.9449548284664087 -4.9443309776375566 2.1410420861121016 1.9212758552722706 -5.0541481341394965 2.1869035207903664 1.8975968820781328 -5.1639652906414364 2.2327649554686313 1.8739179088839948 -5.2737824471433763 2.2786263901468962 1.850238935689857 -3.6374874534705079 3.4991359376803626 1.9888628688595102 -3.7213741894669292 3.5835629401831803 1.9651966414725797 -3.8052609254633505 3.6679899426859981 1.9415304140856491 -3.8891476614597718 3.7524169451888163 1.9178641866987185 -3.973034397456193 3.8368439476916341 1.8941979593117879 -4.0569211334526143 3.9212709501944514 1.8705317319248573 -3.7079568850249789 3.4120821894463216 1.9890133158365821 -3.7918436210214002 3.4965091919491393 1.9653470884496516 -3.8757303570178214 3.5809361944519571 1.941680861062721 -3.9596170930142427 3.6653631969547753 1.9180146336757904 -4.043503829010664 3.7497901994575931 1.8943484062888598 -3.7784263165794498 3.3250284412122806 1.989163762813654 -3.8623130525758711 3.4094554437150983 1.9654975354267235 -3.9461997885722924 3.4938824462179161 1.9418313080397929 -4.0300865245687136 3.5783094487207343 1.9181650806528623 -3.8488957481339208 3.2379746929782396 1.9893142097907259 -3.932782484130342 3.3224016954810573 1.9656479824037953 -4.0166692201267633 3.4068286979838751 1.9419817550168648 -4.100555956123185 3.4912557004866933 1.9183155276299342 -3.9193651796883917 3.150920944744199 1.9894646567677978 -4.003251915684813 3.2353479472470168 1.9657984293808672 -4.0871386516812347 3.3197749497498341 1.9421322019939369 -3.9898346112428626 3.063867196510158 1.9896151037448697 -4.0737213472392844 3.1482941990129758 1.9659488763579391 -4.060304042797334 2.976813448276117 1.9897655507219416 -4.1307734743518045 2.8897597000420765 1.9899159976990135 -4.1333111922078007 3.8270265196542468 1.8706791835473002 -4.1158933090765908 3.6604045261773965 1.894497881877935 -4.2145992150319307 3.7268334450983343 1.8708241571992767 -4.1971813319007207 3.560211451621484 1.8946428555299115 -4.2958872378560606 3.6266403705424222 1.8709691308512535 -4.1797634487695099 3.3935894581446338 1.9184615538605461 -4.2784693547248507 3.4600183770655715 1.894787829181888 -4.3771752606801906 3.5264472959865101 1.87111410450323 -4.162345565638299 3.2269674646677831 1.9422802521911808 -4.2610514715936398 3.2933963835887212 1.9186065275125226 -4.3597573775489806 3.3598253025096594 1.8949328028338646 -4.4584632835043205 3.4262542214305975 1.8712590781552068 -4.1449276825070891 3.0603454711909324 1.9660989505218152 -4.243633588462429 3.1267743901118705 1.9424252258431574 -4.3423394944177698 3.1932033090328087 1.9187515011644991 -4.4410454003731106 3.2596322279537469 1.8950777764858411 -4.5397513063284505 3.326061146874685 1.8714040518071833 -4.226215705331219 2.9601523966350198 1.9662439241737917 -4.3249216112865589 3.026581315555958 1.9425701994951339 -4.4236275172418997 3.0930102344768962 1.9188964748164759 -4.5223334231972405 3.1594391533978343 1.8952227501378178 -4.6210393291525804 3.2258680723187725 1.87154902545916 -4.7197452351079212 3.2922969912397106 1.847875300780502 -2.8604569437481038 4.1604301510647623 1.9890494505515945 -2.926234108149357 4.2595669405446523 1.965391794053815 -2.9920112725506107 4.3587037300245424 1.9417341375560353 -3.0577884369518644 4.4578405195044333 1.9180764810582556 -3.1235656013531177 4.5569773089843251 1.8944188245604761 -3.1893427657543709 4.6561140984642151 1.8707611680626963 -2.947451115764292 4.0892868627087715 1.989010672257739 -3.0132282801655452 4.1884236521886615 1.9653530157599595 -3.0790054445667989 4.2875604416685515 1.9416953592621797 -3.1447826089680526 4.3866972311484425 1.9180377027644 -3.2105597733693059 4.4858340206283343 1.8943800462666205 -3.0344452877804802 4.0181435743527807 1.9889718939638834 -3.1002224521817334 4.1172803638326707 1.9653142374661037 -3.1659996165829871 4.2164171533125607 1.9416565809683242 -3.2317767809842408 4.3155539427924516 1.9179989244705444 -3.2975539453854941 4.4146907322723425 1.8943412679727649 -3.1214394597966684 3.9470002859967894 1.9889331156700276 -3.1872166241979221 4.0461370754766799 1.9652754591722481 -3.2529937885991753 4.1452738649565699 1.9416178026744686 -3.318770953000429 4.2444106544364608 1.9179601461766889 -3.2084336318128566 3.8758569976407982 1.9888943373761721 -3.2742107962141103 3.9749937871206886 1.9652366808783923 -3.3399879606153635 4.0741305766005791 1.9415790243806128 -3.2954278038290448 3.8047137092848073 1.9888555590823163 -3.3612049682302985 3.9038504987646974 1.9651979025845367 -3.382421975845233 3.7335704209288161 1.9888167807884607 -3.4481991402464867 3.8327072104087065 1.965159124290681 -3.4694161478614216 3.6624271325728248 1.9887780024946049 -3.2798823242955359 4.5820712559493302 1.8707208339979546 -3.3802281624773975 4.5000084588497637 1.8706761967848091 -3.3967897335303023 4.333535777005773 1.8942971178668833 -3.4805740006592591 4.4179456617501973 1.8706315595716636 -3.4133513045832067 4.1670630951617831 1.9179180389489572 -3.4971355717121639 4.2514729799062065 1.8942524806537377 -3.5809198388411208 4.3358828646506309 1.8705869223585181 -3.429912875636111 4.0005904133177914 1.9415389600310313 -3.5136971427650683 4.0850002980622167 1.9178734017358117 -3.5974814098940255 4.1694101828066401 1.8942078434405922 -3.6812656770229824 4.2538200675510645 1.8705422851453726 -3.5302587138179726 3.918527616218225 1.9414943228178856 -3.6140429809469299 4.0029375009626502 1.9178287645226662 -3.6978272480758871 4.0873473857070737 1.8941632062274467 -3.781611515204844 4.171757270451498 1.8704976479322271 -3.546820284870877 3.7520549343742351 1.9651152438999595 -3.6306045519998342 3.836464819118659 1.9414496856047398 -3.7143888191287915 3.9208747038630838 1.9177841273095204 -3.7981730862577487 4.0052845886075072 1.894118569014301 -3.8819573533867056 4.0896944733519316 1.8704530107190815 -3.5633818559237818 3.5855822525302448 1.9887361649820334 -3.6471661230527386 3.6699921372746687 1.9650706066868138 -3.7309503901816963 3.7544020220190926 1.9414050483915943 -3.8147346573106535 3.8388119067635174 1.9177394900963749 -3.8985189244396103 3.9232217915079413 1.8940739318011555 -3.9823031915685672 4.0076316762523652 1.870408373505936 -1.9540035960529556 4.6441218257904868 1.9918177089427596 -1.9992375279263355 4.7541402892123044 1.9681623741282608 -2.0444714597997149 4.8641587526341219 1.9445070393137625 -2.0897053916730952 4.9741772160559403 1.9208517044992639 -2.1349393235464751 5.084195679477757 1.8971963696847656 -2.180173255419855 5.1942141428995745 1.8735410348702668 -2.0545717352965678 4.5922202190175403 1.9914910411331561 -2.0998056671699477 4.7022386824393578 1.9678357063186576 -2.1450395990433271 4.8122571458611754 1.944180371504159 -2.1902735309167074 4.9222756092829938 1.9205250366896605 -2.2355074627900873 5.0322940727048104 1.8968697018751621 -2.2807413946634667 5.142312536126628 1.8732143670606636 -2.15513987454018 4.5403186122445938 1.9911643733235527 -2.2003738064135598 4.6503370756664113 1.9675090385090543 -2.2456077382869393 4.7603555390882288 1.9438537036945558 -2.2908416701603191 4.8703740025100473 1.9201983688800572 -2.336075602033699 4.9803924659318639 1.8965430340655587 -2.2557080137837922 4.4884170054716472 1.9908377055139492 -2.300941945657172 4.5984354688934648 1.9671823706994509 -2.3461758775305515 4.7084539323152823 1.9435270358849523 -2.3914098094039313 4.8184723957371007 1.9198717010704538 -2.3562761530274039 4.4365153986987007 1.990511037704346 -2.4015100849007838 4.5465338621205182 1.9668557028898477 -2.4467440167741636 4.6565523255423358 1.9432003680753491 -2.4568442922710156 4.3846137919257542 1.9901843698947426 -2.5020782241443955 4.4946322553475717 1.9665290350802442 -2.5473121560177754 4.6046507187693893 1.9428737002657457 -2.5574124315146274 4.3327121851528076 1.9898577020851393 -2.6026463633880077 4.4427306485746252 1.966202367270641 -2.6579805707582396 4.2808105783798611 1.9895310342755359 -2.227102065665044 5.3033272983612818 1.8498855901659952 -2.3431951715731691 5.2431331343549665 1.8495579157738002 -2.393611458978945 5.0838399382563386 1.8728869016388083 -2.4592882774812943 5.1829389703486504 1.8492302413816053 -2.4440277463847209 4.9245467421577107 1.8962158875038164 -2.5097045648870706 5.0236457742500225 1.8725592272466134 -2.5753813833894199 5.1227448063423342 1.8489025669894104 -2.4944440337904963 4.7652535460590828 1.9195448733688245 -2.5601208522928465 4.8643525781513945 1.8958882131116215 -2.6257976707951958 4.9634516102437072 1.8722315528544184 -2.6914744892975451 5.0625506423360189 1.8485748925972154 -2.6105371396986219 4.7050593820527666 1.9192171989766296 -2.6762139582009716 4.8041584141450793 1.8955605387194265 -2.7418907767033209 4.903257446237391 1.8719038784622235 -2.8075675952056707 5.0023564783297036 1.8482472182050205 -2.6609534271043973 4.5457661859541378 1.9425461848416377 -2.7266302456067475 4.6448652180464505 1.9188895245844346 -2.7923070641090968 4.7439642501387631 1.8952328643272316 -2.8579838826114461 4.8430632822310749 1.8715762040700286 -2.9236607011137958 4.9421623143233875 1.8479195438128253 -2.7113697145101732 4.3864729898555099 1.9658751707066457 -2.7770465330125229 4.4855720219478217 1.9422185104494427 -2.8427233515148731 4.5846710540401343 1.9185618501922395 -2.9084001700172224 4.6837700861324469 1.8949051899350366 -2.9740769885195717 4.7828691182247596 1.8712485296778334 -2.761786001915949 4.2271797937568829 1.9892041565716536 -2.8274628204182983 4.3262788258491947 1.9655474963144508 -2.8931396389206485 4.4253778579415064 1.9418908360572475 -2.9588164574229983 4.524476890033819 1.9182341758000445 -3.024493275925348 4.6235759221261317 1.8945775155428415 -3.0901700944276973 4.7226749542184434 1.8709208552856385 -1.060029841410338 4.8894601709945062 1.9978596515682272 -1.0832305585421271 5.0062166702476079 1.9741817176999581 -1.1064312756739163 5.1229731695007095 1.9505037838316892 -1.129631992805705 5.2397296687538102 1.9268258499634201 -1.1528327099374942 5.3564861680069118 1.903147916095151 -1.1760334270692832 5.4732426672600134 1.8794699822268821 -1.1711629527150622 4.8597742798362766 1.9970896113019312 -1.1943636698468514 4.9765307790893782 1.9734116774336621 -1.2175643869786403 5.0932872783424799 1.9497337435653932 -1.2407651041104293 5.2100437775955806 1.9260558096971241 -1.2639658212422185 5.3268002768486822 1.902377875828855 -1.2822960640197862 4.830088388678047 1.9963195710356352 -1.3054967811515756 4.9468448879311486 1.9726416371673661 -1.3286974982833644 5.0636013871842502 1.9489637032990972 -1.3518982154151535 5.180357886437351 1.9252857694308281 -1.3750989325469427 5.2971143856904526 1.9016078355625587 -1.3934291753245107 4.8004024975198174 1.9955495307693392 -1.4166298924562999 4.917158996772919 1.9718715969010701 -1.4398306095880888 5.0339154960260206 1.9481936630328012 -1.463031326719878 5.1506719952791213 1.9245157291645318 -1.5045622866292347 4.7707166063615878 1.9947794905030432 -1.5277630037610241 4.8874731056146894 1.9711015566347738 -1.5509637208928131 5.004229604867791 1.9474236227665049 -1.6156953979339588 4.7410307152033582 1.9940094502367469 -1.6388961150657482 4.8577872144564598 1.9703315163684778 -1.726828509238683 4.7113448240451294 1.9932394099704509 -1.7500292263704722 4.8281013232982311 1.9695614761021818 -1.8379616205434075 4.6816589328868998 1.9924693697041547 -1.2041796304227084 5.5884709749510089 1.8557974028600701 -1.2874852127088092 5.4434583033919877 1.8787002869908043 -1.3326420867341184 5.5534301889191093 1.8550461251580459 -1.4159476690202193 5.4084175173600881 1.8779490092887801 -1.4611045430455283 5.5183894028872098 1.8542948474560217 -1.4992532513063199 5.2634048458010678 1.9008518934195142 -1.5444101253316291 5.3733767313281886 1.8771977315867558 -1.5895669993569383 5.4833486168553103 1.8535435697539975 -1.5825588335924206 5.1183921742420466 1.9237547775502479 -1.62771570761773 5.2283640597691683 1.90010061571749 -1.672872581643039 5.3383359452962891 1.8764464538847316 -1.7180294556683484 5.4483078308234107 1.8527922920519733 -1.6658644158785212 4.9733795026830254 1.9466576616809821 -1.7110212899038304 5.0833513882101471 1.9230034998482237 -1.7561781639291398 5.1933232737372688 1.8993493380154658 -1.801335037954449 5.3032951592643895 1.8756951761827074 -1.8464919119797585 5.4132670447915112 1.8520410143499491 -1.794326872189931 4.9383387166511259 1.9459063839789579 -1.8394837462152405 5.0483106021782476 1.9222522221461995 -1.8846406202405497 5.1582824877053692 1.8985980603134416 -1.9297974942658591 5.26825437323249 1.8749438984806832 -1.9749543682911685 5.3782262587596117 1.8512897366479248 -1.8776324544760319 4.7933260450921065 1.9688092681096918 -1.9227893285013409 4.9032979306192273 1.9451551062769337 -1.9679462025266503 5.0132698161463489 1.9215009444441755 -2.0131030765519595 5.1232417016734697 1.8978467826114174 -2.058259950577269 5.2332135872005905 1.8741926207786592 -2.1034168246025784 5.3431854727277122 1.8505384589459009 -0.11357508696974383 5.0647728944110852 1.9848908027333105 -0.11455432838876778 5.1841573445900613 1.9611245746463273 -0.11553356980779156 5.3035417947690373 1.9373583465593442 -0.1165128112268155 5.4229262449480133 1.913592118472361 -0.11749205264583942 5.5423106951269885 1.889825890385378 -0.23255356433246843 5.0601440759542875 1.9834806057973249 -0.23353280575149227 5.1795285261332635 1.9597143777103416 -0.2345120471705161 5.2989129763122396 1.9359481496233586 -0.23549128858954008 5.4182974264912156 1.9121819215363753 -0.23647053000856397 5.5376818766701916 1.8884156934493923 -0.35153204169519309 5.0555152574974898 1.9820704088613392 -0.35251128311421692 5.1748997076764658 1.958304180774356 -0.35349052453324081 5.2942841578554418 1.9345379526873729 -0.35446976595226476 5.4136686080344179 1.9107717246003897 -0.47051051905791763 5.050886439040692 1.9806602119253536 -0.47148976047694147 5.170270889219668 1.9568939838383703 -0.47246900189596536 5.2896553393986441 1.9331277557513873 -0.58948899642064212 5.0462576205838943 1.9792500149893679 -0.59046823783966595 5.1656420707628703 1.9554837869023847 -0.70846747378336661 5.0416288021270965 1.9778398180533823 -0.94544518708979219 4.912986715034525 1.9987856522683942 -0.11864728880764264 5.661674290365279 1.8660603626631684 -0.25618277510744503 5.6548465123567961 1.8647240126794211 -0.37052286692215175 5.5312668432283969 1.8870654823974504 -0.39371826140724753 5.6480187343483133 1.8633876626956738 -0.48486295873685814 5.4076871740999968 1.9094069521154797 -0.50805835322195403 5.524439065219914 1.8857291324137031 -0.53125374770704992 5.6411909563398304 1.8620513127119265 -0.59920305055156464 5.2841075049715966 1.931748421833509 -0.62239844503666053 5.4008593960915139 1.9080706021317324 -0.64559383952175642 5.5176112872114311 1.8843927824299558 -0.6687892340068522 5.6343631783313475 1.8607149627281792 -0.71354314236627103 5.1605278358431965 1.9540898915515383 -0.73673853685136703 5.2772797269631138 1.9304120718497617 -0.75993393133646281 5.394031618083031 1.9067342521479851 -0.78312932582155881 5.5107835092029482 1.8830564324462085 -0.80632472030665459 5.6275354003228646 1.8593786127444318 -0.82788323418097787 5.0369481667147964 1.9764313612695676 -0.85107862866607387 5.1537000578347136 1.9527535415677912 -0.87427402315116975 5.2704519489546309 1.9290757218660146 -0.89746941763626553 5.3872038400745481 1.905397902164238 -0.92066481212136142 5.5039557311944645 1.8817200824624611 -0.94386020660645731 5.6207076223143817 1.8580422627606845 -0.96541872048078037 5.0301203887063135 1.9750950112858205 -0.98861411496587626 5.1468722798262307 1.9514171915840439 -1.011809509450972 5.263624170946148 1.9277393718822673 -1.035004903936068 5.3803760620660643 1.9040615521804907 -1.0582002984211638 5.4971279531859816 1.880383732478714 -1.0813956929062596 5.6138798443058979 1.8567059127769374 0.8961208905409539 5.0283680700748441 1.9768011938830536 0.91624947037904847 5.1468244219100345 1.9528444183162412 0.93637805021714293 5.2652807737452259 1.928887642749429 0.95650663005523784 5.3837371255804163 1.9049308671826164 0.97663520989333252 5.5021934774156067 1.8809740916158042 0.75339548096479869 4.9324246047845346 1.9986816917779107 0.77352406080289304 5.050880956619725 1.9747249162110982 0.79365264064098762 5.1693373084549163 1.9507681406442858 0.81378122047908219 5.2877936602901068 1.9268113650774736 0.83390980031717699 5.4062500121252972 1.9028545895106612 0.63079865122673751 4.9549374913294155 1.9966054141059553 0.65092723106483197 5.0733938431646068 1.9726486385391429 0.67105581090292643 5.1918501949997982 1.9486918629723304 0.69118439074102112 5.3103065468349886 1.9247350874055182 0.50820182148867654 4.9774503778742964 1.9945291364339999 0.52833040132677112 5.0959067297094878 1.9705723608671877 0.54845898116486558 5.2143630815446791 1.9466155853003753 0.38560499175061558 4.9999632644191774 1.9924528587620445 0.40573357158871021 5.1184196162543687 1.9684960831952323 0.42586215142680472 5.2368759680895609 1.9445393076284199 0.26300816201255461 5.0224761509640592 1.9903765810900891 0.2831367418506493 5.1409325027992505 1.9664198055232771 0.1404113322744934 5.0449890375089401 1.9883003034181339 0.98867378415588325 5.6210905379669338 1.8570881462140771 0.848517687332913 5.5250071075660649 1.8789461490877919 0.84735457255475244 5.6446233393680956 1.8551757880086492 0.70836159050994263 5.4289236771651961 1.9008041519615064 0.70719847573178218 5.5485399089672267 1.877033790882364 0.70603536095362163 5.6681561407692573 1.8532634298032216 0.56820549368697237 5.3328402467643272 1.9226621548352212 0.56704237890881193 5.452456478566357 1.8988917937560785 0.56587926413065137 5.5720727103683876 1.8751214326769361 0.56471614935249081 5.6916889421704191 1.8513510715977937 0.42688628208584156 5.3563730481654881 1.9207497966297933 0.42572316730768112 5.4759892799675187 1.8969794355506508 0.42456005252952056 5.5956055117695493 1.8732090744715082 0.42339693775135995 5.71522174357158 1.849438713392366 0.28673018526287136 5.2602896177646192 1.9426077995035078 0.28556707048471081 5.379905849566649 1.9188374384243654 0.2844039557065503 5.4995220813686796 1.895067077345223 0.28324084092838964 5.6191383131707102 1.8712967162660805 0.14657408843990119 5.1642061873637495 1.9644658023772226 0.14541097366174072 5.2838224191657801 1.9406954412980801 0.1442478588835801 5.4034386509678098 1.9169250802189377 0.14308474410541958 5.5230548827698414 1.8931547191397953 0.14192162932725888 5.642671114571872 1.8693843580606526 0.00641799161693094 5.0681227569628806 1.9863238052509373 0.0052548768387703235 5.1877389887649104 1.9625534441717947 0.0040917620606098692 5.3073552205669419 1.9387830830926522 0.0029286472824492458 5.4269714523689716 1.9150127220135098 0.001765532504288623 5.5465876841710022 1.8912423609343674 0.00060241772612799861 5.6662039159730329 1.8674719998552249 1.8466218003172177 4.6714903039069506 1.9939118370409852 1.8876032566941272 4.7853182964200736 1.9697623844967889 1.9285847130710372 4.8991462889331965 1.9456129319525926 1.9695661694479472 5.0129742814463185 1.9214634794083962 2.0105476258248567 5.1268022739594414 1.8973140268641999 2.0515290822017667 5.2406302664725644 1.8731645743200036 1.7308298141909626 4.7179596077755246 1.9917420535821901 1.7718112705678721 4.8317876002886475 1.9675926010379938 1.8127927269447821 4.9456155928017704 1.9434431484937975 1.8537741833216919 5.0594435853148925 1.9192936959496012 1.8947556396986016 5.1732715778280154 1.8951442434054049 1.6150378280647075 4.7644289116440985 1.9895722701233951 1.6560192844416171 4.8782569041572215 1.9654228175791988 1.697000740818527 4.9920848966703444 1.9412733650350025 1.7379821971954368 5.1059128891834664 1.9171239124908062 1.4992458419384525 4.8108982155126725 1.9874024866646001 1.540227298315362 4.9247262080257954 1.9632530341204038 1.581208754692272 5.0385542005389183 1.9391035815762074 1.3834538558121974 4.8573675193812456 1.985232703205805 1.4244353121891071 4.9711955118943694 1.9610832506616087 1.2676618696859423 4.9038368232498195 1.98306291974701 1.3086433260628518 5.0176648157629424 1.9589134672028137 1.1518698835596874 4.9503061271183926 1.9808931362882147 2.0782917847012463 5.35808756527772 1.8491459312101644 1.9243897932678919 5.2899959449343203 1.8710991835720283 1.7704878018345376 5.2219043245909198 1.8930524359338921 1.7903059771619585 5.3411341989943315 1.8690976809593343 1.6165858104011834 5.1538127042475201 1.915005688295756 1.6364039857286041 5.273042578650931 1.891050933321198 1.656222161056025 5.3922724530543427 1.86709617834664 1.4626838189678291 5.0857210839041205 1.93695894065762 1.48250199429525 5.2049509583075313 1.9130041856830617 1.5023201696226707 5.3241808327109421 1.8890494307085037 1.5221383449500916 5.4434107071143538 1.8650946757339459 1.3286000028618954 5.1368593379641316 1.9349574380449257 1.3484181781893161 5.2560892123675425 1.9110026830703677 1.3682363535167368 5.3753190867709542 1.8870479280958097 1.3880545288441577 5.4945489611743659 1.8630931731212517 1.174698011428541 5.068767717620732 1.9569106904067897 1.1945161867559619 5.1879975920241428 1.9329559354322317 1.2143343620833824 5.3072274664275536 1.9090011804576734 1.2341525374108033 5.4264573408309653 1.8850464254831154 1.2539707127382242 5.545687215234377 1.8610916705085576 1.0207960199951869 5.0006760972773314 1.9788639427686536 1.0406141953226076 5.1199059716807431 1.9549091877940954 1.0604323706500283 5.2391358460841548 1.9309544328195374 1.080250545977449 5.3583657204875657 1.9069996778449794 1.1000687213048697 5.4775955948909774 1.8830449228704214 1.1198868966322906 5.5968254692943891 1.8590901678958633 3.1426130164620423 4.7378484438151274 1.8633049759886213 3.0806811480464642 4.6335968142175767 1.8875170540012913 3.0187492796308857 4.529345184620027 1.9117291320139616 2.7317400787093886 4.2797057193066532 1.982776146303179 2.7936719471249671 4.383957348904203 1.958564068290509 2.8556038155405448 4.4882089785017527 1.9343519902778388 2.9175356839561228 4.5924606080993025 1.9101399122651688 2.9794675523717014 4.6967122376968531 1.8859278342524985 2.6305264830346258 4.3428211427859287 1.9811869265543864 2.6924583514502043 4.4470727723834784 1.9569748485417162 2.7543902198657819 4.5513244019810282 1.9327627705290462 2.81632208828136 4.6555760315785788 1.9085506925163762 2.5293128873598634 4.4059365662652041 1.9795977068055937 2.5912447557754414 4.5101881958627539 1.9553856287929234 2.6531766241910191 4.6144398254603036 1.9311735507802534 2.7151084926065976 4.7186914550578543 1.9069614727675834 2.4280992916851005 4.4690519897444796 1.9780084870568011 2.4900311601006786 4.5733036193420293 1.9537964090441309 2.5519630285162567 4.67755524893958 1.9295843310314609 2.3268856960103381 4.532167413223755 1.9764192673080083 2.3888175644259158 4.6364190428213048 1.9522071892953381 2.1637402319199968 4.4910312071054799 1.9990421255718858 2.2256721003355753 4.5952828367030305 1.9748300475592158 2.0625266362452344 4.5541466305847553 1.997452905823093 1.9613130405704715 4.6172620540640308 1.9958636860743004 3.035011383462169 4.8042190895079582 1.8617438287100552 2.8760564291704531 4.7609474793698947 1.884348271621052 2.9169334817588535 4.8759282422982002 1.8602287197882323 2.7579785274671376 4.8326566321601367 1.8828331626992292 2.7988555800555375 4.9476373950884422 1.8587136108664095 2.5990235731754221 4.7893850220220724 1.905437605610226 2.639900625763822 4.9043657849503788 1.8813180537774064 2.6807776783522219 5.0193465478786843 1.8571985019445867 2.4400686188837066 4.746113411884008 1.9280420485212229 2.4809456714721065 4.8610941748123135 1.9039224966884032 2.5218227240605064 4.9760749377406199 1.8798029448555835 2.5626997766489064 5.0910557006689263 1.8556833930227639 2.2811136645919907 4.7028418017459428 1.9506464914322197 2.3219907171803911 4.8178225646742492 1.9265269395994 2.362867769768791 4.9328033276025547 1.9024073877665804 2.4037448223571909 5.0477840905308611 1.8782878359337607 2.4446218749455908 5.1627648534591675 1.854168284100941 2.1221587103002757 4.6595701916078793 1.9732509343432167 2.1630357628886752 4.7745509545361848 1.9491313825103969 2.2039128154770751 4.8895317174644912 1.9250118306775772 2.244789868065475 5.0045124803927967 1.9008922788447575 2.2856669206538749 5.1194932433211031 1.8767727270119379 2.3265439732422748 5.2344740062494095 1.8526531751791182 2.0040808085969597 4.7312793443981205 1.9717358254213937 2.0449578611853596 4.846260107326426 1.947616273588574 2.0858349137737595 4.9612408702547324 1.9234967217557544 2.1267119663621594 5.0762216331830388 1.8993771699229347 2.1675890189505593 5.1912023961113443 1.8752576180901148 2.2084660715389588 5.3061831590396507 1.8511380662572952 3.5312951100488168 3.5926731150006441 1.9917091640617308 3.6122609571612339 3.6827897508506591 1.9675192558588057 3.6932268042736509 3.7729063867006745 1.9433293476558808 3.774192651386068 3.8630230225506894 1.919139439452956 3.8551584984984855 3.9531396584007044 1.8949495312500311 3.9361243456109025 4.0432562942507193 1.8707596230471062 3.4452883803604366 3.6692634218456748 1.9907811420558401 3.5262542274728537 3.7593800576956897 1.966591233852915 3.6072200745852707 3.8494966935457051 1.9424013256499901 3.6881859216976878 3.9396133293957201 1.9182114174470652 3.7691517688101053 4.0297299652457346 1.8940215092441404 3.3592816506720564 3.7458537286907054 1.9898531200499494 3.4402474977844735 3.8359703645407204 1.9656632118470243 3.5212133448968905 3.9260870003907358 1.9414733036440994 3.602179192009308 4.0162036362407507 1.9172833954411745 3.2732749209836762 3.8224440355357361 1.9889250980440587 3.3542407680960933 3.912560671385751 1.9647351898411336 3.4352066152085108 4.002677307235766 1.9405452816382087 3.5161724623209278 4.0927939430857814 1.9163553734352838 3.187268191295296 3.8990343423807667 1.987997076038168 3.2682340384077131 3.9891509782307817 1.9638071678352429 3.3491998855201306 4.0792676140807966 1.9396172596323182 3.1012614616069158 3.9756246492257974 1.9870690540322775 3.1822273087193329 4.0657412850758119 1.9628791458293524 3.0152547319185357 4.052214956070828 1.9861410320263868 2.9292480022301555 4.1288052629158578 1.9852130100204963 3.8443219694423467 4.1245752434464356 1.8698358842061111 3.6821153445062356 4.1071603953770515 1.893094248214932 3.7441006871197806 4.2127631409678417 1.8689183672013552 3.5818940621836695 4.1953482928984576 1.8921767312101763 3.6438794047972145 4.3009510384892478 1.8680008501965994 3.4196874372475579 4.1779334448290744 1.9154350952189971 3.4816727798611034 4.2835361904198637 1.8912592142054203 3.5436581224746484 4.3891389360106539 1.8670833331918435 3.2574808123114463 4.1605185967596912 1.9386934592278178 3.3194661549249913 4.2661213423504805 1.9145175782142414 3.3814514975385372 4.3717240879412698 1.8903416972006646 3.4434368401520823 4.47732683353206 1.8661658161870878 3.0952741873753342 4.143103748690308 1.9619518232366386 3.1572595299888802 4.2487064942810973 1.937775942223062 3.2192448726024252 4.3543092398718866 1.9136000612094854 3.2812302152159711 4.4599119854626759 1.8894241801959086 3.3432155578295162 4.5655147310534661 1.8652482991823318 2.9950529050527686 4.2312916462117141 1.9610343062318829 3.057038247666314 4.3368943918025034 1.9368584252183063 3.1190235902798591 4.4424971373932927 1.9126825442047297 3.181008932893405 4.548099882984082 1.8885066631911529 3.2429942755069501 4.6537026285748722 1.8643307821775761 2.8328462801166565 4.21387679814233 1.9842926702407038 2.8948316227302024 4.3194795437331193 1.9601167892271272 2.9568169653437479 4.4250822893239095 1.9359409082135504 4.1729121731294594 2.790964800407489 1.9959324628512431 4.2697547935400566 2.8633850691066218 1.9717869270940864 4.3665974139506547 2.9358053378057551 1.9476413913369297 4.4634400343612519 3.008225606504888 1.923495855579773 4.56028265477185 3.0806458752040218 1.899350319822616 4.6571252751824472 3.1530661439031551 1.8752047840654593 4.1028371639718664 2.8798885946186914 1.9954839550993815 4.1996797843824636 2.9523088633178243 1.9713384193422248 4.2965224047930617 3.0247291320169571 1.947192883585068 4.3933650252036589 3.0971494007160905 1.9230473478279113 4.4902076456142561 3.1695696694152242 1.8989018120707544 4.5870502660248542 3.2419899381143575 1.8747562763135976 4.0327621548142725 2.9688123888298938 1.9950354473475198 4.1296047752248697 3.0412326575290267 1.9708899115903631 4.2264473956354678 3.1136529262281596 1.9467443758332064 4.323290016046065 3.1860731949272929 1.9225988400760496 4.4201326364566631 3.2584934636264267 1.8984533043188927 3.962687145656679 3.0577361830410963 1.9945869395956581 4.0595297660672767 3.1301564517402292 1.9704414038385014 4.1563723864778748 3.202576720439362 1.9462958680813447 4.253215006888472 3.2749969891384954 1.922150332324188 3.8926121364990856 3.1466599772522983 1.9941384318437965 3.9894547569096832 3.2190802459514316 1.9699928960866397 4.0862973773202809 3.291500514650564 1.945847360329483 4.183139997730879 3.3639207833496974 1.9217018245723261 3.8225371273414921 3.2355837714635003 1.9936899240919348 3.9193797477520897 3.3080040401626336 1.9695443883347781 4.0162223681626879 3.3804243088617665 1.9453988525776214 3.7524621181838986 3.3245075656747027 1.9932414163400731 3.8493047385944963 3.3969278343738361 1.9690958805829162 3.6823871090263052 3.4134313598859047 1.9927929085882115 3.6123120998687117 3.5023551540971072 1.9923444008363496 4.7520701922255029 3.2278161405495323 1.8510570458430631 4.6707805799555215 3.3305076155980364 1.8505955224777233 4.5082596462086046 3.3416135087374412 1.8742976532666673 4.5894909676855402 3.4331990906465406 1.8501339991123835 4.3457387124616886 3.3527194018768465 1.8979997840556113 4.4269700339386233 3.4443049837859454 1.8738361299013275 4.5082013554155589 3.5358905656950448 1.8496724757470437 4.2644491001917073 3.4554108769253506 1.8975382606902715 4.345680421668642 3.5469964588344496 1.8733746065359878 4.4269117431455776 3.638582040743549 1.849210952381704 4.1019281664447904 3.4665167700647554 1.9212403914792155 4.183159487921726 3.5581023519738548 1.8970767373249318 4.2643908093986607 3.6496879338829538 1.872913083170648 4.3456221308755962 3.7412735157920531 1.8487494290163642 3.939407232697874 3.4776226632041602 1.9449425222681596 4.0206385541748091 3.5692082451132596 1.9207788681138758 4.1018698756517447 3.660793827022359 1.896615213959592 4.1831011971286793 3.7523794089314579 1.8724515598053082 4.2643325186056149 3.8439649908405573 1.8482879056510244 3.7768862989509571 3.4887285563435655 1.9686446530571033 3.8581176204278926 3.5803141382526644 1.9444809989028196 3.9393489419048278 3.6718997201617638 1.920317344748536 4.0205802633817633 3.7634853020708632 1.896153690594252 4.101811584858698 3.8550708839799621 1.8719900364399684 4.1830429063356336 3.9466564658890615 1.8478263822856844 3.6955966866809757 3.5914200313920697 1.9681831296917633 3.7768280081579113 3.6830056133011686 1.9440194755374798 3.8580593296348464 3.774591195210268 1.919855821383196 3.9392906511117816 3.8661767771193674 1.8956921672289122 4.0205219725887167 3.9577623590284663 1.8715285130746284 5.2999144142839647 2.2048203508985273 1.8525865830802963 5.1909749849663287 2.1528326902212971 1.8766880510031814 4.593928366519541 1.9923101406236179 1.997056247859021 4.702867795837177 2.0442978013008481 1.9729547799361358 4.811807225154813 2.096285461978078 1.9488533120132505 4.920746654472449 2.1482731226553078 1.9247518440903655 5.029686083790085 2.2002607833325381 1.9006503761674802 5.138625513107721 2.2522484440097679 1.876548908244595 4.5415788946609332 2.0917258944120887 1.9969171051004346 4.6505183239785692 2.1437135550893189 1.9728156371775494 4.7594577532962052 2.1957012157665488 1.9487141692546641 4.8683971826138412 2.2476888764437786 1.9246127013317791 4.9773366119314773 2.2996765371210088 1.9005112334088938 4.4892294228023255 2.191141648200559 1.9967779623418482 4.5981688521199615 2.2431293088777897 1.972676494418963 4.7071082814375975 2.2951169695550195 1.9485750264960777 4.8160477107552335 2.3471046302322494 1.9244735585731925 4.9249871400728686 2.3990922909094796 1.9003720906503072 4.4368799509437178 2.2905574019890298 1.9966388195832618 4.5458193802613538 2.3425450626662601 1.9725373516603766 4.6547588095789898 2.3945327233434899 1.9484358837374911 4.7636982388966249 2.4465203840207197 1.9243344158146061 4.3845304790851092 2.3899731557775006 1.9964996768246754 4.4934699084027461 2.4419608164547308 1.9723982089017902 4.6024093377203812 2.4939484771319607 1.9482967409789047 4.3321810072265006 2.4893889095659714 1.9963605340660888 4.4411204365441375 2.5413765702432016 1.9722590661432036 4.2798315353678928 2.5888046633544421 1.9962213913075024 4.3887709646855297 2.640792324031672 1.9721199233846172 4.2274820635092851 2.6882204171429129 1.9960822485489158 5.2410529585186731 2.3165842749787933 1.8524318840443539 5.0832120724148924 2.357474164388432 1.8764024460654329 5.1806014270115055 2.4313633364302349 1.852273386525551 5.0227605409077247 2.4722532258398733 1.87624394854663 5.1201498955043379 2.5461423978816766 1.852114889006748 4.8649196548039439 2.5131431152495121 1.9002145105677088 4.962309009400558 2.587032287291315 1.8760854510278271 5.0596983639971711 2.6609214593331183 1.8519563914879451 4.7070787687001641 2.5540330046591504 1.9241850725887879 4.8044681232967772 2.6279221767009537 1.9000560130489059 4.9018574778933903 2.7018113487427566 1.8759269535090242 4.9992468324900035 2.77570052078456 1.8517978939691422 4.5492378825963824 2.5949228940687892 1.9481556346098667 4.6466272371929964 2.6688120661105921 1.924026575069985 4.7440165917896095 2.7427012381523954 1.899897515530103 4.8414059463862227 2.8165904101941983 1.8757684559902212 4.9387953009828358 2.8904795822360017 1.8516393964503393 4.4887863510892148 2.7097019555202309 1.947997137091064 4.5861757056858288 2.7835911275620338 1.9238680775511821 4.6835650602824419 2.8574802996038371 1.8997390180113001 4.7809544148790559 2.93136947164564 1.8756099584714183 4.8783437694756691 3.0052586436874433 1.8514808989315363 4.330945464985434 2.7505918449298696 1.9719676991121431 4.428334819582048 2.8244810169716725 1.9478386395722611 4.5257241741786611 2.898370189013475 1.9237095800323791 4.6231135287752751 2.9722593610552783 1.8995805204924971 4.7205028833718883 3.0461485330970817 1.8754514609526154 4.8178922379685014 3.1200377051388846 1.8513224014127334 4.9040672517933164 1.0320220891364884 1.9966908069157254 5.0208860416372403 1.0616391014393876 1.9726286815545633 5.1377048314811642 1.0912561137422867 1.9485665561934014 5.254523621325089 1.1208731260451856 1.9245044308322397 5.3713424111690138 1.1504901383480846 1.9004423054710777 5.4881612010129386 1.1801071506509837 1.8763801801099158 4.8713033617164445 1.1390464205521296 1.996747884061894 4.9881221515603684 1.1686634328550287 1.9726857587007318 5.1049409414042923 1.1982804451579279 1.9486236333395699 5.2217597312482171 1.227897457460827 1.9245615079784082 5.3385785210921419 1.2575144697637257 1.9004993826172463 4.8385394716395727 1.2460707519677712 1.9968049612080625 4.9553582614834966 1.2756877642706701 1.9727428358469006 5.0721770513274205 1.3053047765735692 1.9486807104857387 5.1889958411713453 1.3349217888764684 1.9246185851245767 5.3058146310152701 1.3645388011793673 1.9005564597634148 4.8057755815627008 1.3530950833834123 1.996862038354231 4.9225943714066247 1.3827120956863113 1.9727999129930691 5.0394131612505486 1.4123291079892104 1.9487377876319072 5.1562319510944734 1.4419461202921096 1.9246756622707455 4.7730116914858289 1.4601194147990535 1.9969191155003996 4.889830481329752 1.4897364271019524 1.9728569901392379 5.0066492711736768 1.5193534394048518 1.9487948647780757 4.7402478014089562 1.5671437462146947 1.9969761926465681 4.8570665912528801 1.5967607585175938 1.9729140672854064 4.973885381096804 1.626377770820493 1.9488519419242445 4.7074839113320843 1.6741680776303363 1.9970332697927369 4.8243027011760073 1.7037850899332354 1.9729711444315752 4.6747200212552116 1.7811924090459772 1.9970903469389054 4.6419561311783397 1.8882167404616186 1.9971474240850742 5.6021784751302244 1.219160823901686 1.852306375128133 5.454766888974417 1.2892550033624606 1.8764346290040732 5.5645400873106521 1.3426044750631703 1.852343130316509 5.4171285011548447 1.4126986545239451 1.8764713841924492 5.5269016994910798 1.4660481262246545 1.852379885504885 5.2697169149990373 1.4827928339847196 1.9005996380683892 5.3794901133352724 1.5361423056854293 1.8765081393808252 5.4892633116715075 1.5894917773861388 1.852416640693261 5.1223053288432299 1.5528870134454942 1.9247278919443294 5.232078527179465 1.6062364851462041 1.9006363932567651 5.3418517255157001 1.6595859568469136 1.8765448945692011 5.4516249238519352 1.712935428547623 1.8524533958816369 5.0846669410236576 1.6763306646069784 1.9247646471327053 5.1944401393598927 1.7296801363076884 1.9006731484451411 5.3042133376961278 1.7830296080083978 1.8765816497575771 5.4139865360323629 1.8363790797091073 1.8524901510700129 4.9372553548678502 1.7464248440677532 1.9488929010086455 5.0470285532040853 1.7997743157684627 1.9248014023210813 5.1568017515403204 1.8531237874691726 1.9007099036335171 5.2665749498765555 1.9064732591698821 1.8766184049459531 5.3763481482127906 1.9598227308705916 1.8525269062583889 4.7898437687120428 1.816519023528528 1.9730211548845857 4.8996169670482779 1.8698684952292377 1.9489296561970215 5.009390165384513 1.9232179669299472 1.9248381575094573 5.1191633637207481 1.9765674386306569 1.9007466588218931 5.2289365620569832 2.0299169103313663 1.8766551601343291 5.3387097603932183 2.0832663820320758 1.8525636614467649 4.7522053808924714 1.9399626746900123 1.9730579100729617 4.8619785792287065 1.9933121463907222 1.9489664113853975 4.9717517775649407 2.0466616180914317 1.9248749126978333 5.0815249759011758 2.1000110897921411 1.9007834140102691 5.0214353668144156 0.031827528330118704 1.9951127022983981 5.141617055037937 0.038010473771232345 1.9710859471158433 5.2617987432614566 0.044193419212345764 1.9470591919332885 5.381980431484978 0.050376364653459293 1.9230324367507337 5.5021621197084984 0.056559310094572712 1.8990056815681788 5.6223438079320198 0.062742255535686145 1.8749789263856242 5.0095853891810078 0.14281499583838586 1.9952954363677602 5.1297670774045292 0.1489979412794995 1.9712686811852054 5.2499487656280488 0.15518088672061292 1.9472419260026506 5.3701304538515702 0.16136383216172645 1.9232151708200957 5.4903121420750916 0.16754677760283992 1.8991884156375409 5.610493830298612 0.17372972304395337 1.8751616604549861 4.9977354115476 0.25380246334665324 1.9954781704371223 5.1179170997711214 0.25998540878776677 1.9714514152545675 5.238098787994641 0.26616835422888019 1.9474246600720126 5.3582804762181624 0.27235129966999372 1.9233979048894578 5.4784621644416838 0.27853424511110725 1.899371149706903 4.9858854339141923 0.36478993085492051 1.9956609045064844 5.1060671221377136 0.37097287629603398 1.9716341493239296 5.2262488103612332 0.37715582173714735 1.9476073941413747 5.3464304985847546 0.38333876717826088 1.9235806389588199 4.9740354562807845 0.47577739836318772 1.9958436385758465 5.0942171445043058 0.48196034380430108 1.9718168833932916 5.2143988327278255 0.4881432892454145 1.9477901282107368 4.9621854786473767 0.58676486587145482 1.9960263726452085 5.0823671668708981 0.59294781131256824 1.9719996174626537 5.2025488550944186 0.59913075675368177 1.9479728622800989 4.9503355010139689 0.69775233337972231 1.9962091067145706 5.0705171892374903 0.70393527882083573 1.9721823515320158 4.9384855233805611 0.80873980088798958 1.9963918407839327 4.9266355457471542 0.91972726839625674 1.9965745748532946 5.7418368182439004 0.076372348239448495 1.8509432595166126 5.7284264020019808 0.20423391017632153 1.8511058010701715 5.5971096535146598 0.30130753969980528 1.8753245415545334 5.7150159857600613 0.33209547211319468 1.8512683426237304 5.4657929050273379 0.39838116922328881 1.8995432820388956 5.5836992372727403 0.42916910163667832 1.8754870831080923 5.7016055695181418 0.45995703405006771 1.8514308841772893 5.3344761565400161 0.49545479874677245 1.9237620225232577 5.4523824887854184 0.52624273116016185 1.8997058235924544 5.5702888210308199 0.55703066357355135 1.8756496246616512 5.6881951532762223 0.58781859598694075 1.8515934257308482 5.3210657402980965 0.62331636068364549 1.9239245640768166 5.438972072543498 0.65410429309703488 1.8998683651460133 5.5568784047889004 0.68489222551042439 1.8758121662152101 5.6747847370343019 0.71568015792381368 1.8517559672844071 5.1897489918107746 0.72038999020712935 1.9481433045611785 5.3076553240561761 0.75117792262051886 1.9240871056303754 5.4255616563015785 0.78196585503390825 1.9000309066995722 5.54346798854698 0.81275378744729765 1.875974707768769 5.6613743207923823 0.84354171986068693 1.8519185088379659 5.0584322433234536 0.81746361973061277 1.9723620450455404 5.1763385755688542 0.84825155214400239 1.9483058461147373 5.2942449078142566 0.87903948455739189 1.9242496471839343 5.4121512400596581 0.90982741697078129 1.9001934482531311 5.5300575723050605 0.94061534938417068 1.8761372493223278 5.6479639045504619 0.97140328179755997 1.8520810503915248 5.0450218270815332 0.94532518166748603 1.9725245865990995 5.1629281593269347 0.97611311408087553 1.9484683876682962 5.2808344915723362 1.0069010464942649 1.9244121887374932 5.3987408238177386 1.0376889789076542 1.90035598980669 5.51664715606314 1.0684769113210437 1.8762997908758869 5.6345534883085424 1.099264843734433 1.8522435919450839 4.9407403992219878 -0.97092388602792989 1.9927659440213195 5.0596416762761498 -0.98842273322091301 1.9687721868341905 5.1785429533303109 -1.0059215804138959 1.9447784296470618 5.2974442303844711 -1.0234204276068792 1.9207846724599331 5.4163455074386331 -1.0409192747998623 1.8967909152728042 5.5352467844927951 -1.0584181219928457 1.8727971580856755 4.9503332256954877 -0.86005132352972169 1.9930299341104774 5.0692345027496497 -0.8775501707227048 1.9690361769233484 5.1881357798038108 -0.89504901791568781 1.9450424197362197 5.307037056857971 -0.91254786510867103 1.921048662549091 5.425938333912133 -0.93004671230165425 1.8970549053619621 5.544839610966295 -0.94754555949463737 1.8730611481748334 4.9599260521689876 -0.74917876103151348 1.9932939241996352 5.0788273292231496 -0.76667760822449671 1.9693001670125063 5.1977286062773107 -0.78417645541747971 1.9453064098253776 5.3166298833314709 -0.80167530261046283 1.9213126526382489 5.4355311603856338 -0.81917414980344605 1.8973188954511202 4.9695188786424875 -0.63830619853330495 1.9935579142887931 5.0884201556966495 -0.65580504572628817 1.9695641571016644 5.2073214327508106 -0.67330389291927117 1.9455703999145357 5.3262227098049708 -0.6908027401122544 1.921576642727407 4.9791117051159874 -0.52743363603509674 1.993821904377951 5.0980129821701494 -0.54493248322807997 1.9698281471908223 5.2169142592243105 -0.56243133042106297 1.9458343900036936 5.3358155362784716 -0.5799301776140463 1.9218406328165649 4.9887045315894873 -0.41656107353688854 1.9940858944671089 5.1076058086436493 -0.43405992072987182 1.9700921372799804 5.2265070856978104 -0.45155876792285482 1.9460983800928517 4.9982973580629873 -0.30568851103868033 1.9943498845562668 5.1171986351171483 -0.32318735823166367 1.9703561273691383 5.0078901845364872 -0.19481594854047185 1.9946138746454249 5.0174830110099871 -0.083943386042263937 1.9948778647345828 5.6548104296812376 -1.0695807698944266 1.8487957811676372 5.6661571676182652 -0.94193032815171263 1.8490395946620897 5.5560299630799639 -0.82139110116638037 1.8733067606958851 5.6775039055552927 -0.81427988640899862 1.8492834081565421 5.4459027585416626 -0.70085187418104833 1.8975739267296807 5.5673767010169914 -0.69374065942366636 1.8735505741903375 5.6888506434923203 -0.68662944466628451 1.8495272216509946 5.4572494964786902 -0.57320143243833432 1.8978177402241332 5.578723438954019 -0.56609021768095236 1.87379438768479 5.7001973814293478 -0.5589790029235705 1.8497710351454471 5.3471222919403871 -0.45266220545300201 1.9220849062579286 5.4685962344157177 -0.44555099069562021 1.8980615537185856 5.5900701768910466 -0.43843977593823819 1.8740382011792425 5.7115441193663754 -0.4313285611808565 1.8500148486398995 5.2369950874020859 -0.33212297846766975 1.9463520722917242 5.3584690298774147 -0.32501176371028789 1.9223287197523811 5.4799429723527453 -0.31790054895290609 1.8983053672130381 5.6014169148280741 -0.31078933419552413 1.8742820146736949 5.722890857303403 -0.30367811943814238 1.850258662134352 5.1268678828637837 -0.21158375148233777 1.9706192383255194 5.2483418253391134 -0.20447253672495574 1.9465958857861767 5.3698157678144423 -0.19736132196757386 1.9225725332468335 5.4912897102897729 -0.19025010721019206 1.8985491807074906 5.6127636527651017 -0.18313889245281015 1.8745258281681474 5.7342375952404305 -0.17602767769542832 1.8505024756288044 5.1382146208008113 -0.083933309739623568 1.9708630518199719 5.259688563276141 -0.076822094982241643 1.9468396992806289 5.3811625057514698 -0.069710880224859703 1.922816346741286 5.5026364482267995 -0.062599665467477847 1.898792994201943 5.6241103907021293 -0.055488450710095977 1.8747696416625999 5.745584333177459 -0.048377235952714148 1.8507462891232569 5.2301460558431003 -2.13845252432175 1.8701265211791367 5.1171318194257225 -2.0980312359694873 1.894087826713849 5.0041175830083446 -2.0576099476172245 1.9180491322485611 4.8911033465909677 -2.0171886592649617 1.9420104377832734 4.7780891101735898 -1.9767673709126996 1.9659717433179853 4.6957136542651794 -1.8298908007892027 1.9902494211509605 4.8087278906825555 -1.8703120891414655 1.9662881156162482 4.9217421270999333 -1.9107333774937276 1.9423268100815363 5.0347563635173103 -1.9511546658459904 1.918365504546824 5.1477705999346881 -1.9915759541982532 1.8944041990121119 5.260784836352066 -2.0319972425505157 1.8704428934773996 4.726352434774145 -1.7234355190179687 1.9905657934492234 4.8393666711915211 -1.7638568073702312 1.966604487914511 4.9523809076088989 -1.8042780957224935 1.9426431823797992 5.0653951440262768 -1.8446993840747563 1.9186818768450868 5.1784093804436546 -1.8851206724270191 1.8947205713103747 4.7569912152831106 -1.6169802372467343 1.9908821657474862 4.8700054517004876 -1.6574015255989969 1.9669208602127739 4.9830196881178654 -1.6978228139512592 1.942959554678062 5.0960339245352433 -1.738244102303522 1.9189982491433497 4.7876299957920763 -1.5105249554755003 1.9911985380457491 4.9006442322094532 -1.5509462438277628 1.967237232511037 5.0136584686268311 -1.5913675321800251 1.9432759269763249 5.1266727050442089 -1.6317888205322879 1.9193146214416128 4.8182687763010419 -1.4040696737042659 1.991514910344012 4.9312830127184197 -1.4444909620565287 1.9675536048092999 5.0442972491357976 -1.484912250408791 1.9435922992745878 4.8489075568100075 -1.2976143919330319 1.991831282642275 4.9619217932273854 -1.3380356802852944 1.967869977107563 4.879546337318974 -1.1911591101617973 1.9921476549405379 4.9101851178279405 -1.0847038283905632 1.992464027238801 5.2959415808541381 -1.9109757955717317 1.8707402601959189 5.2112118215738539 -1.7716896294257163 1.8950278418042545 5.3315312007592475 -1.788558734408209 1.871035805950835 5.2468014414789623 -1.6492725682621936 1.8953233875591706 5.3671208206643559 -1.6661416732446863 1.871331351705751 5.1620716821986781 -1.5099864021161782 1.9196109691675065 5.2823910613840717 -1.5268555070986709 1.8956189333140867 5.4027104405694653 -1.5437246120811636 1.8716268974606671 5.0773419229183938 -1.370700235970163 1.9438985507758422 5.1976613021037865 -1.3875693409526555 1.9199065149224226 5.3179806812891801 -1.4044384459351482 1.8959144790690028 5.4383000604745746 -1.4213075509176409 1.8719224432155832 5.5586194396599664 -1.4381766559001334 1.8479304073621639 4.9926121636381096 -1.2314140698241476 1.9681861323841778 5.1129315428235032 -1.2482831748066399 1.9441940965307583 5.2332509220088959 -1.2651522797891324 1.9202020606773387 5.3535703011942894 -1.2820213847716251 1.8962100248239191 5.473889680379683 -1.2988904897541178 1.8722179889704993 5.5942090595650757 -1.3157595947366105 1.8482259531170799 5.0282017835432189 -1.1089970086606249 1.9684816781390939 5.1485211627286116 -1.1258661136431172 1.9444896422856743 5.2688405419140043 -1.1427352186256097 1.920497606432255 5.3891599210993979 -1.1596043236081024 1.8965055705788352 5.5094793002847924 -1.1764734285905951 1.8725135347254154 5.6297986794701851 -1.1933425335730878 1.848521498871996 4.7205676938156529 -3.1340600597172479 1.8671569828510219 4.6178552329414586 -3.0722590293313772 1.8910854180585925 4.5151427720672643 -3.010457998945506 1.9150138532661631 4.2572993373294947 -2.7272517891691073 1.9871486937488358 4.3600117982036881 -2.7890528195549784 1.9632202585412655 4.4627242590778824 -2.8508538499408491 1.9392918233336951 4.5654367199520758 -2.9126548803267203 1.9153633881261247 4.6681491808262701 -2.9744559107125914 1.8914349529185541 4.7708616417004643 -3.0362569410984621 1.8675065177109835 4.3075932852143062 -2.6294486705503215 1.9874982286087977 4.4103057460884996 -2.6912497009361926 1.9635697934012273 4.5130182069626938 -2.7530507313220633 1.9396413581936567 4.6157306678368872 -2.8148517617079345 1.9157129229860863 4.7184431287110815 -2.8766527920938056 1.8917844877785157 4.3578872330991176 -2.5316455519315357 1.9878477634687592 4.460599693973311 -2.5934465823174069 1.9639193282611889 4.5633121548475053 -2.6552476127032776 1.9399908930536183 4.6660246157216987 -2.7170486430891487 1.9160624578460479 4.4081811809839291 -2.4338424333127495 1.9881972983287211 4.5108936418581225 -2.4956434636986207 1.9642688631211507 4.6136061027323167 -2.5574444940844914 1.9403404279135801 4.4584751288687405 -2.3360393146939638 1.9885468331886826 4.5611875897429339 -2.3978403450798349 1.9646183979811123 4.6639000506171282 -2.4596413754657056 1.9406899627735417 4.508769076753552 -2.238236196075178 1.9888963680486444 4.6114815376277454 -2.3000372264610491 1.9649679328410741 4.5590630246383634 -2.1404330774563922 1.989245902908606 4.6093569725231749 -2.042629958837606 1.9895954377685678 4.8290462980003275 -2.9239206364333743 1.8678344486885443 4.7727766858904257 -2.7714094804855254 1.8921229626373275 4.8872705453100611 -2.8115114126484899 1.8681622712703214 4.716507073780523 -2.6188983245376765 1.9164114765861107 4.8310009332001584 -2.659000256700641 1.8924507852191046 4.9454947926197939 -2.6991021888636055 1.8684900938520985 4.7747313210902567 -2.5064891007527921 1.9167392991678878 4.8892251805098921 -2.5465910329157566 1.8927786078008817 5.0037190399295275 -2.5866929650787212 1.8688179164338758 4.7184617089803549 -2.3539779448049436 1.9410278131166709 4.8329555683999894 -2.3940798769679077 1.9170671217496649 4.9474494278196257 -2.4341818091308722 1.893106430382659 5.0619432872392611 -2.4742837412938368 1.869145739015653 4.6621920968704531 -2.2014667888570951 1.9653163270654541 4.7766859562900885 -2.2415687210200592 1.9413556356984483 4.891179815709723 -2.2816706531830233 1.9173949443314422 5.0056736751293585 -2.3217725853459878 1.8934342529644361 5.1201675345489939 -2.3618745175089524 1.8694735615974303 4.7204163441801859 -2.0890575650722107 1.9656441496472312 4.8349102035998213 -2.1291594972351753 1.9416834582802254 4.9494040630194558 -2.1692614293981394 1.9177227669132193 5.0638979224390912 -2.2093633615611039 1.8937620755462135 5.1783917818587275 -2.2494652937240684 1.8698013841792074 4.6641467320702841 -1.936546409124362 1.9899326635960144 4.0317759315934101 -4.0032656166163854 1.8640199378680449 3.9429516852837323 -3.9230756357882224 1.8879117857479326 3.8541274389740545 -3.842885654960059 1.9118036336278204 3.7653031926643772 -3.7626956741318964 1.9356954815077083 3.6553614293238734 -3.5168905018546885 1.9838499791200082 3.7441856756335508 -3.5970804826828515 1.9599581312401204 3.8330099219432281 -3.6772704635110145 1.9360662833602329 3.9218341682529054 -3.757460444339177 1.9121744354803449 4.0106584145625828 -3.8376504251673405 1.8882825876004572 3.7230681586027239 -3.4314652912338066 1.9842207809725327 3.8118924049124012 -3.5116552720619696 1.960328933092645 3.9007166512220786 -3.5918452528901326 1.9364370852127575 3.9895408975317563 -3.6720352337182951 1.9125452373328695 4.0783651438414337 -3.7522252145464585 1.8886533894529818 3.7907748878815744 -3.3460400806129247 1.9845915828250573 3.8795991341912517 -3.4262300614410877 1.9606997349451696 3.968423380500929 -3.5064200422692506 1.9368078870652821 4.0572476268106072 -3.5866100230974132 1.9129160391853941 3.8584816171604248 -3.2606148699920428 1.9849623846775819 3.9473058634701026 -3.3408048508202057 1.9610705367976942 4.0361301097797799 -3.4209948316483687 1.9371786889178064 3.9261883464392753 -3.1751896593711608 1.9853331865301065 4.0150125927489535 -3.2553796401993238 1.9614413386502187 4.1038368390586308 -3.3355696210274868 1.937549490770331 3.9938950757181257 -3.0897644487502789 1.9857039883826311 4.0827193220278035 -3.1699544295784419 1.9618121405027433 4.0616018049969762 -3.004339238129397 1.9860747902351557 4.1293085342758271 -2.918914027508515 1.9864455920876802 4.1015884354686154 -3.9153143452962085 1.8643856889173884 4.1794892692491494 -3.8176604152336608 1.8647320397125526 4.1532429240305664 -3.6581977015193909 1.8890069911897813 4.2573901030296835 -3.7200064851711128 1.8650783905077168 4.1269965788119833 -3.498734987805121 1.91328194266701 4.2311437578111004 -3.5605437714568429 1.8893533419849455 4.3352909368102175 -3.6223525551085647 1.8654247413028811 4.2048974125925174 -3.401081057742573 1.9136282934621742 4.3090445915916344 -3.4628898413942952 1.8896996927801097 4.4131917705907515 -3.5246986250460166 1.8657710920980453 4.1786510673739343 -3.2416183440283035 1.9379032449394027 4.2827982463730514 -3.3034271276800249 1.9139746442573384 4.3869454253721685 -3.3652359113317472 1.8900460435752739 4.4910926043712855 -3.427044694983469 1.8661174428932095 4.1524047221553513 -3.0821556303140336 1.9621781964166316 4.2565519011544684 -3.1439644139657554 1.9382495957345669 4.3606990801535854 -3.2057731976174773 1.9143209950525026 4.4648462591527025 -3.2675819812691991 1.8903923943704382 4.5689934381518205 -3.3293907649209213 1.8664637936883737 4.2303055559358853 -2.9845017002514855 1.9625245472117958 4.3344527349350024 -3.0463104839032074 1.9385959465297311 4.4385999139341203 -3.1081192675549292 1.9146673458476668 4.5427470929332374 -3.169928051206651 1.8907387451656024 4.6468942719323554 -3.2317368348583733 1.8668101444835379 4.2040592107173023 -2.8250389865372161 1.9867994986890245 4.3082063897164193 -2.8868477701889379 1.9628708980069598 4.4123535687155373 -2.9486565538406597 1.9389422973248955 3.1895983342812575 -4.7207108287129271 1.8607482233881278 3.1170590583076723 -4.6258826192143623 1.8845976119656433 3.0445197823340866 -4.5310544097157974 1.9084470005431591 2.9719805063605009 -4.4362262002172317 1.9322963891206746 2.9099531132335295 -4.1758867772813835 1.9803852426769772 2.9824923892071151 -4.2707149867799483 1.9565358540994615 3.0550316651807004 -4.3655431962785132 1.932686465521946 3.127570941154286 -4.4603714057770789 1.9088370769444305 3.2001102171278717 -4.5551996152756438 1.8849876883669148 2.9930042720537289 -4.105203773342665 1.9807753190782487 3.0655435480273145 -4.2000319828412298 1.9569259305007329 3.1380828240008998 -4.2948601923397947 1.9330765419232174 3.2106220999744854 -4.3896884018383604 1.9092271533457019 3.2831613759480711 -4.4845166113369253 1.8853777647681862 3.0760554308739283 -4.0345207694039464 1.9811653954795201 3.148594706847514 -4.1293489789025113 1.9573160069020044 3.2211339828210992 -4.2241771884010761 1.9334666183244889 3.2936732587946849 -4.3190053978996419 1.9096172297469731 3.1591065896941277 -3.9638377654652279 1.9815554718807915 3.2316458656677134 -4.0586659749637928 1.9577060833032758 3.3041851416412991 -4.1534941844623585 1.9338566947257603 3.2421577485143276 -3.8931547615265094 1.9819455482820629 3.3146970244879133 -3.9879829710250743 1.9580961597045472 3.3872363004614989 -4.08281118052364 1.9342467711270315 3.325208907334527 -3.8224717575877909 1.9823356246833341 3.3977481833081127 -3.9172999670863562 1.9584862361058186 3.4082600661547264 -3.7517887536490724 1.9827257010846056 3.4913112249749259 -3.6811057497103543 1.9831157774858768 3.278419033900672 -4.6453829677525889 1.8611243815256189 3.3732191823635911 -4.5652412600906302 1.8614861150235831 3.3776674360446042 -4.4046116640101687 1.8857402077159318 3.4680193308265101 -4.4850995524286716 1.8618478485215473 3.3821156897256173 -4.2439820679297062 1.9099943004082802 3.4724675845075232 -4.3244699563482101 1.886101941213896 3.5628194792894292 -4.404957844766713 1.8622095820195115 3.4769158381885363 -4.1638403602677476 1.9103560339062444 3.5672677329704423 -4.2443282486862515 1.8864636747118602 3.6576196277523483 -4.3248161371047544 1.8625713155174757 3.4813640918695494 -4.0032107641872861 1.9346101265985929 3.5717159866514554 -4.083698652605789 1.9107177674042086 3.6620678814333614 -4.1641865410242929 1.8868254082098244 3.7524197762152673 -4.2446744294427958 1.8629330490154399 3.4858123455505625 -3.842581168106824 1.9588642192909413 3.5761642403324685 -3.9230690565253274 1.9349718600965571 3.6665161351143745 -4.0035569449438304 1.9110795009021728 3.7568680298962804 -4.0840448333623343 1.8871871417077886 3.8472199246781864 -4.1645327217808372 1.8632947825134041 3.5806124940134816 -3.7624394604448654 1.9592259527889055 3.6709643887953876 -3.8429273488633688 1.9353335935945215 3.761316283577294 -3.9234152372818722 1.911441234400137 3.8516681783591995 -4.0039031257003757 1.8875488752057528 3.9420200731411055 -4.0843910141188795 1.8636565160113683 3.5850607476944951 -3.6018098643644039 1.9834800454812542 3.6754126424764011 -3.6822977527829073 1.95958768628687 2.2078109927402685 -5.2718021819701351 1.8572602553117368 2.1519892181105673 -5.1666397792410148 1.8810571837146839 2.026715505611663 -4.6912120823506971 1.9766659873007597 2.0825372802413642 -4.7963744850798173 1.9528690588978126 2.1383590548710658 -4.9015368878089376 1.9290721304948657 2.194180829500767 -5.0066992905380578 1.9052752020919186 2.2500026041304686 -5.1118616932671781 1.8814782736889715 2.1247288916315648 -4.6364339963768604 1.9770870772750475 2.1805506662612659 -4.7415963991059806 1.9532901488721004 2.2363724408909675 -4.8467588018351009 1.9294932204691535 2.2921942155206687 -4.9519212045642211 1.9056962920662064 2.222742277651466 -4.5816559104030237 1.9775081672493353 2.2785640522811672 -4.6868183131321439 1.9537112388463882 2.3343858269108688 -4.7919807158612633 1.9299143104434411 2.39020760154057 -4.8971431185903835 1.906117382040494 2.3207556636713673 -4.526877824429187 1.9779292572236231 2.3765774383010689 -4.6320402271583063 1.954132328820676 2.4323992129307701 -4.7372026298874266 1.9303354004177289 2.418769049691269 -4.4720997384553494 1.9783503471979109 2.4745908243209707 -4.5772621411844696 1.9545534187949636 2.5167824357111703 -4.4173216524815118 1.9787714371721987 2.5726042103408719 -4.522484055210632 1.9549745087692514 2.6147958217310721 -4.3625435665076751 1.9791925271464863 2.3138213745017127 -5.2128779558397227 1.8576587217494631 2.3497545889418086 -5.056182209506181 1.8818944451595367 2.4242202748085306 -5.1516784486466562 1.8580447730486838 2.4601534892486265 -4.9949827023131146 1.8822804964587574 2.5346191751153486 -5.0904789414535898 1.8584308243479044 2.4960867036887224 -4.8382869559795729 1.906516219868831 2.570552389555445 -4.9337831951200481 1.882666547757978 2.6450180754221666 -5.0292794342605234 1.8588168756471251 2.5320199181288183 -4.6815912096460304 1.9307519432789046 2.6064856039955409 -4.7770874487865065 1.9069022711680517 2.6809512898622634 -4.8725836879269817 1.8830525990571987 2.755416975728985 -4.9680799270674569 1.8592029269463459 2.6424188184356368 -4.6203917024529639 1.9311379945781253 2.7168845043023593 -4.71588794159344 1.9072883224672725 2.7913501901690814 -4.8113841807339153 1.8834386503564196 2.865815876035803 -4.9068804198743905 1.8595889782455666 2.6783520328757326 -4.4636959561194232 1.9553737179881989 2.7528177187424547 -4.5591921952598975 1.9315240458773462 2.8272834046091773 -4.6546884344003736 1.9076743737664932 2.9017490904758994 -4.7501846735408488 1.8838247016556402 2.976214776342621 -4.8456809126813241 1.8599750295447874 2.7142852473158285 -4.3070002097858815 1.9796094413982728 2.7887509331825511 -4.4024964489263567 1.9557597692874196 2.8632166190492727 -4.4979926880668311 1.9319100971765668 2.9376823049159952 -4.5934889272073072 1.908060425065714 3.0121479907827173 -4.6889851663477824 1.8842107529548611 3.0866136766494394 -4.7844814054882567 1.8603610808440081 2.824684147622647 -4.2458007025928151 1.9799954926974934 2.8991498334893695 -4.3412969417332903 1.9561458205866404 1.1422486376743044 -5.4938203153802956 1.8774943445971444 1.1054823468648869 -5.3808195418481368 1.9012410099680639 1.0687160560554692 -5.267818768315979 1.924987675338983 1.0319497652460516 -5.154817994783822 1.9487343407099023 1.0719538863833158 -4.8918972145651543 1.9967016822315631 1.1087201771927333 -5.004897988097313 1.9729550168606438 1.1454864680021508 -5.1178987616294709 1.9492083514897245 1.1822527588115683 -5.2308995351616279 1.9254616861188052 1.2190190496209861 -5.3439003086937866 1.9017150207478859 1.2557853404304038 -5.4569010822259454 1.8779683553769664 1.185490589139415 -4.8549779814108032 1.9971756930113853 1.2222568799488325 -4.9679787549429619 1.973429027640466 1.25902317075825 -5.0809795284751198 1.9496823622695467 1.2957894615676675 -5.1939803020072777 1.9259356968986272 1.3325557523770852 -5.3069810755394364 1.9021890315277079 1.2990272918955141 -4.818058748256453 1.9976497037912073 1.3357935827049316 -4.9310595217886108 1.973903038420288 1.3725598735143492 -5.0440602953207696 1.9501563730493687 1.4093261643237667 -5.1570610688529266 1.9264097076784494 1.4125639946516133 -4.7811395151021028 1.9981237145710296 1.4493302854610308 -4.8941402886342606 1.9743770492001103 1.4860965762704483 -5.0071410621664185 1.950630383829191 1.5228628670798661 -5.1201418356985764 1.9268837184582714 1.5261006974077127 -4.7442202819477517 1.9985977253508516 1.5628669882171302 -4.8572210554799096 1.9748510599799323 1.5996332790265477 -4.9702218290120683 1.951104394609013 1.6396374001638119 -4.7073010487934006 1.9990717361306738 1.6764036909732294 -4.8203018223255594 1.9753250707597545 1.7531741029199108 -4.6703818156390504 1.9995457469104958 1.1822418779632629 -5.605878908814085 1.8537406588533478 1.311212538696968 -5.5644533863181254 1.8541810923675017 1.3812165158254603 -5.4165089916649096 1.8784164891997333 1.4401831994306731 -5.5230278638221657 1.8546215258816556 1.4512204929539525 -5.2685645970116939 1.9026518860319646 1.5101871765591655 -5.37508346916895 1.8788569227138872 1.5691538601643784 -5.4816023413262052 1.8550619593958095 1.5801911536876576 -5.2271390745157342 1.9030923195461185 1.6391578372928706 -5.3336579466729903 1.8792973562280411 1.6981245208980835 -5.4401768188302455 1.8555023929099634 1.65019513081615 -5.0791946798625176 1.9273277163783498 1.7091618144213627 -5.1857135520197746 1.9035327530602724 1.7681284980265757 -5.2922324241770298 1.879737789742195 1.8270951816317886 -5.3987512963342859 1.8559428264241173 1.7201991079446421 -4.9312502852093028 1.9515631132105813 1.7791657915498551 -5.0377691573665579 1.9277681498925037 1.8381324751550678 -5.144288029523814 1.9039731865744263 1.8970991587602808 -5.2508069016810701 1.8801782232563489 1.9560658423654937 -5.3573257738383253 1.8563832599382712 1.7902030850731343 -4.783305890556087 1.9757985100428126 1.8491697686783475 -4.8898247627133431 1.952003546724735 1.9081364522835602 -4.9963436348705983 1.9282085834066576 1.9671031358887732 -5.1028625070278544 1.9044136200885802 2.0260698194939861 -5.2093813791851096 1.8806186567705028 2.0850365030991989 -5.3159002513423657 1.8568236934524252 1.9191737458068396 -4.7418803680601274 1.9762389435569665 1.9781404294120526 -4.8483992402173826 1.9524439802388889 2.0371071130172655 -4.9549181123746386 1.9286490169208115 2.0960737966224783 -5.0614369845318938 1.9048540536027341 0.82500060526666963 -4.9405133752335386 1.9956699079799844 0.69811909087768809 -4.9557635492188092 1.9951222155917281 0.70993621043659483 -5.0738303258092925 1.9714057624923846 0.57123757648870666 -4.9710137232040807 1.9945745232034717 0.58305469604761329 -5.089080499794564 1.9708580701041283 0.59487181560652003 -5.2071472763850473 1.9471416170047851 0.444356062099725 -4.9862638971893514 1.9940268308152154 0.45617318165863163 -5.1043306737798346 1.9703103777158719 0.46799030121753837 -5.2223974503703179 1.9465939246165287 0.47980742077644495 -5.340464226960802 1.9228774715171852 0.31747454771074352 -5.0015140711746229 1.993479138426959 0.32929166726965015 -5.1195808477651061 1.9697626853276156 0.34110878682855683 -5.2376476243555885 1.9460462322282723 0.35292590638746341 -5.3557144009460727 1.9223297791289289 0.19059303332176206 -5.0167642451598935 1.9929314460387026 0.20241015288066866 -5.1348310217503768 1.9692149929393592 0.21422727243957532 -5.25289779834086 1.9454985398400158 0.22604439199848189 -5.3709645749313433 1.9217820867406725 0.23786151155738855 -5.4890313515218274 1.8980656336413291 0.063711518932780431 -5.032014419145165 1.9923837536504463 0.075528638491687033 -5.1500811957356483 1.9686673005511028 0.087345758050593636 -5.2681479723261306 1.9449508474517594 0.099162877609500238 -5.3862147489166139 1.9212343943524159 0.11097999716840695 -5.504281525507098 1.8975179412530725 0.12279711672731355 -5.6223483020975813 1.8738014881537295 0.0077327218972386026 -5.7556652526733352 1.8495373426661297 0.15589915066086713 -5.738405437139269 1.8500677814874771 0.26377979788024397 -5.6057667489901517 1.8743377501260594 0.30471655239055329 -5.7210841591864821 1.8505976926296699 0.37166044509962071 -5.4731280608410344 1.898607718764642 0.41259719960993013 -5.5884454710373648 1.8748676612682522 0.45353395412023956 -5.7037628812336951 1.8511276037718627 0.52047784682930709 -5.4558067828882475 1.8991376299068348 0.56141460133961663 -5.5711241930845778 1.875397572410445 0.60235135584992594 -5.6864416032809082 1.8516575149140553 0.62835849404868405 -5.3231680947391311 1.9234075985454171 0.66929524855899336 -5.4384855049354606 1.8996675410490276 0.71023200306930279 -5.5538029151317909 1.8759274835526378 0.75116875757961221 -5.6691203253281213 1.8521874260562481 0.73623914126806089 -5.1905294065900138 1.9476775671839994 0.77717589577837032 -5.3058468167863442 1.9239375096876099 0.81811265028867952 -5.4211642269826736 1.9001974521912204 0.85904940479898906 -5.536481637179004 1.8764573946948306 0.89998615930929848 -5.6517990473753343 1.8527173371984407 0.84411978848743763 -5.0578907184408974 1.9719475358225822 0.88505654299774705 -5.1732081286372278 1.9482074783261922 0.92599329750805648 -5.2885255388335572 1.9244674208298027 0.96693005201836579 -5.4038429490298867 1.9007273633334132 1.0078668065286753 -5.5191603592262171 1.8769873058370232 1.0488035610389848 -5.6344777694225483 1.8532472483406335 0.95200043570681492 -4.9252520302917802 1.9962175044611645 0.99293719021712423 -5.0405694404881105 1.9724774469647748 -1.2437913877195432 -6.2660769008734389 1.4313415882561091 -1.2258667911690302 -6.1659302216497576 1.4994370750134534 -0.9721462932624787 -5.6785861514229525 1.8417672804067711 -0.99007088981299174 -5.7787328306466348 1.7736717936494266 -1.0079954863635046 -5.878879509870317 1.705576306892082 -1.0259200829140174 -5.9790261890939993 1.6374808201347377 -1.0438446794645302 -6.0791728683176816 1.5693853333773931 -1.061769276015043 -6.1793195475413647 1.5012898466200486 -0.80804877810849152 -5.6919754773145588 1.8436200520133661 -0.82597337465900456 -5.7921221565382419 1.7755245652560216 -0.84389797120951737 -5.8922688357619242 1.707429078498677 -0.86182256776003019 -5.9924155149856064 1.6393335917413328 -0.8797471643105429 -6.0925621942092887 1.5712381049839881 -0.64395126295450411 -5.7053648032061659 1.8454728236199611 -0.66187585950501704 -5.8055114824298482 1.7773773368626167 -0.67980045605552997 -5.9056581616535313 1.709281850105272 -0.69772505260604267 -6.0058048408772127 1.6411863633479276 -0.47985374780051704 -5.7187541290977721 1.8473255952265559 -0.49777834435102986 -5.8189008083214553 1.7792301084692117 -0.51570294090154289 -5.9190474875451375 1.711134621711867 -0.33368082919704267 -5.8322901342130615 1.7810828800758065 -0.16649293460691783 -5.8459802850374949 1.7829380243010522 -0.15290637005304342 -5.9491943361222681 1.7148667300320681 -0.13931980549916881 -6.0524083872070413 1.6467954357630841 -0.12573324094529417 -6.1556224382918154 1.5787241414941 -0.11214667639141913 -6.2588364893765895 1.5106528472251159 -0.098560111837544429 -6.3620505404613628 1.4425815529561319 -0.34500953983078131 -5.9330788727627413 1.7129924572668433 -0.33142297527690678 -6.0362929238475145 1.6449211629978593 -0.31783641072303215 -6.1395069749322886 1.5768498687288752 -0.30424984616915723 -6.2427210260170627 1.5087785744598912 -0.29066328161528243 -6.3459350771018359 1.4407072801909071 -0.52352614505464523 -6.0201774604879876 1.6430468902326347 -0.5099395805007706 -6.1233915115727617 1.5749755959636507 -0.49635301594689579 -6.2266055626575358 1.5069043016946664 -0.48276645139302093 -6.3298196137423091 1.4388330074256825 -0.7020427502785086 -6.1072760482132349 1.5731013231984259 -0.68845618572463385 -6.210490099298009 1.5050300289294416 -0.67486962117075899 -6.3137041503827822 1.4369587346604578 -0.88055935550237197 -6.1943746359384821 1.503155756164217 -0.866972790948497 -6.2975886870232554 1.4350844618952332 -1.059075960726235 -6.2814732236637285 1.4332101891300084 -2.0897004831022437 -5.3934475455697264 1.8274753909547052 -2.1358782351654542 -5.4854539505295703 1.759361124396714 -2.1820559872286642 -5.5774603554894142 1.6912468578387223 -2.2282337392918743 -5.6694667604492572 1.6231325912807308 -2.2744114913550839 -5.7614731654091003 1.5550183247227394 -2.320589243418294 -5.8534795703689433 1.4869040581647477 -1.9312717752151687 -5.4382834302723477 1.8295461318166433 -1.9774495272783792 -5.5302898352321916 1.7614318652586518 -2.0236272793415893 -5.6222962401920356 1.6933175987006603 -2.0698050314047993 -5.7143026451518786 1.6252033321426689 -2.1159827834680089 -5.8063090501117216 1.5570890655846772 -1.7728430673280937 -5.4831193149749691 1.8316168726785813 -1.8190208193913042 -5.575125719934813 1.7635026061205898 -1.8651985714545143 -5.6671321248946569 1.6953883395625984 -1.9113763235177246 -5.7591385298544999 1.6272740730046067 -1.6144143594410187 -5.5279551996775904 1.8336876135405193 -1.6605921115042293 -5.6199616046374343 1.7655733469825277 -1.7067698635674393 -5.7119680095972782 1.6974590804245362 -1.4559856515539435 -5.5727910843802126 1.8357583544024572 -1.5021634036171538 -5.6647974893400566 1.7676440878444657 -1.2975569436668688 -5.617626969082834 1.8378290952643952 -2.3538403539918766 -5.9493919616102913 1.4187996010179895 -2.1511038486358749 -5.9016564054156087 1.4889831894186309 -2.168777529468088 -6.0022757599404759 1.4208905532397871 -1.9483673432798734 -5.853920849220926 1.5591667778192724 -1.9660410241120863 -5.9545402037457933 1.4910741416404285 -1.9837147049442994 -6.0551595582706605 1.4229815054615849 -1.7456308379238716 -5.8061852930262443 1.629350366219914 -1.7633045187560845 -5.9068046475511107 1.5612577300410699 -1.7809781995882976 -6.007424002075977 1.4931650938622263 -1.7986518804205107 -6.1080433566008443 1.4250724576833824 -1.5428943325678692 -5.7584497368315617 1.6995339546205555 -1.5605680134000823 -5.8590690913564289 1.6314413184417116 -1.5782416942322954 -5.9596884458812953 1.5633486822628677 -1.5959153750645085 -6.0603078004061617 1.4952560460840238 -1.6135890558967216 -6.1609271549310289 1.4271634099051802 -1.3401578272118675 -5.71071418063688 1.7697175430211969 -1.3578315080440806 -5.8113335351617463 1.701624906842353 -1.3755051888762937 -5.9119528896866136 1.6335322706635091 -1.3931788697085068 -6.01257224421148 1.5654396344846653 -1.4108525505407199 -6.1131915987363463 1.4973469983058216 -1.428526231372933 -6.2138109532612127 1.4292543621269778 -1.1374213218558653 -5.6629786244421982 1.8399011314218383 -1.1550950026880786 -5.7635979789670637 1.7718084952429947 -1.1727686835202917 -5.864217333491931 1.7037158590641506 -1.1904423643525048 -5.9648366880167982 1.6356232228853069 -1.2081160451847179 -6.0654560425416646 1.5675305867064628 -3.1853850834016897 -4.8644756749600688 1.811462802626904 -3.2453725725632276 -4.9472370121897162 1.743471031163788 -3.3053600617247656 -5.0299983494193636 1.6754792597006718 -3.3653475508863036 -5.1127596866490119 1.6074874882375558 -3.4253350400478415 -5.1955210238786593 1.5394957167744396 -3.4853225292093795 -5.2782823611083076 1.4715039453113237 -3.0515324928535592 -4.9326452989945775 1.813461886141732 -3.1115199820150972 -5.0154066362242249 1.745470114678616 -3.1715074711766351 -5.0981679734538723 1.6774783432154998 -3.2314949603381731 -5.1809293106835206 1.6094865717523839 -3.291482449499711 -5.263690647913168 1.5414948002892677 -2.9176799023054283 -5.0008149230290861 1.81546096965656 -2.9776673914669667 -5.0835762602587335 1.747469198193444 -3.0376548806285046 -5.166337597488381 1.6794774267303278 -3.0976423697900421 -5.2490989347180292 1.6114856552672119 -2.7838273117572978 -5.0689845470635948 1.817460053171388 -2.8438148009188362 -5.1517458842932413 1.7494682817082721 -2.9038022900803742 -5.2345072215228896 1.6814765102451559 -2.9637897792419117 -5.317268558752537 1.6134847387820399 -2.6499747212091673 -5.1371541710981026 1.8194591366862161 -2.7099622103707057 -5.21991550832775 1.7514673652231001 -2.7699496995322432 -5.3026768455573974 1.6834755937599839 -2.5161221306610368 -5.2053237951326112 1.8214582202010441 -2.5761096198225748 -5.2880851323622577 1.7534664487379281 -2.3822695401129064 -5.273493419167119 1.8234573037158721 -3.3489796538935592 -5.3478166558984892 1.4734831415823102 -3.1575171607757544 -5.3319220303083119 1.5434929838041713 -3.2031219427292128 -5.4225650604948958 1.4753863530249398 -3.011659449611408 -5.4066704349047185 1.5453961952468009 -3.0572642315648664 -5.4973134650913025 1.4772895644675694 -2.8201969564936036 -5.3907758093145421 1.6154060374686621 -2.8658017384470615 -5.4814188395011252 1.5472994066894306 -2.9114065204005199 -5.5720618696877091 1.479192775910199 -2.6287344633757987 -5.3748811837243649 1.685415879690523 -2.6743392453292572 -5.4655242139109488 1.6173092489112917 -2.7199440272827151 -5.5561672440975318 1.5492026181320602 -2.7655488092361731 -5.6468102742841157 1.4810959873528287 -2.4372719702579944 -5.3589865581341884 1.7554257219123841 -2.4828767522114523 -5.4496295883207724 1.6873190911331526 -2.5284815341649107 -5.5402726185073554 1.6192124603539213 -2.5740863161183687 -5.6309156486939385 1.5511058295746898 -2.6196910980718267 -5.7215586788805224 1.4829991987954583 -2.6652958800252851 -5.8122017090671054 1.414892568016227 -2.2458094771401895 -5.343091932544012 1.8254355641342452 -2.2914142590936479 -5.4337349627305951 1.7573289333550137 -2.3370190410471063 -5.524377992917179 1.6892223025757822 -2.3826238230005643 -5.6150210231037621 1.6211156717965509 -2.4282286049540223 -5.7056640532903451 1.5530090410173194 -2.4738333869074802 -5.796307083476929 1.4849024102380881 -2.5194381688609382 -5.8869501136635121 1.4167957794588568 -4.0550085915579803 -4.1926884282921568 1.7968276873288982 -4.1270233674344574 -4.2643882026745965 1.7289410082629264 -4.1990381433109345 -4.3360879770570371 1.6610543291969546 -4.2710529191874125 -4.4077877514394777 1.593167650130983 -4.3430676950638887 -4.4794875258219173 1.5252809710650115 -4.4150824709403658 -4.551187300204357 1.4573942919990397 -3.9484066438241925 -4.2766512723719687 1.7986562122529552 -4.0204214197006696 -4.3483510467544093 1.7307695331869835 -4.0924361955771467 -4.420050821136849 1.6628828541210117 -4.1644509714536246 -4.4917505955192896 1.5949961750550401 -4.2364657473301017 -4.5634503699017293 1.5271094959890685 -3.8418046960904046 -4.3606141164517807 1.8004847371770123 -3.9138194719668817 -4.4323138908342212 1.7325980581110405 -3.9858342478433588 -4.5040136652166618 1.6647113790450687 -4.0578490237198368 -4.5757134395991015 1.5968246999790972 -3.7352027483566164 -4.4445769605315935 1.8023132621010693 -3.8072175242330935 -4.516276734914034 1.7344265830350976 -3.879232300109571 -4.5879765092964746 1.6665399039691258 -3.6286008006228285 -4.5285398046114054 1.8041417870251264 -3.7006155764993056 -4.6002395789938459 1.7362551079591546 -3.7726303523757831 -4.6719393533762865 1.6683684288931828 -3.5219988528890407 -4.6125026486912173 1.8059703119491834 -3.5940136287655178 -4.6842024230736587 1.7380836328832117 -3.4153969051552528 -4.6964654927710292 1.8077988368732403 -4.3003648818330849 -4.6419340027190428 1.4591587071125993 -4.1250089607751796 -4.6514713700496824 1.5288996699335178 -4.1845257232830981 -4.7336182242755429 1.460914262346684 -3.9496530397172753 -4.661008737380322 1.5986406327544362 -4.0091698022251938 -4.7431555916061825 1.5306552251676024 -4.0686865647331123 -4.825302445832043 1.4626698175807686 -3.8338138811672891 -4.7526929589368221 1.6003961879885209 -3.8933306436752075 -4.8348398131626826 1.5324107804016871 -3.952847406183126 -4.9169866673885432 1.4644253728148533 -3.6584579601093843 -4.7622303262674617 1.6701371508094391 -3.7179747226173028 -4.8443771804933222 1.6021517432226056 -3.7774914851252213 -4.9265240347191828 1.5341663356357718 -3.8370082476331397 -5.0086708889450433 1.466180928048938 -3.4831020390514791 -4.7717676935981004 1.7398781136303576 -3.542618801559398 -4.8539145478239609 1.6718927060435238 -3.6021355640673165 -4.9360614020498224 1.6039072984566902 -3.661652326575235 -5.0182082562756829 1.5359218908698564 -3.7211690890831539 -5.1003551105015434 1.4679364832830226 -3.3077461179935743 -4.78130506092874 1.8096190764512761 -3.3672628805014928 -4.8634519151545996 1.7416336688644423 -3.4267796430094117 -4.9455987693804611 1.6736482612776085 -3.4862964055173302 -5.0277456236063225 1.6056628536907749 -3.5458131680252487 -5.109892477832183 1.5376774461039409 -3.6053299305331676 -5.1920393320580436 1.4696920385171073 -4.8210631237521211 -3.3248718802197788 1.7816897833522394 -4.903582640780547 -3.3835182070248226 1.7138817132601452 -4.9861021578089746 -3.4421645338298665 1.6460736431680507 -5.0686216748374013 -3.50081086063491 1.5782655730759565 -5.151141191865829 -3.5594571874399539 1.5104575029838621 -4.7388017893775958 -3.4211716301788506 1.7833662692424399 -4.8213213064060216 -3.4798179569838945 1.7155581991503457 -4.9038408234344493 -3.5384642837889384 1.6477501290582512 -4.986360340462876 -3.5971106105939823 1.579942058966157 -5.0688798574913037 -3.6557569373990262 1.5121339888740626 -4.6565404550030705 -3.5174713801379225 1.7850427551326404 -4.7390599720314963 -3.5761177069429664 1.7172346850405462 -4.821579489059924 -3.6347640337480103 1.6494266149484518 -4.9040990060883507 -3.6934103605530546 1.5816185448563576 -4.5742791206285451 -3.6137711300969944 1.786719241022841 -4.656798637656971 -3.6724174569020387 1.7189111709307465 -4.7393181546853986 -3.7310637837070826 1.6511031008386521 -4.4920177862540189 -3.7100708800560662 1.7883957269130415 -4.5745373032824457 -3.7687172068611106 1.7205876568209471 -4.6570568203108724 -3.8273635336661544 1.6527795867288526 -4.4097564518794927 -3.8063706300151385 1.790072212803242 -4.4922759689079204 -3.8650169568201829 1.7222641427111474 -4.3274951175049674 -3.9026703799742108 1.7917486986934423 -4.2452337831304421 -3.9989701299332832 1.7934251845836429 -5.232076065572449 -3.6200620529299528 1.44263765771696 -5.1426630732332841 -3.7252008890054751 1.4442610010346075 -4.9812637181708723 -3.7586749543792104 1.5137706842552998 -5.0532500808941192 -3.8303397250809974 1.4458843443522551 -4.8198643631084614 -3.7921490197529462 1.5832803674759921 -4.8918507258317074 -3.8638137904547332 1.5153940275729474 -4.9638370885549543 -3.9354785611565202 1.4475076876699027 -4.7304513707692966 -3.8972878558284689 1.5849037107936397 -4.8024377334925425 -3.9689526265302559 1.517017370890595 -4.8744240962157885 -4.0406173972320429 1.4491310309875503 -4.5690520157068848 -3.9307619212022042 1.6544133940143317 -4.6410383784301317 -4.0024266919039917 1.586527054111287 -4.7130247411533777 -4.0740914626057787 1.5186407142082425 -4.7850111038766237 -4.1457562333075657 1.4507543743051976 -4.4076526606444739 -3.96423598657594 1.723923077235024 -4.4796390233677199 -4.0359007572777266 1.6560367373319793 -4.5516253860909659 -4.1075655279795145 1.5881503974289346 -4.6236117488142128 -4.1792302986813015 1.5202640575258899 -4.6955981115374588 -4.2508950693830876 1.4523777176228452 -4.318239668305309 -4.0693748226514623 1.7255464205526716 -4.390226031028555 -4.1410395933532493 1.6576600806496267 -4.462212393751801 -4.2127043640550372 1.589773740746582 -4.534198756475047 -4.2843691347568233 1.5218874008435375 -4.606185119198293 -4.3560339054586104 1.4540010609404925 -4.1568403132428973 -4.1028488880251981 1.7950561037733639 -4.2288266759661441 -4.1745136587269842 1.727169763870319 -4.3008130386893892 -4.2461784294287721 1.6592834239672742 -4.3727994014126352 -4.31784320013056 1.5913970840642295 -4.4447857641358821 -4.3895079708323461 1.5235107441611848 -4.5167721268591272 -4.4611727415341331 1.4556244042581401 -5.3004876689209892 -2.2947783826628902 1.835164200890804 -5.3933368264821295 -2.3352790097186054 1.7673667225003611 -5.4861859840432707 -2.3757796367743209 1.6995692441099177 -5.5790351416044119 -2.4162802638300365 1.6317717657194744 -5.6718842991655531 -2.456780890885752 1.5639742873290314 -5.7647334567266952 -2.4972815179414676 1.4961768089385881 -5.2396105637875952 -2.4036605124436479 1.8367501644503288 -5.3324597213487355 -2.444161139499363 1.7689526860598859 -5.4253088789098767 -2.4846617665550785 1.7011552076694425 -5.5181580364710179 -2.5251623936107941 1.6333577292789994 -5.6110071940321591 -2.5656630206665096 1.5655602508885562 -5.1787334586542011 -2.5125426422244059 1.8383361280098538 -5.2715826162153414 -2.5530432692801206 1.7705386496194107 -5.3644317737764826 -2.5935438963358362 1.7027411712289675 -5.4572809313376238 -2.6340445233915522 1.6349436928385241 -5.5501300888987659 -2.6745451504472677 1.567146214448081 -5.117856353520807 -2.6214247720051636 1.8399220915693786 -5.2107055110819473 -2.6619253990608782 1.7721246131789354 -5.3035546686430894 -2.7024260261165942 1.7043271347884923 -5.3964038262042306 -2.7429266531723098 1.6365296563980491 -5.056979248387413 -2.7303069017859216 1.8415080551289036 -5.1498284059485533 -2.7708075288416363 1.7737105767384604 -5.2426775635096954 -2.8113081558973523 1.7059130983480173 -4.9961021432540189 -2.8391890315666792 1.8430940186884284 -5.0889513008151601 -2.8796896586223943 1.7752965402979852 -5.1818004583763013 -2.9201902856781099 1.7074990619075421 -4.9352250381206249 -2.9480711613474369 1.8446799822479534 -5.0280741956817661 -2.988571788403152 1.77688250385751 -4.8743479329872308 -3.0569532911281949 1.8462659458074782 -5.8538595947466856 -2.5447626060973496 1.428374525601795 -5.7033925172044295 -2.6070333122170393 1.4977621738712914 -5.7862519216695514 -2.6662641882323075 1.4299518026590021 -5.6357848441272953 -2.7285348943519971 1.4993394509284985 -5.718644248592418 -2.7877657703672654 1.4315290797162092 -5.4853177665850392 -2.7908056004716864 1.5687270991979951 -5.5681771710501611 -2.850036476486955 1.5009167279857056 -5.6510365755152847 -2.9092673525022232 1.4331063567734164 -5.3348506890427831 -2.8530763065913765 1.6381147474674917 -5.417710093507905 -2.9123071826066442 1.5703043762552022 -5.5005694979730277 -2.9715380586219129 1.5024940050429128 -5.5834289024381505 -3.0307689346371811 1.4346836338306235 -5.2672430159656489 -2.9745778887263343 1.6396920245246989 -5.3501024204307708 -3.0338087647416021 1.5718816533124094 -5.4329618248958935 -3.0930396407568708 1.5040712821001199 -5.5158212293610163 -3.152270516772139 1.4362609108878306 -5.1167759384233937 -3.036848594846024 1.7090796727941955 -5.1996353428885156 -3.0960794708612922 1.641269301581906 -5.2824947473536374 -3.1553103468765604 1.5734589303696165 -5.3653541518187602 -3.2145412228918286 1.505648559157327 -5.4482135562838829 -3.2737720989070969 1.4378381879450377 -4.9663088608811377 -3.0991193009657141 1.7784673210636919 -5.0491682653462595 -3.1583501769809819 1.7106569498514026 -5.1320276698113823 -3.2175810529962501 1.6428465786391131 -5.2148870742765041 -3.2768119290115183 1.5750362074268238 -5.297746478741626 -3.3360428050267865 1.5072258362145343 -5.3806058832067487 -3.3952736810420552 1.4394154650022448 -4.8987011878040034 -3.220620883100672 1.780044598120899 -4.9815605922691253 -3.2798517591159402 1.7122342269086097 -5.064419996734248 -3.3390826351312084 1.6444238556963204 -5.1472794011993699 -3.3983135111464762 1.5766134844840309 -5.2301388056644926 -3.4575443871617448 1.5088031132717414 -5.3129982101296154 -3.5167752631770131 1.4409927420594519 -5.6651334758697329 -1.2242426337998651 1.8215951186197796 -5.7639556204852544 -1.2462049709620833 1.7538213300920034 -5.862777765100776 -1.2681673081243017 1.6860475415642273 -5.9615999097162984 -1.2901296452865199 1.6182737530364508 -6.060422054331819 -1.312091982448738 1.5504999645086748 -6.1592441989473405 -1.3340543196109564 1.4827261759808985 -5.6265800639983423 -1.3436334235894893 1.8230963937804732 -5.7254022086138638 -1.3655957607517073 1.7553226052526969 -5.8242243532293854 -1.3875580979139259 1.6875488167249209 -5.9230464978449078 -1.4095204350761441 1.6197750281971444 -6.0218686424604284 -1.4314827722383623 1.5520012396693683 -5.5880266521269517 -1.4630242133791134 1.8245976689411667 -5.6868487967424732 -1.4849865505413316 1.7568238804133904 -5.7856709413579948 -1.5069488877035502 1.6890500918856144 -5.8844930859735172 -1.5289112248657684 1.6212763033578379 -5.9833152305890378 -1.5508735620279865 1.5535025148300619 -5.5494732402555611 -1.5824150031687376 1.8260989441018602 -5.6482953848710826 -1.6043773403309558 1.758325155574084 -5.7471175294866041 -1.6263396774931744 1.6905513670463079 -5.8459396741021257 -1.6483020146553926 1.6227775785185314 -5.5109198283841705 -1.7018057929583619 1.8276002192625538 -5.609741972999692 -1.7237681301205801 1.7598264307347775 -5.7085641176152135 -1.7457304672827987 1.6920526422070012 -5.4723664165127799 -1.8211965827479861 1.8291014944232473 -5.5711885611283014 -1.8431589199102043 1.7613277058954711 -5.6700107057438229 -1.8651212570724227 1.6935539173676948 -5.4338130046413893 -1.9405873725376104 1.8306027695839409 -5.5326351492569108 -1.9625497096998286 1.7628289810561644 -5.3952595927699987 -2.0599781623272349 1.8321040447446342 -6.2546415349507987 -1.3673846569999186 1.4149372009444614 -6.1190994625568678 -1.458727208210433 1.4842203947871124 -6.2122296988762011 -1.4995827514261979 1.4164213668300925 -6.0766876264822702 -1.5909253026367121 1.4857045606727435 -6.1698178628016036 -1.631780845852477 1.4179055327157235 -5.9411455540883393 -1.6822678538472262 1.5549877545153947 -6.0342757904076727 -1.7231233970629911 1.4871887265583745 -6.1274060267270061 -1.763978940278756 1.4193896986013546 -5.8056034816944084 -1.7736104050577408 1.6242709483580458 -5.8987337180137418 -1.8144659482735053 1.5564719204010258 -5.9918639543330752 -1.8553214914892702 1.4886728924440056 -6.0849941906524085 -1.8961770347050351 1.4208738644869856 -5.76319164561981 -1.9058084994840199 1.6257551142436768 -5.8563218819391443 -1.9466640426997843 1.5579560862866568 -5.9494521182584776 -1.9875195859155492 1.4901570583296369 -6.042582354577811 -2.0283751291313141 1.4223580303726167 -5.6276495732258782 -1.997151050694534 1.695038308086328 -5.7207798095452125 -2.0380065939102989 1.6272392801293079 -5.8139100458645459 -2.0788621371260634 1.5594402521722881 -5.9070402821838801 -2.1197176803418283 1.4916412242152679 -6.0001705185032135 -2.1605732235575932 1.4238421962582479 -5.4921075008319473 -2.0884936019050482 1.7643215019289793 -5.5852377371512807 -2.1293491451208131 1.6965224739719591 -5.6783679734706141 -2.170204688336578 1.6287234460149391 -5.7714982097899483 -2.2110602315523424 1.5609244180579191 -5.8646284461092826 -2.2519157747681073 1.4931253901008992 -5.9577586824286159 -2.2927713179838722 1.425326362143879 -5.3565654284380155 -2.1798361531155628 1.8336046957716303 -5.4496956647573489 -2.2206916963313272 1.7658056678146103 -5.5428259010766832 -2.2615472395470921 1.6980066398575904 -5.6359561373960165 -2.302402782762857 1.6302076119005702 -5.7290863737153499 -2.3432583259786215 1.5624085839435504 -5.8222166100346842 -2.3841138691943864 1.4946095559865302 -5.9153468463540184 -2.4249694124101513 1.4268105280295102 -5.8150951401620743 -0.085016800497778933 1.8089367506420806 -5.9163575050850321 -0.086565198324156656 1.7411735017439804 -6.0176198700079899 -0.088113596150534712 1.6734102528458801 -6.1188822349309469 -0.089661993976912546 1.6056470039477797 -6.2201445998539047 -0.091210391803290547 1.5378837550496796 -6.3214069647768625 -0.092758789629668464 1.4701205061515792 -5.8005684382016813 -0.21126176801191765 1.8103350199761625 -5.9018308031246391 -0.21281016583829537 1.7425717710780624 -6.003093168047597 -0.21435856366467337 1.674808522179962 -6.1043555329705539 -0.21590696149105132 1.6070452732818616 -6.2056178978935117 -0.21745535931742921 1.5392820243837613 -5.7860417362412893 -0.33750673552605626 1.8117332893102445 -5.8873041011642471 -0.33905513335243398 1.7439700404121443 -5.988566466087204 -0.34060353117881192 1.6762067915140439 -6.0898288310101618 -0.34215192900518993 1.6084435426159436 -5.7715150342808963 -0.46375170304019475 1.8131315586443264 -5.872777399203855 -0.46530010086657247 1.7453683097462263 -5.9740397641268119 -0.46684849869295042 1.6776050608481259 -6.0753021290497689 -0.46839689651932848 1.6098418119500253 -5.7569883323205042 -0.58999667055433325 1.8145298279784083 -5.858250697243462 -0.59154506838071097 1.746766579080308 -5.959513062166419 -0.59309346620708892 1.6790033301822076 -5.7424616303601113 -0.71624163806847196 1.8159280973124903 -5.8437239952830691 -0.71779003589484969 1.7481648484143899 -5.7279349283997192 -0.84248660558261046 1.817326366646572 -5.829197293322677 -0.84403500340898829 1.7495631177484716 -5.7134082264393262 -0.96873157309674907 1.8187246359806539 -6.3060753000851779 -0.22725240772953081 1.4715137919149137 -6.19091263598518 -0.34553007442347594 1.5406791882428956 -6.2901452630540415 -0.3678776939879661 1.4729033731205454 -6.1749825989540437 -0.4861553606819109 1.5420687694485271 -6.2742152260229052 -0.50850298024640117 1.4742929543261769 -6.0598199348540467 -0.60443302737585569 1.611234165776509 -6.1590525619229073 -0.62678064694034596 1.5434583506541588 -6.2582851889917688 -0.64912826650483624 1.4756825355318086 -5.9446572707540488 -0.72271069406980037 1.6803995621044907 -6.0438898978229103 -0.74505831363429076 1.6126237469821405 -6.1431225248917709 -0.76740593319878103 1.5448479318597903 -6.2423551519606324 -0.7897535527632713 1.4770721167374401 -5.9287272337229124 -0.86333598032823544 1.6817891433101224 -6.0279598607917739 -0.88568359989272583 1.6140133281877722 -6.1271924878606345 -0.90803121945721599 1.546237513065422 -6.2264251149294969 -0.93037883902170637 1.4784616979430718 -5.8135645696229155 -0.98161364702218024 1.7509545396381043 -5.9127971966917761 -1.0039612665866704 1.6831787245157541 -6.0120298237606375 -1.0263088861511609 1.6154029093934037 -6.111262450829499 -1.0486565057156509 1.5476270942710535 -6.2104950778983605 -1.0710041252801414 1.4798512791487033 -5.6984019055229176 -1.099891313716125 1.820119935966086 -5.7976345325917791 -1.1222389332806153 1.7523441208437358 -5.8968671596606406 -1.1445865528451056 1.6845683057213856 -5.9960997867295021 -1.1669341724095958 1.6167924905990354 -6.0953324137983627 -1.1892817919740861 1.5490166754766852 -6.194565040867225 -1.2116294115385766 1.481240860354335 -5.7347868574326428 1.0728308085117568 1.7975891361938479 -5.8343751884480088 1.0910370523343151 1.7298481906166048 -5.933963519463374 1.1092432961568734 1.6621072450393615 -6.0335518504787391 1.1274495399794318 1.5943662994621182 -6.1331401814941033 1.1456557838019901 1.5266253538848749 -6.2327285125094685 1.1638620276245484 1.4588844083076316 -5.7454668219727241 0.94537946318925092 1.7988405661744162 -5.8450551529880901 0.96358570701180923 1.7310996205971731 -5.9446434840034552 0.98179195083436765 1.6633586750199298 -6.0442318150188203 0.99999819465692608 1.5956177294426865 -6.1438201460341846 1.0182044384794844 1.5278767838654432 -5.7561467865128053 0.8179281178667448 1.8000919961549846 -5.8557351175281713 0.83613436168930311 1.7323510505777415 -5.9553234485435365 0.85434060551186142 1.6646101050004982 -6.0549117795589007 0.87254684933441995 1.5968691594232549 -5.7668267510528866 0.69047677254423889 1.801343426135553 -5.8664150820682526 0.7086830163667972 1.7336024805583099 -5.9660034130836177 0.72688926018935562 1.6658615349810666 -6.0655917440989819 0.74509550401191416 1.5981205894038235 -5.7775067155929678 0.56302542722173299 1.8025948561161214 -5.8770950466083338 0.5812316710442913 1.7348539105388783 -5.9766833776236981 0.59943791486684983 1.6671129649616352 -5.788186680133049 0.43557408189922719 1.80384628609669 -5.8877750111484151 0.45378032572178539 1.7361053405194469 -5.7988666446731303 0.30812273657672112 1.8050977160772586 -5.8984549756884954 0.32632898039927921 1.7373567705000152 -5.8095466092132106 0.18067139125421566 1.8063491460578269 -6.2443379768110434 1.0271449802329353 1.4601245408830716 -6.1548263332585798 0.88750114805031466 1.529124248842491 -6.2564149934859721 0.88576714520837541 1.461358990693653 -6.1669033499335084 0.74612331302575474 1.5303586986530726 -6.2684920101609016 0.74438931018381549 1.4625934405042345 -6.0773917063810439 0.60647948084313386 1.5993584066124922 -6.1789803666084371 0.60474547800119471 1.5315931484636542 -6.2805690268358303 0.60301147515925546 1.4638278903148161 -5.9878800628285802 0.46683564866051297 1.6683581145719115 -6.0894687230559725 0.46510164581857377 1.6005928564230736 -6.1910573832833666 0.46336764297663463 1.5328275982742356 -6.292646043510759 0.46163364013469532 1.4650623401253975 -5.9999570795035089 0.32545781363595305 1.6695925643824931 -6.1015457397309021 0.32372381079401386 1.6018273062336552 -6.2031343999582953 0.32198980795207466 1.5340620480848173 -6.3047230601856885 0.32025580511013535 1.4662967899359791 -5.9104454359510452 0.18581398145333231 1.7385922723419127 -6.0120340961784384 0.184079978611393 1.6708270141930748 -6.1136227564058316 0.1823459757694538 1.6030617560442366 -6.2152114166332249 0.18061197292751452 1.5352964978953987 -6.3168000768606181 0.17887797008557518 1.4675312397465605 -5.8209337923985798 0.046170149270711593 1.8075919803013321 -5.9225224526259739 0.044436146428772402 1.7398267221524941 -6.0241111128533671 0.042702143586833066 1.6720614640036562 -6.1256997730807603 0.040968140744893897 1.6042962058548182 -6.2272884333081535 0.039234137902954568 1.5365309477059803 -6.3288770935355467 0.037500135061015225 1.4687656895571422 -5.4214287011509708 2.1999507042207047 1.7880096477242511 -5.5154734699987973 2.2373603753539775 1.7202946340467715 -5.6095182388466247 2.2747700464872502 1.652579620369292 -5.7035630076944521 2.312179717620523 1.5848646066918122 -5.7976077765422795 2.3495893887537957 1.5171495930143326 -5.8916525453901061 2.3869990598870685 1.449434579336853 -5.4572202089255804 2.0765471760462533 1.7890649832483372 -5.5512649777734069 2.113956847179526 1.7213499695708576 -5.6453097466212343 2.1513665183127988 1.6536349558933781 -5.7393545154690617 2.1887761894460716 1.5859199422158983 -5.8333992843168891 2.2261858605793443 1.5182049285384187 -5.49301171670019 1.9531436478718018 1.7901203187724233 -5.5870564855480165 1.9905533190050746 1.7224053050949437 -5.6811012543958439 2.0279629901383474 1.6546902914174642 -5.7751460232436713 2.0653726612716201 1.5869752777399844 -5.5288032244747995 1.8297401196973504 1.7911756542965094 -5.6228479933226261 1.8671497908306232 1.7234606406190298 -5.7168927621704544 1.9045594619638959 1.65574562694155 -5.8109375310182818 1.9419691330971689 1.5880306132640702 -5.5645947322494091 1.706336591522899 1.7922309898205955 -5.6586395010972357 1.7437462626561717 1.7245159761431157 -5.752684269945064 1.7811559337894447 1.6568009624656361 -5.6003862400240187 1.5829330633484475 1.7932863253446816 -5.6944310088718462 1.6203427344817203 1.7255713116672018 -5.6361777477986283 1.4595295351739959 1.7943416608687675 -5.7302225166464558 1.4969392063072686 1.7266266471912877 -5.6719692555732388 1.3361260069995446 1.7953969963928536 -5.9302095396660066 2.254547677140752 1.4504765188306399 -5.8702177659358181 2.0994223774789962 1.51925528939612 -5.9701683337321514 2.1175100197425492 1.451511667999305 -5.9101765600019629 1.9623847200807933 1.5202904385647851 -6.0101271277982962 1.9804723623443463 1.4525468171679701 -5.8501847862717744 1.8072594204190384 1.5890692091302654 -5.9501353540681077 1.8253470626825905 1.5213255877334502 -6.0500859218644409 1.8434347049461435 1.4535819663366352 -5.7901930125415859 1.6521341207572831 1.6578479796957459 -5.8901435803379192 1.6702217630208356 1.5901043582989305 -5.9900941481342524 1.6883094052843877 1.5223607369021153 -6.0900447159305857 1.7063970475479406 1.4546171155053003 -5.8301518066077307 1.5150964633590798 1.658883128864411 -5.930102374404064 1.5331841056226325 1.5911395074675958 -6.0300529422003972 1.5512717478861846 1.5233958860707806 -6.1300035099967305 1.5693593901497374 1.4556522646739654 -5.7701600328775413 1.3599711636973244 1.7276618994298913 -5.8701106006738755 1.3780588059608769 1.6599182780330761 -5.9700611684702087 1.3961464482244297 1.5921746566362609 -6.070011736266542 1.414234090487982 1.5244310352394457 -6.1699623040628753 1.4323217327515345 1.4566874138426305 -5.7101682591473528 1.2048458640355695 1.7964406699953717 -5.8101188269436861 1.2229335062991218 1.7286970485985567 -5.9100693947400194 1.2410211485626743 1.6609534272017414 -6.0100199625363535 1.2591087908262268 1.5932098058049262 -6.1099705303326868 1.2771964330897791 1.525466184408111 -6.2099210981290192 1.2952840753533317 1.4577225630112958 -4.883837034127323 3.2458454208811065 1.7808625443162092 -4.968712073300515 3.3008983923663688 1.7131809629222681 -5.0535871124737053 3.3559513638516312 1.6454993815283268 -5.1384621516468973 3.4110043353368935 1.5778178001343857 -5.2233371908200885 3.4660573068221554 1.5101362187404446 -5.3082122299932797 3.5211102783074173 1.4424546373465035 -4.9435161104320322 3.1317043361368468 1.7816504381588476 -5.0283911496052243 3.1867573076221092 1.7139688567649065 -5.1132661887784154 3.2418102791073715 1.6462872753709652 -5.1981412279516066 3.2968632505926339 1.5786056939770241 -5.2830162671247978 3.3519162220778957 1.510924112583083 -5.0031951867367424 3.0175632513925872 1.782438332001486 -5.0880702259099344 3.0726162228778495 1.714756750607545 -5.1729452650831247 3.1276691943631119 1.6470751692136036 -5.2578203042563167 3.1827221658483742 1.5793935878196623 -5.0628742630414525 2.9034221666483271 1.7832262258441245 -5.1477493022146446 2.9584751381335894 1.7155446444501834 -5.2326243413878348 3.0135281096188518 1.6478630630562421 -5.317499380561026 3.0685810811041141 1.5801814816623008 -5.1225533393461617 2.7892810819040674 1.7840141196867629 -5.2074283785193538 2.8443340533893298 1.7163325382928218 -5.2923034176925441 2.8993870248745921 1.6486509568988805 -5.1822324156508719 2.6751399971598078 1.7848020135294014 -5.2671074548240631 2.7301929686450701 1.7171204321354601 -5.2419114919555811 2.5609989124155486 1.7855899073720398 -5.3267865311287732 2.6160518839008104 1.7179083259780985 -5.3015905682602913 2.4468578276712889 1.786377801214678 -5.3718763768829216 3.3995622464341779 1.4432271506367782 -5.3439416434745475 3.2354586718297718 1.5117071962767679 -5.4383291047202524 3.2728311516253648 1.4439889012782186 -5.4103943713118783 3.1087275770209586 1.5124689469182082 -5.5047818325575832 3.1461000568165516 1.4447506519196589 -5.382459637903505 2.9446240024165524 1.5809489925581981 -5.4768470991492091 2.9819964822121454 1.5132306975596486 -5.571234560394914 3.0193689620077384 1.4455124025610993 -5.3545249044951309 2.7805204278121463 1.6494290381981878 -5.4489123657408358 2.8178929076077393 1.5817107431996384 -5.5432998269865399 2.8552653874033322 1.5139924482010889 -5.6376872882322449 2.8926378671989252 1.4462741532025396 -5.4209776323324617 2.6537893330033331 1.6501907888396281 -5.5153650935781666 2.6911618127989261 1.5824724938410788 -5.6097525548238707 2.7285342925945191 1.5147541988425293 -5.7041400160695757 2.7659067723901121 1.44703590384398 -5.3930428989240884 2.4896857583989269 1.7186708344796178 -5.4874303601697925 2.5270582381945199 1.6509525394810685 -5.5818178214154974 2.5644307179901129 1.5832342444825191 -5.6762052826612015 2.6018031977857059 1.5155159494839696 -5.7705927439069065 2.6391756775812989 1.4477976544854205 -5.3651081655157151 2.3255821837945208 1.7871508801196074 -5.4594956267614192 2.3629546635901137 1.7194325851210581 -5.5538830880071242 2.4003271433857067 1.6517142901225088 -5.6482705492528291 2.4376996231812997 1.5839959951239595 -5.7426580104985332 2.4750721029768927 1.5162777001254102 -5.8370454717442382 2.5124445827724857 1.4485594051268609 -4.1497329962970868 3.9938033835950741 1.8451915987641587 -4.2221964907919372 4.0643124751405644 1.7775498724268322 -4.2946599852867884 4.134821566686055 1.7099081460895058 -4.3671234797816387 4.2053306582315448 1.6422664197521795 -4.43958697427649 4.2758397497770355 1.5746246934148529 -4.5120504687713403 4.3463488413225253 1.5069829670775265 -4.2311817229512112 3.893585322792422 1.8456058245873543 -4.3036452174460615 3.9640944143379118 1.7779640982500278 -4.3761087119409128 4.0346035058834024 1.7103223719127014 -4.4485722064357631 4.1051125974288922 1.6426806455753751 -4.5210357009306144 4.1756216889743829 1.5750389192380485 -4.3126304496053356 3.7933672619897694 1.84602005041055 -4.3850939441001859 3.8638763535352592 1.7783783240732234 -4.4575574385950372 3.9343854450807498 1.710736597735897 -4.5300209330898875 4.0048945366262396 1.6430948713985707 -4.6024844275847387 4.0754036281717303 1.5754531450612443 -4.39407917625946 3.6931492011871172 1.8464342762337456 -4.4665426707543103 3.763658292732607 1.778792549896419 -4.5390061652491616 3.8341673842780977 1.7111508235590926 -4.6114696597440128 3.9046764758235875 1.6435090972217665 -4.4755279029135853 3.592931140384465 1.8468485020569412 -4.5479913974084356 3.6634402319299548 1.7792067757196148 -4.620454891903286 3.7339493234754451 1.7115650493822883 -4.5569766295677097 3.4927130795818124 1.847262727880137 -4.62944012406256 3.5632221711273027 1.7796210015428104 -4.7019036185574112 3.6337312626727929 1.7119792752054841 -4.6384253562218349 3.3924950187791598 1.8476769537033326 -4.7108888507166853 3.4630041103246501 1.7800352273660063 -4.5883590648911179 4.4122039862718214 1.4393278989276956 -4.5937784893614451 4.24579273508194 1.5073962238008931 -4.6789868358327498 4.3008760027453521 1.4397102751147051 -4.6844062603030769 4.1344647515554707 1.5077785999879025 -4.7696146067743816 4.1895480192188828 1.4400926513017145 -4.6898256847734041 3.968053500365591 1.5758469248611 -4.7750340312447088 4.0231367680290013 1.508160976174912 -4.8602423777160135 4.0782200356924143 1.4404750274887239 -4.6952451092437313 3.80164224917571 1.6439152497342975 -4.780453455715036 3.8567255168391221 1.5762293010481094 -4.8656618021863398 3.9118087845025324 1.5085433523619214 -4.9508701486576445 3.9668920521659454 1.4408574036757333 -4.7858728801853623 3.6903142656492411 1.6442976259213069 -4.871081226656667 3.7453975333126532 1.5766116772351189 -4.9562895731279717 3.8004808009760636 1.5089257285489308 -5.0414979195992764 3.8555640686394765 1.441239779862743 -4.7912923046556903 3.5239030144593597 1.7123659507945042 -4.8765006511269942 3.5789862821227718 1.6446800021083163 -4.9617089975982989 3.6340695497861839 1.5769940534221283 -5.0469173440696036 3.6891528174495947 1.5093081047359405 -5.1321256905409083 3.7442360851130072 1.4416221560497524 -4.7967117291260175 3.3574917632694787 1.7804342756677016 -4.8819200755973222 3.4125750309328908 1.7127483269815138 -4.967128422068626 3.4676582985963025 1.6450623782953258 -5.0523367685399299 3.5227415662597146 1.5773764296091377 -5.1375451150112346 3.5778248339231262 1.5096904809229499 -5.2227534614825393 3.6329081015865383 1.4420045322367621 -3.2625814784945852 4.7485122402220679 1.8458762043558643 -3.3198235416793587 4.831784086094042 1.778275800113275 -3.3770656048641325 4.9150559319660152 1.7106753958706862 -3.4343076680489064 4.9983277778379884 1.6430749916280971 -3.4915497312336803 5.0815996237099617 1.5754745873855081 -3.5487917944184542 5.1648714695819349 1.507874183142919 -3.3628772536270128 4.6664472965902677 1.8457486986526284 -3.4201193168117867 4.7497191424622418 1.7781482944100391 -3.4773613799965606 4.832990988334215 1.7105478901674502 -3.5346034431813345 4.9162628342061883 1.6429474859248612 -3.5918455063661083 4.9995346800781615 1.5753470816822721 -3.6490875695508822 5.0828065259501347 1.507746677439683 -3.4631730287594409 4.5843823529584675 1.8456211929493924 -3.5204150919442148 4.6676541988304416 1.7780207887068031 -3.5776571551289886 4.7509260447024149 1.7104203844642143 -3.6348992183137625 4.8341978905743881 1.6428199802216252 -3.6921412814985359 4.9174697364463604 1.5752195759790362 -3.5634688038918689 4.5023174093266674 1.8454936872461565 -3.6207108670766428 4.5855892551986406 1.7778932830035672 -3.6779529302614167 4.6688611010706138 1.7102928787609784 -3.7351949934461905 4.752132946942587 1.6426924745183893 -3.663764579024297 4.4202524656948672 1.8453661815429205 -3.7210066422090708 4.5035243115668404 1.7777657773003313 -3.7782487053938447 4.5867961574388136 1.7101653730577424 -3.764060354156725 4.338187522063067 1.8452386758396848 -3.8213024173414989 4.4214593679350402 1.7776382715970955 -3.8785444805262728 4.5047312138070126 1.7100378673545065 -3.8643561292891526 4.2561225784312668 1.8451111701364489 -3.9215981924739269 4.3393944243032392 1.7775107658938596 -3.9646519044215807 4.1740576347994658 1.8449836644332132 -4.0649476795540078 4.0919926911676656 1.8448561587299772 -3.6073523032641841 5.2470690605473491 1.4402697485500306 -3.7190250476245108 5.1557342885284001 1.4401074646434222 -3.7579091422418895 4.9937948569955832 1.5075931092662527 -3.8306977919848375 5.0643995165094511 1.4399451807368138 -3.7967932368592683 4.8318554254627664 1.5750787538890831 -3.8695818866022158 4.9024600849766342 1.5074308253596442 -3.9423705363451642 4.9730647444905021 1.4397828968302053 -3.8356773314766466 4.6699159939299495 1.6425643985119136 -3.908465981219595 4.7405206534438173 1.5749164699824747 -3.9812546309625425 4.8111253129576852 1.5072685414530358 -4.0540432807054909 4.881729972471553 1.4396206129235969 -3.9473500758369733 4.5785812219110005 1.6424021146053054 -4.0201387255799217 4.6491858814248683 1.5747541860758663 -4.0929273753228692 4.7197905409387362 1.5071062575464276 -4.1657160250658176 4.790395200452604 1.4394583290169887 -3.986234170454352 4.4166417903781845 1.7098877592281359 -4.0590228201973 4.4872464498920515 1.6422398306986969 -4.1318114699402484 4.5578511094059193 1.574591902169258 -4.2046001196831959 4.6284557689197872 1.5069439736398191 -4.2773887694261443 4.699060428433655 1.4392960451103802 -4.0251182650717308 4.2547023588453676 1.7773734038509663 -4.0979069148146783 4.3253070183592355 1.7097254753215274 -4.1706955645576267 4.3959116778731024 1.6420775467920887 -4.2434842143005751 4.4665163373869712 1.5744296182626496 -4.3162728640435226 4.5371209969008381 1.5067816897332109 -4.389061513786471 4.6077256564147069 1.439133761203772 -4.1367910094320575 4.1633675868264186 1.7772111199443581 -4.209579659175005 4.2339722463402865 1.7095631914149192 -4.2823683089179534 4.3045769058541543 1.6419152628854803 -4.3551569586609009 4.3751815653680222 1.5742673343560414 -4.4279456084038484 4.44578622488189 1.5066194058266025 -4.5007342581467968 4.5163908843957579 1.4389714772971636 -2.2693416748572393 5.3966743585754999 1.7862597123881594 -2.3092663977458283 5.4894532982108926 1.7186860866946079 -2.3491911206344169 5.5822322378462861 1.6511124610010564 -2.3891158435230055 5.6750111774816787 1.5835388353075046 -2.4290405664115942 5.7677901171170713 1.5159652096139531 -2.4689652893001832 5.860569056752464 1.4483915839204013 -2.3850780819673836 5.3363926533680202 1.7853237329858767 -2.4250028048559726 5.4291715930034128 1.7177501072923251 -2.4649275277445613 5.5219505326388063 1.6501764815987736 -2.5048522506331499 5.6147294722741989 1.5826028559052217 -2.5447769735217385 5.7075084119095916 1.5150292302116701 -2.5008144890775279 5.2761109481605404 1.7843877535835939 -2.540739211966117 5.368889887795933 1.7168141278900424 -2.5806639348547056 5.4616688274313265 1.6492405021964907 -2.6205886577432942 5.5544477670667192 1.5816668765029389 -2.6165508961876727 5.2158292429530606 1.7834517741813112 -2.6564756190762613 5.3086081825884532 1.7158781484877594 -2.6964003419648499 5.4013871222238468 1.6483045227942079 -2.736325064853439 5.4941660618592394 1.580730897100656 -2.732287303297817 5.1555475377455817 1.7825157947790282 -2.7722120261864056 5.2483264773809744 1.7149421690854767 -2.8121367490749942 5.341105417016367 1.647368543391925 -2.8480237104079613 5.0952658325381019 1.7815798153767455 -2.8879484332965499 5.1880447721734955 1.7140061896831937 -2.9637601175181056 5.0349841273306231 1.7806438359744625 -3.0395718017396618 4.8819234824877507 1.8472814822657313 -3.0794965246282504 4.9747024221231433 1.7797078565721798 -3.1553082088498061 4.8216417772802709 1.8463455028634486 -2.5928794836000542 5.7959439905601062 1.4474391685052339 -2.6642785391235257 5.6452269673942679 1.514085683457481 -2.721816298756333 5.728651325546279 1.4464766584447548 -2.7932153542798046 5.5779343023804406 1.5131231733970019 -2.8507531139126119 5.6613586605324517 1.4455141483842757 -2.8646144098032758 5.4272172792146014 1.5797696883492489 -2.9221521694360835 5.5106416373666134 1.5121606633365228 -2.9796899290688907 5.5940659955186245 1.4445516383237966 -2.9360134653267469 5.276500256048763 1.646416203301496 -2.9935512249595546 5.3599246142007742 1.5788071782887698 -3.0510889845923623 5.4433489723527861 1.5111981532760439 -3.1086267442251696 5.5267733305047972 1.4435891282633178 -3.007412520850218 5.1257832328829238 1.7130627182537428 -3.0649502804830258 5.2092075910349358 1.6454536932410169 -3.122488040115833 5.2926319491869469 1.5778446682282907 -3.1800257997486407 5.376056307338958 1.5102356432155648 -3.237563559381448 5.45948066549097 1.4426266182028387 -3.1363493360064969 5.0584905678690966 1.7121002081932637 -3.1938870956393046 5.1419149260211077 1.6444911831805378 -3.2514248552721119 5.2253392841731188 1.5768821581678116 -3.3089626149049196 5.3087636423251308 1.5092731331550859 -3.3665003745377269 5.3921880004771419 1.4416641081423598 -3.2077483915299685 4.9077735447032573 1.7787467231455107 -3.2652861511627758 4.9911979028552684 1.7111376981327848 -3.3228239107955835 5.0746222610072804 1.6435286731200589 -3.3803616704283908 5.1580466191592915 1.5759196481073328 -3.4378994300611985 5.2414709773113026 1.5083106230946068 -3.4954371896940057 5.3248953354633146 1.4407015980818807 -1.2334340890296498 5.691086301161107 1.8031289854162083 -1.2545026851676089 5.7899147949165259 1.7355253081502389 -1.2755712813055675 5.8887432886719449 1.6679216308842697 -1.2966398774435266 5.9875717824273638 1.6003179536183003 -1.3177084735814852 6.0864002761827827 1.5327142763523314 -1.3387770697194441 6.1852287699382016 1.465110599086362 -1.3611314797181526 5.655691590867499 1.8009818311156731 -1.3822000758561115 5.7545200846229179 1.7333781538497037 -1.4032686719940701 5.8533485783783368 1.6657744765837346 -1.4243372681320292 5.9521770721337557 1.5981707993177652 -1.4454058642699881 6.0510055658891737 1.5305671220517962 -1.4888288704066555 5.6202968805738909 1.798834676815138 -1.5098974665446141 5.7191253743293098 1.7312309995491686 -1.5309660626825727 5.8179538680847287 1.6636273222831994 -1.5520346588205318 5.9167823618401476 1.59602364501723 -1.6165262610951583 5.5849021702802828 1.7966875225146028 -1.6375948572331172 5.6837306640357017 1.7290838452486335 -1.6586634533710758 5.7825591577911197 1.6614801679826643 -1.7442236517836609 5.5495074599866747 1.7945403682140677 -1.7652922479216198 5.6483359537420927 1.7269366909480983 -1.7863608440595786 5.7471644474975117 1.6593330136821292 -1.8719210424721635 5.5141127496930666 1.7923932139135326 -1.8929896386101226 5.6129412434484847 1.7247895366475632 -1.9996184331606663 5.4787180393994577 1.7902460596129972 -1.47860768965836 6.1461363864667771 1.4629744304740366 -1.581007826508773 6.013201890793173 1.5284271247213217 -1.6212179750153437 6.1061968835642793 1.4608407786309061 -1.6834079633591854 5.8802673951195699 1.5938798189686063 -1.7236181118657568 5.9732623878906752 1.5262934728781912 -1.7638282603723274 6.0662573806617823 1.4587071267877756 -1.8260182487161691 5.840327892217072 1.5917461671254758 -1.8662283972227405 5.9333228849881783 1.5241598210350606 -1.9064385457293112 6.0263178777592845 1.4565734749446451 -1.9284183855665817 5.707393396543468 1.6571988613727606 -1.9686285340731529 5.8003883893145742 1.5896125152823453 -2.0088386825797242 5.8933833820856805 1.5220261691919301 -2.0490488310862949 5.9863783748567876 1.4544398231015145 -2.0308185224169946 5.5744589008698648 1.7226515556200457 -2.0710286709235657 5.6674538936409702 1.6550652095296301 -2.1112388194301364 5.7604488864120773 1.5874788634392147 -2.1514489679367079 5.8534438791831835 1.5198925173487996 -2.1916591164432786 5.9464388719542898 1.452306171258384 -2.1332186592674072 5.4415244051962608 1.7881042498673303 -2.1734288077739783 5.534519397967367 1.7205179037769152 -2.2136389562805494 5.6275143907384733 1.6529315576864996 -2.2538491047871201 5.7205093835095795 1.5853452115960842 -2.2940592532936912 5.8135043762806857 1.5177588655056689 -2.3342694018002619 5.9064993690517928 1.4501725194152535 -0.00059766105581382512 5.7826150006657508 1.8361948970610216 -0.0020529609575568042 5.8839010180232334 1.7684219708720545 -0.0035082608592995612 5.9851870353807168 1.7006490446830875 -0.0049635607610423182 6.0864730527381994 1.6328761184941201 -0.0064188606627851863 6.1877590700956828 1.565103192305153 -0.0078741605645279433 6.2890450874531654 1.4973302661161856 -0.0093294604662707559 6.3903311048106479 1.4295573399272183 -0.13690616043667503 5.7749143458294441 1.8323698679852094 -0.13836146033841801 5.8762003631869266 1.7645969417962424 -0.13981676024016076 5.9774863805444101 1.6968240156072754 -0.14127206014190352 6.0787723979018926 1.6290510894183079 -0.14272736004364636 6.180058415259376 1.5612781632293407 -0.14418265994538917 6.2813444326168586 1.4935052370403734 -0.27321465981753623 5.7672136909931373 1.8285448389093972 -0.2746699597192791 5.8684997083506198 1.7607719127204302 -0.27612525962102186 5.9697857257081033 1.6929989865314632 -0.27758055952276467 6.0710717430655858 1.6252260603424957 -0.27903585942450754 6.1723577604230693 1.5574531341535285 -0.40952315919839755 5.7595130361568305 1.8247198098335851 -0.41097845910014041 5.8607990535143131 1.756946883644618 -0.41243375900188312 5.9620850708717965 1.689173957455651 -0.41388905890362598 6.0633710882292791 1.6214010312666833 -0.54583165857925864 5.7518123813205237 1.8208947807577729 -0.54728695848100162 5.8530983986780063 1.7531218545688059 -0.54874225838274426 5.9543844160354897 1.6853489283798386 -0.68214015796011984 5.744111726484217 1.8170697516819607 -0.68359545786186271 5.8453977438417004 1.7492968254929937 -0.68505075776360547 5.946683761199183 1.6815238993040265 -0.81844865734098105 5.7364110716479102 1.8132447226061486 -0.8199039572427238 5.8376970890053936 1.7454717964171815 -0.95475715672184258 5.7287104168116043 1.8094196935303364 -0.15861516740480597 6.3812027894695236 1.4258322149975313 -0.28998737598003488 6.2725990712516975 1.4897533139399415 -0.31131771699249355 6.3716985772892922 1.4221333943976313 -0.42135958455526379 6.1639953530338714 1.5536744128823516 -0.44268992556772258 6.2630948590714652 1.4860544933400412 -0.46402026658018136 6.36219436510906 1.4184345737977311 -0.5527317931304927 6.0553916348160453 1.6175955118247616 -0.57406213414295137 6.1544911408536391 1.5499755922824514 -0.59539247515541016 6.2535906468912339 1.482355672740141 -0.61672281616786895 6.3526901529288278 1.4147357531978311 -0.70543434271818017 6.045887422635813 1.6138966912248616 -0.72676468373063896 6.1449869286734078 1.5462767716825514 -0.74809502474309764 6.2440864347110017 1.478656852140241 -0.83680655129340886 5.9372837044179869 1.6778177901672717 -0.85813689230586765 6.0363832104555808 1.6101978706249613 -0.87946723331832644 6.1354827164931756 1.5425779510826512 -0.90079757433078511 6.2345822225307703 1.4749580315403408 -0.96817875986863788 5.8286799862001608 1.7417388891096819 -0.98950910088109667 5.9277794922377547 1.6741189695673717 -1.0108394418935553 6.0268789982753495 1.6064990500250613 -1.0321697829060144 6.1259785043129433 1.5388791304827512 -1.0535001239184729 6.2250780103505381 1.4712592109404408 -1.0995509684438667 5.7200762679823347 1.805659988052092 -1.1208813094563252 5.8191757740199286 1.7380400685097817 -1.142211650468784 5.9182752800575233 1.6704201489674715 -1.1635419914812428 6.0173747860951172 1.6028002294251611 -1.1848723324937016 6.116474292132712 1.5351803098828509 -1.2062026735061604 6.2155737981703068 1.4675603903405405 1.2313142062678302 6.2076342241585998 1.4712128578412837 1.2128829119907627 6.107489552501538 1.5393403488877606 1.1944516177136957 6.0073448808444763 1.6074678399342375 0.9994149204093874 5.7288771535100329 1.8063693628228845 1.0178462146864551 5.8290218251670947 1.7382418717764079 1.0362775089635221 5.9291664968241564 1.6701143807299308 1.0547088032405898 6.0293111684812173 1.6019868896834542 1.073140097517657 6.129455840138279 1.5338593986369771 0.85967210593628152 5.7508434411467739 1.8008884125721012 0.87810340021334909 5.8509881128038357 1.7327609215256243 0.89653469449041623 5.9511327844608983 1.6646334304791475 0.91496598876748392 6.0512774561179592 1.5965059394326706 0.93339728304455116 6.1514221277750201 1.5283784483861937 0.7199292914631753 5.7728097287835149 1.7954074623213176 0.73836058574024288 5.8729544004405776 1.727279971274841 0.7567918800173099 5.9730990720976394 1.6591524802283639 0.77522317429437759 6.0732437437547002 1.5910249891818873 0.58018647699006931 5.7947760164202569 1.7899265120705343 0.59861777126713689 5.8949206880773186 1.7217990210240575 0.61704906554420402 5.9950653597343813 1.6536715299775806 0.44044366251696343 5.8167423040569979 1.7844455618197508 0.45887495679403095 5.9168869757140605 1.7163180707732741 0.28226955376679047 5.7385639200366789 1.8470921026154441 0.30070084804385749 5.8387085916937398 1.7789646115689675 0.14252673929368392 5.7605302076734199 1.8416111523646606 1.0903208753170699 6.2296920309352739 1.4657530527602318 0.93302274039201405 6.2529431059840244 1.4605689480427013 0.77740400155260592 6.1745777070297772 1.5231722797072431 0.77572460546695809 6.2761941810327748 1.4553848433251708 0.62178526271319801 6.0962123080755308 1.5857756113717849 0.62010586662754996 6.1978287820785276 1.5179881749897126 0.61842647054190214 6.2994452560815253 1.4502007386076403 0.46616652387379004 6.0178469091212836 1.6483789430363265 0.464487127788142 6.1194633831242813 1.5805915066542544 0.46280773170249401 6.221079857127279 1.5128040702721821 0.46112833561684619 6.3226963311302757 1.4450166338901098 0.31054778503438196 5.9394815101670382 1.7109822747008683 0.30886838894873397 6.041097984170035 1.643194838318796 0.30718899286308599 6.1427144581730326 1.5754074019367239 0.30550959677743805 6.2443309321760294 1.5076199655546516 0.30383020069179018 6.3459474061790271 1.4398325291725795 0.15492904619497405 5.861116111212791 1.7735856063654099 0.15324965010932601 5.9627325852157886 1.7057981699833378 0.15157025402367805 6.0643490592187863 1.6380107336012655 0.14989085793803011 6.1659655332217831 1.5702232972191936 0.14821146185238218 6.2675820072247808 1.5024358608371213 0.1465320657667343 6.3691984812277775 1.434648424455049 2.1151785832010237 5.4546246551490576 1.7832033475807936 2.1531143010999489 5.5497672036050743 1.714680482720804 2.1910500189988751 5.64490975206109 1.6461576178608142 2.2289857368978003 5.7400523005171058 1.5776347530008243 2.266921454796726 5.8351948489731216 1.5091118881408345 1.94467283252774 5.408607781377154 1.8460008901324476 1.9826085504266655 5.5037503298331698 1.7774780252724578 2.0205442683255912 5.5988928782891856 1.7089551604124682 2.0584799862245169 5.6940354267452014 1.6404322955524784 2.0964157041234421 5.7891779752012171 1.5719094306924886 1.8121027997533821 5.4577334560612663 1.8402755678241118 1.8500385176523075 5.5528760045172811 1.771752702964122 1.8879742355512332 5.6480185529732969 1.7032298381041324 1.9259099534501587 5.7431611014293127 1.6347069732441426 1.6795327669790241 5.5068591307453776 1.8345502455157761 1.7174684848779496 5.6020016792013925 1.7660273806557862 1.7554042027768753 5.6971442276574091 1.6975045157957966 1.5469627342046661 5.5559848054294898 1.8288249232074403 1.5848984521035918 5.6511273538855047 1.7603020583474505 1.6228341700025175 5.7462699023415205 1.6917791934874606 1.4143927014303079 5.6051104801136011 1.8230996008991045 1.4523284193292336 5.7002530285696169 1.7545767360391147 1.2818226686559502 5.6542361547977134 1.8173742785907687 2.2970197887727517 5.9324682133026965 1.4407474823465203 2.1290316653227341 5.8857668509177792 1.503494122599468 2.1473605198303503 5.9862400832034881 1.4353676764021828 1.9610435418727163 5.839065488532861 1.566240762852416 1.9793723963803325 5.9395387208185708 1.4981143166551305 1.9977012508879486 6.0400119531042797 1.429987870457845 1.7930554184226986 5.7923641261479437 1.6289874031053639 1.8113842729303147 5.8928373584336526 1.5608609569080785 1.8297131274379308 5.9933105907193625 1.492734510710793 1.8480419819455469 6.0937838230050714 1.4246080645135075 1.6433961494802969 5.8461359960487354 1.6236075971610264 1.661725003987913 5.9466092283344443 1.5554811509637407 1.6800538584955291 6.0470824606201541 1.4873547047664553 1.6983827130031453 6.147555692905863 1.4192282585691698 1.4754080260302787 5.7994346336638181 1.6863542374139742 1.4937368805378948 5.899907865949527 1.6182277912166887 1.5120657350455111 6.0003810982352359 1.5501013450194032 1.5303945895531272 6.1008543305209457 1.4819748988221177 1.3074199025802606 5.7527332712789008 1.7491008776669221 1.325748757087877 5.8532065035646097 1.6809744314696367 1.3440776115954931 5.9536797358503186 1.612847985272351 1.3624064661031094 6.0541529681360284 1.5447215390750655 1.3807353206107256 6.1546262004217374 1.47659509287778 1.1394317791302424 5.7060319088939835 1.8118475179198696 1.157760633637859 5.8065051411796924 1.7437210717225844 1.1760894881454751 5.9069783734654022 1.6755946255252989 3.1993901826179596 4.8371935808997035 1.8231847780752519 3.2554442161519321 4.9233609874500841 1.7544211068978468 3.3114982496859042 5.0095283940004638 1.6856574357204417 3.3675522832198768 5.0956958005508444 1.6168937645430366 3.4236063167538497 5.1818632071012241 1.5481300933656312 3.4796603502878223 5.2680306136516046 1.4793664221882261 3.0822656476851527 4.9070927757927816 1.8188652761035604 3.1383196812191252 4.9932601823431622 1.7501016049261553 3.1943737147530973 5.0794275888935418 1.6813379337487502 3.2504277482870698 5.1655949954439224 1.6125742625713451 3.3064817818210428 5.251762401994303 1.5438105913939397 2.9651411127523453 4.9769919706858596 1.8145457741318689 3.0211951462863182 5.0631593772362402 1.7457821029544638 3.0772491798202903 5.1493267837866199 1.6770184317770587 3.1333032133542629 5.2354941903370014 1.6082547605996536 3.1893572468882354 5.3216615968873811 1.5394910894222482 2.8480165778195383 5.0468911655789377 1.8102262721601774 2.9040706113535113 5.1330585721293183 1.7414626009827723 2.9601246448874834 5.219225978679698 1.6726989298053672 3.0161786784214559 5.3053933852300794 1.603935258627962 2.7308920428867314 5.1167903604720157 1.8059067701884859 2.7869460764207044 5.2029577670223963 1.7371430990110808 2.8430001099546769 5.2891251735727769 1.6683794278336757 2.6137675079539244 5.1866895553650938 1.8015872682167944 2.6698215414878974 5.2728569619154753 1.7328235970393893 2.496642973021117 5.2565887502581727 1.7972677662451029 2.3795184380883105 5.3264879451512508 1.7929482642734116 3.3613335137499099 5.3385437114400958 1.475063938512013 3.2293461636629259 5.4160319548867104 1.4709548161812214 3.059417480592848 5.3981043309435695 1.5353529840261142 3.097358813575942 5.4935201983333251 1.46684569385043 2.8894887975227705 5.3801767070004285 1.5997511518710068 2.9274301305058641 5.4755925743901841 1.5312438616953226 2.9653714634889581 5.5710084417799397 1.4627365715196383 2.7195601144526935 5.3622490830572866 1.6641493197158994 2.7575014474357866 5.4576649504470431 1.5956420295402152 2.7954427804188802 5.5530808178367987 1.5271347393645309 2.8333841134019737 5.6484966852265543 1.4586274491888469 2.5496314313826161 5.3443214591141457 1.728547487560792 2.5875727643657096 5.4397373265039013 1.6600401973851078 2.6255140973488027 5.5351531938936578 1.5915329072094235 2.6634554303318962 5.6305690612834134 1.5230256170337395 2.7013967633149898 5.7259849286731699 1.4545183268580553 2.4176440812956317 5.4218097025607603 1.7244383652300004 2.4555854142787252 5.5172255699505168 1.6559310750543161 2.4935267472618183 5.6126414373402724 1.5874237848786321 2.5314680802449119 5.7080573047300289 1.5189164947029479 2.5694094132280054 5.8034731721197854 1.4504092045272639 2.2477153982255542 5.4038820786176185 1.788836533074893 2.2856567312086473 5.4992979460073759 1.7203292428992087 2.3235980641917413 5.5947138133971315 1.6518219527235247 2.3615393971748344 5.690129680786888 1.5833146625478405 2.399480730157928 5.7855455481766436 1.5148073723721565 2.4374220631410215 5.8809614155664001 1.4463000821964722 4.0070155621679691 4.1404256753779825 1.8443945921624001 4.0789648732105963 4.2140185152971981 1.7755532805164673 4.1509141842532236 4.2876113552164137 1.7067119688705346 4.2228634952958508 4.3612041951356293 1.6378706572246018 4.2948128063384772 4.4347970350548449 1.5690293455786688 4.3667621173811053 4.5083898749740614 1.5001880339327358 3.9071724298893828 4.2273987409452687 1.8417819438775509 3.9791217409320101 4.3009915808644843 1.7729406322316181 4.0510710519746373 4.3745844207836999 1.7040993205856854 4.1230203630172646 4.4481772607029155 1.6352580089397526 4.194969674059891 4.5217701006221311 1.5664166972938194 3.8073292976107966 4.3143718065125549 1.8391692955927017 3.8792786086534239 4.3879646464317705 1.7703279839467689 3.9512279196960511 4.4615574863509861 1.7014866723008362 4.0231772307386784 4.5351503262702009 1.6326453606549032 4.0951265417813048 4.6087431661894174 1.5638040490089702 3.7074861653322104 4.4013448720798412 1.8365566473078525 3.7794354763748377 4.4749377119990559 1.7677153356619197 3.8513847874174649 4.5485305519182715 1.6988740240159868 3.9233340984600917 4.6221233918374871 1.630032712370054 3.6076430330536242 4.4883179376471265 1.8339439990230033 3.6795923440962515 4.5619107775663421 1.7651026873770705 3.7515416551388783 4.6355036174855577 1.6962613757311376 3.5077999007750376 4.5752910032144127 1.8313313507381541 3.5797492118176648 4.6488838431336283 1.7624900390922211 3.4079567684964513 4.662264068781699 1.8287187024533049 3.4799060795390782 4.7358569087009137 1.7598773908073719 3.3081136362178651 4.7492371343489843 1.8261060541684557 4.4336984988314434 4.5860393326005795 1.4313765067625741 4.265510512113889 4.5965027204566136 1.4975837541335857 4.3216113183508487 4.6829206607578158 1.428836606867723 4.1534233316332942 4.6933840486138498 1.4950438542387345 4.2095241378702539 4.779801988915052 1.4262967069728718 3.9852353449157394 4.703847436469883 1.5612511016097463 4.0413361511526995 4.7902653767710861 1.4925039543438836 4.0974369573896592 4.8766833170722883 1.4237568070780209 3.817047358198185 4.7143108243259162 1.6274583489807579 3.8731481644351451 4.8007287646271193 1.5587112017148952 3.9292489706721048 4.8871467049283224 1.4899640544490325 3.9853497769090649 4.9735646452295246 1.4212169071831697 3.6488593714806306 4.7247742121819511 1.6936655963517697 3.7049601777175902 4.8111921524831525 1.6249184490859068 3.7610609839545504 4.8976100927843556 1.556171301820044 3.81716179019151 4.9840280330855586 1.4874241545541813 3.8732625964284702 5.0704459733867608 1.4186770072883188 3.5367721910000358 4.8216555403391874 1.6911256964569188 3.5928729972369955 4.9080734806403887 1.6223785491910558 3.6489738034739556 4.9944914209415918 1.5536314019251929 3.7050746097109157 5.0809093612427949 1.4848842546593304 3.7611754159478754 5.1673273015439971 1.4161371073934677 3.3685842042824814 4.8321189281952206 1.7573329438279304 3.4246850105194411 4.9185368684964228 1.6885857965620676 3.4807858167564008 5.004954808797625 1.6198386492962049 3.5368866229933609 5.0913727490988281 1.551091502030342 3.592987429230321 5.1777906894000312 1.4823443547644792 4.8364895433321466 3.2905133799901942 1.7883179715687454 4.9214127871436038 3.3486445937928373 1.7194817542181891 5.00633603095506 3.4067758075954799 1.6506455368676325 5.0912592747665171 3.4649070213981226 1.5818093195170762 5.1761825185779742 3.5230382352007648 1.5129731021665198 5.2611057623894313 3.5811694490034074 1.4441368848159635 4.7552704464076312 3.3925658799708041 1.7870032067369843 4.8401936902190883 3.4506970937734471 1.718166989386428 4.9251169340305445 3.5088283075760898 1.6493307720358714 5.0100401778420016 3.566959521378732 1.5804945546853149 5.0949634216534587 3.6250907351813746 1.5116583373347585 4.6740513494831148 3.4946183799514143 1.785688441905223 4.7589745932945728 3.552749593754057 1.7168522245546669 4.8438978371060291 3.6108808075566996 1.6480160072041103 4.9288210809174862 3.6690120213593418 1.5791797898535538 4.5928322525585994 3.5966708799320242 1.784373677073462 4.6777554963700574 3.6548020937346668 1.7155374597229056 4.7626787401815136 3.7129333075373094 1.646701242372349 4.5116131556340839 3.698723379912634 1.7830589122417009 4.596536399445541 3.7568545937152762 1.7142226948911445 4.6814596432569973 3.8149858075179188 1.645386477540588 4.4303940587095685 3.8007758798932438 1.7817441474099396 4.5153173025210256 3.858907093695886 1.7129079300593832 4.3491749617850521 3.9028283798738537 1.7804293825781785 4.1018135241245632 4.0488021660324298 1.8466360702652127 5.1719612379828108 3.6928699246597168 1.4428260325125626 5.0091440809071583 3.7327433167468675 1.5103458434952508 5.0811730535013657 3.8065713008929136 1.4415159916312172 4.8463269238315068 3.7726167088340183 1.577865654477939 4.9183558964257132 3.8464446929800644 1.5090358026139055 4.9903848690199206 3.9202726771261105 1.4402059507498717 4.7555387393500608 3.8863180850672152 1.5765556135965937 4.8275677119442673 3.9601460692132613 1.5077257617325601 4.8995966845384746 4.0339740533593078 1.4388959098685263 4.5927215822744092 3.926191477154366 1.6440754245792821 4.6647505548686148 4.0000194613004121 1.5752455727152483 4.7367795274628222 4.0738474454464582 1.5064157208512148 4.8088085000570295 4.1476754295925051 1.4375858689871808 4.4299044251987567 3.9660648692415168 1.7115952355619706 4.5019333977929641 4.0398928533875624 1.6427653836979368 4.5739623703871697 4.1137208375336094 1.573935531833903 4.6459913429813771 4.1875488216796555 1.5051056799698692 4.7180203155755835 4.2613768058257016 1.4362758281058354 4.2670872681231051 4.0059382613286676 1.779115046544659 4.3391162407173107 4.0797662454747137 1.7102851946806252 4.4111452133115181 4.1535942296207597 1.6414553428165914 4.4831741859057237 4.2274222137668058 1.5726254909525577 4.5552031584999311 4.3012501979128528 1.5037956390885239 4.6272321310941384 4.3750781820588989 1.4349657872244899 4.1762990836416591 4.1196396375618649 1.7778050056633135 4.2483280562358656 4.1934676217079101 1.7089751537992799 4.3203570288300721 4.2672956058539562 1.6401453019352461 4.3923860014242786 4.3411235900000031 1.5713154500712121 4.464414974018486 4.4149515741460492 1.5024855982071783 4.5364439466126925 4.4887795582920953 1.4336557463431445 5.396676331506109 2.2488766827363125 1.7927357401420951 5.491293004032249 2.2892341641342915 1.7239369649603768 5.585909676558388 2.3295916455322701 1.6551381897786583 5.680526349084527 2.3699491269302491 1.5863394145969401 5.7751430216106661 2.4103066083282281 1.5175406394152218 5.869759694136806 2.4506640897262071 1.4487418642335033 5.33620658697129 2.3634354832298197 1.7922838188749211 5.4308232594974299 2.4037929646277987 1.7234850436932028 5.525439932023569 2.4441504460257772 1.6546862685114843 5.620056604549708 2.4845079274237563 1.585887493329766 5.7146732770758479 2.5248654088217353 1.5170887181480477 5.275736842436471 2.4779942837233269 1.791831897607747 5.3703535149626109 2.5183517651213059 1.7230331224260287 5.46497018748875 2.5587092465192844 1.6542343472443102 5.559586860014889 2.5990667279172635 1.5854355720625919 5.2152670979016529 2.5925530842168341 1.7913799763405729 5.3098837704277919 2.6329105656148131 1.7225812011588546 5.4045004429539309 2.6732680470127916 1.6537824259771361 5.4991171154800709 2.7136255284107706 1.5849836507954176 5.1547973533668339 2.7071118847103408 1.7909280550733988 5.2494140258929729 2.7474693661083198 1.7221292798916805 5.3440306984191128 2.7878268475062988 1.6533305047099618 5.0943276088320157 2.8216706852038476 1.7904761338062247 5.1889442813581539 2.862028166601827 1.7216773586245062 5.0338578642971967 2.9362294856973548 1.7900242125390504 5.1284745368233358 2.9765869670953342 1.7212254373573321 4.9733881197623786 3.050788286190862 1.7895722912718763 5.8061755162449726 2.5710804062993975 1.4482801880517615 5.6537228383787914 2.6403282818902323 1.5166352912681509 5.7387686626963479 2.6986862760144605 1.4478065386247529 5.5863159848301676 2.7679341516052953 1.5161616418411421 5.671361809147724 2.8262921457295236 1.4473328891977444 5.4338633069639863 2.8371820271961306 1.5845167450575315 5.5189091312815437 2.8955400213203584 1.5156879924141335 5.6039549555991002 2.9538980154445866 1.4468592397707356 5.2814106290978051 2.9064299027869658 1.6528718482739206 5.3664564534153625 2.9647878969111936 1.5840430956305227 5.451502277732919 3.0231458910354219 1.5152143429871248 5.5365481020504763 3.0815038851596497 1.446385590343727 5.2140037755491813 3.0340357725020293 1.6523981988469119 5.2990495998667377 3.0923937666262571 1.5835694462035139 5.3840954241842942 3.1507517607504854 1.5147406935601162 5.4691412485018516 3.2091097548747132 1.4459119409167183 5.0615510976830009 3.1032836480928641 1.7207533020633015 5.1465969220005574 3.1616416422170923 1.6519245494199033 5.2316427463181139 3.2199996363413201 1.5830957967765054 5.3166885706356704 3.2783576304655484 1.5142670441331074 5.4017343949532277 3.3367156245897762 1.4454382914897097 4.9090984198168206 3.1725315236836993 1.7891084052796906 4.9941442441343771 3.2308895178079275 1.7202796526362927 5.0791900684519335 3.2892475119321558 1.6514508999928945 5.16423589276949 3.3476055060563836 1.5826221473494966 5.2492817170870465 3.4059635001806114 1.5137933947060989 5.334327541404603 3.4643214943048397 1.4449646420627009 5.7045205029188928 1.2463314569936632 1.791983794877422 5.8051335340400705 1.2674111082647366 1.7232313960831496 5.9057465651612482 1.2884907595358102 1.6544789972888772 6.0063595962824268 1.3095704108068835 1.5857265984946045 6.1069726274036045 1.3306500620779569 1.5169741997003321 5.666896090305924 1.3698243405978499 1.7920886869558168 5.7675091214271017 1.3909039918689232 1.7233362881615444 5.8681221525482794 1.4119836431399966 1.654583889367272 5.968735183669458 1.4330632944110699 1.5858314905729993 6.0693482147906357 1.4541429456821435 1.5170790917787269 5.6292716776929552 1.4933172242020367 1.7921935790342116 5.7298847088141329 1.5143968754731101 1.7234411802399392 5.8304977399353106 1.5354765267441834 1.6546887814456668 5.9311107710564883 1.5565561780152568 1.5859363826513941 5.5916472650799864 1.6168101078062234 1.7922984711126064 5.6922602962011641 1.6378897590772967 1.723546072318334 5.7928733273223418 1.6589694103483699 1.6547936735240614 5.5540228524670177 1.74030299141041 1.7924033631910012 5.6546358835881954 1.7613826426814834 1.7236509643967286 5.5163984398540489 1.8637958750145964 1.7925082552693958 5.6170114709752257 1.8848755262856698 1.7237558564751234 5.4787740272410792 1.9872887586187833 1.7926131473477906 6.2067234147346104 1.3546039467034137 1.4482156037497831 6.1649261255829853 1.4920068416847012 1.4482905043474306 6.0283562140292783 1.5888614644144083 1.5171597801803098 6.1231288364313601 1.629409736665989 1.4483654049450783 5.8917863024755714 1.6857160871441152 1.5860290560131889 5.9865589248776541 1.7262643593956959 1.5172346807779575 6.0813315472797358 1.7668126316472765 1.4484403055427257 5.7552163909218645 1.7825707098738226 1.6548983318460679 5.8499890133239472 1.8231189821254028 1.5861039566108366 5.9447616357260289 1.8636672543769834 1.517309581375605 6.0395342581281106 1.9042155266285641 1.4485152061403734 5.7134191017702403 1.9199736048551101 1.6549732324437156 5.808191724172322 1.9605218771066903 1.5861788572084841 5.9029643465744037 2.001070149358271 1.5173844819732527 5.9977369689764863 2.0416184216098516 1.4485901067380209 5.5768491902165325 2.0168282275848171 1.7238425082765949 5.6716218126186151 2.0573764998363977 1.6550481330413633 5.7663944350206968 2.0979247720879779 1.5862537578061318 5.8611670574227794 2.1384730443395585 1.5174593825709002 5.9559396798248612 2.1790213165911392 1.4486650073356686 5.4402792786628256 2.1136828503145244 1.792711784109474 5.5350519010649082 2.1542311225661046 1.7239174088742424 5.6298245234669899 2.1947793948176852 1.655123033639011 5.7245971458690725 2.2353276670692659 1.5863286584037792 5.8193697682711543 2.2758759393208461 1.5175342831685479 5.9141423906732369 2.3164242115724267 1.4487399079333161 5.8465718795170263 0.081303975927255245 1.7881490062482777 5.9492975559878207 0.082291013463557827 1.7194449468707558 6.0520232324586152 0.083278050999860631 1.6507408874932339 6.1547489089294105 0.08426508853616349 1.582036828115712 6.257474585400205 0.085252126072466294 1.5133327687381901 5.8332640350646372 0.20936689485176796 1.788613221920053 5.9359897115354316 0.21035393238807054 1.7199091625425311 6.0387153880062261 0.21134096992437329 1.6512051031650092 6.1414410644770214 0.21232800746067618 1.5825010437874873 6.2441667409478159 0.21331504499697901 1.5137969844099655 5.8199561906122481 0.33742981377628078 1.7890774375918284 5.9226818670830434 0.33841685131258337 1.7203733782143065 6.0254075435538379 0.33940388884888611 1.6516693188367846 6.1281332200246323 0.34039092638518903 1.5829652594592627 5.8066483461598599 0.46549273270079339 1.7895416532636037 5.9093740226306544 0.46647977023709608 1.7208375938860818 6.0120996991014488 0.46746680777339877 1.6521335345085599 5.7933405017074708 0.59355565162530599 1.7900058689353791 5.8960661781782662 0.59454268916160879 1.7213018095578572 5.9987918546490606 0.59552972669791149 1.6525977501803353 5.7800326572550826 0.72161857054981859 1.7904700846071544 5.8827583337258771 0.72260560808612151 1.7217660252296325 5.7667248128026936 0.84968148947433164 1.7909343002789297 5.7534169683503054 0.97774440839884436 1.7913985159507051 6.3601214852956778 0.087067388086097042 1.4446268408554046 6.3454505952947615 0.22946080668508073 1.445058726386252 6.2299797757974877 0.35062067696893973 1.5142403481769104 6.3307797052938453 0.37185422528406442 1.4454906119170992 6.1145089563002148 0.47178054725279883 1.5834219699675691 6.2153088857965715 0.49301409556792342 1.5146722337077578 6.316108815292929 0.514247643883048 1.4459224974479465 6.0998380662992986 0.61417396585178241 1.5838538554984165 6.2006379957956552 0.63540751416690699 1.5151041192386052 6.3014379252920127 0.65664106248203158 1.4463543829787937 5.9843672468020248 0.73533383613564163 1.6530354772890752 6.0851671762983823 0.7565673844507661 1.5842857410292639 6.185967105794739 0.77780093276589057 1.5155360047694524 6.2867670352910965 0.79903448108101505 1.4467862685096411 5.868896427304751 0.85649370641950107 1.7222170990797339 5.9696963568011085 0.87772725473462565 1.6534673628199226 6.0704962862974661 0.89896080304975001 1.5847176265601111 6.1712962157938236 0.92019435136487449 1.5159678903002998 6.2720961452901811 0.94142789967999896 1.4472181540404883 5.8542255373038348 0.99888712501848465 1.7226489846105812 5.9550254668001923 1.0201206733336092 1.6538992483507697 6.0558253962965498 1.0413542216487337 1.5851495120909584 6.1566253257929073 1.0625877699638582 1.5163997758311469 6.2574252552892649 1.0838213182789824 1.4476500395713356 5.7387547178065619 1.120046995302344 1.7918306064012399 5.8395546473029194 1.1412805436174682 1.7230808701414284 5.9403545767992769 1.1625140919325929 1.6543311338816171 6.0411545062956344 1.1837476402477174 1.5855813976218056 6.141954435791992 1.2049811885628416 1.5168316613619943 6.2427543652883495 1.2262147368779661 1.4480819251021828 5.7565545211491589 -1.0876970905748098 1.7820661004825373 5.8574087801627694 -1.1069511937841325 1.713410329388833 5.95826303917638 -1.1262052969934551 1.6447545582951288 6.0591172981899906 -1.1454594002027778 1.5760987872014245 6.1599715572036011 -1.1647135034121003 1.5074430161077204 6.2608258162172126 -1.1839676066214231 1.438787245014016 5.7681105286738132 -0.95977906668279811 1.7827628893023855 5.8689647876874229 -0.97903316989212086 1.7141071182086811 5.9698190467010344 -0.99828727310144338 1.645451347114977 6.0706733057146449 -1.0175413763107661 1.5767955760212726 6.1715275647282555 -1.0367954795200887 1.5081398049275685 5.7796665361984667 -0.83186104279078654 1.7834596781222336 5.8805207952120773 -0.85111514600010918 1.7148039070285293 5.9813750542256887 -0.87036924920943171 1.6461481359348251 6.0822293132392993 -0.88962335241875445 1.5774923648411208 5.7912225437231211 -0.70394301889877453 1.7841564669420817 5.8920768027367307 -0.72319712210809728 1.7155006958483774 5.9929310617503422 -0.74245122531741981 1.6468449247546733 5.8027785512477745 -0.57602499500676285 1.7848532557619299 5.9036328102613851 -0.5952790982160856 1.7161974846682255 6.0044870692749965 -0.61453320142540813 1.6475417135745214 5.8143345587724289 -0.44810697111475123 1.785550044581778 5.9151888177860386 -0.46736107432407387 1.7168942734880739 5.8258905662970824 -0.3201889472227395 1.7862468334016264 5.8374465738217367 -0.19227092333072754 1.7869436222214745 6.2738005256382507 -1.0421311112755973 1.4394520600759748 6.1838877620218113 -0.90098778382991862 1.5088184694543332 6.2868163264651828 -0.89989148010441489 1.4401159490472115 6.093974998405371 -0.75984445638423992 1.5781848788326918 6.1969035628487434 -0.7587481526587363 1.5094823584255699 6.2998321272921149 -0.75765184893323256 1.4407798380184482 6.1069907992323031 -0.61760482521305771 1.5788487678039285 6.2099193636756755 -0.61650852148755408 1.5101462473968066 6.312847928119047 -0.61541221776205024 1.4414437269896849 6.0170780356158629 -0.47646149776737906 1.6482151771822871 6.1200066000592352 -0.47536519404187538 1.5795126567751652 6.2229351645026076 -0.47426889031637171 1.5108101363680433 6.3258637289459791 -0.47317258659086797 1.4421076159609216 5.9271652719994217 -0.33531817032170042 1.7175815865606454 6.030093836442795 -0.33422186659619679 1.6488790661535238 6.1330224008861673 -0.33312556287069311 1.5801765457464019 6.2359509653295397 -0.33202925914518938 1.51147402533928 6.3388795297729121 -0.33093295541968565 1.4427715049321583 5.9401810728263538 -0.19307853915051826 1.7182454755318821 6.0431096372697271 -0.19198223542501458 1.6495429551247605 6.1460382017130994 -0.19088593169951085 1.5808404347176386 6.2489667661564718 -0.18978962797400717 1.5121379143105167 6.3518953305998442 -0.18869332424850341 1.443435393903395 5.8502683092099144 -0.051935211704839411 1.7876118849102407 5.9531968736532868 -0.050838907979335851 1.718909364503119 6.0561254380966592 -0.049742604253832159 1.6502068440959972 6.1590540025400315 -0.048646300528328454 1.5815043236888751 6.2619825669834039 -0.047549996802824748 1.5128018032817534 6.3649111314267772 -0.046453693077321036 1.4440992828746317 5.3433973688779277 -2.1741245840653556 1.84317837376531 5.4384903257048443 -2.2126437663578797 1.7745736540585848 5.5335832825317626 -2.2511629486504039 1.7059689343518598 5.6286762393586809 -2.2896821309429276 1.6373642146451344 5.7237691961855983 -2.3282013132354513 1.5687594949384092 5.8188621530125166 -2.3667204955279755 1.5001547752316839 5.9139551098394341 -2.4052396778204992 1.4315500555249587 5.3792977403209763 -2.05144082654969 1.8440234806082811 5.4743906971478937 -2.0899600088422141 1.7754187609015559 5.569483653974812 -2.1284791911347383 1.7068140411948309 5.6645766108017304 -2.166998373427262 1.6382093214881055 5.7596695676286478 -2.2055175557197857 1.5696046017813803 5.8547625244555661 -2.2440367380123099 1.5009998820746551 5.4151981117640258 -1.9287570690340246 1.8448685874512523 5.5102910685909432 -1.9672762513265487 1.776263867744527 5.6053840254178615 -2.0057954336190726 1.7076591480378021 5.7004769822447798 -2.0443146159115964 1.6390544283310766 5.7955699390716973 -2.0828337982041205 1.5704497086243514 5.4510984832070744 -1.8060733115183591 1.8457136942942234 5.5461914400339927 -1.8445924938108831 1.7771089745874982 5.641284396860911 -1.883111676103407 1.7085042548807732 5.7363773536878293 -1.9216308583959307 1.6398995351740477 5.4869988546501238 -1.6833895540026937 1.8465588011371945 5.5820918114770421 -1.7219087362952177 1.7779540814304693 5.6771847683039596 -1.7604279185877416 1.7093493617237443 5.7722777251308779 -1.7989471008802653 1.6407446420170189 5.5228992260931724 -1.5607057964870283 1.8474039079801656 5.6179921829200916 -1.5992249787795523 1.7787991882734404 5.713085139747009 -1.637744161072076 1.7101944685667154 5.6538925543631411 -1.4765412212638866 1.7796442951164115 5.6897929258061897 -1.3538574637482208 1.7804894019593827 5.9538719692197759 -2.2694900778428488 1.4323611047068612 5.8928893649842182 -2.1141101617024285 1.5018261096552752 5.993920213052335 -2.1333130774642939 1.4331710398191553 5.8319067607486588 -1.9587302455620079 1.5712911146036892 5.9329376088167773 -1.9779331613238731 1.5026360447675693 6.0339684568848941 -1.9971360770857385 1.4339809749314494 5.8719550045812179 -1.8225532451834527 1.5721010497159833 5.9729858526493365 -1.8417561609453179 1.5034459798798634 6.0740167007174533 -1.8609590767071833 1.4347909100437435 5.8109724003456602 -1.6671733290430322 1.6415660546643975 5.912003248413777 -1.6863762448048976 1.5729109848282774 6.0130340964818956 -1.7055791605667627 1.5042559149921575 6.1140649445500124 -1.7247820763286281 1.4356008451560376 5.7499897961101007 -1.5117934129026118 1.7110310596128118 5.8510206441782193 -1.530996328664477 1.6423759897766916 5.9520514922463361 -1.5501992444263424 1.5737209199405715 6.0530823403144547 -1.5694021601882076 1.5050658501044516 6.1541131883825724 -1.5886050759500729 1.4364107802683317 5.7900380399426599 -1.3756164125240564 1.7118409947251059 5.8910688880107784 -1.3948193282859216 1.6431859248889857 5.9920997360788952 -1.414022244047787 1.5745308550528658 6.0931305841470138 -1.4332251598096519 1.5058757852167459 6.1941614322151315 -1.4524280755715173 1.437220715380626 5.7290554357071022 -1.2202364963836361 1.7813059996735199 5.8300862837752199 -1.2394394121455012 1.7126509298374 5.9311171318433376 -1.2586423279073664 1.6439958600012801 6.0321479799114552 -1.2778452436692318 1.5753407901651599 6.1331788279795729 -1.2970481594310967 1.50668572032904 6.2342096760476915 -1.3162510751929621 1.4380306504929201 4.8215613778870816 -3.1920429174679317 1.8347665280172367 4.9068742583506797 -3.2490399311629883 1.7662103948569732 4.9921871388142778 -3.306036944858044 1.6976542616967096 5.077500019277875 -3.3630339585531011 1.6290981285364463 5.1628128997414722 -3.4200309722481572 1.5605419953761825 5.2481257802050703 -3.4770279859432134 1.4919858622159188 4.880184870098125 -3.0794025405346535 1.8357044912932132 4.965497750561723 -3.1363995542297096 1.7671483581329497 5.0508106310253211 -3.1933965679247653 1.6985922249726861 5.1361235114889183 -3.2503935816198224 1.6300360918124226 5.2214363919525155 -3.3073905953148786 1.5614799586521591 5.3067492724161136 -3.3643876090099347 1.4929238254918953 4.9388083623091692 -2.9667621636013748 1.8366424545691897 5.0241212427727664 -3.023759177296431 1.7680863214089262 5.1094341232363645 -3.0807561909914867 1.6995301882486626 5.1947470036999617 -3.1377532046865437 1.6309740550883991 5.2800598841635598 -3.1947502183816003 1.5624179219281353 4.9974318545202134 -2.8541217866680961 1.8375804178451662 5.0827447349838106 -2.9111188003631523 1.7690242846849027 5.1680576154474087 -2.9681158140582085 1.7004681515246391 5.253370495911005 -3.0251128277532651 1.6319120183643754 5.0560553467312577 -2.7414814097348175 1.8385183811211427 5.1413682271948549 -2.7984784234298736 1.7699622479608792 5.226681107658453 -2.8554754371249298 1.7014061148006154 5.3119939881220493 -2.9124724508199864 1.6328499816403519 5.114678838942301 -2.6288410328015388 1.8394563443971192 5.1999917194058982 -2.685838046496595 1.7709002112368557 5.2853045998694963 -2.7428350601916511 1.7023440780765919 5.1733023311533444 -2.5162006558682601 1.8403943076730958 5.2586152116169416 -2.5731976695633167 1.7718381745128322 5.2319258233643886 -2.4035602789349815 1.8413322709490723 5.3172387038279858 -2.4605572926300381 1.7727761377888085 5.2905493155754328 -2.2909199020017028 1.8422702342250488 5.3334809954246261 -3.5339464438496178 1.4234295242891484 5.3990419017722644 -3.4084330970272965 1.424333932392136 5.3693223389877476 -3.244418456423749 1.4938426853024749 5.4646028081199027 -3.2829197502049752 1.4252383404951237 5.3396027762032308 -3.0804038158202021 1.563351438212814 5.4348832453353859 -3.1189051096014277 1.4947470934054625 5.5301637144675411 -3.1574064033826534 1.4261427485981113 5.4051636825508691 -2.9548904689978808 1.5642558463158016 5.5004441516830243 -2.9933917627791065 1.4956515015084504 5.5957246208151794 -3.0318930565603317 1.4270471567010992 5.3754441197663514 -2.7908758283943342 1.6337645992261405 5.4707245888985074 -2.8293771221755595 1.5651602544187893 5.5660050580306635 -2.8678784159567852 1.496555909611438 5.6612855271628186 -2.9063797097380104 1.4279515648040868 5.3457245569818355 -2.6268611877907877 1.7032733521364793 5.4410050261139906 -2.6653624815720129 1.6346690073291283 5.5362854952461458 -2.7038637753532382 1.5660646625217771 5.6315659643783018 -2.7423650691344634 1.4974603177144259 5.7268464335104579 -2.7808663629156887 1.4288559729070747 5.4112854633294738 -2.5013478409684664 1.7041777602394672 5.506565932461629 -2.5398491347496917 1.6355734154321162 5.601846401593785 -2.5783504285309169 1.5669690706247648 5.697126870725941 -2.6168517223121421 1.4983647258174135 5.7924073398580962 -2.6553530160933674 1.4297603810100623 5.381565900544957 -2.3373332003649199 1.7736865131498061 5.4768463696771121 -2.3758344941461451 1.7050821683424551 5.5721268388092682 -2.4143357879273704 1.6364778235351038 5.6674073079414233 -2.4528370817085956 1.5678734787277526 5.7626877770735794 -2.4913383754898208 1.4992691339204014 5.8579682462057354 -2.5298396692710456 1.4306647891130502 4.1178035698364397 -4.0780803312929619 1.8258663908103836 4.190567046160826 -4.1502237511824713 1.7573728471642434 4.2633305224852123 -4.2223671710719817 1.6888793035181031 4.3360939988095977 -4.294510590961492 1.6203857598719629 4.408857475133984 -4.3666540108510015 1.5518922162258226 4.4816209514583703 -4.4387974307405118 1.4833986725796822 4.1961586621221416 -3.9802768141514933 1.8268577899156071 4.2689221384465279 -4.0524202340410032 1.7583642462694669 4.3416856147709142 -4.1245636539305135 1.6898707026233266 4.4144490910952996 -4.1967070738200229 1.6213771589771864 4.4872125674196859 -4.2688504937095333 1.5528836153310461 4.5599760437440722 -4.3409939135990427 1.4843900716849057 4.2745137544078435 -3.8824732970100246 1.8278491890208306 4.3472772307322298 -3.9546167168995345 1.7593556453746904 4.4200407070566161 -4.0267601367890453 1.6908621017285501 4.4928041833810015 -4.0989035566785548 1.6223685580824099 4.5655676597053878 -4.1710469765680651 1.5538750144362696 4.3528688466935455 -3.784669779868556 1.8288405881260543 4.4256323230179317 -3.8568131997580659 1.7603470444799141 4.498395799342318 -3.9289566196475767 1.6918535008337738 4.5711592756667034 -4.0011000395370857 1.6233599571876334 4.4312239389792474 -3.6868662627270874 1.8298319872312778 4.5039874153036337 -3.7590096826165973 1.7613384435851376 4.57675089162802 -3.8311531025061076 1.6928448999389973 4.6495143679524054 -3.9032965223956175 1.6243513562928571 4.5095790312649493 -3.5890627455856188 1.8308233863365015 4.5823425075893356 -3.6612061654751287 1.7623298426903613 4.655105983913721 -3.733349585364639 1.6938362990442211 4.5879341235506512 -3.4912592284441502 1.831814785441725 4.6606975998750375 -3.56340264833366 1.7633212417955848 4.6662892158363531 -3.393455711302682 1.8328061845469488 4.7390526921607394 -3.4655991311921919 1.7643126409008085 4.7446443081220551 -3.2956521941612134 1.8337975836521723 4.5564223919912861 -4.5084814444384351 1.4148949658652179 4.6433725539236601 -4.4003054352690523 1.4158435024512164 4.6450084862312488 -4.2351321997727807 1.4853481716938859 4.7303227158560341 -4.2921294260996703 1.4167920390372148 4.6466444185388376 -4.0699589642765091 1.5548528409365554 4.7319586481636229 -4.1269561906033987 1.4862967082798844 4.8172728777884082 -4.1839534169302883 1.4177405756232133 4.7335945804712116 -3.9617829551071266 1.5558013775225539 4.8189088100959969 -4.0187801814340167 1.4872452448658828 4.9042230397207822 -4.0757774077609064 1.4186891122092118 4.7352305127788004 -3.796609719610855 1.6253060467652234 4.8205447424035857 -3.8536069459377447 1.5567499141085523 4.905858972028371 -3.9106041722646343 1.4881937814518813 4.9911732016531563 -3.9676013985915239 1.4196376487952103 4.7368664450863891 -3.631436484114583 1.6948107160078929 4.8221806747111744 -3.6884337104414726 1.6262545833512219 4.9074949043359597 -3.7454309367683623 1.5576984506945508 4.992809133960745 -3.8024281630952519 1.4891423180378798 5.0781233635855303 -3.8594253894221415 1.4205861853812087 4.823816607018764 -3.5232604749452006 1.6957592525938914 4.9091308366435493 -3.5802577012720906 1.6272031199372203 4.9944450662683346 -3.6372549275989803 1.5586469872805493 5.079759295893119 -3.6942521539258699 1.4900908546238782 5.1650735255179043 -3.7512493802527596 1.4215347219672072 4.8254525393263537 -3.3580872394489285 1.7652639218365609 4.9107667689511389 -3.4150844657758181 1.6967077891798898 4.9960809985759242 -3.4720816921027082 1.6281516565232188 5.0813952282007095 -3.5290789184295979 1.5595955238665478 5.166709457825494 -3.5860761447564875 1.4910393912098767 5.2520236874502793 -3.6430733710833771 1.4224832585532057 3.2585976648279846 -4.8082466931131806 1.8165703930143045 3.3152175783028062 -4.8936367503631075 1.7481356174745664 3.3718374917776277 -4.9790268076130344 1.6797008419348283 3.4284574052524488 -5.0644168648629622 1.61126606639509 3.4850773187272699 -5.149806922112889 1.5428312908553516 3.5416972322020914 -5.2351969793628159 1.4743965153156133 3.3539085199771796 -4.7280307659626999 1.8176065046237517 3.4105284334520012 -4.8134208232126268 1.7491717290840136 3.4671483469268223 -4.8988108804625536 1.6807369535442755 3.5237682604016438 -4.9842009377124814 1.6123021780045372 3.5803881738764649 -5.0695909949624083 1.5438674024647989 3.4492193751263747 -4.6478148388122191 1.818642616233199 3.5058392886011962 -4.733204896062146 1.7502078406934609 3.5624592020760173 -4.8185949533120729 1.6817730651537228 3.6190791155508384 -4.9039850105620006 1.6133382896139845 3.6756990290256599 -4.9893750678119275 1.5449035140742462 3.5445302302755692 -4.5675989116617384 1.8196787278426463 3.6011501437503908 -4.6529889689116652 1.7512439523029082 3.6577700572252123 -4.7383790261615921 1.6828091767631701 3.7143899707000334 -4.823769083411519 1.6143744012234318 3.6398410854247643 -4.4873829845112576 1.8207148394520936 3.6964609988995853 -4.5727730417611845 1.7522800639123555 3.7530809123744069 -4.6581630990111114 1.6838452883726174 3.7351519405739593 -4.4071670573607769 1.8217509510615408 3.7917718540487804 -4.4925571146107037 1.7533161755218027 3.8483917675236019 -4.5779471718606297 1.6848813999820647 3.8304627957231543 -4.3269511302102961 1.8227870626709881 3.8870827091979754 -4.412341187460223 1.75435228713125 3.9257736508723493 -4.2467352030598144 1.8238231742804356 4.0210845060215439 -4.1665192759093337 1.8248592858898829 3.6371258119903569 -5.1548852585782754 1.4754322010889824 3.7435403480848648 -5.0656341629397996 1.4764281482265977 3.7770926420963939 -4.9042095439499169 1.5459176230018439 3.8499548841793727 -4.9763830673013238 1.477424095364213 3.8106449361079227 -4.7427849249600342 1.61540709777709 3.8835071781909019 -4.8149584483114412 1.5469135701394592 3.9563694202738806 -4.8871319716628481 1.4784200425018283 3.9170594722024306 -4.6535338293215585 1.6164030449147053 3.9899217142854098 -4.7257073526729654 1.5479095172770745 4.0627839563683885 -4.7978808760243723 1.4794159896394437 3.9506117662139597 -4.4921092103316758 1.6858925196899517 4.0234740082969385 -4.5642827336830827 1.6173989920523206 4.0963362503799177 -4.6364562570344896 1.5489054644146898 4.169198492462896 -4.7086297803858965 1.480411936777059 3.9841640602254884 -4.330684591341794 1.7553819944651978 4.0570263023084676 -4.4028581146932 1.686888466827567 4.1298885443914468 -4.4750316380446069 1.6183949391899359 4.2027507864744251 -4.5472051613960138 1.5499014115523051 4.2756130285574043 -4.6193786847474207 1.4814078839146743 4.0905785963199968 -4.2414334957033182 1.7563779416028131 4.163440838402976 -4.3136070190547242 1.6878844139651823 4.2363030804859543 -4.3857805424061311 1.6193908863275512 4.3091653225689335 -4.4579540657575381 1.5508973586899204 4.3820275646519118 -4.530127589108945 1.4824038310522893 2.2583848603099446 -5.3680368402946055 1.8066847555988315 2.3004045960819539 -5.4609763354762455 1.7383529855544688 2.3424243318539633 -5.5539158306578846 1.6700212155101066 2.3844440676259722 -5.6468553258395247 1.6016894454657442 2.4264638033979811 -5.7397948210211638 1.533357675421382 2.4684835391699904 -5.8327343162028029 1.4650259053770198 2.3693089586626854 -5.3068787187575976 1.8077908323818188 2.4113286944346948 -5.3998182139392368 1.7394590623374562 2.4533484302067041 -5.4927577091208768 1.671127292293094 2.495368165978713 -5.5856972043025159 1.6027955222487316 2.5373879017507219 -5.6786366994841559 1.5344637522043694 2.4802330570154263 -5.2457205972205889 1.8088969091648062 2.5222527927874356 -5.3386600924022281 1.7405651391204435 2.564272528559445 -5.4315995875838681 1.6722333690760813 2.6062922643314539 -5.5245390827655072 1.6039015990317191 2.6483120001034628 -5.6174785779471472 1.5355698289873569 2.5911571553681672 -5.1845624756835811 1.8100029859477935 2.6331768911401765 -5.2775019708652193 1.7416712159034309 2.6751966269121854 -5.3704414660468593 1.6733394458590687 2.7172163626841943 -5.4633809612284985 1.6050076758147065 2.7020812537209076 -5.1234043541465724 1.8111090627307809 2.7441009894929169 -5.2163438493282115 1.7427772926864182 2.7861207252649258 -5.3092833445098515 1.674445522642056 2.8130053520736484 -5.0622462326095636 1.8122151395137682 2.8550250878456578 -5.1551857277912028 1.7438833694694058 2.8970448236176667 -5.2481252229728428 1.6755515994250436 2.9239294504263889 -5.0010881110725558 1.8133212162967556 2.9659491861983982 -5.0940276062541949 1.7449894462523932 3.0348535487791293 -4.9399299895355471 1.8144272930797432 3.1457776471318701 -4.8787718679985392 1.8155333698627305 2.5826003612171173 -5.7699078840097897 1.4661093415622934 2.7034222392594289 -5.7035778237434975 1.4671452301080072 2.7676988815783412 -5.5518983539629572 1.5366158935404906 2.8242441173017405 -5.6372477634772054 1.468181118653721 2.8319755238972535 -5.4002188841824159 1.6060865569729739 2.8885207596206528 -5.485568293696665 1.5376517820862043 2.9450659953440521 -5.5709177032109132 1.4692170071994348 2.9527974019395651 -5.3338888239161237 1.6071224455186877 3.0093426376629644 -5.4192382334303728 1.5386876706319181 3.0658878733863641 -5.504587642944621 1.4702528957451486 3.0170740442584774 -5.1822093541355834 1.676593108951171 3.0736192799818767 -5.2675587636498316 1.6081583340644015 3.130164515705276 -5.3529081731640806 1.5397235591776319 3.1867097514286757 -5.4382575826783288 1.4712887842908624 3.0813506865773896 -5.0305298843550421 1.7460637723836543 3.137895922300789 -5.1158792938692912 1.6776289974968848 3.1944411580241883 -5.2012287033835394 1.6091942226101152 3.2509863937475876 -5.2865781128977876 1.5407594477233457 3.3075316294709873 -5.3719275224120357 1.4723246728365762 3.2021725646197012 -4.9641998240887499 1.7470996609293681 3.258717800343101 -5.0495492336029981 1.6786648860425988 3.3152630360664999 -5.1348986431172472 1.610230111155829 3.3718082717898992 -5.2202480526314954 1.5417953362690595 3.4283535075132989 -5.3055974621457436 1.47336056138229 1.2172122095124487 -5.7060270190826454 1.7966912133373334 1.2441247487656995 -5.8040358760202801 1.7284751659214055 1.2710372880189504 -5.9020447329579131 1.6602591185054776 1.2979498272722014 -6.0000535898955469 1.5920430710895495 1.3248623665254526 -6.0980624468331808 1.5238270236736216 1.3467761772940114 -5.6647590129425032 1.7979538601035194 1.3736887165472622 -5.7627678698801379 1.7297378126875915 1.4006012558005132 -5.8607767268177708 1.6615217652716636 1.4275137950537642 -5.9587855837554047 1.5933057178557353 1.4544263343070154 -6.0567944406930385 1.5250896704398074 1.4763401450755742 -5.6234910068023609 1.7992165068697055 1.503252684328825 -5.7214998637399956 1.7310004594537773 1.530165223582076 -5.8195087206776286 1.6627844120378494 1.557077762835327 -5.9175175776152624 1.5945683646219213 1.605904112857137 -5.5822230006622187 1.8004791536358915 1.6328166521103877 -5.6802318575998534 1.7322631062199634 1.6597291913636387 -5.7782407145374863 1.6640470588040355 1.7354680806386997 -5.5409549945220764 1.8017418004020775 1.7623806198919505 -5.6389638514597111 1.7335257529861492 1.7892931591452015 -5.7369727083973441 1.6653097055702213 1.8650320484202627 -5.4996869883819341 1.8030044471682634 1.8919445876735137 -5.5976958453195689 1.7347883997523352 1.9945960162018255 -5.4584189822417919 1.8042670939344494 1.3526031577504611 -6.1958292909381303 1.4556050429827427 1.4935329761401666 -6.1512402160950543 1.4567862692162814 1.5916672561465521 -6.0132832507618366 1.5262973224933176 1.634462794529872 -6.1066511412519793 1.4579674954498201 1.6898015361529377 -5.8753262854286188 1.5958083757703541 1.7325970745362576 -5.9686941759187615 1.5274785487268563 1.7753926129195774 -6.0620620664089033 1.4591487216833587 1.8307313545426434 -5.8307372105855437 1.5969896020038927 1.873526892925963 -5.9241051010756856 1.528659774960395 1.9163224313092828 -6.0174729915658283 1.4603299479168974 1.9288656345490287 -5.6927802452523251 1.6665006552809292 1.9716611729323488 -5.7861481357424678 1.5981708282374314 2.0144567113156686 -5.8795160262326105 1.5298410011939336 2.0572522496989882 -5.9728839167227523 1.4615111741504361 2.0269999145554141 -5.5548232799191073 1.7360117085579654 2.0697954529387341 -5.64819117040925 1.6676818815144678 2.1125909913220542 -5.7415590608993927 1.5993520544709701 2.1553865297053738 -5.8349269513895345 1.5310222274274723 2.1981820680886939 -5.9282948418796773 1.4626924003839747 2.1251341945617996 -5.4168663145858895 1.8055227618350018 2.1679297329451197 -5.5102342050760322 1.7371929347915041 2.2107252713284398 -5.6036020955661749 1.6688631077480063 2.2535208097117594 -5.6969699860563168 1.6005332807045087 2.2963163480950795 -5.7903378765464595 1.532203453661011 2.3391118864783991 -5.8837057670366013 1.4638736266175134 0.91690091315880462 -5.7556880934885228 1.7938851000505158 0.76740575233483188 -5.7726869304506723 1.7923650946928995 0.77797885040175496 -5.8735589609456893 1.7242687447363472 0.61791059151085892 -5.7896857674128217 1.7908450893352832 0.628483689577782 -5.8905577979078387 1.7227487393787309 0.46841543068688618 -5.8066846043749702 1.7893250839776669 0.47898852875380926 -5.9075566348699882 1.7212287340211145 0.48956162682073234 -6.0084286653650052 1.6531323840645624 0.31892026986291344 -5.8236834413371197 1.7878050786200506 0.32949336792983652 -5.9245554718321376 1.7197087286634982 0.34006646599675949 -6.0254275023271546 1.6516123787069461 0.35063956406368246 -6.1262995328221717 1.583516028750394 0.16942510903894051 -5.8406822782992682 1.786285073262434 0.17999820710586353 -5.9415543087942861 1.7181887233058819 0.19057130517278653 -6.0424263392893041 1.6500923733493298 0.2011444032397095 -6.1432983697843211 1.5819960233927777 0.21171750130663264 -6.244170400279339 1.5138996734362253 0.019929948214967741 -5.8576811152614177 1.7847650679048177 0.030503046281890767 -5.9585531457564356 1.7166687179482656 0.041076144348813737 -6.0594251762514535 1.6485723679917133 0.051649242415736707 -6.1602972067464705 1.5804760180351614 0.062222340482659982 -6.2611692372414884 1.512379668078609 0.072795438549582994 -6.3620412677365064 1.4442833181220571 0.23591134958956794 -6.3438248135874815 1.4457205297207769 0.37078735534652596 -6.2263156404910704 1.5153614790009482 0.39953350959090606 -6.3255631036760063 1.447154664084118 0.50566336110348387 -6.1088064673946585 1.5850024282811197 0.53440951534786396 -6.2080539305795952 1.5167956133642895 0.56315566959224417 -6.307301393764531 1.448588798447459 0.64053936686044199 -5.9912972942982474 1.6546433775612912 0.66928552110482209 -6.0905447574831832 1.5864365626444608 0.6980316753492023 -6.18979222066812 1.5182297477276305 0.72677782959358239 -6.2890396838530558 1.4500229328108003 0.80416152686177989 -5.9730355843867722 1.6560775119246323 0.8329076811061602 -6.072283047571708 1.587870697007802 0.8616538353505403 -6.1715305107566447 1.5196638820909718 0.8903999895949205 -6.2707779739415805 1.4514570671741414 0.93903753261873801 -5.8555264112903602 1.7257184612048038 0.96778368686311789 -5.954773874475296 1.6575116462879735 0.99652984110749832 -6.0540213376602328 1.5893048313711431 1.0252759953518784 -6.1532688008451695 1.5210980164543129 1.0540221495962587 -6.2525162640301053 1.4528912015374826 1.0739135383756959 -5.7380172381939483 1.7953594104849753 1.1026596926200758 -5.837264701378885 1.7271525955681448 1.1314058468644559 -5.9365121645638208 1.6589457806513146 1.1601520011088362 -6.0357596277487566 1.5907389657344844 1.1888981553532165 -6.1350070909336933 1.5225321508176541 1.2176443095975968 -6.2342545541186301 1.4543253359008237 -1.2579907246634094 -6.3417138332668168 1.3372857172444612 -1.271657505454149 -6.4090437752362117 1.234504816312481 -1.2853242862448879 -6.4763737172056057 1.131723915380501 -1.2989910670356271 -6.5437036591749997 1.028943014448521 -1.3126578478263662 -6.6110336011443938 0.92616211351654099 -1.3263246286171051 -6.6783635431137887 0.82338121258456065 -1.0651371621762449 -6.3588173285000078 1.3401156831716676 -1.0788039429669842 -6.4261472704694018 1.2373347822396874 -1.0924707237577234 -6.4934772124387958 1.1345538813077076 -1.1061375045484625 -6.5608071544081907 1.0317729803757276 -1.1198042853392016 -6.6281370963775847 0.92899207944374751 -0.8722835996890802 -6.3759208237331979 1.342945649098874 -0.88595038047981967 -6.4432507657025928 1.240164748166894 -0.8996171612705588 -6.5105807076719868 1.137383847234914 -0.91328394206129782 -6.5779106496413808 1.034602946302934 -0.67943003720191519 -6.3930243189663889 1.3457756150260807 -0.69309681799265455 -6.4603542609357838 1.2429947140941005 -0.70676359878339368 -6.5276842029051769 1.1402138131621207 -0.48657647471475068 -6.410127814199579 1.3486055809532871 -0.50024325550548987 -6.4774577561689739 1.2458246800213071 -0.29372291222758606 -6.42723130943277 1.3514355468804937 -0.097974320109079152 -6.4446140577807212 1.3542743164659685 -0.086238325196133239 -6.5143943388285237 1.2515706642619271 -0.074502330283186882 -6.5841746198763262 1.1488670120578857 -0.062766335370240914 -6.6539549009241288 1.046163359853844 -0.051030340457294515 -6.7237351819719313 0.94345970764980269 -0.039294345544348609 -6.7935154630197339 0.84075605544576137 -0.30309264333986968 -6.494975742671615 1.2486677130883184 -0.29135664842692349 -6.5647560237194176 1.1459640608842769 -0.27962065351397736 -6.6345363047672192 1.0432604086802353 -0.26788465860103106 -6.7043165858150218 0.94055675647619386 -0.25614866368808514 -6.7740968668628243 0.83785310427215254 -0.50821096657066067 -6.545337427562508 1.143061109710668 -0.49647497165771426 -6.6151177086103097 1.0403574575066266 -0.48473897674476807 -6.6848979896581122 0.93765380530258502 -0.4730029818318221 -6.7546782707059148 0.8349501530985437 -0.71332928980145072 -6.595699112453401 1.0374545063330178 -0.70159329488850464 -6.6654793935012036 0.93475085412897629 -0.68985729997555856 -6.7352596745490052 0.83204720192493486 -0.91844761303224121 -6.646060797344294 0.93184790295536746 -0.90671161811929513 -6.7158410783920957 0.82914425075132614 -1.1235659362630317 -6.696422482235187 0.8262412995777173 -2.3894480216130196 -6.0123747728877754 1.3183031348447847 -2.4263507665909216 -6.0726397147076732 1.215466672161496 -2.4632535115688245 -6.1329046565275709 1.112630209478207 -2.500156256546727 -6.1931695983474686 1.0097937467949183 -2.5370590015246295 -6.2534345401673663 0.90695728411162946 -2.573961746502532 -6.3136994819872641 0.8041208214283404 -2.2037947212807616 -6.06649775292159 1.3214609818925134 -2.2406974662586636 -6.1267626947414877 1.2186245192092247 -2.2776002112365665 -6.1870276365613854 1.1157880565259357 -2.314502956214469 -6.2472925783812832 1.012951593842647 -2.3514057011923715 -6.3075575202011818 0.91011513115935816 -2.0181414209485036 -6.1206207329554054 1.3246188289402421 -2.0550441659264056 -6.1808856747753023 1.2217823662569534 -2.0919469109043085 -6.2411506165952009 1.1189459035736644 -2.128849655882211 -6.3014155584150986 1.0161094408903757 -1.8324881206162453 -6.17474371298922 1.3277766759879708 -1.8693908655941476 -6.2350086548091177 1.2249402133046821 -1.9062936105720503 -6.2952735966290154 1.1221037506213933 -1.6468348202839866 -6.2288666930230354 1.3309345230356995 -1.6837375652618891 -6.2891316348429323 1.228098060352411 -1.4611815199517284 -6.28298967305685 1.3340923700834284 -2.3697766545401402 -6.3734134940400535 0.80732259749939406 -2.1473635963236308 -6.3672283931212386 0.91331656828404884 -2.1610525364321509 -6.4344969279502386 0.81053513318772596 -1.9249505381071212 -6.3610432922024227 1.0193105390687034 -1.9386394782156418 -6.4283118270314237 0.91652910397238074 -1.9523284183241618 -6.4955803618604238 0.81374766887605787 -1.7025374798906112 -6.3548581912836077 1.1253045098533581 -1.7162264199991317 -6.4221267261126078 1.0225230747570353 -1.729915360107652 -6.4893952609416088 0.91974163966071265 -1.7436043002161723 -6.5566637957706089 0.81696020456438978 -1.4801244216741019 -6.3486730903647928 1.2312984806380125 -1.4938133617826224 -6.4159416251937929 1.12851704554169 -1.5075023018911426 -6.4832101600227929 1.0257356104453672 -1.5211912419996629 -6.550478694851793 0.92295417534904456 -1.534880182108183 -6.617747229680794 0.82017274025272169 -3.5386522030909253 -5.3587115432214478 1.3980571455936504 -3.5729065134999414 -5.4176500120060203 1.2956053610314435 -3.607160823908957 -5.4765884807905927 1.1931535764692371 -3.641415134317973 -5.535526949575166 1.0907017919070305 -3.6756694447269895 -5.5944654183597384 0.98825000734482404 -3.7099237551360056 -5.6534038871443109 0.88579822278261755 -3.3931116761284028 -5.434345918586831 1.4009201180599975 -3.4273659865374189 -5.4932843873714035 1.2984683334977907 -3.4616202969464345 -5.5522228561559759 1.1960165489355845 -3.4958746073554505 -5.6111613249405492 1.0935647643733779 -3.5301289177644666 -5.6700997937251216 0.9911129798111713 -3.5643832281734826 -5.7290382625096941 0.88866119524896481 -3.2475711491658803 -5.5099802939522142 1.4037830905263449 -3.2818254595748964 -5.5689187627367867 1.301331305964138 -3.316079769983912 -5.6278572315213591 1.1988795214019317 -3.350334080392928 -5.6867957003059315 1.0964277368397251 -3.3845883908019441 -5.7457341690905039 0.99397595227751856 -3.1020306222033573 -5.5856146693175974 1.406646062992692 -3.1362849326123734 -5.6445531381021699 1.3041942784304852 -3.1705392430213895 -5.7034916068867423 1.201742493868279 -3.2047935534304055 -5.7624300756713147 1.0992907093060724 -2.9564900952408348 -5.6612490446829806 1.4095090354590394 -2.9907444056498509 -5.7201875134675531 1.3070572508968326 -3.0249987160588669 -5.7791259822521246 1.2046054663346262 -2.8109495682783119 -5.7368834200483629 1.4123720079253865 -2.8452038786873279 -5.7958218888329363 1.3099202233631797 -2.6996633517248054 -5.8714562641983186 1.3127831958295271 -3.744220401947373 -5.7123535998642936 0.78330151302963791 -3.5989387227653231 -5.7880567214519081 0.78588980967865085 -3.4190710221572544 -5.804733276612196 0.89128188538851971 -3.4536570435832732 -5.8637598430395226 0.7884781063276638 -3.2392033215491862 -5.8214098317724847 0.99667396109838824 -3.2737893429752045 -5.8804363981998105 0.89387018203753266 -3.3083753644012233 -5.9394629646271371 0.79106640297667674 -3.059335620941118 -5.8380863869327735 1.1020660368082569 -3.0939216423671363 -5.8971129533600992 0.99926225774740118 -3.1285076637931546 -5.956139519787425 0.8964584786865456 -3.1630936852191733 -6.0151660862147516 0.79365469962568969 -2.8794679203330493 -5.8547629420930623 1.2074581125181254 -2.9140539417590676 -5.913789508520388 1.1046543334572698 -2.9486399631850859 -5.9728160749477137 1.0018505543964142 -2.9832259846111047 -6.0318426413750394 0.89904677533555855 -3.017812006037123 -6.0908692078023652 0.79624299627470263 -2.734186241150999 -5.9304660636806767 1.2100464091671383 -2.7687722625770177 -5.9894926301080025 1.1072426301062828 -2.803358284003036 -6.0485191965353282 1.0044388510454272 -2.8379443054290547 -6.1075457629626539 0.90163507198457149 -2.872530326855073 -6.1665723293899797 0.79883129292371569 -2.5543185405429312 -5.9471426188409664 1.3154384848770069 -2.588904561968949 -6.0061691852682912 1.2126347058161513 -2.6234905833949678 -6.065195751695617 1.1098309267552957 -2.6580766048209861 -6.1242223181229418 1.0070271476944401 -2.6926626262470048 -6.1832488845502676 0.90422336863358443 -2.7272486476730231 -6.2422754509775933 0.80141958957272863 -4.4715383538100593 -4.620181484574915 1.3768653447815546 -4.5195876380301243 -4.6688367232362902 1.2744636499769835 -4.5676369222501902 -4.7174919618976654 1.1720619551724125 -4.6156862064702553 -4.7661472005590397 1.0696602603678416 -4.6637354906903203 -4.814802439220415 0.96725856556327061 -4.7117847749103854 -4.8634576778817902 0.86485687075869966 -4.3559953145633852 -4.7127305443825804 1.3795096156284079 -4.4040445987834502 -4.7613857830439557 1.2771079208238367 -4.4520938830035162 -4.8100410217053309 1.1747062260192658 -4.5001431672235812 -4.8586962603667061 1.0723045312146948 -4.5481924514436463 -4.9073514990280813 0.96990283641012398 -4.2404522753167111 -4.8052796041902468 1.3821538864752612 -4.2885015595367761 -4.853934842851622 1.27975219167069 -4.3365508437568421 -4.9025900815129972 1.177350496866119 -4.3846001279769071 -4.9512453201743716 1.0749488020615481 -4.124909236070037 -4.8978286639979132 1.3847981573221144 -4.1729585202901021 -4.9464839026592884 1.2823964625175432 -4.2210078045101671 -4.9951391413206636 1.1799947677129725 -4.2690570887302322 -5.0437943799820379 1.0775930729084013 -4.0093661968233629 -4.9903777238055786 1.3874424281689679 -4.057415481043428 -5.0390329624669539 1.2850407333643965 -4.105464765263493 -5.0876882011283291 1.1826390385598258 -3.8938231575766888 -5.0829267836132441 1.3900866990158212 -3.9418724417967539 -5.1315820222746193 1.28768500421125 -3.7782801183300148 -5.1754758434209105 1.3927309698626746 -3.8263294025500794 -5.2241310820822857 1.2903292750581032 -3.6627370790833407 -5.268024903228576 1.3953752407095279 -4.5923950171101673 -4.9591778520059782 0.86748464124515112 -4.4325459708900166 -4.9999858326099638 0.97254666354922448 -4.4673358351380061 -5.0595717218809284 0.87008809294123457 -4.5021256993859957 -5.1191576111518931 0.76762952233324466 -4.3074867889178554 -5.100379702484914 0.97515011524530792 -4.342276653165845 -5.1599655917558787 0.87269154463731813 -4.3770665174138346 -5.2195514810268433 0.77023297402932811 -4.1476377426977038 -5.1411876830888987 1.0802121375493812 -4.1824276069456943 -5.2007735723598643 0.97775356694139148 -4.2172174711936838 -5.2603594616308289 0.87529499633340158 -4.2520073354416734 -5.3199453509017944 0.77283642572541156 -3.9877886964775531 -5.1819956636928843 1.1852741598534546 -4.0225785607255427 -5.241581552963849 1.0828155892454647 -4.0573684249735322 -5.3011674422348145 0.98035701863747493 -4.0921582892215218 -5.3607533315057792 0.87789844802948513 -4.1269481534695114 -5.4203392207767447 0.77543987742149512 -3.8627295145053919 -5.2823895335678346 1.1878776115495382 -3.8975193787533811 -5.3419754228387992 1.0854190409415483 -3.9323092430013706 -5.4015613121097648 0.98296047033355849 -3.9670991072493602 -5.4611472013807303 0.88050189972556858 -4.0018889714973493 -5.5207330906516958 0.77804332911757856 -3.7028804682852412 -5.3231975141718193 1.2929396338536112 -3.7376703325332303 -5.3827834034427848 1.1904810632456215 -3.7724601967812199 -5.4423692927137504 1.0880224926376316 -3.807250061029209 -5.5019551819847159 0.98556392202964194 -3.8420399252771986 -5.5615410712556805 0.88310535142165214 -3.8768297895251882 -5.6211269605266461 0.78064678081366212 -5.6509710958766322 -3.7769517409668891 0.84123999459761323 -5.2934391003204118 -3.6743082127936124 1.3547922855830981 -5.3471503025228193 -3.7160079941947366 1.2525707054702591 -5.4008615047252269 -3.7577077755958603 1.1503491253574205 -5.4545727069276344 -3.7994075569969845 1.048127545244582 -5.508283909130042 -3.8411073383981083 0.94590596513174341 -5.5619951113324486 -3.8828071197992324 0.84368438501890475 -5.2044631157762291 -3.7801635916259557 1.3572366760043897 -5.2581743179786367 -3.8218633730270799 1.2550150958915507 -5.3118855201810433 -3.8635631544282036 1.1527935157787121 -5.3655967223834518 -3.9052629358293278 1.0505719356658736 -5.4193079245858593 -3.9469627172304516 0.94835035555303493 -5.1154871312320465 -3.8860189704582995 1.3596810664256813 -5.169198333434454 -3.9277187518594232 1.2574594863128423 -5.2229095356368607 -3.9694185332605474 1.1552379062000038 -5.2766207378392682 -4.0111183146616716 1.0530163260871652 -5.0265111466878629 -3.9918743492906428 1.3621254568469729 -5.0802223488902705 -4.0335741306917665 1.259903876734134 -5.1339335510926771 -4.0752739120928911 1.1576822966212954 -5.1876447532950856 -4.1169736934940149 1.0554607165084569 -4.9375351621436803 -4.0977297281229861 1.3645698472682646 -4.9912463643460878 -4.1394295095241098 1.2623482671554256 -5.0449575665484945 -4.1811292909252344 1.160126687042587 -4.8485591775994967 -4.2035851069553294 1.3670142376895562 -4.9022703798019043 -4.2452848883564531 1.2647926575767172 -4.7595831930553141 -4.3094404857876727 1.3694586281108476 -4.8132943952577216 -4.3511402671887973 1.2672370479980088 -4.6706072085111314 -4.415295864620016 1.3719030185321393 -5.4696934064085312 -3.9928276944060941 0.84602116673947936 -5.328924374359497 -4.0545809582286862 0.95074920206295155 -5.3770403130293118 -4.1032883546311441 0.8483465787564094 -5.2362712809802776 -4.1650416184537367 0.95307461407988159 -5.2843872196500925 -4.2137490148561945 0.85067199077333944 -5.0955022489312434 -4.2267948822763284 1.0578026494033537 -5.1436181876010583 -4.2755022786787871 0.95540002609681163 -5.1917341262708732 -4.3242096750812449 0.85299740279026948 -4.9547332168822091 -4.2885481460989201 1.1625306847268257 -5.002849155552024 -4.3372555425013788 1.0601280614202837 -5.0509650942218389 -4.3859629389038375 0.95772543811374167 -5.0990810328916538 -4.4346703353062953 0.85532281480719952 -4.8620801235029898 -4.3990088063239705 1.1648560967437558 -4.9101960621728047 -4.4477162027264292 1.0624534734372137 -4.9583120008426196 -4.496423599128887 0.96005085013067171 -5.0064279395124345 -4.5451309955313448 0.85764822682412956 -4.7213110914539556 -4.4607620701465631 1.2695841320672279 -4.7694270301237705 -4.5094694665490209 1.1671815087606858 -4.8175429687935853 -4.5581768629514796 1.0647788854541438 -4.8656589074634002 -4.6068842593539365 0.96237626214760175 -4.9137748461332151 -4.6555916557563943 0.85997363884105971 -4.5805420594049204 -4.5225153339691548 1.3743121673907004 -4.6286579980747362 -4.5712227303716135 1.2719095440841581 -4.6767739367445511 -4.6199301267740713 1.1695069207776161 -4.724889875414366 -4.6686375231765291 1.067104297471074 -4.7730058140841809 -4.7173449195789869 0.96470167416453179 -4.8211217527539958 -4.7660523159814447 0.86229905085798975 -5.9213174939411228 -2.5773913608324603 1.3333331756567448 -5.9847101078322904 -2.6029983854979881 1.2311041063498316 -6.0481027217234589 -2.628605410163515 1.1288750370429184 -6.1114953356146273 -2.6542124348290428 1.0266459677360051 -6.1748879495057958 -2.6798194594945701 0.92441689842909214 -5.8541626206584869 -2.6996750376287624 1.3357110356022779 -5.9175552345496545 -2.7252820622942902 1.2334819662953647 -5.9809478484408229 -2.750889086959817 1.1312528969884514 -6.0443404623319914 -2.7764961116253448 1.0290238276815382 -6.1077330762231599 -2.8021031362908726 0.92679475837462522 -5.787007747375851 -2.8219587144250644 1.338088895547811 -5.8504003612670186 -2.8475657390905922 1.2358598262408977 -5.913792975158187 -2.8731727637561191 1.1336307569339845 -5.9771855890493555 -2.8987797884216469 1.0314016876270713 -5.7198528740932151 -2.9442423912213664 1.340466755493344 -5.7832454879843826 -2.9698494158868942 1.2382376861864308 -5.8466381018755511 -2.9954564405524211 1.1360086168795176 -5.6526980008105792 -3.0665260680176685 1.3428446154388771 -5.7160906147017467 -3.0921330926831962 1.2406155461319639 -5.7794832285929152 -3.1177401173487236 1.1383864768250507 -5.5855431275279432 -3.1888097448139705 1.3452224753844102 -5.6489357414191108 -3.2144167694794983 1.242993406077497 -5.5183882542453073 -3.3110934216102725 1.3476003353299433 -5.4512333809626714 -3.4333770984065741 1.3499781952754764 -6.2381589162590529 -2.7056539708038727 0.82218789940616888 -6.1647733307754304 -2.8395894121320868 0.82456935926635244 -6.037128488285175 -2.9308379637052449 0.92917461145961433 -6.0913877452918079 -2.9735248534603005 0.82695081912653601 -5.9094836457949205 -3.0220865152784029 1.0337798636528761 -5.9637429028015525 -3.0647734050334585 0.9315560713197979 -6.0180021598081854 -3.1074602947885142 0.82933227898671957 -5.836098060311298 -3.156021956606617 1.0361613235130596 -5.89035731731793 -3.1987088463616722 0.93393753117998146 -5.9446165743245629 -3.2413957361167283 0.83171373884690303 -5.7084532178210434 -3.247270508179775 1.1407665757063217 -5.7627124748276755 -3.2899573979348307 1.0385427833732432 -5.8169717318343084 -3.3326442876898859 0.93631899104016492 -5.8712309888409404 -3.3753311774449419 0.83409519870708659 -5.580808375330788 -3.3385190597529331 1.2453718278995836 -5.6350676323374209 -3.3812059495079887 1.1431480355665051 -5.6893268893440538 -3.4238928392630443 1.0409242432334267 -5.7435861463506859 -3.4665797290180995 0.93870045090034848 -5.7978454033573188 -3.5092666187731556 0.83647665856727005 -5.5074227898471664 -3.4724545010811467 1.247753287759767 -5.5616820468537993 -3.5151413908362024 1.1455294954266888 -5.6159413038604313 -3.557828280591258 1.0433057030936104 -5.6702005608670643 -3.6005151703463136 0.94108191076053194 -5.7244598178736963 -3.6432020601013693 0.83885811842745361 -5.3797779473569109 -3.5637030526543052 1.3523585399530291 -5.4340372043635448 -3.6063899424093608 1.2501347476199507 -5.4882964613701768 -3.6490768321644165 1.1479109552868723 -5.5425557183768097 -3.6917637219194721 1.0456871629537938 -5.5968149753834417 -3.7344506116745277 0.9434633706207155 -6.3217222706570935 -1.3814206264663662 1.3131717205050841 -6.3885219729831721 -1.3951672546675544 1.2110397951538867 -6.4553216753092491 -1.4089138828687426 1.1089078698026895 -6.5221213776353268 -1.4226605110699311 1.0067759444514923 -6.5889210799614046 -1.4364071392711195 0.90464401910029524 -6.279886827511433 -1.51421215310065 1.3154074563851939 -6.3466865298375117 -1.5279587813018383 1.2132755310339964 -6.4134862321635886 -1.5417054095030265 1.1111436056827992 -6.4802859344896664 -1.5554520377042149 1.009011680331602 -6.5470856368157442 -1.5691986659054034 0.90687975498040496 -6.2380513843657726 -1.6470036797349339 1.3176431922653036 -6.3048510866918512 -1.6607503079361221 1.2155112669141062 -6.3716507890179281 -1.6744969361373103 1.113379341562909 -6.4384504913440059 -1.6882435643384988 1.0112474162117118 -6.1962159412201121 -1.7797952063692177 1.3198789281454133 -6.2630156435461908 -1.7935418345704059 1.2177470027942159 -6.3298153458722677 -1.8072884627715942 1.1156150774430187 -6.1543804980744516 -1.9125867330035013 1.322114664025523 -6.2211802004005303 -1.9263333612046896 1.2199827386743256 -6.2879799027266081 -1.940079989405878 1.1178508133231284 -6.1125450549287912 -2.045378259637785 1.3243503999056327 -6.1793447572548699 -2.0591248878389732 1.2222184745544353 -6.0707096117831307 -2.1781697862720688 1.3265861357857425 -6.6547938642642812 -1.4532676844953407 0.80248665293489474 -6.6105767104183659 -1.5940604035844259 0.80465701878454376 -6.5030664344925917 -1.7093263805377439 0.90905555394041093 -6.5663595565724506 -1.7348531226735111 0.80682738463419279 -6.3955561585668184 -1.8245923574910621 1.013454089096278 -6.4588492806466773 -1.8501190996268289 0.91122591979005996 -6.5221424027265362 -1.8756458417625963 0.80899775048384182 -6.351339004720904 -1.9653850765801473 1.015624454945927 -6.4146321268007629 -1.9909118187159141 0.91339628563970898 -6.4779252488806218 -2.0164385608516815 0.81116811633349084 -6.2438287287951297 -2.0806510535334648 1.1200229901017942 -6.3071218508749887 -2.1061777956692325 1.017794820795576 -6.3704149729548476 -2.1317045378049992 0.91556665148935801 -6.4337080950347065 -2.1572312799407665 0.81333848218313987 -6.1363184528693564 -2.195917030486783 1.2244215252576613 -6.1996115749492153 -2.2214437726225502 1.1221933559514432 -6.2629046970290743 -2.2469705147583179 1.0199651866452251 -6.3261978191089323 -2.2724972568940842 0.91773701733900692 -6.3894909411887912 -2.2980239990298519 0.81550884803278878 -6.0288081769435822 -2.3111830074401007 1.3288200604135287 -6.0921012990234411 -2.3367097495758684 1.2265918911073104 -6.1553944211033 -2.3622364917116352 1.1243637218010922 -6.218687543183159 -2.3877632338474029 1.0221355524948741 -6.2819806652630179 -2.4132899759831692 0.91990738318865595 -6.3452737873428768 -2.4388167181189369 0.81767921388243781 -5.9845910230976678 -2.4519757265291862 1.3309904262631775 -6.0478841451775267 -2.4775024686649534 1.2287622569569592 -6.1111772672573856 -2.5030292108007202 1.126534087650741 -6.1744703893372446 -2.5285559529364878 1.0243059183445229 -6.2377635114171035 -2.5540826950722546 0.92207774903830486 -6.3010566334969624 -2.5796094372080218 0.81984957973208672 -6.4158280245470314 -0.10484828222523235 1.3963424184121445 -6.4841581725065796 -0.10362487961355693 1.294259458184835 -6.5524883204661286 -0.10240147700188185 1.1921764979575253 -6.6208184684256777 -0.10117807439020654 1.0900935377302157 -6.6891486163852258 -0.09995467177853129 0.98801057750290622 -6.757478764344774 -0.098731269166855956 0.88592761727559677 -6.4005315690390416 -0.24595683599368412 1.3984353856850726 -6.4688617169985898 -0.2447334333820087 1.2963524254577632 -6.5371918649581389 -0.24351003077033362 1.1942694652304535 -6.6055220129176879 -0.24228662815865826 1.0921865050031438 -6.6738521608772361 -0.24106322554698301 0.9901035447758344 -6.3852351135310519 -0.38706538976213567 1.4005283529580008 -6.4535652614906001 -0.38584198715046036 1.2984453927306914 -6.5218954094501491 -0.38461858453878522 1.1963624325033817 -6.5902255574096982 -0.38339518192710986 1.094279472276072 -6.6585557053692463 -0.3821717793154345 0.99219651204876258 -6.3699386580230621 -0.52817394353058722 1.402621320230929 -6.4382688059826103 -0.52695054091891191 1.3005383600036196 -6.5065989539421594 -0.52572713830723683 1.1984553997763099 -6.5749291019017084 -0.52450373569556152 1.0963724395490002 -6.3546422025150724 -0.66928249729903888 1.4047142875038572 -6.4229723504746215 -0.66805909468736346 1.3026313272765477 -6.4913024984341696 -0.66683569207568849 1.2005483670492381 -6.3393457470070826 -0.81039105106749088 1.4068072547767854 -6.4076758949666317 -0.80916764845581546 1.3047242945494759 -6.4760060429261808 -0.80794424584414037 1.202641334322166 -6.3240492914990938 -0.95149960483594254 1.4089002220497135 -6.3923794394586428 -0.95027620222426712 1.3068172618224041 -6.308752835991104 -1.0926081586043941 1.4109931893226417 -6.2934563804831152 -1.2337167123728456 1.4130861565955697 -6.8253512055934369 -0.10226132927984888 0.78382898982536309 -6.742157951026468 -0.24009278829640279 0.88801975078481754 -6.8090407404273661 -0.25390076886997059 0.78588724772003071 -6.7258474858603972 -0.39173222788652462 0.89007800867948517 -6.7927302752612952 -0.40554020846009242 0.78794550561469834 -6.6426542312934274 -0.52956368690307831 0.99426876963893962 -6.7095370206943263 -0.54337166747664634 0.89213626657415279 -6.7764198100952244 -0.55717964805021403 0.79000376350936596 -6.5594609767264576 -0.66739514591963223 1.0984595305983942 -6.6263437661273565 -0.68120312649320003 0.99632702753360725 -6.6932265555282555 -0.69501110706676805 0.89419452446882042 -6.7601093449291536 -0.70881908764033585 0.79206202140403359 -6.5431505115603867 -0.81903458550975394 1.1005177884930619 -6.6100333009612857 -0.83284256608332186 0.99838528542827487 -6.6769160903621847 -0.84665054665688977 0.89625278236348804 -6.7437988797630828 -0.86045852723045757 0.79412027929870121 -6.4599572569934178 -0.95686604452630775 1.2047085494525163 -6.5268400463943159 -0.97067402509987566 1.1025760463877297 -6.5937228357952149 -0.98448200567344357 1.0004435433229426 -6.6606056251961139 -0.99828998624701137 0.89831104025815567 -6.7274884145970129 -1.0120979668205794 0.79617853719336884 -6.376764002426448 -1.0946975035428617 1.3088993104119711 -6.443646791827347 -1.1085054841164295 1.206766807347184 -6.5105295812282451 -1.1223134646899973 1.1046343042823972 -6.5774123706291441 -1.1361214452635653 1.0025018012176101 -6.6442951600300431 -1.1499294258371331 0.90036929815282329 -6.711177949430942 -1.1637374064107011 0.79823679508803647 -6.3604535372603772 -1.2463369431329832 1.3109575683066386 -6.4273363266612762 -1.2601449237065512 1.2088250652418515 -6.4942191160621743 -1.273952904280119 1.1066925621770649 -6.5611019054630741 -1.287760884853687 1.0045600591122779 -6.6279846948639722 -1.3015688654272548 0.90242755604749092 -6.6948674842648721 -1.3153768460008226 0.80029505298270409 -6.3219755547632515 1.1722925587542987 1.3794582883653168 -6.3887139161710627 1.1867120126128361 1.2774518041918235 -6.4554522775788739 1.2011314664713737 1.1754453200183295 -6.5221906389866842 1.2155509203299113 1.0734388358448361 -6.5889290003944945 1.2299703741884489 0.97143235167134268 -6.6556673618023039 1.2443898280469865 0.86942586749784923 -6.3346874239562965 1.030620463335713 1.3813164954836235 -6.4014257853641077 1.0450399171942504 1.2793100113101301 -6.468164146771918 1.059459371052788 1.1773035271366361 -6.5349025081797283 1.0738788249113256 1.0752970429631428 -6.6016408695875386 1.088298278769863 0.97329055878964932 -6.3473992931493415 0.88894836791712684 1.3831747026019301 -6.4141376545571518 0.90336782177566444 1.2811682184284368 -6.480876015964963 0.91778727563420193 1.1791617342549428 -6.5476143773727724 0.93220672949273942 1.0771552500814494 -6.6143527387805836 0.94662618335127691 0.97514876590795596 -6.3601111623423856 0.74727627249854101 1.3850329097202367 -6.4268495237501959 0.76169572635707872 1.2830264255467434 -6.4935878851580071 0.7761151802156161 1.1810199413732494 -6.5603262465658174 0.79053463407415359 1.0790134571997561 -6.3728230315354297 0.60560417707995517 1.3868911168385434 -6.4395613929432409 0.620023630938493 1.28488463266505 -6.5062997543510521 0.63444308479703038 1.182878148491556 -6.3855349007284747 0.46393208166136934 1.38874932395685 -6.452273262136285 0.47835153551990711 1.2867428397833567 -6.5190116235440962 0.4927709893784446 1.1847363556098629 -6.3982467699215197 0.32225998624278307 1.3906075310751567 -6.4649851313293301 0.33667944010132089 1.2886010469016631 -6.4109586391145639 0.18058789082419754 1.3924657381934633 -6.7229053866563673 1.2539231753224067 0.76739180993172784 -6.6684829895598785 1.1017030988603969 0.8712783488107968 -6.7365621151681934 1.1030114939940636 0.7691978759995528 -6.6821397180717046 0.95079141753205376 0.87308441487862176 -6.7502188436800195 0.95209981266572052 0.77100394206737766 -6.6277173209752167 0.79857134107004379 0.97697095375769061 -6.6957964465835307 0.79987973620371067 0.87489048094644661 -6.7638755721918455 0.80118813133737743 0.77281000813520262 -6.5732949238787279 0.64635126460803383 1.0808574926367596 -6.6413740494870428 0.6476596597417007 0.97877701982551557 -6.7094531750953568 0.64896805487536746 0.87669654701427158 -6.7775323007036716 0.65027645000903433 0.77461607420302747 -6.586951652390554 0.49543958327969079 1.0826635587045845 -6.6550307779988689 0.4967479784133576 0.98058308589334042 -6.7231099036071829 0.49805637354702442 0.87850261308209643 -6.7911890292154977 0.49936476868069124 0.77642214027085243 -6.5325292552940661 0.34321950681768093 1.1865500975836534 -6.6006083809023801 0.34452790195134775 1.0844696247724095 -6.668687506510695 0.34583629708501451 0.98238915196116539 -6.7367666321190089 0.34714469221868133 0.88030867914992139 -6.8048457577273238 0.34845308735234815 0.77822820633867729 -6.4781068581975765 0.19099943035567102 1.2904366364627227 -6.5461859838058922 0.1923078254893377 1.1883561636514783 -6.6142651094142062 0.19361622062300454 1.0862756908402342 -6.6823442350225211 0.19492461575667128 0.98419521802899024 -6.750423360630835 0.19623301089033807 0.88211474521774624 -6.8185024862391499 0.19754140602400497 0.78003427240650225 -6.4236844611010877 0.03877935389366112 1.3943231753417915 -6.4917635867094026 0.040087749027328007 1.2922427025305474 -6.5598427123177183 0.041396144160994679 1.1901622297193033 -6.6279218379260332 0.042704539294661531 1.0880817569080592 -6.6960009635343472 0.044012934428328217 0.9860012840968152 -6.764080089142662 0.045321329561995048 0.88392081128557121 -6.832159214750976 0.046629724695661914 0.7818403384743271 -5.9722584006617607 2.4140622830836205 1.3652890836900138 -6.0348266078933941 2.4412946295798701 1.2633595625671106 -6.0973948151250275 2.4685269760761197 1.1614300414442069 -6.1599630223566599 2.4957593225723689 1.0595005203213035 -6.2225312295882924 2.5229916690686185 0.95757099919840005 -6.2850994368199258 2.5502240155648681 0.85564147807549662 -6.012788411894384 2.276884891009459 1.3668466068468399 -6.0753566191260173 2.3041172375057082 1.2649170857239367 -6.1379248263576507 2.3313495840019582 1.162987564601033 -6.2004930335892832 2.3585819304982074 1.0610580434781296 -6.2630612408209156 2.385814276994457 0.95912852235522628 -6.0533184231270072 2.1397074989352971 1.3684041300036662 -6.1158866303586406 2.1669398454315463 1.2664746088807628 -6.1784548375902739 2.1941721919277963 1.1645450877578591 -6.2410230448219064 2.2214045384240455 1.0626155666349557 -6.3035912520535389 2.2486368849202951 0.96068604551205239 -6.0938484343596304 2.0025301068611352 1.3699616531604923 -6.1564166415912638 2.0297624533573848 1.2680321320375889 -6.2189848488228971 2.0569947998536344 1.1661026109146853 -6.2815530560545296 2.084227146349884 1.0641730897917818 -6.1343784455922536 1.8653527147869737 1.3715191763173187 -6.196946652823887 1.8925850612832233 1.269589655194415 -6.2595148600555204 1.9198174077794727 1.1676601340715116 -6.1749084568248769 1.7281753227128123 1.3730766994741448 -6.2374766640565102 1.7554076692090617 1.2711471783512414 -6.3000448712881436 1.7826400157053113 1.1692176572283377 -6.2154384680575001 1.5909979306386504 1.3746342226309711 -6.2780066752891335 1.6182302771348998 1.2727047015080675 -6.2559684792901233 1.4538205385644887 1.3761917457877972 -6.3259157763696825 2.4121151109346473 0.85719359445916454 -6.3692448134926654 2.2658316416561473 0.85869826326262122 -6.3460784653729965 2.1050921229091193 0.96220661057889845 -6.4125738506156482 2.1195481723776477 0.8602029320660779 -6.3229121172533267 1.9443526041620911 1.0657149578951757 -6.3894075024959793 1.9588086536306197 0.96371127938235512 -6.4559028877386311 1.9732647030991481 0.86170760086953457 -6.3662411543763096 1.7980691348835913 1.0672196266986322 -6.4327365396189622 1.8125251843521202 0.96521594818581169 -6.4992319248616139 1.8269812338206486 0.86321226967299125 -6.3430748062566416 1.6373296161365629 1.1707279740149095 -6.4095701914992924 1.6517856656050913 1.0687242955020888 -6.4760655767419451 1.6662417150736202 0.96672061698926837 -6.5425609619845968 1.6806977645421486 0.86471693847644793 -6.3199084581369727 1.4765900973895347 1.2742363213311867 -6.3864038433796244 1.4910461468580634 1.172232642818366 -6.4528992286222753 1.5055021963265918 1.0702289643055456 -6.5193946138649279 1.5199582457951206 0.96822528579272493 -6.5858899991075797 1.534414295263649 0.86622160727990449 -6.2967421100173038 1.3158505786425063 1.3777446686474639 -6.3632374952599555 1.330306628111035 1.2757409901346433 -6.4297328805026082 1.3447626775795636 1.1737373116218226 -6.496228265745259 1.3592187270480922 1.0717336331090022 -6.5627236509879108 1.3736747765166211 0.96972995459618161 -6.6292190362305616 1.3881308259851497 0.86772627608336106 -6.6957144214732125 1.4025868754536783 0.76572259757054062 -5.3773830229342696 3.5646588189581676 1.3548573169044227 -5.4332873788580329 3.6037351285505443 1.2530112428489655 -5.489191734781798 3.642811438142922 1.1511651687935081 -5.5450960907055613 3.6818877477352996 1.0493190947380509 -5.6010004466293246 3.7209640573276768 0.94747302068259387 -5.6569048025530879 3.7600403669200539 0.84562694662713667 -5.4442686401431395 3.4379085580814457 1.3560029646535514 -5.5001729960669028 3.4769848676738224 1.2541568905980944 -5.5560773519906679 3.5160611772662 1.152310816542637 -5.6119817079144312 3.5551374868585777 1.0504647424871798 -5.6678860638381945 3.5942137964509548 0.94861866843172271 -5.5111542573520094 3.3111582972047238 1.3571486124026804 -5.5670586132757727 3.3502346067971005 1.2553025383472232 -5.6229629691995369 3.3893109163894781 1.1534564642917657 -5.6788673251233002 3.4283872259818557 1.0516103902363088 -5.7347716810470635 3.4674635355742334 0.94976431618085155 -5.5780398745608792 3.1844080363280014 1.3582942601518091 -5.6339442304846425 3.2234843459203786 1.2564481860963521 -5.6898485864084067 3.2625606555127562 1.1546021120408947 -5.74575294233217 3.3016369651051334 1.0527560379854375 -5.6449254917697491 3.0576577754512795 1.359439907900938 -5.7008298476935124 3.0967340850436567 1.2575938338454808 -5.7567342036172757 3.1358103946360343 1.1557477597900234 -5.711811108978619 2.9309075145745576 1.3605855556500668 -5.7677154649023823 2.9699838241669347 1.2587394815946098 -5.8236198208261456 3.0090601337593124 1.1568934075391524 -5.7786967261874889 2.8041572536978356 1.3617312033991957 -5.8346010821112522 2.8432335632902128 1.2598851293437385 -5.8455823433963587 2.6774069928211133 1.3628768511483245 -5.7238560586509957 3.6331684537240627 0.84677177955323502 -5.7953474790751187 3.4978819934776459 0.84786025213396776 -5.8045352799362293 3.3353793461171555 0.95087423746067168 -5.8668388994992418 3.3625955332312292 0.84894872471470051 -5.8137230807973399 3.172876698756665 1.0538882227873756 -5.8760267003603524 3.2000928858707387 0.95196271004140443 -5.9383303199233648 3.2273090729848124 0.85003719729543326 -5.8852145012214629 3.0375902385102482 1.0549766953681083 -5.9475181207844754 3.0648064256243219 0.95305118262213728 -6.0098217403474887 3.0920226127383956 0.851125669876166 -5.8944023020825735 2.8750875911497578 1.1579906806948124 -5.956705921645586 2.9023037782638315 1.0560651679488411 -6.0190095412085984 2.9295199653779052 0.95413965520287003 -6.0813131607716118 2.9567361524919789 0.85221414245689886 -5.9035901029436841 2.7125849437892673 1.2610046660215164 -5.9658937225066966 2.739801130903341 1.1590791532755451 -6.028197342069709 2.7670173180174147 1.0571536405295738 -6.0905009616327224 2.7942335051314884 0.95522812778360289 -6.1528045811957357 2.8214496922455621 0.85330261503763161 -5.9127779038047947 2.5500822964287764 1.3640186513482204 -5.9750815233678072 2.5772984835428501 1.2620931386022491 -6.0373851429308205 2.6045146706569242 1.1601676258562779 -6.099688762493833 2.6317308577709975 1.0582421131103068 -6.1619923820568454 2.6589470448850716 0.95631660036433563 -6.2242960016198587 2.6861632319991453 0.85439108761836446 -4.6497282214677158 4.4634669746750362 1.3502179126817664 -4.6970338881216369 4.5124762598645551 1.2484692110409243 -4.744339554775558 4.561485545054075 1.1467205094000821 -4.7916452214294782 4.610494830243594 1.04497180775924 -4.8389508880833993 4.6595041154331138 0.9432231061183981 -4.8862565547373205 4.7085134006226328 0.84147440447755606 -4.7405701148744575 4.3521733047144311 1.3507927185509576 -4.7878757815283786 4.4011825899039501 1.2490440169101156 -4.8351814481822997 4.4501918750934699 1.1472953152692733 -4.8824871148362199 4.4992011602829898 1.0455466136284313 -4.929792781490141 4.5482104454725087 0.94379791198758922 -4.8314120082811991 4.240879634753826 1.3513675244201486 -4.8787176749351202 4.2898889199433459 1.2496188227793068 -4.9260233415890413 4.3388982051328648 1.1478701211384645 -4.9733290082429615 4.3879074903223847 1.0461214194976225 -4.9222539016879407 4.1295859647932218 1.3519423302893399 -4.9695595683418619 4.1785952499827417 1.2501936286484978 -5.016865234995783 4.2276045351722606 1.1484449270076558 -5.0130957950946824 4.0182922948326167 1.3525171361585309 -5.0604014617486035 4.0673015800221366 1.250768434517689 -5.1077071284025246 4.1163108652116565 1.1490197328768468 -5.1039376885014249 3.9069986248720121 1.3530919420277221 -5.1512433551553451 3.956007910061532 1.2513432403868801 -5.1947795819081666 3.795704954911407 1.3536667478969131 -5.2856214753149091 3.6844112849508024 1.3542415537661043 -4.9822348150824469 4.5910200784144104 0.84199289490001406 -5.0235075156157487 4.4334492246859183 0.94434121985237052 -5.0791106061955489 4.4724434265473567 0.84250154473928129 -5.0647802161490505 4.2758783709574253 1.0466895448047269 -5.1203833067288507 4.3148725728188646 0.94484986969163776 -5.17598639730865 4.353866774680303 0.84301019457854853 -5.1616560072621525 4.1573017190903716 1.0471981946439941 -5.2172590978419517 4.1962959209518109 0.94535851953090499 -5.272862188421751 4.2352901228132493 0.84351884441781577 -5.2029287077954542 3.9997308653618795 1.1495465195963506 -5.2585317983752544 4.0387250672233188 1.0477068444832613 -5.3141348889550537 4.0777192690847572 0.94586716937017223 -5.3697379795348521 4.1167134709461957 0.84402749425708301 -5.2442014083287569 3.8421600116333869 1.2518948445487073 -5.2998044989085562 3.8811542134948258 1.1500551694356178 -5.3554075894883564 3.9201484153562651 1.0482154943225286 -5.4110106800681557 3.9591426172177036 0.94637581920943947 -5.4666137706479541 3.9981368190791424 0.84453614409635025 -5.341077199441858 3.7235833597663337 1.2524034943879745 -5.3966802900216582 3.7625775616277726 1.150563819274885 -5.4522833806014575 3.8015717634892119 1.0487241441617958 -5.5078864711812567 3.8405659653506503 0.94688446904870671 -5.563489561761056 3.8795601672120892 0.84504479393561749 -3.6579067194609882 5.3095411304763918 1.351721368833688 -3.6945319445248579 5.3669183364652113 1.2500793792682463 -3.7311571695887276 5.4242955424540318 1.1484373897028042 -3.7677823946525968 5.4816727484428514 1.0467954001373623 -3.8044076197164665 5.5390499544316709 0.94515341057192048 -3.8410328447803357 5.5964271604204905 0.84351142100647869 -3.7694927096226154 5.2181746264757072 1.351477534920356 -3.8061179346864851 5.2755518324645267 1.2498355453549144 -3.8427431597503547 5.3329290384533472 1.1481935557894722 -3.879368384814224 5.3903062444421668 1.0465515662240303 -3.9159936098780932 5.4476834504309863 0.94490957665858855 -3.8810786997842426 5.1268081224750226 1.3512337010070241 -3.9177039248481123 5.1841853284638422 1.2495917114415824 -3.9543291499119819 5.2415625344526626 1.1479497218761403 -3.9909543749758511 5.2989397404414822 1.0463077323106984 -3.9926646899458698 5.035441618474338 1.3509898670936922 -4.0292899150097394 5.0928188244631576 1.2493478775282505 -4.0659151400736091 5.150196030451978 1.1477058879628084 -4.1025403651374788 5.2075732364407976 1.0460638983973665 -4.1042506801074969 4.9440751144736543 1.3507460331803602 -4.1408759051713666 5.0014523204624739 1.2491040436149186 -4.1775011302352363 5.0588295264512944 1.1474620540494764 -4.2158366702691241 4.8527086104729698 1.3505021992670283 -4.2524618953329938 4.9100858164617893 1.2488602097015866 -4.3274226604307504 4.7613421064722861 1.3502583653536964 -4.4390086505923776 4.6699756024716015 1.3500145314403644 -3.9567927242905894 5.5016693466153637 0.84322793148140385 -4.0290393392006045 5.3551308997206872 0.94465187394218719 -4.076105054197674 5.4040251458329376 0.8429106905599919 -4.1483516691076892 5.2574866989382603 0.94433463302077525 -4.1954173841047595 5.3063809450505115 0.84259344963857985 -4.2205982840177052 5.1109482520435838 1.0457585754815586 -4.2676639990147738 5.1598424981558342 0.94401739209936331 -4.3147297140118441 5.2087367442680845 0.84227620871716791 -4.2928448989277213 4.9644098051489065 1.1471825179423418 -4.3399106139247898 5.0133040512611569 1.0454413345601465 -4.3869763289218593 5.0621982973734072 0.94370015117795125 -4.4340420439189296 5.1110925434856576 0.84195896779575585 -4.3650915138377364 4.8178713582542292 1.2486064604031253 -4.4121572288348059 4.8667656043664804 1.1468652770209298 -4.4592229438318753 4.9156598504787299 1.0451240936387345 -4.5062886588289448 4.9645540965909802 0.94338291025653931 -4.5533543738260143 5.0134483427032315 0.84164172687434391 -4.484403843744821 4.7202271574718031 1.2482892194817135 -4.5314695587418914 4.7691214035840535 1.1465480360995177 -4.57853527373896 4.8180156496963038 1.0448068527173224 -4.6256009887360294 4.8669098958085542 0.94306566933512725 -4.6726667037330998 4.9158041419208054 0.84132448595293186 -4.5566504586548362 4.5736887105771258 1.3497131619424967 -4.6037161736519066 4.6225829566893761 1.2479719785603014 -4.650781888648976 4.6714772028016274 1.1462307951781059 -4.6978476036460455 4.7203714489138768 1.0444896117959106 -4.7449133186431149 4.7692656950261272 0.94274842841371531 -4.7919790336401844 4.8181599411383784 0.84100724503151991 -2.5053136389710047 5.9367045349490581 1.3640222519303593 -2.5301466970381594 5.9999873755173132 1.2624874438433114 -2.5549797551053146 6.0632702160855692 1.160952635756263 -2.5798128131724698 6.1265530566538251 1.0594178276692148 -2.6046458712396245 6.1898358972220802 0.95788301958216682 -2.6294789293067793 6.2531187377903361 0.85634821149511864 -2.6337848564607591 5.8691251269552209 1.3625767603816468 -2.6586179145279139 5.932407967523476 1.2610419522945988 -2.683450972595069 5.9956908080917319 1.1595071442075504 -2.7082840306622242 6.0589736486599879 1.0579723361205022 -2.733117088729379 6.1222564892282438 0.95643752803345428 -2.7622560739505135 5.8015457189613837 1.3611312688329342 -2.7870891320176683 5.8648285595296388 1.2595964607458863 -2.8119221900848235 5.9281114000978947 1.1580616526588379 -2.8367552481519787 5.9913942406661507 1.0565268445717897 -2.8615883062191334 6.0546770812344066 0.95499203648474174 -2.8907272914402684 5.7339663109675465 1.3596857772842217 -2.9155603495074227 5.7972491515358016 1.2581509691971737 -2.9403934075745779 5.8605319921040575 1.1566161611101253 -2.9652264656417331 5.9238148326723135 1.0550813530230772 -3.0191985089300228 5.6663869029737093 1.3582402857355091 -3.0440315669971771 5.7296697435419652 1.2567054776484612 -3.0688646250643323 5.7929525841102212 1.1551706695614128 -3.1476697264197773 5.598807494979873 1.3567947941867966 -3.1725027844869316 5.662090335548128 1.2552599860997486 -3.2761409439095317 5.5312280869860357 1.3553493026380841 -3.300974001976686 5.5945109275542917 1.2538144945510361 -3.4046121613992866 5.4636486789921994 1.3539038110893715 -2.7584384542638896 6.1852813410626197 0.85489871851533294 -2.8956481413762702 6.1130851150500192 0.85338161965725501 -2.9964868584377826 5.9837019030347482 0.95349387620040349 -3.0328578284886514 6.0408888890374186 0.85186452079917707 -3.0973255754992941 5.8543186910194773 1.053606132743552 -3.1336965455501633 5.9115056770221477 0.95197677734232555 -3.1700675156010321 5.968692663024818 0.85034742194109914 -3.1981642925608056 5.7249354790042073 1.1537183892867005 -3.2345352626116748 5.7821224650068768 1.052089033885474 -3.270906232662544 5.8393094510095471 0.95045967848424751 -3.3072772027134127 5.8964964370122175 0.84883032308302109 -3.3353739796731867 5.6527392529916067 1.1522012904286225 -3.3717449497240555 5.7099262389942762 1.0505719350273961 -3.4081159197749247 5.7671132249969466 0.94894257962616957 -3.4444868898257939 5.8243002109996169 0.84731322422494315 -3.4362126967346986 5.5233560409763367 1.2523135469717712 -3.4725836667855678 5.5805430269790062 1.1506841915705446 -3.5089546368364366 5.6377300129816756 1.0490548361693182 -3.5453256068873058 5.694916998984346 0.94742548076809152 -3.581696576938175 5.7521039849870155 0.8457961253668651 -3.537051413796211 5.3939728289610667 1.3524258035149199 -3.5734223838470798 5.4511598149637361 1.2507964481136933 -3.609793353897949 5.5083468009664065 1.1491670927124664 -3.6461643239488177 5.565533786969076 1.0475377373112402 -3.6825352939996869 5.6227207729717454 0.94590838191001358 -3.7189062640505557 5.6799077589744149 0.84427902650878717 -1.3691642329442422 6.2726399900498153 1.3891560925394644 -1.3808554974317531 6.3395958607564724 1.2876966827973537 -1.392546761919264 6.4065517314631304 1.1862372730552428 -1.4042380264067753 6.4735076021697884 1.0847778633131322 -1.4159292908942862 6.5404634728764464 0.98331845357102154 -1.4276205553817971 6.6074193435831043 0.88185904382891078 -1.5108741978523308 6.2318784509817293 1.3859530926863639 -1.5225654623398417 6.2988343216883864 1.2844936829442533 -1.5342567268273526 6.3657901923950444 1.1830342732021424 -1.5459479913148639 6.4327460631017024 1.0815748634600317 -1.5576392558023748 6.4997019338083604 0.98011545371792108 -1.6525841627604194 6.1911169119136433 1.3827500928332637 -1.6642754272479303 6.2580727826203004 1.2812906830911528 -1.6759666917354412 6.3250286533269584 1.1798312733490419 -1.6876579562229526 6.3919845240336164 1.0783718636069313 -1.6993492207104637 6.4589403947402735 0.97691245386482073 -1.7942941276685083 6.1503553728455573 1.3795470929801632 -1.8059853921560194 6.2173112435522144 1.2780876832380523 -1.8176766566435303 6.2842671142588715 1.1766282734959415 -1.8293679211310416 6.3512229849655295 1.075168863753831 -1.9360040925765969 6.1095938337774713 1.376344093127063 -1.947695357064108 6.1765497044841284 1.2748846833849521 -1.9593866215516191 6.2435055751907855 1.1734252736428412 -2.0777140574846853 6.0688322947093853 1.3731410932739625 -2.0894053219721966 6.1357881654160416 1.2716816835318516 -2.2194240223927739 6.0280707556412985 1.3699380934208623 -2.361133987300863 5.9873092165732125 1.3667350935677618 -1.444680963114187 6.6727636610007899 0.78037494141422459 -1.5719697012123337 6.5658656519309311 0.87864390639120638 -1.5965960525830141 6.6289390443987015 0.77712500822597597 -1.7238847906811605 6.5220410353288427 0.87539397320295786 -1.7485111420518411 6.5851144277966132 0.77387507503772746 -1.8511735287793076 6.4151430262589839 0.97366293817993976 -1.8757998801499876 6.4782164187267544 0.87214404001470924 -1.9004262315206681 6.5412898111945248 0.77062514184947883 -1.9784622668774547 6.3082450171891251 1.0719319031569214 -2.0030886182481344 6.3713184096568956 0.97041300499169114 -2.0277149696188146 6.434391802124666 0.86889410682646062 -2.0523413209894952 6.4974651945924364 0.76737520866123032 -2.1057510049756014 6.2013470081192663 1.1702008681339033 -2.1303773563462816 6.2644204005870368 1.0686819699686729 -2.1550037077169617 6.3274937930548072 0.96716307180344252 -2.1796300590876418 6.3905671855225776 0.86564417363821211 -2.2330397430737485 6.0944489990494075 1.2684698331108855 -2.2576660944444287 6.157522391517178 1.1669509349456548 -2.2822924458151088 6.2205957839849484 1.0654320367804244 -2.306918797185789 6.2836691764527188 0.96391313861519401 -2.3315451485564687 6.3467425689204893 0.86239424044996349 -2.3849548325425753 6.0506243824473191 1.2652198999226369 -2.4095811839132555 6.1136977749150896 1.1637010017574063 -2.4342075352839361 6.17677116738286 1.0621821035921759 -2.4588338866546158 6.2398445598506305 0.96066320542694539 -2.4834602380252959 6.3029179523184009 0.85914430726171498 -0.0090109092828787318 6.465780345431364 1.3357101844105699 -0.0067697003922211341 6.5338173052013682 1.2342160388145285 -0.0045284915015638694 6.6018542649713714 1.1327218932184875 -0.0022872826109065492 6.6698912247413746 1.0312277476224463 -4.6073720249117933e-005 6.7379281845113779 0.9297336020264052 -0.16042409125606227 6.4545770069167974 1.3301584381346074 -0.15818288236540479 6.5226139666868015 1.228664292538566 -0.15594167347474741 6.5906509264568047 1.127170146942525 -0.15370046458409009 6.658687886226808 1.0256760013464838 -0.15145925569343269 6.7267248459968112 0.92418185575044265 -0.3118372732292457 6.4433736684022307 1.324606691858645 -0.30959606433858844 6.5114106281722348 1.2231125462626036 -0.30735485544793095 6.5794475879422381 1.1216184006665626 -0.30511364655727358 6.6474845477122413 1.0201242550705214 -0.46325045520242947 6.4321703298876649 1.3190549455826825 -0.46100924631177215 6.5002072896576681 1.2175607999866411 -0.45876803742111472 6.5682442494276714 1.1160666543905999 -0.45652682853045728 6.6362812091976755 1.0145725087945587 -0.6146636371756129 6.4209669913730982 1.3135031993067199 -0.61242242828495574 6.4890039511431024 1.2120090537106785 -0.61018121939429826 6.5570409109131056 1.1105149081146375 -0.76831802803945393 6.3417266930885292 1.4094455986267984 -0.76607681914879644 6.4097636528585324 1.3079514530307574 -0.76383561025813929 6.4778006126285357 1.206457307434716 -0.91973121001263747 6.3305233545739625 1.403893852350836 -0.91749000112197998 6.3985603143439658 1.3023997067547948 -1.0711443919858215 6.3193200160593959 1.3983421060748735 -0.15195645746426378 6.7944841237017117 0.82269964132913831 -0.30338884505503261 6.7154691424107575 0.91863235944628807 -0.31485004641450121 6.7821166416339382 0.81719791484882487 -0.46628243400527036 6.703101660342984 0.91313063296597463 -0.47774363536473896 6.7697491595661647 0.81169618836851143 -0.61771482159603919 6.6240866790520299 1.0090633510831244 -0.6291760229555079 6.6907341782752106 0.90762890648566119 -0.64063722431497649 6.7573816774983912 0.80619446188819799 -0.76914720918680823 6.5450716977610757 1.104996069200274 -0.78060841054627672 6.6117191969842564 1.003561624602811 -0.79206961190574543 6.6783666962074371 0.90212718000534775 -0.80353081326521403 6.7450141954306178 0.80069273540788455 -0.92057959677757717 6.4660567164701215 1.2009287873174239 -0.93204079813704577 6.5327042156933022 1.0994943427199606 -0.94350199949651425 6.5993517149164829 0.99805989812249751 -0.95496320085598296 6.6659992141396636 0.89662545352503431 -0.96642440221545156 6.7326467133628443 0.79519100892757122 -1.0720119843683464 6.3870417351791673 1.2968615054345738 -1.083473185727815 6.453689234402348 1.1954270608371105 -1.0949343870872836 6.5203367336255287 1.0939926162396472 -1.1063955884467522 6.5869842328487094 0.99255817164218407 -1.1178567898062208 6.6536317320718901 0.89112372704472087 -1.1293179911656894 6.7202792312950708 0.78968928244725778 -1.2234443719591153 6.3080267538882131 1.3927942235517237 -1.2349055733185841 6.3746742531113938 1.2913597789542604 -1.2463667746780525 6.4413217523345745 1.189925334356797 -1.2578279760375213 6.5079692515577552 1.0884908897593337 -1.2692891773969897 6.5746167507809359 0.98705644516187063 -1.2807503787564585 6.6412642500041166 0.88562200056440743 -1.2922115801159268 6.7079117492272973 0.78418755596694434 1.2490568078195809 6.3022805283189287 1.3976187130445781 1.2664762546972494 6.3685023018844156 1.2959431498363172 1.0932192739614757 6.322824762051547 1.3898429835729011 1.1106387208391442 6.3890465356170338 1.2881674203646403 1.1280581677168127 6.4552683091825198 1.1864918571563798 1.1454776145944812 6.5214900827480058 1.0848162939481194 1.1628970614721494 6.5877118563134918 0.98314073073985908 1.1803165083498177 6.6539336298789777 0.88146516753159876 0.93738174010337039 6.3433689957841652 1.3820672541012242 0.95480118698103889 6.4095907693496521 1.2803916908929633 0.97222063385870738 6.4758125429151381 1.1787161276847029 0.98964008073637588 6.5420343164806241 1.0770405644764425 1.0070595276140442 6.60825609004611 0.97536500126818204 0.78154420624526466 6.3639132295167835 1.3742915246295471 0.79896365312293316 6.4301350030822704 1.2726159614212864 0.81638310000060166 6.4963567766477572 1.1709403982130258 0.83380254687827016 6.5625785502132432 1.0692648350047653 0.62570667238715938 6.3844574632494018 1.3665157951578699 0.64312611926482788 6.4506792368148886 1.2648402319496093 0.66054556614249638 6.5169010103803755 1.1631646687413488 0.4698691385290541 6.4050016969820209 1.358740065686193 0.48728858540672249 6.4712234705475078 1.2570645024779323 0.31403160467094882 6.4255459307146392 1.3509643362145158 0.15819407081284315 6.4460901644472584 1.3431886067428389 1.1893040249586802 6.7209059712606889 0.77990919035082418 1.0176072553349533 6.6750895493201794 0.87378689636066187 1.0201116310603358 6.7426389871365222 0.77232286646113513 0.84591048571122662 6.6292731273796699 0.96766460237049923 0.84841486143660905 6.6968225651960127 0.86620057247097282 0.6742137160874998 6.5834567054391613 1.0615423083803366 0.67671809181288234 6.6510061432555032 0.96007827848081018 0.67922246753826476 6.718555581071846 0.85861424858128377 0.50251694646377287 6.5376402834986527 1.1554200143901738 0.50502132218915552 6.6051897213149946 1.0539559844906476 0.50752569791453805 6.6727391591313365 0.95249195459112113 0.51003007363992048 6.7402885969476793 0.85102792469159472 0.33082017684004605 6.4918238615581432 1.2492977204000113 0.33332455256542853 6.559373299374486 1.1478336905004849 0.33582892829081118 6.6269227371908279 1.0463696606009587 0.33833330401619371 6.6944721750071698 0.94490563070143208 0.34083767974157625 6.7620216128235118 0.84344160080190567 0.16162778294170188 6.5135568774339765 1.2417113965103224 0.16413215866708436 6.5811063152503193 1.140247366610796 0.16663653439246698 6.6486557530666612 1.0387833367112695 0.16914091011784954 6.7162051908830032 0.93731930681174314 0.1716452858432321 6.7837546286993451 0.83585527691221662 0.0024528919448877588 6.8054876445751775 0.82826895302252757 2.3237359891889415 6.0089333490225414 1.3519418407858397 2.3558028904481079 6.0700825380849439 1.2499439225181872 2.3878697917072742 6.1312317271473473 1.1479460042505349 2.4199366929664405 6.1923809162097498 1.0459480859828825 2.4520035942256069 6.2535301052721524 0.94395016771522999 2.4840704954847737 6.3146792943345549 0.84195224944757729 2.1751615856652284 6.0595998797592223 1.3438872740553613 2.2072284869243948 6.1207490688216248 1.2418893557877089 2.2392953881835611 6.1818982578840282 1.1398914375200566 2.2713622894427274 6.2430474469464308 1.0378935192524041 2.3034291907018938 6.3041966360088324 0.93589560098475166 2.0265871821415153 6.1102664104959032 1.335832707324883 2.0586540834006817 6.1714155995583058 1.2338347890572305 2.090720984659848 6.2325647886207083 1.1318368707895783 2.1227878859190144 6.2937139776831108 1.0298389525219258 1.8780127786178022 6.1609329412325833 1.3277781405944047 1.9100796798769686 6.2220821302949858 1.2257802223267522 1.9421465811361349 6.2832313193573883 1.1237823040590997 1.7294383750940894 6.2115994719692642 1.3197235738639264 1.7615052763532555 6.2727486610316667 1.2177256555962739 1.5487970703112093 6.2011168136435417 1.4136669254011005 1.5808639715703761 6.2622660027059442 1.3116690071334478 1.4002226667874964 6.2517833443802227 1.4056123586706222 2.3243860355063344 6.368544477305746 0.83414455398596654 2.1451368506373187 6.3576610192638991 0.92805697189008929 2.1627113161787803 6.4229826679425814 0.8263810831286944 1.9658876657683038 6.3467775612220514 1.0219693897942119 1.9834621313097649 6.4120992099007346 0.92029350103281726 2.0010365968512263 6.4774208585794169 0.81861761227142238 1.7866384808992886 6.3358941031802045 1.1158818076983346 1.8042129464407499 6.4012157518588868 1.0142059189369399 1.8217874119822111 6.46653740053757 0.91253003017554513 1.8393618775236722 6.5318590492162523 0.81085414141415024 1.6073892960302734 6.3250106451383568 1.2097942256024572 1.6249637615717343 6.3903322938170399 1.1081183368410625 1.6425382271131956 6.4556539424957222 1.0064424480796679 1.6601126926546568 6.5209755911744054 0.90476655931827299 1.6776871581961177 6.5862972398530886 0.80309067055687811 1.4281401111612586 6.3141271870965099 1.3037066435065796 1.4457145767027195 6.3794488357751922 1.2020307547451852 1.4632890422441804 6.4447704844538753 1.1003548659837905 1.4808635077856416 6.5100921331325585 0.99867897722239574 1.4984379733271027 6.5754137818112408 0.89700308846100096 1.5160124388685638 6.640735430489924 0.79532719969960608 1.2840398573751655 6.4338870264120285 1.1942672838879129 1.3016143229166266 6.4992086750907117 1.0925913951265185 1.3191887884580877 6.5645303237693939 0.9909155063651236 1.3367632539995489 6.6298519724480762 0.88923961760372894 1.3543377195410098 6.6951736211267594 0.78756372884233394 3.5315827274615224 5.3543063585263306 1.4089112436501181 3.5757134558459467 5.4079168692177264 1.3065243175103358 3.6198441842303706 5.4615273799091213 1.2041373913705533 3.6639749126147949 5.5151378906005171 1.101750465230771 3.7081056409992188 5.568748401291912 0.99936353909098841 3.7522363693836431 5.6223589119833068 0.89697661295120579 3.3999666222857368 5.4292870830750966 1.4027699935218008 3.4440973506701607 5.4828975937664923 1.3003830673820187 3.488228079054585 5.5365081044578872 1.1979961412422362 3.5323588074390093 5.590118615149283 1.0956092151024537 3.5764895358234332 5.6437291258406779 0.99322228896267117 3.6206202642078571 5.6973396365320728 0.89083536282288855 3.2683505171099512 5.5042678076238625 1.3966287433934836 3.3124812454943751 5.5578783183152582 1.2942418172537014 3.3566119738787994 5.6114888290066531 1.1918548911139188 3.4007427022632233 5.6650993396980489 1.0894679649741363 3.4448734306476472 5.7187098503894429 0.98708103883435394 3.1367344119341656 5.5792485321726284 1.3904874932651663 3.1808651403185895 5.6328590428640242 1.2881005671253842 3.2249958687030134 5.6864695535554191 1.1857136409856017 3.2691265970874377 5.7400800642468139 1.0833267148458192 3.0051183067583795 5.6542292567213943 1.3843462431368492 3.0492490351428034 5.7078397674127901 1.2819593169970669 3.0933797635272278 5.761450278104185 1.1795723908572844 2.8735022015825935 5.7292099812701602 1.3782049930085318 2.9176329299670174 5.782820491961556 1.2758180668687498 2.9617636583514417 5.8364310026529509 1.1734311407289673 2.7418860964068079 5.8041907058189262 1.3720637428802147 2.7860168247912318 5.8578012165103219 1.2696768167404324 2.6102699912310219 5.8791714303676921 1.3659224927518974 3.6580653767522593 5.7543998245067822 0.78861270753597212 3.4841039347215572 5.7748488031707854 0.88481451506975772 3.5159155346325872 5.8348157989881289 0.78273027963032593 3.3101424926908556 5.7952977818347877 0.98101632260354366 3.3419540926018851 5.8552647776521312 0.87893208716411153 3.3737656925129151 5.9152317734694746 0.77684785172467974 3.136181050660154 5.8157467604987909 1.0772181301373294 3.1679926505711835 5.8757137563161344 0.97513389469789757 3.1998042504822131 5.9356807521334778 0.87304965925846545 3.2316158503932426 5.9956477479508212 0.77096542381903366 2.9940312085404814 5.8961627349801375 1.0713357022316832 3.025842808451511 5.956129730797481 0.96925146679225138 3.0576544083625405 6.0160967266148244 0.86716723135281926 2.8200697665097794 5.9166117136441407 1.1675375097654688 2.8518813664208089 5.9765787094614833 1.065453274326037 2.8836929663318389 6.0365457052788267 0.9633690388866053 2.9155045662428685 6.0965127010961702 0.86128480344717318 2.6461083244790773 5.9370606923081439 1.2637393172992544 2.6779199243901068 5.9970276881254874 1.1616550818598226 2.7097315243011364 6.0569946839428299 1.0595708464203908 2.7415431242121664 6.1169616797601734 0.95748661098095911 2.7733547241231964 6.1769286755775168 0.85540237554152698 2.4721468824483752 5.9575096709721471 1.35994112483304 2.5039584823594048 6.0174766667894897 1.2578568893936084 2.5357700822704343 6.0774436626068331 1.1557726539541766 2.5675816821814643 6.1374106584241765 1.0536884185147446 2.5993932820924943 6.1973776542415191 0.95160418307531303 2.6312048820035239 6.2573446500588625 0.8495199476358809 4.4883127571013022 4.6405597952948971 1.3371724770040574 4.5424324155000964 4.6844674229776198 1.2344985081132456 4.5965520738988905 4.7283750506603432 1.1318245392224338 4.6506717322976838 4.7722826783430667 1.0291505703316219 4.7047913906964789 4.8161903060257902 0.92647660144080979 4.7589110490952731 4.8600979337085128 0.82380263254999808 4.3761523820608463 4.7358705573582096 1.3333791326521645 4.4302720404596405 4.7797781850409322 1.2307051637613526 4.4843916988584347 4.8236858127236548 1.1280311948705408 4.538511357257228 4.8675934404063783 1.025357225979729 4.5926310156560231 4.9115010680891018 0.92268325708891696 4.2639920070203905 4.8311813194215212 1.3295857883002715 4.3181116654191847 4.8750889471042438 1.2269118194094597 4.3722313238179789 4.9189965747869673 1.1242378505186479 4.4263509822167721 4.9629042024696908 1.0215638816278361 4.1518316319799347 4.9264920814848328 1.3257924439483786 4.2059512903787288 4.9703997091675554 1.2231184750575668 4.260070948777523 5.0143073368502789 1.1204445061667549 4.0396712569394788 5.0218028435481452 1.3219990995964856 4.093790915338273 5.0657104712308678 1.2193251307056738 3.927510881899023 5.1171136056114577 1.3182057552445925 3.9816305402978167 5.1610212332941803 1.2155317863537807 3.8153505068585671 5.2124243676747692 1.3144124108926996 3.6490704734193167 5.2638275020553582 1.4132930354316184 4.6405440980463579 4.9604141167177893 0.82011180158573549 4.4762861653192942 5.010186486366611 0.91895902729189149 4.5199145145778337 5.0625550462041389 0.81645834229209779 4.3120282325922297 5.0599588560154327 1.0178062529980478 4.35565658185077 5.1123274158529606 0.9153055679982538 4.3992849311093103 5.1646959756904884 0.8128048829984601 4.147770299865166 5.1097312256642553 1.116653478704204 4.1913986491237054 5.1620997855017823 1.0141527937044101 4.2350269983822457 5.2144683453393101 0.9116521087046161 4.278655347640786 5.266836905176838 0.80915142370482229 4.0271407163966417 5.2118721551506049 1.1130000194105663 4.070769065655182 5.2642407149881327 1.0104993344107724 4.1143974149137224 5.3166092748256597 0.90799864941097841 4.1580257641722627 5.3689778346631876 0.8054979644111846 3.8628827836695776 5.2616445247994275 1.2118472451167221 3.9065111329281179 5.3140130846369553 1.1093465601169286 3.9501394821866582 5.3663816444744823 1.0068458751171347 3.9937678314451985 5.4187502043120093 0.90434519011734071 4.0373961807037384 5.4711187641495371 0.80184450511754679 3.6986248509425139 5.31141689444825 1.3106944708228783 3.7422532002010538 5.363785454285777 1.2081937858230845 3.7858815494595941 5.4161540141233049 1.1056931008232906 3.8295098987181344 5.4685225739608327 1.0031924158234971 3.8731382479766747 5.5208911337983597 0.90069173082370291 3.9167665972352146 5.5732596936358867 0.7981910458239091 3.7961370137666912 5.6754006231222371 0.79453758653027129 5.32890077629843 3.6297533471267482 1.356075159475568 5.3905318234678061 3.662462483867353 1.2532241917064477 5.4521628706371814 3.6951716206079577 1.1503732239373274 5.5137939178065576 3.7278807573485619 1.0475222561682074 5.5754249649759338 3.7605898940891667 0.94467128839908698 5.637056012145309 3.7932990308297709 0.8418203206299667 5.2379146877532854 3.7426721069567987 1.3541175935530139 5.2995457349226616 3.7753812436974035 1.2512666257838936 5.3611767820920369 3.8080903804380082 1.1484156580147733 5.422807829261413 3.8407995171786125 1.0455646902456532 5.4844388764307892 3.8735086539192172 0.94271372247653273 5.1469285992081408 3.8555908667868493 1.3521600276304595 5.208559646377517 3.888300003527454 1.2493090598613394 5.2701906935468923 3.9210091402680587 1.1464580920922192 5.3318217407162685 3.953718277008663 1.0436071243230989 5.3934527878856438 3.9864274137492677 0.94075615655397848 5.0559425106629963 3.9685096266168998 1.3502024617079054 5.1175735578323724 4.001218763357504 1.2473514939387851 5.1792046050017477 4.0339279000981092 1.144500526169665 5.240835652171123 4.0666370368387135 1.0416495584005447 4.9649564221178517 4.0814283864469498 1.348244895785351 5.0265874692872279 4.1141375231875541 1.2453939280162309 5.0882185164566032 4.1468466599281593 1.1425429602471107 4.8739703335727071 4.1943471462769999 1.3462873298627969 4.9356013807420833 4.2270562830176051 1.2434363620936766 4.7829842450275626 4.3072659061070508 1.3443297639402425 4.8446152921969388 4.3399750428476551 1.2414787961711224 4.6919981564824189 4.4201846659371009 1.3423721980176884 5.5450794062374653 3.9074142232242055 0.83987278761166773 5.4477100901408591 4.0280431975300868 0.83797987710382305 5.2969491530504023 4.1060107433340383 0.93885447760093765 5.3503407740442528 4.1486721718359671 0.83608696659597836 5.1461882159599455 4.1839782891379889 1.0397290780980526 5.199579836953796 4.2266397176399195 0.93696156709309297 5.2529714579476465 4.2693011461418484 0.83419405608813368 4.9954272788694896 4.2619458349419403 1.1406036785951672 5.0488188998633392 4.3046072634438701 1.0378361675902079 5.1022105208571897 4.3472686919457999 0.93506865658524829 5.1556021418510403 4.3899301204477288 0.832301145580289 4.8980579627728833 4.3825748092478216 1.1387107680873225 4.9514495837667329 4.4252362377497505 1.0359432570823632 5.0048412047605835 4.4678976662516803 0.93317574607740361 5.058232825754434 4.5105590947536101 0.83040823507244432 4.7472970256824274 4.4605423550517731 1.2395853685844371 4.800688646676277 4.5032037835537029 1.1368178575794778 4.8540802676701267 4.5458652120556318 1.0340503465745186 4.9074718886639772 4.5885266405575615 0.93128283556955893 4.9608635096578277 4.6311880690594904 0.82851532456459964 4.5965360885919715 4.5385099008557255 1.340459969081552 4.6499277095858211 4.5811713293576544 1.2376924580765924 4.7033193305796708 4.6238327578595841 1.1349249470716332 4.7567109515735204 4.666494186361513 1.0321574360666739 4.8101025725673709 4.7091556148634428 0.92938992506171414 4.8634941935612215 4.7518170433653717 0.82662241405675485 5.9496544960896269 2.4826260193015548 1.362930494620368 6.0166870259778618 2.5024299475206657 1.2599877617077215 6.0837195558660957 2.5222338757397766 1.1570450287950755 5.8821236829128338 2.6099665767666718 1.3622220876743436 5.9491562128010687 2.6297705049857827 1.2592793547616972 6.0161887426893026 2.6495744332048936 1.1563366218490512 6.0832212725775374 2.6693783614240041 1.053393888936405 6.1502538024657722 2.6891822896431146 0.95045115602375851 6.2172863323540071 2.708986217862225 0.8475084231111123 5.8145928697360407 2.7373071342317887 1.3615136807283192 5.8816253996242756 2.7571110624508997 1.2585709478156728 5.9486579295125095 2.7769149906700106 1.1556282149030268 6.0156904594007443 2.7967189188891211 1.0526854819903804 6.0827229892889791 2.816522847108232 0.94974274907773404 5.7470620565592476 2.8646476916969057 1.3608052737822949 5.8140945864474824 2.8844516199160166 1.2578625408696484 5.8811271163357173 2.9042555481351275 1.1549198079570022 5.9481596462239521 2.924059476354238 1.051977075044356 5.6795312433824545 2.9919882491620227 1.3600968668362703 5.7465637732706902 3.0117921773811336 1.2571541339236241 5.8135963031589251 3.0315961056002441 1.1542114010109779 5.6120004302056623 3.1193288066271396 1.3593884598902459 5.6790329600938971 3.1391327348462505 1.2564457269775997 5.746065489982132 3.158936663065361 1.1535029940649533 5.5444696170288692 3.2466693640922566 1.3586800529442213 5.611502146917104 3.2664732923113675 1.2557373200315751 5.476938803852077 3.3740099215573736 1.357971645998197 6.1461248299560731 2.8430951794257013 0.84681712757445071 6.0130908541211756 2.9477807314249871 0.94904424564550582 6.0738113054534919 2.9793517638397082 0.84613126150878692 5.8800568782862781 3.0524662834242733 1.0512713637165612 5.9407773296185944 3.0840373158389935 0.94835837957984204 6.0014977809509107 3.1156083482537147 0.84544539544312314 5.8077433537836969 3.1887228678382797 1.0505854976508975 5.8684638051160132 3.2202939002530004 0.94767251351417825 5.9291842564483295 3.2518649326677211 0.84475952937745935 5.6747093779487994 3.2934084198375664 1.1528126157219525 5.7354298292811148 3.3249794522522871 1.0498996315852336 5.796150280613432 3.3565504846670073 0.94698664744851446 5.8568707319457474 3.388121517081728 0.84407366331179556 5.5416754021139019 3.3980939718368526 1.2550397337930075 5.6023958534462182 3.4296650042515733 1.1521267496562886 5.6631163047785336 3.4612360366662935 1.0492137655195697 5.7238367561108507 3.4928070690810142 0.94630078138285068 5.7845572074431661 3.5243781014957349 0.84338779724613167 5.4086414262790043 3.5027795238361379 1.3572668518640627 5.4693618776113206 3.534350556250859 1.2543538677273436 5.5300823289436369 3.5659215886655797 1.1514408835906249 5.5908027802759523 3.5974926210803004 1.048527899453906 5.6515232316082686 3.6290636534950211 0.94561491531718678 5.7122436829405849 3.6606346859097414 0.84270193118046788 6.2887536421616046 1.3779661551684441 1.3621246394477013 6.3583309124819394 1.3845326736878527 1.259129970452576 6.4279081828022742 1.3910991922072613 1.1561353014574507 6.4974854531226089 1.3976657107266699 1.0531406324623254 6.5670627234429428 1.4042322292460785 0.95014596346719982 6.6366399937632776 1.4107987477654871 0.84715129447207449 6.2469837847138425 1.5154060481405551 1.3622367759739198 6.3165610550341773 1.5219725666599637 1.2592421069787945 6.3861383253545121 1.5285390851793723 1.1562474379836691 6.4557155956748469 1.5351056036987809 1.0532527689885438 6.5252928659951808 1.5416721222181895 0.95025809999341826 6.2052139272660805 1.6528459411126664 1.3623489125001382 6.2747911975864152 1.6594124596320747 1.2593542435050129 6.3443684679067491 1.6659789781514835 1.1563595745098876 6.4139457382270839 1.6725454966708921 1.0533649055147623 6.1634440698183184 1.7902858340847772 1.3624610490263567 6.2330213401386532 1.7968523526041855 1.2594663800312313 6.3025986104589871 1.8034188711235943 1.156471711036106 6.3721758807793218 1.8099853896430029 1.0534770420409807 6.1216742123705563 1.9277257270568879 1.3625731855525751 6.1912514826908911 1.9342922455762963 1.2595785165574498 6.260828753011225 1.9408587640957051 1.1565838475623245 6.0799043549227942 2.0651656200289987 1.3626853220787936 6.149481625243129 2.0717321385484073 1.2596906530836682 6.0381344974750313 2.2026055130011097 1.362797458605012 5.9963646400272692 2.3400454059732203 1.3629095951312304 6.5934324127309569 1.5529697686542869 0.84726710301621377 6.4830334184917859 1.6807231129039486 0.95037148695711815 6.5488876080447982 1.6995412015746334 0.84738632689642568 6.4384886138056272 1.8272945458242951 0.95049071083733006 6.5043428033586395 1.8461126344949799 0.84750555077663758 6.3280896195664553 1.9550478900739563 1.0535950947782349 6.3939438091194685 1.9738659787446418 0.95060993471754196 6.4597979986724816 1.9926840674153263 0.84762477465684949 6.2176906253272834 2.0828012343236177 1.1566994787191394 6.2835448148802966 2.1016193229943028 1.0537143186584468 6.3493990044333097 2.1204374116649882 0.95072915859775398 6.4152531939863229 2.1392555003356728 0.84774399853706139 6.1072916310881116 2.2105545785732792 1.2598038626600438 6.1731458206411247 2.2293726672439642 1.1568187025993513 6.2390000101941379 2.2481907559146492 1.0538335425386587 6.304854199747151 2.2670088445853347 0.95084838247796588 6.370708389300165 2.2858269332560193 0.8478632224172733 6.0627468264019528 2.3571260114936257 1.2599230865402558 6.128601015954966 2.3759441001643111 1.1569379264795632 6.19445520550798 2.3947621888349961 1.0539527664188706 6.2603093950609932 2.4135802775056812 0.9509676063581779 6.3261635846140063 2.4323983661763662 0.8479824462974852 6.1499104008218213 2.5413336217553426 1.0540719902990825 6.2157645903748344 2.5601517104260276 0.9510868302383898 6.2816187799278485 2.5789697990967126 0.84810167017769722 6.4435152294514122 0.092238129642818079 1.356764359822392 6.5131002079368434 0.084665841627372229 1.2537392564959391 6.5826851864222737 0.077093553611926491 1.150714153169486 6.6522701649077041 0.069521265596480586 1.0476890498430331 6.7218551433931344 0.061948977581034625 0.94466394651658003 6.7914401218785647 0.054376689565588734 0.84163884319012716 6.4290404316309342 0.23481250637476259 1.3574115630534356 6.4986254101163654 0.22724021835931674 1.2543864597269827 6.5682103886017957 0.219667930343871 1.1513613564005296 6.6377953670872261 0.21209564232842509 1.0483362530740767 6.7073803455726564 0.20452335431297908 0.94531114974762354 6.4145656338104562 0.37738688310670732 1.3580587662844792 6.4841506122958874 0.36981459509126136 1.2550336629580263 6.5537355907813177 0.36224230707581562 1.1520085596315732 6.6233205692667481 0.35467001906036977 1.0489834563051201 6.6929055477521775 0.34709773104492375 0.94595835297866715 6.4000908359899782 0.51996125983865182 1.3587059695155226 6.4696758144754094 0.51238897182320575 1.2556808661890697 6.5392607929608397 0.50481668380776012 1.1526557628626166 6.6088457714462692 0.49724439579231428 1.0496306595361637 6.3856160381695002 0.66253563657059633 1.3593531727465662 6.4552010166549314 0.65496334855515026 1.2563280694201133 6.5247859951403608 0.64739106053970452 1.1533029660936602 6.3711412403490222 0.80511001330254084 1.3600003759776096 6.4407262188344525 0.79753772528709477 1.2569752726511567 6.3566664425285442 0.94768439003448557 1.3606475792086532 6.4262514210139745 0.94011210201903961 1.2576224758822003 6.3421916447080662 1.0902587667664301 1.3612947824396966 6.7766293454599325 0.20035610267632942 0.84228696202470688 6.7611776701585198 0.35283082240182284 0.84293682742673626 6.6774620766134962 0.49948930418693627 0.94660819602284263 6.7457259948571071 0.50530554212731604 0.84358669282876575 6.5937464830684736 0.64614778597204969 1.0502795646189493 6.6620104013120836 0.65196402391242936 0.94725806142487212 6.7302743195556936 0.65778026185280913 0.84423655823079513 6.51003088952345 0.79280626775716301 1.1539509332150557 6.5782948077670609 0.79862250569754278 1.0509294300209788 6.6465587260106709 0.80443874363792245 0.94790792682690161 6.71482264425428 0.81025498157830234 0.84488642363282462 6.4945792142220373 0.94528098748265643 1.1546007986170852 6.5628431324656473 0.95109722542303632 1.0515792954230083 6.6311070507092573 0.95691346336341598 0.948557792228931 6.6993709689528673 0.96272970130379587 0.84553628903485401 6.4108636206770138 1.0919394692677697 1.2582721672131916 6.4791275389206247 1.0977557072081494 1.1552506640191147 6.5473914571642347 1.1035719451485295 1.0522291608250378 6.6156553754078447 1.109388183088909 0.94920765763096049 6.6839192936514538 1.1152044210292891 0.8461861544368835 6.3271480271319911 1.2385979510528833 1.3619435358092982 6.3954119453756011 1.2444141889932629 1.2589220326152211 6.463675863619212 1.2502304269336426 1.1559005294211442 6.5319397818628211 1.2560466648740225 1.0528790262270671 6.6002037001064311 1.2618629028144022 0.94985752303298987 6.6684676183500411 1.2676791407547821 0.84683601983891288 6.3404940073900793 -1.1974952093737117 1.3480285241333312 6.4072725904367873 -1.2185391508775527 1.2449853759836249 6.4740511734834953 -1.2395830923813937 1.1419422278339184 6.5408297565302034 -1.2606270338852346 1.0388990796842119 6.6076083395769123 -1.2816709753890756 0.9358559315345053 6.6743869226236203 -1.3027149168929166 0.8328127833847988 6.3538591341779433 -1.055041631690216 1.3490242548461597 6.4206377172246514 -1.0760855731940571 1.2459811066964532 6.4874163002713594 -1.0971295146978981 1.1429379585467467 6.5541948833180674 -1.1181734562017391 1.0398948103970402 6.6209734663647763 -1.1392173977055799 0.93685166224733363 6.3672242609658074 -0.91258805400672038 1.3500199855589883 6.4340028440125154 -0.93363199551056153 1.2469768374092818 6.5007814270592235 -0.95467593701440256 1.1439336892595753 6.5675600101059315 -0.97571987851824349 1.0408905411098688 6.6343385931526404 -0.99676382002208452 0.93784739296016206 6.3805893877536715 -0.77013447632322451 1.3510157162718166 6.4473679708003795 -0.79117841782706577 1.2479725681221101 6.5141465538470875 -0.81222235933090658 1.1449294199724036 6.5809251368937964 -0.83326630083474762 1.0418862718226971 6.3939545145415355 -0.62768089863972898 1.3520114469846451 6.4607330975882435 -0.64872484014357024 1.2489682988349387 6.5275116806349525 -0.66976878164741105 1.1459251506852322 6.4073196413293996 -0.48522732095623333 1.3530071776974735 6.4740982243761085 -0.5062712624600747 1.249964029547767 6.4206847681172636 -0.3427737432727378 1.354002908410302 6.4874633511639725 -0.36381768477657922 1.2509597602605955 6.4340498949051277 -0.2003201655892419 1.3549986391231303 6.6879844343080466 -1.1579024489035461 0.83380843256258841 6.7022883927433883 -1.0059189882334929 0.83480383387502988 6.648535845312928 -0.84586351235174728 0.93884283171178495 6.71659235117873 -0.85393552756343982 0.83579923518747135 6.5947832978824676 -0.68580803647000166 1.0428818295485403 6.6628398037482697 -0.69388005168169409 0.93983823302422642 6.7308963096140717 -0.70195206689338663 0.83679463649991281 6.5410307504520082 -0.52575256058825592 1.1469208273852953 6.6090872563178094 -0.53382457579994846 1.0438772308609818 6.6771437621836114 -0.54189659101164089 0.94083363433666789 6.7452002680494134 -0.54996860622333343 0.83779003781235428 6.5553347088873499 -0.37376909991820273 1.1479162286977369 6.6233912147531511 -0.38184111512989527 1.0448726321734234 6.6914477206189531 -0.38991313034158775 0.94182903564910936 6.7595042264847551 -0.3979851455532803 0.83878543912479575 6.5015821614568896 -0.21371362403645722 1.251955226534492 6.5696386673226916 -0.22178563924814962 1.1489116300101785 6.6376951731884928 -0.22985765445984216 1.0458680334858648 6.7057516790542948 -0.23792966967153464 0.94282443696155083 6.7738081849200968 -0.24600168488322718 0.83978084043723722 6.4478296140264293 -0.053658148154711448 1.3559942243712471 6.5158861198922313 -0.061730163366403946 1.2529506278469336 6.5839426257580334 -0.069802178578096327 1.1499070313226198 6.6519991316238345 -0.077874193789788854 1.0468634347983063 6.7200556374896365 -0.085946209001481394 0.94381983827399241 6.7881121433554386 -0.09401822421317392 0.8407762417496788 5.985189519923459 -2.4358172929524997 1.3371829982151195 6.0465329746920125 -2.4696660531687802 1.2341276542380779 6.1078764294605676 -2.5035148133850607 1.1310723102610363 6.169219884229121 -2.5373635736013411 1.0280169662839949 6.2305633389976762 -2.5712123338176216 0.92496162230695289 6.2919067937662296 -2.6050610940339021 0.82190627832991126 6.0257059624400409 -2.2994675131462761 1.3383987590000959 6.0870494172085943 -2.3333162733625565 1.235343415023054 6.1483928719771495 -2.367165033578837 1.1322880710460126 6.2097363267457029 -2.4010137937951175 1.029232727068971 6.271079781514258 -2.4348625540113975 0.9261773830919291 6.0662224049566227 -2.1631177333400524 1.3396145197850722 6.1275658597251761 -2.1969664935563329 1.2365591758080303 6.1889093144937313 -2.2308152537726134 1.1335038318309887 6.2502527692622847 -2.2646640139888938 1.030448487853947 6.311596224030839 -2.2985127742051739 0.9273931438769053 6.1067388474732045 -2.0267679535338283 1.3408302805700483 6.1680823022417579 -2.0606167137501088 1.2377749365930064 6.2294257570103131 -2.0944654739663893 1.134719592615965 6.2907692117788665 -2.1283142341826697 1.0316642486389234 6.1472552899897863 -1.8904181737276047 1.3420460413550246 6.2085987447583397 -1.9242669339438849 1.2389906973779827 6.2699421995268949 -1.9581156941601654 1.1359353534009411 6.1877717325063681 -1.7540683939213808 1.3432618021400007 6.2491151872749215 -1.7879171541376611 1.2402064581629588 6.22828817502295 -1.6177186141151569 1.344477562924977 6.2896316297915034 -1.6515673743314374 1.2414222189479351 6.2688046175395318 -1.4813688343089328 1.3456933237099531 6.3330483388400642 -2.4666504733114589 0.82312210632066662 6.3763580230241574 -2.3210919218396651 0.8243381674115372 6.3544906131834722 -2.1543233692569523 0.92860916031874052 6.4196677072082506 -2.1755333703678712 0.82555422850240778 6.3326232033427861 -1.9875548166742394 1.0328801532259442 6.3978002973675654 -2.0087648177851585 0.9298252214096111 6.4629773913923438 -2.0299748188960773 0.82677028959327836 6.3107557935021008 -1.8207862640915269 1.1371511461331476 6.3759328875268793 -1.8419962652024457 1.0340962143168146 6.4411099815516586 -1.8632062663133646 0.93104128250048168 6.506287075576437 -1.8844162674242835 0.82798635068414894 6.354065477686194 -1.675227712619733 1.1383672072240181 6.4192425717109725 -1.6964377137306521 1.0353122754076853 6.4844196657357518 -1.717647714841571 0.93225734359135226 6.5495967597605302 -1.7388577159524898 0.82920241177501952 6.3321980678455088 -1.5084591600370201 1.2426382001312215 6.3973751618702881 -1.5296691611479389 1.1395832683148888 6.4625522558950665 -1.550879162258858 1.0365283364985558 6.527729349919845 -1.5720891633697769 0.93347340468222284 6.5929064439446243 -1.5932991644806958 0.8304184728658901 6.3103306580048235 -1.3416906074543073 1.3469091930384249 6.3755077520296028 -1.3629006085652264 1.2438542612220922 6.4406848460543813 -1.3841106096761453 1.1407993294057592 6.5058619400791597 -1.4053206107870644 1.0377443975894265 6.5710390341039391 -1.4265306118979832 0.93468946577309353 6.6362161281287175 -1.4477406130089021 0.83163453395676068 5.3920724035191707 -3.5793144314525294 1.3249856706393617 5.444970358234503 -3.6257480010037773 1.2219112855001257 5.4978683129498354 -3.672181570555026 1.11883690036089 5.4581920367167083 -3.4536965137826661 1.3263444957894623 5.5110899914320406 -3.5001300833339144 1.2232701106502264 5.563987946147372 -3.5465636528851627 1.1201957255109907 5.6168859008627043 -3.5929972224364111 1.0171213403717547 5.6697838555780367 -3.6394307919876594 0.91404695523251878 5.5243116699142449 -3.3280785961128032 1.327703320939563 5.5772096246295781 -3.3745121656640515 1.2246289358003271 5.6301075793449096 -3.4209457352152999 1.1215545506610913 5.6830055340602419 -3.4673793047665478 1.0184801655218554 5.7359034887755733 -3.5138128743177961 0.91540578038261933 5.5904313031117825 -3.2024606784429404 1.3290621460896637 5.6433292578271148 -3.2488942479941882 1.2259877609504277 5.6962272125424462 -3.2953278175454366 1.122913375811192 5.7491251672577786 -3.3417613870966849 1.019838990671956 5.65655093630932 -3.0768427607730771 1.3304209712397643 5.7094488910246524 -3.1232763303243249 1.2273465861005284 5.7623468457399838 -3.1697098998755733 1.1242722009612927 5.7226705695068567 -2.9512248431032138 1.331779796389865 5.775568524222189 -2.9976584126544621 1.228705411250629 5.7887902027043934 -2.8256069254333509 1.3331386215399657 5.8416881574197266 -2.8720404949845988 1.2300642364007297 5.8549098359019309 -2.6999890077634876 1.3344974466900661 5.7236347006589376 -3.6840794972233599 0.81097408136653681 5.7946969385974505 -3.549203558749852 0.81234074543139623 5.80609917067859 -3.3805600868394796 0.91677107009948766 5.8657591765359633 -3.4143276202763442 0.81370740949625564 5.8175014027597305 -3.2119166149291072 1.0212013947675793 5.8771614086171029 -3.2456841483659717 0.91813773416434707 5.9368214144744762 -3.2794516818028363 0.81507407356111505 5.82890363484087 -3.0432731430187347 1.1256317194356709 5.8885636406982433 -3.0770406764555993 1.0225680588324388 5.9482236465556158 -3.1108082098924639 0.91950439822920649 6.0078836524129891 -3.1445757433293284 0.81644073762597447 5.8999658727793829 -2.9083972045452269 1.1269983835005302 5.9596258786367562 -2.9421647379820914 1.0239347228972981 6.0192858844941286 -2.975932271418956 0.9208710622940659 6.0789458903515019 -3.0096998048558206 0.81780740169083388 5.9113681048605233 -2.7397537326348544 1.2314287081686217 5.9710281107178957 -2.773521266071719 1.1283650475653895 6.030688116575269 -2.8072887995085836 1.0253013869621577 6.0903481224326415 -2.8410563329454481 0.92223772635892531 6.1500081282900148 -2.8748238663823131 0.81917406575569329 5.9227703369416629 -2.571110260724482 1.3358590328367133 5.9824303427990362 -2.6048777941613466 1.232795372233481 6.0420903486564086 -2.6386453275982111 1.129731711630249 6.1017503545137819 -2.6724128610350757 1.026668051027017 6.1614103603711552 -2.7061803944719407 0.92360439042378473 6.2210703662285276 -2.7399479279088057 0.82054072982055271 4.6005846710283826 -4.5632214738448624 1.3121779382006533 4.6443338201247286 -4.6179388429492461 1.2091179647381616 4.6880829692210764 -4.6726562120536306 1.1060579912756703 4.7318321183174232 -4.7273735811580133 1.0029980178131788 4.6881099237375166 -4.4550770085783027 1.3136038668753462 4.7318590728338634 -4.5097943776826863 1.2105438934128545 4.7756082219302103 -4.5645117467870708 1.1074839199503632 4.8193573710265571 -4.6192291158914536 1.0044239464878717 4.8631065201229049 -4.6739464849958381 0.90136397302537996 4.7756351764466505 -4.3469325433117429 1.3150297955500392 4.8193843255429973 -4.4016499124161266 1.2119698220875477 4.8631334746393442 -4.4563672815205111 1.1089098486250561 4.906882623735692 -4.5110846506248938 1.0058498751625649 4.8631604291557844 -4.2387880780451832 1.3164557242247321 4.9069095782521321 -4.2935054471495668 1.2133957507622406 4.950658727348479 -4.3482228162539514 1.1103357772997491 4.9944078764448259 -4.4029401853583341 1.0072758038372578 4.9506856818649192 -4.1306436127786235 1.3178816528994253 4.9944348309612661 -4.1853609818830071 1.2148216794369338 5.0381839800576138 -4.2400783509873907 1.1117617059744422 5.0382109345740531 -4.0224991475120637 1.3193075815741182 5.0819600836704009 -4.0772165166164474 1.2162476081116267 5.1257361872831879 -3.9143546822455035 1.3207335102488114 5.1694853363795348 -3.9690720513498867 1.2176735367863198 5.2132614399923218 -3.8062102169789434 1.3221594389235043 4.9092787293897926 -4.7257175050242051 0.7982981243712628 4.9509065355920638 -4.5654679186557825 0.90278923548307743 5.0020631980245014 -4.6111780330750687 0.79971130103024468 5.0436910042267726 -4.4509284467066461 0.90420241214205932 5.0948476666592102 -4.4966385611259323 0.80112447768922657 5.0853188104290439 -4.2906788603382235 1.0086935232538743 5.1364754728614814 -4.3363889747575097 0.9056155888010412 5.1876321352939199 -4.382099089176795 0.80253765434820845 5.1269466166313151 -4.1304292739698019 1.113184634365689 5.1781032790637527 -4.1761393883890872 1.0101066999128563 5.2292599414961902 -4.2218495028083733 0.90702876546002309 5.2804166039286287 -4.2675596172276586 0.80395083100719034 5.2197310852660239 -4.0158898020206655 1.114597811024671 5.2708877476984615 -4.0615999164399508 1.0115198765718383 5.3220444101308999 -4.107310030859237 0.90844194211900497 5.3732010725633375 -4.1530201452785223 0.80536400766617222 5.2613588914682952 -3.8556402156522434 1.2190889221364858 5.3125155539007327 -3.9013503300715291 1.116010987683653 5.3636722163331711 -3.9470604444908144 1.0129330532308201 5.4148288787656087 -3.9927705589101001 0.90985511877798686 5.4659855411980471 -4.0384806733293859 0.80677718432515411 5.3029866976705664 -3.6953906292838212 1.3235800332483003 5.3541433601030048 -3.7411007437031065 1.2205020987954678 5.4053000225354424 -3.7868108581223923 1.1174241643426348 5.4564566849678808 -3.8325209725416776 1.0143462298898021 5.5076133474003184 -3.8782310869609633 0.91126829543696874 5.5587700098327568 -3.9239412013802486 0.80819036098413599 5.5492411536025896 -3.7179815005925412 1.0157594065487838 5.6003978160350272 -3.7636916150118265 0.91268147209595074 5.6515544784674656 -3.8094017294311118 0.80960353764311788 3.5982634043609534 -5.3154413850702715 1.401763929677702 3.6271508401202919 -5.3804226349344351 1.2986644056416361 3.6560382758796317 -5.4454038847985995 1.19556488160557 3.6849257116389706 -5.5103851346627621 1.092465357569504 3.7053173670406547 -5.2262948704694443 1.4032630738946048 3.7342048027999937 -5.2912761203336078 1.3001635498585389 3.7630922385593331 -5.3562573701977723 1.1970640258224727 3.791979674318672 -5.4212386200619349 1.0939645017864068 3.8208671100780114 -5.4862198699260976 0.99086497775034066 3.8497545458373503 -5.5512011197902611 0.88776545371427429 3.8123713297203565 -5.1371483558686171 1.4047622181115076 3.8412587654796955 -5.2021296057327806 1.3016626940754414 3.8701462012390344 -5.267110855596945 1.1985631700393755 3.8990336369983734 -5.3320921054611077 1.0954636460033094 3.9279210727577127 -5.3970733553252703 0.99236412196724333 3.9194252924000583 -5.0480018412677898 1.4062613623284104 3.9483127281593973 -5.1129830911319534 1.3031618382923442 3.9772001639187358 -5.1779643409961178 1.2000623142562781 4.0060875996780752 -5.2429455908602804 1.0969627902202121 4.0349750354374141 -5.3079268407244431 0.993863266184146 4.0264792550797601 -4.9588553266669635 1.4077605065453129 4.0553666908390991 -5.0238365765311261 1.304660982509247 4.0842541265984371 -5.0888178263952906 1.2015614584731809 4.1131415623577769 -5.1537990762594532 1.0984619344371147 4.1335332177594619 -4.8697088120661363 1.4092596507622157 4.1624206535188009 -4.9346900619302989 1.3061601267261496 4.1913080892781389 -4.9996713117944633 1.2030606026900834 4.2405871804391637 -4.780562297465309 1.4107587949791183 4.2694746161985027 -4.8455435473294717 1.3076592709430523 4.2983620519578407 -4.9105247971936352 1.2045597469069862 4.3476411431188655 -4.6914157828644827 1.4122579391960211 4.3765285788782045 -4.7563970327286453 1.3091584151599549 4.4546951057985673 -4.6022692682636555 1.4137570834129236 3.8834281925404324 -5.612243827119002 0.78467825291135262 3.957974770578423 -5.4610948955589667 0.88926760074895039 4.0000906410206154 -5.5151905506827692 0.78620213644962578 4.074637219058606 -5.3640416191227338 0.89079148428722355 4.1167530895007989 -5.4181372742465364 0.78772601998789893 4.1491837970965966 -5.2128926875626984 0.99538083212482165 4.1912996675387895 -5.266988342686501 0.8923153678254967 4.2334155379809824 -5.3210839978103044 0.78924990352617208 4.2237303751345863 -5.0617437560026621 1.0999701799624195 4.26584624557678 -5.1158394111264656 0.9969047156630948 4.3079621160189729 -5.1699350662502681 0.89383925136376985 4.3500779864611658 -5.2240307213740724 0.79077378706444523 4.3403928236147697 -4.9646904795664293 1.1014940635006927 4.3825086940569635 -5.0187861346902327 0.99842859920136795 4.4246245644991564 -5.0728817898140361 0.895363134902043 4.4667404349413493 -5.1269774449378396 0.79229767060271838 4.4149394016527603 -4.813541548006393 1.2060834113382906 4.4570552720949532 -4.8676372031301964 1.1030179470389658 4.499171142537147 -4.9217328582539999 0.9999524827396411 4.5412870129793399 -4.9758285133778033 0.89688701844031615 4.5834028834215319 -5.0299241685016076 0.79382155414099143 4.4894859796907509 -4.6623926164463576 1.3106727591758884 4.5316018501329438 -4.7164882715701602 1.2076072948765637 4.5737177205751367 -4.7705839266939645 1.104541830577239 4.6158335910173296 -4.824679581817767 1.0014763662779143 4.6579494614595225 -4.8787752369415713 0.8984109019785893 4.7000653319017154 -4.9328708920653748 0.79534543767926458 4.774611909939706 -4.7817219605053385 0.89993478551686246 4.816727780381898 -4.8358176156291428 0.79686932121753762 2.5095431800811783 -5.9165441758291299 1.3877620703095179 2.5318979091127702 -5.9822559738683223 1.2847627060046458 2.5542526381443627 -6.0479677719075147 1.1817633416997739 2.5766073671759546 -6.113679569946707 1.0787639773949018 2.598962096207547 -6.1793913679858985 0.97576461309002982 2.6213168252391394 -6.2451031660250917 0.87276524878515749 2.6308825955058044 -5.8505113676079539 1.3893211586805363 2.6532373245373968 -5.9162231656471462 1.2863217943756642 2.6755920535689892 -5.9819349636863386 1.1833224300707923 2.6979467826005812 -6.047646761725531 1.0803230657659202 2.7203015116321732 -6.1133585597647233 0.97732370146104819 2.7426562406637656 -6.1790703578039166 0.87432433715617586 2.752222010930431 -5.7844785593867778 1.3908802470515547 2.7745767399620234 -5.8501903574259702 1.2878808827466826 2.7969314689936158 -5.9159021554651625 1.1848815184418107 2.8192861980252077 -5.9816139535043549 1.0818821541369386 2.8416409270567997 -6.0473257515435481 0.97888278983206656 2.8735614263550575 -5.7184457511656017 1.392439335422573 2.8959161553866499 -5.7841575492047941 1.2894399711177009 2.9182708844182419 -5.8498693472439873 1.186440606812829 2.9406256134498339 -5.9155811452831797 1.0834412425079569 2.9949008417796836 -5.6524129429444265 1.3939984237935914 3.017255570811276 -5.7181247409836189 1.2909990594887193 3.039610299842868 -5.7838365390228113 1.1879996951838472 3.06196502887446 -5.8495483370620036 1.0850003308789753 3.1162402572043102 -5.5863801347232505 1.3955575121646098 3.1385949862359026 -5.6520919327624428 1.2925581478597377 3.1609497152674946 -5.7178037308016361 1.1895587835548656 3.2375796726289363 -5.5203473265020753 1.3971166005356279 3.2599344016605287 -5.5860591245412676 1.294117236230756 3.3589190880535629 -5.4543145182808992 1.3986756889066463 3.3812738170851553 -5.5200263163200924 1.2956763246017742 3.480258503478189 -5.388281710059724 1.4002347772776644 2.6441570696852033 -6.3105627480307742 0.76975620617253082 2.7689470920498023 -6.242737415062364 0.77124650983577236 2.866396518982842 -6.1117903469230681 0.87583556651123562 2.8937371144144017 -6.1749120820939538 0.77273681349901402 2.9638459459158812 -5.9808432787837722 0.9804246231866991 2.9911865413474414 -6.0439650139546579 0.87732587017447727 3.0185271367790008 -6.1070867491255427 0.77422711716225567 3.0886359682804803 -5.913017945815362 0.98191492684994075 3.1159765637120405 -5.9761396809862477 0.87881617383771882 3.1433171591435998 -6.0392614161571325 0.77571742082549722 3.1860853952135195 -5.782070877676067 1.086503983525404 3.2134259906450797 -5.8451926128469518 0.9834052305131824 3.2407665860766399 -5.9083143480178366 0.88030647750096047 3.2681071815081992 -5.9714360831887214 0.77720772448873887 3.2835348221465592 -5.6511238095367711 1.1910930402008675 3.310875417578119 -5.7142455447076568 1.0879942871886457 3.3382160130096787 -5.7773672798785416 0.98489553417642406 3.3655566084412389 -5.8404890150494264 0.88179678116420201 3.3928972038727983 -5.9036107502203112 0.77869802815198041 3.4083248445111587 -5.5832984765683609 1.1925833438641089 3.435665439942718 -5.6464202117392466 1.0894845908518873 3.4630060353742782 -5.7095419469101314 0.9863858378396656 3.490346630805838 -5.7726636820810153 0.88328708482744367 3.5176872262373973 -5.8357854172519001 0.78018833181522207 3.505774271444198 -5.4523514084290658 1.2971724005395722 3.5331148668757582 -5.5154731435999507 1.1940736475273506 3.5604554623073175 -5.5785948787708355 1.090974894515129 3.5877960577388772 -5.6417166139417203 0.98787614150290726 3.615136653170437 -5.7048383491126051 0.88477738849068521 3.6424772486019967 -5.7679600842834899 0.78167863547846361 3.7125860801034771 -5.5738912809733092 0.9893664451661488 3.7399266755350364 -5.637013016144194 0.88626769215392687 3.7672672709665962 -5.7001347513150789 0.78316893914170527 1.3816333594287233 -6.2796580641201647 1.3736131181515245 1.38951275778237 -6.3488297316754201 1.2706290193182308 1.397392156136017 -6.4180013992306755 1.1676449204849373 1.4052715544896639 -6.4871730667859309 1.0646608216516438 1.4131509528433108 -6.5563447343411863 0.96167672281835037 1.421030351196958 -6.6255164018964408 0.85869262398505652 1.5231667774814381 -6.2354872723976511 1.3753934170991831 1.5310461758350848 -6.3046589399529065 1.2724093182658893 1.538925574188732 -6.3738306075081619 1.1694252194325958 1.5468049725423787 -6.4430022750634173 1.0664411205993023 1.5546843708960256 -6.5121739426186727 0.96345702176600878 1.6647001955341532 -6.1913164806751375 1.3771737160468416 1.6725795938877996 -6.2604881482303929 1.2741896172135478 1.6804589922414468 -6.3296598157856483 1.1712055183802543 1.6883383905950935 -6.3988314833409046 1.0682214195469608 1.8062336135868682 -6.1471456889526248 1.3789540149945001 1.8141130119405147 -6.2163173565078793 1.2759699161612064 1.8219924102941616 -6.2854890240631356 1.1729858173279128 1.8298718086478085 -6.354660691618391 1.0700017184946191 1.9477670316395832 -6.1029748972301112 1.3807343139421586 1.9556464299932295 -6.1721465647853666 1.2777502151088649 1.9635258283468766 -6.241318232340622 1.1747661162755711 2.0893004496922982 -6.0588041055075976 1.3825146128898169 2.0971798480459447 -6.127975773062853 1.2795305140565234 2.2308338677450132 -6.0146333137850849 1.3842949118374754 2.3723672857977283 -5.9704625220625722 1.3860752107851337 1.567120514095004 -6.5799684942346071 0.86046550081902307 1.6973586655170396 -6.4676583610603595 0.96523546243195835 1.7187234142838426 -6.532754555524269 0.86222939840040591 1.8489615657058782 -6.4204444223500214 0.96699936001334119 1.8703263144726812 -6.4855406168139309 0.86399329598178876 1.9791997171279141 -6.3081342891757739 1.071769321626276 2.0005644658947168 -6.3732304836396834 0.96876325759472404 2.0219292146615198 -6.4383266781035928 0.8657571935631716 2.1094378685499495 -6.1958241560015264 1.176539283239211 2.1308026173167529 -6.2609203504654358 1.0735332192076588 2.1521673660835554 -6.3260165449293453 0.97052715517610677 2.1735321148503584 -6.3911127393932547 0.86752109114455445 2.2396760199719852 -6.0835140228272788 1.2813092448521461 2.2610407687387881 -6.1486102172911883 1.1783031808205937 2.2824055175055915 -6.2137064117550977 1.0752971167890415 2.3037702662723945 -6.2788026062190072 0.97229105275748962 2.3251350150391974 -6.3438988006829167 0.86928498872593729 2.3464997638060008 -6.4089949951468261 0.76627892469438508 2.3912789201608238 -6.0363000841169407 1.2830731424335289 2.4126436689276267 -6.1013962785808502 1.1800670784019764 2.4340084176944301 -6.1664924730447597 1.0770610143704245 2.455373166461233 -6.2315886675086682 0.97405495033887235 2.476737915228036 -6.2966848619725777 0.87104888630732002 2.4981026639948394 -6.3617810564364881 0.76804282227576792 1.0741665457424263 -6.3381389755864888 1.3697320688679493 0.91012662681082845 -6.3557389763914758 1.3675717499039772 0.91900434559725008 -6.4235158384188589 1.2648279069953694 0.74608670787923037 -6.3733389771964628 1.3654114309400052 0.754964426665652 -6.4411158392238459 1.2626675880313973 0.58204678894763251 -6.3909389780014498 1.3632511119760331 0.59092450773405414 -6.4587158400288329 1.2605072690674253 0.59980222652047588 -6.526492702056216 1.1577634261588174 0.41800687001603465 -6.408538978806436 1.361090793012061 0.42688458880245628 -6.4763158408338199 1.2583469501034532 0.43576230758887807 -6.544092702861203 1.1556031071948454 0.4446400263752997 -6.6118695648885852 1.0528592642862376 0.25396695108443657 -6.426138979611423 1.358930474048089 0.26284466987085819 -6.493915841638807 1.2561866311394811 0.27172238865728005 -6.5616927036661892 1.1534427882308733 0.28060010744370167 -6.6294695656935723 1.0506989453222655 0.28947782623012352 -6.6972464277209554 0.94795510241365744 0.089927032152838704 -6.4437389804164091 1.3567701550841171 0.098804750939260277 -6.5115158424437931 1.2540263121755091 0.10768246972568221 -6.5792927044711762 1.1512824692669013 0.11656018851210381 -6.6470695664985593 1.0485386263582932 0.12543790729852575 -6.7148464285259424 0.94579478344968537 0.13431562608494749 -6.7826232905533255 0.84305094054107743 0.29708388465408797 -6.7652639256260949 0.8450385687641081 0.45266143123203606 -6.6798084669230251 0.94999913444177675 0.45971557715066802 -6.7479304030524609 0.84700765139355572 0.60823897780998426 -6.5943530082199544 1.0549597001194451 0.615293123728616 -6.6624749443493911 0.95196821707122437 0.62234726964724796 -6.730596880478827 0.84897673402300333 0.76381652438793257 -6.5088975495168837 1.1599202657971135 0.77087067030656442 -6.5770194856463204 1.0569287827488927 0.77792481622519616 -6.6451414217757572 0.95393729970067198 0.78497896214382812 -6.713263357905193 0.85094581665245084 0.92644821688451251 -6.4915640269432497 1.1618893484265611 0.93350236280314447 -6.5596859630726865 1.0588978653783403 0.94055650872177621 -6.6278078992021232 0.95590638233011949 0.94761065464040806 -6.6959298353315591 0.85291489928189845 1.0820257634624606 -6.406108568240179 1.2668499141042293 1.0890799093810926 -6.4742305043696158 1.1638584310560087 1.0961340552997245 -6.5423524404990525 1.0608669480077879 1.1031882012183563 -6.6104743766284892 0.9578754649595671 1.110242347136988 -6.678596312757926 0.85488398191134596 1.2376033100404091 -6.3206531095371092 1.3718104797818977 1.2446574559590406 -6.3887750456665451 1.2688189967336769 1.2517116018776726 -6.4568969817959827 1.1658275136854561 1.2587657477963043 -6.5250189179254194 1.0628360306372353 1.2658198937149363 -6.5931408540548553 0.95984454758901461 1.272874039633568 -6.661262790184292 0.85685306454079357 -1.1221197938173266 -6.7471474857462024 0.71555812693239929 -1.1356485658738276 -6.7701411731049577 0.59326228668498115 -1.1491773379303283 -6.7931348604637112 0.47096644643756291 -1.1627061099868292 -6.8161285478224656 0.34867060619014456 -1.1762348820433299 -6.83912223518122 0.22637476594272635 -1.1897636540998309 -6.8621159225399744 0.10407892569530816 -0.90455135905406425 -6.7678885197536074 0.71901485749022209 -0.91808013111056519 -6.7908822071123627 0.59671901724280396 -0.93160890316706602 -6.8138758944711162 0.47442317699538578 -0.94513767522356673 -6.8368695818298706 0.35212733674796737 -0.95866644728006756 -6.8598632691886259 0.22983149650054915 -0.68698292429080143 -6.7886295537610124 0.7224715880480449 -0.70051169634730237 -6.8116232411197677 0.60017574780062677 -0.7140404684038032 -6.8346169284785221 0.47787990755320864 -0.46941448952753922 -6.8093705877684183 0.72592831860586782 -0.48294326158403994 -6.8323642751271727 0.60363247835844969 -0.25184605476427702 -6.8301116217758233 0.72938504916369062 -0.032840721496858474 -6.8509919182525305 0.732853139904314 -0.033989370659989991 -6.8751854721846017 0.61065517745324172 -0.035138019823121577 -6.8993790261166739 0.48845721500216938 -0.036286668986253198 -6.9235725800487442 0.36625925255109715 -0.037435318149384826 -6.9477661339808163 0.24406129010002495 -0.038583967312516433 -6.9719596879128876 0.12186332764895257 -0.26434431554763083 -6.8532051850437847 0.60709735618374272 -0.26549296471076217 -6.8773987389758577 0.48489939373267033 -0.26664161387389385 -6.9015922929079281 0.3627014312815981 -0.26779026303702547 -6.9257858468400002 0.2405034688305259 -0.26893891220015703 -6.9499794007720714 0.1183055063794535 -0.49584790959840341 -6.8554184518350407 0.48134157246317127 -0.49699655876153503 -6.879612005767112 0.35914361001209905 -0.49814520792466666 -6.9038055596991841 0.23694564756102682 -0.49929385708779817 -6.9279991136312553 0.11474768510995442 -0.72735150364917567 -6.8576317186262958 0.3555857887426 -0.72850015281230729 -6.881825272558368 0.23338782629152777 -0.7296488019754388 -6.9060188264904392 0.11118986384045536 -0.96000374686307932 -6.8840385393496222 0.10763204257095629 -2.6026023604761868 -6.3477216174187197 0.68908062376669832 -2.6330036104316523 -6.363827571895027 0.56664113187374554 -2.3933558825493506 -6.4104041885187693 0.69290759151626036 -2.4237571325048162 -6.4265101429950766 0.57046809962330758 -2.4541583824602822 -6.4426160974713831 0.44802860773035463 -2.4845596324157477 -6.4587220519476904 0.32558911583740152 -2.5149608823712137 -6.4748280064239978 0.20314962394444852 -2.5453621323266793 -6.4909339609003052 0.080710132051495603 -2.1841094046225145 -6.4730867596188189 0.69673455926582251 -2.21451065457798 -6.4891927140951262 0.57429506737286962 -2.2449119045334456 -6.5052986685714327 0.45185557547991667 -2.2753131544889116 -6.52140462304774 0.32941608358696356 -1.9748629266956779 -6.5357693307188685 0.70056152701538454 -2.0052641766511439 -6.5518752851951758 0.57812203512243165 -2.0356654266066094 -6.5679812396714823 0.45568254322947871 -1.7656164487688411 -6.5984519018189181 0.70438849476494669 -1.7960176987243068 -6.6145578562952254 0.58194900287199369 -1.5563699708420047 -6.6611344729189668 0.70821546251450873 -2.3048276465011766 -6.5377782007580709 0.20698322339775135 -2.3187512207668202 -6.5588571119370487 0.084666961371921062 -2.0635617803207631 -6.5848431709485968 0.33326178444165433 -2.0774853545864072 -6.6059220821275755 0.21094552241582396 -2.0914089288520508 -6.6270009933065532 0.088629260389993636 -1.822295914140349 -6.6319081411391236 0.45954034548555739 -1.8362194884059932 -6.6529870523181014 0.33722408345972693 -1.8501430626716373 -6.67406596349708 0.21490782143389656 -1.8640666369372809 -6.6951448746760578 0.092591559408066224 -1.5810300479599355 -6.6789731113296504 0.58581890652946023 -1.5949536222255796 -6.7000520225086282 0.46350264450362993 -1.6088771964912238 -6.7211309336876059 0.34118638247779948 -1.6228007707568679 -6.7422098448665837 0.21887012045196913 -1.6367243450225117 -6.7632887560455623 0.096553858426138811 -1.3397641817795216 -6.7260380815201763 0.71209746757336323 -1.3536877560451659 -6.747116992699155 0.58978120554753288 -1.3676113303108099 -6.7681959038781319 0.46746494352170254 -1.3815349045764544 -6.7892748150571105 0.34514868149587208 -1.3954584788420983 -6.8103537262360883 0.22283241947004173 -1.4093820531077426 -6.831432637415066 0.10051615744421138 -3.7568474710482538 -5.7416935990275277 0.66482821319329777 -3.7648341475418023 -5.7647601965625954 0.5430436111012592 -3.7728208240353505 -5.7878267940976622 0.42125900900922064 -3.780807500528899 -5.8108933916327299 0.29947440691718191 -3.7887941770224467 -5.8339599891677976 0.17768980482514346 -3.7967808535159953 -5.8570265867028652 0.055905202733104876 -3.6122354851010594 -5.818302086816975 0.66789439111375737 -3.620222161594608 -5.8413686843520427 0.54610978902171881 -3.6282088380881561 -5.8644352818871104 0.42432518692968024 -3.6361955145817046 -5.8875018794221772 0.30254058483764151 -3.6441821910752523 -5.9105684769572449 0.18075598274560309 -3.467623499153865 -5.8949105746064223 0.67096056903421697 -3.4756101756474136 -5.91797717214149 0.54917596694217841 -3.4835968521409617 -5.9410437696765577 0.42739136485013984 -3.4915835286345098 -5.9641103672116254 0.30560676275810117 -3.3230115132066707 -5.9715190623958696 0.67402674695467657 -3.3309981897002192 -5.9945856599309373 0.55224214486263801 -3.3389848661937673 -6.0176522574660058 0.43045754277059944 -3.1783995272594763 -6.0481275501853169 0.67709292487513617 -3.1863862037530248 -6.0711941477203855 0.55530832278309761 -3.194372880246573 -6.0942607452554531 0.43352372069105904 -3.0337875413122819 -6.1247360379747651 0.68015910279559577 -3.0417742178058305 -6.1478026355098336 0.5583745007035571 -2.8891755553650875 -6.2013445257642132 0.68322528071605537 -3.6628005266010462 -5.9280391385030855 0.058584653336462428 -3.5060496697970436 -5.9837665215202751 0.18358646970004366 -3.528854043211735 -5.9990338768837308 0.061262872879283531 -3.349298812993041 -6.0394939045374647 0.30858828606362487 -3.3721031864077324 -6.0547612599009204 0.18626468924286477 -3.3949075598224239 -6.0700286152643752 0.063941092422104634 -3.2153523296037299 -6.11048864291811 0.31126650560644598 -3.2381567030184213 -6.1257559982815657 0.18894290878568587 -3.2609610764331132 -6.1410233536450196 0.066619311964925737 -3.0586014727997273 -6.1662160259353005 0.43626832197002735 -3.0814058462144187 -6.1814833812987553 0.31394472514926708 -3.1042102196291101 -6.1967507366622101 0.19162112832850697 -3.127014593043802 -6.2120180920256649 0.06929753150774684 -2.9018506159957247 -6.2219434089524901 0.5612701383336085 -2.9246549894104161 -6.2372107643159449 0.4389465415128484 -2.9474593628251076 -6.2524781196793997 0.31662294469208818 -2.9702637362397994 -6.2677454750428545 0.19429934787132808 -2.9930681096544909 -6.2830128304063102 0.071975751050567943 -2.7450997591917226 -6.2776707919696797 0.68627195469718971 -2.7679041326064135 -6.2929381473331354 0.5639483578764295 -2.7907085060211054 -6.3082055026965902 0.44162476105566945 -2.8135128794357964 -6.323472858060045 0.31930116423490923 -2.8363172528504883 -6.3387402134234998 0.19697756741414918 -2.8591216262651797 -6.3540075687869546 0.074653970593389046 -2.6567620226317943 -6.3792002410772346 0.44430298059849055 -2.6795663960464857 -6.3944675964406903 0.32197938377773033 -2.7023707694611772 -6.4097349518041451 0.19965578695697028 -2.7251751428758686 -6.4250023071675999 0.077332190136210149 -4.7519585803808573 -4.9169686485788011 0.76186332927584277 -4.7768137526805674 -4.927792546544925 0.63994170301268816 -4.8016689249802775 -4.938616444511049 0.51802007674953354 -4.8265240972799877 -4.949440342477172 0.39609845048637882 -4.8513792695796987 -4.9602642404432968 0.27417682422322404 -4.8762344418794079 -4.9710881384094208 0.15225519796006939 -4.6271518369353046 -5.0186015508569337 0.76496133330615979 -4.6520070092350156 -5.0294254488230576 0.64303970704300517 -4.6768621815347258 -5.0402493467891816 0.52111808077985056 -4.7017173538344359 -5.0510732447553046 0.39919645451669578 -4.7265725261341469 -5.0618971427214285 0.27727482825354105 -4.751427698433857 -5.0727210406875525 0.15535320199038635 -4.5272002657894639 -5.1310583511011902 0.64613771107332207 -4.552055438089174 -5.1418822490673133 0.52421608481016746 -4.5769106103888841 -5.1527061470334372 0.40229445854701273 -4.6017657826885952 -5.1635300449995611 0.28037283228385801 -4.4023935223439121 -5.2326912533793228 0.64923571510363909 -4.4272486946436214 -5.2435151513454459 0.52731408884048447 -4.4521038669433324 -5.2543390493115698 0.40539246257732975 -4.2775867788983604 -5.3343241556574545 0.65233371913395599 -4.3024419511980696 -5.3451480536235776 0.53041209287080138 -4.1527800354528086 -5.4359570579355871 0.65543172316427301 -4.1776352077525178 -5.4467809559017102 0.53351009690111839 -4.0279732920072568 -5.5375899602137189 0.65852972719458991 -4.9007457497297056 -4.9821934834054824 0.030336520864594849 -4.7632830434255622 -5.0941850696465156 0.033543069284095339 -4.6175625164974221 -5.1817681162350651 0.15852889609327506 -4.6258203371214188 -5.2061766558875489 0.036749617703595833 -4.4718419895692829 -5.2693511628236136 0.28351472290245477 -4.4800998101932787 -5.2937597024760983 0.16173544451277555 -4.4883576308172755 -5.3181682421285821 0.039956166123096319 -4.3261214626411437 -5.356934209412163 0.40850054971163463 -4.3343792832651395 -5.3813427490646468 0.2867212713219553 -4.3426371038891354 -5.4057512887171315 0.16494199293227604 -4.3508949245131321 -5.4301598283696153 0.043162714542596806 -4.1886587563370004 -5.4689257956531963 0.41170709813113515 -4.1969165769609962 -5.49333433530568 0.28992781974145582 -4.205174397584992 -5.5177428749581647 0.16814854135177654 -4.2134322182089887 -5.5421514146106485 0.046369262962097292 -4.0429382294088612 -5.5565088422417457 0.53669292494031495 -4.051196050032857 -5.5809173818942295 0.41491364655063567 -4.0594538706568528 -5.6053259215467133 0.29313436816095628 -4.0677116912808486 -5.629734461199198 0.17135508977127703 -4.0759695119048454 -5.6541430008516818 0.049575811381597779 -3.897217702480722 -5.6440918888302951 0.66167875174949464 -3.9054755231047178 -5.6685004284827789 0.53989947335981547 -3.9137333437287136 -5.6929089681352627 0.41812019497013619 -3.9219911643527099 -5.7173175077877465 0.2963409165804568 -3.9302489849767057 -5.7417260474402312 0.1745616381907775 -3.938506805600702 -5.7661345870927159 0.052782359801098265 -5.6970661809969751 -3.8101032548158331 0.73399403296233556 -5.6049459546087546 -3.9214897510420261 0.73675756030699235 -5.629596383788444 -3.9294267228580382 0.61506194352514953 -5.6542468129681325 -3.9373636946740502 0.49336632674330666 -5.678897242147821 -3.9453006664900627 0.37167070996146384 -5.7035476713275104 -3.9532376383060752 0.24997509317962091 -5.7281981005071998 -3.9611746101220877 0.12827947639777812 -5.512825728220534 -4.0328762472682191 0.73952108765164914 -5.5374761574002234 -4.0408132190842316 0.61782547086980633 -5.5621265865799119 -4.0487501909002432 0.4961298540879634 -5.5867770157596004 -4.0566871627162557 0.37443423730612058 -5.6114274449392898 -4.0646241345322682 0.25273862052427765 -5.4207055018323134 -4.1442627434944121 0.74228461499630582 -5.4453559310120028 -4.1521997153104246 0.62058899821446301 -5.4700063601916913 -4.1601366871264363 0.49889338143262013 -5.4946567893713798 -4.1680736589424487 0.37719776465077731 -5.5193072185510692 -4.1760106307584612 0.25550214786893438 -5.3285852754440928 -4.2556492397206052 0.74504814234096262 -5.3532357046237813 -4.2635862115366177 0.6233525255591198 -5.3778861338034707 -4.2715231833526293 0.50165690877727687 -5.4025365629831592 -4.2794601551686418 0.3799612919954341 -5.2364650490558722 -4.3670357359467982 0.7478116696856193 -5.2611154782355607 -4.3749727077628107 0.62611605290377648 -5.2857659074152501 -4.3829096795788223 0.50442043612193366 -5.1443448226676516 -4.4784222321729912 0.75057519703027609 -5.1689952518473401 -4.4863592039890037 0.62887958024843327 -5.1936456810270286 -4.4942961758050153 0.50718396346659034 -5.052224596279431 -4.5898087283991842 0.75333872437493277 -5.0768750254591186 -4.5977457002151967 0.63164310759308995 -4.9601043698912104 -4.7011952246253763 0.75610225171958956 -4.8679841435029889 -4.8125817208515693 0.75886577906424624 -5.7520605253664039 -3.9700994921883819 0.0064950106801136519 -5.635854551243531 -4.0728410831860238 0.13101782367766571 -5.6587575977108111 -4.0829687248345206 0.0091251862825665157 -5.5425516235879382 -4.1857103158321625 0.13364799928011856 -5.5654546700552183 -4.1958379574806592 0.01175536188501938 -5.4263456494650653 -4.2884519068298044 0.25817081227767058 -5.4492486959323454 -4.2985795484783011 0.13627817488257141 -5.4721517423996255 -4.3087071901267979 0.014385537487472243 -5.3101396753421932 -4.3911934978274463 0.38269362527522277 -5.3330427218094725 -4.4013211394759431 0.26080098788012346 -5.3559457682767526 -4.4114487811244398 0.13890835048502426 -5.3788488147440328 -4.4215764227729375 0.017015713089925104 -5.2168367476866004 -4.504062730473585 0.38532380087767565 -5.2397397941538797 -4.5141903721220826 0.26343116348257634 -5.2626428406211598 -4.5243180137705794 0.14153852608747711 -5.2855458870884391 -4.5344456554190771 0.019645888692377971 -5.1006307735637275 -4.6068043214712278 0.50984661387522767 -5.1235338200310077 -4.6169319631197236 0.38795397648012853 -5.1464368664982869 -4.6270596047682213 0.26606133908502916 -5.1693399129655671 -4.637187246416719 0.14416870168992996 -5.1922429594328463 -4.6473148880652158 0.022276064294830835 -4.9844247994408546 -4.7095459124688697 0.63436942687277975 -5.0073278459081347 -4.7196735541173664 0.51247678947768061 -5.0302308923754149 -4.7298011957658623 0.3905841520825814 -5.0531339388426941 -4.73992883741436 0.26869151468748204 -5.0760369853099734 -4.7500564790628577 0.14679887729238281 -5.0989400317772535 -4.7601841207113553 0.024906239897283699 -4.8911218717852618 -4.8224151451150084 0.63699960247523257 -4.914024918252542 -4.832542786763506 0.51510696508013354 -4.9369279647198212 -4.8426704284120019 0.39321432768503428 -4.9598310111871013 -4.8527980700604996 0.27132169028993486 -4.9827340576543806 -4.8629257117089972 0.14942905289483568 -5.0056371041216599 -4.873053353357494 0.027536415499736566 -6.2822582627243673 -2.726011180334786 0.71129035299422705 -6.3136425967330974 -2.7184230491024239 0.58953770203096212 -6.3450269307418274 -2.7108349178700619 0.46778505106769713 -6.3764112647505575 -2.7032467866376999 0.3460324001044322 -6.4077955987592876 -2.6956586554053383 0.22427974914116716 -6.4391799327680186 -2.6880705241729763 0.10252709817790223 -6.2094055836188105 -2.8611178553036116 0.71412676753650106 -6.2407899176275405 -2.8535297240712496 0.59237411657323613 -6.2721742516362706 -2.8459415928388876 0.4706214656099712 -6.3035585856450007 -2.8383534616065256 0.34886881464670627 -6.3349429196537308 -2.830765330374164 0.2271161636834412 -6.3663272536624618 -2.823177199141802 0.10536351272017627 -6.1365529045132536 -2.9962245302724373 0.71696318207877519 -6.1679372385219837 -2.9886363990400753 0.59521053111551026 -6.1993215725307138 -2.9810482678077133 0.47345788015224527 -6.2307059065394439 -2.9734601365753512 0.35170522918898034 -6.262090240548174 -2.9658720053429897 0.22995257822571527 -6.0637002254076968 -3.131331205241263 0.7197995966210492 -6.0950845594164269 -3.1237430740089009 0.59804694565778427 -6.126468893425157 -3.1161549427765389 0.47629429469451934 -6.1578532274338871 -3.1085668115441769 0.35454164373125441 -5.9908475463021391 -3.2664378802100886 0.72263601116332332 -6.0222318803108692 -3.2588497489777266 0.60088336020005839 -6.0536162143195993 -3.251261617745365 0.47913070923679341 -5.9179948671965814 -3.4015445551789143 0.72547242570559733 -5.9493792012053124 -3.3939564239465523 0.60371977474233252 -5.9807635352140425 -3.3863682927141907 0.48196712377906747 -5.8451421880910246 -3.53665123014774 0.72830884024787146 -5.8765265220997547 -3.5290630989153779 0.60655618928460653 -5.7722895089854669 -3.6717579051165656 0.73114525479014547 -6.2882760167703378 -2.967994511322912 0.108236076780338 -6.1857897945747649 -3.1074189305929139 0.23281296770780516 -6.2097684870982395 -3.113664154829523 0.11111181379051564 -6.0833035723791919 -3.2468433498629157 0.35738985863527245 -6.1072822649026666 -3.2530885740995248 0.23568870471798281 -6.1312609574261412 -3.2593337983361339 0.11398755080069328 -6.0047960427070937 -3.3925129933695266 0.36026559564545008 -6.0287747352305683 -3.3987582176061357 0.23856444172816044 -6.0527534277540429 -3.4050034418427444 0.11686328781087091 -5.9023098205115208 -3.5319374126395289 0.48484248657291723 -5.9262885130349954 -3.5381826368761375 0.3631413326556277 -5.95026720555847 -3.5444278611127467 0.24144017873833809 -5.9742458980819446 -3.5506730853493553 0.11973902482104855 -5.7998235983159487 -3.6713618319095307 0.60941937750038444 -5.8238022908394225 -3.6776070561461394 0.48771822358309486 -5.8477809833628971 -3.6838522803827485 0.36601706966580538 -5.8717596758863717 -3.6900975046193571 0.24431591574851572 -5.8957383684098463 -3.6963427288559663 0.12261476183122617 -5.9197170609333218 -3.7025879530925749 0.00091360791393665019 -5.7213160686438504 -3.8170314754161416 0.61229511451056207 -5.7452947611673242 -3.8232766996527503 0.49059396059327254 -5.7692734536907988 -3.829521923889359 0.36889280667598301 -5.7932521462142743 -3.8357671481259681 0.24719165275869337 -5.8172308387377489 -3.8420123723625768 0.12549049884140381 -5.8412095312612236 -3.8482575965991859 0.0037893449241142643 -6.6962575452342783 -1.4544120188981864 0.6879388210299604 -6.7252757588632575 -1.4416553808662234 0.5663672656245915 -6.7542939724922375 -1.4288987428342601 0.44479571021922282 -6.7833121861212176 -1.4161421048022969 0.32322415481385408 -6.8123303997501967 -1.4033854667703336 0.20165259940848521 -6.8413486133791759 -1.3906288287383706 0.080081044003116456 -6.6527680684201096 -1.5960175172974076 0.69051985866304333 -6.6817862820490888 -1.5832608792654446 0.56894830325767443 -6.7108044956780688 -1.5705042412334813 0.44737674785230575 -6.7398227093070489 -1.5577476032015181 0.32580519244693701 -6.768840922936028 -1.5449909651695548 0.20423363704156811 -6.6092785916059418 -1.7376230156966286 0.69310089629612626 -6.6382968052349209 -1.7248663776646658 0.57152934089075735 -6.6673150188639001 -1.7121097396327025 0.44995778548538867 -6.6963332324928801 -1.6993531016007393 0.32838623008001994 -6.7253514461218593 -1.686596463568776 0.20681467467465101 -6.5657891147917731 -1.8792285140958498 0.69568193392920918 -6.5948073284207531 -1.866471876063887 0.57411037852384028 -6.6238255420497323 -1.8537152380319237 0.45253882311847166 -6.6528437556787114 -1.8409585999999605 0.33096726771310286 -6.5222996379776053 -2.020834012495071 0.69826297156229211 -6.5513178516065844 -2.0080773744631082 0.57669141615692332 -6.5803360652355636 -1.9953207364311449 0.45511986075155458 -6.4788101611634366 -2.1624395108942922 0.70084400919537504 -6.5078283747924166 -2.149682872862329 0.57927245379000625 -6.4353206843492687 -2.3040450092935134 0.70342504682845797 -6.4643388979782479 -2.2912883712615502 0.58185349142308929 -6.3918312075351 -2.4456505076927346 0.70600608446154101 -6.7976621456442379 -1.5328992481062651 0.082639309687106671 -6.7533016810781241 -1.677444668901229 0.085119662026317683 -6.6811059188268302 -1.8307539263739614 0.20930831364491995 -6.7089412165120104 -1.8219900896961931 0.087600014365528694 -6.6089101565755355 -1.9840631838466938 0.33349696526352235 -6.6367454542607165 -1.9752993471689253 0.21178866598413096 -6.6645807519458975 -1.9665355104911573 0.090080366704739706 -6.5367143943242407 -2.1373724413194259 0.45768561688212467 -6.5645496920094217 -2.1286086046416579 0.33597731760273336 -6.5923849896946027 -2.1198447679638894 0.21426901832334197 -6.6202202873797837 -2.1110809312861214 0.092560719043950718 -6.492353929758127 -2.2819178621143901 0.46016596922133568 -6.520189227443308 -2.273154025436622 0.33845766994194437 -6.548024525128489 -2.2643901887588536 0.21674937066255298 -6.5758598228136709 -2.2556263520810855 0.095041071383161729 -6.4201581675068331 -2.4352271195871222 0.58435462083993794 -6.4479934651920141 -2.4264632829093542 0.46264632156054669 -6.4758287628771951 -2.4176994462315857 0.34093802228115538 -6.5036640605623761 -2.4089356095538177 0.21922972300176399 -6.5314993582475571 -2.4001717728760492 0.097521423722372727 -6.3479624052555383 -2.5885363770598548 0.70854327245854021 -6.3757977029407193 -2.5797725403820864 0.5868349731791489 -6.4036330006259004 -2.5710087037043179 0.46512667389975765 -6.4314682983110822 -2.5622448670265499 0.3434183746203664 -6.4593035959962632 -2.5534810303487814 0.221710075340975 -6.4871388936814443 -2.5447171936710133 0.10000177606158372 -6.8591327782666385 -0.085540265857061648 0.66583210813014171 -6.8856104661139392 -0.062082875397460935 0.54433470271386308 -6.9120881539612409 -0.038625484937860111 0.42283729729758451 -6.9385658418085407 -0.015168094478259397 0.30133989188130594 -6.8436365898172049 -0.23793070774150782 0.66828062340564665 -6.8701142776645057 -0.21447331728190711 0.54678321798936802 -6.8965919655118073 -0.19101592682230628 0.42528581257308945 -6.9230696533591081 -0.16755853636270546 0.30378840715681094 -6.9495473412064097 -0.14410114590310477 0.18229100174053225 -6.8281404013677713 -0.39032114962595377 0.67072913868115158 -6.8546180892150721 -0.36686375916635305 0.54923173326487296 -6.8810957770623737 -0.34340636870675223 0.42773432784859444 -6.9075734649096745 -0.31994897824715141 0.30623692243231593 -6.9340511527569761 -0.29649158778755075 0.18473951701603725 -6.8126442129183378 -0.54271159151039972 0.67317765395665652 -6.8391219007656394 -0.519254201050799 0.55168024854037789 -6.8655995886129402 -0.49579681059119818 0.43018284312409938 -6.8920772764602418 -0.47233942013159735 0.30868543770782086 -6.7971480244689042 -0.69510203339484566 0.67562616923216146 -6.8236257123162058 -0.67164464293524495 0.55412876381588294 -6.8501034001635075 -0.64818725247564413 0.43263135839960437 -6.7816518360194706 -0.84749247527929206 0.67807468450766639 -6.8081295238667732 -0.82403508481969134 0.55657727909138788 -6.766155647570038 -0.99988291716373801 0.68052319978317133 -6.7506594591206044 -1.152273359048184 0.68297171505867627 -6.9759610149199993 -0.12130190153276432 0.060789536253759706 -6.9598122685374237 -0.28040146258843035 0.063196663306752832 -6.9180168105869955 -0.45441492914377635 0.18715390010986083 -6.9436635221548482 -0.43950102364409627 0.06560379035974595 -6.8762213526365672 -0.62842839569912246 0.31111113691296904 -6.9018680642044199 -0.61351449019944226 0.18956102716285395 -6.9275147757722717 -0.59860058469976229 0.068010917412739069 -6.8344258946861389 -0.80244186225446856 0.43506837371607704 -6.8600726062539916 -0.78752795675478837 0.31351826396596216 -6.8857193178218443 -0.77261405125510818 0.19196815421584706 -6.9113660293896961 -0.75770014575542821 0.070418044465732188 -6.7926304367357115 -0.97645532880981456 0.55902561051918509 -6.8182771483035634 -0.96154142331013437 0.43747550076907016 -6.843923859871416 -0.94662751781045418 0.31592539101895528 -6.8695705714392679 -0.9317136123107741 0.19437528126884018 -6.8952172830071197 -0.91679970681109413 0.072825171518725307 -6.7764816903531351 -1.1355548898654804 0.56143273757217815 -6.8021284019209878 -1.1206409843658003 0.43988262782206328 -6.8277751134888405 -1.1057270788661202 0.3183325180719484 -6.8534218250566923 -1.0908131733664401 0.1967824083218333 -6.8790685366245441 -1.07589926786676 0.075232298571718439 -6.7346862324027068 -1.3095683564208265 0.68538997437528615 -6.7603329439705595 -1.2946544509211464 0.56383986462517122 -6.7859796555384122 -1.2797405454214661 0.4422897548750564 -6.811626367106264 -1.264826639921786 0.32073964512494146 -6.8372730786741158 -1.2499127344221059 0.19918953537482642 -6.8629197902419676 -1.2349988289224259 0.077639425624711558 -6.7452595714615526 1.28085268007247 0.64645276851435618 -6.7666883651196201 1.3083007103274751 0.52513206334567253 -6.7881171587776867 1.3357487405824804 0.40381135817698882 -6.7597416643086703 1.1294785213797707 0.6485992437695689 -6.7811704579667378 1.156926551634776 0.52727853860088525 -6.8025992516248044 1.1843745818897811 0.40595783343220154 -6.8240280452828719 1.2118226121447864 0.28463712826351784 -6.8454568389409385 1.2392706423997915 0.16331642309483407 -6.774223757155788 0.97810436268707135 0.65074571902478162 -6.7956525508138554 1.0055523929420769 0.52942501385609797 -6.8170813444719229 1.0330004231970817 0.40810430868741421 -6.8385101381299895 1.060448453452087 0.28678360351873056 -6.859938931788057 1.0878964837070921 0.16546289835004679 -6.7887058500029056 0.82673020399437225 0.65289219427999434 -6.8101346436609731 0.85417823424937755 0.53157148911131069 -6.8315634373190406 0.88162626450438253 0.41025078394262693 -6.8529922309771081 0.90907429475938772 0.28893007877394328 -6.8031879428500242 0.67535604530167292 0.65503866953520706 -6.8246167365080908 0.70280407555667823 0.5337179643665233 -6.8460455301661591 0.73025210581168321 0.41239725919783959 -6.8176700356971418 0.5239818866089736 0.65718514479041967 -6.8390988293552093 0.55142991686397891 0.53586443962173602 -6.8321521285442603 0.37260772791627444 0.65933162004563239 -6.846634221391378 0.22123356922357512 0.661478095300845 -6.8669348277748066 1.2662489694820998 0.041980970471284115 -6.8817195928364718 1.1119849725654902 0.044036712341552264 -6.8746878032637548 0.93397518972698212 0.16752940019891921 -6.8965043578981371 0.9577209756488807 0.046092454211820413 -6.8676560136910378 0.75596540688847425 0.29102208805628621 -6.8894725683254201 0.7797111928103726 0.16958514206918737 -6.9112891229598024 0.80345697873227118 0.048148196082088562 -6.8606242241183208 0.57795562404996625 0.41451477591365316 -6.8824407787527031 0.60170140997186472 0.29307782992655435 -6.9042573333870854 0.62544719589376319 0.17164088393945551 -6.9260738880214685 0.64919298181566165 0.050203937952356711 -6.853592434545603 0.39994584121145843 0.53800746377102004 -6.8754089891799861 0.42369162713335684 0.41657051778392129 -6.8972255438143684 0.44743741305525531 0.29513357179682248 -6.9190420984487506 0.47118319897715377 0.17369662580972367 -6.9408586530831338 0.49492898489905224 0.05225967982262486 -6.8683771996072682 0.24568184429484891 0.54006320564128818 -6.8901937542416514 0.26942763021674726 0.41862625965418943 -6.9120103088760336 0.29317341613864573 0.29718931366709067 -6.9338268635104168 0.31691920206054419 0.17575236767999181 -6.9556434181447999 0.34066498798244266 0.054315421692893009 -6.8613454100345512 0.067672061456341068 0.66355589349865518 -6.8831619646689335 0.09141784737823952 0.54211894751155643 -6.9049785193033166 0.11516363330013792 0.42068200152445756 -6.9267950739376989 0.13890941922203637 0.29924505553735881 -6.948611628572082 0.16265520514393481 0.17780810955025997 -6.9704281832064652 0.18640099106583324 0.056371163563161152 -6.9633963936337482 0.0083912082273253797 0.1798638514205281 -6.9852129482681313 0.032136994149223795 0.058426905433429301 -6.3432067013332141 2.5749265597677127 0.75149073858057369 -6.3583979953173593 2.6074746661639603 0.63032465004952132 -6.3735892893015054 2.6400227725602088 0.50915856151846917 -6.3872925314143707 2.4283762123329895 0.75327807445029549 -6.4024838253985159 2.4609243187292376 0.63211198591924311 -6.417675119382662 2.4934724251254861 0.51094589738819096 -6.4328664133668081 2.5260205315217332 0.38977980885713892 -6.4480577073509542 2.5585686379179817 0.26861372032608682 -6.4632490013350994 2.5911167443142298 0.14744763179503459 -6.4313783614955273 2.2818258648982663 0.75506541032001739 -6.4465696554796725 2.3143739712945144 0.63389932178896502 -6.4617609494638186 2.3469220776907629 0.51273323325791287 -6.4769522434479656 2.3794701840870101 0.39156714472686077 -6.4921435374321108 2.4120182904832586 0.27040105619580868 -6.5073348314162569 2.4445663968795066 0.14923496766475641 -6.475464191576684 2.1352755174635432 0.75685274618973919 -6.4906554855608292 2.1678236238597917 0.63568665765868682 -6.5058467795449753 2.2003717302560402 0.51452056912763466 -6.5210380735291222 2.2329198366522873 0.39335448059658262 -6.5362293675132683 2.2654679430485358 0.27218839206553053 -6.5195500216578406 1.9887251700288202 0.7586400820594611 -6.5347413156419867 2.0212732764250685 0.63747399352840872 -6.5499326096261328 2.053821382821317 0.51630790499735657 -6.5651239036102798 2.0863694892175646 0.39514181646630447 -6.5636358517389972 1.8421748225940973 0.76042741792918289 -6.5788271457231433 1.8747229289903455 0.63926132939813052 -6.5940184397072894 1.907271035386594 0.51809524086707837 -6.6077216818201547 1.6956244751593741 0.7622147537989048 -6.6229129758043008 1.7281725815556224 0.64104866526785242 -6.6518075119013123 1.5490741277246511 0.76400208966862659 -6.6669988058854583 1.5816222341208994 0.64283600113757422 -6.4785201792754403 2.6234045749417376 0.026277046714979553 -6.5238778744569874 2.4727102706662576 0.027992791191116428 -6.5524475947476271 2.2946701230050102 0.15096449899020789 -6.5692355696385345 2.3220159663907776 0.029708535667253302 -6.5810173150382667 2.1166299753437623 0.27393620678929947 -6.5978052899291741 2.1439758187295306 0.15268024346634476 -6.6145932648200816 2.171321662115298 0.031424280143390174 -6.6095870353289063 1.9385898276825144 0.39690791458839092 -6.6263750102198138 1.9659356710682825 0.27565195126543635 -6.6431629851107212 1.9932815144540506 0.15439598794248163 -6.6599509600016287 2.020627357839818 0.033140024619527045 -6.638156755619546 1.7605496800212665 0.51987962238748231 -6.6549447305104534 1.7878955234070346 0.39862365906452779 -6.6717327054013609 1.8152413667928027 0.27736769574157322 -6.6885206802922692 1.8425872101785707 0.1561117324186185 -6.7053086551831766 1.8699330535643381 0.034855769095663923 -6.6835144508010931 1.6098553757457867 0.52159536686361918 -6.7003024256920005 1.6372012191315548 0.40033940354066466 -6.717090400582908 1.6645470625173229 0.27908344021771009 -6.7338783754738163 1.6918929059030909 0.15782747689475538 -6.7506663503647246 1.7192387492888583 0.036571513571800801 -6.7120841710917327 1.4318152280845389 0.64456707466271068 -6.7288721459826402 1.4591610714703067 0.52331111133975605 -6.7456601208735476 1.486506914856075 0.40205514801680153 -6.7624480957644559 1.5138527582418428 0.28079918469384701 -6.7792360706553634 1.5411986016276109 0.15954322137089225 -6.7960240455462717 1.5685444450133785 0.038287258047937672 -6.807805790946003 1.363158453966363 0.28251492916998389 -6.8245937658369114 1.3905042973521309 0.16125896584702915 -6.8413817407278188 1.4178501407378987 0.040003002524074543 -5.7032823719484123 3.7972601262934238 0.73972057684218151 -5.775347311929691 3.6618936251044936 0.74101240849032901 -5.7839460647209862 3.6966049152195528 0.62004417699820402 -5.7925448175122796 3.7313162053346125 0.49907594550607931 -5.801143570303573 3.7660274954496717 0.37810771401395454 -5.8097423230948664 3.800738785564731 0.25713948252182983 -5.8183410758861607 3.8354500756797902 0.13617125102970498 -5.826939828677455 3.8701613657948495 0.015203019537580244 -5.8474122519109697 3.5265271239155638 0.74230424013847651 -5.8560110047022649 3.561238414030623 0.62133600864635152 -5.8646097574935583 3.5959497041456823 0.50036777715422687 -5.8732085102848517 3.630660994260742 0.3793995456621021 -5.881807263076146 3.6653722843758012 0.25843131416997739 -5.8904060158674394 3.70008357449086 0.13746308267785248 -5.9194771918922484 3.3911606227266335 0.74359607178662412 -5.9280759446835436 3.4258719128416928 0.62262784029449914 -5.936674697474837 3.460583202956752 0.50165960880237437 -5.9452734502661313 3.4952944930718113 0.38069137731024966 -5.9538722030574247 3.530005783186871 0.25972314581812495 -5.9915421318735271 3.2557941215377033 0.74488790343477163 -6.0001408846648223 3.290505411652763 0.62391967194264664 -6.0087396374561166 3.3252167017678222 0.50295144045052198 -6.01733839024741 3.3599279918828815 0.38198320895839721 -6.0636070718548059 3.1204276203487735 0.74617973508291924 -6.072205824646101 3.1551389104638328 0.62521150359079425 -6.0808045774373953 3.189850200578892 0.50424327209866948 -6.1356720118360855 2.9850611191598437 0.74747156673106674 -6.1442707646273798 3.019772409274903 0.62650333523894175 -6.1528695174186741 3.0544836993899622 0.50553510374681709 -6.2077369518173651 2.8496946179709135 0.74876339837921435 -6.2163357046086594 2.8844059080859723 0.62779516688708936 -6.2798018917986438 2.7143281167819837 0.75005523002736185 -5.9004533345053076 3.7321186666509334 0.016414175900291927 -5.9635478683887797 3.5627274977888628 0.13869493760712029 -5.9740395339250796 3.5939416674733007 0.017621283723345333 -6.0266424022722509 3.3933363289267922 0.26097569931394882 -6.0371340678085517 3.4245504986112301 0.1399020454301737 -6.0476257333448515 3.455764668295668 0.018828391546398739 -6.089736936155723 3.223945160064722 0.38325646102077715 -6.1002286016920237 3.2551593297491594 0.26218280713700221 -6.1107202672283236 3.2863734994335974 0.14110915325322712 -6.1212119327646244 3.3175876691180353 0.020035499369452144 -6.1633231355754949 3.0857681608870893 0.38446356884383054 -6.1738148011117957 3.1169823305715267 0.26338991496005559 -6.1843064666480965 3.1481965002559646 0.14231626107628054 -6.1947981321843972 3.1794106699404026 0.02124260719250555 -6.226417669458967 2.9163769920250187 0.50674433055065893 -6.2369093349952678 2.9475911617094566 0.38567067666688393 -6.2474010005315677 2.978805331393894 0.26459702278310898 -6.2578926660678684 3.0100195010783319 0.14352336889933393 -6.2683843316041692 3.0412336707627698 0.022449715015558955 -6.2895122033424391 2.7469858231629476 0.62902509225748726 -6.3000038688787399 2.7781999928473859 0.50795143837371237 -6.3104955344150397 2.8094141625318234 0.38687778448993732 -6.3209871999513405 2.8406283322162613 0.26580413060616237 -6.3314788654876413 2.8718425019006992 0.14473047672238734 -6.341970531023942 2.9030566715851371 0.023656822838612361 -6.3840817338348126 2.6712371633541907 0.3880848923129907 -6.3945733993711134 2.7024513330386286 0.26701123842921581 -6.4050650649074132 2.7336655027230665 0.14593758454544073 -6.415556730443714 2.7648796724075044 0.024863930661665767 -4.927312027428087 4.7477774669438269 0.73487193306987109 -4.9288717113279166 4.7835509984766658 0.61413644041110993 -4.9304313952277461 4.8193245300095038 0.49340094775234905 -4.9319910791275756 4.8550980615423418 0.37266545509358817 -4.9335507630274051 4.8908715930751807 0.25192996243482724 -4.9351104469272347 4.9266451246080196 0.13119446977606619 -5.0244577444820431 4.6292169010810067 0.73547496021883374 -5.0260174283818726 4.6649904326138456 0.61473946756007258 -5.0275771122817021 4.7007639641466836 0.49400397490131176 -5.0291367961815316 4.7365374956795216 0.37326848224255083 -5.0306964800813612 4.7723110272123606 0.25253298958378995 -5.0322561639811907 4.8080845587451995 0.1317974969250289 -5.1216034615359991 4.5106563352181865 0.73607798736779639 -5.1231631454358286 4.5464298667510255 0.61534249470903524 -5.1247228293356581 4.5822033982838635 0.49460700205027441 -5.1262825132354877 4.6179769298167015 0.37387150939151353 -5.1278421971353181 4.6537504613495404 0.25313601673275266 -5.2187491785899551 4.3920957693553664 0.73668101451675905 -5.2203088624897847 4.4278693008882053 0.615945521857998 -5.2218685463896142 4.4636428324210433 0.49521002919923712 -5.2234282302894437 4.4994163639538822 0.37447453654047619 -5.3158948956439112 4.2735352034925462 0.73728404166572181 -5.3174545795437407 4.3093087350253851 0.61654854900696066 -5.3190142634435702 4.3450822665582232 0.49581305634819978 -5.4130406126978672 4.1549746376297261 0.73788706881468447 -5.4146002965976967 4.190748169162565 0.61715157615592342 -5.4161599804975262 4.2265217006954039 0.49641608349716249 -5.5101863297518232 4.0364140717669059 0.73849009596364723 -5.5117460136516527 4.0721876032997448 0.61775460330488607 -5.6073320468057792 3.9178535059040858 0.73909312311260988 -5.0354992656777409 4.8418279884066511 0.010994228300173887 -5.1305719304804542 4.6881129827498027 0.13235341679516391 -5.1348621039442905 4.7205937060537568 0.011507992087169107 -5.2256445952831667 4.5343979770929534 0.2537126052901541 -5.2299347687470039 4.5668787003969085 0.13286718058215913 -5.2342249422108402 4.5993594237008626 0.012021755874164326 -5.3207172600858792 4.380682971436106 0.3750717937851441 -5.3250074335497155 4.4131636947400592 0.25422636907714935 -5.3292976070135527 4.4456444180440142 0.13338094436915435 -5.3335877804773899 4.4781251413479684 0.012535519661159546 -5.4200800983524289 4.2594486890832117 0.37558555757213935 -5.4243702718162652 4.291929412387165 0.2547401328641446 -5.4286604452801015 4.32441013569112 0.13389470815614957 -5.4329506187439387 4.3568908589950741 0.013049283448154765 -5.5151527631551405 4.1057336834263634 0.49694474606712935 -5.5194429366189786 4.1382144067303175 0.3760993213591346 -5.5237331100828149 4.1706951300342707 0.25525389665113984 -5.5280232835466512 4.2031758533382257 0.13440847194314479 -5.5323134570104884 4.2356565766421799 0.013563047235149985 -5.6102254279578538 3.9520186777695145 0.61830393456211941 -5.6145156014216901 3.9844994010734691 0.4974585098541246 -5.6188057748855273 4.0169801243774232 0.37661308514612984 -5.6230959483493637 4.0494608476813765 0.25576766043813504 -5.6273861218132009 4.0819415709853315 0.13492223573014001 -5.6316762952770372 4.1144222942892856 0.014076811022145204 -5.7095882662244026 3.8307843954166203 0.61881769834911471 -5.7138784396882389 3.8632651187205749 0.49797227364111984 -5.7181686131520761 3.895745842024529 0.37712684893312509 -5.7224587866159125 3.9282265653284831 0.25628142422513028 -5.7267489600797497 3.9607072886324377 0.13543599951713522 -5.7310391335435868 3.9931880119363918 0.014590574809140423 -3.8723562314496283 5.6450855383933165 0.73747316395273399 -3.8667877679505733 5.6804983260319863 0.61703208702361934 -3.8612193044515193 5.7159111136706553 0.49659101009450496 -3.8556508409524648 5.7513239013093234 0.37614993316539058 -3.9915044418258727 5.5473993008449911 0.73709761457390177 -3.9859359783268178 5.582812088483661 0.61665653764478701 -3.9803675148277637 5.6182248761223299 0.49621546071567268 -3.9747990513287088 5.653637663760998 0.37577438378655831 -3.9692305878296543 5.689050451399666 0.25533330685744393 -3.9636621243305994 5.724463239038335 0.13489222992832947 -4.1106526522021172 5.4497130632966657 0.73672206519506944 -4.1050841887030618 5.4851258509353356 0.61628098826595479 -4.0995157252040082 5.5205386385740045 0.49583991133684041 -4.0939472617049528 5.5559514262126726 0.37539883440772603 -4.0883787982058983 5.5913642138513406 0.25495775747861166 -4.2298008625783616 5.3520268257483403 0.73634651581623722 -4.2242323990793063 5.3874396133870093 0.61590543888712246 -4.2186639355802527 5.4228524010256782 0.49546436195800814 -4.2130954720811973 5.4582651886643463 0.37502328502889376 -4.3489490729546061 5.2543405882000149 0.73597096643740489 -4.3433806094555507 5.2897533758386839 0.61552988950829024 -4.3378121459564962 5.3251661634773519 0.49508881257917586 -4.3322436824574417 5.3605789511160209 0.37464773565006149 -4.4680972833308505 5.1566543506516895 0.73559541705857268 -4.4625288198317952 5.1920671382903585 0.61515434012945791 -4.4569603563327407 5.2274799259290265 0.49471326320034359 -4.5872454937070941 5.0589681131033641 0.73521986767974035 -4.5816770302080396 5.0943809007420331 0.61477879075062569 -4.7063937040833386 4.9612818755550379 0.73484431830090813 -3.9592316695374699 5.7589532370165779 0.014407612567353843 -4.0833961086300272 5.6263020085335871 0.1344942687265861 -4.0810434337125789 5.659107174246544 0.013930155108131241 -4.2075605477225846 5.4936507800505971 0.25458092488581852 -4.2052078728051363 5.5264559457635531 0.13401681126736351 -4.202855197887688 5.55926111147651 0.01345269764890864 -4.3293723118976937 5.3938047172805632 0.2541034674265959 -4.3270196369802454 5.4266098829935192 0.13353935380814091 -4.3246669620627971 5.4594150487064761 0.012975240189686038 -4.453536750990251 5.2611534887975724 0.37419012358582815 -4.4511840760728028 5.2939586545105293 0.25362600996737328 -4.4488314011553545 5.3267638202234853 0.13306189634891832 -4.4464787262379062 5.3595689859364422 0.012497782730463437 -4.5777011900828093 5.1285022603145825 0.4942767797450604 -4.5753485151653601 5.1613074260275384 0.37371266612660553 -4.5729958402479118 5.1941125917404953 0.25314855250815071 -4.5706431653304636 5.2269177574534513 0.13258443888969573 -4.5682904904130153 5.2597229231664073 0.012020325271240835 -4.7018656291753667 4.9958510318315934 0.61436343590429265 -4.6995129542579184 5.0286561975445485 0.49379932228583778 -4.6971602793404692 5.0614613632575045 0.37323520866738291 -4.6948076044230209 5.0942665289704614 0.2526710950489281 -4.6924549295055726 5.1270716946834174 0.13210698143047314 -4.6901022545881244 5.1598768603963734 0.011542867812018236 -4.826030068267924 4.8631998033486026 0.73445009206352518 -4.8236773933504757 4.8960049690615586 0.61388597844507009 -4.8213247184330266 4.9288101347745137 0.49332186482661516 -4.8189720435155783 4.9616153004874706 0.37275775120816035 -4.81661936859813 4.9944204662004266 0.25219363758970553 -4.8142666936806817 5.0272256319133826 0.13162952397125052 -4.8119140187632334 5.0600307976263394 0.011065410352795634 -4.9337257829383416 4.9601847348563046 0.010587952893573033 -2.6525236839133011 6.3122057960898337 0.75286757121111192 -2.6401369615066379 6.3457753552799332 0.63280643815512627 -2.7890055277833645 6.2396570147441146 0.75107532715780978 -2.7766188053767014 6.2732265739342141 0.63101419410182402 -2.7642320829700382 6.3067961331243128 0.5109530610458386 -2.751845360563375 6.3403656923144123 0.39089192798985323 -2.7394586381567123 6.3739352515045109 0.27083079493386786 -2.7270719157500487 6.4075048106946095 0.15076966187788232 -2.714685193343386 6.4410743698847082 0.030708528821896938 -2.925487371653428 6.1671082333983955 0.74928308310450753 -2.9131006492467648 6.2006777925884951 0.62922195004852177 -2.9007139268401017 6.2342473517785937 0.50916081699253646 -2.8883272044334385 6.2678169109686932 0.38909968393655103 -2.8759404820267758 6.3013864701587918 0.26903855088056566 -2.8635537596201126 6.3349560293488905 0.14897741782458013 -3.0619692155234919 6.0945594520526765 0.74749083905120539 -3.0495824931168287 6.128129011242776 0.62742970599521963 -3.0371957707101656 6.1616985704328746 0.50736857293923421 -3.0248090483035024 6.1952681296229741 0.38730743988324884 -3.0124223258968397 6.2288376888130728 0.26724630682726347 -3.1984510593935553 6.0220106707069574 0.74569859499790314 -3.1860643369868922 6.0555802298970569 0.62563746194191738 -3.173677614580229 6.0891497890871555 0.50557632888593207 -3.1612908921735658 6.1227193482772551 0.38551519582994664 -3.3349329032636188 5.9494618893612383 0.743906350944601 -3.3225461808569556 5.9830314485513378 0.62384521788861524 -3.3101594584502925 6.0166010077414365 0.50378408483262982 -3.4714147471336823 5.8769131080155192 0.74211410689129875 -3.4590280247270191 5.9104826672056179 0.62205297383531299 -3.6078965910037462 5.8043643266698002 0.74032186283799661 -3.7443784348738096 5.7318155453240811 0.73852961878469436 -2.8540054944687117 6.3670327221828948 0.028807932101355835 -3.0023260714712472 6.2612025926988455 0.14709773954463448 -2.9935282482546031 6.2928845959476805 0.026899607138396668 -3.1506466484737827 6.155372463214797 0.26538754698791328 -3.1418488252571386 6.1870544664636311 0.14518941458167534 -3.1330510020404945 6.2187364697124661 0.024991282175437501 -3.2989672254763183 6.0495423337307477 0.38367735443119194 -3.2901694022596741 6.0812243369795826 0.26347922202495411 -3.28137157904303 6.1129063402284167 0.14328108961871619 -3.2725737558263859 6.1445883434772517 0.023082957212478335 -3.4472878024788542 5.9437122042466992 0.50196716187447066 -3.4384899792622097 5.9753942074955333 0.38176902946823277 -3.4296921560455655 6.0070762107443683 0.26157089706199493 -3.4208943328289214 6.0387582139932023 0.14137276465575704 -3.4120965096122773 6.0704402172420373 0.021174632249519168 -3.5956083794813893 5.837882074762649 0.62025696931774932 -3.5868105562647461 5.8695640780114848 0.50005883691151143 -3.5780127330481015 5.9012460812603189 0.37986070450527359 -3.5692149098314574 5.9329280845091539 0.25966257209903576 -3.5604170866148133 5.964610087757988 0.13946443969279787 -3.5516192633981687 5.9962920910068229 0.019266307286559998 -3.7351311332672807 5.7637339485274355 0.61834864435479009 -3.7263333100506371 5.7954159517762704 0.49815051194855225 -3.7175354868339929 5.8270979550251045 0.37795237954231442 -3.7087376636173488 5.8587799582739395 0.25775424713607659 -3.6999398404007047 5.8904619615227745 0.13755611472983872 -3.6911420171840601 5.9221439647716094 0.017357982323600831 -3.8482604174032398 5.784631832038726 0.25584592217311747 -3.8394625941865956 5.816313835287561 0.13564778976687955 -3.8306647709699515 5.8479958385363959 0.015449657360641664 -1.431801275367079 6.7081785608364086 0.66346780844106623 -1.4124149621879492 6.7387952080224593 0.54389109258711565 -1.3930286490088197 6.7694118552085092 0.42431437673316508 -1.3736423358296899 6.800028502394559 0.3047376608792145 -1.5823073836333039 6.6633149036657171 0.65963978878739526 -1.5629210704541743 6.6939315508517678 0.54006307293344469 -1.5435347572750446 6.7245481980378177 0.42048635707949411 -1.5241484440959148 6.7551648452238675 0.30090964122554353 -1.5047621309167849 6.7857814924099173 0.18133292537159285 -1.7328134918995288 6.6184512464950256 0.6558117691337243 -1.7134271787203992 6.6490678936810763 0.53623505327977372 -1.6940408655412695 6.6796845408671262 0.41665833742582314 -1.6746545523621394 6.710301188053176 0.29708162157187257 -1.6552682391830098 6.7409178352392258 0.17750490571792185 -1.8833196001657542 6.5735875893243332 0.65198374948005333 -1.8639332869866245 6.6042042365103839 0.53240703362610275 -1.8445469738074947 6.6348208836964346 0.41283031777215218 -1.8251606606283648 6.6654375308824845 0.2932536019182016 -2.0338257084319791 6.5287239321536417 0.64815572982638237 -2.0144393952528494 6.5593405793396924 0.52857901397243179 -1.9950530820737196 6.5899572265257422 0.40900229811848121 -2.2037181298773336 6.4532436277968994 0.7639044260266622 -2.184331816698204 6.4838602749829501 0.6443277101727114 -2.1649455035190743 6.5144769221690009 0.52475099431876082 -2.3542242381435585 6.4083799706262079 0.76007640637299123 -2.3348379249644289 6.4389966178122577 0.64049969051904043 -2.5047303464097843 6.3635163134555164 0.75624838671932026 -1.4858150705094855 6.8162679889788942 0.061741246618804986 -1.6400460649716471 6.7703006478521264 0.057786340810043788 -1.8094659679404133 6.6949603507423516 0.17355113308669984 -1.7942770594338087 6.7243333067253586 0.053831435001282582 -1.9788858709091794 6.6196200536325778 0.28931592536335604 -1.9636969624025746 6.6489930096155838 0.16959622727793866 -1.9485080538959703 6.6783659655985907 0.049876529192521377 -2.1483057738779454 6.544279756522803 0.40508071764001213 -2.133116865371341 6.57365271250581 0.28536101955459486 -2.1179279568647362 6.603025668488816 0.16564132146917745 -2.1027390483581319 6.6323986244718229 0.045921623383760171 -2.3177256768467114 6.4689394594130292 0.52084550991666811 -2.302536768340107 6.4983124153960352 0.40112581183125096 -2.2873478598335026 6.5276853713790421 0.28140611374583369 -2.2721589513268978 6.5570583273620482 0.16168641566041625 -2.2569700428202935 6.5864312833450551 0.041966717574998973 -2.4871455798154778 6.3935991623032535 0.63661030219332426 -2.471956671308873 6.4229721182862605 0.51689060410790688 -2.4567677628022686 6.4523450742692674 0.39717090602248972 -2.4415788542956642 6.4817180302522743 0.27745120793707245 -2.4263899457890594 6.5110909862352804 0.15773150985165507 -2.4112010372824551 6.5404639422182873 0.038011811766237774 -2.6261876657710346 6.3770047771594927 0.51293569829914576 -2.6109987572644302 6.4063777331424996 0.39321600021372854 -2.5958098487578258 6.4357506891255056 0.27349630212831127 -2.580620940251221 6.4651236451085117 0.15377660404289389 -2.5654320317446166 6.4944966010915186 0.034056905957476569 -0.14690072003030807 6.843585356290121 0.7136116648241817 -0.12037273438174656 6.8698762002748319 0.59457399129052835 -0.093844748733185157 6.8961670442595437 0.47553631775687494 -0.067316763084623532 6.9224578882442547 0.35649864422322153 -0.040788777436061796 6.9487487322289656 0.23746097068956795 -0.014260791787500143 6.9750395762136774 0.11842329715591456 -0.30773380461285194 6.8290289601935532 0.70715515270707996 -0.28120581896429042 6.8553198041782641 0.5881174791734266 -0.25467783331572891 6.881610648162976 0.4690798056397732 -0.22814984766716728 6.9079014921476869 0.35004213210611979 -0.20162186201860563 6.9341923361323978 0.23100445857246621 -0.17509387637004409 6.9604831801171096 0.11196678503881283 -0.46856688919539602 6.8144725640969845 0.70069864058997822 -0.44203890354683451 6.8407634080816964 0.58166096705632486 -0.41551091789827288 6.8670542520664073 0.46262329352267145 -0.38898293224971126 6.8933450960511191 0.34358561998901804 -0.36245494660114969 6.91963594003583 0.22454794645536444 -0.62939997377793988 6.7999161680004168 0.69424212847287647 -0.60287198812937826 6.8262070119851277 0.57520445493922312 -0.57634400248081663 6.8524978559698395 0.45616678140556971 -0.54981601683225501 6.8787886999545504 0.3371291078719163 -0.79023305836048374 6.785359771903849 0.68778561635577473 -0.76370507271192212 6.8116506158885599 0.56874794282212138 -0.73717708706336038 6.8379414598732708 0.44971026928846797 -0.95106614294302771 6.7708033758072803 0.68132910423867299 -0.92453815729446587 6.7970942197919912 0.56229143070501963 -1.1118992275255719 6.7562469797107125 0.67487259212157125 -0.3399192243180964 6.9455507914989942 0.10542374687951381 -0.52703967278933395 6.9047262132448415 0.21801012339503109 -0.50527968755434727 6.9305680055678494 0.098869110936259191 -0.7141601212605716 6.8639016349906878 0.33059649991054851 -0.6924001360255847 6.8897434273136966 0.21145548745177645 -0.67064015079059802 6.9155852196367045 0.092314474993004575 -0.90128056973180892 6.8230770567365351 0.4431828764260658 -0.87952058449682236 6.8489188490595438 0.3240418639672939 -0.85776059926183557 6.8747606413825517 0.2049008515085218 -0.83600061402684889 6.9006024337055596 0.085759839049749959 -1.0884010182030468 6.7822524784823814 0.55576925294158308 -1.0666410329680602 6.8080942708053902 0.43662824048281113 -1.0448810477330737 6.833936063128399 0.31748722802403923 -1.0231210624980869 6.8597778554514068 0.19834621556526716 -1.0013610772631001 6.8856196477744156 0.079205203106495314 -1.2755214666742842 6.7414279002282287 0.66835562945710036 -1.2537614814392977 6.7672696925512374 0.54921461699832852 -1.2320014962043111 6.7931114848742453 0.43007360453955651 -1.2102415109693245 6.818953277197255 0.31093259208078461 -1.1884815257343377 6.8447950695202628 0.19179157962201251 -1.166721540499351 6.8706368618432707 0.072650567163240684 -1.3538419889705884 6.8298122835891188 0.1852369436787579 -1.3320820037356018 6.8556540759121267 0.066095931219986068 1.2190964674994882 6.7479012073152012 0.66375093973425348 1.2534543054899137 6.7681115740186284 0.5451342911354794 1.2878121434803398 6.7883219407220565 0.42651764253670543 1.3221699814707653 6.8085323074254847 0.3079009939379313 1.3565278194611909 6.8287426741289128 0.18928434533915728 1.0522857125128833 6.7660947469209196 0.6548821384864536 1.0866435505033087 6.7863051136243469 0.53626548988767953 1.1210013884937349 6.806515480327775 0.4176488412889055 1.1553592264841603 6.8267258470312031 0.29903219269013137 1.189717064474586 6.8469362137346312 0.1804155440913574 0.8511171195358529 6.7640779198232099 0.76462998583742758 0.88547495752627847 6.7842882865266381 0.64601333723865362 0.91983279551670405 6.8044986532300653 0.52739668863987954 0.95419063350712996 6.8247090199334934 0.40878004004110557 0.98854847149755554 6.8449193866369216 0.2901633914423315 0.68430636454924809 6.7822714594289284 0.75576118458962771 0.71866420253967367 6.8024818261323565 0.63714453599085374 0.75302204053009936 6.8226921928357838 0.51852788739207967 0.78737987852052505 6.8429025595392119 0.3999112387933057 0.51749560956264318 6.8004649990346469 0.74689238334182773 0.55185344755306875 6.820675365738075 0.62827573474305376 0.58621128554349455 6.8408857324415022 0.50965908614427968 0.35068485457603826 6.8186585386403653 0.73802358209402785 0.38504269256646395 6.8388689053437934 0.61940693349525389 0.18387409958943352 6.8368520782460829 0.72915478084622787 1.2230424217074995 6.8672489652873967 0.061795404655887641 1.0216973891845771 6.8652496346284275 0.17154265546146669 1.0502053291028799 6.8860401002135028 0.05290622824821728 0.82035235666165451 6.8632503039694575 0.2812899062670457 0.84886029657995732 6.8840407695545336 0.16265347905379632 0.87736823649826023 6.9048312351396088 0.044017051840546918 0.61900732413873194 6.8612509733104874 0.39103715707262487 0.64751526405703463 6.8820414388955635 0.2724007298593753 0.67602320397533755 6.9028319044806397 0.15376430264612595 0.70453114389364035 6.9236223700657149 0.03512787543287655 0.41766229161580948 6.8592516426515164 0.500784407878204 0.44617023153411223 6.8800421082365935 0.38214798066495448 0.47467817145241492 6.9008325738216696 0.26351155345170496 0.50318611137071778 6.9216230394067457 0.14487512623845558 0.53169405128902048 6.942413504991821 0.026238699025206185 0.21631725909288702 6.8572523119925464 0.61053165868378301 0.24482519901118971 6.8780427775776225 0.4918952314705336 0.27333313892949246 6.8988332431626995 0.37325880425728414 0.30184107884779521 6.9196237087477757 0.25462237704403456 0.33034901876609812 6.9404141743328518 0.13598594983078521 0.35885695868440071 6.9612046399179279 0.01734952261753582 0.014972226569964449 6.8552529813335754 0.72027890948936202 0.043480166488267094 6.8760434469186524 0.60164248227611261 0.071988106406569718 6.8968339125037295 0.4830060550628632 0.10049604632487252 6.9176243780888056 0.36436962784961374 0.1290039862431753 6.9384148436738817 0.2457332006363642 0.15751192616147816 6.9592053092589579 0.12709677342311482 0.1860198660797808 6.979995774844034 0.008460346209865445 2.5091053085309709 6.3663749153341342 0.73601396467871194 2.5488075671593418 6.3788940281486974 0.61727458052964268 2.588509825787713 6.3914131409632597 0.49853519638057336 2.6282120844160839 6.4039322537778229 0.37979581223150394 2.3491201586663317 6.4167813639978739 0.72694760922628987 2.3888224172947021 6.4293004768124371 0.60820822507722061 2.4285246759230734 6.4418195896269994 0.48946884092815124 2.4682269345514447 6.4543387024415626 0.37072945677908181 2.5079291931798156 6.466857815256124 0.2519900726300125 2.5476314518081868 6.4793769280706863 0.13325068848094324 2.1891350088016925 6.4671878126616136 0.7178812537738678 2.2288372674300629 6.4797069254761768 0.59914186962479854 2.2685395260584342 6.4922260382907391 0.48040248547572911 2.3082417846868055 6.5047451511053023 0.36166310132665969 2.3479440433151764 6.5172642639198637 0.24292371717759037 2.0291498589370534 6.5175942613253532 0.70881489832144573 2.0688521175654238 6.5301133741399164 0.59007551417237647 2.108554376193795 6.5426324869544787 0.47133613002330704 2.1482566348221663 6.555151599769041 0.35259674587423762 1.8691647090724139 6.5680007099890929 0.69974854286902355 1.9088669677007846 6.5805198228036561 0.58100915871995429 1.9485692263291556 6.5930389356182184 0.46226977457088492 1.7091795592077743 6.6184071586528326 0.69068218741660137 1.7488818178361449 6.6309262714673958 0.57194280326753211 1.5491944093431349 6.6688136073165722 0.6816158319641793 2.5851687653198101 6.4925419890760612 0.014563419910469945 2.3852430538634906 6.5305004266667206 0.12424218514829694 2.4194130813824701 6.5446701747092266 0.0056359754723183395 2.1853173424071719 6.5684588642573809 0.23392095038612382 2.2194873699261506 6.5826286122998861 0.11531474071014533 1.9853916309508532 6.6064173018480403 0.3435997156239507 2.0195616584698319 6.6205870498905464 0.22499350594797221 2.0537316859888106 6.6347567979330515 0.10638729627199373 1.7854659194945341 6.6443757394386997 0.45327848086177774 1.8196359470135133 6.6585454874812058 0.33467227118579912 1.853805974532492 6.6727152355237118 0.21606606150982061 1.8879760020514706 6.686884983566217 0.097459851833842134 1.585540208038215 6.6823341770293592 0.56295724609960462 1.6197102355571942 6.6965039250718652 0.44435103642362611 1.6538802630761733 6.7106736731143712 0.32574482674764749 1.6880502905951522 6.7248434211568773 0.207138617071669 1.7222203181141309 6.7390131691993824 0.088532407395690543 1.3856144965818959 6.7202926146200177 0.67263601133743145 1.4197845241008751 6.7344623626625237 0.55402980166145299 1.4539545516198544 6.7486321107050298 0.43542359198547453 1.4881245791388333 6.7628018587475367 0.31681738230949591 1.5222946066578125 6.7769716067900427 0.1982111726335174 1.5564646341767912 6.7911413548325479 0.079604962957538952 1.3907089502394516 6.8432695404657142 0.070677518519387361 3.6969209204893714 5.7718620357875077 0.67312807036876365 3.7378534016860638 5.776791526564609 0.55369226649593861 3.7787858828827572 5.7817210173417113 0.43425646262311346 3.8197183640794501 5.7866505081188127 0.31482065875028842 3.860650845276143 5.791579998895914 0.19538485487746338 3.5552966534143464 5.8491065690163211 0.66624578827485859 3.5962291346110389 5.8540360597934225 0.54680998440203354 3.6371616158077322 5.8589655505705247 0.42737418052920845 3.6780940970044251 5.8638950413476261 0.30793837665638335 3.719026578201118 5.8688245321247283 0.18850257278355831 3.4136723863393215 5.9263511022451345 0.65936350618095352 3.4546048675360144 5.9312805930222359 0.53992770230812848 3.4955373487327073 5.9362100837993381 0.42049189843530344 3.5364698299294002 5.9411395745764395 0.30105609456247834 3.2720481192642965 6.0035956354739479 0.65248122408704845 3.3129806004609894 6.0085251262510502 0.53304542021422341 3.3539130816576828 6.0134546170281515 0.41360961634139837 3.0894913709925791 6.07591067792566 0.76503474586596854 3.1304238521892715 6.0808401687027613 0.64559894199314338 3.1713563333859645 6.0857696594798636 0.52616313812031845 2.9478671039175541 6.1531552111544734 0.75815246377206347 2.988799585114247 6.1580847019315748 0.63871665989923843 3.0297320663109399 6.1630141927086779 0.51928085602641338 2.8062428368425292 6.2303997443832877 0.75127018167815851 2.8471753180392221 6.2353292351603891 0.63183437780533336 2.6646185697675047 6.3076442776121011 0.74438789958425344 3.7595887440144105 5.8739470515348433 0.069088639624237447 3.577133229238092 5.946209325551572 0.181636182583821 3.6140739256856604 5.9532195528790455 0.062436132299780338 3.3946777144617739 6.0184715995683007 0.29418372554340438 3.4316184109093419 6.0254818268957742 0.17498367525936387 3.4685591073569104 6.0324920542232476 0.055783624975323229 3.2122221996854559 6.0907338735850303 0.40673126850298774 3.2491628961330239 6.0977441009125029 0.28753121821894728 3.2861035925805919 6.1047543282399763 0.16833116793490677 3.3230442890281604 6.1117645555674498 0.04913111765086612 3.0667073813567058 6.1700063749292324 0.40007876117853064 3.1036480778042739 6.177016602256705 0.28087871089449018 3.1405887742518419 6.1840268295841785 0.16167866061044966 3.1775294706994104 6.191037056911652 0.042478610326409011 2.8842518665803873 6.242268648945962 0.51262630413811427 2.9211925630279554 6.2492788762734346 0.39342625385407354 2.9581332594755234 6.2562891036009072 0.27422620357003308 2.9950739559230914 6.2632993309283806 0.15502615328599254 3.0320146523706599 6.2703095582558541 0.035826103001951895 2.7017963518040693 6.3145309229626907 0.62517384709769763 2.7387370482516373 6.3215411502901642 0.50597379681365706 2.7756777446992054 6.3285513776176368 0.38677374652961644 2.8126184411467734 6.3355616049451102 0.26757369624557598 2.8495591375943414 6.3425718322725828 0.14837364596153543 2.8864998340419099 6.3495820596000563 0.029173595677494793 2.6671036228180234 6.4148341062893124 0.26092118892111882 2.7040443192655914 6.421844333616785 0.1417211386370783 2.7409850157131599 6.4288545609442584 0.022521088353037687 4.8036184294246622 4.8869154387476605 0.71366430611859866 4.8444959022054404 4.88414031060816 0.59349939377398908 4.6828907957310753 4.9870908670344276 0.70938123605155023 4.7237682685118534 4.9843157388949271 0.58921632370694066 4.7646457412926324 4.9815406107554274 0.46905141136233103 4.8055232140734105 4.9787654826159278 0.34888649901772151 4.8464006868541887 4.9759903544764281 0.22872158667311199 4.8872781596349677 4.9732152263369285 0.10855667432850233 4.5621631620374883 5.0872662953211947 0.70509816598450181 4.6030406348182673 5.0844911671816941 0.58493325363989224 4.6439181075990454 5.0817160390421945 0.46476834129528261 4.6847955803798245 5.0789409109026948 0.34460342895067309 4.7256730531606026 5.0761657827631952 0.22443851660606354 4.4414355283439022 5.1874417236079617 0.70081509591745339 4.4823130011246803 5.1846665954684612 0.58065018357284381 4.5231904739054585 5.1818914673289616 0.46048527122823418 4.5640679466862375 5.1791163391894619 0.34032035888362466 4.3207078946503152 5.2876171518947288 0.69653202585040497 4.3615853674310943 5.2848420237552283 0.57636711350579539 4.4024628402118724 5.2820668956157286 0.45620220116118576 4.1999802609567283 5.3877925801814959 0.69224895578335655 4.2408577337375073 5.3850174520419962 0.57208404343874697 4.2817352065182854 5.3822423239024966 0.45191913109413734 4.0792526272631413 5.4879680084682629 0.68796588571630812 4.1201301000439203 5.4851928803287633 0.56780097337169855 3.9585249935695552 5.58814343675503 0.6836828156492597 4.7658844679683785 5.0739278083000139 0.10431056879741699 4.6045689438342796 5.1766448261681139 0.22017633998617678 4.6420385632285335 5.1766180188191742 0.1002005549010084 4.4432534197001807 5.279361844036214 0.33604211117493643 4.4807230390944346 5.2793350366872742 0.2160663260897682 4.5181926584886885 5.2793082293383344 0.096090541004599822 4.3194075149603357 5.3820520545553743 0.33193209727852785 4.3568771343545896 5.3820252472064345 0.21195631219335961 4.3943467537488434 5.3819984398574947 0.09198052710819124 4.1580919908262359 5.4847690724234743 0.44779786846728747 4.1955616102204907 5.4847422650745346 0.32782208338211927 4.2330312296147445 5.4847154577255948 0.20784629829695103 4.2705008490089984 5.4846886503766559 0.087870513211782658 3.996776466692137 5.5874860902915744 0.56366363965604727 4.0342460860863909 5.5874592829426346 0.44368785457087889 4.0717157054806457 5.5874324755936948 0.32371206948571069 4.1091853248748986 5.587405668244755 0.20373628440054245 4.1466549442691525 5.5873788608958161 0.083760499315374076 3.8354609425580382 5.6902031081596744 0.679529410844807 3.8729305619522916 5.6901763008107347 0.55955362575963874 3.9104001813465454 5.6901494934617958 0.43957784067447031 3.9478698007408002 5.690122686112856 0.3196020555893021 3.9853394201350532 5.6900958787639162 0.19962627050413384 4.0228090395293075 5.6900690714149773 0.07965048541896548 3.8989631347894615 5.7927592819341376 0.075540471522556898 5.692190479637393 3.8159214542260176 0.73438776721446652 5.5945591532332273 3.9355795024400209 0.73216389159712092 5.6337260409108847 3.9255286355542411 0.61142804009643525 5.6728929285885412 3.9154777686684605 0.49069218859574942 5.7120598162661977 3.9054269017826804 0.3699563370950637 5.7512267039438543 3.8953760348968998 0.24922048559437804 5.7903935916215108 3.8853251680111192 0.12848463409369221 5.4969278268290616 4.0552375506540246 0.72994001597977531 5.536094714506719 4.0451866837682449 0.60920416447908965 5.5752616021843755 4.0351358168824643 0.48846831297840382 5.614428489862032 4.0250849499966836 0.3677324614777181 5.6535953775396885 4.015034083110903 0.24699660997703246 5.6927622652173451 4.0049832162251224 0.1262607584763466 5.3992965004248958 4.1748955988680283 0.72771614036242971 5.4384633881025533 4.1648447319822486 0.60698028886174404 5.4776302757802098 4.154793865096468 0.48624443736105821 5.5167971634578663 4.1447429982106874 0.36550858586037249 5.5559640511355228 4.1346921313249068 0.24477273435968688 5.3016651740207301 4.294553647082032 0.7254922647450841 5.3408320616983875 4.2845027801962523 0.60475641324439844 5.3799989493760441 4.2744519133104708 0.48402056174371261 5.4191658370537006 4.2644010464246902 0.36328471024302694 5.2040338476165644 4.4142116952960357 0.7232683891277385 5.2432007352942218 4.404160828410256 0.60253253762705283 5.2823676229718792 4.3941099615244745 0.48179668612636706 5.1064025212123996 4.5338697435100395 0.72104451351039289 5.145569408890057 4.5238188766242589 0.60030866200970723 5.0087711948082339 4.6535277917240432 0.7188206378930474 4.911139868404069 4.773185839938046 0.71659676227570179 5.7302107463316281 3.9969954116999862 0.0056236838424459853 5.5937225773727413 4.1263320968299464 0.12411783781654859 5.6304556684469205 4.1192031660407329 0.003521884991768605 5.4572344084138544 4.2556687819599066 0.24261199179065132 5.4939674994880336 4.2485398511706931 0.1220160389658712 5.5307005905622129 4.2414109203814796 0.0014200861410912243 5.3207462394549685 4.3850054670898659 0.36110614576475392 5.3574793305291468 4.3778765363006533 0.24051019293997392 5.394212421603326 4.3707476055114398 0.1199142401151938 5.1842580704960817 4.5143421522198262 0.47960029973885654 5.2209911615702609 4.5072132214306126 0.35900434691407651 5.2577242526444392 4.5000842906414 0.23840839408929651 5.2944573437186184 4.4929553598521865 0.11781244126451641 5.0477699015371948 4.6436788373497864 0.59809445371295933 5.0845029926113741 4.6365499065605729 0.47749850088817913 5.1212360836855533 4.6294209757713594 0.35690254806339911 5.1579691747597316 4.6222920449821467 0.2363065952386191 5.1947022658339108 4.6151631141929332 0.11571064241383902 4.9480148236524872 4.7658865916905331 0.59599265486228192 4.9847479147266665 4.7587576609013196 0.47539670203750173 5.0214810058008457 4.7516287301121061 0.3548007492127217 5.058214096875024 4.7444997993228935 0.23420479638794173 5.0949471879492032 4.7373708685336808 0.11360884356316163 4.8849928368419597 4.8809654152420672 0.47329490318682432 4.9217259279161372 4.8738364844528528 0.35269895036204429 4.9584590189903164 4.8667075536636402 0.23210299753726432 4.9951921100644956 4.8595786228744275 0.11150704471248425 6.2743339027808371 2.7283969000472523 0.7409135218187054 6.3111553972439269 2.7103723780486817 0.61978997045978124 6.3479768917070158 2.6923478560501102 0.49866641910085685 6.3847983861701056 2.6743233340515391 0.37754286774193269 6.2018611031036128 2.8643229536923265 0.74010629098843994 6.2386825975667026 2.8462984316937558 0.61898273962951578 6.2755040920297915 2.8282739096951843 0.49785918827059145 6.3123255864928813 2.8102493876966133 0.37673563691166728 6.3491470809559702 2.7922248656980422 0.25561208555274312 6.38596857541906 2.7742003436994711 0.13448853419381887 6.1293883034263885 3.0002490073374006 0.73929906015817448 6.1662097978894783 2.98222448533883 0.61817550879925032 6.2030312923525672 2.9641999633402585 0.49705195744032604 6.239852786815657 2.9461754413416874 0.37592840608140188 6.2766742812787468 2.9281509193431163 0.25480485472247777 6.0569155037491642 3.1361750609824748 0.73849182932790902 6.093736998212254 3.1181505389839042 0.61736827796898497 6.1305584926753429 3.1001260169853326 0.49624472661006064 6.1673799871384336 3.0821014949867616 0.37512117525113647 5.9844427040719399 3.2721011146275489 0.73768459849764356 6.0212641985350306 3.2540765926289783 0.61656104713871951 6.0580856929981195 3.2360520706304068 0.49543749577979523 6.0949071874612093 3.2180275486318357 0.37431394442087113 5.9119699043947156 3.4080271682726231 0.73687736766737821 5.9487913988578063 3.3900026462740525 0.61575381630845416 5.9856128933208952 3.3719781242754814 0.49463026494952977 5.8394971047174922 3.5439532219176972 0.73607013683711275 5.876318599180582 3.5259286999191262 0.6149465854781887 5.7670243050402688 3.6798792755627714 0.73526290600684741 6.4219923775169256 2.7576539127910489 0.013399003485960013 6.3130158423019029 2.9110156942368772 0.13370177196624586 6.3476251892252948 2.897090190495307 0.01267256612551155 6.2040393070868793 3.0643774756827056 0.25400454044653187 6.2386486540102721 3.0504519719411349 0.13297533460579739 6.273258000933664 3.0365264681995647 0.01194612876506309 6.1296721187952485 3.2038137533869633 0.25327810308608339 6.1642814657186413 3.1898882496453926 0.13224889724534891 6.1988908126420332 3.1759627459038224 0.011219691404614627 6.0206955835802249 3.3571755348327916 0.37358087156636927 6.0553049305036177 3.343250031091221 0.25255166572563492 6.0899142774270105 3.3293245273496503 0.13152245988490047 6.1245236243504024 3.3153990236080801 0.010493254044166164 5.9117190483652013 3.51053731627862 0.49388364004665514 5.9463283952885941 3.4966118125370493 0.37285443420592079 5.9809377422119869 3.4826863087954787 0.25182522836518645 6.0155470891353797 3.468760805053908 0.13079602252445199 6.0501564360587716 3.4548353013123378 0.0097668166837177016 5.8027425131501769 3.6638990977244483 0.61418640852694117 5.8373518600735705 3.6499735939828777 0.49315720268620661 5.8719612069969633 3.6360480902413075 0.37212799684547232 5.9065705539203561 3.6221225864997368 0.25109879100473798 5.941179900843748 3.6081970827581658 0.13006958516400355 5.9757892477671408 3.5942715790165956 0.0090403793232692389 5.7283753248585469 3.803335375428706 0.61345997116649265 5.7629846717819389 3.7894098716871354 0.49243076532575814 5.7975940187053325 3.7754843679455652 0.37140155948502385 5.8322033656287244 3.7615588642039945 0.2503723536442895 5.8668127125521172 3.7476333604624239 0.12934314780355508 5.9014220594755091 3.7337078567208533 0.0083139419628207763 5.8270548711838783 3.873144134425111 0.0075875046023723145 6.6969527717604462 1.4163654712786937 0.74037024780433325 6.7293985250765793 1.3921958895569895 0.61896565848560192 6.7618442783927142 1.3680263078352854 0.49756106916687043 6.6524466433592755 1.5629866701736954 0.74051079549300591 6.6848923966754086 1.5388170884519914 0.61910620617427459 6.7173381499915426 1.5146475067302871 0.49770161685554309 6.7497839033076756 1.4904779250085831 0.37629702753681171 6.7822296566238087 1.4663083432868791 0.25489243821808039 6.8146754099399418 1.4421387615651751 0.13348784889934892 6.6079405149581039 1.7096078690686971 0.74065134318167858 6.6403862682742378 1.6854382873469933 0.61924675386294725 6.6728320215903709 1.6612687056252891 0.49784216454421576 6.705277774906504 1.637099123903585 0.37643757522548438 6.7377235282226371 1.612929542181881 0.25503298590675305 6.5634343865569331 1.856229067963699 0.74079189087035124 6.5958801398730662 1.832059486241995 0.61938730155161992 6.6283258931891993 1.807889904520291 0.49798271223288842 6.6607716465053333 1.7837203227985869 0.37657812291415704 6.6932173998214664 1.7595507410768829 0.25517353359542572 6.5189282581557624 2.0028502668587009 0.74093243855902391 6.5513740114718955 1.9786806851369967 0.61952784924029258 6.5838197647880286 1.9545111034152929 0.49812325992156109 6.6162655181041616 1.9303415216935886 0.37671867060282971 6.4744221297545907 2.1494714657537028 0.74107298624769657 6.5068678830707238 2.1253018840319986 0.61966839692896525 6.5393136363868569 2.1011323023102948 0.4982638076102337 6.42991600135342 2.2960926646487043 0.74121353393636924 6.4623617546695531 2.2719230829270005 0.61980894461763791 6.3854098729522484 2.4427138635437062 0.74135408162504191 6.8469249147995157 1.418606243751577 0.012097748628492298 6.7701449580690056 1.5888389195764865 0.13363019239280946 6.8015355052759157 1.5680947595859196 0.012303509071925523 6.7247555485454056 1.7383274354108291 0.13383595283624269 6.7561460957523156 1.717583275420262 0.012509269515358749 6.6479755918148955 1.9085601112357389 0.25536839660055999 6.6793661390218055 1.8878159512451718 0.13404171327967593 6.7107566862287156 1.8670717912546047 0.012715029958791972 6.5711956350843854 2.0787927870606486 0.37690084036487714 6.6025861822912955 2.0580486270700815 0.25557415704399322 6.6339767294982055 2.0373044670795144 0.13424747372310916 6.6653672767051155 2.0165603070889473 0.012920790402225197 6.4944156783538745 2.2490254628855584 0.4984332841291943 6.5258062255607854 2.2282813028949913 0.37710660080831038 6.5571967727676954 2.2075371429044242 0.25577991748742646 6.5885873199746054 2.186792982913857 0.1344532341665424 6.6199778671815155 2.1660488229232899 0.013126550845658421 6.4176357216233644 2.4192581387104681 0.61996572789351156 6.4490262688302744 2.398513978719901 0.49863904457262753 6.4804168160371853 2.3777698187293339 0.37731236125174356 6.5118073632440954 2.3570256587387668 0.25598567793085969 6.5431979104510054 2.3362814987481997 0.1346589946099756 6.5745884576579154 2.3155373387576326 0.013332311289091646 6.3408557648928543 2.589490814535377 0.74149817165782872 6.3722463120997652 2.5687466545448103 0.6201714883369448 6.4036368593066744 2.5480024945542432 0.49884480501606071 6.4350274065135853 2.5272583345636765 0.37751812169517679 6.4664179537204953 2.5065141745731094 0.25619143837429287 6.4978085009274054 2.4857700145825423 0.13486475505340884 6.5291990481343154 2.4650258545919752 0.013538071732524869 6.4210285441968944 2.6560026904074516 0.2563971988177261 6.4524190914038053 2.635258530416885 0.13507051549684204 6.4838096386107145 2.6145143704263178 0.013743832175958095 6.8497151592290768 0.043920003695746335 0.73378593746707543 6.8770428588239527 0.012081776179970527 0.61216500355969428 6.8345217118836237 0.19663224989457939 0.73455312911792936 6.8618494114784996 0.16479402237880358 0.6129321952105482 6.8891771110733755 0.13295579486302733 0.49131126130316682 6.9165048106682505 0.10111756734725141 0.36969032739578561 6.9438325102631264 0.069279339831475384 0.24806939348840443 6.9711602098580014 0.037441112315699354 0.12644845958102305 6.9984879094528774 0.0056028847999232915 0.0048275256736418177 6.8193282645381705 0.34934449609341256 0.73532032076878329 6.8466559641330464 0.31750626857763675 0.61369938686140213 6.8739836637279224 0.28566804106186061 0.49207845295402075 6.9013113633227974 0.25382981354608464 0.37045751904663954 6.9286390629176733 0.22199158603030861 0.24883658513925835 6.9559667625125483 0.19015335851453252 0.127215651231877 6.8041348171927174 0.50205674229224562 0.73608751241963721 6.8314625167875933 0.47021851477646981 0.61446657851225606 6.8587902163824692 0.43838028726069372 0.49284564460487468 6.8861179159773442 0.40654205974491775 0.37122471069749347 6.9134456155722201 0.37470383222914161 0.24960377679011231 6.7889413698472643 0.65476898849107867 0.73685470407049114 6.8162690694421402 0.62293076097530276 0.61523377016310998 6.8435967690370161 0.59109253345952684 0.4936128362557286 6.8709244686318911 0.55925430594375081 0.37199190234834745 6.7737479225018111 0.80748123468991162 0.73762189572134507 6.801075622096687 0.77564300717413581 0.61600096181396391 6.8284033216915629 0.74380477965835989 0.49438002790658253 6.758554475156358 0.96019348088874512 0.73838908737219899 6.7858821747512339 0.92835525337296931 0.61676815346481784 6.7433610278109049 1.1129057270875782 0.73915627902305292 6.7281675804654517 1.2656179732864112 0.73992347067390674 6.9828312774661496 0.16288534951647882 0.0056603613364163505 6.9404007889047392 0.34654130176988684 0.12803563849862082 6.9671658418081819 0.32025467959457443 0.0064944446836957695 6.8979703003433288 0.53019725402329509 0.25041091566082546 6.9247353532467715 0.50391063184798235 0.12886972184590023 6.9515004061502141 0.47762400967267005 0.0073285280309751876 6.8555398117819184 0.71385320627670323 0.37278619282302994 6.8823048646853611 0.68756658410139082 0.25124499900810487 6.9090699175888037 0.66127996192607796 0.12970380519317967 6.9358349704922464 0.63499333975076566 0.0081626113782546066 6.813109323220508 0.89750915853011148 0.49516146998523441 6.8398743761239507 0.87122253635479896 0.37362027617030935 6.8666394290273933 0.84493591417948644 0.25207908235538429 6.893404481930836 0.81864929200417369 0.13053788854045908 6.9201695348342787 0.79236266982886128 0.0089966947255340247 6.7706788346590967 1.0811651107835196 0.617536747147439 6.7974438875625403 1.0548784886082072 0.49599555333251383 6.8242089404659829 1.0285918664328946 0.37445435951758876 6.8509739933694256 1.0023052442575819 0.2529131657026637 6.8777390462728683 0.9760186220822693 0.13137197188773853 6.9045040991763109 0.94973199990695689 0.0098307780728134429 6.755013399001129 1.2385344408616152 0.61837083049471842 6.7817784519045725 1.2122478186863028 0.49682963667979324 6.8085435048080152 1.1859611965109902 0.37528844286486818 6.8353085577114578 1.1596745743356776 0.25374724904994311 6.8620736106149005 1.1333879521603649 0.13220605523501794 6.8888386635183432 1.1071013299850525 0.010664861420092863 6.7928780691500474 1.3433305265890856 0.37612252621214759 6.8196431220534901 1.3170439044137732 0.25458133239722258 6.8464081749569319 1.2907572822384605 0.13304013858229738 6.8731732278603745 1.2644706600631481 0.011498944767372283 6.7253768187743601 -1.327536834318553 0.723294470326595 6.7401382520241553 -1.1752855211906117 0.72447092931820678 6.7608371247309433 -1.2110855293772951 0.60268430502523285 6.7815359974377314 -1.2468855375639789 0.4808976807322588 6.8022348701445194 -1.282685545750663 0.35911105643928487 6.8229337428513075 -1.3184855539373466 0.23732443214631091 6.8436326155580955 -1.3542855621240304 0.11553780785333685 6.7548996852739505 -1.0230342080626704 0.72564738830981856 6.7755985579807385 -1.0588342162493538 0.60386076401684463 6.7962974306875266 -1.0946342244360376 0.48207413972387059 6.8169963033943146 -1.1304342326227217 0.36028751543089665 6.8376951761011027 -1.1662342408094053 0.23850089113792272 6.8583940488078907 -1.2020342489960891 0.11671426684494862 6.7696611185237456 -0.87078289493472916 0.72682384730143035 6.7903599912305337 -0.90658290312141254 0.60503722300845642 6.8110588639373217 -0.94238291130809637 0.48325059871548237 6.8317577366441098 -0.97818291949478042 0.36146397442250844 6.8524566093508978 -1.013982927681464 0.23967735012953453 6.7844225517735408 -0.71853158180678789 0.72800030629304213 6.8051214244803289 -0.75433158999347127 0.6062136820000682 6.8258202971871169 -0.7901315981801551 0.48442705770709416 6.846519169893905 -0.82593160636683915 0.36264043341412022 6.799183985023336 -0.56628026867884651 0.72917676528465392 6.819882857730124 -0.60208027686553001 0.60739014099167998 6.8405817304369121 -0.63788028505221384 0.48560351669870594 6.8139454182731312 -0.41402895555090502 0.7303532242762657 6.8346442909799201 -0.44982896373758874 0.60856659998329177 6.8287068515229272 -0.2617776424229637 0.73152968326787748 6.8494057242297153 -0.29757765060964747 0.60974305897490355 6.8434682847727224 -0.10952632929502218 0.73270614225948927 6.8733456916011351 -1.0477712443603404 0.11793056637730216 6.8673517298262565 -0.86031771359202824 0.24088181072012035 6.8883778426064222 -0.89265676990063647 0.11916372884220773 6.861357768051378 -0.67286418282371629 0.36383305506293839 6.8823838808315436 -0.70520323913232419 0.24211497318502592 6.9034099936117093 -0.73754229544093242 0.1203968913071133 6.8553638062764994 -0.48541065205540423 0.48678429940575646 6.8763899190566651 -0.51774970836401235 0.36506621752784396 6.8974160318368307 -0.55008876467262025 0.24334813564993149 6.9184421446169964 -0.58242782098122836 0.12163005377201887 6.8703959572817865 -0.33029617759570024 0.48801746187066203 6.8914220700619522 -0.36263523390430835 0.36629937999274953 6.9124481828421178 -0.39497429021291636 0.24458129811483706 6.9334742956222835 -0.42731334652152447 0.12286321623692444 6.9545004084024491 -0.45965240283013253 0.001145134359011949 6.8644019955069089 -0.14284264682738809 0.61096870621348021 6.8854281082870736 -0.17518170313599607 0.4892506243355676 6.9064542210672393 -0.20752075944460421 0.3675325424576551 6.9274803338474049 -0.23985981575321225 0.24581446057974263 6.9485064466275706 -0.27219887206182036 0.12409637870183 6.9695325594077362 -0.30453792837042842 0.0023782968239175212 6.9004602592923616 -0.020067228676292143 0.49048378680047316 6.9214863720725264 -0.052406284984900242 0.36876570492256067 6.942512484852692 -0.084745341293508317 0.2470476230446482 6.9635385976328577 -0.11708439760211641 0.12532954116673559 6.9845647104130233 -0.14942345391072448 0.0036114592888230922 6.3750017826321299 -2.4972096681326326 0.71175448109721895 6.3873460277052629 -2.5396887003460704 0.58978851373054775 6.3996902727783942 -2.5821677325595083 0.46782254636387638 6.4120345178515263 -2.6246467647729461 0.34585657899720523 6.4189349010449162 -2.3514001394323993 0.71319369477395345 6.4312791461180492 -2.3938791716458372 0.59122772740728224 6.4436233911911804 -2.436358203859275 0.46926176004061082 6.4559676362643126 -2.4788372360727129 0.34729579267393967 6.4683118813374456 -2.5213162682861503 0.22532982530726842 6.4806561264105778 -2.5637953004995877 0.10336385794059705 6.4628680194577024 -2.2055906107321657 0.71463290845068794 6.4752122645308354 -2.2480696429456035 0.59266694108401663 6.4875565096039676 -2.2905486751590414 0.47070097371734526 6.4999007546770997 -2.3330277073724792 0.34873500635067411 6.5122449997502319 -2.3755067395859166 0.22676903898400289 6.5068011378704886 -2.0597810820319324 0.71607212212742233 6.5191453829436217 -2.1022601142453703 0.59410615476075113 6.5314896280167538 -2.1447391464588081 0.4721401873940797 6.543833873089886 -2.1872181786722455 0.35017422002740856 6.5507342562832758 -1.9139715533316992 0.71751133580415682 6.5630785013564088 -1.9564505855451368 0.59554536843748551 6.5754227464295409 -1.9989296177585747 0.47357940107081414 6.594667374696062 -1.768162024631466 0.71895054948089121 6.607011619769195 -1.8106410568449034 0.59698458211422001 6.6193558648423272 -1.8531200890583412 0.47501861474754864 6.6386004931088491 -1.6223524959312323 0.72038976315762571 6.6509447381819822 -1.6648315281446697 0.59842379579095439 6.6825336115216354 -1.4765429672309989 0.72182897683436009 6.5255083709779331 -2.4149229776400851 0.10485123076845482 6.5567599348079106 -2.22775842956292 0.228238737916312 6.5711536331976186 -2.263408090621482 0.10638015508167967 6.5880114986378882 -2.0405938814857558 0.35162624506416901 6.6024051970275961 -2.0762435425443173 0.22976766222953685 6.616798895417304 -2.1118932036028792 0.10790907939490452 6.6336567608575736 -1.8890789944671529 0.35315516937739388 6.6480504592472816 -1.9247286555257146 0.2312965865427617 6.6624441576369895 -1.9603783165842765 0.10943800370812937 6.6649083246875511 -1.701914446389988 0.4765426765252509 6.6793020230772591 -1.7375641074485499 0.35468409369061876 6.693695721466967 -1.7732137685071119 0.23282551085598654 6.708089419856675 -1.8088634295656738 0.11096692802135422 6.6961598885175286 -1.5147498983128229 0.59993018367310802 6.7105535869072366 -1.5503995593713851 0.47807160083847572 6.7249472852969445 -1.586049220429947 0.35621301800384358 6.7393409836866525 -1.6216988814885092 0.23435443516921139 6.7537346820763604 -1.6573485425470711 0.11249585233457907 6.7418051507372141 -1.3632350112942202 0.60145910798633284 6.756198849126922 -1.3988846723527821 0.4796005251517006 6.77059254751663 -1.4345343334113441 0.35774194231706846 6.7849862459063379 -1.4701839944699062 0.23588335948243624 6.7993799442960459 -1.5058336555284682 0.11402477664780392 5.7521217204852171 -3.7237044691615608 0.69729385178802084 5.7558645509923361 -3.7679789015992418 0.57518650546225603 5.7596073814994533 -3.8122533340369231 0.45307915913649116 5.823925441830319 -3.5886892051370927 0.69891304250278896 5.827668272337438 -3.6329636375747736 0.57680569617702415 5.8314111028445552 -3.6772380700124554 0.45469834985125923 5.8351539333516742 -3.7215125024501359 0.33259100352549448 5.8388967638587914 -3.7657869348878164 0.2104836571997297 5.8426395943659095 -3.8100613673254973 0.088376310873964775 5.895729163175421 -3.4536739411126249 0.70053223321755709 5.8994719936825399 -3.4979483735503059 0.57842488689179228 5.9032148241896572 -3.5422228059879872 0.45631754056602736 5.9069576546967761 -3.5864972384256681 0.33421019424026255 5.9107004852038934 -3.6307716708633486 0.21210284791449777 5.9675328845205229 -3.3186586770881568 0.70215142393232521 5.9712757150276419 -3.3629331095258377 0.5800440776065604 5.97501854553476 -3.407207541963519 0.45793673128079543 5.9787613760418781 -3.4514819744012 0.33582938495503062 6.0393366058656248 -3.183643413063689 0.70377061464709334 6.0430794363727438 -3.22791784550137 0.58166326832132853 6.0468222668798619 -3.2721922779390509 0.45955592199556355 6.1111403272107268 -3.0486281490392209 0.70538980536186147 6.1148831577178457 -3.0929025814769018 0.58328245903609655 6.1186259882249638 -3.1371770139145827 0.46117511271033163 6.1829440485558296 -2.9136128850147531 0.70700899607662959 6.1866868790629486 -2.9578873174524341 0.58490164975086467 6.2547477699009315 -2.778597620990285 0.70862818679139772 5.915218308387356 -3.6735816861531507 0.09003004963969391 5.9829710064118728 -3.4948743472469772 0.21374284789100934 5.9886048563314676 -3.5355755313958266 0.091719800471575588 6.0507237044363897 -3.3161670083408028 0.33745564614232465 6.0563575543559844 -3.3568681924896531 0.21543259872289103 6.0619914042755791 -3.3975693766385024 0.093409551303457267 6.1241102523805013 -3.1781608535834787 0.33914539697420631 6.129744102300096 -3.2188620377323289 0.21712234955477272 6.1353779522196907 -3.2595632218811783 0.095099302135338945 6.1918629504050191 -2.9994535146773043 0.46285819522552163 6.1974968003246129 -3.0401546988261545 0.34083514780608798 6.2031306502442076 -3.0808558829750048 0.21881210038665441 6.2087645001638023 -3.1215570671238542 0.096789052967220623 6.259615648429536 -2.8207461757711307 0.58657099347683705 6.2652494983491307 -2.8614473599199801 0.46454794605740329 6.2708833482687245 -2.9021485440688304 0.34252489863796964 6.2765171981883192 -2.9428497282176806 0.2205018512185361 6.2821510481079148 -2.98355091236653 0.098478803799102302 6.3273683464540529 -2.6420388368649563 0.71028379172815226 6.3330021963736476 -2.6827400210138066 0.58826074430871877 6.3386360462932423 -2.723441205162656 0.46623769688928496 6.344269896212837 -2.7641423893115062 0.34421464946985136 6.3499037461324317 -2.8048435734603565 0.22219160205041777 6.3555375960520264 -2.8455447576092059 0.10016855463098399 6.4232902940765442 -2.6668374187030324 0.22388135288229946 6.4289241439961389 -2.7075386028518822 0.10185830546286569 4.9201262609895453 -4.7729871075998718 0.6821418788329876 4.9120501521327853 -4.8209888319692347 0.55984585177010904 4.9039740432760244 -4.8689905563385993 0.43754982470723047 5.0137227983786108 -4.6584162181634703 0.68381853147303984 5.0056466895218508 -4.7064179425328332 0.56152250441016138 4.9975705806650899 -4.7544196669021979 0.43922647734728276 4.9894944718083289 -4.8024213912715608 0.3169304502844042 4.981418362951568 -4.8504231156409237 0.19463442322152569 4.9733422540948071 -4.8984248400102866 0.072338396158647011 5.1073193357676754 -4.5438453287270688 0.68549518411309218 5.0992432269109162 -4.5918470530964317 0.56319915705021373 5.0911671180541553 -4.6398487774657964 0.44090312998733505 5.0830910091973944 -4.6878505018351593 0.31860710292445649 5.0750149003406335 -4.7358522262045222 0.19631107586157798 5.2009158731567409 -4.4292744392906673 0.68717183675314442 5.1928397642999817 -4.4772761636600302 0.56487580969026596 5.1847636554432208 -4.5252778880293949 0.44257978262738734 5.176687546586459 -4.5732796123987578 0.32028375556450878 5.2945124105458063 -4.3147035498542659 0.68884848939319676 5.2864363016890463 -4.3627052742236287 0.56655246233031831 5.2783601928322854 -4.4107069985929925 0.44425643526743963 5.3881089479348709 -4.2001326604178644 0.690525142033249 5.3800328390781109 -4.2481343847872273 0.56822911497037054 5.37195673022135 -4.2961361091565911 0.44593308790749187 5.4817054853239364 -4.0855617709814638 0.69220179467330134 5.4736293764671764 -4.1335634953508267 0.56990576761042289 5.5753020227130019 -3.9709908815450623 0.69387844731335357 5.0692884860031873 -4.780972031771018 0.074075322777785557 5.1699831770547986 -4.6195988877003185 0.19802291613419834 5.1676609151053547 -4.6605434735971238 0.075874485810089959 5.2706778681064108 -4.4582257436296198 0.32197050949061096 5.2683556061569661 -4.4991703295264243 0.19982207916650274 5.2660333442075222 -4.5401149154232296 0.077673648842394361 5.3690502972085783 -4.3377971854557256 0.32376967252291539 5.3667280352591336 -4.3787417713525301 0.20162124219880714 5.3644057733096897 -4.4196863572493355 0.079472811874698762 5.4697449882601905 -4.176424041385026 0.44771726587932797 5.4674227263107458 -4.2173686272818314 0.32556883555521976 5.465100464361301 -4.2583132131786359 0.20342040523111155 5.4627782024118572 -4.2992577990754413 0.08127197490700315 5.5704396793118027 -4.0150508973143273 0.57166485923574084 5.568117417362358 -4.0559954832111318 0.4495164289116324 5.5657951554129141 -4.0969400691079372 0.32736799858752419 5.5634728934634694 -4.1378846550047417 0.20521956826341595 5.5611506315140256 -4.1788292409015471 0.083071137939307552 5.6711343703634132 -3.8536777532436286 0.69561245259215343 5.6688121084139702 -3.8946223391404335 0.57346402226804516 5.6664898464645255 -3.9355669250372385 0.45131559194393683 5.6641675845150816 -3.9765115109340434 0.32916716161982862 5.6618453225656369 -4.0174560968308484 0.20701873129572035 5.659523060616193 -4.0584006827276529 0.084870300971611939 5.7625400136172491 -3.8560829527601497 0.33096632465213299 5.7602177516678053 -3.8970275386569546 0.20881789432802478 5.7578954897183605 -3.9379721245537591 0.086669464003916341 3.8742247774181382 -5.6618981579577436 0.66583185190419858 3.8531885454271082 -5.7105284414750574 0.54334680059186424 3.9918209668944891 -5.5649256902567972 0.66764286546386509 3.9707847349034591 -5.613555973774111 0.54515781415153075 3.9497485029124291 -5.6621862572914257 0.42267276283919641 3.9287122709213995 -5.7108165408087403 0.30018771152686208 3.9076760389303695 -5.759446824326055 0.17770266021452777 3.88663980693934 -5.8080771078433697 0.055217608902193314 4.1094171563708395 -5.4679532225558507 0.66945387902353171 4.0883809243798099 -5.5165835060731645 0.54696882771119737 4.0673446923887804 -5.5652137895904792 0.42448377639886298 4.0463084603977508 -5.6138440731077939 0.30199872508652864 4.0252722284067204 -5.6624743566251086 0.1795136737741943 4.2270133458471904 -5.3709807548549042 0.67126489258319821 4.2059771138561608 -5.419611038372218 0.54877984127086388 4.1849408818651312 -5.4682413218895327 0.42629478995852954 4.1639046498741017 -5.5168716054068474 0.3038097386461952 4.3446095353235412 -5.2740082871539569 0.67307590614286483 4.3235733033325117 -5.3226385706712707 0.5505908548305305 4.3025370713414821 -5.3712688541885854 0.4281058035181961 4.4622057247998921 -5.1770358194530104 0.67488691970253134 4.4411694928088625 -5.2256661029703242 0.552401868390197 4.420133260817833 -5.2742963864876389 0.42991681707786261 4.5798019142762429 -5.080063351752063 0.67669793326219796 4.5587656822852134 -5.1286936352693768 0.55421288194986362 4.6973981037525938 -4.9830908840511166 0.67850894682186447 4.0060029861886886 -5.7096438616187992 0.057070200812218218 4.1439900731858978 -5.5645746113573553 0.18135108056933677 4.128207354372317 -5.6088617915129717 0.05898964763603437 4.281977160183108 -5.4195053610959114 0.30563196032645518 4.2661944413695263 -5.4637925412515278 0.18327052739315292 4.2504117225559463 -5.5080797214071442 0.060909094459850523 4.4041815283667365 -5.3187232909900839 0.30755140715027135 4.3883988095531556 -5.3630104711457003 0.18518997421696906 4.3726160907395748 -5.4072976513013167 0.062828541283666675 4.5421686153639458 -5.1736540407286391 0.43183228690738978 4.5263858965503658 -5.2179412208842564 0.30947085397408752 4.510603177736785 -5.2622284010398728 0.18710942104078521 4.4948204589232041 -5.3065155811954892 0.064747988107482821 4.6801557023611551 -5.0285847904671943 0.55611316666450827 4.6643729835475751 -5.0728719706228116 0.43375173373120596 4.6485902647339952 -5.1171591507784289 0.31139030079790364 4.6328075459204143 -5.1614463309340453 0.18902886786460135 4.6170248271068335 -5.2057335110896616 0.066667434931298966 4.8181427893583653 -4.8835155402057504 0.68039404642162671 4.8023600705447844 -4.9278027203613668 0.55803261348832445 4.7865773517312045 -4.9720899005169841 0.43567118055502208 4.7707946329176236 -5.0163770806726005 0.31330974762171981 4.7550119141040428 -5.0606642608282177 0.1909483146884175 4.7392291952904619 -5.1049514409838341 0.068586881755115112 4.8929990011012521 -4.9155950105667729 0.31522919444553593 4.8772162822876721 -4.9598821907223893 0.19286776151223367 4.8614335634740913 -5.0041693708780057 0.070506328578931271 2.7491439305281675 -6.2836852027129257 0.64984618979546949 2.7264895953453285 -6.323291948002403 0.52733902233269592 2.7038352601624895 -6.3628986932918821 0.40483185486992229 2.6811809249796501 -6.4025054385813602 0.28232468740714878 2.8746566350403318 -6.2161997814751366 0.65161704419582755 2.8520022998574928 -6.2558065267646139 0.52910987673305399 2.8293479646746538 -6.295413272054093 0.40660270927028036 2.8066936294918143 -6.3350200173435711 0.28409554180750685 2.7840392943089753 -6.3746267626330493 0.16158837434473333 3.000169339552496 -6.1487143602373484 0.65338789859618562 2.977515004369657 -6.1883211055268257 0.53088073113341205 2.9548606691868176 -6.2279278508163047 0.40837356367063843 2.9322063340039786 -6.267534596105782 0.28586639620786491 2.9095519988211396 -6.3071413413952602 0.16335922874509137 3.1256820440646598 -6.0812289389995602 0.65515875299654369 3.1030277088818208 -6.1208356842890375 0.53265158553377012 3.0803733736989818 -6.1604424295785156 0.4101444180709965 3.0577190385161428 -6.2000491748679938 0.28763725060822298 3.251194748576824 -6.0137435177617711 0.65692960739690176 3.228540413393985 -6.0533502630512483 0.53442243993412819 3.205886078211146 -6.0929570083407274 0.41191527247135462 3.3767074530889882 -5.946258096523982 0.65870046179725983 3.3540531179061492 -5.9858648418134601 0.53619329433448626 3.5022201576011525 -5.8787726752861937 0.6604713161976179 3.6277328621133162 -5.8112872540484046 0.66224217059797597 2.7612934233573592 -6.4142814472235159 0.039085606749327692 2.8863583304590867 -6.3470305473660309 0.040877985513767416 3.0346514626086218 -6.2398723434392753 0.16514994646668385 3.0114232375608143 -6.2797796475085459 0.04267036427820714 3.1829445947581565 -6.1327141395125206 0.28942190741960017 3.1597163697103494 -6.1726214435817903 0.16694232523112357 3.1364881446625419 -6.2125287476510609 0.044462743042646871 3.3312377269076916 -6.0255559355857669 0.41369386837251648 3.3080095018598841 -6.0654632396550356 0.29121428618403988 3.284781276812077 -6.1053705437243053 0.16873470399556328 3.2615530517642695 -6.1452778477935759 0.046255121807086595 3.4795308590572267 -5.9183977316590113 0.53796582932543291 3.4563026340094192 -5.9583050357282819 0.4154862471369562 3.4330744089616116 -5.9982123397975506 0.2930066649484796 3.4098461839138046 -6.0381196438668203 0.170527082760003 3.386617958865997 -6.0780269479360909 0.048047500571526319 3.6045957661589538 -5.8511468318015263 0.53975820808987263 3.5813675411111463 -5.8910541358707968 0.41727862590139592 3.5581393160633388 -5.9309614399400656 0.29479904371291932 3.5349110910155317 -5.9708687440093353 0.17231946152444275 3.5116828659677246 -6.0107760480786059 0.049839879335966043 3.7528888983084894 -5.7439886278747716 0.66403016904278889 3.7296606732606814 -5.7838959319440413 0.54155058685431234 3.7064324482128739 -5.823803236013311 0.41907100466583563 3.6832042231650663 -5.8637105400825806 0.29659142247735903 3.6599759981172593 -5.9036178441518503 0.17411184028888249 3.6367477730694522 -5.94352514822112 0.051632258100405774 3.8314973553146014 -5.756552336155826 0.42086338343027541 3.8082691302667939 -5.7964596402250956 0.29838380124179881 3.7850409052189868 -5.8363669442943653 0.17590421905332221 3.7618126801711798 -5.876274248363635 0.053424636864845498 1.4310888264026704 -6.6896999329422293 0.75384086327619759 1.3907485517431732 -6.7273313123003504 0.63108126420788246 1.3504082770836758 -6.7649626916584724 0.50832166513956745 1.5837483764363909 -6.6429563075226055 0.75594302456081675 1.5434081017768937 -6.6805876868807266 0.63318342549250162 1.5030678271173963 -6.7182190662388486 0.51042382642418649 1.4627275524578993 -6.7558504455969697 0.38766422735587119 1.4223872777984023 -6.7934818249550917 0.26490462828755618 1.3820470031389052 -6.8311132043132128 0.14214502921924108 1.7364079264701113 -6.5962126821029816 0.7580451858454359 1.6960676518106141 -6.6338440614611027 0.63528558677712077 1.6557273771511167 -6.6714754408192247 0.51252598770880564 1.6153871024916198 -6.7091068201773458 0.38976638864049035 1.5750468278321228 -6.7467381995354678 0.26700678957217527 1.5347065531726256 -6.7843695788935889 0.14424719050386015 1.8890674765038318 -6.5494690566833578 0.76014734713005494 1.8487272018443344 -6.5871004360414789 0.63738774806173992 1.8083869271848372 -6.6247318153996009 0.51462814899342479 1.7680466525253402 -6.662363194757722 0.39186854992510944 1.7277063778658435 -6.699994574115844 0.26910895085679437 2.041727026537552 -6.5027254312637339 0.76224950841467409 2.001386751878055 -6.540356810621855 0.63948990934635896 1.9610464772185576 -6.577988189979977 0.51673031027804384 1.9207062025590607 -6.615619569338099 0.3939707112097286 2.1943865765712727 -6.4559818058441101 0.76435166969929313 2.1540463019117757 -6.4936131852022321 0.64159207063097812 2.1137060272522783 -6.5312445645603532 0.51883247156266299 2.3067058519454959 -6.4468695597826082 0.64369423191559716 1.4994320129339849 -6.8204479377887877 0.021566613826169694 1.6917967241147081 -6.7362676420500955 0.14641846679274984 1.6601754970055962 -6.7712259915693069 0.023794879588492315 1.884161435295431 -6.6520873463114034 0.2712703197593298 1.8525402081863194 -6.6870456958306148 0.14864673255507246 1.8209189810772075 -6.7220040453498262 0.026023145350814937 2.0765261464761542 -6.5679070505727113 0.39612217272590977 2.0449049193670423 -6.6028654000919227 0.2734985855216524 2.0132836922579305 -6.6378237496111341 0.15087499831739506 1.9816624651488191 -6.6727820991303455 0.028251411113137559 2.2688908576568769 -6.4837267548340201 0.52097402569248985 2.2372696305477655 -6.5186851043532306 0.39835043848823237 2.2056484034386536 -6.553643453872442 0.27572685128397501 2.1740271763295418 -6.5886018033916534 0.15310326407971769 2.1424059492204304 -6.6235601529108648 0.030479676875460181 2.4612555688376001 -6.3995464590953279 0.64582587865906982 2.4296343417284882 -6.4345048086145393 0.52320229145481245 2.3980131146193768 -6.4694631581337498 0.40057870425055497 2.366391887510265 -6.5044215076529612 0.27795511704629761 2.3347706604011531 -6.5393798571721726 0.15533152984204029 2.3031494332920417 -6.574338206691384 0.032707942637782803 2.6219990529092114 -6.3503245128758463 0.64805414442139242 2.5903778258000996 -6.3852828623950577 0.52543055721713505 2.5587565986909881 -6.4202412119142691 0.40280697001287763 2.5271353715818763 -6.4551995614334805 0.28018338280862021 2.4955141444727644 -6.4901579109526919 0.15755979560436292 2.463892917363653 -6.5251162604719033 0.034936208400105424 2.6562576285443757 -6.4409359647332103 0.15978806136668552 2.6246364014352643 -6.4758943142524217 0.037164474162428046 1.2790494837218522 -6.7244988756414541 0.75171668666598379 1.1162674049657713 -6.7409962046603393 0.7493805139738402 0.95348532620969051 -6.7574935336792246 0.74704434128169661 0.95267362451764659 -6.7818789536101907 0.62485247049762427 0.79070324745360954 -6.7739908626981098 0.74470816858955302 0.78989154576156562 -6.7983762826290759 0.62251629780548079 0.78907984406952181 -6.8227617025600411 0.50032442702140811 0.62792116869752879 -6.7904881917169941 0.74237199589740954 0.62710946700548487 -6.8148736116479602 0.6201801251133372 0.62629776531344106 -6.8392590315789263 0.49798825432926458 0.62548606362139691 -6.8636444515098916 0.37579638354519218 0.46513908994144804 -6.8069855207358794 0.74003582320526606 0.46432738824940412 -6.8313709406668455 0.61784395242119372 0.46351568655736031 -6.8557563605978116 0.49565208163712104 0.46270398486531616 -6.8801417805287768 0.37346021085304865 0.30235701118536717 -6.8234828497547637 0.73769965051312247 0.3015453094933232 -6.8478682696857307 0.61550777972905013 0.30073360780127933 -6.8722536896166968 0.49331590894497757 0.29992190610923519 -6.896639109547662 0.37112403816090511 0.29911020441719127 -6.9210245294786272 0.24893216737683271 0.13957493242928645 -6.8399801787736489 0.73536347782097899 0.13876323073724248 -6.864365598704615 0.61317160703690665 0.13795152904519853 -6.8887510186355811 0.49097973625283403 0.1371398273531545 -6.9131364385665464 0.36878786546876163 0.13632812566111052 -6.9375218584975125 0.24659599468468921 0.13551642396906655 -6.9619072784284786 0.12440412390061664 0.11325322044817443 -6.9884693976107908 0.0018909521690621198 0.28566203881945951 -6.946692180450694 0.12655102742838598 0.25001603112642501 -6.974612262355377 0.0038374078356612738 0.45807085719074436 -6.9049149632905973 0.25121110268770974 0.42242484949771009 -6.9328350451952803 0.12849748309498513 0.38677884180467559 -6.9607551270999632 0.0057838635022604279 0.59483366786899494 -6.8910578280351835 0.25315755835430886 0.55918766017596067 -6.9189779099398665 0.13044393876158428 0.52354165248292617 -6.9468979918445495 0.0077303191688595802 0.76724248624028002 -6.8492806108750868 0.37781763361363263 0.73159647854724574 -6.8772006927797698 0.25510401402090799 0.69595047085421136 -6.9051207746844527 0.13239039442818343 0.66030446316117686 -6.9330408565891357 0.009676774835458736 0.93965130461156487 -6.80750339371499 0.5024777088729564 0.9040052969185306 -6.835423475619673 0.37976408928023175 0.86835928922549632 -6.863343557524356 0.25705046968750711 0.83271328153246194 -6.891263639429039 0.13433685009478258 0.79706727383942744 -6.9191837213337219 0.01162323050205789 1.11206012298285 -6.7657261765548933 0.62713778413228016 1.0764141152898155 -6.7936462584595763 0.50442416453955563 1.0407681075967812 -6.8215663403642592 0.38171054494683093 1.0051220999037469 -6.8494864222689422 0.25899692535410629 0.9694760922107124 -6.8774065041736252 0.13628330576138173 0.93383008451767802 -6.9053265860783082 0.013569686168657042 1.2488229336611005 -6.7518690412994795 0.62908423979887929 1.213176925968066 -6.7797891232041625 0.50637062020615475 1.1775309182750315 -6.8077092051088455 0.38365700061343005 1.1418849105819975 -6.8356292870135285 0.26094338102070541 1.106238902888963 -6.8635493689182114 0.13822976142798088 1.0705928951959285 -6.8914694508228944 0.015516141835256195 1.3142937289532823 -6.7938520698534317 0.38560345628002923 1.2786477212602483 -6.8217721517581147 0.26288983668730459 1.2430017135672138 -6.8496922336627977 0.14017621709458003 1.2073557058741795 -6.8776123155674798 0.017462597501855352 1.3441185165524301 -6.863755180312066 0.019409053168454506 -1.1960073105038862 -6.878563348102416 -0.018300588890388037 -1.2274966663927755 -6.8509180516042827 -0.14169093394106722 -1.2589860222816653 -6.8232727551061494 -0.26508127899174611 -1.2904753781705549 -6.7956274586080161 -0.38847162404242502 -1.3219647340594445 -6.7679821621098828 -0.51186196909310389 -0.9647689890888852 -6.9020529350789053 -0.014708051132257175 -0.99625834497777455 -6.874407638580772 -0.13809839618293634 -1.0277477008666644 -6.8467623420826387 -0.26148874123361521 -1.059237056755554 -6.8191170455845054 -0.38487908628429413 -1.0907264126444436 -6.7914717490863721 -0.50826943133497304 -1.1222157685333332 -6.7638264525882379 -0.63165977638565218 -0.73353066767388431 -6.9255425220553946 -0.011115513374126312 -0.76502002356277365 -6.8978972255572613 -0.13450585842480547 -0.79650937945166334 -6.870251929059128 -0.25789620347548431 -0.82799873534055302 -6.8426066325609947 -0.38128654852616323 -0.5022923462588833 -6.9490321090318838 -0.0075229756159954494 -0.53378170214777276 -6.9213868125337505 -0.1309133206666746 -0.56527105803666244 -6.8937415160356164 -0.25430366571735347 -0.27105402484388225 -6.9725216960083722 -0.0039304378578645851 -0.30254338073277182 -6.9448763995102389 -0.12732078290854373 -0.039815703428881209 -6.9960112829848615 -0.00033790009973372071 -1.2015800605911311 -6.7313324967792472 -0.75572071655168049 -0.86573113662724588 -6.8143290553201901 -0.504764341333094 -0.95082901234839001 -6.7812544158374752 -0.62890559310903316 -1.035926888069534 -6.7481797763547604 -0.75304684488497198 -0.6149800883845048 -6.8642509743784181 -0.37794921789044661 -0.70007796410564882 -6.8311763348957033 -0.50209046966638549 -0.78517583982679295 -6.7981016954129885 -0.62623172144232464 -0.87027371554793687 -6.7650270559302736 -0.75037297321826346 -0.36422904014176377 -6.9141728934366471 -0.25113409444779922 -0.44932691586290768 -6.8810982539539305 -0.37527534622373809 -0.53442479158405165 -6.8480236144712157 -0.49941659799967697 -0.6195226673051959 -6.8149489749885008 -0.62355784977561612 -0.7046205430263397 -6.781874335505786 -0.74769910155155506 -0.11347799189902281 -6.9640948124948743 -0.12431897100515187 -0.19857586762016671 -6.9310201730121594 -0.24846022278109073 -0.28367374334131062 -6.8979455335294437 -0.37260147455702963 -0.36877161906245454 -6.8648708940467289 -0.49674272633296851 -0.45386949478359873 -6.8317962545640141 -0.62088397810890761 -0.53896737050474264 -6.7987216150812992 -0.74502522988484654 -0.032922695098569758 -6.9478674525876718 -0.24578635111438224 -0.11802057081971362 -6.9147928131049561 -0.36992760289032117 -0.20311844654085751 -6.8817181736222413 -0.49406885466626005 -0.28821632226200167 -6.8486435341395264 -0.6182101064421992 -0.37331419798314558 -6.8155688946568116 -0.74235135821813814 -0.037465274019260301 -6.8985654531977545 -0.49139498299955153 -0.12256314974040441 -6.8654908137150397 -0.61553623477549069 -0.2076610254615483 -6.8324161742323248 -0.73967748655142962 -0.042007852939951247 -6.8492634538078372 -0.73700361488472121 -2.5584524861074422 -6.4949956494771204 -0.041879386538489889 -2.567776955128529 -6.466701689491952 -0.16498280139644048 -2.5771014241496162 -6.4384077295067828 -0.28808621625439118 -2.5864258931707034 -6.4101137695216144 -0.41118963111234186 -2.595750362191791 -6.3818198095364451 -0.53429304597029248 -2.6050748312128786 -6.3535258495512767 -0.6573964608282431 -2.3312591770825413 -6.5647389099945244 -0.037891588581501684 -2.340583646103628 -6.536444950009356 -0.16099500343945228 -2.3499081151247152 -6.5081509900241867 -0.28409841829740295 -2.3592325841458028 -6.4798570300390184 -0.40720183315535363 -2.3685570531668905 -6.4515630700538491 -0.53030524801330425 -2.1040658680576403 -6.6344821705119283 -0.033903790624513486 -2.1133903370787275 -6.60618821052676 -0.15700720548246408 -2.1227148060998147 -6.5778942505415907 -0.28011062034041478 -2.1320392751209023 -6.5496002905564223 -0.40321403519836546 -1.8768725590327389 -6.7042254310293323 -0.029915992667525274 -1.8861970280538263 -6.675931471044164 -0.15301940752547585 -1.8955214970749135 -6.6476375110589956 -0.27612282238342656 -1.6496792500078381 -6.7739686915467363 -0.025928194710537068 -1.6590037190289255 -6.7456747315615688 -0.14903160956848766 -1.4224859409829373 -6.8437119520641412 -0.021940396753548863 -2.3834820824345004 -6.4215514245925851 -0.65349941952511625 -2.1496320041255976 -6.518770464611193 -0.5264514365820091 -2.1772073313413518 -6.4848789871157493 -0.64985060521224924 -1.9157819258166953 -6.615989504629801 -0.39940345363890223 -1.9433572530324488 -6.5820980271343572 -0.52280262226914209 -1.9709325802482029 -6.5482065496389135 -0.64620179089938223 -1.6819318475077925 -6.7132085446484089 -0.2723554706957953 -1.7095071747235464 -6.6793170671529651 -0.39575463932603522 -1.7370825019392999 -6.6454255896575214 -0.51915380795627508 -1.7646578291550541 -6.6115341121620776 -0.64255297658651522 -1.4480817691988899 -6.8104275846670168 -0.1453074877526884 -1.4756570964146436 -6.7765361071715731 -0.26870665638292829 -1.5032324236303976 -6.7426446296761293 -0.39210582501316821 -1.5308077508461513 -6.7087531521806865 -0.51550499364340807 -1.5583830780619052 -6.6748616746852427 -0.63890416227364821 -1.585958405277659 -6.640970197189799 -0.76230333090388824 -1.3521083269687564 -6.7381892372084069 -0.63525534796078131 -1.3796836541845101 -6.704297759712964 -0.75865451659102123 -3.805238408552944 -5.8500835906800965 -0.06669713444281801 -3.8016819064752641 -5.8244122948599744 -0.18953636771979546 -3.7981254043975836 -5.7987409990398522 -0.31237560099677297 -3.7945689023199032 -5.77306970321973 -0.43521483427375046 -3.7910124002422232 -5.7473984073996087 -0.55805406755072795 -3.7874558981645428 -5.7217271115794874 -0.68089330082770538 -3.6718690845486126 -5.9219746622172726 -0.064007625274201674 -3.6683125824709326 -5.8963033663971505 -0.18684685855117911 -3.6647560803932522 -5.8706320705770283 -0.3096860918281566 -3.6611995783155717 -5.8449607747569061 -0.43252532510513408 -3.6576430762378918 -5.8192894789367848 -0.55536455838211152 -3.5384997605442812 -5.9938657337544488 -0.061318116105585331 -3.5349432584666012 -5.9681944379343266 -0.18415734938256276 -3.5313867563889207 -5.9425231421142044 -0.30699658265954027 -3.5278302543112403 -5.9168518462940822 -0.42983581593651771 -3.5242737522335603 -5.8911805504739609 -0.5526750492134952 -3.4051304365399497 -6.0657568052916249 -0.058628606936968988 -3.4015739344622697 -6.0400855094715027 -0.18146784021394641 -3.3980174323845893 -6.0144142136513805 -0.3043070734909239 -3.3944609303069089 -5.9887429178312592 -0.42714630676790138 -3.2717611125356183 -6.137647876828801 -0.055939097768352646 -3.2682046104579383 -6.1119765810086788 -0.17877833104533006 -3.2646481083802579 -6.0863052851885566 -0.30161756432230757 -3.1383917885312869 -6.2095389483659771 -0.053249588599736303 -3.1348352864536064 -6.1838676525458549 -0.17608882187671371 -3.131278784375926 -6.1581963567257336 -0.2989280551536912 -3.0050224645269554 -6.2814300199031532 -0.050560079431119967 -3.001465962449275 -6.255758724083031 -0.17339931270809736 -2.871653140522624 -6.3533210914403293 -0.047870570262503624 -3.6546739284452707 -5.7933002202082049 -0.67822168140654127 -3.5247388360838743 -5.8633321782438976 -0.67563677271220013 -3.3934717268184755 -5.9616818207496456 -0.55006373530890362 -3.3948037437224778 -5.9333641362795904 -0.67305186401785899 -3.2622046175530768 -6.0600314632553927 -0.42449069790560701 -3.2635366344570791 -6.0317137787853383 -0.54747882661456249 -3.2648686513610818 -6.0033960943152831 -0.67046695532351785 -3.1322695251916803 -6.1300634212910854 -0.42190578921126581 -3.1336015420956826 -6.1017457368210311 -0.54489391792022124 -3.1349335589996858 -6.0734280523509758 -0.66788204662917672 -3.0010024159262816 -6.2284130637968325 -0.2963327518079692 -3.0023344328302839 -6.2000953793267781 -0.41932088051692462 -3.0036664497342866 -6.1717776948567238 -0.5423090092258801 -3.0049984666382898 -6.1434600103866686 -0.66529713793483558 -2.8697353066608828 -6.3267627063025804 -0.17075971440467255 -2.8710673235648856 -6.2984450218325252 -0.29374784311362806 -2.8723993404688879 -6.2701273373624709 -0.41673597182258343 -2.8737313573728906 -6.2418096528924165 -0.53972410053153885 -2.8750633742768938 -6.2134919684223613 -0.66271222924049433 -2.7384681973954841 -6.4251123488083275 -0.045186677001375984 -2.7398002142994864 -6.3967946643382732 -0.16817480571033136 -2.7411322312034891 -6.3684769798682179 -0.29116293441928687 -2.7424642481074915 -6.3401592953981636 -0.41415106312824229 -2.7437962650114942 -6.3118416109281092 -0.53713919183719772 -2.7451282819154974 -6.283523926458054 -0.6601273205461532 -4.8964697567158622 -4.9698853443354745 -0.092103130502972377 -4.8880356181120543 -4.9453962920877554 -0.21476186339393527 -4.8796014795082465 -4.9209072398400355 -0.33742059628489818 -4.8711673409044387 -4.8964181875923165 -0.46007932917586114 -4.86273320230063 -4.8719291353445975 -0.5827380620668241 -4.7594465634075913 -5.0831644443317074 -0.088873425324141372 -4.7510124248037844 -5.0586753920839884 -0.21153215821510427 -4.7425782861999766 -5.0341863398362685 -0.3341908911060672 -4.7341441475961688 -5.0096972875885495 -0.45684962399703016 -4.72571000899236 -4.9852082353408305 -0.57950835688799307 -4.6224233700993214 -5.1964435443279404 -0.085643720145310367 -4.6139892314955135 -5.1719544920802214 -0.20830245303627326 -4.6055550928917066 -5.1474654398325015 -0.33096118592723622 -4.5971209542878979 -5.1229763875847825 -0.45361991881819919 -4.4854001767910505 -5.3097226443241734 -0.082414014966479349 -4.4769660381872427 -5.2852335920764544 -0.20507274785744223 -4.4685318995834358 -5.2607445398287345 -0.32773148074840519 -4.4600977609796271 -5.2362554875810163 -0.45039021363936821 -4.3483769834827806 -5.4230017443204064 -0.079184309787648344 -4.3399428448789727 -5.3985126920726874 -0.20184304267861122 -4.3315087062751649 -5.3740236398249674 -0.32450177556957421 -4.2113537901745106 -5.5362808443166394 -0.075954604608817339 -4.2029196515707019 -5.5117917920689194 -0.19861333749978022 -4.0743305968662398 -5.6495599443128715 -0.072724899429986334 -4.7186640263338173 -4.959564703480619 -0.70222663879970637 -4.5892268020696934 -5.0980382479882476 -0.57630181600895913 -4.5856441114428614 -5.0695144201091633 -0.69916866599025007 -4.4562068871787375 -5.2079879646167919 -0.57324384319950283 -4.4526241965519056 -5.1794641367377077 -0.69611069318079377 -4.3267696629146135 -5.3464615091244205 -0.44731902040875565 -4.3231869722877816 -5.3179376812453363 -0.57018587039004653 -4.3196042816609497 -5.289413853366252 -0.69305272037133747 -4.1973324386504887 -5.4849350536320491 -0.32139419761800847 -4.1937497480236576 -5.456411225752964 -0.44426104759929935 -4.1901670573968257 -5.4278873978738797 -0.56712789758059023 -4.1865843667699938 -5.3993635699947955 -0.68999474756188117 -4.0678952143863638 -5.6234085981396777 -0.19546937482726121 -4.0643125237595328 -5.5948847702605935 -0.31833622480855217 -4.0607298331327017 -5.5663609423815084 -0.44120307478984305 -4.0571471425058698 -5.5378371145024241 -0.56406992477113393 -4.0535644518790379 -5.5093132866233399 -0.68693677475242487 -3.9384579901222398 -5.7618821426473064 -0.069544552036514037 -3.9348752994954084 -5.7333583147682212 -0.19241140201780488 -3.9312926088685769 -5.704834486889137 -0.31527825199909582 -3.9277099182417459 -5.6763106590100518 -0.43814510198038675 -3.9241272276149144 -5.6477868311309676 -0.56101195196167764 -3.9205445369880825 -5.6192630032518833 -0.68387880194296857 -5.7460947423302526 -3.9431750141428474 -0.11607734008478313 -5.7385041134347468 -3.9141651040136187 -0.23868794766415613 -5.7309134845392409 -3.88515519388439 -0.36129855524352916 -5.7233228556437341 -3.8561452837551613 -0.48390916282290219 -5.7157322267482291 -3.827135373625933 -0.60651977040227523 -5.6534498012658299 -4.0568887492628463 -0.11343167226145194 -5.645859172370324 -4.027878839133618 -0.23604227984082496 -5.6382685434748181 -3.9988689290043893 -0.35865288742019802 -5.6306779145793113 -3.9698590188751606 -0.48126349499957105 -5.6230872856838063 -3.9408491087459323 -0.60387410257894414 -5.5608048602014071 -4.1706024843828455 -0.11078600443812076 -5.5532142313059012 -4.1415925742536173 -0.23339661201749379 -5.5456236024103953 -4.112582664124389 -0.35600721959686688 -5.5380329735148885 -4.0835727539951598 -0.47861782717623991 -5.4681599191369834 -4.2843162195028448 -0.10814033661478957 -5.4605692902414784 -4.2553063093736165 -0.23075094419416259 -5.4529786613459716 -4.2262963992443883 -0.35336155177353573 -5.4453880324504658 -4.1972864891151591 -0.47597215935290876 -5.3755149780725606 -4.3980299546228441 -0.10549466879145838 -5.3679243491770556 -4.3690200444936158 -0.22810527637083142 -5.3603337202815489 -4.3400101343643875 -0.35071588395020453 -5.282870037008137 -4.5117436897428433 -0.1028490009681272 -5.275279408112632 -4.4827337796136151 -0.22545960854750025 -5.1902250959437142 -4.6254574248628426 -0.10020333314479601 -5.1826344670482083 -4.5964475147336143 -0.22281394072416905 -5.0975801548792914 -4.7391711599828419 -0.097557665321464843 -5.6143716142626436 -3.9132090523726588 -0.72648796145891181 -5.530338936919561 -4.0546887532629237 -0.60122873359721962 -5.5192191236947501 -4.0299759841738831 -0.72384954029248971 -5.4351864463516675 -4.1714556850641475 -0.59859031243079752 -5.4240666331268566 -4.146742915975107 -0.72121111912606761 -5.3511537690085857 -4.3129353859544128 -0.47333108456910539 -5.3400339557837739 -4.2882226168653723 -0.59595189126437542 -5.3289141425589639 -4.2635098477763318 -0.71857269795964551 -5.2671210916655022 -4.4544150868446781 -0.3480718567074132 -5.2560012784406922 -4.4297023177556376 -0.47069266340268323 -5.2448814652158804 -4.4049895486665971 -0.59331347009795332 -5.2337616519910704 -4.3802767795775566 -0.71593427679322341 -5.1719686010976087 -4.571182018645902 -0.34543343554099104 -5.1608487878727987 -4.5464692495568615 -0.46805424223626113 -5.1497289746479877 -4.521756480467821 -0.59067504893153122 -5.1386091614231777 -4.4970437113787805 -0.71329585562680131 -5.087935923754527 -4.7126617195361673 -0.22017420767929885 -5.0768161105297152 -4.6879489504471259 -0.34279501437456894 -5.0656962973049051 -4.6632361813580854 -0.46541582106983898 -5.0545764840800951 -4.6385234122690449 -0.58803662776510912 -5.0434566708552842 -4.6138106431800043 -0.71065743446037921 -5.0039032464114435 -4.8541414204264317 -0.094914979817606757 -4.9927834331866334 -4.8294286513373921 -0.21753578651287672 -4.9816636199618225 -4.8047158822483507 -0.34015659320814678 -4.9705438067370116 -4.7800031131593101 -0.46277739990341688 -4.9594239935122015 -4.7552903440702696 -0.58539820659868691 -4.9483041802873906 -4.7305775749812291 -0.708019013293957 -4.853151689719498 -4.8473445067824539 -0.7053805921275349 -6.4635554337349648 -2.6774032986243932 -0.01933235817101947 -6.3859030483723069 -2.8238955849325929 -0.016439290760987796 -6.3736920445305287 -2.7953265762053494 -0.13887386698101936 -6.3614810406887514 -2.7667575674781064 -0.26130844320105073 -6.3492700368469741 -2.7381885587508634 -0.38374301942108224 -6.3370590330051968 -2.7096195500236204 -0.50617759564111375 -6.3248480291634195 -2.681050541296377 -0.62861217186114526 -6.3082506630096491 -2.9703878712407925 -0.013546223350956125 -6.2960396591678709 -2.9418188625135491 -0.13598079957098769 -6.2838286553260936 -2.9132498537863061 -0.25841537579101909 -6.2716176514843163 -2.8846808450590626 -0.3808499520110506 -6.259406647642539 -2.8561118363318196 -0.50328452823108205 -6.2471956438007608 -2.8275428276045762 -0.62571910445111356 -6.2305982776469913 -3.1168801575489917 -0.010653155940924452 -6.2183872738052131 -3.0883111488217487 -0.13308773216095601 -6.2061762699634357 -3.0597421400945057 -0.25552230838098744 -6.1939652661216584 -3.0311731313672619 -0.37795688460101895 -6.1817542622798811 -3.0026041226400189 -0.50039146082105046 -6.1529458922843325 -3.2633724438571918 -0.0077600885308927716 -6.1407348884425543 -3.2348034351299484 -0.13019466475092434 -6.128523884600777 -3.2062344264027054 -0.25262924097095574 -6.1163128807590006 -3.177665417675462 -0.3750638171909873 -6.0752935069216747 -3.4098647301653915 -0.0048670211208610989 -6.0630825030798965 -3.381295721438148 -0.12730159734089266 -6.0508714992381192 -3.3527267127109051 -0.24973617356092406 -5.997641121559016 -3.5563570164735907 -0.0019739537108294258 -5.9854301177172387 -3.5277880077463477 -0.12440852993086099 -5.9077777323545808 -3.6742802940545474 -0.12151546252082931 -6.3127464558705579 -2.6522730617202921 -0.75105565593304979 -6.2369794429353078 -2.7951736161563892 -0.74831606137383788 -6.171103655293865 -2.9710624772928211 -0.62295305627101372 -6.1612124300000577 -2.9380741705924862 -0.74557646681462597 -6.1052278676524212 -3.1469513384292522 -0.49759005116818944 -6.0953366423586148 -3.1139630317289182 -0.62021346171180181 -6.0854454170648076 -3.0809747250285833 -0.74283687225541406 -6.0393520800109783 -3.3228401995656833 -0.37222704606536516 -6.0294608547171711 -3.2898518928653493 -0.49485045660897753 -6.0195696294233647 -3.2568635861650153 -0.61747386715258989 -6.0096784041295574 -3.2238752794646803 -0.74009727769620215 -5.9734762923695346 -3.4987290607021149 -0.24686404096254089 -5.9635850670757282 -3.4657407540017804 -0.36948745150615331 -5.953693841781921 -3.4327524473014464 -0.49211086204976567 -5.9438026164881146 -3.3997641406011123 -0.61473427259337798 -5.9339113911943082 -3.3667758339007778 -0.73735768313699035 -5.8977092794342845 -3.6416296151382119 -0.244124446403329 -5.8878180541404781 -3.6086413084378774 -0.36674785694694145 -5.8779268288466708 -3.5756530017375434 -0.48937126749055376 -5.8680356035528645 -3.5426646950372094 -0.61199467803416607 -5.8581443782590581 -3.5096763883368753 -0.73461808857777844 -5.8318334917928407 -3.8175184762746435 -0.11876144130050481 -5.8219422664990343 -3.784530169574309 -0.24138485184411712 -5.812051041205228 -3.751541862873975 -0.36400826238772954 -5.8021598159114207 -3.7185535561736409 -0.48663167293134191 -5.7922685906176143 -3.6855652494733069 -0.60925508347495427 -5.7823773653238089 -3.6525769427729728 -0.73187849401856664 -5.7066103523885587 -3.7954774972090699 -0.72913889945935473 -6.8547798886913922 -1.3724898987686553 -0.041751661445232832 -6.8113195298421232 -1.5174591705477023 -0.039259231329194615 -6.7949875799000452 -1.4878974086699048 -0.16156017450577673 -6.7786556299579681 -1.4583356467921078 -0.28386111768235867 -6.762323680015891 -1.4287738849143103 -0.40616206085894074 -6.7459917300738139 -1.3992121230365131 -0.52846300403552282 -6.7296597801317359 -1.3696503611587159 -0.65076394721210484 -6.7678591709928542 -1.6624284423267492 -0.036766801213156397 -6.7515272210507762 -1.6328666804489518 -0.1590677443897385 -6.7351952711086991 -1.6033049185711548 -0.28136868756632044 -6.718863321166622 -1.5737431566933573 -0.40366963074290252 -6.7025313712245449 -1.54418139481556 -0.52597057391948454 -6.6861994212824669 -1.5146196329377628 -0.64827151709606656 -6.7243988121435851 -1.8073977141057962 -0.034274371097118179 -6.7080668622015072 -1.7778359522279987 -0.15657531427370028 -6.6917349122594301 -1.7482741903502017 -0.27887625745028222 -6.675402962317353 -1.7187124284724042 -0.40117720062686429 -6.6590710123752759 -1.689150666594607 -0.52347814380344637 -6.6809384532943161 -1.9523669858848431 -0.031781940981079962 -6.6646065033522381 -1.9228052240070457 -0.15408288415766205 -6.648274553410161 -1.8932434621292487 -0.27638382733424399 -6.631942603468084 -1.8636817002514512 -0.39868477051082607 -6.6374780944450471 -2.0973362576638901 -0.029289510865041744 -6.6211461445029691 -2.0677744957860922 -0.15159045404162383 -6.604814194560892 -2.0382127339082956 -0.27389139721820577 -6.5940177355957781 -2.242305529442937 -0.026797080749003523 -6.5776857856537001 -2.2127437675651391 -0.1490980239255856 -6.561353835711623 -2.1831820056873426 -0.2713989671021676 -6.5505573767465091 -2.387274801221984 -0.024304650632965306 -6.5342254268044302 -2.3577130393441861 -0.14660559380954741 -6.5070970178972392 -2.5322440730010305 -0.021812220516927088 -6.6425272470650452 -1.6602563045686676 -0.64582434342358663 -6.6154814922129006 -1.8345269071502077 -0.52101331027649156 -6.5988052846474377 -1.8060498516789933 -0.64338780749137625 -6.5884357373607561 -2.0087975097317474 -0.39620227712939654 -6.5717595297952931 -1.9803204542605333 -0.51857677434428118 -6.5550833222298301 -1.9518433987893189 -0.64095127155916587 -6.5384071146643681 -1.9233663433181047 -0.76332576877405067 -6.5447137749431485 -2.1545910568420732 -0.39376574119718621 -6.5280375673776856 -2.1261140013708593 -0.5161402384120708 -6.5113613598122226 -2.0976369458996444 -0.6385147356269556 -6.4946851522467606 -2.0691598904284305 -0.76088923284184029 -6.517668020091004 -2.3288616594236129 -0.26895470805009114 -6.500991812525541 -2.3003846039523985 -0.39132920526497583 -6.484315604960079 -2.2719075484811846 -0.51370370247986052 -6.467639397394616 -2.2434304930099702 -0.63607819969474533 -6.4509631898291531 -2.2149534375387558 -0.75845269690963002 -6.4906222652388594 -2.503132262005153 -0.14414367490299612 -6.4739460576733974 -2.4746552065339387 -0.26651817211788076 -6.4572698501079335 -2.4461781510627243 -0.38889266933276551 -6.4405936425424715 -2.4177010955915099 -0.51126716654765025 -6.4239174349770085 -2.389224040120296 -0.63364166376253495 -6.4072412274115456 -2.3607469846490812 -0.75601616097741964 -6.4469003028212519 -2.6489258091154784 -0.14170713897078577 -6.4302240952557899 -2.6204487536442644 -0.26408163618567038 -6.4135478876903269 -2.5919716981730501 -0.38645613340055512 -6.3968716801248648 -2.5634946427018357 -0.50883063061543987 -6.3801954725594019 -2.5350175872306218 -0.63120512783032456 -6.3635192649939381 -2.5065405317594069 -0.75357962504520937 -6.9780198367796809 -0.0998627720486156 -0.0610547188095871 -6.9564795252860474 -0.071895308199887653 -0.18319325939648429 -6.9349392137924131 -0.043927844351159706 -0.30533179998338128 -6.9133989022987796 -0.015960380502431759 -0.42747034057027838 -6.9628055622786604 -0.25922084026239434 -0.058635938720747724 -6.941265250785027 -0.23125337641366639 -0.18077447930764493 -6.9197249392913927 -0.20328591256493833 -0.30291301989454195 -6.8981846277977592 -0.17531844871621044 -0.42505156048143905 -6.8766443163041249 -0.14735098486748252 -0.54719010106833621 -6.8551040048104905 -0.11938352101875455 -0.6693286416552332 -6.9475912877776409 -0.41857890847617307 -0.056217158631908348 -6.9260509762840066 -0.39061144462744513 -0.17835569921880556 -6.9045106647903722 -0.36264398077871701 -0.30049423980570256 -6.8829703532967388 -0.33467651692998912 -0.42263278039259972 -6.8614300418031045 -0.30670905308126117 -0.54477132097949688 -6.9323770132766205 -0.57793697668995181 -0.05379837854306898 -6.910836701782987 -0.54996951284122386 -0.17593691912996617 -6.8892963902893527 -0.52200204899249569 -0.29807545971686322 -6.8677560787957184 -0.49403458514376775 -0.42021400030376038 -6.9171627387756009 -0.73729504490373088 -0.051379598454229604 -6.8956224272819666 -0.70932758105500304 -0.17351813904112678 -6.8740821157883323 -0.68136011720627487 -0.29565667962802383 -6.9019484642745805 -0.89665311311750973 -0.048960818365390235 -6.8804081527809471 -0.86868564926878178 -0.17109935895228742 -6.8588678412873127 -0.8407181854200535 -0.2932378995391845 -6.886734189773561 -1.0560111813312885 -0.046542038276550859 -6.8651938782799267 -1.0280437174825605 -0.16868057886344806 -6.8715199152725406 -1.2153692495450672 -0.044123258187711491 -6.8400658467936761 -0.27680945099621979 -0.66698116192018941 -6.8463322132802018 -0.46478961608137281 -0.54239968377722636 -6.8251165037532644 -0.43326100987698046 -0.66466963872418494 -6.8525985797667275 -0.65276978116652584 -0.41781820563426336 -6.8313828702397901 -0.6212411749621336 -0.54008816058122189 -6.8101671607128527 -0.58971256875774114 -0.66235811552818047 -6.8376492367263157 -0.80922134004728652 -0.41550668243825889 -6.8164335271993783 -0.77769273384289428 -0.53777663738521742 -6.7952178176724409 -0.74616412763850182 -0.660046592332176 -6.8439156032128414 -0.99720150513243955 -0.29092520429529584 -6.822699893685904 -0.9656728989280472 -0.41319515924225442 -6.8014841841589666 -0.93414429272365496 -0.53546511418921294 -6.7802684746320292 -0.90261568651926249 -0.65773506913617152 -6.8501819696993671 -1.1851816702175926 -0.16634372615233284 -6.8289662601724297 -1.1536530640132003 -0.28861368109929136 -6.8077505506454923 -1.1221244578088079 -0.41088363604624994 -6.7865348411185549 -1.0905958516044156 -0.53315359099320847 -6.7653191315916175 -1.0590672454000232 -0.65542354594016705 -6.8352326266589554 -1.3416332290983533 -0.16403220295632834 -6.814016917132018 -1.310104622893961 -0.28630215790328684 -6.7928012076050805 -1.2785760166895686 -0.40857211285024547 -6.7715854980781431 -1.2470474104851763 -0.530842067797204 -6.7503697885512048 -1.2155188042807838 -0.65311202274416258 -6.8570510507037321 1.2902272345034618 -0.079797242019112383 -6.8304182414721772 1.3143283310443725 -0.20175576440948539 -6.8037854322406224 1.3384294275852828 -0.32371428679985825 -6.8726559894372361 1.1359572227211909 -0.077732670657604655 -6.8460231802056812 1.1600583192621015 -0.19969119304797767 -6.8193903709741264 1.1841594158030118 -0.32164971543835053 -6.7927575617425715 1.2082605123439223 -0.4436082378287235 -6.7661247525110166 1.2323616088848328 -0.56556676021909635 -6.7394919432794618 1.2564627054257433 -0.68752528260946932 -6.8882609281707401 0.98168721093892009 -0.075668099296096927 -6.8616281189391852 1.0057883074798304 -0.19762662168646994 -6.8349953097076304 1.0298894040207409 -0.3195851440768428 -6.8083625004760755 1.0539905005616514 -0.44154366646721577 -6.7817296912445206 1.078091597102562 -0.56350218885758863 -6.9038658669042441 0.82741719915664913 -0.0736035279345892 -6.8772330576726892 0.85151829569755944 -0.19556205032496221 -6.8506002484411344 0.87561939223846996 -0.31752057271533507 -6.8239674392095795 0.89972048877938049 -0.43947909510570804 -6.9194708056377481 0.67314718737437806 -0.071538956573081472 -6.8928379964061932 0.69724828391528848 -0.19349747896345448 -6.8662051871746383 0.72134938045619901 -0.31545600135382734 -6.9350757443712521 0.51887717559210722 -0.069474385211573744 -6.9084429351396972 0.54297827213301764 -0.19143290760194676 -6.8818101259081423 0.56707936867392816 -0.31339142999231961 -6.9506806831047561 0.3646071638098361 -0.067409813850066017 -6.9240478738732003 0.38870826035074652 -0.18936833624043903 -6.9662856218382592 0.2103371520275652 -0.065345242488558303 -6.754958344519669 1.1034950375179995 -0.68551233105207698 -6.7972520994898371 0.9245974263810367 -0.5614683687933103 -6.7703418534166344 0.9513066123473537 -0.68353026562102526 -6.8395458544600052 0.7456998152440738 -0.43742440653454356 -6.8126356083868025 0.7724090012103908 -0.55948630336225857 -6.7857253623135998 0.79911818717670791 -0.68154820018997353 -6.8549293633569706 0.59351139007342801 -0.43544234110349184 -6.8280191172837679 0.62022057603974512 -0.55750423793120685 -6.8011088712105652 0.64692976200606223 -0.67956613475892191 -6.8972231183271386 0.41461377893646495 -0.31139837884472504 -6.8703128722539359 0.44132296490278206 -0.43346027567244011 -6.8434026261807333 0.46803215086909922 -0.55552217250015512 -6.8164923801075306 0.49474133683541638 -0.67758406932787019 -6.9395168732973067 0.23571616779950205 -0.18735441658595836 -6.912606627224104 0.26242535376581921 -0.30941631341367332 -6.8856963811509022 0.28913453973213638 -0.43147821024138844 -6.8587861350776995 0.31584372569845348 -0.55354010706910339 -6.8318758890044968 0.34255291166477064 -0.67560200389681857 -6.9818106282674748 0.056818556662539169 -0.063310454327191512 -6.9549003821942721 0.083527742628856289 -0.18537235115490666 -6.9279901361210694 0.11023692859517348 -0.30743424798262164 -6.9010798900478676 0.13694611456149067 -0.42949614481033671 -6.8741696439746649 0.1636553005278078 -0.55155804163805178 -6.8472593979014622 0.19036448649412493 -0.67361993846576684 -6.8895531528716312 0.011466875357161895 -0.54957597620700005 -6.8626429067984285 0.038176061323479053 -0.67163787303471523 -6.4577009106142524 2.64490685351586 -0.095388951183991849 -6.5037379609905273 2.4943181101838463 -0.093665799647594111 -6.4725142011966526 2.5142036970644708 -0.21544523848791927 -6.441290441402777 2.5340892839450948 -0.33722467732824429 -6.4100666816089014 2.5539748708257193 -0.45900411616856934 -6.3788429218150267 2.5738604577063433 -0.58078355500889434 -6.3476191620211511 2.5937460445869678 -0.70256299384921939 -6.5497750113668021 2.3437293668518326 -0.091942648111196387 -6.5185512515729274 2.3636149537324571 -0.21372208695152153 -6.4873274917790518 2.3835005406130811 -0.33550152579184656 -6.4561037319851762 2.4033861274937056 -0.4572809646321716 -6.4248799721913015 2.4232717143743301 -0.57906040347249665 -6.5958120617430778 2.193140623519819 -0.090219496574798663 -6.5645883019492031 2.2130262104004434 -0.2119989354151238 -6.5333645421553266 2.2329117972810675 -0.33377837425544882 -6.5021407823614519 2.252797384161692 -0.45555781309577387 -6.6418491121193526 2.0425518801878053 -0.088496345038400925 -6.6106253523254779 2.0624374670684298 -0.21027578387872606 -6.5794015925316023 2.0823230539490543 -0.33205522271905108 -6.6878861624956283 1.8919631368557914 -0.086773193502003187 -6.6566624027017536 1.9118487237364159 -0.20855263234232832 -6.6254386429078771 1.9317343106170404 -0.33033207118265334 -6.733923212871904 1.741374393523778 -0.085050041965605463 -6.7026994530780284 1.7612599804044025 -0.20682948080593058 -6.7799602632481788 1.5907856501917643 -0.083326890429207726 -6.3932786751754742 2.4443747399724369 -0.70087963321808555 -6.4707083964061214 2.2733557247515321 -0.57735924029471186 -6.4385362451425898 2.2962995756319873 -0.69923863578282663 -6.5481381176367695 2.1023367095306269 -0.45383884737133817 -6.515965966373237 2.1252805604110825 -0.57571824285945294 -6.4837938151097045 2.1482244112915376 -0.69759763834756772 -6.5933956876038851 1.954261545190177 -0.45219784993607925 -6.5612235363403517 1.9772053960706328 -0.57407724542419403 -6.5290513850768193 2.000149246951088 -0.6959566409123088 -6.6708254088345313 1.783242529969272 -0.32867745701270557 -6.6386532575709998 1.8061863808497274 -0.45055685250082034 -6.6064811063074673 1.8291302317301832 -0.57243624798893511 -6.5743089550439349 1.8520740826106383 -0.69431564347704988 -6.7482551300651794 1.6122235147483668 -0.20515706408933199 -6.716082978801647 1.6351673656288221 -0.32703645957744665 -6.6839108275381154 1.6581112165092775 -0.44891585506556142 -6.651738676274582 1.6810550673897333 -0.57079525055367619 -6.6195665250110496 1.7039989182701887 -0.69267464604179096 -6.8256848512958266 1.4412044995274615 -0.081636671165958227 -6.7935127000322941 1.4641483504079171 -0.20351606665407304 -6.7613405487687626 1.4870922012883723 -0.32539546214218773 -6.7291683975052301 1.5100360521688279 -0.4472748576303025 -6.6969962462416976 1.5329799030492834 -0.56915425311841727 -6.6648240949781652 1.555923753929739 -0.69103364860653205 -6.7744259674723457 1.361960887828378 -0.44563386019504359 -6.7422538162088124 1.3849047387088336 -0.56751325568315836 -6.7100816649452799 1.4078485895892892 -0.68939265117127313 -5.8721180133820168 3.7478960603372768 -0.10508155098582303 -5.8376932964296229 3.7612524410255799 -0.22664347331487994 -5.8032685794772281 3.7746088217138825 -0.34820539564393665 -5.7688438625248342 3.7879652024021859 -0.46976731797299348 -5.7344191455724403 3.8013215830904885 -0.59132924030205025 -5.9461520304313566 3.6098971038312593 -0.10386957511228016 -5.9117273134789636 3.6232534845195623 -0.22543149744133706 -5.8773025965265688 3.6366098652078649 -0.34699341977039377 -5.8428778795741749 3.6499662458961684 -0.4685553420994506 -5.8084531626217801 3.6633226265844709 -0.59011726442850743 -6.0201860474806974 3.4718981473252417 -0.1026575992387373 -5.9857613305283035 3.4852545280135447 -0.22421952156779418 -5.9513366135759096 3.4986109087018473 -0.34578144389685089 -5.9169118966235157 3.5119672893901508 -0.46734336622590772 -6.0942200645300382 3.3338991908192241 -0.10144562336519442 -6.0597953475776443 3.3472555715075272 -0.2230075456942513 -6.0253706306252504 3.3606119521958298 -0.34456946802330801 -5.9909459136728556 3.3739683328841328 -0.46613139035236489 -6.168254081579378 3.1959002343132066 -0.10023364749165153 -6.1338293646269841 3.2092566150015096 -0.22179556982070842 -6.0994046476745902 3.2226129956898122 -0.34335749214976519 -6.2422880986287188 3.057901277807189 -0.099021671618108667 -6.2078633816763249 3.071257658495492 -0.22058359394716553 -6.3163221156780587 2.919902321301171 -0.097809695744565786 -5.7734651580846501 3.677720174137999 -0.7117093585124713 -5.8822612233233835 3.525741322213217 -0.58891739160805567 -5.8459260033984073 3.5426290294296869 -0.71058164750348229 -5.9547220686371407 3.3906501775049049 -0.58778968059906667 -5.9183868487121645 3.4075378847213749 -0.70945393649449329 -6.063518133875875 3.2386713255801225 -0.46499771369465098 -6.0271829139508979 3.2555590327965929 -0.58666196959007766 -5.9908476940259217 3.2724467400130628 -0.70832622548550428 -6.1723141991146093 3.0866924736553405 -0.3422057467902353 -6.1359789791896322 3.1035801808718104 -0.46387000268566198 -6.0996437592646551 3.1204678880882808 -0.58553425858108865 -6.0633085393396788 3.1373555953047507 -0.70719851447651527 -6.2811102643533436 2.9347136217305589 -0.21941377988581975 -6.2447750444283665 2.951601328947028 -0.34107803578124629 -6.2084398245033894 2.9684890361634979 -0.46274229167667297 -6.1721046045784123 2.9853767433799683 -0.58440654757209964 -6.135769384653436 3.0022644505964382 -0.70607080346752615 -6.389906329592077 2.7827347698057769 -0.096621812981404029 -6.3535711096670999 2.7996224770222469 -0.21828606887683072 -6.3172358897421237 2.8165101842387159 -0.33995032477225728 -6.2809006698171466 2.8333978914551858 -0.4616145806676839 -6.2445654498921694 2.8502855986716558 -0.58327883656311053 -6.2082302299671923 2.8671733058881257 -0.70494309245853715 -6.4260319549808571 2.6645313323139344 -0.21715835786784168 -6.38969673505588 2.6814190395304038 -0.33882261376326828 -6.3533615151309029 2.6983067467468738 -0.4604868696586949 -6.3170262952059257 2.7151944539633437 -0.58215112555412152 -6.2806910752809495 2.7320821611798136 -0.70381538144954803 -5.0024335006200644 4.8511406309165439 -0.11027107834305588 -4.9656290442244426 4.8581345442923345 -0.23157840799564797 -4.9288245878288208 4.865128457668126 -0.35288573764823988 -4.892020131433199 4.8721223710439165 -0.47419306730083188 -5.1019710491225432 4.730014703513941 -0.10975535080746081 -5.0651665927269214 4.7370086168897316 -0.23106268046005288 -5.0283621363312996 4.7440025302655222 -0.35237001011264479 -4.9915576799356778 4.7509964436413128 -0.47367733976523679 -4.954753223540056 4.7579903570171043 -0.59498466941782868 -5.2015085976250219 4.6088887761113373 -0.10923962327186573 -5.1647041412294001 4.6158826894871288 -0.23054695292445779 -5.1278996848337783 4.6228766028629193 -0.3518542825770497 -5.0910952284381565 4.6298705162387099 -0.4731616122296417 -5.0542907720425347 4.6368644296145014 -0.59446894188223354 -5.3010461461275007 4.4877628487087344 -0.10872389573627066 -5.2642416897318789 4.4947567620845259 -0.2300312253888627 -5.227437233336258 4.5017506754603165 -0.35133855504145461 -5.1906327769406362 4.5087445888361071 -0.47264588469404656 -5.4005836946299803 4.3666369213061316 -0.10820816820067558 -5.3637792382343585 4.3736308346819222 -0.22951549785326761 -5.3269747818387367 4.3806247480577127 -0.35082282750585952 -5.50012124313246 4.2455109939035278 -0.1076924406650805 -5.4633167867368382 4.2525049072793184 -0.22899977031767255 -5.5996587916349387 4.1243850665009241 -0.10717671312948543 -4.9177035110049649 4.7652795508531671 -0.71630342400922886 -5.0153942313284441 4.6463771448511606 -0.71587372856636688 -5.1520977644187083 4.5178220358213199 -0.59403383005676857 -5.1130849516519232 4.5274747388491541 -0.71544403312350491 -5.2888012975089733 4.3892669267914792 -0.47219393154717032 -5.2497884847421874 4.3989196298193134 -0.5936041346139066 -5.2107756719754024 4.4085723328471476 -0.71501433768064293 -5.4255048305992375 4.2607118177616385 -0.35035403303757201 -5.3864920178324525 4.2703645207894727 -0.47176423610430834 -5.3474792050656665 4.2800172238173069 -0.59317443917104462 -5.3084663922988815 4.289669926845141 -0.71458464223778095 -5.5622083636895026 4.1321567087317979 -0.22851413452797378 -5.5231955509227166 4.141809411759632 -0.34992433759471003 -5.4841827381559307 4.1514621147874662 -0.47133454066144637 -5.4451699253891457 4.1611148178153003 -0.59274474372818264 -5.4061571126223598 4.1707675208431345 -0.71415494679491898 -5.6989118967797676 4.0036015997019572 -0.1066742360183754 -5.6598990840129817 4.0132543027297913 -0.22808443908511181 -5.6208862712461949 4.0229070057576255 -0.34949464215184811 -5.5818734584794099 4.0325597087854597 -0.47090484521858439 -5.5428606457126239 4.0422124118132938 -0.59231504828532067 -5.5038478329458389 4.051865114841128 -0.713725251352057 -5.7966026171032459 3.8846991936999511 -0.10624454057551344 -5.7575898043364599 3.8943518967277853 -0.22765474364224986 -5.718576991569674 3.904004599755619 -0.34906494670898613 -5.6795641788028881 3.9136573027834531 -0.47047514977572241 -5.6405513660361031 3.9233100058112873 -0.59188535284245869 -5.6015385532693172 3.932962708839121 -0.71329555590919502 -5.6992292735927963 3.8140603028371141 -0.71286586046633305 -3.9261521785926266 5.7625136532922889 -0.10651546208620803 -3.8889024290544074 5.7621049577816352 -0.22748725510811668 -3.8516526795161887 5.7616962622709806 -0.34845904813002521 -4.0478257435301455 5.6625360571387722 -0.10699453403556627 -4.0105759939919272 5.6621273616281185 -0.22796632705747494 -3.9733262444537081 5.6617186661174639 -0.34893812007938346 -3.9360764949154889 5.6613099706068102 -0.4699099131012921 -3.8988267453772694 5.6609012750961565 -0.59088170612320068 -3.8615769958390502 5.6604925795855028 -0.71185349914510931 -4.1694993084676648 5.5625584609852554 -0.10747360598492453 -4.1322495589294466 5.5621497654746017 -0.22844539900683319 -4.0949998093912274 5.5617410699639471 -0.34941719202874172 -4.0577500598530083 5.5613323744532934 -0.47038898505065035 -4.0205003103147892 5.5609236789426397 -0.59136077807255893 -4.2911728734051842 5.4625808648317387 -0.10795267793428277 -4.2539231238669659 5.462172169321085 -0.22892447095619145 -4.2166733743287468 5.4617634738104304 -0.34989626397809998 -4.1794236247905276 5.4613547782997776 -0.47086805700000861 -4.4128464383427035 5.3626032686782219 -0.10843174988364103 -4.3755966888044853 5.3621945731675682 -0.22940354290554971 -4.3383469392662661 5.3617858776569145 -0.35037533592745823 -4.5345200032802229 5.2626256725247051 -0.10891082183299927 -4.4972702537420046 5.2622169770140514 -0.22988261485490796 -4.6561935682177422 5.1626480763711884 -0.10938989378235753 -4.7778671331552625 5.0626704802176725 -0.10986896573171577 -3.9809136492979347 5.5624119081654664 -0.71241429843800219 -4.1403394268383851 5.4624351467098062 -0.59190400503895235 -4.0997119932290831 5.46476819495577 -0.71299392369332604 -4.2997652043788355 5.3624583852541461 -0.47139371163990246 -4.2591377707695335 5.3647914335001099 -0.5924836302942762 -4.2185103371602324 5.3671244817460737 -0.71357354894864988 -4.459190981919285 5.2624816237984859 -0.35088341824085251 -4.4185635483099839 5.2648146720444498 -0.47197333689522636 -4.3779361147006819 5.2671477202904136 -0.59306325554960004 -4.3373086810913808 5.2694807685363774 -0.71415317420397384 -4.6186167594597345 5.1625048623428258 -0.23037312484180264 -4.5779893258504334 5.1648379105887896 -0.35146304349617641 -4.5373618922411323 5.1671709588347534 -0.47255296215055026 -4.4967344586318312 5.1695040070807172 -0.593642880804924 -4.4561070250225292 5.171837055326681 -0.71473279945929769 -4.7374151033908829 5.0648611491331295 -0.23095275009712651 -4.6967876697815818 5.0671941973790933 -0.35204266875150031 -4.6561602361722807 5.0695272456250571 -0.47313258740587411 -4.6155328025629796 5.0718602938710209 -0.59422250606024785 -4.5749053689536785 5.0741933421169847 -0.71531242471462164 -4.8968408809313333 4.9648843876774702 -0.11044245669807651 -4.8562134473220313 4.967217435923434 -0.23153237535245039 -4.8155860137127302 4.9695504841693978 -0.35262229400682421 -4.77495858010343 4.9718835324153616 -0.47371221266119801 -4.734331146494128 4.9742165806613254 -0.5948021313155718 -4.6937037128848278 4.9765496289072892 -0.71589204996994549 -4.8531294904252773 4.8765728674516291 -0.59538175657089565 -4.8125020568159762 4.8789059156975929 -0.71647167522526944 -2.6848727793452545 6.443765037319884 -0.089714587795890893 -2.8239516854518594 6.3689963598805974 -0.091627875674338818 -2.7871975847884527 6.361592202627592 -0.21213860325415523 -2.750443484125046 6.3541880453745856 -0.33264933083397147 -2.7136893834616389 6.3467838881215801 -0.45316005841378781 -2.6769352827982322 6.3393797308685738 -0.57367078599360422 -2.6401811821348256 6.3319755736155683 -0.69418151357342051 -2.9630305915584643 6.2942276824413108 -0.093541163552786744 -2.9262764908950576 6.2868235251883053 -0.21405189113260314 -2.8895223902316509 6.279419367935299 -0.33456261871241938 -2.8527682895682442 6.2720152106822935 -0.45507334629223573 -2.8160141889048376 6.2646110534292871 -0.57558407387205213 -3.1021094976650692 6.2194590050020251 -0.095454451431234669 -3.0653553970016625 6.2120548477490187 -0.21596517901105106 -3.0286012963382558 6.2046506904960133 -0.33647590659086729 -2.9918471956748491 6.1972465332430069 -0.45698663417068364 -3.2411884037716741 6.1446903275627394 -0.097367739309682594 -3.2044343031082674 6.137286170309733 -0.21787846688949897 -3.1676802024448607 6.1298820130567266 -0.3383891944693152 -3.3802673098782789 6.0699216501234527 -0.099281027188130519 -3.3435132092148723 6.0625174928704464 -0.21979175476794691 -3.3067591085514656 6.0551133356174409 -0.34030248234776311 -3.5193462159848843 5.9951529726841661 -0.10119431506657846 -3.4825921153214776 5.9877488154311607 -0.22170504264639482 -3.6584251220914892 5.9203842952448804 -0.10310760294502638 -2.7783601557679849 6.2576786378180786 -0.69613615562214737 -2.9546176810297555 6.1900915864350869 -0.57751920822379865 -2.9145249398467046 6.1844375335583308 -0.69818335476850801 -3.1308752062915257 6.1225045350520952 -0.45890226082544988 -3.0907824651084752 6.1168504821753391 -0.5795664073701593 -3.0506897239254243 6.111196429298583 -0.70023055391486866 -3.2670399903702454 6.0492634307923474 -0.46094945997181058 -3.2269472491871949 6.0436093779155913 -0.58161360651651994 -3.1868545080041439 6.0379553250388351 -0.7022777530612293 -3.4432975156320156 5.9816763794093557 -0.34233251257346176 -3.4032047744489651 5.9760223265325996 -0.46299665911817123 -3.3631120332659146 5.9703682736558434 -0.58366080566288059 -3.3230192920828636 5.9647142207790873 -0.70432495220759006 -3.6195550408937862 5.914089328026364 -0.2237155651751131 -3.5794622997107353 5.9084352751496079 -0.34437971171982246 -3.5393695585276848 5.9027812222728517 -0.46504385826453193 -3.4992768173446342 5.8971271693960956 -0.58570800480924134 -3.4591840761615833 5.8914731165193404 -0.70637215135395071 -3.7958125661555564 5.8465022766433723 -0.10509861777676424 -3.7557198249725059 5.8408482237666162 -0.22576276432147377 -3.7156270837894549 5.83519417088986 -0.34642691086618316 -3.6755343426064044 5.8295401180131039 -0.46709105741089257 -3.6354416014233539 5.8238860651363487 -0.58775520395560199 -3.595348860240303 5.8182320122595925 -0.70841935050031146 -3.8116991266851241 5.756299013753357 -0.46913825655725327 -3.7716063855020732 5.7506449608766008 -0.58980240310196275 -3.7315136443190222 5.7449909079998456 -0.71046654964667211 -1.4612059736285696 6.8244945819009626 -0.058060023594051741 -1.4265653191792551 6.8102024151147287 -0.17794815995648766 -1.3919246647299404 6.7959102483284957 -0.29783629631892339 -1.3572840102806256 6.7816180815422618 -0.41772443268135928 -1.6147943852555784 6.777084775996534 -0.062020493712870953 -1.5801537308062636 6.7627926092103001 -0.18190863007530686 -1.5455130763569491 6.7485004424240671 -0.30179676643774261 -1.5108724219076342 6.7342082756378332 -0.42168490280017851 -1.4762317674583196 6.7199161088515993 -0.54157303916261434 -1.4415911130090049 6.7056239420653645 -0.66146117552505024 -1.7683827968825871 6.7296749700921055 -0.065980963831690165 -1.7337421424332724 6.7153828033058716 -0.18586910019412606 -1.6991014879839579 6.7010906365196385 -0.30575723655656184 -1.6644608335346429 6.6867984697334046 -0.42564537291899773 -1.6298201790853284 6.6725063029471707 -0.54553350928143363 -1.9219712085095959 6.6822651641876769 -0.069941433950509377 -1.8873305540602812 6.6679729974014439 -0.18982957031294528 -1.8526898996109666 6.65368083061521 -0.30971770667538107 -1.8180492451616517 6.639388663828977 -0.42960584303781696 -2.0755596201366044 6.6348553582832492 -0.073901904069328589 -2.0409189656872901 6.6205631914970162 -0.19379004043176448 -2.0062783112379754 6.6062710247107814 -0.31367817679420029 -2.2291480317636134 6.5874455523788207 -0.077862374188147801 -2.1945073773142987 6.5731533855925877 -0.19775051055058371 -2.382736443390622 6.540035746474393 -0.081822844306967013 -1.5931630382081063 6.6588076795502662 -0.66550939054117098 -1.7817567049578207 6.6255827219217949 -0.54956585915301381 -1.7428926667256084 6.6125336884838681 -0.66963777080456965 -1.9703503717075352 6.5923577642933244 -0.4336223277648566 -1.9314863334753229 6.5793087308553968 -0.55369423941641249 -1.8926222952431107 6.5662596974174692 -0.67376615106796833 -2.1589440384572498 6.5591328066648531 -0.31767879637669943 -2.1200800002250375 6.5460837732269255 -0.43775070802825533 -2.0812159619928252 6.5330347397889978 -0.55782261967981117 -2.0423519237606129 6.5199857063510702 -0.67789453133136701 -2.3475377052069639 6.5259078490363818 -0.20173526498854236 -2.3086736669747516 6.512858815598455 -0.32180717664009817 -2.2698096287425393 6.4998097821605274 -0.44187908829165401 -2.230945590510327 6.4867607487225998 -0.56195099994320985 -2.1920815522781147 6.4737117152846722 -0.68202291159476569 -2.5361313719566785 6.4926828914079104 -0.085791733600385139 -2.4972673337244662 6.4796338579699837 -0.20586364525194106 -2.4584032954922539 6.4665848245320561 -0.3259355569034969 -2.4195392572600416 6.4535357910941284 -0.44600746855505274 -2.3806752190278293 6.4404867576562008 -0.56607938020660853 -2.341811180795617 6.4274377242182732 -0.68615129185816437 -2.646996962241968 6.4333598669035847 -0.20999202551533977 -2.6081329240097562 6.420310833465658 -0.33006393716689558 -2.5692688857775434 6.4072618000277304 -0.45013584881845142 -2.5304048475453316 6.3942127665898028 -0.57020776047000732 -2.4915408093131193 6.3811637331518751 -0.69027967212156316 -0.15221439530728231 6.9835833530434792 -0.0071631420927417769 -0.12073400113248967 6.9629835848648023 -0.12631267860172218 -0.089253606957696685 6.9423838166861236 -0.24546221511070243 -0.057773212782903927 6.9217840485074458 -0.36461175161968273 -0.026292818608111002 6.9011842803287671 -0.48376128812866304 -0.31704008264642536 6.9660455483539492 -0.013718246993282598 -0.28555968847163271 6.9454457801752723 -0.132867783502263 -0.25407929429683973 6.9248460119965936 -0.25201732001124322 -0.22259890012204703 6.9042462438179157 -0.37116685652022358 -0.19111850594725416 6.883646475639237 -0.49031639302920388 -0.15963811177246132 6.8630467074605592 -0.60946592953818413 -0.48186576998556818 6.9485077436644191 -0.020273351893823406 -0.45038537581077565 6.9279079754857422 -0.13942288840280381 -0.41890498163598261 6.9073082073070635 -0.258572424911784 -0.38742458746118991 6.8867084391283857 -0.37772196142076436 -0.35594419328639709 6.866108670949707 -0.49687149792974467 -0.64669145732471101 6.9309699389748891 -0.026828456794364217 -0.61521106314991847 6.9103701707962122 -0.1459779933033446 -0.58373066897512549 6.8897704026175335 -0.26512752981232485 -0.55225027480033284 6.8691706344388557 -0.38427706632130515 -0.81151714466385383 6.9134321342853591 -0.033383561694905028 -0.78003675048906129 6.8928323661066822 -0.15253309820388541 -0.74855635631426831 6.8722325979280043 -0.27168263471286563 -0.97634283200299721 6.895894329595829 -0.039938666595445857 -0.94486243782820445 6.8752945614171521 -0.15908820310442623 -1.1411685193421401 6.8783565249062999 -0.046493771495986665 -0.12660375792172618 6.8425865633611496 -0.7286829711005306 -0.32302392107307143 6.8456382765562704 -0.61608358370904182 -0.28704632397907481 6.8254425843820092 -0.73542848173721698 -0.51944408422441624 6.8486899897513922 -0.50348419631755292 -0.48346648713041984 6.8284942975771301 -0.6228290943457282 -0.44748889003642334 6.8082986054028689 -0.74217399237390336 -0.71586424737576149 6.8517417029465131 -0.39088480892606403 -0.67988665028176487 6.8315460107722519 -0.5102297069542393 -0.64390905318776837 6.8113503185979898 -0.62957460498241447 -0.60793145609377186 6.7911546264237277 -0.74891950301058974 -0.91228441052710652 6.8547934161416348 -0.27828542153457525 -0.87630681343311001 6.8345977239673728 -0.39763031956275041 -0.84032921633911339 6.8144020317931107 -0.51697521759092568 -0.80435161924511689 6.7942063396188486 -0.63632011561910085 -0.76837402215112038 6.7740106474445874 -0.75566501364727601 -1.1087045736784513 6.8578451293367557 -0.1656860341430865 -1.0727269765844549 6.8376494371624936 -0.28503093217126158 -1.0367493794904585 6.8174537449882315 -0.40437583019943674 -1.0007717823964619 6.7972580528139703 -0.52372072822761206 -0.9647941853024653 6.7770623606397082 -0.64306562625578712 -0.92881658820846891 6.7568666684654461 -0.76241052428396239 -1.3051247368297965 6.8608968425318757 -0.053086646751597563 -1.2691471397358001 6.8407011503576145 -0.17243154477977282 -1.2331695426418035 6.8205054581833533 -0.29177644280794796 -1.1971919455478071 6.8003097660090912 -0.41112134083612312 -1.1612143484538104 6.7801140738348291 -0.53046623886429833 -1.1252367513598138 6.759918381660567 -0.6498111368924735 -1.321656914511159 6.7629700948556888 -0.53721174950098471 -1.2856793174171623 6.7427744026814267 -0.65655664752915976 1.2504063071272076 6.8655389464578001 -0.056843029599117578 1.2765264198716837 6.8393672540551211 -0.17548364583382456 1.3026465326161598 6.8131955616524431 -0.29412426206853154 1.3287666453606362 6.787023869249766 -0.41276487830323855 1.0773902996860762 6.8808113062771028 -0.065732519881300064 1.1035104124305524 6.8546396138744248 -0.18437313611600703 1.1296305251750285 6.8284679214717467 -0.30301375235071404 1.1557506379195048 6.8022962290690696 -0.42165436858542105 1.181870750663981 6.7761245366663916 -0.54029498482012805 1.2079908634084573 6.7499528442637136 -0.65893560105483495 0.90437429224494481 6.8960836660964056 -0.074622010163482549 0.93049440498942104 6.8699119736937284 -0.19326262639818953 0.95661451773389716 6.8437402812910504 -0.31190324263289654 0.98273463047837351 6.8175685888883724 -0.43054385886760355 1.0088547432228496 6.7913968964856943 -0.5491844751023105 0.73135828480381337 6.9113560259157092 -0.083511500445665035 0.75747839754828972 6.8851843335130312 -0.20215211668037203 0.78359851029276584 6.8590126411103531 -0.32079273291507904 0.80971862303724207 6.832840948707676 -0.43943334914978605 0.55834227736268205 6.9266283857350119 -0.092400990727847521 0.58446239010715828 6.9004566933323348 -0.2110416069625545 0.61058250285163451 6.8742850009296568 -0.32968222319726154 0.38532626992155072 6.9419007455543156 -0.10129048101003001 0.41144638266602701 6.9157290531516376 -0.21993109724473697 0.21231026248041923 6.9571731053736183 -0.11017997129221251 0.013174142294811753 6.9986171575956 -0.00042884533968791177 1.0391460622457303 6.7648068188998689 -0.66786308406313721 0.84025146662620365 6.8062266454439362 -0.5581141579962281 0.87214696482499088 6.7794756636127866 -0.67680737835145954 0.64135687100667715 6.8476464719880026 -0.44836523192931887 0.67325236920546438 6.8208954901568539 -0.56705845228455043 0.7051478674042515 6.7941445083257044 -0.68575167263978187 0.44246227538715077 6.889066298532069 -0.33861630586240965 0.474357773585938 6.8623153167009203 -0.4573095262176412 0.50625327178472523 6.8355643348697717 -0.57600274657287276 0.53814876998351235 6.8088133530386221 -0.6946959669281042 0.24356767976762408 6.9304861250761363 -0.22886737979550045 0.27546317796641134 6.9037351432449867 -0.34756060015073204 0.30735867616519863 6.8769841614138381 -0.46625382050596359 0.33925417436398586 6.8502331795826894 -0.58494704086119509 0.37114967256277304 6.8234821977515399 -0.70364026121642653 0.044673084148097682 6.9719059516202035 -0.11911845372859131 0.076568582346884892 6.945154969789054 -0.23781167408382281 0.10846408054567214 6.9184039879579053 -0.35650489443905437 0.1403595787444594 6.8916530061267558 -0.47519811479428592 0.17225507694324665 6.8649020242956071 -0.59389133514951742 0.20415057514203383 6.8381510424644576 -0.71258455550474886 0.005255979522507415 6.8795708690085249 -0.60283562943783975 0.037151477721294644 6.8528198871773762 -0.72152884979307119 2.6053815024552343 6.4678713720662202 -0.10418429829744649 2.6236405637893263 6.4377640636046376 -0.22295182420348558 2.6418996251234179 6.4076567551430568 -0.34171935010952459 2.4384282061250784 6.5166668404419585 -0.11312388494707903 2.4566872674591704 6.4865595319803759 -0.23189141085311812 2.474946328793262 6.4564522235187951 -0.35065893675915716 2.4932053901273541 6.4263449150572134 -0.46942646266519616 2.5114644514614457 6.3962376065956317 -0.5881939885712355 2.5297235127955378 6.36613029813405 -0.70696151447727451 2.2532158484608313 6.5955696172792777 -0.0032959456906722778 2.2714749097949225 6.5654623088176969 -0.12206347159671158 2.2897339711290146 6.5353550003561143 -0.24083099750275067 2.3079930324631062 6.5052476918945334 -0.35959852340878973 2.3262520937971982 6.4751403834329517 -0.47836604931482873 2.0862625521306755 6.644365085655016 -0.012235532340304833 2.1045216134647666 6.6142577771934352 -0.13100305824634412 2.1227806747988587 6.5841504687318526 -0.24977058415238323 2.1410397361329507 6.5540431602702718 -0.36853811005842224 1.9193092558005191 6.6931605540307553 -0.021175118989937403 1.9375683171346108 6.6630532455691736 -0.13994264489597669 1.9558273784687026 6.6329459371075918 -0.2587101708020158 1.7523559594703633 6.7419560224064936 -0.030114705639569955 1.7706150208044551 6.7118487139449119 -0.14888223154560926 1.5854026631402074 6.7907514907822328 -0.039054292289202507 2.3445169479565693 6.4450313417347429 -0.59713345921253957 2.3685085748961239 6.4132088265825713 -0.7157861835629552 2.159471527947761 6.5238841701539858 -0.48730217682779292 2.1834631548873156 6.4920616550018133 -0.60595490117820872 2.2074547818268702 6.4602391398496417 -0.72460762552862434 1.9744261079389522 6.6027369985732278 -0.37747089444304638 1.9984177348785073 6.5709144834210562 -0.49612361879346206 2.0224093618180619 6.5390919682688837 -0.61477634314387786 2.0464009887576164 6.5072694531167121 -0.73342906749429349 1.7893806879301439 6.6815898269924698 -0.26763961205829978 1.8133723148696985 6.6497673118402982 -0.38629233640871552 1.8373639418092536 6.6179447966881266 -0.50494506075913126 1.8613555687488081 6.5861222815359541 -0.623597785109547 1.8853471956883627 6.5542997663837825 -0.74225050945996263 1.6043352679213352 6.7604426554117119 -0.15780832967355321 1.6283268948608902 6.7286201402595402 -0.27646105402396892 1.6523185218004448 6.6967976251073686 -0.39511377837438466 1.6763101487399996 6.664975109955197 -0.5137665027248004 1.7003017756795544 6.6331525948030245 -0.63241922707521614 1.724293402619109 6.6013300796508529 -0.75107195142563177 1.4192898479125267 6.8392954838309539 -0.04797704728880664 1.4432814748520815 6.8074729686787814 -0.16662977163922232 1.4672731017916363 6.7756504535266098 -0.28528249598963806 1.4912647287311911 6.7438279383744382 -0.4039352203400538 1.5152563556707457 6.7120054232222666 -0.52258794469046954 1.5392479826103005 6.680182908070095 -0.64124066904088528 1.5632396095498551 6.6483603929179234 -0.75989339339130091 1.354202562601492 6.759035736489337 -0.53140938665613868 1.3781941895410466 6.7272132213371654 -0.65006211100655442 3.7852321557580249 5.8644870058691465 -0.050169119040084274 3.7952999925703605 5.832319382421157 -0.16950644029176948 3.8053678293826967 5.8001517589731675 -0.2888437615434547 3.8154356661950328 5.767984135525178 -0.40818108279513987 3.825503503007369 5.7358165120771885 -0.52751840404682526 3.6382175738375104 5.9415730069675918 -0.056829287402565397 3.6482854106498461 5.9094053835196023 -0.1761666086542506 3.6583532474621823 5.8772377600716128 -0.29550392990593582 3.6684210842745184 5.8450701366236233 -0.41484125115762099 3.6784889210868545 5.8129025131756338 -0.53417857240930644 3.6885567578991907 5.7807348897276443 -0.65351589366099172 3.491202991916996 6.0186590080660372 -0.063489455765046526 3.5012708287293317 5.9864913846180476 -0.18282677701673172 3.5113386655416678 5.9543237611700581 -0.30216409826841695 3.521406502354004 5.9221561377220686 -0.42150141952010212 3.5314743391663401 5.8899885142740791 -0.54083874077178762 3.3441884099964816 6.0957450091644825 -0.070149624127527649 3.3542562468088173 6.063577385716493 -0.18948694537921285 3.3643240836211534 6.0314097622685034 -0.30882426663089807 3.3743919204334896 5.9992421388205139 -0.42816158788258324 3.1971738280759672 6.1728310102629278 -0.076809792490008771 3.2072416648883029 6.1406633868149383 -0.19614711374169397 3.217309501700639 6.1084957633669488 -0.31548443499337919 3.0501592461554528 6.2499170113613731 -0.083469960852489908 3.0602270829677884 6.2177493879133845 -0.20280728210417512 2.9031446642349383 6.3270030124598193 -0.09013012921497103 3.5443242870043465 5.8563586533965291 -0.66006543169778897 3.3870198393885818 5.9657289731215695 -0.54739710776163575 3.4013430237172 5.9313248003925905 -0.66656521560764437 3.2297153917728174 6.0750992928466099 -0.4347287838254823 3.2440385761014352 6.0406951201176309 -0.55389689167149114 3.2583617604300534 6.0062909473886519 -0.67306499951749965 3.0724109441570526 6.1844696125716503 -0.32206045988932913 3.0867341284856704 6.1500654398426713 -0.44122856773533764 3.1010573128142882 6.1156612671136923 -0.56039667558134654 3.1153804971429064 6.0812570943847133 -0.67956478342735505 2.9151064965412878 6.2938399322966907 -0.20939213595317596 2.9294296808699056 6.2594357595677117 -0.32856024379918447 2.9437528651985234 6.2250315868387327 -0.44772835164519298 2.9580760495271416 6.1906274141097537 -0.56689645949120182 2.9723992338557599 6.1562232413807747 -0.68606456733721033 2.7578020489255235 6.4032102520217311 -0.096723812017022764 2.7721252332541413 6.3688060792927521 -0.2158919198630313 2.7864484175827591 6.3344019065637731 -0.33506002770903981 2.8007716019113769 6.2999977338347941 -0.45422813555504832 2.8150947862399951 6.2655935611058151 -0.57339624340105722 2.8294179705686133 6.231189388376837 -0.69256435124706572 2.6577903386242299 6.3749638808308555 -0.46072791946490366 2.6721135229528481 6.3405597081018774 -0.5798960273109125 2.6864367072814663 6.3061555353728984 -0.69906413515692101 4.9238307391550142 4.9680581967301443 -0.011553229973864654 4.9263179537559756 4.935298522260875 -0.13150853576949503 4.7987864411749985 5.0696270764854479 -0.015662542310666626 4.8012736557759599 5.0368674020161786 -0.13561784810629701 4.8037608703769221 5.0041077275469101 -0.25557315390192731 4.8062480849778844 4.9713480530776417 -0.37552845969755766 4.8087352995788457 4.9385883786083724 -0.49548376549318829 4.8112225141798071 4.9058287041391031 -0.61543907128881858 4.8137097287807684 4.8730690296698347 -0.73539437708444888 4.6737421431949828 5.1711959562407515 -0.019771854647468601 4.6762293577959442 5.138436281771483 -0.13972716044309899 4.6787165723969064 5.1056766073022137 -0.25968246623872926 4.6812037869978687 5.0729169328329453 -0.37963777203435961 4.68369100159883 5.040157258363676 -0.4995930778299903 4.6861782161997914 5.0073975838944076 -0.61954838362562059 4.5486978452149671 5.2727648359960551 -0.023881166984270574 4.5511850598159285 5.2400051615267866 -0.14383647277990097 4.5536722744168907 5.2072454870575173 -0.26379177857553127 4.5561594890178529 5.1744858125882489 -0.38374708437116162 4.5586467036188134 5.1417261381189796 -0.5037023901667923 4.4236535472349514 5.3743337157513595 -0.02799047932107256 4.4261407618359128 5.3415740412820911 -0.14794578511670295 4.428627976436875 5.3088143668128218 -0.26790109091233327 4.4311151910378364 5.2760546923435534 -0.38785639670796362 4.2986092492549357 5.4759025955066631 -0.032099791657874535 4.3010964638558971 5.4431429210373947 -0.1520550974535049 4.3035836784568593 5.4103832465681254 -0.27201040324913522 4.17356495127492 5.5774714752619676 -0.036209103994676514 4.1760521658758814 5.5447118007926992 -0.15616440979030685 4.0485206532949043 5.6790403550172712 -0.040318416331478486 4.6916223149284164 4.9722506099609873 -0.73935001782567922 4.5636827125096717 5.1069086436676647 -0.62352523311694008 4.5697528998122401 5.0712561846179689 -0.74329432900099679 4.435743110090927 5.2415666773743421 -0.50770044840820083 4.4418132973934954 5.2059142183246472 -0.62746954429225765 4.4478834846960638 5.1702617592749505 -0.74723864017631436 4.3078035076721823 5.3762247110810204 -0.39187566369946136 4.3138736949747507 5.3405722520313246 -0.5116447595835184 4.3199438822773191 5.3049197929816287 -0.63141385546757522 4.3260140695798874 5.2692673339319329 -0.75118295135163193 4.1798639052534377 5.5108827447876987 -0.27605087899072217 4.185934092556006 5.4752302857380029 -0.39581997487477893 4.1920042798585744 5.439577826688307 -0.51558907075883598 4.1980744671611427 5.4039253676386103 -0.6353581666428928 4.2041446544637111 5.3682729085889154 -0.75512726252694951 4.051924302834693 5.645540778494377 -0.16022609428198303 4.0579944901372613 5.6098883194446802 -0.27999519016603974 4.0640646774398297 5.5742358603949853 -0.39976428605009651 4.0701348647423981 5.5385834013452886 -0.51953338193415355 4.0762050520449664 5.5029309422955928 -0.63930247781821026 4.0822752393475348 5.4672784832458969 -0.75907157370226708 3.9239847004159487 5.7801988122010544 -0.044401309573243841 3.9300548877185166 5.7445463531513585 -0.16417040545730058 3.936125075021085 5.7088938941016627 -0.28393950134135731 3.9421952623236529 5.6732414350519669 -0.40370859722541408 3.9482654496262213 5.637588976002271 -0.52347769310947112 3.9543356369287896 5.6019365169525743 -0.64324678899352783 3.960405824231358 5.5662840579028785 -0.76301588487758454 3.8324662218126133 5.7009420916095568 -0.64719110016884529 5.7278922137525177 3.9657436653555687 -0.11483131722849249 5.7236635337360804 3.9333119902398668 -0.23527942387082096 5.7194348537196431 3.9008803151241644 -0.35572753051314943 5.7152061737032058 3.8684486400084626 -0.47617563715547823 5.7109774936867685 3.8360169648927607 -0.59662374379780669 5.6274232362602081 4.0875104324351454 -0.11693053935143505 5.6231945562437708 4.0550787573194436 -0.23737864599376352 5.6189658762273336 4.0226470822037417 -0.35782675263609198 5.6147371962108963 3.9902154070880393 -0.47827485927842078 5.6105085161944599 3.9577837319723375 -0.59872296592074925 5.5269542587678986 4.2092771995147222 -0.11902976147437759 5.5227255787514613 4.1768455243990203 -0.23947786811670607 5.518496898735024 4.1444138492833185 -0.35992597475903454 5.5142682187185876 4.1119821741676166 -0.48037408140136334 5.4307139612920263 4.3634756417100018 -0.00068087695499166254 5.426485281275589 4.331043966594299 -0.12112898359732015 5.4222566012591518 4.2986122914785971 -0.24157709023964863 5.4180279212427145 4.2661806163628953 -0.3620251968819771 5.3302449837997168 4.4852424087895786 -0.0027800990779342132 5.3260163037832795 4.4528107336738758 -0.12322820572026269 5.3217876237668422 4.4203790585581739 -0.24367631236259119 5.3175589437504058 4.387947383442472 -0.36412441900491965 5.2297760063074072 4.6070091758691554 -0.0048793212008767664 5.22554732629097 4.5745775007534526 -0.12532742784320525 5.2213186462745336 4.5421458256377516 -0.24577553448553371 5.1293070288150977 4.7287759429487322 -0.006978543323819318 5.1250783487986613 4.6963442678330294 -0.1274266499661478 5.028838051322789 4.8505427100283089 -0.0090777654467618686 5.6071762394977256 3.9242772017072722 -0.71911526051755192 5.5105396498553008 4.0789508280819371 -0.60079105002151578 5.5088683459966408 4.0434526661833017 -0.72107992879017713 5.4139030602128759 4.2336244544566011 -0.48246683952547964 5.4122317563542159 4.1981262925579665 -0.60275571829414099 5.4105604524955559 4.1626281306593311 -0.72304459706280233 5.3155951667117911 4.3527999189326305 -0.48443150779810479 5.3139238628531311 4.3173017570339951 -0.60472038656676619 5.312252558994472 4.2818035951353597 -0.72500926533542742 5.2189585770693654 4.5074735453072954 -0.36610729730206837 5.2172872732107063 4.47197538340866 -0.48639617607072994 5.2156159693520463 4.4364772215100245 -0.60668505483939128 5.2139446654933872 4.4009790596113891 -0.72697393360805262 5.1223219874269406 4.6621471716819602 -0.2477830868060322 5.1206506835682815 4.6266490097833248 -0.36807196557469352 5.1189793797096215 4.5911508478846894 -0.48836084434335508 5.1173080758509624 4.555652685986054 -0.60864972311201648 5.1156367719923033 4.5201545240874186 -0.72893860188067772 5.0256853977845157 4.8168207980566251 -0.12945887630999603 5.0240140939258566 4.7813226361579897 -0.24974775507865735 5.0223427900671966 4.7458244742593543 -0.37003663384731866 5.0206714862085375 4.7103263123607189 -0.49032551261598029 5.0190001823498784 4.6748281504620826 -0.61061439138464157 5.0173288784912184 4.6393299885634471 -0.73090327015330292 4.9257062004247718 4.9004981006340191 -0.25171242335128252 4.9240348965661127 4.8649999387353828 -0.37200130211994381 4.9223635927074527 4.8295017768367474 -0.49229018088860543 4.9206922888487936 4.794003614938112 -0.61257905965726678 4.9190209849901345 4.7585054530394766 -0.73286793842592801 6.4162584929573159 2.7288859981043077 -0.10745057154837181 6.4055022346824373 2.698270335186649 -0.22827778414401553 6.3947459764075596 2.66765467226899 -0.34910499673965922 6.3416190127815364 2.8682220987059139 -0.10817579651187217 6.3308627545066578 2.8376064357882553 -0.22900300910751589 6.3201064962317801 2.8069907728705963 -0.34983022170315958 6.3093502379569015 2.7763751099529372 -0.47065743429880363 6.2985939796820238 2.7457594470352782 -0.59148464689444735 6.2669795326057569 3.0075581993075202 -0.10890102147537253 6.2562232743308783 2.9769425363898616 -0.22972823407101625 6.2454670160560006 2.9463268734722026 -0.35055544666665994 6.234710757781122 2.9157112105545435 -0.47138265926230399 6.2239544995062444 2.8850955476368845 -0.5922098718579476 6.1923400524299774 3.1468942999091265 -0.10962624643887289 6.1815837941550988 3.1162786369914679 -0.23045345903451661 6.1708275358802211 3.0856629740738089 -0.3512806716301603 6.1600712776053426 3.0550473111561498 -0.4721078842258043 6.1177005722541979 3.2862304005107328 -0.11035147140237325 6.1069443139793194 3.2556147375930742 -0.23117868399801697 6.0961880557044417 3.2249990746754151 -0.35200589659366072 6.0430610920784185 3.4255665011123391 -0.11107669636587361 6.0323048338035408 3.3949508381946805 -0.23190390896151733 5.968421611902639 3.5649026017139454 -0.11180192132937397 6.2879242622415781 2.7149842779522491 -0.71230614344940668 6.2151027514512656 2.8509696213380491 -0.71291129114489404 6.1508431343669905 3.021615130795372 -0.59283416449538007 6.142281240660953 2.9869549647238491 -0.71351643884038141 6.0865835172827163 3.1922606402526954 -0.47275703784586598 6.078021623576678 3.1576004741811721 -0.59343931219086743 6.0694597298706405 3.1229403081096492 -0.71412158653586877 6.022323900198443 3.3629061497100188 -0.35267991119635161 6.0137620064924038 3.3282459836384954 -0.47336218554135329 6.0052001127863655 3.2935858175669721 -0.59404445988635468 5.9966382190803271 3.2589256514954492 -0.71472673423135613 5.9580642831141688 3.5335516591673422 -0.23260278454683753 5.9495023894081305 3.4988914930958188 -0.35328505889183892 5.9409404957020913 3.4642313270242955 -0.47396733323684059 5.9323786019960529 3.4295711609527721 -0.59464960758184204 5.9238167082900137 3.3949109948812493 -0.71533188192684349 5.8938046660298946 3.7041971686246655 -0.11252565789732347 5.8852427723238563 3.6695370025531422 -0.23320793224232483 5.8766808786178171 3.6348768364816189 -0.35389020658732628 5.8681189849117787 3.6002166704100955 -0.4745724809323279 5.8595570912057395 3.5655565043385722 -0.59525475527732929 5.8509951974997012 3.5308963382670493 -0.71593702962233075 5.8209831552395821 3.8401825120104656 -0.11313080559281079 5.8124212615335429 3.8055223459389422 -0.23381307993781217 5.8038593678275046 3.7708621798674189 -0.35449535428281359 5.7952974741214653 3.7362020137958956 -0.47517762862781526 5.786735580415427 3.7015418477243722 -0.59585990297281666 5.7781736867093878 3.6668816816528493 -0.71654217731781811 5.7053521759190753 3.8028670250386494 -0.71714732501330536 6.835195236462094 1.3911633789918638 -0.10904346404445525 6.8186897388702947 1.3629785931774245 -0.23016413474944367 6.7898870548361563 1.5406645135381587 -0.1088380529820983 6.773381557244357 1.5124797277237194 -0.22995872368708672 6.7568760596525559 1.4842949419092797 -0.35107939439207508 6.7403705620607557 1.4561101560948402 -0.4722000650970638 6.7238650644689555 1.4279253702804007 -0.59332073580205213 6.7073595668771544 1.3997405844659612 -0.71444140650704058 6.7445788732102185 1.6901656480844534 -0.10863264191974134 6.7280733756184192 1.6619808622700143 -0.22975331262472978 6.7115678780266181 1.6337960764555746 -0.35087398332971814 6.6950623804348179 1.6056112906411348 -0.47199465403470686 6.6785568828430177 1.5774265048266953 -0.59311532473969519 6.6992706915842808 1.8396667826307482 -0.10842723085738439 6.6827651939924815 1.8114819968163089 -0.22954790156237281 6.6662596964006804 1.7832972110018694 -0.3506685722673612 6.6497541988088802 1.7551124251874295 -0.47178924297234992 6.653962509958343 1.9891679171770429 -0.10822181979502744 6.6374570123665437 1.9609831313626036 -0.22934249050001587 6.6209515147747426 1.9327983455481643 -0.35046316120500426 6.6086543283324053 2.1386690517233378 -0.10801640873267049 6.5921488307406051 2.1104842659088985 -0.2291370794376589 6.5633461467064667 2.2881701862696326 -0.10781099767031355 6.5468406491146673 2.2599854004551934 -0.22893166837530196 6.5180379650805289 2.4376713208159275 -0.10760558660795659 6.662792318719907 1.5468603827118985 -0.71414625927593234 6.6337787247269677 1.7252241608860888 -0.59284572130226643 6.6183781772775587 1.6934881009082439 -0.71383256893591385 6.6047651307340285 1.9035879390602792 -0.47154518332860046 6.5893645832846195 1.8718518790824343 -0.59253203096224794 6.5739640358352105 1.8401158191045894 -0.71351887859589536 6.5757515367410875 2.0819517172344697 -0.35024464535493433 6.5603509892916803 2.0502156572566244 -0.47123149298858197 6.5449504418422713 2.0184795972787795 -0.59221834062222944 6.5295498943928623 1.9867435373009348 -0.71320518825587687 6.5313373952987392 2.2285794354308153 -0.34993095501491583 6.515936847849332 2.1968433754529699 -0.47091780264856348 6.500536300399923 2.165107315475125 -0.59190465028221095 6.485135752950514 2.1333712554972801 -0.71289149791585837 6.5023238013057991 2.4069432136050053 -0.22863041704124992 6.486923253856391 2.3752071536271604 -0.34961726467489734 6.4715227064069838 2.3434710936493151 -0.47060411230854499 6.4561221589575748 2.3117350336714706 -0.59159095994219246 6.4407216115081658 2.2799989736936253 -0.71257780757583988 6.473310207312859 2.5853069917791953 -0.10732987906758401 6.4579096598634509 2.5535709318013504 -0.22831672670123146 6.4425091124140428 2.5218348718235055 -0.34930357433487885 6.4271085649646347 2.4900988118456606 -0.47029042196852655 6.4117080175152266 2.4583627518678157 -0.59127726960217397 6.3963074700658176 2.4266266918899708 -0.71226411723582139 6.3826944235222864 2.6367265300420062 -0.46997673162850806 6.3672938760728783 2.6049904700641613 -0.59096357926215548 6.3518933286234693 2.5732544100863164 -0.7119504268958029 6.9633451819271146 0.13846824432338289 -0.11571370182901566 6.941599884354325 0.1141424583020394 -0.23707960126411973 6.9198545867815353 0.089816672280695786 -0.35844550069922376 6.8981092892087448 0.065490886259352288 -0.47981140013432816 6.8763639916359551 0.041165100238008845 -0.60117729956943222 6.8546186940631655 0.01683931421666534 -0.72254319900453623 6.9480126513051506 0.29582411805197728 -0.11488082144937614 6.9262673537323609 0.27149833203063367 -0.2362467208844802 6.9045220561595713 0.24717254600929012 -0.35761262031958424 6.8827767585867807 0.22284675998794656 -0.47897851975468864 6.8610314610139911 0.19852097396660304 -0.60034441918979264 6.9326801206831865 0.45317999178057167 -0.11404794106973662 6.9109348231103969 0.42885420575922806 -0.23541384050484068 6.8891895255376072 0.40452841973788445 -0.35677973993994472 6.8674442279648167 0.38020263371654084 -0.47814563937504906 6.9173475900612225 0.61053586550916605 -0.1132150606900971 6.8956022924884328 0.58621007948782244 -0.23458096012520116 6.8738569949156432 0.56188429346647872 -0.3559468595603052 6.9020150594392584 0.76789173923776088 -0.11238218031045757 6.8802697618664688 0.74356595321641716 -0.23374807974556164 6.8585244642936791 0.71924016719507355 -0.35511397918066567 6.8866825288172944 0.92524761296635527 -0.11154929993081805 6.8649372312445047 0.90092182694501144 -0.23291519936592209 6.8713499981953303 1.0826034866949497 -0.11071641955117853 6.8395220253940172 0.17193205665622524 -0.7216451493428212 6.8458457479047556 0.35446811134384504 -0.59947097274264471 6.8245712595242347 0.32562483955819133 -0.72070678635132202 6.8521694704154932 0.53700416603146495 -0.47729679614246828 6.8308949820349731 0.50816089424581123 -0.59853260975114553 6.8096204936544531 0.47931762246015741 -0.71976842335982283 6.8372187045457107 0.69069694893343114 -0.4763584331509691 6.8159442161651906 0.66185367714777732 -0.59759424675964634 6.7946697277846706 0.6330104053621235 -0.71883006036832364 6.8435424270564491 0.87323300362105094 -0.35418425655079233 6.8222679386759291 0.84438973183539723 -0.47542007015946991 6.800993450295409 0.8155464600497434 -0.59665588376814715 6.779718961914889 0.78670318826408958 -0.71789169737682446 6.8498661495671858 1.055769058308671 -0.23201007995061587 6.8285916611866666 1.026925786523017 -0.35324589355929314 6.8073171728061466 0.99808251473736331 -0.47448170716797072 6.7860426844256265 0.96923924295170949 -0.59571752077664797 6.7647681960451065 0.94039597116605567 -0.71695333438532527 6.8561898720779242 1.2383051129962905 -0.10983590335043943 6.8349153836974041 1.209461841210637 -0.23107171695911666 6.8136408953168841 1.1806185694249831 -0.35230753056779396 6.792366406936365 1.1517752976393294 -0.47354334417647148 6.7710919185558449 1.1229320258536757 -0.59477915778514878 6.7498174301753249 1.0940887540680218 -0.71601497139382608 6.7986901294471016 1.3343113523269494 -0.35136916757629472 6.7774156410665825 1.3054680805412955 -0.47260498118497229 6.7561411526860624 1.2766248087556418 -0.5938407947936496 6.7348666643055424 1.2477815369699881 -0.71507660840232679 6.877392306204432 -1.2347275515965728 -0.0050154974685994672 6.8512081887919472 -1.2550122409441846 -0.126607986716953 6.8250240713794605 -1.2752969302917967 -0.24820047596530653 6.7988399539669748 -1.2955816196394085 -0.36979296521366006 6.7726558365544882 -1.3158663089870204 -0.49138545446201393 6.7464717191420025 -1.3361509983346322 -0.6129779437103674 6.8929027582389084 -1.0797352035509984 -0.0037836074203657019 6.8667186408264236 -1.1000198928986102 -0.12537609666871924 6.840534523413937 -1.1203045822462223 -0.24696858591707277 6.8143504060014513 -1.1405892715938344 -0.3685610751654263 6.7881662885889646 -1.160873960941446 -0.49015356441378016 6.7619821711764789 -1.1811586502890581 -0.61174605366213375 6.9084132102733848 -0.92474285550542412 -0.0025517173721319375 6.8822290928609 -0.94502754485303597 -0.12414420662048548 6.8560449754484134 -0.96531223420064816 -0.24573669586883901 6.8298608580359277 -0.98559692354826001 -0.36732918511719254 6.8036767406234411 -1.0058816128958719 -0.4889216743655464 6.9239236623078613 -0.76975050745984985 -0.0013198273238981726 6.8977395448953756 -0.7900351968074617 -0.12291231657225171 6.8715554274828898 -0.81031988615507378 -0.24450480582060524 6.8453713100704032 -0.83060457550268563 -0.36609729506895877 6.9394341143423377 -0.61475815941427558 -8.7937275664407745e-005 6.913249996929852 -0.63504284876188744 -0.12168042652401795 6.8870658795173654 -0.6553275381094994 -0.24327291577237148 6.8608817621048797 -0.67561222745711125 -0.36486540502072501 6.9287604489643275 -0.48005050071631328 -0.12044853647578418 6.9025763315518418 -0.50033519006392524 -0.24204102572413771 6.944270900998804 -0.3250581526707389 -0.11921664642755041 6.735678044725633 -1.2027832130746161 -0.73327843112848867 6.7774323416346105 -1.0268393322422646 -0.61048396894668777 6.7509550832430341 -1.0503968735085838 -0.73192962569916586 6.819186638543588 -0.85089545140991307 -0.48768950676488693 6.7927093801520115 -0.87445299267623255 -0.60913516351736496 6.7662321217604351 -0.8980105339425517 -0.73058082026984306 6.834463677060989 -0.69850911184388087 -0.48634070133556412 6.8079864186694126 -0.72206665311020024 -0.60778635808804216 6.7815091602778361 -0.74562419437651939 -0.72923201484052025 6.8762179739699674 -0.5225652310115293 -0.36354623915376288 6.84974071557839 -0.54612277227784867 -0.48499189590624131 6.8232634571868136 -0.56968031354416804 -0.60643755265871935 6.7967861987952372 -0.5932378548104873 -0.72788320941119744 6.9179722708789448 -0.34662135017917756 -0.24075177697196193 6.8914950124873684 -0.37017889144549693 -0.36219743372444008 6.8650177540957911 -0.39373643271181624 -0.4836430904769185 6.8385404957042146 -0.41729397397813561 -0.60508874722939654 6.8120632373126382 -0.44085151524445487 -0.72653440398187463 6.9597265677879232 -0.17067746934682601 -0.117957314790161 6.9332493093963459 -0.19423501061314541 -0.23940297154263912 6.9067720510047694 -0.21779255187946475 -0.36084862829511727 6.8802947926131921 -0.24135009314578407 -0.48229428504759575 6.8538175342216157 -0.26490763441210341 -0.60373994180007384 6.8273402758300392 -0.28846517567842267 -0.72518559855255194 6.9750036063053242 -0.018291129780793974 -0.11660850936083821 6.9485263479137478 -0.041848671047113276 -0.23805416611331634 6.9220490895221705 -0.065406212313432591 -0.35949982286579446 6.895571831130594 -0.088963753579751906 -0.48094547961827294 6.8690945727390167 -0.11252129484607122 -0.60239113637075103 6.8426173143474402 -0.13607883611239049 -0.72383679312322913 6.487502223090873 -2.5990775466510581 -0.018530235799685001 6.4574908843530485 -2.6149394263958072 -0.14034910750416452 6.4274795456152249 -2.6308013061405564 -0.26216797920864399 6.3974682068774005 -2.6466631858853056 -0.38398685091312346 6.5337046224388153 -2.4478109311883172 -0.017001809730498314 6.5036932837009909 -2.4636728109330663 -0.13882068143497783 6.4736819449631673 -2.4795346906778155 -0.2606395531394573 6.4436706062253428 -2.4953965704225647 -0.38245842484393677 6.4136592674875184 -2.5112584501673139 -0.50427729654841646 6.3836479287496939 -2.527120329912063 -0.62609616825289593 6.5799070217867577 -2.2965443157255763 -0.015473383661311629 6.5498956830489332 -2.3124061954703254 -0.13729225536579115 6.5198843443111096 -2.3282680752150746 -0.25911112707027062 6.4898730055732852 -2.3441299549598238 -0.38092999877475009 6.4598616668354607 -2.359991834704573 -0.50274887047922978 6.6261094211347 -2.1452777002628354 -0.013944957592124944 6.5960980823968756 -2.1611395800075845 -0.13576382929660444 6.5660867436590511 -2.1770014597523337 -0.25758270100108394 6.5360754049212266 -2.1928633394970829 -0.37940157270556341 6.5060640661834022 -2.2087252192418321 -0.5012204444100431 6.6723118204826424 -1.9940110848000945 -0.012416531522938257 6.6423004817448179 -2.0098729645448437 -0.13423540322741775 6.6122891430069934 -2.0257348442895928 -0.25605427493189725 6.582277804269169 -2.041596724034342 -0.37787314663637667 6.7185142198305847 -1.8427444693373531 -0.010888105453751566 6.6885028810927603 -1.8586063490821023 -0.13270697715823104 6.6584915423549358 -1.8744682288268515 -0.25452584886271051 6.7647166191785262 -1.6914778538746122 -0.0093596793845648809 6.7347052804407017 -1.7073397336193612 -0.13117855108904436 6.8109190185264676 -1.5402112384118711 -0.0078312533153781956 6.85712141787441 -1.38894462294913 -0.0063028272461915103 6.3533723829796873 -2.543881845523166 -0.74787300939513979 6.4297757188543905 -2.3761077620067663 -0.62455587320196526 6.3987714845325092 -2.3953504922594853 -0.74621679316952649 6.4751748204072124 -2.2275764087430856 -0.62289965697635197 6.4441705860853311 -2.2468191389958045 -0.7445605769439132 6.5515781562819146 -2.0598023252266859 -0.4995825207831775 6.5205739219600343 -2.0790450554794049 -0.62124344075073867 6.489569687638153 -2.0982877857321238 -0.74290436071829991 6.6279814921566169 -1.8920282417102863 -0.37626538459000269 6.5969772578347365 -1.9112709719630052 -0.49792630455756415 6.5659730235128562 -1.9305137022157239 -0.61958722452512538 6.5349687891909749 -1.9497564324684429 -0.74124814449268661 6.7043848280313201 -1.7242541581938866 -0.25294824839682817 6.6733805937094388 -1.7434968884466056 -0.37460916836438934 6.6423763593875584 -1.7627396186993245 -0.49627008833195085 6.6113721250656781 -1.781982348952043 -0.61793100829951209 6.5803678907437968 -1.8012250792047619 -0.73959192826707332 6.7807881639060223 -1.5564800746774872 -0.12963111220365367 6.749783929584142 -1.5757228049302059 -0.25129203217121482 6.7187796952622607 -1.5949655351829248 -0.37295295213877605 6.6877754609403803 -1.6142082654356436 -0.4946138721063375 6.6567712266185 -1.6334509956883623 -0.61627479207389868 6.6257669922966187 -1.652693725941081 -0.73793571204146002 6.8261872654588442 -1.4079487214138064 -0.12797489597804035 6.7951830311369639 -1.4271914516665252 -0.2496358159456015 6.7641787968150826 -1.4464341819192439 -0.3712967359131627 6.7331745624932022 -1.4656769121719626 -0.49295765588072421 6.702170328171321 -1.4849196424246813 -0.61461857584828539 6.6711660938494406 -1.5041623726774001 -0.73627949581584662 6.7165651954022616 -1.3556310194137193 -0.73462327959023332 5.8367747056242925 -3.8439981007990829 -0.03369054928997408 5.8036784391002971 -3.8546636172587041 -0.15574185635518317 5.910697580498959 -3.7064078739794502 -0.032000407124152044 5.8776013139749645 -3.7170733904390714 -0.15405171418936114 5.844505047450971 -3.7277389068986935 -0.27610302125457026 5.8114087809269765 -3.7384044233583147 -0.39815432831977937 5.7783125144029821 -3.7490699398179368 -0.52020563538498876 5.7452162478789877 -3.759735456277558 -0.64225694245019782 5.9846204553736255 -3.5688176471598174 -0.030310264958330016 5.951524188849632 -3.5794831636194386 -0.15236157202353912 5.9184279223256375 -3.5901486800790607 -0.27441287908874823 5.8853316558016431 -3.6008141965386824 -0.39646418615395734 5.8522353892776486 -3.6114797129983041 -0.51851549321916679 5.8191391227536551 -3.6221452294579257 -0.64056680028437585 6.0585433302482929 -3.4312274203401847 -0.028620122792507984 6.0254470637242985 -3.4418929367998059 -0.15067142985771709 5.9923507972003041 -3.452558453259428 -0.2727227369229262 5.9592545306763105 -3.4632239697190497 -0.39477404398813531 5.9261582641523161 -3.4738894861786718 -0.51682535105334471 6.1324662051229595 -3.293637193520552 -0.026929980626685952 6.0993699385989659 -3.3043027099801736 -0.14898128769189506 6.0662736720749715 -3.3149682264397953 -0.27103259475710417 6.033177405550977 -3.3256337428994174 -0.39308390182231329 6.2063890799976269 -3.1560469667009192 -0.02523983846086392 6.1732928134736333 -3.1667124831605413 -0.14729114552607303 6.1401965469496389 -3.177377999620163 -0.26934245259128214 6.2803119548722934 -3.0184567398812869 -0.023549696295041889 6.2472156883482999 -3.029122256340909 -0.145601003360251 6.3542348297469609 -2.8808665130616542 -0.021859554129219857 6.3211385632229673 -2.8915320295212763 -0.14391086119442895 6.4281577046216274 -2.7432762862420219 -0.020169411963397825 5.7118624790413515 -3.7708973739525669 -0.76427336702813697 5.7847133576471199 -3.6353736926456435 -0.76243800715271726 5.8920001410646572 -3.4866020012897327 -0.63873281398161919 5.8575642362528884 -3.4998500113387196 -0.76060264727729754 5.9992869244821945 -3.3378303099338216 -0.51502762081052123 5.9648510196704256 -3.3510783199828089 -0.63689745410619947 5.9304151148586568 -3.3643263300317958 -0.75876728740187782 6.1065737078997326 -3.1890586185779108 -0.39132242763942299 6.0721378030879629 -3.2023066286268982 -0.51319226093510151 6.0377018982761941 -3.2155546386758851 -0.63506209423077975 6.0032659934644252 -3.228802648724872 -0.75693192752645799 6.213860491317269 -3.0402869272219997 -0.26761723446832503 6.1794245865055011 -3.053534937270987 -0.38948706776400327 6.1449886816937314 -3.0667829473199744 -0.51135690105968179 6.1105527768819625 -3.0800309573689617 -0.63322673435536003 6.0761168720701937 -3.0932789674179486 -0.75509656765103828 6.2867113699230384 -2.9047632459150758 -0.26578187459290531 6.2522754651112695 -2.9180112559640632 -0.38765170788858355 6.2178395602995007 -2.9312592660130505 -0.50952154118426207 6.1834036554877319 -2.9445072760620379 -0.6313913744799402 6.148967750675963 -2.9577552861110252 -0.75326120777561845 6.3939981533405756 -2.7559915545591651 -0.14207668142180738 6.3595622485288077 -2.7692395646081525 -0.26394651471748559 6.325126343717038 -2.7824875746571398 -0.38581634801316383 6.2906904389052691 -2.7957355847061272 -0.50768618130884235 6.2562545340935003 -2.8089835947551145 -0.62955601460452049 6.2218186292817315 -2.8222316048041018 -0.75142584790019873 6.3635413175110385 -2.6602119033992033 -0.50585082143342253 6.3291054126992696 -2.6734599134481907 -0.62772065472910066 6.2946695078875008 -2.686707923497178 -0.7495904880247789 4.9539118041422423 -4.9290856323836758 -0.049954167845731208 5.0528138922071619 -4.8091354177890526 -0.048152050335242634 5.0145321258961575 -4.8176043934635286 -0.17050106552361591 4.9762503595851539 -4.8260733691380056 -0.29285008071198915 4.9379685932741504 -4.8345423448124825 -0.41519909590036241 4.8996868269631451 -4.8430113204869585 -0.5375481110887359 4.8614050606521406 -4.8514802961614345 -0.65989712627710917 5.1517159802720824 -4.6891852031944294 -0.04634993282475406 5.113434213961078 -4.6976541788689055 -0.16869894801312732 5.0751524476500744 -4.7061231545433824 -0.29104796320150056 5.03687068133907 -4.7145921302178584 -0.41339697838987383 4.9985889150280656 -4.7230611058923344 -0.53574599357824737 4.9603071487170611 -4.7315300815668104 -0.65809500876662064 5.2506180683370021 -4.5692349885998063 -0.044547815314265486 5.2123363020259985 -4.5777039642742823 -0.16689683050263873 5.1740545357149941 -4.5861729399487592 -0.28924584569101197 5.1357727694039896 -4.5946419156232352 -0.41159486087938524 5.0974910030929861 -4.6031108912977112 -0.53394387606775873 5.3495201564019226 -4.4492847740051831 -0.042745697803776912 5.311238390090919 -4.4577537496796591 -0.16509471299215014 5.2729566237799146 -4.466222725354136 -0.28744372818052338 5.2346748574689101 -4.4746917010286111 -0.40979274336889665 5.4484222444668422 -4.3293345594105599 -0.040943580293288338 5.4101404781558387 -4.3378035350850359 -0.16329259548166158 5.3718587118448342 -4.3462725107595119 -0.2856416106700348 5.5473243325317627 -4.2093843448159358 -0.039141462782799757 5.5090425662207592 -4.2178533204904127 -0.161490477971173 5.6462264205966823 -4.0894341302213126 -0.037339345272311183 5.6079446542856797 -4.0979031058957895 -0.15968836046068444 5.7451285086616029 -3.9694839156266895 -0.03553722776182261 5.0596733646026015 -4.611064263914959 -0.65613285179130498 5.1967288681499033 -4.4827876595385714 -0.53202597672366081 5.159152406672991 -4.4904731068129404 -0.6541317903559688 5.3337843716972051 -4.3545110551621837 -0.40791910165601636 5.2962079102202928 -4.3621965024365528 -0.53002491528832463 5.2586314487433814 -4.3698819497109218 -0.65213072892063262 5.4708398752445069 -4.2262344507857961 -0.28381222658837224 5.4332634137675946 -4.2339198980601651 -0.40591804022068018 5.3956869522906823 -4.2416053453345341 -0.52802385385298845 5.3581104908137709 -4.2492907926089032 -0.65012966748529644 5.5703189173148964 -4.1056432936837775 -0.28181116515303606 5.532742455837985 -4.1133287409581465 -0.40391697878534399 5.4951659943610727 -4.1210141882325155 -0.52602279241765226 5.4575895328841604 -4.1286996355068846 -0.64812860604996025 5.7073744208621981 -3.9773666893073902 -0.15770429008539191 5.6697979593852859 -3.9850521365817588 -0.27981010371769988 5.6322214979083745 -3.9927375838561279 -0.40191591735000776 5.5946450364314622 -4.0004230311304969 -0.52402173098231608 5.5570685749545508 -4.0081084784048659 -0.64612754461462396 5.7692770014556762 -3.8644609794797402 -0.27780904228236364 5.7317005399787648 -3.8721464267541088 -0.39991485591467157 5.6941240785018525 -3.8798318740284778 -0.52202066954697979 5.6565476170249411 -3.8875173213028469 -0.64412648317928778 3.9768298479954223 -5.731445462803638 -0.065427560277679472 3.9359523216610151 -5.7335927173702146 -0.1880444840027507 3.8950747953266083 -5.7357399719367912 -0.31066140772782197 3.8541972689922019 -5.7378872265033669 -0.43327833145289318 4.0994278708415983 -5.6313244289768791 -0.063504105647015877 4.0585503445071911 -5.6334716835434557 -0.1861210293720871 4.0176728181727839 -5.6356189381100323 -0.3087379530971584 3.9767952918383775 -5.6377661926766081 -0.43135487682222962 3.9359177655039708 -5.6399134472431847 -0.55397180054730111 3.895040239169564 -5.6420607018097604 -0.67658872427237238 4.2220258936877739 -5.5312033951501203 -0.061580651016352274 4.1811483673533667 -5.5333506497166969 -0.18419757474142351 4.1402708410189595 -5.5354979042832735 -0.30681449846649478 4.0993933146845531 -5.5376451588498492 -0.42943142219156605 4.0585157883501468 -5.5397924134164258 -0.55204834591663754 4.3446239165339495 -5.4310823613233614 -0.059657196385688671 4.3037463901995423 -5.433229615889938 -0.18227412011075991 4.2628688638651351 -5.4353768704565146 -0.30489104383583121 4.2219913375307287 -5.4375241250230903 -0.42750796756090242 4.4672219393801251 -5.3309613274966026 -0.057733741755025068 4.4263444130457179 -5.3331085820631792 -0.18035066548009632 4.3854668867113116 -5.3352558366297549 -0.30296758920516759 4.5898199622263016 -5.2308402936698437 -0.055810287124361466 4.5489424358918935 -5.2329875482364194 -0.17842721084943272 4.7124179850724772 -5.1307192598430849 -0.05388683249369787 4.67154045873807 -5.1328665144096606 -0.17650375621876913 4.8350160079186537 -5.0305982260163251 -0.051963377863034267 4.0165019406403788 -5.5429007766125249 -0.67455376743950179 4.1803131734464518 -5.4403485646424228 -0.55004632823663213 4.1373445267557392 -5.444264503547247 -0.67245805954883175 4.3441244062525257 -5.3377963526723207 -0.4255388890337623 4.3011557595618131 -5.3417122915771449 -0.54795062034596209 4.2581871128711004 -5.3456282304819691 -0.67036235165816183 4.5079356390585996 -5.2352441407022186 -0.30103144983089269 4.464966992367887 -5.2391600796070428 -0.42344318114309232 4.4219983456771743 -5.243076018511867 -0.54585491245529216 4.3790296989864608 -5.2469919574166903 -0.66826664376749179 4.6287782251739609 -5.1366078676369407 -0.29893574194022271 4.5858095784832482 -5.1405238065417649 -0.42134747325242233 4.5428409317925347 -5.1444397454465891 -0.54375920456462212 4.4998722851018211 -5.1483556843514124 -0.66617093587682186 4.7925894579800339 -5.0340556556668385 -0.1744283027373531 4.7496208112893221 -5.0379715945716619 -0.29684003404955273 4.7066521645986095 -5.041887533476487 -0.41925176536175235 4.6636835179078959 -5.0458034723813103 -0.54166349667395219 4.6207148712171824 -5.0497194112861337 -0.66407522798615182 4.9134320440953951 -4.9354193826015598 -0.17233259484668309 4.8704633974046825 -4.939335321506384 -0.29474432615888274 4.8274947507139698 -4.9432512604112082 -0.41715605747108236 4.7845261040232563 -4.9471671993160324 -0.53956778878328215 4.7415574573325427 -4.9510831382208558 -0.66197952009548189 2.7137708608672542 -6.4296388906373609 -0.083832873091170379 2.8393579238477296 -6.3629156385946857 -0.082031061141334377 2.7804489402821835 -6.3667669007253389 -0.20515524626137752 2.7215399567166378 -6.3706181628559939 -0.32827943138142063 2.6626309731510922 -6.374469424986648 -0.45140361650146382 2.964944986828205 -6.2961923865520095 -0.080229249191498389 2.9060360032626589 -6.3000436486826636 -0.20335343431154151 2.8471270196971132 -6.3038949108133187 -0.32647761943158465 2.7882180361315676 -6.3077461729439728 -0.44960180455162779 2.7293090525660215 -6.3115974350746269 -0.57272598967167121 2.6704000690004754 -6.3154486972052819 -0.6958501747917144 3.0905320498086803 -6.2294691345093334 -0.078427437241662387 3.0316230662431343 -6.2333203966399875 -0.20155162236170551 2.9727140826775886 -6.2371716587706425 -0.32467580748174868 2.913805099112043 -6.2410229209012975 -0.44779999260179182 2.8548961155464969 -6.2448741830319516 -0.57092417772183524 3.2161191127891557 -6.1627458824666581 -0.076625625291826399 3.1572101292236097 -6.1665971445973122 -0.19974981041186951 3.098301145658064 -6.1704484067279672 -0.32287399553191271 3.0393921620925184 -6.1742996688586214 -0.44599818065195579 3.3417061757696311 -6.0960226304239828 -0.074823813341990397 3.2827971922040851 -6.0998738925546361 -0.19794799846203354 3.2238882086385394 -6.1037251546852911 -0.32107218358207668 3.4672932387501065 -6.0292993783813067 -0.073022001392154409 3.4083842551845605 -6.0331506405119608 -0.19614618651219753 3.3494752716190148 -6.0370019026426158 -0.3192703716322407 3.5928803017305819 -5.9625761263386305 -0.071220189442318407 3.5339713181650363 -5.9664273884692847 -0.19434437456236153 3.7184673647110573 -5.8958528742959553 -0.069418377492482405 2.8017506562853609 -6.2456845932625917 -0.69387097567211931 2.9839773204169613 -6.1763074117389163 -0.56901482463781383 2.9396771390894578 -6.1724510280445148 -0.69168938658534895 3.1662039845485617 -6.1069302302152417 -0.44415867360350797 3.1219038032210578 -6.1030738465208394 -0.56683323555104348 3.0776036218935543 -6.099217462826438 -0.6895077974985786 3.3041304673526586 -6.0336966649971648 -0.44197708451673762 3.2598302860251547 -6.0298402813027625 -0.56465164646427313 3.2155301046976508 -6.0259838976083611 -0.68732620841180825 3.486357131484259 -5.9643194834734903 -0.31712093348243203 3.4420569501567551 -5.9604630997790879 -0.43979549542996721 3.3977567688292512 -5.9566067160846856 -0.56247005737750277 3.3534565875017477 -5.9527503323902842 -0.6851446193250379 3.6685837956158589 -5.8949423019498148 -0.19226478244812648 3.6242836142883554 -5.8910859182554134 -0.31493934439566162 3.579983432960852 -5.8872295345610111 -0.43761390634319686 3.5356832516333476 -5.8833731508666096 -0.56028846829073242 3.4913830703058446 -5.8795167671722082 -0.68296303023826754 3.8508104597474593 -5.8255651204261403 -0.067408631413820919 3.8065102784199554 -5.8217087367317388 -0.1900831933613561 3.7622100970924519 -5.8178523530373365 -0.31275775530889127 3.7179099157649484 -5.8139959693429351 -0.43543231725642645 3.6736097344374445 -5.8101395856485327 -0.55810687920396196 3.6293095531099411 -5.8062832019541313 -0.68078144115149719 3.8115362172415415 -5.7369060204304567 -0.55592529011719161 3.767236035914038 -5.7330496367360553 -0.67859985206472684 1.4423012454796482 -6.8211988853901477 -0.10171417469319446 1.3797264756262861 -6.8146496160693291 -0.22513521683875762 1.6036072046923979 -6.7727311986736343 -0.099471417905260748 1.5410324348390358 -6.7661819293528156 -0.22289246005082389 1.4784576649856738 -6.759632660031996 -0.34631350219638707 1.4158828951323115 -6.7530833907111765 -0.46973454434195022 1.3533081252789492 -6.7465341213903578 -0.59315558648751365 1.7649131639051476 -6.7242635119571208 -0.097228661117327031 1.7023383940517856 -6.7177142426363021 -0.22064970326289018 1.6397636241984235 -6.7111649733154826 -0.34407074540845334 1.5771888543450612 -6.704615703994663 -0.46749178755401649 1.5146140844916989 -6.6980664346738443 -0.59091282969957992 1.9262191231178973 -6.6757958252406073 -0.094985904329393328 1.863644353264535 -6.6692465559197887 -0.21840694647495645 1.8010695834111732 -6.6626972865989691 -0.34182798862051961 1.7384948135578109 -6.6561480172781495 -0.46524903076608276 2.087525082330647 -6.6273281385240939 -0.092743147541459611 2.0249503124772845 -6.6207788692032752 -0.21616418968702275 1.9623755426239229 -6.6142295998824556 -0.33958523183258588 2.2488310415433967 -6.5788604518075804 -0.090500390753525894 2.1862562716900342 -6.5723111824867617 -0.21392143289908902 2.410137000756146 -6.5303927650910669 -0.088257633965592192 1.4507559632471092 -6.6919095872847416 -0.71431878186272291 1.6744724214947742 -6.6500414004590533 -0.5886530513898367 1.6044605875185571 -6.6457662293231428 -0.71198664658389543 1.8981888797424393 -6.6081732136333651 -0.46298732091695022 1.8281770457662221 -6.6038980424974545 -0.58632091611100923 1.7581652117900051 -6.5996228713615439 -0.70965451130506796 2.1219053379901043 -6.5663050268076768 -0.33732159044406401 2.0518935040138873 -6.5620298556717662 -0.4606551856381228 1.9818816700376702 -6.5577546845358556 -0.58398878083218175 1.9118698360614532 -6.5534795133999451 -0.7073223760262406 2.345621796237769 -6.5244368399819894 -0.21165585997117783 2.2756099622615524 -6.520161668846078 -0.33498945516523659 2.2055981282853354 -6.5158864977101674 -0.45832305035929538 2.1355862943091184 -6.5116113265742568 -0.58165664555335439 2.0655744603329014 -6.5073361554383462 -0.70499024074741312 2.5693382544854337 -6.4825686531563012 -0.085990129498291615 2.4993264205092172 -6.4782934820203906 -0.20932372469235042 2.4293145865330001 -6.4740183108844791 -0.33265731988640918 2.3593027525567836 -6.4697431397485685 -0.45599091508046796 2.2892909185805665 -6.4654679686126579 -0.57932451027452692 2.2192790846043495 -6.4611927974767474 -0.70265810546858576 2.6530310447806653 -6.4321501240587908 -0.20699158941352297 2.5830192108044483 -6.4278749529228802 -0.33032518460758176 2.5130073768282317 -6.4235997817869697 -0.45365877980164054 2.4429955428520147 -6.4193246106510591 -0.57699237499569955 2.3729837088757977 -6.4150494395151485 -0.70032597018975828 2.5967001671234624 -6.3731812526894602 -0.57466023971687208 2.5266883331472454 -6.3689060815535496 -0.69799383491093092 0.043250020186064386 -6.9714990129681844 -0.1218689022095597 0.18056632594591282 -6.9583650640556183 -0.11990559167896003 0.11002541360380436 -6.9406921148454712 -0.24368182030241461 0.039484501261695781 -6.9230191656353224 -0.3674580489258692 0.31788263170576114 -6.9452311151430521 -0.11794228114836036 0.24734171936365268 -6.9275581659329051 -0.24171850977181494 0.1768008070215441 -6.9098852167227562 -0.36549473839526953 0.10625989467943553 -6.8922122675126092 -0.48927096701872408 0.035718982337326843 -6.8745393183024612 -0.61304719564217891 0.45519893746560947 -6.932097166230486 -0.1159789706177607 0.384658025123501 -6.9144242170203389 -0.23975519924121527 0.31411711278139237 -6.8967512678101901 -0.36353142786466985 0.2435762004392838 -6.879078318600043 -0.48730765648812446 0.17303528809717514 -6.8614053693898951 -0.61108388511157929 0.5925152432254579 -6.9189632173179199 -0.11401566008716103 0.52197433088334955 -6.9012902681077728 -0.2377918887106156 0.45143341854124086 -6.8836173188976248 -0.36156811733407024 0.38089250619913229 -6.8659443696874778 -0.48534434595752485 0.72983154898530622 -6.9058292684053546 -0.11205234955656138 0.65929063664319787 -6.8881563191952067 -0.23582857818001593 0.58874972430108918 -6.8704833699850587 -0.35960480680347057 0.86714785474515454 -6.8926953194927885 -0.1100890390259617 0.79660694240304608 -6.8750223702826414 -0.23386526764941629 0.72606603006093751 -6.8573494210724935 -0.35764149627287095 1.0044641605050029 -6.8795613705802232 -0.10812572849536205 0.93392324816289429 -6.8618884213700753 -0.23190195711881662 1.1417804662648516 -6.8664274216676571 -0.10616241796476238 0.10650967224263264 -6.8433589032804232 -0.73474973705548918 0.31298857850506567 -6.8480261189579146 -0.60904808638232177 0.25500536227998216 -6.8291850090077544 -0.73247911588924242 0.51946748476749871 -6.852693334635406 -0.48334643570915398 0.46148426854241531 -6.8338522246852458 -0.60677746521607501 0.4035010523173318 -6.8150111147350856 -0.73020849472299565 0.66796317480484813 -6.8385194403627372 -0.48107581454290727 0.60997995857976473 -6.819678330412577 -0.60450684404982824 0.55199674235468121 -6.8008372204624168 -0.72793787355674899 0.87444208106728105 -6.8431866560402277 -0.35537416386973975 0.81645886484219765 -6.8243455460900684 -0.47880519337666055 0.75847564861711425 -6.8055044361399082 -0.60223622288358147 0.70049243239203063 -6.786663326189748 -0.72566725239050223 1.0809209873297141 -6.8478538717177191 -0.22967251319657225 1.0229377711046306 -6.8290127617675589 -0.35310354270349303 0.96495455487954718 -6.8101716518173996 -0.47653457221041384 0.90697133865446378 -6.7913305418672394 -0.59996560171733482 0.84898812242938015 -6.7724894319170792 -0.72339663122425557 1.2873998935921471 -6.8525210873952096 -0.10397086252340476 1.2294166773670636 -6.8336799774450503 -0.22740189203032551 1.1714334611419801 -6.8148388674948901 -0.35083292153724632 1.1134502449168966 -6.7959977575447308 -0.47426395104416708 1.0554670286918131 -6.7771566475945706 -0.59769498055108805 0.99748381246672957 -6.7583155376444104 -0.7211260100580088 1.3199291511793296 -6.8006649732222222 -0.34856230037099956 1.2619459349542461 -6.781823863272062 -0.47199332987792036 1.2039627187291626 -6.7629827533219027 -0.5954243593848414 1.1459795025040791 -6.7441416433717425 -0.71885538889176215 1.2944751925414286 -6.7299677490990737 -0.71658476772551538 -1.2196607143868941 -6.6631266676770204 -0.86190736798071588 -1.2320952048718095 -6.5919610555787598 -0.96658135441369264 -1.2445296953567251 -6.5207954434805 -1.0712553408466694 -1.2569641858416405 -6.4496298313822393 -1.1759293272796463 -1.0555726345658356 -6.6807943866389339 -0.85965280068289518 -1.0680071250507512 -6.6096287745406732 -0.96432678711587183 -1.0804416155356669 -6.5384631624424134 -1.0690007735488487 -1.0928761060205823 -6.4672975503441528 -1.1736747599818256 -1.1053105965054979 -6.3961319382458921 -1.278348746414802 -0.89148455474477739 -6.6984621056008473 -0.85739823338507448 -0.90391904522969291 -6.6272964935025866 -0.96207221981805102 -0.91635353571460865 -6.5561308814043269 -1.0667462062510278 -0.92878802619952405 -6.4849652693060662 -1.1714201926840047 -0.72739647492371906 -6.7161298245627608 -0.85514366608725367 -0.73983096540863458 -6.6449642124645001 -0.95981765252023032 -0.75226545589355032 -6.5737986003662403 -1.0644916389532071 -0.56330839510266073 -6.7337975435246742 -0.85288909878943286 -0.57574288558757636 -6.6626319314264144 -0.95756308522240952 -0.58817737607249199 -6.5914663193281546 -1.0622370716553862 -0.39922031528160251 -6.7514652624865885 -0.85063453149161217 -0.41165480576651814 -6.6802996503883278 -0.95530851792458882 -0.23513223546054413 -6.769132981448502 -0.84837996419379136 -1.1237853269758751 -6.3243828974166263 -1.3830055473510807 -0.94482062409414014 -6.413452114851026 -1.2760839418974077 -0.97283328242772471 -6.3407818024889968 -1.3807136058278395 -0.76585592121240531 -6.5025213322854256 -1.1691623364437347 -0.79386857954598988 -6.4298510199233965 -1.2737920003741665 -0.82188123787957434 -6.3571807075613673 -1.3784216643045983 -0.61490387666425494 -6.5189202373577961 -1.1668703949204935 -0.64291653499783952 -6.446249924995767 -1.2715000588509253 -0.67092919333142398 -6.3735796126337378 -1.3761297227813571 -0.43593917378252017 -6.6079894547921967 -1.0599487894668203 -0.46395183211610469 -6.5353191424301667 -1.1645784533972523 -0.49196449044968926 -6.4626488300681375 -1.2692081173276841 -0.51997714878327372 -6.3899785177061084 -1.373837781258116 -0.25697447090078529 -6.6970586722265963 -0.95302718401314734 -0.28498712923436975 -6.6243883598645672 -1.0576568479435791 -0.31299978756795432 -6.5517180475025372 -1.1622865118740111 -0.34101244590153879 -6.479047735140508 -1.2669161758044429 -0.36902510423512336 -6.4063774227784789 -1.3715458397348748 -0.078009768019050546 -6.7861278896609969 -0.84610557855947444 -0.1060224263526351 -6.7134575772989669 -0.95073524248990615 -0.13403508468621958 -6.6407872649369377 -1.0553649064203379 -0.16204774301980407 -6.5681169525749077 -1.1599945703507699 -0.19006040135338856 -6.4954466402128785 -1.2646242342812017 -0.2180730596869731 -6.4227763278508494 -1.3692538982116336 -0.011095698471653866 -6.5845158576472782 -1.1577026288275287 -0.039108356805238345 -6.5118455452852499 -1.2623322927579606 -0.067121015138822848 -6.4391752329232199 -1.3669619566883924 -2.6098606086027236 -6.320829615865776 -0.77818847687861425 -2.5767013730218826 -6.258464921284423 -0.88241247124023481 -2.5435421374410412 -6.1961002267030709 -0.98663646560185547 -2.5103829018601997 -6.1337355321217188 -1.0908604599634761 -2.4772236662793587 -6.0713708375403677 -1.1950844543250969 -2.4440644306985173 -6.0090061429590156 -1.2993084486867175 -2.4053817297547275 -6.3849991085509474 -0.77510665706903037 -2.3722224941738865 -6.3226344139695945 -0.87933065143065092 -2.3390632585930451 -6.2602697193882433 -0.98355464579227159 -2.3059040230122037 -6.1979050248068912 -1.0877786401538923 -2.2727447874313627 -6.1355403302255391 -1.192002634515513 -2.2009028509067314 -6.4491686012361189 -0.77202483725944659 -2.1677436153258904 -6.3868039066547668 -0.87624883162106715 -2.134584379745049 -6.3244392120734148 -0.9804728259826877 -2.1014251441642076 -6.2620745174920627 -1.0846968203443084 -2.0682659085833661 -6.1997098229107115 -1.1889208147059291 -1.9964239720587347 -6.5133380939212904 -0.76894301744986271 -1.9632647364778935 -6.4509733993399392 -0.87316701181148326 -1.930105500897052 -6.3886087047585871 -0.97739100617310393 -1.8969462653162108 -6.326244010177235 -1.0816150005347245 -1.7919450932107384 -6.5775075866064618 -0.76586119764027893 -1.7587858576298971 -6.5151428920251107 -0.87008519200189949 -1.7256266220490557 -6.4527781974437586 -0.97430918636352004 -1.5543069787819008 -6.5793123847102821 -0.8670033721923156 -2.4162856851963506 -5.9449675049845503 -1.4035925820882369 -2.2420543817882312 -6.0724075491869085 -1.296254223586901 -2.2541751359919626 -5.9959556360377677 -1.4009843233538768 -2.0799438325838433 -6.1233956802401259 -1.2936459648525409 -2.0920645867875747 -6.046943767090986 -1.3983760646195167 -1.905712529175724 -6.250835724442485 -1.1863076063512048 -1.9178332833794554 -6.1743838112933442 -1.2910377061181808 -1.9299540375831867 -6.0979318981442034 -1.3957678058851564 -1.7314812257676047 -6.3782757686448432 -1.0789692478498687 -1.743601979971336 -6.3018238554957025 -1.1836993476168447 -1.7557227341750674 -6.2253719423465617 -1.2884294473838205 -1.7678434883787988 -6.1489200291974218 -1.3931595471507963 -1.5572499223594856 -6.5057158128472015 -0.97163088934853292 -1.5693706765632167 -6.4292638996980616 -1.0763609891155086 -1.5814914307669481 -6.3528119865489208 -1.1810910888824846 -1.5936121849706795 -6.27636007339978 -1.2858211886494604 -1.6057329391744108 -6.1999081602506392 -1.3905512884164359 -1.3830186189513665 -6.6331558570495606 -0.86429253084719693 -1.3951393731550976 -6.5567039439004198 -0.96902263061417271 -1.4072601273588288 -6.4802520307512799 -1.0737527303811485 -1.4193808815625601 -6.4038001176021382 -1.1784828301481243 -1.4315016357662915 -6.3273482044529974 -1.2832129299151001 -1.4436223899700229 -6.2508962913038575 -1.3879430296820758 -1.2693910865619036 -6.3783363355062157 -1.28060467118074 -1.281511840765635 -6.3018844223570749 -1.3853347709477155 -3.7759955922927477 -5.6843025701214343 -0.79797917984848465 -3.7454972676275413 -5.6219059978697707 -0.90235470914431104 -3.6467294956102823 -5.7550507827602733 -0.79578546232480629 -3.6162311709450758 -5.6926542105086098 -0.90016099162063268 -3.5857328462798703 -5.6302576382569445 -1.0045365209164592 -3.5552345216146639 -5.5678610660052801 -1.1089120502122856 -3.5247361969494579 -5.5054644937536139 -1.2132875795081122 -3.494237872284252 -5.4430679215019495 -1.3176631088039388 -3.5174633989278172 -5.8257989953991123 -0.79359174480112793 -3.4869650742626108 -5.7634024231474488 -0.89796727409695432 -3.4564667495974053 -5.7010058508957835 -1.0023428033927808 -3.4259684249321989 -5.6386092786441191 -1.1067183326886072 -3.3954701002669925 -5.5762127063924529 -1.2110938619844338 -3.3881973022453522 -5.8965472080379513 -0.79139802727744957 -3.3576989775801458 -5.8341506357862878 -0.89577355657327595 -3.3272006529149398 -5.7717540635346225 -1.0001490858691024 -3.2967023282497334 -5.7093574912829581 -1.1045246151649288 -3.2662040035845274 -5.6469609190312928 -1.2089001444607557 -3.2589312055628872 -5.9672954206767903 -0.7892043097537712 -3.2284328808976808 -5.9048988484251268 -0.8935798390495977 -3.1979345562324744 -5.8425022761734615 -0.9979553683454242 -3.1674362315672684 -5.7801057039217971 -1.1023308976412507 -3.1296651088804217 -6.0380436333156302 -0.78701059223009295 -3.0991667842152153 -5.9756470610639658 -0.89138612152591934 -3.0686684595500089 -5.9132504888123014 -0.99576165082174595 -3.0003990121979562 -6.1087918459544692 -0.78481687470641459 -2.9699006875327503 -6.0463952737028048 -0.88919240400224109 -2.8711329155154912 -6.1795400585933091 -0.78262315718273634 -2.8406345908502848 -6.1171434863416447 -0.88699868647856273 -2.7418668188330257 -6.2502882712321481 -0.78042943965905798 -3.3648865271636748 -5.5138904432888811 -1.3154312702842668 -3.2354252311797702 -5.5848088067729389 -1.3131502644541644 -3.1367443436744495 -5.717877856386556 -1.2066198702424593 -3.1059639351958657 -5.6557271702569967 -1.310869258624062 -3.0380634561691284 -5.8509469060001731 -1.100089476030754 -3.007283047690545 -5.7887962198706138 -1.2043388644123569 -2.9765026392119611 -5.7266455337410553 -1.3085882527939596 -2.9457222307333777 -5.6644948476114978 -1.4128376411755621 -2.9393825686638078 -5.9840159556137902 -0.99355908181904906 -2.9086021601852243 -5.9218652694842309 -1.0978084702006516 -2.8778217517066405 -5.8597145833546715 -1.2020578585822546 -2.8470413432280566 -5.797563897225114 -1.3063072469638572 -2.8162609347494731 -5.7354132110955556 -1.4105566353454597 -2.8099212726799032 -6.054934319097848 -0.99127807598894668 -2.7791408642013198 -5.9927836329682886 -1.0955274643705493 -2.7483604557227359 -5.9306329468387302 -1.1997768527521522 -2.717580047244152 -5.8684822607091718 -1.3040262411337549 -2.6867996387655686 -5.8063315745796134 -1.4082756295153573 -2.711240385174583 -6.1880033687114642 -0.8847476817772415 -2.6804599766959987 -6.1258526825819057 -0.98899707015884419 -2.6496795682174152 -6.0637019964523473 -1.0932464585404469 -2.6188991597388314 -6.0015513103227889 -1.1974958469220498 -2.5881187512602475 -5.9394006241932304 -1.3017452353036523 -2.5573383427816641 -5.8772499380636711 -1.405994623685255 -4.6928263538499531 -4.9210731360369229 -0.8159664127210825 -4.6434617433403265 -4.8720441351097916 -0.92005746375436592 -4.594097132830699 -4.8230151341826595 -1.0241485147876492 -4.5447325223210715 -4.7739861332555282 -1.1282395658209328 -4.495367911811444 -4.7249571323283961 -1.2323306168542163 -4.5609458827242406 -5.0315331958674268 -0.81337574156921377 -4.511581272214614 -4.9825041949402955 -0.91746679260249719 -4.4622166617049865 -4.9334751940131634 -1.0215578436357806 -4.4128520511953591 -4.8844461930860321 -1.1256488946690641 -4.3634874406857316 -4.8354171921588991 -1.2297399457023475 -4.4290654115985282 -5.1419932556979306 -0.81078507041734504 -4.3797008010889016 -5.0929642547707994 -0.91487612145062847 -4.3303361905792741 -5.0439352538436673 -1.0189671724839118 -4.2809715800696466 -4.9949062529165351 -1.1230582235171953 -4.2971849404728157 -5.2524533155284345 -0.80819439926547632 -4.2478203299631891 -5.2034243146013024 -0.91228545029875974 -4.1984557194535617 -5.1543953136741703 -1.0163765013320432 -4.1653044693471042 -5.3629133753589375 -0.80560372811360759 -4.1159398588374767 -5.3138843744318054 -0.90969477914689101 -4.0334239982213917 -5.4733734351894414 -0.80301305696173897 -3.9840593877117647 -5.4243444342623093 -0.90710410799502239 -3.9015435270956798 -5.5838334950199444 -0.80042238580987024 -4.4462073488338039 -4.6757578181405384 -1.3364249877007861 -4.328365504755598 -4.7745001947171257 -1.3340627222548913 -4.2417463598679408 -4.937414162001045 -1.2273142404402051 -4.2105236606773921 -4.873242571293714 -1.3317004568089965 -4.1551272149802827 -5.1003281292849643 -1.1205657586255184 -4.1239045157897349 -5.0361565385776332 -1.2249519749943103 -4.0926818165991863 -4.9719849478703022 -1.3293381913631017 -4.0685080700926246 -5.2632420965688835 -1.0138172768108322 -4.0372853709020768 -5.1990705058615525 -1.1182034931796236 -4.0060626717115291 -5.1348989151542215 -1.2225897095484155 -3.97483997252098 -5.0707273244468896 -1.3269759259172069 -3.9506662260144183 -5.3619844731454718 -1.0114550113649374 -3.9194435268238705 -5.2978128824381407 -1.1158412277337288 -3.8882208276333228 -5.2336412917308088 -1.2202274441025207 -3.8569981284427737 -5.1694697010234778 -1.3246136604713121 -3.8640470811267607 -5.5248984404293902 -0.9047065295502511 -3.832824381936212 -5.4607268497220591 -1.0090927459190426 -3.8016016827456642 -5.3965552590147281 -1.1134789622878341 -3.770378983555116 -5.3323836683073971 -1.2178651786566259 -3.7391562843645678 -5.2682120776000652 -1.3222513950254173 -3.7149825378580061 -5.5594692262986474 -1.0067304804731476 -3.6837598386674579 -5.4952976355913163 -1.1111166968419393 -3.6525371394769097 -5.4311260448839844 -1.2155029132107311 -3.6213144402863615 -5.3669544541766534 -1.3198891295795225 -5.5748434524452062 -3.8747603911262818 -0.83642514712751193 -5.5221261297433184 -3.8299345590646476 -0.9404737005240642 -5.4694088070414306 -3.785108727003013 -1.0445222539206163 -5.4166914843395437 -3.7402828949413784 -1.1485708073171685 -5.3639741616376559 -3.6954570628797438 -1.252619360713721 -5.3112568389357691 -3.6506312308181097 -1.3566679141102733 -5.4805860118482981 -3.9919600939432796 -0.83418634350995546 -5.4278686891464103 -3.9471342618816454 -0.93823489690650774 -5.3751513664445225 -3.9023084298200108 -1.0422834503030598 -5.3224340437426356 -3.8574825977583762 -1.1463320036996121 -5.2697167210407478 -3.8126567656967416 -1.2503805570961646 -5.38632857125139 -4.1091597967602773 -0.831947539892399 -5.3336112485495022 -4.0643339646986432 -0.93599609328895128 -5.2808939258476144 -4.019508132637009 -1.0400446466855033 -5.2281766031457275 -3.9746823005753744 -1.1440932000820556 -5.2920711306544819 -4.2263594995772751 -0.82970873627484254 -5.2393538079525941 -4.1815336675156409 -0.93375728967139471 -5.1866364852507072 -4.1367078354540068 -1.0378058430679469 -5.1339191625488194 -4.0918820033923726 -1.1418543964644989 -5.1978136900575738 -4.3435592023942728 -0.82746993265728608 -5.145096367355686 -4.2987333703326387 -0.93151848605383825 -5.0923790446537991 -4.2539075382710045 -1.0355670394503904 -5.1035562494606657 -4.4607589052112706 -0.82523112903972962 -5.0508389267587779 -4.4159330731496365 -0.92927968243628167 -5.0092988088637576 -4.5779586080282684 -0.82299232542217304 -4.9150413682668495 -4.6951583108452661 -0.82075352180461658 -5.2188391727765993 -3.7655648161460187 -1.3544523371780925 -5.1762903787170558 -3.928832774362188 -1.2481522458833902 -5.1269811940658965 -3.8798090139656671 -1.3522438261579099 -5.0844324000063539 -4.0430769721818365 -1.2459437348632076 -5.0351232153551946 -3.9940532117853156 -1.3500353151377276 -5.0418836059468113 -4.2063449303980063 -1.1396436435685049 -4.9925744212956511 -4.1573211700014845 -1.243735223843025 -4.9432652366444918 -4.1082974096049636 -1.347826804117545 -4.9993348118872687 -4.3696128886141752 -1.0333435522738028 -4.9500256272361085 -4.3205891282176543 -1.1374351325483223 -4.9007164425849492 -4.2715653678211325 -1.2415267128228424 -4.8514072579337899 -4.2225416074246116 -1.3456182930973626 -4.9567860178277261 -4.5328808468303441 -0.9270434609791004 -4.9074768331765659 -4.4838570864338232 -1.0311350412536202 -4.8581676485254066 -4.4348333260373023 -1.1352266215281399 -4.8088584638742473 -4.3858095656407805 -1.2393182018026601 -4.7595492792230871 -4.3367858052442596 -1.34340978207718 -4.8649280391170233 -4.647125044649993 -0.9248349499589178 -4.815618854465864 -4.5981012842534721 -1.0289265302334376 -4.7663096698147038 -4.5490775238569512 -1.1330181105079573 -4.7170004851635445 -4.5000537634604294 -1.2371096907824775 -4.6676913005123852 -4.4510300030639085 -1.3412012710569976 -4.8223792450574798 -4.8103930028661628 -0.81853485866421549 -4.7730700604063205 -4.7613692424696419 -0.9226264389387353 -4.7237608757551612 -4.712345482073121 -1.026718019213255 -4.6744516911040019 -4.6633217216765992 -1.1308095994877749 -4.6251425064528426 -4.6142979612800783 -1.2349011797622951 -4.5758333218016825 -4.5652742008835565 -1.338992760036815 -6.2566286523250252 -2.621893155686176 -0.85707072084577396 -6.1944029661709763 -2.5918578956472378 -0.96089133768832724 -6.1321772800169274 -2.5618226356082996 -1.0647119545308805 -6.0699515938628785 -2.5317873755693614 -1.1685325713734336 -6.0077259077088296 -2.5017521155304232 -1.2723531882159871 -5.9455002215547808 -2.4717168554914846 -1.3761738050585401 -6.1820308712974219 -2.7647277345428076 -0.85475120945904148 -6.1198051851433721 -2.7346924745038694 -0.95857182630159476 -6.0575794989893241 -2.7046572144649312 -1.062392443144148 -5.9953538128352752 -2.6746219544259926 -1.1662130599867011 -5.9331281266812264 -2.6445866943870544 -1.2700336768292546 -6.1074330902698186 -2.9075623133994393 -0.85243169807230901 -6.0452074041157688 -2.8775270533605011 -0.95625231491486229 -5.9829817179617208 -2.8474917933215624 -1.0600729317574156 -5.920756031807672 -2.8174565332826242 -1.1638935485999686 -6.0328353092422144 -3.0503968922560714 -0.85011218668557653 -5.9706096230881647 -3.0203616322171332 -0.95393280352812981 -5.9083839369341167 -2.9903263721781941 -1.0577534203706831 -5.8461582507800678 -2.9602911121392559 -1.1615740372132362 -5.9582375282146103 -3.193231471112703 -0.84779267529884406 -5.8960118420605614 -3.1631962110737648 -0.95161329214139734 -5.8337861559065134 -3.1331609510348257 -1.0554339089839506 -5.883639747187007 -3.3360660499693346 -0.84547316391211158 -5.8214140610329581 -3.306030789930396 -0.94929378075466486 -5.8090419661594028 -3.4789006288259658 -0.8431536525253791 -5.7344441851317995 -3.6217352076825975 -0.84083414113864663 -5.8742280837295784 -2.6082008256215454 -1.3739455783587935 -5.8597578900104939 -2.7850771691319247 -1.267747859977852 -5.8056710735657546 -2.739500020244825 -1.3717918784689334 -5.7912008798466701 -2.9163763637552043 -1.2655941600879919 -5.7371140634019309 -2.8707992148681045 -1.3696381785790732 -5.7767306861275856 -3.0932527072655835 -1.1593964417070501 -5.7226438696828463 -3.0476755583784838 -1.2634404601981317 -5.6685570532381071 -3.0020984094913836 -1.3674844786892131 -5.762260492408501 -3.2701290507759628 -1.0531987233261086 -5.7081736759637618 -3.2245519018888626 -1.15724274181719 -5.6540868595190226 -3.1789747530017629 -1.2612867603082716 -5.6000000430742833 -3.1333976041146627 -1.3653307787993529 -5.7477902986894156 -3.4470053942863421 -0.94700100494516692 -5.6937034822446773 -3.4014282453992424 -1.0510450234362485 -5.639616665799938 -3.3558510965121422 -1.1550890419273299 -5.5855298493551988 -3.310273947625042 -1.2591330604184114 -5.5314430329104605 -3.2646967987379418 -1.3631770789094928 -5.6792332885255918 -3.5783045889096217 -0.94484730505530679 -5.6251464720808535 -3.5327274400225215 -1.0488913235463881 -5.5710596556361143 -3.4871502911354213 -1.1529353420374697 -5.5169728391913759 -3.4415731422483216 -1.2569793605285513 -5.4628860227466367 -3.3959959933612214 -1.3610233790196327 -5.6647630948065073 -3.7551809324200009 -0.83864958667436518 -5.6106762783617681 -3.7096037835329012 -0.94269360516544665 -5.5565894619170297 -3.664026634645801 -1.046737623656528 -5.5025026454722914 -3.6184494857587008 -1.1507816421476094 -5.4484158290275522 -3.5728723368716007 -1.2548256606386912 -5.3943290125828138 -3.5272951879845005 -1.3588696791297725 -6.7102071003645047 -1.3406666559821387 -0.77189718651556882 -6.6674616006164786 -1.4863101535370131 -0.76983212940646861 -6.601742763857894 -1.465369304966305 -0.87354918200782994 -6.5360239270993103 -1.4444284563955971 -0.97726623460919138 -6.4703050903407258 -1.4234876078248893 -1.0809832872105527 -6.4045862535821421 -1.4025467592541814 -1.184700339811914 -6.3388674168235575 -1.3816059106834733 -1.2884173924132756 -6.6247161008684525 -1.6319536510918875 -0.7677670722973684 -6.5589972641098679 -1.6110128025211794 -0.87148412489872973 -6.4932784273512842 -1.5900719539504715 -0.97520117750009105 -6.4275595905926997 -1.5691311053797636 -1.0789182301014524 -6.361840753834116 -1.5481902568090558 -1.1826352827028137 -6.5819706011204273 -1.7775971486467619 -0.76570201518826808 -6.5162517643618418 -1.7566563000760538 -0.86941906778962941 -6.4505329276032581 -1.7357154515053459 -0.97313612039099073 -6.3848140908446736 -1.714774602934638 -1.0768531729923521 -6.3190952540860899 -1.6938337543639301 -1.1805702255937136 -6.4735062646138157 -1.9022997976309282 -0.8673540106805292 -6.407787427855232 -1.8813589490602203 -0.97107106328189052 -6.3420685910966474 -1.8604181004895124 -1.0747881158832517 -6.4307607648657896 -2.047943295185803 -0.86528895357142899 -6.3650419281072059 -2.0270024466150947 -0.9690060061727902 -6.3880152651177635 -2.1935867927406774 -0.86322389646232867 -6.3222964283591807 -2.172645944169969 -0.96694094906368999 -6.3452697653697383 -2.3392302902955517 -0.86115883935322846 -6.2739932741516196 -1.3578110406900981 -1.3921647578290441 -6.2962039342481031 -1.5269722916215172 -1.2863552785843162 -6.2331504636380126 -1.4970258015915978 -1.3901679809015499 -6.2553611237344962 -1.6661870525230169 -1.284358501656822 -6.1923076531244057 -1.6362405624930976 -1.3881712039740557 -6.2775717838309815 -1.835348303454436 -1.1785490224120938 -6.2145183132208892 -1.8054018134245164 -1.282361724729328 -6.1514648426107987 -1.7754553233945973 -1.3861744270465617 -6.2997824439274659 -2.0045095543858551 -1.0727395431673659 -6.2367289733173745 -1.9745630643559358 -1.1765522454845996 -6.1736755027072823 -1.9446165743260164 -1.2803649478018337 -6.1106220320971918 -1.9146700842960973 -1.3841776501190675 -6.2589396334138589 -2.1437243152873546 -1.0707427662398716 -6.1958861628037676 -2.1137778252574355 -1.1745554685571056 -6.1328326921936753 -2.083831335227516 -1.2783681708743397 -6.0697792215835848 -2.0538848451975968 -1.3821808731915735 -6.2811502935103443 -2.3128855662187737 -0.96493328699514369 -6.218096822900252 -2.2829390761888542 -1.0687459893123776 -6.1550433522901606 -2.2529925861589351 -1.1725586916296113 -6.0919898816800684 -2.2230460961290155 -1.2763713939468455 -6.028936411069977 -2.1930996060990964 -1.3801840962640795 -6.3033609536068278 -2.4820468171501928 -0.85912380775041575 -6.2403074829967373 -2.4521003271202733 -0.96293651006764958 -6.1772540123866451 -2.4221538370903541 -1.0667492123848834 -6.1142005417765537 -2.392207347060435 -1.1705619147021173 -6.0511470711664614 -2.3622608570305155 -1.2743746170193515 -5.9880936005563701 -2.3323143670005964 -1.3781873193365852 -6.8236492155334112 -0.094276559254982795 -0.78755317543088932 -6.7550566904394724 -0.088173345423154581 -0.89110877458127824 -6.6864641653455346 -0.082070131591326145 -0.99466437373166727 -6.6178716402515967 -0.075966917759497821 -1.0982199728820563 -6.5492791151576588 -0.069863703927669607 -1.2017755720324452 -6.4806865900637201 -0.063760490095841366 -1.3053311711828346 -6.8095955349489437 -0.25024744907634799 -0.78559544861553143 -6.7410030098550049 -0.24414423524451956 -0.88915104776592035 -6.672410484761067 -0.23804102141269112 -0.99270664691630939 -6.6038179596671283 -0.2319378075808628 -1.0962622460666984 -6.5352254345731904 -0.22583459374903456 -1.1998178452170873 -6.4666329094792516 -0.2197313799172064 -1.3033734443674767 -6.7955418543644761 -0.40621833889771297 -0.78363772180017355 -6.7269493292705373 -0.40011512506588454 -0.88719332095056247 -6.6583568041765995 -0.39401191123405616 -0.9907489201009515 -6.5897642790826607 -0.38790869740222783 -1.0943045192513405 -6.5211717539887228 -0.38180548357039951 -1.1978601184017295 -6.7814881737800077 -0.56218922871907839 -0.78167999498481566 -6.7128956486860689 -0.55608601488724985 -0.88523559413520458 -6.644303123592131 -0.54998280105542152 -0.98879119328559362 -6.5757105984981923 -0.5438795872235932 -1.0923467924359826 -6.7674344931955392 -0.71816011854044337 -0.77972226816945778 -6.6988419681016005 -0.71205690470861482 -0.8832778673198467 -6.6302494430076635 -0.7059536908767865 -0.98683346647023573 -6.7533808126110717 -0.87413100836180846 -0.77776454135409978 -6.6847882875171329 -0.8680277945299798 -0.88132014050448881 -6.6161957624231951 -0.86192458069815148 -0.98487573965487774 -6.7393271320266033 -1.0301018981831735 -0.7758068145387419 -6.6707346069326645 -1.0239986843513449 -0.87936241368913093 -6.7252734514421357 -1.1860727880045385 -0.7738490877233839 -6.4124002535825051 -0.054318558325856969 -1.4089206630695883 -6.3993429864671487 -0.19942443428026024 -1.407073231600352 -6.453520024914714 -0.36544371531373165 -1.3015198564722203 -6.3862857193517923 -0.34453031023466341 -1.4052258001311158 -6.5076970633622802 -0.53146299634720318 -1.1959664813440887 -6.4404627577993576 -0.51054959126813482 -1.2996724250029841 -6.373228452236436 -0.48963618618906668 -1.4033783686618795 -6.5618741018098454 -0.69748227738067459 -1.090413106215957 -6.4946397962469238 -0.67656887230160634 -1.1941190498748524 -6.4274054906840012 -0.65565546722253798 -1.2978249935337478 -6.3601711851210796 -0.63474206214346984 -1.4015309371926432 -6.5488168346944891 -0.84258815333507786 -1.0885656747467207 -6.4815825291315674 -0.82167474825600961 -1.1922716184056161 -6.4143482235686449 -0.80076134317694114 -1.2959775620645115 -6.3471139180057232 -0.77984793809787301 -1.3996835057234069 -6.6029938731420552 -1.0086074343685492 -0.98301229961858927 -6.5357595675791327 -0.98769402928948102 -1.0867182432774845 -6.468525262016211 -0.96678062421041289 -1.1904241869363799 -6.4012909564532885 -0.94586721913134442 -1.2941301305952753 -6.3340566508903677 -0.92495381405227617 -1.3978360742541707 -6.6571709115896205 -1.1746267154020207 -0.87745892449045781 -6.5899366060266988 -1.1537133103229524 -0.981164868149353 -6.5227023004637763 -1.1327999052438842 -1.0848708118082482 -6.4554679949008555 -1.1118865001648162 -1.1885767554671434 -6.388233689337933 -1.0909730950857477 -1.2922826991260388 -6.3209993837750114 -1.0700596900066794 -1.3959886427849342 -6.644113644474265 -1.319732591356424 -0.87561149302122154 -6.5768793389113434 -1.2988191862773557 -0.97931743668011673 -6.5096450333484208 -1.2779057811982875 -1.0830233803390119 -6.4424107277854992 -1.2569923761192192 -1.1867293239979071 -6.3751764222225766 -1.236078971040151 -1.2904352676568025 -6.3079421166596559 -1.2151655659610827 -1.3941412113156979 -6.6975912668551567 1.2706009258046604 -0.80281872035359458 -6.6290448553309949 1.26473851932897 -0.90626980999072249 -6.5604984438068321 1.2588761128532802 -1.0097208996278504 -6.4919520322826703 1.2530137063775901 -1.1131719892649783 -6.4234056207585066 1.2471512999019001 -1.216623078902106 -6.3548592092343439 1.2412888934262098 -1.3200741685392341 -6.7136508721127939 1.1189414046498578 -0.80113886092240949 -6.645104460588632 1.1130789981741673 -0.90458995055953739 -6.5765580490644693 1.1072165916984775 -1.0080410401966653 -6.5080116375403074 1.1013541852227875 -1.1114921298337932 -6.4394652260161438 1.0954917787470975 -1.2149432194709209 -6.3709188144919811 1.0896293722714072 -1.318394309108049 -6.729710477370431 0.96728188349505517 -0.7994590014912244 -6.6611640658462692 0.9614194770193647 -0.9029100911283523 -6.5926176543221064 0.95555707054367467 -1.0063611807654802 -6.5240712427979446 0.94969466406798475 -1.1098122704026081 -6.455524831273781 0.94383225759229472 -1.2132633600397358 -6.7457700826280682 0.81562236234025254 -0.7977791420600393 -6.6772236711039064 0.80975995586456206 -0.90123023169716721 -6.6086772595797436 0.80389754938887203 -1.0046813213342951 -6.5401308480555809 0.79803514291318201 -1.108132410971423 -6.7618296878857054 0.6639628411854499 -0.79609928262885421 -6.6932832763615435 0.65810043470975954 -0.89955037226598211 -6.6247368648373808 0.65223802823406951 -1.00300146190311 -6.7778892931433425 0.51230332003064705 -0.79441942319766912 -6.7093428816191807 0.5064409135549568 -0.89787051283479702 -6.6407964700950179 0.50057850707926677 -1.0013216024719249 -6.7939488984009797 0.36064379887584441 -0.79273956376648402 -6.7254024868768179 0.35478139240015427 -0.89619065340361193 -6.8100085036586169 0.20898427772104181 -0.79105970433529893 -6.826068108916254 0.057324756566239018 -0.78937984490411384 -6.3862516495369297 0.94497182942380287 -1.316770026944422 -6.4711879023764229 0.79599309602689849 -1.2116138242025056 -6.4014507040818325 0.80160317836467831 -1.3151559751872088 -6.5561241552159162 0.64701436262999434 -1.1064576214605895 -6.4863869569213257 0.65262444496777394 -1.2099997724452924 -6.4166497586267353 0.65823452730555376 -1.3135419234299957 -6.571323209760819 0.50364571157086968 -1.1048435697033763 -6.5015860114662285 0.50925579390864928 -1.2083857206880793 -6.431848813171638 0.5148658762464291 -1.3119278716727822 -6.6562594626003122 0.35466697817396553 -0.9996873669614601 -6.5865222643057217 0.36027706051174524 -1.1032295179461631 -6.5167850660111313 0.36588714284952478 -1.2067716689308658 -6.4470478677165408 0.37149722518730455 -1.3103138199155691 -6.3773106694219512 0.3771073075250842 -1.413855970900272 -6.7411957154398046 0.2056882447770613 -0.89453116421954382 -6.671458517145215 0.21129832711484103 -0.9980733152042468 -6.6017213188506245 0.21690840945262072 -1.1016154661889497 -6.5319841205560341 0.22251849179040031 -1.2051576171736527 -6.4622469222614436 0.22812857412817997 -1.3086997681583556 -6.392509723966854 0.23373865646595959 -1.4122419191430589 -6.7563947699847073 0.06231959371793664 -0.89291711246233052 -6.6866575716901178 0.067929676055716398 -0.99645926344703351 -6.6169203733955273 0.073539758393496024 -1.1000014144317365 -6.5471831751009368 0.079149840731275609 -1.2035435654164393 -6.4774459768063464 0.084759923069055221 -1.3070857164011425 -6.4077087785117568 0.090370005406834833 -1.4106278673858454 -6.2995260370412041 2.5948044977718228 -0.81541893945487787 -6.2336537213742087 2.575239931550894 -0.91875605480724298 -6.3452373496867462 2.4473016713820241 -0.81402759729584306 -6.2793650340197509 2.4277371051610954 -0.91736471264820829 -6.2134927183527564 2.4081725389401667 -1.0207018280005733 -6.1476204026857619 2.388607972719238 -1.1240389433529385 -6.0817480870187666 2.3690434064983088 -1.2273760587053038 -6.0158757713517712 2.3494788402773801 -1.3307131740576692 -6.3909486623322884 2.2997988449922255 -0.81263625513680837 -6.3250763466652931 2.2802342787712968 -0.9159733704891736 -6.2592040309982986 2.2606697125503681 -1.0193104858415387 -6.1933317153313041 2.2411051463294394 -1.1226476011939039 -6.1274593996643096 2.2215405801085106 -1.2259847165462689 -6.4366599749778315 2.1522960186024269 -0.81124491297777357 -6.3707876593108352 2.1327314523814986 -0.9145820283301388 -6.3049153436438408 2.1131668861605695 -1.0179191436825039 -6.2390430279768463 2.0936023199396407 -1.1212562590348691 -6.4823712876233746 2.0047931922126283 -0.80985357081873888 -6.4164989719563783 1.9852286259917 -0.91319068617110399 -6.3506266562893838 1.9656640597707709 -1.0165278015234693 -6.5280826002689167 1.8572903658228299 -0.80846222865970407 -6.4622102846019214 1.8377257996019016 -0.9117993440120693 -6.3963379689349269 1.8181612333809727 -1.0151364593644345 -6.5737939129144589 1.7097875394330315 -0.80707088650066938 -6.5079215972474636 1.6902229732121032 -0.91040800185303461 -6.619505225560002 1.5622847130432334 -0.80567954434163458 -6.6652165382055442 1.414781886653435 -0.80428820218259989 -6.0594293890921564 2.2089708353558861 -1.3293734075332007 -6.1720814602590277 2.0775688941089911 -1.2246194109068504 -6.1021946567873897 2.0710185058485502 -1.32805248503239 -6.2847335314258981 1.9461669528620957 -1.1198654142805005 -6.214846727954261 1.9396165646016552 -1.2232984884060398 -6.144959924482623 1.9330661763412142 -1.3267315625315794 -6.3274987991211313 1.80821462335476 -1.1185444917796898 -6.2576119956494942 1.8016642350943193 -1.2219775659052292 -6.1877251921778562 1.7951138468338785 -1.3254106400307686 -6.4401508702880017 1.676812682107865 -1.0137904951533396 -6.3702640668163646 1.6702622938474243 -1.117223569278879 -6.3003772633447266 1.6637119055869836 -1.2206566434044186 -6.2304904598730886 1.6571615173265428 -1.324089717529958 -6.5528029414548721 1.5454107408609699 -0.90903649852698964 -6.482916137983235 1.5388603526005293 -1.012469572652529 -6.4130293345115978 1.5323099643400886 -1.1159026467780684 -6.3431425310399598 1.5257595760796479 -1.2193357209036078 -6.2732557275683209 1.5192091878192071 -1.3227687950291471 -6.5955682091501053 1.4074584113536341 -0.90771557602617903 -6.5256814056784682 1.4009080230931936 -1.0111486501517184 -6.4557946022068302 1.3943576348327529 -1.1145817242772575 -6.3859077987351922 1.3878072465723121 -1.2180147984027971 -6.3160209952635542 1.3812568583118714 -1.3214478725283365 -5.7233678229870044 3.6675099838200498 -0.82307430607695997 -5.662412142446505 3.6359194803371531 -0.92631307199882762 -5.6014564619060057 3.6043289768542559 -1.0295518379206954 -5.5405007813655072 3.5727384733713592 -1.1327906038425628 -5.4795451008250078 3.5411479698884625 -1.2360293697644305 -5.4185894202845084 3.5095574664055653 -1.3392681356862981 -5.7960568763662952 3.53286818564741 -0.82211738169495741 -5.7351011958257958 3.5012776821645133 -0.92535614761682505 -5.6741455152852964 3.4696871786816161 -1.0285949135386927 -5.6131898347447979 3.4380966751987194 -1.1318336794605601 -5.5522341542042986 3.4065061717158227 -1.2350724453824278 -5.868745929745586 3.3982263874747702 -0.82116045731295484 -5.8077902492050866 3.3666358839918735 -0.92439922323482249 -5.7468345686645872 3.3350453805089764 -1.02763798915669 -5.6858788881240887 3.3034548770260797 -1.1308767550785574 -5.9414349831248767 3.2635845893021305 -0.82020353293095227 -5.8804793025843773 3.2319940858192338 -0.92344229885281992 -5.819523622043878 3.2004035823363366 -1.0266810647746873 -5.7585679415033786 3.1688130788534399 -1.1299198306965548 -6.0141240365041675 3.1289427911294907 -0.81924660854894971 -5.9531683559636681 3.097352287646594 -0.92248537447081735 -5.8922126754231687 3.0657617841636968 -1.0257241403926847 -6.0868130898834583 2.9943009929568509 -0.81828968416694714 -6.0258574093429589 2.9627104894739538 -0.92152845008881479 -6.159502143262749 2.8596591947842112 -0.81733275978494457 -6.2321911966420389 2.7250173966115714 -0.81637583540294201 -5.4887065319984325 3.3796814371046611 -1.3383438179459421 -5.6239402654176871 3.2736857504585508 -1.234127982575038 -5.5570195095040269 3.2531484411105676 -1.3374423727140903 -5.6922532429232815 3.1471527544644573 -1.2332265373431861 -5.6253324870096213 3.126615445116474 -1.3365409274822384 -5.8274869763425361 3.0411570678183466 -1.1290107019722824 -5.7605662204288759 3.0206197584703638 -1.2323250921113342 -5.6936454645152157 3.0000824491223805 -1.3356394822503865 -5.9627207097617898 2.9351613811722359 -1.0247948666013784 -5.8957999538481305 2.9146240718242531 -1.1281092567404305 -5.8288791979344703 2.8940867624762703 -1.2314236468794824 -5.7619584420208101 2.873549453128287 -1.3347380370185347 -6.0979544431810444 2.8291656945261257 -0.92057903123047446 -6.0310336872673842 2.8086283851781424 -1.0238934213695265 -5.9641129313537249 2.7880910758301596 -1.1272078115085786 -5.8971921754400647 2.7675537664821768 -1.2305222016476305 -5.8302714195264045 2.7470164571341935 -1.3338365917866828 -6.1662674206866388 2.7026326985320321 -0.9196775859986227 -6.0993466647729786 2.6820953891840493 -1.0229919761376747 -6.0324259088593184 2.6615580798360661 -1.1263063662767268 -5.9655051529456591 2.6410207704880833 -1.2296207564157786 -5.8985843970319989 2.6204834611401 -1.3329351465548309 -6.167659642278573 2.5555623931899558 -1.0220905309058228 -6.1007388863649128 2.535025083841973 -1.1254049210448749 -6.0338181304512526 2.5144877744939897 -1.228719311183927 -5.9668973745375933 2.4939504651460065 -1.3320337013229793 -4.8700420750087314 4.7436301395129554 -0.82682112643380701 -4.816515397785702 4.7007525573059317 -0.92995185614210607 -4.7629887205626709 4.657874975098907 -1.0330825858504051 -4.7094620433396406 4.6149973928918833 -1.136213315558704 -4.6559353661166094 4.5721198106848586 -1.2393440452670028 -4.6024086888935791 4.529242228477834 -1.3424747749753021 -4.9677841628553479 4.6249136488920906 -0.82645612577113348 -4.9142574856323185 4.5820360666850668 -0.92958685547943254 -4.8607308084092873 4.5391584844780422 -1.0327175851877315 -4.807204131186257 4.4962809022710184 -1.1358483148960303 -4.7536774539632258 4.4534033200639938 -1.2389790446043292 -5.0655262507019643 4.5061971582712257 -0.82609112510845994 -5.0119995734789349 4.4633195760642019 -0.92922185481675901 -4.9584728962559037 4.4204419938571773 -1.0323525845250578 -4.9049462190328734 4.3775644116501535 -1.1354833142333569 -5.1632683385485807 4.3874806676503608 -0.82572612444578641 -5.1097416613255513 4.3446030854433371 -0.92885685415408548 -5.0562149841025201 4.3017255032363124 -1.0319875838623844 -5.0026883068794898 4.2588479210292887 -1.1351183135706833 -5.2610104263951971 4.268764177029496 -0.82536112378311288 -5.2074837491721677 4.2258865948224722 -0.92849185349141194 -5.1539570719491365 4.1830090126154476 -1.0316225831997108 -5.3587525142418135 4.1500476864086311 -0.82499612312043935 -5.3052258370187841 4.1071701042016073 -0.92812685282873841 -5.45649460208843 4.0313311957877662 -0.82463112245776582 -5.4029679248654006 3.9884536135807429 -0.92776185216606477 -5.5542366899350473 3.9126147051669018 -0.82426612179509229 -4.6978488314708962 4.4133088386729291 -1.3421305985200565 -4.8512627396094681 4.3348764066401317 -1.2386154624295709 -4.7893678010694645 4.3021162304418574 -1.3418218943762334 -4.9427817092080364 4.2236837984090609 -1.2383067582857479 -4.8808867706680328 4.1909236222107857 -1.3415131902324104 -5.0961956173466092 4.1452513663762627 -1.1347916221952625 -5.0343006788066047 4.1124911901779893 -1.2379980541419249 -4.9724057402666011 4.0797310139797149 -1.3412044860885874 -5.2496095254851811 4.0668189343434653 -1.0312764861047774 -5.1877145869451775 4.034058758145191 -1.1344829180514395 -5.125819648405173 4.0012985819469176 -1.2376893499981019 -5.0639247098651694 3.9685384057486437 -1.3408957819447644 -5.3411284950837494 3.9556263261123941 -1.0309677819609544 -5.2792335565437458 3.9228661499141197 -1.1341742139076165 -5.2173386180037413 3.8901059737158463 -1.2373806458542789 -5.1554436794637377 3.8573457975175724 -1.3405870778009414 -5.4945424032223213 3.8771938940795967 -0.92745264587046905 -5.4326474646823177 3.8444337178813228 -1.0306590778171314 -5.3707525261423141 3.8116735416830485 -1.1338655097637935 -5.3088575876023096 3.7789133654847751 -1.2370719417104559 -5.246962649062306 3.7461531892865012 -1.3402783736571184 -5.6479563113608933 3.7987614620467993 -0.82393750977998359 -5.5860613728208897 3.7660012858485254 -0.92714394172664605 -5.5241664342808861 3.7332411096502516 -1.0303503736733084 -5.4622714957408824 3.7004809334519777 -1.1335568056199707 -5.4003765572008788 3.6677207572537043 -1.2367632375666331 -5.3384816186608743 3.63496058105543 -1.3399696695132954 -3.8195496242087836 5.6318484632666195 -0.8228301736900937 -3.7754480915133346 5.5794414949145592 -0.92582693964936891 -3.731346558817886 5.5270345265624998 -1.0288237056086442 -3.687245026122437 5.4746275582104396 -1.1318204715679194 -3.6431434934269884 5.4222205898583793 -1.2348172375271946 -3.5990419607315394 5.369813621506319 -1.3378140034864698 -3.9383313385510106 5.5339427241471721 -0.82332319183256253 -3.8942298058555611 5.4815357557951119 -0.92631995779183773 -3.850128273160113 5.4291287874430525 -1.0293167237511129 -3.8060267404646639 5.3767218190909922 -1.1323134897103881 -3.7619252077692149 5.324314850738932 -1.2353102556696633 -4.0571130528932375 5.4360369850277248 -0.82381620997503135 -4.0130115201977876 5.3836300166756654 -0.92681297593430656 -3.9689099875023395 5.3312230483236061 -1.0298097418935817 -3.9248084548068909 5.2788160799715458 -1.1328065078528569 -3.8807069221114419 5.2264091116194846 -1.2358032738121323 -4.175894767235464 5.3381312459082784 -0.82430922811750018 -4.1317932345400141 5.2857242775562181 -0.92730599407677539 -4.087691701844566 5.2333173092041587 -1.0303027600360506 -4.0435901691491178 5.1809103408520985 -1.1332995259953258 -4.2946764815776906 5.2402255067888319 -0.82480224625996901 -4.2505749488822406 5.1878185384367708 -0.92779901221924421 -4.2064734161867925 5.1354115700847123 -1.0307957781785193 -4.4134581959199171 5.1423197676693846 -0.82529526440243783 -4.369356663224468 5.0899127993173243 -0.92829203036171304 -4.5322399102621445 5.0444140285499373 -0.82578828254490666 -4.4881383775666945 4.992007060197877 -0.92878504850418186 -4.651021624604371 4.9465082894304908 -0.82628130068737538 -3.7175250073416031 5.2721507390803932 -1.3383096413919942 -3.8287031684856014 5.1804277026431498 -1.3388693540769676 -3.9940690202538964 5.132910243175008 -1.2363438301007244 -3.9398813296295998 5.0887046662059063 -1.3394290667619411 -4.1594348720221914 5.0853927837068671 -1.1338183061244815 -4.1052471813978952 5.0411872067377645 -1.2369035427856978 -4.0510594907735982 4.9969816297686629 -1.3399887794469145 -4.3248007237904851 5.0378753242387262 -1.0312927821482387 -4.2706130331661898 4.9936697472696236 -1.134378018809455 -4.2164253425418936 4.9494641703005211 -1.2374632554706713 -4.1622376519175965 4.9052585933314194 -1.340548492131888 -4.4359788849344834 4.9461522878014827 -1.0318524948332122 -4.3817911943101882 4.9019467108323802 -1.1349377314944284 -4.327603503685892 4.8577411338632777 -1.2380229681556447 -4.2734158130615958 4.813535556894176 -1.3411082048168614 -4.601344736702778 4.898634828333341 -0.92932697085696914 -4.5471570460784827 4.8544292513642393 -1.0324122075181856 -4.4929693554541865 4.8102236743951368 -1.1354974441794019 -4.4387816648298903 4.7660180974260342 -1.2385826808406182 -4.3845939742055942 4.7218125204569326 -1.3416679175018349 -4.7667105884710725 4.8511173688651992 -0.82680144688072632 -4.7125228978467772 4.8069117918960975 -0.92988668354194259 -4.6583352072224811 4.7627062149269959 -1.0329719202031591 -4.6041475165981849 4.7185006379578933 -1.1360571568643754 -4.5499598259738887 4.6742950609887917 -1.2391423935255916 -4.4957721353495925 4.6300894840196891 -1.3422276301868084 -2.7413114137279999 6.2289028599066736 -0.80918610375257183 -2.7083599716100379 6.1690046546459296 -0.91198714802236691 -2.6754085294920755 6.1091064493851857 -1.014788192292162 -2.6424570873741131 6.0492082441244417 -1.1175892365619571 -2.6095056452561511 5.9893100388636977 -1.2203902808317522 -2.5765542031381892 5.9294118336029538 -1.3231913251015475 -2.8775973577516458 6.1547414443064365 -0.81093023584234825 -2.8446459156336839 6.0948432390456926 -0.91373128011214333 -2.8116944735157214 6.0349450337849486 -1.0165323243819384 -2.7787430313977595 5.9750468285242047 -1.1193333686517335 -2.7457915892797975 5.9151486232634607 -1.2221344129215286 -3.0138833017752917 6.0805800287061995 -0.81267436793212466 -2.9809318596573298 6.0206818234454555 -0.91547541220191975 -2.9479804175393673 5.9607836181847116 -1.0182764564717148 -2.9150289754214054 5.9008854129239676 -1.1210775007415099 -3.1501692457989376 6.0064186131059625 -0.81441850002190108 -3.1172178036809757 5.9465204078452185 -0.91721954429169616 -3.0842663615630137 5.8866222025844746 -1.0200205885614912 -3.0513149194450517 5.8267239973237306 -1.1228216328312863 -3.286455189822584 5.9322571975057254 -0.8161626321116775 -3.253503747704622 5.8723589922449815 -0.91896367638147258 -3.2205523055866601 5.8124607869842375 -1.0217647206512677 -3.4227411338462304 5.8580957819054884 -0.81790676420145403 -3.3897896917282684 5.7981975766447444 -0.920707808471249 -3.5590270778698763 5.7839343663052514 -0.81965089629123045 -2.7082024671131539 5.8576903000226084 -1.3249871946563574 -2.8800619565284244 5.8420476019727623 -1.2239010305712887 -2.835538543137575 5.7882374071713532 -1.3268311705209961 -3.0073980325528455 5.7725947091215071 -1.2257450064359274 -2.9628746191619961 5.7187845143200979 -1.328675146385635 -3.1792575219681161 5.7569520110716601 -1.124658842350859 -3.1347341085772666 5.7031418162702519 -1.2275889823005663 -3.0902106951864172 5.6493316214688427 -1.3305191222502737 -3.3511170113833866 5.7413093130218131 -1.0235726782657906 -3.3065935979925372 5.6874991182204049 -1.1265028182154979 -3.2620701846016873 5.6336889234189966 -1.229432958165205 -3.2175467712108383 5.5798787286175875 -1.3323630981149126 -3.5229765007986571 5.7256666149719662 -0.92248651418072225 -3.4784530874078072 5.6718564201705579 -1.0254166541304295 -3.4339296740169578 5.6180462253691488 -1.1283467940801366 -3.3894062606261084 5.5642360305677405 -1.231276934029844 -3.3448828472352594 5.5104258357663314 -1.3342070739795513 -3.6948359902139272 5.7100239169221192 -0.82140035009565371 -3.6503125768230777 5.6562137221207109 -0.92433049004536105 -3.6057891634322283 5.6024035273193027 -1.0272606299950682 -3.5612657500413789 5.5485933325178936 -1.1301907699447755 -3.5167423366505295 5.4947831377164853 -1.2331209098944826 -3.4722189232596801 5.4409729429150762 -1.3360510498441902 -1.407055983289935 6.6850638243509337 -0.7790988258264645 -1.3867528784457108 6.6199971542841576 -0.88159894746242373 -1.3664497736014867 6.5549304842173806 -0.98409906909838296 -1.3461466687572625 6.4898638141506044 -1.0865991907343422 -1.3258435639130384 6.4247971440838283 -1.1890993123703013 -1.3055404590688144 6.3597304740170513 -1.2915994340062609 -1.2852373542245903 6.2946638039502743 -1.39409955564222 -1.557423784299365 6.6370013335309013 -0.7826230428838713 -1.5371206794551409 6.5719346634641251 -0.88512316451983053 -1.5168175746109167 6.5068679933973481 -0.98762328615578976 -1.4965144697666928 6.441801323330572 -1.090123407791749 -1.4762113649224686 6.3767346532637958 -1.1926235294277081 -1.4559082600782445 6.3116679831970188 -1.2951236510636677 -1.707791585308795 6.5889388427108688 -0.7861472599412781 -1.6874884804645709 6.5238721726440927 -0.88864738157723733 -1.6671853756203467 6.4588055025773157 -0.99114750321319656 -1.646882270776123 6.3937388325105395 -1.0936476248491558 -1.6265791659318987 6.3286721624437634 -1.1961477464851149 -1.8581593863182251 6.5408763518908364 -0.7896714769986849 -1.8378562814740009 6.4758096818240602 -0.89217159863464413 -1.817553176629777 6.4107430117572832 -0.99467172027060335 -1.7972500717855531 6.3456763416905071 -1.0971718419065626 -2.0085271873276551 6.4928138610708039 -0.79319569405609169 -1.9882240824834312 6.4277471910040269 -0.89569581569205092 -1.9679209776392073 6.3626805209372508 -0.99819593732801015 -2.1588949883370852 6.4447513702507715 -0.79671991111349849 -2.1385918834928614 6.3796847001839945 -0.89922003274945772 -2.1182887786486373 6.3146180301172183 -1.0017201543854171 -2.3092627893465156 6.3966888794307382 -0.8002441281709054 -2.2889596845022915 6.3316222093639611 -0.90274424980686463 -2.4596305903559457 6.3486263886107057 -0.8037683452283122 -1.4258341333667528 6.2494562802990439 -1.3977806911665513 -1.5990049318876474 6.2657300229970367 -1.2987646393720631 -1.5658706639788629 6.2044124540769463 -1.4014708240446525 -1.7721757304085424 6.2820037656950296 -1.1997485875775746 -1.7390414624997574 6.2206861967749383 -1.3024547722501643 -1.705907194590973 6.1593686278548478 -1.4051609569227537 -1.9453465289294372 6.2982775083930225 -1.1007325357830864 -1.9122122610206524 6.2369599394729311 -1.2034387204556758 -1.8790779931118675 6.1756423705528398 -1.3061449051282654 -1.845943725203083 6.1143248016327494 -1.408851089800855 -2.085383059541547 6.253233682170924 -1.1044226686611875 -2.0522487916327625 6.1919161132508336 -1.207128853333777 -2.0191145237239776 6.1305985443307422 -1.3098350380063666 -1.9859802558151931 6.0692809754106518 -1.4125412226789562 -2.2585538580624416 6.2695074248689169 -1.0054066168666993 -2.2254195901536571 6.2081898559488256 -1.1081128015392887 -2.1922853222448726 6.1468722870287351 -1.2108189862118781 -2.1591510543360877 6.0855547181086438 -1.3135251708844677 -2.4317246565833361 6.2857811675669089 -0.90639056507221105 -2.3985903886745517 6.2244635986468184 -1.0090967497448005 -2.3654561207657672 6.1631460297267271 -1.1118029344173899 -2.3323218528569827 6.1018284608066375 -1.2145091190899793 -2.2991875849481977 6.0405108918865462 -1.3172153037625691 -2.6048954551042307 6.3020549102649017 -0.80737451327772281 -2.5717611871954462 6.2407373413448104 -0.91008069795031221 -2.5386269192866617 6.17941977242472 -1.0127868826229016 -2.5054926513778772 6.1181022035046295 -1.1154930672954912 -2.4723583834690928 6.0567846345845391 -1.2181992519680807 -2.4392241155603078 5.9954670656644478 -1.3209054366406703 -0.11110059270972772 6.7895684691186746 -0.83607870724169076 -0.10468371778360075 6.7219842137836618 -0.93817155858467716 -0.098266842857473669 6.6543999584486491 -1.0402644099276634 -0.091849967931346754 6.5868157031136372 -1.1423572612706501 -0.085433093005219646 6.5192314477786244 -1.2444501126136369 -0.079016218079092676 6.4516471924436116 -1.3465429639566233 -0.27321396471777903 6.7697460341507183 -0.84184911239550952 -0.26679708979165195 6.7021617788157055 -0.94394196373849593 -0.26038021486552493 6.6345775234806936 -1.0460348150814822 -0.25396333993939807 6.5669932681456809 -1.1481276664244688 -0.2475464650132711 6.4994090128106681 -1.2502205177674557 -0.43532733672583024 6.749923599182762 -0.84761951754932829 -0.42891046179970321 6.6823393438477492 -0.9497123688923147 -0.42249358687357619 6.6147550885127382 -1.051805220235301 -0.41607671194744938 6.5471708331777254 -1.1538980715782876 -0.59744070873388155 6.7301011642148065 -0.85338992270314695 -0.59102383380775447 6.6625169088797938 -0.95548277404613347 -0.5846069588816275 6.5949326535447819 -1.0575756253891198 -0.7595540807419332 6.7102787292468502 -0.85916032785696572 -0.75313720581580612 6.6426944739118374 -0.96125317919995223 -0.92166745274998452 6.6904562942788939 -0.86493073301078438 -0.91525057782385733 6.622872038943882 -0.96702358435377089 -1.0901976996841627 6.7382181146459503 -0.76860828682161664 -1.0837808247580358 6.6706338593109384 -0.87070113816460315 -1.2523110716922139 6.718395679677994 -0.77437869197543541 -0.2333859185339231 6.4324784522478948 -1.3524764846307376 -0.40394546172851742 6.4800689662330058 -1.2561112926054279 -0.38364725673653499 6.413656526209814 -1.3584965453448996 -0.57450500492311196 6.5276594802181167 -1.159746100580118 -0.55420679993112942 6.4612470401949249 -1.2621313533195899 -0.533908594939147 6.3948346001717331 -1.3645166060590617 -0.74506454811770662 6.5752499942032276 -1.063380908554808 -0.72476634312572397 6.5088375541800358 -1.16576616129428 -0.70446813813374143 6.442425114156844 -1.268151414033752 -0.684169933141759 6.3760126741336522 -1.3705366667732237 -0.89532588632031851 6.5564280681651468 -1.0694009692689701 -0.87502768132833586 6.490015628141955 -1.1717862220084421 -0.85472947633635332 6.4236031881187623 -1.274171474747914 -0.8344312713443709 6.3571907480955714 -1.3765567274873858 -1.0658854295149129 6.6040185821502568 -0.97303577724366042 -1.0455872245229305 6.5376061421270659 -1.0754210299831322 -1.0252890195309479 6.4711937021038732 -1.1778062827226041 -1.0049908145389654 6.4047812620806814 -1.2801915354620761 -0.9846926095469829 6.3383688220574896 -1.3825767882015478 -1.2364449727095075 6.6516090961353678 -0.87667058521835062 -1.2161467677175248 6.585196656112176 -0.97905583795782247 -1.1958485627255424 6.5187842160889842 -1.0814410906972942 -1.1755503577335598 6.4523717760657924 -1.1838263434367662 -1.1552521527415773 6.3859593360425997 -1.2862115961762381 -1.1349539477495949 6.3195468960194088 -1.3885968489157099 1.2338457207063134 6.7192222356517366 -0.77586350801419945 1.2250793415387249 6.6521019181320939 -0.8776083508573046 1.2163129623711366 6.5849816006124513 -0.97935319370040963 1.2075465832035484 6.5178612830928095 -1.0810980365435148 1.1987802040359599 6.4507409655731669 -1.1828428793866201 1.1900138248683716 6.3836206480535242 -1.2845877222297253 1.0637824904194166 6.7308489923874193 -0.78353063351626462 1.0550161112518281 6.6637286748677766 -0.88527547635936976 1.0462497320842399 6.596608357348134 -0.98702031920247479 1.0374833529166516 6.5294880398284922 -1.08876516204558 1.0287169737490631 6.4623677223088496 -1.1905100048886854 1.0199505945814749 6.3952474047892069 -1.2922548477317906 0.8937192601325199 6.742475749123102 -0.79119775901832978 0.88495288096493141 6.6753554316034593 -0.89294260186143493 0.87618650179734314 6.6082351140838167 -0.99468744470453996 0.86742012262975476 6.5411147965641749 -1.0964322875476451 0.85865374346216639 6.4739944790445314 -1.1981771303907505 0.72365602984562316 6.7541025058587847 -0.79886488452039495 0.71488965067803467 6.686982188339142 -0.90060972736350009 0.70612327151044629 6.6198618708194994 -1.0023545702066052 0.69735689234285803 6.5527415532998576 -1.1040994130497104 0.55359279955872642 6.7657292625944674 -0.80653201002246011 0.54482642039113793 6.6986089450748247 -0.90827685286556525 0.53606004122354955 6.6314886275551821 -1.0100216957086705 0.38352956927182952 6.7773560193301501 -0.81419913552452527 0.37476319010424108 6.7102357018105074 -0.91594397836763042 0.21346633898493278 6.7889827760658328 -0.82186626102659044 1.1824397149499064 6.3163688726208616 -1.3863535619151399 1.0258701696543955 6.326507834825879 -1.3942583223106202 0.86310318871889313 6.4054170035054696 -1.3001547147740999 0.86930062435888455 6.3366467970308964 -1.4021630827061005 0.70033620778339067 6.4843261721850602 -1.2060511072375795 0.7065336434233821 6.415555965710487 -1.3080594751695802 0.71273107906337352 6.3467857592359138 -1.4100678431015807 0.53756922684788833 6.5632353408646509 -1.111947499701059 0.54376666248787975 6.4944651343900777 -1.2139558676330597 0.54996409812787117 6.4256949279155045 -1.3159642355650605 0.37480224591238587 6.6421445095442415 -1.0178438921645385 0.38099968155237718 6.5733743030696683 -1.1198522600965393 0.38719711719236866 6.5046040965950951 -1.22186062802854 0.39339455283236002 6.4358338901205219 -1.3238689959605408 0.21203526497688355 6.721053678223833 -0.92374028462801827 0.21823270061687497 6.6522834717492589 -1.0257486525600188 0.22443013625686628 6.5835132652746857 -1.1277570204920193 0.23062757189685773 6.5147430588001125 -1.2297653884240203 0.23682500753684904 6.4459728523255393 -1.3317737563560208 0.049268284041381262 6.7999628469034237 -0.82963667709149791 0.055465719681372587 6.7311926404288505 -0.93164504502349843 0.061663155321364044 6.6624224339542772 -1.0336534129554988 0.067860590961355355 6.593652227479704 -1.1356617808874996 0.074058026601346832 6.5248820210051308 -1.2376701488195003 0.080255462241338144 6.4561118145305576 -1.3396785167515011 2.5293848109733763 6.3182930606155603 -0.81697002373917638 2.5057795764566952 6.2548374785296241 -0.91859316571247995 2.4821743419400137 6.1913818964436889 -1.0202163076857838 2.4585691074233322 6.1279263143577536 -1.1218394496590878 2.4349638729066503 6.0644707322718174 -1.2234625916323911 2.4113586383899692 6.0010151501858822 -1.3250857336056947 2.364792346934848 6.3629715588216618 -0.82452537195553033 2.3411871124181669 6.2995159767357256 -0.92614851392883391 2.3175818779014854 6.2360603946497903 -1.0277716559021377 2.2939766433848039 6.1726048125638551 -1.1293947978754417 2.2703714088681224 6.1091492304779189 -1.2310179398487451 2.2001998828963196 6.4076500570277632 -0.83208072017188428 2.1765946483796386 6.3441944749418271 -0.93370386214518786 2.1529894138629571 6.2807388928558918 -1.0353270041184917 2.1293841793462756 6.2172833107699557 -1.1369501460917955 2.0356074188577908 6.4523285552338647 -0.83963606838823834 2.0120021843411098 6.3888729731479286 -0.94125921036154192 1.9883969498244281 6.3254173910619933 -1.0428823523348456 1.8710149548192625 6.4970070534399653 -0.8471914166045923 1.8474097203025812 6.43355147135403 -0.94881455857789598 1.7064224907807339 6.5416855516460668 -0.85474676482094636 1.6828172562640527 6.4782299695601315 -0.95636990679424994 1.5418300267422054 6.5863640498521674 -0.86230211303730031 1.4008427972203588 6.6944981301442041 -0.76823431928035057 2.2516178369572555 6.0441933066759459 -1.3326822484236567 2.109100493431324 6.1528005637028755 -1.2386014715723044 2.0998475762246755 6.0849066308634789 -1.3403463936809676 1.9665831499053932 6.2614078207298052 -1.1445206947209523 1.9573302326987443 6.1935138878904086 -1.2462656168296153 1.9480773154920956 6.125619955051012 -1.3480105389382784 1.8240658063794619 6.3700150777567348 -1.0504399178695998 1.8148128891728135 6.3021211449173382 -1.152184839978263 1.8055599719661646 6.2342272120779416 -1.2539297620869261 1.7963070547595159 6.166333279238545 -1.3556746841955893 1.6722955456468822 6.4107284019442679 -1.0581040631269105 1.6630426284402335 6.3428344691048713 -1.1598489852355738 1.6537897112335849 6.2749405362654747 -1.261593907344237 1.6445367940269362 6.2070466034260781 -1.3633388294529001 1.5297782021209512 6.5193356589711975 -0.96402328627555822 1.5205252849143025 6.4514417261318009 -1.0657682083842213 1.5112723677076538 6.3835477932924043 -1.1675131304928847 1.5020194505010052 6.3156538604530077 -1.2692580526015478 1.4927665332943565 6.2477599276136111 -1.371002974710211 1.3872608585950199 6.6279429159981271 -0.86994250942420592 1.3780079413883715 6.5600489831587305 -0.97168743153286907 1.3687550241817228 6.4921550503193339 -1.0734323536415322 1.3595021069750741 6.4242611174799373 -1.1751772757501955 1.3502491897684255 6.3563671846405407 -1.2769221978588587 1.3409962725617768 6.2884732518011441 -1.3786671199675218 3.6985033614351837 5.7455734224325035 -0.77165210477013269 3.6622699658407538 5.6882813995476607 -0.87332324021977614 3.626036570246324 5.6309893766628187 -0.9749943756694196 3.5898031746518946 5.5736973537779759 -1.0766655111190633 3.5535697790574652 5.516405330893134 -1.1783366465687068 3.5173363834630353 5.4591133080082921 -1.2800077820183502 3.5527645915411035 5.8192911978393598 -0.77719755163706006 3.5165311959466736 5.761999174954517 -0.87886868708670352 3.4802978003522438 5.704707152069675 -0.98053982253634697 3.4440644047578144 5.6474151291848331 -1.0822109579859907 3.4078310091633846 5.5901231062999912 -1.1838820934356342 3.4070258216470233 5.8930089732462161 -0.78274299850398754 3.3707924260525934 5.8357169503613733 -0.88441413395363089 3.3345590304581636 5.7784249274765322 -0.98608526940327434 3.2983256348637342 5.7211329045916894 -1.087756404852918 3.2620922392693044 5.6638408817068475 -1.1894275403025616 3.2612870517529431 5.9667267486530733 -0.78828844537091491 3.2250536561585132 5.9094347257682305 -0.88995958082055837 3.1888202605640834 5.8521427028833886 -0.99163071627020183 3.152586864969654 5.7948506799985466 -1.0933018517198454 3.1155482818588629 6.0404445240599305 -0.79383389223784229 3.0793148862644331 5.9831525011750877 -0.89550502768748574 3.0430814906700032 5.9258604782902458 -0.9971761631371292 2.9698095119647827 6.1141622994667868 -0.79937933910476977 2.9335761163703529 6.056870276581944 -0.90105047455441323 2.8240707420707021 6.1878800748736431 -0.80492478597169714 3.4834346894899531 5.4005776100286225 -1.3816754089571592 3.3719262922673661 5.5326557738868321 -1.2855527343225239 3.347895971108243 5.46885491658829 -1.3872055078091807 3.236387573885656 5.6009330804464996 -1.2910828331745454 3.2123572527265329 5.5371322231479585 -1.3927356066612022 3.124879176663069 5.7330112443047083 -1.1949601585399101 3.100848855503946 5.6692103870061672 -1.2966129320265669 3.0768185343448229 5.6054095297076261 -1.3982657055132237 3.013370779440482 5.865089408162917 -1.0988374839052746 2.989340458281359 5.8012885508643759 -1.2004902573919316 2.9653101371222359 5.7374876935658348 -1.3021430308785884 2.9412798159631128 5.6736868362672936 -1.4037958043652452 2.9018623822178955 5.9971675720211257 -1.0027148092706391 2.877832061058772 5.9333667147225846 -1.1043675827572961 2.8538017398996489 5.8695658574240435 -1.2060203562439531 2.8297714187405263 5.8057650001255023 -1.3076731297306099 2.8057410975814032 5.7419641428269621 -1.4093259032172667 2.7903539849953085 6.1292457358793344 -0.90659213463600363 2.7663236638361854 6.0654448785807933 -1.0082449081226605 2.7422933426770624 6.0016440212822522 -1.1098976816093176 2.7182630215179393 5.937843163983711 -1.2115504550959746 2.6942327003588167 5.8740423066851708 -1.3132032285826314 2.6788455877727211 6.2613238997375422 -0.81046946000136832 2.6548152666135985 6.197523042439002 -0.91212223348802512 2.6307849454544754 6.1337221851404609 -1.013775006974682 2.6067546242953523 6.0699213278419206 -1.1154277804613391 2.5827243031362292 6.0061204705433795 -1.2170805539479959 2.5586939819771066 5.9423196132448384 -1.3187333274346529 4.7796916188296148 4.8276385497833711 -0.84171103028566208 4.7325902299572258 4.7787112646996022 -0.94352465509613315 4.6854888410848368 4.7297839796158332 -1.0453382799066044 4.6383874522124477 4.6808566945320633 -1.1471519047170755 4.5912860633400596 4.6319294094482943 -1.2489655295275464 4.5441846744676706 4.5830021243645245 -1.3507791543380174 4.6560711239330654 4.9262069495223155 -0.84506402059735553 4.6089697350606764 4.8772796644385465 -0.9468776454078266 4.5618683461882874 4.8283523793547776 -1.048691270218298 4.5147669573158984 4.7794250942710077 -1.1505048950287688 4.4676655684435103 4.7304978091872378 -1.2523185198392397 4.5324506290365161 5.0247753492612599 -0.84841701090904897 4.4853492401641271 4.9758480641774909 -0.95023063571952004 4.438247851291738 4.9269207790937211 -1.0520442605299913 4.391146462419349 4.8779934940099512 -1.1538578853404624 4.4088301341399667 5.1233437490002043 -0.85177000122074242 4.3617287452675777 5.0744164639164353 -0.95358362603121349 4.3146273563951887 5.0254891788326654 -1.0553972508416849 4.2675259675227997 4.9765618937488956 -1.1572108756521557 4.2852096392434174 5.2219121487391478 -0.85512299153243587 4.2381082503710283 5.1729848636553788 -0.95693661634290694 4.1910068614986393 5.1240575785716098 -1.0587502411533782 4.161589144346868 5.3204805484780913 -0.85847598184412932 4.114487755474479 5.2715532633943223 -0.9602896066546005 4.0379686494503186 5.4190489482170356 -0.86182897215582288 3.837829048529608 5.6651130327786934 -0.76672132796873893 4.4236454296407244 4.6790715794345328 -1.3540975351110145 4.3448822412702786 4.8283872520833633 -1.2556621068282361 4.3083293360581516 4.7709049726263002 -1.3573572478593383 4.2295661476877058 4.9202206452751307 -1.2589218195765599 4.1930132424755788 4.8627383658180676 -1.3606169606076621 4.1508029593172608 5.0695363179239621 -1.1604863912937813 4.114250054105133 5.0120540384668981 -1.2621815323248837 4.0776971488930061 4.954571759009835 -1.3638766733559859 4.072039770946815 5.2188519905727935 -1.0620509630110029 4.0354868657346881 5.1613697111157295 -1.1637461040421051 3.9989339605225607 5.1038874316586664 -1.2654412450732075 3.9623810553104337 5.0464051522016025 -1.3671363861043098 3.9932765825763701 5.368167663221624 -0.96361553472822403 3.9567236773642427 5.3106853837645609 -1.0653106757593267 3.9201707721521157 5.2532031043074969 -1.1670058167904289 3.8836178669399883 5.1957208248504338 -1.2687009578215314 3.8470649617278614 5.1382385453933708 -1.3703960988526336 3.9145133942059247 5.5174833358704545 -0.86518010644544541 3.8779604889937977 5.4600010564133914 -0.96687524747654774 3.8414075837816704 5.4025187769563283 -1.0685703885076505 3.8048546785695434 5.3450364974992643 -1.1702655295387527 3.768301773357416 5.2875542180422013 -1.271960670569855 3.7317488681452891 5.2300719385851391 -1.3736558116009574 3.7991973006233524 5.6093167290622219 -0.86843981919376922 3.7626443954112254 5.5518344496051588 -0.97013496022487156 3.726091490199098 5.4943521701480957 -1.0718301012559741 3.6895385849869706 5.4368698906910327 -1.1735252422870766 3.6529856797748437 5.3793876112339696 -1.2752203833181788 3.6164327745627167 5.3219053317769065 -1.376915524349281 5.5722253494855476 3.8866446525364262 -0.82813071599950794 5.5164844688049843 3.8476787366804506 -0.93010358495859724 5.4607435881244202 3.8087128208244754 -1.0320764539176868 5.4050027074438569 3.7697469049685006 -1.1340493228767763 5.3492618267632936 3.7307809891125254 -1.2360221918358654 5.2935209460827304 3.6918150732565507 -1.3379950607949547 5.4730343420741523 4.0057634784749032 -0.82979623040419181 5.417293461393589 3.9667975626189276 -0.93176909936328112 5.3615525807130249 3.9278316467629524 -1.0337419683223708 5.3058117000324625 3.8888657309069776 -1.1357148372814601 5.2500708193518983 3.8498998150510024 -1.2376877062405491 5.373843334662757 4.1248823044133802 -0.8314617448088758 5.3181024539821937 4.0859163885574041 -0.93343461376796499 5.2623615733016296 4.0469504727014289 -1.0354074827270545 5.2066206926210672 4.0079845568454546 -1.1373803516861438 5.2746523272513617 4.2440011303518572 -0.83312725921355968 5.2189114465707984 4.2050352144958811 -0.93510012817264887 5.1631705658902352 4.1660692986399059 -1.0370729971317385 5.1754613198399664 4.3631199562903342 -0.83479277361824367 5.1197204391594031 4.3241540404343581 -0.93676564257733286 5.0639795584788398 4.2851881245783829 -1.0387385115364223 5.076270312428572 4.4822387822288103 -0.83645828802292754 5.0205294317480087 4.4432728663728351 -0.93843115698201673 4.9770793050171775 4.6013576081672873 -0.83812380242761153 5.1995327223323589 3.8046882377932771 -1.3395709451424977 5.1540336822498265 3.9652325896484193 -1.2392988878890672 5.1066794555149668 3.9161989476959445 -1.3411272772154543 5.108534642167295 4.1257769415035614 -1.1390268306356364 5.0611804154324345 4.0767432995510866 -1.2408552199620237 5.0138261886975748 4.0277096575986118 -1.3426836092884109 5.015681375349903 4.2372876514062288 -1.1405831627085929 4.9683271486150424 4.1882540094537539 -1.2424115520349803 4.9209729218801828 4.1392203675012791 -1.3442399413613675 4.9701823352673706 4.3978320032613709 -1.0403111054551624 4.922828108532511 4.3487983613088961 -1.1421394947815495 4.8754738817976513 4.2997647193564212 -1.2439678841079369 4.8281196550627916 4.2507310774039464 -1.3457962734343241 4.9246832951848383 4.5583763551165131 -0.94003904820173145 4.8773290684499786 4.5093427131640382 -1.0418674375281189 4.8299748417151189 4.4603090712115634 -1.1436958268545061 4.7826206149802593 4.4112754292590886 -1.2455242161808935 4.7352663882453996 4.3622417873066146 -1.3473526055072806 4.8791842551023068 4.7189207069716552 -0.83976699094830076 4.8318300283674471 4.6698870650191804 -0.94159538027468814 4.7844758016325866 4.6208534230667055 -1.0434237696010755 4.7371215748977269 4.5718197811142316 -1.1452521589274629 4.6897673481628672 4.5227861391617568 -1.2470805482538501 4.6424131214280075 4.4737524972092828 -1.3489089375802372 6.2491067787242356 2.6845949032484193 -0.82259698046112339 6.1865485890944782 2.6575566978114993 -0.92473395032453121 6.1239903994647209 2.6305184923745792 -1.0268709201879394 6.0614322098349627 2.6034802869376592 -1.1290078900513472 5.9988740202052062 2.5764420815007387 -1.231144859914755 5.9363158305754489 2.5494038760638187 -1.3332818297781626 6.1760145095792227 2.8206184660988272 -0.82310913481247583 6.1134563199494654 2.7935802606619071 -0.92524610467588364 6.0508981303197089 2.7665420552249871 -1.0273830745392918 5.9883399406899507 2.739503849788067 -1.1295200444026996 5.9257817510601933 2.7124656443511466 -1.2316570142661074 6.1029222404342098 2.956642028949235 -0.82362128916382826 6.0403640508044525 2.929603823512315 -0.92575825902723607 5.977805861174696 2.9025656180753949 -1.0278952288906442 5.9152476715449387 2.8755274126384744 -1.130032198754052 6.029829971289197 3.0926655917996433 -0.8241334435151807 5.9672717816594396 3.0656273863627228 -0.92627041337858851 5.9047135920296832 3.0385891809258028 -1.0284073832419967 5.8421554023999258 3.0115509754888827 -1.1305443531054045 5.956737702144185 3.2286891546500511 -0.82464559786653313 5.8941795125144276 3.2016509492131306 -0.92678256772994094 5.8316213228846712 3.1746127437762106 -1.0289195375933491 5.8836454329991721 3.364712717500459 -0.82515775221788557 5.8210872433694156 3.3376745120635385 -0.92729472208129338 5.8105531638541601 3.5007362803508668 -0.825669906569238 5.7374608947091472 3.6367598432012742 -0.82618206092059043 5.8654603253373994 2.6813163586520052 -1.3337418008837352 5.8532236401461519 2.8475074462953591 -1.2321567068148684 5.7971956672000502 2.80846697059977 -1.3341413280548302 5.7849589820088028 2.9746580582431239 -1.2325562339859635 5.728931009062701 2.9356175825475348 -1.3345408552259252 5.7727222968175544 3.1408491458864782 -1.1309711399170967 5.7166943238714536 3.1018086701908887 -1.2329557611570585 5.6606663509253519 3.0627681944952996 -1.3349403823970203 5.760485611626307 3.3070402335298321 -1.02938604584823 5.7044576386802053 3.267999757834243 -1.1313706670881918 5.6484296657341044 3.2289592821386535 -1.2333552883281536 5.5924016927880027 3.1899188064430644 -1.3353399095681153 5.7482489264350578 3.473231321173186 -0.92780095177936284 5.6922209534889578 3.4341908454775969 -1.0297855730193251 5.6361929805428561 3.3951503697820078 -1.1317701942592868 5.5801650075967553 3.3561098940864182 -1.2337548154992486 5.5241370346506535 3.3170694183908291 -1.3357394367392104 5.6799842682977086 3.6003819331209508 -0.92820047895045776 5.6239562953516087 3.5613414574253617 -1.0301851001904201 5.5679283224055069 3.5223009817297726 -1.1321697214303819 5.5119003494594052 3.483260506034183 -1.2341543426703436 5.4558723765133044 3.4442200303385944 -1.3361389639103054 5.6677475831064612 3.7665730207643051 -0.82661538488159081 5.6117196101603604 3.7275325450687156 -0.9286000061215528 5.5556916372142586 3.688492069373126 -1.0305846273615149 5.4996636642681569 3.6494515936775374 -1.1325692486014767 5.443635691322056 3.6104111179819482 -1.2345538698414387 5.3876077183759543 3.5713706422863591 -1.3365384910814007 6.6621529447563939 1.3783061321671 -0.82462025955345075 6.5955591528637401 1.363505359966914 -0.92691604086392809 6.5289653609710863 1.3487045877667281 -1.0292118221744058 6.4623715690784325 1.3339038155665421 -1.131507603484883 6.3957777771857787 1.3191030433663562 -1.2338033847953604 6.3291839852931249 1.3043022711661703 -1.3360991661058379 6.6178715353140118 1.5248899411593855 -0.82435503073685323 6.5512777434213589 1.5100891689591998 -0.92665081204733057 6.4846839515287042 1.4952883967590138 -1.0289465933578081 6.4180901596360513 1.4804876245588279 -1.1312423746682856 6.3514963677433975 1.4656868523586419 -1.233538155978763 6.5735901258716298 1.6714737501516712 -0.82408980192025572 6.5069963339789769 1.6566729779514855 -0.92638558323073306 6.4404025420863231 1.6418722057512996 -1.0286813645412105 6.3738087501936693 1.6270714335511136 -1.130977145851688 6.3072149583010155 1.6122706613509277 -1.2332729271621654 6.5293087164292478 1.8180575591439569 -0.82382457310365809 6.4627149245365949 1.8032567869437712 -0.92612035441413543 6.3961211326439411 1.7884560147435853 -1.0284161357246129 6.3295273407512882 1.7736552425433993 -1.1307119170350906 6.4850273069868667 1.9646413681362427 -0.82355934428706057 6.4184335150942138 1.9498405959360567 -0.92585512559753791 6.35183972320156 1.9350398237358708 -1.0281509069080155 6.4407458975444847 2.1112251771285284 -0.82329411547046294 6.3741521056518318 2.0964244049283427 -0.92558989678094028 6.3964644881021036 2.2578089861208142 -0.82302888665386542 6.3298706962094506 2.243008213920628 -0.92532466796434276 6.3521830786597215 2.4043927951130999 -0.82276365783726779 6.2855515371361523 1.448806176524448 -1.3358079913004175 6.2440457751761196 1.5864941092679281 -1.3354317898878083 6.2653120260453754 1.751231514312805 -1.2329126049341581 6.2025400132160868 1.7241820420114082 -1.3350555884751991 6.2865782769146312 1.9159689193576817 -1.1303934199805079 6.2238062640853418 1.8889194470562849 -1.2325364035215489 6.1610342512560532 1.8618699747548884 -1.3346793870625902 6.307844527783887 2.0807063244025583 -1.0278742350268577 6.2450725149545985 2.0536568521011618 -1.1300172185678987 6.182300502125309 2.0266073797997652 -1.23216020210894 6.1195284892960204 1.9995579074983687 -1.334303185649981 6.2663387658238543 2.2183942571460387 -1.0274980336142485 6.2035667529945657 2.1913447848446417 -1.1296410171552898 6.1407947401652763 2.1642953125432451 -1.2317840006963308 6.0780227273359868 2.1372458402418486 -1.333926984237372 6.2876050166931101 2.3831316621909155 -0.9249788486605981 6.2248330038638207 2.3560821898895186 -1.0271218322016396 6.1620609910345321 2.329032717588122 -1.1292648157426806 6.0992889782052426 2.301983245286725 -1.2314077992837218 6.0365169653759541 2.2749337729853285 -1.3335507828247628 6.3088712675623659 2.547869067235792 -0.8224596637069479 6.2460992547330774 2.5208195949343959 -0.92460264724798902 6.1833272419037879 2.4937701226329989 -1.0267456307890304 6.1205552290744993 2.4667206503316024 -1.1288886143300716 6.057783216245209 2.4396711780302054 -1.2310315978711126 5.9950112034159204 2.4126217057288089 -1.3331745814121538 6.8027195488712469 0.0075098838704827919 -0.83166628622593908 6.7343449888893545 0.006658738476228665 -0.9341215079304398 6.6659704289074622 0.0058075930819746491 -1.0365767296349409 6.5975958689255698 0.0049564476877205221 -1.1390319513394416 6.5292213089436784 0.0041053022934665062 -1.2414871730439423 6.4608467489617869 0.0032541568992124348 -1.343942394748443 6.788133336698694 0.16098600822348375 -0.83087328467407362 6.7197587767168026 0.16013486282922973 -0.93332850637857434 6.6513842167349102 0.15928371743497571 -1.0357837280830753 6.5830096567530179 0.15843257204072159 -1.1382389497875762 6.5146350967711264 0.15758142664646749 -1.2406941714920769 6.7735471245261412 0.31446213257648481 -0.83008028312220816 6.7051725645442497 0.31361098718223079 -0.93253550482670888 6.6367980045623574 0.31275984178797678 -1.0349907265312099 6.5684234445804659 0.3119086963937226 -1.1374459482357107 6.5000488845985744 0.31105755099946841 -1.2399011699402114 6.7589609123535883 0.46793825692948576 -0.8292872815703427 6.6905863523716977 0.46708711153523175 -0.93174250327484343 6.6222117923898054 0.46623596614097779 -1.0341977249793444 6.5538372324079139 0.4653848207467236 -1.1366529466838453 6.7443747001810364 0.62141438128248716 -0.82849428001847725 6.6760001401991449 0.62056323588823314 -0.93094950172297797 6.6076255802172525 0.61971209049397924 -1.033404723427479 6.7297884880084835 0.77489050563548822 -0.82770127846661179 6.6614139280265929 0.7740393602412341 -0.93015650017111251 6.5930393680447006 0.77318821484698019 -1.0326117218756135 6.7152022758359315 0.92836662998848918 -0.82690827691474633 6.6468277158540401 0.92751548459423516 -0.92936349861924705 6.7006160636633787 1.0818427543414901 -0.82611527536288099 6.4463335527302501 0.15604040573534306 -1.3431418067025926 6.4328119683016798 0.29945762233565132 -1.3422381883201595 6.4861918777639032 0.45764393453181307 -1.2390324025784041 6.4192903838731095 0.44287483893595958 -1.3413345699377264 6.5395717872261256 0.61583024672797471 -1.1358266168366487 6.4726702933353328 0.60106115113212144 -1.2381287841959709 6.40576879944454 0.58629205553626795 -1.3404309515552932 6.5260502027975553 0.75924746332828308 -1.1349229984542155 6.4591487089067625 0.7444783677324297 -1.2372251658135378 6.3922472150159697 0.72970927213657621 -1.3395273331728601 6.5794301122597778 0.91743377552444472 -1.0317172127124603 6.512528618368985 0.90266467992859134 -1.1340193800717824 6.4456271244781922 0.88789558433273807 -1.2363215474311047 6.3787256305874003 0.87312648873688459 -1.338623714790427 6.6328100217220003 1.0756200877206066 -0.92851142697070466 6.5659085278312075 1.0608509921247531 -1.0308135943300272 6.4990070339404147 1.0460818965288996 -1.1331157616893495 6.4321055400496228 1.0313128009330463 -1.2354179290486715 6.36520404615883 1.0165437053371928 -1.3377200964079938 6.6861899311842228 1.2338063999167681 -0.82530564122894945 6.61928843729343 1.2190373043209148 -0.92760780858827163 6.5523869434026372 1.2042682087250614 -1.029909975947594 6.4854854495118452 1.1894991131292079 -1.1322121433069163 6.4185839556210524 1.1747300175333546 -1.2345143106662386 6.3516824617302605 1.1599609219375011 -1.3368164780255609 6.6790616969527843 -1.200504493667548 -0.84088259194501125 6.6116223162529328 -1.1889478993903646 -0.94351623210715441 6.5441829355530814 -1.177391305113181 -1.0461498722692979 6.4767435548532299 -1.1658347108359977 -1.1487835124314412 6.4093041741533785 -1.1542781165588143 -1.2514171525935844 6.3418647934535279 -1.1427215222816307 -1.3540507927557277 6.6947936709075107 -1.048508140354903 -0.83974271741360662 6.6273542902076592 -1.0369515460777197 -0.94237635757574978 6.5599149095078078 -1.0253949518005361 -1.0450099977378933 6.4924755288079563 -1.0138383575233527 -1.1476436379000365 6.4250361481081049 -1.0022817632461694 -1.2502772780621798 6.710525644862237 -0.89651178704225809 -0.83860284288220199 6.6430862641623856 -0.88495519276507462 -0.94123648304434515 6.5756468834625341 -0.87339859848789114 -1.0438701232064886 6.5082075027626836 -0.86184200421070767 -1.1465037633686319 6.7262576188169634 -0.74451543372961315 -0.83746296835079737 6.6588182381171119 -0.73295883945242957 -0.94009660851294052 6.5913788574172605 -0.7214022451752462 -1.042730248675084 6.7419895927716897 -0.5925190804169681 -0.83632309381939274 6.6745502120718383 -0.58096248613978463 -0.9389567339815359 6.6071108313719868 -0.56940589186260127 -1.0415903741436794 6.7577215667264161 -0.44052272710432305 -0.83518321928798811 6.6902821860265655 -0.42896613282713958 -0.93781685945013127 6.7734535406811425 -0.28852637379167811 -0.83404334475658348 6.7891855146358697 -0.13653002047903315 -0.83290347022517885 6.3568497721249182 -0.99912020825975689 -1.3527914233570535 6.44033427690011 -0.85516113976529973 -1.249068002463203 6.371795936743335 -0.85595510248044926 -1.3515258449765937 6.5238187816753035 -0.71120207127084234 -1.1453445815693524 6.4552804415185268 -0.71199603398599209 -1.2478024240827432 6.3867421013617518 -0.71278999670114151 -1.3502602665961339 6.5387649462937203 -0.56803696549153471 -1.1440790031888926 6.4702266061369436 -0.56883092820668446 -1.2465368457022832 6.4016882659801686 -0.56962489092183399 -1.3489946882156738 6.6222494510689121 -0.42407789699707743 -1.0403555822950419 6.5537111109121371 -0.42487185971222696 -1.1428134248084327 6.4851727707553604 -0.42566582242737672 -1.2452712673218234 6.4166344305985854 -0.4264597851425263 -1.347729109835214 6.7057339558441047 -0.28011882850262021 -0.9366321614011911 6.6371956156873289 -0.28091279121776985 -1.0390900039145821 6.568657275530553 -0.28170675393291938 -1.1415478464279729 6.5001189353737772 -0.28250071664806908 -1.2440056889413633 6.4315805952170022 -0.28329467936321873 -1.3464635314547539 6.7206801204625215 -0.13695372272331258 -0.93536658302073128 6.6521417803057448 -0.13774768543846225 -1.0378244255341222 6.5836034401489698 -0.13854164815361183 -1.1402822680475129 6.515065099992194 -0.13933561086876153 -1.2427401105609035 6.446526759835419 -0.14012957358391115 -1.3451979530742941 6.2943382325422998 -2.5249068091465277 -0.85339807012634716 6.2305967276324816 -2.4995134669166834 -0.9562132686935092 6.1668552227226625 -2.4741201246868383 -1.0590284672606716 6.1031137178128434 -2.4487267824569936 -1.1618436658278335 6.0393722129030243 -2.4233334402271489 -1.2646588643949954 5.9756307079932052 -2.3979400979973042 -1.3674740629621573 6.3401829989704535 -2.3769831036592484 -0.85199840785063863 6.2764414940606343 -2.3515897614294041 -0.95481360641780066 6.2126999891508152 -2.326196419199559 -1.0576288049849629 6.1489584842409961 -2.3008030769697143 -1.1604440035521248 6.0852169793311779 -2.2754097347398696 -1.2632592021192868 6.3860277653986062 -2.2290593981719695 -0.85059874557493009 6.3222862604887879 -2.2036660559421248 -0.95341394414209213 6.2585447555789688 -2.1782727137122797 -1.0562291427092545 6.1948032506691497 -2.152879371482435 -1.1590443412764164 6.4318725318267589 -2.0811356926846907 -0.84919908329922156 6.3681310269169407 -2.0557423504548455 -0.95201428186638359 6.3043895220071215 -2.0303490082250009 -1.0548294804335459 6.4777172982549125 -1.9332119871974112 -0.84779942102351302 6.4139757933450943 -1.907818644967566 -0.95061461959067506 6.3502342884352752 -1.8824253027377214 -1.0534298181578374 6.5235620646830661 -1.7852882817101321 -0.84639975874780449 6.459820559773247 -1.759894939480287 -0.94921495731496652 6.5694068311112188 -1.637364576222853 -0.84500009647209606 6.6152515975393724 -1.4894408707355737 -0.84360043419638753 6.0190610153700277 -2.2582189795226113 -1.365968241002175 6.1297819914987279 -2.1318337093971498 -1.2618032712114065 6.0620165554058349 -2.1201107773751859 -1.3644415443245212 6.2405029676274282 -2.0054484392716878 -1.1576383014206377 6.1727375315345352 -1.993725507249724 -1.2602765745337527 6.1049720954416422 -1.9820025752277601 -1.3629148476468675 6.2834585076632354 -1.867340237124262 -1.156111604742984 6.2156930715703425 -1.8556173051022982 -1.258749877856099 6.1479276354774486 -1.8438943730803343 -1.3613881509692141 6.3941794837919357 -1.7409549669988003 -1.0519466349522153 6.3264140476990427 -1.7292320349768364 -1.1545849080653303 6.2586486116061488 -1.7175091029548724 -1.2572231811784453 6.1908831755132558 -1.7057861709329087 -1.3598614542915604 6.5049004599206359 -1.6145696968733383 -0.94778166516144635 6.4371350238277429 -1.6028467648513747 -1.0504199382745616 6.36936958773485 -1.5911238328294108 -1.1530582113876766 6.3016041516419561 -1.5794009008074468 -1.2556964845007916 6.2338387155490622 -1.5676779687854832 -1.3583347576139069 6.5478559999564432 -1.4764614947259127 -0.94625496848379265 6.4800905638635502 -1.4647385627039489 -1.0488932415969079 6.4123251277706563 -1.453015630681985 -1.1515315147100231 6.3445596916777625 -1.4412926986600212 -1.2541697878231381 6.2767942555848695 -1.4295697666380573 -1.3568080609362532 6.6585769760851434 -1.350076224600451 -0.84208999869302403 6.5908115399922504 -1.3383532925784871 -0.94472827180613905 6.5230461038993566 -1.3266303605565231 -1.0473665449192544 6.4552806678064627 -1.3149074285345592 -1.1500048180323694 6.3875152317135697 -1.3031844965125956 -1.2526430911454844 6.3197497956206758 -1.2914615644906318 -1.3552813642585997 5.6536756047967938 -3.7352516583689019 -0.8674826805141802 5.59527369148545 -3.699163263543805 -0.97052304339056583 5.5368717781741053 -3.6630748687187071 -1.0735634062669517 5.4784698648627606 -3.6269864738936093 -1.1766037691433375 5.4200679515514159 -3.5908980790685114 -1.2796441320197234 5.3616660382400712 -3.554809684243414 -1.3826844948961092 5.7268874115271409 -3.6004709833946746 -0.86593089249201083 5.6684854982157971 -3.5643825885695781 -0.96897125536839646 5.6100835849044524 -3.5282941937444798 -1.0720116182447823 5.5516816715931077 -3.4922057989193824 -1.1750519811211682 5.493279758281763 -3.4561174040942846 -1.278092343997554 5.800099218257488 -3.4656903084204478 -0.86437910446984145 5.7416973049461442 -3.4296019135953508 -0.96741946734622708 5.6832953916347995 -3.393513518770253 -1.0704598302226132 5.6248934783234548 -3.3574251239451551 -1.1735001930989988 5.8733110249878351 -3.3309096334462209 -0.86282731644767208 5.8149091116764913 -3.2948212386211235 -0.96586767932405782 5.7565071983651466 -3.2587328437960257 -1.0689080422004438 5.6981052850538019 -3.2226444489709283 -1.1719484050768296 5.9465228317181822 -3.1961289584719936 -0.8612755284255027 5.8881209184068384 -3.1600405636468967 -0.96431589130188844 5.8297190050954937 -3.1239521688217988 -1.0673562541782746 6.0197346384485293 -3.0613482834977663 -0.85972374040333344 5.9613327251371855 -3.0252598886726694 -0.96276410327971917 6.0929464451788764 -2.926567608523539 -0.85817195238116406 6.1661582519092235 -2.7917869335493122 -0.8566201643589948 5.4320629408419219 -3.425457070034482 -1.3810180440531914 5.5652493146404209 -3.323732196317315 -1.276489953921037 5.5013659675681312 -3.2982138082054626 -1.3793070350698453 5.6345523413666303 -3.1964889344882956 -1.2747789449376909 5.5706689942943406 -3.1709705463764433 -1.3775960260864992 5.7677387151651294 -3.0947640607711286 -1.1702508548055368 5.7038553680928397 -3.0692456726592763 -1.2730679359543449 5.6399720210205508 -3.0437272845474239 -1.3758850171031531 5.9009250889636293 -2.9930391870539621 -1.0657227646733824 5.8370417418913387 -2.9675207989421093 -1.1685398458221907 5.773158394819049 -2.9420024108302569 -1.2713569269709988 5.7092750477467602 -2.9164840227184046 -1.3741740081198071 6.0341114627621284 -2.8913143133367951 -0.96119467454122787 5.9702281156898387 -2.8657959252249428 -1.0640117556900364 5.906344768617549 -2.8402775371130899 -1.1668288368388446 5.8424614215452593 -2.8147591490012376 -1.2696459179876527 5.7785780744729704 -2.7892407608893852 -1.372462999136461 6.1034144894883378 -2.7640710515077758 -0.95948366555788178 6.039531142416048 -2.7385526633959234 -1.0623007467066903 5.9756477953437583 -2.7130342752840706 -1.1651178278554986 5.9117644482714695 -2.6875158871722182 -1.2679349090043066 5.8478811011991798 -2.6619974990603663 -1.3707519901531149 6.2366008632868368 -2.6623461777906083 -0.85495557542572742 6.1727175162145471 -2.6368277896787564 -0.9577726565745357 6.1088341691422574 -2.6113094015669041 -1.0605897377233442 6.0449508220699686 -2.5857910134550512 -1.1634068188721525 5.9810674749976789 -2.5602726253431993 -1.2662239000209605 5.9171841279253901 -2.534754237231347 -1.3690409811697688 4.9210989235122362 -4.7326479652300746 -0.77794540073258822 4.8710520240694049 -4.6853848513745753 -0.88121485617293516 4.8210051246265744 -4.6381217375190769 -0.9844843116132822 4.7709582251837439 -4.5908586236635784 -1.0877537670536295 4.7209113257409125 -4.5435955098080791 -1.1910232224939763 4.6708644262980821 -4.4963323959525807 -1.2942926779343231 5.0207823302377808 -4.6129573012604741 -0.77625302820270914 4.9707354307949494 -4.5656941874049739 -0.87952248364305607 4.9206885313521189 -4.5184310735494755 -0.98279193908340312 4.8706416319092884 -4.4711679596939771 -1.0860613945237503 4.8205947324664571 -4.4239048458384786 -1.1893308499640973 5.1204657369633253 -4.4932666372908727 -0.77456065567283006 5.0704188375204939 -4.4460035234353734 -0.87783011111317699 5.0203719380776635 -4.398740409579875 -0.98109956655352404 4.970325038634833 -4.3514772957243757 -1.0843690219938713 4.9202781391920025 -4.3042141818688773 -1.1876384774342184 5.2201491436888698 -4.3735759733212722 -0.77286828314295097 5.1701022442460385 -4.3263128594657729 -0.87613773858329791 5.120055344803208 -4.2790497456102745 -0.97940719402364496 5.0700084453603775 -4.2317866317547752 -1.0826766494639921 5.3198325504144144 -4.2538853093516709 -0.77117591061307189 5.2697856509715839 -4.2066221954961716 -0.87444536605341883 5.2197387515287534 -4.1593590816406731 -0.97771482149376587 5.4195159571399589 -4.1341946453820704 -0.76948353808319281 5.3694690576971285 -4.0869315315265711 -0.87275299352353986 5.5191993638655035 -4.014503981412469 -0.76779116555331384 5.4691524644226739 -3.9672408675569701 -0.87106062099366077 5.618882770591048 -3.8948133174428685 -0.76609879302343475 4.617226918957682 -4.4535417136398729 -1.3974693413468238 4.7693885834471974 -4.3780856836812703 -1.2925703469344454 4.7106635867117701 -4.341631936142015 -1.3956155344322598 4.8628252512012855 -4.2661759061834124 -1.2907165400198815 4.8041002544658582 -4.2297221586441571 -1.3937617275176961 5.0149869156908 -4.1907198762248097 -1.1858175456075029 4.9562619189553736 -4.1542661286855544 -1.2888627331053177 4.8975369222199463 -4.1178123811462992 -1.3919079206031322 5.1671485801803145 -4.1152638462662079 -1.0809185511951243 5.1084235834448881 -4.0788100987269518 -1.1839637386929391 5.0496985867094617 -4.0423563511876965 -1.287008926190754 4.9909735899740344 -4.0059026036484413 -1.3900541136885685 5.319310244669829 -4.0398078163076052 -0.97601955678274555 5.2605852479344026 -4.00335406876835 -1.0790647442805605 5.2018602511989762 -3.9669003212290939 -1.1821099317783754 5.1431352544635498 -3.9304465736898386 -1.2851551192761901 5.0844102577281225 -3.8939928261505834 -1.3882003067740045 5.4127469124239171 -3.9278980388097477 -0.97416574986818172 5.3540219156884907 -3.8914442912704921 -1.0772109373659968 5.2952969189530643 -3.854990543731236 -1.1802561248638115 5.236571922217637 -3.8185367961919807 -1.2833013123616261 5.1778469254822106 -3.782083048652725 -1.3863464998594408 5.5649085769134317 -3.8524420088511455 -0.86926675545580334 5.5061835801780052 -3.8159882613118903 -0.972311942953618 5.4474585834425788 -3.7795345137726342 -1.0753571304514329 5.3887335867071515 -3.7430807662333785 -1.1784023179492478 5.3300085899717251 -3.7066270186941228 -1.2814475054470624 5.2712835932362978 -3.6701732711548671 -1.3844926929448769 3.8531087120880914 -5.6292211687557652 -0.79386798074986376 3.8116586771730656 -5.574166816074781 -0.89741269355035358 3.7702086422580403 -5.5191124633937969 -1.0009574063508435 3.7287586073430141 -5.4640581107128128 -1.1045021191513336 3.6873085724279888 -5.4090037580318295 -1.2080468319518236 3.6458585375129631 -5.3539494053508454 -1.3115915447523134 3.9739252993335148 -5.5315944762598219 -0.79209527915233702 3.932475264418489 -5.4765401235788378 -0.89563999195282684 3.8910252295034637 -5.4214857708978537 -0.99918470475331678 3.8495751945884376 -5.3664314182168695 -1.1027294175538069 3.8081251596734123 -5.3113770655358863 -1.206274130354297 3.7666751247583865 -5.256322712854903 -1.3098188431547868 4.0947418865789382 -5.4339677837638787 -0.79032257755481028 4.0532918516639125 -5.3789134310828945 -0.8938672903553001 4.0118418167488876 -5.3238590784019104 -0.99741200315579004 3.9703917818338614 -5.2688047257209263 -1.1009567159562803 3.9289417469188357 -5.213750373039943 -1.2045014287567701 4.2155584738243617 -5.3363410912679354 -0.78854987595728354 4.1741084389093359 -5.2812867385869513 -0.89209458875777337 4.1326584039943111 -5.2262323859059672 -0.9956393015582633 4.0912083690792853 -5.1711780332249839 -1.0991840143587535 4.3363750610697851 -5.2387143987719922 -0.7867771743597568 4.2949250261547594 -5.1836600460910089 -0.89032188716024674 4.2534749912397345 -5.1286056934100248 -0.99386659996073667 4.4571916483152085 -5.1410877062760498 -0.78500447276223018 4.4157416134001828 -5.0860333535950657 -0.88854918556272011 4.3742915784851579 -5.0309790009140816 -0.99209389836320994 4.5780082355606329 -5.0434610137801066 -0.78323177116470344 4.5365582006456062 -4.9884066610991233 -0.88677648396519337 4.6988248228060563 -4.9458343212841633 -0.78145906956717681 3.7165799213773409 -5.2085933214543072 -1.4130961195521332 3.8812920418687851 -5.1639489363511384 -1.3078543561122336 3.8310574103354371 -5.1163376809731114 -1.4111273193300629 4.0460041623602283 -5.1193045512479705 -1.2026125926723334 3.9957695308268812 -5.0716932958699434 -1.3058855558901632 3.9455348992935333 -5.0240820404919155 -1.4091585191079925 4.2107162828516724 -5.0746601661448025 -1.0973708292324333 4.1604816513183245 -5.0270489107667746 -1.2006437924502631 4.1102470197849774 -4.9794376553887485 -1.3039167556680928 4.0600123882516295 -4.9318264000107206 -1.4071897188859221 4.3251937718097686 -4.9824045256636076 -1.095402029010363 4.2749591402764207 -4.9347932702855797 -1.1986749922281927 4.2247245087430736 -4.8871820149075527 -1.3019479554460225 4.1744898772097256 -4.8395707595295256 -1.4052209186638518 4.4899058923012118 -4.9377601405604397 -0.99016026557046288 4.4396712607678648 -4.8901488851824118 -1.0934332287882926 4.3894366292345168 -4.8425376298043847 -1.1967061920061224 4.3392019977011698 -4.7949263744263568 -1.2999791552239521 4.2889673661678218 -4.7473151190483298 -1.4032521184417814 4.6546180127926551 -4.8931157554572717 -0.88491850213056289 4.604383381259308 -4.8455045000792438 -0.98819146534839264 4.554148749725961 -4.7978932447012168 -1.0914644285662225 4.503914118192613 -4.7502819893231889 -1.194737391784052 4.4536794866592651 -4.7026707339451619 -1.2980103550018818 4.4034448551259171 -4.6550594785671349 -1.4012833182197111 4.8193301332840992 -4.8484713703541038 -0.77967673869066301 4.7690955017507513 -4.8008601149760759 -0.88294970190849265 4.7188608702174042 -4.7532488595980489 -0.98622266512632228 4.6686262386840562 -4.705637604220021 -1.0894956283441521 4.6183916071507083 -4.658026348841994 -1.1927685915619817 4.5681569756173612 -4.6104150934639661 -1.2960415547798112 4.5179223440840133 -4.562803838085939 -1.3993145179976407 2.624780103476775 -6.2901744015827106 -0.81053325591793557 2.5925636550662001 -6.2291022642038545 -0.9143702133934366 2.5603472066556252 -6.1680301268249984 -1.0182071708689375 2.7624916946241136 -6.2179583355254033 -0.80868666629384645 2.7302752462135387 -6.1568861981465473 -0.91252362376934748 2.6980587978029638 -6.0958140607676912 -1.0163605812448484 2.6658423493923888 -6.0347419233888342 -1.1201975387203496 2.6336259009818139 -5.9736697860099781 -1.2240344961958507 2.601409452571239 -5.9125976486311211 -1.3278714536713516 2.9002032857714517 -6.1457422694680961 -0.80684007666975732 2.8679868373608768 -6.08467013208924 -0.91067703414525836 2.8357703889503019 -6.0235979947103839 -1.0145139916207593 2.8035539405397274 -5.962525857331527 -1.1183509490962604 2.7713374921291525 -5.9014537199526709 -1.2221879065717616 3.0379148769187898 -6.0735262034107889 -0.80499348704566831 3.0056984285082153 -6.0124540660319328 -0.90883044452116923 2.9734819800976404 -5.9513819286530767 -1.0126674019966702 2.9412655316870655 -5.8903097912742197 -1.1165043594721713 3.1756264680661284 -6.0013101373534816 -0.80314689742157919 3.1434100196555534 -5.9402379999746255 -0.90698385489708011 3.1111935712449785 -5.8791658625957695 -1.010820812372581 3.3133380592134669 -5.9290940712961744 -0.80130030779749006 3.281121610802892 -5.8680219339173183 -0.9051372652729911 3.2489051623923175 -5.8069497965384622 -1.0089742227484919 3.451049650360805 -5.8568780052388671 -0.79945371817340105 3.4188332019502301 -5.7958058678600111 -0.90329067564890198 3.5887612415081431 -5.7846619391815599 -0.79760712854931193 3.7264728326554817 -5.7124458731242527 -0.79576053892522292 2.7339068945985372 -5.8432868225190226 -1.3258680729305787 2.906411125904782 -5.8307074812734463 -1.2202619927333946 2.8647107293393916 -5.7749196471209316 -1.3238137648819075 3.0789153572110273 -5.8181281400278708 -1.1146559125362103 3.0372149606456365 -5.7623403058753553 -1.2182076846847234 2.9955145640802465 -5.7065524717228406 -1.3217594568332363 3.2097191919518817 -5.7497609646297798 -1.1126016044875391 3.1680187953864909 -5.6939731304772643 -1.2161533766360522 3.126318398821101 -5.6381852963247496 -1.319705148784565 3.382223423258127 -5.7371816233842043 -1.0069955242903548 3.3405230266927362 -5.6813937892316888 -1.1105472964388678 3.2988226301273458 -5.6256059550791733 -1.2140990685873809 3.2571222335619554 -5.5698181209266586 -1.3176508407358938 3.5547276545643718 -5.7246022821386289 -0.90138944409317079 3.5130272579989814 -5.6688144479861133 -1.0049412162416835 3.4713268614335906 -5.6130266138335978 -1.1084929883901966 3.4296264648682007 -5.5572387796810832 -1.2120447605387097 3.3879260683028103 -5.5014509455285685 -1.3155965326872225 3.6855314893052262 -5.6562351067405379 -0.89933513604449955 3.6438310927398363 -5.6004472725880223 -1.0028869081930123 3.6021306961744455 -5.5446594384355068 -1.1064386803415254 3.5604302996090551 -5.4888716042829921 -1.2099904524900384 3.5187299030436647 -5.4330837701304784 -1.3135422246385513 1.4087591477225649 -6.6516851619750108 -0.82639028737046916 1.3865465591810535 -6.5860733464812444 -0.93050849671881319 1.3643339706395419 -6.520461530987478 -1.0346267060671572 1.3421213820980302 -6.4548497154937117 -1.1387449154155014 1.3199087935565186 -6.3892378999999453 -1.2428631247638455 1.2976962050150069 -6.3236260845061789 -1.3469813341121895 1.561559928184026 -6.6067016287308116 -0.82442149898959405 1.5393473396425144 -6.5410898132370452 -0.92853970833793809 1.5171347511010027 -6.4754779977432788 -1.0326579176862822 1.4949221625594911 -6.4098661822495124 -1.1367761270346264 1.4727095740179794 -6.3442543667557461 -1.2408943363829703 1.7143607086454868 -6.5617180954866123 -0.82245271060871894 1.6921481201039752 -6.496106279992846 -0.92657091995706298 1.6699355315624635 -6.4304944644990796 -1.0306891293054072 1.6477229430209519 -6.3648826490053132 -1.1348073386537514 1.8671614891069477 -6.5167345622424131 -0.82048392222784383 1.844948900565436 -6.4511227467486467 -0.92460213157618798 1.8227363120239244 -6.3855109312548803 -1.028720340924532 1.8005237234824127 -6.319899115761114 -1.1328385502728762 2.0199622695684085 -6.4717510289982139 -0.81851513384696883 1.9977496810268971 -6.4061392135044475 -0.92263334319531287 1.9755370924853852 -6.3405273980106811 -1.026751552543657 2.1727630500298694 -6.4267674957540146 -0.81654634546609373 2.1505504614883582 -6.3611556802602482 -0.92066455481443787 2.3255638304913302 -6.3817839625098154 -0.81457755708521873 2.478364610952791 -6.336800429265617 -0.81260876870434362 1.4477248116319541 -6.279533549810135 -1.3449404921109653 1.6252873664745042 -6.2993425036158754 -1.2389197521559647 1.5927682589155769 -6.237043284660464 -1.3427700771471027 1.7703308137581271 -6.2568522384662044 -1.2367493371921021 1.7378117061991998 -6.194553019510793 -1.3405996621832401 1.947893368600677 -6.2766611922719457 -1.1307285972371015 1.9153742610417499 -6.2143619733165334 -1.2345789222282395 1.8828551534828226 -6.1520627543611219 -1.3384292472193775 2.1254559234432269 -6.2964701460776862 -1.0247078572821007 2.0929368158842996 -6.2341709271222747 -1.1285581822732389 2.0604177083253727 -6.1718717081668624 -1.2324085072643769 2.0278986007664455 -6.1095724892114509 -1.3362588322555149 2.3030184782857765 -6.3162790998834275 -0.91868711732709984 2.2704993707268497 -6.2539798809280152 -1.0225374423182381 2.2379802631679224 -6.1916806619726037 -1.1263877673093763 2.2054611556089956 -6.1293814430171913 -1.2302380923005143 2.1729420480500683 -6.0670822240617799 -1.3340884172916523 2.4480619255693994 -6.2737888347337565 -0.91651670236323723 2.4155428180104725 -6.2114896157783441 -1.0203670273543752 2.3830237104515453 -6.1491903968229327 -1.1242173523455137 2.3505046028926184 -6.0868911778675203 -1.2280676773366517 2.3179854953336911 -6.0245919589121089 -1.3319180023277897 2.5280671577351681 -6.1067001316732608 -1.1220469373816511 2.4955480501762413 -6.0444009127178493 -1.2258972623727891 2.463028942617314 -5.9821016937624378 -1.3297475873639271 0.071483937954758714 -6.7881830927218383 -0.84399167545096121 0.0440313380970212 -6.7210213172852695 -0.94855296573692582 0.016578738239283686 -6.6538595418487008 -1.0531142560228903 0.21941799074400958 -6.7748980991272152 -0.842068179553359 0.19196539088627218 -6.7077363236906464 -0.94662946983932361 0.16451279102853467 -6.6405745482540777 -1.0511907601252881 0.13706019117079721 -6.5734127728175089 -1.1557520504112531 0.10960759131305969 -6.5062509973809401 -1.2603133406972176 0.082154991455322207 -6.4390892219443714 -1.3648746309831823 0.36735204353326034 -6.7616131055325921 -0.84014468365575679 0.33989944367552294 -6.6944513300960233 -0.9447059739417214 0.31244684381778542 -6.6272895546594546 -1.0492672642276859 0.28499424396004797 -6.5601277792228858 -1.1538285545136509 0.25754164410231045 -6.4929660037863171 -1.2583898447996154 0.5152860963225111 -6.748328111937969 -0.83822118775815457 0.4878334964647737 -6.6811663365014002 -0.94278247804411919 0.46038089660703618 -6.6140045610648315 -1.0473437683300837 0.43292829674929878 -6.5468427856282627 -1.1519050586160486 0.66322014911176197 -6.7350431183433459 -0.83629769186055236 0.63576754925402446 -6.6678813429067771 -0.94085898214651698 0.60831494939628694 -6.6007195674702093 -1.0454202724324815 0.81115420190101317 -6.7217581247487237 -0.83437419596295015 0.78370160204327566 -6.6545963493121549 -0.93893548624891476 0.75624900218553803 -6.5874345738755862 -1.0434967765348793 0.95908825469026393 -6.7084731311541006 -0.83245070006534794 0.93163565483252642 -6.6413113557175318 -0.93701199035131255 1.1070223074795147 -6.6951881375594784 -0.83052720416774573 0.23359406881847522 -6.4256482374419104 -1.3626679415344713 0.40774641433954328 -6.4795799520482529 -1.2562828829878376 0.38557998070223198 -6.4121829161020019 -1.3604170697964517 0.58189875986061157 -6.5335116666545963 -1.1498978244412041 0.55973232622330005 -6.4661146307083444 -1.254032011249818 0.53756589258598875 -6.3987175947620933 -1.3581661980584321 0.73388467174436833 -6.5200463453146877 -1.1476469527031845 0.71171823810705681 -6.4526493093684358 -1.2517811395117984 0.68955180446974551 -6.3852522734221848 -1.3559153263204125 0.90803701726543662 -6.5739780599210302 -1.0412618941565506 0.8858705836281251 -6.5065810239747792 -1.1453960809651649 0.86370414999081357 -6.4391839880285273 -1.2495302677737787 0.84153771635350227 -6.3717869520822763 -1.3536644545823926 1.0821893627865047 -6.6279097745273727 -0.93487683560991697 1.0600229291491934 -6.5605127385811217 -1.0390110224185309 1.0378564955118819 -6.4931157026348698 -1.143145209227145 1.0156900618745703 -6.4257186666886188 -1.2472793960357591 0.99352362823725904 -6.3583216307423678 -1.351413582844373 1.2563417083075727 -6.6818414891337152 -0.82849177706328336 1.2341752746702614 -6.6144444531874642 -0.93262596387189722 1.2120088410329501 -6.5470474172412132 -1.0367601506805111 1.1898424073956386 -6.4796503812949613 -1.1408943374891254 1.1676759737583271 -6.4122533453487103 -1.2450285242977395 1.1455095401210158 -6.3448563094024593 -1.3491627111063531 -1.1216710579067211 -6.2306587384969845 -1.4630439685500738 -1.1067512796052075 -6.1279856010483975 -1.5326298340794169 -1.0918315013036939 -6.0253124635998105 -1.6022156996087602 -1.0769117230021803 -5.9226393261512245 -1.6718015651381035 -1.0619919447006669 -5.8199661887026375 -1.7413874306674466 -1.0470721663991533 -5.7172930512540496 -1.8109732961967899 -0.97165946017376215 -6.2477148636926669 -1.4615196710550209 -0.95673968187224834 -6.14504172624408 -1.531105536584364 -0.94181990357073486 -6.042368588795493 -1.6006914021137073 -0.92690012526922128 -5.939695451346906 -1.6702772676430506 -0.9119803469677078 -5.8370223138983199 -1.7398631331723937 -0.82164786244080301 -6.2647709888883494 -1.459995373559968 -0.80672808413928931 -6.1620978514397624 -1.5295812390893111 -0.79180830583777584 -6.0594247139911754 -1.5991671046186544 -0.77688852753626214 -5.9567515765425885 -1.6687529701479977 -0.67163626470784388 -6.2818271140840318 -1.4584710760649151 -0.65671648640633018 -6.1791539766354449 -1.5280569415942582 -0.6417967081048167 -6.076480839186857 -1.5976428071236015 -0.52162466697488474 -6.2988832392797134 -1.4569467785698622 -0.50670488867337116 -6.1962101018311273 -1.5265326440992055 -0.49178511037185757 -6.0935369643825394 -1.5961185096285488 -0.37161306924192544 -6.3159393644753958 -1.4554224810748093 -0.35669329094041191 -6.2132662270268089 -1.5250083466041526 -0.22160147150896639 -6.3329954896710774 -1.4538981835797566 -0.90729566562229291 -5.7334835301319051 -1.8093538348660572 -0.76826409203051005 -5.8535460024855368 -1.7382803028691092 -0.76893417326736035 -5.749554332876218 -1.8077212170767654 -0.62923251843872707 -5.9736084748391685 -1.6672067708721614 -0.62990259967557749 -5.8696168052298496 -1.7366476850798174 -0.6305726809124278 -5.7656251356205308 -1.8060885992874736 -0.49087102608379457 -5.9896792775834813 -1.6655741530828696 -0.49154110732064499 -5.8856876079741625 -1.7350150672905256 -0.49221118855749529 -5.7816959383648436 -1.8044559814981818 -0.3518394524920116 -6.1097417499371129 -1.5945006210859216 -0.3525095337288619 -6.005750080327795 -1.6639415352935778 -0.35317961496571237 -5.9017584107184753 -1.7333824495012338 -0.35384969620256262 -5.7977667411091574 -1.80282336370889 -0.21280787890022881 -6.2298042222907455 -1.5234270890889738 -0.21347796013707906 -6.1258125526814258 -1.5928680032966298 -0.21414804137392943 -6.0218208830721078 -1.662308917504286 -0.21481812261077984 -5.917829213462789 -1.731749831711942 -0.21548820384763018 -5.8138375438534702 -1.8011907459195982 -0.073776305308445922 -6.3498666946443771 -1.4523535570920258 -0.074446386545296284 -6.2458750250350583 -1.521794471299682 -0.075116467782146534 -6.1418833554257395 -1.591235385507338 -0.075786549018996924 -6.0378916858164207 -1.6606762997149942 -0.076456630255847341 -5.9339000162071018 -1.7301172139226504 -0.077126711492697717 -5.8299083465977839 -1.7995581281303066 -2.3751462496041453 -5.8528872397244642 -1.476651442291792 -2.3279959679971935 -5.7590431876967534 -1.5461359452720389 -2.2808456863902418 -5.6651991356690434 -1.6156204482522858 -2.2336954047832895 -5.5713550836413335 -1.6851049512325325 -2.1865451231763378 -5.4775110316136226 -1.7545894542127791 -2.2145118204186609 -5.9043085146230538 -1.4749209602030311 -2.1673615388117091 -5.810464462595343 -1.544405463183278 -2.1202112572047573 -5.716620410567633 -1.6138899661635246 -2.0730609755978051 -5.6227763585399231 -1.6833744691437713 -2.0259106939908533 -5.5289323065122122 -1.752858972124018 -2.0538773912331765 -5.9557297895216434 -1.4731904781142702 -2.0067271096262247 -5.8618857374939326 -1.5426749810945171 -1.9595768280192729 -5.7680416854662226 -1.6121594840747637 -1.9124265464123207 -5.6741976334385127 -1.6816439870550104 -1.8932429620476916 -6.0071510644202331 -1.4714599960255093 -1.8460926804407398 -5.9133070123925222 -1.5409444990057561 -1.798942398833788 -5.8194629603648123 -1.6104290019860026 -1.7326085328622072 -6.0585723393188227 -1.4697295139367481 -1.6854582512552554 -5.9647282872911118 -1.539214016916995 -1.571974103676723 -6.1099936142174123 -1.4679990318479872 -1.5248238220697712 -6.0161495621897014 -1.5374835348282341 -1.4113396744912385 -6.1614148891160019 -1.466268549759226 -2.1417310506778238 -5.3829461719004765 -1.8240817484161456 -2.005943789650849 -5.4267011682517889 -1.822434131268851 -1.8855865864855539 -5.5740870892942036 -1.7511962246602435 -1.8701565286238742 -5.4704561646031014 -1.8207865141215565 -1.7652293833202588 -5.7214730103366183 -1.6799583180516358 -1.7497993254585791 -5.617842085645516 -1.7495486075129489 -1.7343692675968994 -5.5142111609544138 -1.8191388969742621 -1.6448721801549637 -5.8688589313790311 -1.6087204114430282 -1.629442122293284 -5.7652280066879307 -1.6783107009043412 -1.6140120644316043 -5.6615970819968284 -1.7479009903656544 -1.5985820065699246 -5.5579661573057262 -1.8174912798269676 -1.5090849191279889 -5.9126139277303436 -1.6070727942957337 -1.4936548612663092 -5.8089830030392431 -1.6766630837570466 -1.4782248034046297 -5.7053520783481408 -1.74625337321836 -1.46279474554295 -5.6017211536570386 -1.8158436626796732 -1.3887277159626938 -6.0599998487727582 -1.5358348876871259 -1.3732976581010141 -5.956368924081656 -1.6054251771484391 -1.3578676002393344 -5.8527379993905555 -1.6750154666097523 -1.3424375423776549 -5.7491070746994533 -1.7446057560710655 -1.3270074845159754 -5.645476150008351 -1.8141960455323787 -1.2683705127973985 -6.2073857698151729 -1.464596981078518 -1.252940454935719 -6.1037548451240706 -1.5341872705398314 -1.2375103970740393 -6.0001239204329693 -1.6037775600011446 -1.2220803392123598 -5.8964929957418679 -1.6733678494624578 -1.2066502813506803 -5.7928620710507657 -1.7429581389237712 -1.1912202234890006 -5.6892311463596634 -1.8125484283850843 -3.4615103116838362 -5.3790358401368845 -1.4193811604070428 -3.4030519345053238 -5.2928608366523537 -1.4889103077901713 -3.344593557326812 -5.206685833167823 -1.5584394551733001 -3.2861351801483001 -5.1205108296832922 -1.6279686025564288 -3.2276768029697882 -5.0343358261987605 -1.6974977499395576 -3.1692184257912763 -4.9481608227142289 -1.7670268973226864 -3.3326546174108866 -5.4504798624166595 -1.4178598431791429 -3.2741962402323748 -5.3643048589321287 -1.4873889905622715 -3.2157378630538629 -5.2781298554475979 -1.5569181379454002 -3.157279485875351 -5.1919548519630672 -1.6264472853285288 -3.0988211086968391 -5.1057798484785355 -1.6959764327116578 -3.2037989231379376 -5.5219238846964354 -1.4163385259512429 -3.1453405459594257 -5.4357488812119037 -1.4858676733343714 -3.0868821687809138 -5.3495738777273729 -1.5553968207175002 -3.0284237916024019 -5.2633988742428421 -1.6249259681006289 -2.9699654144238896 -5.1772238707583105 -1.6944551154837577 -3.0749432288649881 -5.5933679069762103 -1.414817208723343 -3.0164848516864766 -5.5071929034916787 -1.4843463561064716 -2.9580264745079647 -5.4210179000071479 -1.5538755034896004 -2.8995680973294529 -5.3348428965226171 -1.6234046508727289 -2.8876291574135271 -5.5786369257714545 -1.4828250388785715 -2.8291707802350152 -5.4924619222869238 -1.5523541862617003 -2.758773463140578 -5.6500809480512295 -1.4813037216506717 -2.7003150859620662 -5.5639059445666987 -1.5508328690338005 -2.6299177688676285 -5.7215249703310054 -1.4797824044227716 -3.1161472442846181 -4.8591313599918537 -1.8365412077431451 -3.0418914086926758 -5.0187948601804209 -1.7655013699402735 -2.9966112915930885 -4.9256372244485531 -1.8349942228643261 -2.9223554560011462 -5.0853007246371202 -1.7639543850614545 -2.8770753389015589 -4.9921430889052525 -1.8334472379855071 -2.8480996204092044 -5.2449642248256882 -1.6929145472585827 -2.8028195033096166 -5.1518065890938196 -1.7624074001826355 -2.7575393862100293 -5.0586489533619519 -1.8319002531066881 -2.7738437848172626 -5.4046277250142554 -1.6218747094557111 -2.7285636677176748 -5.3114700892823876 -1.6913675623797637 -2.683283550618087 -5.218312453550519 -1.7608604153038165 -2.6380034335184996 -5.1251548178186512 -1.8303532682278691 -2.654307832125733 -5.4711335894709547 -1.6203277245768921 -2.6090277150261452 -5.377975953739087 -1.6898205775009447 -2.5637475979265574 -5.2848183180072184 -1.7593134304249975 -2.51846748082697 -5.1916606822753506 -1.8288062833490502 -2.5800519965337907 -5.6307970896595227 -1.5492878867740205 -2.5347718794342033 -5.5376394539276541 -1.6187807396980731 -2.4894917623346156 -5.4444818181957864 -1.6882735926221257 -2.4442116452350278 -5.3513241824639186 -1.7577664455461786 -2.3989315281354404 -5.25816654673205 -1.8272592984702312 -2.5057961609418489 -5.7904605898480908 -1.4782480489711487 -2.4605160438422611 -5.6973029541162221 -1.5477409018952015 -2.4152359267426737 -5.6041453183843544 -1.6172337548192541 -2.3699558096430859 -5.5109876826524866 -1.6867266077433067 -2.3246756925434982 -5.417830046920618 -1.7562194606673596 -2.2793955754439104 -5.3246724111887502 -1.8257123135914122 -4.137038403542812 -4.1565921377490813 -1.7806222590206613 -4.2136761204975892 -4.2274703559354165 -1.7111928832415477 -4.2903138374523664 -4.2983485741217518 -1.6417635074624342 -4.3669515544071444 -4.3692267923080861 -1.5723341316833206 -4.4034128884265762 -4.6098773765821708 -1.4319041897798703 -4.326775171471799 -4.5389991583958365 -1.5013335655589837 -4.2501374545170227 -4.4681209402095021 -1.5707629413380972 -4.1734997375622447 -4.3972427220231678 -1.6401923171172108 -4.0968620206074675 -4.3263645038368326 -1.7096216928963244 -4.0202243036526903 -4.2554862856504982 -1.7790510686754379 -4.2865987885364545 -4.7087715244835868 -1.430332999434647 -4.2099610715816773 -4.6378933062972525 -1.4997623752137603 -4.133323354626901 -4.5670150881109182 -1.5691917509928739 -4.056685637672123 -4.4961368699245838 -1.6386211267719875 -3.9800479207173458 -4.4252586517382495 -1.7080505025511008 -4.1697846886463328 -4.8076656723850029 -1.4287618090894236 -4.0931469716915556 -4.7367874541986694 -1.498191184868537 -4.0165092547367784 -4.6659092360123342 -1.5676205606476505 -3.9398715377820013 -4.5950310178259999 -1.6370499364267641 -4.0529705887562111 -4.9065598202864189 -1.4271906187442003 -3.9763328718014339 -4.8356816021000855 -1.4966199945233136 -3.8996951548466567 -4.7648033839137502 -1.5660493703024272 -3.9361564888660894 -5.0054539681878349 -1.4256194283989769 -3.8595187719113122 -4.9345757500015015 -1.4950488041780903 -3.7828810549565346 -4.8636975318151663 -1.5644781799572038 -3.8193423889759677 -5.1043481160892519 -1.4240482380537534 -3.7427046720211901 -5.0334698979029175 -1.4934776138328667 -3.7025282890858455 -5.2032422639906679 -1.42247704770853 -3.5857141891957234 -5.3021364118920848 -1.4209058573633064 -3.9137983739064381 -4.345745867002389 -1.7775365621455395 -3.8554657512404722 -4.2596525962473049 -1.847065821019539 -3.8685661143590795 -4.5197206385636761 -1.7065084082581787 -3.8102334916931135 -4.4336273678085929 -1.776037667132178 -3.751900869027148 -4.3475340970535088 -1.8455669260061776 -3.8233338548117208 -4.6936954101249633 -1.635480254370818 -3.7650012321457549 -4.6076021393698801 -1.7050095132448173 -3.7066686094797889 -4.5215088686147968 -1.7745387721188166 -3.6483359868138234 -4.4354155978597127 -1.8440680309928161 -3.7197689725983962 -4.7815769109311672 -1.6339813593574566 -3.6614363499324303 -4.695483640176084 -1.7035106182314559 -3.6031037272664648 -4.6093903694210008 -1.7730398771054554 -3.5447711046004988 -4.5232970986659167 -1.8425691359794549 -3.674536713051038 -4.9555516824924544 -1.5629532054700956 -3.6162040903850716 -4.8694584117373712 -1.6324824643440952 -3.5578714677191057 -4.7833651409822879 -1.7020117232180945 -3.4995388450531402 -4.6972718702272047 -1.771540982092094 -3.4412062223871742 -4.6111785994721206 -1.8410702409660935 -3.6293044535036789 -5.1295264540537415 -1.4919250515827347 -3.5709718308377134 -5.0434331832986583 -1.5614543104567342 -3.512639208171747 -4.9573399125435751 -1.6309835693307337 -3.4543065855057815 -4.8712466417884919 -1.7005128282047333 -3.3959739628398156 -4.7851533710334078 -1.7700420870787328 -3.3376413401738501 -4.6990601002783237 -1.8395713459527323 -3.5257395712903543 -5.2174079548599464 -1.4904261565693733 -3.4674069486243888 -5.1313146841048622 -1.5599554154433728 -3.4090743259584229 -5.045221413349779 -1.6294846743173723 -3.3507417032924569 -4.9591281425946949 -1.6990139331913718 -3.2924090806264914 -4.8730348718396117 -1.7685431920653714 -3.2340764579605255 -4.7869416010845276 -1.8380724509393709 -5.244413362955223 -3.5989436548267544 -1.4452296492354118 -5.1571377753686409 -3.5424199220580039 -1.51460206343463 -5.0698621877820589 -3.4858961892892535 -1.5839744776338482 -4.9825866001954768 -3.429372456520503 -1.6533468918330665 -4.8953110126088948 -3.3728487237517526 -1.7227193060322847 -4.8080354250223127 -3.3163249909830022 -1.792091720231503 -5.1533609174015584 -3.7133469795574503 -1.4437577747490069 -5.0660853298149764 -3.6568232467886999 -1.5131301889482252 -4.9788097422283943 -3.6002995140199494 -1.5825026031474434 -4.8915341546418123 -3.543775781251199 -1.6518750173466616 -4.8042585670552302 -3.4872520484824485 -1.7212474315458797 -5.0623084718478939 -3.8277503042881458 -1.4422859002626018 -4.9750328842613118 -3.7712265715193958 -1.5116583144618201 -4.8877572966747298 -3.7147028387506453 -1.5810307286610386 -4.8004817090881469 -3.6581791059818949 -1.6504031428602566 -4.9712560262942294 -3.9421536290188417 -1.440814025776197 -4.8839804387076473 -3.8856298962500917 -1.5101864399754152 -4.7967048511210653 -3.8291061634813408 -1.5795588541746335 -4.7094292635344823 -3.7725824307125904 -1.6489312683738517 -4.8802035807405648 -4.0565569537495376 -1.4393421512897919 -4.7929279931539819 -4.0000332209807876 -1.5087145654890102 -4.7056524055673998 -3.9435094882120367 -1.5780869796882286 -4.7891511351869003 -4.1709602784802335 -1.4378702768033871 -4.7018755476003173 -4.1144365457114835 -1.5072426910026053 -4.6980986896332348 -4.2853636032109295 -1.436398402316982 -4.6108231020466519 -4.2288398704421786 -1.5057708165162003 -4.6070462440795694 -4.3997669279416254 -1.4349265278305769 -4.7208170178068265 -3.426009147379125 -1.790640026355071 -4.7135922568472282 -3.6011800942682344 -1.7197775894978908 -4.6378584977729851 -3.530449974699402 -1.7892107545605691 -4.6306337368133867 -3.7056209215885119 -1.7183483177033889 -4.5548999777391437 -3.6348908020196795 -1.7877814827660672 -4.6234089758537893 -3.8807918684776208 -1.6474858808462092 -4.5476752167795453 -3.8100617489087893 -1.716919045908887 -4.4719414577053023 -3.739331629339957 -1.7863522109715653 -4.6161842148941927 -4.0559628153667298 -1.5766234439890292 -4.5404504558199479 -3.9852326957978983 -1.6460566090517073 -4.4647166967457039 -3.9145025762290664 -1.7154897741143853 -4.3889829376714609 -3.843772456660234 -1.7849229391770636 -4.5332256948603513 -4.1604036426870072 -1.5751941721945273 -4.4574919357861074 -4.0896735231181758 -1.6446273372572053 -4.3817581767118634 -4.0189434035493434 -1.7140605023198834 -4.3060244176376195 -3.9482132839805111 -1.7834936673825617 -4.5260009339007539 -4.3355745895761162 -1.5043317353373473 -4.4502671748265108 -4.2648444700072847 -1.5737649004000256 -4.374533415752266 -4.1941143504384533 -1.6431980654627036 -4.298799656678022 -4.1233842308696209 -1.7126312305253817 -4.223065897603778 -4.0526541113007886 -1.78206439558806 -4.5187761729411573 -4.5107455364652251 -1.4334692984801674 -4.4430424138669125 -4.4400154168963928 -1.5029024635428454 -5.8614919106072705 -2.4365289771497052 -1.4581112663900444 -5.7644706009188686 -2.3991650659349295 -1.5273864359676497 -5.6674492912304668 -2.3618011547201543 -1.5966616055452552 -5.570427981542065 -2.3244372435053791 -1.6659367751228606 -5.4734066718536631 -2.2870733322906043 -1.7352119447004659 -5.3763853621652613 -2.2497094210758286 -1.8044871142780714 -5.7938236397934944 -2.5676581586446297 -1.4566772778988932 -5.6968023301050925 -2.530294247429854 -1.5259524474764985 -5.5997810204166907 -2.4929303362150788 -1.595227617054104 -5.5027597107282888 -2.4555664250003035 -1.6645027866317095 -5.4057384010398861 -2.4182025137855283 -1.7337779562093147 -5.7261553689797182 -2.6987873401395541 -1.4552432894077421 -5.6291340592913164 -2.6614234289247785 -1.5245184589853473 -5.5321127496029145 -2.6240595177100032 -1.5937936285629528 -5.4350914399145127 -2.586695606495228 -1.6630687981405583 -5.33807013022611 -2.5493316952804523 -1.7323439677181636 -5.6584870981659421 -2.8299165216344786 -1.4538093009165909 -5.5614657884775403 -2.7925526104197029 -1.5230844704941962 -5.4644444787891375 -2.7551886992049281 -1.5923596400718016 -5.3674231691007357 -2.7178247879901525 -1.6616348096494069 -5.590818827352166 -2.9610457031294031 -1.4523753124254397 -5.4937975176637641 -2.9236817919146274 -1.521650482003045 -5.3967762079753614 -2.8863178806998526 -1.5909256515806505 -5.5231505565383898 -3.0921748846243275 -1.4509413239342885 -5.426129246849988 -3.0548109734095519 -1.5202164935118938 -5.4554822857246137 -3.2233040661192516 -1.4495073354431374 -5.3584609760362119 -3.1859401549044764 -1.5187825050207426 -5.3878140149108367 -3.3544332476141756 -1.448073346951986 -5.3106542184145571 -2.3771546469031306 -1.8030720670699014 -5.250081377187918 -2.4947900062631878 -1.8017074578890939 -5.2764724531330138 -2.6689160490924402 -1.7309693376633897 -5.1895085359612789 -2.612425365623245 -1.8003428487082864 -5.3028635290781114 -2.8430420919216925 -1.6602312174376854 -5.2158996119063747 -2.7865514084524974 -1.7296047284825822 -5.1289356947346398 -2.7300607249833022 -1.7989782395274789 -5.3292546050232072 -3.0171681347509454 -1.589493097211981 -5.2422906878514723 -2.9606774512817498 -1.6588666082568779 -5.1553267706797357 -2.9041867678125546 -1.7282401193017747 -5.0683628535080008 -2.8476960843433594 -1.7976136303466717 -5.2686817637965682 -3.1348034941110026 -1.5881284880311735 -5.1817178466248333 -3.078312810641807 -1.6575019990760704 -5.0947539294530966 -3.0218221271726118 -1.7268755101209672 -5.0077900122813608 -2.9653314437034166 -1.7962490211658642 -5.2950728397416649 -3.3089295369402545 -1.5173903678054692 -5.2081089225699291 -3.2524388534710598 -1.586763878850366 -5.1211450053981933 -3.1959481700018642 -1.6561373898952629 -5.0341810882264575 -3.139457486532669 -1.7255109009401599 -4.9472171710547217 -3.0829668030634738 -1.7948844119850569 -5.3214639156867607 -3.4830555797695064 -1.4466522475797647 -5.2344999985150258 -3.4265648963003117 -1.5160257586246617 -5.14753608134329 -3.3700742128311165 -1.5853992696695587 -5.0605721641715542 -3.3135835293619214 -1.6547727807144554 -4.9736082469998184 -3.2570928458927262 -1.7241462917593524 -4.8866443298280817 -3.200602162423531 -1.7935198028042494 -6.1802677734981986 -1.3366013204538507 -1.4687220984638114 -6.0782711212263614 -1.3177475951588111 -1.5379296409739689 -5.9762744689545242 -1.2988938698637715 -1.6071371834841264 -5.8742778166826879 -1.2800401445687319 -1.6763447259942839 -5.7722811644108516 -1.2611864192736923 -1.7455522685044416 -6.1401740124254562 -1.4756027184798033 -1.4673909316508085 -6.0381773601536191 -1.4567489931847637 -1.536598474160966 -5.9361807078817819 -1.4378952678897241 -1.6058060166711234 -5.8341840556099456 -1.4190415425946845 -1.6750135591812809 -5.7321874033381093 -1.4001878172996449 -1.7442211016914386 -6.1000802513527139 -1.6146041165057561 -1.4660597648378055 -5.9980835990808767 -1.5957503912107163 -1.535267307347963 -5.8960869468090396 -1.5768966659156769 -1.6044748498581207 -5.7940902945372033 -1.5580429406206371 -1.6736823923682782 -6.0599864902799716 -1.7536055145317087 -1.4647285980248026 -5.9579898380081344 -1.7347517892366688 -1.5339361405349601 -5.8559931857362972 -1.7158980639416295 -1.6031436830451178 -6.0198927292072293 -1.8926069125576612 -1.4633974312117997 -5.9178960769353921 -1.8737531872626216 -1.5326049737219571 -5.8158994246635549 -1.854899461967582 -1.6018125162321151 -5.979798968134487 -2.0316083105836138 -1.4620662643987967 -5.8778023158626498 -2.0127545852885742 -1.5312738069089544 -5.9397052070617438 -2.1706097086095664 -1.4607350975857938 -5.8996114459890014 -2.3096111066355189 -1.4594039307727911 -5.6707520344199436 -1.2407609925132457 -1.8147657529569412 -5.6345175372267153 -1.366788440543099 -1.8134836351933441 -5.6947466824034345 -1.5302703097613397 -1.7429236535099855 -5.5982830400334871 -1.4928158885729523 -1.812201517429747 -5.7549758275801546 -1.6937521789795809 -1.6723636718266273 -5.6585121852102063 -1.6562977577911928 -1.7416415357463884 -5.5620485428402588 -1.6188433366028057 -1.8109193996661499 -5.7187413303869263 -1.8197796270094342 -1.6710815540630302 -5.622277688016978 -1.7823252058210461 -1.7403594179827915 -5.5258140456470306 -1.744870784632659 -1.8096372819025528 -5.7789704755636455 -1.9832614962276749 -1.6005215723796717 -5.6825068331936981 -1.9458070750392873 -1.6697994362994331 -5.5860431908237507 -1.9083526538508995 -1.7390773002191944 -5.4895795484538032 -1.8708982326625121 -1.8083551641389559 -5.8391996207403656 -2.1467433654459156 -1.5299615906963131 -5.7427359783704182 -2.109288944257528 -1.5992394546160746 -5.6462723360004698 -2.0718345230691404 -1.668517318535836 -5.5498086936305224 -2.0343801018807528 -1.7377951824555975 -5.453345051260575 -1.9969256806923652 -1.8070730463753588 -5.8029651235471373 -2.2727708134757689 -1.5286794729327162 -5.7065014811771899 -2.2353163922873813 -1.5979573368524778 -5.6100378388072425 -2.1978619710989937 -1.6672352007722391 -5.5135741964372951 -2.1604075499106061 -1.7365130646920004 -5.4171105540673476 -2.1229531287222185 -1.8057909286117619 -6.3106023397295603 -0.055053912122005944 -1.4798212781976423 -6.2069455087031526 -0.056953590236368479 -1.5489575408288347 -6.1032886776767441 -0.058853268350731125 -1.6180938034600272 -5.9996318466503373 -0.060752946465093771 -1.6872300660912196 -5.8959750156239297 -0.062652624579456362 -1.7563663287224118 -6.2981939083256036 -0.19975339277913984 -1.4785896756226697 -6.1945370772991959 -0.20165307089350237 -1.5477259382538622 -6.0908802462727873 -0.20355274900786502 -1.6168622008850546 -5.9872234152463806 -0.20545242712222761 -1.685998463516247 -5.8835665842199729 -0.20735210523659015 -1.7551347261474395 -6.2857854769216468 -0.34445287343627362 -1.4773580730476972 -6.1821286458952391 -0.34635255155063616 -1.5464943356788896 -6.0784718148688306 -0.34825222966499897 -1.6156305983100823 -5.9748149838424238 -0.3501519077793615 -1.6847668609412745 -6.27337704551769 -0.48915235409340785 -1.4761264704727246 -6.1697202144912824 -0.49105203220777038 -1.545262733103917 -6.0660633834648738 -0.4929517103221332 -1.6143989957351097 -6.2609686141137342 -0.63385183475054163 -1.4748948678977523 -6.1573117830873256 -0.63575151286490428 -1.5440311305289447 -6.053654952060918 -0.63765119097926715 -1.6131673931601374 -6.2485601827097774 -0.77855131540767541 -1.4736632653227797 -6.1449033516833698 -0.78045099352203806 -1.5427995279539721 -6.2361517513058216 -0.9232507960648092 -1.4724316627478073 -6.2237433199018648 -1.0679502767219431 -1.4712000601728348 -5.7923212046398342 -0.064519922104146143 -1.8255027043876508 -5.7812746312476113 -0.1946176982495017 -1.8243220733904584 -5.8719411741571648 -0.34365610989596385 -1.7539324304699921 -5.7702280578553893 -0.32471547439485737 -1.8231414423932659 -5.9626077170667173 -0.49269452154242588 -1.6835427875495261 -5.8608946007649418 -0.47375388604131952 -1.7527517994727997 -5.7591814844631664 -0.45481325054021304 -1.8219608113960735 -5.9515611436744944 -0.62279229768778155 -1.6823621565523337 -5.8498480273727189 -0.60385166218667519 -1.7515711684756072 -5.7481349110709443 -0.58491102668556871 -1.820780180398881 -6.042227686584047 -0.77183070933424358 -1.6119725136318677 -5.9405145702822724 -0.75289007383313722 -1.6811815255551412 -5.8388014539804969 -0.73394943833203086 -1.7503905374784148 -5.7370883376787214 -0.71500880283092438 -1.8195995494016886 -6.1328942294936004 -0.92086912098070572 -1.5415828707114014 -6.0311811131918249 -0.90192848547959925 -1.610791882634675 -5.9294679968900494 -0.88298784997849289 -1.6800008945579488 -5.827754880588274 -0.86404721447738653 -1.7492099064812223 -5.7260417642864994 -0.84510657897628005 -1.8184189184044961 -6.1218476561013775 -1.0509668971260613 -1.5404022397142088 -6.020134539799602 -1.0320262616249549 -1.6096112516374825 -5.9184214234978274 -1.0130856261238486 -1.6788202635607563 -5.8167083071960519 -0.9941449906227422 -1.7480292754840299 -5.7149951908942764 -0.97520435512163572 -1.8172382874073036 -6.2125141990109309 -1.2000053087725233 -1.4700125967937427 -6.1108010827091546 -1.181064673271417 -1.5392216087170163 -6.00908796640738 -1.1621240377703106 -1.6084306206402899 -5.9073748501056045 -1.1431834022692042 -1.6776396325635636 -5.805661733803829 -1.1242427667680979 -1.7468486444868374 -5.7039486175020544 -1.1053021312669915 -1.816057656410111 -6.283274871647599 1.2348787293845154 -1.4204368122929107 -6.1819926074173903 1.2133953598684386 -1.489525275014405 -6.0807103431871807 1.1919119903523621 -1.5586137377358995 -5.9794280789569711 1.1704286208362851 -1.6277022004573938 -5.8781458147267616 1.1489452513202085 -1.696790663178888 -5.776863550496552 1.127461881804132 -1.7658791259003825 -5.6755812862663424 1.1059785122880554 -1.834967588621877 -6.2989656618636323 1.0919324206580332 -1.4193598368428328 -6.1976833976334236 1.0704490511419564 -1.4884482995643271 -6.096401133403214 1.0489656816258799 -1.5575367622858216 -5.9951188691730044 1.0274823121098029 -1.6266252250073159 -5.8938366049427948 1.0059989425937266 -1.6957136877288101 -5.7925543407125861 0.98451557307765003 -1.7648021504503046 -6.3146564520796664 0.94898611193155102 -1.4182828613927547 -6.2133741878494568 0.92750274241547426 -1.4873713241142492 -6.1120919236192481 0.90601937289939771 -1.5564597868357437 -6.0108096593890386 0.88453600338332072 -1.625548249557238 -5.909527395158829 0.8630526338672444 -1.6946367122787322 -6.3303472422956997 0.80603980320506885 -1.4172058859426768 -6.229064978065491 0.78455643368899208 -1.4862943486641713 -6.1277827138352814 0.76307306417291554 -1.5553828113856656 -6.0265004496050718 0.74158969465683855 -1.6244712741071601 -6.3460380325117338 0.66309349447858668 -1.4161289104925987 -6.2447557682815242 0.64161012496250991 -1.4852173732140932 -6.1434735040513155 0.62012675544643336 -1.5543058359355877 -6.042191239821106 0.59864338593035649 -1.623394298657082 -6.3617288227277671 0.52014718575210428 -1.4150519350425208 -6.2604465584975584 0.49866381623602762 -1.4841403977640153 -6.1591642942673488 0.47718044671995108 -1.5532288604855096 -6.2761373487135916 0.35571750750954556 -1.4830634223139372 -6.2918281389296258 0.21277119878306347 -1.4819864468638593 -5.6900038734231027 0.97542971295260261 -1.8339221211095564 -5.8075877617492395 0.84799547544973275 -1.7637415070434559 -5.704281274005039 0.8463002067750286 -1.8328802606927475 -5.9251716500753755 0.72056123794686278 -1.6935608929773553 -5.8218651623311759 0.71886596927215873 -1.7626996466266469 -5.7185586745869754 0.71717070059745458 -1.8318384002759383 -5.9394490506573119 0.59143173176928887 -1.6925190325605464 -5.8361425629131123 0.58973646309458483 -1.7616577862098379 -5.7328360751689118 0.58804119441988068 -1.8307965398591293 -6.0570329389834487 0.46399749426641884 -1.6223384184944458 -5.9537264512392483 0.4623022255917148 -1.6914771721437374 -5.8504199634950487 0.4606069569170107 -1.7606159257930287 -5.7471134757508482 0.45891168824230666 -1.8297546794423201 -6.1746168273095856 0.33656325676354909 -1.5521578044283453 -6.0713103395653851 0.33486798808884499 -1.6212965580776368 -5.9680038518211846 0.33317271941414089 -1.6904353117269284 -5.8646973640769851 0.33147745073943685 -1.7595740653762197 -5.7613908763327846 0.32978218206473281 -1.8287128190255111 -6.188894227891522 0.20743375058597524 -1.5511159440115363 -6.0855877401473215 0.20573848191127114 -1.6202546976608279 -5.9822812524031219 0.20404321323656707 -1.6893934513101192 -5.8789747646589214 0.20234794456186297 -1.7585322049594105 -5.775668276914721 0.20065267588715893 -1.8276709586087019 -6.3064781162176589 0.079999513083105309 -1.4809353299454358 -6.2031716284734584 0.078304244408401238 -1.5500740835947273 -6.0998651407292579 0.076608975733697085 -1.6192128372440189 -5.9965586529850583 0.07491370705899307 -1.6883515908933102 -5.8932521652408578 0.073218438384288917 -1.7574903445426016 -5.7899456774966573 0.071523169709584902 -1.8266290981918929 -5.9419361434667435 2.3337405178899715 -1.4275074394407214 -5.8469041388835068 2.2927419847452839 -1.496556224044747 -5.7518721343002692 2.2517434516005963 -1.5656050086487725 -5.6568401297170308 2.2107449184559083 -1.634653793252798 -5.5618081251337932 2.1697463853112211 -1.7037025778568236 -5.4667761205505556 2.1287478521665335 -1.7727513624608491 -5.985022535349926 2.1962281185507515 -1.426625631624332 -5.8899905307666893 2.1552295854060639 -1.4956744162283575 -5.7949585261834518 2.1142310522613763 -1.564723200832383 -5.6999265216002133 2.0732325191166883 -1.6337719854364086 -5.6048945170169757 2.0322339859720011 -1.7028207700404341 -6.0281089272331094 2.0587157192115315 -1.4257438238079425 -5.9330769226498719 2.0177171860668439 -1.494792608411968 -5.8380449180666343 1.9767186529221563 -1.5638413930159936 -5.7430129134833958 1.9357201197774687 -1.6328901776200191 -5.6479809089001582 1.8947215866327816 -1.7019389622240448 -6.0711953191162928 1.9212033198723113 -1.424862015991553 -5.9761633145330544 1.8802047867276237 -1.4939108005955786 -5.8811313099498168 1.8392062535829361 -1.5629595851996041 -5.7860993053665792 1.7982077204382487 -1.6320083698036298 -6.1142817109994754 1.7836909205330915 -1.4239802081751636 -6.0192497064162369 1.7426923873884039 -1.4930289927791891 -5.9242177018329993 1.7016938542437163 -1.5620777773832146 -6.1573681028826579 1.6461785211938715 -1.4230984003587741 -6.0623360982994194 1.6051799880491842 -1.4921471849627996 -6.2004544947658413 1.5086661218546518 -1.4222165925423846 -6.1054224901826029 1.4676675887099644 -1.4912653771464102 -6.2435408866490238 1.3711537225154318 -1.4213347847259952 -5.3684469546688076 2.0985016825290903 -1.841822934957877 -5.5083641202208753 1.9961218554902378 -1.7718799105835026 -5.4072938225365119 1.9748147831230174 -1.8409704280494201 -5.5472109880885796 1.8724349560841644 -1.7710274036750457 -5.4461406904042162 1.8511278837169443 -1.8401179211409633 -5.6871281536406464 1.7700551290453119 -1.7010843793006714 -5.5860578559562839 1.7487480566780913 -1.7701748967665889 -5.4849875582719205 1.7274409843108711 -1.8392654142325064 -5.8270453191927132 1.6676753020064592 -1.631141354926297 -5.7259750215083507 1.6463682296392388 -1.7002318723922145 -5.6249047238239873 1.6250611572720182 -1.7693223898581321 -5.5238344261396239 1.603754084904798 -1.8384129073240496 -5.96696248474478 1.5652954749676065 -1.5611983305519224 -5.8658921870604175 1.5439884026003861 -1.6302888480178401 -5.764821889376055 1.5226813302331657 -1.6993793654837577 -5.6637515916916916 1.501374257865945 -1.7684698829496752 -5.5626812940073282 1.4800671854987248 -1.8375604004155928 -6.0058093526124843 1.4416085755615333 -1.5603458236434655 -5.9047390549281218 1.4203015031943127 -1.6294363411093833 -5.8036687572437584 1.3989944308270925 -1.6985268585753008 -5.702598459559395 1.3776873584598719 -1.7676173760412184 -5.6015281618750317 1.3563802860926517 -1.8367078935071361 -6.145726518164552 1.3392287485226804 -1.4904027992690911 -6.0446562204801886 1.3179216761554602 -1.5594933167350087 -5.9435859227958261 1.2966146037882396 -1.6285838342009265 -5.8425156251114627 1.2753075314210192 -1.6976743516668442 -5.7414453274270993 1.2540004590537988 -1.7667648691327615 -5.640375029742736 1.2326933866865786 -1.8358553865986793 -5.3484319491646417 3.4752579731857614 -1.4331515582241912 -5.2631385617625996 3.4167454739420342 -1.5021758020147877 -5.1778451743605576 3.3582329746983071 -1.5712000458053845 -5.0925517869585164 3.2997204754545795 -1.6402242895959815 -5.0072583995564734 3.2412079762108523 -1.7092485333865783 -4.9219650121544314 3.1826954769671252 -1.7782727771771751 -5.4169052327130771 3.3490563207132635 -1.4325493035395973 -5.331611845311035 3.2905438214695364 -1.5015735473301939 -5.246318457908993 3.2320313222258092 -1.5705977911207907 -5.1610250705069518 3.1735188229820821 -1.6396220349113875 -5.0757316831049089 3.115006323738355 -1.7086462787019843 -5.4853785162615125 3.2228546682407657 -1.4319470488550032 -5.4000851288594705 3.1643421689970386 -1.5009712926456 -5.3147917414574284 3.1058296697533114 -1.5699955364361968 -5.2294983540553872 3.0473171705095843 -1.6390197802267936 -5.1442049666533443 2.9888046712658571 -1.7080440240173904 -5.5538517998099479 3.0966530157682679 -1.4313447941704094 -5.4685584124079059 3.0381405165245408 -1.5003690379610062 -5.3832650250058638 2.9796280172808136 -1.5693932817516028 -5.2979716376038226 2.9211155180370869 -1.6384175255421995 -5.6223250833583842 2.9704513632957701 -1.4307425394858153 -5.5370316959563413 2.9119388640520434 -1.4997667832764121 -5.4517383085543001 2.8534263648083162 -1.5687910270670089 -5.6907983669068205 2.8442497108232723 -1.4301402848012215 -5.6055049795047776 2.7857372115795456 -1.4991645285918183 -5.5202115921027364 2.7272247123358184 -1.5681887723824148 -5.7592716504552559 2.7180480583507745 -1.4295380301166274 -5.673978263053213 2.6595355591070478 -1.4985622739072242 -5.8277449340036913 2.5918464058782771 -1.4289357754320335 -4.8324779182348871 3.1319904033492962 -1.8473091896269196 -4.9890647637029701 3.0590509297401258 -1.77767450799864 -4.8942291865986087 3.0183031300761511 -1.8467264398626693 -5.0508160320666917 2.9453636564669803 -1.7770917582343897 -4.9559804549623303 2.9046158568030056 -1.8461436900984189 -5.2074028775347747 2.872424182857809 -1.7074570766061103 -5.1125673004304133 2.8316763831938347 -1.7765090084701394 -5.017731723326051 2.7909285835298601 -1.8455609403341686 -5.3639897230028577 2.7994847092486381 -1.637822394977831 -5.2691541458984963 2.7587369095846634 -1.70687432684186 -5.1743185687941349 2.7179891099206892 -1.775926258705889 -5.0794829916897726 2.677241310256715 -1.8449781905699183 -5.4257409913665793 2.6857974359754926 -1.6372396452135807 -5.3309054142622179 2.6450496363115179 -1.7062915770776097 -5.2360698371578565 2.6043018366475437 -1.7753435089416387 -5.1412342600534942 2.5635540369835694 -1.844395440805668 -5.5823278368346632 2.6128579623663213 -1.5676049635853011 -5.4874922597303009 2.572110162702347 -1.6366568954493304 -5.3926566826259394 2.5313623630383724 -1.7057088273133594 -5.2978211055215771 2.4906145633743986 -1.7747607591773884 -5.2029855284172148 2.4498667637104243 -1.8438126910414177 -5.738914682302747 2.5399184887571504 -1.4979702819570218 -5.6440791051983847 2.4991706890931757 -1.5670222138210508 -5.5492435280940224 2.4584228894292015 -1.63607414568508 -5.454407950989661 2.4176750897652273 -1.7051260775491091 -5.3595723738852987 2.376927290101253 -1.7741780094131381 -5.2647367967809364 2.3361794904372788 -1.8432299412771673 -5.89550152777083 2.4669790151479791 -1.4283356003287424 -5.8006659506664686 2.4262312154840049 -1.4973875321927714 -5.7058303735621063 2.3854834158200307 -1.5664394640568005 -5.610994796457744 2.344735616156056 -1.6354913959208297 -5.5161592193533817 2.3039878164920817 -1.7045433277848585 -5.4213236422490194 2.2632400168281075 -1.7735952596488875 -5.3264880651446571 2.2224922171641337 -1.8426471915129168 -4.5413035810246623 4.4791627614686211 -1.435229725384463 -4.4691269901592632 4.4051014926267067 -1.5042355574099271 -4.3969503992938641 4.3310402237847914 -1.5732413894353912 -4.324773808428465 4.2569789549428769 -1.6422472214608552 -4.2525972175630651 4.1829176861009616 -1.7112530534863193 -4.180420626697666 4.1088564172590463 -1.7802588855117831 -4.6328533044107445 4.368093690290455 -1.4350233197768627 -4.5606767135453454 4.2940324214485406 -1.5040291518023268 -4.4885001226799464 4.2199711526066253 -1.5730349838277908 -4.4163235318145473 4.1459098837647108 -1.6420408158532549 -4.3441469409491482 4.0718486149227955 -1.7110466478787187 -4.2719703500837491 3.9977873460808797 -1.7800524799041828 -4.7244030277968267 4.2570246191122889 -1.4348169141692624 -4.6522264369314277 4.1829633502703745 -1.5038227461947264 -4.5800498460660286 4.1089020814284591 -1.5728285782201905 -4.5078732552006295 4.0348408125865438 -1.6418344102456546 -4.4356966643352314 3.9607795437446289 -1.7108402422711184 -4.8159527511829099 4.1459555479341228 -1.4346105085616621 -4.7437761603175108 4.0718942790922084 -1.5036163405871261 -4.6715995694521117 3.9978330102502926 -1.5726221726125902 -4.5994229785867127 3.9237717414083773 -1.641628004638054 -4.907502474568993 4.0348864767559558 -1.4344041029540617 -4.835325883703594 3.9608252079140414 -1.5034099349795258 -4.7631492928381949 3.886763939072126 -1.5724157670049896 -4.9990521979550753 3.9238174055777892 -1.4341976973464614 -4.9268756070896762 3.8497561367358748 -1.5032035293719253 -4.8546990162242771 3.7756948678939595 -1.5722093613973893 -5.0906019213411584 3.8127483343996227 -1.4339912917388609 -5.0184253304757585 3.7386870655577082 -1.5029971237643249 -5.1821516447272407 3.7016792632214566 -1.4337848861312605 -5.2737013681133238 3.59061019204329 -1.43357848052366 -4.3543735885190511 3.8978268563749507 -1.7798615966602009 -4.5218476556949874 3.8562673362013937 -1.7106429987713707 -4.436676620272638 3.7979880696066948 -1.7796708834754889 -4.6893217228709236 3.8147078160278367 -1.6414244008825405 -4.6041506874485743 3.7564285494331378 -1.7104522855866586 -4.5189796520262249 3.6981492828384384 -1.7794801702907765 -4.7716247546245105 3.7148690292595807 -1.6412336876978284 -4.6864537192021611 3.6565897626648813 -1.7102615724019463 -4.6012826837798118 3.5983104960701819 -1.7792894571060645 -4.9390988218004468 3.6733095090860233 -1.572015089808998 -4.8539277863780974 3.6150302424913243 -1.6410429745131161 -4.768756750955748 3.5567509758966249 -1.7100708592172342 -4.6835857155333986 3.498471709301926 -1.7790987439213521 -5.1065728889763822 3.6317499889124663 -1.5027964919201677 -5.0214018535540337 3.5734707223177673 -1.5718243766242859 -4.9362308181316843 3.5151914557230679 -1.640852261328404 -4.8510597827093349 3.456912189128369 -1.7098801460325219 -4.7658887472869846 3.39863292253367 -1.7789080307366401 -5.1888759207299699 3.5319112021442103 -1.5026057787354556 -5.1037048853076197 3.4736319355495109 -1.5716336634395738 -5.0185338498852712 3.4153526689548119 -1.6406615481436917 -4.9333628144629209 3.3570734023601125 -1.7096894328478098 -4.8481917790405715 3.2987941357654136 -1.7787173175519277 -4.7630207436182213 3.2405148691707142 -1.8477452022560459 -3.5515945927353738 5.3087067318423991 -1.432028675801962 -3.4952207792931089 5.2220557247554229 -1.5010130710803486 -3.4388469658508432 5.1354047176684476 -1.5699974663587353 -3.3824731524085778 5.0487537105814724 -1.6389818616371221 -3.326099338966312 4.9621027034944971 -1.7079662569155087 -3.2697255255240467 4.8754516964075219 -1.7769506521938954 -3.6627608840839319 5.2167532332514508 -1.4324032341999742 -3.606387070641667 5.1301022261644746 -1.5013876294783608 -3.5500132571994012 5.0434512190774994 -1.5703720247567474 -3.4936394437571359 4.9568002119905241 -1.6393564200351343 -3.4372656303148701 4.8701492049035489 -1.7083408153135209 -3.3808918168726048 4.7834981978165745 -1.7773252105919075 -3.7739271754324895 5.1247997346605025 -1.4327777925979863 -3.717553361990225 5.0381487275735264 -1.5017621878763729 -3.6611795485479592 4.9514977204865511 -1.5707465831547596 -3.6048057351056939 4.8648467133995759 -1.6397309784331464 -3.5484319216634281 4.7781957063126006 -1.708715373711533 -3.8850934667810475 5.0328462360695543 -1.4331523509959985 -3.8287196533387826 4.9461952289825781 -1.5021367462743851 -3.7723458398965173 4.8595442218956029 -1.5711211415527717 -3.7159720264542515 4.7728932148086276 -1.6401055368311586 -3.9962597581296055 4.940892737478606 -1.4335269093940106 -3.9398859446873407 4.8542417303916299 -1.5025113046723972 -3.8835121312450753 4.7675907233046546 -1.5714956999507841 -3.8271383178028096 4.6809397162176793 -1.6404800952291707 -4.1074260494781631 4.8489392388876578 -1.4339014677920228 -4.0510522360358987 4.7622882318006816 -1.5028858630704096 -3.9946784225936334 4.6756372247137064 -1.5718702583487962 -4.2185923408267207 4.7569857402967095 -1.4342760261900351 -4.1622185273844563 4.6703347332097334 -1.5032604214684218 -4.3297586321752792 4.6650322417057613 -1.4346505845880473 -4.4409249235238368 4.5730787431148121 -1.4350251429860597 -3.2128789055454114 4.7891871462638385 -1.8459358599035265 -3.3126969475936017 4.7065093437535763 -1.8463299181848765 -3.4846146719552529 4.6976287260011302 -1.7777125591688256 -3.4125149896417915 4.6238315412433142 -1.8467239764662267 -3.6565323963169045 4.6887481082486833 -1.7090952001527746 -3.5844327140034427 4.6149509234908681 -1.7781066174501756 -3.5123330316899812 4.5411537387330521 -1.8471180347475766 -3.7563504383650947 4.6060703057384211 -1.7094892584341246 -3.6842507560516329 4.5322731209806051 -1.7785006757315256 -3.6121510737381715 4.4584759362227899 -1.8475120930289268 -3.9282681627267459 4.5971896879859742 -1.6408718994180735 -3.8561684804132845 4.523392503228159 -1.7098833167154746 -3.7840687980998227 4.449595318470343 -1.7788947340128756 -4.1001858870883972 4.5883090702335281 -1.5722545404020227 -4.0280862047749357 4.514511885475712 -1.6412659576994235 -3.9559865224614748 4.4407147007178969 -1.7102773749968245 -3.8838868401480129 4.3669175159600808 -1.7792887922942258 -4.2721036114500484 4.579428452481082 -1.5036371813859717 -4.2000039291365878 4.5056312677232659 -1.5726485986833727 -4.1279042468231255 4.4318340829654499 -1.6416600159807737 -4.055804564509665 4.3580368982076347 -1.7106714332781747 -3.9837048821962027 4.2842397134498178 -1.7796828505755757 -4.371921653498239 4.4967506499708199 -1.5040312396673217 -4.2998219711847776 4.4229534652130038 -1.5730426569647227 -4.2277222888713162 4.3491562804551878 -1.6420540742621237 -4.1556226065578548 4.2753590956973717 -1.7110654915595247 -4.0835229242443924 4.2015619109395557 -1.7800769088569259 -2.5370571899084524 5.868479484679181 -1.4221563916145283 -2.4987323621007427 5.772546069773286 -1.4910915149527737 -2.4604075342930329 5.6766126548673927 -1.5600266382910191 -2.4220827064853232 5.5806792399614986 -1.6289617616292644 -2.3837578786776135 5.4847458250556054 -1.6978968849675098 -2.3454330508699037 5.3888124101497112 -1.7668320083057552 -2.6645043125341488 5.7982719615393483 -1.4233913525669153 -2.626179484726439 5.7023385466334533 -1.4923264759051607 -2.5878546569187293 5.6064051317275601 -1.561261599243406 -2.5495298291110196 5.5104717168216659 -1.6301967225816514 -2.5112050013033098 5.4145383019157727 -1.6991318459198967 -2.7919514351598451 5.7280644383995156 -1.4246263135193025 -2.7536266073521354 5.6321310234936206 -1.4935614368575476 -2.7153017795444256 5.5361976085877274 -1.562496560195793 -2.6769769517367159 5.4402641936818332 -1.6314316835340383 -2.6386521239290057 5.3443307787759409 -1.7003668068722839 -2.9193985577855415 5.6578569152596829 -1.4258612744716894 -2.8810737299778317 5.5619235003537879 -1.4947963978099348 -2.842748902170122 5.4659900854478947 -1.5637315211481801 -2.8044240743624123 5.3700566705420005 -1.6326666444864255 -3.0468456804112383 5.5876493921198502 -1.4270962354240766 -3.0085208526035285 5.4917159772139552 -1.4960313587623217 -2.9701960247958188 5.395782562308062 -1.5649664821005671 -3.1742928030369346 5.5174418689800175 -1.4283311963764636 -3.1359679752292249 5.4215084540741225 -1.4972663197147089 -3.301739925662631 5.4472343458401848 -1.4295661573288507 -3.2634150978549212 5.3513009309342907 -1.4985012806670959 -3.4291870482883273 5.3770268227003521 -1.4308011182812377 -2.3006845717029103 5.2962780513893053 -1.8357875347675676 -2.4711447242334774 5.3195231948615458 -1.7680724814791142 -2.4147969316233251 5.2331265785527803 -1.8370648502619427 -2.5852570841538922 5.2563717220250208 -1.7693497969734893 -2.5289092915437399 5.1699751057162553 -1.8383421657563175 -2.7557172366844602 5.2796168654972604 -1.7016347436850359 -2.699369444074307 5.1932202491884958 -1.7706271124678641 -2.6430216514641547 5.1068236328797303 -1.8396194812506925 -2.9261773892150278 5.3028620089694991 -1.6339196903965825 -2.869829596604875 5.2164653926607354 -1.7029120591794109 -2.8134818039947218 5.1300687763519708 -1.7719044279622391 -2.757134011384569 5.0436721600432053 -1.8408967967450676 -3.0966375417455954 5.3261071524417396 -1.5662046371081291 -3.0402897491354426 5.2397105361329741 -1.6351970058909575 -2.9839419565252898 5.1533139198242104 -1.7041893746737857 -2.9275941639151366 5.0669173035154458 -1.7731817434566139 -2.8712463713049834 4.9805206872066803 -1.8421741122394424 -3.2107499016660102 5.2629556796052146 -1.5674819526025041 -3.1544021090558574 5.1765590632964491 -1.6364743213853326 -3.0980543164457042 5.0901624469876854 -1.7054666901681608 -3.0417065238355514 5.0037658306789208 -1.774459058950989 -2.9853587312253982 4.9173692143701553 -1.8434514277338172 -3.3812100541965777 5.2862008230774533 -1.4997668993140507 -3.3248622615864249 5.1998042067686887 -1.5687592680968789 -3.2685144689762717 5.1134075904599241 -1.6377516368797074 -3.212166676366119 5.0270109741511604 -1.7067440056625356 -3.1558188837559658 4.9406143578423958 -1.7757363744453638 -3.0994710911458125 4.8542177415336303 -1.8447287432281922 -1.2641938868600766 6.2009572800594688 -1.4695413181460124 -1.2453998150556069 6.0995621405175626 -1.5383507616849634 -1.2266057432511377 5.9981670009756547 -1.6071602052239149 -1.2078116714466682 5.8967718614337477 -1.6759696487628661 -1.1890175996421988 5.7953767218918397 -1.7447790923018172 -1.1702235278377293 5.6939815823499327 -1.8135885358407684 -1.4047456467087867 6.1544735058780784 -1.472013574230068 -1.385951574904317 6.0530783663361722 -1.540823017769019 -1.3671575030998477 5.9516832267942643 -1.6096324613079702 -1.3483634312953783 5.8502880872523573 -1.6784419048469215 -1.3295693594909088 5.7488929477104493 -1.7472513483858725 -1.5452974065574967 6.107989731696688 -1.4744858303141235 -1.526503334753027 6.0065945921547819 -1.5432952738530745 -1.5077092629485578 5.9051994526128739 -1.6121047173920255 -1.4889151911440883 5.8038043130709669 -1.6809141609309768 -1.6858491664062067 6.0615059575152976 -1.4769580863981788 -1.6670550946017371 5.9601108179733915 -1.5457675299371298 -1.6482610227972678 5.8587156784314836 -1.6145769734760811 -1.8264009262549168 6.0150221833339073 -1.4794303424822344 -1.8076068544504471 5.9136270437920011 -1.5482397860211854 -1.7888127826459779 5.8122319042500932 -1.6170492295601364 -1.9669526861036266 5.9685384091525169 -1.4819025985662897 -1.9481586142991572 5.8671432696106098 -1.5507120421052407 -2.1262985177568066 6.0234497745130335 -1.415565411111394 -2.1075044459523364 5.9220546349711265 -1.4843748546503452 -2.2668502776055166 5.9769660003316432 -1.4180376671954495 -2.4074020374542262 5.9304822261502528 -1.4205099232795049 -1.3017491359087039 5.6501368316355851 -1.816124418622953 -1.4655822509585541 5.7037362263491769 -1.7497555996341398 -1.4272397730154627 5.6080565571221337 -1.8187028428209278 -1.6294153660084043 5.7573356210627669 -1.6833867806453269 -1.5910728880653129 5.6616559518357255 -1.7523340238321146 -1.5527304101222215 5.5659762826086823 -1.8212812670189023 -1.7549060031151633 5.7152553465493154 -1.6859652048433016 -1.7165635251720719 5.619575677322274 -1.7549124480300893 -1.6782210472289805 5.5238960080952317 -1.823859691216877 -1.9187391181650133 5.7688547412629063 -1.6195963858544884 -1.8803966402219221 5.6731750720358649 -1.6885436290412761 -1.8420541622788307 5.5774954028088235 -1.7574908722280638 -1.8037116843357393 5.4818157335817803 -1.8264381154148515 -2.0825722332148637 5.8224541359764981 -1.5532275668656752 -2.0442297552717723 5.7267744667494549 -1.6221748100524631 -2.0058872773286809 5.6310947975224135 -1.6911220532392508 -1.9675447993855897 5.5354151282953721 -1.7600692964260385 -1.9292023214424983 5.4397354590683298 -1.8290165396128262 -2.2464053482647137 5.8760535306900881 -1.4868587478768625 -2.2080628703216223 5.7803738614630467 -1.5558059910636499 -2.1697203923785309 5.6846941922360044 -1.6247532342504376 -2.1313779144354399 5.589014523008963 -1.6937004774372253 -2.0930354364923485 5.4933348537819207 -1.762647720624013 -2.054692958549257 5.3976551845548784 -1.8315949638108007 -2.3718959853714723 5.8339732561766375 -1.4894371720748369 -2.3335535074283813 5.7382935869495961 -1.5583844152616246 -2.2952110294852899 5.6426139177225529 -1.6273316584484123 -2.2568685515421985 5.5469342484955115 -1.6962789016352 -2.218526073599107 5.4512545792684701 -1.7652261448219877 -2.180183595656016 5.3555749100414278 -1.8341733880087754 -0.070188583680378391 6.3726017166784459 -1.4373986084646713 -0.071658285411809297 6.2698624962869403 -1.5059500399537076 -0.073127987143240647 6.1671232758954346 -1.5745014714427441 -0.074597688874671664 6.064384055503929 -1.6430529029317804 -0.076067390606102681 5.9616448351124243 -1.7116043344208169 -0.077537092337533753 5.8589056147209186 -1.7801557659098532 -0.2217298339463869 6.3516438441293595 -1.4414293039854102 -0.22319953567781792 6.2489046237378538 -1.5099807354744466 -0.22466923740924927 6.1461654033463482 -1.5785321669634831 -0.22613893914068023 6.0434261829548426 -1.6470835984525194 -0.22760864087211125 5.9406869625633378 -1.7156350299415559 -0.37327108421239541 6.330685971580273 -1.4454599995061492 -0.37474078594382654 6.2279467511887674 -1.5140114309951855 -0.37621048767525789 6.1252075307972618 -1.5825628624842221 -0.37768018940668879 6.022468310405757 -1.6511142939732584 -0.52481233447840403 6.3097280990311866 -1.4494906950268882 -0.52628203620983516 6.206988878639681 -1.5180421265159245 -0.5277517379412664 6.1042496582481762 -1.586593558004961 -0.52922143967269741 6.0015104378566706 -1.6551449894939974 -0.67635358474441298 6.2887702264821002 -1.4535213905476272 -0.67782328647584422 6.1860310060905945 -1.5220728220366635 -0.67929298820727535 6.0832917856990898 -1.5906242535257 -0.8278948350104216 6.2678123539330137 -1.4575520860683662 -0.82936453674185284 6.1650731335415081 -1.5261035175574025 -0.97943608527643011 6.2468544813839273 -1.4615827815891052 -0.22443213129633766 5.8383114417957733 -1.7842492115885449 -0.37818864157288712 5.9198043354308441 -1.719678707773701 -0.35934280226445792 5.8186553902437588 -1.7885045140866225 -0.51309931254100749 5.9001482838788295 -1.7239340102717786 -0.49425347323257829 5.7989993386917442 -1.7927598165847001 -0.66685582281755706 5.9816411775139011 -1.659363506456935 -0.64800998350912786 5.8804922323268149 -1.7281893127698562 -0.62916414420069866 5.7793432871397297 -1.7970151190827777 -0.82061233309410664 6.0631340711489727 -1.5947930026420916 -0.80176649378567744 5.9619851259618866 -1.6636188089550126 -0.78292065447724823 5.8608361807748004 -1.7324446152679338 -0.76407481516881903 5.7596872355877151 -1.8012704215808553 -0.9743688433706561 6.1446269647840435 -1.5302224988272479 -0.95552300406222701 6.0434780195969582 -1.5990483051401692 -0.93667716475379781 5.942329074409872 -1.6678741114530902 -0.91783132544536861 5.8411801292227858 -1.7366999177660114 -0.8989854861369394 5.7400311840356997 -1.8055257240789329 -1.1281253536472056 6.2261198584191142 -1.4656519950124043 -1.1092795143387764 6.1249709132320289 -1.5344778013253255 -1.0904336750303474 6.0238219680449427 -1.6033036076382468 -1.0715878357219182 5.9226730228578566 -1.672129413951168 -1.052741996413489 5.8215240776707713 -1.7409552202640892 -1.0338961571050598 5.7203751324836851 -1.8097810265770107 1.1684814502524097 6.2249412005317337 -1.4637837202996951 1.1469500205647412 6.1250003672780169 -1.5319790303312206 1.1254185908770729 6.0250595340243018 -1.600174340362746 1.1038871611894043 5.9251187007705859 -1.6683696503942713 1.0823557315017358 5.8251778675168699 -1.7365649604257969 1.0608243018140673 5.7252370342631531 -1.8047602704573222 1.0097631593108571 6.2326647105433555 -1.4690682630957728 0.98823172962318862 6.1327238772896386 -1.5372635731272983 0.96670029993552031 6.0327830440359236 -1.6054588831588237 0.94516887024785179 5.9328422107822076 -1.673654193190349 0.92363744056018326 5.8329013775284917 -1.7418495032218746 0.8510448683693046 6.2403882205549772 -1.4743528058918505 0.82951343868163607 6.1404473873012604 -1.542548115923376 0.80798200899396777 6.0405065540475453 -1.6107434259549014 0.78645057930629925 5.9405657207938294 -1.6789387359864267 0.69232657742775205 6.248111730566599 -1.4796373486879282 0.67079514774008353 6.148170897312883 -1.5478326587194537 0.64926371805241523 6.0482300640591671 -1.6160279687509791 0.55513971617386793 6.3557760738319367 -1.4167265814524805 0.53360828648619962 6.2558352405782207 -1.4849218914840059 0.5120768567985311 6.1558944073245048 -1.5531172015155315 0.39642142523231522 6.3634995838435584 -1.4220111242485582 0.37488999554464697 6.2635587505898425 -1.4902064342800836 0.23770313429076273 6.371223093855181 -1.427295667044636 0.2161717046030944 6.2712822606014651 -1.4954909770761613 0.078984843349210299 6.3789466038668028 -1.4325802098407137 0.9147869094945219 5.73136197891258 -1.8102784124214673 0.77495597555110662 5.8393596363335316 -1.7473189378192158 0.77358656364238021 5.7368771611809173 -1.8158856592719748 0.63512504160769123 5.9473572937544823 -1.6843594632169643 0.63375562969896482 5.8448748186018689 -1.7529261846697233 0.6323862177902384 5.7423923434492545 -1.8214929061224823 0.49529410766427601 6.0553549511754339 -1.6213999886147128 0.49392469575554959 5.9528724760228195 -1.6899667100674718 0.49255528384682307 5.8503900008702052 -1.7585334315202308 0.49118587193809671 5.7479075257175909 -1.8271001529729898 0.35546317372086045 6.1633526085963846 -1.5584405140124613 0.35409376181213409 6.0608701334437702 -1.6270072354652203 0.35272434990340767 5.9583876582911559 -1.6955739569179793 0.35135493799468126 5.8559051831385425 -1.7641406783707383 0.34998552608595485 5.7534227079859281 -1.8327073998234973 0.21426282786871878 6.1688677908647209 -1.5640477608629688 0.21289341595999237 6.0663853157121066 -1.6326144823157278 0.21152400405126598 5.9639028405594932 -1.7011812037684868 0.21015459214253956 5.8614203654068788 -1.7697479252212458 0.20878518023381318 5.7589378902542645 -1.8383146466740048 0.074431893925303583 6.2768654482856725 -1.5010882862607171 0.073062482016577029 6.1743829731330582 -1.5696550077134765 0.071693070107850629 6.0719004979804438 -1.6382217291662355 0.070323658199124242 5.9694180228278295 -1.7067884506189945 0.068954246290397855 5.8669355476752161 -1.7753551720717535 0.067584834381671469 5.7644530725226018 -1.8439218935245125 2.3902785643767355 5.9324388585656509 -1.4225901589757666 2.3497580854887024 5.8390290359913033 -1.4905035171438299 2.3092376066006688 5.7456192134169566 -1.558416875311893 2.2687171277126357 5.6522093908426099 -1.6263302334799565 2.2281966488246026 5.5587995682682623 -1.6942435916480199 2.187676169936569 5.4653897456939147 -1.762156949816083 2.2361530103321994 5.9712301459453974 -1.4277058721840967 2.1956325314441663 5.8778203233710506 -1.49561923035216 2.1551120525561327 5.784410500796703 -1.5635325885202231 2.1145915736680996 5.6910006782223563 -1.6314459466882867 2.0740710947800665 5.5975908556480087 -1.69935930485635 2.0335506158920329 5.5041810330736611 -1.7672726630244133 2.0820274562876633 6.0100214333251447 -1.4328215853924269 2.0415069773996302 5.9166116107507971 -1.5007349435604902 2.0009864985115966 5.8232017881764495 -1.5686483017285533 1.9604660196235635 5.7297919656021028 -1.6365616598966168 1.9199455407355304 5.6363821430277561 -1.7044750180646802 1.927901902243127 6.0488127207048921 -1.437937298600757 1.8873814233550936 5.9554028981305445 -1.5058506567688204 1.8468609444670603 5.8619930755561969 -1.5737640149368837 1.8063404655790272 5.7685832529818502 -1.641677373104947 1.7737763481985909 6.0876040080846385 -1.4430530118090872 1.7332558693105575 5.9941941855102909 -1.5109663699771505 1.6927353904225244 5.9007843629359433 -1.5788797281452138 1.619650794154055 6.126395295464385 -1.4481687250174173 1.5791303152660217 6.0329854728900383 -1.5160820831854807 1.4655252401095189 6.1651865828441323 -1.4532844382257475 2.1491958816436605 5.3713142970357479 -1.8301003391401809 2.0117815395285472 5.4046534376508593 -1.8354620377060442 1.8956790183384673 5.5376693563913735 -1.7726276308909721 1.8743671974134339 5.4379925782659706 -1.8408237362719075 1.7795764971483874 5.6706852751318877 -1.7097932240759 1.758264676223354 5.5710084970064848 -1.7779893294568354 1.7369528552983207 5.4713317188810819 -1.8461854348377711 1.6634739759583077 5.8037011938724019 -1.6469588172608278 1.6421621550332741 5.704024415746999 -1.7151549226417633 1.6208503341082408 5.6043476376215962 -1.7833510280226987 1.547371454768228 5.9367171126129161 -1.5841244104457557 1.5260596338431944 5.8370403344875132 -1.6523205158266911 1.5047478129181608 5.7373635563621104 -1.7205166212076266 1.4834359919931275 5.6376867782367075 -1.7887127265885623 1.4312689335781481 6.0697330313534295 -1.5212900036306836 1.4099571126531147 5.9700562532280275 -1.589486109011619 1.3886452917280812 5.8703794751026246 -1.6576822143925545 1.3673334708030476 5.7707026969772217 -1.7258783197734899 1.3460216498780142 5.6710259188518188 -1.7940744251544256 1.3151664123880682 6.2027489500939437 -1.4584555968156114 1.2938545914630348 6.1030721719685408 -1.5266517021965469 1.2725427705380015 6.0033953938431388 -1.5948478075774823 1.2512309496129679 5.9037186157177359 -1.6630439129584178 1.2299191286879343 5.8040418375923339 -1.7312400183393535 1.2086073077629009 5.7043650594669311 -1.7994361237202892 3.4364518442943961 5.3233038553136565 -1.4603129014781724 3.3786632861018453 5.2396872573240785 -1.5281151359567526 3.3208747279092954 5.1560706593345014 -1.5959173704353329 3.2630861697167446 5.0724540613449252 -1.6637196049139131 3.2052976115241942 4.9888374633553481 -1.7315218393924932 3.1475090533316434 4.905220865365771 -1.7993240738710734 3.2990766153929871 5.3905031489368467 -1.464001468412391 3.2412880572004363 5.3068865509472687 -1.5318037028909712 3.1834994990078864 5.2232699529576916 -1.5996059373695513 3.1257109408153356 5.1396533549681154 -1.6674081718481315 3.0679223826227853 5.0560367569785383 -1.7352104063267118 3.1617013864915782 5.4577024425600369 -1.4676900353466096 3.1039128282990274 5.3740858445704589 -1.5354922698251896 3.0461242701064775 5.2904692465808818 -1.6032945043037699 2.9883357119139267 5.2068526485913056 -1.6710967387823501 3.0243261575901692 5.5249017361832271 -1.471378602280828 2.9665375993976184 5.4412851381936491 -1.5391808367594082 2.9087490412050685 5.357668540204072 -1.6069830712379882 2.8869509286887602 5.5921010298064173 -1.4750671692150465 2.8291623704962094 5.5084844318168393 -1.5428694036936266 2.7495756997873513 5.6593003234296075 -1.4787557361492649 2.6917871415948009 5.5756837254400295 -1.5465579706278452 2.6699890290784927 5.810116215042374 -1.4146420686049033 2.6122004708859423 5.7264996170527978 -1.4824443030834835 2.5326138001770837 5.8773155086655642 -1.4183306355391219 3.021781431054416 4.966086394174015 -1.8030765847898276 2.9390638548329462 5.1186048174582695 -1.7389457289440284 2.8988788920259356 5.0254156921103244 -1.8068446050819147 2.8563462786114764 5.2711232407425248 -1.6748148730982293 2.8161613158044658 5.1779341153945788 -1.7427137492361156 2.7759763529974553 5.0847449900466337 -1.8106126253740018 2.773628702390007 5.4236416640267793 -1.6106840172524302 2.733443739582996 5.3304525386788342 -1.6785828933903164 2.693258776775985 5.2372634133308882 -1.7464817695282027 2.6530738139689745 5.1440742879829431 -1.8143806456660889 2.6507261633615267 5.4829709619630886 -1.6144520375445173 2.6105412005545157 5.3897818366151435 -1.6823509136824035 2.5703562377475047 5.2965927112671976 -1.7502497898202898 2.5301712749404941 5.2034035859192524 -1.818148665958176 2.5680085871400564 5.635489385247344 -1.5503211816987181 2.5278236243330463 5.5423002598993989 -1.6182200578366044 2.4876386615260353 5.4491111345514529 -1.6861189339744909 2.4474536987190243 5.3559220092035069 -1.7540178101123769 2.4072687359120137 5.2627328838555618 -1.8219166862502634 2.4852910109185866 5.7880078085315994 -1.4861903258529192 2.4451060481115756 5.6948186831836534 -1.5540892019908055 2.4049210853045655 5.6016295578357083 -1.6219880781286917 2.3647361224975545 5.5084404324877623 -1.689886954266578 2.3245511596905435 5.4152513071398163 -1.7577858304044642 2.2843661968835329 5.3220621817918712 -1.8256847065423505 4.4886771522153541 4.5247523284421307 -1.4397674112407353 4.4156825669802284 4.4539911460858601 -1.5075842923834872 4.3426879817451045 4.3832299637295904 -1.5754011735262392 4.2696933965099788 4.3124687813733198 -1.6432180546689912 4.1966988112748549 4.2417075990170501 -1.7110349358117432 4.1237042260397301 4.1709464166607804 -1.7788518169544951 4.3721929653715215 4.6161600827230771 -1.4419411980094166 4.2991983801363958 4.5453989003668065 -1.5097580791521685 4.2262037949012718 4.4746377180105368 -1.5775749602949205 4.153209209666147 4.4038765356542662 -1.6453918414376725 4.0802146244310222 4.3331153532979965 -1.7132087225804244 4.0072200391958974 4.2623541709417276 -1.7810256037231762 4.2557087785276888 4.7075678370040235 -1.4441149847780979 4.182714193292564 4.6368066546477529 -1.5119318659208498 4.1097196080574392 4.5660454722914832 -1.5797487470636018 4.0367250228223144 4.4952842899352126 -1.6475656282063538 3.96373043758719 4.4245231075789428 -1.7153825093491055 4.1392245916838561 4.7989755912849699 -1.4462887715467792 4.0662300064487313 4.7282144089286993 -1.5141056526895311 3.993235421213607 4.6574532265724295 -1.5819225338322831 3.9202408359784822 4.5866920442161598 -1.6497394149750348 4.0227404048400244 4.8903833455659163 -1.4484625583154604 3.9497458196048991 4.8196221632096456 -1.5162794394582122 3.8767512343697748 4.7488609808533759 -1.5840963206009642 3.9062562179961922 4.9817910998468626 -1.4506363450841415 3.8332616327610674 4.911029917490592 -1.5184532262268935 3.7897720311523599 5.073198854127809 -1.4528101318528228 3.7167774459172351 5.0024376717715393 -1.5206270129955746 3.6732878443085277 5.1646066084087554 -1.4549839186215039 4.0532190842283136 4.0981353734740162 -1.8466637227990905 3.9018550050511798 4.3446791479937223 -1.7831773453246291 3.8548937930846021 4.5096838999452444 -1.7175411338698745 3.7974521378406236 4.4262181705619073 -1.7853271793049224 3.8079325811180245 4.6746886518967656 -1.6519049224151199 3.750490925874046 4.5912229225134293 -1.7196909678501677 3.6930492706300675 4.5077571931300922 -1.7874770132852154 3.7609713691514468 4.8396934038482886 -1.5862687109603653 3.7035297139074683 4.7562276744649505 -1.6540547563954131 3.6460880586634898 4.6727619450816142 -1.7218408018304607 3.5886464034195114 4.5892962156982771 -1.7896268472655086 3.6565685019408907 4.9212324264164735 -1.5884185449406585 3.5991268466969122 4.8377666970331354 -1.6562045903757061 3.5416851914529337 4.7543009676497991 -1.723990635810754 3.4842435362089552 4.670835238266462 -1.7917766812458016 3.6096072899743135 5.0862371783679947 -1.5227823334859039 3.5521656347303345 5.0027714489846584 -1.5905683789209515 3.494723979486356 4.9193057196013203 -1.6583544243559993 3.4372823242423776 4.8358399902179841 -1.726140469791047 3.3798406689983986 4.7523742608346469 -1.7939265152260948 3.5626460780077358 5.2512419303195177 -1.4571461220311492 3.5052044227637569 5.1677762009361796 -1.5249321674661969 3.4477627675197788 5.0843104715528433 -1.5927182129012447 3.3903211122757999 5.0008447421695061 -1.6605042583362923 3.3328794570318214 4.917379012786169 -1.7282903037713402 3.2754378017878425 4.8339132834028318 -1.7960763492063878 5.2354522154783449 3.6425668712469177 -1.431299727089195 5.1500374679456886 3.5872675884607887 -1.4991848089035367 5.0646227204130341 3.5319683056746607 -1.5670698907178784 4.9792079728803778 3.4766690228885317 -1.6349549725322201 4.8937932253477223 3.4213697401024032 -1.7028400543465618 4.808378477815066 3.3660704573162752 -1.7707251361609033 5.1420172365311343 3.7539818178968072 -1.4323372739933722 5.0566024889984789 3.6986825351106782 -1.5002223558077139 4.9711877414658234 3.6433832523245502 -1.5681074376220556 4.8857729939331671 3.5880839695384212 -1.6359925194363973 4.8003582464005117 3.5327846867522927 -1.7038776012507388 5.0485822575839236 3.8653967645466967 -1.4333748208975494 4.9631675100512682 3.8100974817605677 -1.5012599027118911 4.8777527625186128 3.7547981989744397 -1.5691449845262329 4.7923380149859565 3.6994989161883112 -1.6370300663405744 4.9551472786367139 3.9768117111965862 -1.4344123678017267 4.8697325311040585 3.9215124284104572 -1.5022974496160684 4.784317783571403 3.8662131456243292 -1.5701825314304099 4.6989030360387467 3.8109138628382007 -1.6380676132447516 4.8617122996895041 4.0882266578464757 -1.4354499147059039 4.7762975521568478 4.0329273750603472 -1.5033349965202456 4.6908828046241924 3.9776280922742187 -1.5712200783345871 4.7682773207422935 4.1996416044963647 -1.4364874616100811 4.6828625732096381 4.1443423217102362 -1.5043725434244226 4.6748423417950837 4.3110565511462546 -1.4375250085142581 4.5814073628478731 4.4224714977961446 -1.4385625554184354 4.7295917899667614 3.3027936325641156 -1.8385681470688928 4.7183455558594805 3.4733906833821613 -1.7717410888689031 4.6457011259372152 3.4027210283441116 -1.8395451124457121 4.7070993217522004 3.6439877342002065 -1.7049140306689134 4.6344548918299342 3.5733180791621573 -1.7727180542457224 4.5618104619076689 3.5026484241241076 -1.8405220778225313 4.6232086577226532 3.7439151299802025 -1.7058909960457327 4.5505642278003879 3.6732454749421533 -1.7736950196225416 4.4779197978781227 3.6025758199041036 -1.8414990431993505 4.6119624236153722 3.9145121807982481 -1.639063937845743 4.5393179936931061 3.8438425257601985 -1.7068679614225519 4.4666735637708408 3.7731728707221492 -1.7746719849993609 4.3940291338485755 3.7025032156840996 -1.8424760085761698 4.6007161895080912 4.0851092316162942 -1.5722368796457533 4.5280717595858251 4.0144395765782441 -1.6400409032225622 4.4554273296635598 3.9437699215401945 -1.7078449267993712 4.3827828997412936 3.8731002665021452 -1.7756489503761801 4.3101384698190284 3.8024306114640956 -1.8434529739529888 4.5894699554008103 4.2557062824343399 -1.5054098214457636 4.5168255254785441 4.1850366273962898 -1.5732138450225726 4.4441810955562779 4.1143669723582397 -1.6410178685993815 4.3715366656340127 4.0436973173201904 -1.7088218921761904 4.2988922357117474 3.9730276622821408 -1.7766259157529991 4.2262478057894821 3.9023580072440915 -1.844429939329808 4.5055792913712631 4.3556336782143354 -1.5063867868225829 4.4329348614489978 4.2849640231762853 -1.5741908103993918 4.3602904315267308 4.2142943681382352 -1.6419948339762007 4.2876460016044655 4.143624713100186 -1.7097988575530094 4.2150015716822002 4.0729550580621368 -1.7776028811298183 4.142357141759935 4.0022854030240875 -1.845406904706627 5.869686689558459 2.515431916695273 -1.4282859931286724 5.774966125233008 2.4778726445987478 -1.4962606491962882 5.6802455609075571 2.4403133725022226 -1.5642353052639038 5.5855249965821061 2.4027541004056978 -1.6322099613315195 5.4908044322566543 2.3651948283091726 -1.7001846173991351 5.3960838679312033 2.3276355562126474 -1.7681592734667506 5.8012704522772331 2.642588331293247 -1.4285522854550512 5.7065498879517822 2.6050290591967213 -1.496526941522667 5.6118293236263312 2.5674697871001966 -1.5645015975902825 5.5171087593008803 2.5299105150036718 -1.6324762536578983 5.4223881949754285 2.4923512429071462 -1.7004509097255138 5.7328542149960073 2.769744745891221 -1.4288185777814302 5.6381336506705564 2.7321854737946953 -1.4967932338490459 5.5434130863451054 2.6946262016981706 -1.5647678899166613 5.4486925220196536 2.6570669296016454 -1.632742545984277 5.3539719576942026 2.6195076575051202 -1.7007172020518926 5.6644379777147815 2.896901160489195 -1.4290848701078089 5.5697174133893306 2.8593418883926693 -1.4970595261754247 5.4749968490638796 2.8217826162961446 -1.5650341822430403 5.3802762847384278 2.7842233441996194 -1.633008838310656 5.5960217404335557 3.024057575087169 -1.4293511624341879 5.5013011761081048 2.9864983029906433 -1.4973258185018037 5.4065806117826538 2.9489390308941181 -1.565300474569419 5.5276055031523299 3.1512139896851425 -1.4296174547605667 5.432884938826879 3.1136547175886169 -1.4975921108281824 5.338164374501428 3.0760954454920921 -1.565566766895798 5.4591892658711041 3.2783704042831161 -1.4298837470869457 5.3644687015456531 3.2408111321865909 -1.4978584031545614 5.3907730285898783 3.4055268188810901 -1.4301500394133244 5.303967350031642 2.2852883070289587 -1.8361073905503655 5.3276744538670258 2.4547794251791144 -1.7684254962547192 5.2425866220062165 2.3995087552100554 -1.836301980903339 5.2662937258416003 2.5689998733602111 -1.7686200866076927 5.1812058939807901 2.513729203391152 -1.8364965712563124 5.2900008296769832 2.7384909915103663 -1.7009381923120466 5.2049129978161739 2.6832203215413077 -1.7688146769606661 5.1198251659553637 2.6279496515722487 -1.8366911616092856 5.3137079335123669 2.9079821096605216 -1.6332562980164005 5.2286201016515577 2.852711439691463 -1.70113278266502 5.1435322697907484 2.7974407697224044 -1.7690092673136395 5.0584444379299383 2.7421700997533458 -1.836885751962259 5.2523272054869414 3.0222025578416183 -1.6334508883693739 5.1672393736261322 2.9669318878725597 -1.7013273730179932 5.082151541765322 2.9116612179035011 -1.7692038576666127 4.9970637099045128 2.8563905479344425 -1.8370803423152322 5.2760343093223252 3.191693675991774 -1.5657689940737276 5.1909464774615159 3.136423006022715 -1.6336454787223471 5.1058586456007058 3.0811523360536563 -1.7015219633709666 5.0207708137398965 3.0258816660845977 -1.7693984480195861 4.9356829818790864 2.9706109961155396 -1.8372749326682056 5.2997414131577081 3.3611847941419293 -1.4980870997780815 5.2146535812968997 3.3059141241728707 -1.565963584426701 5.1295657494360896 3.2506434542038116 -1.6338400690753205 5.0444779175752803 3.195372784234753 -1.7017165537239398 4.9593900857144702 3.1401021142656949 -1.7695930383725593 4.8743022538536609 3.0848314442966362 -1.8374695230211788 5.3234485169930927 3.5306759122920846 -1.4304052054824352 5.2383606851322826 3.4754052423230259 -1.4982816901310547 5.1532728532714742 3.4201345723539673 -1.5661581747796742 5.0681850214106641 3.3648639023849083 -1.6340346594282937 4.9830971895498539 3.3095932324158501 -1.7019111440769132 4.8980093576890447 3.2543225624467915 -1.7697876287255327 4.8129215258282345 3.1990518924777334 -1.8376641133741523 6.2554200729229503 1.286076400508541 -1.4302840110230146 6.1550958563821734 1.2675310545431964 -1.4983569087665221 6.0547716398413973 1.2489857085778517 -1.5664298065100293 5.9544474233006204 1.2304403626125071 -1.6345027042535367 5.8541232067598443 1.2118950166471623 -1.7025756019970442 5.7537989902190674 1.1933496706818176 -1.7706484997405514 6.2140526189660035 1.4237330118217111 -1.4300332926730732 6.1137284024252265 1.4051876658563665 -1.4981061904165807 6.0134041858844505 1.3866423198910218 -1.5661790881600879 5.9130799693436735 1.3680969739256772 -1.6342519859035953 5.8127557528028975 1.3495516279603323 -1.7023248836471028 5.7124315362621205 1.3310062819949877 -1.77039778139061 6.1726851650090566 1.5613896231348812 -1.4297825743231318 6.0723609484682797 1.5428442771695368 -1.4978554720666393 5.9720367319275036 1.5242989312041919 -1.5659283698101465 5.8717125153867267 1.5057535852388475 -1.6340012675536539 5.7713882988459506 1.4872082392735027 -1.7020741652971614 6.1313177110521098 1.6990462344480513 -1.4295318559731904 6.0309934945113328 1.6805008884827068 -1.4976047537166979 5.9306692779705568 1.661955542517362 -1.5656776514602051 5.8303450614297807 1.6434101965520176 -1.6337505492037125 6.0899502570951629 1.8367028457612213 -1.429281137623249 5.9896260405543869 1.8181574997958769 -1.4973540353667565 5.8893018240136108 1.7996121538305321 -1.5654269331102637 5.7889776074728339 1.7810668078651877 -1.6334998308537712 6.0485828031382161 1.9743594570743916 -1.4290304192733077 5.94825858659744 1.9558141111090472 -1.4971033170168149 5.8479343700566639 1.9372687651437026 -1.5651762147603223 6.0072153491812701 2.112016068387562 -1.4287797009233663 5.906891132640494 2.0934707224222175 -1.4968525986668735 5.9658478952243232 2.249672679700732 -1.4285289825734246 5.9244804412673764 2.3873292910139026 -1.4282782642234833 5.6541715950551472 1.1725701727269862 -1.8387091265004654 5.6170786453677533 1.2965218482631022 -1.8383831343809418 5.6743687902773017 1.4580673230001513 -1.7700888673270272 5.5799856956803602 1.4204735237992185 -1.8380571422614183 5.7316589351868492 1.6196127977372003 -1.7017946002731121 5.6372758405899086 1.5820189985362674 -1.7697628752075036 5.5428927459929662 1.5444251993353346 -1.8377311501418947 5.6945659854994561 1.7435644732733164 -1.7014686081535886 5.6001828909025146 1.7059706740723835 -1.7694368830879801 5.5057997963055731 1.6683768748714507 -1.8374051580223714 5.7518561304090046 1.9051099480103657 -1.633174341099674 5.6574730358120631 1.8675161488094325 -1.7011426160340652 5.5630899412151216 1.8299223496084998 -1.7691108909684565 5.4687068466181792 1.7923285504075668 -1.8370791659028478 5.809146275318553 2.0666554227474148 -1.5648800740457591 5.7147631807216115 2.0290616235464816 -1.6328483489801504 5.62038008612467 1.9914678243455486 -1.7008166239145417 5.5259969915277276 1.9538740251446158 -1.7687848988489332 5.4316138969307861 1.9162802259436829 -1.8367531737833245 5.8664364202281005 2.2282008974844634 -1.4965858069918445 5.7720533256311599 2.1906070982835306 -1.5645540819262356 5.6776702310342175 2.1530132990825974 -1.6325223568606271 5.583287136437276 2.1154194998816647 -1.7004906317950184 5.4889040418403345 2.0778257006807319 -1.7684589067294096 5.394520947243393 2.0402319014797987 -1.8364271816638009 5.8293434705407066 2.3521525730205797 -1.496259814872321 5.734960375943766 2.3145587738196465 -1.5642280898067122 5.6405772813468245 2.2769649746187137 -1.6321963647411035 5.546194186749883 2.239371175417781 -1.7001646396754948 5.4518110921529406 2.2017773762168478 -1.7681329146098863 5.3574279975559991 2.164183577015915 -1.8361011895442776 6.3818707420668597 0.0029678096146561472 -1.4356290328810457 6.2796856310575597 0.0044787833602843996 -1.5038075042126862 6.1775005200482607 0.005989757105912763 -1.5719859755443268 6.0753154090389607 0.0075007308515411264 -1.6401644468759673 5.9731302980296608 0.0090117045971694343 -1.7083429182076078 5.8709451870203608 0.01052267834279777 -1.7765213895392482 6.3686608120816901 0.14624122701398967 -1.4350268235479329 6.2664757010723902 0.14775220075961792 -1.5032052948795733 6.1642905900630911 0.1492631745052464 -1.571383766211214 6.0621054790537912 0.15077414825087471 -1.6395622375428545 5.9599203680444912 0.15228512199650307 -1.7077407088744949 5.8577352570351913 0.15379609574213143 -1.7759191802061352 6.3554508820965205 0.2895146444133232 -1.43442461421482 6.2532657710872206 0.29102561815895145 -1.5026030855464605 6.1510806600779215 0.29253659190457992 -1.5707815568781012 6.0488955490686216 0.29404756565020823 -1.6389600282097416 5.9467104380593216 0.29555853939583665 -1.7071384995413819 6.342240952111351 0.43278806181265672 -1.4338224048817072 6.240055841102051 0.43429903555828508 -1.5020008762133477 6.137870730092752 0.43581000930391345 -1.5701793475449881 6.035685619083452 0.43732098304954176 -1.6383578188766286 6.3290310221261814 0.57606147921199058 -1.4332201955485944 6.2268459111168815 0.57757245295761894 -1.5013986668802348 6.1246608001075824 0.57908342670324731 -1.5695771382118753 6.0224756890982816 0.58059440044887567 -1.6377556095435157 6.3158210921410118 0.7193348966113241 -1.4326179862154815 6.2136359811317119 0.72084587035695247 -1.500796457547122 6.1114508701224119 0.72235684410258094 -1.5689749288787622 6.3026111621558423 0.86260831401065763 -1.4320157768823687 6.2004260511465423 0.86411928775628599 -1.5001942482140089 6.2894012321706727 1.0058817314099913 -1.4314135675492556 6.2761913021855031 1.1491551488093248 -1.4308113582161428 5.7687947796139927 0.011708239606900372 -1.844698088011915 5.7571179562789974 0.14060585745423348 -1.8440175588026926 5.845478307751212 0.28813350106710656 -1.7752682871559153 5.745441132944002 0.26950347530156649 -1.8433370295934701 5.9338386592234267 0.43566114467997952 -1.7065190155091381 5.8338014844162167 0.41703111891443967 -1.7745877579466929 5.7337643096090076 0.3984010931488996 -1.8426565003842479 5.9221618358884314 0.56455876252731263 -1.7058384862999156 5.8221246610812223 0.54592873676177267 -1.7739072287374706 5.7220874862740123 0.5272987109962326 -1.8419759711750254 6.010522187360646 0.7120864061401857 -1.6370892146531382 5.9104850125534361 0.69345638037464563 -1.7051579570906932 5.810447837746227 0.67482635460910578 -1.7732266995282484 5.7104106629390179 0.65619632884356571 -1.8412954419658032 6.0988825388328607 0.85961404975305866 -1.5683399430063609 5.9988453640256507 0.84098402398751881 -1.6364086854439157 5.8988081892184416 0.82235399822197874 -1.7044774278814709 5.7987710144112317 0.8037239724564389 -1.7725461703190259 5.6987338396040226 0.78509394669089883 -1.8406149127565807 6.1872428903050745 1.0071416933659316 -1.4995906713595837 6.0872057154978654 0.98851166760039177 -1.5676594137971385 5.9871685406906563 0.96988164183485193 -1.6357281562346935 5.8871313658834463 0.95125161606931186 -1.7037968986722485 5.7870941910762372 0.9326215903037719 -1.7718656411098035 5.6870570162690282 0.91399156453823183 -1.8399343835473585 6.17556606697008 1.1360393112132647 -1.4989101421503612 6.075528892162871 1.1174092854477249 -1.566978884587916 5.975491717355661 1.098779259682185 -1.635047627025471 5.8754545425484519 1.080149233916645 -1.7031163694630262 5.7754173677412419 1.0615192081511049 -1.7711851119005813 5.6753801929340328 1.0428891823855648 -1.839253854338136 6.260323776983177 -1.1340072954065266 -1.4424105775796305 6.1601976714727282 -1.1128280318991071 -1.5107065065711929 6.0600715659622812 -1.0916487683916873 -1.5790024355627548 5.9599454604518325 -1.0704695048842676 -1.6472983645543169 5.8598193549413846 -1.0492902413768479 -1.7155942935458792 5.7596932494309367 -1.028110977869428 -1.7838902225374413 6.2756601195707757 -0.99111360701581563 -1.4415669735266383 6.175534014060327 -0.96993434350839614 -1.5098629025182004 6.07540790854988 -0.94875508000097641 -1.5781588315097625 5.9752818030394312 -0.9275758164935568 -1.6464547605013247 5.8751556975289834 -0.90639655298613686 -1.7147506894928868 6.2909964621583745 -0.84821991862510471 -1.4407233694736459 6.1908703566479257 -0.82704065511768521 -1.509019298465208 6.0907442511374787 -0.80586139161026549 -1.5773152274567703 5.99061814562703 -0.78468212810284577 -1.6456111564483324 6.3063328047459732 -0.70532623023439378 -1.4398797654206537 6.2062066992355245 -0.68414696672697417 -1.5081756944122158 6.1060805937250775 -0.66296770321955456 -1.5764716234037779 6.0059544882146287 -0.64178843971213484 -1.64476755239534 6.321669147333572 -0.56243254184368296 -1.4390361613676612 6.2215430418231232 -0.54125327833626335 -1.5073320903592233 6.1214169363126762 -0.52007401482884374 -1.5756280193507857 6.3370054899211707 -0.41953885345297198 -1.438192557314669 6.236879384410722 -0.39835958994555232 -1.5064884863062311 6.3523418325087695 -0.27664516506226122 -1.4373489532616766 6.2522157269983216 -0.2554659015548415 -1.5056448822532387 6.3676781750963682 -0.13375147667155043 -1.4365053492086843 5.7743896999931676 -0.89237796824786941 -1.7830029374582053 5.890366978881711 -0.76490235590627698 -1.7138985483697859 5.7884696694924918 -0.76354365822520032 -1.7820735694580701 5.9044469483810351 -0.63606804588360788 -1.7129691803696507 5.8025496389918159 -0.63470934820253122 -1.7811442014579348 6.0204242272695794 -0.50859243354201533 -1.6438647912812314 5.9185269178803592 -0.50723373586093889 -1.7120398123695155 5.81662960849114 -0.50587503817986212 -1.7802148334577996 6.1364015061581227 -0.38111682120042278 -1.5747604021928121 6.0345041967689035 -0.37975812351934618 -1.6429354232810962 5.9326068873796833 -0.37839942583826969 -1.7111104443693803 5.8307095779904641 -0.37704072815719303 -1.7792854654576644 5.728812268601243 -0.37568203047611654 -1.8474604865459487 6.1504814756574469 -0.2522825111777538 -1.5738310341926769 6.0485841662682276 -0.25092381349667719 -1.642006055280961 5.9466868568790074 -0.24956511581560065 -1.7101810763692451 5.8447895474897873 -0.24820641813452402 -1.7783560974575292 5.7428922381005671 -0.24684772045344749 -1.8465311185458135 6.2664587545459902 -0.12480689883616138 -1.5047266451042576 6.164561445156771 -0.12344820115508479 -1.5729016661925417 6.0626641357675517 -0.12208950347400821 -1.6410766872808258 5.9607668263783316 -0.12073080579293163 -1.7092517083691099 5.8588695169891114 -0.119372108111855 -1.777426729457394 5.7569722075998913 -0.11801341043077845 -1.8456017505456783 5.8939292809281323 -2.3689332629668645 -1.4514928078928169 5.7997134756123918 -2.3284468630693231 -1.5199173686907692 5.7054976702966504 -2.2879604631717827 -1.5883419294887218 5.61128186498091 -2.2474740632742414 -1.6567664902866743 5.5170660596651695 -2.2069876633767009 -1.7251910510846269 5.422850254349429 -2.1665012634791596 -1.7936156118825792 5.9372782579303882 -2.2312529040548279 -1.450475024307107 5.8430624526146477 -2.1907665041572866 -1.5188995851050593 5.7488466472989073 -2.1502801042597461 -1.5873241459030119 5.6546308419831668 -2.1097937043622048 -1.6557487067009644 5.5604150366674254 -2.0693073044646644 -1.724173267498917 5.9806272349326441 -2.0935725451427913 -1.449457240721397 5.8864114296169037 -2.05308614524525 -1.5178818015193494 5.7921956243011632 -2.0125997453477091 -1.5863063623173019 5.6979798189854227 -1.9721133454501683 -1.6547309231152545 6.023976211934901 -1.9558921862307546 -1.4484394571356871 5.9297604066191605 -1.9154057863332132 -1.5168640179336395 5.83554460130342 -1.8749193864356724 -1.585288578731592 5.7413287959876795 -1.8344329865381317 -1.6537131395295446 6.0673251889371578 -1.8182118273187173 -1.4474216735499772 5.9731093836214173 -1.777725427421176 -1.5158462343479295 5.8788935783056759 -1.7372390275236351 -1.5842707951458821 6.1106741659394137 -1.6805314684066806 -1.4464038899642673 6.0164583606236732 -1.6400450685091392 -1.5148284507622196 6.1540231429416696 -1.5428511094946438 -1.4453861063785571 6.0598073376259292 -1.5023647095971024 -1.5138106671765097 6.1973721199439264 -1.405170750582607 -1.4443683227928472 5.4645293511570721 -2.0345224864176252 -1.7925594865726577 5.6037573812137955 -1.931649591183271 -1.7231553316269559 5.5038387286650066 -1.9106347979225566 -1.7914489506983484 5.64306675872173 -1.8077619026882021 -1.7220447957526466 5.5431481061729411 -1.7867471094274878 -1.7903384148240391 5.7822947887784535 -1.7048890074538479 -1.6526406408069449 5.6823761362296645 -1.6838742141931333 -1.7209342598783373 5.5824574836808747 -1.6628594209324192 -1.7892278789497298 5.9215228188351778 -1.6020161122194934 -1.5832364858612431 5.821604166286388 -1.581001318958779 -1.6515301049326356 5.721685513737599 -1.5599865256980645 -1.7198237240040279 5.6217668611888092 -1.5389717324373504 -1.7881173430754205 5.9608321963431123 -1.4781284237244248 -1.5821259499869338 5.8609135437943225 -1.4571136304637102 -1.6504195690583263 5.7609948912455327 -1.4360988372029959 -1.7187131881297186 5.6610762386967428 -1.4150840439422816 -1.7870068072011112 6.1000602263998358 -1.3752555284900703 -1.5127217950412322 6.0001415738510469 -1.354240735229356 -1.5810154141126245 5.9002229213022561 -1.3332259419686416 -1.6493090331840168 5.8003042687534672 -1.3122111487079273 -1.7176026522554093 5.7003856162046773 -1.291196355447213 -1.7858962713268016 6.2392882564565602 -1.2723826332557158 -1.4433176400955303 6.1393696039077703 -1.2513678399950017 -1.5116112591669228 6.0394509513589805 -1.2303530467342874 -1.5799048782383149 5.9395322988101906 -1.2093382534735728 -1.6481984973097075 5.8396136462614008 -1.1883234602128585 -1.7164921163810998 5.7396949937126109 -1.1673086669521442 -1.7847857354524923 5.2843353038392067 -3.5046971472052073 -1.4617877116532763 5.1994925240577041 -3.4467697053834359 -1.5303599647328412 5.1146497442762007 -3.3888422635616644 -1.5989322178124061 5.0298069644946972 -3.3309148217398925 -1.6675044708919713 4.9449641847131947 -3.2729873799181215 -1.7360767239715362 4.8601214049316912 -3.21505993809635 -1.8046489770511014 5.3539871225876237 -3.3779932138751088 -1.4606465808244637 5.2691443428061211 -3.3200657720533373 -1.5292188339040287 5.1843015630246176 -3.2621383302315663 -1.5977910869835936 5.0994587832431142 -3.2042108884097944 -1.6663633400631588 5.0146160034616116 -3.1462834465880229 -1.7349355931427239 5.4236389413360406 -3.2512892805450102 -1.4595054499956512 5.3387961615545372 -3.1933618387232392 -1.5280777030752162 5.2539533817730346 -3.1354343969014682 -1.5966499561547811 5.1691106019915312 -3.0775069550796963 -1.6652222092343463 5.0842678222100286 -3.0195795132579248 -1.7337944623139114 5.4932907600844576 -3.1245853472149121 -1.4583643191668387 5.4084479803029542 -3.0666579053931411 -1.5269365722464037 5.3236052005214516 -3.0087304635713696 -1.5955088253259686 5.2387624207399472 -2.9508030217495977 -1.664081078405534 5.5629425788328737 -2.997881413884814 -1.4572231883380262 5.4780997990513711 -2.9399539720630425 -1.5257954414175912 5.3932570192698677 -2.8820265302412711 -1.5943676944971563 5.6325943975812898 -2.8711774805547159 -1.4560820575092137 5.5477516177997872 -2.8132500387329444 -1.5246543105887786 5.7022462163297067 -2.7444735472246173 -1.4549409266804012 5.6174034365482033 -2.6865461054028459 -1.5235131797599664 5.7718980350781228 -2.6177696138945192 -1.4537997958515887 4.9277765805153546 -3.092194354866669 -1.8034752803071714 4.9909286858590285 -2.9779854812649109 -1.8022281369876132 5.148110707156043 -2.9040426838136719 -1.7325585858397723 5.0540807912027024 -2.8637766076631528 -1.800980993668055 5.3052927284530567 -2.8300998863624334 -1.6628890346919314 5.2112628124997169 -2.7898338102119138 -1.7313114425202141 5.1172328965463771 -2.7495677340613947 -1.7997338503484968 5.4624747497500712 -2.7561570889111948 -1.5932194835440903 5.3684448337967305 -2.7158910127606752 -1.6616418913723732 5.2744149178433908 -2.6756249366101557 -1.7300642992006559 5.180385001890051 -2.6353588604596365 -1.7984867070289385 5.5256268550937451 -2.6419482153094362 -1.5919723402245323 5.4315969391404053 -2.6016821391589167 -1.660394748052815 5.3375670231870656 -2.5614160630083971 -1.7288171558810976 5.2435371072337258 -2.5211499868578779 -1.7972395637093803 5.6828088763907596 -2.5680054178581977 -1.5223027890766914 5.588778960437419 -2.5277393417076781 -1.590725196904974 5.4947490444840792 -2.4874732655571585 -1.6591476047332567 5.4007191285307394 -2.4472071894066389 -1.7275700125615396 5.3066892125773997 -2.4069411132561198 -1.7959924203898223 5.8399908976877732 -2.4940626204069591 -1.4526332379288505 5.7459609817344335 -2.4537965442564391 -1.5210556457571331 5.6519310657810928 -2.41353046810592 -1.5894780535854161 5.5579011498277531 -2.3732643919554004 -1.6579004614136987 5.4638712338744142 -2.3329983158048808 -1.7263228692419814 5.3698413179210744 -2.2927322396543617 -1.7947452770702641 4.5472456428625536 -4.3861112895456236 -1.4717800022137042 4.4750804094232812 -4.3126707320762492 -1.5405155544269371 4.4029151759840079 -4.2392301746068748 -1.60925110664017 4.3307499425447347 -4.1657896171375013 -1.6779866588534029 4.2585847091054623 -4.0923490596681278 -1.7467222110666358 4.6409241036041644 -4.2748669133698565 -1.470543433626045 4.568758870164892 -4.2014263559004821 -1.5392789858392779 4.4965936367256187 -4.1279857984311077 -1.6080145380525108 4.4244284032863455 -4.0545452409617342 -1.6767500902657437 4.3522631698470731 -3.9811046834923602 -1.7454856424789766 4.7346025643457752 -4.1636225371940885 -1.4693068650383858 4.6624373309065028 -4.090181979724715 -1.5380424172516187 4.5902720974672295 -4.0167414222553406 -1.6067779694648516 4.5181068640279562 -3.9433008647859666 -1.6755135216780845 4.828281025087386 -4.0523781610183214 -1.4680702964507266 4.7561157916481136 -3.9789376035489474 -1.5368058486639595 4.6839505582088403 -3.905497046079573 -1.6055414008771924 4.9219594858289977 -3.9411337848425534 -1.4668337278630674 4.8497942523897244 -3.8676932273731799 -1.5355692800763003 4.777629018950452 -3.7942526699038051 -1.6043048322895332 5.0156379465706085 -3.8298894086667858 -1.465597159275408 4.9434727131313352 -3.7564488511974123 -1.5343327114886411 5.1093164073122193 -3.7186450324910183 -1.4643605906877488 4.1848290733966529 -4.0208953723370966 -1.8154369095739367 4.2695935769629614 -3.9207870940312368 -1.814083459210398 4.4390929253730169 -3.8784163111276864 -1.7441592721554173 4.3543580805292699 -3.820678815725377 -1.8127300088468594 4.6085922737830725 -3.8360455282241359 -1.6742350851004366 4.5238574289393254 -3.778308032821827 -1.7428058217918785 4.4391225840955784 -3.7205705374195173 -1.8113765584833208 4.6933567773493809 -3.7359372499182766 -1.672881634736898 4.608621932505633 -3.6781997545159673 -1.7414523714283399 4.523887087661886 -3.6204622591136579 -1.810023108119782 4.8628561257594356 -3.6935664670147261 -1.6029574476819171 4.7781212809156886 -3.6358289716124172 -1.6715281843733591 4.6933864360719415 -3.5780914762101079 -1.740098921064801 4.6086515912281936 -3.5203539808077986 -1.8086696577562433 5.0323554741694911 -3.6511956841111761 -1.5330332606269363 4.9476206293257441 -3.5934581887088668 -1.6016039973183784 4.862885784481997 -3.5357206933065575 -1.6701747340098205 4.7781509396382491 -3.4779831979042486 -1.7387454707012624 4.6934160947945021 -3.4202457025019388 -1.8073162073927045 5.2018548225795458 -3.6088249012076257 -1.4631090735719559 5.1171199777357996 -3.5510874058053168 -1.5316798102633977 5.0323851328920526 -3.493349910403007 -1.6002505469548396 4.9476502880483046 -3.4356124150006981 -1.6688212836462817 4.8629154432045576 -3.3778749195983888 -1.7373920203377236 4.7781805983608097 -3.320137424196079 -1.8059627570291659 3.6020491373788843 -5.3005304551954291 -1.4147816697515094 3.545349610214505 -5.2142830937480351 -1.4836953038120817 3.4886500830501253 -5.128035732300642 -1.5526089378726537 3.4319505558857459 -5.041788370853248 -1.6215225719332258 3.3752510287213662 -4.9555410094058541 -1.6904362059937978 3.3185515015569869 -4.8692936479584592 -1.7593498400543699 3.2618519743926067 -4.7830462865110652 -1.8282634741149419 3.6599503462215619 -5.1227640136582453 -1.4823815313220259 3.6032508190571821 -5.0365166522108513 -1.5512951653825979 3.5465512918928024 -4.9502692907634573 -1.62020879944317 3.4898517647284231 -4.8640219293160634 -1.689122433503742 3.4331522375640433 -4.7777745678686685 -1.7580360675643141 3.7745510822286183 -5.0312449335684555 -1.4810677588319701 3.7178515550642386 -4.9449975721210606 -1.5499813928925421 3.6611520278998593 -4.8587502106736666 -1.6188950269531142 3.6044525007354795 -4.7725028492262727 -1.6878086610136862 3.8891518182356752 -4.9397258534786648 -1.4797539863419142 3.8324522910712955 -4.8534784920312699 -1.5486676204024863 3.7757527639069157 -4.7672311305838759 -1.6175812544630583 4.0037525542427321 -4.848206773388875 -1.4784402138518584 3.9470530270783524 -4.7619594119414801 -1.5473538479124305 3.8903534999139726 -4.6757120504940861 -1.6162674819730025 4.1183532902497886 -4.7566876932990843 -1.4771264413618026 4.0616537630854088 -4.6704403318516894 -1.5460400754223746 4.232954026256845 -4.6651686132092944 -1.4758126688717468 4.3475547622639024 -4.5736495331195037 -1.4744988963816907 3.3655846322893446 -4.7006902282495737 -1.8268231567112649 3.5413081888248916 -4.6916891718864786 -1.7566472537724993 3.4692048271251568 -4.6184289890970058 -1.8253815298186253 3.7170317453604382 -4.6826881155233835 -1.6864713508337339 3.6449283836607038 -4.6094279327339107 -1.7552056268798597 3.572825021960969 -4.5361677499444379 -1.8239399029259857 3.8206519401962504 -4.6004268763708156 -1.6850297239410943 3.748548578496516 -4.5271666935813428 -1.7537639999872201 3.6764452167967812 -4.4539065107918701 -1.8224982760333461 3.996375496731797 -4.5914258200077214 -1.6148538210023284 3.9242721350320626 -4.5181656372182477 -1.6835880970484547 3.8521687733323282 -4.4449054544287749 -1.7523223730945805 3.7800654116325934 -4.3716452716393022 -1.8210566491407065 4.1720990532673436 -4.5824247636446263 -1.5446779180635628 4.0999956915676092 -4.5091645808551535 -1.6134121941096888 4.0278923298678748 -4.4359043980656798 -1.6821464701558151 3.9557889681681404 -4.362644215276207 -1.7508807462019409 3.8836856064684055 -4.2893840324867352 -1.8196150222480669 4.2757192481031563 -4.5001635244920584 -1.5432362911709232 4.203615886403421 -4.4269033417025856 -1.6119705672170492 4.1315125247036866 -4.3536431589131128 -1.6807048432631755 4.0594091630039522 -4.28038297612364 -1.7494391193093013 3.9873058013042177 -4.2071227933341673 -1.8181733953554273 4.4514428046387033 -4.4911624681289641 -1.4730603882321576 4.3793394429389689 -4.4179022853394914 -1.5417946642782836 4.3072360812392336 -4.3446421025500177 -1.6105289403244094 4.2351327195394992 -4.2713819197605449 -1.6792632163705357 4.1630293578397648 -4.198121736971073 -1.7479974924166619 4.0909259961400295 -4.1248615541816003 -1.8167317684627877 2.5617399024746916 -5.8492467858019879 -1.4257325825793929 2.5220627109937475 -5.7537471985413866 -1.4948388474072112 2.4823855195128028 -5.6582476112807853 -1.5639451122350292 2.4427083280318587 -5.562748024020185 -1.6330513770628474 2.403031136550914 -5.4672484367595846 -1.7021576418906659 2.3633539450699694 -5.3717488494989842 -1.7712639067184841 2.6925035999353932 -5.7816674305671274 -1.4243616204692922 2.6528264084544486 -5.6861678433065261 -1.4934678852971104 2.613149216973504 -5.5906682560459249 -1.5625741501249286 2.5734720254925598 -5.4951686687853245 -1.6316804149527468 2.5337948340116156 -5.3996690815247232 -1.7007866797805651 2.8232672973960944 -5.7140880753322669 -1.4229906583591914 2.7835901059151498 -5.6185884880716657 -1.4920969231870096 2.7439129144342056 -5.5230889008110644 -1.5612031880148278 2.704235722953261 -5.427589313550464 -1.6303094528426461 2.6645585314723168 -5.3320897262898628 -1.6994157176704645 2.9540309948567955 -5.6465087200974056 -1.4216196962490906 2.9143538033758509 -5.5510091328368052 -1.490725961076909 2.8746766118949068 -5.4555095455762039 -1.5598322259047273 2.8349994204139626 -5.3600099583156036 -1.6289384907325455 3.0847946923174971 -5.5789293648625442 -1.4202487341389898 3.0451175008365525 -5.4834297776019438 -1.4893549989668082 3.0054403093556084 -5.3879301903413426 -1.5584612637946265 3.2155583897781983 -5.5113500096276837 -1.4188777720288892 3.1758811982972541 -5.4158504223670834 -1.4879840368567077 3.3463220872388995 -5.4437706543928233 -1.4175068099187886 3.3066448957579553 -5.348271067132222 -1.4866130747466069 3.4770857846996011 -5.3761912991579619 -1.4161358478086878 2.3146080254543624 -5.281271060384916 -1.8402668669915698 2.4898791087621359 -5.3065165776375336 -1.7698446622211317 2.4332006850216037 -5.2204314038847812 -1.8387572610020246 2.6084717683293772 -5.2456769211373988 -1.7683350562315865 2.551793344588845 -5.1595917473846455 -1.8372476550124794 2.7837428516371507 -5.2709224383900155 -1.6979128514611486 2.7270644278966185 -5.184837264637264 -1.7668254502420413 2.6703860041560863 -5.0987520908845108 -1.8357380490229342 2.9590139349449238 -5.296167955642634 -1.6274906466907104 2.902335511204392 -5.2100827818898807 -1.6964032454716034 2.8456570874638598 -5.1239976081371283 -1.7653158442524961 2.7889786637233276 -5.037912434384376 -1.8342284430333891 3.1342850182526973 -5.3214134728952507 -1.5570684419202725 3.0776065945121651 -5.2353282991424992 -1.6259810407011652 3.0209281707716333 -5.1492431253897459 -1.6948936394820582 2.9642497470311011 -5.0631579516369936 -1.7638062382629509 2.9075713232905689 -4.9770727778842403 -1.8327188370438436 3.2528776778199386 -5.2605738163951159 -1.5555588359307273 3.1961992540794064 -5.1744886426423644 -1.62447143471162 3.1395208303388746 -5.0884034688896111 -1.693384033492513 3.0828424065983424 -5.0023182951368579 -1.7622966322734057 3.0261639828578102 -4.9162331213841055 -1.8312092310542984 3.4281487611277117 -5.2858193336477335 -1.4851366311602894 3.3714703373871799 -5.1997341598949811 -1.5540492299411819 3.3147919136466477 -5.1136489861422296 -1.6229618287220746 3.2581134899061159 -5.0275638123894764 -1.6918744275029676 3.2014350661655837 -4.9414786386367231 -1.7607870262838603 3.1447566424250515 -4.8553934648839698 -1.829699625064753 1.2745005007633581 -6.2457866372804478 -1.4387296510408276 1.2542414371841275 -6.1440982120082159 -1.5080130585857017 1.2339823736048965 -6.0424097867359841 -1.5772964661305757 1.2137233100256659 -5.9407213614637522 -1.6465798736754498 1.1934642464464353 -5.8390329361915203 -1.7158632812203241 1.1732051828672048 -5.7373445109192884 -1.7851466887651981 1.4192877198366847 -6.204119584988435 -1.4372816657360574 1.3990286562574543 -6.1024311597162031 -1.5065650732809315 1.3787695926782235 -6.0007427344439712 -1.5758484808258055 1.3585105290989927 -5.8990543091717393 -1.6451318883706796 1.3382514655197622 -5.7973658838995075 -1.7144152959155539 1.3179924019405316 -5.6956774586272756 -1.7836987034604279 1.5640749389100115 -6.1624525326964221 -1.435833680431287 1.5438158753307811 -6.0607641074241903 -1.5051170879761613 1.5235568117515503 -5.9590756821519584 -1.5744004955210353 1.5032977481723195 -5.8573872568797274 -1.6436839030659094 1.483038684593089 -5.7556988316074955 -1.7129673106107834 1.7088621579833383 -6.1207854804044093 -1.4343856951265168 1.6886030944041079 -6.0190970551321774 -1.5036691026713909 1.6683440308248771 -5.9174086298599464 -1.5729525102162649 1.6480849672456463 -5.8157202045877145 -1.6422359177611392 1.8536493770566653 -6.0791184281123964 -1.4329377098217464 1.8333903134774348 -5.9774300028401646 -1.5022211173666207 1.813131249898204 -5.8757415775679336 -1.5715045249114947 1.9984365961299921 -6.0374513758203836 -1.4314897245169762 1.9781775325507616 -5.9357629505481526 -1.5007731320618503 1.9579184689715308 -5.8340745252759216 -1.5700565396067243 2.1432238152033189 -5.9957843235283717 -1.4300417392122058 2.1229647516240884 -5.8940958982561398 -1.4993251467570801 2.2880110342766455 -5.9541172712363588 -1.4285937539074356 1.4489352750799176 -5.6584064398180667 -1.7821245328682691 1.6192247628235994 -5.7167629233735511 -1.7114409295887796 1.5795476856657058 -5.6212403536981563 -1.7805473502513822 1.7895142505672812 -5.7751194069290364 -1.6407573263092903 1.7498371734093876 -5.6795968372536407 -1.7098637469718927 1.710160096251494 -5.584074267578246 -1.7789701676344951 1.9201266611530692 -5.737953320809126 -1.6391801436924034 1.8804495839951756 -5.6424307511337304 -1.7082865643550058 1.840772506837282 -5.5469081814583356 -1.7773929850176082 1.8010954296793886 -5.4513856117829427 -1.8464994056802104 2.0904161488967512 -5.7963098043646095 -1.5684965404129141 2.0507390717388576 -5.7007872346892157 -1.6376029610755163 2.0110619945809636 -5.60526466501382 -1.7067093817381187 1.9713849174230702 -5.5097420953384262 -1.7758158024007211 1.9317078402651768 -5.4142195256630323 -1.8449222230633235 2.260705636640433 -5.8546662879200939 -1.4978129371334246 2.221028559482539 -5.7591437182446992 -1.566919357796027 2.1813514823246458 -5.6636211485693053 -1.6360257784586294 2.1416744051667518 -5.5680985788939106 -1.7051321991212318 2.1019973280088582 -5.4725760092185158 -1.7742386197838342 2.062320250850965 -5.377053439543122 -1.8433450404464364 2.4309951243841144 -5.9130227714755783 -1.4271293338539353 2.3913180472262208 -5.8175002018001836 -1.4962357545165377 2.3516409700683272 -5.7219776321247888 -1.5653421751791401 2.3119638929104336 -5.626455062449395 -1.6344485958417423 2.27228681575254 -5.5309324927740002 -1.7035550165043447 2.2326097385946464 -5.4354099230986064 -1.7726614371669471 2.1929326614367528 -5.3398873534232116 -1.8417678578295495 0.070728626250556648 -6.3525182740059618 -1.4507823957128243 0.069994805888240585 -6.24866583090063 -1.5202226723007852 0.069260985525924745 -6.1448133877952991 -1.5896629488887459 0.068527165163608683 -6.0409609446899681 -1.6591032254767066 0.067793344801292621 -5.9371085015846372 -1.7285435020646676 0.067059524438976587 -5.8332560584793063 -1.7979837786526285 0.22225126987466626 -6.3398409402442653 -1.4492814366057121 0.2215174495123502 -6.2359884971389334 -1.518721713193673 0.22078362915003424 -6.1321360540336025 -1.5881619897816337 0.22004980878771824 -6.0282836109282716 -1.6576022663695944 0.21931598842540223 -5.9244311678229407 -1.7270425429575555 0.37377391349877587 -6.3271636064825687 -1.4477804774985998 0.3730400931364598 -6.2233111633772369 -1.5172207540865608 0.3723062727741438 -6.119458720271906 -1.5866610306745215 0.37157245241182779 -6.0156062771665741 -1.6561013072624824 0.52529655712288548 -6.3144862727208722 -1.4462795183914876 0.52456273676056941 -6.2106338296155403 -1.5157197949794485 0.52382891639825335 -6.1067813865102094 -1.5851600715674092 0.52309509603593729 -6.0029289434048776 -1.6546003481553702 0.67681920074699542 -6.3018089389591747 -1.4447785592843754 0.67608538038467936 -6.1979564958538429 -1.5142188358723363 0.67535156002236318 -6.094104052748512 -1.5836591124602972 0.82834184437110503 -6.2891316051974782 -1.4432776001772634 0.82760802400878886 -6.1852791620921463 -1.5127178767652241 0.97986448799521464 -6.2764542714357807 -1.4417766410701511 1.1313871316193242 -6.2637769376740842 -1.4402756819630391 0.21168143614577928 -5.8213413499117159 -1.7964273858264646 0.36907099225545426 -5.911949182418085 -1.7255273843642289 0.34881352786937037 -5.8102543688210027 -1.7948108271249015 0.50620308397904545 -5.9008622013273717 -1.7239108256626658 0.48594561959296156 -5.7991673877302885 -1.7931942684233384 0.66359264008872054 -5.9914700338337417 -1.6530108242004304 0.64333517570263665 -5.8897752202366584 -1.7222942669611028 0.62307771131655276 -5.7880804066395752 -1.7915777097217753 0.82098219619839552 -6.0820778663401116 -1.5821108227381948 0.80072473181231163 -5.9803830527430284 -1.6513942654988674 0.78046726742622785 -5.8786882391459443 -1.7206777082595397 0.76020980304014385 -5.7769934255488611 -1.7899611510202122 0.97837175230807061 -6.1726856988464816 -1.5112108212759594 0.95811428792198661 -6.0709908852493983 -1.5804942640366317 0.93785682353590272 -5.9692960716523151 -1.6497777067973043 0.91759935914981894 -5.867601258055231 -1.7190611495579766 0.89734189476373505 -5.7659064444581478 -1.7883445923186492 1.1155038440316618 -6.1615987177557683 -1.5095942625743963 1.0952463796455776 -6.0599039041586851 -1.5788777053350687 1.0749889152594938 -5.958209090561601 -1.6481611480957412 1.05473145087341 -5.8565142769645169 -1.7174445908564135 1.0344739864873262 -5.7548194633674337 -1.7867280336170861 -1.0337048060108471 -5.6061789397786228 -1.859172037637685 -1.0075441904628262 -5.486793164373668 -1.8834318616129693 -0.98138357491480543 -5.3674073889687133 -1.9076916855882533 -0.95522295936678447 -5.2480216135637576 -1.9319515095635376 -0.92906234381876374 -5.128635838158802 -1.9562113335388218 -0.902901728270743 -5.0092500627538463 -1.9804711575141059 -0.89597412725291137 -5.622611671671752 -1.8586016675519932 -0.86981351170489041 -5.5032258962667973 -1.8828614915272774 -0.84365289615686967 -5.3838401208618425 -1.9071213155025617 -0.81749228060884871 -5.2644543454568868 -1.931381139477846 -0.79133166506082797 -5.1450685700519312 -1.95564096345313 -0.75824344849497549 -5.6390444035648812 -1.8580312974663014 -0.73208283294695464 -5.5196586281599265 -1.8822911214415856 -0.7059222173989339 -5.4002728527549717 -1.9065509454168699 -0.67976160185091294 -5.2808870773500152 -1.9308107693921541 -0.62051276973703962 -5.6554771354580105 -1.8574609273806097 -0.59435215418901877 -5.5360913600530557 -1.8817207513558938 -0.56819153864099803 -5.4167055846481009 -1.9059805753311783 -0.54203092309297707 -5.2973198092431444 -1.9302403993064625 -0.48278209097910385 -5.6719098673511397 -1.8568905572949179 -0.456621475431083 -5.5525240919461849 -1.8811503812702022 -0.43046085988306221 -5.4331383165412301 -1.9054102052454864 -0.34505141222116797 -5.6883425992442689 -1.8563201872092263 -0.31889079667314713 -5.5689568238393141 -1.8805800111845103 -0.20732073346323224 -5.704775331137399 -1.8557498171235345 -0.069590054705296459 -5.7212080630305282 -1.8551794470378429 -0.77652629276853136 -5.0246284281208382 -1.9798880516030972 -0.65833470455516507 -5.1610617627861917 -1.9550652841188909 -0.65747640000903673 -5.0393265960777205 -1.9792967295023847 -0.53928481179567045 -5.1757599307430739 -1.9544739620181784 -0.53842650724954211 -5.0540247640346028 -1.9787054074016719 -0.42109322358230433 -5.3121932654084283 -1.929651194533972 -0.42023491903617588 -5.1904580986999562 -1.9538826399174658 -0.41937661449004754 -5.0687229319914842 -1.9781140853009593 -0.30290163536893794 -5.4486266000737826 -1.9048284270497655 -0.3020433308228096 -5.3268914333653106 -1.9290598724332595 -0.3011850262766812 -5.2051562666568385 -1.953291317816753 -0.30032672173055286 -5.0834210999483664 -1.9775227632002466 -0.18471004715557174 -5.5850599347391361 -1.8800056595655592 -0.18385174260944337 -5.4633247680306649 -1.904237104949053 -0.18299343806331503 -5.3415896013221928 -1.9284685503325467 -0.18213513351718663 -5.2198544346137208 -1.9526999957160405 -0.18127682897105829 -5.0981192679052478 -1.976931441099534 -0.065660154396077225 -5.5997581026960184 -1.8794143374648464 -0.064801849849948773 -5.4780229359875472 -1.9036457828483404 -0.063943545303820432 -5.3562877692790742 -1.9278772282318342 -0.063085240757692077 -5.2345526025706022 -1.9521086736153277 -0.062226936211563735 -5.1128174358621301 -1.9763401189988212 -2.101018925200453 -5.2747778710008149 -1.8637617905939627 -2.0472688393781091 -5.1642696455357768 -1.8880171205244107 -1.9935187535557657 -5.0537614200707397 -1.9122724504548587 -1.9397686677334218 -4.9432531946057017 -1.9365277803853069 -1.8860185819110782 -4.8327449691406636 -1.9607831103157549 -1.9661389277535197 -5.3186956940736421 -1.8631875222899215 -1.9123888419311759 -5.208187468608604 -1.8874428522203694 -1.8586387561088324 -5.0976792431435669 -1.9116981821508174 -1.8048886702864886 -4.9871710176785289 -1.9359535120812656 -1.7511385844641449 -4.8766627922134909 -1.9602088420117134 -1.8312589303065865 -5.3626135171464693 -1.8626132539858802 -1.7775088444842426 -5.2521052916814313 -1.8868685839163282 -1.7237587586618992 -5.1415970662163941 -1.9111239138467762 -1.6700086728395556 -5.0310888407513561 -1.9353792437772244 -1.696378932859653 -5.4065313402192965 -1.8620389856818389 -1.6426288470373094 -5.2960231147542585 -1.8862943156122869 -1.5888787612149657 -5.1855148892892213 -1.9105496455427349 -1.56149893541272 -5.4504491632921237 -1.8614647173777976 -1.5077488495903764 -5.3399409378270857 -1.8857200473082456 -1.4539987637680327 -5.2294327123620477 -1.9099753772386936 -1.4266189379657868 -5.4943669863649509 -1.8608904490737563 -1.3728688521434431 -5.3838587608999129 -1.8851457790042041 -1.2917389405188535 -5.5382848094377781 -1.8603161807697151 -1.8328369947580625 -4.7220638153689309 -1.9850385313129923 -1.7185372918771566 -4.7597214382291453 -1.9844675597296908 -1.6299971660406547 -4.9164015567676165 -1.959636774466182 -1.604237588996251 -4.7973790610893587 -1.9838965881463893 -1.5414570402041525 -5.0730816753060877 -1.9348059892026734 -1.5156974631597491 -4.9540591796278299 -1.9590658028828805 -1.4899378861153454 -4.8350366839495731 -1.9833256165630877 -1.4271573373232469 -5.1107392981663011 -1.9342350176193717 -1.4013977602788432 -4.9917168024880443 -1.9584948312995787 -1.3756381832344398 -4.8726943068097865 -1.9827546449797859 -1.3386172114867447 -5.2674194167047723 -1.9094042323558629 -1.312857634442341 -5.1483969210265155 -1.9336640460360699 -1.2870980573979374 -5.0293744253482577 -1.9579238597162771 -1.2613384803535341 -4.9103519296700009 -1.9821836733964844 -1.2500770856502421 -5.4240995352432435 -1.8845734470923541 -1.2243175086058389 -5.3050770395649867 -1.9088332607725611 -1.1985579315614352 -5.1860545438867289 -1.9330930744527683 -1.1727983545170317 -5.0670320482084721 -1.9573528881329754 -1.1470387774726283 -4.9480095525302143 -1.9816127018131826 -1.1615369598137399 -5.5807796537817147 -1.8597426618288455 -1.1357773827693365 -5.4617571581034579 -1.8840024755090525 -1.110017805724933 -5.3427346624252001 -1.9082622891892596 -1.0842582286805293 -5.2237121667469433 -1.9325221028694666 -1.0584986516361259 -5.1046896710686855 -1.9567819165496738 -1.0327390745917226 -4.9856671753904287 -1.9810417302298811 -2.7946564375327774 -4.2055502604154071 -1.9899198142191581 -2.8688310747934969 -4.3035074535122373 -1.965663762969488 -3.0466368939208457 -4.761948933612163 -1.8680995924502657 -2.9724622566601262 -4.6639917405153328 -1.8923556436999358 -2.8982876193994067 -4.5660345474185036 -1.9166116949496059 -2.8241129821386868 -4.4680773543216734 -1.9408677461992758 -2.7499383448779673 -4.3701201612248424 -1.9651237974489457 -2.9277441640053166 -4.8285616413247689 -1.8675596269297234 -2.8535695267445971 -4.7306044482279388 -1.8918156781793936 -2.7793948894838776 -4.6326472551311086 -1.9160717294290637 -2.7052202522231577 -4.5346900620342785 -1.9403277806787336 -2.8088514340897874 -4.8951743490373749 -1.8670196614091812 -2.7346767968290679 -4.7972171559405448 -1.8912757126588513 -2.6605021595683485 -4.6992599628437146 -1.9155317639085214 -2.5863275223076285 -4.6013027697468845 -1.9397878151581913 -2.6899587041742583 -4.9617870567499809 -1.8664796958886389 -2.6157840669135388 -4.8638298636531507 -1.8907357471383091 -2.5416094296528189 -4.7658726705563197 -1.9149917983879789 -2.5710659742587287 -5.0283997644625869 -1.8659397303680969 -2.4968913369980092 -4.9304425713657558 -1.8901957816177668 -2.4521732443431996 -5.0950124721751919 -1.8653997648475547 -2.3779986070824801 -4.9970552790783618 -1.8896558160972248 -2.3332805144276705 -5.1616251798877979 -1.8648597993270126 -2.6840742285085386 -4.2677185377625761 -1.9893802654811297 -2.6328951452038907 -4.4357437482223423 -1.9645839246845465 -2.5807914962117993 -4.3259830867581925 -1.9888410828205474 -2.5296124129071513 -4.4940082972179587 -1.9640447420239642 -2.4775087639150599 -4.3842476357538089 -1.9883019001599651 -2.4784333296025034 -4.6620335076777248 -1.9392484012273807 -2.426329680610412 -4.5522728462135751 -1.9635055593633819 -2.3742260316183206 -4.4425121847494253 -1.9877627174993828 -2.427254246297855 -4.830058718137491 -1.9144520604307975 -2.3751505973057641 -4.7202980566733412 -1.9387092185667985 -2.3230469483136726 -4.6105373952091915 -1.9629663767027996 -2.2709432993215812 -4.5007767337450426 -1.9872235348388005 -2.3239715140011157 -4.8883232671331074 -1.9139128777702152 -2.2718678650090247 -4.7785626056689576 -1.9381700359062162 -2.2197642160169333 -4.6688019442048079 -1.9624271940422173 -2.1676605670248419 -4.559041282740659 -1.9866843521782183 -2.2727924306964677 -5.0563484775928726 -1.889116536973632 -2.2206887817043763 -4.9465878161287238 -1.913373695109633 -2.1685851327122854 -4.836827154664574 -1.9376308532456339 -2.116481483720194 -4.7270664932004252 -1.961888011381635 -2.0643778347281025 -4.6173058317362763 -1.986145169517636 -2.2216133473918194 -5.2243736880526388 -1.8643201961770488 -2.1695096983997284 -5.114613026588489 -1.8885773543130497 -2.117406049407637 -5.0048523651243402 -1.9128345124490507 -2.065302400415546 -4.8950917036601913 -1.9370916705850516 -2.0131987514234546 -4.7853310421960416 -1.9613488287210528 -1.9610951024313632 -4.6755703807318927 -1.9856059868570537 -4.0614611756081738 -4.0840603668018751 -1.848562561404653 -3.96890496929535 -4.0031193742327007 -1.8728044326364313 -3.8763487629825262 -3.9221783816635249 -1.8970463038682093 -3.7837925566697024 -3.8412373890943496 -1.9212881750999871 -3.6912363503568781 -3.7602963965251743 -1.9455300463317651 -3.5986801440440543 -3.6793554039559986 -1.9697719175635431 -3.9586340771667228 -4.1718307960361196 -1.8480399609844513 -3.866077870853899 -4.0908898034669452 -1.8722818322162296 -3.7735216645410752 -4.009948810897769 -1.8965237034480076 -3.6809654582282514 -3.9290078183285937 -1.9207655746797854 -3.5884092519154271 -3.8480668257594184 -1.9450074459115634 -3.4958530456026029 -3.7671258331902431 -1.9692493171433414 -3.763250772412448 -4.1786602327011897 -1.8717592317960279 -3.6706945660996242 -4.0977192401320135 -1.8960011030278059 -3.5781383597868004 -4.0167782475628382 -1.9202429742595837 -3.4855821534739757 -3.9358372549936629 -1.9444848454913617 -3.6604236739709965 -4.2664306619354342 -1.8712366313758262 -3.5678674676581728 -4.185489669366258 -1.8954785026076042 -3.475311261345349 -4.1045486767970827 -1.919720373839382 -3.5575965755295456 -4.3542010911696778 -1.8707140309556245 -3.4650403692167218 -4.2732600986005016 -1.8949559021874025 -3.3724841629038975 -4.1923191060313263 -1.9191977734191805 -3.4547694770880946 -4.4419715204039223 -1.8701914305354228 -3.3622132707752708 -4.3610305278347461 -1.8944333017672008 -3.3519423786466436 -4.5297419496381659 -1.8696688301152211 -3.5083679186187351 -3.5965614196216222 -1.9940155508117119 -3.4195078465446853 -3.6727984240449643 -1.9935039175657534 -3.4032193899435947 -3.8464789155388299 -1.9687347208079171 -3.3306477744706355 -3.7490354284683063 -1.9929922843197949 -3.3869309333425046 -4.0201594070326951 -1.9439655240500808 -3.3143593178695454 -3.9227159199621724 -1.9682230875619586 -3.2417877023965858 -3.8252724328916488 -1.9924806510738364 -3.2980708612684548 -4.0963964114560376 -1.9434538908041223 -3.2254992457954961 -3.9989529243855144 -1.9677114543160001 -3.1529276303225364 -3.9015094373149908 -1.9919690178278779 -3.2817824046673651 -4.2700769029499028 -1.9186846940462861 -3.2092107891944055 -4.1726334158793801 -1.9429422575581639 -3.1366391737214463 -4.0751899288088564 -1.9671998210700417 -3.0640675582484866 -3.9777464417383332 -1.9914573845819195 -3.265493948066275 -4.443757394443768 -1.8939154972884498 -3.1929223325933154 -4.3463139073732453 -1.9181730608003276 -3.1203507171203557 -4.2488704203027226 -1.9424306243122054 -3.0477791016473965 -4.1514269332321989 -1.9666881878240832 -2.9752074861744369 -4.0539834461616753 -1.990945751335961 -3.2492054914651844 -4.6174378859376333 -1.8691463005306135 -3.1766338759922252 -4.5199943988671105 -1.8934038640424915 -3.104062260519266 -4.4225509117965878 -1.9176614275543693 -3.0314906450463064 -4.325107424726065 -1.9419189910662471 -2.9589190295733472 -4.2276639376555414 -1.9661765545781249 -2.8863474141003875 -4.1302204505850177 -1.9904341180900027 -3.1603454193911351 -4.6936748903609757 -1.868634667284655 -3.0877738039181755 -4.596231403290453 -1.892892230796533 -3.0152021884452163 -4.4987879162199302 -1.9171497943084108 -2.9426305729722566 -4.4013444291494066 -1.9414073578202886 -4.7219727758713121 -3.2526806867021261 -1.8525544512981109 -4.6155777440924313 -3.1912590109057541 -1.8767812722206689 -4.5091827123135504 -3.1298373351093818 -1.9010080931432269 -4.4027876805346695 -3.0684156593130094 -1.925234914065785 -4.2963926487557886 -3.0069939835166375 -1.949461734988343 -4.1899976169769078 -2.9455723077202651 -1.973688555910901 -4.6396454137606433 -3.3569299010356892 -1.8520557456466575 -4.5332503819817624 -3.2955082252393169 -1.8762825665692155 -4.4268553502028816 -3.2340865494429449 -1.9005093874917736 -4.3204603184240007 -3.1726648736465726 -1.9247362084143316 -4.2140652866451207 -3.1112431978502002 -1.9489630293368896 -4.5573180516499745 -3.4611791153692524 -1.8515570399952042 -4.4509230198710945 -3.39975743957288 -1.8757838609177622 -4.3445279880922136 -3.3383357637765076 -1.90001068184032 -4.2381329563133328 -3.2769140879801357 -1.9242375027628782 -4.1317379245344519 -3.2154924121837634 -1.9484643236854362 -4.4749906895393057 -3.5654283297028151 -1.8510583343437506 -4.3685956577604257 -3.5040066539064427 -1.8752851552663088 -4.2622006259815448 -3.4425849781100704 -1.8995119761888666 -4.1558055942026639 -3.3811633023136984 -1.9237387971114246 -4.3926633274286369 -3.6696775440363782 -1.8505596286922972 -4.2862682956497569 -3.6082558682400059 -1.8747864496148552 -4.1798732638708769 -3.5468341924436335 -1.899013270537413 -4.3103359653179689 -3.7739267583699414 -1.8500609230408436 -4.2039409335390889 -3.7125050825735686 -1.8742877439634018 -4.228008603207301 -3.8781759727035041 -1.8495622173893902 -4.121613571428421 -3.8167542969071317 -1.8737890383119482 -4.1456812410966322 -3.9824251870370673 -1.8490635117379366 -4.093198044260518 -2.8723757429149899 -1.9979258743287034 -4.1123570130727956 -3.0440702539451987 -1.9731949776037117 -4.0217106833157317 -2.9633228515594574 -1.9974390277097305 -4.0408696521280092 -3.1350173625896662 -1.9727081309847387 -3.9502233223709453 -3.0542699602039249 -1.9969521810907576 -4.0600286209402867 -3.3067118736198746 -1.947977234259747 -3.9693822911832228 -3.2259644712341338 -1.9722212843657658 -3.878735961426159 -3.145217068848392 -1.9964653344717846 -4.0791875897525642 -3.4784063846500834 -1.923246337534755 -3.9885412599955004 -3.3976589822643422 -1.9474903876407741 -3.8978949302384365 -3.3169115798786013 -1.9717344377467929 -3.8072486004813721 -3.2361641774928596 -1.9959784878528117 -4.0983465585648418 -3.6501008956802923 -1.8985154408097631 -4.0077002288077779 -3.569353493294551 -1.9227594909157821 -3.917053899050714 -3.4886060909088097 -1.9470035410218012 -3.8264075692936501 -3.4078586885230684 -1.97124759112782 -3.7357612395365858 -3.3271112861373267 -1.9954916412338388 -4.0268591976200554 -3.7410480043247598 -1.8980285941907902 -3.9362128678629915 -3.6603006019390185 -1.9222726442968092 -3.8455665381059276 -3.5795531995532772 -1.946516694402828 -3.7549202083488633 -3.4988057971675355 -1.9707607445088469 -3.6642738785917994 -3.4180583947817942 -1.9950047946148657 -4.0460181664323329 -3.9127425153549686 -1.8732976974657987 -3.955371836675269 -3.8319951129692273 -1.8975417475718173 -3.8647255069182052 -3.7512477105834861 -1.9217857976778363 -3.7740791771611408 -3.6705003081977448 -1.9460298477838551 -3.6834328474040769 -3.589752905812003 -1.9702738978898739 -3.5927865176470126 -3.5090055034262617 -1.9945179479958928 -5.2732497445157707 -2.20945396438105 -1.8568502865412766 -5.1569574139046974 -2.1700738606237486 -1.881059990439226 -5.0406650832936251 -2.1306937568664481 -1.9052696943371752 -4.9243727526825527 -2.0913136531091467 -1.9294793982351246 -4.8080804220714795 -2.0519335493518458 -1.953689102133074 -4.6917880914604071 -2.0125534455945449 -1.9778988060310232 -5.2132538068022303 -2.3267527506916519 -1.8563740704220955 -5.0969614761911579 -2.2873726469343509 -1.8805837743200449 -4.9806691455800847 -2.24799254317705 -1.9047934782179941 -4.8643768149690123 -2.2086124394197491 -1.9290031821159435 -4.7480844843579399 -2.1692323356624481 -1.9532128860138929 -5.1532578690886899 -2.4440515370022542 -1.8558978543029143 -5.0369655384776175 -2.4046714332449532 -1.8801075582008637 -4.9206732078665452 -2.3652913294876519 -1.9043172620988129 -4.8043808772554728 -2.3259112257303514 -1.9285269659967623 -4.6880885466443996 -2.28653112197305 -1.9527366698947117 -5.0932619313751495 -2.5613503233128565 -1.8554216381837332 -4.9769696007640771 -2.5219702195555556 -1.8796313420816826 -4.8606772701530048 -2.4825901157982542 -1.9038410459796318 -4.7443849395419324 -2.4432100120409537 -1.9280507498775812 -5.03326599366161 -2.6786491096234588 -1.854945422064552 -4.9169736630505376 -2.6392690058661574 -1.8791551259625014 -4.8006813324394653 -2.5998889021088565 -1.9033648298604506 -4.9732700559480696 -2.7959478959340607 -1.8544692059453709 -4.8569777253369972 -2.7565677921767593 -1.8786789098433203 -4.7406853947259249 -2.7171876884194588 -1.9028886137412695 -4.9132741182345301 -2.913246682244663 -1.8539929898261898 -4.7969817876234577 -2.8738665784873616 -1.8782026937241392 -4.8532781805209897 -3.0305454685552649 -1.8535167737070086 -4.7932822428074502 -3.1478442548658672 -1.8530405575878275 -4.6335761643163256 -2.1264834844061156 -1.9774255200209687 -4.5816052428204772 -2.2286286310601748 -1.9769624844140914 -4.6341862950198287 -2.3923231996780348 -1.9522704622169209 -4.5296343213246288 -2.3307737777142341 -1.9764994488072143 -4.6867673472191811 -2.5560177682958951 -1.9275784400197502 -4.5822153735239803 -2.494468346332094 -1.9518074266100436 -4.4776633998287805 -2.4329189243682929 -1.976036413200337 -4.6347964257233327 -2.6581629149499544 -1.9271154044128729 -4.530244452028132 -2.5966134929861533 -1.9513443910031665 -4.4256924783329321 -2.5350640710223522 -1.9755733775934599 -4.3211405046377305 -2.4735146490585511 -1.9998023641837532 -4.6873774779226851 -2.8218574835678139 -1.9024233822157024 -4.5828255042274844 -2.7603080616040132 -1.9266523688059958 -4.4782735305322836 -2.6987586396402126 -1.9508813553962892 -4.3737215568370829 -2.6372092176764115 -1.9751103419865825 -4.2691695831418821 -2.5756597957126104 -1.9993393285768759 -4.7399585301220375 -2.9855520521856738 -1.8777313600185319 -4.6354065564268367 -2.9240026302218731 -1.9019603466088251 -4.530854582731636 -2.8624532082580725 -1.9261893331991184 -4.4263026090364352 -2.8009037862942714 -1.950418319789412 -4.3217506353412345 -2.7393543643304703 -1.9746473063797054 -4.2171986616460337 -2.6778049423666692 -1.9988762929699988 -4.6879876086261891 -3.0876971988397335 -1.8772683244116546 -4.5834356349309875 -3.0261477768759324 -1.901497311001948 -4.4788836612357876 -2.9645983549121313 -1.9257262975922413 -4.374331687540586 -2.9030489329483307 -1.9499552841825347 -4.2697797138453852 -2.8414995109845296 -1.9741842707728281 -4.1652277401501854 -2.7799500890207285 -1.9984132573631215 -4.9888500937612106 -1.0081979415071685 -1.9818568301208599 -5.1104577321947984 -1.0243269634569443 -1.9576613312008415 -5.5611191258894817 -1.2144758324813454 -1.8604315520989179 -5.439511487455893 -1.1983468105315698 -1.8846270510189362 -5.3179038490223052 -1.1822177885817939 -1.9088225499389546 -5.1962962105887165 -1.1660887666320181 -1.933018048858973 -5.0746885721551287 -1.1499597446822423 -1.9572135477789914 -5.525349965849812 -1.3401086137066436 -1.8599837686770679 -5.4037423274162233 -1.3239795917568677 -1.8841792675970863 -5.2821346889826355 -1.3078505698070919 -1.9083747665171045 -5.1605270505490468 -1.2917215478573161 -1.9325702654371231 -5.038919412115459 -1.2755925259075405 -1.9567657643571414 -5.4895808058101423 -1.4657413949319418 -1.8595359852552178 -5.3679731673765536 -1.4496123729821657 -1.8837314841752364 -5.2463655289429658 -1.4334833510323899 -1.9079269830952545 -5.1247578905093771 -1.4173543290826141 -1.9321224820152729 -5.4538116457704726 -1.5913741761572398 -1.8590882018333679 -5.3322040073368839 -1.5752451542074637 -1.8832837007533862 -5.2105963689032961 -1.5591161322576879 -1.9074791996734044 -5.4180424857308029 -1.7170069573825377 -1.8586404184115177 -5.2964348472972143 -1.7008779354327619 -1.8828359173315363 -5.1748272088636265 -1.6847489134829861 -1.9070314162515545 -5.3822733256911333 -1.8426397386078357 -1.8581926349896678 -5.2606656872575446 -1.8265107166580599 -1.8823881339096862 -5.3465041656514627 -1.9682725198331337 -1.8577448515678177 -5.310735005611793 -2.0939053010584319 -1.8572970681459677 -4.9534008023171561 -1.1327633407697697 -1.981409796123103 -4.9224663965205862 -1.2422628424424758 -1.980973340106829 -5.0060273185514754 -1.3916247120643546 -1.9563247216499586 -4.8915319907240162 -1.3517623441151818 -1.9805368840905551 -5.0895882405823656 -1.5409865816862336 -1.9316761031930885 -4.9750929127549055 -1.5011242137370604 -1.9558882656336847 -4.8605975849274463 -1.4612618457878876 -1.9801004280742811 -5.0586538347857957 -1.6504860833589396 -1.9312396471768145 -4.9441585069583356 -1.6106237154097665 -1.9554518096174107 -4.8296631791308764 -1.5707613474605937 -1.9796639720580071 -5.1422147568166849 -1.7998479529808182 -1.9065910287199443 -5.0277194289892257 -1.7599855850316455 -1.9308031911605406 -4.9132241011617657 -1.7201232170824725 -1.9550153536011368 -4.7987287733343065 -1.6802608491332998 -1.979227516041733 -5.2257756788475742 -1.9492098226026973 -1.8819424102630744 -5.111280351020115 -1.9093474546535241 -1.9061545727036704 -4.9967850231926558 -1.8694850867043513 -1.9303667351442666 -4.8822896953651957 -1.8296227187551783 -1.9545788975848628 -4.7677943675377366 -1.7897603508060056 -1.978791060025459 -5.1948412730510034 -2.0587093242754029 -1.8815059542468004 -5.0803459452235442 -2.0188469563262301 -1.9057181166873964 -4.965850617396085 -1.9789845883770574 -1.9299302791279926 -4.8513552895686258 -1.9391222204278844 -1.9541424415685889 -4.7368599617411666 -1.8992598524787117 -1.9783546040091848 -5.6766014550107933 -0.063774557480982819 -1.8641661853660065 -5.5542423213627679 -0.07165406279375941 -1.8883505616752734 -5.4318831877147442 -0.079533568106536112 -1.91253493798454 -5.3095240540667188 -0.087413073419312814 -1.9367193142938066 -5.1871649204186943 -0.095292578732089489 -1.9609036906030732 -5.0648057867706688 -0.10317208404486616 -1.9850880669123399 -5.6659070803766545 -0.1934148109899938 -1.8637536260254666 -5.5435479467286291 -0.2012943163027705 -1.8879380023347334 -5.4211888130806054 -0.2091738216155471 -1.912122378644 -5.29882967943258 -0.2170533269283238 -1.9363067549532667 -5.1764705457845546 -0.22493283224110036 -1.9604911312625333 -5.6552127057425157 -0.3230550644990049 -1.8633410666849266 -5.5328535720944902 -0.33093456981178149 -1.8875254429941934 -5.4104944384464657 -0.33881407512455808 -1.9117098193034601 -5.2881353047984403 -0.34669358043733478 -1.9358941956127267 -5.644518331108376 -0.45269531800801621 -1.8629285073443866 -5.5221591974603506 -0.4605748233207928 -1.8871128836536535 -5.3998000638123269 -0.46845432863356939 -1.9112972599629201 -5.2774409301643015 -0.47633383394634604 -1.9354816362721865 -5.6338239564742372 -0.5823355715170272 -1.8625159480038467 -5.5114648228262118 -0.59021507682980379 -1.8867003243131135 -5.3891056891781872 -0.59809458214258038 -1.9108847006223799 -5.6231295818400975 -0.71197582502603818 -1.8621033886633067 -5.5007704481920721 -0.71985533033881477 -1.8862877649725733 -5.6124352072059587 -0.84161607853504927 -1.8616908293227667 -5.601740832571819 -0.97125633204406026 -1.8612782699822266 -5.0556318336904296 -0.21692265160536894 -1.9846843742723965 -5.1665342676880366 -0.34665033835774994 -1.9600829929426014 -5.0465468524656174 -0.32974338833220429 -1.9842812004930293 -5.1574492864632244 -0.4594710750845854 -1.9596798191632341 -5.0374618712408052 -0.44256412505903964 -1.983878026713662 -5.2683517204608314 -0.58919876183696651 -1.9350784378334387 -5.1483643052384123 -0.57229181181142075 -1.9592766453838668 -5.0283768900159931 -0.55538486178587498 -1.9834748529342947 -5.3792541544584385 -0.71892644858934762 -1.9104770565036433 -5.2592667392360193 -0.70201949856380186 -1.9346752640540714 -5.1392793240136001 -0.68511254853825609 -1.9588734716044993 -5.0192919087911809 -0.66820559851271022 -1.9830716791549272 -5.4901565884560446 -0.84865413534172873 -1.8858756751738479 -5.3701691732336263 -0.83174718531618297 -1.910073882724276 -5.2501817580112071 -0.8148402352906372 -1.9342720902747039 -5.1301943427887879 -0.79793328526509144 -1.958470297825132 -5.0102069275663688 -0.78102633523954557 -1.9826685053755599 -5.4810716072312324 -0.96147487206856408 -1.8854725013944806 -5.3610841920088133 -0.94456792204301832 -1.9096707089449088 -5.241096776786395 -0.92766097201747266 -1.9338689164953367 -5.1211093615639758 -0.91075402199192679 -1.9580671240457646 -5.0011219463415566 -0.89384707196638091 -1.9822653315961924 -5.5919740412288395 -1.0912025588209451 -1.8608711200646852 -5.4719866260064194 -1.0742956087953994 -1.8850693276151134 -5.3519992107840011 -1.0573886587698536 -1.9092675351655413 -5.2320117955615819 -1.0404817087443079 -1.9334657427159692 -5.5600704173777276 1.0786454738018085 -1.8674631532521451 -5.441609898703418 1.0472319548503759 -1.8916418426823318 -5.3231493800291094 1.0158184358989433 -1.9158205321125183 -5.2046888613547999 0.98440491694751076 -1.9399992215427051 -5.0862283426804904 0.95299139799607802 -1.9641779109728916 -4.9677678240061809 0.9215778790446455 -1.9883566004030782 -5.5745761759231485 0.94996379560761435 -1.8670988015952521 -5.456115657248839 0.91855027665618172 -1.8912774910254389 -5.3376551385745294 0.88713675770474909 -1.9154561804556254 -5.2191946199002199 0.85572323875331646 -1.9396348698858121 -5.1007341012259104 0.82430971980188383 -1.9638135593159987 -5.5890819344685685 0.82128211741342005 -1.8667344499383591 -5.4706214157942599 0.78986859846198731 -1.8909131393685459 -5.3521608971199504 0.75845507951055491 -1.9150918287987324 -5.2337003784456408 0.72704156055912228 -1.9392705182289192 -5.6035876930139894 0.69260043921922576 -1.8663700982814662 -5.4851271743396808 0.66118692026779302 -1.8905487877116529 -5.3666666556653704 0.62977340131636061 -1.9147274771418397 -5.2482061369910609 0.5983598823649281 -1.9389061665720262 -5.6180934515594094 0.56391876102503158 -1.8660057466245734 -5.4996329328851008 0.53250524207359895 -1.8901844360547599 -5.3811724142107913 0.50109172312216643 -1.9143631254849467 -5.6325992101048303 0.43523708283083723 -1.8656413949676804 -5.5141386914305217 0.40382356387940466 -1.8898200843978672 -5.6471049686502504 0.30655540463664305 -1.8652770433107877 -5.5286444499759417 0.27514188568521053 -1.8894557327409742 -5.6616107271956713 0.17787372644244889 -1.8649126916538947 -4.9808742639023418 0.80684369428329095 -1.9879973429809759 -5.1146352879347345 0.70165401841080788 -1.9634514086094648 -4.9937060702504761 0.69484687717551663 -1.9876390853652977 -5.1274670942828688 0.58965720130303356 -1.9630931509937866 -5.0065378765986104 0.58285006006774231 -1.9872808277496194 -5.2612281183152625 0.48446752543055044 -1.9385472166222755 -5.1402989006310031 0.4776603841952593 -1.9627348933781084 -5.0193696829467447 0.47085324295996805 -1.9869225701339412 -5.3949891423476553 0.37927784955806726 -1.9140012822507644 -5.2740599246633968 0.37247070832277601 -1.9381889590065973 -5.1531307069791374 0.36566356708748488 -1.9623766357624302 -5.032201489294879 0.35885642585219363 -1.986564312518263 -5.4078209486957896 0.26728103245029294 -1.9136430246350862 -5.2868917310115311 0.2604738912150017 -1.9378307013909191 -5.1659625133272717 0.25366674997971056 -1.962018378146752 -5.0450332956430124 0.2468596087444194 -1.9862060549025848 -5.5415819727281823 0.16209135657780988 -1.8890970902635751 -5.4206527550439239 0.15528421534251866 -1.913284767019408 -5.2997235373596654 0.14847707410722744 -1.9374724437752409 -5.178794319675406 0.14166993287193627 -1.9616601205310737 -5.0578651019911467 0.13486279163664511 -1.9858477972869066 -5.675342996760576 0.056901680705326613 -1.8645511558920638 -5.5544137790763166 0.050094539470035421 -1.8887388326478969 -5.4334845613920582 0.043287398234744222 -1.9129265094037298 -5.3125553437077988 0.036480256999453037 -1.9371141861595627 -5.1916261260235395 0.029673115764161855 -1.9613018629153955 -5.0706969083392801 0.022865974528870677 -1.9854895396712287 -4.6698526119779515 1.9013406950317622 -1.9910502525934255 -4.7799208681732077 1.9552147177292236 -1.9668718839354542 -4.8899891243684648 2.0090887404266846 -1.9426935152774829 -5.0000573805637218 2.0629627631241458 -1.9185151466195114 -5.259151786503522 2.047425752248091 -1.8698600727579449 -5.1490835303082649 1.99355172955063 -1.8940384414159164 -5.0390152741130088 1.9396777068531688 -1.9182168100738877 -4.9289470179177517 1.8858036841557075 -1.9423951787318592 -4.8188787617224946 1.8319296614582463 -1.9665735473898305 -5.2981096800528089 1.9241406959771137 -1.8695617362123211 -5.1880414238575518 1.8702666732796529 -1.8937401048702927 -5.0779731676622948 1.8163926505821917 -1.9179184735282639 -4.9679049114670386 1.7625186278847305 -1.9420968421862352 -5.3370675736020949 1.8008556397061364 -1.8692633996666974 -5.2269993174068379 1.7469816170086756 -1.8934417683246689 -5.1169310612115817 1.6931075943112144 -1.9176201369826402 -5.0068628050163246 1.6392335716137532 -1.9417985056406115 -5.3760254671513819 1.6775705834351591 -1.8689650631210737 -5.2659572109561248 1.6236965607376981 -1.8931434317790452 -5.1558889547608686 1.5698225380402369 -1.9173218004370163 -5.4149833607006679 1.5542855271641818 -1.86866672657545 -5.3049151045054117 1.5004115044667208 -1.8928450952334215 -5.4539412542499548 1.4310004708932047 -1.8683683900298262 -5.3438729980546977 1.3771264481957437 -1.8925467586877975 -5.4928991477992408 1.3077154146222276 -1.8680700534842025 -4.7052824081921836 1.789648857475282 -1.9907540836693147 -4.8566236055598395 1.7126306490195538 -1.9662759561276844 -4.7393290388431861 1.6825020591765201 -1.9904587645458605 -4.890670236210843 1.6054838507207916 -1.9659806370042301 -4.7733756694941887 1.5753552608777579 -1.9901634454224062 -5.0420114335784998 1.5284656422650633 -1.9415025094625997 -4.9247168668618455 1.4983370524220294 -1.9656853178807758 -4.8074223001451921 1.4682084625789957 -1.9898681262989519 -5.1933526309461557 1.4514474338093351 -1.9170243819209694 -5.0760580642295023 1.4213188439663011 -1.9412071903391455 -4.958763497512849 1.3911902541232672 -1.9653899987573216 -4.8414689307961947 1.3610616642802336 -1.9895728071754974 -5.2273992615971592 1.3443006355105729 -1.9167290627975151 -5.1101046948805058 1.314172045667539 -1.9409118712156912 -4.9928101281638515 1.2840434558245051 -1.9650946796338671 -4.8755155614471981 1.2539148659814714 -1.9892774880520432 -5.3787404589648151 1.2672824270548446 -1.8922509352558849 -5.2614458922481626 1.2371538372118107 -1.9164337436740608 -5.1441513255315083 1.2070252473687768 -1.9406165520922369 -5.0268567588148549 1.1768966575257429 -1.9647993605104128 -4.9095621920982007 1.1467680676827092 -1.9889821689285887 -5.530081656332472 1.1902642185991164 -1.8677728077142546 -5.4127870896158186 1.1601356287560824 -1.8919556161324307 -5.2954925228991652 1.1300070389130485 -1.9161384245506066 -5.1781979561825118 1.0998784490700149 -1.9403212329687825 -5.0609033894658575 1.0697498592269807 -1.9645040413869583 -4.9436088227492041 1.0396212693839471 -1.9886868498051344 -4.7349744088839962 3.0579776734201491 -1.8717859637927343 -4.6374534038903095 2.9837468002685563 -1.8959704250493135 -4.5399323988966227 2.9095159271169631 -1.9201548863058928 -4.4424113939029368 2.8352850539653698 -1.944339347562472 -4.3448903889092501 2.7610541808137765 -1.9685238088190513 -4.7967483403713578 2.944572973750009 -1.8715818639404154 -4.699227335377671 2.8703421005984162 -1.8957663251969945 -4.6017063303839842 2.7961112274468229 -1.9199507864535739 -4.5041853253902984 2.7218803542952297 -1.944135247710153 -4.8585222718587193 2.8311682740798689 -1.8713777640880964 -4.7610012668650317 2.7569374009282761 -1.8955622253446756 -4.6634802618713458 2.6827065277766828 -1.9197466866012547 -4.5659592568776599 2.6084756546250896 -1.9439311478578341 -4.92029620334608 2.7177635744097288 -1.8711736642357772 -4.8227751983523932 2.643532701258136 -1.8953581254923566 -4.7252541933587073 2.5693018281065427 -1.9195425867489357 -4.9820701348334415 2.6043588747395887 -1.8709695643834583 -4.8845491298397539 2.5301280015879959 -1.8951540256400374 -5.0438440663208022 2.4909541750694482 -1.8707654645311391 -4.9463230613271154 2.4167233019178553 -1.8949499257877185 -5.1056179978081637 2.3775494753993081 -1.8705613646788202 -4.2428699911674004 2.6952431895364546 -1.9927080712604013 -4.405867833379757 2.6491399770775694 -1.968319673772261 -4.2966819734141364 2.5967379831640205 -1.9925036195924368 -4.459679815626493 2.5506347707051353 -1.9681152221042966 -4.3504939556608724 2.4982327767915864 -1.9922991679244724 -4.6226776578388495 2.5045315582462506 -1.9437268246161563 -4.513491797873229 2.4521295643327012 -1.9679107704363321 -4.4043059379076084 2.3997275704191523 -1.9920947162565079 -4.7856755000512061 2.4584283457873655 -1.9193384271280161 -4.6764896400855855 2.4060263518738165 -1.9435223729481919 -4.567303780119965 2.3536243579602671 -1.9677063187683677 -4.4581179201543444 2.3012223640467182 -1.9918902645885437 -4.8394874822979421 2.3599231394149314 -1.9191339754600516 -4.7303016223323215 2.307521145501382 -1.9433179212802274 -4.621115762366701 2.2551191515878326 -1.9675018671004034 -4.5119299024010804 2.2027171576742837 -1.9916858129205792 -5.0024853245102978 2.3138199269560462 -1.8947455779719113 -4.8932994645446781 2.2614179330424973 -1.9189295237920871 -4.7841136045790575 2.2090159391289479 -1.9431134696122629 -4.674927744613437 2.1566139452153985 -1.967297415432439 -4.5657418846478164 2.1042119513018491 -1.991481361252615 -5.1654831667226553 2.2677167144971611 -1.8703571804837709 -5.0562973067570338 2.2153147205836121 -1.8945411263039469 -4.9471114467914141 2.1629127266700627 -1.9187250721241227 -4.8379255868257935 2.1105107327565138 -1.9429090179442987 -4.728739726860173 2.0581087388429644 -1.9670929637644747 -4.6195538668945524 2.005706744929415 -1.9912769095846505 -5.2192951489693904 2.169211508124727 -1.8701527288158064 -5.1101092890037707 2.1168095142111776 -1.8943366746359824 -4.1046828010979439 4.038489956086643 -1.8482890187450089 -4.0234525862434936 3.9466425150122548 -1.8724857054641619 -3.9422223713890432 3.8547950739378676 -1.8966823921833147 -3.8609921565345933 3.7629476328634794 -1.9208790789024675 -3.7797619416801425 3.6711001917890913 -1.9450757656216202 -3.6985317268256921 3.5792527507147032 -1.9692724523407732 -4.1869749449843434 3.9387439129029169 -1.8482221671066679 -4.105744730129893 3.8468964718285288 -1.8724188538258209 -4.0245145152754427 3.7550490307541415 -1.8966155405449736 -3.9432843004209923 3.6632015896797534 -1.9208122272641264 -3.8620540855665419 3.5713541486053653 -1.9450089139832791 -3.7808238707120911 3.4795067075309771 -1.9692056007024321 -4.2692670888707429 3.8389978697191909 -1.8481553154683268 -4.1880368740162925 3.7471504286448027 -1.8723520021874798 -4.1068066591618422 3.6553029875704155 -1.8965486889066325 -4.0255764443073918 3.5634555464960274 -1.9207453756257853 -3.9443462294529414 3.4716081054216392 -1.944942062344938 -4.3515592327571424 3.7392518265354648 -1.8480884638299857 -4.270329017902692 3.6474043854610767 -1.8722851505491387 -4.1890988030482417 3.5555569443866895 -1.8964818372682914 -4.1078685881937913 3.4637095033123013 -1.9206785239874442 -4.4338513766435419 3.6395057833517388 -1.8480216121916446 -4.3526211617890915 3.5476583422773507 -1.8722182989107976 -4.2713909469346412 3.455810901202963 -1.8964149856299501 -4.1901607320801908 3.3639634601285753 -1.9206116723491031 -4.5161435205299414 3.5397597401680128 -1.8479547605533035 -4.434913305675491 3.4479122990936246 -1.8721514472724563 -4.3536830908210398 3.3560648580192369 -1.8963481339916091 -4.5984356644163409 3.4400136969842867 -1.8478879089149622 -4.5172054495618905 3.3481662559098986 -1.8720845956341152 -4.6807278083027404 3.3402676538005607 -1.8478210572766212 -3.613621494225244 3.4918974612490663 -1.9934681199730118 -3.6850907966543169 3.40536272518924 -1.9933982712251825 -3.853512633753704 3.3914833911624322 -1.9691360896530701 -3.7565600990833898 3.3188279891294137 -1.9933284224773533 -4.0219344708530924 3.3776040571356245 -1.9448739080809576 -3.9249819361827769 3.3049486551026059 -1.9690662409052408 -3.8280294015124627 3.2322932530695874 -1.9932585737295241 -4.0934037732821649 3.2910693210757982 -1.9448040593331284 -3.9964512386118498 3.2184139190427796 -1.9689963921574116 -3.8994987039415356 3.1457585170097611 -1.9931887249816946 -4.2618256103815524 3.2771899870489904 -1.9205418777610159 -4.1648730757112382 3.2045345850159719 -1.9447342105852989 -4.0679205410409223 3.1318791829829533 -1.9689265434095824 -3.9709680063706085 3.0592237809499347 -1.9931188762338654 -4.4302474474809399 3.2633106530221827 -1.8962796961889032 -4.3332949128106257 3.1906552509891641 -1.9204720290131867 -4.2363423781403107 3.1179998489561456 -1.9446643618374697 -4.1393898434699956 3.045344446923127 -1.9688566946617529 -4.0424373087996814 2.9726890448901084 -1.993049027486036 -4.5986692845803283 3.249431318995375 -1.872017514616791 -4.5017167499100132 3.1767759169623564 -1.896209847441074 -4.4047642152396982 3.1041205149293383 -1.9204021802653573 -4.307811680569384 3.0314651128963193 -1.9445945130896403 -4.2108591458990681 2.9588097108633007 -1.9687868459139237 -4.1139066112287539 2.8861543088302826 -1.9929791787382067 -4.6701385870094017 3.1628965829355487 -1.8719476658689616 -4.5731860523390857 3.0902411809025305 -1.8961399986932446 -4.4762335176687715 3.017585778869512 -1.920332331517528 -4.3792809829984565 2.9449303768364934 -1.944524664341811 -4.2823284483281414 2.8722749748034748 -1.9687169971660943 -4.1853759136578264 2.7996195727704563 -1.9929093299903773 -3.1507654227993993 4.684073255032791 -1.8713329073841933 -3.0889229234533149 4.5781095602766531 -1.8955464445475627 -3.0270804241072313 4.4721458655205168 -1.9197599817109319 -2.9652379247611473 4.3661821707643798 -1.9439735188743013 -2.9033954254150633 4.2602184760082418 -1.9681870560376704 -2.8415529260689794 4.1542547812521038 -1.9924005932010396 -3.2506420338213897 4.6012117803108374 -1.8714711677650646 -3.1887995344753053 4.4952480855546995 -1.895684704928434 -3.1269570351292217 4.3892843907985633 -1.9198982420918032 -3.0651145357831378 4.2833206960424262 -1.9441117792551723 -3.0032720364370538 4.1773570012862873 -1.9683253164185415 -3.3505186448433801 4.5183503055888838 -1.8716094281459359 -3.2886761454972957 4.4123866108327459 -1.8958229653093051 -3.2268336461512122 4.3064229160766097 -1.9200365024726742 -3.1649911468051282 4.2004592213204717 -1.9442500396360436 -3.4503952558653705 4.4354888308669302 -1.8717476885268072 -3.3885527565192861 4.3295251361107923 -1.8959612256901763 -3.3267102571732026 4.2235614413546552 -1.9201747628535455 -3.550271866887361 4.3526273561449766 -1.8718859489076785 -3.4884293675412765 4.2466636613888387 -1.8960994860710474 -3.426586868195193 4.1406999666327016 -1.9203130232344165 -3.7119909772554354 4.3757295761791601 -1.8478106721251801 -3.6501484779093514 4.269765881423023 -1.8720242092885497 -3.5883059785632669 4.1638021866668851 -1.8962377464519187 -3.8118675882774258 4.2928681014572065 -1.8479489325060514 -3.7500250889313418 4.1869044067010686 -1.8721624696694208 -3.9117441992994162 4.2100066267352529 -1.8480871928869227 -3.8499016999533322 4.104042931979115 -1.8723007300502921 -4.011620810321407 4.1271451520132993 -1.848225453267794 -2.9282151466519397 4.0822608412954429 -1.9925353362993663 -3.0957114370225662 4.1006118997219261 -1.9684615972324726 -3.0147273538598682 4.0103902725662275 -1.9926700394685395 -3.2632077273931923 4.1189629581484093 -1.9443878581655787 -3.1822236442304948 4.0287413309927107 -1.9685963004016458 -3.1012395610677963 3.9385197038370126 -1.9928047426377127 -3.3497199346011208 4.0470923894191939 -1.9445225613347519 -3.2687358514384233 3.9568707622634958 -1.968731003570819 -3.1877517682757248 3.8666491351077976 -1.9929394458068856 -3.5172162249717465 4.0654434478456771 -1.9204488222678582 -3.4362321418090489 3.975221820689979 -1.9446572645039251 -3.3552480586463513 3.8850001935342808 -1.9688657067399919 -3.2742639754836533 3.7947785663785827 -1.9930741489760588 -3.684712515342373 4.0837945062721603 -1.8963750832009645 -3.603728432179675 3.9935728791164622 -1.9205835254370314 -3.5227443490169774 3.903351251960764 -1.9447919676730983 -3.4417602658542794 3.8131296248050659 -1.9690004099091651 -3.3607761826915818 3.7229079976493678 -1.9932088521452318 -3.7712247225503011 4.0119239375429459 -1.8965097863701377 -3.6902406393876035 3.9217023103872473 -1.9207182286062046 -3.6092565562249055 3.8314806832315491 -1.9449266708422714 -3.5282724730622079 3.741259056075851 -1.9691351130783381 -3.4472883898995099 3.6510374289201528 -1.993343555314405 -3.9387210129209271 4.0302749959694291 -1.872436047303244 -3.8577369297582296 3.9400533688137309 -1.8966444895393109 -3.776752846595532 3.8498317416580323 -1.9208529317753777 -3.695768763432834 3.7596101145023342 -1.9450613740114446 -3.614784680270136 3.669388487346636 -1.9692698162475113 -3.533800597107438 3.5791668601909379 -1.993478258483578 -1.9430794375466636 4.6689186957274176 -1.9884759470309366 -1.9831402936956706 4.7849523856171681 -1.9642476940094078 -2.2577976123769026 5.1853869755205544 -1.8677832405614723 -2.2177367562278953 5.0693532856308039 -1.8920114935830015 -2.1776759000788881 4.9533195957410516 -1.9162397466045302 -2.1376150439298813 4.8372859058513011 -1.940467999626059 -2.0975541877808741 4.7212522159615489 -1.9646962526475877 -2.3722115064621057 5.1216868058649352 -1.8682317991996522 -2.3321506503130989 5.0056531159751847 -1.8924600522211814 -2.2920897941640916 4.8896194260854324 -1.9166883052427102 -2.2520289380150844 4.7735857361956819 -1.9409165582642389 -2.4866254005473092 5.057986636209316 -1.8686803578378322 -2.446564544398302 4.9419529463195655 -1.8929086108593614 -2.4065036882492947 4.8259192564298132 -1.9171368638808901 -2.3664428321002879 4.7098855665400627 -1.9413651169024189 -2.6010392946325123 4.9942864665536968 -1.8691289164760121 -2.560978438483505 4.8782527766639463 -1.8933571694975413 -2.5209175823344978 4.762219086774194 -1.91758542251907 -2.7154531887177158 4.9305862968980776 -1.8695774751141923 -2.6753923325687086 4.8145526070083262 -1.8938057281357212 -2.8298670828029189 4.8668861272424584 -1.8700260337523722 -2.7898062266539121 4.750852437352707 -1.8942542867739012 -2.9442809768881224 4.8031859575868392 -1.8704745923905524 -2.0508471837724009 4.608765216449819 -1.9889255191845523 -2.2115331210580806 4.657784161411576 -1.9651448776158438 -2.1496273373005419 4.5534079302777828 -1.9893764619161509 -2.3103132745862212 4.6024268752395399 -1.9655958203474424 -2.2484074908286824 4.4980506441057466 -1.9898274046477498 -2.4709992118719013 4.6514458202012987 -1.9418151787787341 -2.4090934281143617 4.5470695890675037 -1.9660467630790412 -2.3471876443568229 4.4426933579337105 -1.9902783473793484 -2.631685149157581 4.7004647651630558 -1.9180345372100256 -2.5697793654000418 4.5960885340292625 -1.9422661215103327 -2.5078735816425022 4.4917123028954675 -1.9664977058106399 -2.4459677978849634 4.3873360717616743 -1.9907292901109472 -2.7304653026857215 4.6451074789910196 -1.9184854799416242 -2.6685595189281823 4.5407312478572264 -1.9427170642419316 -2.6066537351706431 4.4363550167234314 -1.9669486485422387 -2.5447479514131039 4.3319787855896381 -1.9911802328425459 -2.8911512399714012 4.6941264239527785 -1.8947048383729157 -2.829245456213862 4.5897501928189843 -1.9189364226732231 -2.7673396724563233 4.4853739616851902 -1.9431680069735302 -2.7054338886987837 4.3809977305513952 -1.9673995912738373 -2.6435281049412449 4.2766214994176019 -1.9916311755741447 -3.0518371772570809 4.7431453689145364 -1.8709241968042072 -2.9899313934995417 4.6387691377807423 -1.8951557811045145 -2.928025609742003 4.5343929066469482 -1.9193873654048217 -2.8661198259844638 4.430016675513154 -1.9436189497051291 -2.8042140422269246 4.3256404443793599 -1.9678505340054362 -2.7423082584693854 4.2212642132455658 -1.9920821183057433 -1.1487336398699797 5.5835221423500547 -1.8599609670385036 -1.1318641078203568 5.4620071468979567 -1.8841817111334835 -1.114994575770734 5.3404921514458596 -1.9084024552284637 -1.0981250437211112 5.2189771559937617 -1.9326231993234435 -1.0812555116714879 5.0974621605416637 -1.9568439434184237 -1.0643859796218649 4.9759471650895666 -1.9810646875134037 -1.2750273020250864 5.5404757025887665 -1.8608667516613675 -1.2581577699754636 5.4189607071366686 -1.8850874957563475 -1.2412882379258408 5.2974457116845715 -1.9093082398513277 -1.2244187058762177 5.1759307162324735 -1.9335289839463075 -1.2075491738265947 5.0544157207803755 -1.9577497280412877 -1.4013209641801931 5.4974292628274783 -1.8617725362842314 -1.3844514321305701 5.3759142673753804 -1.8859932803792114 -1.3675819000809473 5.2543992719232833 -1.9102140244741914 -1.3507123680313242 5.1328842764711853 -1.9344347685691714 -1.5276146263352999 5.4543828230661902 -1.8626783209070952 -1.5107450942856766 5.3328678276140922 -1.8868990650020754 -1.4938755622360538 5.2113528321619951 -1.9111198090970554 -1.477006030186431 5.0898378367098971 -1.9353405531920351 -1.6539082884904066 5.411336383304902 -1.8635841055299591 -1.6370387564407833 5.289821387852804 -1.8878048496249391 -1.6201692243911605 5.1683063924007069 -1.9120255937199191 -1.7802019506455133 5.3682899435436138 -1.8644898901528228 -1.7633324185958899 5.2467749480915158 -1.8887106342478031 -1.9064956128006201 5.3252435037823256 -1.8653956747756868 -2.0327892749557268 5.2821970640210374 -1.8663014593985505 -1.1815527631323266 4.9355983514024242 -1.9819840487973892 -1.3306730777619244 5.0123061645644187 -1.9586602278285425 -1.2902895836946826 4.8977411768329153 -1.9829159500476292 -1.4394098983242807 4.9744489899949098 -1.9595921290787826 -1.3990264042570386 4.8598840022634064 -1.9838478512978692 -1.5885302129538785 5.0511568031569061 -1.9362683081099359 -1.5481467188866367 4.9365918154254009 -1.9605240303290226 -1.5077632248193946 4.8220268276938976 -1.9847797525481092 -1.7376505275834764 5.1278646163189014 -1.9129444871410894 -1.6972670335162345 5.0132996285873972 -1.9372002093601759 -1.6568835394489927 4.8987346408558921 -1.9614559315792626 -1.6165000453817506 4.7841696531243887 -1.9857116537983492 -1.8867708422130745 5.2045724294808959 -1.8896206661722428 -1.8463873481458326 5.0900074417493926 -1.9138763883913295 -1.8060038540785908 4.9754424540178883 -1.9381321106104159 -1.7656203600113489 4.8608774662863832 -1.9623878328295026 -1.7252368659441069 4.7463124785548798 -1.9866435550485892 -1.9955076627754305 5.1667152549113879 -1.8905525674224828 -1.9551241687081886 5.0521502671798837 -1.9148082896415695 -1.9147406746409468 4.9375852794483794 -1.9390640118606559 -1.8743571805737049 4.8230202917168752 -1.9633197340797426 -1.8339736865064629 4.7084553039853709 -1.9875754562988293 -2.1446279774050283 5.2434230680733833 -1.8672287464536361 -2.1042444833377867 5.1288580803418791 -1.8914844686727228 -2.0638609892705446 5.0142930926103748 -1.9157401908918095 -2.0234774952033026 4.8997281048788714 -1.9399959131108961 -0.07106240300517086 5.7564968717979763 -1.8481312215354211 -0.077314920792319386 5.6344742858364949 -1.8722805289176387 -0.083567438579467801 5.5124516998750153 -1.8964298362998562 -0.089819956366616271 5.3904291139135347 -1.9205791436820736 -0.096072474153764797 5.2684065279520551 -1.9447284510642913 -0.10232499194091331 5.1463839419905746 -1.9688777584465089 -0.20752483351477591 5.7355502628156945 -1.8496243040510574 -0.21377735130192443 5.6135276768542131 -1.873773611433275 -0.22002986908907285 5.4915050908927334 -1.8979229188154925 -0.22628238687622138 5.3694825049312529 -1.9220722261977099 -0.2325349046633699 5.2474599189697733 -1.9462215335799276 -0.34398726402438096 5.7146036538334126 -1.8511173865666937 -0.35023978181152948 5.5925810678719321 -1.8752666939489113 -0.35649229959867795 5.4705584819104516 -1.8994160013311288 -0.36274481738582648 5.3485358959489719 -1.9235653087133462 -0.36899733517297501 5.2265133099874914 -1.9477146160955638 -0.480449694533986 5.6936570448511308 -1.85261046908233 -0.48670221232113448 5.5716344588896503 -1.8767597764645476 -0.492954730108283 5.4496118729281697 -1.900909083846765 -0.49920724789543158 5.3275892869666901 -1.9250583912289827 -0.61691212504359139 5.6727104358688489 -1.8541035515979662 -0.6231646428307398 5.5506878499073693 -1.8782528589801839 -0.62941716061788844 5.4286652639458888 -1.9024021663624013 -0.75337455555319632 5.6517638268865671 -1.8555966341136028 -0.75962707334034485 5.5297412409250875 -1.8797459414958202 -0.88983698606280137 5.6308172179042861 -1.8570897166292391 -1.0262994165724064 5.6098706089220043 -1.8585827991448756 -0.10128792971133083 5.0249117060033814 -1.9930604057278336 -0.23624709803649169 5.125629122860758 -1.9703824594860477 -0.21890796336412988 5.005387663561538 -1.994639666543002 -0.35386713168929074 5.1061050804189145 -1.9719617203012161 -0.33652799701692887 4.9858636211196945 -1.9962189273581703 -0.48882630001445171 5.2068224972762911 -1.94928377405943 -0.47148716534208979 5.0865810379770711 -1.9735409811163844 -0.45414803066972786 4.966339578677851 -1.9977981881733387 -0.62378546833961268 5.3075399141336677 -1.9266058278176439 -0.60644633366725076 5.1872984548344476 -1.9508630348745983 -0.58910719899488884 5.0670569955352276 -1.9751202419315528 -0.57176806432252691 4.9468155362360076 -1.9993774489885068 -0.75874463666477343 5.4082573309910442 -1.903927881575858 -0.74140550199241173 5.2880158716918242 -1.9281850886328122 -0.7240663673200497 5.1677744123926042 -1.9524422956897667 -0.70672723264768789 5.0475329530933841 -1.9766995027467211 -0.8937038049899344 5.5089747478484208 -1.8812499353340719 -0.87636467031757248 5.3887332885492008 -1.9055071423910264 -0.85902553564521078 5.2684918292499807 -1.9297643494479806 -0.84168640097284864 5.1482503699507607 -1.954021556504935 -0.82434726630048694 5.0280089106515407 -1.9782787635618893 -1.0113238386427335 5.4894507054065773 -1.8828291961492403 -0.99398470397037153 5.3692092461073573 -1.9070864032061947 -0.97664556929800972 5.2489677868081372 -1.9313436102631489 -0.95930643462564769 5.1287263275089172 -1.9556008173201032 -0.94196729995328587 5.0084848682096972 -1.9798580243770576 1.0449625499372046 5.6176400167827172 -1.8566717354357503 1.0176095262280733 5.4997527161452746 -1.8806568549045029 0.99025650251894248 5.381865415507832 -1.9046419743732557 0.96290347880981142 5.2639781148703886 -1.9286270938420083 0.93555045510068047 5.146090814232946 -1.9526122133107611 0.90819743139154929 5.0282035135955034 -1.9765973327795137 0.90163731722529061 5.6218954237934327 -1.858633189662388 0.87428429351615944 5.5040081231559901 -1.8826183091311408 0.84693126980702849 5.3861208225185475 -1.9066034285998934 0.81957824609789753 5.2682335218811041 -1.9305885480686462 0.79222522238876647 5.1503462212436615 -1.9545736675373988 0.75831208451337662 5.6261508308041481 -1.8605946438890257 0.73095906080424555 5.5082635301667056 -1.8845797633577785 0.70360603709511449 5.390376229529263 -1.9085648828265314 0.67625301338598354 5.2724889288918195 -1.932550002295284 0.61498685180146273 5.6304062378148636 -1.8625560981156635 0.58763382809233167 5.512518937177421 -1.8865412175844165 0.5602808043832006 5.3946316365399776 -1.9105263370531691 0.47166161908954884 5.6346616448255782 -1.8645175523423012 0.44430859538041778 5.5167743441881356 -1.8885026718110542 0.41695557167128672 5.398887043550693 -1.9124877912798071 0.32833638637763474 5.6389170518362937 -1.8664790065689392 0.30098336266850367 5.5210297511988511 -1.8904641260376922 0.18501115366572085 5.6431724588470082 -1.8684404607955769 0.77362214569166687 5.0312042443341589 -1.9786369360374949 0.65464483354446124 5.1537778610615623 -1.9565864311014367 0.64893169124282135 5.032787564977995 -1.9807648244000828 0.53566752139725582 5.2763514777889648 -1.9345359261653785 0.52995437909561571 5.1553611817053984 -1.9587143194640246 0.52424123679397583 5.034370885621831 -1.9828927127626708 0.41097706694841035 5.2779347984328009 -1.9366638145279664 0.4052639246467703 5.1569445023492344 -1.9608422078266126 0.39955078234513042 5.035954206265667 -1.9850206011252587 0.29199975480120466 5.4005084151602052 -1.914613309591908 0.28628661249956472 5.2795181190766369 -1.9387917028905541 0.28057347019792467 5.1585278229930704 -1.9629700961892005 0.27486032789628478 5.037537526909504 -1.9871484894878466 0.17302244265399919 5.5230820318876077 -1.8925628046558498 0.16730930035235922 5.4020917358040412 -1.9167411979544959 0.16159615805071925 5.2811014397204739 -1.9409195912531421 0.15588301574907917 5.1601111436369065 -1.9650979845517882 0.15016987344743929 5.03912084755334 -1.9892763778504345 0.054045130506793632 5.6456556486150111 -1.8705122997197914 0.048331988205153678 5.5246653525314438 -1.8946906930184377 0.042618845903513773 5.4036750564478773 -1.9188690863170836 0.036905703601873743 5.2826847603643099 -1.9430474796157298 0.031192561300233693 5.1616944642807434 -1.9672258729143761 0.025479418998593791 5.0407041681971769 -1.9914042662130222 2.1088934917203082 5.2637761474070306 -1.8654091842521914 2.0619554341857844 5.1534910843883805 -1.8892265923353275 2.0150173766512611 5.0432060213697296 -1.9130440004184641 1.9680793191167372 4.9329209583510796 -1.9368614085016005 1.9211412615822137 4.8226358953324286 -1.9606788165847366 1.8742032040476899 4.7123508323137786 -1.984496224667873 1.9694643695043361 5.2962812458788164 -1.8672817510512572 1.9225263119698124 5.1859961828601664 -1.8910991591343933 1.8755882544352889 5.0757111198415155 -1.9149165672175299 1.8286501969007651 4.9654260568228654 -1.9387339753006663 1.7817121393662416 4.8551409938042145 -1.9625513833838024 1.8300352472883641 5.3287863443506023 -1.8691543178503229 1.7830971897538404 5.2185012813319522 -1.8929717259334591 1.7361591322193168 5.1082162183133013 -1.9167891340165957 1.6892210746847933 4.9979311552946504 -1.940606542099732 1.6906061250723918 5.3612914428223881 -1.8710268846493887 1.6436680675378681 5.2510063798037381 -1.8948442927325251 1.5967300100033444 5.1407213167850871 -1.9186617008156615 1.5981150603909435 5.504081604312824 -1.8490820433653186 1.5511770028564198 5.3937965412941731 -1.8728994514484547 1.5042389453218961 5.283511478275523 -1.8967168595315909 1.4586859381749715 5.536586702784609 -1.8509546101643843 1.4117478806404478 5.426301639765958 -1.8747720182475205 1.3192568159589995 5.5690918012563948 -1.8528271769634501 1.1798276937430277 5.6015968997281798 -1.8546997437625161 1.7475666722283765 4.7404138497078998 -1.9864761869222836 1.6525664328535745 4.8840752934859957 -1.9645102807912684 1.6257970778804416 4.7667868785869949 -1.9884970077479187 1.5575661934787726 5.0277367372640924 -1.9425443746602531 1.5307968385056396 4.9104483223650908 -1.9665311016169036 1.5040274835325067 4.79315990746609 -1.9905178285735539 1.4625659541039706 5.1713981810421883 -1.920578468529238 1.4357965991308377 5.0541097661431875 -1.9445651954858882 1.4090272441577048 4.9368213512441859 -1.9685519224425387 1.3822578891845718 4.8195329363451851 -1.992538649399189 1.3675657147291687 5.315059624820285 -1.8986125623982228 1.3407963597560357 5.1977712099212834 -1.9225992893548731 1.3140270047829028 5.0804827950222826 -1.9465860163115236 1.2872576498097699 4.963194380123281 -1.9705727432681739 1.2604882948366369 4.8459059652242811 -1.9945594702248244 1.2725654753543667 5.45872106859838 -1.8766466562672075 1.2457961203812338 5.3414326536993801 -1.900633383223858 1.2190267654081008 5.2241442388003785 -1.9246201101805083 1.1922574104349679 5.1068558239013777 -1.9486068371371588 1.165488055461835 4.9895674090023769 -1.9725935640938093 1.1387187004887021 4.8722789941033762 -1.9965802910504595 1.1507958810064318 5.4850940974774751 -1.8786674770928429 1.1240265260332991 5.3678056825784752 -1.9026542040494931 1.097257171060166 5.2505172676794736 -1.9266409310061436 1.070487816087033 5.1332288527804728 -1.9506276579627941 1.0437184611139003 5.015940437881472 -1.9746143849194444 1.0169491061407674 4.8986520229824722 -1.9986011118760949 3.0970259607119281 4.8118245413843281 -1.8545601519985022 3.030750825999855 4.7125486915510244 -1.878304354155502 2.9644756912877819 4.6132728417177207 -1.9020485563125018 2.8982005565757083 4.5139969918844169 -1.9257927584695016 2.8319254218636347 4.4147211420511132 -1.9495369606265014 2.7656502871515611 4.3154452922178086 -1.9732811627835012 2.9726755582907947 4.870816059040938 -1.8558778267618563 2.9064004235787215 4.7715402092076333 -1.8796220289188561 2.8401252888666484 4.6722643593743296 -1.9033662310758559 2.7738501541545748 4.5729885095410259 -1.9271104332328557 2.7075750194425012 4.4737126597077221 -1.9508546353898555 2.8483251558696612 4.9298075766975469 -1.8571955015252104 2.782050021157588 4.8305317268642431 -1.8809397036822102 2.7157748864455149 4.7312558770309385 -1.90468390583921 2.6494997517334413 4.6319800271976348 -1.9284281079962098 2.7239747534485281 4.9887990943541567 -1.8585131762885645 2.657699618736455 4.8895232445208521 -1.8822573784455641 2.5914244840243814 4.7902473946875483 -1.9060015806025639 2.5251493493123078 4.6909715448542437 -1.9297457827595637 2.5996243510273946 5.0477906120107665 -1.8598308510519186 2.5333492163153215 4.9485147621774619 -1.8835750532089182 2.4670740816032479 4.8492389123441573 -1.907319255365918 2.4752739486062616 5.1067821296673754 -1.8611485258152725 2.4089988138941885 5.0075062798340708 -1.884892727972272 2.3509235461851281 5.1657736473239844 -1.8624662005786266 2.7078615203865795 4.2114635665967635 -1.997055299346078 2.6464932494661468 4.3715569760610489 -1.9746171563715016 2.5998130809677398 4.2614152908501852 -1.9984304768685923 2.5851249785457142 4.5316503855253334 -1.9521790133969255 2.5384448100473072 4.4215087003144706 -1.9759923338940162 2.4917646415488997 4.311367015103607 -1.9998056543911069 2.4770765391268745 4.5816021097787551 -1.9535541909194398 2.4303963706284675 4.4714604245678915 -1.9773675114165308 2.4157082682064419 4.7416955192430397 -1.9311160479448637 2.3690280997080349 4.631553834032176 -1.9549293684419544 2.3223479312096273 4.5214121488213133 -1.9787426889390451 2.3543399972860097 4.9017889287073242 -1.9086779049702873 2.3076598287876022 4.7916472434964605 -1.9324912254673781 2.2609796602891952 4.6815055582855978 -1.9563045459644688 2.2142994917907877 4.5713638730747341 -1.9801178664615597 2.2929717263655776 5.0618823381716096 -1.8862397619957112 2.2462915578671701 4.9517406529607451 -1.9100530824928019 2.1996113893687625 4.8415989677498823 -1.9338664029898927 2.1529312208703555 4.7314572825390186 -1.9576797234869834 2.106251052371948 4.6213155973281559 -1.9814930439840741 2.2316034554451449 5.221975747635895 -1.8638016190211351 2.1849232869467379 5.1118340624250314 -1.8876149395182258 2.1382431184483304 5.0016923772141668 -1.9114282600153165 2.0915629499499229 4.8915506920033032 -1.935241580512407 2.0448827814515154 4.7814090067924404 -1.9590549010094978 1.9982026129531081 4.6712673215815768 -1.9828682215065887 3.969580099539991 4.013507717484682 -1.8711137722856837 3.8855108443686617 3.9288609777668686 -1.8948520622035046 3.8014415891973328 3.844214238049056 -1.9185903521213252 3.7173723340260043 3.7595674983312435 -1.9423286420391459 3.6333030788546754 3.6749207586134309 -1.9660669319569666 3.5492338236833465 3.5902740188956184 -1.9898052218747873 3.9484019933461032 4.1796560240357739 -1.8481283420747814 3.8643327381747739 4.0950092843179613 -1.8718666319926021 3.7802634830034449 4.0103625446001478 -1.8956049219104227 3.696194227832116 3.9257158048823353 -1.9193432118282436 3.6121249726607871 3.8410690651645227 -1.9430815017460641 3.5280557174894582 3.7564223254467097 -1.9668197916638848 3.8431546319808865 4.2611575908690531 -1.8488812017816998 3.7590853768095571 4.1765108511512405 -1.8726194916995202 3.6750161216382278 4.0918641114334271 -1.8963577816173411 3.5909468664668993 4.0072173717156145 -1.9200960715351618 3.5068776112955704 3.9225706319978015 -1.9438343614529823 3.7379072706156693 4.3426591577023324 -1.8496340614886182 3.6538380154443399 4.2580124179845198 -1.8733723514064387 3.5697687602730106 4.1733656782667063 -1.8971106413242593 3.4856995051016821 4.0887189385488938 -1.9208489312420802 3.6326599092504521 4.4241607245356116 -1.8503869211955364 3.5485906540791232 4.339513984817799 -1.8741252111133568 3.4645213989077939 4.2548672450999856 -1.8978635010311777 3.380452143736465 4.1702205053821721 -1.9216017909489984 3.527412547885235 4.5056622913688908 -1.8511397809024548 3.443343292713906 4.4210155516510774 -1.8748780708202752 3.3592740375425771 4.336368811933264 -1.8986163607380959 3.4221651865200182 4.5871638582021692 -1.851892640609373 3.3380959313486889 4.5025171184843567 -1.8756309305271934 3.3169178251548015 4.6686654250354476 -1.8526455003162914 3.4532665804905198 3.6641389397361124 -1.9905612720907524 3.4282917880083223 3.8334115544685092 -1.9675745365772961 3.3620047593509144 3.7341317501358153 -1.99131894003306 3.4033169955261249 4.0026841692009061 -1.9445878010638398 3.3370299668687164 3.9034043648682122 -1.9683322045196037 3.2707429382113085 3.8041245605355183 -1.9920766079753676 3.3120551743865194 4.072676979600609 -1.9453454690061474 3.2457681457291105 3.9733971752679151 -1.9690898724619113 3.1794811170717026 3.8741173709352212 -1.9928342759176751 3.2870803819043219 4.2419495943330059 -1.9223587334926913 3.220793353246914 4.142669790000312 -1.9461031369484549 3.1545063245895051 4.0433899856676181 -1.9698475404042188 3.0882192959320971 3.9441101813349242 -1.9935919438599827 3.2621055894221249 4.4112222090654027 -1.8993719979792349 3.1958185607647165 4.3119424047327088 -1.9231164014349988 3.1295315321073081 4.2126626004000149 -1.9468608048907625 3.0632445034498996 4.113382796067321 -1.9706052083465264 2.9969574747924912 4.0141029917346271 -1.9943496118022903 3.2371307969399274 4.5804948237978005 -1.8763852624657786 3.170843768282519 4.4812150194651057 -1.9001296659215425 3.1045567396251106 4.3819352151324118 -1.9238740693773064 3.0382697109677022 4.2826554107997179 -1.9476184728330701 2.9719826823102937 4.183375606467024 -1.9713628762888342 2.9056956536528853 4.0840958021343301 -1.9951072797445981 3.21215600445773 4.7497674385301973 -1.8533985269523225 3.1458689758003215 4.6504876341975034 -1.8771429304080862 3.0795819471429136 4.5512078298648095 -1.9008873338638501 3.0132949184855051 4.4519280255321148 -1.9246317373196142 2.9470078898280967 4.3526482211994209 -1.9483761407753779 2.8807208611706883 4.253368416866727 -1.9721205442311418 2.8144338325132798 4.1540886125340331 -1.9958649476869057 4.6341928144459397 3.2354859308098938 -1.8682972047674402 4.5352257774916502 3.1687054052983785 -1.8920558590253933 4.4362587405373617 3.1019248797868633 -1.9158145132833462 4.3372917035830731 3.0351443542753476 -1.9395731675412988 4.2383246666287846 2.9683638287638323 -1.9633318217992517 4.5499228768225661 3.3354693637495294 -1.8686395352278671 4.4509558398682767 3.2686888382380141 -1.8923981894858202 4.3519888029139882 3.2019083127264989 -1.9161568437437728 4.2530217659596996 3.1351277872149832 -1.9399154980017257 4.1540547290054111 3.0683472617034679 -1.9636741522596783 4.4656529391991926 3.435452796689165 -1.8689818656882939 4.3666859022449032 3.3686722711776498 -1.8927405199462468 4.2677188652906146 3.3018917456661345 -1.9164991742041997 4.1687518283363261 3.2351112201546188 -1.9402578284621523 4.3813830015758191 3.5354362296288007 -1.8693241961487208 4.2824159646215296 3.4686557041172854 -1.8930828504066737 4.1834489276672411 3.4018751786057702 -1.9168415046646263 4.2971130639524455 3.6354196625684363 -1.8696665266091477 4.1981460269981561 3.568639137056921 -1.8934251808671003 4.212843126329072 3.7354030955080719 -1.8700088570695745 4.1138760893747826 3.6686225699965567 -1.8937675113275272 4.1285731887056984 3.8353865284477076 -1.8703511875300012 4.1408373853987772 2.8997952389168411 -1.9870885711228137 4.067770955780686 2.9862409015557865 -1.9874164789678403 4.0788732945731958 3.1573485925621321 -1.964004782814502 3.9947045261625949 3.0726865641947319 -1.987744386812867 4.0899756333657038 3.3284562835684781 -1.9405930866611636 4.0058068649551046 3.2437942552010774 -1.9643326906595286 3.9216380965445041 3.1591322268336772 -1.9880722946578937 4.1010779721582136 3.4995639745748237 -1.917181390507825 4.0169092037476126 3.4149019462074235 -1.9409209945061903 3.9327404353370135 3.3302399178400228 -1.9646605985045553 3.8485716669264129 3.2455778894726226 -1.9884002025029204 4.0280115425401224 3.5860096372137691 -1.9175092983528517 3.9438427741295219 3.5013476088463689 -1.9412489023512169 3.8596740057189223 3.4166855804789682 -1.964988506349582 3.7755052373083222 3.332023552111568 -1.9887281103479471 4.0391138813326304 3.7571173282201147 -1.8940976021995131 3.9549451129220312 3.6724552998527145 -1.9178372061978783 3.8707763445114312 3.5877932714853138 -1.9415768101962436 3.7866075761008311 3.5031312431179136 -1.9653164141946087 3.7024388076902315 3.4184692147505134 -1.9890560181929737 4.0502162201251402 3.9282250192264607 -1.8706859060461747 3.9660474517145392 3.8435629908590601 -1.8944255100445397 3.88187868330394 3.7589009624916598 -1.918165114042905 3.79770991489334 3.6742389341242592 -1.9419047180412701 3.7135411464827399 3.5895769057568589 -1.9656443220396351 3.6293723780721403 3.5049148773894587 -1.9893839260380004 5.19807559181376 2.2374530284603167 -1.8674634428386472 5.0878725593221921 2.1911586134339309 -1.8912512314349434 4.977669526830625 2.1448641984075456 -1.9150390200312395 4.8674664943390589 2.0985697833811598 -1.9388268086275355 4.7572634618474909 2.0522753683547745 -1.9626145972238316 4.6470604293559239 2.0059809533283888 -1.9864023858201276 5.1366228627738293 2.351699210039758 -1.8675316383883043 5.0264198302822614 2.3054047950133718 -1.8913194269846005 4.9162167977906943 2.2591103799869865 -1.9151072155808966 4.8060137652991282 2.2128159649606012 -1.9388950041771926 4.6958107328075602 2.1665215499342154 -1.9626827927734887 5.0751701337338986 2.4659453916191989 -1.8675998339379614 4.9649671012423306 2.4196509765928127 -1.8913876225342576 4.8547640687507636 2.3733565615664274 -1.9151754111305537 4.7445610362591975 2.3270621465400421 -1.9389631997268499 5.013717404693967 2.5801915731986402 -1.8676680294876185 4.9035143722023991 2.533897158172254 -1.8914558180839149 4.7933113397108329 2.4876027431458687 -1.915243606680211 4.9522646756540363 2.6944377547780816 -1.8677362250372758 4.8420616431624683 2.6481433397516954 -1.891524013633572 4.7318586106709022 2.60184892472531 -1.9153118022298681 4.8908119466141056 2.8086839363575224 -1.8678044205869329 4.7806089141225376 2.7623895213311367 -1.8915922091832293 4.829359217574174 2.9229301179369638 -1.8678726161365902 4.5922051258004357 2.1080601373159542 -1.9864540063780496 4.6380652834809242 2.2739307519296608 -1.9627416743671562 4.5389686121968591 2.2071539426140441 -1.9865015599813487 4.6839254411614135 2.4398013665433673 -1.9390293423562628 4.5848287698773476 2.3730245572277506 -1.9627892279704553 4.4857320985932816 2.3062477479121339 -1.9865491135846478 4.630688927557836 2.5388951718414572 -1.9390768959595619 4.53159225627377 2.4721183625258405 -1.9628367815737544 4.432495584989705 2.4053415532102238 -1.9865966671879469 4.6765490852383245 2.7047657864551633 -1.9153645639486683 4.5774524139542585 2.6379889771395471 -1.939124449562861 4.4783557426701934 2.5712121678239304 -1.9628843351770535 4.3792590713861275 2.5044353585083137 -1.986644220791246 4.7224092429188129 2.8706364010688694 -1.8916522319377747 4.623312571634747 2.8038595917532532 -1.9154121175519674 4.5242159003506819 2.7370827824376365 -1.9391720031661601 4.4251192290666159 2.6703059731220202 -1.9629318887803524 4.3260225577825508 2.6035291638064031 -1.9866917743945449 4.7682694005993014 3.0365070156825764 -1.867939899926881 4.6691727293152354 2.9697302063669593 -1.8916997855410738 4.5700760580311703 2.902953397051343 -1.9154596711552665 4.4709793867471044 2.8361765877357263 -1.939219556769459 4.3718827154630393 2.7693997784201096 -1.9629794423836515 4.2727860441789733 2.702622969104493 -1.986739327997844 4.7150328869957239 3.1356008209806663 -1.8679874535301801 4.6159362157116588 3.0688240116650496 -1.8917473391443729 4.5168395444275928 3.0020472023494329 -1.9155072247585656 4.4177428731435278 2.9352703930338158 -1.9392671103727581 4.3186462018594618 2.8684935837181991 -1.9630269959869504 4.2195495305753967 2.8017167744025824 -1.9867868816011429 5.5399618035416101 1.1467535434927436 -1.8684075643475186 5.422706603771192 1.1227459039661727 -1.8922277019237028 5.3054514040007739 1.0987382644396013 -1.916047839499887 5.1881962042303558 1.0747306249130304 -1.9398679770760712 5.0709410044599368 1.0507229853864595 -1.9636881146522553 4.9536858046895196 1.0267153458598883 -1.9875082522284395 5.5029785539466589 1.2706400565542684 -1.8682933172646952 5.3857233541762408 1.2466324170276972 -1.8921134548408793 5.2684681544058227 1.2226247775011261 -1.9159335924170635 5.1512129546354046 1.1986171379745549 -1.9397537299932477 5.0339577548649865 1.174609498447984 -1.9635738675694319 5.4659953043517078 1.3945265696157931 -1.8681790701818717 5.3487401045812897 1.370518930089222 -1.8919992077580559 5.2314849048108716 1.3465112905626508 -1.91581934533424 5.1142297050404535 1.3225036510360797 -1.9396394829104242 5.4290120547567566 1.5184130826773177 -1.8680648230990482 5.3117568549863385 1.4944054431507467 -1.8918849606752324 5.1945016552159204 1.4703978036241756 -1.9157050982514163 5.0772464554455023 1.4463901640976045 -1.9395252358276005 5.3920288051618055 1.6422995957388424 -1.8679505760162247 5.2747736053913874 1.6182919562122713 -1.8917707135924087 5.1575184056209693 1.5942843166857001 -1.9155908511685928 5.3550455555668544 1.7661861088003672 -1.867836328933401 5.2377903557964371 1.742178469273796 -1.8916564665095852 5.3180623059719041 1.8900726218618917 -1.8677220818505775 5.281079056376953 2.0139591349234163 -1.8676078347677538 4.9197067295632468 1.1409335070590747 -1.9873803654231723 4.9981074625045538 1.2948498087664562 -1.9634544765702411 4.8877677791162606 1.2485859233429677 -1.9872432159287152 4.9661685120575676 1.4025022250503492 -1.963317327075784 4.8558288286692743 1.3562383396268607 -1.9871060664342581 5.0445692449988746 1.5564185267577308 -1.9393914382228525 4.9342295616105813 1.5101546413342422 -1.9631801775813269 4.8238898782222881 1.4638907559107537 -1.986968916939801 5.1229699779401816 1.7103348284651121 -1.9154655493699213 5.0126302945518884 1.6640709430416241 -1.9392542887283954 4.9022906111635951 1.6178070576181354 -1.9630430280868698 4.7919509277753018 1.5715431721946469 -1.986831767445344 5.2013707108814886 1.8642511301724936 -1.8915396605169901 5.0910310274931954 1.8179872447490051 -1.9153283998754642 4.9806913441049021 1.7717233593255171 -1.9391171392339384 4.8703516607166089 1.7254594739020284 -1.9629058785924127 4.7600119773283156 1.6791955884785399 -1.9866946179508866 5.1694317604345024 1.9719035464563865 -1.891402511022533 5.0590920770462091 1.9256396610328981 -1.9151912503810071 4.9487523936579167 1.8793757756094098 -1.9389799897394813 4.8384127102696226 1.8331118901859214 -1.9627687290979554 4.7280730268813302 1.7868480047624329 -1.9865574684564296 5.2478324933758094 2.125819848163768 -1.8674766221696018 5.1374928099875161 2.0795559627402795 -1.8912653615280759 5.0271531265992229 2.0332920773167911 -1.91505410088655 4.9168134432109305 1.9870281918933028 -1.9388428402450242 4.8064737598226372 1.9407643064698143 -1.9626315796034983 4.696134076434344 1.8945004210463261 -1.9864203189619722 5.6498312152217016 0.010182091334362098 -1.870541055620828 5.5299764766283852 0.0094613018594286169 -1.8943957665167328 5.4101217380350697 0.008740512384494914 -1.9182504774126377 5.2902669994417542 0.0080197229095613776 -1.9421051883085425 5.1704122608484386 0.0072989334346277857 -1.9659598992044474 5.0505575222551231 0.0065781439596942354 -1.9898146101003522 5.638352521461738 0.13890065844600974 -1.8703025639584161 5.5184977828684216 0.13817986897107626 -1.8941572748543209 5.3986430442751061 0.13745907949614256 -1.9180119857502258 5.2787883056817906 0.13673829002120902 -1.9418666966461307 5.1589335670884751 0.13601750054627548 -1.9657214075420355 5.6268738277017745 0.26761922555765738 -1.8700640722960042 5.5070190891084581 0.2668984360827239 -1.8939187831919091 5.3871643505151425 0.2661776466077902 -1.9177734940878139 5.267309611921827 0.26545685713285661 -1.9416282049837188 5.6153951339418109 0.39633779266930502 -1.8698255806335924 5.4955403953484945 0.39561700319437154 -1.8936802915294972 5.375685656755179 0.39489621371943784 -1.9175350024254021 5.2558309181618634 0.39417542424450425 -1.9413897133213069 5.6039164401818473 0.525056359780953 -1.8695870889711805 5.4840617015885309 0.52433557030601952 -1.8934417998670854 5.3642069629952154 0.5236147808310857 -1.9172965107629902 5.5924377464218837 0.65377492689260064 -1.8693485973087687 5.4725830078285673 0.65305413741766705 -1.8932033082046735 5.5809590526619202 0.78249349400424828 -1.8691101056463568 5.4611043140686037 0.78177270452931469 -1.8929648165422617 5.5694803589019566 0.91121206111589592 -1.868871613983945 5.0398948259871963 0.12758462462421771 -1.9895648951507252 5.147590974395083 0.2634497607744013 -1.9654810439359285 5.0301935618015232 0.23950449974920884 -1.989301956596244 5.1378897102094099 0.37536963589939265 -1.9652181053814473 5.0204922976158501 0.3514243748742002 -1.9890390180417628 5.2455858586172965 0.51123477204957612 -1.9411342541666505 5.1281884460237368 0.48728951102438389 -1.964955166826966 5.0107910334301771 0.46334424999919144 -1.9887760794872815 5.3532820070251832 0.64709990819975971 -1.917050402951854 5.2358845944316235 0.62315464717456748 -1.9408713156121693 5.1184871818380637 0.59920938614937502 -1.9646922282724848 5.001089769244504 0.57526412512418268 -1.9885131409328003 5.3435807428395101 0.75901978332475106 -1.9167874643973728 5.2261833302459504 0.73507452229955872 -1.9406083770576881 5.1087859176523907 0.71112926127436626 -1.9644292897180036 4.9913885050588309 0.68718400024917403 -1.9882502023783191 5.4512768912473968 0.89488491947493454 -1.8927036131825759 5.3338794786538379 0.87093965844974242 -1.9165245258428916 5.2164820660602782 0.84699439742454996 -1.9403454385032068 5.0990846534667185 0.82304913639935751 -1.9641663511635223 4.9816872408731587 0.79910387537416527 -1.9879872638238378 5.5589730396552843 1.0307500556251181 -1.8686197619677789 5.4415756270617246 1.0068047945999259 -1.8924406746280946 5.3241782144681649 0.98285953357473366 -1.9162615872884101 5.2067808018746051 0.9589142725495412 -1.9400824999487256 5.0893833892810454 0.93496901152434886 -1.9639034126090409 4.9719859766874857 0.91102375049915651 -1.9877243252693564 5.657392692708183 -1.0184972184395011 -1.8492829230541468 5.5395073833913706 -0.99587254637637346 -1.8731750125394371 5.4216220740745582 -0.97324787431324566 -1.8970671020247278 5.3037367647577458 -0.95062320225011809 -1.9209591915100181 5.1858514554409334 -0.92799853018699052 -1.9448512809953087 5.067966146124121 -0.90537385812386295 -1.9687433704805992 5.6716906120560244 -0.88995280808634258 -1.848957223948088 5.553805302739212 -0.86732813602321501 -1.8728493134333783 5.4359199934223996 -0.84470346396008733 -1.8967414029186691 5.3180346841055872 -0.82207879189695965 -1.9206334924039594 5.2001493747887748 -0.79945411983383208 -1.94452558188925 5.0822640654719615 -0.77682944777070451 -1.9684176713745405 5.6859885314038658 -0.76140839773318403 -1.8486315248420291 5.5681032220870534 -0.73878372567005657 -1.8725236143273196 5.450217912770241 -0.71615905360692889 -1.8964157038126102 5.3323326034534286 -0.69353438154380131 -1.9203077932979007 5.2144472941366162 -0.67090970948067363 -1.9441998827831912 5.7002864507517073 -0.63286398738002547 -1.8483058257359704 5.5824011414348949 -0.61023931531689812 -1.8721979152212607 5.4645158321180825 -0.58761464325377044 -1.8960900047065514 5.34663052280127 -0.56498997119064287 -1.919982094191842 5.7145843700995487 -0.50431957702686714 -1.8479801266299114 5.5966990607827363 -0.48169490496373968 -1.8718722161152019 5.4788137514659239 -0.45907023290061211 -1.8957643056004925 5.6109969801305777 -0.35315049461058112 -1.871546517009143 5.4931116708137653 -0.33052582254745355 -1.8954386064944337 5.6252948994784191 -0.22460608425742273 -1.8712208179030843 4.9495354804121554 -0.88877210078724378 -1.992625942222233 4.9623182202794069 -0.77696132900157133 -1.992273799693087 5.095091556265408 -0.66452444686293466 -1.9680663098536446 4.9751009601466585 -0.66515055721589889 -1.9919216571639411 5.2278648922514099 -0.55208756472429799 -1.9438588200142024 5.1078742961326595 -0.55271367507726221 -1.9677141673244987 4.98788370001391 -0.55333978543022644 -1.9915695146347951 5.3606382282374119 -0.43965068258566153 -1.9196513301747602 5.2406476321186606 -0.44027679293862565 -1.9435066774850565 5.1206570359999111 -0.44090290329158988 -1.9673620247953527 5.0006664398811607 -0.44152901364455399 -1.9912173721056492 5.3734209681046625 -0.32783991079998903 -1.9192991876456142 5.2534303719859121 -0.32846602115295315 -1.9431545349559105 5.1334397758671617 -0.32909213150591737 -1.9670098822662068 5.0134491797484122 -0.32971824185888143 -1.9908652295765032 5.5061943040906645 -0.21540302866135244 -1.8950916978061718 5.3862037079719141 -0.21602913901431664 -1.9189470451164681 5.2662131118531628 -0.21665524936728081 -1.9428023924267643 5.1462225157344132 -0.21728135972024498 -1.9666577397370608 5.0262319196156628 -0.21790747007320904 -1.9905130870473571 5.6389676400766664 -0.10296614652271587 -1.8708842079667294 5.5189770439579151 -0.10359225687568004 -1.8947395552770256 5.3989864478391647 -0.10421836722864426 -1.9185949025873221 5.2789958517204143 -0.10484447758160841 -1.9424502498976184 5.1590052556016639 -0.10547058793457256 -1.9663055972079146 5.0390146594829144 -0.10609669828753665 -1.9901609445182111 5.3229096228766144 -2.1323655369245826 -1.8527369642216496 5.2114920194457728 -2.0871679530046041 -1.8766700080387875 5.1000744160149303 -2.0419703690846251 -1.9006030518559252 4.9886568125840878 -1.9967727851646466 -1.9245360956730626 4.8772392091532462 -1.9515752012446679 -1.9484691394902003 4.7658216057224045 -1.9063776173246889 -1.972402183307338 5.3624059870700558 -2.0088710895102064 -1.8523477843231211 5.2509883836392142 -1.9636735055902279 -1.876280828140259 5.1395707802083717 -1.9184759216702489 -1.9002138719573967 5.0281531767775292 -1.8732783377502704 -1.9241469157745341 4.9167355733466875 -1.8280807538302917 -1.9480799595916718 4.8053179699158459 -1.7828831699103129 -1.9720130034088093 5.4019023512634972 -1.8853766420958302 -1.8519586044245926 5.2904847478326555 -1.8401790581758517 -1.8758916482417305 5.179067144401813 -1.7949814742558727 -1.8998246920588682 5.0676495409709705 -1.7497838903358942 -1.9237577358760056 4.9562319375401289 -1.7045863064159152 -1.9476907796931433 5.4413987154569385 -1.761882194681454 -1.8515694245260641 5.3299811120260969 -1.7166846107614753 -1.875502468343202 5.2185635085952544 -1.6714870268414963 -1.8994355121603397 5.1071459051644119 -1.6262894429215178 -1.9233685559774771 5.4808950796503799 -1.6383877472670774 -1.8511802446275356 5.3694774762195383 -1.5931901633470986 -1.8751132884446735 5.2580598727886958 -1.5479925794271197 -1.8990463322618112 5.5203914438438213 -1.5148932998527009 -1.8507910647290071 5.4089738404129788 -1.4696957159327222 -1.874724108546145 5.2975562369821363 -1.4244981320127434 -1.8986571523632825 5.5598878080372627 -1.3913988524383245 -1.8504018848304786 5.4484702046064202 -1.346201268518346 -1.8743349286476165 5.5993841722307032 -1.2679044050239481 -1.8500127049319501 5.6388805364241446 -1.1444099576095716 -1.8496235250334219 4.6531075156017749 -1.8655907520036796 -1.9963272913712502 4.6878675546770188 -1.7582095415813741 -1.995909120579388 4.8406412579261175 -1.6735857558176193 -1.9715982802455174 4.7226275937522626 -1.6508283311590688 -1.9954909497875257 4.9934149611752154 -1.5889619700538642 -1.9472874399116467 4.8754012970013614 -1.5662045453953137 -1.9711801094536552 4.7573876328275064 -1.5434471207367633 -1.9950727789956635 5.1461886644243133 -1.5043381842901091 -1.9229765995777761 5.0281750002504593 -1.4815807596315587 -1.9468692691197844 4.9101613360766052 -1.4588233349730082 -1.9707619386617929 4.7921476719027503 -1.4360659103144577 -1.9946546082038012 5.1809487034995572 -1.3969569738678036 -1.9225584287859139 5.0629350393257031 -1.3741995492092531 -1.9464510983279222 4.944921375151849 -1.3514421245507027 -1.9703437678699307 4.826907710977995 -1.3286846998921522 -1.994236437411939 5.3337224067486559 -1.3123331881040488 -1.8982475884520433 5.215708742574801 -1.2895757634454983 -1.9221402579940519 5.0976950784009478 -1.2668183387869478 -1.9460329275360602 4.9796814142270938 -1.2440609141283974 -1.9699255970780685 4.8616677500532388 -1.2213034894698469 -1.993818266620077 5.4864961099977538 -1.2277094023402939 -1.8739367481181726 5.3684824458238998 -1.2049519776817434 -1.8978294176601811 5.2504687816500457 -1.182194553023193 -1.9217220872021896 5.1324551174761917 -1.1594371283646425 -1.9456147567441979 5.0144414533023376 -1.1366797037060918 -1.9695074262862062 4.8964277891284835 -1.1139222790475414 -1.9934000958282148 5.5212561490729986 -1.1203281919179886 -1.8735185773263103 5.4032424848991436 -1.0975707672594379 -1.8974112468683189 5.2852288207252895 -1.0748133426008875 -1.9213039164103276 5.1672151565514364 -1.052055917942337 -1.9451965859523359 5.0492014923775823 -1.0292984932837865 -1.9690892554943442 4.9311878282037274 -1.0065410686252361 -1.9929819250363527 4.7681293001652003 -3.1565364456180838 -1.856655382562725 4.6674547567673752 -3.0903935273795655 -1.8806336803431831 4.5667802133695492 -3.0242506091410464 -1.9046119781236412 4.4661056699717241 -2.9581076909025281 -1.9285902759040994 4.365431126573899 -2.8919647726640094 -1.9525685736845575 4.264756583176073 -2.8258218544254912 -1.9765468714650154 4.8314025179191411 -3.0427992322774244 -1.8562183272932535 4.730727974521316 -2.9766563140389062 -1.8801966250737117 4.63005343112349 -2.910513395800387 -1.9041749228541698 4.5293788877256649 -2.8443704775618688 -1.9281532206346279 4.4287043443278398 -2.7782275593233505 -1.952131518415086 4.3280298009300138 -2.7120846410848323 -1.9761098161955439 4.8946757356730828 -2.9290620189367651 -1.8557812720237821 4.7940011922752568 -2.8629191006982468 -1.8797595698042402 4.6933266488774317 -2.7967761824597277 -1.9037378675846983 4.5926521054796066 -2.7306332642212099 -1.9277161653651564 4.4919775620817806 -2.6644903459826912 -1.9516944631456146 4.9579489534270236 -2.8153248055961058 -1.8553442167543106 4.8572744100291985 -2.7491818873575875 -1.8793225145347687 4.7565998666313725 -2.6830389691190688 -1.9033008123152269 4.6559253232335482 -2.6168960508805506 -1.927279110095685 5.0212221711809644 -2.7015875922554469 -1.8549071614848391 4.9205476277831393 -2.6354446740169282 -1.8788854592652973 4.8198730843853141 -2.5693017557784099 -1.9028637570457554 5.084495388934906 -2.587850378914788 -1.8544701062153677 4.98382084553708 -2.5217074606762693 -1.8784484039958258 4.8831463021392549 -2.4555645424377506 -1.9024267017762841 5.1477686066888477 -2.4741131655741286 -1.8540330509458962 5.0470940632910217 -2.4079702473356104 -1.8780113487263546 5.2110418244427885 -2.3603759522334697 -1.853595995676425 5.2743150421967293 -2.2466387388928104 -1.8531589404069535 4.3851755742636174 -2.610078998698623 -1.975647516589419 4.2736490201692483 -2.564713279688938 -1.9995811053863926 4.5521855359205272 -2.5566218315672238 -1.9512447794385739 4.4406589818261564 -2.5112561125575392 -1.9751783682355473 4.3291324277317873 -2.4658903935478542 -1.9991119570325209 4.7191954975774371 -2.5031646644358245 -1.9268420422877288 4.6076689434830662 -2.45779894542614 -1.9507756310847024 4.4961423893886963 -2.4124332264164554 -1.9747092198816758 4.3846158352943263 -2.3670675074067704 -1.9986428086786492 4.7746789051399761 -2.4043417782947407 -1.9263728939338571 4.6631523510456052 -2.3589760592850562 -1.9503064827308307 4.5516257969512353 -2.3136103402753716 -1.9742400715278041 4.4400992428568653 -2.2682446212656866 -1.9981736603247775 4.941688866796885 -2.3508846111633415 -1.9019701567830123 4.8301623127025151 -2.3055188921536569 -1.9259037455799857 4.7186357586081442 -2.2601531731439723 -1.9498373343769593 4.6071092045137743 -2.2147874541342878 -1.9737709231739327 4.4955826504194052 -2.1694217351246028 -1.9977045119709058 5.108698828453794 -2.2974274440319422 -1.8775674196321672 4.997172274359424 -2.2520617250222577 -1.9015010084291406 4.8856457202650541 -2.2066960060125731 -1.925434597226114 4.7741191661706832 -2.1613302870028885 -1.9493681860230876 4.6625926120763141 -2.115964567993204 -1.973301774820061 4.5510660579819442 -2.070598848983519 -1.9972353636170344 5.1641822360163339 -2.1986045578908584 -1.8770982712782955 5.052655681921963 -2.1532388388811738 -1.9010318600752691 4.9411291278275931 -2.1078731198714893 -1.9249654488722425 4.8296025737332231 -2.0625074008618047 -1.9488990376692161 4.7180760196388531 -2.0171416818521202 -1.9728326264661895 4.6065494655444841 -1.9717759628424352 -1.9967662152631627 4.0993861298134968 -3.9489485021833177 -1.8604611712348711 4.0133117883454164 -3.8643314087049747 -1.8844894987072214 3.927237446877335 -3.7797143152266317 -1.9085178261795717 3.8411631054092537 -3.6950972217482896 -1.9325461536519219 3.7550887639411732 -3.6104801282699466 -1.9565744811242722 3.6690144224730923 -3.525863034791604 -1.9806028085966225 4.1841770723868894 -3.849370773840068 -1.8599868996997844 4.0981027309188089 -3.764753680361725 -1.8840152271721347 4.0120283894507276 -3.680136586883382 -1.9080435546444849 3.9259540479826462 -3.5955194934050398 -1.9320718821168352 3.8398797065145653 -3.5109023999266973 -1.9561002095891855 4.268968014960282 -3.7497930454968182 -1.8595126281646976 4.1828936734922015 -3.6651759520184752 -1.8835409556370479 4.0968193320241202 -3.5805588585401327 -1.9075692831093982 4.0107449905560388 -3.4959417650617906 -1.9315976105817485 4.3537589575336746 -3.6502153171535685 -1.8590383566296109 4.2676846160655941 -3.5655982236752255 -1.8830666841019612 4.1816102745975128 -3.4809811301968829 -1.9070950115743115 4.0955359331294314 -3.3963640367185408 -1.9311233390466616 4.4385499001070672 -3.5506375888103188 -1.8585640850945242 4.3524755586389867 -3.4660204953319758 -1.8825924125668745 4.2664012171709054 -3.3814034018536332 -1.9066207400392245 4.5233408426804589 -3.451059860467069 -1.8580898135594375 4.4372665012123784 -3.3664427669887265 -1.8821181410317878 4.6081317852538515 -3.3514821321238197 -1.8576155420243508 4.6929227278272432 -3.25190440378057 -1.8571412704892638 3.7467540204305081 -3.4350649344653883 -1.9801047571641728 3.9217470068702278 -3.4149648980259908 -1.9556160783868082 3.8209933421445088 -3.3486250275118832 -1.9795949014285237 3.9959863285842285 -3.3285249910724857 -1.9551062226511593 3.8952326638585095 -3.2621851205583781 -1.9790850456928748 4.1709793150239491 -3.3084249546330882 -1.9306175438737947 4.0702256502982292 -3.2420850841189806 -1.9545963669155104 3.9694719855725098 -3.1757452136048729 -1.9785751899572257 4.345972301463668 -3.2883249181936907 -1.9061288650964303 4.2452186367379499 -3.221985047679583 -1.9301076881381458 4.14446497201223 -3.1556451771654754 -1.9540865111798613 4.0437113072865101 -3.0893053066513678 -1.9780653342215768 4.5209652879033877 -3.2682248817542936 -1.8816401863190657 4.4202116231776687 -3.2018850112401855 -1.9056190093607814 4.3194579584519497 -3.1355451407260779 -1.9295978324024969 4.2187042937262307 -3.0692052702119703 -1.9535766554442124 4.1179506290005108 -3.0028653996978627 -1.9775554784859277 4.5952046096173884 -3.1817849748007885 -1.8811303305834166 4.4944509448916694 -3.1154451042866804 -1.9051091536251323 4.3936972801659504 -3.0491052337725728 -1.9290879766668478 4.2929436154402305 -2.9827653632584652 -1.9530667997085633 4.1921899507145115 -2.9164254927443571 -1.9770456227502788 3.1928385528680332 -4.6904642104815277 -1.8650106296937206 3.1248914616033243 -4.590364889489706 -1.8890921475189286 3.056944370338615 -4.4902655684978843 -1.9131736653441367 2.9889972790739057 -4.3901662475060634 -1.9372551831693445 2.9210501878091968 -4.2900669265142417 -1.9613367009945526 2.8531030965444875 -4.1899676055224218 -1.9854182188197604 3.296371574439255 -4.6087658931437154 -1.8645055459755318 3.2284244831745461 -4.5086665721518937 -1.8885870638007398 3.1604773919098363 -4.408567251160072 -1.9126685816259477 3.0925303006451275 -4.3084679301682511 -1.9367500994511557 3.0245832093804181 -4.2083686091764294 -1.9608316172763636 3.3999045960104768 -4.5270675758059031 -1.8640004622573429 3.3319575047457679 -4.4269682548140814 -1.8880819800825508 3.2640104134810581 -4.3268689338222597 -1.9121634979077589 3.1960633222163493 -4.2267696128304388 -1.9362450157329667 3.5034376175816986 -4.4453692584680908 -1.8634953785391541 3.4354905263169897 -4.3452699374762691 -1.887576896364362 3.3675434350522799 -4.2451706164844474 -1.9116584141895698 3.2995963437875706 -4.1450712954926265 -1.9357399320147779 3.6069706391529204 -4.3636709411302785 -1.8629902948209653 3.5390235478882111 -4.2635716201384568 -1.887071812646173 3.4710764566235013 -4.1634722991466351 -1.911153330471381 3.7105036607241417 -4.2819726237924662 -1.8624852111027763 3.6425565694594324 -4.1818733028006445 -1.8865667289279842 3.8140366822953635 -4.2002743064546531 -1.8619801273845875 3.7460895910306542 -4.1001749854628313 -1.8860616452097951 3.9175697038665849 -4.1185759891168408 -1.8614750436663985 2.9500197200050908 -4.1138232913958888 -1.9848939663041865 3.1265592976265877 -4.1279772284138536 -1.9603220228653551 3.0404404583136349 -4.0431318182851852 -1.9843508941371593 3.2169800359351317 -4.0572857553031501 -1.9597789506983279 3.1308611966221789 -3.9724403451744821 -1.9838078219701321 3.3935196135566281 -4.0714396923211158 -1.9352070072594965 3.3074007742436757 -3.9865942821924469 -1.9592358785313007 3.2212819349307229 -3.901748872063779 -1.9832647498031049 3.570059191178125 -4.0855936293390807 -1.9106350638206648 3.4839403518651721 -4.0007482192104122 -1.9346639350924695 3.3978215125522198 -3.9159028090817438 -1.9586928063642737 3.3117026732392669 -3.8310573989530758 -1.9827216776360779 3.660479929486669 -4.0149021562283771 -1.9100919916536379 3.5743610901737162 -3.9300567460997091 -1.9341208629254423 3.4882422508607638 -3.8452113359710407 -1.9581497341972465 3.4021234115478109 -3.7603659258423727 -1.9821786054690507 3.8370195071081663 -4.0290560932463428 -1.8855200482148062 3.750900667795213 -3.944210683117674 -1.9095489194866109 3.6647818284822606 -3.859365272989006 -1.9335777907584153 3.5786629891693078 -3.7745198628603376 -1.9576066620302195 3.492544149856355 -3.6896744527316696 -1.9816355333020237 4.0135590847296632 -4.0432100302643077 -1.8609481047759751 3.9274402454167103 -3.9583646201356397 -1.8849769760477793 3.8413214061037575 -3.8735192100069709 -1.9090058473195837 3.7552025667908047 -3.7886737998783029 -1.9330347185913881 3.6690837274778523 -3.7038283897496345 -1.9570635898631923 3.582964888164899 -3.618982979620966 -1.9810924611349965 2.266259315886046 -5.1724143545437604 -1.8692727098875932 2.2189266835063823 -5.0607799262228959 -1.8934106373318458 2.1715940511267191 -4.9491454979020313 -1.9175485647760986 2.1242614187470554 -4.8375110695811676 -1.9416864922203512 2.0769287863673922 -4.725876641260303 -1.9658244196646038 2.3846472456525687 -5.1121343824613765 -1.8687439421369978 2.337314613272905 -5.0004999541405128 -1.8928818695812504 2.2899819808932418 -4.8888655258196483 -1.9170197970255032 2.2426493485135781 -4.7772310974987846 -1.941157724469756 2.1953167161339153 -4.66559666917792 -1.9652956519140086 2.5030351754190914 -5.0518544103789935 -1.8682151743864024 2.4557025430394277 -4.940219982058129 -1.892353101830655 2.4083699106597645 -4.8285855537372653 -1.916491029274908 2.3610372782801012 -4.7169511254164007 -1.9406289567191606 2.6214231051856141 -4.9915744382966096 -1.867686406635807 2.5740904728059504 -4.879940009975746 -1.8918243340800598 2.5267578404262876 -4.7683055816548814 -1.9159622615243126 2.7398110349521372 -4.9312944662142257 -1.8671576388852118 2.6924784025724735 -4.8196600378933621 -1.8912955663294644 2.8581989647186599 -4.8710144941318427 -1.8666288711346164 2.8108663323389966 -4.7593800658109791 -1.8907667985788692 2.976586894485183 -4.8107345220494597 -1.8661001033840212 2.0255100429413959 -4.6164892321615048 -1.9899512511342594 2.1289554731461253 -4.5644263847143396 -1.9893819065139526 2.3003474058448967 -4.6126620616287601 -1.9647306121202255 2.2324009033508543 -4.5123635372671753 -1.9888125618936459 2.4717393385436681 -4.6608977385431807 -1.9400793177264981 2.4037928360496261 -4.560599214181595 -1.9641612674999187 2.3358463335555832 -4.4603006898200102 -1.9882432172733391 2.64313127124244 -4.7091334154576012 -1.915428023332771 2.5751847687483975 -4.6088348910960155 -1.9395099731061913 2.5072382662543551 -4.5085363667344298 -1.9635919228796119 2.4392917637603126 -4.408237842372845 -1.9876738726530323 2.7465767014471689 -4.6570705680104361 -1.914858678712464 2.6786301989531265 -4.5567720436488504 -1.9389406284858846 2.610683696459084 -4.4564735192872647 -1.9630225782593052 2.5427371939650421 -4.3561749949256807 -1.9871045280327255 2.9179686341459408 -4.7053062449248566 -1.8902073843187366 2.8500221316518979 -4.6050077205632718 -1.9142893340921572 2.7820756291578554 -4.5047091962016861 -1.9383712838655778 2.7141291266638135 -4.4044106718401004 -1.9624532336389982 2.646182624169771 -4.3041121474785156 -1.9865351834124187 3.0893605668447122 -4.7535419218392772 -1.8655560899250094 3.0214140643506697 -4.6532433974776923 -1.8896380396984298 2.9534675618566268 -4.5529448731161066 -1.9137199894718502 2.8855210593625849 -4.4526463487545209 -1.9378019392452708 2.8175745568685424 -4.3523478243929352 -1.9618838890186914 2.7496280543745 -4.2520493000313513 -1.9859658387921117 1.149554203181788 -5.6349418948631813 -1.8500783900158575 1.1257381049736854 -5.5157018218690546 -1.8742670575311899 1.1019220067655828 -5.3964617488749278 -1.8984557250465219 1.0781059085574805 -5.277221675880801 -1.9226443925618539 1.0542898103493781 -5.1579816028866743 -1.9468330600771862 1.0304737121412755 -5.0387415298925475 -1.9710217275925181 1.0066576139331731 -4.9195014568984208 -1.9952103951078504 1.2798046262699374 -5.5983171019196734 -1.8495263436855014 1.255988528061835 -5.4790770289255466 -1.8737150112008338 1.2321724298537324 -5.3598369559314198 -1.8979036787161658 1.2083563316456298 -5.2405968829372931 -1.9220923462314978 1.1845402334375275 -5.1213568099431663 -1.94628101374683 1.1607241352294251 -5.0021167369490396 -1.970469681262162 1.4100550493580868 -5.5616923089761654 -1.8489742973551453 1.3862389511499846 -5.4424522359820386 -1.8731629648704777 1.362422852941882 -5.3232121629879119 -1.8973516323858097 1.3386067547337794 -5.2039720899937851 -1.9215402999011417 1.3147906565256768 -5.0847320169996584 -1.9457289674164739 1.5403054724462362 -5.5250675160326574 -1.8484222510247892 1.5164893742381342 -5.4058274430385316 -1.8726109185401214 1.4926732760300314 -5.2865873700444039 -1.8967995860554534 1.468857177821929 -5.1673472970502772 -1.9209882535707856 1.6705558955343858 -5.4884427230891504 -1.8478702046944329 1.6467397973262836 -5.3692026500950236 -1.8720588722097653 1.6229236991181808 -5.2499625771008969 -1.8962475397250973 1.5991076009100784 -5.1307225041067692 -1.9204362072404295 1.776990220414433 -5.3325778571515166 -1.871506825879409 1.7531741222063302 -5.2133377841573889 -1.895695493394741 1.9072406435025826 -5.2959530642080086 -1.8709547795490529 1.1207419785601886 -4.8879616150346541 -1.9946237233171578 1.2810907845624466 -4.968600834533726 -1.969896465256034 1.2337987665578769 -4.8567449921486849 -1.9940348505995102 1.4414395905647046 -5.049240054032798 -1.9451692071949103 1.3941475725601347 -4.9373842116477569 -1.9693075925383865 1.3468555545555652 -4.8255283692627149 -1.9934459778818627 1.5544963785623926 -5.0180234311468288 -1.9445803344772628 1.5072043605578229 -4.9061675887617877 -1.968718719820739 1.4599123425532534 -4.7943117463767457 -1.9928571051642152 1.7148451845646504 -5.0986626506459007 -1.9198530764161388 1.6675531665600807 -4.9868068082608596 -1.943991461759615 1.6202611485555112 -4.8749509658758177 -1.9681298471030912 1.5729691305509415 -4.7630951234907757 -1.9922682324465677 1.8751939905669084 -5.1793018701449736 -1.895125818355015 1.8279019725623387 -5.0674460277599316 -1.9192642036984913 1.7806099545577689 -4.9555901853748905 -1.9434025890419675 1.7333179365531994 -4.8437343429898485 -1.9675409743854437 1.6860259185486297 -4.7318785006048065 -1.99167935972892 2.0355427965691661 -5.2599410896440464 -1.8703985602938913 1.9882507785645964 -5.1480852472590044 -1.8945369456373673 1.9409587605600267 -5.0362294048739624 -1.9186753309808438 1.893666742555457 -4.9243735624889204 -1.9428137163243198 1.8463747245508875 -4.8125177201038785 -1.966952101667796 1.7990827065463177 -4.7006618777188365 -1.9910904870112724 2.148599584566854 -5.2287244667580772 -1.8698096875762436 2.1013075665622845 -5.1168686243730352 -1.8939480729197198 2.054015548557715 -5.0050127819879933 -1.918086458263196 2.006723530553145 -4.8931569396029513 -1.9422248436066722 1.9594315125485757 -4.7813010972179093 -1.9663632289501485 1.912139494544006 -4.6694452548328673 -1.9905016142936247 0.060291600448986404 -5.7250218022121597 -1.8546030146370842 0.061276697389966661 -5.6031041362279108 -1.8788346470133923 0.06226179433094714 -5.4811864702436619 -1.9030662793897004 0.063246891271927341 -5.3592688042594121 -1.9272979117660087 0.064231988212907654 -5.2373511382751632 -1.9515295441423168 0.065217085153887855 -5.1154334722909143 -1.9757611765186247 0.19692804926009444 -5.7144066716342712 -1.8540376291046949 0.1979131462010747 -5.5924890056500223 -1.878269261481003 0.19889824314205518 -5.4705713396657734 -1.9025008938573111 0.19988334008303532 -5.3486536736815236 -1.9267325262336195 0.20086843702401558 -5.2267360076972746 -1.9509641586099276 0.33356449807120259 -5.7037915410563826 -1.8534722435723059 0.33454959501218273 -5.5818738750721337 -1.8777038759486138 0.33553469195316316 -5.4599562090878848 -1.9019355083249219 0.3365197888941433 -5.338038543103635 -1.9261671407012302 0.33750488583512356 -5.2161208771193852 -1.9503987730775383 0.47020094688231062 -5.6931764104784941 -1.8529068580399166 0.47118604382329077 -5.5712587444942443 -1.8771384904162247 0.47217114076427114 -5.4493410785099954 -1.9013701227925328 0.47315623770525128 -5.3274234125257456 -1.9256017551688409 0.60683739569341899 -5.6825612799006056 -1.8523414725075276 0.60782249263439914 -5.5606436139163558 -1.8765731048838354 0.6088075895753795 -5.4387259479321068 -1.9008047372601435 0.74347384450452703 -5.6719461493227161 -1.8517760869751383 0.74445894144550717 -5.5500284833384663 -1.8760077193514464 0.88011029331563506 -5.6613310187448276 -1.8512107014427492 0.88109539025661532 -5.5394133527605778 -1.8754423338190571 1.0167467421267431 -5.650715888166939 -1.85064531591036 0.057091486695565519 -4.9944924464567402 -1.999977032165559 0.19929200709510331 -5.1050929299718781 -1.9751913552637754 0.17548433834674293 -4.9858329766365959 -1.9993800547203044 0.31768485874628061 -5.0964334601517338 -1.9745943778185209 0.29387718999792034 -4.9771735068164515 -1.9987830772750499 0.45988537914581817 -5.2070339436668718 -1.9498087009167373 0.43607771039745802 -5.0877739903315895 -1.9739974003732663 0.41227004164909775 -4.9685140369963072 -1.9981860998297953 0.60208589954535563 -5.3176344271820097 -1.9250230240149537 0.57827823079699558 -5.1983744738467275 -1.9492117234714827 0.55447056204863543 -5.0791145205114452 -1.9734004229280118 0.53066289330027516 -4.9598545671761629 -1.9975891223845408 0.7442864199448932 -5.4282349106971486 -1.9002373471131702 0.72047875119653293 -5.3089749573618654 -1.9244260465696992 0.696671082448173 -5.1897150040265831 -1.9486147460262282 0.67286341369981284 -5.0704550506913009 -1.9728034454827572 0.64905574495145257 -4.9511950973560186 -1.9969921449392862 0.8626792715960705 -5.4195754408770043 -1.8996403696679156 0.83887160284771034 -5.3003154875417211 -1.9238290691244446 0.8150639340993503 -5.1810555342064388 -1.9480177685809736 0.79125626535099014 -5.0617955808711566 -1.9722064680375027 0.76744859660262998 -4.9425356275358734 -1.9963951674940317 1.0048797919956081 -5.5301759243921422 -1.874854692766132 0.98107212324724791 -5.41091597105686 -1.8990433922226611 0.95726445449888775 -5.2916560177215777 -1.9232320916791901 0.9334567857505276 -5.1723960643862945 -1.9474207911357191 0.90964911700216755 -5.0531361110510122 -1.9716094905922481 0.8858414482538074 -4.9338761577157291 -1.9957981900487771 -0.88938853024833031 -4.8888975962406755 -1.9953245092514209 -0.86111718588117214 -4.7707759535405847 -1.9712747852829131 -0.83284584151401375 -4.6526543108404939 -1.9472250613144051 -0.80457449714685536 -4.534532668140403 -1.9231753373458971 -0.77630315277969719 -4.4164110254403131 -1.8991256133773891 -0.74803180841253891 -4.2982893827402222 -1.875075889408881 -0.77100760031946125 -4.9035075830521988 -1.9959113967884023 -0.74273625595230297 -4.785385940352108 -1.9718616728198946 -0.71446491158514469 -4.6672642976520171 -1.9478119488513863 -0.68619356721798641 -4.5491426549519263 -1.9237622248828783 -0.65792222285082813 -4.4310210122518363 -1.8997125009143703 -0.65262667039059219 -4.9181175698637221 -1.9964982843253838 -0.62435532602343391 -4.7999959271636312 -1.9724485603568758 -0.59608398165627563 -4.6818742844635404 -1.9483988363883677 -0.56781263728911735 -4.5637526417634495 -1.9243491124198595 -0.53424574046172313 -4.9327275566752453 -1.9970851718623652 -0.50597439609456485 -4.8146059139751545 -1.9730354478938572 -0.47770305172740657 -4.6964842712750636 -1.948985723925349 -0.44943170736024829 -4.5783626285749737 -1.9249359999568409 -0.41586481053285418 -4.9473375434867686 -1.9976720593993464 -0.3875934661656959 -4.8292159007866777 -1.9736223354308384 -0.35932212179853762 -4.7110942580865869 -1.9495726114623304 -0.29748388060398506 -4.9619475302982918 -1.9982589469363279 -0.26921253623682684 -4.843825887598201 -1.9742092229678199 -0.17910295067511608 -4.9765575171098151 -1.9988458344733091 -0.15083160630795792 -4.8584358744097251 -1.9747961105048011 -0.06072202074624708 -4.9911675039213383 -1.9994327220102905 -0.73487003911499449 -4.1786999155240734 -1.8510302110666352 -0.63733217282082977 -4.3121531677498286 -1.8756648336315043 -0.63612400121045887 -4.1914024644526195 -1.8516223558947358 -0.53979430652666505 -4.4456064199755838 -1.9002994561963729 -0.53858613491629415 -4.3248557166783748 -1.8762569784596048 -0.53737796330592325 -4.2041050133811657 -1.8522145007228363 -0.44104826862212942 -4.45830896890413 -1.9008916010244734 -0.43984009701175847 -4.3375582656069209 -1.8768491232877054 -0.43863192540138751 -4.2168075623097119 -1.8528066455509369 -0.34351040232796476 -4.5917622211298852 -1.9255262235893422 -0.3423022307175938 -4.4710115178326761 -1.901483745852574 -0.34109405910722279 -4.3502608145354671 -1.8774412681158059 -0.33988588749685189 -4.2295101112382572 -1.8533987903790377 -0.24597253603380001 -4.7252154733556413 -1.9501608461542113 -0.24476436442342903 -4.6044647700584314 -1.926118368417443 -0.24355619281305807 -4.4837140667612223 -1.9020758906806747 -0.24234802120268709 -4.3629633634640133 -1.8780334129439065 -0.24113984959231613 -4.2422126601668033 -1.8539909352071382 -0.14722649812926439 -4.7379180222841866 -1.9507529909823118 -0.14601832651889338 -4.6171673189869775 -1.9267105132455435 -0.14481015490852248 -4.4964166156897685 -1.9026680355087753 -0.14360198329815146 -4.3756659123925585 -1.8786255577720072 -0.14239381168778051 -4.2549152090953486 -1.854583080035239 -0.049688631835099653 -4.8713712745099418 -1.9753876135471808 -0.048480460224728766 -4.7506205712127327 -1.9513451358104124 -0.047272288614357748 -4.6298698679155237 -1.9273026580736443 -0.046064117003986854 -4.5091191646183137 -1.9032601803368761 -0.044855945393615843 -4.3883684613211047 -1.8792177026001078 -0.043647773783244928 -4.2676177580238948 -1.8551752248633395 -1.6379973199204028 -4.0232919713489199 -1.8700038679762769 -1.69234708253308 -4.1325081894931888 -1.894046871498682 -1.7466968451457574 -4.2417244076374576 -1.9180898750210873 -1.8010466077584346 -4.3509406257817265 -1.9421328785434926 -1.796119319999566 -4.6067998873702143 -1.9907847543937884 -1.7417695573868883 -4.4975836692259445 -1.9667417508713831 -1.6874197947742111 -4.3883674510816757 -1.9426987473489779 -1.6330700321615339 -4.2791512329374068 -1.9186557438265726 -1.5787202695488565 -4.169935014793138 -1.8946127403041673 -1.524370506936179 -4.0607187966488691 -1.8705697367817622 -1.6824925070153425 -4.6442267126701626 -1.9913506231992737 -1.6281427444026648 -4.5350104945258938 -1.9673076196768684 -1.5737929817899876 -4.4257942763816249 -1.9432646161544631 -1.5194432191773104 -4.3165780582373561 -1.9192216126320578 -1.465093456564633 -4.2073618400930872 -1.8951786091096527 -1.568865694031119 -4.681653537970111 -1.991916492004759 -1.5145159314184413 -4.572437319825843 -1.9678734884823537 -1.4601661688057641 -4.4632211016815742 -1.9438304849599484 -1.4058164061930869 -4.3540048835373053 -1.9197874814375431 -1.4552388810468952 -4.7190803632700602 -1.9924823608102442 -1.4008891184342176 -4.6098641451257922 -1.9684393572878391 -1.3465393558215404 -4.5006479269815234 -1.9443963537654338 -1.341612068062672 -4.7565071885700085 -1.9930482296157295 -1.2872623054499943 -4.6472909704257406 -1.9690052260933244 -1.2329125428373169 -4.5380747522814717 -1.9449622225709191 -1.2279852550784485 -4.7939340138699578 -1.993614098421215 -1.1736354924657708 -4.6847177957256898 -1.9695710948988099 -1.114358442094225 -4.8313608391699061 -1.9941799672267002 -1.0007316291100017 -4.8687876644698553 -1.9947458360321857 -1.4298973286141767 -4.0923066528164913 -1.8711301013493988 -1.3628371638153161 -4.2413223720319611 -1.895741210334392 -1.3355105519824055 -4.1238681695028019 -1.8716904410875206 -1.2957769990164554 -4.3903380912474299 -1.9203523193193854 -1.2684503871835449 -4.2728838887182716 -1.8963015500725138 -1.2411237753506343 -4.1554296861891125 -1.8722507808256423 -1.2137971635177234 -4.0379754836599542 -1.8482000115787707 -1.2013902223846842 -4.4218996079337405 -1.9209126590575072 -1.1740636105517737 -4.3044454054045822 -1.8968618898106355 -1.1467369987188631 -4.186991202875423 -1.8728111205637641 -1.1194103868859522 -4.0695370003462648 -1.8487603513168924 -1.1343300575858237 -4.5709153271492102 -1.9455237680425008 -1.107003445752913 -4.4534611246200511 -1.9214729987956292 -1.0796768339200025 -4.3360069220908928 -1.8974222295487575 -1.0523502220870919 -4.2185527195617336 -1.8733714603018858 -1.025023610254181 -4.1010985170325753 -1.8493206910550142 -1.0672698927869633 -4.7199310463646791 -1.9701348770274942 -1.0399432809540525 -4.6024768438355208 -1.9460841077806226 -1.0126166691211418 -4.4850226413063616 -1.9220333385337509 -0.98529005728823127 -4.3675684387772034 -1.8979825692868793 -0.95796344545532064 -4.2501142362480442 -1.8739318000400076 -0.93063683362240979 -4.1326600337188859 -1.8498810307931359 -0.97288311615519207 -4.7514925630509897 -1.9706952167656162 -0.94555650432228133 -4.6340383605218305 -1.9466444475187445 -0.9182298924893707 -4.5165841579926722 -1.9225936782718729 -0.89090328065645996 -4.399129955463513 -1.8985429090250012 -0.86357666882354933 -4.2816757529343548 -1.8744921397781296 -0.83625005699063859 -4.1642215504051956 -1.8504413705312579 -2.7209422558487986 -4.10807970095426 -1.9859532995971672 -2.6443513959670981 -4.0126687073771725 -1.9619184194371528 -2.5677605360853972 -3.9172577138000846 -1.9378835392771381 -2.4911696762036963 -3.8218467202229971 -1.9138486591171238 -2.414578816321995 -3.7264357266459096 -1.8898137789571094 -2.3379879564402941 -3.6310247330688221 -1.8657788987970949 -2.6182038197735569 -4.1660252887563836 -1.986487541512844 -2.5416129598918564 -4.0706142951792961 -1.9624526613528297 -2.4650221000101555 -3.9752033016022077 -1.9384177811928149 -2.3884312401284546 -3.8797923080251202 -1.9143829010328006 -2.3118403802467533 -3.7843813144480327 -1.8903480208727863 -2.5154653836983152 -4.2239708765585071 -1.9870217834285209 -2.4388745238166147 -4.1285598829814196 -1.9629869032685066 -2.3622836639349138 -4.0331488894043312 -1.9389520231084918 -2.285692804053213 -3.9377378958272438 -1.9149171429484777 -2.4127269476230735 -4.2819164643606307 -1.9875560253441977 -2.336136087741373 -4.1865054707835432 -1.9635211451841834 -2.2595452278596722 -4.0910944772064548 -1.9394862650241687 -2.1829543679779713 -3.9956834836293673 -1.9154513848641546 -2.3099885115478322 -4.3398620521627542 -1.9880902672598746 -2.2333976516661314 -4.2444510585856667 -1.9640553870998603 -2.1568067917844305 -4.1490400650085784 -1.9400205069398457 -2.2072500754725906 -4.3978076399648778 -1.9886245091755514 -2.1306592155908897 -4.3023966463877903 -1.9645896290155371 -2.1045116393973493 -4.4557532277670004 -1.9891587510912283 -2.0279207795156484 -4.360342234189913 -1.965123870931214 -2.0017732033221081 -4.513698815569124 -1.9896929930069054 -2.2458360239341175 -3.6832846894384299 -1.8663083764916373 -2.2122721540843777 -3.8406242961904056 -1.8908808361058036 -2.1598743460261618 -3.7322200820472733 -1.8668350683993904 -2.126310476176422 -3.889559688799249 -1.8914075280135567 -2.0739126681182061 -3.7811554746561167 -1.8673617603071433 -2.0927466063266831 -4.0468992955512242 -1.915979987627723 -2.0403487982684667 -3.9384950814080923 -1.8919342199213096 -1.9879509902102506 -3.8300908672649596 -1.8678884522148964 -2.0591827364769442 -4.2042389023031994 -1.9405524472418891 -2.0067849284187274 -4.0958346881600676 -1.9165066795354759 -1.9543871203605112 -3.9874304740169357 -1.8924609118290627 -1.9019893123022951 -3.879026259873803 -1.8684151441226493 -1.9732210585689887 -4.2531742949120428 -1.9410791391496423 -1.9208232505107721 -4.144770080768911 -1.9170333714432291 -1.8684254424525557 -4.0363658666257791 -1.8929876037368156 -1.8160276343943396 -3.9279616524826464 -1.8689418360304024 -1.9396571887192495 -4.4105139016640189 -1.9656515987638086 -1.8872593806610332 -4.3021096875208862 -1.9416058310573954 -1.8348615726028166 -4.1937054733777543 -1.9175600633509819 -1.7824637645446002 -4.0853012592346216 -1.8935142956445687 -1.7300659564863841 -3.9768970450914893 -1.8694685279381553 -1.9060933188695102 -4.5678535084159941 -1.9902240583779749 -1.8536955108112938 -4.4594492942728614 -1.9661782906715615 -3.0335211099911454 -3.0496030431624752 -1.8612662517775516 -3.4190619503709287 -3.5139818741680009 -1.9819015405373968 -3.3242754776997101 -3.4362702730488159 -1.9578758313940747 -3.2294890050284915 -3.3585586719296305 -1.9338501222507523 -3.1347025323572728 -3.2808470708104451 -1.90982441310743 -3.0399160596860542 -3.2031354696912602 -1.8857987039641078 -3.3306704273946188 -3.5898026995776005 -1.9824082835806309 -3.2358839547234002 -3.5120910984584155 -1.9583825744373087 -3.1410974820521815 -3.4343794973392305 -1.9343568652939862 -3.0463110093809624 -3.3566678962200451 -1.9103311561506642 -2.9515245367097438 -3.2789562951008602 -1.8863054470073419 -3.2422789044183089 -3.6656235249872005 -1.9829150266238649 -3.1474924317470903 -3.5879119238680155 -1.9588893174805426 -3.0527059590758712 -3.5102003227488301 -1.9348636083372202 -2.9579194864046525 -3.4324887216296451 -1.9108378991938981 -3.1538873814419985 -3.7414443503968005 -1.983421769667099 -3.0591009087707799 -3.6637327492776155 -1.9593960605237766 -2.9643144360995608 -3.5860211481584301 -1.9353703513804543 -3.0654958584656882 -3.8172651758064 -1.983928512710333 -2.9707093857944695 -3.7395535746872155 -1.9599028035670107 -2.8759229131232509 -3.6618419735680297 -1.9358770944236883 -2.9771043354893783 -3.893086001216 -1.9844352557535672 -2.8823178628181596 -3.8153744000968151 -1.9604095466102447 -2.8887128125130683 -3.9689068266255996 -1.9849419987968011 -2.800321289536758 -4.0447276520351991 -1.9854487418400353 -2.9498480497008082 -3.1215332525345816 -1.8617701714235779 -2.8755844731578959 -3.1857048568675719 -1.8622684606954962 -2.8753272402245651 -3.34472235133908 -1.886804893363643 -2.8013208966149836 -3.2498764612005626 -1.8627667499674145 -2.8750700072912339 -3.5037398458105882 -1.9113413260317897 -2.8010636636816528 -3.4088939556720708 -1.8873031826355613 -2.7270573200720714 -3.3140480655335534 -1.8632650392393326 -2.8008064307483216 -3.5679114501435789 -1.9118396153037081 -2.7268000871387406 -3.4730655600050611 -1.8878014719074794 -2.6527937435291591 -3.3782196698665437 -1.8637633285112509 -2.8005491978149908 -3.7269289446150871 -1.9363760479718548 -2.7265428542054093 -3.6320830544765692 -1.9123379045756261 -2.6525365105958283 -3.5372371643380518 -1.8882997611793977 -2.5785301669862468 -3.4423912741995339 -1.864261617783169 -2.80029196488166 -3.8859464390865956 -1.9609124806400016 -2.7262856212720785 -3.7911005489480774 -1.9368743372437731 -2.6522792776624975 -3.6962546588095599 -1.9128361938475444 -2.578272934052916 -3.6014087686710421 -1.8887980504513158 -2.5042665904433346 -3.5065628785325247 -1.8647599070550873 -2.7260283883387477 -3.9501180434195859 -1.9614107699119199 -2.6520220447291663 -3.8552721532810681 -1.9373726265156912 -2.5780157011195852 -3.7604262631425502 -1.9133344831194625 -2.5040093575100038 -3.6655803730040328 -1.8892963397232341 -2.4300030139004223 -3.570734482865515 -1.8652581963270054 -3.6231382238930734 -2.4941245963189083 -1.8814854214593075 -3.7316820125970631 -2.5512764395521468 -1.9055028252313784 -3.8402258013010528 -2.6084282827853853 -1.9295202290034494 -3.948769590005043 -2.6655801260186243 -1.9535376327755203 -4.0573133787090327 -2.7227319692518623 -1.9775550365475911 -3.9861854180021776 -2.8132052536736465 -1.9780373318642486 -3.8776416292981879 -2.7560534104404084 -1.9540199280921777 -3.7690978405941977 -2.6989015672071694 -1.9300025243201069 -3.660554051890208 -2.6417497239739309 -1.9059851205480358 -3.5520102631862183 -2.5845978807406924 -1.881967716775965 -3.9150574572953225 -2.9036785380954306 -1.978519627180906 -3.8065136685913328 -2.8465266948621926 -1.9545022234088352 -3.6979698798873426 -2.7893748516289536 -1.9304848196367643 -3.5894260911833529 -2.7322230083957151 -1.9064674158646933 -3.8439294965884674 -2.9941518225172152 -1.9790019224975635 -3.7353857078844777 -2.9369999792839767 -1.9549845187254926 -3.6268419191804875 -2.8798481360507382 -1.9309671149534218 -3.7728015358816123 -3.0846251069389998 -1.9794842178142209 -3.6642577471776225 -3.0274732637057609 -1.9554668140421501 -3.5557139584736324 -2.9703214204725223 -1.931449410270079 -3.7016735751747567 -3.1750983913607844 -1.9799665131308783 -3.593129786470767 -3.1179465481275455 -1.9559491093588073 -3.6305456144679016 -3.2655716757825686 -1.9804488084475358 -3.559417653761046 -3.3560449602043527 -1.980931103764193 -3.5157435270216686 -2.4355662598823984 -1.8574672162204087 -3.4558141505305926 -2.5123324304433821 -1.857941700765539 -3.4877117403148552 -2.6667119047227108 -1.8824452487066832 -3.3958847740395166 -2.5890986010043662 -1.8584161853106693 -3.5196093300991178 -2.8210913790020395 -1.9069487966478273 -3.4277823638237792 -2.7434780752836949 -1.8829197332518135 -3.3359553975484406 -2.6658647715653503 -1.8588906698557996 -3.4596799536080418 -2.8978575495630237 -1.9074232811929577 -3.3678529873327032 -2.8202442458446786 -1.8833942177969438 -3.2760260210573642 -2.7426309421263344 -1.85936515440093 -3.4915775433923044 -3.0522370238423524 -1.9319268291341019 -3.3997505771169654 -2.9746237201240078 -1.9078977657380878 -3.3079236108416268 -2.8970104164056627 -1.8838687023420739 -3.2160966445662877 -2.8193971126873185 -1.8598396389460601 -3.5234751331765679 -3.2066164981216811 -1.956430377075246 -3.4316481669012284 -3.1290031944033361 -1.9324013136792322 -3.3398212006258894 -3.0513898906849914 -1.9083722502832181 -3.2479942343505508 -2.9737765869666468 -1.8843431868872043 -3.1561672680752118 -2.8961632832483022 -1.8603141234911904 -3.4635457566854915 -3.2833826686826653 -1.9569048616203764 -3.371718790410152 -3.2057693649643202 -1.9328757982243625 -3.2798918241348134 -3.1281560612459751 -1.9088467348283482 -3.1880648578594744 -3.0505427575276305 -1.8848176714323344 -3.0962378915841358 -2.9729294538092859 -1.8607886080363205 -3.4954433464697541 -3.4377621429619944 -1.9814084095615205 -3.403616380194415 -3.3601488392436489 -1.9573793461655067 -3.311789413919076 -3.2825355355253039 -1.9333502827694926 -3.219962447643737 -3.2049222318069592 -1.9093212193734785 -3.1281354813683984 -3.1273089280886146 -1.8852921559774647 -3.9251536196651893 -1.6560981417778784 -1.8533782424828127 -4.0428883441979453 -1.6906680022877778 -1.877388979972749 -4.1606230687307022 -1.725237862797677 -1.9013997174626855 -4.5798429784383439 -1.965146850165437 -1.9979015321117901 -4.462108253905587 -1.9305769896555378 -1.9738907946218536 -4.3443735293728309 -1.8960071291456382 -1.949880057131917 -4.226638804840074 -1.8614372686357388 -1.9258693196419805 -4.108904080307318 -1.8268674081258394 -1.901858582152044 -3.9911693557745611 -1.7922975476159402 -1.8778478446621074 -4.5281239900149597 -2.0667763954935996 -1.9983603968011485 -4.4103892654822028 -2.0322065349837004 -1.974349659311212 -4.2926545409494468 -1.9976366744738006 -1.9503389218212754 -4.1749198164166899 -1.9630668139639011 -1.9263281843313389 -4.0571850918839338 -1.9284969534540017 -1.9023174468414024 -4.4764050015915746 -2.1684059408217617 -1.9988192614905067 -4.3586702770588186 -2.1338360803118626 -1.9748085240005704 -4.2409355525260626 -2.0992662198019629 -1.9507977865106338 -4.1232008279933057 -2.0646963592920637 -1.9267870490206973 -4.0054661034605488 -2.0301264987821641 -1.9027763115307608 -4.4246860131681895 -2.2700354861499243 -1.9992781261798651 -4.3069512886354335 -2.2354656256400252 -1.9752673886899286 -4.1892165641026775 -2.2008957651301255 -1.9512566511999923 -4.0714818395699206 -2.1663259046202263 -1.9272459137100557 -4.3729670247448054 -2.3716650314780869 -1.9997369908692233 -4.2552323002120493 -2.3370951709681878 -1.975726253379287 -4.1374975756792933 -2.3025253104582877 -1.9517155158893507 -4.2035133117886643 -2.4387247162963499 -1.9761851180686452 -4.0857785872559083 -2.4041548557864503 -1.9521743805787088 -4.1517943233652801 -2.5403542616245125 -1.9766439827580036 -3.8809744548707021 -1.7435562826869824 -1.8538309464282934 -3.9428625251930853 -1.8875138038408903 -1.878303921298115 -3.8373870894716631 -1.8299021126216353 -1.8542831668180992 -3.8992751597940463 -1.9738596337755432 -1.8787561416879208 -3.793799724072624 -1.9162479425562882 -1.8547353872079051 -3.9611632301164295 -2.1178171549294516 -1.9032291165577424 -3.8556877943950072 -2.0602054637101963 -1.8792083620777267 -3.7502123586735849 -2.0025937724909411 -1.855187607597711 -4.0230513004388131 -2.2617746760833599 -1.927702091427564 -3.9175758647173899 -2.2041629848641042 -1.9036813369475483 -3.8121004289959677 -2.1465512936448494 -1.8796605824675325 -3.7066249932745459 -2.0889396024255937 -1.8556398279875166 -3.9794639350397736 -2.348120506018013 -1.9281543118173698 -3.8739884993183509 -2.2905088147987573 -1.9041335573373541 -3.7685130635969286 -2.2328971235795021 -1.8801128028573382 -3.6630376278755064 -2.1752854323602469 -1.8560920483773224 -4.0413520053621568 -2.4920780271719205 -1.9526272866871914 -3.9358765696407341 -2.4344663359526657 -1.9286065322071757 -3.8304011339193114 -2.3768546447334105 -1.9045857777271598 -3.7249256981978891 -2.3192429535141552 -1.880565023247144 -3.6194502624764668 -2.2616312622948995 -1.8565442687671281 -4.1032400756845391 -2.6360355483258289 -1.977100261557013 -3.9977646399631173 -2.5784238571065736 -1.9530795070769973 -3.8922892042416946 -2.5208121658873184 -1.9290587525969813 -3.7868137685202723 -2.4632004746680631 -1.9050379981169656 -3.68133833279885 -2.4055887834488079 -1.8810172436369497 -3.5758628970774278 -2.3479770922295526 -1.8569964891569339 -4.8679039784863019 -0.99066931935420155 -1.9939929937137353 -4.7456719122380786 -0.97985255715582731 -1.9699862820460476 -4.6234398459898562 -0.96903579495745307 -1.9459795703783602 -4.501207779741633 -0.95821903275907894 -1.921972858710673 -4.3789757134934097 -0.94740227056070458 -1.8979661470429856 -4.2567436472451874 -0.93658550836233045 -1.8739594353752982 -4.8371090375573731 -1.0996452358491127 -1.9944257462100901 -4.7148769713091498 -1.0888284736507385 -1.9704190345424024 -4.5926449050609275 -1.0780117114523642 -1.9464123228747152 -4.4704128388127042 -1.0671949492539901 -1.9224056112070278 -4.348180772564481 -1.0563781870556157 -1.8983988995393404 -4.8063140966284443 -1.2086211523440238 -1.9948584987064448 -4.6840820303802211 -1.1978043901456497 -1.9708517870387574 -4.5618499641319987 -1.1869876279472753 -1.94684507537107 -4.4396178978837755 -1.1761708657489012 -1.9228383637033826 -4.3173858316355522 -1.1653541035505268 -1.8988316520356954 -4.7755191556995156 -1.3175970688389349 -1.9952912512027998 -4.6532870894512923 -1.3067803066405608 -1.9712845395351122 -4.5310550232030691 -1.2959635444421864 -1.947277827867425 -4.4088229569548458 -1.2851467822438123 -1.9232711161997376 -4.7447242147705868 -1.4265729853338458 -1.9957240036991546 -4.6224921485223636 -1.4157562231354719 -1.9717172920314672 -4.5002600822741403 -1.4049394609370975 -1.9477105803637798 -4.7139292738416581 -1.5355489018287569 -1.9961567561955096 -4.5916972075934339 -1.524732139630383 -1.9721500445278219 -4.4694651413452107 -1.5139153774320087 -1.9481433328601347 -4.6831343329127293 -1.644524818323668 -1.9965895086918644 -4.5609022666645052 -1.6337080561252941 -1.9725827970241769 -4.6523393919837996 -1.7535007348185792 -1.9970222611882193 -4.6215444510548709 -1.8624766513134903 -1.9974550136845741 -4.1384216797201905 -0.9128102474888059 -1.8499487417173806 -4.2273092184618593 -1.0410525374648161 -1.8743908023449809 -4.1125575640894159 -1.005444864795034 -1.8503764727297385 -4.2014451028310837 -1.1336871547710441 -1.8748185333573388 -4.0866934484586404 -1.098079482101262 -1.8508042037420964 -4.2903326415727525 -1.2619294447470544 -1.8992605939849392 -4.1755809872003091 -1.2263217720772721 -1.8752462643696968 -4.0608293328278657 -1.1907140994074901 -1.8512319347544544 -4.3792201803144213 -1.3901717347230647 -1.9237026546125395 -4.2644685259419779 -1.3545640620532824 -1.8996883249972971 -4.1497168715695345 -1.3189563893835001 -1.8756739953820547 -4.0349652171970902 -1.2833487167137181 -1.8516596657668123 -4.3533560646836458 -1.4828063520292927 -1.9241303856248975 -4.2386044103112024 -1.4471986793595104 -1.9001160560096551 -4.123852755938759 -1.4115910066897284 -1.8761017263944126 -4.0091011015663156 -1.3759833340199461 -1.8520873967791702 -4.4422436034253145 -1.6110486420053032 -1.948572446252498 -4.3274919490528712 -1.5754409693355207 -1.9245581166372554 -4.2127402946804278 -1.5398332966657384 -1.900543787022013 -4.0979886403079835 -1.5042256239959564 -1.8765294574067706 -3.9832369859355405 -1.4686179513261741 -1.8525151277915282 -4.5311311421669833 -1.7392909319813132 -1.9730145068800984 -4.4163794877945399 -1.703683259311531 -1.949000177264856 -4.3016278334220956 -1.6680755866417485 -1.9249858476496133 -4.1868761790496523 -1.6324679139719664 -1.9009715180343709 -4.0721245246772089 -1.5968602413021844 -1.8769571884191285 -3.9573728703047655 -1.5612525686324021 -1.8529428588038861 -4.5052670265362078 -1.8319255492875413 -1.9734422378924563 -4.3905153721637644 -1.796317876617759 -1.9494279082772139 -4.275763717791321 -1.7607102039479767 -1.9254135786619713 -4.3430431247361021 -0.052755128979229883 -1.8703566867530477 -4.4650367215004145 -0.039494741025471701 -1.8943629355322908 -4.5870303182647287 -0.026234353071713509 -1.918369184311534 -4.7090239150290421 -0.012973965117955288 -1.9423754330907774 -4.9439595529406271 -0.098771298639726668 -1.9907879061444977 -4.8219659561763137 -0.11203168659348484 -1.9667816573652546 -4.6999723594120013 -0.12529207454724289 -1.9427754085860114 -4.5779787626476871 -0.13855246250100123 -1.918769159806768 -4.4559851658833738 -0.15181285045475937 -1.8947629110275248 -4.9349079973235863 -0.21108940806901433 -1.9911878816397319 -4.812914400559273 -0.2243497960227725 -1.9671816328604887 -4.6909208037949597 -0.23761018397653061 -1.9431753840812456 -4.5689272070306455 -0.25087057193028894 -1.9191691353020022 -4.4469336102663322 -0.26413095988404706 -1.8951628865227588 -4.9258564417065447 -0.32340751749830199 -1.9915878571349661 -4.8038628449422323 -0.33666790545206016 -1.9675816083557227 -4.6818692481779189 -0.34992829340581832 -1.9435753595764795 -4.5598756514136047 -0.3631886813595766 -1.9195691107972361 -4.9168048860895039 -0.43572562692758998 -1.9919878326302001 -4.7948112893251906 -0.44898601488134815 -1.9679815838509569 -4.6728176925608773 -0.46224640283510632 -1.9439753350717137 -4.9077533304724623 -0.54804373635687775 -1.9923878081254343 -4.7857597337081499 -0.56130412431063592 -1.9683815593461911 -4.6637661369438366 -0.57456451226439398 -1.9443753105669477 -4.8987017748554216 -0.66036184578616552 -1.9927877836206682 -4.7767081780911083 -0.67362223373992358 -1.968781534841425 -4.8896502192383799 -0.77267995521545318 -1.9931877591159024 -4.8805986636213392 -0.88499806464474084 -1.9935877346111364 -4.3342571612483045 -0.16235137634924524 -1.8707561673772426 -4.3268505559658994 -0.25781157693170398 -1.8711530778784815 -4.4389335177617237 -0.36567338269717586 -1.8955609028535987 -4.3194439506834943 -0.35327177751416283 -1.8715499883797204 -4.5510164795575472 -0.47353518846264764 -1.9199687278287161 -4.4315269124793186 -0.46113358327963472 -1.8959578133548376 -4.3120373454010892 -0.44873197809662169 -1.8719468988809593 -4.1925477783228606 -0.43633037291360871 -1.8479359844070806 -4.5436098742751421 -0.56899538904510649 -1.920365638329955 -4.4241203071969135 -0.55659378386209357 -1.8963547238560765 -4.3046307401186841 -0.54419217867908054 -1.8723438093821982 -4.1851411730404555 -0.53179057349606751 -1.8483328949083195 -4.6556928360709673 -0.67685719481057838 -1.9447734633050724 -4.536203268992737 -0.66445558962756535 -1.9207625488311939 -4.4167137019145084 -0.65205398444455243 -1.8967516343573154 -4.297224134836279 -0.63965237926153939 -1.8727407198834369 -4.1777345677580504 -0.62725077407852636 -1.8487298054095584 -4.7677757978667907 -0.78471900057605026 -1.9691812882801898 -4.6482862307885622 -0.77231739539303723 -1.9451703738063113 -4.5287966637103318 -0.7599157902100242 -1.9211594593324328 -4.4093070966321033 -0.74751418502701128 -1.8971485448585543 -4.2898175295538739 -0.73511257984399814 -1.8731376303846758 -4.1703279624756453 -0.72271097466098522 -1.8491267159107974 -4.7603691925843856 -0.88017920115850912 -1.9695781987814287 -4.6408796255061571 -0.86777759597549609 -1.9455672843075502 -4.5213900584279267 -0.85537599079248305 -1.9215563698336717 -4.4019004913496982 -0.84297438560947013 -1.8975454553597932 -4.2824109242714687 -0.83057278042645699 -1.8735345408859145 -4.1629213571932402 -0.81817117524344396 -1.849523626412036 -4.2508917579585823 0.8242234370743402 -1.8671405979066549 -4.3679794965982373 0.86098887823677772 -1.8911510747650115 -4.8491053591456712 0.89649755541885179 -1.9875486152043436 -4.7320176205060163 0.85973211425641405 -1.9635381383459871 -4.6149298818663604 0.82296667309397653 -1.9395276614876307 -4.4978421432267055 0.78620123193153901 -1.9155171846292742 -4.3807544045870497 0.74943579076910138 -1.8915067077709178 -4.8618802671344836 0.78494446795117534 -1.98790424821025 -4.7447925284948287 0.7481790267887376 -1.9638937713518936 -4.6277047898551738 0.71141358562630019 -1.9398832944935371 -4.5106170512155179 0.67464814446386256 -1.9158728176351807 -4.3935293125758621 0.63788270330142494 -1.891862340776824 -4.8746551751232969 0.673391380483499 -1.9882598812161565 -4.757567436483642 0.63662593932106115 -1.9642494043578 -4.6404796978439862 0.59986049815862375 -1.9402389274994436 -4.5233919592043303 0.56309505699618612 -1.9162284506410869 -4.8874300831121094 0.56183829301582255 -1.988615514222063 -4.7703423444724544 0.52507285185338481 -1.9646050373637065 -4.6532546058327995 0.4883074106909473 -1.9405945605053501 -4.9002049911009227 0.45028520554814622 -1.9889711472279694 -4.7831172524612677 0.41351976438570853 -1.964960670369613 -4.6660295138216119 0.37675432322327096 -1.9409501935112563 -4.9129798990897351 0.33873211808046971 -1.9893267802338759 -4.7958921604500802 0.30196667691803208 -1.9653163033755194 -4.9257548070785484 0.2271790306127934 -1.9896824132397823 -4.8086670684388935 0.19041358945035577 -1.9656719363814259 -4.9385297150673608 0.11562594314511704 -1.9900380462456888 -4.2635705264526225 0.71364434841219326 -1.8674961893427513 -4.2746888073422724 0.61887471523266491 -1.8678511060387391 -4.4054194139937088 0.53529367940917627 -1.892217591200722 -4.2858070882319224 0.52410508205313655 -1.8682060227347268 -4.5361500206451453 0.45171264358568752 -1.9165840763627049 -4.4165376948833588 0.44052404622964786 -1.8925725078967099 -4.2969253691215723 0.42933544887360814 -1.8685609394307148 -4.5472683015347952 0.35694301040615917 -1.9169389930586929 -4.4276559757730087 0.34575441305011956 -1.8929274245926977 -4.3080436500112222 0.33456581569407984 -1.8689158561267025 -4.6779989081862317 0.27336197458267036 -1.941305478220676 -4.5583865824244452 0.26217337722663075 -1.9172939097546808 -4.4387742566626587 0.25098477987059109 -1.8932823412886857 -4.3191619309008722 0.23979618251455143 -1.8692707728226905 -4.6891171890758816 0.17859234140314206 -1.941660394916664 -4.5695048633140951 0.16740374404710243 -1.9176488264506688 -4.4498925375523086 0.15621514669106276 -1.8936372579846734 -4.3302802117905221 0.1450265493350231 -1.8696256895186782 -4.819847795727318 0.095011305579653413 -1.9660268800786469 -4.7002354699655315 0.083822708223613748 -1.9420153116126517 -4.5806231442037451 0.072634110867574112 -1.9180037431466566 -4.4610108184419586 0.061445513511534447 -1.8939921746806614 -4.3413984926801721 0.050256916155494782 -1.8699806062146662 -4.9505784023787545 0.011430269756164541 -1.99039336524063 -4.830966076616968 0.00024167240012499803 -1.9663817967746349 -4.5599668174765817 1.8485650873120485 -1.984870008575552 -4.4522385631785228 1.7896976180725874 -1.9608494852963601 -4.344510308880464 1.7308301488331261 -1.9368289620171684 -4.2367820545824042 1.6719626795936646 -1.9128084387379769 -4.1290538002843453 1.6130952103542033 -1.8887879154587852 -4.0213255459862864 1.5542277411147418 -1.8647673921795935 -4.5938966248476207 1.7417692466243979 -1.9851633458818341 -4.4861683705495619 1.6829017773849371 -1.9611428226026424 -4.378440116251503 1.6240343081454758 -1.9371222993234507 -4.2707118619534432 1.5651668389060143 -1.913101776044259 -4.1629836076553843 1.506299369666553 -1.8890812527650673 -4.6278264322186597 1.6349734059367476 -1.9854566831881162 -4.5200981779206009 1.5761059366972867 -1.9614361599089245 -4.412369923622542 1.5172384674578254 -1.937415636629733 -4.3046416693244822 1.4583709982183639 -1.9133951133505411 -4.6617562395896988 1.5281775652490972 -1.9857500204943983 -4.5540279852916399 1.4693100960096364 -1.9617294972152068 -4.446299730993581 1.4104426267701751 -1.9377089739360152 -4.3385714766955212 1.3515751575307136 -1.9136884506568235 -4.6956860469607378 1.4213817245614466 -1.9860433578006804 -4.5879577926626789 1.3625142553219858 -1.962022834521489 -4.48022953836462 1.3036467860825243 -1.9380023112422975 -4.7296158543317768 1.314585883873796 -1.9863366951069628 -4.6218876000337179 1.2557184146343352 -1.9623161718277713 -4.7635456617028158 1.2077900431861457 -1.9866300324132449 -4.6558174074047569 1.1489225739466848 -1.9626095091340534 -4.7974754690738548 1.1009942024984953 -1.9869233697195272 -4.050635316564601 1.4626933277905181 -1.8650625401432905 -4.1948443011910275 1.406338459504842 -1.8893754009861703 -4.0796778746668094 1.3720416008988157 -1.8653577928313163 -4.2238868592932359 1.3156867326131394 -1.8896706536741961 -4.1087204327690179 1.2813898740071132 -1.8656530455193421 -4.3680958439196624 1.2593318643274629 -1.913983514517076 -4.2529294173954444 1.225035005721437 -1.8899659063622218 -4.1377629908712263 1.1907381471154108 -1.8659482982073679 -4.5123048285460898 1.2029769960417867 -1.9382963753599558 -4.3971384020218709 1.1686801374357605 -1.9142787672051018 -4.2819719754976528 1.1343832788297346 -1.8902611590502476 -4.1668055489734348 1.1000864202237084 -1.8662435508953936 -4.5413473866482983 1.1123252691500842 -1.9385916280479818 -4.4261809601240794 1.0780284105440581 -1.9145740198931276 -4.3110145335998613 1.0437315519380321 -1.8905564117382736 -4.1958481070756433 1.009434693332006 -1.8665388035834194 -4.6855563712747257 1.0559704008644077 -1.9629044888908616 -4.5703899447505067 1.0216735422583818 -1.9388868807360076 -4.4552235182262878 0.98737668365235565 -1.9148692725811536 -4.3400570917020698 0.9530798250463296 -1.8908516644262994 -4.2248906651778517 0.91878296644030344 -1.8668340562714454 -4.8297653559011522 0.99961553257873148 -1.9872173497337413 -4.7145989293769341 0.96531867397270543 -1.9631997415788873 -4.5994325028527152 0.93102181536667927 -1.9391821334240336 -4.4842660763284972 0.89672495676065311 -1.9151645252691794 -3.619045869219585 2.3289626804166939 -1.8628169737543587 -3.7133195170019713 2.4077139777313974 -1.8868549267328343 -3.8075931647843571 2.4864652750461009 -1.9108928797113098 -3.9018668125667433 2.5652165723608049 -1.9349308326897856 -3.9961404603491295 2.6439678696755085 -1.9589687856682609 -4.0904141081315153 2.722719166990212 -1.9830067386467363 -4.1441000221726503 2.6244367182715589 -1.9832099560876553 -4.0498263743902649 2.5456854209568549 -1.9591720031091799 -3.9555527266078783 2.4669341236421518 -1.9351340501307046 -3.861279078825492 2.3881828263274478 -1.9110960971522288 -3.7670054310431063 2.3094315290127438 -1.8870581441737533 -4.1977859362137853 2.5261542695529053 -1.9834131735285743 -4.1035122884313999 2.4474029722382018 -1.9593752205500989 -4.0092386406490137 2.3686516749234983 -1.9353372675716234 -3.914964992866627 2.2899003776087947 -1.9112993145931478 -4.2514718502549202 2.4278718208342518 -1.9836163909694933 -4.1571982024725349 2.3491205235195483 -1.9595784379910179 -4.0629245546901487 2.2703692262048447 -1.9355404850125424 -3.9686509069077625 2.1916179288901412 -1.9115025320340666 -4.3051577642960552 2.3295893721155987 -1.9838196084104123 -4.2108841165136699 2.2508380748008951 -1.9597816554319367 -4.1166104687312837 2.1720867774861916 -1.9357437024534612 -4.3588436783371902 2.2313069233969456 -1.9840228258513313 -4.2645700305548049 2.1525556260822416 -1.9599848728728557 -4.4125295923783252 2.133024474678292 -1.9842260432922503 -4.3182559445959399 2.0542731773635885 -1.9601880903137745 -4.4662155064194602 2.0347420259596389 -1.9844292607331691 -3.6663840509794152 2.2425972222156476 -1.8630240748356732 -3.818449485607029 2.2153578617845184 -1.8872627332188359 -3.7121119032311749 2.1592549352240131 -1.8632321611413876 -3.8641773378587887 2.1320155747928839 -1.8874708195245502 -3.7578397554829346 2.0759126482323786 -1.8634402474471019 -4.016242772486402 2.1047762143617552 -1.9117094779077128 -3.9099051901105484 2.0486732878012495 -1.8876789058302645 -3.8035676077346947 1.9925703612407442 -1.8636483337528162 -4.1683082071140163 2.0775368539306269 -1.9359481362908755 -4.0619706247381622 2.0214339273701207 -1.9119175642134272 -3.9556330423623081 1.9653310008096152 -1.8878869921359789 -3.8492954599864544 1.9092280742491099 -1.8638564200585306 -4.2140360593657764 1.9941945669389924 -1.9361562225965898 -4.1076984769899214 1.9380916403784862 -1.9121256505191413 -4.0013608946140682 1.8819887138179807 -1.888095078441693 -3.8950233122382145 1.8258857872574754 -1.8640645063642447 -4.3661014939933889 1.9669552065078637 -1.9603948809797522 -4.2597639116175356 1.9108522799473582 -1.9363643089023039 -4.1534263292416815 1.854749353386852 -1.9123337368248556 -4.0470887468658283 1.7986464268263465 -1.8883031647474073 -3.9407511644899742 1.7425435002658411 -1.864272592669959 -4.5181669286210022 1.9397158460767352 -1.9846335393629151 -4.411829346245149 1.8836129195162294 -1.9606029672854666 -4.3054917638692949 1.8275099929557237 -1.9365723952080183 -4.1991541814934408 1.7714070663952177 -1.9125418231305698 -4.0928165991175876 1.7153041398347122 -1.8885112510531215 -3.9864790167417343 1.6592012132742067 -1.8644806789756732 -3.0736142964993678 3.0103646446418306 -1.862039895992565 -3.1508250732066698 3.1060686586160342 -1.8861045686401876 -3.2280358499139723 3.2017726725902378 -1.9101692412878102 -3.3052466266212752 3.2974766865644418 -1.9342339139354328 -3.5310804835354292 3.4024165250194494 -1.9824327393946439 -3.4538697068281268 3.3067125110452453 -1.9583680667470216 -3.3766589301208243 3.2110084970710417 -1.934303394099399 -3.2994481534135214 3.1153044830968377 -1.9102387214517764 -3.2222373767062193 3.0196004691226341 -1.8861740488041538 -3.6024927870349783 3.3159483355260493 -1.9825022195586102 -3.5252820103276759 3.2202443215518453 -1.9584375469109878 -3.4480712336203734 3.1245403075776417 -1.9343728742633652 -3.3708604569130705 3.0288362936034376 -1.9103082016157427 -3.6739050905345274 3.2294801460326492 -1.9825716997225764 -3.5966943138272249 3.1337761320584452 -1.9585070270749541 -3.5194835371199225 3.0380721180842416 -1.9344423544273315 -3.44227276041262 2.9423681041100376 -1.9103776817797089 -3.7453173940340765 3.1430119565392491 -1.9826411798865426 -3.668106617326774 3.0473079425650451 -1.9585765072389203 -3.5908958406194715 2.9516039285908415 -1.9345118345912977 -3.8167296975336256 3.0565437670458486 -1.9827106600505089 -3.7395189208263231 2.960839753071645 -1.9586459874028865 -3.8881420010331746 2.9700755775524486 -1.9827801402144751 -3.8109312243258722 2.874371563578245 -1.9587154675668528 -3.9595543045327237 2.8836073880590485 -1.9828496203784416 -3.1387687523541858 2.9315579331133321 -1.8621139749808622 -3.2928391574296012 2.9341246020285947 -1.8862441246125132 -3.1993789321758932 2.8583147751691755 -1.8621913935083065 -3.3534493372513086 2.8608814440844381 -1.8863215431399576 -3.2599891119976006 2.7850716172250189 -1.8622688120357509 -3.5075197423267239 2.8634481129997011 -1.9104516927716089 -3.4140595170730159 2.7876382861402815 -1.886398961667402 -3.3205992918193079 2.7118284592808624 -1.8623462305631953 -3.6615901474021402 2.8660147819149637 -1.9345818424032604 -3.5681299221484313 2.7902049550555446 -1.9105291112990532 -3.4746696968947233 2.7143951281961249 -1.8864763801948463 -3.3812094716410153 2.6385853013367058 -1.8624236490906396 -3.7222003272238475 2.7927716239708071 -1.9346592609307047 -3.6287401019701386 2.716961797111388 -1.9106065298264976 -3.5352798767164306 2.6411519702519684 -1.8865537987222907 -3.4418196514627226 2.5653421433925492 -1.862501067618084 -3.8762707322992633 2.7953382928860702 -1.958789410562356 -3.7828105070455549 2.7195284660266505 -1.9347366794581491 -3.6893502817918464 2.6437186391672314 -1.910683948353942 -3.595890056538138 2.5679088123078118 -1.886631217249735 -3.50242983128443 2.4920989854483926 -1.8625784861455281 -4.0303411373746787 2.7979049618013327 -1.9829195601940073 -3.9368809121209707 2.7220951349419136 -1.9588668290898004 -3.8434206868672622 2.6462853080824944 -1.9348140979855935 -3.7499604616135538 2.5704754812230748 -1.9107613668813865 -3.6565002363598458 2.4946656543636552 -1.8867086357771794 -3.5630400111061373 2.418855827504236 -1.8626559046729725 -2.4046472936125731 3.5774739287667634 -1.8630843904653667 -2.7770675903600548 4.0509625121829984 -1.9834635094784392 -2.7199124908012249 3.941869680724591 -1.9593608627777266 -2.662757391242395 3.8327768492661836 -1.9352582160770142 -2.6056022916835655 3.7236840178077752 -1.9111555693763016 -2.548447192124736 3.6145911863493674 -1.8870529226755892 -2.8637123893133882 3.9789869383071945 -1.9833293949879491 -2.8065572897545583 3.8698941068487871 -1.9592267482872365 -2.7494021901957284 3.7608012753903797 -1.9351241015865241 -2.6922470906368989 3.6517084439319709 -1.9110214548858118 -2.6350919910780695 3.5426156124735635 -1.8869188081850994 -2.9503571882667217 3.9070113644313906 -1.9831952804974593 -2.8932020887078918 3.7979185329729832 -1.9590926337967467 -2.8360469891490618 3.6888257015145758 -1.9349899870960341 -2.7788918895902324 3.579732870056167 -1.9108873403953217 -3.0370019872200551 3.8350357905555867 -1.9830611660069692 -2.9798468876612252 3.7259429590971793 -1.9589585193062566 -2.9226917881023953 3.6168501276387719 -1.9348558726055443 -3.1236467861733885 3.7630602166797829 -1.9829270515164794 -3.0664916866145582 3.6539673852213754 -1.9588244048157668 -3.0093365870557283 3.5448745537629676 -1.9347217581150542 -3.210291585126722 3.691084642803979 -1.9827929370259894 -3.1531364855678916 3.5819918113455711 -1.9586902903252768 -3.296936384080055 3.6191090689281751 -1.9826588225354995 -3.3835811830333884 3.5471334950523712 -1.9825247080450095 -2.4881482403283943 3.5080941791997344 -1.8629527065685856 -2.561424856848515 3.4471564818851186 -1.8628289273666734 -2.7116938748835655 3.4789322995891192 -1.8867924581327993 -2.6347014733686356 3.3862187845705027 -1.8627051481647612 -2.8619628929186161 3.5107081172931198 -1.9107559888989252 -2.7849704914036861 3.4179946022745034 -1.8866686789308871 -2.7079780898887562 3.3252810872558869 -1.862581368962849 -2.9352395094387367 3.449770419978504 -1.910632209697013 -2.8582471079238068 3.3570569049598875 -1.8865448997289749 -2.7812547064088768 3.264343389941271 -1.8624575897609368 -3.0855085274737881 3.4815462376825046 -1.9345957404631389 -3.0085161259588573 3.3888327226638881 -1.9105084304951008 -2.9315237244439274 3.2961192076452717 -1.8864211205270627 -2.8545313229289975 3.2034056926266552 -1.8623338105590246 -3.2357775455088387 3.5133220553865052 -1.9585592712292648 -3.1587851439939088 3.4206085403678888 -1.9344719612612269 -3.0817927424789784 3.3278950253492723 -1.9103846512931888 -3.0048003409640485 3.2351815103306558 -1.8862973413251507 -2.9278079394491185 3.1424679953120394 -1.8622100313571126 -3.3090541620289593 3.4523843580718894 -1.9584354920273528 -3.2320617605140294 3.3596708430532729 -1.9343481820593147 -3.155069358999099 3.266957328034656 -1.9102608720912766 -3.0780769574841691 3.17424381301604 -1.8861735621232385 -3.0010845559692392 3.0815302979974235 -1.8620862521552004 -3.4593231800640103 3.48416017577589 -1.9823990227934785 -3.3823307785490804 3.3914466607572735 -1.9583117128254408 -1.9043572807647777 4.5523966154519337 -1.9873358421986003 -1.8695243798409069 4.4340040489926196 -1.9631843606207948 -1.8346914789170361 4.3156114825333054 -1.9390328790429892 -1.7998585779931651 4.1972189160739912 -1.9148813974651835 -1.7650256770692945 4.078826349614677 -1.890729915887378 -1.7301927761454237 3.9604337831553629 -1.8665784343095724 -2.0036412527633067 4.4967784893587286 -1.9868863901553546 -1.9688083518394359 4.3783859228994144 -1.9627349085775492 -1.9339754509155651 4.2599933564401002 -1.9385834269997435 -1.8991425499916941 4.1416007899807861 -1.9144319454219378 -1.8643096490678235 4.0232082235214719 -1.8902804638441324 -2.1029252247618357 4.4411603632655234 -1.986436938112109 -2.0680923238379649 4.3227677968062093 -1.9622854565343035 -2.0332594229140941 4.2043752303468951 -1.9381339749564979 -1.9984265219902231 4.0859826638875809 -1.9139824933786922 -2.2022091967603648 4.3855422371723183 -1.9859874860688633 -2.1673762958364939 4.2671496707130041 -1.9618360044910579 -2.1325433949126231 4.1487571042536899 -1.9376845229132522 -2.0977104939887519 4.0303645377943758 -1.9135330413354465 -2.3014931687588938 4.3299241110791131 -1.9855380340256177 -2.2666602678350229 4.211531544619799 -1.9613865524478122 -2.2318273669111521 4.0931389781604848 -1.9372350708700066 -2.4007771407574228 4.274305984985908 -1.985088581982372 -2.365944239833552 4.1559134185265938 -1.9609371004045666 -2.5000611127559518 4.2186878588927028 -1.9846391299391264 -2.465228211832081 4.1002952924333886 -1.9604876483613209 -2.5993450847544808 4.1630697327994977 -1.9841896778958807 -1.818913426200381 3.9104963693881483 -1.8661350635581788 -1.9600513051290709 3.9694950737146062 -1.8898330511079495 -1.9025441358041271 3.8632962088840839 -1.8656946230794362 -2.0436820147328172 3.9222949132105418 -1.8893926106292069 -1.9861748454078731 3.8160960483800195 -1.8652541826006934 -2.1848198936615071 3.9812936175369988 -1.9130905981789776 -2.127312724336563 3.8750947527064774 -1.8889521701504641 -2.0698055550116194 3.7688958878759551 -1.8648137421219508 -2.3259577725901974 4.0402923218634568 -1.9367885857287483 -2.2684506032652534 3.9340934570329344 -1.9126501577002348 -2.2109434339403093 3.8278945922024126 -1.8885117296717215 -2.1534362646153657 3.7216957273718902 -1.864373301643208 -2.4095884821939437 3.9930921613593924 -1.9363481452500055 -2.3520813128689997 3.8868932965288701 -1.9122097172214922 -2.2945741435440556 3.7806944316983477 -1.8880712891929787 -2.2370669742191116 3.6744955668678259 -1.8639328611644654 -2.5507263611226332 4.0520908656858499 -1.9600461327997762 -2.4932191917976896 3.945892000855328 -1.9359077047712629 -2.4357120224727455 3.8396931360248057 -1.9117692767427494 -2.3782048531478015 3.7334942711942833 -1.8876308487142361 -2.3206976838228579 3.627295406363761 -1.8634924206857226 -2.6918642400513235 4.1110895700123082 -1.9837441203495469 -2.6343570707263795 4.0048907051817855 -1.9596056923210337 -2.5768499014014359 3.8986918403512636 -1.9354672642925201 -2.5193427320764918 3.7924929755207408 -1.9113288362640068 -2.4618355627515478 3.6862941106902185 -1.8871904082354933 -0.87270323669889982 4.2796790466302514 -1.8746397621247186 -0.8839529196011513 4.4027846189391999 -1.898838666109153 -1.0388077884765756 4.8570216056126903 -1.9947045637447995 -1.0275581055743239 4.7339160333037427 -1.970505659760365 -1.0163084226720724 4.6108104609947942 -1.9463067557759306 -1.0050587397698207 4.4877048886858457 -1.922107851791496 -0.99380905686756926 4.3645993163768981 -1.8979089478070614 -0.98255937396531778 4.2414937440679497 -1.8737100438226271 -1.1486639257429938 4.8188363030503885 -1.993774845442708 -1.1374142428407423 4.6957307307414409 -1.9695759414582734 -1.1261645599384909 4.5726251584324924 -1.9453770374738391 -1.1149148770362389 4.4495195861235439 -1.9211781334894045 -1.1036651941339874 4.3264140138145963 -1.8969792295049699 -1.2585200630094118 4.7806510004880867 -1.9928451271406165 -1.2472703801071603 4.6575454281791391 -1.9686462231561819 -1.2360206972049088 4.5344398558701906 -1.9444473191717475 -1.2247710143026571 4.4113342835612421 -1.9202484151873129 -1.3683762002758297 4.7424656979257849 -1.9919154088385249 -1.3571265173735783 4.6193601256168373 -1.9677165048540903 -1.3458768344713268 4.4962545533078888 -1.943517600869656 -1.3346271515690751 4.3731489809989403 -1.9193186968852216 -1.4782323375422477 4.7042803953634831 -1.9909856905364334 -1.4669826546399962 4.5811748230545355 -1.966786786551999 -1.455732971737745 4.458069250745587 -1.9425878825675646 -1.5880884748086659 4.6660950928011813 -1.9900559722343418 -1.5768387919064146 4.5429895204922328 -1.9658570682499075 -1.6979446120750836 4.6279097902388795 -1.9891262539322503 -1.807800749341502 4.5897244876765768 -1.9881965356301587 -0.8590126297529781 4.1573091495581611 -1.8504399456037877 -0.95127742955520589 4.1244257372325404 -1.8495036508014975 -1.0791903631791793 4.207294396722598 -1.8727753813149586 -1.0435422293574337 4.0915423249069196 -1.8485673559992073 -1.2071032968031523 4.2901630562126547 -1.8960471118284199 -1.1714551629814069 4.1744109843969772 -1.8718390865126684 -1.29936809660538 4.2572796438870339 -1.8951108170261297 -1.2637199627836346 4.1415275720713565 -1.8709027917103782 -1.4272810302293533 4.3401483033770916 -1.9183825475395908 -1.3916328964076077 4.2243962315614132 -1.8941745222238395 -1.3559847625858623 4.1086441597457357 -1.869966496908088 -1.5551939638533265 4.4230169628671483 -1.9416542780530524 -1.5195458300315809 4.3072648910514708 -1.9174462527373006 -1.4838976962098354 4.1915128192357924 -1.8932382274215493 -1.44824956238809 4.075760747420115 -1.8690302021057978 -1.6831068974773 4.505885622357205 -1.9649260085665137 -1.6474587636555544 4.3901335505415275 -1.9407179832507622 -1.6118106298338089 4.2743814787258501 -1.9165099579350104 -1.5761624960120633 4.1586294069101717 -1.8923019326192592 -1.5405143621903179 4.0428773350944942 -1.8680939073035077 -1.7753716972795275 4.4730022100315843 -1.9639897137642235 -1.7397235634577821 4.3572501382159068 -1.939781688448472 -1.7040754296360365 4.2414980664002293 -1.9155736631327203 -1.6684272958142912 4.1257459945845518 -1.891365637816969 -1.6327791619925458 4.0099939227688735 -1.8671576125012173 -0.041870405182870059 4.3089062182109847 -1.86335318951517 -0.030488928338301999 4.4316403743792154 -1.8875435547634312 -0.019107451493733975 4.5543745305474461 -1.9117339200116923 -0.0077259746491659441 4.6771086867156768 -1.9359242852599536 -0.10445290451969835 4.9028906700585067 -1.9827301066644489 -0.11583438136426638 4.7801565138902751 -1.9585397414161878 -0.12721585820883446 4.6574223577220435 -1.9343493761679262 -0.13859733505340255 4.5346882015538128 -1.9101590109196649 -0.14997881189797055 4.4119540453855821 -1.8859686456714038 -0.22394278807936685 4.8832043410648733 -1.9811551975724215 -0.23532426492393482 4.7604701848966418 -1.9569648323241604 -0.24670574176850291 4.6377360287284102 -1.9327744670758988 -0.25808721861307099 4.5150018725601795 -1.9085841018276375 -0.34343267163903529 4.86351801207124 -1.9795802884803941 -0.35481414848360326 4.7407838559030084 -1.955389923232133 -0.3661956253281714 4.6180496997347769 -1.9311995579838714 -0.37757710217273943 4.4953155435665462 -1.9070091927356103 -0.46292255519870373 4.8438316830776067 -1.9780053793883667 -0.47430403204327171 4.7210975269093751 -1.9538150141401056 -0.48568550888783985 4.5983633707411435 -1.929624648891844 -0.58241243875837245 4.8241453540839734 -1.9764304702963393 -0.59379391560294048 4.7014111979157418 -1.9522401050480782 -0.6905208454734727 4.9271931812585708 -1.9990459264525733 -0.70190232231804084 4.8044590250903401 -1.9748555612043119 -0.8100107290331412 4.9075068522649374 -1.9974710173605459 -0.92950061259280958 4.8878205232713041 -1.9958961082685185 -0.15120521594510417 4.2900275363889291 -1.861739981796257 -0.26453706241325059 4.3926599360794896 -1.88437513752276 -0.2522999100250537 4.2718042025948657 -1.8600956974754719 -0.36563175649320012 4.3744366022854262 -1.8827308532019749 -0.35339460410500328 4.2535808688008023 -1.8584514131546868 -0.4789636029613466 4.4770690019759867 -1.9053660089284779 -0.46672645057314971 4.3562132684913628 -1.8810865688811897 -0.45448929818495293 4.2353575350067389 -1.8568071288339016 -0.59229544942949319 4.5797014016665463 -1.9280011646549808 -0.58005829704129641 4.4588456681819233 -1.9037217246076927 -0.56782114465309963 4.3379899346972994 -1.8794422845604046 -0.55558399226490285 4.2171342012126756 -1.8551628445131165 -0.70562729589763973 4.6823338013571076 -1.950636320381484 -0.69339014350944272 4.5614780678724829 -1.9263568803341957 -0.68115299112124594 4.4406223343878599 -1.9020774402869076 -0.66891583873304916 4.3197666009032361 -1.8777980002396197 -0.65667868634485238 4.1989108674186122 -1.8535185601923316 -0.81895914236578615 4.7849662010476681 -1.973271476107987 -0.80672198997758915 4.6641104675630443 -1.9489920360606989 -0.79448483758939226 4.5432547340784195 -1.9247125960134106 -0.78224768520119548 4.4223990005937956 -1.9004331559661227 -0.77001053281299869 4.3015432671091718 -1.8761537159188346 -0.75777338042480191 4.1806875336245479 -1.8518742758715467 -0.92005383644573557 4.7667428672536047 -1.9716271917872019 -0.90781668405753857 4.6458871337689809 -1.9473477517399138 -0.89557953166934168 4.5250314002843561 -1.9230683116926257 0.89194301160789702 4.9087188450519017 -1.9993172460253388 0.86314161044106164 4.7908312969373839 -1.9753037019384159 0.83434020927422603 4.6729437488228651 -1.9512901578514927 0.80553880810739054 4.5550562007083482 -1.9272766137645698 0.77673740694055515 4.4371686525938294 -1.9032630696776471 0.74793600577371977 4.3192811044793116 -1.8792495255907242 0.76522060918199475 4.9105752318674156 -1.9972038656871209 0.73641920801515925 4.7926876837528978 -1.973190321600198 0.70761780684832376 4.674800135638379 -1.9491767775132749 0.67881640568148827 4.5569125875238621 -1.9251632334263522 0.65001500451465288 4.4390250394093433 -1.9011496893394293 0.63849820675609248 4.9124316186829295 -1.9950904853489031 0.60969680558925687 4.7945440705684117 -1.9710769412619802 0.58089540442242149 4.6766565224538938 -1.9470633971750573 0.55209400325558611 4.558768974339376 -1.9230498530881344 0.5117758043301901 4.9142880054984435 -1.9929771050106853 0.4829744031633546 4.7964004573839256 -1.9689635609237623 0.45417300199651922 4.6785129092694078 -1.9449500168368394 0.38505340190428794 4.9161443923139574 -1.9908637246724676 0.35625200073745245 4.7982568441994404 -1.9668501805855447 0.32745059957061706 4.6803692960849226 -1.9428366364986218 0.25833099947838556 4.9180007791294722 -1.9887503443342498 0.22952959831155015 4.8001132310149544 -1.9647368002473269 0.13160859705248337 4.9198571659449861 -1.9866369639960322 0.7267496704289268 4.2001215801449465 -1.8551321576619475 0.62643043408123289 4.3202661022890121 -1.8770650189586962 0.61586898839676374 4.1993318582999191 -1.8528027912362433 0.52611119773353876 4.4404106244330785 -1.8989978802554446 0.51554975204906983 4.3194763804439846 -1.8747356525329919 0.50498830636460068 4.1985421364548916 -1.850473424810539 0.4257919613858448 4.5605551465771441 -1.9209307415521932 0.41523051570137565 4.4396209025880511 -1.8966685138297403 0.40466907001690666 4.3186866585989572 -1.8724062861072877 0.39410762433243757 4.1977524146098633 -1.8481440583848348 0.31491127935368179 4.5597654247321167 -1.918601375126489 0.30434983366921264 4.4388311807430236 -1.8943391474040361 0.2937883879847436 4.3178969367539297 -1.8700769196815834 0.21459204300598766 4.6799099468761831 -1.9405342364232376 0.20403059732151863 4.5589757028870892 -1.9162720087007847 0.1934691516370495 4.4380414588979962 -1.8920097809783318 0.18290770595258046 4.3171072149089023 -1.8677475532558792 0.11427280665829376 4.8000544690202496 -1.9624670977199863 0.10371136097382468 4.6791202250311548 -1.9382048699975334 0.093149915289355609 4.5581859810420617 -1.9139426422750805 0.0825884696048865 4.4372517370529678 -1.8896804145526276 0.072027023920417432 4.3163174930638748 -1.8654181868301749 0.013953570310599841 4.9201989911643151 -1.9843999590167347 0.0033921246261307547 4.7992647471752212 -1.960137731294282 1.8363515554005199 4.5990090953313425 -1.9916289213595304 1.7919223557383681 4.4881326676206967 -1.9678439694034344 1.7474931560762164 4.3772562399100519 -1.9440590174473387 1.703063956414065 4.266379812199407 -1.9202740654912427 1.6586347567519133 4.155503384488763 -1.8964891135351467 1.6142055570897618 4.0446269567781181 -1.8727041615790507 1.713094163989253 4.6259223178461664 -1.9896250995652323 1.6686649643271012 4.5150458901355206 -1.9658401476091363 1.6242357646649495 4.4041694624248757 -1.9420551956530405 1.5798065650027979 4.2932930347142308 -1.9182702436969445 1.5353773653406462 4.1824166070035869 -1.8944852917408486 1.5898367725779861 4.6528355403609902 -1.9876212777709341 1.5454075729158343 4.5419591126503445 -1.9638363258148381 1.5009783732536826 4.4310826849396996 -1.9400513738587424 1.4565491735915308 4.3202062572290547 -1.9162664219026464 1.4665793811667189 4.6797487628758141 -1.985617455976636 1.4221501815045672 4.5688723351651683 -1.96183250402054 1.3777209818424152 4.4579959074545235 -1.9380475520644442 1.343321989755452 4.7066619853906371 -1.9836136341823378 1.2988927900933003 4.5957855576799922 -1.9598286822262421 1.2544635904311481 4.4849091299693464 -1.9360437302701461 1.2200645983441851 4.7335752079054609 -1.9816098123880399 1.1756353986820332 4.6226987801948152 -1.9578248604319439 1.096807206932918 4.7604884304202839 -1.9796059905937418 1.5749526962884557 3.9317960202976558 -1.8488457083719101 1.4946040356456525 4.0701597770232665 -1.8706484283810623 1.4142553750028495 4.2085235337488758 -1.8924511483902147 1.3862265173298995 4.0914545801801623 -1.8684333203249275 1.3339067143600463 4.346887290474486 -1.9142538683993671 1.3058778566870965 4.2298183369057716 -1.8902360403340797 1.2778489990141466 4.1127493833370581 -1.8662182122687925 1.2255291960442933 4.3681820936313818 -1.9120387603432321 1.1975003383713436 4.2511131400626683 -1.8880209322779449 1.1694714806983937 4.1340441864939539 -1.8640031042126577 1.1451805354014903 4.506545850356992 -1.9338414803523845 1.1171516777285404 4.3894768967882785 -1.9098236522870971 1.0891228200555907 4.2724079432195641 -1.8858058242218099 1.0610939623826408 4.1553389896508497 -1.8617879961565227 1.0648318747586871 4.644909607082603 -1.9556442003615366 1.0368030170857374 4.5278406535138886 -1.9316263722962494 1.0087741594127875 4.4107716999451743 -1.9076085442309623 0.98074530173983765 4.2937027463764608 -1.8835907161656751 0.95271644406688771 4.1766337928077464 -1.8595728881003879 0.98448321411588413 4.7832733638082132 -1.9774469203706893 0.95645435644293419 4.6662044102394988 -1.9534290923054018 0.92842549876998426 4.5491354566707853 -1.9294112642401144 0.90039664109703443 4.432066503102071 -1.9053934361748273 0.87236778342408461 4.3149975495333566 -1.8813756081095401 0.84433892575113467 4.1979285959646422 -1.8573577800442529 2.6466901791558186 4.109596307072132 -1.9792245818698311 2.583474037351674 4.0088966238851889 -1.9555176144655286 2.520257895547529 3.9081969406982449 -1.9318106470612257 2.457041753743384 3.8074972575113013 -1.9081036796569231 2.3938256119392389 3.7067975743243573 -1.8843967122526204 2.3306094701350943 3.6060978911374137 -1.8606897448483177 2.5376868162601909 4.1600932903939984 -1.9778555460520264 2.4744706744560463 4.0593936072070553 -1.954148578647724 2.4112545326519013 3.9586939240201113 -1.9304416112434211 2.3480383908477562 3.8579942408331678 -1.9067346438391184 2.2848222490436116 3.7572945576462238 -1.8830276764348157 2.4286834533645631 4.2105902737158649 -1.9764865102342217 2.3654673115604186 4.1098905905289218 -1.9527795428299193 2.3022511697562735 4.0091909073419778 -1.9290725754256164 2.2390350279521285 3.9084912241550342 -1.9053656080213137 2.3828962322730805 4.3617869402246763 -1.9988244418207197 2.3196800904689354 4.2610872570377314 -1.9751174744164171 2.2564639486647908 4.1603875738507883 -1.9514105070121146 2.1932478068606458 4.0596878906638443 -1.9277035396078117 2.2738928693774527 4.4122839235465428 -1.997455406002915 2.2106767275733077 4.3115842403595979 -1.9737484385986124 2.1474605857691631 4.2108845571726548 -1.9500414711943097 2.164889506481825 4.4627809068684092 -1.9960863701851104 2.10167336467768 4.3620812236814643 -1.9723794027808075 2.0558861435861973 4.5132778901902757 -1.9947173343673055 1.9468827806905691 4.5637748735121422 -1.9933482985495008 2.2352999209346418 3.6489206686778206 -1.8592581829553141 2.1868968348348448 3.8015833027262209 -1.8816080586047197 2.1421324233745338 3.6905430103536512 -1.8578168404354578 2.1384937487350473 3.9542459367746217 -1.9039579342541253 2.0937293372747368 3.8432056444020515 -1.8801667160848634 2.0489649258144262 3.7321653520294817 -1.8563754979156015 2.0900906626352498 4.1069085708230224 -1.9263078099035307 2.0453262511749393 3.9958682784504522 -1.902516591734269 2.0005618397146288 3.884827986077882 -1.8787253735650071 1.9557974282543182 3.7737876937053123 -1.8549341553957452 2.0416875765354527 4.2595712048714232 -1.9486576855529363 1.996923165075142 4.1485309124988525 -1.9248664673836744 1.9521587536148315 4.0374906201262828 -1.9010752492144127 1.907394342154521 3.9264503277537122 -1.8772840310451508 1.8626299306942105 3.8154100353811424 -1.853492812875889 1.9932844904356555 4.412233838919823 -1.9710075612023419 1.948520078975345 4.3011935465472533 -1.94721634303308 1.9037556675150342 4.1901532541746827 -1.9234251248638181 1.8589912560547237 4.0791129618021129 -1.8996339066945565 1.8142268445944132 3.9680726694295427 -1.8758426885252946 1.7694624331341027 3.8570323770569725 -1.8520514703560327 1.9001169928755477 4.453856180595654 -1.9695662186824856 1.8553525814152372 4.3428158882230834 -1.9457750005132237 1.8105881699549264 4.2317755958505128 -1.9219837823439618 1.7658237584946159 4.120735303477943 -1.8981925641746999 1.7210593470343054 4.0096950111053733 -1.8744013460054381 1.6762949355739949 3.8986547187328031 -1.8506101278361764 3.4695970860673837 3.5020983495910487 -1.9864732896665744 3.3881599746919937 3.4154934798037337 -1.9627662120674791 3.3067228633166037 3.3288886100164192 -1.9390591344683838 3.2252857519412137 3.2422837402291047 -1.9153520568692886 3.1438486405658232 3.1556788704417897 -1.8916449792701933 3.0624115291904328 3.0690740006544752 -1.867937901671098 3.3778518359791372 3.5724956086261437 -1.9857168127672453 3.2964147246037472 3.4858907388388287 -1.96200973516815 3.2149776132283572 3.3992858690515142 -1.9383026575690547 3.1335405018529672 3.3126809992641997 -1.9145955799699594 3.0521033904775767 3.2260761294768847 -1.8908885023708644 2.9706662791021863 3.1394712596895697 -1.8671814247717691 3.2861065858908907 3.6428928676612387 -1.9849603358679162 3.2046694745155007 3.5562879978739237 -1.9612532582688209 3.1232323631401107 3.4696831280866092 -1.9375461806697256 3.0417952517647207 3.3830782582992942 -1.9138391030706305 2.9603581403893302 3.2964733885119792 -1.8901320254715352 3.1943613358026441 3.7132901266963336 -1.9842038589685873 3.1129242244272541 3.6266852569090187 -1.9604967813694918 3.0314871130518637 3.5400803871217041 -1.9367897037703967 2.9500500016764737 3.4534755173343892 -1.9130826261713014 3.1026160857143976 3.7836873857314282 -1.9834473820692582 3.0211789743390076 3.6970825159441132 -1.9597403044701629 2.9397418629636172 3.6104776461567987 -1.9360332268710676 3.0108708356261511 3.8540846447665231 -1.9826909051699293 2.9294337242507611 3.7674797749792082 -1.9589838275708338 2.9191255855379046 3.9244819038016177 -1.9819344282706002 2.8376884741625146 3.8378770340143027 -1.9582273506715049 2.8273803354496581 3.9948791628367126 -1.9811779513712713 2.8922972253675754 3.1988062240941395 -1.8664118560211751 2.8786286099176541 3.3585875124609839 -1.8893657457621946 2.8145222361322904 3.2576498891526668 -1.8656417058344343 2.8649599944677329 3.5183688008278282 -1.9123196355032144 2.8008536206823691 3.4174311775195112 -1.8885955955754539 2.7367472468970053 3.3164935542111942 -1.8648715556476936 2.8512913790178116 3.6781500891946721 -1.9352735252442339 2.7871850052324478 3.5772124658863556 -1.9115494853164736 2.7230786314470841 3.4762748425780385 -1.8878254453887131 2.6589722576617199 3.3753372192697215 -1.8641014054609528 2.7735163897825266 3.7369937542531995 -1.9345033750574931 2.7094100159971628 3.6360561309448829 -1.9107793351297329 2.6453036422117986 3.5351185076365659 -1.8870552952019723 2.5811972684264348 3.4341808843282489 -1.8633312552742118 2.7598477743326049 3.8967750426200438 -1.9574572647985129 2.6957414005472415 3.7958374193117268 -1.9337332248707524 2.6316350267618773 3.6948997960034102 -1.9100091849429921 2.5675286529765131 3.5939621726950932 -1.8862851450152316 2.5034222791911498 3.4930245493867762 -1.8625611050874711 2.7461791588826836 4.0565563309868882 -1.9804111545395326 2.6820727850973198 3.9556187076785707 -1.9566871146117721 2.6179664113119561 3.8546810843702541 -1.9329630746840116 2.5538600375265919 3.7537434610619371 -1.9092390347562511 2.4897536637412281 3.6528058377536201 -1.8855149948284906 2.4256472899558643 3.5518682144453035 -1.8617909549007301 4.0508876091961419 2.8222195695596577 -1.9891771733513042 3.9540446058236469 2.7530936176603746 -1.9654492953009697 3.8572016024511515 2.683967665761092 -1.9417214172506352 3.7603585990786561 2.6148417138618094 -1.9179935392003009 3.6635155957061607 2.5457157619625264 -1.8942656611499664 3.5666725923336653 2.4765898100632437 -1.8705377830996319 3.9776461142705588 2.9088798272421927 -1.9888494274731894 3.8808031108980638 2.8397538753429097 -1.9651215494228549 3.7839601075255684 2.7706279234436271 -1.9413936713725204 3.687117104153073 2.7015019715443445 -1.9176657933221861 3.5902741007805776 2.6323760196450614 -1.8939379152718516 3.9044046193449757 2.9955400849247278 -1.9885216815950746 3.8075616159724808 2.9264141330254447 -1.9647938035447401 3.7107186125999854 2.8572881811261621 -1.9410659254944056 3.61387560922749 2.7881622292268791 -1.9173380474440713 3.8311631244193927 3.0822003426072628 -1.9881939357169598 3.7343201210468973 3.0130743907079798 -1.9644660576666253 3.6374771176744023 2.9439484388086972 -1.940738179616291 3.5406341143019064 2.8748224869094141 -1.9170103015659565 3.7579216294938096 3.1688606002897979 -1.987866189838845 3.6610786261213137 3.0997346483905148 -1.9641383117885107 3.5642356227488188 3.0306086964912322 -1.9404104337381762 3.6846801345682265 3.2555208579723329 -1.9875384439607302 3.5878371311957307 3.1863949060730494 -1.9638105659103959 3.6114386396426434 3.3421811156548675 -1.9872106980826154 3.5381971447170599 3.4288413733374026 -1.9868829522045006 3.4979697735763913 2.5577369147797517 -1.8702122232336906 3.518305093707442 2.7174905798779876 -1.8936107822759591 3.4359214893609753 2.6308007226302825 -1.8698898684639 3.4562568094920261 2.7905543877285188 -1.8932884275061685 3.3738732051455593 2.7038645304808133 -1.8695675136941095 3.4765921296230764 2.9503080528267551 -1.9166869865484371 3.3942085252766101 2.8636181955790501 -1.892966072736378 3.3118249209301434 2.7769283383313446 -1.8692451589243189 3.4969274497541272 3.1100617179249919 -1.9400855455907056 3.4145438454076604 3.0233718606772864 -1.9163646317786465 3.3321602410611941 2.9366820034295809 -1.8926437179665874 3.2497766367147274 2.8499921461818758 -1.8689228041545283 3.5172627698851775 3.2698153830232282 -1.9634841046329741 3.4348791655387112 3.1831255257755227 -1.939763190820915 3.3524955611922445 3.0964356685278172 -1.9160422770088559 3.2701119568457782 3.0097458112801121 -1.8923213631967968 3.1877283524993114 2.9230559540324066 -1.8686004493847377 3.4552144856697615 3.3428791908737594 -1.9631617498631835 3.3728308813232952 3.2561893336260539 -1.9394408360511244 3.2904472769768285 3.1694994763783484 -1.9157199222390653 3.2080636726303617 3.0828096191306433 -1.8919990084270062 3.125680068283895 2.9961197618829378 -1.8682780946149471 4.5422880405350332 1.949809490807382 -1.9898364873202117 4.4337098694547921 1.9008414110102214 -1.9660832057087319 4.32513169837455 1.8518733312130609 -1.942329924097252 4.2165535272943089 1.8029052514159003 -1.9185766424857722 4.1079753562140686 1.7539371716187397 -1.8948233608742924 3.9993971851338275 1.7049690918215792 -1.8710700792628125 4.4890325504310091 2.0489389389226353 -1.9897889469343215 4.3804543793507671 1.999970859125475 -1.9660356653228417 4.2718762082705259 1.9510027793283145 -1.9422823837113619 4.1632980371902848 1.9020346995311539 -1.918529102099882 4.0547198661100445 1.8530666197339933 -1.8947758204884022 4.4357770603269842 2.1480683870378892 -1.9897414065484313 4.327198889246743 2.0991003072407284 -1.9659881249369517 4.2186207181665019 2.050132227443568 -1.9422348433254717 4.1100425470862607 2.0011641476464073 -1.9184815617139921 4.0014643760060196 1.9521960678492469 -1.894728280102512 4.3825215702229592 2.247197835153143 -1.9896938661625414 4.273943399142718 2.1982297553559822 -1.9659405845510616 4.1653652280624769 2.1492616755588219 -1.9421873029395818 4.0567870569822357 2.1002935957616611 -1.9184340213281019 4.3292660801189351 2.3463272832683963 -1.9896463257766512 4.220687909038694 2.2973592034712356 -1.9658930441651716 4.1121097379584528 2.2483911236740752 -1.9421397625536916 4.276010590014911 2.4454567313836497 -1.9895987853907613 4.167432418934669 2.3964886515864889 -1.9658455037792815 4.222755099910886 2.5445861794989035 -1.9895512450048711 4.1141769288306449 2.4956180997017428 -1.9657979633933915 4.169499609806862 2.6437156276141569 -1.9895037046189812 3.946694643378688 1.8030726634739724 -1.8710233507864249 3.9016172019198128 1.8870295052615338 -1.8709878184577431 3.9543002908444702 2.0400242272115223 -1.8946896838966094 3.8565397604609375 1.9709863470490951 -1.8709522861290613 4.0069833797691272 2.1930189491615115 -1.918391549335476 3.9092228493855949 2.1239810689990839 -1.8946541515679276 3.8114623190020622 2.0549431888366567 -1.8709167538003795 4.0596664686937842 2.3460136711114998 -1.9420934147743423 3.961905938310252 2.2769757909490727 -1.9183560170067941 3.8641454079267197 2.2079379107866455 -1.8946186192392458 3.766384877543187 2.1389000306242183 -1.8708812214716977 4.0145890272349094 2.429970512899061 -1.9420578824456605 3.9168284968513767 2.3609326327366338 -1.9183204846781126 3.8190679664678444 2.2918947525742066 -1.8945830869105642 3.7213074360843121 2.2228568724117794 -1.8708456891430159 4.0672721161595664 2.5829652348490497 -1.965759747884527 3.9695115857760341 2.5139273546866225 -1.9420223501169789 3.8717510553925019 2.4448894745241954 -1.9182849523494307 3.7739905250089691 2.3758515943617682 -1.8945475545818824 3.6762299946254373 2.3068137141993406 -1.8708101568143343 4.1199552050842234 2.7359599567990385 -1.9894616133233936 4.0221946747006916 2.6669220766366113 -1.9657242155558452 3.9244341443171589 2.5978841964741837 -1.9419868177882971 3.8266736139336266 2.5288463163117565 -1.9182494200207492 3.7289130835500943 2.4598084361493293 -1.8945120222532008 3.631152553166562 2.3907705559869021 -1.8707746244856525 4.8385381628795665 0.99621664032785273 -1.9886981036470082 4.7223748641827026 0.96930867557878508 -1.9649185335053689 4.6062115654858395 0.94240071082971744 -1.9411389633637297 4.4900482667889756 0.9154927460806499 -1.9173593932220907 4.3738849680921117 0.88858478133158214 -1.8935798230804515 4.2577216693952487 0.8616768165825146 -1.869800252938812 4.8066327873893462 1.1037574636981722 -1.9888352002780734 4.6904694886924831 1.0768494989491049 -1.9650556301364341 4.5743061899956192 1.0499415342000371 -1.9412760599947949 4.4581428912987553 1.0230335694509696 -1.9174964898531559 4.3419795926018914 0.99612560470190181 -1.8937169197115165 4.2258162939050283 0.96921763995283416 -1.8699373495698772 4.7747274118991267 1.2112982870684919 -1.9889722969091386 4.6585641132022628 1.1843903223194245 -1.9651927267674993 4.5424008145053989 1.1574823575703568 -1.9414131566258601 4.4262375158085359 1.1305743928212892 -1.9176335864842209 4.3100742171116719 1.1036664280722215 -1.8938540163425817 4.7428220364089064 1.3188391104388115 -1.9891093935402038 4.6266587377120434 1.2919311456897442 -1.9653298233985645 4.5104954390151795 1.2650231809406765 -1.9415502532569253 4.3943321403183155 1.2381152161916089 -1.9177706831152861 4.710916660918687 1.4263799338091312 -1.989246490171269 4.5947533622218231 1.3994719690600639 -1.9654669200296297 4.4785900635249591 1.3725640043109961 -1.9416873498879905 4.6790112854284667 1.5339207571794509 -1.9893835868023342 4.5628479867316036 1.5070127924303836 -1.965604016660695 4.4466846880347397 1.480104827681316 -1.9418244465190557 4.6471059099382472 1.6414615805497705 -1.9895206834333994 4.5309426112413833 1.6145536158007032 -1.9657411132917602 4.6152005344480269 1.7490024039200902 -1.9896577800644646 4.198199146661052 1.0628390639593741 -1.870087036360933 4.2807483323980877 1.2028343383853526 -1.8939986863115632 4.1713015881780731 1.1541247346508292 -1.8702388358514785 4.3632975181351235 1.3428296128113311 -1.9179103362621936 4.2538507739151088 1.2941200090768077 -1.8941504858021088 4.1444040296950941 1.2454104053422843 -1.8703906353420241 4.3363999596521445 1.4341152835027862 -1.9180621357527392 4.2269532154321299 1.3854056797682628 -1.8943022852926543 4.1175064712121152 1.3366960760337394 -1.8705424348325697 4.4189491453891803 1.5741105579287644 -1.9419737857033696 4.3095024011691656 1.5254009541942413 -1.9182139352432848 4.200055656949151 1.4766913504597179 -1.8944540847832001 4.0906089127291363 1.4279817467251945 -1.8706942343231152 4.501498331126216 1.7141058323547427 -1.9658854356540001 4.3920515869062013 1.6653962286202195 -1.9421255851939152 4.2826048426861867 1.6166866248856961 -1.9183657347338305 4.173158098466172 1.567977021151173 -1.8946058842737457 4.0637113542461574 1.5192674174166496 -1.8708460338136608 4.5840475168632517 1.8541011067807212 -1.9897970856046305 4.4746007726432371 1.8053915030461978 -1.9660372351445456 4.3651540284232224 1.7566818993116746 -1.942277384684461 4.2557072842032078 1.7079722955771512 -1.9185175342243761 4.1462605399831931 1.6592626918426281 -1.8947576837642914 4.0368137957631793 1.6105530881081047 -1.8709978333042065 4.9311024048848138 0.0032752733904031217 -1.98635958264804 4.9214222600276045 0.11497253016639475 -1.9866223607468481 4.8021115423283529 0.11119537365734822 -1.9628159845647775 4.6828008246291004 0.10741821714830158 -1.9390096083827069 4.5634901069298488 0.1036410606392551 -1.9152032322006363 4.4441793892305963 0.099863904130208458 -1.8913968560185657 4.3248686715313447 0.096086747621161983 -1.8675904798364951 4.9117421151703953 0.22666978694238638 -1.9868851388456561 4.7924313974711437 0.22289263043333984 -1.9630787626635855 4.6731206797718912 0.2191154739242932 -1.9392723864815149 4.5538099620726396 0.2153383174152467 -1.9154660102994443 4.4344992443733871 0.21156116090620009 -1.8916596341173737 4.902061970313186 0.338367043718378 -1.9871479169444641 4.7827512526139344 0.33458988720933147 -1.9633415407623935 4.6634405349146819 0.33081273070028477 -1.9395351645803229 4.5441298172154303 0.3270355741912383 -1.9157287883982523 4.8923818254559768 0.45006430049436985 -1.9874106950432722 4.7730711077567252 0.44628714398532338 -1.9636043188612016 4.6537603900574727 0.44250998747627668 -1.939797942679131 4.8827016805987675 0.56176155727036148 -1.9876734731420802 4.763390962899515 0.55798440076131495 -1.9638670969600096 4.6440802452002634 0.55420724425226831 -1.9400607207779392 4.8730215357415583 0.6734588140463531 -1.9879362512408885 4.7537108180423058 0.66968165753730657 -1.9641298750588179 4.8633413908843481 0.78515607082234473 -1.9881990293396965 4.8536612460271389 0.89685332759833636 -1.9884618074385048 4.3164357902939221 0.19571873941521034 -1.8678649815795751 4.4254549420460743 0.31710766615838248 -1.8919283888128815 4.3084917929052038 0.29062156803443984 -1.8681440785824235 4.5344740937982264 0.43849659290155463 -1.9159917960461876 4.4175109446573559 0.41201049477761198 -1.8922074858157298 4.3005477955164846 0.38552439665366928 -1.8684231755852718 4.5265300964095081 0.53339942152078401 -1.916270893049036 4.4095669472686376 0.50691332339684148 -1.8924865828185782 4.2926037981277663 0.48042722527289872 -1.8687022725881202 4.6355492481616603 0.65478834826395627 -1.9403343002823423 4.5185860990207898 0.62830225014001351 -1.9165499900518843 4.4016229498799184 0.60181615201607097 -1.8927656798214265 4.2846598007390471 0.57533005389212821 -1.8689813695909685 4.7445683999138124 0.7761772750071283 -1.9643977075156487 4.6276052507729419 0.74969117688318576 -1.9406133972851907 4.5106421016320706 0.723205078759243 -1.9168290870547329 4.3936789524912001 0.69671898063530047 -1.8930447768242749 4.2767158033503287 0.67023288251135771 -1.8692604665938168 4.7366244025250941 0.87108010362635779 -1.964676804518497 4.6196612533842236 0.84459400550241515 -1.9408924942880392 4.5026981042433523 0.8181079073784725 -1.9171081840575812 4.3857349551024809 0.79162180925452985 -1.8933238738271232 4.2687718059616095 0.7651357111305872 -1.8695395635966652 4.8309917736063763 -0.87545394858225045 -1.9835333303921789 4.7130954339481024 -0.85589685508763391 -1.9596991442526075 4.5951990942898284 -0.83633976159301726 -1.935864958113036 4.4773027546315545 -0.81678266809840094 -1.9120307719734646 4.3594064149732796 -0.7972255746037844 -1.8881965858338929 4.2415100753150057 -0.77766848110916786 -1.8643623996943215 4.8437435989471238 -0.76394111269986664 -1.983885160549089 4.7258472592888499 -0.7443840192052501 -1.9600509744095176 4.6079509196305759 -0.72482692571063345 -1.9362167882699461 4.490054579972302 -0.70526983221601713 -1.9123826021303747 4.372158240314028 -0.68571273872140059 -1.888548415990803 4.8564954242878713 -0.65242827681748272 -1.9842369907059991 4.7385990846295973 -0.63287118332286618 -1.9604028045664277 4.6207027449713234 -0.61331408982824964 -1.9365686184268562 4.5028064053130494 -0.59375699633363332 -1.9127344322872846 4.8692472496286188 -0.5409154409350988 -1.9845888208629092 4.7513509099703448 -0.52135834744048226 -1.9607546347233378 4.6334545703120709 -0.50180125394586583 -1.9369204485837663 4.5155582306537969 -0.4822441604512494 -1.9130862624441947 4.8819990749693662 -0.42940260505271499 -1.9849406510198193 4.7641027353110932 -0.40984551155809845 -1.9611064648802479 4.6462063956528183 -0.39028841806348208 -1.9372722787406762 4.8947509003101146 -0.31788976917033113 -1.9852924811767294 4.7768545606518407 -0.29833267567571459 -1.9614582950371577 4.9075027256508621 -0.20637693328794737 -1.9856443113336393 4.9202545509916105 -0.094864097405563591 -1.9859961414905494 4.2532940012828053 -0.67654672410533345 -1.8647252759658377 4.3845016311963176 -0.57858473332157845 -1.8889049073903621 4.2644851301183495 -0.58178906024216359 -1.8650949175119726 4.3956927600318618 -0.48382706945840853 -1.889274548936497 4.2756762589538937 -0.48703139637899368 -1.8654645590581076 4.5269003899453732 -0.38586507867465364 -1.9134541803610214 4.406883888867406 -0.38906940559523873 -1.889644190482632 4.2868673877894379 -0.39227373251582381 -1.8658342006042423 4.6581080198588856 -0.28790308789089863 -1.9376338117855461 4.5380915187809174 -0.29110741481148367 -1.9138238219071564 4.4180750177029502 -0.29431174173206881 -1.8900138320287667 4.2980585166249821 -0.2975160686526539 -1.8662038421503773 4.7893156497723988 -0.1899410971071436 -1.9618134432100705 4.6692991486944297 -0.19314542402772877 -1.9380034533316808 4.5492826476164616 -0.19634975094831381 -1.9141934634532911 4.4292661465384944 -0.199554077868899 -1.8903834735749017 4.3092496454605262 -0.20275840478948404 -1.866573483696512 4.8005067786079429 -0.095183433243973756 -1.9621830847562052 4.6804902775299739 -0.098387760164558927 -1.9383730948778155 4.5604737764520058 -0.10159208708514396 -1.9145631049994261 4.4404572753740386 -0.10479641400572914 -1.8907531151210364 4.3204407742960704 -0.1080007409263142 -1.8669431252426469 4.8116979074434871 -0.00042576938080377355 -1.9625527263023401 4.6916814063655181 -0.0036300963013889504 -1.9387427364239505 4.5716649052875509 -0.0068344232219740121 -1.9149327465455608 4.4516484042095819 -0.010038750142559187 -1.8911227566671713 4.3316319031316146 -0.013243077063144249 -1.8673127667887817 4.5402210556025002 -1.8263557967277713 -1.9798046744231326 4.4282658895406426 -1.7841278995199537 -1.9559411149251038 4.3163107234787841 -1.741900002312136 -1.932077555427075 4.2043555574169273 -1.6996721051043184 -1.9082139959290463 4.0924003913550688 -1.657444207896501 -1.8843504364310173 3.9804452252932117 -1.6152163106886834 -1.8604868769329885 4.5748750585167981 -1.7193153595668857 -1.980222335729434 4.4629198924549405 -1.6770874623590681 -1.9563587762314052 4.350964726393082 -1.6348595651512505 -1.9324952167333764 4.2390095603312252 -1.5926316679434329 -1.9086316572353474 4.1270543942693676 -1.5504037707356155 -1.8847680977373187 4.609529061431096 -1.6122749224060002 -1.9806399970357353 4.4975738953692384 -1.5700470251981826 -1.9567764375377066 4.3856187293073798 -1.527819127990365 -1.9329128780396776 4.2736635632455231 -1.4855912307825474 -1.9090493185416488 4.6441830643453939 -1.5052344852451147 -1.9810576583420367 4.5322278982835362 -1.4630065880372971 -1.9571940988440077 4.4202727322216777 -1.4207786908294795 -1.933330539345979 4.308317566159821 -1.3785507936216621 -1.90946697984795 4.6788370672596917 -1.3981940480842288 -1.9814753196483381 4.5668819011978341 -1.3559661508764114 -1.9576117601503091 4.4549267351359765 -1.3137382536685938 -1.9337482006522801 4.7134910701739896 -1.2911536109233432 -1.9818929809546393 4.601535904112132 -1.2489257137155259 -1.9580294214566103 4.7481450730882875 -1.1841131737624577 -1.9823106422609407 4.7827990760025854 -1.0770727366015722 -1.9827283035672418 4.0125204305421631 -1.5168572724671567 -1.8609149960067486 4.1608627200937924 -1.4462102650303157 -1.8851891885078504 4.0423822015318587 -1.4259496547618127 -1.8613520911940984 4.190724491083488 -1.3553026473249716 -1.8856262836952002 4.0722439725215542 -1.3350420370564686 -1.8617891863814482 4.3390667806351164 -1.2846556398881308 -1.9099004761963023 4.2205862620731835 -1.2643950296196276 -1.88606337888255 4.1021057435112498 -1.2441344193511246 -1.862226281568798 4.4874090701867448 -1.2140086324512898 -1.934174668697404 4.368928551624812 -1.1937480221827867 -1.9103375713836521 4.2504480330628791 -1.1734874119142835 -1.8865004740699001 4.1319675145009453 -1.1532268016457805 -1.862663376756148 4.6357513597383733 -1.1433616250144485 -1.9584488611985058 4.5172708411764404 -1.1231010147459457 -1.9346117638847538 4.3987903226145075 -1.1028404044774427 -1.9107746665710019 4.2803098040525738 -1.0825797942089395 -1.8869375692572499 4.1618292854906409 -1.0623191839404365 -1.8631004719434978 4.6656131307280688 -1.0524540073091044 -1.9588859563858556 4.547132612166136 -1.0321933970406016 -1.9350488590721038 4.4286520936042031 -1.0119327867720984 -1.9112117617583519 4.3101715750422693 -0.99167217650359529 -1.8873746644445999 4.1916910564803356 -0.97141156623509228 -1.8635375671308478 4.8139554202796973 -0.9818069998722635 -1.9831601488869575 4.6954749017177644 -0.96154638960376038 -1.9593230515732054 4.5769943831558315 -0.94128577933525737 -1.9354859542594536 4.4585138645938978 -0.92102516906675436 -1.9116488569457017 4.340033346031964 -0.90076455879825112 -1.8878117596319497 4.2215528274700311 -0.88050394852974811 -1.8639746623181976 4.1628961707280885 -2.7619676858970781 -1.9994814398178362 4.0612289659767669 -2.6985681645777353 -1.9755866455793858 3.9595617612254457 -2.6351686432583925 -1.9516918513409351 3.857894556474124 -2.5717691219390497 -1.9277970571024847 3.7562273517228024 -2.5083696006197069 -1.9039022628640343 4.2181863144406568 -2.6634982999660712 -1.9999498277172927 4.1165191096893352 -2.6000987786467284 -1.9760550334788423 4.0148519049380136 -2.5366992573273857 -1.9521602392403916 3.913184700186692 -2.4732997360080429 -1.9282654450019412 3.8115174954353703 -2.4099002146887001 -1.9043706507634908 3.7098502906840487 -2.3465006933693573 -1.8804758565250401 4.1718092534019036 -2.5016293927157216 -1.9765234213782987 4.070142048650581 -2.4382298713963788 -1.9526286271398481 3.9684748438992599 -2.374830350077036 -1.9287338329013977 3.8668076391479382 -2.3114308287576932 -1.9048390386629472 4.227099397114471 -2.4031600067847148 -1.9769918092777552 4.1254321923631494 -2.339760485465372 -1.9530970150393046 4.0237649876118278 -2.2763609641460292 -1.9292022208008541 3.9220977828605057 -2.2129614428266864 -1.9053074265624037 4.2823895408270385 -2.3046906208537079 -1.9774601971772117 4.1807223360757169 -2.2412910995343651 -1.953565402938761 4.0790551313243952 -2.1778915782150223 -1.9296706087003106 4.3376796845396068 -2.2062212349227011 -1.9779285850766681 4.2360124797882852 -2.1428217136033583 -1.9540337908382177 4.3929698282521752 -2.1077518489916938 -1.9783969729761246 4.4482599719647427 -2.0092824630606865 -1.9788653608755811 3.6046107954275497 -2.2898862131100146 -1.8565906497332072 3.7644220805629347 -2.2493957150222448 -1.8809461723693328 3.6520309681500467 -2.2063646810087132 -1.857080159354606 3.8118422532854321 -2.1658741829209429 -1.8814356819907319 3.6994511408725437 -2.1228431489074113 -1.8575696689760048 3.9716535384208171 -2.1253836848331735 -1.9057912046268577 3.8592624260079296 -2.0823526508196415 -1.8819251916121307 3.7468713135950407 -2.0393216168061099 -1.8580591785974037 4.131464823556203 -2.0848931867454037 -1.9301467272629833 4.0190737111433146 -2.0418621527318717 -1.9062807142482565 3.9066825987304266 -1.9988311187183401 -1.8824147012335297 3.7942914863175377 -1.9558000847048083 -1.8585486882188027 4.2912761086915889 -2.0444026886576339 -1.9545022498991091 4.1788849962787005 -2.0013716546441018 -1.9306362368843824 4.066493883865812 -1.95834062063057 -1.9067702238696556 3.9541027714529235 -1.9153095866170384 -1.8829042108549285 3.8417116590400351 -1.8722785526035066 -1.8590381978402015 4.3386962814140855 -1.9608811565563322 -1.954991759520508 4.226305169001197 -1.9178501225428002 -1.9311257465057814 4.1139140565883094 -1.8748190885292684 -1.9072597334910544 4.001522944175421 -1.8317880545157368 -1.8833937204763276 3.8891318317625321 -1.7887570205022052 -1.8595277074616006 4.4985075665494705 -1.9203906584685619 -1.9793472821566338 4.3861164541365829 -1.8773596244550304 -1.955481269141907 4.2737253417236936 -1.8343285904414985 -1.9316152561271802 4.161334229310806 -1.791297556427967 -1.9077492431124534 4.0489431168979184 -1.7482665224144351 -1.8838832300977264 3.9365520044850291 -1.7052354884009036 -1.8600172170829994 3.5743285423936895 -3.452113520433663 -1.9954163361679729 3.4869778793501203 -3.3698443560752791 -1.9714885258513009 3.3996272163065511 -3.2875751917168952 -1.9475607155346293 3.3122765532629823 -3.2053060273585112 -1.9236329052179573 3.2249258902194136 -3.1230368630001273 -1.8997050949012855 3.1375752271758448 -3.0407676986417433 -1.8757772845846135 3.6482828794247188 -3.3660123140834868 -1.9959251072327684 3.5609322163811497 -3.2837431497251028 -1.9719972969160964 3.4735815533375809 -3.2014739853667189 -1.9480694865994248 3.3862308902940121 -3.119204821008335 -1.9241416762827528 3.2988802272504429 -3.036935656649951 -1.900213865966081 3.2115295642068742 -2.9546664922915671 -1.876286055649409 3.7222372164557482 -3.2799111077333105 -1.9964338782975639 3.634886553412179 -3.1976419433749266 -1.9725060679808919 3.5475358903686107 -3.1153727790165426 -1.9485782576642203 3.4601852273250415 -3.0331036146581587 -1.9246504473475483 3.3728345642814728 -2.9508344502997748 -1.9007226370308765 3.7961915534867776 -3.1938099013831343 -1.9969426493623594 3.7088408904432089 -3.1115407370247503 -1.9730148390456874 3.6214902273996401 -3.0292715726663664 -1.9490870287290158 3.5341395643560714 -2.9470024083079824 -1.9251592184123438 3.8701458905178074 -3.1077086950329575 -1.997451420427155 3.7827952274742387 -3.0254395306745736 -1.9735236101104829 3.6954445644306699 -2.9431703663161897 -1.9495957997938111 3.9441002275488373 -3.0216074886827813 -1.9979601914919505 3.8567495645052681 -2.9393383243243969 -1.9740323811752785 3.7693989014616993 -2.857069159966013 -1.9501045708586067 4.0180545645798666 -2.9355062823326046 -1.998468962556746 3.9307039015362979 -2.8532371179742206 -1.974541152240074 4.092008901610896 -2.8494050759824283 -1.9989777336215413 3.0464598270107013 -2.9631488018251879 -1.8518574527408507 3.1097081106083957 -2.8902718953861015 -1.8523889127622775 3.274889961268229 -2.8816511013888317 -1.876817278072777 3.1729563942060901 -2.8173949889470151 -1.8529203727837043 3.4400718119280622 -2.873030307391562 -1.9012456433832765 3.3381382448659234 -2.8087741949497453 -1.8773487380942038 3.2362046778037845 -2.7445180825079287 -1.853451832805131 3.605253662587895 -2.8644095133942926 -1.9256740086937758 3.5033200955257566 -2.8001534009524756 -1.9017771034047033 3.4013865284636178 -2.7358972885106589 -1.8778801981156306 3.2994529614014789 -2.6716411760688423 -1.8539832928265578 3.6685019461855894 -2.7915326069552062 -1.9262054687152026 3.566568379123451 -2.7272764945133892 -1.9023085634261301 3.4646348120613122 -2.6630203820715725 -1.8784116581370573 3.3627012449991733 -2.5987642696297559 -1.8545147528479846 3.8336837968454232 -2.7829118129579364 -1.9506338340257021 3.7317502297832839 -2.7186557005161198 -1.9267369287366294 3.6298166627211454 -2.6543995880743028 -1.9028400234475569 3.5278830956590066 -2.5901434756324861 -1.8789431181584841 3.4259495285968677 -2.5258873631906695 -1.8550462128694114 3.998865647505256 -2.7742910189606671 -1.9750621993362014 3.8969320804431176 -2.71003490651885 -1.9511652940471289 3.7949985133809787 -2.6457787940770334 -1.9272683887580562 3.6930649463188399 -2.5815226816352164 -1.9033714834689837 3.591131379256701 -2.5172665691933998 -1.8794745781799109 3.4891978121945626 -2.4530104567515831 -1.8555776728908382 3.6543796628543959 -2.4443896627543134 -1.8800060382013377 3.552446095792257 -2.3801335503124963 -1.856109132912265 2.7800662049567526 -4.0944357083014555 -1.9905605718195307 2.7106658485001582 -3.9963048759294173 -1.9665989230413725 2.6412654920435639 -3.8981740435573795 -1.9426372742632148 2.5718651355869691 -3.8000432111853413 -1.9186756254850568 2.5024647791303747 -3.701912378813303 -1.894713976706899 2.4330644226737799 -3.6037815464412648 -1.870752327928741 2.870109091862644 -4.0240444966123547 -1.9911021247031557 2.8007087354060496 -3.9259136642403165 -1.9671404759249975 2.7313083789494552 -3.8277828318682787 -1.9431788271468398 2.6619080224928604 -3.7296519994962405 -1.9192171783686818 2.592507666036266 -3.6315211671242023 -1.895255529590524 2.5231073095796712 -3.533390334752164 -1.871293880812366 2.9601519787685353 -3.9536532849232544 -1.9916436775867807 2.8907516223119409 -3.8555224525512162 -1.9676820288086225 2.8213512658553466 -3.7573916201791779 -1.9437203800304648 2.7519509093987518 -3.6592607878071401 -1.9197587312523068 2.6825505529421574 -3.5611299554351019 -1.895797082474149 3.0501948656744271 -3.8832620732341541 -1.9921852304704057 2.9807945092178323 -3.7851312408621158 -1.9682235816922475 2.9113941527612379 -3.6870004084900776 -1.9442619329140896 2.8419937963046435 -3.5888695761180394 -1.9203002841359318 3.1402377525803189 -3.8128708615450533 -1.9927267833540305 3.0708373961237236 -3.714740029173015 -1.9687651345758725 3.0014370396671297 -3.6166091968009768 -1.9448034857977146 3.2302806394862102 -3.7424796498559529 -1.9932683362376555 3.1608802830296154 -3.6443488174839147 -1.9693066874594973 3.0914799265730211 -3.5462179851118765 -1.9453450386813393 3.320323526392102 -3.6720884381668522 -1.9938098891212803 3.2509231699355068 -3.5739576057948139 -1.9698482403431223 3.4103664132979934 -3.6016972264777518 -1.9943514420049053 2.6018047097341688 -3.4724405798762108 -1.8718555899144154 2.5143642393470449 -3.3893223212536787 -1.8479259909270467 2.766028242310556 -3.4962021522694307 -1.8963502989874148 2.6785877719234321 -3.4130838936468986 -1.8724207000000461 2.5911473015363082 -3.3299656350243665 -1.8484911010126774 2.9302517748869428 -3.5199637246626505 -1.9208450080604142 2.8428113044998193 -3.4368454660401184 -1.8969154090730456 2.7553708341126955 -3.3537272074175863 -1.8729858100856769 2.6679303637255716 -3.2706089487950543 -1.8490562110983082 3.0070348370762057 -3.4606070384333383 -1.921410118146045 2.9195943666890827 -3.3774887798108066 -1.8974805191586763 2.8321538963019588 -3.2943705211882746 -1.8735509201713076 2.7447134259148349 -3.2112522625657425 -1.849621321183939 3.1712583696525929 -3.4843686108265581 -1.9459048272190442 3.083817899265469 -3.4012503522040261 -1.9219752282316758 2.996377428878346 -3.3181320935814944 -1.8980456292443071 2.9089369584912221 -3.2350138349589623 -1.8741160302569384 2.8214964881040983 -3.1518955763364302 -1.8501864312695697 3.3354819022289797 -3.508130183219778 -1.9703995362920439 3.2480414318418562 -3.4250119245972459 -1.946469937304675 3.1606009614547323 -3.3418936659747143 -1.9225403383173065 3.0731604910676089 -3.2587754073521826 -1.8986107393299378 2.985720020680485 -3.1756571487296505 -1.8746811403425692 2.8982795502933612 -3.0925388901071185 -1.8507515413552005 3.4997054348053673 -3.5318917556129978 -1.9948942453650431 3.412264964418243 -3.4487734969904658 -1.9709646463776744 3.3248244940311196 -3.3656552383679337 -1.947035047390306 3.2373840236439952 -3.282536979745402 -1.9231054484029373 3.1499435532568718 -3.1994187211228704 -1.8991758494155686 3.0625030828697479 -3.1163004625003383 -1.8752462504281999 2.975062612482624 -3.0331822038778062 -1.8513166514408312 1.9689986074746471 -4.5103670856922067 -1.9860176626586352 1.9206754761286848 -4.4000748203430913 -1.9620229983062207 1.8723523447827226 -4.2897825549939768 -1.9380283339538065 1.8240292134367606 -4.1794902896448622 -1.9140336696013924 1.7757060820907984 -4.0691980242957477 -1.8900390052489782 1.7273829507448359 -3.9589057589466332 -1.8660443408965641 2.071980102620107 -4.4585405099224404 -1.9865849436800496 2.023656971274145 -4.348248244573325 -1.9625902793276351 1.9753338399281828 -4.2379559792242105 -1.9385956149752208 1.9270107085822208 -4.127663713875096 -1.9146009506228068 1.8786875772362586 -4.0173714485259815 -1.8906062862703925 2.1749615977655674 -4.4067139341526742 -1.9871522247014639 2.126638466419605 -4.2964216688035588 -1.9631575603490494 2.078315335073643 -4.1861294034544443 -1.9391628959966352 2.029992203727681 -4.0758371381053298 -1.9151682316442211 2.2779430929110278 -4.354887358382908 -1.9877195057228783 2.2296199615650654 -4.2445950930337926 -1.9637248413704638 2.1812968302191034 -4.134302827684678 -1.9397301770180495 2.1329736988731414 -4.0240105623355635 -1.9157355126656355 2.3809245880564882 -4.3030607826131417 -1.9882867867442926 2.3326014567105258 -4.1927685172640263 -1.9642921223918781 2.2842783253645638 -4.0824762519149118 -1.9402974580394641 2.4839060832019482 -4.2512342068433755 -1.9888540677657069 2.4355829518559857 -4.1409419414942601 -1.9648594034132925 2.5868875783474081 -4.1994076310736084 -1.9894213487871213 2.6898690734928685 -4.1475810553038421 -1.9899886298085354 1.8199420628909715 -3.9127391330566175 -1.8666273226483321 1.9767949928842425 -3.968191776604157 -1.8911809098168242 1.907465069548326 -3.8693074003918349 -1.8672178910081068 2.064317999541597 -3.9247600439393744 -1.8917714781765989 1.9949880762056806 -3.8258756677270522 -1.8678084593678814 2.2211709295348685 -3.9802126874869139 -1.9163250653450912 2.1518410061989517 -3.8813283112745913 -1.8923620465363735 2.0825110828630353 -3.7824439350622692 -1.8683990277276561 2.3780238595281391 -4.035665331034453 -1.9408786525135833 2.3086939361922232 -3.9367809548221309 -1.9169156337048658 2.2393640128563064 -3.8378965786098087 -1.8929526148961482 2.17003408952039 -3.7390122023974866 -1.8689895960874308 2.5348767895214106 -4.0911179745819926 -1.9654322396820754 2.4655468661854938 -3.9922335983696704 -1.9414692208733579 2.3962169428495779 -3.8933492221573478 -1.9175062020646405 2.3268870195136611 -3.7944648459450256 -1.8935431832559229 2.2575570961777447 -3.6955804697327035 -1.8695801644472057 2.6223997961787648 -4.0476862419172095 -1.96602280804185 2.5530698728428485 -3.9488018657048873 -1.9420597892331326 2.4837399495069321 -3.8499174894925652 -1.9180967704244152 2.4144100261710157 -3.751033113280243 -1.8941337516156977 2.3450801028350989 -3.6521487370679209 -1.8701707328069803 0.9787198078289242 -4.8022481286054406 -1.9807417946575041 0.9542884073596013 -4.6840626532110416 -1.9567191380028552 0.9298570068902785 -4.5658771778166418 -1.9326964813482064 0.90542560642095571 -4.4476917024222438 -1.9086738246935577 0.88099420595163291 -4.3295062270278457 -1.8846511680389089 0.85656280548231001 -4.2113207516334477 -1.86062851138426 1.0912188951443369 -4.771185921523962 -1.9813278440932076 1.066787494675014 -4.6530004461295631 -1.9573051874385587 1.0423560942056913 -4.5348149707351633 -1.9332825307839099 1.0179246937363684 -4.4166294953407652 -1.9092598741292612 0.99349329326704572 -4.2984440199463672 -1.8852372174746124 1.2037179824597497 -4.7401237144424835 -1.9819138935289111 1.1792865819904268 -4.6219382390480845 -1.9578912368742623 1.1548551815211041 -4.5037527636536847 -1.9338685802196134 1.1304237810517812 -4.3855672882592875 -1.9098459235649647 1.3162170697751625 -4.7090615073610049 -1.9824999429646146 1.2917856693058396 -4.590876031966606 -1.9584772863099658 1.2673542688365169 -4.472690556572207 -1.9344546296553169 1.242922868367194 -4.354505081177809 -1.910431973000668 1.4287161570905753 -4.6779993002795264 -1.9830859924003181 1.4042847566212524 -4.5598138248851274 -1.9590633357456693 1.3798533561519297 -4.4416283494907285 -1.9350406790910204 1.5412152444059881 -4.6469370931980478 -1.9836720418360216 1.5167838439366654 -4.5287516178036489 -1.9596493851813728 1.6537143317214011 -4.6158748861165693 -1.9842580912717251 1.6292829312520785 -4.4976894107221703 -1.9602354346170761 1.7662134190368139 -4.5848126790350907 -1.9848441407074284 0.96151144206103778 -4.1825941603677315 -1.8612232083695712 1.1047012445957192 -4.2677812059257931 -1.8858247456515043 1.0565465926984747 -4.1569341535168132 -1.8618292592944616 1.1997363952331561 -4.2421211990748748 -1.8864307965763947 1.1515817433359117 -4.1312741466658949 -1.862435310219352 1.3429261977678371 -4.3273082446329356 -1.9110323338583277 1.2947715458705931 -4.2164611922239565 -1.8870368475012851 1.2466168939733484 -4.1056141398149766 -1.8630413611442427 1.486116000302518 -4.4124952901909973 -1.935633871140261 1.437961348405274 -4.3016482377820173 -1.9116383847832181 1.3898066965080298 -4.1908011853730374 -1.8876428984261757 1.3416520446107851 -4.0799541329640574 -1.8636474120691331 1.581151150939955 -4.386835283340079 -1.9362399220651514 1.532996499042711 -4.2759882309310981 -1.9122444357081088 1.4848418471454665 -4.1651411785221191 -1.8882489493510661 1.4366871952482221 -4.0542941261131391 -1.8642534629940237 1.7243409534746361 -4.4720223288981407 -1.9608414593470844 1.6761863015773919 -4.3611752764891607 -1.9368459729900418 1.6280316496801477 -4.2503282240801799 -1.9128504866329992 1.5798769977829032 -4.1394811716711999 -1.8888550002759568 1.5317223458856588 -4.0286341192622199 -1.8648595139189141 1.8675307560093175 -4.5572093744562023 -1.9854429966290175 1.8193761041120731 -4.4463623220472224 -1.9614475102719751 1.7712214522148286 -4.3355152696382424 -1.9374520239149322 1.7230668003175844 -4.2246682172292616 -1.9134565375578898 1.6749121484203402 -4.1138211648202816 -1.8894610512008472 1.6267574965230955 -4.0029741124113016 -1.8654655648438048 0.05850844143493461 -4.8734825679636851 -1.9759803662115356 0.059949370411258474 -4.7524710262893963 -1.9519379034443827 0.061390299387582448 -4.6314594846151094 -1.9278954406772302 0.062831228363906311 -4.5104479429408206 -1.9038529779100772 0.064272157340230313 -4.3894364012665319 -1.8798105151429247 0.17627815733658436 -4.8648663273685608 -1.9765737345332246 0.17771908631290823 -4.7438547856942721 -1.9525312717660719 0.1791600152892322 -4.6228432440199851 -1.9284888089989194 0.18060094426555609 -4.5018317023456964 -1.9044463462317665 0.18204187324188009 -4.3808201606714086 -1.8804038834646137 0.29404787323823411 -4.8562500867734366 -1.9771671028549136 0.29548880221455798 -4.7352385450991479 -1.9531246400877609 0.29692973119088195 -4.6142270034248609 -1.9290821773206084 0.29837066016720587 -4.4932154617505722 -1.9050397145534557 0.41181758913988387 -4.8476338461783124 -1.9777604711766028 0.41325851811620778 -4.7266223045040237 -1.9537180084094501 0.4146994470925317 -4.6056107628297358 -1.9296755456422976 0.52958730504153384 -4.8390176055831882 -1.9783538394982918 0.53102823401785781 -4.7180060639088994 -1.9543113767311391 0.64735702094318359 -4.8304013649880639 -1.978947207819981 0.64879794991950768 -4.7093898233137752 -1.9549047450528283 0.76512673684483334 -4.8217851243929397 -1.97954057614167 0.063327276505363295 -4.2686689824934234 -1.855769870662511 0.16221097900757075 -4.261985212944885 -1.8563776324985362 0.28542020764223808 -4.3736764874987148 -1.8810082198265965 0.2610946815097781 -4.2553014433963465 -1.8569853943345613 0.40862943627690551 -4.4853677620525447 -1.9056388071546571 0.38430391014444548 -4.3669927179501764 -1.8816159816626217 0.35997838401198551 -4.2486176738478081 -1.8575931561705865 0.53183866491157272 -4.5970590366063746 -1.9302693944827174 0.50751313877911286 -4.4786839925040063 -1.9062465689906822 0.48318761264665289 -4.360308948401638 -1.8822237434986469 0.45886208651419291 -4.2419339042992696 -1.8582009180066117 0.63072236741378007 -4.5903752670578362 -1.9308771563187426 0.60639684128132032 -4.4720002229554678 -1.9068543308267074 0.58207131514886024 -4.3536251788530995 -1.882831505334672 0.55774578901640026 -4.2352501347507312 -1.8588086798426369 0.75393159604844739 -4.702066541611666 -1.9555077436468029 0.72960606991598742 -4.5836914975092977 -1.9314849181547677 0.70528054378352767 -4.4653164534069294 -1.9074620926627326 0.6809550176510677 -4.3469414093045611 -1.8834392671706972 0.65662949151860772 -4.2285663652021928 -1.859416441678662 0.87714082468311461 -4.8137578161654959 -1.9801383309748632 0.85281529855065474 -4.6953827720631276 -1.9561155054828281 0.82848977241819477 -4.5770077279607593 -1.9320926799907929 0.80416424628573502 -4.458632683858391 -1.9080698544987578 0.77983872015327504 -4.3402576397560226 -1.8840470290067226 0.75551319402081507 -4.2218825956536543 -1.8600242035146874 -0.68912516259884371 -3.5685281634961306 -1.4480331770538342 -0.71363981341799632 -3.6677057225572316 -1.5159148089153556 -0.73815446423714892 -3.7668832816183331 -1.583796440776877 -0.76266911505630142 -3.8660608406794341 -1.6516780726383986 -0.78718376587545402 -3.9652383997405356 -1.7195597044999202 -0.71352639662948902 -4.0765871803884197 -1.7891132005374188 -0.68901174581033631 -3.9774096213273182 -1.7212315686758974 -0.6644970949911837 -3.8782320622662168 -1.6533499368143758 -0.63998244417203121 -3.7790545032051157 -1.5854683049528542 -0.61546779335287871 -3.6798769441440142 -1.5175866730913328 -0.61535437656437142 -4.0887584019752019 -1.790785064713396 -0.5908397257452187 -3.9895808429141009 -1.7229034328518746 -0.5663250749260661 -3.8904032838529994 -1.655021800990353 -0.5418104241069136 -3.7912257247918983 -1.5871401691288314 -0.51718235649925381 -4.100929623561985 -1.7924569288893732 -0.49266770568010099 -4.0017520645008835 -1.7245752970278518 -0.46815305486094849 -3.902574505439782 -1.6566936651663302 -0.44363840404179594 -3.803396946378681 -1.5888120333048086 -0.4190103364341361 -4.1131008451487672 -1.7941287930653504 -0.39449568561498338 -4.0139232860876666 -1.726247161203829 -0.36998103479583083 -3.9147457270265646 -1.6583655293423074 -0.32083831636901849 -4.1252720667355502 -1.7958006572413276 -0.29632366554986578 -4.0260945076744488 -1.7279190253798062 -0.22266629630390078 -4.1374432883223324 -1.7974725214173048 -0.19815164548474812 -4.0382657292612318 -1.7295908895557832 -0.12449427623878315 -4.1496145099091155 -1.799144385593282 -0.5999266779643182 -3.5797876536169477 -1.4496863887770228 -0.51952641334618932 -3.6918215276630875 -1.519253900643462 -0.5184450731994964 -3.590263091314871 -1.4513235601403605 -0.43804480858136752 -3.7022969653610107 -1.5208910720067996 -0.43696346843467465 -3.6007385290127942 -1.4529607315036981 -0.35764454396323864 -3.8143308394071505 -1.5904585838732388 -0.35656320381654572 -3.712772403058934 -1.5225282433701373 -0.35548186366985285 -3.6112139667107175 -1.4545979028670357 -0.27724427934510976 -3.9263647134532902 -1.660026095739678 -0.27616293919841689 -3.8248062771050737 -1.5920957552365764 -0.27508159905172397 -3.7232478407568572 -1.5241654147334749 -0.2740002589050311 -3.6216894044086407 -1.4562350742303733 -0.1957626745802879 -3.9368401511512134 -1.6616632671030156 -0.19468133443359506 -3.835281714802997 -1.5937329265999141 -0.19359999428690211 -3.7337232784547805 -1.5258025860968125 -0.19251865414020924 -3.632164842106564 -1.457872245593711 -0.11536240996215912 -4.0488740251973532 -1.731230778969455 -0.11428106981546614 -3.9473155888491362 -1.6633004384663532 -0.1131997296687733 -3.8457571525009198 -1.5953700979632519 -0.11211838952208036 -3.7441987161527033 -1.5274397574601504 -0.11103704937538748 -3.6426402798044872 -1.4595094169570486 -0.034962145344030277 -4.1609078992434929 -1.8007982908358942 -0.033880805197337376 -4.059349462895276 -1.7328679503327926 -0.032799465050644398 -3.9577910265470595 -1.6649376098296911 -0.031718124903951525 -3.856232590198843 -1.5970072693265895 -0.030636784757258624 -3.7546741538506265 -1.529076928823488 -0.02955544461056574 -3.65311571750241 -1.4611465883203865 -1.589897424118339 -3.9136806210552995 -1.8426828495879866 -1.5432431529197206 -3.8222915359600784 -1.7748723377762272 -1.4965888817211019 -3.7309024508648578 -1.7070618259644674 -1.4499346105224833 -3.6395133657696372 -1.6392513141527079 -1.4032803393238651 -3.5481242806744162 -1.5714408023409483 -1.3566260681252467 -3.4567351955791956 -1.5036302905291887 -1.4959609472452293 -3.9446348673076739 -1.8442627127532967 -1.4493066760466109 -3.8532457822124528 -1.7764522009415373 -1.4026524048479923 -3.7618566971172323 -1.7086416891297775 -1.3559981336493736 -3.6704676120220117 -1.640831177318018 -1.3093438624507554 -3.5790785269267906 -1.5730206655062584 -1.262689591252137 -3.48768944183157 -1.5052101536944988 -1.4020244703721194 -3.9755891135600483 -1.8458425759186068 -1.355370199173501 -3.8842000284648273 -1.7780320641068474 -1.3087159279748826 -3.7928109433696067 -1.7102215522950877 -1.2620616567762639 -3.7014218582743856 -1.6424110404833281 -1.2154073855776457 -3.610032773179165 -1.5746005286715685 -1.3080879934990097 -4.0065433598124223 -1.8474224390839169 -1.2614337223003913 -3.9151542747172017 -1.7796119272721576 -1.2147794511017729 -3.8237651896219811 -1.7118014154603978 -1.1681251799031542 -3.7323761045267601 -1.6439909036486382 -1.1674972454272814 -3.9461085209695761 -1.7811917904374677 -1.120842974228663 -3.8547194358743551 -1.7133812786257079 -1.0735607685541715 -3.9770627672219501 -1.7827716536027778 -1.0269064973555531 -3.8856736821267295 -1.714961141791018 -0.9796242916810618 -4.0080170134743245 -1.7843515167680879 -1.3161015121227391 -3.3634544415677445 -1.4357990643981975 -1.2382521987869408 -3.3894440873060274 -1.4373245637586032 -1.1839504219677872 -3.5139537027491787 -1.5067386601701778 -1.1604028854511426 -3.4154337330443103 -1.4388500631190086 -1.1296486451486336 -3.63846331819233 -1.5761527565817526 -1.106101108631989 -3.5399433484874616 -1.5082641595305835 -1.0825535721153443 -3.4414233787825932 -1.4403755624794143 -1.0753468683294802 -3.7629729336354814 -1.6455668529933272 -1.0517993318128354 -3.6644529639306129 -1.577678255942158 -1.0282517952961907 -3.5659329942257445 -1.5097896588909889 -1.0047042587795461 -3.4674130245208756 -1.4419010618398198 -0.99749755499368198 -3.7889625793737642 -1.6470923523537329 -0.97395001847703722 -3.6904426096688954 -1.5792037553025637 -0.95040248196039256 -3.5919226399640269 -1.5113151582513946 -0.92685494544374791 -3.4934026702591585 -1.4434265612002255 -0.94319577817452849 -3.9134721948169156 -1.7165064487653077 -0.91964824165788384 -3.8149522251120471 -1.6486178517141383 -0.89610070514123907 -3.7164322554071783 -1.5807292546629692 -0.87255316862459442 -3.6179122857023098 -1.5128406576118001 -0.84900563210794977 -3.519392315997441 -1.444952060560631 -0.88889400135537489 -4.0379818102600673 -1.7859205451768825 -0.86534646483873034 -3.9394618405551984 -1.7180319481257134 -0.84179892832208558 -3.8409418708503296 -1.650143351074544 -0.81825139180544093 -3.7424219011454607 -1.5822547540233749 -0.79470385528879628 -3.6439019314405923 -1.5143661569722058 -0.77115631877215163 -3.5453819617357238 -1.4464775599210367 -0.81104468801957674 -4.0639714559983497 -1.7874460445372882 -2.0316312331097621 -3.0893029245367361 -1.4905573520634499 -2.0976360184051299 -3.1684387634496916 -1.558306830998069 -2.1636408037004968 -3.2475746023626471 -1.6260563099326879 -2.2759915251799905 -3.5332764252382991 -1.8307887127610456 -2.2099867398846227 -3.4541405863253436 -1.7630392338264265 -2.1439819545892558 -3.3750047474123885 -1.6952897548918073 -2.077977169293888 -3.295868908499433 -1.6275402759571884 -2.0119723839985206 -3.2167330695864775 -1.5597907970225695 -1.9459675987031528 -3.137597230673522 -1.4920413180879504 -2.1903278907733816 -3.5815707313750851 -1.8322726787855461 -2.1243231054780138 -3.5024348924621296 -1.764523199850927 -2.0583183201826469 -3.4232990535491745 -1.6967737209163078 -1.9923135348872791 -3.344163214636219 -1.6290242419816889 -1.9263087495919116 -3.2650273757232631 -1.56127476304707 -2.1046642563667728 -3.6298650375118711 -1.8337566448100466 -2.038659471071405 -3.5507291985989156 -1.7660071658754275 -1.9726546857760379 -3.4715933596859605 -1.6982576869408084 -1.9066499004806703 -3.3924575207730046 -1.6305082080061892 -2.0190006219601639 -3.678159343648657 -1.8352406108345469 -1.9529958366647961 -3.5990235047357015 -1.7674911318999278 -1.8869910513694288 -3.519887665822746 -1.6997416529653089 -1.8209862660740612 -3.4407518269097905 -1.6319921740306897 -1.9333369875535551 -3.726453649785443 -1.8367245768590474 -1.8673322022581873 -3.6473178108724875 -1.7689750979244283 -1.8013274169628197 -3.568181971959532 -1.7012256189898094 -1.847673353146946 -3.774747955922229 -1.8382085428835477 -1.7816685678515782 -3.6956121170092735 -1.7704590639489286 -1.762009718740337 -3.8230422620590145 -1.8396925089080483 -1.6960049334449692 -3.743906423146059 -1.7719430299734291 -1.6763460843337279 -3.8713365681958005 -1.8411764749325485 -1.9689039961317638 -3.0083961514560729 -1.4227965941388188 -1.8976744676415542 -3.0488913806998648 -1.4242308882376298 -1.8712275619350902 -3.1799892676691099 -1.4934876928592546 -1.8264449391513444 -3.0893866099436567 -1.4256651823364408 -1.8447806562286266 -3.3110871546383547 -1.5627444974808795 -1.7999980334448804 -3.2204844969129018 -1.4949219869580657 -1.7552154106611346 -3.1298818391874486 -1.4270994764352518 -1.7735511277384168 -3.3515823838821466 -1.5641787915796905 -1.7287685049546706 -3.2609797261566937 -1.4963562810568767 -1.6839858821709248 -3.1703770684312405 -1.4285337705340628 -1.747104222031953 -3.4826802708513918 -1.6334355962013154 -1.702321599248207 -3.3920776131259385 -1.5656130856785015 -1.657538976464461 -3.3014749554004856 -1.4977905751556877 -1.612756353680715 -3.2108722976750323 -1.4299680646328741 -1.7206573163254892 -3.6137781578206369 -1.7026924008229403 -1.6758746935417432 -3.5231755000951837 -1.6348698903001264 -1.6310920707579972 -3.4325728423697304 -1.5670473797773128 -1.5863094479742512 -3.3419701846442775 -1.4992248692544989 -1.5415268251905052 -3.2513675269188242 -1.4314023587316851 -1.6494277878352794 -3.6542733870644284 -1.7041266949217513 -1.6046451650515334 -3.5636707293389756 -1.6363041843989377 -1.5598625422677874 -3.4730680716135223 -1.5684816738761238 -1.5150799194840414 -3.382465413888069 -1.50065916335331 -1.4702972967002956 -3.2918627561626157 -1.4328366528304963 -1.6229808821288159 -3.7853712740336731 -1.7733834995433762 -1.5781982593450696 -3.6947686163082203 -1.7055609890205625 -1.5334156365613236 -3.604165958582767 -1.6377384784977487 -1.4886330137775776 -3.5135633008573137 -1.569915967974935 -1.4438503909938318 -3.4229606431318604 -1.5020934574521212 -1.3990677682100858 -3.3323579854064076 -1.4342709469293073 -2.9467371950179455 -2.9762807253646888 -1.8181123324271435 -2.865038683865599 -2.9128717949405298 -1.750403988640848 -2.783340172713253 -2.8494628645163713 -1.6826956448545527 -2.7016416615609065 -2.7860539340922128 -1.6149873010682576 -2.6199431504085604 -2.7226450036680543 -1.5472789572819623 -2.5382446392562139 -2.6592360732438953 -1.4795706134956672 -2.8726330702472094 -3.0398006695628186 -1.8195158660017603 -2.7909345590948633 -2.9763917391386596 -1.7518075222154648 -2.7092360479425173 -2.9129828087145011 -1.6840991784291697 -2.6275375367901708 -2.8495738782903426 -1.6163908346428744 -2.5458390256378243 -2.7861649478661836 -1.5486824908565793 -2.7985289454764737 -3.1033206137609484 -1.8209193995763771 -2.7168304343241276 -3.0399116833367894 -1.7532110557900817 -2.6351319231717816 -2.9765027529126309 -1.6855027120037864 -2.5534334120194346 -2.9130938224884719 -1.6177943682174913 -2.724424820705738 -3.1668405579590782 -1.8223229331509938 -2.6427263095533919 -3.1034316275349192 -1.7546145893646985 -2.5610277984010454 -3.0400226971107607 -1.6869062455784034 -2.4793292872486989 -2.9766137666866017 -1.6191979017921081 -2.6503206959350019 -3.2303605021572079 -1.8237264667256106 -2.5686221847826558 -3.166951571733049 -1.7560181229393155 -2.4869236736303093 -3.1035426413088905 -1.6883097791530202 -2.5762165711642657 -3.2938804463553377 -1.8251300003002275 -2.4945180600119201 -3.2304715159311788 -1.7574216565139322 -2.50211244639353 -3.3574003905534671 -1.8265335338748443 -2.420413935241184 -3.2939914601293081 -1.7588251900885492 -2.4280083216227943 -3.4209203347515968 -1.8279370674494613 -2.4713315678657048 -2.7168136022158036 -1.4809529350824704 -2.4728126805560802 -2.8487942555892749 -1.5500828452238644 -2.4094558949887444 -2.7702284150952727 -1.482320397478244 -2.3460991094214081 -2.6916625746012697 -1.4145579497326237 -2.4109370076791197 -2.902209068468744 -1.551450307619638 -2.3475802221117839 -2.8236432279747419 -1.4836878598740175 -2.2842234365444476 -2.7450773874807388 -1.4159254121283973 -2.412418120369495 -3.0341897218422158 -1.620580217761032 -2.3490613348021592 -2.9556238813482132 -1.5528177700154118 -2.2857045492348229 -2.877058040854211 -1.4850553222697913 -2.2223477636674867 -2.798492200360208 -1.4172928745241709 -2.4138992330598703 -3.166170375215688 -1.689710127902426 -2.3505424474925345 -3.0876045347216849 -1.6219476801568056 -2.2871856619251987 -3.0090386942276823 -1.5541852324111853 -2.2238288763578624 -2.9304728537336802 -1.4864227846655649 -2.1604720907905262 -2.8519070132396771 -1.4186603369199446 -2.3520235601829098 -3.2195851880951571 -1.6910775902981996 -2.2886667746155736 -3.1410193476011541 -1.6233151425525791 -2.2253099890482382 -3.0624535071071515 -1.5555526948069591 -2.1619532034809019 -2.9838876666131493 -1.4877902470613387 -2.0985964179135657 -2.9053218261191462 -1.4200277993157182 -2.3535046728732851 -3.3515658414686289 -1.7602075004395936 -2.2901478873059493 -3.2730000009746263 -1.6924450526939734 -2.2267911017386131 -3.1944341604806232 -1.6246826049483529 -2.1634343161712772 -3.1158683199866206 -1.5569201572027327 -2.100077530603941 -3.0373024794926184 -1.4891577094571122 -2.0367207450366047 -2.9587366389986158 -1.421395261711492 -2.3549857855636604 -3.4835464948421007 -1.8293374105809876 -2.2916289999963242 -3.404980654348098 -1.7615749628353672 -2.2282722144289884 -3.3264148138540954 -1.693812515089747 -3.0162866193955904 -2.0752008392855106 -1.4676543505767803 -3.1096137446204679 -2.1203908254325001 -1.5353400773565058 -3.2029408698453454 -2.1655808115794901 -1.6030258041362311 -3.2962679950702229 -2.2107707977264797 -1.6707115309159566 -3.423022491583267 -2.3772767007670188 -1.8074195255945347 -3.3296953663583895 -2.3320867146200293 -1.7397337988148092 -3.236368241133512 -2.2868967284730393 -1.6720480720350839 -3.1430411159086344 -2.2417067423260497 -1.6043623452553584 -3.0497139906837569 -2.1965167561790597 -1.5366766184756331 -3.363122737646556 -2.4534026315135784 -1.808756066713662 -3.2697956124216785 -2.4082126453665884 -1.7410703399339365 -3.176468487196801 -2.3630226592195989 -1.6733846131542112 -3.0831413619719235 -2.3178326730726089 -1.6056988863744857 -2.9898142367470459 -2.2726426869256193 -1.5380131595947604 -3.303222983709845 -2.529528562260138 -1.8100926078327892 -3.2098958584849675 -2.484338576113148 -1.7424068810530637 -3.11656873326009 -2.4391485899661585 -1.6747211542733385 -3.0232416080352125 -2.3939586038191685 -1.6070354274936129 -3.243323229773134 -2.6056544930066972 -1.8114291489519165 -3.1499961045482565 -2.5604645068597076 -1.743743422172191 -3.056668979323379 -2.5152745207127176 -1.6760576953924657 -3.183423475836423 -2.6817804237532568 -1.8127656900710438 -3.0900963506115455 -2.6365904376062668 -1.7450799632913183 -2.996769225386668 -2.5914004514592772 -1.677394236511593 -3.1235237218997121 -2.7579063544998164 -1.8141022311901711 -3.0301965966748345 -2.7127163683528264 -1.7464165044104456 -3.0636239679630011 -2.8340322852463755 -1.8154387723092982 -3.0037242140262905 -2.9101582159929347 -1.8167753134284255 -2.9607182725780512 -2.146025220931989 -1.4689807908687438 -2.9105381500883554 -2.2102545319581441 -1.4702946658392866 -2.9388771532384368 -2.3377985019487904 -1.5393287997959111 -2.8603580275986595 -2.2744838429842993 -1.4716085408098292 -2.9672161563885178 -2.4653424719394361 -1.6083629337525354 -2.888697030748741 -2.4020278129749455 -1.5406426747664537 -2.8101779051089637 -2.338713154010454 -1.472922415780372 -2.9170360338988219 -2.5295717829655913 -1.6096768087230779 -2.8385169082590451 -2.4662571240011002 -1.5419565497369963 -2.7599977826192679 -2.4029424650366087 -1.4742362907509146 -2.9453750370489034 -2.6571157529562379 -1.6787109426797027 -2.8668559114091261 -2.5938010939917464 -1.6109906836936208 -2.7883367857693493 -2.5304864350272553 -1.5432704247075391 -2.709817660129572 -2.4671717760627638 -1.4755501657214574 -2.9737140401989843 -2.7846597229468837 -1.7477450766363272 -2.8951949145592075 -2.7213450639823926 -1.6800248176502453 -2.8166757889194303 -2.6580304050179011 -1.6123045586641633 -2.7381566632796535 -2.59471574605341 -1.5445842996780816 -2.6596375376398762 -2.5314010870889185 -1.4768640406919999 -2.9235339177092885 -2.8488890339730388 -1.7490589516068697 -2.8450147920695117 -2.7855743750085478 -1.6813386926207881 -2.7664956664297344 -2.7222597160440563 -1.6136184336347061 -2.6879765407899576 -2.6589450570795652 -1.5458981746486244 -2.6094574151501804 -2.5956303981150737 -1.4781779156625428 -3.3627147622165969 -1.4117223785521849 -1.4562513730475684 -3.4634505646520761 -1.4370900073517112 -1.5239291748746735 -3.8227171795407386 -1.6242993181596941 -1.7959145004439885 -3.7219813771052594 -1.5989316893601677 -1.7282366986168833 -3.6212455746697798 -1.5735640605606416 -1.6605588967897782 -3.5205097722343006 -1.548196431761115 -1.592881094962673 -3.419773969798821 -1.5228288029615888 -1.5252032931355681 -3.7790405846874835 -1.7100381137695715 -1.7971886187048831 -3.6783047822520043 -1.6846704849700451 -1.729510816877778 -3.5775689798165247 -1.659302856170519 -1.6618330150506728 -3.4768331773810455 -1.6339352273709924 -1.5941552132235677 -3.3760973749455663 -1.6085675985714663 -1.5264774113964628 -3.7353639898342283 -1.7957769093794489 -1.7984627369657777 -3.6346281873987492 -1.7704092805799225 -1.7307849351386726 -3.53389238496327 -1.7450416517803964 -1.6631071333115675 -3.4331565825277903 -1.7196740229808698 -1.5954293314844623 -3.6916873949809732 -1.8815157049893263 -1.7997368552266724 -3.5909515925454945 -1.8561480761897999 -1.7320590533995672 -3.4902157901100148 -1.8307804473902738 -1.6643812515724621 -3.6480108001277181 -1.9672545005992039 -1.801010973487567 -3.5472749976922393 -1.9418868717996773 -1.7333331716604619 -3.4465391952567597 -1.9165192430001512 -1.6656553698333565 -3.6043342052744634 -2.0529932962090811 -1.8022850917484616 -3.5035984028389846 -2.0276256674095547 -1.7346072899213563 -3.5606576104212087 -2.1387320918189587 -1.803559210009356 -3.5169810155679535 -2.2244708874288364 -1.8048333282702507 -3.3213571085826397 -1.4931099255485827 -1.4575214354277743 -3.2847199635694224 -1.5656399360020186 -1.4587832415315403 -3.337971272635107 -1.6838914803491249 -1.5277418217202483 -3.2480828185562052 -1.6381699464554544 -1.4600450476353062 -3.3912225817007906 -1.8021430246962311 -1.5967004019089563 -3.3013341276218897 -1.7564214908025608 -1.529003627824014 -3.2114456735429879 -1.7106999569088903 -1.4613068537390719 -3.3545854366875734 -1.874673035149667 -1.597962208012722 -3.2646969826086725 -1.8289515012559967 -1.5302654339277799 -3.1748085285297707 -1.7832299673623262 -1.4625686598428378 -3.4078367457532583 -1.9929245794967732 -1.6669207882014303 -3.3179482916743566 -1.9472030456031029 -1.5992240141164877 -3.2280598375954552 -1.9014815117094326 -1.5315272400315456 -3.1381713835165534 -1.8557599778157623 -1.4638304659466035 -3.4610880548189429 -2.1111761238438791 -1.7358793683901381 -3.3711996007400411 -2.065454589950209 -1.668182594305196 -3.2813111466611393 -2.019733056056539 -1.6004858202202537 -3.191422692582238 -1.9740115221628685 -1.5327890461353115 -3.1015342385033362 -1.9282899882691982 -1.4650922720503694 -3.4244509098057256 -2.1837061342973154 -1.737141174493904 -3.3345624557268239 -2.1379846004036449 -1.6694444004089617 -3.2446740016479225 -2.0922630665099748 -1.6017476263240193 -3.1547855475690207 -2.0465415326163043 -1.5340508522390772 -3.0648970934901194 -2.0008199987226343 -1.4663540781541351 -3.4777022188714097 -2.3019576786444214 -1.8060997546826119 -3.3878137647925084 -2.2562361447507513 -1.7384029805976697 -3.6439963552316446 -0.79413689236132501 -1.5143163229745356 -3.7478949846734499 -0.7988919043028605 -1.5819980409852974 -3.8517936141152558 -0.80364691624439599 -1.6496797589960597 -3.9556922435570612 -0.80840192818593148 -1.7173614770068217 -4.059590872998867 -0.81315694012746687 -1.7850431950175838 -4.0335334488137784 -0.90524202554924649 -1.7862487073190594 -3.929634819371973 -0.90048701360771122 -1.7185669893082973 -3.8257361899301676 -0.89573200166617561 -1.6508852712975353 -3.7218375604883618 -0.89097698972464012 -1.5832035532867732 -3.6179389310465564 -0.88622197778310463 -1.5155218352760114 -4.0074760246286898 -0.99732711097102611 -1.7874542196205352 -3.9035773951868848 -0.99257209902949084 -1.7197725016097729 -3.7996787657450795 -0.98781708708795524 -1.6520907835990108 -3.6957801363032736 -0.98306207514641974 -1.584409065588249 -3.9814186004436016 -1.0894121963928058 -1.7886597319220108 -3.8775199710017962 -1.0846571844512705 -1.7209780139112487 -3.7736213415599908 -1.0799021725097349 -1.6532962959004867 -3.955361176258513 -1.1814972818145855 -1.7898652442234866 -3.8514625468167081 -1.1767422698730501 -1.7221835262127243 -3.7475639173749027 -1.1719872579315145 -1.6545018082019622 -3.9293037520734249 -1.2735823672363651 -1.7910707565249622 -3.8254051226316195 -1.2688273552948297 -1.7233890385142001 -3.9032463278883363 -1.3656674526581449 -1.792276268826438 -3.8771889037032481 -1.4577525380799246 -1.7934817811279136 -3.5410941278609274 -0.78609124939318042 -1.4466334485020977 -3.5192928757468809 -0.86412027022222349 -1.4478340209303755 -3.5947809545504934 -0.96873159883926574 -1.5167239823695751 -3.4974916236328344 -0.94214929105126655 -1.4490345933586535 -3.6702690333541055 -1.073342927456308 -1.5856139438087744 -3.5729797024364469 -1.0467606196683088 -1.5179245547978528 -3.4756903715187879 -1.0201783118803096 -1.4502351657869312 -3.648467781240059 -1.1513719482853511 -1.5868145162370524 -3.5511784503224004 -1.1247896404973519 -1.5191251272261308 -3.4538891194047419 -1.0982073327093527 -1.4514357382152092 -3.7239558600436715 -1.2559832769023933 -1.6557044776762517 -3.6266665291260125 -1.2294009691143941 -1.5880150886653301 -3.5293771982083539 -1.2028186613263949 -1.5203256996544086 -3.4320878672906954 -1.1762363535383955 -1.452636310643487 -3.7994439388472836 -1.3605946055194356 -1.7245944391154511 -3.702154607929625 -1.3340122977314364 -1.6569050501045297 -3.604865277011966 -1.3074299899434372 -1.5892156610936081 -3.5075759460943075 -1.280847682155438 -1.5215262720826865 -3.4102866151766493 -1.2542653743674386 -1.453836883071765 -3.7776426867332371 -1.4386236263484786 -1.7257950115437291 -3.6803533558155785 -1.4120413185604794 -1.6581056225328075 -3.58306402489792 -1.3854590107724802 -1.5904162335218859 -3.4857746939802614 -1.3588767029844808 -1.5227268445109643 -3.3884853630626028 -1.3322943951964816 -1.4550374555000427 -3.8531307655368487 -1.5432349549655209 -1.7946849729829286 -3.7558414346191906 -1.5166526471775217 -1.726995583972007 -3.6585521037015321 -1.4900703393895225 -1.6593061949610854 -3.5612627727838735 -1.4634880316015233 -1.5916168059501639 -3.7164382372438038 -0.040543959194724241 -1.5041804958264564 -3.81931685781004 -0.024666827565533175 -1.5718769207088157 -3.9221954783762758 -0.0087896959363419885 -1.6395733455911754 -4.22315014886986 -0.056151042234179438 -1.8437816705751897 -4.1202715283036238 -0.07202817386337057 -1.77608524569283 -4.0173929077373876 -0.087905305492561647 -1.7083888208104707 -3.9145142871711522 -0.10378243712175272 -1.6406923959281114 -3.8116356666049165 -0.11965956875094391 -1.5729959710457517 -3.7087570460386803 -0.13553670038013496 -1.5052995461633925 -4.2154689576647364 -0.15114378341959009 -1.8449007209121258 -4.1125903370985002 -0.16702091504878125 -1.777204296029766 -4.009711716532264 -0.18289804667797227 -1.7095078711474068 -3.9068330959660287 -0.19877517830716335 -1.6418114462650475 -3.8039544753997925 -0.21465230993635454 -1.5741150213826878 -4.2077877664596128 -0.24613652460500074 -1.8460197712490618 -4.1049091458933766 -0.26201365623419187 -1.7783233463667021 -4.0020305253271404 -0.27789078786338289 -1.7106269214843428 -3.8991519047609047 -0.29376791949257397 -1.6429304966019835 -4.2001065752544893 -0.34112926579041142 -1.8471388215859978 -4.0972279546882531 -0.35700639741960249 -1.7794423967036381 -3.9943493341220169 -0.37288352904879352 -1.7117459718212789 -3.8914707135557811 -0.38876066067798465 -1.6440495469389196 -4.0895467634831295 -0.45199913860501334 -1.7805614470405742 -3.9866681429168929 -0.46787627023420442 -1.7128650221582149 -4.0818655722780051 -0.54699187979042396 -1.7816804973775102 -3.9789869517117693 -0.5628690114196151 -1.7139840724951512 -4.0741843810728815 -0.64198462097583464 -1.7827995477144465 -3.6137737761050195 -0.054247616005869692 -1.4364841316430887 -3.6075147179891349 -0.13480732244629923 -1.4376035850537789 -3.7019155558710435 -0.22200743027057135 -1.5064188344959508 -3.6012556598732504 -0.21536702888672882 -1.4387230384644691 -3.7963163937529525 -0.30920753809484347 -1.5752340839381229 -3.6956564977551589 -0.30256713671100083 -1.507538287906641 -3.5949966017573654 -0.2959267353271583 -1.4398424918751593 -3.7900573356370679 -0.38976724453527295 -1.5763535373488131 -3.6893974396392744 -0.38312684315143036 -1.5086577413173312 -3.5887375436414808 -0.37648644176758783 -1.4409619452858493 -3.8844581735189774 -0.47696735235954507 -1.6451687867909852 -3.7837982775211834 -0.47032695097570248 -1.5774729907595033 -3.6831383815233898 -0.4636865495918599 -1.5097771947280214 -3.5824784855255958 -0.45704614820801737 -1.4420813986965395 -3.8781991154030928 -0.55752705879997455 -1.6462882402016754 -3.7775392194052988 -0.55088665741613196 -1.5785924441701935 -3.6768793234075052 -0.54424625603228938 -1.5108966481387116 -3.5762194274097112 -0.53760585464844679 -1.4432008521072295 -3.9725999532850018 -0.64472716662424678 -1.7151034896438473 -3.8719400572872082 -0.63808676524040409 -1.6474076936123656 -3.7712801612894142 -0.6314463638565615 -1.5797118975808835 -3.6706202652916202 -0.62480596247271891 -1.5120161015494016 -3.5699603692938262 -0.61816556108887633 -1.4443203055179197 -4.0670007911669108 -0.73192727444851891 -1.7839187390860194 -3.9663408951691173 -0.72528687306467621 -1.7162229430545375 -3.8656809991713232 -0.71864647168083362 -1.6485271470230556 -3.7650211031735297 -0.71200607029699103 -1.5808313509915737 -3.6643612071757357 -0.70536566891314845 -1.5131355549600918 -3.5637013111779416 -0.69872526752930586 -1.4454397589286097 -3.6370948606687588 0.70796013798537549 -1.4950875063150166 -4.1370395515401732 0.79248311345035005 -1.8347023133806022 -4.0392098753662173 0.75669730634172305 -1.7669795549463176 -3.9413801991922628 0.72091149923309628 -1.6992567965120331 -3.8435505230183069 0.68512569212446961 -1.6315340380777485 -3.7457208468443515 0.64933988501584272 -1.563811279643464 -3.647891170670396 0.61355407790721606 -1.4960885212091797 -4.1478358615418109 0.69807705337219017 -1.8357033282747652 -4.0500061853678551 0.66229124626356328 -1.7679805698404807 -3.9521765091939001 0.62650543915493639 -1.7002578114061961 -3.8543468330199442 0.59071963204630973 -1.6325350529719116 -3.7565171568459887 0.55493382493768295 -1.564812294537627 -4.1586321715434478 0.60367099329403062 -1.8367043431689285 -4.0608024953694928 0.56788518618540362 -1.768981584734644 -3.9629728191955373 0.53209937907677674 -1.7012588263003594 -3.8651431430215815 0.49631357196815012 -1.6335360678660749 -3.767313466847626 0.46052776485952346 -1.5658133094317903 -4.1694284815450855 0.50926493321587107 -1.8377053580630915 -4.0715988053711296 0.47347912610724402 -1.769982599628807 -3.9737691291971746 0.43769331899861708 -1.7022598411945224 -3.8759394530232187 0.40190751188999052 -1.6345370827602379 -4.1802247915467223 0.41485887313771147 -1.8387063729572546 -4.0823951153727673 0.37907306602908447 -1.7709836145229703 -3.9845654391988119 0.34328725892045747 -1.7032608560886857 -4.1910211015483601 0.32045281305955164 -1.8397073878514179 -4.0931914253744042 0.28466700595092465 -1.7719846294171333 -3.9953617492004487 0.24888119884229767 -1.7042618709828488 -4.2018174115499969 0.22604675298139226 -1.8407084027455809 -4.1039877353760419 0.19026094587276529 -1.7729856443112966 -4.2126137215516346 0.13164069290323241 -1.8417094176397442 -4.2234100315532714 0.037234632825072993 -1.8427104325339072 -3.5391719957863099 0.67312526215062185 -1.4273650618225719 -3.5485640279253245 0.59304896109978045 -1.4283708075643133 -3.657981054016723 0.52635665082862826 -1.4970919159719718 -3.5579560600643392 0.51297266004893904 -1.4293765533060547 -3.6673730861557376 0.44628034977778691 -1.4980976617137132 -3.5673480922033538 0.43289635899809764 -1.4303822990477963 -3.7767901122471361 0.37958803950663478 -1.5668187701213716 -3.6767651182947523 0.36620404872694551 -1.4991034074554546 -3.5767401243423684 0.35282005794725624 -1.4313880447895377 -3.8862071383385346 0.31289572923548264 -1.63553987852903 -3.7861821443861507 0.29951173845579332 -1.567824515863113 -3.6861571504337669 0.2861277476761041 -1.500109153197196 -3.5861321564813831 0.27274375689641484 -1.4323937905312794 -3.8955991704775492 0.23281942818464124 -1.6365456242707714 -3.7955741765251654 0.21943543740495194 -1.5688302616048544 -3.6955491825727815 0.20605144662526276 -1.5011148989389376 -3.5955241886203977 0.19266745584557349 -1.4333995362730207 -4.0050161965689473 0.16612711791348905 -1.7052667326784297 -3.9049912026165639 0.15274312713379978 -1.6375513700125128 -3.80496620866418 0.13935913635411049 -1.5698360073465958 -3.7049412147117966 0.1259751455744213 -1.502120644680679 -3.6049162207594128 0.11259115479473204 -1.4344052820147624 -4.1144332226603462 0.099434807642336948 -1.7739878410860881 -4.0144082287079623 0.086050816862647678 -1.706272478420171 -3.9143832347555789 0.072666826082958436 -1.6385571157542542 -3.8143582408031951 0.059282835303269117 -1.5708417530883374 -3.7143332468508112 0.045898844523579917 -1.5031263904224206 -3.6143082528984274 0.032514853743890695 -1.4354110277565038 -4.1238252547993612 0.019358506591495513 -1.7749935868278295 -4.0238002608469765 0.0059745158118062868 -1.7072782241619127 -3.3225846322975383 1.3684123290251529 -1.4197355802406666 -3.8853401931105847 1.6036253932683304 -1.8271496872316428 -3.7963344263921956 1.5493555167171964 -1.7593861742003163 -3.7073286596738071 1.4950856401660624 -1.6916226611689897 -3.6183228929554181 1.4408157636149286 -1.6238591481376634 -3.5293171262370295 1.3865458870637946 -1.5560956351063366 -3.440311359518641 1.3322760105126605 -1.4883321220750101 -3.9140611536132988 1.5132191982047041 -1.8279827160346598 -3.8250553868949098 1.4589493216535701 -1.7602192030033332 -3.7360496201765212 1.404679445102436 -1.6924556899720067 -3.6470438534581322 1.3504095685513022 -1.6246921769406804 -3.5580380867397436 1.2961396920001682 -1.5569286639093536 -3.9427821141160129 1.4228130031410779 -1.8288157448376767 -3.8537763473976239 1.3685431265899439 -1.7610522318063502 -3.7647705806792353 1.3142732500388099 -1.6932887187750236 -3.6757648139608463 1.2600033734876761 -1.6255252057436973 -3.5867590472424578 1.2057334969365421 -1.5577616927123705 -3.971503074618727 1.3324068080774518 -1.8296487736406937 -3.882497307900338 1.2781369315263178 -1.7618852606093671 -3.7934915411819494 1.2238670549751838 -1.6941217475780406 -3.7044857744635604 1.1695971784240498 -1.6263582345467142 -4.0002240351214411 1.2420006130138257 -1.8304818024437106 -3.9112182684030521 1.1877307364626917 -1.7627182894123841 -3.8222125016846631 1.1334608599115576 -1.6949547763810577 -4.0289449956241548 1.1515944179501993 -1.8313148312467278 -3.9399392289057662 1.0973245413990653 -1.7635513182154012 -3.8509334621873772 1.0430546648479313 -1.6957878051840747 -4.0576659561268684 1.0611882228865732 -1.8321478600497447 -3.9686601894084803 1.0069183463354392 -1.7643843470184182 -4.086386916629583 0.97078202782294698 -1.8329808888527619 -4.1151078771322975 0.88037583275932074 -1.8338139176557788 -3.3472946548691982 1.2912722962470533 -1.4205771597043408 -3.46736003452382 1.247400893510918 -1.4891687159159452 -3.3718582774959076 1.2146164807422433 -1.4214190512686438 -3.4919236571505294 1.1707450780061079 -1.4900106074802482 -3.3964219001226166 1.1379606652374332 -1.4222609428329465 -3.6119890368051513 1.1268736752699724 -1.5586021636918523 -3.5164872797772389 1.0940892625012979 -1.4908524990445511 -3.420985522749326 1.0613048497326232 -1.4231028343972494 -3.7320544164597735 1.0830022725338371 -1.627193719903457 -3.6365526594318607 1.0502178597651621 -1.5594440552561553 -3.5410509024039478 1.0174334469964879 -1.4916943906088538 -3.4455491453760354 0.98464903422781302 -1.4239447259615521 -3.756618039086483 1.0063464570290268 -1.6280356114677599 -3.6611162820585701 0.97356204426035187 -1.5602859468204582 -3.5656145250306572 0.94077763149167748 -1.4925362821731567 -3.4701127680027444 0.90799321872300265 -1.424786617525855 -3.8766834187411048 0.96247505429289149 -1.6966271676793641 -3.7811816617131919 0.92969064152421677 -1.6288775030320626 -3.6856799046852791 0.89690622875554182 -1.5611278383847609 -3.5901781476573666 0.86412181598686733 -1.4933781737374594 -3.4946763906294538 0.83133740321819261 -1.4256285090901577 -3.9967487983957266 0.91860365155675594 -1.7652187238909685 -3.9012470413678142 0.88581923878808122 -1.697469059243667 -3.8057452843399013 0.85303482601940661 -1.6297193945963655 -3.7102435273119885 0.82025041325073167 -1.5619697299490638 -3.6147417702840756 0.78746600048205717 -1.4942200653017623 -3.5192400132561628 0.75468158771338245 -1.4264704006544606 -4.0213124210224356 0.84194783605194579 -1.7660606154552714 -3.9258106639945232 0.80916342328327107 -1.6983109508079697 -3.8303089069666103 0.77637901051459646 -1.6305612861606682 -3.7348071499386974 0.74359459774592152 -1.5628116215133665 -3.0960919052035649 1.994179592488704 -1.4827238345022327 -3.1728519101040011 2.0648650899315193 -1.5505479568879561 -3.2496119150044369 2.1355505873743343 -1.61837207927368 -3.3263719199048731 2.2062360848171494 -1.6861962016594034 -3.5253636628435281 2.264391066579821 -1.8224317512615507 -3.4486036579430923 2.193705569137006 -1.7546076288758268 -3.3718436530426561 2.1230200716941909 -1.6867835064901029 -3.2950836481422199 2.0523345742513759 -1.6189593841043795 -3.2183236432417837 1.9816490768085608 -1.5511352617186556 -3.5708353959813111 2.1811750534568626 -1.8230190560922501 -3.4940753910808753 2.1104895560140475 -1.7551949337065262 -3.4173153861804391 2.0398040585712325 -1.6873708113208026 -3.3405553812800028 1.9691185611284174 -1.6195466889350789 -3.2637953763795666 1.8984330636856022 -1.5517225665493553 -3.616307129119094 2.0979590403339041 -1.8236063609229496 -3.5395471242186582 2.0272735428910891 -1.7557822385372257 -3.4627871193182216 1.956588045448274 -1.687958116151502 -3.3860271144177854 1.885902548005459 -1.6201339937657784 -3.661778862256877 2.0147430272109457 -1.8241936657536491 -3.5850188573564408 1.9440575297681306 -1.7563695433679252 -3.5082588524560046 1.8733720323253156 -1.6885454209822017 -3.70725059539466 1.9315270140879872 -1.8247809705843485 -3.6304905904942237 1.8608415166451722 -1.7569568481986246 -3.5537305855937871 1.7901560192023571 -1.6891327258129012 -3.7527223285324429 1.8483110009650288 -1.825368275415048 -3.6759623236320067 1.7776255035222135 -1.7575441530293243 -3.7981940616702254 1.7650949878420705 -1.8259555802457474 -3.8436657948080084 1.6818789747191119 -1.8265428850764471 -3.01375783670689 1.933957689784537 -1.4149108704419266 -3.1397652818843444 1.914339442026231 -1.4833147393360928 -3.0524568588998919 1.863455364150902 -1.4155117330857685 -3.1784643040773464 1.8438371163925962 -1.4839156019799347 -3.0911558810928934 1.7929530385172672 -1.4161125957296103 -3.3044717492548008 1.8242188686342899 -1.5523194708741008 -3.2171633262703478 1.7733347907589614 -1.4845164646237765 -3.1298549032858953 1.7224507128836324 -1.4167134583734522 -3.4304791944322552 1.8046006208759842 -1.620723339768267 -3.3431707714478023 1.7537165430006552 -1.5529203335179427 -3.2558623484633498 1.7028324651253266 -1.4851173272676184 -3.1685539254788972 1.6519483872499976 -1.417314321017294 -3.4691782166252567 1.7340982952423494 -1.6213242024121088 -3.3818697936408042 1.6832142173670204 -1.5535211961617845 -3.2945613706563517 1.6323301394916916 -1.4857181899114602 -3.2072529476718987 1.5814460616163628 -1.4179151836611359 -3.5951856618027112 1.7144800474840434 -1.6897280713062752 -3.5078772388182586 1.6635959696087146 -1.6219250650559507 -3.4205688158338057 1.6127118917333856 -1.5541220588056264 -3.3332603928493532 1.5618278138580568 -1.4863190525553021 -3.2459519698649006 1.510943735982728 -1.4185160463049777 -3.7211931069801656 1.6948617997257376 -1.7581319402004414 -3.6338846839957131 1.6439777218504086 -1.6903289339501171 -3.5465762610112601 1.5930936439750798 -1.6225259276997928 -3.4592678380268076 1.5422095660997508 -1.5547229214494682 -3.3719594150423551 1.4913254882244218 -1.4869199151991441 -3.2846509920579021 1.440441410349093 -1.4191169089488196 -3.7598921291731675 1.6243594740921028 -1.7587328028442832 -3.6725837061887145 1.5734753962167738 -1.6909297965939589 -3.585275283204262 1.522591318341445 -1.6231267903436346 -3.4979668602198091 1.471707240466116 -1.5553237840933103 -3.4106584372353566 1.420823162590787 -1.487520777842986 -2.6295242683291615 2.5763229955539875 -1.4803690010081929 -2.6910530473463732 2.6607955802426453 -1.5482831169812765 -2.7525818263635848 2.7452681649313035 -1.6161972329543604 -2.9976755654884832 2.9254706438724094 -1.8201581760438867 -2.9361467864712716 2.8409980591837507 -1.7522440600708029 -2.8746180074540604 2.7565254744950929 -1.6843299440977195 -2.8130892284368492 2.6720528898064346 -1.6164158281246359 -2.7515604494196375 2.5875803051177764 -1.5485017121515523 -3.0581829675617476 2.85225536874754 -1.8203767712141623 -2.9966541885445359 2.7677827840588813 -1.7524626552410787 -2.9351254095273247 2.6833101993702235 -1.6845485392679951 -2.8735966305101135 2.5988376146815653 -1.6166344232949115 -2.8120678514929018 2.514365029992907 -1.5487203073218279 -3.1186903696350119 2.7790400936226711 -1.8205953663844381 -3.0571615906178002 2.6945675089340124 -1.7526812504113545 -2.995632811600589 2.6100949242453546 -1.6847671344382709 -2.9341040325833774 2.5256223395566959 -1.6168530184651873 -3.1791977717082762 2.7058248184978018 -1.8208139615547136 -3.1176689926910646 2.6213522338091435 -1.75289984558163 -3.0561402136738534 2.5368796491204852 -1.6849857296085464 -2.9946114346566417 2.452407064431827 -1.6170716136354628 -3.2397051737815405 2.6326095433729328 -1.8210325567249894 -3.1781763947643289 2.5481369586842741 -1.7531184407519058 -3.1166476157471177 2.4636643739956163 -1.6852043247788222 -3.3002125758548049 2.5593942682480635 -1.821251151895265 -3.2386837968375932 2.4749216835594048 -1.7533370359221814 -3.3607199779280692 2.4861789931231946 -1.8214697470655408 -3.2991911989108575 2.4017064084345359 -1.7535556310924572 -3.4212273800013331 2.4129637179983252 -1.8216883422358163 -2.6894748046518089 2.5037890547690971 -1.4805887851701167 -2.7407806037707747 2.4418320911289295 -1.4808270271386537 -2.867850290874181 2.4469308238844003 -1.5489489909939942 -2.7920864028897405 2.379875127488762 -1.4810652691071906 -2.9191560899931468 2.3849738602442332 -1.5491872329625311 -2.8433922020087063 2.3179181638485948 -1.4813035110757276 -3.0462257770965531 2.390072592999704 -1.6173091968178719 -2.9704618891121126 2.3230168966040656 -1.5494254749310681 -2.8946980011276722 2.2559612002084273 -1.4815417530442645 -3.1732954641999598 2.3951713257551752 -1.6854311606732124 -3.0975315762155193 2.3281156293595364 -1.6175474387864088 -3.0217676882310789 2.2610599329638981 -1.549663716899605 -2.9460038002466384 2.1940042365682597 -1.4817799950128014 -3.2246012633189256 2.3332143621150077 -1.6856694026417494 -3.1488373753344852 2.2661586657193693 -1.6177856807549458 -3.0730734873500447 2.1991029693237309 -1.549901958868142 -2.9973095993656043 2.1320472729280926 -1.4820182369813384 -3.3516709504223319 2.3383130948704784 -1.7537913664970901 -3.2759070624378914 2.2712573984748401 -1.6859076446102863 -3.200143174453451 2.2042017020792017 -1.6180239227234827 -3.1243792864690105 2.1371460056835634 -1.5501402008366791 -3.0486153984845701 2.0700903092879255 -1.4822564789498756 -2.9728515105001296 2.0030346128922867 -1.414372757063072 -3.4787406375257386 2.3434118276259497 -1.8219133303524309 -3.4029767495412981 2.2763561312303113 -1.7540296084656271 -2.0575491367813634 3.0604993431605783 -1.4830825689938589 -2.3499663467482854 3.4754222899264189 -1.8229829062816587 -2.3061723478654792 3.3802476316593637 -1.7549329001263927 -2.2623783489826725 3.2850729733923085 -1.6868828939711269 -2.2185843500998663 3.1898983151252533 -1.6188328878158609 -2.1747903512170597 3.0947236568581977 -1.5507828816605951 -2.1309963523342534 2.999548998591143 -1.4827328755053293 -2.4234135623011754 3.4144719453569836 -1.8226332127931291 -2.3796195634183692 3.3192972870899284 -1.754583206637863 -2.3358255645355626 3.2241226288228733 -1.6865332004825973 -2.2920315656527563 3.1289479705558181 -1.6184831943273312 -2.2482375667699497 3.0337733122887625 -1.5504331881720654 -2.4968607778540659 3.3535216007875479 -1.8222835193045994 -2.4530667789712597 3.2583469425204927 -1.7542335131493334 -2.409272780088453 3.1631722842534375 -1.6861835069940676 -2.3654787812056468 3.0679976259863824 -1.6181335008388018 -2.5703079934069559 3.2925712562181126 -1.82193382581607 -2.5265139945241497 3.1973965979510575 -1.753883819660804 -2.482719995641343 3.1022219396840023 -1.685833813505538 -2.4389259967585368 3.0070472814169471 -1.6177838073502722 -2.6437552089598459 3.2316209116486774 -1.8215841323275404 -2.5999612100770397 3.1364462533816218 -1.7535341261722743 -2.5561672111942335 3.0412715951145666 -1.6854841200170085 -2.717202424512736 3.1706705670792417 -1.8212344388390109 -2.6734084256299298 3.0754959088121865 -1.7531844326837449 -2.7906496400656264 3.109720222509806 -1.8208847453504813 -2.7468556411828202 3.0145455642427508 -1.7528347391952153 -2.8640968556185165 3.0487698779403707 -1.8205350518619519 -2.0107212173164601 2.9678290217781251 -1.415040069052236 -2.0727359488210646 2.9163155727074384 -1.4147186606375624 -2.1960208354932824 2.9455511627747559 -1.4824040206732827 -2.1347506803256686 2.864802123636752 -1.4143972522228889 -2.3193057221655002 2.9747867528420731 -1.5500893807090028 -2.2580355669978864 2.8940377137040691 -1.482082612258609 -2.3813204536701047 2.9232733037713863 -1.5497679722943292 -2.3200502985024904 2.8425242646333828 -1.4817612038439354 -2.5046053403423221 2.9525088938387039 -1.6174533323300495 -2.4433351851747087 2.8717598547006995 -1.5494465638796557 -2.3820650300070949 2.7910108155626965 -1.481439795429262 -2.6278902270145399 2.981744483906021 -1.6851386923657696 -2.5666200718469265 2.9009954447680171 -1.6171319239153759 -2.5053499166793132 2.8202464056300132 -1.5491251554649821 -2.4440797615116994 2.7394973664920097 -1.4811183870145883 -2.6899049585191444 2.9302310348353346 -1.684817283951096 -2.628634803351531 2.8494819956973307 -1.6168105155007022 -2.5673646481839172 2.7687329565593268 -1.5488037470503087 -2.5060944930163034 2.6879839174213234 -1.4807969785999149 -2.8131898451913622 2.9594666249026513 -1.7525026439868163 -2.7519196900237488 2.8787175857646479 -1.6844958755364223 -2.6906495348561354 2.797968546626644 -1.6164891070860288 -2.6293793796885216 2.7172195074886401 -1.548482338635635 -2.5681092245209078 2.6364704683506366 -1.4804755701852412 -2.93647473186358 2.9887022149699689 -1.8201880040225367 -2.8752045766959662 2.907953175831965 -1.7521812355721427 -2.8139344215283528 2.8272041366939615 -1.6841744671217489 -1.4808521826460554 3.3872450138665702 -1.4926561963694269 -1.5048654187733468 3.489687507462869 -1.560915918035189 -1.5288786549006381 3.5921300010591679 -1.6291756397009511 -1.5528918910279297 3.6945724946554663 -1.6974353613667132 -1.576905127155221 3.7970149882517652 -1.7656950830324754 -1.6851602180675078 3.8523258617619085 -1.8327093074995882 -1.661146981940216 3.7498833681656096 -1.7644495858338261 -1.6371337458129247 3.6474408745693108 -1.6961898641680639 -1.6131205096856331 3.5449983809730123 -1.6279301425023018 -1.589107273558342 3.442555887376713 -1.5596704208365397 -1.7694020728525031 3.8051942416757525 -1.8314638103009389 -1.7453888367252111 3.7027517480794541 -1.7632040886351767 -1.7213756005979199 3.6003092544831552 -1.6949443669694146 -1.6973623644706284 3.4978667608868563 -1.6266846453036525 -1.6733491283433373 3.3954242672905575 -1.5584249236378906 -1.8536439276374981 3.7580626215895969 -1.8302183131022896 -1.8296306915102063 3.6556201279932985 -1.7619585914365274 -1.805617455382915 3.5531776343969996 -1.6936988697707653 -1.7816042192556234 3.4507351408007008 -1.6254391481050032 -1.9378857824224931 3.7109310015034414 -1.8289728159036402 -1.9138725462952013 3.6084885079071429 -1.7607130942378781 -1.88985931016791 3.5060460143108436 -1.692453372572116 -2.0221276372074883 3.6637993814172858 -1.8277273187049909 -1.9981144010801963 3.5613568878209869 -1.7594675970392288 -1.974101164952905 3.458914394224688 -1.691207875373467 -2.1063694919924836 3.6166677613311298 -1.8264818215063416 -2.0823562558651916 3.5142252677348309 -1.7582220998405795 -2.1906113467774784 3.5695361412449742 -1.8252363243076923 -2.2748532015624736 3.5224045211588182 -1.823990827109043 -1.4472684650284329 3.2899671154348815 -1.4244255284006966 -1.5622503801419785 3.3416479392157501 -1.4914193318354376 -1.5179823763141997 3.2501356872621439 -1.4232210988089682 -1.6329642914277456 3.3018165110430124 -1.4902149022437092 -1.5886962875999666 3.2103042590894062 -1.4220166692172398 -1.747946206541291 3.3534973348238806 -1.55720870567845 -1.7036782027135124 3.2619850828702748 -1.4890104726519808 -1.6594101988857335 3.1704728309166685 -1.4208122396255114 -1.8629281216548366 3.4051781586047492 -1.6242025091131909 -1.8186601178270578 3.3136659066511429 -1.5560042760867216 -1.7743921139992793 3.2221536546975371 -1.4878060430602524 -1.7301241101715004 3.1306414027439309 -1.419607810033783 -1.9336420329406034 3.3653467304320115 -1.6229980795214625 -1.8893740291128249 3.2738344784784053 -1.5547998464949933 -1.8451060252850462 3.1823222265247995 -1.486601613468524 -1.8008380214572672 3.0908099745711932 -1.4184033804420546 -2.0486239480541495 3.4170275542128796 -1.6899918829562035 -2.0043559442263708 3.3255153022592738 -1.6217936499297341 -1.960087940398592 3.2340030503056676 -1.5535954169032649 -1.9158199365708133 3.1424907983520618 -1.4853971838767956 -1.8715519327430343 3.0509785463984556 -1.4171989508503262 -2.1636058631676947 3.4687083779937482 -1.7569856863909441 -2.1193378593399164 3.377196126040142 -1.6887874533644751 -2.0750698555121376 3.2856838740865362 -1.6205892203380057 -2.0308018516843589 3.1941716221329299 -1.5523909873115365 -1.9865338478565804 3.1026593701793241 -1.4841927542850673 -1.9422658440288014 3.0111471182257183 -1.4159945212585978 -2.2343197744534615 3.4288769498210105 -1.7557812567992157 -2.1900517706256832 3.3373646978674043 -1.6875830237727465 -2.1457837667979045 3.2458524459137985 -1.6193847907462773 -2.1015157629701258 3.1543401939601927 -1.5511865577198078 -0.74605305257346621 3.5530687036203097 -1.446523658934215 -0.74867983769978597 3.6590117346929238 -1.5151041143362727 -0.75130662282610572 3.7649547657655384 -1.5836845697383302 -0.85272894608460859 4.0502798313346773 -1.7867734468176901 -0.85010216095828905 3.9443368002620627 -1.7181929914156326 -0.8474753758319693 3.8383937691894481 -1.6496125360135749 -0.84484859070564955 3.7324507381168335 -1.5810320806115172 -0.84222180557932991 3.6265077070442193 -1.5124516252094597 -0.94627091396415253 4.0177758036859723 -1.7841209576908772 -0.943644128837833 3.9118327726133577 -1.7155405022888197 -0.94101734371151324 3.8058897415407431 -1.646960046886762 -0.93839055858519349 3.6999467104681285 -1.5783795914847043 -1.0398128818436967 3.9852717760372673 -1.7814684685640643 -1.0371860967173772 3.8793287449646527 -1.7128880131620068 -1.0345593115910574 3.7733857138920381 -1.6443075577599491 -1.0319325264647377 3.6674426828194235 -1.5757271023578914 -1.1359816348495602 4.058710779461177 -1.847396434839309 -1.1333548497232406 3.9527677483885624 -1.7788159794372513 -1.1307280645969211 3.8468247173159478 -1.7102355240351939 -1.1281012794706013 3.7408816862433336 -1.6416550686331361 -1.2295236027291041 4.026206751812472 -1.8447439457124961 -1.2268968176027846 3.9202637207398574 -1.7761634903104384 -1.2242700324764648 3.8143206896672432 -1.7075830349083809 -1.323065570608648 3.993702724163767 -1.8420914565856832 -1.3204387854823285 3.8877596930911524 -1.7735110011836255 -1.4166075384881924 3.9611986965150621 -1.8394389674588703 -1.4139807533618727 3.8552556654424475 -1.7708585120568126 -1.5101495063677364 3.9286946688663575 -1.8367864783320573 -0.82747514939629963 3.5243090333638598 -1.4439147536646515 -0.9305470154513994 3.5956153637374926 -1.5098178958891859 -0.90541508912385316 3.4966251534850219 -1.4413183704621175 -1.008486955178953 3.5679314838586547 -1.5072215126866519 -0.9833550288514068 3.468941273606184 -1.4387219872595836 -1.1115588212340528 3.6392378142322874 -1.5731246549111861 -1.0864268949065066 3.5402476039798167 -1.504625129484118 -1.0612949685789603 3.4412573937273461 -1.4361256040570496 -1.2146306872891524 3.7105441446059197 -1.6390277971357206 -1.1894987609616063 3.6115539343534495 -1.5705282717086522 -1.1643668346340601 3.5125637241009788 -1.502028746281584 -1.1392349083065139 3.4135735138485082 -1.4335292208545156 -1.3177025533442521 3.7818504749795521 -1.7049309393602547 -1.2925706270167059 3.6828602647270818 -1.6364314139331866 -1.2674387006891599 3.5838700544746116 -1.5679318885061182 -1.2423067743616136 3.4848798442221409 -1.4994323630790498 -1.2171748480340674 3.3858896339696702 -1.4309328376519814 -1.3956424930718057 3.7541665951007142 -1.7023345561577208 -1.3705105667442594 3.6551763848482439 -1.6338350307306526 -1.3453786404167134 3.5561861745957737 -1.5653355053035842 -1.3202467140891672 3.457195964343303 -1.4968359798765158 -1.2951147877616209 3.3582057540908323 -1.4283364544494475 -1.4987143591269056 3.8254729254743465 -1.7682376983822552 -1.4735824327993594 3.7264827152218762 -1.6997381729551868 -1.4484505064718132 3.627492504969406 -1.6312386475281184 -1.4233185801442669 3.5285022947169358 -1.56273912210105 -1.3981866538167209 3.4295120844644651 -1.4942395966739817 -1.3730547274891747 3.3305218742119949 -1.4257400712469133 -1.6017862251820054 3.8967792558479792 -1.8341408406067896 -0.0374421779072256 3.6852539636911934 -1.4831397026329043 -0.019076600120724083 3.7902430670489813 -1.5520825427595943 -0.00071102233422266523 3.8952321704067687 -1.6210253828862844 -0.04878150158480965 4.1930506875770632 -1.8231848651489222 -0.067147079371311147 4.0880615842192753 -1.7542420250222321 -0.085512657157812533 3.983072480861487 -1.6852991848955419 -0.10387823494431403 3.8780833775036991 -1.6163563447688518 -0.1222438127308155 3.7730942741459117 -1.5474135046421618 -0.15194871419490119 4.1759018946739941 -1.8185158270314896 -0.17031429198140263 4.0709127913162062 -1.7495729869047996 -0.18867986976790402 3.9659236879584179 -1.6806301467781093 -0.20704544755440557 3.8609345846006295 -1.6116873066514192 -0.22541102534090701 3.7559454812428421 -1.5427444665247292 -0.25511592680499257 4.1587531017709249 -1.813846788914057 -0.27348150459149401 4.0537639984131371 -1.744903948787367 -0.29184708237799545 3.9487748950553487 -1.6759611086606767 -0.310212660164497 3.8437857916975604 -1.6070182685339867 -0.358283139415084 4.1416043088678558 -1.8091777507966245 -0.37664871720158538 4.036615205510067 -1.7402349106699344 -0.39501429498808682 3.9316261021522791 -1.6712920705432441 -0.46145035202517537 4.1244555159647858 -1.8045087126791919 -0.47981592981167676 4.0194664126069979 -1.7355658725525018 -0.56461756463526702 4.1073067230617166 -1.7998396745617593 -0.58298314242176841 4.0023176197039279 -1.730896834435069 -0.66778477724535834 4.0901579301586466 -1.7951706364443267 -0.13790476143606467 3.6683695372461833 -1.4784693172964751 -0.22438671076999978 3.6528516607540493 -1.4737919679825824 -0.31479768154855514 3.7401436815047342 -1.5380685640917808 -0.31086866010393477 3.6373337842619153 -1.4691146186686896 -0.40520865232711067 3.8274357022554191 -1.6023451602009791 -0.40127963088249019 3.7246258050126002 -1.5333912147778881 -0.39735060943786976 3.6218159077697814 -1.4644372693547969 -0.49561962310566604 3.9147277230061044 -1.6666217563101775 -0.49169060166104572 3.8119178257632851 -1.5976678108870863 -0.48776158021642524 3.7091079285204662 -1.5287138654639951 -0.48383255877180475 3.6062980312776478 -1.4597599200409042 -0.58210157243960126 3.8992098465139704 -1.6619444069962848 -0.57817255099498099 3.7963999492711511 -1.5929904615731934 -0.57424352955036051 3.6935900520283327 -1.5240365161501024 -0.57031450810573991 3.5907801547855138 -1.4550825707270112 -0.67251254321815668 3.9865018672646553 -1.726221003105483 -0.6685835217735363 3.8836919700218364 -1.6572670576823918 -0.66465450032891604 3.7808820727790176 -1.5883131122593006 -0.66072547888429556 3.6780721755361987 -1.5193591668362094 -0.65679645743967496 3.5752622782933798 -1.4504052214131185 -0.7629235139967121 4.0737938880153406 -1.7904975992146814 -0.75899449255209184 3.9709839907725213 -1.7215436537915902 -0.75506547110747135 3.8681740935297029 -1.6525897083684991 0.69160784649746299 3.5935432601780066 -1.4649111153414398 0.71692864082353358 3.6933640567153865 -1.5332755969283929 0.74224943514960418 3.7931848532527668 -1.6016400785153457 0.76757022947567477 3.8930056497901466 -1.6700045601022988 0.79289102380174548 3.9928264463275265 -1.7383690416892521 0.70591412148412191 4.0938845795483658 -1.8001699904489228 0.68059332715805132 3.994063783010986 -1.7318055088619697 0.65527253283198061 3.8942429864736061 -1.6634410272750164 0.62995173850591002 3.7944221899362263 -1.5950765456880633 0.60463094417983942 3.694601393398846 -1.5267120641011103 0.59361642484042776 4.0951219162318253 -1.7936064576216404 0.56829563051435728 3.9953011196944455 -1.7252419760346873 0.54297483618828646 3.8954803231570656 -1.656877494447734 0.51765404186221586 3.7956595266196858 -1.5885130128607809 0.4813187281967336 4.0963592529152848 -1.7870429247943578 0.45599793387066312 3.9965384563779049 -1.7186784432074047 0.4306771395445923 3.8967176598405247 -1.6503139616204516 0.36902103155303939 4.0975965895987443 -1.7804793919670754 0.34370023722696891 3.9977757930613644 -1.7121149103801221 0.28204412923541594 4.1986547228195832 -1.8422803407267458 0.25672333490934529 4.0988339262822038 -1.7739158591397928 0.23140254058327478 3.9990131297448239 -1.7055513775528397 0.16974643259172173 4.1998920595030427 -1.8357168078994635 0.14442563826565105 4.1000712629656633 -1.7673523263125104 0.057448735948027629 4.2011293961865022 -1.8291532750721811 0.58160734507722267 3.5939637293311169 -1.4579529471574459 0.49403339972541682 3.6952341671327189 -1.5198564619891513 0.47506741977968575 3.5931536403487776 -1.4504002863162038 0.40645945437361092 3.7965046049343205 -1.5817599768208566 0.3874934744278799 3.6944240781503797 -1.5123038011479091 0.36852749448214883 3.5923435513664388 -1.4428476254749616 0.31888550902180507 3.8977750427359221 -1.6436634916525619 0.29991952907607394 3.7956945159519813 -1.5742073159796144 0.28095354913034298 3.6936139891680408 -1.5047511403066669 0.26198756918461186 3.5915334623840995 -1.4352949646337194 0.21234558372426821 3.8969649537535829 -1.6361108308113197 0.19337960377853708 3.794884426969642 -1.5666546551383722 0.17441362383280612 3.6928039001857016 -1.4971984794654247 0.15544764388707494 3.5907233734017607 -1.4277423037924772 0.1247716383724623 3.9982353915551849 -1.698014345643025 0.10580565842673118 3.8961548647712436 -1.6285581699700775 0.086839678481000104 3.7940743379873032 -1.55910199429713 0.067873698535269075 3.6919938112033628 -1.4896458186241825 0.048907718589537921 3.5899132844194215 -1.4201896429512353 0.03719769302065648 4.0995058293567865 -1.7599178604747303 0.018231713074925434 3.9974253025728457 -1.6904616848017828 1.5450086328770105 3.8350284184668988 -1.7833998893075316 1.5149738133356869 3.7392228397117848 -1.7159909160732671 1.4849389937943636 3.6434172609566713 -1.6485819428390027 1.45490417425304 3.5476116822015582 -1.5811729696047381 1.4248693547117164 3.4518061034464447 -1.5137639963704734 1.466480928935467 3.9540898716598827 -1.8445918907464651 1.4364461093941436 3.8582842929047696 -1.7771829175122005 1.40641128985282 3.7624787141496556 -1.7097739442779361 1.3763764703114967 3.6666731353945421 -1.6423649710436716 1.3463416507701731 3.570867556639429 -1.574955997809407 1.3163068312288493 3.4750619778843155 -1.5075470245751426 1.3579184054526001 3.9773457460977535 -1.838374918951134 1.3278835859112768 3.8815401673426404 -1.7709659457168694 1.2978487663699532 3.7857345885875264 -1.703556972482605 1.2678139468286298 3.6899290098324129 -1.6361479992483405 1.237779127287306 3.5941234310772998 -1.5687390260140761 1.249355881969733 4.0006016205356243 -1.8321579471558029 1.2193210624284094 3.9047960417805112 -1.7647489739215383 1.1892862428870858 3.8089904630253977 -1.6973400006872739 1.1592514233457625 3.7131848842702841 -1.6299310274530094 1.1407933584868661 4.0238574949734947 -1.8259409753604718 1.1107585389455426 3.928051916218382 -1.7585320021262074 1.080723719404219 3.8322463374632685 -1.6911230288919428 1.032230835003999 4.0471133694113659 -1.8197240035651407 1.0021960154626757 3.9513077906562528 -1.7523150303308763 0.92366831152113216 4.0703692438492363 -1.8135070317698099 1.2886592567229833 3.3778197909418175 -1.4396803045742981 1.2101965697842798 3.4968421178795532 -1.5008598392063555 1.1853103339242284 3.397938198836747 -1.4324636411595715 1.1317338828455761 3.6158644448172885 -1.5620393738384131 1.1068476469855248 3.5169605257744827 -1.4936431757916289 1.0819614111254734 3.4180566067316764 -1.4252469777448449 1.0532711959068726 3.7348867717550234 -1.6232189084704705 1.0283849600468211 3.635982852712218 -1.5548227104236865 1.0034987241867701 3.5370789336694117 -1.4864265123769023 0.97861248832671865 3.4381750146266055 -1.4180303143301183 0.97480850896816906 3.8539090986927587 -1.6843984431025281 0.94992227310811761 3.7550051796499528 -1.6160022450557439 0.92503603724806627 3.656101260607147 -1.5476060470089599 0.90014980138801515 3.5571973415643412 -1.4792098489621757 0.89634582202946544 3.972931425630494 -1.7455779777345857 0.8714595861694141 3.8740275065876881 -1.6771817796878015 0.84657335030936265 3.7751235875448823 -1.6087855816410173 0.82168711444931142 3.6762196685020765 -1.5403893835942333 0.79680087858926019 3.5773157494592702 -1.4719931855474491 0.81788313509076171 4.0919537525682292 -1.8067575123666431 2.2821316561518832 3.5066991278929782 -1.8169947977265102 2.2339219229321579 3.418551829193782 -1.7495414996094536 2.1857121897124334 3.3304045304945866 -1.682088201492397 2.137502456492709 3.2422572317953908 -1.6146349033753407 2.0892927232729841 3.1541099330961955 -1.5471816052582841 2.0410829900532592 3.0659626343969997 -1.4797283071412275 2.1887554307867885 3.5497083949861405 -1.8129082769780152 2.1405456975670631 3.4615610962869443 -1.7454549788609586 2.0923359643473392 3.373413797587749 -1.678001680743902 2.0441262311276143 3.2852664988885532 -1.6105483826268456 1.9959164979078896 3.1971192001893578 -1.5430950845097891 1.9477067646881652 3.108971901490162 -1.4756417863927327 2.0953792054216938 3.5927176620793029 -1.8088217562295201 2.0471694722019689 3.5045703633801066 -1.7413684581124635 1.9989597389822444 3.4164230646809113 -1.673915159995407 1.9507500057625198 3.3282757659817155 -1.6064618618783506 1.9025402725427951 3.2401284672825197 -1.5390085637612942 2.0020029800565995 3.6357269291724652 -1.8047352354810251 1.9537932468368744 3.547579630473269 -1.7372819373639685 1.9055835136171499 3.4594323317740736 -1.6698286392469122 1.8573737803974253 3.3712850330748778 -1.6023753411298558 1.908626754691505 3.6787361962656275 -1.8006487147325301 1.8604170214717799 3.5905888975664313 -1.7331954166154737 1.8122072882520552 3.5024415988672359 -1.6657421184984171 1.8152505293264105 3.7217454633587894 -1.7965621939840353 1.7670407961066856 3.6335981646595936 -1.7291088958669787 1.721874303961316 3.7647547304519517 -1.7924756732355402 1.8675102529912617 3.1447661309911683 -1.4714544054716083 1.8209836066805132 3.2766672928864007 -1.5348315916690243 1.788533486936009 3.1798926289405691 -1.4672576902235726 1.7744569603697642 3.4085684547816331 -1.5982087778664402 1.7420068406252602 3.3117937908358019 -1.5306348764209885 1.7095567208807561 3.2150191268899704 -1.4630609749755366 1.7279303140590156 3.5404696166768654 -1.6615859640638564 1.6954801943145115 3.4436949527310339 -1.5940120626184044 1.6630300745700075 3.3469202887852028 -1.5264381611729525 1.6305799548255033 3.2501456248393712 -1.4588642597275008 1.6814036677482669 3.6723707785720978 -1.7249631502612723 1.6489535480037629 3.5755961146262667 -1.6573892488158206 1.6165034282592587 3.4788214506804351 -1.5898153473703687 1.5840533085147548 3.3820467867346036 -1.5222414459249167 1.5516031887702506 3.285272122788772 -1.4546675444794648 1.6348770214375181 3.8042719404673302 -1.7883403364586883 1.6024269016930139 3.7074972765214991 -1.7207664350132363 1.56997678194851 3.6107226125756675 -1.6531925335677846 1.537526662204006 3.5139479486298359 -1.5856186321223327 1.5050765424595018 3.4171732846840048 -1.5180447306768807 1.4726264227149979 3.3203986207381733 -1.450470829231429 1.3936496566597452 3.3555251186875741 -1.446274113983393 2.9835395857838236 2.9838202031799117 -1.8377009590147788 2.9057207023062759 3.043457571264355 -1.8355071427928722 2.8402621912703325 2.9669695197431976 -1.7679278776849408 2.7748036802343896 2.890481468222041 -1.7003486125770093 2.7093451691984463 2.8139934167008835 -1.6327693474690779 2.6438866581625033 2.7375053651797265 -1.5651900823611464 2.57842814712656 2.6610173136585695 -1.497610817253215 2.8279018188287282 3.1030949393487983 -1.8333133265709656 2.7624433077927848 3.0266068878276409 -1.7657340614630341 2.6969847967568419 2.9501188363064843 -1.6981547963551027 2.6315262857208985 2.8736307847853269 -1.6305755312471713 2.5660677746849556 2.7971427332641698 -1.5629962661392398 2.7500829353511804 3.1627323074332416 -1.831119510349059 2.6846244243152371 3.0862442559120842 -1.7635402452411275 2.6191659132792942 3.0097562043909276 -1.6959609801331961 2.5537074022433508 2.9332681528697702 -1.6283817150252646 2.4882488912074074 2.8567801013486132 -1.5608024499173332 2.6722640518736327 3.2223696755176849 -1.8289256941271523 2.6068055408376893 3.1458816239965275 -1.7613464290192209 2.5413470298017464 3.0693935724753705 -1.6937671639112897 2.4758885187658031 2.9929055209542135 -1.6261878988033582 2.594445168396085 3.2820070436021282 -1.8267318779052457 2.5289866573601416 3.2055189920809708 -1.7591526127973143 2.4635281463241987 3.1290309405598138 -1.6915733476893831 2.5166262849185372 3.3416444116865716 -1.8245380616833391 2.4511677738825943 3.2651563601654141 -1.7569587965754079 2.4388074014409895 3.4012817797710144 -1.8223442454614327 2.5154727525525336 2.5824629563904624 -1.4300252974962033 2.5007144420074625 2.7205678577179118 -1.495416738217439 2.4500573523301488 2.6318613327530742 -1.4278004881358177 2.4352990417850777 2.7699662340805236 -1.4931919288570534 2.384641952107764 2.681259709115686 -1.4255756787754321 2.4205407312400067 2.9080711354079734 -1.5585833695782891 2.3698836415626929 2.8193646104431354 -1.4909671194966678 2.3192265518853792 2.7306580854782978 -1.4233508694150465 2.4057824206949356 3.0461760367354231 -1.6239748102995248 2.3551253310176219 2.9574695117705851 -1.5563585602179035 2.3044682413403081 2.8687629868057472 -1.4887423101362822 2.2538111516629944 2.7800564618409096 -1.4211260600546609 2.3910241101498642 3.1842809380628725 -1.6893662510207605 2.3403670204725509 3.0955744130980349 -1.6217500009391392 2.2897099307952371 3.0068678881331969 -1.5541337508575179 2.2390528411179234 2.9181613631683589 -1.4865175007758966 2.18839575144061 2.8294548382035214 -1.4189012506942753 2.3762657996047931 3.3223858393903218 -1.754757691741996 2.3256087099274794 3.2336793144254843 -1.6871414416603749 2.2749516202501661 3.1449727894606463 -1.6195251915787536 2.2242945305728523 3.0562662644958087 -1.5519089414971323 2.1736374408955386 2.9675597395309707 -1.484292691415511 2.1229803512182253 2.8788532145661332 -1.4166764413338897 2.3615074890597221 3.4604907407177716 -1.8201491324632317 2.3108503993824083 3.3717842157529332 -1.7525328823816104 2.2601933097050946 3.2830776907880956 -1.6849166322999893 2.2095362200277813 3.1943711658232581 -1.617300382218368 2.1588791303504675 3.1056646408584205 -1.5496841321367467 2.1082220406731538 3.0169581158935825 -1.4820678820551254 2.0575649509958409 2.928251590928745 -1.4144516319735041 3.4777465557734422 2.3989712228346498 -1.8450623099405701 3.3981756945253627 2.3370704552956991 -1.7773984230847308 3.3186048332772842 2.2751696877567484 -1.7097345362288918 3.2390339720292047 2.2132689202177973 -1.6420706493730524 3.1594631107811262 2.1513681526788462 -1.5744067625172133 3.0798922495330472 2.0894673851398951 -1.5067428756613741 3.0003213882849682 2.0275666176009439 -1.4390789888055351 3.4157364952605844 2.4723719014048209 -1.8441427932287195 3.336165634012505 2.4104711338658702 -1.7764789063728803 3.2565947727644264 2.3485703663269195 -1.7088150195170413 3.177023911516347 2.2866695987879684 -1.6411511326612018 3.0974530502682684 2.2247688312490173 -1.5734872458053628 3.0178821890201895 2.1628680637100661 -1.5058233589495236 3.3537264347477267 2.545772579974992 -1.843223276516869 3.2741555734996473 2.4838718124360408 -1.7755593896610298 3.1945847122515687 2.4219710448970906 -1.7078955028051908 3.1150138510034893 2.3600702773581395 -1.6402316159493513 3.0354429897554107 2.2981695098191883 -1.5725677290935123 3.291716374234869 2.619173258545163 -1.8423037598050185 3.2121455129867895 2.5572724910062119 -1.7746398729491792 3.132574651738711 2.4953717234672612 -1.7069759860933402 3.0530037904906315 2.4334709559283101 -1.639312099237501 3.2297063137220112 2.6925739371153341 -1.8413842430931682 3.1501354524739318 2.630673169576383 -1.7737203562373287 3.0705645912258532 2.5687724020374323 -1.7060564693814897 2.9909937299777738 2.5068716344984812 -1.6383925825256505 3.1676962532091535 2.7659746156855047 -1.8404647263813176 3.0881253919610741 2.7040738481465536 -1.7728008395254784 3.0085545307129955 2.6421730806076029 -1.7051369526696392 3.1056861926962953 2.8393752942556754 -1.8395452096694673 3.0261153314482163 2.7774745267167242 -1.7718813228136279 3.0436761321834371 2.9127759728258464 -1.8386256929576168 2.9451383887516962 2.0926264990900951 -1.4381501017718559 2.9602746928969106 2.2308900154284621 -1.5048977996015631 2.8927737257886266 2.1542431458537372 -1.4372173464966649 2.975410997042125 2.3691535317668286 -1.5716454974312704 2.907910029933841 2.2925066621921042 -1.5039650443263721 2.8404090628255569 2.2158597926173793 -1.4362845912214739 2.9230463340790553 2.4307701785304712 -1.5707127421560794 2.8555453669707713 2.3541233089557467 -1.5030322890511811 2.7880443998624873 2.2774764393810214 -1.4353518359462829 2.9381826382242702 2.5690336948688377 -1.6374604399857864 2.8706816711159857 2.4923868252941133 -1.5697799868808884 2.8031807040077017 2.4157399557193888 -1.5020995337759901 2.7356797368994177 2.3390930861446639 -1.4344190806710919 2.9533189423694846 2.7072972112072042 -1.7042081378154936 2.8858179752612005 2.6306503416324798 -1.6365276847105954 2.8183170081529165 2.5540034720577554 -1.5688472316056974 2.7508160410446321 2.4773566024830309 -1.5011667785007992 2.683315073936348 2.400709732908306 -1.4334863253959009 2.9684552465146989 2.8455607275455712 -1.7709558356452009 2.9009542794064149 2.7689138579708468 -1.7032753825403026 2.8334533122981309 2.6922669883961219 -1.6355949294354044 2.7659523451898469 2.6156201188213979 -1.5679144763305064 2.6984513780815624 2.538973249246673 -1.5002340232256082 2.6309504109732784 2.4623263796719486 -1.4325535701207099 2.9160905835516293 2.9071773743092133 -1.7700230803700099 2.8485896164433453 2.8305305047344889 -1.7023426272651117 2.7810886493350613 2.7538836351597644 -1.6346621741602134 2.7135876822267773 2.67723676558504 -1.5669817210553152 2.6460867151184932 2.6005898960103155 -1.499301267950417 2.5785857480102092 2.5239430264355907 -1.4316208148455187 3.8941489767103592 1.6505205852671989 -1.8465106339611728 3.803843195591567 1.605494813532 -1.7787869566929593 3.7135374144727744 1.560469041796801 -1.7110632794247462 3.6232316333539822 1.5154432700616023 -1.6433396021565327 3.5329258522351901 1.4704174983264036 -1.5756159248883195 3.8490826942084899 1.7345133705957219 -1.8464092589080268 3.7587769130896977 1.6894875988605227 -1.7786855816398133 3.6684711319709051 1.644461827125324 -1.7109619043716002 3.578165350852113 1.5994360553901252 -1.6432382271033867 3.4878595697333208 1.5544102836549265 -1.5755145498351735 3.3975537886145282 1.5093845119197276 -1.50779087256696 3.8040164117066206 1.8185061559242448 -1.8463078838548808 3.713710630587828 1.7734803841890456 -1.7785842065866673 3.6234048494690358 1.7284546124538469 -1.7108605293184542 3.5330990683502437 1.6834288407186482 -1.6431368520502407 3.4427932872314515 1.6384030689834495 -1.5754131747820275 3.7589501292047509 1.9024989412527678 -1.8462065088017348 3.6686443480859583 1.8574731695175686 -1.7784828315335215 3.5783385669671661 1.8124473977823701 -1.7107591542653082 3.488032785848374 1.7674216260471711 -1.6430354769970947 3.3977270047295818 1.7223958543119724 -1.5753117997288815 3.7138838467028816 1.9864917265812905 -1.846105133748589 3.623578065584089 1.9414659548460915 -1.7783814564803755 3.5332722844652968 1.896440183110893 -1.7106577792121622 3.4429665033465042 1.8514144113756941 -1.642934101943949 3.6688175642010119 2.0704845119098132 -1.846003758695443 3.5785117830822197 2.0254587401746145 -1.7782800814272297 3.4882060019634276 1.9804329684394157 -1.7105564041590162 3.6237512816991426 2.1544772972383361 -1.8459023836422972 3.53344550058035 2.1094515255031374 -1.7781787063740837 3.5786849991972733 2.2384700825668591 -1.8458010085891512 3.4883792180784807 2.1934443108316599 -1.7780773313209379 3.5336187166954036 2.322462867895382 -1.8456996335360054 3.3100253171173035 1.4591605023479439 -1.4400664809566994 3.3532933991236664 1.5918689225573166 -1.5076892902329049 3.2719056609872283 1.5301514186151062 -1.4399633191861971 3.3151737429935912 1.6628598388244789 -1.5075861284624026 3.2337860048571532 1.6011423348822684 -1.4398601574156948 3.3584418249999546 1.7955682590338515 -1.575208937738608 3.2770540868635161 1.7338507550916411 -1.5074829666919003 3.1956663487270784 1.6721332511494307 -1.4397569956451925 3.4017099070063175 1.9282766792432244 -1.6428317470148137 3.3203221688698794 1.8665591753010138 -1.5751057759681057 3.2389344307334413 1.8048416713588034 -1.507379804921398 3.1575466925970037 1.7431241674165929 -1.4396538338746903 3.4449779890126804 2.0609850994525973 -1.7104545562910194 3.3635902508762423 1.9992675955103867 -1.6427285852443114 3.2822025127398042 1.937550091568176 -1.5750026141976035 3.2008147746033662 1.8758325876259656 -1.5072766431508957 3.1194270364669285 1.8141150836837552 -1.4395506721041877 3.4068583328826052 2.1319760157197596 -1.7103513945205171 3.3254705947461671 2.0702585117775492 -1.6426254234738091 3.2440828566097295 2.0085410078353383 -1.5748994524271012 3.1626951184732914 1.9468235038931279 -1.5071734813803932 3.0813073803368538 1.8851059999509174 -1.4394475103336855 3.4501264148889677 2.2646844359291318 -1.7779742037967228 3.36873867675253 2.2029669319869218 -1.7102482327500148 3.287350938616092 2.1412494280447114 -1.6425222617033066 3.2059632004796543 2.0795319241025005 -1.5747962906565989 3.1245754623432163 2.0178144201602901 -1.5070703196098909 3.0431877242067786 1.9560969162180797 -1.4393443485631829 4.1434238252065319 0.83318237173445775 -1.8428089099203826 4.0459742907009524 0.80670987129322369 -1.7750379914677563 4.1164496176585397 0.92432597162640173 -1.8432418920602407 4.0190000831529602 0.89785347118516767 -1.7754709736076144 3.9215505486473807 0.87138097074393361 -1.7077000551549884 3.8241010141418013 0.84490847030269967 -1.6399291367023621 3.7266514796362218 0.81843596986146561 -1.5721582182497358 3.6292019451306423 0.79196346942023155 -1.5043872997971095 4.0894754101105475 1.0154695715183455 -1.8436748742000988 3.992025875604968 0.98899707107711166 -1.7759039557474725 3.8945763410993886 0.9625245706358776 -1.7081330372948464 3.7971268065938091 0.93605207019464365 -1.6403621188422202 3.6996772720882296 0.90957956975340959 -1.5725912003895939 3.6022277375826501 0.88310706931217553 -1.5048202819369676 4.0625012025625553 1.1066131714102894 -1.8441078563399569 3.9650516680569758 1.0801406709690555 -1.7763369378873306 3.8676021335513964 1.0536681705278215 -1.7085660194347045 3.7701525990458169 1.0271956700865876 -1.6407951009820783 3.6727030645402374 1.0007231696453536 -1.573024182529452 4.0355269950145631 1.1977567713022332 -1.844540838479815 3.9380774605089837 1.1712842708609994 -1.7767699200271887 3.8406279260034042 1.1448117704197653 -1.7089990015745626 3.7431783914978252 1.1183392699785315 -1.6412280831219364 4.008552787466571 1.2889003711941771 -1.8449738206196731 3.9111032529609915 1.2624278707529435 -1.7772029021670468 3.8136537184554125 1.2359553703117094 -1.7094319837144207 3.9815785799185792 1.380043971086121 -1.8454068027595312 3.8841290454129993 1.3535714706448874 -1.7776358843069049 3.7866795109074203 1.3270989702036533 -1.7098649658542788 3.954604372370587 1.4711875709780649 -1.8458397848993893 3.8571548378650076 1.4447150705368312 -1.7780688664467632 3.9276301648225949 1.5623311708700089 -1.8462727670392476 3.5326094907087846 0.76267129985498261 -1.4366175010989728 3.5098496537827142 0.83995023185244 -1.4370559892125601 3.5790512862962442 0.96175660210968483 -1.505258225753926 3.4870898168566433 0.9172291638498975 -1.4374944773261473 3.6482529188097743 1.0835629723669293 -1.5734604622952915 3.5562914493701738 1.0390355341071422 -1.5056967138675132 3.4643299799305729 0.99450809584735489 -1.4379329654397348 3.7174545513233048 1.2053693426241741 -1.6416626988366572 3.6254930818837035 1.1608419043643869 -1.5738989504088787 3.533531612444103 1.1163144661045996 -1.5061352019811005 3.441570143004502 1.0717870278448123 -1.4383714535533221 3.694694714397234 1.2826482746216314 -1.6421011869502444 3.602733244957633 1.2381208363618443 -1.5743374385224662 3.5107717755180321 1.193593398102057 -1.5065736900946878 3.4188103060784316 1.1490659598422697 -1.4388099416669096 3.763896346910764 1.4044546448788762 -1.7103034234916101 3.6719348774711631 1.3599272066190888 -1.6425396750638319 3.5799734080315626 1.3153997683593017 -1.5747759266360535 3.4880119385919617 1.2708723300995144 -1.5070121782082753 3.3960504691523608 1.2263448918397271 -1.4392484297804968 3.8330979794242936 1.5262610151361209 -1.7785056600329758 3.7411365099846932 1.4817335768763336 -1.7107419116051976 3.6491750405450927 1.4372061386165462 -1.6429781631774192 3.5572135711054917 1.3926787003567591 -1.575214414749641 3.4652521016658908 1.3481512620969718 -1.5074506663218625 3.3732906322262903 1.3036238238371847 -1.4396869178940843 3.4424922647398204 1.4254301940944292 -1.50788915443545 3.3505307953002195 1.3809027558346421 -1.4401254060076716 4.2101048038373223 0.077588506779064037 -1.8364758460635833 4.1092973863379587 0.070686988361582936 -1.7686642952428477 4.008489968838596 0.063785469944102058 -1.7008527444221127 3.9076825513392333 0.056883951526620957 -1.6330411936013776 3.8068751338398701 0.049982433109140051 -1.5652296427806422 3.7060677163405069 0.043080914691658992 -1.4974180919599072 4.2019712270058411 0.17226152013583029 -1.837271580747885 4.1011638095064784 0.16536000171834919 -1.7694600299271495 4.0003563920071148 0.15845848330086831 -1.7016484791064144 3.8995489745077525 0.15155696488338721 -1.6338369282856793 3.7987415570083889 0.14465544646590625 -1.566025377464944 3.6979341395090257 0.13775392804842515 -1.4982138266442089 4.1938376501743599 0.26693453349259655 -1.8380673154321867 4.0930302326749972 0.26003301507511545 -1.7702557646114512 3.992222815175634 0.25313149665763451 -1.7024442137907161 3.8914153976762713 0.24622997824015344 -1.634632662969981 3.7906079801769081 0.23932845982267245 -1.5668211121492457 4.1857040733428788 0.36160754684936303 -1.8388630501164884 4.084896655843516 0.35470602843188193 -1.7710514992957529 3.9840892383441533 0.34780451001440094 -1.7032399484750178 3.8832818208447906 0.34090299159691995 -1.6354283976542827 4.1775704965113984 0.45628056020612928 -1.8396587848007901 4.0767630790120357 0.44937904178864818 -1.7718472339800546 3.9759556615126725 0.44247752337116719 -1.7040356831593195 4.1694369196799173 0.55095357356289543 -1.8404545194850919 4.0686295021805554 0.54405205514541444 -1.7726429686643563 3.9678220846811918 0.53715053672793345 -1.7048314178436212 4.1613033428484361 0.64562658691966168 -1.8412502541693936 4.0604959253490742 0.63872506850218069 -1.7734387033486581 4.1531697660169558 0.74029960027642794 -1.8420459888536951 3.6053649560856438 0.035128062432888574 -1.4296072827500237 3.5986551782342633 0.11549831005062483 -1.4304131066047343 3.6908833549798357 0.22154975659179055 -1.4990172340942649 3.5919454003828828 0.19586855766836109 -1.4312189304594449 3.7831115317254076 0.32760120313295643 -1.5676213615837951 3.6841735771284552 0.3019200042095268 -1.4998230579489755 3.5852356225315027 0.27623880528609729 -1.4320247543141555 3.87533970847098 0.43365264967412215 -1.6362254890733254 3.7764017538740275 0.40797145075069263 -1.5684271854385057 3.6774637992770751 0.38229025182726306 -1.5006288818036861 3.5785258446801222 0.35660905290383349 -1.4328305781688662 3.8686299306195999 0.51402289729185835 -1.6370313129280363 3.7696919760226475 0.48834169836842883 -1.5692330092932165 3.6707540214256946 0.46266049944499926 -1.5014347056583968 3.5718160668287422 0.43697930052156969 -1.4336364020235768 3.9608581073651723 0.62007434383302429 -1.7056354404175667 3.8619201527682199 0.59439314490959461 -1.6378371367827469 3.762982198171267 0.56871194598616504 -1.5700388331479271 3.6640442435743146 0.54303074706273546 -1.5022405295131074 3.5651062889773617 0.51734954813930589 -1.4344422258782876 4.0530862841107442 0.72612579037419001 -1.774239567907097 3.9541483295137922 0.70044459145076055 -1.7064412642722775 3.8552103749168394 0.67476339252733086 -1.6386429606374577 3.756272420319887 0.64908219360390129 -1.570844657002638 3.6573344657229341 0.62340099468047172 -1.503046353367818 3.5583965111259817 0.59771979575704215 -1.4352480497329982 3.9474385516624118 0.78081483906849669 -1.7072470881269881 3.8485005970654593 0.75513364014506712 -1.6394487844921684 3.7495626424685065 0.72945244122163755 -1.5716504808573486 3.650624687871554 0.70377124229820787 -1.5038521772225288 3.5516867332746012 0.6780900433747783 -1.4360538735877091 4.128070737480857 -0.76960419603784824 -1.827203885255763 4.0278073752799441 -0.7566197336718834 -1.759355542923895 3.9275440130790322 -0.74363527130591878 -1.6915072005920271 3.8272806508781203 -0.73065080893995416 -1.6236588582601592 3.7270172886772079 -0.71766634657398931 -1.5558105159282916 3.6267539264762956 -0.70468188420802458 -1.4879621735964237 3.5264905642753837 -0.69169742184205973 -1.4201138312645558 4.138955205925833 -0.67509785731729688 -1.8282572064159288 4.0386918437249202 -0.66211339495133203 -1.7604088640840607 3.9384284815240083 -0.64912893258536741 -1.6925605217521926 3.8381651193230963 -0.63614447021940279 -1.6247121794203248 3.737901757122184 -0.62316000785343795 -1.5568638370884571 3.6376383949212716 -0.61017554548747321 -1.4890154947565892 4.149839674370809 -0.58059151859674551 -1.8293105275760944 4.0495763121698962 -0.56760705623078067 -1.7614621852442263 3.9493129499689843 -0.55462259386481605 -1.6936138429123584 3.8490495877680724 -0.54163813149885132 -1.6257655005804905 3.74878622556716 -0.52865366913288658 -1.5579171582486226 4.1607241428157851 -0.48608517987619415 -1.8303638487362601 4.0604607806148723 -0.47310071751022931 -1.762515506404392 3.9601974184139603 -0.46011625514426469 -1.6946671640725239 3.8599340562130484 -0.4471317927782999 -1.6268188217406561 4.1716086112607611 -0.39157884115564279 -1.8314171698964257 4.0713452490598483 -0.37859437878967794 -1.7635688275645576 3.9710818868589364 -0.36560991642371332 -1.6957204852326897 4.1824930797057371 -0.29707250243509131 -1.8324704910565914 4.0822297175048243 -0.28408804006912652 -1.7646221487247233 3.9819663553039124 -0.27110357770316179 -1.6967738063928552 4.1933775481507132 -0.20256616371453992 -1.833523812216757 4.0931141859498004 -0.18958170134857522 -1.7656754698848889 4.2042620165956892 -0.10805982499398858 -1.8345771333769227 3.5360135365275167 -0.61120763840604841 -1.4211798571782637 3.647604366124074 -0.52512510347915653 -1.490077386841266 3.5455116269479676 -0.53097401254960919 -1.4222461152759034 3.7591951957206318 -0.43904256855226437 -1.5589749165042683 3.6571024565445249 -0.4448914776227173 -1.4911436449389057 3.5550097173684185 -0.45074038669316996 -1.4233123733735431 3.8707860253171895 -0.35296003362537232 -1.6278724461672707 3.7686932861410827 -0.35880894269582519 -1.5600411746019081 3.6666005469649758 -0.36465785176627813 -1.4922099030365454 3.5645078077888694 -0.37050676083673079 -1.424378631471183 3.8802841157376404 -0.27272640776893303 -1.6289387042649104 3.7781913765615336 -0.27857531683938591 -1.5611074326995478 3.6760986373854267 -0.28442422590983879 -1.4932761611341854 3.5740058982093204 -0.2902731349802915 -1.4254448895688228 3.9918749453341977 -0.18664387284204098 -1.6978362339279127 3.8897822061580913 -0.19249278191249386 -1.6300049623625501 3.7876894669819845 -0.19834169098294674 -1.5621736907971877 3.6855967278058777 -0.20419060005339956 -1.4943424192318251 3.5835039886297713 -0.21003950912385233 -1.4265111476664627 4.103465774930755 -0.10056133791514901 -1.7667337635909153 4.0013730357546482 -0.10641024698560181 -1.6989024920255527 3.8992802965785422 -0.11225915605605467 -1.63107122046019 3.7971875574024354 -0.11810806512650754 -1.5632399488948274 3.6950948182263286 -0.1239569741969604 -1.495408677329465 3.5930020790502222 -0.12980588326741316 -1.4275774057641024 4.2150566045273132 -0.014478802988256807 -1.8356312932539178 4.1129638653512055 -0.020327712058709719 -1.7678000216885552 4.0108711261750996 -0.026176621129162518 -1.6999687501231924 3.9087783869989932 -0.032025530199615411 -1.6321374785578298 3.8066856478228863 -0.037874439270068228 -1.5643062069924674 3.7045929086467795 -0.04372334834052112 -1.4964749354271047 3.6025001694706726 -0.049572257410973902 -1.4286436638617424 3.874754591674026 -1.5818118293206935 -1.8160969537551477 3.7789495501902923 -1.5493468381513296 -1.7482146840053796 3.6831445087065582 -1.5168818469819658 -1.6803324142556118 3.5873394672228236 -1.4844168558126021 -1.6124501445058437 3.9042005678305132 -1.4911280004469398 -1.8173416947998926 3.8083955263467795 -1.4586630092775759 -1.7494594250501245 3.7125904848630453 -1.4261980181082121 -1.6815771553003569 3.6167854433793107 -1.3937330269388484 -1.6136948855505888 3.5209804018955762 -1.3612680357694846 -1.545812615800821 3.4251753604118416 -1.3288030446001209 -1.4779303460510529 3.9336465439870003 -1.4004441715731861 -1.8185864358446375 3.8378415025032666 -1.3679791804038222 -1.7507041660948697 3.7420364610195325 -1.3355141892344584 -1.6828218963451018 3.6462314195357979 -1.3030491980650947 -1.614939626595334 3.5504263780520633 -1.2705842068957311 -1.5470573568455659 3.9630925201434875 -1.3097603426994324 -1.8198311768893827 3.8672874786597533 -1.2772953515300685 -1.7519489071396146 3.7714824371760192 -1.2448303603607047 -1.684066637389847 3.6756773956922846 -1.212365369191341 -1.6161843676400789 3.9925384962999746 -1.2190765138256785 -1.8210759179341276 3.8967334548162404 -1.1866115226563145 -1.7531936481843597 3.8009284133325063 -1.1541465314869508 -1.6853113784345919 3.7051233718487717 -1.1216815403175873 -1.617429108684824 4.0219844724564613 -1.1283926849519248 -1.8223206589788727 3.9261794309727271 -1.0959276937825608 -1.7544383892291047 3.830374389488993 -1.0634627026131971 -1.686556119479337 4.0514304486129484 -1.0377088560781711 -1.8235654000236177 3.9556254071292143 -1.0052438649088071 -1.7556831302738498 4.0808764247694356 -0.94702502720441739 -1.8248101410683628 4.1103224009259218 -0.85634119833066369 -1.8260548821131077 3.4521859316982804 -1.2461911168794484 -1.47918355498479 3.5787810548854009 -1.1835173783709623 -1.5483058923319002 3.4774803520407751 -1.1692671965014736 -1.4804427309656762 3.6040754752278956 -1.1065934579929875 -1.5495650683127864 3.5027747723832698 -1.0923432761234988 -1.4817019069465625 3.7306705984150161 -1.0439197194845016 -1.6186874056598965 3.6293698955703904 -1.0296695376150127 -1.5508242442936726 3.5280691927257646 -1.015419355745524 -1.4829610829274487 3.4267684898811384 -1.0011691738760353 -1.4150979215612247 3.8572657216021371 -0.98124598097601545 -1.6878097430070067 3.7559650187575109 -0.96699579910652678 -1.6199465816407828 3.6546643159128851 -0.95274561723703799 -1.5520834202745588 3.5533636130682593 -0.93849543536754931 -1.4842202589083349 3.4520629102236331 -0.92424525349806053 -1.4163570975421109 3.9838608447892576 -0.91857224246752944 -1.7569320803541166 3.8825601419446314 -0.90432206059804077 -1.6890689189878929 3.7812594391000056 -0.89007187872855209 -1.621205757621669 3.6799587362553794 -0.8758216968590633 -1.553342596255445 3.5786580334107536 -0.86157151498957463 -1.4854794348892211 3.4773573305661278 -0.84732133312008584 -1.4176162735229971 4.0091552651317519 -0.84164832208955476 -1.7581912563350028 3.9078545622871261 -0.82739814022006608 -1.6903280949687791 3.8065538594424999 -0.8131479583505774 -1.6224649336025552 3.7052531565978741 -0.79889777648108862 -1.554601772236331 3.6039524537532484 -0.78464759461159994 -1.4867386108701073 3.5026517509086221 -0.77039741274211115 -1.4188754495038833 3.5078833256297246 -2.241945991001574 -1.8049771853284289 3.4203570561591756 -2.1911219937575779 -1.7370642007490971 3.3328307866886266 -2.1402979965135827 -1.6691512161697655 3.2453045172180772 -2.089473999269587 -1.6012382315904337 3.1577782477475282 -2.0386500020255909 -1.5333252470111018 3.0702519782769793 -1.9878260047815952 -1.46541226243177 3.5547935019884664 -2.1585842983538992 -1.8063701309934206 3.4672672325179175 -2.1077603011099031 -1.7384571464140888 3.3797409630473685 -2.0569363038659079 -1.6705441618347572 3.2922146935768191 -2.0061123066219118 -1.6026311772554254 3.2046884241062701 -1.9552883093779159 -1.5347181926760933 3.6017036783472083 -2.075222605706224 -1.8077630766584123 3.5141774088766593 -2.0243986084622279 -1.7398500920790805 3.4266511394061103 -1.9735746112182329 -1.6719371074997487 3.3391248699355609 -1.9227506139742367 -1.6040241229204169 3.6486138547059501 -1.991860913058549 -1.809156022323404 3.5610875852354011 -1.9410369158145531 -1.7412430377440722 3.4735613157648522 -1.8902129185705576 -1.6733300531647404 3.3860350462943032 -1.8393889213265617 -1.6054170685854086 3.695524031064692 -1.9084992204108739 -1.8105489679883957 3.607997761594143 -1.8576752231668783 -1.7426359834090639 3.520471492123594 -1.8068512259228826 -1.6747229988297319 3.7424342074234338 -1.8251375277631989 -1.8119419136533872 3.6549079379528848 -1.7743135305192033 -1.7440289290740554 3.7893443837821756 -1.7417758351155241 -1.8133348593183789 3.836254560140917 -1.6584141424678491 -1.8147278049833704 3.1136345820802229 -1.9110877605832841 -1.4668127485448588 3.2502955627690588 -1.8743732292012654 -1.5361139236808505 3.1537424185476155 -1.8404982921483126 -1.4682202347161286 3.2904033992364514 -1.8037837607662939 -1.5375214098521204 3.1938502550150081 -1.7699088237133411 -1.4696277208873982 3.4270643799252873 -1.7670692293842751 -1.6068225849881124 3.330511235703844 -1.7331942923313224 -1.53892889602339 3.2339580914824007 -1.6993193552783699 -1.4710352070586681 3.5637253606141233 -1.7303546980022562 -1.6761237601241041 3.4671722163926799 -1.6964797609493036 -1.608230071159382 3.3706190721712366 -1.6626048238963509 -1.5403363821946598 3.2740659279497932 -1.6287298868433984 -1.4724426932299377 3.7003863413029587 -1.6936401666202374 -1.7454249352600961 3.6038331970815158 -1.6597652295672849 -1.6775312462953738 3.5072800528600725 -1.6258902925143324 -1.6096375573306516 3.4107269086386292 -1.5920153554613796 -1.5417438683659295 3.3141737644171858 -1.5581404184084269 -1.4738501794012075 3.7404941777703513 -1.6230506981852661 -1.7468324214313657 3.6439410335489084 -1.5891757611323136 -1.6789387324666436 3.5473878893274651 -1.5553008240793609 -1.6110450435019215 3.4508347451060217 -1.5214258870264081 -1.5431513545371993 3.3542816008845784 -1.4875509499734556 -1.4752576655724772 3.4909425815734143 -1.4508364185914369 -1.5445588407084689 3.3943894373519714 -1.4169614815384841 -1.476665151743747 2.9663287744153246 -2.8963184011307872 -1.7914718545507897 2.8907109464691487 -2.8289551104702588 -1.7235329226170957 2.8150931185229724 -2.7615918198097305 -1.6555939906834016 2.7394752905767961 -2.6942285291492016 -1.5876550587497076 2.6638574626306197 -2.6268652384886733 -1.5197161268160135 2.5882396346844434 -2.5595019478281444 -1.4517771948823195 3.0289918038512247 -2.823510597405325 -1.7929827960632752 2.9533739759050488 -2.7561473067447966 -1.7250438641295811 2.8777561479588725 -2.6887840160842682 -1.6571049321958871 2.8021383200126961 -2.6214207254237394 -1.589166000262193 2.7265204920665198 -2.554057434763211 -1.521227068328499 3.0916548332871248 -2.7507027936798627 -1.7944937375757606 3.0160370053409489 -2.6833395030193343 -1.7265548056420665 2.9404191773947725 -2.615976212358806 -1.6586158737083727 2.8648013494485962 -2.5486129216982771 -1.5906769417746787 3.1543178627230253 -2.6778949899544005 -1.7960046790882462 3.0787000347768489 -2.6105316992938721 -1.7280657471545522 3.0030822068306726 -2.5431684086333437 -1.6601268152208581 2.9274643788844967 -2.4758051179728149 -1.5921878832871641 3.2169808921589258 -2.6050871862289382 -1.7975156206007317 3.1413630642127495 -2.5377238955684098 -1.7295766886670376 3.0657452362665731 -2.470360604907881 -1.6616377567333438 3.2796439215948259 -2.532279382503476 -1.7990265621132173 3.2040260936486495 -2.4649160918429476 -1.7310876301795233 3.3423069510307259 -2.4594715787780137 -1.8005375036257028 3.4049699804666265 -2.3866637750525515 -1.8020484451381884 2.6467443574041107 -2.491774666066668 -1.4532939336680144 2.7880909061428465 -2.4825845629490559 -1.5227395331027795 2.7001321138566583 -2.4302991741040518 -1.4548178062351924 2.8414786625953941 -2.4211090709864398 -1.5242634056699575 2.7535198703092059 -2.3688236821414357 -1.4563416788023704 2.9828252113341294 -2.4119189678688273 -1.5937090051047225 2.8948664190479416 -2.3596335790238236 -1.5257872782371356 2.8069076267617534 -2.3073481901788195 -1.4578655513695484 3.1241717600728651 -2.4027288647512153 -1.6631546045394876 3.0362129677866769 -2.3504434759062112 -1.5952328776719005 2.9482541755004892 -2.2981580870612071 -1.5273111508043136 2.860295383214301 -2.2458726982162029 -1.4593894239367264 3.2655183088116009 -2.3935387616336028 -1.7326002039742527 3.1775595165254127 -2.3412533727885991 -1.6646784771066656 3.0896007242392245 -2.288967983943595 -1.5967567502390785 3.0016419319530367 -2.2366825950985909 -1.5288350233714916 2.9136831396668481 -2.1843972062535868 -1.4609132965039044 3.3189060652641484 -2.3320632696709866 -1.7341240765414307 3.2309472729779602 -2.279777880825983 -1.6662023496738436 3.1429884806917721 -2.2274924919809789 -1.5982806228062565 3.0550296884055839 -2.1752071031359748 -1.5303588959386696 2.9670708961193957 -2.1229217142909702 -1.4624371690710825 3.4602526140028842 -2.3228731665533746 -1.8035696759761957 3.372293821716696 -2.2705877777083705 -1.7356479491086085 3.2843350294305078 -2.2183023888633664 -1.6677262222410216 3.1963762371443196 -2.1660170000183623 -1.5998044953734345 3.108417444858131 -2.1137316111733582 -1.5318827685058476 3.0204586525719428 -2.0614462223283541 -1.4639610416382605 2.361888585325489 -3.5081045587320849 -1.8450234200547952 2.3015369487969002 -3.426697005098108 -1.777066110115628 2.2411853122683123 -3.3452894514641303 -1.7091088001764607 2.438031930433429 -3.4487074733033092 -1.8466282677273045 2.3776802939048403 -3.3672999196693323 -1.7786709577881372 2.3173286573762524 -3.2858923660353545 -1.71071364784897 2.2569770208476645 -3.2044848124013776 -1.6427563379098029 2.1966253843190766 -3.1230772587674003 -1.5747990279706356 2.1362737477904883 -3.0416697051334229 -1.5068417180314686 2.4538236390127803 -3.307902834240557 -1.7802758054606465 2.3934720024841925 -3.2264952806065792 -1.7123184955214792 2.3331203659556046 -3.1450877269726023 -1.6443611855823121 2.2727687294270167 -3.063680173338625 -1.5764038756431449 2.5299669841207204 -3.2485057488117812 -1.7818806531331557 2.4696153475921325 -3.1670981951778039 -1.7139233431939886 2.4092637110635446 -3.0856906415438266 -1.6459660332548214 2.3489120745349568 -3.0042830879098492 -1.5780087233156543 2.6061103292286605 -3.1891086633830055 -1.7834855008056651 2.5457586927000726 -3.1077011097490281 -1.7155281908664979 2.4854070561714843 -3.0262935561150512 -1.6475708809273308 2.6822536743366001 -3.1297115779542302 -1.7850903484781744 2.6219020378080122 -3.0483040243202528 -1.7171330385390073 2.7583970194445402 -3.0703144925254544 -1.7866951961506838 2.8345403645524803 -3.0109174070966791 -1.7883000438231931 2.0716697649244282 -2.9637584075519245 -1.4388877534128701 2.212030241905413 -2.9825906864890528 -1.5084468700396272 2.1362929757733009 -2.9138331139134133 -1.4405016639742021 2.2766534527542857 -2.9326653928505415 -1.5100607806009592 2.2009161866221736 -2.863907820274902 -1.4421155745355341 2.41701392973527 -2.9514976717876702 -1.5796198972277162 2.3412766636031583 -2.8827400992120302 -1.5116746911622911 2.2655393974710463 -2.8139825266363907 -1.443729485096866 2.5573744067162547 -2.9703299507247989 -1.6491790138544733 2.4816371405841426 -2.9015723781491589 -1.5812338077890482 2.4058998744520306 -2.8328148055735189 -1.5132886017236231 2.3301626083199185 -2.7640572329978794 -1.445343395658198 2.6977348836972395 -2.9891622296619271 -1.7187381304812304 2.6219976175651274 -2.9204046570862876 -1.6507929244158055 2.5462603514330153 -2.8516470845106476 -1.5828477183503802 2.4705230853009033 -2.7828895119350077 -1.5149025122849551 2.3947858191687912 -2.7141319393593681 -1.44695730621953 2.7623580945461121 -2.9392369360234158 -1.7203520410425626 2.6866208284140001 -2.8704793634477763 -1.6524068349771375 2.610883562281888 -2.8017217908721364 -1.5844616289117124 2.5351462961497755 -2.7329642182964964 -1.5165164228462873 2.4594090300176634 -2.6642066457208569 -1.448571216780862 2.9027185715270964 -2.9580692149605445 -1.7899111576693196 2.8269813053949844 -2.8893116423849046 -1.7219659516038945 2.7512440392628723 -2.820554069809265 -1.6540207455384697 2.6755067731307602 -2.7517964972336251 -1.5860755394730444 2.5997695069986482 -2.6830389246579851 -1.5181303334076193 2.5240322408665361 -2.6142813520823456 -1.4501851273421942 1.6695537712889941 -3.8588520740570296 -1.8316342279040687 1.6274715651166551 -3.7665664590400278 -1.7636698694172135 1.585389358944316 -3.6742808440230261 -1.6957055109303583 1.5433071527719773 -3.5819952290060244 -1.627741152443503 1.5012249465996381 -3.4897096139890222 -1.5597767939566478 1.459142740427299 -3.3974239989720205 -1.4918124354697928 1.7564052582283469 -3.8152577149883378 -1.8333092088417844 1.714323052056008 -3.722972099971336 -1.7653448503549292 1.6722408458836688 -3.6306864849543343 -1.6973804918680739 1.6301586397113301 -3.5384008699373326 -1.6294161333812187 1.588076433538991 -3.4461152549203304 -1.5614517748943635 1.5459942273666518 -3.3538296399033287 -1.4934874164075085 1.8432567451676998 -3.771663355919646 -1.8349841897795001 1.8011745389953608 -3.6793777409026442 -1.7670198312926448 1.7590923328230217 -3.5870921258856425 -1.6990554728057896 1.717010126650683 -3.4948065108686404 -1.6310911143189344 1.6749279204783438 -3.4025208958516386 -1.5631267558320792 1.9301082321070526 -3.7280689968509542 -1.8366591707172157 1.8880260259347137 -3.6357833818339524 -1.7686948122303605 1.8459438197623745 -3.5434977668169507 -1.7007304537435053 1.8038616135900358 -3.4512121517999486 -1.6327660952566501 2.0169597190464059 -3.6844746377822624 -1.8383341516549314 1.9748775128740668 -3.5921890227652606 -1.7703697931680762 1.9327953067017276 -3.4999034077482585 -1.702405434681221 2.103811205985759 -3.6408802787135706 -1.8400091325926471 2.0617289998134196 -3.5485946636965688 -1.7720447741057916 2.0196467936410807 -3.4563090486795667 -1.7040804156189364 2.1906626929251116 -3.5972859196448788 -1.8416841135303625 2.1485804867527722 -3.505000304627877 -1.7737197550435073 2.2775141798644647 -3.553691560576187 -1.8433590944680782 1.4133167442597521 -3.3071406376617603 -1.4238487616439035 1.4866782132961629 -3.2707610097571425 -1.425526209624028 1.6202482554008173 -3.3169726536094779 -1.4951647011572418 1.5600396823325737 -3.2343813818525247 -1.4272036576041525 1.7538182975054717 -3.3631842974618129 -1.5648031926904553 1.6936097244372283 -3.2805930257048601 -1.4968421491373662 1.6334011513689846 -3.1980017539479069 -1.4288811055842772 1.8873883396101261 -3.4093959413141484 -1.6344416842236689 1.8271797665418825 -3.3268046695571951 -1.5664806406705798 1.7669711934736392 -3.2442133978002423 -1.4985195971174907 1.7067626204053956 -3.1616221260432891 -1.4305585535644016 1.9607498086465369 -3.3730163134095306 -1.6361191322037933 1.9005412355782934 -3.2904250416525773 -1.5681580886507043 1.84033266251005 -3.2078337698956245 -1.5001970450976154 1.7801240894418067 -3.1252424981386713 -1.4322360015445263 2.0943198507511913 -3.4192279572618656 -1.7057576237370071 2.034111277682948 -3.3366366855049128 -1.637796580183918 1.9739027046147042 -3.2540454137479595 -1.569835536630829 1.9136941315464608 -3.1714541419910067 -1.5018744930777399 1.8534855584782175 -3.0888628702340535 -1.4339134495246508 2.2278898928558455 -3.465439601114201 -1.7753961152702209 2.1676813197876021 -3.3828483293572478 -1.7074350717171316 2.1074727467193588 -3.300257057600295 -1.6394740281640425 2.047264173651115 -3.2176657858433417 -1.5715129846109535 1.9870556005828719 -3.1350745140863889 -1.5035519410578646 1.9268470275146286 -3.0524832423294357 -1.4355908975047755 2.1808342157557696 -3.2638774296956772 -1.6411514761441672 2.1206256426875263 -3.1812861579387239 -1.5731904325910782 2.0604170696192829 -3.0986948861817711 -1.5052293890379891 2.0002084965510396 -3.0161036144248179 -1.4372683454849 0.83079556199980142 -4.1027607350596478 -1.8162176471385785 0.80951594373061841 -4.0034480435989854 -1.7482617440845327 0.78823632546143541 -3.9041353521383235 -1.680305841030487 0.76695670719225251 -3.8048226606776612 -1.6123499379764414 0.7456770889230695 -3.7055099692169988 -1.5443940349223957 0.7243974706538866 -3.6061972777563365 -1.4764381318683499 0.92515193335581858 -4.0768094063319094 -1.8179340006762756 0.90387231508663557 -3.9774967148712466 -1.7499780976222299 0.88259269681745245 -3.8781840234105847 -1.6820221945681841 0.86131307854826966 -3.7788713319499223 -1.6140662915141386 0.84003346027908665 -3.67955864048926 -1.5461103884600929 0.81875384200990364 -3.5802459490285972 -1.4781544854060473 1.0195083047118356 -4.0508580776041709 -1.8196503542139728 0.99822868644265261 -3.9515453861435077 -1.7516944511599271 0.9769490681734696 -3.8522326946828458 -1.6837385481058813 0.95566944990428671 -3.7529200032221834 -1.6157826450518358 0.9343898316351037 -3.6536073117615211 -1.54782674199779 1.1138646760678528 -4.0249067488764316 -1.82136670775167 1.0925850577986698 -3.9255940574157688 -1.7534108046976242 1.0713054395294868 -3.8262813659551069 -1.6854549016435785 1.0500258212603037 -3.7269686744944446 -1.6174989985895329 1.2082210474238699 -3.9989554201486928 -1.8230830612893671 1.1869414291546869 -3.8996427286880304 -1.7551271582353214 1.1656618108855039 -3.8003300372273681 -1.6871712551812756 1.3025774187798869 -3.9730040914209539 -1.8247994148270643 1.2812978005107039 -3.8736913999602915 -1.7568435117730188 1.2600181822415211 -3.7743787084996292 -1.688887608718973 1.396933790135904 -3.947052762693215 -1.8265157683647615 1.375654171866721 -3.8477400712325531 -1.758559865310716 1.491290161491921 -3.9211014339654762 -1.8282321219024589 0.90075721617827031 -3.5580327613628797 -1.4798649923991405 1.0217902664884837 -3.6297609193071683 -1.5495398033633605 0.97998817656681725 -3.5366585339619321 -1.4815741872377357 1.142823316798697 -3.7014890772514568 -1.6192146143275803 1.1010212268770307 -3.6083866919062206 -1.5512489982019557 1.0592191369553641 -3.5152843065609845 -1.4832833820763309 1.0174170470336978 -3.4221819212157483 -1.4153177659507059 1.2220542771872438 -3.6801148498505092 -1.6209238091661755 1.1802521872655776 -3.587012464505273 -1.5529581930405507 1.1384500973439109 -3.4939100791600368 -1.4849925769149259 1.0966480074222447 -3.4008076938148006 -1.4170269607893011 1.3430873274974571 -3.7518430077947973 -1.6905986201303953 1.3012852375757908 -3.6587406224495616 -1.6226330040047705 1.2594831476541246 -3.5656382371043254 -1.5546673878791459 1.2176810577324579 -3.4725358517590892 -1.4867017717535211 1.1758789678107917 -3.379433466413853 -1.4187361556278963 1.4641203778076703 -3.8235711657390858 -1.7602734310946155 1.4223182878860039 -3.7304687803938497 -1.6923078149689905 1.3805161979643377 -3.6373663950486139 -1.6243421988433657 1.3387141080426714 -3.5442640097033777 -1.5563765827177409 1.2969120181210048 -3.4511616243581416 -1.4884109665921161 1.2551099281993385 -3.3580592390129054 -1.4204453504664913 1.5851534281178836 -3.8952993236833739 -1.8299482420588353 1.5433513381962174 -3.8021969383381382 -1.7619826259332105 1.5015492482745509 -3.709094552992902 -1.6940170098075855 1.4597471583528847 -3.6159921676476663 -1.6260513936819607 1.4179450684312183 -3.5228897823024301 -1.5580857775563361 1.3761429785095518 -3.4297873969571939 -1.4901201614307114 1.3343408885878854 -3.3366850116119577 -1.4221545453050866 0.056084475517406362 -4.161347278411669 -1.8024819320271706 0.057388153499444261 -4.0595555548942137 -1.7345526717105371 0.058691831481482049 -3.9577638313767585 -1.6666234113939031 0.059995509463519836 -3.8559721078593037 -1.5986941510772696 0.061299187445557651 -3.7541803843418489 -1.5307648907606362 0.062602865427595369 -3.6523886608243945 -1.4628356304440024 0.15431977585086565 -4.1542439616550206 -1.8042004980627753 0.15562345383290355 -4.0524522381375654 -1.7362712377461418 0.15692713181494128 -3.9506605146201106 -1.6683419774295078 0.15823080979697904 -3.8488687911026558 -1.6004127171128744 0.15953448777901685 -3.747077067585201 -1.5324834567962409 0.25255507618432493 -4.1471406448983732 -1.80591906409838 0.25385875416636283 -4.045348921380918 -1.7379898037817465 0.25516243214840051 -3.9435571978634627 -1.6700605434651126 0.25646611013043824 -3.8417654743460083 -1.6021312831484791 0.35079037651778422 -4.1400373281417249 -1.8076376301339847 0.35209405449982212 -4.0382456046242705 -1.7397083698173512 0.35339773248185974 -3.9364538811068148 -1.6717791095007173 0.35470141046389747 -3.8346621575893605 -1.6038498491840838 0.44902567685124378 -4.1329340113850774 -1.8093561961695894 0.45032935483328163 -4.0311422878676222 -1.7414269358529559 0.45163303281531919 -3.9293505643501674 -1.673497675536322 0.54726097718470301 -4.1258306946284291 -1.8110747622051941 0.54856465516674091 -4.0240389711109739 -1.7431455018885604 0.6454962775181623 -4.1187273778717817 -1.8127933282407989 0.74373157785162169 -4.1116240611151333 -1.8145118942764036 0.14972025294143532 -3.6463607594368841 -1.4645410978618159 0.252780930783082 -3.7404563138719511 -1.5341961451876838 0.23169111742507414 -3.6408306718075938 -1.4662405018809301 0.33475179526672089 -3.7349262262426608 -1.535895549206798 0.31366198190871303 -3.6353005841783035 -1.4679399059000444 0.43781247310836768 -3.8290217806777282 -1.6055505965326664 0.41672265975035977 -3.7293961386133709 -1.5375949532259123 0.39563284639235191 -3.6297704965490132 -1.4696393099191587 0.54087315095001443 -3.9231173351127953 -1.6752056438585343 0.51978333759200646 -3.8234916930484379 -1.6072500005517807 0.4986935242339986 -3.7238660509840806 -1.5392943572450266 0.47760371087599079 -3.6242404089197233 -1.471338713938273 0.64393382879166117 -4.0172128895478618 -1.7448606911844027 0.6228440154336532 -3.917587247483505 -1.6769050478776486 0.60175420207564534 -3.8179616054191481 -1.608949404570895 0.58066438871763748 -3.7183359633547908 -1.5409937612641411 0.55957457535962973 -3.618710321290433 -1.4730381179573873 0.72590469327530005 -4.011682801918572 -1.746560095203517 0.70481487991729208 -3.9120571598542146 -1.6786044518967629 0.68372506655928422 -3.8124315177898578 -1.6106488085900093 0.66263525320127636 -3.7128058757255005 -1.5426931652832554 0.64154543984326862 -3.6131802336611432 -1.4747375219765015 -0.67251386799550983 -3.4857517682459433 -1.3636315281282185 -0.65586573760374034 -3.420052571614637 -1.2628517507822123 -0.63921760721197085 -3.3543533749833312 -1.1620719734362066 -0.62256947682020147 -3.2886541783520253 -1.0612921960902009 -0.60592134642843209 -3.222954981720719 -0.96051241874419491 -0.58927321603666272 -3.1572557850894127 -0.85973264139818906 -0.59140743436952781 -3.4953629717895729 -1.3660603951742609 -0.57475930397775832 -3.4296637751582666 -1.2652806178282547 -0.55811117358598883 -3.3639645785269607 -1.164500840482249 -0.54146304319421956 -3.2982653818956544 -1.0637210631362433 -0.52481491280245007 -3.2325661852643481 -0.9629412857902373 -0.51030100074354579 -3.5049741753332024 -1.3684892622203033 -0.4936528703517763 -3.4392749787018961 -1.2677094848742971 -0.47700473996000681 -3.3735757820705898 -1.1669297075282914 -0.4603566095682376 -3.307876585439284 -1.0661499301822857 -0.44370847917646811 -3.2421773888079777 -0.9653701528362798 -0.42919456711756382 -3.514585378876832 -1.3709181292663457 -0.41254643672579427 -3.4488861822455257 -1.2701383519203395 -0.39589830633402484 -3.3831869856142194 -1.1693585745743338 -0.37925017594225557 -3.3174877889829131 -1.068578797228328 -0.3480881334915818 -3.5241965824204611 -1.3733469963123881 -0.33144000309981225 -3.4584973857891548 -1.2725672189663821 -0.31479187270804287 -3.3927981891578485 -1.1717874416203764 -0.26698169986559983 -3.5338077859640906 -1.3757758633584305 -0.25033356947383029 -3.4681085893327843 -1.2749960860124245 -0.23368543908206096 -3.402409392701478 -1.1742163086664188 -0.18587526623961781 -3.5434189895077197 -1.3782047304044731 -0.16922713584784826 -3.4777197928764134 -1.2774249530584671 -0.10476883261363584 -3.5530301930513493 -1.3806335974505155 -0.51029244142750729 -3.166645031823244 -0.86214265469845563 -0.44030617753426654 -3.1750950908094651 -0.86447289028410601 -0.37114012344040453 -3.2508970643524058 -0.96772329054441975 -0.37031991364102579 -3.1835451497956861 -0.86680312586975639 -0.36949970384164704 -3.1161932352389661 -0.7658829611950928 -0.30197406934654247 -3.3266990378953469 -1.0709736908047336 -0.30115385954716378 -3.2593471233386269 -0.97005352613007012 -0.30033364974778498 -3.1919952087819072 -0.86913336145540676 -0.29951343994840623 -3.1246432942251872 -0.76821319678074318 -0.23198780545330175 -3.335149096881568 -1.0733039263903839 -0.23116759565392306 -3.2677971823248479 -0.9723837617157205 -0.23034738585454426 -3.2004452677681283 -0.87146359704105714 -0.22952717605516554 -3.1330933532114082 -0.77054343236639355 -0.16282175135943969 -3.4109510704245087 -1.1765543266506975 -0.16200154156006091 -3.3435991558677891 -1.0756341619760341 -0.16118133176068222 -3.276247241311069 -0.97471399730137076 -0.16036112196130345 -3.2088953267543494 -0.87379383262670751 -0.15954091216192473 -3.1415434121976293 -0.77287366795204393 -0.093655697265577723 -3.4867530439674499 -1.2798047269110111 -0.092835487466198935 -3.4194011294107298 -1.1788845622363477 -0.092015277666820175 -3.3520492148540102 -1.0779643975616844 -0.091195067867441471 -3.2846973002972901 -0.97704423288702114 -0.090374858068062724 -3.2173453857405705 -0.87612406821235789 -0.089554648268683992 -3.1499934711838504 -0.77520390353769431 -0.02448964317171572 -3.5625550175103911 -1.3830551271713252 -0.023669433372336925 -3.4952031029536705 -1.2821349624966614 -0.022849223572958186 -3.4278511883969509 -1.1812147978219982 -0.022029013773579451 -3.3604992738402313 -1.0802946331473349 -0.021208803974200725 -3.2931473592835112 -0.9793744684726714 -0.020388594174821993 -3.2257954447267916 -0.87845430379800815 -0.019568384375443264 -3.1584435301700715 -0.77753413912334468 -1.2069944493242808 -2.9641728640591278 -0.84032843911038724 -1.2385481265952558 -3.0245076676230349 -0.94093033693833006 -1.2701018038662308 -3.084842471186942 -1.0415322347662728 -1.3016554811372056 -3.1451772747508491 -1.1421341325942156 -1.2870934253481414 -3.2909784829812447 -1.3455985159991228 -1.2555397480771662 -3.2306436794173377 -1.2449966181711798 -1.2239860708061912 -3.170308875853431 -1.144394720343237 -1.1924323935352161 -3.1099740722895239 -1.0437928225152941 -1.1608787162642411 -3.0496392687256169 -0.94319092468735133 -1.2094240150171269 -3.3161100840838267 -1.347859103748144 -1.1778703377461517 -3.2557752805199196 -1.2472572059202012 -1.1463166604751767 -3.195440476956013 -1.1466553080922584 -1.1147629832042016 -3.1351056733921059 -1.0460534102643155 -1.0832093059332266 -3.0747708698281988 -0.9454515124363726 -1.1317546046861122 -3.3412416851864086 -1.3501196914971652 -1.1002009274151372 -3.2809068816225015 -1.2495177936692223 -1.0686472501441622 -3.2205720780585945 -1.1489158958412795 -1.0370935728731872 -3.1602372744946874 -1.0483139980133367 -1.0540851943550977 -3.3663732862889906 -1.3523802792461865 -1.0225315170841227 -3.3060384827250835 -1.2517783814182437 -0.99097783981314769 -3.2457036791611764 -1.1511764835903009 -0.97641578402408302 -3.3915048873915725 -1.3546408669952077 -0.944862106753108 -3.3311700838276654 -1.2540389691672649 -0.91330842948213298 -3.2708352802637584 -1.1534370713393221 -0.89874637369306853 -3.416636488494154 -1.3569014547442291 -0.86719269642209351 -3.3563016849302469 -1.2562995569162863 -0.82107696336205394 -3.441768089596736 -1.3591620424932502 -0.74340755303103945 -3.4668996906993175 -1.3614226302422716 -1.1316741059997386 -2.9885718086249629 -0.84256013730142254 -1.0646983292457983 -3.0103681449095427 -0.8446892114127087 -1.0137613686238673 -3.0973382546123842 -0.94761098994846393 -0.99772255249185826 -3.0321644811941226 -0.84681828552399485 -0.96282440800193614 -3.1843083643152257 -1.0505327684842192 -0.94678559186992717 -3.1191345908969641 -0.94974006405975009 -0.93074677573791809 -3.0539608174787025 -0.84894735963528101 -0.89584863124799596 -3.2061047005998056 -1.0526618425955052 -0.87980981511598699 -3.140930927181544 -0.95186913817103624 -0.86377099898397791 -3.0757571537632824 -0.85107643374656716 -0.84491167062606487 -3.2930748103026475 -1.1555836211312607 -0.82887285449405579 -3.2279010368843855 -1.0547909167067913 -0.81283403836204682 -3.1627272634661239 -0.9539982122823224 -0.79679522223003785 -3.0975534900478623 -0.85320550785785321 -0.79397471000413378 -3.380044920005489 -1.2585053996670159 -0.7779358938721247 -3.3148711465872274 -1.1577126952425467 -0.76189707774011561 -3.2496973731689653 -1.0569199908180775 -0.74585826160810664 -3.1845235997507038 -0.95612728639360856 -0.72981944547609767 -3.1193498263324422 -0.85533458196913936 -0.7269989332501936 -3.4018412562900688 -1.260634473778302 -0.71096011711818452 -3.3366674828718077 -1.159841769353833 -0.69492130098617544 -3.2714937094535457 -1.0590490649293636 -0.67888248485416647 -3.2063199360352836 -0.9582563605048946 -0.6628436687221575 -3.1411461626170221 -0.85746365608042541 -1.9242767114140999 -2.9515820534466806 -1.3264503077630547 -1.8796719331665055 -2.8996634792914087 -1.2259712963977931 -1.8350671549189115 -2.8477449051361363 -1.1254922850325313 -1.790462376671317 -2.7958263309808644 -1.0250132736672697 -1.745857598423723 -2.7439077568255921 -0.92453426230200797 -1.8530434219105223 -2.9912592010188428 -1.3285752136673723 -1.8084386436629278 -2.9393406268635709 -1.2280962023021107 -1.7638338654153338 -2.8874220527082985 -1.1276171909368489 -1.7192290871677394 -2.8355034785530266 -1.0271381795715873 -1.6746243089201456 -2.7835849043977543 -0.92665916820632555 -1.7818101324069449 -3.030936348591005 -1.3307001195716899 -1.7372053541593504 -2.9790177744357331 -1.2302211082064283 -1.6926005759117564 -2.9270992002804608 -1.1297420968411664 -1.6479957976641619 -2.8751806261251889 -1.0292630854759048 -1.7105768429033674 -3.0706134961631673 -1.3328250254760075 -1.665972064655773 -3.0186949220078954 -1.2323460141107458 -1.621367286408179 -2.966776347852623 -1.131867002745484 -1.63934355339979 -3.1102906437353295 -1.334949931380325 -1.5947387751521955 -3.0583720695800576 -1.2344709200150634 -1.5501339969046015 -3.0064534954247852 -1.1339919086498016 -1.5681102638962123 -3.1499677913074917 -1.3370748372846426 -1.5235054856486179 -3.0980492171522198 -1.236595825919381 -1.4968769743926349 -3.1896449388796535 -1.3391997431889602 -1.4256436848890572 -3.2293220864518157 -1.3413246490932778 -1.703425532366788 -2.6908117415372819 -0.8240338948989252 -1.641846765030148 -2.7252568884937838 -0.82606390450661027 -1.6106228711921327 -2.8193429504040521 -0.92871299074272184 -1.5802679976935081 -2.7597020354502857 -0.82809391411429534 -1.5793989773541171 -2.9134290123143205 -1.0313620769788334 -1.5490441038554927 -2.8537880973605541 -0.93074300035040691 -1.5186892303568682 -2.7941471824067876 -0.83012392372198041 -1.5178202100174771 -2.9478741592708224 -1.0333920865865185 -1.4874653365188528 -2.888233244317056 -0.93277300995809198 -1.4571104630202283 -2.8285923293632895 -0.83215393332966547 -1.486596316179462 -3.0419602211810908 -1.1360411728226301 -1.4562414426808372 -2.9823193062273243 -1.0354220961942036 -1.4258865691822129 -2.9226783912735579 -0.93480301956577705 -1.3955316956835884 -2.8630374763197914 -0.83418394293735054 -1.4553724223414466 -3.1360462830913587 -1.2386902590587416 -1.4250175488428221 -3.0764053681375927 -1.1380711824303151 -1.3946626753441973 -3.0167644531838262 -1.0374521058018886 -1.364307801845573 -2.9571235382300598 -0.93683302917346212 -1.3339529283469485 -2.8974826232762934 -0.8362139525450355 -1.3937936550048067 -3.1704914300478606 -1.2407202686664267 -1.3634387815061821 -3.1108505150940946 -1.1401011920380002 -1.3330839080075574 -3.0512096001403282 -1.0394821154095737 -1.3027290345089331 -2.9915686851865617 -0.93886303878114707 -1.2723741610103085 -2.9319277702327957 -0.83824396215272057 -1.3625697611667915 -3.264577491958129 -1.3433693549025385 -1.3322148876681668 -3.2049365770043625 -1.2427502782741118 -2.5321785090455049 -2.5334970355993405 -1.4086445706044981 -2.4769788402473396 -2.4924169147542381 -1.3082271860893349 -2.4217791714491739 -2.4513367939091348 -1.2078098015741714 -2.3665795026510081 -2.410256673064032 -1.1073924170590081 -2.3113798338528428 -2.3691765522189296 -1.0069750325438449 -2.2561801650546776 -2.3280964313738268 -0.90655764802868177 -2.4701382236019844 -2.5861553776944186 -1.4106710174312409 -2.4149385548038191 -2.5450752568493162 -1.3102536329160774 -2.3597388860056534 -2.503995136004213 -1.2098362484009142 -2.3045392172074877 -2.4629150151591102 -1.1094188638857507 -2.2493395484093224 -2.4218348943140078 -1.0090014793705875 -2.1941398796111571 -2.3807547734689054 -0.90858409485542446 -2.408097938158464 -2.6388137197894967 -1.4126974642579837 -2.3528982693602987 -2.5977335989443944 -1.3122800797428202 -2.2976986005621329 -2.5566534780992911 -1.2118626952276568 -2.2424989317639672 -2.5155733572541883 -1.1114453107124935 -2.1872992629658019 -2.4744932364090864 -1.0110279261973303 -2.2908579839167782 -2.6503919410394725 -1.3143065265695628 -2.2356583151186125 -2.6093118201943692 -1.2138891420543996 -2.1804586463204472 -2.5682316993492664 -1.1134717575392361 -2.2288176984732577 -2.7030502831345506 -1.3163329733963056 -2.173618029675092 -2.6619701622894474 -1.2159155888811422 -2.1184183608769267 -2.620890041444345 -1.1154982043659789 -2.1667774130297373 -2.7557086252296288 -1.3183594202230482 -2.1115777442315715 -2.7146285043845255 -1.217942035707885 -2.1047371275862168 -2.8083669673247069 -1.320385867049791 -2.0426968421426968 -2.8610253094197846 -1.3224123138765336 -2.2027451581959041 -2.2855586593355328 -0.80612930057794185 -2.1489568012108515 -2.331400719458915 -0.80810448242409261 -2.1380038454420753 -2.4285360687353696 -0.91057386161053078 -2.0951684442257994 -2.3772427795822968 -0.81007966427024336 -2.1270508896732991 -2.5256714180118238 -1.0130432407969692 -2.0842154884570228 -2.4743781288587514 -0.91254904345668153 -2.0413800872407468 -2.4230848397056786 -0.81205484611639411 -2.0732625326882466 -2.5715134781352056 -1.0150184226431198 -2.0304271314719702 -2.5202201889821332 -0.91452422530283228 -1.9875917302556945 -2.4689268998290603 -0.81403002796254487 -2.0623095769194699 -2.6686488274116607 -1.1174878018295582 -2.019474175703194 -2.6173555382585878 -1.0169936044892707 -1.9766387744869176 -2.5660622491055154 -0.91649940714898304 -1.9338033732706419 -2.5147689599524425 -0.81600520980869562 -2.0513566211506937 -2.7657841766881153 -1.2199571810159966 -2.0085212199344173 -2.7144908875350424 -1.1194629836757091 -1.9656858187181416 -2.66319759838197 -1.0189687863354213 -1.9228504175018653 -2.6119043092288972 -0.91847458899513379 -1.8800150162855895 -2.5606110200758243 -0.81798039165484626 -1.9975682641656414 -2.811626236811497 -1.2219323628621475 -1.954732862949365 -2.7603329476584246 -1.1214381655218597 -1.9118974617330891 -2.7090396585053518 -1.0209439681815722 -1.8690620605168129 -2.6577463693522789 -0.92044977084128454 -1.8262266593005372 -2.6064530801992065 -0.81995557350099701 -1.986615308396865 -2.9087615860879517 -1.3244017420485859 -1.9437799071805888 -2.8574682969348792 -1.2239075447082983 -1.9009445059643129 -2.8061750077818064 -1.1234133473680106 -1.8581091047480367 -2.7548817186287335 -1.0229191500277228 -1.8152737035317605 -2.7035884294756611 -0.9224249526874353 -1.7724383023154848 -2.6522951403225883 -0.82193075534714766 -2.6711686847746252 -1.8198558249086454 -0.88910882033478777 -2.7341612813566383 -1.8483378747246335 -0.98950980502413421 -2.7971538779386518 -1.8768199245406216 -1.0899107897134808 -2.9356503071576068 -2.025819579960181 -1.3930616740283359 -2.8726577105755937 -1.9973375301441929 -1.2926606893389894 -2.8096651139935802 -1.9688554803282048 -1.1922597046496428 -2.7466725174115676 -1.9403734305122164 -1.0918587199602963 -2.6836799208295541 -1.9118913806962283 -0.99145773527094982 -2.620687324247541 -1.8834093308802402 -0.89105675058160339 -2.8851689466305226 -2.0893730859317761 -1.3950096042751514 -2.8221763500485091 -2.0608910361157879 -1.2946086195858049 -2.759183753466496 -2.0324089862997998 -1.1942076348964583 -2.6961911568844834 -2.0039269364838113 -1.0938066502071118 -2.6331985603024699 -1.9754448866678234 -0.99340566551776543 -2.8346875861034384 -2.1529265919033707 -1.3969575345219671 -2.7716949895214249 -2.1244445420873825 -1.2965565498326206 -2.7087023929394118 -2.0959624922713944 -1.1961555651432738 -2.6457097963573992 -2.0674804424554063 -1.0957545804539273 -2.7842062255763542 -2.2164800978749657 -1.3989054647687826 -2.7212136289943407 -2.1879980480589771 -1.2985044800794361 -2.6582210324123277 -2.159515998242989 -1.1981034953900893 -2.5952284358303146 -2.1310339484270009 -1.097702510700743 -2.73372486504927 -2.2800336038465607 -1.4008533950155984 -2.6707322684672565 -2.2515515540305722 -1.3004524103262518 -2.6077396718852435 -2.2230695042145836 -1.200051425636905 -2.6832435045221854 -2.3435871098181558 -1.4028013252624139 -2.6202509079401723 -2.3151050600021672 -1.3024003405730673 -2.6327621439951012 -2.4071406157897504 -1.4047492555092296 -2.5697695474130882 -2.3786585659737618 -1.304348270819883 -2.5822807834680166 -2.4706941217613454 -1.4066971857560451 -2.6094580902695399 -1.7898078504239621 -0.788704209739571 -2.5655859079764829 -1.8452884558732203 -0.7906334471475932 -2.5746768777145288 -1.9415017579339993 -0.89299203567472651 -2.5217137256834259 -1.9007690613224786 -0.7925626845556154 -2.5837678474525747 -2.037715059994778 -0.99535062420185982 -2.5308046954214718 -1.9969823633832575 -0.89492127308274871 -2.4778415433903689 -1.9562496667717368 -0.7944919219636376 -2.5398956651595177 -2.0931956654440365 -0.99727986160988202 -2.4869325131284148 -2.0524629688325158 -0.89685051049077091 -2.4339693610973119 -2.0117302722209951 -0.7964211593716598 -2.5489866348975636 -2.1894089675048152 -1.0996384501370153 -2.4960234828664607 -2.1486762708932949 -0.99920909901790422 -2.4430603308353578 -2.1079435742817743 -0.89877974789879311 -2.3900971788042549 -2.0672108776702536 -0.798350396779682 -2.5580776046356095 -2.2856222695655939 -1.2019970386641485 -2.5051144526045066 -2.2448895729540732 -1.1015676875450375 -2.4521513005734037 -2.204156876342553 -1.0011383364259263 -2.3991881485423008 -2.1634241797310323 -0.90070898530681531 -2.3462249965111983 -2.1226914831195121 -0.8002796341877042 -2.5142054223425525 -2.3411028750148524 -1.2039262760721707 -2.4612422703114496 -2.3003701784033317 -1.1034969249530597 -2.4082791182803467 -2.2596374817918115 -1.0030675738339485 -2.3553159662492442 -2.2189047851802908 -0.90263822271483751 -2.3023528142181413 -2.1781720885687705 -0.8022088715957264 -2.5232963920805984 -2.4373161770756315 -1.3062848645993042 -2.4703332400494955 -2.3965834804641104 -1.2058555134801929 -2.4173700880183926 -2.3558507838525902 -1.1054261623610819 -2.3644069359872901 -2.3151180872410695 -1.0049968112419707 -2.3114437839561872 -2.2743853906295488 -0.90456746012285971 -2.2584806319250847 -2.2336526940180286 -0.8041381090037486 -2.9744570347581525 -1.2407432527818849 -0.87222603007620181 -3.2764705372268592 -1.386583309922496 -1.3761662141155837 -3.2086581123220586 -1.3718059463646171 -1.2757525013059707 -3.1408456874172574 -1.3570285828067381 -1.1753387884963571 -3.0730332625124572 -1.3422512192488592 -1.0749250756867439 -3.0052208376076561 -1.3274738556909802 -0.97451136287713069 -2.9374084127028559 -1.3126964921331015 -0.87409765006751738 -3.2394219151715626 -1.4585365492737126 -1.3780378341068993 -3.171609490266762 -1.4437591857158336 -1.2776241212972863 -3.1037970653619609 -1.4289818221579547 -1.1772104084876727 -3.0359846404571607 -1.4142044586000757 -1.0767966956780595 -2.9681722155523595 -1.3994270950421968 -0.97638298286844638 -3.2023732931162661 -1.5304897886249291 -1.3799094540982151 -3.1345608682114654 -1.5157124250670502 -1.2794957412886019 -3.0667484433066643 -1.5009350615091712 -1.1790820284789882 -2.9989360184018641 -1.4861576979512923 -1.078668315669375 -3.1653246710609695 -1.6024430279761455 -1.3817810740895307 -3.0975122461561688 -1.5876656644182665 -1.2813673612799175 -3.0296998212513677 -1.5728883008603878 -1.180953648470304 -2.9618873963465671 -1.5581109373025088 -1.0805399356606908 -3.1282760490056729 -1.6743962673273618 -1.3836526940808465 -3.0604636241008722 -1.6596189037694831 -1.283238981271233 -2.9926511991960711 -1.6448415402116043 -1.1828252684616196 -3.0912274269503763 -1.7463495066785784 -1.385524314072162 -3.0234150020455752 -1.7315721431206996 -1.2851106012625488 -3.0541788048950798 -1.8183027460297949 -1.3873959340634778 -2.9863663799902787 -1.8035253824719162 -1.2869822212538644 -3.0171301828397827 -1.8902559853810115 -1.3892675540547934 -2.9800815607844862 -1.9622092247322278 -1.3911391740461092 -2.9074621528166635 -1.2244367274777872 -0.77181256790771291 -2.8752216118484899 -1.2873967591309519 -0.77368566195348687 -2.9034221113449377 -1.3789218567728607 -0.87597020890062782 -2.8429810708803163 -1.3503567907841167 -0.77555875599926083 -2.9316226108413854 -1.4704469544147691 -0.97825475584776855 -2.871181570376764 -1.4418818884260254 -0.87784330294640178 -2.8107405299121426 -1.4133168224372814 -0.77743185004503479 -2.8993820698732118 -1.5334069860679338 -0.98012784989354251 -2.8389410294085904 -1.50484192007919 -0.87971639699217574 -2.778499988943969 -1.4762768540904463 -0.77930494409080875 -2.9275825693696591 -1.6249320837098424 -1.0824123968406834 -2.8671415289050382 -1.5963670177210985 -0.98200094393931647 -2.8067004884404168 -1.5678019517323547 -0.88158949103794959 -2.7462594479757954 -1.5392368857436112 -0.78117803813658271 -2.9557830688661069 -1.7164571813517508 -1.1846969437878241 -2.8953420284014855 -1.6878921153630073 -1.0842854908864574 -2.8349009879368641 -1.6593270493742633 -0.98387403798509043 -2.7744599474722427 -1.6307619833855196 -0.88346258508372355 -2.7140189070076213 -1.6021969173967761 -0.78305113218235667 -2.9235425278979332 -1.7794172130049155 -1.1865700378335982 -2.8631014874333118 -1.750852147016172 -1.0861585849322313 -2.8026604469686904 -1.722287081027428 -0.98574713203086439 -2.742219406504069 -1.6937220150386845 -0.88533567912949751 -2.6817783660394476 -1.6651569490499409 -0.78492422622813052 -2.9517430273943805 -1.8709423106468241 -1.2888545847807391 -2.8913019869297596 -1.8423772446580804 -1.1884431318793722 -2.8308609464651382 -1.8138121786693366 -1.0880316789780053 -2.7704199060005168 -1.7852471126805927 -0.98762022607663835 -2.7099788655358954 -1.7566820466918491 -0.88720877317527136 -2.649537825071274 -1.7281169807031056 -0.78679732027390448 -2.9195024864262069 -1.933902342299989 -1.2907276788265132 -2.8590614459615855 -1.9053372763112451 -1.1903162259251461 -3.132424984866613 -0.69253141316492339 -0.8578730793064725 -3.2020429815772609 -0.69312191716305072 -0.95831756524679612 -3.2716609782879087 -0.69371242116117804 -1.0587620511871196 -3.341278974998557 -0.69430292515930536 -1.1592065371274434 -3.4108969717092052 -0.69489342915743291 -1.2596510230677671 -3.4805149684198535 -0.69548393315556056 -1.3600955090080906 -3.4582229238583051 -0.77305195051792586 -1.3618770420098589 -3.3886049271476568 -0.77246144651979831 -1.2614325560695354 -3.3189869304370085 -0.77187094252167077 -1.1609880701292117 -3.2493689337263603 -0.77128043852354344 -1.0605435841888879 -3.1797509370157124 -0.77068993452541612 -0.96009909824856454 -3.4359308792967567 -0.85061996788029137 -1.3636585750116275 -3.3663128825861084 -0.85002946388216394 -1.2632140890713037 -3.2966948858754601 -0.84943895988403639 -1.16276960313098 -3.2270768891648118 -0.84884845588590907 -1.0623251171906563 -3.4136388347352082 -0.92818798524265667 -1.3654401080133958 -3.34402083802456 -0.92759748124452934 -1.2649956220730723 -3.2744028413139117 -0.9270069772464018 -1.1645511361327483 -3.2047848446032634 -0.92641647324827436 -1.0641066501924248 -3.3913467901736598 -1.0057560026050221 -1.3672216410151643 -3.3217287934630115 -1.0051654986068947 -1.2667771550748406 -3.2521107967523633 -1.0045749946087672 -1.1663326691345168 -3.3690547456121114 -1.0833240199673875 -1.3690031740169326 -3.2994367489014631 -1.0827335159692599 -1.2685586880766091 -3.2298187521908144 -1.0821430119711326 -1.1681142021362851 -3.3467627010505625 -1.1608920373297529 -1.3707847070187011 -3.2771447043399142 -1.1603015333316256 -1.2703402210783774 -3.3244706564890141 -1.2384600546921178 -1.3725662400204695 -3.3021786119274656 -1.3160280720544835 -1.374347773022238 -3.1118723925056107 -0.7643819631632951 -0.85966191920748936 -3.1576109338103771 -0.8477582017412395 -0.96188126992891865 -3.0924926776735875 -0.83237734025620036 -0.86145568600326783 -3.1382312189783539 -0.91575357883414477 -0.96367503672469712 -3.0731129628415639 -0.90037271734910562 -0.8632494527990463 -3.1839697602831203 -0.99912981741208906 -1.0658943874461264 -3.1188515041463303 -0.98374895592705003 -0.96546880352047559 -3.0537332480095403 -0.968368094442011 -0.86504321959482477 -3.1645900454510971 -1.0671251945049942 -1.0676881542419048 -3.0994717893143067 -1.0517443330199554 -0.96726257031625407 -3.0343535331775171 -1.0363634715349164 -0.86683698639060314 -2.9692352770407271 -1.0209826100498773 -0.76641140246495221 -3.2103285867558635 -1.1505014330829388 -1.1699075049633341 -3.1452103306190735 -1.1351205715978994 -1.0694819210376834 -3.0800920744822835 -1.1197397101128606 -0.96905633711203243 -3.0149738183454939 -1.1043588486278215 -0.86863075318638161 -2.9498555622087035 -1.0889779871427825 -0.76820516926073068 -3.2560671280606304 -1.2338776716608832 -1.2721268556847638 -3.1909488719238399 -1.2184968101758442 -1.1717012717591124 -3.1258306157870503 -1.2031159486908047 -1.0712756878334617 -3.0607123596502599 -1.1877350872057659 -0.9708501039078109 -2.9955941035134703 -1.1723542257207269 -0.87042451998215997 -2.9304758473766803 -1.1569733642356879 -0.76999893605650904 -3.2366874132286068 -1.3018730487537884 -1.2739206224805422 -3.1715691570918167 -1.2864921872687494 -1.173495038554891 -3.1064509009550267 -1.2711113257837101 -1.0730694546292403 -3.0413326448182367 -1.2557304642986711 -0.97264387070358926 -3.1991414292913527 -0.048352936330252685 -0.84268577308440373 -3.2676138695416799 -0.034860362089150665 -0.94317317849967497 -3.336086309792007 -0.021367787848048679 -1.0436605839149462 -3.4045587500423342 -0.0078752136069466187 -1.1441479893302176 -3.5347123036714319 -0.061116842054745657 -1.3467845129305047 -3.4662398634211047 -0.074609416295847608 -1.2462971075152336 -3.3977674231707771 -0.08810199053694967 -1.145809702099962 -3.3292949829204499 -0.1015945647780517 -1.0453222966846907 -3.2608225426701227 -0.11508713901915375 -0.94483489126941944 -3.5279209767998747 -0.14134361898474884 -1.3484462257002492 -3.4594485365495475 -0.15483619322585079 -1.2479588202849781 -3.3909760962992199 -0.1683287674669528 -1.1474714148697065 -3.3225036560488928 -0.18182134170805486 -1.0469840094544351 -3.5211296499283176 -0.22157039591475192 -1.3501079384699937 -3.4526572096779904 -0.23506297015585387 -1.2496205330547223 -3.3841847694276628 -0.24855554439695585 -1.1491331276394507 -3.3157123291773356 -0.26204811863805788 -1.0486457222241796 -3.5143383230567604 -0.30179717284475499 -1.3517696512397379 -3.4458658828064328 -0.31528974708585689 -1.2512822458244668 -3.3773934425561056 -0.32878232132695889 -1.1507948404091952 -3.5075469961852028 -0.38202394977475806 -1.3534313640094824 -3.4390745559348757 -0.3955165240158599 -1.252943958594211 -3.370602115684548 -0.40900909825696197 -1.1524565531789395 -3.5007556693136457 -0.46225072670476131 -1.3550930767792269 -3.4322832290633181 -0.47574330094586315 -1.2546056713639555 -3.4939643424420881 -0.54247750363476444 -1.3567547895489711 -3.4871730155705309 -0.62270428056476745 -1.3584165023187154 -3.1928913718617702 -0.12314767125938975 -0.84435685460953658 -3.2540315822386399 -0.19531023845007595 -0.94649661038182265 -3.1870776533819671 -0.19356341983162523 -0.8460354886631698 -3.2482178637588368 -0.26572598702231132 -0.94817524443545587 -3.1812639349021641 -0.2639791684038606 -0.84771412271680302 -3.3093580741357065 -0.33788855421299724 -1.0503150002077422 -3.2424041452790338 -0.33614173559454669 -0.94985387848908909 -3.175450216422361 -0.33439491697609597 -0.84939275677043624 -3.3035443556559034 -0.40830430278523255 -1.0519936342613754 -3.2365904267992307 -0.40655748416678206 -0.95153251254272231 -3.169636497942558 -0.40481066554833134 -0.85107139082406946 -3.3646845660327731 -0.4804668699759187 -1.1541333900336614 -3.2977306371761004 -0.47872005135746809 -1.0536722683150086 -3.2307767083194276 -0.47697323273901754 -0.95321114659635553 -3.1638227794627549 -0.47522641412056688 -0.85275002487770268 -3.4258247764096428 -0.55262943716660473 -1.2562731458059477 -3.3588708475529696 -0.55088261854815401 -1.1558120240872947 -3.2919169186962969 -0.54913579992970341 -1.0553509023686418 -3.2249629898396242 -0.54738898131125291 -0.95488978064998875 -3.1580090609829514 -0.5456421626928023 -0.85442865893133579 -3.4200110579298393 -0.62304518573884005 -1.257951779859581 -3.3530571290731666 -0.62129836712038933 -1.1574906581409279 -3.2861032002164938 -0.61955154850193872 -1.057029536422275 -3.2191492713598211 -0.61780472988348822 -0.95656841470362197 -3.1521953425031484 -0.61605791126503762 -0.85610729298496901 -3.1362525112813615 0.59403760616048285 -0.82900130523551552 -3.2007792297205855 0.62096994860601573 -0.92954226663406592 -3.2653059481598095 0.64790229105154851 -1.0300832280326162 -3.4677508957401826 0.6488242448942303 -1.3331994017834909 -3.4032241773009586 0.62189190244869752 -1.2326584403849408 -3.3386974588617342 0.59495956000316474 -1.1321174789863901 -3.2741707404225102 0.56802721755763186 -1.0315765175878397 -3.2096440219832862 0.54109487511209897 -0.93103555618928946 -3.4766156880028833 0.56894917140031376 -1.3346926913387145 -3.4120889695636594 0.54201682895478087 -1.2341517299401643 -3.347562251124435 0.5150844865092481 -1.1336107685416137 -3.2830355326852114 0.48815214406371521 -1.0330698071430633 -3.2185088142459874 0.46121980161818232 -0.93252884574451289 -3.4854804802655841 0.48907409790639694 -1.336185980893938 -3.4209537618263601 0.46214175546086411 -1.2356450194953879 -3.3564270433871357 0.43520941301533134 -1.1351040580968372 -3.2919003249479122 0.40827707056979839 -1.0345630966982868 -3.4943452725282849 0.40919902441248041 -1.3376792704491616 -3.4298185540890609 0.38226668196694746 -1.2371383090506114 -3.3652918356498369 0.35533433952141469 -1.1365973476520608 -3.5032100647909856 0.32932395091856381 -1.3391725600043851 -3.4386833463517616 0.30239160847303093 -1.2386315986058347 -3.3741566279125377 0.2754592660274981 -1.1380906372072841 -3.5120748570536868 0.24944887742464728 -1.3406658495596087 -3.4475481386144629 0.22251653497911431 -1.2401248881610583 -3.5209396493163876 0.16957380393073052 -1.3421591391148322 -3.5298044415790888 0.089698730436814145 -1.3436524286700555 -3.1446467746248454 0.51900124812252724 -0.83050363871424082 -3.1525669393686626 0.44884031458701773 -0.83201508472843955 -3.2264853593037341 0.39047907737208742 -0.93403920808622021 -3.1604871041124798 0.37867938105150822 -0.83352653074263827 -3.3004037792388057 0.33211784015715706 -1.0360633314440009 -3.2344055240475509 0.32031814383657792 -0.93555065410041893 -3.1684072688562965 0.30851844751599872 -0.835037976756837 -3.3083239439826224 0.2619569066216475 -1.0375747774581996 -3.2423256887913681 0.25015721030106841 -0.93706210011461777 -3.1763274336001137 0.23835751398048921 -0.83654942277103583 -3.3822423639176935 0.20359566940671722 -1.1395989008159804 -3.3162441087264392 0.19179597308613799 -1.0390862234723983 -3.2502458535351848 0.1799962767655589 -0.93857354612881649 -3.1842475983439305 0.16819658044497968 -0.83806086878523467 -3.456160783852765 0.14523443219178697 -1.2416230241737611 -3.3901625286615107 0.13343473587120774 -1.1411103468301791 -3.3241642734702563 0.12163503955062852 -1.040597669486597 -3.258166018279002 0.1098353432300494 -0.94008499214301533 -3.1921677630877476 0.098035646909470184 -0.83957231479943339 -3.4640809485965822 0.075073498656277424 -1.2431344701879599 -3.3980826934053274 0.063273802335698195 -1.1426217928443778 -3.3320844382140731 0.05147410601511896 -1.042109115500796 -3.2660861830228187 0.039674409694539801 -0.94159643815721406 -3.2000879278315644 0.027874713373960622 -0.84108376081363223 -3.5379993685316533 0.016712261441347128 -1.3451585935457406 -3.472001113340399 0.0049125651207679675 -1.2446459162021586 -2.9475428989072991 1.2095614073861276 -0.81751697821604574 -3.2616693023900947 1.3292098480015264 -1.3218055705622571 -3.2036635573408385 1.2899650527728126 -1.2211978924612978 -3.1456578122915828 1.2507202575440988 -1.1205902143603383 -3.0876520672423271 1.2114754623153852 -1.0199825362593791 -3.0296463221930714 1.1722306670866716 -0.91937485815841979 -3.2857669806266117 1.2526343124733565 -1.323055772403672 -3.2277612355773551 1.2133895172446429 -1.2224480943027127 -3.1697554905280994 1.1741447220159289 -1.1218404162017532 -3.1117497454788436 1.1348999267872153 -1.021232738100794 -3.0537440004295884 1.0956551315585017 -0.92062505999983457 -3.3098646588631282 1.1760587769451867 -1.3243059742450869 -3.251858913813872 1.1368139817164731 -1.2236982961441276 -3.1938531687646163 1.097569186487759 -1.1230906180431679 -3.1358474237153606 1.0583243912590454 -1.0224829399422086 -3.3339623370996447 1.099483241417017 -1.3255561760865016 -3.275956592050389 1.0602384461883032 -1.2249484979855423 -3.2179508470011329 1.0209936509595894 -1.1243408198845828 -3.3580600153361617 1.0229077058888474 -1.3268063779279164 -3.3000542702869056 0.98366291066013345 -1.2261986998269572 -3.2420485252376499 0.94441811543141962 -1.1255910217259975 -3.3821576935726783 0.94633217036067752 -1.3280565797693311 -3.3241519485234226 0.90708737513196369 -1.2274489016683718 -3.4062553718091952 0.86975663483250754 -1.329306781610746 -3.4303530500457118 0.79318109930433778 -1.3305569834521607 -2.9704664129421405 1.1368736765315544 -0.81877464671827138 -2.9917566587151274 1.0695939013722859 -0.82004270138293256 -3.0754280164845489 1.0270715336967555 -0.92189061062874955 -3.0130469044881143 1.0023141262130175 -0.82131075604759374 -3.1590993742539704 0.98454916602122555 -1.0237385198745665 -3.0967182622575358 0.95979175853748722 -0.92315866529341073 -3.0343371502611012 0.9350343510537491 -0.82257881071225492 -3.1803896200269572 0.91726939086195725 -1.0250065745392276 -3.1180085080305227 0.89251198337821891 -0.92442671995807191 -3.0556273960340881 0.8677545758944808 -0.82384686537691609 -3.2640609777963792 0.87474702318642716 -1.1268544837850445 -3.2016798657999441 0.84998961570268894 -1.0262746292038887 -3.1392987538035095 0.8252322082189506 -0.92569477462273309 -3.0769176418070749 0.80047480073521249 -0.82511492004157716 -3.3477323355658011 0.83222465551089697 -1.2287023930308618 -3.2853512235693665 0.80746724802715875 -1.1281225384497056 -3.2229701115729315 0.78270984054342041 -1.02754268386855 -3.1605889995764969 0.75795243305968207 -0.92696282928739415 -3.0982078875800618 0.73319502557594396 -0.82638297470623834 -3.369022581338788 0.76494488035162866 -1.2299704476955229 -3.3066414693423534 0.74018747286789044 -1.1293905931143666 -3.2442603573459183 0.7154300653841521 -1.028810738533211 -3.1818792453494837 0.69067265790041377 -0.92823088395205533 -3.1194981333530487 0.66591525041667554 -0.8276510293708994 -3.4526939391082099 0.72242251267609858 -1.3318183569413398 -3.3903128271117753 0.69766510519236036 -1.231238502360184 -3.3279317151153402 0.67290769770862202 -1.1306586477790279 -2.7290478478369136 1.7544001912126574 -0.91088185717223802 -2.7782391973541558 1.8044119078781931 -1.0115768446438822 -2.8274305468713981 1.8544236245437289 -1.1122718321155267 -2.8766218963886403 1.9044353412092649 -1.2129668195871712 -2.9258132459058825 1.9544470578748008 -1.3136618070588153 -2.9641744788649604 1.8839370014738757 -1.3145541547545865 -2.9149831293477182 1.8339252848083398 -1.2138591672829424 -2.8657917798304759 1.7839135681428038 -1.1131641798112979 -2.8166004303132337 1.7339018514772679 -1.0124691923396534 -2.7674090807959915 1.6838901348117323 -0.9117742048680092 -3.0025357118240383 1.8134269450729505 -1.3154465024503577 -2.9533443623067961 1.7634152284074147 -1.2147515149787136 -2.9041530127895538 1.7134035117418787 -1.1140565275070691 -2.8549616632723116 1.6633917950763428 -1.0133615400354246 -3.0408969447831167 1.7429168886720254 -1.3163388501461288 -2.9917055952658744 1.6929051720064896 -1.2156438626744848 -2.9425142457486322 1.6428934553409535 -1.1149488752028403 -3.0792581777421946 1.6724068322711003 -1.3172311978419 -3.0300668282249523 1.6223951156055645 -1.2165362103702559 -2.9808754787077101 1.5723833989400284 -1.1158412228986112 -3.1176194107012725 1.6018967758701752 -1.3181235455376712 -3.0684280611840307 1.5518850592046394 -1.2174285580660269 -3.1559806436603508 1.5313867194692503 -1.3190158932334424 -3.1943418766194291 1.460876663068325 -1.3199082409292135 -2.6785029883872338 1.706928098393627 -0.81019210489809879 -2.7122918360045198 1.6449973206305151 -0.81110213797597119 -2.8023825769845954 1.6197365719109964 -0.91267965588180056 -2.7460806836218059 1.5830665428674031 -0.8120121710538436 -2.8924733179646713 1.5944758231914777 -1.01425717378763 -2.8361714246018814 1.5578057941478844 -0.91358968895967296 -2.7798695312390915 1.5211357651042912 -0.81292220413171601 -2.926262165581957 1.5325450454283658 -1.0151672068655024 -2.8699602722191671 1.4958750163847725 -0.91449972203754537 -2.8136583788563776 1.4592049873411792 -0.81383223720958842 -3.0163529065620325 1.5072842967088471 -1.1167447247713318 -2.9600510131992426 1.4706142676652538 -1.0160772399433748 -2.9037491198364531 1.4339442386216605 -0.91540975511541778 -2.8474472264736632 1.3972742095780672 -0.81474227028746082 -3.1064436475421084 1.4820235479893287 -1.2183222426771614 -3.0501417541793181 1.4453535189457352 -1.1176547578492042 -2.9938398608165286 1.4086834899021419 -1.0169872730212473 -2.9375379674537387 1.3720134608585486 -0.91631978819329019 -2.8812360740909493 1.3353434318149553 -0.81565230336533323 -3.1402324951593941 1.4200927702262167 -1.2192322757550338 -3.0839306017966042 1.3834227411826234 -1.1185647909270766 -3.0276287084338143 1.3467527121390301 -1.0178973060991197 -2.9713268150710248 1.3100826830954366 -0.91722982127116259 -2.9150249217082349 1.2734126540518433 -0.81656233644320553 -3.23032323613947 1.394832021506698 -1.3208097936608632 -3.1740213427766801 1.3581619924631048 -1.2201423088329062 -3.1177194494138898 1.3214919634195115 -1.119474824004949 -3.0614175560511003 1.2848219343759182 -1.0188073391769918 -3.0051156626883104 1.2481519053323249 -0.918139854349035 -2.3202271298506254 2.2664142322597067 -0.90717327971027817 -2.358620119516103 2.3253085720666697 -1.0079917312256457 -2.3970131091815809 2.3842029118736328 -1.1088101827410131 -2.5633667219016352 2.4989003248869035 -1.4116193656525367 -2.5249737322361576 2.4400059850799414 -1.310800914137169 -2.4865807425706801 2.3811116452729784 -1.2099824626218014 -2.4481877529052025 2.3222173054660158 -1.1091640111064336 -2.4097947632397245 2.2633229656590528 -1.0083455595910662 -2.371401773574247 2.2044286258520898 -0.90752710807569881 -2.6145413656252567 2.4369147184792865 -1.4119731940179572 -2.5761483759597792 2.3780203786723244 -1.3111547425025896 -2.5377553862943016 2.3191260388653614 -1.210336290987222 -2.4993623966288241 2.2602316990583988 -1.1095178394718543 -2.4609694069633461 2.2013373592514358 -1.0086993879564867 -2.6657160093488783 2.3749291120716696 -1.4123270223833777 -2.6273230196834008 2.3160347722647074 -1.3115085708680101 -2.5889300300179232 2.2571404324577444 -1.2106901193526427 -2.5505370403524457 2.1982460926507819 -1.1098716678372749 -2.7168906530724999 2.3129435056640526 -1.4126808507487982 -2.6784976634070223 2.2540491658570905 -1.3118623992334308 -2.6401046737415448 2.1951548260501275 -1.2110439477180632 -2.6017116840760677 2.1362604862431644 -1.1102254962026956 -2.7680652967961215 2.2509578992564356 -1.413034679114219 -2.7296723071306439 2.1920635594494735 -1.3122162275988514 -2.6912793174651668 2.1331692196425105 -1.211397776083484 -2.819239940519743 2.1889722928488187 -1.4133885074796395 -2.7808469508542655 2.1300779530418565 -1.3125700559642721 -2.7424539611887884 2.0711836132348935 -1.2117516044489045 -2.870414584243365 2.1269866864412017 -1.4137423358450603 -2.8320215945778875 2.0680923466342391 -1.3129238843296926 -2.9215892279669866 2.0650010800335847 -1.4140961642104808 -2.2811813651828681 2.2083175064741516 -0.80635693219456062 -2.3261356725160827 2.1539324170984901 -0.80673080971251099 -2.4191057189753677 2.146683803231284 -0.90789212306442801 -2.3710899798492973 2.0995473277228287 -0.80710468723046136 -2.5120757654346524 2.1394351893640775 -1.009053436416345 -2.4640600263085823 2.0922987138556226 -0.90826600058237839 -2.4160442871825119 2.0451622383471673 -0.80747856474841173 -2.557030072767867 2.0850500999884161 -1.0094273139342953 -2.5090143336417969 2.0379136244799612 -0.90863987810032876 -2.4609985945157264 1.9907771489715058 -0.80785244226636199 -2.6500001192271516 2.0778014861212104 -1.1105886272862124 -2.6019843801010816 2.0306650106127546 -1.0098011914522458 -2.5539686409750115 1.9835285351042997 -0.90901375561827913 -2.5059529018489415 1.9363920595958444 -0.80822631978431236 -2.6949544265603662 2.023416396745549 -1.1109625048041627 -2.6469386874342962 1.9762799212370932 -1.010175068970196 -2.5989229483082261 1.9291434457286383 -0.90938763313622939 -2.5509072091821565 1.8820069702201829 -0.80860019730226262 -2.7879244730196509 2.0161677828783424 -1.2121238181560801 -2.7399087338935812 1.9690313073698873 -1.111336382322113 -2.6918929947675112 1.9218948318614317 -1.0105489464881465 -2.6438772556414412 1.8747583563529768 -0.90976151065417976 -2.5958615165153716 1.8276218808445215 -0.808974074820213 -2.8808945194789359 2.0089191690111363 -1.313285131507997 -2.8328787803528654 1.961782693502681 -1.2124976956740303 -2.7848630412267958 1.9146462179942256 -1.1117102598400634 -2.7368473021007258 1.8675097424857703 -1.0109228240060968 -2.6888315629746558 1.8203732669773154 -0.91013538817213002 -2.6408158238485862 1.77323679146886 -0.80934795233816326 -1.7928095871298437 2.6251901007503213 -0.80985625693692576 -1.8186928518543031 2.6908396840800823 -0.91086664069579804 -1.8445761165787622 2.7564892674098433 -1.0118770244546702 -1.9844078850859026 2.9019959302276197 -1.3144307881410628 -1.9585246203614433 2.8363463468978591 -1.2134204043821903 -1.9326413556369841 2.7706967635680981 -1.1124100206233178 -1.9067580909125248 2.7050471802383376 -1.0113996368644456 -1.8808748261880657 2.6393975969085766 -0.91038925310557328 -2.0465898594196652 2.8505538430561139 -1.313953400550838 -2.0207065946952056 2.7849042597263534 -1.2129430167919655 -1.9948233299707467 2.7192546763965924 -1.111932633033093 -1.9689400652462874 2.6536050930668313 -1.0109222492742209 -2.108771833753428 2.7991117558846081 -1.3134760129606131 -2.0828885690289685 2.7334621725548476 -1.2124656292017408 -2.0570053043045093 2.6678125892250866 -1.1114552454428683 -2.0311220395800502 2.6021630058953256 -1.0104448616839961 -2.19683707281165 2.8133192520428634 -1.4140090091292605 -2.1709538080871909 2.7476696687131024 -1.3129986253703883 -2.1450705433627313 2.6820200853833414 -1.211988241611516 -2.1191872786382722 2.6163705020535803 -1.1109778578526435 -2.2590190471454124 2.7618771648713576 -1.4135316215390357 -2.2331357824209532 2.6962275815415966 -1.3125212377801634 -2.2072525176964937 2.6305779982118356 -1.2115108540212913 -2.3212010214791752 2.7104350776998518 -1.4130542339488108 -2.2953177567547156 2.6447854943700908 -1.3120438501899387 -2.2694344920302565 2.5791359110403298 -1.2110334664310665 -2.3833829958129376 2.658992990528346 -1.4125768463585859 -2.3574997310884784 2.593343407198585 -1.3115664625997139 -2.4455649701467004 2.6075509033568398 -1.4120994587683613 -2.5077469444804628 2.556108816185334 -1.4116220711781364 -1.8487314302190589 2.5789067412006128 -0.80940348004396889 -1.9409424046053068 2.5896979001426192 -0.90992017792219315 -1.903134270353954 2.5338751321641011 -0.8089566748663638 -1.9953452447402018 2.5446662911061075 -0.90947337274458806 -1.957537110488849 2.4888435231275894 -0.80850986968875871 -2.0875562191264496 2.555457450048114 -1.0099900706228127 -2.0497480848750969 2.4996346820695958 -0.90902656756698297 -2.0119399506237441 2.4438119140910777 -0.80806306451115362 -2.179767193512697 2.5662486089901204 -1.1105067685010368 -2.1419590592613447 2.5104258410116023 -1.0095432654452074 -2.1041509250099919 2.4546030730330841 -0.90857976238937788 -2.0663427907586391 2.398780305054566 -0.80761625933354853 -2.234170033647592 2.5212169999536087 -1.1100599633234316 -2.1963618993962397 2.4653942319750906 -1.0090964602676022 -2.1585537651448869 2.4095714639965724 -0.9081329572117729 -2.1207456308935342 2.3537486960180543 -0.80716945415594343 -2.3263810080338398 2.5320081588956156 -1.2105766612016564 -2.2885728737824871 2.476185390917097 -1.1096131581458266 -2.2507647395311348 2.4203626229385788 -1.0086496550899973 -2.212956605279782 2.3645398549600607 -0.9076861520341678 -2.1751484710284292 2.3087170869815425 -0.80672264897833845 -2.4185919824200872 2.5427993178376225 -1.3110933590798808 -2.3807838481687349 2.4869765498591039 -1.2101298560240512 -2.3429757139173821 2.4311537818805857 -1.1091663529682214 -2.3051675796660294 2.3753310139020676 -1.0082028499123921 -2.267359445414677 2.319508245923549 -0.90723934685656282 -2.2295513111633243 2.2636854779450308 -0.80627584380073336 -2.4729948225549823 2.4977677088011108 -1.3106465539022756 -2.4351866883036295 2.4419449408225926 -1.209683050846446 -1.2294381486523935 2.9448243646013648 -0.82491067949214991 -1.3124568702752484 2.9755121492508296 -0.92446380647292314 -1.3241870391662234 3.0456539445171713 -1.0258067218510898 -1.3359172080571984 3.1157957397835134 -1.1271496372292562 -1.3476473769481736 3.1859375350498551 -1.2284925526074231 -1.3593775458391486 3.2560793303161968 -1.3298354679855895 -1.4306660985710282 3.21662531969932 -1.3280456795881963 -1.4189359296800532 3.1464835244329783 -1.2267027642100299 -1.407205760789078 3.0763417291666366 -1.125359848831863 -1.395475591898103 3.0061999339002945 -1.0240169334536966 -1.383745423007128 2.9360581386339533 -0.92267401807552996 -1.5019546513029078 3.1771713090824436 -1.3262558911908031 -1.4902244824119328 3.1070295138161015 -1.2249129758126367 -1.4784943135209576 3.0368877185497598 -1.1235700604344698 -1.4667641446299826 2.9667459232834181 -1.0222271450563034 -1.5732432040347875 3.1377172984655668 -1.3244661027934099 -1.5615130351438125 3.0675755031992247 -1.2231231874152435 -1.5497828662528375 2.997433707932883 -1.1217802720370766 -1.6445317567666671 3.0982632878486904 -1.3226763143960167 -1.6328015878756921 3.0281214925823483 -1.2213333990178503 -1.6210714189847171 2.9579796973160066 -1.1199904836396832 -1.7158203094985467 3.0588092772318136 -1.3208865259986236 -1.7040901406075717 2.9886674819654715 -1.2195436106204569 -1.7871088622304263 3.0193552666149372 -1.3190967376012304 -1.8583974149623061 2.9799012559980604 -1.3173069492038372 -1.2975950936884688 2.9070609339992739 -0.82314304098237601 -1.3594821230481204 2.8726822805361447 -0.82141974963901176 -1.4473073479238467 2.9007753026452079 -0.92093888018177794 -1.4213691524077721 2.8383036270730155 -0.81969645829564752 -1.5351325727995735 2.9288683247542706 -1.0204580107245442 -1.5091943772834984 2.8663966491820787 -0.9192155888384137 -1.4832561817674237 2.8039249736098864 -0.81797316695228328 -1.5970196021592251 2.8944896712911414 -1.01873471938118 -1.57108140664315 2.8320179957189495 -0.91749229749504935 -1.5451432111270753 2.7695463201467572 -0.81624987560891893 -1.6848448270349514 2.9225826934002042 -1.1182538499239461 -1.6589066315188767 2.8601110178280127 -1.0170114280378157 -1.6329684360028016 2.7976393422558203 -0.91576900615168511 -1.6070302404867269 2.7351676666836284 -0.81452658426555469 -1.7726700519106779 2.9506757155092673 -1.2177729804667126 -1.746731856394603 2.888204039937075 -1.1165305585805818 -1.7207936608785284 2.8257323643648835 -1.0152881366944513 -1.6948554653624532 2.7632606887926916 -0.91404571480832075 -1.6689172698463783 2.7007890132204992 -0.81280329292219033 -1.8345570812703298 2.9162970620461381 -1.2160496891233483 -1.8086188857542549 2.8538253864739462 -1.1148072672372176 -1.78268069023818 2.7913537109017543 -1.013564845351087 -1.7567424947221049 2.7288820353295624 -0.91232242346495651 -1.73080429920603 2.6664103597573701 -0.81108000157882609 -1.9223823061460563 2.9443900841552009 -1.3155688196661144 -1.8964441106299814 2.8819184085830094 -1.2143263977799841 -1.8705059151139065 2.8194467330108171 -1.1130839758938531 -0.68478663427789666 3.1322214254727796 -0.85419920340872824 -0.68005241612922285 3.2045322180851894 -0.9561943960714554 -0.67531819798054893 3.2768430106975992 -1.0581895887341826 -0.6705839798318749 3.349153803310009 -1.1601847813969095 -0.74018751965735552 3.4671027564183969 -1.3603091749024547 -0.74492173780602955 3.3947919638059876 -1.2583139822397276 -0.74965595595470358 3.3224811711935778 -1.1563187895770002 -0.75439017410337761 3.250170378581168 -1.054323596914273 -0.75912439225205142 3.1778595859687582 -0.95232840425154597 -0.8192594957801842 3.4404301243019657 -1.3564431830825452 -0.82399371392885823 3.3681193316895564 -1.254447990419818 -0.82872793207753226 3.2958085390771465 -1.1524527977570906 -0.83346215022620629 3.2234977464647367 -1.0504576050943635 -0.89833147190301288 3.4137574921855345 -1.3525771912626359 -0.90306569005168691 3.3414466995731251 -1.2505819985999085 -0.90779990820036083 3.2691359069607153 -1.1485868059371813 -0.91253412634903486 3.1968251143483055 -1.0465916132744539 -0.97740344802584167 3.3870848600691033 -1.3487111994427263 -0.9821376661745157 3.3147740674566939 -1.2467160067799992 -0.98687188432318962 3.2424632748442841 -1.1447208141172718 -1.0564754241486702 3.360412227952672 -1.344845207622817 -1.0612096422973443 3.2881014353402627 -1.2428500149600896 -1.1355474002714989 3.3337395958362408 -1.3409792158029075 -1.1402816184201729 3.2614288032238314 -1.2389840231401803 -1.2146193763943274 3.3070669637198096 -1.3371132239829981 -0.75693823458220222 3.1077259833101496 -0.85044534117949377 -0.83686874980008918 3.1516046302761676 -0.94848392359392997 -0.82437765719633238 3.084713019295616 -0.84676782950829865 -0.90430817241421946 3.128591666261634 -0.94480641192273485 -0.89181707981046254 3.0617000552810825 -0.84309031783710353 -0.98423868763210631 3.1724703132276524 -1.0428449943371711 -0.97174759502834962 3.1055787022471004 -0.94112890025153972 -0.95925650242459271 3.0386870912665489 -0.83941280616590841 -1.0641692028499934 3.2163489601936703 -1.1408835767516072 -1.0516781102462365 3.1494573492131188 -1.039167482665976 -1.0391870176424798 3.0825657382325673 -0.9374513885803446 -1.0266959250387229 3.0156741272520158 -0.83573529449471329 -1.1316086254641236 3.1933359961791368 -1.1372060650804121 -1.1191175328603666 3.1264443851985853 -1.0354899709947809 -1.1066264402566099 3.0595527742180337 -0.93377387690914948 -1.094135347652853 2.9926611632374822 -0.83205778282351817 -1.2115391406820106 3.2372146431451547 -1.2352446474948486 -1.1990480480782537 3.1703230321646032 -1.133528553409217 -1.1865569554744968 3.1034314211840521 -1.0318124593235858 -1.1740658628707401 3.0365398102035006 -0.93009636523795436 -1.1615747702669834 2.9696481992229491 -0.82838027115232293 -1.2914696558998975 3.2810932901111727 -1.3332832299092847 -1.2789785632961406 3.2142016791306216 -1.2315671358236535 -1.2664874706923837 3.1473100681500701 -1.1298510417380219 -1.253996378088627 3.0804184571695186 -1.0281349476523907 -1.2415052854848703 3.013526846188967 -0.92641885356675913 -0.032351090354587393 3.1770804353775484 -0.80731044553149389 -0.0053497495267867826 3.2488864410963481 -0.91079565419285724 -0.093929796480309552 3.2354716499296163 -0.90377594753560497 -0.066928455652508947 3.3072776556484156 -1.0072611561969682 -0.03992711482470835 3.3790836613672148 -1.1107463648583316 -0.012925773996907837 3.4508896670860141 -1.2142315735196949 -0.047503139294829411 3.5810868873568817 -1.4141822841851694 -0.07450448012262989 3.5092808816380821 -1.3106970755238061 -0.10150582095043048 3.4374748759192824 -1.2072118668624428 -0.12850716177823102 3.3656688702004831 -1.1037266582010794 -0.15550850260603161 3.2938628644816839 -1.0002414495397161 -0.13608318624835203 3.56767209619015 -1.4071625775279173 -0.16308452707615256 3.4958660904713503 -1.3036773688665539 -0.19008586790395315 3.4240600847525506 -1.2001921602051906 -0.21708720873175372 3.3522540790337514 -1.096706951543827 -0.24408854955955431 3.2804480733149521 -0.99322174288246379 -0.22466323320187476 3.5542573050234183 -1.4001428708706651 -0.25166457402967535 3.4824512993046186 -1.2966576622093018 -0.27866591485747594 3.4106452935858189 -1.1931724535479382 -0.30566725568527647 3.3388392878670197 -1.0896872448865749 -0.31324328015539737 3.5408425138566866 -1.393123164213413 -0.34024462098319797 3.4690365081378869 -1.2896379555520494 -0.36724596181099856 3.3972305024190872 -1.1861527468906861 -0.40182332710891999 3.5274277226899549 -1.3861034575561606 -0.42882466793672064 3.4556217169711552 -1.2826182488947973 -0.49040337406244261 3.5140129315232227 -1.3790837508989084 -0.51740471489024331 3.4422069258044234 -1.2755985422375449 -0.57898342101596545 3.500598140356491 -1.3720640442416561 -0.10658937991647299 3.1654476587442861 -0.80084369687138668 -0.17547437268585286 3.2229310411089065 -0.89702749911453261 -0.1786112131775226 3.154090284715672 -0.79446240546755587 -0.24749620594690247 3.2115736670802923 -0.8906462077107018 -0.2506330464385722 3.1427329106870574 -0.78808111406372494 -0.31638119871628251 3.2690570494449123 -0.98683000995384762 -0.31951803920795219 3.2002162930516778 -0.88426491630687087 -0.32265487969962192 3.1313755366584433 -0.78169982265989413 -0.38526619148566249 3.3265404318095322 -1.0830138121969934 -0.38840303197733217 3.2576996754162981 -0.98044871855001681 -0.39153987246900179 3.1888589190230636 -0.87788362490304006 -0.39467671296067153 3.1200181626298287 -0.7753185312560632 -0.45415118425504242 3.3840238141741525 -1.1791976144401395 -0.45728802474671215 3.315183057780918 -1.0766325207931626 -0.46042486523838178 3.2463423013876835 -0.97406742714618599 -0.4635617057300514 3.177501544994449 -0.87150233349920914 -0.46669854622172113 3.1086607886012145 -0.76893723985223239 -0.52617301751609213 3.3726664401455384 -1.1728163230363087 -0.52930985800776176 3.3038256837523039 -1.0702512293893318 -0.53244669849943138 3.2349849273590694 -0.96768613574235507 -0.535583538991101 3.1661441709658349 -0.86512104209537832 -0.59505801028547212 3.4301498225101583 -1.2690001252794547 -0.59819485077714196 3.3613090661169238 -1.1664350316324776 -0.60133169126881159 3.2924683097236893 -1.063869937985501 -0.60446853176048121 3.2236275533304548 -0.96130484433852426 -0.60760537225215083 3.1547867969372203 -0.8587397506915474 -0.6639430030548521 3.4876332048747782 -1.3651839275226005 -0.66707984354652183 3.4187924484815442 -1.2626188338756239 0.66944407696767239 3.5020104783884038 -1.3875119116223742 0.65148294272305352 3.4355571005822285 -1.2854098819372322 0.63352180847843487 3.3691037227760536 -1.1833078522520901 0.61556067423381611 3.3026503449698783 -1.0812058225669483 0.59759953998919735 3.2361969671637034 -0.97910379288180649 0.5796384057445787 3.1697435893575281 -0.87700176319666467 0.56301341853812448 3.5050744836872774 -1.3764093423555974 0.54505228429350572 3.438621105881102 -1.2743073126704554 0.52709115004888707 3.3721677280749272 -1.1722052829853133 0.5091300158042682 3.3057143502687518 -1.0701032533001715 0.49116888155964955 3.2392609724625769 -0.96800122361502972 0.45658276010857662 3.5081384889861509 -1.3653067730888206 0.43862162586395786 3.4416851111799756 -1.2632047434036786 0.42066049161933916 3.3752317333738007 -1.1611027137185366 0.4026993573747204 3.3087783555676253 -1.0590006840333948 0.35015210167902872 3.5112024942850244 -1.3542042038220439 0.33219096743441001 3.4447491164788491 -1.2521021741369018 0.31422983318979125 3.3782957386726742 -1.15000014445176 0.24372144324948086 3.5142664995838979 -1.3431016345552671 0.2257603090048621 3.447813121777723 -1.2409996048701251 0.13729078481993306 3.5173305048827719 -1.3319990652884903 0.5535725471534032 3.1031058078394285 -0.77342909477679733 0.46469632134325523 3.1726139374170121 -0.86435475735356471 0.37582009553310702 3.2421220669945958 -0.95528041993033186 0.33684920095651633 3.1751906620987631 -0.84936607460923408 0.28694386972295882 3.3116301965721799 -1.0462060825070991 0.24797297514636807 3.2446987916763468 -0.94029173718600123 0.2090020805697774 3.1777673867805141 -0.83437739186490356 0.19806764391281056 3.3811383261497636 -1.1371317450838661 0.15909674933621984 3.3142069212539309 -1.0312173997627685 0.12012585475962909 3.2472755163580977 -0.9253030544416706 0.081154960183038458 3.180344111462265 -0.81938870912057293 0.10919141810266247 3.4506464557273473 -1.2280574076606332 0.070220523526071721 3.3837150508315146 -1.1221430623395354 0.031249628949480968 3.3167836459356819 -1.0162287170184379 0.020315192292514259 3.5201545853049314 -1.3189830702374006 1.2770598411520893 3.2983335086346086 -1.3518029759318206 1.2733424734737844 3.230366215775597 -1.2523689918205891 1.2696251057954797 3.162398922916585 -1.1529350077093576 1.2659077381171751 3.0944316300575729 -1.0535010235981259 1.1759445015187888 3.3217161216276483 -1.3413114337729246 1.1722271338404839 3.2537488287686362 -1.2418774496616931 1.1685097661621793 3.1857815359096242 -1.1424434655504616 1.1647923984838744 3.1178142430506122 -1.0430094814392299 1.1610750308055697 3.0498469501916006 -0.94357549732799839 1.1573576631272648 2.9818796573325881 -0.84414151321676667 1.0748291618854879 3.345098734620688 -1.3308198916140286 1.0711117942071833 3.2771314417616759 -1.2313859075027971 1.0673944265288784 3.2091641489026639 -1.1319519233915656 1.0636770588505735 3.1411968560436518 -1.0325179392803339 0.9737138222521875 3.3684813476137272 -1.3203283494551326 0.96999645457388284 3.3005140547547152 -1.2208943653439011 0.96627908689557784 3.2325467618957031 -1.1214603812326696 0.87631585029719195 3.4598312534657789 -1.4092707914074685 0.87259848261888706 3.3918639606067669 -1.3098368072962365 0.86888111494058229 3.3238966677477548 -1.210402823185005 0.77520051066389128 3.4832138664588181 -1.3987792492485724 1.0571480337748684 3.0737141261273804 -0.93255387424374991 1.0385359228328801 3.0083138034240822 -0.83031178865493405 0.95463741086223308 3.1659451497128837 -1.0205324296453502 0.93602529992024475 3.1005448270095854 -0.91829034405653465 0.91741318897825641 3.0351445043062872 -0.81604825846771878 0.85212678794959751 3.2581761732983869 -1.1085109850469506 0.83351467700760928 3.1927758505950887 -1.006268899458135 0.81490256606562095 3.1273755278917905 -0.90402681386931938 0.79629045512363261 3.0619752051884919 -0.80178472828050351 0.76822827597895049 3.4158075195871884 -1.2987316260373665 0.74961616503696216 3.3504071968838902 -1.1964895404485509 0.73100405409497382 3.285006874180592 -1.0942474548597352 0.71239194315298549 3.2196065514772938 -0.99200536927091976 0.69377983221099715 3.1542062287739951 -0.88976328368210411 0.67516772126900881 3.0888059060706969 -0.78752119809328824 1.9145622591298554 3.0160424947851192 -1.405055908770263 1.8878974438668656 2.9542589981030072 -1.304211094186799 1.8612326286038756 2.8924755014208947 -1.2033662796033346 1.8345678133408858 2.8306920047387822 -1.1025214650198707 1.8079029980778958 2.7689085080566698 -1.0016766504364067 1.7812381828149058 2.7071250113745573 -0.90083183585294258 1.754573367551916 2.6453415146924448 -0.79998702126947852 1.8359447926712331 3.0533421389057644 -1.3987928847033544 1.8092799774082433 2.9915586422236524 -1.2979480701198904 1.7826151621452535 2.9297751455415399 -1.197103255536426 1.7559503468822635 2.8679916488594275 -1.0962584409529621 1.7292855316192735 2.806208152177315 -0.99541362636949815 1.7026207163562834 2.7444246554952021 -0.89456881178603387 1.7573273262126108 3.0906417830264097 -1.3925298606364458 1.730662510949621 3.0288582863442977 -1.2916850460529818 1.7039976956866312 2.9670747896621852 -1.1908402314695175 1.6773328804236414 2.9052912929800727 -1.0899954168860535 1.6506680651606513 2.8435077962979598 -0.98915060230258955 1.6787098597539885 3.1279414271470549 -1.3862668365695372 1.6520450444909986 3.0661579304649429 -1.2854220219860732 1.6253802292280088 3.0043744337828304 -1.1845772074026089 1.598715413965019 2.942590937100718 -1.0837323928191449 1.6000923932953663 3.1652410712677002 -1.3800038125026286 1.5734275780323763 3.1034575745855881 -1.2791589979191647 1.5467627627693867 3.0416740779034757 -1.1783141833357003 1.5214749268367442 3.2025407153883454 -1.37374078843572 1.4948101115737542 3.1407572187062334 -1.2728959738522558 1.4428574603781219 3.2398403595089911 -1.3674777643688114 1.6861462692405227 2.6773986154337361 -0.79399498416071668 1.6336206987340811 2.7767765006752025 -0.88856153934337079 1.6217954190574535 2.7073586469299324 -0.78811134451758003 1.5810951282276395 2.8761543859166685 -0.98312809452602512 1.5692698485510119 2.8067365321713988 -0.88267789970023414 1.5574445688743843 2.7373186784261287 -0.78222770487444337 1.5285695577211982 2.9755322711581345 -1.0776946497086792 1.5167442780445706 2.9061144174128648 -0.97724445488288847 1.5049189983679427 2.8366965636675952 -0.87679426005709749 1.4930937186913154 2.7672787099223255 -0.77634406523130672 1.4760439872147566 3.0749101563996009 -1.1722612048913335 1.464218707538129 3.0054923026543308 -1.0718110100655427 1.4523934278615014 2.9360744489090611 -0.97136081523975182 1.4405681481848736 2.8666565951637915 -0.87091062041396083 1.4287428685082462 2.7972387414185218 -0.77046042558816996 1.4235184167083148 3.1742880416410668 -1.2668277600739877 1.4116931370316874 3.1048701878957972 -1.1663775652481969 1.3998678573550598 3.0354523341505275 -1.0659273704224059 1.3880425776784322 2.9660344804052579 -0.96547717559661517 1.3762172980018044 2.8966166266599878 -0.86502698077082407 1.3709928462018732 3.2736659268825328 -1.3613943152566419 1.3591675665252456 3.2042480731372631 -1.2609441204308511 1.3473422868486182 3.1348302193919935 -1.1604939256050602 1.3355170071719906 3.0654123656467238 -1.0600437307792694 1.3236917274953632 2.9959945119014542 -0.95959353595347852 1.3118664478187354 2.9265766581561845 -0.85914334112768742 1.259340877312294 3.0259545433976509 -0.95370989631034175 1.2475155976356664 2.9565366896523808 -0.85325970148455066 2.4724110560504813 2.5205898243588396 -1.3366200948991787 2.4316676197452334 2.4669067603522539 -1.2353436075965154 2.3909241834399864 2.4132236963456686 -1.1340671202938519 2.3501807471347389 2.3595406323390837 -1.0327906329911887 2.4073218494397088 2.5711405941724186 -1.3332877468812696 2.3665784131344609 2.5174575301658328 -1.2320112595786064 2.3258349768292139 2.4637744661592476 -1.1307347722759429 2.2850915405239665 2.4100914021526627 -1.0294582849732796 2.2443481042187186 2.3564083381460765 -0.92818179767061593 2.342232642828936 2.6216913639859976 -1.3299553988633606 2.301489206523688 2.5680082999794118 -1.2286789115606973 2.260745770218441 2.5143252359728265 -1.1274024242580338 2.2200023339131936 2.4606421719662417 -1.0261259369553706 2.1792588976079457 2.4069591079596555 -0.92484944965270677 2.2771434362181635 2.6722421337995765 -1.3266230508454515 2.2363999999129156 2.6185590697929908 -1.2253465635427883 2.1956565636076686 2.5648760057864055 -1.1240700762401248 2.1549131273024207 2.5111929417798202 -1.0227935889374613 2.2120542296073911 2.7227929036131555 -1.3232907028275425 2.1713107933021432 2.6691098396065698 -1.222014215524879 2.1305673569968961 2.6154267755999845 -1.1207377282222155 2.1469650229966186 2.7733436734267345 -1.3199583548096332 2.1062215866913707 2.7196606094201488 -1.2186818675069699 2.0818758163858462 2.8238944432403135 -1.3166260067917241 2.2040108277735557 2.3023924620507543 -0.82690590869451719 2.148188552609922 2.345349801015554 -0.82358721207794627 2.1222492691594463 2.4508893779440846 -0.92152900390954373 2.0923662774462883 2.3883071399803537 -0.82026851546137536 2.0963099857089706 2.5564289548726151 -1.0194707957411415 2.0664269939958126 2.4938467169088843 -0.91821030729297282 2.0365440022826546 2.4312644789451534 -0.81694981884480444 2.0703707022584954 2.6619685318011457 -1.117412587572739 2.040487710545337 2.5993862938374148 -1.0161520991245707 2.0106047188321789 2.536804055873684 -0.9148916106764019 1.9807217271190209 2.4742218179099531 -0.81363112222823353 2.0444314188080197 2.7675081087296758 -1.2153543794043364 2.0145484270948617 2.7049258707659454 -1.114093890956168 1.9846654353817035 2.6423436328022145 -1.0128334025079997 1.9547824436685453 2.5797613948384837 -0.91157291405983099 1.9248994519553873 2.5171791568747528 -0.81031242561166261 2.0184921353575445 2.8730476856582063 -1.3132961712359339 1.9886091436443862 2.8104654476944755 -1.2120356827877654 1.958726151931228 2.7478832097307446 -1.1107751943395971 1.92884316021807 2.6853009717670142 -1.0095147058914289 1.8989601685049116 2.6227187338032834 -0.90825421744326018 1.8690771767917536 2.5601364958395525 -0.80699372899509181 1.992552851907069 2.9785872625867369 -1.4112379630675311 1.9626698601939108 2.916005024623006 -1.3099774746193629 1.9327868684807528 2.8534227866592752 -1.2087169861711944 1.9029038767675945 2.7908405486955443 -1.1074564977230261 1.8730208850544363 2.7282583107318135 -1.0061960092748579 1.8431378933412779 2.6656760727680826 -0.90493552082668927 1.8132549016281199 2.6030938348043517 -0.80367503237852089 2.9403139532484515 1.975059038718239 -1.3500560063980163 2.8891150897885058 1.9311307055399796 -1.2486288874495748 2.88817396184825 2.0371266042630105 -1.3486581629157932 2.8369750983883044 1.9931982710847511 -1.2472310439673517 2.7857762349283584 1.9492699379064915 -1.14580392501891 2.7345773714684123 1.9053416047282319 -1.0443768060704686 2.6833785080084662 1.8614132715499723 -0.94294968712202665 2.6321796445485202 1.8174849383717129 -0.84152256817358506 2.8360339704480486 2.0991941698077818 -1.3472603194335702 2.784835106988103 2.0552658366295224 -1.2458332004851287 2.7336362435281569 2.0113375034512631 -1.144406081536687 2.6824373800682109 1.9674091702730032 -1.0429789625882455 2.6312385166082648 1.9234808370947438 -0.9415518436398036 2.7838939790478472 2.1612617353525532 -1.3458624759513471 2.7326951155879016 2.1173334021742938 -1.2444353570029056 2.6814962521279555 2.0734050689960344 -1.1430082380544639 2.6302973886680094 2.0294767358177745 -1.0415811191060225 2.7317539876476458 2.2233293008973245 -1.3444646324691241 2.6805551241877001 2.1794009677190651 -1.2430375135206826 2.6293562607277541 2.1354726345408057 -1.1416103945722409 2.6796139962474443 2.2853968664420958 -1.343066788986901 2.6284151327874987 2.2414685332638364 -1.2416396700384595 2.5772162693275527 2.197540200085577 -1.1402125510900178 2.6274740048472429 2.3474644319868672 -1.341668945504678 2.5762751413872973 2.3035360988086078 -1.2402418265562365 2.5753340134470415 2.4095319975316389 -1.3402711020224551 2.5840185035593448 1.8746737765657144 -0.84009564193100406 2.5815125786759214 1.9825883746255888 -0.94013635502613691 2.5385712862585916 1.9285348963589648 -0.83864887870434301 2.579006653792498 2.0905029726854631 -1.0401770681212701 2.5360653613751682 2.0364494944188394 -0.93868959179947586 2.4931240689578384 1.9823960161522154 -0.83720211547768197 2.5335594364917449 2.1443640924787135 -1.038730304894609 2.4906181440744151 2.0903106142120897 -0.93724282857281493 2.4476768516570853 2.036257135945466 -0.83575535225102093 2.5310535116083215 2.2522786905385876 -1.1387710179897419 2.4881122191909917 2.1982252122719639 -1.037283541667948 2.4451709267736619 2.1441717340053401 -0.93579606534615389 2.4022296343563321 2.0901182557387163 -0.83430858902436 2.5285475867248977 2.3601932885984622 -1.238811731084875 2.4856062943075683 2.306139810331838 -1.1373242547630809 2.4426650018902385 2.2520863320652147 -1.035836778441287 2.3997237094729087 2.1980328537985905 -0.93434930211949296 2.3567824170555789 2.1439793755319667 -0.83286182579769896 2.5260416618414743 2.4681078866583364 -1.3388524441800078 2.4831003694241445 2.4140544083917126 -1.2373649678582139 2.4401590770068151 2.3600009301250884 -1.13587749153642 2.3972177845894853 2.3059474518584651 -1.0343900152146261 2.3542764921721555 2.2518939735918408 -0.93290253889283192 2.3113351997548257 2.1978404953252171 -0.83141506257103803 2.3088292748714023 2.3057550933850917 -0.93145577566617099 2.2658879824540725 2.2517016151184674 -0.82996829934437699 3.2424592222541238 1.4153766147902831 -1.3514696866195379 3.1834267736673887 1.382665154414946 -1.2499869987646701 3.1243943250806536 1.3499536940396091 -1.1485043109098023 3.065361876493919 1.317242233664272 -1.0470216230549345 3.0063294279071839 1.2845307732889348 -0.9455389352000666 2.9472969793204489 1.2518193129135977 -0.8440562473451988 3.2043736182197868 1.4864117137360158 -1.351315105834757 3.1453411696330518 1.4537002533606787 -1.2498324179798892 3.0863087210463167 1.4209887929853418 -1.1483497301250214 3.0272762724595821 1.3882773326100046 -1.0468670422701536 2.968243823872847 1.3555658722346673 -0.94538435441528568 3.1662880141854499 1.5574468126817487 -1.3511605250499761 3.1072555655987149 1.5247353523064116 -1.2496778371951083 3.0482231170119798 1.4920238919310747 -1.1481951493402405 2.9891906684252452 1.4593124315557373 -1.0467124614853727 3.128202410151113 1.6284819116274813 -1.3510059442651952 3.0691699615643779 1.5957704512521442 -1.2495232564103274 3.0101375129776429 1.5630589908768073 -1.1480405685554596 2.9511050643909083 1.53034753050147 -1.0465578807005917 3.0901168061167761 1.699517010573214 -1.3508513634804142 3.031084357530041 1.6668055501978769 -1.2493686756255464 2.972051908943306 1.6340940898225398 -1.1478859877706786 3.0520312020824392 1.7705521095189467 -1.3506967826956333 2.9929987534957041 1.7378406491436096 -1.2492140948407657 3.0139455980481022 1.8415872084646794 -1.3505422019108526 2.9758599940137653 1.9126223074104121 -1.3503876211260717 2.9106254849013271 1.3201873384756944 -0.84388645311560007 2.9303199743416131 1.4262958950213336 -0.94522803342367745 2.8772402708831049 1.3823572936095143 -0.84368130402737007 2.8969347603233908 1.4884658501551533 -0.94502288433544746 2.8438550568648826 1.444527248743334 -0.84347615493914008 2.9166292497636772 1.5945744067007923 -1.0463644646435251 2.8635495463051686 1.550635805288973 -0.94481773524721746 2.8104698428466603 1.5066972038771538 -0.84327100585091008 2.9363237392039632 1.7006829632464313 -1.1477060449516023 2.883244035745455 1.656744361834612 -1.0461593155552951 2.8301643322869463 1.6128057604227928 -0.94461258615898747 2.7770846288284381 1.5688671590109735 -0.84306585676268009 2.9560182286442496 1.8067915197920705 -1.24904762525968 2.9029385251857409 1.762852918380251 -1.1475008958633723 2.8498588217272327 1.7189143169684318 -1.0459541664670651 2.7967791182687245 1.6749757155566125 -0.94440743707075736 2.7436994148102163 1.6310371141447932 -0.84286070767444998 2.9226330146260273 1.8689614749258903 -1.2488424761714501 2.8695533111675191 1.8250228735140708 -1.1472957467751423 2.8164736077090109 1.7810842721022517 -1.0457490173788351 2.7633939042505022 1.7371456706904322 -0.94420228798252737 2.710314200791994 1.693207069278613 -0.84265555858621999 2.8361680971492973 1.8871928286478907 -1.1470905976869126 2.7830883936907886 1.8432542272360715 -1.0455438682906051 2.7300086902322804 1.799315625824252 -0.94399713889429726 2.6769289867737722 1.7553770244124329 -0.84245040949798988 3.4591234478492172 0.73433593929899332 -1.3462717443189181 3.3947627149888255 0.71399810604976732 -1.2447723708293459 3.3304019821284347 0.69366027280054121 -1.1432729973397735 3.2660412492680435 0.6733224395513151 -1.0417736238502013 3.2016805164076523 0.65298460630208899 -0.94027425036062884 3.1373197835472606 0.63264677305286277 -0.83877487687105656 3.4361850110788783 0.81145834432567954 -1.3469285301349976 3.3718242782184866 0.79112051107645354 -1.2454291566454254 3.3074635453580958 0.77078267782722742 -1.143929783155853 3.2431028124977046 0.75044484457800131 -1.0424304096662809 3.1787420796373129 0.73010701132877509 -0.94093103617670837 3.4132465743085394 0.88858074935236586 -1.3475853159510771 3.3488858414481477 0.86824291610313975 -1.2460859424615049 3.2845251085877569 0.84790508285391364 -1.1445865689719326 3.2201643757273657 0.82756724960468753 -1.0430871954823604 3.1558036428669736 0.8072294163554613 -0.94158782199278779 3.3903081375382005 0.96570315437905196 -1.3482421017671564 3.3259474046778088 0.94536532112982585 -1.2467427282775843 3.2615866718174176 0.92502748788059974 -1.1452433547880121 3.1972259389570263 0.90468965463137363 -1.0437439812984399 3.3673697007678616 1.0428255594057383 -1.348898887583236 3.3030089679074699 1.0224877261565122 -1.2473995140936638 3.2386482350470787 1.0021498929072861 -1.1459001406040916 3.3444312639975227 1.1199479644324244 -1.3495556733993153 3.280070531137131 1.0996101311831983 -1.2480562999097431 3.3214928272271833 1.1970703694591105 -1.3502124592153948 3.2571320943667916 1.1767325362098844 -1.2487130857258226 3.2985543904568444 1.2741927744857968 -1.3508692450314741 3.1146896618852651 0.70874180514111385 -0.83942686322111737 3.0945676553161059 0.77647925272206286 -0.84003980635586573 3.135187206174145 0.87661441254904204 -0.94220846180055973 3.0744456487469467 0.84421670030301188 -0.84065274949061408 3.1758067570321846 0.97674957237602156 -1.0443771172452541 3.1150651996049858 0.94435186012999117 -0.94282140493530808 3.0543236421777875 0.9119541478839609 -0.84126569262536244 3.2164263078902238 1.0768847322030008 -1.1465457726899482 3.1556847504630254 1.0444870199569705 -1.0449900603800024 3.0949431930358267 1.0120893077109401 -0.94343434807005644 3.0342016356086283 0.97969159546490991 -0.84187863576011079 3.1963043013210646 1.1446221797839498 -1.1471587158246965 3.1355627438938662 1.1122244675379194 -1.0456030035147508 3.0748211864666675 1.079826755291889 -0.94404729120480479 3.0140796290394691 1.0474290430458588 -0.84249157889485915 3.2369238521791033 1.2447573396109293 -1.2493273712693909 3.1761822947519054 1.2123596273648989 -1.1477716589594449 3.1154407373247071 1.1799619151188685 -1.0462159466494991 3.0546991798975083 1.1475642028728381 -0.94466023433955315 2.9939576224703099 1.1151664906268077 -0.84310452202960751 3.2775434030371429 1.3448924994379086 -1.351496026714085 3.2168018456099441 1.3124947871918782 -1.2499403144041392 3.1560602881827458 1.2800970749458478 -1.1483846020941935 3.0953187307555474 1.2476993626998174 -1.0468288897842477 3.0345771733283491 1.215301650453787 -0.94527317747430162 2.9738356159011508 1.1829039382077566 -0.84371746516435586 3.5310293526494778 0.023736631796536733 -1.3357626394821052 3.4639206307347314 0.016542786248875507 -1.2342669465496696 3.3968119088199851 0.0093489407012143366 -1.1327712536172341 3.3297031869052391 0.0021550951535531104 -1.0312755606847988 3.5239412651119051 0.10388714603508831 -1.336968977194563 3.4568325431971587 0.096693300487427136 -1.2354732842621274 3.3897238212824123 0.089499454939765966 -1.1339775913296919 3.3226150993676664 0.082305609392104767 -1.0324818983972566 3.25550637745292 0.075111763844443583 -0.93098620546482069 3.1883976555381737 0.067917918296782342 -0.82949051253238515 3.5168531775743324 0.18403766027363994 -1.3381753149070208 3.449744455659586 0.17684381472597877 -1.2366796219745853 3.3826357337448396 0.16964996917831762 -1.1351839290421497 3.3155270118300937 0.1624561236306564 -1.0336882361097144 3.2484182899153473 0.15526227808299525 -0.9321925431772784 3.5097650900367596 0.26418817451219179 -1.3393816526194786 3.4426563681220133 0.25699432896453056 -1.2378859596870431 3.3755476462072673 0.24980048341686945 -1.1363902667546075 3.308438924292521 0.24260663786920822 -1.034894573822172 3.5026770024991869 0.34433868875074342 -1.3405879903319364 3.435568280584441 0.33714484320308219 -1.2390922973995009 3.3684595586696946 0.32995099765542113 -1.1375966044670653 3.4955889149616146 0.42448920298929504 -1.341794328044394 3.4284801930468682 0.41729535744163382 -1.2402986351119587 3.4885008274240419 0.50463971722784662 -1.3430006657568518 3.421392105509296 0.49744587168018545 -1.2415049728244163 3.4814127398864696 0.5847902314663983 -1.3442070034693094 3.182221072800679 0.13855223839316683 -0.83065829990195306 3.2419671565765844 0.22876293176675533 -0.93337194213662467 3.1760587768720105 0.20903740288833927 -0.83182548303841219 3.3017132403524898 0.31897362514034394 -1.0360855843712966 3.2358048606479159 0.29924809626192778 -0.9345391252730838 3.1698964809433421 0.27952256738351172 -0.83299266617487133 3.3614593241283952 0.4091843185139325 -1.1387992266059681 3.2955509444238213 0.38945878963551639 -1.0372527675077556 3.2296425647192475 0.36973326075710022 -0.93570630840954294 3.1637341850146736 0.35000773187868417 -0.83415984931133047 3.3552970281997267 0.47966948300910495 -1.1399664097424274 3.2893886484951529 0.45994395413068889 -1.0384199506442149 3.223480268790579 0.44021842525227267 -0.93687349154600208 3.1575718890860052 0.42049289637385662 -0.8353270324477895 3.4150431119756322 0.5698801763826935 -1.2426800519770991 3.3491347322710583 0.55015464750427745 -1.1411335928788864 3.2832263525664844 0.5304291186258614 -1.0395871337806739 3.2173179728619106 0.51070358974744523 -0.93804067468246111 3.1514095931573367 0.49097806086902906 -0.83649421558424863 3.474789195751538 0.66009086975628195 -1.3453936942117706 3.4088808160469637 0.64036534087786601 -1.2438472351135581 3.3429724363423898 0.62063981199944995 -1.1423007760153456 3.277064056637816 0.60091428312103379 -1.0407543169171332 3.2111556769332421 0.58118875424261762 -0.93920785781892024 3.1452472972286678 0.56146322536420157 -0.83766139872070766 3.4562923248857085 -0.68621994432120714 -1.3215626694829776 3.4652417222550529 -0.6061769124575016 -1.3231578219940558 3.3980547412982895 -0.59990095897500584 -1.2216803059905474 3.3308677603415271 -0.59362500549250963 -1.1202027899870388 3.2636807793847638 -0.58734905201001364 -1.0187252739835304 3.1964937984280009 -0.58107309852751754 -0.91724775798002178 3.1293068174712384 -0.57479714504502144 -0.81577024197651327 3.4741911196243973 -0.52613388059379607 -1.3247529745051341 3.407004138667634 -0.51985792711130041 -1.2232754585016257 3.3398171577108715 -0.5135819736288042 -1.121797942498117 3.2726301767541082 -0.50730602014630821 -1.0203204264946086 3.2054431957973457 -0.50103006666381211 -0.91884291049110001 3.4831405169937417 -0.44609084873009064 -1.3263481270162123 3.4159535360369784 -0.43981489524759498 -1.2248706110127039 3.3487665550802159 -0.43353894176509877 -1.1233930950091953 3.2815795741234526 -0.42726298828260273 -1.0219155790056869 3.4920899143630861 -0.36604781686638527 -1.3279432795272905 3.4249029334063228 -0.35977186338388956 -1.2264657635237821 3.3577159524495603 -0.35349590990139335 -1.1249882475202735 3.5010393117324305 -0.28600478500267978 -1.3295384320383687 3.4338523307756672 -0.27972883152018402 -1.2280609160348603 3.3666653498189048 -0.27345287803768786 -1.1265834000313515 3.5099887091017745 -0.20596175313897444 -1.331133584549447 3.4428017281450121 -0.19968579965647854 -1.2296560685459383 3.5189381064711189 -0.1259187212752691 -1.3327287370605252 3.1373744834438471 -0.50347324132116489 -0.81733101411550646 3.2138082498962235 -0.4267653975438177 -0.92041527835467851 3.1453477115918282 -0.43308319965238007 -0.81888810394539546 3.2902420163485995 -0.35005755376647069 -1.0234995425938507 3.2217814780442047 -0.356375355875033 -0.92197236818456751 3.1533209397398094 -0.36269315798359536 -0.82044519377528446 3.2982152444965807 -0.27966751209768592 -1.0250566324237398 3.2297547061921859 -0.28598531420624818 -0.92352945801445652 3.1612941678877906 -0.29230311631481054 -0.82200228360517358 3.3746490109489566 -0.2029596683203389 -1.1281408966629116 3.3061884726445618 -0.20927747042890121 -1.0266137222536289 3.237727934340167 -0.21559527253746347 -0.92508654784434552 3.1692673960357718 -0.22191307464602583 -0.82355937343506258 3.4510827774013331 -0.12625182454299189 -1.2312251609020837 3.3826222390969378 -0.1325696266515542 -1.1296979864928007 3.314161700792543 -0.1388874287601165 -1.028170812083518 3.2457011624881478 -0.14520523086867876 -0.92664363767423463 3.177240624183753 -0.15152303297724112 -0.82511646326495169 3.5275165438537091 -0.049543980765644799 -1.3343094251412557 3.4590560055493138 -0.055861782874207115 -1.2327822507319728 3.390595467244919 -0.062179584982769404 -1.1312550763226898 3.3221349289405242 -0.068497387091331713 -1.0297279019134071 3.253674390636129 -0.074815189199893994 -0.92820072750412363 3.1852138523317342 -0.081132991308456304 -0.8266735530948407 3.2616476187841097 -0.004425147531109291 -0.92975781733401275 3.1931870804797149 -0.010742949639671581 -0.82823064292472981 3.3278394269118223 -1.3085382001785022 -1.4080063905515772 3.2632886480495986 -1.2889493827666096 -1.3065605015918236 3.1987378691873745 -1.2693605653547169 -1.20511461263207 3.1341870903251503 -1.2497717479428241 -1.1036687236723166 3.0696363114629266 -1.2301829305309315 -1.002222834712563 3.0050855326007024 -1.2105941131190388 -0.90077694575280931 2.9405347537384787 -1.191005295707146 -0.79933105679305583 3.3524519659412979 -1.2317133362180355 -1.4098886816822309 3.2879011870790742 -1.2121245188061429 -1.3084427927224773 3.22335040821685 -1.1925357013942501 -1.2069969037627237 3.1587996293546259 -1.1729468839823574 -1.1055510148029704 3.0942488504924022 -1.1533580665704648 -1.0041051258432168 3.029698071630178 -1.133769249158572 -0.90265923688346317 3.3770645049707735 -1.1548884722575687 -1.4117709728128847 3.3125137261085498 -1.1352996548456762 -1.3103250838531311 3.2479629472463256 -1.1157108374337834 -1.2088791948933777 3.1834121683841015 -1.0961220200218906 -1.1074333059336241 3.1188613895218777 -1.0765332026099979 -1.0059874169738707 3.4016770440002491 -1.0780636082971018 -1.4136532639435384 3.3371262651380253 -1.0584747908852092 -1.312207374983785 3.2725754862758012 -1.0388859734733165 -1.2107614860240314 3.208024707413577 -1.0192971560614237 -1.1093155970642781 3.3617388041675009 -0.9816499269247424 -1.3140896661144388 3.2971880253052768 -0.96206110951284962 -1.2126437771546854 3.2326372464430526 -0.94247229210095673 -1.1111978881949318 3.3863513431969765 -0.90482506296427556 -1.3159719572450927 3.3218005643347523 -0.88523624555238278 -1.2145260682853392 3.4109638822264521 -0.82800019900380872 -1.3178542483757465 2.9627163728229391 -1.1221153064082638 -0.80117895070025857 3.0527690991835521 -1.0619761018440357 -0.90451971581301815 2.9844726538172512 -1.0546136822182577 -0.80302082612488679 3.1428218255441656 -1.0018368972798077 -1.0078604809257778 3.0745253801778643 -0.99447447765402952 -0.90636159123764637 3.0062289348115634 -0.98711205802825142 -0.804862701549515 3.1645781065384777 -0.93433527308980158 -1.0097023563504062 3.096281661172176 -0.92697285346402325 -0.90820346666227458 3.0279852158058751 -0.91961043383824514 -0.80670457697414322 3.2546308328990907 -0.87419606852557341 -1.1130431214631658 3.1863343875327894 -0.86683364889979531 -1.0115442317750345 3.1180379421664881 -0.85947122927401698 -0.9100453420869028 3.0497414968001868 -0.85210880964823887 -0.80854645239877154 3.3446835592597042 -0.81405686396134536 -1.2163838865759253 3.2763871138934029 -0.80669444433556725 -1.1148849968877941 3.2080906685271016 -0.79933202470978904 -1.0133861071996628 3.1397942231608003 -0.79196960508401071 -0.91188721751153112 3.071497777794499 -0.7846071854582326 -0.81038832782339976 3.4347362856203176 -0.7539176593971173 -1.3197246516886849 3.3664398402540163 -0.74655523977133909 -1.2182257620005534 3.298143394887715 -0.73919282014556098 -1.1167268723124222 3.2298469495214133 -0.73183040051978276 -1.0152279826242909 3.161550504155112 -0.72446798089400444 -0.91372909293615934 3.0932540587888107 -0.71710556126822633 -0.81223020324802808 3.388196121248328 -0.67905361558133293 -1.2200676374251818 3.3198996758820272 -0.67169119595555471 -1.1185687477370505 3.2516032305157254 -0.66432877632977649 -1.0170698580489193 3.1833067851494237 -0.65696635670399828 -0.91557096836078766 3.1150103397831228 -0.64960393707822006 -0.8140720786726563 2.9861569895292934 -1.9482047842832151 -1.3892689930864659 2.9269343751754424 -1.9159659810046015 -1.2878691638725563 2.8677117608215918 -1.8837271777259881 -1.1864693346586466 2.8084891464677408 -1.8514883744473745 -1.085069505444737 2.7492665321138903 -1.8192495711687611 -0.98366967623082735 2.6900439177600393 -1.7870107678901475 -0.88226984701691746 2.6308213034061887 -1.7547719646115341 -0.7808700178030078 3.0254909366211638 -1.8775813975902016 -1.3913710862200686 2.9662683222673127 -1.845342594311588 -1.289971257006159 2.9070457079134622 -1.8131037910329746 -1.1885714277922492 2.8478230935596112 -1.780864987754361 -1.0871715985783397 2.7886004792057606 -1.7486261844757476 -0.9857717693644299 2.7293778648519096 -1.716387381197134 -0.88437194015052001 3.0648248837130341 -1.8069580108971881 -1.3934731793536712 3.0056022693591831 -1.7747192076185745 -1.2920733501397617 2.9463796550053325 -1.7424804043399611 -1.1906735209258519 2.8871570406514815 -1.7102416010613477 -1.0892736917119421 2.8279344262976309 -1.6780027977827341 -0.98787386249803255 3.1041588308049044 -1.7363346242041746 -1.3955752724872739 3.0449362164510534 -1.704095820925561 -1.2941754432733641 2.9857136020972028 -1.6718570176469476 -1.1927756140594545 2.9264909877433518 -1.6396182143683342 -1.0913757848455448 3.1434927778967747 -1.6657112375111613 -1.3976773656208765 3.0842701635429237 -1.6334724342325477 -1.2962775364069667 3.0250475491890731 -1.6012336309539343 -1.194877707193057 2.9658249348352221 -1.5689948276753209 -1.0934778779791472 3.1828267249886451 -1.5950878508181479 -1.399779458754479 3.123604110634794 -1.5628490475395342 -1.2983796295405692 3.0643814962809439 -1.5306102442609208 -1.1969798003266596 3.2221606720805158 -1.5244644641251344 -1.4018815518880816 3.1629380577266648 -1.492225660846521 -1.3004817226741718 3.2614946191723861 -1.4538410774321209 -1.403983645021684 3.3008285662642569 -1.3832176907391074 -1.4060857381552867 2.666330288175891 -1.6912516621459281 -0.78293459764713824 2.7663724710385118 -1.6501082295807479 -0.88645109021562629 2.700995803082701 -1.6292977117054603 -0.78499090516687375 2.8664146539011326 -1.6089647970155678 -0.98996758278411456 2.8010379859453223 -1.5881542791402801 -0.8885073977353618 2.7356613179895115 -1.5673437612649925 -0.78704721268660927 2.9010801688079431 -1.5470108465751 -0.99202389030385008 2.8357035008521323 -1.5262003286998123 -0.89056370525509732 2.7703268328963215 -1.5053898108245247 -0.78910352020634478 3.0011223516705638 -1.5058674140099197 -1.095540382872338 2.9357456837147535 -1.485056896134632 -0.99408019782358559 2.8703690157589428 -1.4642463782593444 -0.89262001277483283 2.804992347803132 -1.4434358603840567 -0.79115982772608018 3.1011645345331851 -1.4647239814447395 -1.1990568754408262 3.0357878665773743 -1.4439134635694519 -1.0975966903920735 2.9704111986215636 -1.4231029456941642 -0.9961365053433211 2.9050345306657528 -1.4022924278188766 -0.89467632029456823 2.839657862709942 -1.3814819099435889 -0.79321613524581569 3.2012067173958059 -1.4235805488795594 -1.3025733680093141 3.1358300494399951 -1.4027700310042717 -1.2011131829605617 3.0704533814841843 -1.3819595131289841 -1.099652997911809 3.005076713528374 -1.3611489952536964 -0.9981928128630565 2.9397000455725633 -1.3403384773784088 -0.89673262781430374 2.8743233776167525 -1.3195279595031211 -0.79527244276555109 3.2358722323026163 -1.3616265984390916 -1.3046296755290496 3.1704955643468056 -1.3408160805638039 -1.2031694904802972 3.1051188963909948 -1.3200055626885161 -1.1017093054315445 3.039742228435184 -1.2991950448132286 -1.0002491203827919 2.9743655604793733 -1.2783845269379408 -0.89878893533403914 2.9089888925235625 -1.257574009062653 -0.7973287502852866 2.5217852779741863 -2.5047994977853518 -1.3689093605959151 2.4704824004506953 -2.4610917289553789 -1.267571751509232 2.4191795229272044 -2.4173839601254059 -1.1662341424225486 2.5743506327372039 -2.443131560777013 -1.3711829424029804 2.5230477552137129 -2.39942379194704 -1.2698453333162973 2.471744877690222 -2.3557160231170671 -1.168507724229614 2.4204420001667315 -2.3120082542870941 -1.0671701151429309 2.3691391226432406 -2.2683004854571216 -0.9658325060562476 2.3178362451197492 -2.2245927166271482 -0.86449489696956394 2.6269159875002215 -2.3814636237686742 -1.3734565242100458 2.5756131099767305 -2.3377558549387016 -1.2721189151233627 2.5243102324532396 -2.2940480861087282 -1.1707813060366794 2.4730073549297491 -2.2503403172787557 -1.0694436969499963 2.4217044774062582 -2.2066325484487828 -0.96810608786331298 2.6794813422632391 -2.3197956867603358 -1.3757301060171112 2.6281784647397481 -2.2760879179303628 -1.2743924969304281 2.5768755872162572 -2.2323801491003898 -1.1730548878437448 2.5255727096927667 -2.1886723802704169 -1.0717172787570617 2.7320466970262567 -2.2581277497519969 -1.3780036878241766 2.6807438195027657 -2.214419980922024 -1.2766660787374935 2.6294409419792748 -2.170712212092051 -1.1753284696508102 2.5781380644557843 -2.127004443262078 -1.0739908605641268 2.7846120517892743 -2.1964598127436581 -1.380277269631242 2.7333091742657833 -2.1527520439136856 -1.2789396605445589 2.6820062967422924 -2.1090442750837126 -1.1776020514578756 2.8371774065522919 -2.1347918757353197 -1.3825508514383074 2.7858745290288009 -2.0910841069053467 -1.281213242351624 2.8897427613153095 -2.0731239387269809 -1.3848244332453727 2.9423081160783271 -2.0114560017186425 -1.3870980150524381 2.3673647493350436 -2.1665983610894948 -0.86674288058308657 2.4733096073809682 -2.1461261648111436 -0.97037157575215949 2.4135672730595754 -2.1126273383140952 -0.86896282887152998 2.3538249387381831 -2.0791285118170468 -0.76755408199090069 2.5195121311055 -2.092155142035744 -0.97259152404060289 2.4597697967841072 -2.0586563155386957 -0.87118277715997339 2.4000274624627149 -2.0251574890416473 -0.7697740302793441 2.6254569891514241 -2.0716829457573933 -1.0762202192096757 2.5657146548300318 -2.0381841192603449 -0.9748114723290463 2.5059723205086391 -2.0046852927632965 -0.87340272544841679 2.4462299861872467 -1.9711864662662479 -0.77199397856778751 2.7314018471973482 -2.0512107494790421 -1.1798489143787483 2.6716595128759559 -2.0177119229819938 -1.0784401674981192 2.6119171785545636 -1.9842130964849456 -0.97703142061748971 2.5521748442331709 -1.9507142699878972 -0.8756226737368602 2.4924325099117786 -1.9172154434908486 -0.77421392685623092 2.8373467052432724 -2.030738553200691 -1.2834776095478211 2.7776043709218801 -1.9972397267036426 -1.1820688626671918 2.7178620366004878 -1.9637409002065944 -1.0806601157865625 2.6581197022790954 -1.9302420737095463 -0.97925136890593312 2.5983773679577027 -1.8967432472124979 -0.87784262202530361 2.5386350336363104 -1.8632444207154493 -0.77643387514467432 2.8835492289678042 -1.9767675304252914 -1.2856975578362646 2.8238068946464119 -1.943268703928243 -1.1842888109556351 2.7640645603250196 -1.9097698774311949 -1.082880064075006 2.7043222260036273 -1.8762710509341467 -0.98147131719437652 2.6445798916822345 -1.8427722244370985 -0.88006257031374702 2.5848375573608422 -1.8092733979400499 -0.77865382343311773 2.018069015174218 -2.9047339581030487 -1.349727463965092 1.9770910484541349 -2.8512595735024568 -1.2484698151188662 1.9361130817340519 -2.7977851889018646 -1.1472121662726407 1.8951351150139688 -2.7443108043012727 -1.0459545174264149 1.8541571482938859 -2.6908364197006804 -0.9446968685801892 1.8131791815738028 -2.6373620351000886 -0.84343921973396319 2.0818665842497541 -2.8544456410827257 -1.3521326489421044 2.0408886175296708 -2.8009712564821339 -1.2508750000958786 1.9999106508095879 -2.747496871881542 -1.149617351249653 1.9589326840895047 -2.6940224872809497 -1.0483597024034272 1.9179547173694218 -2.6405481026803579 -0.94710205355720167 2.1456641533252903 -2.8041573240624027 -1.3545378339191168 2.1046861866052069 -2.7506829394618109 -1.253280185072891 2.063708219885124 -2.697208554861219 -1.1520225362266654 2.0227302531650406 -2.6437341702606272 -1.0507648873804398 2.2094617224008264 -2.7538690070420797 -1.3569430188961291 2.1684837556807426 -2.7003946224414879 -1.2556853700499033 2.1275057889606597 -2.646920237840896 -1.1544277212036778 2.0865278222405768 -2.5934458532403042 -1.0531700723574522 2.2732592914763621 -2.7035806900217572 -1.3593482038731415 2.2322813247562787 -2.6501063054211649 -1.2580905550269159 2.1913033580361958 -2.5966319208205735 -1.1568329061806903 2.3370568605518982 -2.6532923730014342 -1.3617533888501541 2.2960788938318144 -2.5998179884008423 -1.2604957400039283 2.4008544296274339 -2.6030040559811116 -1.3641585738271664 2.4646519987029696 -2.5527157389607886 -1.366563758804179 1.8732954203735537 -2.5900695346008877 -0.84581490867828202 1.9807293260422076 -2.5910922569259713 -0.94949904223797776 1.9292041548926027 -2.5462010438732992 -0.84815688571018732 2.0366380605612568 -2.5472237661983828 -0.95184101926988307 1.9851128894116519 -2.5023325531457106 -0.85049886274209263 2.1440719662299101 -2.5482464885234664 -1.0555251528295786 2.0925467950803061 -2.5033552754707942 -0.95418299630178838 2.0410216239307011 -2.458464062418122 -0.85284083977399805 2.2515058718985639 -2.54926921084855 -1.1592092863892742 2.1999807007489594 -2.5043779977958773 -1.0578671298614839 2.1484555295993553 -2.4594867847432056 -0.95652497333369368 2.0969303584497503 -2.414595571690533 -0.85518281680590336 2.3589397775672172 -2.5502919331736331 -1.2628934199489696 2.3074146064176131 -2.5054007201209614 -1.1615512634211795 2.2558894352680086 -2.4605095070682887 -1.0602091068933892 2.204364264118404 -2.415618294015617 -0.9588669503655991 2.1528390929687991 -2.3707270809629444 -0.85752479383780877 2.4148485120862664 -2.5064234424460445 -1.2652353969808749 2.3633233409366619 -2.4615322293933724 -1.1638932404530848 2.3117981697870573 -2.4166410163407002 -1.0625510839252947 2.2602729986374532 -2.371749803288028 -0.96120892739750441 2.2087478274878483 -2.3268585902353558 -0.85986677086971408 2.3677069043061065 -2.3727725256131111 -1.0648930609572 2.316181733156502 -2.327881312560439 -0.96355090442940983 2.264656562006897 -2.2829900995077668 -0.8622087479016195 1.3802939584124754 -3.2430599495497479 -1.3273960171213326 1.3517621573152878 -3.1820371367969802 -1.2262365560516921 1.3232303562181005 -3.1210143240442134 -1.1250770949820514 1.2946985551209131 -3.0599915112914458 -1.023917633912411 1.2661667540237256 -2.998968698538679 -0.92275817284277029 1.2376349529265382 -2.9379458857859113 -0.82159871177312938 1.4528735657472158 -3.2061479583072612 -1.3298928848086158 1.4243417646500283 -3.1451251455544935 -1.2287334237389753 1.3958099635528409 -3.0841023328017267 -1.1275739626693346 1.3672781624556536 -3.0230795200489591 -1.0264145015996942 1.3387463613584663 -2.9620567072961923 -0.92525504053005347 1.5254531730819563 -3.1692359670647745 -1.332389752495899 1.4969213719847687 -3.1082131543120068 -1.2312302914262587 1.4683895708875814 -3.0471903415592401 -1.130070830356618 1.439857769790394 -2.9861675288064728 -1.0289113692869774 1.5980327804166967 -3.1323239758222878 -1.3348866201831824 1.5695009793195092 -3.0713011630695202 -1.2337271591135419 1.5409691782223218 -3.0102783503167534 -1.1325676980439012 1.5124373771251345 -2.9492555375639862 -1.0314082369742608 1.6706123877514374 -3.0954119845798012 -1.3373834878704658 1.6420805866542498 -3.0343891718270335 -1.2362240268008253 1.6135487855570625 -2.9733663590742667 -1.1350645657311846 1.7431919950861778 -3.0584999933373145 -1.339880355557749 1.7146601939889905 -2.9974771805845473 -1.2387208944881085 1.8157716024209185 -3.0215880020948283 -1.3423772232450324 1.888351209755659 -2.9846760108523416 -1.3448740909323156 1.3058820435838232 -2.9033235969469242 -0.824060995508476 1.4102229685925156 -2.9257276432919905 -0.92774310361130574 1.3692672201382794 -2.8712707930599013 -0.82648446942122522 1.4736081451469718 -2.8936748394049676 -0.93016657752405496 1.4326523966927356 -2.8392179891728784 -0.82890794333397444 1.5779490701556644 -2.9160788857500335 -1.0338486856268843 1.536993321701428 -2.8616220355179447 -0.93259005143680418 1.4960375732471918 -2.8071651852858555 -0.83133141724672366 1.6822899951643571 -2.9384829320950994 -1.1375307937297137 1.6413342467101206 -2.8840260818630106 -1.0362721595396336 1.6003784982558842 -2.8295692316309218 -0.9350135253495534 1.559422749801648 -2.7751123813988325 -0.83375489115947288 1.7866309201730495 -2.9608869784401652 -1.2412129018325431 1.7456751717188133 -2.9064301282080764 -1.1399542676424628 1.7047194232645768 -2.8519732779759877 -1.0386956334523827 1.6637636748103404 -2.7975164277438984 -0.93743699926230262 1.6228079263561042 -2.7430595775118092 -0.8361783650722221 1.8500160967275057 -2.9288341745531423 -1.2436363757452922 1.8090603482732694 -2.8743773243210535 -1.1423777415552121 1.768104599819033 -2.8199204740889643 -1.041119107365132 1.7271488513647968 -2.7654636238568751 -0.93986047317505184 1.6861931029105603 -2.7110067736247863 -0.83860183898497143 1.9543570217361983 -2.9512382208982082 -1.3473184838481214 1.9134012732819619 -2.8967813706661194 -1.2460598496580413 1.8724455248277256 -2.8423245204340302 -1.1448012154679612 1.8314897763734894 -2.7878676702019414 -1.0435425812778811 1.790534027919253 -2.7334108199698521 -0.94228394708780105 1.7495782794650168 -2.6789539697377629 -0.84102531289772064 0.70280722410505725 -3.5099769288334879 -1.4056909190447953 0.68844021881825901 -3.4441208728029102 -1.3046461657989434 0.67407321353146077 -3.3782648167723335 -1.2036014125530918 0.65970620824466275 -3.3124087607417563 -1.10255665930724 0.78134824879188602 -3.4879175125371846 -1.4082319858453332 0.76698124350508778 -3.422061456506607 -1.3071872325994813 0.75261423821828954 -3.3562054004760302 -1.2061424793536297 0.73824723293149153 -3.290349344445453 -1.1050977261077779 0.7238802276446934 -3.2244932884148763 -1.0040529728619263 0.70951322235789538 -3.1586372323842991 -0.90300821961607458 0.8598892734787148 -3.4658580962408814 -1.4107730526458711 0.84552226819191656 -3.4000020402103037 -1.3097282994000192 0.83115526290511843 -3.334145984179727 -1.2086835461541676 0.8167882576183203 -3.2682899281491502 -1.1076387929083158 0.80242125233152228 -3.202433872118573 -1.0065940396624642 0.93843029816554357 -3.4437986799445781 -1.4133141194464089 0.92406329287874533 -3.3779426239140005 -1.3122693662005571 0.90969628759194721 -3.3120865678834237 -1.2112246129547055 0.89532928230514919 -3.2462305118528469 -1.1101798597088537 0.88096227701835117 -3.1803744558222702 -1.0091351064630021 1.0026043175655741 -3.3558832076176976 -1.314810433001095 0.98823731227877598 -3.2900271515871204 -1.2137656797552434 0.97387030699197807 -3.2241710955565441 -1.1127209265093916 1.0811453422524029 -3.3338237913213944 -1.3173514998016329 1.0667783369656048 -3.2679677352908176 -1.2163067465557813 1.1596863669392319 -3.3117643750250911 -1.3198925666021708 1.2382273916260607 -3.2897049587287883 -1.3224336334027087 0.69007904446447088 -3.0942898092170896 -0.80192248514160658 0.78677204161630732 -3.1369595629510036 -0.90553891646124007 0.75839808370402761 -3.0752737514901107 -0.80438088068638791 0.85509108085586405 -3.1179435052240247 -0.90799731200602141 0.82671712294358435 -3.0562576937631318 -0.80683927623116924 0.95178407800770048 -3.1606132589579388 -1.0116137433256549 0.92341012009542078 -3.0989274474970459 -0.91045570755080274 0.89503616218314119 -3.0372416360361525 -0.80929767177595058 1.0484770751595367 -3.2032830126918528 -1.1152301746452882 1.0201031172472572 -3.1415972012309594 -1.0140721388704361 0.99172915933497752 -3.079911389770067 -0.91291410309558407 0.96335520142269804 -3.0182255783091736 -0.81175606732073191 1.1451700723113729 -3.2459527664257664 -1.2188466059649212 1.1167961143990934 -3.1842669549648734 -1.1176885701900694 1.088422156486814 -3.1225811435039801 -1.0165305344152176 1.0600481985745345 -3.0608953320430876 -0.91537249864036541 1.031674240662255 -2.9992095205821943 -0.81421446286551324 1.2134891115509296 -3.226936708698787 -1.2213050015097027 1.1851151536386502 -3.1652508972378945 -1.1201469657348508 1.1567411957263707 -3.1035650857770012 -1.0189889299599988 1.1283672378140912 -3.0418792743161083 -0.91783089418514674 1.0999932799018117 -2.9801934628552154 -0.81667285841029458 1.3101821087027661 -3.269606462432701 -1.3249214328293359 1.2818081507904864 -3.2079206509718081 -1.2237633970544841 1.2534341928782069 -3.1462348395109152 -1.1226053612796321 1.2250602349659274 -3.0845490280500223 -1.0214473255047802 1.1966862770536479 -3.0228632165891294 -0.92028928972992818 1.1683123191413685 -2.961177405128236 -0.81913125395507591 0.052929194220003195 -3.5613950188021395 -1.3855111359273851 0.053883397918739195 -3.4938698548179099 -1.2845932386823731 0.054837601617475196 -3.4263446908336812 -1.1836753414373613 0.055791805316211085 -3.3588195268494525 -1.0827574441923495 0.056746009014947058 -3.2912943628652238 -0.98183954694733777 0.057700212713683072 -3.2237691988809951 -0.880921649702326 0.13434879188663096 -3.5550621769230131 -1.3880348450975653 0.1353029955853669 -3.4875370129387835 -1.2871169478525533 0.1362571992841029 -3.4200118489545548 -1.1861990506075415 0.13721140298283882 -3.3524866849703261 -1.0852811533625297 0.13816560668157474 -3.2849615209860974 -0.98436325611751785 0.21576838955325867 -3.5487293350438867 -1.3905585542677452 0.21672259325199467 -3.4812041710596571 -1.2896406570227332 0.21767679695073061 -3.4136790070754284 -1.1887227597777215 0.21863100064946656 -3.3461538430911997 -1.0878048625327097 0.21958520434820245 -3.278628679106971 -0.98688696528769804 0.29718798721988637 -3.5423964931647602 -1.3930822634379254 0.29814219091862237 -3.4748713291805307 -1.2921643661929134 0.29909639461735837 -3.407346165196302 -1.1912464689479016 0.30005059831609426 -3.3398210012120733 -1.0903285717028899 0.3786075848865143 -3.5360636512856338 -1.3956059726081054 0.3795617885852503 -3.4685384873014042 -1.2946880753630934 0.3805159922839863 -3.4010133233171755 -1.1937701781180816 0.46002718255314201 -3.5297308094065074 -1.3981296817782856 0.46098138625187807 -3.4622056454222778 -1.2972117845332736 0.46193558995061401 -3.3946804814380491 -1.1962938872882618 0.54144678021976977 -3.5233979675273805 -1.4006533909484655 0.54240098391850577 -3.4558728035431514 -1.2997354937034535 0.62286637788639754 -3.5170651256482541 -1.4031771001186457 0.052717545201875105 -3.1567960832854318 -0.77995483980647984 0.13748390984022929 -3.2175884735334797 -0.88343188102717662 0.12323946237804034 -3.1514765776808518 -0.78238876524684209 0.20800582701639447 -3.2122689679288996 -0.88586580646753887 0.19376137955420553 -3.1461570720762722 -0.78482269068720434 0.29277219165474855 -3.2730613581769474 -0.98934284768823533 0.27852774419255966 -3.2069494623243195 -0.88829973190790112 0.26428329673037071 -3.1408375664716921 -0.78725661612756659 0.37753855629310257 -3.3338537484249948 -1.092819888908932 0.36329410883091373 -3.2677418525723674 -0.99177677312859758 0.34904966136872484 -3.2016299567197399 -0.89073365734826337 0.33480521390653595 -3.1355180608671125 -0.78969054156792884 0.44806047346926775 -3.3285342428204148 -1.0952538143492943 0.43381602600707891 -3.2624223469677873 -0.99421069856895983 0.41957157854489002 -3.1963104511151599 -0.89316758278862562 0.40532713108270113 -3.1301985552625324 -0.79212446700829109 0.53282683810762177 -3.3893266330684626 -1.1987308555699907 0.51858239064543299 -3.3232147372158347 -1.0976877397896565 0.5043379431832441 -3.2571028413632073 -0.99664462400932208 0.49009349572105521 -3.1909909455105803 -0.89560150822898787 0.47584904825886631 -3.1248790496579528 -0.79455839244865334 0.61759320274597584 -3.45011902331651 -1.3022078967906872 0.60334875528378695 -3.3840071274638825 -1.201164781010353 0.58910430782159817 -3.3178952316112551 -1.1001216652300188 0.57485986035940928 -3.2517833357586277 -0.99907854944968433 0.56061541289722039 -3.1856714399060002 -0.89803543366935012 0.5463709654350315 -3.1195595440533728 -0.79699231788901548 0.64538177753557446 -3.2464638301540476 -1.0015124748900466 0.63113733007338568 -3.1803519343014206 -0.90046935910971226 0.61689288261119679 -3.1142400384487932 -0.79942624332937773 -0.57906303789713964 -3.0937028297695406 -0.7577988387046255 -0.57207880481929729 -3.0709263562985374 -0.63983553306748531 -0.56509457174145505 -3.0481498828275337 -0.52187222743034523 -0.55811033866361259 -3.0253734093565301 -0.40390892179320509 -0.55112610558577035 -3.0025969358855265 -0.28594561615606473 -0.54414187250792811 -2.9798204624145228 -0.16798231051892459 -0.50921910062851905 -3.1011236466870549 -0.76052259855462923 -0.5022348675506767 -3.0783471732160517 -0.64255929291748903 -0.49525063447283441 -3.0555706997450476 -0.52459598728034895 -0.488266401394992 -3.0327942262740444 -0.40663268164320882 -0.48128216831714976 -3.0100177528030407 -0.28866937600606851 -0.47429793523930747 -2.9872412793320371 -0.17070607036892835 -0.4393751633598984 -3.1085444636045687 -0.76324635840463295 -0.43239093028205611 -3.0857679901335655 -0.64528305276749276 -0.42540669720421381 -3.0629915166625619 -0.52731974713035268 -0.41842246412637141 -3.0402150431915582 -0.40935644149321254 -0.41143823104852911 -3.0174385697205546 -0.29139313585607229 -0.36254699301343546 -3.0931888070510798 -0.64800681261749649 -0.35556275993559316 -3.0704123335800757 -0.5300435069803564 -0.34857852685775081 -3.0476358601090725 -0.41208020134321632 -0.29270305574481481 -3.1006096239685936 -0.65073057246750021 -0.28571882266697252 -3.07783315049759 -0.53276726683036013 -0.27873458958913017 -3.0550566770265863 -0.41480396119322005 -0.22285911847619422 -3.1080304408861079 -0.65345433231750405 -0.21587488539835195 -3.0852539674151038 -0.53549102668036386 -0.15301518120757354 -3.1154512578036218 -0.65617809216750778 -0.083171243938952991 -3.122872074721136 -0.65890185201751161 -0.017071573943349509 -3.1299128471034732 -0.66156897186537855 -0.015600811829634404 -3.1065767542578393 -0.54352226325926778 -0.014130049715919302 -3.0832406614122054 -0.42547555465315684 -0.012659287602204196 -3.0599045685665716 -0.30742884604704601 -0.011188525488489087 -3.0365684757209377 -0.18938213744093521 -0.0097177633747739783 -3.0132323828753034 -0.071335428834824299 -0.081600743827988875 -3.0995461053197011 -0.54085665216063405 -0.080129981714273796 -3.0762100124740672 -0.42280994355452312 -0.078659219600558689 -3.0528739196284334 -0.30476323494841229 -0.077188457486843581 -3.0295378267827995 -0.18671652634230151 -0.075717695373128474 -3.0062017339371652 -0.068669817736190589 -0.14760067582634342 -3.0925154563815629 -0.53819104106200033 -0.14612991371262837 -3.069179363535929 -0.42014433245588939 -0.14465915159891327 -3.0458432706902951 -0.30209762384977856 -0.14318838948519816 -3.0225071778446613 -0.18405091524366782 -0.14171762737148305 -2.999171084999027 -0.066004206637556878 -0.21212984571098287 -3.0621487145977913 -0.41747872135725567 -0.21065908359726776 -3.0388126217521574 -0.29943201275114489 -0.20918832148355265 -3.0154765289065235 -0.18138530414503412 -0.20771755936983755 -2.9921404360608892 -0.063338595538923168 -0.27665901559562223 -3.0317819728140192 -0.29676640165251122 -0.27518825348190712 -3.0084458799683853 -0.17871969304640042 -0.27371749136819201 -2.985109787122751 -0.060672984440289464 -0.34265894759397675 -3.0247513238758814 -0.2941007905538775 -0.34118818548026164 -3.0014152310302475 -0.17605408194776673 -0.33971742336654653 -2.9780791381846132 -0.05800737334165576 -0.40718811747861627 -2.9943845820921093 -0.173388470849133 -0.40571735536490117 -2.971048489246475 -0.05534176224302205 -0.47171728736325563 -2.9640178403083373 -0.052676151144388346 -0.5377172193616101 -2.9569871913701991 -0.050010540045754642 -1.1836171534749711 -2.9129522254158484 -0.73528607431189452 -1.1715197327341285 -2.8922447052468931 -0.61744307862195624 -1.159422311993286 -2.8715371850779383 -0.49960008293201785 -1.1473248912524436 -2.8508296649089839 -0.38175708724207946 -1.135227470511601 -2.8301221447400287 -0.26391409155214102 -1.1231300497707584 -2.8094146245710738 -0.14607109586220268 -1.1165581214602698 -2.9338092878793756 -0.73777530676926806 -1.1044607007194271 -2.9131017677104207 -0.61993231107932978 -1.0923632799785847 -2.8923942475414659 -0.50208931538939139 -1.0802658592377423 -2.8716867273725111 -0.38424631969945305 -1.0681684384968997 -2.8509792072035562 -0.26640332400951461 -1.0560710177560573 -2.8302716870346014 -0.14856032831957622 -1.0494990894455685 -2.9546663503429027 -0.74026453922664159 -1.0374016687047258 -2.9339588301739483 -0.62242154353670331 -1.0253042479638834 -2.913251310004993 -0.50457854784676492 -1.013206827223041 -2.8925437898360382 -0.38673555215682665 -1.0011094064821984 -2.8718362696670834 -0.26889255646688814 -0.98244005743086726 -2.9755234128064303 -0.74275377168401513 -0.97034263669002463 -2.9548158926374755 -0.62491077599407685 -0.95824521594918211 -2.9341083724685202 -0.50706778030413846 -0.9461477952083398 -2.9134008522995658 -0.38922478461420018 -0.91538102541616606 -2.9963804752699574 -0.74524300414138867 -0.90328360467532343 -2.975672955101003 -0.62740000845145039 -0.8911861839344809 -2.9549654349320478 -0.509557012761512 -0.87908876319363849 -2.9342579147630929 -0.39171401707157377 -0.84832199340146464 -3.017237537733485 -0.7477322365987622 -0.836224572660622 -2.9965300175645302 -0.62988924090882392 -0.82412715191977948 -2.9758224973955754 -0.51204624521888564 -0.78126296138676343 -3.0380946001970126 -0.75022146905613574 -0.7691655406459208 -3.0173870800280578 -0.63237847336619757 -0.71420392937206212 -3.0589516626605397 -0.75271070151350938 -0.6471448973573608 -3.0798087251240673 -0.75519993397088292 -1.1120161351355808 -2.788403746949295 -0.028203861121973126 -1.0486587015676387 -2.8081190702108798 -0.030601865644520228 -0.99206233790144505 -2.8501878838988484 -0.15097438316596343 -0.98530126799969653 -2.8278343934724646 -0.032999870167067333 -0.9354659742352518 -2.8922566975868178 -0.27134690068740658 -0.92870490433350295 -2.8699032071604331 -0.15337238768851053 -0.92194383443175432 -2.8475497167340493 -0.035397874689614438 -0.87210854066730958 -2.9119720208484026 -0.2737449052099537 -0.86534747076556084 -2.8896185304220179 -0.15577039221105762 -0.8585864008638121 -2.8672650399956341 -0.037795879212161543 -0.81551217700111611 -2.9540408345363716 -0.39411742273139705 -0.80875110709936737 -2.9316873441099873 -0.27614290973250083 -0.80199003719761863 -2.9093338536836026 -0.15816839673360472 -0.79522896729586989 -2.8869803632572184 -0.040193883734708648 -0.75891581333492264 -2.9961096482243406 -0.51448994025284023 -0.7521547434331739 -2.9737561577979563 -0.39651542725394412 -0.74539367353142516 -2.9514026673715721 -0.2785409142550479 -0.73863260362967642 -2.9290491769451874 -0.16056640125615182 -0.73187153372792768 -2.9066956865188027 -0.042591888257255753 -0.70231944966872917 -3.03817846191231 -0.63486245777428341 -0.69555837976698043 -3.0158249714859253 -0.51688794477538735 -0.68879730986523169 -2.9934714810595411 -0.39891343177649125 -0.68203623996348295 -2.9711179906331564 -0.28093891877759503 -0.67527517006173421 -2.9487645002067722 -0.16296440577869889 -0.66851410015998547 -2.9264110097803875 -0.044989892779802858 -0.63896201610078684 -3.0578937851738948 -0.63726046229683053 -0.63220094619903822 -3.0355402947475101 -0.51928594929793448 -0.62543987629728948 -3.0131868043211258 -0.40131143629903832 -0.61867880639554074 -2.9908333138947412 -0.2833369233001421 -0.611917736493792 -2.9684798234683565 -0.16536241030124599 -0.60515666659204337 -2.9461263330419722 -0.047387897302349963 -1.7407192253348578 -2.6150810306937911 -0.71385452633554614 -1.7242504144352766 -2.5974322061666495 -0.59600819563422114 -1.7077816035356954 -2.5797833816395075 -0.47816186493289614 -1.6913127926361142 -2.5621345571123655 -0.3603155342315712 -1.674843981736533 -2.5444857325852235 -0.24246920353024606 -1.6583751708369521 -2.526836908058081 -0.12462287282892109 -1.6788603039614931 -2.6486789789890728 -0.71623209917332487 -1.6623914930619119 -2.6310301544619312 -0.59838576847199987 -1.6459226821623307 -2.6133813299347888 -0.48053943777067482 -1.6294538712627495 -2.5957325054076468 -0.36269310706934987 -1.6129850603631686 -2.5780836808805048 -0.24484677636802477 -1.5965162494635874 -2.5604348563533623 -0.1270004456666998 -1.6170013825881282 -2.6822769272843545 -0.7186096720111036 -1.600532571688547 -2.664628102757213 -0.6007633413097786 -1.584063760788966 -2.6469792782300705 -0.48291701060845349 -1.5675949498893846 -2.6293304537029285 -0.36507067990712855 -1.5511261389898039 -2.6116816291757861 -0.24722434920580347 -1.5551424612147635 -2.7158748755796362 -0.72098724484888221 -1.5386736503151823 -2.6982260510524942 -0.60314091414755722 -1.5222048394156014 -2.6805772265253518 -0.48529458344623216 -1.50573602851602 -2.6629284019982098 -0.36744825274490728 -1.4932835398413988 -2.749472823874918 -0.72336481768666083 -1.4768147289418176 -2.7318239993477755 -0.60551848698533584 -1.4603459180422367 -2.7141751748206335 -0.48767215628401084 -1.4314246184680341 -2.7830707721701997 -0.72574239052443956 -1.414955807568453 -2.7654219476430573 -0.60789605982311457 -1.398486996668872 -2.7477731231159148 -0.49004972912178957 -1.3695656970946692 -2.8166687204654814 -0.72811996336221829 -1.3530968861950883 -2.799019895938339 -0.61027363266089329 -1.3077067757213048 -2.8502666687607627 -0.73049753619999691 -1.2458478543479399 -2.8838646170560445 -0.73287510903777553 -1.6430373383974703 -2.5085834607435498 -0.006776086782686451 -1.5844755845486267 -2.5404187383165353 -0.0091523321429741317 -1.5376161152516987 -2.5924510325778432 -0.12937682726280561 -1.525913830699783 -2.5722540158895209 -0.011528577503261812 -1.4907566459547705 -2.6444833268391514 -0.24960132238263705 -1.4790543614028551 -2.6242863101508287 -0.1317530726230933 -1.4673520768509394 -2.6040892934625064 -0.013904822863549495 -1.4438971766578423 -2.6965156211004593 -0.36982581750246868 -1.4321948921059269 -2.676318604412137 -0.25197756774292474 -1.4204926075540114 -2.6561215877238142 -0.13412931798338099 -1.4087903230020957 -2.6359245710354919 -0.016281068223837177 -1.3853354228089987 -2.7283508986734448 -0.37220206286275637 -1.3736331382570832 -2.7081538819851225 -0.25435381310321242 -1.3619308537051678 -2.6879568652967998 -0.13650556334366867 -1.3502285691532521 -2.6677598486084775 -0.018657313584124861 -1.3384759535120705 -2.7803831929347527 -0.49242655798258783 -1.326773668960155 -2.7601861762464304 -0.37457830822304405 -1.3150713844082396 -2.7399891595581081 -0.25673005846350011 -1.3033690998563241 -2.7197921428697853 -0.13888180870395636 -1.2916668153044086 -2.699595126181463 -0.021033558944412542 -1.2916164842151425 -2.8324154871960605 -0.61265105310241941 -1.2799141996632268 -2.8122184705077382 -0.49480280334287552 -1.2682119151113114 -2.7920214538194159 -0.37695455358333174 -1.2565096305593959 -2.7718244371310936 -0.2591063038237878 -1.2448073460074804 -2.7516274204427713 -0.14125805406424405 -1.233105061455565 -2.731430403754449 -0.023409804304700226 -1.2330547303662989 -2.8642507647690461 -0.61502729846270698 -1.2213524458143832 -2.8440537480807238 -0.49717904870316321 -1.2096501612624679 -2.8238567313924019 -0.37933079894361943 -1.1979478767105525 -2.8036597147040792 -0.26148254918407549 -1.186245592158637 -2.7834626980157569 -0.14363429942453174 -1.1745433076067215 -2.7632656813274346 -0.025786049664987907 -2.127699443386486 -2.1425471534278002 -0.10333384108962732 -2.1477030777842856 -2.1563290460030515 -0.22125847759355868 -2.1677067121820848 -2.1701109385783033 -0.33918311409749019 -2.1734805071935561 -2.2565614017239723 -0.69527479525581803 -2.1534768727957565 -2.2427795091487202 -0.57735015875188667 -2.1334732383979573 -2.2289976165734688 -0.45942552224795535 -2.1134696040001577 -2.2152157239982175 -0.34150088574402399 -2.0934659696023585 -2.2014338314229658 -0.22357624924009245 -2.0734623352045589 -2.1876519388477145 -0.1056516127361611 -2.1192433990116291 -2.3016661871438866 -0.69759256690235183 -2.0992397646138294 -2.2878842945686344 -0.57966793039842046 -2.0792361302160303 -2.2741024019933831 -0.46174329389448915 -2.0592324958182306 -2.2603205094181318 -0.34381865739055778 -2.0392288614204315 -2.2465386168428805 -0.22589402088662625 -2.065006290829702 -2.3467709725638008 -0.69991033854888562 -2.0450026564319024 -2.3329890799885491 -0.58198570204495426 -2.0249990220341032 -2.3192071874132973 -0.46406106554102289 -2.004995387636304 -2.305425294838046 -0.34613642903709152 -2.0107691826477749 -2.3918757579837151 -0.70222811019541942 -1.9907655482499755 -2.3780938654084633 -0.58430347369148805 -1.9707619138521764 -2.364311972833212 -0.46637883718755668 -1.9565320744658481 -2.4369805434036294 -0.70454588184195321 -1.9365284400680487 -2.423198650828378 -0.58662124533802185 -1.9165248056702495 -2.4094167582531263 -0.46869660883409042 -1.902294966283921 -2.4820853288235436 -0.70686365348848701 -1.8822913318861216 -2.4683034362482923 -0.58893901698455564 -1.848057858101994 -2.5271901142434579 -0.7091814251350208 -1.7938207499200671 -2.5722948996633725 -0.71149919678155449 -2.0218911538892126 -2.2305817905127703 -0.10801989886874759 -1.9863807165139045 -2.290510249230806 -0.22823811087177709 -1.9704920705273437 -2.2733712401087178 -0.11039144594587821 -1.9508702791385963 -2.3504387079488414 -0.34845632287480671 -1.9349816331520353 -2.3332996988267531 -0.2306096579489077 -1.9190929871654745 -2.3161606897046649 -0.11276299302300884 -1.8994711957767272 -2.3932281575447889 -0.35082786995193732 -1.8835825497901664 -2.3760891484227007 -0.23298120502603831 -1.8676939038036053 -2.358950139300612 -0.11513454010013946 -1.8639607584014188 -2.4531566162628247 -0.47104608195496678 -1.848072112414858 -2.4360176071407365 -0.35319941702906793 -1.8321834664282972 -2.4188785980186482 -0.23535275210316894 -1.8162948204417362 -2.4017395888965596 -0.11750608717727008 -1.8284503210261107 -2.5130850749808604 -0.59126429395799629 -1.8125616750395497 -2.4959460658587718 -0.47341762903209739 -1.7966730290529889 -2.478807056736684 -0.35557096410619854 -1.7807843830664281 -2.4616680476145953 -0.23772429918029955 -1.7648957370798672 -2.4445290384925071 -0.11987763425440069 -1.7490070910933064 -2.4273900293704185 -0.002030969328501843 -1.7770512376642416 -2.5558745245768075 -0.5936358410351269 -1.7611625916776805 -2.5387355154547193 -0.475789176109228 -1.7452739456911197 -2.5215965063326311 -0.35794251118332915 -1.7293852997045591 -2.5044574972105429 -0.24009584625743016 -1.7134966537179981 -2.4873184880884542 -0.12224918133153131 -1.6976080077314375 -2.470179478966366 -0.0044025164056324456 -2.5797937074415342 -1.7732193749312564 -0.67475986879671435 -2.5571823440201449 -1.7639398546294538 -0.55672426085704063 -2.5345709805987546 -1.7546603343276517 -0.43868865291736692 -2.5119596171773653 -1.7453808140258493 -0.32065304497769315 -2.4893482537559755 -1.736101293724047 -0.20261743703801927 -2.4667368903345852 -1.7268217734222446 -0.084581829098345537 -2.5353384704405286 -1.8280957681291992 -0.67702732057030768 -2.5127271070191393 -1.8188162478273968 -0.55899171263063396 -2.490115743597749 -1.8095367275255945 -0.4409561046909603 -2.4675043801763592 -1.8002572072237921 -0.32292049675128653 -2.4448930167549694 -1.7909776869219898 -0.20488488881161263 -2.490883233439523 -1.8829721613271422 -0.67929477234390112 -2.4682718700181332 -1.8736926410253398 -0.5612591644042273 -2.4456605065967429 -1.8644131207235375 -0.44322355646455369 -2.4230491431753531 -1.8551336004217351 -0.32518794852487992 -2.4464279964385174 -1.9378485545250852 -0.68156222411749445 -2.4238166330171276 -1.9285690342232826 -0.56352661617782074 -2.4012052695957373 -1.9192895139214805 -0.44549100823814702 -2.4019727594375118 -1.992724947723028 -0.6838296758910879 -2.379361396016122 -1.9834454274212256 -0.56579406795141407 -2.3567500325947317 -1.9741659071194233 -0.44775846001174041 -2.3575175224365057 -2.0476013409209708 -0.68609712766468123 -2.3349061590151159 -2.0383218206191684 -0.56806151972500751 -2.3130622854354996 -2.102477734118914 -0.68836457943827467 -2.268607048434494 -2.1573541273168568 -0.690632031211868 -2.424506153610849 -1.7790108450485143 -0.086923758626467271 -2.401609596762452 -1.8444384592017689 -0.2071915738010443 -2.3823634285939277 -1.8310935935779966 -0.089268634845296471 -2.3787130399140546 -1.9098660733550235 -0.32745938897562143 -2.3594668717455307 -1.8965212077312512 -0.2095364500198735 -2.3402207035770064 -1.883176342107479 -0.091613511064125672 -2.3365703148971333 -1.9619488218845058 -0.32980426519445066 -2.317324146728609 -1.9486039562607336 -0.21188132623870271 -2.2980779785600851 -1.9352590906369613 -0.093958387282954872 -2.3136737580487359 -2.0273764360377604 -0.45007208036902763 -2.294427589880212 -2.0140315704139882 -0.33214914141327984 -2.2751814217116877 -2.0006867047902159 -0.21422620245753191 -2.2559352535431634 -1.9873418391664437 -0.096303263501784073 -2.2907772012003393 -2.092804050191015 -0.57033989554360476 -2.2715310330318146 -2.0794591845672428 -0.45241695658785686 -2.2522848648632907 -2.0661143189434705 -0.33449401763210906 -2.2330386966947664 -2.0527694533196983 -0.21657107867636111 -2.2137925285262421 -2.039424587695926 -0.098648139720613273 -2.2486344761834176 -2.1448867987204974 -0.57268477176243393 -2.2293883080148933 -2.1315419330967251 -0.45476183280668608 -2.210142139846369 -2.1181970674729529 -0.33683889385093824 -2.1908959716778447 -2.1048522018491806 -0.21891595489519031 -2.1716498035093204 -2.0915073362254084 -0.10099301593944249 -2.2257379193350206 -2.210314412873752 -0.69295258693701089 -2.2064917511664959 -2.1969695472499793 -0.5750296479812631 -2.1872455829979716 -2.183624681626207 -0.45710670902551526 -2.8809352813767752 -1.2185406878800222 -0.65479681988587057 -2.8567347966010543 -1.2141996597185445 -0.53664207858048352 -2.8325343118253334 -1.2098586315570672 -0.41848733727509635 -2.808333827049613 -1.2055176033955897 -0.30033259596970924 -2.7841333422738921 -1.2011765752341121 -0.18217785466432201 -2.7599328574981712 -1.1968355470726346 -0.064023113358934902 -2.8480187022962649 -1.2810488397952908 -0.65700090055619487 -2.823818217520544 -1.2767078116338131 -0.53884615925080781 -2.7996177327448231 -1.2723667834723358 -0.42069141794542064 -2.7754172479691026 -1.2680257553108583 -0.30253667664003353 -2.7512167631933817 -1.2636847271493807 -0.18438193533464631 -2.8151021232157545 -1.3435569917105594 -0.65920498122651916 -2.7909016384400336 -1.3392159635490817 -0.5410502399211321 -2.7667011536643127 -1.3348749353876044 -0.42289549861574494 -2.7425006688885922 -1.3305339072261269 -0.30474075731035782 -2.7821855441352441 -1.4060651436258278 -0.66140906189684345 -2.7579850593595232 -1.4017241154643503 -0.5432543205914564 -2.7337845745838023 -1.397383087302873 -0.42509957928606923 -2.7492689650547337 -1.4685732955410962 -0.66361314256716775 -2.7250684802790128 -1.4642322673796189 -0.54545840126178069 -2.7008679955032919 -1.4598912392181413 -0.42730365995639352 -2.7163523859742233 -1.5310814474563648 -0.66581722323749204 -2.6921519011985025 -1.5267404192948872 -0.54766248193210498 -2.683435806893713 -1.5935895993716334 -0.66802130390781633 -2.6505192278132026 -1.6560977512869017 -0.67022538457814063 -2.7286818299719462 -1.2562613368529703 -0.066307363343236697 -2.7191761714528546 -1.3245717282809955 -0.18662818059838635 -2.697478039149543 -1.3155997077678467 -0.06859388700926887 -2.709670512933763 -1.3928821197090206 -0.30694899785353619 -2.6879723806304514 -1.3839100991958717 -0.18891470426441853 -2.6662742483271398 -1.3749380786827232 -0.070880410675301042 -2.6784667221113598 -1.4522204906238969 -0.30923552151956835 -2.6567685898080482 -1.443248470110748 -0.19120122793045069 -2.6350704575047366 -1.4342764495975995 -0.073166934341333215 -2.6689610635922683 -1.5205308820519221 -0.42955633877471805 -2.6472629312889566 -1.5115588615387732 -0.3115220451856005 -2.625564798985645 -1.5025868410256242 -0.19348775159648285 -2.6038666666823334 -1.4936148205124757 -0.075453458007365387 -2.6594554050731767 -1.5888412734799473 -0.54987715602986775 -2.637757272769865 -1.5798692529667986 -0.43184286244075021 -2.6160591404665534 -1.5708972324536497 -0.31380856885163266 -2.5943610081632418 -1.5619252119405007 -0.19577427526251504 -2.5726628758599297 -1.5529531914273522 -0.077739981673397573 -2.6282516142507735 -1.6481796443948236 -0.55216367969589986 -2.6065534819474618 -1.6392076238816748 -0.43412938610678237 -2.5848553496441502 -1.6302356033685259 -0.31609509251766482 -2.5631572173408386 -1.6212635828553772 -0.19806079892854722 -2.5414590850375265 -1.6122915623422285 -0.080026505339429746 -2.6187459557316819 -1.7164900358228488 -0.6724844969510495 -2.5970478234283703 -1.7075180153096998 -0.55445020336193207 -2.5753496911250586 -1.6985459947965511 -0.43641590977281458 -2.553651558821747 -1.6895739742834022 -0.31838161618369704 -2.5319534265184349 -1.6806019537702537 -0.20034732259457938 -2.5102552942151228 -1.671629933257105 -0.082313029005461918 -2.9411678155727952 -0.61939606022987281 -0.044298665024801613 -2.9658771609364702 -0.61859279452923921 -0.16256921514765499 -2.9905865063001453 -0.61778952882860549 -0.28083976527050847 -3.0152958516638204 -0.61698626312797189 -0.39911031539336184 -3.0400051970274955 -0.61618299742733817 -0.5173808655162152 -3.0647145423911701 -0.61537973172670446 -0.63565141563906857 -3.0894238877548452 -0.61457646602607097 -0.75392196576192227 -3.0693224030354589 -0.68228276787709552 -0.75603447312743466 -3.0446130576717838 -0.68308603357772912 -0.63776392300458096 -3.0199037123081092 -0.68388929927836273 -0.51949337288172759 -2.9951943669444341 -0.68469256497899644 -0.40122282275887428 -2.970485021580759 -0.68549583067963016 -0.28295227263602091 -2.9457756762170839 -0.68629909638026376 -0.1646817225131674 -3.0492209183160726 -0.74998906972812007 -0.75814698049294704 -3.0245115729523975 -0.75079233542875379 -0.63987643037009334 -2.9998022275887228 -0.75159560112938739 -0.52160588024723997 -2.9750928822250478 -0.752398866830021 -0.40333533012438672 -2.9503835368613727 -0.75320213253065471 -0.28506478000153335 -3.0291194335966862 -0.81769537157914485 -0.76025948785845943 -3.0044100882330111 -0.81849863727977856 -0.64198893773560572 -2.9797007428693361 -0.81930190298041217 -0.52371838761275236 -2.954991397505661 -0.82010516868104577 -0.40544783748989915 -3.0090179488772995 -0.8854016734301694 -0.76237199522397181 -2.9843086035136248 -0.88620493913080312 -0.64410144510111811 -2.9595992581499497 -0.88700820483143672 -0.52583089497826474 -2.9348899127862746 -0.88781147053207032 -0.40756034485541154 -2.9889164641579131 -0.95310797528119395 -0.7644845025894843 -2.9642071187942385 -0.95391124098182767 -0.6462139524666306 -2.939497773430563 -0.95471450668246127 -0.52794340234377723 -2.9441056340748517 -1.0216175428328522 -0.64832645983214299 -2.9240041493554649 -1.0893238446838771 -0.65043896719765548 -2.9220901668759631 -0.68377914908039727 -0.04648731195802068 -2.9262069623628735 -0.75227610660016975 -0.16683385042578655 -2.9030415561141489 -0.74806798529570029 -0.048678118354054764 -2.9303237578497838 -0.82077306411994211 -0.28718038889355263 -2.9071583516010593 -0.81656494281547276 -0.16902465682182063 -2.8839929453523352 -0.8123568215110033 -0.050868924750088848 -2.9112751470879701 -0.88506190033524512 -0.28937119528958671 -2.8881097408392455 -0.88085377903077577 -0.17121546321785472 -2.864944334590521 -0.8766456577263062 -0.053059731146122932 -2.9153919425748804 -0.95355885785501748 -0.40971773375735254 -2.8922265363261559 -0.94935073655054802 -0.2915620016856208 -2.8690611300774314 -0.94514261524607879 -0.1734062696138888 -2.8458957238287068 -0.94093449394160922 -0.055250537542157016 -2.9195087380617908 -1.0220558153747898 -0.53006427222511843 -2.8963433318130662 -1.0178476940703205 -0.41190854015338663 -2.8731779255643422 -1.0136395727658509 -0.29375280808165488 -2.8500125193156176 -1.0094314514613818 -0.17559707600992289 -2.8268471130668931 -1.0052233301569122 -0.057441343938191107 -2.900460127299977 -1.0863446515900927 -0.53225507862115251 -2.8772947210512525 -1.0821365302856234 -0.41409934654942071 -2.854129314802528 -1.0779284089811538 -0.29594361447768891 -2.8309639085538034 -1.0737202876766847 -0.17778788240595697 -2.8077985023050793 -1.0695121663722151 -0.059632150334225191 -2.9045769227868874 -1.1548416091098654 -0.6526016170889184 -2.8814115165381629 -1.1506334878053959 -0.53444588501718659 -2.8582461102894383 -1.1464253665009265 -0.41629015294545485 -2.8350807040407142 -1.142217245196457 -0.29813442087372299 -2.8119152977919897 -1.1380091238919876 -0.17997868880199108 -2.7887498915432651 -1.133801002587518 -0.061822956730259282 -3.0033726329213462 -0.0179311950275679 -0.025833996906156884 -3.0275019829711667 -0.012019674337556191 -0.14421334350627293 -3.0516313330209872 -0.0061081536475445404 -0.26259269010638908 -3.0757606830708073 -0.00019663295753289704 -0.38097203670650509 -3.1416194464182343 -0.052749854044480848 -0.73808811138293529 -3.1174900963684138 -0.058661374734492455 -0.619708764782819 -3.0933607463185937 -0.064572895424504062 -0.50132941818270293 -3.0692313962687727 -0.070484416114515752 -0.38295007158258698 -3.0451020462189526 -0.076395936804527387 -0.26457072498247097 -3.0209726961691321 -0.082307457494539077 -0.14619137838235483 -3.1350901596161997 -0.12303763720146366 -0.74006614625901712 -3.1109608095663797 -0.12894915789147526 -0.62168679965890083 -3.0868314595165591 -0.13486067858148693 -0.50330745305878477 -3.0627021094667386 -0.14077219927149862 -0.38492810645866887 -3.0385727594169181 -0.14668371996151025 -0.26654875985855286 -3.1285608728141652 -0.19332542035844658 -0.74204418113509907 -3.1044315227643451 -0.19923694104845818 -0.62366483453498278 -3.0803021727145246 -0.20514846173846985 -0.50528548793486672 -3.056172822664704 -0.21105998242848156 -0.38690614133475076 -3.122031586012131 -0.26361320351542938 -0.7440222160111809 -3.0979022359623105 -0.26952472420544105 -0.62564286941106462 -3.07377288591249 -0.27543624489545271 -0.50726352281094855 -3.0496435358626699 -0.28134776558546443 -0.38888417621083265 -3.1155022992100965 -0.33390098667241219 -0.74600025088726285 -3.0913729491602764 -0.33981250736242385 -0.62762090428714656 -3.0672435991104559 -0.34572402805243552 -0.5092415576870305 -3.1089730124080623 -0.404188769829395 -0.74797828576334469 -3.0848436623582418 -0.41010029051940672 -0.6295989391632284 -3.1024437256060278 -0.47447655298637803 -0.74995632063942663 -3.0783143755562077 -0.48038807367638975 -0.63157697403931035 -3.0959144388039936 -0.54476433614336084 -0.75193435551550847 -2.9971896635692534 -0.084839303953502809 -0.027879642420094247 -3.0146197499554401 -0.15087435207831018 -0.14820383976411711 -2.9910215538217018 -0.15160239961903671 -0.029928188935241438 -3.0320498363416264 -0.21690940020311772 -0.26852803710814011 -3.0084516402078885 -0.21763744774384419 -0.15025238627926429 -2.9848534440741501 -0.21836549528457067 -0.031976735450388628 -3.0258817265940747 -0.28367249586865162 -0.27057658362328729 -3.0022835304603368 -0.28440054340937809 -0.15230093279441148 -2.9786853343265984 -0.28512859095010457 -0.034025281965535815 -3.0433118129802619 -0.34970754399345921 -0.39090078096731007 -3.0197136168465231 -0.35043559153418552 -0.27262513013843448 -2.9961154207127851 -0.35116363907491199 -0.15434947930955867 -2.9725172245790468 -0.35189168661563841 -0.036073828480683003 -3.0607418993664481 -0.4157425921182667 -0.51122497831133284 -3.0371437032327102 -0.41647063965899311 -0.39294932748245726 -3.0135455070989714 -0.41719868719971942 -0.27467367665358167 -2.9899473109652335 -0.41792673474044584 -0.15639802582470586 -2.9663491148314951 -0.41865478228117226 -0.038122374995830197 -3.0545737896188965 -0.48250568778380071 -0.51327352482648003 -3.0309755934851585 -0.48323373532452718 -0.39499787399760444 -3.0073773973514197 -0.48396178286525349 -0.27672222316872885 -2.9837792012176818 -0.4846898304059799 -0.15844657233985304 -2.960181005083943 -0.48541787794670632 -0.040170921510977391 -3.0720038760050832 -0.54854073590860819 -0.63359772217050292 -3.0484056798713448 -0.54926878344933461 -0.51532207134162722 -3.0248074837376069 -0.54999683099006103 -0.39704642051275163 -3.0012092876038681 -0.55072487853078744 -0.27877076968387599 -2.9776110914701297 -0.55145292607151375 -0.16049511885500026 -2.9540128953363913 -0.55218097361224017 -0.042219468026124578 -2.9443728843779451 0.58339525008182036 -0.009211600538191209 -3.0866888238153947 0.5777460373248281 -0.72188493710644097 -3.0641805322759765 0.56699146454404281 -0.60340299043028378 -3.041672240736558 0.5562368917632573 -0.48492104375412692 -3.0191639491971394 0.5454823189824719 -0.36643909707797001 -2.9966556576577208 0.5347277462016865 -0.2479571504018131 -2.9741473661183027 0.52397317342090111 -0.12947520372565605 -3.0939550140163337 0.50756938788312334 -0.72366659361774899 -3.0714467224769155 0.49681481510233805 -0.6051846469415918 -3.0489384309374969 0.48606024232155254 -0.48670270026543488 -3.0264301393980784 0.47530566954076714 -0.36822075358927797 -3.0039218478586598 0.46455109675998174 -0.24973880691312106 -3.1012212042172727 0.43739273844141857 -0.72544825012905689 -3.0787129126778545 0.42663816566063328 -0.6069663034528997 -3.0562046211384359 0.41588359287984777 -0.48848435677674285 -3.0336963295990174 0.40512902009906232 -0.37000241010058593 -3.0111880380595988 0.39437444731827692 -0.25152046342442902 -3.1084873944182116 0.36721608899971359 -0.72722990664036491 -3.0859791028787935 0.3564615162189283 -0.60874795996420772 -3.0634708113393749 0.34570694343814279 -0.49026601328805081 -3.0409625197999559 0.33495237065735739 -0.37178406661189389 -3.1157535846191506 0.29703943955800882 -0.72901156315167281 -3.0932452930797321 0.28628486677722348 -0.61052961647551562 -3.0707370015403135 0.27553029399643797 -0.49204766979935877 -3.1230197748200896 0.22686279011630403 -0.73079321966298083 -3.1005114832806711 0.21610821733551869 -0.61231127298682364 -3.1302859650210286 0.15668614067459927 -0.73257487617428874 -3.1077776734816096 0.14593156789381392 -0.61409292949813155 -3.1375521552219676 0.086509491232894323 -0.73435653268559675 -2.9513321999940749 0.51645013137902651 -0.011050585876299627 -2.9812635893965092 0.45537574475738807 -0.13128487633267449 -2.9582665960089893 0.449767427556171 -0.012894226573869958 -2.9881979854114236 0.3886930409345325 -0.13312851703024481 -2.9652009920239037 0.38308472373331537 -0.014737867271440292 -3.0181293748138573 0.32761865431289405 -0.25336280748661988 -2.995132381426338 0.32201033711167687 -0.13497215772781515 -2.9721353880388182 0.3164020199104598 -0.016581507969010624 -3.0480607642162916 0.26654426769125567 -0.37359709794299473 -3.0250637708287718 0.26093595049003848 -0.25520644818419019 -3.0020667774412524 0.2553276332888213 -0.13681579842538547 -2.9790697840537326 0.2497193160876042 -0.018425148666580956 -3.0779921536187258 0.20546988106961722 -0.49383138839936958 -3.054995160231206 0.19986156386840004 -0.37544073864056504 -3.0319981668436862 0.19425324666718286 -0.25705008888176051 -3.0090011734561668 0.18864492946596567 -0.13865943912295581 -2.986004180068647 0.18303661226474857 -0.020268789364151288 -3.0849265496336402 0.13878717724676162 -0.49567502909693989 -3.0619295562461204 0.13317886004554444 -0.37728437933813536 -3.0389325628586006 0.12757054284432726 -0.25889372957933082 -3.0159355694710812 0.12196222564311009 -0.14050307982052612 -2.9929385760835614 0.11635390844189297 -0.022112430061721623 -3.1148579390360744 0.077712790625123221 -0.61590931955331474 -3.0918609456485546 0.072104473423906038 -0.4975186697945102 -3.0688639522610348 0.066496156222688854 -0.37912802003570567 -3.0458669588735154 0.060887839021471692 -0.26073737027690114 -3.0228699654859956 0.055279521820254515 -0.14234672051809646 -2.9998729720984758 0.049671204619037367 -0.023956070759291955 -3.1447893284385087 0.016638404003484715 -0.73614361000968997 -3.1217923350509889 0.011030086802267549 -0.61775296025088511 -3.0987953416634695 0.0054217696010503769 -0.49936231049208052 -2.9072352534720505 1.1840312217242994 -0.70825662040862736 -2.8872956520360336 1.1688981795556821 -0.58967435413186098 -2.8673560506000162 1.1537651373870652 -0.47109208785509504 -2.8474164491639988 1.1386320952184481 -0.352509821578329 -2.8274768477279815 1.1234990530498312 -0.23392755530156301 -2.8075372462919637 1.1083660108812141 -0.11534528902479686 -2.9279904203699934 1.1166301079392889 -0.70975163943131858 -2.908050818933976 1.1014970657706713 -0.5911693731545522 -2.8881112174979586 1.0863640236020544 -0.47258710687778621 -2.8681716160619413 1.0712309814334373 -0.35400484060102017 -2.8482320146259239 1.0560979392648204 -0.2354225743242542 -2.9487455872679358 1.0492289941542781 -0.71124665845400981 -2.9288059858319184 1.0340959519856605 -0.59266439217724343 -2.9088663843959011 1.0189629098170436 -0.47408212590047738 -2.8889267829598837 1.0038298676484267 -0.35549985962371139 -2.8689871815238668 0.98869682547980964 -0.2369175933469454 -2.9695007541658787 0.98182788036926727 -0.71274167747670103 -2.9495611527298609 0.96669483820064972 -0.59415941119993465 -2.9296215512938439 0.95156179603203284 -0.4755771449231686 -2.9096819498578266 0.93642875386341595 -0.35699487864640256 -2.9902559210638211 0.91442676658425648 -0.71423669649939225 -2.9703163196278037 0.89929372441563904 -0.59565443022262587 -2.9503767181917864 0.88416068224702216 -0.47707216394585977 -3.0110110879617635 0.84702565279924569 -0.71573171552208337 -2.9910714865257462 0.83189261063062836 -0.59714944924531699 -2.9711318850897293 0.81675956846201148 -0.478567182968551 -3.0317662548597064 0.77962453901423501 -0.71722673454477459 -3.011826653423689 0.76449149684561768 -0.59864446826800821 -3.0525214217576493 0.71222342522922411 -0.7187217535674657 -2.827904643831407 1.0422575435705737 -0.11686133976667999 -2.8476587887107154 0.97819338139040901 -0.11841065192403848 -2.8888267032787067 0.92434805567212031 -0.23846227485870924 -2.8674129335900238 0.91412921921024437 -0.11995996408139696 -2.84599916390134 0.90391038274836832 -0.0014576533040847588 -2.929994617846698 0.87050272995383171 -0.35851389779337989 -2.9085808481580151 0.86028389349195566 -0.24001158701606773 -2.8871670784693322 0.85006505703007984 -0.12150927623875545 -2.8657533087806484 0.83984622056820379 -0.0030069654614432346 -2.9497487627260064 0.80643856777366718 -0.36006320995073837 -2.928334993037323 0.79621973131179113 -0.24156089917342621 -2.9069212233486401 0.7860008948499152 -0.12305858839611393 -2.8855074536599568 0.77578205838803915 -0.0045562776188017105 -2.9909166772939981 0.7525932420553787 -0.48011483288540902 -2.9695029076053148 0.74237440559350265 -0.36161252210809686 -2.9480891379166314 0.7321555691316266 -0.2431102113307847 -2.9266753682279485 0.72193673266975056 -0.12460790055347241 -2.9052615985392647 0.71171789620787451 -0.0061055897761601854 -3.0320845918619894 0.69874791633708999 -0.60016645582007966 -3.0106708221733061 0.68852907987521395 -0.48166414504276744 -2.9892570524846231 0.6783102434133379 -0.36316183426545534 -2.9678432827959398 0.66809140695146185 -0.24465952348814318 -2.9464295131072564 0.65787257048958581 -0.12615721271083091 -2.9250157434185731 0.64765373402770976 -0.0076549019335186638 -3.0732525064299807 0.64490259061880162 -0.72021807875475052 -3.0518387367412978 0.63468375415692557 -0.60171576797743809 -3.0304249670526144 0.6244649176950493 -0.48321345720012593 -3.0090111973639311 0.61424608123317337 -0.36471114642281377 -2.9875974276752477 0.60402724477129732 -0.24620883564550164 -2.9661836579865648 0.59380840830942128 -0.1277065248681894 -2.5280964127398446 1.647786049087214 -0.10501790048540618 -2.544642162517933 1.6666718186830307 -0.22370544127826283 -2.5611879122960222 1.6855575882788476 -0.34239298207111929 -2.5777336620741105 1.7044433578746643 -0.46108052286397583 -2.5942794118521997 1.7233291274704812 -0.5797680636568322 -2.6108251616302884 1.7422148970662978 -0.69845560444968913 -2.6442546140985592 1.6801233497717867 -0.69952853865716846 -2.6277088643204705 1.6612375801759698 -0.58084099786431154 -2.6111631145423813 1.6423518105801529 -0.46215345707145522 -2.5946173647642929 1.6234660409843362 -0.34346591627859868 -2.5780716149862037 1.6045802713885196 -0.22477837548574223 -2.67768406656683 1.6180318024772755 -0.7006014728646478 -2.6611383167887412 1.5991460328814586 -0.58191393207179098 -2.644592567010652 1.5802602632856417 -0.46322639127893461 -2.6280468172325637 1.5613744936898251 -0.34453885048607807 -2.6115010674544745 1.5424887240940084 -0.22585130969322162 -2.7111135190351008 1.5559402551827644 -0.70167440707212725 -2.694567769257012 1.5370544855869472 -0.58298686627927032 -2.6780220194789228 1.5181687159911306 -0.46429932548641401 -2.6614762697008345 1.4992829463953137 -0.34561178469355747 -2.7445429715033716 1.493848707888253 -0.70274734127960659 -2.7279972217252828 1.4749629382924359 -0.58405980048674977 -2.7114514719471936 1.4560771686966192 -0.4653722596938934 -2.7779724239716423 1.4317571605937416 -0.70382027548708603 -2.7614266741935536 1.4128713909979245 -0.58513273469422911 -2.7448809244154644 1.3939856214021078 -0.46644519390137273 -2.8114018764399127 1.3696656132992302 -0.70489320969456537 -2.7948561266618239 1.3507798437034133 -0.58620566890170855 -2.8448313289081835 1.3075740660047188 -0.70596614390204482 -2.8782607813764542 1.2454825187102074 -0.70703907810952416 -2.5610696434084725 1.5865537523529587 -0.10610445501056354 -2.5928690868181801 1.527532172775661 -0.10722605248054597 -2.6436092127546007 1.4828857337369068 -0.22696369099287067 -2.624668530227888 1.4685105931983633 -0.1083476499505284 -2.6943493386910209 1.4382392946981524 -0.34670132950519517 -2.6754086561643082 1.4238641541596091 -0.22808528846285311 -2.6564679736375956 1.4094890136210656 -0.10946924742051083 -2.7261487821007289 1.3792177151208547 -0.34782292697517764 -2.7072080995740162 1.3648425745823114 -0.22920688593283556 -2.6882674170473031 1.3504674340437679 -0.11059084489049326 -2.7768889080371491 1.3345712760821005 -0.46756056548750219 -2.7579482255104368 1.320196135543557 -0.34894452444516005 -2.7390075429837237 1.3058209950050137 -0.230328483402818 -2.7200668604570111 1.2914458544664702 -0.11171244236047567 -2.8276290339735697 1.289924837043346 -0.5872982039998268 -2.808688351446857 1.2755496965048028 -0.4686821629574846 -2.7897476689201444 1.2611745559662593 -0.35006612191514253 -2.7708069863934317 1.246799415427716 -0.23145008087280045 -2.751866303866719 1.2324242748891725 -0.1128340398304581 -2.8594284773832777 1.2309032574660483 -0.58841980146980921 -2.840487794856565 1.2165281169275051 -0.46980376042746702 -2.8215471123298519 1.2021529763889616 -0.35118771938512494 -2.8026064298031392 1.1877778358504181 -0.23257167834278289 -2.7836657472764266 1.1734026953118748 -0.11395563730044052 -2.1471495623108932 2.1211707493759846 -0.10038341909906433 -2.1596075857562722 2.1430639303740011 -0.21919387003388247 -2.1720656092016513 2.1649571113720181 -0.33800432096870042 -2.2542620832227689 2.1761579233552331 -0.69487640883238622 -2.2418040597773898 2.1542647423572165 -0.57606595789756787 -2.2293460363320108 2.1323715613591996 -0.45725550696274991 -2.2168880128866317 2.1104783803611831 -0.3384450560279319 -2.2044299894412527 2.0885851993631657 -0.21963460509311392 -2.2990844869077494 2.1216791923443981 -0.69531714389161769 -2.2866264634623703 2.0997860113463815 -0.57650669295679935 -2.2741684400169913 2.0778928303483646 -0.45769624202198134 -2.2617104165716122 2.0559996493503476 -0.33888579108716332 -2.2492523931262332 2.0341064683523307 -0.22007534015234534 -2.3439068905927298 2.0672004613335631 -0.69575787895084917 -2.3314488671473508 2.0453072803355465 -0.57694742801603083 -2.3189908437019717 2.0234140993375296 -0.45813697708121276 -2.3065328202565927 2.0015209183395126 -0.3393265261463948 -2.3887292942777103 2.0127217303227281 -0.69619861401008065 -2.3762712708323313 1.9908285493247113 -0.57738816307526231 -2.3638132473869522 1.9689353683266944 -0.45857771214044424 -2.4335516979626908 1.9582429993118928 -0.69663934906931202 -2.4210936745173117 1.9363498183138761 -0.57782889813449378 -2.4086356510719322 1.9144566373158591 -0.45901844719967566 -2.4783741016476712 1.9037642683010578 -0.6970800841285435 -2.4659160782022922 1.8818710873030409 -0.57826963319372515 -2.5231965053326517 1.8492855372902226 -0.69752081918777487 -2.5680189090176322 1.7948068062793874 -0.69796155424700634 -2.1917319609774788 2.0669860534527773 -0.10082924369435806 -2.2343406140145223 2.0152194339223821 -0.10131692345429158 -2.2926436982105001 1.9813810056909615 -0.22054642302674213 -2.2769492670515659 1.9634528143919869 -0.1018046032142251 -2.3509467824064778 1.947542577459541 -0.33977592259919254 -2.3352523512475436 1.9296143861605664 -0.22103410278667565 -2.3195579200886094 1.9116861948615917 -0.10229228297415863 -2.3935554354435213 1.8957759579291458 -0.34026360235912606 -2.3778610042845871 1.8778477666301714 -0.22152178254660918 -2.3621665731256529 1.8599195753311966 -0.10277996273409215 -2.4518585196394991 1.8619375296977252 -0.45949310193157644 -2.4361640884805649 1.8440093383987508 -0.34075128211905958 -2.4204696573216307 1.8260811470997762 -0.2220094623065427 -2.4047752261626965 1.8081529558008016 -0.10326764249402567 -2.5101616038354773 1.8280991014663046 -0.57872260150402688 -2.4944671726765426 1.8101709101673302 -0.45998078169150997 -2.4787727415176088 1.7922427188683558 -0.34123896187899311 -2.4630783103586742 1.7743145275693812 -0.22249714206647622 -2.4473838791997404 1.7563863362704066 -0.10375532225395921 -2.5527702568725212 1.7763324819359094 -0.57921028126396035 -2.5370758257135866 1.758404290636935 -0.46046846145144349 -2.5213813945546528 1.7404760993379607 -0.34172664163892663 -2.5056869633957182 1.7225479080389861 -0.22298482182640977 -2.4899925322367844 1.7046197167400114 -0.10424300201389275 -1.679857424778868 2.5103709514750014 -0.10446375659371508 -1.7733159661945497 2.5858735356065288 -0.69881108447139961 -1.7655313992741575 2.5617947930561393 -0.57983631640383715 -1.7577468323537651 2.5377160505057499 -0.46086154833627496 -1.7499622654333731 2.51363730795536 -0.34188678026871278 -1.7421776985129811 2.4895585654049706 -0.22291201220115059 -1.7343931315925889 2.4654798228545807 -0.10393724413358822 -1.8278516730082706 2.5409824069861084 -0.69828457201127281 -1.8200671060878784 2.516903664435719 -0.57930980394371034 -1.8122825391674859 2.4928249218853296 -0.4603350358761481 -1.804497972247094 2.4687461793349397 -0.34136026780858597 -1.796713405326702 2.4446674367845502 -0.22238549974102378 -1.8823873798219914 2.4960912783656881 -0.697758059551146 -1.8746028129015992 2.4720125358152987 -0.57878329148358354 -1.8668182459812068 2.4479337932649092 -0.4598085234160213 -1.8590336790608148 2.4238550507145193 -0.34083375534845911 -1.9369230866357123 2.4512001497452678 -0.69723154709101909 -1.9291385197153201 2.4271214071948783 -0.57825677902345674 -1.9213539527949279 2.4030426646444885 -0.45928201095589444 -1.913569385874536 2.3789639220940986 -0.34030724288833231 -1.9914587934494332 2.406309021124847 -0.69670503463089228 -1.983674226529041 2.3822302785744576 -0.57773026656332982 -1.975889659608649 2.3581515360240677 -0.45875549849576763 -2.0459945002631539 2.3614178925044267 -0.69617852217076537 -2.0382099333427619 2.3373391499540372 -0.57720375410320302 -2.1005302070768748 2.3165267638840064 -0.69565200971063856 -2.1550659138905957 2.2716356352635856 -0.69512549725051165 -1.7865973434524387 2.4225136303321171 -0.10345574698116843 -1.8501625271945183 2.4006734177986129 -0.22187996650523897 -1.838364349340281 2.3799084051608208 -0.10298269117721841 -1.9019295330823609 2.3580681926273166 -0.22140691070128896 -1.8901313552281236 2.3373031799895245 -0.10250963537326839 -1.9654947168244408 2.3362279800938128 -0.33983113022535938 -1.9536965389702035 2.3154629674560203 -0.22093385489733897 -1.9418983611159661 2.2946979548182282 -0.10203657956931837 -2.0290599005665206 2.3143877675603086 -0.45825534974942977 -2.0172617227122833 2.2936227549225165 -0.33935807442140936 -2.005463544858046 2.272857742284724 -0.22046079909338895 -1.9936653670038085 2.252092729646932 -0.10156352376536835 -2.0926250843086005 2.2925475550268049 -0.57667956927350017 -2.0808269064543632 2.2717825423890123 -0.45778229394547976 -2.0690287286001259 2.2510175297512203 -0.3388850186174594 -2.0572305507458886 2.2302525171134278 -0.21998774328943896 -2.0454323728916508 2.2094875044756357 -0.10109046796141834 -2.1443920901964431 2.2499423298555086 -0.57620651346955021 -2.1325939123422057 2.2291773172177161 -0.45730923814152979 -2.1207957344879684 2.208412304579924 -0.33841196281350938 -2.1089975566337311 2.1876472919421315 -0.21951468748548894 -2.0971993787794934 2.1668822793043394 -0.10061741215746832 -2.2079572739385229 2.2281021173220044 -0.69463073299362088 -2.1961590960842856 2.2073371046842118 -0.57573345766560013 -2.1843609182300483 2.1865720920464198 -0.45683618233757978 -1.2194194709429489 2.8942497497597071 -0.71620772587893378 -1.2168852032633941 2.8688422998292626 -0.59697825686502071 -1.2143509355838396 2.8434348498988187 -0.47774878785110786 -1.2118166679042848 2.8180273999683747 -0.35851931883719501 -1.2092824002247302 2.7926199500379303 -0.23928984982328219 -1.2067481325451754 2.7672125001074863 -0.12006038080936926 -1.2817048687482582 2.8605019826188034 -0.71417826917493776 -1.2791706010687034 2.835094532688359 -0.59494880016102469 -1.2766363333891488 2.8096870827579146 -0.4757193311471119 -1.2741020657095941 2.784279632827471 -0.35648986213319905 -1.2715677980300395 2.7588721828970266 -0.23726039311928621 -1.3439902665535675 2.8267542154778997 -0.71214881247094186 -1.3414559988740127 2.8013467655474553 -0.59291934345702879 -1.3389217311944581 2.7759393156170109 -0.47368987444311594 -1.3363874635149033 2.7505318656865669 -0.3544604054292031 -1.4062756643588767 2.7930064483369956 -0.71011935576694596 -1.403741396679322 2.7675989984065517 -0.59088988675303278 -1.4012071289997674 2.7421915484761072 -0.47166041773911999 -1.3986728613202126 2.7167840985456633 -0.35243094872520708 -1.468561062164186 2.7592586811960915 -0.70808989906294995 -1.4660267944846312 2.7338512312656476 -0.58886043004903676 -1.4634925268050767 2.7084437813352031 -0.46963096103512397 -1.5308464599694953 2.7255109140551879 -0.70606044235895404 -1.5283121922899405 2.7001034641247439 -0.58683097334504086 -1.5931318577748044 2.6917631469142842 -0.70403098565495803 -1.5905975900952496 2.6663556969838398 -0.58480151664104496 -1.6554172555801137 2.6580153797733801 -0.70200152895096213 -1.2012879863935935 2.7433846264813169 -0.00090068724310282157 -1.267560038530932 2.7342602180781346 -0.11806606348395496 -1.3338320906682706 2.7251358096749518 -0.23523143972480726 -1.3264780409354073 2.7023303863139501 -0.11611691138718788 -1.3927500930727459 2.6932059779107673 -0.23328228762804018 -1.3853960433398829 2.6704005545497655 -0.11416775929042081 -1.4590221452100847 2.684081569507585 -0.35044766386889237 -1.4516680954772214 2.6612761461465828 -0.2313331355312731 -1.4443140457443584 2.638470722785581 -0.11221860719365373 -1.525294197347423 2.6749571611044027 -0.46761304010974453 -1.51794014761456 2.6521517377434005 -0.34849851177212526 -1.510586097881697 2.6293463143823983 -0.229383983434506 -1.5032320481488337 2.6065408910213965 -0.11026945509688665 -1.5842121997518985 2.6430273293402182 -0.46566388801297742 -1.5768581500190355 2.620221905979216 -0.34654935967535816 -1.5695041002861725 2.5974164826182138 -0.22743483133773892 -1.5621500505533092 2.574611059257212 -0.10832030300011958 -1.6504842518892371 2.6339029209370359 -0.58282926425382964 -1.6431302021563738 2.6110974975760337 -0.46371473591621032 -1.6357761524235108 2.5882920742150315 -0.34460020757859106 -1.6284221026906478 2.5654866508540293 -0.22548567924097185 -1.6210680529577846 2.5426812274930275 -0.1063711509033525 -1.7167563040265759 2.6247785125338536 -0.69999464049468207 -1.7094022542937126 2.6019730891728514 -0.58088011215706248 -1.7020482045608494 2.5791676658118492 -0.46176558381944321 -1.6946941548279864 2.556362242450847 -0.34265105548182395 -1.6873401050951233 2.5335568190898448 -0.22353652714420474 -0.62931869064659174 2.961264444317341 -0.15599936718152582 -0.62566331665330932 2.9871323783501604 -0.27568830801504157 -0.62200794266002701 3.0130003123829794 -0.39537724884855713 -0.6183525686667446 3.0388682464157988 -0.51506618968207263 -0.61469719467346218 3.0647361804486177 -0.6347551305155883 -0.67906501344290804 3.0690743479109934 -0.75011675736025119 -0.68272038743619023 3.0432064138781745 -0.6304278165267353 -0.68637576142947276 3.0173384798453551 -0.51073887569321963 -0.69003113542275507 2.9914705458125357 -0.39104993485970413 -0.69368650941603749 2.9656026117797167 -0.27136099402618857 -0.6973418834093198 2.9397346777468978 -0.15167205319267285 -0.7470882062056361 3.0475445813405502 -0.74578944337139819 -0.7507435801989184 3.0216766473077308 -0.6261005025378823 -0.75439895419220093 2.9958087132749114 -0.50641156170436663 -0.75805432818548324 2.9699407792420924 -0.38672262087085119 -0.76170970217876566 2.944072845209273 -0.26703368003733557 -0.81511139896836426 3.0260148147701065 -0.74146212938254519 -0.81876677296164657 3.0001468807372875 -0.6217731885490293 -0.8224221469549291 2.9742789467044681 -0.50208424771551374 -0.82607752094821141 2.9484110126716487 -0.38239530688199819 -0.88313459173109243 3.0044850481996632 -0.73713481539369219 -0.88678996572437474 2.9786171141668438 -0.6174458745601763 -0.89044533971765716 2.9527491801340244 -0.4977569337266608 -0.95115778449382071 2.9829552816292195 -0.73280750140483919 -0.95481315848710302 2.9570873475964006 -0.61311856057132341 -0.95846853248038544 2.9312194135635807 -0.49342961973780786 -1.0191809772565488 2.9614255150587763 -0.7284801874159863 -1.0228363512498311 2.9355575810259569 -0.60879124658247041 -1.0872041700192769 2.9398957484883326 -0.7241528734271333 -1.1552273627820051 2.9183659819178893 -0.71982555943828042 -0.63188129238384405 2.935736846894244 -0.036353197721117982 -0.69561876051028826 2.9155418405950879 -0.032193628041698188 -0.76173836967822983 2.9193344246553616 -0.14748668938213319 -0.75935622863673247 2.8953468342959319 -0.028034058362278395 -0.82785797884617141 2.9231270087156354 -0.26277975072256837 -0.82547583780467404 2.8991394183562056 -0.14332711970271339 -0.82309369676317667 2.8751518279967758 -0.023874488682858602 -0.89397758801411298 2.9269195927759095 -0.37807281206300342 -0.89159544697261561 2.9029320024164793 -0.25862018104314854 -0.88921330593111825 2.8789444120570495 -0.13916755002329359 -0.88683116488962077 2.8549568216976198 -0.019714919003438813 -0.95771505614055719 2.9067245864767535 -0.37391324238358364 -0.95533291509905982 2.8827369961173233 -0.25446061136372877 -0.95295077405756246 2.8587494057578935 -0.13500798034387379 -0.95056863301606498 2.8347618153984637 -0.015555349324019021 -1.0238346653084989 2.9105171705370272 -0.48920630372401869 -1.0214525242670014 2.8865295801775974 -0.36975367270416382 -1.0190703832255039 2.8625419898181672 -0.250301041684309 -1.0166882421840067 2.8385543994587374 -0.13084841066445399 -1.0143061011425092 2.8145668090993077 -0.01139577964459923 -1.0899542744764403 2.9143097545973013 -0.60449936506445368 -1.0875721334349431 2.8903221642378716 -0.48504673404459886 -1.0851899923934456 2.8663345738784414 -0.36559410302474404 -1.0828078513519481 2.8423469835190112 -0.24614147200488917 -1.0804257103104509 2.8183593931595814 -0.12668884098503419 -1.0780435692689534 2.7943718028001516 -0.0072362099651794376 -1.1536917426028845 2.8941147482981457 -0.6003397953850339 -1.1513096015613873 2.8701271579387155 -0.48088716436517909 -1.1489274605198898 2.8461395675792853 -0.36143453334532422 -1.1465453194783926 2.8221519772198556 -0.24198190232546937 -1.1441631784368951 2.7981643868604253 -0.12252927130561439 -1.1417810373953976 2.7741767965009956 -0.0030766402857596458 -0.037927473577579834 3.0156780653020756 -0.09759873484120378 -0.024562045360868499 3.0410152878452892 -0.21835966629114276 -0.011196617144157142 3.0663525103885028 -0.33912059774108189 -0.043758557695081024 3.1337134629192116 -0.69389001042878573 -0.057123985911792408 3.1083762403759985 -0.5731290789788468 -0.070489414128503791 3.0830390178327849 -0.45236814752890775 -0.083854842345215119 3.0577017952895718 -0.33160721607896881 -0.097220270561926461 3.0323645727463582 -0.21084628462902966 -0.11641678289613916 3.1250627478202806 -0.6863766287666726 -0.12978221111285049 3.0997255252770675 -0.56561569731673367 -0.14314763932956184 3.0743883027338539 -0.44485476586679468 -0.1565130675462732 3.0490510801906408 -0.32409383441685574 -0.18907500809719718 3.1164120327213496 -0.67886324710455948 -0.20244043631390848 3.0910748101781365 -0.55810231565462054 -0.21580586453061981 3.0657375876349229 -0.4373413842046816 -0.22917129274733117 3.0404003650917097 -0.31658045275474261 -0.26173323329825515 3.1077613176224186 -0.67134986544244646 -0.27509866151496648 3.0824240950792055 -0.55058893399250752 -0.28846408973167781 3.0570868725359919 -0.42982800254256853 -0.33439145849931329 3.0991106025234876 -0.66383648378033333 -0.34775688671602456 3.0737733799802744 -0.5430755523303944 -0.40704968370037126 3.0904598874245566 -0.65632310211822031 -0.42041511191708258 3.0651226648813439 -0.53556217066828138 -0.47970790890142923 3.081809172325626 -0.64880972045610719 -0.53900070588577564 3.0984956797699086 -0.76205727024393355 -0.10712012362144852 3.0074202486344634 -0.090344608404527738 -0.16928877738443793 3.0237807150708971 -0.20337701904123034 -0.1726393801325532 2.9995788911377463 -0.083365283818990332 -0.2348080338955425 3.01593935757418 -0.19639769445569294 -0.23815863664365777 2.9917375336410292 -0.076385959233452941 -0.29697668765853175 3.032299824010614 -0.30943010509239577 -0.30032729040664707 3.0080980000774629 -0.18941836987015556 -0.30367789315476235 2.9838961761443121 -0.069406634647915549 -0.3591453414215211 3.0486602904470477 -0.42246251572909838 -0.36249594416963637 3.0244584665138969 -0.30245078050685836 -0.3658465469177517 3.0002566425807458 -0.18243904528461816 -0.36919714966586697 2.976054818647595 -0.062427310062378151 -0.42466459793262568 3.0408189329503306 -0.41548319114356097 -0.42801520068074095 3.0166171090171798 -0.29547145592132096 -0.43136580342885622 2.9924152850840291 -0.17545972069908078 -0.43471640617697155 2.9682134611508779 -0.055447985476840767 -0.48683325169561498 3.0571793993867646 -0.52851560178026358 -0.49018385444373025 3.0329775754536135 -0.40850386655802357 -0.49353445719184547 3.0087757515204627 -0.28849213133578355 -0.49688505993996079 2.984573927587312 -0.16848039611354337 -0.50023566268807607 2.9603721036541613 -0.048468660891303375 -0.54900190545860428 3.0735398658231978 -0.64154801241696624 -0.55235250820671955 3.0493380418900475 -0.52153627719472628 -0.55570311095483482 3.0251362179568964 -0.40152454197248616 -0.55905371370294998 3.0009343940237461 -0.28151280675024615 -0.56240431645106537 2.9767325700905953 -0.16150107152800597 -0.56575491919918064 2.9525307461574442 -0.041489336305765984 -0.61117055922159369 3.0899003322596319 -0.75458042305366912 0.43679060405464448 3.1079064762650486 -0.75875923563638814 0.567020461936103 3.0749820235484426 -0.65772011212881576 0.3328882702877643 3.1152957635488789 -0.74446047976503815 0.46311812816922288 3.082371310832273 -0.64342135625746566 0.22898593652088409 3.1226850508327093 -0.73016172389368805 0.35921579440234264 3.0897605981161034 -0.62912260038611567 0.48944565228380138 3.0568361453994974 -0.52808347687854318 0.1250836027540039 3.1300743381165401 -0.71586296802233806 0.25531346063546245 3.0971498853999342 -0.61482384451476557 0.38554331851692114 3.0642254326833283 -0.51378472100719308 0.15141112686858235 3.1045391726837646 -0.60052508864341558 0.28164098475004101 3.0716147199671586 -0.49948596513584304 0.41187084263149965 3.0386902672505527 -0.39844684162827054 0.30796850886461935 3.0460795545343835 -0.3841480857569205 0.43819836674607809 3.0131551018177776 -0.2831089622493479 0.56842822462753673 2.9802306491011716 -0.18206983874177537 0.019658921076477334 3.0663073399243146 -0.343083617919896 0.043125821398489306 3.0409161972917702 -0.22705335297747087 0.066592721720501263 3.0155250546592258 -0.11102308803504581 0.10029778781886846 3.1081457853263461 -0.59334799920698644 0.12376468814088039 3.0827546426938017 -0.47731773426456148 0.1472315884628923 3.0573635000612569 -0.3612874693221364 0.17069848878490429 3.0319723574287125 -0.24525720437971124 0.19416538910691625 3.0065812147961681 -0.12922693943728619 0.21763228942892815 2.9811900721636237 -0.013196674494861215 0.27480425584930745 3.0484196601981997 -0.3794913207243768 0.29827115617131944 3.0230285175656548 -0.26346105578195161 0.32173805649333131 2.9976373749331104 -0.14743079083952662 0.34520495681534324 2.9722462323005661 -0.031400525897101621 0.4493107238797463 2.9886935350700532 -0.16563464224176702 0.47277762420175817 2.9633023924375084 -0.049604377299342001 1.1462392002326913 2.9250237607202791 -0.73882977640810998 1.1506763346971274 2.8993108200728073 -0.62103648540098477 1.155113469161563 2.8735978794253354 -0.50324319439385945 1.159550603625999 2.8478849387778631 -0.38544990338673407 1.1639877380904347 2.8221719981303912 -0.26765661237960875 1.0283320072754747 2.9573911461169358 -0.72239673758211642 1.0327691417399107 2.9316782054694639 -0.60460344657499121 1.0372062762043464 2.905965264821992 -0.48681015556786583 1.0416434106687824 2.8802523241745197 -0.36901686456074045 1.0460805451332182 2.8545393835270478 -0.25122357355361513 0.9104248143182585 2.9897585315135919 -0.70596369875612286 0.91486194878269445 2.9640455908661201 -0.58817040774899765 0.91929908324713017 2.9383326502186482 -0.47037711674187227 0.92373621771156611 2.9126197095711763 -0.35258382573474684 0.79251762136104231 3.0221259169102486 -0.6895306599301293 0.79695475582547814 2.9964129762627763 -0.57173736892300409 0.63751958528125185 2.9416158347796024 -0.073041168147405078 0.60444102525618248 2.9752503402930977 -0.18712804254173349 0.74275219159818873 2.9128754109299306 -0.088421174892108143 0.70967363157311936 2.9465099164434259 -0.20250804928643656 0.8479847979151256 2.8841349870802588 -0.10380118163681121 0.98629596425713228 2.8217600577170918 -0.0050943139871857434 0.81490623789005623 2.9177694925937541 -0.21788805603113964 0.95321740423206258 2.855394563230587 -0.11918118838151429 1.0915285705740692 2.79301963386742 -0.0204743207318888 0.92013884420699343 2.8890290687440823 -0.23326806277584275 0.78182767786498708 2.9514039981072493 -0.33197493042546811 0.88706028418192395 2.9226635742575775 -0.34735493717017119 0.74874911783991749 2.9850385036207445 -0.44606180481979663 1.7399709848593861 2.609472597715643 -0.68708618773153152 1.6757360564690991 2.6422390569425014 -0.68010125869541871 1.6658898862172133 2.6207347787062818 -0.56084897183241844 1.6560437159653278 2.5992305004700622 -0.44159668496941795 1.6461975457134421 2.5777262222338426 -0.32234439810641763 1.6363513754615566 2.556221943997623 -0.20309211124341731 1.6265052052096711 2.5347176657614034 -0.083839824380416927 1.6115011280788121 2.6750055161693593 -0.6731163296593059 1.6016549578269264 2.6535012379331397 -0.55386404279630563 1.5918087875750409 2.6319969596969202 -0.43461175593330514 1.5819626173231551 2.6104926814607006 -0.31535946907030482 1.5721164470712699 2.588988403224481 -0.19610718220730447 1.5472661996885249 2.7077719753962177 -0.66613140062319309 1.5374200294366394 2.6862676971599981 -0.54687911376019283 1.5275738591847539 2.6647634189237785 -0.42762682689719228 1.5177276889328681 2.643259140687559 -0.30837454003419196 1.4830312712982379 2.7405384346230757 -0.65914647158708028 1.4731851010463524 2.7190341563868561 -0.53989418472408002 1.4633389307944669 2.6975298781506365 -0.42064189786107942 1.4187963429079509 2.7733048938499341 -0.65216154255096737 1.4089501726560654 2.7518006156137145 -0.5329092556879671 1.3644075847695496 2.8275756313130116 -0.76442890037785483 1.3545614145176639 2.806071353076792 -0.64517661351485456 1.3001726563792626 2.86034209053987 -0.75744397134174202 1.2903264861273769 2.8388378123036504 -0.63819168447874164 1.2359377279889756 2.8931085497667279 -0.75045904230562921 1.5675523153017661 2.5647153638710214 -0.077097912739955518 1.5119707651648633 2.6196113440538222 -0.18931039228339319 1.5095275127136571 2.5942265732712091 -0.070398700781472326 1.4563892150279605 2.6745073242366226 -0.30152287182683069 1.4539459625767543 2.6491225534540099 -0.18261118032491 1.4515027101255482 2.6237377826713968 -0.063699488822989148 1.4008076648910577 2.7294033044194235 -0.41373535137026823 1.3983644124398515 2.7040185336368103 -0.29482365986834747 1.3959211599886454 2.6786337628541976 -0.17591196836642681 1.3934779075374393 2.6532489920715845 -0.057000276864505962 1.3452261147541549 2.7842992846022243 -0.52594783091370589 1.3427828623029487 2.7589145138196112 -0.40703613941178501 1.3403396098517426 2.733529743036998 -0.28812444790986425 1.3378963574005365 2.7081449722543853 -0.16921275640794359 1.3354531049493303 2.6827602014717726 -0.050301064906022763 1.2872013121660459 2.813810494002412 -0.51924861895522267 1.2847580597148398 2.7884257232197989 -0.40033692745330179 1.2823148072636337 2.7630409524371862 -0.28142523595138108 1.2798715548124275 2.737656181654573 -0.1625135444494604 1.2774283023612214 2.7122714108719603 -0.043601852947539578 1.2316197620291434 2.8687064741852124 -0.63146109849866028 1.229176509577937 2.8433217034025997 -0.51254940699673945 1.2267332571267309 2.8179369326199866 -0.39363771549481863 1.2242900046755247 2.7925521618373739 -0.27472602399289786 1.2218467522243186 2.7671673910547612 -0.15581433249097718 1.2194034997731125 2.741782620272148 -0.036902640989056393 1.1638219496362097 2.7966786004549489 -0.14911512053249398 1.1613786971850035 2.7712938296723362 -0.030203429030573208 2.1800280422497185 2.2571464195521349 -0.71854244515273569 2.16518623970879 2.2387587380412683 -0.59917459085317681 2.1503444371678615 2.2203710565304027 -0.47980673655361783 2.1355026346269335 2.201983375019537 -0.36043888225405896 2.120660832086005 2.1835956935086709 -0.24107102795450011 2.1058190295450765 2.1652080119978052 -0.12170317365494114 2.1246987248466098 2.3015521845241431 -0.71463030034421005 2.1098569223056813 2.2831645030132766 -0.59526244604465117 2.0950151197647529 2.2647768215024109 -0.47589459174509219 2.0801733172238248 2.2463891399915452 -0.35652673744553331 2.0653315146828963 2.2280014584806791 -0.2371588831459745 2.0693694074435012 2.3459579494961513 -0.7107181555356844 2.0545276049025727 2.3275702679852848 -0.59135030123612553 2.0396858023616442 2.3091825864744191 -0.47198244693656655 2.0248439998207162 2.2907949049635534 -0.35261459263700773 2.0100021972797872 2.2724072234526873 -0.23324673833744886 2.0140400900403925 2.3903637144681595 -0.70680601072715876 1.999198287499464 2.371976032957293 -0.58743815642759989 1.9843564849585356 2.3535883514464273 -0.46807030212804096 1.9695146824176073 2.3352006699355616 -0.34870244782848209 1.9587107726372839 2.4347694794401677 -0.70289386591863312 1.9438689700963554 2.4163817979293012 -0.58352601161907425 1.9290271675554269 2.3979941164184355 -0.46415815731951537 1.9033814552341752 2.479175244412176 -0.69898172111010748 1.8885396526932468 2.4607875629013094 -0.57961386681054872 1.8480521378310666 2.5235810093841842 -0.69506957630158195 1.7927228204279579 2.5679867743561919 -0.69115743149305631 2.0927279847019187 2.1453789877775304 -0.0023176180416781093 2.0513216787442898 2.2089288455265557 -0.11778261711597568 1.9994215172392682 2.2505114963352337 -0.1138358012822306 1.9580152112816391 2.3140613540842589 -0.22930080035652831 1.9475213557342466 2.2920941471439118 -0.10988898544848552 1.9166089053240101 2.3776112118332846 -0.34476579943082591 1.9061150497766177 2.355644004892937 -0.22535398452278324 1.8956211942292251 2.3336767979525899 -0.10594216961474044 1.8752025993663812 2.4411610695823103 -0.46023079850512344 1.8647087438189884 2.4191938626419627 -0.34081898359708085 1.8542148882715961 2.3972266557016151 -0.22140716868903818 1.8437210327242037 2.3752594487612679 -0.10199535378099536 1.8337962934087524 2.5047109273313355 -0.57569579757942113 1.8233024378613596 2.4827437203909883 -0.45628398267137837 1.812808582313967 2.4607765134506407 -0.33687216776333578 1.8023147267665744 2.4388093065102932 -0.21746035285529311 1.7918208712191821 2.416842099569946 -0.098048537947250283 1.7818961319037308 2.546293578140014 -0.57174898174567612 1.7714022763563382 2.5243263711996664 -0.45233716683763331 1.7609084208089456 2.5023591642593188 -0.33292535192959072 1.750414565261553 2.4803919573189712 -0.21351353702154802 1.7399207097141607 2.4584247503786241 -0.094101722113505204 1.7299959703987091 2.5878762289486921 -0.56780216591193111 1.7195021148513168 2.5659090220083445 -0.44839035100388824 1.709008259303924 2.5439418150679973 -0.3289785360958456 1.6985144037565316 2.5219746081276493 -0.20956672118780295 1.688020548209139 2.5000074011873017 -0.090154906279760111 2.5926360344853348 1.7765556586846449 -0.73560095105453405 2.5741990500799625 1.7617808849127994 -0.61625537938560127 2.5557620656745903 1.7470061111409541 -0.49690980771666843 2.5373250812692185 1.7322313373691087 -0.3775642360477357 2.5188880968638458 1.7174565635972632 -0.25821866437880298 2.5004511124584741 1.7026817898254176 -0.13887309270987008 2.5475381404017048 1.8309767193426554 -0.7338996102525619 2.529101155996333 1.8162019455708098 -0.61455403858362911 2.5106641715909608 1.8014271717989645 -0.49520846691469628 2.4922271871855886 1.7866523980271189 -0.37586289524576355 2.4737902027802163 1.7718776242552736 -0.25651732357683088 2.4553532183748441 1.7571028504834281 -0.13717175190789799 2.5024402463180753 1.8853977800006658 -0.73219826945058974 2.4840032619127035 1.8706230062288203 -0.61285269778165696 2.4655662775073313 1.8558482324569749 -0.49350712611272413 2.447129293101959 1.8410734586851294 -0.37416155444379146 2.4286923086965864 1.8262986849132838 -0.25481598277485873 2.4573423522344453 1.9398188406586763 -0.73049692864861759 2.4389053678290735 1.9250440668868307 -0.61115135697968481 2.4204683834237013 1.9102692931149854 -0.49180578531075203 2.4020313990183291 1.8954945193431398 -0.3724602136418193 2.4122444581508158 1.9942399013166867 -0.72879558784664544 2.393807473745444 1.9794651275448412 -0.60945001617771266 2.3753704893400718 1.9646903537729956 -0.49010444450877988 2.3671465640671863 2.0486609619746972 -0.72709424704467329 2.348709579661814 2.0338861882028514 -0.60774867537574062 2.3302725952564418 2.0191114144310061 -0.48840310370680778 2.3220486699835563 2.1030820226327074 -0.72539290624270125 2.3036116855781841 2.0883072488608616 -0.60604733457376847 2.2769507758999263 2.1575030832907176 -0.7236915654407291 2.4823097776554839 1.6875438858581302 -0.019518291022773693 2.4396143730295394 1.7390141004494182 -0.01774194581980211 2.4122099441397284 1.8091231587579157 -0.13540938894807594 2.396918968403595 1.7904843150407062 -0.015965600616830528 2.3848055152499184 1.8792322170664133 -0.25307683207634996 2.369514539513784 1.8605933733492037 -0.13363304374510435 2.3542235637776501 1.8419545296319944 -0.014189255413858945 2.3574010863601083 1.9493412753749106 -0.37074427520462377 2.3421101106239739 1.9307024316577013 -0.25130048687337836 2.3268191348878395 1.9120635879404917 -0.13185669854213278 2.3115281591517052 1.8934247442232823 -0.012412910210887364 2.3147056817341638 2.0008114899661988 -0.36896793000165218 2.2994147059980294 1.9821726462489893 -0.24952414167040679 2.2841237302618951 1.9635338025317797 -0.13008035333916121 2.2688327545257607 1.9448949588145703 -0.010636565007915783 2.2873012528443533 2.070920548274696 -0.48663537312992605 2.2720102771082189 2.0522817045574868 -0.36719158479868064 2.2567193013720845 2.0336428608402772 -0.24774779646743522 2.2414283256359502 2.0150040171230676 -0.12830400813618961 2.2261373498998158 1.9963651734058585 -0.0088602198049442006 2.2598968239545432 2.1410296065831935 -0.60430281625820004 2.2446058482184088 2.1223907628659839 -0.48485902792695446 2.2293148724822744 2.1037519191487748 -0.36541523959570904 2.2140238967461401 2.0851130754315652 -0.24597145126446365 2.1987329210100057 2.0664742317143556 -0.12652766293321804 2.1834419452738714 2.0478353879971465 -0.0070838746019726215 2.2324923950647331 2.2111386648916911 -0.72197025938647397 2.2172014193285987 2.1924998211744811 -0.6025264710552285 2.2019104435924644 2.1738609774572719 -0.48308268272398291 2.1866194678563295 2.1552221337400628 -0.3636388943927375 2.1713284921201952 2.1365832900228532 -0.24419510606149208 2.1560375163840608 2.1179444463056436 -0.12475131773024646 2.1407465406479265 2.0993056025884345 -0.0053075293990010415 2.8981268767108759 1.2215515401128345 -0.73855816517434336 2.8770653340036874 1.2108630667179892 -0.6192725318917921 2.856003791296498 1.200174593323144 -0.49998689860924084 2.8349422485893085 1.1894861199282991 -0.38070126532668974 2.8138807058821196 1.178797646533454 -0.26141563204413865 2.7928191631749302 1.1681091731386088 -0.14212999876158741 2.7717576204677412 1.1574206997437637 -0.022844365479036285 2.8648063471637735 1.283788668591249 -0.73831717918639139 2.843744804456585 1.2731001951964038 -0.61903154590384013 2.8226832617493955 1.2624117218015587 -0.49974591262128892 2.8016217190422061 1.2517232484067138 -0.38046027933873783 2.7805601763350167 1.2410347750118687 -0.26117464605618668 2.7594986336278278 1.2303463016170235 -0.14188901277363541 2.8314858176166711 1.3460257970696636 -0.73807619319843942 2.8104242749094825 1.3353373236748185 -0.61879055991588816 2.7893627322022931 1.3246488502799734 -0.49950492663333695 2.7683011894951037 1.3139603768851287 -0.38021929335078586 2.7472396467879143 1.3032719034902835 -0.26093366006823476 2.7981652880695687 1.4082629255480783 -0.73783520721048745 2.7771037453623801 1.3975744521532332 -0.61854957392793619 2.7560422026551907 1.386885978758388 -0.49926394064538504 2.7349806599480013 1.3761975053635433 -0.37997830736283394 2.7648447585224663 1.470500054026493 -0.73759422122253548 2.7437832158152777 1.4598115806316478 -0.61830858793998433 2.7227216731080883 1.4491231072368027 -0.49902295465743307 2.7016601304008985 1.4384346338419578 -0.37973732137488198 2.7315242289753638 1.5327371825049076 -0.73735323523458352 2.7104626862681749 1.5220487091100625 -0.61806760195203236 2.6894011435609855 1.5113602357152174 -0.49878196866948116 2.6982036994282614 1.5949743109833223 -0.73711224924663155 2.6771421567210725 1.5842858375884772 -0.61782661596408051 2.664883169881159 1.657211439461737 -0.73687126325867958 2.6315626403340566 1.7194485679401514 -0.73663027727072761 2.739879175644174 1.2169327232510989 -0.022538716121641218 2.7270598362818679 1.2909172223024565 -0.14160848973620099 2.7082322188917316 1.2760073041567119 -0.022222686792514604 2.7142404969195613 1.3649017213538142 -0.26067826335076094 2.6954128795294254 1.3499918032080696 -0.14129246040707438 2.6765852621392892 1.3350818850623249 -0.021906657463387991 2.6825935401671188 1.4239763022594272 -0.26036223402163433 2.663765922776983 1.4090663841136826 -0.14097643107794777 2.6449383053868472 1.394156465967938 -0.021590628134261373 2.6697742008048131 1.4979608013107848 -0.37943200763619411 2.6509465834146768 1.4830508831650402 -0.26004620469250772 2.632118966024541 1.4681409650192956 -0.14066040174882113 2.6132913486344052 1.453231046873551 -0.021274598805134756 2.6569548614425069 1.5719453003621424 -0.49850178125075389 2.6381272440523706 1.5570353822163978 -0.3791159783070675 2.6192996266622344 1.5421254640706532 -0.25973017536338111 2.6004720092720985 1.5272155459249086 -0.14034437241969452 2.5816443918819627 1.512305627779164 -0.020958569476008142 2.6441355220802008 1.6459297994135 -0.6175715548653139 2.6253079046900645 1.6310198812677554 -0.49818575192162728 2.6064802872999286 1.6161099631220108 -0.37879994897794089 2.5876526699097924 1.6012000449762662 -0.2594141460342545 2.5688250525196565 1.5862901268305216 -0.14002834309056789 2.5499974351295203 1.571380208684777 -0.020642540146881529 2.6124885653277587 1.7050043803191131 -0.61725552553618723 2.5936609479376225 1.6900944621733687 -0.49786972259250067 2.5748333305474862 1.6751845440276238 -0.37848391964881428 2.5560057131573499 1.6602746258818792 -0.25909811670512783 2.5371780957672141 1.6453647077361346 -0.13971231376144128 2.5183504783770783 1.63045478959039 -0.020326510817754911 3.0845789420869116 0.61585229245268092 -0.73237171055230399 3.0618054677868072 0.60963288027670193 -0.61316123419182378 3.064227777793751 0.68343173996704232 -0.7330912096470692 3.0414543034936461 0.67721232779106333 -0.61388073328658899 3.0186808291935416 0.67099291561508434 -0.49467025692610861 2.9959073548934367 0.66477350343910535 -0.37545978056562834 2.9731338805933318 0.65855409126312636 -0.25624930420514813 2.9503604062932269 0.65233467908714726 -0.13703882784466778 3.0438766135005899 0.75101118748140383 -0.73381070874183441 3.021103139200485 0.74479177530542473 -0.61460023238135419 2.9983296649003806 0.73857236312944574 -0.49538975602087382 2.9755561906002757 0.73235295095346675 -0.37617927966039355 2.9527827163001708 0.72613353877748765 -0.25696880329991334 3.0235254492074293 0.81859063499576523 -0.73453020783659961 3.0007519749073244 0.81237122281978613 -0.6153197314761194 2.9779785006072195 0.80615181064380703 -0.49610925511563903 2.9552050263071146 0.79993239846782804 -0.37689877875515876 2.9324315520070097 0.79371298629184905 -0.25768830239467855 3.0031742849142682 0.88617008251012663 -0.73524970693136482 2.9804008106141633 0.87995067033414753 -0.61603923057088461 2.9576273363140588 0.87373125815816843 -0.49682875421040418 2.9348538620139535 0.86751184598218956 -0.37761827784992397 2.9828231206211075 0.95374953002448803 -0.73596920602613003 2.9600496463210026 0.94753011784850893 -0.61675872966564982 2.9372761720208977 0.94131070567252983 -0.49754825330516939 2.9624719563279469 1.0213289775388494 -0.73668870512089513 2.9396984820278416 1.0151095653628703 -0.61747822876041503 2.9421207920347858 1.0889084250532108 -0.73740820421566033 2.9193473177346809 1.0826890128772317 -0.61819772785518012 2.9217696277416247 1.1564878725675722 -0.73812770331042543 2.9282791975196525 0.64379889657843625 -0.017778087375244292 2.9303504993434681 0.71877225494130093 -0.13773354888010586 2.9089280519698946 0.70803220932135569 -0.018424976973888004 2.9109993537937102 0.78300556768422025 -0.13838043847874956 2.8895769064201366 0.77226552206427501 -0.019071866572531716 2.9130706556175259 0.85797892604708526 -0.25833589998361128 2.8916482082439523 0.84723888042713968 -0.13902732807739326 2.8702257608703783 0.83649883480719445 -0.019718756171175428 2.9151419574413415 0.93295228440994993 -0.37829136148847287 2.893719510067768 0.92221223879000458 -0.25898278958225501 2.8722970626941944 0.91147219317005912 -0.13967421767603697 2.8508746153206204 0.90073214755011377 -0.020365645769819137 2.9172132592651572 1.0079256427728147 -0.49824682299333445 2.8957908118915836 0.99718559715286936 -0.3789382510871166 2.87436836451801 0.9864455515329239 -0.25962967918089874 2.852945917144436 0.97570550591297844 -0.14032110727468067 2.831523469770862 0.96496546029303309 -0.021012535368462849 2.8978621137153993 1.072158955515734 -0.49889371259197818 2.8764396663418257 1.0614189098957887 -0.37958514068576032 2.8550172189682517 1.0506788642758433 -0.26027656877954247 2.8335947715946777 1.039938818655898 -0.14096799687332437 2.8121723242211041 1.0291987730359526 -0.021659424967106562 2.8999334155392149 1.1471323138785989 -0.61884917409683982 2.8785109681656413 1.1363922682586534 -0.49954060219062191 2.8570885207920673 1.125652222638708 -0.38023203028440405 2.8356660734184937 1.1149121770187627 -0.26092345837818615 2.8142436260449197 1.1041721313988173 -0.1416148864719681 2.7928211786713457 1.093432085778872 -0.02230631456575027 3.1380859344133794 0.055058758601889246 -0.72146720038413625 3.1145383974224399 0.053560622168381589 -0.60234393588912383 3.0909908604315004 0.052062485734873987 -0.48322067139411129 3.0674433234405609 0.050564349301366385 -0.36409740689909886 3.0438957864496219 0.049066212867858755 -0.24497414240408646 3.0203482494586824 0.047568076434351132 -0.1258508779090739 3.1314367395647422 0.12533441598797829 -0.72283641273002475 3.1078892025738027 0.12383627955447063 -0.60371314823501232 3.0843416655828633 0.12233814312096303 -0.48458988373999978 3.0607941285919238 0.12084000668745548 -0.36546661924498736 3.0372465916009848 0.11934187025394788 -0.24634335474997493 3.1247875447161051 0.19561007337406749 -0.72420562507591324 3.1012400077251656 0.19411193694055984 -0.60508236058090081 3.0776924707342261 0.19261380050705229 -0.48595909608588828 3.0541449337432867 0.19111566407354474 -0.36683583159087585 3.0305973967523476 0.18961752764003717 -0.24771256709586342 3.118138349867468 0.26588573076015654 -0.72557483742180173 3.0945908128765285 0.26438759432664893 -0.60645157292678931 3.071043275885589 0.26288945789314133 -0.48732830843177677 3.0474957388946495 0.26139132145963384 -0.36820504393676434 3.1114891550188308 0.33616138814624558 -0.72694404976769023 3.0879416180278918 0.33466325171273803 -0.6078207852726778 3.0643940810369523 0.33316511527923043 -0.48869752077766532 3.1048399601701937 0.40643704553233462 -0.72831326211357872 3.0812924231792547 0.40493890909882707 -0.6091899976185664 3.098190765321557 0.47671270291842371 -0.72968247445946721 3.074643228330618 0.47521456648491611 -0.6105592099644549 3.0915415704729199 0.54698836030451292 -0.73105168680535582 2.9969919970959067 0.044039939103374115 -0.0066841117999686516 3.0137725426839386 0.11706384440962248 -0.12720337772629961 2.9906682033136684 0.11086228995266606 -0.0079793220069934098 3.0074487489017008 0.18388619525891448 -0.12849858793332436 2.9843444095314307 0.17768464080195806 -0.0092745322140181698 3.0242292944897327 0.25691010056516289 -0.24901785385965544 3.0011249551194625 0.25070854610820648 -0.12979379814034911 2.9780206157491924 0.24450699165125006 -0.01056974242104293 3.0410098400777645 0.3299340058714112 -0.36953711978598641 3.0179055007074949 0.32373245141445489 -0.25031306406668019 2.9948011613372247 0.31753089695749842 -0.13108900834737389 2.9716968219669546 0.31132934250054201 -0.011864952628067688 3.0577903856657969 0.40295791117765956 -0.49005638571231736 3.0346860462955267 0.3967563567207032 -0.37083232999301119 3.0115817069252566 0.39055480226374684 -0.25160827427370497 2.9884773675549865 0.38435324780679037 -0.13238421855439864 2.9653730281847164 0.37815169334983401 -0.013160162835092446 3.0514665918835591 0.46978026202695156 -0.49135159591934213 3.0283622525132889 0.4635787075699952 -0.37212754020003597 3.0052579131430188 0.45737715311303884 -0.25290348448072975 2.9821535737727487 0.45117559865608237 -0.13367942876142341 2.9590492344024786 0.44497404419912601 -0.014455373042117204 3.0682471374715909 0.54280416733319992 -0.6118708618456733 3.0451427981013208 0.53660261287624356 -0.49264680612636691 3.0220384587310507 0.5304010584192872 -0.37342275040706069 2.9989341193607806 0.52419950396233084 -0.25419869468775452 2.9758297799905105 0.51799794950537437 -0.13497463896844816 2.9527254406202403 0.51179639504841801 -0.015750583249141963 3.038819004319083 0.60342496372553556 -0.49394201633339169 3.0157146649488129 0.59722340926857909 -0.37471796061408547 2.9926103255785428 0.59102185481162273 -0.25549390489477924 2.9695059862082727 0.58482030035466637 -0.13626984917547294 2.9464016468380025 0.5786187458977099 -0.017045793456166723 3.0836550953117108 -0.57533121384030483 -0.70543765481508869 3.0603064793085615 -0.57201692246663738 -0.58641516504456137 3.0369578633054117 -0.56870263109297003 -0.467392675274034 3.013609247302262 -0.56538833971930269 -0.34837018550350674 2.9902606312991122 -0.56207404834563524 -0.2293476957329795 2.9669120152959625 -0.55875975697196789 -0.11032520596245213 3.0909364563233246 -0.50508889651122502 -0.70726306470586975 3.0675878403201753 -0.50177460513755756 -0.58824057493534243 3.0442392243170255 -0.49846031376389022 -0.46921808516481506 3.0208906083138758 -0.49514602239022287 -0.3501955953942878 2.997541992310726 -0.49183173101655542 -0.23117310562376056 3.0982178173349384 -0.4348465791821452 -0.70908847459665081 3.0748692013317891 -0.43153228780847774 -0.59006598482612349 3.0515205853286393 -0.4282179964348104 -0.47104349505559612 3.0281719693254896 -0.42490370506114306 -0.35202100528506886 3.0048233533223399 -0.4215894136874756 -0.23299851551454165 3.1054991783465522 -0.36460426185306544 -0.71091388448743187 3.0821505623434029 -0.36128997047939798 -0.59189139471690455 3.0588019463402532 -0.35797567910573064 -0.47286890494637718 3.0354533303371034 -0.35466138773206329 -0.35384641517584992 3.112780539358166 -0.29436194452398556 -0.71273929437821293 3.0894319233550167 -0.29104765315031811 -0.59371680460768561 3.066083307351867 -0.28773336177665076 -0.47469431483715824 3.1200619003697798 -0.2241196271949058 -0.71456470426899399 3.0967132843666305 -0.22080533582123835 -0.59554221449846667 3.1273432613813936 -0.15387730986582601 -0.71639011415977505 3.1039946453782443 -0.15056301849215858 -0.59736762438924773 3.1346246223930079 -0.083634992536746139 -0.71821552405055611 2.9741364730919355 -0.48906957974217685 -0.11213793608653191 2.9810614534315945 -0.42228527541606864 -0.11388393352713218 3.0118233450229366 -0.35407726331946293 -0.23476122776722974 2.9879864337712534 -0.35550097108996048 -0.11562993096773244 3.0425852366142792 -0.28586925122285711 -0.35563852200732721 3.0187483253625955 -0.28729295899335472 -0.23650722520783002 2.9949114141109123 -0.28871666676385227 -0.11737592840833271 3.0733471282056213 -0.21766123912625129 -0.47651581624742462 3.0495102169539381 -0.21908494689674896 -0.35738451944792748 3.0256733057022545 -0.22050865466724656 -0.2382532226484303 3.0018363944505713 -0.22193236243774414 -0.11912192584893297 3.0802721085452802 -0.15087693480014316 -0.47826181368802489 3.056435197293597 -0.1523006425706408 -0.35913051688852771 3.0325982860419134 -0.15372435034113843 -0.23999922008903057 3.0087613747902302 -0.15514805811163604 -0.12086792328953325 2.9849244635385466 -0.15657176588213365 -0.0017366264900361434 3.1110340001366232 -0.082668922703537345 -0.59913910792812242 3.0871970888849392 -0.084092630474034938 -0.48000781112862512 3.063360177633256 -0.085516338244532572 -0.36087651432912798 3.0395232663815723 -0.08694004601503022 -0.24174521752963082 3.0156863551298891 -0.088363753785527827 -0.12261392073013351 2.9918494438782055 -0.089787461556025447 -0.0034826239306364228 3.1417958917279654 -0.014460910606931578 -0.72001640216821983 3.1179589804762822 -0.015884618377429178 -0.60088510536872264 3.0941220692245985 -0.017308326147926802 -0.48175380856922539 3.0702851579729149 -0.018732033918424436 -0.36262251176972821 3.0464482467212313 -0.020155741688922073 -0.2434912149702311 3.0226113354695481 -0.021579449459419697 -0.12435991817073379 2.9987744242178644 -0.023003157229917328 -0.0052286213712367004 2.9033586016066333 -1.1818084946608429 -0.68625688285939956 2.8811981669801758 -1.1737756908221657 -0.5673507317977633 2.8590377323537184 -1.1657428869834885 -0.44844458073612697 2.8368772977272609 -1.1577100831448113 -0.32953842967449071 2.8147168631008035 -1.1496772793061343 -0.2106322786128545 2.792556428474346 -1.1416444754674573 -0.09172612755121809 2.9242776637443333 -1.1143190357685122 -0.68841464358122129 2.9021172291178758 -1.106286231929835 -0.56950849251958502 2.8799567944914184 -1.0982534280911578 -0.4506023414579487 2.8577963598649609 -1.0902206242524808 -0.33169619039631243 2.8356359252385035 -1.0821878204138036 -0.21279003933467622 2.9451967258820333 -1.0468295768761817 -0.69057240430304301 2.9230362912555758 -1.0387967730375043 -0.57166625324140674 2.9008758566291184 -1.0307639691988273 -0.45276010217977036 2.8787154220026605 -1.0227311653601501 -0.33385395111813415 2.8565549873762031 -1.0146983615214729 -0.21494780005649794 2.9661157880197333 -0.9793401179838509 -0.69273016502486473 2.9439553533932759 -0.97130731414517357 -0.57382401396322846 2.921794918766818 -0.96327451030649647 -0.45491786290159208 2.8996344841403605 -0.95524170646781925 -0.33601171183995587 2.9870348501574329 -0.9118506590915203 -0.69488792574668645 2.9648744155309754 -0.90381785525284297 -0.57598177468505019 2.942713980904518 -0.89578505141416587 -0.45707562362341381 3.0079539122951329 -0.84436120019918959 -0.69704568646850817 2.985793477668675 -0.83632839636051237 -0.57813953540687191 2.9636330430422175 -0.82829559252183527 -0.45923338434523547 3.0288729744328324 -0.77687174130685899 -0.6992034471903299 3.006712539806375 -0.76883893746818177 -0.58029729612869363 3.0497920365705324 -0.70938228241452828 -0.70136120791215162 2.813342366081927 -1.0745861526752971 -0.093872572398482484 2.833228583096246 -1.0104416582172207 -0.095942539038756089 2.8766972669932898 -0.94972458464746612 -0.21703953257484931 2.8531148001105651 -0.94629716375914419 -0.098012505679029693 2.920165950890333 -0.88900751107771148 -0.33813652611094236 2.8965834840076088 -0.88558009018938977 -0.2191094992151229 2.8730010171248841 -0.88215266930106773 -0.1000824723193033 2.9400521679046521 -0.82486301661963513 -0.34020649275121595 2.9164697010219278 -0.82143559573131331 -0.2211794658553965 2.8928872341392031 -0.81800817484299138 -0.1021524389595769 2.9835208518016958 -0.76414594304988048 -0.46130348628730905 2.9599383849189711 -0.76071852216155866 -0.3422764593914896 2.9363559180362468 -0.75729110127323684 -0.22324943249567011 2.9127734511535222 -0.75386368038491502 -0.10422240559985051 3.0269895356987391 -0.70342886948012595 -0.58240047982340226 3.0034070688160148 -0.70000144859180413 -0.46337345292758264 2.9798246019332901 -0.6965740277034822 -0.34434642603176319 2.9562421350505659 -0.69314660681516038 -0.22531939913594373 2.9326596681678412 -0.68971918592683856 -0.10629237224012411 3.0704582195957828 -0.64271179591037131 -0.70349747335949542 3.0468757527130581 -0.63928437502204949 -0.58447044646367585 3.0232932858303339 -0.63585695413372767 -0.46544341956785623 2.9997108189476096 -0.63242953324540585 -0.34641639267203683 2.9761283520648849 -0.62900211235708403 -0.22738936577621732 2.9525458851821602 -0.62557469146876221 -0.10836233888039772 2.6047256229393194 -1.7394730031681893 -0.66475174307424723 2.5847234044457847 -1.7270177647026932 -0.5459783145419137 2.6384715276405273 -1.6773497151311894 -0.66715894047999258 2.6184693091469926 -1.6648944766656935 -0.54838551194765905 2.5984670906534575 -1.6524392382001976 -0.42961208341532531 2.5784648721599228 -1.6399839997347014 -0.31083865488299178 2.5584626536663881 -1.6275287612692055 -0.1920652263506582 2.6722174323417351 -1.6152264270941896 -0.66956613788573793 2.6522152138482005 -1.6027711886286937 -0.55079270935340441 2.6322129953546654 -1.5903159501631978 -0.43201928082107066 2.6122107768611307 -1.5778607116977017 -0.31324585228873714 2.592208558367596 -1.5654054732322058 -0.19447242375640361 2.705963337042943 -1.5531031390571899 -0.67197333529148329 2.6859611185494083 -1.540647900591694 -0.55319990675914976 2.6659589000558732 -1.5281926621261979 -0.43442647822681602 2.6459566815623385 -1.515737423660702 -0.31565304969448249 2.7397092417441509 -1.4909798510201902 -0.67438053269722864 2.7197070232506162 -1.478524612554694 -0.55560710416489512 2.6997048047570811 -1.4660693740891981 -0.43683367563256137 2.7734551464453587 -1.4288565629831902 -0.67678773010297399 2.7534529279518241 -1.4164013245176941 -0.55801430157064047 2.7334507094582894 -1.4039460860521982 -0.43924087303830672 2.8072010511465666 -1.3667332749461902 -0.67919492750871935 2.7871988326530324 -1.3542780364806943 -0.56042149897638582 2.8409469558477745 -1.3046099869091905 -0.6816021249144647 2.5382511564512367 -1.6154599547370236 -0.073279650573413957 2.5703149968115229 -1.5564425886504285 -0.075589215275047708 2.6247070335997758 -1.5055855564011571 -0.19680721613620139 2.6023788371718091 -1.4974252225638334 -0.077898779976681459 2.6790990703880282 -1.4547285241518859 -0.31802521699735498 2.6567708739600615 -1.4465681903145622 -0.19911678083783513 2.6344426775320953 -1.4384078564772385 -0.08020834467831521 2.7111629107483144 -1.3957111580652908 -0.32033478169898871 2.6888347143203477 -1.3875508242279671 -0.20142634553946889 2.6665065178923815 -1.3793904903906433 -0.082517909379948962 2.7655549475365668 -1.3448541258160196 -0.4415527825601423 2.7432267511086001 -1.3366937919786956 -0.32264434640062245 2.7208985546806339 -1.3285334581413721 -0.20373591024110266 2.6985703582526672 -1.3203731243040484 -0.084827474081582713 2.8199469843248197 -1.2939970935667482 -0.56277078342129594 2.7976187878968526 -1.2858367597294245 -0.44386234726177604 2.7752905914688863 -1.2776764258921007 -0.32495391110225619 2.7529623950409197 -1.269516092054777 -0.2060454749427364 2.730634198612953 -1.2613557582174535 -0.087137038783216464 2.8743390211130722 -1.2431400613174768 -0.68398878428244958 2.8520108246851055 -1.2349797274801531 -0.56508034812292973 2.8296826282571388 -1.2268193936428293 -0.44617191196340977 2.8073544318291721 -1.2186590598055056 -0.32726347580388998 2.7850262354012059 -1.2104987259681819 -0.20835503964437016 2.7626980389732392 -1.2023383921308584 -0.089446603484850201 2.2623706838239066 -2.187450974620945 -0.76273172668213662 2.2454301272807502 -2.1710773716973129 -0.64410585508478535 2.2284895707375942 -2.1547037687736812 -0.52547998348743397 2.2115490141944383 -2.1383301658500491 -0.40685411189008247 2.1946084576512823 -2.1219565629264174 -0.28822824029273114 2.1776679011081259 -2.1055829600027853 -0.16960236869537987 2.3076362298591966 -2.1331050619871217 -0.76532857664546017 2.2906956733160402 -2.1167314590634896 -0.64670270504810889 2.2737551167728842 -2.1003578561398579 -0.52807683345075751 2.2568145602297283 -2.0839842532162258 -0.40945096185340601 2.2398740036865719 -2.0676106502925942 -0.29082509025605469 2.2229334471434155 -2.0512370473689625 -0.17219921865870344 2.3359612193513302 -2.0623855464296663 -0.64929955501143244 2.3190206628081742 -2.0460119435060347 -0.53067368341408105 2.3020801062650182 -2.029638340582403 -0.41204781181672956 2.2851395497218618 -2.0132647376587709 -0.29342194021937823 2.3812267653866201 -2.008039633795843 -0.65189640497475598 2.3642862088434642 -1.9916660308722114 -0.5332705333774046 2.3473456523003082 -1.9752924279485797 -0.4146446617800531 2.4264923114219101 -1.95369372116202 -0.65449325493807953 2.4095517548787542 -1.9373201182383883 -0.53586738334072814 2.3926111983355978 -1.9209465153147567 -0.41724151174337659 2.4717578574572001 -1.899347808528197 -0.65709010490140296 2.4548173009140437 -1.8829742056045653 -0.53846423330405169 2.5170234034924897 -1.8450018958943739 -0.6596869548647265 2.1604072568358244 -2.0895946945687851 -0.050961465137085507 2.2033965397790558 -2.0379890603829289 -0.053451417225920436 2.2664873635538947 -1.9989516794007072 -0.17471568706620308 2.2463858227222873 -1.9863834261970728 -0.055941369314755365 2.329578187328734 -1.9599142984184854 -0.2959799569064856 2.3094766464971261 -1.947346045214851 -0.17720563915503801 2.2893751056655187 -1.9347777920112166 -0.058431321403590294 2.3725674702719655 -1.9083086642326292 -0.2984699089953205 2.3524659294403576 -1.8957404110289948 -0.17969559124387294 2.3323643886087502 -1.8831721578253604 -0.060921273492425224 2.4356582940468043 -1.8692712832504073 -0.41973417883560299 2.4155567532151969 -1.8567030300467731 -0.3009598610841554 2.395455212383589 -1.8441347768431386 -0.18218554333270787 2.3753536715519816 -1.8315665236395042 -0.063411225581260153 2.4987491178216432 -1.8302339022681853 -0.54099844867588565 2.4786475769900358 -1.8176656490645511 -0.42222413092443789 2.4585460361584284 -1.8050973958609169 -0.30344981317299036 2.4384444953268205 -1.7925291426572825 -0.1846754954215428 2.4183429544952131 -1.7799608894536483 -0.065901177670095082 2.5618399415964821 -1.7911965212859633 -0.66226271851616814 2.5417384007648747 -1.7786282680823291 -0.5434884007647206 2.5216368599332672 -1.7660600148786949 -0.42471408301327285 2.5015353191016598 -1.7534917616750607 -0.30593976526182531 2.481433778270052 -1.7409235084714263 -0.18716544751037772 2.4613322374384445 -1.7283552552677921 -0.068391129758930011 2.5646261428764983 -1.7144543806928387 -0.42720403510210775 2.5445246020448913 -1.7018861274892043 -0.30842971735066022 2.5244230612132839 -1.6893178742855703 -0.18965539959921265 2.5043215203816764 -1.6767496210819361 -0.070881081847764954 1.7746732797647036 -2.594847458961496 -0.73820400156249377 1.7615798451466675 -2.5752552550885111 -0.61973556832366139 1.7484864105286315 -2.5556630512155261 -0.5012671350848289 1.7353929759105953 -2.5360708473425415 -0.38279870184599624 1.7222995412925592 -2.5164786434695565 -0.2643302686071638 1.709206106674523 -2.4968864395965715 -0.14586183536833133 1.8296938720995226 -2.5503943181686353 -0.74094176005468726 1.8166004374814864 -2.5308021142956503 -0.62247332681585488 1.8035070028634506 -2.5112099104226653 -0.50400489357702238 1.7904135682454143 -2.4916177065496807 -0.38553646033818967 1.7773201336273783 -2.4720255026766957 -0.26706802709935723 1.764226699009342 -2.4524332988037107 -0.14859959386052474 1.8847144644343417 -2.5059411773757745 -0.74367951854688075 1.8716210298163054 -2.4863489735027895 -0.62521108530804836 1.8585275951982696 -2.4667567696298045 -0.50674265206921587 1.8454341605802331 -2.44716456575682 -0.3882742188303831 1.8323407259621971 -2.427572361883835 -0.26980578559155066 1.9397350567691607 -2.4614880365829137 -0.74641727703907423 1.9266416221511244 -2.4418958327099287 -0.62794884380024185 1.9135481875330886 -2.4223036288369437 -0.50948041056140936 1.9004547529150522 -2.4027114249639592 -0.39101197732257659 1.9947556491039797 -2.4170348957900529 -0.74915503553126772 1.9816622144859435 -2.3974426919170679 -0.63068660229243523 1.9685687798679075 -2.3778504880440829 -0.51221816905360273 1.955475345249871 -2.358258284171098 -0.39374973581477002 2.0497762414387988 -2.3725817549971921 -0.75189279402346121 2.0366828068207625 -2.3529895511242067 -0.63342436078462871 2.0235893722027263 -2.3333973472512222 -0.51495592754579622 2.1047968337736176 -2.3281286142043314 -0.75463055251565458 2.0917033991555813 -2.3085364103313459 -0.63616211927682209 2.1598174261084369 -2.2836754734114701 -0.75736831100784807 2.2148380184432557 -2.2392223326186094 -0.76010606950004145 1.6956249370711611 -2.4776894451476981 -0.027373625958467433 1.7478588821069179 -2.4354943118945864 -0.02999839437357351 1.8170730453782544 -2.409741939555984 -0.15124919328810416 1.8000928271426746 -2.3932991786414748 -0.032623162788679591 1.8862872086495908 -2.3839895672173816 -0.27249999220263466 1.8693069904140112 -2.3675468063028724 -0.15387396170321022 1.8523267721784313 -2.3511040453883627 -0.035247931203785665 1.9385211536853475 -2.3417944339642696 -0.27512476061774072 1.9215409354497679 -2.3253516730497603 -0.15649873011831628 1.9045607172141881 -2.3089089121352511 -0.037872699618891739 2.0077353169566843 -2.3160420616256672 -0.39637555953227127 1.9907550987211045 -2.2995993007111575 -0.27774952903284678 1.9737748804855246 -2.2831565397966482 -0.15912349853342234 1.9567946622499448 -2.266713778882139 -0.04049746803399782 2.0769494802280204 -2.2902896892870652 -0.51762635844680194 2.0599692619924408 -2.2738469283725555 -0.39900032794737733 2.0429890437568612 -2.2574041674580458 -0.28037429744795284 2.0260088255212816 -2.2409614065435366 -0.1617482669485284 2.0090286072857015 -2.2245186456290273 -0.043122236449103894 2.146163643499357 -2.2645373169484624 -0.63887715736133244 2.1291834252637774 -2.2480945560339531 -0.520251126861908 2.1122032070281977 -2.2316517951194434 -0.40162509636248339 2.0952229887926181 -2.2152090342049338 -0.2829990658630589 2.0782427705570381 -2.1987662732904245 -0.16437303536363448 2.0612625523214581 -2.1823235123759157 -0.045747004864209968 2.1983975885351139 -2.2223421836953503 -0.6415019257764385 2.1814173702995343 -2.2058994227808411 -0.52287589527701406 2.1644371520639543 -2.1894566618663314 -0.40424986477758945 2.1474569338283751 -2.1730139009518221 -0.28562383427816501 2.1304767155927951 -2.1565711400373129 -0.16699780377874054 2.113496497357215 -2.1401283791228036 -0.048371773279316049 1.2159080708876928 -2.8953624496736969 -0.71280316249365372 1.2072893612416153 -2.8734135787003701 -0.59449313806092252 1.1986706515955381 -2.8514647077270427 -0.47618311362819149 1.1900519419494606 -2.8295158367537159 -0.35787308919546024 1.1814332323033836 -2.8075669657803881 -0.23956306476272909 1.1728145226573063 -2.7856180948070612 -0.12125304032999795 1.2785193087988524 -2.8625316159394423 -0.7156347359206785 1.269900599152775 -2.8405827449661154 -0.5973247114879473 1.2612818895066977 -2.8186338739927881 -0.47901468705521622 1.2526631798606203 -2.7966850030194612 -0.36070466262248496 1.2440444702145432 -2.7747361320461335 -0.24239463818975385 1.2354257605684658 -2.7527872610728066 -0.12408461375702268 1.3411305467100121 -2.8297007822051876 -0.71846630934770317 1.3325118370639346 -2.8077519112318607 -0.60015628491497208 1.3238931274178574 -2.7858030402585334 -0.48184626048224094 1.3152744177717799 -2.7638541692852066 -0.36353623604950969 1.3066557081257029 -2.7419052983118792 -0.2452262116167786 1.4037417846211717 -2.796869948470933 -0.72129788277472795 1.3951230749750942 -2.7749210774976061 -0.60298785834199686 1.386504365329017 -2.7529722065242788 -0.48467783390926567 1.3778856556829395 -2.7310233355509519 -0.36636780947653447 1.4663530225323314 -2.7640391147366783 -0.72412945620175273 1.4577343128862541 -2.7420902437633514 -0.60581943176902153 1.4491156032401769 -2.7201413727900241 -0.48750940733629039 1.528964260443491 -2.7312082810024236 -0.7269610296287774 1.5203455507974137 -2.7092594100290968 -0.60865100519604631 1.5117268411513365 -2.6873105390557694 -0.49034098076331512 1.5915754983546506 -2.698377447268169 -0.72979260305580207 1.5829567887085734 -2.6764285762948421 -0.61148257862307098 1.6541867362658103 -2.6655466135339139 -0.73262417648282685 1.7167979741769699 -2.6327157797996592 -0.73545574990985152 1.1634647618624308 -2.7640541700574528 -0.0029171368979232469 1.2228834089500076 -2.7329044441135855 -0.0056356935326714458 1.2953956122578374 -2.7213472898700326 -0.12682268287533835 1.2823020560375844 -2.7017547181697181 -0.0083542501674196412 1.3679078155656672 -2.7097901356264797 -0.24800967221800507 1.3548142593454142 -2.6901975639261653 -0.12954123951008653 1.3417207031251612 -2.6706049922258508 -0.011072806802167838 1.440420018873497 -2.6982329813829273 -0.36919666156067188 1.427326462653244 -2.6786404096826124 -0.25072822885275325 1.414232906432991 -2.6590478379822979 -0.13225979614483471 1.4011393502127381 -2.639455266281983 -0.013791363436916037 1.4998386659610738 -2.6670832554390596 -0.37191521819542006 1.4867451097408209 -2.6474906837387451 -0.25344678548750144 1.4736515535205679 -2.6278981120384302 -0.13497835277958289 1.4605579973003151 -2.6083055403381157 -0.016509920071664234 1.5723508692689037 -2.6555261011955067 -0.49310220753808692 1.5592573130486507 -2.6359335294951922 -0.37463377483016824 1.5461637568283979 -2.6163409577948773 -0.25616534212224962 1.5330702006081449 -2.5967483860945628 -0.1376969094143311 1.5199766443878922 -2.5771558143942479 -0.01922847670641243 1.6448630725767335 -2.6439689469519538 -0.61428919688075379 1.6317695163564807 -2.6243763752516394 -0.4958207641728351 1.6186759601362277 -2.6047838035513244 -0.37735233146491642 1.6055824039159747 -2.58519123185101 -0.2588838987569978 1.592488847695722 -2.565598660150695 -0.14041546604907928 1.579395291475469 -2.5460060884503806 -0.021947033341160625 1.7042817196643103 -2.6128192210080865 -0.61700775351550186 1.6911881634440575 -2.5932266493077716 -0.49853932080758334 1.6780946072238045 -2.5736340776074571 -0.38007088809966461 1.6650010510035518 -2.5540415059071422 -0.26160245539174604 1.6519074947832988 -2.5344489342068277 -0.14313402268382749 1.6388139385630458 -2.5148563625065128 -0.024665589975908824 0.59133226457329036 -2.9604208612375684 -0.096217280280471745 0.59501653376674091 -2.9837467036129253 -0.21438039566270284 0.59870080296019135 -3.0070725459882826 -0.33254351104493396 0.67747262803903396 -3.0571017713360198 -0.68990451908371586 0.67378835884558352 -3.0337759289606629 -0.57174140370148474 0.67010408965213297 -3.0104500865853057 -0.45357828831925362 0.66641982045868253 -2.9871242442099488 -0.33541517293702239 0.66273555126523209 -2.9637984018345915 -0.21725205755479124 0.65905128207178165 -2.9404725594592351 -0.099088942172560118 0.74519164553752515 -3.0371534695576861 -0.69277618097580429 0.74150737634407471 -3.0138276271823292 -0.57461306559357317 0.73782310715062416 -2.9905017848069719 -0.45644995021134205 0.73413883795717361 -2.9671759424316151 -0.33828683482911082 0.73045456876372328 -2.9438501000562582 -0.22012371944687967 0.81291066303601633 -3.0172051677793523 -0.69564784286789272 0.80922639384256589 -2.9938793254039955 -0.5774847274856616 0.80554212464911534 -2.9705534830286382 -0.45932161210343048 0.80185785545566479 -2.9472276406532814 -0.34115849672119924 0.88062968053450752 -2.9972568660010186 -0.69851950475998115 0.87694541134105708 -2.9739310236256618 -0.58035638937775003 0.87326114214760653 -2.9506051812503045 -0.46219327399551891 0.94834869803299859 -2.9773085642226849 -0.70139116665206958 0.94466442883954815 -2.953982721847328 -0.58322805126983845 0.94098015964609771 -2.9306568794719707 -0.46506493588760728 1.0160677155314897 -2.9573602624443511 -0.704262828544158 1.0123834463380392 -2.9340344200689943 -0.58609971316192688 1.0837867330299809 -2.9374119606660174 -0.70713449043624643 1.151505750528472 -2.9174636588876837 -0.71000615232833475 0.72363149068968324 -2.9214569818565073 -0.10186671010202492 0.79646663162540454 -2.9244090345949432 -0.2229443196971268 0.78785794281534471 -2.9025465260516152 -0.10463389580105643 0.86930177256112551 -2.9273610873333791 -0.34402192929222869 0.86069308375106601 -2.9054985787900511 -0.22571150539615831 0.85208439494100618 -2.8836360702467232 -0.10740108150008795 0.93352822468678698 -2.908450631528487 -0.34678911499126019 0.92491953587672748 -2.8865881229851591 -0.22847869109518981 0.91631084706666766 -2.8647256144418312 -0.11016826719911946 1.0063633656225082 -2.9114026842669225 -0.46786672458636225 0.99775467681244856 -2.889540175723595 -0.3495563006902917 0.98914598800238895 -2.8676776671802666 -0.23124587679422132 0.98053729919232924 -2.8458151586369391 -0.11293545289815098 1.0791985065582292 -2.9143547370053584 -0.58894433418146419 1.0705898177481696 -2.8924922284620305 -0.47063391028539375 1.06198112893811 -2.8706297199187025 -0.3523234863893232 1.0533724401280504 -2.8487672113753746 -0.23401306249325282 1.0447637513179908 -2.8269047028320466 -0.11570263859718248 1.1434249586838907 -2.8954442812004664 -0.59171151988049564 1.1348162698738311 -2.873581772657138 -0.47340109598442526 1.1262075810637715 -2.8517192641138105 -0.35509067208835476 1.1175988922537119 -2.8298567555704821 -0.23678024819228435 1.1089902034436523 -2.8079942470271546 -0.118469824296214 1.1003815146335929 -2.7861317384838262 -0.00015940040014337641 0.54298642912310946 -3.0826303260197903 -0.68427028053128591 0.47284528267633097 -3.0889730360838596 -0.68142686817837506 0.40270413622955248 -3.0953157461479295 -0.67858345582546431 0.40426718239767639 -3.0716816373929148 -0.56054070939538381 0.33256298978277399 -3.1016584562119989 -0.67574004347255345 0.3341260359508979 -3.0780243474569842 -0.55769729704247295 0.33568908211902176 -3.0543902387019699 -0.43965455061239228 0.2624218433359955 -3.1080011662760687 -0.67289663111964271 0.26398488950411936 -3.084367057521054 -0.5548538846895622 0.26554793567224322 -3.0607329487660393 -0.43681113825948148 0.19228069688921695 -3.1143438763401381 -0.67005321876673185 0.19384374305734081 -3.0907097675851234 -0.55201047233665135 0.1954067892254647 -3.0670756588301087 -0.43396772590657068 0.19696983539358859 -3.0434415500750944 -0.31592497947649012 0.12213955044243846 -3.1206865864042079 -0.6672098064138211 0.12370259661056233 -3.0970524776491932 -0.5491670599837406 0.12526564277868624 -3.0734183688941785 -0.43112431355365988 0.1268286889468101 -3.0497842601391638 -0.31308156712357932 0.12839173511493399 -3.0261501513841491 -0.19503882069349876 0.051998403995659886 -3.1270292964682773 -0.66436639406091025 0.053561450163783775 -3.1033951877132626 -0.54632364763082975 0.055124496331907663 -3.0797610789582479 -0.42828090120074908 0.056687542500031537 -3.0561269702032332 -0.31023815477066852 0.058250588668155426 -3.0324928614482189 -0.19219540834058796 0.059800965168582243 -3.0088599421965223 -0.074152368565080173 0.12623685587453531 -3.00286510345029 -0.076909991783314188 0.19637411881365052 -3.0200101187314634 -0.1978322504268327 0.19267274658048827 -2.9968702647040577 -0.079667615001548203 0.26651138175276584 -3.0371551340126373 -0.31875450907035119 0.26281000951960354 -3.0140152799852311 -0.2005898736450667 0.25910863728644129 -2.990875425957825 -0.082425238219782218 0.33294727245871886 -3.031160295266405 -0.32151213228858522 0.3292459002255565 -3.0080204412389984 -0.2033474968633007 0.32554452799239425 -2.9848805872115927 -0.085182861438016233 0.40308453539783412 -3.0483053105475784 -0.4424343909321039 0.39938316316467182 -3.0251654565201727 -0.32426975550681919 0.39568179093150946 -3.0020256024927661 -0.20610512008153473 0.39198041869834721 -2.9788857484653599 -0.087940484656250248 0.47322179833694944 -3.0654503258287522 -0.56335664957562237 0.46952042610378708 -3.0423104718013461 -0.44519201415033788 0.46581905387062478 -3.0191706177739399 -0.32702737872505322 0.46211768163746247 -2.9960307637465333 -0.20886274329976873 0.45841630940430017 -2.9728909097191276 -0.090698107874484263 0.53965768904290234 -3.0594554870825199 -0.5661142727938564 0.5359563168097401 -3.0363156330551133 -0.44794963736857191 0.53225494457657774 -3.0131757790277076 -0.32978500194328719 0.52855357234341549 -2.990035925000301 -0.21162036651800276 0.52485220011025313 -2.9668960709728949 -0.093455731092718278 0.60979495198201772 -3.0766005023636938 -0.68703653143737498 0.60609357974885536 -3.0534606483362876 -0.56887189601209043 0.602392207515693 -3.030320794308881 -0.45070726058680588</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<polyhedra>\n\t\t\t<first_faces>0</first_faces>\n\t\t\t<face_counts>27789</face_counts>\n\t\t\t<types>polygons</types>\n\t\t\t<face_first_loops>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947 7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 8015 8016 8017 8018 8019 8020 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 8035 8036 8037 8038 8039 8040 8041 8042 8043 8044 8045 8046 8047 8048 8049 8050 8051 8052 8053 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 8171 8172 8173 8174 8175 8176 8177 8178 8179 8180 8181 8182 8183 8184 8185 8186 8187 8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212 8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308 8309 8310 8311 8312 8313 8314 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433 8434 8435 8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 8464 8465 8466 8467 8468 8469 8470 8471 8472 8473 8474 8475 8476 8477 8478 8479 8480 8481 8482 8483 8484 8485 8486 8487 8488 8489 8490 8491 8492 8493 8494 8495 8496 8497 8498 8499 8500 8501 8502 8503 8504 8505 8506 8507 8508 8509 8510 8511 8512 8513 8514 8515 8516 8517 8518 8519 8520 8521 8522 8523 8524 8525 8526 8527 8528 8529 8530 8531 8532 8533 8534 8535 8536 8537 8538 8539 8540 8541 8542 8543 8544 8545 8546 8547 8548 8549 8550 8551 8552 8553 8554 8555 8556 8557 8558 8559 8560 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574 8575 8576 8577 8578 8579 8580 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592 8593 8594 8595 8596 8597 8598 8599 8600 8601 8602 8603 8604 8605 8606 8607 8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 8618 8619 8620 8621 8622 8623 8624 8625 8626 8627 8628 8629 8630 8631 8632 8633 8634 8635 8636 8637 8638 8639 8640 8641 8642 8643 8644 8645 8646 8647 8648 8649 8650 8651 8652 8653 8654 8655 8656 8657 8658 8659 8660 8661 8662 8663 8664 8665 8666 8667 8668 8669 8670 8671 8672 8673 8674 8675 8676 8677 8678 8679 8680 8681 8682 8683 8684 8685 8686 8687 8688 8689 8690 8691 8692 8693 8694 8695 8696 8697 8698 8699 8700 8701 8702 8703 8704 8705 8706 8707 8708 8709 8710 8711 8712 8713 8714 8715 8716 8717 8718 8719 8720 8721 8722 8723 8724 8725 8726 8727 8728 8729 8730 8731 8732 8733 8734 8735 8736 8737 8738 8739 8740 8741 8742 8743 8744 8745 8746 8747 8748 8749 8750 8751 8752 8753 8754 8755 8756 8757 8758 8759 8760 8761 8762 8763 8764 8765 8766 8767 8768 8769 8770 8771 8772 8773 8774 8775 8776 8777 8778 8779 8780 8781 8782 8783 8784 8785 8786 8787 8788 8789 8790 8791 8792 8793 8794 8795 8796 8797 8798 8799 8800 8801 8802 8803 8804 8805 8806 8807 8808 8809 8810 8811 8812 8813 8814 8815 8816 8817 8818 8819 8820 8821 8822 8823 8824 8825 8826 8827 8828 8829 8830 8831 8832 8833 8834 8835 8836 8837 8838 8839 8840 8841 8842 8843 8844 8845 8846 8847 8848 8849 8850 8851 8852 8853 8854 8855 8856 8857 8858 8859 8860 8861 8862 8863 8864 8865 8866 8867 8868 8869 8870 8871 8872 8873 8874 8875 8876 8877 8878 8879 8880 8881 8882 8883 8884 8885 8886 8887 8888 8889 8890 8891 8892 8893 8894 8895 8896 8897 8898 8899 8900 8901 8902 8903 8904 8905 8906 8907 8908 8909 8910 8911 8912 8913 8914 8915 8916 8917 8918 8919 8920 8921 8922 8923 8924 8925 8926 8927 8928 8929 8930 8931 8932 8933 8934 8935 8936 8937 8938 8939 8940 8941 8942 8943 8944 8945 8946 8947 8948 8949 8950 8951 8952 8953 8954 8955 8956 8957 8958 8959 8960 8961 8962 8963 8964 8965 8966 8967 8968 8969 8970 8971 8972 8973 8974 8975 8976 8977 8978 8979 8980 8981 8982 8983 8984 8985 8986 8987 8988 8989 8990 8991 8992 8993 8994 8995 8996 8997 8998 8999 9000 9001 9002 9003 9004 9005 9006 9007 9008 9009 9010 9011 9012 9013 9014 9015 9016 9017 9018 9019 9020 9021 9022 9023 9024 9025 9026 9027 9028 9029 9030 9031 9032 9033 9034 9035 9036 9037 9038 9039 9040 9041 9042 9043 9044 9045 9046 9047 9048 9049 9050 9051 9052 9053 9054 9055 9056 9057 9058 9059 9060 9061 9062 9063 9064 9065 9066 9067 9068 9069 9070 9071 9072 9073 9074 9075 9076 9077 9078 9079 9080 9081 9082 9083 9084 9085 9086 9087 9088 9089 9090 9091 9092 9093 9094 9095 9096 9097 9098 9099 9100 9101 9102 9103 9104 9105 9106 9107 9108 9109 9110 9111 9112 9113 9114 9115 9116 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129 9130 9131 9132 9133 9134 9135 9136 9137 9138 9139 9140 9141 9142 9143 9144 9145 9146 9147 9148 9149 9150 9151 9152 9153 9154 9155 9156 9157 9158 9159 9160 9161 9162 9163 9164 9165 9166 9167 9168 9169 9170 9171 9172 9173 9174 9175 9176 9177 9178 9179 9180 9181 9182 9183 9184 9185 9186 9187 9188 9189 9190 9191 9192 9193 9194 9195 9196 9197 9198 9199 9200 9201 9202 9203 9204 9205 9206 9207 9208 9209 9210 9211 9212 9213 9214 9215 9216 9217 9218 9219 9220 9221 9222 9223 9224 9225 9226 9227 9228 9229 9230 9231 9232 9233 9234 9235 9236 9237 9238 9239 9240 9241 9242 9243 9244 9245 9246 9247 9248 9249 9250 9251 9252 9253 9254 9255 9256 9257 9258 9259 9260 9261 9262 9263 9264 9265 9266 9267 9268 9269 9270 9271 9272 9273 9274 9275 9276 9277 9278 9279 9280 9281 9282 9283 9284 9285 9286 9287 9288 9289 9290 9291 9292 9293 9294 9295 9296 9297 9298 9299 9300 9301 9302 9303 9304 9305 9306 9307 9308 9309 9310 9311 9312 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 9323 9324 9325 9326 9327 9328 9329 9330 9331 9332 9333 9334 9335 9336 9337 9338 9339 9340 9341 9342 9343 9344 9345 9346 9347 9348 9349 9350 9351 9352 9353 9354 9355 9356 9357 9358 9359 9360 9361 9362 9363 9364 9365 9366 9367 9368 9369 9370 9371 9372 9373 9374 9375 9376 9377 9378 9379 9380 9381 9382 9383 9384 9385 9386 9387 9388 9389 9390 9391 9392 9393 9394 9395 9396 9397 9398 9399 9400 9401 9402 9403 9404 9405 9406 9407 9408 9409 9410 9411 9412 9413 9414 9415 9416 9417 9418 9419 9420 9421 9422 9423 9424 9425 9426 9427 9428 9429 9430 9431 9432 9433 9434 9435 9436 9437 9438 9439 9440 9441 9442 9443 9444 9445 9446 9447 9448 9449 9450 9451 9452 9453 9454 9455 9456 9457 9458 9459 9460 9461 9462 9463 9464 9465 9466 9467 9468 9469 9470 9471 9472 9473 9474 9475 9476 9477 9478 9479 9480 9481 9482 9483 9484 9485 9486 9487 9488 9489 9490 9491 9492 9493 9494 9495 9496 9497 9498 9499 9500 9501 9502 9503 9504 9505 9506 9507 9508 9509 9510 9511 9512 9513 9514 9515 9516 9517 9518 9519 9520 9521 9522 9523 9524 9525 9526 9527 9528 9529 9530 9531 9532 9533 9534 9535 9536 9537 9538 9539 9540 9541 9542 9543 9544 9545 9546 9547 9548 9549 9550 9551 9552 9553 9554 9555 9556 9557 9558 9559 9560 9561 9562 9563 9564 9565 9566 9567 9568 9569 9570 9571 9572 9573 9574 9575 9576 9577 9578 9579 9580 9581 9582 9583 9584 9585 9586 9587 9588 9589 9590 9591 9592 9593 9594 9595 9596 9597 9598 9599 9600 9601 9602 9603 9604 9605 9606 9607 9608 9609 9610 9611 9612 9613 9614 9615 9616 9617 9618 9619 9620 9621 9622 9623 9624 9625 9626 9627 9628 9629 9630 9631 9632 9633 9634 9635 9636 9637 9638 9639 9640 9641 9642 9643 9644 9645 9646 9647 9648 9649 9650 9651 9652 9653 9654 9655 9656 9657 9658 9659 9660 9661 9662 9663 9664 9665 9666 9667 9668 9669 9670 9671 9672 9673 9674 9675 9676 9677 9678 9679 9680 9681 9682 9683 9684 9685 9686 9687 9688 9689 9690 9691 9692 9693 9694 9695 9696 9697 9698 9699 9700 9701 9702 9703 9704 9705 9706 9707 9708 9709 9710 9711 9712 9713 9714 9715 9716 9717 9718 9719 9720 9721 9722 9723 9724 9725 9726 9727 9728 9729 9730 9731 9732 9733 9734 9735 9736 9737 9738 9739 9740 9741 9742 9743 9744 9745 9746 9747 9748 9749 9750 9751 9752 9753 9754 9755 9756 9757 9758 9759 9760 9761 9762 9763 9764 9765 9766 9767 9768 9769 9770 9771 9772 9773 9774 9775 9776 9777 9778 9779 9780 9781 9782 9783 9784 9785 9786 9787 9788 9789 9790 9791 9792 9793 9794 9795 9796 9797 9798 9799 9800 9801 9802 9803 9804 9805 9806 9807 9808 9809 9810 9811 9812 9813 9814 9815 9816 9817 9818 9819 9820 9821 9822 9823 9824 9825 9826 9827 9828 9829 9830 9831 9832 9833 9834 9835 9836 9837 9838 9839 9840 9841 9842 9843 9844 9845 9846 9847 9848 9849 9850 9851 9852 9853 9854 9855 9856 9857 9858 9859 9860 9861 9862 9863 9864 9865 9866 9867 9868 9869 9870 9871 9872 9873 9874 9875 9876 9877 9878 9879 9880 9881 9882 9883 9884 9885 9886 9887 9888 9889 9890 9891 9892 9893 9894 9895 9896 9897 9898 9899 9900 9901 9902 9903 9904 9905 9906 9907 9908 9909 9910 9911 9912 9913 9914 9915 9916 9917 9918 9919 9920 9921 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9954 9955 9956 9957 9958 9959 9960 9961 9962 9963 9964 9965 9966 9967 9968 9969 9970 9971 9972 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 10012 10013 10014 10015 10016 10017 10018 10019 10020 10021 10022 10023 10024 10025 10026 10027 10028 10029 10030 10031 10032 10033 10034 10035 10036 10037 10038 10039 10040 10041 10042 10043 10044 10045 10046 10047 10048 10049 10050 10051 10052 10053 10054 10055 10056 10057 10058 10059 10060 10061 10062 10063 10064 10065 10066 10067 10068 10069 10070 10071 10072 10073 10074 10075 10076 10077 10078 10079 10080 10081 10082 10083 10084 10085 10086 10087 10088 10089 10090 10091 10092 10093 10094 10095 10096 10097 10098 10099 10100 10101 10102 10103 10104 10105 10106 10107 10108 10109 10110 10111 10112 10113 10114 10115 10116 10117 10118 10119 10120 10121 10122 10123 10124 10125 10126 10127 10128 10129 10130 10131 10132 10133 10134 10135 10136 10137 10138 10139 10140 10141 10142 10143 10144 10145 10146 10147 10148 10149 10150 10151 10152 10153 10154 10155 10156 10157 10158 10159 10160 10161 10162 10163 10164 10165 10166 10167 10168 10169 10170 10171 10172 10173 10174 10175 10176 10177 10178 10179 10180 10181 10182 10183 10184 10185 10186 10187 10188 10189 10190 10191 10192 10193 10194 10195 10196 10197 10198 10199 10200 10201 10202 10203 10204 10205 10206 10207 10208 10209 10210 10211 10212 10213 10214 10215 10216 10217 10218 10219 10220 10221 10222 10223 10224 10225 10226 10227 10228 10229 10230 10231 10232 10233 10234 10235 10236 10237 10238 10239 10240 10241 10242 10243 10244 10245 10246 10247 10248 10249 10250 10251 10252 10253 10254 10255 10256 10257 10258 10259 10260 10261 10262 10263 10264 10265 10266 10267 10268 10269 10270 10271 10272 10273 10274 10275 10276 10277 10278 10279 10280 10281 10282 10283 10284 10285 10286 10287 10288 10289 10290 10291 10292 10293 10294 10295 10296 10297 10298 10299 10300 10301 10302 10303 10304 10305 10306 10307 10308 10309 10310 10311 10312 10313 10314 10315 10316 10317 10318 10319 10320 10321 10322 10323 10324 10325 10326 10327 10328 10329 10330 10331 10332 10333 10334 10335 10336 10337 10338 10339 10340 10341 10342 10343 10344 10345 10346 10347 10348 10349 10350 10351 10352 10353 10354 10355 10356 10357 10358 10359 10360 10361 10362 10363 10364 10365 10366 10367 10368 10369 10370 10371 10372 10373 10374 10375 10376 10377 10378 10379 10380 10381 10382 10383 10384 10385 10386 10387 10388 10389 10390 10391 10392 10393 10394 10395 10396 10397 10398 10399 10400 10401 10402 10403 10404 10405 10406 10407 10408 10409 10410 10411 10412 10413 10414 10415 10416 10417 10418 10419 10420 10421 10422 10423 10424 10425 10426 10427 10428 10429 10430 10431 10432 10433 10434 10435 10436 10437 10438 10439 10440 10441 10442 10443 10444 10445 10446 10447 10448 10449 10450 10451 10452 10453 10454 10455 10456 10457 10458 10459 10460 10461 10462 10463 10464 10465 10466 10467 10468 10469 10470 10471 10472 10473 10474 10475 10476 10477 10478 10479 10480 10481 10482 10483 10484 10485 10486 10487 10488 10489 10490 10491 10492 10493 10494 10495 10496 10497 10498 10499 10500 10501 10502 10503 10504 10505 10506 10507 10508 10509 10510 10511 10512 10513 10514 10515 10516 10517 10518 10519 10520 10521 10522 10523 10524 10525 10526 10527 10528 10529 10530 10531 10532 10533 10534 10535 10536 10537 10538 10539 10540 10541 10542 10543 10544 10545 10546 10547 10548 10549 10550 10551 10552 10553 10554 10555 10556 10557 10558 10559 10560 10561 10562 10563 10564 10565 10566 10567 10568 10569 10570 10571 10572 10573 10574 10575 10576 10577 10578 10579 10580 10581 10582 10583 10584 10585 10586 10587 10588 10589 10590 10591 10592 10593 10594 10595 10596 10597 10598 10599 10600 10601 10602 10603 10604 10605 10606 10607 10608 10609 10610 10611 10612 10613 10614 10615 10616 10617 10618 10619 10620 10621 10622 10623 10624 10625 10626 10627 10628 10629 10630 10631 10632 10633 10634 10635 10636 10637 10638 10639 10640 10641 10642 10643 10644 10645 10646 10647 10648 10649 10650 10651 10652 10653 10654 10655 10656 10657 10658 10659 10660 10661 10662 10663 10664 10665 10666 10667 10668 10669 10670 10671 10672 10673 10674 10675 10676 10677 10678 10679 10680 10681 10682 10683 10684 10685 10686 10687 10688 10689 10690 10691 10692 10693 10694 10695 10696 10697 10698 10699 10700 10701 10702 10703 10704 10705 10706 10707 10708 10709 10710 10711 10712 10713 10714 10715 10716 10717 10718 10719 10720 10721 10722 10723 10724 10725 10726 10727 10728 10729 10730 10731 10732 10733 10734 10735 10736 10737 10738 10739 10740 10741 10742 10743 10744 10745 10746 10747 10748 10749 10750 10751 10752 10753 10754 10755 10756 10757 10758 10759 10760 10761 10762 10763 10764 10765 10766 10767 10768 10769 10770 10771 10772 10773 10774 10775 10776 10777 10778 10779 10780 10781 10782 10783 10784 10785 10786 10787 10788 10789 10790 10791 10792 10793 10794 10795 10796 10797 10798 10799 10800 10801 10802 10803 10804 10805 10806 10807 10808 10809 10810 10811 10812 10813 10814 10815 10816 10817 10818 10819 10820 10821 10822 10823 10824 10825 10826 10827 10828 10829 10830 10831 10832 10833 10834 10835 10836 10837 10838 10839 10840 10841 10842 10843 10844 10845 10846 10847 10848 10849 10850 10851 10852 10853 10854 10855 10856 10857 10858 10859 10860 10861 10862 10863 10864 10865 10866 10867 10868 10869 10870 10871 10872 10873 10874 10875 10876 10877 10878 10879 10880 10881 10882 10883 10884 10885 10886 10887 10888 10889 10890 10891 10892 10893 10894 10895 10896 10897 10898 10899 10900 10901 10902 10903 10904 10905 10906 10907 10908 10909 10910 10911 10912 10913 10914 10915 10916 10917 10918 10919 10920 10921 10922 10923 10924 10925 10926 10927 10928 10929 10930 10931 10932 10933 10934 10935 10936 10937 10938 10939 10940 10941 10942 10943 10944 10945 10946 10947 10948 10949 10950 10951 10952 10953 10954 10955 10956 10957 10958 10959 10960 10961 10962 10963 10964 10965 10966 10967 10968 10969 10970 10971 10972 10973 10974 10975 10976 10977 10978 10979 10980 10981 10982 10983 10984 10985 10986 10987 10988 10989 10990 10991 10992 10993 10994 10995 10996 10997 10998 10999 11000 11001 11002 11003 11004 11005 11006 11007 11008 11009 11010 11011 11012 11013 11014 11015 11016 11017 11018 11019 11020 11021 11022 11023 11024 11025 11026 11027 11028 11029 11030 11031 11032 11033 11034 11035 11036 11037 11038 11039 11040 11041 11042 11043 11044 11045 11046 11047 11048 11049 11050 11051 11052 11053 11054 11055 11056 11057 11058 11059 11060 11061 11062 11063 11064 11065 11066 11067 11068 11069 11070 11071 11072 11073 11074 11075 11076 11077 11078 11079 11080 11081 11082 11083 11084 11085 11086 11087 11088 11089 11090 11091 11092 11093 11094 11095 11096 11097 11098 11099 11100 11101 11102 11103 11104 11105 11106 11107 11108 11109 11110 11111 11112 11113 11114 11115 11116 11117 11118 11119 11120 11121 11122 11123 11124 11125 11126 11127 11128 11129 11130 11131 11132 11133 11134 11135 11136 11137 11138 11139 11140 11141 11142 11143 11144 11145 11146 11147 11148 11149 11150 11151 11152 11153 11154 11155 11156 11157 11158 11159 11160 11161 11162 11163 11164 11165 11166 11167 11168 11169 11170 11171 11172 11173 11174 11175 11176 11177 11178 11179 11180 11181 11182 11183 11184 11185 11186 11187 11188 11189 11190 11191 11192 11193 11194 11195 11196 11197 11198 11199 11200 11201 11202 11203 11204 11205 11206 11207 11208 11209 11210 11211 11212 11213 11214 11215 11216 11217 11218 11219 11220 11221 11222 11223 11224 11225 11226 11227 11228 11229 11230 11231 11232 11233 11234 11235 11236 11237 11238 11239 11240 11241 11242 11243 11244 11245 11246 11247 11248 11249 11250 11251 11252 11253 11254 11255 11256 11257 11258 11259 11260 11261 11262 11263 11264 11265 11266 11267 11268 11269 11270 11271 11272 11273 11274 11275 11276 11277 11278 11279 11280 11281 11282 11283 11284 11285 11286 11287 11288 11289 11290 11291 11292 11293 11294 11295 11296 11297 11298 11299 11300 11301 11302 11303 11304 11305 11306 11307 11308 11309 11310 11311 11312 11313 11314 11315 11316 11317 11318 11319 11320 11321 11322 11323 11324 11325 11326 11327 11328 11329 11330 11331 11332 11333 11334 11335 11336 11337 11338 11339 11340 11341 11342 11343 11344 11345 11346 11347 11348 11349 11350 11351 11352 11353 11354 11355 11356 11357 11358 11359 11360 11361 11362 11363 11364 11365 11366 11367 11368 11369 11370 11371 11372 11373 11374 11375 11376 11377 11378 11379 11380 11381 11382 11383 11384 11385 11386 11387 11388 11389 11390 11391 11392 11393 11394 11395 11396 11397 11398 11399 11400 11401 11402 11403 11404 11405 11406 11407 11408 11409 11410 11411 11412 11413 11414 11415 11416 11417 11418 11419 11420 11421 11422 11423 11424 11425 11426 11427 11428 11429 11430 11431 11432 11433 11434 11435 11436 11437 11438 11439 11440 11441 11442 11443 11444 11445 11446 11447 11448 11449 11450 11451 11452 11453 11454 11455 11456 11457 11458 11459 11460 11461 11462 11463 11464 11465 11466 11467 11468 11469 11470 11471 11472 11473 11474 11475 11476 11477 11478 11479 11480 11481 11482 11483 11484 11485 11486 11487 11488 11489 11490 11491 11492 11493 11494 11495 11496 11497 11498 11499 11500 11501 11502 11503 11504 11505 11506 11507 11508 11509 11510 11511 11512 11513 11514 11515 11516 11517 11518 11519 11520 11521 11522 11523 11524 11525 11526 11527 11528 11529 11530 11531 11532 11533 11534 11535 11536 11537 11538 11539 11540 11541 11542 11543 11544 11545 11546 11547 11548 11549 11550 11551 11552 11553 11554 11555 11556 11557 11558 11559 11560 11561 11562 11563 11564 11565 11566 11567 11568 11569 11570 11571 11572 11573 11574 11575 11576 11577 11578 11579 11580 11581 11582 11583 11584 11585 11586 11587 11588 11589 11590 11591 11592 11593 11594 11595 11596 11597 11598 11599 11600 11601 11602 11603 11604 11605 11606 11607 11608 11609 11610 11611 11612 11613 11614 11615 11616 11617 11618 11619 11620 11621 11622 11623 11624 11625 11626 11627 11628 11629 11630 11631 11632 11633 11634 11635 11636 11637 11638 11639 11640 11641 11642 11643 11644 11645 11646 11647 11648 11649 11650 11651 11652 11653 11654 11655 11656 11657 11658 11659 11660 11661 11662 11663 11664 11665 11666 11667 11668 11669 11670 11671 11672 11673 11674 11675 11676 11677 11678 11679 11680 11681 11682 11683 11684 11685 11686 11687 11688 11689 11690 11691 11692 11693 11694 11695 11696 11697 11698 11699 11700 11701 11702 11703 11704 11705 11706 11707 11708 11709 11710 11711 11712 11713 11714 11715 11716 11717 11718 11719 11720 11721 11722 11723 11724 11725 11726 11727 11728 11729 11730 11731 11732 11733 11734 11735 11736 11737 11738 11739 11740 11741 11742 11743 11744 11745 11746 11747 11748 11749 11750 11751 11752 11753 11754 11755 11756 11757 11758 11759 11760 11761 11762 11763 11764 11765 11766 11767 11768 11769 11770 11771 11772 11773 11774 11775 11776 11777 11778 11779 11780 11781 11782 11783 11784 11785 11786 11787 11788 11789 11790 11791 11792 11793 11794 11795 11796 11797 11798 11799 11800 11801 11802 11803 11804 11805 11806 11807 11808 11809 11810 11811 11812 11813 11814 11815 11816 11817 11818 11819 11820 11821 11822 11823 11824 11825 11826 11827 11828 11829 11830 11831 11832 11833 11834 11835 11836 11837 11838 11839 11840 11841 11842 11843 11844 11845 11846 11847 11848 11849 11850 11851 11852 11853 11854 11855 11856 11857 11858 11859 11860 11861 11862 11863 11864 11865 11866 11867 11868 11869 11870 11871 11872 11873 11874 11875 11876 11877 11878 11879 11880 11881 11882 11883 11884 11885 11886 11887 11888 11889 11890 11891 11892 11893 11894 11895 11896 11897 11898 11899 11900 11901 11902 11903 11904 11905 11906 11907 11908 11909 11910 11911 11912 11913 11914 11915 11916 11917 11918 11919 11920 11921 11922 11923 11924 11925 11926 11927 11928 11929 11930 11931 11932 11933 11934 11935 11936 11937 11938 11939 11940 11941 11942 11943 11944 11945 11946 11947 11948 11949 11950 11951 11952 11953 11954 11955 11956 11957 11958 11959 11960 11961 11962 11963 11964 11965 11966 11967 11968 11969 11970 11971 11972 11973 11974 11975 11976 11977 11978 11979 11980 11981 11982 11983 11984 11985 11986 11987 11988 11989 11990 11991 11992 11993 11994 11995 11996 11997 11998 11999 12000 12001 12002 12003 12004 12005 12006 12007 12008 12009 12010 12011 12012 12013 12014 12015 12016 12017 12018 12019 12020 12021 12022 12023 12024 12025 12026 12027 12028 12029 12030 12031 12032 12033 12034 12035 12036 12037 12038 12039 12040 12041 12042 12043 12044 12045 12046 12047 12048 12049 12050 12051 12052 12053 12054 12055 12056 12057 12058 12059 12060 12061 12062 12063 12064 12065 12066 12067 12068 12069 12070 12071 12072 12073 12074 12075 12076 12077 12078 12079 12080 12081 12082 12083 12084 12085 12086 12087 12088 12089 12090 12091 12092 12093 12094 12095 12096 12097 12098 12099 12100 12101 12102 12103 12104 12105 12106 12107 12108 12109 12110 12111 12112 12113 12114 12115 12116 12117 12118 12119 12120 12121 12122 12123 12124 12125 12126 12127 12128 12129 12130 12131 12132 12133 12134 12135 12136 12137 12138 12139 12140 12141 12142 12143 12144 12145 12146 12147 12148 12149 12150 12151 12152 12153 12154 12155 12156 12157 12158 12159 12160 12161 12162 12163 12164 12165 12166 12167 12168 12169 12170 12171 12172 12173 12174 12175 12176 12177 12178 12179 12180 12181 12182 12183 12184 12185 12186 12187 12188 12189 12190 12191 12192 12193 12194 12195 12196 12197 12198 12199 12200 12201 12202 12203 12204 12205 12206 12207 12208 12209 12210 12211 12212 12213 12214 12215 12216 12217 12218 12219 12220 12221 12222 12223 12224 12225 12226 12227 12228 12229 12230 12231 12232 12233 12234 12235 12236 12237 12238 12239 12240 12241 12242 12243 12244 12245 12246 12247 12248 12249 12250 12251 12252 12253 12254 12255 12256 12257 12258 12259 12260 12261 12262 12263 12264 12265 12266 12267 12268 12269 12270 12271 12272 12273 12274 12275 12276 12277 12278 12279 12280 12281 12282 12283 12284 12285 12286 12287 12288 12289 12290 12291 12292 12293 12294 12295 12296 12297 12298 12299 12300 12301 12302 12303 12304 12305 12306 12307 12308 12309 12310 12311 12312 12313 12314 12315 12316 12317 12318 12319 12320 12321 12322 12323 12324 12325 12326 12327 12328 12329 12330 12331 12332 12333 12334 12335 12336 12337 12338 12339 12340 12341 12342 12343 12344 12345 12346 12347 12348 12349 12350 12351 12352 12353 12354 12355 12356 12357 12358 12359 12360 12361 12362 12363 12364 12365 12366 12367 12368 12369 12370 12371 12372 12373 12374 12375 12376 12377 12378 12379 12380 12381 12382 12383 12384 12385 12386 12387 12388 12389 12390 12391 12392 12393 12394 12395 12396 12397 12398 12399 12400 12401 12402 12403 12404 12405 12406 12407 12408 12409 12410 12411 12412 12413 12414 12415 12416 12417 12418 12419 12420 12421 12422 12423 12424 12425 12426 12427 12428 12429 12430 12431 12432 12433 12434 12435 12436 12437 12438 12439 12440 12441 12442 12443 12444 12445 12446 12447 12448 12449 12450 12451 12452 12453 12454 12455 12456 12457 12458 12459 12460 12461 12462 12463 12464 12465 12466 12467 12468 12469 12470 12471 12472 12473 12474 12475 12476 12477 12478 12479 12480 12481 12482 12483 12484 12485 12486 12487 12488 12489 12490 12491 12492 12493 12494 12495 12496 12497 12498 12499 12500 12501 12502 12503 12504 12505 12506 12507 12508 12509 12510 12511 12512 12513 12514 12515 12516 12517 12518 12519 12520 12521 12522 12523 12524 12525 12526 12527 12528 12529 12530 12531 12532 12533 12534 12535 12536 12537 12538 12539 12540 12541 12542 12543 12544 12545 12546 12547 12548 12549 12550 12551 12552 12553 12554 12555 12556 12557 12558 12559 12560 12561 12562 12563 12564 12565 12566 12567 12568 12569 12570 12571 12572 12573 12574 12575 12576 12577 12578 12579 12580 12581 12582 12583 12584 12585 12586 12587 12588 12589 12590 12591 12592 12593 12594 12595 12596 12597 12598 12599 12600 12601 12602 12603 12604 12605 12606 12607 12608 12609 12610 12611 12612 12613 12614 12615 12616 12617 12618 12619 12620 12621 12622 12623 12624 12625 12626 12627 12628 12629 12630 12631 12632 12633 12634 12635 12636 12637 12638 12639 12640 12641 12642 12643 12644 12645 12646 12647 12648 12649 12650 12651 12652 12653 12654 12655 12656 12657 12658 12659 12660 12661 12662 12663 12664 12665 12666 12667 12668 12669 12670 12671 12672 12673 12674 12675 12676 12677 12678 12679 12680 12681 12682 12683 12684 12685 12686 12687 12688 12689 12690 12691 12692 12693 12694 12695 12696 12697 12698 12699 12700 12701 12702 12703 12704 12705 12706 12707 12708 12709 12710 12711 12712 12713 12714 12715 12716 12717 12718 12719 12720 12721 12722 12723 12724 12725 12726 12727 12728 12729 12730 12731 12732 12733 12734 12735 12736 12737 12738 12739 12740 12741 12742 12743 12744 12745 12746 12747 12748 12749 12750 12751 12752 12753 12754 12755 12756 12757 12758 12759 12760 12761 12762 12763 12764 12765 12766 12767 12768 12769 12770 12771 12772 12773 12774 12775 12776 12777 12778 12779 12780 12781 12782 12783 12784 12785 12786 12787 12788 12789 12790 12791 12792 12793 12794 12795 12796 12797 12798 12799 12800 12801 12802 12803 12804 12805 12806 12807 12808 12809 12810 12811 12812 12813 12814 12815 12816 12817 12818 12819 12820 12821 12822 12823 12824 12825 12826 12827 12828 12829 12830 12831 12832 12833 12834 12835 12836 12837 12838 12839 12840 12841 12842 12843 12844 12845 12846 12847 12848 12849 12850 12851 12852 12853 12854 12855 12856 12857 12858 12859 12860 12861 12862 12863 12864 12865 12866 12867 12868 12869 12870 12871 12872 12873 12874 12875 12876 12877 12878 12879 12880 12881 12882 12883 12884 12885 12886 12887 12888 12889 12890 12891 12892 12893 12894 12895 12896 12897 12898 12899 12900 12901 12902 12903 12904 12905 12906 12907 12908 12909 12910 12911 12912 12913 12914 12915 12916 12917 12918 12919 12920 12921 12922 12923 12924 12925 12926 12927 12928 12929 12930 12931 12932 12933 12934 12935 12936 12937 12938 12939 12940 12941 12942 12943 12944 12945 12946 12947 12948 12949 12950 12951 12952 12953 12954 12955 12956 12957 12958 12959 12960 12961 12962 12963 12964 12965 12966 12967 12968 12969 12970 12971 12972 12973 12974 12975 12976 12977 12978 12979 12980 12981 12982 12983 12984 12985 12986 12987 12988 12989 12990 12991 12992 12993 12994 12995 12996 12997 12998 12999 13000 13001 13002 13003 13004 13005 13006 13007 13008 13009 13010 13011 13012 13013 13014 13015 13016 13017 13018 13019 13020 13021 13022 13023 13024 13025 13026 13027 13028 13029 13030 13031 13032 13033 13034 13035 13036 13037 13038 13039 13040 13041 13042 13043 13044 13045 13046 13047 13048 13049 13050 13051 13052 13053 13054 13055 13056 13057 13058 13059 13060 13061 13062 13063 13064 13065 13066 13067 13068 13069 13070 13071 13072 13073 13074 13075 13076 13077 13078 13079 13080 13081 13082 13083 13084 13085 13086 13087 13088 13089 13090 13091 13092 13093 13094 13095 13096 13097 13098 13099 13100 13101 13102 13103 13104 13105 13106 13107 13108 13109 13110 13111 13112 13113 13114 13115 13116 13117 13118 13119 13120 13121 13122 13123 13124 13125 13126 13127 13128 13129 13130 13131 13132 13133 13134 13135 13136 13137 13138 13139 13140 13141 13142 13143 13144 13145 13146 13147 13148 13149 13150 13151 13152 13153 13154 13155 13156 13157 13158 13159 13160 13161 13162 13163 13164 13165 13166 13167 13168 13169 13170 13171 13172 13173 13174 13175 13176 13177 13178 13179 13180 13181 13182 13183 13184 13185 13186 13187 13188 13189 13190 13191 13192 13193 13194 13195 13196 13197 13198 13199 13200 13201 13202 13203 13204 13205 13206 13207 13208 13209 13210 13211 13212 13213 13214 13215 13216 13217 13218 13219 13220 13221 13222 13223 13224 13225 13226 13227 13228 13229 13230 13231 13232 13233 13234 13235 13236 13237 13238 13239 13240 13241 13242 13243 13244 13245 13246 13247 13248 13249 13250 13251 13252 13253 13254 13255 13256 13257 13258 13259 13260 13261 13262 13263 13264 13265 13266 13267 13268 13269 13270 13271 13272 13273 13274 13275 13276 13277 13278 13279 13280 13281 13282 13283 13284 13285 13286 13287 13288 13289 13290 13291 13292 13293 13294 13295 13296 13297 13298 13299 13300 13301 13302 13303 13304 13305 13306 13307 13308 13309 13310 13311 13312 13313 13314 13315 13316 13317 13318 13319 13320 13321 13322 13323 13324 13325 13326 13327 13328 13329 13330 13331 13332 13333 13334 13335 13336 13337 13338 13339 13340 13341 13342 13343 13344 13345 13346 13347 13348 13349 13350 13351 13352 13353 13354 13355 13356 13357 13358 13359 13360 13361 13362 13363 13364 13365 13366 13367 13368 13369 13370 13371 13372 13373 13374 13375 13376 13377 13378 13379 13380 13381 13382 13383 13384 13385 13386 13387 13388 13389 13390 13391 13392 13393 13394 13395 13396 13397 13398 13399 13400 13401 13402 13403 13404 13405 13406 13407 13408 13409 13410 13411 13412 13413 13414 13415 13416 13417 13418 13419 13420 13421 13422 13423 13424 13425 13426 13427 13428 13429 13430 13431 13432 13433 13434 13435 13436 13437 13438 13439 13440 13441 13442 13443 13444 13445 13446 13447 13448 13449 13450 13451 13452 13453 13454 13455 13456 13457 13458 13459 13460 13461 13462 13463 13464 13465 13466 13467 13468 13469 13470 13471 13472 13473 13474 13475 13476 13477 13478 13479 13480 13481 13482 13483 13484 13485 13486 13487 13488 13489 13490 13491 13492 13493 13494 13495 13496 13497 13498 13499 13500 13501 13502 13503 13504 13505 13506 13507 13508 13509 13510 13511 13512 13513 13514 13515 13516 13517 13518 13519 13520 13521 13522 13523 13524 13525 13526 13527 13528 13529 13530 13531 13532 13533 13534 13535 13536 13537 13538 13539 13540 13541 13542 13543 13544 13545 13546 13547 13548 13549 13550 13551 13552 13553 13554 13555 13556 13557 13558 13559 13560 13561 13562 13563 13564 13565 13566 13567 13568 13569 13570 13571 13572 13573 13574 13575 13576 13577 13578 13579 13580 13581 13582 13583 13584 13585 13586 13587 13588 13589 13590 13591 13592 13593 13594 13595 13596 13597 13598 13599 13600 13601 13602 13603 13604 13605 13606 13607 13608 13609 13610 13611 13612 13613 13614 13615 13616 13617 13618 13619 13620 13621 13622 13623 13624 13625 13626 13627 13628 13629 13630 13631 13632 13633 13634 13635 13636 13637 13638 13639 13640 13641 13642 13643 13644 13645 13646 13647 13648 13649 13650 13651 13652 13653 13654 13655 13656 13657 13658 13659 13660 13661 13662 13663 13664 13665 13666 13667 13668 13669 13670 13671 13672 13673 13674 13675 13676 13677 13678 13679 13680 13681 13682 13683 13684 13685 13686 13687 13688 13689 13690 13691 13692 13693 13694 13695 13696 13697 13698 13699 13700 13701 13702 13703 13704 13705 13706 13707 13708 13709 13710 13711 13712 13713 13714 13715 13716 13717 13718 13719 13720 13721 13722 13723 13724 13725 13726 13727 13728 13729 13730 13731 13732 13733 13734 13735 13736 13737 13738 13739 13740 13741 13742 13743 13744 13745 13746 13747 13748 13749 13750 13751 13752 13753 13754 13755 13756 13757 13758 13759 13760 13761 13762 13763 13764 13765 13766 13767 13768 13769 13770 13771 13772 13773 13774 13775 13776 13777 13778 13779 13780 13781 13782 13783 13784 13785 13786 13787 13788 13789 13790 13791 13792 13793 13794 13795 13796 13797 13798 13799 13800 13801 13802 13803 13804 13805 13806 13807 13808 13809 13810 13811 13812 13813 13814 13815 13816 13817 13818 13819 13820 13821 13822 13823 13824 13825 13826 13827 13828 13829 13830 13831 13832 13833 13834 13835 13836 13837 13838 13839 13840 13841 13842 13843 13844 13845 13846 13847 13848 13849 13850 13851 13852 13853 13854 13855 13856 13857 13858 13859 13860 13861 13862 13863 13864 13865 13866 13867 13868 13869 13870 13871 13872 13873 13874 13875 13876 13877 13878 13879 13880 13881 13882 13883 13884 13885 13886 13887 13888 13889 13890 13891 13892 13893 13894 13895 13896 13897 13898 13899 13900 13901 13902 13903 13904 13905 13906 13907 13908 13909 13910 13911 13912 13913 13914 13915 13916 13917 13918 13919 13920 13921 13922 13923 13924 13925 13926 13927 13928 13929 13930 13931 13932 13933 13934 13935 13936 13937 13938 13939 13940 13941 13942 13943 13944 13945 13946 13947 13948 13949 13950 13951 13952 13953 13954 13955 13956 13957 13958 13959 13960 13961 13962 13963 13964 13965 13966 13967 13968 13969 13970 13971 13972 13973 13974 13975 13976 13977 13978 13979 13980 13981 13982 13983 13984 13985 13986 13987 13988 13989 13990 13991 13992 13993 13994 13995 13996 13997 13998 13999 14000 14001 14002 14003 14004 14005 14006 14007 14008 14009 14010 14011 14012 14013 14014 14015 14016 14017 14018 14019 14020 14021 14022 14023 14024 14025 14026 14027 14028 14029 14030 14031 14032 14033 14034 14035 14036 14037 14038 14039 14040 14041 14042 14043 14044 14045 14046 14047 14048 14049 14050 14051 14052 14053 14054 14055 14056 14057 14058 14059 14060 14061 14062 14063 14064 14065 14066 14067 14068 14069 14070 14071 14072 14073 14074 14075 14076 14077 14078 14079 14080 14081 14082 14083 14084 14085 14086 14087 14088 14089 14090 14091 14092 14093 14094 14095 14096 14097 14098 14099 14100 14101 14102 14103 14104 14105 14106 14107 14108 14109 14110 14111 14112 14113 14114 14115 14116 14117 14118 14119 14120 14121 14122 14123 14124 14125 14126 14127 14128 14129 14130 14131 14132 14133 14134 14135 14136 14137 14138 14139 14140 14141 14142 14143 14144 14145 14146 14147 14148 14149 14150 14151 14152 14153 14154 14155 14156 14157 14158 14159 14160 14161 14162 14163 14164 14165 14166 14167 14168 14169 14170 14171 14172 14173 14174 14175 14176 14177 14178 14179 14180 14181 14182 14183 14184 14185 14186 14187 14188 14189 14190 14191 14192 14193 14194 14195 14196 14197 14198 14199 14200 14201 14202 14203 14204 14205 14206 14207 14208 14209 14210 14211 14212 14213 14214 14215 14216 14217 14218 14219 14220 14221 14222 14223 14224 14225 14226 14227 14228 14229 14230 14231 14232 14233 14234 14235 14236 14237 14238 14239 14240 14241 14242 14243 14244 14245 14246 14247 14248 14249 14250 14251 14252 14253 14254 14255 14256 14257 14258 14259 14260 14261 14262 14263 14264 14265 14266 14267 14268 14269 14270 14271 14272 14273 14274 14275 14276 14277 14278 14279 14280 14281 14282 14283 14284 14285 14286 14287 14288 14289 14290 14291 14292 14293 14294 14295 14296 14297 14298 14299 14300 14301 14302 14303 14304 14305 14306 14307 14308 14309 14310 14311 14312 14313 14314 14315 14316 14317 14318 14319 14320 14321 14322 14323 14324 14325 14326 14327 14328 14329 14330 14331 14332 14333 14334 14335 14336 14337 14338 14339 14340 14341 14342 14343 14344 14345 14346 14347 14348 14349 14350 14351 14352 14353 14354 14355 14356 14357 14358 14359 14360 14361 14362 14363 14364 14365 14366 14367 14368 14369 14370 14371 14372 14373 14374 14375 14376 14377 14378 14379 14380 14381 14382 14383 14384 14385 14386 14387 14388 14389 14390 14391 14392 14393 14394 14395 14396 14397 14398 14399 14400 14401 14402 14403 14404 14405 14406 14407 14408 14409 14410 14411 14412 14413 14414 14415 14416 14417 14418 14419 14420 14421 14422 14423 14424 14425 14426 14427 14428 14429 14430 14431 14432 14433 14434 14435 14436 14437 14438 14439 14440 14441 14442 14443 14444 14445 14446 14447 14448 14449 14450 14451 14452 14453 14454 14455 14456 14457 14458 14459 14460 14461 14462 14463 14464 14465 14466 14467 14468 14469 14470 14471 14472 14473 14474 14475 14476 14477 14478 14479 14480 14481 14482 14483 14484 14485 14486 14487 14488 14489 14490 14491 14492 14493 14494 14495 14496 14497 14498 14499 14500 14501 14502 14503 14504 14505 14506 14507 14508 14509 14510 14511 14512 14513 14514 14515 14516 14517 14518 14519 14520 14521 14522 14523 14524 14525 14526 14527 14528 14529 14530 14531 14532 14533 14534 14535 14536 14537 14538 14539 14540 14541 14542 14543 14544 14545 14546 14547 14548 14549 14550 14551 14552 14553 14554 14555 14556 14557 14558 14559 14560 14561 14562 14563 14564 14565 14566 14567 14568 14569 14570 14571 14572 14573 14574 14575 14576 14577 14578 14579 14580 14581 14582 14583 14584 14585 14586 14587 14588 14589 14590 14591 14592 14593 14594 14595 14596 14597 14598 14599 14600 14601 14602 14603 14604 14605 14606 14607 14608 14609 14610 14611 14612 14613 14614 14615 14616 14617 14618 14619 14620 14621 14622 14623 14624 14625 14626 14627 14628 14629 14630 14631 14632 14633 14634 14635 14636 14637 14638 14639 14640 14641 14642 14643 14644 14645 14646 14647 14648 14649 14650 14651 14652 14653 14654 14655 14656 14657 14658 14659 14660 14661 14662 14663 14664 14665 14666 14667 14668 14669 14670 14671 14672 14673 14674 14675 14676 14677 14678 14679 14680 14681 14682 14683 14684 14685 14686 14687 14688 14689 14690 14691 14692 14693 14694 14695 14696 14697 14698 14699 14700 14701 14702 14703 14704 14705 14706 14707 14708 14709 14710 14711 14712 14713 14714 14715 14716 14717 14718 14719 14720 14721 14722 14723 14724 14725 14726 14727 14728 14729 14730 14731 14732 14733 14734 14735 14736 14737 14738 14739 14740 14741 14742 14743 14744 14745 14746 14747 14748 14749 14750 14751 14752 14753 14754 14755 14756 14757 14758 14759 14760 14761 14762 14763 14764 14765 14766 14767 14768 14769 14770 14771 14772 14773 14774 14775 14776 14777 14778 14779 14780 14781 14782 14783 14784 14785 14786 14787 14788 14789 14790 14791 14792 14793 14794 14795 14796 14797 14798 14799 14800 14801 14802 14803 14804 14805 14806 14807 14808 14809 14810 14811 14812 14813 14814 14815 14816 14817 14818 14819 14820 14821 14822 14823 14824 14825 14826 14827 14828 14829 14830 14831 14832 14833 14834 14835 14836 14837 14838 14839 14840 14841 14842 14843 14844 14845 14846 14847 14848 14849 14850 14851 14852 14853 14854 14855 14856 14857 14858 14859 14860 14861 14862 14863 14864 14865 14866 14867 14868 14869 14870 14871 14872 14873 14874 14875 14876 14877 14878 14879 14880 14881 14882 14883 14884 14885 14886 14887 14888 14889 14890 14891 14892 14893 14894 14895 14896 14897 14898 14899 14900 14901 14902 14903 14904 14905 14906 14907 14908 14909 14910 14911 14912 14913 14914 14915 14916 14917 14918 14919 14920 14921 14922 14923 14924 14925 14926 14927 14928 14929 14930 14931 14932 14933 14934 14935 14936 14937 14938 14939 14940 14941 14942 14943 14944 14945 14946 14947 14948 14949 14950 14951 14952 14953 14954 14955 14956 14957 14958 14959 14960 14961 14962 14963 14964 14965 14966 14967 14968 14969 14970 14971 14972 14973 14974 14975 14976 14977 14978 14979 14980 14981 14982 14983 14984 14985 14986 14987 14988 14989 14990 14991 14992 14993 14994 14995 14996 14997 14998 14999 15000 15001 15002 15003 15004 15005 15006 15007 15008 15009 15010 15011 15012 15013 15014 15015 15016 15017 15018 15019 15020 15021 15022 15023 15024 15025 15026 15027 15028 15029 15030 15031 15032 15033 15034 15035 15036 15037 15038 15039 15040 15041 15042 15043 15044 15045 15046 15047 15048 15049 15050 15051 15052 15053 15054 15055 15056 15057 15058 15059 15060 15061 15062 15063 15064 15065 15066 15067 15068 15069 15070 15071 15072 15073 15074 15075 15076 15077 15078 15079 15080 15081 15082 15083 15084 15085 15086 15087 15088 15089 15090 15091 15092 15093 15094 15095 15096 15097 15098 15099 15100 15101 15102 15103 15104 15105 15106 15107 15108 15109 15110 15111 15112 15113 15114 15115 15116 15117 15118 15119 15120 15121 15122 15123 15124 15125 15126 15127 15128 15129 15130 15131 15132 15133 15134 15135 15136 15137 15138 15139 15140 15141 15142 15143 15144 15145 15146 15147 15148 15149 15150 15151 15152 15153 15154 15155 15156 15157 15158 15159 15160 15161 15162 15163 15164 15165 15166 15167 15168 15169 15170 15171 15172 15173 15174 15175 15176 15177 15178 15179 15180 15181 15182 15183 15184 15185 15186 15187 15188 15189 15190 15191 15192 15193 15194 15195 15196 15197 15198 15199 15200 15201 15202 15203 15204 15205 15206 15207 15208 15209 15210 15211 15212 15213 15214 15215 15216 15217 15218 15219 15220 15221 15222 15223 15224 15225 15226 15227 15228 15229 15230 15231 15232 15233 15234 15235 15236 15237 15238 15239 15240 15241 15242 15243 15244 15245 15246 15247 15248 15249 15250 15251 15252 15253 15254 15255 15256 15257 15258 15259 15260 15261 15262 15263 15264 15265 15266 15267 15268 15269 15270 15271 15272 15273 15274 15275 15276 15277 15278 15279 15280 15281 15282 15283 15284 15285 15286 15287 15288 15289 15290 15291 15292 15293 15294 15295 15296 15297 15298 15299 15300 15301 15302 15303 15304 15305 15306 15307 15308 15309 15310 15311 15312 15313 15314 15315 15316 15317 15318 15319 15320 15321 15322 15323 15324 15325 15326 15327 15328 15329 15330 15331 15332 15333 15334 15335 15336 15337 15338 15339 15340 15341 15342 15343 15344 15345 15346 15347 15348 15349 15350 15351 15352 15353 15354 15355 15356 15357 15358 15359 15360 15361 15362 15363 15364 15365 15366 15367 15368 15369 15370 15371 15372 15373 15374 15375 15376 15377 15378 15379 15380 15381 15382 15383 15384 15385 15386 15387 15388 15389 15390 15391 15392 15393 15394 15395 15396 15397 15398 15399 15400 15401 15402 15403 15404 15405 15406 15407 15408 15409 15410 15411 15412 15413 15414 15415 15416 15417 15418 15419 15420 15421 15422 15423 15424 15425 15426 15427 15428 15429 15430 15431 15432 15433 15434 15435 15436 15437 15438 15439 15440 15441 15442 15443 15444 15445 15446 15447 15448 15449 15450 15451 15452 15453 15454 15455 15456 15457 15458 15459 15460 15461 15462 15463 15464 15465 15466 15467 15468 15469 15470 15471 15472 15473 15474 15475 15476 15477 15478 15479 15480 15481 15482 15483 15484 15485 15486 15487 15488 15489 15490 15491 15492 15493 15494 15495 15496 15497 15498 15499 15500 15501 15502 15503 15504 15505 15506 15507 15508 15509 15510 15511 15512 15513 15514 15515 15516 15517 15518 15519 15520 15521 15522 15523 15524 15525 15526 15527 15528 15529 15530 15531 15532 15533 15534 15535 15536 15537 15538 15539 15540 15541 15542 15543 15544 15545 15546 15547 15548 15549 15550 15551 15552 15553 15554 15555 15556 15557 15558 15559 15560 15561 15562 15563 15564 15565 15566 15567 15568 15569 15570 15571 15572 15573 15574 15575 15576 15577 15578 15579 15580 15581 15582 15583 15584 15585 15586 15587 15588 15589 15590 15591 15592 15593 15594 15595 15596 15597 15598 15599 15600 15601 15602 15603 15604 15605 15606 15607 15608 15609 15610 15611 15612 15613 15614 15615 15616 15617 15618 15619 15620 15621 15622 15623 15624 15625 15626 15627 15628 15629 15630 15631 15632 15633 15634 15635 15636 15637 15638 15639 15640 15641 15642 15643 15644 15645 15646 15647 15648 15649 15650 15651 15652 15653 15654 15655 15656 15657 15658 15659 15660 15661 15662 15663 15664 15665 15666 15667 15668 15669 15670 15671 15672 15673 15674 15675 15676 15677 15678 15679 15680 15681 15682 15683 15684 15685 15686 15687 15688 15689 15690 15691 15692 15693 15694 15695 15696 15697 15698 15699 15700 15701 15702 15703 15704 15705 15706 15707 15708 15709 15710 15711 15712 15713 15714 15715 15716 15717 15718 15719 15720 15721 15722 15723 15724 15725 15726 15727 15728 15729 15730 15731 15732 15733 15734 15735 15736 15737 15738 15739 15740 15741 15742 15743 15744 15745 15746 15747 15748 15749 15750 15751 15752 15753 15754 15755 15756 15757 15758 15759 15760 15761 15762 15763 15764 15765 15766 15767 15768 15769 15770 15771 15772 15773 15774 15775 15776 15777 15778 15779 15780 15781 15782 15783 15784 15785 15786 15787 15788 15789 15790 15791 15792 15793 15794 15795 15796 15797 15798 15799 15800 15801 15802 15803 15804 15805 15806 15807 15808 15809 15810 15811 15812 15813 15814 15815 15816 15817 15818 15819 15820 15821 15822 15823 15824 15825 15826 15827 15828 15829 15830 15831 15832 15833 15834 15835 15836 15837 15838 15839 15840 15841 15842 15843 15844 15845 15846 15847 15848 15849 15850 15851 15852 15853 15854 15855 15856 15857 15858 15859 15860 15861 15862 15863 15864 15865 15866 15867 15868 15869 15870 15871 15872 15873 15874 15875 15876 15877 15878 15879 15880 15881 15882 15883 15884 15885 15886 15887 15888 15889 15890 15891 15892 15893 15894 15895 15896 15897 15898 15899 15900 15901 15902 15903 15904 15905 15906 15907 15908 15909 15910 15911 15912 15913 15914 15915 15916 15917 15918 15919 15920 15921 15922 15923 15924 15925 15926 15927 15928 15929 15930 15931 15932 15933 15934 15935 15936 15937 15938 15939 15940 15941 15942 15943 15944 15945 15946 15947 15948 15949 15950 15951 15952 15953 15954 15955 15956 15957 15958 15959 15960 15961 15962 15963 15964 15965 15966 15967 15968 15969 15970 15971 15972 15973 15974 15975 15976 15977 15978 15979 15980 15981 15982 15983 15984 15985 15986 15987 15988 15989 15990 15991 15992 15993 15994 15995 15996 15997 15998 15999 16000 16001 16002 16003 16004 16005 16006 16007 16008 16009 16010 16011 16012 16013 16014 16015 16016 16017 16018 16019 16020 16021 16022 16023 16024 16025 16026 16027 16028 16029 16030 16031 16032 16033 16034 16035 16036 16037 16038 16039 16040 16041 16042 16043 16044 16045 16046 16047 16048 16049 16050 16051 16052 16053 16054 16055 16056 16057 16058 16059 16060 16061 16062 16063 16064 16065 16066 16067 16068 16069 16070 16071 16072 16073 16074 16075 16076 16077 16078 16079 16080 16081 16082 16083 16084 16085 16086 16087 16088 16089 16090 16091 16092 16093 16094 16095 16096 16097 16098 16099 16100 16101 16102 16103 16104 16105 16106 16107 16108 16109 16110 16111 16112 16113 16114 16115 16116 16117 16118 16119 16120 16121 16122 16123 16124 16125 16126 16127 16128 16129 16130 16131 16132 16133 16134 16135 16136 16137 16138 16139 16140 16141 16142 16143 16144 16145 16146 16147 16148 16149 16150 16151 16152 16153 16154 16155 16156 16157 16158 16159 16160 16161 16162 16163 16164 16165 16166 16167 16168 16169 16170 16171 16172 16173 16174 16175 16176 16177 16178 16179 16180 16181 16182 16183 16184 16185 16186 16187 16188 16189 16190 16191 16192 16193 16194 16195 16196 16197 16198 16199 16200 16201 16202 16203 16204 16205 16206 16207 16208 16209 16210 16211 16212 16213 16214 16215 16216 16217 16218 16219 16220 16221 16222 16223 16224 16225 16226 16227 16228 16229 16230 16231 16232 16233 16234 16235 16236 16237 16238 16239 16240 16241 16242 16243 16244 16245 16246 16247 16248 16249 16250 16251 16252 16253 16254 16255 16256 16257 16258 16259 16260 16261 16262 16263 16264 16265 16266 16267 16268 16269 16270 16271 16272 16273 16274 16275 16276 16277 16278 16279 16280 16281 16282 16283 16284 16285 16286 16287 16288 16289 16290 16291 16292 16293 16294 16295 16296 16297 16298 16299 16300 16301 16302 16303 16304 16305 16306 16307 16308 16309 16310 16311 16312 16313 16314 16315 16316 16317 16318 16319 16320 16321 16322 16323 16324 16325 16326 16327 16328 16329 16330 16331 16332 16333 16334 16335 16336 16337 16338 16339 16340 16341 16342 16343 16344 16345 16346 16347 16348 16349 16350 16351 16352 16353 16354 16355 16356 16357 16358 16359 16360 16361 16362 16363 16364 16365 16366 16367 16368 16369 16370 16371 16372 16373 16374 16375 16376 16377 16378 16379 16380 16381 16382 16383 16384 16385 16386 16387 16388 16389 16390 16391 16392 16393 16394 16395 16396 16397 16398 16399 16400 16401 16402 16403 16404 16405 16406 16407 16408 16409 16410 16411 16412 16413 16414 16415 16416 16417 16418 16419 16420 16421 16422 16423 16424 16425 16426 16427 16428 16429 16430 16431 16432 16433 16434 16435 16436 16437 16438 16439 16440 16441 16442 16443 16444 16445 16446 16447 16448 16449 16450 16451 16452 16453 16454 16455 16456 16457 16458 16459 16460 16461 16462 16463 16464 16465 16466 16467 16468 16469 16470 16471 16472 16473 16474 16475 16476 16477 16478 16479 16480 16481 16482 16483 16484 16485 16486 16487 16488 16489 16490 16491 16492 16493 16494 16495 16496 16497 16498 16499 16500 16501 16502 16503 16504 16505 16506 16507 16508 16509 16510 16511 16512 16513 16514 16515 16516 16517 16518 16519 16520 16521 16522 16523 16524 16525 16526 16527 16528 16529 16530 16531 16532 16533 16534 16535 16536 16537 16538 16539 16540 16541 16542 16543 16544 16545 16546 16547 16548 16549 16550 16551 16552 16553 16554 16555 16556 16557 16558 16559 16560 16561 16562 16563 16564 16565 16566 16567 16568 16569 16570 16571 16572 16573 16574 16575 16576 16577 16578 16579 16580 16581 16582 16583 16584 16585 16586 16587 16588 16589 16590 16591 16592 16593 16594 16595 16596 16597 16598 16599 16600 16601 16602 16603 16604 16605 16606 16607 16608 16609 16610 16611 16612 16613 16614 16615 16616 16617 16618 16619 16620 16621 16622 16623 16624 16625 16626 16627 16628 16629 16630 16631 16632 16633 16634 16635 16636 16637 16638 16639 16640 16641 16642 16643 16644 16645 16646 16647 16648 16649 16650 16651 16652 16653 16654 16655 16656 16657 16658 16659 16660 16661 16662 16663 16664 16665 16666 16667 16668 16669 16670 16671 16672 16673 16674 16675 16676 16677 16678 16679 16680 16681 16682 16683 16684 16685 16686 16687 16688 16689 16690 16691 16692 16693 16694 16695 16696 16697 16698 16699 16700 16701 16702 16703 16704 16705 16706 16707 16708 16709 16710 16711 16712 16713 16714 16715 16716 16717 16718 16719 16720 16721 16722 16723 16724 16725 16726 16727 16728 16729 16730 16731 16732 16733 16734 16735 16736 16737 16738 16739 16740 16741 16742 16743 16744 16745 16746 16747 16748 16749 16750 16751 16752 16753 16754 16755 16756 16757 16758 16759 16760 16761 16762 16763 16764 16765 16766 16767 16768 16769 16770 16771 16772 16773 16774 16775 16776 16777 16778 16779 16780 16781 16782 16783 16784 16785 16786 16787 16788 16789 16790 16791 16792 16793 16794 16795 16796 16797 16798 16799 16800 16801 16802 16803 16804 16805 16806 16807 16808 16809 16810 16811 16812 16813 16814 16815 16816 16817 16818 16819 16820 16821 16822 16823 16824 16825 16826 16827 16828 16829 16830 16831 16832 16833 16834 16835 16836 16837 16838 16839 16840 16841 16842 16843 16844 16845 16846 16847 16848 16849 16850 16851 16852 16853 16854 16855 16856 16857 16858 16859 16860 16861 16862 16863 16864 16865 16866 16867 16868 16869 16870 16871 16872 16873 16874 16875 16876 16877 16878 16879 16880 16881 16882 16883 16884 16885 16886 16887 16888 16889 16890 16891 16892 16893 16894 16895 16896 16897 16898 16899 16900 16901 16902 16903 16904 16905 16906 16907 16908 16909 16910 16911 16912 16913 16914 16915 16916 16917 16918 16919 16920 16921 16922 16923 16924 16925 16926 16927 16928 16929 16930 16931 16932 16933 16934 16935 16936 16937 16938 16939 16940 16941 16942 16943 16944 16945 16946 16947 16948 16949 16950 16951 16952 16953 16954 16955 16956 16957 16958 16959 16960 16961 16962 16963 16964 16965 16966 16967 16968 16969 16970 16971 16972 16973 16974 16975 16976 16977 16978 16979 16980 16981 16982 16983 16984 16985 16986 16987 16988 16989 16990 16991 16992 16993 16994 16995 16996 16997 16998 16999 17000 17001 17002 17003 17004 17005 17006 17007 17008 17009 17010 17011 17012 17013 17014 17015 17016 17017 17018 17019 17020 17021 17022 17023 17024 17025 17026 17027 17028 17029 17030 17031 17032 17033 17034 17035 17036 17037 17038 17039 17040 17041 17042 17043 17044 17045 17046 17047 17048 17049 17050 17051 17052 17053 17054 17055 17056 17057 17058 17059 17060 17061 17062 17063 17064 17065 17066 17067 17068 17069 17070 17071 17072 17073 17074 17075 17076 17077 17078 17079 17080 17081 17082 17083 17084 17085 17086 17087 17088 17089 17090 17091 17092 17093 17094 17095 17096 17097 17098 17099 17100 17101 17102 17103 17104 17105 17106 17107 17108 17109 17110 17111 17112 17113 17114 17115 17116 17117 17118 17119 17120 17121 17122 17123 17124 17125 17126 17127 17128 17129 17130 17131 17132 17133 17134 17135 17136 17137 17138 17139 17140 17141 17142 17143 17144 17145 17146 17147 17148 17149 17150 17151 17152 17153 17154 17155 17156 17157 17158 17159 17160 17161 17162 17163 17164 17165 17166 17167 17168 17169 17170 17171 17172 17173 17174 17175 17176 17177 17178 17179 17180 17181 17182 17183 17184 17185 17186 17187 17188 17189 17190 17191 17192 17193 17194 17195 17196 17197 17198 17199 17200 17201 17202 17203 17204 17205 17206 17207 17208 17209 17210 17211 17212 17213 17214 17215 17216 17217 17218 17219 17220 17221 17222 17223 17224 17225 17226 17227 17228 17229 17230 17231 17232 17233 17234 17235 17236 17237 17238 17239 17240 17241 17242 17243 17244 17245 17246 17247 17248 17249 17250 17251 17252 17253 17254 17255 17256 17257 17258 17259 17260 17261 17262 17263 17264 17265 17266 17267 17268 17269 17270 17271 17272 17273 17274 17275 17276 17277 17278 17279 17280 17281 17282 17283 17284 17285 17286 17287 17288 17289 17290 17291 17292 17293 17294 17295 17296 17297 17298 17299 17300 17301 17302 17303 17304 17305 17306 17307 17308 17309 17310 17311 17312 17313 17314 17315 17316 17317 17318 17319 17320 17321 17322 17323 17324 17325 17326 17327 17328 17329 17330 17331 17332 17333 17334 17335 17336 17337 17338 17339 17340 17341 17342 17343 17344 17345 17346 17347 17348 17349 17350 17351 17352 17353 17354 17355 17356 17357 17358 17359 17360 17361 17362 17363 17364 17365 17366 17367 17368 17369 17370 17371 17372 17373 17374 17375 17376 17377 17378 17379 17380 17381 17382 17383 17384 17385 17386 17387 17388 17389 17390 17391 17392 17393 17394 17395 17396 17397 17398 17399 17400 17401 17402 17403 17404 17405 17406 17407 17408 17409 17410 17411 17412 17413 17414 17415 17416 17417 17418 17419 17420 17421 17422 17423 17424 17425 17426 17427 17428 17429 17430 17431 17432 17433 17434 17435 17436 17437 17438 17439 17440 17441 17442 17443 17444 17445 17446 17447 17448 17449 17450 17451 17452 17453 17454 17455 17456 17457 17458 17459 17460 17461 17462 17463 17464 17465 17466 17467 17468 17469 17470 17471 17472 17473 17474 17475 17476 17477 17478 17479 17480 17481 17482 17483 17484 17485 17486 17487 17488 17489 17490 17491 17492 17493 17494 17495 17496 17497 17498 17499 17500 17501 17502 17503 17504 17505 17506 17507 17508 17509 17510 17511 17512 17513 17514 17515 17516 17517 17518 17519 17520 17521 17522 17523 17524 17525 17526 17527 17528 17529 17530 17531 17532 17533 17534 17535 17536 17537 17538 17539 17540 17541 17542 17543 17544 17545 17546 17547 17548 17549 17550 17551 17552 17553 17554 17555 17556 17557 17558 17559 17560 17561 17562 17563 17564 17565 17566 17567 17568 17569 17570 17571 17572 17573 17574 17575 17576 17577 17578 17579 17580 17581 17582 17583 17584 17585 17586 17587 17588 17589 17590 17591 17592 17593 17594 17595 17596 17597 17598 17599 17600 17601 17602 17603 17604 17605 17606 17607 17608 17609 17610 17611 17612 17613 17614 17615 17616 17617 17618 17619 17620 17621 17622 17623 17624 17625 17626 17627 17628 17629 17630 17631 17632 17633 17634 17635 17636 17637 17638 17639 17640 17641 17642 17643 17644 17645 17646 17647 17648 17649 17650 17651 17652 17653 17654 17655 17656 17657 17658 17659 17660 17661 17662 17663 17664 17665 17666 17667 17668 17669 17670 17671 17672 17673 17674 17675 17676 17677 17678 17679 17680 17681 17682 17683 17684 17685 17686 17687 17688 17689 17690 17691 17692 17693 17694 17695 17696 17697 17698 17699 17700 17701 17702 17703 17704 17705 17706 17707 17708 17709 17710 17711 17712 17713 17714 17715 17716 17717 17718 17719 17720 17721 17722 17723 17724 17725 17726 17727 17728 17729 17730 17731 17732 17733 17734 17735 17736 17737 17738 17739 17740 17741 17742 17743 17744 17745 17746 17747 17748 17749 17750 17751 17752 17753 17754 17755 17756 17757 17758 17759 17760 17761 17762 17763 17764 17765 17766 17767 17768 17769 17770 17771 17772 17773 17774 17775 17776 17777 17778 17779 17780 17781 17782 17783 17784 17785 17786 17787 17788 17789 17790 17791 17792 17793 17794 17795 17796 17797 17798 17799 17800 17801 17802 17803 17804 17805 17806 17807 17808 17809 17810 17811 17812 17813 17814 17815 17816 17817 17818 17819 17820 17821 17822 17823 17824 17825 17826 17827 17828 17829 17830 17831 17832 17833 17834 17835 17836 17837 17838 17839 17840 17841 17842 17843 17844 17845 17846 17847 17848 17849 17850 17851 17852 17853 17854 17855 17856 17857 17858 17859 17860 17861 17862 17863 17864 17865 17866 17867 17868 17869 17870 17871 17872 17873 17874 17875 17876 17877 17878 17879 17880 17881 17882 17883 17884 17885 17886 17887 17888 17889 17890 17891 17892 17893 17894 17895 17896 17897 17898 17899 17900 17901 17902 17903 17904 17905 17906 17907 17908 17909 17910 17911 17912 17913 17914 17915 17916 17917 17918 17919 17920 17921 17922 17923 17924 17925 17926 17927 17928 17929 17930 17931 17932 17933 17934 17935 17936 17937 17938 17939 17940 17941 17942 17943 17944 17945 17946 17947 17948 17949 17950 17951 17952 17953 17954 17955 17956 17957 17958 17959 17960 17961 17962 17963 17964 17965 17966 17967 17968 17969 17970 17971 17972 17973 17974 17975 17976 17977 17978 17979 17980 17981 17982 17983 17984 17985 17986 17987 17988 17989 17990 17991 17992 17993 17994 17995 17996 17997 17998 17999 18000 18001 18002 18003 18004 18005 18006 18007 18008 18009 18010 18011 18012 18013 18014 18015 18016 18017 18018 18019 18020 18021 18022 18023 18024 18025 18026 18027 18028 18029 18030 18031 18032 18033 18034 18035 18036 18037 18038 18039 18040 18041 18042 18043 18044 18045 18046 18047 18048 18049 18050 18051 18052 18053 18054 18055 18056 18057 18058 18059 18060 18061 18062 18063 18064 18065 18066 18067 18068 18069 18070 18071 18072 18073 18074 18075 18076 18077 18078 18079 18080 18081 18082 18083 18084 18085 18086 18087 18088 18089 18090 18091 18092 18093 18094 18095 18096 18097 18098 18099 18100 18101 18102 18103 18104 18105 18106 18107 18108 18109 18110 18111 18112 18113 18114 18115 18116 18117 18118 18119 18120 18121 18122 18123 18124 18125 18126 18127 18128 18129 18130 18131 18132 18133 18134 18135 18136 18137 18138 18139 18140 18141 18142 18143 18144 18145 18146 18147 18148 18149 18150 18151 18152 18153 18154 18155 18156 18157 18158 18159 18160 18161 18162 18163 18164 18165 18166 18167 18168 18169 18170 18171 18172 18173 18174 18175 18176 18177 18178 18179 18180 18181 18182 18183 18184 18185 18186 18187 18188 18189 18190 18191 18192 18193 18194 18195 18196 18197 18198 18199 18200 18201 18202 18203 18204 18205 18206 18207 18208 18209 18210 18211 18212 18213 18214 18215 18216 18217 18218 18219 18220 18221 18222 18223 18224 18225 18226 18227 18228 18229 18230 18231 18232 18233 18234 18235 18236 18237 18238 18239 18240 18241 18242 18243 18244 18245 18246 18247 18248 18249 18250 18251 18252 18253 18254 18255 18256 18257 18258 18259 18260 18261 18262 18263 18264 18265 18266 18267 18268 18269 18270 18271 18272 18273 18274 18275 18276 18277 18278 18279 18280 18281 18282 18283 18284 18285 18286 18287 18288 18289 18290 18291 18292 18293 18294 18295 18296 18297 18298 18299 18300 18301 18302 18303 18304 18305 18306 18307 18308 18309 18310 18311 18312 18313 18314 18315 18316 18317 18318 18319 18320 18321 18322 18323 18324 18325 18326 18327 18328 18329 18330 18331 18332 18333 18334 18335 18336 18337 18338 18339 18340 18341 18342 18343 18344 18345 18346 18347 18348 18349 18350 18351 18352 18353 18354 18355 18356 18357 18358 18359 18360 18361 18362 18363 18364 18365 18366 18367 18368 18369 18370 18371 18372 18373 18374 18375 18376 18377 18378 18379 18380 18381 18382 18383 18384 18385 18386 18387 18388 18389 18390 18391 18392 18393 18394 18395 18396 18397 18398 18399 18400 18401 18402 18403 18404 18405 18406 18407 18408 18409 18410 18411 18412 18413 18414 18415 18416 18417 18418 18419 18420 18421 18422 18423 18424 18425 18426 18427 18428 18429 18430 18431 18432 18433 18434 18435 18436 18437 18438 18439 18440 18441 18442 18443 18444 18445 18446 18447 18448 18449 18450 18451 18452 18453 18454 18455 18456 18457 18458 18459 18460 18461 18462 18463 18464 18465 18466 18467 18468 18469 18470 18471 18472 18473 18474 18475 18476 18477 18478 18479 18480 18481 18482 18483 18484 18485 18486 18487 18488 18489 18490 18491 18492 18493 18494 18495 18496 18497 18498 18499 18500 18501 18502 18503 18504 18505 18506 18507 18508 18509 18510 18511 18512 18513 18514 18515 18516 18517 18518 18519 18520 18521 18522 18523 18524 18525 18526 18527 18528 18529 18530 18531 18532 18533 18534 18535 18536 18537 18538 18539 18540 18541 18542 18543 18544 18545 18546 18547 18548 18549 18550 18551 18552 18553 18554 18555 18556 18557 18558 18559 18560 18561 18562 18563 18564 18565 18566 18567 18568 18569 18570 18571 18572 18573 18574 18575 18576 18577 18578 18579 18580 18581 18582 18583 18584 18585 18586 18587 18588 18589 18590 18591 18592 18593 18594 18595 18596 18597 18598 18599 18600 18601 18602 18603 18604 18605 18606 18607 18608 18609 18610 18611 18612 18613 18614 18615 18616 18617 18618 18619 18620 18621 18622 18623 18624 18625 18626 18627 18628 18629 18630 18631 18632 18633 18634 18635 18636 18637 18638 18639 18640 18641 18642 18643 18644 18645 18646 18647 18648 18649 18650 18651 18652 18653 18654 18655 18656 18657 18658 18659 18660 18661 18662 18663 18664 18665 18666 18667 18668 18669 18670 18671 18672 18673 18674 18675 18676 18677 18678 18679 18680 18681 18682 18683 18684 18685 18686 18687 18688 18689 18690 18691 18692 18693 18694 18695 18696 18697 18698 18699 18700 18701 18702 18703 18704 18705 18706 18707 18708 18709 18710 18711 18712 18713 18714 18715 18716 18717 18718 18719 18720 18721 18722 18723 18724 18725 18726 18727 18728 18729 18730 18731 18732 18733 18734 18735 18736 18737 18738 18739 18740 18741 18742 18743 18744 18745 18746 18747 18748 18749 18750 18751 18752 18753 18754 18755 18756 18757 18758 18759 18760 18761 18762 18763 18764 18765 18766 18767 18768 18769 18770 18771 18772 18773 18774 18775 18776 18777 18778 18779 18780 18781 18782 18783 18784 18785 18786 18787 18788 18789 18790 18791 18792 18793 18794 18795 18796 18797 18798 18799 18800 18801 18802 18803 18804 18805 18806 18807 18808 18809 18810 18811 18812 18813 18814 18815 18816 18817 18818 18819 18820 18821 18822 18823 18824 18825 18826 18827 18828 18829 18830 18831 18832 18833 18834 18835 18836 18837 18838 18839 18840 18841 18842 18843 18844 18845 18846 18847 18848 18849 18850 18851 18852 18853 18854 18855 18856 18857 18858 18859 18860 18861 18862 18863 18864 18865 18866 18867 18868 18869 18870 18871 18872 18873 18874 18875 18876 18877 18878 18879 18880 18881 18882 18883 18884 18885 18886 18887 18888 18889 18890 18891 18892 18893 18894 18895 18896 18897 18898 18899 18900 18901 18902 18903 18904 18905 18906 18907 18908 18909 18910 18911 18912 18913 18914 18915 18916 18917 18918 18919 18920 18921 18922 18923 18924 18925 18926 18927 18928 18929 18930 18931 18932 18933 18934 18935 18936 18937 18938 18939 18940 18941 18942 18943 18944 18945 18946 18947 18948 18949 18950 18951 18952 18953 18954 18955 18956 18957 18958 18959 18960 18961 18962 18963 18964 18965 18966 18967 18968 18969 18970 18971 18972 18973 18974 18975 18976 18977 18978 18979 18980 18981 18982 18983 18984 18985 18986 18987 18988 18989 18990 18991 18992 18993 18994 18995 18996 18997 18998 18999 19000 19001 19002 19003 19004 19005 19006 19007 19008 19009 19010 19011 19012 19013 19014 19015 19016 19017 19018 19019 19020 19021 19022 19023 19024 19025 19026 19027 19028 19029 19030 19031 19032 19033 19034 19035 19036 19037 19038 19039 19040 19041 19042 19043 19044 19045 19046 19047 19048 19049 19050 19051 19052 19053 19054 19055 19056 19057 19058 19059 19060 19061 19062 19063 19064 19065 19066 19067 19068 19069 19070 19071 19072 19073 19074 19075 19076 19077 19078 19079 19080 19081 19082 19083 19084 19085 19086 19087 19088 19089 19090 19091 19092 19093 19094 19095 19096 19097 19098 19099 19100 19101 19102 19103 19104 19105 19106 19107 19108 19109 19110 19111 19112 19113 19114 19115 19116 19117 19118 19119 19120 19121 19122 19123 19124 19125 19126 19127 19128 19129 19130 19131 19132 19133 19134 19135 19136 19137 19138 19139 19140 19141 19142 19143 19144 19145 19146 19147 19148 19149 19150 19151 19152 19153 19154 19155 19156 19157 19158 19159 19160 19161 19162 19163 19164 19165 19166 19167 19168 19169 19170 19171 19172 19173 19174 19175 19176 19177 19178 19179 19180 19181 19182 19183 19184 19185 19186 19187 19188 19189 19190 19191 19192 19193 19194 19195 19196 19197 19198 19199 19200 19201 19202 19203 19204 19205 19206 19207 19208 19209 19210 19211 19212 19213 19214 19215 19216 19217 19218 19219 19220 19221 19222 19223 19224 19225 19226 19227 19228 19229 19230 19231 19232 19233 19234 19235 19236 19237 19238 19239 19240 19241 19242 19243 19244 19245 19246 19247 19248 19249 19250 19251 19252 19253 19254 19255 19256 19257 19258 19259 19260 19261 19262 19263 19264 19265 19266 19267 19268 19269 19270 19271 19272 19273 19274 19275 19276 19277 19278 19279 19280 19281 19282 19283 19284 19285 19286 19287 19288 19289 19290 19291 19292 19293 19294 19295 19296 19297 19298 19299 19300 19301 19302 19303 19304 19305 19306 19307 19308 19309 19310 19311 19312 19313 19314 19315 19316 19317 19318 19319 19320 19321 19322 19323 19324 19325 19326 19327 19328 19329 19330 19331 19332 19333 19334 19335 19336 19337 19338 19339 19340 19341 19342 19343 19344 19345 19346 19347 19348 19349 19350 19351 19352 19353 19354 19355 19356 19357 19358 19359 19360 19361 19362 19363 19364 19365 19366 19367 19368 19369 19370 19371 19372 19373 19374 19375 19376 19377 19378 19379 19380 19381 19382 19383 19384 19385 19386 19387 19388 19389 19390 19391 19392 19393 19394 19395 19396 19397 19398 19399 19400 19401 19402 19403 19404 19405 19406 19407 19408 19409 19410 19411 19412 19413 19414 19415 19416 19417 19418 19419 19420 19421 19422 19423 19424 19425 19426 19427 19428 19429 19430 19431 19432 19433 19434 19435 19436 19437 19438 19439 19440 19441 19442 19443 19444 19445 19446 19447 19448 19449 19450 19451 19452 19453 19454 19455 19456 19457 19458 19459 19460 19461 19462 19463 19464 19465 19466 19467 19468 19469 19470 19471 19472 19473 19474 19475 19476 19477 19478 19479 19480 19481 19482 19483 19484 19485 19486 19487 19488 19489 19490 19491 19492 19493 19494 19495 19496 19497 19498 19499 19500 19501 19502 19503 19504 19505 19506 19507 19508 19509 19510 19511 19512 19513 19514 19515 19516 19517 19518 19519 19520 19521 19522 19523 19524 19525 19526 19527 19528 19529 19530 19531 19532 19533 19534 19535 19536 19537 19538 19539 19540 19541 19542 19543 19544 19545 19546 19547 19548 19549 19550 19551 19552 19553 19554 19555 19556 19557 19558 19559 19560 19561 19562 19563 19564 19565 19566 19567 19568 19569 19570 19571 19572 19573 19574 19575 19576 19577 19578 19579 19580 19581 19582 19583 19584 19585 19586 19587 19588 19589 19590 19591 19592 19593 19594 19595 19596 19597 19598 19599 19600 19601 19602 19603 19604 19605 19606 19607 19608 19609 19610 19611 19612 19613 19614 19615 19616 19617 19618 19619 19620 19621 19622 19623 19624 19625 19626 19627 19628 19629 19630 19631 19632 19633 19634 19635 19636 19637 19638 19639 19640 19641 19642 19643 19644 19645 19646 19647 19648 19649 19650 19651 19652 19653 19654 19655 19656 19657 19658 19659 19660 19661 19662 19663 19664 19665 19666 19667 19668 19669 19670 19671 19672 19673 19674 19675 19676 19677 19678 19679 19680 19681 19682 19683 19684 19685 19686 19687 19688 19689 19690 19691 19692 19693 19694 19695 19696 19697 19698 19699 19700 19701 19702 19703 19704 19705 19706 19707 19708 19709 19710 19711 19712 19713 19714 19715 19716 19717 19718 19719 19720 19721 19722 19723 19724 19725 19726 19727 19728 19729 19730 19731 19732 19733 19734 19735 19736 19737 19738 19739 19740 19741 19742 19743 19744 19745 19746 19747 19748 19749 19750 19751 19752 19753 19754 19755 19756 19757 19758 19759 19760 19761 19762 19763 19764 19765 19766 19767 19768 19769 19770 19771 19772 19773 19774 19775 19776 19777 19778 19779 19780 19781 19782 19783 19784 19785 19786 19787 19788 19789 19790 19791 19792 19793 19794 19795 19796 19797 19798 19799 19800 19801 19802 19803 19804 19805 19806 19807 19808 19809 19810 19811 19812 19813 19814 19815 19816 19817 19818 19819 19820 19821 19822 19823 19824 19825 19826 19827 19828 19829 19830 19831 19832 19833 19834 19835 19836 19837 19838 19839 19840 19841 19842 19843 19844 19845 19846 19847 19848 19849 19850 19851 19852 19853 19854 19855 19856 19857 19858 19859 19860 19861 19862 19863 19864 19865 19866 19867 19868 19869 19870 19871 19872 19873 19874 19875 19876 19877 19878 19879 19880 19881 19882 19883 19884 19885 19886 19887 19888 19889 19890 19891 19892 19893 19894 19895 19896 19897 19898 19899 19900 19901 19902 19903 19904 19905 19906 19907 19908 19909 19910 19911 19912 19913 19914 19915 19916 19917 19918 19919 19920 19921 19922 19923 19924 19925 19926 19927 19928 19929 19930 19931 19932 19933 19934 19935 19936 19937 19938 19939 19940 19941 19942 19943 19944 19945 19946 19947 19948 19949 19950 19951 19952 19953 19954 19955 19956 19957 19958 19959 19960 19961 19962 19963 19964 19965 19966 19967 19968 19969 19970 19971 19972 19973 19974 19975 19976 19977 19978 19979 19980 19981 19982 19983 19984 19985 19986 19987 19988 19989 19990 19991 19992 19993 19994 19995 19996 19997 19998 19999 20000 20001 20002 20003 20004 20005 20006 20007 20008 20009 20010 20011 20012 20013 20014 20015 20016 20017 20018 20019 20020 20021 20022 20023 20024 20025 20026 20027 20028 20029 20030 20031 20032 20033 20034 20035 20036 20037 20038 20039 20040 20041 20042 20043 20044 20045 20046 20047 20048 20049 20050 20051 20052 20053 20054 20055 20056 20057 20058 20059 20060 20061 20062 20063 20064 20065 20066 20067 20068 20069 20070 20071 20072 20073 20074 20075 20076 20077 20078 20079 20080 20081 20082 20083 20084 20085 20086 20087 20088 20089 20090 20091 20092 20093 20094 20095 20096 20097 20098 20099 20100 20101 20102 20103 20104 20105 20106 20107 20108 20109 20110 20111 20112 20113 20114 20115 20116 20117 20118 20119 20120 20121 20122 20123 20124 20125 20126 20127 20128 20129 20130 20131 20132 20133 20134 20135 20136 20137 20138 20139 20140 20141 20142 20143 20144 20145 20146 20147 20148 20149 20150 20151 20152 20153 20154 20155 20156 20157 20158 20159 20160 20161 20162 20163 20164 20165 20166 20167 20168 20169 20170 20171 20172 20173 20174 20175 20176 20177 20178 20179 20180 20181 20182 20183 20184 20185 20186 20187 20188 20189 20190 20191 20192 20193 20194 20195 20196 20197 20198 20199 20200 20201 20202 20203 20204 20205 20206 20207 20208 20209 20210 20211 20212 20213 20214 20215 20216 20217 20218 20219 20220 20221 20222 20223 20224 20225 20226 20227 20228 20229 20230 20231 20232 20233 20234 20235 20236 20237 20238 20239 20240 20241 20242 20243 20244 20245 20246 20247 20248 20249 20250 20251 20252 20253 20254 20255 20256 20257 20258 20259 20260 20261 20262 20263 20264 20265 20266 20267 20268 20269 20270 20271 20272 20273 20274 20275 20276 20277 20278 20279 20280 20281 20282 20283 20284 20285 20286 20287 20288 20289 20290 20291 20292 20293 20294 20295 20296 20297 20298 20299 20300 20301 20302 20303 20304 20305 20306 20307 20308 20309 20310 20311 20312 20313 20314 20315 20316 20317 20318 20319 20320 20321 20322 20323 20324 20325 20326 20327 20328 20329 20330 20331 20332 20333 20334 20335 20336 20337 20338 20339 20340 20341 20342 20343 20344 20345 20346 20347 20348 20349 20350 20351 20352 20353 20354 20355 20356 20357 20358 20359 20360 20361 20362 20363 20364 20365 20366 20367 20368 20369 20370 20371 20372 20373 20374 20375 20376 20377 20378 20379 20380 20381 20382 20383 20384 20385 20386 20387 20388 20389 20390 20391 20392 20393 20394 20395 20396 20397 20398 20399 20400 20401 20402 20403 20404 20405 20406 20407 20408 20409 20410 20411 20412 20413 20414 20415 20416 20417 20418 20419 20420 20421 20422 20423 20424 20425 20426 20427 20428 20429 20430 20431 20432 20433 20434 20435 20436 20437 20438 20439 20440 20441 20442 20443 20444 20445 20446 20447 20448 20449 20450 20451 20452 20453 20454 20455 20456 20457 20458 20459 20460 20461 20462 20463 20464 20465 20466 20467 20468 20469 20470 20471 20472 20473 20474 20475 20476 20477 20478 20479 20480 20481 20482 20483 20484 20485 20486 20487 20488 20489 20490 20491 20492 20493 20494 20495 20496 20497 20498 20499 20500 20501 20502 20503 20504 20505 20506 20507 20508 20509 20510 20511 20512 20513 20514 20515 20516 20517 20518 20519 20520 20521 20522 20523 20524 20525 20526 20527 20528 20529 20530 20531 20532 20533 20534 20535 20536 20537 20538 20539 20540 20541 20542 20543 20544 20545 20546 20547 20548 20549 20550 20551 20552 20553 20554 20555 20556 20557 20558 20559 20560 20561 20562 20563 20564 20565 20566 20567 20568 20569 20570 20571 20572 20573 20574 20575 20576 20577 20578 20579 20580 20581 20582 20583 20584 20585 20586 20587 20588 20589 20590 20591 20592 20593 20594 20595 20596 20597 20598 20599 20600 20601 20602 20603 20604 20605 20606 20607 20608 20609 20610 20611 20612 20613 20614 20615 20616 20617 20618 20619 20620 20621 20622 20623 20624 20625 20626 20627 20628 20629 20630 20631 20632 20633 20634 20635 20636 20637 20638 20639 20640 20641 20642 20643 20644 20645 20646 20647 20648 20649 20650 20651 20652 20653 20654 20655 20656 20657 20658 20659 20660 20661 20662 20663 20664 20665 20666 20667 20668 20669 20670 20671 20672 20673 20674 20675 20676 20677 20678 20679 20680 20681 20682 20683 20684 20685 20686 20687 20688 20689 20690 20691 20692 20693 20694 20695 20696 20697 20698 20699 20700 20701 20702 20703 20704 20705 20706 20707 20708 20709 20710 20711 20712 20713 20714 20715 20716 20717 20718 20719 20720 20721 20722 20723 20724 20725 20726 20727 20728 20729 20730 20731 20732 20733 20734 20735 20736 20737 20738 20739 20740 20741 20742 20743 20744 20745 20746 20747 20748 20749 20750 20751 20752 20753 20754 20755 20756 20757 20758 20759 20760 20761 20762 20763 20764 20765 20766 20767 20768 20769 20770 20771 20772 20773 20774 20775 20776 20777 20778 20779 20780 20781 20782 20783 20784 20785 20786 20787 20788 20789 20790 20791 20792 20793 20794 20795 20796 20797 20798 20799 20800 20801 20802 20803 20804 20805 20806 20807 20808 20809 20810 20811 20812 20813 20814 20815 20816 20817 20818 20819 20820 20821 20822 20823 20824 20825 20826 20827 20828 20829 20830 20831 20832 20833 20834 20835 20836 20837 20838 20839 20840 20841 20842 20843 20844 20845 20846 20847 20848 20849 20850 20851 20852 20853 20854 20855 20856 20857 20858 20859 20860 20861 20862 20863 20864 20865 20866 20867 20868 20869 20870 20871 20872 20873 20874 20875 20876 20877 20878 20879 20880 20881 20882 20883 20884 20885 20886 20887 20888 20889 20890 20891 20892 20893 20894 20895 20896 20897 20898 20899 20900 20901 20902 20903 20904 20905 20906 20907 20908 20909 20910 20911 20912 20913 20914 20915 20916 20917 20918 20919 20920 20921 20922 20923 20924 20925 20926 20927 20928 20929 20930 20931 20932 20933 20934 20935 20936 20937 20938 20939 20940 20941 20942 20943 20944 20945 20946 20947 20948 20949 20950 20951 20952 20953 20954 20955 20956 20957 20958 20959 20960 20961 20962 20963 20964 20965 20966 20967 20968 20969 20970 20971 20972 20973 20974 20975 20976 20977 20978 20979 20980 20981 20982 20983 20984 20985 20986 20987 20988 20989 20990 20991 20992 20993 20994 20995 20996 20997 20998 20999 21000 21001 21002 21003 21004 21005 21006 21007 21008 21009 21010 21011 21012 21013 21014 21015 21016 21017 21018 21019 21020 21021 21022 21023 21024 21025 21026 21027 21028 21029 21030 21031 21032 21033 21034 21035 21036 21037 21038 21039 21040 21041 21042 21043 21044 21045 21046 21047 21048 21049 21050 21051 21052 21053 21054 21055 21056 21057 21058 21059 21060 21061 21062 21063 21064 21065 21066 21067 21068 21069 21070 21071 21072 21073 21074 21075 21076 21077 21078 21079 21080 21081 21082 21083 21084 21085 21086 21087 21088 21089 21090 21091 21092 21093 21094 21095 21096 21097 21098 21099 21100 21101 21102 21103 21104 21105 21106 21107 21108 21109 21110 21111 21112 21113 21114 21115 21116 21117 21118 21119 21120 21121 21122 21123 21124 21125 21126 21127 21128 21129 21130 21131 21132 21133 21134 21135 21136 21137 21138 21139 21140 21141 21142 21143 21144 21145 21146 21147 21148 21149 21150 21151 21152 21153 21154 21155 21156 21157 21158 21159 21160 21161 21162 21163 21164 21165 21166 21167 21168 21169 21170 21171 21172 21173 21174 21175 21176 21177 21178 21179 21180 21181 21182 21183 21184 21185 21186 21187 21188 21189 21190 21191 21192 21193 21194 21195 21196 21197 21198 21199 21200 21201 21202 21203 21204 21205 21206 21207 21208 21209 21210 21211 21212 21213 21214 21215 21216 21217 21218 21219 21220 21221 21222 21223 21224 21225 21226 21227 21228 21229 21230 21231 21232 21233 21234 21235 21236 21237 21238 21239 21240 21241 21242 21243 21244 21245 21246 21247 21248 21249 21250 21251 21252 21253 21254 21255 21256 21257 21258 21259 21260 21261 21262 21263 21264 21265 21266 21267 21268 21269 21270 21271 21272 21273 21274 21275 21276 21277 21278 21279 21280 21281 21282 21283 21284 21285 21286 21287 21288 21289 21290 21291 21292 21293 21294 21295 21296 21297 21298 21299 21300 21301 21302 21303 21304 21305 21306 21307 21308 21309 21310 21311 21312 21313 21314 21315 21316 21317 21318 21319 21320 21321 21322 21323 21324 21325 21326 21327 21328 21329 21330 21331 21332 21333 21334 21335 21336 21337 21338 21339 21340 21341 21342 21343 21344 21345 21346 21347 21348 21349 21350 21351 21352 21353 21354 21355 21356 21357 21358 21359 21360 21361 21362 21363 21364 21365 21366 21367 21368 21369 21370 21371 21372 21373 21374 21375 21376 21377 21378 21379 21380 21381 21382 21383 21384 21385 21386 21387 21388 21389 21390 21391 21392 21393 21394 21395 21396 21397 21398 21399 21400 21401 21402 21403 21404 21405 21406 21407 21408 21409 21410 21411 21412 21413 21414 21415 21416 21417 21418 21419 21420 21421 21422 21423 21424 21425 21426 21427 21428 21429 21430 21431 21432 21433 21434 21435 21436 21437 21438 21439 21440 21441 21442 21443 21444 21445 21446 21447 21448 21449 21450 21451 21452 21453 21454 21455 21456 21457 21458 21459 21460 21461 21462 21463 21464 21465 21466 21467 21468 21469 21470 21471 21472 21473 21474 21475 21476 21477 21478 21479 21480 21481 21482 21483 21484 21485 21486 21487 21488 21489 21490 21491 21492 21493 21494 21495 21496 21497 21498 21499 21500 21501 21502 21503 21504 21505 21506 21507 21508 21509 21510 21511 21512 21513 21514 21515 21516 21517 21518 21519 21520 21521 21522 21523 21524 21525 21526 21527 21528 21529 21530 21531 21532 21533 21534 21535 21536 21537 21538 21539 21540 21541 21542 21543 21544 21545 21546 21547 21548 21549 21550 21551 21552 21553 21554 21555 21556 21557 21558 21559 21560 21561 21562 21563 21564 21565 21566 21567 21568 21569 21570 21571 21572 21573 21574 21575 21576 21577 21578 21579 21580 21581 21582 21583 21584 21585 21586 21587 21588 21589 21590 21591 21592 21593 21594 21595 21596 21597 21598 21599 21600 21601 21602 21603 21604 21605 21606 21607 21608 21609 21610 21611 21612 21613 21614 21615 21616 21617 21618 21619 21620 21621 21622 21623 21624 21625 21626 21627 21628 21629 21630 21631 21632 21633 21634 21635 21636 21637 21638 21639 21640 21641 21642 21643 21644 21645 21646 21647 21648 21649 21650 21651 21652 21653 21654 21655 21656 21657 21658 21659 21660 21661 21662 21663 21664 21665 21666 21667 21668 21669 21670 21671 21672 21673 21674 21675 21676 21677 21678 21679 21680 21681 21682 21683 21684 21685 21686 21687 21688 21689 21690 21691 21692 21693 21694 21695 21696 21697 21698 21699 21700 21701 21702 21703 21704 21705 21706 21707 21708 21709 21710 21711 21712 21713 21714 21715 21716 21717 21718 21719 21720 21721 21722 21723 21724 21725 21726 21727 21728 21729 21730 21731 21732 21733 21734 21735 21736 21737 21738 21739 21740 21741 21742 21743 21744 21745 21746 21747 21748 21749 21750 21751 21752 21753 21754 21755 21756 21757 21758 21759 21760 21761 21762 21763 21764 21765 21766 21767 21768 21769 21770 21771 21772 21773 21774 21775 21776 21777 21778 21779 21780 21781 21782 21783 21784 21785 21786 21787 21788 21789 21790 21791 21792 21793 21794 21795 21796 21797 21798 21799 21800 21801 21802 21803 21804 21805 21806 21807 21808 21809 21810 21811 21812 21813 21814 21815 21816 21817 21818 21819 21820 21821 21822 21823 21824 21825 21826 21827 21828 21829 21830 21831 21832 21833 21834 21835 21836 21837 21838 21839 21840 21841 21842 21843 21844 21845 21846 21847 21848 21849 21850 21851 21852 21853 21854 21855 21856 21857 21858 21859 21860 21861 21862 21863 21864 21865 21866 21867 21868 21869 21870 21871 21872 21873 21874 21875 21876 21877 21878 21879 21880 21881 21882 21883 21884 21885 21886 21887 21888 21889 21890 21891 21892 21893 21894 21895 21896 21897 21898 21899 21900 21901 21902 21903 21904 21905 21906 21907 21908 21909 21910 21911 21912 21913 21914 21915 21916 21917 21918 21919 21920 21921 21922 21923 21924 21925 21926 21927 21928 21929 21930 21931 21932 21933 21934 21935 21936 21937 21938 21939 21940 21941 21942 21943 21944 21945 21946 21947 21948 21949 21950 21951 21952 21953 21954 21955 21956 21957 21958 21959 21960 21961 21962 21963 21964 21965 21966 21967 21968 21969 21970 21971 21972 21973 21974 21975 21976 21977 21978 21979 21980 21981 21982 21983 21984 21985 21986 21987 21988 21989 21990 21991 21992 21993 21994 21995 21996 21997 21998 21999 22000 22001 22002 22003 22004 22005 22006 22007 22008 22009 22010 22011 22012 22013 22014 22015 22016 22017 22018 22019 22020 22021 22022 22023 22024 22025 22026 22027 22028 22029 22030 22031 22032 22033 22034 22035 22036 22037 22038 22039 22040 22041 22042 22043 22044 22045 22046 22047 22048 22049 22050 22051 22052 22053 22054 22055 22056 22057 22058 22059 22060 22061 22062 22063 22064 22065 22066 22067 22068 22069 22070 22071 22072 22073 22074 22075 22076 22077 22078 22079 22080 22081 22082 22083 22084 22085 22086 22087 22088 22089 22090 22091 22092 22093 22094 22095 22096 22097 22098 22099 22100 22101 22102 22103 22104 22105 22106 22107 22108 22109 22110 22111 22112 22113 22114 22115 22116 22117 22118 22119 22120 22121 22122 22123 22124 22125 22126 22127 22128 22129 22130 22131 22132 22133 22134 22135 22136 22137 22138 22139 22140 22141 22142 22143 22144 22145 22146 22147 22148 22149 22150 22151 22152 22153 22154 22155 22156 22157 22158 22159 22160 22161 22162 22163 22164 22165 22166 22167 22168 22169 22170 22171 22172 22173 22174 22175 22176 22177 22178 22179 22180 22181 22182 22183 22184 22185 22186 22187 22188 22189 22190 22191 22192 22193 22194 22195 22196 22197 22198 22199 22200 22201 22202 22203 22204 22205 22206 22207 22208 22209 22210 22211 22212 22213 22214 22215 22216 22217 22218 22219 22220 22221 22222 22223 22224 22225 22226 22227 22228 22229 22230 22231 22232 22233 22234 22235 22236 22237 22238 22239 22240 22241 22242 22243 22244 22245 22246 22247 22248 22249 22250 22251 22252 22253 22254 22255 22256 22257 22258 22259 22260 22261 22262 22263 22264 22265 22266 22267 22268 22269 22270 22271 22272 22273 22274 22275 22276 22277 22278 22279 22280 22281 22282 22283 22284 22285 22286 22287 22288 22289 22290 22291 22292 22293 22294 22295 22296 22297 22298 22299 22300 22301 22302 22303 22304 22305 22306 22307 22308 22309 22310 22311 22312 22313 22314 22315 22316 22317 22318 22319 22320 22321 22322 22323 22324 22325 22326 22327 22328 22329 22330 22331 22332 22333 22334 22335 22336 22337 22338 22339 22340 22341 22342 22343 22344 22345 22346 22347 22348 22349 22350 22351 22352 22353 22354 22355 22356 22357 22358 22359 22360 22361 22362 22363 22364 22365 22366 22367 22368 22369 22370 22371 22372 22373 22374 22375 22376 22377 22378 22379 22380 22381 22382 22383 22384 22385 22386 22387 22388 22389 22390 22391 22392 22393 22394 22395 22396 22397 22398 22399 22400 22401 22402 22403 22404 22405 22406 22407 22408 22409 22410 22411 22412 22413 22414 22415 22416 22417 22418 22419 22420 22421 22422 22423 22424 22425 22426 22427 22428 22429 22430 22431 22432 22433 22434 22435 22436 22437 22438 22439 22440 22441 22442 22443 22444 22445 22446 22447 22448 22449 22450 22451 22452 22453 22454 22455 22456 22457 22458 22459 22460 22461 22462 22463 22464 22465 22466 22467 22468 22469 22470 22471 22472 22473 22474 22475 22476 22477 22478 22479 22480 22481 22482 22483 22484 22485 22486 22487 22488 22489 22490 22491 22492 22493 22494 22495 22496 22497 22498 22499 22500 22501 22502 22503 22504 22505 22506 22507 22508 22509 22510 22511 22512 22513 22514 22515 22516 22517 22518 22519 22520 22521 22522 22523 22524 22525 22526 22527 22528 22529 22530 22531 22532 22533 22534 22535 22536 22537 22538 22539 22540 22541 22542 22543 22544 22545 22546 22547 22548 22549 22550 22551 22552 22553 22554 22555 22556 22557 22558 22559 22560 22561 22562 22563 22564 22565 22566 22567 22568 22569 22570 22571 22572 22573 22574 22575 22576 22577 22578 22579 22580 22581 22582 22583 22584 22585 22586 22587 22588 22589 22590 22591 22592 22593 22594 22595 22596 22597 22598 22599 22600 22601 22602 22603 22604 22605 22606 22607 22608 22609 22610 22611 22612 22613 22614 22615 22616 22617 22618 22619 22620 22621 22622 22623 22624 22625 22626 22627 22628 22629 22630 22631 22632 22633 22634 22635 22636 22637 22638 22639 22640 22641 22642 22643 22644 22645 22646 22647 22648 22649 22650 22651 22652 22653 22654 22655 22656 22657 22658 22659 22660 22661 22662 22663 22664 22665 22666 22667 22668 22669 22670 22671 22672 22673 22674 22675 22676 22677 22678 22679 22680 22681 22682 22683 22684 22685 22686 22687 22688 22689 22690 22691 22692 22693 22694 22695 22696 22697 22698 22699 22700 22701 22702 22703 22704 22705 22706 22707 22708 22709 22710 22711 22712 22713 22714 22715 22716 22717 22718 22719 22720 22721 22722 22723 22724 22725 22726 22727 22728 22729 22730 22731 22732 22733 22734 22735 22736 22737 22738 22739 22740 22741 22742 22743 22744 22745 22746 22747 22748 22749 22750 22751 22752 22753 22754 22755 22756 22757 22758 22759 22760 22761 22762 22763 22764 22765 22766 22767 22768 22769 22770 22771 22772 22773 22774 22775 22776 22777 22778 22779 22780 22781 22782 22783 22784 22785 22786 22787 22788 22789 22790 22791 22792 22793 22794 22795 22796 22797 22798 22799 22800 22801 22802 22803 22804 22805 22806 22807 22808 22809 22810 22811 22812 22813 22814 22815 22816 22817 22818 22819 22820 22821 22822 22823 22824 22825 22826 22827 22828 22829 22830 22831 22832 22833 22834 22835 22836 22837 22838 22839 22840 22841 22842 22843 22844 22845 22846 22847 22848 22849 22850 22851 22852 22853 22854 22855 22856 22857 22858 22859 22860 22861 22862 22863 22864 22865 22866 22867 22868 22869 22870 22871 22872 22873 22874 22875 22876 22877 22878 22879 22880 22881 22882 22883 22884 22885 22886 22887 22888 22889 22890 22891 22892 22893 22894 22895 22896 22897 22898 22899 22900 22901 22902 22903 22904 22905 22906 22907 22908 22909 22910 22911 22912 22913 22914 22915 22916 22917 22918 22919 22920 22921 22922 22923 22924 22925 22926 22927 22928 22929 22930 22931 22932 22933 22934 22935 22936 22937 22938 22939 22940 22941 22942 22943 22944 22945 22946 22947 22948 22949 22950 22951 22952 22953 22954 22955 22956 22957 22958 22959 22960 22961 22962 22963 22964 22965 22966 22967 22968 22969 22970 22971 22972 22973 22974 22975 22976 22977 22978 22979 22980 22981 22982 22983 22984 22985 22986 22987 22988 22989 22990 22991 22992 22993 22994 22995 22996 22997 22998 22999 23000 23001 23002 23003 23004 23005 23006 23007 23008 23009 23010 23011 23012 23013 23014 23015 23016 23017 23018 23019 23020 23021 23022 23023 23024 23025 23026 23027 23028 23029 23030 23031 23032 23033 23034 23035 23036 23037 23038 23039 23040 23041 23042 23043 23044 23045 23046 23047 23048 23049 23050 23051 23052 23053 23054 23055 23056 23057 23058 23059 23060 23061 23062 23063 23064 23065 23066 23067 23068 23069 23070 23071 23072 23073 23074 23075 23076 23077 23078 23079 23080 23081 23082 23083 23084 23085 23086 23087 23088 23089 23090 23091 23092 23093 23094 23095 23096 23097 23098 23099 23100 23101 23102 23103 23104 23105 23106 23107 23108 23109 23110 23111 23112 23113 23114 23115 23116 23117 23118 23119 23120 23121 23122 23123 23124 23125 23126 23127 23128 23129 23130 23131 23132 23133 23134 23135 23136 23137 23138 23139 23140 23141 23142 23143 23144 23145 23146 23147 23148 23149 23150 23151 23152 23153 23154 23155 23156 23157 23158 23159 23160 23161 23162 23163 23164 23165 23166 23167 23168 23169 23170 23171 23172 23173 23174 23175 23176 23177 23178 23179 23180 23181 23182 23183 23184 23185 23186 23187 23188 23189 23190 23191 23192 23193 23194 23195 23196 23197 23198 23199 23200 23201 23202 23203 23204 23205 23206 23207 23208 23209 23210 23211 23212 23213 23214 23215 23216 23217 23218 23219 23220 23221 23222 23223 23224 23225 23226 23227 23228 23229 23230 23231 23232 23233 23234 23235 23236 23237 23238 23239 23240 23241 23242 23243 23244 23245 23246 23247 23248 23249 23250 23251 23252 23253 23254 23255 23256 23257 23258 23259 23260 23261 23262 23263 23264 23265 23266 23267 23268 23269 23270 23271 23272 23273 23274 23275 23276 23277 23278 23279 23280 23281 23282 23283 23284 23285 23286 23287 23288 23289 23290 23291 23292 23293 23294 23295 23296 23297 23298 23299 23300 23301 23302 23303 23304 23305 23306 23307 23308 23309 23310 23311 23312 23313 23314 23315 23316 23317 23318 23319 23320 23321 23322 23323 23324 23325 23326 23327 23328 23329 23330 23331 23332 23333 23334 23335 23336 23337 23338 23339 23340 23341 23342 23343 23344 23345 23346 23347 23348 23349 23350 23351 23352 23353 23354 23355 23356 23357 23358 23359 23360 23361 23362 23363 23364 23365 23366 23367 23368 23369 23370 23371 23372 23373 23374 23375 23376 23377 23378 23379 23380 23381 23382 23383 23384 23385 23386 23387 23388 23389 23390 23391 23392 23393 23394 23395 23396 23397 23398 23399 23400 23401 23402 23403 23404 23405 23406 23407 23408 23409 23410 23411 23412 23413 23414 23415 23416 23417 23418 23419 23420 23421 23422 23423 23424 23425 23426 23427 23428 23429 23430 23431 23432 23433 23434 23435 23436 23437 23438 23439 23440 23441 23442 23443 23444 23445 23446 23447 23448 23449 23450 23451 23452 23453 23454 23455 23456 23457 23458 23459 23460 23461 23462 23463 23464 23465 23466 23467 23468 23469 23470 23471 23472 23473 23474 23475 23476 23477 23478 23479 23480 23481 23482 23483 23484 23485 23486 23487 23488 23489 23490 23491 23492 23493 23494 23495 23496 23497 23498 23499 23500 23501 23502 23503 23504 23505 23506 23507 23508 23509 23510 23511 23512 23513 23514 23515 23516 23517 23518 23519 23520 23521 23522 23523 23524 23525 23526 23527 23528 23529 23530 23531 23532 23533 23534 23535 23536 23537 23538 23539 23540 23541 23542 23543 23544 23545 23546 23547 23548 23549 23550 23551 23552 23553 23554 23555 23556 23557 23558 23559 23560 23561 23562 23563 23564 23565 23566 23567 23568 23569 23570 23571 23572 23573 23574 23575 23576 23577 23578 23579 23580 23581 23582 23583 23584 23585 23586 23587 23588 23589 23590 23591 23592 23593 23594 23595 23596 23597 23598 23599 23600 23601 23602 23603 23604 23605 23606 23607 23608 23609 23610 23611 23612 23613 23614 23615 23616 23617 23618 23619 23620 23621 23622 23623 23624 23625 23626 23627 23628 23629 23630 23631 23632 23633 23634 23635 23636 23637 23638 23639 23640 23641 23642 23643 23644 23645 23646 23647 23648 23649 23650 23651 23652 23653 23654 23655 23656 23657 23658 23659 23660 23661 23662 23663 23664 23665 23666 23667 23668 23669 23670 23671 23672 23673 23674 23675 23676 23677 23678 23679 23680 23681 23682 23683 23684 23685 23686 23687 23688 23689 23690 23691 23692 23693 23694 23695 23696 23697 23698 23699 23700 23701 23702 23703 23704 23705 23706 23707 23708 23709 23710 23711 23712 23713 23714 23715 23716 23717 23718 23719 23720 23721 23722 23723 23724 23725 23726 23727 23728 23729 23730 23731 23732 23733 23734 23735 23736 23737 23738 23739 23740 23741 23742 23743 23744 23745 23746 23747 23748 23749 23750 23751 23752 23753 23754 23755 23756 23757 23758 23759 23760 23761 23762 23763 23764 23765 23766 23767 23768 23769 23770 23771 23772 23773 23774 23775 23776 23777 23778 23779 23780 23781 23782 23783 23784 23785 23786 23787 23788 23789 23790 23791 23792 23793 23794 23795 23796 23797 23798 23799 23800 23801 23802 23803 23804 23805 23806 23807 23808 23809 23810 23811 23812 23813 23814 23815 23816 23817 23818 23819 23820 23821 23822 23823 23824 23825 23826 23827 23828 23829 23830 23831 23832 23833 23834 23835 23836 23837 23838 23839 23840 23841 23842 23843 23844 23845 23846 23847 23848 23849 23850 23851 23852 23853 23854 23855 23856 23857 23858 23859 23860 23861 23862 23863 23864 23865 23866 23867 23868 23869 23870 23871 23872 23873 23874 23875 23876 23877 23878 23879 23880 23881 23882 23883 23884 23885 23886 23887 23888 23889 23890 23891 23892 23893 23894 23895 23896 23897 23898 23899 23900 23901 23902 23903 23904 23905 23906 23907 23908 23909 23910 23911 23912 23913 23914 23915 23916 23917 23918 23919 23920 23921 23922 23923 23924 23925 23926 23927 23928 23929 23930 23931 23932 23933 23934 23935 23936 23937 23938 23939 23940 23941 23942 23943 23944 23945 23946 23947 23948 23949 23950 23951 23952 23953 23954 23955 23956 23957 23958 23959 23960 23961 23962 23963 23964 23965 23966 23967 23968 23969 23970 23971 23972 23973 23974 23975 23976 23977 23978 23979 23980 23981 23982 23983 23984 23985 23986 23987 23988 23989 23990 23991 23992 23993 23994 23995 23996 23997 23998 23999 24000 24001 24002 24003 24004 24005 24006 24007 24008 24009 24010 24011 24012 24013 24014 24015 24016 24017 24018 24019 24020 24021 24022 24023 24024 24025 24026 24027 24028 24029 24030 24031 24032 24033 24034 24035 24036 24037 24038 24039 24040 24041 24042 24043 24044 24045 24046 24047 24048 24049 24050 24051 24052 24053 24054 24055 24056 24057 24058 24059 24060 24061 24062 24063 24064 24065 24066 24067 24068 24069 24070 24071 24072 24073 24074 24075 24076 24077 24078 24079 24080 24081 24082 24083 24084 24085 24086 24087 24088 24089 24090 24091 24092 24093 24094 24095 24096 24097 24098 24099 24100 24101 24102 24103 24104 24105 24106 24107 24108 24109 24110 24111 24112 24113 24114 24115 24116 24117 24118 24119 24120 24121 24122 24123 24124 24125 24126 24127 24128 24129 24130 24131 24132 24133 24134 24135 24136 24137 24138 24139 24140 24141 24142 24143 24144 24145 24146 24147 24148 24149 24150 24151 24152 24153 24154 24155 24156 24157 24158 24159 24160 24161 24162 24163 24164 24165 24166 24167 24168 24169 24170 24171 24172 24173 24174 24175 24176 24177 24178 24179 24180 24181 24182 24183 24184 24185 24186 24187 24188 24189 24190 24191 24192 24193 24194 24195 24196 24197 24198 24199 24200 24201 24202 24203 24204 24205 24206 24207 24208 24209 24210 24211 24212 24213 24214 24215 24216 24217 24218 24219 24220 24221 24222 24223 24224 24225 24226 24227 24228 24229 24230 24231 24232 24233 24234 24235 24236 24237 24238 24239 24240 24241 24242 24243 24244 24245 24246 24247 24248 24249 24250 24251 24252 24253 24254 24255 24256 24257 24258 24259 24260 24261 24262 24263 24264 24265 24266 24267 24268 24269 24270 24271 24272 24273 24274 24275 24276 24277 24278 24279 24280 24281 24282 24283 24284 24285 24286 24287 24288 24289 24290 24291 24292 24293 24294 24295 24296 24297 24298 24299 24300 24301 24302 24303 24304 24305 24306 24307 24308 24309 24310 24311 24312 24313 24314 24315 24316 24317 24318 24319 24320 24321 24322 24323 24324 24325 24326 24327 24328 24329 24330 24331 24332 24333 24334 24335 24336 24337 24338 24339 24340 24341 24342 24343 24344 24345 24346 24347 24348 24349 24350 24351 24352 24353 24354 24355 24356 24357 24358 24359 24360 24361 24362 24363 24364 24365 24366 24367 24368 24369 24370 24371 24372 24373 24374 24375 24376 24377 24378 24379 24380 24381 24382 24383 24384 24385 24386 24387 24388 24389 24390 24391 24392 24393 24394 24395 24396 24397 24398 24399 24400 24401 24402 24403 24404 24405 24406 24407 24408 24409 24410 24411 24412 24413 24414 24415 24416 24417 24418 24419 24420 24421 24422 24423 24424 24425 24426 24427 24428 24429 24430 24431 24432 24433 24434 24435 24436 24437 24438 24439 24440 24441 24442 24443 24444 24445 24446 24447 24448 24449 24450 24451 24452 24453 24454 24455 24456 24457 24458 24459 24460 24461 24462 24463 24464 24465 24466 24467 24468 24469 24470 24471 24472 24473 24474 24475 24476 24477 24478 24479 24480 24481 24482 24483 24484 24485 24486 24487 24488 24489 24490 24491 24492 24493 24494 24495 24496 24497 24498 24499 24500 24501 24502 24503 24504 24505 24506 24507 24508 24509 24510 24511 24512 24513 24514 24515 24516 24517 24518 24519 24520 24521 24522 24523 24524 24525 24526 24527 24528 24529 24530 24531 24532 24533 24534 24535 24536 24537 24538 24539 24540 24541 24542 24543 24544 24545 24546 24547 24548 24549 24550 24551 24552 24553 24554 24555 24556 24557 24558 24559 24560 24561 24562 24563 24564 24565 24566 24567 24568 24569 24570 24571 24572 24573 24574 24575 24576 24577 24578 24579 24580 24581 24582 24583 24584 24585 24586 24587 24588 24589 24590 24591 24592 24593 24594 24595 24596 24597 24598 24599 24600 24601 24602 24603 24604 24605 24606 24607 24608 24609 24610 24611 24612 24613 24614 24615 24616 24617 24618 24619 24620 24621 24622 24623 24624 24625 24626 24627 24628 24629 24630 24631 24632 24633 24634 24635 24636 24637 24638 24639 24640 24641 24642 24643 24644 24645 24646 24647 24648 24649 24650 24651 24652 24653 24654 24655 24656 24657 24658 24659 24660 24661 24662 24663 24664 24665 24666 24667 24668 24669 24670 24671 24672 24673 24674 24675 24676 24677 24678 24679 24680 24681 24682 24683 24684 24685 24686 24687 24688 24689 24690 24691 24692 24693 24694 24695 24696 24697 24698 24699 24700 24701 24702 24703 24704 24705 24706 24707 24708 24709 24710 24711 24712 24713 24714 24715 24716 24717 24718 24719 24720 24721 24722 24723 24724 24725 24726 24727 24728 24729 24730 24731 24732 24733 24734 24735 24736 24737 24738 24739 24740 24741 24742 24743 24744 24745 24746 24747 24748 24749 24750 24751 24752 24753 24754 24755 24756 24757 24758 24759 24760 24761 24762 24763 24764 24765 24766 24767 24768 24769 24770 24771 24772 24773 24774 24775 24776 24777 24778 24779 24780 24781 24782 24783 24784 24785 24786 24787 24788 24789 24790 24791 24792 24793 24794 24795 24796 24797 24798 24799 24800 24801 24802 24803 24804 24805 24806 24807 24808 24809 24810 24811 24812 24813 24814 24815 24816 24817 24818 24819 24820 24821 24822 24823 24824 24825 24826 24827 24828 24829 24830 24831 24832 24833 24834 24835 24836 24837 24838 24839 24840 24841 24842 24843 24844 24845 24846 24847 24848 24849 24850 24851 24852 24853 24854 24855 24856 24857 24858 24859 24860 24861 24862 24863 24864 24865 24866 24867 24868 24869 24870 24871 24872 24873 24874 24875 24876 24877 24878 24879 24880 24881 24882 24883 24884 24885 24886 24887 24888 24889 24890 24891 24892 24893 24894 24895 24896 24897 24898 24899 24900 24901 24902 24903 24904 24905 24906 24907 24908 24909 24910 24911 24912 24913 24914 24915 24916 24917 24918 24919 24920 24921 24922 24923 24924 24925 24926 24927 24928 24929 24930 24931 24932 24933 24934 24935 24936 24937 24938 24939 24940 24941 24942 24943 24944 24945 24946 24947 24948 24949 24950 24951 24952 24953 24954 24955 24956 24957 24958 24959 24960 24961 24962 24963 24964 24965 24966 24967 24968 24969 24970 24971 24972 24973 24974 24975 24976 24977 24978 24979 24980 24981 24982 24983 24984 24985 24986 24987 24988 24989 24990 24991 24992 24993 24994 24995 24996 24997 24998 24999 25000 25001 25002 25003 25004 25005 25006 25007 25008 25009 25010 25011 25012 25013 25014 25015 25016 25017 25018 25019 25020 25021 25022 25023 25024 25025 25026 25027 25028 25029 25030 25031 25032 25033 25034 25035 25036 25037 25038 25039 25040 25041 25042 25043 25044 25045 25046 25047 25048 25049 25050 25051 25052 25053 25054 25055 25056 25057 25058 25059 25060 25061 25062 25063 25064 25065 25066 25067 25068 25069 25070 25071 25072 25073 25074 25075 25076 25077 25078 25079 25080 25081 25082 25083 25084 25085 25086 25087 25088 25089 25090 25091 25092 25093 25094 25095 25096 25097 25098 25099 25100 25101 25102 25103 25104 25105 25106 25107 25108 25109 25110 25111 25112 25113 25114 25115 25116 25117 25118 25119 25120 25121 25122 25123 25124 25125 25126 25127 25128 25129 25130 25131 25132 25133 25134 25135 25136 25137 25138 25139 25140 25141 25142 25143 25144 25145 25146 25147 25148 25149 25150 25151 25152 25153 25154 25155 25156 25157 25158 25159 25160 25161 25162 25163 25164 25165 25166 25167 25168 25169 25170 25171 25172 25173 25174 25175 25176 25177 25178 25179 25180 25181 25182 25183 25184 25185 25186 25187 25188 25189 25190 25191 25192 25193 25194 25195 25196 25197 25198 25199 25200 25201 25202 25203 25204 25205 25206 25207 25208 25209 25210 25211 25212 25213 25214 25215 25216 25217 25218 25219 25220 25221 25222 25223 25224 25225 25226 25227 25228 25229 25230 25231 25232 25233 25234 25235 25236 25237 25238 25239 25240 25241 25242 25243 25244 25245 25246 25247 25248 25249 25250 25251 25252 25253 25254 25255 25256 25257 25258 25259 25260 25261 25262 25263 25264 25265 25266 25267 25268 25269 25270 25271 25272 25273 25274 25275 25276 25277 25278 25279 25280 25281 25282 25283 25284 25285 25286 25287 25288 25289 25290 25291 25292 25293 25294 25295 25296 25297 25298 25299 25300 25301 25302 25303 25304 25305 25306 25307 25308 25309 25310 25311 25312 25313 25314 25315 25316 25317 25318 25319 25320 25321 25322 25323 25324 25325 25326 25327 25328 25329 25330 25331 25332 25333 25334 25335 25336 25337 25338 25339 25340 25341 25342 25343 25344 25345 25346 25347 25348 25349 25350 25351 25352 25353 25354 25355 25356 25357 25358 25359 25360 25361 25362 25363 25364 25365 25366 25367 25368 25369 25370 25371 25372 25373 25374 25375 25376 25377 25378 25379 25380 25381 25382 25383 25384 25385 25386 25387 25388 25389 25390 25391 25392 25393 25394 25395 25396 25397 25398 25399 25400 25401 25402 25403 25404 25405 25406 25407 25408 25409 25410 25411 25412 25413 25414 25415 25416 25417 25418 25419 25420 25421 25422 25423 25424 25425 25426 25427 25428 25429 25430 25431 25432 25433 25434 25435 25436 25437 25438 25439 25440 25441 25442 25443 25444 25445 25446 25447 25448 25449 25450 25451 25452 25453 25454 25455 25456 25457 25458 25459 25460 25461 25462 25463 25464 25465 25466 25467 25468 25469 25470 25471 25472 25473 25474 25475 25476 25477 25478 25479 25480 25481 25482 25483 25484 25485 25486 25487 25488 25489 25490 25491 25492 25493 25494 25495 25496 25497 25498 25499 25500 25501 25502 25503 25504 25505 25506 25507 25508 25509 25510 25511 25512 25513 25514 25515 25516 25517 25518 25519 25520 25521 25522 25523 25524 25525 25526 25527 25528 25529 25530 25531 25532 25533 25534 25535 25536 25537 25538 25539 25540 25541 25542 25543 25544 25545 25546 25547 25548 25549 25550 25551 25552 25553 25554 25555 25556 25557 25558 25559 25560 25561 25562 25563 25564 25565 25566 25567 25568 25569 25570 25571 25572 25573 25574 25575 25576 25577 25578 25579 25580 25581 25582 25583 25584 25585 25586 25587 25588 25589 25590 25591 25592 25593 25594 25595 25596 25597 25598 25599 25600 25601 25602 25603 25604 25605 25606 25607 25608 25609 25610 25611 25612 25613 25614 25615 25616 25617 25618 25619 25620 25621 25622 25623 25624 25625 25626 25627 25628 25629 25630 25631 25632 25633 25634 25635 25636 25637 25638 25639 25640 25641 25642 25643 25644 25645 25646 25647 25648 25649 25650 25651 25652 25653 25654 25655 25656 25657 25658 25659 25660 25661 25662 25663 25664 25665 25666 25667 25668 25669 25670 25671 25672 25673 25674 25675 25676 25677 25678 25679 25680 25681 25682 25683 25684 25685 25686 25687 25688 25689 25690 25691 25692 25693 25694 25695 25696 25697 25698 25699 25700 25701 25702 25703 25704 25705 25706 25707 25708 25709 25710 25711 25712 25713 25714 25715 25716 25717 25718 25719 25720 25721 25722 25723 25724 25725 25726 25727 25728 25729 25730 25731 25732 25733 25734 25735 25736 25737 25738 25739 25740 25741 25742 25743 25744 25745 25746 25747 25748 25749 25750 25751 25752 25753 25754 25755 25756 25757 25758 25759 25760 25761 25762 25763 25764 25765 25766 25767 25768 25769 25770 25771 25772 25773 25774 25775 25776 25777 25778 25779 25780 25781 25782 25783 25784 25785 25786 25787 25788 25789 25790 25791 25792 25793 25794 25795 25796 25797 25798 25799 25800 25801 25802 25803 25804 25805 25806 25807 25808 25809 25810 25811 25812 25813 25814 25815 25816 25817 25818 25819 25820 25821 25822 25823 25824 25825 25826 25827 25828 25829 25830 25831 25832 25833 25834 25835 25836 25837 25838 25839 25840 25841 25842 25843 25844 25845 25846 25847 25848 25849 25850 25851 25852 25853 25854 25855 25856 25857 25858 25859 25860 25861 25862 25863 25864 25865 25866 25867 25868 25869 25870 25871 25872 25873 25874 25875 25876 25877 25878 25879 25880 25881 25882 25883 25884 25885 25886 25887 25888 25889 25890 25891 25892 25893 25894 25895 25896 25897 25898 25899 25900 25901 25902 25903 25904 25905 25906 25907 25908 25909 25910 25911 25912 25913 25914 25915 25916 25917 25918 25919 25920 25921 25922 25923 25924 25925 25926 25927 25928 25929 25930 25931 25932 25933 25934 25935 25936 25937 25938 25939 25940 25941 25942 25943 25944 25945 25946 25947 25948 25949 25950 25951 25952 25953 25954 25955 25956 25957 25958 25959 25960 25961 25962 25963 25964 25965 25966 25967 25968 25969 25970 25971 25972 25973 25974 25975 25976 25977 25978 25979 25980 25981 25982 25983 25984 25985 25986 25987 25988 25989 25990 25991 25992 25993 25994 25995 25996 25997 25998 25999 26000 26001 26002 26003 26004 26005 26006 26007 26008 26009 26010 26011 26012 26013 26014 26015 26016 26017 26018 26019 26020 26021 26022 26023 26024 26025 26026 26027 26028 26029 26030 26031 26032 26033 26034 26035 26036 26037 26038 26039 26040 26041 26042 26043 26044 26045 26046 26047 26048 26049 26050 26051 26052 26053 26054 26055 26056 26057 26058 26059 26060 26061 26062 26063 26064 26065 26066 26067 26068 26069 26070 26071 26072 26073 26074 26075 26076 26077 26078 26079 26080 26081 26082 26083 26084 26085 26086 26087 26088 26089 26090 26091 26092 26093 26094 26095 26096 26097 26098 26099 26100 26101 26102 26103 26104 26105 26106 26107 26108 26109 26110 26111 26112 26113 26114 26115 26116 26117 26118 26119 26120 26121 26122 26123 26124 26125 26126 26127 26128 26129 26130 26131 26132 26133 26134 26135 26136 26137 26138 26139 26140 26141 26142 26143 26144 26145 26146 26147 26148 26149 26150 26151 26152 26153 26154 26155 26156 26157 26158 26159 26160 26161 26162 26163 26164 26165 26166 26167 26168 26169 26170 26171 26172 26173 26174 26175 26176 26177 26178 26179 26180 26181 26182 26183 26184 26185 26186 26187 26188 26189 26190 26191 26192 26193 26194 26195 26196 26197 26198 26199 26200 26201 26202 26203 26204 26205 26206 26207 26208 26209 26210 26211 26212 26213 26214 26215 26216 26217 26218 26219 26220 26221 26222 26223 26224 26225 26226 26227 26228 26229 26230 26231 26232 26233 26234 26235 26236 26237 26238 26239 26240 26241 26242 26243 26244 26245 26246 26247 26248 26249 26250 26251 26252 26253 26254 26255 26256 26257 26258 26259 26260 26261 26262 26263 26264 26265 26266 26267 26268 26269 26270 26271 26272 26273 26274 26275 26276 26277 26278 26279 26280 26281 26282 26283 26284 26285 26286 26287 26288 26289 26290 26291 26292 26293 26294 26295 26296 26297 26298 26299 26300 26301 26302 26303 26304 26305 26306 26307 26308 26309 26310 26311 26312 26313 26314 26315 26316 26317 26318 26319 26320 26321 26322 26323 26324 26325 26326 26327 26328 26329 26330 26331 26332 26333 26334 26335 26336 26337 26338 26339 26340 26341 26342 26343 26344 26345 26346 26347 26348 26349 26350 26351 26352 26353 26354 26355 26356 26357 26358 26359 26360 26361 26362 26363 26364 26365 26366 26367 26368 26369 26370 26371 26372 26373 26374 26375 26376 26377 26378 26379 26380 26381 26382 26383 26384 26385 26386 26387 26388 26389 26390 26391 26392 26393 26394 26395 26396 26397 26398 26399 26400 26401 26402 26403 26404 26405 26406 26407 26408 26409 26410 26411 26412 26413 26414 26415 26416 26417 26418 26419 26420 26421 26422 26423 26424 26425 26426 26427 26428 26429 26430 26431 26432 26433 26434 26435 26436 26437 26438 26439 26440 26441 26442 26443 26444 26445 26446 26447 26448 26449 26450 26451 26452 26453 26454 26455 26456 26457 26458 26459 26460 26461 26462 26463 26464 26465 26466 26467 26468 26469 26470 26471 26472 26473 26474 26475 26476 26477 26478 26479 26480 26481 26482 26483 26484 26485 26486 26487 26488 26489 26490 26491 26492 26493 26494 26495 26496 26497 26498 26499 26500 26501 26502 26503 26504 26505 26506 26507 26508 26509 26510 26511 26512 26513 26514 26515 26516 26517 26518 26519 26520 26521 26522 26523 26524 26525 26526 26527 26528 26529 26530 26531 26532 26533 26534 26535 26536 26537 26538 26539 26540 26541 26542 26543 26544 26545 26546 26547 26548 26549 26550 26551 26552 26553 26554 26555 26556 26557 26558 26559 26560 26561 26562 26563 26564 26565 26566 26567 26568 26569 26570 26571 26572 26573 26574 26575 26576 26577 26578 26579 26580 26581 26582 26583 26584 26585 26586 26587 26588 26589 26590 26591 26592 26593 26594 26595 26596 26597 26598 26599 26600 26601 26602 26603 26604 26605 26606 26607 26608 26609 26610 26611 26612 26613 26614 26615 26616 26617 26618 26619 26620 26621 26622 26623 26624 26625 26626 26627 26628 26629 26630 26631 26632 26633 26634 26635 26636 26637 26638 26639 26640 26641 26642 26643 26644 26645 26646 26647 26648 26649 26650 26651 26652 26653 26654 26655 26656 26657 26658 26659 26660 26661 26662 26663 26664 26665 26666 26667 26668 26669 26670 26671 26672 26673 26674 26675 26676 26677 26678 26679 26680 26681 26682 26683 26684 26685 26686 26687 26688 26689 26690 26691 26692 26693 26694 26695 26696 26697 26698 26699 26700 26701 26702 26703 26704 26705 26706 26707 26708 26709 26710 26711 26712 26713 26714 26715 26716 26717 26718 26719 26720 26721 26722 26723 26724 26725 26726 26727 26728 26729 26730 26731 26732 26733 26734 26735 26736 26737 26738 26739 26740 26741 26742 26743 26744 26745 26746 26747 26748 26749 26750 26751 26752 26753 26754 26755 26756 26757 26758 26759 26760 26761 26762 26763 26764 26765 26766 26767 26768 26769 26770 26771 26772 26773 26774 26775 26776 26777 26778 26779 26780 26781 26782 26783 26784 26785 26786 26787 26788 26789 26790 26791 26792 26793 26794 26795 26796 26797 26798 26799 26800 26801 26802 26803 26804 26805 26806 26807 26808 26809 26810 26811 26812 26813 26814 26815 26816 26817 26818 26819 26820 26821 26822 26823 26824 26825 26826 26827 26828 26829 26830 26831 26832 26833 26834 26835 26836 26837 26838 26839 26840 26841 26842 26843 26844 26845 26846 26847 26848 26849 26850 26851 26852 26853 26854 26855 26856 26857 26858 26859 26860 26861 26862 26863 26864 26865 26866 26867 26868 26869 26870 26871 26872 26873 26874 26875 26876 26877 26878 26879 26880 26881 26882 26883 26884 26885 26886 26887 26888 26889 26890 26891 26892 26893 26894 26895 26896 26897 26898 26899 26900 26901 26902 26903 26904 26905 26906 26907 26908 26909 26910 26911 26912 26913 26914 26915 26916 26917 26918 26919 26920 26921 26922 26923 26924 26925 26926 26927 26928 26929 26930 26931 26932 26933 26934 26935 26936 26937 26938 26939 26940 26941 26942 26943 26944 26945 26946 26947 26948 26949 26950 26951 26952 26953 26954 26955 26956 26957 26958 26959 26960 26961 26962 26963 26964 26965 26966 26967 26968 26969 26970 26971 26972 26973 26974 26975 26976 26977 26978 26979 26980 26981 26982 26983 26984 26985 26986 26987 26988 26989 26990 26991 26992 26993 26994 26995 26996 26997 26998 26999 27000 27001 27002 27003 27004 27005 27006 27007 27008 27009 27010 27011 27012 27013 27014 27015 27016 27017 27018 27019 27020 27021 27022 27023 27024 27025 27026 27027 27028 27029 27030 27031 27032 27033 27034 27035 27036 27037 27038 27039 27040 27041 27042 27043 27044 27045 27046 27047 27048 27049 27050 27051 27052 27053 27054 27055 27056 27057 27058 27059 27060 27061 27062 27063 27064 27065 27066 27067 27068 27069 27070 27071 27072 27073 27074 27075 27076 27077 27078 27079 27080 27081 27082 27083 27084 27085 27086 27087 27088 27089 27090 27091 27092 27093 27094 27095 27096 27097 27098 27099 27100 27101 27102 27103 27104 27105 27106 27107 27108 27109 27110 27111 27112 27113 27114 27115 27116 27117 27118 27119 27120 27121 27122 27123 27124 27125 27126 27127 27128 27129 27130 27131 27132 27133 27134 27135 27136 27137 27138 27139 27140 27141 27142 27143 27144 27145 27146 27147 27148 27149 27150 27151 27152 27153 27154 27155 27156 27157 27158 27159 27160 27161 27162 27163 27164 27165 27166 27167 27168 27169 27170 27171 27172 27173 27174 27175 27176 27177 27178 27179 27180 27181 27182 27183 27184 27185 27186 27187 27188 27189 27190 27191 27192 27193 27194 27195 27196 27197 27198 27199 27200 27201 27202 27203 27204 27205 27206 27207 27208 27209 27210 27211 27212 27213 27214 27215 27216 27217 27218 27219 27220 27221 27222 27223 27224 27225 27226 27227 27228 27229 27230 27231 27232 27233 27234 27235 27236 27237 27238 27239 27240 27241 27242 27243 27244 27245 27246 27247 27248 27249 27250 27251 27252 27253 27254 27255 27256 27257 27258 27259 27260 27261 27262 27263 27264 27265 27266 27267 27268 27269 27270 27271 27272 27273 27274 27275 27276 27277 27278 27279 27280 27281 27282 27283 27284 27285 27286 27287 27288 27289 27290 27291 27292 27293 27294 27295 27296 27297 27298 27299 27300 27301 27302 27303 27304 27305 27306 27307 27308 27309 27310 27311 27312 27313 27314 27315 27316 27317 27318 27319 27320 27321 27322 27323 27324 27325 27326 27327 27328 27329 27330 27331 27332 27333 27334 27335 27336 27337 27338 27339 27340 27341 27342 27343 27344 27345 27346 27347 27348 27349 27350 27351 27352 27353 27354 27355 27356 27357 27358 27359 27360 27361 27362 27363 27364 27365 27366 27367 27368 27369 27370 27371 27372 27373 27374 27375 27376 27377 27378 27379 27380 27381 27382 27383 27384 27385 27386 27387 27388 27389 27390 27391 27392 27393 27394 27395 27396 27397 27398 27399 27400 27401 27402 27403 27404 27405 27406 27407 27408 27409 27410 27411 27412 27413 27414 27415 27416 27417 27418 27419 27420 27421 27422 27423 27424 27425 27426 27427 27428 27429 27430 27431 27432 27433 27434 27435 27436 27437 27438 27439 27440 27441 27442 27443 27444 27445 27446 27447 27448 27449 27450 27451 27452 27453 27454 27455 27456 27457 27458 27459 27460 27461 27462 27463 27464 27465 27466 27467 27468 27469 27470 27471 27472 27473 27474 27475 27476 27477 27478 27479 27480 27481 27482 27483 27484 27485 27486 27487 27488 27489 27490 27491 27492 27493 27494 27495 27496 27497 27498 27499 27500 27501 27502 27503 27504 27505 27506 27507 27508 27509 27510 27511 27512 27513 27514 27515 27516 27517 27518 27519 27520 27521 27522 27523 27524 27525 27526 27527 27528 27529 27530 27531 27532 27533 27534 27535 27536 27537 27538 27539 27540 27541 27542 27543 27544 27545 27546 27547 27548 27549 27550 27551 27552 27553 27554 27555 27556 27557 27558 27559 27560 27561 27562 27563 27564 27565 27566 27567 27568 27569 27570 27571 27572 27573 27574 27575 27576 27577 27578 27579 27580 27581 27582 27583 27584 27585 27586 27587 27588 27589 27590 27591 27592 27593 27594 27595 27596 27597 27598 27599 27600 27601 27602 27603 27604 27605 27606 27607 27608 27609 27610 27611 27612 27613 27614 27615 27616 27617 27618 27619 27620 27621 27622 27623 27624 27625 27626 27627 27628 27629 27630 27631 27632 27633 27634 27635 27636 27637 27638 27639 27640 27641 27642 27643 27644 27645 27646 27647 27648 27649 27650 27651 27652 27653 27654 27655 27656 27657 27658 27659 27660 27661 27662 27663 27664 27665 27666 27667 27668 27669 27670 27671 27672 27673 27674 27675 27676 27677 27678 27679 27680 27681 27682 27683 27684 27685 27686 27687 27688 27689 27690 27691 27692 27693 27694 27695 27696 27697 27698 27699 27700 27701 27702 27703 27704 27705 27706 27707 27708 27709 27710 27711 27712 27713 27714 27715 27716 27717 27718 27719 27720 27721 27722 27723 27724 27725 27726 27727 27728 27729 27730 27731 27732 27733 27734 27735 27736 27737 27738 27739 27740 27741 27742 27743 27744 27745 27746 27747 27748 27749 27750 27751 27752 27753 27754 27755 27756 27757 27758 27759 27760 27761 27762 27763 27764 27765 27766 27767 27768 27769 27770 27771 27772 27773 27774 27775 27776 27777 27778 27779 27780 27781 27782 27783 27784 27785 27786 27787 27788</face_first_loops>\n\t\t\t<face_loop_counts>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</face_loop_counts>\n\t\t\t<face_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_selection>\n\t\t\t<face_materials>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_materials>\n\t\t\t<loop_first_edges>0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1900 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048 2052 2056 2060 2064 2068 2072 2076 2080 2084 2088 2092 2096 2100 2104 2108 2112 2116 2120 2124 2128 2132 2136 2140 2144 2148 2152 2156 2160 2164 2168 2172 2176 2180 2184 2188 2192 2196 2200 2204 2208 2212 2216 2220 2224 2228 2232 2236 2240 2244 2248 2252 2256 2260 2264 2268 2272 2276 2280 2284 2288 2292 2296 2300 2304 2308 2312 2316 2320 2324 2328 2332 2336 2340 2344 2348 2352 2356 2360 2364 2368 2372 2376 2380 2384 2388 2392 2396 2400 2404 2408 2412 2416 2420 2424 2428 2432 2436 2440 2444 2448 2452 2456 2460 2464 2468 2472 2476 2480 2484 2488 2492 2496 2500 2504 2508 2512 2516 2520 2524 2528 2532 2536 2540 2544 2548 2552 2556 2560 2564 2568 2572 2576 2580 2584 2588 2592 2596 2600 2604 2608 2612 2616 2620 2624 2628 2632 2636 2640 2644 2648 2652 2656 2660 2664 2668 2672 2676 2680 2684 2688 2692 2696 2700 2704 2708 2712 2716 2720 2724 2728 2732 2736 2740 2744 2748 2752 2756 2760 2764 2768 2772 2776 2780 2784 2788 2792 2796 2800 2804 2808 2812 2816 2820 2824 2828 2832 2836 2840 2844 2848 2852 2856 2860 2864 2868 2872 2876 2880 2884 2888 2892 2896 2900 2904 2908 2912 2916 2920 2924 2928 2932 2936 2940 2944 2948 2952 2956 2960 2964 2968 2972 2976 2980 2984 2988 2992 2996 3000 3004 3008 3012 3016 3020 3024 3028 3032 3036 3040 3044 3048 3052 3056 3060 3064 3068 3072 3076 3080 3084 3088 3092 3096 3100 3104 3108 3112 3116 3120 3124 3128 3132 3136 3140 3144 3148 3152 3156 3160 3164 3168 3172 3176 3180 3184 3188 3192 3196 3200 3204 3208 3212 3216 3220 3224 3228 3232 3236 3240 3244 3248 3252 3256 3260 3264 3268 3272 3276 3280 3284 3288 3292 3296 3300 3304 3308 3312 3316 3320 3324 3328 3332 3336 3340 3344 3348 3352 3356 3360 3364 3368 3372 3376 3380 3384 3388 3392 3396 3400 3404 3408 3412 3416 3420 3424 3428 3432 3436 3440 3444 3448 3452 3456 3460 3464 3468 3472 3476 3480 3484 3488 3492 3496 3500 3504 3508 3512 3516 3520 3524 3528 3532 3536 3540 3544 3548 3552 3556 3560 3564 3568 3572 3576 3580 3584 3588 3592 3596 3600 3604 3608 3612 3616 3620 3624 3628 3632 3636 3640 3644 3648 3652 3656 3660 3664 3668 3672 3676 3680 3684 3688 3692 3696 3700 3704 3708 3712 3716 3720 3724 3728 3732 3736 3740 3744 3748 3752 3756 3760 3764 3768 3772 3776 3780 3784 3788 3792 3796 3800 3804 3808 3812 3816 3820 3824 3828 3832 3836 3840 3844 3848 3852 3856 3860 3864 3868 3872 3876 3880 3884 3888 3892 3896 3900 3904 3908 3912 3916 3920 3924 3928 3932 3936 3940 3944 3948 3952 3956 3960 3964 3968 3972 3976 3980 3984 3988 3992 3996 4000 4004 4008 4012 4016 4020 4024 4028 4032 4036 4040 4044 4048 4052 4056 4060 4064 4068 4072 4076 4080 4084 4088 4092 4096 4100 4104 4108 4112 4116 4120 4124 4128 4132 4136 4140 4144 4148 4152 4156 4160 4164 4168 4172 4176 4180 4184 4188 4192 4196 4200 4204 4208 4212 4216 4220 4224 4228 4232 4236 4240 4244 4248 4252 4256 4260 4264 4267 4271 4275 4278 4281 4285 4289 4293 4297 4301 4305 4309 4313 4317 4321 4325 4329 4333 4337 4341 4345 4349 4353 4357 4361 4365 4369 4373 4377 4381 4383 4386 4390 4394 4397 4401 4405 4409 4413 4417 4421 4425 4429 4433 4437 4441 4445 4449 4453 4457 4461 4465 4469 4473 4477 4481 4485 4489 4493 4497 4501 4505 4509 4513 4517 4521 4525 4529 4533 4537 4541 4545 4549 4553 4557 4561 4565 4569 4573 4577 4581 4585 4589 4593 4597 4601 4605 4609 4613 4617 4621 4625 4629 4633 4637 4641 4645 4649 4653 4657 4661 4665 4669 4673 4677 4681 4685 4689 4693 4697 4701 4705 4709 4713 4717 4721 4725 4729 4733 4737 4741 4745 4749 4753 4757 4761 4765 4769 4773 4777 4781 4785 4789 4793 4797 4801 4805 4809 4813 4817 4821 4825 4829 4833 4837 4841 4845 4849 4853 4857 4861 4865 4869 4873 4877 4881 4885 4889 4893 4897 4901 4905 4909 4913 4917 4921 4925 4929 4933 4937 4941 4945 4949 4953 4957 4961 4965 4969 4973 4977 4981 4985 4989 4993 4997 5001 5005 5009 5013 5017 5021 5025 5029 5033 5037 5041 5045 5049 5053 5057 5061 5065 5069 5073 5077 5081 5085 5089 5093 5097 5101 5105 5109 5113 5117 5121 5125 5129 5133 5137 5141 5145 5149 5153 5157 5161 5165 5169 5173 5177 5181 5185 5189 5193 5197 5201 5205 5209 5213 5217 5221 5225 5229 5233 5237 5241 5245 5249 5253 5257 5261 5265 5269 5273 5277 5281 5285 5289 5293 5297 5301 5305 5309 5313 5317 5321 5325 5329 5333 5337 5341 5345 5349 5353 5357 5361 5365 5369 5373 5377 5381 5385 5389 5393 5397 5401 5405 5409 5413 5417 5421 5425 5429 5433 5437 5441 5445 5449 5453 5457 5461 5465 5469 5473 5477 5481 5485 5489 5493 5497 5501 5505 5509 5513 5517 5521 5525 5529 5533 5537 5541 5545 5549 5553 5557 5561 5565 5569 5573 5577 5581 5585 5589 5593 5597 5601 5605 5609 5613 5617 5621 5625 5629 5633 5637 5641 5645 5649 5653 5657 5661 5665 5669 5673 5677 5681 5685 5689 5693 5697 5701 5705 5709 5713 5717 5721 5725 5729 5733 5737 5741 5745 5749 5753 5757 5761 5765 5769 5773 5777 5781 5785 5789 5793 5797 5801 5805 5809 5813 5817 5821 5825 5829 5833 5837 5841 5845 5849 5853 5857 5861 5865 5869 5873 5877 5881 5885 5889 5893 5897 5901 5905 5909 5913 5917 5921 5925 5929 5933 5937 5941 5945 5949 5953 5957 5961 5965 5969 5973 5977 5981 5985 5989 5993 5997 6001 6005 6009 6013 6017 6021 6025 6029 6033 6037 6041 6045 6049 6053 6057 6061 6065 6069 6073 6077 6081 6085 6089 6093 6097 6101 6105 6109 6113 6117 6121 6125 6129 6133 6137 6141 6145 6149 6153 6157 6161 6165 6169 6173 6177 6181 6185 6189 6193 6197 6201 6205 6209 6213 6217 6221 6225 6229 6233 6237 6241 6245 6249 6253 6257 6261 6265 6269 6273 6277 6281 6285 6289 6293 6297 6301 6305 6309 6313 6317 6321 6325 6329 6333 6337 6341 6345 6349 6353 6357 6361 6365 6369 6373 6377 6381 6385 6389 6393 6397 6401 6405 6409 6413 6417 6421 6425 6429 6433 6437 6441 6445 6449 6453 6457 6461 6465 6469 6473 6477 6481 6485 6489 6493 6497 6501 6505 6509 6513 6517 6521 6525 6529 6533 6537 6541 6545 6549 6553 6557 6561 6565 6569 6573 6577 6581 6585 6589 6593 6597 6601 6605 6609 6613 6617 6621 6625 6629 6633 6637 6641 6645 6649 6653 6657 6661 6665 6669 6673 6677 6681 6685 6689 6693 6697 6701 6705 6709 6713 6717 6721 6725 6729 6733 6737 6741 6745 6749 6753 6757 6761 6765 6769 6773 6777 6781 6785 6789 6793 6797 6801 6805 6809 6813 6817 6821 6825 6829 6833 6837 6841 6845 6849 6853 6857 6861 6865 6869 6873 6877 6881 6885 6889 6893 6897 6901 6905 6909 6913 6917 6921 6925 6929 6933 6937 6941 6945 6949 6953 6957 6961 6965 6969 6973 6977 6981 6985 6989 6993 6997 7001 7005 7009 7013 7017 7021 7025 7029 7033 7037 7041 7045 7049 7053 7057 7061 7065 7069 7073 7077 7081 7085 7089 7093 7097 7101 7105 7109 7113 7117 7121 7125 7129 7133 7137 7141 7145 7149 7153 7157 7161 7165 7169 7173 7177 7181 7185 7189 7193 7197 7201 7205 7209 7213 7217 7221 7225 7229 7233 7237 7241 7245 7249 7253 7257 7261 7265 7269 7273 7277 7281 7285 7289 7293 7297 7301 7305 7309 7313 7317 7321 7325 7329 7333 7337 7341 7345 7349 7353 7357 7361 7365 7369 7373 7377 7381 7385 7389 7393 7397 7401 7405 7409 7413 7417 7421 7425 7429 7433 7437 7441 7445 7449 7453 7457 7461 7465 7469 7473 7477 7481 7485 7489 7493 7497 7501 7505 7509 7513 7517 7521 7525 7529 7533 7537 7541 7545 7549 7553 7557 7561 7565 7569 7573 7577 7581 7585 7589 7593 7597 7601 7605 7609 7613 7617 7621 7625 7629 7633 7637 7641 7645 7649 7653 7657 7661 7665 7669 7673 7677 7681 7685 7689 7693 7697 7701 7705 7709 7713 7717 7721 7725 7729 7733 7737 7741 7745 7749 7753 7757 7761 7765 7769 7773 7777 7781 7785 7789 7793 7797 7801 7805 7809 7813 7817 7821 7825 7829 7833 7837 7841 7845 7849 7853 7857 7861 7865 7869 7873 7877 7881 7885 7889 7893 7897 7901 7905 7909 7913 7917 7921 7925 7929 7933 7937 7941 7945 7949 7953 7957 7961 7965 7969 7973 7977 7981 7985 7989 7993 7997 8001 8005 8009 8013 8017 8021 8025 8029 8033 8037 8041 8045 8049 8053 8057 8061 8065 8069 8073 8077 8081 8085 8089 8093 8097 8101 8105 8109 8113 8117 8121 8125 8129 8133 8137 8141 8145 8149 8153 8157 8161 8165 8169 8173 8177 8181 8185 8189 8193 8197 8201 8205 8209 8213 8217 8221 8225 8229 8233 8237 8241 8245 8249 8253 8257 8261 8265 8269 8273 8277 8281 8285 8289 8293 8297 8301 8305 8309 8313 8317 8321 8325 8329 8333 8337 8341 8345 8349 8353 8357 8361 8365 8369 8373 8377 8381 8385 8389 8393 8397 8401 8405 8409 8413 8417 8421 8425 8429 8433 8437 8441 8445 8449 8453 8457 8461 8465 8469 8473 8477 8481 8485 8489 8493 8497 8501 8505 8509 8513 8517 8521 8525 8529 8533 8537 8541 8545 8549 8553 8557 8561 8565 8569 8573 8577 8581 8585 8589 8593 8597 8601 8605 8609 8613 8617 8621 8625 8629 8633 8637 8641 8645 8649 8653 8657 8661 8665 8669 8673 8677 8681 8685 8689 8693 8697 8701 8705 8709 8713 8717 8721 8725 8729 8733 8737 8741 8745 8749 8753 8757 8761 8765 8769 8773 8777 8781 8785 8789 8793 8797 8801 8805 8809 8813 8817 8821 8825 8829 8833 8837 8841 8845 8849 8853 8857 8861 8865 8869 8873 8877 8881 8885 8889 8893 8897 8901 8905 8909 8913 8917 8921 8925 8929 8933 8937 8941 8945 8949 8953 8957 8961 8965 8969 8973 8977 8981 8985 8989 8993 8997 9001 9005 9009 9013 9017 9021 9025 9029 9033 9037 9041 9045 9049 9053 9057 9061 9065 9069 9073 9077 9081 9085 9089 9093 9097 9101 9105 9109 9113 9117 9121 9125 9129 9133 9137 9141 9145 9149 9153 9157 9161 9165 9169 9173 9177 9181 9185 9189 9193 9197 9201 9205 9209 9213 9217 9221 9225 9229 9233 9237 9241 9245 9249 9253 9257 9261 9265 9269 9273 9277 9281 9285 9289 9293 9297 9301 9305 9309 9313 9317 9321 9325 9329 9333 9337 9341 9345 9349 9353 9357 9361 9365 9369 9373 9377 9381 9385 9389 9393 9397 9401 9405 9409 9413 9417 9421 9425 9429 9433 9437 9441 9445 9449 9453 9457 9461 9465 9469 9473 9477 9481 9485 9489 9493 9497 9501 9505 9509 9513 9517 9521 9525 9529 9533 9537 9541 9545 9549 9553 9557 9561 9565 9569 9573 9577 9581 9585 9589 9593 9597 9601 9605 9609 9613 9617 9621 9625 9629 9633 9637 9641 9645 9649 9653 9657 9661 9665 9669 9673 9677 9681 9685 9689 9693 9697 9701 9705 9709 9713 9717 9721 9725 9729 9733 9737 9741 9745 9749 9753 9757 9761 9765 9769 9773 9777 9781 9785 9789 9793 9797 9801 9805 9809 9813 9817 9821 9825 9829 9833 9837 9841 9845 9849 9853 9857 9861 9865 9869 9873 9877 9881 9885 9889 9893 9897 9901 9905 9909 9913 9917 9921 9925 9929 9933 9937 9941 9945 9949 9953 9957 9961 9965 9969 9973 9977 9981 9985 9989 9993 9997 10001 10005 10009 10013 10017 10021 10025 10029 10033 10037 10041 10045 10049 10053 10057 10061 10065 10069 10073 10077 10081 10085 10089 10093 10097 10101 10105 10109 10113 10117 10121 10125 10129 10133 10137 10141 10145 10149 10153 10157 10161 10165 10169 10173 10177 10181 10185 10189 10193 10197 10201 10205 10209 10213 10217 10221 10225 10229 10233 10237 10241 10245 10249 10253 10257 10261 10265 10269 10273 10277 10281 10285 10289 10293 10297 10301 10305 10309 10313 10317 10321 10325 10329 10333 10337 10341 10345 10349 10353 10357 10361 10365 10369 10373 10377 10381 10385 10389 10393 10397 10401 10405 10409 10413 10417 10421 10425 10429 10433 10437 10441 10445 10449 10453 10457 10461 10465 10469 10473 10477 10481 10485 10489 10493 10497 10501 10505 10509 10513 10517 10521 10525 10529 10533 10537 10541 10545 10549 10553 10557 10561 10565 10569 10573 10577 10581 10585 10589 10593 10597 10601 10605 10609 10613 10617 10621 10625 10629 10633 10637 10641 10645 10649 10653 10657 10661 10665 10669 10673 10677 10681 10685 10689 10693 10697 10701 10705 10709 10713 10717 10721 10725 10729 10733 10737 10741 10745 10749 10753 10757 10761 10765 10769 10773 10777 10781 10785 10789 10793 10797 10801 10805 10809 10813 10817 10821 10825 10829 10833 10837 10841 10845 10849 10853 10857 10861 10865 10869 10873 10877 10881 10885 10889 10893 10897 10901 10905 10909 10913 10917 10921 10925 10929 10933 10937 10941 10945 10949 10953 10957 10961 10965 10969 10973 10977 10981 10985 10989 10993 10997 11001 11005 11009 11013 11017 11021 11025 11029 11033 11037 11041 11045 11049 11053 11057 11061 11065 11069 11073 11077 11081 11085 11089 11093 11097 11101 11105 11109 11113 11117 11121 11125 11129 11133 11137 11141 11145 11149 11153 11157 11161 11165 11169 11173 11177 11181 11185 11189 11193 11197 11201 11205 11209 11213 11217 11221 11225 11229 11233 11237 11241 11245 11249 11253 11257 11261 11265 11269 11273 11277 11281 11285 11289 11293 11297 11301 11305 11309 11313 11317 11321 11325 11329 11333 11337 11341 11345 11349 11353 11357 11361 11365 11369 11373 11377 11381 11385 11389 11393 11397 11401 11405 11409 11413 11417 11421 11425 11429 11433 11437 11441 11445 11449 11453 11457 11461 11465 11469 11473 11477 11481 11485 11489 11493 11497 11501 11505 11509 11513 11517 11521 11525 11529 11533 11537 11541 11545 11549 11553 11557 11561 11565 11569 11573 11577 11581 11585 11589 11593 11597 11601 11605 11609 11613 11617 11621 11625 11629 11633 11637 11641 11645 11649 11653 11657 11661 11665 11669 11673 11677 11681 11685 11689 11693 11697 11701 11705 11709 11713 11717 11721 11725 11729 11733 11737 11741 11745 11749 11753 11757 11761 11765 11769 11773 11777 11781 11785 11789 11793 11797 11801 11805 11809 11813 11817 11821 11825 11829 11833 11837 11841 11845 11849 11853 11857 11861 11865 11869 11873 11877 11881 11885 11889 11893 11897 11901 11905 11909 11913 11917 11921 11925 11929 11933 11937 11941 11945 11949 11953 11957 11961 11965 11969 11973 11977 11981 11985 11989 11993 11997 12001 12005 12009 12013 12017 12021 12025 12029 12033 12037 12041 12045 12049 12053 12057 12061 12065 12069 12073 12077 12081 12085 12089 12093 12097 12101 12105 12109 12113 12117 12121 12125 12129 12133 12137 12141 12145 12149 12153 12157 12161 12165 12169 12173 12177 12181 12185 12189 12193 12197 12201 12205 12209 12213 12217 12221 12225 12229 12233 12237 12241 12245 12249 12253 12257 12261 12265 12269 12273 12277 12281 12285 12289 12293 12297 12301 12305 12309 12313 12317 12321 12325 12329 12333 12337 12341 12345 12349 12353 12357 12361 12365 12369 12373 12377 12381 12385 12389 12393 12397 12401 12405 12409 12413 12417 12421 12425 12429 12433 12437 12441 12445 12449 12453 12457 12461 12465 12469 12473 12477 12481 12485 12489 12493 12497 12501 12505 12509 12513 12517 12521 12525 12529 12533 12537 12541 12545 12549 12553 12557 12561 12565 12569 12573 12577 12581 12585 12589 12593 12597 12601 12605 12609 12613 12617 12621 12625 12629 12633 12637 12641 12645 12649 12653 12657 12661 12665 12669 12673 12677 12681 12685 12689 12693 12697 12701 12705 12709 12713 12717 12721 12725 12729 12733 12737 12741 12745 12749 12753 12757 12761 12765 12769 12773 12777 12781 12785 12789 12793 12797 12801 12805 12809 12813 12817 12821 12825 12829 12833 12837 12841 12845 12849 12853 12857 12861 12865 12869 12873 12877 12881 12885 12889 12893 12897 12901 12905 12909 12913 12917 12921 12925 12929 12933 12937 12941 12945 12949 12953 12957 12961 12965 12969 12973 12977 12981 12985 12989 12993 12997 13001 13005 13009 13013 13017 13021 13025 13029 13033 13037 13041 13045 13049 13053 13057 13061 13065 13069 13073 13077 13081 13085 13089 13093 13097 13101 13105 13109 13113 13117 13121 13125 13129 13133 13137 13141 13145 13149 13153 13157 13161 13165 13169 13173 13177 13181 13185 13189 13193 13197 13201 13205 13209 13213 13217 13221 13225 13229 13233 13237 13241 13245 13249 13253 13257 13261 13265 13269 13273 13277 13281 13285 13289 13293 13297 13301 13305 13309 13313 13317 13321 13325 13329 13333 13337 13341 13345 13349 13353 13357 13361 13365 13369 13373 13377 13381 13385 13389 13393 13397 13401 13405 13409 13413 13417 13421 13425 13429 13433 13437 13441 13445 13449 13453 13457 13461 13465 13469 13473 13477 13481 13485 13489 13493 13497 13501 13505 13509 13513 13517 13521 13525 13529 13533 13537 13541 13545 13549 13553 13557 13561 13565 13569 13573 13577 13581 13585 13589 13593 13597 13601 13605 13609 13613 13617 13621 13625 13629 13633 13637 13641 13645 13649 13653 13657 13661 13665 13669 13673 13677 13681 13685 13689 13693 13697 13701 13705 13709 13713 13717 13721 13725 13729 13733 13737 13741 13745 13749 13753 13757 13761 13765 13769 13773 13777 13781 13785 13789 13793 13797 13801 13805 13809 13813 13817 13821 13825 13829 13833 13837 13841 13845 13849 13853 13857 13861 13865 13869 13873 13877 13881 13885 13889 13893 13897 13901 13905 13909 13913 13917 13921 13925 13929 13933 13937 13941 13945 13949 13953 13957 13961 13965 13969 13973 13977 13981 13985 13989 13993 13997 14001 14005 14009 14013 14017 14021 14025 14029 14033 14037 14041 14045 14049 14053 14057 14061 14065 14069 14073 14077 14081 14085 14089 14093 14097 14101 14105 14109 14113 14117 14121 14125 14129 14133 14137 14141 14145 14149 14153 14157 14161 14165 14169 14173 14177 14181 14185 14189 14193 14197 14201 14205 14209 14213 14217 14221 14225 14229 14233 14237 14241 14245 14249 14253 14257 14261 14265 14269 14273 14277 14281 14285 14289 14293 14297 14301 14305 14309 14313 14317 14321 14325 14329 14333 14337 14341 14345 14349 14353 14357 14361 14365 14369 14373 14377 14381 14385 14389 14393 14397 14401 14405 14409 14413 14417 14421 14425 14429 14433 14437 14441 14445 14449 14453 14457 14461 14465 14469 14473 14477 14481 14485 14489 14493 14497 14501 14505 14509 14513 14517 14521 14525 14529 14533 14537 14541 14545 14549 14553 14557 14561 14565 14569 14573 14577 14581 14585 14589 14593 14597 14601 14605 14609 14613 14617 14621 14625 14629 14633 14637 14641 14645 14649 14653 14657 14661 14665 14669 14673 14677 14681 14685 14689 14693 14697 14701 14705 14709 14713 14717 14721 14725 14729 14733 14737 14741 14745 14749 14753 14757 14761 14765 14769 14773 14777 14781 14785 14789 14793 14797 14801 14805 14809 14813 14817 14821 14825 14829 14833 14837 14841 14845 14849 14853 14857 14861 14865 14869 14873 14877 14881 14885 14889 14893 14897 14901 14905 14909 14913 14917 14921 14925 14929 14933 14937 14941 14945 14949 14953 14957 14961 14965 14969 14973 14977 14981 14985 14989 14993 14997 15001 15005 15009 15013 15017 15021 15025 15029 15033 15037 15041 15045 15049 15053 15057 15061 15065 15069 15073 15077 15081 15085 15089 15093 15097 15101 15105 15109 15113 15117 15121 15125 15129 15133 15137 15141 15145 15149 15153 15157 15161 15165 15169 15173 15177 15181 15185 15189 15193 15197 15201 15205 15209 15213 15217 15221 15225 15229 15233 15237 15241 15245 15249 15253 15257 15261 15265 15269 15273 15277 15281 15285 15289 15293 15297 15301 15305 15309 15313 15317 15321 15325 15329 15333 15337 15341 15345 15349 15353 15357 15361 15365 15369 15373 15377 15381 15385 15389 15393 15397 15401 15405 15409 15413 15417 15421 15425 15429 15433 15437 15441 15445 15449 15453 15457 15461 15465 15469 15473 15477 15481 15485 15489 15493 15497 15501 15505 15509 15513 15517 15521 15525 15529 15533 15537 15541 15545 15549 15553 15557 15561 15565 15569 15573 15577 15581 15585 15589 15593 15597 15601 15605 15609 15613 15617 15621 15625 15629 15633 15637 15641 15645 15649 15653 15657 15661 15665 15669 15673 15677 15681 15685 15689 15693 15697 15701 15705 15709 15713 15717 15721 15725 15729 15733 15737 15741 15745 15749 15753 15757 15761 15765 15769 15773 15777 15781 15785 15789 15793 15797 15801 15805 15809 15813 15817 15821 15825 15829 15833 15837 15841 15845 15849 15853 15857 15861 15865 15869 15873 15877 15881 15885 15889 15893 15897 15901 15905 15909 15913 15917 15921 15925 15929 15933 15937 15941 15945 15949 15953 15957 15961 15965 15969 15973 15977 15981 15985 15989 15993 15997 16001 16005 16009 16013 16017 16021 16025 16029 16033 16037 16041 16045 16049 16053 16057 16061 16065 16069 16073 16077 16081 16085 16089 16093 16097 16101 16105 16109 16113 16117 16121 16125 16129 16133 16137 16141 16145 16149 16153 16157 16161 16165 16169 16173 16177 16181 16185 16189 16193 16197 16201 16205 16209 16213 16217 16221 16225 16229 16233 16237 16241 16245 16249 16253 16257 16261 16265 16269 16273 16277 16281 16285 16289 16293 16297 16301 16305 16309 16313 16317 16321 16325 16329 16333 16337 16341 16345 16349 16353 16357 16361 16365 16369 16373 16377 16381 16385 16389 16393 16397 16401 16405 16409 16413 16417 16421 16425 16429 16433 16437 16441 16445 16449 16453 16457 16461 16465 16469 16473 16477 16481 16485 16489 16493 16497 16501 16505 16509 16513 16517 16521 16525 16529 16533 16537 16541 16545 16549 16553 16557 16561 16565 16569 16573 16577 16581 16585 16589 16593 16597 16601 16605 16609 16613 16617 16621 16625 16629 16633 16637 16641 16645 16649 16653 16657 16661 16665 16669 16673 16677 16681 16685 16689 16693 16697 16701 16705 16709 16713 16717 16721 16725 16729 16733 16737 16741 16745 16749 16753 16757 16761 16765 16769 16773 16777 16781 16785 16789 16793 16797 16801 16805 16809 16813 16817 16821 16825 16829 16833 16837 16841 16845 16849 16853 16857 16861 16865 16869 16873 16877 16881 16885 16889 16893 16897 16901 16905 16909 16913 16917 16921 16925 16929 16933 16937 16941 16945 16949 16953 16957 16961 16965 16969 16973 16977 16981 16985 16989 16993 16997 17001 17005 17009 17013 17017 17021 17025 17029 17033 17037 17041 17045 17049 17053 17057 17061 17065 17069 17073 17077 17081 17085 17089 17093 17097 17101 17105 17109 17113 17117 17121 17125 17129 17133 17137 17141 17145 17149 17153 17157 17161 17165 17169 17173 17177 17181 17185 17189 17193 17197 17201 17205 17209 17213 17217 17221 17225 17229 17233 17237 17241 17245 17249 17253 17257 17261 17265 17269 17273 17277 17281 17285 17289 17293 17297 17301 17305 17309 17313 17317 17321 17325 17329 17333 17337 17341 17345 17349 17353 17357 17361 17365 17369 17373 17377 17381 17385 17389 17393 17397 17401 17405 17409 17413 17417 17421 17425 17429 17433 17437 17441 17445 17449 17453 17457 17461 17465 17469 17473 17477 17481 17485 17489 17493 17497 17501 17505 17509 17513 17517 17521 17525 17529 17533 17537 17541 17545 17549 17553 17557 17561 17565 17569 17573 17577 17581 17585 17589 17593 17597 17601 17605 17609 17613 17617 17621 17625 17629 17633 17637 17641 17645 17649 17653 17657 17661 17665 17669 17673 17677 17681 17685 17689 17693 17697 17701 17705 17709 17713 17717 17721 17725 17729 17733 17737 17741 17745 17749 17753 17757 17761 17765 17769 17773 17777 17781 17785 17789 17793 17797 17801 17805 17809 17813 17817 17821 17825 17829 17833 17837 17841 17845 17849 17853 17857 17861 17865 17869 17873 17877 17881 17885 17889 17893 17897 17901 17905 17909 17913 17917 17921 17925 17929 17933 17937 17941 17945 17949 17953 17957 17961 17965 17969 17973 17977 17981 17985 17989 17993 17997 18001 18005 18009 18013 18017 18021 18025 18029 18033 18037 18041 18045 18049 18053 18057 18061 18065 18069 18073 18077 18081 18085 18089 18093 18097 18101 18105 18109 18113 18117 18121 18125 18129 18133 18137 18141 18145 18149 18153 18157 18161 18165 18169 18173 18177 18181 18185 18189 18193 18197 18201 18205 18209 18213 18217 18221 18225 18229 18233 18237 18241 18245 18249 18253 18257 18261 18265 18269 18273 18277 18281 18285 18289 18293 18297 18301 18305 18309 18313 18317 18321 18325 18329 18333 18337 18341 18345 18349 18353 18357 18361 18365 18369 18373 18377 18381 18385 18389 18393 18397 18401 18405 18409 18413 18417 18421 18425 18429 18433 18437 18441 18445 18449 18453 18457 18461 18465 18469 18473 18477 18481 18485 18489 18493 18497 18501 18505 18509 18513 18517 18521 18525 18529 18533 18537 18541 18545 18549 18553 18557 18561 18565 18569 18573 18577 18581 18585 18589 18593 18597 18601 18605 18609 18613 18617 18621 18625 18629 18633 18637 18641 18645 18649 18653 18657 18661 18665 18669 18673 18677 18681 18685 18689 18693 18697 18701 18705 18709 18713 18717 18721 18725 18729 18733 18737 18741 18745 18749 18753 18757 18761 18765 18769 18773 18777 18781 18785 18789 18793 18797 18801 18805 18809 18813 18817 18821 18825 18829 18833 18837 18841 18845 18849 18853 18857 18861 18865 18869 18873 18877 18881 18885 18889 18893 18897 18901 18905 18909 18913 18917 18921 18925 18929 18933 18937 18941 18945 18949 18953 18957 18961 18965 18969 18973 18977 18981 18985 18989 18993 18997 19001 19005 19009 19013 19017 19021 19025 19029 19033 19037 19041 19045 19049 19053 19057 19061 19065 19069 19073 19077 19081 19085 19089 19093 19097 19101 19105 19109 19113 19117 19121 19125 19129 19133 19137 19141 19145 19149 19153 19157 19161 19165 19169 19173 19177 19181 19185 19189 19193 19197 19201 19205 19209 19213 19217 19221 19225 19229 19233 19237 19241 19245 19249 19253 19257 19261 19265 19269 19273 19277 19281 19285 19289 19293 19297 19301 19305 19309 19313 19317 19321 19325 19329 19333 19337 19341 19345 19349 19353 19357 19361 19365 19369 19373 19377 19381 19385 19389 19393 19397 19401 19405 19409 19413 19417 19421 19425 19429 19433 19437 19441 19445 19449 19453 19457 19461 19465 19469 19473 19477 19481 19485 19489 19493 19497 19501 19505 19509 19513 19517 19521 19525 19529 19533 19537 19541 19545 19549 19553 19557 19561 19565 19569 19573 19577 19581 19585 19589 19593 19597 19601 19605 19609 19613 19617 19621 19625 19629 19633 19637 19641 19645 19649 19653 19657 19661 19665 19669 19673 19677 19681 19685 19689 19693 19697 19701 19705 19709 19713 19717 19721 19725 19729 19733 19737 19741 19745 19749 19753 19757 19761 19765 19769 19773 19777 19781 19785 19789 19793 19797 19801 19805 19809 19813 19817 19821 19825 19829 19833 19837 19841 19845 19849 19853 19857 19861 19865 19869 19873 19877 19881 19885 19889 19893 19897 19901 19905 19909 19913 19917 19921 19925 19929 19933 19937 19941 19945 19949 19953 19957 19961 19965 19969 19973 19977 19981 19985 19989 19993 19997 20001 20005 20009 20013 20017 20021 20025 20029 20033 20037 20041 20045 20049 20053 20057 20061 20065 20069 20073 20077 20081 20085 20089 20093 20097 20101 20105 20109 20113 20117 20121 20125 20129 20133 20137 20141 20145 20149 20153 20157 20161 20165 20169 20173 20177 20181 20185 20189 20193 20197 20201 20205 20209 20213 20217 20221 20225 20229 20233 20237 20241 20245 20249 20253 20257 20261 20265 20269 20273 20277 20281 20285 20289 20293 20297 20301 20305 20309 20313 20317 20321 20325 20329 20333 20337 20341 20345 20349 20353 20357 20361 20365 20369 20373 20377 20381 20385 20389 20393 20397 20401 20405 20409 20413 20417 20421 20425 20429 20433 20437 20441 20445 20449 20453 20457 20461 20465 20469 20473 20477 20481 20485 20489 20493 20497 20501 20505 20509 20513 20517 20521 20525 20529 20533 20537 20541 20545 20549 20553 20557 20561 20565 20569 20573 20577 20581 20585 20589 20593 20597 20601 20605 20609 20613 20617 20621 20625 20629 20633 20637 20641 20645 20649 20653 20657 20661 20665 20669 20673 20677 20681 20685 20689 20693 20697 20701 20705 20709 20713 20717 20721 20725 20729 20733 20737 20741 20745 20749 20753 20757 20761 20765 20769 20773 20777 20781 20785 20789 20793 20797 20801 20805 20809 20813 20817 20821 20825 20829 20833 20837 20841 20845 20849 20853 20857 20861 20865 20869 20873 20877 20881 20885 20889 20893 20897 20901 20905 20909 20913 20917 20921 20925 20929 20933 20937 20941 20945 20949 20953 20957 20961 20965 20969 20973 20977 20981 20985 20989 20993 20997 21001 21005 21009 21013 21017 21021 21025 21029 21033 21037 21041 21045 21049 21053 21057 21061 21065 21069 21073 21077 21081 21085 21089 21093 21097 21101 21105 21109 21113 21117 21121 21125 21129 21133 21137 21141 21145 21149 21153 21157 21161 21165 21169 21173 21177 21181 21185 21189 21193 21197 21201 21205 21209 21213 21217 21221 21225 21229 21233 21237 21241 21245 21249 21253 21257 21261 21265 21269 21273 21277 21281 21285 21289 21293 21297 21301 21305 21309 21313 21317 21321 21325 21329 21333 21337 21341 21345 21349 21353 21357 21361 21365 21369 21373 21377 21381 21385 21389 21393 21397 21401 21405 21409 21413 21417 21421 21425 21429 21433 21437 21441 21445 21449 21453 21457 21461 21465 21469 21473 21477 21481 21485 21489 21493 21497 21501 21505 21509 21513 21517 21521 21525 21529 21533 21537 21541 21545 21549 21553 21557 21561 21565 21569 21573 21577 21581 21585 21589 21593 21597 21601 21605 21609 21613 21617 21621 21625 21629 21633 21637 21641 21645 21649 21653 21657 21661 21665 21669 21673 21677 21681 21685 21689 21693 21697 21701 21705 21709 21713 21717 21721 21725 21729 21733 21737 21741 21745 21749 21753 21757 21761 21765 21769 21773 21777 21781 21785 21789 21793 21797 21801 21805 21809 21813 21817 21821 21825 21829 21833 21837 21841 21845 21849 21853 21857 21861 21865 21869 21873 21877 21881 21885 21889 21893 21897 21901 21905 21909 21913 21917 21921 21925 21929 21933 21937 21941 21945 21949 21953 21957 21961 21965 21969 21973 21977 21981 21985 21989 21993 21997 22001 22005 22009 22013 22017 22021 22025 22029 22033 22037 22041 22045 22049 22053 22057 22061 22065 22069 22073 22077 22081 22085 22089 22093 22097 22101 22105 22109 22113 22117 22121 22125 22129 22133 22137 22141 22145 22149 22153 22157 22161 22165 22169 22173 22177 22181 22185 22189 22193 22197 22201 22205 22209 22213 22217 22221 22225 22229 22233 22237 22241 22245 22249 22253 22257 22261 22265 22269 22273 22277 22281 22285 22289 22293 22297 22301 22305 22309 22313 22317 22321 22325 22329 22333 22337 22341 22345 22349 22353 22357 22361 22365 22369 22373 22377 22381 22385 22389 22393 22397 22401 22405 22409 22413 22417 22421 22425 22429 22433 22437 22441 22445 22449 22453 22457 22461 22465 22469 22473 22477 22481 22485 22489 22493 22497 22501 22505 22509 22513 22517 22521 22525 22529 22533 22537 22541 22545 22549 22553 22557 22561 22565 22569 22573 22577 22581 22585 22589 22593 22597 22601 22605 22609 22613 22617 22621 22625 22629 22633 22637 22641 22645 22649 22653 22657 22661 22665 22669 22673 22677 22681 22685 22689 22693 22697 22701 22705 22709 22713 22717 22721 22725 22729 22733 22737 22741 22745 22749 22753 22757 22761 22765 22769 22773 22777 22781 22785 22789 22793 22797 22801 22805 22809 22813 22817 22821 22825 22829 22833 22837 22841 22845 22849 22853 22857 22861 22865 22869 22873 22877 22881 22885 22889 22893 22897 22901 22905 22909 22913 22917 22921 22925 22929 22933 22937 22941 22945 22949 22953 22957 22961 22965 22969 22973 22977 22981 22985 22989 22993 22997 23001 23005 23009 23013 23017 23021 23025 23029 23033 23037 23041 23045 23049 23053 23057 23061 23065 23069 23073 23077 23081 23085 23089 23093 23097 23101 23105 23109 23113 23117 23121 23125 23129 23133 23137 23141 23145 23149 23153 23157 23161 23165 23169 23173 23177 23181 23185 23189 23193 23197 23201 23205 23209 23213 23217 23221 23225 23229 23233 23237 23241 23245 23249 23253 23257 23261 23265 23269 23273 23277 23281 23285 23289 23293 23297 23301 23305 23309 23313 23317 23321 23325 23329 23333 23337 23341 23345 23349 23353 23357 23361 23365 23369 23373 23377 23381 23385 23389 23393 23397 23401 23405 23409 23413 23417 23421 23425 23429 23433 23437 23441 23445 23449 23453 23457 23461 23465 23469 23473 23477 23481 23485 23489 23493 23497 23501 23505 23509 23513 23517 23521 23525 23529 23533 23537 23541 23545 23549 23553 23557 23561 23565 23569 23573 23577 23581 23585 23589 23593 23597 23601 23605 23609 23613 23617 23621 23625 23629 23633 23637 23641 23645 23649 23653 23657 23661 23665 23669 23673 23677 23681 23685 23689 23693 23697 23701 23705 23709 23713 23717 23721 23725 23729 23733 23737 23741 23745 23749 23753 23757 23761 23765 23769 23773 23777 23781 23785 23789 23793 23797 23801 23805 23809 23813 23817 23821 23825 23829 23833 23837 23841 23845 23849 23853 23857 23861 23865 23869 23873 23877 23881 23885 23889 23893 23897 23901 23905 23909 23913 23917 23921 23925 23929 23933 23937 23941 23945 23949 23953 23957 23961 23965 23969 23973 23977 23981 23985 23989 23993 23997 24001 24005 24009 24013 24017 24021 24025 24029 24033 24037 24041 24045 24049 24053 24057 24061 24065 24069 24073 24077 24081 24085 24089 24093 24097 24101 24105 24109 24113 24117 24121 24125 24129 24133 24137 24141 24145 24149 24153 24157 24161 24165 24169 24173 24177 24181 24185 24189 24193 24197 24201 24205 24209 24213 24217 24221 24225 24229 24233 24237 24241 24245 24249 24253 24257 24261 24265 24269 24273 24277 24281 24285 24289 24293 24297 24301 24305 24309 24313 24317 24321 24325 24329 24333 24337 24341 24345 24349 24353 24357 24361 24365 24369 24373 24377 24381 24385 24389 24393 24397 24401 24405 24409 24413 24417 24421 24425 24429 24433 24437 24441 24445 24449 24453 24457 24461 24465 24469 24473 24477 24481 24485 24489 24493 24497 24501 24505 24509 24513 24517 24521 24525 24529 24533 24537 24541 24545 24549 24553 24557 24561 24565 24569 24573 24577 24581 24585 24589 24593 24597 24601 24605 24609 24613 24617 24621 24625 24629 24633 24637 24641 24645 24649 24653 24657 24661 24665 24669 24673 24677 24681 24685 24689 24693 24697 24701 24705 24709 24713 24717 24721 24725 24729 24733 24737 24741 24745 24749 24753 24757 24761 24765 24769 24773 24777 24781 24785 24789 24793 24797 24801 24805 24809 24813 24817 24821 24825 24829 24833 24837 24841 24845 24849 24853 24857 24861 24865 24869 24873 24877 24881 24885 24889 24893 24897 24901 24905 24909 24913 24917 24921 24925 24929 24933 24937 24941 24945 24949 24953 24957 24961 24965 24969 24973 24977 24981 24985 24989 24993 24997 25001 25005 25009 25013 25017 25021 25025 25029 25033 25037 25041 25045 25049 25053 25057 25061 25065 25069 25073 25077 25081 25085 25089 25093 25097 25101 25105 25109 25113 25117 25121 25125 25129 25133 25137 25141 25145 25149 25153 25157 25161 25165 25169 25173 25177 25181 25185 25189 25193 25197 25201 25205 25209 25213 25217 25221 25225 25229 25233 25237 25241 25245 25249 25253 25257 25261 25265 25269 25273 25277 25281 25285 25289 25293 25297 25301 25305 25309 25313 25317 25321 25325 25329 25333 25337 25341 25345 25349 25353 25357 25361 25365 25369 25373 25377 25381 25385 25389 25393 25397 25401 25405 25409 25413 25417 25421 25425 25429 25433 25437 25441 25445 25449 25453 25457 25461 25465 25469 25473 25477 25481 25485 25489 25493 25497 25501 25505 25509 25513 25517 25521 25525 25529 25533 25537 25541 25545 25549 25553 25557 25561 25565 25569 25573 25577 25581 25585 25589 25593 25597 25601 25605 25609 25613 25617 25621 25625 25629 25633 25637 25641 25645 25649 25653 25657 25661 25665 25669 25673 25677 25681 25685 25689 25693 25697 25701 25705 25709 25713 25717 25721 25725 25729 25733 25737 25741 25745 25749 25753 25757 25761 25765 25769 25773 25777 25781 25785 25789 25793 25797 25801 25805 25809 25813 25817 25821 25825 25829 25833 25837 25841 25845 25849 25853 25857 25861 25865 25869 25873 25877 25881 25885 25889 25893 25897 25901 25905 25909 25913 25917 25921 25925 25929 25933 25937 25941 25945 25949 25953 25957 25961 25965 25969 25973 25977 25981 25985 25989 25993 25997 26001 26005 26009 26013 26017 26021 26025 26029 26033 26037 26041 26045 26049 26053 26057 26061 26065 26069 26073 26077 26081 26085 26089 26093 26097 26101 26105 26109 26113 26117 26121 26125 26129 26133 26137 26141 26145 26149 26153 26157 26161 26165 26169 26173 26177 26181 26185 26189 26193 26197 26201 26205 26209 26213 26217 26221 26225 26229 26233 26237 26241 26245 26249 26253 26257 26261 26265 26269 26273 26277 26281 26285 26289 26293 26297 26301 26305 26309 26313 26317 26321 26325 26329 26333 26337 26341 26345 26349 26353 26357 26361 26365 26369 26373 26377 26381 26385 26389 26393 26397 26401 26405 26409 26413 26417 26421 26425 26429 26433 26437 26441 26445 26449 26453 26457 26461 26465 26469 26473 26477 26481 26485 26489 26493 26497 26501 26505 26509 26513 26517 26521 26525 26529 26533 26537 26541 26545 26549 26553 26557 26561 26565 26569 26573 26577 26581 26585 26589 26593 26597 26601 26605 26609 26613 26617 26621 26625 26629 26633 26637 26641 26645 26649 26653 26657 26661 26665 26669 26673 26677 26681 26685 26689 26693 26697 26701 26705 26709 26713 26717 26721 26725 26729 26733 26737 26741 26745 26749 26753 26757 26761 26765 26769 26773 26777 26781 26785 26789 26793 26797 26801 26805 26809 26813 26817 26821 26825 26829 26833 26837 26841 26845 26849 26853 26857 26861 26865 26869 26873 26877 26881 26885 26889 26893 26897 26901 26905 26909 26913 26917 26921 26925 26929 26933 26937 26941 26945 26949 26953 26957 26961 26965 26969 26973 26977 26981 26985 26989 26993 26997 27001 27005 27009 27013 27017 27021 27025 27029 27033 27037 27041 27045 27049 27053 27057 27061 27065 27069 27073 27077 27081 27085 27089 27093 27097 27101 27105 27109 27113 27117 27121 27125 27129 27133 27137 27141 27145 27149 27153 27157 27161 27165 27169 27173 27177 27181 27185 27189 27193 27197 27201 27205 27209 27213 27217 27221 27225 27229 27233 27237 27241 27245 27249 27253 27257 27261 27265 27269 27273 27277 27281 27285 27289 27293 27297 27301 27305 27309 27313 27317 27321 27325 27329 27333 27337 27341 27345 27349 27353 27357 27361 27365 27369 27373 27377 27381 27385 27389 27393 27397 27401 27405 27409 27413 27417 27421 27425 27429 27433 27437 27441 27445 27449 27453 27457 27461 27465 27469 27473 27477 27481 27485 27489 27493 27497 27501 27505 27509 27513 27517 27521 27525 27529 27533 27537 27541 27545 27549 27553 27557 27561 27565 27569 27573 27577 27581 27585 27589 27593 27597 27601 27605 27609 27613 27617 27621 27625 27629 27633 27637 27641 27645 27649 27653 27657 27661 27665 27669 27673 27677 27681 27685 27689 27693 27697 27701 27705 27709 27713 27717 27721 27725 27729 27733 27737 27741 27745 27749 27753 27757 27761 27765 27769 27773 27777 27781 27785 27789 27793 27797 27801 27805 27809 27813 27817 27821 27825 27829 27833 27837 27841 27845 27849 27853 27857 27861 27865 27869 27873 27877 27881 27885 27889 27893 27897 27901 27905 27909 27913 27917 27921 27925 27929 27933 27937 27941 27945 27949 27953 27957 27961 27965 27969 27973 27977 27981 27985 27989 27993 27997 28001 28005 28009 28013 28017 28021 28025 28029 28033 28037 28041 28045 28049 28053 28057 28061 28065 28069 28073 28077 28081 28085 28089 28093 28097 28101 28105 28109 28113 28117 28121 28125 28129 28133 28137 28141 28145 28149 28153 28157 28161 28165 28169 28173 28177 28181 28185 28189 28193 28197 28201 28205 28209 28213 28217 28221 28225 28229 28233 28237 28241 28245 28249 28253 28257 28261 28265 28269 28273 28277 28281 28285 28289 28293 28297 28301 28305 28309 28313 28317 28321 28325 28329 28333 28337 28341 28345 28349 28353 28357 28361 28365 28369 28373 28377 28381 28385 28389 28393 28397 28401 28405 28409 28413 28417 28421 28425 28429 28433 28437 28441 28445 28449 28453 28457 28461 28465 28469 28473 28477 28481 28485 28489 28493 28497 28501 28505 28509 28513 28517 28521 28525 28529 28533 28537 28541 28545 28549 28553 28557 28561 28565 28569 28573 28577 28581 28585 28589 28593 28597 28601 28605 28609 28613 28617 28621 28625 28629 28633 28637 28641 28645 28649 28653 28657 28661 28665 28669 28673 28677 28681 28685 28689 28693 28697 28701 28705 28709 28713 28717 28721 28725 28729 28733 28737 28741 28745 28749 28753 28757 28761 28765 28769 28773 28777 28781 28785 28789 28793 28797 28801 28805 28809 28813 28817 28821 28825 28829 28833 28837 28841 28845 28849 28853 28857 28861 28865 28869 28873 28877 28881 28885 28889 28893 28897 28901 28905 28909 28913 28917 28921 28925 28929 28933 28937 28941 28945 28949 28953 28957 28961 28965 28969 28973 28977 28981 28985 28989 28993 28997 29001 29005 29009 29013 29017 29021 29025 29029 29033 29037 29041 29045 29049 29053 29057 29061 29065 29069 29073 29077 29081 29085 29089 29093 29097 29101 29105 29109 29113 29117 29121 29125 29129 29133 29137 29141 29145 29149 29153 29157 29161 29165 29169 29173 29177 29181 29185 29189 29193 29197 29201 29205 29209 29213 29217 29221 29225 29229 29233 29237 29241 29245 29249 29253 29257 29261 29265 29269 29273 29277 29281 29285 29289 29293 29297 29301 29305 29309 29313 29317 29321 29325 29329 29333 29337 29341 29345 29349 29353 29357 29361 29365 29369 29373 29377 29381 29385 29389 29393 29397 29401 29405 29409 29413 29417 29421 29425 29429 29433 29437 29441 29445 29449 29453 29457 29461 29465 29469 29473 29477 29481 29485 29489 29493 29497 29501 29505 29509 29513 29517 29521 29525 29529 29533 29537 29541 29545 29549 29553 29557 29561 29565 29569 29573 29577 29581 29585 29589 29593 29597 29601 29605 29609 29613 29617 29621 29625 29629 29633 29637 29641 29645 29649 29653 29657 29661 29665 29669 29673 29677 29681 29685 29689 29693 29697 29701 29705 29709 29713 29717 29721 29725 29729 29733 29737 29741 29745 29749 29753 29757 29761 29765 29769 29773 29777 29781 29785 29789 29793 29797 29801 29805 29809 29813 29817 29821 29825 29829 29833 29837 29841 29845 29849 29853 29857 29861 29865 29869 29873 29877 29881 29885 29889 29893 29897 29901 29905 29909 29913 29917 29921 29925 29929 29933 29937 29941 29945 29949 29953 29957 29961 29965 29969 29973 29977 29981 29985 29989 29993 29997 30001 30005 30009 30013 30017 30021 30025 30029 30033 30037 30041 30045 30049 30053 30057 30061 30065 30069 30073 30077 30081 30085 30089 30093 30097 30101 30105 30109 30113 30117 30121 30125 30129 30133 30137 30141 30145 30149 30153 30157 30161 30165 30169 30173 30177 30181 30185 30189 30193 30197 30201 30205 30209 30213 30217 30221 30225 30229 30233 30237 30241 30245 30249 30253 30257 30261 30265 30269 30273 30277 30281 30285 30289 30293 30297 30301 30305 30309 30313 30317 30321 30325 30329 30333 30337 30341 30345 30349 30353 30357 30361 30365 30369 30373 30377 30381 30385 30389 30393 30397 30401 30405 30409 30413 30417 30421 30425 30429 30433 30437 30441 30445 30449 30453 30457 30461 30465 30469 30473 30477 30481 30485 30489 30493 30497 30501 30505 30509 30513 30517 30521 30525 30529 30533 30537 30541 30545 30549 30553 30557 30561 30565 30569 30573 30577 30581 30585 30589 30593 30597 30601 30605 30609 30613 30617 30621 30625 30629 30633 30637 30641 30645 30649 30653 30657 30661 30665 30669 30673 30677 30681 30685 30689 30693 30697 30701 30705 30709 30713 30717 30721 30725 30729 30733 30737 30741 30745 30749 30753 30757 30761 30765 30769 30773 30777 30781 30785 30789 30793 30797 30801 30805 30809 30813 30817 30821 30825 30829 30833 30837 30841 30845 30849 30853 30857 30861 30865 30869 30873 30877 30881 30885 30889 30893 30897 30901 30905 30909 30913 30917 30921 30925 30929 30933 30937 30941 30945 30949 30953 30957 30961 30965 30969 30973 30977 30981 30985 30989 30993 30997 31001 31005 31009 31013 31017 31021 31025 31029 31033 31037 31041 31045 31049 31053 31057 31061 31065 31069 31073 31077 31081 31085 31089 31093 31097 31101 31105 31109 31113 31117 31121 31125 31129 31133 31137 31141 31145 31149 31153 31157 31161 31165 31169 31173 31177 31181 31185 31189 31193 31197 31201 31205 31209 31213 31217 31221 31225 31229 31233 31237 31241 31245 31249 31253 31257 31261 31265 31269 31273 31277 31281 31285 31289 31293 31297 31301 31305 31309 31313 31317 31321 31325 31329 31333 31337 31341 31345 31349 31353 31357 31361 31365 31369 31373 31377 31381 31385 31389 31393 31397 31401 31405 31409 31413 31417 31421 31425 31429 31433 31437 31441 31445 31449 31453 31457 31461 31465 31469 31473 31477 31481 31485 31489 31493 31497 31501 31505 31509 31513 31517 31521 31525 31529 31533 31537 31541 31545 31549 31553 31557 31561 31565 31569 31573 31577 31581 31585 31589 31593 31597 31601 31605 31609 31613 31617 31621 31625 31629 31633 31637 31641 31645 31649 31653 31657 31661 31665 31669 31673 31677 31681 31685 31689 31693 31697 31701 31705 31709 31713 31717 31721 31725 31729 31733 31737 31741 31745 31749 31753 31757 31761 31765 31769 31773 31777 31781 31785 31789 31793 31797 31801 31805 31809 31813 31817 31821 31825 31829 31833 31837 31841 31845 31849 31853 31857 31861 31865 31869 31873 31877 31881 31885 31889 31893 31897 31901 31905 31909 31913 31917 31921 31925 31929 31933 31937 31941 31945 31949 31953 31957 31961 31965 31969 31973 31977 31981 31985 31989 31993 31997 32001 32005 32009 32013 32017 32021 32025 32029 32033 32037 32041 32045 32049 32053 32057 32061 32065 32069 32073 32077 32081 32085 32089 32093 32097 32101 32105 32109 32113 32117 32121 32125 32129 32133 32137 32141 32145 32149 32153 32157 32161 32165 32169 32173 32177 32181 32185 32189 32193 32197 32201 32205 32209 32213 32217 32221 32225 32229 32233 32237 32241 32245 32249 32253 32257 32261 32265 32269 32273 32277 32281 32285 32289 32293 32297 32301 32305 32309 32313 32317 32321 32325 32329 32333 32337 32341 32345 32349 32353 32357 32361 32365 32369 32373 32377 32381 32385 32389 32393 32397 32401 32405 32409 32413 32417 32421 32425 32429 32433 32437 32441 32445 32449 32453 32457 32461 32465 32469 32473 32477 32481 32485 32489 32493 32497 32501 32505 32509 32513 32517 32521 32525 32529 32533 32537 32541 32545 32549 32553 32557 32561 32565 32569 32573 32577 32581 32585 32589 32593 32597 32601 32605 32609 32613 32617 32621 32625 32629 32633 32637 32641 32645 32649 32653 32657 32661 32665 32669 32673 32677 32681 32685 32689 32693 32697 32701 32705 32709 32713 32717 32721 32725 32729 32733 32737 32741 32745 32749 32753 32757 32761 32765 32769 32773 32777 32781 32785 32789 32793 32797 32801 32805 32809 32813 32817 32821 32825 32829 32833 32837 32841 32845 32849 32853 32857 32861 32865 32869 32873 32877 32881 32885 32889 32893 32897 32901 32905 32909 32913 32917 32921 32925 32929 32933 32937 32941 32945 32949 32953 32957 32961 32965 32969 32973 32977 32981 32985 32989 32993 32997 33001 33005 33009 33013 33017 33021 33025 33029 33033 33037 33041 33045 33049 33053 33057 33061 33065 33069 33073 33077 33081 33085 33089 33093 33097 33101 33105 33109 33113 33117 33121 33125 33129 33133 33137 33141 33145 33149 33153 33157 33161 33165 33169 33173 33177 33181 33185 33189 33193 33197 33201 33205 33209 33213 33217 33221 33225 33229 33233 33237 33241 33245 33249 33253 33257 33261 33265 33269 33273 33277 33281 33285 33289 33293 33297 33301 33305 33309 33313 33317 33321 33325 33329 33333 33337 33341 33345 33349 33353 33357 33361 33365 33369 33373 33377 33381 33385 33389 33393 33397 33401 33405 33409 33413 33417 33421 33425 33429 33433 33437 33441 33445 33449 33453 33457 33461 33465 33469 33473 33477 33481 33485 33489 33493 33497 33501 33505 33509 33513 33517 33521 33525 33529 33533 33537 33541 33545 33549 33553 33557 33561 33565 33569 33573 33577 33581 33585 33589 33593 33597 33601 33605 33609 33613 33617 33621 33625 33629 33633 33637 33641 33645 33649 33653 33657 33661 33665 33669 33673 33677 33681 33685 33689 33693 33697 33701 33705 33709 33713 33717 33721 33725 33729 33733 33737 33741 33745 33749 33753 33757 33761 33765 33769 33773 33777 33781 33785 33789 33793 33797 33801 33805 33809 33813 33817 33821 33825 33829 33833 33837 33841 33845 33849 33853 33857 33861 33865 33869 33873 33877 33881 33885 33889 33893 33897 33901 33905 33909 33913 33917 33921 33925 33929 33933 33937 33941 33945 33949 33953 33957 33961 33965 33969 33973 33977 33981 33985 33989 33993 33997 34001 34005 34009 34013 34017 34021 34025 34029 34033 34037 34041 34045 34049 34053 34057 34061 34065 34069 34073 34077 34081 34085 34089 34093 34097 34101 34105 34109 34113 34117 34121 34125 34129 34133 34137 34141 34145 34149 34153 34157 34161 34165 34169 34173 34177 34181 34185 34189 34193 34197 34201 34205 34209 34213 34217 34221 34225 34229 34233 34237 34241 34245 34249 34253 34257 34261 34265 34269 34273 34277 34281 34285 34289 34293 34297 34301 34305 34309 34313 34317 34321 34325 34329 34333 34337 34341 34345 34349 34353 34357 34361 34365 34369 34373 34377 34381 34385 34389 34393 34397 34401 34405 34409 34413 34417 34421 34425 34429 34433 34437 34441 34445 34449 34453 34457 34461 34465 34469 34473 34477 34481 34485 34489 34493 34497 34501 34505 34509 34513 34517 34521 34525 34529 34533 34537 34541 34545 34549 34553 34557 34561 34565 34569 34573 34577 34581 34585 34589 34593 34597 34601 34605 34609 34613 34617 34621 34625 34629 34633 34637 34641 34645 34649 34653 34657 34661 34665 34669 34673 34677 34681 34685 34689 34693 34697 34701 34705 34709 34713 34717 34721 34725 34729 34733 34737 34741 34745 34749 34753 34757 34761 34765 34769 34773 34777 34781 34785 34789 34793 34797 34801 34805 34809 34813 34817 34821 34825 34829 34833 34837 34841 34845 34849 34853 34857 34861 34865 34869 34873 34877 34881 34885 34889 34893 34897 34901 34905 34909 34913 34917 34921 34925 34929 34933 34937 34941 34945 34949 34953 34957 34961 34965 34969 34973 34977 34981 34985 34989 34993 34997 35001 35005 35009 35013 35017 35021 35025 35029 35033 35037 35041 35045 35049 35053 35057 35061 35065 35069 35073 35077 35081 35085 35089 35093 35097 35101 35105 35109 35113 35117 35121 35125 35129 35133 35137 35141 35145 35149 35153 35157 35161 35165 35169 35173 35177 35181 35185 35189 35193 35197 35201 35205 35209 35213 35217 35221 35225 35229 35233 35237 35241 35245 35249 35253 35257 35261 35265 35269 35273 35277 35281 35285 35289 35293 35297 35301 35305 35309 35313 35317 35321 35325 35329 35333 35337 35341 35345 35349 35353 35357 35361 35365 35369 35373 35377 35381 35385 35389 35393 35397 35401 35405 35409 35413 35417 35421 35425 35429 35433 35437 35441 35445 35449 35453 35457 35461 35465 35469 35473 35477 35481 35485 35489 35493 35497 35501 35505 35509 35513 35517 35521 35525 35529 35533 35537 35541 35545 35549 35553 35557 35561 35565 35569 35573 35577 35581 35585 35589 35593 35597 35601 35605 35609 35613 35617 35621 35625 35629 35633 35637 35641 35645 35649 35653 35657 35661 35665 35669 35673 35677 35681 35685 35689 35693 35697 35701 35705 35709 35713 35717 35721 35725 35729 35733 35737 35741 35745 35749 35753 35757 35761 35765 35769 35773 35777 35781 35785 35789 35793 35797 35801 35805 35809 35813 35817 35821 35825 35829 35833 35837 35841 35845 35849 35853 35857 35861 35865 35869 35873 35877 35881 35885 35889 35893 35897 35901 35905 35909 35913 35917 35921 35925 35929 35933 35937 35941 35945 35949 35953 35957 35961 35965 35969 35973 35977 35981 35985 35989 35993 35997 36001 36005 36009 36013 36017 36021 36025 36029 36033 36037 36041 36045 36049 36053 36057 36061 36065 36069 36073 36077 36081 36085 36089 36093 36097 36101 36105 36109 36113 36117 36121 36125 36129 36133 36137 36141 36145 36149 36153 36157 36161 36165 36169 36173 36177 36181 36185 36189 36193 36197 36201 36205 36209 36213 36217 36221 36225 36229 36233 36237 36241 36245 36249 36253 36257 36261 36265 36269 36273 36277 36281 36285 36289 36293 36297 36301 36305 36309 36313 36317 36321 36325 36329 36333 36337 36341 36345 36349 36353 36357 36361 36365 36369 36373 36377 36381 36385 36389 36393 36397 36401 36405 36409 36413 36417 36421 36425 36429 36433 36437 36441 36445 36449 36453 36457 36461 36465 36469 36473 36477 36481 36485 36489 36493 36497 36501 36505 36509 36513 36517 36521 36525 36529 36533 36537 36541 36545 36549 36553 36557 36561 36565 36569 36573 36577 36581 36585 36589 36593 36597 36601 36605 36609 36613 36617 36621 36625 36629 36633 36637 36641 36645 36649 36653 36657 36661 36665 36669 36673 36677 36681 36685 36689 36693 36697 36701 36705 36709 36713 36717 36721 36725 36729 36733 36737 36741 36745 36749 36753 36757 36761 36765 36769 36773 36777 36781 36785 36789 36793 36797 36801 36805 36809 36813 36817 36821 36825 36829 36833 36837 36841 36845 36849 36853 36857 36861 36865 36869 36873 36877 36881 36885 36889 36893 36897 36901 36905 36909 36913 36917 36921 36925 36929 36933 36937 36941 36945 36949 36953 36957 36961 36965 36969 36973 36977 36981 36985 36989 36993 36997 37001 37005 37009 37013 37017 37021 37025 37029 37033 37037 37041 37045 37049 37053 37057 37061 37065 37069 37073 37077 37081 37085 37089 37093 37097 37101 37105 37109 37113 37117 37121 37125 37129 37133 37137 37141 37145 37149 37153 37157 37161 37165 37169 37173 37177 37181 37185 37189 37193 37197 37201 37205 37209 37213 37217 37221 37225 37229 37233 37237 37241 37245 37249 37253 37257 37261 37265 37269 37273 37277 37281 37285 37289 37293 37297 37301 37305 37309 37313 37317 37321 37325 37329 37333 37337 37341 37345 37349 37353 37357 37361 37365 37369 37373 37377 37381 37385 37389 37393 37397 37401 37405 37409 37413 37417 37421 37425 37429 37433 37437 37441 37445 37449 37453 37457 37461 37465 37469 37473 37477 37481 37485 37489 37493 37497 37501 37505 37509 37513 37517 37521 37525 37529 37533 37537 37541 37545 37549 37553 37557 37561 37565 37569 37573 37577 37581 37585 37589 37593 37597 37601 37605 37609 37613 37617 37621 37625 37629 37633 37637 37641 37645 37649 37653 37657 37661 37665 37669 37673 37677 37681 37685 37689 37693 37697 37701 37705 37709 37713 37717 37721 37725 37729 37733 37737 37741 37745 37749 37753 37757 37761 37765 37769 37773 37777 37781 37785 37789 37793 37797 37801 37805 37809 37813 37817 37821 37825 37829 37833 37837 37841 37845 37849 37853 37857 37861 37865 37869 37873 37877 37881 37885 37889 37893 37897 37901 37905 37909 37913 37917 37921 37925 37929 37933 37937 37941 37945 37949 37953 37957 37961 37965 37969 37973 37977 37981 37985 37989 37993 37997 38001 38005 38009 38013 38017 38021 38025 38029 38033 38037 38041 38045 38049 38053 38057 38061 38065 38069 38073 38077 38081 38085 38089 38093 38097 38101 38105 38109 38113 38117 38121 38125 38129 38133 38137 38141 38145 38149 38153 38157 38161 38165 38169 38173 38177 38181 38185 38189 38193 38197 38201 38205 38209 38213 38217 38221 38225 38229 38233 38237 38241 38245 38249 38253 38257 38261 38265 38269 38273 38277 38281 38285 38289 38293 38297 38301 38305 38309 38313 38317 38321 38325 38329 38333 38337 38341 38345 38349 38353 38357 38361 38365 38369 38373 38377 38381 38385 38389 38393 38397 38401 38405 38409 38413 38417 38421 38425 38429 38433 38437 38441 38445 38449 38453 38457 38461 38465 38469 38473 38477 38481 38485 38489 38493 38497 38501 38505 38509 38513 38517 38521 38525 38529 38533 38537 38541 38545 38549 38553 38557 38561 38565 38569 38573 38577 38581 38585 38589 38593 38597 38601 38605 38609 38613 38617 38621 38625 38629 38633 38637 38641 38645 38649 38653 38657 38661 38665 38669 38673 38677 38681 38685 38689 38693 38697 38701 38705 38709 38713 38717 38721 38725 38729 38733 38737 38741 38745 38749 38753 38757 38761 38765 38769 38773 38777 38781 38785 38789 38793 38797 38801 38805 38809 38813 38817 38821 38825 38829 38833 38837 38841 38845 38849 38853 38857 38861 38865 38869 38873 38877 38881 38885 38889 38893 38897 38901 38905 38909 38913 38917 38921 38925 38929 38933 38937 38941 38945 38949 38953 38957 38961 38965 38969 38973 38977 38981 38985 38989 38993 38997 39001 39005 39009 39013 39017 39021 39025 39029 39033 39037 39041 39045 39049 39053 39057 39061 39065 39069 39073 39077 39081 39085 39089 39093 39097 39101 39105 39109 39113 39117 39121 39125 39129 39133 39137 39141 39145 39149 39153 39157 39161 39165 39169 39173 39177 39181 39185 39189 39193 39197 39201 39205 39209 39213 39217 39221 39225 39229 39233 39237 39241 39245 39249 39253 39257 39261 39265 39269 39273 39277 39281 39285 39289 39293 39297 39301 39305 39309 39313 39317 39321 39325 39329 39333 39337 39341 39345 39349 39353 39357 39361 39365 39369 39373 39377 39381 39385 39389 39393 39397 39401 39405 39409 39413 39417 39421 39425 39429 39433 39437 39441 39445 39449 39453 39457 39461 39465 39469 39473 39477 39481 39485 39489 39493 39497 39501 39505 39509 39513 39517 39521 39525 39529 39533 39537 39541 39545 39549 39553 39557 39561 39565 39569 39573 39577 39581 39585 39589 39593 39597 39601 39605 39609 39613 39617 39621 39625 39629 39633 39637 39641 39645 39649 39653 39657 39661 39665 39669 39673 39677 39681 39685 39689 39693 39697 39701 39705 39709 39713 39717 39721 39725 39729 39733 39737 39741 39745 39749 39753 39757 39761 39765 39769 39773 39777 39781 39785 39789 39793 39797 39801 39805 39809 39813 39817 39821 39825 39829 39833 39837 39841 39845 39849 39853 39857 39861 39865 39869 39873 39877 39881 39885 39889 39893 39897 39901 39905 39909 39913 39917 39921 39925 39929 39933 39937 39941 39945 39949 39953 39957 39961 39965 39969 39973 39977 39981 39985 39989 39993 39997 40001 40005 40009 40013 40017 40021 40025 40029 40033 40037 40041 40045 40049 40053 40057 40061 40065 40069 40073 40077 40081 40085 40089 40093 40097 40101 40105 40109 40113 40117 40121 40125 40129 40133 40137 40141 40145 40149 40153 40157 40161 40165 40169 40173 40177 40181 40185 40189 40193 40197 40201 40205 40209 40213 40217 40221 40225 40229 40233 40237 40241 40245 40249 40253 40257 40261 40265 40269 40273 40277 40281 40285 40289 40293 40297 40301 40305 40309 40313 40317 40321 40325 40329 40333 40337 40341 40345 40349 40353 40357 40361 40365 40369 40373 40377 40381 40385 40389 40393 40397 40401 40405 40409 40413 40417 40421 40425 40429 40433 40437 40441 40445 40449 40453 40457 40461 40465 40469 40473 40477 40481 40485 40489 40493 40497 40501 40505 40509 40513 40517 40521 40525 40529 40533 40537 40541 40545 40549 40553 40557 40561 40565 40569 40573 40577 40581 40585 40589 40593 40597 40601 40605 40609 40613 40617 40621 40625 40629 40633 40637 40641 40645 40649 40653 40657 40661 40665 40669 40673 40677 40681 40685 40689 40693 40697 40701 40705 40709 40713 40717 40721 40725 40729 40733 40737 40741 40745 40749 40753 40757 40761 40765 40769 40773 40777 40781 40785 40789 40793 40797 40801 40805 40809 40813 40817 40821 40825 40829 40833 40837 40841 40845 40849 40853 40857 40861 40865 40869 40873 40877 40881 40885 40889 40893 40897 40901 40905 40909 40913 40917 40921 40925 40929 40933 40937 40941 40945 40949 40953 40957 40961 40965 40969 40973 40977 40981 40985 40989 40993 40997 41001 41005 41009 41013 41017 41021 41025 41029 41033 41037 41041 41045 41049 41053 41057 41061 41065 41069 41073 41077 41081 41085 41089 41093 41097 41101 41105 41109 41113 41117 41121 41125 41129 41133 41137 41141 41145 41149 41153 41157 41161 41165 41169 41173 41177 41181 41185 41189 41193 41197 41201 41205 41209 41213 41217 41221 41225 41229 41233 41237 41241 41245 41249 41253 41257 41261 41265 41269 41273 41277 41281 41285 41289 41293 41297 41301 41305 41309 41313 41317 41321 41325 41329 41333 41337 41341 41345 41349 41353 41357 41361 41365 41369 41373 41377 41381 41385 41389 41393 41397 41401 41405 41409 41413 41417 41421 41425 41429 41433 41437 41441 41445 41449 41453 41457 41461 41465 41469 41473 41477 41481 41485 41489 41493 41497 41501 41505 41509 41513 41517 41521 41525 41529 41533 41537 41541 41545 41549 41553 41557 41561 41565 41569 41573 41577 41581 41585 41589 41593 41597 41601 41605 41609 41613 41617 41621 41625 41629 41633 41637 41641 41645 41649 41653 41657 41661 41665 41669 41673 41677 41681 41685 41689 41693 41697 41701 41705 41709 41713 41717 41721 41725 41729 41733 41737 41741 41745 41749 41753 41757 41761 41765 41769 41773 41777 41781 41785 41789 41793 41797 41801 41805 41809 41813 41817 41821 41825 41829 41833 41837 41841 41845 41849 41853 41857 41861 41865 41869 41873 41877 41881 41885 41889 41893 41897 41901 41905 41909 41913 41917 41921 41925 41929 41933 41937 41941 41945 41949 41953 41957 41961 41965 41969 41973 41977 41981 41985 41989 41993 41997 42001 42005 42009 42013 42017 42021 42025 42029 42033 42037 42041 42045 42049 42053 42057 42061 42065 42069 42073 42077 42081 42085 42089 42093 42097 42101 42105 42109 42113 42117 42121 42125 42129 42133 42137 42141 42145 42149 42153 42157 42161 42165 42169 42173 42177 42181 42185 42189 42193 42197 42201 42205 42209 42213 42217 42221 42225 42229 42233 42237 42241 42245 42249 42253 42257 42261 42265 42269 42273 42277 42281 42285 42289 42293 42297 42301 42305 42309 42313 42317 42321 42325 42329 42333 42337 42341 42345 42349 42353 42357 42361 42365 42369 42373 42377 42381 42385 42389 42393 42397 42401 42405 42409 42413 42417 42421 42425 42429 42433 42437 42441 42445 42449 42453 42457 42461 42465 42469 42473 42477 42481 42485 42489 42493 42497 42501 42505 42509 42513 42517 42521 42525 42529 42533 42537 42541 42545 42549 42553 42557 42561 42565 42569 42573 42577 42581 42585 42589 42593 42597 42601 42605 42609 42613 42617 42621 42625 42629 42633 42637 42641 42645 42649 42653 42657 42661 42665 42669 42673 42677 42681 42685 42689 42693 42697 42701 42705 42709 42713 42717 42721 42725 42729 42733 42737 42741 42745 42749 42753 42757 42761 42765 42769 42773 42777 42781 42785 42789 42793 42797 42801 42805 42809 42813 42817 42821 42825 42829 42833 42837 42841 42845 42849 42853 42857 42861 42865 42869 42873 42877 42881 42885 42889 42893 42897 42901 42905 42909 42913 42917 42921 42925 42929 42933 42937 42941 42945 42949 42953 42957 42961 42965 42969 42973 42977 42981 42985 42989 42993 42997 43001 43005 43009 43013 43017 43021 43025 43029 43033 43037 43041 43045 43049 43053 43057 43061 43065 43069 43073 43077 43081 43085 43089 43093 43097 43101 43105 43109 43113 43117 43121 43125 43129 43133 43137 43141 43145 43149 43153 43157 43161 43165 43169 43173 43177 43181 43185 43189 43193 43197 43201 43205 43209 43213 43217 43221 43225 43229 43233 43237 43241 43245 43249 43253 43257 43261 43265 43269 43273 43277 43281 43285 43289 43293 43297 43301 43305 43309 43313 43317 43321 43325 43329 43333 43337 43341 43345 43349 43353 43357 43361 43365 43369 43373 43377 43381 43385 43389 43393 43397 43401 43405 43409 43413 43417 43421 43425 43429 43433 43437 43441 43445 43449 43453 43457 43461 43465 43469 43473 43477 43481 43485 43489 43493 43497 43501 43505 43509 43513 43517 43521 43525 43529 43533 43537 43541 43545 43549 43553 43557 43561 43565 43569 43573 43577 43581 43585 43589 43593 43597 43601 43605 43609 43613 43617 43621 43625 43629 43633 43637 43641 43645 43649 43653 43657 43661 43665 43669 43673 43677 43681 43685 43689 43693 43697 43701 43705 43709 43713 43717 43721 43725 43729 43733 43737 43741 43745 43749 43753 43757 43761 43765 43769 43773 43777 43781 43785 43789 43793 43797 43801 43805 43809 43813 43817 43821 43825 43829 43833 43837 43841 43845 43849 43853 43857 43861 43865 43869 43873 43877 43881 43885 43889 43893 43897 43901 43905 43909 43913 43917 43921 43925 43929 43933 43937 43941 43945 43949 43953 43957 43961 43965 43969 43973 43977 43981 43985 43989 43993 43997 44001 44005 44009 44013 44017 44021 44025 44029 44033 44037 44041 44045 44049 44053 44057 44061 44065 44069 44073 44077 44081 44085 44089 44093 44097 44101 44105 44109 44113 44117 44121 44125 44129 44133 44137 44141 44145 44149 44153 44157 44161 44165 44169 44173 44177 44181 44185 44189 44193 44197 44201 44205 44209 44213 44217 44221 44225 44229 44233 44237 44241 44245 44249 44253 44257 44261 44265 44269 44273 44277 44281 44285 44289 44293 44297 44301 44305 44309 44313 44317 44321 44325 44329 44333 44337 44341 44345 44349 44353 44357 44361 44365 44369 44373 44377 44381 44385 44389 44393 44397 44401 44405 44409 44413 44417 44421 44425 44429 44433 44437 44441 44445 44449 44453 44457 44461 44465 44469 44473 44477 44481 44485 44489 44493 44497 44501 44505 44509 44513 44517 44521 44525 44529 44533 44537 44541 44545 44549 44553 44557 44561 44565 44569 44573 44577 44581 44585 44589 44593 44597 44601 44605 44609 44613 44617 44621 44625 44629 44633 44637 44641 44645 44649 44653 44657 44661 44665 44669 44673 44677 44681 44685 44689 44693 44697 44701 44705 44709 44713 44717 44721 44725 44729 44733 44737 44741 44745 44749 44753 44757 44761 44765 44769 44773 44777 44781 44785 44789 44793 44797 44801 44805 44809 44813 44817 44821 44825 44829 44833 44837 44841 44845 44849 44853 44857 44861 44865 44869 44873 44877 44881 44885 44889 44893 44897 44901 44905 44909 44913 44917 44921 44925 44929 44933 44937 44941 44945 44949 44953 44957 44961 44965 44969 44973 44977 44981 44985 44989 44993 44997 45001 45005 45009 45013 45017 45021 45025 45029 45033 45037 45041 45045 45049 45053 45057 45061 45065 45069 45073 45077 45081 45085 45089 45093 45097 45101 45105 45109 45113 45117 45121 45125 45129 45133 45137 45141 45145 45149 45153 45157 45161 45165 45169 45173 45177 45181 45185 45189 45193 45197 45201 45205 45209 45213 45217 45221 45225 45229 45233 45237 45241 45245 45249 45253 45257 45261 45265 45269 45273 45277 45281 45285 45289 45293 45297 45301 45305 45309 45313 45317 45321 45325 45329 45333 45337 45341 45345 45349 45353 45357 45361 45365 45369 45373 45377 45381 45385 45389 45393 45397 45401 45405 45409 45413 45417 45421 45425 45429 45433 45437 45441 45445 45449 45453 45457 45461 45465 45469 45473 45477 45481 45485 45489 45493 45497 45501 45505 45509 45513 45517 45521 45525 45529 45533 45537 45541 45545 45549 45553 45557 45561 45565 45569 45573 45577 45581 45585 45589 45593 45597 45601 45605 45609 45613 45617 45621 45625 45629 45633 45637 45641 45645 45649 45653 45657 45661 45665 45669 45673 45677 45681 45685 45689 45693 45697 45701 45705 45709 45713 45717 45721 45725 45729 45733 45737 45741 45745 45749 45753 45757 45761 45765 45769 45773 45777 45781 45785 45789 45793 45797 45801 45805 45809 45813 45817 45821 45825 45829 45833 45837 45841 45845 45849 45853 45857 45861 45865 45869 45873 45877 45881 45885 45889 45893 45897 45901 45905 45909 45913 45917 45921 45925 45929 45933 45937 45941 45945 45949 45953 45957 45961 45965 45969 45973 45977 45981 45985 45989 45993 45997 46001 46005 46009 46013 46017 46021 46025 46029 46033 46037 46041 46045 46049 46053 46057 46061 46065 46069 46073 46077 46081 46085 46089 46093 46097 46101 46105 46109 46113 46117 46121 46125 46129 46133 46137 46141 46145 46149 46153 46157 46161 46165 46169 46173 46177 46181 46185 46189 46193 46197 46201 46205 46209 46213 46217 46221 46225 46229 46233 46237 46241 46245 46249 46253 46257 46261 46265 46269 46273 46277 46281 46285 46289 46293 46297 46301 46305 46309 46313 46317 46321 46325 46329 46333 46337 46341 46345 46349 46353 46357 46361 46365 46369 46373 46377 46381 46385 46389 46393 46397 46401 46405 46409 46413 46417 46421 46425 46429 46433 46437 46441 46445 46449 46453 46457 46461 46465 46469 46473 46477 46481 46485 46489 46493 46497 46501 46505 46509 46513 46517 46521 46525 46529 46533 46537 46541 46545 46549 46553 46557 46561 46565 46569 46573 46577 46581 46585 46589 46593 46597 46601 46605 46609 46613 46617 46621 46625 46629 46633 46637 46641 46645 46649 46653 46657 46661 46665 46669 46673 46677 46681 46685 46689 46693 46697 46701 46705 46709 46713 46717 46721 46725 46729 46733 46737 46741 46745 46749 46753 46757 46761 46765 46769 46773 46777 46781 46785 46789 46793 46797 46801 46805 46809 46813 46817 46821 46825 46829 46833 46837 46841 46845 46849 46853 46857 46861 46865 46869 46873 46877 46881 46885 46889 46893 46897 46901 46905 46909 46913 46917 46921 46925 46929 46933 46937 46941 46945 46949 46953 46957 46961 46965 46969 46973 46977 46981 46985 46989 46993 46997 47001 47005 47009 47013 47017 47021 47025 47029 47033 47037 47041 47045 47049 47053 47057 47061 47065 47069 47073 47077 47081 47085 47089 47093 47097 47101 47105 47109 47113 47117 47121 47125 47129 47133 47137 47141 47145 47149 47153 47157 47161 47165 47169 47173 47177 47181 47185 47189 47193 47197 47201 47205 47209 47213 47217 47221 47225 47229 47233 47237 47241 47245 47249 47253 47257 47261 47265 47269 47273 47277 47281 47285 47289 47293 47297 47301 47305 47309 47313 47317 47321 47325 47329 47333 47337 47341 47345 47349 47353 47357 47361 47365 47369 47373 47377 47381 47385 47389 47393 47397 47401 47405 47409 47413 47417 47421 47425 47429 47433 47437 47441 47445 47449 47453 47457 47461 47465 47469 47473 47477 47481 47485 47489 47493 47497 47501 47505 47509 47513 47517 47521 47525 47529 47533 47537 47541 47545 47549 47553 47557 47561 47565 47569 47573 47577 47581 47585 47589 47593 47597 47601 47605 47609 47613 47617 47621 47625 47629 47633 47637 47641 47645 47649 47653 47657 47661 47665 47669 47673 47677 47681 47685 47689 47693 47697 47701 47705 47709 47713 47717 47721 47725 47729 47733 47737 47741 47745 47749 47753 47757 47761 47765 47769 47773 47777 47781 47785 47789 47793 47797 47801 47805 47809 47813 47817 47821 47825 47829 47833 47837 47841 47845 47849 47853 47857 47861 47865 47869 47873 47877 47881 47885 47889 47893 47897 47901 47905 47909 47913 47917 47921 47925 47929 47933 47937 47941 47945 47949 47953 47957 47961 47965 47969 47973 47977 47981 47985 47989 47993 47997 48001 48005 48009 48013 48017 48021 48025 48029 48033 48037 48041 48045 48049 48053 48057 48061 48065 48069 48073 48077 48081 48085 48089 48093 48097 48101 48105 48109 48113 48117 48121 48125 48129 48133 48137 48141 48145 48149 48153 48157 48161 48165 48169 48173 48177 48181 48185 48189 48193 48197 48201 48205 48209 48213 48217 48221 48225 48229 48233 48237 48241 48245 48249 48253 48257 48261 48265 48269 48273 48277 48281 48285 48289 48293 48297 48301 48305 48309 48313 48317 48321 48325 48329 48333 48337 48341 48345 48349 48353 48357 48361 48365 48369 48373 48377 48381 48385 48389 48393 48397 48401 48405 48409 48413 48417 48421 48425 48429 48433 48437 48441 48445 48449 48453 48457 48461 48465 48469 48473 48477 48481 48485 48489 48493 48497 48501 48505 48509 48513 48517 48521 48525 48529 48533 48537 48541 48545 48549 48553 48557 48561 48565 48569 48573 48577 48581 48585 48589 48593 48597 48601 48605 48609 48613 48617 48621 48625 48629 48633 48637 48641 48645 48649 48653 48657 48661 48665 48669 48673 48677 48681 48685 48689 48693 48697 48701 48705 48709 48713 48717 48721 48725 48729 48733 48737 48741 48745 48749 48753 48757 48761 48765 48769 48773 48777 48781 48785 48789 48793 48797 48801 48805 48809 48813 48817 48821 48825 48829 48833 48837 48841 48845 48849 48853 48857 48861 48865 48869 48873 48877 48881 48885 48889 48893 48897 48901 48905 48909 48913 48917 48921 48925 48929 48933 48937 48941 48945 48949 48953 48957 48961 48965 48969 48973 48977 48981 48985 48989 48993 48997 49001 49005 49009 49013 49017 49021 49025 49029 49033 49037 49041 49045 49049 49053 49057 49061 49065 49069 49073 49077 49081 49085 49089 49093 49097 49101 49105 49109 49113 49117 49121 49125 49129 49133 49137 49141 49145 49149 49153 49157 49161 49165 49169 49173 49177 49181 49185 49189 49193 49197 49201 49205 49209 49213 49217 49221 49225 49229 49233 49237 49241 49245 49249 49253 49257 49261 49265 49269 49273 49277 49281 49285 49289 49293 49297 49301 49305 49309 49313 49317 49321 49325 49329 49333 49337 49341 49345 49349 49353 49357 49361 49365 49369 49373 49377 49381 49385 49389 49393 49397 49401 49405 49409 49413 49417 49421 49425 49429 49433 49437 49441 49445 49449 49453 49457 49461 49465 49469 49473 49477 49481 49485 49489 49493 49497 49501 49505 49509 49513 49517 49521 49525 49529 49533 49537 49541 49545 49549 49553 49557 49561 49565 49569 49573 49577 49581 49585 49589 49593 49597 49601 49605 49609 49613 49617 49621 49625 49629 49633 49637 49641 49645 49649 49653 49657 49661 49665 49669 49673 49677 49681 49685 49689 49693 49697 49701 49705 49709 49713 49717 49721 49725 49729 49733 49737 49741 49745 49749 49753 49757 49761 49765 49769 49773 49777 49781 49785 49789 49793 49797 49801 49805 49809 49813 49817 49821 49825 49829 49833 49837 49841 49845 49849 49853 49857 49861 49865 49869 49873 49877 49881 49885 49889 49893 49897 49901 49905 49909 49913 49917 49921 49925 49929 49933 49937 49941 49945 49949 49953 49957 49961 49965 49969 49973 49977 49981 49985 49989 49993 49997 50001 50005 50009 50013 50017 50021 50025 50029 50033 50037 50041 50045 50049 50053 50057 50061 50065 50069 50073 50077 50081 50085 50089 50093 50097 50101 50105 50109 50113 50117 50121 50125 50129 50133 50137 50141 50145 50149 50153 50157 50161 50165 50169 50173 50177 50181 50185 50189 50193 50197 50201 50205 50209 50213 50217 50221 50225 50229 50233 50237 50241 50245 50249 50253 50257 50261 50265 50269 50273 50277 50281 50285 50289 50293 50297 50301 50305 50309 50313 50317 50321 50325 50329 50333 50337 50341 50345 50349 50353 50357 50361 50365 50369 50373 50377 50381 50385 50389 50393 50397 50401 50405 50409 50413 50417 50421 50425 50429 50433 50437 50441 50445 50449 50453 50457 50461 50465 50469 50473 50477 50481 50485 50489 50493 50497 50501 50505 50509 50513 50517 50521 50525 50529 50533 50537 50541 50545 50549 50553 50557 50561 50565 50569 50573 50577 50581 50585 50589 50593 50597 50601 50605 50609 50613 50617 50621 50625 50629 50633 50637 50641 50645 50649 50653 50657 50661 50665 50669 50673 50677 50681 50685 50689 50693 50697 50701 50705 50709 50713 50717 50721 50725 50729 50733 50737 50741 50745 50749 50753 50757 50761 50765 50769 50773 50777 50781 50785 50789 50793 50797 50801 50805 50809 50813 50817 50821 50825 50829 50833 50837 50841 50845 50849 50853 50857 50861 50865 50869 50873 50877 50881 50885 50889 50893 50897 50901 50905 50909 50913 50917 50921 50925 50929 50933 50937 50941 50945 50949 50953 50957 50961 50965 50969 50973 50977 50981 50985 50989 50993 50997 51001 51005 51009 51013 51017 51021 51025 51029 51033 51037 51041 51045 51049 51053 51057 51061 51065 51069 51073 51077 51081 51085 51089 51093 51097 51101 51105 51109 51113 51117 51121 51125 51129 51133 51137 51141 51145 51149 51153 51157 51161 51165 51169 51173 51177 51181 51185 51189 51193 51197 51201 51205 51209 51213 51217 51221 51225 51229 51233 51237 51241 51245 51249 51253 51257 51261 51265 51269 51273 51277 51281 51285 51289 51293 51297 51301 51305 51309 51313 51317 51321 51325 51329 51333 51337 51341 51345 51349 51353 51357 51361 51365 51369 51373 51377 51381 51385 51389 51393 51397 51401 51405 51409 51413 51417 51421 51425 51429 51433 51437 51441 51445 51449 51453 51457 51461 51465 51469 51473 51477 51481 51485 51489 51493 51497 51501 51505 51509 51513 51517 51521 51525 51529 51533 51537 51541 51545 51549 51553 51557 51561 51565 51569 51573 51577 51581 51585 51589 51593 51597 51601 51605 51609 51613 51617 51621 51625 51629 51633 51637 51641 51645 51649 51653 51657 51661 51665 51669 51673 51677 51681 51685 51689 51693 51697 51701 51705 51709 51713 51717 51721 51725 51729 51733 51737 51741 51745 51749 51753 51757 51761 51765 51769 51773 51777 51781 51785 51789 51793 51797 51801 51805 51809 51813 51817 51821 51825 51829 51833 51837 51841 51845 51849 51853 51857 51861 51865 51869 51873 51877 51881 51885 51889 51893 51897 51901 51905 51909 51913 51917 51921 51925 51929 51933 51937 51941 51945 51949 51953 51957 51961 51965 51969 51973 51977 51981 51985 51989 51993 51997 52001 52005 52009 52013 52017 52021 52025 52029 52033 52037 52041 52045 52049 52053 52057 52061 52065 52069 52073 52077 52081 52085 52089 52093 52097 52101 52105 52109 52113 52117 52121 52125 52129 52133 52137 52141 52145 52149 52153 52157 52161 52165 52169 52173 52177 52181 52185 52189 52193 52197 52201 52205 52209 52213 52217 52221 52225 52229 52233 52237 52241 52245 52249 52253 52257 52261 52265 52269 52273 52277 52281 52285 52289 52293 52297 52301 52305 52309 52313 52317 52321 52325 52329 52333 52337 52341 52345 52349 52353 52357 52361 52365 52369 52373 52377 52381 52385 52389 52393 52397 52401 52405 52409 52413 52417 52421 52425 52429 52433 52437 52441 52445 52449 52453 52457 52461 52465 52469 52473 52477 52481 52485 52489 52493 52497 52501 52505 52509 52513 52517 52521 52525 52529 52533 52537 52541 52545 52549 52553 52557 52561 52565 52569 52573 52577 52581 52585 52589 52593 52597 52601 52605 52609 52613 52617 52621 52625 52629 52633 52637 52641 52645 52649 52653 52657 52661 52665 52669 52673 52677 52681 52685 52689 52693 52697 52701 52705 52709 52713 52717 52721 52725 52729 52733 52737 52741 52745 52749 52753 52757 52761 52765 52769 52773 52777 52781 52785 52789 52793 52797 52801 52805 52809 52813 52817 52821 52825 52829 52833 52837 52841 52845 52849 52853 52857 52861 52865 52869 52873 52877 52881 52885 52889 52893 52897 52901 52905 52909 52913 52917 52921 52925 52929 52933 52937 52941 52945 52949 52953 52957 52961 52965 52969 52973 52977 52981 52985 52989 52993 52997 53001 53005 53009 53013 53017 53021 53025 53029 53033 53037 53041 53045 53049 53053 53057 53061 53065 53069 53073 53077 53081 53085 53089 53093 53097 53101 53105 53109 53113 53117 53121 53125 53129 53133 53137 53141 53145 53149 53153 53157 53161 53165 53169 53173 53177 53181 53185 53189 53193 53197 53201 53205 53209 53213 53217 53221 53225 53229 53233 53237 53241 53245 53249 53253 53257 53261 53265 53269 53273 53277 53281 53285 53289 53293 53297 53301 53305 53309 53313 53317 53321 53325 53329 53333 53337 53341 53345 53349 53353 53357 53361 53365 53369 53373 53377 53381 53385 53389 53393 53397 53401 53405 53409 53413 53417 53421 53425 53429 53433 53437 53441 53445 53449 53453 53457 53461 53465 53469 53473 53477 53481 53485 53489 53493 53497 53501 53505 53509 53513 53517 53521 53525 53529 53533 53537 53541 53545 53549 53553 53557 53561 53565 53569 53573 53577 53581 53585 53589 53593 53597 53601 53605 53609 53613 53617 53621 53625 53629 53633 53637 53641 53645 53649 53653 53657 53661 53665 53669 53673 53677 53681 53685 53689 53693 53697 53701 53705 53709 53713 53717 53721 53725 53729 53733 53737 53741 53745 53749 53753 53757 53761 53765 53769 53773 53777 53781 53785 53789 53793 53797 53801 53805 53809 53813 53817 53821 53825 53829 53833 53837 53841 53845 53849 53853 53857 53861 53865 53869 53873 53877 53881 53885 53889 53893 53897 53901 53905 53909 53913 53917 53921 53925 53929 53933 53937 53941 53945 53949 53953 53957 53961 53965 53969 53973 53977 53981 53985 53989 53993 53997 54001 54005 54009 54013 54017 54021 54025 54029 54033 54037 54041 54045 54049 54053 54057 54061 54065 54069 54073 54077 54081 54085 54089 54093 54097 54101 54105 54109 54113 54117 54121 54125 54129 54133 54137 54141 54145 54149 54153 54157 54161 54165 54169 54173 54177 54181 54185 54189 54193 54197 54201 54205 54209 54213 54217 54221 54225 54229 54233 54237 54241 54245 54249 54253 54257 54261 54265 54269 54273 54277 54281 54285 54289 54293 54297 54301 54305 54309 54313 54317 54321 54325 54329 54333 54337 54341 54345 54349 54353 54357 54361 54365 54369 54373 54377 54381 54385 54389 54393 54397 54401 54405 54409 54413 54417 54421 54425 54429 54433 54437 54441 54445 54449 54453 54457 54461 54465 54469 54473 54477 54481 54485 54489 54493 54497 54501 54505 54509 54513 54517 54521 54525 54529 54533 54537 54541 54545 54549 54553 54557 54561 54565 54569 54573 54577 54581 54585 54589 54593 54597 54601 54605 54609 54613 54617 54621 54625 54629 54633 54637 54641 54645 54649 54653 54657 54661 54665 54669 54673 54677 54681 54685 54689 54693 54697 54701 54705 54709 54713 54717 54721 54725 54729 54733 54737 54741 54745 54749 54753 54757 54761 54765 54769 54773 54777 54781 54785 54789 54793 54797 54801 54805 54809 54813 54817 54821 54825 54829 54833 54837 54841 54845 54849 54853 54857 54861 54865 54869 54873 54877 54881 54885 54889 54893 54897 54901 54905 54909 54913 54917 54921 54925 54929 54933 54937 54941 54945 54949 54953 54957 54961 54965 54969 54973 54977 54981 54985 54989 54993 54997 55001 55005 55009 55013 55017 55021 55025 55029 55033 55037 55041 55045 55049 55053 55057 55061 55065 55069 55073 55077 55081 55085 55089 55093 55097 55101 55105 55109 55113 55117 55121 55125 55129 55133 55137 55141 55145 55149 55153 55157 55161 55165 55169 55173 55177 55181 55185 55189 55193 55197 55201 55205 55209 55213 55217 55221 55225 55229 55233 55237 55241 55245 55249 55253 55257 55261 55265 55269 55273 55277 55281 55285 55289 55293 55297 55301 55305 55309 55313 55317 55321 55325 55329 55333 55337 55341 55345 55349 55353 55357 55361 55365 55369 55373 55377 55381 55385 55389 55393 55397 55401 55405 55409 55413 55417 55421 55425 55429 55433 55437 55441 55445 55449 55453 55457 55461 55465 55469 55473 55477 55481 55485 55489 55493 55497 55501 55505 55509 55513 55517 55521 55525 55529 55533 55537 55541 55545 55549 55553 55557 55561 55565 55569 55573 55577 55581 55585 55589 55593 55597 55601 55605 55609 55613 55617 55621 55625 55629 55633 55637 55641 55645 55649 55653 55657 55661 55665 55669 55673 55677 55681 55685 55689 55693 55697 55701 55705 55709 55713 55717 55721 55725 55729 55733 55737 55741 55745 55749 55753 55757 55761 55765 55769 55773 55777 55781 55785 55789 55793 55797 55801 55805 55809 55813 55817 55821 55825 55829 55833 55837 55841 55845 55849 55853 55857 55861 55865 55869 55873 55877 55881 55885 55889 55893 55897 55901 55905 55909 55913 55917 55921 55925 55929 55933 55937 55941 55945 55949 55953 55957 55961 55965 55969 55973 55977 55981 55985 55989 55993 55997 56001 56005 56009 56013 56017 56021 56025 56029 56033 56037 56041 56045 56049 56053 56057 56061 56065 56069 56073 56077 56081 56085 56089 56093 56097 56101 56105 56109 56113 56117 56121 56125 56129 56133 56137 56141 56145 56149 56153 56157 56161 56165 56169 56173 56177 56181 56185 56189 56193 56197 56201 56205 56209 56213 56217 56221 56225 56229 56233 56237 56241 56245 56249 56253 56257 56261 56265 56269 56273 56277 56281 56285 56289 56293 56297 56301 56305 56309 56313 56317 56321 56325 56329 56333 56337 56341 56345 56349 56353 56357 56361 56365 56369 56373 56377 56381 56385 56389 56393 56397 56401 56405 56409 56413 56417 56421 56425 56429 56433 56437 56441 56445 56449 56453 56457 56461 56465 56469 56473 56477 56481 56485 56489 56493 56497 56501 56505 56509 56513 56517 56521 56525 56529 56533 56537 56541 56545 56549 56553 56557 56561 56565 56569 56573 56577 56581 56585 56589 56593 56597 56601 56605 56609 56613 56617 56621 56625 56629 56633 56637 56641 56645 56649 56653 56657 56661 56665 56669 56673 56677 56681 56685 56689 56693 56697 56701 56705 56709 56713 56717 56721 56725 56729 56733 56737 56741 56745 56749 56753 56757 56761 56765 56769 56773 56777 56781 56785 56789 56793 56797 56801 56805 56809 56813 56817 56821 56825 56829 56833 56837 56841 56845 56849 56853 56857 56861 56865 56869 56873 56877 56881 56885 56889 56893 56897 56901 56905 56909 56913 56917 56921 56925 56929 56933 56937 56941 56945 56949 56953 56957 56961 56965 56969 56973 56977 56981 56985 56989 56993 56997 57001 57005 57009 57013 57017 57021 57025 57029 57033 57037 57041 57045 57049 57053 57057 57061 57065 57069 57073 57077 57081 57085 57089 57093 57097 57101 57105 57109 57113 57117 57121 57125 57129 57133 57137 57141 57145 57149 57153 57157 57161 57165 57169 57173 57177 57181 57185 57189 57193 57197 57201 57205 57209 57213 57217 57221 57225 57229 57233 57237 57241 57245 57249 57253 57257 57261 57265 57269 57273 57277 57281 57285 57289 57293 57297 57301 57305 57309 57313 57317 57321 57325 57329 57333 57337 57341 57345 57349 57353 57357 57361 57365 57369 57373 57377 57381 57385 57389 57393 57397 57401 57405 57409 57413 57417 57421 57425 57429 57433 57437 57441 57445 57449 57453 57457 57461 57465 57469 57473 57477 57481 57485 57489 57493 57497 57501 57505 57509 57513 57517 57521 57525 57529 57533 57537 57541 57545 57549 57553 57557 57561 57565 57569 57573 57577 57581 57585 57589 57593 57597 57601 57605 57609 57613 57617 57621 57625 57629 57633 57637 57641 57645 57649 57653 57657 57661 57665 57669 57673 57677 57681 57685 57689 57693 57697 57701 57705 57709 57713 57717 57721 57725 57729 57733 57737 57741 57745 57749 57753 57757 57761 57765 57769 57773 57777 57781 57785 57789 57793 57797 57801 57805 57809 57813 57817 57821 57825 57829 57833 57837 57841 57845 57849 57853 57857 57861 57865 57869 57873 57877 57881 57885 57889 57893 57897 57901 57905 57909 57913 57917 57921 57925 57929 57933 57937 57941 57945 57949 57953 57957 57961 57965 57969 57973 57977 57981 57985 57989 57993 57997 58001 58005 58009 58013 58017 58021 58025 58029 58033 58037 58041 58045 58049 58053 58057 58061 58065 58069 58073 58077 58081 58085 58089 58093 58097 58101 58105 58109 58113 58117 58121 58125 58129 58133 58137 58141 58145 58149 58153 58157 58161 58165 58169 58173 58177 58181 58185 58189 58193 58197 58201 58205 58209 58213 58217 58221 58225 58229 58233 58237 58241 58245 58249 58253 58257 58261 58265 58269 58273 58277 58281 58285 58289 58293 58297 58301 58305 58309 58313 58317 58321 58325 58329 58333 58337 58341 58345 58349 58353 58357 58361 58365 58369 58373 58377 58381 58385 58389 58393 58397 58401 58405 58409 58413 58417 58421 58425 58429 58433 58437 58441 58445 58449 58453 58457 58461 58465 58469 58473 58477 58481 58485 58489 58493 58497 58501 58505 58509 58513 58517 58521 58525 58529 58533 58537 58541 58545 58549 58553 58557 58561 58565 58569 58573 58577 58581 58585 58589 58593 58597 58601 58605 58609 58613 58617 58621 58625 58629 58633 58637 58641 58645 58649 58653 58657 58661 58665 58669 58673 58677 58681 58685 58689 58693 58697 58701 58705 58709 58713 58717 58721 58725 58729 58733 58737 58741 58745 58749 58753 58757 58761 58765 58769 58773 58777 58781 58785 58789 58793 58797 58801 58805 58809 58813 58817 58821 58825 58829 58833 58837 58841 58845 58849 58853 58857 58861 58865 58869 58873 58877 58881 58885 58889 58893 58897 58901 58905 58909 58913 58917 58921 58925 58929 58933 58937 58941 58945 58949 58953 58957 58961 58965 58969 58973 58977 58981 58985 58989 58993 58997 59001 59005 59009 59013 59017 59021 59025 59029 59033 59037 59041 59045 59049 59053 59057 59061 59065 59069 59073 59077 59081 59085 59089 59093 59097 59101 59105 59109 59113 59117 59121 59125 59129 59133 59137 59141 59145 59149 59153 59157 59161 59165 59169 59173 59177 59181 59185 59189 59193 59197 59201 59205 59209 59213 59217 59221 59225 59229 59233 59237 59241 59245 59249 59253 59257 59261 59265 59269 59273 59277 59281 59285 59289 59293 59297 59301 59305 59309 59313 59317 59321 59325 59329 59333 59337 59341 59345 59349 59353 59357 59361 59365 59369 59373 59377 59381 59385 59389 59393 59397 59401 59405 59409 59413 59417 59421 59425 59429 59433 59437 59441 59445 59449 59453 59457 59461 59465 59469 59473 59477 59481 59485 59489 59493 59497 59501 59505 59509 59513 59517 59521 59525 59529 59533 59537 59541 59545 59549 59553 59557 59561 59565 59569 59573 59577 59581 59585 59589 59593 59597 59601 59605 59609 59613 59617 59621 59625 59629 59633 59637 59641 59645 59649 59653 59657 59661 59665 59669 59673 59677 59681 59685 59689 59693 59697 59701 59705 59709 59713 59717 59721 59725 59729 59733 59737 59741 59745 59749 59753 59757 59761 59765 59769 59773 59777 59781 59785 59789 59793 59797 59801 59805 59809 59813 59817 59821 59825 59829 59833 59837 59841 59845 59849 59853 59857 59861 59865 59869 59873 59877 59881 59885 59889 59893 59897 59901 59905 59909 59913 59917 59921 59925 59929 59933 59937 59941 59945 59949 59953 59957 59961 59965 59969 59973 59977 59981 59985 59989 59993 59997 60001 60005 60009 60013 60017 60021 60025 60029 60033 60037 60041 60045 60049 60053 60057 60061 60065 60069 60073 60077 60081 60085 60089 60093 60097 60101 60105 60109 60113 60117 60121 60125 60129 60133 60137 60141 60145 60149 60153 60157 60161 60165 60169 60173 60177 60181 60185 60189 60193 60197 60201 60205 60209 60213 60217 60221 60225 60229 60233 60237 60241 60245 60249 60253 60257 60261 60265 60269 60273 60277 60281 60285 60289 60293 60297 60301 60305 60309 60313 60317 60321 60325 60329 60333 60337 60341 60345 60349 60353 60357 60361 60365 60369 60373 60377 60381 60385 60389 60393 60397 60401 60405 60409 60413 60417 60421 60425 60429 60433 60437 60441 60445 60449 60453 60457 60461 60465 60469 60473 60477 60481 60485 60489 60493 60497 60501 60505 60509 60513 60517 60521 60525 60529 60533 60537 60541 60545 60549 60553 60557 60561 60565 60569 60573 60577 60581 60585 60589 60593 60597 60601 60605 60609 60613 60617 60621 60625 60629 60633 60637 60641 60645 60649 60653 60657 60661 60665 60669 60673 60677 60681 60685 60689 60693 60697 60701 60705 60709 60713 60717 60721 60725 60729 60733 60737 60741 60745 60749 60753 60757 60761 60765 60769 60773 60777 60781 60785 60789 60793 60797 60801 60805 60809 60813 60817 60821 60825 60829 60833 60837 60841 60845 60849 60853 60857 60861 60865 60869 60873 60877 60881 60885 60889 60893 60897 60901 60905 60909 60913 60917 60921 60925 60929 60933 60937 60941 60945 60949 60953 60957 60961 60965 60969 60973 60977 60981 60985 60989 60993 60997 61001 61005 61009 61013 61017 61021 61025 61029 61033 61037 61041 61045 61049 61053 61057 61061 61065 61069 61073 61077 61081 61085 61089 61093 61097 61101 61105 61109 61113 61117 61121 61125 61129 61133 61137 61141 61145 61149 61153 61157 61161 61165 61169 61173 61177 61181 61185 61189 61193 61197 61201 61205 61209 61213 61217 61221 61225 61229 61233 61237 61241 61245 61249 61253 61257 61261 61265 61269 61273 61277 61281 61285 61289 61293 61297 61301 61305 61309 61313 61317 61321 61325 61329 61333 61337 61341 61345 61349 61353 61357 61361 61365 61369 61373 61377 61381 61385 61389 61393 61397 61401 61405 61409 61413 61417 61421 61425 61429 61433 61437 61441 61445 61449 61453 61457 61461 61465 61469 61473 61477 61481 61485 61489 61493 61497 61501 61505 61509 61513 61517 61521 61525 61529 61533 61537 61541 61545 61549 61553 61557 61561 61565 61569 61573 61577 61581 61585 61589 61593 61597 61601 61605 61609 61613 61617 61621 61625 61629 61633 61637 61641 61645 61649 61653 61657 61661 61665 61669 61673 61677 61681 61685 61689 61693 61697 61701 61705 61709 61713 61717 61721 61725 61729 61733 61737 61741 61745 61749 61753 61757 61761 61765 61769 61773 61777 61781 61785 61789 61793 61797 61801 61805 61809 61813 61817 61821 61825 61829 61833 61837 61841 61845 61849 61853 61857 61861 61865 61869 61873 61877 61881 61885 61889 61893 61897 61901 61905 61909 61913 61917 61921 61925 61929 61933 61937 61941 61945 61949 61953 61957 61961 61965 61969 61973 61977 61981 61985 61989 61993 61997 62001 62005 62009 62013 62017 62021 62025 62029 62033 62037 62041 62045 62049 62053 62057 62061 62065 62069 62073 62077 62081 62085 62089 62093 62097 62101 62105 62109 62113 62117 62121 62125 62129 62133 62137 62141 62145 62149 62153 62157 62161 62165 62169 62173 62177 62181 62185 62189 62193 62197 62201 62205 62209 62213 62217 62221 62225 62229 62233 62237 62241 62245 62249 62253 62257 62261 62265 62269 62273 62277 62281 62285 62289 62293 62297 62301 62305 62309 62313 62317 62321 62325 62329 62333 62337 62341 62345 62349 62353 62357 62361 62365 62369 62373 62377 62381 62385 62389 62393 62397 62401 62405 62409 62413 62417 62421 62425 62429 62433 62437 62441 62445 62449 62453 62457 62461 62465 62469 62473 62477 62481 62485 62489 62493 62497 62501 62505 62509 62513 62517 62521 62525 62529 62533 62537 62541 62545 62549 62553 62557 62561 62565 62569 62573 62577 62581 62585 62589 62593 62597 62601 62605 62609 62613 62617 62621 62625 62629 62633 62637 62641 62645 62649 62653 62657 62661 62665 62669 62673 62677 62681 62685 62689 62693 62697 62701 62705 62709 62713 62717 62721 62725 62729 62733 62737 62741 62745 62749 62753 62757 62761 62765 62769 62773 62777 62781 62785 62789 62793 62797 62801 62805 62809 62813 62817 62821 62825 62829 62833 62837 62841 62845 62849 62853 62857 62861 62865 62869 62873 62877 62881 62885 62889 62893 62897 62901 62905 62909 62913 62917 62921 62925 62929 62933 62937 62941 62945 62949 62953 62957 62961 62965 62969 62973 62977 62981 62985 62989 62993 62997 63001 63005 63009 63013 63017 63021 63025 63029 63033 63037 63041 63045 63049 63053 63057 63061 63065 63069 63073 63077 63081 63085 63089 63093 63097 63101 63105 63109 63113 63117 63121 63125 63129 63133 63137 63141 63145 63149 63153 63157 63161 63165 63169 63173 63177 63181 63185 63189 63193 63197 63201 63205 63209 63213 63217 63221 63225 63229 63233 63237 63241 63245 63249 63253 63257 63261 63265 63269 63273 63277 63281 63285 63289 63293 63297 63301 63305 63309 63313 63317 63321 63325 63329 63333 63337 63341 63345 63349 63353 63357 63361 63365 63369 63373 63377 63381 63385 63389 63393 63397 63401 63405 63409 63413 63417 63421 63425 63429 63433 63437 63441 63445 63449 63453 63457 63461 63465 63469 63473 63477 63481 63485 63489 63493 63497 63501 63505 63509 63513 63517 63521 63525 63529 63533 63537 63541 63545 63549 63553 63557 63561 63565 63569 63573 63577 63581 63585 63589 63593 63597 63601 63605 63609 63613 63617 63621 63625 63629 63633 63637 63641 63645 63649 63653 63657 63661 63665 63669 63673 63677 63681 63685 63689 63693 63697 63701 63705 63709 63713 63717 63721 63725 63729 63733 63737 63741 63745 63749 63753 63757 63761 63765 63769 63773 63777 63781 63785 63789 63793 63797 63801 63805 63809 63813 63817 63821 63825 63829 63833 63837 63841 63845 63849 63853 63857 63861 63865 63869 63873 63877 63881 63885 63889 63893 63897 63901 63905 63909 63913 63917 63921 63925 63929 63933 63937 63941 63945 63949 63953 63957 63961 63965 63969 63973 63977 63981 63985 63989 63993 63997 64001 64005 64009 64013 64017 64021 64025 64029 64033 64037 64041 64045 64049 64053 64057 64061 64065 64069 64073 64077 64081 64085 64089 64093 64097 64101 64105 64109 64113 64117 64121 64125 64129 64133 64137 64141 64145 64149 64153 64157 64161 64165 64169 64173 64177 64181 64185 64189 64193 64197 64201 64205 64209 64213 64217 64221 64225 64229 64233 64237 64241 64245 64249 64253 64257 64261 64265 64269 64273 64277 64281 64285 64289 64293 64297 64301 64305 64309 64313 64317 64321 64325 64329 64333 64337 64341 64345 64349 64353 64357 64361 64365 64369 64373 64377 64381 64385 64389 64393 64397 64401 64405 64409 64413 64417 64421 64425 64429 64433 64437 64441 64445 64449 64453 64457 64461 64465 64469 64473 64477 64481 64485 64489 64493 64497 64501 64505 64509 64513 64517 64521 64525 64529 64533 64537 64541 64545 64549 64553 64557 64561 64565 64569 64573 64577 64581 64585 64589 64593 64597 64601 64605 64609 64613 64617 64621 64625 64629 64633 64637 64641 64645 64649 64653 64657 64661 64665 64669 64673 64677 64681 64685 64689 64693 64697 64701 64705 64709 64713 64717 64721 64725 64729 64733 64737 64741 64745 64749 64753 64757 64761 64765 64769 64773 64777 64781 64785 64789 64793 64797 64801 64805 64809 64813 64817 64821 64825 64829 64833 64837 64841 64845 64849 64853 64857 64861 64865 64869 64873 64877 64881 64885 64889 64893 64897 64901 64905 64909 64913 64917 64921 64925 64929 64933 64937 64941 64945 64949 64953 64957 64961 64965 64969 64973 64977 64981 64985 64989 64993 64997 65001 65005 65009 65013 65017 65021 65025 65029 65033 65037 65041 65045 65049 65053 65057 65061 65065 65069 65073 65077 65081 65085 65089 65093 65097 65101 65105 65109 65113 65117 65121 65125 65129 65133 65137 65141 65145 65149 65153 65157 65161 65165 65169 65173 65177 65181 65185 65189 65193 65197 65201 65205 65209 65213 65217 65221 65225 65229 65233 65237 65241 65245 65249 65253 65257 65261 65265 65269 65273 65277 65281 65285 65289 65293 65297 65301 65305 65309 65313 65317 65321 65325 65329 65333 65337 65341 65345 65349 65353 65357 65361 65365 65369 65373 65377 65381 65385 65389 65393 65397 65401 65405 65409 65413 65417 65421 65425 65429 65433 65437 65441 65445 65449 65453 65457 65461 65465 65469 65473 65477 65481 65485 65489 65493 65497 65501 65505 65509 65513 65517 65521 65525 65529 65533 65537 65541 65545 65549 65553 65557 65561 65565 65569 65573 65577 65581 65585 65589 65593 65597 65601 65605 65609 65613 65617 65621 65625 65629 65633 65637 65641 65645 65649 65653 65657 65661 65665 65669 65673 65677 65681 65685 65689 65693 65697 65701 65705 65709 65713 65717 65721 65725 65729 65733 65737 65741 65745 65749 65753 65757 65761 65765 65769 65773 65777 65781 65785 65789 65793 65797 65801 65805 65809 65813 65817 65821 65825 65829 65833 65837 65841 65845 65849 65853 65857 65861 65865 65869 65873 65877 65881 65885 65889 65893 65897 65901 65905 65909 65913 65917 65921 65925 65929 65933 65937 65941 65945 65949 65953 65957 65961 65965 65969 65973 65977 65981 65985 65989 65993 65997 66001 66005 66009 66013 66017 66021 66025 66029 66033 66037 66041 66045 66049 66053 66057 66061 66065 66069 66073 66077 66081 66085 66089 66093 66097 66101 66105 66109 66113 66117 66121 66125 66129 66133 66137 66141 66145 66149 66153 66157 66161 66165 66169 66173 66177 66181 66185 66189 66193 66197 66201 66205 66209 66213 66217 66221 66225 66229 66233 66237 66241 66245 66249 66253 66257 66261 66265 66269 66273 66277 66281 66285 66289 66293 66297 66301 66305 66309 66313 66317 66321 66325 66329 66333 66337 66341 66345 66349 66353 66357 66361 66365 66369 66373 66377 66381 66385 66389 66393 66397 66401 66405 66409 66413 66417 66421 66425 66429 66433 66437 66441 66445 66449 66453 66457 66461 66465 66469 66473 66477 66481 66485 66489 66493 66497 66501 66505 66509 66513 66517 66521 66525 66529 66533 66537 66541 66545 66549 66553 66557 66561 66565 66569 66573 66577 66581 66585 66589 66593 66597 66601 66605 66609 66613 66617 66621 66625 66629 66633 66637 66641 66645 66649 66653 66657 66661 66665 66669 66673 66677 66681 66685 66689 66693 66697 66701 66705 66709 66713 66717 66721 66725 66729 66733 66737 66741 66745 66749 66753 66757 66761 66765 66769 66773 66777 66781 66785 66789 66793 66797 66801 66805 66809 66813 66817 66821 66825 66829 66833 66837 66841 66845 66849 66853 66857 66861 66865 66869 66873 66877 66881 66885 66889 66893 66897 66901 66905 66909 66913 66917 66921 66925 66929 66933 66937 66941 66945 66949 66953 66957 66961 66965 66969 66973 66977 66981 66985 66989 66993 66997 67001 67005 67009 67013 67017 67021 67025 67029 67033 67037 67041 67045 67049 67053 67057 67061 67065 67069 67073 67077 67081 67085 67089 67093 67097 67101 67105 67109 67113 67117 67121 67125 67129 67133 67137 67141 67145 67149 67153 67157 67161 67165 67169 67173 67177 67181 67185 67189 67193 67197 67201 67205 67209 67213 67217 67221 67225 67229 67233 67237 67241 67245 67249 67253 67257 67261 67265 67269 67273 67277 67281 67285 67289 67293 67297 67301 67305 67309 67313 67317 67321 67325 67329 67333 67337 67341 67345 67349 67353 67357 67361 67365 67369 67373 67377 67381 67385 67389 67393 67397 67401 67405 67409 67413 67417 67421 67425 67429 67433 67437 67441 67445 67449 67453 67457 67461 67465 67469 67473 67477 67481 67485 67489 67493 67497 67501 67505 67509 67513 67517 67521 67525 67529 67533 67537 67541 67545 67549 67553 67557 67561 67565 67569 67573 67577 67581 67585 67589 67593 67597 67601 67605 67609 67613 67617 67621 67625 67629 67633 67637 67641 67645 67649 67653 67657 67661 67665 67669 67673 67677 67681 67685 67689 67693 67697 67701 67705 67709 67713 67717 67721 67725 67729 67733 67737 67741 67745 67749 67753 67757 67761 67765 67769 67773 67777 67781 67785 67789 67793 67797 67801 67805 67809 67813 67817 67821 67825 67829 67833 67837 67841 67845 67849 67853 67857 67861 67865 67869 67873 67877 67881 67885 67889 67893 67897 67901 67905 67909 67913 67917 67921 67925 67929 67933 67937 67941 67945 67949 67953 67957 67961 67965 67969 67973 67977 67981 67985 67989 67993 67997 68001 68005 68009 68013 68017 68021 68025 68029 68033 68037 68041 68045 68049 68053 68057 68061 68065 68069 68073 68077 68081 68085 68089 68093 68097 68101 68105 68109 68113 68117 68121 68125 68129 68133 68137 68141 68145 68149 68153 68157 68161 68165 68169 68173 68177 68181 68185 68189 68193 68197 68201 68205 68209 68213 68217 68221 68225 68229 68233 68237 68241 68245 68249 68253 68257 68261 68265 68269 68273 68277 68281 68285 68289 68293 68297 68301 68305 68309 68313 68317 68321 68325 68329 68333 68337 68341 68345 68349 68353 68357 68361 68365 68369 68373 68377 68381 68385 68389 68393 68397 68401 68405 68409 68413 68417 68421 68425 68429 68433 68437 68441 68445 68449 68453 68457 68461 68465 68469 68473 68477 68481 68485 68489 68493 68497 68501 68505 68509 68513 68517 68521 68525 68529 68533 68537 68541 68545 68549 68553 68557 68561 68565 68569 68573 68577 68581 68585 68589 68593 68597 68601 68605 68609 68613 68617 68621 68625 68629 68633 68637 68641 68645 68649 68653 68657 68661 68665 68669 68673 68677 68681 68685 68689 68693 68697 68701 68705 68709 68713 68717 68721 68725 68729 68733 68737 68741 68745 68749 68753 68757 68761 68765 68769 68773 68777 68781 68785 68789 68793 68797 68801 68805 68809 68813 68817 68821 68825 68829 68833 68837 68841 68845 68849 68853 68857 68861 68865 68869 68873 68877 68881 68885 68889 68893 68897 68901 68905 68909 68913 68917 68921 68925 68929 68933 68937 68941 68945 68949 68953 68957 68961 68965 68969 68973 68977 68981 68985 68989 68993 68997 69001 69005 69009 69013 69017 69021 69025 69029 69033 69037 69041 69045 69049 69053 69057 69061 69065 69069 69073 69077 69081 69085 69089 69093 69097 69101 69105 69109 69113 69117 69121 69125 69129 69133 69137 69141 69145 69149 69153 69157 69161 69165 69169 69173 69177 69181 69185 69189 69193 69197 69201 69205 69209 69213 69217 69221 69225 69229 69233 69237 69241 69245 69249 69253 69257 69261 69265 69269 69273 69277 69281 69285 69289 69293 69297 69301 69305 69309 69313 69317 69321 69325 69329 69333 69337 69341 69345 69349 69353 69357 69361 69365 69369 69373 69377 69381 69385 69389 69393 69397 69401 69405 69409 69413 69417 69421 69425 69429 69433 69437 69441 69445 69449 69453 69457 69461 69465 69469 69473 69477 69481 69485 69489 69493 69497 69501 69505 69509 69513 69517 69521 69525 69529 69533 69537 69541 69545 69549 69553 69557 69561 69565 69569 69573 69577 69581 69585 69589 69593 69597 69601 69605 69609 69613 69617 69621 69625 69629 69633 69637 69641 69645 69649 69653 69657 69661 69665 69669 69673 69677 69681 69685 69689 69693 69697 69701 69705 69709 69713 69717 69721 69725 69729 69733 69737 69741 69745 69749 69753 69757 69761 69765 69769 69773 69777 69781 69785 69789 69793 69797 69801 69805 69809 69813 69817 69821 69825 69829 69833 69837 69841 69845 69849 69853 69857 69861 69865 69869 69873 69877 69881 69885 69889 69893 69897 69901 69905 69909 69913 69917 69921 69925 69929 69933 69937 69941 69945 69949 69953 69957 69961 69965 69969 69973 69977 69981 69985 69989 69993 69997 70001 70005 70009 70013 70017 70021 70025 70029 70033 70037 70041 70045 70049 70053 70057 70061 70065 70069 70073 70077 70081 70085 70089 70093 70097 70101 70105 70109 70113 70117 70121 70125 70129 70133 70137 70141 70145 70149 70153 70157 70161 70165 70169 70173 70177 70181 70185 70189 70193 70197 70201 70205 70209 70213 70217 70221 70225 70229 70233 70237 70241 70245 70249 70253 70257 70261 70265 70269 70273 70277 70281 70285 70289 70293 70297 70301 70305 70309 70313 70317 70321 70325 70329 70333 70337 70341 70345 70349 70353 70357 70361 70365 70369 70373 70377 70381 70385 70389 70393 70397 70401 70405 70409 70413 70417 70421 70425 70429 70433 70437 70441 70445 70449 70453 70457 70461 70465 70469 70473 70477 70481 70485 70489 70493 70497 70501 70505 70509 70513 70517 70521 70525 70529 70533 70537 70541 70545 70549 70553 70557 70561 70565 70569 70573 70577 70581 70585 70589 70593 70597 70601 70605 70609 70613 70617 70621 70625 70629 70633 70637 70641 70645 70649 70653 70657 70661 70665 70669 70673 70677 70681 70685 70689 70693 70697 70701 70705 70709 70713 70717 70721 70725 70729 70733 70737 70741 70745 70749 70753 70757 70761 70765 70769 70773 70777 70781 70785 70789 70793 70797 70801 70805 70809 70813 70817 70821 70825 70829 70833 70837 70841 70845 70849 70853 70857 70861 70865 70869 70873 70877 70881 70885 70889 70893 70897 70901 70905 70909 70913 70917 70921 70925 70929 70933 70937 70941 70945 70949 70953 70957 70961 70965 70969 70973 70977 70981 70985 70989 70993 70997 71001 71005 71009 71013 71017 71021 71025 71029 71033 71037 71041 71045 71049 71053 71057 71061 71065 71069 71073 71077 71081 71085 71089 71093 71097 71101 71105 71109 71113 71117 71121 71125 71129 71133 71137 71141 71145 71149 71153 71157 71161 71165 71169 71173 71177 71181 71185 71189 71193 71197 71201 71205 71209 71213 71217 71221 71225 71229 71233 71237 71241 71245 71249 71253 71257 71261 71265 71269 71273 71277 71281 71285 71289 71293 71297 71301 71305 71309 71313 71317 71321 71325 71329 71333 71337 71341 71345 71349 71353 71357 71361 71365 71369 71373 71377 71381 71385 71389 71393 71397 71401 71405 71409 71413 71417 71421 71425 71429 71433 71437 71441 71445 71449 71453 71457 71461 71465 71469 71473 71477 71481 71485 71489 71493 71497 71501 71505 71509 71513 71517 71521 71525 71529 71533 71537 71541 71545 71549 71553 71557 71561 71565 71569 71573 71577 71581 71585 71589 71593 71597 71601 71605 71609 71613 71617 71621 71625 71629 71633 71637 71641 71645 71649 71653 71657 71661 71665 71669 71673 71677 71681 71685 71689 71693 71697 71701 71705 71709 71713 71717 71721 71725 71729 71733 71737 71741 71745 71749 71753 71757 71761 71765 71769 71773 71777 71781 71785 71789 71793 71797 71801 71805 71809 71813 71817 71821 71825 71829 71833 71837 71841 71845 71849 71853 71857 71861 71865 71869 71873 71877 71881 71885 71889 71893 71897 71901 71905 71909 71913 71917 71921 71925 71929 71933 71937 71941 71945 71949 71953 71957 71961 71965 71969 71973 71977 71981 71985 71989 71993 71997 72001 72005 72009 72013 72017 72021 72025 72029 72033 72037 72041 72045 72049 72053 72057 72061 72065 72069 72073 72077 72081 72085 72089 72093 72097 72101 72105 72109 72113 72117 72121 72125 72129 72133 72137 72141 72145 72149 72153 72157 72161 72165 72169 72173 72177 72181 72185 72189 72193 72197 72201 72205 72209 72213 72217 72221 72225 72229 72233 72237 72241 72245 72249 72253 72257 72261 72265 72269 72273 72277 72281 72285 72289 72293 72297 72301 72305 72309 72313 72317 72321 72325 72329 72333 72337 72341 72345 72349 72353 72357 72361 72365 72369 72373 72377 72381 72385 72389 72393 72397 72401 72405 72409 72413 72417 72421 72425 72429 72433 72437 72441 72445 72449 72453 72457 72461 72465 72469 72473 72477 72481 72485 72489 72493 72497 72501 72505 72509 72513 72517 72521 72525 72529 72533 72537 72541 72545 72549 72553 72557 72561 72565 72569 72573 72577 72581 72585 72589 72593 72597 72601 72605 72609 72613 72617 72621 72625 72629 72633 72637 72641 72645 72649 72653 72657 72661 72665 72669 72673 72677 72681 72685 72689 72693 72697 72701 72705 72709 72713 72717 72721 72725 72729 72733 72737 72741 72745 72749 72753 72757 72761 72765 72769 72773 72777 72781 72785 72789 72793 72797 72801 72805 72809 72813 72817 72821 72825 72829 72833 72837 72841 72845 72849 72853 72857 72861 72865 72869 72873 72877 72881 72885 72889 72893 72897 72901 72905 72909 72913 72917 72921 72925 72929 72933 72937 72941 72945 72949 72953 72957 72961 72965 72969 72973 72977 72981 72985 72989 72993 72997 73001 73005 73009 73013 73017 73021 73025 73029 73033 73037 73041 73045 73049 73053 73057 73061 73065 73069 73073 73077 73081 73085 73089 73093 73097 73101 73105 73109 73113 73117 73121 73125 73129 73133 73137 73141 73145 73149 73153 73157 73161 73165 73169 73173 73177 73181 73185 73189 73193 73197 73201 73205 73209 73213 73217 73221 73225 73229 73233 73237 73241 73245 73249 73253 73257 73261 73265 73269 73273 73277 73281 73285 73289 73293 73297 73301 73305 73309 73313 73317 73321 73325 73329 73333 73337 73341 73345 73349 73353 73357 73361 73365 73369 73373 73377 73381 73385 73389 73393 73397 73401 73405 73409 73413 73417 73421 73425 73429 73433 73437 73441 73445 73449 73453 73457 73461 73465 73469 73473 73477 73481 73485 73489 73493 73497 73501 73505 73509 73513 73517 73521 73525 73529 73533 73537 73541 73545 73549 73553 73557 73561 73565 73569 73573 73577 73581 73585 73589 73593 73597 73601 73605 73609 73613 73617 73621 73625 73629 73633 73637 73641 73645 73649 73653 73657 73661 73665 73669 73673 73677 73681 73685 73689 73693 73697 73701 73705 73709 73713 73717 73721 73725 73729 73733 73737 73741 73745 73749 73753 73757 73761 73765 73769 73773 73777 73781 73785 73789 73793 73797 73801 73805 73809 73813 73817 73821 73825 73829 73833 73837 73841 73845 73849 73853 73857 73861 73865 73869 73873 73877 73881 73885 73889 73893 73897 73901 73905 73909 73913 73917 73921 73925 73929 73933 73937 73941 73945 73949 73953 73957 73961 73965 73969 73973 73977 73981 73985 73989 73993 73997 74001 74005 74009 74013 74017 74021 74025 74029 74033 74037 74041 74045 74049 74053 74057 74061 74065 74069 74073 74077 74081 74085 74089 74093 74097 74101 74105 74109 74113 74117 74121 74125 74129 74133 74137 74141 74145 74149 74153 74157 74161 74165 74169 74173 74177 74181 74185 74189 74193 74197 74201 74205 74209 74213 74217 74221 74225 74229 74233 74237 74241 74245 74249 74253 74257 74261 74265 74269 74273 74277 74281 74285 74289 74293 74297 74301 74305 74309 74313 74317 74321 74325 74329 74333 74337 74341 74345 74349 74353 74357 74361 74365 74369 74373 74377 74381 74385 74389 74393 74397 74401 74405 74409 74413 74417 74421 74425 74429 74433 74437 74441 74445 74449 74453 74457 74461 74465 74469 74473 74477 74481 74485 74489 74493 74497 74501 74505 74509 74513 74517 74521 74525 74529 74533 74537 74541 74545 74549 74553 74557 74561 74565 74569 74573 74577 74581 74585 74589 74593 74597 74601 74605 74609 74613 74617 74621 74625 74629 74633 74637 74641 74645 74649 74653 74657 74661 74665 74669 74673 74677 74681 74685 74689 74693 74697 74701 74705 74709 74713 74717 74721 74725 74729 74733 74737 74741 74745 74749 74753 74757 74761 74765 74769 74773 74777 74781 74785 74789 74793 74797 74801 74805 74809 74813 74817 74821 74825 74829 74833 74837 74841 74845 74849 74853 74857 74861 74865 74869 74873 74877 74881 74885 74889 74893 74897 74901 74905 74909 74913 74917 74921 74925 74929 74933 74937 74941 74945 74949 74953 74957 74961 74965 74969 74973 74977 74981 74985 74989 74993 74997 75001 75005 75009 75013 75017 75021 75025 75029 75033 75037 75041 75045 75049 75053 75057 75061 75065 75069 75073 75077 75081 75085 75089 75093 75097 75101 75105 75109 75113 75117 75121 75125 75129 75133 75137 75141 75145 75149 75153 75157 75161 75165 75169 75173 75177 75181 75185 75189 75193 75197 75201 75205 75209 75213 75217 75221 75225 75229 75233 75237 75241 75245 75249 75253 75257 75261 75265 75269 75273 75277 75281 75285 75289 75293 75297 75301 75305 75309 75313 75317 75321 75325 75329 75333 75337 75341 75345 75349 75353 75357 75361 75365 75369 75373 75377 75381 75385 75389 75393 75397 75401 75405 75409 75413 75417 75421 75425 75429 75433 75437 75441 75445 75449 75453 75457 75461 75465 75469 75473 75477 75481 75485 75489 75493 75497 75501 75505 75509 75513 75517 75521 75525 75529 75533 75537 75541 75545 75549 75553 75557 75561 75565 75569 75573 75577 75581 75585 75589 75593 75597 75601 75605 75609 75613 75617 75621 75625 75629 75633 75637 75641 75645 75649 75653 75657 75661 75665 75669 75673 75677 75681 75685 75689 75693 75697 75701 75705 75709 75713 75717 75721 75725 75729 75733 75737 75741 75745 75749 75753 75757 75761 75765 75769 75773 75777 75781 75785 75789 75793 75797 75801 75805 75809 75813 75817 75821 75825 75829 75833 75837 75841 75845 75849 75853 75857 75861 75865 75869 75873 75877 75881 75885 75889 75893 75897 75901 75905 75909 75913 75917 75921 75925 75929 75933 75937 75941 75945 75949 75953 75957 75961 75965 75969 75973 75977 75981 75985 75989 75993 75997 76001 76005 76009 76013 76017 76021 76025 76029 76033 76037 76041 76045 76049 76053 76057 76061 76065 76069 76073 76077 76081 76085 76089 76093 76097 76101 76105 76109 76113 76117 76121 76125 76129 76133 76137 76141 76145 76149 76153 76157 76161 76165 76169 76173 76177 76181 76185 76189 76193 76197 76201 76205 76209 76213 76217 76221 76225 76229 76233 76237 76241 76245 76249 76253 76257 76261 76265 76269 76273 76277 76281 76285 76289 76293 76297 76301 76305 76309 76313 76317 76321 76325 76329 76333 76337 76341 76345 76349 76353 76357 76361 76365 76369 76373 76377 76381 76385 76389 76393 76397 76401 76405 76409 76413 76417 76421 76425 76429 76433 76437 76441 76445 76449 76453 76457 76461 76465 76469 76473 76477 76481 76485 76489 76493 76497 76501 76505 76509 76513 76517 76521 76525 76529 76533 76537 76541 76545 76549 76553 76557 76561 76565 76569 76573 76577 76581 76585 76589 76593 76597 76601 76605 76609 76613 76617 76621 76625 76629 76633 76637 76641 76645 76649 76653 76657 76661 76665 76669 76673 76677 76681 76685 76689 76693 76697 76701 76705 76709 76713 76717 76721 76725 76729 76733 76737 76741 76745 76749 76753 76757 76761 76765 76769 76773 76777 76781 76785 76789 76793 76797 76801 76805 76809 76813 76817 76821 76825 76829 76833 76837 76841 76845 76849 76853 76857 76861 76865 76869 76873 76877 76881 76885 76889 76893 76897 76901 76905 76909 76913 76917 76921 76925 76929 76933 76937 76941 76945 76949 76953 76957 76961 76965 76969 76973 76977 76981 76985 76989 76993 76997 77001 77005 77009 77013 77017 77021 77025 77029 77033 77037 77041 77045 77049 77053 77057 77061 77065 77069 77073 77077 77081 77085 77089 77093 77097 77101 77105 77109 77113 77117 77121 77125 77129 77133 77137 77141 77145 77149 77153 77157 77161 77165 77169 77173 77177 77181 77185 77189 77193 77197 77201 77205 77209 77213 77217 77221 77225 77229 77233 77237 77241 77245 77249 77253 77257 77261 77265 77269 77273 77277 77281 77285 77289 77293 77297 77301 77305 77309 77313 77317 77321 77325 77329 77333 77337 77341 77345 77349 77353 77357 77361 77365 77369 77373 77377 77381 77385 77389 77393 77397 77401 77405 77409 77413 77417 77421 77425 77429 77433 77437 77441 77445 77449 77453 77457 77461 77465 77469 77473 77477 77481 77485 77489 77493 77497 77501 77505 77509 77513 77517 77521 77525 77529 77533 77537 77541 77545 77549 77553 77557 77561 77565 77569 77573 77577 77581 77585 77589 77593 77597 77601 77605 77609 77613 77617 77621 77625 77629 77633 77637 77641 77645 77649 77653 77657 77661 77665 77669 77673 77677 77681 77685 77689 77693 77697 77701 77705 77709 77713 77717 77721 77725 77729 77733 77737 77741 77745 77749 77753 77757 77761 77765 77769 77773 77777 77781 77785 77789 77793 77797 77801 77805 77809 77813 77817 77821 77825 77829 77833 77837 77841 77845 77849 77853 77857 77861 77865 77869 77873 77877 77881 77885 77889 77893 77897 77901 77905 77909 77913 77917 77921 77925 77929 77933 77937 77941 77945 77949 77953 77957 77961 77965 77969 77973 77977 77981 77985 77989 77993 77997 78001 78005 78009 78013 78017 78021 78025 78029 78033 78037 78041 78045 78049 78053 78057 78061 78065 78069 78073 78077 78081 78085 78089 78093 78097 78101 78105 78109 78113 78117 78121 78125 78129 78133 78137 78141 78145 78149 78153 78157 78161 78165 78169 78173 78177 78181 78185 78189 78193 78197 78201 78205 78209 78213 78217 78221 78225 78229 78233 78237 78241 78245 78249 78253 78257 78261 78265 78269 78273 78277 78281 78285 78289 78293 78297 78301 78305 78309 78313 78317 78321 78325 78329 78333 78337 78341 78345 78349 78353 78357 78361 78365 78369 78373 78377 78381 78385 78389 78393 78397 78401 78405 78409 78413 78417 78421 78425 78429 78433 78437 78441 78445 78449 78453 78457 78461 78465 78469 78473 78477 78481 78485 78489 78493 78497 78501 78505 78509 78513 78517 78521 78525 78529 78533 78537 78541 78545 78549 78553 78557 78561 78565 78569 78573 78577 78581 78585 78589 78593 78597 78601 78605 78609 78613 78617 78621 78625 78629 78633 78637 78641 78645 78649 78653 78657 78661 78665 78669 78673 78677 78681 78685 78689 78693 78697 78701 78705 78709 78713 78717 78721 78725 78729 78733 78737 78741 78745 78749 78753 78757 78761 78765 78769 78773 78777 78781 78785 78789 78793 78797 78801 78805 78809 78813 78817 78821 78825 78829 78833 78837 78841 78845 78849 78853 78857 78861 78865 78869 78873 78877 78881 78885 78889 78893 78897 78901 78905 78909 78913 78917 78921 78925 78929 78933 78937 78941 78945 78949 78953 78957 78961 78965 78969 78973 78977 78981 78985 78989 78993 78997 79001 79005 79009 79013 79017 79021 79025 79029 79033 79037 79041 79045 79049 79053 79057 79061 79065 79069 79073 79077 79081 79085 79089 79093 79097 79101 79105 79109 79113 79117 79121 79125 79129 79133 79137 79141 79145 79149 79153 79157 79161 79165 79169 79173 79177 79181 79185 79189 79193 79197 79201 79205 79209 79213 79217 79221 79225 79229 79233 79237 79241 79245 79249 79253 79257 79261 79265 79269 79273 79277 79281 79285 79289 79293 79297 79301 79305 79309 79313 79317 79321 79325 79329 79333 79337 79341 79345 79349 79353 79357 79361 79365 79369 79373 79377 79381 79385 79389 79393 79397 79401 79405 79409 79413 79417 79421 79425 79429 79433 79437 79441 79445 79449 79453 79457 79461 79465 79469 79473 79477 79481 79485 79489 79493 79497 79501 79505 79509 79513 79517 79521 79525 79529 79533 79537 79541 79545 79549 79553 79557 79561 79565 79569 79573 79577 79581 79585 79589 79593 79597 79601 79605 79609 79613 79617 79621 79625 79629 79633 79637 79641 79645 79649 79653 79657 79661 79665 79669 79673 79677 79681 79685 79689 79693 79697 79701 79705 79709 79713 79717 79721 79725 79729 79733 79737 79741 79745 79749 79753 79757 79761 79765 79769 79773 79777 79781 79785 79789 79793 79797 79801 79805 79809 79813 79817 79821 79825 79829 79833 79837 79841 79845 79849 79853 79857 79861 79865 79869 79873 79877 79881 79885 79889 79893 79897 79901 79905 79909 79913 79917 79921 79925 79929 79933 79937 79941 79945 79949 79953 79957 79961 79965 79969 79973 79977 79981 79985 79989 79993 79997 80001 80005 80009 80013 80017 80021 80025 80029 80033 80037 80041 80045 80049 80053 80057 80061 80065 80069 80073 80077 80081 80085 80089 80093 80097 80101 80105 80109 80113 80117 80121 80125 80129 80133 80137 80141 80145 80149 80153 80157 80161 80165 80169 80173 80177 80181 80185 80189 80193 80197 80201 80205 80209 80213 80217 80221 80225 80229 80233 80237 80241 80245 80249 80253 80257 80261 80265 80269 80273 80277 80281 80285 80289 80293 80297 80301 80305 80309 80313 80317 80321 80325 80329 80333 80337 80341 80345 80349 80353 80357 80361 80365 80369 80373 80377 80381 80385 80389 80393 80397 80401 80405 80409 80413 80417 80421 80425 80429 80433 80437 80441 80445 80449 80453 80457 80461 80465 80469 80473 80477 80481 80485 80489 80493 80497 80501 80505 80509 80513 80517 80521 80525 80529 80533 80537 80541 80545 80549 80553 80557 80561 80565 80569 80573 80577 80581 80585 80589 80593 80597 80601 80605 80609 80613 80617 80621 80625 80629 80633 80637 80641 80645 80649 80653 80657 80661 80665 80669 80673 80677 80681 80685 80689 80693 80697 80701 80705 80709 80713 80717 80721 80725 80729 80733 80737 80741 80745 80749 80753 80757 80761 80765 80769 80773 80777 80781 80785 80789 80793 80797 80801 80805 80809 80813 80817 80821 80825 80829 80833 80837 80841 80845 80849 80853 80857 80861 80865 80869 80873 80877 80881 80885 80889 80893 80897 80901 80905 80909 80913 80917 80921 80925 80929 80933 80937 80941 80945 80949 80953 80957 80961 80965 80969 80973 80977 80981 80985 80989 80993 80997 81001 81005 81009 81013 81017 81021 81025 81029 81033 81037 81041 81045 81049 81053 81057 81061 81065 81069 81073 81077 81081 81085 81089 81093 81097 81101 81105 81109 81113 81117 81121 81125 81129 81133 81137 81141 81145 81149 81153 81157 81161 81165 81169 81173 81177 81181 81185 81189 81193 81197 81201 81205 81209 81213 81217 81221 81225 81229 81233 81237 81241 81245 81249 81253 81257 81261 81265 81269 81273 81277 81281 81285 81289 81293 81297 81301 81305 81309 81313 81317 81321 81325 81329 81333 81337 81341 81345 81349 81353 81357 81361 81365 81369 81373 81377 81381 81385 81389 81393 81397 81401 81405 81409 81413 81417 81421 81425 81429 81433 81437 81441 81445 81449 81453 81457 81461 81465 81469 81473 81477 81481 81485 81489 81493 81497 81501 81505 81509 81513 81517 81521 81525 81529 81533 81537 81541 81545 81549 81553 81557 81561 81565 81569 81573 81577 81581 81585 81589 81593 81597 81601 81605 81609 81613 81617 81621 81625 81629 81633 81637 81641 81645 81649 81653 81657 81661 81665 81669 81673 81677 81681 81685 81689 81693 81697 81701 81705 81709 81713 81717 81721 81725 81729 81733 81737 81741 81745 81749 81753 81757 81761 81765 81769 81773 81777 81781 81785 81789 81793 81797 81801 81805 81809 81813 81817 81821 81825 81829 81833 81837 81841 81845 81849 81853 81857 81861 81865 81869 81873 81877 81881 81885 81889 81893 81897 81901 81905 81909 81913 81917 81921 81925 81929 81933 81937 81941 81945 81949 81953 81957 81961 81965 81969 81973 81977 81981 81985 81989 81993 81997 82001 82005 82009 82013 82017 82021 82025 82029 82033 82037 82041 82045 82049 82053 82057 82061 82065 82069 82073 82077 82081 82085 82089 82093 82097 82101 82105 82109 82113 82117 82121 82125 82129 82133 82137 82141 82145 82149 82153 82157 82161 82165 82169 82173 82177 82181 82185 82189 82193 82197 82201 82205 82209 82213 82217 82221 82225 82229 82233 82237 82241 82245 82249 82253 82257 82261 82265 82269 82273 82277 82281 82285 82289 82293 82297 82301 82305 82309 82313 82317 82321 82325 82329 82333 82337 82341 82345 82349 82353 82357 82361 82365 82369 82373 82377 82381 82385 82389 82393 82397 82401 82405 82409 82413 82417 82421 82425 82429 82433 82437 82441 82445 82449 82453 82457 82461 82465 82469 82473 82477 82481 82485 82489 82493 82497 82501 82505 82509 82513 82517 82521 82525 82529 82533 82537 82541 82545 82549 82553 82557 82561 82565 82569 82573 82577 82581 82585 82589 82593 82597 82601 82605 82609 82613 82617 82621 82625 82629 82633 82637 82641 82645 82649 82653 82657 82661 82665 82669 82673 82677 82681 82685 82689 82693 82697 82701 82705 82709 82713 82717 82721 82725 82729 82733 82737 82741 82745 82749 82753 82757 82761 82765 82769 82773 82777 82781 82785 82789 82793 82797 82801 82805 82809 82813 82817 82821 82825 82829 82833 82837 82841 82845 82849 82853 82857 82861 82865 82869 82873 82877 82881 82885 82889 82893 82897 82901 82905 82909 82913 82917 82921 82925 82929 82933 82937 82941 82945 82949 82953 82957 82961 82965 82969 82973 82977 82981 82985 82989 82993 82997 83001 83005 83009 83013 83017 83021 83025 83029 83033 83037 83041 83045 83049 83053 83057 83061 83065 83069 83073 83077 83081 83085 83089 83093 83097 83101 83105 83109 83113 83117 83121 83125 83129 83133 83137 83141 83145 83149 83153 83157 83161 83165 83169 83173 83177 83181 83185 83189 83193 83197 83201 83205 83209 83213 83217 83221 83225 83229 83233 83237 83241 83245 83249 83253 83257 83261 83265 83269 83273 83277 83281 83285 83289 83293 83297 83301 83305 83309 83313 83317 83321 83325 83329 83333 83337 83341 83345 83349 83353 83357 83361 83365 83369 83373 83377 83381 83385 83389 83393 83397 83401 83405 83409 83413 83417 83421 83425 83429 83433 83437 83441 83445 83449 83453 83457 83461 83465 83469 83473 83477 83481 83485 83489 83493 83497 83501 83505 83509 83513 83517 83521 83525 83529 83533 83537 83541 83545 83549 83553 83557 83561 83565 83569 83573 83577 83581 83585 83589 83593 83597 83601 83605 83609 83613 83617 83621 83625 83629 83633 83637 83641 83645 83649 83653 83657 83661 83665 83669 83673 83677 83681 83685 83689 83693 83697 83701 83705 83709 83713 83717 83721 83725 83729 83733 83737 83741 83745 83749 83753 83757 83761 83765 83769 83773 83777 83781 83785 83789 83793 83797 83801 83805 83809 83813 83817 83821 83825 83829 83833 83837 83841 83845 83849 83853 83857 83861 83865 83869 83873 83877 83881 83885 83889 83893 83897 83901 83905 83909 83913 83917 83921 83925 83929 83933 83937 83941 83945 83949 83953 83957 83961 83965 83969 83973 83977 83981 83985 83989 83993 83997 84001 84005 84009 84013 84017 84021 84025 84029 84033 84037 84041 84045 84049 84053 84057 84061 84065 84069 84073 84077 84081 84085 84089 84093 84097 84101 84105 84109 84113 84117 84121 84125 84129 84133 84137 84141 84145 84149 84153 84157 84161 84165 84169 84173 84177 84181 84185 84189 84193 84197 84201 84205 84209 84213 84217 84221 84225 84229 84233 84237 84241 84245 84249 84253 84257 84261 84265 84269 84273 84277 84281 84285 84289 84293 84297 84301 84305 84309 84313 84317 84321 84325 84329 84333 84337 84341 84345 84349 84353 84357 84361 84365 84369 84373 84377 84381 84385 84389 84393 84397 84401 84405 84409 84413 84417 84421 84425 84429 84433 84437 84441 84445 84449 84453 84457 84461 84465 84469 84473 84477 84481 84485 84489 84493 84497 84501 84505 84509 84513 84517 84521 84525 84529 84533 84537 84541 84545 84549 84553 84557 84561 84565 84569 84573 84577 84581 84585 84589 84593 84597 84601 84605 84609 84613 84617 84621 84625 84629 84633 84637 84641 84645 84649 84653 84657 84661 84665 84669 84673 84677 84681 84685 84689 84693 84697 84701 84705 84709 84713 84717 84721 84725 84729 84733 84737 84741 84745 84749 84753 84757 84761 84765 84769 84773 84777 84781 84785 84789 84793 84797 84801 84805 84809 84813 84817 84821 84825 84829 84833 84837 84841 84845 84849 84853 84857 84861 84865 84869 84873 84877 84881 84885 84889 84893 84897 84901 84905 84909 84913 84917 84921 84925 84929 84933 84937 84941 84945 84949 84953 84957 84961 84965 84969 84973 84977 84981 84985 84989 84993 84997 85001 85005 85009 85013 85017 85021 85025 85029 85033 85037 85041 85045 85049 85053 85057 85061 85065 85069 85073 85077 85081 85085 85089 85093 85097 85101 85105 85109 85113 85117 85121 85125 85129 85133 85137 85141 85145 85149 85153 85157 85161 85165 85169 85173 85177 85181 85185 85189 85193 85197 85201 85205 85209 85213 85217 85221 85225 85229 85233 85237 85241 85245 85249 85253 85257 85261 85265 85269 85273 85277 85281 85285 85289 85293 85297 85301 85305 85309 85313 85317 85321 85325 85329 85333 85337 85341 85345 85349 85353 85357 85361 85365 85369 85373 85377 85381 85385 85389 85393 85397 85401 85405 85409 85413 85417 85421 85425 85429 85433 85437 85441 85445 85449 85453 85457 85461 85465 85469 85473 85477 85481 85485 85489 85493 85497 85501 85505 85509 85513 85517 85521 85525 85529 85533 85537 85541 85545 85549 85553 85557 85561 85565 85569 85573 85577 85581 85585 85589 85593 85597 85601 85605 85609 85613 85617 85621 85625 85629 85633 85637 85641 85645 85649 85653 85657 85661 85665 85669 85673 85677 85681 85685 85689 85693 85697 85701 85705 85709 85713 85717 85721 85725 85729 85733 85737 85741 85745 85749 85753 85757 85761 85765 85769 85773 85777 85781 85785 85789 85793 85797 85801 85805 85809 85813 85817 85821 85825 85829 85833 85837 85841 85845 85849 85853 85857 85861 85865 85869 85873 85877 85881 85885 85889 85893 85897 85901 85905 85909 85913 85917 85921 85925 85929 85933 85937 85941 85945 85949 85953 85957 85961 85965 85969 85973 85977 85981 85985 85989 85993 85997 86001 86005 86009 86013 86017 86021 86025 86029 86033 86037 86041 86045 86049 86053 86057 86061 86065 86069 86073 86077 86081 86085 86089 86093 86097 86101 86105 86109 86113 86117 86121 86125 86129 86133 86137 86141 86145 86149 86153 86157 86161 86165 86169 86173 86177 86181 86185 86189 86193 86197 86201 86205 86209 86213 86217 86221 86225 86229 86233 86237 86241 86245 86249 86253 86257 86261 86265 86269 86273 86277 86281 86285 86289 86293 86297 86301 86305 86309 86313 86317 86321 86325 86329 86333 86337 86341 86345 86349 86353 86357 86361 86365 86369 86373 86377 86381 86385 86389 86393 86397 86401 86405 86409 86413 86417 86421 86425 86429 86433 86437 86441 86445 86449 86453 86457 86461 86465 86469 86473 86477 86481 86485 86489 86493 86497 86501 86505 86509 86513 86517 86521 86525 86529 86533 86537 86541 86545 86549 86553 86557 86561 86565 86569 86573 86577 86581 86585 86589 86593 86597 86601 86605 86609 86613 86617 86621 86625 86629 86633 86637 86641 86645 86649 86653 86657 86661 86665 86669 86673 86677 86681 86685 86689 86693 86697 86701 86705 86709 86713 86717 86721 86725 86729 86733 86737 86741 86745 86749 86753 86757 86761 86765 86769 86773 86777 86781 86785 86789 86793 86797 86801 86805 86809 86813 86817 86821 86825 86829 86833 86837 86841 86845 86849 86853 86857 86861 86865 86869 86873 86877 86881 86885 86889 86893 86897 86901 86905 86909 86913 86917 86921 86925 86929 86933 86937 86941 86945 86949 86953 86957 86961 86965 86969 86973 86977 86981 86985 86989 86993 86997 87001 87005 87009 87013 87017 87021 87025 87029 87033 87037 87041 87045 87049 87053 87057 87061 87065 87069 87073 87077 87081 87085 87089 87093 87097 87101 87105 87109 87113 87117 87121 87125 87129 87133 87137 87141 87145 87149 87153 87157 87161 87165 87169 87173 87177 87181 87185 87189 87193 87197 87201 87205 87209 87213 87217 87221 87225 87229 87233 87237 87241 87245 87249 87253 87257 87261 87265 87269 87273 87277 87281 87285 87289 87293 87297 87301 87305 87309 87313 87317 87321 87325 87329 87333 87337 87341 87345 87349 87353 87357 87361 87365 87369 87373 87377 87381 87385 87389 87393 87397 87401 87405 87409 87413 87417 87421 87425 87429 87433 87437 87441 87445 87449 87453 87457 87461 87465 87469 87473 87477 87481 87485 87489 87493 87497 87501 87505 87509 87513 87517 87521 87525 87529 87533 87537 87541 87545 87549 87553 87557 87561 87565 87569 87573 87577 87581 87585 87589 87593 87597 87601 87605 87609 87613 87617 87621 87625 87629 87633 87637 87641 87645 87649 87653 87657 87661 87665 87669 87673 87677 87681 87685 87689 87693 87697 87701 87705 87709 87713 87717 87721 87725 87729 87733 87737 87741 87745 87749 87753 87757 87761 87765 87769 87773 87777 87781 87785 87789 87793 87797 87801 87805 87809 87813 87817 87821 87825 87829 87833 87837 87841 87845 87849 87853 87857 87861 87865 87869 87873 87877 87881 87885 87889 87893 87897 87901 87905 87909 87913 87917 87921 87925 87929 87933 87937 87941 87945 87949 87953 87957 87961 87965 87969 87973 87977 87981 87985 87989 87993 87997 88001 88005 88009 88013 88017 88021 88025 88029 88033 88037 88041 88045 88049 88053 88057 88061 88065 88069 88073 88077 88081 88085 88089 88093 88097 88101 88105 88109 88113 88117 88121 88125 88129 88133 88137 88141 88145 88149 88153 88157 88161 88165 88169 88173 88177 88181 88185 88189 88193 88197 88201 88205 88209 88213 88217 88221 88225 88229 88233 88237 88241 88245 88249 88253 88257 88261 88265 88269 88273 88277 88281 88285 88289 88293 88297 88301 88305 88309 88313 88317 88321 88325 88329 88333 88337 88341 88345 88349 88353 88357 88361 88365 88369 88373 88377 88381 88385 88389 88393 88397 88401 88405 88409 88413 88417 88421 88425 88429 88433 88437 88441 88445 88449 88453 88457 88461 88465 88469 88473 88477 88481 88485 88489 88493 88497 88501 88505 88509 88513 88517 88521 88525 88529 88533 88537 88541 88545 88549 88553 88557 88561 88565 88569 88573 88577 88581 88585 88589 88593 88597 88601 88605 88609 88613 88617 88621 88625 88629 88633 88637 88641 88645 88649 88653 88657 88661 88665 88669 88673 88677 88681 88685 88689 88693 88697 88701 88705 88709 88713 88717 88721 88725 88729 88733 88737 88741 88745 88749 88753 88757 88761 88765 88769 88773 88777 88781 88785 88789 88793 88797 88801 88805 88809 88813 88817 88821 88825 88829 88833 88837 88841 88845 88849 88853 88857 88861 88865 88869 88873 88877 88881 88885 88889 88893 88897 88901 88905 88909 88913 88917 88921 88925 88929 88933 88937 88941 88945 88949 88953 88957 88961 88965 88969 88973 88977 88981 88985 88989 88993 88997 89001 89005 89009 89013 89017 89021 89025 89029 89033 89037 89041 89045 89049 89053 89057 89061 89065 89069 89073 89077 89081 89085 89089 89093 89097 89101 89105 89109 89113 89117 89121 89125 89129 89133 89137 89141 89145 89149 89153 89157 89161 89165 89169 89173 89177 89181 89185 89189 89193 89197 89201 89205 89209 89213 89217 89221 89225 89229 89233 89237 89241 89245 89249 89253 89257 89261 89265 89269 89273 89277 89281 89285 89289 89293 89297 89301 89305 89309 89313 89317 89321 89325 89329 89333 89337 89341 89345 89349 89353 89357 89361 89365 89369 89373 89377 89381 89385 89389 89393 89397 89401 89405 89409 89413 89417 89421 89425 89429 89433 89437 89441 89445 89449 89453 89457 89461 89465 89469 89473 89477 89481 89485 89489 89493 89497 89501 89505 89509 89513 89517 89521 89525 89529 89533 89537 89541 89545 89549 89553 89557 89561 89565 89569 89573 89577 89581 89585 89589 89593 89597 89601 89605 89609 89613 89617 89621 89625 89629 89633 89637 89641 89645 89649 89653 89657 89661 89665 89669 89673 89677 89681 89685 89689 89693 89697 89701 89705 89709 89713 89717 89721 89725 89729 89733 89737 89741 89745 89749 89753 89757 89761 89765 89769 89773 89777 89781 89785 89789 89793 89797 89801 89805 89809 89813 89817 89821 89825 89829 89833 89837 89841 89845 89849 89853 89857 89861 89865 89869 89873 89877 89881 89885 89889 89893 89897 89901 89905 89909 89913 89917 89921 89925 89929 89933 89937 89941 89945 89949 89953 89957 89961 89965 89969 89973 89977 89981 89985 89989 89993 89997 90001 90005 90009 90013 90017 90021 90025 90029 90033 90037 90041 90045 90049 90053 90057 90061 90065 90069 90073 90077 90081 90085 90089 90093 90097 90101 90105 90109 90113 90117 90121 90125 90129 90133 90137 90141 90145 90149 90153 90157 90161 90165 90169 90173 90177 90181 90185 90189 90193 90197 90201 90205 90209 90213 90217 90221 90225 90229 90233 90237 90241 90245 90249 90253 90257 90261 90265 90269 90273 90277 90281 90285 90289 90293 90297 90301 90305 90309 90313 90317 90321 90325 90329 90333 90337 90341 90345 90349 90353 90357 90361 90365 90369 90373 90377 90381 90385 90389 90393 90397 90401 90405 90409 90413 90417 90421 90425 90429 90433 90437 90441 90445 90449 90453 90457 90461 90465 90469 90473 90477 90481 90485 90489 90493 90497 90501 90505 90509 90513 90517 90521 90525 90529 90533 90537 90541 90545 90549 90553 90557 90561 90565 90569 90573 90577 90581 90585 90589 90593 90597 90601 90605 90609 90613 90617 90621 90625 90629 90633 90637 90641 90645 90649 90653 90657 90661 90665 90669 90673 90677 90681 90685 90689 90693 90697 90701 90705 90709 90713 90717 90721 90725 90729 90733 90737 90741 90745 90749 90753 90757 90761 90765 90769 90773 90777 90781 90785 90789 90793 90797 90801 90805 90809 90813 90817 90821 90825 90829 90833 90837 90841 90845 90849 90853 90857 90861 90865 90869 90873 90877 90881 90885 90889 90893 90897 90901 90905 90909 90913 90917 90921 90925 90929 90933 90937 90941 90945 90949 90953 90957 90961 90965 90969 90973 90977 90981 90985 90989 90993 90997 91001 91005 91009 91013 91017 91021 91025 91029 91033 91037 91041 91045 91049 91053 91057 91061 91065 91069 91073 91077 91081 91085 91089 91093 91097 91101 91105 91109 91113 91117 91121 91125 91129 91133 91137 91141 91145 91149 91153 91157 91161 91165 91169 91173 91177 91181 91185 91189 91193 91197 91201 91205 91209 91213 91217 91221 91225 91229 91233 91237 91241 91245 91249 91253 91257 91261 91265 91269 91273 91277 91281 91285 91289 91293 91297 91301 91305 91309 91313 91317 91321 91325 91329 91333 91337 91341 91345 91349 91353 91357 91361 91365 91369 91373 91377 91381 91385 91389 91393 91397 91401 91405 91409 91413 91417 91421 91425 91429 91433 91437 91441 91445 91449 91453 91457 91461 91465 91469 91473 91477 91481 91485 91489 91493 91497 91501 91505 91509 91513 91517 91521 91525 91529 91533 91537 91541 91545 91549 91553 91557 91561 91565 91569 91573 91577 91581 91585 91589 91593 91597 91601 91605 91609 91613 91617 91621 91625 91629 91633 91637 91641 91645 91649 91653 91657 91661 91665 91669 91673 91677 91681 91685 91689 91693 91697 91701 91705 91709 91713 91717 91721 91725 91729 91733 91737 91741 91745 91749 91753 91757 91761 91765 91769 91773 91777 91781 91785 91789 91793 91797 91801 91805 91809 91813 91817 91821 91825 91829 91833 91837 91841 91845 91849 91853 91857 91861 91865 91869 91873 91877 91881 91885 91889 91893 91897 91901 91905 91909 91913 91917 91921 91925 91929 91933 91937 91941 91945 91949 91953 91957 91961 91965 91969 91973 91977 91981 91985 91989 91993 91997 92001 92005 92009 92013 92017 92021 92025 92029 92033 92037 92041 92045 92049 92053 92057 92061 92065 92069 92073 92077 92081 92085 92089 92093 92097 92101 92105 92109 92113 92117 92121 92125 92129 92133 92137 92141 92145 92149 92153 92157 92161 92165 92169 92173 92177 92181 92185 92189 92193 92197 92201 92205 92209 92213 92217 92221 92225 92229 92233 92237 92241 92245 92249 92253 92257 92261 92265 92269 92273 92277 92281 92285 92289 92293 92297 92301 92305 92309 92313 92317 92321 92325 92329 92333 92337 92341 92345 92349 92353 92357 92361 92365 92369 92373 92377 92381 92385 92389 92393 92397 92401 92405 92409 92413 92417 92421 92425 92429 92433 92437 92441 92445 92449 92453 92457 92461 92465 92469 92473 92477 92481 92485 92489 92493 92497 92501 92505 92509 92513 92517 92521 92525 92529 92533 92537 92541 92545 92549 92553 92557 92561 92565 92569 92573 92577 92581 92585 92589 92593 92597 92601 92605 92609 92613 92617 92621 92625 92629 92633 92637 92641 92645 92649 92653 92657 92661 92665 92669 92673 92677 92681 92685 92689 92693 92697 92701 92705 92709 92713 92717 92721 92725 92729 92733 92737 92741 92745 92749 92753 92757 92761 92765 92769 92773 92777 92781 92785 92789 92793 92797 92801 92805 92809 92813 92817 92821 92825 92829 92833 92837 92841 92845 92849 92853 92857 92861 92865 92869 92873 92877 92881 92885 92889 92893 92897 92901 92905 92909 92913 92917 92921 92925 92929 92933 92937 92941 92945 92949 92953 92957 92961 92965 92969 92973 92977 92981 92985 92989 92993 92997 93001 93005 93009 93013 93017 93021 93025 93029 93033 93037 93041 93045 93049 93053 93057 93061 93065 93069 93073 93077 93081 93085 93089 93093 93097 93101 93105 93109 93113 93117 93121 93125 93129 93133 93137 93141 93145 93149 93153 93157 93161 93165 93169 93173 93177 93181 93185 93189 93193 93197 93201 93205 93209 93213 93217 93221 93225 93229 93233 93237 93241 93245 93249 93253 93257 93261 93265 93269 93273 93277 93281 93285 93289 93293 93297 93301 93305 93309 93313 93317 93321 93325 93329 93333 93337 93341 93345 93349 93353 93357 93361 93365 93369 93373 93377 93381 93385 93389 93393 93397 93401 93405 93409 93413 93417 93421 93425 93429 93433 93437 93441 93445 93449 93453 93457 93461 93465 93469 93473 93477 93481 93485 93489 93493 93497 93501 93505 93509 93513 93517 93521 93525 93529 93533 93537 93541 93545 93549 93553 93557 93561 93565 93569 93573 93577 93581 93585 93589 93593 93597 93601 93605 93609 93613 93617 93621 93625 93629 93633 93637 93641 93645 93649 93653 93657 93661 93665 93669 93673 93677 93681 93685 93689 93693 93697 93701 93705 93709 93713 93717 93721 93725 93729 93733 93737 93741 93745 93749 93753 93757 93761 93765 93769 93773 93777 93781 93785 93789 93793 93797 93801 93805 93809 93813 93817 93821 93825 93829 93833 93837 93841 93845 93849 93853 93857 93861 93865 93869 93873 93877 93881 93885 93889 93893 93897 93901 93905 93909 93913 93917 93921 93925 93929 93933 93937 93941 93945 93949 93953 93957 93961 93965 93969 93973 93977 93981 93985 93989 93993 93997 94001 94005 94009 94013 94017 94021 94025 94029 94033 94037 94041 94045 94049 94053 94057 94061 94065 94069 94073 94077 94081 94085 94089 94093 94097 94101 94105 94109 94113 94117 94121 94125 94129 94133 94137 94141 94145 94149 94153 94157 94161 94165 94169 94173 94177 94181 94185 94189 94193 94197 94201 94205 94209 94213 94217 94221 94225 94229 94233 94237 94241 94245 94249 94253 94257 94261 94265 94269 94273 94277 94281 94285 94289 94293 94297 94301 94305 94309 94313 94317 94321 94325 94329 94333 94337 94341 94345 94349 94353 94357 94361 94365 94369 94373 94377 94381 94385 94389 94393 94397 94401 94405 94409 94413 94417 94421 94425 94429 94433 94437 94441 94445 94449 94453 94457 94461 94465 94469 94473 94477 94481 94485 94489 94493 94497 94501 94505 94509 94513 94517 94521 94525 94529 94533 94537 94541 94545 94549 94553 94557 94561 94565 94569 94573 94577 94581 94585 94589 94593 94597 94601 94605 94609 94613 94617 94621 94625 94629 94633 94637 94641 94645 94649 94653 94657 94661 94665 94669 94673 94677 94681 94685 94689 94693 94697 94701 94705 94709 94713 94717 94721 94725 94729 94733 94737 94741 94745 94749 94753 94757 94761 94765 94769 94773 94777 94781 94785 94789 94793 94797 94801 94805 94809 94813 94817 94821 94825 94829 94833 94837 94841 94845 94849 94853 94857 94861 94865 94869 94873 94877 94881 94885 94889 94893 94897 94901 94905 94909 94913 94917 94921 94925 94929 94933 94937 94941 94945 94949 94953 94957 94961 94965 94969 94973 94977 94981 94985 94989 94993 94997 95001 95005 95009 95013 95017 95021 95025 95029 95033 95037 95041 95045 95049 95053 95057 95061 95065 95069 95073 95077 95081 95085 95089 95093 95097 95101 95105 95109 95113 95117 95121 95125 95129 95133 95137 95141 95145 95149 95153 95157 95161 95165 95169 95173 95177 95181 95185 95189 95193 95197 95201 95205 95209 95213 95217 95221 95225 95229 95233 95237 95241 95245 95249 95253 95257 95261 95265 95269 95273 95277 95281 95285 95289 95293 95297 95301 95305 95309 95313 95317 95321 95325 95329 95333 95337 95341 95345 95349 95353 95357 95361 95365 95369 95373 95377 95381 95385 95389 95393 95397 95401 95405 95409 95413 95417 95421 95425 95429 95433 95437 95441 95445 95449 95453 95457 95461 95465 95469 95473 95477 95481 95485 95489 95493 95497 95501 95505 95509 95513 95517 95521 95525 95529 95533 95537 95541 95545 95549 95553 95557 95561 95565 95569 95573 95577 95581 95585 95589 95593 95597 95601 95605 95609 95613 95617 95621 95625 95629 95633 95637 95641 95645 95649 95653 95657 95661 95665 95669 95673 95677 95681 95685 95689 95693 95697 95701 95705 95709 95713 95717 95721 95725 95729 95733 95737 95741 95745 95749 95753 95757 95761 95765 95769 95773 95777 95781 95785 95789 95793 95797 95801 95805 95809 95813 95817 95821 95825 95829 95833 95837 95841 95845 95849 95853 95857 95861 95865 95869 95873 95877 95881 95885 95889 95893 95897 95901 95905 95909 95913 95917 95921 95925 95929 95933 95937 95941 95945 95949 95953 95957 95961 95965 95969 95973 95977 95981 95985 95989 95993 95997 96001 96005 96009 96013 96017 96021 96025 96029 96033 96037 96041 96045 96049 96053 96057 96061 96065 96069 96073 96077 96081 96085 96089 96093 96097 96101 96105 96109 96113 96117 96121 96125 96129 96133 96137 96141 96145 96149 96153 96157 96161 96165 96169 96173 96177 96181 96185 96189 96193 96197 96201 96205 96209 96213 96217 96221 96225 96229 96233 96237 96241 96245 96249 96253 96257 96261 96265 96269 96273 96277 96281 96285 96289 96293 96297 96301 96305 96309 96313 96317 96321 96325 96329 96333 96337 96341 96345 96349 96353 96357 96361 96365 96369 96373 96377 96381 96385 96389 96393 96397 96401 96405 96409 96413 96417 96421 96425 96429 96433 96437 96441 96445 96449 96453 96457 96461 96465 96469 96473 96477 96481 96485 96489 96493 96497 96501 96505 96509 96513 96517 96521 96525 96529 96533 96537 96541 96545 96549 96553 96557 96561 96565 96569 96573 96577 96581 96585 96589 96593 96597 96601 96605 96609 96613 96617 96621 96625 96629 96633 96637 96641 96645 96649 96653 96657 96661 96665 96669 96673 96677 96681 96685 96689 96693 96697 96701 96705 96709 96713 96717 96721 96725 96729 96733 96737 96741 96745 96749 96753 96757 96761 96765 96769 96773 96777 96781 96785 96789 96793 96797 96801 96805 96809 96813 96817 96821 96825 96829 96833 96837 96841 96845 96849 96853 96857 96861 96865 96869 96873 96877 96881 96885 96889 96893 96897 96901 96905 96909 96913 96917 96921 96925 96929 96933 96937 96941 96945 96949 96953 96957 96961 96965 96969 96973 96977 96981 96985 96989 96993 96997 97001 97005 97009 97013 97017 97021 97025 97029 97033 97037 97041 97045 97049 97053 97057 97061 97065 97069 97073 97077 97081 97085 97089 97093 97097 97101 97105 97109 97113 97117 97121 97125 97129 97133 97137 97141 97145 97149 97153 97157 97161 97165 97169 97173 97177 97181 97185 97189 97193 97197 97201 97205 97209 97213 97217 97221 97225 97229 97233 97237 97241 97245 97249 97253 97257 97261 97265 97269 97273 97277 97281 97285 97289 97293 97297 97301 97305 97309 97313 97317 97321 97325 97329 97333 97337 97341 97345 97349 97353 97357 97361 97365 97369 97373 97377 97381 97385 97389 97393 97397 97401 97405 97409 97413 97417 97421 97425 97429 97433 97437 97441 97445 97449 97453 97457 97461 97465 97469 97473 97477 97481 97485 97489 97493 97497 97501 97505 97509 97513 97517 97521 97525 97529 97533 97537 97541 97545 97549 97553 97557 97561 97565 97569 97573 97577 97581 97585 97589 97593 97597 97601 97605 97609 97613 97617 97621 97625 97629 97633 97637 97641 97645 97649 97653 97657 97661 97665 97669 97673 97677 97681 97685 97689 97693 97697 97701 97705 97709 97713 97717 97721 97725 97729 97733 97737 97741 97745 97749 97753 97757 97761 97765 97769 97773 97777 97781 97785 97789 97793 97797 97801 97805 97809 97813 97817 97821 97825 97829 97833 97837 97841 97845 97849 97853 97857 97861 97865 97869 97873 97877 97881 97885 97889 97893 97897 97901 97905 97909 97913 97917 97921 97925 97929 97933 97937 97941 97945 97949 97953 97957 97961 97965 97969 97973 97977 97981 97985 97989 97993 97997 98001 98005 98009 98013 98017 98021 98025 98029 98033 98037 98041 98045 98049 98053 98057 98061 98065 98069 98073 98077 98081 98085 98089 98093 98097 98101 98105 98109 98113 98117 98121 98125 98129 98133 98137 98141 98145 98149 98153 98157 98161 98165 98169 98173 98177 98181 98185 98189 98193 98197 98201 98205 98209 98213 98217 98221 98225 98229 98233 98237 98241 98245 98249 98253 98257 98261 98265 98269 98273 98277 98281 98285 98289 98293 98297 98301 98305 98309 98313 98317 98321 98325 98329 98333 98337 98341 98345 98349 98353 98357 98361 98365 98369 98373 98377 98381 98385 98389 98393 98397 98401 98405 98409 98413 98417 98421 98425 98429 98433 98437 98441 98445 98449 98453 98457 98461 98465 98469 98473 98477 98481 98485 98489 98493 98497 98501 98505 98509 98513 98517 98521 98525 98529 98533 98537 98541 98545 98549 98553 98557 98561 98565 98569 98573 98577 98581 98585 98589 98593 98597 98601 98605 98609 98613 98617 98621 98625 98629 98633 98637 98641 98645 98649 98653 98657 98661 98665 98669 98673 98677 98681 98685 98689 98693 98697 98701 98705 98709 98713 98717 98721 98725 98729 98733 98737 98741 98745 98749 98753 98757 98761 98765 98769 98773 98777 98781 98785 98789 98793 98797 98801 98805 98809 98813 98817 98821 98825 98829 98833 98837 98841 98845 98849 98853 98857 98861 98865 98869 98873 98877 98881 98885 98889 98893 98897 98901 98905 98909 98913 98917 98921 98925 98929 98933 98937 98941 98945 98949 98953 98957 98961 98965 98969 98973 98977 98981 98985 98989 98993 98997 99001 99005 99009 99013 99017 99021 99025 99029 99033 99037 99041 99045 99049 99053 99057 99061 99065 99069 99073 99077 99081 99085 99089 99093 99097 99101 99105 99109 99113 99117 99121 99125 99129 99133 99137 99141 99145 99149 99153 99157 99161 99165 99169 99173 99177 99181 99185 99189 99193 99197 99201 99205 99209 99213 99217 99221 99225 99229 99233 99237 99241 99245 99249 99253 99257 99261 99265 99269 99273 99277 99281 99285 99289 99293 99297 99301 99305 99309 99313 99317 99321 99325 99329 99333 99337 99341 99345 99349 99353 99357 99361 99365 99369 99373 99377 99381 99385 99389 99393 99397 99401 99405 99409 99413 99417 99421 99425 99429 99433 99437 99441 99445 99449 99453 99457 99461 99465 99469 99473 99477 99481 99485 99489 99493 99497 99501 99505 99509 99513 99517 99521 99525 99529 99533 99537 99541 99545 99549 99553 99557 99561 99565 99569 99573 99577 99581 99585 99589 99593 99597 99601 99605 99609 99613 99617 99621 99625 99629 99633 99637 99641 99645 99649 99653 99657 99661 99665 99669 99673 99677 99681 99685 99689 99693 99697 99701 99705 99709 99713 99717 99721 99725 99729 99733 99737 99741 99745 99749 99753 99757 99761 99765 99769 99773 99777 99781 99785 99789 99793 99797 99801 99805 99809 99813 99817 99821 99825 99829 99833 99837 99841 99845 99849 99853 99857 99861 99865 99869 99873 99877 99881 99885 99889 99893 99897 99901 99905 99909 99913 99917 99921 99925 99929 99933 99937 99941 99945 99949 99953 99957 99961 99965 99969 99973 99977 99981 99985 99989 99993 99997 100001 100005 100009 100013 100017 100021 100025 100029 100033 100037 100041 100045 100049 100053 100057 100061 100065 100069 100073 100077 100081 100085 100089 100093 100097 100101 100105 100109 100113 100117 100121 100125 100129 100133 100137 100141 100145 100149 100153 100157 100161 100165 100169 100173 100177 100181 100185 100189 100193 100197 100201 100205 100209 100213 100217 100221 100225 100229 100233 100237 100241 100245 100249 100253 100257 100261 100265 100269 100273 100277 100281 100285 100289 100293 100297 100301 100305 100309 100313 100317 100321 100325 100329 100333 100337 100341 100345 100349 100353 100357 100361 100365 100369 100373 100377 100381 100385 100389 100393 100397 100401 100405 100409 100413 100417 100421 100425 100429 100433 100437 100441 100445 100449 100453 100457 100461 100465 100469 100473 100477 100481 100485 100489 100493 100497 100501 100505 100509 100513 100517 100521 100525 100529 100533 100537 100541 100545 100549 100553 100557 100561 100565 100569 100573 100577 100581 100585 100589 100593 100597 100601 100605 100609 100613 100617 100621 100625 100629 100633 100637 100641 100645 100649 100653 100657 100661 100665 100669 100673 100677 100681 100685 100689 100693 100697 100701 100705 100709 100713 100717 100721 100725 100729 100733 100737 100741 100745 100749 100753 100757 100761 100765 100769 100773 100777 100781 100785 100789 100793 100797 100801 100805 100809 100813 100817 100821 100825 100829 100833 100837 100841 100845 100849 100853 100857 100861 100865 100869 100873 100877 100881 100885 100889 100893 100897 100901 100905 100909 100913 100917 100921 100925 100929 100933 100937 100941 100945 100949 100953 100957 100961 100965 100969 100973 100977 100981 100985 100989 100993 100997 101001 101005 101009 101013 101017 101021 101025 101029 101033 101037 101041 101045 101049 101053 101057 101061 101065 101069 101073 101077 101081 101085 101089 101093 101097 101101 101105 101109 101113 101117 101121 101125 101129 101133 101137 101141 101145 101149 101153 101157 101161 101165 101169 101173 101177 101181 101185 101189 101193 101197 101201 101205 101209 101213 101217 101221 101225 101229 101233 101237 101241 101245 101249 101253 101257 101261 101265 101269 101273 101277 101281 101285 101289 101293 101297 101301 101305 101309 101313 101317 101321 101325 101329 101333 101337 101341 101345 101349 101353 101357 101361 101365 101369 101373 101377 101381 101385 101389 101393 101397 101401 101405 101409 101413 101417 101421 101425 101429 101433 101437 101441 101445 101449 101453 101457 101461 101465 101469 101473 101477 101481 101485 101489 101493 101497 101501 101505 101509 101513 101517 101521 101525 101529 101533 101537 101541 101545 101549 101553 101557 101561 101565 101569 101573 101577 101581 101585 101589 101593 101597 101601 101605 101609 101613 101617 101621 101625 101629 101633 101637 101641 101645 101649 101653 101657 101661 101665 101669 101673 101677 101681 101685 101689 101693 101697 101701 101705 101709 101713 101717 101721 101725 101729 101733 101737 101741 101745 101749 101753 101757 101761 101765 101769 101773 101777 101781 101785 101789 101793 101797 101801 101805 101809 101813 101817 101821 101825 101829 101833 101837 101841 101845 101849 101853 101857 101861 101865 101869 101873 101877 101881 101885 101889 101893 101897 101901 101905 101909 101913 101917 101921 101925 101929 101933 101937 101941 101945 101949 101953 101957 101961 101965 101969 101973 101977 101981 101985 101989 101993 101997 102001 102005 102009 102013 102017 102021 102025 102029 102033 102037 102041 102045 102049 102053 102057 102061 102065 102069 102073 102077 102081 102085 102089 102093 102097 102101 102105 102109 102113 102117 102121 102125 102129 102133 102137 102141 102145 102149 102153 102157 102161 102165 102169 102173 102177 102181 102185 102189 102193 102197 102201 102205 102209 102213 102217 102221 102225 102229 102233 102237 102241 102245 102249 102253 102257 102261 102265 102269 102273 102277 102281 102285 102289 102293 102297 102301 102305 102309 102313 102317 102321 102325 102329 102333 102337 102341 102345 102349 102353 102357 102361 102365 102369 102373 102377 102381 102385 102389 102393 102397 102401 102405 102409 102413 102417 102421 102425 102429 102433 102437 102441 102445 102449 102453 102457 102461 102465 102469 102473 102477 102481 102485 102489 102493 102497 102501 102505 102509 102513 102517 102521 102525 102529 102533 102537 102541 102545 102549 102553 102557 102561 102565 102569 102573 102577 102581 102585 102589 102593 102597 102601 102605 102609 102613 102617 102621 102625 102629 102633 102637 102641 102645 102649 102653 102657 102661 102665 102669 102673 102677 102681 102685 102689 102693 102697 102701 102705 102709 102713 102717 102721 102725 102729 102733 102737 102741 102745 102749 102753 102757 102761 102765 102769 102773 102777 102781 102785 102789 102793 102797 102801 102805 102809 102813 102817 102821 102825 102829 102833 102837 102841 102845 102849 102853 102857 102861 102865 102869 102873 102877 102881 102885 102889 102893 102897 102901 102905 102909 102913 102917 102921 102925 102929 102933 102937 102941 102945 102949 102953 102957 102961 102965 102969 102973 102977 102981 102985 102989 102993 102997 103001 103005 103009 103013 103017 103021 103025 103029 103033 103037 103041 103045 103049 103053 103057 103061 103065 103069 103073 103077 103081 103085 103089 103093 103097 103101 103105 103109 103113 103117 103121 103125 103129 103133 103137 103141 103145 103149 103153 103157 103161 103165 103169 103173 103177 103181 103185 103189 103193 103197 103201 103205 103209 103213 103217 103221 103225 103229 103233 103237 103241 103245 103249 103253 103257 103261 103265 103269 103273 103277 103281 103285 103289 103293 103297 103301 103305 103309 103313 103317 103321 103325 103329 103333 103337 103341 103345 103349 103353 103357 103361 103365 103369 103373 103377 103381 103385 103389 103393 103397 103401 103405 103409 103413 103417 103421 103425 103429 103433 103437 103441 103445 103449 103453 103457 103461 103465 103469 103473 103477 103481 103485 103489 103493 103497 103501 103505 103509 103513 103517 103521 103525 103529 103533 103537 103541 103545 103549 103553 103557 103561 103565 103569 103573 103577 103581 103585 103589 103593 103597 103601 103605 103609 103613 103617 103621 103625 103629 103633 103637 103641 103645 103649 103653 103657 103661 103665 103669 103673 103677 103681 103685 103689 103693 103697 103701 103705 103709 103713 103717 103721 103725 103729 103733 103737 103741 103745 103749 103753 103757 103761 103765 103769 103773 103777 103781 103785 103789 103793 103797 103801 103805 103809 103813 103817 103821 103825 103829 103833 103837 103841 103845 103849 103853 103857 103861 103865 103869 103873 103877 103881 103885 103889 103893 103897 103901 103905 103909 103913 103917 103921 103925 103929 103933 103937 103941 103945 103949 103953 103957 103961 103965 103969 103973 103977 103981 103985 103989 103993 103997 104001 104005 104009 104013 104017 104021 104025 104029 104033 104037 104041 104045 104049 104053 104057 104061 104065 104069 104073 104077 104081 104085 104089 104093 104097 104101 104105 104109 104113 104117 104121 104125 104129 104133 104137 104141 104145 104149 104153 104157 104161 104165 104169 104173 104177 104181 104185 104189 104193 104197 104201 104205 104209 104213 104217 104221 104225 104229 104233 104237 104241 104245 104249 104253 104257 104261 104265 104269 104273 104277 104281 104285 104289 104293 104297 104301 104305 104309 104313 104317 104321 104325 104329 104333 104337 104341 104345 104349 104353 104357 104361 104365 104369 104373 104377 104381 104385 104389 104393 104397 104401 104405 104409 104413 104417 104421 104425 104429 104433 104437 104441 104445 104449 104453 104457 104461 104465 104469 104473 104477 104481 104485 104489 104493 104497 104501 104505 104509 104513 104517 104521 104525 104529 104533 104537 104541 104545 104549 104553 104557 104561 104565 104569 104573 104577 104581 104585 104589 104593 104597 104601 104605 104609 104613 104617 104621 104625 104629 104633 104637 104641 104645 104649 104653 104657 104661 104665 104669 104673 104677 104681 104685 104689 104693 104697 104701 104705 104709 104713 104717 104721 104725 104729 104733 104737 104741 104745 104749 104753 104757 104761 104765 104769 104773 104777 104781 104785 104789 104793 104797 104801 104805 104809 104813 104817 104821 104825 104829 104833 104837 104841 104845 104849 104853 104857 104861 104865 104869 104873 104877 104881 104885 104889 104893 104897 104901 104905 104909 104913 104917 104921 104925 104929 104933 104937 104941 104945 104949 104953 104957 104961 104965 104969 104973 104977 104981 104985 104989 104993 104997 105001 105005 105009 105013 105017 105021 105025 105029 105033 105037 105041 105045 105049 105053 105057 105061 105065 105069 105073 105077 105081 105085 105089 105093 105097 105101 105105 105109 105113 105117 105121 105125 105129 105133 105137 105141 105145 105149 105153 105157 105161 105165 105169 105173 105177 105181 105185 105189 105193 105197 105201 105205 105209 105213 105217 105221 105225 105229 105233 105237 105241 105245 105249 105253 105257 105261 105265 105269 105273 105277 105281 105285 105289 105293 105297 105301 105305 105309 105313 105317 105321 105325 105329 105333 105337 105341 105345 105349 105353 105357 105361 105365 105369 105373 105377 105381 105385 105389 105393 105397 105401 105405 105409 105413 105417 105421 105425 105429 105433 105437 105441 105445 105449 105453 105457 105461 105465 105469 105473 105477 105481 105485 105489 105493 105497 105501 105505 105509 105513 105517 105521 105525 105529 105533 105537 105541 105545 105549 105553 105557 105561 105565 105569 105573 105577 105581 105585 105589 105593 105597 105601 105605 105609 105613 105617 105621 105625 105629 105633 105637 105641 105645 105649 105653 105657 105661 105665 105669 105673 105677 105681 105685 105689 105693 105697 105701 105705 105709 105713 105717 105721 105725 105729 105733 105737 105741 105745 105749 105753 105757 105761 105765 105769 105773 105777 105781 105785 105789 105793 105797 105801 105805 105809 105813 105817 105821 105825 105829 105833 105837 105841 105845 105849 105853 105857 105861 105865 105869 105873 105877 105881 105885 105889 105893 105897 105901 105905 105909 105913 105917 105921 105925 105929 105933 105937 105941 105945 105949 105953 105957 105961 105965 105969 105973 105977 105981 105985 105989 105993 105997 106001 106005 106009 106013 106017 106021 106025 106029 106033 106037 106041 106045 106049 106053 106057 106061 106065 106069 106073 106077 106081 106085 106089 106093 106097 106101 106105 106109 106113 106117 106121 106125 106129 106133 106137 106141 106145 106149 106153 106157 106161 106165 106169 106173 106177 106181 106185 106189 106193 106197 106201 106205 106209 106213 106217 106221 106225 106229 106233 106237 106241 106245 106249 106253 106257 106261 106265 106269 106273 106277 106281 106285 106289 106293 106297 106301 106305 106309 106313 106317 106321 106325 106329 106333 106337 106341 106345 106349 106353 106357 106361 106365 106369 106373 106377 106381 106385 106389 106393 106397 106401 106405 106409 106413 106417 106421 106425 106429 106433 106437 106441 106445 106449 106453 106457 106461 106465 106469 106473 106477 106481 106485 106489 106493 106497 106501 106505 106509 106513 106517 106521 106525 106529 106533 106537 106541 106545 106549 106553 106557 106561 106565 106569 106573 106577 106581 106585 106589 106593 106597 106601 106605 106609 106613 106617 106621 106625 106629 106633 106637 106641 106645 106649 106653 106657 106661 106665 106669 106673 106677 106681 106685 106689 106693 106697 106701 106705 106709 106713 106717 106721 106725 106729 106733 106737 106741 106745 106749 106753 106757 106761 106765 106769 106773 106777 106781 106785 106789 106793 106797 106801 106805 106809 106813 106817 106821 106825 106829 106833 106837 106841 106845 106849 106853 106857 106861 106865 106869 106873 106877 106881 106885 106889 106893 106897 106901 106905 106909 106913 106917 106921 106925 106929 106933 106937 106941 106945 106949 106953 106957 106961 106965 106969 106973 106977 106981 106985 106989 106993 106997 107001 107005 107009 107013 107017 107021 107025 107029 107033 107037 107041 107045 107049 107053 107057 107061 107065 107069 107073 107077 107081 107085 107089 107093 107097 107101 107105 107109 107113 107117 107121 107125 107129 107133 107137 107141 107145 107149 107153 107157 107161 107165 107169 107173 107177 107181 107185 107189 107193 107197 107201 107205 107209 107213 107217 107221 107225 107229 107233 107237 107241 107245 107249 107253 107257 107261 107265 107269 107273 107277 107281 107285 107289 107293 107297 107301 107305 107309 107313 107317 107321 107325 107329 107333 107337 107341 107345 107349 107353 107357 107361 107365 107369 107373 107377 107381 107385 107389 107393 107397 107401 107405 107409 107413 107417 107421 107425 107429 107433 107437 107441 107445 107449 107453 107457 107461 107465 107469 107473 107477 107481 107485 107489 107493 107497 107501 107505 107509 107513 107517 107521 107525 107529 107533 107537 107541 107545 107549 107553 107557 107561 107565 107569 107573 107577 107581 107585 107589 107593 107597 107601 107605 107609 107613 107617 107621 107625 107629 107633 107637 107641 107645 107649 107653 107657 107661 107665 107669 107673 107677 107681 107685 107689 107693 107697 107701 107705 107709 107713 107717 107721 107725 107729 107733 107737 107741 107745 107749 107753 107757 107761 107765 107769 107773 107777 107781 107785 107789 107793 107797 107801 107805 107809 107813 107817 107821 107825 107829 107833 107837 107841 107845 107849 107853 107857 107861 107865 107869 107873 107877 107881 107885 107889 107893 107897 107901 107905 107909 107913 107917 107921 107925 107929 107933 107937 107941 107945 107949 107953 107957 107961 107965 107969 107973 107977 107981 107985 107988 107992 107996 108000 108003 108007 108010 108014 108018 108022 108026 108030 108034 108038 108042 108046 108050 108054 108058 108062 108066 108070 108074 108078 108082 108086 108090 108094 108098 108102 108106 108110 108113 108117 108120 108124 108128 108132 108136 108140 108144 108148 108152 108156 108160 108164 108168 108172 108176 108180 108184 108188 108192 108196 108200 108204 108208 108212 108216 108220 108224 108228 108232 108236 108240 108244 108248 108252 108256 108260 108264 108268 108272 108276 108280 108284 108288 108292 108296 108300 108304 108308 108312 108316 108320 108324 108328 108332 108336 108340 108344 108348 108352 108356 108360 108364 108368 108372 108376 108380 108384 108388 108392 108396 108400 108404 108408 108412 108416 108420 108424 108428 108432 108436 108440 108444 108448 108452 108456 108460 108464 108468 108472 108476 108480 108484 108488 108492 108496 108500 108504 108508 108512 108516 108520 108524 108528 108532 108536 108540 108544 108548 108552 108556 108560 108564 108568 108572 108576 108580 108584 108588 108592 108596 108600 108604 108608 108612 108616 108620 108624 108628 108632 108636 108640 108644 108648 108652 108656 108660 108664 108668 108672 108676 108680 108684 108688 108692 108696 108700 108704 108708 108712 108716 108720 108724 108728 108732 108736 108740 108744 108748 108752 108756 108760 108764 108768 108772 108776 108780 108784 108788 108792 108796 108800 108804 108808 108812 108816 108820 108824 108828 108832 108836 108840 108844 108848 108852 108856 108860 108864 108868 108872 108876 108880 108884 108888 108892 108896 108900 108904 108908 108912 108916 108920 108924 108928 108932 108936 108940 108944 108948 108952 108956 108960 108964 108968 108972 108976 108980 108984 108988 108992 108996 109000 109004 109008 109012 109016 109020 109024 109028 109032 109036 109040 109044 109048 109052 109056 109060 109064 109068 109072 109076 109080 109084 109088 109092 109096 109100 109104 109108 109112 109116 109120 109124 109128 109132 109136 109140 109144 109148 109152 109156 109160 109164 109168 109172 109176 109180 109184 109188 109192 109196 109200 109204 109208 109212 109216 109220 109224 109228 109232 109236 109240 109244 109248 109252 109256 109260 109264 109268 109272 109276 109280 109284 109288 109292 109296 109300 109304 109308 109312 109316 109320 109324 109328 109332 109336 109340 109344 109348 109352 109356 109360 109364 109368 109372 109376 109380 109384 109388 109392 109396 109400 109404 109408 109412 109416 109420 109424 109428 109432 109436 109440 109444 109448 109452 109456 109460 109464 109468 109472 109476 109480 109484 109488 109492 109496 109500 109504 109508 109512 109516 109520 109524 109528 109532 109536 109540 109544 109548 109552 109556 109560 109564 109568 109572 109576 109580 109584 109588 109592 109596 109600 109604 109608 109612 109616 109620 109624 109628 109632 109636 109640 109644 109648 109652 109656 109660 109664 109668 109672 109676 109680 109684 109688 109692 109696 109700 109704 109708 109712 109716 109720 109724 109728 109732 109736 109740 109744 109748 109752 109756 109760 109764 109768 109772 109776 109780 109784 109788 109792 109796 109800 109804 109808 109812 109816 109820 109824 109828 109832 109836 109840 109844 109848 109852 109856 109860 109864 109868 109872 109876 109880 109884 109888 109892 109896 109900 109904 109908 109912 109916 109920 109924 109928 109932 109936 109940 109944 109948 109952 109956 109960 109964 109968 109972 109976 109980 109984 109988 109992 109996 110000 110004 110008 110012 110016 110020 110024 110028 110032 110036 110040 110044 110048 110052 110056 110060 110064 110068 110072 110076 110080 110084 110088 110092 110096 110100 110104 110108 110112 110116 110120 110124 110128 110132 110136 110140 110144 110148 110152 110156 110160 110164 110168 110172 110176 110180 110184 110188 110192 110196 110200 110204 110208 110212 110216 110220 110224 110228 110232 110236 110240 110244 110248 110252 110256 110260 110264 110268 110272 110276 110280 110284 110288 110292 110296 110300 110304 110308 110312 110316 110320 110324 110328 110332 110336 110340 110344 110348 110352 110356 110360 110364 110368 110372 110376 110380 110384 110388 110392 110396 110400 110404 110408 110412 110416 110420 110424 110428 110432 110436 110440 110444 110448 110452 110456 110460 110464 110468 110472 110476 110480 110484 110488 110492 110496 110500 110504 110508 110512 110516 110520 110524 110528 110532 110536 110540 110544 110548 110552 110556 110560 110564 110568 110572 110576 110580 110584 110588 110592 110596 110600 110604 110608 110612 110616 110620 110624 110628 110632 110636 110640 110644 110648 110652 110656 110660 110664 110668 110672 110676 110680 110684 110688 110692 110696 110700 110704 110708 110712 110716 110720 110724 110728 110732 110736 110740 110744 110748 110752 110756 110760 110764 110768 110772 110776 110780 110784 110787 110790 110793 110796 110799 110802 110805 110808 110811 110814 110817 110820 110823 110826 110829 110832 110835 110838 110841 110844 110847 110850 110853 110856 110859 110862 110865 110868 110871 110874 110877 110880 110883 110886 110889 110892 110895 110898 110901 110904 110907 110910 110913 110916 110919 110922 110925 110928 110931 110934 110937 110940 110943 110946 110949 110952 110955 110958 110961 110964 110967 110970 110973 110976 110979 110982 110985 110988 110991 110994 110997 111000 111003 111006 111009 111012 111015 111018 111021 111024 111027 111030 111033 111036 111039 111042 111045 111048 111051</loop_first_edges>\n\t\t\t<edge_points>26030 26031 0 6 26031 26094 104 0 1 7 6 0 104 105 1 0 2 8 7 1 105 106 2 1 3 9 8 2 106 107 3 2 4 10 9 3 107 108 4 3 5 55 10 4 108 109 5 4 1760 1766 55 5 109 1866 1760 5 26029 26030 6 11 7 12 11 6 8 13 12 7 9 14 13 8 10 52 14 9 10 55 53 52 26027 26029 11 15 12 16 15 11 13 17 16 12 14 18 17 13 14 52 49 18 26024 26027 15 19 16 20 19 15 17 21 20 16 18 45 21 17 18 49 46 45 26021 26024 19 22 20 23 22 19 21 40 23 20 21 45 41 40 26017 26021 22 24 23 25 24 22 23 40 35 25 26012 26017 24 26 25 29 26 24 25 35 30 29 26007 26012 26 27 26 29 28 27 1715 27711 26007 27 28 1716 1715 27 28 1724 1717 1716 30 1724 28 29 1723 1724 30 31 35 36 31 30 1722 1723 31 32 36 37 32 31 1721 1722 32 33 37 38 33 32 34 1725 1721 33 38 39 34 33 1783 3473 1725 34 1782 1783 34 39 40 41 36 35 41 42 37 36 42 43 38 37 43 44 39 38 1780 1782 39 44 45 46 42 41 46 47 43 42 47 48 44 43 1778 1780 44 48 49 50 47 46 50 51 48 47 1775 1778 48 51 52 53 50 49 53 54 51 50 1771 1775 51 54 55 1766 54 53 1767 1771 54 1766 62 26065 26064 56 26064 26157 158 56 57 63 62 56 158 159 57 56 58 64 63 57 159 160 58 57 59 65 64 58 160 161 59 58 60 66 65 59 161 162 60 59 61 83 66 60 162 163 61 60 1810 1816 83 61 163 1898 1810 61 67 26067 26065 62 63 68 67 62 64 69 68 63 65 70 69 64 66 84 70 65 83 85 84 66 71 26070 26067 67 68 72 71 67 69 73 72 68 70 74 73 69 84 86 74 70 75 26073 26070 71 72 76 75 71 73 77 76 72 74 88 77 73 86 89 88 74 78 26077 26073 75 76 79 78 75 77 91 79 76 88 92 91 77 80 26082 26077 78 79 81 80 78 91 95 81 79 82 26088 26082 80 81 99 82 80 95 100 99 81 104 26094 26088 82 99 105 104 82 1816 1822 85 83 85 87 86 84 1822 1827 87 85 87 90 89 86 1827 1831 90 87 89 93 92 88 90 94 93 89 1831 1834 94 90 92 96 95 91 93 97 96 92 94 98 97 93 1834 1837 98 94 96 101 100 95 97 102 101 96 98 103 102 97 1837 1839 103 98 100 106 105 99 101 107 106 100 102 108 107 101 103 109 108 102 1839 1866 109 103 116 26127 26126 110 26126 26210 219 110 111 117 116 110 219 220 111 110 112 118 117 111 220 221 112 111 113 119 118 112 221 222 113 112 114 120 119 113 222 223 114 113 115 136 120 114 223 224 115 114 1868 1873 136 115 224 1954 1868 115 121 26129 26127 116 117 122 121 116 118 123 122 117 119 124 123 118 120 137 124 119 136 138 137 120 125 26132 26129 121 122 126 125 121 123 127 126 122 124 128 127 123 137 139 128 124 129 26136 26132 125 126 130 129 125 127 131 130 126 128 141 131 127 139 142 141 128 132 26140 26136 129 130 133 132 129 131 144 133 130 141 145 144 131 134 26145 26140 132 133 148 134 132 144 149 148 133 135 26151 26145 134 148 153 135 134 158 26157 26151 135 153 159 158 135 1873 1879 138 136 138 140 139 137 1879 1884 140 138 140 143 142 139 1884 1888 143 140 142 146 145 141 143 147 146 142 1888 1892 147 143 145 150 149 144 146 151 150 145 147 152 151 146 1892 1895 152 147 149 154 153 148 150 155 154 149 151 156 155 150 152 157 156 151 1895 1897 157 152 154 160 159 153 155 161 160 154 156 162 161 155 157 163 162 156 1897 1898 163 157 171 26166 26158 164 26158 26258 252 164 165 172 171 164 252 275 165 164 166 173 172 165 275 276 166 165 167 174 173 166 276 277 167 166 168 175 174 167 277 278 168 167 169 176 175 168 278 279 169 168 170 197 176 169 279 280 170 169 170 2029 1929 197 2007 2029 170 280 177 26186 26166 171 172 178 177 171 173 179 178 172 174 180 179 173 175 181 180 174 176 198 181 175 197 199 198 176 182 26188 26186 177 178 183 182 177 179 184 183 178 180 185 184 179 181 186 185 180 198 200 186 181 187 26191 26188 182 183 188 187 182 184 189 188 183 185 190 189 184 186 202 190 185 200 203 202 186 191 26194 26191 187 188 192 191 187 189 193 192 188 190 205 193 189 202 206 205 190 194 26198 26194 191 192 195 194 191 193 209 195 192 205 210 209 193 194 26204 26203 26198 196 26204 194 195 209 214 196 195 219 26210 26204 196 214 220 219 196 1929 1935 199 197 199 201 200 198 1935 1940 201 199 201 204 203 200 1940 1944 204 201 203 207 206 202 204 208 207 203 1944 1948 208 204 206 211 210 205 207 212 211 206 208 213 212 207 1948 1951 213 208 210 215 214 209 211 216 215 210 212 217 216 211 213 218 217 212 1951 1953 218 213 215 221 220 214 216 222 221 215 217 223 222 216 218 224 223 217 1953 1954 224 218 231 26236 26216 225 26216 26315 336 225 226 232 231 225 336 337 226 225 227 233 232 226 337 338 227 226 228 234 233 227 338 339 228 227 229 235 234 228 339 340 229 228 230 254 235 229 340 341 230 229 253 255 254 230 341 342 253 230 236 26238 26236 231 232 237 236 231 233 238 237 232 234 239 238 233 235 240 239 234 254 256 240 235 241 26241 26238 236 237 242 241 236 238 243 242 237 239 244 243 238 240 258 244 239 256 259 258 240 245 26244 26241 241 242 246 245 241 243 247 246 242 244 261 247 243 258 262 261 244 248 26248 26244 245 246 249 248 245 247 265 249 246 261 266 265 247 250 26253 26248 248 249 251 250 248 265 270 251 249 252 26258 26253 250 251 275 252 250 270 276 275 251 1981 1987 255 253 342 2082 1981 253 255 257 256 254 1987 1992 257 255 257 260 259 256 1992 1997 260 257 259 263 262 258 260 264 263 259 1997 2001 264 260 262 267 266 261 263 268 267 262 264 269 268 263 2001 2004 269 264 266 271 270 265 267 272 271 266 268 273 272 267 269 274 273 268 2004 2006 274 269 271 277 276 270 272 278 277 271 273 279 278 272 274 280 279 273 2006 2007 280 274 287 26287 26267 281 26267 26375 391 281 282 288 287 281 391 392 282 281 283 289 288 282 392 393 283 282 284 290 289 283 393 394 284 283 285 291 290 284 394 395 285 284 286 309 291 285 395 396 286 285 286 2035 310 309 396 2119 2035 286 292 26289 26287 287 288 293 292 287 289 294 293 288 290 295 294 289 291 296 295 290 309 311 296 291 297 26292 26289 292 293 298 297 292 294 299 298 293 295 300 299 294 296 313 300 295 311 314 313 296 301 26295 26292 297 298 302 301 297 299 303 302 298 300 316 303 299 313 317 316 300 304 26299 26295 301 302 305 304 301 303 320 305 302 316 321 320 303 306 26304 26299 304 305 307 306 304 320 325 307 305 308 26309 26304 306 307 330 308 306 325 331 330 307 336 26315 26309 308 330 337 336 308 310 312 311 309 2040 2045 312 310 2036 2040 310 2035 312 315 314 311 2045 2050 315 312 314 318 317 313 315 319 318 314 2050 2054 319 315 317 322 321 316 318 323 322 317 319 324 323 318 2054 2057 324 319 321 326 325 320 322 327 326 321 323 328 327 322 324 329 328 323 2057 2059 329 324 326 332 331 325 327 333 332 326 328 334 333 327 329 335 334 328 2059 2060 335 329 331 338 337 330 332 339 338 331 333 340 339 332 334 341 340 333 335 342 341 334 2060 2082 342 335 349 26347 26316 343 26316 26435 445 343 344 350 349 343 445 446 344 343 345 351 350 344 446 447 345 344 346 352 351 345 447 448 346 345 347 353 352 346 448 449 347 346 348 371 353 347 449 450 348 347 2088 2091 371 348 450 2178 2088 348 354 26349 26347 349 350 355 354 349 351 356 355 350 352 357 356 351 353 358 357 352 371 372 358 353 359 26352 26349 354 355 360 359 354 356 361 360 355 357 362 361 356 358 373 362 357 372 374 373 358 363 26355 26352 359 360 364 363 359 361 365 364 360 362 375 365 361 373 376 375 362 366 26359 26355 363 364 367 366 363 365 378 367 364 375 379 378 365 368 26364 26359 366 367 369 368 366 378 382 369 367 370 26369 26364 368 369 386 370 368 382 387 386 369 391 26375 26369 370 386 392 391 370 2091 2097 372 371 2097 2103 374 372 374 377 376 373 2103 2108 377 374 376 380 379 375 377 381 380 376 2108 2112 381 377 379 383 382 378 380 384 383 379 381 385 384 380 2112 2115 385 381 383 388 387 382 384 389 388 383 385 390 389 384 2115 2117 390 385 387 393 392 386 388 394 393 387 389 395 394 388 390 396 395 389 2117 2119 396 390 403 26407 26376 397 26376 26492 494 397 398 404 403 397 494 495 398 397 399 405 404 398 495 496 399 398 400 406 405 399 496 497 400 399 401 407 406 400 497 498 401 400 402 425 407 401 498 499 402 401 2149 2150 425 402 499 2238 2149 402 408 26409 26407 403 404 409 408 403 405 410 409 404 406 411 410 405 407 412 411 406 425 426 412 407 413 26412 26409 408 409 414 413 408 410 415 414 409 411 416 415 410 412 427 416 411 426 428 427 412 417 26415 26412 413 414 418 417 413 415 419 418 414 416 429 419 415 427 430 429 416 420 26419 26415 417 418 421 420 417 419 432 421 418 429 433 432 419 422 26424 26419 420 421 423 422 420 432 436 423 421 424 26429 26424 422 423 440 424 422 436 441 440 423 445 26435 26429 424 440 446 445 424 2150 2156 426 425 2156 2162 428 426 428 431 430 427 2162 2167 431 428 430 434 433 429 431 435 434 430 2167 2171 435 431 433 437 436 432 434 438 437 433 435 439 438 434 2171 2174 439 435 437 442 441 436 438 443 442 437 439 444 443 438 2174 2176 444 439 441 447 446 440 442 448 447 441 443 449 448 442 444 450 449 443 2176 2178 450 444 452 26465 26436 451 26436 26548 545 451 451 551 453 452 546 551 451 545 457 26467 26465 452 453 458 457 452 454 459 458 453 551 552 454 453 455 460 459 454 552 553 455 454 456 461 460 455 553 554 456 455 474 475 461 456 554 555 474 456 462 26469 26467 457 458 463 462 457 459 464 463 458 460 465 464 459 461 476 465 460 475 477 476 461 466 26472 26469 462 463 467 466 462 464 468 467 463 465 478 468 464 476 479 478 465 469 26476 26472 466 467 470 469 466 468 481 470 467 478 482 481 468 471 26481 26476 469 470 472 471 469 481 485 472 470 473 26486 26481 471 472 489 473 471 485 490 489 472 494 26492 26486 473 489 495 494 473 2210 2216 475 474 555 2316 2210 474 2216 2222 477 475 477 480 479 476 2222 2227 480 477 479 483 482 478 480 484 483 479 2227 2231 484 480 482 486 485 481 483 487 486 482 484 488 487 483 2231 2234 488 484 486 491 490 485 487 492 491 486 488 493 492 487 2234 2236 493 488 490 496 495 489 491 497 496 490 492 498 497 491 493 499 498 492 2236 2238 499 493 506 26525 26501 500 26501 26608 588 500 501 507 506 500 588 613 501 500 502 508 507 501 613 614 502 501 503 509 508 502 614 615 503 502 504 510 509 503 615 616 504 503 505 511 510 504 616 617 505 504 525 526 511 505 617 618 525 505 512 26526 26525 506 507 513 512 506 508 514 513 507 509 515 514 508 510 516 515 509 511 527 516 510 526 528 527 511 512 26529 26528 26526 517 26529 512 513 514 518 517 513 515 519 518 514 516 529 519 515 527 530 529 516 520 26533 26529 517 518 521 520 517 519 532 521 518 529 533 532 519 522 26537 26533 520 521 523 522 520 532 536 523 521 524 26542 26537 522 523 540 524 522 536 541 540 523 545 26548 26542 524 540 546 545 524 2268 2274 526 525 618 2368 2268 525 2274 2280 528 526 528 531 530 527 2280 2285 531 528 530 534 533 529 531 535 534 530 2285 2289 535 531 533 537 536 532 534 538 537 533 535 539 538 534 2289 2292 539 535 537 542 541 536 538 543 542 537 539 544 543 538 2292 2294 544 539 541 547 546 540 542 548 547 541 543 549 548 542 544 550 549 543 2294 2296 550 544 547 552 551 546 548 553 552 547 549 554 553 548 550 555 554 549 2296 2316 555 550 563 26585 26555 556 26555 26659 651 556 557 564 563 556 651 676 557 556 558 565 564 557 676 677 558 557 559 566 565 558 677 678 559 558 560 567 566 559 678 679 560 559 561 568 567 560 679 680 561 560 562 589 568 561 680 681 562 561 2322 2326 589 562 681 2417 2322 562 569 26586 26585 563 564 570 569 563 565 571 570 564 566 572 571 565 567 573 572 566 568 590 573 567 589 591 590 568 574 26588 26586 569 570 575 574 569 571 576 575 570 572 577 576 571 573 592 577 572 590 593 592 573 578 26591 26588 574 575 579 578 574 576 580 579 575 577 581 580 576 592 595 581 577 582 26594 26591 578 579 583 582 578 580 584 583 579 581 598 584 580 595 599 598 581 585 26598 26594 582 583 586 585 582 584 602 586 583 598 603 602 584 587 26603 26598 585 586 607 587 585 602 608 607 586 588 26608 26603 587 607 613 588 587 2326 2332 591 589 591 594 593 590 2332 2337 594 591 593 596 595 592 594 597 596 593 2337 2341 597 594 596 600 599 595 597 601 600 596 2341 2344 601 597 599 604 603 598 600 605 604 599 601 606 605 600 2344 2347 606 601 603 609 608 602 604 610 609 603 605 611 610 604 606 612 611 605 2347 2349 612 606 608 614 613 607 609 615 614 608 610 616 615 609 611 617 616 610 612 618 617 611 2349 2368 618 612 626 26636 26609 619 26609 26708 713 619 620 627 626 619 713 736 620 619 621 628 627 620 736 737 621 620 622 629 628 621 737 738 622 621 623 630 629 622 738 739 623 622 624 631 630 623 739 740 624 623 625 652 631 624 740 741 625 624 2374 2375 652 625 741 2467 2374 625 632 26637 26636 626 627 633 632 626 628 634 633 627 629 635 634 628 630 636 635 629 631 653 636 630 652 654 653 631 637 26639 26637 632 633 638 637 632 634 639 638 633 635 640 639 634 636 655 640 635 653 656 655 636 641 26642 26639 637 638 642 641 637 639 643 642 638 640 644 643 639 655 658 644 640 645 26645 26642 641 642 646 645 641 643 647 646 642 644 661 647 643 658 662 661 644 648 26649 26645 645 646 649 648 645 647 665 649 646 661 666 665 647 650 26654 26649 648 649 670 650 648 665 671 670 649 651 26659 26654 650 670 676 651 650 2375 2381 654 652 654 657 656 653 2381 2386 657 654 656 659 658 655 657 660 659 656 2386 2390 660 657 659 663 662 658 660 664 663 659 2390 2393 664 660 662 667 666 661 663 668 667 662 664 669 668 663 2393 2396 669 664 666 672 671 665 667 673 672 666 668 674 673 667 669 675 674 668 2396 2398 675 669 671 677 676 670 672 678 677 671 673 679 678 672 674 680 679 673 675 681 680 674 2398 2417 681 675 686 26666 26660 682 26660 26760 770 682 683 687 686 682 770 791 683 682 684 688 687 683 791 792 684 683 685 689 688 684 792 793 685 684 685 797 690 689 794 797 685 793 692 26687 26666 686 687 693 692 686 688 694 693 687 689 695 694 688 690 696 695 689 691 715 696 690 797 798 691 690 714 716 715 691 798 799 714 691 697 26689 26687 692 693 698 697 692 694 699 698 693 695 700 699 694 696 701 700 695 715 717 701 696 702 26691 26689 697 698 703 702 697 699 704 703 698 700 705 704 699 701 719 705 700 717 720 719 701 706 26694 26691 702 703 707 706 702 704 708 707 703 705 722 708 704 719 723 722 705 709 26698 26694 706 707 710 709 706 708 726 710 707 722 727 726 708 711 26703 26698 709 710 712 711 709 726 731 712 710 713 26708 26703 711 712 736 713 711 731 737 736 712 2425 2431 716 714 799 2526 2425 714 716 718 717 715 2431 2436 718 716 718 721 720 717 2436 2440 721 718 720 724 723 719 721 725 724 720 2440 2444 725 721 723 728 727 722 724 729 728 723 725 730 729 724 2444 2447 730 725 727 732 731 726 728 733 732 727 729 734 733 728 730 735 734 729 2447 2449 735 730 732 738 737 731 733 739 738 732 734 740 739 733 735 741 740 734 2449 2467 741 735 747 26739 742 748 26739 26827 848 742 743 749 748 742 848 849 743 742 744 750 749 743 849 850 744 743 745 751 750 744 850 851 745 744 746 752 751 745 851 852 746 745 771 772 752 746 852 853 771 746 753 26742 26740 747 747 26740 26717 26739 748 754 753 747 749 755 754 748 750 756 755 749 751 757 756 750 752 773 757 751 772 774 773 752 758 26744 26742 753 754 759 758 753 755 760 759 754 756 761 760 755 757 775 761 756 773 776 775 757 762 26747 26744 758 759 763 762 758 760 764 763 759 761 778 764 760 775 779 778 761 765 26751 26747 762 763 766 765 762 764 767 766 763 778 782 767 764 768 26755 26751 765 766 769 768 765 767 786 769 766 782 787 786 767 770 26760 26755 768 769 791 770 768 786 792 791 769 2478 2484 772 771 853 2580 2478 771 2484 2490 774 772 774 777 776 773 2490 2495 777 774 776 780 779 775 777 781 780 776 2495 2499 781 777 779 783 782 778 780 784 783 779 781 785 784 780 2499 2502 785 781 783 788 787 782 784 789 788 783 785 790 789 784 2502 2504 790 785 787 793 792 786 788 794 793 787 789 795 794 788 790 796 795 789 2504 2505 796 790 795 798 797 794 796 799 798 795 2505 2526 799 796 806 26797 26796 800 26796 26879 906 800 801 807 806 800 906 907 801 800 802 808 807 801 907 908 802 801 803 809 808 802 908 909 803 802 804 810 809 803 909 910 804 803 805 825 810 804 910 911 805 804 2532 2535 825 805 911 2614 2532 805 811 26799 26797 806 807 812 811 806 808 813 812 807 809 814 813 808 810 826 814 809 825 827 826 810 815 26802 26799 811 812 816 815 811 813 817 816 812 814 818 817 813 826 828 818 814 819 26806 26802 815 816 820 819 815 817 821 820 816 818 830 821 817 828 831 830 818 822 26810 26806 819 820 823 822 819 821 833 823 820 830 834 833 821 824 26815 26810 822 823 837 824 822 833 838 837 823 842 26821 26815 824 837 843 842 824 2535 2541 827 825 827 829 828 826 2541 2546 829 827 829 832 831 828 2546 2550 832 829 831 835 834 830 832 836 835 831 2550 2554 836 832 834 839 838 833 835 840 839 834 836 841 840 835 2554 2557 841 836 838 844 843 837 839 845 844 838 840 846 845 839 841 847 846 840 2557 2559 847 841 848 26827 26821 842 843 849 848 842 844 850 849 843 845 851 850 844 846 852 851 845 847 853 852 846 2559 2580 853 847 860 26853 26828 854 26828 26899 912 854 855 861 860 854 856 862 861 855 923 924 856 855 857 863 862 856 924 925 857 856 858 864 863 857 925 926 858 857 859 865 864 858 926 927 859 858 859 929 884 865 928 929 859 927 866 26855 26853 860 861 867 866 860 862 868 867 861 863 869 868 862 864 870 869 863 865 885 870 864 884 886 885 865 871 26857 26855 866 867 872 871 866 868 873 872 867 869 874 873 868 870 887 874 869 885 888 887 870 875 26860 26857 871 872 876 875 871 873 877 876 872 874 890 877 873 887 891 890 874 878 26864 26860 875 876 879 878 875 877 880 879 876 890 894 880 877 881 26868 26864 878 879 882 881 878 880 897 882 879 894 898 897 880 883 26873 26868 881 882 901 883 881 897 902 901 882 906 26879 26873 883 901 907 906 883 2586 2590 886 884 929 2671 2586 884 886 889 888 885 2590 2596 889 886 888 892 891 887 889 893 892 888 2596 2601 893 889 891 895 894 890 892 896 895 891 893 2605 896 892 2601 2606 2605 893 895 899 898 894 896 900 899 895 2605 2609 900 896 898 903 902 897 899 904 903 898 900 905 904 899 2609 2612 905 900 902 908 907 901 903 909 908 902 904 910 909 903 905 911 910 904 2612 2614 911 905 26904 26905 912 26899 26909 26911 914 913 945 949 917 946 918 921 920 919 922 921 918 2650 2654 922 919 2645 2650 919 920 926 925 921 927 926 920 922 928 927 921 2654 2657 928 922 2657 2671 929 928 26928 26930 933 930 933 934 931 930 945 946 931 932 934 935 932 931 26932 26933 933 26930 933 26933 938 934 938 939 935 934 939 940 936 935 947 948 936 937 940 941 937 936 26933 26936 944 938 1012 1013 940 939 1013 1014 941 940 1014 1015 942 941 950 951 942 943 1015 1016 943 942 26936 26994 1017 944 952 953 948 947 950 957 956 951 951 956 955 952 952 955 954 953 953 954 956 958 955 957 959 958 956 2686 2690 959 957 959 960 958 2690 2693 960 959 2693 2695 961 960 2695 2712 2696 961 1073 1074 991 962 991 992 971 962 1072 1073 962 963 962 971 970 963 1071 1072 963 964 963 970 969 964 1070 1071 964 965 964 969 968 965 965 1076 1069 1070 967 1076 965 968 972 26967 26947 966 26947 27048 1075 966 967 973 972 966 1075 1076 967 966 968 974 973 967 969 975 974 968 970 976 975 969 971 993 976 970 992 994 993 971 977 26969 26967 972 973 978 977 972 974 979 978 973 975 980 979 974 976 995 980 975 993 996 995 976 981 26972 26969 977 978 982 981 977 979 983 982 978 980 997 983 979 995 998 997 980 984 26976 26972 981 982 985 984 981 983 986 985 982 997 1000 986 983 987 26981 26976 984 985 988 987 984 986 1003 988 985 1000 1004 1003 986 989 26986 26981 987 988 1007 989 987 1003 1008 1007 988 990 26992 26986 989 1007 1012 990 989 1017 26994 26992 990 2716 2721 992 991 1074 2817 2716 991 2721 2725 994 992 994 2728 996 993 2725 2729 2728 994 996 999 998 995 2728 2732 999 996 998 1001 1000 997 999 1002 1001 998 2732 2735 1002 999 1001 1005 1004 1000 1002 1006 1005 1001 2735 2737 1006 1002 1004 1009 1008 1003 1005 1010 1009 1004 1006 1011 1010 1005 2737 2739 1011 1006 1008 1013 1012 1007 1009 1014 1013 1008 1010 1015 1014 1009 1011 1016 1015 1010 1011 2739 2685 1016 1124 2872 2769 1018 2769 2774 1048 1018 1123 1124 1018 1019 1018 1048 1024 1019 1019 1128 1122 1123 1023 1128 1019 1024 1025 27022 1020 1026 27022 27111 1125 1020 1021 1027 1026 1020 1125 1126 1021 1020 1022 1028 1027 1021 1126 1127 1022 1021 1023 1029 1028 1022 1127 1128 1023 1022 1024 1049 1029 1023 1048 1050 1049 1024 1030 27024 27023 1025 1025 27023 27000 27022 1026 1031 1030 1025 1027 1032 1031 1026 1028 1033 1032 1027 1029 1034 1033 1028 1049 1051 1034 1029 1035 27026 27024 1030 1031 1036 1035 1030 1032 1037 1036 1031 1033 1038 1037 1032 1034 1053 1038 1033 1051 1054 1053 1034 1039 27029 27026 1035 1036 1040 1039 1035 1037 1041 1040 1036 1038 1056 1041 1037 1053 1057 1056 1038 1042 27033 27029 1039 1040 1043 1042 1039 1041 1044 1043 1040 1056 1060 1044 1041 1045 27038 27033 1042 1043 1046 1045 1042 1044 1064 1046 1043 1060 1065 1064 1044 1047 27043 27038 1045 1046 1069 1047 1045 1064 1070 1069 1046 1075 27048 27043 1047 1069 1076 1075 1047 2774 2779 1050 1048 1050 1052 1051 1049 2779 2783 1052 1050 1052 1055 1054 1051 2783 2786 1055 1052 1054 1058 1057 1053 1055 1059 1058 1054 2786 2789 1059 1055 1057 1061 1060 1056 1058 1062 1061 1057 1059 1063 1062 1058 2789 2791 1063 1059 1061 1066 1065 1060 1062 1067 1066 1061 1063 1068 1067 1062 2791 2792 1068 1063 1065 1071 1070 1064 1066 1072 1071 1065 1067 1073 1072 1066 1068 1074 1073 1067 2792 2817 1074 1068 1082 27080 27079 1077 27079 27174 1177 1077 1078 1083 1082 1077 1177 1178 1078 1077 1079 1084 1083 1078 1178 1179 1079 1078 1080 1085 1084 1079 1179 1180 1080 1079 1081 1086 1085 1080 1180 1181 1081 1080 1101 1102 1086 1081 1181 1182 1101 1081 1087 27082 27080 1082 1083 1088 1087 1082 1084 1089 1088 1083 1085 1090 1089 1084 1086 1103 1090 1085 1102 1104 1103 1086 1091 27085 27082 1087 1088 1092 1091 1087 1089 1093 1092 1088 1090 1105 1093 1089 1103 1106 1105 1090 1094 27089 27085 1091 1092 1095 1094 1091 1093 1096 1095 1092 1105 1108 1096 1093 1097 27093 27089 1094 1095 1098 1097 1094 1096 1111 1098 1095 1108 1112 1111 1096 1099 27098 27093 1097 1098 1115 1099 1097 1111 1116 1115 1098 1100 27104 27098 1099 1115 1120 1100 1099 1125 27111 27104 1100 1120 1126 1125 1100 2825 2830 1102 1101 2824 2825 1101 1182 2830 2834 1104 1102 1104 1107 1106 1103 2834 2838 1107 1104 1106 1109 1108 1105 1107 1110 1109 1106 2838 2841 1110 1107 1109 1113 1112 1108 1110 1114 1113 1109 2841 2843 1114 1110 1112 1117 1116 1111 1113 1118 1117 1112 1114 1119 1118 1113 2843 2845 1119 1114 1116 1121 1120 1115 1117 1122 1121 1116 1118 1123 1122 1117 1119 1124 1123 1118 2845 2872 1124 1119 1121 1127 1126 1120 1122 1128 1127 1121 1135 27145 27118 1129 27118 27232 1230 1129 1130 1136 1135 1129 1230 1231 1130 1129 1131 1137 1136 1130 1231 1232 1131 1130 1132 1138 1137 1131 1232 1233 1132 1131 1133 1139 1138 1132 1233 1234 1133 1132 1134 1155 1139 1133 1234 1235 1134 1133 2880 2885 1155 1134 1235 2996 2880 1134 1140 27147 27145 1135 1136 1141 1140 1135 1137 1142 1141 1136 1138 1143 1142 1137 1139 1156 1143 1138 1155 1157 1156 1139 1144 27150 27147 1140 1141 1145 1144 1140 1142 1146 1145 1141 1143 1147 1146 1142 1156 1158 1147 1143 1148 27153 27150 1144 1145 1149 1148 1144 1146 1150 1149 1145 1147 1160 1150 1146 1158 1161 1160 1147 1151 27157 27153 1148 1149 1152 1151 1148 1150 1163 1152 1149 1160 1164 1163 1150 1153 27162 27157 1151 1152 1167 1153 1151 1163 1168 1167 1152 1154 27168 27162 1153 1167 1172 1154 1153 1177 27174 27168 1154 1172 1178 1177 1154 2885 2890 1157 1155 1157 1159 1158 1156 2890 2894 1159 1157 1159 1162 1161 1158 2894 2897 1162 1159 1161 1165 1164 1160 1162 1166 1165 1161 2897 2900 1166 1162 1164 1169 1168 1163 1165 1170 1169 1164 1166 1171 1170 1165 2900 2902 1171 1166 1168 1173 1172 1167 1169 1174 1173 1168 1170 1175 1174 1169 1171 1176 1175 1170 2902 2903 1176 1171 1173 1179 1178 1172 1174 1180 1179 1173 1175 1181 1180 1174 1176 1182 1181 1175 1176 2903 2824 1182 1286 3056 2939 1183 2939 2944 1209 1183 1285 1286 1183 1184 1183 1209 1192 1184 1284 1285 1184 1185 1184 1192 1191 1185 1283 1284 1185 1186 1185 1191 1190 1186 1282 1283 1186 1187 1186 1190 1189 1187 1187 1287 1281 1282 1188 1287 1187 1189 1193 27207 27205 1188 27205 27293 1287 1188 1189 1194 1193 1188 1190 1195 1194 1189 1191 1196 1195 1190 1192 1210 1196 1191 1209 1211 1210 1192 1197 27209 27207 1193 1194 1198 1197 1193 1195 1199 1198 1194 1196 1200 1199 1195 1210 1212 1200 1196 1201 27212 27209 1197 1198 1202 1201 1197 1199 1203 1202 1198 1200 1214 1203 1199 1212 1215 1214 1200 1204 27216 27212 1201 1202 1205 1204 1201 1203 1217 1205 1202 1214 1218 1217 1203 1206 27221 27216 1204 1205 1207 1206 1204 1217 1221 1207 1205 1208 27226 27221 1206 1207 1225 1208 1206 1221 1226 1225 1207 1230 27232 27226 1208 1225 1231 1230 1208 2944 2949 1211 1209 1211 1213 1212 1210 2949 2953 1213 1211 1213 1216 1215 1212 2953 2957 1216 1213 1215 1219 1218 1214 1216 1220 1219 1215 2957 2960 1220 1216 1218 1222 1221 1217 1219 1223 1222 1218 1220 1224 1223 1219 2960 2962 1224 1220 1222 1227 1226 1221 1223 1228 1227 1222 1224 1229 1228 1223 2962 2964 1229 1224 1226 1232 1231 1225 1227 1233 1232 1226 1228 1234 1233 1227 1229 1235 1234 1228 2964 2996 1235 1229 1342 3108 3000 1236 3000 3006 1260 1236 1341 1342 1236 1237 1236 1260 1243 1237 1340 1341 1237 1238 1237 1243 1242 1238 1238 1345 1339 1340 1241 1345 1238 1242 1244 27263 27261 1239 27261 27350 1343 1239 1240 1245 1244 1239 1343 1344 1240 1239 1241 1246 1245 1240 1344 1345 1241 1240 1242 1247 1246 1241 1243 1261 1247 1242 1260 1262 1261 1243 1248 27265 27263 1244 1245 1249 1248 1244 1246 1250 1249 1245 1247 1251 1250 1246 1261 1263 1251 1247 1252 27268 27265 1248 1249 1253 1252 1248 1250 1254 1253 1249 1251 1265 1254 1250 1263 1266 1265 1251 1255 27272 27268 1252 1253 1256 1255 1252 1254 1268 1256 1253 1265 1269 1268 1254 1257 27277 27272 1255 1256 1258 1257 1255 1268 1272 1258 1256 1259 27282 27277 1257 1258 1276 1259 1257 1272 1277 1276 1258 1281 27288 27282 1259 1276 1282 1281 1259 3006 3011 1262 1260 1262 1264 1263 1261 3011 3015 1264 1262 1264 1267 1266 1263 3015 3019 1267 1264 1266 1270 1269 1265 1267 1271 1270 1266 3019 3022 1271 1267 1269 1273 1272 1268 1270 1274 1273 1269 1271 1275 1274 1270 3022 3024 1275 1271 1273 1278 1277 1272 1274 1279 1278 1273 1275 1280 1279 1274 3024 3026 1280 1275 1277 1283 1282 1276 1278 1284 1283 1277 1279 1285 1284 1278 1280 1286 1285 1279 3026 3056 1286 1280 1287 27293 27288 1281 1402 3160 3060 1288 3060 3066 1316 1288 1288 1407 1401 1402 1294 1407 1288 1316 1295 27322 27299 1289 27299 27404 1376 1289 1290 1296 1295 1289 1376 1403 1290 1289 1291 1297 1296 1290 1403 1404 1291 1290 1292 1298 1297 1291 1404 1405 1292 1291 1293 1299 1298 1292 1405 1406 1293 1292 1294 1317 1299 1293 1406 1407 1294 1293 1316 1318 1317 1294 1300 27323 27322 1295 1296 1301 1300 1295 1297 1302 1301 1296 1298 1303 1302 1297 1299 1304 1303 1298 1317 1319 1304 1299 1305 27325 27323 1300 1301 1306 1305 1300 1302 1307 1306 1301 1303 1308 1307 1302 1304 1321 1308 1303 1319 1322 1321 1304 1309 27328 27325 1305 1306 1310 1309 1305 1307 1311 1310 1306 1308 1324 1311 1307 1321 1325 1324 1308 1312 27332 27328 1309 1310 1313 1312 1309 1311 1314 1313 1310 1324 1328 1314 1311 1312 27337 27336 27332 1315 27337 1312 1313 1314 1332 1315 1313 1328 1333 1332 1314 1337 27343 27337 1315 1332 1338 1337 1315 3066 3071 1318 1316 1318 1320 1319 1317 3071 3075 1320 1318 1320 1323 1322 1319 3075 3079 1323 1320 1322 1326 1325 1321 1323 1327 1326 1322 3079 3082 1327 1323 1325 1329 1328 1324 1326 1330 1329 1325 1327 1331 1330 1326 3082 3084 1331 1327 1329 1334 1333 1328 1330 1335 1334 1329 1331 1336 1335 1330 3084 3086 1336 1331 1333 1339 1338 1332 1334 1340 1339 1333 1335 1341 1340 1334 1336 1342 1341 1335 3086 3108 1342 1336 1343 27350 27343 1337 1338 1344 1343 1337 1339 1345 1344 1338 1352 27380 27356 1346 27356 27454 1436 1346 1347 1353 1352 1346 1436 1464 1347 1346 1348 1354 1353 1347 1464 1465 1348 1347 1349 1355 1354 1348 1465 1466 1349 1348 1350 1356 1355 1349 1466 1467 1350 1349 1351 1357 1356 1350 1467 1468 1351 1350 1377 1378 1357 1351 1468 1469 1377 1351 1358 27381 27380 1352 1353 1359 1358 1352 1354 1360 1359 1353 1355 1361 1360 1354 1356 1362 1361 1355 1357 1379 1362 1356 1378 1380 1379 1357 1363 27383 27381 1358 1359 1364 1363 1358 1360 1365 1364 1359 1361 1366 1365 1360 1362 1381 1366 1361 1379 1382 1381 1362 1367 27386 27383 1363 1364 1368 1367 1363 1365 1369 1368 1364 1366 1384 1369 1365 1381 1385 1384 1366 1370 27389 27386 1367 1368 1371 1370 1367 1369 1372 1371 1368 1384 1388 1372 1369 1373 27393 27389 1370 1371 1374 1373 1370 1372 1392 1374 1371 1388 1393 1392 1372 1375 27398 27393 1373 1374 1397 1375 1373 1392 1398 1397 1374 1376 27404 27398 1375 1397 1403 1376 1375 3118 3123 1378 1377 3117 3118 1377 1469 3123 3127 1380 1378 1380 1383 1382 1379 3127 3131 1383 1380 1382 1386 1385 1381 1383 1387 1386 1382 3131 3134 1387 1383 1385 1389 1388 1384 1386 1390 1389 1385 1387 1391 1390 1386 3134 3136 1391 1387 1389 1394 1393 1388 1390 1395 1394 1389 1391 1396 1395 1390 3136 3138 1396 1391 1393 1399 1398 1392 1394 1400 1399 1393 1395 1401 1400 1394 1396 1402 1401 1395 3138 3160 1402 1396 1398 1404 1403 1397 1399 1405 1404 1398 1400 1406 1405 1399 1401 1407 1406 1400 1524 1525 1437 1408 1437 1439 1438 1408 1523 1524 1408 1409 1408 1438 1417 1409 1522 1523 1409 1410 1409 1417 1416 1410 1521 1522 1410 1411 1410 1416 1415 1411 1520 1521 1411 1412 1411 1415 1414 1412 1412 1526 1496 1520 1413 1526 1412 1414 1418 27431 27430 1413 27430 27508 1526 1413 1414 1419 1418 1413 1415 1420 1419 1414 1416 1421 1420 1415 1417 1422 1421 1416 1438 1440 1422 1417 1423 27433 27431 1418 1419 1424 1423 1418 1420 1425 1424 1419 1421 1426 1425 1420 1422 1442 1426 1421 1440 1443 1442 1422 1427 27436 27433 1423 1424 1428 1427 1423 1425 1429 1428 1424 1426 1445 1429 1425 1442 1446 1445 1426 1430 27439 27436 1427 1428 1431 1430 1427 1429 1432 1431 1428 1445 1449 1432 1429 1433 27443 27439 1430 1431 1434 1433 1430 1432 1453 1434 1431 1449 1454 1453 1432 1435 27448 27443 1433 1434 1458 1435 1433 1453 1459 1458 1434 1436 27454 27448 1435 1458 1464 1436 1435 3170 3175 1439 1437 1525 3274 3170 1437 1439 1441 1440 1438 3175 3179 1441 1439 1441 1444 1443 1440 3179 3183 1444 1441 1443 1447 1446 1442 1444 1448 1447 1443 3183 3186 1448 1444 1446 1450 1449 1445 1447 1451 1450 1446 1448 1452 1451 1447 3186 3188 1452 1448 1450 1455 1454 1449 1451 1456 1455 1450 1452 1457 1456 1451 3188 3190 1457 1452 1454 1460 1459 1453 1455 1461 1460 1454 1456 1462 1461 1455 1457 1463 1462 1456 3190 3212 1463 1457 1459 1465 1464 1458 1460 1466 1465 1459 1461 1467 1466 1460 1462 1468 1467 1461 1463 1469 1468 1462 1463 3212 3117 1469 1575 3306 3221 1470 3221 3227 1497 1470 1574 1575 1470 1471 1470 1497 1477 1471 1573 1574 1471 1472 1471 1477 1476 1472 1472 1578 1572 1573 1475 1578 1472 1476 1478 27481 27480 1473 27480 27571 1576 1473 1474 1479 1478 1473 1576 1577 1474 1473 1475 1480 1479 1474 1577 1578 1475 1474 1476 1481 1480 1475 1477 1482 1481 1476 1497 1498 1482 1477 1483 27483 27481 1478 1479 1484 1483 1478 1480 1485 1484 1479 1481 1486 1485 1480 1482 1499 1486 1481 1498 1500 1499 1482 1487 27486 27483 1483 1484 1488 1487 1483 1485 1489 1488 1484 1486 1501 1489 1485 1499 1502 1501 1486 1490 27489 27486 1487 1488 1491 1490 1487 1489 1492 1491 1488 1501 1505 1492 1489 1493 27493 27489 1490 1491 1494 1493 1490 1492 1509 1494 1491 1505 1510 1509 1492 1495 27498 27493 1493 1494 1514 1495 1493 1509 1515 1514 1494 1496 27504 27498 1495 1514 1520 1496 1495 1526 27508 27504 1496 3227 3232 1498 1497 3232 3237 1500 1498 1500 1503 1502 1499 1500 3237 1504 1503 1502 1506 1505 1501 1503 1507 1506 1502 1504 1508 1507 1503 3241 3243 1508 1504 3238 3241 1504 3237 1506 1511 1510 1505 1507 1512 1511 1506 1508 1513 1512 1507 3243 3245 1513 1508 1510 1516 1515 1509 1511 1517 1516 1510 1512 1518 1517 1511 1513 1519 1518 1512 3245 3268 1519 1513 1515 1521 1520 1514 1516 1522 1521 1515 1517 1523 1522 1516 1518 1524 1523 1517 1519 1525 1524 1518 3268 3274 1525 1519 1626 3366 3277 1527 3277 3283 1552 1527 1527 1631 1625 1626 1532 1631 1527 1552 1533 27542 27541 1528 27541 27634 1627 1528 1529 1534 1533 1528 1627 1628 1529 1528 1530 1535 1534 1529 1628 1629 1530 1529 1531 1536 1535 1530 1629 1630 1531 1530 1532 1537 1536 1531 1630 1631 1532 1531 1552 1553 1537 1532 1538 27544 27542 1533 1534 1539 1538 1533 1535 1540 1539 1534 1536 1541 1540 1535 1537 1554 1541 1536 1553 1555 1554 1537 1542 27547 27544 1538 1539 1543 1542 1538 1540 1544 1543 1539 1541 1556 1544 1540 1554 1557 1556 1541 1545 27550 27547 1542 1543 1546 1545 1542 1544 1547 1546 1543 1556 1559 1547 1544 1548 27554 27550 1545 1546 1549 1548 1545 1547 1562 1549 1546 1559 1563 1562 1547 1550 27559 27554 1548 1549 1566 1550 1548 1562 1567 1566 1549 1551 27565 27559 1550 1566 1571 1551 1550 1576 27571 27565 1551 1571 1577 1576 1551 3283 3288 1553 1552 3288 3293 1555 1553 1555 1558 1557 1554 3293 3297 1558 1555 1557 1560 1559 1556 1558 1561 1560 1557 3297 3300 1561 1558 1560 1564 1563 1559 1561 1565 1564 1560 3300 3303 1565 1561 1563 1568 1567 1562 1564 1569 1568 1563 1565 1570 1569 1564 3303 3305 1570 1565 1567 1572 1571 1566 1568 1573 1572 1567 1569 1574 1573 1568 1570 1575 1574 1569 3305 3306 1575 1570 1572 1578 1577 1571 1584 27604 27603 1579 27603 27686 1688 1579 1580 1585 1584 1579 1688 1689 1580 1579 1581 1586 1585 1580 1689 1690 1581 1580 1582 1587 1586 1581 1690 1691 1582 1581 1583 1588 1587 1582 1691 1692 1583 1582 1603 1604 1588 1583 1692 1693 1603 1583 1589 27606 27604 1584 1585 1590 1589 1584 1586 1591 1590 1585 1587 1592 1591 1586 1588 1605 1592 1587 1604 1606 1605 1588 1593 27609 27606 1589 1590 1594 1593 1589 1591 1595 1594 1590 1592 1607 1595 1591 1605 1608 1607 1592 1596 27613 27609 1593 1594 1597 1596 1593 1595 1598 1597 1594 1607 1610 1598 1595 1599 27617 27613 1596 1597 1600 1599 1596 1598 1613 1600 1597 1610 1614 1613 1598 1601 27622 27617 1599 1600 1617 1601 1599 1613 1618 1617 1600 1602 27628 27622 1601 1617 1622 1602 1601 1627 27634 27628 1602 1622 1628 1627 1602 3343 3348 1604 1603 1693 3451 3343 1603 3348 3353 1606 1604 1606 1609 1608 1605 3353 3357 1609 1606 1608 1611 1610 1607 1609 1612 1611 1608 3357 3360 1612 1609 1611 1615 1614 1610 1612 1616 1615 1611 3360 3363 1616 1612 1614 1619 1618 1613 1615 1620 1619 1614 1616 1621 1620 1615 3363 3365 1621 1616 1618 1623 1622 1617 1619 1624 1623 1618 1620 1625 1624 1619 1621 1626 1625 1620 3365 3366 1626 1621 1623 1629 1628 1622 1624 1630 1629 1623 1625 1631 1630 1624 1638 27643 27635 1632 27635 27734 1694 1632 1633 1639 1638 1632 1694 1749 1633 1632 1634 1640 1639 1633 1749 1750 1634 1633 1635 1641 1640 1634 1750 1751 1635 1634 1636 1642 1641 1635 1751 1752 1636 1635 1637 1643 1642 1636 1752 1753 1637 1636 1664 1665 1643 1637 1753 1754 1664 1637 1644 27663 27643 1638 1639 1645 1644 1638 1640 1646 1645 1639 1641 1647 1646 1640 1642 1648 1647 1641 1643 1666 1648 1642 1665 1667 1666 1643 1649 27665 27663 1644 1645 1650 1649 1644 1646 1651 1650 1645 1647 1652 1651 1646 1648 1668 1652 1647 1666 1669 1668 1648 1653 27668 27665 1649 1650 1654 1653 1649 1651 1655 1654 1650 1652 1656 1655 1651 1668 1671 1656 1652 1657 27671 27668 1653 1654 1658 1657 1653 1655 1659 1658 1654 1656 1674 1659 1655 1671 1675 1674 1656 1660 27675 27671 1657 1658 1661 1660 1657 1659 1678 1661 1658 1674 1679 1678 1659 1662 27680 27675 1660 1661 1663 1662 1660 1678 1683 1663 1661 1662 27686 27685 27680 1688 27686 1662 1663 1683 1689 1688 1663 3400 3405 1665 1664 1754 3500 3400 1664 3405 3410 1667 1665 1667 1670 1669 1666 3410 3414 1670 1667 1669 1672 1671 1668 1670 1673 1672 1669 3414 3417 1673 1670 1672 1676 1675 1671 1673 1677 1676 1672 3417 3420 1677 1673 1675 1680 1679 1674 1676 1681 1680 1675 1677 1682 1681 1676 3420 3422 1682 1677 1679 1684 1683 1678 1680 1685 1684 1679 1681 1686 1685 1680 1682 1687 1686 1681 3422 3423 1687 1682 1684 1690 1689 1683 1685 1691 1690 1684 1686 1692 1691 1685 1687 1693 1692 1686 3423 3451 1693 1687 1694 27734 27729 1695 1696 1749 1694 1695 1695 27729 27724 1697 1697 1698 1696 1695 1744 1750 1749 1696 1739 1744 1696 1698 1697 27724 27720 1699 1699 1700 1698 1697 1701 1739 1698 1700 1699 27720 27717 1702 1702 1703 1700 1699 1703 1704 1701 1700 1735 1740 1739 1701 1705 1735 1701 1704 1702 27717 27714 1706 1706 1707 1703 1702 1707 1708 1704 1703 1708 1709 1705 1704 1732 1736 1735 1705 1729 1732 1705 1709 1706 27714 27712 1710 1710 1711 1707 1706 1711 1712 1708 1707 1712 1713 1709 1708 1714 1729 1709 1713 1710 27712 27711 1715 1715 1716 1711 1710 1716 1717 1712 1711 1717 1718 1713 1712 1718 1719 1714 1713 1727 1730 1729 1714 1720 1727 1714 1719 1717 1724 1723 1718 1718 1723 1722 1719 1719 1722 1721 1720 1726 1728 1727 1720 1725 1726 1720 1721 1725 3473 3468 1726 1726 3468 3464 1728 1728 1731 1730 1727 1728 3464 3460 1731 1730 1733 1732 1729 1731 1734 1733 1730 1731 3460 3457 1734 1733 1737 1736 1732 1734 1738 1737 1733 1734 3457 3455 1738 1736 1741 1740 1735 1737 1742 1741 1736 1738 1743 1742 1737 1738 3455 3453 1743 1740 1745 1744 1739 1741 1746 1745 1740 1742 1747 1746 1741 1743 1748 1747 1742 1743 3453 3452 1748 1745 1751 1750 1744 1746 1752 1751 1745 1747 1753 1752 1746 1748 1754 1753 1747 3452 3500 1754 1748 1865 3585 3503 1755 3503 3509 1809 1755 1864 1865 1755 1756 1755 1809 1765 1756 1863 1864 1756 1757 1756 1765 1764 1757 1862 1863 1757 1758 1757 1764 1763 1758 1861 1862 1758 1759 1758 1763 1762 1759 1759 1867 1860 1861 1761 1867 1759 1762 1761 1767 1766 1760 1866 1867 1761 1760 1762 1768 1767 1761 1763 1769 1768 1762 1764 1770 1769 1763 1765 1807 1770 1764 1765 1809 1808 1807 1768 1772 1771 1767 1769 1773 1772 1768 1770 1774 1773 1769 1770 1807 1805 1774 1772 1776 1775 1771 1773 1777 1776 1772 1774 1802 1777 1773 1774 1805 1803 1802 1776 1779 1778 1775 1777 1798 1779 1776 1777 1802 1799 1798 1779 1781 1780 1778 1779 1798 1794 1781 1781 1789 1782 1780 1781 1794 1790 1789 1782 1789 1784 1783 1784 3474 3473 1783 1785 3475 3474 1784 1789 1790 1785 1784 1786 3476 3475 1785 1790 1791 1786 1785 1787 3477 3476 1786 1791 1792 1787 1786 1788 3478 3477 1787 1792 1793 1788 1787 3531 5240 3478 1788 3530 3531 1788 1793 1794 1795 1791 1790 1795 1796 1792 1791 1796 1797 1793 1792 3528 3530 1793 1797 1798 1799 1795 1794 1799 1800 1796 1795 1800 1801 1797 1796 3526 3528 1797 1801 1802 1803 1800 1799 1803 1804 1801 1800 3523 3526 1801 1804 1805 1806 1804 1803 3519 3523 1804 1806 1807 1808 1806 1805 3514 3519 1806 1808 3509 3514 1808 1809 1811 1817 1816 1810 1898 1923 1811 1810 1812 1818 1817 1811 1923 1924 1812 1811 1813 1819 1818 1812 1924 1925 1813 1812 1814 1820 1819 1813 1925 1926 1814 1813 1815 1821 1820 1814 1926 1927 1815 1814 1840 1841 1821 1815 1927 1928 1840 1815 1817 1823 1822 1816 1818 1824 1823 1817 1819 1825 1824 1818 1820 1826 1825 1819 1821 1842 1826 1820 1841 1843 1842 1821 1823 1828 1827 1822 1824 1829 1828 1823 1825 1830 1829 1824 1826 1844 1830 1825 1842 1845 1844 1826 1828 1832 1831 1827 1829 1833 1832 1828 1830 1847 1833 1829 1844 1848 1847 1830 1832 1835 1834 1831 1833 1836 1835 1832 1847 1851 1836 1833 1835 1838 1837 1834 1836 1855 1838 1835 1851 1856 1855 1836 1838 1860 1839 1837 1855 1861 1860 1838 1860 1867 1866 1839 3560 3566 1841 1840 1928 3650 3560 1840 3566 3571 1843 1841 1843 1846 1845 1842 3571 3575 1846 1843 1845 1849 1848 1844 1846 1850 1849 1845 3575 3579 1850 1846 1848 1852 1851 1847 1849 1853 1852 1848 1850 1854 1853 1849 3579 3582 1854 1850 1852 1857 1856 1851 1853 1858 1857 1852 1854 1859 1858 1853 3582 3584 1859 1854 1856 1862 1861 1855 1857 1863 1862 1856 1858 1864 1863 1857 1859 1865 1864 1858 3584 3585 1865 1859 1869 1874 1873 1868 1954 1973 1869 1868 1870 1875 1874 1869 1973 1974 1870 1869 1871 1876 1875 1870 1974 1975 1871 1870 1872 1877 1876 1871 1975 1976 1872 1871 1872 1979 1878 1877 1977 1979 1872 1976 1874 1880 1879 1873 1875 1881 1880 1874 1876 1882 1881 1875 1877 1883 1882 1876 1878 1900 1883 1877 1899 1901 1900 1878 1979 1980 1899 1878 1880 1885 1884 1879 1881 1886 1885 1880 1882 1887 1886 1881 1883 1902 1887 1882 1900 1903 1902 1883 1885 1889 1888 1884 1886 1890 1889 1885 1887 1891 1890 1886 1902 1905 1891 1887 1889 1893 1892 1888 1890 1894 1893 1889 1891 1908 1894 1890 1905 1909 1908 1891 1893 1896 1895 1892 1894 1912 1896 1893 1908 1913 1912 1894 1896 1917 1897 1895 1912 1918 1917 1896 1917 1923 1898 1897 3608 3614 1901 1899 1980 3706 3608 1899 1901 1904 1903 1900 3614 3619 1904 1901 1903 1906 1905 1902 1904 1907 1906 1903 3619 3623 1907 1904 1906 1910 1909 1905 1907 1911 1910 1906 3623 3626 1911 1907 1909 1914 1913 1908 1910 1915 1914 1909 1911 1916 1915 1910 3626 3629 1916 1911 1913 1919 1918 1912 1914 1920 1919 1913 1915 1921 1920 1914 1916 1922 1921 1915 3629 3631 1922 1916 1918 1924 1923 1917 1919 1925 1924 1918 1920 1926 1925 1919 1921 1927 1926 1920 1922 1928 1927 1921 3631 3650 1928 1922 1930 1936 1935 1929 2029 2030 1930 1929 1931 1937 1936 1930 2030 2031 1931 1930 1932 1938 1937 1931 2031 2032 1932 1931 1933 1939 1938 1932 2032 2033 1933 1932 1934 1955 1939 1933 2033 2034 1934 1933 3656 3659 1955 1934 2034 3740 3656 1934 1936 1941 1940 1935 1937 1942 1941 1936 1938 1943 1942 1937 1939 1956 1943 1938 1955 1957 1956 1939 1941 1945 1944 1940 1942 1946 1945 1941 1943 1947 1946 1942 1956 1958 1947 1943 1945 1949 1948 1944 1946 1950 1949 1945 1947 1960 1950 1946 1958 1961 1960 1947 1949 1952 1951 1948 1950 1963 1952 1949 1960 1964 1963 1950 1952 1967 1953 1951 1963 1968 1967 1952 1967 1973 1954 1953 3659 3665 1957 1955 1957 1959 1958 1956 3665 3671 1959 1957 1959 1962 1961 1958 3671 3676 1962 1959 1961 1965 1964 1960 1962 1966 1965 1961 3676 3680 1966 1962 1964 1969 1968 1963 1965 1970 1969 1964 1966 1971 1970 1965 1966 3680 1972 1971 1968 1974 1973 1967 1969 1975 1974 1968 1970 1976 1975 1969 1971 1977 1976 1970 1972 1978 1977 1971 3683 3700 1978 1972 3681 3683 1972 3680 1978 1980 1979 1977 3700 3706 1980 1978 1982 1988 1987 1981 2082 2083 1982 1981 1983 1989 1988 1982 2083 2084 1983 1982 1984 1990 1989 1983 2084 2085 1984 1983 1985 1991 1990 1984 2085 2086 1985 1984 1986 2008 1991 1985 2086 2087 1986 1985 1986 3824 3712 2008 3800 3824 1986 2087 1988 1993 1992 1987 1989 1994 1993 1988 1990 1995 1994 1989 1991 1996 1995 1990 2008 2009 1996 1991 1993 1998 1997 1992 1994 1999 1998 1993 1995 2000 1999 1994 1996 2010 2000 1995 2009 2011 2010 1996 1998 2002 2001 1997 1999 2003 2002 1998 2000 2012 2003 1999 2010 2013 2012 2000 2002 2005 2004 2001 2003 2015 2005 2002 2012 2016 2015 2003 2005 2019 2006 2004 2015 2020 2019 2005 2019 2024 2007 2006 2024 2030 2029 2007 3712 3718 2009 2008 3718 3724 2011 2009 2011 2014 2013 2010 3724 3729 2014 2011 2013 2017 2016 2012 2014 2018 2017 2013 3729 3733 2018 2014 2016 2021 2020 2015 2017 2022 2021 2016 2018 2023 2022 2017 3733 3736 2023 2018 2020 2025 2024 2019 2021 2026 2025 2020 2022 2027 2026 2021 2023 2028 2027 2022 3736 3738 2028 2023 2025 2031 2030 2024 2026 2032 2031 2025 2027 2033 2032 2026 2028 2034 2033 2027 3738 3740 2034 2028 2119 2141 2036 2035 2037 2041 2040 2036 2141 2142 2037 2036 2038 2042 2041 2037 2142 2143 2038 2037 2039 2043 2042 2038 2143 2144 2039 2038 2039 2147 2044 2043 2145 2147 2039 2144 2041 2046 2045 2040 2042 2047 2046 2041 2043 2048 2047 2042 2044 2049 2048 2043 2061 2062 2049 2044 2147 2148 2061 2044 2046 2051 2050 2045 2047 2052 2051 2046 2048 2053 2052 2047 2049 2063 2053 2048 2062 2064 2063 2049 2051 2055 2054 2050 2052 2056 2055 2051 2053 2065 2056 2052 2063 2066 2065 2053 2055 2058 2057 2054 2056 2068 2058 2055 2065 2069 2068 2056 2058 2072 2059 2057 2068 2073 2072 2058 2072 2077 2060 2059 2077 2083 2082 2060 3772 3778 2062 2061 2148 3879 3772 2061 3778 3784 2064 2062 2064 2067 2066 2063 3784 3789 2067 2064 2066 2070 2069 2065 2067 2071 2070 2066 3789 3793 2071 2067 2069 2074 2073 2068 2070 2075 2074 2069 2071 2076 2075 2070 3793 3796 2076 2071 2073 2078 2077 2072 2074 2079 2078 2073 2075 2080 2079 2074 2076 2081 2080 2075 3796 3798 2081 2076 2078 2084 2083 2077 2079 2085 2084 2078 2080 2086 2085 2079 2081 2087 2086 2080 3798 3800 2087 2081 2089 2092 2091 2088 2178 2200 2089 2088 2090 2093 2092 2089 2200 2201 2090 2089 2090 2206 2094 2093 2202 2206 2090 2201 2092 2098 2097 2091 2093 2099 2098 2092 2094 2100 2099 2093 2095 2101 2100 2094 2206 2207 2095 2094 2096 2102 2101 2095 2207 2208 2096 2095 2120 2121 2102 2096 2208 2209 2120 2096 2098 2104 2103 2097 2099 2105 2104 2098 2100 2106 2105 2099 2101 2107 2106 2100 2102 2122 2107 2101 2121 2123 2122 2102 2104 2109 2108 2103 2105 2110 2109 2104 2106 2111 2110 2105 2107 2124 2111 2106 2122 2125 2124 2107 2109 2113 2112 2108 2110 2114 2113 2109 2111 2127 2114 2110 2124 2128 2127 2111 2113 2116 2115 2112 2114 2131 2116 2113 2127 2132 2131 2114 2116 2118 2117 2115 2131 2136 2118 2116 2118 2141 2119 2117 2136 2142 2141 2118 3831 3837 2121 2120 2209 3931 3831 2120 3837 3842 2123 2121 2123 2126 2125 2122 3842 3847 2126 2123 2125 2129 2128 2124 2126 2130 2129 2125 3847 3851 2130 2126 2128 2133 2132 2127 2129 2134 2133 2128 2130 2135 2134 2129 3851 3854 2135 2130 2132 2137 2136 2131 2133 2138 2137 2132 2134 2139 2138 2133 2135 2140 2139 2134 3854 3856 2140 2135 2137 2143 2142 2136 2138 2144 2143 2137 2139 2145 2144 2138 2140 2146 2145 2139 3856 3858 2146 2140 2146 2148 2147 2145 3858 3879 2148 2146 2149 2262 2151 2150 2256 2262 2149 2238 2151 2157 2156 2150 2152 2158 2157 2151 2262 2263 2152 2151 2153 2159 2158 2152 2263 2264 2153 2152 2154 2160 2159 2153 2264 2265 2154 2153 2155 2161 2160 2154 2265 2266 2155 2154 2179 2180 2161 2155 2266 2267 2179 2155 2157 2163 2162 2156 2158 2164 2163 2157 2159 2165 2164 2158 2160 2166 2165 2159 2161 2181 2166 2160 2180 2182 2181 2161 2163 2168 2167 2162 2164 2169 2168 2163 2165 2170 2169 2164 2166 2183 2170 2165 2181 2184 2183 2166 2168 2172 2171 2167 2169 2173 2172 2168 2170 2186 2173 2169 2183 2187 2186 2170 2172 2175 2174 2171 2173 2190 2175 2172 2186 2191 2190 2173 2175 2177 2176 2174 2190 2195 2177 2175 2177 2200 2178 2176 2195 2201 2200 2177 3885 3889 2180 2179 2267 3985 3885 2179 3889 3894 2182 2180 2182 2185 2184 2181 3894 3899 2185 2182 2184 2188 2187 2183 2185 2189 2188 2184 3899 3903 2189 2185 2187 2192 2191 2186 2188 2193 2192 2187 2189 2194 2193 2188 3903 3906 2194 2189 2191 2196 2195 2190 2192 2197 2196 2191 2193 2198 2197 2192 2194 2199 2198 2193 3906 3908 2199 2194 2196 2202 2201 2195 2197 2203 2202 2196 2198 2204 2203 2197 2199 2205 2204 2198 3908 3910 2205 2199 2203 2207 2206 2202 2204 2208 2207 2203 2205 2209 2208 2204 3910 3931 2209 2205 2211 2217 2216 2210 2316 2317 2211 2210 2212 2218 2217 2211 2317 2318 2212 2211 2213 2219 2218 2212 2318 2319 2213 2212 2214 2220 2219 2213 2319 2320 2214 2213 2215 2221 2220 2214 2320 2321 2215 2214 3937 3940 2221 2215 2321 4022 3937 2215 2217 2223 2222 2216 2218 2224 2223 2217 2219 2225 2224 2218 2220 2226 2225 2219 2221 2239 2226 2220 3940 3946 2239 2221 2223 2228 2227 2222 2224 2229 2228 2223 2225 2230 2229 2224 2226 2240 2230 2225 2239 2241 2240 2226 2228 2232 2231 2227 2229 2233 2232 2228 2230 2242 2233 2229 2240 2243 2242 2230 2232 2235 2234 2231 2233 2246 2235 2232 2242 2247 2246 2233 2235 2237 2236 2234 2246 2251 2237 2235 2237 2256 2238 2236 2251 2257 2256 2237 3946 3952 2241 2239 2241 2244 2243 2240 2241 3952 2245 2244 2243 2248 2247 2242 2244 2249 2248 2243 2245 2250 2249 2244 3957 3960 2250 2245 3953 3957 2245 3952 2247 2252 2251 2246 2248 2253 2252 2247 2249 2254 2253 2248 2250 2255 2254 2249 3960 3962 2255 2250 2252 2258 2257 2251 2253 2259 2258 2252 2254 2260 2259 2253 2255 2261 2260 2254 3962 3964 2261 2255 2257 2263 2262 2256 2258 2264 2263 2257 2259 2265 2264 2258 2260 2266 2265 2259 2261 2267 2266 2260 3964 3985 2267 2261 2269 2275 2274 2268 2368 2369 2269 2268 2270 2276 2275 2269 2369 2370 2270 2269 2271 2277 2276 2270 2370 2371 2271 2270 2272 2278 2277 2271 2371 2372 2272 2271 2273 2279 2278 2272 2372 2373 2273 2272 2273 4109 3993 2279 4082 4109 2273 2373 2275 2281 2280 2274 2276 2282 2281 2275 2277 2283 2282 2276 2278 2284 2283 2277 2279 2297 2284 2278 3993 3999 2297 2279 2281 2286 2285 2280 2282 2287 2286 2281 2283 2288 2287 2282 2284 2298 2288 2283 2297 2299 2298 2284 2286 2290 2289 2285 2287 2291 2290 2286 2288 2300 2291 2287 2298 2301 2300 2288 2290 2293 2292 2289 2291 2303 2293 2290 2300 2304 2303 2291 2293 2295 2294 2292 2303 2307 2295 2293 2295 2311 2296 2294 2307 2312 2311 2295 2311 2317 2316 2296 3999 4005 2299 2297 2299 2302 2301 2298 4005 4010 2302 2299 2301 2305 2304 2300 2302 2306 2305 2301 4010 4014 2306 2302 2304 2308 2307 2303 2305 2309 2308 2304 2306 2310 2309 2305 4014 4017 2310 2306 2308 2313 2312 2307 2309 2314 2313 2308 2310 2315 2314 2309 4017 4020 2315 2310 2312 2318 2317 2311 2313 2319 2318 2312 2314 2320 2319 2313 2315 2321 2320 2314 4020 4022 2321 2315 2323 2327 2326 2322 2417 2418 2323 2322 2324 2328 2327 2323 2418 2419 2324 2323 2325 2329 2328 2324 2419 2420 2325 2324 2325 2423 2330 2329 2421 2423 2325 2420 2327 2333 2332 2326 2328 2334 2333 2327 2329 2335 2334 2328 2330 2336 2335 2329 2331 2350 2336 2330 2423 2424 2331 2330 4053 4059 2350 2331 2424 4172 4053 2331 2333 2338 2337 2332 2334 2339 2338 2333 2335 2340 2339 2334 2336 2351 2340 2335 2350 2352 2351 2336 2338 2342 2341 2337 2339 2343 2342 2338 2340 2353 2343 2339 2351 2354 2353 2340 2342 2345 2344 2341 2343 2346 2345 2342 2353 2356 2346 2343 2345 2348 2347 2344 2346 2359 2348 2345 2356 2360 2359 2346 2348 2363 2349 2347 2359 2364 2363 2348 2363 2369 2368 2349 4059 4065 2352 2350 2352 2355 2354 2351 4065 4070 2355 2352 2354 2357 2356 2353 2355 2358 2357 2354 4070 4074 2358 2355 2357 2361 2360 2356 2358 2362 2361 2357 4074 4077 2362 2358 2360 2365 2364 2359 2361 2366 2365 2360 2362 2367 2366 2361 4077 4080 2367 2362 2364 2370 2369 2363 2365 2371 2370 2364 2366 2372 2371 2365 2367 2373 2372 2366 4080 4082 2373 2367 2374 2473 2376 2375 2468 2473 2374 2467 2376 2382 2381 2375 2377 2383 2382 2376 2473 2474 2377 2376 2378 2384 2383 2377 2474 2475 2378 2377 2379 2385 2384 2378 2475 2476 2379 2378 2380 2399 2385 2379 2476 2477 2380 2379 4116 4123 2399 2380 2477 4208 4116 2380 2382 2387 2386 2381 2383 2388 2387 2382 2384 2389 2388 2383 2385 2400 2389 2384 2399 2401 2400 2385 2387 2391 2390 2386 2388 2392 2391 2387 2389 2402 2392 2388 2400 2403 2402 2389 2391 2394 2393 2390 2392 2395 2394 2391 2402 2405 2395 2392 2394 2397 2396 2393 2395 2408 2397 2394 2405 2409 2408 2395 2397 2412 2398 2396 2408 2413 2412 2397 2412 2418 2417 2398 4123 4129 2401 2399 2401 2404 2403 2400 4129 4134 2404 2401 2403 2406 2405 2402 2404 2407 2406 2403 4134 4138 2407 2404 2406 2410 2409 2405 2407 2411 2410 2406 4138 4141 2411 2407 2409 2414 2413 2408 2410 2415 2414 2409 2411 2416 2415 2410 4141 4144 2416 2411 2413 2419 2418 2412 2414 2420 2419 2413 2415 2421 2420 2414 2416 2422 2421 2415 4144 4146 2422 2416 2422 2424 2423 2421 4146 4172 2424 2422 2426 2432 2431 2425 2526 2527 2426 2425 2427 2433 2432 2426 2527 2528 2427 2426 2428 2434 2433 2427 2528 2529 2428 2427 2429 2435 2434 2428 2529 2530 2429 2428 2430 2450 2435 2429 2530 2531 2430 2429 4179 4183 2450 2430 2531 4267 4179 2430 2432 2437 2436 2431 2433 2438 2437 2432 2434 2439 2438 2433 2435 2451 2439 2434 2450 2452 2451 2435 2437 2441 2440 2436 2438 2442 2441 2437 2439 2443 2442 2438 2451 2453 2443 2439 2441 2445 2444 2440 2442 2446 2445 2441 2443 2455 2446 2442 2453 2456 2455 2443 2445 2448 2447 2444 2446 2458 2448 2445 2455 2459 2458 2446 2448 2462 2449 2447 2458 2463 2462 2448 2462 2468 2467 2449 4183 4189 2452 2450 2452 2454 2453 2451 4189 4194 2454 2452 2454 2457 2456 2453 4194 4198 2457 2454 2456 2460 2459 2455 2457 2461 2460 2456 4198 4202 2461 2457 2459 2464 2463 2458 2460 2465 2464 2459 2461 2466 2465 2460 4202 4205 2466 2461 2463 2469 2468 2462 2464 2470 2469 2463 2465 2471 2470 2464 2466 2472 2471 2465 4205 4207 2472 2466 2469 2474 2473 2468 2470 2475 2474 2469 2471 2476 2475 2470 2472 2477 2476 2471 4207 4208 2477 2472 2479 2485 2484 2478 2580 2581 2479 2478 2480 2486 2485 2479 2581 2582 2480 2479 2481 2487 2486 2480 2582 2583 2481 2480 2482 2488 2487 2481 2583 2584 2482 2481 2483 2489 2488 2482 2584 2585 2483 2482 2483 4350 4239 2489 4326 4350 2483 2585 2485 2491 2490 2484 2486 2492 2491 2485 2487 2493 2492 2486 2488 2494 2493 2487 2489 2506 2494 2488 4239 4245 2506 2489 2491 2496 2495 2490 2492 2497 2496 2491 2493 2498 2497 2492 2494 2507 2498 2493 2506 2508 2507 2494 2496 2500 2499 2495 2497 2501 2500 2496 2498 2509 2501 2497 2507 2510 2509 2498 2500 2503 2502 2499 2501 2512 2503 2500 2509 2513 2512 2501 2503 2516 2504 2502 2512 2517 2516 2503 2516 2521 2505 2504 2521 2527 2526 2505 4245 4251 2508 2506 2508 2511 2510 2507 4251 4256 2511 2508 2510 2514 2513 2509 2511 2515 2514 2510 4256 4260 2515 2511 2513 2518 2517 2512 2514 2519 2518 2513 2515 2520 2519 2514 4260 4263 2520 2515 2517 2522 2521 2516 2518 2523 2522 2517 2519 2524 2523 2518 2520 2525 2524 2519 4263 4265 2525 2520 2522 2528 2527 2521 2523 2529 2528 2522 2524 2530 2529 2523 2525 2531 2530 2524 4265 4267 2531 2525 2533 2536 2535 2532 2614 2630 2533 2532 2534 2537 2536 2533 2630 2631 2534 2533 2534 2636 2538 2537 2632 2636 2534 2631 2536 2542 2541 2535 2537 2543 2542 2536 2538 2544 2543 2537 2539 2545 2544 2538 2636 2637 2539 2538 2540 2561 2545 2539 2637 2638 2540 2539 2560 2562 2561 2540 2638 2639 2560 2540 2542 2547 2546 2541 2543 2548 2547 2542 2544 2549 2548 2543 2545 2563 2549 2544 2561 2564 2563 2545 2547 2551 2550 2546 2548 2552 2551 2547 2549 2553 2552 2548 2563 2566 2553 2549 2551 2555 2554 2550 2552 2556 2555 2551 2553 2568 2556 2552 2566 2569 2568 2553 2555 2558 2557 2554 2556 2571 2558 2555 2568 2572 2571 2556 2558 2575 2559 2557 2571 2576 2575 2558 2575 2581 2580 2559 4298 4303 2562 2560 2639 4400 4298 2560 2562 2565 2564 2561 4303 4308 2565 2562 2564 2567 2566 2563 2565 4312 2567 2564 4308 4313 4312 2565 2567 2570 2569 2566 4312 4317 2570 2567 2569 2573 2572 2568 2570 2574 2573 2569 4317 4321 2574 2570 2572 2577 2576 2571 2573 2578 2577 2572 2574 2579 2578 2573 4321 4324 2579 2574 2576 2582 2581 2575 2577 2583 2582 2576 2578 2584 2583 2577 2579 2585 2584 2578 4324 4326 2585 2579 2587 2591 2590 2586 2671 2672 2587 2586 2588 2592 2591 2587 2672 2673 2588 2587 2589 2593 2592 2588 2673 2674 2589 2588 2589 2677 2594 2593 2675 2677 2589 2674 2591 2597 2596 2590 2592 2598 2597 2591 2593 2599 2598 2592 2594 2600 2599 2593 2595 2615 2600 2594 2677 2678 2595 2594 4357 4363 2615 2595 2678 4431 4357 2595 2597 2602 2601 2596 2598 2603 2602 2597 2599 2604 2603 2598 2600 2616 2604 2599 2615 2617 2616 2600 2602 2607 2606 2601 2603 2608 2607 2602 2604 2618 2608 2603 2616 2619 2618 2604 2606 2610 2609 2605 2607 2611 2610 2606 2608 2621 2611 2607 2618 2622 2621 2608 2610 2613 2612 2609 2611 2625 2613 2610 2621 2626 2625 2611 2613 2630 2614 2612 2625 2631 2630 2613 4363 4369 2617 2615 2617 2620 2619 2616 4369 4374 2620 2617 2619 2623 2622 2618 2620 2624 2623 2619 4374 4378 2624 2620 2622 2627 2626 2621 2623 2628 2627 2622 2624 2629 2628 2623 4378 4381 2629 2624 2626 2632 2631 2625 2627 2633 2632 2626 2628 2634 2633 2627 2629 2635 2634 2628 4381 4383 2635 2629 2633 2637 2636 2632 2634 2638 2637 2633 2635 2639 2638 2634 4383 4400 2639 2635 2711 4473 4407 2640 4407 4413 2659 2640 2710 2711 2640 2641 2640 2659 2658 2641 2709 2710 2641 2642 2641 2658 2649 2642 2708 2709 2642 2643 2642 2649 2648 2643 2707 2708 2643 2644 2643 2648 2647 2644 2644 2712 2695 2707 2646 2712 2644 2647 2646 2651 2650 2645 2696 2712 2646 2645 2647 2652 2651 2646 2648 2653 2652 2647 2649 2660 2653 2648 2658 2661 2660 2649 2651 2655 2654 2650 2652 2656 2655 2651 2653 2663 2656 2652 2660 2664 2663 2653 2655 2666 2657 2654 2656 2667 2666 2655 2663 2668 2667 2656 2666 2672 2671 2657 2659 2662 2661 2658 4413 4418 2662 2659 2661 2665 2664 2660 2662 4422 2665 2661 4418 4423 4422 2662 2664 2669 2668 2663 2665 2670 2669 2664 4422 4426 2670 2665 2667 2673 2672 2666 2668 2674 2673 2667 2669 2675 2674 2668 2670 2676 2675 2669 4426 4429 2676 2670 2676 2678 2677 2675 4429 4431 2678 2676 2763 4458 2679 2762 4458 4463 2697 2679 2761 2762 2679 2680 2679 2697 2681 2680 2680 2766 2760 2761 2682 2766 2680 2681 2697 2699 2698 2681 2681 2698 2689 2682 2765 2766 2682 2683 2682 2689 2688 2683 2764 2765 2683 2684 2683 2688 2687 2684 2739 2764 2684 2685 2684 2687 2686 2685 2687 2691 2690 2686 2688 2692 2691 2687 2689 2700 2692 2688 2698 2701 2700 2689 2691 2694 2693 2690 2692 2703 2694 2691 2700 2704 2703 2692 2694 2707 2695 2693 2703 2708 2707 2694 4463 4467 2699 2697 2699 2702 2701 2698 4467 4470 2702 2699 2701 2705 2704 2700 2702 2706 2705 2701 4470 4472 2706 2702 2704 2709 2708 2703 2705 2710 2709 2704 2706 2711 2710 2705 4472 4473 2711 2706 2815 2816 2740 2713 2740 2741 2720 2713 2814 2815 2713 2714 2713 2720 2719 2714 2813 2814 2714 2715 2714 2719 2718 2715 2715 2818 2812 2813 2717 2818 2715 2718 2717 2722 2721 2716 2817 2818 2717 2716 2718 2723 2722 2717 2719 2724 2723 2718 2720 2742 2724 2719 2741 2743 2742 2720 2722 2726 2725 2721 2723 2727 2726 2722 2724 2744 2727 2723 2742 2745 2744 2724 2726 2730 2729 2725 2727 2731 2730 2726 2744 2747 2731 2727 2729 2733 2732 2728 2730 2734 2733 2729 2731 2750 2734 2730 2747 2751 2750 2731 2733 2736 2735 2732 2734 2754 2736 2733 2750 2755 2754 2734 2736 2738 2737 2735 2754 2759 2738 2736 2738 2764 2739 2737 2759 2765 2764 2738 4504 4509 2741 2740 4503 4504 2740 2816 4509 4513 2743 2741 2743 2746 2745 2742 4513 4516 2746 2743 2745 2748 2747 2744 2746 2749 2748 2745 4516 4519 2749 2746 2748 2752 2751 2747 2749 2753 2752 2748 4519 4521 2753 2749 2751 2756 2755 2750 2752 2757 2756 2751 2753 2758 2757 2752 4521 4540 2758 2753 2755 2760 2759 2754 2756 2761 2760 2755 2757 2762 2761 2756 2758 2763 2762 2757 2758 4540 4457 2763 2760 2766 2765 2759 4457 4459 4458 2763 2871 4631 4549 2767 4549 4555 2793 2767 2870 2871 2767 2768 2767 2793 2773 2768 2768 2875 2869 2870 2772 2875 2768 2773 2770 2775 2774 2769 2872 2873 2770 2769 2771 2776 2775 2770 2873 2874 2771 2770 2772 2777 2776 2771 2874 2875 2772 2771 2773 2778 2777 2772 2793 2794 2778 2773 2775 2780 2779 2774 2776 2781 2780 2775 2777 2782 2781 2776 2778 2795 2782 2777 2794 2796 2795 2778 2780 2784 2783 2779 2781 2785 2784 2780 2782 2797 2785 2781 2795 2798 2797 2782 2784 2787 2786 2783 2785 2788 2787 2784 2797 2800 2788 2785 2787 2790 2789 2786 2788 2803 2790 2787 2800 2804 2803 2788 2790 2807 2791 2789 2803 2808 2807 2790 2807 2812 2792 2791 2812 2818 2817 2792 4555 4560 2794 2793 4560 4564 2796 2794 2796 2799 2798 2795 4564 4568 2799 2796 2798 2801 2800 2797 2799 2802 2801 2798 4568 4571 2802 2799 2801 2805 2804 2800 2802 2806 2805 2801 4571 4573 2806 2802 2804 2809 2808 2803 2805 2810 2809 2804 2806 2811 2810 2805 4573 4575 2811 2806 2808 2813 2812 2807 2809 2814 2813 2808 2810 2815 2814 2809 2811 2816 2815 2810 2811 4575 4503 2816 2819 2935 2846 2847 2847 2849 2848 2819 2934 2935 2819 2820 2819 2848 2829 2820 2933 2934 2820 2821 2820 2829 2828 2821 2932 2933 2821 2822 2821 2828 2827 2822 2931 2932 2822 2823 2822 2827 2826 2823 2903 2931 2823 2824 2823 2826 2825 2824 2826 2831 2830 2825 2827 2832 2831 2826 2828 2833 2832 2827 2829 2850 2833 2828 2848 2851 2850 2829 2831 2835 2834 2830 2832 2836 2835 2831 2833 2837 2836 2832 2850 2853 2837 2833 2835 2839 2838 2834 2836 2840 2839 2835 2837 2856 2840 2836 2853 2857 2856 2837 2839 2842 2841 2838 2840 2859 2842 2839 2856 2860 2859 2840 2842 2844 2843 2841 2859 2863 2844 2842 2844 2867 2845 2843 2863 2868 2867 2844 2867 2873 2872 2845 2846 2935 2929 2930 4607 4612 2847 2846 2930 4709 4607 2846 4612 4616 2849 2847 2849 2852 2851 2848 4616 4620 2852 2849 2851 2854 2853 2850 2852 2855 2854 2851 4620 4623 2855 2852 2854 2858 2857 2853 2855 4625 2858 2854 4623 4626 4625 2855 2857 2861 2860 2856 2858 2862 2861 2857 4625 4628 2862 2858 2860 2864 2863 2859 2861 2865 2864 2860 2862 2866 2865 2861 4628 4630 2866 2862 2864 2869 2868 2863 2865 2870 2869 2864 2866 2871 2870 2865 4630 4631 2871 2866 2868 2874 2873 2867 2869 2875 2874 2868 2994 2995 2904 2876 2904 2906 2905 2876 2993 2994 2876 2877 2876 2905 2884 2877 2992 2993 2877 2878 2877 2884 2883 2878 2991 2992 2878 2879 2878 2883 2882 2879 2879 2997 2990 2991 2881 2997 2879 2882 2881 2886 2885 2880 2996 2997 2881 2880 2882 2887 2886 2881 2883 2888 2887 2882 2884 2889 2888 2883 2905 2907 2889 2884 2886 2891 2890 2885 2887 2892 2891 2886 2888 2893 2892 2887 2889 2909 2893 2888 2907 2910 2909 2889 2891 2895 2894 2890 2892 2896 2895 2891 2893 2912 2896 2892 2909 2913 2912 2893 2895 2898 2897 2894 2896 2899 2898 2895 2912 2916 2899 2896 2898 2901 2900 2897 2899 2920 2901 2898 2916 2921 2920 2899 2901 2925 2902 2900 2920 2926 2925 2901 2925 2931 2903 2902 4666 4671 2906 2904 4665 4666 2904 2995 2906 2908 2907 2905 4671 4675 2908 2906 2908 2911 2910 2907 4675 4678 2911 2908 2910 2914 2913 2909 2911 2915 2914 2910 4678 4681 2915 2911 2913 2917 2916 2912 2914 2918 2917 2913 2915 2919 2918 2914 4681 4683 2919 2915 2917 2922 2921 2916 2918 2923 2922 2917 2919 2924 2923 2918 4683 4684 2924 2919 2921 2927 2926 2920 2922 2928 2927 2921 2923 2929 2928 2922 2924 2930 2929 2923 4684 4709 2930 2924 2926 2932 2931 2925 2927 2933 2932 2926 2928 2934 2933 2927 2929 2935 2934 2928 3054 3055 2965 2936 2965 2967 2966 2936 3053 3054 2936 2937 2936 2966 2943 2937 3052 3053 2937 2938 2937 2943 2942 2938 2938 3058 3051 3052 2941 3058 2938 2942 2940 2945 2944 2939 3056 3057 2940 2939 2941 2946 2945 2940 3057 3058 2941 2940 2942 2947 2946 2941 2943 2948 2947 2942 2966 2968 2948 2943 2945 2950 2949 2944 2946 2951 2950 2945 2947 2952 2951 2946 2948 2970 2952 2947 2968 2971 2970 2948 2950 2954 2953 2949 2951 2955 2954 2950 2952 2956 2955 2951 2970 2973 2956 2952 2954 2958 2957 2953 2955 2959 2958 2954 2956 2976 2959 2955 2973 2977 2976 2956 2958 2961 2960 2957 2959 2980 2961 2958 2976 2981 2980 2959 2961 2963 2962 2960 2980 2985 2963 2961 2963 2990 2964 2962 2985 2991 2990 2963 2990 2997 2996 2964 4717 4722 2967 2965 3055 4818 4717 2965 2967 2969 2968 2966 4722 4726 2969 2967 2969 2972 2971 2968 4726 4730 2972 2969 2971 2974 2973 2970 2972 2975 2974 2971 4730 4733 2975 2972 2974 2978 2977 2973 2975 2979 2978 2974 4733 4735 2979 2975 2977 2982 2981 2976 2978 2983 2982 2977 2979 2984 2983 2978 4735 4737 2984 2979 2981 2986 2985 2980 2982 2987 2986 2981 2983 2988 2987 2982 2984 2989 2988 2983 4737 4760 2989 2984 2986 2992 2991 2985 2987 2993 2992 2986 2988 2994 2993 2987 2989 2995 2994 2988 2989 4760 4665 2995 3107 4850 4769 2998 2998 4769 3027 3005 3106 3107 2998 2999 2998 3005 3004 2999 2999 3111 3105 3106 3003 3111 2999 3004 3001 3007 3006 3000 3108 3109 3001 3000 3002 3008 3007 3001 3109 3110 3002 3001 3003 3009 3008 3002 3110 3111 3003 3002 3004 3010 3009 3003 3005 3028 3010 3004 3027 3029 3028 3005 3007 3012 3011 3006 3008 3013 3012 3007 3009 3014 3013 3008 3010 3030 3014 3009 3028 3031 3030 3010 3012 3016 3015 3011 3013 3017 3016 3012 3014 3018 3017 3013 3030 3033 3018 3014 3016 3020 3019 3015 3017 3021 3020 3016 3018 3036 3021 3017 3033 3037 3036 3018 3020 3023 3022 3019 3021 3040 3023 3020 3036 3041 3040 3021 3023 3025 3024 3022 3040 3045 3025 3023 3025 3050 3026 3024 3045 3051 3050 3025 3050 3057 3056 3026 4775 4779 3029 3027 4770 4775 3027 4769 3029 3032 3031 3028 4779 4783 3032 3029 3031 3034 3033 3030 3032 3035 3034 3031 4783 4786 3035 3032 3034 3038 3037 3033 3035 3039 3038 3034 4786 4788 3039 3035 3037 3042 3041 3036 3038 3043 3042 3037 3039 3044 3043 3038 4788 4790 3044 3039 3041 3046 3045 3040 3042 3047 3046 3041 3043 3048 3047 3042 3044 3049 3048 3043 4790 4812 3049 3044 3046 3052 3051 3045 3047 3053 3052 3046 3048 3054 3053 3047 3049 3055 3054 3048 4812 4818 3055 3049 3051 3058 3057 3050 3159 4912 4821 3059 4821 4827 3065 3059 3059 3164 3158 3159 3064 3164 3059 3065 3061 3067 3066 3060 3160 3161 3061 3060 3062 3068 3067 3061 3161 3162 3062 3061 3063 3069 3068 3062 3162 3163 3063 3062 3064 3070 3069 3063 3163 3164 3064 3063 3065 3087 3070 3064 4827 4832 3087 3065 3067 3072 3071 3066 3068 3073 3072 3067 3069 3074 3073 3068 3070 3088 3074 3069 3087 3089 3088 3070 3072 3076 3075 3071 3073 3077 3076 3072 3074 3078 3077 3073 3088 3090 3078 3074 3076 3080 3079 3075 3077 3081 3080 3076 3078 3092 3081 3077 3090 3093 3092 3078 3080 3083 3082 3079 3081 3095 3083 3080 3092 3096 3095 3081 3083 3085 3084 3082 3095 3099 3085 3083 3085 3103 3086 3084 3099 3104 3103 3085 3103 3109 3108 3086 4832 4837 3089 3087 3089 3091 3090 3088 4837 4841 3091 3089 3091 3094 3093 3090 4841 4844 3094 3091 3093 3097 3096 3092 3094 3098 3097 3093 4844 4847 3098 3094 3096 3100 3099 3095 3097 3101 3100 3096 3098 3102 3101 3097 4847 4849 3102 3098 3100 3105 3104 3099 3101 3106 3105 3100 3102 3107 3106 3101 4849 4850 3107 3102 3104 3110 3109 3103 3105 3111 3110 3104 4883 4889 3112 3217 4889 4894 3139 3112 3216 3217 3112 3113 3112 3139 3122 3113 3215 3216 3113 3114 3113 3122 3121 3114 3214 3215 3114 3115 3114 3121 3120 3115 3213 3214 3115 3116 3115 3120 3119 3116 3212 3213 3116 3117 3116 3119 3118 3117 3119 3124 3123 3118 3120 3125 3124 3119 3121 3126 3125 3120 3122 3140 3126 3121 3139 3141 3140 3122 3124 3128 3127 3123 3125 3129 3128 3124 3126 3130 3129 3125 3140 3142 3130 3126 3128 3132 3131 3127 3129 3133 3132 3128 3130 3144 3133 3129 3142 3145 3144 3130 3132 3135 3134 3131 3133 3147 3135 3132 3144 3148 3147 3133 3135 3137 3136 3134 3147 3151 3137 3135 3137 3155 3138 3136 3151 3156 3155 3137 3155 3161 3160 3138 4894 4899 3141 3139 3141 3143 3142 3140 4899 4903 3143 3141 3143 3146 3145 3142 4903 4906 3146 3143 3145 3149 3148 3144 3146 3150 3149 3145 4906 4909 3150 3146 3148 3152 3151 3147 3149 3153 3152 3148 3150 3154 3153 3149 4909 4911 3154 3150 3152 3157 3156 3151 3153 3158 3157 3152 3154 3159 3158 3153 4911 4912 3159 3154 3156 3162 3161 3155 3157 3163 3162 3156 3158 3164 3163 3157 4949 4950 3165 3273 4950 4955 3191 3165 3272 3273 3165 3166 3165 3191 3174 3166 3271 3272 3166 3167 3166 3174 3173 3167 3270 3271 3167 3168 3167 3173 3172 3168 3269 3270 3168 3169 3168 3172 3171 3169 3169 3274 3268 3269 3170 3274 3169 3171 3171 3176 3175 3170 3172 3177 3176 3171 3173 3178 3177 3172 3174 3192 3178 3173 3191 3193 3192 3174 3176 3180 3179 3175 3177 3181 3180 3176 3178 3182 3181 3177 3192 3194 3182 3178 3180 3184 3183 3179 3181 3185 3184 3180 3182 3196 3185 3181 3194 3197 3196 3182 3184 3187 3186 3183 3185 3199 3187 3184 3196 3200 3199 3185 3187 3189 3188 3186 3199 3203 3189 3187 3189 3207 3190 3188 3203 3208 3207 3189 3207 3213 3212 3190 4955 4960 3193 3191 3193 3195 3194 3192 4960 4964 3195 3193 3195 3198 3197 3194 4964 4967 3198 3195 3197 3201 3200 3196 3198 3202 3201 3197 4967 4970 3202 3198 3200 3204 3203 3199 3201 3205 3204 3200 3202 3206 3205 3201 4970 4972 3206 3202 3204 3209 3208 3203 3205 3210 3209 3204 3206 3211 3210 3205 4972 4973 3211 3206 3208 3214 3213 3207 3209 3215 3214 3208 3210 3216 3215 3209 3211 3217 3216 3210 3211 4973 4883 3217 3333 3334 3246 3218 3246 3247 3226 3218 3332 3333 3218 3219 3218 3226 3225 3219 3331 3332 3219 3220 3219 3225 3224 3220 3220 3336 3330 3331 3223 3336 3220 3224 3222 3228 3227 3221 3306 3335 3222 3221 3223 3229 3228 3222 3335 3336 3223 3222 3224 3230 3229 3223 3225 3231 3230 3224 3226 3248 3231 3225 3247 3249 3248 3226 3228 3233 3232 3227 3229 3234 3233 3228 3230 3235 3234 3229 3231 3236 3235 3230 3248 3250 3236 3231 3233 3238 3237 3232 3234 3239 3238 3233 3235 3240 3239 3234 3236 3252 3240 3235 3250 3253 3252 3236 3239 3242 3241 3238 3240 3255 3242 3239 3252 3256 3255 3240 3242 3244 3243 3241 3255 3259 3244 3242 3244 3263 3245 3243 3259 3264 3263 3244 3263 3269 3268 3245 5011 5016 3247 3246 3334 5113 5011 3246 5016 5021 3249 3247 3249 3251 3250 3248 5021 5025 3251 3249 3251 3254 3253 3250 5025 5028 3254 3251 3253 3257 3256 3252 3254 3258 3257 3253 5028 5031 3258 3254 3256 3260 3259 3255 3257 3261 3260 3256 3258 3262 3261 3257 5031 5033 3262 3258 3260 3265 3264 3259 3261 3266 3265 3260 3262 3267 3266 3261 5033 5034 3267 3262 3264 3270 3269 3263 3265 3271 3270 3264 3266 3272 3271 3265 3267 3273 3272 3266 3267 5034 4949 3273 3392 3393 3307 3275 3307 3308 3282 3275 3391 3392 3275 3276 3275 3282 3281 3276 3276 3396 3390 3391 3280 3396 3276 3281 3278 3284 3283 3277 3366 3394 3278 3277 3279 3285 3284 3278 3394 3395 3279 3278 3280 3286 3285 3279 3395 3396 3280 3279 3281 3287 3286 3280 3282 3309 3287 3281 3308 3310 3309 3282 3284 3289 3288 3283 3285 3290 3289 3284 3286 3291 3290 3285 3287 3292 3291 3286 3309 3311 3292 3287 3289 3294 3293 3288 3290 3295 3294 3289 3291 3296 3295 3290 3292 3313 3296 3291 3311 3314 3313 3292 3294 3298 3297 3293 3295 3299 3298 3294 3296 3316 3299 3295 3313 3317 3316 3296 3298 3301 3300 3297 3299 3302 3301 3298 3316 3320 3302 3299 3301 3304 3303 3300 3302 3324 3304 3301 3320 3325 3324 3302 3304 3329 3305 3303 3324 3330 3329 3304 3329 3335 3306 3305 5065 5070 3308 3307 3393 5164 5065 3307 5070 5074 3310 3308 3310 3312 3311 3309 5074 5078 3312 3310 3312 3315 3314 3311 5078 5081 3315 3312 3314 3318 3317 3313 3315 3319 3318 3314 5081 5084 3319 3315 3317 3321 3320 3316 3318 3322 3321 3317 3319 3323 3322 3318 5084 5086 3323 3319 3321 3326 3325 3320 3322 3327 3326 3321 3323 3328 3327 3322 5086 5087 3328 3323 3325 3331 3330 3324 3326 3332 3331 3325 3327 3333 3332 3326 3328 3334 3333 3327 5087 5113 3334 3328 3330 3336 3335 3329 3445 5217 5116 3337 5116 5121 3367 3337 3337 3450 3444 3445 3338 3450 3337 3367 3367 3369 3368 3338 3449 3450 3338 3339 3338 3368 3347 3339 3448 3449 3339 3340 3339 3347 3346 3340 3447 3448 3340 3341 3340 3346 3345 3341 3446 3447 3341 3342 3341 3345 3344 3342 3342 3451 3423 3446 3343 3451 3342 3344 3344 3349 3348 3343 3345 3350 3349 3344 3346 3351 3350 3345 3347 3352 3351 3346 3368 3370 3352 3347 3349 3354 3353 3348 3350 3355 3354 3349 3351 3356 3355 3350 3352 3372 3356 3351 3370 3373 3372 3352 3354 3358 3357 3353 3355 3359 3358 3354 3356 3375 3359 3355 3372 3376 3375 3356 3358 3361 3360 3357 3359 3362 3361 3358 3375 3379 3362 3359 3361 3364 3363 3360 3362 3383 3364 3361 3379 3384 3383 3362 3364 3388 3365 3363 3383 3389 3388 3364 3388 3394 3366 3365 5121 5126 3369 3367 3369 3371 3370 3368 5126 5130 3371 3369 3371 3374 3373 3370 5130 5133 3374 3371 3373 3377 3376 3372 3374 3378 3377 3373 5133 5136 3378 3374 3376 3380 3379 3375 3377 3381 3380 3376 3378 3382 3381 3377 5136 5138 3382 3378 3380 3385 3384 3379 3381 3386 3385 3380 3382 3387 3386 3381 5138 5139 3387 3382 3384 3390 3389 3383 3385 3391 3390 3384 3386 3392 3391 3385 3387 3393 3392 3386 5139 5164 3393 3387 3389 3395 3394 3388 3390 3396 3395 3389 3499 5221 5169 3397 5169 5175 3424 3397 3498 3499 3397 3398 3397 3424 3404 3398 3497 3498 3398 3399 3398 3404 3403 3399 3399 3502 3496 3497 3402 3502 3399 3403 3401 3406 3405 3400 3500 3501 3401 3400 3402 3407 3406 3401 3501 3502 3402 3401 3403 3408 3407 3402 3404 3409 3408 3403 3424 3425 3409 3404 3406 3411 3410 3405 3407 3412 3411 3406 3408 3413 3412 3407 3409 3426 3413 3408 3425 3427 3426 3409 3411 3415 3414 3410 3412 3416 3415 3411 3413 3428 3416 3412 3426 3429 3428 3413 3415 3418 3417 3414 3416 3419 3418 3415 3428 3431 3419 3416 3418 3421 3420 3417 3419 3435 3421 3418 3431 3436 3435 3419 3421 3440 3422 3420 3435 3441 3440 3421 3440 3446 3423 3422 5175 5180 3425 3424 5180 5184 3427 3425 3427 3430 3429 3426 5184 5188 3430 3427 3429 3432 3431 3428 3430 3433 3432 3429 3430 5188 3434 3433 3432 3437 3436 3431 3433 3438 3437 3432 3434 3439 3438 3433 5191 5192 3439 3434 5189 5191 3434 5188 3436 3442 3441 3435 3437 3443 3442 3436 3438 3444 3443 3437 3439 3445 3444 3438 5192 5217 3445 3439 3441 3447 3446 3440 3442 3448 3447 3441 3443 3449 3448 3442 3444 3450 3449 3443 3495 3501 3500 3452 3454 3495 3452 3453 3455 3456 3454 3453 3491 3496 3495 3454 3487 3491 3454 3456 3457 3458 3456 3455 3459 3487 3456 3458 3460 3461 3458 3457 3461 3462 3459 3458 3484 3488 3487 3459 3463 3484 3459 3462 3464 3465 3461 3460 3465 3466 3462 3461 3466 3467 3463 3462 3482 3485 3484 3463 3480 3482 3463 3467 3468 3469 3465 3464 3469 3470 3466 3465 3470 3471 3467 3466 3472 3480 3467 3471 3473 3474 3469 3468 3474 3475 3470 3469 3475 3476 3471 3470 3476 3477 3472 3471 3479 3481 3480 3472 3478 3479 3472 3477 3478 5240 5235 3479 3479 5235 5231 3481 3481 3483 3482 3480 3481 5231 5228 3483 3483 3486 3485 3482 3483 5228 5225 3486 3485 3489 3488 3484 3486 3490 3489 3485 3486 5225 5223 3490 3488 3492 3491 3487 3489 3493 3492 3488 3490 3494 3493 3489 3490 5223 5222 3494 3492 3497 3496 3491 3493 3498 3497 3492 3494 3499 3498 3493 3494 5222 5221 3499 3496 3502 3501 3495 3504 3510 3509 3503 3585 3603 3504 3503 3505 3511 3510 3504 3603 3604 3505 3504 3506 3512 3511 3505 3604 3605 3506 3505 3507 3513 3512 3506 3605 3606 3507 3506 3508 3557 3513 3507 3606 3607 3508 3507 3508 3559 3558 3557 3607 5353 3559 3508 3510 3515 3514 3509 3511 3516 3515 3510 3512 3517 3516 3511 3513 3518 3517 3512 3513 3557 3555 3518 3515 3520 3519 3514 3516 3521 3520 3515 3517 3522 3521 3516 3518 3552 3522 3517 3518 3555 3553 3552 3520 3524 3523 3519 3521 3525 3524 3520 3522 3548 3525 3521 3522 3552 3549 3548 3524 3527 3526 3523 3525 3543 3527 3524 3525 3548 3544 3543 3527 3529 3528 3526 3527 3543 3538 3529 3529 3532 3530 3528 3529 3538 3533 3532 3532 5250 3531 3530 3531 5250 5241 5240 5249 5250 3532 3533 5248 5249 3533 3534 3538 3539 3534 3533 5247 5248 3534 3535 3539 3540 3535 3534 5246 5247 3535 3536 3540 3541 3536 3535 3537 5251 5246 3536 3541 3542 3537 3536 5300 6958 5251 3537 5299 5300 3537 3542 3543 3544 3539 3538 3544 3545 3540 3539 3545 3546 3541 3540 3546 3547 3542 3541 5298 5299 3542 3547 3548 3549 3545 3544 3549 3550 3546 3545 3550 3551 3547 3546 5296 5298 3547 3551 3552 3553 3550 3549 3553 3554 3551 3550 5293 5296 3551 3554 3555 3556 3554 3553 5289 5293 3554 3556 3557 3558 3556 3555 5284 5289 3556 3558 5279 5284 3558 3559 5353 5373 5279 3559 3561 3567 3566 3560 3650 3651 3561 3560 3562 3568 3567 3561 3651 3652 3562 3561 3563 3569 3568 3562 3652 3653 3563 3562 3564 3570 3569 3563 3653 3654 3564 3563 3565 3586 3570 3564 3654 3655 3565 3564 5323 5330 3586 3565 3655 5406 5323 3565 3567 3572 3571 3566 3568 3573 3572 3567 3569 3574 3573 3568 3570 3587 3574 3569 3586 3588 3587 3570 3572 3576 3575 3571 3573 3577 3576 3572 3574 3578 3577 3573 3587 3589 3578 3574 3576 3580 3579 3575 3577 3581 3580 3576 3578 3591 3581 3577 3589 3592 3591 3578 3580 3583 3582 3579 3581 3594 3583 3580 3591 3595 3594 3581 3583 3598 3584 3582 3594 3599 3598 3583 3598 3603 3585 3584 5330 5336 3588 3586 3588 3590 3589 3587 5336 5341 3590 3588 3590 3593 3592 3589 5341 5345 3593 3590 3592 3596 3595 3591 3593 3597 3596 3592 5345 5348 3597 3593 3595 3600 3599 3594 3596 3601 3600 3595 3597 3602 3601 3596 5348 5351 3602 3597 3599 3604 3603 3598 3600 3605 3604 3599 3601 3606 3605 3600 3602 3607 3606 3601 5351 5353 3607 3602 3609 3615 3614 3608 3706 3707 3609 3608 3610 3616 3615 3609 3707 3708 3610 3609 3611 3617 3616 3610 3708 3709 3611 3610 3612 3618 3617 3611 3709 3710 3612 3611 3613 3632 3618 3612 3710 3711 3613 3612 5379 5383 3632 3613 3711 5458 5379 3613 3615 3620 3619 3614 3616 3621 3620 3615 3617 3622 3621 3616 3618 3633 3622 3617 3632 3634 3633 3618 3620 3624 3623 3619 3621 3625 3624 3620 3622 3635 3625 3621 3633 3636 3635 3622 3624 3627 3626 3623 3625 3628 3627 3624 3635 3638 3628 3625 3627 3630 3629 3626 3628 3641 3630 3627 3638 3642 3641 3628 3630 3645 3631 3629 3641 3646 3645 3630 3645 3651 3650 3631 5383 5389 3634 3632 3634 3637 3636 3633 5389 5394 3637 3634 3636 3639 3638 3635 3637 3640 3639 3636 5394 5398 3640 3637 3639 3643 3642 3638 3640 3644 3643 3639 5398 5401 3644 3640 3642 3647 3646 3641 3643 3648 3647 3642 3644 3649 3648 3643 5401 5404 3649 3644 3646 3652 3651 3645 3647 3653 3652 3646 3648 3654 3653 3647 3649 3655 3654 3648 5404 5406 3655 3649 3657 3660 3659 3656 3740 3762 3657 3656 3658 3661 3660 3657 3762 3763 3658 3657 3658 3768 3662 3661 3764 3768 3658 3763 3660 3666 3665 3659 3661 3667 3666 3660 3662 3668 3667 3661 3663 3669 3668 3662 3768 3769 3663 3662 3664 3670 3669 3663 3769 3770 3664 3663 3684 3685 3670 3664 3770 3771 3684 3664 3666 3672 3671 3665 3667 3673 3672 3666 3668 3674 3673 3667 3669 3675 3674 3668 3670 3686 3675 3669 3685 3687 3686 3670 3672 3677 3676 3671 3673 3678 3677 3672 3674 3679 3678 3673 3675 3688 3679 3674 3686 3689 3688 3675 3677 3681 3680 3676 3678 3682 3681 3677 3679 3691 3682 3678 3688 3692 3691 3679 3682 3695 3683 3681 3691 3696 3695 3682 3695 3701 3700 3683 5432 5438 3685 3684 3771 5528 5432 3684 5438 5443 3687 3685 3687 3690 3689 3686 5443 5448 3690 3687 3689 3693 3692 3688 3690 3694 3693 3689 5448 5452 3694 3690 3692 3697 3696 3691 3693 3698 3697 3692 3694 3699 3698 3693 5452 5455 3699 3694 3696 3702 3701 3695 3697 3703 3702 3696 3698 3704 3703 3697 3699 3705 3704 3698 5455 5457 3705 3699 3701 3707 3706 3700 3702 3708 3707 3701 3703 3709 3708 3702 3704 3710 3709 3703 3705 3711 3710 3704 5457 5458 3711 3705 3713 3719 3718 3712 3824 3825 3713 3712 3714 3720 3719 3713 3825 3826 3714 3713 3715 3721 3720 3714 3826 3827 3715 3714 3716 3722 3721 3715 3827 3828 3716 3715 3717 3723 3722 3716 3828 3829 3717 3716 3741 3742 3723 3717 3829 3830 3741 3717 3719 3725 3724 3718 3720 3726 3725 3719 3721 3727 3726 3720 3722 3728 3727 3721 3723 3743 3728 3722 3742 3744 3743 3723 3725 3730 3729 3724 3726 3731 3730 3725 3727 3732 3731 3726 3728 3745 3732 3727 3743 3746 3745 3728 3730 3734 3733 3729 3731 3735 3734 3730 3732 3748 3735 3731 3745 3749 3748 3732 3734 3737 3736 3733 3735 3752 3737 3734 3748 3753 3752 3735 3737 3739 3738 3736 3752 3757 3739 3737 3739 3762 3740 3738 3757 3763 3762 3739 5483 5486 3742 3741 3830 5581 5483 3741 5486 5491 3744 3742 3744 3747 3746 3743 5491 5496 3747 3744 3746 3750 3749 3745 3747 3751 3750 3746 5496 5500 3751 3747 3749 3754 3753 3748 3750 3755 3754 3749 3751 3756 3755 3750 5500 5503 3756 3751 3753 3758 3757 3752 3754 3759 3758 3753 3755 3760 3759 3754 3756 3761 3760 3755 5503 5505 3761 3756 3758 3764 3763 3757 3759 3765 3764 3758 3760 3766 3765 3759 3761 3767 3766 3760 5505 5507 3767 3761 3765 3769 3768 3764 3766 3770 3769 3765 3767 3771 3770 3766 5507 5528 3771 3767 3773 3779 3778 3772 3879 3880 3773 3772 3774 3780 3779 3773 3880 3881 3774 3773 3775 3781 3780 3774 3881 3882 3775 3774 3776 3782 3781 3775 3882 3883 3776 3775 3777 3783 3782 3776 3883 3884 3777 3776 5534 5536 3783 3777 3884 5618 5534 3777 3779 3785 3784 3778 3780 3786 3785 3779 3781 3787 3786 3780 3782 3788 3787 3781 3783 3801 3788 3782 5536 5542 3801 3783 3785 3790 3789 3784 3786 3791 3790 3785 3787 3792 3791 3786 3788 3802 3792 3787 3801 3803 3802 3788 3790 3794 3793 3789 3791 3795 3794 3790 3792 3804 3795 3791 3802 3805 3804 3792 3794 3797 3796 3793 3795 3808 3797 3794 3804 3809 3808 3795 3797 3799 3798 3796 3808 3813 3799 3797 3799 3818 3800 3798 3813 3819 3818 3799 3818 3825 3824 3800 5542 5548 3803 3801 3803 3806 3805 3802 3803 5548 3807 3806 3805 3810 3809 3804 3806 3811 3810 3805 3807 3812 3811 3806 5553 5556 3812 3807 5549 5553 3807 5548 3809 3814 3813 3808 3810 3815 3814 3809 3811 3816 3815 3810 3812 3817 3816 3811 5556 5558 3817 3812 3814 3820 3819 3813 3815 3821 3820 3814 3816 3822 3821 3815 3817 3823 3822 3816 5558 5560 3823 3817 3819 3826 3825 3818 3820 3827 3826 3819 3821 3828 3827 3820 3822 3829 3828 3821 3823 3830 3829 3822 5560 5581 3830 3823 3832 3838 3837 3831 3931 3932 3832 3831 3833 3839 3838 3832 3932 3933 3833 3832 3834 3840 3839 3833 3933 3934 3834 3833 3835 3841 3840 3834 3934 3935 3835 3834 3836 3859 3841 3835 3935 3936 3836 3835 3836 5706 5590 3859 5678 5706 3836 3936 3838 3843 3842 3837 3839 3844 3843 3838 3840 3845 3844 3839 3841 3846 3845 3840 3859 3860 3846 3841 3843 3848 3847 3842 3844 3849 3848 3843 3845 3850 3849 3844 3846 3861 3850 3845 3860 3862 3861 3846 3848 3852 3851 3847 3849 3853 3852 3848 3850 3863 3853 3849 3861 3864 3863 3850 3852 3855 3854 3851 3853 3866 3855 3852 3863 3867 3866 3853 3855 3857 3856 3854 3866 3870 3857 3855 3857 3874 3858 3856 3870 3875 3874 3857 3874 3880 3879 3858 5590 5596 3860 3859 5596 5601 3862 3860 3862 3865 3864 3861 5601 5606 3865 3862 3864 3868 3867 3863 3865 3869 3868 3864 5606 5610 3869 3865 3867 3871 3870 3866 3868 3872 3871 3867 3869 3873 3872 3868 5610 5613 3873 3869 3871 3876 3875 3870 3872 3877 3876 3871 3873 3878 3877 3872 5613 5616 3878 3873 3875 3881 3880 3874 3876 3882 3881 3875 3877 3883 3882 3876 3878 3884 3883 3877 5616 5618 3884 3878 3886 3890 3889 3885 3985 3986 3886 3885 3887 3891 3890 3886 3986 3987 3887 3886 3888 3892 3891 3887 3987 3988 3888 3887 3888 3991 3893 3892 3989 3991 3888 3988 3890 3895 3894 3889 3891 3896 3895 3890 3892 3897 3896 3891 3893 3898 3897 3892 3911 3912 3898 3893 3991 3992 3911 3893 3895 3900 3899 3894 3896 3901 3900 3895 3897 3902 3901 3896 3898 3913 3902 3897 3912 3914 3913 3898 3900 3904 3903 3899 3901 3905 3904 3900 3902 3915 3905 3901 3913 3916 3915 3902 3904 3907 3906 3903 3905 3918 3907 3904 3915 3919 3918 3905 3907 3909 3908 3906 3918 3922 3909 3907 3909 3926 3910 3908 3922 3927 3926 3909 3926 3932 3931 3910 5651 5657 3912 3911 3992 5761 5651 3911 5657 5662 3914 3912 3914 3917 3916 3913 5662 5667 3917 3914 3916 3920 3919 3915 3917 3921 3920 3916 5667 5671 3921 3917 3919 3923 3922 3918 3920 3924 3923 3919 3921 3925 3924 3920 5671 5674 3925 3921 3923 3928 3927 3922 3924 3929 3928 3923 3925 3930 3929 3924 5674 5676 3930 3925 3927 3933 3932 3926 3928 3934 3933 3927 3929 3935 3934 3928 3930 3936 3935 3929 5676 5678 3936 3930 3938 3941 3940 3937 4022 4043 3938 3937 3939 3942 3941 3938 4043 4044 3939 3938 3939 4049 3943 3942 4045 4049 3939 4044 3941 3947 3946 3940 3942 3948 3947 3941 3943 3949 3948 3942 3944 3950 3949 3943 4049 4050 3944 3943 3945 3951 3950 3944 4050 4051 3945 3944 3965 3966 3951 3945 4051 4052 3965 3945 3947 3953 3952 3946 3948 3954 3953 3947 3949 3955 3954 3948 3950 3956 3955 3949 3951 3967 3956 3950 3966 3968 3967 3951 3954 3958 3957 3953 3955 3959 3958 3954 3956 3969 3959 3955 3967 3970 3969 3956 3958 3961 3960 3957 3959 3972 3961 3958 3969 3973 3972 3959 3961 3963 3962 3960 3972 3976 3963 3961 3963 3980 3964 3962 3976 3981 3980 3963 3980 3986 3985 3964 5713 5719 3966 3965 4052 5815 5713 3965 5719 5724 3968 3966 3968 3971 3970 3967 5724 5728 3971 3968 3970 3974 3973 3969 3971 3975 3974 3970 5728 5732 3975 3971 3973 3977 3976 3972 3974 3978 3977 3973 3975 3979 3978 3974 5732 5735 3979 3975 3977 3982 3981 3976 3978 3983 3982 3977 3979 3984 3983 3978 5735 5737 3984 3979 3981 3987 3986 3980 3982 3988 3987 3981 3983 3989 3988 3982 3984 3990 3989 3983 5737 5739 3990 3984 3990 3992 3991 3989 5739 5761 3992 3990 3994 4000 3999 3993 4109 4110 3994 3993 3995 4001 4000 3994 4110 4111 3995 3994 3996 4002 4001 3995 4111 4112 3996 3995 3997 4003 4002 3996 4112 4113 3997 3996 3998 4004 4003 3997 4113 4114 3998 3997 4023 4024 4004 3998 4114 4115 4023 3998 4000 4006 4005 3999 4001 4007 4006 4000 4002 4008 4007 4001 4003 4009 4008 4002 4004 4025 4009 4003 4024 4026 4025 4004 4006 4011 4010 4005 4007 4012 4011 4006 4008 4013 4012 4007 4009 4027 4013 4008 4025 4028 4027 4009 4011 4015 4014 4010 4012 4016 4015 4011 4013 4030 4016 4012 4027 4031 4030 4013 4015 4018 4017 4014 4016 4019 4018 4015 4030 4034 4019 4016 4018 4021 4020 4017 4019 4038 4021 4018 4034 4039 4038 4019 4021 4043 4022 4020 4038 4044 4043 4021 5767 5773 4024 4023 4115 5869 5767 4023 5773 5778 4026 4024 4026 4029 4028 4025 5778 5782 4029 4026 4028 4032 4031 4027 4029 4033 4032 4028 5782 5786 4033 4029 4031 4035 4034 4030 4032 4036 4035 4031 4033 4037 4036 4032 5786 5789 4037 4033 4035 4040 4039 4034 4036 4041 4040 4035 4037 4042 4041 4036 5789 5791 4042 4037 4039 4045 4044 4038 4040 4046 4045 4039 4041 4047 4046 4040 4042 4048 4047 4041 5791 5793 4048 4042 4046 4050 4049 4045 4047 4051 4050 4046 4048 4052 4051 4047 5793 5815 4052 4048 4054 4060 4059 4053 4172 4173 4054 4053 4055 4061 4060 4054 4173 4174 4055 4054 4056 4062 4061 4055 4174 4175 4056 4055 4057 4063 4062 4056 4175 4176 4057 4056 4058 4064 4063 4057 4176 4177 4058 4057 4083 4084 4064 4058 4177 4178 4083 4058 4060 4066 4065 4059 4061 4067 4066 4060 4062 4068 4067 4061 4063 4069 4068 4062 4064 4085 4069 4063 4084 4086 4085 4064 4066 4071 4070 4065 4067 4072 4071 4066 4068 4073 4072 4067 4069 4087 4073 4068 4085 4088 4087 4069 4071 4075 4074 4070 4072 4076 4075 4071 4073 4090 4076 4072 4087 4091 4090 4073 4075 4078 4077 4074 4076 4079 4078 4075 4090 4094 4079 4076 4078 4081 4080 4077 4079 4098 4081 4078 4094 4099 4098 4079 4081 4103 4082 4080 4098 4104 4103 4081 4103 4110 4109 4082 5821 5827 4084 4083 4178 5919 5821 4083 5827 5832 4086 4084 4086 4089 4088 4085 5832 5837 4089 4086 4088 4092 4091 4087 4089 4093 4092 4088 5837 5841 4093 4089 4091 4095 4094 4090 4092 4096 4095 4091 4093 4097 4096 4092 5841 5844 4097 4093 4095 4100 4099 4094 4096 4101 4100 4095 4097 4102 4101 4096 5844 5846 4102 4097 4099 4105 4104 4098 4100 4106 4105 4099 4101 4107 4106 4100 4102 4108 4107 4101 5846 5848 4108 4102 4104 4111 4110 4103 4105 4112 4111 4104 4106 4113 4112 4105 4107 4114 4113 4106 4108 4115 4114 4107 5848 5869 4115 4108 4117 4124 4123 4116 4208 4233 4117 4116 4118 4125 4124 4117 4233 4234 4118 4117 4119 4126 4125 4118 4234 4235 4119 4118 4120 4127 4126 4119 4235 4236 4120 4119 4121 4128 4127 4120 4236 4237 4121 4120 4122 4147 4128 4121 4237 4238 4122 4121 5875 5877 4147 4122 4238 5967 5875 4122 4124 4130 4129 4123 4125 4131 4130 4124 4126 4132 4131 4125 4127 4133 4132 4126 4128 4148 4133 4127 4147 4149 4148 4128 4130 4135 4134 4129 4131 4136 4135 4130 4132 4137 4136 4131 4133 4150 4137 4132 4148 4151 4150 4133 4135 4139 4138 4134 4136 4140 4139 4135 4137 4153 4140 4136 4150 4154 4153 4137 4139 4142 4141 4138 4140 4143 4142 4139 4153 4157 4143 4140 4142 4145 4144 4141 4143 4161 4145 4142 4157 4162 4161 4143 4145 4166 4146 4144 4161 4167 4166 4145 4166 4173 4172 4146 5877 5882 4149 4147 4149 4152 4151 4148 5882 5887 4152 4149 4151 4155 4154 4150 4152 4156 4155 4151 5887 5891 4156 4152 4154 4158 4157 4153 4155 4159 4158 4154 4156 4160 4159 4155 5891 5894 4160 4156 4158 4163 4162 4157 4159 4164 4163 4158 4160 4165 4164 4159 5894 5896 4165 4160 4162 4168 4167 4161 4163 4169 4168 4162 4164 4170 4169 4163 4165 4171 4170 4164 5896 5898 4171 4165 4167 4174 4173 4166 4168 4175 4174 4167 4169 4176 4175 4168 4170 4177 4176 4169 4171 4178 4177 4170 5898 5919 4178 4171 4180 4184 4183 4179 4267 4289 4180 4179 4181 4185 4184 4180 4289 4290 4181 4180 4182 4186 4185 4181 4290 4291 4182 4181 4182 4295 4187 4186 4292 4295 4182 4291 4184 4190 4189 4183 4185 4191 4190 4184 4186 4192 4191 4185 4187 4193 4192 4186 4188 4210 4193 4187 4295 4296 4188 4187 4209 4211 4210 4188 4296 4297 4209 4188 4190 4195 4194 4189 4191 4196 4195 4190 4192 4197 4196 4191 4193 4212 4197 4192 4210 4213 4212 4193 4195 4199 4198 4194 4196 4200 4199 4195 4197 4201 4200 4196 4212 4215 4201 4197 4199 4203 4202 4198 4200 4204 4203 4199 4201 4218 4204 4200 4215 4219 4218 4201 4203 4206 4205 4202 4204 4222 4206 4203 4218 4223 4222 4204 4206 4227 4207 4205 4222 4228 4227 4206 4227 4233 4208 4207 5925 5931 4211 4209 4297 6025 5925 4209 4211 4214 4213 4210 5931 5936 4214 4211 4213 4216 4215 4212 4214 4217 4216 4213 5936 5940 4217 4214 4216 4220 4219 4215 4217 4221 4220 4216 5940 5943 4221 4217 4219 4224 4223 4218 4220 4225 4224 4219 4221 4226 4225 4220 5943 5946 4226 4221 4223 4229 4228 4222 4224 4230 4229 4223 4225 4231 4230 4224 4226 4232 4231 4225 5946 5948 4232 4226 4228 4234 4233 4227 4229 4235 4234 4228 4230 4236 4235 4229 4231 4237 4236 4230 4232 4238 4237 4231 5948 5967 4238 4232 4240 4246 4245 4239 4350 4351 4240 4239 4241 4247 4246 4240 4351 4352 4241 4240 4242 4248 4247 4241 4352 4353 4242 4241 4243 4249 4248 4242 4353 4354 4243 4242 4244 4250 4249 4243 4354 4355 4244 4243 4268 4269 4250 4244 4355 4356 4268 4244 4246 4252 4251 4245 4247 4253 4252 4246 4248 4254 4253 4247 4249 4255 4254 4248 4250 4270 4255 4249 4269 4271 4270 4250 4252 4257 4256 4251 4253 4258 4257 4252 4254 4259 4258 4253 4255 4272 4259 4254 4270 4273 4272 4255 4257 4261 4260 4256 4258 4262 4261 4257 4259 4275 4262 4258 4272 4276 4275 4259 4261 4264 4263 4260 4262 4279 4264 4261 4275 4280 4279 4262 4264 4266 4265 4263 4279 4284 4266 4264 4266 4289 4267 4265 4284 4290 4289 4266 5977 5983 4269 4268 4356 6073 5977 4268 5983 5988 4271 4269 4271 4274 4273 4270 5988 5992 4274 4271 4273 4277 4276 4272 4274 4278 4277 4273 5992 5996 4278 4274 4276 4281 4280 4275 4277 4282 4281 4276 4278 4283 4282 4277 5996 5999 4283 4278 4280 4285 4284 4279 4281 4286 4285 4280 4282 4287 4286 4281 4283 4288 4287 4282 5999 6001 4288 4283 4285 4291 4290 4284 4286 4292 4291 4285 4287 4293 4292 4286 4288 4294 4293 4287 6001 6002 4294 4288 4293 4296 4295 4292 4294 4297 4296 4293 6002 6025 4297 4294 4299 4304 4303 4298 4400 4401 4299 4298 4300 4305 4304 4299 4401 4402 4300 4299 4301 4306 4305 4300 4402 4403 4301 4300 4302 4307 4306 4301 4403 4404 4302 4301 4302 4406 4327 4307 4405 4406 4302 4404 4304 4309 4308 4303 4305 4310 4309 4304 4306 4311 4310 4305 4307 4328 4311 4306 4327 4329 4328 4307 4309 4314 4313 4308 4310 4315 4314 4309 4311 4316 4315 4310 4328 4330 4316 4311 4313 4318 4317 4312 4314 4319 4318 4313 4315 4320 4319 4314 4316 4332 4320 4315 4330 4333 4332 4316 4318 4322 4321 4317 4319 4323 4322 4318 4320 4335 4323 4319 4332 4336 4335 4320 4322 4325 4324 4321 4323 4339 4325 4322 4335 4340 4339 4323 4325 4344 4326 4324 4339 4345 4344 4325 4344 4351 4350 4326 6031 6037 4329 4327 4406 6129 6031 4327 4329 4331 4330 4328 6037 6042 4331 4329 4331 4334 4333 4330 6042 6046 4334 4331 4333 4337 4336 4332 4334 4338 4337 4333 6046 6049 4338 4334 4336 4341 4340 4335 4337 4342 4341 4336 4338 4343 4342 4337 6049 6052 4343 4338 4340 4346 4345 4339 4341 4347 4346 4340 4342 4348 4347 4341 4343 4349 4348 4342 6052 6054 4349 4343 4345 4352 4351 4344 4346 4353 4352 4345 4347 4354 4353 4346 4348 4355 4354 4347 4349 4356 4355 4348 6054 6073 4356 4349 4358 4364 4363 4357 4431 4447 4358 4357 4359 4365 4364 4358 4447 4448 4359 4358 4360 4366 4365 4359 4448 4449 4360 4359 4361 4367 4366 4360 4449 4450 4361 4360 4362 4368 4367 4361 4450 4451 4362 4361 4384 6080 4368 4362 4451 4452 4384 4362 4364 4370 4369 4363 4365 4371 4370 4364 4366 4372 4371 4365 4367 4373 4372 4366 4368 4385 4373 4367 6080 6086 4385 4368 4370 4375 4374 4369 4371 4376 4375 4370 4372 4377 4376 4371 4373 4386 4377 4372 4385 4387 4386 4373 4375 4379 4378 4374 4376 4380 4379 4375 4377 4388 4380 4376 4386 4389 4388 4377 4379 4382 4381 4378 4380 4391 4382 4379 4388 4392 4391 4380 4382 4395 4383 4381 4391 4396 4395 4382 4395 4401 4400 4383 6079 6081 6080 4384 4452 6172 6079 4384 6086 6091 4387 4385 4387 4390 4389 4386 6091 6095 4390 4387 4389 4393 4392 4388 4390 4394 4393 4389 6095 6099 4394 4390 4392 4397 4396 4391 4393 4398 4397 4392 4394 4399 4398 4393 6099 6102 4399 4394 4396 4402 4401 4395 4397 4403 4402 4396 4398 4404 4403 4397 4399 4405 4404 4398 6102 6104 4405 4399 6104 6129 4406 4405 4408 4414 4413 4407 4473 4493 4408 4407 4409 4415 4414 4408 4493 4494 4409 4408 4410 4416 4415 4409 4494 4495 4410 4409 4411 4417 4416 4410 4495 4496 4411 4410 4412 4432 4417 4411 4496 4497 4412 4411 6135 6141 4432 4412 4497 6207 6135 4412 4414 4419 4418 4413 4415 4420 4419 4414 4416 4421 4420 4415 4417 4433 4421 4416 4432 4434 4433 4417 4419 4424 4423 4418 4420 4425 4424 4419 4421 4435 4425 4420 4433 4436 4435 4421 4423 4427 4426 4422 4424 4428 4427 4423 4425 4438 4428 4424 4435 4439 4438 4425 4427 4430 4429 4426 4428 4442 4430 4427 4438 4443 4442 4428 4430 4447 4431 4429 4442 4448 4447 4430 6141 6146 4434 4432 4434 4437 4436 4433 6146 6150 4437 4434 4436 4440 4439 4435 4437 4441 4440 4436 6150 6153 4441 4437 4439 4444 4443 4438 4440 4445 4444 4439 4441 4446 4445 4440 6153 6155 4446 4441 4443 4449 4448 4442 4444 4450 4449 4443 4445 4451 4450 4444 4446 4452 4451 4445 6155 6172 4452 4446 4544 4545 4474 4453 4474 4476 4475 4453 4543 4544 4453 4454 4453 4475 4462 4454 4542 4543 4454 4455 4454 4462 4461 4455 4541 4542 4455 4456 4455 4461 4460 4456 4540 4541 4456 4457 4456 4460 4459 4457 4459 4464 4463 4458 4460 4465 4464 4459 4461 4466 4465 4460 4462 4477 4466 4461 4475 4478 4477 4462 4464 4468 4467 4463 4465 4469 4468 4464 4466 4480 4469 4465 4477 4481 4480 4466 4468 4471 4470 4467 4469 4484 4471 4468 4480 4485 4484 4469 4471 4488 4472 4470 4484 4489 4488 4471 4488 4493 4473 4472 6189 6194 4476 4474 6183 6189 4474 4545 4476 4479 4478 4475 6194 6198 4479 4476 4478 4482 4481 4477 4479 4483 4482 4478 6198 6201 4483 4479 4481 4486 4485 4480 4482 4487 4486 4481 4483 6203 4487 4482 6201 6204 6203 4483 4485 4490 4489 4484 4486 4491 4490 4485 4487 4492 4491 4486 6203 6205 4492 4487 4489 4494 4493 4488 4490 4495 4494 4489 4491 4496 4495 4490 4492 4497 4496 4491 6205 6207 4497 4492 6234 6240 4498 4604 6240 6245 4522 4498 4603 4604 4498 4499 4498 4522 4508 4499 4602 4603 4499 4500 4499 4508 4507 4500 4601 4602 4500 4501 4500 4507 4506 4501 4600 4601 4501 4502 4501 4506 4505 4502 4575 4600 4502 4503 4502 4505 4504 4503 4505 4510 4509 4504 4506 4511 4510 4505 4507 4512 4511 4506 4508 4523 4512 4507 4522 4524 4523 4508 4510 4514 4513 4509 4511 4515 4514 4510 4512 4525 4515 4511 4523 4526 4525 4512 4514 4517 4516 4513 4515 4518 4517 4514 4525 4528 4518 4515 4517 4520 4519 4516 4518 4531 4520 4517 4528 4532 4531 4518 4520 4535 4521 4519 4531 4536 4535 4520 4535 4541 4540 4521 6245 6250 4524 4522 4524 4527 4526 4523 6250 6254 4527 4524 4526 4529 4528 4525 4527 4530 4529 4526 6254 6257 4530 4527 4529 4533 4532 4528 4530 4534 4533 4529 6257 6259 4534 4530 4532 4537 4536 4531 4533 4538 4537 4532 4534 4539 4538 4533 6259 6260 4539 4534 4536 4542 4541 4535 4537 4543 4542 4536 4538 4544 4543 4537 4539 4545 4544 4538 4539 6260 6183 4545 4657 4658 4576 4546 4576 4577 4554 4546 4656 4657 4546 4547 4546 4554 4553 4547 4655 4656 4547 4548 4547 4553 4552 4548 4548 4660 4654 4655 4551 4660 4548 4552 4550 4556 4555 4549 4631 4659 4550 4549 4551 4557 4556 4550 4659 4660 4551 4550 4552 4558 4557 4551 4553 4559 4558 4552 4554 4578 4559 4553 4577 4579 4578 4554 4556 4561 4560 4555 4557 4562 4561 4556 4558 4563 4562 4557 4559 4580 4563 4558 4578 4581 4580 4559 4561 4565 4564 4560 4562 4566 4565 4561 4563 4567 4566 4562 4580 4583 4567 4563 4565 4569 4568 4564 4566 4570 4569 4565 4567 4586 4570 4566 4583 4587 4586 4567 4569 4572 4571 4568 4570 4590 4572 4569 4586 4591 4590 4570 4572 4574 4573 4571 4590 4595 4574 4572 4574 4600 4575 4573 4595 4601 4600 4574 6290 6295 4577 4576 4658 6386 6290 4576 6295 6299 4579 4577 4579 4582 4581 4578 6299 6303 4582 4579 4581 4584 4583 4580 4582 4585 4584 4581 6303 6306 4585 4582 4584 4588 4587 4583 4585 4589 4588 4584 6306 6308 4589 4585 4587 4592 4591 4586 4588 4593 4592 4587 4589 4594 4593 4588 6308 6310 4594 4589 4591 4596 4595 4590 4592 4597 4596 4591 4593 4598 4597 4592 4594 4599 4598 4593 6310 6332 4599 4594 4596 4602 4601 4595 4597 4603 4602 4596 4598 4604 4603 4597 4599 6234 4604 4598 4599 6332 6235 6234 4708 6437 6338 4605 6338 6344 4632 4605 4707 4708 4605 4606 4605 4632 4611 4606 4606 4712 4706 4707 4610 4712 4606 4611 4608 4613 4612 4607 4709 4710 4608 4607 4609 4614 4613 4608 4710 4711 4609 4608 4610 4615 4614 4609 4711 4712 4610 4609 4611 4633 4615 4610 4632 4634 4633 4611 4613 4617 4616 4612 4614 4618 4617 4613 4615 4619 4618 4614 4633 4635 4619 4615 4617 4621 4620 4616 4618 4622 4621 4617 4619 4637 4622 4618 4635 4638 4637 4619 4621 4624 4623 4620 4622 4640 4624 4621 4637 4641 4640 4622 4624 4627 4626 4623 4640 4644 4627 4624 4626 4629 4628 4625 4627 4648 4629 4626 4644 4649 4648 4627 4629 4653 4630 4628 4648 4654 4653 4629 4653 4659 4631 4630 6344 6349 4634 4632 4634 4636 4635 4633 6349 6353 4636 4634 4636 4639 4638 4635 6353 6357 4639 4636 4638 4642 4641 4637 4639 4643 4642 4638 6357 6360 4643 4639 4641 4645 4644 4640 4642 4646 4645 4641 4643 4647 4646 4642 6360 6362 4647 4643 4645 4650 4649 4644 4646 4651 4650 4645 4647 4652 4651 4646 6362 6363 4652 4647 4649 4655 4654 4648 4650 4656 4655 4649 4651 4657 4656 4650 4652 4658 4657 4651 6363 6386 4658 4652 4654 4660 4659 4653 4764 4765 4685 4661 4685 4686 4670 4661 4763 4764 4661 4662 4661 4670 4669 4662 4762 4763 4662 4663 4662 4669 4668 4663 4761 4762 4663 4664 4663 4668 4667 4664 4760 4761 4664 4665 4664 4667 4666 4665 4667 4672 4671 4666 4668 4673 4672 4667 4669 4674 4673 4668 4670 4687 4674 4669 4686 4688 4687 4670 4672 4676 4675 4671 4673 4677 4676 4672 4674 4689 4677 4673 4687 4690 4689 4674 4676 4679 4678 4675 4677 4680 4679 4676 4689 4692 4680 4677 4679 4682 4681 4678 4680 4695 4682 4679 4692 4696 4695 4680 4682 4699 4683 4681 4695 4700 4699 4682 4699 4704 4684 4683 4704 4710 4709 4684 6395 6400 4686 4685 6389 6395 4685 4765 6400 6405 4688 4686 4688 4691 4690 4687 6405 6409 4691 4688 4690 4693 4692 4689 4691 4694 4693 4690 6409 6412 4694 4691 4693 4697 4696 4692 4694 4698 4697 4693 6412 6415 4698 4694 4696 4701 4700 4695 4697 4702 4701 4696 4698 4703 4702 4697 6415 6417 4703 4698 4700 4705 4704 4699 4701 4706 4705 4700 4702 4707 4706 4701 4703 4708 4707 4702 6417 6437 4708 4703 4705 4711 4710 4704 4706 4712 4711 4705 4816 4817 4738 4713 4738 4739 4721 4713 4815 4816 4713 4714 4713 4721 4720 4714 4814 4815 4714 4715 4714 4720 4719 4715 4813 4814 4715 4716 4715 4719 4718 4716 4716 4818 4812 4813 4717 4818 4716 4718 4718 4723 4722 4717 4719 4724 4723 4718 4720 4725 4724 4719 4721 4740 4725 4720 4739 4741 4740 4721 4723 4727 4726 4722 4724 4728 4727 4723 4725 4729 4728 4724 4740 4742 4729 4725 4727 4731 4730 4726 4728 4732 4731 4727 4729 4744 4732 4728 4742 4745 4744 4729 4731 4734 4733 4730 4732 4747 4734 4731 4744 4748 4747 4732 4734 4736 4735 4733 4747 4751 4736 4734 4736 4755 4737 4735 4751 4756 4755 4736 4755 4761 4760 4737 6447 6452 4739 4738 4817 6545 6447 4738 6452 6457 4741 4739 4741 4743 4742 4740 6457 6461 4743 4741 4743 4746 4745 4742 6461 6464 4746 4743 4745 4749 4748 4744 4746 4750 4749 4745 6464 6467 4750 4746 4748 4752 4751 4747 4749 4753 4752 4748 4750 4754 4753 4749 6467 6469 4754 4750 4752 4757 4756 4751 4753 4758 4757 4752 4754 4759 4758 4753 6469 6470 4759 4754 4756 4762 4761 4755 4757 4763 4762 4756 4758 4764 4763 4757 4759 4765 4764 4758 4759 6470 6389 4765 4877 6596 6497 4766 6497 6502 4791 4766 4876 4877 4766 4767 4766 4791 4774 4767 4875 4876 4767 4768 4767 4774 4773 4768 4768 4880 4874 4875 4772 4880 4768 4773 4850 4878 4770 4769 4771 4776 4775 4770 4878 4879 4771 4770 4772 4777 4776 4771 4879 4880 4772 4771 4773 4778 4777 4772 4774 4792 4778 4773 4791 4793 4792 4774 4776 4780 4779 4775 4777 4781 4780 4776 4778 4782 4781 4777 4792 4794 4782 4778 4780 4784 4783 4779 4781 4785 4784 4780 4782 4796 4785 4781 4794 4797 4796 4782 4784 4787 4786 4783 4785 4799 4787 4784 4796 4800 4799 4785 4787 4789 4788 4786 4799 4803 4789 4787 4789 4807 4790 4788 4803 4808 4807 4789 4807 4813 4812 4790 6502 6507 4793 4791 4793 4795 4794 4792 6507 6511 4795 4793 4795 4798 4797 4794 6511 6514 4798 4795 4797 4801 4800 4796 4798 4802 4801 4797 6514 6517 4802 4798 4800 4804 4803 4799 4801 4805 4804 4800 4802 4806 4805 4801 6517 6519 4806 4802 4804 4809 4808 4803 4805 4810 4809 4804 4806 4811 4810 4805 6519 6520 4811 4806 4808 4814 4813 4807 4809 4815 4814 4808 4810 4816 4815 4809 4811 4817 4816 4810 6520 6545 4817 4811 4939 6648 6548 4819 6548 6553 4851 4819 4938 4939 4819 4820 4819 4851 4826 4820 4820 4943 4937 4938 4825 4943 4820 4826 4822 4828 4827 4821 4912 4940 4822 4821 4823 4829 4828 4822 4940 4941 4823 4822 4824 4830 4829 4823 4941 4942 4824 4823 4825 4831 4830 4824 4942 4943 4825 4824 4826 4852 4831 4825 4851 4853 4852 4826 4828 4833 4832 4827 4829 4834 4833 4828 4830 4835 4834 4829 4831 4836 4835 4830 4852 4854 4836 4831 4833 4838 4837 4832 4834 4839 4838 4833 4835 4840 4839 4834 4836 4856 4840 4835 4854 4857 4856 4836 4838 4842 4841 4837 4839 4843 4842 4838 4840 4859 4843 4839 4856 4860 4859 4840 4842 4845 4844 4841 4843 4846 4845 4842 4859 4863 4846 4843 4845 4848 4847 4844 4846 4867 4848 4845 4863 4868 4867 4846 4848 4872 4849 4847 4867 4873 4872 4848 4872 4878 4850 4849 6553 6558 4853 4851 4853 4855 4854 4852 6558 6562 4855 4853 4855 4858 4857 4854 6562 6566 4858 4855 4857 4861 4860 4856 4858 4862 4861 4857 6566 6569 4862 4858 4860 4864 4863 4859 4861 4865 4864 4860 4862 4866 4865 4861 6569 6571 4866 4862 4864 4869 4868 4863 4865 4870 4869 4864 4866 4871 4870 4865 6571 6573 4871 4866 4868 4874 4873 4867 4869 4875 4874 4868 4870 4876 4875 4869 4871 4877 4876 4870 6573 6596 4877 4871 4873 4879 4878 4872 4874 4880 4879 4873 5001 6701 6600 4881 6600 6605 4913 4881 5000 5001 4881 4882 4881 4913 4888 4882 4882 5005 4999 5000 4887 5005 4882 4888 4884 4890 4889 4883 4973 5002 4884 4883 4885 4891 4890 4884 5002 5003 4885 4884 4886 4892 4891 4885 5003 5004 4886 4885 4887 4893 4892 4886 5004 5005 4887 4886 4888 4914 4893 4887 4913 4915 4914 4888 4890 4895 4894 4889 4891 4896 4895 4890 4892 4897 4896 4891 4893 4898 4897 4892 4914 4916 4898 4893 4895 4900 4899 4894 4896 4901 4900 4895 4897 4902 4901 4896 4898 4918 4902 4897 4916 4919 4918 4898 4900 4904 4903 4899 4901 4905 4904 4900 4902 4921 4905 4901 4918 4922 4921 4902 4904 4907 4906 4903 4905 4908 4907 4904 4921 4925 4908 4905 4907 4910 4909 4906 4908 4929 4910 4907 4925 4930 4929 4908 4910 4934 4911 4909 4929 4935 4934 4910 4934 4940 4912 4911 6605 6610 4915 4913 4915 4917 4916 4914 6610 6614 4917 4915 4917 4920 4919 4916 6614 6617 4920 4917 4919 4923 4922 4918 4920 4924 4923 4919 6617 6620 4924 4920 4922 4926 4925 4921 4923 4927 4926 4922 4924 4928 4927 4923 6620 6622 4928 4924 4926 4931 4930 4925 4927 4932 4931 4926 4928 4933 4932 4927 6622 6624 4933 4928 4930 4936 4935 4929 4931 4937 4936 4930 4932 4938 4937 4931 4933 4939 4938 4932 6624 6648 4939 4933 4935 4941 4940 4934 4936 4942 4941 4935 4937 4943 4942 4936 4944 5060 4974 4975 4975 4977 4976 4944 5059 5060 4944 4945 4944 4976 4954 4945 5058 5059 4945 4946 4945 4954 4953 4946 5057 5058 4946 4947 4946 4953 4952 4947 5056 5057 4947 4948 4947 4952 4951 4948 5034 5056 4948 4949 4948 4951 4950 4949 4951 4956 4955 4950 4952 4957 4956 4951 4953 4958 4957 4952 4954 4959 4958 4953 4976 4978 4959 4954 4956 4961 4960 4955 4957 4962 4961 4956 4958 4963 4962 4957 4959 4980 4963 4958 4978 4981 4980 4959 4961 4965 4964 4960 4962 4966 4965 4961 4963 4983 4966 4962 4980 4984 4983 4963 4965 4968 4967 4964 4966 4969 4968 4965 4983 4987 4969 4966 4968 4971 4970 4967 4969 4991 4971 4968 4987 4992 4991 4969 4971 4996 4972 4970 4991 4997 4996 4971 4996 5002 4973 4972 4974 5060 5054 5055 6653 6658 4975 4974 5055 6762 6653 4974 6658 6663 4977 4975 4977 4979 4978 4976 6663 6667 4979 4977 4979 4982 4981 4978 6667 6670 4982 4979 4981 4985 4984 4980 4982 4986 4985 4981 6670 6673 4986 4982 4984 4988 4987 4983 4985 4989 4988 4984 4986 4990 4989 4985 6673 6675 4990 4986 4988 4993 4992 4987 4989 4994 4993 4988 4990 4995 4994 4989 6675 6676 4995 4990 4992 4998 4997 4991 4993 4999 4998 4992 4994 5000 4999 4993 4995 5001 5000 4994 6676 6701 5001 4995 4997 5003 5002 4996 4998 5004 5003 4997 4999 5005 5004 4998 6707 6713 5006 5112 6713 6719 5035 5006 5111 5112 5006 5007 5006 5035 5015 5007 5110 5111 5007 5008 5007 5015 5014 5008 5109 5110 5008 5009 5008 5014 5013 5009 5108 5109 5009 5010 5009 5013 5012 5010 5010 5113 5087 5108 5011 5113 5010 5012 5012 5017 5016 5011 5013 5018 5017 5012 5014 5019 5018 5013 5015 5020 5019 5014 5035 5036 5020 5015 5017 5022 5021 5016 5018 5023 5022 5017 5019 5024 5023 5018 5020 5037 5024 5019 5036 5038 5037 5020 5022 5026 5025 5021 5023 5027 5026 5022 5024 5039 5027 5023 5037 5040 5039 5024 5026 5029 5028 5025 5027 5030 5029 5026 5039 5042 5030 5027 5029 5032 5031 5028 5030 5045 5032 5029 5042 5046 5045 5030 5032 5050 5033 5031 5045 5051 5050 5032 5050 5056 5034 5033 6719 6724 5036 5035 6724 6728 5038 5036 5038 5041 5040 5037 6728 6732 5041 5038 5040 5043 5042 5039 5041 5044 5043 5040 6732 6735 5044 5041 5043 5047 5046 5042 5044 5048 5047 5043 5044 6735 5049 5048 5046 5052 5051 5045 5047 5053 5052 5046 5048 5054 5053 5047 5049 5055 5054 5048 6737 6762 5055 5049 6736 6737 5049 6735 5051 5057 5056 5050 5052 5058 5057 5051 5053 5059 5058 5052 5054 5060 5059 5053 5163 6890 6773 5061 6773 6778 5088 5061 5162 5163 5061 5062 5061 5088 5069 5062 5161 5162 5062 5063 5062 5069 5068 5063 5160 5161 5063 5064 5063 5068 5067 5064 5064 5165 5159 5160 5066 5165 5064 5067 5066 5071 5070 5065 5164 5165 5066 5065 5067 5072 5071 5066 5068 5073 5072 5067 5069 5089 5073 5068 5088 5090 5089 5069 5071 5075 5074 5070 5072 5076 5075 5071 5073 5077 5076 5072 5089 5091 5077 5073 5075 5079 5078 5074 5076 5080 5079 5075 5077 5093 5080 5076 5091 5094 5093 5077 5079 5082 5081 5078 5080 5083 5082 5079 5093 5096 5083 5080 5082 5085 5084 5081 5083 5099 5085 5082 5096 5100 5099 5083 5085 5103 5086 5084 5099 5104 5103 5085 5103 5108 5087 5086 6778 6783 5090 5088 5090 5092 5091 5089 6783 6787 5092 5090 5092 5095 5094 5091 6787 6791 5095 5092 5094 5097 5096 5093 5095 5098 5097 5094 6791 6794 5098 5095 5097 5101 5100 5096 5098 5102 5101 5097 6794 6796 5102 5098 5100 5105 5104 5099 5101 5106 5105 5100 5102 5107 5106 5101 6796 6798 5107 5102 5104 5109 5108 5103 5105 5110 5109 5104 5106 5111 5110 5105 5107 5112 5111 5106 5107 6798 6707 5112 5216 6939 6833 5114 6833 6838 5140 5114 5215 5216 5114 5115 5114 5140 5120 5115 5115 5220 5214 5215 5119 5220 5115 5120 5117 5122 5121 5116 5217 5218 5117 5116 5118 5123 5122 5117 5218 5219 5118 5117 5119 5124 5123 5118 5219 5220 5119 5118 5120 5125 5124 5119 5140 5141 5125 5120 5122 5127 5126 5121 5123 5128 5127 5122 5124 5129 5128 5123 5125 5142 5129 5124 5141 5143 5142 5125 5127 5131 5130 5126 5128 5132 5131 5127 5129 5144 5132 5128 5142 5145 5144 5129 5131 5134 5133 5130 5132 5135 5134 5131 5144 5147 5135 5132 5134 5137 5136 5133 5135 5150 5137 5134 5147 5151 5150 5135 5137 5154 5138 5136 5150 5155 5154 5137 5154 5159 5139 5138 5159 5165 5164 5139 6838 6843 5141 5140 6843 6847 5143 5141 5143 5146 5145 5142 6847 6851 5146 5143 5145 5148 5147 5144 5146 5149 5148 5145 6851 6854 5149 5146 5148 5152 5151 5147 5149 5153 5152 5148 6854 6856 5153 5149 5151 5156 5155 5150 5152 5157 5156 5151 5153 5158 5157 5152 6856 6858 5158 5153 5155 5160 5159 5154 5156 5161 5160 5155 5157 5162 5161 5156 5158 5163 5162 5157 6858 6890 5163 5158 5275 5276 5193 5166 5193 5194 5174 5166 5274 5275 5166 5167 5166 5174 5173 5167 5273 5274 5167 5168 5167 5173 5172 5168 5168 5278 5272 5273 5171 5278 5168 5172 5170 5176 5175 5169 5221 5277 5170 5169 5171 5177 5176 5170 5277 5278 5171 5170 5172 5178 5177 5171 5173 5179 5178 5172 5174 5195 5179 5173 5194 5196 5195 5174 5176 5181 5180 5175 5177 5182 5181 5176 5178 5183 5182 5177 5179 5197 5183 5178 5195 5198 5197 5179 5181 5185 5184 5180 5182 5186 5185 5181 5183 5187 5186 5182 5197 5200 5187 5183 5185 5189 5188 5184 5186 5190 5189 5185 5187 5203 5190 5186 5200 5204 5203 5187 5190 5207 5191 5189 5203 5208 5207 5190 5207 5212 5192 5191 5212 5218 5217 5192 6896 6901 5194 5193 5276 6988 6896 5193 6901 6905 5196 5194 5196 5199 5198 5195 6905 6909 5199 5196 5198 5201 5200 5197 5199 5202 5201 5198 6909 6912 5202 5199 5201 5205 5204 5200 5202 5206 5205 5201 6912 6914 5206 5202 5204 5209 5208 5203 5205 5210 5209 5204 5206 5211 5210 5205 6914 6916 5211 5206 5208 5213 5212 5207 5209 5214 5213 5208 5210 5215 5214 5209 5211 5216 5215 5210 6916 6939 5216 5211 5213 5219 5218 5212 5214 5220 5219 5213 5271 5277 5221 5222 5224 5271 5222 5223 5225 5226 5224 5223 5266 5272 5271 5224 5227 5266 5224 5226 5228 5229 5226 5225 5229 5230 5227 5226 5262 5267 5266 5227 5258 5262 5227 5230 5231 5232 5229 5228 5232 5233 5230 5229 5234 5258 5230 5233 5235 5236 5232 5231 5236 5237 5233 5232 5237 5238 5234 5233 5255 5259 5258 5234 5239 5255 5234 5238 5240 5241 5236 5235 5241 5242 5237 5236 5242 5243 5238 5237 5243 5244 5239 5238 5253 5256 5255 5239 5245 5253 5239 5244 5241 5250 5249 5242 5242 5249 5248 5243 5243 5248 5247 5244 5244 5247 5246 5245 5252 5254 5253 5245 5251 5252 5245 5246 5251 6958 6954 5252 5252 6954 6950 5254 5254 5257 5256 5253 5254 6950 6947 5257 5256 5260 5259 5255 5257 5261 5260 5256 5257 6947 6945 5261 5259 5263 5262 5258 5260 5264 5263 5259 5261 5265 5264 5260 5261 6945 6943 5265 5263 5268 5267 5262 5264 5269 5268 5263 5265 5270 5269 5264 5265 6943 6942 5270 5267 5273 5272 5266 5268 5274 5273 5267 5269 5275 5274 5268 5270 5276 5275 5269 6942 6988 5276 5270 5272 5278 5277 5271 5280 5285 5284 5279 5373 5374 5280 5279 5281 5286 5285 5280 5374 5375 5281 5280 5282 5287 5286 5281 5375 5376 5282 5281 5283 5288 5287 5282 5376 5377 5283 5282 5283 5322 5321 5288 5377 5378 5322 5283 5285 5290 5289 5284 5286 5291 5290 5285 5287 5292 5291 5286 5288 5319 5292 5287 5288 5321 5320 5319 5290 5294 5293 5289 5291 5295 5294 5290 5292 5316 5295 5291 5292 5319 5317 5316 5294 5297 5296 5293 5295 5312 5297 5294 5295 5316 5313 5312 5297 5307 5298 5296 5297 5312 5308 5307 5298 5307 5302 5299 5299 5302 5301 5300 5301 6959 6958 5300 5301 6966 6960 6959 5303 6966 5301 5302 5307 5308 5303 5302 6965 6966 5303 5304 5308 5309 5304 5303 6964 6965 5304 5305 5309 5310 5305 5304 6963 6964 5305 5306 5310 5311 5306 5305 7010 8722 6963 5306 7009 7010 5306 5311 5312 5313 5309 5308 5313 5314 5310 5309 5314 5315 5311 5310 7007 7009 5311 5315 5316 5317 5314 5313 5317 5318 5315 5314 7004 7007 5315 5318 5319 5320 5318 5317 7000 7004 5318 5320 6995 7000 5320 5321 6989 6995 5321 5322 5378 7071 6989 5322 5324 5331 5330 5323 5406 5426 5324 5323 5325 5332 5331 5324 5426 5427 5325 5324 5326 5333 5332 5325 5427 5428 5326 5325 5327 5334 5333 5326 5428 5429 5327 5326 5328 5335 5334 5327 5429 5430 5328 5327 5329 5354 5335 5328 5430 5431 5329 5328 7033 7035 5354 5329 5431 7098 7033 5329 5331 5337 5336 5330 5332 5338 5337 5331 5333 5339 5338 5332 5334 5340 5339 5333 5335 5355 5340 5334 5354 5356 5355 5335 5337 5342 5341 5336 5338 5343 5342 5337 5339 5344 5343 5338 5340 5357 5344 5339 5355 5358 5357 5340 5342 5346 5345 5341 5343 5347 5346 5342 5344 5360 5347 5343 5357 5361 5360 5344 5346 5349 5348 5345 5347 5350 5349 5346 5360 5364 5350 5347 5349 5352 5351 5348 5350 5368 5352 5349 5364 5369 5368 5350 5352 5373 5353 5351 5368 5374 5373 5352 7035 7040 5356 5354 5356 5359 5358 5355 7040 7045 5359 5356 5358 5362 5361 5357 5359 5363 5362 5358 7045 7049 5363 5359 5361 5365 5364 5360 5362 5366 5365 5361 5363 5367 5366 5362 7049 7052 5367 5363 5365 5370 5369 5364 5366 5371 5370 5365 5367 5372 5371 5366 7052 7054 5372 5367 5369 5375 5374 5368 5370 5376 5375 5369 5371 5377 5376 5370 5372 5378 5377 5371 7054 7071 5378 5372 5380 5384 5383 5379 5458 5475 5380 5379 5381 5385 5384 5380 5475 5476 5381 5380 5382 5386 5385 5381 5476 5477 5382 5381 5382 5480 5387 5386 5478 5480 5382 5477 5384 5390 5389 5383 5385 5391 5390 5384 5386 5392 5391 5385 5387 5393 5392 5386 5388 5408 5393 5387 5480 5481 5388 5387 5407 5409 5408 5388 5481 5482 5407 5388 5390 5395 5394 5389 5391 5396 5395 5390 5392 5397 5396 5391 5393 5410 5397 5392 5408 5411 5410 5393 5395 5399 5398 5394 5396 5400 5399 5395 5397 5413 5400 5396 5410 5414 5413 5397 5399 5402 5401 5398 5400 5403 5402 5399 5413 5417 5403 5400 5402 5405 5404 5401 5403 5421 5405 5402 5417 5422 5421 5403 5405 5426 5406 5404 5421 5427 5426 5405 7077 7083 5409 5407 5482 7173 7077 5407 5409 5412 5411 5408 7083 7088 5412 5409 5411 5415 5414 5410 5412 5416 5415 5411 7088 7092 5416 5412 5414 5418 5417 5413 5415 5419 5418 5414 5416 5420 5419 5415 7092 7095 5420 5416 5418 5423 5422 5417 5419 5424 5423 5418 5420 5425 5424 5419 7095 7097 5425 5420 5422 5428 5427 5421 5423 5429 5428 5422 5424 5430 5429 5423 5425 5431 5430 5424 7097 7098 5431 5425 5433 5439 5438 5432 5528 5529 5433 5432 5434 5440 5439 5433 5529 5530 5434 5433 5435 5441 5440 5434 5530 5531 5435 5434 5436 5442 5441 5435 5531 5532 5436 5435 5437 5459 5442 5436 5532 5533 5437 5436 7123 7124 5459 5437 5533 7206 7123 5437 5439 5444 5443 5438 5440 5445 5444 5439 5441 5446 5445 5440 5442 5447 5446 5441 5459 5460 5447 5442 5444 5449 5448 5443 5445 5450 5449 5444 5446 5451 5450 5445 5447 5461 5451 5446 5460 5462 5461 5447 5449 5453 5452 5448 5450 5454 5453 5449 5451 5463 5454 5450 5461 5464 5463 5451 5453 5456 5455 5452 5454 5466 5456 5453 5463 5467 5466 5454 5456 5470 5457 5455 5466 5471 5470 5456 5470 5475 5458 5457 7124 7130 5460 5459 7130 7135 5462 5460 5462 5465 5464 5461 7135 7140 5465 5462 5464 5468 5467 5463 5465 5469 5468 5464 7140 7144 5469 5465 5467 5472 5471 5466 5468 5473 5472 5467 5469 5474 5473 5468 7144 7147 5474 5469 5471 5476 5475 5470 5472 5477 5476 5471 5473 5478 5477 5472 5474 5479 5478 5473 7147 7149 5479 5474 5479 5481 5480 5478 5479 7149 5482 5481 7167 7173 5482 7149 5484 5487 5486 5483 5581 5582 5484 5483 5485 5488 5487 5484 5582 5583 5485 5484 5485 5587 5489 5488 5584 5587 5485 5583 5487 5492 5491 5486 5488 5493 5492 5487 5489 5494 5493 5488 5490 5495 5494 5489 5587 5588 5490 5489 5508 5509 5495 5490 5588 5589 5508 5490 5492 5497 5496 5491 5493 5498 5497 5492 5494 5499 5498 5493 5495 5510 5499 5494 5509 5511 5510 5495 5497 5501 5500 5496 5498 5502 5501 5497 5499 5512 5502 5498 5510 5513 5512 5499 5501 5504 5503 5500 5502 5515 5504 5501 5512 5516 5515 5502 5504 5506 5505 5503 5515 5519 5506 5504 5506 5523 5507 5505 5519 5524 5523 5506 5523 5529 5528 5507 7179 7185 5509 5508 5589 7289 7179 5508 7185 7190 5511 5509 5511 5514 5513 5510 7190 7195 5514 5511 5513 5517 5516 5512 5514 5518 5517 5513 7195 7199 5518 5514 5516 5520 5519 5515 5517 5521 5520 5516 5518 5522 5521 5517 7199 7202 5522 5518 5520 5525 5524 5519 5521 5526 5525 5520 5522 5527 5526 5521 7202 7204 5527 5522 5524 5530 5529 5523 5525 5531 5530 5524 5526 5532 5531 5525 5527 5533 5532 5526 7204 7206 5533 5527 5535 5537 5536 5534 5618 5640 5535 5534 5535 5646 5538 5537 5641 5646 5535 5640 5537 5543 5542 5536 5538 5544 5543 5537 5539 5545 5544 5538 5646 5647 5539 5538 5540 5546 5545 5539 5647 5648 5540 5539 5541 5547 5546 5540 5648 5649 5541 5540 5561 5562 5547 5541 5649 5650 5561 5541 5543 5549 5548 5542 5544 5550 5549 5543 5545 5551 5550 5544 5546 5552 5551 5545 5547 5563 5552 5546 5562 5564 5563 5547 5550 5554 5553 5549 5551 5555 5554 5550 5552 5565 5555 5551 5563 5566 5565 5552 5554 5557 5556 5553 5555 5568 5557 5554 5565 5569 5568 5555 5557 5559 5558 5556 5568 5572 5559 5557 5559 5576 5560 5558 5572 5577 5576 5559 5576 5582 5581 5560 7241 7247 5562 5561 5650 7344 7241 5561 7247 7252 5564 5562 5564 5567 5566 5563 7252 7256 5567 5564 5566 5570 5569 5565 5567 5571 5570 5566 7256 7260 5571 5567 5569 5573 5572 5568 5570 5574 5573 5569 5571 5575 5574 5570 7260 7263 5575 5571 5573 5578 5577 5572 5574 5579 5578 5573 5575 5580 5579 5574 7263 7265 5580 5575 5577 5583 5582 5576 5578 5584 5583 5577 5579 5585 5584 5578 5580 5586 5585 5579 7265 7267 5586 5580 5585 5588 5587 5584 5586 5589 5588 5585 7267 7289 5589 5586 5591 5597 5596 5590 5706 5707 5591 5590 5592 5598 5597 5591 5707 5708 5592 5591 5593 5599 5598 5592 5708 5709 5593 5592 5594 5600 5599 5593 5709 5710 5594 5593 5595 5620 5600 5594 5710 5711 5595 5594 5619 5621 5620 5595 5711 5712 5619 5595 5597 5602 5601 5596 5598 5603 5602 5597 5599 5604 5603 5598 5600 5605 5604 5599 5620 5622 5605 5600 5602 5607 5606 5601 5603 5608 5607 5602 5604 5609 5608 5603 5605 5624 5609 5604 5622 5625 5624 5605 5607 5611 5610 5606 5608 5612 5611 5607 5609 5627 5612 5608 5624 5628 5627 5609 5611 5614 5613 5610 5612 5615 5614 5611 5627 5631 5615 5612 5614 5617 5616 5613 5615 5635 5617 5614 5631 5636 5635 5615 5617 5640 5618 5616 5635 5641 5640 5617 7296 7302 5621 5619 5712 7399 7296 5619 5621 5623 5622 5620 7302 7307 5623 5621 5623 5626 5625 5622 7307 7311 5626 5623 5625 5629 5628 5624 5626 5630 5629 5625 7311 7314 5630 5626 5628 5632 5631 5627 5629 5633 5632 5628 5630 5634 5633 5629 7314 7317 5634 5630 5632 5637 5636 5631 5633 5638 5637 5632 5634 5639 5638 5633 7317 7319 5639 5634 5636 5642 5641 5635 5637 5643 5642 5636 5638 5644 5643 5637 5639 5645 5644 5638 7319 7320 5645 5639 5642 5647 5646 5641 5643 5648 5647 5642 5644 5649 5648 5643 5645 5650 5649 5644 7320 7344 5650 5645 5652 5658 5657 5651 5761 5762 5652 5651 5653 5659 5658 5652 5762 5763 5653 5652 5654 5660 5659 5653 5763 5764 5654 5653 5655 5661 5660 5654 5764 5765 5655 5654 5656 5679 5661 5655 5765 5766 5656 5655 5656 7350 5680 5679 5766 7436 7350 5656 5658 5663 5662 5657 5659 5664 5663 5658 5660 5665 5664 5659 5661 5666 5665 5660 5679 5681 5666 5661 5663 5668 5667 5662 5664 5669 5668 5663 5665 5670 5669 5664 5666 5683 5670 5665 5681 5684 5683 5666 5668 5672 5671 5667 5669 5673 5672 5668 5670 5686 5673 5669 5683 5687 5686 5670 5672 5675 5674 5671 5673 5690 5675 5672 5686 5691 5690 5673 5675 5677 5676 5674 5690 5695 5677 5675 5677 5700 5678 5676 5695 5701 5700 5677 5700 5707 5706 5678 5680 5682 5681 5679 7356 7361 5682 5680 7351 7356 5680 7350 5682 5685 5684 5681 7361 7365 5685 5682 5684 5688 5687 5683 5685 5689 5688 5684 7365 7368 5689 5685 5687 5692 5691 5686 5688 5693 5692 5687 5689 5694 5693 5688 7368 7371 5694 5689 5691 5696 5695 5690 5692 5697 5696 5691 5693 5698 5697 5692 5694 5699 5698 5693 7371 7373 5699 5694 5696 5702 5701 5695 5697 5703 5702 5696 5698 5704 5703 5697 5699 5705 5704 5698 7373 7374 5705 5699 5701 5708 5707 5700 5702 5709 5708 5701 5703 5710 5709 5702 5704 5711 5710 5703 5705 5712 5711 5704 7374 7399 5712 5705 5714 5720 5719 5713 5815 5816 5714 5713 5715 5721 5720 5714 5816 5817 5715 5714 5716 5722 5721 5715 5817 5818 5716 5715 5717 5723 5722 5716 5818 5819 5717 5716 5718 5740 5723 5717 5819 5820 5718 5717 7405 7411 5740 5718 5820 7499 7405 5718 5720 5725 5724 5719 5721 5726 5725 5720 5722 5727 5726 5721 5723 5741 5727 5722 5740 5742 5741 5723 5725 5729 5728 5724 5726 5730 5729 5725 5727 5731 5730 5726 5741 5743 5731 5727 5729 5733 5732 5728 5730 5734 5733 5729 5731 5745 5734 5730 5743 5746 5745 5731 5733 5736 5735 5732 5734 5748 5736 5733 5745 5749 5748 5734 5736 5738 5737 5735 5748 5752 5738 5736 5738 5756 5739 5737 5752 5757 5756 5738 5756 5762 5761 5739 7411 7417 5742 5740 5742 5744 5743 5741 7417 7422 5744 5742 5744 5747 5746 5743 7422 7426 5747 5744 5746 5750 5749 5745 5747 5751 5750 5746 7426 7430 5751 5747 5749 5753 5752 5748 5750 5754 5753 5749 5751 5755 5754 5750 7430 7433 5755 5751 5753 5758 5757 5752 5754 5759 5758 5753 5755 5760 5759 5754 7433 7435 5760 5755 5757 5763 5762 5756 5758 5764 5763 5757 5759 5765 5764 5758 5760 5766 5765 5759 7435 7436 5766 5760 5768 5774 5773 5767 5869 5870 5768 5767 5769 5775 5774 5768 5870 5871 5769 5768 5770 5776 5775 5769 5871 5872 5770 5769 5771 5777 5776 5770 5872 5873 5771 5770 5772 5794 5777 5771 5873 5874 5772 5771 7468 7474 5794 5772 5874 7562 7468 5772 5774 5779 5778 5773 5775 5780 5779 5774 5776 5781 5780 5775 5777 5795 5781 5776 5794 5796 5795 5777 5779 5783 5782 5778 5780 5784 5783 5779 5781 5785 5784 5780 5795 5797 5785 5781 5783 5787 5786 5782 5784 5788 5787 5783 5785 5799 5788 5784 5797 5800 5799 5785 5787 5790 5789 5786 5788 5802 5790 5787 5799 5803 5802 5788 5790 5792 5791 5789 5802 5806 5792 5790 5792 5810 5793 5791 5806 5811 5810 5792 5810 5816 5815 5793 7474 7480 5796 5794 5796 5798 5797 5795 7480 7485 5798 5796 5798 5801 5800 5797 7485 7489 5801 5798 5800 5804 5803 5799 5801 5805 5804 5800 7489 7493 5805 5801 5803 5807 5806 5802 5804 5808 5807 5803 5805 5809 5808 5804 7493 7496 5809 5805 5807 5812 5811 5806 5808 5813 5812 5807 5809 5814 5813 5808 7496 7498 5814 5809 5811 5817 5816 5810 5812 5818 5817 5811 5813 5819 5818 5812 5814 5820 5819 5813 7498 7499 5820 5814 5822 5828 5827 5821 5919 5920 5822 5821 5823 5829 5828 5822 5920 5921 5823 5822 5824 5830 5829 5823 5921 5922 5824 5823 5825 5831 5830 5824 5922 5923 5825 5824 5826 5849 5831 5825 5923 5924 5826 5825 7531 7537 5849 5826 5924 7619 7531 5826 5828 5833 5832 5827 5829 5834 5833 5828 5830 5835 5834 5829 5831 5836 5835 5830 5849 5850 5836 5831 5833 5838 5837 5832 5834 5839 5838 5833 5835 5840 5839 5834 5836 5851 5840 5835 5850 5852 5851 5836 5838 5842 5841 5837 5839 5843 5842 5838 5840 5853 5843 5839 5851 5854 5853 5840 5842 5845 5844 5841 5843 5856 5845 5842 5853 5857 5856 5843 5845 5847 5846 5844 5856 5860 5847 5845 5847 5864 5848 5846 5860 5865 5864 5847 5864 5870 5869 5848 7537 7543 5850 5849 7543 7548 5852 5850 5852 5855 5854 5851 7548 7552 5855 5852 5854 5858 5857 5853 5855 5859 5858 5854 7552 7556 5859 5855 5857 5861 5860 5856 5858 5862 5861 5857 5859 5863 5862 5858 7556 7559 5863 5859 5861 5866 5865 5860 5862 5867 5866 5861 5863 5868 5867 5862 7559 7561 5868 5863 5865 5871 5870 5864 5866 5872 5871 5865 5867 5873 5872 5866 5868 5874 5873 5867 7561 7562 5874 5868 5876 5878 5877 5875 5967 5968 5876 5875 5876 5973 5879 5878 5969 5973 5876 5968 5878 5883 5882 5877 5879 5884 5883 5878 5880 5885 5884 5879 5973 5974 5880 5879 5881 5886 5885 5880 5974 5975 5881 5880 5899 5900 5886 5881 5975 5976 5899 5881 5883 5888 5887 5882 5884 5889 5888 5883 5885 5890 5889 5884 5886 5901 5890 5885 5900 5902 5901 5886 5888 5892 5891 5887 5889 5893 5892 5888 5890 5903 5893 5889 5901 5904 5903 5890 5892 5895 5894 5891 5893 5906 5895 5892 5903 5907 5906 5893 5895 5897 5896 5894 5906 5910 5897 5895 5897 5914 5898 5896 5910 5915 5914 5897 5914 5920 5919 5898 7594 7600 5900 5899 5976 7691 7594 5899 7600 7605 5902 5900 5902 5905 5904 5901 7605 7609 5905 5902 5904 5908 5907 5903 5905 5909 5908 5904 7609 7613 5909 5905 5907 5911 5910 5906 5908 5912 5911 5907 5909 5913 5912 5908 7613 7616 5913 5909 5911 5916 5915 5910 5912 5917 5916 5911 5913 5918 5917 5912 7616 7618 5918 5913 5915 5921 5920 5914 5916 5922 5921 5915 5917 5923 5922 5916 5918 5924 5923 5917 7618 7619 5924 5918 5926 5932 5931 5925 6025 6026 5926 5925 5927 5933 5932 5926 6026 6027 5927 5926 5928 5934 5933 5927 6027 6028 5928 5927 5929 5935 5934 5928 6028 6029 5929 5928 5930 5949 5935 5929 6029 6030 5930 5929 7643 7649 5949 5930 6030 7752 7643 5930 5932 5937 5936 5931 5933 5938 5937 5932 5934 5939 5938 5933 5935 5950 5939 5934 5949 5951 5950 5935 5937 5941 5940 5936 5938 5942 5941 5937 5939 5952 5942 5938 5950 5953 5952 5939 5941 5944 5943 5940 5942 5945 5944 5941 5952 5955 5945 5942 5944 5947 5946 5943 5945 5958 5947 5944 5955 5959 5958 5945 5947 5962 5948 5946 5958 5963 5962 5947 5962 5968 5967 5948 7649 7654 5951 5949 5951 5954 5953 5950 7654 7659 5954 5951 5953 5956 5955 5952 5954 5957 5956 5953 7659 7663 5957 5954 5956 5960 5959 5955 5957 5961 5960 5956 7663 7666 5961 5957 5959 5964 5963 5958 5960 5965 5964 5959 5961 5966 5965 5960 7666 7668 5966 5961 5963 5969 5968 5962 5964 5970 5969 5963 5965 5971 5970 5964 5966 5972 5971 5965 7668 7670 5972 5966 5970 5974 5973 5969 5971 5975 5974 5970 5972 5976 5975 5971 7670 7691 5976 5972 5978 5984 5983 5977 6073 6074 5978 5977 5979 5985 5984 5978 6074 6075 5979 5978 5980 5986 5985 5979 6075 6076 5980 5979 5981 5987 5986 5980 6076 6077 5981 5980 5982 6003 5987 5981 6077 6078 5982 5981 7697 7703 6003 5982 6078 7785 7697 5982 5984 5989 5988 5983 5985 5990 5989 5984 5986 5991 5990 5985 5987 6004 5991 5986 6003 6005 6004 5987 5989 5993 5992 5988 5990 5994 5993 5989 5991 5995 5994 5990 6004 6006 5995 5991 5993 5997 5996 5992 5994 5998 5997 5993 5995 6008 5998 5994 6006 6009 6008 5995 5997 6000 5999 5996 5998 6011 6000 5997 6008 6012 6011 5998 6000 6015 6001 5999 6011 6016 6015 6000 6015 6020 6002 6001 6020 6026 6025 6002 7703 7709 6005 6003 6005 6007 6006 6004 7709 7714 6007 6005 6007 6010 6009 6006 7714 7718 6010 6007 6009 6013 6012 6008 6010 6014 6013 6009 7718 7721 6014 6010 6012 6017 6016 6011 6013 6018 6017 6012 6014 6019 6018 6013 7721 7724 6019 6014 6016 6021 6020 6015 6017 6022 6021 6016 6018 6023 6022 6017 6019 6024 6023 6018 7724 7726 6024 6019 6021 6027 6026 6020 6022 6028 6027 6021 6023 6029 6028 6022 6024 6030 6029 6023 7726 7752 6030 6024 6032 6038 6037 6031 6129 6130 6032 6031 6033 6039 6038 6032 6130 6131 6033 6032 6034 6040 6039 6033 6131 6132 6034 6033 6035 6041 6040 6034 6132 6133 6035 6034 6036 6055 6041 6035 6133 6134 6036 6035 7758 7764 6055 6036 6134 7834 7758 6036 6038 6043 6042 6037 6039 6044 6043 6038 6040 6045 6044 6039 6041 6056 6045 6040 6055 6057 6056 6041 6043 6047 6046 6042 6044 6048 6047 6043 6045 6058 6048 6044 6056 6059 6058 6045 6047 6050 6049 6046 6048 6051 6050 6047 6058 6061 6051 6048 6050 6053 6052 6049 6051 6064 6053 6050 6061 6065 6064 6051 6053 6068 6054 6052 6064 6069 6068 6053 6068 6074 6073 6054 7764 7769 6057 6055 6057 6060 6059 6056 7769 7774 6060 6057 6059 6062 6061 6058 6060 6063 6062 6059 7774 7778 6063 6060 6062 6066 6065 6061 6063 6067 6066 6062 7778 7781 6067 6063 6065 6070 6069 6064 6066 6071 6070 6065 6067 6072 6071 6066 7781 7783 6072 6067 6069 6075 6074 6068 6070 6076 6075 6069 6071 6077 6076 6070 6072 6078 6077 6071 7783 7785 6078 6072 6079 6178 6082 6081 6173 6178 6079 6172 6081 6087 6086 6080 6082 6088 6087 6081 6083 6089 6088 6082 6178 6179 6083 6082 6084 6090 6089 6083 6179 6180 6084 6083 6085 6106 6090 6084 6180 6181 6085 6084 6105 6107 6106 6085 6181 6182 6105 6085 6087 6092 6091 6086 6088 6093 6092 6087 6089 6094 6093 6088 6090 6108 6094 6089 6106 6109 6108 6090 6092 6096 6095 6091 6093 6097 6096 6092 6094 6098 6097 6093 6108 6111 6098 6094 6096 6100 6099 6095 6097 6101 6100 6096 6098 6114 6101 6097 6111 6115 6114 6098 6100 6103 6102 6099 6101 6118 6103 6100 6114 6119 6118 6101 6103 6123 6104 6102 6118 6124 6123 6103 6123 6130 6129 6104 7814 7819 6107 6105 6182 7909 7814 6105 6107 6110 6109 6106 7819 7824 6110 6107 6109 6112 6111 6108 6110 6113 6112 6109 7824 7828 6113 6110 6112 6116 6115 6111 6113 6117 6116 6112 7828 7831 6117 6113 6115 6120 6119 6114 6116 6121 6120 6115 6117 6122 6121 6116 7831 7833 6122 6117 6119 6125 6124 6118 6120 6126 6125 6119 6121 6127 6126 6120 6122 6128 6127 6121 7833 7851 6128 6122 6124 6131 6130 6123 6125 6132 6131 6124 6126 6133 6132 6125 6127 6134 6133 6126 6128 7834 6134 6127 7851 7857 7834 6128 6136 6142 6141 6135 6207 6228 6136 6135 6137 6143 6142 6136 6228 6229 6137 6136 6138 6144 6143 6137 6229 6230 6138 6137 6139 6145 6144 6138 6230 6231 6139 6138 6140 6157 6145 6139 6231 6232 6140 6139 6156 7868 6157 6140 6232 6233 6156 6140 6142 6147 6146 6141 6143 6148 6147 6142 6144 6149 6148 6143 6145 6158 6149 6144 6157 6159 6158 6145 6147 6151 6150 6146 6148 6152 6151 6147 6149 6160 6152 6148 6158 6161 6160 6149 6151 6154 6153 6150 6152 6163 6154 6151 6160 6164 6163 6152 6154 6167 6155 6153 6163 6168 6167 6154 6167 6173 6172 6155 7863 7869 7868 6156 6233 7958 7863 6156 7868 7873 6159 6157 6159 6162 6161 6158 7873 7877 6162 6159 6161 6165 6164 6160 6162 6166 6165 6161 7877 7880 6166 6162 6164 6169 6168 6163 6165 6170 6169 6164 6166 6171 6170 6165 7880 7883 6171 6166 6168 6174 6173 6167 6169 6175 6174 6168 6170 6176 6175 6169 6171 6177 6176 6170 7883 7885 6177 6171 6174 6179 6178 6173 6175 6180 6179 6174 6176 6181 6180 6175 6177 6182 6181 6176 7885 7909 6182 6177 6184 6190 6189 6183 6260 6282 6184 6183 6185 6191 6190 6184 6282 6283 6185 6184 6186 6192 6191 6185 6283 6284 6186 6185 6187 6193 6192 6186 6284 6285 6187 6186 6188 6208 6193 6187 6285 6286 6188 6187 7915 7921 6208 6188 6286 7988 7915 6188 6190 6195 6194 6189 6191 6196 6195 6190 6192 6197 6196 6191 6193 6209 6197 6192 6208 6210 6209 6193 6195 6199 6198 6194 6196 6200 6199 6195 6197 6211 6200 6196 6209 6212 6211 6197 6199 6202 6201 6198 6200 6214 6202 6199 6211 6215 6214 6200 6202 6218 6204 6201 6214 6219 6218 6202 6204 6206 6205 6203 6218 6223 6206 6204 6206 6228 6207 6205 6223 6229 6228 6206 7921 7926 6210 6208 6210 6213 6212 6209 7926 7930 6213 6210 6212 6216 6215 6211 6213 6217 6216 6212 7930 7933 6217 6213 6215 6220 6219 6214 6216 6221 6220 6215 6217 6222 6221 6216 7933 7935 6222 6217 6219 6224 6223 6218 6220 6225 6224 6219 6221 6226 6225 6220 6222 6227 6226 6221 7935 7937 6227 6222 6224 6230 6229 6223 6225 6231 6230 6224 6226 6232 6231 6225 6227 6233 6232 6226 7937 7958 6233 6227 6235 6241 6240 6234 6236 6242 6241 6235 6332 6333 6236 6235 6237 6243 6242 6236 6333 6334 6237 6236 6238 6244 6243 6237 6334 6335 6238 6237 6239 6262 6244 6238 6335 6336 6239 6238 6261 6263 6262 6239 6336 6337 6261 6239 6241 6246 6245 6240 6242 6247 6246 6241 6243 6248 6247 6242 6244 6249 6248 6243 6262 6264 6249 6244 6246 6251 6250 6245 6247 6252 6251 6246 6248 6253 6252 6247 6249 6266 6253 6248 6264 6267 6266 6249 6251 6255 6254 6250 6252 6256 6255 6251 6253 6269 6256 6252 6266 6270 6269 6253 6255 6258 6257 6254 6256 6273 6258 6255 6269 6274 6273 6256 6258 6277 6259 6257 6273 6278 6277 6258 6277 6282 6260 6259 7967 7972 6263 6261 6337 8066 7967 6261 6263 6265 6264 6262 7972 7976 6265 6263 6265 6268 6267 6264 7976 7980 6268 6265 6267 6271 6270 6266 6268 6272 6271 6267 7980 7983 6272 6268 6270 6275 6274 6269 6271 6276 6275 6270 6272 7985 6276 6271 7983 7986 7985 6272 6274 6279 6278 6273 6275 6280 6279 6274 6276 6281 6280 6275 7985 7987 6281 6276 6278 6283 6282 6277 6279 6284 6283 6278 6280 6285 6284 6279 6281 6286 6285 6280 7987 7988 6286 6281 6385 8100 8018 6287 8018 8024 6311 6287 6384 6385 6287 6288 6287 6311 6294 6288 6383 6384 6288 6289 6288 6294 6293 6289 6289 6388 6382 6383 6292 6388 6289 6293 6291 6296 6295 6290 6386 6387 6291 6290 6292 6297 6296 6291 6387 6388 6292 6291 6293 6298 6297 6292 6294 6312 6298 6293 6311 6313 6312 6294 6296 6300 6299 6295 6297 6301 6300 6296 6298 6302 6301 6297 6312 6314 6302 6298 6300 6304 6303 6299 6301 6305 6304 6300 6302 6316 6305 6301 6314 6317 6316 6302 6304 6307 6306 6303 6305 6319 6307 6304 6316 6320 6319 6305 6307 6309 6308 6306 6319 6323 6309 6307 6309 6327 6310 6308 6323 6328 6327 6309 6327 6333 6332 6310 8024 8029 6313 6311 6313 6315 6314 6312 8029 8033 6315 6313 6315 6318 6317 6314 8033 8037 6318 6315 6317 6321 6320 6316 6318 6322 6321 6317 8037 8040 6322 6318 6320 6324 6323 6319 6321 6325 6324 6320 6322 6326 6325 6321 8040 8042 6326 6322 6324 6329 6328 6323 6325 6330 6329 6324 6326 6331 6330 6325 8042 8043 6331 6326 6328 6334 6333 6327 6329 6335 6334 6328 6330 6336 6335 6329 6331 6337 6336 6330 8043 8066 6337 6331 6339 6345 6344 6338 6437 6438 6339 6338 6340 6346 6345 6339 6438 6439 6340 6339 6341 6347 6346 6340 6439 6440 6341 6340 6342 6348 6347 6341 6440 6441 6342 6341 6343 6364 6348 6342 6441 6442 6343 6342 8075 8081 6364 6343 8069 8075 6343 6442 6345 6350 6349 6344 6346 6351 6350 6345 6347 6352 6351 6346 6348 6365 6352 6347 6364 6366 6365 6348 6350 6354 6353 6349 6351 6355 6354 6350 6352 6356 6355 6351 6365 6367 6356 6352 6354 6358 6357 6353 6355 6359 6358 6354 6356 6369 6359 6355 6367 6370 6369 6356 6358 6361 6360 6357 6359 6372 6361 6358 6369 6373 6372 6359 6361 6376 6362 6360 6372 6377 6376 6361 6376 6381 6363 6362 6381 6387 6386 6363 8081 8086 6366 6364 6366 6368 6367 6365 8086 8090 6368 6366 6368 6371 6370 6367 8090 8094 6371 6368 6370 6374 6373 6369 6371 6375 6374 6370 8094 8097 6375 6371 6373 6378 6377 6372 6374 6379 6378 6373 6375 6380 6379 6374 8097 8099 6380 6375 6377 6382 6381 6376 6378 6383 6382 6377 6379 6384 6383 6378 6380 6385 6384 6379 8099 8100 6385 6380 6382 6388 6387 6381 6390 6396 6395 6389 6470 6490 6390 6389 6391 6397 6396 6390 6490 6491 6391 6390 6392 6398 6397 6391 6491 6492 6392 6391 6393 6399 6398 6392 6492 6493 6393 6392 6394 6418 6399 6393 6493 6494 6394 6393 8133 8139 6418 6394 6494 8218 8133 6394 6396 6401 6400 6395 6397 6402 6401 6396 6398 6403 6402 6397 6399 6404 6403 6398 6418 6419 6404 6399 6401 6406 6405 6400 6402 6407 6406 6401 6403 6408 6407 6402 6404 6420 6408 6403 6419 6421 6420 6404 6406 6410 6409 6405 6407 6411 6410 6406 6408 6422 6411 6407 6420 6423 6422 6408 6410 6413 6412 6409 6411 6414 6413 6410 6422 6425 6414 6411 6413 6416 6415 6412 6414 6428 6416 6413 6425 6429 6428 6414 6416 6432 6417 6415 6428 6433 6432 6416 6432 6438 6437 6417 8139 8144 6419 6418 8144 8149 6421 6419 6421 6424 6423 6420 8149 8153 6424 6421 6423 6426 6425 6422 6424 6427 6426 6423 8153 8156 6427 6424 6426 6430 6429 6425 6427 6431 6430 6426 8156 8158 6431 6427 6429 6434 6433 6428 6430 6435 6434 6429 6431 6436 6435 6430 8158 8160 6436 6431 6433 6439 6438 6432 6434 6440 6439 6433 6435 6441 6440 6434 6436 6442 6441 6435 6436 8160 8069 6442 6544 8280 8189 6443 8189 8195 6471 6443 6543 6544 6443 6444 6443 6471 6451 6444 6542 6543 6444 6445 6444 6451 6450 6445 6541 6542 6445 6446 6445 6450 6449 6446 6446 6546 6540 6541 6448 6546 6446 6449 6448 6453 6452 6447 6545 6546 6448 6447 6449 6454 6453 6448 6450 6455 6454 6449 6451 6456 6455 6450 6471 6472 6456 6451 6453 6458 6457 6452 6454 6459 6458 6453 6455 6460 6459 6454 6456 6473 6460 6455 6472 6474 6473 6456 6458 6462 6461 6457 6459 6463 6462 6458 6460 6475 6463 6459 6473 6476 6475 6460 6462 6465 6464 6461 6463 6466 6465 6462 6475 6478 6466 6463 6465 6468 6467 6464 6466 6481 6468 6465 6478 6482 6481 6466 6468 6485 6469 6467 6481 6486 6485 6468 6485 6490 6470 6469 8195 8200 6472 6471 8200 8205 6474 6472 6474 6477 6476 6473 8205 8209 6477 6474 6476 6479 6478 6475 6477 6480 6479 6476 8209 8212 6480 6477 6479 6483 6482 6478 6480 6484 6483 6479 8212 8215 6484 6480 6482 6487 6486 6481 6483 6488 6487 6482 6484 6489 6488 6483 8215 8217 6489 6484 6486 6491 6490 6485 6487 6492 6491 6486 6488 6493 6492 6487 6489 6494 6493 6488 8217 8218 6494 6489 6595 8344 8250 6495 8250 8256 6521 6495 6594 6595 6495 6496 6495 6521 6501 6496 6496 6599 6593 6594 6500 6599 6496 6501 6498 6503 6502 6497 6596 6597 6498 6497 6499 6504 6503 6498 6597 6598 6499 6498 6500 6505 6504 6499 6598 6599 6500 6499 6501 6506 6505 6500 6521 6522 6506 6501 6503 6508 6507 6502 6504 6509 6508 6503 6505 6510 6509 6504 6506 6523 6510 6505 6522 6524 6523 6506 6508 6512 6511 6507 6509 6513 6512 6508 6510 6525 6513 6509 6523 6526 6525 6510 6512 6515 6514 6511 6513 6516 6515 6512 6525 6528 6516 6513 6515 6518 6517 6514 6516 6531 6518 6515 6528 6532 6531 6516 6518 6535 6519 6517 6531 6536 6535 6518 6535 6540 6520 6519 6540 6546 6545 6520 8256 8262 6522 6521 8262 8267 6524 6522 6524 6527 6526 6523 8267 8271 6527 6524 6526 6529 6528 6525 6527 6530 6529 6526 8271 8274 6530 6527 6529 6533 6532 6528 6530 6534 6533 6529 8274 8277 6534 6530 6532 6537 6536 6531 6533 6538 6537 6532 6534 6539 6538 6533 8277 8279 6539 6534 6536 6541 6540 6535 6537 6542 6541 6536 6538 6543 6542 6537 6539 6544 6543 6538 8279 8280 6544 6539 6647 8406 8313 6547 8313 8319 6574 6547 6547 6652 6646 6647 6552 6652 6547 6574 6549 6554 6553 6548 6648 6649 6549 6548 6550 6555 6554 6549 6649 6650 6550 6549 6551 6556 6555 6550 6650 6651 6551 6550 6552 6557 6556 6551 6651 6652 6552 6551 6574 6575 6557 6552 6554 6559 6558 6553 6555 6560 6559 6554 6556 6561 6560 6555 6557 6576 6561 6556 6575 6577 6576 6557 6559 6563 6562 6558 6560 6564 6563 6559 6561 6565 6564 6560 6576 6578 6565 6561 6563 6567 6566 6562 6564 6568 6567 6563 6565 6580 6568 6564 6578 6581 6580 6565 6567 6570 6569 6566 6568 6583 6570 6567 6580 6584 6583 6568 6570 6572 6571 6569 6583 6587 6572 6570 6572 6591 6573 6571 6587 6592 6591 6572 6591 6597 6596 6573 8319 8325 6575 6574 8325 8330 6577 6575 6577 6579 6578 6576 8330 8334 6579 6577 6579 6582 6581 6578 8334 8338 6582 6579 6581 6585 6584 6580 6582 6586 6585 6581 8338 8341 6586 6582 6584 6588 6587 6583 6585 6589 6588 6584 6586 6590 6589 6585 8341 8343 6590 6586 6588 6593 6592 6587 6589 6594 6593 6588 6590 6595 6594 6589 8343 8344 6595 6590 6592 6598 6597 6591 6593 6599 6598 6592 6601 6606 6605 6600 6701 6702 6601 6600 6602 6607 6606 6601 6702 6703 6602 6601 6603 6608 6607 6602 6703 6704 6603 6602 6604 6609 6608 6603 6704 6705 6604 6603 6625 6626 6609 6604 6705 6706 6625 6604 6606 6611 6610 6605 6607 6612 6611 6606 6608 6613 6612 6607 6609 6627 6613 6608 6626 6628 6627 6609 6611 6615 6614 6610 6612 6616 6615 6611 6613 6629 6616 6612 6627 6630 6629 6613 6615 6618 6617 6614 6616 6619 6618 6615 6629 6632 6619 6616 6618 6621 6620 6617 6619 6635 6621 6618 6632 6636 6635 6619 6621 6623 6622 6620 6635 6639 6623 6621 6623 6643 6624 6622 6639 6644 6643 6623 6643 6649 6648 6624 8381 8387 6626 6625 6706 8483 8381 6625 8387 8392 6628 6626 6628 6631 6630 6627 8392 8396 6631 6628 6630 6633 6632 6629 6631 6634 6633 6630 8396 8400 6634 6631 6633 6637 6636 6632 6634 6638 6637 6633 8400 8403 6638 6634 6636 6640 6639 6635 6637 6641 6640 6636 6638 6642 6641 6637 8403 8405 6642 6638 6640 6645 6644 6639 6641 6646 6645 6640 6642 6647 6646 6641 8405 8406 6647 6642 6644 6650 6649 6643 6645 6651 6650 6644 6646 6652 6651 6645 6654 6659 6658 6653 6762 6763 6654 6653 6655 6660 6659 6654 6763 6764 6655 6654 6656 6661 6660 6655 6764 6765 6656 6655 6657 6662 6661 6656 6765 6766 6657 6656 6677 6678 6662 6657 6766 6767 6677 6657 6659 6664 6663 6658 6660 6665 6664 6659 6661 6666 6665 6660 6662 6679 6666 6661 6678 6680 6679 6662 6664 6668 6667 6663 6665 6669 6668 6664 6666 6681 6669 6665 6679 6682 6681 6666 6668 6671 6670 6667 6669 6672 6671 6668 6681 6684 6672 6669 6671 6674 6673 6670 6672 6687 6674 6671 6684 6688 6687 6672 6674 6691 6675 6673 6687 6692 6691 6674 6691 6696 6676 6675 6696 6702 6701 6676 8435 8441 6678 6677 6767 8536 8435 6677 8441 8446 6680 6678 6680 6683 6682 6679 8446 8450 6683 6680 6682 6685 6684 6681 6683 6686 6685 6682 8450 8453 6686 6683 6685 6689 6688 6684 6686 6690 6689 6685 8453 8456 6690 6686 6688 6693 6692 6687 6689 6694 6693 6688 6690 6695 6694 6689 8456 8458 6695 6690 6692 6697 6696 6691 6693 6698 6697 6692 6694 6699 6698 6693 6695 6700 6699 6694 8458 8459 6700 6695 6697 6703 6702 6696 6698 6704 6703 6697 6699 6705 6704 6698 6700 6706 6705 6699 8459 8483 6706 6700 6708 6714 6713 6707 6798 6824 6708 6707 6709 6715 6714 6708 6824 6825 6709 6708 6710 6716 6715 6709 6825 6826 6710 6709 6711 6717 6716 6710 6826 6827 6711 6710 6712 6718 6717 6711 6827 6828 6712 6711 6738 6739 6718 6712 6828 6829 6738 6712 6714 6720 6719 6713 6715 6721 6720 6714 6716 6722 6721 6715 6717 6723 6722 6716 6718 6740 6723 6717 6739 6741 6740 6718 6720 6725 6724 6719 6721 6726 6725 6720 6722 6727 6726 6721 6723 6742 6727 6722 6740 6743 6742 6723 6725 6729 6728 6724 6726 6730 6729 6725 6727 6731 6730 6726 6742 6745 6731 6727 6729 6733 6732 6728 6730 6734 6733 6729 6731 6748 6734 6730 6745 6749 6748 6731 6733 6736 6735 6732 6734 6752 6736 6733 6748 6753 6752 6734 6752 6757 6737 6736 6757 6763 6762 6737 8488 8493 6739 6738 6829 8591 8488 6738 8493 8498 6741 6739 6741 6744 6743 6740 8498 8502 6744 6741 6743 6746 6745 6742 6744 6747 6746 6743 8502 8505 6747 6744 6746 6750 6749 6745 6747 6751 6750 6746 8505 8508 6751 6747 6749 6754 6753 6748 6750 6755 6754 6749 6751 6756 6755 6750 8508 8510 6756 6751 6753 6758 6757 6752 6754 6759 6758 6753 6755 6760 6759 6754 6756 6761 6760 6755 8510 8511 6761 6756 6758 6764 6763 6757 6759 6765 6764 6758 6760 6766 6765 6759 6761 6767 6766 6760 8511 8536 6767 6761 6888 6889 6799 6768 6799 6801 6800 6768 6887 6888 6768 6769 6768 6800 6777 6769 6886 6887 6769 6770 6769 6777 6776 6770 6885 6886 6770 6771 6770 6776 6775 6771 6884 6885 6771 6772 6771 6775 6774 6772 6772 6890 6858 6884 6773 6890 6772 6774 6774 6779 6778 6773 6775 6780 6779 6774 6776 6781 6780 6775 6777 6782 6781 6776 6800 6802 6782 6777 6779 6784 6783 6778 6780 6785 6784 6779 6781 6786 6785 6780 6782 6804 6786 6781 6802 6805 6804 6782 6784 6788 6787 6783 6785 6789 6788 6784 6786 6790 6789 6785 6804 6807 6790 6786 6788 6792 6791 6787 6789 6793 6792 6788 6790 6810 6793 6789 6807 6811 6810 6790 6792 6795 6794 6791 6793 6814 6795 6792 6810 6815 6814 6793 6795 6797 6796 6794 6814 6819 6797 6795 6797 6824 6798 6796 6819 6825 6824 6797 8543 8548 6801 6799 6889 8643 8543 6799 6801 6803 6802 6800 8548 8553 6803 6801 6803 6806 6805 6802 8553 8557 6806 6803 6805 6808 6807 6804 6806 6809 6808 6805 8557 8560 6809 6806 6808 6812 6811 6807 6809 6813 6812 6808 8560 8563 6813 6809 6811 6816 6815 6810 6812 6817 6816 6811 6813 6818 6817 6812 8563 8565 6818 6813 6815 6820 6819 6814 6816 6821 6820 6815 6817 6822 6821 6816 6818 6823 6822 6817 8565 8566 6823 6818 6820 6826 6825 6819 6821 6827 6826 6820 6822 6828 6827 6821 6823 6829 6828 6822 8566 8591 6829 6823 6937 6938 6859 6830 6859 6861 6860 6830 6936 6937 6830 6831 6830 6860 6837 6831 6935 6936 6831 6832 6831 6837 6836 6832 6832 6941 6934 6935 6835 6941 6832 6836 6834 6839 6838 6833 6939 6940 6834 6833 6835 6840 6839 6834 6940 6941 6835 6834 6836 6841 6840 6835 6837 6842 6841 6836 6860 6862 6842 6837 6839 6844 6843 6838 6840 6845 6844 6839 6841 6846 6845 6840 6842 6864 6846 6841 6862 6865 6864 6842 6844 6848 6847 6843 6845 6849 6848 6844 6846 6850 6849 6845 6864 6867 6850 6846 6848 6852 6851 6847 6849 6853 6852 6848 6850 6870 6853 6849 6867 6871 6870 6850 6852 6855 6854 6851 6853 6874 6855 6852 6870 6875 6874 6853 6855 6857 6856 6854 6874 6879 6857 6855 6857 6884 6858 6856 6879 6885 6884 6857 8595 8600 6861 6859 6938 8699 8595 6859 6861 6863 6862 6860 8600 8604 6863 6861 6863 6866 6865 6862 8604 8608 6866 6863 6865 6868 6867 6864 6866 6869 6868 6865 8608 8611 6869 6866 6868 6872 6871 6867 6869 6873 6872 6868 8611 8613 6873 6869 6871 6876 6875 6870 6872 6877 6876 6871 6873 6878 6877 6872 8613 8615 6878 6873 6875 6880 6879 6874 6876 6881 6880 6875 6877 6882 6881 6876 6878 6883 6882 6877 8615 8637 6883 6878 6880 6886 6885 6879 6881 6887 6886 6880 6882 6888 6887 6881 6883 6889 6888 6882 8637 8643 6889 6883 6987 8753 8649 6891 8649 8655 6917 6891 6986 6987 6891 6892 6891 6917 6900 6892 6985 6986 6892 6893 6892 6900 6899 6893 6984 6985 6893 6894 6893 6899 6898 6894 6983 6984 6894 6895 6894 6898 6897 6895 6895 6988 6942 6983 6896 6988 6895 6897 6897 6902 6901 6896 6898 6903 6902 6897 6899 6904 6903 6898 6900 6918 6904 6899 6917 6919 6918 6900 6902 6906 6905 6901 6903 6907 6906 6902 6904 6908 6907 6903 6918 6920 6908 6904 6906 6910 6909 6905 6907 6911 6910 6906 6908 6922 6911 6907 6920 6923 6922 6908 6910 6913 6912 6909 6911 6925 6913 6910 6922 6926 6925 6911 6913 6915 6914 6912 6925 6929 6915 6913 6915 6933 6916 6914 6929 6934 6933 6915 6933 6940 6939 6916 8655 8660 6919 6917 6919 6921 6920 6918 8660 8664 6921 6919 6921 6924 6923 6920 8664 8668 6924 6921 6923 6927 6926 6922 6924 6928 6927 6923 8668 8671 6928 6924 6926 6930 6929 6925 6927 6931 6930 6926 6928 6932 6931 6927 8671 8673 6932 6928 6930 6935 6934 6929 6931 6936 6935 6930 6932 6937 6936 6931 6932 8673 6938 6937 6934 6941 6940 6933 8693 8699 6938 8673 6944 6983 6942 6943 6945 6946 6944 6943 6979 6984 6983 6944 6975 6979 6944 6946 6947 6948 6946 6945 6949 6975 6946 6948 6950 6951 6948 6947 6951 6952 6949 6948 6972 6976 6975 6949 6953 6972 6949 6952 6954 6955 6951 6950 6955 6956 6952 6951 6956 6957 6953 6952 6970 6973 6972 6953 6968 6970 6953 6957 6958 6959 6955 6954 6959 6960 6956 6955 6960 6961 6957 6956 6962 6968 6957 6961 6960 6966 6965 6961 6961 6965 6964 6962 6967 6969 6968 6962 6963 6967 6962 6964 6963 8722 8717 6967 6967 8717 8713 6969 6969 6971 6970 6968 6969 8713 8709 6971 6971 6974 6973 6970 6971 8709 8706 6974 6973 6977 6976 6972 6974 6978 6977 6973 6974 8706 8704 6978 6976 6980 6979 6975 6977 6981 6980 6976 6978 6982 6981 6977 6978 8704 8703 6982 6980 6985 6984 6979 6981 6986 6985 6980 6982 6987 6986 6981 8703 8753 6987 6982 6990 6996 6995 6989 7071 7072 6990 6989 6991 6997 6996 6990 7072 7073 6991 6990 6992 6998 6997 6991 7073 7074 6992 6991 6993 6999 6998 6992 7074 7075 6993 6992 6994 7032 6999 6993 7075 7076 6994 6993 8757 8763 7032 6994 7076 8839 8757 6994 6996 7001 7000 6995 6997 7002 7001 6996 6998 7003 7002 6997 6999 7030 7003 6998 6999 7032 7031 7030 7001 7005 7004 7000 7002 7006 7005 7001 7003 7027 7006 7002 7003 7030 7028 7027 7005 7008 7007 7004 7006 7022 7008 7005 7006 7027 7023 7022 7008 7016 7009 7007 7008 7022 7017 7016 7009 7016 7011 7010 7011 8723 8722 7010 7012 8724 8723 7011 7016 7017 7012 7011 7013 8725 8724 7012 7017 7018 7013 7012 7014 8726 8725 7013 7018 7019 7014 7013 7015 8727 8726 7014 7019 7020 7015 7014 8728 8729 8727 7015 7021 8728 7015 7020 7022 7023 7018 7017 7023 7024 7019 7018 7024 7025 7020 7019 7025 7026 7021 7020 8776 10447 8728 7021 8775 8776 7021 7026 7027 7028 7024 7023 7028 7029 7025 7024 7029 8772 7026 7025 8773 8775 7026 8772 7030 7031 7029 7028 8768 8772 7029 7031 8763 8768 7031 7032 7034 7036 7035 7033 7098 7114 7034 7033 7034 7119 7037 7036 7115 7119 7034 7114 7036 7041 7040 7035 7037 7042 7041 7036 7038 7043 7042 7037 7119 7120 7038 7037 7039 7044 7043 7038 7120 7121 7039 7038 7055 7056 7044 7039 7121 7122 7055 7039 7041 7046 7045 7040 7042 7047 7046 7041 7043 7048 7047 7042 7044 7057 7048 7043 7056 7058 7057 7044 7046 7050 7049 7045 7047 7051 7050 7046 7048 7059 7051 7047 7057 7060 7059 7048 7050 7053 7052 7049 7051 7062 7053 7050 7059 7063 7062 7051 7053 7066 7054 7052 7062 7067 7066 7053 7066 7072 7071 7054 8797 8803 7056 7055 7122 8887 8797 7055 8803 8808 7058 7056 7058 7061 7060 7057 8808 8812 7061 7058 7060 7064 7063 7059 7061 7065 7064 7060 8812 8815 7065 7061 7063 7068 7067 7062 7064 7069 7068 7063 7065 7070 7069 7064 8815 8817 7070 7065 7067 7073 7072 7066 7068 7074 7073 7067 7069 7075 7074 7068 7070 7076 7075 7069 8817 8839 7076 7070 7078 7084 7083 7077 7173 7174 7078 7077 7079 7085 7084 7078 7174 7175 7079 7078 7080 7086 7085 7079 7175 7176 7080 7079 7081 7087 7086 7080 7176 7177 7081 7080 7082 7099 7087 7081 7177 7178 7082 7081 8844 8850 7099 7082 7178 8936 8844 7082 7084 7089 7088 7083 7085 7090 7089 7084 7086 7091 7090 7085 7087 7100 7091 7086 7099 7101 7100 7087 7089 7093 7092 7088 7090 7094 7093 7089 7091 7102 7094 7090 7100 7103 7102 7091 7093 7096 7095 7092 7094 7105 7096 7093 7102 7106 7105 7094 7096 7109 7097 7095 7105 7110 7109 7096 7109 7114 7098 7097 8850 8855 7101 7099 7101 7104 7103 7100 8855 8859 7104 7101 7103 7107 7106 7102 7104 7108 7107 7103 8859 8863 7108 7104 7106 7111 7110 7105 7107 7112 7111 7106 7108 7113 7112 7107 8863 8866 7113 7108 7110 7115 7114 7109 7111 7116 7115 7110 7112 7117 7116 7111 7113 7118 7117 7112 8866 8868 7118 7113 7116 7120 7119 7115 7117 7121 7120 7116 7118 7122 7121 7117 8868 8887 7122 7118 7123 7235 7125 7124 7229 7235 7123 7206 7125 7131 7130 7124 7126 7132 7131 7125 7235 7236 7126 7125 7127 7133 7132 7126 7236 7237 7127 7126 7128 7134 7133 7127 7237 7238 7128 7127 7129 7151 7134 7128 7238 7239 7129 7128 7150 7152 7151 7129 7239 7240 7150 7129 7131 7136 7135 7130 7132 7137 7136 7131 7133 7138 7137 7132 7134 7139 7138 7133 7151 7153 7139 7134 7136 7141 7140 7135 7137 7142 7141 7136 7138 7143 7142 7137 7139 7155 7143 7138 7153 7156 7155 7139 7141 7145 7144 7140 7142 7146 7145 7141 7143 7158 7146 7142 7155 7159 7158 7143 7145 7148 7147 7144 7146 7162 7148 7145 7158 7163 7162 7146 7148 7167 7149 7147 7162 7168 7167 7148 8894 8900 7152 7150 7240 8990 8894 7150 7152 7154 7153 7151 8900 8905 7154 7152 7154 7157 7156 7153 8905 8909 7157 7154 7156 7160 7159 7155 7157 7161 7160 7156 8909 8912 7161 7157 7159 7164 7163 7158 7160 7165 7164 7159 7161 7166 7165 7160 8912 8915 7166 7161 7163 7169 7168 7162 7164 7170 7169 7163 7165 7171 7170 7164 7166 7172 7171 7165 8915 8917 7172 7166 7168 7174 7173 7167 7169 7175 7174 7168 7170 7176 7175 7169 7171 7177 7176 7170 7172 7178 7177 7171 8917 8936 7178 7172 7180 7186 7185 7179 7289 7290 7180 7179 7181 7187 7186 7180 7290 7291 7181 7180 7182 7188 7187 7181 7291 7292 7182 7181 7183 7189 7188 7182 7292 7293 7183 7182 7184 7208 7189 7183 7293 7294 7184 7183 7207 7209 7208 7184 7294 7295 7207 7184 7186 7191 7190 7185 7187 7192 7191 7186 7188 7193 7192 7187 7189 7194 7193 7188 7208 7210 7194 7189 7191 7196 7195 7190 7192 7197 7196 7191 7193 7198 7197 7192 7194 7212 7198 7193 7210 7213 7212 7194 7196 7200 7199 7195 7197 7201 7200 7196 7198 7215 7201 7197 7212 7216 7215 7198 7200 7203 7202 7199 7201 7219 7203 7200 7215 7220 7219 7201 7203 7205 7204 7202 7219 7224 7205 7203 7205 7229 7206 7204 7224 7230 7229 7205 8942 8947 7209 7207 7295 9052 8942 7207 7209 7211 7210 7208 8947 8952 7211 7209 7211 7214 7213 7210 8952 8956 7214 7211 7213 7217 7216 7212 7214 7218 7217 7213 8956 8959 7218 7214 7216 7221 7220 7215 7217 7222 7221 7216 7218 7223 7222 7217 8959 8962 7223 7218 7220 7225 7224 7219 7221 7226 7225 7220 7222 7227 7226 7221 7223 7228 7227 7222 8962 8964 7228 7223 7225 7231 7230 7224 7226 7232 7231 7225 7227 7233 7232 7226 7228 7234 7233 7227 8964 8965 7234 7228 7230 7236 7235 7229 7231 7237 7236 7230 7232 7238 7237 7231 7233 7239 7238 7232 7234 7240 7239 7233 8965 8990 7240 7234 7242 7248 7247 7241 7344 7345 7242 7241 7243 7249 7248 7242 7345 7346 7243 7242 7244 7250 7249 7243 7346 7347 7244 7243 7245 7251 7250 7244 7347 7348 7245 7244 7246 7268 7251 7245 7348 7349 7246 7245 8996 9002 7268 7246 7349 9114 8996 7246 7248 7253 7252 7247 7249 7254 7253 7248 7250 7255 7254 7249 7251 7269 7255 7250 7268 7270 7269 7251 7253 7257 7256 7252 7254 7258 7257 7253 7255 7259 7258 7254 7269 7271 7259 7255 7257 7261 7260 7256 7258 7262 7261 7257 7259 7273 7262 7258 7271 7274 7273 7259 7261 7264 7263 7260 7262 7276 7264 7261 7273 7277 7276 7262 7264 7266 7265 7263 7276 7280 7266 7264 7266 7284 7267 7265 7280 7285 7284 7266 7284 7290 7289 7267 9002 9007 7270 7268 7270 7272 7271 7269 9007 9012 7272 7270 7272 7275 7274 7271 9012 9016 7275 7272 7274 7278 7277 7273 7275 7279 7278 7274 9016 9019 7279 7275 7277 7281 7280 7276 7278 7282 7281 7277 7279 7283 7282 7278 9019 9022 7283 7279 7281 7286 7285 7280 7282 7287 7286 7281 7283 7288 7287 7282 9022 9024 7288 7283 7285 7291 7290 7284 7286 7292 7291 7285 7287 7293 7292 7286 7288 7294 7293 7287 7288 9024 7295 7294 9046 9052 7295 9024 7297 7303 7302 7296 7399 7400 7297 7296 7298 7304 7303 7297 7400 7401 7298 7297 7299 7305 7304 7298 7401 7402 7299 7298 7300 7306 7305 7299 7402 7403 7300 7299 7301 7321 7306 7300 7403 7404 7301 7300 9058 9064 7321 7301 7404 9169 9058 7301 7303 7308 7307 7302 7304 7309 7308 7303 7305 7310 7309 7304 7306 7322 7310 7305 7321 7323 7322 7306 7308 7312 7311 7307 7309 7313 7312 7308 7310 7324 7313 7309 7322 7325 7324 7310 7312 7315 7314 7311 7313 7316 7315 7312 7324 7327 7316 7313 7315 7318 7317 7314 7316 7330 7318 7315 7327 7331 7330 7316 7318 7334 7319 7317 7330 7335 7334 7318 7334 7339 7320 7319 7339 7345 7344 7320 9064 9069 7323 7321 7323 7326 7325 7322 9069 9074 7326 7323 7325 7328 7327 7324 7326 7329 7328 7325 9074 9078 7329 7326 7328 7332 7331 7327 7329 7333 7332 7328 9078 9081 7333 7329 7331 7336 7335 7330 7332 7337 7336 7331 7333 7338 7337 7332 9081 9084 7338 7333 7335 7340 7339 7334 7336 7341 7340 7335 7337 7342 7341 7336 7338 7343 7342 7337 9084 9086 7343 7338 7340 7346 7345 7339 7341 7347 7346 7340 7342 7348 7347 7341 7343 7349 7348 7342 9086 9114 7349 7343 7436 7462 7351 7350 7352 7357 7356 7351 7462 7463 7352 7351 7353 7358 7357 7352 7463 7464 7353 7352 7354 7359 7358 7353 7464 7465 7354 7353 7355 7360 7359 7354 7465 7466 7355 7354 7375 7376 7360 7355 7466 7467 7375 7355 7357 7362 7361 7356 7358 7363 7362 7357 7359 7364 7363 7358 7360 7377 7364 7359 7376 7378 7377 7360 7362 7366 7365 7361 7363 7367 7366 7362 7364 7379 7367 7363 7377 7380 7379 7364 7366 7369 7368 7365 7367 7370 7369 7366 7379 7382 7370 7367 7369 7372 7371 7368 7370 7385 7372 7369 7382 7386 7385 7370 7372 7389 7373 7371 7385 7390 7389 7372 7389 7394 7374 7373 7394 7400 7399 7374 9121 9127 7376 7375 7467 9223 9121 7375 9127 9132 7378 7376 7378 7381 7380 7377 9132 9136 7381 7378 7380 7383 7382 7379 7381 7384 7383 7380 9136 9140 7384 7381 7383 7387 7386 7382 7384 7388 7387 7383 9140 9143 7388 7384 7386 7391 7390 7385 7387 7392 7391 7386 7388 7393 7392 7387 9143 9145 7393 7388 7390 7395 7394 7389 7391 7396 7395 7390 7392 7397 7396 7391 7393 7398 7397 7392 9145 9147 7398 7393 7395 7401 7400 7394 7396 7402 7401 7395 7397 7403 7402 7396 7398 7404 7403 7397 9147 9169 7404 7398 7406 7412 7411 7405 7499 7525 7406 7405 7407 7413 7412 7406 7525 7526 7407 7406 7408 7414 7413 7407 7526 7527 7408 7407 7409 7415 7414 7408 7527 7528 7409 7408 7410 7416 7415 7409 7528 7529 7410 7409 7437 7438 7416 7410 7529 7530 7437 7410 7412 7418 7417 7411 7413 7419 7418 7412 7414 7420 7419 7413 7415 7421 7420 7414 7416 7439 7421 7415 7438 7440 7439 7416 7418 7423 7422 7417 7419 7424 7423 7418 7420 7425 7424 7419 7421 7441 7425 7420 7439 7442 7441 7421 7423 7427 7426 7422 7424 7428 7427 7423 7425 7429 7428 7424 7441 7444 7429 7425 7427 7431 7430 7426 7428 7432 7431 7427 7429 7447 7432 7428 7444 7448 7447 7429 7431 7434 7433 7430 7432 7451 7434 7431 7447 7452 7451 7432 7434 7456 7435 7433 7451 7457 7456 7434 7456 7462 7436 7435 9175 9181 7438 7437 7530 9277 9175 7437 9181 9186 7440 7438 7440 7443 7442 7439 9186 9190 7443 7440 7442 7445 7444 7441 7443 7446 7445 7442 9190 9194 7446 7443 7445 7449 7448 7444 7446 7450 7449 7445 9194 9197 7450 7446 7448 7453 7452 7447 7449 7454 7453 7448 7450 7455 7454 7449 9197 9199 7455 7450 7452 7458 7457 7451 7453 7459 7458 7452 7454 7460 7459 7453 7455 7461 7460 7454 9199 9201 7461 7455 7457 7463 7462 7456 7458 7464 7463 7457 7459 7465 7464 7458 7460 7466 7465 7459 7461 7467 7466 7460 9201 9223 7467 7461 7469 7475 7474 7468 7562 7588 7469 7468 7470 7476 7475 7469 7588 7589 7470 7469 7471 7477 7476 7470 7589 7590 7471 7470 7472 7478 7477 7471 7590 7591 7472 7471 7473 7479 7478 7472 7591 7592 7473 7472 7500 7501 7479 7473 7592 7593 7500 7473 7475 7481 7480 7474 7476 7482 7481 7475 7477 7483 7482 7476 7478 7484 7483 7477 7479 7502 7484 7478 7501 7503 7502 7479 7481 7486 7485 7480 7482 7487 7486 7481 7483 7488 7487 7482 7484 7504 7488 7483 7502 7505 7504 7484 7486 7490 7489 7485 7487 7491 7490 7486 7488 7492 7491 7487 7504 7507 7492 7488 7490 7494 7493 7489 7491 7495 7494 7490 7492 7510 7495 7491 7507 7511 7510 7492 7494 7497 7496 7493 7495 7514 7497 7494 7510 7515 7514 7495 7497 7519 7498 7496 7514 7520 7519 7497 7519 7525 7499 7498 9229 9235 7501 7500 7593 9331 9229 7500 9235 9240 7503 7501 7503 7506 7505 7502 9240 9244 7506 7503 7505 7508 7507 7504 7506 7509 7508 7505 9244 9248 7509 7506 7508 7512 7511 7507 7509 7513 7512 7508 9248 9251 7513 7509 7511 7516 7515 7510 7512 7517 7516 7511 7513 7518 7517 7512 9251 9253 7518 7513 7515 7521 7520 7514 7516 7522 7521 7515 7517 7523 7522 7516 7518 7524 7523 7517 9253 9255 7524 7518 7520 7526 7525 7519 7521 7527 7526 7520 7522 7528 7527 7521 7523 7529 7528 7522 7524 7530 7529 7523 9255 9277 7530 7524 7532 7538 7537 7531 7619 7637 7532 7531 7533 7539 7538 7532 7637 7638 7533 7532 7534 7540 7539 7533 7638 7639 7534 7533 7535 7541 7540 7534 7639 7640 7535 7534 7536 7542 7541 7535 7640 7641 7536 7535 7563 7564 7542 7536 7641 7642 7563 7536 7538 7544 7543 7537 7539 7545 7544 7538 7540 7546 7545 7539 7541 7547 7546 7540 7542 7565 7547 7541 7564 7566 7565 7542 7544 7549 7548 7543 7545 7550 7549 7544 7546 7551 7550 7545 7547 7567 7551 7546 7565 7568 7567 7547 7549 7553 7552 7548 7550 7554 7553 7549 7551 7555 7554 7550 7567 7570 7555 7551 7553 7557 7556 7552 7554 7558 7557 7553 7555 7573 7558 7554 7570 7574 7573 7555 7557 7560 7559 7556 7558 7577 7560 7557 7573 7578 7577 7558 7560 7582 7561 7559 7577 7583 7582 7560 7582 7588 7562 7561 9283 9289 7564 7563 7642 9386 9283 7563 9289 9294 7566 7564 7566 7569 7568 7565 9294 9298 7569 7566 7568 7571 7570 7567 7569 7572 7571 7568 9298 9302 7572 7569 7571 7575 7574 7570 7572 7576 7575 7571 9302 9305 7576 7572 7574 7579 7578 7573 7575 7580 7579 7574 7576 7581 7580 7575 9305 9307 7581 7576 7578 7584 7583 7577 7579 7585 7584 7578 7580 7586 7585 7579 7581 7587 7586 7580 9307 9309 7587 7581 7583 7589 7588 7582 7584 7590 7589 7583 7585 7591 7590 7584 7586 7592 7591 7585 7587 7593 7592 7586 9309 9331 7593 7587 7595 7601 7600 7594 7691 7692 7595 7594 7596 7602 7601 7595 7692 7693 7596 7595 7597 7603 7602 7596 7693 7694 7597 7596 7598 7604 7603 7597 7694 7695 7598 7597 7599 7620 7604 7598 7695 7696 7599 7598 9337 9343 7620 7599 7696 9422 9337 7599 7601 7606 7605 7600 7602 7607 7606 7601 7603 7608 7607 7602 7604 7621 7608 7603 7620 7622 7621 7604 7606 7610 7609 7605 7607 7611 7610 7606 7608 7612 7611 7607 7621 7623 7612 7608 7610 7614 7613 7609 7611 7615 7614 7610 7612 7625 7615 7611 7623 7626 7625 7612 7614 7617 7616 7613 7615 7628 7617 7614 7625 7629 7628 7615 7617 7632 7618 7616 7628 7633 7632 7617 7632 7637 7619 7618 9343 9348 7622 7620 7622 7624 7623 7621 9348 9353 7624 7622 7624 7627 7626 7623 9353 9357 7627 7624 7626 7630 7629 7625 7627 7631 7630 7626 9357 9360 7631 7627 7629 7634 7633 7628 7630 7635 7634 7629 7631 7636 7635 7630 9360 9363 7636 7631 7633 7638 7637 7632 7634 7639 7638 7633 7635 7640 7639 7634 7636 7641 7640 7635 7636 9363 7642 7641 9364 9386 7642 9363 7644 7650 7649 7643 7752 7753 7644 7643 7645 7651 7650 7644 7753 7754 7645 7644 7646 7652 7651 7645 7754 7755 7646 7645 7647 7653 7652 7646 7755 7756 7647 7646 7648 7671 7653 7647 7756 7757 7648 7647 9392 9398 7671 7648 7757 9482 9392 7648 7650 7655 7654 7649 7651 7656 7655 7650 7652 7657 7656 7651 7653 7658 7657 7652 7671 7672 7658 7653 7655 7660 7659 7654 7656 7661 7660 7655 7657 7662 7661 7656 7658 7673 7662 7657 7672 7674 7673 7658 7660 7664 7663 7659 7661 7665 7664 7660 7662 7675 7665 7661 7673 7676 7675 7662 7664 7667 7666 7663 7665 7678 7667 7664 7675 7679 7678 7665 7667 7669 7668 7666 7678 7682 7669 7667 7669 7686 7670 7668 7682 7687 7686 7669 7686 7692 7691 7670 9398 9404 7672 7671 9404 9409 7674 7672 7674 7677 7676 7673 9409 9413 7677 7674 7676 7680 7679 7675 7677 7681 7680 7676 9413 9416 7681 7677 7679 7683 7682 7678 7680 7684 7683 7679 7681 7685 7684 7680 9416 9419 7685 7681 7683 7688 7687 7682 7684 7689 7688 7683 7685 7690 7689 7684 9419 9421 7690 7685 7687 7693 7692 7686 7688 7694 7693 7687 7689 7695 7694 7688 7690 7696 7695 7689 9421 9422 7696 7690 7698 7704 7703 7697 7785 7808 7698 7697 7699 7705 7704 7698 7808 7809 7699 7698 7700 7706 7705 7699 7809 7810 7700 7699 7701 7707 7706 7700 7810 7811 7701 7700 7702 7708 7707 7701 7811 7812 7702 7701 7727 7728 7708 7702 7812 7813 7727 7702 7704 7710 7709 7703 7705 7711 7710 7704 7706 7712 7711 7705 7707 7713 7712 7706 7708 7729 7713 7707 7728 7730 7729 7708 7710 7715 7714 7709 7711 7716 7715 7710 7712 7717 7716 7711 7713 7731 7717 7712 7729 7732 7731 7713 7715 7719 7718 7714 7716 7720 7719 7715 7717 7734 7720 7716 7731 7735 7734 7717 7719 7722 7721 7718 7720 7723 7722 7719 7734 7738 7723 7720 7722 7725 7724 7721 7723 7742 7725 7722 7738 7743 7742 7723 7725 7747 7726 7724 7742 7748 7747 7725 7747 7753 7752 7726 9455 9461 7728 7727 7813 9553 9455 7727 9461 9466 7730 7728 7730 7733 7732 7729 9466 9470 7733 7730 7732 7736 7735 7731 7733 7737 7736 7732 9470 9474 7737 7733 7735 7739 7738 7734 7736 7740 7739 7735 7737 7741 7740 7736 9474 9477 7741 7737 7739 7744 7743 7738 7740 7745 7744 7739 7741 7746 7745 7740 9477 9479 7746 7741 7743 7749 7748 7742 7744 7750 7749 7743 7745 7751 7750 7744 7746 9480 7751 7745 9479 9481 9480 7746 7748 7754 7753 7747 7749 7755 7754 7748 7750 7756 7755 7749 7751 7757 7756 7750 9480 9482 7757 7751 7759 7765 7764 7758 7834 7857 7759 7758 7760 7766 7765 7759 7857 7858 7760 7759 7761 7767 7766 7760 7858 7859 7761 7760 7762 7768 7767 7761 7859 7860 7762 7761 7763 7787 7768 7762 7860 7861 7763 7762 7786 7788 7787 7763 7861 7862 7786 7763 7765 7770 7769 7764 7766 7771 7770 7765 7767 7772 7771 7766 7768 7773 7772 7767 7787 7789 7773 7768 7770 7775 7774 7769 7771 7776 7775 7770 7772 7777 7776 7771 7773 7791 7777 7772 7789 7792 7791 7773 7775 7779 7778 7774 7776 7780 7779 7775 7777 7794 7780 7776 7791 7795 7794 7777 7779 7782 7781 7778 7780 7798 7782 7779 7794 7799 7798 7780 7782 7784 7783 7781 7798 7803 7784 7782 7784 7808 7785 7783 7803 7809 7808 7784 9511 9517 7788 7786 7862 9612 9511 7786 7788 7790 7789 7787 9517 9522 7790 7788 7790 7793 7792 7789 9522 9526 7793 7790 7792 7796 7795 7791 7793 7797 7796 7792 9526 9529 7797 7793 7795 7800 7799 7794 7796 7801 7800 7795 7797 7802 7801 7796 9529 9532 7802 7797 7799 7804 7803 7798 7800 7805 7804 7799 7801 7806 7805 7800 7802 7807 7806 7801 9532 9534 7807 7802 7804 7810 7809 7803 7805 7811 7810 7804 7806 7812 7811 7805 7807 7813 7812 7806 9534 9553 7813 7807 7815 7820 7819 7814 7909 7910 7815 7814 7816 7821 7820 7815 7910 7911 7816 7815 7817 7822 7821 7816 7911 7912 7817 7816 7818 7823 7822 7817 7912 7913 7818 7817 7835 7836 7823 7818 7913 7914 7835 7818 7820 7825 7824 7819 7821 7826 7825 7820 7822 7827 7826 7821 7823 7837 7827 7822 7836 7838 7837 7823 7825 7829 7828 7824 7826 7830 7829 7825 7827 7839 7830 7826 7837 7840 7839 7827 7829 7832 7831 7828 7830 7842 7832 7829 7839 7843 7842 7830 7832 7846 7833 7831 7842 7847 7846 7832 7846 7852 7851 7833 9566 9572 7836 7835 9559 9566 7835 7914 9572 9577 7838 7836 7838 7841 7840 7837 9577 9581 7841 7838 7840 7844 7843 7839 7841 7845 7844 7840 9581 9584 7845 7841 7843 7848 7847 7842 7844 7849 7848 7843 7845 7850 7849 7844 9584 9587 7850 7845 7847 7853 7852 7846 7848 7854 7853 7847 7849 7855 7854 7848 7850 7856 7855 7849 9587 9589 7856 7850 7852 7858 7857 7851 7853 7859 7858 7852 7854 7860 7859 7853 7855 7861 7860 7854 7856 7862 7861 7855 9589 9612 7862 7856 7864 7870 7869 7863 7958 7959 7864 7863 7865 7871 7870 7864 7959 7960 7865 7864 7866 7872 7871 7865 7960 7961 7866 7865 7867 7887 7872 7866 7961 7962 7867 7866 7886 7888 7887 7867 7962 7963 7886 7867 7869 7874 7873 7868 7870 7875 7874 7869 7871 7876 7875 7870 7872 7889 7876 7871 7887 7890 7889 7872 7874 7878 7877 7873 7875 7879 7878 7874 7876 7892 7879 7875 7889 7893 7892 7876 7878 7881 7880 7877 7879 7882 7881 7878 7892 7896 7882 7879 7881 7884 7883 7880 7882 7900 7884 7881 7896 7901 7900 7882 7884 7904 7885 7883 7900 7905 7904 7884 7904 7910 7909 7885 9621 9626 7888 7886 7963 9711 9621 7886 7888 7891 7890 7887 9626 9631 7891 7888 7890 7894 7893 7889 7891 7895 7894 7890 9631 9635 7895 7891 7893 7897 7896 7892 7894 7898 7897 7893 7895 7899 7898 7894 9635 9638 7899 7895 7897 7902 7901 7896 7898 7903 7902 7897 7899 9640 7903 7898 9638 9641 9640 7899 7901 7906 7905 7900 7902 7907 7906 7901 7903 7908 7907 7902 9640 9642 7908 7903 7905 7911 7910 7904 7906 7912 7911 7905 7907 7913 7912 7906 7908 7914 7913 7907 7908 9642 9559 7914 7916 7922 7921 7915 7988 8012 7916 7915 7917 7923 7922 7916 8012 8013 7917 7916 7918 7924 7923 7917 8013 8014 7918 7917 7919 7925 7924 7918 8014 8015 7919 7918 7920 7939 7925 7919 8015 8016 7920 7919 7938 9670 7939 7920 8016 8017 7938 7920 7922 7927 7926 7921 7923 7928 7927 7922 7924 7929 7928 7923 7925 7940 7929 7924 7939 7941 7940 7925 7927 7931 7930 7926 7928 7932 7931 7927 7929 7942 7932 7928 7940 7943 7942 7929 7931 7934 7933 7930 7932 7945 7934 7931 7942 7946 7945 7932 7934 7936 7935 7933 7945 7949 7936 7934 7936 7953 7937 7935 7949 7954 7953 7936 7953 7959 7958 7937 9665 9671 9670 7938 8017 9762 9665 7938 9670 9675 7941 7939 7941 7944 7943 7940 9675 9679 7944 7941 7943 7947 7946 7942 7944 7948 7947 7943 9679 9682 7948 7944 7946 7950 7949 7945 7947 7951 7950 7946 7948 7952 7951 7947 9682 9685 7952 7948 7950 7955 7954 7949 7951 7956 7955 7950 7952 7957 7956 7951 9685 9687 7957 7952 7954 7960 7959 7953 7955 7961 7960 7954 7956 7962 7961 7955 7957 7963 7962 7956 9687 9711 7963 7957 8065 9795 9714 7964 9714 9720 7989 7964 8064 8065 7964 7965 7964 7989 7971 7965 8063 8064 7965 7966 7965 7971 7970 7966 7966 8068 8062 8063 7969 8068 7966 7970 7968 7973 7972 7967 8066 8067 7968 7967 7969 7974 7973 7968 8067 8068 7969 7968 7970 7975 7974 7969 7971 7990 7975 7970 7989 7991 7990 7971 7973 7977 7976 7972 7974 7978 7977 7973 7975 7979 7978 7974 7990 7992 7979 7975 7977 7981 7980 7976 7978 7982 7981 7977 7979 7994 7982 7978 7992 7995 7994 7979 7981 7984 7983 7980 7982 7997 7984 7981 7994 7998 7997 7982 7984 8001 7986 7983 7997 8002 8001 7984 7986 8006 7987 7985 8001 8007 8006 7986 8006 8012 7988 7987 9720 9725 7991 7989 7991 7993 7992 7990 9725 9730 7993 7991 7993 7996 7995 7992 9730 9734 7996 7993 7995 7999 7998 7994 7996 8000 7999 7995 9734 9737 8000 7996 7998 8003 8002 7997 7999 8004 8003 7998 8000 8005 8004 7999 9737 9739 8005 8000 8002 8008 8007 8001 8003 8009 8008 8002 8004 8010 8009 8003 8005 8011 8010 8004 9739 9740 8011 8005 8007 8013 8012 8006 8008 8014 8013 8007 8009 8015 8014 8008 8010 8016 8015 8009 8011 8017 8016 8010 9740 9762 8017 8011 8019 8025 8024 8018 8100 8126 8019 8018 8020 8026 8025 8019 8126 8127 8020 8019 8021 8027 8026 8020 8127 8128 8021 8020 8022 8028 8027 8021 8128 8129 8022 8021 8023 8044 8028 8022 8129 8130 8023 8022 9768 9774 8044 8023 8130 9847 9768 8023 8025 8030 8029 8024 8026 8031 8030 8025 8027 8032 8031 8026 8028 8045 8032 8027 8044 8046 8045 8028 8030 8034 8033 8029 8031 8035 8034 8030 8032 8036 8035 8031 8045 8047 8036 8032 8034 8038 8037 8033 8035 8039 8038 8034 8036 8049 8039 8035 8047 8050 8049 8036 8038 8041 8040 8037 8039 8052 8041 8038 8049 8053 8052 8039 8041 8056 8042 8040 8052 8057 8056 8041 8056 8061 8043 8042 8061 8067 8066 8043 9774 9779 8046 8044 8046 8048 8047 8045 9779 9784 8048 8046 8048 8051 8050 8047 9784 9788 8051 8048 8050 8054 8053 8049 8051 8055 8054 8050 9788 9791 8055 8051 8053 8058 8057 8052 8054 8059 8058 8053 8055 8060 8059 8054 9791 9793 8060 8055 8057 8062 8061 8056 8058 8063 8062 8057 8059 8064 8063 8058 8060 8065 8064 8059 9793 9795 8065 8060 8062 8068 8067 8061 8070 8076 8075 8069 8160 8183 8070 8069 8071 8077 8076 8070 8183 8184 8071 8070 8072 8078 8077 8071 8184 8185 8072 8071 8073 8079 8078 8072 8185 8186 8073 8072 8074 8080 8079 8073 8186 8187 8074 8073 8101 8102 8080 8074 8187 8188 8101 8074 8076 8082 8081 8075 8077 8083 8082 8076 8078 8084 8083 8077 8079 8085 8084 8078 8080 8103 8085 8079 8102 8104 8103 8080 8082 8087 8086 8081 8083 8088 8087 8082 8084 8089 8088 8083 8085 8105 8089 8084 8103 8106 8105 8085 8087 8091 8090 8086 8088 8092 8091 8087 8089 8093 8092 8088 8105 8108 8093 8089 8091 8095 8094 8090 8092 8096 8095 8091 8093 8111 8096 8092 8108 8112 8111 8093 8095 8098 8097 8094 8096 8115 8098 8095 8111 8116 8115 8096 8098 8120 8099 8097 8115 8121 8120 8098 8120 8126 8100 8099 9823 9829 8102 8101 8188 9926 9823 8101 9829 9834 8104 8102 8104 8107 8106 8103 9834 9838 8107 8104 8106 8109 8108 8105 8107 8110 8109 8106 9838 9841 8110 8107 8109 8113 8112 8108 8110 8114 8113 8109 9841 9844 8114 8110 8112 8117 8116 8111 8113 8118 8117 8112 8114 8119 8118 8113 9844 9846 8119 8114 8116 8122 8121 8115 8117 8123 8122 8116 8118 8124 8123 8117 8119 8125 8124 8118 9846 9866 8125 8119 8121 8127 8126 8120 8122 8128 8127 8121 8123 8129 8128 8122 8124 8130 8129 8123 8125 9847 8130 8124 9866 9872 9847 8125 8245 9974 9878 8131 9878 9884 8161 8131 8244 8245 8131 8132 8131 8161 8138 8132 8132 8249 8243 8244 8137 8249 8132 8138 8134 8140 8139 8133 8218 8246 8134 8133 8135 8141 8140 8134 8246 8247 8135 8134 8136 8142 8141 8135 8247 8248 8136 8135 8137 8143 8142 8136 8248 8249 8137 8136 8138 8162 8143 8137 8161 8163 8162 8138 8140 8145 8144 8139 8141 8146 8145 8140 8142 8147 8146 8141 8143 8148 8147 8142 8162 8164 8148 8143 8145 8150 8149 8144 8146 8151 8150 8145 8147 8152 8151 8146 8148 8166 8152 8147 8164 8167 8166 8148 8150 8154 8153 8149 8151 8155 8154 8150 8152 8169 8155 8151 8166 8170 8169 8152 8154 8157 8156 8153 8155 8173 8157 8154 8169 8174 8173 8155 8157 8159 8158 8156 8173 8178 8159 8157 8159 8183 8160 8158 8178 8184 8183 8159 9884 9889 8163 8161 8163 8165 8164 8162 9889 9893 8165 8163 8165 8168 8167 8164 9893 9897 8168 8165 8167 8171 8170 8166 8168 8172 8171 8167 9897 9900 8172 8168 8170 8175 8174 8169 8171 8176 8175 8170 8172 8177 8176 8171 9900 9902 8177 8172 8174 8179 8178 8173 8175 8180 8179 8174 8176 8181 8180 8175 8177 8182 8181 8176 9902 9904 8182 8177 8179 8185 8184 8178 8180 8186 8185 8179 8181 8187 8186 8180 8182 8188 8187 8181 9904 9926 8188 8182 8190 8196 8195 8189 8280 8307 8190 8189 8191 8197 8196 8190 8307 8308 8191 8190 8192 8198 8197 8191 8308 8309 8192 8191 8193 8199 8198 8192 8309 8310 8193 8192 8194 8220 8199 8193 8310 8311 8194 8193 8219 8221 8220 8194 8311 8312 8219 8194 8196 8201 8200 8195 8197 8202 8201 8196 8198 8203 8202 8197 8199 8204 8203 8198 8220 8222 8204 8199 8201 8206 8205 8200 8202 8207 8206 8201 8203 8208 8207 8202 8204 8224 8208 8203 8222 8225 8224 8204 8206 8210 8209 8205 8207 8211 8210 8206 8208 8227 8211 8207 8224 8228 8227 8208 8210 8213 8212 8209 8211 8214 8213 8210 8227 8231 8214 8211 8213 8216 8215 8212 8214 8235 8216 8213 8231 8236 8235 8214 8216 8240 8217 8215 8235 8241 8240 8216 8240 8246 8218 8217 9932 9937 8221 8219 8312 10028 9932 8219 8221 8223 8222 8220 9937 9942 8223 8221 8223 8226 8225 8222 9942 9946 8226 8223 8225 8229 8228 8224 8226 8230 8229 8225 9946 9949 8230 8226 8228 8232 8231 8227 8229 8233 8232 8228 8230 8234 8233 8229 9949 9951 8234 8230 8232 8237 8236 8231 8233 8238 8237 8232 8234 8239 8238 8233 9951 9953 8239 8234 8236 8242 8241 8235 8237 8243 8242 8236 8238 8244 8243 8237 8239 8245 8244 8238 9953 9974 8245 8239 8241 8247 8246 8240 8242 8248 8247 8241 8243 8249 8248 8242 8251 8257 8256 8250 8344 8370 8251 8250 8252 8258 8257 8251 8370 8371 8252 8251 8253 8259 8258 8252 8371 8372 8253 8252 8254 8260 8259 8253 8372 8373 8254 8253 8255 8261 8260 8254 8373 8374 8255 8254 8281 8282 8261 8255 8374 8375 8281 8255 8257 8263 8262 8256 8258 8264 8263 8257 8259 8265 8264 8258 8260 8266 8265 8259 8261 8283 8266 8260 8282 8284 8283 8261 8263 8268 8267 8262 8264 8269 8268 8263 8265 8270 8269 8264 8266 8285 8270 8265 8283 8286 8285 8266 8268 8272 8271 8267 8269 8273 8272 8268 8270 8288 8273 8269 8285 8289 8288 8270 8272 8275 8274 8271 8273 8276 8275 8272 8288 8292 8276 8273 8275 8278 8277 8274 8276 8296 8278 8275 8292 8297 8296 8276 8278 8301 8279 8277 8296 8302 8301 8278 8301 8307 8280 8279 9980 9985 8282 8281 8375 10082 9980 8281 9985 9990 8284 8282 8284 8287 8286 8283 9990 9994 8287 8284 8286 8290 8289 8285 8287 8291 8290 8286 9994 9997 8291 8287 8289 8293 8292 8288 8290 8294 8293 8289 8291 8295 8294 8290 9997 10000 8295 8291 8293 8298 8297 8292 8294 8299 8298 8293 8295 8300 8299 8294 10000 10002 8300 8295 8297 8303 8302 8296 8298 8304 8303 8297 8299 8305 8304 8298 8300 8306 8305 8299 10002 10003 8306 8300 8302 8308 8307 8301 8303 8309 8308 8302 8304 8310 8309 8303 8305 8311 8310 8304 8306 8312 8311 8305 10003 10028 8312 8306 8314 8320 8319 8313 8406 8426 8314 8313 8315 8321 8320 8314 8426 8427 8315 8314 8316 8322 8321 8315 8427 8428 8316 8315 8317 8323 8322 8316 8428 8429 8317 8316 8318 8324 8323 8317 8429 8430 8318 8317 8345 8346 8324 8318 8430 8431 8345 8318 8320 8326 8325 8319 8321 8327 8326 8320 8322 8328 8327 8321 8323 8329 8328 8322 8324 8347 8329 8323 8346 8348 8347 8324 8326 8331 8330 8325 8327 8332 8331 8326 8328 8333 8332 8327 8329 8349 8333 8328 8347 8350 8349 8329 8331 8335 8334 8330 8332 8336 8335 8331 8333 8337 8336 8332 8349 8352 8337 8333 8335 8339 8338 8334 8336 8340 8339 8335 8337 8355 8340 8336 8352 8356 8355 8337 8339 8342 8341 8338 8340 8359 8342 8339 8355 8360 8359 8340 8342 8364 8343 8341 8359 8365 8364 8342 8364 8370 8344 8343 10034 10040 8346 8345 8431 10142 10034 8345 10040 10045 8348 8346 8348 8351 8350 8347 10045 10049 8351 8348 8350 8353 8352 8349 8351 8354 8353 8350 10049 10052 8354 8351 8353 8357 8356 8352 8354 8358 8357 8353 10052 10055 8358 8354 8356 8361 8360 8355 8357 8362 8361 8356 8358 8363 8362 8357 10055 10057 8363 8358 8360 8366 8365 8359 8361 8367 8366 8360 8362 8368 8367 8361 8363 8369 8368 8362 10057 10058 8369 8363 8365 8371 8370 8364 8366 8372 8371 8365 8367 8373 8372 8366 8368 8374 8373 8367 8369 8375 8374 8368 10058 10082 8375 8369 8482 10180 10088 8376 10088 10095 8386 8376 8481 8482 8376 8377 8376 8386 8385 8377 8480 8481 8377 8378 8377 8385 8384 8378 8479 8480 8378 8379 8378 8384 8383 8379 8478 8479 8379 8380 8379 8383 8382 8380 8380 8483 8459 8478 8381 8483 8380 8382 8382 8388 8387 8381 8383 8389 8388 8382 8384 8390 8389 8383 8385 8391 8390 8384 8386 8407 8391 8385 10095 10101 8407 8386 8388 8393 8392 8387 8389 8394 8393 8388 8390 8395 8394 8389 8391 8408 8395 8390 8407 8409 8408 8391 8393 8397 8396 8392 8394 8398 8397 8393 8395 8399 8398 8394 8408 8410 8399 8395 8397 8401 8400 8396 8398 8402 8401 8397 8399 8412 8402 8398 8410 8413 8412 8399 8401 8404 8403 8400 8402 8415 8404 8401 8412 8416 8415 8402 8404 8420 8405 8403 8415 8421 8420 8404 8420 8426 8406 8405 10101 10106 8409 8407 8409 8411 8410 8408 10106 10110 8411 8409 8411 8414 8413 8410 10110 10114 8414 8411 8413 8417 8416 8412 8414 8418 8417 8413 8414 10114 8419 8418 8416 8422 8421 8415 8417 8423 8422 8416 8418 8424 8423 8417 8419 8425 8424 8418 10117 10118 8425 8419 10115 10117 8419 10114 8421 8427 8426 8420 8422 8428 8427 8421 8423 8429 8428 8422 8424 8430 8429 8423 8425 8431 8430 8424 10118 10142 8431 8425 8535 10243 10148 8432 10148 10154 8440 8432 8534 8535 8432 8433 8432 8440 8439 8433 8533 8534 8433 8434 8433 8439 8438 8434 8434 8538 8532 8533 8437 8538 8434 8438 8436 8442 8441 8435 8536 8537 8436 8435 8437 8443 8442 8436 8537 8538 8437 8436 8438 8444 8443 8437 8439 8445 8444 8438 8440 8460 8445 8439 10154 10160 8460 8440 8442 8447 8446 8441 8443 8448 8447 8442 8444 8449 8448 8443 8445 8461 8449 8444 8460 8462 8461 8445 8447 8451 8450 8446 8448 8452 8451 8447 8449 8463 8452 8448 8461 8464 8463 8449 8451 8454 8453 8450 8452 8455 8454 8451 8463 8466 8455 8452 8454 8457 8456 8453 8455 8469 8457 8454 8466 8470 8469 8455 8457 8473 8458 8456 8469 8474 8473 8457 8473 8478 8459 8458 10160 10165 8462 8460 8462 8465 8464 8461 10165 10169 8465 8462 8464 8467 8466 8463 8465 8468 8467 8464 10169 10173 8468 8465 8467 8471 8470 8466 8468 8472 8471 8467 10173 10176 8472 8468 8470 8475 8474 8469 8471 8476 8475 8470 8472 8477 8476 8471 10176 10178 8477 8472 8474 8479 8478 8473 8475 8480 8479 8474 8476 8481 8480 8475 8477 8482 8481 8476 10178 10180 8482 8477 8590 10303 10211 8484 10211 10217 8512 8484 8589 8590 8484 8485 8484 8512 8492 8485 8588 8589 8485 8486 8485 8492 8491 8486 8587 8588 8486 8487 8486 8491 8490 8487 8487 8592 8586 8587 8489 8592 8487 8490 8489 8494 8493 8488 8591 8592 8489 8488 8490 8495 8494 8489 8491 8496 8495 8490 8492 8497 8496 8491 8512 8513 8497 8492 8494 8499 8498 8493 8495 8500 8499 8494 8496 8501 8500 8495 8497 8514 8501 8496 8513 8515 8514 8497 8499 8503 8502 8498 8500 8504 8503 8499 8501 8516 8504 8500 8514 8517 8516 8501 8503 8506 8505 8502 8504 8507 8506 8503 8516 8519 8507 8504 8506 8509 8508 8505 8507 8522 8509 8506 8519 8523 8522 8507 8509 8526 8510 8508 8522 8527 8526 8509 8526 8531 8511 8510 8531 8537 8536 8511 10217 10223 8513 8512 10223 10228 8515 8513 8515 8518 8517 8514 10228 10232 8518 8515 8517 8520 8519 8516 8518 8521 8520 8517 10232 10236 8521 8518 8520 8524 8523 8519 8521 8525 8524 8520 10236 10239 8525 8521 8523 8528 8527 8522 8524 8529 8528 8523 8525 8530 8529 8524 10239 10241 8530 8525 8527 8532 8531 8526 8528 8533 8532 8527 8529 8534 8533 8528 8530 8535 8534 8529 10241 10243 8535 8530 8532 8538 8537 8531 8642 10357 10274 8539 10274 10280 8567 8539 8641 8642 8539 8540 8539 8567 8547 8540 8640 8641 8540 8541 8540 8547 8546 8541 8639 8640 8541 8542 8541 8546 8545 8542 8542 8644 8638 8639 8544 8644 8542 8545 8544 8549 8548 8543 8643 8644 8544 8543 8545 8550 8549 8544 8546 8551 8550 8545 8547 8552 8551 8546 8567 8568 8552 8547 8549 8554 8553 8548 8550 8555 8554 8549 8551 8556 8555 8550 8552 8569 8556 8551 8568 8570 8569 8552 8554 8558 8557 8553 8555 8559 8558 8554 8556 8571 8559 8555 8569 8572 8571 8556 8558 8561 8560 8557 8559 8562 8561 8558 8571 8574 8562 8559 8561 8564 8563 8560 8562 8577 8564 8561 8574 8578 8577 8562 8564 8581 8565 8563 8577 8582 8581 8564 8581 8586 8566 8565 8586 8592 8591 8566 10280 10285 8568 8567 10285 10290 8570 8568 8570 8573 8572 8569 10290 10294 8573 8570 8572 8575 8574 8571 8573 8576 8575 8572 10294 10297 8576 8573 8575 8579 8578 8574 8576 8580 8579 8575 10297 10300 8580 8576 8578 8583 8582 8577 8579 8584 8583 8578 8580 8585 8584 8579 10300 10302 8585 8580 8582 8587 8586 8581 8583 8588 8587 8582 8584 8589 8588 8583 8585 8590 8589 8584 10302 10303 8590 8585 8698 10424 10328 8593 10328 10334 8616 8593 8697 8698 8593 8594 8593 8616 8599 8594 8594 8702 8696 8697 8598 8702 8594 8599 8596 8601 8600 8595 8699 8700 8596 8595 8597 8602 8601 8596 8700 8701 8597 8596 8598 8603 8602 8597 8701 8702 8598 8597 8599 8617 8603 8598 8616 8618 8617 8599 8601 8605 8604 8600 8602 8606 8605 8601 8603 8607 8606 8602 8617 8619 8607 8603 8605 8609 8608 8604 8606 8610 8609 8605 8607 8621 8610 8606 8619 8622 8621 8607 8609 8612 8611 8608 8610 8624 8612 8609 8621 8625 8624 8610 8612 8614 8613 8611 8624 8628 8614 8612 8614 8632 8615 8613 8628 8633 8632 8614 8632 8638 8637 8615 10334 10339 8618 8616 8618 8620 8619 8617 10339 10344 8620 8618 8620 8623 8622 8619 10344 10348 8623 8620 8622 8626 8625 8621 8623 8627 8626 8622 10348 10351 8627 8623 8625 8629 8628 8624 8626 8630 8629 8625 8627 8631 8630 8626 10351 10354 8631 8627 8629 8634 8633 8628 8630 8635 8634 8629 8631 8636 8635 8630 10354 10356 8636 8631 8633 8639 8638 8632 8634 8640 8639 8633 8635 8641 8640 8634 8636 8642 8641 8635 10356 10357 8642 8636 8638 8644 8643 8637 8751 8752 8674 8645 8674 8675 8654 8645 8750 8751 8645 8646 8645 8654 8653 8646 8749 8750 8646 8647 8646 8653 8652 8647 8748 8749 8647 8648 8647 8652 8651 8648 8648 8754 8747 8748 8650 8754 8648 8651 8650 8656 8655 8649 8753 8754 8650 8649 8651 8657 8656 8650 8652 8658 8657 8651 8653 8659 8658 8652 8654 8676 8659 8653 8675 8677 8676 8654 8656 8661 8660 8655 8657 8662 8661 8656 8658 8663 8662 8657 8659 8678 8663 8658 8676 8679 8678 8659 8661 8665 8664 8660 8662 8666 8665 8661 8663 8667 8666 8662 8678 8681 8667 8663 8665 8669 8668 8664 8666 8670 8669 8665 8667 8684 8670 8666 8681 8685 8684 8667 8669 8672 8671 8668 8670 8688 8672 8669 8684 8689 8688 8670 8672 8693 8673 8671 8688 8694 8693 8672 10382 10387 8675 8674 8752 10472 10382 8674 10387 10392 8677 8675 8677 8680 8679 8676 10392 10396 8680 8677 8679 8682 8681 8678 8680 8683 8682 8679 10396 10399 8683 8680 8682 8686 8685 8681 8683 8687 8686 8682 10399 10402 8687 8683 8685 8690 8689 8684 8686 8691 8690 8685 8687 8692 8691 8686 10402 10404 8692 8687 8689 8695 8694 8688 8690 8696 8695 8689 8691 8697 8696 8690 8692 8698 8697 8691 10404 10424 8698 8692 8694 8700 8699 8693 8695 8701 8700 8694 8696 8702 8701 8695 8747 8754 8753 8703 8705 8747 8703 8704 8706 8707 8705 8704 8742 8748 8747 8705 8708 8742 8705 8707 8709 8710 8707 8706 8710 8711 8708 8707 8738 8743 8742 8708 8712 8738 8708 8711 8713 8714 8710 8709 8714 8715 8711 8710 8715 8716 8712 8711 8735 8739 8738 8712 8732 8735 8712 8716 8717 8718 8714 8713 8718 8719 8715 8714 8719 8720 8716 8715 8721 8732 8716 8720 8722 8723 8718 8717 8723 8724 8719 8718 8724 8725 8720 8719 8725 8726 8721 8720 8730 8733 8732 8721 8727 8730 8721 8726 8729 8731 8730 8727 8728 10447 10442 8729 8729 10442 10438 8731 8731 8734 8733 8730 8731 10438 10435 8734 8733 8736 8735 8732 8734 8737 8736 8733 8734 10435 10433 8737 8736 8740 8739 8735 8737 8741 8740 8736 8737 10433 10431 8741 8739 8744 8743 8738 8740 8745 8744 8739 8741 8746 8745 8740 8741 10431 10430 8746 8743 8749 8748 8742 8744 8750 8749 8743 8745 8751 8750 8744 8746 8752 8751 8745 10430 10472 8752 8746 8838 10540 10478 8755 10478 10484 8796 8755 8837 8838 8755 8756 8755 8796 8762 8756 8756 8843 8836 8837 8761 8843 8756 8762 8758 8764 8763 8757 8839 8840 8758 8757 8759 8765 8764 8758 8840 8841 8759 8758 8760 8766 8765 8759 8841 8842 8760 8759 8761 8767 8766 8760 8842 8843 8761 8760 8762 8794 8767 8761 8762 8796 8795 8794 8764 8769 8768 8763 8765 8770 8769 8764 8766 8771 8770 8765 8767 8791 8771 8766 8767 8794 8792 8791 8769 8773 8772 8768 8770 8774 8773 8769 8771 8787 8774 8770 8771 8791 8788 8787 8774 8782 8775 8773 8774 8787 8783 8782 8775 8782 8777 8776 8777 10448 10447 8776 8778 10449 10448 8777 8782 8783 8778 8777 8779 10450 10449 8778 8783 8784 8779 8778 8780 10451 10450 8779 8784 8785 8780 8779 8781 10452 10451 8780 8785 8786 8781 8780 10499 12150 10452 8781 10498 10499 8781 8786 8787 8788 8784 8783 8788 8789 8785 8784 8789 8790 8786 8785 10496 10498 8786 8790 8791 8792 8789 8788 8792 8793 8790 8789 10493 10496 8790 8793 8794 8795 8793 8792 10489 10493 8793 8795 10484 10489 8795 8796 8798 8804 8803 8797 8887 8888 8798 8797 8799 8805 8804 8798 8888 8889 8799 8798 8800 8806 8805 8799 8889 8890 8800 8799 8801 8807 8806 8800 8890 8891 8801 8800 8802 8819 8807 8801 8891 8892 8802 8801 8818 8820 8819 8802 8892 8893 8818 8802 8804 8809 8808 8803 8805 8810 8809 8804 8806 8811 8810 8805 8807 8821 8811 8806 8819 8822 8821 8807 8809 8813 8812 8808 8810 8814 8813 8809 8811 8824 8814 8810 8821 8825 8824 8811 8813 8816 8815 8812 8814 8828 8816 8813 8824 8829 8828 8814 8816 8833 8817 8815 8828 8834 8833 8816 8833 8840 8839 8817 10520 10526 8820 8818 8893 10604 10520 8818 8820 8823 8822 8819 10526 10531 8823 8820 8822 8826 8825 8821 8823 8827 8826 8822 10531 10535 8827 8823 8825 8830 8829 8824 8826 8831 8830 8825 8827 8832 8831 8826 10535 10538 8832 8827 8829 8835 8834 8828 8830 8836 8835 8829 8831 8837 8836 8830 8832 8838 8837 8831 10538 10540 8838 8832 8834 8841 8840 8833 8835 8842 8841 8834 8836 8843 8842 8835 8845 8851 8850 8844 8936 8937 8845 8844 8846 8852 8851 8845 8937 8938 8846 8845 8847 8853 8852 8846 8938 8939 8847 8846 8848 8854 8853 8847 8939 8940 8848 8847 8849 8869 8854 8848 8940 8941 8849 8848 10556 10562 8869 8849 8941 10636 10556 8849 8851 8856 8855 8850 8852 8857 8856 8851 8853 8858 8857 8852 8854 8870 8858 8853 8869 8871 8870 8854 8856 8860 8859 8855 8857 8861 8860 8856 8858 8862 8861 8857 8870 8872 8862 8858 8860 8864 8863 8859 8861 8865 8864 8860 8862 8874 8865 8861 8872 8875 8874 8862 8864 8867 8866 8863 8865 8877 8867 8864 8874 8878 8877 8865 8867 8881 8868 8866 8877 8882 8881 8867 8881 8888 8887 8868 10562 10568 8871 8869 8871 8873 8872 8870 10568 10573 8873 8871 8873 8876 8875 8872 10573 10577 8876 8873 8875 8879 8878 8874 8876 8880 8879 8875 10577 10580 8880 8876 8878 8883 8882 8877 8879 8884 8883 8878 8880 8885 8884 8879 8880 10580 8886 8885 8882 8889 8888 8881 8883 8890 8889 8882 8884 8891 8890 8883 8885 8892 8891 8884 8886 8893 8892 8885 10582 10604 8893 8886 10581 10582 8886 10580 8895 8901 8900 8894 8990 8991 8895 8894 8896 8902 8901 8895 8991 8992 8896 8895 8897 8903 8902 8896 8992 8993 8897 8896 8898 8904 8903 8897 8993 8994 8898 8897 8899 8918 8904 8898 8994 8995 8899 8898 10610 10616 8918 8899 8995 10713 10610 8899 8901 8906 8905 8900 8902 8907 8906 8901 8903 8908 8907 8902 8904 8919 8908 8903 8918 8920 8919 8904 8906 8910 8909 8905 8907 8911 8910 8906 8908 8921 8911 8907 8919 8922 8921 8908 8910 8913 8912 8909 8911 8914 8913 8910 8921 8924 8914 8911 8913 8916 8915 8912 8914 8927 8916 8913 8924 8928 8927 8914 8916 8931 8917 8915 8927 8932 8931 8916 8931 8937 8936 8917 10616 10621 8920 8918 8920 8923 8922 8919 10621 10625 8923 8920 8922 8925 8924 8921 8923 8926 8925 8922 10625 10629 8926 8923 8925 8929 8928 8924 8926 8930 8929 8925 10629 10632 8930 8926 8928 8933 8932 8927 8929 8934 8933 8928 8930 8935 8934 8929 10632 10634 8935 8930 8932 8938 8937 8931 8933 8939 8938 8932 8934 8940 8939 8933 8935 8941 8940 8934 10634 10636 8941 8935 8943 8948 8947 8942 9052 9053 8943 8942 8944 8949 8948 8943 9053 9054 8944 8943 8945 8950 8949 8944 9054 9055 8945 8944 8946 8951 8950 8945 9055 9056 8946 8945 8966 8967 8951 8946 9056 9057 8966 8946 8948 8953 8952 8947 8949 8954 8953 8948 8950 8955 8954 8949 8951 8968 8955 8950 8967 8969 8968 8951 8953 8957 8956 8952 8954 8958 8957 8953 8955 8970 8958 8954 8968 8971 8970 8955 8957 8960 8959 8956 8958 8961 8960 8957 8970 8973 8961 8958 8960 8963 8962 8959 8961 8976 8963 8960 8973 8977 8976 8961 8963 8980 8964 8962 8976 8981 8980 8963 8980 8985 8965 8964 8985 8991 8990 8965 10665 10671 8967 8966 9057 10767 10665 8966 10671 10676 8969 8967 8969 8972 8971 8968 10676 10680 8972 8969 8971 8974 8973 8970 8972 8975 8974 8971 10680 10684 8975 8972 8974 8978 8977 8973 8975 8979 8978 8974 10684 10687 8979 8975 8977 8982 8981 8976 8978 8983 8982 8977 8979 8984 8983 8978 10687 10689 8984 8979 8981 8986 8985 8980 8982 8987 8986 8981 8983 8988 8987 8982 8984 8989 8988 8983 10689 10691 8989 8984 8986 8992 8991 8985 8987 8993 8992 8986 8988 8994 8993 8987 8989 8995 8994 8988 10691 10713 8995 8989 8997 9003 9002 8996 9114 9115 8997 8996 8998 9004 9003 8997 9115 9116 8998 8997 8999 9005 9004 8998 9116 9117 8999 8998 9000 9006 9005 8999 9117 9118 9000 8999 9001 9026 9006 9000 9118 9119 9001 9000 9025 9027 9026 9001 9119 9120 9025 9001 9003 9008 9007 9002 9004 9009 9008 9003 9005 9010 9009 9004 9006 9011 9010 9005 9026 9028 9011 9006 9008 9013 9012 9007 9009 9014 9013 9008 9010 9015 9014 9009 9011 9030 9015 9010 9028 9031 9030 9011 9013 9017 9016 9012 9014 9018 9017 9013 9015 9033 9018 9014 9030 9034 9033 9015 9017 9020 9019 9016 9018 9021 9020 9017 9033 9037 9021 9018 9020 9023 9022 9019 9021 9041 9023 9020 9037 9042 9041 9021 9023 9046 9024 9022 9041 9047 9046 9023 10719 10724 9027 9025 9120 10820 10719 9025 9027 9029 9028 9026 10724 10729 9029 9027 9029 9032 9031 9028 10729 10733 9032 9029 9031 9035 9034 9030 9032 9036 9035 9031 10733 10736 9036 9032 9034 9038 9037 9033 9035 9039 9038 9034 9036 9040 9039 9035 10736 10739 9040 9036 9038 9043 9042 9037 9039 9044 9043 9038 9040 9045 9044 9039 10739 10741 9045 9040 9042 9048 9047 9041 9043 9049 9048 9042 9044 9050 9049 9043 9045 9051 9050 9044 10741 10742 9051 9045 9047 9053 9052 9046 9048 9054 9053 9047 9049 9055 9054 9048 9050 9056 9055 9049 9051 9057 9056 9050 10742 10767 9057 9051 9059 9065 9064 9058 9169 9170 9059 9058 9060 9066 9065 9059 9170 9171 9060 9059 9061 9067 9066 9060 9171 9172 9061 9060 9062 9068 9067 9061 9172 9173 9062 9061 9063 9088 9068 9062 9173 9174 9063 9062 9087 9089 9088 9063 9174 10855 9087 9063 9065 9070 9069 9064 9066 9071 9070 9065 9067 9072 9071 9066 9068 9073 9072 9067 9088 9090 9073 9068 9070 9075 9074 9069 9071 9076 9075 9070 9072 9077 9076 9071 9073 9092 9077 9072 9090 9093 9092 9073 9075 9079 9078 9074 9076 9080 9079 9075 9077 9095 9080 9076 9092 9096 9095 9077 9079 9082 9081 9078 9080 9083 9082 9079 9095 9099 9083 9080 9082 9085 9084 9081 9083 9103 9085 9082 9099 9104 9103 9083 9085 9108 9086 9084 9103 9109 9108 9085 9108 9115 9114 9086 10772 10777 9089 9087 10855 10883 10772 9087 9089 9091 9090 9088 10777 10782 9091 9089 9091 9094 9093 9090 10782 10786 9094 9091 9093 9097 9096 9092 9094 9098 9097 9093 10786 10789 9098 9094 9096 9100 9099 9095 9097 9101 9100 9096 9098 9102 9101 9097 10789 10792 9102 9098 9100 9105 9104 9099 9101 9106 9105 9100 9102 9107 9106 9101 10792 10794 9107 9102 9104 9110 9109 9103 9105 9111 9110 9104 9106 9112 9111 9105 9107 9113 9112 9106 10794 10814 9113 9107 9109 9116 9115 9108 9110 9117 9116 9109 9111 9118 9117 9110 9112 9119 9118 9111 9113 9120 9119 9112 10814 10820 9120 9113 9122 9128 9127 9121 9223 9224 9122 9121 9123 9129 9128 9122 9224 9225 9123 9122 9124 9130 9129 9123 9225 9226 9124 9123 9125 9131 9130 9124 9226 9227 9125 9124 9126 9148 9131 9125 9227 9228 9126 9125 10826 10832 9148 9126 9228 10945 10826 9126 9128 9133 9132 9127 9129 9134 9133 9128 9130 9135 9134 9129 9131 9149 9135 9130 9148 9150 9149 9131 9133 9137 9136 9132 9134 9138 9137 9133 9135 9139 9138 9134 9149 9151 9139 9135 9137 9141 9140 9136 9138 9142 9141 9137 9139 9153 9142 9138 9151 9154 9153 9139 9141 9144 9143 9140 9142 9156 9144 9141 9153 9157 9156 9142 9144 9146 9145 9143 9156 9160 9146 9144 9146 9164 9147 9145 9160 9165 9164 9146 9164 9170 9169 9147 10832 10837 9150 9148 9150 9152 9151 9149 10837 10842 9152 9150 9152 9155 9154 9151 10842 10846 9155 9152 9154 9158 9157 9153 9155 9159 9158 9154 10846 10849 9159 9155 9157 9161 9160 9156 9158 9162 9161 9157 9159 9163 9162 9158 10849 10852 9163 9159 9161 9166 9165 9160 9162 9167 9166 9161 9163 9168 9167 9162 10852 10854 9168 9163 9165 9171 9170 9164 9166 9172 9171 9165 9167 9173 9172 9166 9168 9174 9173 9167 10854 10855 9174 9168 9176 9182 9181 9175 9277 9278 9176 9175 9177 9183 9182 9176 9278 9279 9177 9176 9178 9184 9183 9177 9279 9280 9178 9177 9179 9185 9184 9178 9280 9281 9179 9178 9180 9202 9185 9179 9281 9282 9180 9179 10889 10895 9202 9180 9282 11000 10889 9180 9182 9187 9186 9181 9183 9188 9187 9182 9184 9189 9188 9183 9185 9203 9189 9184 9202 9204 9203 9185 9187 9191 9190 9186 9188 9192 9191 9187 9189 9193 9192 9188 9203 9205 9193 9189 9191 9195 9194 9190 9192 9196 9195 9191 9193 9207 9196 9192 9205 9208 9207 9193 9195 9198 9197 9194 9196 9210 9198 9195 9207 9211 9210 9196 9198 9200 9199 9197 9210 9214 9200 9198 9200 9218 9201 9199 9214 9219 9218 9200 9218 9224 9223 9201 10895 10900 9204 9202 9204 9206 9205 9203 10900 10905 9206 9204 9206 9209 9208 9205 10905 10909 9209 9206 9208 9212 9211 9207 9209 9213 9212 9208 10909 10912 9213 9209 9211 9215 9214 9210 9212 9216 9215 9211 9213 9217 9216 9212 10912 10915 9217 9213 9215 9220 9219 9214 9216 9221 9220 9215 9217 9222 9221 9216 10915 10917 9222 9217 9219 9225 9224 9218 9220 9226 9225 9219 9221 9227 9226 9220 9222 9228 9227 9221 10917 10945 9228 9222 9230 9236 9235 9229 9331 9332 9230 9229 9231 9237 9236 9230 9332 9333 9231 9230 9232 9238 9237 9231 9333 9334 9232 9231 9233 9239 9238 9232 9334 9335 9233 9232 9234 9256 9239 9233 9335 9336 9234 9233 10952 10958 9256 9234 9336 11055 10952 9234 9236 9241 9240 9235 9237 9242 9241 9236 9238 9243 9242 9237 9239 9257 9243 9238 9256 9258 9257 9239 9241 9245 9244 9240 9242 9246 9245 9241 9243 9247 9246 9242 9257 9259 9247 9243 9245 9249 9248 9244 9246 9250 9249 9245 9247 9261 9250 9246 9259 9262 9261 9247 9249 9252 9251 9248 9250 9264 9252 9249 9261 9265 9264 9250 9252 9254 9253 9251 9264 9268 9254 9252 9254 9272 9255 9253 9268 9273 9272 9254 9272 9278 9277 9255 10958 10963 9258 9256 9258 9260 9259 9257 10963 10968 9260 9258 9260 9263 9262 9259 10968 10972 9263 9260 9262 9266 9265 9261 9263 9267 9266 9262 10972 10975 9267 9263 9265 9269 9268 9264 9266 9270 9269 9265 9267 9271 9270 9266 10975 10978 9271 9267 9269 9274 9273 9268 9270 9275 9274 9269 9271 9276 9275 9270 10978 10980 9276 9271 9273 9279 9278 9272 9274 9280 9279 9273 9275 9281 9280 9274 9276 9282 9281 9275 10980 11000 9282 9276 9284 9290 9289 9283 9386 9387 9284 9283 9285 9291 9290 9284 9387 9388 9285 9284 9286 9292 9291 9285 9388 9389 9286 9285 9287 9293 9292 9286 9389 9390 9287 9286 9288 9310 9293 9287 9390 9391 9288 9287 11007 11013 9310 9288 9391 11085 11007 9288 9290 9295 9294 9289 9291 9296 9295 9290 9292 9297 9296 9291 9293 9311 9297 9292 9310 9312 9311 9293 9295 9299 9298 9294 9296 9300 9299 9295 9297 9301 9300 9296 9311 9313 9301 9297 9299 9303 9302 9298 9300 9304 9303 9299 9301 9315 9304 9300 9313 9316 9315 9301 9303 9306 9305 9302 9304 9318 9306 9303 9315 9319 9318 9304 9306 9308 9307 9305 9318 9322 9308 9306 9308 9326 9309 9307 9322 9327 9326 9308 9326 9332 9331 9309 11013 11018 9312 9310 9312 9314 9313 9311 11018 11023 9314 9312 9314 9317 9316 9313 11023 11027 9317 9314 9316 9320 9319 9315 9317 9321 9320 9316 11027 11030 9321 9317 9319 9323 9322 9318 9320 9324 9323 9319 9321 9325 9324 9320 11030 11033 9325 9321 9323 9328 9327 9322 9324 9329 9328 9323 9325 9330 9329 9324 11033 11035 9330 9325 9327 9333 9332 9326 9328 9334 9333 9327 9329 9335 9334 9328 9330 9336 9335 9329 11035 11055 9336 9330 9338 9344 9343 9337 9422 9449 9338 9337 9339 9345 9344 9338 9449 9450 9339 9338 9340 9346 9345 9339 9450 9451 9340 9339 9341 9347 9346 9340 9451 9452 9341 9340 9342 9366 9347 9341 9452 9453 9342 9341 9365 9367 9366 9342 9453 9454 9365 9342 9344 9349 9348 9343 9345 9350 9349 9344 9346 9351 9350 9345 9347 9352 9351 9346 9366 9368 9352 9347 9349 9354 9353 9348 9350 9355 9354 9349 9351 9356 9355 9350 9352 9370 9356 9351 9368 9371 9370 9352 9354 9358 9357 9353 9355 9359 9358 9354 9356 9373 9359 9355 9370 9374 9373 9356 9358 9361 9360 9357 9359 9362 9361 9358 9373 9377 9362 9359 9361 9364 9363 9360 9362 9381 9364 9361 9377 9382 9381 9362 9381 9387 9386 9364 11061 11067 9367 9365 9454 11157 11061 9365 9367 9369 9368 9366 11067 11072 9369 9367 9369 9372 9371 9368 11072 11076 9372 9369 9371 9375 9374 9370 9372 9376 9375 9371 11076 11079 9376 9372 9374 9378 9377 9373 9375 9379 9378 9374 9376 9380 9379 9375 11079 11082 9380 9376 9378 9383 9382 9377 9379 9384 9383 9378 9380 9385 9384 9379 11082 11084 9385 9380 9382 9388 9387 9381 9383 9389 9388 9382 9384 9390 9389 9383 9385 9391 9390 9384 11084 11085 9391 9385 9393 9399 9398 9392 9482 9505 9393 9392 9394 9400 9399 9393 9505 9506 9394 9393 9395 9401 9400 9394 9506 9507 9395 9394 9396 9402 9401 9395 9507 9508 9396 9395 9397 9403 9402 9396 9508 9509 9397 9396 9423 9424 9403 9397 9509 9510 9423 9397 9399 9405 9404 9398 9400 9406 9405 9399 9401 9407 9406 9400 9402 9408 9407 9401 9403 9425 9408 9402 9424 9426 9425 9403 9405 9410 9409 9404 9406 9411 9410 9405 9407 9412 9411 9406 9408 9427 9412 9407 9425 9428 9427 9408 9410 9414 9413 9409 9411 9415 9414 9410 9412 9430 9415 9411 9427 9431 9430 9412 9414 9417 9416 9413 9415 9418 9417 9414 9430 9434 9418 9415 9417 9420 9419 9416 9418 9438 9420 9417 9434 9439 9438 9418 9420 9443 9421 9419 9438 9444 9443 9420 9443 9449 9422 9421 11109 11115 9424 9423 9510 11211 11109 9423 11115 11120 9426 9424 9426 9429 9428 9425 11120 11124 9429 9426 9428 9432 9431 9427 9429 9433 9432 9428 11124 11128 9433 9429 9431 9435 9434 9430 9432 9436 9435 9431 9433 9437 9436 9432 11128 11131 9437 9433 9435 9440 9439 9434 9436 9441 9440 9435 9437 9442 9441 9436 11131 11133 9442 9437 9439 9445 9444 9438 9440 9446 9445 9439 9441 9447 9446 9440 9442 9448 9447 9441 11133 11134 9448 9442 9444 9450 9449 9443 9445 9451 9450 9444 9446 9452 9451 9445 9447 9453 9452 9446 9448 9454 9453 9447 11134 11157 9454 9448 9456 9462 9461 9455 9553 9554 9456 9455 9457 9463 9462 9456 9554 9555 9457 9456 9458 9464 9463 9457 9555 9556 9458 9457 9459 9465 9464 9458 9556 9557 9459 9458 9460 9483 9465 9459 9557 9558 9460 9459 11163 11169 9483 9460 9558 11243 11163 9460 9462 9467 9466 9461 9463 9468 9467 9462 9464 9469 9468 9463 9465 9484 9469 9464 9483 9485 9484 9465 9467 9471 9470 9466 9468 9472 9471 9467 9469 9473 9472 9468 9484 9486 9473 9469 9471 9475 9474 9470 9472 9476 9475 9471 9473 9488 9476 9472 9486 9489 9488 9473 9475 9478 9477 9474 9476 9491 9478 9475 9488 9492 9491 9476 9478 9495 9479 9477 9491 9496 9495 9478 9495 9500 9481 9479 9481 9505 9482 9480 9500 9506 9505 9481 11169 11174 9485 9483 9485 9487 9486 9484 11174 11179 9487 9485 9487 9490 9489 9486 11179 11183 9490 9487 9489 9493 9492 9488 9490 9494 9493 9489 11183 11186 9494 9490 9492 9497 9496 9491 9493 9498 9497 9492 9494 9499 9498 9493 11186 11188 9499 9494 9496 9501 9500 9495 9497 9502 9501 9496 9498 9503 9502 9497 9499 9504 9503 9498 11188 11190 9504 9499 9501 9507 9506 9500 9502 9508 9507 9501 9503 9509 9508 9502 9504 9510 9509 9503 11190 11211 9510 9504 9512 9518 9517 9511 9612 9613 9512 9511 9513 9519 9518 9512 9613 9614 9513 9512 9514 9520 9519 9513 9614 9615 9514 9513 9515 9521 9520 9514 9615 9616 9515 9514 9516 9535 9521 9515 9616 9617 9516 9515 11217 11223 9535 9516 9617 11320 11217 9516 9518 9523 9522 9517 9519 9524 9523 9518 9520 9525 9524 9519 9521 9536 9525 9520 9535 9537 9536 9521 9523 9527 9526 9522 9524 9528 9527 9523 9525 9538 9528 9524 9536 9539 9538 9525 9527 9530 9529 9526 9528 9531 9530 9527 9538 9541 9531 9528 9530 9533 9532 9529 9531 9544 9533 9530 9541 9545 9544 9531 9533 9548 9534 9532 9544 9549 9548 9533 9548 9554 9553 9534 11223 11228 9537 9535 9537 9540 9539 9536 11228 11233 9540 9537 9539 9542 9541 9538 9540 9543 9542 9539 11233 11237 9543 9540 9542 9546 9545 9541 9543 9547 9546 9542 11237 11240 9547 9543 9545 9550 9549 9544 9546 9551 9550 9545 9547 9552 9551 9546 11240 11242 9552 9547 9549 9555 9554 9548 9550 9556 9555 9549 9551 9557 9556 9550 9552 9558 9557 9551 11242 11243 9558 9552 9560 9567 9566 9559 9642 9659 9560 9559 9561 9568 9567 9560 9659 9660 9561 9560 9562 9569 9568 9561 9660 9661 9562 9561 9563 9570 9569 9562 9661 9662 9563 9562 9564 9571 9570 9563 9662 9663 9564 9563 9565 9590 9571 9564 9663 9664 9565 9564 11270 11275 9590 9565 9664 11350 11270 9565 9567 9573 9572 9566 9568 9574 9573 9567 9569 9575 9574 9568 9570 9576 9575 9569 9571 9591 9576 9570 9590 9592 9591 9571 9573 9578 9577 9572 9574 9579 9578 9573 9575 9580 9579 9574 9576 9593 9580 9575 9591 9594 9593 9576 9578 9582 9581 9577 9579 9583 9582 9578 9580 9596 9583 9579 9593 9597 9596 9580 9582 9585 9584 9581 9583 9586 9585 9582 9596 9600 9586 9583 9585 9588 9587 9584 9586 9603 9588 9585 9600 9604 9603 9586 9588 9607 9589 9587 9603 9608 9607 9588 9607 9613 9612 9589 11275 11280 9592 9590 9592 9595 9594 9591 11280 11284 9595 9592 9594 9598 9597 9593 9595 9599 9598 9594 11284 11288 9599 9595 9597 9601 9600 9596 9598 9602 9601 9597 9599 11291 9602 9598 11288 11292 11291 9599 9601 9605 9604 9600 9602 9606 9605 9601 11291 11294 9606 9602 9604 9609 9608 9603 9605 9610 9609 9604 9606 9611 9610 9605 11294 11296 9611 9606 9608 9614 9613 9607 9609 9615 9614 9608 9610 9616 9615 9609 9611 9617 9616 9610 11296 11320 9617 9611 9710 11396 11327 9618 11327 11329 9643 9618 9709 9710 9618 9619 9618 9643 9625 9619 9708 9709 9619 9620 9619 9625 9624 9620 9620 9713 9707 9708 9623 9713 9620 9624 9622 9627 9626 9621 9711 9712 9622 9621 9623 9628 9627 9622 9712 9713 9623 9622 9624 9629 9628 9623 9625 9630 9629 9624 9643 9644 9630 9625 9627 9632 9631 9626 9628 9633 9632 9627 9629 9634 9633 9628 9630 9645 9634 9629 9644 9646 9645 9630 9632 9636 9635 9631 9633 9637 9636 9632 9634 9647 9637 9633 9645 9648 9647 9634 9636 9639 9638 9635 9637 9650 9639 9636 9647 9651 9650 9637 9639 9654 9641 9638 9650 9655 9654 9639 9641 9659 9642 9640 9654 9660 9659 9641 11329 11335 9644 9643 11335 11340 9646 9644 9646 9649 9648 9645 11340 11344 9649 9646 9648 9652 9651 9647 9649 9653 9652 9648 11344 11347 9653 9649 9651 9656 9655 9650 9652 9657 9656 9651 9653 9658 9657 9652 11347 11349 9658 9653 9655 9661 9660 9654 9656 9662 9661 9655 9657 9663 9662 9656 9658 9664 9663 9657 11349 11350 9664 9658 9666 9672 9671 9665 9762 9763 9666 9665 9667 9673 9672 9666 9763 9764 9667 9666 9668 9674 9673 9667 9764 9765 9668 9667 9669 9689 9674 9668 9765 9766 9669 9668 9688 9690 9689 9669 9766 9767 9688 9669 9671 9676 9675 9670 9672 9677 9676 9671 9673 9678 9677 9672 9674 9691 9678 9673 9689 9692 9691 9674 9676 9680 9679 9675 9677 9681 9680 9676 9678 9694 9681 9677 9691 9695 9694 9678 9680 9683 9682 9679 9681 9684 9683 9680 9694 9698 9684 9681 9683 9686 9685 9682 9684 9702 9686 9683 9698 9703 9702 9684 9686 9706 9687 9685 9702 9707 9706 9686 9706 9712 9711 9687 11374 11380 9690 9688 9767 11475 11374 9688 9690 9693 9692 9689 11380 11385 9693 9690 9692 9696 9695 9691 9693 9697 9696 9692 11385 11389 9697 9693 9695 9699 9698 9694 9696 9700 9699 9695 9697 9701 9700 9696 11389 11392 9701 9697 9699 9704 9703 9698 9700 9705 9704 9699 9701 11394 9705 9700 11392 11395 11394 9701 9703 9708 9707 9702 9704 9709 9708 9703 9705 9710 9709 9704 11394 11396 9710 9705 9707 9713 9712 9706 9715 9721 9720 9714 9795 9818 9715 9714 9716 9722 9721 9715 9818 9819 9716 9715 9717 9723 9722 9716 9819 9820 9717 9716 9718 9724 9723 9717 9820 9821 9718 9717 9719 9741 9724 9718 9821 9822 9719 9718 11423 11429 9741 9719 9822 11504 11423 9719 9721 9726 9725 9720 9722 9727 9726 9721 9723 9728 9727 9722 9724 9729 9728 9723 9741 9742 9729 9724 9726 9731 9730 9725 9727 9732 9731 9726 9728 9733 9732 9727 9729 9743 9733 9728 9742 9744 9743 9729 9731 9735 9734 9730 9732 9736 9735 9731 9733 9745 9736 9732 9743 9746 9745 9733 9735 9738 9737 9734 9736 9748 9738 9735 9745 9749 9748 9736 9738 9752 9739 9737 9748 9753 9752 9738 9752 9757 9740 9739 9757 9763 9762 9740 11429 11435 9742 9741 11435 11440 9744 9742 9744 9747 9746 9743 11440 11444 9747 9744 9746 9750 9749 9745 9747 9751 9750 9746 11444 11447 9751 9747 9749 9754 9753 9748 9750 9755 9754 9749 9751 9756 9755 9750 11447 11450 9756 9751 9753 9758 9757 9752 9754 9759 9758 9753 9755 9760 9759 9754 9756 9761 9760 9755 11450 11452 9761 9756 9758 9764 9763 9757 9759 9765 9764 9758 9760 9766 9765 9759 9761 9767 9766 9760 11452 11475 9767 9761 9769 9775 9774 9768 9847 9872 9769 9768 9770 9776 9775 9769 9872 9873 9770 9769 9771 9777 9776 9770 9873 9874 9771 9770 9772 9778 9777 9771 9874 9875 9772 9771 9773 9797 9778 9772 9875 9876 9773 9772 9796 9798 9797 9773 9876 9877 9796 9773 9775 9780 9779 9774 9776 9781 9780 9775 9777 9782 9781 9776 9778 9783 9782 9777 9797 9799 9783 9778 9780 9785 9784 9779 9781 9786 9785 9780 9782 9787 9786 9781 9783 9801 9787 9782 9799 9802 9801 9783 9785 9789 9788 9784 9786 9790 9789 9785 9787 9804 9790 9786 9801 9805 9804 9787 9789 9792 9791 9788 9790 9808 9792 9789 9804 9809 9808 9790 9792 9794 9793 9791 9808 9813 9794 9792 9794 9818 9795 9793 9813 9819 9818 9794 11481 11487 9798 9796 9877 11579 11481 9796 9798 9800 9799 9797 11487 11492 9800 9798 9800 9803 9802 9799 11492 11496 9803 9800 9802 9806 9805 9801 9803 9807 9806 9802 11496 11499 9807 9803 9805 9810 9809 9804 9806 9811 9810 9805 9807 9812 9811 9806 11499 11501 9812 9807 9809 9814 9813 9808 9810 9815 9814 9809 9811 9816 9815 9810 9812 9817 9816 9811 11501 11503 9817 9812 9814 9820 9819 9813 9815 9821 9820 9814 9816 9822 9821 9815 9817 11504 9822 9816 11503 11524 11504 9817 9824 9830 9829 9823 9926 9927 9824 9823 9825 9831 9830 9824 9927 9928 9825 9824 9826 9832 9831 9825 9928 9929 9826 9825 9827 9833 9832 9826 9929 9930 9827 9826 9828 9848 9833 9827 9930 9931 9828 9827 11531 11537 9848 9828 9931 11630 11531 9828 9830 9835 9834 9829 9831 9836 9835 9830 9832 9837 9836 9831 9833 9849 9837 9832 9848 9850 9849 9833 9835 9839 9838 9834 9836 9840 9839 9835 9837 9851 9840 9836 9849 9852 9851 9837 9839 9842 9841 9838 9840 9843 9842 9839 9851 9854 9843 9840 9842 9845 9844 9841 9843 9857 9845 9842 9854 9858 9857 9843 9845 9861 9846 9844 9857 9862 9861 9845 9861 9867 9866 9846 11537 11542 9850 9848 9850 9853 9852 9849 11542 11547 9853 9850 9852 9855 9854 9851 9853 9856 9855 9852 11547 11551 9856 9853 9855 9859 9858 9854 9856 9860 9859 9855 11551 11554 9860 9856 9858 9863 9862 9857 9859 9864 9863 9858 9860 9865 9864 9859 11554 11556 9865 9860 9862 9868 9867 9861 9863 9869 9868 9862 9864 9870 9869 9863 9865 9871 9870 9864 11556 11558 9871 9865 9867 9873 9872 9866 9868 9874 9873 9867 9869 9875 9874 9868 9870 9876 9875 9869 9871 9877 9876 9870 11558 11579 9877 9871 9879 9885 9884 9878 9974 9975 9879 9878 9880 9886 9885 9879 9975 9976 9880 9879 9881 9887 9886 9880 9976 9977 9881 9880 9882 9888 9887 9881 9977 9978 9882 9881 9883 9905 9888 9882 9978 9979 9883 9882 11585 11588 9905 9883 9979 11661 11585 9883 9885 9890 9889 9884 9886 9891 9890 9885 9887 9892 9891 9886 9888 9906 9892 9887 9905 9907 9906 9888 9890 9894 9893 9889 9891 9895 9894 9890 9892 9896 9895 9891 9906 9908 9896 9892 9894 9898 9897 9893 9895 9899 9898 9894 9896 9910 9899 9895 9908 9911 9910 9896 9898 9901 9900 9897 9899 9913 9901 9898 9910 9914 9913 9899 9901 9903 9902 9900 9913 9917 9903 9901 9903 9921 9904 9902 9917 9922 9921 9903 9921 9927 9926 9904 11588 11594 9907 9905 9907 9909 9908 9906 11594 11599 9909 9907 9909 9912 9911 9908 11599 11603 9912 9909 9911 9915 9914 9910 9912 9916 9915 9911 11603 11606 9916 9912 9914 9918 9917 9913 9915 9919 9918 9914 9916 9920 9919 9915 11606 11609 9920 9916 9918 9923 9922 9917 9919 9924 9923 9918 9920 9925 9924 9919 11609 11611 9925 9920 9922 9928 9927 9921 9923 9929 9928 9922 9924 9930 9929 9923 9925 9931 9930 9924 11611 11630 9931 9925 9933 9938 9937 9932 10028 10029 9933 9932 9934 9939 9938 9933 10029 10030 9934 9933 9935 9940 9939 9934 10030 10031 9935 9934 9936 9941 9940 9935 10031 10032 9936 9935 9954 9955 9941 9936 10032 10033 9954 9936 9938 9943 9942 9937 9939 9944 9943 9938 9940 9945 9944 9939 9941 9956 9945 9940 9955 9957 9956 9941 9943 9947 9946 9942 9944 9948 9947 9943 9945 9958 9948 9944 9956 9959 9958 9945 9947 9950 9949 9946 9948 9961 9950 9947 9958 9962 9961 9948 9950 9952 9951 9949 9961 9965 9952 9950 9952 9969 9953 9951 9965 9970 9969 9952 9969 9975 9974 9953 11636 11642 9955 9954 10033 11735 11636 9954 11642 11647 9957 9955 9957 9960 9959 9956 11647 11651 9960 9957 9959 9963 9962 9958 9960 9964 9963 9959 11651 11655 9964 9960 9962 9966 9965 9961 9963 9967 9966 9962 9964 9968 9967 9963 11655 11658 9968 9964 9966 9971 9970 9965 9967 9972 9971 9966 9968 9973 9972 9967 11658 11660 9973 9968 9970 9976 9975 9969 9971 9977 9976 9970 9972 9978 9977 9971 9973 9979 9978 9972 11660 11661 9979 9973 9981 9986 9985 9980 10082 10083 9981 9980 9982 9987 9986 9981 10083 10084 9982 9981 9983 9988 9987 9982 10084 10085 9983 9982 9984 9989 9988 9983 10085 10086 9984 9983 10004 10005 9989 9984 10086 10087 10004 9984 9986 9991 9990 9985 9987 9992 9991 9986 9988 9993 9992 9987 9989 10006 9993 9988 10005 10007 10006 9989 9991 9995 9994 9990 9992 9996 9995 9991 9993 10008 9996 9992 10006 10009 10008 9993 9995 9998 9997 9994 9996 9999 9998 9995 10008 10011 9999 9996 9998 10001 10000 9997 9999 10014 10001 9998 10011 10015 10014 9999 10001 10018 10002 10000 10014 10019 10018 10001 10018 10023 10003 10002 10023 10029 10028 10003 11687 11693 10005 10004 10087 11789 11687 10004 11693 11698 10007 10005 10007 10010 10009 10006 11698 11703 10010 10007 10009 10012 10011 10008 10010 10013 10012 10009 11703 11707 10013 10010 10012 10016 10015 10011 10013 10017 10016 10012 11707 11710 10017 10013 10015 10020 10019 10014 10016 10021 10020 10015 10017 10022 10021 10016 11710 11712 10022 10017 10019 10024 10023 10018 10020 10025 10024 10019 10021 10026 10025 10020 10022 10027 10026 10021 11712 11714 10027 10022 10024 10030 10029 10023 10025 10031 10030 10024 10026 10032 10031 10025 10027 10033 10032 10026 11714 11735 10033 10027 10035 10041 10040 10034 10142 10143 10035 10034 10036 10042 10041 10035 10143 10144 10036 10035 10037 10043 10042 10036 10144 10145 10037 10036 10038 10044 10043 10037 10145 10146 10038 10037 10039 10059 10044 10038 10146 10147 10039 10038 11741 11747 10059 10039 10147 11843 11741 10039 10041 10046 10045 10040 10042 10047 10046 10041 10043 10048 10047 10042 10044 10060 10048 10043 10059 10061 10060 10044 10046 10050 10049 10045 10047 10051 10050 10046 10048 10062 10051 10047 10060 10063 10062 10048 10050 10053 10052 10049 10051 10054 10053 10050 10062 10065 10054 10051 10053 10056 10055 10052 10054 10068 10056 10053 10065 10069 10068 10054 10056 10072 10057 10055 10068 10073 10072 10056 10072 10077 10058 10057 10077 10083 10082 10058 11747 11752 10061 10059 10061 10064 10063 10060 11752 11757 10064 10061 10063 10066 10065 10062 10064 10067 10066 10063 11757 11761 10067 10064 10066 10070 10069 10065 10067 10071 10070 10066 11761 11764 10071 10067 10069 10074 10073 10068 10070 10075 10074 10069 10071 10076 10075 10070 11764 11766 10076 10071 10073 10078 10077 10072 10074 10079 10078 10073 10075 10080 10079 10074 10076 10081 10080 10075 11766 11768 10081 10076 10078 10084 10083 10077 10079 10085 10084 10078 10080 10086 10085 10079 10081 10087 10086 10080 11768 11789 10087 10081 10089 10096 10095 10088 10180 10205 10089 10088 10090 10097 10096 10089 10205 10206 10090 10089 10091 10098 10097 10090 10206 10207 10091 10090 10092 10099 10098 10091 10207 10208 10092 10091 10093 10100 10099 10092 10208 10209 10093 10092 10094 10119 10100 10093 10209 10210 10094 10093 11795 11801 10119 10094 10210 11894 11795 10094 10096 10102 10101 10095 10097 10103 10102 10096 10098 10104 10103 10097 10099 10105 10104 10098 10100 10120 10105 10099 10119 10121 10120 10100 10102 10107 10106 10101 10103 10108 10107 10102 10104 10109 10108 10103 10105 10122 10109 10104 10120 10123 10122 10105 10107 10111 10110 10106 10108 10112 10111 10107 10109 10113 10112 10108 10122 10125 10113 10109 10111 10115 10114 10110 10112 10116 10115 10111 10113 10128 10116 10112 10125 10129 10128 10113 10116 10132 10117 10115 10128 10133 10132 10116 10132 10137 10118 10117 10137 10143 10142 10118 11801 11806 10121 10119 10121 10124 10123 10120 11806 11811 10124 10121 10123 10126 10125 10122 10124 10127 10126 10123 11811 11815 10127 10124 10126 10130 10129 10125 10127 10131 10130 10126 11815 11818 10131 10127 10129 10134 10133 10128 10130 10135 10134 10129 10131 10136 10135 10130 11818 11820 10136 10131 10133 10138 10137 10132 10134 10139 10138 10133 10135 10140 10139 10134 10136 10141 10140 10135 11820 11822 10141 10136 10138 10144 10143 10137 10139 10145 10144 10138 10140 10146 10145 10139 10141 10147 10146 10140 11822 11843 10147 10141 10149 10155 10154 10148 10243 10268 10149 10148 10150 10156 10155 10149 10268 10269 10150 10149 10151 10157 10156 10150 10269 10270 10151 10150 10152 10158 10157 10151 10270 10271 10152 10151 10153 10159 10158 10152 10271 10272 10153 10152 10181 10182 10159 10153 10272 10273 10181 10153 10155 10161 10160 10154 10156 10162 10161 10155 10157 10163 10162 10156 10158 10164 10163 10157 10159 10183 10164 10158 10182 10184 10183 10159 10161 10166 10165 10160 10162 10167 10166 10161 10163 10168 10167 10162 10164 10185 10168 10163 10183 10186 10185 10164 10166 10170 10169 10165 10167 10171 10170 10166 10168 10172 10171 10167 10185 10188 10172 10168 10170 10174 10173 10169 10171 10175 10174 10170 10172 10191 10175 10171 10188 10192 10191 10172 10174 10177 10176 10173 10175 10195 10177 10174 10191 10196 10195 10175 10177 10179 10178 10176 10195 10200 10179 10177 10179 10205 10180 10178 10200 10206 10205 10179 11849 11852 10182 10181 10273 11946 11849 10181 11852 11857 10184 10182 10184 10187 10186 10183 11857 11862 10187 10184 10186 10189 10188 10185 10187 10190 10189 10186 11862 11866 10190 10187 10189 10193 10192 10188 10190 10194 10193 10189 11866 11869 10194 10190 10192 10197 10196 10191 10193 10198 10197 10192 10194 10199 10198 10193 11869 11871 10199 10194 10196 10201 10200 10195 10197 10202 10201 10196 10198 10203 10202 10197 10199 10204 10203 10198 11871 11873 10204 10199 10201 10207 10206 10200 10202 10208 10207 10201 10203 10209 10208 10202 10204 10210 10209 10203 11873 11894 10210 10204 10212 10218 10217 10211 10303 10323 10212 10211 10213 10219 10218 10212 10323 10324 10213 10212 10214 10220 10219 10213 10324 10325 10214 10213 10215 10221 10220 10214 10325 10326 10215 10214 10216 10222 10221 10215 10326 10327 10216 10215 10244 10245 10222 10216 10327 11987 10244 10216 10218 10224 10223 10217 10219 10225 10224 10218 10220 10226 10225 10219 10221 10227 10226 10220 10222 10246 10227 10221 10245 10247 10246 10222 10224 10229 10228 10223 10225 10230 10229 10224 10226 10231 10230 10225 10227 10248 10231 10226 10246 10249 10248 10227 10229 10233 10232 10228 10230 10234 10233 10229 10231 10235 10234 10230 10248 10251 10235 10231 10233 10237 10236 10232 10234 10238 10237 10233 10235 10254 10238 10234 10251 10255 10254 10235 10237 10240 10239 10236 10238 10258 10240 10237 10254 10259 10258 10238 10240 10242 10241 10239 10258 10263 10242 10240 10242 10268 10243 10241 10263 10269 10268 10242 11900 11904 10245 10244 11987 12009 11900 10244 11904 11909 10247 10245 10247 10250 10249 10246 11909 11913 10250 10247 10249 10252 10251 10248 10250 10253 10252 10249 11913 11917 10253 10250 10252 10256 10255 10251 10253 10257 10256 10252 11917 11920 10257 10253 10255 10260 10259 10254 10256 10261 10260 10255 10257 10262 10261 10256 11920 11922 10262 10257 10259 10264 10263 10258 10260 10265 10264 10259 10261 10266 10265 10260 10262 10267 10266 10261 11922 11924 10267 10262 10264 10270 10269 10263 10265 10271 10270 10264 10266 10272 10271 10265 10267 10273 10272 10266 11924 11946 10273 10267 10275 10281 10280 10274 10357 10377 10275 10274 10276 10282 10281 10275 10377 10378 10276 10275 10277 10283 10282 10276 10378 10379 10277 10276 10278 10284 10283 10277 10379 10380 10278 10277 10279 10304 10284 10278 10380 10381 10279 10278 11955 11959 10304 10279 10381 12049 11955 10279 10281 10286 10285 10280 10282 10287 10286 10281 10283 10288 10287 10282 10284 10289 10288 10283 10304 10305 10289 10284 10286 10291 10290 10285 10287 10292 10291 10286 10288 10293 10292 10287 10289 10306 10293 10288 10305 10307 10306 10289 10291 10295 10294 10290 10292 10296 10295 10291 10293 10308 10296 10292 10306 10309 10308 10293 10295 10298 10297 10294 10296 10299 10298 10295 10308 10311 10299 10296 10298 10301 10300 10297 10299 10314 10301 10298 10311 10315 10314 10299 10301 10318 10302 10300 10314 10319 10318 10301 10318 10323 10303 10302 11959 11965 10305 10304 11965 11970 10307 10305 10307 10310 10309 10306 11970 11975 10310 10307 10309 10312 10311 10308 10310 10313 10312 10309 11975 11979 10313 10310 10312 10316 10315 10311 10313 10317 10316 10312 11979 11982 10317 10313 10315 10320 10319 10314 10316 10321 10320 10315 10317 10322 10321 10316 11982 11985 10322 10317 10319 10324 10323 10318 10320 10325 10324 10319 10321 10326 10325 10320 10322 10327 10326 10321 11985 11987 10327 10322 10329 10335 10334 10328 10424 10425 10329 10328 10330 10336 10335 10329 10425 10426 10330 10329 10331 10337 10336 10330 10426 10427 10331 10330 10332 10338 10337 10331 10427 10428 10332 10331 10333 10358 10338 10332 10428 10429 10333 10332 12017 12023 10358 10333 10429 12108 12017 10333 10335 10340 10339 10334 10336 10341 10340 10335 10337 10342 10341 10336 10338 10343 10342 10337 10358 10359 10343 10338 10340 10345 10344 10339 10341 10346 10345 10340 10342 10347 10346 10341 10343 10360 10347 10342 10359 10361 10360 10343 10345 10349 10348 10344 10346 10350 10349 10345 10347 10362 10350 10346 10360 10363 10362 10347 10349 10352 10351 10348 10350 10353 10352 10349 10362 10365 10353 10350 10352 10355 10354 10351 10353 10368 10355 10352 10365 10369 10368 10353 10355 10372 10356 10354 10368 10373 10372 10355 10372 10377 10357 10356 12023 12029 10359 10358 12029 12034 10361 10359 10361 10364 10363 10360 12034 12038 10364 10361 10363 10366 10365 10362 10364 10367 10366 10363 12038 12042 10367 10364 10366 10370 10369 10365 10367 10371 10370 10366 12042 12045 10371 10367 10369 10374 10373 10368 10370 10375 10374 10369 10371 10376 10375 10370 12045 12047 10376 10371 10373 10378 10377 10372 10374 10379 10378 10373 10375 10380 10379 10374 10376 10381 10380 10375 12047 12049 10381 10376 10383 10388 10387 10382 10472 10473 10383 10382 10384 10389 10388 10383 10473 10474 10384 10383 10385 10390 10389 10384 10474 10475 10385 10384 10386 10391 10390 10385 10475 10476 10386 10385 10405 10406 10391 10386 10476 10477 10405 10386 10388 10393 10392 10387 10389 10394 10393 10388 10390 10395 10394 10389 10391 10407 10395 10390 10406 10408 10407 10391 10393 10397 10396 10392 10394 10398 10397 10393 10395 10409 10398 10394 10407 10410 10409 10395 10397 10400 10399 10396 10398 10401 10400 10397 10409 10412 10401 10398 10400 10403 10402 10399 10401 10415 10403 10400 10412 10416 10415 10401 10403 10419 10404 10402 10415 10420 10419 10403 10419 10425 10424 10404 12083 12089 10406 10405 10477 12175 12083 10405 12089 12094 10408 10406 10408 10411 10410 10407 12094 12098 10411 10408 10410 10413 10412 10409 10411 10414 10413 10410 12098 12102 10414 10411 10413 10417 10416 10412 10414 10418 10417 10413 12102 12105 10418 10414 10416 10421 10420 10415 10417 10422 10421 10416 10418 10423 10422 10417 12105 12107 10423 10418 10420 10426 10425 10419 10421 10427 10426 10420 10422 10428 10427 10421 10423 10429 10428 10422 12107 12108 10429 10423 10467 10473 10472 10430 10432 10467 10430 10431 10433 10434 10432 10431 10463 10468 10467 10432 10459 10463 10432 10434 10435 10436 10434 10433 10437 10459 10434 10436 10438 10439 10436 10435 10439 10440 10437 10436 10456 10460 10459 10437 10441 10456 10437 10440 10442 10443 10439 10438 10443 10444 10440 10439 10444 10445 10441 10440 10454 10457 10456 10441 10446 10454 10441 10445 10447 10448 10443 10442 10448 10449 10444 10443 10449 10450 10445 10444 10450 10451 10446 10445 10453 10455 10454 10446 10452 10453 10446 10451 10452 12150 12145 10453 10453 12145 12141 10455 10455 10458 10457 10454 10455 12141 12138 10458 10457 10461 10460 10456 10458 10462 10461 10457 10458 12138 12136 10462 10460 10464 10463 10459 10461 10465 10464 10460 10462 10466 10465 10461 10462 12136 12134 10466 10464 10469 10468 10463 10465 10470 10469 10464 10466 10471 10470 10465 10466 12134 12133 10471 10468 10474 10473 10467 10469 10475 10474 10468 10470 10476 10475 10469 10471 10477 10476 10470 12133 12175 10477 10471 10479 10485 10484 10478 10540 10551 10479 10478 10480 10486 10485 10479 10551 10552 10480 10479 10481 10487 10486 10480 10552 10553 10481 10480 10482 10488 10487 10481 10553 10554 10482 10481 10483 10519 10488 10482 10554 10555 10483 10482 10483 12249 12181 10519 12234 12249 10483 10555 10485 10490 10489 10484 10486 10491 10490 10485 10487 10492 10491 10486 10488 10517 10492 10487 10488 10519 10518 10517 10490 10494 10493 10489 10491 10495 10494 10490 10492 10514 10495 10491 10492 10517 10515 10514 10494 10497 10496 10493 10495 10510 10497 10494 10495 10514 10511 10510 10497 10505 10498 10496 10497 10510 10506 10505 10498 10505 10500 10499 10500 12151 12150 10499 10501 12152 12151 10500 10505 10506 10501 10500 10502 12153 12152 10501 10506 10507 10502 10501 10503 12154 12153 10502 10507 10508 10503 10502 10504 12155 12154 10503 10508 10509 10504 10503 12198 13891 12155 10504 12197 12198 10504 10509 10510 10511 10507 10506 10511 10512 10508 10507 10512 10513 10509 10508 12195 12197 10509 10513 10514 10515 10512 10511 10515 10516 10513 10512 12192 12195 10513 10516 10517 10518 10516 10515 12187 12192 10516 10518 12181 12187 10518 10519 10521 10527 10526 10520 10604 10605 10521 10520 10522 10528 10527 10521 10605 10606 10522 10521 10523 10529 10528 10522 10606 10607 10523 10522 10524 10530 10529 10523 10607 10608 10524 10523 10525 10541 10530 10524 10608 10609 10525 10524 12217 12219 10541 10525 10609 12297 12217 10525 10527 10532 10531 10526 10528 10533 10532 10527 10529 10534 10533 10528 10530 10542 10534 10529 10541 10543 10542 10530 10532 10536 10535 10531 10533 10537 10536 10532 10534 10544 10537 10533 10542 10545 10544 10534 10536 10539 10538 10535 10537 10547 10539 10536 10544 10548 10547 10537 10539 10551 10540 10538 10547 10552 10551 10539 12219 12225 10543 10541 10543 10546 10545 10542 12225 12229 10546 10543 10545 10549 10548 10544 10546 10550 10549 10545 12229 12232 10550 10546 10548 10553 10552 10547 10549 10554 10553 10548 10550 10555 10554 10549 12232 12234 10555 10550 10557 10563 10562 10556 10636 10658 10557 10556 10558 10564 10563 10557 10658 10659 10558 10557 10559 10565 10564 10558 10659 10660 10559 10558 10560 10566 10565 10559 10660 10661 10560 10559 10561 10567 10566 10560 10661 10662 10561 10560 10583 10584 10567 10561 10662 10663 10583 10561 10563 10569 10568 10562 10564 10570 10569 10563 10565 10571 10570 10564 10566 10572 10571 10565 10567 10585 10572 10566 10584 10586 10585 10567 10569 10574 10573 10568 10570 10575 10574 10569 10571 10576 10575 10570 10572 10587 10576 10571 10585 10588 10587 10572 10574 10578 10577 10573 10575 10579 10578 10574 10576 10590 10579 10575 10587 10591 10590 10576 10578 10581 10580 10577 10579 10594 10581 10578 10590 10595 10594 10579 10594 10599 10582 10581 10599 10605 10604 10582 12255 12261 10584 10583 10663 12351 12255 10583 12261 12266 10586 10584 10586 10589 10588 10585 12266 12270 10589 10586 10588 10592 10591 10587 10589 10593 10592 10588 12270 12273 10593 10589 10591 10596 10595 10590 10592 10597 10596 10591 10593 10598 10597 10592 12273 12276 10598 10593 10595 10600 10599 10594 10596 10601 10600 10595 10597 10602 10601 10596 10598 10603 10602 10597 12276 12278 10603 10598 10600 10606 10605 10599 10601 10607 10606 10600 10602 10608 10607 10601 10603 10609 10608 10602 12278 12297 10609 10603 10611 10617 10616 10610 10713 10714 10611 10610 10612 10618 10617 10611 10714 10715 10612 10611 10613 10619 10618 10612 10715 10716 10613 10612 10614 10620 10619 10613 10716 10717 10614 10613 10615 10637 10620 10614 10717 10718 10615 10614 12307 12313 10637 10615 10718 12387 12307 10615 10617 10622 10621 10616 10618 10623 10622 10617 10619 10624 10623 10618 10620 10638 10624 10619 10637 10639 10638 10620 10622 10626 10625 10621 10623 10627 10626 10622 10624 10628 10627 10623 10638 10641 10628 10624 10626 10630 10629 10625 10627 10631 10630 10626 10628 10644 10631 10627 10641 10645 10644 10628 10630 10633 10632 10629 10631 10648 10633 10630 10644 10649 10648 10631 10633 10635 10634 10632 10648 10653 10635 10633 10635 10658 10636 10634 10653 10659 10658 10635 10637 12313 10640 10639 10639 10642 10641 10638 10640 10643 10642 10639 12319 12323 10643 10640 12314 12319 10640 12313 10642 10646 10645 10641 10643 10647 10646 10642 12323 12326 10647 10643 10645 10650 10649 10644 10646 10651 10650 10645 10647 10652 10651 10646 12326 12328 10652 10647 10649 10654 10653 10648 10650 10655 10654 10649 10651 10656 10655 10650 10652 10657 10656 10651 12328 12330 10657 10652 10654 10660 10659 10653 10655 10661 10660 10654 10656 10662 10661 10655 10657 10663 10662 10656 12330 12351 10663 10657 10766 12450 12357 10664 12357 12358 10670 10664 10664 10771 10765 10766 10669 10771 10664 10670 10666 10672 10671 10665 10767 10768 10666 10665 10667 10673 10672 10666 10768 10769 10667 10666 10668 10674 10673 10667 10769 10770 10668 10667 10669 10675 10674 10668 10770 10771 10669 10668 10670 10692 10675 10669 12358 12364 10692 10670 10672 10677 10676 10671 10673 10678 10677 10672 10674 10679 10678 10673 10675 10693 10679 10674 10692 10694 10693 10675 10677 10681 10680 10676 10678 10682 10681 10677 10679 10683 10682 10678 10693 10695 10683 10679 10681 10685 10684 10680 10682 10686 10685 10681 10683 10697 10686 10682 10695 10698 10697 10683 10685 10688 10687 10684 10686 10700 10688 10685 10697 10701 10700 10686 10688 10690 10689 10687 10700 10704 10690 10688 10690 10708 10691 10689 10704 10709 10708 10690 10708 10714 10713 10691 12364 12369 10694 10692 10694 10696 10695 10693 12369 12374 10696 10694 10696 10699 10698 10695 12374 12378 10699 10696 10698 10702 10701 10697 10699 10703 10702 10698 12378 12381 10703 10699 10701 10705 10704 10700 10702 10706 10705 10701 10703 10707 10706 10702 12381 12384 10707 10703 10705 10710 10709 10704 10706 10711 10710 10705 10707 10712 10711 10706 12384 12386 10712 10707 10709 10715 10714 10708 10710 10716 10715 10709 10711 10717 10716 10710 10712 10718 10717 10711 12386 12387 10718 10712 10720 10725 10724 10719 10820 10821 10720 10719 10721 10726 10725 10720 10821 10822 10721 10720 10722 10727 10726 10721 10822 10823 10722 10721 10723 10728 10727 10722 10823 10824 10723 10722 10743 10744 10728 10723 10824 10825 10743 10723 10725 10730 10729 10724 10726 10731 10730 10725 10727 10732 10731 10726 10728 10745 10732 10727 10744 10746 10745 10728 10730 10734 10733 10729 10731 10735 10734 10730 10732 10747 10735 10731 10745 10748 10747 10732 10734 10737 10736 10733 10735 10738 10737 10734 10747 10750 10738 10735 10737 10740 10739 10736 10738 10753 10740 10737 10750 10754 10753 10738 10740 10757 10741 10739 10753 10758 10757 10740 10757 10762 10742 10741 10762 10768 10767 10742 12421 12427 10744 10743 10825 12524 12421 10743 12427 12433 10746 10744 10746 10749 10748 10745 12433 12438 10749 10746 10748 10751 10750 10747 10749 10752 10751 10748 12438 12442 10752 10749 10751 10755 10754 10750 10752 10756 10755 10751 12442 12445 10756 10752 10754 10759 10758 10753 10755 10760 10759 10754 10756 10761 10760 10755 12445 12448 10761 10756 10758 10763 10762 10757 10759 10764 10763 10758 10760 10765 10764 10759 10761 10766 10765 10760 12448 12450 10766 10761 10763 10769 10768 10762 10764 10770 10769 10763 10765 10771 10770 10764 10773 10778 10777 10772 10883 10884 10773 10772 10774 10779 10778 10773 10884 10885 10774 10773 10775 10780 10779 10774 10885 10886 10775 10774 10776 10781 10780 10775 10886 10887 10776 10775 10795 10796 10781 10776 10887 10888 10795 10776 10778 10783 10782 10777 10779 10784 10783 10778 10780 10785 10784 10779 10781 10797 10785 10780 10796 10798 10797 10781 10783 10787 10786 10782 10784 10788 10787 10783 10785 10799 10788 10784 10797 10800 10799 10785 10787 10790 10789 10786 10788 10791 10790 10787 10799 10802 10791 10788 10790 10793 10792 10789 10791 10805 10793 10790 10802 10806 10805 10791 10793 10809 10794 10792 10805 10810 10809 10793 10809 10815 10814 10794 12476 12482 10796 10795 10888 12576 12476 10795 12482 12487 10798 10796 10798 10801 10800 10797 12487 12492 10801 10798 10800 10803 10802 10799 10801 10804 10803 10800 12492 12496 10804 10801 10803 10807 10806 10802 10804 10808 10807 10803 12496 12499 10808 10804 10806 10811 10810 10805 10807 10812 10811 10806 10808 10813 10812 10807 12499 12501 10813 10808 10810 10816 10815 10809 10811 10817 10816 10810 10812 10818 10817 10811 10813 10819 10818 10812 12501 12503 10819 10813 10815 10821 10820 10814 10816 10822 10821 10815 10817 10823 10822 10816 10818 10824 10823 10817 10819 10825 10824 10818 12503 12524 10825 10819 10827 10833 10832 10826 10945 10946 10827 10826 10828 10834 10833 10827 10946 10947 10828 10827 10829 10835 10834 10828 10947 10948 10829 10828 10830 10836 10835 10829 10948 10949 10830 10829 10831 10857 10836 10830 10949 10950 10831 10830 10856 10858 10857 10831 10950 10951 10856 10831 10833 10838 10837 10832 10834 10839 10838 10833 10835 10840 10839 10834 10836 10841 10840 10835 10857 10859 10841 10836 10838 10843 10842 10837 10839 10844 10843 10838 10840 10845 10844 10839 10841 10861 10845 10840 10859 10862 10861 10841 10843 10847 10846 10842 10844 10848 10847 10843 10845 10864 10848 10844 10861 10865 10864 10845 10847 10850 10849 10846 10848 10851 10850 10847 10864 10868 10851 10848 10850 10853 10852 10849 10851 10872 10853 10850 10868 10873 10872 10851 10853 10877 10854 10852 10872 10878 10877 10853 10877 10883 10855 10854 12530 12534 10858 10856 10951 12627 12530 10856 10858 10860 10859 10857 12534 12539 10860 10858 10860 10863 10862 10859 12539 12544 10863 10860 10862 10866 10865 10861 10863 10867 10866 10862 12544 12548 10867 10863 10865 10869 10868 10864 10866 10870 10869 10865 10867 10871 10870 10866 12548 12551 10871 10867 10869 10874 10873 10868 10870 10875 10874 10869 10871 10876 10875 10870 12551 12553 10876 10871 10873 10879 10878 10872 10874 10880 10879 10873 10875 10881 10880 10874 10876 10882 10881 10875 12553 12554 10882 10876 10878 10884 10883 10877 10879 10885 10884 10878 10880 10886 10885 10879 10881 10887 10886 10880 10882 10888 10887 10881 12554 12576 10888 10882 10890 10896 10895 10889 11000 11001 10890 10889 10891 10897 10896 10890 11001 11002 10891 10890 10892 10898 10897 10891 11002 11003 10892 10891 10893 10899 10898 10892 11003 11004 10893 10892 10894 10919 10899 10893 11004 11005 10894 10893 10918 10920 10919 10894 11005 11006 10918 10894 10896 10901 10900 10895 10897 10902 10901 10896 10898 10903 10902 10897 10899 10904 10903 10898 10919 10921 10904 10899 10901 10906 10905 10900 10902 10907 10906 10901 10903 10908 10907 10902 10904 10923 10908 10903 10921 10924 10923 10904 10906 10910 10909 10905 10907 10911 10910 10906 10908 10926 10911 10907 10923 10927 10926 10908 10910 10913 10912 10909 10911 10914 10913 10910 10926 10930 10914 10911 10913 10916 10915 10912 10914 10934 10916 10913 10930 10935 10934 10914 10916 10939 10917 10915 10934 10940 10939 10916 10939 10946 10945 10917 12582 12585 10920 10918 11006 12687 12582 10918 10920 10922 10921 10919 12585 12590 10922 10920 10922 10925 10924 10921 12590 12595 10925 10922 10924 10928 10927 10923 10925 10929 10928 10924 12595 12599 10929 10925 10927 10931 10930 10926 10928 10932 10931 10927 10929 10933 10932 10928 12599 12602 10933 10929 10931 10936 10935 10930 10932 10937 10936 10931 10933 10938 10937 10932 12602 12604 10938 10933 10935 10941 10940 10934 10936 10942 10941 10935 10937 10943 10942 10936 10938 10944 10943 10937 12604 12605 10944 10938 10940 10947 10946 10939 10941 10948 10947 10940 10942 10949 10948 10941 10943 10950 10949 10942 10944 10951 10950 10943 12605 12627 10951 10944 10953 10959 10958 10952 11055 11056 10953 10952 10954 10960 10959 10953 11056 11057 10954 10953 10955 10961 10960 10954 11057 11058 10955 10954 10956 10962 10961 10955 11058 11059 10956 10955 10957 10981 10962 10956 11059 11060 10957 10956 12635 12638 10981 10957 11060 12727 12635 10957 10959 10964 10963 10958 10960 10965 10964 10959 10961 10966 10965 10960 10962 10967 10966 10961 10981 10982 10967 10962 10964 10969 10968 10963 10965 10970 10969 10964 10966 10971 10970 10965 10967 10983 10971 10966 10982 10984 10983 10967 10969 10973 10972 10968 10970 10974 10973 10969 10971 10985 10974 10970 10983 10986 10985 10971 10973 10976 10975 10972 10974 10977 10976 10973 10985 10988 10977 10974 10976 10979 10978 10975 10977 10991 10979 10976 10988 10992 10991 10977 10979 10995 10980 10978 10991 10996 10995 10979 10995 11001 11000 10980 12638 12644 10982 10981 12644 12650 10984 10982 10984 10987 10986 10983 12650 12655 10987 10984 10986 10989 10988 10985 10987 10990 10989 10986 12655 12659 10990 10987 10989 10993 10992 10988 10990 10994 10993 10989 12659 12662 10994 10990 10992 10997 10996 10991 10993 10998 10997 10992 10994 10999 10998 10993 12662 12664 10999 10994 10996 11002 11001 10995 10997 11003 11002 10996 10998 11004 11003 10997 10999 11005 11004 10998 10999 12664 11006 11005 12665 12687 11006 12664 11008 11014 11013 11007 11085 11104 11008 11007 11009 11015 11014 11008 11104 11105 11009 11008 11010 11016 11015 11009 11105 11106 11010 11009 11011 11017 11016 11010 11106 11107 11011 11010 11012 11036 11017 11011 11107 11108 11012 11011 12696 12697 11036 11012 11108 12786 12696 11012 11014 11019 11018 11013 11015 11020 11019 11014 11016 11021 11020 11015 11017 11022 11021 11016 11036 11037 11022 11017 11019 11024 11023 11018 11020 11025 11024 11019 11021 11026 11025 11020 11022 11038 11026 11021 11037 11039 11038 11022 11024 11028 11027 11023 11025 11029 11028 11024 11026 11040 11029 11025 11038 11041 11040 11026 11028 11031 11030 11027 11029 11032 11031 11028 11040 11043 11032 11029 11031 11034 11033 11030 11032 11046 11034 11031 11043 11047 11046 11032 11034 11050 11035 11033 11046 11051 11050 11034 11050 11056 11055 11035 12697 12704 11037 11036 12704 12710 11039 11037 11039 11042 11041 11038 12710 12715 11042 11039 11041 11044 11043 11040 11042 11045 11044 11041 12715 12719 11045 11042 11044 11048 11047 11043 11045 11049 11048 11044 12719 12722 11049 11045 11047 11052 11051 11046 11048 11053 11052 11047 11049 11054 11053 11048 12722 12725 11054 11049 11051 11057 11056 11050 11052 11058 11057 11051 11053 11059 11058 11052 11054 11060 11059 11053 12725 12727 11060 11054 11062 11068 11067 11061 11157 11158 11062 11061 11063 11069 11068 11062 11158 11159 11063 11062 11064 11070 11069 11063 11159 11160 11064 11063 11065 11071 11070 11064 11160 11161 11065 11064 11066 11086 11071 11065 11161 11162 11066 11065 12757 12763 11086 11066 11162 12871 12757 11066 11068 11073 11072 11067 11069 11074 11073 11068 11070 11075 11074 11069 11071 11087 11075 11070 11086 11088 11087 11071 11073 11077 11076 11072 11074 11078 11077 11073 11075 11089 11078 11074 11087 11090 11089 11075 11077 11080 11079 11076 11078 11081 11080 11077 11089 11092 11081 11078 11080 11083 11082 11079 11081 11095 11083 11080 11092 11096 11095 11081 11083 11099 11084 11082 11095 11100 11099 11083 11099 11104 11085 11084 12763 12769 11088 11086 11088 11091 11090 11087 12769 12774 11091 11088 11090 11093 11092 11089 11091 11094 11093 11090 12774 12778 11094 11091 11093 11097 11096 11092 11094 11098 11097 11093 12778 12781 11098 11094 11096 11101 11100 11095 11097 11102 11101 11096 11098 11103 11102 11097 12781 12784 11103 11098 11100 11105 11104 11099 11101 11106 11105 11100 11102 11107 11106 11101 11103 11108 11107 11102 12784 12786 11108 11103 11110 11116 11115 11109 11211 11212 11110 11109 11111 11117 11116 11110 11212 11213 11111 11110 11112 11118 11117 11111 11213 11214 11112 11111 11113 11119 11118 11112 11214 11215 11113 11112 11114 11135 11119 11113 11215 11216 11114 11113 12818 12822 11135 11114 11216 12909 12818 11114 11116 11121 11120 11115 11117 11122 11121 11116 11118 11123 11122 11117 11119 11136 11123 11118 11135 11137 11136 11119 11121 11125 11124 11120 11122 11126 11125 11121 11123 11127 11126 11122 11136 11138 11127 11123 11125 11129 11128 11124 11126 11130 11129 11125 11127 11140 11130 11126 11138 11141 11140 11127 11129 11132 11131 11128 11130 11143 11132 11129 11140 11144 11143 11130 11132 11147 11133 11131 11143 11148 11147 11132 11147 11152 11134 11133 11152 11158 11157 11134 12822 12828 11137 11135 11137 11139 11138 11136 12828 12833 11139 11137 11139 11142 11141 11138 12833 12837 11142 11139 11141 11145 11144 11140 11142 11146 11145 11141 12837 12841 11146 11142 11144 11149 11148 11143 11145 11150 11149 11144 11146 11151 11150 11145 12841 12844 11151 11146 11148 11153 11152 11147 11149 11154 11153 11148 11150 11155 11154 11149 11151 11156 11155 11150 12844 12846 11156 11151 11153 11159 11158 11152 11154 11160 11159 11153 11155 11161 11160 11154 11156 11162 11161 11155 12846 12871 11162 11156 11164 11170 11169 11163 11243 11265 11164 11163 11165 11171 11170 11164 11265 11266 11165 11164 11166 11172 11171 11165 11266 11267 11166 11165 11167 11173 11172 11166 11267 11268 11167 11166 11168 11191 11173 11167 11268 11269 11168 11167 12879 12881 11191 11168 11269 12966 12879 11168 11170 11175 11174 11169 11171 11176 11175 11170 11172 11177 11176 11171 11173 11178 11177 11172 11191 11192 11178 11173 11175 11180 11179 11174 11176 11181 11180 11175 11177 11182 11181 11176 11178 11193 11182 11177 11192 11194 11193 11178 11180 11184 11183 11179 11181 11185 11184 11180 11182 11195 11185 11181 11193 11196 11195 11182 11184 11187 11186 11183 11185 11198 11187 11184 11195 11199 11198 11185 11187 11189 11188 11186 11198 11202 11189 11187 11189 11206 11190 11188 11202 11207 11206 11189 11206 11212 11211 11190 12881 12888 11192 11191 12888 12894 11194 11192 11194 11197 11196 11193 12894 12899 11197 11194 11196 11200 11199 11195 11197 11201 11200 11196 12899 12903 11201 11197 11199 11203 11202 11198 11200 11204 11203 11199 11201 11205 11204 11200 12903 12906 11205 11201 11203 11208 11207 11202 11204 11209 11208 11203 11205 11210 11209 11204 12906 12908 11210 11205 11207 11213 11212 11206 11208 11214 11213 11207 11209 11215 11214 11208 11210 11216 11215 11209 12908 12909 11216 11210 11218 11224 11223 11217 11320 11321 11218 11217 11219 11225 11224 11218 11321 11322 11219 11218 11220 11226 11225 11219 11322 11323 11220 11219 11221 11227 11226 11220 11323 11324 11221 11220 11222 11245 11227 11221 11324 11325 11222 11221 11244 11246 11245 11222 11325 11326 11244 11222 11224 11229 11228 11223 11225 11230 11229 11224 11226 11231 11230 11225 11227 11232 11231 11226 11245 11247 11232 11227 11229 11234 11233 11228 11230 11235 11234 11229 11231 11236 11235 11230 11232 11249 11236 11231 11247 11250 11249 11232 11234 11238 11237 11233 11235 11239 11238 11234 11236 11252 11239 11235 11249 11253 11252 11236 11238 11241 11240 11237 11239 11256 11241 11238 11252 11257 11256 11239 11241 11260 11242 11240 11256 11261 11260 11241 11260 11265 11243 11242 12940 12944 11246 11244 11326 13036 12940 11244 11246 11248 11247 11245 12944 12949 11248 11246 11248 11251 11250 11247 12949 12954 11251 11248 11250 11254 11253 11249 11251 11255 11254 11250 12954 12958 11255 11251 11253 11258 11257 11252 11254 11259 11258 11253 11255 12961 11259 11254 12958 12962 12961 11255 11257 11262 11261 11256 11258 11263 11262 11257 11259 11264 11263 11258 12961 12964 11264 11259 11261 11266 11265 11260 11262 11267 11266 11261 11263 11268 11267 11262 11264 11269 11268 11263 12964 12966 11269 11264 11271 11276 11275 11270 11350 11368 11271 11270 11272 11277 11276 11271 11368 11369 11272 11271 11273 11278 11277 11272 11369 11370 11273 11272 11274 11279 11278 11273 11370 11371 11274 11273 11274 11373 11297 11279 11372 11373 11274 11371 11276 11281 11280 11275 11277 11282 11281 11276 11278 11283 11282 11277 11279 11298 11283 11278 11297 11299 11298 11279 11281 11285 11284 11280 11282 11286 11285 11281 11283 11287 11286 11282 11298 11300 11287 11283 11285 11289 11288 11284 11286 11290 11289 11285 11287 11302 11290 11286 11300 11303 11302 11287 11289 11293 11292 11288 11290 11305 11293 11289 11302 11306 11305 11290 11292 11295 11294 11291 11293 11309 11295 11292 11305 11310 11309 11293 11295 11314 11296 11294 11309 11315 11314 11295 11314 11321 11320 11296 12994 13000 11299 11297 11373 13090 12994 11297 11299 11301 11300 11298 13000 13006 11301 11299 11301 11304 11303 11300 13006 13011 11304 11301 11303 11307 11306 11302 11304 11308 11307 11303 13011 13015 11308 11304 11306 11311 11310 11305 11307 11312 11311 11306 11308 11313 11312 11307 13015 13018 11313 11308 11310 11316 11315 11309 11311 11317 11316 11310 11312 11318 11317 11311 11313 11319 11318 11312 13018 13020 11319 11313 11315 11322 11321 11314 11316 11323 11322 11315 11317 11324 11323 11316 11318 11325 11324 11317 11319 11326 11325 11318 13020 13036 11326 11319 11328 11330 11329 11327 11396 11412 11328 11327 11328 11418 11331 11330 11413 11418 11328 11412 11330 11336 11335 11329 11331 11337 11336 11330 11332 11338 11337 11331 11418 11419 11332 11331 11333 11339 11338 11332 11419 11420 11333 11332 11334 11352 11339 11333 11420 11421 11334 11333 11351 11353 11352 11334 11421 11422 11351 11334 11336 11341 11340 11335 11337 11342 11341 11336 11338 11343 11342 11337 11339 11354 11343 11338 11352 11355 11354 11339 11341 11345 11344 11340 11342 11346 11345 11341 11343 11356 11346 11342 11354 11357 11356 11343 11345 11348 11347 11344 11346 11359 11348 11345 11356 11360 11359 11346 11348 11363 11349 11347 11359 11364 11363 11348 11363 11368 11350 11349 13044 13049 11353 11351 11422 13139 13044 11351 11353 13054 11355 11352 13049 13055 13054 11353 11355 11358 11357 11354 13054 13059 11358 11355 11357 11361 11360 11356 11358 11362 11361 11357 13059 13063 11362 11358 11360 11365 11364 11359 11361 11366 11365 11360 11362 11367 11366 11361 13063 13066 11367 11362 11364 11369 11368 11363 11365 11370 11369 11364 11366 11371 11370 11365 11367 11372 11371 11366 13066 13068 11372 11367 13068 13090 11373 11372 11375 11381 11380 11374 11475 11476 11375 11374 11376 11382 11381 11375 11476 11477 11376 11375 11377 11383 11382 11376 11477 11478 11377 11376 11378 11384 11383 11377 11478 11479 11378 11377 11379 11397 11384 11378 11479 11480 11379 11378 13097 13101 11397 11379 11480 13171 13097 11379 11381 11386 11385 11380 11382 11387 11386 11381 11383 11388 11387 11382 11384 11398 11388 11383 11397 11399 11398 11384 11386 11390 11389 11385 11387 11391 11390 11386 11388 11400 11391 11387 11398 11401 11400 11388 11390 11393 11392 11389 11391 11403 11393 11390 11400 11404 11403 11391 11393 11407 11395 11392 11403 11408 11407 11393 11395 11412 11396 11394 11407 11413 11412 11395 13101 13107 11399 11397 11399 11402 11401 11398 13107 13112 11402 11399 11401 11405 11404 11400 11402 11406 11405 11401 13112 13116 11406 11402 11404 11409 11408 11403 11405 11410 11409 11404 11406 11411 11410 11405 13116 13119 11411 11406 11408 11414 11413 11407 11409 11415 11414 11408 11410 11416 11415 11409 11411 11417 11416 11410 13119 13121 11417 11411 11414 11419 11418 11413 11415 11420 11419 11414 11416 11421 11420 11415 11417 11422 11421 11416 13121 13139 11422 11417 11424 11430 11429 11423 11504 11524 11424 11423 11425 11431 11430 11424 11524 11525 11425 11424 11426 11432 11431 11425 11525 11526 11426 11425 11427 11433 11432 11426 11526 11527 11427 11426 11428 11434 11433 11427 11527 11528 11428 11427 11428 11530 11453 11434 11529 11530 11428 11528 11430 11436 11435 11429 11431 11437 11436 11430 11432 11438 11437 11431 11433 11439 11438 11432 11434 11454 11439 11433 11453 11455 11454 11434 11436 11441 11440 11435 11437 11442 11441 11436 11438 11443 11442 11437 11439 11456 11443 11438 11454 11457 11456 11439 11441 11445 11444 11440 11442 11446 11445 11441 11443 11459 11446 11442 11456 11460 11459 11443 11445 11448 11447 11444 11446 11449 11448 11445 11459 11463 11449 11446 11448 11451 11450 11447 11449 11466 11451 11448 11463 11467 11466 11449 11451 11470 11452 11450 11466 11471 11470 11451 11470 11476 11475 11452 13146 13151 11455 11453 11530 13244 13146 11453 11455 11458 11457 11454 13151 13156 11458 11455 11457 11461 11460 11456 11458 11462 11461 11457 13156 13160 11462 11458 11460 11464 11463 11459 11461 11465 11464 11460 11462 13163 11465 11461 13160 13164 13163 11462 11464 11468 11467 11463 11465 11469 11468 11464 13163 13166 11469 11465 11467 11472 11471 11466 11468 11473 11472 11467 11469 11474 11473 11468 13166 13169 11474 11469 11471 11477 11476 11470 11472 11478 11477 11471 11473 11479 11478 11472 11474 11480 11479 11473 13169 13171 11480 11474 11482 11488 11487 11481 11579 11580 11482 11481 11483 11489 11488 11482 11580 11581 11483 11482 11484 11490 11489 11483 11581 11582 11484 11483 11485 11491 11490 11484 11582 11583 11485 11484 11486 11505 11491 11485 11583 11584 11486 11485 13200 13202 11505 11486 11584 13279 13200 11486 11488 11493 11492 11487 11489 11494 11493 11488 11490 11495 11494 11489 11491 11506 11495 11490 11505 11507 11506 11491 11493 11497 11496 11492 11494 11498 11497 11493 11495 11508 11498 11494 11506 11509 11508 11495 11497 11500 11499 11496 11498 11511 11500 11497 11508 11512 11511 11498 11500 11502 11501 11499 11511 11515 11502 11500 11502 11519 11503 11501 11515 11520 11519 11502 11519 11525 11524 11503 13202 13208 11507 11505 11507 11510 11509 11506 13208 13213 11510 11507 11509 11513 11512 11508 11510 11514 11513 11509 13213 13217 11514 11510 11512 11516 11515 11511 11513 11517 11516 11512 11514 11518 11517 11513 13217 13220 11518 11514 11516 11521 11520 11515 11517 11522 11521 11516 11518 11523 11522 11517 13220 13223 11523 11518 11520 11526 11525 11519 11521 11527 11526 11520 11522 11528 11527 11521 11523 11529 11528 11522 13223 13225 11529 11523 13225 13244 11530 11529 11532 11538 11537 11531 11630 11631 11532 11531 11533 11539 11538 11532 11631 11632 11533 11532 11534 11540 11539 11533 11632 11633 11534 11533 11535 11541 11540 11534 11633 11634 11535 11534 11536 11559 11541 11535 11634 11635 11536 11535 13251 13252 11559 11536 11635 13335 13251 11536 11538 11543 11542 11537 11539 11544 11543 11538 11540 11545 11544 11539 11541 11546 11545 11540 11559 11560 11546 11541 11543 11548 11547 11542 11544 11549 11548 11543 11545 11550 11549 11544 11546 11561 11550 11545 11560 11562 11561 11546 11548 11552 11551 11547 11549 11553 11552 11548 11550 11563 11553 11549 11561 11564 11563 11550 11552 11555 11554 11551 11553 11566 11555 11552 11563 11567 11566 11553 11555 11557 11556 11554 11566 11570 11557 11555 11557 11574 11558 11556 11570 11575 11574 11557 11574 11580 11579 11558 13252 13258 11560 11559 13258 13264 11562 11560 11562 11565 11564 11561 13264 13269 11565 11562 11564 11568 11567 11563 11565 11569 11568 11564 13269 13273 11569 11565 11567 11571 11570 11566 11568 11572 11571 11567 11569 11573 11572 11568 13273 13276 11573 11569 11571 11576 11575 11570 11572 11577 11576 11571 11573 11578 11577 11572 13276 13278 11578 11573 11575 11581 11580 11574 11576 11582 11581 11575 11577 11583 11582 11576 11578 11584 11583 11577 13278 13279 11584 11578 11586 11589 11588 11585 11661 11679 11586 11585 11587 11590 11589 11586 11679 11680 11587 11586 11587 11684 11591 11590 11681 11684 11587 11680 11589 11595 11594 11588 11590 11596 11595 11589 11591 11597 11596 11590 11592 11598 11597 11591 11684 11685 11592 11591 11593 11612 11598 11592 11685 11686 11593 11592 13307 13311 11612 11593 11686 13419 13307 11593 11595 11600 11599 11594 11596 11601 11600 11595 11597 11602 11601 11596 11598 11613 11602 11597 11612 11614 11613 11598 11600 11604 11603 11599 11601 11605 11604 11600 11602 11615 11605 11601 11613 11616 11615 11602 11604 11607 11606 11603 11605 11608 11607 11604 11615 11618 11608 11605 11607 11610 11609 11606 11608 11621 11610 11607 11618 11622 11621 11608 11610 11625 11611 11609 11621 11626 11625 11610 11625 11631 11630 11611 13311 13317 11614 11612 11614 11617 11616 11613 13317 13322 11617 11614 11616 11619 11618 11615 11617 11620 11619 11616 13322 13326 11620 11617 11619 11623 11622 11618 11620 11624 11623 11619 13326 13330 11624 11620 11622 11627 11626 11621 11623 11628 11627 11622 11624 11629 11628 11623 13330 13333 11629 11624 11626 11632 11631 11625 11627 11633 11632 11626 11628 11634 11633 11627 11629 11635 11634 11628 13333 13335 11635 11629 11637 11643 11642 11636 11735 11736 11637 11636 11638 11644 11643 11637 11736 11737 11638 11637 11639 11645 11644 11638 11737 11738 11639 11638 11640 11646 11645 11639 11738 11739 11640 11639 11641 11662 11646 11640 11739 11740 11641 11640 13367 13370 11662 11641 11740 13459 13367 11641 11643 11648 11647 11642 11644 11649 11648 11643 11645 11650 11649 11644 11646 11663 11650 11645 11662 11664 11663 11646 11648 11652 11651 11647 11649 11653 11652 11648 11650 11654 11653 11649 11663 11665 11654 11650 11652 11656 11655 11651 11653 11657 11656 11652 11654 11667 11657 11653 11665 11668 11667 11654 11656 11659 11658 11655 11657 11670 11659 11656 11667 11671 11670 11657 11659 11674 11660 11658 11670 11675 11674 11659 11674 11679 11661 11660 13370 13376 11664 11662 11664 11666 11665 11663 13376 13381 11666 11664 11666 11669 11668 11665 13381 13386 11669 11666 11668 11672 11671 11667 11669 11673 11672 11668 13386 13390 11673 11669 11671 11676 11675 11670 11672 11677 11676 11671 11673 11678 11677 11672 13390 13393 11678 11673 11675 11680 11679 11674 11676 11681 11680 11675 11677 11682 11681 11676 11678 11683 11682 11677 13393 13395 11683 11678 11682 11685 11684 11681 11683 11686 11685 11682 13395 13419 11686 11683 11688 11694 11693 11687 11789 11790 11688 11687 11689 11695 11694 11688 11790 11791 11689 11688 11690 11696 11695 11689 11791 11792 11690 11689 11691 11697 11696 11690 11792 11793 11691 11690 11692 11715 11697 11691 11793 11794 11692 11691 13429 13431 11715 11692 11794 13520 13429 11692 11694 11699 11698 11693 11695 11700 11699 11694 11696 11701 11700 11695 11697 11702 11701 11696 11715 11716 11702 11697 11699 11704 11703 11698 11700 11705 11704 11699 11701 11706 11705 11700 11702 11717 11706 11701 11716 11718 11717 11702 11704 11708 11707 11703 11705 11709 11708 11704 11706 11719 11709 11705 11717 11720 11719 11706 11708 11711 11710 11707 11709 11722 11711 11708 11719 11723 11722 11709 11711 11713 11712 11710 11722 11726 11713 11711 11713 11730 11714 11712 11726 11731 11730 11713 11730 11736 11735 11714 13431 13438 11716 11715 13438 13444 11718 11716 11718 11721 11720 11717 13444 13449 11721 11718 11720 11724 11723 11719 11721 11725 11724 11720 13449 13453 11725 11721 11723 11727 11726 11722 11724 11728 11727 11723 11725 11729 11728 11724 13453 13456 11729 11725 11727 11732 11731 11726 11728 11733 11732 11727 11729 11734 11733 11728 13456 13458 11734 11729 11731 11737 11736 11730 11732 11738 11737 11731 11733 11739 11738 11732 11734 11740 11739 11733 13458 13459 11740 11734 11742 11748 11747 11741 11843 11844 11742 11741 11743 11749 11748 11742 11844 11845 11743 11742 11744 11750 11749 11743 11845 11846 11744 11743 11745 11751 11750 11744 11846 11847 11745 11744 11746 11769 11751 11745 11847 11848 11746 11745 13491 13492 11769 11746 11848 13574 13491 11746 11748 11753 11752 11747 11749 11754 11753 11748 11750 11755 11754 11749 11751 11756 11755 11750 11769 11770 11756 11751 11753 11758 11757 11752 11754 11759 11758 11753 11755 11760 11759 11754 11756 11771 11760 11755 11770 11772 11771 11756 11758 11762 11761 11757 11759 11763 11762 11758 11760 11773 11763 11759 11771 11774 11773 11760 11762 11765 11764 11761 11763 11776 11765 11762 11773 11777 11776 11763 11765 11767 11766 11764 11776 11780 11767 11765 11767 11784 11768 11766 11780 11785 11784 11767 11784 11790 11789 11768 13492 13498 11770 11769 13498 13504 11772 11770 11772 11775 11774 11771 13504 13509 11775 11772 11774 11778 11777 11773 11775 11779 11778 11774 13509 13513 11779 11775 11777 11781 11780 11776 11778 11782 11781 11777 11779 11783 11782 11778 13513 13516 11783 11779 11781 11786 11785 11780 11782 11787 11786 11781 11783 11788 11787 11782 13516 13518 11788 11783 11785 11791 11790 11784 11786 11792 11791 11785 11787 11793 11792 11786 11788 11794 11793 11787 13518 13520 11794 11788 11796 11802 11801 11795 11894 11895 11796 11795 11797 11803 11802 11796 11895 11896 11797 11796 11798 11804 11803 11797 11896 11897 11798 11797 11799 11805 11804 11798 11897 11898 11799 11798 11800 11823 11805 11799 11898 11899 11800 11799 11800 13643 13547 11823 13624 13643 11800 11899 11802 11807 11806 11801 11803 11808 11807 11802 11804 11809 11808 11803 11805 11810 11809 11804 11823 11824 11810 11805 11807 11812 11811 11806 11808 11813 11812 11807 11809 11814 11813 11808 11810 11825 11814 11809 11824 11826 11825 11810 11812 11816 11815 11811 11813 11817 11816 11812 11814 11827 11817 11813 11825 11828 11827 11814 11816 11819 11818 11815 11817 11830 11819 11816 11827 11831 11830 11817 11819 11821 11820 11818 11830 11834 11821 11819 11821 11838 11822 11820 11834 11839 11838 11821 11838 11844 11843 11822 13547 13551 11824 11823 13551 13557 11826 11824 11826 11829 11828 11825 13557 13562 11829 11826 11828 11832 11831 11827 11829 11833 11832 11828 13562 13566 11833 11829 11831 11835 11834 11830 11832 11836 11835 11831 11833 11837 11836 11832 13566 13569 11837 11833 11835 11840 11839 11834 11836 11841 11840 11835 11837 11842 11841 11836 13569 13572 11842 11837 11839 11845 11844 11838 11840 11846 11845 11839 11841 11847 11846 11840 11842 11848 11847 11841 13572 13574 11848 11842 11850 11853 11852 11849 11946 11947 11850 11849 11851 11854 11853 11850 11947 11948 11851 11850 11851 11952 11855 11854 11949 11952 11851 11948 11853 11858 11857 11852 11854 11859 11858 11853 11855 11860 11859 11854 11856 11861 11860 11855 11952 11953 11856 11855 11874 11875 11861 11856 11953 11954 11874 11856 11858 11863 11862 11857 11859 11864 11863 11858 11860 11865 11864 11859 11861 11876 11865 11860 11875 11877 11876 11861 11863 11867 11866 11862 11864 11868 11867 11863 11865 11878 11868 11864 11876 11879 11878 11865 11867 11870 11869 11866 11868 11881 11870 11867 11878 11882 11881 11868 11870 11872 11871 11869 11881 11885 11872 11870 11872 11889 11873 11871 11885 11890 11889 11872 11889 11895 11894 11873 13598 13601 11875 11874 11954 13696 13598 11874 13601 13607 11877 11875 11877 11880 11879 11876 13607 13612 11880 11877 11879 11883 11882 11878 11880 11884 11883 11879 13612 13616 11884 11880 11882 11886 11885 11881 11883 11887 11886 11882 11884 11888 11887 11883 13616 13619 11888 11884 11886 11891 11890 11885 11887 11892 11891 11886 11888 11893 11892 11887 13619 13622 11893 11888 11890 11896 11895 11889 11891 11897 11896 11890 11892 11898 11897 11891 11893 11899 11898 11892 13622 13624 11899 11893 11901 11905 11904 11900 12009 12010 11901 11900 11902 11906 11905 11901 12010 12011 11902 11901 11903 11907 11906 11902 12011 12012 11903 11902 11903 12015 11908 11907 12013 12015 11903 12012 11905 11910 11909 11904 11906 11911 11910 11905 11907 11912 11911 11906 11908 11926 11912 11907 11925 11927 11926 11908 12015 12016 11925 11908 11910 11914 11913 11909 11911 11915 11914 11910 11912 11916 11915 11911 11926 11928 11916 11912 11914 11918 11917 11913 11915 11919 11918 11914 11916 11930 11919 11915 11928 11931 11930 11916 11918 11921 11920 11917 11919 11933 11921 11918 11930 11934 11933 11919 11921 11923 11922 11920 11933 11937 11923 11921 11923 11941 11924 11922 11937 11942 11941 11923 11941 11947 11946 11924 13651 13654 11927 11925 12016 13749 13651 11925 11927 11929 11928 11926 13654 13660 11929 11927 11929 11932 11931 11928 13660 13665 11932 11929 11931 11935 11934 11930 11932 11936 11935 11931 13665 13669 11936 11932 11934 11938 11937 11933 11935 11939 11938 11934 11936 11940 11939 11935 13669 13672 11940 11936 11938 11943 11942 11937 11939 11944 11943 11938 11940 11945 11944 11939 13672 13675 11945 11940 11942 11948 11947 11941 11943 11949 11948 11942 11944 11950 11949 11943 11945 11951 11950 11944 13675 13677 11951 11945 11950 11953 11952 11949 11951 11954 11953 11950 13677 13696 11954 11951 11956 11960 11959 11955 12049 12074 11956 11955 11957 11961 11960 11956 12074 12075 11957 11956 11958 11962 11961 11957 12075 12076 11958 11957 11958 12080 11963 11962 12077 12080 11958 12076 11960 11966 11965 11959 11961 11967 11966 11960 11962 11968 11967 11961 11963 11969 11968 11962 11964 11989 11969 11963 12080 12081 11964 11963 11988 11990 11989 11964 12081 12082 11988 11964 11966 11971 11970 11965 11967 11972 11971 11966 11968 11973 11972 11967 11969 11974 11973 11968 11989 11991 11974 11969 11971 11976 11975 11970 11972 11977 11976 11971 11973 11978 11977 11972 11974 11993 11978 11973 11991 11994 11993 11974 11976 11980 11979 11975 11977 11981 11980 11976 11978 11996 11981 11977 11993 11997 11996 11978 11980 11983 11982 11979 11981 11984 11983 11980 11996 12000 11984 11981 11983 11986 11985 11982 11984 12004 11986 11983 12000 12005 12004 11984 11986 12009 11987 11985 12004 12010 12009 11986 13705 13707 11990 11988 12082 13804 13705 11988 11990 11992 11991 11989 13707 13713 11992 11990 11992 11995 11994 11991 13713 13718 11995 11992 11994 11998 11997 11993 11995 11999 11998 11994 13718 13722 11999 11995 11997 12001 12000 11996 11998 12002 12001 11997 11999 12003 12002 11998 13722 13725 12003 11999 12001 12006 12005 12000 12002 12007 12006 12001 12003 12008 12007 12002 13725 13728 12008 12003 12005 12011 12010 12004 12006 12012 12011 12005 12007 12013 12012 12006 12008 12014 12013 12007 13728 13730 12014 12008 12014 12016 12015 12013 13730 13749 12016 12014 12018 12024 12023 12017 12108 12127 12018 12017 12019 12025 12024 12018 12127 12128 12019 12018 12020 12026 12025 12019 12128 12129 12020 12019 12021 12027 12026 12020 12129 12130 12021 12020 12022 12028 12027 12021 12130 12131 12022 12021 12050 12051 12028 12022 12131 12132 12050 12022 12024 12030 12029 12023 12025 12031 12030 12024 12026 12032 12031 12025 12027 12033 12032 12026 12028 12052 12033 12027 12051 12053 12052 12028 12030 12035 12034 12029 12031 12036 12035 12030 12032 12037 12036 12031 12033 12054 12037 12032 12052 12055 12054 12033 12035 12039 12038 12034 12036 12040 12039 12035 12037 12041 12040 12036 12054 12057 12041 12037 12039 12043 12042 12038 12040 12044 12043 12039 12041 12060 12044 12040 12057 12061 12060 12041 12043 12046 12045 12042 12044 12064 12046 12043 12060 12065 12064 12044 12046 12048 12047 12045 12064 12069 12048 12046 12048 12074 12049 12047 12069 12075 12074 12048 12050 13863 13758 12051 13857 13863 12050 12132 13758 13762 12053 12051 12053 12056 12055 12052 13762 13767 12056 12053 12055 12058 12057 12054 12056 12059 12058 12055 13767 13772 12059 12056 12058 12062 12061 12057 12059 12063 12062 12058 13772 13776 12063 12059 12061 12066 12065 12060 12062 12067 12066 12061 12063 12068 12067 12062 13776 13779 12068 12063 12065 12070 12069 12064 12066 12071 12070 12065 12067 12072 12071 12066 12068 12073 12072 12067 13779 13781 12073 12068 12070 12076 12075 12069 12071 12077 12076 12070 12072 12078 12077 12071 12073 12079 12078 12072 13781 13782 12079 12073 12078 12081 12080 12077 12079 12082 12081 12078 13782 13804 12082 12079 12084 12090 12089 12083 12175 12176 12084 12083 12085 12091 12090 12084 12176 12177 12085 12084 12086 12092 12091 12085 12177 12178 12086 12085 12087 12093 12092 12086 12178 12179 12087 12086 12088 12109 12093 12087 12179 12180 12088 12087 13814 13817 12109 12088 12180 13871 13814 12088 12090 12095 12094 12089 12091 12096 12095 12090 12092 12097 12096 12091 12093 12110 12097 12092 12109 12111 12110 12093 12095 12099 12098 12094 12096 12100 12099 12095 12097 12101 12100 12096 12110 12112 12101 12097 12099 12103 12102 12098 12100 12104 12103 12099 12101 12114 12104 12100 12112 12115 12114 12101 12103 12106 12105 12102 12104 12117 12106 12103 12114 12118 12117 12104 12106 12121 12107 12105 12117 12122 12121 12106 12121 12127 12108 12107 13817 13823 12111 12109 12111 12113 12112 12110 13823 13829 12113 12111 12113 12116 12115 12112 13829 13834 12116 12113 12115 12119 12118 12114 12116 12120 12119 12115 13834 13838 12120 12116 12118 12123 12122 12117 12119 12124 12123 12118 12120 12125 12124 12119 12120 13838 12126 12125 12122 12128 12127 12121 12123 12129 12128 12122 12124 12130 12129 12123 12125 12131 12130 12124 12126 12132 12131 12125 13841 13857 12132 12126 13839 13841 12126 13838 12170 12176 12175 12133 12135 12170 12133 12134 12136 12137 12135 12134 12166 12171 12170 12135 12162 12166 12135 12137 12138 12139 12137 12136 12140 12162 12137 12139 12141 12142 12139 12138 12142 12143 12140 12139 12159 12163 12162 12140 12144 12159 12140 12143 12145 12146 12142 12141 12146 12147 12143 12142 12147 12148 12144 12143 12157 12160 12159 12144 12149 12157 12144 12148 12150 12151 12146 12145 12151 12152 12147 12146 12152 12153 12148 12147 12153 12154 12149 12148 12156 12158 12157 12149 12155 12156 12149 12154 12155 13891 13886 12156 12156 13886 13882 12158 12158 12161 12160 12157 12158 13882 13878 12161 12160 12164 12163 12159 12161 12165 12164 12160 12161 13878 13875 12165 12163 12167 12166 12162 12164 12168 12167 12163 12165 12169 12168 12164 12165 13875 13873 12169 12167 12172 12171 12166 12168 12173 12172 12167 12169 12174 12173 12168 12169 13873 13872 12174 12171 12177 12176 12170 12172 12178 12177 12171 12173 12179 12178 12172 12174 12180 12179 12173 12174 13872 13871 12180 12182 12188 12187 12181 12249 12250 12182 12181 12183 12189 12188 12182 12250 12251 12183 12182 12184 12190 12189 12183 12251 12252 12184 12183 12185 12191 12190 12184 12252 12253 12185 12184 12186 12216 12191 12185 12253 12254 12186 12185 13932 13937 12216 12186 12254 14001 13932 12186 12188 12193 12192 12187 12189 12194 12193 12188 12190 12213 12194 12189 12191 12214 12213 12190 12191 12216 12215 12214 12193 12196 12195 12192 12194 12209 12196 12193 12194 12213 12210 12209 12196 12204 12197 12195 12196 12209 12205 12204 12197 12204 12199 12198 12199 13892 13891 12198 12200 13893 13892 12199 12204 12205 12200 12199 12201 13894 13893 12200 12205 12206 12201 12200 12202 13895 13894 12201 12206 12207 12202 12201 12203 13896 13895 12202 12207 12208 12203 12202 12203 13952 13897 13896 13950 13952 12203 12208 12209 12210 12206 12205 12210 12211 12207 12206 12211 12212 12208 12207 13947 13950 12208 12212 12213 12214 12211 12210 12214 12215 12212 12211 13943 13947 12212 12215 13937 13943 12215 12216 12218 12220 12219 12217 12297 12298 12218 12217 12218 12303 12221 12220 12299 12303 12218 12298 12220 12226 12225 12219 12221 12227 12226 12220 12222 12228 12227 12221 12303 12304 12222 12221 12223 12235 12228 12222 12304 12305 12223 12222 12224 12236 12235 12223 12305 12306 12224 12223 13981 13987 12236 12224 12306 14068 13981 12224 12226 12230 12229 12225 12227 12231 12230 12226 12228 12237 12231 12227 12235 12238 12237 12228 12230 12233 12232 12229 12231 12240 12233 12230 12237 12241 12240 12231 12233 12244 12234 12232 12240 12245 12244 12233 12244 12250 12249 12234 12236 12239 12238 12235 13987 13992 12239 12236 12238 12242 12241 12237 12239 12243 12242 12238 13992 13996 12243 12239 12241 12246 12245 12240 12242 12247 12246 12241 12243 12248 12247 12242 13996 13999 12248 12243 12245 12251 12250 12244 12246 12252 12251 12245 12247 12253 12252 12246 12248 12254 12253 12247 13999 14001 12254 12248 12256 12262 12261 12255 12351 12352 12256 12255 12257 12263 12262 12256 12352 12353 12257 12256 12258 12264 12263 12257 12353 12354 12258 12257 12259 12265 12264 12258 12354 12355 12259 12258 12260 12279 12265 12259 12355 12356 12260 12259 14020 14026 12279 12260 12356 14115 14020 12260 12262 12267 12266 12261 12263 12268 12267 12262 12264 12269 12268 12263 12265 12280 12269 12264 12279 12281 12280 12265 12267 12271 12270 12266 12268 12272 12271 12267 12269 12282 12272 12268 12280 12283 12282 12269 12271 12274 12273 12270 12272 12275 12274 12271 12282 12285 12275 12272 12274 12277 12276 12273 12275 12288 12277 12274 12285 12289 12288 12275 12277 12292 12278 12276 12288 12293 12292 12277 12292 12298 12297 12278 14026 14031 12281 12279 12281 12284 12283 12280 14031 14036 12284 12281 12283 12286 12285 12282 12284 12287 12286 12283 14036 14040 12287 12284 12286 12290 12289 12285 12287 12291 12290 12286 14040 14043 12291 12287 12289 12294 12293 12288 12290 12295 12294 12289 12291 12296 12295 12290 14043 14046 12296 12291 12293 12299 12298 12292 12294 12300 12299 12293 12295 12301 12300 12294 12296 12302 12301 12295 14046 14048 12302 12296 12300 12304 12303 12299 12301 12305 12304 12300 12302 12306 12305 12301 14048 14068 12306 12302 12308 12314 12313 12307 12387 12415 12308 12307 12309 12315 12314 12308 12415 12416 12309 12308 12310 12316 12315 12309 12416 12417 12310 12309 12311 12317 12316 12310 12417 12418 12311 12310 12312 12318 12317 12311 12418 12419 12312 12311 12331 12332 12318 12312 12419 12420 12331 12312 12315 12320 12319 12314 12316 12321 12320 12315 12317 12322 12321 12316 12318 12333 12322 12317 12332 12334 12333 12318 12320 12324 12323 12319 12321 12325 12324 12320 12322 12335 12325 12321 12333 12336 12335 12322 12324 12327 12326 12323 12325 12338 12327 12324 12335 12339 12338 12325 12327 12329 12328 12326 12338 12342 12329 12327 12329 12346 12330 12328 12342 12347 12346 12329 12346 12352 12351 12330 14074 14079 12332 12331 12420 14168 14074 12331 14079 14084 12334 12332 12334 12337 12336 12333 14084 14088 12337 12334 12336 12340 12339 12335 12337 12341 12340 12336 14088 14092 12341 12337 12339 12343 12342 12338 12340 12344 12343 12339 12341 12345 12344 12340 14092 14095 12345 12341 12343 12348 12347 12342 12344 12349 12348 12343 12345 12350 12349 12344 14095 14097 12350 12345 12347 12353 12352 12346 12348 12354 12353 12347 12349 12355 12354 12348 12350 12356 12355 12349 14097 14115 12356 12350 12357 12470 12359 12358 12464 12470 12357 12450 12359 12365 12364 12358 12360 12366 12365 12359 12470 12471 12360 12359 12361 12367 12366 12360 12471 12472 12361 12360 12362 12368 12367 12361 12472 12473 12362 12361 12363 12389 12368 12362 12473 12474 12363 12362 12388 12390 12389 12363 12474 12475 12388 12363 12365 12370 12369 12364 12366 12371 12370 12365 12367 12372 12371 12366 12368 12373 12372 12367 12389 12391 12373 12368 12370 12375 12374 12369 12371 12376 12375 12370 12372 12377 12376 12371 12373 12393 12377 12372 12391 12394 12393 12373 12375 12379 12378 12374 12376 12380 12379 12375 12377 12396 12380 12376 12393 12397 12396 12377 12379 12382 12381 12378 12380 12383 12382 12379 12396 12400 12383 12380 12382 12385 12384 12381 12383 12404 12385 12382 12400 12405 12404 12383 12385 12409 12386 12384 12404 12410 12409 12385 12409 12415 12387 12386 14121 14126 12390 12388 12475 14224 14121 12388 12390 12392 12391 12389 14126 14131 12392 12390 12392 12395 12394 12391 14131 14135 12395 12392 12394 12398 12397 12393 12395 12399 12398 12394 14135 14139 12399 12395 12397 12401 12400 12396 12398 12402 12401 12397 12399 12403 12402 12398 14139 14142 12403 12399 12401 12406 12405 12400 12402 12407 12406 12401 12403 12408 12407 12402 14142 14144 12408 12403 12405 12411 12410 12404 12406 12412 12411 12405 12407 12413 12412 12406 12408 12414 12413 12407 14144 14146 12414 12408 12410 12416 12415 12409 12411 12417 12416 12410 12412 12418 12417 12411 12413 12419 12418 12412 12414 12420 12419 12413 14146 14168 12420 12414 12422 12428 12427 12421 12524 12525 12422 12421 12423 12429 12428 12422 12525 12526 12423 12422 12424 12430 12429 12423 12526 12527 12424 12423 12425 12431 12430 12424 12527 12528 12425 12424 12426 12432 12431 12425 12528 12529 12426 12425 14175 14176 12432 12426 12529 14261 14175 12426 12428 12434 12433 12427 12429 12435 12434 12428 12430 12436 12435 12429 12431 12437 12436 12430 12432 12451 12437 12431 14176 14182 12451 12432 12434 12439 12438 12433 12435 12440 12439 12434 12436 12441 12440 12435 12437 12452 12441 12436 12451 12453 12452 12437 12439 12443 12442 12438 12440 12444 12443 12439 12441 12454 12444 12440 12452 12455 12454 12441 12443 12446 12445 12442 12444 12447 12446 12443 12454 12457 12447 12444 12446 12449 12448 12445 12447 12460 12449 12446 12457 12461 12460 12447 12449 12464 12450 12448 12460 12465 12464 12449 14182 14188 12453 12451 12453 12456 12455 12452 14188 14193 12456 12453 12455 12458 12457 12454 12456 12459 12458 12455 14193 14197 12459 12456 12458 12462 12461 12457 12459 12463 12462 12458 14197 14200 12463 12459 12461 12466 12465 12460 12462 12467 12466 12461 12463 12468 12467 12462 12463 14200 12469 12468 12465 12471 12470 12464 12466 12472 12471 12465 12467 12473 12472 12466 12468 12474 12473 12467 12469 12475 12474 12468 14202 14224 12475 12469 14201 14202 12469 14200 12477 12483 12482 12476 12576 12577 12477 12476 12478 12484 12483 12477 12577 12578 12478 12477 12479 12485 12484 12478 12578 12579 12479 12478 12480 12486 12485 12479 12579 12580 12480 12479 12481 12504 12486 12480 12580 12581 12481 12480 14231 14232 12504 12481 12581 14317 14231 12481 12483 12488 12487 12482 12484 12489 12488 12483 12485 12490 12489 12484 12486 12491 12490 12485 12504 12505 12491 12486 12488 12493 12492 12487 12489 12494 12493 12488 12490 12495 12494 12489 12491 12506 12495 12490 12505 12507 12506 12491 12493 12497 12496 12492 12494 12498 12497 12493 12495 12508 12498 12494 12506 12509 12508 12495 12497 12500 12499 12496 12498 12511 12500 12497 12508 12512 12511 12498 12500 12502 12501 12499 12511 12515 12502 12500 12502 12519 12503 12501 12515 12520 12519 12502 12519 12525 12524 12503 14232 14238 12505 12504 14238 14244 12507 12505 12507 12510 12509 12506 14244 14249 12510 12507 12509 12513 12512 12508 12510 12514 12513 12509 14249 14253 12514 12510 12512 12516 12515 12511 12513 12517 12516 12512 12514 12518 12517 12513 14253 14256 12518 12514 12516 12521 12520 12515 12517 12522 12521 12516 12518 12523 12522 12517 14256 14259 12523 12518 12520 12526 12525 12519 12521 12527 12526 12520 12522 12528 12527 12521 12523 12529 12528 12522 14259 14261 12529 12523 12531 12535 12534 12530 12627 12628 12531 12530 12532 12536 12535 12531 12628 12629 12532 12531 12533 12537 12536 12532 12629 12630 12533 12532 12533 12633 12538 12537 12631 12633 12533 12630 12535 12540 12539 12534 12536 12541 12540 12535 12537 12542 12541 12536 12538 12543 12542 12537 12555 12556 12543 12538 12633 12634 12555 12538 12540 12545 12544 12539 12541 12546 12545 12540 12542 12547 12546 12541 12543 12557 12547 12542 12556 12558 12557 12543 12545 12549 12548 12544 12546 12550 12549 12545 12547 12559 12550 12546 12557 12560 12559 12547 12549 12552 12551 12548 12550 12562 12552 12549 12559 12563 12562 12550 12552 12566 12553 12551 12562 12567 12566 12552 12566 12571 12554 12553 12571 12577 12576 12554 14290 14294 12556 12555 12634 14386 14290 12555 14294 14300 12558 12556 12558 12561 12560 12557 14300 14305 12561 12558 12560 12564 12563 12559 12561 12565 12564 12560 14305 14309 12565 12561 12563 12568 12567 12562 12564 12569 12568 12563 12565 12570 12569 12564 14309 14312 12570 12565 12567 12572 12571 12566 12568 12573 12572 12567 12569 12574 12573 12568 12570 12575 12574 12569 14312 14315 12575 12570 12572 12578 12577 12571 12573 12579 12578 12572 12574 12580 12579 12573 12575 12581 12580 12574 14315 14317 12581 12575 12583 12586 12585 12582 12687 12688 12583 12582 12584 12587 12586 12583 12688 12689 12584 12583 12584 12693 12588 12587 12690 12693 12584 12689 12586 12591 12590 12585 12587 12592 12591 12586 12588 12593 12592 12587 12589 12594 12593 12588 12693 12694 12589 12588 12606 12607 12594 12589 12694 12695 12606 12589 12591 12596 12595 12590 12592 12597 12596 12591 12593 12598 12597 12592 12594 12608 12598 12593 12607 12609 12608 12594 12596 12600 12599 12595 12597 12601 12600 12596 12598 12610 12601 12597 12608 12611 12610 12598 12600 12603 12602 12599 12601 12613 12603 12600 12610 12614 12613 12601 12603 12617 12604 12602 12613 12618 12617 12603 12617 12622 12605 12604 12622 12628 12627 12605 14341 14344 12607 12606 12695 14437 14341 12606 14344 14350 12609 12607 12609 12612 12611 12608 14350 14355 12612 12609 12611 12615 12614 12610 12612 12616 12615 12611 14355 14359 12616 12612 12614 12619 12618 12613 12615 12620 12619 12614 12616 12621 12620 12615 14359 14362 12621 12616 12618 12623 12622 12617 12619 12624 12623 12618 12620 12625 12624 12619 12621 12626 12625 12620 14362 14365 12626 12621 12623 12629 12628 12622 12624 12630 12629 12623 12625 12631 12630 12624 12626 12632 12631 12625 14365 14367 12632 12626 12632 12634 12633 12631 14367 14386 12634 12632 12636 12639 12638 12635 12727 12747 12636 12635 12637 12640 12639 12636 12747 12748 12637 12636 12637 12753 12641 12640 12749 12753 12637 12748 12639 12645 12644 12638 12640 12646 12645 12639 12641 12647 12646 12640 12642 12648 12647 12641 12753 12754 12642 12641 12643 12649 12648 12642 12754 12755 12643 12642 12666 12667 12649 12643 12755 12756 12666 12643 12645 12651 12650 12644 12646 12652 12651 12645 12647 12653 12652 12646 12648 12654 12653 12647 12649 12668 12654 12648 12667 12669 12668 12649 12651 12656 12655 12650 12652 12657 12656 12651 12653 12658 12657 12652 12654 12670 12658 12653 12668 12671 12670 12654 12656 12660 12659 12655 12657 12661 12660 12656 12658 12673 12661 12657 12670 12674 12673 12658 12660 12663 12662 12659 12661 12677 12663 12660 12673 12678 12677 12661 12663 12665 12664 12662 12677 12682 12665 12663 12682 12688 12687 12665 14394 14395 12667 12666 12756 14487 14394 12666 14395 14401 12669 12667 12669 12672 12671 12668 14401 14406 12672 12669 12671 12675 12674 12670 12672 12676 12675 12671 14406 14410 12676 12672 12674 12679 12678 12673 12675 12680 12679 12674 12676 12681 12680 12675 14410 14413 12681 12676 12678 12683 12682 12677 12679 12684 12683 12678 12680 12685 12684 12679 12681 12686 12685 12680 14413 14416 12686 12681 12683 12689 12688 12682 12684 12690 12689 12683 12685 12691 12690 12684 12686 12692 12691 12685 14416 14418 12692 12686 12691 12694 12693 12690 12692 12695 12694 12691 14418 14437 12695 12692 12696 12812 12698 12697 12806 12812 12696 12786 12698 12705 12704 12697 12699 12706 12705 12698 12812 12813 12699 12698 12700 12707 12706 12699 12813 12814 12700 12699 12701 12708 12707 12700 12814 12815 12701 12700 12702 12709 12708 12701 12815 12816 12702 12701 12703 12728 12709 12702 12816 12817 12703 12702 12703 14544 14446 12728 14538 14544 12703 12817 12705 12711 12710 12704 12706 12712 12711 12705 12707 12713 12712 12706 12708 12714 12713 12707 12709 12729 12714 12708 12728 12730 12729 12709 12711 12716 12715 12710 12712 12717 12716 12711 12713 12718 12717 12712 12714 12731 12718 12713 12729 12732 12731 12714 12716 12720 12719 12715 12717 12721 12720 12716 12718 12734 12721 12717 12731 12735 12734 12718 12720 12723 12722 12719 12721 12724 12723 12720 12734 12738 12724 12721 12723 12726 12725 12722 12724 12742 12726 12723 12738 12743 12742 12724 12726 12747 12727 12725 12742 12748 12747 12726 14446 14451 12730 12728 12730 12733 12732 12729 14451 14456 12733 12730 12732 12736 12735 12731 12733 12737 12736 12732 14456 14460 12737 12733 12735 12739 12738 12734 12736 12740 12739 12735 12737 12741 12740 12736 14460 14464 12741 12737 12739 12744 12743 12738 12740 12745 12744 12739 12741 12746 12745 12740 14464 14467 12746 12741 12743 12749 12748 12742 12744 12750 12749 12743 12745 12751 12750 12744 12746 12752 12751 12745 14467 14469 12752 12746 12750 12754 12753 12749 12751 12755 12754 12750 12752 12756 12755 12751 14469 14487 12756 12752 12758 12764 12763 12757 12871 12872 12758 12757 12759 12765 12764 12758 12872 12873 12759 12758 12760 12766 12765 12759 12873 12874 12760 12759 12761 12767 12766 12760 12874 12875 12761 12760 12762 12768 12767 12761 12875 12876 12762 12761 12762 12878 12787 12768 12877 12878 12762 12876 12764 12770 12769 12763 12765 12771 12770 12764 12766 12772 12771 12765 12767 12773 12772 12766 12768 12788 12773 12767 12787 12789 12788 12768 12770 12775 12774 12769 12771 12776 12775 12770 12772 12777 12776 12771 12773 12790 12777 12772 12788 12791 12790 12773 12775 12779 12778 12774 12776 12780 12779 12775 12777 12793 12780 12776 12790 12794 12793 12777 12779 12782 12781 12778 12780 12783 12782 12779 12793 12797 12783 12780 12782 12785 12784 12781 12783 12801 12785 12782 12797 12802 12801 12783 12785 12806 12786 12784 12801 12807 12806 12785 14498 14502 12789 12787 12878 14596 14498 12787 12789 12792 12791 12788 14502 14507 12792 12789 12791 12795 12794 12790 12792 12796 12795 12791 14507 14512 12796 12792 12794 12798 12797 12793 12795 12799 12798 12794 12796 12800 12799 12795 14512 14516 12800 12796 12798 12803 12802 12797 12799 12804 12803 12798 12800 12805 12804 12799 14516 14519 12805 12800 12802 12808 12807 12801 12803 12809 12808 12802 12804 12810 12809 12803 12805 12811 12810 12804 14519 14521 12811 12805 12807 12813 12812 12806 12808 12814 12813 12807 12809 12815 12814 12808 12810 12816 12815 12809 12811 12817 12816 12810 14521 14538 12817 12811 12819 12823 12822 12818 12909 12931 12819 12818 12820 12824 12823 12819 12931 12932 12820 12819 12821 12825 12824 12820 12932 12933 12821 12820 12821 12937 12826 12825 12934 12937 12821 12933 12823 12829 12828 12822 12824 12830 12829 12823 12825 12831 12830 12824 12826 12832 12831 12825 12827 12848 12832 12826 12937 12938 12827 12826 12847 12849 12848 12827 12938 12939 12847 12827 12829 12834 12833 12828 12830 12835 12834 12829 12831 12836 12835 12830 12832 12850 12836 12831 12848 12851 12850 12832 12834 12838 12837 12833 12835 12839 12838 12834 12836 12840 12839 12835 12850 12853 12840 12836 12838 12842 12841 12837 12839 12843 12842 12838 12840 12856 12843 12839 12853 12857 12856 12840 12842 12845 12844 12841 12843 12860 12845 12842 12856 12861 12860 12843 12845 12865 12846 12844 12860 12866 12865 12845 12865 12872 12871 12846 14551 14554 12849 12847 12939 14647 14551 12847 12849 12852 12851 12848 14554 14560 12852 12849 12851 12854 12853 12850 12852 12855 12854 12851 14560 14565 12855 12852 12854 12858 12857 12853 12855 12859 12858 12854 14565 14569 12859 12855 12857 12862 12861 12856 12858 12863 12862 12857 12859 12864 12863 12858 14569 14572 12864 12859 12861 12867 12866 12860 12862 12868 12867 12861 12863 12869 12868 12862 12864 12870 12869 12863 14572 14574 12870 12864 12866 12873 12872 12865 12867 12874 12873 12866 12868 12875 12874 12867 12869 12876 12875 12868 12870 12877 12876 12869 14574 14575 12877 12870 14575 14596 12878 12877 12880 12882 12881 12879 12966 12983 12880 12879 12880 12989 12883 12882 12984 12989 12880 12983 12882 12889 12888 12881 12883 12890 12889 12882 12884 12891 12890 12883 12989 12990 12884 12883 12885 12892 12891 12884 12990 12991 12885 12884 12886 12893 12892 12885 12991 12992 12886 12885 12887 12910 12893 12886 12992 12993 12887 12886 14604 14605 12910 12887 12993 14696 14604 12887 12889 12895 12894 12888 12890 12896 12895 12889 12891 12897 12896 12890 12892 12898 12897 12891 12893 12911 12898 12892 12910 12912 12911 12893 12895 12900 12899 12894 12896 12901 12900 12895 12897 12902 12901 12896 12898 12913 12902 12897 12911 12914 12913 12898 12900 12904 12903 12899 12901 12905 12904 12900 12902 12916 12905 12901 12913 12917 12916 12902 12904 12907 12906 12903 12905 12920 12907 12904 12916 12921 12920 12905 12907 12925 12908 12906 12920 12926 12925 12907 12925 12931 12909 12908 14605 14611 12912 12910 12912 12915 12914 12911 14611 14616 12915 12912 12914 12918 12917 12913 12915 12919 12918 12914 14616 14620 12919 12915 12917 12922 12921 12916 12918 12923 12922 12917 12919 12924 12923 12918 14620 14623 12924 12919 12921 12927 12926 12920 12922 12928 12927 12921 12923 12929 12928 12922 12924 12930 12929 12923 14623 14626 12930 12924 12926 12932 12931 12925 12927 12933 12932 12926 12928 12934 12933 12927 12929 12935 12934 12928 12930 12936 12935 12929 14626 14628 12936 12930 12935 12938 12937 12934 12936 12939 12938 12935 14628 14647 12939 12936 12941 12945 12944 12940 13036 13037 12941 12940 12942 12946 12945 12941 13037 13038 12942 12941 12943 12947 12946 12942 13038 13039 12943 12942 12943 13042 12948 12947 13040 13042 12943 13039 12945 12950 12949 12944 12946 12951 12950 12945 12947 12952 12951 12946 12948 12953 12952 12947 12967 12968 12953 12948 13042 13043 12967 12948 12950 12955 12954 12949 12951 12956 12955 12950 12952 12957 12956 12951 12953 12969 12957 12952 12968 12970 12969 12953 12955 12959 12958 12954 12956 12960 12959 12955 12957 12971 12960 12956 12969 12972 12971 12957 12959 12963 12962 12958 12960 12974 12963 12959 12971 12975 12974 12960 12962 12965 12964 12961 12963 12978 12965 12962 12974 12979 12978 12963 12965 12983 12966 12964 12978 12984 12983 12965 14656 14660 12968 12967 13043 14754 14656 12967 14660 14666 12970 12968 12970 12973 12972 12969 14666 14671 12973 12970 12972 12976 12975 12971 12973 12977 12976 12972 14671 14675 12977 12973 12975 12980 12979 12974 12976 12981 12980 12975 12977 12982 12981 12976 14675 14678 12982 12977 12979 12985 12984 12978 12980 12986 12985 12979 12981 12987 12986 12980 12982 12988 12987 12981 14678 14680 12988 12982 12985 12990 12989 12984 12986 12991 12990 12985 12987 12992 12991 12986 12988 12993 12992 12987 14680 14696 12993 12988 12995 13001 13000 12994 13090 13091 12995 12994 12996 13002 13001 12995 13091 13092 12996 12995 12997 13003 13002 12996 13092 13093 12997 12996 12998 13004 13003 12997 13093 13094 12998 12997 12999 13005 13004 12998 13094 13095 12999 12998 12999 14787 14707 13005 13096 14787 12999 13095 13001 13007 13006 13000 13002 13008 13007 13001 13003 13009 13008 13002 13004 13010 13009 13003 13005 13021 13010 13004 14707 14712 13021 13005 13007 13012 13011 13006 13008 13013 13012 13007 13009 13014 13013 13008 13010 13022 13014 13009 13021 13023 13022 13010 13012 13016 13015 13011 13013 13017 13016 13012 13014 13024 13017 13013 13022 13025 13024 13014 13016 13019 13018 13015 13017 13027 13019 13016 13024 13028 13027 13017 13019 13031 13020 13018 13027 13032 13031 13019 13031 13037 13036 13020 14712 14718 13023 13021 13023 13026 13025 13022 14718 14723 13026 13023 13025 13029 13028 13024 13026 13030 13029 13025 14723 14727 13030 13026 13028 13033 13032 13027 13029 13034 13033 13028 13030 13035 13034 13029 14727 14730 13035 13030 13032 13038 13037 13031 13033 13039 13038 13032 13034 13040 13039 13033 13035 13041 13040 13034 14730 14732 13041 13035 13041 13043 13042 13040 14732 14754 13043 13041 13045 13050 13049 13044 13139 13140 13045 13044 13046 13051 13050 13045 13140 13141 13046 13045 13047 13052 13051 13046 13141 13142 13047 13046 13048 13053 13052 13047 13142 13143 13048 13047 13048 13145 13069 13053 13144 13145 13048 13143 13050 13056 13055 13049 13051 13057 13056 13050 13052 13058 13057 13051 13053 13070 13058 13052 13069 13071 13070 13053 13055 13060 13059 13054 13056 13061 13060 13055 13057 13062 13061 13056 13058 13072 13062 13057 13070 13073 13072 13058 13060 13064 13063 13059 13061 13065 13064 13060 13062 13075 13065 13061 13072 13076 13075 13062 13064 13067 13066 13063 13065 13079 13067 13064 13075 13080 13079 13065 13067 13084 13068 13066 13079 13085 13084 13067 13084 13091 13090 13068 14762 14766 13071 13069 13145 14855 14762 13069 13071 13074 13073 13070 14766 14772 13074 13071 13073 13077 13076 13072 13074 13078 13077 13073 14772 14777 13078 13074 13076 13081 13080 13075 13077 13082 13081 13076 13078 13083 13082 13077 14777 14781 13083 13078 13080 13086 13085 13079 13081 13087 13086 13080 13082 13088 13087 13081 13083 13089 13088 13082 14781 14784 13089 13083 13085 13092 13091 13084 13086 13093 13092 13085 13087 13094 13093 13086 13088 13095 13094 13087 13089 13096 13095 13088 14784 14786 13096 13089 14786 14803 14787 13096 13098 13102 13101 13097 13171 13191 13098 13097 13099 13103 13102 13098 13191 13192 13099 13098 13100 13104 13103 13099 13192 13193 13100 13099 13100 13197 13105 13104 13194 13197 13100 13193 13102 13108 13107 13101 13103 13109 13108 13102 13104 13110 13109 13103 13105 13111 13110 13104 13106 13123 13111 13105 13197 13198 13106 13105 13122 13124 13123 13106 13198 13199 13122 13106 13108 13113 13112 13107 13109 13114 13113 13108 13110 13115 13114 13109 13111 13125 13115 13110 13123 13126 13125 13111 13113 13117 13116 13112 13114 13118 13117 13113 13115 13127 13118 13114 13125 13128 13127 13115 13117 13120 13119 13116 13118 13130 13120 13117 13127 13131 13130 13118 13120 13134 13121 13119 13130 13135 13134 13120 13134 13140 13139 13121 14811 14814 13124 13122 13199 14905 14811 13122 13124 14820 13126 13123 14814 14821 14820 13124 13126 13129 13128 13125 14820 14825 13129 13126 13128 13132 13131 13127 13129 13133 13132 13128 14825 14829 13133 13129 13131 13136 13135 13130 13132 13137 13136 13131 13133 13138 13137 13132 14829 14832 13138 13133 13135 13141 13140 13134 13136 13142 13141 13135 13137 13143 13142 13136 13138 13144 13143 13137 14832 14834 13144 13138 14834 14855 13145 13144 13147 13152 13151 13146 13244 13245 13147 13146 13148 13153 13152 13147 13245 13246 13148 13147 13149 13154 13153 13148 13246 13247 13149 13148 13150 13155 13154 13149 13247 13248 13150 13149 13150 13250 13172 13155 13249 13250 13150 13248 13152 13157 13156 13151 13153 13158 13157 13152 13154 13159 13158 13153 13155 13173 13159 13154 13172 13174 13173 13155 13157 13161 13160 13156 13158 13162 13161 13157 13159 13175 13162 13158 13173 13176 13175 13159 13161 13165 13164 13160 13162 13178 13165 13161 13175 13179 13178 13162 13164 13167 13166 13163 13165 13168 13167 13164 13178 13182 13168 13165 13167 13170 13169 13166 13168 13186 13170 13167 13182 13187 13186 13168 13170 13191 13171 13169 13186 13192 13191 13170 14864 14869 13174 13172 13250 14965 14864 13172 13174 13177 13176 13173 14869 14875 13177 13174 13176 13180 13179 13175 13177 13181 13180 13176 14875 14880 13181 13177 13179 13183 13182 13178 13180 13184 13183 13179 13181 13185 13184 13180 14880 14884 13185 13181 13183 13188 13187 13182 13184 13189 13188 13183 13185 13190 13189 13184 14884 14887 13190 13185 13187 13193 13192 13186 13188 13194 13193 13187 13189 13195 13194 13188 13190 13196 13195 13189 14887 14889 13196 13190 13195 13198 13197 13194 13196 13199 13198 13195 14889 14905 13199 13196 13201 13203 13202 13200 13279 13298 13201 13200 13201 13303 13204 13203 13299 13303 13201 13298 13203 13209 13208 13202 13204 13210 13209 13203 13205 13211 13210 13204 13303 13304 13205 13204 13206 13212 13211 13205 13304 13305 13206 13205 13207 13226 13212 13206 13305 13306 13207 13206 14914 14916 13226 13207 13306 15000 14914 13207 13209 13214 13213 13208 13210 13215 13214 13209 13211 13216 13215 13210 13212 13227 13216 13211 13226 13228 13227 13212 13214 13218 13217 13213 13215 13219 13218 13214 13216 13229 13219 13215 13227 13230 13229 13216 13218 13221 13220 13217 13219 13222 13221 13218 13229 13232 13222 13219 13221 13224 13223 13220 13222 13235 13224 13221 13232 13236 13235 13222 13224 13239 13225 13223 13235 13240 13239 13224 13239 13245 13244 13225 14916 14923 13228 13226 13228 13231 13230 13227 14923 14929 13231 13228 13230 13233 13232 13229 13231 13234 13233 13230 14929 14934 13234 13231 13233 13237 13236 13232 13234 13238 13237 13233 14934 14938 13238 13234 13236 13241 13240 13235 13237 13242 13241 13236 13238 13243 13242 13237 14938 14941 13243 13238 13240 13246 13245 13239 13241 13247 13246 13240 13242 13248 13247 13241 13243 13249 13248 13242 14941 14943 13249 13243 14943 14965 13250 13249 13251 13360 13253 13252 13354 13360 13251 13335 13253 13259 13258 13252 13254 13260 13259 13253 13360 13361 13254 13253 13255 13261 13260 13254 13361 13362 13255 13254 13256 13262 13261 13255 13362 13363 13256 13255 13257 13263 13262 13256 13363 13364 13257 13256 13257 13366 13280 13263 13365 13366 13257 13364 13259 13265 13264 13258 13260 13266 13265 13259 13261 13267 13266 13260 13262 13268 13267 13261 13263 13281 13268 13262 13280 13282 13281 13263 13265 13270 13269 13264 13266 13271 13270 13265 13267 13272 13271 13266 13268 13283 13272 13267 13281 13284 13283 13268 13270 13274 13273 13269 13271 13275 13274 13270 13272 13286 13275 13271 13283 13287 13286 13272 13274 13277 13276 13273 13275 13289 13277 13274 13286 13290 13289 13275 13277 13293 13278 13276 13289 13294 13293 13277 13293 13298 13279 13278 14973 14978 13282 13280 13366 15075 14973 13280 13282 13285 13284 13281 14978 14983 13285 13282 13284 13288 13287 13283 13285 14987 13288 13284 14983 14988 14987 13285 13287 13291 13290 13286 13288 13292 13291 13287 14987 14991 13292 13288 13290 13295 13294 13289 13291 13296 13295 13290 13292 13297 13296 13291 14991 14995 13297 13292 13294 13299 13298 13293 13295 13300 13299 13294 13296 13301 13300 13295 13297 13302 13301 13296 14995 14998 13302 13297 13300 13304 13303 13299 13301 13305 13304 13300 13302 13306 13305 13301 14998 15000 13306 13302 13308 13312 13311 13307 13419 13420 13308 13307 13309 13313 13312 13308 13420 13421 13309 13308 13310 13314 13313 13309 13421 13422 13310 13309 13310 13426 13315 13314 13423 13426 13310 13422 13312 13318 13317 13311 13313 13319 13318 13312 13314 13320 13319 13313 13315 13321 13320 13314 13316 13337 13321 13315 13426 13427 13316 13315 13336 13338 13337 13316 13427 13428 13336 13316 13318 13323 13322 13317 13319 13324 13323 13318 13320 13325 13324 13319 13321 13339 13325 13320 13337 13340 13339 13321 13323 13327 13326 13322 13324 13328 13327 13323 13325 13329 13328 13324 13339 13342 13329 13325 13327 13331 13330 13326 13328 13332 13331 13327 13329 13345 13332 13328 13342 13346 13345 13329 13331 13334 13333 13330 13332 13349 13334 13331 13345 13350 13349 13332 13334 13354 13335 13333 13349 13355 13354 13334 15030 15033 13338 13336 13428 15126 15030 13336 13338 13341 13340 13337 15033 15038 13341 13338 13340 13343 13342 13339 13341 13344 13343 13340 15038 15043 13344 13341 13343 13347 13346 13342 13344 13348 13347 13343 15043 15047 13348 13344 13346 13351 13350 13345 13347 13352 13351 13346 13348 13353 13352 13347 15047 15050 13353 13348 13350 13356 13355 13349 13351 13357 13356 13350 13352 13358 13357 13351 13353 13359 13358 13352 15050 15052 13359 13353 13355 13361 13360 13354 13356 13362 13361 13355 13357 13363 13362 13356 13358 13364 13363 13357 13359 13365 13364 13358 15052 15069 13365 13359 15069 15075 13366 13365 13368 13371 13370 13367 13459 13481 13368 13367 13369 13372 13371 13368 13481 13482 13369 13368 13369 13487 13373 13372 13483 13487 13369 13482 13371 13377 13376 13370 13372 13378 13377 13371 13373 13379 13378 13372 13374 13380 13379 13373 13487 13488 13374 13373 13375 13397 13380 13374 13488 13489 13375 13374 13396 13398 13397 13375 13489 13490 13396 13375 13377 13382 13381 13376 13378 13383 13382 13377 13379 13384 13383 13378 13380 13385 13384 13379 13397 13399 13385 13380 13382 13387 13386 13381 13383 13388 13387 13382 13384 13389 13388 13383 13385 13401 13389 13384 13399 13402 13401 13385 13387 13391 13390 13386 13388 13392 13391 13387 13389 13404 13392 13388 13401 13405 13404 13389 13391 13394 13393 13390 13392 13408 13394 13391 13404 13409 13408 13392 13394 13413 13395 13393 13408 13414 13413 13394 13413 13420 13419 13395 15082 15084 13398 13396 13490 15177 15082 13396 13398 13400 13399 13397 15084 15090 13400 13398 13400 13403 13402 13399 15090 15095 13403 13400 13402 13406 13405 13401 13403 13407 13406 13402 15095 15099 13407 13403 13405 13410 13409 13404 13406 13411 13410 13405 13407 13412 13411 13406 15099 15102 13412 13407 13409 13415 13414 13408 13410 13416 13415 13409 13411 13417 13416 13410 13412 13418 13417 13411 15102 15104 13418 13412 13414 13421 13420 13413 13415 13422 13421 13414 13416 13423 13422 13415 13417 13424 13423 13416 13418 13425 13424 13417 15104 15106 13425 13418 13424 13427 13426 13423 13425 13428 13427 13424 15106 15126 13428 13425 13430 13432 13431 13429 13520 13536 13430 13429 13430 13542 13433 13432 13537 13542 13430 13536 13432 13439 13438 13431 13433 13440 13439 13432 13434 13441 13440 13433 13542 13543 13434 13433 13435 13442 13441 13434 13543 13544 13435 13434 13436 13443 13442 13435 13544 13545 13436 13435 13437 13460 13443 13436 13545 13546 13437 13436 13437 15239 15135 13460 15233 15239 13437 13546 13439 13445 13444 13438 13440 13446 13445 13439 13441 13447 13446 13440 13442 13448 13447 13441 13443 13461 13448 13442 13460 13462 13461 13443 13445 13450 13449 13444 13446 13451 13450 13445 13447 13452 13451 13446 13448 13463 13452 13447 13461 13464 13463 13448 13450 13454 13453 13449 13451 13455 13454 13450 13452 13466 13455 13451 13463 13467 13466 13452 13454 13457 13456 13453 13455 13470 13457 13454 13466 13471 13470 13455 13457 13475 13458 13456 13470 13476 13475 13457 13475 13481 13459 13458 15135 15141 13462 13460 13462 13465 13464 13461 15141 15146 13465 13462 13464 13468 13467 13463 13465 13469 13468 13464 15146 15150 13469 13465 13467 13472 13471 13466 13468 13473 13472 13467 13469 13474 13473 13468 15150 15153 13474 13469 13471 13477 13476 13470 13472 13478 13477 13471 13473 13479 13478 13472 13474 13480 13479 13473 15153 15156 13480 13474 13476 13482 13481 13475 13477 13483 13482 13476 13478 13484 13483 13477 13479 13485 13484 13478 13480 13486 13485 13479 15156 15158 13486 13480 13484 13488 13487 13483 13485 13489 13488 13484 13486 13490 13489 13485 15158 15177 13490 13486 13491 13593 13493 13492 13588 13593 13491 13574 13493 13499 13498 13492 13494 13500 13499 13493 13593 13594 13494 13493 13495 13501 13500 13494 13594 13595 13495 13494 13496 13502 13501 13495 13595 13596 13496 13495 13497 13503 13502 13496 13596 13597 13497 13496 13497 15275 15187 13503 15274 15275 13497 13597 13499 13505 13504 13498 13500 13506 13505 13499 13501 13507 13506 13500 13502 13508 13507 13501 13503 13521 13508 13502 15187 15193 13521 13503 13505 13510 13509 13504 13506 13511 13510 13505 13507 13512 13511 13506 13508 13522 13512 13507 13521 13523 13522 13508 13510 13514 13513 13509 13511 13515 13514 13510 13512 13524 13515 13511 13522 13525 13524 13512 13514 13517 13516 13513 13515 13527 13517 13514 13524 13528 13527 13515 13517 13519 13518 13516 13527 13531 13519 13517 13519 13536 13520 13518 13531 13537 13536 13519 15193 15199 13523 13521 13523 13526 13525 13522 15199 15204 13526 13523 13525 13529 13528 13524 13526 13530 13529 13525 15204 15208 13530 13526 13528 13532 13531 13527 13529 13533 13532 13528 13530 13534 13533 13529 13530 15208 13535 13534 13532 13538 13537 13531 13533 13539 13538 13532 13534 13540 13539 13533 13535 13541 13540 13534 15212 15214 13541 13535 15209 15212 13535 15208 13538 13543 13542 13537 13539 13544 13543 13538 13540 13545 13544 13539 13541 13546 13545 13540 15214 15233 13546 13541 13548 13552 13551 13547 13643 13644 13548 13547 13549 13553 13552 13548 13644 13645 13549 13548 13550 13554 13553 13549 13645 13646 13550 13549 13550 13649 13555 13554 13647 13649 13550 13646 13552 13558 13557 13551 13553 13559 13558 13552 13554 13560 13559 13553 13555 13561 13560 13554 13556 13575 13561 13555 13649 13650 13556 13555 15245 15249 13575 13556 13650 15336 15245 13556 13558 13563 13562 13557 13559 13564 13563 13558 13560 13565 13564 13559 13561 13576 13565 13560 13575 13577 13576 13561 13563 13567 13566 13562 13564 13568 13567 13563 13565 13578 13568 13564 13576 13579 13578 13565 13567 13570 13569 13566 13568 13571 13570 13567 13578 13581 13571 13568 13570 13573 13572 13569 13571 13584 13573 13570 13581 13585 13584 13571 13573 13588 13574 13572 13584 13589 13588 13573 15249 15255 13577 13575 13577 13580 13579 13576 15255 15260 13580 13577 13579 13582 13581 13578 13580 13583 13582 13579 15260 15265 13583 13580 13582 13586 13585 13581 13583 13587 13586 13582 15265 15269 13587 13583 13585 13590 13589 13584 13586 13591 13590 13585 13587 13592 13591 13586 15269 15272 13592 13587 13589 13594 13593 13588 13590 13595 13594 13589 13591 13596 13595 13590 13592 13597 13596 13591 15272 15274 13597 13592 13599 13602 13601 13598 13696 13697 13599 13598 13600 13603 13602 13599 13697 13698 13600 13599 13600 13702 13604 13603 13699 13702 13600 13698 13602 13608 13607 13601 13603 13609 13608 13602 13604 13610 13609 13603 13605 13611 13610 13604 13702 13703 13605 13604 13606 13625 13611 13605 13703 13704 13606 13605 15306 15308 13625 13606 13704 15396 15306 13606 13608 13613 13612 13607 13609 13614 13613 13608 13610 13615 13614 13609 13611 13626 13615 13610 13625 13627 13626 13611 13613 13617 13616 13612 13614 13618 13617 13613 13615 13628 13618 13614 13626 13629 13628 13615 13617 13620 13619 13616 13618 13621 13620 13617 13628 13631 13621 13618 13620 13623 13622 13619 13621 13634 13623 13620 13631 13635 13634 13621 13623 13638 13624 13622 13634 13639 13638 13623 13638 13644 13643 13624 15308 15314 13627 13625 13627 13630 13629 13626 15314 15320 13630 13627 13629 13632 13631 13628 13630 13633 13632 13629 15320 15325 13633 13630 13632 13636 13635 13631 13633 13637 13636 13632 15325 15329 13637 13633 13635 13640 13639 13634 13636 13641 13640 13635 13637 13642 13641 13636 15329 15332 13642 13637 13639 13645 13644 13638 13640 13646 13645 13639 13641 13647 13646 13640 13642 13648 13647 13641 15332 15334 13648 13642 13648 13650 13649 13647 15334 15336 13650 13648 13652 13655 13654 13651 13749 13750 13652 13651 13653 13656 13655 13652 13750 13751 13653 13652 13653 13755 13657 13656 13752 13755 13653 13751 13655 13661 13660 13654 13656 13662 13661 13655 13657 13663 13662 13656 13658 13664 13663 13657 13755 13756 13658 13657 13659 13678 13664 13658 13756 13757 13659 13658 15367 15368 13678 13659 13757 15446 15367 13659 13661 13666 13665 13660 13662 13667 13666 13661 13663 13668 13667 13662 13664 13679 13668 13663 13678 13680 13679 13664 13666 13670 13669 13665 13667 13671 13670 13666 13668 13681 13671 13667 13679 13682 13681 13668 13670 13673 13672 13669 13671 13674 13673 13670 13681 13684 13674 13671 13673 13676 13675 13672 13674 13687 13676 13673 13684 13688 13687 13674 13676 13691 13677 13675 13687 13692 13691 13676 13691 13697 13696 13677 15368 15374 13680 13678 13680 13683 13682 13679 15374 15380 13683 13680 13682 13685 13684 13681 13683 13686 13685 13682 15380 15385 13686 13683 13685 13689 13688 13684 13686 13690 13689 13685 15385 15389 13690 13686 13688 13693 13692 13687 13689 13694 13693 13688 13690 13695 13694 13689 15389 15392 13695 13690 13692 13698 13697 13691 13693 13699 13698 13692 13694 13700 13699 13693 13695 13701 13700 13694 15392 15394 13701 13695 13700 13703 13702 13699 13701 13704 13703 13700 15394 15396 13704 13701 13706 13708 13707 13705 13804 13805 13706 13705 13706 13810 13709 13708 13806 13810 13706 13805 13708 13714 13713 13707 13709 13715 13714 13708 13710 13716 13715 13709 13810 13811 13710 13709 13711 13717 13716 13710 13811 13812 13711 13710 13712 13731 13717 13711 13812 13813 13712 13711 13712 15518 15420 13731 15499 15518 13712 13813 13714 13719 13718 13713 13715 13720 13719 13714 13716 13721 13720 13715 13717 13732 13721 13716 13731 13733 13732 13717 13719 13723 13722 13718 13720 13724 13723 13719 13721 13734 13724 13720 13732 13735 13734 13721 13723 13726 13725 13722 13724 13727 13726 13723 13734 13737 13727 13724 13726 13729 13728 13725 13727 13740 13729 13726 13737 13741 13740 13727 13729 13744 13730 13728 13740 13745 13744 13729 13744 13750 13749 13730 15420 15424 13733 13731 13733 13736 13735 13732 15424 15430 13736 13733 13735 13738 13737 13734 13736 13739 13738 13735 15430 15435 13739 13736 13738 13742 13741 13737 13739 13743 13742 13738 15435 15439 13743 13739 13741 13746 13745 13740 13742 13747 13746 13741 13743 13748 13747 13742 15439 15442 13748 13743 13745 13751 13750 13744 13746 13752 13751 13745 13747 13753 13752 13746 13748 13754 13753 13747 15442 15444 13754 13748 13753 13756 13755 13752 13754 13757 13756 13753 15444 15446 13757 13754 13759 13763 13762 13758 13863 13864 13759 13758 13760 13764 13763 13759 13864 13865 13760 13759 13761 13765 13764 13760 13865 13866 13761 13760 13761 13869 13766 13765 13867 13869 13761 13866 13763 13768 13767 13762 13764 13769 13768 13763 13765 13770 13769 13764 13766 13771 13770 13765 13783 13784 13771 13766 13869 13870 13783 13766 13768 13773 13772 13767 13769 13774 13773 13768 13770 13775 13774 13769 13771 13785 13775 13770 13784 13786 13785 13771 13773 13777 13776 13772 13774 13778 13777 13773 13775 13787 13778 13774 13785 13788 13787 13775 13777 13780 13779 13776 13778 13790 13780 13777 13787 13791 13790 13778 13780 13794 13781 13779 13790 13795 13794 13780 13794 13799 13782 13781 13799 13805 13804 13782 15471 15472 13784 13783 13870 15563 15471 13783 15472 15476 13786 13784 13786 13789 13788 13785 15476 15482 13789 13786 13788 13792 13791 13787 13789 13793 13792 13788 15482 15487 13793 13789 13791 13796 13795 13790 13792 13797 13796 13791 13793 13798 13797 13792 15487 15491 13798 13793 13795 13800 13799 13794 13796 13801 13800 13795 13797 13802 13801 13796 13798 13803 13802 13797 15491 15494 13803 13798 13800 13806 13805 13799 13801 13807 13806 13800 13802 13808 13807 13801 13803 13809 13808 13802 15494 15497 13809 13803 13807 13811 13810 13806 13808 13812 13811 13807 13809 13813 13812 13808 15497 15499 13813 13809 13815 13818 13817 13814 13871 13921 13815 13814 13816 13819 13818 13815 13921 13922 13816 13815 13816 13927 13820 13819 13923 13927 13816 13922 13818 13824 13823 13817 13819 13825 13824 13818 13820 13826 13825 13819 13821 13827 13826 13820 13927 13928 13821 13820 13822 13828 13827 13821 13928 13929 13822 13821 13822 13931 13842 13828 13930 13931 13822 13929 13824 13830 13829 13823 13825 13831 13830 13824 13826 13832 13831 13825 13827 13833 13832 13826 13828 13843 13833 13827 13842 13844 13843 13828 13830 13835 13834 13829 13831 13836 13835 13830 13832 13837 13836 13831 13833 13845 13837 13832 13843 13846 13845 13833 13835 13839 13838 13834 13836 13840 13839 13835 13837 13848 13840 13836 13845 13849 13848 13837 13840 13852 13841 13839 13848 13853 13852 13840 13852 13858 13857 13841 15526 15528 13844 13842 13931 15621 15526 13842 13844 13847 13846 13843 15528 15533 13847 13844 13846 13850 13849 13845 13847 13851 13850 13846 15533 15538 13851 13847 13849 13854 13853 13848 13850 13855 13854 13849 13851 13856 13855 13850 15538 15542 13856 13851 13853 13859 13858 13852 13854 13860 13859 13853 13855 13861 13860 13854 13856 13862 13861 13855 15542 15545 13862 13856 13858 13864 13863 13857 13859 13865 13864 13858 13860 13866 13865 13859 13861 13867 13866 13860 13862 13868 13867 13861 15545 15547 13868 13862 13868 13870 13869 13867 15547 15563 13870 13868 13915 13921 13871 13872 13874 13915 13872 13873 13875 13876 13874 13873 13910 13916 13915 13874 13877 13910 13874 13876 13878 13879 13876 13875 13879 13880 13877 13876 13906 13911 13910 13877 13881 13906 13877 13880 13882 13883 13879 13878 13883 13884 13880 13879 13884 13885 13881 13880 13903 13907 13906 13881 13900 13903 13881 13885 13886 13887 13883 13882 13887 13888 13884 13883 13888 13889 13885 13884 13890 13900 13885 13889 13891 13892 13887 13886 13892 13893 13888 13887 13893 13894 13889 13888 13894 13895 13890 13889 13898 13901 13900 13890 13896 13898 13890 13895 13897 13899 13898 13896 15576 15577 13899 13897 13966 15576 13897 13952 13899 13902 13901 13898 15577 15580 13902 13899 13901 13904 13903 13900 13902 13905 13904 13901 15580 15585 13905 13902 13904 13908 13907 13903 13905 13909 13908 13904 15585 15590 13909 13905 13907 13912 13911 13906 13908 13913 13912 13907 13909 13914 13913 13908 15590 15594 13914 13909 13911 13917 13916 13910 13912 13918 13917 13911 13913 13919 13918 13912 13914 13920 13919 13913 15594 15597 13920 13914 13916 13922 13921 13915 13917 13923 13922 13916 13918 13924 13923 13917 13919 13925 13924 13918 13920 13926 13925 13919 15597 15600 13926 13920 13924 13928 13927 13923 13925 13929 13928 13924 13926 13930 13929 13925 15600 15602 13930 13926 15602 15621 13931 13930 13933 13938 13937 13932 14001 14012 13933 13932 13934 13939 13938 13933 14012 14013 13934 13933 13935 13940 13939 13934 14013 14014 13935 13934 13936 13941 13940 13935 14014 14015 13936 13935 13936 14018 13942 13941 14016 14018 13936 14015 13938 13944 13943 13937 13939 13945 13944 13938 13940 13946 13945 13939 13941 13954 13946 13940 13942 13955 13954 13941 13953 13956 13955 13942 14018 14019 13953 13942 13944 13948 13947 13943 13945 13949 13948 13944 13946 13957 13949 13945 13954 13958 13957 13946 13948 13951 13950 13947 13949 13961 13951 13948 13957 13962 13961 13949 13951 13966 13952 13950 13961 13967 13966 13951 15632 15636 13956 13953 14019 15722 15632 13953 13955 13959 13958 13954 13956 13960 13959 13955 15636 15641 13960 13956 13958 13963 13962 13957 13959 13964 13963 13958 13960 13965 13964 13959 15641 15645 13965 13960 13962 13968 13967 13961 13963 13969 13968 13962 13964 13970 13969 13963 13965 13971 13970 13964 15645 15648 13971 13965 13972 15576 13966 13967 13968 13973 13972 13967 13969 13974 13973 13968 13970 13975 13974 13969 13971 13976 13975 13970 15648 15651 13976 13971 13972 15578 15577 15576 13973 15579 15578 13972 13977 15579 13973 13974 13975 13978 13977 13974 13976 13979 13978 13975 15651 15653 13979 13976 13977 15583 15582 15579 13978 15584 15583 13977 13980 15584 13978 13979 15653 15672 13980 13979 13980 15603 15589 15584 15672 17273 15603 13980 13982 13988 13987 13981 14068 14069 13982 13981 13983 13989 13988 13982 14069 14070 13983 13982 13984 13990 13989 13983 14070 14071 13984 13983 13985 13991 13990 13984 14071 14072 13985 13984 13986 14002 13991 13985 14072 14073 13986 13985 15681 15687 14002 13986 14073 15759 15681 13986 13988 13993 13992 13987 13989 13994 13993 13988 13990 13995 13994 13989 13991 14003 13995 13990 14002 14004 14003 13991 13993 13997 13996 13992 13994 13998 13997 13993 13995 14005 13998 13994 14003 14006 14005 13995 13997 14000 13999 13996 13998 14008 14000 13997 14005 14009 14008 13998 14000 14012 14001 13999 14008 14013 14012 14000 15687 15692 14004 14002 14004 14007 14006 14003 15692 15697 14007 14004 14006 14010 14009 14005 14007 14011 14010 14006 15697 15701 14011 14007 14009 14014 14013 14008 14010 14015 14014 14009 14011 14016 14015 14010 14011 15701 14017 14016 14017 14019 14018 14016 15704 15722 14019 14017 15702 15704 14017 15701 14021 14027 14026 14020 14115 14116 14021 14020 14022 14028 14027 14021 14116 14117 14022 14021 14023 14029 14028 14022 14117 14118 14023 14022 14024 14030 14029 14023 14118 14119 14024 14023 14025 14049 14030 14024 14119 14120 14025 14024 15730 15732 14049 14025 14120 15805 15730 14025 14027 14032 14031 14026 14028 14033 14032 14027 14029 14034 14033 14028 14030 14035 14034 14029 14049 14050 14035 14030 14032 14037 14036 14031 14033 14038 14037 14032 14034 14039 14038 14033 14035 14051 14039 14034 14050 14052 14051 14035 14037 14041 14040 14036 14038 14042 14041 14037 14039 14053 14042 14038 14051 14054 14053 14039 14041 14044 14043 14040 14042 14045 14044 14041 14053 14056 14045 14042 14044 14047 14046 14043 14045 14059 14047 14044 14056 14060 14059 14045 14047 14063 14048 14046 14059 14064 14063 14047 14063 14069 14068 14048 15732 15738 14050 14049 15738 15743 14052 14050 14052 14055 14054 14051 15743 15748 14055 14052 14054 14057 14056 14053 14055 14058 14057 14054 15748 15752 14058 14055 14057 14061 14060 14056 14058 14062 14061 14057 15752 15755 14062 14058 14060 14065 14064 14059 14061 14066 14065 14060 14062 14067 14066 14061 15755 15757 14067 14062 14064 14070 14069 14063 14065 14071 14070 14064 14066 14072 14071 14065 14067 14073 14072 14066 15757 15759 14073 14067 14075 14080 14079 14074 14168 14169 14075 14074 14076 14081 14080 14075 14169 14170 14076 14075 14077 14082 14081 14076 14170 14171 14077 14076 14078 14083 14082 14077 14171 14172 14078 14077 14078 14174 14098 14083 14173 14174 14078 14172 14080 14085 14084 14079 14081 14086 14085 14080 14082 14087 14086 14081 14083 14099 14087 14082 14098 14100 14099 14083 14085 14089 14088 14084 14086 14090 14089 14085 14087 14091 14090 14086 14099 14101 14091 14087 14089 14093 14092 14088 14090 14094 14093 14089 14091 14103 14094 14090 14101 14104 14103 14091 14093 14096 14095 14092 14094 14106 14096 14093 14103 14107 14106 14094 14096 14110 14097 14095 14106 14111 14110 14096 14110 14116 14115 14097 15784 15789 14100 14098 14174 15878 15784 14098 14100 14102 14101 14099 15789 15794 14102 14100 14102 14105 14104 14101 15794 15798 14105 14102 14104 14108 14107 14103 14105 14109 14108 14104 15798 15801 14109 14105 14107 14112 14111 14106 14108 14113 14112 14107 14109 14114 14113 14108 15801 15803 14114 14109 14111 14117 14116 14110 14112 14118 14117 14111 14113 14119 14118 14112 14114 14120 14119 14113 15803 15805 14120 14114 14122 14127 14126 14121 14224 14225 14122 14121 14123 14128 14127 14122 14225 14226 14123 14122 14124 14129 14128 14123 14226 14227 14124 14123 14125 14130 14129 14124 14227 14228 14125 14124 14125 14230 14147 14130 14229 14230 14125 14228 14127 14132 14131 14126 14128 14133 14132 14127 14129 14134 14133 14128 14130 14148 14134 14129 14147 14149 14148 14130 14132 14136 14135 14131 14133 14137 14136 14132 14134 14138 14137 14133 14148 14150 14138 14134 14136 14140 14139 14135 14137 14141 14140 14136 14138 14152 14141 14137 14150 14153 14152 14138 14140 14143 14142 14139 14141 14155 14143 14140 14152 14156 14155 14141 14143 14145 14144 14142 14155 14159 14145 14143 14145 14163 14146 14144 14159 14164 14163 14145 14163 14169 14168 14146 15830 15836 14149 14147 14230 15932 15830 14147 14149 14151 14150 14148 15836 15841 14151 14149 14151 14154 14153 14150 15841 15845 14154 14151 14153 14157 14156 14152 14154 14158 14157 14153 15845 15849 14158 14154 14156 14160 14159 14155 14157 14161 14160 14156 14158 14162 14161 14157 15849 15852 14162 14158 14160 14165 14164 14159 14161 14166 14165 14160 14162 14167 14166 14161 15852 15854 14167 14162 14164 14170 14169 14163 14165 14171 14170 14164 14166 14172 14171 14165 14167 14173 14172 14166 15854 15855 14173 14167 15855 15878 14174 14173 14175 14284 14177 14176 14278 14284 14175 14261 14177 14183 14182 14176 14178 14184 14183 14177 14284 14285 14178 14177 14179 14185 14184 14178 14285 14286 14179 14178 14180 14186 14185 14179 14286 14287 14180 14179 14181 14187 14186 14180 14287 14288 14181 14180 14203 14204 14187 14181 14288 14289 14203 14181 14183 14189 14188 14182 14184 14190 14189 14183 14185 14191 14190 14184 14186 14192 14191 14185 14187 14205 14192 14186 14204 14206 14205 14187 14189 14194 14193 14188 14190 14195 14194 14189 14191 14196 14195 14190 14192 14207 14196 14191 14205 14208 14207 14192 14194 14198 14197 14193 14195 14199 14198 14194 14196 14210 14199 14195 14207 14211 14210 14196 14198 14201 14200 14197 14199 14214 14201 14198 14210 14215 14214 14199 14214 14219 14202 14201 14219 14225 14224 14202 15884 15890 14204 14203 14289 15984 15884 14203 15890 15895 14206 14204 14206 14209 14208 14205 15895 15899 14209 14206 14208 14212 14211 14207 14209 14213 14212 14208 15899 15903 14213 14209 14211 14216 14215 14210 14212 14217 14216 14211 14213 14218 14217 14212 15903 15906 14218 14213 14215 14220 14219 14214 14216 14221 14220 14215 14217 14222 14221 14216 14218 14223 14222 14217 15906 15908 14223 14218 14220 14226 14225 14219 14221 14227 14226 14220 14222 14228 14227 14221 14223 14229 14228 14222 15908 15909 14229 14223 15909 15932 14230 14229 14231 14336 14233 14232 14331 14336 14231 14317 14233 14239 14238 14232 14234 14240 14239 14233 14336 14337 14234 14233 14235 14241 14240 14234 14337 14338 14235 14234 14236 14242 14241 14235 14338 14339 14236 14235 14237 14243 14242 14236 14339 14340 14237 14236 15938 15939 14243 14237 14340 16019 15938 14237 14239 14245 14244 14238 14240 14246 14245 14239 14241 14247 14246 14240 14242 14248 14247 14241 14243 14262 14248 14242 15939 15945 14262 14243 14245 14250 14249 14244 14246 14251 14250 14245 14247 14252 14251 14246 14248 14263 14252 14247 14262 14264 14263 14248 14250 14254 14253 14249 14251 14255 14254 14250 14252 14265 14255 14251 14263 14266 14265 14252 14254 14257 14256 14253 14255 14258 14257 14254 14265 14269 14258 14255 14257 14260 14259 14256 14258 14273 14260 14257 14269 14274 14273 14258 14260 14278 14261 14259 14273 14279 14278 14260 15945 15950 14264 14262 14264 14267 14266 14263 14264 15950 14268 14267 14266 14270 14269 14265 14267 14271 14270 14266 14268 14272 14271 14267 15955 15958 14272 14268 15951 15955 14268 15950 14270 14275 14274 14269 14271 14276 14275 14270 14272 14277 14276 14271 15958 15960 14277 14272 14274 14280 14279 14273 14275 14281 14280 14274 14276 14282 14281 14275 14277 14283 14282 14276 15960 15962 14283 14277 14279 14285 14284 14278 14280 14286 14285 14279 14281 14287 14286 14280 14282 14288 14287 14281 14283 14289 14288 14282 15962 15984 14289 14283 14291 14295 14294 14290 14386 14387 14291 14290 14292 14296 14295 14291 14387 14388 14292 14291 14293 14297 14296 14292 14388 14389 14293 14292 14293 14392 14298 14297 14390 14392 14293 14389 14295 14301 14300 14294 14296 14302 14301 14295 14297 14303 14302 14296 14298 14304 14303 14297 14299 14318 14304 14298 14392 14393 14299 14298 15990 15996 14318 14299 14393 16082 15990 14299 14301 14306 14305 14300 14302 14307 14306 14301 14303 14308 14307 14302 14304 14319 14308 14303 14318 14320 14319 14304 14306 14310 14309 14305 14307 14311 14310 14306 14308 14321 14311 14307 14319 14322 14321 14308 14310 14313 14312 14309 14311 14314 14313 14310 14321 14324 14314 14311 14313 14316 14315 14312 14314 14327 14316 14313 14324 14328 14327 14314 14316 14331 14317 14315 14327 14332 14331 14316 15996 16002 14320 14318 14320 14323 14322 14319 16002 16007 14323 14320 14322 14325 14324 14321 14323 14326 14325 14322 16007 16011 14326 14323 14325 14329 14328 14324 14326 14330 14329 14325 16011 16014 14330 14326 14328 14333 14332 14327 14329 14334 14333 14328 14330 14335 14334 14329 16014 16017 14335 14330 14332 14337 14336 14331 14333 14338 14337 14332 14334 14339 14338 14333 14335 14340 14339 14334 16017 16019 14340 14335 14342 14345 14344 14341 14437 14438 14342 14341 14343 14346 14345 14342 14438 14439 14343 14342 14343 14443 14347 14346 14440 14443 14343 14439 14345 14351 14350 14344 14346 14352 14351 14345 14347 14353 14352 14346 14348 14354 14353 14347 14443 14444 14348 14347 14349 14368 14354 14348 14444 14445 14349 14348 16052 16058 14368 14349 14445 16135 16052 14349 14351 14356 14355 14350 14352 14357 14356 14351 14353 14358 14357 14352 14354 14369 14358 14353 14368 14370 14369 14354 14356 14360 14359 14355 14357 14361 14360 14356 14358 14371 14361 14357 14369 14372 14371 14358 14360 14363 14362 14359 14361 14364 14363 14360 14371 14374 14364 14361 14363 14366 14365 14362 14364 14377 14366 14363 14374 14378 14377 14364 14366 14381 14367 14365 14377 14382 14381 14366 14381 14387 14386 14367 16058 16064 14370 14368 14370 14373 14372 14369 16064 16069 14373 14370 14372 14375 14374 14371 14373 14376 14375 14372 16069 16073 14376 14373 14375 14379 14378 14374 14376 14380 14379 14375 16073 16076 14380 14376 14378 14383 14382 14377 14379 14384 14383 14378 14380 14385 14384 14379 16076 16079 14385 14380 14382 14388 14387 14381 14383 14389 14388 14382 14384 14390 14389 14383 14385 14391 14390 14384 16079 16081 14391 14385 14391 14393 14392 14390 16081 16082 14393 14391 14394 14493 14396 14395 14488 14493 14394 14487 14396 14402 14401 14395 14397 14403 14402 14396 14493 14494 14397 14396 14398 14404 14403 14397 14494 14495 14398 14397 14399 14405 14404 14398 14495 14496 14399 14398 14400 14419 14405 14399 14496 14497 14400 14399 16109 16111 14419 14400 14497 16184 16109 14400 14402 14407 14406 14401 14403 14408 14407 14402 14404 14409 14408 14403 14405 14420 14409 14404 14419 14421 14420 14405 14407 14411 14410 14406 14408 14412 14411 14407 14409 14422 14412 14408 14420 14423 14422 14409 14411 14414 14413 14410 14412 14415 14414 14411 14422 14425 14415 14412 14414 14417 14416 14413 14415 14428 14417 14414 14425 14429 14428 14415 14417 14432 14418 14416 14428 14433 14432 14417 14432 14438 14437 14418 16111 16117 14421 14419 14421 14424 14423 14420 16117 16122 14424 14421 14423 14426 14425 14422 14424 14427 14426 14423 16122 16126 14427 14424 14426 14430 14429 14425 14427 14431 14430 14426 16126 16129 14431 14427 14429 14434 14433 14428 14430 14435 14434 14429 14431 14436 14435 14430 16129 16132 14436 14431 14433 14439 14438 14432 14434 14440 14439 14433 14435 14441 14440 14434 14436 14442 14441 14435 16132 16134 14442 14436 14441 14444 14443 14440 14442 14445 14444 14441 16134 16135 14445 14442 14447 14452 14451 14446 14544 14545 14447 14446 14448 14453 14452 14447 14545 14546 14448 14447 14449 14454 14453 14448 14546 14547 14449 14448 14450 14455 14454 14449 14547 14548 14450 14449 14450 14550 14470 14455 14549 14550 14450 14548 14452 14457 14456 14451 14453 14458 14457 14452 14454 14459 14458 14453 14455 14471 14459 14454 14470 14472 14471 14455 14457 14461 14460 14456 14458 14462 14461 14457 14459 14463 14462 14458 14471 14473 14463 14459 14461 14465 14464 14460 14462 14466 14465 14461 14463 14475 14466 14462 14473 14476 14475 14463 14465 14468 14467 14464 14466 14478 14468 14465 14475 14479 14478 14466 14468 14482 14469 14467 14478 14483 14482 14468 14482 14488 14487 14469 16159 16165 14472 14470 14550 16259 16159 14470 14472 14474 14473 14471 16165 16170 14474 14472 14474 14477 14476 14473 16170 16174 14477 14474 14476 14480 14479 14475 14477 14481 14480 14476 16174 16178 14481 14477 14479 14484 14483 14478 14480 14485 14484 14479 14481 14486 14485 14480 16178 16181 14486 14481 14483 14489 14488 14482 14484 14490 14489 14483 14485 14491 14490 14484 14486 14492 14491 14485 16181 16183 14492 14486 14489 14494 14493 14488 14490 14495 14494 14489 14491 14496 14495 14490 14492 14497 14496 14491 16183 16184 14497 14492 14499 14503 14502 14498 14596 14597 14499 14498 14500 14504 14503 14499 14597 14598 14500 14499 14501 14505 14504 14500 14598 14599 14501 14500 14501 14602 14506 14505 14600 14602 14501 14599 14503 14508 14507 14502 14504 14509 14508 14503 14505 14510 14509 14504 14506 14511 14510 14505 14522 14523 14511 14506 14602 14603 14522 14506 14508 14513 14512 14507 14509 14514 14513 14508 14510 14515 14514 14509 14511 14524 14515 14510 14523 14525 14524 14511 14513 14517 14516 14512 14514 14518 14517 14513 14515 14526 14518 14514 14524 14527 14526 14515 14517 14520 14519 14516 14518 14529 14520 14517 14526 14530 14529 14518 14520 14533 14521 14519 14529 14534 14533 14520 14533 14539 14538 14521 16211 16217 14523 14522 14603 16313 16211 14522 16217 16222 14525 14523 14525 14528 14527 14524 16222 16226 14528 14525 14527 14531 14530 14526 14528 14532 14531 14527 16226 16230 14532 14528 14530 14535 14534 14529 14531 14536 14535 14530 14532 14537 14536 14531 16230 16233 14537 14532 14534 14540 14539 14533 14535 14541 14540 14534 14536 14542 14541 14535 14537 14543 14542 14536 16233 16235 14543 14537 14539 14545 14544 14538 14540 14546 14545 14539 14541 14547 14546 14540 14542 14548 14547 14541 14543 14549 14548 14542 16235 16237 14549 14543 16237 16259 14550 14549 14552 14555 14554 14551 14647 14648 14552 14551 14553 14556 14555 14552 14648 14649 14553 14552 14553 14653 14557 14556 14650 14653 14553 14649 14555 14561 14560 14554 14556 14562 14561 14555 14557 14563 14562 14556 14558 14564 14563 14557 14653 14654 14558 14557 14559 14576 14564 14558 14654 14655 14559 14558 16265 16271 14576 14559 14655 16361 16265 14559 14561 14566 14565 14560 14562 14567 14566 14561 14563 14568 14567 14562 14564 14577 14568 14563 14576 14578 14577 14564 14566 14570 14569 14565 14567 14571 14570 14566 14568 14579 14571 14567 14577 14580 14579 14568 14570 14573 14572 14569 14571 14582 14573 14570 14579 14583 14582 14571 14573 14586 14574 14572 14582 14587 14586 14573 14586 14591 14575 14574 14591 14597 14596 14575 16271 16276 14578 14576 14578 14581 14580 14577 16276 16281 14581 14578 14580 14584 14583 14579 14581 14585 14584 14580 16281 16285 14585 14581 14583 14588 14587 14582 14584 14589 14588 14583 14585 14590 14589 14584 16285 16288 14590 14585 14587 14592 14591 14586 14588 14593 14592 14587 14589 14594 14593 14588 14590 14595 14594 14589 16288 16290 14595 14590 14592 14598 14597 14591 14593 14599 14598 14592 14594 14600 14599 14593 14595 14601 14600 14594 16290 16292 14601 14595 14601 14603 14602 14600 16292 16313 14603 14601 14604 14702 14606 14605 14697 14702 14604 14696 14606 14612 14611 14605 14607 14613 14612 14606 14702 14703 14607 14606 14608 14614 14613 14607 14703 14704 14608 14607 14609 14615 14614 14608 14704 14705 14609 14608 14610 14629 14615 14609 14705 14706 14610 14609 14610 16421 16319 14629 16397 16421 14610 14706 14612 14617 14616 14611 14613 14618 14617 14612 14614 14619 14618 14613 14615 14630 14619 14614 14629 14631 14630 14615 14617 14621 14620 14616 14618 14622 14621 14617 14619 14632 14622 14618 14630 14633 14632 14619 14621 14624 14623 14620 14622 14625 14624 14621 14632 14635 14625 14622 14624 14627 14626 14623 14625 14638 14627 14624 14635 14639 14638 14625 14627 14642 14628 14626 14638 14643 14642 14627 14642 14648 14647 14628 16319 16325 14631 14629 14631 14634 14633 14630 16325 16330 14634 14631 14633 14636 14635 14632 14634 14637 14636 14633 16330 16334 14637 14634 14636 14640 14639 14635 14637 14641 14640 14636 16334 16338 14641 14637 14639 14644 14643 14638 14640 14645 14644 14639 14641 14646 14645 14640 16338 16341 14646 14641 14643 14649 14648 14642 14644 14650 14649 14643 14645 14651 14650 14644 14646 14652 14651 14645 16341 16343 14652 14646 14651 14654 14653 14650 14652 14655 14654 14651 16343 16361 14655 14652 14657 14661 14660 14656 14754 14755 14657 14656 14658 14662 14661 14657 14755 14756 14658 14657 14659 14663 14662 14658 14756 14757 14659 14658 14659 14760 14664 14663 14758 14760 14659 14757 14661 14667 14666 14660 14662 14668 14667 14661 14663 14669 14668 14662 14664 14670 14669 14663 14665 14681 14670 14664 14760 14761 14665 14664 16367 16374 14681 14665 14761 16451 16367 14665 14667 14672 14671 14666 14668 14673 14672 14667 14669 14674 14673 14668 14670 14682 14674 14669 14681 14683 14682 14670 14672 14676 14675 14671 14673 14677 14676 14672 14674 14684 14677 14673 14682 14685 14684 14674 14676 14679 14678 14675 14677 14687 14679 14676 14684 14688 14687 14677 14679 14691 14680 14678 14687 14692 14691 14679 14691 14697 14696 14680 16374 16380 14683 14681 14683 14686 14685 14682 16380 16385 14686 14683 14685 14689 14688 14684 14686 14690 14689 14685 16385 16389 14690 14686 14688 14693 14692 14687 14689 14694 14693 14688 14690 14695 14694 14689 16389 16392 14695 14690 14692 14698 14697 14691 14693 14699 14698 14692 14694 14700 14699 14693 14695 14701 14700 14694 16392 16395 14701 14695 14698 14703 14702 14697 14699 14704 14703 14698 14700 14705 14704 14699 14701 14706 14705 14700 16395 16397 14706 14701 14708 14713 14712 14707 14787 14803 14708 14707 14709 14714 14713 14708 14803 14804 14709 14708 14710 14715 14714 14709 14804 14805 14710 14709 14711 14716 14715 14710 14805 14806 14711 14710 14711 14809 14717 14716 14807 14809 14711 14806 14713 14719 14718 14712 14714 14720 14719 14713 14715 14721 14720 14714 14716 14722 14721 14715 14717 14734 14722 14716 14733 14735 14734 14717 14809 14810 14733 14717 14719 14724 14723 14718 14720 14725 14724 14719 14721 14726 14725 14720 14722 14736 14726 14721 14734 14737 14736 14722 14724 14728 14727 14723 14725 14729 14728 14724 14726 14739 14729 14725 14736 14740 14739 14726 14728 14731 14730 14727 14729 14743 14731 14728 14739 14744 14743 14729 14731 14748 14732 14730 14743 14749 14748 14731 14748 14755 14754 14732 16427 16433 14735 14733 14810 16523 16427 14733 14735 14738 14737 14734 16433 16438 14738 14735 14737 14741 14740 14736 14738 14742 14741 14737 16438 16442 14742 14738 14740 14745 14744 14739 14741 14746 14745 14740 14742 14747 14746 14741 16442 16445 14747 14742 14744 14750 14749 14743 14745 14751 14750 14744 14746 14752 14751 14745 14747 14753 14752 14746 16445 16447 14753 14747 14749 14756 14755 14748 14750 14757 14756 14749 14751 14758 14757 14750 14752 14759 14758 14751 14753 16449 14759 14752 16447 16450 16449 14753 14759 14761 14760 14758 16449 16451 14761 14759 14763 14767 14766 14762 14855 14856 14763 14762 14764 14768 14767 14763 14856 14857 14764 14763 14765 14769 14768 14764 14857 14858 14765 14764 14765 14862 14770 14769 14859 14862 14765 14858 14767 14773 14772 14766 14768 14774 14773 14767 14769 14775 14774 14768 14770 14776 14775 14769 14771 14788 14776 14770 14862 14863 14771 14770 16477 16483 14788 14771 14863 16552 16477 14771 14773 14778 14777 14772 14774 14779 14778 14773 14775 14780 14779 14774 14776 14789 14780 14775 14788 14790 14789 14776 14778 14782 14781 14777 14779 14783 14782 14778 14780 14791 14783 14779 14789 14792 14791 14780 14782 14785 14784 14781 14783 14794 14785 14782 14791 14795 14794 14783 14785 14798 14786 14784 14794 14799 14798 14785 14798 14804 14803 14786 16483 16489 14790 14788 14790 14793 14792 14789 16489 16494 14793 14790 14792 14796 14795 14791 14793 14797 14796 14792 16494 16498 14797 14793 14795 14800 14799 14794 14796 14801 14800 14795 14797 14802 14801 14796 16498 16501 14802 14797 14799 14805 14804 14798 14800 14806 14805 14799 14801 14807 14806 14800 14802 14808 14807 14801 16501 16503 14808 14802 14808 14810 14809 14807 16503 16523 14810 14808 14812 14815 14814 14811 14905 14906 14812 14811 14813 14816 14815 14812 14906 14907 14813 14812 14813 14911 14817 14816 14908 14911 14813 14907 14815 14822 14821 14814 14816 14823 14822 14815 14817 14824 14823 14816 14818 14835 14824 14817 14911 14912 14818 14817 14819 14836 14835 14818 14912 14913 14819 14818 16529 16535 14836 14819 14913 16626 16529 14819 14821 14826 14825 14820 14822 14827 14826 14821 14823 14828 14827 14822 14824 14837 14828 14823 14835 14838 14837 14824 14826 14830 14829 14825 14827 14831 14830 14826 14828 14840 14831 14827 14837 14841 14840 14828 14830 14833 14832 14829 14831 14844 14833 14830 14840 14845 14844 14831 14833 14849 14834 14832 14844 14850 14849 14833 14849 14856 14855 14834 14836 14839 14838 14835 16535 16540 14839 14836 14838 14842 14841 14837 14839 14843 14842 14838 16540 16544 14843 14839 14841 14846 14845 14840 14842 14847 14846 14841 14843 14848 14847 14842 16544 16547 14848 14843 14845 14851 14850 14844 14846 14852 14851 14845 14847 14853 14852 14846 14848 14854 14853 14847 16547 16549 14854 14848 14850 14857 14856 14849 14851 14858 14857 14850 14852 14859 14858 14851 14853 14860 14859 14852 14854 14861 14860 14853 16549 16551 14861 14854 14860 14863 14862 14859 14861 16552 14863 14860 16551 16572 16552 14861 14865 14870 14869 14864 14965 14966 14865 14864 14866 14871 14870 14865 14966 14967 14866 14865 14867 14872 14871 14866 14967 14968 14867 14866 14868 14873 14872 14867 14968 14969 14868 14867 14868 14972 14874 14873 14970 14972 14868 14969 14870 14876 14875 14869 14871 14877 14876 14870 14872 14878 14877 14871 14873 14879 14878 14872 14874 14890 14879 14873 16578 16584 14890 14874 14972 16657 16578 14874 14876 14881 14880 14875 14877 14882 14881 14876 14878 14883 14882 14877 14879 14891 14883 14878 14890 14892 14891 14879 14881 14885 14884 14880 14882 14886 14885 14881 14883 14893 14886 14882 14891 14894 14893 14883 14885 14888 14887 14884 14886 14896 14888 14885 14893 14897 14896 14886 14888 14900 14889 14887 14896 14901 14900 14888 14900 14906 14905 14889 16584 16589 14892 14890 14892 14895 14894 14891 16589 16594 14895 14892 14894 14898 14897 14893 14895 14899 14898 14894 16594 16598 14899 14895 14897 14902 14901 14896 14898 14903 14902 14897 14899 14904 14903 14898 16598 16601 14904 14899 14901 14907 14906 14900 14902 14908 14907 14901 14903 14909 14908 14902 14904 14910 14909 14903 16601 16603 14910 14904 14909 14912 14911 14908 14910 14913 14912 14909 16603 16626 14913 14910 14915 14917 14916 14914 15000 15019 14915 14914 14915 15025 14918 14917 15020 15025 14915 15019 14917 14924 14923 14916 14918 14925 14924 14917 14919 14926 14925 14918 15025 15026 14919 14918 14920 14927 14926 14919 15026 15027 14920 14919 14921 14928 14927 14920 15027 15028 14921 14920 14922 14944 14928 14921 15028 15029 14922 14921 16632 16638 14944 14922 15029 16729 16632 14922 14924 14930 14929 14923 14925 14931 14930 14924 14926 14932 14931 14925 14927 14933 14932 14926 14928 14945 14933 14927 14944 14946 14945 14928 14930 14935 14934 14929 14931 14936 14935 14930 14932 14937 14936 14931 14933 14947 14937 14932 14945 14948 14947 14933 14935 14939 14938 14934 14936 14940 14939 14935 14937 14950 14940 14936 14947 14951 14950 14937 14939 14942 14941 14938 14940 14954 14942 14939 14950 14955 14954 14940 14942 14959 14943 14941 14954 14960 14959 14942 14959 14966 14965 14943 16638 16643 14946 14944 14946 14949 14948 14945 16643 16647 14949 14946 14948 14952 14951 14947 14949 14953 14952 14948 16647 16651 14953 14949 14951 14956 14955 14950 14952 14957 14956 14951 14953 14958 14957 14952 16651 16654 14958 14953 14955 14961 14960 14954 14956 14962 14961 14955 14957 14963 14962 14956 14958 14964 14963 14957 16654 16656 14964 14958 14960 14967 14966 14959 14961 14968 14967 14960 14962 14969 14968 14961 14963 14970 14969 14962 14964 14971 14970 14963 16656 16675 14971 14964 14971 16657 14972 14970 16675 16681 16657 14971 14974 14979 14978 14973 15075 15076 14974 14973 14975 14980 14979 14974 15076 15077 14975 14974 14976 14981 14980 14975 15077 15078 14976 14975 14977 14982 14981 14976 15078 15079 14977 14976 14977 15081 15001 14982 15080 15081 14977 15079 14979 14984 14983 14978 14980 14985 14984 14979 14981 14986 14985 14980 14982 15002 14986 14981 15001 15003 15002 14982 14984 14989 14988 14983 14985 14990 14989 14984 14986 15004 14990 14985 15002 15005 15004 14986 14988 14992 14991 14987 14989 14993 14992 14988 14990 14994 14993 14989 15004 15007 14994 14990 14992 14996 14995 14991 14993 14997 14996 14992 14994 15010 14997 14993 15007 15011 15010 14994 14996 14999 14998 14995 14997 15014 14999 14996 15010 15015 15014 14997 14999 15019 15000 14998 15014 15020 15019 14999 16687 16693 15003 15001 15081 16783 16687 15001 15003 15006 15005 15002 16693 16698 15006 15003 15005 15008 15007 15004 15006 15009 15008 15005 16698 16702 15009 15006 15008 15012 15011 15007 15009 15013 15012 15008 16702 16705 15013 15009 15011 15016 15015 15010 15012 15017 15016 15011 15013 15018 15017 15012 16705 16708 15018 15013 15015 15021 15020 15014 15016 15022 15021 15015 15017 15023 15022 15016 15018 15024 15023 15017 16708 16710 15024 15018 15021 15026 15025 15020 15022 15027 15026 15021 15023 15028 15027 15022 15024 15029 15028 15023 16710 16729 15029 15024 15031 15034 15033 15030 15126 15127 15031 15030 15032 15035 15034 15031 15127 15128 15032 15031 15032 15132 15036 15035 15129 15132 15032 15128 15034 15039 15038 15033 15035 15040 15039 15034 15036 15041 15040 15035 15037 15042 15041 15036 15132 15133 15037 15036 15053 15054 15042 15037 15133 15134 15053 15037 15039 15044 15043 15038 15040 15045 15044 15039 15041 15046 15045 15040 15042 15055 15046 15041 15054 15056 15055 15042 15044 15048 15047 15043 15045 15049 15048 15044 15046 15057 15049 15045 15055 15058 15057 15046 15048 15051 15050 15047 15049 15060 15051 15048 15057 15061 15060 15049 15051 15064 15052 15050 15060 15065 15064 15051 15064 15070 15069 15052 16735 16741 15054 15053 15134 16837 16735 15053 16741 16746 15056 15054 15056 15059 15058 15055 16746 16750 15059 15056 15058 15062 15061 15057 15059 15063 15062 15058 16750 16754 15063 15059 15061 15066 15065 15060 15062 15067 15066 15061 15063 15068 15067 15062 16754 16757 15068 15063 15065 15071 15070 15064 15066 15072 15071 15065 15067 15073 15072 15066 15068 15074 15073 15067 16757 16759 15074 15068 15070 15076 15075 15069 15071 15077 15076 15070 15072 15078 15077 15071 15073 15079 15078 15072 15074 15080 15079 15073 16759 16760 15080 15074 16760 16783 15081 15080 15083 15085 15084 15082 15177 15178 15083 15082 15083 15183 15086 15085 15179 15183 15083 15178 15085 15091 15090 15084 15086 15092 15091 15085 15087 15093 15092 15086 15183 15184 15087 15086 15088 15094 15093 15087 15184 15185 15088 15087 15089 15107 15094 15088 15185 15186 15089 15088 16789 16795 15107 15089 15186 16891 16789 15089 15091 15096 15095 15090 15092 15097 15096 15091 15093 15098 15097 15092 15094 15108 15098 15093 15107 15109 15108 15094 15096 15100 15099 15095 15097 15101 15100 15096 15098 15110 15101 15097 15108 15111 15110 15098 15100 15103 15102 15099 15101 15113 15103 15100 15110 15114 15113 15101 15103 15105 15104 15102 15113 15117 15105 15103 15105 15121 15106 15104 15117 15122 15121 15105 15121 15127 15126 15106 16795 16800 15109 15107 15109 15112 15111 15108 16800 16805 15112 15109 15111 15115 15114 15110 15112 15116 15115 15111 16805 16809 15116 15112 15114 15118 15117 15113 15115 15119 15118 15114 15116 15120 15119 15115 16809 16812 15120 15116 15118 15123 15122 15117 15119 15124 15123 15118 15120 15125 15124 15119 16812 16814 15125 15120 15122 15128 15127 15121 15123 15129 15128 15122 15124 15130 15129 15123 15125 15131 15130 15124 16814 16816 15131 15125 15130 15133 15132 15129 15131 15134 15133 15130 16816 16837 15134 15131 15136 15142 15141 15135 15239 15240 15136 15135 15137 15143 15142 15136 15240 15241 15137 15136 15138 15144 15143 15137 15241 15242 15138 15137 15139 15145 15144 15138 15242 15243 15139 15138 15140 15159 15145 15139 15243 15244 15140 15139 16843 16849 15159 15140 15244 16921 16843 15140 15142 15147 15146 15141 15143 15148 15147 15142 15144 15149 15148 15143 15145 15160 15149 15144 15159 15161 15160 15145 15147 15151 15150 15146 15148 15152 15151 15147 15149 15162 15152 15148 15160 15163 15162 15149 15151 15154 15153 15150 15152 15155 15154 15151 15162 15165 15155 15152 15154 15157 15156 15153 15155 15168 15157 15154 15165 15169 15168 15155 15157 15172 15158 15156 15168 15173 15172 15157 15172 15178 15177 15158 16849 16854 15161 15159 15161 15164 15163 15160 16854 16859 15164 15161 15163 15166 15165 15162 15164 15167 15166 15163 16859 16863 15167 15164 15166 15170 15169 15165 15167 15171 15170 15166 16863 16866 15171 15167 15169 15174 15173 15168 15170 15175 15174 15169 15171 15176 15175 15170 16866 16869 15176 15171 15173 15179 15178 15172 15174 15180 15179 15173 15175 15181 15180 15174 15176 15182 15181 15175 16869 16871 15182 15176 15180 15184 15183 15179 15181 15185 15184 15180 15182 15186 15185 15181 16871 16891 15186 15182 15188 15194 15193 15187 15275 15299 15188 15187 15189 15195 15194 15188 15299 15300 15189 15188 15190 15196 15195 15189 15300 15301 15190 15189 15191 15197 15196 15190 15301 15302 15191 15190 15192 15198 15197 15191 15302 15303 15192 15191 15192 15305 15215 15198 15304 15305 15192 15303 15194 15200 15199 15193 15195 15201 15200 15194 15196 15202 15201 15195 15197 15203 15202 15196 15198 15216 15203 15197 15215 15217 15216 15198 15200 15205 15204 15199 15201 15206 15205 15200 15202 15207 15206 15201 15203 15218 15207 15202 15216 15219 15218 15203 15205 15209 15208 15204 15206 15210 15209 15205 15207 15211 15210 15206 15218 15221 15211 15207 15210 15213 15212 15209 15211 15224 15213 15210 15221 15225 15224 15211 15213 15228 15214 15212 15224 15229 15228 15213 15228 15234 15233 15214 16897 16903 15217 15215 15305 16993 16897 15215 15217 15220 15219 15216 16903 16908 15220 15217 15219 15222 15221 15218 15220 15223 15222 15219 16908 16912 15223 15220 15222 15226 15225 15221 15223 15227 15226 15222 16912 16915 15227 15223 15225 15230 15229 15224 15226 15231 15230 15225 15227 15232 15231 15226 16915 16918 15232 15227 15229 15235 15234 15228 15230 15236 15235 15229 15231 15237 15236 15230 15232 15238 15237 15231 16918 16920 15238 15232 15234 15240 15239 15233 15235 15241 15240 15234 15236 15242 15241 15235 15237 15243 15242 15236 15238 15244 15243 15237 16920 16921 15244 15238 15246 15250 15249 15245 15336 15358 15246 15245 15247 15251 15250 15246 15358 15359 15247 15246 15248 15252 15251 15247 15359 15360 15248 15247 15248 15364 15253 15252 15361 15364 15248 15360 15250 15256 15255 15249 15251 15257 15256 15250 15252 15258 15257 15251 15253 15259 15258 15252 15254 15277 15259 15253 15364 15365 15254 15253 15276 15278 15277 15254 15365 15366 15276 15254 15256 15261 15260 15255 15257 15262 15261 15256 15258 15263 15262 15257 15259 15264 15263 15258 15277 15279 15264 15259 15261 15266 15265 15260 15262 15267 15266 15261 15263 15268 15267 15262 15264 15281 15268 15263 15279 15282 15281 15264 15266 15270 15269 15265 15267 15271 15270 15266 15268 15284 15271 15267 15281 15285 15284 15268 15270 15273 15272 15269 15271 15288 15273 15270 15284 15289 15288 15271 15273 15293 15274 15272 15288 15294 15293 15273 15293 15299 15275 15274 16945 16951 15278 15276 15366 17047 16945 15276 15278 15280 15279 15277 16951 16956 15280 15278 15280 15283 15282 15279 16956 16960 15283 15280 15282 15286 15285 15281 15283 15287 15286 15282 16960 16963 15287 15283 15285 15290 15289 15284 15286 15291 15290 15285 15287 15292 15291 15286 16963 16966 15292 15287 15289 15295 15294 15288 15290 15296 15295 15289 15291 15297 15296 15290 15292 15298 15297 15291 16966 16968 15298 15292 15294 15300 15299 15293 15295 15301 15300 15294 15296 15302 15301 15295 15297 15303 15302 15296 15298 15304 15303 15297 16968 16969 15304 15298 16969 16993 15305 15304 15307 15309 15308 15306 15396 15411 15307 15306 15307 15416 15310 15309 15412 15416 15307 15411 15309 15315 15314 15308 15310 15316 15315 15309 15311 15317 15316 15310 15416 15417 15311 15310 15312 15318 15317 15311 15417 15418 15312 15311 15313 15319 15318 15312 15418 15419 15313 15312 15337 15338 15319 15313 15419 17080 15337 15313 15315 15321 15320 15314 15316 15322 15321 15315 15317 15323 15322 15316 15318 15324 15323 15317 15319 15339 15324 15318 15338 15340 15339 15319 15321 15326 15325 15320 15322 15327 15326 15321 15323 15328 15327 15322 15324 15341 15328 15323 15339 15342 15341 15324 15326 15330 15329 15325 15327 15331 15330 15326 15328 15344 15331 15327 15341 15345 15344 15328 15330 15333 15332 15329 15331 15348 15333 15330 15344 15349 15348 15331 15333 15335 15334 15332 15348 15353 15335 15333 15335 15358 15336 15334 15353 15359 15358 15335 16999 17005 15338 15337 17080 17103 16999 15337 17005 17010 15340 15338 15340 15343 15342 15339 17010 17014 15343 15340 15342 15346 15345 15341 15343 15347 15346 15342 17014 17018 15347 15343 15345 15350 15349 15344 15346 15351 15350 15345 15347 15352 15351 15346 17018 17021 15352 15347 15349 15354 15353 15348 15350 15355 15354 15349 15351 15356 15355 15350 15352 15357 15356 15351 17021 17023 15357 15352 15354 15360 15359 15353 15355 15361 15360 15354 15356 15362 15361 15355 15357 15363 15362 15356 17023 17024 15363 15357 15362 15365 15364 15361 15363 15366 15365 15362 17024 17047 15366 15363 15367 15466 15369 15368 15461 15466 15367 15446 15369 15375 15374 15368 15370 15376 15375 15369 15466 15467 15370 15369 15371 15377 15376 15370 15467 15468 15371 15370 15372 15378 15377 15371 15468 15469 15372 15371 15373 15379 15378 15372 15469 15470 15373 15372 15373 17164 17053 15379 17138 17164 15373 15470 15375 15381 15380 15374 15376 15382 15381 15375 15377 15383 15382 15376 15378 15384 15383 15377 15379 15397 15384 15378 17053 17059 15397 15379 15381 15386 15385 15380 15382 15387 15386 15381 15383 15388 15387 15382 15384 15398 15388 15383 15397 15399 15398 15384 15386 15390 15389 15385 15387 15391 15390 15386 15388 15400 15391 15387 15398 15401 15400 15388 15390 15393 15392 15389 15391 15403 15393 15390 15400 15404 15403 15391 15393 15395 15394 15392 15403 15407 15395 15393 15395 15411 15396 15394 15407 15412 15411 15395 17059 17064 15399 15397 15399 15402 15401 15398 17064 17069 15402 15399 15401 15405 15404 15400 15402 15406 15405 15401 17069 17073 15406 15402 15404 15408 15407 15403 15405 15409 15408 15404 15406 15410 15409 15405 17073 17076 15410 15406 15408 15413 15412 15407 15409 15414 15413 15408 15410 15415 15414 15409 17076 17078 15415 15410 15413 15417 15416 15412 15414 15418 15417 15413 15415 15419 15418 15414 17078 17080 15419 15415 15421 15425 15424 15420 15518 15519 15421 15420 15422 15426 15425 15421 15519 15520 15422 15421 15423 15427 15426 15422 15520 15521 15423 15422 15423 15524 15428 15427 15522 15524 15423 15521 15425 15431 15430 15424 15426 15432 15431 15425 15427 15433 15432 15426 15428 15434 15433 15427 15429 15447 15434 15428 15524 15525 15429 15428 17109 17115 15447 15429 15525 17198 17109 15429 15431 15436 15435 15430 15432 15437 15436 15431 15433 15438 15437 15432 15434 15448 15438 15433 15447 15449 15448 15434 15436 15440 15439 15435 15437 15441 15440 15436 15438 15450 15441 15437 15448 15451 15450 15438 15440 15443 15442 15439 15441 15453 15443 15440 15450 15454 15453 15441 15443 15445 15444 15442 15453 15457 15445 15443 15445 15461 15446 15444 15457 15462 15461 15445 17115 17121 15449 15447 15449 15452 15451 15448 17121 17126 15452 15449 15451 15455 15454 15450 15452 15456 15455 15451 17126 17130 15456 15452 15454 15458 15457 15453 15455 15459 15458 15454 15456 15460 15459 15455 17130 17133 15460 15456 15458 15463 15462 15457 15459 15464 15463 15458 15460 15465 15464 15459 17133 17136 15465 15460 15462 15467 15466 15461 15463 15468 15467 15462 15464 15469 15468 15463 15465 15470 15469 15464 17136 17138 15470 15465 15471 15569 15473 15472 15564 15569 15471 15563 15473 15477 15476 15472 15474 15478 15477 15473 15569 15570 15474 15473 15475 15479 15478 15474 15570 15571 15475 15474 15475 15574 15480 15479 15572 15574 15475 15571 15477 15483 15482 15476 15478 15484 15483 15477 15479 15485 15484 15478 15480 15486 15485 15479 15481 15500 15486 15480 15574 15575 15481 15480 17171 17174 15500 15481 15575 17247 17171 15481 15483 15488 15487 15482 15484 15489 15488 15483 15485 15490 15489 15484 15486 15501 15490 15485 15500 15502 15501 15486 15488 15492 15491 15487 15489 15493 15492 15488 15490 15503 15493 15489 15501 15504 15503 15490 15492 15495 15494 15491 15493 15496 15495 15492 15503 15506 15496 15493 15495 15498 15497 15494 15496 15509 15498 15495 15506 15510 15509 15496 15498 15513 15499 15497 15509 15514 15513 15498 15513 15519 15518 15499 17174 17180 15502 15500 15502 15505 15504 15501 17180 17185 15505 15502 15504 15507 15506 15503 15505 15508 15507 15504 17185 17189 15508 15505 15507 15511 15510 15506 15508 15512 15511 15507 17189 17192 15512 15508 15510 15515 15514 15509 15511 15516 15515 15510 15512 15517 15516 15511 17192 17195 15517 15512 15514 15520 15519 15513 15515 15521 15520 15514 15516 15522 15521 15515 15517 15523 15522 15516 17195 17197 15523 15517 15523 15525 15524 15522 17197 17198 15525 15523 15527 15529 15528 15526 15621 15622 15527 15526 15527 15627 15530 15529 15623 15627 15527 15622 15529 15534 15533 15528 15530 15535 15534 15529 15531 15536 15535 15530 15627 15628 15531 15530 15532 15537 15536 15531 15628 15629 15532 15531 15532 15631 15548 15537 15630 15631 15532 15629 15534 15539 15538 15533 15535 15540 15539 15534 15536 15541 15540 15535 15537 15549 15541 15536 15548 15550 15549 15537 15539 15543 15542 15538 15540 15544 15543 15539 15541 15551 15544 15540 15549 15552 15551 15541 15543 15546 15545 15542 15544 15554 15546 15543 15551 15555 15554 15544 15546 15558 15547 15545 15554 15559 15558 15546 15558 15564 15563 15547 17222 17228 15550 15548 15631 17318 17222 15548 15550 15553 15552 15549 17228 17233 15553 15550 15552 15556 15555 15551 15553 15557 15556 15552 17233 17237 15557 15553 15555 15560 15559 15554 15556 15561 15560 15555 15557 15562 15561 15556 17237 17241 15562 15557 15559 15565 15564 15558 15560 15566 15565 15559 15561 15567 15566 15560 15562 15568 15567 15561 17241 17244 15568 15562 15565 15570 15569 15564 15566 15571 15570 15565 15567 15572 15571 15566 15568 15573 15572 15567 17244 17246 15573 15568 15573 15575 15574 15572 17246 17247 15575 15573 15578 15581 15580 15577 15579 15582 15581 15578 15581 15586 15585 15580 15582 15587 15586 15581 15583 15588 15587 15582 15584 15589 15588 15583 15586 15591 15590 15585 15587 15592 15591 15586 15588 15593 15592 15587 15589 15604 15593 15588 15603 15605 15604 15589 15591 15595 15594 15590 15592 15596 15595 15591 15593 15606 15596 15592 15604 15607 15606 15593 15595 15598 15597 15594 15596 15599 15598 15595 15606 15609 15599 15596 15598 15601 15600 15597 15599 15612 15601 15598 15609 15613 15612 15599 15601 15616 15602 15600 15612 15617 15616 15601 15616 15622 15621 15602 17273 17276 15605 15603 15605 15608 15607 15604 17276 17282 15608 15605 15607 15610 15609 15606 15608 15611 15610 15607 17282 17287 15611 15608 15610 15614 15613 15609 15611 15615 15614 15610 17287 17291 15615 15611 15613 15618 15617 15612 15614 15619 15618 15613 15615 15620 15619 15614 17291 17294 15620 15615 15617 15623 15622 15616 15618 15624 15623 15617 15619 15625 15624 15618 15620 15626 15625 15619 17294 17297 15626 15620 15624 15628 15627 15623 15625 15629 15628 15624 15626 15630 15629 15625 17297 17299 15630 15626 17299 17318 15631 15630 15633 15637 15636 15632 15722 15723 15633 15632 15634 15638 15637 15633 15723 15724 15634 15633 15635 15639 15638 15634 15724 15725 15635 15634 15635 15728 15640 15639 15726 15728 15635 15725 15637 15642 15641 15636 15638 15643 15642 15637 15639 15644 15643 15638 15640 15655 15644 15639 15654 15656 15655 15640 15728 15729 15654 15640 15642 15646 15645 15641 15643 15647 15646 15642 15644 15657 15647 15643 15655 15658 15657 15644 15646 15649 15648 15645 15647 15650 15649 15646 15657 15660 15650 15647 15649 15652 15651 15648 15650 15663 15652 15649 15660 15664 15663 15650 15652 15667 15653 15651 15663 15668 15667 15652 15667 15673 15672 15653 17324 17330 15656 15654 15729 17414 17324 15654 15656 15659 15658 15655 17330 17335 15659 15656 15658 15661 15660 15657 15659 15662 15661 15658 17335 17339 15662 15659 15661 15665 15664 15660 15662 15666 15665 15661 17339 17342 15666 15662 15664 15669 15668 15663 15665 15670 15669 15664 15666 15671 15670 15665 17342 17345 15671 15666 15668 15674 15673 15667 15669 15675 15674 15668 15670 15676 15675 15669 15671 15677 15676 15670 17345 17347 15677 15671 15673 17274 17273 15672 15674 17275 17274 15673 15678 17275 15674 15675 15676 15679 15678 15675 15677 15680 15679 15676 17347 17366 15680 15677 15678 17279 17278 17275 15679 17280 17279 15678 15680 17281 17280 15679 17366 19021 17281 15680 15682 15688 15687 15681 15759 15778 15682 15681 15683 15689 15688 15682 15778 15779 15683 15682 15684 15690 15689 15683 15779 15780 15684 15683 15685 15691 15690 15684 15780 15781 15685 15684 15686 15706 15691 15685 15781 15782 15686 15685 15705 15707 15706 15686 15782 15783 15705 15686 15688 15693 15692 15687 15689 15694 15693 15688 15690 15695 15694 15689 15691 15696 15695 15690 15706 15708 15696 15691 15693 15698 15697 15692 15694 15699 15698 15693 15695 15700 15699 15694 15696 15710 15700 15695 15708 15711 15710 15696 15698 15702 15701 15697 15699 15703 15702 15698 15700 15713 15703 15699 15710 15714 15713 15700 15703 15717 15704 15702 15713 15718 15717 15703 15717 15723 15722 15704 17372 17377 15707 15705 15783 17466 17372 15705 15707 15709 15708 15706 17377 17382 15709 15707 15709 15712 15711 15708 17382 17386 15712 15709 15711 15715 15714 15710 15712 15716 15715 15711 17386 17389 15716 15712 15714 15719 15718 15713 15715 15720 15719 15714 15716 15721 15720 15715 17389 17391 15721 15716 15718 15724 15723 15717 15719 15725 15724 15718 15720 15726 15725 15719 15721 15727 15726 15720 17391 17393 15727 15721 15727 15729 15728 15726 17393 17414 15729 15727 15731 15733 15732 15730 15805 15821 15731 15730 15731 15826 15734 15733 15822 15826 15731 15821 15733 15739 15738 15732 15734 15740 15739 15733 15735 15741 15740 15734 15826 15827 15735 15734 15736 15742 15741 15735 15827 15828 15736 15735 15737 15760 15742 15736 15828 15829 15737 15736 17420 17426 15760 15737 15829 17500 17420 15737 15739 15744 15743 15738 15740 15745 15744 15739 15741 15746 15745 15740 15742 15747 15746 15741 15760 15761 15747 15742 15744 15749 15748 15743 15745 15750 15749 15744 15746 15751 15750 15745 15747 15762 15751 15746 15761 15763 15762 15747 15749 15753 15752 15748 15750 15754 15753 15749 15751 15764 15754 15750 15762 15765 15764 15751 15753 15756 15755 15752 15754 15768 15756 15753 15764 15769 15768 15754 15756 15758 15757 15755 15768 15773 15758 15756 15758 15778 15759 15757 15773 15779 15778 15758 17426 17431 15761 15760 17431 17436 15763 15761 15763 15766 15765 15762 15763 17436 15767 15766 15765 15770 15769 15764 15766 15771 15770 15765 15767 15772 15771 15766 17440 17442 15772 15767 17437 17440 15767 17436 15769 15774 15773 15768 15770 15775 15774 15769 15771 15776 15775 15770 15772 15777 15776 15771 17442 17444 15777 15772 15774 15780 15779 15773 15775 15781 15780 15774 15776 15782 15781 15775 15777 15783 15782 15776 17444 17466 15783 15777 15785 15790 15789 15784 15878 15879 15785 15784 15786 15791 15790 15785 15879 15880 15786 15785 15787 15792 15791 15786 15880 15881 15787 15786 15788 15793 15792 15787 15881 15882 15788 15787 15806 15807 15793 15788 15882 15883 15806 15788 15790 15795 15794 15789 15791 15796 15795 15790 15792 15797 15796 15791 15793 15808 15797 15792 15807 15809 15808 15793 15795 15799 15798 15794 15796 15800 15799 15795 15797 15810 15800 15796 15808 15811 15810 15797 15799 15802 15801 15798 15800 15813 15802 15799 15810 15814 15813 15800 15802 15804 15803 15801 15813 15817 15804 15802 15804 15821 15805 15803 15817 15822 15821 15804 17476 17482 15807 15806 15883 17579 17476 15806 17482 17487 15809 15807 15809 15812 15811 15808 17487 17491 15812 15809 15811 15815 15814 15810 15812 15816 15815 15811 17491 17494 15816 15812 15814 15818 15817 15813 15815 15819 15818 15814 15816 15820 15819 15815 17494 17497 15820 15816 15818 15823 15822 15817 15819 15824 15823 15818 15820 15825 15824 15819 17497 17499 15825 15820 15823 15827 15826 15822 15824 15828 15827 15823 15825 15829 15828 15824 17499 17500 15829 15825 15831 15837 15836 15830 15932 15933 15831 15830 15832 15838 15837 15831 15933 15934 15832 15831 15833 15839 15838 15832 15934 15935 15833 15832 15834 15840 15839 15833 15935 15936 15834 15833 15835 15856 15840 15834 15936 15937 15835 15834 17531 17537 15856 15835 15937 17629 17531 15835 15837 15842 15841 15836 15838 15843 15842 15837 15839 15844 15843 15838 15840 15857 15844 15839 15856 15858 15857 15840 15842 15846 15845 15841 15843 15847 15846 15842 15844 15848 15847 15843 15857 15859 15848 15844 15846 15850 15849 15845 15847 15851 15850 15846 15848 15861 15851 15847 15859 15862 15861 15848 15850 15853 15852 15849 15851 15864 15853 15850 15861 15865 15864 15851 15853 15868 15854 15852 15864 15869 15868 15853 15868 15873 15855 15854 15873 15879 15878 15855 17537 17542 15858 15856 15858 15860 15859 15857 17542 17546 15860 15858 15860 15863 15862 15859 17546 17550 15863 15860 15862 15866 15865 15861 15863 15867 15866 15862 17550 17553 15867 15863 15865 15870 15869 15864 15866 15871 15870 15865 15867 15872 15871 15866 17553 17555 15872 15867 15869 15874 15873 15868 15870 15875 15874 15869 15871 15876 15875 15870 15872 15877 15876 15871 17555 17557 15877 15872 15874 15880 15879 15873 15875 15881 15880 15874 15876 15882 15881 15875 15877 15883 15882 15876 17557 17579 15883 15877 15885 15891 15890 15884 15984 15985 15885 15884 15886 15892 15891 15885 15985 15986 15886 15885 15887 15893 15892 15886 15986 15987 15887 15886 15888 15894 15893 15887 15987 15988 15888 15887 15889 15910 15894 15888 15988 15989 15889 15888 17581 17587 15910 15889 15989 17658 17581 15889 15891 15896 15895 15890 15892 15897 15896 15891 15893 15898 15897 15892 15894 15911 15898 15893 15910 15912 15911 15894 15896 15900 15899 15895 15897 15901 15900 15896 15898 15902 15901 15897 15911 15913 15902 15898 15900 15904 15903 15899 15901 15905 15904 15900 15902 15915 15905 15901 15913 15916 15915 15902 15904 15907 15906 15903 15905 15918 15907 15904 15915 15919 15918 15905 15907 15922 15908 15906 15918 15923 15922 15907 15922 15927 15909 15908 15927 15933 15932 15909 17587 17592 15912 15910 15912 15914 15913 15911 17592 17597 15914 15912 15914 15917 15916 15913 17597 17601 15917 15914 15916 15920 15919 15915 15917 15921 15920 15916 17601 17604 15921 15917 15919 15924 15923 15918 15920 15925 15924 15919 15921 15926 15925 15920 17604 17606 15926 15921 15923 15928 15927 15922 15924 15929 15928 15923 15925 15930 15929 15924 15926 15931 15930 15925 17606 17608 15931 15926 15928 15934 15933 15927 15929 15935 15934 15928 15930 15936 15935 15929 15931 15937 15936 15930 17608 17629 15937 15931 15938 16046 15940 15939 16040 16046 15938 16019 15940 15946 15945 15939 15941 15947 15946 15940 16046 16047 15941 15940 15942 15948 15947 15941 16047 16048 15942 15941 15943 15949 15948 15942 16048 16049 15943 15942 15944 15964 15949 15943 16049 16050 15944 15943 15963 15965 15964 15944 16050 16051 15963 15944 15946 15951 15950 15945 15947 15952 15951 15946 15948 15953 15952 15947 15949 15954 15953 15948 15964 15966 15954 15949 15952 15956 15955 15951 15953 15957 15956 15952 15954 15968 15957 15953 15966 15969 15968 15954 15956 15959 15958 15955 15957 15971 15959 15956 15968 15972 15971 15957 15959 15961 15960 15958 15971 15975 15961 15959 15961 15979 15962 15960 15975 15980 15979 15961 15979 15985 15984 15962 17635 17640 15965 15963 16051 17731 17635 15963 15965 15967 15966 15964 17640 17645 15967 15965 15967 15970 15969 15966 17645 17649 15970 15967 15969 15973 15972 15968 15970 15974 15973 15969 17649 17652 15974 15970 15972 15976 15975 15971 15973 15977 15976 15972 15974 15978 15977 15973 17652 17655 15978 15974 15976 15981 15980 15975 15977 15982 15981 15976 15978 15983 15982 15977 17655 17657 15983 15978 15980 15986 15985 15979 15981 15987 15986 15980 15982 15988 15987 15981 15983 15989 15988 15982 17657 17658 15989 15983 15991 15997 15996 15990 16082 16103 15991 15990 15992 15998 15997 15991 16103 16104 15992 15991 15993 15999 15998 15992 16104 16105 15993 15992 15994 16000 15999 15993 16105 16106 15994 15993 15995 16001 16000 15994 16106 16107 15995 15994 16020 16021 16001 15995 16107 16108 16020 15995 15997 16003 16002 15996 15998 16004 16003 15997 15999 16005 16004 15998 16000 16006 16005 15999 16001 16022 16006 16000 16021 16023 16022 16001 16003 16008 16007 16002 16004 16009 16008 16003 16005 16010 16009 16004 16006 16024 16010 16005 16022 16025 16024 16006 16008 16012 16011 16007 16009 16013 16012 16008 16010 16027 16013 16009 16024 16028 16027 16010 16012 16015 16014 16011 16013 16016 16015 16012 16027 16031 16016 16013 16015 16018 16017 16014 16016 16035 16018 16015 16031 16036 16035 16016 16018 16040 16019 16017 16035 16041 16040 16018 17683 17688 16021 16020 16108 17791 17683 16020 17688 17693 16023 16021 16023 16026 16025 16022 17693 17697 16026 16023 16025 16029 16028 16024 16026 16030 16029 16025 17697 17700 16030 16026 16028 16032 16031 16027 16029 16033 16032 16028 16030 16034 16033 16029 17700 17703 16034 16030 16032 16037 16036 16031 16033 16038 16037 16032 16034 16039 16038 16033 17703 17705 16039 16034 16036 16042 16041 16035 16037 16043 16042 16036 16038 16044 16043 16037 16039 16045 16044 16038 17705 17706 16045 16039 16041 16047 16046 16040 16042 16048 16047 16041 16043 16049 16048 16042 16044 16050 16049 16043 16045 16051 16050 16044 17706 17731 16051 16045 16053 16059 16058 16052 16135 16154 16053 16052 16054 16060 16059 16053 16154 16155 16054 16053 16055 16061 16060 16054 16155 16156 16055 16054 16056 16062 16061 16055 16156 16157 16056 16055 16057 16063 16062 16056 16157 16158 16057 16056 17737 17744 16063 16057 16158 17824 17737 16057 16059 16065 16064 16058 16060 16066 16065 16059 16061 16067 16066 16060 16062 16068 16067 16061 16063 16083 16068 16062 17744 17750 16083 16063 16065 16070 16069 16064 16066 16071 16070 16065 16067 16072 16071 16066 16068 16084 16072 16067 16083 16085 16084 16068 16070 16074 16073 16069 16071 16075 16074 16070 16072 16086 16075 16071 16084 16087 16086 16072 16074 16077 16076 16073 16075 16078 16077 16074 16086 16089 16078 16075 16077 16080 16079 16076 16078 16092 16080 16077 16089 16093 16092 16078 16080 16097 16081 16079 16092 16098 16097 16080 16097 16103 16082 16081 17750 17755 16085 16083 16085 16088 16087 16084 17755 17759 16088 16085 16087 16090 16089 16086 16088 16091 16090 16087 17759 17763 16091 16088 16090 16094 16093 16089 16091 16095 16094 16090 16091 17763 16096 16095 16093 16099 16098 16092 16094 16100 16099 16093 16095 16101 16100 16094 16096 16102 16101 16095 17766 17767 16102 16096 17764 17766 16096 17763 16098 16104 16103 16097 16099 16105 16104 16098 16100 16106 16105 16099 16101 16107 16106 16100 16102 16108 16107 16101 17767 17791 16108 16102 16110 16112 16111 16109 16184 16202 16110 16109 16110 16207 16113 16112 16203 16207 16110 16202 16112 16118 16117 16111 16113 16119 16118 16112 16114 16120 16119 16113 16207 16208 16114 16113 16115 16121 16120 16114 16208 16209 16115 16114 16116 16136 16121 16115 16209 16210 16116 16115 17797 17803 16136 16116 16210 17909 17797 16116 16118 16123 16122 16117 16119 16124 16123 16118 16120 16125 16124 16119 16121 16137 16125 16120 16136 16138 16137 16121 16123 16127 16126 16122 16124 16128 16127 16123 16125 16139 16128 16124 16137 16140 16139 16125 16127 16130 16129 16126 16128 16131 16130 16127 16139 16142 16131 16128 16130 16133 16132 16129 16131 16145 16133 16130 16142 16146 16145 16131 16133 16149 16134 16132 16145 16150 16149 16133 16149 16154 16135 16134 17803 17808 16138 16136 16138 16141 16140 16137 17808 17813 16141 16138 16140 16143 16142 16139 16141 16144 16143 16140 17813 17817 16144 16141 16143 16147 16146 16142 16144 16148 16147 16143 17817 17820 16148 16144 16146 16151 16150 16145 16147 16152 16151 16146 16148 16153 16152 16147 17820 17822 16153 16148 16150 16155 16154 16149 16151 16156 16155 16150 16152 16157 16156 16151 16153 16158 16157 16152 17822 17824 16158 16153 16160 16166 16165 16159 16259 16260 16160 16159 16161 16167 16166 16160 16260 16261 16161 16160 16162 16168 16167 16161 16261 16262 16162 16161 16163 16169 16168 16162 16262 16263 16163 16162 16164 16185 16169 16163 16263 16264 16164 16163 17853 17859 16185 16164 16264 17946 17853 16164 16166 16171 16170 16165 16167 16172 16171 16166 16168 16173 16172 16167 16169 16186 16173 16168 16185 16187 16186 16169 16171 16175 16174 16170 16172 16176 16175 16171 16173 16177 16176 16172 16186 16188 16177 16173 16175 16179 16178 16174 16176 16180 16179 16175 16177 16190 16180 16176 16188 16191 16190 16177 16179 16182 16181 16178 16180 16193 16182 16179 16190 16194 16193 16180 16182 16197 16183 16181 16193 16198 16197 16182 16197 16202 16184 16183 17859 17864 16187 16185 16187 16189 16188 16186 17864 17869 16189 16187 16189 16192 16191 16188 17869 17873 16192 16189 16191 16195 16194 16190 16192 16196 16195 16191 17873 17876 16196 16192 16194 16199 16198 16193 16195 16200 16199 16194 16196 16201 16200 16195 17876 17879 16201 16196 16198 16203 16202 16197 16199 16204 16203 16198 16200 16205 16204 16199 16201 16206 16205 16200 17879 17881 16206 16201 16204 16208 16207 16203 16205 16209 16208 16204 16206 16210 16209 16205 17881 17909 16210 16206 16212 16218 16217 16211 16313 16314 16212 16211 16213 16219 16218 16212 16314 16315 16213 16212 16214 16220 16219 16213 16315 16316 16214 16213 16215 16221 16220 16214 16316 16317 16215 16214 16216 16238 16221 16215 16317 16318 16216 16215 17916 17922 16238 16216 16318 18002 17916 16216 16218 16223 16222 16217 16219 16224 16223 16218 16220 16225 16224 16219 16221 16239 16225 16220 16238 16240 16239 16221 16223 16227 16226 16222 16224 16228 16227 16223 16225 16229 16228 16224 16239 16241 16229 16225 16227 16231 16230 16226 16228 16232 16231 16227 16229 16243 16232 16228 16241 16244 16243 16229 16231 16234 16233 16230 16232 16246 16234 16231 16243 16247 16246 16232 16234 16236 16235 16233 16246 16250 16236 16234 16236 16254 16237 16235 16250 16255 16254 16236 16254 16260 16259 16237 17922 17928 16240 16238 16240 16242 16241 16239 17928 17933 16242 16240 16242 16245 16244 16241 17933 17937 16245 16242 16244 16248 16247 16243 16245 16249 16248 16244 17937 17940 16249 16245 16247 16251 16250 16246 16248 16252 16251 16247 16249 16253 16252 16248 17940 17943 16253 16249 16251 16256 16255 16250 16252 16257 16256 16251 16253 16258 16257 16252 17943 17945 16258 16253 16255 16261 16260 16254 16256 16262 16261 16255 16257 16263 16262 16256 16258 16264 16263 16257 17945 17946 16264 16258 16266 16272 16271 16265 16361 16362 16266 16265 16267 16273 16272 16266 16362 16363 16267 16266 16268 16274 16273 16267 16363 16364 16268 16267 16269 16275 16274 16268 16364 16365 16269 16268 16270 16293 16275 16269 16365 16366 16270 16269 17971 17977 16293 16270 16366 18057 17971 16270 16272 16277 16276 16271 16273 16278 16277 16272 16274 16279 16278 16273 16275 16280 16279 16274 16293 16294 16280 16275 16277 16282 16281 16276 16278 16283 16282 16277 16279 16284 16283 16278 16280 16295 16284 16279 16294 16296 16295 16280 16282 16286 16285 16281 16283 16287 16286 16282 16284 16297 16287 16283 16295 16298 16297 16284 16286 16289 16288 16285 16287 16300 16289 16286 16297 16301 16300 16287 16289 16291 16290 16288 16300 16304 16291 16289 16291 16308 16292 16290 16304 16309 16308 16291 16308 16314 16313 16292 17977 17983 16294 16293 17983 17988 16296 16294 16296 16299 16298 16295 17988 17992 16299 16296 16298 16302 16301 16297 16299 16303 16302 16298 17992 17996 16303 16299 16301 16305 16304 16300 16302 16306 16305 16301 16303 16307 16306 16302 17996 17999 16307 16303 16305 16310 16309 16304 16306 16311 16310 16305 16307 16312 16311 16306 17999 18001 16312 16307 16309 16315 16314 16308 16310 16316 16315 16309 16311 16317 16316 16310 16312 16318 16317 16311 18001 18002 16318 16312 16320 16326 16325 16319 16421 16422 16320 16319 16321 16327 16326 16320 16422 16423 16321 16320 16322 16328 16327 16321 16423 16424 16322 16321 16323 16329 16328 16322 16424 16425 16323 16322 16324 16344 16329 16323 16425 16426 16324 16323 18030 18036 16344 16324 16426 18112 18030 16324 16326 16331 16330 16325 16327 16332 16331 16326 16328 16333 16332 16327 16329 16345 16333 16328 16344 16346 16345 16329 16331 16335 16334 16330 16332 16336 16335 16331 16333 16337 16336 16332 16345 16347 16337 16333 16335 16339 16338 16334 16336 16340 16339 16335 16337 16349 16340 16336 16347 16350 16349 16337 16339 16342 16341 16338 16340 16352 16342 16339 16349 16353 16352 16340 16342 16356 16343 16341 16352 16357 16356 16342 16356 16362 16361 16343 18036 18041 16346 16344 16346 16348 16347 16345 18041 18046 16348 16346 16348 16351 16350 16347 18046 18050 16351 16348 16350 16354 16353 16349 16351 16355 16354 16350 18050 18053 16355 16351 16353 16358 16357 16352 16354 16359 16358 16353 16355 16360 16359 16354 18053 18055 16360 16355 16357 16363 16362 16356 16358 16364 16363 16357 16359 16365 16364 16358 16360 16366 16365 16359 18055 18057 16366 16360 16368 16375 16374 16367 16451 16471 16368 16367 16369 16376 16375 16368 16471 16472 16369 16368 16370 16377 16376 16369 16472 16473 16370 16369 16371 16378 16377 16370 16473 16474 16371 16370 16372 16379 16378 16371 16474 16475 16372 16371 16373 16398 16379 16372 16475 16476 16373 16372 18086 18092 16398 16373 16476 18185 18086 16373 16375 16381 16380 16374 16376 16382 16381 16375 16377 16383 16382 16376 16378 16384 16383 16377 16379 16399 16384 16378 16398 16400 16399 16379 16381 16386 16385 16380 16382 16387 16386 16381 16383 16388 16387 16382 16384 16401 16388 16383 16399 16402 16401 16384 16386 16390 16389 16385 16387 16391 16390 16386 16388 16404 16391 16387 16401 16405 16404 16388 16390 16393 16392 16389 16391 16394 16393 16390 16404 16408 16394 16391 16393 16396 16395 16392 16394 16412 16396 16393 16408 16413 16412 16394 16396 16416 16397 16395 16412 16417 16416 16396 16416 16422 16421 16397 18092 18097 16400 16398 16400 16403 16402 16399 18097 18101 16403 16400 16402 16406 16405 16401 16403 16407 16406 16402 18101 18104 16407 16403 16405 16409 16408 16404 16406 16410 16409 16405 16407 16411 16410 16406 18104 18107 16411 16407 16409 16414 16413 16408 16410 16415 16414 16409 16411 18109 16415 16410 18107 18110 18109 16411 16413 16418 16417 16412 16414 16419 16418 16413 16415 16420 16419 16414 18109 18111 16420 16415 16417 16423 16422 16416 16418 16424 16423 16417 16419 16425 16424 16418 16420 16426 16425 16419 18111 18112 16426 16420 16428 16434 16433 16427 16523 16524 16428 16427 16429 16435 16434 16428 16524 16525 16429 16428 16430 16436 16435 16429 16525 16526 16430 16429 16431 16437 16436 16430 16526 16527 16431 16430 16432 16452 16437 16431 16527 16528 16432 16431 18143 18149 16452 16432 16528 18216 18143 16432 16434 16439 16438 16433 16435 16440 16439 16434 16436 16441 16440 16435 16437 16453 16441 16436 16452 16454 16453 16437 16439 16443 16442 16438 16440 16444 16443 16439 16441 16455 16444 16440 16453 16456 16455 16441 16443 16446 16445 16442 16444 16458 16446 16443 16455 16459 16458 16444 16446 16448 16447 16445 16458 16462 16448 16446 16448 16466 16450 16447 16462 16467 16466 16448 16450 16471 16451 16449 16466 16472 16471 16450 18149 18154 16454 16452 16454 16457 16456 16453 18154 18158 16457 16454 16456 16460 16459 16455 16457 16461 16460 16456 18158 18162 16461 16457 16459 16463 16462 16458 16460 16464 16463 16459 16461 16465 16464 16460 18162 18165 16465 16461 16463 16468 16467 16462 16464 16469 16468 16463 16465 16470 16469 16464 18165 18167 16470 16465 16467 16473 16472 16466 16468 16474 16473 16467 16469 16475 16474 16468 16470 16476 16475 16469 18167 18185 16476 16470 16478 16484 16483 16477 16552 16572 16478 16477 16479 16485 16484 16478 16572 16573 16479 16478 16480 16486 16485 16479 16573 16574 16480 16479 16481 16487 16486 16480 16574 16575 16481 16480 16482 16488 16487 16481 16575 16576 16482 16481 16504 16505 16488 16482 16576 16577 16504 16482 16484 16490 16489 16483 16485 16491 16490 16484 16486 16492 16491 16485 16487 16493 16492 16486 16488 16506 16493 16487 16505 16507 16506 16488 16490 16495 16494 16489 16491 16496 16495 16490 16492 16497 16496 16491 16493 16508 16497 16492 16506 16509 16508 16493 16495 16499 16498 16494 16496 16500 16499 16495 16497 16511 16500 16496 16508 16512 16511 16497 16499 16502 16501 16498 16500 16514 16502 16499 16511 16515 16514 16500 16502 16518 16503 16501 16514 16519 16518 16502 16518 16524 16523 16503 18191 18197 16505 16504 16577 18289 18191 16504 18197 18202 16507 16505 16507 16510 16509 16506 18202 18206 16510 16507 16509 16513 16512 16508 16510 18209 16513 16509 18206 18210 18209 16510 16512 16516 16515 16511 16513 16517 16516 16512 18209 18212 16517 16513 16515 16520 16519 16514 16516 16521 16520 16515 16517 16522 16521 16516 18212 18214 16522 16517 16519 16525 16524 16518 16520 16526 16525 16519 16521 16527 16526 16520 16522 16528 16527 16521 18214 18216 16528 16522 16530 16536 16535 16529 16626 16627 16530 16529 16531 16537 16536 16530 16627 16628 16531 16530 16532 16538 16537 16531 16628 16629 16532 16531 16533 16539 16538 16532 16629 16630 16533 16532 16534 16553 16539 16533 16630 16631 16534 16533 18243 18249 16553 16534 16631 18319 18243 16534 16536 16541 16540 16535 16537 16542 16541 16536 16538 16543 16542 16537 16539 16554 16543 16538 16553 16555 16554 16539 16541 16545 16544 16540 16542 16546 16545 16541 16543 16556 16546 16542 16554 16557 16556 16543 16545 16548 16547 16544 16546 16559 16548 16545 16556 16560 16559 16546 16548 16550 16549 16547 16559 16563 16550 16548 16550 16567 16551 16549 16563 16568 16567 16550 16567 16573 16572 16551 18249 18255 16555 16553 16555 16558 16557 16554 18255 18260 16558 16555 16557 16561 16560 16556 16558 16562 16561 16557 18260 18264 16562 16558 16560 16564 16563 16559 16561 16565 16564 16560 16562 16566 16565 16561 18264 18267 16566 16562 16564 16569 16568 16563 16565 16570 16569 16564 16566 16571 16570 16565 18267 18269 16571 16566 16568 16574 16573 16567 16569 16575 16574 16568 16570 16576 16575 16569 16571 16577 16576 16570 18269 18289 16577 16571 16579 16585 16584 16578 16657 16681 16579 16578 16580 16586 16585 16579 16681 16682 16580 16579 16581 16587 16586 16580 16682 16683 16581 16580 16582 16588 16587 16581 16683 16684 16582 16581 16583 16605 16588 16582 16684 16685 16583 16582 16604 16606 16605 16583 16685 16686 16604 16583 16585 16590 16589 16584 16586 16591 16590 16585 16587 16592 16591 16586 16588 16593 16592 16587 16605 16607 16593 16588 16590 16595 16594 16589 16591 16596 16595 16590 16592 16597 16596 16591 16593 16609 16597 16592 16607 16610 16609 16593 16595 16599 16598 16594 16596 16600 16599 16595 16597 16612 16600 16596 16609 16613 16612 16597 16599 16602 16601 16598 16600 16616 16602 16599 16612 16617 16616 16600 16602 16621 16603 16601 16616 16622 16621 16602 16621 16627 16626 16603 18295 18301 16606 16604 16686 18394 18295 16604 16606 16608 16607 16605 18301 18306 16608 16606 16608 16611 16610 16607 18306 18310 16611 16608 16610 16614 16613 16609 16611 16615 16614 16610 18310 18313 16615 16611 16613 16618 16617 16612 16614 16619 16618 16613 16615 16620 16619 16614 18313 18315 16620 16615 16617 16623 16622 16616 16618 16624 16623 16617 16619 16625 16624 16618 16620 18317 16625 16619 18315 18318 18317 16620 16622 16628 16627 16621 16623 16629 16628 16622 16624 16630 16629 16623 16625 16631 16630 16624 18317 18319 16631 16625 16633 16639 16638 16632 16729 16730 16633 16632 16634 16640 16639 16633 16730 16731 16634 16633 16635 16641 16640 16634 16731 16732 16635 16634 16636 16642 16641 16635 16732 16733 16636 16635 16637 16658 16642 16636 16733 16734 16637 16636 18345 18351 16658 16637 16734 18425 18345 16637 16639 16644 16643 16638 16640 16645 16644 16639 16641 16646 16645 16640 16642 16659 16646 16641 16658 16660 16659 16642 16644 16648 16647 16643 16645 16649 16648 16644 16646 16650 16649 16645 16659 16661 16650 16646 16648 16652 16651 16647 16649 16653 16652 16648 16650 16663 16653 16649 16661 16664 16663 16650 16652 16655 16654 16651 16653 16666 16655 16652 16663 16667 16666 16653 16655 16670 16656 16654 16666 16671 16670 16655 16670 16676 16675 16656 18351 18357 16660 16658 16660 16662 16661 16659 18357 18362 16662 16660 16662 16665 16664 16661 18362 18366 16665 16662 16664 16668 16667 16663 16665 16669 16668 16664 18366 18369 16669 16665 16667 16672 16671 16666 16668 16673 16672 16667 16669 16674 16673 16668 18369 18371 16674 16669 16671 16677 16676 16670 16672 16678 16677 16671 16673 16679 16678 16672 16674 16680 16679 16673 18371 18373 16680 16674 16676 16682 16681 16675 16677 16683 16682 16676 16678 16684 16683 16677 16679 16685 16684 16678 16680 16686 16685 16679 18373 18394 16686 16680 16688 16694 16693 16687 16783 16784 16688 16687 16689 16695 16694 16688 16784 16785 16689 16688 16690 16696 16695 16689 16785 16786 16690 16689 16691 16697 16696 16690 16786 16787 16691 16690 16692 16711 16697 16691 16787 16788 16692 16691 18400 18406 16711 16692 16788 18512 18400 16692 16694 16699 16698 16693 16695 16700 16699 16694 16696 16701 16700 16695 16697 16712 16701 16696 16711 16713 16712 16697 16699 16703 16702 16698 16700 16704 16703 16699 16701 16714 16704 16700 16712 16715 16714 16701 16703 16706 16705 16702 16704 16707 16706 16703 16714 16717 16707 16704 16706 16709 16708 16705 16707 16720 16709 16706 16717 16721 16720 16707 16709 16724 16710 16708 16720 16725 16724 16709 16724 16730 16729 16710 18406 18411 16713 16711 16713 16716 16715 16712 18411 18415 16716 16713 16715 16718 16717 16714 16716 16719 16718 16715 18415 18419 16719 16716 16718 16722 16721 16717 16719 16723 16722 16718 18419 18422 16723 16719 16721 16726 16725 16720 16722 16727 16726 16721 16723 16728 16727 16722 18422 18424 16728 16723 16725 16731 16730 16724 16726 16732 16731 16725 16727 16733 16732 16726 16728 16734 16733 16727 18424 18425 16734 16728 16736 16742 16741 16735 16837 16838 16736 16735 16737 16743 16742 16736 16838 16839 16737 16736 16738 16744 16743 16737 16839 16840 16738 16737 16739 16745 16744 16738 16840 16841 16739 16738 16740 16761 16745 16739 16841 16842 16740 16739 18456 18462 16761 16740 16842 18550 18456 16740 16742 16747 16746 16741 16743 16748 16747 16742 16744 16749 16748 16743 16745 16762 16749 16744 16761 16763 16762 16745 16747 16751 16750 16746 16748 16752 16751 16747 16749 16753 16752 16748 16762 16764 16753 16749 16751 16755 16754 16750 16752 16756 16755 16751 16753 16766 16756 16752 16764 16767 16766 16753 16755 16758 16757 16754 16756 16769 16758 16755 16766 16770 16769 16756 16758 16773 16759 16757 16769 16774 16773 16758 16773 16778 16760 16759 16778 16784 16783 16760 18462 18467 16763 16761 16763 16765 16764 16762 18467 18472 16765 16763 16765 16768 16767 16764 18472 18476 16768 16765 16767 16771 16770 16766 16768 16772 16771 16767 18476 18479 16772 16768 16770 16775 16774 16769 16771 16776 16775 16770 16772 16777 16776 16771 18479 18482 16777 16772 16774 16779 16778 16773 16775 16780 16779 16774 16776 16781 16780 16775 16777 16782 16781 16776 18482 18484 16782 16777 16779 16785 16784 16778 16780 16786 16785 16779 16781 16787 16786 16780 16782 16788 16787 16781 18484 18512 16788 16782 16790 16796 16795 16789 16891 16892 16790 16789 16791 16797 16796 16790 16892 16893 16791 16790 16792 16798 16797 16791 16893 16894 16792 16791 16793 16799 16798 16792 16894 16895 16793 16792 16794 16817 16799 16793 16895 16896 16794 16793 18519 18525 16817 16794 16896 18613 18519 16794 16796 16801 16800 16795 16797 16802 16801 16796 16798 16803 16802 16797 16799 16804 16803 16798 16817 16818 16804 16799 16801 16806 16805 16800 16802 16807 16806 16801 16803 16808 16807 16802 16804 16819 16808 16803 16818 16820 16819 16804 16806 16810 16809 16805 16807 16811 16810 16806 16808 16821 16811 16807 16819 16822 16821 16808 16810 16813 16812 16809 16811 16824 16813 16810 16821 16825 16824 16811 16813 16815 16814 16812 16824 16828 16815 16813 16815 16832 16816 16814 16828 16833 16832 16815 16832 16838 16837 16816 18525 18531 16818 16817 18531 18536 16820 16818 16820 16823 16822 16819 18536 18540 16823 16820 16822 16826 16825 16821 16823 16827 16826 16822 18540 18544 16827 16823 16825 16829 16828 16824 16826 16830 16829 16825 16827 16831 16830 16826 18544 18547 16831 16827 16829 16834 16833 16828 16830 16835 16834 16829 16831 16836 16835 16830 18547 18549 16836 16831 16833 16839 16838 16832 16834 16840 16839 16833 16835 16841 16840 16834 16836 16842 16841 16835 18549 18550 16842 16836 16844 16850 16849 16843 16921 16940 16844 16843 16845 16851 16850 16844 16940 16941 16845 16844 16846 16852 16851 16845 16941 16942 16846 16845 16847 16853 16852 16846 16942 16943 16847 16846 16848 16872 16853 16847 16943 16944 16848 16847 18582 18588 16872 16848 16944 18671 18582 16848 16850 16855 16854 16849 16851 16856 16855 16850 16852 16857 16856 16851 16853 16858 16857 16852 16872 16873 16858 16853 16855 16860 16859 16854 16856 16861 16860 16855 16857 16862 16861 16856 16858 16874 16862 16857 16873 16875 16874 16858 16860 16864 16863 16859 16861 16865 16864 16860 16862 16876 16865 16861 16874 16877 16876 16862 16864 16867 16866 16863 16865 16868 16867 16864 16876 16879 16868 16865 16867 16870 16869 16866 16868 16882 16870 16867 16879 16883 16882 16868 16870 16886 16871 16869 16882 16887 16886 16870 16886 16892 16891 16871 18588 18594 16873 16872 18594 18599 16875 16873 16875 16878 16877 16874 18599 18603 16878 16875 16877 16880 16879 16876 16878 16881 16880 16877 18603 18607 16881 16878 16880 16884 16883 16879 16881 16885 16884 16880 18607 18610 16885 16881 16883 16888 16887 16882 16884 16889 16888 16883 16885 16890 16889 16884 18610 18612 16890 16885 16887 16893 16892 16886 16888 16894 16893 16887 16889 16895 16894 16888 16890 16896 16895 16889 18612 18613 16896 16890 16898 16904 16903 16897 16993 16994 16898 16897 16899 16905 16904 16898 16994 16995 16899 16898 16900 16906 16905 16899 16995 16996 16900 16899 16901 16907 16906 16900 16996 16997 16901 16900 16902 16922 16907 16901 16997 16998 16902 16901 18645 18651 16922 16902 16998 18744 18645 16902 16904 16909 16908 16903 16905 16910 16909 16904 16906 16911 16910 16905 16907 16923 16911 16906 16922 16924 16923 16907 16909 16913 16912 16908 16910 16914 16913 16909 16911 16925 16914 16910 16923 16926 16925 16911 16913 16916 16915 16912 16914 16917 16916 16913 16925 16928 16917 16914 16916 16919 16918 16915 16917 16931 16919 16916 16928 16932 16931 16917 16919 16935 16920 16918 16931 16936 16935 16919 16935 16940 16921 16920 18651 18656 16924 16922 16924 16927 16926 16923 18656 18660 16927 16924 16926 16929 16928 16925 16927 16930 16929 16926 18660 18664 16930 16927 16929 16933 16932 16928 16930 16934 16933 16929 18664 18667 16934 16930 16932 16937 16936 16931 16933 16938 16937 16932 16934 16939 16938 16933 18667 18669 16939 16934 16936 16941 16940 16935 16937 16942 16941 16936 16938 16943 16942 16937 16939 16944 16943 16938 18669 18671 16944 16939 16946 16952 16951 16945 17047 17048 16946 16945 16947 16953 16952 16946 17048 17049 16947 16946 16948 16954 16953 16947 17049 17050 16948 16947 16949 16955 16954 16948 17050 17051 16949 16948 16950 16970 16955 16949 17051 17052 16950 16949 18696 18702 16970 16950 17052 18798 18696 16950 16952 16957 16956 16951 16953 16958 16957 16952 16954 16959 16958 16953 16955 16971 16959 16954 16970 16972 16971 16955 16957 16961 16960 16956 16958 16962 16961 16957 16959 16973 16962 16958 16971 16974 16973 16959 16961 16964 16963 16960 16962 16965 16964 16961 16973 16976 16965 16962 16964 16967 16966 16963 16965 16979 16967 16964 16976 16980 16979 16965 16967 16983 16968 16966 16979 16984 16983 16967 16983 16988 16969 16968 16988 16994 16993 16969 18702 18707 16972 16970 16972 16975 16974 16971 18707 18711 16975 16972 16974 16977 16976 16973 16975 16978 16977 16974 18711 18715 16978 16975 16977 16981 16980 16976 16978 16982 16981 16977 18715 18718 16982 16978 16980 16985 16984 16979 16981 16986 16985 16980 16982 16987 16986 16981 18718 18720 16987 16982 16984 16989 16988 16983 16985 16990 16989 16984 16986 16991 16990 16985 16987 16992 16991 16986 18720 18722 16992 16987 16989 16995 16994 16988 16990 16996 16995 16989 16991 16997 16996 16990 16992 16998 16997 16991 18722 18744 16998 16992 17000 17006 17005 16999 17103 17104 17000 16999 17001 17007 17006 17000 17104 17105 17001 17000 17002 17008 17007 17001 17105 17106 17002 17001 17003 17009 17008 17002 17106 17107 17003 17002 17004 17025 17009 17003 17107 17108 17004 17003 18750 18756 17025 17004 17108 18846 18750 17004 17006 17011 17010 17005 17007 17012 17011 17006 17008 17013 17012 17007 17009 17026 17013 17008 17025 17027 17026 17009 17011 17015 17014 17010 17012 17016 17015 17011 17013 17017 17016 17012 17026 17028 17017 17013 17015 17019 17018 17014 17016 17020 17019 17015 17017 17030 17020 17016 17028 17031 17030 17017 17019 17022 17021 17018 17020 17033 17022 17019 17030 17034 17033 17020 17022 17037 17023 17021 17033 17038 17037 17022 17037 17042 17024 17023 17042 17048 17047 17024 18756 18761 17027 17025 17027 17029 17028 17026 18761 18766 17029 17027 17029 17032 17031 17028 18766 18770 17032 17029 17031 17035 17034 17030 17032 17036 17035 17031 18770 18773 17036 17032 17034 17039 17038 17033 17035 17040 17039 17034 17036 17041 17040 17035 18773 18775 17041 17036 17038 17043 17042 17037 17039 17044 17043 17038 17040 17045 17044 17039 17041 17046 17045 17040 18775 18777 17046 17041 17043 17049 17048 17042 17044 17050 17049 17043 17045 17051 17050 17044 17046 17052 17051 17045 18777 18798 17052 17046 17054 17060 17059 17053 17164 17165 17054 17053 17055 17061 17060 17054 17165 17166 17055 17054 17056 17062 17061 17055 17166 17167 17056 17055 17057 17063 17062 17056 17167 17168 17057 17056 17058 17082 17063 17057 17168 17169 17058 17057 17081 17083 17082 17058 17169 17170 17081 17058 17060 17065 17064 17059 17061 17066 17065 17060 17062 17067 17066 17061 17063 17068 17067 17062 17082 17084 17068 17063 17065 17070 17069 17064 17066 17071 17070 17065 17067 17072 17071 17066 17068 17086 17072 17067 17084 17087 17086 17068 17070 17074 17073 17069 17071 17075 17074 17070 17072 17089 17075 17071 17086 17090 17089 17072 17074 17077 17076 17073 17075 17093 17077 17074 17089 17094 17093 17075 17077 17079 17078 17076 17093 17098 17079 17077 17079 17103 17080 17078 17098 17104 17103 17079 18804 18809 17083 17081 17170 18901 18804 17081 17083 17085 17084 17082 18809 18814 17085 17083 17085 17088 17087 17084 18814 18818 17088 17085 17087 17091 17090 17086 17088 17092 17091 17087 18818 18821 17092 17088 17090 17095 17094 17089 17091 17096 17095 17090 17092 17097 17096 17091 18821 18824 17097 17092 17094 17099 17098 17093 17095 17100 17099 17094 17096 17101 17100 17095 17097 17102 17101 17096 18824 18826 17102 17097 17099 17105 17104 17098 17100 17106 17105 17099 17101 17107 17106 17100 17102 17108 17107 17101 18826 18846 17108 17102 17110 17116 17115 17109 17198 17217 17110 17109 17111 17117 17116 17110 17217 17218 17111 17110 17112 17118 17117 17111 17218 17219 17112 17111 17113 17119 17118 17112 17219 17220 17113 17112 17114 17120 17119 17113 17220 17221 17114 17113 17114 18852 17139 17120 17221 18934 18852 17114 17116 17122 17121 17115 17117 17123 17122 17116 17118 17124 17123 17117 17119 17125 17124 17118 17120 17140 17125 17119 17139 17141 17140 17120 17122 17127 17126 17121 17123 17128 17127 17122 17124 17129 17128 17123 17125 17142 17129 17124 17140 17143 17142 17125 17127 17131 17130 17126 17128 17132 17131 17127 17129 17145 17132 17128 17142 17146 17145 17129 17131 17134 17133 17130 17132 17135 17134 17131 17145 17149 17135 17132 17134 17137 17136 17133 17135 17153 17137 17134 17149 17154 17153 17135 17137 17158 17138 17136 17153 17159 17158 17137 17158 17165 17164 17138 18859 18864 17141 17139 18853 18859 17139 18852 17141 17144 17143 17140 18864 18868 17144 17141 17143 17147 17146 17142 17144 17148 17147 17143 18868 18871 17148 17144 17146 17150 17149 17145 17147 17151 17150 17146 17148 17152 17151 17147 18871 18874 17152 17148 17150 17155 17154 17149 17151 17156 17155 17150 17152 17157 17156 17151 18874 18876 17157 17152 17154 17160 17159 17153 17155 17161 17160 17154 17156 17162 17161 17155 17157 17163 17162 17156 18876 18877 17163 17157 17159 17166 17165 17158 17160 17167 17166 17159 17161 17168 17167 17160 17162 17169 17168 17161 17163 17170 17169 17162 18877 18901 17170 17163 17172 17175 17174 17171 17247 17265 17172 17171 17173 17176 17175 17172 17265 17266 17173 17172 17173 17270 17177 17176 17267 17270 17173 17266 17175 17181 17180 17174 17176 17182 17181 17175 17177 17183 17182 17176 17178 17184 17183 17177 17270 17271 17178 17177 17179 17199 17184 17178 17271 17272 17179 17178 18907 18913 17199 17179 17272 19014 18907 17179 17181 17186 17185 17180 17182 17187 17186 17181 17183 17188 17187 17182 17184 17200 17188 17183 17199 17201 17200 17184 17186 17190 17189 17185 17187 17191 17190 17186 17188 17202 17191 17187 17200 17203 17202 17188 17190 17193 17192 17189 17191 17194 17193 17190 17202 17205 17194 17191 17193 17196 17195 17192 17194 17208 17196 17193 17205 17209 17208 17194 17196 17212 17197 17195 17208 17213 17212 17196 17212 17217 17198 17197 18913 18918 17201 17199 17201 17204 17203 17200 18918 18923 17204 17201 17203 17206 17205 17202 17204 17207 17206 17203 18923 18927 17207 17204 17206 17210 17209 17205 17207 17211 17210 17206 18927 18930 17211 17207 17209 17214 17213 17208 17210 17215 17214 17209 17211 17216 17215 17210 18930 18932 17216 17211 17213 17218 17217 17212 17214 17219 17218 17213 17215 17220 17219 17214 17216 17221 17220 17215 18932 18934 17221 17216 17223 17229 17228 17222 17318 17319 17223 17222 17224 17230 17229 17223 17319 17320 17224 17223 17225 17231 17230 17224 17320 17321 17225 17224 17226 17232 17231 17225 17321 17322 17226 17225 17227 17248 17232 17226 17322 17323 17227 17226 18963 18969 17248 17227 17323 19046 18963 17227 17229 17234 17233 17228 17230 17235 17234 17229 17231 17236 17235 17230 17232 17249 17236 17231 17248 17250 17249 17232 17234 17238 17237 17233 17235 17239 17238 17234 17236 17240 17239 17235 17249 17251 17240 17236 17238 17242 17241 17237 17239 17243 17242 17238 17240 17253 17243 17239 17251 17254 17253 17240 17242 17245 17244 17241 17243 17256 17245 17242 17253 17257 17256 17243 17245 17260 17246 17244 17256 17261 17260 17245 17260 17265 17247 17246 18969 18975 17250 17248 17250 17252 17251 17249 18975 18980 17252 17250 17252 17255 17254 17251 18980 18984 17255 17252 17254 17258 17257 17253 17255 17259 17258 17254 18984 18987 17259 17255 17257 17262 17261 17256 17258 17263 17262 17257 17259 17264 17263 17258 18987 18990 17264 17259 17261 17266 17265 17260 17262 17267 17266 17261 17263 17268 17267 17262 17264 17269 17268 17263 18990 18992 17269 17264 17268 17271 17270 17267 17269 17272 17271 17268 18992 19014 17272 17269 17274 17277 17276 17273 17275 17278 17277 17274 17277 17283 17282 17276 17278 17284 17283 17277 17279 17285 17284 17278 17280 17286 17285 17279 17281 17300 17286 17280 19021 19027 17300 17281 17283 17288 17287 17282 17284 17289 17288 17283 17285 17290 17289 17284 17286 17301 17290 17285 17300 17302 17301 17286 17288 17292 17291 17287 17289 17293 17292 17288 17290 17303 17293 17289 17301 17304 17303 17290 17292 17295 17294 17291 17293 17296 17295 17292 17303 17306 17296 17293 17295 17298 17297 17294 17296 17309 17298 17295 17306 17310 17309 17296 17298 17313 17299 17297 17309 17314 17313 17298 17313 17319 17318 17299 19027 19032 17302 17300 17302 17305 17304 17301 19032 19036 17305 17302 17304 17307 17306 17303 17305 17308 17307 17304 19036 19040 17308 17305 17307 17311 17310 17306 17308 17312 17311 17307 19040 19043 17312 17308 17310 17315 17314 17309 17311 17316 17315 17310 17312 17317 17316 17311 19043 19045 17317 17312 17314 17320 17319 17313 17315 17321 17320 17314 17316 17322 17321 17315 17317 17323 17322 17316 19045 19046 17323 17317 17325 17331 17330 17324 17414 17415 17325 17324 17326 17332 17331 17325 17415 17416 17326 17325 17327 17333 17332 17326 17416 17417 17327 17326 17328 17334 17333 17327 17417 17418 17328 17327 17329 17348 17334 17328 17418 17419 17329 17328 19069 19075 17348 17329 17419 19159 19069 17329 17331 17336 17335 17330 17332 17337 17336 17331 17333 17338 17337 17332 17334 17349 17338 17333 17348 17350 17349 17334 17336 17340 17339 17335 17337 17341 17340 17336 17338 17351 17341 17337 17349 17352 17351 17338 17340 17343 17342 17339 17341 17344 17343 17340 17351 17354 17344 17341 17343 17346 17345 17342 17344 17357 17346 17343 17354 17358 17357 17344 17346 17361 17347 17345 17357 17362 17361 17346 17361 17367 17366 17347 19075 19080 17350 17348 17350 17353 17352 17349 19080 19084 17353 17350 17352 17355 17354 17351 17353 17356 17355 17352 19084 19088 17356 17353 17355 17359 17358 17354 17356 17360 17359 17355 19088 19091 17360 17356 17358 17363 17362 17357 17359 17364 17363 17358 17360 17365 17364 17359 19091 19093 17365 17360 17362 17368 17367 17361 17363 17369 17368 17362 17364 17370 17369 17363 17365 17371 17370 17364 19093 19094 17371 17365 17367 19022 19021 17366 17368 19023 19022 17367 17369 19024 19023 17368 17370 19025 19024 17369 17371 19026 19025 17370 19094 20725 19026 17371 17373 17378 17377 17372 17466 17467 17373 17372 17374 17379 17378 17373 17467 17468 17374 17373 17375 17380 17379 17374 17468 17469 17375 17374 17376 17381 17380 17375 17469 17470 17376 17375 17394 17395 17381 17376 17470 17471 17394 17376 17378 17383 17382 17377 17379 17384 17383 17378 17380 17385 17384 17379 17381 17396 17385 17380 17395 17397 17396 17381 17383 17387 17386 17382 17384 17388 17387 17383 17385 17398 17388 17384 17396 17399 17398 17385 17387 17390 17389 17386 17388 17401 17390 17387 17398 17402 17401 17388 17390 17392 17391 17389 17401 17405 17392 17390 17392 17409 17393 17391 17405 17410 17409 17392 17409 17415 17414 17393 19117 19122 17395 17394 17471 19209 19117 17394 19122 19127 17397 17395 17397 17400 17399 17396 19127 19131 17400 17397 17399 17403 17402 17398 17400 17404 17403 17399 19131 19134 17404 17400 17402 17406 17405 17401 17403 17407 17406 17402 17404 17408 17407 17403 19134 19137 17408 17404 17406 17411 17410 17405 17407 17412 17411 17406 17408 17413 17412 17407 19137 19139 17413 17408 17410 17416 17415 17409 17411 17417 17416 17410 17412 17418 17417 17411 17413 17419 17418 17412 19139 19159 17419 17413 17421 17427 17426 17420 17500 17525 17421 17420 17422 17428 17427 17421 17525 17526 17422 17421 17423 17429 17428 17422 17526 17527 17423 17422 17424 17430 17429 17423 17527 17528 17424 17423 17425 17446 17430 17424 17528 17529 17425 17424 17445 17447 17446 17425 17529 17530 17445 17425 17427 17432 17431 17426 17428 17433 17432 17427 17429 17434 17433 17428 17430 17435 17434 17429 17446 17448 17435 17430 17432 17437 17436 17431 17433 17438 17437 17432 17434 17439 17438 17433 17435 17450 17439 17434 17448 17451 17450 17435 17438 17441 17440 17437 17439 17453 17441 17438 17450 17454 17453 17439 17441 17443 17442 17440 17453 17457 17443 17441 17443 17461 17444 17442 17457 17462 17461 17443 17461 17467 17466 17444 19167 19172 17447 17445 17530 19265 19167 17445 17447 17449 17448 17446 19172 19176 17449 17447 17449 17452 17451 17448 19176 19180 17452 17449 17451 17455 17454 17450 17452 17456 17455 17451 19180 19183 17456 17452 17454 17458 17457 17453 17455 17459 17458 17454 17456 17460 17459 17455 19183 19185 17460 17456 17458 17463 17462 17457 17459 17464 17463 17458 17460 17465 17464 17459 19185 19187 17465 17460 17462 17468 17467 17461 17463 17469 17468 17462 17464 17470 17469 17463 17465 17471 17470 17464 19187 19209 17471 17465 17578 19296 19215 17472 19215 19221 17481 17472 17577 17578 17472 17473 17472 17481 17480 17473 17576 17577 17473 17474 17473 17480 17479 17474 17575 17576 17474 17475 17474 17479 17478 17475 17475 17580 17574 17575 17477 17580 17475 17478 17477 17483 17482 17476 17579 17580 17477 17476 17478 17484 17483 17477 17479 17485 17484 17478 17480 17486 17485 17479 17481 17501 17486 17480 17481 19221 17502 17501 17483 17488 17487 17482 17484 17489 17488 17483 17485 17490 17489 17484 17486 17503 17490 17485 17501 17504 17503 17486 17488 17492 17491 17487 17489 17493 17492 17488 17490 17506 17493 17489 17503 17507 17506 17490 17492 17495 17494 17491 17493 17496 17495 17492 17506 17510 17496 17493 17495 17498 17497 17494 17496 17514 17498 17495 17510 17515 17514 17496 17498 17519 17499 17497 17514 17520 17519 17498 17519 17525 17500 17499 17502 17505 17504 17501 19227 19231 17505 17502 19222 19227 17502 19221 17504 17508 17507 17503 17505 17509 17508 17504 19231 19234 17509 17505 17507 17511 17510 17506 17508 17512 17511 17507 17509 17513 17512 17508 19234 19237 17513 17509 17511 17516 17515 17510 17512 17517 17516 17511 17513 17518 17517 17512 19237 19239 17518 17513 17515 17521 17520 17514 17516 17522 17521 17515 17517 17523 17522 17516 17518 17524 17523 17517 19239 19259 17524 17518 17520 17526 17525 17519 17521 17527 17526 17520 17522 17528 17527 17521 17523 17529 17528 17522 17524 17530 17529 17523 19259 19265 17530 17524 17532 17538 17537 17531 17629 17630 17532 17531 17533 17539 17538 17532 17630 17631 17533 17532 17534 17540 17539 17533 17631 17632 17534 17533 17535 17541 17540 17534 17632 17633 17535 17534 17536 17558 17541 17535 17633 17634 17536 17535 19269 19275 17558 17536 17634 19354 19269 17536 17538 17543 17542 17537 17539 17544 17543 17538 17540 17545 17544 17539 17541 17559 17545 17540 17558 17560 17559 17541 17543 17547 17546 17542 17544 17548 17547 17543 17545 17549 17548 17544 17559 17561 17549 17545 17547 17551 17550 17546 17548 17552 17551 17547 17549 17563 17552 17548 17561 17564 17563 17549 17551 17554 17553 17550 17552 17566 17554 17551 17563 17567 17566 17552 17554 17556 17555 17553 17566 17570 17556 17554 17556 17574 17557 17555 17570 17575 17574 17556 17574 17580 17579 17557 19275 19280 17560 17558 17560 17562 17561 17559 19280 19285 17562 17560 17562 17565 17564 17561 19285 19289 17565 17562 17564 17568 17567 17563 17565 17569 17568 17564 19289 19292 17569 17565 17567 17571 17570 17566 17568 17572 17571 17567 17569 17573 17572 17568 19292 19294 17573 17569 17571 17576 17575 17570 17572 17577 17576 17571 17573 17578 17577 17572 19294 19296 17578 17573 17582 17588 17587 17581 17658 17678 17582 17581 17583 17589 17588 17582 17678 17679 17583 17582 17584 17590 17589 17583 17679 17680 17584 17583 17585 17591 17590 17584 17680 17681 17585 17584 17586 17609 17591 17585 17681 17682 17586 17585 19325 19331 17609 17586 17682 19408 19325 17586 17588 17593 17592 17587 17589 17594 17593 17588 17590 17595 17594 17589 17591 17596 17595 17590 17609 17610 17596 17591 17593 17598 17597 17592 17594 17599 17598 17593 17595 17600 17599 17594 17596 17611 17600 17595 17610 17612 17611 17596 17598 17602 17601 17597 17599 17603 17602 17598 17600 17613 17603 17599 17611 17614 17613 17600 17602 17605 17604 17601 17603 17616 17605 17602 17613 17617 17616 17603 17605 17607 17606 17604 17616 17620 17607 17605 17607 17624 17608 17606 17620 17625 17624 17607 17624 17630 17629 17608 19331 19336 17610 17609 19336 19341 17612 17610 17612 17615 17614 17611 19341 19345 17615 17612 17614 17618 17617 17613 17615 17619 17618 17614 19345 19348 17619 17615 17617 17621 17620 17616 17618 17622 17621 17617 17619 17623 17622 17618 19348 19351 17623 17619 17621 17626 17625 17620 17622 17627 17626 17621 17623 17628 17627 17622 19351 19353 17628 17623 17625 17631 17630 17624 17626 17632 17631 17625 17627 17633 17632 17626 17628 17634 17633 17627 19353 19354 17634 17628 17636 17641 17640 17635 17731 17732 17636 17635 17637 17642 17641 17636 17732 17733 17637 17636 17638 17643 17642 17637 17733 17734 17638 17637 17639 17644 17643 17638 17734 17735 17639 17638 17659 17660 17644 17639 17735 17736 17659 17639 17641 17646 17645 17640 17642 17647 17646 17641 17643 17648 17647 17642 17644 17661 17648 17643 17660 17662 17661 17644 17646 17650 17649 17645 17647 17651 17650 17646 17648 17663 17651 17647 17661 17664 17663 17648 17650 17653 17652 17649 17651 17654 17653 17650 17663 17666 17654 17651 17653 17656 17655 17652 17654 17669 17656 17653 17666 17670 17669 17654 17656 17673 17657 17655 17669 17674 17673 17656 17673 17678 17658 17657 19385 19390 17660 17659 17736 19481 19385 17659 19390 19395 17662 17660 17662 17665 17664 17661 19395 19399 17665 17662 17664 17667 17666 17663 17665 17668 17667 17664 19399 19402 17668 17665 17667 17671 17670 17666 17668 17672 17671 17667 19402 19405 17672 17668 17670 17675 17674 17669 17671 17676 17675 17670 17672 17677 17676 17671 19405 19407 17677 17672 17674 17679 17678 17673 17675 17680 17679 17674 17676 17681 17680 17675 17677 17682 17681 17676 19407 19408 17682 17677 17684 17689 17688 17683 17791 17792 17684 17683 17685 17690 17689 17684 17792 17793 17685 17684 17686 17691 17690 17685 17793 17794 17686 17685 17687 17692 17691 17686 17794 17795 17687 17686 17707 17708 17692 17687 17795 17796 17707 17687 17689 17694 17693 17688 17690 17695 17694 17689 17691 17696 17695 17690 17692 17709 17696 17691 17708 17710 17709 17692 17694 17698 17697 17693 17695 17699 17698 17694 17696 17711 17699 17695 17709 17712 17711 17696 17698 17701 17700 17697 17699 17702 17701 17698 17711 17714 17702 17699 17701 17704 17703 17700 17702 17717 17704 17701 17714 17718 17717 17702 17704 17721 17705 17703 17717 17722 17721 17704 17721 17726 17706 17705 17726 17732 17731 17706 19433 19439 17708 17707 17796 19533 19433 17707 19439 19444 17710 17708 17710 17713 17712 17709 19444 19448 17713 17710 17712 17715 17714 17711 17713 17716 17715 17712 19448 19452 17716 17713 17715 17719 17718 17714 17716 17720 17719 17715 19452 19455 17720 17716 17718 17723 17722 17717 17719 17724 17723 17718 17720 17725 17724 17719 19455 19457 17725 17720 17722 17727 17726 17721 17723 17728 17727 17722 17724 17729 17728 17723 17725 17730 17729 17724 19457 19458 17730 17725 17727 17733 17732 17726 17728 17734 17733 17727 17729 17735 17734 17728 17730 17736 17735 17729 19458 19481 17736 17730 17738 17745 17744 17737 17824 17847 17738 17737 17739 17746 17745 17738 17847 17848 17739 17738 17740 17747 17746 17739 17848 17849 17740 17739 17741 17748 17747 17740 17849 17850 17741 17740 17742 17749 17748 17741 17850 17851 17742 17741 17743 17768 17749 17742 17851 17852 17743 17742 19485 19491 17768 17743 17852 19585 19485 17743 17745 17751 17750 17744 17746 17752 17751 17745 17747 17753 17752 17746 17748 17754 17753 17747 17749 17769 17754 17748 17768 17770 17769 17749 17751 17756 17755 17750 17752 17757 17756 17751 17753 17758 17757 17752 17754 17771 17758 17753 17769 17772 17771 17754 17756 17760 17759 17755 17757 17761 17760 17756 17758 17762 17761 17757 17771 17774 17762 17758 17760 17764 17763 17759 17761 17765 17764 17760 17762 17777 17765 17761 17774 17778 17777 17762 17765 17781 17766 17764 17777 17782 17781 17765 17781 17786 17767 17766 17786 17792 17791 17767 19491 19496 17770 17768 17770 17773 17772 17769 19496 19500 17773 17770 17772 17775 17774 17771 17773 17776 17775 17772 19500 19504 17776 17773 17775 17779 17778 17774 17776 17780 17779 17775 19504 19507 17780 17776 17778 17783 17782 17777 17779 17784 17783 17778 17780 17785 17784 17779 19507 19509 17785 17780 17782 17787 17786 17781 17783 17788 17787 17782 17784 17789 17788 17783 17785 17790 17789 17784 19509 19511 17790 17785 17787 17793 17792 17786 17788 17794 17793 17787 17789 17795 17794 17788 17790 17796 17795 17789 19511 19533 17796 17790 17798 17804 17803 17797 17909 17910 17798 17797 17799 17805 17804 17798 17910 17911 17799 17798 17800 17806 17805 17799 17911 17912 17800 17799 17801 17807 17806 17800 17912 17913 17801 17800 17802 17826 17807 17801 17913 17914 17802 17801 17825 17827 17826 17802 17914 17915 17825 17802 17804 17809 17808 17803 17805 17810 17809 17804 17806 17811 17810 17805 17807 17812 17811 17806 17826 17828 17812 17807 17809 17814 17813 17808 17810 17815 17814 17809 17811 17816 17815 17810 17812 17830 17816 17811 17828 17831 17830 17812 17814 17818 17817 17813 17815 17819 17818 17814 17816 17833 17819 17815 17830 17834 17833 17816 17818 17821 17820 17817 17819 17837 17821 17818 17833 17838 17837 17819 17821 17823 17822 17820 17837 17842 17823 17821 17823 17847 17824 17822 17842 17848 17847 17823 19543 19548 17827 17825 17915 19639 19543 17825 17827 17829 17828 17826 19548 19552 17829 17827 17829 17832 17831 17828 19552 19556 17832 17829 17831 17835 17834 17830 17832 17836 17835 17831 19556 19559 17836 17832 17834 17839 17838 17833 17835 17840 17839 17834 17836 17841 17840 17835 19559 19561 17841 17836 17838 17843 17842 17837 17839 17844 17843 17838 17840 17845 17844 17839 17841 17846 17845 17840 19561 19563 17846 17841 17843 17849 17848 17842 17844 17850 17849 17843 17845 17851 17850 17844 17846 17852 17851 17845 19563 19585 17852 17846 17854 17860 17859 17853 17946 17965 17854 17853 17855 17861 17860 17854 17965 17966 17855 17854 17856 17862 17861 17855 17966 17967 17856 17855 17857 17863 17862 17856 17967 17968 17857 17856 17858 17883 17863 17857 17968 17969 17858 17857 17882 17884 17883 17858 17969 17970 17882 17858 17860 17865 17864 17859 17861 17866 17865 17860 17862 17867 17866 17861 17863 17868 17867 17862 17883 17885 17868 17863 17865 17870 17869 17864 17866 17871 17870 17865 17867 17872 17871 17866 17868 17887 17872 17867 17885 17888 17887 17868 17870 17874 17873 17869 17871 17875 17874 17870 17872 17890 17875 17871 17887 17891 17890 17872 17874 17877 17876 17873 17875 17878 17877 17874 17890 17894 17878 17875 17877 17880 17879 17876 17878 17898 17880 17877 17894 17899 17898 17878 17880 17903 17881 17879 17898 17904 17903 17880 17903 17910 17909 17881 19591 19596 17884 17882 17970 19697 19591 17882 17884 17886 17885 17883 19596 19600 17886 17884 17886 17889 17888 17885 19600 19604 17889 17886 17888 17892 17891 17887 17889 17893 17892 17888 19604 19607 17893 17889 17891 17895 17894 17890 17892 17896 17895 17891 17893 17897 17896 17892 19607 19609 17897 17893 17895 17900 17899 17894 17896 17901 17900 17895 17897 17902 17901 17896 19609 19611 17902 17897 17899 17905 17904 17898 17900 17906 17905 17899 17901 17907 17906 17900 17902 17908 17907 17901 19611 19633 17908 17902 17904 17911 17910 17903 17905 17912 17911 17904 17906 17913 17912 17905 17907 17914 17913 17906 17908 17915 17914 17907 19633 19639 17915 17908 17917 17923 17922 17916 18002 18025 17917 17916 17918 17924 17923 17917 18025 18026 17918 17917 17919 17925 17924 17918 18026 18027 17919 17918 17920 17926 17925 17919 18027 18028 17920 17919 17921 17927 17926 17920 18028 18029 17921 17920 19641 19647 17927 17921 18029 19731 19641 17921 17923 17929 17928 17922 17924 17930 17929 17923 17925 17931 17930 17924 17926 17932 17931 17925 17927 17947 17932 17926 19647 19653 17947 17927 17929 17934 17933 17928 17930 17935 17934 17929 17931 17936 17935 17930 17932 17948 17936 17931 17947 17949 17948 17932 17934 17938 17937 17933 17935 17939 17938 17934 17936 17950 17939 17935 17948 17951 17950 17936 17938 17941 17940 17937 17939 17942 17941 17938 17950 17953 17942 17939 17941 17944 17943 17940 17942 17956 17944 17941 17953 17957 17956 17942 17944 17960 17945 17943 17956 17961 17960 17944 17960 17965 17946 17945 19653 19658 17949 17947 17949 17952 17951 17948 19658 19662 17952 17949 17951 17954 17953 17950 17952 17955 17954 17951 19662 19666 17955 17952 17954 17958 17957 17953 17955 17959 17958 17954 19666 19669 17959 17955 17957 17962 17961 17956 17958 17963 17962 17957 17959 17964 17963 17958 19669 19671 17964 17959 17961 17966 17965 17960 17962 17967 17966 17961 17963 17968 17967 17962 17964 17969 17968 17963 17964 19671 17970 17969 19691 19697 17970 19671 17972 17978 17977 17971 18057 18080 17972 17971 17973 17979 17978 17972 18080 18081 17973 17972 17974 17980 17979 17973 18081 18082 17974 17973 17975 17981 17980 17974 18082 18083 17975 17974 17976 17982 17981 17975 18083 18084 17976 17975 18003 18004 17982 17976 18084 18085 18003 17976 17978 17984 17983 17977 17979 17985 17984 17978 17980 17986 17985 17979 17981 17987 17986 17980 17982 18005 17987 17981 18004 18006 18005 17982 17984 17989 17988 17983 17985 17990 17989 17984 17986 17991 17990 17985 17987 18007 17991 17986 18005 18008 18007 17987 17989 17993 17992 17988 17990 17994 17993 17989 17991 17995 17994 17990 18007 18010 17995 17991 17993 17997 17996 17992 17994 17998 17997 17993 17995 18013 17998 17994 18010 18014 18013 17995 17997 18000 17999 17996 17998 18016 18000 17997 18013 18017 18016 17998 18000 18020 18001 17999 18016 18021 18020 18000 18020 18025 18002 18001 19703 19709 18004 18003 18085 19805 19703 18003 19709 19714 18006 18004 18006 18009 18008 18005 19714 19718 18009 18006 18008 18011 18010 18007 18009 18012 18011 18008 19718 19721 18012 18009 18011 18015 18014 18010 18012 19724 18015 18011 19721 19725 19724 18012 18014 18018 18017 18013 18015 18019 18018 18014 19724 19727 18019 18015 18017 18022 18021 18016 18018 18023 18022 18017 18019 18024 18023 18018 19727 19729 18024 18019 18021 18026 18025 18020 18022 18027 18026 18021 18023 18028 18027 18022 18024 18029 18028 18023 19729 19731 18029 18024 18031 18037 18036 18030 18112 18137 18031 18030 18032 18038 18037 18031 18137 18138 18032 18031 18033 18039 18038 18032 18138 18139 18033 18032 18034 18040 18039 18033 18139 18140 18034 18033 18035 18059 18040 18034 18140 18141 18035 18034 18058 18060 18059 18035 18141 18142 18058 18035 18037 18042 18041 18036 18038 18043 18042 18037 18039 18044 18043 18038 18040 18045 18044 18039 18059 18061 18045 18040 18042 18047 18046 18041 18043 18048 18047 18042 18044 18049 18048 18043 18045 18063 18049 18044 18061 18064 18063 18045 18047 18051 18050 18046 18048 18052 18051 18047 18049 18066 18052 18048 18063 18067 18066 18049 18051 18054 18053 18050 18052 18070 18054 18051 18066 18071 18070 18052 18054 18056 18055 18053 18070 18075 18056 18054 18056 18080 18057 18055 18075 18081 18080 18056 19763 19768 18060 18058 18142 19859 19763 18058 18060 18062 18061 18059 19768 19772 18062 18060 18062 18065 18064 18061 19772 19776 18065 18062 18064 18068 18067 18063 18065 18069 18068 18064 19776 19779 18069 18065 18067 18072 18071 18066 18068 18073 18072 18067 18069 18074 18073 18068 19779 19781 18074 18069 18071 18076 18075 18070 18072 18077 18076 18071 18073 18078 18077 18072 18074 18079 18078 18073 19781 19783 18079 18074 18076 18082 18081 18075 18077 18083 18082 18076 18078 18084 18083 18077 18079 18085 18084 18078 19783 19805 18085 18079 18087 18093 18092 18086 18185 18186 18087 18086 18088 18094 18093 18087 18186 18187 18088 18087 18089 18095 18094 18088 18187 18188 18089 18088 18090 18096 18095 18089 18188 18189 18090 18089 18091 18113 18096 18090 18189 18190 18091 18090 19811 19817 18113 18091 18190 19889 19811 18091 18093 18098 18097 18092 18094 18099 18098 18093 18095 18100 18099 18094 18096 18114 18100 18095 18113 18115 18114 18096 18098 18102 18101 18097 18099 18103 18102 18098 18100 18116 18103 18099 18114 18117 18116 18100 18102 18105 18104 18101 18103 18106 18105 18102 18116 18119 18106 18103 18105 18108 18107 18104 18106 18122 18108 18105 18119 18123 18122 18106 18108 18126 18110 18107 18122 18127 18126 18108 18110 18131 18111 18109 18126 18132 18131 18110 18131 18137 18112 18111 19817 19822 18115 18113 18115 18118 18117 18114 19822 19826 18118 18115 18117 18120 18119 18116 18118 18121 18120 18117 19826 19830 18121 18118 18120 18124 18123 18119 18121 18125 18124 18120 19830 19833 18125 18121 18123 18128 18127 18122 18124 18129 18128 18123 18125 18130 18129 18124 19833 19835 18130 18125 18127 18133 18132 18126 18128 18134 18133 18127 18129 18135 18134 18128 18130 18136 18135 18129 19835 19836 18136 18130 18132 18138 18137 18131 18133 18139 18138 18132 18134 18140 18139 18133 18135 18141 18140 18134 18136 18142 18141 18135 19836 19859 18142 18136 18144 18150 18149 18143 18216 18237 18144 18143 18145 18151 18150 18144 18237 18238 18145 18144 18146 18152 18151 18145 18238 18239 18146 18145 18147 18153 18152 18146 18239 18240 18147 18146 18148 18168 18153 18147 18240 18241 18148 18147 19863 19869 18168 18148 18242 19863 18148 18241 18150 18155 18154 18149 18151 18156 18155 18150 18152 18157 18156 18151 18153 18169 18157 18152 18168 18170 18169 18153 18155 18159 18158 18154 18156 18160 18159 18155 18157 18161 18160 18156 18169 18171 18161 18157 18159 18163 18162 18158 18160 18164 18163 18159 18161 18173 18164 18160 18171 18174 18173 18161 18163 18166 18165 18162 18164 18176 18166 18163 18173 18177 18176 18164 18166 18180 18167 18165 18176 18181 18180 18166 18180 18186 18185 18167 19869 19874 18170 18168 18170 18172 18171 18169 19874 19879 18172 18170 18172 18175 18174 18171 19879 19883 18175 18172 18174 18178 18177 18173 18175 18179 18178 18174 19883 19886 18179 18175 18177 18182 18181 18176 18178 18183 18182 18177 18179 18184 18183 18178 19886 19888 18184 18179 18181 18187 18186 18180 18182 18188 18187 18181 18183 18189 18188 18182 18184 18190 18189 18183 19888 19889 18190 18184 18192 18198 18197 18191 18289 18290 18192 18191 18193 18199 18198 18192 18290 18291 18193 18192 18194 18200 18199 18193 18291 18292 18194 18193 18195 18201 18200 18194 18292 18293 18195 18194 18196 18217 18201 18195 18293 18294 18196 18195 19916 19922 18217 18196 18294 19988 19916 18196 18198 18203 18202 18197 18199 18204 18203 18198 18200 18205 18204 18199 18201 18218 18205 18200 18217 18219 18218 18201 18203 18207 18206 18202 18204 18208 18207 18203 18205 18220 18208 18204 18218 18221 18220 18205 18207 18211 18210 18206 18208 18223 18211 18207 18220 18224 18223 18208 18210 18213 18212 18209 18211 18227 18213 18210 18223 18228 18227 18211 18213 18215 18214 18212 18227 18232 18215 18213 18215 18237 18216 18214 18232 18238 18237 18215 19922 19927 18219 18217 18219 18222 18221 18218 19927 19931 18222 18219 18221 18225 18224 18220 18222 18226 18225 18221 19931 19934 18226 18222 18224 18229 18228 18223 18225 18230 18229 18224 18226 18231 18230 18225 19934 19937 18231 18226 18228 18233 18232 18227 18229 18234 18233 18228 18230 18235 18234 18229 18231 18236 18235 18230 19937 19939 18236 18231 18233 18239 18238 18232 18234 18240 18239 18233 18235 18241 18240 18234 18236 18242 18241 18235 19939 19958 18242 18236 18242 19958 19864 19863 18244 18250 18249 18243 18319 18339 18244 18243 18245 18251 18250 18244 18339 18340 18245 18244 18246 18252 18251 18245 18340 18341 18246 18245 18247 18253 18252 18246 18341 18342 18247 18246 18248 18254 18253 18247 18342 18343 18248 18247 18270 18271 18254 18248 18343 18344 18270 18248 18250 18256 18255 18249 18251 18257 18256 18250 18252 18258 18257 18251 18253 18259 18258 18252 18254 18272 18259 18253 18271 18273 18272 18254 18256 18261 18260 18255 18257 18262 18261 18256 18258 18263 18262 18257 18259 18274 18263 18258 18272 18275 18274 18259 18261 18265 18264 18260 18262 18266 18265 18261 18263 18277 18266 18262 18274 18278 18277 18263 18265 18268 18267 18264 18266 18280 18268 18265 18277 18281 18280 18266 18268 18284 18269 18267 18280 18285 18284 18268 18284 18290 18289 18269 19964 19970 18271 18270 18344 20061 19964 18270 19970 19975 18273 18271 18273 18276 18275 18272 19975 19979 18276 18273 18275 18279 18278 18274 18276 19982 18279 18275 19979 19983 19982 18276 18278 18282 18281 18277 18279 18283 18282 18278 19982 19985 18283 18279 18281 18286 18285 18280 18282 18287 18286 18281 18283 18288 18287 18282 19985 19987 18288 18283 18285 18291 18290 18284 18286 18292 18291 18285 18287 18293 18292 18286 18288 18294 18293 18287 19987 19988 18294 18288 18296 18302 18301 18295 18394 18395 18296 18295 18297 18303 18302 18296 18395 18396 18297 18296 18298 18304 18303 18297 18396 18397 18298 18297 18299 18305 18304 18298 18397 18398 18299 18298 18300 18320 18305 18299 18398 18399 18300 18299 20016 20022 18320 18300 18399 20122 20016 18300 18302 18307 18306 18301 18303 18308 18307 18302 18304 18309 18308 18303 18305 18321 18309 18304 18320 18322 18321 18305 18307 18311 18310 18306 18308 18312 18311 18307 18309 18323 18312 18308 18321 18324 18323 18309 18311 18314 18313 18310 18312 18326 18314 18311 18323 18327 18326 18312 18314 18316 18315 18313 18326 18330 18316 18314 18316 18334 18318 18315 18330 18335 18334 18316 18318 18339 18319 18317 18334 18340 18339 18318 20022 20027 18322 18320 18322 18325 18324 18321 20027 20031 18325 18322 18324 18328 18327 18323 18325 18329 18328 18324 20031 20035 18329 18325 18327 18331 18330 18326 18328 18332 18331 18327 18329 18333 18332 18328 20035 20038 18333 18329 18331 18336 18335 18330 18332 18337 18336 18331 18333 18338 18337 18332 20038 20040 18338 18333 18335 18341 18340 18334 18336 18342 18341 18335 18337 18343 18342 18336 18338 18344 18343 18337 20040 20061 18344 18338 18346 18352 18351 18345 18425 18450 18346 18345 18347 18353 18352 18346 18450 18451 18347 18346 18348 18354 18353 18347 18451 18452 18348 18347 18349 18355 18354 18348 18452 18453 18349 18348 18350 18356 18355 18349 18453 18454 18350 18349 18374 20073 18356 18350 18454 18455 18374 18350 18352 18358 18357 18351 18353 18359 18358 18352 18354 18360 18359 18353 18355 18361 18360 18354 18356 18375 18361 18355 20073 20079 18375 18356 18358 18363 18362 18357 18359 18364 18363 18358 18360 18365 18364 18359 18361 18376 18365 18360 18375 18377 18376 18361 18363 18367 18366 18362 18364 18368 18367 18363 18365 18378 18368 18364 18376 18379 18378 18365 18367 18370 18369 18366 18368 18381 18370 18367 18378 18382 18381 18368 18370 18372 18371 18369 18381 18385 18372 18370 18372 18389 18373 18371 18385 18390 18389 18372 18389 18395 18394 18373 20067 20074 20073 18374 18455 20171 20067 18374 20079 20084 18377 18375 18377 18380 18379 18376 20084 20088 18380 18377 18379 18383 18382 18378 18380 18384 18383 18379 20088 20092 18384 18380 18382 18386 18385 18381 18383 18387 18386 18382 18384 18388 18387 18383 20092 20095 18388 18384 18386 18391 18390 18385 18387 18392 18391 18386 18388 18393 18392 18387 20095 20097 18393 18388 18390 18396 18395 18389 18391 18397 18396 18390 18392 18398 18397 18391 18393 18399 18398 18392 20097 20122 18399 18393 18401 18407 18406 18400 18512 18513 18401 18400 18402 18408 18407 18401 18513 18514 18402 18401 18403 18409 18408 18402 18514 18515 18403 18402 18404 18410 18409 18403 18515 18516 18404 18403 18405 18427 18410 18404 18516 18517 18405 18404 18426 18428 18427 18405 18517 18518 18426 18405 18407 18412 18411 18406 18408 18413 18412 18407 18409 18414 18413 18408 18410 18429 18414 18409 18427 18430 18429 18410 18412 18416 18415 18411 18413 18417 18416 18412 18414 18418 18417 18413 18429 18432 18418 18414 18416 18420 18419 18415 18417 18421 18420 18416 18418 18435 18421 18417 18432 18436 18435 18418 18420 18423 18422 18419 18421 18439 18423 18420 18435 18440 18439 18421 18423 18444 18424 18422 18439 18445 18444 18423 18444 18450 18425 18424 20129 20134 18428 18426 18518 20225 20129 18426 18428 18431 18430 18427 20134 20139 18431 18428 18430 18433 18432 18429 18431 18434 18433 18430 20139 20143 18434 18431 18433 18437 18436 18432 18434 18438 18437 18433 20143 20146 18438 18434 18436 18441 18440 18435 18437 18442 18441 18436 18438 18443 18442 18437 20146 20148 18443 18438 18440 18446 18445 18439 18441 18447 18446 18440 18442 18448 18447 18441 18443 18449 18448 18442 20148 20150 18449 18443 18445 18451 18450 18444 18446 18452 18451 18445 18447 18453 18452 18446 18448 18454 18453 18447 18449 18455 18454 18448 20150 20171 18455 18449 18457 18463 18462 18456 18550 18576 18457 18456 18458 18464 18463 18457 18576 18577 18458 18457 18459 18465 18464 18458 18577 18578 18459 18458 18460 18466 18465 18459 18578 18579 18460 18459 18461 18486 18466 18460 18579 18580 18461 18460 18485 18487 18486 18461 18580 18581 18485 18461 18463 18468 18467 18462 18464 18469 18468 18463 18465 18470 18469 18464 18466 18471 18470 18465 18486 18488 18471 18466 18468 18473 18472 18467 18469 18474 18473 18468 18470 18475 18474 18469 18471 18490 18475 18470 18488 18491 18490 18471 18473 18477 18476 18472 18474 18478 18477 18473 18475 18493 18478 18474 18490 18494 18493 18475 18477 18480 18479 18476 18478 18481 18480 18477 18493 18497 18481 18478 18480 18483 18482 18479 18481 18501 18483 18480 18497 18502 18501 18481 18483 18506 18484 18482 18501 18507 18506 18483 18506 18513 18512 18484 20177 20183 18487 18485 18581 20279 20177 18485 18487 18489 18488 18486 20183 20188 18489 18487 18489 18492 18491 18488 20188 20192 18492 18489 18491 18495 18494 18490 18492 18496 18495 18491 20192 20195 18496 18492 18494 18498 18497 18493 18495 18499 18498 18494 18496 18500 18499 18495 20195 20198 18500 18496 18498 18503 18502 18497 18499 18504 18503 18498 18500 18505 18504 18499 20198 20200 18505 18500 18502 18508 18507 18501 18503 18509 18508 18502 18504 18510 18509 18503 18505 18511 18510 18504 20200 20219 18511 18505 18507 18514 18513 18506 18508 18515 18514 18507 18509 18516 18515 18508 18510 18517 18516 18509 18511 18518 18517 18510 20219 20225 18518 18511 18520 18526 18525 18519 18613 18639 18520 18519 18521 18527 18526 18520 18639 18640 18521 18520 18522 18528 18527 18521 18640 18641 18522 18521 18523 18529 18528 18522 18641 18642 18523 18522 18524 18530 18529 18523 18642 18643 18524 18523 18551 18552 18530 18524 18643 18644 18551 18524 18526 18532 18531 18525 18527 18533 18532 18526 18528 18534 18533 18527 18529 18535 18534 18528 18530 18553 18535 18529 18552 18554 18553 18530 18532 18537 18536 18531 18533 18538 18537 18532 18534 18539 18538 18533 18535 18555 18539 18534 18553 18556 18555 18535 18537 18541 18540 18536 18538 18542 18541 18537 18539 18543 18542 18538 18555 18558 18543 18539 18541 18545 18544 18540 18542 18546 18545 18541 18543 18561 18546 18542 18558 18562 18561 18543 18545 18548 18547 18544 18546 18565 18548 18545 18561 18566 18565 18546 18548 18570 18549 18547 18565 18571 18570 18548 18570 18576 18550 18549 20231 20237 18552 18551 18644 20333 20231 18551 20237 20242 18554 18552 18554 18557 18556 18553 20242 20246 18557 18554 18556 18559 18558 18555 18557 18560 18559 18556 20246 20250 18560 18557 18559 18563 18562 18558 18560 18564 18563 18559 20250 20253 18564 18560 18562 18567 18566 18561 18563 18568 18567 18562 18564 18569 18568 18563 20253 20255 18569 18564 18566 18572 18571 18565 18567 18573 18572 18566 18568 18574 18573 18567 18569 18575 18574 18568 20255 20256 18575 18569 18571 18577 18576 18570 18572 18578 18577 18571 18573 18579 18578 18572 18574 18580 18579 18573 18575 18581 18580 18574 20256 20279 18581 18575 18583 18589 18588 18582 18671 18690 18583 18582 18584 18590 18589 18583 18690 18691 18584 18583 18585 18591 18590 18584 18691 18692 18585 18584 18586 18592 18591 18585 18692 18693 18586 18585 18587 18593 18592 18586 18693 18694 18587 18586 18614 18615 18593 18587 18694 18695 18614 18587 18589 18595 18594 18588 18590 18596 18595 18589 18591 18597 18596 18590 18592 18598 18597 18591 18593 18616 18598 18592 18615 18617 18616 18593 18595 18600 18599 18594 18596 18601 18600 18595 18597 18602 18601 18596 18598 18618 18602 18597 18616 18619 18618 18598 18600 18604 18603 18599 18601 18605 18604 18600 18602 18606 18605 18601 18618 18621 18606 18602 18604 18608 18607 18603 18605 18609 18608 18604 18606 18624 18609 18605 18621 18625 18624 18606 18608 18611 18610 18607 18609 18628 18611 18608 18624 18629 18628 18609 18611 18633 18612 18610 18628 18634 18633 18611 18633 18639 18613 18612 20285 20291 18615 18614 18695 20386 20285 18614 20291 20296 18617 18615 18617 18620 18619 18616 20296 20300 18620 18617 18619 18622 18621 18618 18620 18623 18622 18619 20300 20304 18623 18620 18622 18626 18625 18621 18623 18627 18626 18622 20304 20307 18627 18623 18625 18630 18629 18624 18626 18631 18630 18625 18627 18632 18631 18626 20307 20309 18632 18627 18629 18635 18634 18628 18630 18636 18635 18629 18631 18637 18636 18630 18632 18638 18637 18631 20309 20311 18638 18632 18634 18640 18639 18633 18635 18641 18640 18634 18636 18642 18641 18635 18637 18643 18642 18636 18638 18644 18643 18637 20311 20333 18644 18638 18646 18652 18651 18645 18744 18745 18646 18645 18647 18653 18652 18646 18745 18746 18647 18646 18648 18654 18653 18647 18746 18747 18648 18647 18649 18655 18654 18648 18747 18748 18649 18648 18650 18672 18655 18649 18748 18749 18650 18649 20339 20345 18672 18650 18749 20422 20339 18650 18652 18657 18656 18651 18653 18658 18657 18652 18654 18659 18658 18653 18655 18673 18659 18654 18672 18674 18673 18655 18657 18661 18660 18656 18658 18662 18661 18657 18659 18663 18662 18658 18673 18675 18663 18659 18661 18665 18664 18660 18662 18666 18665 18661 18663 18677 18666 18662 18675 18678 18677 18663 18665 18668 18667 18664 18666 18680 18668 18665 18677 18681 18680 18666 18668 18670 18669 18667 18680 18685 18670 18668 18670 18690 18671 18669 18685 18691 18690 18670 20345 20351 18674 18672 18674 18676 18675 18673 20351 20356 18676 18674 18676 18679 18678 18675 20356 20360 18679 18676 18678 18682 18681 18677 18679 18683 18682 18678 18679 20360 18684 18683 18681 18686 18685 18680 18682 18687 18686 18681 18683 18688 18687 18682 18684 18689 18688 18683 20363 20365 18689 18684 20361 20363 18684 20360 18686 18692 18691 18685 18687 18693 18692 18686 18688 18694 18693 18687 18689 18695 18694 18688 20365 20386 18695 18689 18697 18703 18702 18696 18798 18799 18697 18696 18698 18704 18703 18697 18799 18800 18698 18697 18699 18705 18704 18698 18800 18801 18699 18698 18700 18706 18705 18699 18801 18802 18700 18699 18701 18723 18706 18700 18802 18803 18701 18700 20392 20398 18723 18701 18803 20485 20392 18701 18703 18708 18707 18702 18704 18709 18708 18703 18705 18710 18709 18704 18706 18724 18710 18705 18723 18725 18724 18706 18708 18712 18711 18707 18709 18713 18712 18708 18710 18714 18713 18709 18724 18726 18714 18710 18712 18716 18715 18711 18713 18717 18716 18712 18714 18728 18717 18713 18726 18729 18728 18714 18716 18719 18718 18715 18717 18731 18719 18716 18728 18732 18731 18717 18719 18721 18720 18718 18731 18735 18721 18719 18721 18739 18722 18720 18735 18740 18739 18721 18739 18745 18744 18722 20398 20404 18725 18723 18725 18727 18726 18724 20404 20409 18727 18725 18727 18730 18729 18726 20409 20413 18730 18727 18729 18733 18732 18728 18730 18734 18733 18729 20413 20416 18734 18730 18732 18736 18735 18731 18733 18737 18736 18732 18734 18738 18737 18733 20416 20419 18738 18734 18736 18741 18740 18735 18737 18742 18741 18736 18738 18743 18742 18737 20419 20421 18743 18738 18740 18746 18745 18739 18741 18747 18746 18740 18742 18748 18747 18741 18743 18749 18748 18742 20421 20422 18749 18743 18751 18757 18756 18750 18846 18847 18751 18750 18752 18758 18757 18751 18847 18848 18752 18751 18753 18759 18758 18752 18848 18849 18753 18752 18754 18760 18759 18753 18849 18850 18754 18753 18755 18778 18760 18754 18850 18851 18755 18754 20455 20461 18778 18755 18851 20541 20455 18755 18757 18762 18761 18756 18758 18763 18762 18757 18759 18764 18763 18758 18760 18765 18764 18759 18778 18779 18765 18760 18762 18767 18766 18761 18763 18768 18767 18762 18764 18769 18768 18763 18765 18780 18769 18764 18779 18781 18780 18765 18767 18771 18770 18766 18768 18772 18771 18767 18769 18782 18772 18768 18780 18783 18782 18769 18771 18774 18773 18770 18772 18785 18774 18771 18782 18786 18785 18772 18774 18776 18775 18773 18785 18789 18776 18774 18776 18793 18777 18775 18789 18794 18793 18776 18793 18799 18798 18777 20461 20467 18779 18778 20467 20472 18781 18779 18781 18784 18783 18780 20472 20476 18784 18781 18783 18787 18786 18782 18784 18788 18787 18783 20476 20479 18788 18784 18786 18790 18789 18785 18787 18791 18790 18786 18788 18792 18791 18787 20479 20482 18792 18788 18790 18795 18794 18789 18791 18796 18795 18790 18792 18797 18796 18791 20482 20484 18797 18792 18794 18800 18799 18793 18795 18801 18800 18794 18796 18802 18801 18795 18797 18803 18802 18796 20484 20485 18803 18797 18805 18810 18809 18804 18901 18902 18805 18804 18806 18811 18810 18805 18902 18903 18806 18805 18807 18812 18811 18806 18903 18904 18807 18806 18808 18813 18812 18807 18904 18905 18808 18807 18827 18828 18813 18808 18905 18906 18827 18808 18810 18815 18814 18809 18811 18816 18815 18810 18812 18817 18816 18811 18813 18829 18817 18812 18828 18830 18829 18813 18815 18819 18818 18814 18816 18820 18819 18815 18817 18831 18820 18816 18829 18832 18831 18817 18819 18822 18821 18818 18820 18823 18822 18819 18831 18834 18823 18820 18822 18825 18824 18821 18823 18837 18825 18822 18834 18838 18837 18823 18825 18841 18826 18824 18837 18842 18841 18825 18841 18847 18846 18826 20516 20522 18828 18827 18906 20612 20516 18827 20522 20527 18830 18828 18830 18833 18832 18829 20527 20531 18833 18830 18832 18835 18834 18831 18833 18836 18835 18832 20531 20535 18836 18833 18835 18839 18838 18834 18836 18840 18839 18835 20535 20538 18840 18836 18838 18843 18842 18837 18839 18844 18843 18838 18840 18845 18844 18839 20538 20540 18845 18840 18842 18848 18847 18841 18843 18849 18848 18842 18844 18850 18849 18843 18845 18851 18850 18844 20540 20541 18851 18845 18934 18957 18853 18852 18854 18860 18859 18853 18957 18958 18854 18853 18855 18861 18860 18854 18958 18959 18855 18854 18856 18862 18861 18855 18959 18960 18856 18855 18857 18863 18862 18856 18960 18961 18857 18856 18858 18878 18863 18857 18961 18962 18858 18857 20564 20570 18878 18858 18962 20660 20564 18858 18860 18865 18864 18859 18861 18866 18865 18860 18862 18867 18866 18861 18863 18879 18867 18862 18878 18880 18879 18863 18865 18869 18868 18864 18866 18870 18869 18865 18867 18881 18870 18866 18879 18882 18881 18867 18869 18872 18871 18868 18870 18873 18872 18869 18881 18884 18873 18870 18872 18875 18874 18871 18873 18887 18875 18872 18884 18888 18887 18873 18875 18891 18876 18874 18887 18892 18891 18875 18891 18896 18877 18876 18896 18902 18901 18877 20570 20575 18880 18878 18880 18883 18882 18879 20575 20579 18883 18880 18882 18885 18884 18881 18883 18886 18885 18882 20579 20583 18886 18883 18885 18889 18888 18884 18886 18890 18889 18885 20583 20586 18890 18886 18888 18893 18892 18887 18889 18894 18893 18888 18890 18895 18894 18889 20586 20588 18895 18890 18892 18897 18896 18891 18893 18898 18897 18892 18894 18899 18898 18893 18895 18900 18899 18894 20588 20590 18900 18895 18897 18903 18902 18896 18898 18904 18903 18897 18899 18905 18904 18898 18900 18906 18905 18899 20590 20612 18906 18900 18908 18914 18913 18907 19014 19015 18908 18907 18909 18915 18914 18908 19015 19016 18909 18908 18910 18916 18915 18909 19016 19017 18910 18909 18911 18917 18916 18910 19017 19018 18911 18910 18912 18936 18917 18911 19018 19019 18912 18911 18935 18937 18936 18912 19019 19020 18935 18912 18914 18919 18918 18913 18915 18920 18919 18914 18916 18921 18920 18915 18917 18922 18921 18916 18936 18938 18922 18917 18919 18924 18923 18918 18920 18925 18924 18919 18921 18926 18925 18920 18922 18940 18926 18921 18938 18941 18940 18922 18924 18928 18927 18923 18925 18929 18928 18924 18926 18943 18929 18925 18940 18944 18943 18926 18928 18931 18930 18927 18929 18947 18931 18928 18943 18948 18947 18929 18931 18933 18932 18930 18947 18952 18933 18931 18933 18957 18934 18932 18952 18958 18957 18933 20618 20623 18937 18935 19020 20719 20618 18935 18937 18939 18938 18936 20623 20628 18939 18937 18939 18942 18941 18938 20628 20632 18942 18939 18941 18945 18944 18940 18942 18946 18945 18941 20632 20635 18946 18942 18944 18949 18948 18943 18945 18950 18949 18944 18946 18951 18950 18945 20635 20637 18951 18946 18948 18953 18952 18947 18949 18954 18953 18948 18950 18955 18954 18949 18951 18956 18955 18950 20637 20639 18956 18951 18953 18959 18958 18952 18954 18960 18959 18953 18955 18961 18960 18954 18956 18962 18961 18955 20639 20660 18962 18956 18964 18970 18969 18963 19046 19064 18964 18963 18965 18971 18970 18964 19064 19065 18965 18964 18966 18972 18971 18965 19065 19066 18966 18965 18967 18973 18972 18966 19066 19067 18967 18966 18968 18974 18973 18967 19067 19068 18968 18967 20666 20673 18974 18968 19068 20752 20666 18968 18970 18976 18975 18969 18971 18977 18976 18970 18972 18978 18977 18971 18973 18979 18978 18972 18974 18993 18979 18973 20673 20679 18993 18974 18976 18981 18980 18975 18977 18982 18981 18976 18978 18983 18982 18977 18979 18994 18983 18978 18993 18995 18994 18979 18981 18985 18984 18980 18982 18986 18985 18981 18983 18996 18986 18982 18994 18997 18996 18983 18985 18988 18987 18984 18986 18989 18988 18985 18996 18999 18989 18986 18988 18991 18990 18987 18989 19003 18991 18988 18999 19004 19003 18989 18991 19008 18992 18990 19003 19009 19008 18991 19008 19015 19014 18992 20679 20684 18995 18993 18995 18998 18997 18994 20684 20688 18998 18995 18997 19000 18999 18996 18998 19001 19000 18997 18998 20688 19002 19001 19000 19005 19004 18999 19001 19006 19005 19000 19002 19007 19006 19001 20692 20694 19007 19002 20689 20692 19002 20688 19004 19010 19009 19003 19005 19011 19010 19004 19006 19012 19011 19005 19007 19013 19012 19006 20694 20713 19013 19007 19009 19016 19015 19008 19010 19017 19016 19009 19011 19018 19017 19010 19012 19019 19018 19011 19013 19020 19019 19012 20713 20719 19020 19013 19022 19028 19027 19021 19023 19029 19028 19022 19024 19030 19029 19023 19025 19031 19030 19024 19026 19047 19031 19025 20725 20731 19047 19026 19028 19033 19032 19027 19029 19034 19033 19028 19030 19035 19034 19029 19031 19048 19035 19030 19047 19049 19048 19031 19033 19037 19036 19032 19034 19038 19037 19033 19035 19039 19038 19034 19048 19050 19039 19035 19037 19041 19040 19036 19038 19042 19041 19037 19039 19052 19042 19038 19050 19053 19052 19039 19041 19044 19043 19040 19042 19055 19044 19041 19052 19056 19055 19042 19044 19059 19045 19043 19055 19060 19059 19044 19059 19064 19046 19045 20731 20736 19049 19047 19049 19051 19050 19048 20736 20741 19051 19049 19051 19054 19053 19050 20741 20745 19054 19051 19053 19057 19056 19052 19054 19058 19057 19053 20745 20748 19058 19054 19056 19061 19060 19055 19057 19062 19061 19056 19058 19063 19062 19057 20748 20750 19063 19058 19060 19065 19064 19059 19061 19066 19065 19060 19062 19067 19066 19061 19063 19068 19067 19062 20750 20752 19068 19063 19070 19076 19075 19069 19159 19160 19070 19069 19071 19077 19076 19070 19160 19161 19071 19070 19072 19078 19077 19071 19161 19162 19072 19071 19073 19079 19078 19072 19162 19163 19073 19072 19074 19095 19079 19073 19163 19164 19074 19073 20781 20787 19095 19074 19164 20865 20781 19074 19076 19081 19080 19075 19077 19082 19081 19076 19078 19083 19082 19077 19079 19096 19083 19078 19095 19097 19096 19079 19081 19085 19084 19080 19082 19086 19085 19081 19083 19087 19086 19082 19096 19098 19087 19083 19085 19089 19088 19084 19086 19090 19089 19085 19087 19100 19090 19086 19098 19101 19100 19087 19089 19092 19091 19088 19090 19103 19092 19089 19100 19104 19103 19090 19092 19107 19093 19091 19103 19108 19107 19092 19107 19112 19094 19093 19112 20726 20725 19094 20787 20792 19097 19095 19097 19099 19098 19096 20792 20796 19099 19097 19099 19102 19101 19098 20796 20800 19102 19099 19101 19105 19104 19100 19102 19106 19105 19101 20800 20803 19106 19102 19104 19109 19108 19103 19105 19110 19109 19104 19106 19111 19110 19105 20803 20805 19111 19106 19108 19113 19112 19107 19109 19114 19113 19108 19110 19115 19114 19109 19111 19116 19115 19110 20805 20807 19116 19111 19113 20727 20726 19112 19114 20728 20727 19113 19115 20729 20728 19114 19116 20730 20729 19115 19116 20807 20753 20730 19118 19123 19122 19117 19209 19210 19118 19117 19119 19124 19123 19118 19210 19211 19119 19118 19120 19125 19124 19119 19211 19212 19120 19119 19121 19126 19125 19120 19212 19213 19121 19120 19140 19141 19126 19121 19213 19214 19140 19121 19123 19128 19127 19122 19124 19129 19128 19123 19125 19130 19129 19124 19126 19142 19130 19125 19141 19143 19142 19126 19128 19132 19131 19127 19129 19133 19132 19128 19130 19144 19133 19129 19142 19145 19144 19130 19132 19135 19134 19131 19133 19136 19135 19132 19144 19147 19136 19133 19135 19138 19137 19134 19136 19150 19138 19135 19147 19151 19150 19136 19138 19154 19139 19137 19150 19155 19154 19138 19154 19160 19159 19139 20841 20847 19141 19140 19214 20942 20841 19140 20847 20852 19143 19141 19143 19146 19145 19142 20852 20856 19146 19143 19145 19148 19147 19144 19146 19149 19148 19145 20856 20859 19149 19146 19148 19152 19151 19147 19149 19153 19152 19148 20859 20862 19153 19149 19151 19156 19155 19150 19152 19157 19156 19151 19153 19158 19157 19152 20862 20864 19158 19153 19155 19161 19160 19154 19156 19162 19161 19155 19157 19163 19162 19156 19158 19164 19163 19157 20864 20865 19164 19158 19264 20968 20894 19165 20894 20900 19188 19165 19263 19264 19165 19166 19165 19188 19171 19166 19166 19268 19262 19263 19170 19268 19166 19171 19168 19173 19172 19167 19265 19266 19168 19167 19169 19174 19173 19168 19266 19267 19169 19168 19170 19175 19174 19169 19267 19268 19170 19169 19171 19189 19175 19170 19188 19190 19189 19171 19173 19177 19176 19172 19174 19178 19177 19173 19175 19179 19178 19174 19189 19191 19179 19175 19177 19181 19180 19176 19178 19182 19181 19177 19179 19193 19182 19178 19191 19194 19193 19179 19181 19184 19183 19180 19182 19196 19184 19181 19193 19197 19196 19182 19184 19186 19185 19183 19196 19200 19186 19184 19186 19204 19187 19185 19200 19205 19204 19186 19204 19210 19209 19187 20900 20905 19190 19188 19190 19192 19191 19189 20905 20909 19192 19190 19192 19195 19194 19191 20909 20913 19195 19192 19194 19198 19197 19193 19195 19199 19198 19194 20913 20916 19199 19195 19197 19201 19200 19196 19198 19202 19201 19197 19199 19203 19202 19198 20916 20918 19203 19199 19201 19206 19205 19200 19202 19207 19206 19201 19203 19208 19207 19202 20918 20920 19208 19203 19205 19211 19210 19204 19206 19212 19211 19205 19207 19213 19212 19206 19208 19214 19213 19207 20920 20942 19214 19208 19216 19222 19221 19215 19296 19319 19216 19215 19217 19223 19222 19216 19319 19320 19217 19216 19218 19224 19223 19217 19320 19321 19218 19217 19219 19225 19224 19218 19321 19322 19219 19218 19220 19226 19225 19219 19322 19323 19220 19219 19240 19241 19226 19220 19323 19324 19240 19220 19223 19228 19227 19222 19224 19229 19228 19223 19225 19230 19229 19224 19226 19242 19230 19225 19241 19243 19242 19226 19228 19232 19231 19227 19229 19233 19232 19228 19230 19244 19233 19229 19242 19245 19244 19230 19232 19235 19234 19231 19233 19236 19235 19232 19244 19247 19236 19233 19235 19238 19237 19234 19236 19250 19238 19235 19247 19251 19250 19236 19238 19254 19239 19237 19250 19255 19254 19238 19254 19260 19259 19239 20945 20950 19241 19240 19324 21041 20945 19240 20950 20955 19243 19241 19243 19246 19245 19242 20955 20959 19246 19243 19245 19248 19247 19244 19246 19249 19248 19245 20959 20962 19249 19246 19248 19252 19251 19247 19249 19253 19252 19248 20962 20965 19253 19249 19251 19256 19255 19250 19252 19257 19256 19251 19253 19258 19257 19252 20965 20967 19258 19253 19255 19261 19260 19254 19256 19262 19261 19255 19257 19263 19262 19256 19258 19264 19263 19257 20967 20968 19264 19258 19260 19266 19265 19259 19261 19267 19266 19260 19262 19268 19267 19261 19270 19276 19275 19269 19354 19377 19270 19269 19271 19277 19276 19270 19377 19378 19271 19270 19272 19278 19277 19271 19378 19379 19272 19271 19273 19279 19278 19272 19379 19380 19273 19272 19274 19298 19279 19273 19380 19381 19274 19273 19297 19299 19298 19274 19381 19382 19297 19274 19276 19281 19280 19275 19277 19282 19281 19276 19278 19283 19282 19277 19279 19284 19283 19278 19298 19300 19284 19279 19281 19286 19285 19280 19282 19287 19286 19281 19283 19288 19287 19282 19284 19302 19288 19283 19300 19303 19302 19284 19286 19290 19289 19285 19287 19291 19290 19286 19288 19305 19291 19287 19302 19306 19305 19288 19290 19293 19292 19289 19291 19309 19293 19290 19305 19310 19309 19291 19293 19295 19294 19292 19309 19314 19295 19293 19295 19319 19296 19294 19314 19320 19319 19295 20998 21003 19299 19297 20997 20998 19297 19382 19299 19301 19300 19298 21003 21007 19301 19299 19301 19304 19303 19300 21007 21010 19304 19301 19303 19307 19306 19302 19304 19308 19307 19303 21010 21013 19308 19304 19306 19311 19310 19305 19307 19312 19311 19306 19308 19313 19312 19307 21013 21015 19313 19308 19310 19315 19314 19309 19311 19316 19315 19310 19312 19317 19316 19311 19313 19318 19317 19312 21015 21016 19318 19313 19315 19321 19320 19314 19316 19322 19321 19315 19317 19323 19322 19316 19318 19324 19323 19317 21016 21041 19324 19318 19326 19332 19331 19325 19408 19428 19326 19325 19327 19333 19332 19326 19428 19429 19327 19326 19328 19334 19333 19327 19429 19430 19328 19327 19329 19335 19334 19328 19430 19431 19329 19328 19330 19355 19335 19329 19431 19432 19330 19329 21049 21055 19355 19330 19432 21131 21049 19330 19332 19337 19336 19331 19333 19338 19337 19332 19334 19339 19338 19333 19335 19340 19339 19334 19355 19356 19340 19335 19337 19342 19341 19336 19338 19343 19342 19337 19339 19344 19343 19338 19340 19357 19344 19339 19356 19358 19357 19340 19342 19346 19345 19341 19343 19347 19346 19342 19344 19359 19347 19343 19357 19360 19359 19344 19346 19349 19348 19345 19347 19350 19349 19346 19359 19362 19350 19347 19349 19352 19351 19348 19350 19366 19352 19349 19362 19367 19366 19350 19352 19371 19353 19351 19366 19372 19371 19352 19371 19377 19354 19353 21055 21060 19356 19355 21060 21065 19358 19356 19358 19361 19360 19357 21065 21069 19361 19358 19360 19363 19362 19359 19361 19364 19363 19360 19361 21069 19365 19364 19363 19368 19367 19362 19364 19369 19368 19363 19365 19370 19369 19364 21072 21074 19370 19365 21070 21072 19365 21069 19367 19373 19372 19366 19368 19374 19373 19367 19369 19375 19374 19368 19370 19376 19375 19369 21074 21096 19376 19370 19372 19378 19377 19371 19373 19379 19378 19372 19374 19380 19379 19373 19375 19381 19380 19374 19376 19382 19381 19375 19376 21096 20997 19382 19480 21189 21102 19383 21102 21108 19409 19383 19479 19480 19383 19384 19383 19409 19389 19384 19384 19484 19478 19479 19388 19484 19384 19389 19386 19391 19390 19385 19481 19482 19386 19385 19387 19392 19391 19386 19482 19483 19387 19386 19388 19393 19392 19387 19483 19484 19388 19387 19389 19394 19393 19388 19409 19410 19394 19389 19391 19396 19395 19390 19392 19397 19396 19391 19393 19398 19397 19392 19394 19411 19398 19393 19410 19412 19411 19394 19396 19400 19399 19395 19397 19401 19400 19396 19398 19413 19401 19397 19411 19414 19413 19398 19400 19403 19402 19399 19401 19404 19403 19400 19413 19416 19404 19401 19403 19406 19405 19402 19404 19419 19406 19403 19416 19420 19419 19404 19406 19423 19407 19405 19419 19424 19423 19406 19423 19428 19408 19407 21108 21113 19410 19409 21113 21118 19412 19410 19412 19415 19414 19411 21118 21122 19415 19412 19414 19417 19416 19413 19415 19418 19417 19414 21122 21125 19418 19415 19417 19421 19420 19416 19418 19422 19421 19417 21125 21128 19422 19418 19420 19425 19424 19419 19421 19426 19425 19420 19422 19427 19426 19421 21128 21130 19427 19422 19424 19429 19428 19423 19425 19430 19429 19424 19426 19431 19430 19425 19427 19432 19431 19426 21130 21131 19432 19427 19434 19440 19439 19433 19533 19534 19434 19433 19435 19441 19440 19434 19534 19535 19435 19434 19436 19442 19441 19435 19535 19536 19436 19435 19437 19443 19442 19436 19536 19537 19437 19436 19438 19459 19443 19437 19537 19538 19438 19437 21166 21171 19459 19438 19538 21269 21166 19438 19440 19445 19444 19439 19441 19446 19445 19440 19442 19447 19446 19441 19443 19460 19447 19442 19459 19461 19460 19443 19445 19449 19448 19444 19446 19450 19449 19445 19447 19451 19450 19446 19460 19462 19451 19447 19449 19453 19452 19448 19450 19454 19453 19449 19451 19464 19454 19450 19462 19465 19464 19451 19453 19456 19455 19452 19454 19467 19456 19453 19464 19468 19467 19454 19456 19471 19457 19455 19467 19472 19471 19456 19471 19476 19458 19457 19476 19482 19481 19458 21171 21176 19461 19459 19461 19463 19462 19460 21176 21180 19463 19461 19463 19466 19465 19462 21180 21183 19466 19463 19465 19469 19468 19464 19466 19470 19469 19465 21183 21186 19470 19466 19468 19473 19472 19467 19469 19474 19473 19468 19470 19475 19474 19469 21186 21188 19475 19470 19472 19477 19476 19471 19473 19478 19477 19472 19474 19479 19478 19473 19475 19480 19479 19474 21188 21189 19480 19475 19477 19483 19482 19476 19478 19484 19483 19477 19486 19492 19491 19485 19585 19586 19486 19485 19487 19493 19492 19486 19586 19587 19487 19486 19488 19494 19493 19487 19587 19588 19488 19487 19489 19495 19494 19488 19588 19589 19489 19488 19490 19512 19495 19489 19589 19590 19490 19489 21221 21226 19512 19490 19590 21319 21221 19490 19492 19497 19496 19491 19493 19498 19497 19492 19494 19499 19498 19493 19495 19513 19499 19494 19512 19514 19513 19495 19497 19501 19500 19496 19498 19502 19501 19497 19499 19503 19502 19498 19513 19515 19503 19499 19501 19505 19504 19500 19502 19506 19505 19501 19503 19517 19506 19502 19515 19518 19517 19503 19505 19508 19507 19504 19506 19520 19508 19505 19517 19521 19520 19506 19508 19510 19509 19507 19520 19524 19510 19508 19510 19528 19511 19509 19524 19529 19528 19510 19528 19534 19533 19511 21226 21231 19514 19512 19514 19516 19515 19513 21231 21235 19516 19514 19516 19519 19518 19515 21235 21238 19519 19516 19518 19522 19521 19517 19519 19523 19522 19518 21238 21241 19523 19519 19521 19525 19524 19520 19522 19526 19525 19521 19523 19527 19526 19522 21241 21243 19527 19523 19525 19530 19529 19524 19526 19531 19530 19525 19527 19532 19531 19526 21243 21245 19532 19527 19529 19535 19534 19528 19530 19536 19535 19529 19531 19537 19536 19530 19532 19538 19537 19531 21245 21269 19538 19532 19638 21371 21271 19539 21271 21277 19564 19539 19637 19638 19539 19540 19539 19564 19547 19540 19636 19637 19540 19541 19540 19547 19546 19541 19635 19636 19541 19542 19541 19546 19545 19542 19542 19640 19634 19635 19544 19640 19542 19545 19544 19549 19548 19543 19639 19640 19544 19543 19545 19550 19549 19544 19546 19551 19550 19545 19547 19565 19551 19546 19564 19566 19565 19547 19549 19553 19552 19548 19550 19554 19553 19549 19551 19555 19554 19550 19565 19567 19555 19551 19553 19557 19556 19552 19554 19558 19557 19553 19555 19569 19558 19554 19567 19570 19569 19555 19557 19560 19559 19556 19558 19572 19560 19557 19569 19573 19572 19558 19560 19562 19561 19559 19572 19576 19562 19560 19562 19580 19563 19561 19576 19581 19580 19562 19580 19586 19585 19563 21277 21282 19566 19564 19566 19568 19567 19565 21282 21286 19568 19566 19568 19571 19570 19567 21286 21290 19571 19568 19570 19574 19573 19569 19571 19575 19574 19570 21290 21293 19575 19571 19573 19577 19576 19572 19574 19578 19577 19573 19575 19579 19578 19574 21293 21295 19579 19575 19577 19582 19581 19576 19578 19583 19582 19577 19579 19584 19583 19578 21295 21297 19584 19579 19581 19587 19586 19580 19582 19588 19587 19581 19583 19589 19588 19582 19584 19590 19589 19583 21297 21319 19590 19584 19592 19597 19596 19591 19697 19698 19592 19591 19593 19598 19597 19592 19698 19699 19593 19592 19594 19599 19598 19593 19699 19700 19594 19593 19595 19613 19599 19594 19700 19701 19595 19594 19612 19614 19613 19595 19701 19702 19612 19595 19597 19601 19600 19596 19598 19602 19601 19597 19599 19603 19602 19598 19613 19615 19603 19599 19601 19605 19604 19600 19602 19606 19605 19601 19603 19617 19606 19602 19615 19618 19617 19603 19605 19608 19607 19604 19606 19620 19608 19605 19617 19621 19620 19606 19608 19610 19609 19607 19620 19624 19610 19608 19610 19628 19611 19609 19624 19629 19628 19610 19628 19634 19633 19611 21329 21334 19614 19612 21328 21329 19612 19702 19614 19616 19615 19613 21334 21338 19616 19614 19616 19619 19618 19615 21338 21342 19619 19616 19618 19622 19621 19617 19619 19623 19622 19618 21342 21345 19623 19619 19621 19625 19624 19620 19622 19626 19625 19621 19623 19627 19626 19622 21345 21347 19627 19623 19625 19630 19629 19624 19626 19631 19630 19625 19627 19632 19631 19626 21347 21349 19632 19627 19629 19635 19634 19628 19630 19636 19635 19629 19631 19637 19636 19630 19632 19638 19637 19631 21349 21371 19638 19632 19634 19640 19639 19633 19642 19648 19647 19641 19731 19755 19642 19641 19643 19649 19648 19642 19755 19756 19643 19642 19644 19650 19649 19643 19756 19757 19644 19643 19645 19651 19650 19644 19757 19758 19645 19644 19646 19652 19651 19645 19758 19759 19646 19645 19672 19673 19652 19646 19759 19760 19672 19646 19648 19654 19653 19647 19649 19655 19654 19648 19650 19656 19655 19649 19651 19657 19656 19650 19652 19674 19657 19651 19673 19675 19674 19652 19654 19659 19658 19653 19655 19660 19659 19654 19656 19661 19660 19655 19657 19676 19661 19656 19674 19677 19676 19657 19659 19663 19662 19658 19660 19664 19663 19659 19661 19665 19664 19660 19676 19679 19665 19661 19663 19667 19666 19662 19664 19668 19667 19663 19665 19682 19668 19664 19679 19683 19682 19665 19667 19670 19669 19666 19668 19686 19670 19667 19682 19687 19686 19668 19670 19691 19671 19669 19686 19692 19691 19670 21381 21386 19673 19672 19760 21478 21381 19672 21386 21390 19675 19673 19675 19678 19677 19674 21390 21394 19678 19675 19677 19680 19679 19676 19678 19681 19680 19677 21394 21397 19681 19678 19680 19684 19683 19679 19681 19685 19684 19680 21397 21399 19685 19681 19683 19688 19687 19682 19684 19689 19688 19683 19685 19690 19689 19684 21399 21401 19690 19685 19687 19693 19692 19686 19688 19694 19693 19687 19689 19695 19694 19688 19690 19696 19695 19689 21401 21423 19696 19690 19692 19698 19697 19691 19693 19699 19698 19692 19694 19700 19699 19693 19695 19701 19700 19694 19696 19702 19701 19695 19696 21423 21328 19702 19704 19710 19709 19703 19805 19806 19704 19703 19705 19711 19710 19704 19806 19807 19705 19704 19706 19712 19711 19705 19807 19808 19706 19705 19707 19713 19712 19706 19808 19809 19707 19706 19708 19732 19713 19707 19809 19810 19708 19707 21430 21435 19732 19708 19810 21528 21430 19708 19710 19715 19714 19709 19711 19716 19715 19710 19712 19717 19716 19711 19713 19733 19717 19712 19732 19734 19733 19713 19715 19719 19718 19714 19716 19720 19719 19715 19717 19735 19720 19716 19733 19736 19735 19717 19719 19722 19721 19718 19720 19723 19722 19719 19735 19738 19723 19720 19722 19726 19725 19721 19723 19741 19726 19722 19738 19742 19741 19723 19725 19728 19727 19724 19726 19745 19728 19725 19741 19746 19745 19726 19728 19730 19729 19727 19745 19750 19730 19728 19730 19755 19731 19729 19750 19756 19755 19730 21435 21440 19734 19732 19734 19737 19736 19733 21440 21444 19737 19734 19736 19739 19738 19735 19737 19740 19739 19736 21444 21447 19740 19737 19739 19743 19742 19738 19740 19744 19743 19739 21447 21450 19744 19740 19742 19747 19746 19741 19743 19748 19747 19742 19744 19749 19748 19743 21450 21452 19749 19744 19746 19751 19750 19745 19747 19752 19751 19746 19748 19753 19752 19747 19749 19754 19753 19748 21452 21453 19754 19749 19751 19757 19756 19750 19752 19758 19757 19751 19753 19759 19758 19752 19754 19760 19759 19753 21453 21478 19760 19754 19858 21560 21480 19761 21480 21486 19784 19761 19857 19858 19761 19762 19761 19784 19767 19762 19762 19862 19856 19857 19766 19862 19762 19767 19764 19769 19768 19763 19859 19860 19764 19763 19765 19770 19769 19764 19860 19861 19765 19764 19766 19771 19770 19765 19861 19862 19766 19765 19767 19785 19771 19766 19784 19786 19785 19767 19769 19773 19772 19768 19770 19774 19773 19769 19771 19775 19774 19770 19785 19787 19775 19771 19773 19777 19776 19772 19774 19778 19777 19773 19775 19789 19778 19774 19787 19790 19789 19775 19777 19780 19779 19776 19778 19792 19780 19777 19789 19793 19792 19778 19780 19782 19781 19779 19792 19796 19782 19780 19782 19800 19783 19781 19796 19801 19800 19782 19800 19806 19805 19783 21486 21491 19786 19784 19786 19788 19787 19785 21491 21495 19788 19786 19788 19791 19790 19787 21495 21499 19791 19788 19790 19794 19793 19789 19791 19795 19794 19790 21499 21502 19795 19791 19793 19797 19796 19792 19794 19798 19797 19793 19795 19799 19798 19794 21502 21504 19799 19795 19797 19802 19801 19796 19798 19803 19802 19797 19799 19804 19803 19798 21504 21506 19804 19799 19801 19807 19806 19800 19802 19808 19807 19801 19803 19809 19808 19802 19804 19810 19809 19803 21506 21528 19810 19804 19812 19818 19817 19811 19889 19911 19812 19811 19813 19819 19818 19812 19911 19912 19813 19812 19814 19820 19819 19813 19912 19913 19814 19813 19815 19821 19820 19814 19913 19914 19815 19814 19816 19837 19821 19815 19914 19915 19816 19815 21535 21541 19837 19816 19915 21611 21535 19816 19818 19823 19822 19817 19819 19824 19823 19818 19820 19825 19824 19819 19821 19838 19825 19820 19837 19839 19838 19821 19823 19827 19826 19822 19824 19828 19827 19823 19825 19829 19828 19824 19838 19840 19829 19825 19827 19831 19830 19826 19828 19832 19831 19827 19829 19842 19832 19828 19840 19843 19842 19829 19831 19834 19833 19830 19832 19845 19834 19831 19842 19846 19845 19832 19834 19849 19835 19833 19845 19850 19849 19834 19849 19854 19836 19835 19854 19860 19859 19836 21541 21546 19839 19837 19839 19841 19840 19838 21546 21550 19841 19839 19841 19844 19843 19840 21550 21554 19844 19841 19843 19847 19846 19842 19844 19848 19847 19843 21554 21557 19848 19844 19846 19851 19850 19845 19847 19852 19851 19846 19848 19853 19852 19847 21557 21559 19853 19848 19850 19855 19854 19849 19851 19856 19855 19850 19852 19857 19856 19851 19853 19858 19857 19852 21559 21560 19858 19853 19855 19861 19860 19854 19856 19862 19861 19855 19864 19870 19869 19863 19865 19871 19870 19864 19958 19959 19865 19864 19866 19872 19871 19865 19959 19960 19866 19865 19867 19873 19872 19866 19960 19961 19867 19866 19868 19891 19873 19867 19961 19962 19868 19867 19890 19892 19891 19868 19962 19963 19890 19868 19870 19875 19874 19869 19871 19876 19875 19870 19872 19877 19876 19871 19873 19878 19877 19872 19891 19893 19878 19873 19875 19880 19879 19874 19876 19881 19880 19875 19877 19882 19881 19876 19878 19895 19882 19877 19893 19896 19895 19878 19880 19884 19883 19879 19881 19885 19884 19880 19882 19898 19885 19881 19895 19899 19898 19882 19884 19887 19886 19883 19885 19902 19887 19884 19898 19903 19902 19885 19887 19906 19888 19886 19902 19907 19906 19887 19906 19911 19889 19888 21590 21595 19892 19890 19963 21684 21590 19890 19892 19894 19893 19891 21595 21599 19894 19892 19894 19897 19896 19893 21599 21603 19897 19894 19896 19900 19899 19895 19897 19901 19900 19896 21603 21606 19901 19897 19899 19904 19903 19898 19900 19905 19904 19899 19901 21608 19905 19900 21606 21609 21608 19901 19903 19908 19907 19902 19904 19909 19908 19903 19905 19910 19909 19904 21608 21610 19910 19905 19907 19912 19911 19906 19908 19913 19912 19907 19909 19914 19913 19908 19910 19915 19914 19909 21610 21611 19915 19910 19917 19923 19922 19916 19988 20010 19917 19916 19918 19924 19923 19917 20010 20011 19918 19917 19919 19925 19924 19918 20011 20012 19919 19918 19920 19926 19925 19919 20012 20013 19920 19919 19921 19940 19926 19920 20013 20014 19921 19920 21638 21644 19940 19921 20015 21638 19921 20014 19923 19928 19927 19922 19924 19929 19928 19923 19925 19930 19929 19924 19926 19941 19930 19925 19940 19942 19941 19926 19928 19932 19931 19927 19929 19933 19932 19928 19930 19943 19933 19929 19941 19944 19943 19930 19932 19935 19934 19931 19933 19936 19935 19932 19943 19946 19936 19933 19935 19938 19937 19934 19936 19949 19938 19935 19946 19950 19949 19936 19938 19953 19939 19937 19949 19954 19953 19938 19953 19959 19958 19939 21644 21649 19942 19940 19942 19945 19944 19941 21649 21653 19945 19942 19944 19947 19946 19943 19945 19948 19947 19944 21653 21656 19948 19945 19947 19951 19950 19946 19948 19952 19951 19947 21656 21659 19952 19948 19950 19955 19954 19949 19951 19956 19955 19950 19952 19957 19956 19951 21659 21661 19957 19952 19954 19960 19959 19953 19955 19961 19960 19954 19956 19962 19961 19955 19957 19963 19962 19956 21661 21684 19963 19957 19965 19971 19970 19964 20061 20062 19965 19964 19966 19972 19971 19965 20062 20063 19966 19965 19967 19973 19972 19966 20063 20064 19967 19966 19968 19974 19973 19967 20064 20065 19968 19967 19969 19989 19974 19968 20065 20066 19969 19968 21686 21692 19989 19969 20066 21760 21686 19969 19971 19976 19975 19970 19972 19977 19976 19971 19973 19978 19977 19972 19974 19990 19978 19973 19989 19991 19990 19974 19976 19980 19979 19975 19977 19981 19980 19976 19978 19992 19981 19977 19990 19993 19992 19978 19980 19984 19983 19979 19981 19995 19984 19980 19992 19996 19995 19981 19983 19986 19985 19982 19984 19999 19986 19983 19995 20000 19999 19984 19986 20004 19987 19985 19999 20005 20004 19986 20004 20010 19988 19987 21692 21697 19991 19989 19991 19994 19993 19990 21697 21701 19994 19991 19993 19997 19996 19992 19994 19998 19997 19993 21701 21704 19998 19994 19996 20001 20000 19995 19997 20002 20001 19996 19998 20003 20002 19997 21704 21707 20003 19998 20000 20006 20005 19999 20001 20007 20006 20000 20002 20008 20007 20001 20003 20009 20008 20002 21707 21709 20009 20003 20005 20011 20010 20004 20006 20012 20011 20005 20007 20013 20012 20006 20008 20014 20013 20007 20009 20015 20014 20008 21709 21729 20015 20009 20015 21729 21639 21638 20017 20023 20022 20016 20122 20123 20017 20016 20018 20024 20023 20017 20123 20124 20018 20017 20019 20025 20024 20018 20124 20125 20019 20018 20020 20026 20025 20019 20125 20126 20020 20019 20021 20042 20026 20020 20126 20127 20021 20020 20041 20043 20042 20021 20127 20128 20041 20021 20023 20028 20027 20022 20024 20029 20028 20023 20025 20030 20029 20024 20026 20044 20030 20025 20042 20045 20044 20026 20028 20032 20031 20027 20029 20033 20032 20028 20030 20034 20033 20029 20044 20047 20034 20030 20032 20036 20035 20031 20033 20037 20036 20032 20034 20049 20037 20033 20047 20050 20049 20034 20036 20039 20038 20035 20037 20052 20039 20036 20049 20053 20052 20037 20039 20056 20040 20038 20052 20057 20056 20039 20056 20062 20061 20040 21735 21741 20043 20041 20128 21836 21735 20041 20043 20046 20045 20042 21741 21746 20046 20043 20045 20048 20047 20044 20046 21750 20048 20045 21746 21751 21750 20046 20048 20051 20050 20047 21750 21754 20051 20048 20050 20054 20053 20049 20051 20055 20054 20050 21754 21757 20055 20051 20053 20058 20057 20052 20054 20059 20058 20053 20055 20060 20059 20054 21757 21759 20060 20055 20057 20063 20062 20056 20058 20064 20063 20057 20059 20065 20064 20058 20060 20066 20065 20059 21759 21760 20066 20060 20068 20075 20074 20067 20171 20172 20068 20067 20069 20076 20075 20068 20172 20173 20069 20068 20070 20077 20076 20069 20173 20174 20070 20069 20071 20078 20077 20070 20174 20175 20071 20070 20072 20098 20078 20071 20175 20176 20072 20071 21788 21794 20098 20072 20176 21867 21788 20072 20074 20080 20079 20073 20075 20081 20080 20074 20076 20082 20081 20075 20077 20083 20082 20076 20078 20099 20083 20077 20098 20100 20099 20078 20080 20085 20084 20079 20081 20086 20085 20080 20082 20087 20086 20081 20083 20101 20087 20082 20099 20102 20101 20083 20085 20089 20088 20084 20086 20090 20089 20085 20087 20091 20090 20086 20101 20104 20091 20087 20089 20093 20092 20088 20090 20094 20093 20089 20091 20107 20094 20090 20104 20108 20107 20091 20093 20096 20095 20092 20094 20111 20096 20093 20107 20112 20111 20094 20096 20116 20097 20095 20111 20117 20116 20096 20116 20123 20122 20097 21794 21800 20100 20098 20100 20103 20102 20099 21800 21805 20103 20100 20102 20105 20104 20101 20103 20106 20105 20102 21805 21809 20106 20103 20105 20109 20108 20104 20106 20110 20109 20105 21809 21812 20110 20106 20108 20113 20112 20107 20109 20114 20113 20108 20110 20115 20114 20109 21812 21814 20115 20110 20112 20118 20117 20111 20113 20119 20118 20112 20114 20120 20119 20113 20115 20121 20120 20114 21814 21816 20121 20115 20117 20124 20123 20116 20118 20125 20124 20117 20119 20126 20125 20118 20120 20127 20126 20119 20121 20128 20127 20120 21816 21836 20128 20121 20130 20135 20134 20129 20225 20226 20130 20129 20131 20136 20135 20130 20226 20227 20131 20130 20132 20137 20136 20131 20227 20228 20132 20131 20133 20138 20137 20132 20228 20229 20133 20132 20151 20152 20138 20133 20229 20230 20151 20133 20135 20140 20139 20134 20136 20141 20140 20135 20137 20142 20141 20136 20138 20153 20142 20137 20152 20154 20153 20138 20140 20144 20143 20139 20141 20145 20144 20140 20142 20155 20145 20141 20153 20156 20155 20142 20144 20147 20146 20143 20145 20158 20147 20144 20155 20159 20158 20145 20147 20149 20148 20146 20158 20162 20149 20147 20149 20166 20150 20148 20162 20167 20166 20149 20166 20172 20171 20150 21842 21848 20152 20151 20230 21938 21842 20151 21848 21853 20154 20152 20154 20157 20156 20153 21853 21857 20157 20154 20156 20160 20159 20155 20157 20161 20160 20156 21857 21861 20161 20157 20159 20163 20162 20158 20160 20164 20163 20159 20161 20165 20164 20160 21861 21864 20165 20161 20163 20168 20167 20162 20164 20169 20168 20163 20165 20170 20169 20164 21864 21866 20170 20165 20167 20173 20172 20166 20168 20174 20173 20167 20169 20175 20174 20168 20170 20176 20175 20169 21866 21867 20176 20170 20178 20184 20183 20177 20279 20280 20178 20177 20179 20185 20184 20178 20280 20281 20179 20178 20180 20186 20185 20179 20281 20282 20180 20179 20181 20187 20186 20180 20282 20283 20181 20180 20182 20201 20187 20181 20283 20284 20182 20181 21890 21896 20201 20182 20284 21992 21890 20182 20184 20189 20188 20183 20185 20190 20189 20184 20186 20191 20190 20185 20187 20202 20191 20186 20201 20203 20202 20187 20189 20193 20192 20188 20190 20194 20193 20189 20191 20204 20194 20190 20202 20205 20204 20191 20193 20196 20195 20192 20194 20197 20196 20193 20204 20207 20197 20194 20196 20199 20198 20195 20197 20210 20199 20196 20207 20211 20210 20197 20199 20214 20200 20198 20210 20215 20214 20199 20214 20220 20219 20200 21896 21901 20203 20201 20203 20206 20205 20202 21901 21906 20206 20203 20205 20208 20207 20204 20206 20209 20208 20205 21906 21910 20209 20206 20208 20212 20211 20207 20209 20213 20212 20208 21910 21913 20213 20209 20211 20216 20215 20210 20212 20217 20216 20211 20213 20218 20217 20212 21913 21915 20218 20213 20215 20221 20220 20214 20216 20222 20221 20215 20217 20223 20222 20216 20218 20224 20223 20217 21915 21917 20224 20218 20220 20226 20225 20219 20221 20227 20226 20220 20222 20228 20227 20221 20223 20229 20228 20222 20224 20230 20229 20223 21917 21938 20230 20224 20232 20238 20237 20231 20333 20334 20232 20231 20233 20239 20238 20232 20334 20335 20233 20232 20234 20240 20239 20233 20335 20336 20234 20233 20235 20241 20240 20234 20336 20337 20235 20234 20236 20257 20241 20235 20337 20338 20236 20235 21944 21950 20257 20236 20338 22023 21944 20236 20238 20243 20242 20237 20239 20244 20243 20238 20240 20245 20244 20239 20241 20258 20245 20240 20257 20259 20258 20241 20243 20247 20246 20242 20244 20248 20247 20243 20245 20249 20248 20244 20258 20260 20249 20245 20247 20251 20250 20246 20248 20252 20251 20247 20249 20262 20252 20248 20260 20263 20262 20249 20251 20254 20253 20250 20252 20265 20254 20251 20262 20266 20265 20252 20254 20269 20255 20253 20265 20270 20269 20254 20269 20274 20256 20255 20274 20280 20279 20256 21950 21956 20259 20257 20259 20261 20260 20258 21956 21961 20261 20259 20261 20264 20263 20260 21961 21965 20264 20261 20263 20267 20266 20262 20264 20268 20267 20263 21965 21968 20268 20264 20266 20271 20270 20265 20267 20272 20271 20266 20268 20273 20272 20267 21968 21971 20273 20268 20270 20275 20274 20269 20271 20276 20275 20270 20272 20277 20276 20271 20273 20278 20277 20272 21971 21973 20278 20273 20275 20281 20280 20274 20276 20282 20281 20275 20277 20283 20282 20276 20278 20284 20283 20277 21973 21992 20284 20278 20286 20292 20291 20285 20386 20387 20286 20285 20287 20293 20292 20286 20387 20388 20287 20286 20288 20294 20293 20287 20388 20389 20288 20287 20289 20295 20294 20288 20389 20390 20289 20288 20290 20312 20295 20289 20390 20391 20290 20289 21998 21999 20312 20290 20391 22072 21998 20290 20292 20297 20296 20291 20293 20298 20297 20292 20294 20299 20298 20293 20295 20313 20299 20294 20312 20314 20313 20295 20297 20301 20300 20296 20298 20302 20301 20297 20299 20303 20302 20298 20313 20315 20303 20299 20301 20305 20304 20300 20302 20306 20305 20301 20303 20317 20306 20302 20315 20318 20317 20303 20305 20308 20307 20304 20306 20320 20308 20305 20317 20321 20320 20306 20308 20310 20309 20307 20320 20324 20310 20308 20310 20328 20311 20309 20324 20329 20328 20310 20328 20334 20333 20311 21999 22005 20314 20312 20314 20316 20315 20313 22005 22010 20316 20314 20316 20319 20318 20315 22010 22014 20319 20316 20318 20322 20321 20317 20319 20323 20322 20318 22014 22017 20323 20319 20321 20325 20324 20320 20322 20326 20325 20321 20323 20327 20326 20322 22017 22020 20327 20323 20325 20330 20329 20324 20326 20331 20330 20325 20327 20332 20331 20326 22020 22022 20332 20327 20329 20335 20334 20328 20330 20336 20335 20329 20331 20337 20336 20330 20332 20338 20337 20331 22022 22023 20338 20332 20340 20346 20345 20339 20422 20449 20340 20339 20341 20347 20346 20340 20449 20450 20341 20340 20342 20348 20347 20341 20450 20451 20342 20341 20343 20349 20348 20342 20451 20452 20343 20342 20344 20350 20349 20343 20452 20453 20344 20343 20366 20367 20350 20344 20453 20454 20366 20344 20346 20352 20351 20345 20347 20353 20352 20346 20348 20354 20353 20347 20349 20355 20354 20348 20350 20368 20355 20349 20367 20369 20368 20350 20352 20357 20356 20351 20353 20358 20357 20352 20354 20359 20358 20353 20355 20370 20359 20354 20368 20371 20370 20355 20357 20361 20360 20356 20358 20362 20361 20357 20359 20373 20362 20358 20370 20374 20373 20359 20362 20364 20363 20361 20373 20377 20364 20362 20364 20381 20365 20363 20377 20382 20381 20364 20381 20387 20386 20365 22047 22053 20367 20366 20454 22148 22047 20366 22053 22058 20369 20367 20369 20372 20371 20368 22058 22062 20372 20369 20371 20375 20374 20370 20372 20376 20375 20371 22062 22066 20376 20372 20374 20378 20377 20373 20375 20379 20378 20374 20376 20380 20379 20375 22066 22069 20380 20376 20378 20383 20382 20377 20379 20384 20383 20378 20380 20385 20384 20379 22069 22071 20385 20380 20382 20388 20387 20381 20383 20389 20388 20382 20384 20390 20389 20383 20385 20391 20390 20384 22071 22072 20391 20385 20393 20399 20398 20392 20485 20510 20393 20392 20394 20400 20399 20393 20510 20511 20394 20393 20395 20401 20400 20394 20511 20512 20395 20394 20396 20402 20401 20395 20512 20513 20396 20395 20397 20403 20402 20396 20513 20514 20397 20396 20423 20424 20403 20397 20514 20515 20423 20397 20399 20405 20404 20398 20400 20406 20405 20399 20401 20407 20406 20400 20402 20408 20407 20401 20403 20425 20408 20402 20424 20426 20425 20403 20405 20410 20409 20404 20406 20411 20410 20405 20407 20412 20411 20406 20408 20427 20412 20407 20425 20428 20427 20408 20410 20414 20413 20409 20411 20415 20414 20410 20412 20430 20415 20411 20427 20431 20430 20412 20414 20417 20416 20413 20415 20418 20417 20414 20430 20434 20418 20415 20417 20420 20419 20416 20418 20438 20420 20417 20434 20439 20438 20418 20420 20443 20421 20419 20438 20444 20443 20420 20443 20449 20422 20421 22100 22106 20424 20423 20515 22202 22100 20423 22106 22111 20426 20424 20426 20429 20428 20425 22111 22115 20429 20426 20428 20432 20431 20427 20429 20433 20432 20428 22115 22119 20433 20429 20431 20435 20434 20430 20432 20436 20435 20431 20433 20437 20436 20432 22119 22122 20437 20433 20435 20440 20439 20434 20436 20441 20440 20435 20437 20442 20441 20436 22122 22124 20442 20437 20439 20445 20444 20438 20440 20446 20445 20439 20441 20447 20446 20440 20442 20448 20447 20441 22124 22125 20448 20442 20444 20450 20449 20443 20445 20451 20450 20444 20446 20452 20451 20445 20447 20453 20452 20446 20448 20454 20453 20447 22125 22148 20454 20448 20456 20462 20461 20455 20541 20559 20456 20455 20457 20463 20462 20456 20559 20560 20457 20456 20458 20464 20463 20457 20560 20561 20458 20457 20459 20465 20464 20458 20561 20562 20459 20458 20460 20466 20465 20459 20562 20563 20460 20459 22154 22159 20466 20460 20563 22237 22154 20460 20462 20468 20467 20461 20463 20469 20468 20462 20464 20470 20469 20463 20465 20471 20470 20464 20466 20486 20471 20465 20466 22159 20487 20486 20468 20473 20472 20467 20469 20474 20473 20468 20470 20475 20474 20469 20471 20488 20475 20470 20486 20489 20488 20471 20473 20477 20476 20472 20474 20478 20477 20473 20475 20491 20478 20474 20488 20492 20491 20475 20477 20480 20479 20476 20478 20481 20480 20477 20491 20495 20481 20478 20480 20483 20482 20479 20481 20499 20483 20480 20495 20500 20499 20481 20483 20504 20484 20482 20499 20505 20504 20483 20504 20510 20485 20484 20487 20490 20489 20486 22165 22169 20490 20487 22160 22165 20487 22159 20489 20493 20492 20488 20490 20494 20493 20489 22169 22173 20494 20490 20492 20496 20495 20491 20493 20497 20496 20492 20494 20498 20497 20493 22173 22176 20498 20494 20496 20501 20500 20495 20497 20502 20501 20496 20498 20503 20502 20497 22176 22178 20503 20498 20500 20506 20505 20499 20501 20507 20506 20500 20502 20508 20507 20501 20503 20509 20508 20502 22178 22179 20509 20503 20505 20511 20510 20504 20506 20512 20511 20505 20507 20513 20512 20506 20508 20514 20513 20507 20509 20515 20514 20508 22179 22202 20515 20509 20517 20523 20522 20516 20612 20613 20517 20516 20518 20524 20523 20517 20613 20614 20518 20517 20519 20525 20524 20518 20614 20615 20519 20518 20520 20526 20525 20519 20615 20616 20520 20519 20521 20542 20526 20520 20616 20617 20521 20520 22208 22214 20542 20521 20617 22320 22208 20521 20523 20528 20527 20522 20524 20529 20528 20523 20525 20530 20529 20524 20526 20543 20530 20525 20542 20544 20543 20526 20528 20532 20531 20527 20529 20533 20532 20528 20530 20534 20533 20529 20543 20545 20534 20530 20532 20536 20535 20531 20533 20537 20536 20532 20534 20547 20537 20533 20545 20548 20547 20534 20536 20539 20538 20535 20537 20550 20539 20536 20547 20551 20550 20537 20539 20554 20540 20538 20550 20555 20554 20539 20554 20559 20541 20540 22214 22220 20544 20542 20544 20546 20545 20543 22220 22225 20546 20544 20546 20549 20548 20545 22225 22229 20549 20546 20548 20552 20551 20547 20549 20553 20552 20548 22229 22232 20553 20549 20551 20556 20555 20550 20552 20557 20556 20551 20553 20558 20557 20552 22232 22235 20558 20553 20555 20560 20559 20554 20556 20561 20560 20555 20557 20562 20561 20556 20558 20563 20562 20557 22235 22237 20563 20558 20565 20571 20570 20564 20660 20661 20565 20564 20566 20572 20571 20565 20661 20662 20566 20565 20567 20573 20572 20566 20662 20663 20567 20566 20568 20574 20573 20567 20663 20664 20568 20567 20569 20591 20574 20568 20664 20665 20569 20568 22266 22272 20591 20569 20665 22352 22266 20569 20571 20576 20575 20570 20572 20577 20576 20571 20573 20578 20577 20572 20574 20592 20578 20573 20591 20593 20592 20574 20576 20580 20579 20575 20577 20581 20580 20576 20578 20582 20581 20577 20592 20594 20582 20578 20580 20584 20583 20579 20581 20585 20584 20580 20582 20596 20585 20581 20594 20597 20596 20582 20584 20587 20586 20583 20585 20599 20587 20584 20596 20600 20599 20585 20587 20589 20588 20586 20599 20603 20589 20587 20589 20607 20590 20588 20603 20608 20607 20589 20607 20613 20612 20590 22272 22278 20593 20591 20593 20595 20594 20592 22278 22283 20595 20593 20595 20598 20597 20594 22283 22287 20598 20595 20597 20601 20600 20596 20598 20602 20601 20597 22287 22290 20602 20598 20600 20604 20603 20599 20601 20605 20604 20600 20602 20606 20605 20601 22290 22293 20606 20602 20604 20609 20608 20603 20605 20610 20609 20604 20606 20611 20610 20605 22293 22295 20611 20606 20608 20614 20613 20607 20609 20615 20614 20608 20610 20616 20615 20609 20611 20617 20616 20610 22295 22320 20617 20611 20619 20624 20623 20618 20719 20720 20619 20618 20620 20625 20624 20619 20720 20721 20620 20619 20621 20626 20625 20620 20721 20722 20621 20620 20622 20627 20626 20621 20722 20723 20622 20621 20640 20641 20627 20622 20723 20724 20640 20622 20624 20629 20628 20623 20625 20630 20629 20624 20626 20631 20630 20625 20627 20642 20631 20626 20641 20643 20642 20627 20629 20633 20632 20628 20630 20634 20633 20629 20631 20644 20634 20630 20642 20645 20644 20631 20633 20636 20635 20632 20634 20647 20636 20633 20644 20648 20647 20634 20636 20638 20637 20635 20647 20651 20638 20636 20638 20655 20639 20637 20651 20656 20655 20638 20655 20661 20660 20639 22327 22333 20641 20640 20724 22423 22327 20640 22333 22338 20643 20641 20643 20646 20645 20642 22338 22342 20646 20643 20645 20649 20648 20644 20646 20650 20649 20645 22342 22346 20650 20646 20648 20652 20651 20647 20649 20653 20652 20648 20650 20654 20653 20649 22346 22349 20654 20650 20652 20657 20656 20651 20653 20658 20657 20652 20654 20659 20658 20653 22349 22351 20659 20654 20656 20662 20661 20655 20657 20663 20662 20656 20658 20664 20663 20657 20659 20665 20664 20658 22351 22352 20665 20659 20667 20674 20673 20666 20752 20775 20667 20666 20668 20675 20674 20667 20775 20776 20668 20667 20669 20676 20675 20668 20776 20777 20669 20668 20670 20677 20676 20669 20777 20778 20670 20669 20671 20678 20677 20670 20778 20779 20671 20670 20672 20695 20678 20671 20779 20780 20672 20671 22375 22381 20695 20672 20780 22471 22375 20672 20674 20680 20679 20673 20675 20681 20680 20674 20676 20682 20681 20675 20677 20683 20682 20676 20678 20696 20683 20677 20695 20697 20696 20678 20680 20685 20684 20679 20681 20686 20685 20680 20682 20687 20686 20681 20683 20698 20687 20682 20696 20699 20698 20683 20685 20689 20688 20684 20686 20690 20689 20685 20687 20691 20690 20686 20698 20701 20691 20687 20690 20693 20692 20689 20691 20704 20693 20690 20701 20705 20704 20691 20693 20708 20694 20692 20704 20709 20708 20693 20708 20714 20713 20694 22381 22386 20697 20695 20697 20700 20699 20696 22386 22390 20700 20697 20699 20702 20701 20698 20700 20703 20702 20699 22390 22394 20703 20700 20702 20706 20705 20701 20703 20707 20706 20702 22394 22397 20707 20703 20705 20710 20709 20704 20706 20711 20710 20705 20707 20712 20711 20706 22397 22399 20712 20707 20709 20715 20714 20708 20710 20716 20715 20709 20711 20717 20716 20710 20712 20718 20717 20711 22399 22401 20718 20712 20714 20720 20719 20713 20715 20721 20720 20714 20716 20722 20721 20715 20717 20723 20722 20716 20718 20724 20723 20717 22401 22423 20724 20718 20726 20732 20731 20725 20727 20733 20732 20726 20728 20734 20733 20727 20729 20735 20734 20728 20730 20754 20735 20729 20753 20755 20754 20730 20732 20737 20736 20731 20733 20738 20737 20732 20734 20739 20738 20733 20735 20740 20739 20734 20754 20756 20740 20735 20737 20742 20741 20736 20738 20743 20742 20737 20739 20744 20743 20738 20740 20758 20744 20739 20756 20759 20758 20740 20742 20746 20745 20741 20743 20747 20746 20742 20744 20761 20747 20743 20758 20762 20761 20744 20746 20749 20748 20745 20747 20765 20749 20746 20761 20766 20765 20747 20749 20751 20750 20748 20765 20770 20751 20749 20751 20775 20752 20750 20770 20776 20775 20751 22429 22434 20755 20753 20831 22429 20753 20807 20755 20757 20756 20754 22434 22439 20757 20755 20757 20760 20759 20756 22439 22443 20760 20757 20759 20763 20762 20758 20760 20764 20763 20759 22443 22446 20764 20760 20762 20767 20766 20761 20763 20768 20767 20762 20764 20769 20768 20763 22446 22448 20769 20764 20766 20771 20770 20765 20767 20772 20771 20766 20768 20773 20772 20767 20769 20774 20773 20768 22448 22450 20774 20769 20771 20777 20776 20770 20772 20778 20777 20771 20773 20779 20778 20772 20774 20780 20779 20773 22450 22471 20780 20774 20782 20788 20787 20781 20865 20888 20782 20781 20783 20789 20788 20782 20888 20889 20783 20782 20784 20790 20789 20783 20889 20890 20784 20783 20785 20791 20790 20784 20890 20891 20785 20784 20786 20809 20791 20785 20891 20892 20786 20785 20808 20810 20809 20786 20892 20893 20808 20786 20788 20793 20792 20787 20789 20794 20793 20788 20790 20795 20794 20789 20791 20811 20795 20790 20809 20812 20811 20791 20793 20797 20796 20792 20794 20798 20797 20793 20795 20799 20798 20794 20811 20814 20799 20795 20797 20801 20800 20796 20798 20802 20801 20797 20799 20817 20802 20798 20814 20818 20817 20799 20801 20804 20803 20800 20802 20821 20804 20801 20817 20822 20821 20802 20804 20806 20805 20803 20821 20826 20806 20804 20806 20831 20807 20805 20826 20832 20831 20806 22482 22487 20810 20808 20893 22582 22482 20808 20810 20813 20812 20809 22487 22491 20813 20810 20812 20815 20814 20811 20813 20816 20815 20812 22491 22495 20816 20813 20815 20819 20818 20814 20816 20820 20819 20815 22495 22498 20820 20816 20818 20823 20822 20817 20819 20824 20823 20818 20820 20825 20824 20819 22498 22500 20825 20820 20822 20827 20826 20821 20823 20828 20827 20822 20824 20829 20828 20823 20825 20830 20829 20824 22500 22502 20830 20825 20827 20833 20832 20826 20828 20834 20833 20827 20829 20835 20834 20828 20830 20836 20835 20829 22502 22524 20836 20830 20832 22430 22429 20831 20833 22431 22430 20832 20834 22432 22431 20833 20835 22433 22432 20834 20836 22451 22433 20835 22524 24205 22451 20836 20941 22612 22530 20837 22530 22536 20846 20837 20940 20941 20837 20838 20837 20846 20845 20838 20939 20940 20838 20839 20838 20845 20844 20839 20938 20939 20839 20840 20839 20844 20843 20840 20840 20943 20937 20938 20842 20943 20840 20843 20842 20848 20847 20841 20942 20943 20842 20841 20843 20849 20848 20842 20844 20850 20849 20843 20845 20851 20850 20844 20846 20866 20851 20845 22536 22542 20866 20846 20848 20853 20852 20847 20849 20854 20853 20848 20850 20855 20854 20849 20851 20867 20855 20850 20866 20868 20867 20851 20853 20857 20856 20852 20854 20858 20857 20853 20855 20869 20858 20854 20867 20870 20869 20855 20857 20860 20859 20856 20858 20861 20860 20857 20869 20873 20861 20858 20860 20863 20862 20859 20861 20877 20863 20860 20873 20878 20877 20861 20863 20882 20864 20862 20877 20883 20882 20863 20882 20888 20865 20864 22542 22547 20868 20866 20868 20871 20870 20867 20868 22547 20872 20871 20870 20874 20873 20869 20871 20875 20874 20870 20872 20876 20875 20871 22551 22553 20876 20872 22548 22551 20872 22547 20874 20879 20878 20873 20875 20880 20879 20874 20876 20881 20880 20875 22553 22555 20881 20876 20878 20884 20883 20877 20879 20885 20884 20878 20880 20886 20885 20879 20881 20887 20886 20880 22555 22576 20887 20881 20883 20889 20888 20882 20884 20890 20889 20883 20885 20891 20890 20884 20886 20892 20891 20885 20887 20893 20892 20886 22576 22582 20893 20887 20895 20901 20900 20894 20968 20988 20895 20894 20896 20902 20901 20895 20988 20989 20896 20895 20897 20903 20902 20896 20989 20990 20897 20896 20898 20904 20903 20897 20990 20991 20898 20897 20899 20921 20904 20898 20991 20992 20899 20898 22586 22592 20921 20899 20992 22697 22586 20899 20901 20906 20905 20900 20902 20907 20906 20901 20903 20908 20907 20902 20904 20922 20908 20903 20921 20923 20922 20904 20906 20910 20909 20905 20907 20911 20910 20906 20908 20912 20911 20907 20922 20924 20912 20908 20910 20914 20913 20909 20911 20915 20914 20910 20912 20926 20915 20911 20924 20927 20926 20912 20914 20917 20916 20913 20915 20929 20917 20914 20926 20930 20929 20915 20917 20919 20918 20916 20929 20933 20919 20917 20919 20937 20920 20918 20933 20938 20937 20919 20937 20943 20942 20920 22592 22597 20923 20921 20923 20925 20924 20922 22597 22601 20925 20923 20925 20928 20927 20924 22601 22605 20928 20925 20927 20931 20930 20926 20928 20932 20931 20927 22605 22608 20932 20928 20930 20934 20933 20929 20931 20935 20934 20930 20932 20936 20935 20931 22608 22610 20936 20932 20934 20939 20938 20933 20935 20940 20939 20934 20936 20941 20940 20935 22610 22612 20941 20936 21040 22727 22643 20944 22643 22649 20969 20944 20944 21045 21039 21040 20949 21045 20944 20969 20946 20951 20950 20945 21041 21042 20946 20945 20947 20952 20951 20946 21042 21043 20947 20946 20948 20953 20952 20947 21043 21044 20948 20947 20949 20954 20953 20948 21044 21045 20949 20948 20969 20970 20954 20949 20951 20956 20955 20950 20952 20957 20956 20951 20953 20958 20957 20952 20954 20971 20958 20953 20970 20972 20971 20954 20956 20960 20959 20955 20957 20961 20960 20956 20958 20973 20961 20957 20971 20974 20973 20958 20960 20963 20962 20959 20961 20964 20963 20960 20973 20976 20964 20961 20963 20966 20965 20962 20964 20979 20966 20963 20976 20980 20979 20964 20966 20983 20967 20965 20979 20984 20983 20966 20983 20988 20968 20967 22649 22654 20970 20969 22654 22658 20972 20970 20972 20975 20974 20971 22658 22662 20975 20972 20974 20977 20976 20973 20975 20978 20977 20974 22662 22665 20978 20975 20977 20981 20980 20976 20978 20982 20981 20977 22665 22667 20982 20978 20980 20985 20984 20979 20981 20986 20985 20980 20982 20987 20986 20981 22667 22669 20987 20982 20984 20989 20988 20983 20985 20990 20989 20984 20986 20991 20990 20985 20987 20992 20991 20986 22669 22697 20992 20987 21100 21101 21017 20993 21017 21018 21002 20993 21099 21100 20993 20994 20993 21002 21001 20994 21098 21099 20994 20995 20994 21001 21000 20995 21097 21098 20995 20996 20995 21000 20999 20996 21096 21097 20996 20997 20996 20999 20998 20997 20999 21004 21003 20998 21000 21005 21004 20999 21001 21006 21005 21000 21002 21019 21006 21001 21018 21020 21019 21002 21004 21008 21007 21003 21005 21009 21008 21004 21006 21021 21009 21005 21019 21022 21021 21006 21008 21011 21010 21007 21009 21012 21011 21008 21021 21024 21012 21009 21011 21014 21013 21010 21012 21027 21014 21011 21024 21028 21027 21012 21014 21031 21015 21013 21027 21032 21031 21014 21031 21036 21016 21015 21036 21042 21041 21016 22704 22709 21018 21017 21101 22802 22704 21017 22709 22714 21020 21018 21020 21023 21022 21019 22714 22718 21023 21020 21022 21025 21024 21021 21023 21026 21025 21022 22718 22721 21026 21023 21025 21029 21028 21024 21026 21030 21029 21025 22721 22724 21030 21026 21028 21033 21032 21027 21029 21034 21033 21028 21030 21035 21034 21029 22724 22726 21035 21030 21032 21037 21036 21031 21033 21038 21037 21032 21034 21039 21038 21033 21035 21040 21039 21034 22726 22727 21040 21035 21037 21043 21042 21036 21038 21044 21043 21037 21039 21045 21044 21038 21158 22852 22754 21046 22754 22759 21075 21046 21157 21158 21046 21047 21046 21075 21054 21047 21156 21157 21047 21048 21047 21054 21053 21048 21048 21161 21155 21156 21052 21161 21048 21053 21050 21056 21055 21049 21131 21159 21050 21049 21051 21057 21056 21050 21159 21160 21051 21050 21052 21058 21057 21051 21160 21161 21052 21051 21053 21059 21058 21052 21054 21076 21059 21053 21075 21077 21076 21054 21056 21061 21060 21055 21057 21062 21061 21056 21058 21063 21062 21057 21059 21064 21063 21058 21076 21078 21064 21059 21061 21066 21065 21060 21062 21067 21066 21061 21063 21068 21067 21062 21064 21080 21068 21063 21078 21081 21080 21064 21066 21070 21069 21065 21067 21071 21070 21066 21068 21083 21071 21067 21080 21084 21083 21068 21071 21073 21072 21070 21083 21087 21073 21071 21073 21091 21074 21072 21087 21092 21091 21073 21091 21097 21096 21074 22759 22764 21077 21075 21077 21079 21078 21076 22764 22768 21079 21077 21079 21082 21081 21078 22768 22771 21082 21079 21081 21085 21084 21080 21082 21086 21085 21081 22771 22774 21086 21082 21084 21088 21087 21083 21085 21089 21088 21084 21086 21090 21089 21085 22774 22776 21090 21086 21088 21093 21092 21087 21089 21094 21093 21088 21090 21095 21094 21089 22776 22777 21095 21090 21092 21098 21097 21091 21093 21099 21098 21092 21094 21100 21099 21093 21095 21101 21100 21094 22777 22802 21101 21095 21103 21109 21108 21102 21189 21213 21103 21102 21104 21110 21109 21103 21213 21214 21104 21103 21105 21111 21110 21104 21214 21215 21105 21104 21106 21112 21111 21105 21215 21216 21106 21105 21107 21133 21112 21106 21216 21217 21107 21106 21132 21134 21133 21107 21217 21218 21132 21107 21109 21114 21113 21108 21110 21115 21114 21109 21111 21116 21115 21110 21112 21117 21116 21111 21133 21135 21117 21112 21114 21119 21118 21113 21115 21120 21119 21114 21116 21121 21120 21115 21117 21137 21121 21116 21135 21138 21137 21117 21119 21123 21122 21118 21120 21124 21123 21119 21121 21140 21124 21120 21137 21141 21140 21121 21123 21126 21125 21122 21124 21127 21126 21123 21140 21144 21127 21124 21126 21129 21128 21125 21127 21148 21129 21126 21144 21149 21148 21127 21129 21153 21130 21128 21148 21154 21153 21129 21153 21159 21131 21130 22809 22814 21134 21132 22808 22809 21132 21218 21134 21136 21135 21133 22814 22818 21136 21134 21136 21139 21138 21135 22818 22821 21139 21136 21138 21142 21141 21137 21139 21143 21142 21138 22821 22824 21143 21139 21141 21145 21144 21140 21142 21146 21145 21141 21143 21147 21146 21142 22824 22826 21147 21143 21145 21150 21149 21144 21146 21151 21150 21145 21147 21152 21151 21146 22826 22827 21152 21147 21149 21155 21154 21148 21150 21156 21155 21149 21151 21157 21156 21150 21152 21158 21157 21151 22827 22852 21158 21152 21154 21160 21159 21153 21155 21161 21160 21154 21268 22942 22859 21162 22859 22865 21190 21162 21267 21268 21162 21163 21162 21190 21170 21163 21266 21267 21163 21164 21163 21170 21169 21164 21265 21266 21164 21165 21164 21169 21168 21165 21165 21270 21264 21265 21167 21270 21165 21168 21167 21172 21171 21166 21269 21270 21167 21166 21168 21173 21172 21167 21169 21174 21173 21168 21170 21175 21174 21169 21190 21191 21175 21170 21172 21177 21176 21171 21173 21178 21177 21172 21174 21179 21178 21173 21175 21192 21179 21174 21191 21193 21192 21175 21177 21181 21180 21176 21178 21182 21181 21177 21179 21194 21182 21178 21192 21195 21194 21179 21181 21184 21183 21180 21182 21185 21184 21181 21194 21198 21185 21182 21184 21187 21186 21183 21185 21202 21187 21184 21198 21203 21202 21185 21187 21207 21188 21186 21202 21208 21207 21187 21207 21213 21189 21188 22865 22870 21191 21190 22870 22874 21193 21191 21193 21196 21195 21192 21193 22874 21197 21196 21195 21199 21198 21194 21196 21200 21199 21195 21197 21201 21200 21196 22878 22880 21201 21197 22875 22878 21197 22874 21199 21204 21203 21198 21200 21205 21204 21199 21201 21206 21205 21200 22880 22882 21206 21201 21203 21209 21208 21202 21204 21210 21209 21203 21205 21211 21210 21204 21206 21212 21211 21205 22882 22906 21212 21206 21208 21214 21213 21207 21209 21215 21214 21208 21210 21216 21215 21209 21211 21217 21216 21210 21212 21218 21217 21211 21212 22906 22808 21218 21318 23003 22913 21219 22913 22919 21246 21219 21317 21318 21219 21220 21219 21246 21225 21220 21220 21322 21316 21317 21224 21322 21220 21225 21222 21227 21226 21221 21319 21320 21222 21221 21223 21228 21227 21222 21320 21321 21223 21222 21224 21229 21228 21223 21321 21322 21224 21223 21225 21230 21229 21224 21246 21247 21230 21225 21227 21232 21231 21226 21228 21233 21232 21227 21229 21234 21233 21228 21230 21248 21234 21229 21247 21249 21248 21230 21232 21236 21235 21231 21233 21237 21236 21232 21234 21250 21237 21233 21248 21251 21250 21234 21236 21239 21238 21235 21237 21240 21239 21236 21250 21253 21240 21237 21239 21242 21241 21238 21240 21256 21242 21239 21253 21257 21256 21240 21242 21244 21243 21241 21256 21260 21244 21242 21244 21264 21245 21243 21260 21265 21264 21244 21264 21270 21269 21245 22919 22924 21247 21246 22924 22929 21249 21247 21249 21252 21251 21248 22929 22933 21252 21249 21251 21254 21253 21250 21252 21255 21254 21251 22933 22936 21255 21252 21254 21258 21257 21253 21255 21259 21258 21254 22936 22939 21259 21255 21257 21261 21260 21256 21258 21262 21261 21257 21259 21263 21262 21258 22939 22941 21263 21259 21261 21266 21265 21260 21262 21267 21266 21261 21263 21268 21267 21262 22941 22942 21268 21263 21272 21278 21277 21271 21371 21372 21272 21271 21273 21279 21278 21272 21372 21373 21273 21272 21274 21280 21279 21273 21373 21374 21274 21273 21275 21281 21280 21274 21374 21375 21275 21274 21276 21298 21281 21275 21375 21376 21276 21275 22980 22985 21298 21276 22974 22980 21276 21376 21278 21283 21282 21277 21279 21284 21283 21278 21280 21285 21284 21279 21281 21299 21285 21280 21298 21300 21299 21281 21283 21287 21286 21282 21284 21288 21287 21283 21285 21289 21288 21284 21299 21301 21289 21285 21287 21291 21290 21286 21288 21292 21291 21287 21289 21303 21292 21288 21301 21304 21303 21289 21291 21294 21293 21290 21292 21306 21294 21291 21303 21307 21306 21292 21294 21296 21295 21293 21306 21310 21296 21294 21296 21314 21297 21295 21310 21315 21314 21296 21314 21320 21319 21297 22985 22990 21300 21298 21300 21302 21301 21299 22990 22994 21302 21300 21302 21305 21304 21301 22994 22997 21305 21302 21304 21308 21307 21303 21305 21309 21308 21304 22997 23000 21309 21305 21307 21311 21310 21306 21308 21312 21311 21307 21309 21313 21312 21308 23000 23002 21313 21309 21311 21316 21315 21310 21312 21317 21316 21311 21313 21318 21317 21312 23002 23003 21318 21313 21315 21321 21320 21314 21316 21322 21321 21315 21428 23147 23039 21323 23039 23044 21350 21323 21427 21428 21323 21324 21323 21350 21333 21324 21426 21427 21324 21325 21324 21333 21332 21325 21425 21426 21325 21326 21325 21332 21331 21326 21424 21425 21326 21327 21326 21331 21330 21327 21423 21424 21327 21328 21327 21330 21329 21328 21330 21335 21334 21329 21331 21336 21335 21330 21332 21337 21336 21331 21333 21351 21337 21332 21350 21352 21351 21333 21335 21339 21338 21334 21336 21340 21339 21335 21337 21341 21340 21336 21351 21353 21341 21337 21339 21343 21342 21338 21340 21344 21343 21339 21341 21355 21344 21340 21353 21356 21355 21341 21343 21346 21345 21342 21344 21358 21346 21343 21355 21359 21358 21344 21346 21348 21347 21345 21358 21362 21348 21346 21348 21366 21349 21347 21362 21367 21366 21348 21366 21372 21371 21349 23044 23049 21352 21350 21352 21354 21353 21351 23049 23053 21354 21352 21354 21357 21356 21353 23053 23056 21357 21354 21356 21360 21359 21355 21357 21361 21360 21356 23056 23059 21361 21357 21359 21363 21362 21358 21360 21364 21363 21359 21361 21365 21364 21360 23059 23061 21365 21361 21363 21368 21367 21362 21364 21369 21368 21363 21365 21370 21369 21364 23061 23062 21370 21365 21367 21373 21372 21366 21368 21374 21373 21367 21369 21375 21374 21368 21370 21376 21375 21369 21370 23062 22974 21376 21477 23201 23098 21377 23098 23103 21402 21377 21476 21477 21377 21378 21377 21402 21385 21378 21475 21476 21378 21379 21378 21385 21384 21379 21474 21475 21379 21380 21379 21384 21383 21380 21380 21479 21473 21474 21382 21479 21380 21383 21382 21387 21386 21381 21478 21479 21382 21381 21383 21388 21387 21382 21384 21389 21388 21383 21385 21403 21389 21384 21402 21404 21403 21385 21387 21391 21390 21386 21388 21392 21391 21387 21389 21393 21392 21388 21403 21405 21393 21389 21391 21395 21394 21390 21392 21396 21395 21391 21393 21407 21396 21392 21405 21408 21407 21393 21395 21398 21397 21394 21396 21410 21398 21395 21407 21411 21410 21396 21398 21400 21399 21397 21410 21414 21400 21398 21400 21418 21401 21399 21414 21419 21418 21400 21418 21424 21423 21401 23103 23108 21404 21402 21404 21406 21405 21403 23108 23112 21406 21404 21406 21409 21408 21405 23112 23116 21409 21406 21408 21412 21411 21407 21409 21413 21412 21408 23116 23119 21413 21409 21411 21415 21414 21410 21412 21416 21415 21411 21413 21417 21416 21412 23119 23121 21417 21413 21415 21420 21419 21414 21416 21421 21420 21415 21417 21422 21421 21416 23121 23123 21422 21417 21419 21425 21424 21418 21420 21426 21425 21419 21421 21427 21426 21420 21422 21428 21427 21421 23123 23147 21428 21422 21527 23232 23150 21429 23150 23156 21454 21429 21429 21532 21526 21527 21434 21532 21429 21454 21431 21436 21435 21430 21528 21529 21431 21430 21432 21437 21436 21431 21529 21530 21432 21431 21433 21438 21437 21432 21530 21531 21433 21432 21434 21439 21438 21433 21531 21532 21434 21433 21454 21455 21439 21434 21436 21441 21440 21435 21437 21442 21441 21436 21438 21443 21442 21437 21439 21456 21443 21438 21455 21457 21456 21439 21441 21445 21444 21440 21442 21446 21445 21441 21443 21458 21446 21442 21456 21459 21458 21443 21445 21448 21447 21444 21446 21449 21448 21445 21458 21461 21449 21446 21448 21451 21450 21447 21449 21464 21451 21448 21461 21465 21464 21449 21451 21468 21452 21450 21464 21469 21468 21451 21468 21473 21453 21452 21473 21479 21478 21453 23156 23161 21455 21454 23161 23165 21457 21455 21457 21460 21459 21456 23165 23169 21460 21457 21459 21462 21461 21458 21460 21463 21462 21459 23169 23172 21463 21460 21462 21466 21465 21461 21463 21467 21466 21462 23172 23174 21467 21463 21465 21470 21469 21464 21466 21471 21470 21465 21467 21472 21471 21466 23174 23176 21472 21467 21469 21474 21473 21468 21470 21475 21474 21469 21471 21476 21475 21470 21472 21477 21476 21471 23176 23201 21477 21472 21481 21487 21486 21480 21560 21581 21481 21480 21482 21488 21487 21481 21581 21582 21482 21481 21483 21489 21488 21482 21582 21583 21483 21482 21484 21490 21489 21483 21583 21584 21484 21483 21485 21507 21490 21484 21584 21585 21485 21484 23209 23214 21507 21485 21585 23320 23209 21485 21487 21492 21491 21486 21488 21493 21492 21487 21489 21494 21493 21488 21490 21508 21494 21489 21507 21509 21508 21490 21492 21496 21495 21491 21493 21497 21496 21492 21494 21498 21497 21493 21508 21510 21498 21494 21496 21500 21499 21495 21497 21501 21500 21496 21498 21512 21501 21497 21510 21513 21512 21498 21500 21503 21502 21499 21501 21515 21503 21500 21512 21516 21515 21501 21503 21505 21504 21502 21515 21519 21505 21503 21505 21523 21506 21504 21519 21524 21523 21505 21523 21529 21528 21506 23214 23219 21509 21507 21509 21511 21510 21508 23219 23223 21511 21509 21511 21514 21513 21510 23223 23226 21514 21511 21513 21517 21516 21512 21514 21518 21517 21513 23226 23229 21518 21514 21516 21520 21519 21515 21517 21521 21520 21516 21518 21522 21521 21517 23229 23231 21522 21518 21520 21525 21524 21519 21521 21526 21525 21520 21522 21527 21526 21521 23231 23232 21527 21522 21524 21530 21529 21523 21525 21531 21530 21524 21526 21532 21531 21525 21633 21634 21561 21533 21561 21562 21540 21533 21632 21633 21533 21534 21533 21540 21539 21534 21534 21637 21631 21632 21538 21637 21534 21539 21536 21542 21541 21535 21611 21635 21536 21535 21537 21543 21542 21536 21635 21636 21537 21536 21538 21544 21543 21537 21636 21637 21538 21537 21539 21545 21544 21538 21540 21563 21545 21539 21562 21564 21563 21540 21542 21547 21546 21541 21543 21548 21547 21542 21544 21549 21548 21543 21545 21565 21549 21544 21563 21566 21565 21545 21547 21551 21550 21546 21548 21552 21551 21547 21549 21553 21552 21548 21565 21567 21553 21549 21551 21555 21554 21550 21552 21556 21555 21551 21553 21569 21556 21552 21567 21570 21569 21553 21555 21558 21557 21554 21556 21572 21558 21555 21569 21573 21572 21556 21558 21576 21559 21557 21572 21577 21576 21558 21576 21581 21560 21559 23267 23272 21562 21561 21634 23366 23267 21561 23272 23276 21564 21562 21564 23280 21566 21563 23276 23281 23280 21564 21566 21568 21567 21565 23280 23284 21568 21566 21568 21571 21570 21567 23284 23287 21571 21568 21570 21574 21573 21569 21571 21575 21574 21570 23287 23289 21575 21571 21573 21578 21577 21572 21574 21579 21578 21573 21575 21580 21579 21574 23289 23291 21580 21575 21577 21582 21581 21576 21578 21583 21582 21577 21579 21584 21583 21578 21580 21585 21584 21579 23291 23320 21585 21580 21683 23393 23324 21586 23324 23329 21612 21586 21682 21683 21586 21587 21586 21612 21594 21587 21681 21682 21587 21588 21587 21594 21593 21588 21680 21681 21588 21589 21588 21593 21592 21589 21589 21685 21679 21680 21591 21685 21589 21592 21591 21596 21595 21590 21684 21685 21591 21590 21592 21597 21596 21591 21593 21598 21597 21592 21594 21613 21598 21593 21612 21614 21613 21594 21596 21600 21599 21595 21597 21601 21600 21596 21598 21602 21601 21597 21613 21615 21602 21598 21600 21604 21603 21599 21601 21605 21604 21600 21602 21617 21605 21601 21615 21618 21617 21602 21604 21607 21606 21603 21605 21620 21607 21604 21617 21621 21620 21605 21607 21624 21609 21606 21620 21625 21624 21607 21609 21629 21610 21608 21624 21630 21629 21609 21629 21635 21611 21610 23329 23334 21614 21612 21614 21616 21615 21613 23334 23338 21616 21614 21616 21619 21618 21615 23338 23341 21619 21616 21618 21622 21621 21617 21619 21623 21622 21618 23341 23343 21623 21619 21621 21626 21625 21620 21622 21627 21626 21621 21623 21628 21627 21622 23343 23345 21628 21623 21625 21631 21630 21624 21626 21632 21631 21625 21627 21633 21632 21626 21628 21634 21633 21627 23345 23366 21634 21628 21630 21636 21635 21629 21631 21637 21636 21630 21639 21645 21644 21638 21640 21646 21645 21639 21729 21730 21640 21639 21641 21647 21646 21640 21730 21731 21641 21640 21642 21648 21647 21641 21731 21732 21642 21641 21643 21663 21648 21642 21732 21733 21643 21642 21662 21664 21663 21643 21733 21734 21662 21643 21645 21650 21649 21644 21646 21651 21650 21645 21647 21652 21651 21646 21648 21665 21652 21647 21663 21666 21665 21648 21650 21654 21653 21649 21651 21655 21654 21650 21652 21668 21655 21651 21665 21669 21668 21652 21654 21657 21656 21653 21655 21658 21657 21654 21668 21672 21658 21655 21657 21660 21659 21656 21658 21675 21660 21657 21672 21676 21675 21658 21660 21679 21661 21659 21675 21680 21679 21660 21679 21685 21684 21661 23374 23379 21664 21662 21734 23460 23374 21662 21664 21667 21666 21663 23379 23383 21667 21664 21666 21670 21669 21665 21667 21671 21670 21666 23383 23386 21671 21667 21669 21673 21672 21668 21670 21674 21673 21669 21671 23388 21674 21670 23386 23389 23388 21671 21673 21677 21676 21672 21674 21678 21677 21673 23388 23391 21678 21674 21676 21681 21680 21675 21677 21682 21681 21676 21678 21683 21682 21677 23391 23393 21683 21678 21687 21693 21692 21686 21760 21782 21687 21686 21688 21694 21693 21687 21782 21783 21688 21687 21689 21695 21694 21688 21783 21784 21689 21688 21690 21696 21695 21689 21784 21785 21690 21689 21691 21711 21696 21690 21785 21786 21691 21690 21710 23420 21711 21691 21786 21787 21710 21691 21693 21698 21697 21692 21694 21699 21698 21693 21695 21700 21699 21694 21696 21712 21700 21695 21711 21713 21712 21696 21698 21702 21701 21697 21699 21703 21702 21698 21700 21714 21703 21699 21712 21715 21714 21700 21702 21705 21704 21701 21703 21706 21705 21702 21714 21717 21706 21703 21705 21708 21707 21704 21706 21720 21708 21705 21717 21721 21720 21706 21708 21724 21709 21707 21720 21725 21724 21708 21724 21730 21729 21709 23415 23421 23420 21710 21787 23503 23415 21710 23420 23426 21713 21711 21713 21716 21715 21712 23426 23431 21716 21713 21715 21718 21717 21714 21716 21719 21718 21715 23431 23435 21719 21716 21718 21722 21721 21717 21719 21723 21722 21718 23435 23438 21723 21719 21721 21726 21725 21720 21722 21727 21726 21721 21723 21728 21727 21722 23438 23440 21728 21723 21725 21731 21730 21724 21726 21732 21731 21725 21727 21733 21732 21726 21728 21734 21733 21727 23440 23460 21734 21728 21736 21742 21741 21735 21836 21837 21736 21735 21737 21743 21742 21736 21837 21838 21737 21736 21738 21744 21743 21737 21838 21839 21738 21737 21739 21745 21744 21738 21839 21840 21739 21738 21740 21761 21745 21739 21840 21841 21740 21739 23461 23467 21761 21740 21841 23560 23461 21740 21742 21747 21746 21741 21743 21748 21747 21742 21744 21749 21748 21743 21745 21762 21749 21744 21761 21763 21762 21745 21747 21752 21751 21746 21748 21753 21752 21747 21749 21764 21753 21748 21762 21765 21764 21749 21751 21755 21754 21750 21752 21756 21755 21751 21753 21767 21756 21752 21764 21768 21767 21753 21755 21758 21757 21754 21756 21771 21758 21755 21767 21772 21771 21756 21758 21776 21759 21757 21771 21777 21776 21758 21776 21782 21760 21759 23467 23473 21763 21761 21763 21766 21765 21762 23473 23478 21766 21763 21765 21769 21768 21764 21766 21770 21769 21765 23478 23482 21770 21766 21768 21773 21772 21767 21769 21774 21773 21768 21770 21775 21774 21769 23482 23485 21775 21770 21772 21778 21777 21771 21773 21779 21778 21772 21774 21780 21779 21773 21775 21781 21780 21774 23485 23487 21781 21775 21777 21783 21782 21776 21778 21784 21783 21777 21779 21785 21784 21778 21780 21786 21785 21779 21781 21787 21786 21780 23487 23503 21787 21781 21789 21795 21794 21788 21867 21885 21789 21788 21790 21796 21795 21789 21885 21886 21790 21789 21791 21797 21796 21790 21886 21887 21791 21790 21792 21798 21797 21791 21887 21888 21792 21791 21793 21799 21798 21792 21888 21889 21793 21792 23510 23511 21799 21793 21889 23598 23510 21793 21795 21801 21800 21794 21796 21802 21801 21795 21797 21803 21802 21796 21798 21804 21803 21797 21799 21817 21804 21798 23511 23517 21817 21799 21801 21806 21805 21800 21802 21807 21806 21801 21803 21808 21807 21802 21804 21818 21808 21803 21817 21819 21818 21804 21806 21810 21809 21805 21807 21811 21810 21806 21808 21820 21811 21807 21818 21821 21820 21808 21810 21813 21812 21809 21811 21823 21813 21810 21820 21824 21823 21811 21813 21815 21814 21812 21823 21827 21815 21813 21815 21831 21816 21814 21827 21832 21831 21815 21831 21837 21836 21816 23517 23522 21819 21817 21819 21822 21821 21818 23522 23527 21822 21819 21821 21825 21824 21820 21822 21826 21825 21821 23527 23531 21826 21822 21824 21828 21827 21823 21825 21829 21828 21824 21826 21830 21829 21825 23531 23534 21830 21826 21828 21833 21832 21827 21829 21834 21833 21828 21830 21835 21834 21829 23534 23536 21835 21830 21832 21838 21837 21831 21833 21839 21838 21832 21834 21840 21839 21833 21835 21841 21840 21834 23536 23560 21841 21835 21843 21849 21848 21842 21938 21939 21843 21842 21844 21850 21849 21843 21939 21940 21844 21843 21845 21851 21850 21844 21940 21941 21845 21844 21846 21852 21851 21845 21941 21942 21846 21845 21847 21868 21852 21846 21942 21943 21847 21846 23567 23574 21868 21847 21943 23661 23567 21847 21849 21854 21853 21848 21850 21855 21854 21849 21851 21856 21855 21850 21852 21869 21856 21851 21868 21870 21869 21852 21854 21858 21857 21853 21855 21859 21858 21854 21856 21860 21859 21855 21869 21871 21860 21856 21858 21862 21861 21857 21859 21863 21862 21858 21860 21873 21863 21859 21871 21874 21873 21860 21862 21865 21864 21861 21863 21876 21865 21862 21873 21877 21876 21863 21865 21880 21866 21864 21876 21881 21880 21865 21880 21885 21867 21866 23574 23580 21870 21868 21870 21872 21871 21869 23580 23585 21872 21870 21872 21875 21874 21871 23585 23589 21875 21872 21874 21878 21877 21873 21875 21879 21878 21874 23589 23593 21879 21875 21877 21882 21881 21876 21878 21883 21882 21877 21879 21884 21883 21878 23593 23596 21884 21879 21881 21886 21885 21880 21882 21887 21886 21881 21883 21888 21887 21882 21884 21889 21888 21883 23596 23598 21889 21884 21891 21897 21896 21890 21992 21993 21891 21890 21892 21898 21897 21891 21993 21994 21892 21891 21893 21899 21898 21892 21994 21995 21893 21892 21894 21900 21899 21893 21995 21996 21894 21893 21895 21918 21900 21894 21996 21997 21895 21894 23629 23634 21918 21895 21997 23721 23629 21895 21897 21902 21901 21896 21898 21903 21902 21897 21899 21904 21903 21898 21900 21905 21904 21899 21918 21919 21905 21900 21902 21907 21906 21901 21903 21908 21907 21902 21904 21909 21908 21903 21905 21920 21909 21904 21919 21921 21920 21905 21907 21911 21910 21906 21908 21912 21911 21907 21909 21922 21912 21908 21920 21923 21922 21909 21911 21914 21913 21910 21912 21925 21914 21911 21922 21926 21925 21912 21914 21916 21915 21913 21925 21929 21916 21914 21916 21933 21917 21915 21929 21934 21933 21916 21933 21939 21938 21917 23634 23640 21919 21918 23640 23645 21921 21919 21921 21924 21923 21920 23645 23650 21924 21921 21923 21927 21926 21922 21924 21928 21927 21923 23650 23654 21928 21924 21926 21930 21929 21925 21927 21931 21930 21926 21928 21932 21931 21927 23654 23657 21932 21928 21930 21935 21934 21929 21931 21936 21935 21930 21932 21937 21936 21931 23657 23659 21937 21932 21934 21940 21939 21933 21935 21941 21940 21934 21936 21942 21941 21935 21937 21943 21942 21936 23659 23661 21943 21937 21945 21951 21950 21944 22023 22042 21945 21944 21946 21952 21951 21945 22042 22043 21946 21945 21947 21953 21952 21946 22043 22044 21947 21946 21948 21954 21953 21947 22044 22045 21948 21947 21949 21955 21954 21948 22045 22046 21949 21948 23690 23692 21955 21949 22046 23779 23690 21949 21951 21957 21956 21950 21952 21958 21957 21951 21953 21959 21958 21952 21954 21960 21959 21953 21955 21974 21960 21954 23692 23698 21974 21955 21957 21962 21961 21956 21958 21963 21962 21957 21959 21964 21963 21958 21960 21975 21964 21959 21974 21976 21975 21960 21962 21966 21965 21961 21963 21967 21966 21962 21964 21977 21967 21963 21975 21978 21977 21964 21966 21969 21968 21965 21967 21970 21969 21966 21977 21980 21970 21967 21969 21972 21971 21968 21970 21983 21972 21969 21980 21984 21983 21970 21972 21987 21973 21971 21983 21988 21987 21972 21987 21993 21992 21973 23698 23704 21976 21974 21976 21979 21978 21975 23704 23709 21979 21976 21978 21981 21980 21977 21979 21982 21981 21978 23709 23713 21982 21979 21981 21985 21984 21980 21982 21986 21985 21981 23713 23716 21986 21982 21984 21989 21988 21983 21985 21990 21989 21984 21986 21991 21990 21985 23716 23719 21991 21986 21988 21994 21993 21987 21989 21995 21994 21988 21990 21996 21995 21989 21991 21997 21996 21990 23719 23721 21997 21991 21998 22095 22000 21999 22090 22095 21998 22072 22000 22006 22005 21999 22001 22007 22006 22000 22095 22096 22001 22000 22002 22008 22007 22001 22096 22097 22002 22001 22003 22009 22008 22002 22097 22098 22003 22002 22004 22024 22009 22003 22098 22099 22004 22003 23750 23756 22024 22004 22099 23867 23750 22004 22006 22011 22010 22005 22007 22012 22011 22006 22008 22013 22012 22007 22009 22025 22013 22008 22024 22026 22025 22009 22011 22015 22014 22010 22012 22016 22015 22011 22013 22027 22016 22012 22025 22028 22027 22013 22015 22018 22017 22014 22016 22019 22018 22015 22027 22030 22019 22016 22018 22021 22020 22017 22019 22033 22021 22018 22030 22034 22033 22019 22021 22037 22022 22020 22033 22038 22037 22021 22037 22042 22023 22022 23756 23762 22026 22024 22026 22029 22028 22025 23762 23767 22029 22026 22028 22031 22030 22027 22029 22032 22031 22028 23767 23771 22032 22029 22031 22035 22034 22030 22032 22036 22035 22031 23771 23774 22036 22032 22034 22039 22038 22033 22035 22040 22039 22034 22036 22041 22040 22035 23774 23777 22041 22036 22038 22043 22042 22037 22039 22044 22043 22038 22040 22045 22044 22039 22041 22046 22045 22040 23777 23779 22046 22041 22048 22054 22053 22047 22148 22149 22048 22047 22049 22055 22054 22048 22149 22150 22049 22048 22050 22056 22055 22049 22150 22151 22050 22049 22051 22057 22056 22050 22151 22152 22051 22050 22052 22073 22057 22051 22152 22153 22052 22051 23811 23818 22073 22052 22153 23903 23811 22052 22054 22059 22058 22053 22055 22060 22059 22054 22056 22061 22060 22055 22057 22074 22061 22056 22073 22075 22074 22057 22059 22063 22062 22058 22060 22064 22063 22059 22061 22065 22064 22060 22074 22076 22065 22061 22063 22067 22066 22062 22064 22068 22067 22063 22065 22078 22068 22064 22076 22079 22078 22065 22067 22070 22069 22066 22068 22081 22070 22067 22078 22082 22081 22068 22070 22085 22071 22069 22081 22086 22085 22070 22085 22090 22072 22071 23818 23824 22075 22073 22075 22077 22076 22074 23824 23829 22077 22075 22077 22080 22079 22076 23829 23833 22080 22077 22079 22083 22082 22078 22080 22084 22083 22079 23833 23836 22084 22080 22082 22087 22086 22081 22083 22088 22087 22082 22084 22089 22088 22083 23836 23839 22089 22084 22086 22091 22090 22085 22087 22092 22091 22086 22088 22093 22092 22087 22089 22094 22093 22088 23839 23841 22094 22089 22091 22096 22095 22090 22092 22097 22096 22091 22093 22098 22097 22092 22094 22099 22098 22093 23841 23867 22099 22094 22101 22107 22106 22100 22202 22203 22101 22100 22102 22108 22107 22101 22203 22204 22102 22101 22103 22109 22108 22102 22204 22205 22103 22102 22104 22110 22109 22103 22205 22206 22104 22103 22105 22126 22110 22104 22206 22207 22105 22104 23874 23878 22126 22105 22207 23955 23874 22105 22107 22112 22111 22106 22108 22113 22112 22107 22109 22114 22113 22108 22110 22127 22114 22109 22126 22128 22127 22110 22112 22116 22115 22111 22113 22117 22116 22112 22114 22118 22117 22113 22127 22129 22118 22114 22116 22120 22119 22115 22117 22121 22120 22116 22118 22131 22121 22117 22129 22132 22131 22118 22120 22123 22122 22119 22121 22134 22123 22120 22131 22135 22134 22121 22123 22138 22124 22122 22134 22139 22138 22123 22138 22143 22125 22124 22143 22149 22148 22125 23878 23884 22128 22126 22128 22130 22129 22127 23884 23889 22130 22128 22130 22133 22132 22129 23889 23893 22133 22130 22132 22136 22135 22131 22133 22137 22136 22132 23893 23897 22137 22133 22135 22140 22139 22134 22136 22141 22140 22135 22137 22142 22141 22136 23897 23900 22142 22137 22139 22144 22143 22138 22140 22145 22144 22139 22141 22146 22145 22140 22142 22147 22146 22141 23900 23902 22147 22142 22144 22150 22149 22143 22145 22151 22150 22144 22146 22152 22151 22145 22147 22153 22152 22146 23902 23903 22153 22147 22155 22160 22159 22154 22237 22258 22155 22154 22156 22161 22160 22155 22258 22259 22156 22155 22157 22162 22161 22156 22259 22260 22157 22156 22158 22163 22162 22157 22260 22261 22158 22157 22158 22264 22164 22163 22262 22264 22158 22261 22161 22166 22165 22160 22162 22167 22166 22161 22163 22168 22167 22162 22164 22181 22168 22163 22180 22182 22181 22164 22264 22265 22180 22164 22166 22170 22169 22165 22167 22171 22170 22166 22168 22172 22171 22167 22181 22183 22172 22168 22170 22174 22173 22169 22171 22175 22174 22170 22172 22185 22175 22171 22183 22186 22185 22172 22174 22177 22176 22173 22175 22188 22177 22174 22185 22189 22188 22175 22177 22192 22178 22176 22188 22193 22192 22177 22192 22197 22179 22178 22197 22203 22202 22179 23930 23936 22182 22180 22265 24028 23930 22180 22182 22184 22183 22181 23936 23941 22184 22182 22184 22187 22186 22183 23941 23945 22187 22184 22186 22190 22189 22185 22187 22191 22190 22186 23945 23949 22191 22187 22189 22194 22193 22188 22190 22195 22194 22189 22191 22196 22195 22190 23949 23952 22196 22191 22193 22198 22197 22192 22194 22199 22198 22193 22195 22200 22199 22194 22196 22201 22200 22195 23952 23954 22201 22196 22198 22204 22203 22197 22199 22205 22204 22198 22200 22206 22205 22199 22201 22207 22206 22200 23954 23955 22207 22201 22209 22215 22214 22208 22320 22321 22209 22208 22210 22216 22215 22209 22321 22322 22210 22209 22211 22217 22216 22210 22322 22323 22211 22210 22212 22218 22217 22211 22323 22324 22212 22211 22213 22219 22218 22212 22324 22325 22213 22212 22238 22239 22219 22213 22325 22326 22238 22213 22215 22221 22220 22214 22216 22222 22221 22215 22217 22223 22222 22216 22218 22224 22223 22217 22219 22240 22224 22218 22239 22241 22240 22219 22221 22226 22225 22220 22222 22227 22226 22221 22223 22228 22227 22222 22224 22242 22228 22223 22240 22243 22242 22224 22226 22230 22229 22225 22227 22231 22230 22226 22228 22245 22231 22227 22242 22246 22245 22228 22230 22233 22232 22229 22231 22234 22233 22230 22245 22249 22234 22231 22233 22236 22235 22232 22234 22253 22236 22233 22249 22254 22253 22234 22236 22258 22237 22235 22253 22259 22258 22236 23980 23986 22239 22238 22326 24080 23980 22238 23986 23991 22241 22239 22241 22244 22243 22240 23991 23995 22244 22241 22243 22247 22246 22242 22244 22248 22247 22243 23995 23999 22248 22244 22246 22250 22249 22245 22247 22251 22250 22246 22248 22252 22251 22247 23999 24002 22252 22248 22250 22255 22254 22249 22251 22256 22255 22250 22252 22257 22256 22251 24002 24004 22257 22252 22254 22260 22259 22253 22255 22261 22260 22254 22256 22262 22261 22255 22257 22263 22262 22256 24004 24005 22263 22257 22263 22265 22264 22262 24005 24028 22265 22263 22267 22273 22272 22266 22352 22370 22267 22266 22268 22274 22273 22267 22370 22371 22268 22267 22269 22275 22274 22268 22371 22372 22269 22268 22270 22276 22275 22269 22372 22373 22270 22269 22271 22277 22276 22270 22373 22374 22271 22270 24034 24037 22277 22271 22374 24115 24034 22271 22273 22279 22278 22272 22274 22280 22279 22273 22275 22281 22280 22274 22276 22282 22281 22275 22277 22296 22282 22276 22277 24037 22297 22296 22279 22284 22283 22278 22280 22285 22284 22279 22281 22286 22285 22280 22282 22298 22286 22281 22296 22299 22298 22282 22284 22288 22287 22283 22285 22289 22288 22284 22286 22301 22289 22285 22298 22302 22301 22286 22288 22291 22290 22287 22289 22292 22291 22288 22301 22305 22292 22289 22291 22294 22293 22290 22292 22309 22294 22291 22305 22310 22309 22292 22294 22314 22295 22293 22309 22315 22314 22294 22314 22321 22320 22295 22297 22300 22299 22296 24043 24047 22300 22297 24038 24043 22297 24037 22299 22303 22302 22298 22300 22304 22303 22299 24047 24051 22304 22300 22302 22306 22305 22301 22303 22307 22306 22302 22304 22308 22307 22303 24051 24054 22308 22304 22306 22311 22310 22305 22307 22312 22311 22306 22308 22313 22312 22307 24054 24056 22313 22308 22310 22316 22315 22309 22311 22317 22316 22310 22312 22318 22317 22311 22313 22319 22318 22312 24056 24057 22319 22313 22315 22322 22321 22314 22316 22323 22322 22315 22317 22324 22323 22316 22318 22325 22324 22317 22319 22326 22325 22318 24057 24080 22326 22319 22328 22334 22333 22327 22423 22424 22328 22327 22329 22335 22334 22328 22424 22425 22329 22328 22330 22336 22335 22329 22425 22426 22330 22329 22331 22337 22336 22330 22426 22427 22331 22330 22332 22353 22337 22331 22427 22428 22332 22331 24086 24092 22353 22332 22428 24198 24086 22332 22334 22339 22338 22333 22335 22340 22339 22334 22336 22341 22340 22335 22337 22354 22341 22336 22353 22355 22354 22337 22339 22343 22342 22338 22340 22344 22343 22339 22341 22345 22344 22340 22354 22356 22345 22341 22343 22347 22346 22342 22344 22348 22347 22343 22345 22358 22348 22344 22356 22359 22358 22345 22347 22350 22349 22346 22348 22361 22350 22347 22358 22362 22361 22348 22350 22365 22351 22349 22361 22366 22365 22350 22365 22370 22352 22351 24092 24098 22355 22353 22355 22357 22356 22354 24098 24103 22357 22355 22357 22360 22359 22356 24103 24107 22360 22357 22359 22363 22362 22358 22360 22364 22363 22359 24107 24110 22364 22360 22362 22367 22366 22361 22363 22368 22367 22362 22364 22369 22368 22363 24110 24113 22369 22364 22366 22371 22370 22365 22367 22372 22371 22366 22368 22373 22372 22367 22369 22374 22373 22368 24113 24115 22374 22369 22376 22382 22381 22375 22471 22472 22376 22375 22377 22383 22382 22376 22472 22473 22377 22376 22378 22384 22383 22377 22473 22474 22378 22377 22379 22385 22384 22378 22474 22475 22379 22378 22380 22402 22385 22379 22475 22476 22380 22379 24146 24152 22402 22380 22476 24230 24146 22380 22382 22387 22386 22381 22383 22388 22387 22382 22384 22389 22388 22383 22385 22403 22389 22384 22402 22404 22403 22385 22387 22391 22390 22386 22388 22392 22391 22387 22389 22393 22392 22388 22403 22405 22393 22389 22391 22395 22394 22390 22392 22396 22395 22391 22393 22407 22396 22392 22405 22408 22407 22393 22395 22398 22397 22394 22396 22410 22398 22395 22407 22411 22410 22396 22398 22400 22399 22397 22410 22414 22400 22398 22400 22418 22401 22399 22414 22419 22418 22400 22418 22424 22423 22401 24152 24158 22404 22402 22404 22406 22405 22403 24158 24163 22406 22404 22406 22409 22408 22405 24163 24167 22409 22406 22408 22412 22411 22407 22409 22413 22412 22408 24167 24170 22413 22409 22411 22415 22414 22410 22412 22416 22415 22411 22413 22417 22416 22412 24170 24173 22417 22413 22415 22420 22419 22414 22416 22421 22420 22415 22417 22422 22421 22416 24173 24175 22422 22417 22419 22425 22424 22418 22420 22426 22425 22419 22421 22427 22426 22420 22422 22428 22427 22421 24175 24198 22428 22422 22430 22435 22434 22429 22431 22436 22435 22430 22432 22437 22436 22431 22433 22438 22437 22432 22451 22452 22438 22433 22435 22440 22439 22434 22436 22441 22440 22435 22437 22442 22441 22436 22438 22453 22442 22437 22452 22454 22453 22438 22440 22444 22443 22439 22441 22445 22444 22440 22442 22455 22445 22441 22453 22456 22455 22442 22444 22447 22446 22443 22445 22458 22447 22444 22455 22459 22458 22445 22447 22449 22448 22446 22458 22462 22449 22447 22449 22466 22450 22448 22462 22467 22466 22449 22466 22472 22471 22450 24205 24211 22452 22451 24211 24216 22454 22452 22454 22457 22456 22453 24216 24220 22457 22454 22456 22460 22459 22455 22457 22461 22460 22456 24220 24224 22461 22457 22459 22463 22462 22458 22460 22464 22463 22459 22461 22465 22464 22460 24224 24227 22465 22461 22463 22468 22467 22462 22464 22469 22468 22463 22465 22470 22469 22464 24227 24229 22470 22465 22467 22473 22472 22466 22468 22474 22473 22467 22469 22475 22474 22468 22470 22476 22475 22469 24229 24230 22476 22470 22581 24340 24253 22477 24253 24259 22503 22477 22580 22581 22477 22478 22477 22503 22486 22478 22579 22580 22478 22479 22478 22486 22485 22479 22578 22579 22479 22480 22479 22485 22484 22480 22577 22578 22480 22481 22480 22484 22483 22481 22481 22582 22576 22577 22482 22582 22481 22483 22483 22488 22487 22482 22484 22489 22488 22483 22485 22490 22489 22484 22486 22504 22490 22485 22503 22505 22504 22486 22488 22492 22491 22487 22489 22493 22492 22488 22490 22494 22493 22489 22504 22506 22494 22490 22492 22496 22495 22491 22493 22497 22496 22492 22494 22508 22497 22493 22506 22509 22508 22494 22496 22499 22498 22495 22497 22511 22499 22496 22508 22512 22511 22497 22499 22501 22500 22498 22511 22515 22501 22499 22501 22519 22502 22500 22515 22520 22519 22501 22519 22525 22524 22502 24259 24264 22505 22503 22505 22507 22506 22504 24264 24269 22507 22505 22507 22510 22509 22506 24269 24273 22510 22507 22509 22513 22512 22508 22510 22514 22513 22509 24273 24276 22514 22510 22512 22516 22515 22511 22513 22517 22516 22512 22514 22518 22517 22513 24276 24279 22518 22514 22516 22521 22520 22515 22517 22522 22521 22516 22518 22523 22522 22517 24279 24281 22523 22518 22520 22526 22525 22519 22521 22527 22526 22520 22522 22528 22527 22521 22523 22529 22528 22522 24281 24306 22529 22523 22525 24206 24205 22524 22526 24207 24206 22525 22527 24208 24207 22526 22528 24209 24208 22527 22529 24210 24209 22528 24306 25916 24210 22529 22531 22537 22536 22530 22612 22637 22531 22530 22532 22538 22537 22531 22637 22638 22532 22531 22533 22539 22538 22532 22638 22639 22533 22532 22534 22540 22539 22533 22639 22640 22534 22533 22535 22541 22540 22534 22640 22641 22535 22534 22556 22557 22541 22535 22641 22642 22556 22535 22537 22543 22542 22536 22538 22544 22543 22537 22539 22545 22544 22538 22540 22546 22545 22539 22541 22558 22546 22540 22557 22559 22558 22541 22543 22548 22547 22542 22544 22549 22548 22543 22545 22550 22549 22544 22546 22560 22550 22545 22558 22561 22560 22546 22549 22552 22551 22548 22550 22563 22552 22549 22560 22564 22563 22550 22552 22554 22553 22551 22563 22567 22554 22552 22554 22571 22555 22553 22567 22572 22571 22554 22571 22577 22576 22555 24317 24322 22557 22556 22642 24413 24317 22556 24322 24327 22559 22557 22559 22562 22561 22558 24327 24331 22562 22559 22561 22565 22564 22560 22562 22566 22565 22561 24331 24334 22566 22562 22564 22568 22567 22563 22565 22569 22568 22564 22566 22570 22569 22565 24334 24337 22570 22566 22568 22573 22572 22567 22569 22574 22573 22568 22570 22575 22574 22569 24337 24339 22575 22570 22572 22578 22577 22571 22573 22579 22578 22572 22574 22580 22579 22573 22575 22581 22580 22574 24339 24340 22581 22575 22695 22696 22613 22583 22613 22614 22591 22583 22694 22695 22583 22584 22583 22591 22590 22584 22693 22694 22584 22585 22584 22590 22589 22585 22585 22699 22692 22693 22588 22699 22585 22589 22587 22593 22592 22586 22697 22698 22587 22586 22588 22594 22593 22587 22698 22699 22588 22587 22589 22595 22594 22588 22590 22596 22595 22589 22591 22615 22596 22590 22614 22616 22615 22591 22593 22598 22597 22592 22594 22599 22598 22593 22595 22600 22599 22594 22596 22617 22600 22595 22615 22618 22617 22596 22598 22602 22601 22597 22599 22603 22602 22598 22600 22604 22603 22599 22617 22620 22604 22600 22602 22606 22605 22601 22603 22607 22606 22602 22604 22623 22607 22603 22620 22624 22623 22604 22606 22609 22608 22605 22607 22627 22609 22606 22623 22628 22627 22607 22609 22611 22610 22608 22627 22632 22611 22609 22611 22637 22612 22610 22632 22638 22637 22611 24365 24370 22614 22613 22696 24466 24365 22613 24370 24375 22616 22614 22616 22619 22618 22615 24375 24379 22619 22616 22618 22621 22620 22617 22619 22622 22621 22618 24379 24382 22622 22619 22621 22625 22624 22620 22622 22626 22625 22621 24382 24385 22626 22622 22624 22629 22628 22623 22625 22630 22629 22624 22626 22631 22630 22625 24385 24387 22631 22626 22628 22633 22632 22627 22629 22634 22633 22628 22630 22635 22634 22629 22631 22636 22635 22630 24387 24388 22636 22631 22633 22639 22638 22632 22634 22640 22639 22633 22635 22641 22640 22634 22636 22642 22641 22635 24388 24413 22642 22636 22644 22650 22649 22643 22727 22747 22644 22643 22645 22651 22650 22644 22747 22748 22645 22644 22646 22652 22651 22645 22748 22749 22646 22645 22647 22653 22652 22646 22749 22750 22647 22646 22648 22670 22653 22647 22750 22751 22648 22647 24421 24427 22670 22648 24415 24421 22648 22751 22650 22655 22654 22649 22651 22656 22655 22650 22652 22657 22656 22651 22653 22671 22657 22652 22670 22672 22671 22653 22655 22659 22658 22654 22656 22660 22659 22655 22657 22661 22660 22656 22671 22674 22661 22657 22659 22663 22662 22658 22660 22664 22663 22659 22661 22677 22664 22660 22674 22678 22677 22661 22663 22666 22665 22662 22664 22681 22666 22663 22677 22682 22681 22664 22666 22668 22667 22665 22681 22686 22668 22666 22668 22691 22669 22667 22686 22692 22691 22668 22691 22698 22697 22669 22670 24427 22673 22672 22672 22675 22674 22671 22673 22676 22675 22672 24432 24435 22676 22673 24428 24432 22673 24427 22675 22679 22678 22674 22676 22680 22679 22675 24435 24438 22680 22676 22678 22683 22682 22677 22679 22684 22683 22678 22680 22685 22684 22679 24438 24440 22685 22680 22682 22687 22686 22681 22683 22688 22687 22682 22684 22689 22688 22683 22685 22690 22689 22684 24440 24441 22690 22685 22687 22693 22692 22686 22688 22694 22693 22687 22689 22695 22694 22688 22690 22696 22695 22689 24441 24466 22696 22690 22692 22699 22698 22691 22801 24560 24475 22700 24475 24481 22728 22700 22800 22801 22700 22701 22700 22728 22708 22701 22799 22800 22701 22702 22701 22708 22707 22702 22798 22799 22702 22703 22702 22707 22706 22703 22703 22803 22797 22798 22705 22803 22703 22706 22705 22710 22709 22704 22802 22803 22705 22704 22706 22711 22710 22705 22707 22712 22711 22706 22708 22713 22712 22707 22728 22729 22713 22708 22710 22715 22714 22709 22711 22716 22715 22710 22712 22717 22716 22711 22713 22730 22717 22712 22729 22731 22730 22713 22715 22719 22718 22714 22716 22720 22719 22715 22717 22732 22720 22716 22730 22733 22732 22717 22719 22722 22721 22718 22720 22723 22722 22719 22732 22735 22723 22720 22722 22725 22724 22721 22723 22738 22725 22722 22735 22739 22738 22723 22725 22742 22726 22724 22738 22743 22742 22725 22742 22747 22727 22726 24481 24486 22729 22728 24486 24490 22731 22729 22731 22734 22733 22730 24490 24494 22734 22731 22733 22736 22735 22732 22734 22737 22736 22733 24494 24497 22737 22734 22736 22740 22739 22735 22737 22741 22740 22736 24497 24499 22741 22737 22739 22744 22743 22738 22740 22745 22744 22739 22741 22746 22745 22740 24499 24501 22746 22741 22743 22748 22747 22742 22744 22749 22748 22743 22745 22750 22749 22744 22746 22751 22750 22745 22746 24501 24415 22751 22851 24621 24533 22752 24533 24539 22778 22752 22850 22851 22752 22753 22752 22778 22758 22753 22753 22855 22849 22850 22757 22855 22753 22758 22755 22760 22759 22754 22852 22853 22755 22754 22756 22761 22760 22755 22853 22854 22756 22755 22757 22762 22761 22756 22854 22855 22757 22756 22758 22763 22762 22757 22778 22779 22763 22758 22760 22765 22764 22759 22761 22766 22765 22760 22762 22767 22766 22761 22763 22780 22767 22762 22779 22781 22780 22763 22765 22769 22768 22764 22766 22770 22769 22765 22767 22782 22770 22766 22780 22783 22782 22767 22769 22772 22771 22768 22770 22773 22772 22769 22782 22785 22773 22770 22772 22775 22774 22771 22773 22788 22775 22772 22785 22789 22788 22773 22775 22792 22776 22774 22788 22793 22792 22775 22792 22797 22777 22776 22797 22803 22802 22777 24539 24544 22779 22778 24544 24548 22781 22779 22781 22784 22783 22780 24548 24552 22784 22781 22783 22786 22785 22782 22784 22787 22786 22783 24552 24555 22787 22784 22786 22790 22789 22785 22787 22791 22790 22786 24555 24557 22791 22787 22789 22794 22793 22788 22790 22795 22794 22789 22791 22796 22795 22790 24557 24559 22796 22791 22793 22798 22797 22792 22794 22799 22798 22793 22795 22800 22799 22794 22796 22801 22800 22795 24559 24560 22801 22796 22910 22911 22828 22804 22828 22829 22813 22804 22909 22910 22804 22805 22804 22813 22812 22805 22908 22909 22805 22806 22805 22812 22811 22806 22907 22908 22806 22807 22806 22811 22810 22807 22906 22907 22807 22808 22807 22810 22809 22808 22810 22815 22814 22809 22811 22816 22815 22810 22812 22817 22816 22811 22813 22830 22817 22812 22829 22831 22830 22813 22815 22819 22818 22814 22816 22820 22819 22815 22817 22832 22820 22816 22830 22833 22832 22817 22819 22822 22821 22818 22820 22823 22822 22819 22832 22835 22823 22820 22822 22825 22824 22821 22823 22838 22825 22822 22835 22839 22838 22823 22825 22842 22826 22824 22838 22843 22842 22825 22842 22847 22827 22826 22847 22853 22852 22827 24599 24604 22829 22828 24598 24599 22828 22911 24604 24608 22831 22829 22831 22834 22833 22830 24608 24612 22834 22831 22833 22836 22835 22832 22834 22837 22836 22833 24612 24615 22837 22834 22836 22840 22839 22835 22837 22841 22840 22836 24615 24618 22841 22837 22839 22844 22843 22838 22840 22845 22844 22839 22841 22846 22845 22840 24618 24620 22846 22841 22843 22848 22847 22842 22844 22849 22848 22843 22845 22850 22849 22844 22846 22851 22850 22845 24620 24621 22851 22846 22848 22854 22853 22847 22849 22855 22854 22848 22969 22970 22883 22856 22883 22884 22864 22856 22968 22969 22856 22857 22856 22864 22863 22857 22967 22968 22857 22858 22857 22863 22862 22858 22858 22972 22966 22967 22861 22972 22858 22862 22860 22866 22865 22859 22942 22971 22860 22859 22861 22867 22866 22860 22971 22972 22861 22860 22862 22868 22867 22861 22863 22869 22868 22862 22864 22885 22869 22863 22884 22886 22885 22864 22866 22871 22870 22865 22867 22872 22871 22866 22868 22873 22872 22867 22869 22887 22873 22868 22885 22888 22887 22869 22871 22875 22874 22870 22872 22876 22875 22871 22873 22877 22876 22872 22887 22890 22877 22873 22876 22879 22878 22875 22877 22893 22879 22876 22890 22894 22893 22877 22879 22881 22880 22878 22893 22897 22881 22879 22881 22901 22882 22880 22897 22902 22901 22881 22901 22907 22906 22882 24653 24658 22884 22883 22970 24752 24653 22883 24658 24662 22886 22884 22886 22889 22888 22885 24662 24666 22889 22886 22888 22891 22890 22887 22889 22892 22891 22888 24666 24669 22892 22889 22891 22895 22894 22890 22892 22896 22895 22891 24669 24672 22896 22892 22894 22898 22897 22893 22895 22899 22898 22894 22896 22900 22899 22895 24672 24674 22900 22896 22898 22903 22902 22897 22899 22904 22903 22898 22900 22905 22904 22899 24674 24675 22905 22900 22902 22908 22907 22901 22903 22909 22908 22902 22904 22910 22909 22903 22905 22911 22910 22904 22905 24675 24598 22911 23029 23030 22943 22912 22943 22944 22918 22912 22912 23034 23028 23029 22917 23034 22912 22918 22914 22920 22919 22913 23003 23031 22914 22913 22915 22921 22920 22914 23031 23032 22915 22914 22916 22922 22921 22915 23032 23033 22916 22915 22917 22923 22922 22916 23033 23034 22917 22916 22918 22945 22923 22917 22944 22946 22945 22918 22920 22925 22924 22919 22921 22926 22925 22920 22922 22927 22926 22921 22923 22928 22927 22922 22945 22947 22928 22923 22925 22930 22929 22924 22926 22931 22930 22925 22927 22932 22931 22926 22928 22949 22932 22927 22947 22950 22949 22928 22930 22934 22933 22929 22931 22935 22934 22930 22932 22952 22935 22931 22949 22953 22952 22932 22934 22937 22936 22933 22935 22938 22937 22934 22952 22956 22938 22935 22937 22940 22939 22936 22938 22960 22940 22937 22956 22961 22960 22938 22940 22965 22941 22939 22960 22966 22965 22940 22965 22971 22942 22941 24704 24709 22944 22943 23030 24803 24704 22943 24709 24714 22946 22944 22946 22948 22947 22945 24714 24718 22948 22946 22948 22951 22950 22947 24718 24721 22951 22948 22950 22954 22953 22949 22951 22955 22954 22950 24721 24724 22955 22951 22953 22957 22956 22952 22954 22958 22957 22953 22955 22959 22958 22954 24724 24726 22959 22955 22957 22962 22961 22956 22958 22963 22962 22957 22959 22964 22963 22958 24726 24727 22964 22959 22961 22967 22966 22960 22962 22968 22967 22961 22963 22969 22968 22962 22964 22970 22969 22963 24727 24752 22970 22964 22966 22972 22971 22965 23089 24854 24755 22973 24755 24760 23004 22973 22973 23094 23088 23089 22979 23094 22973 23004 22975 22981 22980 22974 23062 23090 22975 22974 22976 22982 22981 22975 23090 23091 22976 22975 22977 22983 22982 22976 23091 23092 22977 22976 22978 22984 22983 22977 23092 23093 22978 22977 22979 23005 22984 22978 23093 23094 22979 22978 23004 23006 23005 22979 22981 22986 22985 22980 22982 22987 22986 22981 22983 22988 22987 22982 22984 22989 22988 22983 23005 23007 22989 22984 22986 22991 22990 22985 22987 22992 22991 22986 22988 22993 22992 22987 22989 23009 22993 22988 23007 23010 23009 22989 22991 22995 22994 22990 22992 22996 22995 22991 22993 23012 22996 22992 23009 23013 23012 22993 22995 22998 22997 22994 22996 22999 22998 22995 23012 23016 22999 22996 22998 23001 23000 22997 22999 23020 23001 22998 23016 23021 23020 22999 23001 23025 23002 23000 23020 23026 23025 23001 23025 23031 23003 23002 24760 24765 23006 23004 23006 23008 23007 23005 24765 24769 23008 23006 23008 23011 23010 23007 24769 24772 23011 23008 23010 23014 23013 23009 23011 23015 23014 23010 24772 24775 23015 23011 23013 23017 23016 23012 23014 23018 23017 23013 23015 23019 23018 23014 24775 24777 23019 23015 23017 23022 23021 23016 23018 23023 23022 23017 23019 23024 23023 23018 24777 24778 23024 23019 23021 23027 23026 23020 23022 23028 23027 23021 23023 23029 23028 23022 23024 23030 23029 23023 24778 24803 23030 23024 23026 23032 23031 23025 23027 23033 23032 23026 23028 23034 23033 23027 23145 23146 23063 23035 23063 23065 23064 23035 23144 23145 23035 23036 23035 23064 23043 23036 23143 23144 23036 23037 23036 23043 23042 23037 23142 23143 23037 23038 23037 23042 23041 23038 23038 23148 23141 23142 23040 23148 23038 23041 23040 23045 23044 23039 23147 23148 23040 23039 23041 23046 23045 23040 23042 23047 23046 23041 23043 23048 23047 23042 23064 23066 23048 23043 23045 23050 23049 23044 23046 23051 23050 23045 23047 23052 23051 23046 23048 23068 23052 23047 23066 23069 23068 23048 23050 23054 23053 23049 23051 23055 23054 23050 23052 23071 23055 23051 23068 23072 23071 23052 23054 23057 23056 23053 23055 23058 23057 23054 23071 23075 23058 23055 23057 23060 23059 23056 23058 23079 23060 23057 23075 23080 23079 23058 23060 23084 23061 23059 23079 23085 23084 23060 23084 23090 23062 23061 24811 24816 23065 23063 24810 24811 23063 23146 23065 23067 23066 23064 24816 24820 23067 23065 23067 23070 23069 23066 24820 24823 23070 23067 23069 23073 23072 23068 23070 23074 23073 23069 24823 24826 23074 23070 23072 23076 23075 23071 23073 23077 23076 23072 23074 23078 23077 23073 24826 24828 23078 23074 23076 23081 23080 23075 23077 23082 23081 23076 23078 23083 23082 23077 24828 24829 23083 23078 23080 23086 23085 23079 23081 23087 23086 23080 23082 23088 23087 23081 23083 23089 23088 23082 24829 24854 23089 23083 23085 23091 23090 23084 23086 23092 23091 23085 23087 23093 23092 23086 23088 23094 23093 23087 23200 24948 24862 23095 24862 24868 23124 23095 23199 23200 23095 23096 23095 23124 23102 23096 23198 23199 23096 23097 23096 23102 23101 23097 23097 23203 23197 23198 23100 23203 23097 23101 23099 23104 23103 23098 23201 23202 23099 23098 23100 23105 23104 23099 23202 23203 23100 23099 23101 23106 23105 23100 23102 23107 23106 23101 23124 23125 23107 23102 23104 23109 23108 23103 23105 23110 23109 23104 23106 23111 23110 23105 23107 23126 23111 23106 23125 23127 23126 23107 23109 23113 23112 23108 23110 23114 23113 23109 23111 23115 23114 23110 23126 23128 23115 23111 23113 23117 23116 23112 23114 23118 23117 23113 23115 23130 23118 23114 23128 23131 23130 23115 23117 23120 23119 23116 23118 23133 23120 23117 23130 23134 23133 23118 23120 23122 23121 23119 23133 23137 23122 23120 23122 23141 23123 23121 23137 23142 23141 23122 23141 23148 23147 23123 24868 24873 23125 23124 24873 24877 23127 23125 23127 23129 23128 23126 24877 24881 23129 23127 23129 23132 23131 23128 24881 24884 23132 23129 23131 23135 23134 23130 23132 23136 23135 23131 24884 24887 23136 23132 23134 23138 23137 23133 23135 23139 23138 23134 23136 23140 23139 23135 24887 24889 23140 23136 23138 23143 23142 23137 23139 23144 23143 23138 23140 23145 23144 23139 23140 24889 23146 23145 24889 24913 24810 23146 23258 23259 23177 23149 23177 23178 23155 23149 23149 23263 23257 23258 23154 23263 23149 23155 23151 23157 23156 23150 23232 23260 23151 23150 23152 23158 23157 23151 23260 23261 23152 23151 23153 23159 23158 23152 23261 23262 23153 23152 23154 23160 23159 23153 23262 23263 23154 23153 23155 23179 23160 23154 23178 23180 23179 23155 23157 23162 23161 23156 23158 23163 23162 23157 23159 23164 23163 23158 23160 23181 23164 23159 23179 23182 23181 23160 23162 23166 23165 23161 23163 23167 23166 23162 23164 23168 23167 23163 23181 23183 23168 23164 23166 23170 23169 23165 23167 23171 23170 23166 23168 23185 23171 23167 23183 23186 23185 23168 23170 23173 23172 23169 23171 23188 23173 23170 23185 23189 23188 23171 23173 23175 23174 23172 23188 23192 23175 23173 23175 23196 23176 23174 23192 23197 23196 23175 23196 23202 23201 23176 24922 24927 23178 23177 23259 25027 24922 23177 24927 24931 23180 23178 23180 24935 23182 23179 24931 24936 24935 23180 23182 23184 23183 23181 24935 24939 23184 23182 23184 23187 23186 23183 24939 24942 23187 23184 23186 23190 23189 23185 23187 23191 23190 23186 24942 24945 23191 23187 23189 23193 23192 23188 23190 23194 23193 23189 23191 23195 23194 23190 24945 24947 23195 23191 23193 23198 23197 23192 23194 23199 23198 23193 23195 23200 23199 23194 24947 24948 23200 23195 23197 23203 23202 23196 23318 23319 23233 23204 23233 23235 23234 23204 23317 23318 23204 23205 23204 23234 23213 23205 23316 23317 23205 23206 23205 23213 23212 23206 23315 23316 23206 23207 23206 23212 23211 23207 23314 23315 23207 23208 23207 23211 23210 23208 23208 23320 23291 23314 23209 23320 23208 23210 23210 23215 23214 23209 23211 23216 23215 23210 23212 23217 23216 23211 23213 23218 23217 23212 23234 23236 23218 23213 23215 23220 23219 23214 23216 23221 23220 23215 23217 23222 23221 23216 23218 23238 23222 23217 23236 23239 23238 23218 23220 23224 23223 23219 23221 23225 23224 23220 23222 23241 23225 23221 23238 23242 23241 23222 23224 23227 23226 23223 23225 23228 23227 23224 23241 23245 23228 23225 23227 23230 23229 23226 23228 23249 23230 23227 23245 23250 23249 23228 23230 23254 23231 23229 23249 23255 23254 23230 23254 23260 23232 23231 24984 24989 23235 23233 24983 24984 23233 23319 23235 23237 23236 23234 24989 24993 23237 23235 23237 23240 23239 23236 24993 24996 23240 23237 23239 23243 23242 23238 23240 23244 23243 23239 24996 24999 23244 23240 23242 23246 23245 23241 23243 23247 23246 23242 23244 23248 23247 23243 24999 25001 23248 23244 23246 23251 23250 23245 23247 23252 23251 23246 23248 23253 23252 23247 25001 25002 23253 23248 23250 23256 23255 23249 23251 23257 23256 23250 23252 23258 23257 23251 23253 23259 23258 23252 25002 25027 23259 23253 23255 23261 23260 23254 23256 23262 23261 23255 23257 23263 23262 23256 23365 25135 25034 23264 25034 25039 23292 23264 23364 23365 23264 23265 23264 23292 23271 23265 23363 23364 23265 23266 23265 23271 23270 23266 23266 23368 23362 23363 23269 23368 23266 23270 23268 23273 23272 23267 23366 23367 23268 23267 23269 23274 23273 23268 23367 23368 23269 23268 23270 23275 23274 23269 23271 23293 23275 23270 23292 23294 23293 23271 23273 23277 23276 23272 23274 23278 23277 23273 23275 23279 23278 23274 23293 23295 23279 23275 23277 23282 23281 23276 23278 23283 23282 23277 23279 23297 23283 23278 23295 23298 23297 23279 23281 23285 23284 23280 23282 23286 23285 23281 23283 23300 23286 23282 23297 23301 23300 23283 23285 23288 23287 23284 23286 23304 23288 23285 23300 23305 23304 23286 23288 23290 23289 23287 23304 23309 23290 23288 23290 23314 23291 23289 23309 23315 23314 23290 25039 25043 23294 23292 23294 23296 23295 23293 25043 25047 23296 23294 23296 23299 23298 23295 25047 25050 23299 23296 23298 23302 23301 23297 23299 23303 23302 23298 25050 25052 23303 23299 23301 23306 23305 23300 23302 23307 23306 23301 23303 23308 23307 23302 25052 25054 23308 23303 23305 23310 23309 23304 23306 23311 23310 23305 23307 23312 23311 23306 23308 23313 23312 23307 25054 25076 23313 23308 23310 23316 23315 23309 23311 23317 23316 23310 23312 23318 23317 23311 23313 23319 23318 23312 23313 25076 24983 23319 23412 25087 23321 23411 25087 25092 23346 23321 23410 23411 23321 23322 23321 23346 23328 23322 23409 23410 23322 23323 23322 23328 23327 23323 23323 23414 23408 23409 23326 23414 23323 23327 23325 23330 23329 23324 23393 23413 23325 23324 23326 23331 23330 23325 23413 23414 23326 23325 23327 23332 23331 23326 23328 23333 23332 23327 23346 23347 23333 23328 23330 23335 23334 23329 23331 23336 23335 23330 23332 23337 23336 23331 23333 23348 23337 23332 23347 23349 23348 23333 23335 23339 23338 23334 23336 23340 23339 23335 23337 23350 23340 23336 23348 23351 23350 23337 23339 23342 23341 23338 23340 23353 23342 23339 23350 23354 23353 23340 23342 23344 23343 23341 23353 23357 23344 23342 23344 23361 23345 23343 23357 23362 23361 23344 23361 23367 23366 23345 25092 25097 23347 23346 25097 25101 23349 23347 23349 23352 23351 23348 25101 25104 23352 23349 23351 23355 23354 23350 23352 23356 23355 23351 25104 25106 23356 23352 23354 23358 23357 23353 23355 23359 23358 23354 23356 23360 23359 23355 25106 25108 23360 23356 23358 23363 23362 23357 23359 23364 23363 23358 23360 23365 23364 23359 25108 25135 23365 23360 23362 23368 23367 23361 23459 25193 25137 23369 25137 25143 23394 23369 23458 23459 23369 23370 23369 23394 23378 23370 23457 23458 23370 23371 23370 23378 23377 23371 23456 23457 23371 23372 23371 23377 23376 23372 23455 23456 23372 23373 23372 23376 23375 23373 23373 23460 23440 23455 23374 23460 23373 23375 23375 23380 23379 23374 23376 23381 23380 23375 23377 23382 23381 23376 23378 23395 23382 23377 23394 23396 23395 23378 23380 23384 23383 23379 23381 23385 23384 23380 23382 23397 23385 23381 23395 23398 23397 23382 23384 23387 23386 23383 23385 23400 23387 23384 23397 23401 23400 23385 23387 23390 23389 23386 23400 23404 23390 23387 23389 23392 23391 23388 23390 23408 23392 23389 23404 23409 23408 23390 23392 23413 23393 23391 23408 23414 23413 23392 25143 25148 23396 23394 23396 23399 23398 23395 25148 25152 23399 23396 23398 23402 23401 23397 23399 23403 23402 23398 25152 25155 23403 23399 23401 23405 23404 23400 23402 23406 23405 23401 23403 23407 23406 23402 25155 25157 23407 23403 23405 23410 23409 23404 23406 23411 23410 23405 23407 23412 23411 23406 25157 25172 23412 23407 23412 25172 25088 25087 23416 23422 23421 23415 23503 23504 23416 23415 23417 23423 23422 23416 23504 23505 23417 23416 23418 23424 23423 23417 23505 23506 23418 23417 23419 23425 23424 23418 23506 23507 23419 23418 23419 23509 23441 23425 23508 23509 23419 23507 23421 23427 23426 23420 23422 23428 23427 23421 23423 23429 23428 23422 23424 23430 23429 23423 23425 23442 23430 23424 23441 23443 23442 23425 23427 23432 23431 23426 23428 23433 23432 23427 23429 23434 23433 23428 23430 23444 23434 23429 23442 23445 23444 23430 23432 23436 23435 23431 23433 23437 23436 23432 23434 23447 23437 23433 23444 23448 23447 23434 23436 23439 23438 23435 23437 23451 23439 23436 23447 23452 23451 23437 23439 23455 23440 23438 23451 23456 23455 23439 25173 25177 23443 23441 23509 25257 25173 23441 23443 23446 23445 23442 25177 25183 23446 23443 23445 23449 23448 23444 23446 23450 23449 23445 25183 25187 23450 23446 23448 23453 23452 23447 23449 23454 23453 23448 23450 25190 23454 23449 25187 25191 25190 23450 23452 23457 23456 23451 23453 23458 23457 23452 23454 23459 23458 23453 25190 25193 23459 23454 23462 23468 23467 23461 23560 23561 23462 23461 23463 23469 23468 23462 23561 23562 23463 23462 23464 23470 23469 23463 23562 23563 23464 23463 23465 23471 23470 23464 23563 23564 23465 23464 23466 23472 23471 23465 23564 23565 23466 23465 23466 25311 25209 23472 23566 25311 23466 23565 23468 23474 23473 23467 23469 23475 23474 23468 23470 23476 23475 23469 23471 23477 23476 23470 23472 23488 23477 23471 25209 25216 23488 23472 23474 23479 23478 23473 23475 23480 23479 23474 23476 23481 23480 23475 23477 23489 23481 23476 23488 23490 23489 23477 23479 23483 23482 23478 23480 23484 23483 23479 23481 23491 23484 23480 23489 23492 23491 23481 23483 23486 23485 23482 23484 23494 23486 23483 23491 23495 23494 23484 23486 23498 23487 23485 23494 23499 23498 23486 23498 23504 23503 23487 25216 25222 23490 23488 23490 23493 23492 23489 25222 25227 23493 23490 23492 23496 23495 23491 23493 23497 23496 23492 25227 25231 23497 23493 23495 23500 23499 23494 23496 23501 23500 23495 23497 23502 23501 23496 25231 25234 23502 23497 23499 23505 23504 23498 23500 23506 23505 23499 23501 23507 23506 23500 23502 23508 23507 23501 25234 25236 23508 23502 25236 25257 23509 23508 23510 23623 23512 23511 23617 23623 23510 23598 23512 23518 23517 23511 23513 23519 23518 23512 23623 23624 23513 23512 23514 23520 23519 23513 23624 23625 23514 23513 23515 23521 23520 23514 23625 23626 23515 23514 23516 23538 23521 23515 23626 23627 23516 23515 23537 23539 23538 23516 23627 23628 23537 23516 23518 23523 23522 23517 23519 23524 23523 23518 23520 23525 23524 23519 23521 23526 23525 23520 23538 23540 23526 23521 23523 23528 23527 23522 23524 23529 23528 23523 23525 23530 23529 23524 23526 23542 23530 23525 23540 23543 23542 23526 23528 23532 23531 23527 23529 23533 23532 23528 23530 23545 23533 23529 23542 23546 23545 23530 23532 23535 23534 23531 23533 23549 23535 23532 23545 23550 23549 23533 23535 23554 23536 23534 23549 23555 23554 23535 23554 23561 23560 23536 25265 25269 23539 23537 23628 25362 25265 23537 23539 23541 23540 23538 25269 25274 23541 23539 23541 23544 23543 23540 25274 25279 23544 23541 23543 23547 23546 23542 23544 23548 23547 23543 25279 25283 23548 23544 23546 23551 23550 23545 23547 23552 23551 23546 23548 23553 23552 23547 25283 25286 23553 23548 23550 23556 23555 23549 23551 23557 23556 23550 23552 23558 23557 23551 23553 23559 23558 23552 25286 25288 23559 23553 23555 23562 23561 23554 23556 23563 23562 23555 23557 23564 23563 23556 23558 23565 23564 23557 23559 23566 23565 23558 25288 25305 23566 23559 25305 25312 25311 23566 23568 23575 23574 23567 23661 23684 23568 23567 23569 23576 23575 23568 23684 23685 23569 23568 23570 23577 23576 23569 23685 23686 23570 23569 23571 23578 23577 23570 23686 23687 23571 23570 23572 23579 23578 23571 23687 23688 23572 23571 23573 23599 23579 23572 23688 23689 23573 23572 25318 25320 23599 23573 23689 25395 25318 23573 23575 23581 23580 23574 23576 23582 23581 23575 23577 23583 23582 23576 23578 23584 23583 23577 23579 23600 23584 23578 23599 23601 23600 23579 23581 23586 23585 23580 23582 23587 23586 23581 23583 23588 23587 23582 23584 23602 23588 23583 23600 23603 23602 23584 23586 23590 23589 23585 23587 23591 23590 23586 23588 23592 23591 23587 23602 23605 23592 23588 23590 23594 23593 23589 23591 23595 23594 23590 23592 23608 23595 23591 23605 23609 23608 23592 23594 23597 23596 23593 23595 23612 23597 23594 23608 23613 23612 23595 23597 23617 23598 23596 23612 23618 23617 23597 25320 25326 23601 23599 23601 23604 23603 23600 25326 25331 23604 23601 23603 23606 23605 23602 23604 23607 23606 23603 25331 25335 23607 23604 23606 23610 23609 23605 23607 23611 23610 23606 25335 25338 23611 23607 23609 23614 23613 23608 23610 23615 23614 23609 23611 23616 23615 23610 25338 25341 23616 23611 23613 23619 23618 23612 23614 23620 23619 23613 23615 23621 23620 23614 23616 23622 23621 23615 25341 25343 23622 23616 23618 23624 23623 23617 23619 23625 23624 23618 23620 23626 23625 23619 23621 23627 23626 23620 23622 23628 23627 23621 25343 25362 23628 23622 23630 23635 23634 23629 23721 23742 23630 23629 23631 23636 23635 23630 23742 23743 23631 23630 23632 23637 23636 23631 23743 23744 23632 23631 23633 23638 23637 23632 23744 23745 23633 23632 23633 23748 23639 23638 23746 23748 23633 23745 23635 23641 23640 23634 23636 23642 23641 23635 23637 23643 23642 23636 23638 23644 23643 23637 23639 23663 23644 23638 23662 23664 23663 23639 23748 23749 23662 23639 23641 23646 23645 23640 23642 23647 23646 23641 23643 23648 23647 23642 23644 23649 23648 23643 23663 23665 23649 23644 23646 23651 23650 23645 23647 23652 23651 23646 23648 23653 23652 23647 23649 23667 23653 23648 23665 23668 23667 23649 23651 23655 23654 23650 23652 23656 23655 23651 23653 23670 23656 23652 23667 23671 23670 23653 23655 23658 23657 23654 23656 23674 23658 23655 23670 23675 23674 23656 23658 23660 23659 23657 23674 23679 23660 23658 23660 23684 23661 23659 23679 23685 23684 23660 25370 25376 23664 23662 23749 25470 25370 23662 23664 23666 23665 23663 25376 25381 23666 23664 23666 23669 23668 23665 25381 25385 23669 23666 23668 23672 23671 23667 23669 23673 23672 23668 25385 25389 23673 23669 23671 23676 23675 23670 23672 23677 23676 23671 23673 23678 23677 23672 25389 25392 23678 23673 23675 23680 23679 23674 23676 23681 23680 23675 23677 23682 23681 23676 23678 23683 23682 23677 25392 25394 23683 23678 23680 23686 23685 23679 23681 23687 23686 23680 23682 23688 23687 23681 23683 23689 23688 23682 25394 25395 23689 23683 23691 23693 23692 23690 23779 23800 23691 23690 23691 23806 23694 23693 23801 23806 23691 23800 23693 23699 23698 23692 23694 23700 23699 23693 23695 23701 23700 23694 23806 23807 23695 23694 23696 23702 23701 23695 23807 23808 23696 23695 23697 23703 23702 23696 23808 23809 23697 23696 23722 23723 23703 23697 23809 23810 23722 23697 23699 23705 23704 23698 23700 23706 23705 23699 23701 23707 23706 23700 23702 23708 23707 23701 23703 23724 23708 23702 23723 23725 23724 23703 23705 23710 23709 23704 23706 23711 23710 23705 23707 23712 23711 23706 23708 23726 23712 23707 23724 23727 23726 23708 23710 23714 23713 23709 23711 23715 23714 23710 23712 23729 23715 23711 23726 23730 23729 23712 23714 23717 23716 23713 23715 23718 23717 23714 23729 23733 23718 23715 23717 23720 23719 23716 23718 23737 23720 23717 23733 23738 23737 23718 23720 23742 23721 23719 23737 23743 23742 23720 25422 25428 23723 23722 23810 25522 25422 23722 25428 25433 23725 23723 23725 23728 23727 23724 25433 25438 23728 23725 23727 23731 23730 23726 23728 23732 23731 23727 25438 25442 23732 23728 23730 23734 23733 23729 23731 23735 23734 23730 23732 23736 23735 23731 25442 25445 23736 23732 23734 23739 23738 23733 23735 23740 23739 23734 23736 23741 23740 23735 25445 25447 23741 23736 23738 23744 23743 23737 23739 23745 23744 23738 23740 23746 23745 23739 23741 23747 23746 23740 25447 25449 23747 23741 23747 23749 23748 23746 25449 25470 23749 23747 23751 23757 23756 23750 23867 23868 23751 23750 23752 23758 23757 23751 23868 23869 23752 23751 23753 23759 23758 23752 23869 23870 23753 23752 23754 23760 23759 23753 23870 23871 23754 23753 23755 23761 23760 23754 23871 23872 23755 23754 23780 23781 23761 23755 23872 23873 23780 23755 23757 23763 23762 23756 23758 23764 23763 23757 23759 23765 23764 23758 23760 23766 23765 23759 23761 23782 23766 23760 23781 23783 23782 23761 23763 23768 23767 23762 23764 23769 23768 23763 23765 23770 23769 23764 23766 23784 23770 23765 23782 23785 23784 23766 23768 23772 23771 23767 23769 23773 23772 23768 23770 23787 23773 23769 23784 23788 23787 23770 23772 23775 23774 23771 23773 23776 23775 23772 23787 23791 23776 23773 23775 23778 23777 23774 23776 23795 23778 23775 23791 23796 23795 23776 23778 23800 23779 23777 23795 23801 23800 23778 25476 25480 23781 23780 23873 25571 25476 23780 25480 25486 23783 23781 23783 23786 23785 23782 25486 25491 23786 23783 23785 23789 23788 23784 23786 23790 23789 23785 25491 25495 23790 23786 23788 23792 23791 23787 23789 23793 23792 23788 23790 23794 23793 23789 25495 25498 23794 23790 23792 23797 23796 23791 23793 23798 23797 23792 23794 23799 23798 23793 25498 25500 23799 23794 23796 23802 23801 23795 23797 23803 23802 23796 23798 23804 23803 23797 23799 23805 23804 23798 25500 25502 23805 23799 23802 23807 23806 23801 23803 23808 23807 23802 23804 23809 23808 23803 23805 23810 23809 23804 25502 25522 23810 23805 23812 23819 23818 23811 23903 23924 23812 23811 23813 23820 23819 23812 23924 23925 23813 23812 23814 23821 23820 23813 23925 23926 23814 23813 23815 23822 23821 23814 23926 23927 23815 23814 23816 23823 23822 23815 23927 23928 23816 23815 23817 23842 23823 23816 23928 23929 23817 23816 25528 25529 23842 23817 23929 25625 25528 23817 23819 23825 23824 23818 23820 23826 23825 23819 23821 23827 23826 23820 23822 23828 23827 23821 23823 23843 23828 23822 23842 23844 23843 23823 23825 23830 23829 23824 23826 23831 23830 23825 23827 23832 23831 23826 23828 23845 23832 23827 23843 23846 23845 23828 23830 23834 23833 23829 23831 23835 23834 23830 23832 23848 23835 23831 23845 23849 23848 23832 23834 23837 23836 23833 23835 23838 23837 23834 23848 23852 23838 23835 23837 23840 23839 23836 23838 23856 23840 23837 23852 23857 23856 23838 23840 23861 23841 23839 23856 23862 23861 23840 23861 23868 23867 23841 25529 25535 23844 23842 23844 23847 23846 23843 25535 25540 23847 23844 23846 23850 23849 23845 23847 23851 23850 23846 25540 25544 23851 23847 23849 23853 23852 23848 23850 23854 23853 23849 23851 23855 23854 23850 25544 25547 23855 23851 23853 23858 23857 23852 23854 23859 23858 23853 23855 23860 23859 23854 25547 25550 23860 23855 23857 23863 23862 23856 23858 23864 23863 23857 23859 23865 23864 23858 23860 23866 23865 23859 25550 25552 23866 23860 23862 23869 23868 23861 23863 23870 23869 23862 23864 23871 23870 23863 23865 23872 23871 23864 23866 23873 23872 23865 25552 25571 23873 23866 23875 23879 23878 23874 23955 23973 23875 23874 23876 23880 23879 23875 23973 23974 23876 23875 23877 23881 23880 23876 23974 23975 23877 23876 23877 23978 23882 23881 23976 23978 23877 23975 23879 23885 23884 23878 23880 23886 23885 23879 23881 23887 23886 23880 23882 23888 23887 23881 23883 23904 23888 23882 23978 23979 23883 23882 25579 25586 23904 23883 23979 25668 25579 23883 23885 23890 23889 23884 23886 23891 23890 23885 23887 23892 23891 23886 23888 23905 23892 23887 23904 23906 23905 23888 23890 23894 23893 23889 23891 23895 23894 23890 23892 23896 23895 23891 23905 23907 23896 23892 23894 23898 23897 23893 23895 23899 23898 23894 23896 23909 23899 23895 23907 23910 23909 23896 23898 23901 23900 23897 23899 23913 23901 23898 23909 23914 23913 23899 23901 23918 23902 23900 23913 23919 23918 23901 23918 23924 23903 23902 25586 25592 23906 23904 23906 23908 23907 23905 25592 25597 23908 23906 23908 23911 23910 23907 23908 25597 23912 23911 23910 23915 23914 23909 23911 23916 23915 23910 23912 23917 23916 23911 25601 25604 23917 23912 25598 25601 23912 25597 23914 23920 23919 23913 23915 23921 23920 23914 23916 23922 23921 23915 23917 23923 23922 23916 25604 25606 23923 23917 23919 23925 23924 23918 23920 23926 23925 23919 23921 23927 23926 23920 23922 23928 23927 23921 23923 23929 23928 23922 25606 25625 23929 23923 23931 23937 23936 23930 24028 24029 23931 23930 23932 23938 23937 23931 24029 24030 23932 23931 23933 23939 23938 23932 24030 24031 23933 23932 23934 23940 23939 23933 24031 24032 23934 23933 23935 23956 23940 23934 24032 24033 23935 23934 25636 25643 23956 23935 24033 25727 25636 23935 23937 23942 23941 23936 23938 23943 23942 23937 23939 23944 23943 23938 23940 23957 23944 23939 23956 23958 23957 23940 23942 23946 23945 23941 23943 23947 23946 23942 23944 23948 23947 23943 23957 23959 23948 23944 23946 23950 23949 23945 23947 23951 23950 23946 23948 23961 23951 23947 23959 23962 23961 23948 23950 23953 23952 23949 23951 23964 23953 23950 23961 23965 23964 23951 23953 23968 23954 23952 23964 23969 23968 23953 23968 23973 23955 23954 25643 25649 23958 23956 23958 23960 23959 23957 25649 25654 23960 23958 23960 23963 23962 23959 25654 25658 23963 23960 23962 23966 23965 23961 23963 23967 23966 23962 25658 25662 23967 23963 23965 23970 23969 23964 23966 23971 23970 23965 23967 23972 23971 23966 25662 25665 23972 23967 23969 23974 23973 23968 23970 23975 23974 23969 23971 23976 23975 23970 23972 23977 23976 23971 25665 25667 23977 23972 23977 23979 23978 23976 25667 25668 23979 23977 23981 23987 23986 23980 24080 24081 23981 23980 23982 23988 23987 23981 24081 24082 23982 23981 23983 23989 23988 23982 24082 24083 23983 23982 23984 23990 23989 23983 24083 24084 23984 23983 23985 24006 23990 23984 24084 24085 23985 23984 25699 25702 24006 23985 24085 25781 25699 23985 23987 23992 23991 23986 23988 23993 23992 23987 23989 23994 23993 23988 23990 24007 23994 23989 24006 24008 24007 23990 23992 23996 23995 23991 23993 23997 23996 23992 23994 23998 23997 23993 24007 24009 23998 23994 23996 24000 23999 23995 23997 24001 24000 23996 23998 24011 24001 23997 24009 24012 24011 23998 24000 24003 24002 23999 24001 24014 24003 24000 24011 24015 24014 24001 24003 24018 24004 24002 24014 24019 24018 24003 24018 24023 24005 24004 24023 24029 24028 24005 25702 25708 24008 24006 24008 24010 24009 24007 25708 25713 24010 24008 24010 24013 24012 24009 25713 25717 24013 24010 24012 24016 24015 24011 24013 24017 24016 24012 25717 25721 24017 24013 24015 24020 24019 24014 24016 24021 24020 24015 24017 24022 24021 24016 25721 25724 24022 24017 24019 24024 24023 24018 24020 24025 24024 24019 24021 24026 24025 24020 24022 24027 24026 24021 25724 25726 24027 24022 24024 24030 24029 24023 24025 24031 24030 24024 24026 24032 24031 24025 24027 24033 24032 24026 25726 25727 24033 24027 24035 24038 24037 24034 24115 24136 24035 24034 24036 24039 24038 24035 24136 24137 24036 24035 24036 24142 24040 24039 24138 24142 24036 24137 24039 24044 24043 24038 24040 24045 24044 24039 24041 24046 24045 24040 24142 24143 24041 24040 24042 24059 24046 24041 24143 24144 24042 24041 24058 24060 24059 24042 24144 24145 24058 24042 24044 24048 24047 24043 24045 24049 24048 24044 24046 24050 24049 24045 24059 24061 24050 24046 24048 24052 24051 24047 24049 24053 24052 24048 24050 24063 24053 24049 24061 24064 24063 24050 24052 24055 24054 24051 24053 24066 24055 24052 24063 24067 24066 24053 24055 24070 24056 24054 24066 24071 24070 24055 24070 24075 24057 24056 24075 24081 24080 24057 25756 25762 24060 24058 24145 25855 25756 24058 24060 24062 24061 24059 25762 25767 24062 24060 24062 24065 24064 24061 25767 25771 24065 24062 24064 24068 24067 24063 24065 24069 24068 24064 25771 25775 24069 24065 24067 24072 24071 24066 24068 24073 24072 24067 24069 24074 24073 24068 25775 25778 24074 24069 24071 24076 24075 24070 24072 24077 24076 24071 24073 24078 24077 24072 24074 24079 24078 24073 25778 25780 24079 24074 24076 24082 24081 24075 24077 24083 24082 24076 24078 24084 24083 24077 24079 24085 24084 24078 25780 25781 24085 24079 24087 24093 24092 24086 24198 24199 24087 24086 24088 24094 24093 24087 24199 24200 24088 24087 24089 24095 24094 24088 24200 24201 24089 24088 24090 24096 24095 24089 24201 24202 24090 24089 24091 24097 24096 24090 24202 24203 24091 24090 24116 24117 24097 24091 24203 24204 24116 24091 24093 24099 24098 24092 24094 24100 24099 24093 24095 24101 24100 24094 24096 24102 24101 24095 24097 24118 24102 24096 24117 24119 24118 24097 24099 24104 24103 24098 24100 24105 24104 24099 24101 24106 24105 24100 24102 24120 24106 24101 24118 24121 24120 24102 24104 24108 24107 24103 24105 24109 24108 24104 24106 24123 24109 24105 24120 24124 24123 24106 24108 24111 24110 24107 24109 24112 24111 24108 24123 24127 24112 24109 24111 24114 24113 24110 24112 24131 24114 24111 24127 24132 24131 24112 24114 24136 24115 24113 24131 24137 24136 24114 25807 25813 24117 24116 24204 25910 25807 24116 25813 25818 24119 24117 24119 24122 24121 24118 25818 25822 24122 24119 24121 24125 24124 24120 24122 24126 24125 24121 25822 25826 24126 24122 24124 24128 24127 24123 24125 24129 24128 24124 24126 24130 24129 24125 25826 25829 24130 24126 24128 24133 24132 24127 24129 24134 24133 24128 24130 24135 24134 24129 25829 25831 24135 24130 24132 24138 24137 24131 24133 24139 24138 24132 24134 24140 24139 24133 24135 24141 24140 24134 25831 25832 24141 24135 24139 24143 24142 24138 24140 24144 24143 24139 24141 24145 24144 24140 25832 25855 24145 24141 24147 24153 24152 24146 24230 24248 24147 24146 24148 24154 24153 24147 24248 24249 24148 24147 24149 24155 24154 24148 24249 24250 24149 24148 24150 24156 24155 24149 24250 24251 24150 24149 24151 24157 24156 24150 24251 24252 24151 24150 25861 25865 24157 24151 24252 25944 25861 24151 24153 24159 24158 24152 24154 24160 24159 24153 24155 24161 24160 24154 24156 24162 24161 24155 24157 24176 24162 24156 25865 25871 24176 24157 24159 24164 24163 24158 24160 24165 24164 24159 24161 24166 24165 24160 24162 24177 24166 24161 24176 24178 24177 24162 24164 24168 24167 24163 24165 24169 24168 24164 24166 24179 24169 24165 24177 24180 24179 24166 24168 24171 24170 24167 24169 24172 24171 24168 24179 24183 24172 24169 24171 24174 24173 24170 24172 24187 24174 24171 24183 24188 24187 24172 24174 24192 24175 24173 24187 24193 24192 24174 24192 24199 24198 24175 25871 25876 24178 24176 24178 24181 24180 24177 24178 25876 24182 24181 24180 24184 24183 24179 24181 24185 24184 24180 24182 24186 24185 24181 25881 25884 24186 24182 25877 25881 24182 25876 24184 24189 24188 24183 24185 24190 24189 24184 24186 24191 24190 24185 25884 25886 24191 24186 24188 24194 24193 24187 24189 24195 24194 24188 24190 24196 24195 24189 24191 24197 24196 24190 25886 25887 24197 24191 24193 24200 24199 24192 24194 24201 24200 24193 24195 24202 24201 24194 24196 24203 24202 24195 24197 24204 24203 24196 25887 25910 24204 24197 24206 24212 24211 24205 24207 24213 24212 24206 24208 24214 24213 24207 24209 24215 24214 24208 24210 24231 24215 24209 25916 25922 24231 24210 24212 24217 24216 24211 24213 24218 24217 24212 24214 24219 24218 24213 24215 24232 24219 24214 24231 24233 24232 24215 24217 24221 24220 24216 24218 24222 24221 24217 24219 24223 24222 24218 24232 24234 24223 24219 24221 24225 24224 24220 24222 24226 24225 24221 24223 24236 24226 24222 24234 24237 24236 24223 24225 24228 24227 24224 24226 24239 24228 24225 24236 24240 24239 24226 24228 24243 24229 24227 24239 24244 24243 24228 24243 24248 24230 24229 25922 25927 24233 24231 24233 24235 24234 24232 25927 25932 24235 24233 24235 24238 24237 24234 25932 25936 24238 24235 24237 24241 24240 24236 24238 24242 24241 24237 25936 25939 24242 24238 24240 24245 24244 24239 24241 24246 24245 24240 24242 24247 24246 24241 25939 25942 24247 24242 24244 24249 24248 24243 24245 24250 24249 24244 24246 24251 24250 24245 24247 24252 24251 24246 25942 25944 24252 24247 24254 24260 24259 24253 24340 24360 24254 24253 24255 24261 24260 24254 24360 24361 24255 24254 24256 24262 24261 24255 24361 24362 24256 24255 24257 24263 24262 24256 24362 24363 24257 24256 24258 24282 24263 24257 24363 24364 24258 24257 25975 25981 24282 24258 24364 26063 25975 24258 24260 24265 24264 24259 24261 24266 24265 24260 24262 24267 24266 24261 24263 24268 24267 24262 24282 24283 24268 24263 24265 24270 24269 24264 24266 24271 24270 24265 24267 24272 24271 24266 24268 24284 24272 24267 24283 24285 24284 24268 24270 24274 24273 24269 24271 24275 24274 24270 24272 24287 24275 24271 24284 24288 24287 24272 24274 24277 24276 24273 24275 24278 24277 24274 24287 24291 24278 24275 24277 24280 24279 24276 24278 24295 24280 24277 24291 24296 24295 24278 24280 24300 24281 24279 24295 24301 24300 24280 24300 24307 24306 24281 25981 25987 24283 24282 24283 25987 24286 24285 24285 24289 24288 24284 24286 24290 24289 24285 25992 25995 24290 24286 25988 25992 24286 25987 24288 24292 24291 24287 24289 24293 24292 24288 24290 24294 24293 24289 25995 25998 24294 24290 24292 24297 24296 24291 24293 24298 24297 24292 24294 24299 24298 24293 25998 26000 24299 24294 24296 24302 24301 24295 24297 24303 24302 24296 24298 24304 24303 24297 24299 24305 24304 24298 26000 26001 24305 24299 24301 24308 24307 24300 24302 24309 24308 24301 24303 24310 24309 24302 24304 24311 24310 24303 24305 24312 24311 24304 26001 26002 24312 24305 24307 25917 25916 24306 24308 25918 25917 24307 24309 25919 25918 24308 24310 25920 25919 24309 24311 25921 25920 24310 24312 25945 25921 24311 26002 27706 25945 24312 24412 26125 26032 24313 26032 26038 24341 24313 24411 24412 24313 24314 24313 24341 24321 24314 24410 24411 24314 24315 24314 24321 24320 24315 24409 24410 24315 24316 24315 24320 24319 24316 24316 24414 24408 24409 24318 24414 24316 24319 24318 24323 24322 24317 24413 24414 24318 24317 24319 24324 24323 24318 24320 24325 24324 24319 24321 24326 24325 24320 24341 24342 24326 24321 24323 24328 24327 24322 24324 24329 24328 24323 24325 24330 24329 24324 24326 24343 24330 24325 24342 24344 24343 24326 24328 24332 24331 24327 24329 24333 24332 24328 24330 24345 24333 24329 24343 24346 24345 24330 24332 24335 24334 24331 24333 24336 24335 24332 24345 24348 24336 24333 24335 24338 24337 24334 24336 24351 24338 24335 24348 24352 24351 24336 24338 24355 24339 24337 24351 24356 24355 24338 24355 24360 24340 24339 26038 26044 24342 24341 26044 26049 24344 24342 24344 24347 24346 24343 26049 26053 24347 24344 24346 24349 24348 24345 24347 24350 24349 24346 26053 26057 24350 24347 24349 24353 24352 24348 24350 24354 24353 24349 26057 26060 24354 24350 24352 24357 24356 24351 24353 24358 24357 24352 24354 24359 24358 24353 26060 26062 24359 24354 24356 24361 24360 24355 24357 24362 24361 24356 24358 24363 24362 24357 24359 24364 24363 24358 26062 26063 24364 24359 24366 24371 24370 24365 24466 24467 24366 24365 24367 24372 24371 24366 24467 24468 24367 24366 24368 24373 24372 24367 24468 24469 24368 24367 24369 24374 24373 24368 24469 24470 24369 24368 24389 24390 24374 24369 24470 24471 24389 24369 24371 24376 24375 24370 24372 24377 24376 24371 24373 24378 24377 24372 24374 24391 24378 24373 24390 24392 24391 24374 24376 24380 24379 24375 24377 24381 24380 24376 24378 24393 24381 24377 24391 24394 24393 24378 24380 24383 24382 24379 24381 24384 24383 24380 24393 24396 24384 24381 24383 24386 24385 24382 24384 24399 24386 24383 24396 24400 24399 24384 24386 24403 24387 24385 24399 24404 24403 24386 24403 24408 24388 24387 24408 24414 24413 24388 26101 26107 24390 24389 26095 26101 24389 24471 26107 26112 24392 24390 24392 24395 24394 24391 26112 26116 24395 24392 24394 24397 24396 24393 24395 24398 24397 24394 26116 26119 24398 24395 24397 24401 24400 24396 24398 24402 24401 24397 26119 26122 24402 24398 24400 24405 24404 24399 24401 24406 24405 24400 24402 24407 24406 24401 26122 26124 24407 24402 24404 24409 24408 24403 24405 24410 24409 24404 24406 24411 24410 24405 24407 24412 24411 24406 26124 26125 24412 24407 24416 24422 24421 24415 24501 24526 24416 24415 24417 24423 24422 24416 24526 24527 24417 24416 24418 24424 24423 24417 24527 24528 24418 24417 24419 24425 24424 24418 24528 24529 24419 24418 24420 24426 24425 24419 24529 24530 24420 24419 24442 24443 24426 24420 24530 24531 24442 24420 24422 24428 24427 24421 24423 24429 24428 24422 24424 24430 24429 24423 24425 24431 24430 24424 24426 24444 24431 24425 24443 24445 24444 24426 24429 24433 24432 24428 24430 24434 24433 24429 24431 24446 24434 24430 24444 24447 24446 24431 24433 24436 24435 24432 24434 24437 24436 24433 24446 24449 24437 24434 24436 24439 24438 24435 24437 24452 24439 24436 24449 24453 24452 24437 24439 24456 24440 24438 24452 24457 24456 24439 24456 24461 24441 24440 24461 24467 24466 24441 26161 26167 24443 24442 24531 26259 26161 24442 26167 26172 24445 24443 24445 24448 24447 24444 26172 26176 24448 24445 24447 24450 24449 24446 24448 24451 24450 24447 26176 26179 24451 24448 24450 24454 24453 24449 24451 24455 24454 24450 26179 26182 24455 24451 24453 24458 24457 24452 24454 24459 24458 24453 24455 24460 24459 24454 26182 26184 24460 24455 24457 24462 24461 24456 24458 24463 24462 24457 24459 24464 24463 24458 24460 24465 24464 24459 26184 26185 24465 24460 24462 24468 24467 24461 24463 24469 24468 24462 24464 24470 24469 24463 24465 24471 24470 24464 24465 26185 26095 24471 24589 24590 24502 24472 24502 24503 24480 24472 24588 24589 24472 24473 24472 24480 24479 24473 24587 24588 24473 24474 24473 24479 24478 24474 24474 24592 24586 24587 24477 24592 24474 24478 24476 24482 24481 24475 24560 24591 24476 24475 24477 24483 24482 24476 24591 24592 24477 24476 24478 24484 24483 24477 24479 24485 24484 24478 24480 24504 24485 24479 24503 24505 24504 24480 24482 24487 24486 24481 24483 24488 24487 24482 24484 24489 24488 24483 24485 24506 24489 24484 24504 24507 24506 24485 24487 24491 24490 24486 24488 24492 24491 24487 24489 24493 24492 24488 24506 24509 24493 24489 24491 24495 24494 24490 24492 24496 24495 24491 24493 24512 24496 24492 24509 24513 24512 24493 24495 24498 24497 24494 24496 24516 24498 24495 24512 24517 24516 24496 24498 24500 24499 24497 24516 24521 24500 24498 24500 24526 24501 24499 24521 24527 24526 24500 26211 26217 24503 24502 24590 26310 26211 24502 26217 26222 24505 24503 24505 24508 24507 24504 26222 26226 24508 24505 24507 24510 24509 24506 24508 24511 24510 24507 26226 26229 24511 24508 24510 24514 24513 24509 24511 24515 24514 24510 26229 26232 24515 24511 24513 24518 24517 24512 24514 24519 24518 24513 24515 24520 24519 24514 26232 26234 24520 24515 24517 24522 24521 24516 24518 24523 24522 24517 24519 24524 24523 24518 24520 24525 24524 24519 26234 26235 24525 24520 24522 24528 24527 24521 24523 24529 24528 24522 24524 24530 24529 24523 24525 24531 24530 24524 26235 26259 24531 24525 24643 24644 24561 24532 24561 24562 24538 24532 24532 24648 24642 24643 24537 24648 24532 24538 24534 24540 24539 24533 24621 24645 24534 24533 24535 24541 24540 24534 24645 24646 24535 24534 24536 24542 24541 24535 24646 24647 24536 24535 24537 24543 24542 24536 24647 24648 24537 24536 24538 24563 24543 24537 24562 24564 24563 24538 24540 24545 24544 24539 24541 24546 24545 24540 24542 24547 24546 24541 24543 24565 24547 24542 24563 24566 24565 24543 24545 24549 24548 24544 24546 24550 24549 24545 24547 24551 24550 24546 24565 24568 24551 24547 24549 24553 24552 24548 24550 24554 24553 24549 24551 24571 24554 24550 24568 24572 24571 24551 24553 24556 24555 24552 24554 24575 24556 24553 24571 24576 24575 24554 24556 24558 24557 24555 24575 24580 24558 24556 24558 24585 24559 24557 24580 24586 24585 24558 24585 24591 24560 24559 26262 26268 24562 24561 24644 26370 26262 24561 26268 26273 24564 24562 24564 24567 24566 24563 26273 26277 24567 24564 24566 24569 24568 24565 24567 24570 24569 24566 26277 26280 24570 24567 24569 24573 24572 24568 24570 24574 24573 24569 26280 26283 24574 24570 24572 24577 24576 24571 24573 24578 24577 24572 24574 24579 24578 24573 26283 26285 24579 24574 24576 24581 24580 24575 24577 24582 24581 24576 24578 24583 24582 24577 24579 24584 24583 24578 26285 26286 24584 24579 24581 24587 24586 24580 24582 24588 24587 24581 24583 24589 24588 24582 24584 24590 24589 24583 26286 26310 24590 24584 24586 24592 24591 24585 26322 26323 24593 24700 26323 26329 24622 24593 24699 24700 24593 24594 24593 24622 24603 24594 24698 24699 24594 24595 24594 24603 24602 24595 24697 24698 24595 24596 24595 24602 24601 24596 24696 24697 24596 24597 24596 24601 24600 24597 24675 24696 24597 24598 24597 24600 24599 24598 24600 24605 24604 24599 24601 24606 24605 24600 24602 24607 24606 24601 24603 24623 24607 24602 24622 24624 24623 24603 24605 24609 24608 24604 24606 24610 24609 24605 24607 24611 24610 24606 24623 24625 24611 24607 24609 24613 24612 24608 24610 24614 24613 24609 24611 24627 24614 24610 24625 24628 24627 24611 24613 24616 24615 24612 24614 24617 24616 24613 24627 24630 24617 24614 24616 24619 24618 24615 24617 24634 24619 24616 24630 24635 24634 24617 24619 24639 24620 24618 24634 24640 24639 24619 24639 24645 24621 24620 26329 26334 24624 24622 24624 24626 24625 24623 26334 26338 24626 24624 24626 24629 24628 24625 26338 26342 24629 24626 24628 24631 24630 24627 24629 24632 24631 24628 24629 26342 24633 24632 24631 24636 24635 24630 24632 24637 24636 24631 24633 24638 24637 24632 26345 26346 24638 24633 26343 26345 24633 26342 24635 24641 24640 24634 24636 24642 24641 24635 24637 24643 24642 24636 24638 24644 24643 24637 26346 26370 24644 24638 24640 24646 24645 24639 24641 24647 24646 24640 24642 24648 24647 24641 24751 26493 26380 24649 26380 26386 24676 24649 24750 24751 24649 24650 24649 24676 24657 24650 24749 24750 24650 24651 24650 24657 24656 24651 24748 24749 24651 24652 24651 24656 24655 24652 24652 24753 24747 24748 24654 24753 24652 24655 24654 24659 24658 24653 24752 24753 24654 24653 24655 24660 24659 24654 24656 24661 24660 24655 24657 24677 24661 24656 24676 24678 24677 24657 24659 24663 24662 24658 24660 24664 24663 24659 24661 24665 24664 24660 24677 24679 24665 24661 24663 24667 24666 24662 24664 24668 24667 24663 24665 24681 24668 24664 24679 24682 24681 24665 24667 24670 24669 24666 24668 24671 24670 24667 24681 24684 24671 24668 24670 24673 24672 24669 24671 24687 24673 24670 24684 24688 24687 24671 24673 24691 24674 24672 24687 24692 24691 24673 24691 24696 24675 24674 26386 26391 24678 24676 24678 24680 24679 24677 26391 26395 24680 24678 24680 24683 24682 24679 26395 26399 24683 24680 24682 24685 24684 24681 24683 24686 24685 24682 26399 26402 24686 24683 24685 24689 24688 24684 24686 24690 24689 24685 26402 26404 24690 24686 24688 24693 24692 24687 24689 24694 24693 24688 24690 24695 24694 24689 26404 26406 24695 24690 24692 24697 24696 24691 24693 24698 24697 24692 24694 24699 24698 24693 24695 24700 24699 24694 24695 26406 26322 24700 24802 26549 26437 24701 26437 26443 24728 24701 24801 24802 24701 24702 24701 24728 24708 24702 24800 24801 24702 24703 24702 24708 24707 24703 24703 24805 24799 24800 24706 24805 24703 24707 24705 24710 24709 24704 24803 24804 24705 24704 24706 24711 24710 24705 24804 24805 24706 24705 24707 24712 24711 24706 24708 24713 24712 24707 24728 24729 24713 24708 24710 24715 24714 24709 24711 24716 24715 24710 24712 24717 24716 24711 24713 24730 24717 24712 24729 24731 24730 24713 24715 24719 24718 24714 24716 24720 24719 24715 24717 24732 24720 24716 24730 24733 24732 24717 24719 24722 24721 24718 24720 24723 24722 24719 24732 24735 24723 24720 24722 24725 24724 24721 24723 24738 24725 24722 24735 24739 24738 24723 24725 24742 24726 24724 24738 24743 24742 24725 24742 24747 24727 24726 24747 24753 24752 24727 26443 26448 24729 24728 26448 26453 24731 24729 24731 24734 24733 24730 26453 26457 24734 24731 24733 24736 24735 24732 24734 24737 24736 24733 26457 26460 24737 24734 24736 24740 24739 24735 24737 24741 24740 24736 26460 26462 24741 24737 24739 24744 24743 24738 24740 24745 24744 24739 24741 24746 24745 24740 26462 26464 24746 24741 24743 24748 24747 24742 24744 24749 24748 24743 24745 24750 24749 24744 24746 24751 24750 24745 26464 26493 24751 24746 24853 26584 26496 24754 26496 26502 24779 24754 24754 24858 24852 24853 24759 24858 24754 24779 24756 24761 24760 24755 24854 24855 24756 24755 24757 24762 24761 24756 24855 24856 24757 24756 24758 24763 24762 24757 24856 24857 24758 24757 24759 24764 24763 24758 24857 24858 24759 24758 24779 24780 24764 24759 24761 24766 24765 24760 24762 24767 24766 24761 24763 24768 24767 24762 24764 24781 24768 24763 24780 24782 24781 24764 24766 24770 24769 24765 24767 24771 24770 24766 24768 24783 24771 24767 24781 24784 24783 24768 24770 24773 24772 24769 24771 24774 24773 24770 24783 24786 24774 24771 24773 24776 24775 24772 24774 24789 24776 24773 24786 24790 24789 24774 24776 24793 24777 24775 24789 24794 24793 24776 24793 24798 24778 24777 24798 24804 24803 24778 26502 26507 24780 24779 26507 26512 24782 24780 24782 24785 24784 24781 26512 26516 24785 24782 24784 24787 24786 24783 24785 24788 24787 24784 26516 26519 24788 24785 24787 24791 24790 24786 24788 24792 24791 24787 26519 26522 24792 24788 24790 24795 24794 24789 24791 24796 24795 24790 24792 24797 24796 24791 26522 26524 24797 24792 24794 24799 24798 24793 24795 24800 24799 24794 24796 24801 24800 24795 24797 24802 24801 24796 26524 26549 24802 24797 24799 24805 24804 24798 24917 24918 24830 24806 24830 24831 24815 24806 24916 24917 24806 24807 24806 24815 24814 24807 24915 24916 24807 24808 24807 24814 24813 24808 24914 24915 24808 24809 24808 24813 24812 24809 24913 24914 24809 24810 24809 24812 24811 24810 24812 24817 24816 24811 24813 24818 24817 24812 24814 24819 24818 24813 24815 24832 24819 24814 24831 24833 24832 24815 24817 24821 24820 24816 24818 24822 24821 24817 24819 24834 24822 24818 24832 24835 24834 24819 24821 24824 24823 24820 24822 24825 24824 24821 24834 24837 24825 24822 24824 24827 24826 24823 24825 24840 24827 24824 24837 24841 24840 24825 24827 24844 24828 24826 24840 24845 24844 24827 24844 24849 24829 24828 24849 24855 24854 24829 26561 26566 24831 24830 26560 26561 24830 24918 26566 26571 24833 24831 24833 24836 24835 24832 26571 26575 24836 24833 24835 24838 24837 24834 24836 24839 24838 24835 26575 26578 24839 24836 24838 24842 24841 24837 24839 24843 24842 24838 26578 26581 24843 24839 24841 24846 24845 24840 24842 24847 24846 24841 24843 24848 24847 24842 26581 26583 24848 24843 24845 24850 24849 24844 24846 24851 24850 24845 24847 24852 24851 24846 24848 24853 24852 24847 26583 26584 24853 24848 24850 24856 24855 24849 24851 24857 24856 24850 24852 24858 24857 24851 24974 24975 24890 24859 24890 24891 24867 24859 24973 24974 24859 24860 24859 24867 24866 24860 24972 24973 24860 24861 24860 24866 24865 24861 24861 24977 24971 24972 24864 24977 24861 24865 24863 24869 24868 24862 24948 24976 24863 24862 24864 24870 24869 24863 24976 24977 24864 24863 24865 24871 24870 24864 24866 24872 24871 24865 24867 24892 24872 24866 24891 24893 24892 24867 24869 24874 24873 24868 24870 24875 24874 24869 24871 24876 24875 24870 24872 24894 24876 24871 24892 24895 24894 24872 24874 24878 24877 24873 24875 24879 24878 24874 24876 24880 24879 24875 24894 24897 24880 24876 24878 24882 24881 24877 24879 24883 24882 24878 24880 24900 24883 24879 24897 24901 24900 24880 24882 24885 24884 24881 24883 24886 24885 24882 24900 24904 24886 24883 24885 24888 24887 24884 24886 24908 24888 24885 24904 24909 24908 24886 24888 24913 24889 24887 24908 24914 24913 24888 26612 26617 24891 24890 24975 26709 26612 24890 26617 26622 24893 24891 24893 24896 24895 24892 26622 26626 24896 24893 24895 24898 24897 24894 24896 24899 24898 24895 26626 26629 24899 24896 24898 24902 24901 24897 24899 24903 24902 24898 26629 26632 24903 24899 24901 24905 24904 24900 24902 24906 24905 24901 24903 24907 24906 24902 26632 26634 24907 24903 24905 24910 24909 24904 24906 24911 24910 24905 24907 24912 24911 24906 26634 26635 24912 24907 24909 24915 24914 24908 24910 24916 24915 24909 24911 24917 24916 24910 24912 24918 24917 24911 24912 26635 26560 24918 25026 26761 26661 24919 26661 26667 24949 24919 25025 25026 24919 24920 24919 24949 24926 24920 25024 25025 24920 24921 24920 24926 24925 24921 24921 25029 25023 25024 24924 25029 24921 24925 24923 24928 24927 24922 25027 25028 24923 24922 24924 24929 24928 24923 25028 25029 24924 24923 24925 24930 24929 24924 24926 24950 24930 24925 24949 24951 24950 24926 24928 24932 24931 24927 24929 24933 24932 24928 24930 24934 24933 24929 24950 24952 24934 24930 24932 24937 24936 24931 24933 24938 24937 24932 24934 24954 24938 24933 24952 24955 24954 24934 24936 24940 24939 24935 24937 24941 24940 24936 24938 24957 24941 24937 24954 24958 24957 24938 24940 24943 24942 24939 24941 24944 24943 24940 24957 24961 24944 24941 24943 24946 24945 24942 24944 24965 24946 24943 24961 24966 24965 24944 24946 24970 24947 24945 24965 24971 24970 24946 24970 24976 24948 24947 26667 26672 24951 24949 24951 24953 24952 24950 26672 26676 24953 24951 24953 24956 24955 24952 26676 26680 24956 24953 24955 24959 24958 24954 24956 24960 24959 24955 26680 26683 24960 24956 24958 24962 24961 24957 24959 24963 24962 24958 24960 24964 24963 24959 26683 26685 24964 24960 24962 24967 24966 24961 24963 24968 24967 24962 24964 24969 24968 24963 26685 26686 24969 24964 24966 24972 24971 24965 24967 24973 24972 24966 24968 24974 24973 24967 24969 24975 24974 24968 26686 26709 24975 24969 24971 24977 24976 24970 25075 26795 26712 24978 26712 26718 25003 24978 24978 25080 25074 25075 24979 25080 24978 25003 25003 25004 24988 24979 25079 25080 24979 24980 24979 24988 24987 24980 25078 25079 24980 24981 24980 24987 24986 24981 25077 25078 24981 24982 24981 24986 24985 24982 25076 25077 24982 24983 24982 24985 24984 24983 24985 24990 24989 24984 24986 24991 24990 24985 24987 24992 24991 24986 24988 25005 24992 24987 25004 25006 25005 24988 24990 24994 24993 24989 24991 24995 24994 24990 24992 25007 24995 24991 25005 25008 25007 24992 24994 24997 24996 24993 24995 24998 24997 24994 25007 25010 24998 24995 24997 25000 24999 24996 24998 25013 25000 24997 25010 25014 25013 24998 25000 25017 25001 24999 25013 25018 25017 25000 25017 25022 25002 25001 25022 25028 25027 25002 26718 26723 25004 25003 26723 26727 25006 25004 25006 25009 25008 25005 26727 26731 25009 25006 25008 25011 25010 25007 25009 25012 25011 25008 26731 26734 25012 25009 25011 25015 25014 25010 25012 25016 25015 25011 26734 26736 25016 25012 25014 25019 25018 25013 25015 25020 25019 25014 25016 25021 25020 25015 26736 26738 25021 25016 25018 25023 25022 25017 25019 25024 25023 25018 25020 25025 25024 25019 25021 25026 25025 25020 26738 26761 25026 25021 25023 25029 25028 25022 25134 26880 26771 25030 26771 26777 25055 25030 25133 25134 25030 25031 25030 25055 25038 25031 25132 25133 25031 25032 25031 25038 25037 25032 25131 25132 25032 25033 25032 25037 25036 25033 25033 25136 25130 25131 25035 25136 25033 25036 25035 25040 25039 25034 25135 25136 25035 25034 25036 25041 25040 25035 25037 25042 25041 25036 25038 25056 25042 25037 25055 25057 25056 25038 25040 25044 25043 25039 25041 25045 25044 25040 25042 25046 25045 25041 25056 25058 25046 25042 25044 25048 25047 25043 25045 25049 25048 25044 25046 25060 25049 25045 25058 25061 25060 25046 25048 25051 25050 25047 25049 25063 25051 25048 25060 25064 25063 25049 25051 25053 25052 25050 25063 25067 25053 25051 25053 25071 25054 25052 25067 25072 25071 25053 25071 25077 25076 25054 26777 26782 25057 25055 25057 25059 25058 25056 26782 26786 25059 25057 25059 25062 25061 25058 26786 26789 25062 25059 25061 25065 25064 25060 25062 25066 25065 25061 26789 26792 25066 25062 25064 25068 25067 25063 25065 25069 25068 25064 25066 25070 25069 25065 26792 26794 25070 25066 25068 25073 25072 25067 25069 25074 25073 25068 25070 25075 25074 25069 26794 26795 25075 25070 25072 25078 25077 25071 25073 25079 25078 25072 25074 25080 25079 25073 25168 26888 26831 25081 26831 26836 25109 25081 25167 25168 25081 25082 25081 25109 25083 25082 25082 25171 25166 25167 25084 25171 25082 25083 25109 25111 25110 25083 25083 25110 25091 25084 25170 25171 25084 25085 25084 25091 25090 25085 25169 25170 25085 25086 25085 25090 25089 25086 25086 25172 25157 25169 25088 25172 25086 25089 25088 25093 25092 25087 25089 25094 25093 25088 25090 25095 25094 25089 25091 25096 25095 25090 25110 25112 25096 25091 25093 25098 25097 25092 25094 25099 25098 25093 25095 25100 25099 25094 25096 25114 25100 25095 25112 25115 25114 25096 25098 25102 25101 25097 25099 25103 25102 25098 25100 25117 25103 25099 25114 25118 25117 25100 25102 25105 25104 25101 25103 25121 25105 25102 25117 25122 25121 25103 25105 25107 25106 25104 25121 25126 25107 25105 25107 25130 25108 25106 25126 25131 25130 25107 25130 25136 25135 25108 26836 26840 25111 25109 25111 25113 25112 25110 26840 26844 25113 25111 25113 25116 25115 25112 26844 26847 25116 25113 25115 25119 25118 25114 25116 25120 25119 25115 26847 26849 25120 25116 25118 25123 25122 25117 25119 25124 25123 25118 25120 25125 25124 25119 26849 26851 25125 25120 25122 25127 25126 25121 25123 25128 25127 25122 25124 25129 25128 25123 25125 26852 25129 25124 26851 26874 26852 25125 25127 25132 25131 25126 25128 25133 25132 25127 25129 25134 25133 25128 26852 26880 25134 25129 25138 25144 25143 25137 25193 25203 25138 25137 25139 25145 25144 25138 25203 25204 25139 25138 25140 25146 25145 25139 25204 25205 25140 25139 25141 25147 25146 25140 25205 25206 25141 25140 25142 25159 25147 25141 25206 25207 25142 25141 25158 26881 25159 25142 25207 25208 25158 25142 25144 25149 25148 25143 25145 25150 25149 25144 25146 25151 25150 25145 25147 25160 25151 25146 25159 25161 25160 25147 25149 25153 25152 25148 25150 25154 25153 25149 25151 25162 25154 25150 25160 25163 25162 25151 25153 25156 25155 25152 25154 25165 25156 25153 25162 25166 25165 25154 25156 25169 25157 25155 25165 25170 25169 25156 26881 26883 25161 25159 25161 25164 25163 25160 26883 26885 25164 25161 25163 25167 25166 25162 25164 25168 25167 25163 26885 26888 25168 25164 25166 25171 25170 25165 25174 25178 25177 25173 25257 25258 25174 25173 25175 25179 25178 25174 25258 25259 25175 25174 25176 25180 25179 25175 25259 25260 25176 25175 25176 25263 25181 25180 25261 25263 25176 25260 25178 25184 25183 25177 25179 25185 25184 25178 25180 25186 25185 25179 25181 25194 25186 25180 25182 25195 25194 25181 25263 25264 25182 25181 26912 26917 25195 25182 25264 26966 26912 25182 25184 25188 25187 25183 25185 25189 25188 25184 25186 25196 25189 25185 25194 25197 25196 25186 25188 25192 25191 25187 25189 25199 25192 25188 25196 25200 25199 25189 25191 25203 25193 25190 25192 25204 25203 25191 25199 25205 25204 25192 25195 25198 25197 25194 26917 26922 25198 25195 25197 25201 25200 25196 25198 25202 25201 25197 26922 26926 25202 25198 25200 25206 25205 25199 25201 25207 25206 25200 25202 25208 25207 25201 25210 25217 25216 25209 25311 25312 25210 25209 25211 25218 25217 25210 25312 25313 25211 25210 25212 25219 25218 25211 25313 25314 25212 25211 25213 25220 25219 25212 25314 25315 25213 25212 25214 25221 25220 25213 25315 25316 25214 25213 25215 25237 25221 25214 25316 25317 25215 25214 26941 26942 25237 25215 25317 27021 26941 25215 25217 25223 25222 25216 25218 25224 25223 25217 25219 25225 25224 25218 25220 25226 25225 25219 25221 25238 25226 25220 25237 25239 25238 25221 25223 25228 25227 25222 25224 25229 25228 25223 25225 25230 25229 25224 25226 25240 25230 25225 25238 25241 25240 25226 25228 25232 25231 25227 25229 25233 25232 25228 25230 25243 25233 25229 25240 25244 25243 25230 25232 25235 25234 25231 25233 25247 25235 25232 25243 25248 25247 25233 25235 25252 25236 25234 25247 25253 25252 25235 25252 25258 25257 25236 26942 26948 25239 25237 25239 25242 25241 25238 26948 26953 25242 25239 25241 25245 25244 25240 25242 25246 25245 25241 26953 26957 25246 25242 25244 25249 25248 25243 25245 25250 25249 25244 25246 25251 25250 25245 26957 26960 25251 25246 25248 25254 25253 25247 25249 25255 25254 25248 25250 25256 25255 25249 25251 26962 25256 25250 26960 26963 26962 25251 25253 25259 25258 25252 25254 25260 25259 25253 25255 25261 25260 25254 25256 25262 25261 25255 26962 26964 25262 25256 25262 25264 25263 25261 26964 26966 25264 25262 25266 25270 25269 25265 25362 25363 25266 25265 25267 25271 25270 25266 25363 25364 25267 25266 25268 25272 25271 25267 25364 25365 25268 25267 25268 25368 25273 25272 25366 25368 25268 25365 25270 25275 25274 25269 25271 25276 25275 25270 25272 25277 25276 25271 25273 25278 25277 25272 25289 25290 25278 25273 25368 25369 25289 25273 25275 25280 25279 25274 25276 25281 25280 25275 25277 25282 25281 25276 25278 25291 25282 25277 25290 25292 25291 25278 25280 25284 25283 25279 25281 25285 25284 25280 25282 25293 25285 25281 25291 25294 25293 25282 25284 25287 25286 25283 25285 25296 25287 25284 25293 25297 25296 25285 25287 25300 25288 25286 25296 25301 25300 25287 25300 25306 25305 25288 26995 27001 25290 25289 25369 27105 26995 25289 27001 27006 25292 25290 25292 25295 25294 25291 27006 27011 25295 25292 25294 25298 25297 25293 25295 25299 25298 25294 27011 27015 25299 25295 25297 25302 25301 25296 25298 25303 25302 25297 25299 25304 25303 25298 27015 27018 25304 25299 25301 25307 25306 25300 25302 25308 25307 25301 25303 25309 25308 25302 25304 25310 25309 25303 27018 27020 25310 25304 25306 25313 25312 25305 25307 25314 25313 25306 25308 25315 25314 25307 25309 25316 25315 25308 25310 25317 25316 25309 27020 27021 25317 25310 25319 25321 25320 25318 25395 25413 25319 25318 25319 25418 25322 25321 25414 25418 25319 25413 25321 25327 25326 25320 25322 25328 25327 25321 25323 25329 25328 25322 25418 25419 25323 25322 25324 25330 25329 25323 25419 25420 25324 25323 25325 25344 25330 25324 25420 25421 25325 25324 27049 27055 25344 25325 25421 27144 27049 25325 25327 25332 25331 25326 25328 25333 25332 25327 25329 25334 25333 25328 25330 25345 25334 25329 25344 25346 25345 25330 25332 25336 25335 25331 25333 25337 25336 25332 25334 25347 25337 25333 25345 25348 25347 25334 25336 25339 25338 25335 25337 25340 25339 25336 25347 25350 25340 25337 25339 25342 25341 25338 25340 25353 25342 25339 25350 25354 25353 25340 25342 25357 25343 25341 25353 25358 25357 25342 25357 25363 25362 25343 27055 27061 25346 25344 25346 25349 25348 25345 27061 27066 25349 25346 25348 25351 25350 25347 25349 25352 25351 25348 27066 27070 25352 25349 25351 25355 25354 25350 25352 25356 25355 25351 27070 27073 25356 25352 25354 25359 25358 25353 25355 25360 25359 25354 25356 25361 25360 25355 27073 27076 25361 25356 25358 25364 25363 25357 25359 25365 25364 25358 25360 25366 25365 25359 25361 25367 25366 25360 27076 27078 25367 25361 25367 25369 25368 25366 27078 27105 25369 25367 25371 25377 25376 25370 25470 25471 25371 25370 25372 25378 25377 25371 25471 25472 25372 25371 25373 25379 25378 25372 25472 25473 25373 25372 25374 25380 25379 25373 25473 25474 25374 25373 25375 25396 25380 25374 25474 25475 25375 25374 27112 27119 25396 25375 25475 27204 27112 25375 25377 25382 25381 25376 25378 25383 25382 25377 25379 25384 25383 25378 25380 25397 25384 25379 25396 25398 25397 25380 25382 25386 25385 25381 25383 25387 25386 25382 25384 25388 25387 25383 25397 25399 25388 25384 25386 25390 25389 25385 25387 25391 25390 25386 25388 25401 25391 25387 25399 25402 25401 25388 25390 25393 25392 25389 25391 25404 25393 25390 25401 25405 25404 25391 25393 25408 25394 25392 25404 25409 25408 25393 25408 25413 25395 25394 27119 27125 25398 25396 25398 25400 25399 25397 27125 27130 25400 25398 25400 25403 25402 25399 27130 27134 25403 25400 25402 25406 25405 25401 25403 25407 25406 25402 27134 27138 25407 25403 25405 25410 25409 25404 25406 25411 25410 25405 25407 25412 25411 25406 27138 27141 25412 25407 25409 25414 25413 25408 25410 25415 25414 25409 25411 25416 25415 25410 25412 25417 25416 25411 27141 27143 25417 25412 25415 25419 25418 25414 25416 25420 25419 25415 25417 25421 25420 25416 27143 27144 25421 25417 25423 25429 25428 25422 25522 25523 25423 25422 25424 25430 25429 25423 25523 25524 25424 25423 25425 25431 25430 25424 25524 25525 25425 25424 25426 25432 25431 25425 25525 25526 25426 25425 25427 25450 25432 25426 25526 25527 25427 25426 27175 27177 25450 25427 25527 27260 27175 25427 25429 25434 25433 25428 25430 25435 25434 25429 25431 25436 25435 25430 25432 25437 25436 25431 25450 25451 25437 25432 25434 25439 25438 25433 25435 25440 25439 25434 25436 25441 25440 25435 25437 25452 25441 25436 25451 25453 25452 25437 25439 25443 25442 25438 25440 25444 25443 25439 25441 25454 25444 25440 25452 25455 25454 25441 25443 25446 25445 25442 25444 25457 25446 25443 25454 25458 25457 25444 25446 25448 25447 25445 25457 25461 25448 25446 25448 25465 25449 25447 25461 25466 25465 25448 25465 25471 25470 25449 27177 27183 25451 25450 27183 27188 25453 25451 25453 25456 25455 25452 27188 27193 25456 25453 25455 25459 25458 25454 25456 25460 25459 25455 27193 27197 25460 25456 25458 25462 25461 25457 25459 25463 25462 25458 25460 25464 25463 25459 27197 27200 25464 25460 25462 25467 25466 25461 25463 25468 25467 25462 25464 25469 25468 25463 27200 27202 25469 25464 25466 25472 25471 25465 25467 25473 25472 25466 25468 25474 25473 25467 25469 25475 25474 25468 27202 27204 25475 25469 25477 25481 25480 25476 25571 25572 25477 25476 25478 25482 25481 25477 25572 25573 25478 25477 25479 25483 25482 25478 25573 25574 25479 25478 25479 25577 25484 25483 25575 25577 25479 25574 25481 25487 25486 25480 25482 25488 25487 25481 25483 25489 25488 25482 25484 25490 25489 25483 25485 25503 25490 25484 25577 25578 25485 25484 27233 27239 25503 25485 25578 27344 27233 25485 25487 25492 25491 25486 25488 25493 25492 25487 25489 25494 25493 25488 25490 25504 25494 25489 25503 25505 25504 25490 25492 25496 25495 25491 25493 25497 25496 25492 25494 25506 25497 25493 25504 25507 25506 25494 25496 25499 25498 25495 25497 25509 25499 25496 25506 25510 25509 25497 25499 25501 25500 25498 25509 25513 25501 25499 25501 25517 25502 25500 25513 25518 25517 25501 25517 25523 25522 25502 27239 27244 25505 25503 25505 25508 25507 25504 27244 27249 25508 25505 25507 25511 25510 25506 25508 25512 25511 25507 27249 27253 25512 25508 25510 25514 25513 25509 25511 25515 25514 25510 25512 25516 25515 25511 27253 27256 25516 25512 25514 25519 25518 25513 25515 25520 25519 25514 25516 25521 25520 25515 27256 27258 25521 25516 25518 25524 25523 25517 25519 25525 25524 25518 25520 25526 25525 25519 25521 25527 25526 25520 27258 27260 25527 25521 25528 25631 25530 25529 25626 25631 25528 25625 25530 25536 25535 25529 25531 25537 25536 25530 25631 25632 25531 25530 25532 25538 25537 25531 25632 25633 25532 25531 25533 25539 25538 25532 25633 25634 25533 25532 25534 25553 25539 25533 25634 25635 25534 25533 27294 27300 25553 25534 25635 27399 27294 25534 25536 25541 25540 25535 25537 25542 25541 25536 25538 25543 25542 25537 25539 25554 25543 25538 25553 25555 25554 25539 25541 25545 25544 25540 25542 25546 25545 25541 25543 25556 25546 25542 25554 25557 25556 25543 25545 25548 25547 25544 25546 25549 25548 25545 25556 25559 25549 25546 25548 25551 25550 25547 25549 25562 25551 25548 25559 25563 25562 25549 25551 25566 25552 25550 25562 25567 25566 25551 25566 25572 25571 25552 27300 27305 25555 25553 25555 25558 25557 25554 27305 27310 25558 25555 25557 25560 25559 25556 25558 25561 25560 25557 27310 27314 25561 25558 25560 25564 25563 25559 25561 25565 25564 25560 27314 27317 25565 25561 25563 25568 25567 25562 25564 25569 25568 25563 25565 25570 25569 25564 27317 27319 25570 25565 25567 25573 25572 25566 25568 25574 25573 25567 25569 25575 25574 25568 25570 25576 25575 25569 27319 27321 25576 25570 25576 25578 25577 25575 27321 27344 25578 25576 25580 25587 25586 25579 25668 25693 25580 25579 25581 25588 25587 25580 25693 25694 25581 25580 25582 25589 25588 25581 25694 25695 25582 25581 25583 25590 25589 25582 25695 25696 25583 25582 25584 25591 25590 25583 25696 25697 25584 25583 25585 25607 25591 25584 25697 25698 25585 25584 27351 27357 25607 25585 25698 27449 27351 25585 25587 25593 25592 25586 25588 25594 25593 25587 25589 25595 25594 25588 25590 25596 25595 25589 25591 25608 25596 25590 25607 25609 25608 25591 25593 25598 25597 25592 25594 25599 25598 25593 25595 25600 25599 25594 25596 25610 25600 25595 25608 25611 25610 25596 25599 25602 25601 25598 25600 25603 25602 25599 25610 25613 25603 25600 25602 25605 25604 25601 25603 25616 25605 25602 25613 25617 25616 25603 25605 25620 25606 25604 25616 25621 25620 25605 25620 25626 25625 25606 27357 27362 25609 25607 25609 25612 25611 25608 27362 27367 25612 25609 25611 25614 25613 25610 25612 25615 25614 25611 27367 27371 25615 25612 25614 25618 25617 25613 25615 25619 25618 25614 27371 27374 25619 25615 25617 25622 25621 25616 25618 25623 25622 25617 25619 25624 25623 25618 27374 27377 25624 25619 25621 25627 25626 25620 25622 25628 25627 25621 25623 25629 25628 25622 25624 25630 25629 25623 27377 27379 25630 25624 25627 25632 25631 25626 25628 25633 25632 25627 25629 25634 25633 25628 25630 25635 25634 25629 27379 27399 25635 25630 25637 25644 25643 25636 25727 25750 25637 25636 25638 25645 25644 25637 25750 25751 25638 25637 25639 25646 25645 25638 25751 25752 25639 25638 25640 25647 25646 25639 25752 25753 25640 25639 25641 25648 25647 25640 25753 25754 25641 25640 25642 25669 25648 25641 25754 25755 25642 25641 27405 27407 25669 25642 25755 27499 27405 25642 25644 25650 25649 25643 25645 25651 25650 25644 25646 25652 25651 25645 25647 25653 25652 25646 25648 25670 25653 25647 25669 25671 25670 25648 25650 25655 25654 25649 25651 25656 25655 25650 25652 25657 25656 25651 25653 25672 25657 25652 25670 25673 25672 25653 25655 25659 25658 25654 25656 25660 25659 25655 25657 25661 25660 25656 25672 25675 25661 25657 25659 25663 25662 25658 25660 25664 25663 25659 25661 25678 25664 25660 25675 25679 25678 25661 25663 25666 25665 25662 25664 25682 25666 25663 25678 25683 25682 25664 25666 25687 25667 25665 25682 25688 25687 25666 25687 25693 25668 25667 27407 27412 25671 25669 25671 25674 25673 25670 27412 27417 25674 25671 25673 25676 25675 25672 25674 25677 25676 25673 27417 27421 25677 25674 25676 25680 25679 25675 25677 25681 25680 25676 27421 27424 25681 25677 25679 25684 25683 25678 25680 25685 25684 25679 25681 25686 25685 25680 27424 27427 25686 25681 25683 25689 25688 25682 25684 25690 25689 25683 25685 25691 25690 25684 25686 25692 25691 25685 27427 27429 25692 25686 25688 25694 25693 25687 25689 25695 25694 25688 25690 25696 25695 25689 25691 25697 25696 25690 25692 25698 25697 25691 27429 27449 25698 25692 25700 25703 25702 25699 25781 25799 25700 25699 25701 25704 25703 25700 25799 25800 25701 25700 25701 25804 25705 25704 25801 25804 25701 25800 25703 25709 25708 25702 25704 25710 25709 25703 25705 25711 25710 25704 25706 25712 25711 25705 25804 25805 25706 25705 25707 25728 25712 25706 25805 25806 25707 25706 27455 27461 25728 25707 25806 27540 27455 25707 25709 25714 25713 25708 25710 25715 25714 25709 25711 25716 25715 25710 25712 25729 25716 25711 25728 25730 25729 25712 25714 25718 25717 25713 25715 25719 25718 25714 25716 25720 25719 25715 25729 25732 25720 25716 25718 25722 25721 25717 25719 25723 25722 25718 25720 25735 25723 25719 25732 25736 25735 25720 25722 25725 25724 25721 25723 25739 25725 25722 25735 25740 25739 25723 25725 25744 25726 25724 25739 25745 25744 25725 25744 25750 25727 25726 25728 27461 25731 25730 25730 25733 25732 25729 25731 25734 25733 25730 27467 27471 25734 25731 27462 27467 25731 27461 25733 25737 25736 25732 25734 25738 25737 25733 27471 27474 25738 25734 25736 25741 25740 25735 25737 25742 25741 25736 25738 25743 25742 25737 27474 27477 25743 25738 25740 25746 25745 25739 25741 25747 25746 25740 25742 25748 25747 25741 25743 25749 25748 25742 27477 27479 25749 25743 25745 25751 25750 25744 25746 25752 25751 25745 25747 25753 25752 25746 25748 25754 25753 25747 25749 25755 25754 25748 27479 27499 25755 25749 25757 25763 25762 25756 25855 25856 25757 25756 25758 25764 25763 25757 25856 25857 25758 25757 25759 25765 25764 25758 25857 25858 25759 25758 25760 25766 25765 25759 25858 25859 25760 25759 25761 25782 25766 25760 25859 25860 25761 25760 27509 27515 25782 25761 25860 27602 27509 25761 25763 25768 25767 25762 25764 25769 25768 25763 25765 25770 25769 25764 25766 25783 25770 25765 25782 25784 25783 25766 25768 25772 25771 25767 25769 25773 25772 25768 25770 25774 25773 25769 25783 25785 25774 25770 25772 25776 25775 25771 25773 25777 25776 25772 25774 25787 25777 25773 25785 25788 25787 25774 25776 25779 25778 25775 25777 25790 25779 25776 25787 25791 25790 25777 25779 25794 25780 25778 25790 25795 25794 25779 25794 25799 25781 25780 27515 27521 25784 25782 25784 25786 25785 25783 27521 27526 25786 25784 25786 25789 25788 25785 27526 27530 25789 25786 25788 25792 25791 25787 25789 25793 25792 25788 27530 27534 25793 25789 25791 25796 25795 25790 25792 25797 25796 25791 25793 25798 25797 25792 27534 27537 25798 25793 25795 25800 25799 25794 25796 25801 25800 25795 25797 25802 25801 25796 25798 25803 25802 25797 27537 27539 25803 25798 25802 25805 25804 25801 25803 25806 25805 25802 27539 27540 25806 25803 25808 25814 25813 25807 25910 25911 25808 25807 25809 25815 25814 25808 25911 25912 25809 25808 25810 25816 25815 25809 25912 25913 25810 25809 25811 25817 25816 25810 25913 25914 25811 25810 25812 25833 25817 25811 25914 25915 25812 25811 27572 27578 25833 25812 25915 27662 27572 25812 25814 25819 25818 25813 25815 25820 25819 25814 25816 25821 25820 25815 25817 25834 25821 25816 25833 25835 25834 25817 25819 25823 25822 25818 25820 25824 25823 25819 25821 25825 25824 25820 25834 25836 25825 25821 25823 25827 25826 25822 25824 25828 25827 25823 25825 25838 25828 25824 25836 25839 25838 25825 25827 25830 25829 25826 25828 25841 25830 25827 25838 25842 25841 25828 25830 25845 25831 25829 25841 25846 25845 25830 25845 25850 25832 25831 25850 25856 25855 25832 27578 27584 25835 25833 25835 25837 25836 25834 27584 27589 25837 25835 25837 25840 25839 25836 27589 27593 25840 25837 25839 25843 25842 25838 25840 25844 25843 25839 27593 27596 25844 25840 25842 25847 25846 25841 25843 25848 25847 25842 25844 25849 25848 25843 27596 27599 25849 25844 25846 25851 25850 25845 25847 25852 25851 25846 25848 25853 25852 25847 25849 25854 25853 25848 27599 27601 25854 25849 25851 25857 25856 25850 25852 25858 25857 25851 25853 25859 25858 25852 25854 25860 25859 25853 27601 27602 25860 25854 25862 25866 25865 25861 25944 25966 25862 25861 25863 25867 25866 25862 25966 25967 25863 25862 25864 25868 25867 25863 25967 25968 25864 25863 25864 25972 25869 25868 25969 25972 25864 25968 25866 25872 25871 25865 25867 25873 25872 25866 25868 25874 25873 25867 25869 25875 25874 25868 25870 25889 25875 25869 25972 25973 25870 25869 25888 25890 25889 25870 25973 25974 25888 25870 25872 25877 25876 25871 25873 25878 25877 25872 25874 25879 25878 25873 25875 25880 25879 25874 25889 25891 25880 25875 25878 25882 25881 25877 25879 25883 25882 25878 25880 25893 25883 25879 25891 25894 25893 25880 25882 25885 25884 25881 25883 25896 25885 25882 25893 25897 25896 25883 25885 25900 25886 25884 25896 25901 25900 25885 25900 25905 25887 25886 25905 25911 25910 25887 27638 27644 25890 25888 25974 27735 27638 25888 25890 25892 25891 25889 27644 27649 25892 25890 25892 25895 25894 25891 27649 27653 25895 25892 25894 25898 25897 25893 25895 25899 25898 25894 27653 27656 25899 25895 25897 25902 25901 25896 25898 25903 25902 25897 25899 25904 25903 25898 27656 27659 25904 25899 25901 25906 25905 25900 25902 25907 25906 25901 25903 25908 25907 25902 25904 25909 25908 25903 27659 27661 25909 25904 25906 25912 25911 25905 25907 25913 25912 25906 25908 25914 25913 25907 25909 25915 25914 25908 27661 27662 25915 25909 25917 25923 25922 25916 25918 25924 25923 25917 25919 25925 25924 25918 25920 25926 25925 25919 25921 25946 25926 25920 25945 25947 25946 25921 25923 25928 25927 25922 25924 25929 25928 25923 25925 25930 25929 25924 25926 25931 25930 25925 25946 25948 25931 25926 25928 25933 25932 25927 25929 25934 25933 25928 25930 25935 25934 25929 25931 25950 25935 25930 25948 25951 25950 25931 25933 25937 25936 25932 25934 25938 25937 25933 25935 25953 25938 25934 25950 25954 25953 25935 25937 25940 25939 25936 25938 25941 25940 25937 25953 25957 25941 25938 25940 25943 25942 25939 25941 25961 25943 25940 25957 25962 25961 25941 25943 25966 25944 25942 25961 25967 25966 25943 25945 27706 27701 25947 25947 25949 25948 25946 25947 27701 27697 25949 25949 25952 25951 25948 25949 27697 27694 25952 25951 25955 25954 25950 25952 25956 25955 25951 25952 27694 27691 25956 25954 25958 25957 25953 25955 25959 25958 25954 25956 25960 25959 25955 25956 27691 27689 25960 25958 25963 25962 25957 25959 25964 25963 25958 25960 25965 25964 25959 25960 27689 27688 25965 25962 25968 25967 25961 25963 25969 25968 25962 25964 25970 25969 25963 25965 25971 25970 25964 25965 27688 27687 25971 25970 25973 25972 25969 25971 25974 25973 25970 27687 27735 25974 25971 25976 25982 25981 25975 26063 26089 25976 25975 25977 25983 25982 25976 26089 26090 25977 25976 25978 25984 25983 25977 26090 26091 25978 25977 25979 25985 25984 25978 26091 26092 25979 25978 25980 25986 25985 25979 26092 26093 25980 25979 25980 26031 26030 25986 26093 26094 26031 25980 25982 25988 25987 25981 25983 25989 25988 25982 25984 25990 25989 25983 25985 25991 25990 25984 25986 26028 25991 25985 25986 26030 26029 26028 25989 25993 25992 25988 25990 25994 25993 25989 25991 26025 25994 25990 25991 26028 26026 26025 25993 25996 25995 25992 25994 25997 25996 25993 25994 26025 26022 25997 25996 25999 25998 25995 25997 26018 25999 25996 25997 26022 26019 26018 25999 26013 26000 25998 25999 26018 26014 26013 26000 26013 26008 26001 26001 26008 26003 26002 26003 27707 27706 26002 26004 27708 27707 26003 26008 26009 26004 26003 26005 27709 27708 26004 26009 26010 26005 26004 26006 27710 27709 26005 26010 26011 26006 26005 26007 27711 27710 26006 26011 26012 26007 26006 26013 26014 26009 26008 26014 26015 26010 26009 26015 26016 26011 26010 26016 26017 26012 26011 26018 26019 26015 26014 26019 26020 26016 26015 26020 26021 26017 26016 26022 26023 26020 26019 26023 26024 26021 26020 26025 26026 26023 26022 26026 26027 26024 26023 26028 26029 26027 26026 26033 26039 26038 26032 26125 26152 26033 26032 26034 26040 26039 26033 26152 26153 26034 26033 26035 26041 26040 26034 26153 26154 26035 26034 26036 26042 26041 26035 26154 26155 26036 26035 26037 26043 26042 26036 26155 26156 26037 26036 26064 26065 26043 26037 26156 26157 26064 26037 26039 26045 26044 26038 26040 26046 26045 26039 26041 26047 26046 26040 26042 26048 26047 26041 26043 26066 26048 26042 26065 26067 26066 26043 26045 26050 26049 26044 26046 26051 26050 26045 26047 26052 26051 26046 26048 26068 26052 26047 26066 26069 26068 26048 26050 26054 26053 26049 26051 26055 26054 26050 26052 26056 26055 26051 26068 26071 26056 26052 26054 26058 26057 26053 26055 26059 26058 26054 26056 26074 26059 26055 26071 26075 26074 26056 26058 26061 26060 26057 26059 26078 26061 26058 26074 26079 26078 26059 26061 26083 26062 26060 26078 26084 26083 26061 26083 26089 26063 26062 26067 26070 26069 26066 26069 26072 26071 26068 26070 26073 26072 26069 26072 26076 26075 26071 26073 26077 26076 26072 26075 26080 26079 26074 26076 26081 26080 26075 26077 26082 26081 26076 26079 26085 26084 26078 26080 26086 26085 26079 26081 26087 26086 26080 26082 26088 26087 26081 26084 26090 26089 26083 26085 26091 26090 26084 26086 26092 26091 26085 26087 26093 26092 26086 26088 26094 26093 26087 26096 26102 26101 26095 26185 26205 26096 26095 26097 26103 26102 26096 26205 26206 26097 26096 26098 26104 26103 26097 26206 26207 26098 26097 26099 26105 26104 26098 26207 26208 26099 26098 26100 26106 26105 26099 26208 26209 26100 26099 26126 26127 26106 26100 26209 26210 26126 26100 26102 26108 26107 26101 26103 26109 26108 26102 26104 26110 26109 26103 26105 26111 26110 26104 26106 26128 26111 26105 26127 26129 26128 26106 26108 26113 26112 26107 26109 26114 26113 26108 26110 26115 26114 26109 26111 26130 26115 26110 26128 26131 26130 26111 26113 26117 26116 26112 26114 26118 26117 26113 26115 26133 26118 26114 26130 26134 26133 26115 26117 26120 26119 26116 26118 26121 26120 26117 26133 26137 26121 26118 26120 26123 26122 26119 26121 26141 26123 26120 26137 26142 26141 26121 26123 26146 26124 26122 26141 26147 26146 26123 26146 26152 26125 26124 26129 26132 26131 26128 26131 26135 26134 26130 26132 26136 26135 26131 26134 26138 26137 26133 26135 26139 26138 26134 26136 26140 26139 26135 26138 26143 26142 26137 26139 26144 26143 26138 26140 26145 26144 26139 26142 26148 26147 26141 26143 26149 26148 26142 26144 26150 26149 26143 26145 26151 26150 26144 26147 26153 26152 26146 26148 26154 26153 26147 26149 26155 26154 26148 26150 26156 26155 26149 26151 26157 26156 26150 26257 26258 26158 26159 26158 26166 26165 26159 26256 26257 26159 26160 26159 26165 26164 26160 26160 26261 26255 26256 26163 26261 26160 26164 26162 26168 26167 26161 26259 26260 26162 26161 26163 26169 26168 26162 26260 26261 26163 26162 26164 26170 26169 26163 26165 26171 26170 26164 26166 26186 26171 26165 26168 26173 26172 26167 26169 26174 26173 26168 26170 26175 26174 26169 26171 26187 26175 26170 26186 26188 26187 26171 26173 26177 26176 26172 26174 26178 26177 26173 26175 26189 26178 26174 26187 26190 26189 26175 26177 26180 26179 26176 26178 26181 26180 26177 26189 26192 26181 26178 26180 26183 26182 26179 26181 26195 26183 26180 26192 26196 26195 26181 26183 26199 26184 26182 26195 26200 26199 26183 26199 26205 26185 26184 26188 26191 26190 26187 26190 26193 26192 26189 26191 26194 26193 26190 26193 26197 26196 26192 26194 26198 26197 26193 26196 26201 26200 26195 26197 26202 26201 26196 26198 26203 26202 26197 26200 26206 26205 26199 26201 26207 26206 26200 26202 26208 26207 26201 26203 26209 26208 26202 26204 26210 26209 26203 26212 26218 26217 26211 26310 26311 26212 26211 26213 26219 26218 26212 26311 26312 26213 26212 26214 26220 26219 26213 26312 26313 26214 26213 26215 26221 26220 26214 26313 26314 26215 26214 26216 26236 26221 26215 26314 26315 26216 26215 26218 26223 26222 26217 26219 26224 26223 26218 26220 26225 26224 26219 26221 26237 26225 26220 26236 26238 26237 26221 26223 26227 26226 26222 26224 26228 26227 26223 26225 26239 26228 26224 26237 26240 26239 26225 26227 26230 26229 26226 26228 26231 26230 26227 26239 26242 26231 26228 26230 26233 26232 26229 26231 26245 26233 26230 26242 26246 26245 26231 26233 26249 26234 26232 26245 26250 26249 26233 26249 26254 26235 26234 26254 26260 26259 26235 26238 26241 26240 26237 26240 26243 26242 26239 26241 26244 26243 26240 26243 26247 26246 26242 26244 26248 26247 26243 26246 26251 26250 26245 26247 26252 26251 26246 26248 26253 26252 26247 26250 26255 26254 26249 26251 26256 26255 26250 26252 26257 26256 26251 26253 26258 26257 26252 26255 26261 26260 26254 26263 26269 26268 26262 26370 26371 26263 26262 26264 26270 26269 26263 26371 26372 26264 26263 26265 26271 26270 26264 26372 26373 26265 26264 26266 26272 26271 26265 26373 26374 26266 26265 26267 26287 26272 26266 26374 26375 26267 26266 26269 26274 26273 26268 26270 26275 26274 26269 26271 26276 26275 26270 26272 26288 26276 26271 26287 26289 26288 26272 26274 26278 26277 26273 26275 26279 26278 26274 26276 26290 26279 26275 26288 26291 26290 26276 26278 26281 26280 26277 26279 26282 26281 26278 26290 26293 26282 26279 26281 26284 26283 26280 26282 26296 26284 26281 26293 26297 26296 26282 26284 26300 26285 26283 26296 26301 26300 26284 26300 26305 26286 26285 26305 26311 26310 26286 26289 26292 26291 26288 26291 26294 26293 26290 26292 26295 26294 26291 26294 26298 26297 26293 26295 26299 26298 26294 26297 26302 26301 26296 26298 26303 26302 26297 26299 26304 26303 26298 26301 26306 26305 26300 26302 26307 26306 26301 26303 26308 26307 26302 26304 26309 26308 26303 26306 26312 26311 26305 26307 26313 26312 26306 26308 26314 26313 26307 26309 26315 26314 26308 26434 26435 26316 26317 26316 26347 26328 26317 26433 26434 26317 26318 26317 26328 26327 26318 26432 26433 26318 26319 26318 26327 26326 26319 26431 26432 26319 26320 26319 26326 26325 26320 26430 26431 26320 26321 26320 26325 26324 26321 26406 26430 26321 26322 26321 26324 26323 26322 26324 26330 26329 26323 26325 26331 26330 26324 26326 26332 26331 26325 26327 26333 26332 26326 26328 26348 26333 26327 26347 26349 26348 26328 26330 26335 26334 26329 26331 26336 26335 26330 26332 26337 26336 26331 26333 26350 26337 26332 26348 26351 26350 26333 26335 26339 26338 26334 26336 26340 26339 26335 26337 26341 26340 26336 26350 26353 26341 26337 26339 26343 26342 26338 26340 26344 26343 26339 26341 26356 26344 26340 26353 26357 26356 26341 26344 26360 26345 26343 26356 26361 26360 26344 26360 26365 26346 26345 26365 26371 26370 26346 26349 26352 26351 26348 26351 26354 26353 26350 26352 26355 26354 26351 26354 26358 26357 26353 26355 26359 26358 26354 26357 26362 26361 26356 26358 26363 26362 26357 26359 26364 26363 26358 26361 26366 26365 26360 26362 26367 26366 26361 26363 26368 26367 26362 26364 26369 26368 26363 26366 26372 26371 26365 26367 26373 26372 26366 26368 26374 26373 26367 26369 26375 26374 26368 26491 26492 26376 26377 26376 26407 26385 26377 26490 26491 26377 26378 26377 26385 26384 26378 26489 26490 26378 26379 26378 26384 26383 26379 26379 26495 26488 26489 26382 26495 26379 26383 26381 26387 26386 26380 26493 26494 26381 26380 26382 26388 26387 26381 26494 26495 26382 26381 26383 26389 26388 26382 26384 26390 26389 26383 26385 26408 26390 26384 26407 26409 26408 26385 26387 26392 26391 26386 26388 26393 26392 26387 26389 26394 26393 26388 26390 26410 26394 26389 26408 26411 26410 26390 26392 26396 26395 26391 26393 26397 26396 26392 26394 26398 26397 26393 26410 26413 26398 26394 26396 26400 26399 26395 26397 26401 26400 26396 26398 26416 26401 26397 26413 26417 26416 26398 26400 26403 26402 26399 26401 26420 26403 26400 26416 26421 26420 26401 26403 26405 26404 26402 26420 26425 26405 26403 26405 26430 26406 26404 26425 26431 26430 26405 26409 26412 26411 26408 26411 26414 26413 26410 26412 26415 26414 26411 26414 26418 26417 26413 26415 26419 26418 26414 26417 26422 26421 26416 26418 26423 26422 26417 26419 26424 26423 26418 26421 26426 26425 26420 26422 26427 26426 26421 26423 26428 26427 26422 26424 26429 26428 26423 26426 26432 26431 26425 26427 26433 26432 26426 26428 26434 26433 26427 26429 26435 26434 26428 26436 26554 26547 26548 26442 26554 26436 26465 26438 26444 26443 26437 26549 26550 26438 26437 26439 26445 26444 26438 26550 26551 26439 26438 26440 26446 26445 26439 26551 26552 26440 26439 26441 26447 26446 26440 26552 26553 26441 26440 26442 26466 26447 26441 26553 26554 26442 26441 26465 26467 26466 26442 26444 26449 26448 26443 26445 26450 26449 26444 26446 26451 26450 26445 26447 26452 26451 26446 26466 26468 26452 26447 26449 26454 26453 26448 26450 26455 26454 26449 26451 26456 26455 26450 26452 26470 26456 26451 26468 26471 26470 26452 26454 26458 26457 26453 26455 26459 26458 26454 26456 26473 26459 26455 26470 26474 26473 26456 26458 26461 26460 26457 26459 26477 26461 26458 26473 26478 26477 26459 26461 26463 26462 26460 26477 26482 26463 26461 26463 26487 26464 26462 26482 26488 26487 26463 26487 26494 26493 26464 26467 26469 26468 26466 26469 26472 26471 26468 26471 26475 26474 26470 26472 26476 26475 26471 26474 26479 26478 26473 26475 26480 26479 26474 26476 26481 26480 26475 26478 26483 26482 26477 26479 26484 26483 26478 26480 26485 26484 26479 26481 26486 26485 26480 26483 26489 26488 26482 26484 26490 26489 26483 26485 26491 26490 26484 26486 26492 26491 26485 26488 26495 26494 26487 26497 26503 26502 26496 26584 26604 26497 26496 26498 26504 26503 26497 26604 26605 26498 26497 26499 26505 26504 26498 26605 26606 26499 26498 26500 26506 26505 26499 26606 26607 26500 26499 26501 26525 26506 26500 26607 26608 26501 26500 26503 26508 26507 26502 26504 26509 26508 26503 26505 26510 26509 26504 26506 26511 26510 26505 26525 26526 26511 26506 26508 26513 26512 26507 26509 26514 26513 26508 26510 26515 26514 26509 26511 26527 26515 26510 26526 26528 26527 26511 26513 26517 26516 26512 26514 26518 26517 26513 26515 26530 26518 26514 26527 26531 26530 26515 26517 26520 26519 26516 26518 26521 26520 26517 26530 26534 26521 26518 26520 26523 26522 26519 26521 26538 26523 26520 26534 26539 26538 26521 26523 26543 26524 26522 26538 26544 26543 26523 26543 26550 26549 26524 26528 26532 26531 26527 26529 26533 26532 26528 26531 26535 26534 26530 26532 26536 26535 26531 26533 26537 26536 26532 26535 26540 26539 26534 26536 26541 26540 26535 26537 26542 26541 26536 26539 26545 26544 26538 26540 26546 26545 26539 26541 26547 26546 26540 26542 26548 26547 26541 26544 26551 26550 26543 26545 26552 26551 26544 26546 26553 26552 26545 26547 26554 26553 26546 26658 26659 26555 26556 26555 26585 26565 26556 26657 26658 26556 26557 26556 26565 26564 26557 26656 26657 26557 26558 26557 26564 26563 26558 26655 26656 26558 26559 26558 26563 26562 26559 26635 26655 26559 26560 26559 26562 26561 26560 26562 26567 26566 26561 26563 26568 26567 26562 26564 26569 26568 26563 26565 26570 26569 26564 26585 26586 26570 26565 26567 26572 26571 26566 26568 26573 26572 26567 26569 26574 26573 26568 26570 26587 26574 26569 26586 26588 26587 26570 26572 26576 26575 26571 26573 26577 26576 26572 26574 26589 26577 26573 26587 26590 26589 26574 26576 26579 26578 26575 26577 26580 26579 26576 26589 26592 26580 26577 26579 26582 26581 26578 26580 26595 26582 26579 26592 26596 26595 26580 26582 26599 26583 26581 26595 26600 26599 26582 26599 26604 26584 26583 26588 26591 26590 26587 26590 26593 26592 26589 26591 26594 26593 26590 26593 26597 26596 26592 26594 26598 26597 26593 26596 26601 26600 26595 26597 26602 26601 26596 26598 26603 26602 26597 26600 26605 26604 26599 26601 26606 26605 26600 26602 26607 26606 26601 26603 26608 26607 26602 26707 26708 26609 26610 26609 26636 26616 26610 26706 26707 26610 26611 26610 26616 26615 26611 26611 26711 26705 26706 26614 26711 26611 26615 26613 26618 26617 26612 26709 26710 26613 26612 26614 26619 26618 26613 26710 26711 26614 26613 26615 26620 26619 26614 26616 26621 26620 26615 26636 26637 26621 26616 26618 26623 26622 26617 26619 26624 26623 26618 26620 26625 26624 26619 26621 26638 26625 26620 26637 26639 26638 26621 26623 26627 26626 26622 26624 26628 26627 26623 26625 26640 26628 26624 26638 26641 26640 26625 26627 26630 26629 26626 26628 26631 26630 26627 26640 26643 26631 26628 26630 26633 26632 26629 26631 26646 26633 26630 26643 26647 26646 26631 26633 26650 26634 26632 26646 26651 26650 26633 26650 26655 26635 26634 26639 26642 26641 26638 26641 26644 26643 26640 26642 26645 26644 26641 26644 26648 26647 26643 26645 26649 26648 26644 26647 26652 26651 26646 26648 26653 26652 26647 26649 26654 26653 26648 26651 26656 26655 26650 26652 26657 26656 26651 26653 26658 26657 26652 26654 26659 26658 26653 26660 26765 26759 26760 26665 26765 26660 26666 26662 26668 26667 26661 26761 26762 26662 26661 26663 26669 26668 26662 26762 26763 26663 26662 26664 26670 26669 26663 26763 26764 26664 26663 26665 26671 26670 26664 26764 26765 26665 26664 26666 26687 26671 26665 26668 26673 26672 26667 26669 26674 26673 26668 26670 26675 26674 26669 26671 26688 26675 26670 26687 26689 26688 26671 26673 26677 26676 26672 26674 26678 26677 26673 26675 26679 26678 26674 26688 26690 26679 26675 26677 26681 26680 26676 26678 26682 26681 26677 26679 26692 26682 26678 26690 26693 26692 26679 26681 26684 26683 26680 26682 26695 26684 26681 26692 26696 26695 26682 26684 26699 26685 26683 26695 26700 26699 26684 26699 26704 26686 26685 26704 26710 26709 26686 26689 26691 26690 26688 26691 26694 26693 26690 26693 26697 26696 26692 26694 26698 26697 26693 26696 26701 26700 26695 26697 26702 26701 26696 26698 26703 26702 26697 26700 26705 26704 26699 26701 26706 26705 26700 26702 26707 26706 26701 26703 26708 26707 26702 26705 26711 26710 26704 26713 26719 26718 26712 26795 26822 26713 26712 26714 26720 26719 26713 26822 26823 26714 26713 26715 26721 26720 26714 26823 26824 26715 26714 26716 26722 26721 26715 26824 26825 26716 26715 26717 26740 26722 26716 26825 26826 26717 26716 26826 26827 26739 26717 26719 26724 26723 26718 26720 26725 26724 26719 26721 26726 26725 26720 26722 26741 26726 26721 26740 26742 26741 26722 26724 26728 26727 26723 26725 26729 26728 26724 26726 26730 26729 26725 26741 26743 26730 26726 26728 26732 26731 26727 26729 26733 26732 26728 26730 26745 26733 26729 26743 26746 26745 26730 26732 26735 26734 26731 26733 26748 26735 26732 26745 26749 26748 26733 26735 26737 26736 26734 26748 26752 26737 26735 26737 26756 26738 26736 26752 26757 26756 26737 26756 26762 26761 26738 26742 26744 26743 26741 26744 26747 26746 26743 26746 26750 26749 26745 26747 26751 26750 26746 26749 26753 26752 26748 26750 26754 26753 26749 26751 26755 26754 26750 26753 26758 26757 26752 26754 26759 26758 26753 26755 26760 26759 26754 26757 26763 26762 26756 26758 26764 26763 26757 26759 26765 26764 26758 26878 26879 26796 26766 26796 26797 26776 26766 26877 26878 26766 26767 26766 26776 26775 26767 26876 26877 26767 26768 26767 26775 26774 26768 26875 26876 26768 26769 26768 26774 26773 26769 26874 26875 26769 26770 26769 26773 26772 26770 26770 26880 26852 26874 26771 26880 26770 26772 26772 26778 26777 26771 26773 26779 26778 26772 26774 26780 26779 26773 26775 26781 26780 26774 26776 26798 26781 26775 26797 26799 26798 26776 26778 26783 26782 26777 26779 26784 26783 26778 26780 26785 26784 26779 26781 26800 26785 26780 26798 26801 26800 26781 26783 26787 26786 26782 26784 26788 26787 26783 26785 26803 26788 26784 26800 26804 26803 26785 26787 26790 26789 26786 26788 26791 26790 26787 26803 26807 26791 26788 26790 26793 26792 26789 26791 26811 26793 26790 26807 26812 26811 26791 26793 26816 26794 26792 26811 26817 26816 26793 26816 26822 26795 26794 26799 26802 26801 26798 26801 26805 26804 26800 26802 26806 26805 26801 26804 26808 26807 26803 26805 26809 26808 26804 26806 26810 26809 26805 26808 26813 26812 26807 26809 26814 26813 26808 26810 26815 26814 26809 26812 26818 26817 26811 26813 26819 26818 26812 26814 26820 26819 26813 26815 26821 26820 26814 26817 26823 26822 26816 26818 26824 26823 26817 26819 26825 26824 26818 26820 26826 26825 26819 26821 26827 26826 26820 26898 26899 26828 26829 26828 26853 26835 26829 26897 26898 26829 26830 26829 26835 26834 26830 26832 26837 26836 26831 26833 26838 26837 26832 26900 26901 26833 26832 26834 26839 26838 26833 26835 26854 26839 26834 26853 26855 26854 26835 26837 26841 26840 26836 26838 26842 26841 26837 26839 26843 26842 26838 26854 26856 26843 26839 26841 26845 26844 26840 26842 26846 26845 26841 26843 26858 26846 26842 26856 26859 26858 26843 26845 26848 26847 26844 26846 26861 26848 26845 26858 26862 26861 26846 26848 26850 26849 26847 26861 26865 26850 26848 26850 26869 26851 26849 26865 26870 26869 26850 26869 26875 26874 26851 26855 26857 26856 26854 26857 26860 26859 26856 26859 26863 26862 26858 26860 26864 26863 26859 26862 26866 26865 26861 26863 26867 26866 26862 26864 26868 26867 26863 26866 26871 26870 26865 26867 26872 26871 26866 26868 26873 26872 26867 26870 26876 26875 26869 26871 26877 26876 26870 26872 26878 26877 26871 26873 26879 26878 26872 26882 26884 26883 26881 26884 26886 26885 26883 26884 26887 26886 26886 26889 26888 26885 26887 26890 26889 26886 26890 26892 26891 26889 26890 26893 26892 26892 26901 26900 26891 26893 26895 26894 26895 26907 26906 26894 26902 26903 26898 26897 26903 26904 26899 26898 26906 26907 26903 26902 26907 26908 26904 26903 26908 26909 26905 26904 26910 26911 26909 26908 26913 26918 26917 26912 26966 26987 26913 26912 26914 26919 26918 26913 26987 26988 26914 26913 26915 26920 26919 26914 26988 26989 26915 26914 26916 26921 26920 26915 26989 26990 26916 26915 26991 26993 26916 26990 26918 26923 26922 26917 26919 26924 26923 26918 26920 26925 26924 26919 26923 26927 26926 26922 26924 26940 26927 26923 26939 26940 26924 26925 26931 26932 26930 26929 26934 26935 26932 26931 26935 26936 26933 26932 26934 26938 26937 26993 26994 26936 26935 26938 26940 26939 26941 27044 26943 26942 27039 27044 26941 27021 26943 26949 26948 26942 26944 26950 26949 26943 27044 27045 26944 26943 26945 26951 26950 26944 27045 27046 26945 26944 26946 26952 26951 26945 27046 27047 26946 26945 26947 26967 26952 26946 27047 27048 26947 26946 26949 26954 26953 26948 26950 26955 26954 26949 26951 26956 26955 26950 26952 26968 26956 26951 26967 26969 26968 26952 26954 26958 26957 26953 26955 26959 26958 26954 26956 26970 26959 26955 26968 26971 26970 26956 26958 26961 26960 26957 26959 26973 26961 26958 26970 26974 26973 26959 26961 26977 26963 26960 26973 26978 26977 26961 26963 26965 26964 26962 26977 26982 26965 26963 26965 26987 26966 26964 26982 26988 26987 26965 26969 26972 26971 26968 26971 26975 26974 26970 26972 26976 26975 26971 26974 26979 26978 26973 26975 26980 26979 26974 26976 26981 26980 26975 26978 26983 26982 26977 26979 26984 26983 26978 26980 26985 26984 26979 26981 26986 26985 26980 26983 26989 26988 26982 26984 26990 26989 26983 26985 26991 26990 26984 26986 26992 26991 26985 26992 26994 26993 26991 26996 27002 27001 26995 27105 27106 26996 26995 26997 27003 27002 26996 27106 27107 26997 26996 26998 27004 27003 26997 27107 27108 26998 26997 26999 27005 27004 26998 27108 27109 26999 26998 27000 27023 27005 26999 27109 27110 27000 26999 27110 27111 27022 27000 27002 27007 27006 27001 27003 27008 27007 27002 27004 27009 27008 27003 27005 27010 27009 27004 27023 27024 27010 27005 27007 27012 27011 27006 27008 27013 27012 27007 27009 27014 27013 27008 27010 27025 27014 27009 27024 27026 27025 27010 27012 27016 27015 27011 27013 27017 27016 27012 27014 27027 27017 27013 27025 27028 27027 27014 27016 27019 27018 27015 27017 27030 27019 27016 27027 27031 27030 27017 27019 27034 27020 27018 27030 27035 27034 27019 27034 27039 27021 27020 27026 27029 27028 27025 27028 27032 27031 27027 27029 27033 27032 27028 27031 27036 27035 27030 27032 27037 27036 27031 27033 27038 27037 27032 27035 27040 27039 27034 27036 27041 27040 27035 27037 27042 27041 27036 27038 27043 27042 27037 27040 27045 27044 27039 27041 27046 27045 27040 27042 27047 27046 27041 27043 27048 27047 27042 27050 27056 27055 27049 27144 27169 27050 27049 27051 27057 27056 27050 27169 27170 27051 27050 27052 27058 27057 27051 27170 27171 27052 27051 27053 27059 27058 27052 27171 27172 27053 27052 27054 27060 27059 27053 27172 27173 27054 27053 27079 27080 27060 27054 27173 27174 27079 27054 27056 27062 27061 27055 27057 27063 27062 27056 27058 27064 27063 27057 27059 27065 27064 27058 27060 27081 27065 27059 27080 27082 27081 27060 27062 27067 27066 27061 27063 27068 27067 27062 27064 27069 27068 27063 27065 27083 27069 27064 27081 27084 27083 27065 27067 27071 27070 27066 27068 27072 27071 27067 27069 27086 27072 27068 27083 27087 27086 27069 27071 27074 27073 27070 27072 27075 27074 27071 27086 27090 27075 27072 27074 27077 27076 27073 27075 27094 27077 27074 27090 27095 27094 27075 27077 27099 27078 27076 27094 27100 27099 27077 27099 27106 27105 27078 27082 27085 27084 27081 27084 27088 27087 27083 27085 27089 27088 27084 27087 27091 27090 27086 27088 27092 27091 27087 27089 27093 27092 27088 27091 27096 27095 27090 27092 27097 27096 27091 27093 27098 27097 27092 27095 27101 27100 27094 27096 27102 27101 27095 27097 27103 27102 27096 27098 27104 27103 27097 27100 27107 27106 27099 27101 27108 27107 27100 27102 27109 27108 27101 27103 27110 27109 27102 27104 27111 27110 27103 27113 27120 27119 27112 27204 27227 27113 27112 27114 27121 27120 27113 27227 27228 27114 27113 27115 27122 27121 27114 27228 27229 27115 27114 27116 27123 27122 27115 27229 27230 27116 27115 27117 27124 27123 27116 27230 27231 27117 27116 27118 27145 27124 27117 27231 27232 27118 27117 27120 27126 27125 27119 27121 27127 27126 27120 27122 27128 27127 27121 27123 27129 27128 27122 27124 27146 27129 27123 27145 27147 27146 27124 27126 27131 27130 27125 27127 27132 27131 27126 27128 27133 27132 27127 27129 27148 27133 27128 27146 27149 27148 27129 27131 27135 27134 27130 27132 27136 27135 27131 27133 27137 27136 27132 27148 27151 27137 27133 27135 27139 27138 27134 27136 27140 27139 27135 27137 27154 27140 27136 27151 27155 27154 27137 27139 27142 27141 27138 27140 27158 27142 27139 27154 27159 27158 27140 27142 27163 27143 27141 27158 27164 27163 27142 27163 27169 27144 27143 27147 27150 27149 27146 27149 27152 27151 27148 27150 27153 27152 27149 27152 27156 27155 27151 27153 27157 27156 27152 27155 27160 27159 27154 27156 27161 27160 27155 27157 27162 27161 27156 27159 27165 27164 27158 27160 27166 27165 27159 27161 27167 27166 27160 27162 27168 27167 27161 27164 27170 27169 27163 27165 27171 27170 27164 27166 27172 27171 27165 27167 27173 27172 27166 27168 27174 27173 27167 27176 27178 27177 27175 27260 27283 27176 27175 27176 27289 27179 27178 27284 27289 27176 27283 27178 27184 27183 27177 27179 27185 27184 27178 27180 27186 27185 27179 27289 27290 27180 27179 27181 27187 27186 27180 27290 27291 27181 27180 27182 27206 27187 27181 27291 27292 27182 27181 27205 27207 27206 27182 27292 27293 27205 27182 27184 27189 27188 27183 27185 27190 27189 27184 27186 27191 27190 27185 27187 27192 27191 27186 27206 27208 27192 27187 27189 27194 27193 27188 27190 27195 27194 27189 27191 27196 27195 27190 27192 27210 27196 27191 27208 27211 27210 27192 27194 27198 27197 27193 27195 27199 27198 27194 27196 27213 27199 27195 27210 27214 27213 27196 27198 27201 27200 27197 27199 27217 27201 27198 27213 27218 27217 27199 27201 27203 27202 27200 27217 27222 27203 27201 27203 27227 27204 27202 27222 27228 27227 27203 27207 27209 27208 27206 27209 27212 27211 27208 27211 27215 27214 27210 27212 27216 27215 27211 27214 27219 27218 27213 27215 27220 27219 27214 27216 27221 27220 27215 27218 27223 27222 27217 27219 27224 27223 27218 27220 27225 27224 27219 27221 27226 27225 27220 27223 27229 27228 27222 27224 27230 27229 27223 27225 27231 27230 27224 27226 27232 27231 27225 27234 27240 27239 27233 27344 27345 27234 27233 27235 27241 27240 27234 27345 27346 27235 27234 27236 27242 27241 27235 27346 27347 27236 27235 27237 27243 27242 27236 27347 27348 27237 27236 27238 27262 27243 27237 27348 27349 27238 27237 27261 27263 27262 27238 27349 27350 27261 27238 27240 27245 27244 27239 27241 27246 27245 27240 27242 27247 27246 27241 27243 27248 27247 27242 27262 27264 27248 27243 27245 27250 27249 27244 27246 27251 27250 27245 27247 27252 27251 27246 27248 27266 27252 27247 27264 27267 27266 27248 27250 27254 27253 27249 27251 27255 27254 27250 27252 27269 27255 27251 27266 27270 27269 27252 27254 27257 27256 27253 27255 27273 27257 27254 27269 27274 27273 27255 27257 27259 27258 27256 27273 27278 27259 27257 27259 27283 27260 27258 27278 27284 27283 27259 27263 27265 27264 27262 27265 27268 27267 27264 27267 27271 27270 27266 27268 27272 27271 27267 27270 27275 27274 27269 27271 27276 27275 27270 27272 27277 27276 27271 27274 27279 27278 27273 27275 27280 27279 27274 27276 27281 27280 27275 27277 27282 27281 27276 27279 27285 27284 27278 27280 27286 27285 27279 27281 27287 27286 27280 27282 27288 27287 27281 27285 27290 27289 27284 27286 27291 27290 27285 27287 27292 27291 27286 27288 27293 27292 27287 27295 27301 27300 27294 27399 27400 27295 27294 27296 27302 27301 27295 27400 27401 27296 27295 27297 27303 27302 27296 27401 27402 27297 27296 27298 27304 27303 27297 27402 27403 27298 27297 27299 27322 27304 27298 27403 27404 27299 27298 27301 27306 27305 27300 27302 27307 27306 27301 27303 27308 27307 27302 27304 27309 27308 27303 27322 27323 27309 27304 27306 27311 27310 27305 27307 27312 27311 27306 27308 27313 27312 27307 27309 27324 27313 27308 27323 27325 27324 27309 27311 27315 27314 27310 27312 27316 27315 27311 27313 27326 27316 27312 27324 27327 27326 27313 27315 27318 27317 27314 27316 27329 27318 27315 27326 27330 27329 27316 27318 27320 27319 27317 27329 27333 27320 27318 27320 27338 27321 27319 27333 27339 27338 27320 27338 27345 27344 27321 27325 27328 27327 27324 27327 27331 27330 27326 27328 27332 27331 27327 27330 27334 27333 27329 27331 27335 27334 27330 27332 27336 27335 27331 27334 27340 27339 27333 27335 27341 27340 27334 27336 27342 27341 27335 27337 27343 27342 27336 27339 27346 27345 27338 27340 27347 27346 27339 27341 27348 27347 27340 27342 27349 27348 27341 27343 27350 27349 27342 27352 27358 27357 27351 27449 27450 27352 27351 27353 27359 27358 27352 27450 27451 27353 27352 27354 27360 27359 27353 27451 27452 27354 27353 27355 27361 27360 27354 27452 27453 27355 27354 27356 27380 27361 27355 27453 27454 27356 27355 27358 27363 27362 27357 27359 27364 27363 27358 27360 27365 27364 27359 27361 27366 27365 27360 27380 27381 27366 27361 27363 27368 27367 27362 27364 27369 27368 27363 27365 27370 27369 27364 27366 27382 27370 27365 27381 27383 27382 27366 27368 27372 27371 27367 27369 27373 27372 27368 27370 27384 27373 27369 27382 27385 27384 27370 27372 27375 27374 27371 27373 27376 27375 27372 27384 27387 27376 27373 27375 27378 27377 27374 27376 27390 27378 27375 27387 27391 27390 27376 27378 27394 27379 27377 27390 27395 27394 27378 27394 27400 27399 27379 27383 27386 27385 27382 27385 27388 27387 27384 27386 27389 27388 27385 27388 27392 27391 27387 27389 27393 27392 27388 27391 27396 27395 27390 27392 27397 27396 27391 27393 27398 27397 27392 27395 27401 27400 27394 27396 27402 27401 27395 27397 27403 27402 27396 27398 27404 27403 27397 27406 27408 27407 27405 27499 27500 27406 27405 27406 27505 27409 27408 27501 27505 27406 27500 27408 27413 27412 27407 27409 27414 27413 27408 27410 27415 27414 27409 27505 27506 27410 27409 27411 27416 27415 27410 27506 27507 27411 27410 27430 27431 27416 27411 27507 27508 27430 27411 27413 27418 27417 27412 27414 27419 27418 27413 27415 27420 27419 27414 27416 27432 27420 27415 27431 27433 27432 27416 27418 27422 27421 27417 27419 27423 27422 27418 27420 27434 27423 27419 27432 27435 27434 27420 27422 27425 27424 27421 27423 27426 27425 27422 27434 27437 27426 27423 27425 27428 27427 27424 27426 27440 27428 27425 27437 27441 27440 27426 27428 27444 27429 27427 27440 27445 27444 27428 27444 27450 27449 27429 27433 27436 27435 27432 27435 27438 27437 27434 27436 27439 27438 27435 27438 27442 27441 27437 27439 27443 27442 27438 27441 27446 27445 27440 27442 27447 27446 27441 27443 27448 27447 27442 27445 27451 27450 27444 27446 27452 27451 27445 27447 27453 27452 27446 27448 27454 27453 27447 27456 27462 27461 27455 27540 27566 27456 27455 27457 27463 27462 27456 27566 27567 27457 27456 27458 27464 27463 27457 27567 27568 27458 27457 27459 27465 27464 27458 27568 27569 27459 27458 27460 27466 27465 27459 27569 27570 27460 27459 27480 27481 27466 27460 27570 27571 27480 27460 27463 27468 27467 27462 27464 27469 27468 27463 27465 27470 27469 27464 27466 27482 27470 27465 27481 27483 27482 27466 27468 27472 27471 27467 27469 27473 27472 27468 27470 27484 27473 27469 27482 27485 27484 27470 27472 27475 27474 27471 27473 27476 27475 27472 27484 27487 27476 27473 27475 27478 27477 27474 27476 27490 27478 27475 27487 27491 27490 27476 27478 27494 27479 27477 27490 27495 27494 27478 27494 27500 27499 27479 27483 27486 27485 27482 27485 27488 27487 27484 27486 27489 27488 27485 27488 27492 27491 27487 27489 27493 27492 27488 27491 27496 27495 27490 27492 27497 27496 27491 27493 27498 27497 27492 27495 27501 27500 27494 27496 27502 27501 27495 27497 27503 27502 27496 27498 27504 27503 27497 27502 27506 27505 27501 27503 27507 27506 27502 27504 27508 27507 27503 27510 27516 27515 27509 27602 27629 27510 27509 27511 27517 27516 27510 27629 27630 27511 27510 27512 27518 27517 27511 27630 27631 27512 27511 27513 27519 27518 27512 27631 27632 27513 27512 27514 27520 27519 27513 27632 27633 27514 27513 27541 27542 27520 27514 27633 27634 27541 27514 27516 27522 27521 27515 27517 27523 27522 27516 27518 27524 27523 27517 27519 27525 27524 27518 27520 27543 27525 27519 27542 27544 27543 27520 27522 27527 27526 27521 27523 27528 27527 27522 27524 27529 27528 27523 27525 27545 27529 27524 27543 27546 27545 27525 27527 27531 27530 27526 27528 27532 27531 27527 27529 27533 27532 27528 27545 27548 27533 27529 27531 27535 27534 27530 27532 27536 27535 27531 27533 27551 27536 27532 27548 27552 27551 27533 27535 27538 27537 27534 27536 27555 27538 27535 27551 27556 27555 27536 27538 27560 27539 27537 27555 27561 27560 27538 27560 27566 27540 27539 27544 27547 27546 27543 27546 27549 27548 27545 27547 27550 27549 27546 27549 27553 27552 27548 27550 27554 27553 27549 27552 27557 27556 27551 27553 27558 27557 27552 27554 27559 27558 27553 27556 27562 27561 27555 27557 27563 27562 27556 27558 27564 27563 27557 27559 27565 27564 27558 27561 27567 27566 27560 27562 27568 27567 27561 27563 27569 27568 27562 27564 27570 27569 27563 27565 27571 27570 27564 27573 27579 27578 27572 27662 27681 27573 27572 27574 27580 27579 27573 27681 27682 27574 27573 27575 27581 27580 27574 27682 27683 27575 27574 27576 27582 27581 27575 27683 27684 27576 27575 27577 27583 27582 27576 27684 27685 27577 27576 27603 27604 27583 27577 27685 27686 27603 27577 27579 27585 27584 27578 27580 27586 27585 27579 27581 27587 27586 27580 27582 27588 27587 27581 27583 27605 27588 27582 27604 27606 27605 27583 27585 27590 27589 27584 27586 27591 27590 27585 27587 27592 27591 27586 27588 27607 27592 27587 27605 27608 27607 27588 27590 27594 27593 27589 27591 27595 27594 27590 27592 27610 27595 27591 27607 27611 27610 27592 27594 27597 27596 27593 27595 27598 27597 27594 27610 27614 27598 27595 27597 27600 27599 27596 27598 27618 27600 27597 27614 27619 27618 27598 27600 27623 27601 27599 27618 27624 27623 27600 27623 27629 27602 27601 27606 27609 27608 27605 27608 27612 27611 27607 27609 27613 27612 27608 27611 27615 27614 27610 27612 27616 27615 27611 27613 27617 27616 27612 27615 27620 27619 27614 27616 27621 27620 27615 27617 27622 27621 27616 27619 27625 27624 27618 27620 27626 27625 27619 27621 27627 27626 27620 27622 27628 27627 27621 27624 27630 27629 27623 27625 27631 27630 27624 27626 27632 27631 27625 27627 27633 27632 27626 27628 27634 27633 27627 27733 27734 27635 27636 27635 27643 27642 27636 27732 27733 27636 27637 27636 27642 27641 27637 27637 27737 27731 27732 27640 27737 27637 27641 27639 27645 27644 27638 27735 27736 27639 27638 27640 27646 27645 27639 27736 27737 27640 27639 27641 27647 27646 27640 27642 27648 27647 27641 27643 27663 27648 27642 27645 27650 27649 27644 27646 27651 27650 27645 27647 27652 27651 27646 27648 27664 27652 27647 27663 27665 27664 27648 27650 27654 27653 27649 27651 27655 27654 27650 27652 27666 27655 27651 27664 27667 27666 27652 27654 27657 27656 27653 27655 27658 27657 27654 27666 27669 27658 27655 27657 27660 27659 27656 27658 27672 27660 27657 27669 27673 27672 27658 27660 27676 27661 27659 27672 27677 27676 27660 27676 27681 27662 27661 27665 27668 27667 27664 27667 27670 27669 27666 27668 27671 27670 27667 27670 27674 27673 27669 27671 27675 27674 27670 27673 27678 27677 27672 27674 27679 27678 27673 27675 27680 27679 27674 27677 27682 27681 27676 27678 27683 27682 27677 27679 27684 27683 27678 27680 27685 27684 27679 27730 27736 27735 27687 27725 27730 27687 27688 27690 27725 27688 27689 27691 27692 27690 27689 27721 27726 27725 27690 27693 27721 27690 27692 27694 27695 27692 27691 27695 27696 27693 27692 27718 27722 27721 27693 27715 27718 27693 27696 27697 27698 27695 27694 27698 27699 27696 27695 27700 27715 27696 27699 27701 27702 27698 27697 27702 27703 27699 27698 27703 27704 27700 27699 27713 27716 27715 27700 27705 27713 27700 27704 27706 27707 27702 27701 27707 27708 27703 27702 27708 27709 27704 27703 27709 27710 27705 27704 27712 27714 27713 27705 27711 27712 27705 27710 27714 27717 27716 27713 27716 27719 27718 27715 27717 27720 27719 27716 27719 27723 27722 27718 27720 27724 27723 27719 27722 27727 27726 27721 27723 27728 27727 27722 27724 27729 27728 27723 27726 27731 27730 27725 27727 27732 27731 27726 27728 27733 27732 27727 27729 27734 27733 27728 27731 27737 27736 27730 913 923 855 913 855 854 913 854 912 913 912 26905 913 26905 26909 915 924 923 915 923 913 915 913 914 915 914 916 26911 26928 930 26911 930 916 26911 916 914 953 954 920 955 920 954 920 955 918 958 918 955 918 958 919 960 919 958 919 960 2645 961 2645 960 2645 961 2696 953 920 948 925 948 920 948 925 949 924 949 925 949 924 915 949 915 917 931 946 917 931 917 915 931 915 916 931 916 930 948 949 945 948 945 932 948 932 935 948 935 936 951 952 947 951 947 937 951 937 941 951 941 942 944 1017 990 944 990 1012 944 1012 939 944 939 938 2685 2686 957 2685 957 950 2685 950 943 2685 943 1016 25202 26926 26882 25202 26882 26881 25202 26881 25158 25202 25158 25208 26901 26902 26897 26901 26897 26830 26901 26830 26834 26901 26834 26833 26832 26831 26889 26832 26889 26891 26832 26891 26900 26889 26831 26888 26890 26940 26893 26938 26893 26940 26893 26938 26895 26934 26895 26938 26895 26934 26896 26931 26896 26934 26896 26931 26929 26887 26884 26927 26887 26927 26940 26887 26940 26890 26882 26926 26927 26882 26927 26884 26901 26892 26893 26901 26893 26894 26901 26894 26906 26901 26906 26902 26907 26895 26896 26907 26896 26910 26907 26910 26908 26929 26930 26928 26929 26928 26911 26929 26911 26910 26929 26910 26896 26916 26993 26935 26916 26935 26934 26916 26934 26937 26916 26937 26921 26938 26939 26925 26938 26925 26920 26938 26920 26921 26938 26921 26937</edge_points>\n\t\t\t<clockwise_edges>1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1891 1888 1893 1894 1895 1892 1897 1898 1899 1896 1901 1902 1903 1900 1905 1906 1907 1904 1909 1910 1911 1908 1913 1914 1915 1912 1917 1918 1919 1916 1921 1922 1923 1920 1925 1926 1927 1924 1929 1930 1931 1928 1933 1934 1935 1932 1937 1938 1939 1936 1941 1942 1943 1940 1945 1946 1947 1944 1949 1950 1951 1948 1953 1954 1955 1952 1957 1958 1959 1956 1961 1962 1963 1960 1965 1966 1967 1964 1969 1970 1971 1968 1973 1974 1975 1972 1977 1978 1979 1976 1981 1982 1983 1980 1985 1986 1987 1984 1989 1990 1991 1988 1993 1994 1995 1992 1997 1998 1999 1996 2001 2002 2003 2000 2005 2006 2007 2004 2009 2010 2011 2008 2013 2014 2015 2012 2017 2018 2019 2016 2021 2022 2023 2020 2025 2026 2027 2024 2029 2030 2031 2028 2033 2034 2035 2032 2037 2038 2039 2036 2041 2042 2043 2040 2045 2046 2047 2044 2049 2050 2051 2048 2053 2054 2055 2052 2057 2058 2059 2056 2061 2062 2063 2060 2065 2066 2067 2064 2069 2070 2071 2068 2073 2074 2075 2072 2077 2078 2079 2076 2081 2082 2083 2080 2085 2086 2087 2084 2089 2090 2091 2088 2093 2094 2095 2092 2097 2098 2099 2096 2101 2102 2103 2100 2105 2106 2107 2104 2109 2110 2111 2108 2113 2114 2115 2112 2117 2118 2119 2116 2121 2122 2123 2120 2125 2126 2127 2124 2129 2130 2131 2128 2133 2134 2135 2132 2137 2138 2139 2136 2141 2142 2143 2140 2145 2146 2147 2144 2149 2150 2151 2148 2153 2154 2155 2152 2157 2158 2159 2156 2161 2162 2163 2160 2165 2166 2167 2164 2169 2170 2171 2168 2173 2174 2175 2172 2177 2178 2179 2176 2181 2182 2183 2180 2185 2186 2187 2184 2189 2190 2191 2188 2193 2194 2195 2192 2197 2198 2199 2196 2201 2202 2203 2200 2205 2206 2207 2204 2209 2210 2211 2208 2213 2214 2215 2212 2217 2218 2219 2216 2221 2222 2223 2220 2225 2226 2227 2224 2229 2230 2231 2228 2233 2234 2235 2232 2237 2238 2239 2236 2241 2242 2243 2240 2245 2246 2247 2244 2249 2250 2251 2248 2253 2254 2255 2252 2257 2258 2259 2256 2261 2262 2263 2260 2265 2266 2267 2264 2269 2270 2271 2268 2273 2274 2275 2272 2277 2278 2279 2276 2281 2282 2283 2280 2285 2286 2287 2284 2289 2290 2291 2288 2293 2294 2295 2292 2297 2298 2299 2296 2301 2302 2303 2300 2305 2306 2307 2304 2309 2310 2311 2308 2313 2314 2315 2312 2317 2318 2319 2316 2321 2322 2323 2320 2325 2326 2327 2324 2329 2330 2331 2328 2333 2334 2335 2332 2337 2338 2339 2336 2341 2342 2343 2340 2345 2346 2347 2344 2349 2350 2351 2348 2353 2354 2355 2352 2357 2358 2359 2356 2361 2362 2363 2360 2365 2366 2367 2364 2369 2370 2371 2368 2373 2374 2375 2372 2377 2378 2379 2376 2381 2382 2383 2380 2385 2386 2387 2384 2389 2390 2391 2388 2393 2394 2395 2392 2397 2398 2399 2396 2401 2402 2403 2400 2405 2406 2407 2404 2409 2410 2411 2408 2413 2414 2415 2412 2417 2418 2419 2416 2421 2422 2423 2420 2425 2426 2427 2424 2429 2430 2431 2428 2433 2434 2435 2432 2437 2438 2439 2436 2441 2442 2443 2440 2445 2446 2447 2444 2449 2450 2451 2448 2453 2454 2455 2452 2457 2458 2459 2456 2461 2462 2463 2460 2465 2466 2467 2464 2469 2470 2471 2468 2473 2474 2475 2472 2477 2478 2479 2476 2481 2482 2483 2480 2485 2486 2487 2484 2489 2490 2491 2488 2493 2494 2495 2492 2497 2498 2499 2496 2501 2502 2503 2500 2505 2506 2507 2504 2509 2510 2511 2508 2513 2514 2515 2512 2517 2518 2519 2516 2521 2522 2523 2520 2525 2526 2527 2524 2529 2530 2531 2528 2533 2534 2535 2532 2537 2538 2539 2536 2541 2542 2543 2540 2545 2546 2547 2544 2549 2550 2551 2548 2553 2554 2555 2552 2557 2558 2559 2556 2561 2562 2563 2560 2565 2566 2567 2564 2569 2570 2571 2568 2573 2574 2575 2572 2577 2578 2579 2576 2581 2582 2583 2580 2585 2586 2587 2584 2589 2590 2591 2588 2593 2594 2595 2592 2597 2598 2599 2596 2601 2602 2603 2600 2605 2606 2607 2604 2609 2610 2611 2608 2613 2614 2615 2612 2617 2618 2619 2616 2621 2622 2623 2620 2625 2626 2627 2624 2629 2630 2631 2628 2633 2634 2635 2632 2637 2638 2639 2636 2641 2642 2643 2640 2645 2646 2647 2644 2649 2650 2651 2648 2653 2654 2655 2652 2657 2658 2659 2656 2661 2662 2663 2660 2665 2666 2667 2664 2669 2670 2671 2668 2673 2674 2675 2672 2677 2678 2679 2676 2681 2682 2683 2680 2685 2686 2687 2684 2689 2690 2691 2688 2693 2694 2695 2692 2697 2698 2699 2696 2701 2702 2703 2700 2705 2706 2707 2704 2709 2710 2711 2708 2713 2714 2715 2712 2717 2718 2719 2716 2721 2722 2723 2720 2725 2726 2727 2724 2729 2730 2731 2728 2733 2734 2735 2732 2737 2738 2739 2736 2741 2742 2743 2740 2745 2746 2747 2744 2749 2750 2751 2748 2753 2754 2755 2752 2757 2758 2759 2756 2761 2762 2763 2760 2765 2766 2767 2764 2769 2770 2771 2768 2773 2774 2775 2772 2777 2778 2779 2776 2781 2782 2783 2780 2785 2786 2787 2784 2789 2790 2791 2788 2793 2794 2795 2792 2797 2798 2799 2796 2801 2802 2803 2800 2805 2806 2807 2804 2809 2810 2811 2808 2813 2814 2815 2812 2817 2818 2819 2816 2821 2822 2823 2820 2825 2826 2827 2824 2829 2830 2831 2828 2833 2834 2835 2832 2837 2838 2839 2836 2841 2842 2843 2840 2845 2846 2847 2844 2849 2850 2851 2848 2853 2854 2855 2852 2857 2858 2859 2856 2861 2862 2863 2860 2865 2866 2867 2864 2869 2870 2871 2868 2873 2874 2875 2872 2877 2878 2879 2876 2881 2882 2883 2880 2885 2886 2887 2884 2889 2890 2891 2888 2893 2894 2895 2892 2897 2898 2899 2896 2901 2902 2903 2900 2905 2906 2907 2904 2909 2910 2911 2908 2913 2914 2915 2912 2917 2918 2919 2916 2921 2922 2923 2920 2925 2926 2927 2924 2929 2930 2931 2928 2933 2934 2935 2932 2937 2938 2939 2936 2941 2942 2943 2940 2945 2946 2947 2944 2949 2950 2951 2948 2953 2954 2955 2952 2957 2958 2959 2956 2961 2962 2963 2960 2965 2966 2967 2964 2969 2970 2971 2968 2973 2974 2975 2972 2977 2978 2979 2976 2981 2982 2983 2980 2985 2986 2987 2984 2989 2990 2991 2988 2993 2994 2995 2992 2997 2998 2999 2996 3001 3002 3003 3000 3005 3006 3007 3004 3009 3010 3011 3008 3013 3014 3015 3012 3017 3018 3019 3016 3021 3022 3023 3020 3025 3026 3027 3024 3029 3030 3031 3028 3033 3034 3035 3032 3037 3038 3039 3036 3041 3042 3043 3040 3045 3046 3047 3044 3049 3050 3051 3048 3053 3054 3055 3052 3057 3058 3059 3056 3061 3062 3063 3060 3065 3066 3067 3064 3069 3070 3071 3068 3073 3074 3075 3072 3077 3078 3079 3076 3081 3082 3083 3080 3085 3086 3087 3084 3089 3090 3091 3088 3093 3094 3095 3092 3097 3098 3099 3096 3101 3102 3103 3100 3105 3106 3107 3104 3109 3110 3111 3108 3113 3114 3115 3112 3117 3118 3119 3116 3121 3122 3123 3120 3125 3126 3127 3124 3129 3130 3131 3128 3133 3134 3135 3132 3137 3138 3139 3136 3141 3142 3143 3140 3145 3146 3147 3144 3149 3150 3151 3148 3153 3154 3155 3152 3157 3158 3159 3156 3161 3162 3163 3160 3165 3166 3167 3164 3169 3170 3171 3168 3173 3174 3175 3172 3177 3178 3179 3176 3181 3182 3183 3180 3185 3186 3187 3184 3189 3190 3191 3188 3193 3194 3195 3192 3197 3198 3199 3196 3201 3202 3203 3200 3205 3206 3207 3204 3209 3210 3211 3208 3213 3214 3215 3212 3217 3218 3219 3216 3221 3222 3223 3220 3225 3226 3227 3224 3229 3230 3231 3228 3233 3234 3235 3232 3237 3238 3239 3236 3241 3242 3243 3240 3245 3246 3247 3244 3249 3250 3251 3248 3253 3254 3255 3252 3257 3258 3259 3256 3261 3262 3263 3260 3265 3266 3267 3264 3269 3270 3271 3268 3273 3274 3275 3272 3277 3278 3279 3276 3281 3282 3283 3280 3285 3286 3287 3284 3289 3290 3291 3288 3293 3294 3295 3292 3297 3298 3299 3296 3301 3302 3303 3300 3305 3306 3307 3304 3309 3310 3311 3308 3313 3314 3315 3312 3317 3318 3319 3316 3321 3322 3323 3320 3325 3326 3327 3324 3329 3330 3331 3328 3333 3334 3335 3332 3337 3338 3339 3336 3341 3342 3343 3340 3345 3346 3347 3344 3349 3350 3351 3348 3353 3354 3355 3352 3357 3358 3359 3356 3361 3362 3363 3360 3365 3366 3367 3364 3369 3370 3371 3368 3373 3374 3375 3372 3377 3378 3379 3376 3381 3382 3383 3380 3385 3386 3387 3384 3389 3390 3391 3388 3393 3394 3395 3392 3397 3398 3399 3396 3401 3402 3403 3400 3405 3406 3407 3404 3409 3410 3411 3408 3413 3414 3415 3412 3417 3418 3419 3416 3421 3422 3423 3420 3425 3426 3427 3424 3429 3430 3431 3428 3433 3434 3435 3432 3437 3438 3439 3436 3441 3442 3443 3440 3445 3446 3447 3444 3449 3450 3451 3448 3453 3454 3455 3452 3457 3458 3459 3456 3461 3462 3463 3460 3465 3466 3467 3464 3469 3470 3471 3468 3473 3474 3475 3472 3477 3478 3479 3476 3481 3482 3483 3480 3485 3486 3487 3484 3489 3490 3491 3488 3493 3494 3495 3492 3497 3498 3499 3496 3501 3502 3503 3500 3505 3506 3507 3504 3509 3510 3511 3508 3513 3514 3515 3512 3517 3518 3519 3516 3521 3522 3523 3520 3525 3526 3527 3524 3529 3530 3531 3528 3533 3534 3535 3532 3537 3538 3539 3536 3541 3542 3543 3540 3545 3546 3547 3544 3549 3550 3551 3548 3553 3554 3555 3552 3557 3558 3559 3556 3561 3562 3563 3560 3565 3566 3567 3564 3569 3570 3571 3568 3573 3574 3575 3572 3577 3578 3579 3576 3581 3582 3583 3580 3585 3586 3587 3584 3589 3590 3591 3588 3593 3594 3595 3592 3597 3598 3599 3596 3601 3602 3603 3600 3605 3606 3607 3604 3609 3610 3611 3608 3613 3614 3615 3612 3617 3618 3619 3616 3621 3622 3623 3620 3625 3626 3627 3624 3629 3630 3631 3628 3633 3634 3635 3632 3637 3638 3639 3636 3641 3642 3643 3640 3645 3646 3647 3644 3649 3650 3651 3648 3653 3654 3655 3652 3657 3658 3659 3656 3661 3662 3663 3660 3665 3666 3667 3664 3669 3670 3671 3668 3673 3674 3675 3672 3677 3678 3679 3676 3681 3682 3683 3680 3685 3686 3687 3684 3689 3690 3691 3688 3693 3694 3695 3692 3697 3698 3699 3696 3701 3702 3703 3700 3705 3706 3707 3704 3709 3710 3711 3708 3713 3714 3715 3712 3717 3718 3719 3716 3721 3722 3723 3720 3725 3726 3727 3724 3729 3730 3731 3728 3733 3734 3735 3732 3737 3738 3739 3736 3741 3742 3743 3740 3745 3746 3747 3744 3749 3750 3751 3748 3753 3754 3755 3752 3757 3758 3759 3756 3761 3762 3763 3760 3765 3766 3767 3764 3769 3770 3771 3768 3773 3774 3775 3772 3777 3778 3779 3776 3781 3782 3783 3780 3785 3786 3787 3784 3789 3790 3791 3788 3793 3794 3795 3792 3797 3798 3799 3796 3801 3802 3803 3800 3805 3806 3807 3804 3809 3810 3811 3808 3813 3814 3815 3812 3817 3818 3819 3816 3821 3822 3823 3820 3825 3826 3827 3824 3829 3830 3831 3828 3833 3834 3835 3832 3837 3838 3839 3836 3841 3842 3843 3840 3845 3846 3847 3844 3849 3850 3851 3848 3853 3854 3855 3852 3857 3858 3859 3856 3861 3862 3863 3860 3865 3866 3867 3864 3869 3870 3871 3868 3873 3874 3875 3872 3877 3878 3879 3876 3881 3882 3883 3880 3885 3886 3887 3884 3889 3890 3891 3888 3893 3894 3895 3892 3897 3898 3899 3896 3901 3902 3903 3900 3905 3906 3907 3904 3909 3910 3911 3908 3913 3914 3915 3912 3917 3918 3919 3916 3921 3922 3923 3920 3925 3926 3927 3924 3929 3930 3931 3928 3933 3934 3935 3932 3937 3938 3939 3936 3941 3942 3943 3940 3945 3946 3947 3944 3949 3950 3951 3948 3953 3954 3955 3952 3957 3958 3959 3956 3961 3962 3963 3960 3965 3966 3967 3964 3969 3970 3971 3968 3973 3974 3975 3972 3977 3978 3979 3976 3981 3982 3983 3980 3985 3986 3987 3984 3989 3990 3991 3988 3993 3994 3995 3992 3997 3998 3999 3996 4001 4002 4003 4000 4005 4006 4007 4004 4009 4010 4011 4008 4013 4014 4015 4012 4017 4018 4019 4016 4021 4022 4023 4020 4025 4026 4027 4024 4029 4030 4031 4028 4033 4034 4035 4032 4037 4038 4039 4036 4041 4042 4043 4040 4045 4046 4047 4044 4049 4050 4051 4048 4053 4054 4055 4052 4057 4058 4059 4056 4061 4062 4063 4060 4065 4066 4067 4064 4069 4070 4071 4068 4073 4074 4075 4072 4077 4078 4079 4076 4081 4082 4083 4080 4085 4086 4087 4084 4089 4090 4091 4088 4093 4094 4095 4092 4097 4098 4099 4096 4101 4102 4103 4100 4105 4106 4107 4104 4109 4110 4111 4108 4113 4114 4115 4112 4117 4118 4119 4116 4121 4122 4123 4120 4125 4126 4127 4124 4129 4130 4131 4128 4133 4134 4135 4132 4137 4138 4139 4136 4141 4142 4143 4140 4145 4146 4147 4144 4149 4150 4151 4148 4153 4154 4155 4152 4157 4158 4159 4156 4161 4162 4163 4160 4165 4166 4167 4164 4169 4170 4171 4168 4173 4174 4175 4172 4177 4178 4179 4176 4181 4182 4183 4180 4185 4186 4187 4184 4189 4190 4191 4188 4193 4194 4195 4192 4197 4198 4199 4196 4201 4202 4203 4200 4205 4206 4207 4204 4209 4210 4211 4208 4213 4214 4215 4212 4217 4218 4219 4216 4221 4222 4223 4220 4225 4226 4227 4224 4229 4230 4231 4228 4233 4234 4235 4232 4237 4238 4239 4236 4241 4242 4243 4240 4245 4246 4247 4244 4249 4250 4251 4248 4253 4254 4255 4252 4257 4258 4259 4256 4261 4262 4263 4260 4265 4266 4264 4268 4269 4270 4267 4272 4273 4274 4271 4276 4277 4275 4279 4280 4278 4282 4283 4284 4281 4286 4287 4288 4285 4290 4291 4292 4289 4294 4295 4296 4293 4298 4299 4300 4297 4302 4303 4304 4301 4306 4307 4308 4305 4310 4311 4312 4309 4314 4315 4316 4313 4318 4319 4320 4317 4322 4323 4324 4321 4326 4327 4328 4325 4330 4331 4332 4329 4334 4335 4336 4333 4338 4339 4340 4337 4342 4343 4344 4341 4346 4347 4348 4345 4350 4351 4352 4349 4354 4355 4356 4353 4358 4359 4360 4357 4362 4363 4364 4361 4366 4367 4368 4365 4370 4371 4372 4369 4374 4375 4376 4373 4378 4379 4380 4377 4382 4381 4384 4385 4383 4387 4388 4389 4386 4391 4392 4393 4390 4395 4396 4394 4398 4399 4400 4397 4402 4403 4404 4401 4406 4407 4408 4405 4410 4411 4412 4409 4414 4415 4416 4413 4418 4419 4420 4417 4422 4423 4424 4421 4426 4427 4428 4425 4430 4431 4432 4429 4434 4435 4436 4433 4438 4439 4440 4437 4442 4443 4444 4441 4446 4447 4448 4445 4450 4451 4452 4449 4454 4455 4456 4453 4458 4459 4460 4457 4462 4463 4464 4461 4466 4467 4468 4465 4470 4471 4472 4469 4474 4475 4476 4473 4478 4479 4480 4477 4482 4483 4484 4481 4486 4487 4488 4485 4490 4491 4492 4489 4494 4495 4496 4493 4498 4499 4500 4497 4502 4503 4504 4501 4506 4507 4508 4505 4510 4511 4512 4509 4514 4515 4516 4513 4518 4519 4520 4517 4522 4523 4524 4521 4526 4527 4528 4525 4530 4531 4532 4529 4534 4535 4536 4533 4538 4539 4540 4537 4542 4543 4544 4541 4546 4547 4548 4545 4550 4551 4552 4549 4554 4555 4556 4553 4558 4559 4560 4557 4562 4563 4564 4561 4566 4567 4568 4565 4570 4571 4572 4569 4574 4575 4576 4573 4578 4579 4580 4577 4582 4583 4584 4581 4586 4587 4588 4585 4590 4591 4592 4589 4594 4595 4596 4593 4598 4599 4600 4597 4602 4603 4604 4601 4606 4607 4608 4605 4610 4611 4612 4609 4614 4615 4616 4613 4618 4619 4620 4617 4622 4623 4624 4621 4626 4627 4628 4625 4630 4631 4632 4629 4634 4635 4636 4633 4638 4639 4640 4637 4642 4643 4644 4641 4646 4647 4648 4645 4650 4651 4652 4649 4654 4655 4656 4653 4658 4659 4660 4657 4662 4663 4664 4661 4666 4667 4668 4665 4670 4671 4672 4669 4674 4675 4676 4673 4678 4679 4680 4677 4682 4683 4684 4681 4686 4687 4688 4685 4690 4691 4692 4689 4694 4695 4696 4693 4698 4699 4700 4697 4702 4703 4704 4701 4706 4707 4708 4705 4710 4711 4712 4709 4714 4715 4716 4713 4718 4719 4720 4717 4722 4723 4724 4721 4726 4727 4728 4725 4730 4731 4732 4729 4734 4735 4736 4733 4738 4739 4740 4737 4742 4743 4744 4741 4746 4747 4748 4745 4750 4751 4752 4749 4754 4755 4756 4753 4758 4759 4760 4757 4762 4763 4764 4761 4766 4767 4768 4765 4770 4771 4772 4769 4774 4775 4776 4773 4778 4779 4780 4777 4782 4783 4784 4781 4786 4787 4788 4785 4790 4791 4792 4789 4794 4795 4796 4793 4798 4799 4800 4797 4802 4803 4804 4801 4806 4807 4808 4805 4810 4811 4812 4809 4814 4815 4816 4813 4818 4819 4820 4817 4822 4823 4824 4821 4826 4827 4828 4825 4830 4831 4832 4829 4834 4835 4836 4833 4838 4839 4840 4837 4842 4843 4844 4841 4846 4847 4848 4845 4850 4851 4852 4849 4854 4855 4856 4853 4858 4859 4860 4857 4862 4863 4864 4861 4866 4867 4868 4865 4870 4871 4872 4869 4874 4875 4876 4873 4878 4879 4880 4877 4882 4883 4884 4881 4886 4887 4888 4885 4890 4891 4892 4889 4894 4895 4896 4893 4898 4899 4900 4897 4902 4903 4904 4901 4906 4907 4908 4905 4910 4911 4912 4909 4914 4915 4916 4913 4918 4919 4920 4917 4922 4923 4924 4921 4926 4927 4928 4925 4930 4931 4932 4929 4934 4935 4936 4933 4938 4939 4940 4937 4942 4943 4944 4941 4946 4947 4948 4945 4950 4951 4952 4949 4954 4955 4956 4953 4958 4959 4960 4957 4962 4963 4964 4961 4966 4967 4968 4965 4970 4971 4972 4969 4974 4975 4976 4973 4978 4979 4980 4977 4982 4983 4984 4981 4986 4987 4988 4985 4990 4991 4992 4989 4994 4995 4996 4993 4998 4999 5000 4997 5002 5003 5004 5001 5006 5007 5008 5005 5010 5011 5012 5009 5014 5015 5016 5013 5018 5019 5020 5017 5022 5023 5024 5021 5026 5027 5028 5025 5030 5031 5032 5029 5034 5035 5036 5033 5038 5039 5040 5037 5042 5043 5044 5041 5046 5047 5048 5045 5050 5051 5052 5049 5054 5055 5056 5053 5058 5059 5060 5057 5062 5063 5064 5061 5066 5067 5068 5065 5070 5071 5072 5069 5074 5075 5076 5073 5078 5079 5080 5077 5082 5083 5084 5081 5086 5087 5088 5085 5090 5091 5092 5089 5094 5095 5096 5093 5098 5099 5100 5097 5102 5103 5104 5101 5106 5107 5108 5105 5110 5111 5112 5109 5114 5115 5116 5113 5118 5119 5120 5117 5122 5123 5124 5121 5126 5127 5128 5125 5130 5131 5132 5129 5134 5135 5136 5133 5138 5139 5140 5137 5142 5143 5144 5141 5146 5147 5148 5145 5150 5151 5152 5149 5154 5155 5156 5153 5158 5159 5160 5157 5162 5163 5164 5161 5166 5167 5168 5165 5170 5171 5172 5169 5174 5175 5176 5173 5178 5179 5180 5177 5182 5183 5184 5181 5186 5187 5188 5185 5190 5191 5192 5189 5194 5195 5196 5193 5198 5199 5200 5197 5202 5203 5204 5201 5206 5207 5208 5205 5210 5211 5212 5209 5214 5215 5216 5213 5218 5219 5220 5217 5222 5223 5224 5221 5226 5227 5228 5225 5230 5231 5232 5229 5234 5235 5236 5233 5238 5239 5240 5237 5242 5243 5244 5241 5246 5247 5248 5245 5250 5251 5252 5249 5254 5255 5256 5253 5258 5259 5260 5257 5262 5263 5264 5261 5266 5267 5268 5265 5270 5271 5272 5269 5274 5275 5276 5273 5278 5279 5280 5277 5282 5283 5284 5281 5286 5287 5288 5285 5290 5291 5292 5289 5294 5295 5296 5293 5298 5299 5300 5297 5302 5303 5304 5301 5306 5307 5308 5305 5310 5311 5312 5309 5314 5315 5316 5313 5318 5319 5320 5317 5322 5323 5324 5321 5326 5327 5328 5325 5330 5331 5332 5329 5334 5335 5336 5333 5338 5339 5340 5337 5342 5343 5344 5341 5346 5347 5348 5345 5350 5351 5352 5349 5354 5355 5356 5353 5358 5359 5360 5357 5362 5363 5364 5361 5366 5367 5368 5365 5370 5371 5372 5369 5374 5375 5376 5373 5378 5379 5380 5377 5382 5383 5384 5381 5386 5387 5388 5385 5390 5391 5392 5389 5394 5395 5396 5393 5398 5399 5400 5397 5402 5403 5404 5401 5406 5407 5408 5405 5410 5411 5412 5409 5414 5415 5416 5413 5418 5419 5420 5417 5422 5423 5424 5421 5426 5427 5428 5425 5430 5431 5432 5429 5434 5435 5436 5433 5438 5439 5440 5437 5442 5443 5444 5441 5446 5447 5448 5445 5450 5451 5452 5449 5454 5455 5456 5453 5458 5459 5460 5457 5462 5463 5464 5461 5466 5467 5468 5465 5470 5471 5472 5469 5474 5475 5476 5473 5478 5479 5480 5477 5482 5483 5484 5481 5486 5487 5488 5485 5490 5491 5492 5489 5494 5495 5496 5493 5498 5499 5500 5497 5502 5503 5504 5501 5506 5507 5508 5505 5510 5511 5512 5509 5514 5515 5516 5513 5518 5519 5520 5517 5522 5523 5524 5521 5526 5527 5528 5525 5530 5531 5532 5529 5534 5535 5536 5533 5538 5539 5540 5537 5542 5543 5544 5541 5546 5547 5548 5545 5550 5551 5552 5549 5554 5555 5556 5553 5558 5559 5560 5557 5562 5563 5564 5561 5566 5567 5568 5565 5570 5571 5572 5569 5574 5575 5576 5573 5578 5579 5580 5577 5582 5583 5584 5581 5586 5587 5588 5585 5590 5591 5592 5589 5594 5595 5596 5593 5598 5599 5600 5597 5602 5603 5604 5601 5606 5607 5608 5605 5610 5611 5612 5609 5614 5615 5616 5613 5618 5619 5620 5617 5622 5623 5624 5621 5626 5627 5628 5625 5630 5631 5632 5629 5634 5635 5636 5633 5638 5639 5640 5637 5642 5643 5644 5641 5646 5647 5648 5645 5650 5651 5652 5649 5654 5655 5656 5653 5658 5659 5660 5657 5662 5663 5664 5661 5666 5667 5668 5665 5670 5671 5672 5669 5674 5675 5676 5673 5678 5679 5680 5677 5682 5683 5684 5681 5686 5687 5688 5685 5690 5691 5692 5689 5694 5695 5696 5693 5698 5699 5700 5697 5702 5703 5704 5701 5706 5707 5708 5705 5710 5711 5712 5709 5714 5715 5716 5713 5718 5719 5720 5717 5722 5723 5724 5721 5726 5727 5728 5725 5730 5731 5732 5729 5734 5735 5736 5733 5738 5739 5740 5737 5742 5743 5744 5741 5746 5747 5748 5745 5750 5751 5752 5749 5754 5755 5756 5753 5758 5759 5760 5757 5762 5763 5764 5761 5766 5767 5768 5765 5770 5771 5772 5769 5774 5775 5776 5773 5778 5779 5780 5777 5782 5783 5784 5781 5786 5787 5788 5785 5790 5791 5792 5789 5794 5795 5796 5793 5798 5799 5800 5797 5802 5803 5804 5801 5806 5807 5808 5805 5810 5811 5812 5809 5814 5815 5816 5813 5818 5819 5820 5817 5822 5823 5824 5821 5826 5827 5828 5825 5830 5831 5832 5829 5834 5835 5836 5833 5838 5839 5840 5837 5842 5843 5844 5841 5846 5847 5848 5845 5850 5851 5852 5849 5854 5855 5856 5853 5858 5859 5860 5857 5862 5863 5864 5861 5866 5867 5868 5865 5870 5871 5872 5869 5874 5875 5876 5873 5878 5879 5880 5877 5882 5883 5884 5881 5886 5887 5888 5885 5890 5891 5892 5889 5894 5895 5896 5893 5898 5899 5900 5897 5902 5903 5904 5901 5906 5907 5908 5905 5910 5911 5912 5909 5914 5915 5916 5913 5918 5919 5920 5917 5922 5923 5924 5921 5926 5927 5928 5925 5930 5931 5932 5929 5934 5935 5936 5933 5938 5939 5940 5937 5942 5943 5944 5941 5946 5947 5948 5945 5950 5951 5952 5949 5954 5955 5956 5953 5958 5959 5960 5957 5962 5963 5964 5961 5966 5967 5968 5965 5970 5971 5972 5969 5974 5975 5976 5973 5978 5979 5980 5977 5982 5983 5984 5981 5986 5987 5988 5985 5990 5991 5992 5989 5994 5995 5996 5993 5998 5999 6000 5997 6002 6003 6004 6001 6006 6007 6008 6005 6010 6011 6012 6009 6014 6015 6016 6013 6018 6019 6020 6017 6022 6023 6024 6021 6026 6027 6028 6025 6030 6031 6032 6029 6034 6035 6036 6033 6038 6039 6040 6037 6042 6043 6044 6041 6046 6047 6048 6045 6050 6051 6052 6049 6054 6055 6056 6053 6058 6059 6060 6057 6062 6063 6064 6061 6066 6067 6068 6065 6070 6071 6072 6069 6074 6075 6076 6073 6078 6079 6080 6077 6082 6083 6084 6081 6086 6087 6088 6085 6090 6091 6092 6089 6094 6095 6096 6093 6098 6099 6100 6097 6102 6103 6104 6101 6106 6107 6108 6105 6110 6111 6112 6109 6114 6115 6116 6113 6118 6119 6120 6117 6122 6123 6124 6121 6126 6127 6128 6125 6130 6131 6132 6129 6134 6135 6136 6133 6138 6139 6140 6137 6142 6143 6144 6141 6146 6147 6148 6145 6150 6151 6152 6149 6154 6155 6156 6153 6158 6159 6160 6157 6162 6163 6164 6161 6166 6167 6168 6165 6170 6171 6172 6169 6174 6175 6176 6173 6178 6179 6180 6177 6182 6183 6184 6181 6186 6187 6188 6185 6190 6191 6192 6189 6194 6195 6196 6193 6198 6199 6200 6197 6202 6203 6204 6201 6206 6207 6208 6205 6210 6211 6212 6209 6214 6215 6216 6213 6218 6219 6220 6217 6222 6223 6224 6221 6226 6227 6228 6225 6230 6231 6232 6229 6234 6235 6236 6233 6238 6239 6240 6237 6242 6243 6244 6241 6246 6247 6248 6245 6250 6251 6252 6249 6254 6255 6256 6253 6258 6259 6260 6257 6262 6263 6264 6261 6266 6267 6268 6265 6270 6271 6272 6269 6274 6275 6276 6273 6278 6279 6280 6277 6282 6283 6284 6281 6286 6287 6288 6285 6290 6291 6292 6289 6294 6295 6296 6293 6298 6299 6300 6297 6302 6303 6304 6301 6306 6307 6308 6305 6310 6311 6312 6309 6314 6315 6316 6313 6318 6319 6320 6317 6322 6323 6324 6321 6326 6327 6328 6325 6330 6331 6332 6329 6334 6335 6336 6333 6338 6339 6340 6337 6342 6343 6344 6341 6346 6347 6348 6345 6350 6351 6352 6349 6354 6355 6356 6353 6358 6359 6360 6357 6362 6363 6364 6361 6366 6367 6368 6365 6370 6371 6372 6369 6374 6375 6376 6373 6378 6379 6380 6377 6382 6383 6384 6381 6386 6387 6388 6385 6390 6391 6392 6389 6394 6395 6396 6393 6398 6399 6400 6397 6402 6403 6404 6401 6406 6407 6408 6405 6410 6411 6412 6409 6414 6415 6416 6413 6418 6419 6420 6417 6422 6423 6424 6421 6426 6427 6428 6425 6430 6431 6432 6429 6434 6435 6436 6433 6438 6439 6440 6437 6442 6443 6444 6441 6446 6447 6448 6445 6450 6451 6452 6449 6454 6455 6456 6453 6458 6459 6460 6457 6462 6463 6464 6461 6466 6467 6468 6465 6470 6471 6472 6469 6474 6475 6476 6473 6478 6479 6480 6477 6482 6483 6484 6481 6486 6487 6488 6485 6490 6491 6492 6489 6494 6495 6496 6493 6498 6499 6500 6497 6502 6503 6504 6501 6506 6507 6508 6505 6510 6511 6512 6509 6514 6515 6516 6513 6518 6519 6520 6517 6522 6523 6524 6521 6526 6527 6528 6525 6530 6531 6532 6529 6534 6535 6536 6533 6538 6539 6540 6537 6542 6543 6544 6541 6546 6547 6548 6545 6550 6551 6552 6549 6554 6555 6556 6553 6558 6559 6560 6557 6562 6563 6564 6561 6566 6567 6568 6565 6570 6571 6572 6569 6574 6575 6576 6573 6578 6579 6580 6577 6582 6583 6584 6581 6586 6587 6588 6585 6590 6591 6592 6589 6594 6595 6596 6593 6598 6599 6600 6597 6602 6603 6604 6601 6606 6607 6608 6605 6610 6611 6612 6609 6614 6615 6616 6613 6618 6619 6620 6617 6622 6623 6624 6621 6626 6627 6628 6625 6630 6631 6632 6629 6634 6635 6636 6633 6638 6639 6640 6637 6642 6643 6644 6641 6646 6647 6648 6645 6650 6651 6652 6649 6654 6655 6656 6653 6658 6659 6660 6657 6662 6663 6664 6661 6666 6667 6668 6665 6670 6671 6672 6669 6674 6675 6676 6673 6678 6679 6680 6677 6682 6683 6684 6681 6686 6687 6688 6685 6690 6691 6692 6689 6694 6695 6696 6693 6698 6699 6700 6697 6702 6703 6704 6701 6706 6707 6708 6705 6710 6711 6712 6709 6714 6715 6716 6713 6718 6719 6720 6717 6722 6723 6724 6721 6726 6727 6728 6725 6730 6731 6732 6729 6734 6735 6736 6733 6738 6739 6740 6737 6742 6743 6744 6741 6746 6747 6748 6745 6750 6751 6752 6749 6754 6755 6756 6753 6758 6759 6760 6757 6762 6763 6764 6761 6766 6767 6768 6765 6770 6771 6772 6769 6774 6775 6776 6773 6778 6779 6780 6777 6782 6783 6784 6781 6786 6787 6788 6785 6790 6791 6792 6789 6794 6795 6796 6793 6798 6799 6800 6797 6802 6803 6804 6801 6806 6807 6808 6805 6810 6811 6812 6809 6814 6815 6816 6813 6818 6819 6820 6817 6822 6823 6824 6821 6826 6827 6828 6825 6830 6831 6832 6829 6834 6835 6836 6833 6838 6839 6840 6837 6842 6843 6844 6841 6846 6847 6848 6845 6850 6851 6852 6849 6854 6855 6856 6853 6858 6859 6860 6857 6862 6863 6864 6861 6866 6867 6868 6865 6870 6871 6872 6869 6874 6875 6876 6873 6878 6879 6880 6877 6882 6883 6884 6881 6886 6887 6888 6885 6890 6891 6892 6889 6894 6895 6896 6893 6898 6899 6900 6897 6902 6903 6904 6901 6906 6907 6908 6905 6910 6911 6912 6909 6914 6915 6916 6913 6918 6919 6920 6917 6922 6923 6924 6921 6926 6927 6928 6925 6930 6931 6932 6929 6934 6935 6936 6933 6938 6939 6940 6937 6942 6943 6944 6941 6946 6947 6948 6945 6950 6951 6952 6949 6954 6955 6956 6953 6958 6959 6960 6957 6962 6963 6964 6961 6966 6967 6968 6965 6970 6971 6972 6969 6974 6975 6976 6973 6978 6979 6980 6977 6982 6983 6984 6981 6986 6987 6988 6985 6990 6991 6992 6989 6994 6995 6996 6993 6998 6999 7000 6997 7002 7003 7004 7001 7006 7007 7008 7005 7010 7011 7012 7009 7014 7015 7016 7013 7018 7019 7020 7017 7022 7023 7024 7021 7026 7027 7028 7025 7030 7031 7032 7029 7034 7035 7036 7033 7038 7039 7040 7037 7042 7043 7044 7041 7046 7047 7048 7045 7050 7051 7052 7049 7054 7055 7056 7053 7058 7059 7060 7057 7062 7063 7064 7061 7066 7067 7068 7065 7070 7071 7072 7069 7074 7075 7076 7073 7078 7079 7080 7077 7082 7083 7084 7081 7086 7087 7088 7085 7090 7091 7092 7089 7094 7095 7096 7093 7098 7099 7100 7097 7102 7103 7104 7101 7106 7107 7108 7105 7110 7111 7112 7109 7114 7115 7116 7113 7118 7119 7120 7117 7122 7123 7124 7121 7126 7127 7128 7125 7130 7131 7132 7129 7134 7135 7136 7133 7138 7139 7140 7137 7142 7143 7144 7141 7146 7147 7148 7145 7150 7151 7152 7149 7154 7155 7156 7153 7158 7159 7160 7157 7162 7163 7164 7161 7166 7167 7168 7165 7170 7171 7172 7169 7174 7175 7176 7173 7178 7179 7180 7177 7182 7183 7184 7181 7186 7187 7188 7185 7190 7191 7192 7189 7194 7195 7196 7193 7198 7199 7200 7197 7202 7203 7204 7201 7206 7207 7208 7205 7210 7211 7212 7209 7214 7215 7216 7213 7218 7219 7220 7217 7222 7223 7224 7221 7226 7227 7228 7225 7230 7231 7232 7229 7234 7235 7236 7233 7238 7239 7240 7237 7242 7243 7244 7241 7246 7247 7248 7245 7250 7251 7252 7249 7254 7255 7256 7253 7258 7259 7260 7257 7262 7263 7264 7261 7266 7267 7268 7265 7270 7271 7272 7269 7274 7275 7276 7273 7278 7279 7280 7277 7282 7283 7284 7281 7286 7287 7288 7285 7290 7291 7292 7289 7294 7295 7296 7293 7298 7299 7300 7297 7302 7303 7304 7301 7306 7307 7308 7305 7310 7311 7312 7309 7314 7315 7316 7313 7318 7319 7320 7317 7322 7323 7324 7321 7326 7327 7328 7325 7330 7331 7332 7329 7334 7335 7336 7333 7338 7339 7340 7337 7342 7343 7344 7341 7346 7347 7348 7345 7350 7351 7352 7349 7354 7355 7356 7353 7358 7359 7360 7357 7362 7363 7364 7361 7366 7367 7368 7365 7370 7371 7372 7369 7374 7375 7376 7373 7378 7379 7380 7377 7382 7383 7384 7381 7386 7387 7388 7385 7390 7391 7392 7389 7394 7395 7396 7393 7398 7399 7400 7397 7402 7403 7404 7401 7406 7407 7408 7405 7410 7411 7412 7409 7414 7415 7416 7413 7418 7419 7420 7417 7422 7423 7424 7421 7426 7427 7428 7425 7430 7431 7432 7429 7434 7435 7436 7433 7438 7439 7440 7437 7442 7443 7444 7441 7446 7447 7448 7445 7450 7451 7452 7449 7454 7455 7456 7453 7458 7459 7460 7457 7462 7463 7464 7461 7466 7467 7468 7465 7470 7471 7472 7469 7474 7475 7476 7473 7478 7479 7480 7477 7482 7483 7484 7481 7486 7487 7488 7485 7490 7491 7492 7489 7494 7495 7496 7493 7498 7499 7500 7497 7502 7503 7504 7501 7506 7507 7508 7505 7510 7511 7512 7509 7514 7515 7516 7513 7518 7519 7520 7517 7522 7523 7524 7521 7526 7527 7528 7525 7530 7531 7532 7529 7534 7535 7536 7533 7538 7539 7540 7537 7542 7543 7544 7541 7546 7547 7548 7545 7550 7551 7552 7549 7554 7555 7556 7553 7558 7559 7560 7557 7562 7563 7564 7561 7566 7567 7568 7565 7570 7571 7572 7569 7574 7575 7576 7573 7578 7579 7580 7577 7582 7583 7584 7581 7586 7587 7588 7585 7590 7591 7592 7589 7594 7595 7596 7593 7598 7599 7600 7597 7602 7603 7604 7601 7606 7607 7608 7605 7610 7611 7612 7609 7614 7615 7616 7613 7618 7619 7620 7617 7622 7623 7624 7621 7626 7627 7628 7625 7630 7631 7632 7629 7634 7635 7636 7633 7638 7639 7640 7637 7642 7643 7644 7641 7646 7647 7648 7645 7650 7651 7652 7649 7654 7655 7656 7653 7658 7659 7660 7657 7662 7663 7664 7661 7666 7667 7668 7665 7670 7671 7672 7669 7674 7675 7676 7673 7678 7679 7680 7677 7682 7683 7684 7681 7686 7687 7688 7685 7690 7691 7692 7689 7694 7695 7696 7693 7698 7699 7700 7697 7702 7703 7704 7701 7706 7707 7708 7705 7710 7711 7712 7709 7714 7715 7716 7713 7718 7719 7720 7717 7722 7723 7724 7721 7726 7727 7728 7725 7730 7731 7732 7729 7734 7735 7736 7733 7738 7739 7740 7737 7742 7743 7744 7741 7746 7747 7748 7745 7750 7751 7752 7749 7754 7755 7756 7753 7758 7759 7760 7757 7762 7763 7764 7761 7766 7767 7768 7765 7770 7771 7772 7769 7774 7775 7776 7773 7778 7779 7780 7777 7782 7783 7784 7781 7786 7787 7788 7785 7790 7791 7792 7789 7794 7795 7796 7793 7798 7799 7800 7797 7802 7803 7804 7801 7806 7807 7808 7805 7810 7811 7812 7809 7814 7815 7816 7813 7818 7819 7820 7817 7822 7823 7824 7821 7826 7827 7828 7825 7830 7831 7832 7829 7834 7835 7836 7833 7838 7839 7840 7837 7842 7843 7844 7841 7846 7847 7848 7845 7850 7851 7852 7849 7854 7855 7856 7853 7858 7859 7860 7857 7862 7863 7864 7861 7866 7867 7868 7865 7870 7871 7872 7869 7874 7875 7876 7873 7878 7879 7880 7877 7882 7883 7884 7881 7886 7887 7888 7885 7890 7891 7892 7889 7894 7895 7896 7893 7898 7899 7900 7897 7902 7903 7904 7901 7906 7907 7908 7905 7910 7911 7912 7909 7914 7915 7916 7913 7918 7919 7920 7917 7922 7923 7924 7921 7926 7927 7928 7925 7930 7931 7932 7929 7934 7935 7936 7933 7938 7939 7940 7937 7942 7943 7944 7941 7946 7947 7948 7945 7950 7951 7952 7949 7954 7955 7956 7953 7958 7959 7960 7957 7962 7963 7964 7961 7966 7967 7968 7965 7970 7971 7972 7969 7974 7975 7976 7973 7978 7979 7980 7977 7982 7983 7984 7981 7986 7987 7988 7985 7990 7991 7992 7989 7994 7995 7996 7993 7998 7999 8000 7997 8002 8003 8004 8001 8006 8007 8008 8005 8010 8011 8012 8009 8014 8015 8016 8013 8018 8019 8020 8017 8022 8023 8024 8021 8026 8027 8028 8025 8030 8031 8032 8029 8034 8035 8036 8033 8038 8039 8040 8037 8042 8043 8044 8041 8046 8047 8048 8045 8050 8051 8052 8049 8054 8055 8056 8053 8058 8059 8060 8057 8062 8063 8064 8061 8066 8067 8068 8065 8070 8071 8072 8069 8074 8075 8076 8073 8078 8079 8080 8077 8082 8083 8084 8081 8086 8087 8088 8085 8090 8091 8092 8089 8094 8095 8096 8093 8098 8099 8100 8097 8102 8103 8104 8101 8106 8107 8108 8105 8110 8111 8112 8109 8114 8115 8116 8113 8118 8119 8120 8117 8122 8123 8124 8121 8126 8127 8128 8125 8130 8131 8132 8129 8134 8135 8136 8133 8138 8139 8140 8137 8142 8143 8144 8141 8146 8147 8148 8145 8150 8151 8152 8149 8154 8155 8156 8153 8158 8159 8160 8157 8162 8163 8164 8161 8166 8167 8168 8165 8170 8171 8172 8169 8174 8175 8176 8173 8178 8179 8180 8177 8182 8183 8184 8181 8186 8187 8188 8185 8190 8191 8192 8189 8194 8195 8196 8193 8198 8199 8200 8197 8202 8203 8204 8201 8206 8207 8208 8205 8210 8211 8212 8209 8214 8215 8216 8213 8218 8219 8220 8217 8222 8223 8224 8221 8226 8227 8228 8225 8230 8231 8232 8229 8234 8235 8236 8233 8238 8239 8240 8237 8242 8243 8244 8241 8246 8247 8248 8245 8250 8251 8252 8249 8254 8255 8256 8253 8258 8259 8260 8257 8262 8263 8264 8261 8266 8267 8268 8265 8270 8271 8272 8269 8274 8275 8276 8273 8278 8279 8280 8277 8282 8283 8284 8281 8286 8287 8288 8285 8290 8291 8292 8289 8294 8295 8296 8293 8298 8299 8300 8297 8302 8303 8304 8301 8306 8307 8308 8305 8310 8311 8312 8309 8314 8315 8316 8313 8318 8319 8320 8317 8322 8323 8324 8321 8326 8327 8328 8325 8330 8331 8332 8329 8334 8335 8336 8333 8338 8339 8340 8337 8342 8343 8344 8341 8346 8347 8348 8345 8350 8351 8352 8349 8354 8355 8356 8353 8358 8359 8360 8357 8362 8363 8364 8361 8366 8367 8368 8365 8370 8371 8372 8369 8374 8375 8376 8373 8378 8379 8380 8377 8382 8383 8384 8381 8386 8387 8388 8385 8390 8391 8392 8389 8394 8395 8396 8393 8398 8399 8400 8397 8402 8403 8404 8401 8406 8407 8408 8405 8410 8411 8412 8409 8414 8415 8416 8413 8418 8419 8420 8417 8422 8423 8424 8421 8426 8427 8428 8425 8430 8431 8432 8429 8434 8435 8436 8433 8438 8439 8440 8437 8442 8443 8444 8441 8446 8447 8448 8445 8450 8451 8452 8449 8454 8455 8456 8453 8458 8459 8460 8457 8462 8463 8464 8461 8466 8467 8468 8465 8470 8471 8472 8469 8474 8475 8476 8473 8478 8479 8480 8477 8482 8483 8484 8481 8486 8487 8488 8485 8490 8491 8492 8489 8494 8495 8496 8493 8498 8499 8500 8497 8502 8503 8504 8501 8506 8507 8508 8505 8510 8511 8512 8509 8514 8515 8516 8513 8518 8519 8520 8517 8522 8523 8524 8521 8526 8527 8528 8525 8530 8531 8532 8529 8534 8535 8536 8533 8538 8539 8540 8537 8542 8543 8544 8541 8546 8547 8548 8545 8550 8551 8552 8549 8554 8555 8556 8553 8558 8559 8560 8557 8562 8563 8564 8561 8566 8567 8568 8565 8570 8571 8572 8569 8574 8575 8576 8573 8578 8579 8580 8577 8582 8583 8584 8581 8586 8587 8588 8585 8590 8591 8592 8589 8594 8595 8596 8593 8598 8599 8600 8597 8602 8603 8604 8601 8606 8607 8608 8605 8610 8611 8612 8609 8614 8615 8616 8613 8618 8619 8620 8617 8622 8623 8624 8621 8626 8627 8628 8625 8630 8631 8632 8629 8634 8635 8636 8633 8638 8639 8640 8637 8642 8643 8644 8641 8646 8647 8648 8645 8650 8651 8652 8649 8654 8655 8656 8653 8658 8659 8660 8657 8662 8663 8664 8661 8666 8667 8668 8665 8670 8671 8672 8669 8674 8675 8676 8673 8678 8679 8680 8677 8682 8683 8684 8681 8686 8687 8688 8685 8690 8691 8692 8689 8694 8695 8696 8693 8698 8699 8700 8697 8702 8703 8704 8701 8706 8707 8708 8705 8710 8711 8712 8709 8714 8715 8716 8713 8718 8719 8720 8717 8722 8723 8724 8721 8726 8727 8728 8725 8730 8731 8732 8729 8734 8735 8736 8733 8738 8739 8740 8737 8742 8743 8744 8741 8746 8747 8748 8745 8750 8751 8752 8749 8754 8755 8756 8753 8758 8759 8760 8757 8762 8763 8764 8761 8766 8767 8768 8765 8770 8771 8772 8769 8774 8775 8776 8773 8778 8779 8780 8777 8782 8783 8784 8781 8786 8787 8788 8785 8790 8791 8792 8789 8794 8795 8796 8793 8798 8799 8800 8797 8802 8803 8804 8801 8806 8807 8808 8805 8810 8811 8812 8809 8814 8815 8816 8813 8818 8819 8820 8817 8822 8823 8824 8821 8826 8827 8828 8825 8830 8831 8832 8829 8834 8835 8836 8833 8838 8839 8840 8837 8842 8843 8844 8841 8846 8847 8848 8845 8850 8851 8852 8849 8854 8855 8856 8853 8858 8859 8860 8857 8862 8863 8864 8861 8866 8867 8868 8865 8870 8871 8872 8869 8874 8875 8876 8873 8878 8879 8880 8877 8882 8883 8884 8881 8886 8887 8888 8885 8890 8891 8892 8889 8894 8895 8896 8893 8898 8899 8900 8897 8902 8903 8904 8901 8906 8907 8908 8905 8910 8911 8912 8909 8914 8915 8916 8913 8918 8919 8920 8917 8922 8923 8924 8921 8926 8927 8928 8925 8930 8931 8932 8929 8934 8935 8936 8933 8938 8939 8940 8937 8942 8943 8944 8941 8946 8947 8948 8945 8950 8951 8952 8949 8954 8955 8956 8953 8958 8959 8960 8957 8962 8963 8964 8961 8966 8967 8968 8965 8970 8971 8972 8969 8974 8975 8976 8973 8978 8979 8980 8977 8982 8983 8984 8981 8986 8987 8988 8985 8990 8991 8992 8989 8994 8995 8996 8993 8998 8999 9000 8997 9002 9003 9004 9001 9006 9007 9008 9005 9010 9011 9012 9009 9014 9015 9016 9013 9018 9019 9020 9017 9022 9023 9024 9021 9026 9027 9028 9025 9030 9031 9032 9029 9034 9035 9036 9033 9038 9039 9040 9037 9042 9043 9044 9041 9046 9047 9048 9045 9050 9051 9052 9049 9054 9055 9056 9053 9058 9059 9060 9057 9062 9063 9064 9061 9066 9067 9068 9065 9070 9071 9072 9069 9074 9075 9076 9073 9078 9079 9080 9077 9082 9083 9084 9081 9086 9087 9088 9085 9090 9091 9092 9089 9094 9095 9096 9093 9098 9099 9100 9097 9102 9103 9104 9101 9106 9107 9108 9105 9110 9111 9112 9109 9114 9115 9116 9113 9118 9119 9120 9117 9122 9123 9124 9121 9126 9127 9128 9125 9130 9131 9132 9129 9134 9135 9136 9133 9138 9139 9140 9137 9142 9143 9144 9141 9146 9147 9148 9145 9150 9151 9152 9149 9154 9155 9156 9153 9158 9159 9160 9157 9162 9163 9164 9161 9166 9167 9168 9165 9170 9171 9172 9169 9174 9175 9176 9173 9178 9179 9180 9177 9182 9183 9184 9181 9186 9187 9188 9185 9190 9191 9192 9189 9194 9195 9196 9193 9198 9199 9200 9197 9202 9203 9204 9201 9206 9207 9208 9205 9210 9211 9212 9209 9214 9215 9216 9213 9218 9219 9220 9217 9222 9223 9224 9221 9226 9227 9228 9225 9230 9231 9232 9229 9234 9235 9236 9233 9238 9239 9240 9237 9242 9243 9244 9241 9246 9247 9248 9245 9250 9251 9252 9249 9254 9255 9256 9253 9258 9259 9260 9257 9262 9263 9264 9261 9266 9267 9268 9265 9270 9271 9272 9269 9274 9275 9276 9273 9278 9279 9280 9277 9282 9283 9284 9281 9286 9287 9288 9285 9290 9291 9292 9289 9294 9295 9296 9293 9298 9299 9300 9297 9302 9303 9304 9301 9306 9307 9308 9305 9310 9311 9312 9309 9314 9315 9316 9313 9318 9319 9320 9317 9322 9323 9324 9321 9326 9327 9328 9325 9330 9331 9332 9329 9334 9335 9336 9333 9338 9339 9340 9337 9342 9343 9344 9341 9346 9347 9348 9345 9350 9351 9352 9349 9354 9355 9356 9353 9358 9359 9360 9357 9362 9363 9364 9361 9366 9367 9368 9365 9370 9371 9372 9369 9374 9375 9376 9373 9378 9379 9380 9377 9382 9383 9384 9381 9386 9387 9388 9385 9390 9391 9392 9389 9394 9395 9396 9393 9398 9399 9400 9397 9402 9403 9404 9401 9406 9407 9408 9405 9410 9411 9412 9409 9414 9415 9416 9413 9418 9419 9420 9417 9422 9423 9424 9421 9426 9427 9428 9425 9430 9431 9432 9429 9434 9435 9436 9433 9438 9439 9440 9437 9442 9443 9444 9441 9446 9447 9448 9445 9450 9451 9452 9449 9454 9455 9456 9453 9458 9459 9460 9457 9462 9463 9464 9461 9466 9467 9468 9465 9470 9471 9472 9469 9474 9475 9476 9473 9478 9479 9480 9477 9482 9483 9484 9481 9486 9487 9488 9485 9490 9491 9492 9489 9494 9495 9496 9493 9498 9499 9500 9497 9502 9503 9504 9501 9506 9507 9508 9505 9510 9511 9512 9509 9514 9515 9516 9513 9518 9519 9520 9517 9522 9523 9524 9521 9526 9527 9528 9525 9530 9531 9532 9529 9534 9535 9536 9533 9538 9539 9540 9537 9542 9543 9544 9541 9546 9547 9548 9545 9550 9551 9552 9549 9554 9555 9556 9553 9558 9559 9560 9557 9562 9563 9564 9561 9566 9567 9568 9565 9570 9571 9572 9569 9574 9575 9576 9573 9578 9579 9580 9577 9582 9583 9584 9581 9586 9587 9588 9585 9590 9591 9592 9589 9594 9595 9596 9593 9598 9599 9600 9597 9602 9603 9604 9601 9606 9607 9608 9605 9610 9611 9612 9609 9614 9615 9616 9613 9618 9619 9620 9617 9622 9623 9624 9621 9626 9627 9628 9625 9630 9631 9632 9629 9634 9635 9636 9633 9638 9639 9640 9637 9642 9643 9644 9641 9646 9647 9648 9645 9650 9651 9652 9649 9654 9655 9656 9653 9658 9659 9660 9657 9662 9663 9664 9661 9666 9667 9668 9665 9670 9671 9672 9669 9674 9675 9676 9673 9678 9679 9680 9677 9682 9683 9684 9681 9686 9687 9688 9685 9690 9691 9692 9689 9694 9695 9696 9693 9698 9699 9700 9697 9702 9703 9704 9701 9706 9707 9708 9705 9710 9711 9712 9709 9714 9715 9716 9713 9718 9719 9720 9717 9722 9723 9724 9721 9726 9727 9728 9725 9730 9731 9732 9729 9734 9735 9736 9733 9738 9739 9740 9737 9742 9743 9744 9741 9746 9747 9748 9745 9750 9751 9752 9749 9754 9755 9756 9753 9758 9759 9760 9757 9762 9763 9764 9761 9766 9767 9768 9765 9770 9771 9772 9769 9774 9775 9776 9773 9778 9779 9780 9777 9782 9783 9784 9781 9786 9787 9788 9785 9790 9791 9792 9789 9794 9795 9796 9793 9798 9799 9800 9797 9802 9803 9804 9801 9806 9807 9808 9805 9810 9811 9812 9809 9814 9815 9816 9813 9818 9819 9820 9817 9822 9823 9824 9821 9826 9827 9828 9825 9830 9831 9832 9829 9834 9835 9836 9833 9838 9839 9840 9837 9842 9843 9844 9841 9846 9847 9848 9845 9850 9851 9852 9849 9854 9855 9856 9853 9858 9859 9860 9857 9862 9863 9864 9861 9866 9867 9868 9865 9870 9871 9872 9869 9874 9875 9876 9873 9878 9879 9880 9877 9882 9883 9884 9881 9886 9887 9888 9885 9890 9891 9892 9889 9894 9895 9896 9893 9898 9899 9900 9897 9902 9903 9904 9901 9906 9907 9908 9905 9910 9911 9912 9909 9914 9915 9916 9913 9918 9919 9920 9917 9922 9923 9924 9921 9926 9927 9928 9925 9930 9931 9932 9929 9934 9935 9936 9933 9938 9939 9940 9937 9942 9943 9944 9941 9946 9947 9948 9945 9950 9951 9952 9949 9954 9955 9956 9953 9958 9959 9960 9957 9962 9963 9964 9961 9966 9967 9968 9965 9970 9971 9972 9969 9974 9975 9976 9973 9978 9979 9980 9977 9982 9983 9984 9981 9986 9987 9988 9985 9990 9991 9992 9989 9994 9995 9996 9993 9998 9999 10000 9997 10002 10003 10004 10001 10006 10007 10008 10005 10010 10011 10012 10009 10014 10015 10016 10013 10018 10019 10020 10017 10022 10023 10024 10021 10026 10027 10028 10025 10030 10031 10032 10029 10034 10035 10036 10033 10038 10039 10040 10037 10042 10043 10044 10041 10046 10047 10048 10045 10050 10051 10052 10049 10054 10055 10056 10053 10058 10059 10060 10057 10062 10063 10064 10061 10066 10067 10068 10065 10070 10071 10072 10069 10074 10075 10076 10073 10078 10079 10080 10077 10082 10083 10084 10081 10086 10087 10088 10085 10090 10091 10092 10089 10094 10095 10096 10093 10098 10099 10100 10097 10102 10103 10104 10101 10106 10107 10108 10105 10110 10111 10112 10109 10114 10115 10116 10113 10118 10119 10120 10117 10122 10123 10124 10121 10126 10127 10128 10125 10130 10131 10132 10129 10134 10135 10136 10133 10138 10139 10140 10137 10142 10143 10144 10141 10146 10147 10148 10145 10150 10151 10152 10149 10154 10155 10156 10153 10158 10159 10160 10157 10162 10163 10164 10161 10166 10167 10168 10165 10170 10171 10172 10169 10174 10175 10176 10173 10178 10179 10180 10177 10182 10183 10184 10181 10186 10187 10188 10185 10190 10191 10192 10189 10194 10195 10196 10193 10198 10199 10200 10197 10202 10203 10204 10201 10206 10207 10208 10205 10210 10211 10212 10209 10214 10215 10216 10213 10218 10219 10220 10217 10222 10223 10224 10221 10226 10227 10228 10225 10230 10231 10232 10229 10234 10235 10236 10233 10238 10239 10240 10237 10242 10243 10244 10241 10246 10247 10248 10245 10250 10251 10252 10249 10254 10255 10256 10253 10258 10259 10260 10257 10262 10263 10264 10261 10266 10267 10268 10265 10270 10271 10272 10269 10274 10275 10276 10273 10278 10279 10280 10277 10282 10283 10284 10281 10286 10287 10288 10285 10290 10291 10292 10289 10294 10295 10296 10293 10298 10299 10300 10297 10302 10303 10304 10301 10306 10307 10308 10305 10310 10311 10312 10309 10314 10315 10316 10313 10318 10319 10320 10317 10322 10323 10324 10321 10326 10327 10328 10325 10330 10331 10332 10329 10334 10335 10336 10333 10338 10339 10340 10337 10342 10343 10344 10341 10346 10347 10348 10345 10350 10351 10352 10349 10354 10355 10356 10353 10358 10359 10360 10357 10362 10363 10364 10361 10366 10367 10368 10365 10370 10371 10372 10369 10374 10375 10376 10373 10378 10379 10380 10377 10382 10383 10384 10381 10386 10387 10388 10385 10390 10391 10392 10389 10394 10395 10396 10393 10398 10399 10400 10397 10402 10403 10404 10401 10406 10407 10408 10405 10410 10411 10412 10409 10414 10415 10416 10413 10418 10419 10420 10417 10422 10423 10424 10421 10426 10427 10428 10425 10430 10431 10432 10429 10434 10435 10436 10433 10438 10439 10440 10437 10442 10443 10444 10441 10446 10447 10448 10445 10450 10451 10452 10449 10454 10455 10456 10453 10458 10459 10460 10457 10462 10463 10464 10461 10466 10467 10468 10465 10470 10471 10472 10469 10474 10475 10476 10473 10478 10479 10480 10477 10482 10483 10484 10481 10486 10487 10488 10485 10490 10491 10492 10489 10494 10495 10496 10493 10498 10499 10500 10497 10502 10503 10504 10501 10506 10507 10508 10505 10510 10511 10512 10509 10514 10515 10516 10513 10518 10519 10520 10517 10522 10523 10524 10521 10526 10527 10528 10525 10530 10531 10532 10529 10534 10535 10536 10533 10538 10539 10540 10537 10542 10543 10544 10541 10546 10547 10548 10545 10550 10551 10552 10549 10554 10555 10556 10553 10558 10559 10560 10557 10562 10563 10564 10561 10566 10567 10568 10565 10570 10571 10572 10569 10574 10575 10576 10573 10578 10579 10580 10577 10582 10583 10584 10581 10586 10587 10588 10585 10590 10591 10592 10589 10594 10595 10596 10593 10598 10599 10600 10597 10602 10603 10604 10601 10606 10607 10608 10605 10610 10611 10612 10609 10614 10615 10616 10613 10618 10619 10620 10617 10622 10623 10624 10621 10626 10627 10628 10625 10630 10631 10632 10629 10634 10635 10636 10633 10638 10639 10640 10637 10642 10643 10644 10641 10646 10647 10648 10645 10650 10651 10652 10649 10654 10655 10656 10653 10658 10659 10660 10657 10662 10663 10664 10661 10666 10667 10668 10665 10670 10671 10672 10669 10674 10675 10676 10673 10678 10679 10680 10677 10682 10683 10684 10681 10686 10687 10688 10685 10690 10691 10692 10689 10694 10695 10696 10693 10698 10699 10700 10697 10702 10703 10704 10701 10706 10707 10708 10705 10710 10711 10712 10709 10714 10715 10716 10713 10718 10719 10720 10717 10722 10723 10724 10721 10726 10727 10728 10725 10730 10731 10732 10729 10734 10735 10736 10733 10738 10739 10740 10737 10742 10743 10744 10741 10746 10747 10748 10745 10750 10751 10752 10749 10754 10755 10756 10753 10758 10759 10760 10757 10762 10763 10764 10761 10766 10767 10768 10765 10770 10771 10772 10769 10774 10775 10776 10773 10778 10779 10780 10777 10782 10783 10784 10781 10786 10787 10788 10785 10790 10791 10792 10789 10794 10795 10796 10793 10798 10799 10800 10797 10802 10803 10804 10801 10806 10807 10808 10805 10810 10811 10812 10809 10814 10815 10816 10813 10818 10819 10820 10817 10822 10823 10824 10821 10826 10827 10828 10825 10830 10831 10832 10829 10834 10835 10836 10833 10838 10839 10840 10837 10842 10843 10844 10841 10846 10847 10848 10845 10850 10851 10852 10849 10854 10855 10856 10853 10858 10859 10860 10857 10862 10863 10864 10861 10866 10867 10868 10865 10870 10871 10872 10869 10874 10875 10876 10873 10878 10879 10880 10877 10882 10883 10884 10881 10886 10887 10888 10885 10890 10891 10892 10889 10894 10895 10896 10893 10898 10899 10900 10897 10902 10903 10904 10901 10906 10907 10908 10905 10910 10911 10912 10909 10914 10915 10916 10913 10918 10919 10920 10917 10922 10923 10924 10921 10926 10927 10928 10925 10930 10931 10932 10929 10934 10935 10936 10933 10938 10939 10940 10937 10942 10943 10944 10941 10946 10947 10948 10945 10950 10951 10952 10949 10954 10955 10956 10953 10958 10959 10960 10957 10962 10963 10964 10961 10966 10967 10968 10965 10970 10971 10972 10969 10974 10975 10976 10973 10978 10979 10980 10977 10982 10983 10984 10981 10986 10987 10988 10985 10990 10991 10992 10989 10994 10995 10996 10993 10998 10999 11000 10997 11002 11003 11004 11001 11006 11007 11008 11005 11010 11011 11012 11009 11014 11015 11016 11013 11018 11019 11020 11017 11022 11023 11024 11021 11026 11027 11028 11025 11030 11031 11032 11029 11034 11035 11036 11033 11038 11039 11040 11037 11042 11043 11044 11041 11046 11047 11048 11045 11050 11051 11052 11049 11054 11055 11056 11053 11058 11059 11060 11057 11062 11063 11064 11061 11066 11067 11068 11065 11070 11071 11072 11069 11074 11075 11076 11073 11078 11079 11080 11077 11082 11083 11084 11081 11086 11087 11088 11085 11090 11091 11092 11089 11094 11095 11096 11093 11098 11099 11100 11097 11102 11103 11104 11101 11106 11107 11108 11105 11110 11111 11112 11109 11114 11115 11116 11113 11118 11119 11120 11117 11122 11123 11124 11121 11126 11127 11128 11125 11130 11131 11132 11129 11134 11135 11136 11133 11138 11139 11140 11137 11142 11143 11144 11141 11146 11147 11148 11145 11150 11151 11152 11149 11154 11155 11156 11153 11158 11159 11160 11157 11162 11163 11164 11161 11166 11167 11168 11165 11170 11171 11172 11169 11174 11175 11176 11173 11178 11179 11180 11177 11182 11183 11184 11181 11186 11187 11188 11185 11190 11191 11192 11189 11194 11195 11196 11193 11198 11199 11200 11197 11202 11203 11204 11201 11206 11207 11208 11205 11210 11211 11212 11209 11214 11215 11216 11213 11218 11219 11220 11217 11222 11223 11224 11221 11226 11227 11228 11225 11230 11231 11232 11229 11234 11235 11236 11233 11238 11239 11240 11237 11242 11243 11244 11241 11246 11247 11248 11245 11250 11251 11252 11249 11254 11255 11256 11253 11258 11259 11260 11257 11262 11263 11264 11261 11266 11267 11268 11265 11270 11271 11272 11269 11274 11275 11276 11273 11278 11279 11280 11277 11282 11283 11284 11281 11286 11287 11288 11285 11290 11291 11292 11289 11294 11295 11296 11293 11298 11299 11300 11297 11302 11303 11304 11301 11306 11307 11308 11305 11310 11311 11312 11309 11314 11315 11316 11313 11318 11319 11320 11317 11322 11323 11324 11321 11326 11327 11328 11325 11330 11331 11332 11329 11334 11335 11336 11333 11338 11339 11340 11337 11342 11343 11344 11341 11346 11347 11348 11345 11350 11351 11352 11349 11354 11355 11356 11353 11358 11359 11360 11357 11362 11363 11364 11361 11366 11367 11368 11365 11370 11371 11372 11369 11374 11375 11376 11373 11378 11379 11380 11377 11382 11383 11384 11381 11386 11387 11388 11385 11390 11391 11392 11389 11394 11395 11396 11393 11398 11399 11400 11397 11402 11403 11404 11401 11406 11407 11408 11405 11410 11411 11412 11409 11414 11415 11416 11413 11418 11419 11420 11417 11422 11423 11424 11421 11426 11427 11428 11425 11430 11431 11432 11429 11434 11435 11436 11433 11438 11439 11440 11437 11442 11443 11444 11441 11446 11447 11448 11445 11450 11451 11452 11449 11454 11455 11456 11453 11458 11459 11460 11457 11462 11463 11464 11461 11466 11467 11468 11465 11470 11471 11472 11469 11474 11475 11476 11473 11478 11479 11480 11477 11482 11483 11484 11481 11486 11487 11488 11485 11490 11491 11492 11489 11494 11495 11496 11493 11498 11499 11500 11497 11502 11503 11504 11501 11506 11507 11508 11505 11510 11511 11512 11509 11514 11515 11516 11513 11518 11519 11520 11517 11522 11523 11524 11521 11526 11527 11528 11525 11530 11531 11532 11529 11534 11535 11536 11533 11538 11539 11540 11537 11542 11543 11544 11541 11546 11547 11548 11545 11550 11551 11552 11549 11554 11555 11556 11553 11558 11559 11560 11557 11562 11563 11564 11561 11566 11567 11568 11565 11570 11571 11572 11569 11574 11575 11576 11573 11578 11579 11580 11577 11582 11583 11584 11581 11586 11587 11588 11585 11590 11591 11592 11589 11594 11595 11596 11593 11598 11599 11600 11597 11602 11603 11604 11601 11606 11607 11608 11605 11610 11611 11612 11609 11614 11615 11616 11613 11618 11619 11620 11617 11622 11623 11624 11621 11626 11627 11628 11625 11630 11631 11632 11629 11634 11635 11636 11633 11638 11639 11640 11637 11642 11643 11644 11641 11646 11647 11648 11645 11650 11651 11652 11649 11654 11655 11656 11653 11658 11659 11660 11657 11662 11663 11664 11661 11666 11667 11668 11665 11670 11671 11672 11669 11674 11675 11676 11673 11678 11679 11680 11677 11682 11683 11684 11681 11686 11687 11688 11685 11690 11691 11692 11689 11694 11695 11696 11693 11698 11699 11700 11697 11702 11703 11704 11701 11706 11707 11708 11705 11710 11711 11712 11709 11714 11715 11716 11713 11718 11719 11720 11717 11722 11723 11724 11721 11726 11727 11728 11725 11730 11731 11732 11729 11734 11735 11736 11733 11738 11739 11740 11737 11742 11743 11744 11741 11746 11747 11748 11745 11750 11751 11752 11749 11754 11755 11756 11753 11758 11759 11760 11757 11762 11763 11764 11761 11766 11767 11768 11765 11770 11771 11772 11769 11774 11775 11776 11773 11778 11779 11780 11777 11782 11783 11784 11781 11786 11787 11788 11785 11790 11791 11792 11789 11794 11795 11796 11793 11798 11799 11800 11797 11802 11803 11804 11801 11806 11807 11808 11805 11810 11811 11812 11809 11814 11815 11816 11813 11818 11819 11820 11817 11822 11823 11824 11821 11826 11827 11828 11825 11830 11831 11832 11829 11834 11835 11836 11833 11838 11839 11840 11837 11842 11843 11844 11841 11846 11847 11848 11845 11850 11851 11852 11849 11854 11855 11856 11853 11858 11859 11860 11857 11862 11863 11864 11861 11866 11867 11868 11865 11870 11871 11872 11869 11874 11875 11876 11873 11878 11879 11880 11877 11882 11883 11884 11881 11886 11887 11888 11885 11890 11891 11892 11889 11894 11895 11896 11893 11898 11899 11900 11897 11902 11903 11904 11901 11906 11907 11908 11905 11910 11911 11912 11909 11914 11915 11916 11913 11918 11919 11920 11917 11922 11923 11924 11921 11926 11927 11928 11925 11930 11931 11932 11929 11934 11935 11936 11933 11938 11939 11940 11937 11942 11943 11944 11941 11946 11947 11948 11945 11950 11951 11952 11949 11954 11955 11956 11953 11958 11959 11960 11957 11962 11963 11964 11961 11966 11967 11968 11965 11970 11971 11972 11969 11974 11975 11976 11973 11978 11979 11980 11977 11982 11983 11984 11981 11986 11987 11988 11985 11990 11991 11992 11989 11994 11995 11996 11993 11998 11999 12000 11997 12002 12003 12004 12001 12006 12007 12008 12005 12010 12011 12012 12009 12014 12015 12016 12013 12018 12019 12020 12017 12022 12023 12024 12021 12026 12027 12028 12025 12030 12031 12032 12029 12034 12035 12036 12033 12038 12039 12040 12037 12042 12043 12044 12041 12046 12047 12048 12045 12050 12051 12052 12049 12054 12055 12056 12053 12058 12059 12060 12057 12062 12063 12064 12061 12066 12067 12068 12065 12070 12071 12072 12069 12074 12075 12076 12073 12078 12079 12080 12077 12082 12083 12084 12081 12086 12087 12088 12085 12090 12091 12092 12089 12094 12095 12096 12093 12098 12099 12100 12097 12102 12103 12104 12101 12106 12107 12108 12105 12110 12111 12112 12109 12114 12115 12116 12113 12118 12119 12120 12117 12122 12123 12124 12121 12126 12127 12128 12125 12130 12131 12132 12129 12134 12135 12136 12133 12138 12139 12140 12137 12142 12143 12144 12141 12146 12147 12148 12145 12150 12151 12152 12149 12154 12155 12156 12153 12158 12159 12160 12157 12162 12163 12164 12161 12166 12167 12168 12165 12170 12171 12172 12169 12174 12175 12176 12173 12178 12179 12180 12177 12182 12183 12184 12181 12186 12187 12188 12185 12190 12191 12192 12189 12194 12195 12196 12193 12198 12199 12200 12197 12202 12203 12204 12201 12206 12207 12208 12205 12210 12211 12212 12209 12214 12215 12216 12213 12218 12219 12220 12217 12222 12223 12224 12221 12226 12227 12228 12225 12230 12231 12232 12229 12234 12235 12236 12233 12238 12239 12240 12237 12242 12243 12244 12241 12246 12247 12248 12245 12250 12251 12252 12249 12254 12255 12256 12253 12258 12259 12260 12257 12262 12263 12264 12261 12266 12267 12268 12265 12270 12271 12272 12269 12274 12275 12276 12273 12278 12279 12280 12277 12282 12283 12284 12281 12286 12287 12288 12285 12290 12291 12292 12289 12294 12295 12296 12293 12298 12299 12300 12297 12302 12303 12304 12301 12306 12307 12308 12305 12310 12311 12312 12309 12314 12315 12316 12313 12318 12319 12320 12317 12322 12323 12324 12321 12326 12327 12328 12325 12330 12331 12332 12329 12334 12335 12336 12333 12338 12339 12340 12337 12342 12343 12344 12341 12346 12347 12348 12345 12350 12351 12352 12349 12354 12355 12356 12353 12358 12359 12360 12357 12362 12363 12364 12361 12366 12367 12368 12365 12370 12371 12372 12369 12374 12375 12376 12373 12378 12379 12380 12377 12382 12383 12384 12381 12386 12387 12388 12385 12390 12391 12392 12389 12394 12395 12396 12393 12398 12399 12400 12397 12402 12403 12404 12401 12406 12407 12408 12405 12410 12411 12412 12409 12414 12415 12416 12413 12418 12419 12420 12417 12422 12423 12424 12421 12426 12427 12428 12425 12430 12431 12432 12429 12434 12435 12436 12433 12438 12439 12440 12437 12442 12443 12444 12441 12446 12447 12448 12445 12450 12451 12452 12449 12454 12455 12456 12453 12458 12459 12460 12457 12462 12463 12464 12461 12466 12467 12468 12465 12470 12471 12472 12469 12474 12475 12476 12473 12478 12479 12480 12477 12482 12483 12484 12481 12486 12487 12488 12485 12490 12491 12492 12489 12494 12495 12496 12493 12498 12499 12500 12497 12502 12503 12504 12501 12506 12507 12508 12505 12510 12511 12512 12509 12514 12515 12516 12513 12518 12519 12520 12517 12522 12523 12524 12521 12526 12527 12528 12525 12530 12531 12532 12529 12534 12535 12536 12533 12538 12539 12540 12537 12542 12543 12544 12541 12546 12547 12548 12545 12550 12551 12552 12549 12554 12555 12556 12553 12558 12559 12560 12557 12562 12563 12564 12561 12566 12567 12568 12565 12570 12571 12572 12569 12574 12575 12576 12573 12578 12579 12580 12577 12582 12583 12584 12581 12586 12587 12588 12585 12590 12591 12592 12589 12594 12595 12596 12593 12598 12599 12600 12597 12602 12603 12604 12601 12606 12607 12608 12605 12610 12611 12612 12609 12614 12615 12616 12613 12618 12619 12620 12617 12622 12623 12624 12621 12626 12627 12628 12625 12630 12631 12632 12629 12634 12635 12636 12633 12638 12639 12640 12637 12642 12643 12644 12641 12646 12647 12648 12645 12650 12651 12652 12649 12654 12655 12656 12653 12658 12659 12660 12657 12662 12663 12664 12661 12666 12667 12668 12665 12670 12671 12672 12669 12674 12675 12676 12673 12678 12679 12680 12677 12682 12683 12684 12681 12686 12687 12688 12685 12690 12691 12692 12689 12694 12695 12696 12693 12698 12699 12700 12697 12702 12703 12704 12701 12706 12707 12708 12705 12710 12711 12712 12709 12714 12715 12716 12713 12718 12719 12720 12717 12722 12723 12724 12721 12726 12727 12728 12725 12730 12731 12732 12729 12734 12735 12736 12733 12738 12739 12740 12737 12742 12743 12744 12741 12746 12747 12748 12745 12750 12751 12752 12749 12754 12755 12756 12753 12758 12759 12760 12757 12762 12763 12764 12761 12766 12767 12768 12765 12770 12771 12772 12769 12774 12775 12776 12773 12778 12779 12780 12777 12782 12783 12784 12781 12786 12787 12788 12785 12790 12791 12792 12789 12794 12795 12796 12793 12798 12799 12800 12797 12802 12803 12804 12801 12806 12807 12808 12805 12810 12811 12812 12809 12814 12815 12816 12813 12818 12819 12820 12817 12822 12823 12824 12821 12826 12827 12828 12825 12830 12831 12832 12829 12834 12835 12836 12833 12838 12839 12840 12837 12842 12843 12844 12841 12846 12847 12848 12845 12850 12851 12852 12849 12854 12855 12856 12853 12858 12859 12860 12857 12862 12863 12864 12861 12866 12867 12868 12865 12870 12871 12872 12869 12874 12875 12876 12873 12878 12879 12880 12877 12882 12883 12884 12881 12886 12887 12888 12885 12890 12891 12892 12889 12894 12895 12896 12893 12898 12899 12900 12897 12902 12903 12904 12901 12906 12907 12908 12905 12910 12911 12912 12909 12914 12915 12916 12913 12918 12919 12920 12917 12922 12923 12924 12921 12926 12927 12928 12925 12930 12931 12932 12929 12934 12935 12936 12933 12938 12939 12940 12937 12942 12943 12944 12941 12946 12947 12948 12945 12950 12951 12952 12949 12954 12955 12956 12953 12958 12959 12960 12957 12962 12963 12964 12961 12966 12967 12968 12965 12970 12971 12972 12969 12974 12975 12976 12973 12978 12979 12980 12977 12982 12983 12984 12981 12986 12987 12988 12985 12990 12991 12992 12989 12994 12995 12996 12993 12998 12999 13000 12997 13002 13003 13004 13001 13006 13007 13008 13005 13010 13011 13012 13009 13014 13015 13016 13013 13018 13019 13020 13017 13022 13023 13024 13021 13026 13027 13028 13025 13030 13031 13032 13029 13034 13035 13036 13033 13038 13039 13040 13037 13042 13043 13044 13041 13046 13047 13048 13045 13050 13051 13052 13049 13054 13055 13056 13053 13058 13059 13060 13057 13062 13063 13064 13061 13066 13067 13068 13065 13070 13071 13072 13069 13074 13075 13076 13073 13078 13079 13080 13077 13082 13083 13084 13081 13086 13087 13088 13085 13090 13091 13092 13089 13094 13095 13096 13093 13098 13099 13100 13097 13102 13103 13104 13101 13106 13107 13108 13105 13110 13111 13112 13109 13114 13115 13116 13113 13118 13119 13120 13117 13122 13123 13124 13121 13126 13127 13128 13125 13130 13131 13132 13129 13134 13135 13136 13133 13138 13139 13140 13137 13142 13143 13144 13141 13146 13147 13148 13145 13150 13151 13152 13149 13154 13155 13156 13153 13158 13159 13160 13157 13162 13163 13164 13161 13166 13167 13168 13165 13170 13171 13172 13169 13174 13175 13176 13173 13178 13179 13180 13177 13182 13183 13184 13181 13186 13187 13188 13185 13190 13191 13192 13189 13194 13195 13196 13193 13198 13199 13200 13197 13202 13203 13204 13201 13206 13207 13208 13205 13210 13211 13212 13209 13214 13215 13216 13213 13218 13219 13220 13217 13222 13223 13224 13221 13226 13227 13228 13225 13230 13231 13232 13229 13234 13235 13236 13233 13238 13239 13240 13237 13242 13243 13244 13241 13246 13247 13248 13245 13250 13251 13252 13249 13254 13255 13256 13253 13258 13259 13260 13257 13262 13263 13264 13261 13266 13267 13268 13265 13270 13271 13272 13269 13274 13275 13276 13273 13278 13279 13280 13277 13282 13283 13284 13281 13286 13287 13288 13285 13290 13291 13292 13289 13294 13295 13296 13293 13298 13299 13300 13297 13302 13303 13304 13301 13306 13307 13308 13305 13310 13311 13312 13309 13314 13315 13316 13313 13318 13319 13320 13317 13322 13323 13324 13321 13326 13327 13328 13325 13330 13331 13332 13329 13334 13335 13336 13333 13338 13339 13340 13337 13342 13343 13344 13341 13346 13347 13348 13345 13350 13351 13352 13349 13354 13355 13356 13353 13358 13359 13360 13357 13362 13363 13364 13361 13366 13367 13368 13365 13370 13371 13372 13369 13374 13375 13376 13373 13378 13379 13380 13377 13382 13383 13384 13381 13386 13387 13388 13385 13390 13391 13392 13389 13394 13395 13396 13393 13398 13399 13400 13397 13402 13403 13404 13401 13406 13407 13408 13405 13410 13411 13412 13409 13414 13415 13416 13413 13418 13419 13420 13417 13422 13423 13424 13421 13426 13427 13428 13425 13430 13431 13432 13429 13434 13435 13436 13433 13438 13439 13440 13437 13442 13443 13444 13441 13446 13447 13448 13445 13450 13451 13452 13449 13454 13455 13456 13453 13458 13459 13460 13457 13462 13463 13464 13461 13466 13467 13468 13465 13470 13471 13472 13469 13474 13475 13476 13473 13478 13479 13480 13477 13482 13483 13484 13481 13486 13487 13488 13485 13490 13491 13492 13489 13494 13495 13496 13493 13498 13499 13500 13497 13502 13503 13504 13501 13506 13507 13508 13505 13510 13511 13512 13509 13514 13515 13516 13513 13518 13519 13520 13517 13522 13523 13524 13521 13526 13527 13528 13525 13530 13531 13532 13529 13534 13535 13536 13533 13538 13539 13540 13537 13542 13543 13544 13541 13546 13547 13548 13545 13550 13551 13552 13549 13554 13555 13556 13553 13558 13559 13560 13557 13562 13563 13564 13561 13566 13567 13568 13565 13570 13571 13572 13569 13574 13575 13576 13573 13578 13579 13580 13577 13582 13583 13584 13581 13586 13587 13588 13585 13590 13591 13592 13589 13594 13595 13596 13593 13598 13599 13600 13597 13602 13603 13604 13601 13606 13607 13608 13605 13610 13611 13612 13609 13614 13615 13616 13613 13618 13619 13620 13617 13622 13623 13624 13621 13626 13627 13628 13625 13630 13631 13632 13629 13634 13635 13636 13633 13638 13639 13640 13637 13642 13643 13644 13641 13646 13647 13648 13645 13650 13651 13652 13649 13654 13655 13656 13653 13658 13659 13660 13657 13662 13663 13664 13661 13666 13667 13668 13665 13670 13671 13672 13669 13674 13675 13676 13673 13678 13679 13680 13677 13682 13683 13684 13681 13686 13687 13688 13685 13690 13691 13692 13689 13694 13695 13696 13693 13698 13699 13700 13697 13702 13703 13704 13701 13706 13707 13708 13705 13710 13711 13712 13709 13714 13715 13716 13713 13718 13719 13720 13717 13722 13723 13724 13721 13726 13727 13728 13725 13730 13731 13732 13729 13734 13735 13736 13733 13738 13739 13740 13737 13742 13743 13744 13741 13746 13747 13748 13745 13750 13751 13752 13749 13754 13755 13756 13753 13758 13759 13760 13757 13762 13763 13764 13761 13766 13767 13768 13765 13770 13771 13772 13769 13774 13775 13776 13773 13778 13779 13780 13777 13782 13783 13784 13781 13786 13787 13788 13785 13790 13791 13792 13789 13794 13795 13796 13793 13798 13799 13800 13797 13802 13803 13804 13801 13806 13807 13808 13805 13810 13811 13812 13809 13814 13815 13816 13813 13818 13819 13820 13817 13822 13823 13824 13821 13826 13827 13828 13825 13830 13831 13832 13829 13834 13835 13836 13833 13838 13839 13840 13837 13842 13843 13844 13841 13846 13847 13848 13845 13850 13851 13852 13849 13854 13855 13856 13853 13858 13859 13860 13857 13862 13863 13864 13861 13866 13867 13868 13865 13870 13871 13872 13869 13874 13875 13876 13873 13878 13879 13880 13877 13882 13883 13884 13881 13886 13887 13888 13885 13890 13891 13892 13889 13894 13895 13896 13893 13898 13899 13900 13897 13902 13903 13904 13901 13906 13907 13908 13905 13910 13911 13912 13909 13914 13915 13916 13913 13918 13919 13920 13917 13922 13923 13924 13921 13926 13927 13928 13925 13930 13931 13932 13929 13934 13935 13936 13933 13938 13939 13940 13937 13942 13943 13944 13941 13946 13947 13948 13945 13950 13951 13952 13949 13954 13955 13956 13953 13958 13959 13960 13957 13962 13963 13964 13961 13966 13967 13968 13965 13970 13971 13972 13969 13974 13975 13976 13973 13978 13979 13980 13977 13982 13983 13984 13981 13986 13987 13988 13985 13990 13991 13992 13989 13994 13995 13996 13993 13998 13999 14000 13997 14002 14003 14004 14001 14006 14007 14008 14005 14010 14011 14012 14009 14014 14015 14016 14013 14018 14019 14020 14017 14022 14023 14024 14021 14026 14027 14028 14025 14030 14031 14032 14029 14034 14035 14036 14033 14038 14039 14040 14037 14042 14043 14044 14041 14046 14047 14048 14045 14050 14051 14052 14049 14054 14055 14056 14053 14058 14059 14060 14057 14062 14063 14064 14061 14066 14067 14068 14065 14070 14071 14072 14069 14074 14075 14076 14073 14078 14079 14080 14077 14082 14083 14084 14081 14086 14087 14088 14085 14090 14091 14092 14089 14094 14095 14096 14093 14098 14099 14100 14097 14102 14103 14104 14101 14106 14107 14108 14105 14110 14111 14112 14109 14114 14115 14116 14113 14118 14119 14120 14117 14122 14123 14124 14121 14126 14127 14128 14125 14130 14131 14132 14129 14134 14135 14136 14133 14138 14139 14140 14137 14142 14143 14144 14141 14146 14147 14148 14145 14150 14151 14152 14149 14154 14155 14156 14153 14158 14159 14160 14157 14162 14163 14164 14161 14166 14167 14168 14165 14170 14171 14172 14169 14174 14175 14176 14173 14178 14179 14180 14177 14182 14183 14184 14181 14186 14187 14188 14185 14190 14191 14192 14189 14194 14195 14196 14193 14198 14199 14200 14197 14202 14203 14204 14201 14206 14207 14208 14205 14210 14211 14212 14209 14214 14215 14216 14213 14218 14219 14220 14217 14222 14223 14224 14221 14226 14227 14228 14225 14230 14231 14232 14229 14234 14235 14236 14233 14238 14239 14240 14237 14242 14243 14244 14241 14246 14247 14248 14245 14250 14251 14252 14249 14254 14255 14256 14253 14258 14259 14260 14257 14262 14263 14264 14261 14266 14267 14268 14265 14270 14271 14272 14269 14274 14275 14276 14273 14278 14279 14280 14277 14282 14283 14284 14281 14286 14287 14288 14285 14290 14291 14292 14289 14294 14295 14296 14293 14298 14299 14300 14297 14302 14303 14304 14301 14306 14307 14308 14305 14310 14311 14312 14309 14314 14315 14316 14313 14318 14319 14320 14317 14322 14323 14324 14321 14326 14327 14328 14325 14330 14331 14332 14329 14334 14335 14336 14333 14338 14339 14340 14337 14342 14343 14344 14341 14346 14347 14348 14345 14350 14351 14352 14349 14354 14355 14356 14353 14358 14359 14360 14357 14362 14363 14364 14361 14366 14367 14368 14365 14370 14371 14372 14369 14374 14375 14376 14373 14378 14379 14380 14377 14382 14383 14384 14381 14386 14387 14388 14385 14390 14391 14392 14389 14394 14395 14396 14393 14398 14399 14400 14397 14402 14403 14404 14401 14406 14407 14408 14405 14410 14411 14412 14409 14414 14415 14416 14413 14418 14419 14420 14417 14422 14423 14424 14421 14426 14427 14428 14425 14430 14431 14432 14429 14434 14435 14436 14433 14438 14439 14440 14437 14442 14443 14444 14441 14446 14447 14448 14445 14450 14451 14452 14449 14454 14455 14456 14453 14458 14459 14460 14457 14462 14463 14464 14461 14466 14467 14468 14465 14470 14471 14472 14469 14474 14475 14476 14473 14478 14479 14480 14477 14482 14483 14484 14481 14486 14487 14488 14485 14490 14491 14492 14489 14494 14495 14496 14493 14498 14499 14500 14497 14502 14503 14504 14501 14506 14507 14508 14505 14510 14511 14512 14509 14514 14515 14516 14513 14518 14519 14520 14517 14522 14523 14524 14521 14526 14527 14528 14525 14530 14531 14532 14529 14534 14535 14536 14533 14538 14539 14540 14537 14542 14543 14544 14541 14546 14547 14548 14545 14550 14551 14552 14549 14554 14555 14556 14553 14558 14559 14560 14557 14562 14563 14564 14561 14566 14567 14568 14565 14570 14571 14572 14569 14574 14575 14576 14573 14578 14579 14580 14577 14582 14583 14584 14581 14586 14587 14588 14585 14590 14591 14592 14589 14594 14595 14596 14593 14598 14599 14600 14597 14602 14603 14604 14601 14606 14607 14608 14605 14610 14611 14612 14609 14614 14615 14616 14613 14618 14619 14620 14617 14622 14623 14624 14621 14626 14627 14628 14625 14630 14631 14632 14629 14634 14635 14636 14633 14638 14639 14640 14637 14642 14643 14644 14641 14646 14647 14648 14645 14650 14651 14652 14649 14654 14655 14656 14653 14658 14659 14660 14657 14662 14663 14664 14661 14666 14667 14668 14665 14670 14671 14672 14669 14674 14675 14676 14673 14678 14679 14680 14677 14682 14683 14684 14681 14686 14687 14688 14685 14690 14691 14692 14689 14694 14695 14696 14693 14698 14699 14700 14697 14702 14703 14704 14701 14706 14707 14708 14705 14710 14711 14712 14709 14714 14715 14716 14713 14718 14719 14720 14717 14722 14723 14724 14721 14726 14727 14728 14725 14730 14731 14732 14729 14734 14735 14736 14733 14738 14739 14740 14737 14742 14743 14744 14741 14746 14747 14748 14745 14750 14751 14752 14749 14754 14755 14756 14753 14758 14759 14760 14757 14762 14763 14764 14761 14766 14767 14768 14765 14770 14771 14772 14769 14774 14775 14776 14773 14778 14779 14780 14777 14782 14783 14784 14781 14786 14787 14788 14785 14790 14791 14792 14789 14794 14795 14796 14793 14798 14799 14800 14797 14802 14803 14804 14801 14806 14807 14808 14805 14810 14811 14812 14809 14814 14815 14816 14813 14818 14819 14820 14817 14822 14823 14824 14821 14826 14827 14828 14825 14830 14831 14832 14829 14834 14835 14836 14833 14838 14839 14840 14837 14842 14843 14844 14841 14846 14847 14848 14845 14850 14851 14852 14849 14854 14855 14856 14853 14858 14859 14860 14857 14862 14863 14864 14861 14866 14867 14868 14865 14870 14871 14872 14869 14874 14875 14876 14873 14878 14879 14880 14877 14882 14883 14884 14881 14886 14887 14888 14885 14890 14891 14892 14889 14894 14895 14896 14893 14898 14899 14900 14897 14902 14903 14904 14901 14906 14907 14908 14905 14910 14911 14912 14909 14914 14915 14916 14913 14918 14919 14920 14917 14922 14923 14924 14921 14926 14927 14928 14925 14930 14931 14932 14929 14934 14935 14936 14933 14938 14939 14940 14937 14942 14943 14944 14941 14946 14947 14948 14945 14950 14951 14952 14949 14954 14955 14956 14953 14958 14959 14960 14957 14962 14963 14964 14961 14966 14967 14968 14965 14970 14971 14972 14969 14974 14975 14976 14973 14978 14979 14980 14977 14982 14983 14984 14981 14986 14987 14988 14985 14990 14991 14992 14989 14994 14995 14996 14993 14998 14999 15000 14997 15002 15003 15004 15001 15006 15007 15008 15005 15010 15011 15012 15009 15014 15015 15016 15013 15018 15019 15020 15017 15022 15023 15024 15021 15026 15027 15028 15025 15030 15031 15032 15029 15034 15035 15036 15033 15038 15039 15040 15037 15042 15043 15044 15041 15046 15047 15048 15045 15050 15051 15052 15049 15054 15055 15056 15053 15058 15059 15060 15057 15062 15063 15064 15061 15066 15067 15068 15065 15070 15071 15072 15069 15074 15075 15076 15073 15078 15079 15080 15077 15082 15083 15084 15081 15086 15087 15088 15085 15090 15091 15092 15089 15094 15095 15096 15093 15098 15099 15100 15097 15102 15103 15104 15101 15106 15107 15108 15105 15110 15111 15112 15109 15114 15115 15116 15113 15118 15119 15120 15117 15122 15123 15124 15121 15126 15127 15128 15125 15130 15131 15132 15129 15134 15135 15136 15133 15138 15139 15140 15137 15142 15143 15144 15141 15146 15147 15148 15145 15150 15151 15152 15149 15154 15155 15156 15153 15158 15159 15160 15157 15162 15163 15164 15161 15166 15167 15168 15165 15170 15171 15172 15169 15174 15175 15176 15173 15178 15179 15180 15177 15182 15183 15184 15181 15186 15187 15188 15185 15190 15191 15192 15189 15194 15195 15196 15193 15198 15199 15200 15197 15202 15203 15204 15201 15206 15207 15208 15205 15210 15211 15212 15209 15214 15215 15216 15213 15218 15219 15220 15217 15222 15223 15224 15221 15226 15227 15228 15225 15230 15231 15232 15229 15234 15235 15236 15233 15238 15239 15240 15237 15242 15243 15244 15241 15246 15247 15248 15245 15250 15251 15252 15249 15254 15255 15256 15253 15258 15259 15260 15257 15262 15263 15264 15261 15266 15267 15268 15265 15270 15271 15272 15269 15274 15275 15276 15273 15278 15279 15280 15277 15282 15283 15284 15281 15286 15287 15288 15285 15290 15291 15292 15289 15294 15295 15296 15293 15298 15299 15300 15297 15302 15303 15304 15301 15306 15307 15308 15305 15310 15311 15312 15309 15314 15315 15316 15313 15318 15319 15320 15317 15322 15323 15324 15321 15326 15327 15328 15325 15330 15331 15332 15329 15334 15335 15336 15333 15338 15339 15340 15337 15342 15343 15344 15341 15346 15347 15348 15345 15350 15351 15352 15349 15354 15355 15356 15353 15358 15359 15360 15357 15362 15363 15364 15361 15366 15367 15368 15365 15370 15371 15372 15369 15374 15375 15376 15373 15378 15379 15380 15377 15382 15383 15384 15381 15386 15387 15388 15385 15390 15391 15392 15389 15394 15395 15396 15393 15398 15399 15400 15397 15402 15403 15404 15401 15406 15407 15408 15405 15410 15411 15412 15409 15414 15415 15416 15413 15418 15419 15420 15417 15422 15423 15424 15421 15426 15427 15428 15425 15430 15431 15432 15429 15434 15435 15436 15433 15438 15439 15440 15437 15442 15443 15444 15441 15446 15447 15448 15445 15450 15451 15452 15449 15454 15455 15456 15453 15458 15459 15460 15457 15462 15463 15464 15461 15466 15467 15468 15465 15470 15471 15472 15469 15474 15475 15476 15473 15478 15479 15480 15477 15482 15483 15484 15481 15486 15487 15488 15485 15490 15491 15492 15489 15494 15495 15496 15493 15498 15499 15500 15497 15502 15503 15504 15501 15506 15507 15508 15505 15510 15511 15512 15509 15514 15515 15516 15513 15518 15519 15520 15517 15522 15523 15524 15521 15526 15527 15528 15525 15530 15531 15532 15529 15534 15535 15536 15533 15538 15539 15540 15537 15542 15543 15544 15541 15546 15547 15548 15545 15550 15551 15552 15549 15554 15555 15556 15553 15558 15559 15560 15557 15562 15563 15564 15561 15566 15567 15568 15565 15570 15571 15572 15569 15574 15575 15576 15573 15578 15579 15580 15577 15582 15583 15584 15581 15586 15587 15588 15585 15590 15591 15592 15589 15594 15595 15596 15593 15598 15599 15600 15597 15602 15603 15604 15601 15606 15607 15608 15605 15610 15611 15612 15609 15614 15615 15616 15613 15618 15619 15620 15617 15622 15623 15624 15621 15626 15627 15628 15625 15630 15631 15632 15629 15634 15635 15636 15633 15638 15639 15640 15637 15642 15643 15644 15641 15646 15647 15648 15645 15650 15651 15652 15649 15654 15655 15656 15653 15658 15659 15660 15657 15662 15663 15664 15661 15666 15667 15668 15665 15670 15671 15672 15669 15674 15675 15676 15673 15678 15679 15680 15677 15682 15683 15684 15681 15686 15687 15688 15685 15690 15691 15692 15689 15694 15695 15696 15693 15698 15699 15700 15697 15702 15703 15704 15701 15706 15707 15708 15705 15710 15711 15712 15709 15714 15715 15716 15713 15718 15719 15720 15717 15722 15723 15724 15721 15726 15727 15728 15725 15730 15731 15732 15729 15734 15735 15736 15733 15738 15739 15740 15737 15742 15743 15744 15741 15746 15747 15748 15745 15750 15751 15752 15749 15754 15755 15756 15753 15758 15759 15760 15757 15762 15763 15764 15761 15766 15767 15768 15765 15770 15771 15772 15769 15774 15775 15776 15773 15778 15779 15780 15777 15782 15783 15784 15781 15786 15787 15788 15785 15790 15791 15792 15789 15794 15795 15796 15793 15798 15799 15800 15797 15802 15803 15804 15801 15806 15807 15808 15805 15810 15811 15812 15809 15814 15815 15816 15813 15818 15819 15820 15817 15822 15823 15824 15821 15826 15827 15828 15825 15830 15831 15832 15829 15834 15835 15836 15833 15838 15839 15840 15837 15842 15843 15844 15841 15846 15847 15848 15845 15850 15851 15852 15849 15854 15855 15856 15853 15858 15859 15860 15857 15862 15863 15864 15861 15866 15867 15868 15865 15870 15871 15872 15869 15874 15875 15876 15873 15878 15879 15880 15877 15882 15883 15884 15881 15886 15887 15888 15885 15890 15891 15892 15889 15894 15895 15896 15893 15898 15899 15900 15897 15902 15903 15904 15901 15906 15907 15908 15905 15910 15911 15912 15909 15914 15915 15916 15913 15918 15919 15920 15917 15922 15923 15924 15921 15926 15927 15928 15925 15930 15931 15932 15929 15934 15935 15936 15933 15938 15939 15940 15937 15942 15943 15944 15941 15946 15947 15948 15945 15950 15951 15952 15949 15954 15955 15956 15953 15958 15959 15960 15957 15962 15963 15964 15961 15966 15967 15968 15965 15970 15971 15972 15969 15974 15975 15976 15973 15978 15979 15980 15977 15982 15983 15984 15981 15986 15987 15988 15985 15990 15991 15992 15989 15994 15995 15996 15993 15998 15999 16000 15997 16002 16003 16004 16001 16006 16007 16008 16005 16010 16011 16012 16009 16014 16015 16016 16013 16018 16019 16020 16017 16022 16023 16024 16021 16026 16027 16028 16025 16030 16031 16032 16029 16034 16035 16036 16033 16038 16039 16040 16037 16042 16043 16044 16041 16046 16047 16048 16045 16050 16051 16052 16049 16054 16055 16056 16053 16058 16059 16060 16057 16062 16063 16064 16061 16066 16067 16068 16065 16070 16071 16072 16069 16074 16075 16076 16073 16078 16079 16080 16077 16082 16083 16084 16081 16086 16087 16088 16085 16090 16091 16092 16089 16094 16095 16096 16093 16098 16099 16100 16097 16102 16103 16104 16101 16106 16107 16108 16105 16110 16111 16112 16109 16114 16115 16116 16113 16118 16119 16120 16117 16122 16123 16124 16121 16126 16127 16128 16125 16130 16131 16132 16129 16134 16135 16136 16133 16138 16139 16140 16137 16142 16143 16144 16141 16146 16147 16148 16145 16150 16151 16152 16149 16154 16155 16156 16153 16158 16159 16160 16157 16162 16163 16164 16161 16166 16167 16168 16165 16170 16171 16172 16169 16174 16175 16176 16173 16178 16179 16180 16177 16182 16183 16184 16181 16186 16187 16188 16185 16190 16191 16192 16189 16194 16195 16196 16193 16198 16199 16200 16197 16202 16203 16204 16201 16206 16207 16208 16205 16210 16211 16212 16209 16214 16215 16216 16213 16218 16219 16220 16217 16222 16223 16224 16221 16226 16227 16228 16225 16230 16231 16232 16229 16234 16235 16236 16233 16238 16239 16240 16237 16242 16243 16244 16241 16246 16247 16248 16245 16250 16251 16252 16249 16254 16255 16256 16253 16258 16259 16260 16257 16262 16263 16264 16261 16266 16267 16268 16265 16270 16271 16272 16269 16274 16275 16276 16273 16278 16279 16280 16277 16282 16283 16284 16281 16286 16287 16288 16285 16290 16291 16292 16289 16294 16295 16296 16293 16298 16299 16300 16297 16302 16303 16304 16301 16306 16307 16308 16305 16310 16311 16312 16309 16314 16315 16316 16313 16318 16319 16320 16317 16322 16323 16324 16321 16326 16327 16328 16325 16330 16331 16332 16329 16334 16335 16336 16333 16338 16339 16340 16337 16342 16343 16344 16341 16346 16347 16348 16345 16350 16351 16352 16349 16354 16355 16356 16353 16358 16359 16360 16357 16362 16363 16364 16361 16366 16367 16368 16365 16370 16371 16372 16369 16374 16375 16376 16373 16378 16379 16380 16377 16382 16383 16384 16381 16386 16387 16388 16385 16390 16391 16392 16389 16394 16395 16396 16393 16398 16399 16400 16397 16402 16403 16404 16401 16406 16407 16408 16405 16410 16411 16412 16409 16414 16415 16416 16413 16418 16419 16420 16417 16422 16423 16424 16421 16426 16427 16428 16425 16430 16431 16432 16429 16434 16435 16436 16433 16438 16439 16440 16437 16442 16443 16444 16441 16446 16447 16448 16445 16450 16451 16452 16449 16454 16455 16456 16453 16458 16459 16460 16457 16462 16463 16464 16461 16466 16467 16468 16465 16470 16471 16472 16469 16474 16475 16476 16473 16478 16479 16480 16477 16482 16483 16484 16481 16486 16487 16488 16485 16490 16491 16492 16489 16494 16495 16496 16493 16498 16499 16500 16497 16502 16503 16504 16501 16506 16507 16508 16505 16510 16511 16512 16509 16514 16515 16516 16513 16518 16519 16520 16517 16522 16523 16524 16521 16526 16527 16528 16525 16530 16531 16532 16529 16534 16535 16536 16533 16538 16539 16540 16537 16542 16543 16544 16541 16546 16547 16548 16545 16550 16551 16552 16549 16554 16555 16556 16553 16558 16559 16560 16557 16562 16563 16564 16561 16566 16567 16568 16565 16570 16571 16572 16569 16574 16575 16576 16573 16578 16579 16580 16577 16582 16583 16584 16581 16586 16587 16588 16585 16590 16591 16592 16589 16594 16595 16596 16593 16598 16599 16600 16597 16602 16603 16604 16601 16606 16607 16608 16605 16610 16611 16612 16609 16614 16615 16616 16613 16618 16619 16620 16617 16622 16623 16624 16621 16626 16627 16628 16625 16630 16631 16632 16629 16634 16635 16636 16633 16638 16639 16640 16637 16642 16643 16644 16641 16646 16647 16648 16645 16650 16651 16652 16649 16654 16655 16656 16653 16658 16659 16660 16657 16662 16663 16664 16661 16666 16667 16668 16665 16670 16671 16672 16669 16674 16675 16676 16673 16678 16679 16680 16677 16682 16683 16684 16681 16686 16687 16688 16685 16690 16691 16692 16689 16694 16695 16696 16693 16698 16699 16700 16697 16702 16703 16704 16701 16706 16707 16708 16705 16710 16711 16712 16709 16714 16715 16716 16713 16718 16719 16720 16717 16722 16723 16724 16721 16726 16727 16728 16725 16730 16731 16732 16729 16734 16735 16736 16733 16738 16739 16740 16737 16742 16743 16744 16741 16746 16747 16748 16745 16750 16751 16752 16749 16754 16755 16756 16753 16758 16759 16760 16757 16762 16763 16764 16761 16766 16767 16768 16765 16770 16771 16772 16769 16774 16775 16776 16773 16778 16779 16780 16777 16782 16783 16784 16781 16786 16787 16788 16785 16790 16791 16792 16789 16794 16795 16796 16793 16798 16799 16800 16797 16802 16803 16804 16801 16806 16807 16808 16805 16810 16811 16812 16809 16814 16815 16816 16813 16818 16819 16820 16817 16822 16823 16824 16821 16826 16827 16828 16825 16830 16831 16832 16829 16834 16835 16836 16833 16838 16839 16840 16837 16842 16843 16844 16841 16846 16847 16848 16845 16850 16851 16852 16849 16854 16855 16856 16853 16858 16859 16860 16857 16862 16863 16864 16861 16866 16867 16868 16865 16870 16871 16872 16869 16874 16875 16876 16873 16878 16879 16880 16877 16882 16883 16884 16881 16886 16887 16888 16885 16890 16891 16892 16889 16894 16895 16896 16893 16898 16899 16900 16897 16902 16903 16904 16901 16906 16907 16908 16905 16910 16911 16912 16909 16914 16915 16916 16913 16918 16919 16920 16917 16922 16923 16924 16921 16926 16927 16928 16925 16930 16931 16932 16929 16934 16935 16936 16933 16938 16939 16940 16937 16942 16943 16944 16941 16946 16947 16948 16945 16950 16951 16952 16949 16954 16955 16956 16953 16958 16959 16960 16957 16962 16963 16964 16961 16966 16967 16968 16965 16970 16971 16972 16969 16974 16975 16976 16973 16978 16979 16980 16977 16982 16983 16984 16981 16986 16987 16988 16985 16990 16991 16992 16989 16994 16995 16996 16993 16998 16999 17000 16997 17002 17003 17004 17001 17006 17007 17008 17005 17010 17011 17012 17009 17014 17015 17016 17013 17018 17019 17020 17017 17022 17023 17024 17021 17026 17027 17028 17025 17030 17031 17032 17029 17034 17035 17036 17033 17038 17039 17040 17037 17042 17043 17044 17041 17046 17047 17048 17045 17050 17051 17052 17049 17054 17055 17056 17053 17058 17059 17060 17057 17062 17063 17064 17061 17066 17067 17068 17065 17070 17071 17072 17069 17074 17075 17076 17073 17078 17079 17080 17077 17082 17083 17084 17081 17086 17087 17088 17085 17090 17091 17092 17089 17094 17095 17096 17093 17098 17099 17100 17097 17102 17103 17104 17101 17106 17107 17108 17105 17110 17111 17112 17109 17114 17115 17116 17113 17118 17119 17120 17117 17122 17123 17124 17121 17126 17127 17128 17125 17130 17131 17132 17129 17134 17135 17136 17133 17138 17139 17140 17137 17142 17143 17144 17141 17146 17147 17148 17145 17150 17151 17152 17149 17154 17155 17156 17153 17158 17159 17160 17157 17162 17163 17164 17161 17166 17167 17168 17165 17170 17171 17172 17169 17174 17175 17176 17173 17178 17179 17180 17177 17182 17183 17184 17181 17186 17187 17188 17185 17190 17191 17192 17189 17194 17195 17196 17193 17198 17199 17200 17197 17202 17203 17204 17201 17206 17207 17208 17205 17210 17211 17212 17209 17214 17215 17216 17213 17218 17219 17220 17217 17222 17223 17224 17221 17226 17227 17228 17225 17230 17231 17232 17229 17234 17235 17236 17233 17238 17239 17240 17237 17242 17243 17244 17241 17246 17247 17248 17245 17250 17251 17252 17249 17254 17255 17256 17253 17258 17259 17260 17257 17262 17263 17264 17261 17266 17267 17268 17265 17270 17271 17272 17269 17274 17275 17276 17273 17278 17279 17280 17277 17282 17283 17284 17281 17286 17287 17288 17285 17290 17291 17292 17289 17294 17295 17296 17293 17298 17299 17300 17297 17302 17303 17304 17301 17306 17307 17308 17305 17310 17311 17312 17309 17314 17315 17316 17313 17318 17319 17320 17317 17322 17323 17324 17321 17326 17327 17328 17325 17330 17331 17332 17329 17334 17335 17336 17333 17338 17339 17340 17337 17342 17343 17344 17341 17346 17347 17348 17345 17350 17351 17352 17349 17354 17355 17356 17353 17358 17359 17360 17357 17362 17363 17364 17361 17366 17367 17368 17365 17370 17371 17372 17369 17374 17375 17376 17373 17378 17379 17380 17377 17382 17383 17384 17381 17386 17387 17388 17385 17390 17391 17392 17389 17394 17395 17396 17393 17398 17399 17400 17397 17402 17403 17404 17401 17406 17407 17408 17405 17410 17411 17412 17409 17414 17415 17416 17413 17418 17419 17420 17417 17422 17423 17424 17421 17426 17427 17428 17425 17430 17431 17432 17429 17434 17435 17436 17433 17438 17439 17440 17437 17442 17443 17444 17441 17446 17447 17448 17445 17450 17451 17452 17449 17454 17455 17456 17453 17458 17459 17460 17457 17462 17463 17464 17461 17466 17467 17468 17465 17470 17471 17472 17469 17474 17475 17476 17473 17478 17479 17480 17477 17482 17483 17484 17481 17486 17487 17488 17485 17490 17491 17492 17489 17494 17495 17496 17493 17498 17499 17500 17497 17502 17503 17504 17501 17506 17507 17508 17505 17510 17511 17512 17509 17514 17515 17516 17513 17518 17519 17520 17517 17522 17523 17524 17521 17526 17527 17528 17525 17530 17531 17532 17529 17534 17535 17536 17533 17538 17539 17540 17537 17542 17543 17544 17541 17546 17547 17548 17545 17550 17551 17552 17549 17554 17555 17556 17553 17558 17559 17560 17557 17562 17563 17564 17561 17566 17567 17568 17565 17570 17571 17572 17569 17574 17575 17576 17573 17578 17579 17580 17577 17582 17583 17584 17581 17586 17587 17588 17585 17590 17591 17592 17589 17594 17595 17596 17593 17598 17599 17600 17597 17602 17603 17604 17601 17606 17607 17608 17605 17610 17611 17612 17609 17614 17615 17616 17613 17618 17619 17620 17617 17622 17623 17624 17621 17626 17627 17628 17625 17630 17631 17632 17629 17634 17635 17636 17633 17638 17639 17640 17637 17642 17643 17644 17641 17646 17647 17648 17645 17650 17651 17652 17649 17654 17655 17656 17653 17658 17659 17660 17657 17662 17663 17664 17661 17666 17667 17668 17665 17670 17671 17672 17669 17674 17675 17676 17673 17678 17679 17680 17677 17682 17683 17684 17681 17686 17687 17688 17685 17690 17691 17692 17689 17694 17695 17696 17693 17698 17699 17700 17697 17702 17703 17704 17701 17706 17707 17708 17705 17710 17711 17712 17709 17714 17715 17716 17713 17718 17719 17720 17717 17722 17723 17724 17721 17726 17727 17728 17725 17730 17731 17732 17729 17734 17735 17736 17733 17738 17739 17740 17737 17742 17743 17744 17741 17746 17747 17748 17745 17750 17751 17752 17749 17754 17755 17756 17753 17758 17759 17760 17757 17762 17763 17764 17761 17766 17767 17768 17765 17770 17771 17772 17769 17774 17775 17776 17773 17778 17779 17780 17777 17782 17783 17784 17781 17786 17787 17788 17785 17790 17791 17792 17789 17794 17795 17796 17793 17798 17799 17800 17797 17802 17803 17804 17801 17806 17807 17808 17805 17810 17811 17812 17809 17814 17815 17816 17813 17818 17819 17820 17817 17822 17823 17824 17821 17826 17827 17828 17825 17830 17831 17832 17829 17834 17835 17836 17833 17838 17839 17840 17837 17842 17843 17844 17841 17846 17847 17848 17845 17850 17851 17852 17849 17854 17855 17856 17853 17858 17859 17860 17857 17862 17863 17864 17861 17866 17867 17868 17865 17870 17871 17872 17869 17874 17875 17876 17873 17878 17879 17880 17877 17882 17883 17884 17881 17886 17887 17888 17885 17890 17891 17892 17889 17894 17895 17896 17893 17898 17899 17900 17897 17902 17903 17904 17901 17906 17907 17908 17905 17910 17911 17912 17909 17914 17915 17916 17913 17918 17919 17920 17917 17922 17923 17924 17921 17926 17927 17928 17925 17930 17931 17932 17929 17934 17935 17936 17933 17938 17939 17940 17937 17942 17943 17944 17941 17946 17947 17948 17945 17950 17951 17952 17949 17954 17955 17956 17953 17958 17959 17960 17957 17962 17963 17964 17961 17966 17967 17968 17965 17970 17971 17972 17969 17974 17975 17976 17973 17978 17979 17980 17977 17982 17983 17984 17981 17986 17987 17988 17985 17990 17991 17992 17989 17994 17995 17996 17993 17998 17999 18000 17997 18002 18003 18004 18001 18006 18007 18008 18005 18010 18011 18012 18009 18014 18015 18016 18013 18018 18019 18020 18017 18022 18023 18024 18021 18026 18027 18028 18025 18030 18031 18032 18029 18034 18035 18036 18033 18038 18039 18040 18037 18042 18043 18044 18041 18046 18047 18048 18045 18050 18051 18052 18049 18054 18055 18056 18053 18058 18059 18060 18057 18062 18063 18064 18061 18066 18067 18068 18065 18070 18071 18072 18069 18074 18075 18076 18073 18078 18079 18080 18077 18082 18083 18084 18081 18086 18087 18088 18085 18090 18091 18092 18089 18094 18095 18096 18093 18098 18099 18100 18097 18102 18103 18104 18101 18106 18107 18108 18105 18110 18111 18112 18109 18114 18115 18116 18113 18118 18119 18120 18117 18122 18123 18124 18121 18126 18127 18128 18125 18130 18131 18132 18129 18134 18135 18136 18133 18138 18139 18140 18137 18142 18143 18144 18141 18146 18147 18148 18145 18150 18151 18152 18149 18154 18155 18156 18153 18158 18159 18160 18157 18162 18163 18164 18161 18166 18167 18168 18165 18170 18171 18172 18169 18174 18175 18176 18173 18178 18179 18180 18177 18182 18183 18184 18181 18186 18187 18188 18185 18190 18191 18192 18189 18194 18195 18196 18193 18198 18199 18200 18197 18202 18203 18204 18201 18206 18207 18208 18205 18210 18211 18212 18209 18214 18215 18216 18213 18218 18219 18220 18217 18222 18223 18224 18221 18226 18227 18228 18225 18230 18231 18232 18229 18234 18235 18236 18233 18238 18239 18240 18237 18242 18243 18244 18241 18246 18247 18248 18245 18250 18251 18252 18249 18254 18255 18256 18253 18258 18259 18260 18257 18262 18263 18264 18261 18266 18267 18268 18265 18270 18271 18272 18269 18274 18275 18276 18273 18278 18279 18280 18277 18282 18283 18284 18281 18286 18287 18288 18285 18290 18291 18292 18289 18294 18295 18296 18293 18298 18299 18300 18297 18302 18303 18304 18301 18306 18307 18308 18305 18310 18311 18312 18309 18314 18315 18316 18313 18318 18319 18320 18317 18322 18323 18324 18321 18326 18327 18328 18325 18330 18331 18332 18329 18334 18335 18336 18333 18338 18339 18340 18337 18342 18343 18344 18341 18346 18347 18348 18345 18350 18351 18352 18349 18354 18355 18356 18353 18358 18359 18360 18357 18362 18363 18364 18361 18366 18367 18368 18365 18370 18371 18372 18369 18374 18375 18376 18373 18378 18379 18380 18377 18382 18383 18384 18381 18386 18387 18388 18385 18390 18391 18392 18389 18394 18395 18396 18393 18398 18399 18400 18397 18402 18403 18404 18401 18406 18407 18408 18405 18410 18411 18412 18409 18414 18415 18416 18413 18418 18419 18420 18417 18422 18423 18424 18421 18426 18427 18428 18425 18430 18431 18432 18429 18434 18435 18436 18433 18438 18439 18440 18437 18442 18443 18444 18441 18446 18447 18448 18445 18450 18451 18452 18449 18454 18455 18456 18453 18458 18459 18460 18457 18462 18463 18464 18461 18466 18467 18468 18465 18470 18471 18472 18469 18474 18475 18476 18473 18478 18479 18480 18477 18482 18483 18484 18481 18486 18487 18488 18485 18490 18491 18492 18489 18494 18495 18496 18493 18498 18499 18500 18497 18502 18503 18504 18501 18506 18507 18508 18505 18510 18511 18512 18509 18514 18515 18516 18513 18518 18519 18520 18517 18522 18523 18524 18521 18526 18527 18528 18525 18530 18531 18532 18529 18534 18535 18536 18533 18538 18539 18540 18537 18542 18543 18544 18541 18546 18547 18548 18545 18550 18551 18552 18549 18554 18555 18556 18553 18558 18559 18560 18557 18562 18563 18564 18561 18566 18567 18568 18565 18570 18571 18572 18569 18574 18575 18576 18573 18578 18579 18580 18577 18582 18583 18584 18581 18586 18587 18588 18585 18590 18591 18592 18589 18594 18595 18596 18593 18598 18599 18600 18597 18602 18603 18604 18601 18606 18607 18608 18605 18610 18611 18612 18609 18614 18615 18616 18613 18618 18619 18620 18617 18622 18623 18624 18621 18626 18627 18628 18625 18630 18631 18632 18629 18634 18635 18636 18633 18638 18639 18640 18637 18642 18643 18644 18641 18646 18647 18648 18645 18650 18651 18652 18649 18654 18655 18656 18653 18658 18659 18660 18657 18662 18663 18664 18661 18666 18667 18668 18665 18670 18671 18672 18669 18674 18675 18676 18673 18678 18679 18680 18677 18682 18683 18684 18681 18686 18687 18688 18685 18690 18691 18692 18689 18694 18695 18696 18693 18698 18699 18700 18697 18702 18703 18704 18701 18706 18707 18708 18705 18710 18711 18712 18709 18714 18715 18716 18713 18718 18719 18720 18717 18722 18723 18724 18721 18726 18727 18728 18725 18730 18731 18732 18729 18734 18735 18736 18733 18738 18739 18740 18737 18742 18743 18744 18741 18746 18747 18748 18745 18750 18751 18752 18749 18754 18755 18756 18753 18758 18759 18760 18757 18762 18763 18764 18761 18766 18767 18768 18765 18770 18771 18772 18769 18774 18775 18776 18773 18778 18779 18780 18777 18782 18783 18784 18781 18786 18787 18788 18785 18790 18791 18792 18789 18794 18795 18796 18793 18798 18799 18800 18797 18802 18803 18804 18801 18806 18807 18808 18805 18810 18811 18812 18809 18814 18815 18816 18813 18818 18819 18820 18817 18822 18823 18824 18821 18826 18827 18828 18825 18830 18831 18832 18829 18834 18835 18836 18833 18838 18839 18840 18837 18842 18843 18844 18841 18846 18847 18848 18845 18850 18851 18852 18849 18854 18855 18856 18853 18858 18859 18860 18857 18862 18863 18864 18861 18866 18867 18868 18865 18870 18871 18872 18869 18874 18875 18876 18873 18878 18879 18880 18877 18882 18883 18884 18881 18886 18887 18888 18885 18890 18891 18892 18889 18894 18895 18896 18893 18898 18899 18900 18897 18902 18903 18904 18901 18906 18907 18908 18905 18910 18911 18912 18909 18914 18915 18916 18913 18918 18919 18920 18917 18922 18923 18924 18921 18926 18927 18928 18925 18930 18931 18932 18929 18934 18935 18936 18933 18938 18939 18940 18937 18942 18943 18944 18941 18946 18947 18948 18945 18950 18951 18952 18949 18954 18955 18956 18953 18958 18959 18960 18957 18962 18963 18964 18961 18966 18967 18968 18965 18970 18971 18972 18969 18974 18975 18976 18973 18978 18979 18980 18977 18982 18983 18984 18981 18986 18987 18988 18985 18990 18991 18992 18989 18994 18995 18996 18993 18998 18999 19000 18997 19002 19003 19004 19001 19006 19007 19008 19005 19010 19011 19012 19009 19014 19015 19016 19013 19018 19019 19020 19017 19022 19023 19024 19021 19026 19027 19028 19025 19030 19031 19032 19029 19034 19035 19036 19033 19038 19039 19040 19037 19042 19043 19044 19041 19046 19047 19048 19045 19050 19051 19052 19049 19054 19055 19056 19053 19058 19059 19060 19057 19062 19063 19064 19061 19066 19067 19068 19065 19070 19071 19072 19069 19074 19075 19076 19073 19078 19079 19080 19077 19082 19083 19084 19081 19086 19087 19088 19085 19090 19091 19092 19089 19094 19095 19096 19093 19098 19099 19100 19097 19102 19103 19104 19101 19106 19107 19108 19105 19110 19111 19112 19109 19114 19115 19116 19113 19118 19119 19120 19117 19122 19123 19124 19121 19126 19127 19128 19125 19130 19131 19132 19129 19134 19135 19136 19133 19138 19139 19140 19137 19142 19143 19144 19141 19146 19147 19148 19145 19150 19151 19152 19149 19154 19155 19156 19153 19158 19159 19160 19157 19162 19163 19164 19161 19166 19167 19168 19165 19170 19171 19172 19169 19174 19175 19176 19173 19178 19179 19180 19177 19182 19183 19184 19181 19186 19187 19188 19185 19190 19191 19192 19189 19194 19195 19196 19193 19198 19199 19200 19197 19202 19203 19204 19201 19206 19207 19208 19205 19210 19211 19212 19209 19214 19215 19216 19213 19218 19219 19220 19217 19222 19223 19224 19221 19226 19227 19228 19225 19230 19231 19232 19229 19234 19235 19236 19233 19238 19239 19240 19237 19242 19243 19244 19241 19246 19247 19248 19245 19250 19251 19252 19249 19254 19255 19256 19253 19258 19259 19260 19257 19262 19263 19264 19261 19266 19267 19268 19265 19270 19271 19272 19269 19274 19275 19276 19273 19278 19279 19280 19277 19282 19283 19284 19281 19286 19287 19288 19285 19290 19291 19292 19289 19294 19295 19296 19293 19298 19299 19300 19297 19302 19303 19304 19301 19306 19307 19308 19305 19310 19311 19312 19309 19314 19315 19316 19313 19318 19319 19320 19317 19322 19323 19324 19321 19326 19327 19328 19325 19330 19331 19332 19329 19334 19335 19336 19333 19338 19339 19340 19337 19342 19343 19344 19341 19346 19347 19348 19345 19350 19351 19352 19349 19354 19355 19356 19353 19358 19359 19360 19357 19362 19363 19364 19361 19366 19367 19368 19365 19370 19371 19372 19369 19374 19375 19376 19373 19378 19379 19380 19377 19382 19383 19384 19381 19386 19387 19388 19385 19390 19391 19392 19389 19394 19395 19396 19393 19398 19399 19400 19397 19402 19403 19404 19401 19406 19407 19408 19405 19410 19411 19412 19409 19414 19415 19416 19413 19418 19419 19420 19417 19422 19423 19424 19421 19426 19427 19428 19425 19430 19431 19432 19429 19434 19435 19436 19433 19438 19439 19440 19437 19442 19443 19444 19441 19446 19447 19448 19445 19450 19451 19452 19449 19454 19455 19456 19453 19458 19459 19460 19457 19462 19463 19464 19461 19466 19467 19468 19465 19470 19471 19472 19469 19474 19475 19476 19473 19478 19479 19480 19477 19482 19483 19484 19481 19486 19487 19488 19485 19490 19491 19492 19489 19494 19495 19496 19493 19498 19499 19500 19497 19502 19503 19504 19501 19506 19507 19508 19505 19510 19511 19512 19509 19514 19515 19516 19513 19518 19519 19520 19517 19522 19523 19524 19521 19526 19527 19528 19525 19530 19531 19532 19529 19534 19535 19536 19533 19538 19539 19540 19537 19542 19543 19544 19541 19546 19547 19548 19545 19550 19551 19552 19549 19554 19555 19556 19553 19558 19559 19560 19557 19562 19563 19564 19561 19566 19567 19568 19565 19570 19571 19572 19569 19574 19575 19576 19573 19578 19579 19580 19577 19582 19583 19584 19581 19586 19587 19588 19585 19590 19591 19592 19589 19594 19595 19596 19593 19598 19599 19600 19597 19602 19603 19604 19601 19606 19607 19608 19605 19610 19611 19612 19609 19614 19615 19616 19613 19618 19619 19620 19617 19622 19623 19624 19621 19626 19627 19628 19625 19630 19631 19632 19629 19634 19635 19636 19633 19638 19639 19640 19637 19642 19643 19644 19641 19646 19647 19648 19645 19650 19651 19652 19649 19654 19655 19656 19653 19658 19659 19660 19657 19662 19663 19664 19661 19666 19667 19668 19665 19670 19671 19672 19669 19674 19675 19676 19673 19678 19679 19680 19677 19682 19683 19684 19681 19686 19687 19688 19685 19690 19691 19692 19689 19694 19695 19696 19693 19698 19699 19700 19697 19702 19703 19704 19701 19706 19707 19708 19705 19710 19711 19712 19709 19714 19715 19716 19713 19718 19719 19720 19717 19722 19723 19724 19721 19726 19727 19728 19725 19730 19731 19732 19729 19734 19735 19736 19733 19738 19739 19740 19737 19742 19743 19744 19741 19746 19747 19748 19745 19750 19751 19752 19749 19754 19755 19756 19753 19758 19759 19760 19757 19762 19763 19764 19761 19766 19767 19768 19765 19770 19771 19772 19769 19774 19775 19776 19773 19778 19779 19780 19777 19782 19783 19784 19781 19786 19787 19788 19785 19790 19791 19792 19789 19794 19795 19796 19793 19798 19799 19800 19797 19802 19803 19804 19801 19806 19807 19808 19805 19810 19811 19812 19809 19814 19815 19816 19813 19818 19819 19820 19817 19822 19823 19824 19821 19826 19827 19828 19825 19830 19831 19832 19829 19834 19835 19836 19833 19838 19839 19840 19837 19842 19843 19844 19841 19846 19847 19848 19845 19850 19851 19852 19849 19854 19855 19856 19853 19858 19859 19860 19857 19862 19863 19864 19861 19866 19867 19868 19865 19870 19871 19872 19869 19874 19875 19876 19873 19878 19879 19880 19877 19882 19883 19884 19881 19886 19887 19888 19885 19890 19891 19892 19889 19894 19895 19896 19893 19898 19899 19900 19897 19902 19903 19904 19901 19906 19907 19908 19905 19910 19911 19912 19909 19914 19915 19916 19913 19918 19919 19920 19917 19922 19923 19924 19921 19926 19927 19928 19925 19930 19931 19932 19929 19934 19935 19936 19933 19938 19939 19940 19937 19942 19943 19944 19941 19946 19947 19948 19945 19950 19951 19952 19949 19954 19955 19956 19953 19958 19959 19960 19957 19962 19963 19964 19961 19966 19967 19968 19965 19970 19971 19972 19969 19974 19975 19976 19973 19978 19979 19980 19977 19982 19983 19984 19981 19986 19987 19988 19985 19990 19991 19992 19989 19994 19995 19996 19993 19998 19999 20000 19997 20002 20003 20004 20001 20006 20007 20008 20005 20010 20011 20012 20009 20014 20015 20016 20013 20018 20019 20020 20017 20022 20023 20024 20021 20026 20027 20028 20025 20030 20031 20032 20029 20034 20035 20036 20033 20038 20039 20040 20037 20042 20043 20044 20041 20046 20047 20048 20045 20050 20051 20052 20049 20054 20055 20056 20053 20058 20059 20060 20057 20062 20063 20064 20061 20066 20067 20068 20065 20070 20071 20072 20069 20074 20075 20076 20073 20078 20079 20080 20077 20082 20083 20084 20081 20086 20087 20088 20085 20090 20091 20092 20089 20094 20095 20096 20093 20098 20099 20100 20097 20102 20103 20104 20101 20106 20107 20108 20105 20110 20111 20112 20109 20114 20115 20116 20113 20118 20119 20120 20117 20122 20123 20124 20121 20126 20127 20128 20125 20130 20131 20132 20129 20134 20135 20136 20133 20138 20139 20140 20137 20142 20143 20144 20141 20146 20147 20148 20145 20150 20151 20152 20149 20154 20155 20156 20153 20158 20159 20160 20157 20162 20163 20164 20161 20166 20167 20168 20165 20170 20171 20172 20169 20174 20175 20176 20173 20178 20179 20180 20177 20182 20183 20184 20181 20186 20187 20188 20185 20190 20191 20192 20189 20194 20195 20196 20193 20198 20199 20200 20197 20202 20203 20204 20201 20206 20207 20208 20205 20210 20211 20212 20209 20214 20215 20216 20213 20218 20219 20220 20217 20222 20223 20224 20221 20226 20227 20228 20225 20230 20231 20232 20229 20234 20235 20236 20233 20238 20239 20240 20237 20242 20243 20244 20241 20246 20247 20248 20245 20250 20251 20252 20249 20254 20255 20256 20253 20258 20259 20260 20257 20262 20263 20264 20261 20266 20267 20268 20265 20270 20271 20272 20269 20274 20275 20276 20273 20278 20279 20280 20277 20282 20283 20284 20281 20286 20287 20288 20285 20290 20291 20292 20289 20294 20295 20296 20293 20298 20299 20300 20297 20302 20303 20304 20301 20306 20307 20308 20305 20310 20311 20312 20309 20314 20315 20316 20313 20318 20319 20320 20317 20322 20323 20324 20321 20326 20327 20328 20325 20330 20331 20332 20329 20334 20335 20336 20333 20338 20339 20340 20337 20342 20343 20344 20341 20346 20347 20348 20345 20350 20351 20352 20349 20354 20355 20356 20353 20358 20359 20360 20357 20362 20363 20364 20361 20366 20367 20368 20365 20370 20371 20372 20369 20374 20375 20376 20373 20378 20379 20380 20377 20382 20383 20384 20381 20386 20387 20388 20385 20390 20391 20392 20389 20394 20395 20396 20393 20398 20399 20400 20397 20402 20403 20404 20401 20406 20407 20408 20405 20410 20411 20412 20409 20414 20415 20416 20413 20418 20419 20420 20417 20422 20423 20424 20421 20426 20427 20428 20425 20430 20431 20432 20429 20434 20435 20436 20433 20438 20439 20440 20437 20442 20443 20444 20441 20446 20447 20448 20445 20450 20451 20452 20449 20454 20455 20456 20453 20458 20459 20460 20457 20462 20463 20464 20461 20466 20467 20468 20465 20470 20471 20472 20469 20474 20475 20476 20473 20478 20479 20480 20477 20482 20483 20484 20481 20486 20487 20488 20485 20490 20491 20492 20489 20494 20495 20496 20493 20498 20499 20500 20497 20502 20503 20504 20501 20506 20507 20508 20505 20510 20511 20512 20509 20514 20515 20516 20513 20518 20519 20520 20517 20522 20523 20524 20521 20526 20527 20528 20525 20530 20531 20532 20529 20534 20535 20536 20533 20538 20539 20540 20537 20542 20543 20544 20541 20546 20547 20548 20545 20550 20551 20552 20549 20554 20555 20556 20553 20558 20559 20560 20557 20562 20563 20564 20561 20566 20567 20568 20565 20570 20571 20572 20569 20574 20575 20576 20573 20578 20579 20580 20577 20582 20583 20584 20581 20586 20587 20588 20585 20590 20591 20592 20589 20594 20595 20596 20593 20598 20599 20600 20597 20602 20603 20604 20601 20606 20607 20608 20605 20610 20611 20612 20609 20614 20615 20616 20613 20618 20619 20620 20617 20622 20623 20624 20621 20626 20627 20628 20625 20630 20631 20632 20629 20634 20635 20636 20633 20638 20639 20640 20637 20642 20643 20644 20641 20646 20647 20648 20645 20650 20651 20652 20649 20654 20655 20656 20653 20658 20659 20660 20657 20662 20663 20664 20661 20666 20667 20668 20665 20670 20671 20672 20669 20674 20675 20676 20673 20678 20679 20680 20677 20682 20683 20684 20681 20686 20687 20688 20685 20690 20691 20692 20689 20694 20695 20696 20693 20698 20699 20700 20697 20702 20703 20704 20701 20706 20707 20708 20705 20710 20711 20712 20709 20714 20715 20716 20713 20718 20719 20720 20717 20722 20723 20724 20721 20726 20727 20728 20725 20730 20731 20732 20729 20734 20735 20736 20733 20738 20739 20740 20737 20742 20743 20744 20741 20746 20747 20748 20745 20750 20751 20752 20749 20754 20755 20756 20753 20758 20759 20760 20757 20762 20763 20764 20761 20766 20767 20768 20765 20770 20771 20772 20769 20774 20775 20776 20773 20778 20779 20780 20777 20782 20783 20784 20781 20786 20787 20788 20785 20790 20791 20792 20789 20794 20795 20796 20793 20798 20799 20800 20797 20802 20803 20804 20801 20806 20807 20808 20805 20810 20811 20812 20809 20814 20815 20816 20813 20818 20819 20820 20817 20822 20823 20824 20821 20826 20827 20828 20825 20830 20831 20832 20829 20834 20835 20836 20833 20838 20839 20840 20837 20842 20843 20844 20841 20846 20847 20848 20845 20850 20851 20852 20849 20854 20855 20856 20853 20858 20859 20860 20857 20862 20863 20864 20861 20866 20867 20868 20865 20870 20871 20872 20869 20874 20875 20876 20873 20878 20879 20880 20877 20882 20883 20884 20881 20886 20887 20888 20885 20890 20891 20892 20889 20894 20895 20896 20893 20898 20899 20900 20897 20902 20903 20904 20901 20906 20907 20908 20905 20910 20911 20912 20909 20914 20915 20916 20913 20918 20919 20920 20917 20922 20923 20924 20921 20926 20927 20928 20925 20930 20931 20932 20929 20934 20935 20936 20933 20938 20939 20940 20937 20942 20943 20944 20941 20946 20947 20948 20945 20950 20951 20952 20949 20954 20955 20956 20953 20958 20959 20960 20957 20962 20963 20964 20961 20966 20967 20968 20965 20970 20971 20972 20969 20974 20975 20976 20973 20978 20979 20980 20977 20982 20983 20984 20981 20986 20987 20988 20985 20990 20991 20992 20989 20994 20995 20996 20993 20998 20999 21000 20997 21002 21003 21004 21001 21006 21007 21008 21005 21010 21011 21012 21009 21014 21015 21016 21013 21018 21019 21020 21017 21022 21023 21024 21021 21026 21027 21028 21025 21030 21031 21032 21029 21034 21035 21036 21033 21038 21039 21040 21037 21042 21043 21044 21041 21046 21047 21048 21045 21050 21051 21052 21049 21054 21055 21056 21053 21058 21059 21060 21057 21062 21063 21064 21061 21066 21067 21068 21065 21070 21071 21072 21069 21074 21075 21076 21073 21078 21079 21080 21077 21082 21083 21084 21081 21086 21087 21088 21085 21090 21091 21092 21089 21094 21095 21096 21093 21098 21099 21100 21097 21102 21103 21104 21101 21106 21107 21108 21105 21110 21111 21112 21109 21114 21115 21116 21113 21118 21119 21120 21117 21122 21123 21124 21121 21126 21127 21128 21125 21130 21131 21132 21129 21134 21135 21136 21133 21138 21139 21140 21137 21142 21143 21144 21141 21146 21147 21148 21145 21150 21151 21152 21149 21154 21155 21156 21153 21158 21159 21160 21157 21162 21163 21164 21161 21166 21167 21168 21165 21170 21171 21172 21169 21174 21175 21176 21173 21178 21179 21180 21177 21182 21183 21184 21181 21186 21187 21188 21185 21190 21191 21192 21189 21194 21195 21196 21193 21198 21199 21200 21197 21202 21203 21204 21201 21206 21207 21208 21205 21210 21211 21212 21209 21214 21215 21216 21213 21218 21219 21220 21217 21222 21223 21224 21221 21226 21227 21228 21225 21230 21231 21232 21229 21234 21235 21236 21233 21238 21239 21240 21237 21242 21243 21244 21241 21246 21247 21248 21245 21250 21251 21252 21249 21254 21255 21256 21253 21258 21259 21260 21257 21262 21263 21264 21261 21266 21267 21268 21265 21270 21271 21272 21269 21274 21275 21276 21273 21278 21279 21280 21277 21282 21283 21284 21281 21286 21287 21288 21285 21290 21291 21292 21289 21294 21295 21296 21293 21298 21299 21300 21297 21302 21303 21304 21301 21306 21307 21308 21305 21310 21311 21312 21309 21314 21315 21316 21313 21318 21319 21320 21317 21322 21323 21324 21321 21326 21327 21328 21325 21330 21331 21332 21329 21334 21335 21336 21333 21338 21339 21340 21337 21342 21343 21344 21341 21346 21347 21348 21345 21350 21351 21352 21349 21354 21355 21356 21353 21358 21359 21360 21357 21362 21363 21364 21361 21366 21367 21368 21365 21370 21371 21372 21369 21374 21375 21376 21373 21378 21379 21380 21377 21382 21383 21384 21381 21386 21387 21388 21385 21390 21391 21392 21389 21394 21395 21396 21393 21398 21399 21400 21397 21402 21403 21404 21401 21406 21407 21408 21405 21410 21411 21412 21409 21414 21415 21416 21413 21418 21419 21420 21417 21422 21423 21424 21421 21426 21427 21428 21425 21430 21431 21432 21429 21434 21435 21436 21433 21438 21439 21440 21437 21442 21443 21444 21441 21446 21447 21448 21445 21450 21451 21452 21449 21454 21455 21456 21453 21458 21459 21460 21457 21462 21463 21464 21461 21466 21467 21468 21465 21470 21471 21472 21469 21474 21475 21476 21473 21478 21479 21480 21477 21482 21483 21484 21481 21486 21487 21488 21485 21490 21491 21492 21489 21494 21495 21496 21493 21498 21499 21500 21497 21502 21503 21504 21501 21506 21507 21508 21505 21510 21511 21512 21509 21514 21515 21516 21513 21518 21519 21520 21517 21522 21523 21524 21521 21526 21527 21528 21525 21530 21531 21532 21529 21534 21535 21536 21533 21538 21539 21540 21537 21542 21543 21544 21541 21546 21547 21548 21545 21550 21551 21552 21549 21554 21555 21556 21553 21558 21559 21560 21557 21562 21563 21564 21561 21566 21567 21568 21565 21570 21571 21572 21569 21574 21575 21576 21573 21578 21579 21580 21577 21582 21583 21584 21581 21586 21587 21588 21585 21590 21591 21592 21589 21594 21595 21596 21593 21598 21599 21600 21597 21602 21603 21604 21601 21606 21607 21608 21605 21610 21611 21612 21609 21614 21615 21616 21613 21618 21619 21620 21617 21622 21623 21624 21621 21626 21627 21628 21625 21630 21631 21632 21629 21634 21635 21636 21633 21638 21639 21640 21637 21642 21643 21644 21641 21646 21647 21648 21645 21650 21651 21652 21649 21654 21655 21656 21653 21658 21659 21660 21657 21662 21663 21664 21661 21666 21667 21668 21665 21670 21671 21672 21669 21674 21675 21676 21673 21678 21679 21680 21677 21682 21683 21684 21681 21686 21687 21688 21685 21690 21691 21692 21689 21694 21695 21696 21693 21698 21699 21700 21697 21702 21703 21704 21701 21706 21707 21708 21705 21710 21711 21712 21709 21714 21715 21716 21713 21718 21719 21720 21717 21722 21723 21724 21721 21726 21727 21728 21725 21730 21731 21732 21729 21734 21735 21736 21733 21738 21739 21740 21737 21742 21743 21744 21741 21746 21747 21748 21745 21750 21751 21752 21749 21754 21755 21756 21753 21758 21759 21760 21757 21762 21763 21764 21761 21766 21767 21768 21765 21770 21771 21772 21769 21774 21775 21776 21773 21778 21779 21780 21777 21782 21783 21784 21781 21786 21787 21788 21785 21790 21791 21792 21789 21794 21795 21796 21793 21798 21799 21800 21797 21802 21803 21804 21801 21806 21807 21808 21805 21810 21811 21812 21809 21814 21815 21816 21813 21818 21819 21820 21817 21822 21823 21824 21821 21826 21827 21828 21825 21830 21831 21832 21829 21834 21835 21836 21833 21838 21839 21840 21837 21842 21843 21844 21841 21846 21847 21848 21845 21850 21851 21852 21849 21854 21855 21856 21853 21858 21859 21860 21857 21862 21863 21864 21861 21866 21867 21868 21865 21870 21871 21872 21869 21874 21875 21876 21873 21878 21879 21880 21877 21882 21883 21884 21881 21886 21887 21888 21885 21890 21891 21892 21889 21894 21895 21896 21893 21898 21899 21900 21897 21902 21903 21904 21901 21906 21907 21908 21905 21910 21911 21912 21909 21914 21915 21916 21913 21918 21919 21920 21917 21922 21923 21924 21921 21926 21927 21928 21925 21930 21931 21932 21929 21934 21935 21936 21933 21938 21939 21940 21937 21942 21943 21944 21941 21946 21947 21948 21945 21950 21951 21952 21949 21954 21955 21956 21953 21958 21959 21960 21957 21962 21963 21964 21961 21966 21967 21968 21965 21970 21971 21972 21969 21974 21975 21976 21973 21978 21979 21980 21977 21982 21983 21984 21981 21986 21987 21988 21985 21990 21991 21992 21989 21994 21995 21996 21993 21998 21999 22000 21997 22002 22003 22004 22001 22006 22007 22008 22005 22010 22011 22012 22009 22014 22015 22016 22013 22018 22019 22020 22017 22022 22023 22024 22021 22026 22027 22028 22025 22030 22031 22032 22029 22034 22035 22036 22033 22038 22039 22040 22037 22042 22043 22044 22041 22046 22047 22048 22045 22050 22051 22052 22049 22054 22055 22056 22053 22058 22059 22060 22057 22062 22063 22064 22061 22066 22067 22068 22065 22070 22071 22072 22069 22074 22075 22076 22073 22078 22079 22080 22077 22082 22083 22084 22081 22086 22087 22088 22085 22090 22091 22092 22089 22094 22095 22096 22093 22098 22099 22100 22097 22102 22103 22104 22101 22106 22107 22108 22105 22110 22111 22112 22109 22114 22115 22116 22113 22118 22119 22120 22117 22122 22123 22124 22121 22126 22127 22128 22125 22130 22131 22132 22129 22134 22135 22136 22133 22138 22139 22140 22137 22142 22143 22144 22141 22146 22147 22148 22145 22150 22151 22152 22149 22154 22155 22156 22153 22158 22159 22160 22157 22162 22163 22164 22161 22166 22167 22168 22165 22170 22171 22172 22169 22174 22175 22176 22173 22178 22179 22180 22177 22182 22183 22184 22181 22186 22187 22188 22185 22190 22191 22192 22189 22194 22195 22196 22193 22198 22199 22200 22197 22202 22203 22204 22201 22206 22207 22208 22205 22210 22211 22212 22209 22214 22215 22216 22213 22218 22219 22220 22217 22222 22223 22224 22221 22226 22227 22228 22225 22230 22231 22232 22229 22234 22235 22236 22233 22238 22239 22240 22237 22242 22243 22244 22241 22246 22247 22248 22245 22250 22251 22252 22249 22254 22255 22256 22253 22258 22259 22260 22257 22262 22263 22264 22261 22266 22267 22268 22265 22270 22271 22272 22269 22274 22275 22276 22273 22278 22279 22280 22277 22282 22283 22284 22281 22286 22287 22288 22285 22290 22291 22292 22289 22294 22295 22296 22293 22298 22299 22300 22297 22302 22303 22304 22301 22306 22307 22308 22305 22310 22311 22312 22309 22314 22315 22316 22313 22318 22319 22320 22317 22322 22323 22324 22321 22326 22327 22328 22325 22330 22331 22332 22329 22334 22335 22336 22333 22338 22339 22340 22337 22342 22343 22344 22341 22346 22347 22348 22345 22350 22351 22352 22349 22354 22355 22356 22353 22358 22359 22360 22357 22362 22363 22364 22361 22366 22367 22368 22365 22370 22371 22372 22369 22374 22375 22376 22373 22378 22379 22380 22377 22382 22383 22384 22381 22386 22387 22388 22385 22390 22391 22392 22389 22394 22395 22396 22393 22398 22399 22400 22397 22402 22403 22404 22401 22406 22407 22408 22405 22410 22411 22412 22409 22414 22415 22416 22413 22418 22419 22420 22417 22422 22423 22424 22421 22426 22427 22428 22425 22430 22431 22432 22429 22434 22435 22436 22433 22438 22439 22440 22437 22442 22443 22444 22441 22446 22447 22448 22445 22450 22451 22452 22449 22454 22455 22456 22453 22458 22459 22460 22457 22462 22463 22464 22461 22466 22467 22468 22465 22470 22471 22472 22469 22474 22475 22476 22473 22478 22479 22480 22477 22482 22483 22484 22481 22486 22487 22488 22485 22490 22491 22492 22489 22494 22495 22496 22493 22498 22499 22500 22497 22502 22503 22504 22501 22506 22507 22508 22505 22510 22511 22512 22509 22514 22515 22516 22513 22518 22519 22520 22517 22522 22523 22524 22521 22526 22527 22528 22525 22530 22531 22532 22529 22534 22535 22536 22533 22538 22539 22540 22537 22542 22543 22544 22541 22546 22547 22548 22545 22550 22551 22552 22549 22554 22555 22556 22553 22558 22559 22560 22557 22562 22563 22564 22561 22566 22567 22568 22565 22570 22571 22572 22569 22574 22575 22576 22573 22578 22579 22580 22577 22582 22583 22584 22581 22586 22587 22588 22585 22590 22591 22592 22589 22594 22595 22596 22593 22598 22599 22600 22597 22602 22603 22604 22601 22606 22607 22608 22605 22610 22611 22612 22609 22614 22615 22616 22613 22618 22619 22620 22617 22622 22623 22624 22621 22626 22627 22628 22625 22630 22631 22632 22629 22634 22635 22636 22633 22638 22639 22640 22637 22642 22643 22644 22641 22646 22647 22648 22645 22650 22651 22652 22649 22654 22655 22656 22653 22658 22659 22660 22657 22662 22663 22664 22661 22666 22667 22668 22665 22670 22671 22672 22669 22674 22675 22676 22673 22678 22679 22680 22677 22682 22683 22684 22681 22686 22687 22688 22685 22690 22691 22692 22689 22694 22695 22696 22693 22698 22699 22700 22697 22702 22703 22704 22701 22706 22707 22708 22705 22710 22711 22712 22709 22714 22715 22716 22713 22718 22719 22720 22717 22722 22723 22724 22721 22726 22727 22728 22725 22730 22731 22732 22729 22734 22735 22736 22733 22738 22739 22740 22737 22742 22743 22744 22741 22746 22747 22748 22745 22750 22751 22752 22749 22754 22755 22756 22753 22758 22759 22760 22757 22762 22763 22764 22761 22766 22767 22768 22765 22770 22771 22772 22769 22774 22775 22776 22773 22778 22779 22780 22777 22782 22783 22784 22781 22786 22787 22788 22785 22790 22791 22792 22789 22794 22795 22796 22793 22798 22799 22800 22797 22802 22803 22804 22801 22806 22807 22808 22805 22810 22811 22812 22809 22814 22815 22816 22813 22818 22819 22820 22817 22822 22823 22824 22821 22826 22827 22828 22825 22830 22831 22832 22829 22834 22835 22836 22833 22838 22839 22840 22837 22842 22843 22844 22841 22846 22847 22848 22845 22850 22851 22852 22849 22854 22855 22856 22853 22858 22859 22860 22857 22862 22863 22864 22861 22866 22867 22868 22865 22870 22871 22872 22869 22874 22875 22876 22873 22878 22879 22880 22877 22882 22883 22884 22881 22886 22887 22888 22885 22890 22891 22892 22889 22894 22895 22896 22893 22898 22899 22900 22897 22902 22903 22904 22901 22906 22907 22908 22905 22910 22911 22912 22909 22914 22915 22916 22913 22918 22919 22920 22917 22922 22923 22924 22921 22926 22927 22928 22925 22930 22931 22932 22929 22934 22935 22936 22933 22938 22939 22940 22937 22942 22943 22944 22941 22946 22947 22948 22945 22950 22951 22952 22949 22954 22955 22956 22953 22958 22959 22960 22957 22962 22963 22964 22961 22966 22967 22968 22965 22970 22971 22972 22969 22974 22975 22976 22973 22978 22979 22980 22977 22982 22983 22984 22981 22986 22987 22988 22985 22990 22991 22992 22989 22994 22995 22996 22993 22998 22999 23000 22997 23002 23003 23004 23001 23006 23007 23008 23005 23010 23011 23012 23009 23014 23015 23016 23013 23018 23019 23020 23017 23022 23023 23024 23021 23026 23027 23028 23025 23030 23031 23032 23029 23034 23035 23036 23033 23038 23039 23040 23037 23042 23043 23044 23041 23046 23047 23048 23045 23050 23051 23052 23049 23054 23055 23056 23053 23058 23059 23060 23057 23062 23063 23064 23061 23066 23067 23068 23065 23070 23071 23072 23069 23074 23075 23076 23073 23078 23079 23080 23077 23082 23083 23084 23081 23086 23087 23088 23085 23090 23091 23092 23089 23094 23095 23096 23093 23098 23099 23100 23097 23102 23103 23104 23101 23106 23107 23108 23105 23110 23111 23112 23109 23114 23115 23116 23113 23118 23119 23120 23117 23122 23123 23124 23121 23126 23127 23128 23125 23130 23131 23132 23129 23134 23135 23136 23133 23138 23139 23140 23137 23142 23143 23144 23141 23146 23147 23148 23145 23150 23151 23152 23149 23154 23155 23156 23153 23158 23159 23160 23157 23162 23163 23164 23161 23166 23167 23168 23165 23170 23171 23172 23169 23174 23175 23176 23173 23178 23179 23180 23177 23182 23183 23184 23181 23186 23187 23188 23185 23190 23191 23192 23189 23194 23195 23196 23193 23198 23199 23200 23197 23202 23203 23204 23201 23206 23207 23208 23205 23210 23211 23212 23209 23214 23215 23216 23213 23218 23219 23220 23217 23222 23223 23224 23221 23226 23227 23228 23225 23230 23231 23232 23229 23234 23235 23236 23233 23238 23239 23240 23237 23242 23243 23244 23241 23246 23247 23248 23245 23250 23251 23252 23249 23254 23255 23256 23253 23258 23259 23260 23257 23262 23263 23264 23261 23266 23267 23268 23265 23270 23271 23272 23269 23274 23275 23276 23273 23278 23279 23280 23277 23282 23283 23284 23281 23286 23287 23288 23285 23290 23291 23292 23289 23294 23295 23296 23293 23298 23299 23300 23297 23302 23303 23304 23301 23306 23307 23308 23305 23310 23311 23312 23309 23314 23315 23316 23313 23318 23319 23320 23317 23322 23323 23324 23321 23326 23327 23328 23325 23330 23331 23332 23329 23334 23335 23336 23333 23338 23339 23340 23337 23342 23343 23344 23341 23346 23347 23348 23345 23350 23351 23352 23349 23354 23355 23356 23353 23358 23359 23360 23357 23362 23363 23364 23361 23366 23367 23368 23365 23370 23371 23372 23369 23374 23375 23376 23373 23378 23379 23380 23377 23382 23383 23384 23381 23386 23387 23388 23385 23390 23391 23392 23389 23394 23395 23396 23393 23398 23399 23400 23397 23402 23403 23404 23401 23406 23407 23408 23405 23410 23411 23412 23409 23414 23415 23416 23413 23418 23419 23420 23417 23422 23423 23424 23421 23426 23427 23428 23425 23430 23431 23432 23429 23434 23435 23436 23433 23438 23439 23440 23437 23442 23443 23444 23441 23446 23447 23448 23445 23450 23451 23452 23449 23454 23455 23456 23453 23458 23459 23460 23457 23462 23463 23464 23461 23466 23467 23468 23465 23470 23471 23472 23469 23474 23475 23476 23473 23478 23479 23480 23477 23482 23483 23484 23481 23486 23487 23488 23485 23490 23491 23492 23489 23494 23495 23496 23493 23498 23499 23500 23497 23502 23503 23504 23501 23506 23507 23508 23505 23510 23511 23512 23509 23514 23515 23516 23513 23518 23519 23520 23517 23522 23523 23524 23521 23526 23527 23528 23525 23530 23531 23532 23529 23534 23535 23536 23533 23538 23539 23540 23537 23542 23543 23544 23541 23546 23547 23548 23545 23550 23551 23552 23549 23554 23555 23556 23553 23558 23559 23560 23557 23562 23563 23564 23561 23566 23567 23568 23565 23570 23571 23572 23569 23574 23575 23576 23573 23578 23579 23580 23577 23582 23583 23584 23581 23586 23587 23588 23585 23590 23591 23592 23589 23594 23595 23596 23593 23598 23599 23600 23597 23602 23603 23604 23601 23606 23607 23608 23605 23610 23611 23612 23609 23614 23615 23616 23613 23618 23619 23620 23617 23622 23623 23624 23621 23626 23627 23628 23625 23630 23631 23632 23629 23634 23635 23636 23633 23638 23639 23640 23637 23642 23643 23644 23641 23646 23647 23648 23645 23650 23651 23652 23649 23654 23655 23656 23653 23658 23659 23660 23657 23662 23663 23664 23661 23666 23667 23668 23665 23670 23671 23672 23669 23674 23675 23676 23673 23678 23679 23680 23677 23682 23683 23684 23681 23686 23687 23688 23685 23690 23691 23692 23689 23694 23695 23696 23693 23698 23699 23700 23697 23702 23703 23704 23701 23706 23707 23708 23705 23710 23711 23712 23709 23714 23715 23716 23713 23718 23719 23720 23717 23722 23723 23724 23721 23726 23727 23728 23725 23730 23731 23732 23729 23734 23735 23736 23733 23738 23739 23740 23737 23742 23743 23744 23741 23746 23747 23748 23745 23750 23751 23752 23749 23754 23755 23756 23753 23758 23759 23760 23757 23762 23763 23764 23761 23766 23767 23768 23765 23770 23771 23772 23769 23774 23775 23776 23773 23778 23779 23780 23777 23782 23783 23784 23781 23786 23787 23788 23785 23790 23791 23792 23789 23794 23795 23796 23793 23798 23799 23800 23797 23802 23803 23804 23801 23806 23807 23808 23805 23810 23811 23812 23809 23814 23815 23816 23813 23818 23819 23820 23817 23822 23823 23824 23821 23826 23827 23828 23825 23830 23831 23832 23829 23834 23835 23836 23833 23838 23839 23840 23837 23842 23843 23844 23841 23846 23847 23848 23845 23850 23851 23852 23849 23854 23855 23856 23853 23858 23859 23860 23857 23862 23863 23864 23861 23866 23867 23868 23865 23870 23871 23872 23869 23874 23875 23876 23873 23878 23879 23880 23877 23882 23883 23884 23881 23886 23887 23888 23885 23890 23891 23892 23889 23894 23895 23896 23893 23898 23899 23900 23897 23902 23903 23904 23901 23906 23907 23908 23905 23910 23911 23912 23909 23914 23915 23916 23913 23918 23919 23920 23917 23922 23923 23924 23921 23926 23927 23928 23925 23930 23931 23932 23929 23934 23935 23936 23933 23938 23939 23940 23937 23942 23943 23944 23941 23946 23947 23948 23945 23950 23951 23952 23949 23954 23955 23956 23953 23958 23959 23960 23957 23962 23963 23964 23961 23966 23967 23968 23965 23970 23971 23972 23969 23974 23975 23976 23973 23978 23979 23980 23977 23982 23983 23984 23981 23986 23987 23988 23985 23990 23991 23992 23989 23994 23995 23996 23993 23998 23999 24000 23997 24002 24003 24004 24001 24006 24007 24008 24005 24010 24011 24012 24009 24014 24015 24016 24013 24018 24019 24020 24017 24022 24023 24024 24021 24026 24027 24028 24025 24030 24031 24032 24029 24034 24035 24036 24033 24038 24039 24040 24037 24042 24043 24044 24041 24046 24047 24048 24045 24050 24051 24052 24049 24054 24055 24056 24053 24058 24059 24060 24057 24062 24063 24064 24061 24066 24067 24068 24065 24070 24071 24072 24069 24074 24075 24076 24073 24078 24079 24080 24077 24082 24083 24084 24081 24086 24087 24088 24085 24090 24091 24092 24089 24094 24095 24096 24093 24098 24099 24100 24097 24102 24103 24104 24101 24106 24107 24108 24105 24110 24111 24112 24109 24114 24115 24116 24113 24118 24119 24120 24117 24122 24123 24124 24121 24126 24127 24128 24125 24130 24131 24132 24129 24134 24135 24136 24133 24138 24139 24140 24137 24142 24143 24144 24141 24146 24147 24148 24145 24150 24151 24152 24149 24154 24155 24156 24153 24158 24159 24160 24157 24162 24163 24164 24161 24166 24167 24168 24165 24170 24171 24172 24169 24174 24175 24176 24173 24178 24179 24180 24177 24182 24183 24184 24181 24186 24187 24188 24185 24190 24191 24192 24189 24194 24195 24196 24193 24198 24199 24200 24197 24202 24203 24204 24201 24206 24207 24208 24205 24210 24211 24212 24209 24214 24215 24216 24213 24218 24219 24220 24217 24222 24223 24224 24221 24226 24227 24228 24225 24230 24231 24232 24229 24234 24235 24236 24233 24238 24239 24240 24237 24242 24243 24244 24241 24246 24247 24248 24245 24250 24251 24252 24249 24254 24255 24256 24253 24258 24259 24260 24257 24262 24263 24264 24261 24266 24267 24268 24265 24270 24271 24272 24269 24274 24275 24276 24273 24278 24279 24280 24277 24282 24283 24284 24281 24286 24287 24288 24285 24290 24291 24292 24289 24294 24295 24296 24293 24298 24299 24300 24297 24302 24303 24304 24301 24306 24307 24308 24305 24310 24311 24312 24309 24314 24315 24316 24313 24318 24319 24320 24317 24322 24323 24324 24321 24326 24327 24328 24325 24330 24331 24332 24329 24334 24335 24336 24333 24338 24339 24340 24337 24342 24343 24344 24341 24346 24347 24348 24345 24350 24351 24352 24349 24354 24355 24356 24353 24358 24359 24360 24357 24362 24363 24364 24361 24366 24367 24368 24365 24370 24371 24372 24369 24374 24375 24376 24373 24378 24379 24380 24377 24382 24383 24384 24381 24386 24387 24388 24385 24390 24391 24392 24389 24394 24395 24396 24393 24398 24399 24400 24397 24402 24403 24404 24401 24406 24407 24408 24405 24410 24411 24412 24409 24414 24415 24416 24413 24418 24419 24420 24417 24422 24423 24424 24421 24426 24427 24428 24425 24430 24431 24432 24429 24434 24435 24436 24433 24438 24439 24440 24437 24442 24443 24444 24441 24446 24447 24448 24445 24450 24451 24452 24449 24454 24455 24456 24453 24458 24459 24460 24457 24462 24463 24464 24461 24466 24467 24468 24465 24470 24471 24472 24469 24474 24475 24476 24473 24478 24479 24480 24477 24482 24483 24484 24481 24486 24487 24488 24485 24490 24491 24492 24489 24494 24495 24496 24493 24498 24499 24500 24497 24502 24503 24504 24501 24506 24507 24508 24505 24510 24511 24512 24509 24514 24515 24516 24513 24518 24519 24520 24517 24522 24523 24524 24521 24526 24527 24528 24525 24530 24531 24532 24529 24534 24535 24536 24533 24538 24539 24540 24537 24542 24543 24544 24541 24546 24547 24548 24545 24550 24551 24552 24549 24554 24555 24556 24553 24558 24559 24560 24557 24562 24563 24564 24561 24566 24567 24568 24565 24570 24571 24572 24569 24574 24575 24576 24573 24578 24579 24580 24577 24582 24583 24584 24581 24586 24587 24588 24585 24590 24591 24592 24589 24594 24595 24596 24593 24598 24599 24600 24597 24602 24603 24604 24601 24606 24607 24608 24605 24610 24611 24612 24609 24614 24615 24616 24613 24618 24619 24620 24617 24622 24623 24624 24621 24626 24627 24628 24625 24630 24631 24632 24629 24634 24635 24636 24633 24638 24639 24640 24637 24642 24643 24644 24641 24646 24647 24648 24645 24650 24651 24652 24649 24654 24655 24656 24653 24658 24659 24660 24657 24662 24663 24664 24661 24666 24667 24668 24665 24670 24671 24672 24669 24674 24675 24676 24673 24678 24679 24680 24677 24682 24683 24684 24681 24686 24687 24688 24685 24690 24691 24692 24689 24694 24695 24696 24693 24698 24699 24700 24697 24702 24703 24704 24701 24706 24707 24708 24705 24710 24711 24712 24709 24714 24715 24716 24713 24718 24719 24720 24717 24722 24723 24724 24721 24726 24727 24728 24725 24730 24731 24732 24729 24734 24735 24736 24733 24738 24739 24740 24737 24742 24743 24744 24741 24746 24747 24748 24745 24750 24751 24752 24749 24754 24755 24756 24753 24758 24759 24760 24757 24762 24763 24764 24761 24766 24767 24768 24765 24770 24771 24772 24769 24774 24775 24776 24773 24778 24779 24780 24777 24782 24783 24784 24781 24786 24787 24788 24785 24790 24791 24792 24789 24794 24795 24796 24793 24798 24799 24800 24797 24802 24803 24804 24801 24806 24807 24808 24805 24810 24811 24812 24809 24814 24815 24816 24813 24818 24819 24820 24817 24822 24823 24824 24821 24826 24827 24828 24825 24830 24831 24832 24829 24834 24835 24836 24833 24838 24839 24840 24837 24842 24843 24844 24841 24846 24847 24848 24845 24850 24851 24852 24849 24854 24855 24856 24853 24858 24859 24860 24857 24862 24863 24864 24861 24866 24867 24868 24865 24870 24871 24872 24869 24874 24875 24876 24873 24878 24879 24880 24877 24882 24883 24884 24881 24886 24887 24888 24885 24890 24891 24892 24889 24894 24895 24896 24893 24898 24899 24900 24897 24902 24903 24904 24901 24906 24907 24908 24905 24910 24911 24912 24909 24914 24915 24916 24913 24918 24919 24920 24917 24922 24923 24924 24921 24926 24927 24928 24925 24930 24931 24932 24929 24934 24935 24936 24933 24938 24939 24940 24937 24942 24943 24944 24941 24946 24947 24948 24945 24950 24951 24952 24949 24954 24955 24956 24953 24958 24959 24960 24957 24962 24963 24964 24961 24966 24967 24968 24965 24970 24971 24972 24969 24974 24975 24976 24973 24978 24979 24980 24977 24982 24983 24984 24981 24986 24987 24988 24985 24990 24991 24992 24989 24994 24995 24996 24993 24998 24999 25000 24997 25002 25003 25004 25001 25006 25007 25008 25005 25010 25011 25012 25009 25014 25015 25016 25013 25018 25019 25020 25017 25022 25023 25024 25021 25026 25027 25028 25025 25030 25031 25032 25029 25034 25035 25036 25033 25038 25039 25040 25037 25042 25043 25044 25041 25046 25047 25048 25045 25050 25051 25052 25049 25054 25055 25056 25053 25058 25059 25060 25057 25062 25063 25064 25061 25066 25067 25068 25065 25070 25071 25072 25069 25074 25075 25076 25073 25078 25079 25080 25077 25082 25083 25084 25081 25086 25087 25088 25085 25090 25091 25092 25089 25094 25095 25096 25093 25098 25099 25100 25097 25102 25103 25104 25101 25106 25107 25108 25105 25110 25111 25112 25109 25114 25115 25116 25113 25118 25119 25120 25117 25122 25123 25124 25121 25126 25127 25128 25125 25130 25131 25132 25129 25134 25135 25136 25133 25138 25139 25140 25137 25142 25143 25144 25141 25146 25147 25148 25145 25150 25151 25152 25149 25154 25155 25156 25153 25158 25159 25160 25157 25162 25163 25164 25161 25166 25167 25168 25165 25170 25171 25172 25169 25174 25175 25176 25173 25178 25179 25180 25177 25182 25183 25184 25181 25186 25187 25188 25185 25190 25191 25192 25189 25194 25195 25196 25193 25198 25199 25200 25197 25202 25203 25204 25201 25206 25207 25208 25205 25210 25211 25212 25209 25214 25215 25216 25213 25218 25219 25220 25217 25222 25223 25224 25221 25226 25227 25228 25225 25230 25231 25232 25229 25234 25235 25236 25233 25238 25239 25240 25237 25242 25243 25244 25241 25246 25247 25248 25245 25250 25251 25252 25249 25254 25255 25256 25253 25258 25259 25260 25257 25262 25263 25264 25261 25266 25267 25268 25265 25270 25271 25272 25269 25274 25275 25276 25273 25278 25279 25280 25277 25282 25283 25284 25281 25286 25287 25288 25285 25290 25291 25292 25289 25294 25295 25296 25293 25298 25299 25300 25297 25302 25303 25304 25301 25306 25307 25308 25305 25310 25311 25312 25309 25314 25315 25316 25313 25318 25319 25320 25317 25322 25323 25324 25321 25326 25327 25328 25325 25330 25331 25332 25329 25334 25335 25336 25333 25338 25339 25340 25337 25342 25343 25344 25341 25346 25347 25348 25345 25350 25351 25352 25349 25354 25355 25356 25353 25358 25359 25360 25357 25362 25363 25364 25361 25366 25367 25368 25365 25370 25371 25372 25369 25374 25375 25376 25373 25378 25379 25380 25377 25382 25383 25384 25381 25386 25387 25388 25385 25390 25391 25392 25389 25394 25395 25396 25393 25398 25399 25400 25397 25402 25403 25404 25401 25406 25407 25408 25405 25410 25411 25412 25409 25414 25415 25416 25413 25418 25419 25420 25417 25422 25423 25424 25421 25426 25427 25428 25425 25430 25431 25432 25429 25434 25435 25436 25433 25438 25439 25440 25437 25442 25443 25444 25441 25446 25447 25448 25445 25450 25451 25452 25449 25454 25455 25456 25453 25458 25459 25460 25457 25462 25463 25464 25461 25466 25467 25468 25465 25470 25471 25472 25469 25474 25475 25476 25473 25478 25479 25480 25477 25482 25483 25484 25481 25486 25487 25488 25485 25490 25491 25492 25489 25494 25495 25496 25493 25498 25499 25500 25497 25502 25503 25504 25501 25506 25507 25508 25505 25510 25511 25512 25509 25514 25515 25516 25513 25518 25519 25520 25517 25522 25523 25524 25521 25526 25527 25528 25525 25530 25531 25532 25529 25534 25535 25536 25533 25538 25539 25540 25537 25542 25543 25544 25541 25546 25547 25548 25545 25550 25551 25552 25549 25554 25555 25556 25553 25558 25559 25560 25557 25562 25563 25564 25561 25566 25567 25568 25565 25570 25571 25572 25569 25574 25575 25576 25573 25578 25579 25580 25577 25582 25583 25584 25581 25586 25587 25588 25585 25590 25591 25592 25589 25594 25595 25596 25593 25598 25599 25600 25597 25602 25603 25604 25601 25606 25607 25608 25605 25610 25611 25612 25609 25614 25615 25616 25613 25618 25619 25620 25617 25622 25623 25624 25621 25626 25627 25628 25625 25630 25631 25632 25629 25634 25635 25636 25633 25638 25639 25640 25637 25642 25643 25644 25641 25646 25647 25648 25645 25650 25651 25652 25649 25654 25655 25656 25653 25658 25659 25660 25657 25662 25663 25664 25661 25666 25667 25668 25665 25670 25671 25672 25669 25674 25675 25676 25673 25678 25679 25680 25677 25682 25683 25684 25681 25686 25687 25688 25685 25690 25691 25692 25689 25694 25695 25696 25693 25698 25699 25700 25697 25702 25703 25704 25701 25706 25707 25708 25705 25710 25711 25712 25709 25714 25715 25716 25713 25718 25719 25720 25717 25722 25723 25724 25721 25726 25727 25728 25725 25730 25731 25732 25729 25734 25735 25736 25733 25738 25739 25740 25737 25742 25743 25744 25741 25746 25747 25748 25745 25750 25751 25752 25749 25754 25755 25756 25753 25758 25759 25760 25757 25762 25763 25764 25761 25766 25767 25768 25765 25770 25771 25772 25769 25774 25775 25776 25773 25778 25779 25780 25777 25782 25783 25784 25781 25786 25787 25788 25785 25790 25791 25792 25789 25794 25795 25796 25793 25798 25799 25800 25797 25802 25803 25804 25801 25806 25807 25808 25805 25810 25811 25812 25809 25814 25815 25816 25813 25818 25819 25820 25817 25822 25823 25824 25821 25826 25827 25828 25825 25830 25831 25832 25829 25834 25835 25836 25833 25838 25839 25840 25837 25842 25843 25844 25841 25846 25847 25848 25845 25850 25851 25852 25849 25854 25855 25856 25853 25858 25859 25860 25857 25862 25863 25864 25861 25866 25867 25868 25865 25870 25871 25872 25869 25874 25875 25876 25873 25878 25879 25880 25877 25882 25883 25884 25881 25886 25887 25888 25885 25890 25891 25892 25889 25894 25895 25896 25893 25898 25899 25900 25897 25902 25903 25904 25901 25906 25907 25908 25905 25910 25911 25912 25909 25914 25915 25916 25913 25918 25919 25920 25917 25922 25923 25924 25921 25926 25927 25928 25925 25930 25931 25932 25929 25934 25935 25936 25933 25938 25939 25940 25937 25942 25943 25944 25941 25946 25947 25948 25945 25950 25951 25952 25949 25954 25955 25956 25953 25958 25959 25960 25957 25962 25963 25964 25961 25966 25967 25968 25965 25970 25971 25972 25969 25974 25975 25976 25973 25978 25979 25980 25977 25982 25983 25984 25981 25986 25987 25988 25985 25990 25991 25992 25989 25994 25995 25996 25993 25998 25999 26000 25997 26002 26003 26004 26001 26006 26007 26008 26005 26010 26011 26012 26009 26014 26015 26016 26013 26018 26019 26020 26017 26022 26023 26024 26021 26026 26027 26028 26025 26030 26031 26032 26029 26034 26035 26036 26033 26038 26039 26040 26037 26042 26043 26044 26041 26046 26047 26048 26045 26050 26051 26052 26049 26054 26055 26056 26053 26058 26059 26060 26057 26062 26063 26064 26061 26066 26067 26068 26065 26070 26071 26072 26069 26074 26075 26076 26073 26078 26079 26080 26077 26082 26083 26084 26081 26086 26087 26088 26085 26090 26091 26092 26089 26094 26095 26096 26093 26098 26099 26100 26097 26102 26103 26104 26101 26106 26107 26108 26105 26110 26111 26112 26109 26114 26115 26116 26113 26118 26119 26120 26117 26122 26123 26124 26121 26126 26127 26128 26125 26130 26131 26132 26129 26134 26135 26136 26133 26138 26139 26140 26137 26142 26143 26144 26141 26146 26147 26148 26145 26150 26151 26152 26149 26154 26155 26156 26153 26158 26159 26160 26157 26162 26163 26164 26161 26166 26167 26168 26165 26170 26171 26172 26169 26174 26175 26176 26173 26178 26179 26180 26177 26182 26183 26184 26181 26186 26187 26188 26185 26190 26191 26192 26189 26194 26195 26196 26193 26198 26199 26200 26197 26202 26203 26204 26201 26206 26207 26208 26205 26210 26211 26212 26209 26214 26215 26216 26213 26218 26219 26220 26217 26222 26223 26224 26221 26226 26227 26228 26225 26230 26231 26232 26229 26234 26235 26236 26233 26238 26239 26240 26237 26242 26243 26244 26241 26246 26247 26248 26245 26250 26251 26252 26249 26254 26255 26256 26253 26258 26259 26260 26257 26262 26263 26264 26261 26266 26267 26268 26265 26270 26271 26272 26269 26274 26275 26276 26273 26278 26279 26280 26277 26282 26283 26284 26281 26286 26287 26288 26285 26290 26291 26292 26289 26294 26295 26296 26293 26298 26299 26300 26297 26302 26303 26304 26301 26306 26307 26308 26305 26310 26311 26312 26309 26314 26315 26316 26313 26318 26319 26320 26317 26322 26323 26324 26321 26326 26327 26328 26325 26330 26331 26332 26329 26334 26335 26336 26333 26338 26339 26340 26337 26342 26343 26344 26341 26346 26347 26348 26345 26350 26351 26352 26349 26354 26355 26356 26353 26358 26359 26360 26357 26362 26363 26364 26361 26366 26367 26368 26365 26370 26371 26372 26369 26374 26375 26376 26373 26378 26379 26380 26377 26382 26383 26384 26381 26386 26387 26388 26385 26390 26391 26392 26389 26394 26395 26396 26393 26398 26399 26400 26397 26402 26403 26404 26401 26406 26407 26408 26405 26410 26411 26412 26409 26414 26415 26416 26413 26418 26419 26420 26417 26422 26423 26424 26421 26426 26427 26428 26425 26430 26431 26432 26429 26434 26435 26436 26433 26438 26439 26440 26437 26442 26443 26444 26441 26446 26447 26448 26445 26450 26451 26452 26449 26454 26455 26456 26453 26458 26459 26460 26457 26462 26463 26464 26461 26466 26467 26468 26465 26470 26471 26472 26469 26474 26475 26476 26473 26478 26479 26480 26477 26482 26483 26484 26481 26486 26487 26488 26485 26490 26491 26492 26489 26494 26495 26496 26493 26498 26499 26500 26497 26502 26503 26504 26501 26506 26507 26508 26505 26510 26511 26512 26509 26514 26515 26516 26513 26518 26519 26520 26517 26522 26523 26524 26521 26526 26527 26528 26525 26530 26531 26532 26529 26534 26535 26536 26533 26538 26539 26540 26537 26542 26543 26544 26541 26546 26547 26548 26545 26550 26551 26552 26549 26554 26555 26556 26553 26558 26559 26560 26557 26562 26563 26564 26561 26566 26567 26568 26565 26570 26571 26572 26569 26574 26575 26576 26573 26578 26579 26580 26577 26582 26583 26584 26581 26586 26587 26588 26585 26590 26591 26592 26589 26594 26595 26596 26593 26598 26599 26600 26597 26602 26603 26604 26601 26606 26607 26608 26605 26610 26611 26612 26609 26614 26615 26616 26613 26618 26619 26620 26617 26622 26623 26624 26621 26626 26627 26628 26625 26630 26631 26632 26629 26634 26635 26636 26633 26638 26639 26640 26637 26642 26643 26644 26641 26646 26647 26648 26645 26650 26651 26652 26649 26654 26655 26656 26653 26658 26659 26660 26657 26662 26663 26664 26661 26666 26667 26668 26665 26670 26671 26672 26669 26674 26675 26676 26673 26678 26679 26680 26677 26682 26683 26684 26681 26686 26687 26688 26685 26690 26691 26692 26689 26694 26695 26696 26693 26698 26699 26700 26697 26702 26703 26704 26701 26706 26707 26708 26705 26710 26711 26712 26709 26714 26715 26716 26713 26718 26719 26720 26717 26722 26723 26724 26721 26726 26727 26728 26725 26730 26731 26732 26729 26734 26735 26736 26733 26738 26739 26740 26737 26742 26743 26744 26741 26746 26747 26748 26745 26750 26751 26752 26749 26754 26755 26756 26753 26758 26759 26760 26757 26762 26763 26764 26761 26766 26767 26768 26765 26770 26771 26772 26769 26774 26775 26776 26773 26778 26779 26780 26777 26782 26783 26784 26781 26786 26787 26788 26785 26790 26791 26792 26789 26794 26795 26796 26793 26798 26799 26800 26797 26802 26803 26804 26801 26806 26807 26808 26805 26810 26811 26812 26809 26814 26815 26816 26813 26818 26819 26820 26817 26822 26823 26824 26821 26826 26827 26828 26825 26830 26831 26832 26829 26834 26835 26836 26833 26838 26839 26840 26837 26842 26843 26844 26841 26846 26847 26848 26845 26850 26851 26852 26849 26854 26855 26856 26853 26858 26859 26860 26857 26862 26863 26864 26861 26866 26867 26868 26865 26870 26871 26872 26869 26874 26875 26876 26873 26878 26879 26880 26877 26882 26883 26884 26881 26886 26887 26888 26885 26890 26891 26892 26889 26894 26895 26896 26893 26898 26899 26900 26897 26902 26903 26904 26901 26906 26907 26908 26905 26910 26911 26912 26909 26914 26915 26916 26913 26918 26919 26920 26917 26922 26923 26924 26921 26926 26927 26928 26925 26930 26931 26932 26929 26934 26935 26936 26933 26938 26939 26940 26937 26942 26943 26944 26941 26946 26947 26948 26945 26950 26951 26952 26949 26954 26955 26956 26953 26958 26959 26960 26957 26962 26963 26964 26961 26966 26967 26968 26965 26970 26971 26972 26969 26974 26975 26976 26973 26978 26979 26980 26977 26982 26983 26984 26981 26986 26987 26988 26985 26990 26991 26992 26989 26994 26995 26996 26993 26998 26999 27000 26997 27002 27003 27004 27001 27006 27007 27008 27005 27010 27011 27012 27009 27014 27015 27016 27013 27018 27019 27020 27017 27022 27023 27024 27021 27026 27027 27028 27025 27030 27031 27032 27029 27034 27035 27036 27033 27038 27039 27040 27037 27042 27043 27044 27041 27046 27047 27048 27045 27050 27051 27052 27049 27054 27055 27056 27053 27058 27059 27060 27057 27062 27063 27064 27061 27066 27067 27068 27065 27070 27071 27072 27069 27074 27075 27076 27073 27078 27079 27080 27077 27082 27083 27084 27081 27086 27087 27088 27085 27090 27091 27092 27089 27094 27095 27096 27093 27098 27099 27100 27097 27102 27103 27104 27101 27106 27107 27108 27105 27110 27111 27112 27109 27114 27115 27116 27113 27118 27119 27120 27117 27122 27123 27124 27121 27126 27127 27128 27125 27130 27131 27132 27129 27134 27135 27136 27133 27138 27139 27140 27137 27142 27143 27144 27141 27146 27147 27148 27145 27150 27151 27152 27149 27154 27155 27156 27153 27158 27159 27160 27157 27162 27163 27164 27161 27166 27167 27168 27165 27170 27171 27172 27169 27174 27175 27176 27173 27178 27179 27180 27177 27182 27183 27184 27181 27186 27187 27188 27185 27190 27191 27192 27189 27194 27195 27196 27193 27198 27199 27200 27197 27202 27203 27204 27201 27206 27207 27208 27205 27210 27211 27212 27209 27214 27215 27216 27213 27218 27219 27220 27217 27222 27223 27224 27221 27226 27227 27228 27225 27230 27231 27232 27229 27234 27235 27236 27233 27238 27239 27240 27237 27242 27243 27244 27241 27246 27247 27248 27245 27250 27251 27252 27249 27254 27255 27256 27253 27258 27259 27260 27257 27262 27263 27264 27261 27266 27267 27268 27265 27270 27271 27272 27269 27274 27275 27276 27273 27278 27279 27280 27277 27282 27283 27284 27281 27286 27287 27288 27285 27290 27291 27292 27289 27294 27295 27296 27293 27298 27299 27300 27297 27302 27303 27304 27301 27306 27307 27308 27305 27310 27311 27312 27309 27314 27315 27316 27313 27318 27319 27320 27317 27322 27323 27324 27321 27326 27327 27328 27325 27330 27331 27332 27329 27334 27335 27336 27333 27338 27339 27340 27337 27342 27343 27344 27341 27346 27347 27348 27345 27350 27351 27352 27349 27354 27355 27356 27353 27358 27359 27360 27357 27362 27363 27364 27361 27366 27367 27368 27365 27370 27371 27372 27369 27374 27375 27376 27373 27378 27379 27380 27377 27382 27383 27384 27381 27386 27387 27388 27385 27390 27391 27392 27389 27394 27395 27396 27393 27398 27399 27400 27397 27402 27403 27404 27401 27406 27407 27408 27405 27410 27411 27412 27409 27414 27415 27416 27413 27418 27419 27420 27417 27422 27423 27424 27421 27426 27427 27428 27425 27430 27431 27432 27429 27434 27435 27436 27433 27438 27439 27440 27437 27442 27443 27444 27441 27446 27447 27448 27445 27450 27451 27452 27449 27454 27455 27456 27453 27458 27459 27460 27457 27462 27463 27464 27461 27466 27467 27468 27465 27470 27471 27472 27469 27474 27475 27476 27473 27478 27479 27480 27477 27482 27483 27484 27481 27486 27487 27488 27485 27490 27491 27492 27489 27494 27495 27496 27493 27498 27499 27500 27497 27502 27503 27504 27501 27506 27507 27508 27505 27510 27511 27512 27509 27514 27515 27516 27513 27518 27519 27520 27517 27522 27523 27524 27521 27526 27527 27528 27525 27530 27531 27532 27529 27534 27535 27536 27533 27538 27539 27540 27537 27542 27543 27544 27541 27546 27547 27548 27545 27550 27551 27552 27549 27554 27555 27556 27553 27558 27559 27560 27557 27562 27563 27564 27561 27566 27567 27568 27565 27570 27571 27572 27569 27574 27575 27576 27573 27578 27579 27580 27577 27582 27583 27584 27581 27586 27587 27588 27585 27590 27591 27592 27589 27594 27595 27596 27593 27598 27599 27600 27597 27602 27603 27604 27601 27606 27607 27608 27605 27610 27611 27612 27609 27614 27615 27616 27613 27618 27619 27620 27617 27622 27623 27624 27621 27626 27627 27628 27625 27630 27631 27632 27629 27634 27635 27636 27633 27638 27639 27640 27637 27642 27643 27644 27641 27646 27647 27648 27645 27650 27651 27652 27649 27654 27655 27656 27653 27658 27659 27660 27657 27662 27663 27664 27661 27666 27667 27668 27665 27670 27671 27672 27669 27674 27675 27676 27673 27678 27679 27680 27677 27682 27683 27684 27681 27686 27687 27688 27685 27690 27691 27692 27689 27694 27695 27696 27693 27698 27699 27700 27697 27702 27703 27704 27701 27706 27707 27708 27705 27710 27711 27712 27709 27714 27715 27716 27713 27718 27719 27720 27717 27722 27723 27724 27721 27726 27727 27728 27725 27730 27731 27732 27729 27734 27735 27736 27733 27738 27739 27740 27737 27742 27743 27744 27741 27746 27747 27748 27745 27750 27751 27752 27749 27754 27755 27756 27753 27758 27759 27760 27757 27762 27763 27764 27761 27766 27767 27768 27765 27770 27771 27772 27769 27774 27775 27776 27773 27778 27779 27780 27777 27782 27783 27784 27781 27786 27787 27788 27785 27790 27791 27792 27789 27794 27795 27796 27793 27798 27799 27800 27797 27802 27803 27804 27801 27806 27807 27808 27805 27810 27811 27812 27809 27814 27815 27816 27813 27818 27819 27820 27817 27822 27823 27824 27821 27826 27827 27828 27825 27830 27831 27832 27829 27834 27835 27836 27833 27838 27839 27840 27837 27842 27843 27844 27841 27846 27847 27848 27845 27850 27851 27852 27849 27854 27855 27856 27853 27858 27859 27860 27857 27862 27863 27864 27861 27866 27867 27868 27865 27870 27871 27872 27869 27874 27875 27876 27873 27878 27879 27880 27877 27882 27883 27884 27881 27886 27887 27888 27885 27890 27891 27892 27889 27894 27895 27896 27893 27898 27899 27900 27897 27902 27903 27904 27901 27906 27907 27908 27905 27910 27911 27912 27909 27914 27915 27916 27913 27918 27919 27920 27917 27922 27923 27924 27921 27926 27927 27928 27925 27930 27931 27932 27929 27934 27935 27936 27933 27938 27939 27940 27937 27942 27943 27944 27941 27946 27947 27948 27945 27950 27951 27952 27949 27954 27955 27956 27953 27958 27959 27960 27957 27962 27963 27964 27961 27966 27967 27968 27965 27970 27971 27972 27969 27974 27975 27976 27973 27978 27979 27980 27977 27982 27983 27984 27981 27986 27987 27988 27985 27990 27991 27992 27989 27994 27995 27996 27993 27998 27999 28000 27997 28002 28003 28004 28001 28006 28007 28008 28005 28010 28011 28012 28009 28014 28015 28016 28013 28018 28019 28020 28017 28022 28023 28024 28021 28026 28027 28028 28025 28030 28031 28032 28029 28034 28035 28036 28033 28038 28039 28040 28037 28042 28043 28044 28041 28046 28047 28048 28045 28050 28051 28052 28049 28054 28055 28056 28053 28058 28059 28060 28057 28062 28063 28064 28061 28066 28067 28068 28065 28070 28071 28072 28069 28074 28075 28076 28073 28078 28079 28080 28077 28082 28083 28084 28081 28086 28087 28088 28085 28090 28091 28092 28089 28094 28095 28096 28093 28098 28099 28100 28097 28102 28103 28104 28101 28106 28107 28108 28105 28110 28111 28112 28109 28114 28115 28116 28113 28118 28119 28120 28117 28122 28123 28124 28121 28126 28127 28128 28125 28130 28131 28132 28129 28134 28135 28136 28133 28138 28139 28140 28137 28142 28143 28144 28141 28146 28147 28148 28145 28150 28151 28152 28149 28154 28155 28156 28153 28158 28159 28160 28157 28162 28163 28164 28161 28166 28167 28168 28165 28170 28171 28172 28169 28174 28175 28176 28173 28178 28179 28180 28177 28182 28183 28184 28181 28186 28187 28188 28185 28190 28191 28192 28189 28194 28195 28196 28193 28198 28199 28200 28197 28202 28203 28204 28201 28206 28207 28208 28205 28210 28211 28212 28209 28214 28215 28216 28213 28218 28219 28220 28217 28222 28223 28224 28221 28226 28227 28228 28225 28230 28231 28232 28229 28234 28235 28236 28233 28238 28239 28240 28237 28242 28243 28244 28241 28246 28247 28248 28245 28250 28251 28252 28249 28254 28255 28256 28253 28258 28259 28260 28257 28262 28263 28264 28261 28266 28267 28268 28265 28270 28271 28272 28269 28274 28275 28276 28273 28278 28279 28280 28277 28282 28283 28284 28281 28286 28287 28288 28285 28290 28291 28292 28289 28294 28295 28296 28293 28298 28299 28300 28297 28302 28303 28304 28301 28306 28307 28308 28305 28310 28311 28312 28309 28314 28315 28316 28313 28318 28319 28320 28317 28322 28323 28324 28321 28326 28327 28328 28325 28330 28331 28332 28329 28334 28335 28336 28333 28338 28339 28340 28337 28342 28343 28344 28341 28346 28347 28348 28345 28350 28351 28352 28349 28354 28355 28356 28353 28358 28359 28360 28357 28362 28363 28364 28361 28366 28367 28368 28365 28370 28371 28372 28369 28374 28375 28376 28373 28378 28379 28380 28377 28382 28383 28384 28381 28386 28387 28388 28385 28390 28391 28392 28389 28394 28395 28396 28393 28398 28399 28400 28397 28402 28403 28404 28401 28406 28407 28408 28405 28410 28411 28412 28409 28414 28415 28416 28413 28418 28419 28420 28417 28422 28423 28424 28421 28426 28427 28428 28425 28430 28431 28432 28429 28434 28435 28436 28433 28438 28439 28440 28437 28442 28443 28444 28441 28446 28447 28448 28445 28450 28451 28452 28449 28454 28455 28456 28453 28458 28459 28460 28457 28462 28463 28464 28461 28466 28467 28468 28465 28470 28471 28472 28469 28474 28475 28476 28473 28478 28479 28480 28477 28482 28483 28484 28481 28486 28487 28488 28485 28490 28491 28492 28489 28494 28495 28496 28493 28498 28499 28500 28497 28502 28503 28504 28501 28506 28507 28508 28505 28510 28511 28512 28509 28514 28515 28516 28513 28518 28519 28520 28517 28522 28523 28524 28521 28526 28527 28528 28525 28530 28531 28532 28529 28534 28535 28536 28533 28538 28539 28540 28537 28542 28543 28544 28541 28546 28547 28548 28545 28550 28551 28552 28549 28554 28555 28556 28553 28558 28559 28560 28557 28562 28563 28564 28561 28566 28567 28568 28565 28570 28571 28572 28569 28574 28575 28576 28573 28578 28579 28580 28577 28582 28583 28584 28581 28586 28587 28588 28585 28590 28591 28592 28589 28594 28595 28596 28593 28598 28599 28600 28597 28602 28603 28604 28601 28606 28607 28608 28605 28610 28611 28612 28609 28614 28615 28616 28613 28618 28619 28620 28617 28622 28623 28624 28621 28626 28627 28628 28625 28630 28631 28632 28629 28634 28635 28636 28633 28638 28639 28640 28637 28642 28643 28644 28641 28646 28647 28648 28645 28650 28651 28652 28649 28654 28655 28656 28653 28658 28659 28660 28657 28662 28663 28664 28661 28666 28667 28668 28665 28670 28671 28672 28669 28674 28675 28676 28673 28678 28679 28680 28677 28682 28683 28684 28681 28686 28687 28688 28685 28690 28691 28692 28689 28694 28695 28696 28693 28698 28699 28700 28697 28702 28703 28704 28701 28706 28707 28708 28705 28710 28711 28712 28709 28714 28715 28716 28713 28718 28719 28720 28717 28722 28723 28724 28721 28726 28727 28728 28725 28730 28731 28732 28729 28734 28735 28736 28733 28738 28739 28740 28737 28742 28743 28744 28741 28746 28747 28748 28745 28750 28751 28752 28749 28754 28755 28756 28753 28758 28759 28760 28757 28762 28763 28764 28761 28766 28767 28768 28765 28770 28771 28772 28769 28774 28775 28776 28773 28778 28779 28780 28777 28782 28783 28784 28781 28786 28787 28788 28785 28790 28791 28792 28789 28794 28795 28796 28793 28798 28799 28800 28797 28802 28803 28804 28801 28806 28807 28808 28805 28810 28811 28812 28809 28814 28815 28816 28813 28818 28819 28820 28817 28822 28823 28824 28821 28826 28827 28828 28825 28830 28831 28832 28829 28834 28835 28836 28833 28838 28839 28840 28837 28842 28843 28844 28841 28846 28847 28848 28845 28850 28851 28852 28849 28854 28855 28856 28853 28858 28859 28860 28857 28862 28863 28864 28861 28866 28867 28868 28865 28870 28871 28872 28869 28874 28875 28876 28873 28878 28879 28880 28877 28882 28883 28884 28881 28886 28887 28888 28885 28890 28891 28892 28889 28894 28895 28896 28893 28898 28899 28900 28897 28902 28903 28904 28901 28906 28907 28908 28905 28910 28911 28912 28909 28914 28915 28916 28913 28918 28919 28920 28917 28922 28923 28924 28921 28926 28927 28928 28925 28930 28931 28932 28929 28934 28935 28936 28933 28938 28939 28940 28937 28942 28943 28944 28941 28946 28947 28948 28945 28950 28951 28952 28949 28954 28955 28956 28953 28958 28959 28960 28957 28962 28963 28964 28961 28966 28967 28968 28965 28970 28971 28972 28969 28974 28975 28976 28973 28978 28979 28980 28977 28982 28983 28984 28981 28986 28987 28988 28985 28990 28991 28992 28989 28994 28995 28996 28993 28998 28999 29000 28997 29002 29003 29004 29001 29006 29007 29008 29005 29010 29011 29012 29009 29014 29015 29016 29013 29018 29019 29020 29017 29022 29023 29024 29021 29026 29027 29028 29025 29030 29031 29032 29029 29034 29035 29036 29033 29038 29039 29040 29037 29042 29043 29044 29041 29046 29047 29048 29045 29050 29051 29052 29049 29054 29055 29056 29053 29058 29059 29060 29057 29062 29063 29064 29061 29066 29067 29068 29065 29070 29071 29072 29069 29074 29075 29076 29073 29078 29079 29080 29077 29082 29083 29084 29081 29086 29087 29088 29085 29090 29091 29092 29089 29094 29095 29096 29093 29098 29099 29100 29097 29102 29103 29104 29101 29106 29107 29108 29105 29110 29111 29112 29109 29114 29115 29116 29113 29118 29119 29120 29117 29122 29123 29124 29121 29126 29127 29128 29125 29130 29131 29132 29129 29134 29135 29136 29133 29138 29139 29140 29137 29142 29143 29144 29141 29146 29147 29148 29145 29150 29151 29152 29149 29154 29155 29156 29153 29158 29159 29160 29157 29162 29163 29164 29161 29166 29167 29168 29165 29170 29171 29172 29169 29174 29175 29176 29173 29178 29179 29180 29177 29182 29183 29184 29181 29186 29187 29188 29185 29190 29191 29192 29189 29194 29195 29196 29193 29198 29199 29200 29197 29202 29203 29204 29201 29206 29207 29208 29205 29210 29211 29212 29209 29214 29215 29216 29213 29218 29219 29220 29217 29222 29223 29224 29221 29226 29227 29228 29225 29230 29231 29232 29229 29234 29235 29236 29233 29238 29239 29240 29237 29242 29243 29244 29241 29246 29247 29248 29245 29250 29251 29252 29249 29254 29255 29256 29253 29258 29259 29260 29257 29262 29263 29264 29261 29266 29267 29268 29265 29270 29271 29272 29269 29274 29275 29276 29273 29278 29279 29280 29277 29282 29283 29284 29281 29286 29287 29288 29285 29290 29291 29292 29289 29294 29295 29296 29293 29298 29299 29300 29297 29302 29303 29304 29301 29306 29307 29308 29305 29310 29311 29312 29309 29314 29315 29316 29313 29318 29319 29320 29317 29322 29323 29324 29321 29326 29327 29328 29325 29330 29331 29332 29329 29334 29335 29336 29333 29338 29339 29340 29337 29342 29343 29344 29341 29346 29347 29348 29345 29350 29351 29352 29349 29354 29355 29356 29353 29358 29359 29360 29357 29362 29363 29364 29361 29366 29367 29368 29365 29370 29371 29372 29369 29374 29375 29376 29373 29378 29379 29380 29377 29382 29383 29384 29381 29386 29387 29388 29385 29390 29391 29392 29389 29394 29395 29396 29393 29398 29399 29400 29397 29402 29403 29404 29401 29406 29407 29408 29405 29410 29411 29412 29409 29414 29415 29416 29413 29418 29419 29420 29417 29422 29423 29424 29421 29426 29427 29428 29425 29430 29431 29432 29429 29434 29435 29436 29433 29438 29439 29440 29437 29442 29443 29444 29441 29446 29447 29448 29445 29450 29451 29452 29449 29454 29455 29456 29453 29458 29459 29460 29457 29462 29463 29464 29461 29466 29467 29468 29465 29470 29471 29472 29469 29474 29475 29476 29473 29478 29479 29480 29477 29482 29483 29484 29481 29486 29487 29488 29485 29490 29491 29492 29489 29494 29495 29496 29493 29498 29499 29500 29497 29502 29503 29504 29501 29506 29507 29508 29505 29510 29511 29512 29509 29514 29515 29516 29513 29518 29519 29520 29517 29522 29523 29524 29521 29526 29527 29528 29525 29530 29531 29532 29529 29534 29535 29536 29533 29538 29539 29540 29537 29542 29543 29544 29541 29546 29547 29548 29545 29550 29551 29552 29549 29554 29555 29556 29553 29558 29559 29560 29557 29562 29563 29564 29561 29566 29567 29568 29565 29570 29571 29572 29569 29574 29575 29576 29573 29578 29579 29580 29577 29582 29583 29584 29581 29586 29587 29588 29585 29590 29591 29592 29589 29594 29595 29596 29593 29598 29599 29600 29597 29602 29603 29604 29601 29606 29607 29608 29605 29610 29611 29612 29609 29614 29615 29616 29613 29618 29619 29620 29617 29622 29623 29624 29621 29626 29627 29628 29625 29630 29631 29632 29629 29634 29635 29636 29633 29638 29639 29640 29637 29642 29643 29644 29641 29646 29647 29648 29645 29650 29651 29652 29649 29654 29655 29656 29653 29658 29659 29660 29657 29662 29663 29664 29661 29666 29667 29668 29665 29670 29671 29672 29669 29674 29675 29676 29673 29678 29679 29680 29677 29682 29683 29684 29681 29686 29687 29688 29685 29690 29691 29692 29689 29694 29695 29696 29693 29698 29699 29700 29697 29702 29703 29704 29701 29706 29707 29708 29705 29710 29711 29712 29709 29714 29715 29716 29713 29718 29719 29720 29717 29722 29723 29724 29721 29726 29727 29728 29725 29730 29731 29732 29729 29734 29735 29736 29733 29738 29739 29740 29737 29742 29743 29744 29741 29746 29747 29748 29745 29750 29751 29752 29749 29754 29755 29756 29753 29758 29759 29760 29757 29762 29763 29764 29761 29766 29767 29768 29765 29770 29771 29772 29769 29774 29775 29776 29773 29778 29779 29780 29777 29782 29783 29784 29781 29786 29787 29788 29785 29790 29791 29792 29789 29794 29795 29796 29793 29798 29799 29800 29797 29802 29803 29804 29801 29806 29807 29808 29805 29810 29811 29812 29809 29814 29815 29816 29813 29818 29819 29820 29817 29822 29823 29824 29821 29826 29827 29828 29825 29830 29831 29832 29829 29834 29835 29836 29833 29838 29839 29840 29837 29842 29843 29844 29841 29846 29847 29848 29845 29850 29851 29852 29849 29854 29855 29856 29853 29858 29859 29860 29857 29862 29863 29864 29861 29866 29867 29868 29865 29870 29871 29872 29869 29874 29875 29876 29873 29878 29879 29880 29877 29882 29883 29884 29881 29886 29887 29888 29885 29890 29891 29892 29889 29894 29895 29896 29893 29898 29899 29900 29897 29902 29903 29904 29901 29906 29907 29908 29905 29910 29911 29912 29909 29914 29915 29916 29913 29918 29919 29920 29917 29922 29923 29924 29921 29926 29927 29928 29925 29930 29931 29932 29929 29934 29935 29936 29933 29938 29939 29940 29937 29942 29943 29944 29941 29946 29947 29948 29945 29950 29951 29952 29949 29954 29955 29956 29953 29958 29959 29960 29957 29962 29963 29964 29961 29966 29967 29968 29965 29970 29971 29972 29969 29974 29975 29976 29973 29978 29979 29980 29977 29982 29983 29984 29981 29986 29987 29988 29985 29990 29991 29992 29989 29994 29995 29996 29993 29998 29999 30000 29997 30002 30003 30004 30001 30006 30007 30008 30005 30010 30011 30012 30009 30014 30015 30016 30013 30018 30019 30020 30017 30022 30023 30024 30021 30026 30027 30028 30025 30030 30031 30032 30029 30034 30035 30036 30033 30038 30039 30040 30037 30042 30043 30044 30041 30046 30047 30048 30045 30050 30051 30052 30049 30054 30055 30056 30053 30058 30059 30060 30057 30062 30063 30064 30061 30066 30067 30068 30065 30070 30071 30072 30069 30074 30075 30076 30073 30078 30079 30080 30077 30082 30083 30084 30081 30086 30087 30088 30085 30090 30091 30092 30089 30094 30095 30096 30093 30098 30099 30100 30097 30102 30103 30104 30101 30106 30107 30108 30105 30110 30111 30112 30109 30114 30115 30116 30113 30118 30119 30120 30117 30122 30123 30124 30121 30126 30127 30128 30125 30130 30131 30132 30129 30134 30135 30136 30133 30138 30139 30140 30137 30142 30143 30144 30141 30146 30147 30148 30145 30150 30151 30152 30149 30154 30155 30156 30153 30158 30159 30160 30157 30162 30163 30164 30161 30166 30167 30168 30165 30170 30171 30172 30169 30174 30175 30176 30173 30178 30179 30180 30177 30182 30183 30184 30181 30186 30187 30188 30185 30190 30191 30192 30189 30194 30195 30196 30193 30198 30199 30200 30197 30202 30203 30204 30201 30206 30207 30208 30205 30210 30211 30212 30209 30214 30215 30216 30213 30218 30219 30220 30217 30222 30223 30224 30221 30226 30227 30228 30225 30230 30231 30232 30229 30234 30235 30236 30233 30238 30239 30240 30237 30242 30243 30244 30241 30246 30247 30248 30245 30250 30251 30252 30249 30254 30255 30256 30253 30258 30259 30260 30257 30262 30263 30264 30261 30266 30267 30268 30265 30270 30271 30272 30269 30274 30275 30276 30273 30278 30279 30280 30277 30282 30283 30284 30281 30286 30287 30288 30285 30290 30291 30292 30289 30294 30295 30296 30293 30298 30299 30300 30297 30302 30303 30304 30301 30306 30307 30308 30305 30310 30311 30312 30309 30314 30315 30316 30313 30318 30319 30320 30317 30322 30323 30324 30321 30326 30327 30328 30325 30330 30331 30332 30329 30334 30335 30336 30333 30338 30339 30340 30337 30342 30343 30344 30341 30346 30347 30348 30345 30350 30351 30352 30349 30354 30355 30356 30353 30358 30359 30360 30357 30362 30363 30364 30361 30366 30367 30368 30365 30370 30371 30372 30369 30374 30375 30376 30373 30378 30379 30380 30377 30382 30383 30384 30381 30386 30387 30388 30385 30390 30391 30392 30389 30394 30395 30396 30393 30398 30399 30400 30397 30402 30403 30404 30401 30406 30407 30408 30405 30410 30411 30412 30409 30414 30415 30416 30413 30418 30419 30420 30417 30422 30423 30424 30421 30426 30427 30428 30425 30430 30431 30432 30429 30434 30435 30436 30433 30438 30439 30440 30437 30442 30443 30444 30441 30446 30447 30448 30445 30450 30451 30452 30449 30454 30455 30456 30453 30458 30459 30460 30457 30462 30463 30464 30461 30466 30467 30468 30465 30470 30471 30472 30469 30474 30475 30476 30473 30478 30479 30480 30477 30482 30483 30484 30481 30486 30487 30488 30485 30490 30491 30492 30489 30494 30495 30496 30493 30498 30499 30500 30497 30502 30503 30504 30501 30506 30507 30508 30505 30510 30511 30512 30509 30514 30515 30516 30513 30518 30519 30520 30517 30522 30523 30524 30521 30526 30527 30528 30525 30530 30531 30532 30529 30534 30535 30536 30533 30538 30539 30540 30537 30542 30543 30544 30541 30546 30547 30548 30545 30550 30551 30552 30549 30554 30555 30556 30553 30558 30559 30560 30557 30562 30563 30564 30561 30566 30567 30568 30565 30570 30571 30572 30569 30574 30575 30576 30573 30578 30579 30580 30577 30582 30583 30584 30581 30586 30587 30588 30585 30590 30591 30592 30589 30594 30595 30596 30593 30598 30599 30600 30597 30602 30603 30604 30601 30606 30607 30608 30605 30610 30611 30612 30609 30614 30615 30616 30613 30618 30619 30620 30617 30622 30623 30624 30621 30626 30627 30628 30625 30630 30631 30632 30629 30634 30635 30636 30633 30638 30639 30640 30637 30642 30643 30644 30641 30646 30647 30648 30645 30650 30651 30652 30649 30654 30655 30656 30653 30658 30659 30660 30657 30662 30663 30664 30661 30666 30667 30668 30665 30670 30671 30672 30669 30674 30675 30676 30673 30678 30679 30680 30677 30682 30683 30684 30681 30686 30687 30688 30685 30690 30691 30692 30689 30694 30695 30696 30693 30698 30699 30700 30697 30702 30703 30704 30701 30706 30707 30708 30705 30710 30711 30712 30709 30714 30715 30716 30713 30718 30719 30720 30717 30722 30723 30724 30721 30726 30727 30728 30725 30730 30731 30732 30729 30734 30735 30736 30733 30738 30739 30740 30737 30742 30743 30744 30741 30746 30747 30748 30745 30750 30751 30752 30749 30754 30755 30756 30753 30758 30759 30760 30757 30762 30763 30764 30761 30766 30767 30768 30765 30770 30771 30772 30769 30774 30775 30776 30773 30778 30779 30780 30777 30782 30783 30784 30781 30786 30787 30788 30785 30790 30791 30792 30789 30794 30795 30796 30793 30798 30799 30800 30797 30802 30803 30804 30801 30806 30807 30808 30805 30810 30811 30812 30809 30814 30815 30816 30813 30818 30819 30820 30817 30822 30823 30824 30821 30826 30827 30828 30825 30830 30831 30832 30829 30834 30835 30836 30833 30838 30839 30840 30837 30842 30843 30844 30841 30846 30847 30848 30845 30850 30851 30852 30849 30854 30855 30856 30853 30858 30859 30860 30857 30862 30863 30864 30861 30866 30867 30868 30865 30870 30871 30872 30869 30874 30875 30876 30873 30878 30879 30880 30877 30882 30883 30884 30881 30886 30887 30888 30885 30890 30891 30892 30889 30894 30895 30896 30893 30898 30899 30900 30897 30902 30903 30904 30901 30906 30907 30908 30905 30910 30911 30912 30909 30914 30915 30916 30913 30918 30919 30920 30917 30922 30923 30924 30921 30926 30927 30928 30925 30930 30931 30932 30929 30934 30935 30936 30933 30938 30939 30940 30937 30942 30943 30944 30941 30946 30947 30948 30945 30950 30951 30952 30949 30954 30955 30956 30953 30958 30959 30960 30957 30962 30963 30964 30961 30966 30967 30968 30965 30970 30971 30972 30969 30974 30975 30976 30973 30978 30979 30980 30977 30982 30983 30984 30981 30986 30987 30988 30985 30990 30991 30992 30989 30994 30995 30996 30993 30998 30999 31000 30997 31002 31003 31004 31001 31006 31007 31008 31005 31010 31011 31012 31009 31014 31015 31016 31013 31018 31019 31020 31017 31022 31023 31024 31021 31026 31027 31028 31025 31030 31031 31032 31029 31034 31035 31036 31033 31038 31039 31040 31037 31042 31043 31044 31041 31046 31047 31048 31045 31050 31051 31052 31049 31054 31055 31056 31053 31058 31059 31060 31057 31062 31063 31064 31061 31066 31067 31068 31065 31070 31071 31072 31069 31074 31075 31076 31073 31078 31079 31080 31077 31082 31083 31084 31081 31086 31087 31088 31085 31090 31091 31092 31089 31094 31095 31096 31093 31098 31099 31100 31097 31102 31103 31104 31101 31106 31107 31108 31105 31110 31111 31112 31109 31114 31115 31116 31113 31118 31119 31120 31117 31122 31123 31124 31121 31126 31127 31128 31125 31130 31131 31132 31129 31134 31135 31136 31133 31138 31139 31140 31137 31142 31143 31144 31141 31146 31147 31148 31145 31150 31151 31152 31149 31154 31155 31156 31153 31158 31159 31160 31157 31162 31163 31164 31161 31166 31167 31168 31165 31170 31171 31172 31169 31174 31175 31176 31173 31178 31179 31180 31177 31182 31183 31184 31181 31186 31187 31188 31185 31190 31191 31192 31189 31194 31195 31196 31193 31198 31199 31200 31197 31202 31203 31204 31201 31206 31207 31208 31205 31210 31211 31212 31209 31214 31215 31216 31213 31218 31219 31220 31217 31222 31223 31224 31221 31226 31227 31228 31225 31230 31231 31232 31229 31234 31235 31236 31233 31238 31239 31240 31237 31242 31243 31244 31241 31246 31247 31248 31245 31250 31251 31252 31249 31254 31255 31256 31253 31258 31259 31260 31257 31262 31263 31264 31261 31266 31267 31268 31265 31270 31271 31272 31269 31274 31275 31276 31273 31278 31279 31280 31277 31282 31283 31284 31281 31286 31287 31288 31285 31290 31291 31292 31289 31294 31295 31296 31293 31298 31299 31300 31297 31302 31303 31304 31301 31306 31307 31308 31305 31310 31311 31312 31309 31314 31315 31316 31313 31318 31319 31320 31317 31322 31323 31324 31321 31326 31327 31328 31325 31330 31331 31332 31329 31334 31335 31336 31333 31338 31339 31340 31337 31342 31343 31344 31341 31346 31347 31348 31345 31350 31351 31352 31349 31354 31355 31356 31353 31358 31359 31360 31357 31362 31363 31364 31361 31366 31367 31368 31365 31370 31371 31372 31369 31374 31375 31376 31373 31378 31379 31380 31377 31382 31383 31384 31381 31386 31387 31388 31385 31390 31391 31392 31389 31394 31395 31396 31393 31398 31399 31400 31397 31402 31403 31404 31401 31406 31407 31408 31405 31410 31411 31412 31409 31414 31415 31416 31413 31418 31419 31420 31417 31422 31423 31424 31421 31426 31427 31428 31425 31430 31431 31432 31429 31434 31435 31436 31433 31438 31439 31440 31437 31442 31443 31444 31441 31446 31447 31448 31445 31450 31451 31452 31449 31454 31455 31456 31453 31458 31459 31460 31457 31462 31463 31464 31461 31466 31467 31468 31465 31470 31471 31472 31469 31474 31475 31476 31473 31478 31479 31480 31477 31482 31483 31484 31481 31486 31487 31488 31485 31490 31491 31492 31489 31494 31495 31496 31493 31498 31499 31500 31497 31502 31503 31504 31501 31506 31507 31508 31505 31510 31511 31512 31509 31514 31515 31516 31513 31518 31519 31520 31517 31522 31523 31524 31521 31526 31527 31528 31525 31530 31531 31532 31529 31534 31535 31536 31533 31538 31539 31540 31537 31542 31543 31544 31541 31546 31547 31548 31545 31550 31551 31552 31549 31554 31555 31556 31553 31558 31559 31560 31557 31562 31563 31564 31561 31566 31567 31568 31565 31570 31571 31572 31569 31574 31575 31576 31573 31578 31579 31580 31577 31582 31583 31584 31581 31586 31587 31588 31585 31590 31591 31592 31589 31594 31595 31596 31593 31598 31599 31600 31597 31602 31603 31604 31601 31606 31607 31608 31605 31610 31611 31612 31609 31614 31615 31616 31613 31618 31619 31620 31617 31622 31623 31624 31621 31626 31627 31628 31625 31630 31631 31632 31629 31634 31635 31636 31633 31638 31639 31640 31637 31642 31643 31644 31641 31646 31647 31648 31645 31650 31651 31652 31649 31654 31655 31656 31653 31658 31659 31660 31657 31662 31663 31664 31661 31666 31667 31668 31665 31670 31671 31672 31669 31674 31675 31676 31673 31678 31679 31680 31677 31682 31683 31684 31681 31686 31687 31688 31685 31690 31691 31692 31689 31694 31695 31696 31693 31698 31699 31700 31697 31702 31703 31704 31701 31706 31707 31708 31705 31710 31711 31712 31709 31714 31715 31716 31713 31718 31719 31720 31717 31722 31723 31724 31721 31726 31727 31728 31725 31730 31731 31732 31729 31734 31735 31736 31733 31738 31739 31740 31737 31742 31743 31744 31741 31746 31747 31748 31745 31750 31751 31752 31749 31754 31755 31756 31753 31758 31759 31760 31757 31762 31763 31764 31761 31766 31767 31768 31765 31770 31771 31772 31769 31774 31775 31776 31773 31778 31779 31780 31777 31782 31783 31784 31781 31786 31787 31788 31785 31790 31791 31792 31789 31794 31795 31796 31793 31798 31799 31800 31797 31802 31803 31804 31801 31806 31807 31808 31805 31810 31811 31812 31809 31814 31815 31816 31813 31818 31819 31820 31817 31822 31823 31824 31821 31826 31827 31828 31825 31830 31831 31832 31829 31834 31835 31836 31833 31838 31839 31840 31837 31842 31843 31844 31841 31846 31847 31848 31845 31850 31851 31852 31849 31854 31855 31856 31853 31858 31859 31860 31857 31862 31863 31864 31861 31866 31867 31868 31865 31870 31871 31872 31869 31874 31875 31876 31873 31878 31879 31880 31877 31882 31883 31884 31881 31886 31887 31888 31885 31890 31891 31892 31889 31894 31895 31896 31893 31898 31899 31900 31897 31902 31903 31904 31901 31906 31907 31908 31905 31910 31911 31912 31909 31914 31915 31916 31913 31918 31919 31920 31917 31922 31923 31924 31921 31926 31927 31928 31925 31930 31931 31932 31929 31934 31935 31936 31933 31938 31939 31940 31937 31942 31943 31944 31941 31946 31947 31948 31945 31950 31951 31952 31949 31954 31955 31956 31953 31958 31959 31960 31957 31962 31963 31964 31961 31966 31967 31968 31965 31970 31971 31972 31969 31974 31975 31976 31973 31978 31979 31980 31977 31982 31983 31984 31981 31986 31987 31988 31985 31990 31991 31992 31989 31994 31995 31996 31993 31998 31999 32000 31997 32002 32003 32004 32001 32006 32007 32008 32005 32010 32011 32012 32009 32014 32015 32016 32013 32018 32019 32020 32017 32022 32023 32024 32021 32026 32027 32028 32025 32030 32031 32032 32029 32034 32035 32036 32033 32038 32039 32040 32037 32042 32043 32044 32041 32046 32047 32048 32045 32050 32051 32052 32049 32054 32055 32056 32053 32058 32059 32060 32057 32062 32063 32064 32061 32066 32067 32068 32065 32070 32071 32072 32069 32074 32075 32076 32073 32078 32079 32080 32077 32082 32083 32084 32081 32086 32087 32088 32085 32090 32091 32092 32089 32094 32095 32096 32093 32098 32099 32100 32097 32102 32103 32104 32101 32106 32107 32108 32105 32110 32111 32112 32109 32114 32115 32116 32113 32118 32119 32120 32117 32122 32123 32124 32121 32126 32127 32128 32125 32130 32131 32132 32129 32134 32135 32136 32133 32138 32139 32140 32137 32142 32143 32144 32141 32146 32147 32148 32145 32150 32151 32152 32149 32154 32155 32156 32153 32158 32159 32160 32157 32162 32163 32164 32161 32166 32167 32168 32165 32170 32171 32172 32169 32174 32175 32176 32173 32178 32179 32180 32177 32182 32183 32184 32181 32186 32187 32188 32185 32190 32191 32192 32189 32194 32195 32196 32193 32198 32199 32200 32197 32202 32203 32204 32201 32206 32207 32208 32205 32210 32211 32212 32209 32214 32215 32216 32213 32218 32219 32220 32217 32222 32223 32224 32221 32226 32227 32228 32225 32230 32231 32232 32229 32234 32235 32236 32233 32238 32239 32240 32237 32242 32243 32244 32241 32246 32247 32248 32245 32250 32251 32252 32249 32254 32255 32256 32253 32258 32259 32260 32257 32262 32263 32264 32261 32266 32267 32268 32265 32270 32271 32272 32269 32274 32275 32276 32273 32278 32279 32280 32277 32282 32283 32284 32281 32286 32287 32288 32285 32290 32291 32292 32289 32294 32295 32296 32293 32298 32299 32300 32297 32302 32303 32304 32301 32306 32307 32308 32305 32310 32311 32312 32309 32314 32315 32316 32313 32318 32319 32320 32317 32322 32323 32324 32321 32326 32327 32328 32325 32330 32331 32332 32329 32334 32335 32336 32333 32338 32339 32340 32337 32342 32343 32344 32341 32346 32347 32348 32345 32350 32351 32352 32349 32354 32355 32356 32353 32358 32359 32360 32357 32362 32363 32364 32361 32366 32367 32368 32365 32370 32371 32372 32369 32374 32375 32376 32373 32378 32379 32380 32377 32382 32383 32384 32381 32386 32387 32388 32385 32390 32391 32392 32389 32394 32395 32396 32393 32398 32399 32400 32397 32402 32403 32404 32401 32406 32407 32408 32405 32410 32411 32412 32409 32414 32415 32416 32413 32418 32419 32420 32417 32422 32423 32424 32421 32426 32427 32428 32425 32430 32431 32432 32429 32434 32435 32436 32433 32438 32439 32440 32437 32442 32443 32444 32441 32446 32447 32448 32445 32450 32451 32452 32449 32454 32455 32456 32453 32458 32459 32460 32457 32462 32463 32464 32461 32466 32467 32468 32465 32470 32471 32472 32469 32474 32475 32476 32473 32478 32479 32480 32477 32482 32483 32484 32481 32486 32487 32488 32485 32490 32491 32492 32489 32494 32495 32496 32493 32498 32499 32500 32497 32502 32503 32504 32501 32506 32507 32508 32505 32510 32511 32512 32509 32514 32515 32516 32513 32518 32519 32520 32517 32522 32523 32524 32521 32526 32527 32528 32525 32530 32531 32532 32529 32534 32535 32536 32533 32538 32539 32540 32537 32542 32543 32544 32541 32546 32547 32548 32545 32550 32551 32552 32549 32554 32555 32556 32553 32558 32559 32560 32557 32562 32563 32564 32561 32566 32567 32568 32565 32570 32571 32572 32569 32574 32575 32576 32573 32578 32579 32580 32577 32582 32583 32584 32581 32586 32587 32588 32585 32590 32591 32592 32589 32594 32595 32596 32593 32598 32599 32600 32597 32602 32603 32604 32601 32606 32607 32608 32605 32610 32611 32612 32609 32614 32615 32616 32613 32618 32619 32620 32617 32622 32623 32624 32621 32626 32627 32628 32625 32630 32631 32632 32629 32634 32635 32636 32633 32638 32639 32640 32637 32642 32643 32644 32641 32646 32647 32648 32645 32650 32651 32652 32649 32654 32655 32656 32653 32658 32659 32660 32657 32662 32663 32664 32661 32666 32667 32668 32665 32670 32671 32672 32669 32674 32675 32676 32673 32678 32679 32680 32677 32682 32683 32684 32681 32686 32687 32688 32685 32690 32691 32692 32689 32694 32695 32696 32693 32698 32699 32700 32697 32702 32703 32704 32701 32706 32707 32708 32705 32710 32711 32712 32709 32714 32715 32716 32713 32718 32719 32720 32717 32722 32723 32724 32721 32726 32727 32728 32725 32730 32731 32732 32729 32734 32735 32736 32733 32738 32739 32740 32737 32742 32743 32744 32741 32746 32747 32748 32745 32750 32751 32752 32749 32754 32755 32756 32753 32758 32759 32760 32757 32762 32763 32764 32761 32766 32767 32768 32765 32770 32771 32772 32769 32774 32775 32776 32773 32778 32779 32780 32777 32782 32783 32784 32781 32786 32787 32788 32785 32790 32791 32792 32789 32794 32795 32796 32793 32798 32799 32800 32797 32802 32803 32804 32801 32806 32807 32808 32805 32810 32811 32812 32809 32814 32815 32816 32813 32818 32819 32820 32817 32822 32823 32824 32821 32826 32827 32828 32825 32830 32831 32832 32829 32834 32835 32836 32833 32838 32839 32840 32837 32842 32843 32844 32841 32846 32847 32848 32845 32850 32851 32852 32849 32854 32855 32856 32853 32858 32859 32860 32857 32862 32863 32864 32861 32866 32867 32868 32865 32870 32871 32872 32869 32874 32875 32876 32873 32878 32879 32880 32877 32882 32883 32884 32881 32886 32887 32888 32885 32890 32891 32892 32889 32894 32895 32896 32893 32898 32899 32900 32897 32902 32903 32904 32901 32906 32907 32908 32905 32910 32911 32912 32909 32914 32915 32916 32913 32918 32919 32920 32917 32922 32923 32924 32921 32926 32927 32928 32925 32930 32931 32932 32929 32934 32935 32936 32933 32938 32939 32940 32937 32942 32943 32944 32941 32946 32947 32948 32945 32950 32951 32952 32949 32954 32955 32956 32953 32958 32959 32960 32957 32962 32963 32964 32961 32966 32967 32968 32965 32970 32971 32972 32969 32974 32975 32976 32973 32978 32979 32980 32977 32982 32983 32984 32981 32986 32987 32988 32985 32990 32991 32992 32989 32994 32995 32996 32993 32998 32999 33000 32997 33002 33003 33004 33001 33006 33007 33008 33005 33010 33011 33012 33009 33014 33015 33016 33013 33018 33019 33020 33017 33022 33023 33024 33021 33026 33027 33028 33025 33030 33031 33032 33029 33034 33035 33036 33033 33038 33039 33040 33037 33042 33043 33044 33041 33046 33047 33048 33045 33050 33051 33052 33049 33054 33055 33056 33053 33058 33059 33060 33057 33062 33063 33064 33061 33066 33067 33068 33065 33070 33071 33072 33069 33074 33075 33076 33073 33078 33079 33080 33077 33082 33083 33084 33081 33086 33087 33088 33085 33090 33091 33092 33089 33094 33095 33096 33093 33098 33099 33100 33097 33102 33103 33104 33101 33106 33107 33108 33105 33110 33111 33112 33109 33114 33115 33116 33113 33118 33119 33120 33117 33122 33123 33124 33121 33126 33127 33128 33125 33130 33131 33132 33129 33134 33135 33136 33133 33138 33139 33140 33137 33142 33143 33144 33141 33146 33147 33148 33145 33150 33151 33152 33149 33154 33155 33156 33153 33158 33159 33160 33157 33162 33163 33164 33161 33166 33167 33168 33165 33170 33171 33172 33169 33174 33175 33176 33173 33178 33179 33180 33177 33182 33183 33184 33181 33186 33187 33188 33185 33190 33191 33192 33189 33194 33195 33196 33193 33198 33199 33200 33197 33202 33203 33204 33201 33206 33207 33208 33205 33210 33211 33212 33209 33214 33215 33216 33213 33218 33219 33220 33217 33222 33223 33224 33221 33226 33227 33228 33225 33230 33231 33232 33229 33234 33235 33236 33233 33238 33239 33240 33237 33242 33243 33244 33241 33246 33247 33248 33245 33250 33251 33252 33249 33254 33255 33256 33253 33258 33259 33260 33257 33262 33263 33264 33261 33266 33267 33268 33265 33270 33271 33272 33269 33274 33275 33276 33273 33278 33279 33280 33277 33282 33283 33284 33281 33286 33287 33288 33285 33290 33291 33292 33289 33294 33295 33296 33293 33298 33299 33300 33297 33302 33303 33304 33301 33306 33307 33308 33305 33310 33311 33312 33309 33314 33315 33316 33313 33318 33319 33320 33317 33322 33323 33324 33321 33326 33327 33328 33325 33330 33331 33332 33329 33334 33335 33336 33333 33338 33339 33340 33337 33342 33343 33344 33341 33346 33347 33348 33345 33350 33351 33352 33349 33354 33355 33356 33353 33358 33359 33360 33357 33362 33363 33364 33361 33366 33367 33368 33365 33370 33371 33372 33369 33374 33375 33376 33373 33378 33379 33380 33377 33382 33383 33384 33381 33386 33387 33388 33385 33390 33391 33392 33389 33394 33395 33396 33393 33398 33399 33400 33397 33402 33403 33404 33401 33406 33407 33408 33405 33410 33411 33412 33409 33414 33415 33416 33413 33418 33419 33420 33417 33422 33423 33424 33421 33426 33427 33428 33425 33430 33431 33432 33429 33434 33435 33436 33433 33438 33439 33440 33437 33442 33443 33444 33441 33446 33447 33448 33445 33450 33451 33452 33449 33454 33455 33456 33453 33458 33459 33460 33457 33462 33463 33464 33461 33466 33467 33468 33465 33470 33471 33472 33469 33474 33475 33476 33473 33478 33479 33480 33477 33482 33483 33484 33481 33486 33487 33488 33485 33490 33491 33492 33489 33494 33495 33496 33493 33498 33499 33500 33497 33502 33503 33504 33501 33506 33507 33508 33505 33510 33511 33512 33509 33514 33515 33516 33513 33518 33519 33520 33517 33522 33523 33524 33521 33526 33527 33528 33525 33530 33531 33532 33529 33534 33535 33536 33533 33538 33539 33540 33537 33542 33543 33544 33541 33546 33547 33548 33545 33550 33551 33552 33549 33554 33555 33556 33553 33558 33559 33560 33557 33562 33563 33564 33561 33566 33567 33568 33565 33570 33571 33572 33569 33574 33575 33576 33573 33578 33579 33580 33577 33582 33583 33584 33581 33586 33587 33588 33585 33590 33591 33592 33589 33594 33595 33596 33593 33598 33599 33600 33597 33602 33603 33604 33601 33606 33607 33608 33605 33610 33611 33612 33609 33614 33615 33616 33613 33618 33619 33620 33617 33622 33623 33624 33621 33626 33627 33628 33625 33630 33631 33632 33629 33634 33635 33636 33633 33638 33639 33640 33637 33642 33643 33644 33641 33646 33647 33648 33645 33650 33651 33652 33649 33654 33655 33656 33653 33658 33659 33660 33657 33662 33663 33664 33661 33666 33667 33668 33665 33670 33671 33672 33669 33674 33675 33676 33673 33678 33679 33680 33677 33682 33683 33684 33681 33686 33687 33688 33685 33690 33691 33692 33689 33694 33695 33696 33693 33698 33699 33700 33697 33702 33703 33704 33701 33706 33707 33708 33705 33710 33711 33712 33709 33714 33715 33716 33713 33718 33719 33720 33717 33722 33723 33724 33721 33726 33727 33728 33725 33730 33731 33732 33729 33734 33735 33736 33733 33738 33739 33740 33737 33742 33743 33744 33741 33746 33747 33748 33745 33750 33751 33752 33749 33754 33755 33756 33753 33758 33759 33760 33757 33762 33763 33764 33761 33766 33767 33768 33765 33770 33771 33772 33769 33774 33775 33776 33773 33778 33779 33780 33777 33782 33783 33784 33781 33786 33787 33788 33785 33790 33791 33792 33789 33794 33795 33796 33793 33798 33799 33800 33797 33802 33803 33804 33801 33806 33807 33808 33805 33810 33811 33812 33809 33814 33815 33816 33813 33818 33819 33820 33817 33822 33823 33824 33821 33826 33827 33828 33825 33830 33831 33832 33829 33834 33835 33836 33833 33838 33839 33840 33837 33842 33843 33844 33841 33846 33847 33848 33845 33850 33851 33852 33849 33854 33855 33856 33853 33858 33859 33860 33857 33862 33863 33864 33861 33866 33867 33868 33865 33870 33871 33872 33869 33874 33875 33876 33873 33878 33879 33880 33877 33882 33883 33884 33881 33886 33887 33888 33885 33890 33891 33892 33889 33894 33895 33896 33893 33898 33899 33900 33897 33902 33903 33904 33901 33906 33907 33908 33905 33910 33911 33912 33909 33914 33915 33916 33913 33918 33919 33920 33917 33922 33923 33924 33921 33926 33927 33928 33925 33930 33931 33932 33929 33934 33935 33936 33933 33938 33939 33940 33937 33942 33943 33944 33941 33946 33947 33948 33945 33950 33951 33952 33949 33954 33955 33956 33953 33958 33959 33960 33957 33962 33963 33964 33961 33966 33967 33968 33965 33970 33971 33972 33969 33974 33975 33976 33973 33978 33979 33980 33977 33982 33983 33984 33981 33986 33987 33988 33985 33990 33991 33992 33989 33994 33995 33996 33993 33998 33999 34000 33997 34002 34003 34004 34001 34006 34007 34008 34005 34010 34011 34012 34009 34014 34015 34016 34013 34018 34019 34020 34017 34022 34023 34024 34021 34026 34027 34028 34025 34030 34031 34032 34029 34034 34035 34036 34033 34038 34039 34040 34037 34042 34043 34044 34041 34046 34047 34048 34045 34050 34051 34052 34049 34054 34055 34056 34053 34058 34059 34060 34057 34062 34063 34064 34061 34066 34067 34068 34065 34070 34071 34072 34069 34074 34075 34076 34073 34078 34079 34080 34077 34082 34083 34084 34081 34086 34087 34088 34085 34090 34091 34092 34089 34094 34095 34096 34093 34098 34099 34100 34097 34102 34103 34104 34101 34106 34107 34108 34105 34110 34111 34112 34109 34114 34115 34116 34113 34118 34119 34120 34117 34122 34123 34124 34121 34126 34127 34128 34125 34130 34131 34132 34129 34134 34135 34136 34133 34138 34139 34140 34137 34142 34143 34144 34141 34146 34147 34148 34145 34150 34151 34152 34149 34154 34155 34156 34153 34158 34159 34160 34157 34162 34163 34164 34161 34166 34167 34168 34165 34170 34171 34172 34169 34174 34175 34176 34173 34178 34179 34180 34177 34182 34183 34184 34181 34186 34187 34188 34185 34190 34191 34192 34189 34194 34195 34196 34193 34198 34199 34200 34197 34202 34203 34204 34201 34206 34207 34208 34205 34210 34211 34212 34209 34214 34215 34216 34213 34218 34219 34220 34217 34222 34223 34224 34221 34226 34227 34228 34225 34230 34231 34232 34229 34234 34235 34236 34233 34238 34239 34240 34237 34242 34243 34244 34241 34246 34247 34248 34245 34250 34251 34252 34249 34254 34255 34256 34253 34258 34259 34260 34257 34262 34263 34264 34261 34266 34267 34268 34265 34270 34271 34272 34269 34274 34275 34276 34273 34278 34279 34280 34277 34282 34283 34284 34281 34286 34287 34288 34285 34290 34291 34292 34289 34294 34295 34296 34293 34298 34299 34300 34297 34302 34303 34304 34301 34306 34307 34308 34305 34310 34311 34312 34309 34314 34315 34316 34313 34318 34319 34320 34317 34322 34323 34324 34321 34326 34327 34328 34325 34330 34331 34332 34329 34334 34335 34336 34333 34338 34339 34340 34337 34342 34343 34344 34341 34346 34347 34348 34345 34350 34351 34352 34349 34354 34355 34356 34353 34358 34359 34360 34357 34362 34363 34364 34361 34366 34367 34368 34365 34370 34371 34372 34369 34374 34375 34376 34373 34378 34379 34380 34377 34382 34383 34384 34381 34386 34387 34388 34385 34390 34391 34392 34389 34394 34395 34396 34393 34398 34399 34400 34397 34402 34403 34404 34401 34406 34407 34408 34405 34410 34411 34412 34409 34414 34415 34416 34413 34418 34419 34420 34417 34422 34423 34424 34421 34426 34427 34428 34425 34430 34431 34432 34429 34434 34435 34436 34433 34438 34439 34440 34437 34442 34443 34444 34441 34446 34447 34448 34445 34450 34451 34452 34449 34454 34455 34456 34453 34458 34459 34460 34457 34462 34463 34464 34461 34466 34467 34468 34465 34470 34471 34472 34469 34474 34475 34476 34473 34478 34479 34480 34477 34482 34483 34484 34481 34486 34487 34488 34485 34490 34491 34492 34489 34494 34495 34496 34493 34498 34499 34500 34497 34502 34503 34504 34501 34506 34507 34508 34505 34510 34511 34512 34509 34514 34515 34516 34513 34518 34519 34520 34517 34522 34523 34524 34521 34526 34527 34528 34525 34530 34531 34532 34529 34534 34535 34536 34533 34538 34539 34540 34537 34542 34543 34544 34541 34546 34547 34548 34545 34550 34551 34552 34549 34554 34555 34556 34553 34558 34559 34560 34557 34562 34563 34564 34561 34566 34567 34568 34565 34570 34571 34572 34569 34574 34575 34576 34573 34578 34579 34580 34577 34582 34583 34584 34581 34586 34587 34588 34585 34590 34591 34592 34589 34594 34595 34596 34593 34598 34599 34600 34597 34602 34603 34604 34601 34606 34607 34608 34605 34610 34611 34612 34609 34614 34615 34616 34613 34618 34619 34620 34617 34622 34623 34624 34621 34626 34627 34628 34625 34630 34631 34632 34629 34634 34635 34636 34633 34638 34639 34640 34637 34642 34643 34644 34641 34646 34647 34648 34645 34650 34651 34652 34649 34654 34655 34656 34653 34658 34659 34660 34657 34662 34663 34664 34661 34666 34667 34668 34665 34670 34671 34672 34669 34674 34675 34676 34673 34678 34679 34680 34677 34682 34683 34684 34681 34686 34687 34688 34685 34690 34691 34692 34689 34694 34695 34696 34693 34698 34699 34700 34697 34702 34703 34704 34701 34706 34707 34708 34705 34710 34711 34712 34709 34714 34715 34716 34713 34718 34719 34720 34717 34722 34723 34724 34721 34726 34727 34728 34725 34730 34731 34732 34729 34734 34735 34736 34733 34738 34739 34740 34737 34742 34743 34744 34741 34746 34747 34748 34745 34750 34751 34752 34749 34754 34755 34756 34753 34758 34759 34760 34757 34762 34763 34764 34761 34766 34767 34768 34765 34770 34771 34772 34769 34774 34775 34776 34773 34778 34779 34780 34777 34782 34783 34784 34781 34786 34787 34788 34785 34790 34791 34792 34789 34794 34795 34796 34793 34798 34799 34800 34797 34802 34803 34804 34801 34806 34807 34808 34805 34810 34811 34812 34809 34814 34815 34816 34813 34818 34819 34820 34817 34822 34823 34824 34821 34826 34827 34828 34825 34830 34831 34832 34829 34834 34835 34836 34833 34838 34839 34840 34837 34842 34843 34844 34841 34846 34847 34848 34845 34850 34851 34852 34849 34854 34855 34856 34853 34858 34859 34860 34857 34862 34863 34864 34861 34866 34867 34868 34865 34870 34871 34872 34869 34874 34875 34876 34873 34878 34879 34880 34877 34882 34883 34884 34881 34886 34887 34888 34885 34890 34891 34892 34889 34894 34895 34896 34893 34898 34899 34900 34897 34902 34903 34904 34901 34906 34907 34908 34905 34910 34911 34912 34909 34914 34915 34916 34913 34918 34919 34920 34917 34922 34923 34924 34921 34926 34927 34928 34925 34930 34931 34932 34929 34934 34935 34936 34933 34938 34939 34940 34937 34942 34943 34944 34941 34946 34947 34948 34945 34950 34951 34952 34949 34954 34955 34956 34953 34958 34959 34960 34957 34962 34963 34964 34961 34966 34967 34968 34965 34970 34971 34972 34969 34974 34975 34976 34973 34978 34979 34980 34977 34982 34983 34984 34981 34986 34987 34988 34985 34990 34991 34992 34989 34994 34995 34996 34993 34998 34999 35000 34997 35002 35003 35004 35001 35006 35007 35008 35005 35010 35011 35012 35009 35014 35015 35016 35013 35018 35019 35020 35017 35022 35023 35024 35021 35026 35027 35028 35025 35030 35031 35032 35029 35034 35035 35036 35033 35038 35039 35040 35037 35042 35043 35044 35041 35046 35047 35048 35045 35050 35051 35052 35049 35054 35055 35056 35053 35058 35059 35060 35057 35062 35063 35064 35061 35066 35067 35068 35065 35070 35071 35072 35069 35074 35075 35076 35073 35078 35079 35080 35077 35082 35083 35084 35081 35086 35087 35088 35085 35090 35091 35092 35089 35094 35095 35096 35093 35098 35099 35100 35097 35102 35103 35104 35101 35106 35107 35108 35105 35110 35111 35112 35109 35114 35115 35116 35113 35118 35119 35120 35117 35122 35123 35124 35121 35126 35127 35128 35125 35130 35131 35132 35129 35134 35135 35136 35133 35138 35139 35140 35137 35142 35143 35144 35141 35146 35147 35148 35145 35150 35151 35152 35149 35154 35155 35156 35153 35158 35159 35160 35157 35162 35163 35164 35161 35166 35167 35168 35165 35170 35171 35172 35169 35174 35175 35176 35173 35178 35179 35180 35177 35182 35183 35184 35181 35186 35187 35188 35185 35190 35191 35192 35189 35194 35195 35196 35193 35198 35199 35200 35197 35202 35203 35204 35201 35206 35207 35208 35205 35210 35211 35212 35209 35214 35215 35216 35213 35218 35219 35220 35217 35222 35223 35224 35221 35226 35227 35228 35225 35230 35231 35232 35229 35234 35235 35236 35233 35238 35239 35240 35237 35242 35243 35244 35241 35246 35247 35248 35245 35250 35251 35252 35249 35254 35255 35256 35253 35258 35259 35260 35257 35262 35263 35264 35261 35266 35267 35268 35265 35270 35271 35272 35269 35274 35275 35276 35273 35278 35279 35280 35277 35282 35283 35284 35281 35286 35287 35288 35285 35290 35291 35292 35289 35294 35295 35296 35293 35298 35299 35300 35297 35302 35303 35304 35301 35306 35307 35308 35305 35310 35311 35312 35309 35314 35315 35316 35313 35318 35319 35320 35317 35322 35323 35324 35321 35326 35327 35328 35325 35330 35331 35332 35329 35334 35335 35336 35333 35338 35339 35340 35337 35342 35343 35344 35341 35346 35347 35348 35345 35350 35351 35352 35349 35354 35355 35356 35353 35358 35359 35360 35357 35362 35363 35364 35361 35366 35367 35368 35365 35370 35371 35372 35369 35374 35375 35376 35373 35378 35379 35380 35377 35382 35383 35384 35381 35386 35387 35388 35385 35390 35391 35392 35389 35394 35395 35396 35393 35398 35399 35400 35397 35402 35403 35404 35401 35406 35407 35408 35405 35410 35411 35412 35409 35414 35415 35416 35413 35418 35419 35420 35417 35422 35423 35424 35421 35426 35427 35428 35425 35430 35431 35432 35429 35434 35435 35436 35433 35438 35439 35440 35437 35442 35443 35444 35441 35446 35447 35448 35445 35450 35451 35452 35449 35454 35455 35456 35453 35458 35459 35460 35457 35462 35463 35464 35461 35466 35467 35468 35465 35470 35471 35472 35469 35474 35475 35476 35473 35478 35479 35480 35477 35482 35483 35484 35481 35486 35487 35488 35485 35490 35491 35492 35489 35494 35495 35496 35493 35498 35499 35500 35497 35502 35503 35504 35501 35506 35507 35508 35505 35510 35511 35512 35509 35514 35515 35516 35513 35518 35519 35520 35517 35522 35523 35524 35521 35526 35527 35528 35525 35530 35531 35532 35529 35534 35535 35536 35533 35538 35539 35540 35537 35542 35543 35544 35541 35546 35547 35548 35545 35550 35551 35552 35549 35554 35555 35556 35553 35558 35559 35560 35557 35562 35563 35564 35561 35566 35567 35568 35565 35570 35571 35572 35569 35574 35575 35576 35573 35578 35579 35580 35577 35582 35583 35584 35581 35586 35587 35588 35585 35590 35591 35592 35589 35594 35595 35596 35593 35598 35599 35600 35597 35602 35603 35604 35601 35606 35607 35608 35605 35610 35611 35612 35609 35614 35615 35616 35613 35618 35619 35620 35617 35622 35623 35624 35621 35626 35627 35628 35625 35630 35631 35632 35629 35634 35635 35636 35633 35638 35639 35640 35637 35642 35643 35644 35641 35646 35647 35648 35645 35650 35651 35652 35649 35654 35655 35656 35653 35658 35659 35660 35657 35662 35663 35664 35661 35666 35667 35668 35665 35670 35671 35672 35669 35674 35675 35676 35673 35678 35679 35680 35677 35682 35683 35684 35681 35686 35687 35688 35685 35690 35691 35692 35689 35694 35695 35696 35693 35698 35699 35700 35697 35702 35703 35704 35701 35706 35707 35708 35705 35710 35711 35712 35709 35714 35715 35716 35713 35718 35719 35720 35717 35722 35723 35724 35721 35726 35727 35728 35725 35730 35731 35732 35729 35734 35735 35736 35733 35738 35739 35740 35737 35742 35743 35744 35741 35746 35747 35748 35745 35750 35751 35752 35749 35754 35755 35756 35753 35758 35759 35760 35757 35762 35763 35764 35761 35766 35767 35768 35765 35770 35771 35772 35769 35774 35775 35776 35773 35778 35779 35780 35777 35782 35783 35784 35781 35786 35787 35788 35785 35790 35791 35792 35789 35794 35795 35796 35793 35798 35799 35800 35797 35802 35803 35804 35801 35806 35807 35808 35805 35810 35811 35812 35809 35814 35815 35816 35813 35818 35819 35820 35817 35822 35823 35824 35821 35826 35827 35828 35825 35830 35831 35832 35829 35834 35835 35836 35833 35838 35839 35840 35837 35842 35843 35844 35841 35846 35847 35848 35845 35850 35851 35852 35849 35854 35855 35856 35853 35858 35859 35860 35857 35862 35863 35864 35861 35866 35867 35868 35865 35870 35871 35872 35869 35874 35875 35876 35873 35878 35879 35880 35877 35882 35883 35884 35881 35886 35887 35888 35885 35890 35891 35892 35889 35894 35895 35896 35893 35898 35899 35900 35897 35902 35903 35904 35901 35906 35907 35908 35905 35910 35911 35912 35909 35914 35915 35916 35913 35918 35919 35920 35917 35922 35923 35924 35921 35926 35927 35928 35925 35930 35931 35932 35929 35934 35935 35936 35933 35938 35939 35940 35937 35942 35943 35944 35941 35946 35947 35948 35945 35950 35951 35952 35949 35954 35955 35956 35953 35958 35959 35960 35957 35962 35963 35964 35961 35966 35967 35968 35965 35970 35971 35972 35969 35974 35975 35976 35973 35978 35979 35980 35977 35982 35983 35984 35981 35986 35987 35988 35985 35990 35991 35992 35989 35994 35995 35996 35993 35998 35999 36000 35997 36002 36003 36004 36001 36006 36007 36008 36005 36010 36011 36012 36009 36014 36015 36016 36013 36018 36019 36020 36017 36022 36023 36024 36021 36026 36027 36028 36025 36030 36031 36032 36029 36034 36035 36036 36033 36038 36039 36040 36037 36042 36043 36044 36041 36046 36047 36048 36045 36050 36051 36052 36049 36054 36055 36056 36053 36058 36059 36060 36057 36062 36063 36064 36061 36066 36067 36068 36065 36070 36071 36072 36069 36074 36075 36076 36073 36078 36079 36080 36077 36082 36083 36084 36081 36086 36087 36088 36085 36090 36091 36092 36089 36094 36095 36096 36093 36098 36099 36100 36097 36102 36103 36104 36101 36106 36107 36108 36105 36110 36111 36112 36109 36114 36115 36116 36113 36118 36119 36120 36117 36122 36123 36124 36121 36126 36127 36128 36125 36130 36131 36132 36129 36134 36135 36136 36133 36138 36139 36140 36137 36142 36143 36144 36141 36146 36147 36148 36145 36150 36151 36152 36149 36154 36155 36156 36153 36158 36159 36160 36157 36162 36163 36164 36161 36166 36167 36168 36165 36170 36171 36172 36169 36174 36175 36176 36173 36178 36179 36180 36177 36182 36183 36184 36181 36186 36187 36188 36185 36190 36191 36192 36189 36194 36195 36196 36193 36198 36199 36200 36197 36202 36203 36204 36201 36206 36207 36208 36205 36210 36211 36212 36209 36214 36215 36216 36213 36218 36219 36220 36217 36222 36223 36224 36221 36226 36227 36228 36225 36230 36231 36232 36229 36234 36235 36236 36233 36238 36239 36240 36237 36242 36243 36244 36241 36246 36247 36248 36245 36250 36251 36252 36249 36254 36255 36256 36253 36258 36259 36260 36257 36262 36263 36264 36261 36266 36267 36268 36265 36270 36271 36272 36269 36274 36275 36276 36273 36278 36279 36280 36277 36282 36283 36284 36281 36286 36287 36288 36285 36290 36291 36292 36289 36294 36295 36296 36293 36298 36299 36300 36297 36302 36303 36304 36301 36306 36307 36308 36305 36310 36311 36312 36309 36314 36315 36316 36313 36318 36319 36320 36317 36322 36323 36324 36321 36326 36327 36328 36325 36330 36331 36332 36329 36334 36335 36336 36333 36338 36339 36340 36337 36342 36343 36344 36341 36346 36347 36348 36345 36350 36351 36352 36349 36354 36355 36356 36353 36358 36359 36360 36357 36362 36363 36364 36361 36366 36367 36368 36365 36370 36371 36372 36369 36374 36375 36376 36373 36378 36379 36380 36377 36382 36383 36384 36381 36386 36387 36388 36385 36390 36391 36392 36389 36394 36395 36396 36393 36398 36399 36400 36397 36402 36403 36404 36401 36406 36407 36408 36405 36410 36411 36412 36409 36414 36415 36416 36413 36418 36419 36420 36417 36422 36423 36424 36421 36426 36427 36428 36425 36430 36431 36432 36429 36434 36435 36436 36433 36438 36439 36440 36437 36442 36443 36444 36441 36446 36447 36448 36445 36450 36451 36452 36449 36454 36455 36456 36453 36458 36459 36460 36457 36462 36463 36464 36461 36466 36467 36468 36465 36470 36471 36472 36469 36474 36475 36476 36473 36478 36479 36480 36477 36482 36483 36484 36481 36486 36487 36488 36485 36490 36491 36492 36489 36494 36495 36496 36493 36498 36499 36500 36497 36502 36503 36504 36501 36506 36507 36508 36505 36510 36511 36512 36509 36514 36515 36516 36513 36518 36519 36520 36517 36522 36523 36524 36521 36526 36527 36528 36525 36530 36531 36532 36529 36534 36535 36536 36533 36538 36539 36540 36537 36542 36543 36544 36541 36546 36547 36548 36545 36550 36551 36552 36549 36554 36555 36556 36553 36558 36559 36560 36557 36562 36563 36564 36561 36566 36567 36568 36565 36570 36571 36572 36569 36574 36575 36576 36573 36578 36579 36580 36577 36582 36583 36584 36581 36586 36587 36588 36585 36590 36591 36592 36589 36594 36595 36596 36593 36598 36599 36600 36597 36602 36603 36604 36601 36606 36607 36608 36605 36610 36611 36612 36609 36614 36615 36616 36613 36618 36619 36620 36617 36622 36623 36624 36621 36626 36627 36628 36625 36630 36631 36632 36629 36634 36635 36636 36633 36638 36639 36640 36637 36642 36643 36644 36641 36646 36647 36648 36645 36650 36651 36652 36649 36654 36655 36656 36653 36658 36659 36660 36657 36662 36663 36664 36661 36666 36667 36668 36665 36670 36671 36672 36669 36674 36675 36676 36673 36678 36679 36680 36677 36682 36683 36684 36681 36686 36687 36688 36685 36690 36691 36692 36689 36694 36695 36696 36693 36698 36699 36700 36697 36702 36703 36704 36701 36706 36707 36708 36705 36710 36711 36712 36709 36714 36715 36716 36713 36718 36719 36720 36717 36722 36723 36724 36721 36726 36727 36728 36725 36730 36731 36732 36729 36734 36735 36736 36733 36738 36739 36740 36737 36742 36743 36744 36741 36746 36747 36748 36745 36750 36751 36752 36749 36754 36755 36756 36753 36758 36759 36760 36757 36762 36763 36764 36761 36766 36767 36768 36765 36770 36771 36772 36769 36774 36775 36776 36773 36778 36779 36780 36777 36782 36783 36784 36781 36786 36787 36788 36785 36790 36791 36792 36789 36794 36795 36796 36793 36798 36799 36800 36797 36802 36803 36804 36801 36806 36807 36808 36805 36810 36811 36812 36809 36814 36815 36816 36813 36818 36819 36820 36817 36822 36823 36824 36821 36826 36827 36828 36825 36830 36831 36832 36829 36834 36835 36836 36833 36838 36839 36840 36837 36842 36843 36844 36841 36846 36847 36848 36845 36850 36851 36852 36849 36854 36855 36856 36853 36858 36859 36860 36857 36862 36863 36864 36861 36866 36867 36868 36865 36870 36871 36872 36869 36874 36875 36876 36873 36878 36879 36880 36877 36882 36883 36884 36881 36886 36887 36888 36885 36890 36891 36892 36889 36894 36895 36896 36893 36898 36899 36900 36897 36902 36903 36904 36901 36906 36907 36908 36905 36910 36911 36912 36909 36914 36915 36916 36913 36918 36919 36920 36917 36922 36923 36924 36921 36926 36927 36928 36925 36930 36931 36932 36929 36934 36935 36936 36933 36938 36939 36940 36937 36942 36943 36944 36941 36946 36947 36948 36945 36950 36951 36952 36949 36954 36955 36956 36953 36958 36959 36960 36957 36962 36963 36964 36961 36966 36967 36968 36965 36970 36971 36972 36969 36974 36975 36976 36973 36978 36979 36980 36977 36982 36983 36984 36981 36986 36987 36988 36985 36990 36991 36992 36989 36994 36995 36996 36993 36998 36999 37000 36997 37002 37003 37004 37001 37006 37007 37008 37005 37010 37011 37012 37009 37014 37015 37016 37013 37018 37019 37020 37017 37022 37023 37024 37021 37026 37027 37028 37025 37030 37031 37032 37029 37034 37035 37036 37033 37038 37039 37040 37037 37042 37043 37044 37041 37046 37047 37048 37045 37050 37051 37052 37049 37054 37055 37056 37053 37058 37059 37060 37057 37062 37063 37064 37061 37066 37067 37068 37065 37070 37071 37072 37069 37074 37075 37076 37073 37078 37079 37080 37077 37082 37083 37084 37081 37086 37087 37088 37085 37090 37091 37092 37089 37094 37095 37096 37093 37098 37099 37100 37097 37102 37103 37104 37101 37106 37107 37108 37105 37110 37111 37112 37109 37114 37115 37116 37113 37118 37119 37120 37117 37122 37123 37124 37121 37126 37127 37128 37125 37130 37131 37132 37129 37134 37135 37136 37133 37138 37139 37140 37137 37142 37143 37144 37141 37146 37147 37148 37145 37150 37151 37152 37149 37154 37155 37156 37153 37158 37159 37160 37157 37162 37163 37164 37161 37166 37167 37168 37165 37170 37171 37172 37169 37174 37175 37176 37173 37178 37179 37180 37177 37182 37183 37184 37181 37186 37187 37188 37185 37190 37191 37192 37189 37194 37195 37196 37193 37198 37199 37200 37197 37202 37203 37204 37201 37206 37207 37208 37205 37210 37211 37212 37209 37214 37215 37216 37213 37218 37219 37220 37217 37222 37223 37224 37221 37226 37227 37228 37225 37230 37231 37232 37229 37234 37235 37236 37233 37238 37239 37240 37237 37242 37243 37244 37241 37246 37247 37248 37245 37250 37251 37252 37249 37254 37255 37256 37253 37258 37259 37260 37257 37262 37263 37264 37261 37266 37267 37268 37265 37270 37271 37272 37269 37274 37275 37276 37273 37278 37279 37280 37277 37282 37283 37284 37281 37286 37287 37288 37285 37290 37291 37292 37289 37294 37295 37296 37293 37298 37299 37300 37297 37302 37303 37304 37301 37306 37307 37308 37305 37310 37311 37312 37309 37314 37315 37316 37313 37318 37319 37320 37317 37322 37323 37324 37321 37326 37327 37328 37325 37330 37331 37332 37329 37334 37335 37336 37333 37338 37339 37340 37337 37342 37343 37344 37341 37346 37347 37348 37345 37350 37351 37352 37349 37354 37355 37356 37353 37358 37359 37360 37357 37362 37363 37364 37361 37366 37367 37368 37365 37370 37371 37372 37369 37374 37375 37376 37373 37378 37379 37380 37377 37382 37383 37384 37381 37386 37387 37388 37385 37390 37391 37392 37389 37394 37395 37396 37393 37398 37399 37400 37397 37402 37403 37404 37401 37406 37407 37408 37405 37410 37411 37412 37409 37414 37415 37416 37413 37418 37419 37420 37417 37422 37423 37424 37421 37426 37427 37428 37425 37430 37431 37432 37429 37434 37435 37436 37433 37438 37439 37440 37437 37442 37443 37444 37441 37446 37447 37448 37445 37450 37451 37452 37449 37454 37455 37456 37453 37458 37459 37460 37457 37462 37463 37464 37461 37466 37467 37468 37465 37470 37471 37472 37469 37474 37475 37476 37473 37478 37479 37480 37477 37482 37483 37484 37481 37486 37487 37488 37485 37490 37491 37492 37489 37494 37495 37496 37493 37498 37499 37500 37497 37502 37503 37504 37501 37506 37507 37508 37505 37510 37511 37512 37509 37514 37515 37516 37513 37518 37519 37520 37517 37522 37523 37524 37521 37526 37527 37528 37525 37530 37531 37532 37529 37534 37535 37536 37533 37538 37539 37540 37537 37542 37543 37544 37541 37546 37547 37548 37545 37550 37551 37552 37549 37554 37555 37556 37553 37558 37559 37560 37557 37562 37563 37564 37561 37566 37567 37568 37565 37570 37571 37572 37569 37574 37575 37576 37573 37578 37579 37580 37577 37582 37583 37584 37581 37586 37587 37588 37585 37590 37591 37592 37589 37594 37595 37596 37593 37598 37599 37600 37597 37602 37603 37604 37601 37606 37607 37608 37605 37610 37611 37612 37609 37614 37615 37616 37613 37618 37619 37620 37617 37622 37623 37624 37621 37626 37627 37628 37625 37630 37631 37632 37629 37634 37635 37636 37633 37638 37639 37640 37637 37642 37643 37644 37641 37646 37647 37648 37645 37650 37651 37652 37649 37654 37655 37656 37653 37658 37659 37660 37657 37662 37663 37664 37661 37666 37667 37668 37665 37670 37671 37672 37669 37674 37675 37676 37673 37678 37679 37680 37677 37682 37683 37684 37681 37686 37687 37688 37685 37690 37691 37692 37689 37694 37695 37696 37693 37698 37699 37700 37697 37702 37703 37704 37701 37706 37707 37708 37705 37710 37711 37712 37709 37714 37715 37716 37713 37718 37719 37720 37717 37722 37723 37724 37721 37726 37727 37728 37725 37730 37731 37732 37729 37734 37735 37736 37733 37738 37739 37740 37737 37742 37743 37744 37741 37746 37747 37748 37745 37750 37751 37752 37749 37754 37755 37756 37753 37758 37759 37760 37757 37762 37763 37764 37761 37766 37767 37768 37765 37770 37771 37772 37769 37774 37775 37776 37773 37778 37779 37780 37777 37782 37783 37784 37781 37786 37787 37788 37785 37790 37791 37792 37789 37794 37795 37796 37793 37798 37799 37800 37797 37802 37803 37804 37801 37806 37807 37808 37805 37810 37811 37812 37809 37814 37815 37816 37813 37818 37819 37820 37817 37822 37823 37824 37821 37826 37827 37828 37825 37830 37831 37832 37829 37834 37835 37836 37833 37838 37839 37840 37837 37842 37843 37844 37841 37846 37847 37848 37845 37850 37851 37852 37849 37854 37855 37856 37853 37858 37859 37860 37857 37862 37863 37864 37861 37866 37867 37868 37865 37870 37871 37872 37869 37874 37875 37876 37873 37878 37879 37880 37877 37882 37883 37884 37881 37886 37887 37888 37885 37890 37891 37892 37889 37894 37895 37896 37893 37898 37899 37900 37897 37902 37903 37904 37901 37906 37907 37908 37905 37910 37911 37912 37909 37914 37915 37916 37913 37918 37919 37920 37917 37922 37923 37924 37921 37926 37927 37928 37925 37930 37931 37932 37929 37934 37935 37936 37933 37938 37939 37940 37937 37942 37943 37944 37941 37946 37947 37948 37945 37950 37951 37952 37949 37954 37955 37956 37953 37958 37959 37960 37957 37962 37963 37964 37961 37966 37967 37968 37965 37970 37971 37972 37969 37974 37975 37976 37973 37978 37979 37980 37977 37982 37983 37984 37981 37986 37987 37988 37985 37990 37991 37992 37989 37994 37995 37996 37993 37998 37999 38000 37997 38002 38003 38004 38001 38006 38007 38008 38005 38010 38011 38012 38009 38014 38015 38016 38013 38018 38019 38020 38017 38022 38023 38024 38021 38026 38027 38028 38025 38030 38031 38032 38029 38034 38035 38036 38033 38038 38039 38040 38037 38042 38043 38044 38041 38046 38047 38048 38045 38050 38051 38052 38049 38054 38055 38056 38053 38058 38059 38060 38057 38062 38063 38064 38061 38066 38067 38068 38065 38070 38071 38072 38069 38074 38075 38076 38073 38078 38079 38080 38077 38082 38083 38084 38081 38086 38087 38088 38085 38090 38091 38092 38089 38094 38095 38096 38093 38098 38099 38100 38097 38102 38103 38104 38101 38106 38107 38108 38105 38110 38111 38112 38109 38114 38115 38116 38113 38118 38119 38120 38117 38122 38123 38124 38121 38126 38127 38128 38125 38130 38131 38132 38129 38134 38135 38136 38133 38138 38139 38140 38137 38142 38143 38144 38141 38146 38147 38148 38145 38150 38151 38152 38149 38154 38155 38156 38153 38158 38159 38160 38157 38162 38163 38164 38161 38166 38167 38168 38165 38170 38171 38172 38169 38174 38175 38176 38173 38178 38179 38180 38177 38182 38183 38184 38181 38186 38187 38188 38185 38190 38191 38192 38189 38194 38195 38196 38193 38198 38199 38200 38197 38202 38203 38204 38201 38206 38207 38208 38205 38210 38211 38212 38209 38214 38215 38216 38213 38218 38219 38220 38217 38222 38223 38224 38221 38226 38227 38228 38225 38230 38231 38232 38229 38234 38235 38236 38233 38238 38239 38240 38237 38242 38243 38244 38241 38246 38247 38248 38245 38250 38251 38252 38249 38254 38255 38256 38253 38258 38259 38260 38257 38262 38263 38264 38261 38266 38267 38268 38265 38270 38271 38272 38269 38274 38275 38276 38273 38278 38279 38280 38277 38282 38283 38284 38281 38286 38287 38288 38285 38290 38291 38292 38289 38294 38295 38296 38293 38298 38299 38300 38297 38302 38303 38304 38301 38306 38307 38308 38305 38310 38311 38312 38309 38314 38315 38316 38313 38318 38319 38320 38317 38322 38323 38324 38321 38326 38327 38328 38325 38330 38331 38332 38329 38334 38335 38336 38333 38338 38339 38340 38337 38342 38343 38344 38341 38346 38347 38348 38345 38350 38351 38352 38349 38354 38355 38356 38353 38358 38359 38360 38357 38362 38363 38364 38361 38366 38367 38368 38365 38370 38371 38372 38369 38374 38375 38376 38373 38378 38379 38380 38377 38382 38383 38384 38381 38386 38387 38388 38385 38390 38391 38392 38389 38394 38395 38396 38393 38398 38399 38400 38397 38402 38403 38404 38401 38406 38407 38408 38405 38410 38411 38412 38409 38414 38415 38416 38413 38418 38419 38420 38417 38422 38423 38424 38421 38426 38427 38428 38425 38430 38431 38432 38429 38434 38435 38436 38433 38438 38439 38440 38437 38442 38443 38444 38441 38446 38447 38448 38445 38450 38451 38452 38449 38454 38455 38456 38453 38458 38459 38460 38457 38462 38463 38464 38461 38466 38467 38468 38465 38470 38471 38472 38469 38474 38475 38476 38473 38478 38479 38480 38477 38482 38483 38484 38481 38486 38487 38488 38485 38490 38491 38492 38489 38494 38495 38496 38493 38498 38499 38500 38497 38502 38503 38504 38501 38506 38507 38508 38505 38510 38511 38512 38509 38514 38515 38516 38513 38518 38519 38520 38517 38522 38523 38524 38521 38526 38527 38528 38525 38530 38531 38532 38529 38534 38535 38536 38533 38538 38539 38540 38537 38542 38543 38544 38541 38546 38547 38548 38545 38550 38551 38552 38549 38554 38555 38556 38553 38558 38559 38560 38557 38562 38563 38564 38561 38566 38567 38568 38565 38570 38571 38572 38569 38574 38575 38576 38573 38578 38579 38580 38577 38582 38583 38584 38581 38586 38587 38588 38585 38590 38591 38592 38589 38594 38595 38596 38593 38598 38599 38600 38597 38602 38603 38604 38601 38606 38607 38608 38605 38610 38611 38612 38609 38614 38615 38616 38613 38618 38619 38620 38617 38622 38623 38624 38621 38626 38627 38628 38625 38630 38631 38632 38629 38634 38635 38636 38633 38638 38639 38640 38637 38642 38643 38644 38641 38646 38647 38648 38645 38650 38651 38652 38649 38654 38655 38656 38653 38658 38659 38660 38657 38662 38663 38664 38661 38666 38667 38668 38665 38670 38671 38672 38669 38674 38675 38676 38673 38678 38679 38680 38677 38682 38683 38684 38681 38686 38687 38688 38685 38690 38691 38692 38689 38694 38695 38696 38693 38698 38699 38700 38697 38702 38703 38704 38701 38706 38707 38708 38705 38710 38711 38712 38709 38714 38715 38716 38713 38718 38719 38720 38717 38722 38723 38724 38721 38726 38727 38728 38725 38730 38731 38732 38729 38734 38735 38736 38733 38738 38739 38740 38737 38742 38743 38744 38741 38746 38747 38748 38745 38750 38751 38752 38749 38754 38755 38756 38753 38758 38759 38760 38757 38762 38763 38764 38761 38766 38767 38768 38765 38770 38771 38772 38769 38774 38775 38776 38773 38778 38779 38780 38777 38782 38783 38784 38781 38786 38787 38788 38785 38790 38791 38792 38789 38794 38795 38796 38793 38798 38799 38800 38797 38802 38803 38804 38801 38806 38807 38808 38805 38810 38811 38812 38809 38814 38815 38816 38813 38818 38819 38820 38817 38822 38823 38824 38821 38826 38827 38828 38825 38830 38831 38832 38829 38834 38835 38836 38833 38838 38839 38840 38837 38842 38843 38844 38841 38846 38847 38848 38845 38850 38851 38852 38849 38854 38855 38856 38853 38858 38859 38860 38857 38862 38863 38864 38861 38866 38867 38868 38865 38870 38871 38872 38869 38874 38875 38876 38873 38878 38879 38880 38877 38882 38883 38884 38881 38886 38887 38888 38885 38890 38891 38892 38889 38894 38895 38896 38893 38898 38899 38900 38897 38902 38903 38904 38901 38906 38907 38908 38905 38910 38911 38912 38909 38914 38915 38916 38913 38918 38919 38920 38917 38922 38923 38924 38921 38926 38927 38928 38925 38930 38931 38932 38929 38934 38935 38936 38933 38938 38939 38940 38937 38942 38943 38944 38941 38946 38947 38948 38945 38950 38951 38952 38949 38954 38955 38956 38953 38958 38959 38960 38957 38962 38963 38964 38961 38966 38967 38968 38965 38970 38971 38972 38969 38974 38975 38976 38973 38978 38979 38980 38977 38982 38983 38984 38981 38986 38987 38988 38985 38990 38991 38992 38989 38994 38995 38996 38993 38998 38999 39000 38997 39002 39003 39004 39001 39006 39007 39008 39005 39010 39011 39012 39009 39014 39015 39016 39013 39018 39019 39020 39017 39022 39023 39024 39021 39026 39027 39028 39025 39030 39031 39032 39029 39034 39035 39036 39033 39038 39039 39040 39037 39042 39043 39044 39041 39046 39047 39048 39045 39050 39051 39052 39049 39054 39055 39056 39053 39058 39059 39060 39057 39062 39063 39064 39061 39066 39067 39068 39065 39070 39071 39072 39069 39074 39075 39076 39073 39078 39079 39080 39077 39082 39083 39084 39081 39086 39087 39088 39085 39090 39091 39092 39089 39094 39095 39096 39093 39098 39099 39100 39097 39102 39103 39104 39101 39106 39107 39108 39105 39110 39111 39112 39109 39114 39115 39116 39113 39118 39119 39120 39117 39122 39123 39124 39121 39126 39127 39128 39125 39130 39131 39132 39129 39134 39135 39136 39133 39138 39139 39140 39137 39142 39143 39144 39141 39146 39147 39148 39145 39150 39151 39152 39149 39154 39155 39156 39153 39158 39159 39160 39157 39162 39163 39164 39161 39166 39167 39168 39165 39170 39171 39172 39169 39174 39175 39176 39173 39178 39179 39180 39177 39182 39183 39184 39181 39186 39187 39188 39185 39190 39191 39192 39189 39194 39195 39196 39193 39198 39199 39200 39197 39202 39203 39204 39201 39206 39207 39208 39205 39210 39211 39212 39209 39214 39215 39216 39213 39218 39219 39220 39217 39222 39223 39224 39221 39226 39227 39228 39225 39230 39231 39232 39229 39234 39235 39236 39233 39238 39239 39240 39237 39242 39243 39244 39241 39246 39247 39248 39245 39250 39251 39252 39249 39254 39255 39256 39253 39258 39259 39260 39257 39262 39263 39264 39261 39266 39267 39268 39265 39270 39271 39272 39269 39274 39275 39276 39273 39278 39279 39280 39277 39282 39283 39284 39281 39286 39287 39288 39285 39290 39291 39292 39289 39294 39295 39296 39293 39298 39299 39300 39297 39302 39303 39304 39301 39306 39307 39308 39305 39310 39311 39312 39309 39314 39315 39316 39313 39318 39319 39320 39317 39322 39323 39324 39321 39326 39327 39328 39325 39330 39331 39332 39329 39334 39335 39336 39333 39338 39339 39340 39337 39342 39343 39344 39341 39346 39347 39348 39345 39350 39351 39352 39349 39354 39355 39356 39353 39358 39359 39360 39357 39362 39363 39364 39361 39366 39367 39368 39365 39370 39371 39372 39369 39374 39375 39376 39373 39378 39379 39380 39377 39382 39383 39384 39381 39386 39387 39388 39385 39390 39391 39392 39389 39394 39395 39396 39393 39398 39399 39400 39397 39402 39403 39404 39401 39406 39407 39408 39405 39410 39411 39412 39409 39414 39415 39416 39413 39418 39419 39420 39417 39422 39423 39424 39421 39426 39427 39428 39425 39430 39431 39432 39429 39434 39435 39436 39433 39438 39439 39440 39437 39442 39443 39444 39441 39446 39447 39448 39445 39450 39451 39452 39449 39454 39455 39456 39453 39458 39459 39460 39457 39462 39463 39464 39461 39466 39467 39468 39465 39470 39471 39472 39469 39474 39475 39476 39473 39478 39479 39480 39477 39482 39483 39484 39481 39486 39487 39488 39485 39490 39491 39492 39489 39494 39495 39496 39493 39498 39499 39500 39497 39502 39503 39504 39501 39506 39507 39508 39505 39510 39511 39512 39509 39514 39515 39516 39513 39518 39519 39520 39517 39522 39523 39524 39521 39526 39527 39528 39525 39530 39531 39532 39529 39534 39535 39536 39533 39538 39539 39540 39537 39542 39543 39544 39541 39546 39547 39548 39545 39550 39551 39552 39549 39554 39555 39556 39553 39558 39559 39560 39557 39562 39563 39564 39561 39566 39567 39568 39565 39570 39571 39572 39569 39574 39575 39576 39573 39578 39579 39580 39577 39582 39583 39584 39581 39586 39587 39588 39585 39590 39591 39592 39589 39594 39595 39596 39593 39598 39599 39600 39597 39602 39603 39604 39601 39606 39607 39608 39605 39610 39611 39612 39609 39614 39615 39616 39613 39618 39619 39620 39617 39622 39623 39624 39621 39626 39627 39628 39625 39630 39631 39632 39629 39634 39635 39636 39633 39638 39639 39640 39637 39642 39643 39644 39641 39646 39647 39648 39645 39650 39651 39652 39649 39654 39655 39656 39653 39658 39659 39660 39657 39662 39663 39664 39661 39666 39667 39668 39665 39670 39671 39672 39669 39674 39675 39676 39673 39678 39679 39680 39677 39682 39683 39684 39681 39686 39687 39688 39685 39690 39691 39692 39689 39694 39695 39696 39693 39698 39699 39700 39697 39702 39703 39704 39701 39706 39707 39708 39705 39710 39711 39712 39709 39714 39715 39716 39713 39718 39719 39720 39717 39722 39723 39724 39721 39726 39727 39728 39725 39730 39731 39732 39729 39734 39735 39736 39733 39738 39739 39740 39737 39742 39743 39744 39741 39746 39747 39748 39745 39750 39751 39752 39749 39754 39755 39756 39753 39758 39759 39760 39757 39762 39763 39764 39761 39766 39767 39768 39765 39770 39771 39772 39769 39774 39775 39776 39773 39778 39779 39780 39777 39782 39783 39784 39781 39786 39787 39788 39785 39790 39791 39792 39789 39794 39795 39796 39793 39798 39799 39800 39797 39802 39803 39804 39801 39806 39807 39808 39805 39810 39811 39812 39809 39814 39815 39816 39813 39818 39819 39820 39817 39822 39823 39824 39821 39826 39827 39828 39825 39830 39831 39832 39829 39834 39835 39836 39833 39838 39839 39840 39837 39842 39843 39844 39841 39846 39847 39848 39845 39850 39851 39852 39849 39854 39855 39856 39853 39858 39859 39860 39857 39862 39863 39864 39861 39866 39867 39868 39865 39870 39871 39872 39869 39874 39875 39876 39873 39878 39879 39880 39877 39882 39883 39884 39881 39886 39887 39888 39885 39890 39891 39892 39889 39894 39895 39896 39893 39898 39899 39900 39897 39902 39903 39904 39901 39906 39907 39908 39905 39910 39911 39912 39909 39914 39915 39916 39913 39918 39919 39920 39917 39922 39923 39924 39921 39926 39927 39928 39925 39930 39931 39932 39929 39934 39935 39936 39933 39938 39939 39940 39937 39942 39943 39944 39941 39946 39947 39948 39945 39950 39951 39952 39949 39954 39955 39956 39953 39958 39959 39960 39957 39962 39963 39964 39961 39966 39967 39968 39965 39970 39971 39972 39969 39974 39975 39976 39973 39978 39979 39980 39977 39982 39983 39984 39981 39986 39987 39988 39985 39990 39991 39992 39989 39994 39995 39996 39993 39998 39999 40000 39997 40002 40003 40004 40001 40006 40007 40008 40005 40010 40011 40012 40009 40014 40015 40016 40013 40018 40019 40020 40017 40022 40023 40024 40021 40026 40027 40028 40025 40030 40031 40032 40029 40034 40035 40036 40033 40038 40039 40040 40037 40042 40043 40044 40041 40046 40047 40048 40045 40050 40051 40052 40049 40054 40055 40056 40053 40058 40059 40060 40057 40062 40063 40064 40061 40066 40067 40068 40065 40070 40071 40072 40069 40074 40075 40076 40073 40078 40079 40080 40077 40082 40083 40084 40081 40086 40087 40088 40085 40090 40091 40092 40089 40094 40095 40096 40093 40098 40099 40100 40097 40102 40103 40104 40101 40106 40107 40108 40105 40110 40111 40112 40109 40114 40115 40116 40113 40118 40119 40120 40117 40122 40123 40124 40121 40126 40127 40128 40125 40130 40131 40132 40129 40134 40135 40136 40133 40138 40139 40140 40137 40142 40143 40144 40141 40146 40147 40148 40145 40150 40151 40152 40149 40154 40155 40156 40153 40158 40159 40160 40157 40162 40163 40164 40161 40166 40167 40168 40165 40170 40171 40172 40169 40174 40175 40176 40173 40178 40179 40180 40177 40182 40183 40184 40181 40186 40187 40188 40185 40190 40191 40192 40189 40194 40195 40196 40193 40198 40199 40200 40197 40202 40203 40204 40201 40206 40207 40208 40205 40210 40211 40212 40209 40214 40215 40216 40213 40218 40219 40220 40217 40222 40223 40224 40221 40226 40227 40228 40225 40230 40231 40232 40229 40234 40235 40236 40233 40238 40239 40240 40237 40242 40243 40244 40241 40246 40247 40248 40245 40250 40251 40252 40249 40254 40255 40256 40253 40258 40259 40260 40257 40262 40263 40264 40261 40266 40267 40268 40265 40270 40271 40272 40269 40274 40275 40276 40273 40278 40279 40280 40277 40282 40283 40284 40281 40286 40287 40288 40285 40290 40291 40292 40289 40294 40295 40296 40293 40298 40299 40300 40297 40302 40303 40304 40301 40306 40307 40308 40305 40310 40311 40312 40309 40314 40315 40316 40313 40318 40319 40320 40317 40322 40323 40324 40321 40326 40327 40328 40325 40330 40331 40332 40329 40334 40335 40336 40333 40338 40339 40340 40337 40342 40343 40344 40341 40346 40347 40348 40345 40350 40351 40352 40349 40354 40355 40356 40353 40358 40359 40360 40357 40362 40363 40364 40361 40366 40367 40368 40365 40370 40371 40372 40369 40374 40375 40376 40373 40378 40379 40380 40377 40382 40383 40384 40381 40386 40387 40388 40385 40390 40391 40392 40389 40394 40395 40396 40393 40398 40399 40400 40397 40402 40403 40404 40401 40406 40407 40408 40405 40410 40411 40412 40409 40414 40415 40416 40413 40418 40419 40420 40417 40422 40423 40424 40421 40426 40427 40428 40425 40430 40431 40432 40429 40434 40435 40436 40433 40438 40439 40440 40437 40442 40443 40444 40441 40446 40447 40448 40445 40450 40451 40452 40449 40454 40455 40456 40453 40458 40459 40460 40457 40462 40463 40464 40461 40466 40467 40468 40465 40470 40471 40472 40469 40474 40475 40476 40473 40478 40479 40480 40477 40482 40483 40484 40481 40486 40487 40488 40485 40490 40491 40492 40489 40494 40495 40496 40493 40498 40499 40500 40497 40502 40503 40504 40501 40506 40507 40508 40505 40510 40511 40512 40509 40514 40515 40516 40513 40518 40519 40520 40517 40522 40523 40524 40521 40526 40527 40528 40525 40530 40531 40532 40529 40534 40535 40536 40533 40538 40539 40540 40537 40542 40543 40544 40541 40546 40547 40548 40545 40550 40551 40552 40549 40554 40555 40556 40553 40558 40559 40560 40557 40562 40563 40564 40561 40566 40567 40568 40565 40570 40571 40572 40569 40574 40575 40576 40573 40578 40579 40580 40577 40582 40583 40584 40581 40586 40587 40588 40585 40590 40591 40592 40589 40594 40595 40596 40593 40598 40599 40600 40597 40602 40603 40604 40601 40606 40607 40608 40605 40610 40611 40612 40609 40614 40615 40616 40613 40618 40619 40620 40617 40622 40623 40624 40621 40626 40627 40628 40625 40630 40631 40632 40629 40634 40635 40636 40633 40638 40639 40640 40637 40642 40643 40644 40641 40646 40647 40648 40645 40650 40651 40652 40649 40654 40655 40656 40653 40658 40659 40660 40657 40662 40663 40664 40661 40666 40667 40668 40665 40670 40671 40672 40669 40674 40675 40676 40673 40678 40679 40680 40677 40682 40683 40684 40681 40686 40687 40688 40685 40690 40691 40692 40689 40694 40695 40696 40693 40698 40699 40700 40697 40702 40703 40704 40701 40706 40707 40708 40705 40710 40711 40712 40709 40714 40715 40716 40713 40718 40719 40720 40717 40722 40723 40724 40721 40726 40727 40728 40725 40730 40731 40732 40729 40734 40735 40736 40733 40738 40739 40740 40737 40742 40743 40744 40741 40746 40747 40748 40745 40750 40751 40752 40749 40754 40755 40756 40753 40758 40759 40760 40757 40762 40763 40764 40761 40766 40767 40768 40765 40770 40771 40772 40769 40774 40775 40776 40773 40778 40779 40780 40777 40782 40783 40784 40781 40786 40787 40788 40785 40790 40791 40792 40789 40794 40795 40796 40793 40798 40799 40800 40797 40802 40803 40804 40801 40806 40807 40808 40805 40810 40811 40812 40809 40814 40815 40816 40813 40818 40819 40820 40817 40822 40823 40824 40821 40826 40827 40828 40825 40830 40831 40832 40829 40834 40835 40836 40833 40838 40839 40840 40837 40842 40843 40844 40841 40846 40847 40848 40845 40850 40851 40852 40849 40854 40855 40856 40853 40858 40859 40860 40857 40862 40863 40864 40861 40866 40867 40868 40865 40870 40871 40872 40869 40874 40875 40876 40873 40878 40879 40880 40877 40882 40883 40884 40881 40886 40887 40888 40885 40890 40891 40892 40889 40894 40895 40896 40893 40898 40899 40900 40897 40902 40903 40904 40901 40906 40907 40908 40905 40910 40911 40912 40909 40914 40915 40916 40913 40918 40919 40920 40917 40922 40923 40924 40921 40926 40927 40928 40925 40930 40931 40932 40929 40934 40935 40936 40933 40938 40939 40940 40937 40942 40943 40944 40941 40946 40947 40948 40945 40950 40951 40952 40949 40954 40955 40956 40953 40958 40959 40960 40957 40962 40963 40964 40961 40966 40967 40968 40965 40970 40971 40972 40969 40974 40975 40976 40973 40978 40979 40980 40977 40982 40983 40984 40981 40986 40987 40988 40985 40990 40991 40992 40989 40994 40995 40996 40993 40998 40999 41000 40997 41002 41003 41004 41001 41006 41007 41008 41005 41010 41011 41012 41009 41014 41015 41016 41013 41018 41019 41020 41017 41022 41023 41024 41021 41026 41027 41028 41025 41030 41031 41032 41029 41034 41035 41036 41033 41038 41039 41040 41037 41042 41043 41044 41041 41046 41047 41048 41045 41050 41051 41052 41049 41054 41055 41056 41053 41058 41059 41060 41057 41062 41063 41064 41061 41066 41067 41068 41065 41070 41071 41072 41069 41074 41075 41076 41073 41078 41079 41080 41077 41082 41083 41084 41081 41086 41087 41088 41085 41090 41091 41092 41089 41094 41095 41096 41093 41098 41099 41100 41097 41102 41103 41104 41101 41106 41107 41108 41105 41110 41111 41112 41109 41114 41115 41116 41113 41118 41119 41120 41117 41122 41123 41124 41121 41126 41127 41128 41125 41130 41131 41132 41129 41134 41135 41136 41133 41138 41139 41140 41137 41142 41143 41144 41141 41146 41147 41148 41145 41150 41151 41152 41149 41154 41155 41156 41153 41158 41159 41160 41157 41162 41163 41164 41161 41166 41167 41168 41165 41170 41171 41172 41169 41174 41175 41176 41173 41178 41179 41180 41177 41182 41183 41184 41181 41186 41187 41188 41185 41190 41191 41192 41189 41194 41195 41196 41193 41198 41199 41200 41197 41202 41203 41204 41201 41206 41207 41208 41205 41210 41211 41212 41209 41214 41215 41216 41213 41218 41219 41220 41217 41222 41223 41224 41221 41226 41227 41228 41225 41230 41231 41232 41229 41234 41235 41236 41233 41238 41239 41240 41237 41242 41243 41244 41241 41246 41247 41248 41245 41250 41251 41252 41249 41254 41255 41256 41253 41258 41259 41260 41257 41262 41263 41264 41261 41266 41267 41268 41265 41270 41271 41272 41269 41274 41275 41276 41273 41278 41279 41280 41277 41282 41283 41284 41281 41286 41287 41288 41285 41290 41291 41292 41289 41294 41295 41296 41293 41298 41299 41300 41297 41302 41303 41304 41301 41306 41307 41308 41305 41310 41311 41312 41309 41314 41315 41316 41313 41318 41319 41320 41317 41322 41323 41324 41321 41326 41327 41328 41325 41330 41331 41332 41329 41334 41335 41336 41333 41338 41339 41340 41337 41342 41343 41344 41341 41346 41347 41348 41345 41350 41351 41352 41349 41354 41355 41356 41353 41358 41359 41360 41357 41362 41363 41364 41361 41366 41367 41368 41365 41370 41371 41372 41369 41374 41375 41376 41373 41378 41379 41380 41377 41382 41383 41384 41381 41386 41387 41388 41385 41390 41391 41392 41389 41394 41395 41396 41393 41398 41399 41400 41397 41402 41403 41404 41401 41406 41407 41408 41405 41410 41411 41412 41409 41414 41415 41416 41413 41418 41419 41420 41417 41422 41423 41424 41421 41426 41427 41428 41425 41430 41431 41432 41429 41434 41435 41436 41433 41438 41439 41440 41437 41442 41443 41444 41441 41446 41447 41448 41445 41450 41451 41452 41449 41454 41455 41456 41453 41458 41459 41460 41457 41462 41463 41464 41461 41466 41467 41468 41465 41470 41471 41472 41469 41474 41475 41476 41473 41478 41479 41480 41477 41482 41483 41484 41481 41486 41487 41488 41485 41490 41491 41492 41489 41494 41495 41496 41493 41498 41499 41500 41497 41502 41503 41504 41501 41506 41507 41508 41505 41510 41511 41512 41509 41514 41515 41516 41513 41518 41519 41520 41517 41522 41523 41524 41521 41526 41527 41528 41525 41530 41531 41532 41529 41534 41535 41536 41533 41538 41539 41540 41537 41542 41543 41544 41541 41546 41547 41548 41545 41550 41551 41552 41549 41554 41555 41556 41553 41558 41559 41560 41557 41562 41563 41564 41561 41566 41567 41568 41565 41570 41571 41572 41569 41574 41575 41576 41573 41578 41579 41580 41577 41582 41583 41584 41581 41586 41587 41588 41585 41590 41591 41592 41589 41594 41595 41596 41593 41598 41599 41600 41597 41602 41603 41604 41601 41606 41607 41608 41605 41610 41611 41612 41609 41614 41615 41616 41613 41618 41619 41620 41617 41622 41623 41624 41621 41626 41627 41628 41625 41630 41631 41632 41629 41634 41635 41636 41633 41638 41639 41640 41637 41642 41643 41644 41641 41646 41647 41648 41645 41650 41651 41652 41649 41654 41655 41656 41653 41658 41659 41660 41657 41662 41663 41664 41661 41666 41667 41668 41665 41670 41671 41672 41669 41674 41675 41676 41673 41678 41679 41680 41677 41682 41683 41684 41681 41686 41687 41688 41685 41690 41691 41692 41689 41694 41695 41696 41693 41698 41699 41700 41697 41702 41703 41704 41701 41706 41707 41708 41705 41710 41711 41712 41709 41714 41715 41716 41713 41718 41719 41720 41717 41722 41723 41724 41721 41726 41727 41728 41725 41730 41731 41732 41729 41734 41735 41736 41733 41738 41739 41740 41737 41742 41743 41744 41741 41746 41747 41748 41745 41750 41751 41752 41749 41754 41755 41756 41753 41758 41759 41760 41757 41762 41763 41764 41761 41766 41767 41768 41765 41770 41771 41772 41769 41774 41775 41776 41773 41778 41779 41780 41777 41782 41783 41784 41781 41786 41787 41788 41785 41790 41791 41792 41789 41794 41795 41796 41793 41798 41799 41800 41797 41802 41803 41804 41801 41806 41807 41808 41805 41810 41811 41812 41809 41814 41815 41816 41813 41818 41819 41820 41817 41822 41823 41824 41821 41826 41827 41828 41825 41830 41831 41832 41829 41834 41835 41836 41833 41838 41839 41840 41837 41842 41843 41844 41841 41846 41847 41848 41845 41850 41851 41852 41849 41854 41855 41856 41853 41858 41859 41860 41857 41862 41863 41864 41861 41866 41867 41868 41865 41870 41871 41872 41869 41874 41875 41876 41873 41878 41879 41880 41877 41882 41883 41884 41881 41886 41887 41888 41885 41890 41891 41892 41889 41894 41895 41896 41893 41898 41899 41900 41897 41902 41903 41904 41901 41906 41907 41908 41905 41910 41911 41912 41909 41914 41915 41916 41913 41918 41919 41920 41917 41922 41923 41924 41921 41926 41927 41928 41925 41930 41931 41932 41929 41934 41935 41936 41933 41938 41939 41940 41937 41942 41943 41944 41941 41946 41947 41948 41945 41950 41951 41952 41949 41954 41955 41956 41953 41958 41959 41960 41957 41962 41963 41964 41961 41966 41967 41968 41965 41970 41971 41972 41969 41974 41975 41976 41973 41978 41979 41980 41977 41982 41983 41984 41981 41986 41987 41988 41985 41990 41991 41992 41989 41994 41995 41996 41993 41998 41999 42000 41997 42002 42003 42004 42001 42006 42007 42008 42005 42010 42011 42012 42009 42014 42015 42016 42013 42018 42019 42020 42017 42022 42023 42024 42021 42026 42027 42028 42025 42030 42031 42032 42029 42034 42035 42036 42033 42038 42039 42040 42037 42042 42043 42044 42041 42046 42047 42048 42045 42050 42051 42052 42049 42054 42055 42056 42053 42058 42059 42060 42057 42062 42063 42064 42061 42066 42067 42068 42065 42070 42071 42072 42069 42074 42075 42076 42073 42078 42079 42080 42077 42082 42083 42084 42081 42086 42087 42088 42085 42090 42091 42092 42089 42094 42095 42096 42093 42098 42099 42100 42097 42102 42103 42104 42101 42106 42107 42108 42105 42110 42111 42112 42109 42114 42115 42116 42113 42118 42119 42120 42117 42122 42123 42124 42121 42126 42127 42128 42125 42130 42131 42132 42129 42134 42135 42136 42133 42138 42139 42140 42137 42142 42143 42144 42141 42146 42147 42148 42145 42150 42151 42152 42149 42154 42155 42156 42153 42158 42159 42160 42157 42162 42163 42164 42161 42166 42167 42168 42165 42170 42171 42172 42169 42174 42175 42176 42173 42178 42179 42180 42177 42182 42183 42184 42181 42186 42187 42188 42185 42190 42191 42192 42189 42194 42195 42196 42193 42198 42199 42200 42197 42202 42203 42204 42201 42206 42207 42208 42205 42210 42211 42212 42209 42214 42215 42216 42213 42218 42219 42220 42217 42222 42223 42224 42221 42226 42227 42228 42225 42230 42231 42232 42229 42234 42235 42236 42233 42238 42239 42240 42237 42242 42243 42244 42241 42246 42247 42248 42245 42250 42251 42252 42249 42254 42255 42256 42253 42258 42259 42260 42257 42262 42263 42264 42261 42266 42267 42268 42265 42270 42271 42272 42269 42274 42275 42276 42273 42278 42279 42280 42277 42282 42283 42284 42281 42286 42287 42288 42285 42290 42291 42292 42289 42294 42295 42296 42293 42298 42299 42300 42297 42302 42303 42304 42301 42306 42307 42308 42305 42310 42311 42312 42309 42314 42315 42316 42313 42318 42319 42320 42317 42322 42323 42324 42321 42326 42327 42328 42325 42330 42331 42332 42329 42334 42335 42336 42333 42338 42339 42340 42337 42342 42343 42344 42341 42346 42347 42348 42345 42350 42351 42352 42349 42354 42355 42356 42353 42358 42359 42360 42357 42362 42363 42364 42361 42366 42367 42368 42365 42370 42371 42372 42369 42374 42375 42376 42373 42378 42379 42380 42377 42382 42383 42384 42381 42386 42387 42388 42385 42390 42391 42392 42389 42394 42395 42396 42393 42398 42399 42400 42397 42402 42403 42404 42401 42406 42407 42408 42405 42410 42411 42412 42409 42414 42415 42416 42413 42418 42419 42420 42417 42422 42423 42424 42421 42426 42427 42428 42425 42430 42431 42432 42429 42434 42435 42436 42433 42438 42439 42440 42437 42442 42443 42444 42441 42446 42447 42448 42445 42450 42451 42452 42449 42454 42455 42456 42453 42458 42459 42460 42457 42462 42463 42464 42461 42466 42467 42468 42465 42470 42471 42472 42469 42474 42475 42476 42473 42478 42479 42480 42477 42482 42483 42484 42481 42486 42487 42488 42485 42490 42491 42492 42489 42494 42495 42496 42493 42498 42499 42500 42497 42502 42503 42504 42501 42506 42507 42508 42505 42510 42511 42512 42509 42514 42515 42516 42513 42518 42519 42520 42517 42522 42523 42524 42521 42526 42527 42528 42525 42530 42531 42532 42529 42534 42535 42536 42533 42538 42539 42540 42537 42542 42543 42544 42541 42546 42547 42548 42545 42550 42551 42552 42549 42554 42555 42556 42553 42558 42559 42560 42557 42562 42563 42564 42561 42566 42567 42568 42565 42570 42571 42572 42569 42574 42575 42576 42573 42578 42579 42580 42577 42582 42583 42584 42581 42586 42587 42588 42585 42590 42591 42592 42589 42594 42595 42596 42593 42598 42599 42600 42597 42602 42603 42604 42601 42606 42607 42608 42605 42610 42611 42612 42609 42614 42615 42616 42613 42618 42619 42620 42617 42622 42623 42624 42621 42626 42627 42628 42625 42630 42631 42632 42629 42634 42635 42636 42633 42638 42639 42640 42637 42642 42643 42644 42641 42646 42647 42648 42645 42650 42651 42652 42649 42654 42655 42656 42653 42658 42659 42660 42657 42662 42663 42664 42661 42666 42667 42668 42665 42670 42671 42672 42669 42674 42675 42676 42673 42678 42679 42680 42677 42682 42683 42684 42681 42686 42687 42688 42685 42690 42691 42692 42689 42694 42695 42696 42693 42698 42699 42700 42697 42702 42703 42704 42701 42706 42707 42708 42705 42710 42711 42712 42709 42714 42715 42716 42713 42718 42719 42720 42717 42722 42723 42724 42721 42726 42727 42728 42725 42730 42731 42732 42729 42734 42735 42736 42733 42738 42739 42740 42737 42742 42743 42744 42741 42746 42747 42748 42745 42750 42751 42752 42749 42754 42755 42756 42753 42758 42759 42760 42757 42762 42763 42764 42761 42766 42767 42768 42765 42770 42771 42772 42769 42774 42775 42776 42773 42778 42779 42780 42777 42782 42783 42784 42781 42786 42787 42788 42785 42790 42791 42792 42789 42794 42795 42796 42793 42798 42799 42800 42797 42802 42803 42804 42801 42806 42807 42808 42805 42810 42811 42812 42809 42814 42815 42816 42813 42818 42819 42820 42817 42822 42823 42824 42821 42826 42827 42828 42825 42830 42831 42832 42829 42834 42835 42836 42833 42838 42839 42840 42837 42842 42843 42844 42841 42846 42847 42848 42845 42850 42851 42852 42849 42854 42855 42856 42853 42858 42859 42860 42857 42862 42863 42864 42861 42866 42867 42868 42865 42870 42871 42872 42869 42874 42875 42876 42873 42878 42879 42880 42877 42882 42883 42884 42881 42886 42887 42888 42885 42890 42891 42892 42889 42894 42895 42896 42893 42898 42899 42900 42897 42902 42903 42904 42901 42906 42907 42908 42905 42910 42911 42912 42909 42914 42915 42916 42913 42918 42919 42920 42917 42922 42923 42924 42921 42926 42927 42928 42925 42930 42931 42932 42929 42934 42935 42936 42933 42938 42939 42940 42937 42942 42943 42944 42941 42946 42947 42948 42945 42950 42951 42952 42949 42954 42955 42956 42953 42958 42959 42960 42957 42962 42963 42964 42961 42966 42967 42968 42965 42970 42971 42972 42969 42974 42975 42976 42973 42978 42979 42980 42977 42982 42983 42984 42981 42986 42987 42988 42985 42990 42991 42992 42989 42994 42995 42996 42993 42998 42999 43000 42997 43002 43003 43004 43001 43006 43007 43008 43005 43010 43011 43012 43009 43014 43015 43016 43013 43018 43019 43020 43017 43022 43023 43024 43021 43026 43027 43028 43025 43030 43031 43032 43029 43034 43035 43036 43033 43038 43039 43040 43037 43042 43043 43044 43041 43046 43047 43048 43045 43050 43051 43052 43049 43054 43055 43056 43053 43058 43059 43060 43057 43062 43063 43064 43061 43066 43067 43068 43065 43070 43071 43072 43069 43074 43075 43076 43073 43078 43079 43080 43077 43082 43083 43084 43081 43086 43087 43088 43085 43090 43091 43092 43089 43094 43095 43096 43093 43098 43099 43100 43097 43102 43103 43104 43101 43106 43107 43108 43105 43110 43111 43112 43109 43114 43115 43116 43113 43118 43119 43120 43117 43122 43123 43124 43121 43126 43127 43128 43125 43130 43131 43132 43129 43134 43135 43136 43133 43138 43139 43140 43137 43142 43143 43144 43141 43146 43147 43148 43145 43150 43151 43152 43149 43154 43155 43156 43153 43158 43159 43160 43157 43162 43163 43164 43161 43166 43167 43168 43165 43170 43171 43172 43169 43174 43175 43176 43173 43178 43179 43180 43177 43182 43183 43184 43181 43186 43187 43188 43185 43190 43191 43192 43189 43194 43195 43196 43193 43198 43199 43200 43197 43202 43203 43204 43201 43206 43207 43208 43205 43210 43211 43212 43209 43214 43215 43216 43213 43218 43219 43220 43217 43222 43223 43224 43221 43226 43227 43228 43225 43230 43231 43232 43229 43234 43235 43236 43233 43238 43239 43240 43237 43242 43243 43244 43241 43246 43247 43248 43245 43250 43251 43252 43249 43254 43255 43256 43253 43258 43259 43260 43257 43262 43263 43264 43261 43266 43267 43268 43265 43270 43271 43272 43269 43274 43275 43276 43273 43278 43279 43280 43277 43282 43283 43284 43281 43286 43287 43288 43285 43290 43291 43292 43289 43294 43295 43296 43293 43298 43299 43300 43297 43302 43303 43304 43301 43306 43307 43308 43305 43310 43311 43312 43309 43314 43315 43316 43313 43318 43319 43320 43317 43322 43323 43324 43321 43326 43327 43328 43325 43330 43331 43332 43329 43334 43335 43336 43333 43338 43339 43340 43337 43342 43343 43344 43341 43346 43347 43348 43345 43350 43351 43352 43349 43354 43355 43356 43353 43358 43359 43360 43357 43362 43363 43364 43361 43366 43367 43368 43365 43370 43371 43372 43369 43374 43375 43376 43373 43378 43379 43380 43377 43382 43383 43384 43381 43386 43387 43388 43385 43390 43391 43392 43389 43394 43395 43396 43393 43398 43399 43400 43397 43402 43403 43404 43401 43406 43407 43408 43405 43410 43411 43412 43409 43414 43415 43416 43413 43418 43419 43420 43417 43422 43423 43424 43421 43426 43427 43428 43425 43430 43431 43432 43429 43434 43435 43436 43433 43438 43439 43440 43437 43442 43443 43444 43441 43446 43447 43448 43445 43450 43451 43452 43449 43454 43455 43456 43453 43458 43459 43460 43457 43462 43463 43464 43461 43466 43467 43468 43465 43470 43471 43472 43469 43474 43475 43476 43473 43478 43479 43480 43477 43482 43483 43484 43481 43486 43487 43488 43485 43490 43491 43492 43489 43494 43495 43496 43493 43498 43499 43500 43497 43502 43503 43504 43501 43506 43507 43508 43505 43510 43511 43512 43509 43514 43515 43516 43513 43518 43519 43520 43517 43522 43523 43524 43521 43526 43527 43528 43525 43530 43531 43532 43529 43534 43535 43536 43533 43538 43539 43540 43537 43542 43543 43544 43541 43546 43547 43548 43545 43550 43551 43552 43549 43554 43555 43556 43553 43558 43559 43560 43557 43562 43563 43564 43561 43566 43567 43568 43565 43570 43571 43572 43569 43574 43575 43576 43573 43578 43579 43580 43577 43582 43583 43584 43581 43586 43587 43588 43585 43590 43591 43592 43589 43594 43595 43596 43593 43598 43599 43600 43597 43602 43603 43604 43601 43606 43607 43608 43605 43610 43611 43612 43609 43614 43615 43616 43613 43618 43619 43620 43617 43622 43623 43624 43621 43626 43627 43628 43625 43630 43631 43632 43629 43634 43635 43636 43633 43638 43639 43640 43637 43642 43643 43644 43641 43646 43647 43648 43645 43650 43651 43652 43649 43654 43655 43656 43653 43658 43659 43660 43657 43662 43663 43664 43661 43666 43667 43668 43665 43670 43671 43672 43669 43674 43675 43676 43673 43678 43679 43680 43677 43682 43683 43684 43681 43686 43687 43688 43685 43690 43691 43692 43689 43694 43695 43696 43693 43698 43699 43700 43697 43702 43703 43704 43701 43706 43707 43708 43705 43710 43711 43712 43709 43714 43715 43716 43713 43718 43719 43720 43717 43722 43723 43724 43721 43726 43727 43728 43725 43730 43731 43732 43729 43734 43735 43736 43733 43738 43739 43740 43737 43742 43743 43744 43741 43746 43747 43748 43745 43750 43751 43752 43749 43754 43755 43756 43753 43758 43759 43760 43757 43762 43763 43764 43761 43766 43767 43768 43765 43770 43771 43772 43769 43774 43775 43776 43773 43778 43779 43780 43777 43782 43783 43784 43781 43786 43787 43788 43785 43790 43791 43792 43789 43794 43795 43796 43793 43798 43799 43800 43797 43802 43803 43804 43801 43806 43807 43808 43805 43810 43811 43812 43809 43814 43815 43816 43813 43818 43819 43820 43817 43822 43823 43824 43821 43826 43827 43828 43825 43830 43831 43832 43829 43834 43835 43836 43833 43838 43839 43840 43837 43842 43843 43844 43841 43846 43847 43848 43845 43850 43851 43852 43849 43854 43855 43856 43853 43858 43859 43860 43857 43862 43863 43864 43861 43866 43867 43868 43865 43870 43871 43872 43869 43874 43875 43876 43873 43878 43879 43880 43877 43882 43883 43884 43881 43886 43887 43888 43885 43890 43891 43892 43889 43894 43895 43896 43893 43898 43899 43900 43897 43902 43903 43904 43901 43906 43907 43908 43905 43910 43911 43912 43909 43914 43915 43916 43913 43918 43919 43920 43917 43922 43923 43924 43921 43926 43927 43928 43925 43930 43931 43932 43929 43934 43935 43936 43933 43938 43939 43940 43937 43942 43943 43944 43941 43946 43947 43948 43945 43950 43951 43952 43949 43954 43955 43956 43953 43958 43959 43960 43957 43962 43963 43964 43961 43966 43967 43968 43965 43970 43971 43972 43969 43974 43975 43976 43973 43978 43979 43980 43977 43982 43983 43984 43981 43986 43987 43988 43985 43990 43991 43992 43989 43994 43995 43996 43993 43998 43999 44000 43997 44002 44003 44004 44001 44006 44007 44008 44005 44010 44011 44012 44009 44014 44015 44016 44013 44018 44019 44020 44017 44022 44023 44024 44021 44026 44027 44028 44025 44030 44031 44032 44029 44034 44035 44036 44033 44038 44039 44040 44037 44042 44043 44044 44041 44046 44047 44048 44045 44050 44051 44052 44049 44054 44055 44056 44053 44058 44059 44060 44057 44062 44063 44064 44061 44066 44067 44068 44065 44070 44071 44072 44069 44074 44075 44076 44073 44078 44079 44080 44077 44082 44083 44084 44081 44086 44087 44088 44085 44090 44091 44092 44089 44094 44095 44096 44093 44098 44099 44100 44097 44102 44103 44104 44101 44106 44107 44108 44105 44110 44111 44112 44109 44114 44115 44116 44113 44118 44119 44120 44117 44122 44123 44124 44121 44126 44127 44128 44125 44130 44131 44132 44129 44134 44135 44136 44133 44138 44139 44140 44137 44142 44143 44144 44141 44146 44147 44148 44145 44150 44151 44152 44149 44154 44155 44156 44153 44158 44159 44160 44157 44162 44163 44164 44161 44166 44167 44168 44165 44170 44171 44172 44169 44174 44175 44176 44173 44178 44179 44180 44177 44182 44183 44184 44181 44186 44187 44188 44185 44190 44191 44192 44189 44194 44195 44196 44193 44198 44199 44200 44197 44202 44203 44204 44201 44206 44207 44208 44205 44210 44211 44212 44209 44214 44215 44216 44213 44218 44219 44220 44217 44222 44223 44224 44221 44226 44227 44228 44225 44230 44231 44232 44229 44234 44235 44236 44233 44238 44239 44240 44237 44242 44243 44244 44241 44246 44247 44248 44245 44250 44251 44252 44249 44254 44255 44256 44253 44258 44259 44260 44257 44262 44263 44264 44261 44266 44267 44268 44265 44270 44271 44272 44269 44274 44275 44276 44273 44278 44279 44280 44277 44282 44283 44284 44281 44286 44287 44288 44285 44290 44291 44292 44289 44294 44295 44296 44293 44298 44299 44300 44297 44302 44303 44304 44301 44306 44307 44308 44305 44310 44311 44312 44309 44314 44315 44316 44313 44318 44319 44320 44317 44322 44323 44324 44321 44326 44327 44328 44325 44330 44331 44332 44329 44334 44335 44336 44333 44338 44339 44340 44337 44342 44343 44344 44341 44346 44347 44348 44345 44350 44351 44352 44349 44354 44355 44356 44353 44358 44359 44360 44357 44362 44363 44364 44361 44366 44367 44368 44365 44370 44371 44372 44369 44374 44375 44376 44373 44378 44379 44380 44377 44382 44383 44384 44381 44386 44387 44388 44385 44390 44391 44392 44389 44394 44395 44396 44393 44398 44399 44400 44397 44402 44403 44404 44401 44406 44407 44408 44405 44410 44411 44412 44409 44414 44415 44416 44413 44418 44419 44420 44417 44422 44423 44424 44421 44426 44427 44428 44425 44430 44431 44432 44429 44434 44435 44436 44433 44438 44439 44440 44437 44442 44443 44444 44441 44446 44447 44448 44445 44450 44451 44452 44449 44454 44455 44456 44453 44458 44459 44460 44457 44462 44463 44464 44461 44466 44467 44468 44465 44470 44471 44472 44469 44474 44475 44476 44473 44478 44479 44480 44477 44482 44483 44484 44481 44486 44487 44488 44485 44490 44491 44492 44489 44494 44495 44496 44493 44498 44499 44500 44497 44502 44503 44504 44501 44506 44507 44508 44505 44510 44511 44512 44509 44514 44515 44516 44513 44518 44519 44520 44517 44522 44523 44524 44521 44526 44527 44528 44525 44530 44531 44532 44529 44534 44535 44536 44533 44538 44539 44540 44537 44542 44543 44544 44541 44546 44547 44548 44545 44550 44551 44552 44549 44554 44555 44556 44553 44558 44559 44560 44557 44562 44563 44564 44561 44566 44567 44568 44565 44570 44571 44572 44569 44574 44575 44576 44573 44578 44579 44580 44577 44582 44583 44584 44581 44586 44587 44588 44585 44590 44591 44592 44589 44594 44595 44596 44593 44598 44599 44600 44597 44602 44603 44604 44601 44606 44607 44608 44605 44610 44611 44612 44609 44614 44615 44616 44613 44618 44619 44620 44617 44622 44623 44624 44621 44626 44627 44628 44625 44630 44631 44632 44629 44634 44635 44636 44633 44638 44639 44640 44637 44642 44643 44644 44641 44646 44647 44648 44645 44650 44651 44652 44649 44654 44655 44656 44653 44658 44659 44660 44657 44662 44663 44664 44661 44666 44667 44668 44665 44670 44671 44672 44669 44674 44675 44676 44673 44678 44679 44680 44677 44682 44683 44684 44681 44686 44687 44688 44685 44690 44691 44692 44689 44694 44695 44696 44693 44698 44699 44700 44697 44702 44703 44704 44701 44706 44707 44708 44705 44710 44711 44712 44709 44714 44715 44716 44713 44718 44719 44720 44717 44722 44723 44724 44721 44726 44727 44728 44725 44730 44731 44732 44729 44734 44735 44736 44733 44738 44739 44740 44737 44742 44743 44744 44741 44746 44747 44748 44745 44750 44751 44752 44749 44754 44755 44756 44753 44758 44759 44760 44757 44762 44763 44764 44761 44766 44767 44768 44765 44770 44771 44772 44769 44774 44775 44776 44773 44778 44779 44780 44777 44782 44783 44784 44781 44786 44787 44788 44785 44790 44791 44792 44789 44794 44795 44796 44793 44798 44799 44800 44797 44802 44803 44804 44801 44806 44807 44808 44805 44810 44811 44812 44809 44814 44815 44816 44813 44818 44819 44820 44817 44822 44823 44824 44821 44826 44827 44828 44825 44830 44831 44832 44829 44834 44835 44836 44833 44838 44839 44840 44837 44842 44843 44844 44841 44846 44847 44848 44845 44850 44851 44852 44849 44854 44855 44856 44853 44858 44859 44860 44857 44862 44863 44864 44861 44866 44867 44868 44865 44870 44871 44872 44869 44874 44875 44876 44873 44878 44879 44880 44877 44882 44883 44884 44881 44886 44887 44888 44885 44890 44891 44892 44889 44894 44895 44896 44893 44898 44899 44900 44897 44902 44903 44904 44901 44906 44907 44908 44905 44910 44911 44912 44909 44914 44915 44916 44913 44918 44919 44920 44917 44922 44923 44924 44921 44926 44927 44928 44925 44930 44931 44932 44929 44934 44935 44936 44933 44938 44939 44940 44937 44942 44943 44944 44941 44946 44947 44948 44945 44950 44951 44952 44949 44954 44955 44956 44953 44958 44959 44960 44957 44962 44963 44964 44961 44966 44967 44968 44965 44970 44971 44972 44969 44974 44975 44976 44973 44978 44979 44980 44977 44982 44983 44984 44981 44986 44987 44988 44985 44990 44991 44992 44989 44994 44995 44996 44993 44998 44999 45000 44997 45002 45003 45004 45001 45006 45007 45008 45005 45010 45011 45012 45009 45014 45015 45016 45013 45018 45019 45020 45017 45022 45023 45024 45021 45026 45027 45028 45025 45030 45031 45032 45029 45034 45035 45036 45033 45038 45039 45040 45037 45042 45043 45044 45041 45046 45047 45048 45045 45050 45051 45052 45049 45054 45055 45056 45053 45058 45059 45060 45057 45062 45063 45064 45061 45066 45067 45068 45065 45070 45071 45072 45069 45074 45075 45076 45073 45078 45079 45080 45077 45082 45083 45084 45081 45086 45087 45088 45085 45090 45091 45092 45089 45094 45095 45096 45093 45098 45099 45100 45097 45102 45103 45104 45101 45106 45107 45108 45105 45110 45111 45112 45109 45114 45115 45116 45113 45118 45119 45120 45117 45122 45123 45124 45121 45126 45127 45128 45125 45130 45131 45132 45129 45134 45135 45136 45133 45138 45139 45140 45137 45142 45143 45144 45141 45146 45147 45148 45145 45150 45151 45152 45149 45154 45155 45156 45153 45158 45159 45160 45157 45162 45163 45164 45161 45166 45167 45168 45165 45170 45171 45172 45169 45174 45175 45176 45173 45178 45179 45180 45177 45182 45183 45184 45181 45186 45187 45188 45185 45190 45191 45192 45189 45194 45195 45196 45193 45198 45199 45200 45197 45202 45203 45204 45201 45206 45207 45208 45205 45210 45211 45212 45209 45214 45215 45216 45213 45218 45219 45220 45217 45222 45223 45224 45221 45226 45227 45228 45225 45230 45231 45232 45229 45234 45235 45236 45233 45238 45239 45240 45237 45242 45243 45244 45241 45246 45247 45248 45245 45250 45251 45252 45249 45254 45255 45256 45253 45258 45259 45260 45257 45262 45263 45264 45261 45266 45267 45268 45265 45270 45271 45272 45269 45274 45275 45276 45273 45278 45279 45280 45277 45282 45283 45284 45281 45286 45287 45288 45285 45290 45291 45292 45289 45294 45295 45296 45293 45298 45299 45300 45297 45302 45303 45304 45301 45306 45307 45308 45305 45310 45311 45312 45309 45314 45315 45316 45313 45318 45319 45320 45317 45322 45323 45324 45321 45326 45327 45328 45325 45330 45331 45332 45329 45334 45335 45336 45333 45338 45339 45340 45337 45342 45343 45344 45341 45346 45347 45348 45345 45350 45351 45352 45349 45354 45355 45356 45353 45358 45359 45360 45357 45362 45363 45364 45361 45366 45367 45368 45365 45370 45371 45372 45369 45374 45375 45376 45373 45378 45379 45380 45377 45382 45383 45384 45381 45386 45387 45388 45385 45390 45391 45392 45389 45394 45395 45396 45393 45398 45399 45400 45397 45402 45403 45404 45401 45406 45407 45408 45405 45410 45411 45412 45409 45414 45415 45416 45413 45418 45419 45420 45417 45422 45423 45424 45421 45426 45427 45428 45425 45430 45431 45432 45429 45434 45435 45436 45433 45438 45439 45440 45437 45442 45443 45444 45441 45446 45447 45448 45445 45450 45451 45452 45449 45454 45455 45456 45453 45458 45459 45460 45457 45462 45463 45464 45461 45466 45467 45468 45465 45470 45471 45472 45469 45474 45475 45476 45473 45478 45479 45480 45477 45482 45483 45484 45481 45486 45487 45488 45485 45490 45491 45492 45489 45494 45495 45496 45493 45498 45499 45500 45497 45502 45503 45504 45501 45506 45507 45508 45505 45510 45511 45512 45509 45514 45515 45516 45513 45518 45519 45520 45517 45522 45523 45524 45521 45526 45527 45528 45525 45530 45531 45532 45529 45534 45535 45536 45533 45538 45539 45540 45537 45542 45543 45544 45541 45546 45547 45548 45545 45550 45551 45552 45549 45554 45555 45556 45553 45558 45559 45560 45557 45562 45563 45564 45561 45566 45567 45568 45565 45570 45571 45572 45569 45574 45575 45576 45573 45578 45579 45580 45577 45582 45583 45584 45581 45586 45587 45588 45585 45590 45591 45592 45589 45594 45595 45596 45593 45598 45599 45600 45597 45602 45603 45604 45601 45606 45607 45608 45605 45610 45611 45612 45609 45614 45615 45616 45613 45618 45619 45620 45617 45622 45623 45624 45621 45626 45627 45628 45625 45630 45631 45632 45629 45634 45635 45636 45633 45638 45639 45640 45637 45642 45643 45644 45641 45646 45647 45648 45645 45650 45651 45652 45649 45654 45655 45656 45653 45658 45659 45660 45657 45662 45663 45664 45661 45666 45667 45668 45665 45670 45671 45672 45669 45674 45675 45676 45673 45678 45679 45680 45677 45682 45683 45684 45681 45686 45687 45688 45685 45690 45691 45692 45689 45694 45695 45696 45693 45698 45699 45700 45697 45702 45703 45704 45701 45706 45707 45708 45705 45710 45711 45712 45709 45714 45715 45716 45713 45718 45719 45720 45717 45722 45723 45724 45721 45726 45727 45728 45725 45730 45731 45732 45729 45734 45735 45736 45733 45738 45739 45740 45737 45742 45743 45744 45741 45746 45747 45748 45745 45750 45751 45752 45749 45754 45755 45756 45753 45758 45759 45760 45757 45762 45763 45764 45761 45766 45767 45768 45765 45770 45771 45772 45769 45774 45775 45776 45773 45778 45779 45780 45777 45782 45783 45784 45781 45786 45787 45788 45785 45790 45791 45792 45789 45794 45795 45796 45793 45798 45799 45800 45797 45802 45803 45804 45801 45806 45807 45808 45805 45810 45811 45812 45809 45814 45815 45816 45813 45818 45819 45820 45817 45822 45823 45824 45821 45826 45827 45828 45825 45830 45831 45832 45829 45834 45835 45836 45833 45838 45839 45840 45837 45842 45843 45844 45841 45846 45847 45848 45845 45850 45851 45852 45849 45854 45855 45856 45853 45858 45859 45860 45857 45862 45863 45864 45861 45866 45867 45868 45865 45870 45871 45872 45869 45874 45875 45876 45873 45878 45879 45880 45877 45882 45883 45884 45881 45886 45887 45888 45885 45890 45891 45892 45889 45894 45895 45896 45893 45898 45899 45900 45897 45902 45903 45904 45901 45906 45907 45908 45905 45910 45911 45912 45909 45914 45915 45916 45913 45918 45919 45920 45917 45922 45923 45924 45921 45926 45927 45928 45925 45930 45931 45932 45929 45934 45935 45936 45933 45938 45939 45940 45937 45942 45943 45944 45941 45946 45947 45948 45945 45950 45951 45952 45949 45954 45955 45956 45953 45958 45959 45960 45957 45962 45963 45964 45961 45966 45967 45968 45965 45970 45971 45972 45969 45974 45975 45976 45973 45978 45979 45980 45977 45982 45983 45984 45981 45986 45987 45988 45985 45990 45991 45992 45989 45994 45995 45996 45993 45998 45999 46000 45997 46002 46003 46004 46001 46006 46007 46008 46005 46010 46011 46012 46009 46014 46015 46016 46013 46018 46019 46020 46017 46022 46023 46024 46021 46026 46027 46028 46025 46030 46031 46032 46029 46034 46035 46036 46033 46038 46039 46040 46037 46042 46043 46044 46041 46046 46047 46048 46045 46050 46051 46052 46049 46054 46055 46056 46053 46058 46059 46060 46057 46062 46063 46064 46061 46066 46067 46068 46065 46070 46071 46072 46069 46074 46075 46076 46073 46078 46079 46080 46077 46082 46083 46084 46081 46086 46087 46088 46085 46090 46091 46092 46089 46094 46095 46096 46093 46098 46099 46100 46097 46102 46103 46104 46101 46106 46107 46108 46105 46110 46111 46112 46109 46114 46115 46116 46113 46118 46119 46120 46117 46122 46123 46124 46121 46126 46127 46128 46125 46130 46131 46132 46129 46134 46135 46136 46133 46138 46139 46140 46137 46142 46143 46144 46141 46146 46147 46148 46145 46150 46151 46152 46149 46154 46155 46156 46153 46158 46159 46160 46157 46162 46163 46164 46161 46166 46167 46168 46165 46170 46171 46172 46169 46174 46175 46176 46173 46178 46179 46180 46177 46182 46183 46184 46181 46186 46187 46188 46185 46190 46191 46192 46189 46194 46195 46196 46193 46198 46199 46200 46197 46202 46203 46204 46201 46206 46207 46208 46205 46210 46211 46212 46209 46214 46215 46216 46213 46218 46219 46220 46217 46222 46223 46224 46221 46226 46227 46228 46225 46230 46231 46232 46229 46234 46235 46236 46233 46238 46239 46240 46237 46242 46243 46244 46241 46246 46247 46248 46245 46250 46251 46252 46249 46254 46255 46256 46253 46258 46259 46260 46257 46262 46263 46264 46261 46266 46267 46268 46265 46270 46271 46272 46269 46274 46275 46276 46273 46278 46279 46280 46277 46282 46283 46284 46281 46286 46287 46288 46285 46290 46291 46292 46289 46294 46295 46296 46293 46298 46299 46300 46297 46302 46303 46304 46301 46306 46307 46308 46305 46310 46311 46312 46309 46314 46315 46316 46313 46318 46319 46320 46317 46322 46323 46324 46321 46326 46327 46328 46325 46330 46331 46332 46329 46334 46335 46336 46333 46338 46339 46340 46337 46342 46343 46344 46341 46346 46347 46348 46345 46350 46351 46352 46349 46354 46355 46356 46353 46358 46359 46360 46357 46362 46363 46364 46361 46366 46367 46368 46365 46370 46371 46372 46369 46374 46375 46376 46373 46378 46379 46380 46377 46382 46383 46384 46381 46386 46387 46388 46385 46390 46391 46392 46389 46394 46395 46396 46393 46398 46399 46400 46397 46402 46403 46404 46401 46406 46407 46408 46405 46410 46411 46412 46409 46414 46415 46416 46413 46418 46419 46420 46417 46422 46423 46424 46421 46426 46427 46428 46425 46430 46431 46432 46429 46434 46435 46436 46433 46438 46439 46440 46437 46442 46443 46444 46441 46446 46447 46448 46445 46450 46451 46452 46449 46454 46455 46456 46453 46458 46459 46460 46457 46462 46463 46464 46461 46466 46467 46468 46465 46470 46471 46472 46469 46474 46475 46476 46473 46478 46479 46480 46477 46482 46483 46484 46481 46486 46487 46488 46485 46490 46491 46492 46489 46494 46495 46496 46493 46498 46499 46500 46497 46502 46503 46504 46501 46506 46507 46508 46505 46510 46511 46512 46509 46514 46515 46516 46513 46518 46519 46520 46517 46522 46523 46524 46521 46526 46527 46528 46525 46530 46531 46532 46529 46534 46535 46536 46533 46538 46539 46540 46537 46542 46543 46544 46541 46546 46547 46548 46545 46550 46551 46552 46549 46554 46555 46556 46553 46558 46559 46560 46557 46562 46563 46564 46561 46566 46567 46568 46565 46570 46571 46572 46569 46574 46575 46576 46573 46578 46579 46580 46577 46582 46583 46584 46581 46586 46587 46588 46585 46590 46591 46592 46589 46594 46595 46596 46593 46598 46599 46600 46597 46602 46603 46604 46601 46606 46607 46608 46605 46610 46611 46612 46609 46614 46615 46616 46613 46618 46619 46620 46617 46622 46623 46624 46621 46626 46627 46628 46625 46630 46631 46632 46629 46634 46635 46636 46633 46638 46639 46640 46637 46642 46643 46644 46641 46646 46647 46648 46645 46650 46651 46652 46649 46654 46655 46656 46653 46658 46659 46660 46657 46662 46663 46664 46661 46666 46667 46668 46665 46670 46671 46672 46669 46674 46675 46676 46673 46678 46679 46680 46677 46682 46683 46684 46681 46686 46687 46688 46685 46690 46691 46692 46689 46694 46695 46696 46693 46698 46699 46700 46697 46702 46703 46704 46701 46706 46707 46708 46705 46710 46711 46712 46709 46714 46715 46716 46713 46718 46719 46720 46717 46722 46723 46724 46721 46726 46727 46728 46725 46730 46731 46732 46729 46734 46735 46736 46733 46738 46739 46740 46737 46742 46743 46744 46741 46746 46747 46748 46745 46750 46751 46752 46749 46754 46755 46756 46753 46758 46759 46760 46757 46762 46763 46764 46761 46766 46767 46768 46765 46770 46771 46772 46769 46774 46775 46776 46773 46778 46779 46780 46777 46782 46783 46784 46781 46786 46787 46788 46785 46790 46791 46792 46789 46794 46795 46796 46793 46798 46799 46800 46797 46802 46803 46804 46801 46806 46807 46808 46805 46810 46811 46812 46809 46814 46815 46816 46813 46818 46819 46820 46817 46822 46823 46824 46821 46826 46827 46828 46825 46830 46831 46832 46829 46834 46835 46836 46833 46838 46839 46840 46837 46842 46843 46844 46841 46846 46847 46848 46845 46850 46851 46852 46849 46854 46855 46856 46853 46858 46859 46860 46857 46862 46863 46864 46861 46866 46867 46868 46865 46870 46871 46872 46869 46874 46875 46876 46873 46878 46879 46880 46877 46882 46883 46884 46881 46886 46887 46888 46885 46890 46891 46892 46889 46894 46895 46896 46893 46898 46899 46900 46897 46902 46903 46904 46901 46906 46907 46908 46905 46910 46911 46912 46909 46914 46915 46916 46913 46918 46919 46920 46917 46922 46923 46924 46921 46926 46927 46928 46925 46930 46931 46932 46929 46934 46935 46936 46933 46938 46939 46940 46937 46942 46943 46944 46941 46946 46947 46948 46945 46950 46951 46952 46949 46954 46955 46956 46953 46958 46959 46960 46957 46962 46963 46964 46961 46966 46967 46968 46965 46970 46971 46972 46969 46974 46975 46976 46973 46978 46979 46980 46977 46982 46983 46984 46981 46986 46987 46988 46985 46990 46991 46992 46989 46994 46995 46996 46993 46998 46999 47000 46997 47002 47003 47004 47001 47006 47007 47008 47005 47010 47011 47012 47009 47014 47015 47016 47013 47018 47019 47020 47017 47022 47023 47024 47021 47026 47027 47028 47025 47030 47031 47032 47029 47034 47035 47036 47033 47038 47039 47040 47037 47042 47043 47044 47041 47046 47047 47048 47045 47050 47051 47052 47049 47054 47055 47056 47053 47058 47059 47060 47057 47062 47063 47064 47061 47066 47067 47068 47065 47070 47071 47072 47069 47074 47075 47076 47073 47078 47079 47080 47077 47082 47083 47084 47081 47086 47087 47088 47085 47090 47091 47092 47089 47094 47095 47096 47093 47098 47099 47100 47097 47102 47103 47104 47101 47106 47107 47108 47105 47110 47111 47112 47109 47114 47115 47116 47113 47118 47119 47120 47117 47122 47123 47124 47121 47126 47127 47128 47125 47130 47131 47132 47129 47134 47135 47136 47133 47138 47139 47140 47137 47142 47143 47144 47141 47146 47147 47148 47145 47150 47151 47152 47149 47154 47155 47156 47153 47158 47159 47160 47157 47162 47163 47164 47161 47166 47167 47168 47165 47170 47171 47172 47169 47174 47175 47176 47173 47178 47179 47180 47177 47182 47183 47184 47181 47186 47187 47188 47185 47190 47191 47192 47189 47194 47195 47196 47193 47198 47199 47200 47197 47202 47203 47204 47201 47206 47207 47208 47205 47210 47211 47212 47209 47214 47215 47216 47213 47218 47219 47220 47217 47222 47223 47224 47221 47226 47227 47228 47225 47230 47231 47232 47229 47234 47235 47236 47233 47238 47239 47240 47237 47242 47243 47244 47241 47246 47247 47248 47245 47250 47251 47252 47249 47254 47255 47256 47253 47258 47259 47260 47257 47262 47263 47264 47261 47266 47267 47268 47265 47270 47271 47272 47269 47274 47275 47276 47273 47278 47279 47280 47277 47282 47283 47284 47281 47286 47287 47288 47285 47290 47291 47292 47289 47294 47295 47296 47293 47298 47299 47300 47297 47302 47303 47304 47301 47306 47307 47308 47305 47310 47311 47312 47309 47314 47315 47316 47313 47318 47319 47320 47317 47322 47323 47324 47321 47326 47327 47328 47325 47330 47331 47332 47329 47334 47335 47336 47333 47338 47339 47340 47337 47342 47343 47344 47341 47346 47347 47348 47345 47350 47351 47352 47349 47354 47355 47356 47353 47358 47359 47360 47357 47362 47363 47364 47361 47366 47367 47368 47365 47370 47371 47372 47369 47374 47375 47376 47373 47378 47379 47380 47377 47382 47383 47384 47381 47386 47387 47388 47385 47390 47391 47392 47389 47394 47395 47396 47393 47398 47399 47400 47397 47402 47403 47404 47401 47406 47407 47408 47405 47410 47411 47412 47409 47414 47415 47416 47413 47418 47419 47420 47417 47422 47423 47424 47421 47426 47427 47428 47425 47430 47431 47432 47429 47434 47435 47436 47433 47438 47439 47440 47437 47442 47443 47444 47441 47446 47447 47448 47445 47450 47451 47452 47449 47454 47455 47456 47453 47458 47459 47460 47457 47462 47463 47464 47461 47466 47467 47468 47465 47470 47471 47472 47469 47474 47475 47476 47473 47478 47479 47480 47477 47482 47483 47484 47481 47486 47487 47488 47485 47490 47491 47492 47489 47494 47495 47496 47493 47498 47499 47500 47497 47502 47503 47504 47501 47506 47507 47508 47505 47510 47511 47512 47509 47514 47515 47516 47513 47518 47519 47520 47517 47522 47523 47524 47521 47526 47527 47528 47525 47530 47531 47532 47529 47534 47535 47536 47533 47538 47539 47540 47537 47542 47543 47544 47541 47546 47547 47548 47545 47550 47551 47552 47549 47554 47555 47556 47553 47558 47559 47560 47557 47562 47563 47564 47561 47566 47567 47568 47565 47570 47571 47572 47569 47574 47575 47576 47573 47578 47579 47580 47577 47582 47583 47584 47581 47586 47587 47588 47585 47590 47591 47592 47589 47594 47595 47596 47593 47598 47599 47600 47597 47602 47603 47604 47601 47606 47607 47608 47605 47610 47611 47612 47609 47614 47615 47616 47613 47618 47619 47620 47617 47622 47623 47624 47621 47626 47627 47628 47625 47630 47631 47632 47629 47634 47635 47636 47633 47638 47639 47640 47637 47642 47643 47644 47641 47646 47647 47648 47645 47650 47651 47652 47649 47654 47655 47656 47653 47658 47659 47660 47657 47662 47663 47664 47661 47666 47667 47668 47665 47670 47671 47672 47669 47674 47675 47676 47673 47678 47679 47680 47677 47682 47683 47684 47681 47686 47687 47688 47685 47690 47691 47692 47689 47694 47695 47696 47693 47698 47699 47700 47697 47702 47703 47704 47701 47706 47707 47708 47705 47710 47711 47712 47709 47714 47715 47716 47713 47718 47719 47720 47717 47722 47723 47724 47721 47726 47727 47728 47725 47730 47731 47732 47729 47734 47735 47736 47733 47738 47739 47740 47737 47742 47743 47744 47741 47746 47747 47748 47745 47750 47751 47752 47749 47754 47755 47756 47753 47758 47759 47760 47757 47762 47763 47764 47761 47766 47767 47768 47765 47770 47771 47772 47769 47774 47775 47776 47773 47778 47779 47780 47777 47782 47783 47784 47781 47786 47787 47788 47785 47790 47791 47792 47789 47794 47795 47796 47793 47798 47799 47800 47797 47802 47803 47804 47801 47806 47807 47808 47805 47810 47811 47812 47809 47814 47815 47816 47813 47818 47819 47820 47817 47822 47823 47824 47821 47826 47827 47828 47825 47830 47831 47832 47829 47834 47835 47836 47833 47838 47839 47840 47837 47842 47843 47844 47841 47846 47847 47848 47845 47850 47851 47852 47849 47854 47855 47856 47853 47858 47859 47860 47857 47862 47863 47864 47861 47866 47867 47868 47865 47870 47871 47872 47869 47874 47875 47876 47873 47878 47879 47880 47877 47882 47883 47884 47881 47886 47887 47888 47885 47890 47891 47892 47889 47894 47895 47896 47893 47898 47899 47900 47897 47902 47903 47904 47901 47906 47907 47908 47905 47910 47911 47912 47909 47914 47915 47916 47913 47918 47919 47920 47917 47922 47923 47924 47921 47926 47927 47928 47925 47930 47931 47932 47929 47934 47935 47936 47933 47938 47939 47940 47937 47942 47943 47944 47941 47946 47947 47948 47945 47950 47951 47952 47949 47954 47955 47956 47953 47958 47959 47960 47957 47962 47963 47964 47961 47966 47967 47968 47965 47970 47971 47972 47969 47974 47975 47976 47973 47978 47979 47980 47977 47982 47983 47984 47981 47986 47987 47988 47985 47990 47991 47992 47989 47994 47995 47996 47993 47998 47999 48000 47997 48002 48003 48004 48001 48006 48007 48008 48005 48010 48011 48012 48009 48014 48015 48016 48013 48018 48019 48020 48017 48022 48023 48024 48021 48026 48027 48028 48025 48030 48031 48032 48029 48034 48035 48036 48033 48038 48039 48040 48037 48042 48043 48044 48041 48046 48047 48048 48045 48050 48051 48052 48049 48054 48055 48056 48053 48058 48059 48060 48057 48062 48063 48064 48061 48066 48067 48068 48065 48070 48071 48072 48069 48074 48075 48076 48073 48078 48079 48080 48077 48082 48083 48084 48081 48086 48087 48088 48085 48090 48091 48092 48089 48094 48095 48096 48093 48098 48099 48100 48097 48102 48103 48104 48101 48106 48107 48108 48105 48110 48111 48112 48109 48114 48115 48116 48113 48118 48119 48120 48117 48122 48123 48124 48121 48126 48127 48128 48125 48130 48131 48132 48129 48134 48135 48136 48133 48138 48139 48140 48137 48142 48143 48144 48141 48146 48147 48148 48145 48150 48151 48152 48149 48154 48155 48156 48153 48158 48159 48160 48157 48162 48163 48164 48161 48166 48167 48168 48165 48170 48171 48172 48169 48174 48175 48176 48173 48178 48179 48180 48177 48182 48183 48184 48181 48186 48187 48188 48185 48190 48191 48192 48189 48194 48195 48196 48193 48198 48199 48200 48197 48202 48203 48204 48201 48206 48207 48208 48205 48210 48211 48212 48209 48214 48215 48216 48213 48218 48219 48220 48217 48222 48223 48224 48221 48226 48227 48228 48225 48230 48231 48232 48229 48234 48235 48236 48233 48238 48239 48240 48237 48242 48243 48244 48241 48246 48247 48248 48245 48250 48251 48252 48249 48254 48255 48256 48253 48258 48259 48260 48257 48262 48263 48264 48261 48266 48267 48268 48265 48270 48271 48272 48269 48274 48275 48276 48273 48278 48279 48280 48277 48282 48283 48284 48281 48286 48287 48288 48285 48290 48291 48292 48289 48294 48295 48296 48293 48298 48299 48300 48297 48302 48303 48304 48301 48306 48307 48308 48305 48310 48311 48312 48309 48314 48315 48316 48313 48318 48319 48320 48317 48322 48323 48324 48321 48326 48327 48328 48325 48330 48331 48332 48329 48334 48335 48336 48333 48338 48339 48340 48337 48342 48343 48344 48341 48346 48347 48348 48345 48350 48351 48352 48349 48354 48355 48356 48353 48358 48359 48360 48357 48362 48363 48364 48361 48366 48367 48368 48365 48370 48371 48372 48369 48374 48375 48376 48373 48378 48379 48380 48377 48382 48383 48384 48381 48386 48387 48388 48385 48390 48391 48392 48389 48394 48395 48396 48393 48398 48399 48400 48397 48402 48403 48404 48401 48406 48407 48408 48405 48410 48411 48412 48409 48414 48415 48416 48413 48418 48419 48420 48417 48422 48423 48424 48421 48426 48427 48428 48425 48430 48431 48432 48429 48434 48435 48436 48433 48438 48439 48440 48437 48442 48443 48444 48441 48446 48447 48448 48445 48450 48451 48452 48449 48454 48455 48456 48453 48458 48459 48460 48457 48462 48463 48464 48461 48466 48467 48468 48465 48470 48471 48472 48469 48474 48475 48476 48473 48478 48479 48480 48477 48482 48483 48484 48481 48486 48487 48488 48485 48490 48491 48492 48489 48494 48495 48496 48493 48498 48499 48500 48497 48502 48503 48504 48501 48506 48507 48508 48505 48510 48511 48512 48509 48514 48515 48516 48513 48518 48519 48520 48517 48522 48523 48524 48521 48526 48527 48528 48525 48530 48531 48532 48529 48534 48535 48536 48533 48538 48539 48540 48537 48542 48543 48544 48541 48546 48547 48548 48545 48550 48551 48552 48549 48554 48555 48556 48553 48558 48559 48560 48557 48562 48563 48564 48561 48566 48567 48568 48565 48570 48571 48572 48569 48574 48575 48576 48573 48578 48579 48580 48577 48582 48583 48584 48581 48586 48587 48588 48585 48590 48591 48592 48589 48594 48595 48596 48593 48598 48599 48600 48597 48602 48603 48604 48601 48606 48607 48608 48605 48610 48611 48612 48609 48614 48615 48616 48613 48618 48619 48620 48617 48622 48623 48624 48621 48626 48627 48628 48625 48630 48631 48632 48629 48634 48635 48636 48633 48638 48639 48640 48637 48642 48643 48644 48641 48646 48647 48648 48645 48650 48651 48652 48649 48654 48655 48656 48653 48658 48659 48660 48657 48662 48663 48664 48661 48666 48667 48668 48665 48670 48671 48672 48669 48674 48675 48676 48673 48678 48679 48680 48677 48682 48683 48684 48681 48686 48687 48688 48685 48690 48691 48692 48689 48694 48695 48696 48693 48698 48699 48700 48697 48702 48703 48704 48701 48706 48707 48708 48705 48710 48711 48712 48709 48714 48715 48716 48713 48718 48719 48720 48717 48722 48723 48724 48721 48726 48727 48728 48725 48730 48731 48732 48729 48734 48735 48736 48733 48738 48739 48740 48737 48742 48743 48744 48741 48746 48747 48748 48745 48750 48751 48752 48749 48754 48755 48756 48753 48758 48759 48760 48757 48762 48763 48764 48761 48766 48767 48768 48765 48770 48771 48772 48769 48774 48775 48776 48773 48778 48779 48780 48777 48782 48783 48784 48781 48786 48787 48788 48785 48790 48791 48792 48789 48794 48795 48796 48793 48798 48799 48800 48797 48802 48803 48804 48801 48806 48807 48808 48805 48810 48811 48812 48809 48814 48815 48816 48813 48818 48819 48820 48817 48822 48823 48824 48821 48826 48827 48828 48825 48830 48831 48832 48829 48834 48835 48836 48833 48838 48839 48840 48837 48842 48843 48844 48841 48846 48847 48848 48845 48850 48851 48852 48849 48854 48855 48856 48853 48858 48859 48860 48857 48862 48863 48864 48861 48866 48867 48868 48865 48870 48871 48872 48869 48874 48875 48876 48873 48878 48879 48880 48877 48882 48883 48884 48881 48886 48887 48888 48885 48890 48891 48892 48889 48894 48895 48896 48893 48898 48899 48900 48897 48902 48903 48904 48901 48906 48907 48908 48905 48910 48911 48912 48909 48914 48915 48916 48913 48918 48919 48920 48917 48922 48923 48924 48921 48926 48927 48928 48925 48930 48931 48932 48929 48934 48935 48936 48933 48938 48939 48940 48937 48942 48943 48944 48941 48946 48947 48948 48945 48950 48951 48952 48949 48954 48955 48956 48953 48958 48959 48960 48957 48962 48963 48964 48961 48966 48967 48968 48965 48970 48971 48972 48969 48974 48975 48976 48973 48978 48979 48980 48977 48982 48983 48984 48981 48986 48987 48988 48985 48990 48991 48992 48989 48994 48995 48996 48993 48998 48999 49000 48997 49002 49003 49004 49001 49006 49007 49008 49005 49010 49011 49012 49009 49014 49015 49016 49013 49018 49019 49020 49017 49022 49023 49024 49021 49026 49027 49028 49025 49030 49031 49032 49029 49034 49035 49036 49033 49038 49039 49040 49037 49042 49043 49044 49041 49046 49047 49048 49045 49050 49051 49052 49049 49054 49055 49056 49053 49058 49059 49060 49057 49062 49063 49064 49061 49066 49067 49068 49065 49070 49071 49072 49069 49074 49075 49076 49073 49078 49079 49080 49077 49082 49083 49084 49081 49086 49087 49088 49085 49090 49091 49092 49089 49094 49095 49096 49093 49098 49099 49100 49097 49102 49103 49104 49101 49106 49107 49108 49105 49110 49111 49112 49109 49114 49115 49116 49113 49118 49119 49120 49117 49122 49123 49124 49121 49126 49127 49128 49125 49130 49131 49132 49129 49134 49135 49136 49133 49138 49139 49140 49137 49142 49143 49144 49141 49146 49147 49148 49145 49150 49151 49152 49149 49154 49155 49156 49153 49158 49159 49160 49157 49162 49163 49164 49161 49166 49167 49168 49165 49170 49171 49172 49169 49174 49175 49176 49173 49178 49179 49180 49177 49182 49183 49184 49181 49186 49187 49188 49185 49190 49191 49192 49189 49194 49195 49196 49193 49198 49199 49200 49197 49202 49203 49204 49201 49206 49207 49208 49205 49210 49211 49212 49209 49214 49215 49216 49213 49218 49219 49220 49217 49222 49223 49224 49221 49226 49227 49228 49225 49230 49231 49232 49229 49234 49235 49236 49233 49238 49239 49240 49237 49242 49243 49244 49241 49246 49247 49248 49245 49250 49251 49252 49249 49254 49255 49256 49253 49258 49259 49260 49257 49262 49263 49264 49261 49266 49267 49268 49265 49270 49271 49272 49269 49274 49275 49276 49273 49278 49279 49280 49277 49282 49283 49284 49281 49286 49287 49288 49285 49290 49291 49292 49289 49294 49295 49296 49293 49298 49299 49300 49297 49302 49303 49304 49301 49306 49307 49308 49305 49310 49311 49312 49309 49314 49315 49316 49313 49318 49319 49320 49317 49322 49323 49324 49321 49326 49327 49328 49325 49330 49331 49332 49329 49334 49335 49336 49333 49338 49339 49340 49337 49342 49343 49344 49341 49346 49347 49348 49345 49350 49351 49352 49349 49354 49355 49356 49353 49358 49359 49360 49357 49362 49363 49364 49361 49366 49367 49368 49365 49370 49371 49372 49369 49374 49375 49376 49373 49378 49379 49380 49377 49382 49383 49384 49381 49386 49387 49388 49385 49390 49391 49392 49389 49394 49395 49396 49393 49398 49399 49400 49397 49402 49403 49404 49401 49406 49407 49408 49405 49410 49411 49412 49409 49414 49415 49416 49413 49418 49419 49420 49417 49422 49423 49424 49421 49426 49427 49428 49425 49430 49431 49432 49429 49434 49435 49436 49433 49438 49439 49440 49437 49442 49443 49444 49441 49446 49447 49448 49445 49450 49451 49452 49449 49454 49455 49456 49453 49458 49459 49460 49457 49462 49463 49464 49461 49466 49467 49468 49465 49470 49471 49472 49469 49474 49475 49476 49473 49478 49479 49480 49477 49482 49483 49484 49481 49486 49487 49488 49485 49490 49491 49492 49489 49494 49495 49496 49493 49498 49499 49500 49497 49502 49503 49504 49501 49506 49507 49508 49505 49510 49511 49512 49509 49514 49515 49516 49513 49518 49519 49520 49517 49522 49523 49524 49521 49526 49527 49528 49525 49530 49531 49532 49529 49534 49535 49536 49533 49538 49539 49540 49537 49542 49543 49544 49541 49546 49547 49548 49545 49550 49551 49552 49549 49554 49555 49556 49553 49558 49559 49560 49557 49562 49563 49564 49561 49566 49567 49568 49565 49570 49571 49572 49569 49574 49575 49576 49573 49578 49579 49580 49577 49582 49583 49584 49581 49586 49587 49588 49585 49590 49591 49592 49589 49594 49595 49596 49593 49598 49599 49600 49597 49602 49603 49604 49601 49606 49607 49608 49605 49610 49611 49612 49609 49614 49615 49616 49613 49618 49619 49620 49617 49622 49623 49624 49621 49626 49627 49628 49625 49630 49631 49632 49629 49634 49635 49636 49633 49638 49639 49640 49637 49642 49643 49644 49641 49646 49647 49648 49645 49650 49651 49652 49649 49654 49655 49656 49653 49658 49659 49660 49657 49662 49663 49664 49661 49666 49667 49668 49665 49670 49671 49672 49669 49674 49675 49676 49673 49678 49679 49680 49677 49682 49683 49684 49681 49686 49687 49688 49685 49690 49691 49692 49689 49694 49695 49696 49693 49698 49699 49700 49697 49702 49703 49704 49701 49706 49707 49708 49705 49710 49711 49712 49709 49714 49715 49716 49713 49718 49719 49720 49717 49722 49723 49724 49721 49726 49727 49728 49725 49730 49731 49732 49729 49734 49735 49736 49733 49738 49739 49740 49737 49742 49743 49744 49741 49746 49747 49748 49745 49750 49751 49752 49749 49754 49755 49756 49753 49758 49759 49760 49757 49762 49763 49764 49761 49766 49767 49768 49765 49770 49771 49772 49769 49774 49775 49776 49773 49778 49779 49780 49777 49782 49783 49784 49781 49786 49787 49788 49785 49790 49791 49792 49789 49794 49795 49796 49793 49798 49799 49800 49797 49802 49803 49804 49801 49806 49807 49808 49805 49810 49811 49812 49809 49814 49815 49816 49813 49818 49819 49820 49817 49822 49823 49824 49821 49826 49827 49828 49825 49830 49831 49832 49829 49834 49835 49836 49833 49838 49839 49840 49837 49842 49843 49844 49841 49846 49847 49848 49845 49850 49851 49852 49849 49854 49855 49856 49853 49858 49859 49860 49857 49862 49863 49864 49861 49866 49867 49868 49865 49870 49871 49872 49869 49874 49875 49876 49873 49878 49879 49880 49877 49882 49883 49884 49881 49886 49887 49888 49885 49890 49891 49892 49889 49894 49895 49896 49893 49898 49899 49900 49897 49902 49903 49904 49901 49906 49907 49908 49905 49910 49911 49912 49909 49914 49915 49916 49913 49918 49919 49920 49917 49922 49923 49924 49921 49926 49927 49928 49925 49930 49931 49932 49929 49934 49935 49936 49933 49938 49939 49940 49937 49942 49943 49944 49941 49946 49947 49948 49945 49950 49951 49952 49949 49954 49955 49956 49953 49958 49959 49960 49957 49962 49963 49964 49961 49966 49967 49968 49965 49970 49971 49972 49969 49974 49975 49976 49973 49978 49979 49980 49977 49982 49983 49984 49981 49986 49987 49988 49985 49990 49991 49992 49989 49994 49995 49996 49993 49998 49999 50000 49997 50002 50003 50004 50001 50006 50007 50008 50005 50010 50011 50012 50009 50014 50015 50016 50013 50018 50019 50020 50017 50022 50023 50024 50021 50026 50027 50028 50025 50030 50031 50032 50029 50034 50035 50036 50033 50038 50039 50040 50037 50042 50043 50044 50041 50046 50047 50048 50045 50050 50051 50052 50049 50054 50055 50056 50053 50058 50059 50060 50057 50062 50063 50064 50061 50066 50067 50068 50065 50070 50071 50072 50069 50074 50075 50076 50073 50078 50079 50080 50077 50082 50083 50084 50081 50086 50087 50088 50085 50090 50091 50092 50089 50094 50095 50096 50093 50098 50099 50100 50097 50102 50103 50104 50101 50106 50107 50108 50105 50110 50111 50112 50109 50114 50115 50116 50113 50118 50119 50120 50117 50122 50123 50124 50121 50126 50127 50128 50125 50130 50131 50132 50129 50134 50135 50136 50133 50138 50139 50140 50137 50142 50143 50144 50141 50146 50147 50148 50145 50150 50151 50152 50149 50154 50155 50156 50153 50158 50159 50160 50157 50162 50163 50164 50161 50166 50167 50168 50165 50170 50171 50172 50169 50174 50175 50176 50173 50178 50179 50180 50177 50182 50183 50184 50181 50186 50187 50188 50185 50190 50191 50192 50189 50194 50195 50196 50193 50198 50199 50200 50197 50202 50203 50204 50201 50206 50207 50208 50205 50210 50211 50212 50209 50214 50215 50216 50213 50218 50219 50220 50217 50222 50223 50224 50221 50226 50227 50228 50225 50230 50231 50232 50229 50234 50235 50236 50233 50238 50239 50240 50237 50242 50243 50244 50241 50246 50247 50248 50245 50250 50251 50252 50249 50254 50255 50256 50253 50258 50259 50260 50257 50262 50263 50264 50261 50266 50267 50268 50265 50270 50271 50272 50269 50274 50275 50276 50273 50278 50279 50280 50277 50282 50283 50284 50281 50286 50287 50288 50285 50290 50291 50292 50289 50294 50295 50296 50293 50298 50299 50300 50297 50302 50303 50304 50301 50306 50307 50308 50305 50310 50311 50312 50309 50314 50315 50316 50313 50318 50319 50320 50317 50322 50323 50324 50321 50326 50327 50328 50325 50330 50331 50332 50329 50334 50335 50336 50333 50338 50339 50340 50337 50342 50343 50344 50341 50346 50347 50348 50345 50350 50351 50352 50349 50354 50355 50356 50353 50358 50359 50360 50357 50362 50363 50364 50361 50366 50367 50368 50365 50370 50371 50372 50369 50374 50375 50376 50373 50378 50379 50380 50377 50382 50383 50384 50381 50386 50387 50388 50385 50390 50391 50392 50389 50394 50395 50396 50393 50398 50399 50400 50397 50402 50403 50404 50401 50406 50407 50408 50405 50410 50411 50412 50409 50414 50415 50416 50413 50418 50419 50420 50417 50422 50423 50424 50421 50426 50427 50428 50425 50430 50431 50432 50429 50434 50435 50436 50433 50438 50439 50440 50437 50442 50443 50444 50441 50446 50447 50448 50445 50450 50451 50452 50449 50454 50455 50456 50453 50458 50459 50460 50457 50462 50463 50464 50461 50466 50467 50468 50465 50470 50471 50472 50469 50474 50475 50476 50473 50478 50479 50480 50477 50482 50483 50484 50481 50486 50487 50488 50485 50490 50491 50492 50489 50494 50495 50496 50493 50498 50499 50500 50497 50502 50503 50504 50501 50506 50507 50508 50505 50510 50511 50512 50509 50514 50515 50516 50513 50518 50519 50520 50517 50522 50523 50524 50521 50526 50527 50528 50525 50530 50531 50532 50529 50534 50535 50536 50533 50538 50539 50540 50537 50542 50543 50544 50541 50546 50547 50548 50545 50550 50551 50552 50549 50554 50555 50556 50553 50558 50559 50560 50557 50562 50563 50564 50561 50566 50567 50568 50565 50570 50571 50572 50569 50574 50575 50576 50573 50578 50579 50580 50577 50582 50583 50584 50581 50586 50587 50588 50585 50590 50591 50592 50589 50594 50595 50596 50593 50598 50599 50600 50597 50602 50603 50604 50601 50606 50607 50608 50605 50610 50611 50612 50609 50614 50615 50616 50613 50618 50619 50620 50617 50622 50623 50624 50621 50626 50627 50628 50625 50630 50631 50632 50629 50634 50635 50636 50633 50638 50639 50640 50637 50642 50643 50644 50641 50646 50647 50648 50645 50650 50651 50652 50649 50654 50655 50656 50653 50658 50659 50660 50657 50662 50663 50664 50661 50666 50667 50668 50665 50670 50671 50672 50669 50674 50675 50676 50673 50678 50679 50680 50677 50682 50683 50684 50681 50686 50687 50688 50685 50690 50691 50692 50689 50694 50695 50696 50693 50698 50699 50700 50697 50702 50703 50704 50701 50706 50707 50708 50705 50710 50711 50712 50709 50714 50715 50716 50713 50718 50719 50720 50717 50722 50723 50724 50721 50726 50727 50728 50725 50730 50731 50732 50729 50734 50735 50736 50733 50738 50739 50740 50737 50742 50743 50744 50741 50746 50747 50748 50745 50750 50751 50752 50749 50754 50755 50756 50753 50758 50759 50760 50757 50762 50763 50764 50761 50766 50767 50768 50765 50770 50771 50772 50769 50774 50775 50776 50773 50778 50779 50780 50777 50782 50783 50784 50781 50786 50787 50788 50785 50790 50791 50792 50789 50794 50795 50796 50793 50798 50799 50800 50797 50802 50803 50804 50801 50806 50807 50808 50805 50810 50811 50812 50809 50814 50815 50816 50813 50818 50819 50820 50817 50822 50823 50824 50821 50826 50827 50828 50825 50830 50831 50832 50829 50834 50835 50836 50833 50838 50839 50840 50837 50842 50843 50844 50841 50846 50847 50848 50845 50850 50851 50852 50849 50854 50855 50856 50853 50858 50859 50860 50857 50862 50863 50864 50861 50866 50867 50868 50865 50870 50871 50872 50869 50874 50875 50876 50873 50878 50879 50880 50877 50882 50883 50884 50881 50886 50887 50888 50885 50890 50891 50892 50889 50894 50895 50896 50893 50898 50899 50900 50897 50902 50903 50904 50901 50906 50907 50908 50905 50910 50911 50912 50909 50914 50915 50916 50913 50918 50919 50920 50917 50922 50923 50924 50921 50926 50927 50928 50925 50930 50931 50932 50929 50934 50935 50936 50933 50938 50939 50940 50937 50942 50943 50944 50941 50946 50947 50948 50945 50950 50951 50952 50949 50954 50955 50956 50953 50958 50959 50960 50957 50962 50963 50964 50961 50966 50967 50968 50965 50970 50971 50972 50969 50974 50975 50976 50973 50978 50979 50980 50977 50982 50983 50984 50981 50986 50987 50988 50985 50990 50991 50992 50989 50994 50995 50996 50993 50998 50999 51000 50997 51002 51003 51004 51001 51006 51007 51008 51005 51010 51011 51012 51009 51014 51015 51016 51013 51018 51019 51020 51017 51022 51023 51024 51021 51026 51027 51028 51025 51030 51031 51032 51029 51034 51035 51036 51033 51038 51039 51040 51037 51042 51043 51044 51041 51046 51047 51048 51045 51050 51051 51052 51049 51054 51055 51056 51053 51058 51059 51060 51057 51062 51063 51064 51061 51066 51067 51068 51065 51070 51071 51072 51069 51074 51075 51076 51073 51078 51079 51080 51077 51082 51083 51084 51081 51086 51087 51088 51085 51090 51091 51092 51089 51094 51095 51096 51093 51098 51099 51100 51097 51102 51103 51104 51101 51106 51107 51108 51105 51110 51111 51112 51109 51114 51115 51116 51113 51118 51119 51120 51117 51122 51123 51124 51121 51126 51127 51128 51125 51130 51131 51132 51129 51134 51135 51136 51133 51138 51139 51140 51137 51142 51143 51144 51141 51146 51147 51148 51145 51150 51151 51152 51149 51154 51155 51156 51153 51158 51159 51160 51157 51162 51163 51164 51161 51166 51167 51168 51165 51170 51171 51172 51169 51174 51175 51176 51173 51178 51179 51180 51177 51182 51183 51184 51181 51186 51187 51188 51185 51190 51191 51192 51189 51194 51195 51196 51193 51198 51199 51200 51197 51202 51203 51204 51201 51206 51207 51208 51205 51210 51211 51212 51209 51214 51215 51216 51213 51218 51219 51220 51217 51222 51223 51224 51221 51226 51227 51228 51225 51230 51231 51232 51229 51234 51235 51236 51233 51238 51239 51240 51237 51242 51243 51244 51241 51246 51247 51248 51245 51250 51251 51252 51249 51254 51255 51256 51253 51258 51259 51260 51257 51262 51263 51264 51261 51266 51267 51268 51265 51270 51271 51272 51269 51274 51275 51276 51273 51278 51279 51280 51277 51282 51283 51284 51281 51286 51287 51288 51285 51290 51291 51292 51289 51294 51295 51296 51293 51298 51299 51300 51297 51302 51303 51304 51301 51306 51307 51308 51305 51310 51311 51312 51309 51314 51315 51316 51313 51318 51319 51320 51317 51322 51323 51324 51321 51326 51327 51328 51325 51330 51331 51332 51329 51334 51335 51336 51333 51338 51339 51340 51337 51342 51343 51344 51341 51346 51347 51348 51345 51350 51351 51352 51349 51354 51355 51356 51353 51358 51359 51360 51357 51362 51363 51364 51361 51366 51367 51368 51365 51370 51371 51372 51369 51374 51375 51376 51373 51378 51379 51380 51377 51382 51383 51384 51381 51386 51387 51388 51385 51390 51391 51392 51389 51394 51395 51396 51393 51398 51399 51400 51397 51402 51403 51404 51401 51406 51407 51408 51405 51410 51411 51412 51409 51414 51415 51416 51413 51418 51419 51420 51417 51422 51423 51424 51421 51426 51427 51428 51425 51430 51431 51432 51429 51434 51435 51436 51433 51438 51439 51440 51437 51442 51443 51444 51441 51446 51447 51448 51445 51450 51451 51452 51449 51454 51455 51456 51453 51458 51459 51460 51457 51462 51463 51464 51461 51466 51467 51468 51465 51470 51471 51472 51469 51474 51475 51476 51473 51478 51479 51480 51477 51482 51483 51484 51481 51486 51487 51488 51485 51490 51491 51492 51489 51494 51495 51496 51493 51498 51499 51500 51497 51502 51503 51504 51501 51506 51507 51508 51505 51510 51511 51512 51509 51514 51515 51516 51513 51518 51519 51520 51517 51522 51523 51524 51521 51526 51527 51528 51525 51530 51531 51532 51529 51534 51535 51536 51533 51538 51539 51540 51537 51542 51543 51544 51541 51546 51547 51548 51545 51550 51551 51552 51549 51554 51555 51556 51553 51558 51559 51560 51557 51562 51563 51564 51561 51566 51567 51568 51565 51570 51571 51572 51569 51574 51575 51576 51573 51578 51579 51580 51577 51582 51583 51584 51581 51586 51587 51588 51585 51590 51591 51592 51589 51594 51595 51596 51593 51598 51599 51600 51597 51602 51603 51604 51601 51606 51607 51608 51605 51610 51611 51612 51609 51614 51615 51616 51613 51618 51619 51620 51617 51622 51623 51624 51621 51626 51627 51628 51625 51630 51631 51632 51629 51634 51635 51636 51633 51638 51639 51640 51637 51642 51643 51644 51641 51646 51647 51648 51645 51650 51651 51652 51649 51654 51655 51656 51653 51658 51659 51660 51657 51662 51663 51664 51661 51666 51667 51668 51665 51670 51671 51672 51669 51674 51675 51676 51673 51678 51679 51680 51677 51682 51683 51684 51681 51686 51687 51688 51685 51690 51691 51692 51689 51694 51695 51696 51693 51698 51699 51700 51697 51702 51703 51704 51701 51706 51707 51708 51705 51710 51711 51712 51709 51714 51715 51716 51713 51718 51719 51720 51717 51722 51723 51724 51721 51726 51727 51728 51725 51730 51731 51732 51729 51734 51735 51736 51733 51738 51739 51740 51737 51742 51743 51744 51741 51746 51747 51748 51745 51750 51751 51752 51749 51754 51755 51756 51753 51758 51759 51760 51757 51762 51763 51764 51761 51766 51767 51768 51765 51770 51771 51772 51769 51774 51775 51776 51773 51778 51779 51780 51777 51782 51783 51784 51781 51786 51787 51788 51785 51790 51791 51792 51789 51794 51795 51796 51793 51798 51799 51800 51797 51802 51803 51804 51801 51806 51807 51808 51805 51810 51811 51812 51809 51814 51815 51816 51813 51818 51819 51820 51817 51822 51823 51824 51821 51826 51827 51828 51825 51830 51831 51832 51829 51834 51835 51836 51833 51838 51839 51840 51837 51842 51843 51844 51841 51846 51847 51848 51845 51850 51851 51852 51849 51854 51855 51856 51853 51858 51859 51860 51857 51862 51863 51864 51861 51866 51867 51868 51865 51870 51871 51872 51869 51874 51875 51876 51873 51878 51879 51880 51877 51882 51883 51884 51881 51886 51887 51888 51885 51890 51891 51892 51889 51894 51895 51896 51893 51898 51899 51900 51897 51902 51903 51904 51901 51906 51907 51908 51905 51910 51911 51912 51909 51914 51915 51916 51913 51918 51919 51920 51917 51922 51923 51924 51921 51926 51927 51928 51925 51930 51931 51932 51929 51934 51935 51936 51933 51938 51939 51940 51937 51942 51943 51944 51941 51946 51947 51948 51945 51950 51951 51952 51949 51954 51955 51956 51953 51958 51959 51960 51957 51962 51963 51964 51961 51966 51967 51968 51965 51970 51971 51972 51969 51974 51975 51976 51973 51978 51979 51980 51977 51982 51983 51984 51981 51986 51987 51988 51985 51990 51991 51992 51989 51994 51995 51996 51993 51998 51999 52000 51997 52002 52003 52004 52001 52006 52007 52008 52005 52010 52011 52012 52009 52014 52015 52016 52013 52018 52019 52020 52017 52022 52023 52024 52021 52026 52027 52028 52025 52030 52031 52032 52029 52034 52035 52036 52033 52038 52039 52040 52037 52042 52043 52044 52041 52046 52047 52048 52045 52050 52051 52052 52049 52054 52055 52056 52053 52058 52059 52060 52057 52062 52063 52064 52061 52066 52067 52068 52065 52070 52071 52072 52069 52074 52075 52076 52073 52078 52079 52080 52077 52082 52083 52084 52081 52086 52087 52088 52085 52090 52091 52092 52089 52094 52095 52096 52093 52098 52099 52100 52097 52102 52103 52104 52101 52106 52107 52108 52105 52110 52111 52112 52109 52114 52115 52116 52113 52118 52119 52120 52117 52122 52123 52124 52121 52126 52127 52128 52125 52130 52131 52132 52129 52134 52135 52136 52133 52138 52139 52140 52137 52142 52143 52144 52141 52146 52147 52148 52145 52150 52151 52152 52149 52154 52155 52156 52153 52158 52159 52160 52157 52162 52163 52164 52161 52166 52167 52168 52165 52170 52171 52172 52169 52174 52175 52176 52173 52178 52179 52180 52177 52182 52183 52184 52181 52186 52187 52188 52185 52190 52191 52192 52189 52194 52195 52196 52193 52198 52199 52200 52197 52202 52203 52204 52201 52206 52207 52208 52205 52210 52211 52212 52209 52214 52215 52216 52213 52218 52219 52220 52217 52222 52223 52224 52221 52226 52227 52228 52225 52230 52231 52232 52229 52234 52235 52236 52233 52238 52239 52240 52237 52242 52243 52244 52241 52246 52247 52248 52245 52250 52251 52252 52249 52254 52255 52256 52253 52258 52259 52260 52257 52262 52263 52264 52261 52266 52267 52268 52265 52270 52271 52272 52269 52274 52275 52276 52273 52278 52279 52280 52277 52282 52283 52284 52281 52286 52287 52288 52285 52290 52291 52292 52289 52294 52295 52296 52293 52298 52299 52300 52297 52302 52303 52304 52301 52306 52307 52308 52305 52310 52311 52312 52309 52314 52315 52316 52313 52318 52319 52320 52317 52322 52323 52324 52321 52326 52327 52328 52325 52330 52331 52332 52329 52334 52335 52336 52333 52338 52339 52340 52337 52342 52343 52344 52341 52346 52347 52348 52345 52350 52351 52352 52349 52354 52355 52356 52353 52358 52359 52360 52357 52362 52363 52364 52361 52366 52367 52368 52365 52370 52371 52372 52369 52374 52375 52376 52373 52378 52379 52380 52377 52382 52383 52384 52381 52386 52387 52388 52385 52390 52391 52392 52389 52394 52395 52396 52393 52398 52399 52400 52397 52402 52403 52404 52401 52406 52407 52408 52405 52410 52411 52412 52409 52414 52415 52416 52413 52418 52419 52420 52417 52422 52423 52424 52421 52426 52427 52428 52425 52430 52431 52432 52429 52434 52435 52436 52433 52438 52439 52440 52437 52442 52443 52444 52441 52446 52447 52448 52445 52450 52451 52452 52449 52454 52455 52456 52453 52458 52459 52460 52457 52462 52463 52464 52461 52466 52467 52468 52465 52470 52471 52472 52469 52474 52475 52476 52473 52478 52479 52480 52477 52482 52483 52484 52481 52486 52487 52488 52485 52490 52491 52492 52489 52494 52495 52496 52493 52498 52499 52500 52497 52502 52503 52504 52501 52506 52507 52508 52505 52510 52511 52512 52509 52514 52515 52516 52513 52518 52519 52520 52517 52522 52523 52524 52521 52526 52527 52528 52525 52530 52531 52532 52529 52534 52535 52536 52533 52538 52539 52540 52537 52542 52543 52544 52541 52546 52547 52548 52545 52550 52551 52552 52549 52554 52555 52556 52553 52558 52559 52560 52557 52562 52563 52564 52561 52566 52567 52568 52565 52570 52571 52572 52569 52574 52575 52576 52573 52578 52579 52580 52577 52582 52583 52584 52581 52586 52587 52588 52585 52590 52591 52592 52589 52594 52595 52596 52593 52598 52599 52600 52597 52602 52603 52604 52601 52606 52607 52608 52605 52610 52611 52612 52609 52614 52615 52616 52613 52618 52619 52620 52617 52622 52623 52624 52621 52626 52627 52628 52625 52630 52631 52632 52629 52634 52635 52636 52633 52638 52639 52640 52637 52642 52643 52644 52641 52646 52647 52648 52645 52650 52651 52652 52649 52654 52655 52656 52653 52658 52659 52660 52657 52662 52663 52664 52661 52666 52667 52668 52665 52670 52671 52672 52669 52674 52675 52676 52673 52678 52679 52680 52677 52682 52683 52684 52681 52686 52687 52688 52685 52690 52691 52692 52689 52694 52695 52696 52693 52698 52699 52700 52697 52702 52703 52704 52701 52706 52707 52708 52705 52710 52711 52712 52709 52714 52715 52716 52713 52718 52719 52720 52717 52722 52723 52724 52721 52726 52727 52728 52725 52730 52731 52732 52729 52734 52735 52736 52733 52738 52739 52740 52737 52742 52743 52744 52741 52746 52747 52748 52745 52750 52751 52752 52749 52754 52755 52756 52753 52758 52759 52760 52757 52762 52763 52764 52761 52766 52767 52768 52765 52770 52771 52772 52769 52774 52775 52776 52773 52778 52779 52780 52777 52782 52783 52784 52781 52786 52787 52788 52785 52790 52791 52792 52789 52794 52795 52796 52793 52798 52799 52800 52797 52802 52803 52804 52801 52806 52807 52808 52805 52810 52811 52812 52809 52814 52815 52816 52813 52818 52819 52820 52817 52822 52823 52824 52821 52826 52827 52828 52825 52830 52831 52832 52829 52834 52835 52836 52833 52838 52839 52840 52837 52842 52843 52844 52841 52846 52847 52848 52845 52850 52851 52852 52849 52854 52855 52856 52853 52858 52859 52860 52857 52862 52863 52864 52861 52866 52867 52868 52865 52870 52871 52872 52869 52874 52875 52876 52873 52878 52879 52880 52877 52882 52883 52884 52881 52886 52887 52888 52885 52890 52891 52892 52889 52894 52895 52896 52893 52898 52899 52900 52897 52902 52903 52904 52901 52906 52907 52908 52905 52910 52911 52912 52909 52914 52915 52916 52913 52918 52919 52920 52917 52922 52923 52924 52921 52926 52927 52928 52925 52930 52931 52932 52929 52934 52935 52936 52933 52938 52939 52940 52937 52942 52943 52944 52941 52946 52947 52948 52945 52950 52951 52952 52949 52954 52955 52956 52953 52958 52959 52960 52957 52962 52963 52964 52961 52966 52967 52968 52965 52970 52971 52972 52969 52974 52975 52976 52973 52978 52979 52980 52977 52982 52983 52984 52981 52986 52987 52988 52985 52990 52991 52992 52989 52994 52995 52996 52993 52998 52999 53000 52997 53002 53003 53004 53001 53006 53007 53008 53005 53010 53011 53012 53009 53014 53015 53016 53013 53018 53019 53020 53017 53022 53023 53024 53021 53026 53027 53028 53025 53030 53031 53032 53029 53034 53035 53036 53033 53038 53039 53040 53037 53042 53043 53044 53041 53046 53047 53048 53045 53050 53051 53052 53049 53054 53055 53056 53053 53058 53059 53060 53057 53062 53063 53064 53061 53066 53067 53068 53065 53070 53071 53072 53069 53074 53075 53076 53073 53078 53079 53080 53077 53082 53083 53084 53081 53086 53087 53088 53085 53090 53091 53092 53089 53094 53095 53096 53093 53098 53099 53100 53097 53102 53103 53104 53101 53106 53107 53108 53105 53110 53111 53112 53109 53114 53115 53116 53113 53118 53119 53120 53117 53122 53123 53124 53121 53126 53127 53128 53125 53130 53131 53132 53129 53134 53135 53136 53133 53138 53139 53140 53137 53142 53143 53144 53141 53146 53147 53148 53145 53150 53151 53152 53149 53154 53155 53156 53153 53158 53159 53160 53157 53162 53163 53164 53161 53166 53167 53168 53165 53170 53171 53172 53169 53174 53175 53176 53173 53178 53179 53180 53177 53182 53183 53184 53181 53186 53187 53188 53185 53190 53191 53192 53189 53194 53195 53196 53193 53198 53199 53200 53197 53202 53203 53204 53201 53206 53207 53208 53205 53210 53211 53212 53209 53214 53215 53216 53213 53218 53219 53220 53217 53222 53223 53224 53221 53226 53227 53228 53225 53230 53231 53232 53229 53234 53235 53236 53233 53238 53239 53240 53237 53242 53243 53244 53241 53246 53247 53248 53245 53250 53251 53252 53249 53254 53255 53256 53253 53258 53259 53260 53257 53262 53263 53264 53261 53266 53267 53268 53265 53270 53271 53272 53269 53274 53275 53276 53273 53278 53279 53280 53277 53282 53283 53284 53281 53286 53287 53288 53285 53290 53291 53292 53289 53294 53295 53296 53293 53298 53299 53300 53297 53302 53303 53304 53301 53306 53307 53308 53305 53310 53311 53312 53309 53314 53315 53316 53313 53318 53319 53320 53317 53322 53323 53324 53321 53326 53327 53328 53325 53330 53331 53332 53329 53334 53335 53336 53333 53338 53339 53340 53337 53342 53343 53344 53341 53346 53347 53348 53345 53350 53351 53352 53349 53354 53355 53356 53353 53358 53359 53360 53357 53362 53363 53364 53361 53366 53367 53368 53365 53370 53371 53372 53369 53374 53375 53376 53373 53378 53379 53380 53377 53382 53383 53384 53381 53386 53387 53388 53385 53390 53391 53392 53389 53394 53395 53396 53393 53398 53399 53400 53397 53402 53403 53404 53401 53406 53407 53408 53405 53410 53411 53412 53409 53414 53415 53416 53413 53418 53419 53420 53417 53422 53423 53424 53421 53426 53427 53428 53425 53430 53431 53432 53429 53434 53435 53436 53433 53438 53439 53440 53437 53442 53443 53444 53441 53446 53447 53448 53445 53450 53451 53452 53449 53454 53455 53456 53453 53458 53459 53460 53457 53462 53463 53464 53461 53466 53467 53468 53465 53470 53471 53472 53469 53474 53475 53476 53473 53478 53479 53480 53477 53482 53483 53484 53481 53486 53487 53488 53485 53490 53491 53492 53489 53494 53495 53496 53493 53498 53499 53500 53497 53502 53503 53504 53501 53506 53507 53508 53505 53510 53511 53512 53509 53514 53515 53516 53513 53518 53519 53520 53517 53522 53523 53524 53521 53526 53527 53528 53525 53530 53531 53532 53529 53534 53535 53536 53533 53538 53539 53540 53537 53542 53543 53544 53541 53546 53547 53548 53545 53550 53551 53552 53549 53554 53555 53556 53553 53558 53559 53560 53557 53562 53563 53564 53561 53566 53567 53568 53565 53570 53571 53572 53569 53574 53575 53576 53573 53578 53579 53580 53577 53582 53583 53584 53581 53586 53587 53588 53585 53590 53591 53592 53589 53594 53595 53596 53593 53598 53599 53600 53597 53602 53603 53604 53601 53606 53607 53608 53605 53610 53611 53612 53609 53614 53615 53616 53613 53618 53619 53620 53617 53622 53623 53624 53621 53626 53627 53628 53625 53630 53631 53632 53629 53634 53635 53636 53633 53638 53639 53640 53637 53642 53643 53644 53641 53646 53647 53648 53645 53650 53651 53652 53649 53654 53655 53656 53653 53658 53659 53660 53657 53662 53663 53664 53661 53666 53667 53668 53665 53670 53671 53672 53669 53674 53675 53676 53673 53678 53679 53680 53677 53682 53683 53684 53681 53686 53687 53688 53685 53690 53691 53692 53689 53694 53695 53696 53693 53698 53699 53700 53697 53702 53703 53704 53701 53706 53707 53708 53705 53710 53711 53712 53709 53714 53715 53716 53713 53718 53719 53720 53717 53722 53723 53724 53721 53726 53727 53728 53725 53730 53731 53732 53729 53734 53735 53736 53733 53738 53739 53740 53737 53742 53743 53744 53741 53746 53747 53748 53745 53750 53751 53752 53749 53754 53755 53756 53753 53758 53759 53760 53757 53762 53763 53764 53761 53766 53767 53768 53765 53770 53771 53772 53769 53774 53775 53776 53773 53778 53779 53780 53777 53782 53783 53784 53781 53786 53787 53788 53785 53790 53791 53792 53789 53794 53795 53796 53793 53798 53799 53800 53797 53802 53803 53804 53801 53806 53807 53808 53805 53810 53811 53812 53809 53814 53815 53816 53813 53818 53819 53820 53817 53822 53823 53824 53821 53826 53827 53828 53825 53830 53831 53832 53829 53834 53835 53836 53833 53838 53839 53840 53837 53842 53843 53844 53841 53846 53847 53848 53845 53850 53851 53852 53849 53854 53855 53856 53853 53858 53859 53860 53857 53862 53863 53864 53861 53866 53867 53868 53865 53870 53871 53872 53869 53874 53875 53876 53873 53878 53879 53880 53877 53882 53883 53884 53881 53886 53887 53888 53885 53890 53891 53892 53889 53894 53895 53896 53893 53898 53899 53900 53897 53902 53903 53904 53901 53906 53907 53908 53905 53910 53911 53912 53909 53914 53915 53916 53913 53918 53919 53920 53917 53922 53923 53924 53921 53926 53927 53928 53925 53930 53931 53932 53929 53934 53935 53936 53933 53938 53939 53940 53937 53942 53943 53944 53941 53946 53947 53948 53945 53950 53951 53952 53949 53954 53955 53956 53953 53958 53959 53960 53957 53962 53963 53964 53961 53966 53967 53968 53965 53970 53971 53972 53969 53974 53975 53976 53973 53978 53979 53980 53977 53982 53983 53984 53981 53986 53987 53988 53985 53990 53991 53992 53989 53994 53995 53996 53993 53998 53999 54000 53997 54002 54003 54004 54001 54006 54007 54008 54005 54010 54011 54012 54009 54014 54015 54016 54013 54018 54019 54020 54017 54022 54023 54024 54021 54026 54027 54028 54025 54030 54031 54032 54029 54034 54035 54036 54033 54038 54039 54040 54037 54042 54043 54044 54041 54046 54047 54048 54045 54050 54051 54052 54049 54054 54055 54056 54053 54058 54059 54060 54057 54062 54063 54064 54061 54066 54067 54068 54065 54070 54071 54072 54069 54074 54075 54076 54073 54078 54079 54080 54077 54082 54083 54084 54081 54086 54087 54088 54085 54090 54091 54092 54089 54094 54095 54096 54093 54098 54099 54100 54097 54102 54103 54104 54101 54106 54107 54108 54105 54110 54111 54112 54109 54114 54115 54116 54113 54118 54119 54120 54117 54122 54123 54124 54121 54126 54127 54128 54125 54130 54131 54132 54129 54134 54135 54136 54133 54138 54139 54140 54137 54142 54143 54144 54141 54146 54147 54148 54145 54150 54151 54152 54149 54154 54155 54156 54153 54158 54159 54160 54157 54162 54163 54164 54161 54166 54167 54168 54165 54170 54171 54172 54169 54174 54175 54176 54173 54178 54179 54180 54177 54182 54183 54184 54181 54186 54187 54188 54185 54190 54191 54192 54189 54194 54195 54196 54193 54198 54199 54200 54197 54202 54203 54204 54201 54206 54207 54208 54205 54210 54211 54212 54209 54214 54215 54216 54213 54218 54219 54220 54217 54222 54223 54224 54221 54226 54227 54228 54225 54230 54231 54232 54229 54234 54235 54236 54233 54238 54239 54240 54237 54242 54243 54244 54241 54246 54247 54248 54245 54250 54251 54252 54249 54254 54255 54256 54253 54258 54259 54260 54257 54262 54263 54264 54261 54266 54267 54268 54265 54270 54271 54272 54269 54274 54275 54276 54273 54278 54279 54280 54277 54282 54283 54284 54281 54286 54287 54288 54285 54290 54291 54292 54289 54294 54295 54296 54293 54298 54299 54300 54297 54302 54303 54304 54301 54306 54307 54308 54305 54310 54311 54312 54309 54314 54315 54316 54313 54318 54319 54320 54317 54322 54323 54324 54321 54326 54327 54328 54325 54330 54331 54332 54329 54334 54335 54336 54333 54338 54339 54340 54337 54342 54343 54344 54341 54346 54347 54348 54345 54350 54351 54352 54349 54354 54355 54356 54353 54358 54359 54360 54357 54362 54363 54364 54361 54366 54367 54368 54365 54370 54371 54372 54369 54374 54375 54376 54373 54378 54379 54380 54377 54382 54383 54384 54381 54386 54387 54388 54385 54390 54391 54392 54389 54394 54395 54396 54393 54398 54399 54400 54397 54402 54403 54404 54401 54406 54407 54408 54405 54410 54411 54412 54409 54414 54415 54416 54413 54418 54419 54420 54417 54422 54423 54424 54421 54426 54427 54428 54425 54430 54431 54432 54429 54434 54435 54436 54433 54438 54439 54440 54437 54442 54443 54444 54441 54446 54447 54448 54445 54450 54451 54452 54449 54454 54455 54456 54453 54458 54459 54460 54457 54462 54463 54464 54461 54466 54467 54468 54465 54470 54471 54472 54469 54474 54475 54476 54473 54478 54479 54480 54477 54482 54483 54484 54481 54486 54487 54488 54485 54490 54491 54492 54489 54494 54495 54496 54493 54498 54499 54500 54497 54502 54503 54504 54501 54506 54507 54508 54505 54510 54511 54512 54509 54514 54515 54516 54513 54518 54519 54520 54517 54522 54523 54524 54521 54526 54527 54528 54525 54530 54531 54532 54529 54534 54535 54536 54533 54538 54539 54540 54537 54542 54543 54544 54541 54546 54547 54548 54545 54550 54551 54552 54549 54554 54555 54556 54553 54558 54559 54560 54557 54562 54563 54564 54561 54566 54567 54568 54565 54570 54571 54572 54569 54574 54575 54576 54573 54578 54579 54580 54577 54582 54583 54584 54581 54586 54587 54588 54585 54590 54591 54592 54589 54594 54595 54596 54593 54598 54599 54600 54597 54602 54603 54604 54601 54606 54607 54608 54605 54610 54611 54612 54609 54614 54615 54616 54613 54618 54619 54620 54617 54622 54623 54624 54621 54626 54627 54628 54625 54630 54631 54632 54629 54634 54635 54636 54633 54638 54639 54640 54637 54642 54643 54644 54641 54646 54647 54648 54645 54650 54651 54652 54649 54654 54655 54656 54653 54658 54659 54660 54657 54662 54663 54664 54661 54666 54667 54668 54665 54670 54671 54672 54669 54674 54675 54676 54673 54678 54679 54680 54677 54682 54683 54684 54681 54686 54687 54688 54685 54690 54691 54692 54689 54694 54695 54696 54693 54698 54699 54700 54697 54702 54703 54704 54701 54706 54707 54708 54705 54710 54711 54712 54709 54714 54715 54716 54713 54718 54719 54720 54717 54722 54723 54724 54721 54726 54727 54728 54725 54730 54731 54732 54729 54734 54735 54736 54733 54738 54739 54740 54737 54742 54743 54744 54741 54746 54747 54748 54745 54750 54751 54752 54749 54754 54755 54756 54753 54758 54759 54760 54757 54762 54763 54764 54761 54766 54767 54768 54765 54770 54771 54772 54769 54774 54775 54776 54773 54778 54779 54780 54777 54782 54783 54784 54781 54786 54787 54788 54785 54790 54791 54792 54789 54794 54795 54796 54793 54798 54799 54800 54797 54802 54803 54804 54801 54806 54807 54808 54805 54810 54811 54812 54809 54814 54815 54816 54813 54818 54819 54820 54817 54822 54823 54824 54821 54826 54827 54828 54825 54830 54831 54832 54829 54834 54835 54836 54833 54838 54839 54840 54837 54842 54843 54844 54841 54846 54847 54848 54845 54850 54851 54852 54849 54854 54855 54856 54853 54858 54859 54860 54857 54862 54863 54864 54861 54866 54867 54868 54865 54870 54871 54872 54869 54874 54875 54876 54873 54878 54879 54880 54877 54882 54883 54884 54881 54886 54887 54888 54885 54890 54891 54892 54889 54894 54895 54896 54893 54898 54899 54900 54897 54902 54903 54904 54901 54906 54907 54908 54905 54910 54911 54912 54909 54914 54915 54916 54913 54918 54919 54920 54917 54922 54923 54924 54921 54926 54927 54928 54925 54930 54931 54932 54929 54934 54935 54936 54933 54938 54939 54940 54937 54942 54943 54944 54941 54946 54947 54948 54945 54950 54951 54952 54949 54954 54955 54956 54953 54958 54959 54960 54957 54962 54963 54964 54961 54966 54967 54968 54965 54970 54971 54972 54969 54974 54975 54976 54973 54978 54979 54980 54977 54982 54983 54984 54981 54986 54987 54988 54985 54990 54991 54992 54989 54994 54995 54996 54993 54998 54999 55000 54997 55002 55003 55004 55001 55006 55007 55008 55005 55010 55011 55012 55009 55014 55015 55016 55013 55018 55019 55020 55017 55022 55023 55024 55021 55026 55027 55028 55025 55030 55031 55032 55029 55034 55035 55036 55033 55038 55039 55040 55037 55042 55043 55044 55041 55046 55047 55048 55045 55050 55051 55052 55049 55054 55055 55056 55053 55058 55059 55060 55057 55062 55063 55064 55061 55066 55067 55068 55065 55070 55071 55072 55069 55074 55075 55076 55073 55078 55079 55080 55077 55082 55083 55084 55081 55086 55087 55088 55085 55090 55091 55092 55089 55094 55095 55096 55093 55098 55099 55100 55097 55102 55103 55104 55101 55106 55107 55108 55105 55110 55111 55112 55109 55114 55115 55116 55113 55118 55119 55120 55117 55122 55123 55124 55121 55126 55127 55128 55125 55130 55131 55132 55129 55134 55135 55136 55133 55138 55139 55140 55137 55142 55143 55144 55141 55146 55147 55148 55145 55150 55151 55152 55149 55154 55155 55156 55153 55158 55159 55160 55157 55162 55163 55164 55161 55166 55167 55168 55165 55170 55171 55172 55169 55174 55175 55176 55173 55178 55179 55180 55177 55182 55183 55184 55181 55186 55187 55188 55185 55190 55191 55192 55189 55194 55195 55196 55193 55198 55199 55200 55197 55202 55203 55204 55201 55206 55207 55208 55205 55210 55211 55212 55209 55214 55215 55216 55213 55218 55219 55220 55217 55222 55223 55224 55221 55226 55227 55228 55225 55230 55231 55232 55229 55234 55235 55236 55233 55238 55239 55240 55237 55242 55243 55244 55241 55246 55247 55248 55245 55250 55251 55252 55249 55254 55255 55256 55253 55258 55259 55260 55257 55262 55263 55264 55261 55266 55267 55268 55265 55270 55271 55272 55269 55274 55275 55276 55273 55278 55279 55280 55277 55282 55283 55284 55281 55286 55287 55288 55285 55290 55291 55292 55289 55294 55295 55296 55293 55298 55299 55300 55297 55302 55303 55304 55301 55306 55307 55308 55305 55310 55311 55312 55309 55314 55315 55316 55313 55318 55319 55320 55317 55322 55323 55324 55321 55326 55327 55328 55325 55330 55331 55332 55329 55334 55335 55336 55333 55338 55339 55340 55337 55342 55343 55344 55341 55346 55347 55348 55345 55350 55351 55352 55349 55354 55355 55356 55353 55358 55359 55360 55357 55362 55363 55364 55361 55366 55367 55368 55365 55370 55371 55372 55369 55374 55375 55376 55373 55378 55379 55380 55377 55382 55383 55384 55381 55386 55387 55388 55385 55390 55391 55392 55389 55394 55395 55396 55393 55398 55399 55400 55397 55402 55403 55404 55401 55406 55407 55408 55405 55410 55411 55412 55409 55414 55415 55416 55413 55418 55419 55420 55417 55422 55423 55424 55421 55426 55427 55428 55425 55430 55431 55432 55429 55434 55435 55436 55433 55438 55439 55440 55437 55442 55443 55444 55441 55446 55447 55448 55445 55450 55451 55452 55449 55454 55455 55456 55453 55458 55459 55460 55457 55462 55463 55464 55461 55466 55467 55468 55465 55470 55471 55472 55469 55474 55475 55476 55473 55478 55479 55480 55477 55482 55483 55484 55481 55486 55487 55488 55485 55490 55491 55492 55489 55494 55495 55496 55493 55498 55499 55500 55497 55502 55503 55504 55501 55506 55507 55508 55505 55510 55511 55512 55509 55514 55515 55516 55513 55518 55519 55520 55517 55522 55523 55524 55521 55526 55527 55528 55525 55530 55531 55532 55529 55534 55535 55536 55533 55538 55539 55540 55537 55542 55543 55544 55541 55546 55547 55548 55545 55550 55551 55552 55549 55554 55555 55556 55553 55558 55559 55560 55557 55562 55563 55564 55561 55566 55567 55568 55565 55570 55571 55572 55569 55574 55575 55576 55573 55578 55579 55580 55577 55582 55583 55584 55581 55586 55587 55588 55585 55590 55591 55592 55589 55594 55595 55596 55593 55598 55599 55600 55597 55602 55603 55604 55601 55606 55607 55608 55605 55610 55611 55612 55609 55614 55615 55616 55613 55618 55619 55620 55617 55622 55623 55624 55621 55626 55627 55628 55625 55630 55631 55632 55629 55634 55635 55636 55633 55638 55639 55640 55637 55642 55643 55644 55641 55646 55647 55648 55645 55650 55651 55652 55649 55654 55655 55656 55653 55658 55659 55660 55657 55662 55663 55664 55661 55666 55667 55668 55665 55670 55671 55672 55669 55674 55675 55676 55673 55678 55679 55680 55677 55682 55683 55684 55681 55686 55687 55688 55685 55690 55691 55692 55689 55694 55695 55696 55693 55698 55699 55700 55697 55702 55703 55704 55701 55706 55707 55708 55705 55710 55711 55712 55709 55714 55715 55716 55713 55718 55719 55720 55717 55722 55723 55724 55721 55726 55727 55728 55725 55730 55731 55732 55729 55734 55735 55736 55733 55738 55739 55740 55737 55742 55743 55744 55741 55746 55747 55748 55745 55750 55751 55752 55749 55754 55755 55756 55753 55758 55759 55760 55757 55762 55763 55764 55761 55766 55767 55768 55765 55770 55771 55772 55769 55774 55775 55776 55773 55778 55779 55780 55777 55782 55783 55784 55781 55786 55787 55788 55785 55790 55791 55792 55789 55794 55795 55796 55793 55798 55799 55800 55797 55802 55803 55804 55801 55806 55807 55808 55805 55810 55811 55812 55809 55814 55815 55816 55813 55818 55819 55820 55817 55822 55823 55824 55821 55826 55827 55828 55825 55830 55831 55832 55829 55834 55835 55836 55833 55838 55839 55840 55837 55842 55843 55844 55841 55846 55847 55848 55845 55850 55851 55852 55849 55854 55855 55856 55853 55858 55859 55860 55857 55862 55863 55864 55861 55866 55867 55868 55865 55870 55871 55872 55869 55874 55875 55876 55873 55878 55879 55880 55877 55882 55883 55884 55881 55886 55887 55888 55885 55890 55891 55892 55889 55894 55895 55896 55893 55898 55899 55900 55897 55902 55903 55904 55901 55906 55907 55908 55905 55910 55911 55912 55909 55914 55915 55916 55913 55918 55919 55920 55917 55922 55923 55924 55921 55926 55927 55928 55925 55930 55931 55932 55929 55934 55935 55936 55933 55938 55939 55940 55937 55942 55943 55944 55941 55946 55947 55948 55945 55950 55951 55952 55949 55954 55955 55956 55953 55958 55959 55960 55957 55962 55963 55964 55961 55966 55967 55968 55965 55970 55971 55972 55969 55974 55975 55976 55973 55978 55979 55980 55977 55982 55983 55984 55981 55986 55987 55988 55985 55990 55991 55992 55989 55994 55995 55996 55993 55998 55999 56000 55997 56002 56003 56004 56001 56006 56007 56008 56005 56010 56011 56012 56009 56014 56015 56016 56013 56018 56019 56020 56017 56022 56023 56024 56021 56026 56027 56028 56025 56030 56031 56032 56029 56034 56035 56036 56033 56038 56039 56040 56037 56042 56043 56044 56041 56046 56047 56048 56045 56050 56051 56052 56049 56054 56055 56056 56053 56058 56059 56060 56057 56062 56063 56064 56061 56066 56067 56068 56065 56070 56071 56072 56069 56074 56075 56076 56073 56078 56079 56080 56077 56082 56083 56084 56081 56086 56087 56088 56085 56090 56091 56092 56089 56094 56095 56096 56093 56098 56099 56100 56097 56102 56103 56104 56101 56106 56107 56108 56105 56110 56111 56112 56109 56114 56115 56116 56113 56118 56119 56120 56117 56122 56123 56124 56121 56126 56127 56128 56125 56130 56131 56132 56129 56134 56135 56136 56133 56138 56139 56140 56137 56142 56143 56144 56141 56146 56147 56148 56145 56150 56151 56152 56149 56154 56155 56156 56153 56158 56159 56160 56157 56162 56163 56164 56161 56166 56167 56168 56165 56170 56171 56172 56169 56174 56175 56176 56173 56178 56179 56180 56177 56182 56183 56184 56181 56186 56187 56188 56185 56190 56191 56192 56189 56194 56195 56196 56193 56198 56199 56200 56197 56202 56203 56204 56201 56206 56207 56208 56205 56210 56211 56212 56209 56214 56215 56216 56213 56218 56219 56220 56217 56222 56223 56224 56221 56226 56227 56228 56225 56230 56231 56232 56229 56234 56235 56236 56233 56238 56239 56240 56237 56242 56243 56244 56241 56246 56247 56248 56245 56250 56251 56252 56249 56254 56255 56256 56253 56258 56259 56260 56257 56262 56263 56264 56261 56266 56267 56268 56265 56270 56271 56272 56269 56274 56275 56276 56273 56278 56279 56280 56277 56282 56283 56284 56281 56286 56287 56288 56285 56290 56291 56292 56289 56294 56295 56296 56293 56298 56299 56300 56297 56302 56303 56304 56301 56306 56307 56308 56305 56310 56311 56312 56309 56314 56315 56316 56313 56318 56319 56320 56317 56322 56323 56324 56321 56326 56327 56328 56325 56330 56331 56332 56329 56334 56335 56336 56333 56338 56339 56340 56337 56342 56343 56344 56341 56346 56347 56348 56345 56350 56351 56352 56349 56354 56355 56356 56353 56358 56359 56360 56357 56362 56363 56364 56361 56366 56367 56368 56365 56370 56371 56372 56369 56374 56375 56376 56373 56378 56379 56380 56377 56382 56383 56384 56381 56386 56387 56388 56385 56390 56391 56392 56389 56394 56395 56396 56393 56398 56399 56400 56397 56402 56403 56404 56401 56406 56407 56408 56405 56410 56411 56412 56409 56414 56415 56416 56413 56418 56419 56420 56417 56422 56423 56424 56421 56426 56427 56428 56425 56430 56431 56432 56429 56434 56435 56436 56433 56438 56439 56440 56437 56442 56443 56444 56441 56446 56447 56448 56445 56450 56451 56452 56449 56454 56455 56456 56453 56458 56459 56460 56457 56462 56463 56464 56461 56466 56467 56468 56465 56470 56471 56472 56469 56474 56475 56476 56473 56478 56479 56480 56477 56482 56483 56484 56481 56486 56487 56488 56485 56490 56491 56492 56489 56494 56495 56496 56493 56498 56499 56500 56497 56502 56503 56504 56501 56506 56507 56508 56505 56510 56511 56512 56509 56514 56515 56516 56513 56518 56519 56520 56517 56522 56523 56524 56521 56526 56527 56528 56525 56530 56531 56532 56529 56534 56535 56536 56533 56538 56539 56540 56537 56542 56543 56544 56541 56546 56547 56548 56545 56550 56551 56552 56549 56554 56555 56556 56553 56558 56559 56560 56557 56562 56563 56564 56561 56566 56567 56568 56565 56570 56571 56572 56569 56574 56575 56576 56573 56578 56579 56580 56577 56582 56583 56584 56581 56586 56587 56588 56585 56590 56591 56592 56589 56594 56595 56596 56593 56598 56599 56600 56597 56602 56603 56604 56601 56606 56607 56608 56605 56610 56611 56612 56609 56614 56615 56616 56613 56618 56619 56620 56617 56622 56623 56624 56621 56626 56627 56628 56625 56630 56631 56632 56629 56634 56635 56636 56633 56638 56639 56640 56637 56642 56643 56644 56641 56646 56647 56648 56645 56650 56651 56652 56649 56654 56655 56656 56653 56658 56659 56660 56657 56662 56663 56664 56661 56666 56667 56668 56665 56670 56671 56672 56669 56674 56675 56676 56673 56678 56679 56680 56677 56682 56683 56684 56681 56686 56687 56688 56685 56690 56691 56692 56689 56694 56695 56696 56693 56698 56699 56700 56697 56702 56703 56704 56701 56706 56707 56708 56705 56710 56711 56712 56709 56714 56715 56716 56713 56718 56719 56720 56717 56722 56723 56724 56721 56726 56727 56728 56725 56730 56731 56732 56729 56734 56735 56736 56733 56738 56739 56740 56737 56742 56743 56744 56741 56746 56747 56748 56745 56750 56751 56752 56749 56754 56755 56756 56753 56758 56759 56760 56757 56762 56763 56764 56761 56766 56767 56768 56765 56770 56771 56772 56769 56774 56775 56776 56773 56778 56779 56780 56777 56782 56783 56784 56781 56786 56787 56788 56785 56790 56791 56792 56789 56794 56795 56796 56793 56798 56799 56800 56797 56802 56803 56804 56801 56806 56807 56808 56805 56810 56811 56812 56809 56814 56815 56816 56813 56818 56819 56820 56817 56822 56823 56824 56821 56826 56827 56828 56825 56830 56831 56832 56829 56834 56835 56836 56833 56838 56839 56840 56837 56842 56843 56844 56841 56846 56847 56848 56845 56850 56851 56852 56849 56854 56855 56856 56853 56858 56859 56860 56857 56862 56863 56864 56861 56866 56867 56868 56865 56870 56871 56872 56869 56874 56875 56876 56873 56878 56879 56880 56877 56882 56883 56884 56881 56886 56887 56888 56885 56890 56891 56892 56889 56894 56895 56896 56893 56898 56899 56900 56897 56902 56903 56904 56901 56906 56907 56908 56905 56910 56911 56912 56909 56914 56915 56916 56913 56918 56919 56920 56917 56922 56923 56924 56921 56926 56927 56928 56925 56930 56931 56932 56929 56934 56935 56936 56933 56938 56939 56940 56937 56942 56943 56944 56941 56946 56947 56948 56945 56950 56951 56952 56949 56954 56955 56956 56953 56958 56959 56960 56957 56962 56963 56964 56961 56966 56967 56968 56965 56970 56971 56972 56969 56974 56975 56976 56973 56978 56979 56980 56977 56982 56983 56984 56981 56986 56987 56988 56985 56990 56991 56992 56989 56994 56995 56996 56993 56998 56999 57000 56997 57002 57003 57004 57001 57006 57007 57008 57005 57010 57011 57012 57009 57014 57015 57016 57013 57018 57019 57020 57017 57022 57023 57024 57021 57026 57027 57028 57025 57030 57031 57032 57029 57034 57035 57036 57033 57038 57039 57040 57037 57042 57043 57044 57041 57046 57047 57048 57045 57050 57051 57052 57049 57054 57055 57056 57053 57058 57059 57060 57057 57062 57063 57064 57061 57066 57067 57068 57065 57070 57071 57072 57069 57074 57075 57076 57073 57078 57079 57080 57077 57082 57083 57084 57081 57086 57087 57088 57085 57090 57091 57092 57089 57094 57095 57096 57093 57098 57099 57100 57097 57102 57103 57104 57101 57106 57107 57108 57105 57110 57111 57112 57109 57114 57115 57116 57113 57118 57119 57120 57117 57122 57123 57124 57121 57126 57127 57128 57125 57130 57131 57132 57129 57134 57135 57136 57133 57138 57139 57140 57137 57142 57143 57144 57141 57146 57147 57148 57145 57150 57151 57152 57149 57154 57155 57156 57153 57158 57159 57160 57157 57162 57163 57164 57161 57166 57167 57168 57165 57170 57171 57172 57169 57174 57175 57176 57173 57178 57179 57180 57177 57182 57183 57184 57181 57186 57187 57188 57185 57190 57191 57192 57189 57194 57195 57196 57193 57198 57199 57200 57197 57202 57203 57204 57201 57206 57207 57208 57205 57210 57211 57212 57209 57214 57215 57216 57213 57218 57219 57220 57217 57222 57223 57224 57221 57226 57227 57228 57225 57230 57231 57232 57229 57234 57235 57236 57233 57238 57239 57240 57237 57242 57243 57244 57241 57246 57247 57248 57245 57250 57251 57252 57249 57254 57255 57256 57253 57258 57259 57260 57257 57262 57263 57264 57261 57266 57267 57268 57265 57270 57271 57272 57269 57274 57275 57276 57273 57278 57279 57280 57277 57282 57283 57284 57281 57286 57287 57288 57285 57290 57291 57292 57289 57294 57295 57296 57293 57298 57299 57300 57297 57302 57303 57304 57301 57306 57307 57308 57305 57310 57311 57312 57309 57314 57315 57316 57313 57318 57319 57320 57317 57322 57323 57324 57321 57326 57327 57328 57325 57330 57331 57332 57329 57334 57335 57336 57333 57338 57339 57340 57337 57342 57343 57344 57341 57346 57347 57348 57345 57350 57351 57352 57349 57354 57355 57356 57353 57358 57359 57360 57357 57362 57363 57364 57361 57366 57367 57368 57365 57370 57371 57372 57369 57374 57375 57376 57373 57378 57379 57380 57377 57382 57383 57384 57381 57386 57387 57388 57385 57390 57391 57392 57389 57394 57395 57396 57393 57398 57399 57400 57397 57402 57403 57404 57401 57406 57407 57408 57405 57410 57411 57412 57409 57414 57415 57416 57413 57418 57419 57420 57417 57422 57423 57424 57421 57426 57427 57428 57425 57430 57431 57432 57429 57434 57435 57436 57433 57438 57439 57440 57437 57442 57443 57444 57441 57446 57447 57448 57445 57450 57451 57452 57449 57454 57455 57456 57453 57458 57459 57460 57457 57462 57463 57464 57461 57466 57467 57468 57465 57470 57471 57472 57469 57474 57475 57476 57473 57478 57479 57480 57477 57482 57483 57484 57481 57486 57487 57488 57485 57490 57491 57492 57489 57494 57495 57496 57493 57498 57499 57500 57497 57502 57503 57504 57501 57506 57507 57508 57505 57510 57511 57512 57509 57514 57515 57516 57513 57518 57519 57520 57517 57522 57523 57524 57521 57526 57527 57528 57525 57530 57531 57532 57529 57534 57535 57536 57533 57538 57539 57540 57537 57542 57543 57544 57541 57546 57547 57548 57545 57550 57551 57552 57549 57554 57555 57556 57553 57558 57559 57560 57557 57562 57563 57564 57561 57566 57567 57568 57565 57570 57571 57572 57569 57574 57575 57576 57573 57578 57579 57580 57577 57582 57583 57584 57581 57586 57587 57588 57585 57590 57591 57592 57589 57594 57595 57596 57593 57598 57599 57600 57597 57602 57603 57604 57601 57606 57607 57608 57605 57610 57611 57612 57609 57614 57615 57616 57613 57618 57619 57620 57617 57622 57623 57624 57621 57626 57627 57628 57625 57630 57631 57632 57629 57634 57635 57636 57633 57638 57639 57640 57637 57642 57643 57644 57641 57646 57647 57648 57645 57650 57651 57652 57649 57654 57655 57656 57653 57658 57659 57660 57657 57662 57663 57664 57661 57666 57667 57668 57665 57670 57671 57672 57669 57674 57675 57676 57673 57678 57679 57680 57677 57682 57683 57684 57681 57686 57687 57688 57685 57690 57691 57692 57689 57694 57695 57696 57693 57698 57699 57700 57697 57702 57703 57704 57701 57706 57707 57708 57705 57710 57711 57712 57709 57714 57715 57716 57713 57718 57719 57720 57717 57722 57723 57724 57721 57726 57727 57728 57725 57730 57731 57732 57729 57734 57735 57736 57733 57738 57739 57740 57737 57742 57743 57744 57741 57746 57747 57748 57745 57750 57751 57752 57749 57754 57755 57756 57753 57758 57759 57760 57757 57762 57763 57764 57761 57766 57767 57768 57765 57770 57771 57772 57769 57774 57775 57776 57773 57778 57779 57780 57777 57782 57783 57784 57781 57786 57787 57788 57785 57790 57791 57792 57789 57794 57795 57796 57793 57798 57799 57800 57797 57802 57803 57804 57801 57806 57807 57808 57805 57810 57811 57812 57809 57814 57815 57816 57813 57818 57819 57820 57817 57822 57823 57824 57821 57826 57827 57828 57825 57830 57831 57832 57829 57834 57835 57836 57833 57838 57839 57840 57837 57842 57843 57844 57841 57846 57847 57848 57845 57850 57851 57852 57849 57854 57855 57856 57853 57858 57859 57860 57857 57862 57863 57864 57861 57866 57867 57868 57865 57870 57871 57872 57869 57874 57875 57876 57873 57878 57879 57880 57877 57882 57883 57884 57881 57886 57887 57888 57885 57890 57891 57892 57889 57894 57895 57896 57893 57898 57899 57900 57897 57902 57903 57904 57901 57906 57907 57908 57905 57910 57911 57912 57909 57914 57915 57916 57913 57918 57919 57920 57917 57922 57923 57924 57921 57926 57927 57928 57925 57930 57931 57932 57929 57934 57935 57936 57933 57938 57939 57940 57937 57942 57943 57944 57941 57946 57947 57948 57945 57950 57951 57952 57949 57954 57955 57956 57953 57958 57959 57960 57957 57962 57963 57964 57961 57966 57967 57968 57965 57970 57971 57972 57969 57974 57975 57976 57973 57978 57979 57980 57977 57982 57983 57984 57981 57986 57987 57988 57985 57990 57991 57992 57989 57994 57995 57996 57993 57998 57999 58000 57997 58002 58003 58004 58001 58006 58007 58008 58005 58010 58011 58012 58009 58014 58015 58016 58013 58018 58019 58020 58017 58022 58023 58024 58021 58026 58027 58028 58025 58030 58031 58032 58029 58034 58035 58036 58033 58038 58039 58040 58037 58042 58043 58044 58041 58046 58047 58048 58045 58050 58051 58052 58049 58054 58055 58056 58053 58058 58059 58060 58057 58062 58063 58064 58061 58066 58067 58068 58065 58070 58071 58072 58069 58074 58075 58076 58073 58078 58079 58080 58077 58082 58083 58084 58081 58086 58087 58088 58085 58090 58091 58092 58089 58094 58095 58096 58093 58098 58099 58100 58097 58102 58103 58104 58101 58106 58107 58108 58105 58110 58111 58112 58109 58114 58115 58116 58113 58118 58119 58120 58117 58122 58123 58124 58121 58126 58127 58128 58125 58130 58131 58132 58129 58134 58135 58136 58133 58138 58139 58140 58137 58142 58143 58144 58141 58146 58147 58148 58145 58150 58151 58152 58149 58154 58155 58156 58153 58158 58159 58160 58157 58162 58163 58164 58161 58166 58167 58168 58165 58170 58171 58172 58169 58174 58175 58176 58173 58178 58179 58180 58177 58182 58183 58184 58181 58186 58187 58188 58185 58190 58191 58192 58189 58194 58195 58196 58193 58198 58199 58200 58197 58202 58203 58204 58201 58206 58207 58208 58205 58210 58211 58212 58209 58214 58215 58216 58213 58218 58219 58220 58217 58222 58223 58224 58221 58226 58227 58228 58225 58230 58231 58232 58229 58234 58235 58236 58233 58238 58239 58240 58237 58242 58243 58244 58241 58246 58247 58248 58245 58250 58251 58252 58249 58254 58255 58256 58253 58258 58259 58260 58257 58262 58263 58264 58261 58266 58267 58268 58265 58270 58271 58272 58269 58274 58275 58276 58273 58278 58279 58280 58277 58282 58283 58284 58281 58286 58287 58288 58285 58290 58291 58292 58289 58294 58295 58296 58293 58298 58299 58300 58297 58302 58303 58304 58301 58306 58307 58308 58305 58310 58311 58312 58309 58314 58315 58316 58313 58318 58319 58320 58317 58322 58323 58324 58321 58326 58327 58328 58325 58330 58331 58332 58329 58334 58335 58336 58333 58338 58339 58340 58337 58342 58343 58344 58341 58346 58347 58348 58345 58350 58351 58352 58349 58354 58355 58356 58353 58358 58359 58360 58357 58362 58363 58364 58361 58366 58367 58368 58365 58370 58371 58372 58369 58374 58375 58376 58373 58378 58379 58380 58377 58382 58383 58384 58381 58386 58387 58388 58385 58390 58391 58392 58389 58394 58395 58396 58393 58398 58399 58400 58397 58402 58403 58404 58401 58406 58407 58408 58405 58410 58411 58412 58409 58414 58415 58416 58413 58418 58419 58420 58417 58422 58423 58424 58421 58426 58427 58428 58425 58430 58431 58432 58429 58434 58435 58436 58433 58438 58439 58440 58437 58442 58443 58444 58441 58446 58447 58448 58445 58450 58451 58452 58449 58454 58455 58456 58453 58458 58459 58460 58457 58462 58463 58464 58461 58466 58467 58468 58465 58470 58471 58472 58469 58474 58475 58476 58473 58478 58479 58480 58477 58482 58483 58484 58481 58486 58487 58488 58485 58490 58491 58492 58489 58494 58495 58496 58493 58498 58499 58500 58497 58502 58503 58504 58501 58506 58507 58508 58505 58510 58511 58512 58509 58514 58515 58516 58513 58518 58519 58520 58517 58522 58523 58524 58521 58526 58527 58528 58525 58530 58531 58532 58529 58534 58535 58536 58533 58538 58539 58540 58537 58542 58543 58544 58541 58546 58547 58548 58545 58550 58551 58552 58549 58554 58555 58556 58553 58558 58559 58560 58557 58562 58563 58564 58561 58566 58567 58568 58565 58570 58571 58572 58569 58574 58575 58576 58573 58578 58579 58580 58577 58582 58583 58584 58581 58586 58587 58588 58585 58590 58591 58592 58589 58594 58595 58596 58593 58598 58599 58600 58597 58602 58603 58604 58601 58606 58607 58608 58605 58610 58611 58612 58609 58614 58615 58616 58613 58618 58619 58620 58617 58622 58623 58624 58621 58626 58627 58628 58625 58630 58631 58632 58629 58634 58635 58636 58633 58638 58639 58640 58637 58642 58643 58644 58641 58646 58647 58648 58645 58650 58651 58652 58649 58654 58655 58656 58653 58658 58659 58660 58657 58662 58663 58664 58661 58666 58667 58668 58665 58670 58671 58672 58669 58674 58675 58676 58673 58678 58679 58680 58677 58682 58683 58684 58681 58686 58687 58688 58685 58690 58691 58692 58689 58694 58695 58696 58693 58698 58699 58700 58697 58702 58703 58704 58701 58706 58707 58708 58705 58710 58711 58712 58709 58714 58715 58716 58713 58718 58719 58720 58717 58722 58723 58724 58721 58726 58727 58728 58725 58730 58731 58732 58729 58734 58735 58736 58733 58738 58739 58740 58737 58742 58743 58744 58741 58746 58747 58748 58745 58750 58751 58752 58749 58754 58755 58756 58753 58758 58759 58760 58757 58762 58763 58764 58761 58766 58767 58768 58765 58770 58771 58772 58769 58774 58775 58776 58773 58778 58779 58780 58777 58782 58783 58784 58781 58786 58787 58788 58785 58790 58791 58792 58789 58794 58795 58796 58793 58798 58799 58800 58797 58802 58803 58804 58801 58806 58807 58808 58805 58810 58811 58812 58809 58814 58815 58816 58813 58818 58819 58820 58817 58822 58823 58824 58821 58826 58827 58828 58825 58830 58831 58832 58829 58834 58835 58836 58833 58838 58839 58840 58837 58842 58843 58844 58841 58846 58847 58848 58845 58850 58851 58852 58849 58854 58855 58856 58853 58858 58859 58860 58857 58862 58863 58864 58861 58866 58867 58868 58865 58870 58871 58872 58869 58874 58875 58876 58873 58878 58879 58880 58877 58882 58883 58884 58881 58886 58887 58888 58885 58890 58891 58892 58889 58894 58895 58896 58893 58898 58899 58900 58897 58902 58903 58904 58901 58906 58907 58908 58905 58910 58911 58912 58909 58914 58915 58916 58913 58918 58919 58920 58917 58922 58923 58924 58921 58926 58927 58928 58925 58930 58931 58932 58929 58934 58935 58936 58933 58938 58939 58940 58937 58942 58943 58944 58941 58946 58947 58948 58945 58950 58951 58952 58949 58954 58955 58956 58953 58958 58959 58960 58957 58962 58963 58964 58961 58966 58967 58968 58965 58970 58971 58972 58969 58974 58975 58976 58973 58978 58979 58980 58977 58982 58983 58984 58981 58986 58987 58988 58985 58990 58991 58992 58989 58994 58995 58996 58993 58998 58999 59000 58997 59002 59003 59004 59001 59006 59007 59008 59005 59010 59011 59012 59009 59014 59015 59016 59013 59018 59019 59020 59017 59022 59023 59024 59021 59026 59027 59028 59025 59030 59031 59032 59029 59034 59035 59036 59033 59038 59039 59040 59037 59042 59043 59044 59041 59046 59047 59048 59045 59050 59051 59052 59049 59054 59055 59056 59053 59058 59059 59060 59057 59062 59063 59064 59061 59066 59067 59068 59065 59070 59071 59072 59069 59074 59075 59076 59073 59078 59079 59080 59077 59082 59083 59084 59081 59086 59087 59088 59085 59090 59091 59092 59089 59094 59095 59096 59093 59098 59099 59100 59097 59102 59103 59104 59101 59106 59107 59108 59105 59110 59111 59112 59109 59114 59115 59116 59113 59118 59119 59120 59117 59122 59123 59124 59121 59126 59127 59128 59125 59130 59131 59132 59129 59134 59135 59136 59133 59138 59139 59140 59137 59142 59143 59144 59141 59146 59147 59148 59145 59150 59151 59152 59149 59154 59155 59156 59153 59158 59159 59160 59157 59162 59163 59164 59161 59166 59167 59168 59165 59170 59171 59172 59169 59174 59175 59176 59173 59178 59179 59180 59177 59182 59183 59184 59181 59186 59187 59188 59185 59190 59191 59192 59189 59194 59195 59196 59193 59198 59199 59200 59197 59202 59203 59204 59201 59206 59207 59208 59205 59210 59211 59212 59209 59214 59215 59216 59213 59218 59219 59220 59217 59222 59223 59224 59221 59226 59227 59228 59225 59230 59231 59232 59229 59234 59235 59236 59233 59238 59239 59240 59237 59242 59243 59244 59241 59246 59247 59248 59245 59250 59251 59252 59249 59254 59255 59256 59253 59258 59259 59260 59257 59262 59263 59264 59261 59266 59267 59268 59265 59270 59271 59272 59269 59274 59275 59276 59273 59278 59279 59280 59277 59282 59283 59284 59281 59286 59287 59288 59285 59290 59291 59292 59289 59294 59295 59296 59293 59298 59299 59300 59297 59302 59303 59304 59301 59306 59307 59308 59305 59310 59311 59312 59309 59314 59315 59316 59313 59318 59319 59320 59317 59322 59323 59324 59321 59326 59327 59328 59325 59330 59331 59332 59329 59334 59335 59336 59333 59338 59339 59340 59337 59342 59343 59344 59341 59346 59347 59348 59345 59350 59351 59352 59349 59354 59355 59356 59353 59358 59359 59360 59357 59362 59363 59364 59361 59366 59367 59368 59365 59370 59371 59372 59369 59374 59375 59376 59373 59378 59379 59380 59377 59382 59383 59384 59381 59386 59387 59388 59385 59390 59391 59392 59389 59394 59395 59396 59393 59398 59399 59400 59397 59402 59403 59404 59401 59406 59407 59408 59405 59410 59411 59412 59409 59414 59415 59416 59413 59418 59419 59420 59417 59422 59423 59424 59421 59426 59427 59428 59425 59430 59431 59432 59429 59434 59435 59436 59433 59438 59439 59440 59437 59442 59443 59444 59441 59446 59447 59448 59445 59450 59451 59452 59449 59454 59455 59456 59453 59458 59459 59460 59457 59462 59463 59464 59461 59466 59467 59468 59465 59470 59471 59472 59469 59474 59475 59476 59473 59478 59479 59480 59477 59482 59483 59484 59481 59486 59487 59488 59485 59490 59491 59492 59489 59494 59495 59496 59493 59498 59499 59500 59497 59502 59503 59504 59501 59506 59507 59508 59505 59510 59511 59512 59509 59514 59515 59516 59513 59518 59519 59520 59517 59522 59523 59524 59521 59526 59527 59528 59525 59530 59531 59532 59529 59534 59535 59536 59533 59538 59539 59540 59537 59542 59543 59544 59541 59546 59547 59548 59545 59550 59551 59552 59549 59554 59555 59556 59553 59558 59559 59560 59557 59562 59563 59564 59561 59566 59567 59568 59565 59570 59571 59572 59569 59574 59575 59576 59573 59578 59579 59580 59577 59582 59583 59584 59581 59586 59587 59588 59585 59590 59591 59592 59589 59594 59595 59596 59593 59598 59599 59600 59597 59602 59603 59604 59601 59606 59607 59608 59605 59610 59611 59612 59609 59614 59615 59616 59613 59618 59619 59620 59617 59622 59623 59624 59621 59626 59627 59628 59625 59630 59631 59632 59629 59634 59635 59636 59633 59638 59639 59640 59637 59642 59643 59644 59641 59646 59647 59648 59645 59650 59651 59652 59649 59654 59655 59656 59653 59658 59659 59660 59657 59662 59663 59664 59661 59666 59667 59668 59665 59670 59671 59672 59669 59674 59675 59676 59673 59678 59679 59680 59677 59682 59683 59684 59681 59686 59687 59688 59685 59690 59691 59692 59689 59694 59695 59696 59693 59698 59699 59700 59697 59702 59703 59704 59701 59706 59707 59708 59705 59710 59711 59712 59709 59714 59715 59716 59713 59718 59719 59720 59717 59722 59723 59724 59721 59726 59727 59728 59725 59730 59731 59732 59729 59734 59735 59736 59733 59738 59739 59740 59737 59742 59743 59744 59741 59746 59747 59748 59745 59750 59751 59752 59749 59754 59755 59756 59753 59758 59759 59760 59757 59762 59763 59764 59761 59766 59767 59768 59765 59770 59771 59772 59769 59774 59775 59776 59773 59778 59779 59780 59777 59782 59783 59784 59781 59786 59787 59788 59785 59790 59791 59792 59789 59794 59795 59796 59793 59798 59799 59800 59797 59802 59803 59804 59801 59806 59807 59808 59805 59810 59811 59812 59809 59814 59815 59816 59813 59818 59819 59820 59817 59822 59823 59824 59821 59826 59827 59828 59825 59830 59831 59832 59829 59834 59835 59836 59833 59838 59839 59840 59837 59842 59843 59844 59841 59846 59847 59848 59845 59850 59851 59852 59849 59854 59855 59856 59853 59858 59859 59860 59857 59862 59863 59864 59861 59866 59867 59868 59865 59870 59871 59872 59869 59874 59875 59876 59873 59878 59879 59880 59877 59882 59883 59884 59881 59886 59887 59888 59885 59890 59891 59892 59889 59894 59895 59896 59893 59898 59899 59900 59897 59902 59903 59904 59901 59906 59907 59908 59905 59910 59911 59912 59909 59914 59915 59916 59913 59918 59919 59920 59917 59922 59923 59924 59921 59926 59927 59928 59925 59930 59931 59932 59929 59934 59935 59936 59933 59938 59939 59940 59937 59942 59943 59944 59941 59946 59947 59948 59945 59950 59951 59952 59949 59954 59955 59956 59953 59958 59959 59960 59957 59962 59963 59964 59961 59966 59967 59968 59965 59970 59971 59972 59969 59974 59975 59976 59973 59978 59979 59980 59977 59982 59983 59984 59981 59986 59987 59988 59985 59990 59991 59992 59989 59994 59995 59996 59993 59998 59999 60000 59997 60002 60003 60004 60001 60006 60007 60008 60005 60010 60011 60012 60009 60014 60015 60016 60013 60018 60019 60020 60017 60022 60023 60024 60021 60026 60027 60028 60025 60030 60031 60032 60029 60034 60035 60036 60033 60038 60039 60040 60037 60042 60043 60044 60041 60046 60047 60048 60045 60050 60051 60052 60049 60054 60055 60056 60053 60058 60059 60060 60057 60062 60063 60064 60061 60066 60067 60068 60065 60070 60071 60072 60069 60074 60075 60076 60073 60078 60079 60080 60077 60082 60083 60084 60081 60086 60087 60088 60085 60090 60091 60092 60089 60094 60095 60096 60093 60098 60099 60100 60097 60102 60103 60104 60101 60106 60107 60108 60105 60110 60111 60112 60109 60114 60115 60116 60113 60118 60119 60120 60117 60122 60123 60124 60121 60126 60127 60128 60125 60130 60131 60132 60129 60134 60135 60136 60133 60138 60139 60140 60137 60142 60143 60144 60141 60146 60147 60148 60145 60150 60151 60152 60149 60154 60155 60156 60153 60158 60159 60160 60157 60162 60163 60164 60161 60166 60167 60168 60165 60170 60171 60172 60169 60174 60175 60176 60173 60178 60179 60180 60177 60182 60183 60184 60181 60186 60187 60188 60185 60190 60191 60192 60189 60194 60195 60196 60193 60198 60199 60200 60197 60202 60203 60204 60201 60206 60207 60208 60205 60210 60211 60212 60209 60214 60215 60216 60213 60218 60219 60220 60217 60222 60223 60224 60221 60226 60227 60228 60225 60230 60231 60232 60229 60234 60235 60236 60233 60238 60239 60240 60237 60242 60243 60244 60241 60246 60247 60248 60245 60250 60251 60252 60249 60254 60255 60256 60253 60258 60259 60260 60257 60262 60263 60264 60261 60266 60267 60268 60265 60270 60271 60272 60269 60274 60275 60276 60273 60278 60279 60280 60277 60282 60283 60284 60281 60286 60287 60288 60285 60290 60291 60292 60289 60294 60295 60296 60293 60298 60299 60300 60297 60302 60303 60304 60301 60306 60307 60308 60305 60310 60311 60312 60309 60314 60315 60316 60313 60318 60319 60320 60317 60322 60323 60324 60321 60326 60327 60328 60325 60330 60331 60332 60329 60334 60335 60336 60333 60338 60339 60340 60337 60342 60343 60344 60341 60346 60347 60348 60345 60350 60351 60352 60349 60354 60355 60356 60353 60358 60359 60360 60357 60362 60363 60364 60361 60366 60367 60368 60365 60370 60371 60372 60369 60374 60375 60376 60373 60378 60379 60380 60377 60382 60383 60384 60381 60386 60387 60388 60385 60390 60391 60392 60389 60394 60395 60396 60393 60398 60399 60400 60397 60402 60403 60404 60401 60406 60407 60408 60405 60410 60411 60412 60409 60414 60415 60416 60413 60418 60419 60420 60417 60422 60423 60424 60421 60426 60427 60428 60425 60430 60431 60432 60429 60434 60435 60436 60433 60438 60439 60440 60437 60442 60443 60444 60441 60446 60447 60448 60445 60450 60451 60452 60449 60454 60455 60456 60453 60458 60459 60460 60457 60462 60463 60464 60461 60466 60467 60468 60465 60470 60471 60472 60469 60474 60475 60476 60473 60478 60479 60480 60477 60482 60483 60484 60481 60486 60487 60488 60485 60490 60491 60492 60489 60494 60495 60496 60493 60498 60499 60500 60497 60502 60503 60504 60501 60506 60507 60508 60505 60510 60511 60512 60509 60514 60515 60516 60513 60518 60519 60520 60517 60522 60523 60524 60521 60526 60527 60528 60525 60530 60531 60532 60529 60534 60535 60536 60533 60538 60539 60540 60537 60542 60543 60544 60541 60546 60547 60548 60545 60550 60551 60552 60549 60554 60555 60556 60553 60558 60559 60560 60557 60562 60563 60564 60561 60566 60567 60568 60565 60570 60571 60572 60569 60574 60575 60576 60573 60578 60579 60580 60577 60582 60583 60584 60581 60586 60587 60588 60585 60590 60591 60592 60589 60594 60595 60596 60593 60598 60599 60600 60597 60602 60603 60604 60601 60606 60607 60608 60605 60610 60611 60612 60609 60614 60615 60616 60613 60618 60619 60620 60617 60622 60623 60624 60621 60626 60627 60628 60625 60630 60631 60632 60629 60634 60635 60636 60633 60638 60639 60640 60637 60642 60643 60644 60641 60646 60647 60648 60645 60650 60651 60652 60649 60654 60655 60656 60653 60658 60659 60660 60657 60662 60663 60664 60661 60666 60667 60668 60665 60670 60671 60672 60669 60674 60675 60676 60673 60678 60679 60680 60677 60682 60683 60684 60681 60686 60687 60688 60685 60690 60691 60692 60689 60694 60695 60696 60693 60698 60699 60700 60697 60702 60703 60704 60701 60706 60707 60708 60705 60710 60711 60712 60709 60714 60715 60716 60713 60718 60719 60720 60717 60722 60723 60724 60721 60726 60727 60728 60725 60730 60731 60732 60729 60734 60735 60736 60733 60738 60739 60740 60737 60742 60743 60744 60741 60746 60747 60748 60745 60750 60751 60752 60749 60754 60755 60756 60753 60758 60759 60760 60757 60762 60763 60764 60761 60766 60767 60768 60765 60770 60771 60772 60769 60774 60775 60776 60773 60778 60779 60780 60777 60782 60783 60784 60781 60786 60787 60788 60785 60790 60791 60792 60789 60794 60795 60796 60793 60798 60799 60800 60797 60802 60803 60804 60801 60806 60807 60808 60805 60810 60811 60812 60809 60814 60815 60816 60813 60818 60819 60820 60817 60822 60823 60824 60821 60826 60827 60828 60825 60830 60831 60832 60829 60834 60835 60836 60833 60838 60839 60840 60837 60842 60843 60844 60841 60846 60847 60848 60845 60850 60851 60852 60849 60854 60855 60856 60853 60858 60859 60860 60857 60862 60863 60864 60861 60866 60867 60868 60865 60870 60871 60872 60869 60874 60875 60876 60873 60878 60879 60880 60877 60882 60883 60884 60881 60886 60887 60888 60885 60890 60891 60892 60889 60894 60895 60896 60893 60898 60899 60900 60897 60902 60903 60904 60901 60906 60907 60908 60905 60910 60911 60912 60909 60914 60915 60916 60913 60918 60919 60920 60917 60922 60923 60924 60921 60926 60927 60928 60925 60930 60931 60932 60929 60934 60935 60936 60933 60938 60939 60940 60937 60942 60943 60944 60941 60946 60947 60948 60945 60950 60951 60952 60949 60954 60955 60956 60953 60958 60959 60960 60957 60962 60963 60964 60961 60966 60967 60968 60965 60970 60971 60972 60969 60974 60975 60976 60973 60978 60979 60980 60977 60982 60983 60984 60981 60986 60987 60988 60985 60990 60991 60992 60989 60994 60995 60996 60993 60998 60999 61000 60997 61002 61003 61004 61001 61006 61007 61008 61005 61010 61011 61012 61009 61014 61015 61016 61013 61018 61019 61020 61017 61022 61023 61024 61021 61026 61027 61028 61025 61030 61031 61032 61029 61034 61035 61036 61033 61038 61039 61040 61037 61042 61043 61044 61041 61046 61047 61048 61045 61050 61051 61052 61049 61054 61055 61056 61053 61058 61059 61060 61057 61062 61063 61064 61061 61066 61067 61068 61065 61070 61071 61072 61069 61074 61075 61076 61073 61078 61079 61080 61077 61082 61083 61084 61081 61086 61087 61088 61085 61090 61091 61092 61089 61094 61095 61096 61093 61098 61099 61100 61097 61102 61103 61104 61101 61106 61107 61108 61105 61110 61111 61112 61109 61114 61115 61116 61113 61118 61119 61120 61117 61122 61123 61124 61121 61126 61127 61128 61125 61130 61131 61132 61129 61134 61135 61136 61133 61138 61139 61140 61137 61142 61143 61144 61141 61146 61147 61148 61145 61150 61151 61152 61149 61154 61155 61156 61153 61158 61159 61160 61157 61162 61163 61164 61161 61166 61167 61168 61165 61170 61171 61172 61169 61174 61175 61176 61173 61178 61179 61180 61177 61182 61183 61184 61181 61186 61187 61188 61185 61190 61191 61192 61189 61194 61195 61196 61193 61198 61199 61200 61197 61202 61203 61204 61201 61206 61207 61208 61205 61210 61211 61212 61209 61214 61215 61216 61213 61218 61219 61220 61217 61222 61223 61224 61221 61226 61227 61228 61225 61230 61231 61232 61229 61234 61235 61236 61233 61238 61239 61240 61237 61242 61243 61244 61241 61246 61247 61248 61245 61250 61251 61252 61249 61254 61255 61256 61253 61258 61259 61260 61257 61262 61263 61264 61261 61266 61267 61268 61265 61270 61271 61272 61269 61274 61275 61276 61273 61278 61279 61280 61277 61282 61283 61284 61281 61286 61287 61288 61285 61290 61291 61292 61289 61294 61295 61296 61293 61298 61299 61300 61297 61302 61303 61304 61301 61306 61307 61308 61305 61310 61311 61312 61309 61314 61315 61316 61313 61318 61319 61320 61317 61322 61323 61324 61321 61326 61327 61328 61325 61330 61331 61332 61329 61334 61335 61336 61333 61338 61339 61340 61337 61342 61343 61344 61341 61346 61347 61348 61345 61350 61351 61352 61349 61354 61355 61356 61353 61358 61359 61360 61357 61362 61363 61364 61361 61366 61367 61368 61365 61370 61371 61372 61369 61374 61375 61376 61373 61378 61379 61380 61377 61382 61383 61384 61381 61386 61387 61388 61385 61390 61391 61392 61389 61394 61395 61396 61393 61398 61399 61400 61397 61402 61403 61404 61401 61406 61407 61408 61405 61410 61411 61412 61409 61414 61415 61416 61413 61418 61419 61420 61417 61422 61423 61424 61421 61426 61427 61428 61425 61430 61431 61432 61429 61434 61435 61436 61433 61438 61439 61440 61437 61442 61443 61444 61441 61446 61447 61448 61445 61450 61451 61452 61449 61454 61455 61456 61453 61458 61459 61460 61457 61462 61463 61464 61461 61466 61467 61468 61465 61470 61471 61472 61469 61474 61475 61476 61473 61478 61479 61480 61477 61482 61483 61484 61481 61486 61487 61488 61485 61490 61491 61492 61489 61494 61495 61496 61493 61498 61499 61500 61497 61502 61503 61504 61501 61506 61507 61508 61505 61510 61511 61512 61509 61514 61515 61516 61513 61518 61519 61520 61517 61522 61523 61524 61521 61526 61527 61528 61525 61530 61531 61532 61529 61534 61535 61536 61533 61538 61539 61540 61537 61542 61543 61544 61541 61546 61547 61548 61545 61550 61551 61552 61549 61554 61555 61556 61553 61558 61559 61560 61557 61562 61563 61564 61561 61566 61567 61568 61565 61570 61571 61572 61569 61574 61575 61576 61573 61578 61579 61580 61577 61582 61583 61584 61581 61586 61587 61588 61585 61590 61591 61592 61589 61594 61595 61596 61593 61598 61599 61600 61597 61602 61603 61604 61601 61606 61607 61608 61605 61610 61611 61612 61609 61614 61615 61616 61613 61618 61619 61620 61617 61622 61623 61624 61621 61626 61627 61628 61625 61630 61631 61632 61629 61634 61635 61636 61633 61638 61639 61640 61637 61642 61643 61644 61641 61646 61647 61648 61645 61650 61651 61652 61649 61654 61655 61656 61653 61658 61659 61660 61657 61662 61663 61664 61661 61666 61667 61668 61665 61670 61671 61672 61669 61674 61675 61676 61673 61678 61679 61680 61677 61682 61683 61684 61681 61686 61687 61688 61685 61690 61691 61692 61689 61694 61695 61696 61693 61698 61699 61700 61697 61702 61703 61704 61701 61706 61707 61708 61705 61710 61711 61712 61709 61714 61715 61716 61713 61718 61719 61720 61717 61722 61723 61724 61721 61726 61727 61728 61725 61730 61731 61732 61729 61734 61735 61736 61733 61738 61739 61740 61737 61742 61743 61744 61741 61746 61747 61748 61745 61750 61751 61752 61749 61754 61755 61756 61753 61758 61759 61760 61757 61762 61763 61764 61761 61766 61767 61768 61765 61770 61771 61772 61769 61774 61775 61776 61773 61778 61779 61780 61777 61782 61783 61784 61781 61786 61787 61788 61785 61790 61791 61792 61789 61794 61795 61796 61793 61798 61799 61800 61797 61802 61803 61804 61801 61806 61807 61808 61805 61810 61811 61812 61809 61814 61815 61816 61813 61818 61819 61820 61817 61822 61823 61824 61821 61826 61827 61828 61825 61830 61831 61832 61829 61834 61835 61836 61833 61838 61839 61840 61837 61842 61843 61844 61841 61846 61847 61848 61845 61850 61851 61852 61849 61854 61855 61856 61853 61858 61859 61860 61857 61862 61863 61864 61861 61866 61867 61868 61865 61870 61871 61872 61869 61874 61875 61876 61873 61878 61879 61880 61877 61882 61883 61884 61881 61886 61887 61888 61885 61890 61891 61892 61889 61894 61895 61896 61893 61898 61899 61900 61897 61902 61903 61904 61901 61906 61907 61908 61905 61910 61911 61912 61909 61914 61915 61916 61913 61918 61919 61920 61917 61922 61923 61924 61921 61926 61927 61928 61925 61930 61931 61932 61929 61934 61935 61936 61933 61938 61939 61940 61937 61942 61943 61944 61941 61946 61947 61948 61945 61950 61951 61952 61949 61954 61955 61956 61953 61958 61959 61960 61957 61962 61963 61964 61961 61966 61967 61968 61965 61970 61971 61972 61969 61974 61975 61976 61973 61978 61979 61980 61977 61982 61983 61984 61981 61986 61987 61988 61985 61990 61991 61992 61989 61994 61995 61996 61993 61998 61999 62000 61997 62002 62003 62004 62001 62006 62007 62008 62005 62010 62011 62012 62009 62014 62015 62016 62013 62018 62019 62020 62017 62022 62023 62024 62021 62026 62027 62028 62025 62030 62031 62032 62029 62034 62035 62036 62033 62038 62039 62040 62037 62042 62043 62044 62041 62046 62047 62048 62045 62050 62051 62052 62049 62054 62055 62056 62053 62058 62059 62060 62057 62062 62063 62064 62061 62066 62067 62068 62065 62070 62071 62072 62069 62074 62075 62076 62073 62078 62079 62080 62077 62082 62083 62084 62081 62086 62087 62088 62085 62090 62091 62092 62089 62094 62095 62096 62093 62098 62099 62100 62097 62102 62103 62104 62101 62106 62107 62108 62105 62110 62111 62112 62109 62114 62115 62116 62113 62118 62119 62120 62117 62122 62123 62124 62121 62126 62127 62128 62125 62130 62131 62132 62129 62134 62135 62136 62133 62138 62139 62140 62137 62142 62143 62144 62141 62146 62147 62148 62145 62150 62151 62152 62149 62154 62155 62156 62153 62158 62159 62160 62157 62162 62163 62164 62161 62166 62167 62168 62165 62170 62171 62172 62169 62174 62175 62176 62173 62178 62179 62180 62177 62182 62183 62184 62181 62186 62187 62188 62185 62190 62191 62192 62189 62194 62195 62196 62193 62198 62199 62200 62197 62202 62203 62204 62201 62206 62207 62208 62205 62210 62211 62212 62209 62214 62215 62216 62213 62218 62219 62220 62217 62222 62223 62224 62221 62226 62227 62228 62225 62230 62231 62232 62229 62234 62235 62236 62233 62238 62239 62240 62237 62242 62243 62244 62241 62246 62247 62248 62245 62250 62251 62252 62249 62254 62255 62256 62253 62258 62259 62260 62257 62262 62263 62264 62261 62266 62267 62268 62265 62270 62271 62272 62269 62274 62275 62276 62273 62278 62279 62280 62277 62282 62283 62284 62281 62286 62287 62288 62285 62290 62291 62292 62289 62294 62295 62296 62293 62298 62299 62300 62297 62302 62303 62304 62301 62306 62307 62308 62305 62310 62311 62312 62309 62314 62315 62316 62313 62318 62319 62320 62317 62322 62323 62324 62321 62326 62327 62328 62325 62330 62331 62332 62329 62334 62335 62336 62333 62338 62339 62340 62337 62342 62343 62344 62341 62346 62347 62348 62345 62350 62351 62352 62349 62354 62355 62356 62353 62358 62359 62360 62357 62362 62363 62364 62361 62366 62367 62368 62365 62370 62371 62372 62369 62374 62375 62376 62373 62378 62379 62380 62377 62382 62383 62384 62381 62386 62387 62388 62385 62390 62391 62392 62389 62394 62395 62396 62393 62398 62399 62400 62397 62402 62403 62404 62401 62406 62407 62408 62405 62410 62411 62412 62409 62414 62415 62416 62413 62418 62419 62420 62417 62422 62423 62424 62421 62426 62427 62428 62425 62430 62431 62432 62429 62434 62435 62436 62433 62438 62439 62440 62437 62442 62443 62444 62441 62446 62447 62448 62445 62450 62451 62452 62449 62454 62455 62456 62453 62458 62459 62460 62457 62462 62463 62464 62461 62466 62467 62468 62465 62470 62471 62472 62469 62474 62475 62476 62473 62478 62479 62480 62477 62482 62483 62484 62481 62486 62487 62488 62485 62490 62491 62492 62489 62494 62495 62496 62493 62498 62499 62500 62497 62502 62503 62504 62501 62506 62507 62508 62505 62510 62511 62512 62509 62514 62515 62516 62513 62518 62519 62520 62517 62522 62523 62524 62521 62526 62527 62528 62525 62530 62531 62532 62529 62534 62535 62536 62533 62538 62539 62540 62537 62542 62543 62544 62541 62546 62547 62548 62545 62550 62551 62552 62549 62554 62555 62556 62553 62558 62559 62560 62557 62562 62563 62564 62561 62566 62567 62568 62565 62570 62571 62572 62569 62574 62575 62576 62573 62578 62579 62580 62577 62582 62583 62584 62581 62586 62587 62588 62585 62590 62591 62592 62589 62594 62595 62596 62593 62598 62599 62600 62597 62602 62603 62604 62601 62606 62607 62608 62605 62610 62611 62612 62609 62614 62615 62616 62613 62618 62619 62620 62617 62622 62623 62624 62621 62626 62627 62628 62625 62630 62631 62632 62629 62634 62635 62636 62633 62638 62639 62640 62637 62642 62643 62644 62641 62646 62647 62648 62645 62650 62651 62652 62649 62654 62655 62656 62653 62658 62659 62660 62657 62662 62663 62664 62661 62666 62667 62668 62665 62670 62671 62672 62669 62674 62675 62676 62673 62678 62679 62680 62677 62682 62683 62684 62681 62686 62687 62688 62685 62690 62691 62692 62689 62694 62695 62696 62693 62698 62699 62700 62697 62702 62703 62704 62701 62706 62707 62708 62705 62710 62711 62712 62709 62714 62715 62716 62713 62718 62719 62720 62717 62722 62723 62724 62721 62726 62727 62728 62725 62730 62731 62732 62729 62734 62735 62736 62733 62738 62739 62740 62737 62742 62743 62744 62741 62746 62747 62748 62745 62750 62751 62752 62749 62754 62755 62756 62753 62758 62759 62760 62757 62762 62763 62764 62761 62766 62767 62768 62765 62770 62771 62772 62769 62774 62775 62776 62773 62778 62779 62780 62777 62782 62783 62784 62781 62786 62787 62788 62785 62790 62791 62792 62789 62794 62795 62796 62793 62798 62799 62800 62797 62802 62803 62804 62801 62806 62807 62808 62805 62810 62811 62812 62809 62814 62815 62816 62813 62818 62819 62820 62817 62822 62823 62824 62821 62826 62827 62828 62825 62830 62831 62832 62829 62834 62835 62836 62833 62838 62839 62840 62837 62842 62843 62844 62841 62846 62847 62848 62845 62850 62851 62852 62849 62854 62855 62856 62853 62858 62859 62860 62857 62862 62863 62864 62861 62866 62867 62868 62865 62870 62871 62872 62869 62874 62875 62876 62873 62878 62879 62880 62877 62882 62883 62884 62881 62886 62887 62888 62885 62890 62891 62892 62889 62894 62895 62896 62893 62898 62899 62900 62897 62902 62903 62904 62901 62906 62907 62908 62905 62910 62911 62912 62909 62914 62915 62916 62913 62918 62919 62920 62917 62922 62923 62924 62921 62926 62927 62928 62925 62930 62931 62932 62929 62934 62935 62936 62933 62938 62939 62940 62937 62942 62943 62944 62941 62946 62947 62948 62945 62950 62951 62952 62949 62954 62955 62956 62953 62958 62959 62960 62957 62962 62963 62964 62961 62966 62967 62968 62965 62970 62971 62972 62969 62974 62975 62976 62973 62978 62979 62980 62977 62982 62983 62984 62981 62986 62987 62988 62985 62990 62991 62992 62989 62994 62995 62996 62993 62998 62999 63000 62997 63002 63003 63004 63001 63006 63007 63008 63005 63010 63011 63012 63009 63014 63015 63016 63013 63018 63019 63020 63017 63022 63023 63024 63021 63026 63027 63028 63025 63030 63031 63032 63029 63034 63035 63036 63033 63038 63039 63040 63037 63042 63043 63044 63041 63046 63047 63048 63045 63050 63051 63052 63049 63054 63055 63056 63053 63058 63059 63060 63057 63062 63063 63064 63061 63066 63067 63068 63065 63070 63071 63072 63069 63074 63075 63076 63073 63078 63079 63080 63077 63082 63083 63084 63081 63086 63087 63088 63085 63090 63091 63092 63089 63094 63095 63096 63093 63098 63099 63100 63097 63102 63103 63104 63101 63106 63107 63108 63105 63110 63111 63112 63109 63114 63115 63116 63113 63118 63119 63120 63117 63122 63123 63124 63121 63126 63127 63128 63125 63130 63131 63132 63129 63134 63135 63136 63133 63138 63139 63140 63137 63142 63143 63144 63141 63146 63147 63148 63145 63150 63151 63152 63149 63154 63155 63156 63153 63158 63159 63160 63157 63162 63163 63164 63161 63166 63167 63168 63165 63170 63171 63172 63169 63174 63175 63176 63173 63178 63179 63180 63177 63182 63183 63184 63181 63186 63187 63188 63185 63190 63191 63192 63189 63194 63195 63196 63193 63198 63199 63200 63197 63202 63203 63204 63201 63206 63207 63208 63205 63210 63211 63212 63209 63214 63215 63216 63213 63218 63219 63220 63217 63222 63223 63224 63221 63226 63227 63228 63225 63230 63231 63232 63229 63234 63235 63236 63233 63238 63239 63240 63237 63242 63243 63244 63241 63246 63247 63248 63245 63250 63251 63252 63249 63254 63255 63256 63253 63258 63259 63260 63257 63262 63263 63264 63261 63266 63267 63268 63265 63270 63271 63272 63269 63274 63275 63276 63273 63278 63279 63280 63277 63282 63283 63284 63281 63286 63287 63288 63285 63290 63291 63292 63289 63294 63295 63296 63293 63298 63299 63300 63297 63302 63303 63304 63301 63306 63307 63308 63305 63310 63311 63312 63309 63314 63315 63316 63313 63318 63319 63320 63317 63322 63323 63324 63321 63326 63327 63328 63325 63330 63331 63332 63329 63334 63335 63336 63333 63338 63339 63340 63337 63342 63343 63344 63341 63346 63347 63348 63345 63350 63351 63352 63349 63354 63355 63356 63353 63358 63359 63360 63357 63362 63363 63364 63361 63366 63367 63368 63365 63370 63371 63372 63369 63374 63375 63376 63373 63378 63379 63380 63377 63382 63383 63384 63381 63386 63387 63388 63385 63390 63391 63392 63389 63394 63395 63396 63393 63398 63399 63400 63397 63402 63403 63404 63401 63406 63407 63408 63405 63410 63411 63412 63409 63414 63415 63416 63413 63418 63419 63420 63417 63422 63423 63424 63421 63426 63427 63428 63425 63430 63431 63432 63429 63434 63435 63436 63433 63438 63439 63440 63437 63442 63443 63444 63441 63446 63447 63448 63445 63450 63451 63452 63449 63454 63455 63456 63453 63458 63459 63460 63457 63462 63463 63464 63461 63466 63467 63468 63465 63470 63471 63472 63469 63474 63475 63476 63473 63478 63479 63480 63477 63482 63483 63484 63481 63486 63487 63488 63485 63490 63491 63492 63489 63494 63495 63496 63493 63498 63499 63500 63497 63502 63503 63504 63501 63506 63507 63508 63505 63510 63511 63512 63509 63514 63515 63516 63513 63518 63519 63520 63517 63522 63523 63524 63521 63526 63527 63528 63525 63530 63531 63532 63529 63534 63535 63536 63533 63538 63539 63540 63537 63542 63543 63544 63541 63546 63547 63548 63545 63550 63551 63552 63549 63554 63555 63556 63553 63558 63559 63560 63557 63562 63563 63564 63561 63566 63567 63568 63565 63570 63571 63572 63569 63574 63575 63576 63573 63578 63579 63580 63577 63582 63583 63584 63581 63586 63587 63588 63585 63590 63591 63592 63589 63594 63595 63596 63593 63598 63599 63600 63597 63602 63603 63604 63601 63606 63607 63608 63605 63610 63611 63612 63609 63614 63615 63616 63613 63618 63619 63620 63617 63622 63623 63624 63621 63626 63627 63628 63625 63630 63631 63632 63629 63634 63635 63636 63633 63638 63639 63640 63637 63642 63643 63644 63641 63646 63647 63648 63645 63650 63651 63652 63649 63654 63655 63656 63653 63658 63659 63660 63657 63662 63663 63664 63661 63666 63667 63668 63665 63670 63671 63672 63669 63674 63675 63676 63673 63678 63679 63680 63677 63682 63683 63684 63681 63686 63687 63688 63685 63690 63691 63692 63689 63694 63695 63696 63693 63698 63699 63700 63697 63702 63703 63704 63701 63706 63707 63708 63705 63710 63711 63712 63709 63714 63715 63716 63713 63718 63719 63720 63717 63722 63723 63724 63721 63726 63727 63728 63725 63730 63731 63732 63729 63734 63735 63736 63733 63738 63739 63740 63737 63742 63743 63744 63741 63746 63747 63748 63745 63750 63751 63752 63749 63754 63755 63756 63753 63758 63759 63760 63757 63762 63763 63764 63761 63766 63767 63768 63765 63770 63771 63772 63769 63774 63775 63776 63773 63778 63779 63780 63777 63782 63783 63784 63781 63786 63787 63788 63785 63790 63791 63792 63789 63794 63795 63796 63793 63798 63799 63800 63797 63802 63803 63804 63801 63806 63807 63808 63805 63810 63811 63812 63809 63814 63815 63816 63813 63818 63819 63820 63817 63822 63823 63824 63821 63826 63827 63828 63825 63830 63831 63832 63829 63834 63835 63836 63833 63838 63839 63840 63837 63842 63843 63844 63841 63846 63847 63848 63845 63850 63851 63852 63849 63854 63855 63856 63853 63858 63859 63860 63857 63862 63863 63864 63861 63866 63867 63868 63865 63870 63871 63872 63869 63874 63875 63876 63873 63878 63879 63880 63877 63882 63883 63884 63881 63886 63887 63888 63885 63890 63891 63892 63889 63894 63895 63896 63893 63898 63899 63900 63897 63902 63903 63904 63901 63906 63907 63908 63905 63910 63911 63912 63909 63914 63915 63916 63913 63918 63919 63920 63917 63922 63923 63924 63921 63926 63927 63928 63925 63930 63931 63932 63929 63934 63935 63936 63933 63938 63939 63940 63937 63942 63943 63944 63941 63946 63947 63948 63945 63950 63951 63952 63949 63954 63955 63956 63953 63958 63959 63960 63957 63962 63963 63964 63961 63966 63967 63968 63965 63970 63971 63972 63969 63974 63975 63976 63973 63978 63979 63980 63977 63982 63983 63984 63981 63986 63987 63988 63985 63990 63991 63992 63989 63994 63995 63996 63993 63998 63999 64000 63997 64002 64003 64004 64001 64006 64007 64008 64005 64010 64011 64012 64009 64014 64015 64016 64013 64018 64019 64020 64017 64022 64023 64024 64021 64026 64027 64028 64025 64030 64031 64032 64029 64034 64035 64036 64033 64038 64039 64040 64037 64042 64043 64044 64041 64046 64047 64048 64045 64050 64051 64052 64049 64054 64055 64056 64053 64058 64059 64060 64057 64062 64063 64064 64061 64066 64067 64068 64065 64070 64071 64072 64069 64074 64075 64076 64073 64078 64079 64080 64077 64082 64083 64084 64081 64086 64087 64088 64085 64090 64091 64092 64089 64094 64095 64096 64093 64098 64099 64100 64097 64102 64103 64104 64101 64106 64107 64108 64105 64110 64111 64112 64109 64114 64115 64116 64113 64118 64119 64120 64117 64122 64123 64124 64121 64126 64127 64128 64125 64130 64131 64132 64129 64134 64135 64136 64133 64138 64139 64140 64137 64142 64143 64144 64141 64146 64147 64148 64145 64150 64151 64152 64149 64154 64155 64156 64153 64158 64159 64160 64157 64162 64163 64164 64161 64166 64167 64168 64165 64170 64171 64172 64169 64174 64175 64176 64173 64178 64179 64180 64177 64182 64183 64184 64181 64186 64187 64188 64185 64190 64191 64192 64189 64194 64195 64196 64193 64198 64199 64200 64197 64202 64203 64204 64201 64206 64207 64208 64205 64210 64211 64212 64209 64214 64215 64216 64213 64218 64219 64220 64217 64222 64223 64224 64221 64226 64227 64228 64225 64230 64231 64232 64229 64234 64235 64236 64233 64238 64239 64240 64237 64242 64243 64244 64241 64246 64247 64248 64245 64250 64251 64252 64249 64254 64255 64256 64253 64258 64259 64260 64257 64262 64263 64264 64261 64266 64267 64268 64265 64270 64271 64272 64269 64274 64275 64276 64273 64278 64279 64280 64277 64282 64283 64284 64281 64286 64287 64288 64285 64290 64291 64292 64289 64294 64295 64296 64293 64298 64299 64300 64297 64302 64303 64304 64301 64306 64307 64308 64305 64310 64311 64312 64309 64314 64315 64316 64313 64318 64319 64320 64317 64322 64323 64324 64321 64326 64327 64328 64325 64330 64331 64332 64329 64334 64335 64336 64333 64338 64339 64340 64337 64342 64343 64344 64341 64346 64347 64348 64345 64350 64351 64352 64349 64354 64355 64356 64353 64358 64359 64360 64357 64362 64363 64364 64361 64366 64367 64368 64365 64370 64371 64372 64369 64374 64375 64376 64373 64378 64379 64380 64377 64382 64383 64384 64381 64386 64387 64388 64385 64390 64391 64392 64389 64394 64395 64396 64393 64398 64399 64400 64397 64402 64403 64404 64401 64406 64407 64408 64405 64410 64411 64412 64409 64414 64415 64416 64413 64418 64419 64420 64417 64422 64423 64424 64421 64426 64427 64428 64425 64430 64431 64432 64429 64434 64435 64436 64433 64438 64439 64440 64437 64442 64443 64444 64441 64446 64447 64448 64445 64450 64451 64452 64449 64454 64455 64456 64453 64458 64459 64460 64457 64462 64463 64464 64461 64466 64467 64468 64465 64470 64471 64472 64469 64474 64475 64476 64473 64478 64479 64480 64477 64482 64483 64484 64481 64486 64487 64488 64485 64490 64491 64492 64489 64494 64495 64496 64493 64498 64499 64500 64497 64502 64503 64504 64501 64506 64507 64508 64505 64510 64511 64512 64509 64514 64515 64516 64513 64518 64519 64520 64517 64522 64523 64524 64521 64526 64527 64528 64525 64530 64531 64532 64529 64534 64535 64536 64533 64538 64539 64540 64537 64542 64543 64544 64541 64546 64547 64548 64545 64550 64551 64552 64549 64554 64555 64556 64553 64558 64559 64560 64557 64562 64563 64564 64561 64566 64567 64568 64565 64570 64571 64572 64569 64574 64575 64576 64573 64578 64579 64580 64577 64582 64583 64584 64581 64586 64587 64588 64585 64590 64591 64592 64589 64594 64595 64596 64593 64598 64599 64600 64597 64602 64603 64604 64601 64606 64607 64608 64605 64610 64611 64612 64609 64614 64615 64616 64613 64618 64619 64620 64617 64622 64623 64624 64621 64626 64627 64628 64625 64630 64631 64632 64629 64634 64635 64636 64633 64638 64639 64640 64637 64642 64643 64644 64641 64646 64647 64648 64645 64650 64651 64652 64649 64654 64655 64656 64653 64658 64659 64660 64657 64662 64663 64664 64661 64666 64667 64668 64665 64670 64671 64672 64669 64674 64675 64676 64673 64678 64679 64680 64677 64682 64683 64684 64681 64686 64687 64688 64685 64690 64691 64692 64689 64694 64695 64696 64693 64698 64699 64700 64697 64702 64703 64704 64701 64706 64707 64708 64705 64710 64711 64712 64709 64714 64715 64716 64713 64718 64719 64720 64717 64722 64723 64724 64721 64726 64727 64728 64725 64730 64731 64732 64729 64734 64735 64736 64733 64738 64739 64740 64737 64742 64743 64744 64741 64746 64747 64748 64745 64750 64751 64752 64749 64754 64755 64756 64753 64758 64759 64760 64757 64762 64763 64764 64761 64766 64767 64768 64765 64770 64771 64772 64769 64774 64775 64776 64773 64778 64779 64780 64777 64782 64783 64784 64781 64786 64787 64788 64785 64790 64791 64792 64789 64794 64795 64796 64793 64798 64799 64800 64797 64802 64803 64804 64801 64806 64807 64808 64805 64810 64811 64812 64809 64814 64815 64816 64813 64818 64819 64820 64817 64822 64823 64824 64821 64826 64827 64828 64825 64830 64831 64832 64829 64834 64835 64836 64833 64838 64839 64840 64837 64842 64843 64844 64841 64846 64847 64848 64845 64850 64851 64852 64849 64854 64855 64856 64853 64858 64859 64860 64857 64862 64863 64864 64861 64866 64867 64868 64865 64870 64871 64872 64869 64874 64875 64876 64873 64878 64879 64880 64877 64882 64883 64884 64881 64886 64887 64888 64885 64890 64891 64892 64889 64894 64895 64896 64893 64898 64899 64900 64897 64902 64903 64904 64901 64906 64907 64908 64905 64910 64911 64912 64909 64914 64915 64916 64913 64918 64919 64920 64917 64922 64923 64924 64921 64926 64927 64928 64925 64930 64931 64932 64929 64934 64935 64936 64933 64938 64939 64940 64937 64942 64943 64944 64941 64946 64947 64948 64945 64950 64951 64952 64949 64954 64955 64956 64953 64958 64959 64960 64957 64962 64963 64964 64961 64966 64967 64968 64965 64970 64971 64972 64969 64974 64975 64976 64973 64978 64979 64980 64977 64982 64983 64984 64981 64986 64987 64988 64985 64990 64991 64992 64989 64994 64995 64996 64993 64998 64999 65000 64997 65002 65003 65004 65001 65006 65007 65008 65005 65010 65011 65012 65009 65014 65015 65016 65013 65018 65019 65020 65017 65022 65023 65024 65021 65026 65027 65028 65025 65030 65031 65032 65029 65034 65035 65036 65033 65038 65039 65040 65037 65042 65043 65044 65041 65046 65047 65048 65045 65050 65051 65052 65049 65054 65055 65056 65053 65058 65059 65060 65057 65062 65063 65064 65061 65066 65067 65068 65065 65070 65071 65072 65069 65074 65075 65076 65073 65078 65079 65080 65077 65082 65083 65084 65081 65086 65087 65088 65085 65090 65091 65092 65089 65094 65095 65096 65093 65098 65099 65100 65097 65102 65103 65104 65101 65106 65107 65108 65105 65110 65111 65112 65109 65114 65115 65116 65113 65118 65119 65120 65117 65122 65123 65124 65121 65126 65127 65128 65125 65130 65131 65132 65129 65134 65135 65136 65133 65138 65139 65140 65137 65142 65143 65144 65141 65146 65147 65148 65145 65150 65151 65152 65149 65154 65155 65156 65153 65158 65159 65160 65157 65162 65163 65164 65161 65166 65167 65168 65165 65170 65171 65172 65169 65174 65175 65176 65173 65178 65179 65180 65177 65182 65183 65184 65181 65186 65187 65188 65185 65190 65191 65192 65189 65194 65195 65196 65193 65198 65199 65200 65197 65202 65203 65204 65201 65206 65207 65208 65205 65210 65211 65212 65209 65214 65215 65216 65213 65218 65219 65220 65217 65222 65223 65224 65221 65226 65227 65228 65225 65230 65231 65232 65229 65234 65235 65236 65233 65238 65239 65240 65237 65242 65243 65244 65241 65246 65247 65248 65245 65250 65251 65252 65249 65254 65255 65256 65253 65258 65259 65260 65257 65262 65263 65264 65261 65266 65267 65268 65265 65270 65271 65272 65269 65274 65275 65276 65273 65278 65279 65280 65277 65282 65283 65284 65281 65286 65287 65288 65285 65290 65291 65292 65289 65294 65295 65296 65293 65298 65299 65300 65297 65302 65303 65304 65301 65306 65307 65308 65305 65310 65311 65312 65309 65314 65315 65316 65313 65318 65319 65320 65317 65322 65323 65324 65321 65326 65327 65328 65325 65330 65331 65332 65329 65334 65335 65336 65333 65338 65339 65340 65337 65342 65343 65344 65341 65346 65347 65348 65345 65350 65351 65352 65349 65354 65355 65356 65353 65358 65359 65360 65357 65362 65363 65364 65361 65366 65367 65368 65365 65370 65371 65372 65369 65374 65375 65376 65373 65378 65379 65380 65377 65382 65383 65384 65381 65386 65387 65388 65385 65390 65391 65392 65389 65394 65395 65396 65393 65398 65399 65400 65397 65402 65403 65404 65401 65406 65407 65408 65405 65410 65411 65412 65409 65414 65415 65416 65413 65418 65419 65420 65417 65422 65423 65424 65421 65426 65427 65428 65425 65430 65431 65432 65429 65434 65435 65436 65433 65438 65439 65440 65437 65442 65443 65444 65441 65446 65447 65448 65445 65450 65451 65452 65449 65454 65455 65456 65453 65458 65459 65460 65457 65462 65463 65464 65461 65466 65467 65468 65465 65470 65471 65472 65469 65474 65475 65476 65473 65478 65479 65480 65477 65482 65483 65484 65481 65486 65487 65488 65485 65490 65491 65492 65489 65494 65495 65496 65493 65498 65499 65500 65497 65502 65503 65504 65501 65506 65507 65508 65505 65510 65511 65512 65509 65514 65515 65516 65513 65518 65519 65520 65517 65522 65523 65524 65521 65526 65527 65528 65525 65530 65531 65532 65529 65534 65535 65536 65533 65538 65539 65540 65537 65542 65543 65544 65541 65546 65547 65548 65545 65550 65551 65552 65549 65554 65555 65556 65553 65558 65559 65560 65557 65562 65563 65564 65561 65566 65567 65568 65565 65570 65571 65572 65569 65574 65575 65576 65573 65578 65579 65580 65577 65582 65583 65584 65581 65586 65587 65588 65585 65590 65591 65592 65589 65594 65595 65596 65593 65598 65599 65600 65597 65602 65603 65604 65601 65606 65607 65608 65605 65610 65611 65612 65609 65614 65615 65616 65613 65618 65619 65620 65617 65622 65623 65624 65621 65626 65627 65628 65625 65630 65631 65632 65629 65634 65635 65636 65633 65638 65639 65640 65637 65642 65643 65644 65641 65646 65647 65648 65645 65650 65651 65652 65649 65654 65655 65656 65653 65658 65659 65660 65657 65662 65663 65664 65661 65666 65667 65668 65665 65670 65671 65672 65669 65674 65675 65676 65673 65678 65679 65680 65677 65682 65683 65684 65681 65686 65687 65688 65685 65690 65691 65692 65689 65694 65695 65696 65693 65698 65699 65700 65697 65702 65703 65704 65701 65706 65707 65708 65705 65710 65711 65712 65709 65714 65715 65716 65713 65718 65719 65720 65717 65722 65723 65724 65721 65726 65727 65728 65725 65730 65731 65732 65729 65734 65735 65736 65733 65738 65739 65740 65737 65742 65743 65744 65741 65746 65747 65748 65745 65750 65751 65752 65749 65754 65755 65756 65753 65758 65759 65760 65757 65762 65763 65764 65761 65766 65767 65768 65765 65770 65771 65772 65769 65774 65775 65776 65773 65778 65779 65780 65777 65782 65783 65784 65781 65786 65787 65788 65785 65790 65791 65792 65789 65794 65795 65796 65793 65798 65799 65800 65797 65802 65803 65804 65801 65806 65807 65808 65805 65810 65811 65812 65809 65814 65815 65816 65813 65818 65819 65820 65817 65822 65823 65824 65821 65826 65827 65828 65825 65830 65831 65832 65829 65834 65835 65836 65833 65838 65839 65840 65837 65842 65843 65844 65841 65846 65847 65848 65845 65850 65851 65852 65849 65854 65855 65856 65853 65858 65859 65860 65857 65862 65863 65864 65861 65866 65867 65868 65865 65870 65871 65872 65869 65874 65875 65876 65873 65878 65879 65880 65877 65882 65883 65884 65881 65886 65887 65888 65885 65890 65891 65892 65889 65894 65895 65896 65893 65898 65899 65900 65897 65902 65903 65904 65901 65906 65907 65908 65905 65910 65911 65912 65909 65914 65915 65916 65913 65918 65919 65920 65917 65922 65923 65924 65921 65926 65927 65928 65925 65930 65931 65932 65929 65934 65935 65936 65933 65938 65939 65940 65937 65942 65943 65944 65941 65946 65947 65948 65945 65950 65951 65952 65949 65954 65955 65956 65953 65958 65959 65960 65957 65962 65963 65964 65961 65966 65967 65968 65965 65970 65971 65972 65969 65974 65975 65976 65973 65978 65979 65980 65977 65982 65983 65984 65981 65986 65987 65988 65985 65990 65991 65992 65989 65994 65995 65996 65993 65998 65999 66000 65997 66002 66003 66004 66001 66006 66007 66008 66005 66010 66011 66012 66009 66014 66015 66016 66013 66018 66019 66020 66017 66022 66023 66024 66021 66026 66027 66028 66025 66030 66031 66032 66029 66034 66035 66036 66033 66038 66039 66040 66037 66042 66043 66044 66041 66046 66047 66048 66045 66050 66051 66052 66049 66054 66055 66056 66053 66058 66059 66060 66057 66062 66063 66064 66061 66066 66067 66068 66065 66070 66071 66072 66069 66074 66075 66076 66073 66078 66079 66080 66077 66082 66083 66084 66081 66086 66087 66088 66085 66090 66091 66092 66089 66094 66095 66096 66093 66098 66099 66100 66097 66102 66103 66104 66101 66106 66107 66108 66105 66110 66111 66112 66109 66114 66115 66116 66113 66118 66119 66120 66117 66122 66123 66124 66121 66126 66127 66128 66125 66130 66131 66132 66129 66134 66135 66136 66133 66138 66139 66140 66137 66142 66143 66144 66141 66146 66147 66148 66145 66150 66151 66152 66149 66154 66155 66156 66153 66158 66159 66160 66157 66162 66163 66164 66161 66166 66167 66168 66165 66170 66171 66172 66169 66174 66175 66176 66173 66178 66179 66180 66177 66182 66183 66184 66181 66186 66187 66188 66185 66190 66191 66192 66189 66194 66195 66196 66193 66198 66199 66200 66197 66202 66203 66204 66201 66206 66207 66208 66205 66210 66211 66212 66209 66214 66215 66216 66213 66218 66219 66220 66217 66222 66223 66224 66221 66226 66227 66228 66225 66230 66231 66232 66229 66234 66235 66236 66233 66238 66239 66240 66237 66242 66243 66244 66241 66246 66247 66248 66245 66250 66251 66252 66249 66254 66255 66256 66253 66258 66259 66260 66257 66262 66263 66264 66261 66266 66267 66268 66265 66270 66271 66272 66269 66274 66275 66276 66273 66278 66279 66280 66277 66282 66283 66284 66281 66286 66287 66288 66285 66290 66291 66292 66289 66294 66295 66296 66293 66298 66299 66300 66297 66302 66303 66304 66301 66306 66307 66308 66305 66310 66311 66312 66309 66314 66315 66316 66313 66318 66319 66320 66317 66322 66323 66324 66321 66326 66327 66328 66325 66330 66331 66332 66329 66334 66335 66336 66333 66338 66339 66340 66337 66342 66343 66344 66341 66346 66347 66348 66345 66350 66351 66352 66349 66354 66355 66356 66353 66358 66359 66360 66357 66362 66363 66364 66361 66366 66367 66368 66365 66370 66371 66372 66369 66374 66375 66376 66373 66378 66379 66380 66377 66382 66383 66384 66381 66386 66387 66388 66385 66390 66391 66392 66389 66394 66395 66396 66393 66398 66399 66400 66397 66402 66403 66404 66401 66406 66407 66408 66405 66410 66411 66412 66409 66414 66415 66416 66413 66418 66419 66420 66417 66422 66423 66424 66421 66426 66427 66428 66425 66430 66431 66432 66429 66434 66435 66436 66433 66438 66439 66440 66437 66442 66443 66444 66441 66446 66447 66448 66445 66450 66451 66452 66449 66454 66455 66456 66453 66458 66459 66460 66457 66462 66463 66464 66461 66466 66467 66468 66465 66470 66471 66472 66469 66474 66475 66476 66473 66478 66479 66480 66477 66482 66483 66484 66481 66486 66487 66488 66485 66490 66491 66492 66489 66494 66495 66496 66493 66498 66499 66500 66497 66502 66503 66504 66501 66506 66507 66508 66505 66510 66511 66512 66509 66514 66515 66516 66513 66518 66519 66520 66517 66522 66523 66524 66521 66526 66527 66528 66525 66530 66531 66532 66529 66534 66535 66536 66533 66538 66539 66540 66537 66542 66543 66544 66541 66546 66547 66548 66545 66550 66551 66552 66549 66554 66555 66556 66553 66558 66559 66560 66557 66562 66563 66564 66561 66566 66567 66568 66565 66570 66571 66572 66569 66574 66575 66576 66573 66578 66579 66580 66577 66582 66583 66584 66581 66586 66587 66588 66585 66590 66591 66592 66589 66594 66595 66596 66593 66598 66599 66600 66597 66602 66603 66604 66601 66606 66607 66608 66605 66610 66611 66612 66609 66614 66615 66616 66613 66618 66619 66620 66617 66622 66623 66624 66621 66626 66627 66628 66625 66630 66631 66632 66629 66634 66635 66636 66633 66638 66639 66640 66637 66642 66643 66644 66641 66646 66647 66648 66645 66650 66651 66652 66649 66654 66655 66656 66653 66658 66659 66660 66657 66662 66663 66664 66661 66666 66667 66668 66665 66670 66671 66672 66669 66674 66675 66676 66673 66678 66679 66680 66677 66682 66683 66684 66681 66686 66687 66688 66685 66690 66691 66692 66689 66694 66695 66696 66693 66698 66699 66700 66697 66702 66703 66704 66701 66706 66707 66708 66705 66710 66711 66712 66709 66714 66715 66716 66713 66718 66719 66720 66717 66722 66723 66724 66721 66726 66727 66728 66725 66730 66731 66732 66729 66734 66735 66736 66733 66738 66739 66740 66737 66742 66743 66744 66741 66746 66747 66748 66745 66750 66751 66752 66749 66754 66755 66756 66753 66758 66759 66760 66757 66762 66763 66764 66761 66766 66767 66768 66765 66770 66771 66772 66769 66774 66775 66776 66773 66778 66779 66780 66777 66782 66783 66784 66781 66786 66787 66788 66785 66790 66791 66792 66789 66794 66795 66796 66793 66798 66799 66800 66797 66802 66803 66804 66801 66806 66807 66808 66805 66810 66811 66812 66809 66814 66815 66816 66813 66818 66819 66820 66817 66822 66823 66824 66821 66826 66827 66828 66825 66830 66831 66832 66829 66834 66835 66836 66833 66838 66839 66840 66837 66842 66843 66844 66841 66846 66847 66848 66845 66850 66851 66852 66849 66854 66855 66856 66853 66858 66859 66860 66857 66862 66863 66864 66861 66866 66867 66868 66865 66870 66871 66872 66869 66874 66875 66876 66873 66878 66879 66880 66877 66882 66883 66884 66881 66886 66887 66888 66885 66890 66891 66892 66889 66894 66895 66896 66893 66898 66899 66900 66897 66902 66903 66904 66901 66906 66907 66908 66905 66910 66911 66912 66909 66914 66915 66916 66913 66918 66919 66920 66917 66922 66923 66924 66921 66926 66927 66928 66925 66930 66931 66932 66929 66934 66935 66936 66933 66938 66939 66940 66937 66942 66943 66944 66941 66946 66947 66948 66945 66950 66951 66952 66949 66954 66955 66956 66953 66958 66959 66960 66957 66962 66963 66964 66961 66966 66967 66968 66965 66970 66971 66972 66969 66974 66975 66976 66973 66978 66979 66980 66977 66982 66983 66984 66981 66986 66987 66988 66985 66990 66991 66992 66989 66994 66995 66996 66993 66998 66999 67000 66997 67002 67003 67004 67001 67006 67007 67008 67005 67010 67011 67012 67009 67014 67015 67016 67013 67018 67019 67020 67017 67022 67023 67024 67021 67026 67027 67028 67025 67030 67031 67032 67029 67034 67035 67036 67033 67038 67039 67040 67037 67042 67043 67044 67041 67046 67047 67048 67045 67050 67051 67052 67049 67054 67055 67056 67053 67058 67059 67060 67057 67062 67063 67064 67061 67066 67067 67068 67065 67070 67071 67072 67069 67074 67075 67076 67073 67078 67079 67080 67077 67082 67083 67084 67081 67086 67087 67088 67085 67090 67091 67092 67089 67094 67095 67096 67093 67098 67099 67100 67097 67102 67103 67104 67101 67106 67107 67108 67105 67110 67111 67112 67109 67114 67115 67116 67113 67118 67119 67120 67117 67122 67123 67124 67121 67126 67127 67128 67125 67130 67131 67132 67129 67134 67135 67136 67133 67138 67139 67140 67137 67142 67143 67144 67141 67146 67147 67148 67145 67150 67151 67152 67149 67154 67155 67156 67153 67158 67159 67160 67157 67162 67163 67164 67161 67166 67167 67168 67165 67170 67171 67172 67169 67174 67175 67176 67173 67178 67179 67180 67177 67182 67183 67184 67181 67186 67187 67188 67185 67190 67191 67192 67189 67194 67195 67196 67193 67198 67199 67200 67197 67202 67203 67204 67201 67206 67207 67208 67205 67210 67211 67212 67209 67214 67215 67216 67213 67218 67219 67220 67217 67222 67223 67224 67221 67226 67227 67228 67225 67230 67231 67232 67229 67234 67235 67236 67233 67238 67239 67240 67237 67242 67243 67244 67241 67246 67247 67248 67245 67250 67251 67252 67249 67254 67255 67256 67253 67258 67259 67260 67257 67262 67263 67264 67261 67266 67267 67268 67265 67270 67271 67272 67269 67274 67275 67276 67273 67278 67279 67280 67277 67282 67283 67284 67281 67286 67287 67288 67285 67290 67291 67292 67289 67294 67295 67296 67293 67298 67299 67300 67297 67302 67303 67304 67301 67306 67307 67308 67305 67310 67311 67312 67309 67314 67315 67316 67313 67318 67319 67320 67317 67322 67323 67324 67321 67326 67327 67328 67325 67330 67331 67332 67329 67334 67335 67336 67333 67338 67339 67340 67337 67342 67343 67344 67341 67346 67347 67348 67345 67350 67351 67352 67349 67354 67355 67356 67353 67358 67359 67360 67357 67362 67363 67364 67361 67366 67367 67368 67365 67370 67371 67372 67369 67374 67375 67376 67373 67378 67379 67380 67377 67382 67383 67384 67381 67386 67387 67388 67385 67390 67391 67392 67389 67394 67395 67396 67393 67398 67399 67400 67397 67402 67403 67404 67401 67406 67407 67408 67405 67410 67411 67412 67409 67414 67415 67416 67413 67418 67419 67420 67417 67422 67423 67424 67421 67426 67427 67428 67425 67430 67431 67432 67429 67434 67435 67436 67433 67438 67439 67440 67437 67442 67443 67444 67441 67446 67447 67448 67445 67450 67451 67452 67449 67454 67455 67456 67453 67458 67459 67460 67457 67462 67463 67464 67461 67466 67467 67468 67465 67470 67471 67472 67469 67474 67475 67476 67473 67478 67479 67480 67477 67482 67483 67484 67481 67486 67487 67488 67485 67490 67491 67492 67489 67494 67495 67496 67493 67498 67499 67500 67497 67502 67503 67504 67501 67506 67507 67508 67505 67510 67511 67512 67509 67514 67515 67516 67513 67518 67519 67520 67517 67522 67523 67524 67521 67526 67527 67528 67525 67530 67531 67532 67529 67534 67535 67536 67533 67538 67539 67540 67537 67542 67543 67544 67541 67546 67547 67548 67545 67550 67551 67552 67549 67554 67555 67556 67553 67558 67559 67560 67557 67562 67563 67564 67561 67566 67567 67568 67565 67570 67571 67572 67569 67574 67575 67576 67573 67578 67579 67580 67577 67582 67583 67584 67581 67586 67587 67588 67585 67590 67591 67592 67589 67594 67595 67596 67593 67598 67599 67600 67597 67602 67603 67604 67601 67606 67607 67608 67605 67610 67611 67612 67609 67614 67615 67616 67613 67618 67619 67620 67617 67622 67623 67624 67621 67626 67627 67628 67625 67630 67631 67632 67629 67634 67635 67636 67633 67638 67639 67640 67637 67642 67643 67644 67641 67646 67647 67648 67645 67650 67651 67652 67649 67654 67655 67656 67653 67658 67659 67660 67657 67662 67663 67664 67661 67666 67667 67668 67665 67670 67671 67672 67669 67674 67675 67676 67673 67678 67679 67680 67677 67682 67683 67684 67681 67686 67687 67688 67685 67690 67691 67692 67689 67694 67695 67696 67693 67698 67699 67700 67697 67702 67703 67704 67701 67706 67707 67708 67705 67710 67711 67712 67709 67714 67715 67716 67713 67718 67719 67720 67717 67722 67723 67724 67721 67726 67727 67728 67725 67730 67731 67732 67729 67734 67735 67736 67733 67738 67739 67740 67737 67742 67743 67744 67741 67746 67747 67748 67745 67750 67751 67752 67749 67754 67755 67756 67753 67758 67759 67760 67757 67762 67763 67764 67761 67766 67767 67768 67765 67770 67771 67772 67769 67774 67775 67776 67773 67778 67779 67780 67777 67782 67783 67784 67781 67786 67787 67788 67785 67790 67791 67792 67789 67794 67795 67796 67793 67798 67799 67800 67797 67802 67803 67804 67801 67806 67807 67808 67805 67810 67811 67812 67809 67814 67815 67816 67813 67818 67819 67820 67817 67822 67823 67824 67821 67826 67827 67828 67825 67830 67831 67832 67829 67834 67835 67836 67833 67838 67839 67840 67837 67842 67843 67844 67841 67846 67847 67848 67845 67850 67851 67852 67849 67854 67855 67856 67853 67858 67859 67860 67857 67862 67863 67864 67861 67866 67867 67868 67865 67870 67871 67872 67869 67874 67875 67876 67873 67878 67879 67880 67877 67882 67883 67884 67881 67886 67887 67888 67885 67890 67891 67892 67889 67894 67895 67896 67893 67898 67899 67900 67897 67902 67903 67904 67901 67906 67907 67908 67905 67910 67911 67912 67909 67914 67915 67916 67913 67918 67919 67920 67917 67922 67923 67924 67921 67926 67927 67928 67925 67930 67931 67932 67929 67934 67935 67936 67933 67938 67939 67940 67937 67942 67943 67944 67941 67946 67947 67948 67945 67950 67951 67952 67949 67954 67955 67956 67953 67958 67959 67960 67957 67962 67963 67964 67961 67966 67967 67968 67965 67970 67971 67972 67969 67974 67975 67976 67973 67978 67979 67980 67977 67982 67983 67984 67981 67986 67987 67988 67985 67990 67991 67992 67989 67994 67995 67996 67993 67998 67999 68000 67997 68002 68003 68004 68001 68006 68007 68008 68005 68010 68011 68012 68009 68014 68015 68016 68013 68018 68019 68020 68017 68022 68023 68024 68021 68026 68027 68028 68025 68030 68031 68032 68029 68034 68035 68036 68033 68038 68039 68040 68037 68042 68043 68044 68041 68046 68047 68048 68045 68050 68051 68052 68049 68054 68055 68056 68053 68058 68059 68060 68057 68062 68063 68064 68061 68066 68067 68068 68065 68070 68071 68072 68069 68074 68075 68076 68073 68078 68079 68080 68077 68082 68083 68084 68081 68086 68087 68088 68085 68090 68091 68092 68089 68094 68095 68096 68093 68098 68099 68100 68097 68102 68103 68104 68101 68106 68107 68108 68105 68110 68111 68112 68109 68114 68115 68116 68113 68118 68119 68120 68117 68122 68123 68124 68121 68126 68127 68128 68125 68130 68131 68132 68129 68134 68135 68136 68133 68138 68139 68140 68137 68142 68143 68144 68141 68146 68147 68148 68145 68150 68151 68152 68149 68154 68155 68156 68153 68158 68159 68160 68157 68162 68163 68164 68161 68166 68167 68168 68165 68170 68171 68172 68169 68174 68175 68176 68173 68178 68179 68180 68177 68182 68183 68184 68181 68186 68187 68188 68185 68190 68191 68192 68189 68194 68195 68196 68193 68198 68199 68200 68197 68202 68203 68204 68201 68206 68207 68208 68205 68210 68211 68212 68209 68214 68215 68216 68213 68218 68219 68220 68217 68222 68223 68224 68221 68226 68227 68228 68225 68230 68231 68232 68229 68234 68235 68236 68233 68238 68239 68240 68237 68242 68243 68244 68241 68246 68247 68248 68245 68250 68251 68252 68249 68254 68255 68256 68253 68258 68259 68260 68257 68262 68263 68264 68261 68266 68267 68268 68265 68270 68271 68272 68269 68274 68275 68276 68273 68278 68279 68280 68277 68282 68283 68284 68281 68286 68287 68288 68285 68290 68291 68292 68289 68294 68295 68296 68293 68298 68299 68300 68297 68302 68303 68304 68301 68306 68307 68308 68305 68310 68311 68312 68309 68314 68315 68316 68313 68318 68319 68320 68317 68322 68323 68324 68321 68326 68327 68328 68325 68330 68331 68332 68329 68334 68335 68336 68333 68338 68339 68340 68337 68342 68343 68344 68341 68346 68347 68348 68345 68350 68351 68352 68349 68354 68355 68356 68353 68358 68359 68360 68357 68362 68363 68364 68361 68366 68367 68368 68365 68370 68371 68372 68369 68374 68375 68376 68373 68378 68379 68380 68377 68382 68383 68384 68381 68386 68387 68388 68385 68390 68391 68392 68389 68394 68395 68396 68393 68398 68399 68400 68397 68402 68403 68404 68401 68406 68407 68408 68405 68410 68411 68412 68409 68414 68415 68416 68413 68418 68419 68420 68417 68422 68423 68424 68421 68426 68427 68428 68425 68430 68431 68432 68429 68434 68435 68436 68433 68438 68439 68440 68437 68442 68443 68444 68441 68446 68447 68448 68445 68450 68451 68452 68449 68454 68455 68456 68453 68458 68459 68460 68457 68462 68463 68464 68461 68466 68467 68468 68465 68470 68471 68472 68469 68474 68475 68476 68473 68478 68479 68480 68477 68482 68483 68484 68481 68486 68487 68488 68485 68490 68491 68492 68489 68494 68495 68496 68493 68498 68499 68500 68497 68502 68503 68504 68501 68506 68507 68508 68505 68510 68511 68512 68509 68514 68515 68516 68513 68518 68519 68520 68517 68522 68523 68524 68521 68526 68527 68528 68525 68530 68531 68532 68529 68534 68535 68536 68533 68538 68539 68540 68537 68542 68543 68544 68541 68546 68547 68548 68545 68550 68551 68552 68549 68554 68555 68556 68553 68558 68559 68560 68557 68562 68563 68564 68561 68566 68567 68568 68565 68570 68571 68572 68569 68574 68575 68576 68573 68578 68579 68580 68577 68582 68583 68584 68581 68586 68587 68588 68585 68590 68591 68592 68589 68594 68595 68596 68593 68598 68599 68600 68597 68602 68603 68604 68601 68606 68607 68608 68605 68610 68611 68612 68609 68614 68615 68616 68613 68618 68619 68620 68617 68622 68623 68624 68621 68626 68627 68628 68625 68630 68631 68632 68629 68634 68635 68636 68633 68638 68639 68640 68637 68642 68643 68644 68641 68646 68647 68648 68645 68650 68651 68652 68649 68654 68655 68656 68653 68658 68659 68660 68657 68662 68663 68664 68661 68666 68667 68668 68665 68670 68671 68672 68669 68674 68675 68676 68673 68678 68679 68680 68677 68682 68683 68684 68681 68686 68687 68688 68685 68690 68691 68692 68689 68694 68695 68696 68693 68698 68699 68700 68697 68702 68703 68704 68701 68706 68707 68708 68705 68710 68711 68712 68709 68714 68715 68716 68713 68718 68719 68720 68717 68722 68723 68724 68721 68726 68727 68728 68725 68730 68731 68732 68729 68734 68735 68736 68733 68738 68739 68740 68737 68742 68743 68744 68741 68746 68747 68748 68745 68750 68751 68752 68749 68754 68755 68756 68753 68758 68759 68760 68757 68762 68763 68764 68761 68766 68767 68768 68765 68770 68771 68772 68769 68774 68775 68776 68773 68778 68779 68780 68777 68782 68783 68784 68781 68786 68787 68788 68785 68790 68791 68792 68789 68794 68795 68796 68793 68798 68799 68800 68797 68802 68803 68804 68801 68806 68807 68808 68805 68810 68811 68812 68809 68814 68815 68816 68813 68818 68819 68820 68817 68822 68823 68824 68821 68826 68827 68828 68825 68830 68831 68832 68829 68834 68835 68836 68833 68838 68839 68840 68837 68842 68843 68844 68841 68846 68847 68848 68845 68850 68851 68852 68849 68854 68855 68856 68853 68858 68859 68860 68857 68862 68863 68864 68861 68866 68867 68868 68865 68870 68871 68872 68869 68874 68875 68876 68873 68878 68879 68880 68877 68882 68883 68884 68881 68886 68887 68888 68885 68890 68891 68892 68889 68894 68895 68896 68893 68898 68899 68900 68897 68902 68903 68904 68901 68906 68907 68908 68905 68910 68911 68912 68909 68914 68915 68916 68913 68918 68919 68920 68917 68922 68923 68924 68921 68926 68927 68928 68925 68930 68931 68932 68929 68934 68935 68936 68933 68938 68939 68940 68937 68942 68943 68944 68941 68946 68947 68948 68945 68950 68951 68952 68949 68954 68955 68956 68953 68958 68959 68960 68957 68962 68963 68964 68961 68966 68967 68968 68965 68970 68971 68972 68969 68974 68975 68976 68973 68978 68979 68980 68977 68982 68983 68984 68981 68986 68987 68988 68985 68990 68991 68992 68989 68994 68995 68996 68993 68998 68999 69000 68997 69002 69003 69004 69001 69006 69007 69008 69005 69010 69011 69012 69009 69014 69015 69016 69013 69018 69019 69020 69017 69022 69023 69024 69021 69026 69027 69028 69025 69030 69031 69032 69029 69034 69035 69036 69033 69038 69039 69040 69037 69042 69043 69044 69041 69046 69047 69048 69045 69050 69051 69052 69049 69054 69055 69056 69053 69058 69059 69060 69057 69062 69063 69064 69061 69066 69067 69068 69065 69070 69071 69072 69069 69074 69075 69076 69073 69078 69079 69080 69077 69082 69083 69084 69081 69086 69087 69088 69085 69090 69091 69092 69089 69094 69095 69096 69093 69098 69099 69100 69097 69102 69103 69104 69101 69106 69107 69108 69105 69110 69111 69112 69109 69114 69115 69116 69113 69118 69119 69120 69117 69122 69123 69124 69121 69126 69127 69128 69125 69130 69131 69132 69129 69134 69135 69136 69133 69138 69139 69140 69137 69142 69143 69144 69141 69146 69147 69148 69145 69150 69151 69152 69149 69154 69155 69156 69153 69158 69159 69160 69157 69162 69163 69164 69161 69166 69167 69168 69165 69170 69171 69172 69169 69174 69175 69176 69173 69178 69179 69180 69177 69182 69183 69184 69181 69186 69187 69188 69185 69190 69191 69192 69189 69194 69195 69196 69193 69198 69199 69200 69197 69202 69203 69204 69201 69206 69207 69208 69205 69210 69211 69212 69209 69214 69215 69216 69213 69218 69219 69220 69217 69222 69223 69224 69221 69226 69227 69228 69225 69230 69231 69232 69229 69234 69235 69236 69233 69238 69239 69240 69237 69242 69243 69244 69241 69246 69247 69248 69245 69250 69251 69252 69249 69254 69255 69256 69253 69258 69259 69260 69257 69262 69263 69264 69261 69266 69267 69268 69265 69270 69271 69272 69269 69274 69275 69276 69273 69278 69279 69280 69277 69282 69283 69284 69281 69286 69287 69288 69285 69290 69291 69292 69289 69294 69295 69296 69293 69298 69299 69300 69297 69302 69303 69304 69301 69306 69307 69308 69305 69310 69311 69312 69309 69314 69315 69316 69313 69318 69319 69320 69317 69322 69323 69324 69321 69326 69327 69328 69325 69330 69331 69332 69329 69334 69335 69336 69333 69338 69339 69340 69337 69342 69343 69344 69341 69346 69347 69348 69345 69350 69351 69352 69349 69354 69355 69356 69353 69358 69359 69360 69357 69362 69363 69364 69361 69366 69367 69368 69365 69370 69371 69372 69369 69374 69375 69376 69373 69378 69379 69380 69377 69382 69383 69384 69381 69386 69387 69388 69385 69390 69391 69392 69389 69394 69395 69396 69393 69398 69399 69400 69397 69402 69403 69404 69401 69406 69407 69408 69405 69410 69411 69412 69409 69414 69415 69416 69413 69418 69419 69420 69417 69422 69423 69424 69421 69426 69427 69428 69425 69430 69431 69432 69429 69434 69435 69436 69433 69438 69439 69440 69437 69442 69443 69444 69441 69446 69447 69448 69445 69450 69451 69452 69449 69454 69455 69456 69453 69458 69459 69460 69457 69462 69463 69464 69461 69466 69467 69468 69465 69470 69471 69472 69469 69474 69475 69476 69473 69478 69479 69480 69477 69482 69483 69484 69481 69486 69487 69488 69485 69490 69491 69492 69489 69494 69495 69496 69493 69498 69499 69500 69497 69502 69503 69504 69501 69506 69507 69508 69505 69510 69511 69512 69509 69514 69515 69516 69513 69518 69519 69520 69517 69522 69523 69524 69521 69526 69527 69528 69525 69530 69531 69532 69529 69534 69535 69536 69533 69538 69539 69540 69537 69542 69543 69544 69541 69546 69547 69548 69545 69550 69551 69552 69549 69554 69555 69556 69553 69558 69559 69560 69557 69562 69563 69564 69561 69566 69567 69568 69565 69570 69571 69572 69569 69574 69575 69576 69573 69578 69579 69580 69577 69582 69583 69584 69581 69586 69587 69588 69585 69590 69591 69592 69589 69594 69595 69596 69593 69598 69599 69600 69597 69602 69603 69604 69601 69606 69607 69608 69605 69610 69611 69612 69609 69614 69615 69616 69613 69618 69619 69620 69617 69622 69623 69624 69621 69626 69627 69628 69625 69630 69631 69632 69629 69634 69635 69636 69633 69638 69639 69640 69637 69642 69643 69644 69641 69646 69647 69648 69645 69650 69651 69652 69649 69654 69655 69656 69653 69658 69659 69660 69657 69662 69663 69664 69661 69666 69667 69668 69665 69670 69671 69672 69669 69674 69675 69676 69673 69678 69679 69680 69677 69682 69683 69684 69681 69686 69687 69688 69685 69690 69691 69692 69689 69694 69695 69696 69693 69698 69699 69700 69697 69702 69703 69704 69701 69706 69707 69708 69705 69710 69711 69712 69709 69714 69715 69716 69713 69718 69719 69720 69717 69722 69723 69724 69721 69726 69727 69728 69725 69730 69731 69732 69729 69734 69735 69736 69733 69738 69739 69740 69737 69742 69743 69744 69741 69746 69747 69748 69745 69750 69751 69752 69749 69754 69755 69756 69753 69758 69759 69760 69757 69762 69763 69764 69761 69766 69767 69768 69765 69770 69771 69772 69769 69774 69775 69776 69773 69778 69779 69780 69777 69782 69783 69784 69781 69786 69787 69788 69785 69790 69791 69792 69789 69794 69795 69796 69793 69798 69799 69800 69797 69802 69803 69804 69801 69806 69807 69808 69805 69810 69811 69812 69809 69814 69815 69816 69813 69818 69819 69820 69817 69822 69823 69824 69821 69826 69827 69828 69825 69830 69831 69832 69829 69834 69835 69836 69833 69838 69839 69840 69837 69842 69843 69844 69841 69846 69847 69848 69845 69850 69851 69852 69849 69854 69855 69856 69853 69858 69859 69860 69857 69862 69863 69864 69861 69866 69867 69868 69865 69870 69871 69872 69869 69874 69875 69876 69873 69878 69879 69880 69877 69882 69883 69884 69881 69886 69887 69888 69885 69890 69891 69892 69889 69894 69895 69896 69893 69898 69899 69900 69897 69902 69903 69904 69901 69906 69907 69908 69905 69910 69911 69912 69909 69914 69915 69916 69913 69918 69919 69920 69917 69922 69923 69924 69921 69926 69927 69928 69925 69930 69931 69932 69929 69934 69935 69936 69933 69938 69939 69940 69937 69942 69943 69944 69941 69946 69947 69948 69945 69950 69951 69952 69949 69954 69955 69956 69953 69958 69959 69960 69957 69962 69963 69964 69961 69966 69967 69968 69965 69970 69971 69972 69969 69974 69975 69976 69973 69978 69979 69980 69977 69982 69983 69984 69981 69986 69987 69988 69985 69990 69991 69992 69989 69994 69995 69996 69993 69998 69999 70000 69997 70002 70003 70004 70001 70006 70007 70008 70005 70010 70011 70012 70009 70014 70015 70016 70013 70018 70019 70020 70017 70022 70023 70024 70021 70026 70027 70028 70025 70030 70031 70032 70029 70034 70035 70036 70033 70038 70039 70040 70037 70042 70043 70044 70041 70046 70047 70048 70045 70050 70051 70052 70049 70054 70055 70056 70053 70058 70059 70060 70057 70062 70063 70064 70061 70066 70067 70068 70065 70070 70071 70072 70069 70074 70075 70076 70073 70078 70079 70080 70077 70082 70083 70084 70081 70086 70087 70088 70085 70090 70091 70092 70089 70094 70095 70096 70093 70098 70099 70100 70097 70102 70103 70104 70101 70106 70107 70108 70105 70110 70111 70112 70109 70114 70115 70116 70113 70118 70119 70120 70117 70122 70123 70124 70121 70126 70127 70128 70125 70130 70131 70132 70129 70134 70135 70136 70133 70138 70139 70140 70137 70142 70143 70144 70141 70146 70147 70148 70145 70150 70151 70152 70149 70154 70155 70156 70153 70158 70159 70160 70157 70162 70163 70164 70161 70166 70167 70168 70165 70170 70171 70172 70169 70174 70175 70176 70173 70178 70179 70180 70177 70182 70183 70184 70181 70186 70187 70188 70185 70190 70191 70192 70189 70194 70195 70196 70193 70198 70199 70200 70197 70202 70203 70204 70201 70206 70207 70208 70205 70210 70211 70212 70209 70214 70215 70216 70213 70218 70219 70220 70217 70222 70223 70224 70221 70226 70227 70228 70225 70230 70231 70232 70229 70234 70235 70236 70233 70238 70239 70240 70237 70242 70243 70244 70241 70246 70247 70248 70245 70250 70251 70252 70249 70254 70255 70256 70253 70258 70259 70260 70257 70262 70263 70264 70261 70266 70267 70268 70265 70270 70271 70272 70269 70274 70275 70276 70273 70278 70279 70280 70277 70282 70283 70284 70281 70286 70287 70288 70285 70290 70291 70292 70289 70294 70295 70296 70293 70298 70299 70300 70297 70302 70303 70304 70301 70306 70307 70308 70305 70310 70311 70312 70309 70314 70315 70316 70313 70318 70319 70320 70317 70322 70323 70324 70321 70326 70327 70328 70325 70330 70331 70332 70329 70334 70335 70336 70333 70338 70339 70340 70337 70342 70343 70344 70341 70346 70347 70348 70345 70350 70351 70352 70349 70354 70355 70356 70353 70358 70359 70360 70357 70362 70363 70364 70361 70366 70367 70368 70365 70370 70371 70372 70369 70374 70375 70376 70373 70378 70379 70380 70377 70382 70383 70384 70381 70386 70387 70388 70385 70390 70391 70392 70389 70394 70395 70396 70393 70398 70399 70400 70397 70402 70403 70404 70401 70406 70407 70408 70405 70410 70411 70412 70409 70414 70415 70416 70413 70418 70419 70420 70417 70422 70423 70424 70421 70426 70427 70428 70425 70430 70431 70432 70429 70434 70435 70436 70433 70438 70439 70440 70437 70442 70443 70444 70441 70446 70447 70448 70445 70450 70451 70452 70449 70454 70455 70456 70453 70458 70459 70460 70457 70462 70463 70464 70461 70466 70467 70468 70465 70470 70471 70472 70469 70474 70475 70476 70473 70478 70479 70480 70477 70482 70483 70484 70481 70486 70487 70488 70485 70490 70491 70492 70489 70494 70495 70496 70493 70498 70499 70500 70497 70502 70503 70504 70501 70506 70507 70508 70505 70510 70511 70512 70509 70514 70515 70516 70513 70518 70519 70520 70517 70522 70523 70524 70521 70526 70527 70528 70525 70530 70531 70532 70529 70534 70535 70536 70533 70538 70539 70540 70537 70542 70543 70544 70541 70546 70547 70548 70545 70550 70551 70552 70549 70554 70555 70556 70553 70558 70559 70560 70557 70562 70563 70564 70561 70566 70567 70568 70565 70570 70571 70572 70569 70574 70575 70576 70573 70578 70579 70580 70577 70582 70583 70584 70581 70586 70587 70588 70585 70590 70591 70592 70589 70594 70595 70596 70593 70598 70599 70600 70597 70602 70603 70604 70601 70606 70607 70608 70605 70610 70611 70612 70609 70614 70615 70616 70613 70618 70619 70620 70617 70622 70623 70624 70621 70626 70627 70628 70625 70630 70631 70632 70629 70634 70635 70636 70633 70638 70639 70640 70637 70642 70643 70644 70641 70646 70647 70648 70645 70650 70651 70652 70649 70654 70655 70656 70653 70658 70659 70660 70657 70662 70663 70664 70661 70666 70667 70668 70665 70670 70671 70672 70669 70674 70675 70676 70673 70678 70679 70680 70677 70682 70683 70684 70681 70686 70687 70688 70685 70690 70691 70692 70689 70694 70695 70696 70693 70698 70699 70700 70697 70702 70703 70704 70701 70706 70707 70708 70705 70710 70711 70712 70709 70714 70715 70716 70713 70718 70719 70720 70717 70722 70723 70724 70721 70726 70727 70728 70725 70730 70731 70732 70729 70734 70735 70736 70733 70738 70739 70740 70737 70742 70743 70744 70741 70746 70747 70748 70745 70750 70751 70752 70749 70754 70755 70756 70753 70758 70759 70760 70757 70762 70763 70764 70761 70766 70767 70768 70765 70770 70771 70772 70769 70774 70775 70776 70773 70778 70779 70780 70777 70782 70783 70784 70781 70786 70787 70788 70785 70790 70791 70792 70789 70794 70795 70796 70793 70798 70799 70800 70797 70802 70803 70804 70801 70806 70807 70808 70805 70810 70811 70812 70809 70814 70815 70816 70813 70818 70819 70820 70817 70822 70823 70824 70821 70826 70827 70828 70825 70830 70831 70832 70829 70834 70835 70836 70833 70838 70839 70840 70837 70842 70843 70844 70841 70846 70847 70848 70845 70850 70851 70852 70849 70854 70855 70856 70853 70858 70859 70860 70857 70862 70863 70864 70861 70866 70867 70868 70865 70870 70871 70872 70869 70874 70875 70876 70873 70878 70879 70880 70877 70882 70883 70884 70881 70886 70887 70888 70885 70890 70891 70892 70889 70894 70895 70896 70893 70898 70899 70900 70897 70902 70903 70904 70901 70906 70907 70908 70905 70910 70911 70912 70909 70914 70915 70916 70913 70918 70919 70920 70917 70922 70923 70924 70921 70926 70927 70928 70925 70930 70931 70932 70929 70934 70935 70936 70933 70938 70939 70940 70937 70942 70943 70944 70941 70946 70947 70948 70945 70950 70951 70952 70949 70954 70955 70956 70953 70958 70959 70960 70957 70962 70963 70964 70961 70966 70967 70968 70965 70970 70971 70972 70969 70974 70975 70976 70973 70978 70979 70980 70977 70982 70983 70984 70981 70986 70987 70988 70985 70990 70991 70992 70989 70994 70995 70996 70993 70998 70999 71000 70997 71002 71003 71004 71001 71006 71007 71008 71005 71010 71011 71012 71009 71014 71015 71016 71013 71018 71019 71020 71017 71022 71023 71024 71021 71026 71027 71028 71025 71030 71031 71032 71029 71034 71035 71036 71033 71038 71039 71040 71037 71042 71043 71044 71041 71046 71047 71048 71045 71050 71051 71052 71049 71054 71055 71056 71053 71058 71059 71060 71057 71062 71063 71064 71061 71066 71067 71068 71065 71070 71071 71072 71069 71074 71075 71076 71073 71078 71079 71080 71077 71082 71083 71084 71081 71086 71087 71088 71085 71090 71091 71092 71089 71094 71095 71096 71093 71098 71099 71100 71097 71102 71103 71104 71101 71106 71107 71108 71105 71110 71111 71112 71109 71114 71115 71116 71113 71118 71119 71120 71117 71122 71123 71124 71121 71126 71127 71128 71125 71130 71131 71132 71129 71134 71135 71136 71133 71138 71139 71140 71137 71142 71143 71144 71141 71146 71147 71148 71145 71150 71151 71152 71149 71154 71155 71156 71153 71158 71159 71160 71157 71162 71163 71164 71161 71166 71167 71168 71165 71170 71171 71172 71169 71174 71175 71176 71173 71178 71179 71180 71177 71182 71183 71184 71181 71186 71187 71188 71185 71190 71191 71192 71189 71194 71195 71196 71193 71198 71199 71200 71197 71202 71203 71204 71201 71206 71207 71208 71205 71210 71211 71212 71209 71214 71215 71216 71213 71218 71219 71220 71217 71222 71223 71224 71221 71226 71227 71228 71225 71230 71231 71232 71229 71234 71235 71236 71233 71238 71239 71240 71237 71242 71243 71244 71241 71246 71247 71248 71245 71250 71251 71252 71249 71254 71255 71256 71253 71258 71259 71260 71257 71262 71263 71264 71261 71266 71267 71268 71265 71270 71271 71272 71269 71274 71275 71276 71273 71278 71279 71280 71277 71282 71283 71284 71281 71286 71287 71288 71285 71290 71291 71292 71289 71294 71295 71296 71293 71298 71299 71300 71297 71302 71303 71304 71301 71306 71307 71308 71305 71310 71311 71312 71309 71314 71315 71316 71313 71318 71319 71320 71317 71322 71323 71324 71321 71326 71327 71328 71325 71330 71331 71332 71329 71334 71335 71336 71333 71338 71339 71340 71337 71342 71343 71344 71341 71346 71347 71348 71345 71350 71351 71352 71349 71354 71355 71356 71353 71358 71359 71360 71357 71362 71363 71364 71361 71366 71367 71368 71365 71370 71371 71372 71369 71374 71375 71376 71373 71378 71379 71380 71377 71382 71383 71384 71381 71386 71387 71388 71385 71390 71391 71392 71389 71394 71395 71396 71393 71398 71399 71400 71397 71402 71403 71404 71401 71406 71407 71408 71405 71410 71411 71412 71409 71414 71415 71416 71413 71418 71419 71420 71417 71422 71423 71424 71421 71426 71427 71428 71425 71430 71431 71432 71429 71434 71435 71436 71433 71438 71439 71440 71437 71442 71443 71444 71441 71446 71447 71448 71445 71450 71451 71452 71449 71454 71455 71456 71453 71458 71459 71460 71457 71462 71463 71464 71461 71466 71467 71468 71465 71470 71471 71472 71469 71474 71475 71476 71473 71478 71479 71480 71477 71482 71483 71484 71481 71486 71487 71488 71485 71490 71491 71492 71489 71494 71495 71496 71493 71498 71499 71500 71497 71502 71503 71504 71501 71506 71507 71508 71505 71510 71511 71512 71509 71514 71515 71516 71513 71518 71519 71520 71517 71522 71523 71524 71521 71526 71527 71528 71525 71530 71531 71532 71529 71534 71535 71536 71533 71538 71539 71540 71537 71542 71543 71544 71541 71546 71547 71548 71545 71550 71551 71552 71549 71554 71555 71556 71553 71558 71559 71560 71557 71562 71563 71564 71561 71566 71567 71568 71565 71570 71571 71572 71569 71574 71575 71576 71573 71578 71579 71580 71577 71582 71583 71584 71581 71586 71587 71588 71585 71590 71591 71592 71589 71594 71595 71596 71593 71598 71599 71600 71597 71602 71603 71604 71601 71606 71607 71608 71605 71610 71611 71612 71609 71614 71615 71616 71613 71618 71619 71620 71617 71622 71623 71624 71621 71626 71627 71628 71625 71630 71631 71632 71629 71634 71635 71636 71633 71638 71639 71640 71637 71642 71643 71644 71641 71646 71647 71648 71645 71650 71651 71652 71649 71654 71655 71656 71653 71658 71659 71660 71657 71662 71663 71664 71661 71666 71667 71668 71665 71670 71671 71672 71669 71674 71675 71676 71673 71678 71679 71680 71677 71682 71683 71684 71681 71686 71687 71688 71685 71690 71691 71692 71689 71694 71695 71696 71693 71698 71699 71700 71697 71702 71703 71704 71701 71706 71707 71708 71705 71710 71711 71712 71709 71714 71715 71716 71713 71718 71719 71720 71717 71722 71723 71724 71721 71726 71727 71728 71725 71730 71731 71732 71729 71734 71735 71736 71733 71738 71739 71740 71737 71742 71743 71744 71741 71746 71747 71748 71745 71750 71751 71752 71749 71754 71755 71756 71753 71758 71759 71760 71757 71762 71763 71764 71761 71766 71767 71768 71765 71770 71771 71772 71769 71774 71775 71776 71773 71778 71779 71780 71777 71782 71783 71784 71781 71786 71787 71788 71785 71790 71791 71792 71789 71794 71795 71796 71793 71798 71799 71800 71797 71802 71803 71804 71801 71806 71807 71808 71805 71810 71811 71812 71809 71814 71815 71816 71813 71818 71819 71820 71817 71822 71823 71824 71821 71826 71827 71828 71825 71830 71831 71832 71829 71834 71835 71836 71833 71838 71839 71840 71837 71842 71843 71844 71841 71846 71847 71848 71845 71850 71851 71852 71849 71854 71855 71856 71853 71858 71859 71860 71857 71862 71863 71864 71861 71866 71867 71868 71865 71870 71871 71872 71869 71874 71875 71876 71873 71878 71879 71880 71877 71882 71883 71884 71881 71886 71887 71888 71885 71890 71891 71892 71889 71894 71895 71896 71893 71898 71899 71900 71897 71902 71903 71904 71901 71906 71907 71908 71905 71910 71911 71912 71909 71914 71915 71916 71913 71918 71919 71920 71917 71922 71923 71924 71921 71926 71927 71928 71925 71930 71931 71932 71929 71934 71935 71936 71933 71938 71939 71940 71937 71942 71943 71944 71941 71946 71947 71948 71945 71950 71951 71952 71949 71954 71955 71956 71953 71958 71959 71960 71957 71962 71963 71964 71961 71966 71967 71968 71965 71970 71971 71972 71969 71974 71975 71976 71973 71978 71979 71980 71977 71982 71983 71984 71981 71986 71987 71988 71985 71990 71991 71992 71989 71994 71995 71996 71993 71998 71999 72000 71997 72002 72003 72004 72001 72006 72007 72008 72005 72010 72011 72012 72009 72014 72015 72016 72013 72018 72019 72020 72017 72022 72023 72024 72021 72026 72027 72028 72025 72030 72031 72032 72029 72034 72035 72036 72033 72038 72039 72040 72037 72042 72043 72044 72041 72046 72047 72048 72045 72050 72051 72052 72049 72054 72055 72056 72053 72058 72059 72060 72057 72062 72063 72064 72061 72066 72067 72068 72065 72070 72071 72072 72069 72074 72075 72076 72073 72078 72079 72080 72077 72082 72083 72084 72081 72086 72087 72088 72085 72090 72091 72092 72089 72094 72095 72096 72093 72098 72099 72100 72097 72102 72103 72104 72101 72106 72107 72108 72105 72110 72111 72112 72109 72114 72115 72116 72113 72118 72119 72120 72117 72122 72123 72124 72121 72126 72127 72128 72125 72130 72131 72132 72129 72134 72135 72136 72133 72138 72139 72140 72137 72142 72143 72144 72141 72146 72147 72148 72145 72150 72151 72152 72149 72154 72155 72156 72153 72158 72159 72160 72157 72162 72163 72164 72161 72166 72167 72168 72165 72170 72171 72172 72169 72174 72175 72176 72173 72178 72179 72180 72177 72182 72183 72184 72181 72186 72187 72188 72185 72190 72191 72192 72189 72194 72195 72196 72193 72198 72199 72200 72197 72202 72203 72204 72201 72206 72207 72208 72205 72210 72211 72212 72209 72214 72215 72216 72213 72218 72219 72220 72217 72222 72223 72224 72221 72226 72227 72228 72225 72230 72231 72232 72229 72234 72235 72236 72233 72238 72239 72240 72237 72242 72243 72244 72241 72246 72247 72248 72245 72250 72251 72252 72249 72254 72255 72256 72253 72258 72259 72260 72257 72262 72263 72264 72261 72266 72267 72268 72265 72270 72271 72272 72269 72274 72275 72276 72273 72278 72279 72280 72277 72282 72283 72284 72281 72286 72287 72288 72285 72290 72291 72292 72289 72294 72295 72296 72293 72298 72299 72300 72297 72302 72303 72304 72301 72306 72307 72308 72305 72310 72311 72312 72309 72314 72315 72316 72313 72318 72319 72320 72317 72322 72323 72324 72321 72326 72327 72328 72325 72330 72331 72332 72329 72334 72335 72336 72333 72338 72339 72340 72337 72342 72343 72344 72341 72346 72347 72348 72345 72350 72351 72352 72349 72354 72355 72356 72353 72358 72359 72360 72357 72362 72363 72364 72361 72366 72367 72368 72365 72370 72371 72372 72369 72374 72375 72376 72373 72378 72379 72380 72377 72382 72383 72384 72381 72386 72387 72388 72385 72390 72391 72392 72389 72394 72395 72396 72393 72398 72399 72400 72397 72402 72403 72404 72401 72406 72407 72408 72405 72410 72411 72412 72409 72414 72415 72416 72413 72418 72419 72420 72417 72422 72423 72424 72421 72426 72427 72428 72425 72430 72431 72432 72429 72434 72435 72436 72433 72438 72439 72440 72437 72442 72443 72444 72441 72446 72447 72448 72445 72450 72451 72452 72449 72454 72455 72456 72453 72458 72459 72460 72457 72462 72463 72464 72461 72466 72467 72468 72465 72470 72471 72472 72469 72474 72475 72476 72473 72478 72479 72480 72477 72482 72483 72484 72481 72486 72487 72488 72485 72490 72491 72492 72489 72494 72495 72496 72493 72498 72499 72500 72497 72502 72503 72504 72501 72506 72507 72508 72505 72510 72511 72512 72509 72514 72515 72516 72513 72518 72519 72520 72517 72522 72523 72524 72521 72526 72527 72528 72525 72530 72531 72532 72529 72534 72535 72536 72533 72538 72539 72540 72537 72542 72543 72544 72541 72546 72547 72548 72545 72550 72551 72552 72549 72554 72555 72556 72553 72558 72559 72560 72557 72562 72563 72564 72561 72566 72567 72568 72565 72570 72571 72572 72569 72574 72575 72576 72573 72578 72579 72580 72577 72582 72583 72584 72581 72586 72587 72588 72585 72590 72591 72592 72589 72594 72595 72596 72593 72598 72599 72600 72597 72602 72603 72604 72601 72606 72607 72608 72605 72610 72611 72612 72609 72614 72615 72616 72613 72618 72619 72620 72617 72622 72623 72624 72621 72626 72627 72628 72625 72630 72631 72632 72629 72634 72635 72636 72633 72638 72639 72640 72637 72642 72643 72644 72641 72646 72647 72648 72645 72650 72651 72652 72649 72654 72655 72656 72653 72658 72659 72660 72657 72662 72663 72664 72661 72666 72667 72668 72665 72670 72671 72672 72669 72674 72675 72676 72673 72678 72679 72680 72677 72682 72683 72684 72681 72686 72687 72688 72685 72690 72691 72692 72689 72694 72695 72696 72693 72698 72699 72700 72697 72702 72703 72704 72701 72706 72707 72708 72705 72710 72711 72712 72709 72714 72715 72716 72713 72718 72719 72720 72717 72722 72723 72724 72721 72726 72727 72728 72725 72730 72731 72732 72729 72734 72735 72736 72733 72738 72739 72740 72737 72742 72743 72744 72741 72746 72747 72748 72745 72750 72751 72752 72749 72754 72755 72756 72753 72758 72759 72760 72757 72762 72763 72764 72761 72766 72767 72768 72765 72770 72771 72772 72769 72774 72775 72776 72773 72778 72779 72780 72777 72782 72783 72784 72781 72786 72787 72788 72785 72790 72791 72792 72789 72794 72795 72796 72793 72798 72799 72800 72797 72802 72803 72804 72801 72806 72807 72808 72805 72810 72811 72812 72809 72814 72815 72816 72813 72818 72819 72820 72817 72822 72823 72824 72821 72826 72827 72828 72825 72830 72831 72832 72829 72834 72835 72836 72833 72838 72839 72840 72837 72842 72843 72844 72841 72846 72847 72848 72845 72850 72851 72852 72849 72854 72855 72856 72853 72858 72859 72860 72857 72862 72863 72864 72861 72866 72867 72868 72865 72870 72871 72872 72869 72874 72875 72876 72873 72878 72879 72880 72877 72882 72883 72884 72881 72886 72887 72888 72885 72890 72891 72892 72889 72894 72895 72896 72893 72898 72899 72900 72897 72902 72903 72904 72901 72906 72907 72908 72905 72910 72911 72912 72909 72914 72915 72916 72913 72918 72919 72920 72917 72922 72923 72924 72921 72926 72927 72928 72925 72930 72931 72932 72929 72934 72935 72936 72933 72938 72939 72940 72937 72942 72943 72944 72941 72946 72947 72948 72945 72950 72951 72952 72949 72954 72955 72956 72953 72958 72959 72960 72957 72962 72963 72964 72961 72966 72967 72968 72965 72970 72971 72972 72969 72974 72975 72976 72973 72978 72979 72980 72977 72982 72983 72984 72981 72986 72987 72988 72985 72990 72991 72992 72989 72994 72995 72996 72993 72998 72999 73000 72997 73002 73003 73004 73001 73006 73007 73008 73005 73010 73011 73012 73009 73014 73015 73016 73013 73018 73019 73020 73017 73022 73023 73024 73021 73026 73027 73028 73025 73030 73031 73032 73029 73034 73035 73036 73033 73038 73039 73040 73037 73042 73043 73044 73041 73046 73047 73048 73045 73050 73051 73052 73049 73054 73055 73056 73053 73058 73059 73060 73057 73062 73063 73064 73061 73066 73067 73068 73065 73070 73071 73072 73069 73074 73075 73076 73073 73078 73079 73080 73077 73082 73083 73084 73081 73086 73087 73088 73085 73090 73091 73092 73089 73094 73095 73096 73093 73098 73099 73100 73097 73102 73103 73104 73101 73106 73107 73108 73105 73110 73111 73112 73109 73114 73115 73116 73113 73118 73119 73120 73117 73122 73123 73124 73121 73126 73127 73128 73125 73130 73131 73132 73129 73134 73135 73136 73133 73138 73139 73140 73137 73142 73143 73144 73141 73146 73147 73148 73145 73150 73151 73152 73149 73154 73155 73156 73153 73158 73159 73160 73157 73162 73163 73164 73161 73166 73167 73168 73165 73170 73171 73172 73169 73174 73175 73176 73173 73178 73179 73180 73177 73182 73183 73184 73181 73186 73187 73188 73185 73190 73191 73192 73189 73194 73195 73196 73193 73198 73199 73200 73197 73202 73203 73204 73201 73206 73207 73208 73205 73210 73211 73212 73209 73214 73215 73216 73213 73218 73219 73220 73217 73222 73223 73224 73221 73226 73227 73228 73225 73230 73231 73232 73229 73234 73235 73236 73233 73238 73239 73240 73237 73242 73243 73244 73241 73246 73247 73248 73245 73250 73251 73252 73249 73254 73255 73256 73253 73258 73259 73260 73257 73262 73263 73264 73261 73266 73267 73268 73265 73270 73271 73272 73269 73274 73275 73276 73273 73278 73279 73280 73277 73282 73283 73284 73281 73286 73287 73288 73285 73290 73291 73292 73289 73294 73295 73296 73293 73298 73299 73300 73297 73302 73303 73304 73301 73306 73307 73308 73305 73310 73311 73312 73309 73314 73315 73316 73313 73318 73319 73320 73317 73322 73323 73324 73321 73326 73327 73328 73325 73330 73331 73332 73329 73334 73335 73336 73333 73338 73339 73340 73337 73342 73343 73344 73341 73346 73347 73348 73345 73350 73351 73352 73349 73354 73355 73356 73353 73358 73359 73360 73357 73362 73363 73364 73361 73366 73367 73368 73365 73370 73371 73372 73369 73374 73375 73376 73373 73378 73379 73380 73377 73382 73383 73384 73381 73386 73387 73388 73385 73390 73391 73392 73389 73394 73395 73396 73393 73398 73399 73400 73397 73402 73403 73404 73401 73406 73407 73408 73405 73410 73411 73412 73409 73414 73415 73416 73413 73418 73419 73420 73417 73422 73423 73424 73421 73426 73427 73428 73425 73430 73431 73432 73429 73434 73435 73436 73433 73438 73439 73440 73437 73442 73443 73444 73441 73446 73447 73448 73445 73450 73451 73452 73449 73454 73455 73456 73453 73458 73459 73460 73457 73462 73463 73464 73461 73466 73467 73468 73465 73470 73471 73472 73469 73474 73475 73476 73473 73478 73479 73480 73477 73482 73483 73484 73481 73486 73487 73488 73485 73490 73491 73492 73489 73494 73495 73496 73493 73498 73499 73500 73497 73502 73503 73504 73501 73506 73507 73508 73505 73510 73511 73512 73509 73514 73515 73516 73513 73518 73519 73520 73517 73522 73523 73524 73521 73526 73527 73528 73525 73530 73531 73532 73529 73534 73535 73536 73533 73538 73539 73540 73537 73542 73543 73544 73541 73546 73547 73548 73545 73550 73551 73552 73549 73554 73555 73556 73553 73558 73559 73560 73557 73562 73563 73564 73561 73566 73567 73568 73565 73570 73571 73572 73569 73574 73575 73576 73573 73578 73579 73580 73577 73582 73583 73584 73581 73586 73587 73588 73585 73590 73591 73592 73589 73594 73595 73596 73593 73598 73599 73600 73597 73602 73603 73604 73601 73606 73607 73608 73605 73610 73611 73612 73609 73614 73615 73616 73613 73618 73619 73620 73617 73622 73623 73624 73621 73626 73627 73628 73625 73630 73631 73632 73629 73634 73635 73636 73633 73638 73639 73640 73637 73642 73643 73644 73641 73646 73647 73648 73645 73650 73651 73652 73649 73654 73655 73656 73653 73658 73659 73660 73657 73662 73663 73664 73661 73666 73667 73668 73665 73670 73671 73672 73669 73674 73675 73676 73673 73678 73679 73680 73677 73682 73683 73684 73681 73686 73687 73688 73685 73690 73691 73692 73689 73694 73695 73696 73693 73698 73699 73700 73697 73702 73703 73704 73701 73706 73707 73708 73705 73710 73711 73712 73709 73714 73715 73716 73713 73718 73719 73720 73717 73722 73723 73724 73721 73726 73727 73728 73725 73730 73731 73732 73729 73734 73735 73736 73733 73738 73739 73740 73737 73742 73743 73744 73741 73746 73747 73748 73745 73750 73751 73752 73749 73754 73755 73756 73753 73758 73759 73760 73757 73762 73763 73764 73761 73766 73767 73768 73765 73770 73771 73772 73769 73774 73775 73776 73773 73778 73779 73780 73777 73782 73783 73784 73781 73786 73787 73788 73785 73790 73791 73792 73789 73794 73795 73796 73793 73798 73799 73800 73797 73802 73803 73804 73801 73806 73807 73808 73805 73810 73811 73812 73809 73814 73815 73816 73813 73818 73819 73820 73817 73822 73823 73824 73821 73826 73827 73828 73825 73830 73831 73832 73829 73834 73835 73836 73833 73838 73839 73840 73837 73842 73843 73844 73841 73846 73847 73848 73845 73850 73851 73852 73849 73854 73855 73856 73853 73858 73859 73860 73857 73862 73863 73864 73861 73866 73867 73868 73865 73870 73871 73872 73869 73874 73875 73876 73873 73878 73879 73880 73877 73882 73883 73884 73881 73886 73887 73888 73885 73890 73891 73892 73889 73894 73895 73896 73893 73898 73899 73900 73897 73902 73903 73904 73901 73906 73907 73908 73905 73910 73911 73912 73909 73914 73915 73916 73913 73918 73919 73920 73917 73922 73923 73924 73921 73926 73927 73928 73925 73930 73931 73932 73929 73934 73935 73936 73933 73938 73939 73940 73937 73942 73943 73944 73941 73946 73947 73948 73945 73950 73951 73952 73949 73954 73955 73956 73953 73958 73959 73960 73957 73962 73963 73964 73961 73966 73967 73968 73965 73970 73971 73972 73969 73974 73975 73976 73973 73978 73979 73980 73977 73982 73983 73984 73981 73986 73987 73988 73985 73990 73991 73992 73989 73994 73995 73996 73993 73998 73999 74000 73997 74002 74003 74004 74001 74006 74007 74008 74005 74010 74011 74012 74009 74014 74015 74016 74013 74018 74019 74020 74017 74022 74023 74024 74021 74026 74027 74028 74025 74030 74031 74032 74029 74034 74035 74036 74033 74038 74039 74040 74037 74042 74043 74044 74041 74046 74047 74048 74045 74050 74051 74052 74049 74054 74055 74056 74053 74058 74059 74060 74057 74062 74063 74064 74061 74066 74067 74068 74065 74070 74071 74072 74069 74074 74075 74076 74073 74078 74079 74080 74077 74082 74083 74084 74081 74086 74087 74088 74085 74090 74091 74092 74089 74094 74095 74096 74093 74098 74099 74100 74097 74102 74103 74104 74101 74106 74107 74108 74105 74110 74111 74112 74109 74114 74115 74116 74113 74118 74119 74120 74117 74122 74123 74124 74121 74126 74127 74128 74125 74130 74131 74132 74129 74134 74135 74136 74133 74138 74139 74140 74137 74142 74143 74144 74141 74146 74147 74148 74145 74150 74151 74152 74149 74154 74155 74156 74153 74158 74159 74160 74157 74162 74163 74164 74161 74166 74167 74168 74165 74170 74171 74172 74169 74174 74175 74176 74173 74178 74179 74180 74177 74182 74183 74184 74181 74186 74187 74188 74185 74190 74191 74192 74189 74194 74195 74196 74193 74198 74199 74200 74197 74202 74203 74204 74201 74206 74207 74208 74205 74210 74211 74212 74209 74214 74215 74216 74213 74218 74219 74220 74217 74222 74223 74224 74221 74226 74227 74228 74225 74230 74231 74232 74229 74234 74235 74236 74233 74238 74239 74240 74237 74242 74243 74244 74241 74246 74247 74248 74245 74250 74251 74252 74249 74254 74255 74256 74253 74258 74259 74260 74257 74262 74263 74264 74261 74266 74267 74268 74265 74270 74271 74272 74269 74274 74275 74276 74273 74278 74279 74280 74277 74282 74283 74284 74281 74286 74287 74288 74285 74290 74291 74292 74289 74294 74295 74296 74293 74298 74299 74300 74297 74302 74303 74304 74301 74306 74307 74308 74305 74310 74311 74312 74309 74314 74315 74316 74313 74318 74319 74320 74317 74322 74323 74324 74321 74326 74327 74328 74325 74330 74331 74332 74329 74334 74335 74336 74333 74338 74339 74340 74337 74342 74343 74344 74341 74346 74347 74348 74345 74350 74351 74352 74349 74354 74355 74356 74353 74358 74359 74360 74357 74362 74363 74364 74361 74366 74367 74368 74365 74370 74371 74372 74369 74374 74375 74376 74373 74378 74379 74380 74377 74382 74383 74384 74381 74386 74387 74388 74385 74390 74391 74392 74389 74394 74395 74396 74393 74398 74399 74400 74397 74402 74403 74404 74401 74406 74407 74408 74405 74410 74411 74412 74409 74414 74415 74416 74413 74418 74419 74420 74417 74422 74423 74424 74421 74426 74427 74428 74425 74430 74431 74432 74429 74434 74435 74436 74433 74438 74439 74440 74437 74442 74443 74444 74441 74446 74447 74448 74445 74450 74451 74452 74449 74454 74455 74456 74453 74458 74459 74460 74457 74462 74463 74464 74461 74466 74467 74468 74465 74470 74471 74472 74469 74474 74475 74476 74473 74478 74479 74480 74477 74482 74483 74484 74481 74486 74487 74488 74485 74490 74491 74492 74489 74494 74495 74496 74493 74498 74499 74500 74497 74502 74503 74504 74501 74506 74507 74508 74505 74510 74511 74512 74509 74514 74515 74516 74513 74518 74519 74520 74517 74522 74523 74524 74521 74526 74527 74528 74525 74530 74531 74532 74529 74534 74535 74536 74533 74538 74539 74540 74537 74542 74543 74544 74541 74546 74547 74548 74545 74550 74551 74552 74549 74554 74555 74556 74553 74558 74559 74560 74557 74562 74563 74564 74561 74566 74567 74568 74565 74570 74571 74572 74569 74574 74575 74576 74573 74578 74579 74580 74577 74582 74583 74584 74581 74586 74587 74588 74585 74590 74591 74592 74589 74594 74595 74596 74593 74598 74599 74600 74597 74602 74603 74604 74601 74606 74607 74608 74605 74610 74611 74612 74609 74614 74615 74616 74613 74618 74619 74620 74617 74622 74623 74624 74621 74626 74627 74628 74625 74630 74631 74632 74629 74634 74635 74636 74633 74638 74639 74640 74637 74642 74643 74644 74641 74646 74647 74648 74645 74650 74651 74652 74649 74654 74655 74656 74653 74658 74659 74660 74657 74662 74663 74664 74661 74666 74667 74668 74665 74670 74671 74672 74669 74674 74675 74676 74673 74678 74679 74680 74677 74682 74683 74684 74681 74686 74687 74688 74685 74690 74691 74692 74689 74694 74695 74696 74693 74698 74699 74700 74697 74702 74703 74704 74701 74706 74707 74708 74705 74710 74711 74712 74709 74714 74715 74716 74713 74718 74719 74720 74717 74722 74723 74724 74721 74726 74727 74728 74725 74730 74731 74732 74729 74734 74735 74736 74733 74738 74739 74740 74737 74742 74743 74744 74741 74746 74747 74748 74745 74750 74751 74752 74749 74754 74755 74756 74753 74758 74759 74760 74757 74762 74763 74764 74761 74766 74767 74768 74765 74770 74771 74772 74769 74774 74775 74776 74773 74778 74779 74780 74777 74782 74783 74784 74781 74786 74787 74788 74785 74790 74791 74792 74789 74794 74795 74796 74793 74798 74799 74800 74797 74802 74803 74804 74801 74806 74807 74808 74805 74810 74811 74812 74809 74814 74815 74816 74813 74818 74819 74820 74817 74822 74823 74824 74821 74826 74827 74828 74825 74830 74831 74832 74829 74834 74835 74836 74833 74838 74839 74840 74837 74842 74843 74844 74841 74846 74847 74848 74845 74850 74851 74852 74849 74854 74855 74856 74853 74858 74859 74860 74857 74862 74863 74864 74861 74866 74867 74868 74865 74870 74871 74872 74869 74874 74875 74876 74873 74878 74879 74880 74877 74882 74883 74884 74881 74886 74887 74888 74885 74890 74891 74892 74889 74894 74895 74896 74893 74898 74899 74900 74897 74902 74903 74904 74901 74906 74907 74908 74905 74910 74911 74912 74909 74914 74915 74916 74913 74918 74919 74920 74917 74922 74923 74924 74921 74926 74927 74928 74925 74930 74931 74932 74929 74934 74935 74936 74933 74938 74939 74940 74937 74942 74943 74944 74941 74946 74947 74948 74945 74950 74951 74952 74949 74954 74955 74956 74953 74958 74959 74960 74957 74962 74963 74964 74961 74966 74967 74968 74965 74970 74971 74972 74969 74974 74975 74976 74973 74978 74979 74980 74977 74982 74983 74984 74981 74986 74987 74988 74985 74990 74991 74992 74989 74994 74995 74996 74993 74998 74999 75000 74997 75002 75003 75004 75001 75006 75007 75008 75005 75010 75011 75012 75009 75014 75015 75016 75013 75018 75019 75020 75017 75022 75023 75024 75021 75026 75027 75028 75025 75030 75031 75032 75029 75034 75035 75036 75033 75038 75039 75040 75037 75042 75043 75044 75041 75046 75047 75048 75045 75050 75051 75052 75049 75054 75055 75056 75053 75058 75059 75060 75057 75062 75063 75064 75061 75066 75067 75068 75065 75070 75071 75072 75069 75074 75075 75076 75073 75078 75079 75080 75077 75082 75083 75084 75081 75086 75087 75088 75085 75090 75091 75092 75089 75094 75095 75096 75093 75098 75099 75100 75097 75102 75103 75104 75101 75106 75107 75108 75105 75110 75111 75112 75109 75114 75115 75116 75113 75118 75119 75120 75117 75122 75123 75124 75121 75126 75127 75128 75125 75130 75131 75132 75129 75134 75135 75136 75133 75138 75139 75140 75137 75142 75143 75144 75141 75146 75147 75148 75145 75150 75151 75152 75149 75154 75155 75156 75153 75158 75159 75160 75157 75162 75163 75164 75161 75166 75167 75168 75165 75170 75171 75172 75169 75174 75175 75176 75173 75178 75179 75180 75177 75182 75183 75184 75181 75186 75187 75188 75185 75190 75191 75192 75189 75194 75195 75196 75193 75198 75199 75200 75197 75202 75203 75204 75201 75206 75207 75208 75205 75210 75211 75212 75209 75214 75215 75216 75213 75218 75219 75220 75217 75222 75223 75224 75221 75226 75227 75228 75225 75230 75231 75232 75229 75234 75235 75236 75233 75238 75239 75240 75237 75242 75243 75244 75241 75246 75247 75248 75245 75250 75251 75252 75249 75254 75255 75256 75253 75258 75259 75260 75257 75262 75263 75264 75261 75266 75267 75268 75265 75270 75271 75272 75269 75274 75275 75276 75273 75278 75279 75280 75277 75282 75283 75284 75281 75286 75287 75288 75285 75290 75291 75292 75289 75294 75295 75296 75293 75298 75299 75300 75297 75302 75303 75304 75301 75306 75307 75308 75305 75310 75311 75312 75309 75314 75315 75316 75313 75318 75319 75320 75317 75322 75323 75324 75321 75326 75327 75328 75325 75330 75331 75332 75329 75334 75335 75336 75333 75338 75339 75340 75337 75342 75343 75344 75341 75346 75347 75348 75345 75350 75351 75352 75349 75354 75355 75356 75353 75358 75359 75360 75357 75362 75363 75364 75361 75366 75367 75368 75365 75370 75371 75372 75369 75374 75375 75376 75373 75378 75379 75380 75377 75382 75383 75384 75381 75386 75387 75388 75385 75390 75391 75392 75389 75394 75395 75396 75393 75398 75399 75400 75397 75402 75403 75404 75401 75406 75407 75408 75405 75410 75411 75412 75409 75414 75415 75416 75413 75418 75419 75420 75417 75422 75423 75424 75421 75426 75427 75428 75425 75430 75431 75432 75429 75434 75435 75436 75433 75438 75439 75440 75437 75442 75443 75444 75441 75446 75447 75448 75445 75450 75451 75452 75449 75454 75455 75456 75453 75458 75459 75460 75457 75462 75463 75464 75461 75466 75467 75468 75465 75470 75471 75472 75469 75474 75475 75476 75473 75478 75479 75480 75477 75482 75483 75484 75481 75486 75487 75488 75485 75490 75491 75492 75489 75494 75495 75496 75493 75498 75499 75500 75497 75502 75503 75504 75501 75506 75507 75508 75505 75510 75511 75512 75509 75514 75515 75516 75513 75518 75519 75520 75517 75522 75523 75524 75521 75526 75527 75528 75525 75530 75531 75532 75529 75534 75535 75536 75533 75538 75539 75540 75537 75542 75543 75544 75541 75546 75547 75548 75545 75550 75551 75552 75549 75554 75555 75556 75553 75558 75559 75560 75557 75562 75563 75564 75561 75566 75567 75568 75565 75570 75571 75572 75569 75574 75575 75576 75573 75578 75579 75580 75577 75582 75583 75584 75581 75586 75587 75588 75585 75590 75591 75592 75589 75594 75595 75596 75593 75598 75599 75600 75597 75602 75603 75604 75601 75606 75607 75608 75605 75610 75611 75612 75609 75614 75615 75616 75613 75618 75619 75620 75617 75622 75623 75624 75621 75626 75627 75628 75625 75630 75631 75632 75629 75634 75635 75636 75633 75638 75639 75640 75637 75642 75643 75644 75641 75646 75647 75648 75645 75650 75651 75652 75649 75654 75655 75656 75653 75658 75659 75660 75657 75662 75663 75664 75661 75666 75667 75668 75665 75670 75671 75672 75669 75674 75675 75676 75673 75678 75679 75680 75677 75682 75683 75684 75681 75686 75687 75688 75685 75690 75691 75692 75689 75694 75695 75696 75693 75698 75699 75700 75697 75702 75703 75704 75701 75706 75707 75708 75705 75710 75711 75712 75709 75714 75715 75716 75713 75718 75719 75720 75717 75722 75723 75724 75721 75726 75727 75728 75725 75730 75731 75732 75729 75734 75735 75736 75733 75738 75739 75740 75737 75742 75743 75744 75741 75746 75747 75748 75745 75750 75751 75752 75749 75754 75755 75756 75753 75758 75759 75760 75757 75762 75763 75764 75761 75766 75767 75768 75765 75770 75771 75772 75769 75774 75775 75776 75773 75778 75779 75780 75777 75782 75783 75784 75781 75786 75787 75788 75785 75790 75791 75792 75789 75794 75795 75796 75793 75798 75799 75800 75797 75802 75803 75804 75801 75806 75807 75808 75805 75810 75811 75812 75809 75814 75815 75816 75813 75818 75819 75820 75817 75822 75823 75824 75821 75826 75827 75828 75825 75830 75831 75832 75829 75834 75835 75836 75833 75838 75839 75840 75837 75842 75843 75844 75841 75846 75847 75848 75845 75850 75851 75852 75849 75854 75855 75856 75853 75858 75859 75860 75857 75862 75863 75864 75861 75866 75867 75868 75865 75870 75871 75872 75869 75874 75875 75876 75873 75878 75879 75880 75877 75882 75883 75884 75881 75886 75887 75888 75885 75890 75891 75892 75889 75894 75895 75896 75893 75898 75899 75900 75897 75902 75903 75904 75901 75906 75907 75908 75905 75910 75911 75912 75909 75914 75915 75916 75913 75918 75919 75920 75917 75922 75923 75924 75921 75926 75927 75928 75925 75930 75931 75932 75929 75934 75935 75936 75933 75938 75939 75940 75937 75942 75943 75944 75941 75946 75947 75948 75945 75950 75951 75952 75949 75954 75955 75956 75953 75958 75959 75960 75957 75962 75963 75964 75961 75966 75967 75968 75965 75970 75971 75972 75969 75974 75975 75976 75973 75978 75979 75980 75977 75982 75983 75984 75981 75986 75987 75988 75985 75990 75991 75992 75989 75994 75995 75996 75993 75998 75999 76000 75997 76002 76003 76004 76001 76006 76007 76008 76005 76010 76011 76012 76009 76014 76015 76016 76013 76018 76019 76020 76017 76022 76023 76024 76021 76026 76027 76028 76025 76030 76031 76032 76029 76034 76035 76036 76033 76038 76039 76040 76037 76042 76043 76044 76041 76046 76047 76048 76045 76050 76051 76052 76049 76054 76055 76056 76053 76058 76059 76060 76057 76062 76063 76064 76061 76066 76067 76068 76065 76070 76071 76072 76069 76074 76075 76076 76073 76078 76079 76080 76077 76082 76083 76084 76081 76086 76087 76088 76085 76090 76091 76092 76089 76094 76095 76096 76093 76098 76099 76100 76097 76102 76103 76104 76101 76106 76107 76108 76105 76110 76111 76112 76109 76114 76115 76116 76113 76118 76119 76120 76117 76122 76123 76124 76121 76126 76127 76128 76125 76130 76131 76132 76129 76134 76135 76136 76133 76138 76139 76140 76137 76142 76143 76144 76141 76146 76147 76148 76145 76150 76151 76152 76149 76154 76155 76156 76153 76158 76159 76160 76157 76162 76163 76164 76161 76166 76167 76168 76165 76170 76171 76172 76169 76174 76175 76176 76173 76178 76179 76180 76177 76182 76183 76184 76181 76186 76187 76188 76185 76190 76191 76192 76189 76194 76195 76196 76193 76198 76199 76200 76197 76202 76203 76204 76201 76206 76207 76208 76205 76210 76211 76212 76209 76214 76215 76216 76213 76218 76219 76220 76217 76222 76223 76224 76221 76226 76227 76228 76225 76230 76231 76232 76229 76234 76235 76236 76233 76238 76239 76240 76237 76242 76243 76244 76241 76246 76247 76248 76245 76250 76251 76252 76249 76254 76255 76256 76253 76258 76259 76260 76257 76262 76263 76264 76261 76266 76267 76268 76265 76270 76271 76272 76269 76274 76275 76276 76273 76278 76279 76280 76277 76282 76283 76284 76281 76286 76287 76288 76285 76290 76291 76292 76289 76294 76295 76296 76293 76298 76299 76300 76297 76302 76303 76304 76301 76306 76307 76308 76305 76310 76311 76312 76309 76314 76315 76316 76313 76318 76319 76320 76317 76322 76323 76324 76321 76326 76327 76328 76325 76330 76331 76332 76329 76334 76335 76336 76333 76338 76339 76340 76337 76342 76343 76344 76341 76346 76347 76348 76345 76350 76351 76352 76349 76354 76355 76356 76353 76358 76359 76360 76357 76362 76363 76364 76361 76366 76367 76368 76365 76370 76371 76372 76369 76374 76375 76376 76373 76378 76379 76380 76377 76382 76383 76384 76381 76386 76387 76388 76385 76390 76391 76392 76389 76394 76395 76396 76393 76398 76399 76400 76397 76402 76403 76404 76401 76406 76407 76408 76405 76410 76411 76412 76409 76414 76415 76416 76413 76418 76419 76420 76417 76422 76423 76424 76421 76426 76427 76428 76425 76430 76431 76432 76429 76434 76435 76436 76433 76438 76439 76440 76437 76442 76443 76444 76441 76446 76447 76448 76445 76450 76451 76452 76449 76454 76455 76456 76453 76458 76459 76460 76457 76462 76463 76464 76461 76466 76467 76468 76465 76470 76471 76472 76469 76474 76475 76476 76473 76478 76479 76480 76477 76482 76483 76484 76481 76486 76487 76488 76485 76490 76491 76492 76489 76494 76495 76496 76493 76498 76499 76500 76497 76502 76503 76504 76501 76506 76507 76508 76505 76510 76511 76512 76509 76514 76515 76516 76513 76518 76519 76520 76517 76522 76523 76524 76521 76526 76527 76528 76525 76530 76531 76532 76529 76534 76535 76536 76533 76538 76539 76540 76537 76542 76543 76544 76541 76546 76547 76548 76545 76550 76551 76552 76549 76554 76555 76556 76553 76558 76559 76560 76557 76562 76563 76564 76561 76566 76567 76568 76565 76570 76571 76572 76569 76574 76575 76576 76573 76578 76579 76580 76577 76582 76583 76584 76581 76586 76587 76588 76585 76590 76591 76592 76589 76594 76595 76596 76593 76598 76599 76600 76597 76602 76603 76604 76601 76606 76607 76608 76605 76610 76611 76612 76609 76614 76615 76616 76613 76618 76619 76620 76617 76622 76623 76624 76621 76626 76627 76628 76625 76630 76631 76632 76629 76634 76635 76636 76633 76638 76639 76640 76637 76642 76643 76644 76641 76646 76647 76648 76645 76650 76651 76652 76649 76654 76655 76656 76653 76658 76659 76660 76657 76662 76663 76664 76661 76666 76667 76668 76665 76670 76671 76672 76669 76674 76675 76676 76673 76678 76679 76680 76677 76682 76683 76684 76681 76686 76687 76688 76685 76690 76691 76692 76689 76694 76695 76696 76693 76698 76699 76700 76697 76702 76703 76704 76701 76706 76707 76708 76705 76710 76711 76712 76709 76714 76715 76716 76713 76718 76719 76720 76717 76722 76723 76724 76721 76726 76727 76728 76725 76730 76731 76732 76729 76734 76735 76736 76733 76738 76739 76740 76737 76742 76743 76744 76741 76746 76747 76748 76745 76750 76751 76752 76749 76754 76755 76756 76753 76758 76759 76760 76757 76762 76763 76764 76761 76766 76767 76768 76765 76770 76771 76772 76769 76774 76775 76776 76773 76778 76779 76780 76777 76782 76783 76784 76781 76786 76787 76788 76785 76790 76791 76792 76789 76794 76795 76796 76793 76798 76799 76800 76797 76802 76803 76804 76801 76806 76807 76808 76805 76810 76811 76812 76809 76814 76815 76816 76813 76818 76819 76820 76817 76822 76823 76824 76821 76826 76827 76828 76825 76830 76831 76832 76829 76834 76835 76836 76833 76838 76839 76840 76837 76842 76843 76844 76841 76846 76847 76848 76845 76850 76851 76852 76849 76854 76855 76856 76853 76858 76859 76860 76857 76862 76863 76864 76861 76866 76867 76868 76865 76870 76871 76872 76869 76874 76875 76876 76873 76878 76879 76880 76877 76882 76883 76884 76881 76886 76887 76888 76885 76890 76891 76892 76889 76894 76895 76896 76893 76898 76899 76900 76897 76902 76903 76904 76901 76906 76907 76908 76905 76910 76911 76912 76909 76914 76915 76916 76913 76918 76919 76920 76917 76922 76923 76924 76921 76926 76927 76928 76925 76930 76931 76932 76929 76934 76935 76936 76933 76938 76939 76940 76937 76942 76943 76944 76941 76946 76947 76948 76945 76950 76951 76952 76949 76954 76955 76956 76953 76958 76959 76960 76957 76962 76963 76964 76961 76966 76967 76968 76965 76970 76971 76972 76969 76974 76975 76976 76973 76978 76979 76980 76977 76982 76983 76984 76981 76986 76987 76988 76985 76990 76991 76992 76989 76994 76995 76996 76993 76998 76999 77000 76997 77002 77003 77004 77001 77006 77007 77008 77005 77010 77011 77012 77009 77014 77015 77016 77013 77018 77019 77020 77017 77022 77023 77024 77021 77026 77027 77028 77025 77030 77031 77032 77029 77034 77035 77036 77033 77038 77039 77040 77037 77042 77043 77044 77041 77046 77047 77048 77045 77050 77051 77052 77049 77054 77055 77056 77053 77058 77059 77060 77057 77062 77063 77064 77061 77066 77067 77068 77065 77070 77071 77072 77069 77074 77075 77076 77073 77078 77079 77080 77077 77082 77083 77084 77081 77086 77087 77088 77085 77090 77091 77092 77089 77094 77095 77096 77093 77098 77099 77100 77097 77102 77103 77104 77101 77106 77107 77108 77105 77110 77111 77112 77109 77114 77115 77116 77113 77118 77119 77120 77117 77122 77123 77124 77121 77126 77127 77128 77125 77130 77131 77132 77129 77134 77135 77136 77133 77138 77139 77140 77137 77142 77143 77144 77141 77146 77147 77148 77145 77150 77151 77152 77149 77154 77155 77156 77153 77158 77159 77160 77157 77162 77163 77164 77161 77166 77167 77168 77165 77170 77171 77172 77169 77174 77175 77176 77173 77178 77179 77180 77177 77182 77183 77184 77181 77186 77187 77188 77185 77190 77191 77192 77189 77194 77195 77196 77193 77198 77199 77200 77197 77202 77203 77204 77201 77206 77207 77208 77205 77210 77211 77212 77209 77214 77215 77216 77213 77218 77219 77220 77217 77222 77223 77224 77221 77226 77227 77228 77225 77230 77231 77232 77229 77234 77235 77236 77233 77238 77239 77240 77237 77242 77243 77244 77241 77246 77247 77248 77245 77250 77251 77252 77249 77254 77255 77256 77253 77258 77259 77260 77257 77262 77263 77264 77261 77266 77267 77268 77265 77270 77271 77272 77269 77274 77275 77276 77273 77278 77279 77280 77277 77282 77283 77284 77281 77286 77287 77288 77285 77290 77291 77292 77289 77294 77295 77296 77293 77298 77299 77300 77297 77302 77303 77304 77301 77306 77307 77308 77305 77310 77311 77312 77309 77314 77315 77316 77313 77318 77319 77320 77317 77322 77323 77324 77321 77326 77327 77328 77325 77330 77331 77332 77329 77334 77335 77336 77333 77338 77339 77340 77337 77342 77343 77344 77341 77346 77347 77348 77345 77350 77351 77352 77349 77354 77355 77356 77353 77358 77359 77360 77357 77362 77363 77364 77361 77366 77367 77368 77365 77370 77371 77372 77369 77374 77375 77376 77373 77378 77379 77380 77377 77382 77383 77384 77381 77386 77387 77388 77385 77390 77391 77392 77389 77394 77395 77396 77393 77398 77399 77400 77397 77402 77403 77404 77401 77406 77407 77408 77405 77410 77411 77412 77409 77414 77415 77416 77413 77418 77419 77420 77417 77422 77423 77424 77421 77426 77427 77428 77425 77430 77431 77432 77429 77434 77435 77436 77433 77438 77439 77440 77437 77442 77443 77444 77441 77446 77447 77448 77445 77450 77451 77452 77449 77454 77455 77456 77453 77458 77459 77460 77457 77462 77463 77464 77461 77466 77467 77468 77465 77470 77471 77472 77469 77474 77475 77476 77473 77478 77479 77480 77477 77482 77483 77484 77481 77486 77487 77488 77485 77490 77491 77492 77489 77494 77495 77496 77493 77498 77499 77500 77497 77502 77503 77504 77501 77506 77507 77508 77505 77510 77511 77512 77509 77514 77515 77516 77513 77518 77519 77520 77517 77522 77523 77524 77521 77526 77527 77528 77525 77530 77531 77532 77529 77534 77535 77536 77533 77538 77539 77540 77537 77542 77543 77544 77541 77546 77547 77548 77545 77550 77551 77552 77549 77554 77555 77556 77553 77558 77559 77560 77557 77562 77563 77564 77561 77566 77567 77568 77565 77570 77571 77572 77569 77574 77575 77576 77573 77578 77579 77580 77577 77582 77583 77584 77581 77586 77587 77588 77585 77590 77591 77592 77589 77594 77595 77596 77593 77598 77599 77600 77597 77602 77603 77604 77601 77606 77607 77608 77605 77610 77611 77612 77609 77614 77615 77616 77613 77618 77619 77620 77617 77622 77623 77624 77621 77626 77627 77628 77625 77630 77631 77632 77629 77634 77635 77636 77633 77638 77639 77640 77637 77642 77643 77644 77641 77646 77647 77648 77645 77650 77651 77652 77649 77654 77655 77656 77653 77658 77659 77660 77657 77662 77663 77664 77661 77666 77667 77668 77665 77670 77671 77672 77669 77674 77675 77676 77673 77678 77679 77680 77677 77682 77683 77684 77681 77686 77687 77688 77685 77690 77691 77692 77689 77694 77695 77696 77693 77698 77699 77700 77697 77702 77703 77704 77701 77706 77707 77708 77705 77710 77711 77712 77709 77714 77715 77716 77713 77718 77719 77720 77717 77722 77723 77724 77721 77726 77727 77728 77725 77730 77731 77732 77729 77734 77735 77736 77733 77738 77739 77740 77737 77742 77743 77744 77741 77746 77747 77748 77745 77750 77751 77752 77749 77754 77755 77756 77753 77758 77759 77760 77757 77762 77763 77764 77761 77766 77767 77768 77765 77770 77771 77772 77769 77774 77775 77776 77773 77778 77779 77780 77777 77782 77783 77784 77781 77786 77787 77788 77785 77790 77791 77792 77789 77794 77795 77796 77793 77798 77799 77800 77797 77802 77803 77804 77801 77806 77807 77808 77805 77810 77811 77812 77809 77814 77815 77816 77813 77818 77819 77820 77817 77822 77823 77824 77821 77826 77827 77828 77825 77830 77831 77832 77829 77834 77835 77836 77833 77838 77839 77840 77837 77842 77843 77844 77841 77846 77847 77848 77845 77850 77851 77852 77849 77854 77855 77856 77853 77858 77859 77860 77857 77862 77863 77864 77861 77866 77867 77868 77865 77870 77871 77872 77869 77874 77875 77876 77873 77878 77879 77880 77877 77882 77883 77884 77881 77886 77887 77888 77885 77890 77891 77892 77889 77894 77895 77896 77893 77898 77899 77900 77897 77902 77903 77904 77901 77906 77907 77908 77905 77910 77911 77912 77909 77914 77915 77916 77913 77918 77919 77920 77917 77922 77923 77924 77921 77926 77927 77928 77925 77930 77931 77932 77929 77934 77935 77936 77933 77938 77939 77940 77937 77942 77943 77944 77941 77946 77947 77948 77945 77950 77951 77952 77949 77954 77955 77956 77953 77958 77959 77960 77957 77962 77963 77964 77961 77966 77967 77968 77965 77970 77971 77972 77969 77974 77975 77976 77973 77978 77979 77980 77977 77982 77983 77984 77981 77986 77987 77988 77985 77990 77991 77992 77989 77994 77995 77996 77993 77998 77999 78000 77997 78002 78003 78004 78001 78006 78007 78008 78005 78010 78011 78012 78009 78014 78015 78016 78013 78018 78019 78020 78017 78022 78023 78024 78021 78026 78027 78028 78025 78030 78031 78032 78029 78034 78035 78036 78033 78038 78039 78040 78037 78042 78043 78044 78041 78046 78047 78048 78045 78050 78051 78052 78049 78054 78055 78056 78053 78058 78059 78060 78057 78062 78063 78064 78061 78066 78067 78068 78065 78070 78071 78072 78069 78074 78075 78076 78073 78078 78079 78080 78077 78082 78083 78084 78081 78086 78087 78088 78085 78090 78091 78092 78089 78094 78095 78096 78093 78098 78099 78100 78097 78102 78103 78104 78101 78106 78107 78108 78105 78110 78111 78112 78109 78114 78115 78116 78113 78118 78119 78120 78117 78122 78123 78124 78121 78126 78127 78128 78125 78130 78131 78132 78129 78134 78135 78136 78133 78138 78139 78140 78137 78142 78143 78144 78141 78146 78147 78148 78145 78150 78151 78152 78149 78154 78155 78156 78153 78158 78159 78160 78157 78162 78163 78164 78161 78166 78167 78168 78165 78170 78171 78172 78169 78174 78175 78176 78173 78178 78179 78180 78177 78182 78183 78184 78181 78186 78187 78188 78185 78190 78191 78192 78189 78194 78195 78196 78193 78198 78199 78200 78197 78202 78203 78204 78201 78206 78207 78208 78205 78210 78211 78212 78209 78214 78215 78216 78213 78218 78219 78220 78217 78222 78223 78224 78221 78226 78227 78228 78225 78230 78231 78232 78229 78234 78235 78236 78233 78238 78239 78240 78237 78242 78243 78244 78241 78246 78247 78248 78245 78250 78251 78252 78249 78254 78255 78256 78253 78258 78259 78260 78257 78262 78263 78264 78261 78266 78267 78268 78265 78270 78271 78272 78269 78274 78275 78276 78273 78278 78279 78280 78277 78282 78283 78284 78281 78286 78287 78288 78285 78290 78291 78292 78289 78294 78295 78296 78293 78298 78299 78300 78297 78302 78303 78304 78301 78306 78307 78308 78305 78310 78311 78312 78309 78314 78315 78316 78313 78318 78319 78320 78317 78322 78323 78324 78321 78326 78327 78328 78325 78330 78331 78332 78329 78334 78335 78336 78333 78338 78339 78340 78337 78342 78343 78344 78341 78346 78347 78348 78345 78350 78351 78352 78349 78354 78355 78356 78353 78358 78359 78360 78357 78362 78363 78364 78361 78366 78367 78368 78365 78370 78371 78372 78369 78374 78375 78376 78373 78378 78379 78380 78377 78382 78383 78384 78381 78386 78387 78388 78385 78390 78391 78392 78389 78394 78395 78396 78393 78398 78399 78400 78397 78402 78403 78404 78401 78406 78407 78408 78405 78410 78411 78412 78409 78414 78415 78416 78413 78418 78419 78420 78417 78422 78423 78424 78421 78426 78427 78428 78425 78430 78431 78432 78429 78434 78435 78436 78433 78438 78439 78440 78437 78442 78443 78444 78441 78446 78447 78448 78445 78450 78451 78452 78449 78454 78455 78456 78453 78458 78459 78460 78457 78462 78463 78464 78461 78466 78467 78468 78465 78470 78471 78472 78469 78474 78475 78476 78473 78478 78479 78480 78477 78482 78483 78484 78481 78486 78487 78488 78485 78490 78491 78492 78489 78494 78495 78496 78493 78498 78499 78500 78497 78502 78503 78504 78501 78506 78507 78508 78505 78510 78511 78512 78509 78514 78515 78516 78513 78518 78519 78520 78517 78522 78523 78524 78521 78526 78527 78528 78525 78530 78531 78532 78529 78534 78535 78536 78533 78538 78539 78540 78537 78542 78543 78544 78541 78546 78547 78548 78545 78550 78551 78552 78549 78554 78555 78556 78553 78558 78559 78560 78557 78562 78563 78564 78561 78566 78567 78568 78565 78570 78571 78572 78569 78574 78575 78576 78573 78578 78579 78580 78577 78582 78583 78584 78581 78586 78587 78588 78585 78590 78591 78592 78589 78594 78595 78596 78593 78598 78599 78600 78597 78602 78603 78604 78601 78606 78607 78608 78605 78610 78611 78612 78609 78614 78615 78616 78613 78618 78619 78620 78617 78622 78623 78624 78621 78626 78627 78628 78625 78630 78631 78632 78629 78634 78635 78636 78633 78638 78639 78640 78637 78642 78643 78644 78641 78646 78647 78648 78645 78650 78651 78652 78649 78654 78655 78656 78653 78658 78659 78660 78657 78662 78663 78664 78661 78666 78667 78668 78665 78670 78671 78672 78669 78674 78675 78676 78673 78678 78679 78680 78677 78682 78683 78684 78681 78686 78687 78688 78685 78690 78691 78692 78689 78694 78695 78696 78693 78698 78699 78700 78697 78702 78703 78704 78701 78706 78707 78708 78705 78710 78711 78712 78709 78714 78715 78716 78713 78718 78719 78720 78717 78722 78723 78724 78721 78726 78727 78728 78725 78730 78731 78732 78729 78734 78735 78736 78733 78738 78739 78740 78737 78742 78743 78744 78741 78746 78747 78748 78745 78750 78751 78752 78749 78754 78755 78756 78753 78758 78759 78760 78757 78762 78763 78764 78761 78766 78767 78768 78765 78770 78771 78772 78769 78774 78775 78776 78773 78778 78779 78780 78777 78782 78783 78784 78781 78786 78787 78788 78785 78790 78791 78792 78789 78794 78795 78796 78793 78798 78799 78800 78797 78802 78803 78804 78801 78806 78807 78808 78805 78810 78811 78812 78809 78814 78815 78816 78813 78818 78819 78820 78817 78822 78823 78824 78821 78826 78827 78828 78825 78830 78831 78832 78829 78834 78835 78836 78833 78838 78839 78840 78837 78842 78843 78844 78841 78846 78847 78848 78845 78850 78851 78852 78849 78854 78855 78856 78853 78858 78859 78860 78857 78862 78863 78864 78861 78866 78867 78868 78865 78870 78871 78872 78869 78874 78875 78876 78873 78878 78879 78880 78877 78882 78883 78884 78881 78886 78887 78888 78885 78890 78891 78892 78889 78894 78895 78896 78893 78898 78899 78900 78897 78902 78903 78904 78901 78906 78907 78908 78905 78910 78911 78912 78909 78914 78915 78916 78913 78918 78919 78920 78917 78922 78923 78924 78921 78926 78927 78928 78925 78930 78931 78932 78929 78934 78935 78936 78933 78938 78939 78940 78937 78942 78943 78944 78941 78946 78947 78948 78945 78950 78951 78952 78949 78954 78955 78956 78953 78958 78959 78960 78957 78962 78963 78964 78961 78966 78967 78968 78965 78970 78971 78972 78969 78974 78975 78976 78973 78978 78979 78980 78977 78982 78983 78984 78981 78986 78987 78988 78985 78990 78991 78992 78989 78994 78995 78996 78993 78998 78999 79000 78997 79002 79003 79004 79001 79006 79007 79008 79005 79010 79011 79012 79009 79014 79015 79016 79013 79018 79019 79020 79017 79022 79023 79024 79021 79026 79027 79028 79025 79030 79031 79032 79029 79034 79035 79036 79033 79038 79039 79040 79037 79042 79043 79044 79041 79046 79047 79048 79045 79050 79051 79052 79049 79054 79055 79056 79053 79058 79059 79060 79057 79062 79063 79064 79061 79066 79067 79068 79065 79070 79071 79072 79069 79074 79075 79076 79073 79078 79079 79080 79077 79082 79083 79084 79081 79086 79087 79088 79085 79090 79091 79092 79089 79094 79095 79096 79093 79098 79099 79100 79097 79102 79103 79104 79101 79106 79107 79108 79105 79110 79111 79112 79109 79114 79115 79116 79113 79118 79119 79120 79117 79122 79123 79124 79121 79126 79127 79128 79125 79130 79131 79132 79129 79134 79135 79136 79133 79138 79139 79140 79137 79142 79143 79144 79141 79146 79147 79148 79145 79150 79151 79152 79149 79154 79155 79156 79153 79158 79159 79160 79157 79162 79163 79164 79161 79166 79167 79168 79165 79170 79171 79172 79169 79174 79175 79176 79173 79178 79179 79180 79177 79182 79183 79184 79181 79186 79187 79188 79185 79190 79191 79192 79189 79194 79195 79196 79193 79198 79199 79200 79197 79202 79203 79204 79201 79206 79207 79208 79205 79210 79211 79212 79209 79214 79215 79216 79213 79218 79219 79220 79217 79222 79223 79224 79221 79226 79227 79228 79225 79230 79231 79232 79229 79234 79235 79236 79233 79238 79239 79240 79237 79242 79243 79244 79241 79246 79247 79248 79245 79250 79251 79252 79249 79254 79255 79256 79253 79258 79259 79260 79257 79262 79263 79264 79261 79266 79267 79268 79265 79270 79271 79272 79269 79274 79275 79276 79273 79278 79279 79280 79277 79282 79283 79284 79281 79286 79287 79288 79285 79290 79291 79292 79289 79294 79295 79296 79293 79298 79299 79300 79297 79302 79303 79304 79301 79306 79307 79308 79305 79310 79311 79312 79309 79314 79315 79316 79313 79318 79319 79320 79317 79322 79323 79324 79321 79326 79327 79328 79325 79330 79331 79332 79329 79334 79335 79336 79333 79338 79339 79340 79337 79342 79343 79344 79341 79346 79347 79348 79345 79350 79351 79352 79349 79354 79355 79356 79353 79358 79359 79360 79357 79362 79363 79364 79361 79366 79367 79368 79365 79370 79371 79372 79369 79374 79375 79376 79373 79378 79379 79380 79377 79382 79383 79384 79381 79386 79387 79388 79385 79390 79391 79392 79389 79394 79395 79396 79393 79398 79399 79400 79397 79402 79403 79404 79401 79406 79407 79408 79405 79410 79411 79412 79409 79414 79415 79416 79413 79418 79419 79420 79417 79422 79423 79424 79421 79426 79427 79428 79425 79430 79431 79432 79429 79434 79435 79436 79433 79438 79439 79440 79437 79442 79443 79444 79441 79446 79447 79448 79445 79450 79451 79452 79449 79454 79455 79456 79453 79458 79459 79460 79457 79462 79463 79464 79461 79466 79467 79468 79465 79470 79471 79472 79469 79474 79475 79476 79473 79478 79479 79480 79477 79482 79483 79484 79481 79486 79487 79488 79485 79490 79491 79492 79489 79494 79495 79496 79493 79498 79499 79500 79497 79502 79503 79504 79501 79506 79507 79508 79505 79510 79511 79512 79509 79514 79515 79516 79513 79518 79519 79520 79517 79522 79523 79524 79521 79526 79527 79528 79525 79530 79531 79532 79529 79534 79535 79536 79533 79538 79539 79540 79537 79542 79543 79544 79541 79546 79547 79548 79545 79550 79551 79552 79549 79554 79555 79556 79553 79558 79559 79560 79557 79562 79563 79564 79561 79566 79567 79568 79565 79570 79571 79572 79569 79574 79575 79576 79573 79578 79579 79580 79577 79582 79583 79584 79581 79586 79587 79588 79585 79590 79591 79592 79589 79594 79595 79596 79593 79598 79599 79600 79597 79602 79603 79604 79601 79606 79607 79608 79605 79610 79611 79612 79609 79614 79615 79616 79613 79618 79619 79620 79617 79622 79623 79624 79621 79626 79627 79628 79625 79630 79631 79632 79629 79634 79635 79636 79633 79638 79639 79640 79637 79642 79643 79644 79641 79646 79647 79648 79645 79650 79651 79652 79649 79654 79655 79656 79653 79658 79659 79660 79657 79662 79663 79664 79661 79666 79667 79668 79665 79670 79671 79672 79669 79674 79675 79676 79673 79678 79679 79680 79677 79682 79683 79684 79681 79686 79687 79688 79685 79690 79691 79692 79689 79694 79695 79696 79693 79698 79699 79700 79697 79702 79703 79704 79701 79706 79707 79708 79705 79710 79711 79712 79709 79714 79715 79716 79713 79718 79719 79720 79717 79722 79723 79724 79721 79726 79727 79728 79725 79730 79731 79732 79729 79734 79735 79736 79733 79738 79739 79740 79737 79742 79743 79744 79741 79746 79747 79748 79745 79750 79751 79752 79749 79754 79755 79756 79753 79758 79759 79760 79757 79762 79763 79764 79761 79766 79767 79768 79765 79770 79771 79772 79769 79774 79775 79776 79773 79778 79779 79780 79777 79782 79783 79784 79781 79786 79787 79788 79785 79790 79791 79792 79789 79794 79795 79796 79793 79798 79799 79800 79797 79802 79803 79804 79801 79806 79807 79808 79805 79810 79811 79812 79809 79814 79815 79816 79813 79818 79819 79820 79817 79822 79823 79824 79821 79826 79827 79828 79825 79830 79831 79832 79829 79834 79835 79836 79833 79838 79839 79840 79837 79842 79843 79844 79841 79846 79847 79848 79845 79850 79851 79852 79849 79854 79855 79856 79853 79858 79859 79860 79857 79862 79863 79864 79861 79866 79867 79868 79865 79870 79871 79872 79869 79874 79875 79876 79873 79878 79879 79880 79877 79882 79883 79884 79881 79886 79887 79888 79885 79890 79891 79892 79889 79894 79895 79896 79893 79898 79899 79900 79897 79902 79903 79904 79901 79906 79907 79908 79905 79910 79911 79912 79909 79914 79915 79916 79913 79918 79919 79920 79917 79922 79923 79924 79921 79926 79927 79928 79925 79930 79931 79932 79929 79934 79935 79936 79933 79938 79939 79940 79937 79942 79943 79944 79941 79946 79947 79948 79945 79950 79951 79952 79949 79954 79955 79956 79953 79958 79959 79960 79957 79962 79963 79964 79961 79966 79967 79968 79965 79970 79971 79972 79969 79974 79975 79976 79973 79978 79979 79980 79977 79982 79983 79984 79981 79986 79987 79988 79985 79990 79991 79992 79989 79994 79995 79996 79993 79998 79999 80000 79997 80002 80003 80004 80001 80006 80007 80008 80005 80010 80011 80012 80009 80014 80015 80016 80013 80018 80019 80020 80017 80022 80023 80024 80021 80026 80027 80028 80025 80030 80031 80032 80029 80034 80035 80036 80033 80038 80039 80040 80037 80042 80043 80044 80041 80046 80047 80048 80045 80050 80051 80052 80049 80054 80055 80056 80053 80058 80059 80060 80057 80062 80063 80064 80061 80066 80067 80068 80065 80070 80071 80072 80069 80074 80075 80076 80073 80078 80079 80080 80077 80082 80083 80084 80081 80086 80087 80088 80085 80090 80091 80092 80089 80094 80095 80096 80093 80098 80099 80100 80097 80102 80103 80104 80101 80106 80107 80108 80105 80110 80111 80112 80109 80114 80115 80116 80113 80118 80119 80120 80117 80122 80123 80124 80121 80126 80127 80128 80125 80130 80131 80132 80129 80134 80135 80136 80133 80138 80139 80140 80137 80142 80143 80144 80141 80146 80147 80148 80145 80150 80151 80152 80149 80154 80155 80156 80153 80158 80159 80160 80157 80162 80163 80164 80161 80166 80167 80168 80165 80170 80171 80172 80169 80174 80175 80176 80173 80178 80179 80180 80177 80182 80183 80184 80181 80186 80187 80188 80185 80190 80191 80192 80189 80194 80195 80196 80193 80198 80199 80200 80197 80202 80203 80204 80201 80206 80207 80208 80205 80210 80211 80212 80209 80214 80215 80216 80213 80218 80219 80220 80217 80222 80223 80224 80221 80226 80227 80228 80225 80230 80231 80232 80229 80234 80235 80236 80233 80238 80239 80240 80237 80242 80243 80244 80241 80246 80247 80248 80245 80250 80251 80252 80249 80254 80255 80256 80253 80258 80259 80260 80257 80262 80263 80264 80261 80266 80267 80268 80265 80270 80271 80272 80269 80274 80275 80276 80273 80278 80279 80280 80277 80282 80283 80284 80281 80286 80287 80288 80285 80290 80291 80292 80289 80294 80295 80296 80293 80298 80299 80300 80297 80302 80303 80304 80301 80306 80307 80308 80305 80310 80311 80312 80309 80314 80315 80316 80313 80318 80319 80320 80317 80322 80323 80324 80321 80326 80327 80328 80325 80330 80331 80332 80329 80334 80335 80336 80333 80338 80339 80340 80337 80342 80343 80344 80341 80346 80347 80348 80345 80350 80351 80352 80349 80354 80355 80356 80353 80358 80359 80360 80357 80362 80363 80364 80361 80366 80367 80368 80365 80370 80371 80372 80369 80374 80375 80376 80373 80378 80379 80380 80377 80382 80383 80384 80381 80386 80387 80388 80385 80390 80391 80392 80389 80394 80395 80396 80393 80398 80399 80400 80397 80402 80403 80404 80401 80406 80407 80408 80405 80410 80411 80412 80409 80414 80415 80416 80413 80418 80419 80420 80417 80422 80423 80424 80421 80426 80427 80428 80425 80430 80431 80432 80429 80434 80435 80436 80433 80438 80439 80440 80437 80442 80443 80444 80441 80446 80447 80448 80445 80450 80451 80452 80449 80454 80455 80456 80453 80458 80459 80460 80457 80462 80463 80464 80461 80466 80467 80468 80465 80470 80471 80472 80469 80474 80475 80476 80473 80478 80479 80480 80477 80482 80483 80484 80481 80486 80487 80488 80485 80490 80491 80492 80489 80494 80495 80496 80493 80498 80499 80500 80497 80502 80503 80504 80501 80506 80507 80508 80505 80510 80511 80512 80509 80514 80515 80516 80513 80518 80519 80520 80517 80522 80523 80524 80521 80526 80527 80528 80525 80530 80531 80532 80529 80534 80535 80536 80533 80538 80539 80540 80537 80542 80543 80544 80541 80546 80547 80548 80545 80550 80551 80552 80549 80554 80555 80556 80553 80558 80559 80560 80557 80562 80563 80564 80561 80566 80567 80568 80565 80570 80571 80572 80569 80574 80575 80576 80573 80578 80579 80580 80577 80582 80583 80584 80581 80586 80587 80588 80585 80590 80591 80592 80589 80594 80595 80596 80593 80598 80599 80600 80597 80602 80603 80604 80601 80606 80607 80608 80605 80610 80611 80612 80609 80614 80615 80616 80613 80618 80619 80620 80617 80622 80623 80624 80621 80626 80627 80628 80625 80630 80631 80632 80629 80634 80635 80636 80633 80638 80639 80640 80637 80642 80643 80644 80641 80646 80647 80648 80645 80650 80651 80652 80649 80654 80655 80656 80653 80658 80659 80660 80657 80662 80663 80664 80661 80666 80667 80668 80665 80670 80671 80672 80669 80674 80675 80676 80673 80678 80679 80680 80677 80682 80683 80684 80681 80686 80687 80688 80685 80690 80691 80692 80689 80694 80695 80696 80693 80698 80699 80700 80697 80702 80703 80704 80701 80706 80707 80708 80705 80710 80711 80712 80709 80714 80715 80716 80713 80718 80719 80720 80717 80722 80723 80724 80721 80726 80727 80728 80725 80730 80731 80732 80729 80734 80735 80736 80733 80738 80739 80740 80737 80742 80743 80744 80741 80746 80747 80748 80745 80750 80751 80752 80749 80754 80755 80756 80753 80758 80759 80760 80757 80762 80763 80764 80761 80766 80767 80768 80765 80770 80771 80772 80769 80774 80775 80776 80773 80778 80779 80780 80777 80782 80783 80784 80781 80786 80787 80788 80785 80790 80791 80792 80789 80794 80795 80796 80793 80798 80799 80800 80797 80802 80803 80804 80801 80806 80807 80808 80805 80810 80811 80812 80809 80814 80815 80816 80813 80818 80819 80820 80817 80822 80823 80824 80821 80826 80827 80828 80825 80830 80831 80832 80829 80834 80835 80836 80833 80838 80839 80840 80837 80842 80843 80844 80841 80846 80847 80848 80845 80850 80851 80852 80849 80854 80855 80856 80853 80858 80859 80860 80857 80862 80863 80864 80861 80866 80867 80868 80865 80870 80871 80872 80869 80874 80875 80876 80873 80878 80879 80880 80877 80882 80883 80884 80881 80886 80887 80888 80885 80890 80891 80892 80889 80894 80895 80896 80893 80898 80899 80900 80897 80902 80903 80904 80901 80906 80907 80908 80905 80910 80911 80912 80909 80914 80915 80916 80913 80918 80919 80920 80917 80922 80923 80924 80921 80926 80927 80928 80925 80930 80931 80932 80929 80934 80935 80936 80933 80938 80939 80940 80937 80942 80943 80944 80941 80946 80947 80948 80945 80950 80951 80952 80949 80954 80955 80956 80953 80958 80959 80960 80957 80962 80963 80964 80961 80966 80967 80968 80965 80970 80971 80972 80969 80974 80975 80976 80973 80978 80979 80980 80977 80982 80983 80984 80981 80986 80987 80988 80985 80990 80991 80992 80989 80994 80995 80996 80993 80998 80999 81000 80997 81002 81003 81004 81001 81006 81007 81008 81005 81010 81011 81012 81009 81014 81015 81016 81013 81018 81019 81020 81017 81022 81023 81024 81021 81026 81027 81028 81025 81030 81031 81032 81029 81034 81035 81036 81033 81038 81039 81040 81037 81042 81043 81044 81041 81046 81047 81048 81045 81050 81051 81052 81049 81054 81055 81056 81053 81058 81059 81060 81057 81062 81063 81064 81061 81066 81067 81068 81065 81070 81071 81072 81069 81074 81075 81076 81073 81078 81079 81080 81077 81082 81083 81084 81081 81086 81087 81088 81085 81090 81091 81092 81089 81094 81095 81096 81093 81098 81099 81100 81097 81102 81103 81104 81101 81106 81107 81108 81105 81110 81111 81112 81109 81114 81115 81116 81113 81118 81119 81120 81117 81122 81123 81124 81121 81126 81127 81128 81125 81130 81131 81132 81129 81134 81135 81136 81133 81138 81139 81140 81137 81142 81143 81144 81141 81146 81147 81148 81145 81150 81151 81152 81149 81154 81155 81156 81153 81158 81159 81160 81157 81162 81163 81164 81161 81166 81167 81168 81165 81170 81171 81172 81169 81174 81175 81176 81173 81178 81179 81180 81177 81182 81183 81184 81181 81186 81187 81188 81185 81190 81191 81192 81189 81194 81195 81196 81193 81198 81199 81200 81197 81202 81203 81204 81201 81206 81207 81208 81205 81210 81211 81212 81209 81214 81215 81216 81213 81218 81219 81220 81217 81222 81223 81224 81221 81226 81227 81228 81225 81230 81231 81232 81229 81234 81235 81236 81233 81238 81239 81240 81237 81242 81243 81244 81241 81246 81247 81248 81245 81250 81251 81252 81249 81254 81255 81256 81253 81258 81259 81260 81257 81262 81263 81264 81261 81266 81267 81268 81265 81270 81271 81272 81269 81274 81275 81276 81273 81278 81279 81280 81277 81282 81283 81284 81281 81286 81287 81288 81285 81290 81291 81292 81289 81294 81295 81296 81293 81298 81299 81300 81297 81302 81303 81304 81301 81306 81307 81308 81305 81310 81311 81312 81309 81314 81315 81316 81313 81318 81319 81320 81317 81322 81323 81324 81321 81326 81327 81328 81325 81330 81331 81332 81329 81334 81335 81336 81333 81338 81339 81340 81337 81342 81343 81344 81341 81346 81347 81348 81345 81350 81351 81352 81349 81354 81355 81356 81353 81358 81359 81360 81357 81362 81363 81364 81361 81366 81367 81368 81365 81370 81371 81372 81369 81374 81375 81376 81373 81378 81379 81380 81377 81382 81383 81384 81381 81386 81387 81388 81385 81390 81391 81392 81389 81394 81395 81396 81393 81398 81399 81400 81397 81402 81403 81404 81401 81406 81407 81408 81405 81410 81411 81412 81409 81414 81415 81416 81413 81418 81419 81420 81417 81422 81423 81424 81421 81426 81427 81428 81425 81430 81431 81432 81429 81434 81435 81436 81433 81438 81439 81440 81437 81442 81443 81444 81441 81446 81447 81448 81445 81450 81451 81452 81449 81454 81455 81456 81453 81458 81459 81460 81457 81462 81463 81464 81461 81466 81467 81468 81465 81470 81471 81472 81469 81474 81475 81476 81473 81478 81479 81480 81477 81482 81483 81484 81481 81486 81487 81488 81485 81490 81491 81492 81489 81494 81495 81496 81493 81498 81499 81500 81497 81502 81503 81504 81501 81506 81507 81508 81505 81510 81511 81512 81509 81514 81515 81516 81513 81518 81519 81520 81517 81522 81523 81524 81521 81526 81527 81528 81525 81530 81531 81532 81529 81534 81535 81536 81533 81538 81539 81540 81537 81542 81543 81544 81541 81546 81547 81548 81545 81550 81551 81552 81549 81554 81555 81556 81553 81558 81559 81560 81557 81562 81563 81564 81561 81566 81567 81568 81565 81570 81571 81572 81569 81574 81575 81576 81573 81578 81579 81580 81577 81582 81583 81584 81581 81586 81587 81588 81585 81590 81591 81592 81589 81594 81595 81596 81593 81598 81599 81600 81597 81602 81603 81604 81601 81606 81607 81608 81605 81610 81611 81612 81609 81614 81615 81616 81613 81618 81619 81620 81617 81622 81623 81624 81621 81626 81627 81628 81625 81630 81631 81632 81629 81634 81635 81636 81633 81638 81639 81640 81637 81642 81643 81644 81641 81646 81647 81648 81645 81650 81651 81652 81649 81654 81655 81656 81653 81658 81659 81660 81657 81662 81663 81664 81661 81666 81667 81668 81665 81670 81671 81672 81669 81674 81675 81676 81673 81678 81679 81680 81677 81682 81683 81684 81681 81686 81687 81688 81685 81690 81691 81692 81689 81694 81695 81696 81693 81698 81699 81700 81697 81702 81703 81704 81701 81706 81707 81708 81705 81710 81711 81712 81709 81714 81715 81716 81713 81718 81719 81720 81717 81722 81723 81724 81721 81726 81727 81728 81725 81730 81731 81732 81729 81734 81735 81736 81733 81738 81739 81740 81737 81742 81743 81744 81741 81746 81747 81748 81745 81750 81751 81752 81749 81754 81755 81756 81753 81758 81759 81760 81757 81762 81763 81764 81761 81766 81767 81768 81765 81770 81771 81772 81769 81774 81775 81776 81773 81778 81779 81780 81777 81782 81783 81784 81781 81786 81787 81788 81785 81790 81791 81792 81789 81794 81795 81796 81793 81798 81799 81800 81797 81802 81803 81804 81801 81806 81807 81808 81805 81810 81811 81812 81809 81814 81815 81816 81813 81818 81819 81820 81817 81822 81823 81824 81821 81826 81827 81828 81825 81830 81831 81832 81829 81834 81835 81836 81833 81838 81839 81840 81837 81842 81843 81844 81841 81846 81847 81848 81845 81850 81851 81852 81849 81854 81855 81856 81853 81858 81859 81860 81857 81862 81863 81864 81861 81866 81867 81868 81865 81870 81871 81872 81869 81874 81875 81876 81873 81878 81879 81880 81877 81882 81883 81884 81881 81886 81887 81888 81885 81890 81891 81892 81889 81894 81895 81896 81893 81898 81899 81900 81897 81902 81903 81904 81901 81906 81907 81908 81905 81910 81911 81912 81909 81914 81915 81916 81913 81918 81919 81920 81917 81922 81923 81924 81921 81926 81927 81928 81925 81930 81931 81932 81929 81934 81935 81936 81933 81938 81939 81940 81937 81942 81943 81944 81941 81946 81947 81948 81945 81950 81951 81952 81949 81954 81955 81956 81953 81958 81959 81960 81957 81962 81963 81964 81961 81966 81967 81968 81965 81970 81971 81972 81969 81974 81975 81976 81973 81978 81979 81980 81977 81982 81983 81984 81981 81986 81987 81988 81985 81990 81991 81992 81989 81994 81995 81996 81993 81998 81999 82000 81997 82002 82003 82004 82001 82006 82007 82008 82005 82010 82011 82012 82009 82014 82015 82016 82013 82018 82019 82020 82017 82022 82023 82024 82021 82026 82027 82028 82025 82030 82031 82032 82029 82034 82035 82036 82033 82038 82039 82040 82037 82042 82043 82044 82041 82046 82047 82048 82045 82050 82051 82052 82049 82054 82055 82056 82053 82058 82059 82060 82057 82062 82063 82064 82061 82066 82067 82068 82065 82070 82071 82072 82069 82074 82075 82076 82073 82078 82079 82080 82077 82082 82083 82084 82081 82086 82087 82088 82085 82090 82091 82092 82089 82094 82095 82096 82093 82098 82099 82100 82097 82102 82103 82104 82101 82106 82107 82108 82105 82110 82111 82112 82109 82114 82115 82116 82113 82118 82119 82120 82117 82122 82123 82124 82121 82126 82127 82128 82125 82130 82131 82132 82129 82134 82135 82136 82133 82138 82139 82140 82137 82142 82143 82144 82141 82146 82147 82148 82145 82150 82151 82152 82149 82154 82155 82156 82153 82158 82159 82160 82157 82162 82163 82164 82161 82166 82167 82168 82165 82170 82171 82172 82169 82174 82175 82176 82173 82178 82179 82180 82177 82182 82183 82184 82181 82186 82187 82188 82185 82190 82191 82192 82189 82194 82195 82196 82193 82198 82199 82200 82197 82202 82203 82204 82201 82206 82207 82208 82205 82210 82211 82212 82209 82214 82215 82216 82213 82218 82219 82220 82217 82222 82223 82224 82221 82226 82227 82228 82225 82230 82231 82232 82229 82234 82235 82236 82233 82238 82239 82240 82237 82242 82243 82244 82241 82246 82247 82248 82245 82250 82251 82252 82249 82254 82255 82256 82253 82258 82259 82260 82257 82262 82263 82264 82261 82266 82267 82268 82265 82270 82271 82272 82269 82274 82275 82276 82273 82278 82279 82280 82277 82282 82283 82284 82281 82286 82287 82288 82285 82290 82291 82292 82289 82294 82295 82296 82293 82298 82299 82300 82297 82302 82303 82304 82301 82306 82307 82308 82305 82310 82311 82312 82309 82314 82315 82316 82313 82318 82319 82320 82317 82322 82323 82324 82321 82326 82327 82328 82325 82330 82331 82332 82329 82334 82335 82336 82333 82338 82339 82340 82337 82342 82343 82344 82341 82346 82347 82348 82345 82350 82351 82352 82349 82354 82355 82356 82353 82358 82359 82360 82357 82362 82363 82364 82361 82366 82367 82368 82365 82370 82371 82372 82369 82374 82375 82376 82373 82378 82379 82380 82377 82382 82383 82384 82381 82386 82387 82388 82385 82390 82391 82392 82389 82394 82395 82396 82393 82398 82399 82400 82397 82402 82403 82404 82401 82406 82407 82408 82405 82410 82411 82412 82409 82414 82415 82416 82413 82418 82419 82420 82417 82422 82423 82424 82421 82426 82427 82428 82425 82430 82431 82432 82429 82434 82435 82436 82433 82438 82439 82440 82437 82442 82443 82444 82441 82446 82447 82448 82445 82450 82451 82452 82449 82454 82455 82456 82453 82458 82459 82460 82457 82462 82463 82464 82461 82466 82467 82468 82465 82470 82471 82472 82469 82474 82475 82476 82473 82478 82479 82480 82477 82482 82483 82484 82481 82486 82487 82488 82485 82490 82491 82492 82489 82494 82495 82496 82493 82498 82499 82500 82497 82502 82503 82504 82501 82506 82507 82508 82505 82510 82511 82512 82509 82514 82515 82516 82513 82518 82519 82520 82517 82522 82523 82524 82521 82526 82527 82528 82525 82530 82531 82532 82529 82534 82535 82536 82533 82538 82539 82540 82537 82542 82543 82544 82541 82546 82547 82548 82545 82550 82551 82552 82549 82554 82555 82556 82553 82558 82559 82560 82557 82562 82563 82564 82561 82566 82567 82568 82565 82570 82571 82572 82569 82574 82575 82576 82573 82578 82579 82580 82577 82582 82583 82584 82581 82586 82587 82588 82585 82590 82591 82592 82589 82594 82595 82596 82593 82598 82599 82600 82597 82602 82603 82604 82601 82606 82607 82608 82605 82610 82611 82612 82609 82614 82615 82616 82613 82618 82619 82620 82617 82622 82623 82624 82621 82626 82627 82628 82625 82630 82631 82632 82629 82634 82635 82636 82633 82638 82639 82640 82637 82642 82643 82644 82641 82646 82647 82648 82645 82650 82651 82652 82649 82654 82655 82656 82653 82658 82659 82660 82657 82662 82663 82664 82661 82666 82667 82668 82665 82670 82671 82672 82669 82674 82675 82676 82673 82678 82679 82680 82677 82682 82683 82684 82681 82686 82687 82688 82685 82690 82691 82692 82689 82694 82695 82696 82693 82698 82699 82700 82697 82702 82703 82704 82701 82706 82707 82708 82705 82710 82711 82712 82709 82714 82715 82716 82713 82718 82719 82720 82717 82722 82723 82724 82721 82726 82727 82728 82725 82730 82731 82732 82729 82734 82735 82736 82733 82738 82739 82740 82737 82742 82743 82744 82741 82746 82747 82748 82745 82750 82751 82752 82749 82754 82755 82756 82753 82758 82759 82760 82757 82762 82763 82764 82761 82766 82767 82768 82765 82770 82771 82772 82769 82774 82775 82776 82773 82778 82779 82780 82777 82782 82783 82784 82781 82786 82787 82788 82785 82790 82791 82792 82789 82794 82795 82796 82793 82798 82799 82800 82797 82802 82803 82804 82801 82806 82807 82808 82805 82810 82811 82812 82809 82814 82815 82816 82813 82818 82819 82820 82817 82822 82823 82824 82821 82826 82827 82828 82825 82830 82831 82832 82829 82834 82835 82836 82833 82838 82839 82840 82837 82842 82843 82844 82841 82846 82847 82848 82845 82850 82851 82852 82849 82854 82855 82856 82853 82858 82859 82860 82857 82862 82863 82864 82861 82866 82867 82868 82865 82870 82871 82872 82869 82874 82875 82876 82873 82878 82879 82880 82877 82882 82883 82884 82881 82886 82887 82888 82885 82890 82891 82892 82889 82894 82895 82896 82893 82898 82899 82900 82897 82902 82903 82904 82901 82906 82907 82908 82905 82910 82911 82912 82909 82914 82915 82916 82913 82918 82919 82920 82917 82922 82923 82924 82921 82926 82927 82928 82925 82930 82931 82932 82929 82934 82935 82936 82933 82938 82939 82940 82937 82942 82943 82944 82941 82946 82947 82948 82945 82950 82951 82952 82949 82954 82955 82956 82953 82958 82959 82960 82957 82962 82963 82964 82961 82966 82967 82968 82965 82970 82971 82972 82969 82974 82975 82976 82973 82978 82979 82980 82977 82982 82983 82984 82981 82986 82987 82988 82985 82990 82991 82992 82989 82994 82995 82996 82993 82998 82999 83000 82997 83002 83003 83004 83001 83006 83007 83008 83005 83010 83011 83012 83009 83014 83015 83016 83013 83018 83019 83020 83017 83022 83023 83024 83021 83026 83027 83028 83025 83030 83031 83032 83029 83034 83035 83036 83033 83038 83039 83040 83037 83042 83043 83044 83041 83046 83047 83048 83045 83050 83051 83052 83049 83054 83055 83056 83053 83058 83059 83060 83057 83062 83063 83064 83061 83066 83067 83068 83065 83070 83071 83072 83069 83074 83075 83076 83073 83078 83079 83080 83077 83082 83083 83084 83081 83086 83087 83088 83085 83090 83091 83092 83089 83094 83095 83096 83093 83098 83099 83100 83097 83102 83103 83104 83101 83106 83107 83108 83105 83110 83111 83112 83109 83114 83115 83116 83113 83118 83119 83120 83117 83122 83123 83124 83121 83126 83127 83128 83125 83130 83131 83132 83129 83134 83135 83136 83133 83138 83139 83140 83137 83142 83143 83144 83141 83146 83147 83148 83145 83150 83151 83152 83149 83154 83155 83156 83153 83158 83159 83160 83157 83162 83163 83164 83161 83166 83167 83168 83165 83170 83171 83172 83169 83174 83175 83176 83173 83178 83179 83180 83177 83182 83183 83184 83181 83186 83187 83188 83185 83190 83191 83192 83189 83194 83195 83196 83193 83198 83199 83200 83197 83202 83203 83204 83201 83206 83207 83208 83205 83210 83211 83212 83209 83214 83215 83216 83213 83218 83219 83220 83217 83222 83223 83224 83221 83226 83227 83228 83225 83230 83231 83232 83229 83234 83235 83236 83233 83238 83239 83240 83237 83242 83243 83244 83241 83246 83247 83248 83245 83250 83251 83252 83249 83254 83255 83256 83253 83258 83259 83260 83257 83262 83263 83264 83261 83266 83267 83268 83265 83270 83271 83272 83269 83274 83275 83276 83273 83278 83279 83280 83277 83282 83283 83284 83281 83286 83287 83288 83285 83290 83291 83292 83289 83294 83295 83296 83293 83298 83299 83300 83297 83302 83303 83304 83301 83306 83307 83308 83305 83310 83311 83312 83309 83314 83315 83316 83313 83318 83319 83320 83317 83322 83323 83324 83321 83326 83327 83328 83325 83330 83331 83332 83329 83334 83335 83336 83333 83338 83339 83340 83337 83342 83343 83344 83341 83346 83347 83348 83345 83350 83351 83352 83349 83354 83355 83356 83353 83358 83359 83360 83357 83362 83363 83364 83361 83366 83367 83368 83365 83370 83371 83372 83369 83374 83375 83376 83373 83378 83379 83380 83377 83382 83383 83384 83381 83386 83387 83388 83385 83390 83391 83392 83389 83394 83395 83396 83393 83398 83399 83400 83397 83402 83403 83404 83401 83406 83407 83408 83405 83410 83411 83412 83409 83414 83415 83416 83413 83418 83419 83420 83417 83422 83423 83424 83421 83426 83427 83428 83425 83430 83431 83432 83429 83434 83435 83436 83433 83438 83439 83440 83437 83442 83443 83444 83441 83446 83447 83448 83445 83450 83451 83452 83449 83454 83455 83456 83453 83458 83459 83460 83457 83462 83463 83464 83461 83466 83467 83468 83465 83470 83471 83472 83469 83474 83475 83476 83473 83478 83479 83480 83477 83482 83483 83484 83481 83486 83487 83488 83485 83490 83491 83492 83489 83494 83495 83496 83493 83498 83499 83500 83497 83502 83503 83504 83501 83506 83507 83508 83505 83510 83511 83512 83509 83514 83515 83516 83513 83518 83519 83520 83517 83522 83523 83524 83521 83526 83527 83528 83525 83530 83531 83532 83529 83534 83535 83536 83533 83538 83539 83540 83537 83542 83543 83544 83541 83546 83547 83548 83545 83550 83551 83552 83549 83554 83555 83556 83553 83558 83559 83560 83557 83562 83563 83564 83561 83566 83567 83568 83565 83570 83571 83572 83569 83574 83575 83576 83573 83578 83579 83580 83577 83582 83583 83584 83581 83586 83587 83588 83585 83590 83591 83592 83589 83594 83595 83596 83593 83598 83599 83600 83597 83602 83603 83604 83601 83606 83607 83608 83605 83610 83611 83612 83609 83614 83615 83616 83613 83618 83619 83620 83617 83622 83623 83624 83621 83626 83627 83628 83625 83630 83631 83632 83629 83634 83635 83636 83633 83638 83639 83640 83637 83642 83643 83644 83641 83646 83647 83648 83645 83650 83651 83652 83649 83654 83655 83656 83653 83658 83659 83660 83657 83662 83663 83664 83661 83666 83667 83668 83665 83670 83671 83672 83669 83674 83675 83676 83673 83678 83679 83680 83677 83682 83683 83684 83681 83686 83687 83688 83685 83690 83691 83692 83689 83694 83695 83696 83693 83698 83699 83700 83697 83702 83703 83704 83701 83706 83707 83708 83705 83710 83711 83712 83709 83714 83715 83716 83713 83718 83719 83720 83717 83722 83723 83724 83721 83726 83727 83728 83725 83730 83731 83732 83729 83734 83735 83736 83733 83738 83739 83740 83737 83742 83743 83744 83741 83746 83747 83748 83745 83750 83751 83752 83749 83754 83755 83756 83753 83758 83759 83760 83757 83762 83763 83764 83761 83766 83767 83768 83765 83770 83771 83772 83769 83774 83775 83776 83773 83778 83779 83780 83777 83782 83783 83784 83781 83786 83787 83788 83785 83790 83791 83792 83789 83794 83795 83796 83793 83798 83799 83800 83797 83802 83803 83804 83801 83806 83807 83808 83805 83810 83811 83812 83809 83814 83815 83816 83813 83818 83819 83820 83817 83822 83823 83824 83821 83826 83827 83828 83825 83830 83831 83832 83829 83834 83835 83836 83833 83838 83839 83840 83837 83842 83843 83844 83841 83846 83847 83848 83845 83850 83851 83852 83849 83854 83855 83856 83853 83858 83859 83860 83857 83862 83863 83864 83861 83866 83867 83868 83865 83870 83871 83872 83869 83874 83875 83876 83873 83878 83879 83880 83877 83882 83883 83884 83881 83886 83887 83888 83885 83890 83891 83892 83889 83894 83895 83896 83893 83898 83899 83900 83897 83902 83903 83904 83901 83906 83907 83908 83905 83910 83911 83912 83909 83914 83915 83916 83913 83918 83919 83920 83917 83922 83923 83924 83921 83926 83927 83928 83925 83930 83931 83932 83929 83934 83935 83936 83933 83938 83939 83940 83937 83942 83943 83944 83941 83946 83947 83948 83945 83950 83951 83952 83949 83954 83955 83956 83953 83958 83959 83960 83957 83962 83963 83964 83961 83966 83967 83968 83965 83970 83971 83972 83969 83974 83975 83976 83973 83978 83979 83980 83977 83982 83983 83984 83981 83986 83987 83988 83985 83990 83991 83992 83989 83994 83995 83996 83993 83998 83999 84000 83997 84002 84003 84004 84001 84006 84007 84008 84005 84010 84011 84012 84009 84014 84015 84016 84013 84018 84019 84020 84017 84022 84023 84024 84021 84026 84027 84028 84025 84030 84031 84032 84029 84034 84035 84036 84033 84038 84039 84040 84037 84042 84043 84044 84041 84046 84047 84048 84045 84050 84051 84052 84049 84054 84055 84056 84053 84058 84059 84060 84057 84062 84063 84064 84061 84066 84067 84068 84065 84070 84071 84072 84069 84074 84075 84076 84073 84078 84079 84080 84077 84082 84083 84084 84081 84086 84087 84088 84085 84090 84091 84092 84089 84094 84095 84096 84093 84098 84099 84100 84097 84102 84103 84104 84101 84106 84107 84108 84105 84110 84111 84112 84109 84114 84115 84116 84113 84118 84119 84120 84117 84122 84123 84124 84121 84126 84127 84128 84125 84130 84131 84132 84129 84134 84135 84136 84133 84138 84139 84140 84137 84142 84143 84144 84141 84146 84147 84148 84145 84150 84151 84152 84149 84154 84155 84156 84153 84158 84159 84160 84157 84162 84163 84164 84161 84166 84167 84168 84165 84170 84171 84172 84169 84174 84175 84176 84173 84178 84179 84180 84177 84182 84183 84184 84181 84186 84187 84188 84185 84190 84191 84192 84189 84194 84195 84196 84193 84198 84199 84200 84197 84202 84203 84204 84201 84206 84207 84208 84205 84210 84211 84212 84209 84214 84215 84216 84213 84218 84219 84220 84217 84222 84223 84224 84221 84226 84227 84228 84225 84230 84231 84232 84229 84234 84235 84236 84233 84238 84239 84240 84237 84242 84243 84244 84241 84246 84247 84248 84245 84250 84251 84252 84249 84254 84255 84256 84253 84258 84259 84260 84257 84262 84263 84264 84261 84266 84267 84268 84265 84270 84271 84272 84269 84274 84275 84276 84273 84278 84279 84280 84277 84282 84283 84284 84281 84286 84287 84288 84285 84290 84291 84292 84289 84294 84295 84296 84293 84298 84299 84300 84297 84302 84303 84304 84301 84306 84307 84308 84305 84310 84311 84312 84309 84314 84315 84316 84313 84318 84319 84320 84317 84322 84323 84324 84321 84326 84327 84328 84325 84330 84331 84332 84329 84334 84335 84336 84333 84338 84339 84340 84337 84342 84343 84344 84341 84346 84347 84348 84345 84350 84351 84352 84349 84354 84355 84356 84353 84358 84359 84360 84357 84362 84363 84364 84361 84366 84367 84368 84365 84370 84371 84372 84369 84374 84375 84376 84373 84378 84379 84380 84377 84382 84383 84384 84381 84386 84387 84388 84385 84390 84391 84392 84389 84394 84395 84396 84393 84398 84399 84400 84397 84402 84403 84404 84401 84406 84407 84408 84405 84410 84411 84412 84409 84414 84415 84416 84413 84418 84419 84420 84417 84422 84423 84424 84421 84426 84427 84428 84425 84430 84431 84432 84429 84434 84435 84436 84433 84438 84439 84440 84437 84442 84443 84444 84441 84446 84447 84448 84445 84450 84451 84452 84449 84454 84455 84456 84453 84458 84459 84460 84457 84462 84463 84464 84461 84466 84467 84468 84465 84470 84471 84472 84469 84474 84475 84476 84473 84478 84479 84480 84477 84482 84483 84484 84481 84486 84487 84488 84485 84490 84491 84492 84489 84494 84495 84496 84493 84498 84499 84500 84497 84502 84503 84504 84501 84506 84507 84508 84505 84510 84511 84512 84509 84514 84515 84516 84513 84518 84519 84520 84517 84522 84523 84524 84521 84526 84527 84528 84525 84530 84531 84532 84529 84534 84535 84536 84533 84538 84539 84540 84537 84542 84543 84544 84541 84546 84547 84548 84545 84550 84551 84552 84549 84554 84555 84556 84553 84558 84559 84560 84557 84562 84563 84564 84561 84566 84567 84568 84565 84570 84571 84572 84569 84574 84575 84576 84573 84578 84579 84580 84577 84582 84583 84584 84581 84586 84587 84588 84585 84590 84591 84592 84589 84594 84595 84596 84593 84598 84599 84600 84597 84602 84603 84604 84601 84606 84607 84608 84605 84610 84611 84612 84609 84614 84615 84616 84613 84618 84619 84620 84617 84622 84623 84624 84621 84626 84627 84628 84625 84630 84631 84632 84629 84634 84635 84636 84633 84638 84639 84640 84637 84642 84643 84644 84641 84646 84647 84648 84645 84650 84651 84652 84649 84654 84655 84656 84653 84658 84659 84660 84657 84662 84663 84664 84661 84666 84667 84668 84665 84670 84671 84672 84669 84674 84675 84676 84673 84678 84679 84680 84677 84682 84683 84684 84681 84686 84687 84688 84685 84690 84691 84692 84689 84694 84695 84696 84693 84698 84699 84700 84697 84702 84703 84704 84701 84706 84707 84708 84705 84710 84711 84712 84709 84714 84715 84716 84713 84718 84719 84720 84717 84722 84723 84724 84721 84726 84727 84728 84725 84730 84731 84732 84729 84734 84735 84736 84733 84738 84739 84740 84737 84742 84743 84744 84741 84746 84747 84748 84745 84750 84751 84752 84749 84754 84755 84756 84753 84758 84759 84760 84757 84762 84763 84764 84761 84766 84767 84768 84765 84770 84771 84772 84769 84774 84775 84776 84773 84778 84779 84780 84777 84782 84783 84784 84781 84786 84787 84788 84785 84790 84791 84792 84789 84794 84795 84796 84793 84798 84799 84800 84797 84802 84803 84804 84801 84806 84807 84808 84805 84810 84811 84812 84809 84814 84815 84816 84813 84818 84819 84820 84817 84822 84823 84824 84821 84826 84827 84828 84825 84830 84831 84832 84829 84834 84835 84836 84833 84838 84839 84840 84837 84842 84843 84844 84841 84846 84847 84848 84845 84850 84851 84852 84849 84854 84855 84856 84853 84858 84859 84860 84857 84862 84863 84864 84861 84866 84867 84868 84865 84870 84871 84872 84869 84874 84875 84876 84873 84878 84879 84880 84877 84882 84883 84884 84881 84886 84887 84888 84885 84890 84891 84892 84889 84894 84895 84896 84893 84898 84899 84900 84897 84902 84903 84904 84901 84906 84907 84908 84905 84910 84911 84912 84909 84914 84915 84916 84913 84918 84919 84920 84917 84922 84923 84924 84921 84926 84927 84928 84925 84930 84931 84932 84929 84934 84935 84936 84933 84938 84939 84940 84937 84942 84943 84944 84941 84946 84947 84948 84945 84950 84951 84952 84949 84954 84955 84956 84953 84958 84959 84960 84957 84962 84963 84964 84961 84966 84967 84968 84965 84970 84971 84972 84969 84974 84975 84976 84973 84978 84979 84980 84977 84982 84983 84984 84981 84986 84987 84988 84985 84990 84991 84992 84989 84994 84995 84996 84993 84998 84999 85000 84997 85002 85003 85004 85001 85006 85007 85008 85005 85010 85011 85012 85009 85014 85015 85016 85013 85018 85019 85020 85017 85022 85023 85024 85021 85026 85027 85028 85025 85030 85031 85032 85029 85034 85035 85036 85033 85038 85039 85040 85037 85042 85043 85044 85041 85046 85047 85048 85045 85050 85051 85052 85049 85054 85055 85056 85053 85058 85059 85060 85057 85062 85063 85064 85061 85066 85067 85068 85065 85070 85071 85072 85069 85074 85075 85076 85073 85078 85079 85080 85077 85082 85083 85084 85081 85086 85087 85088 85085 85090 85091 85092 85089 85094 85095 85096 85093 85098 85099 85100 85097 85102 85103 85104 85101 85106 85107 85108 85105 85110 85111 85112 85109 85114 85115 85116 85113 85118 85119 85120 85117 85122 85123 85124 85121 85126 85127 85128 85125 85130 85131 85132 85129 85134 85135 85136 85133 85138 85139 85140 85137 85142 85143 85144 85141 85146 85147 85148 85145 85150 85151 85152 85149 85154 85155 85156 85153 85158 85159 85160 85157 85162 85163 85164 85161 85166 85167 85168 85165 85170 85171 85172 85169 85174 85175 85176 85173 85178 85179 85180 85177 85182 85183 85184 85181 85186 85187 85188 85185 85190 85191 85192 85189 85194 85195 85196 85193 85198 85199 85200 85197 85202 85203 85204 85201 85206 85207 85208 85205 85210 85211 85212 85209 85214 85215 85216 85213 85218 85219 85220 85217 85222 85223 85224 85221 85226 85227 85228 85225 85230 85231 85232 85229 85234 85235 85236 85233 85238 85239 85240 85237 85242 85243 85244 85241 85246 85247 85248 85245 85250 85251 85252 85249 85254 85255 85256 85253 85258 85259 85260 85257 85262 85263 85264 85261 85266 85267 85268 85265 85270 85271 85272 85269 85274 85275 85276 85273 85278 85279 85280 85277 85282 85283 85284 85281 85286 85287 85288 85285 85290 85291 85292 85289 85294 85295 85296 85293 85298 85299 85300 85297 85302 85303 85304 85301 85306 85307 85308 85305 85310 85311 85312 85309 85314 85315 85316 85313 85318 85319 85320 85317 85322 85323 85324 85321 85326 85327 85328 85325 85330 85331 85332 85329 85334 85335 85336 85333 85338 85339 85340 85337 85342 85343 85344 85341 85346 85347 85348 85345 85350 85351 85352 85349 85354 85355 85356 85353 85358 85359 85360 85357 85362 85363 85364 85361 85366 85367 85368 85365 85370 85371 85372 85369 85374 85375 85376 85373 85378 85379 85380 85377 85382 85383 85384 85381 85386 85387 85388 85385 85390 85391 85392 85389 85394 85395 85396 85393 85398 85399 85400 85397 85402 85403 85404 85401 85406 85407 85408 85405 85410 85411 85412 85409 85414 85415 85416 85413 85418 85419 85420 85417 85422 85423 85424 85421 85426 85427 85428 85425 85430 85431 85432 85429 85434 85435 85436 85433 85438 85439 85440 85437 85442 85443 85444 85441 85446 85447 85448 85445 85450 85451 85452 85449 85454 85455 85456 85453 85458 85459 85460 85457 85462 85463 85464 85461 85466 85467 85468 85465 85470 85471 85472 85469 85474 85475 85476 85473 85478 85479 85480 85477 85482 85483 85484 85481 85486 85487 85488 85485 85490 85491 85492 85489 85494 85495 85496 85493 85498 85499 85500 85497 85502 85503 85504 85501 85506 85507 85508 85505 85510 85511 85512 85509 85514 85515 85516 85513 85518 85519 85520 85517 85522 85523 85524 85521 85526 85527 85528 85525 85530 85531 85532 85529 85534 85535 85536 85533 85538 85539 85540 85537 85542 85543 85544 85541 85546 85547 85548 85545 85550 85551 85552 85549 85554 85555 85556 85553 85558 85559 85560 85557 85562 85563 85564 85561 85566 85567 85568 85565 85570 85571 85572 85569 85574 85575 85576 85573 85578 85579 85580 85577 85582 85583 85584 85581 85586 85587 85588 85585 85590 85591 85592 85589 85594 85595 85596 85593 85598 85599 85600 85597 85602 85603 85604 85601 85606 85607 85608 85605 85610 85611 85612 85609 85614 85615 85616 85613 85618 85619 85620 85617 85622 85623 85624 85621 85626 85627 85628 85625 85630 85631 85632 85629 85634 85635 85636 85633 85638 85639 85640 85637 85642 85643 85644 85641 85646 85647 85648 85645 85650 85651 85652 85649 85654 85655 85656 85653 85658 85659 85660 85657 85662 85663 85664 85661 85666 85667 85668 85665 85670 85671 85672 85669 85674 85675 85676 85673 85678 85679 85680 85677 85682 85683 85684 85681 85686 85687 85688 85685 85690 85691 85692 85689 85694 85695 85696 85693 85698 85699 85700 85697 85702 85703 85704 85701 85706 85707 85708 85705 85710 85711 85712 85709 85714 85715 85716 85713 85718 85719 85720 85717 85722 85723 85724 85721 85726 85727 85728 85725 85730 85731 85732 85729 85734 85735 85736 85733 85738 85739 85740 85737 85742 85743 85744 85741 85746 85747 85748 85745 85750 85751 85752 85749 85754 85755 85756 85753 85758 85759 85760 85757 85762 85763 85764 85761 85766 85767 85768 85765 85770 85771 85772 85769 85774 85775 85776 85773 85778 85779 85780 85777 85782 85783 85784 85781 85786 85787 85788 85785 85790 85791 85792 85789 85794 85795 85796 85793 85798 85799 85800 85797 85802 85803 85804 85801 85806 85807 85808 85805 85810 85811 85812 85809 85814 85815 85816 85813 85818 85819 85820 85817 85822 85823 85824 85821 85826 85827 85828 85825 85830 85831 85832 85829 85834 85835 85836 85833 85838 85839 85840 85837 85842 85843 85844 85841 85846 85847 85848 85845 85850 85851 85852 85849 85854 85855 85856 85853 85858 85859 85860 85857 85862 85863 85864 85861 85866 85867 85868 85865 85870 85871 85872 85869 85874 85875 85876 85873 85878 85879 85880 85877 85882 85883 85884 85881 85886 85887 85888 85885 85890 85891 85892 85889 85894 85895 85896 85893 85898 85899 85900 85897 85902 85903 85904 85901 85906 85907 85908 85905 85910 85911 85912 85909 85914 85915 85916 85913 85918 85919 85920 85917 85922 85923 85924 85921 85926 85927 85928 85925 85930 85931 85932 85929 85934 85935 85936 85933 85938 85939 85940 85937 85942 85943 85944 85941 85946 85947 85948 85945 85950 85951 85952 85949 85954 85955 85956 85953 85958 85959 85960 85957 85962 85963 85964 85961 85966 85967 85968 85965 85970 85971 85972 85969 85974 85975 85976 85973 85978 85979 85980 85977 85982 85983 85984 85981 85986 85987 85988 85985 85990 85991 85992 85989 85994 85995 85996 85993 85998 85999 86000 85997 86002 86003 86004 86001 86006 86007 86008 86005 86010 86011 86012 86009 86014 86015 86016 86013 86018 86019 86020 86017 86022 86023 86024 86021 86026 86027 86028 86025 86030 86031 86032 86029 86034 86035 86036 86033 86038 86039 86040 86037 86042 86043 86044 86041 86046 86047 86048 86045 86050 86051 86052 86049 86054 86055 86056 86053 86058 86059 86060 86057 86062 86063 86064 86061 86066 86067 86068 86065 86070 86071 86072 86069 86074 86075 86076 86073 86078 86079 86080 86077 86082 86083 86084 86081 86086 86087 86088 86085 86090 86091 86092 86089 86094 86095 86096 86093 86098 86099 86100 86097 86102 86103 86104 86101 86106 86107 86108 86105 86110 86111 86112 86109 86114 86115 86116 86113 86118 86119 86120 86117 86122 86123 86124 86121 86126 86127 86128 86125 86130 86131 86132 86129 86134 86135 86136 86133 86138 86139 86140 86137 86142 86143 86144 86141 86146 86147 86148 86145 86150 86151 86152 86149 86154 86155 86156 86153 86158 86159 86160 86157 86162 86163 86164 86161 86166 86167 86168 86165 86170 86171 86172 86169 86174 86175 86176 86173 86178 86179 86180 86177 86182 86183 86184 86181 86186 86187 86188 86185 86190 86191 86192 86189 86194 86195 86196 86193 86198 86199 86200 86197 86202 86203 86204 86201 86206 86207 86208 86205 86210 86211 86212 86209 86214 86215 86216 86213 86218 86219 86220 86217 86222 86223 86224 86221 86226 86227 86228 86225 86230 86231 86232 86229 86234 86235 86236 86233 86238 86239 86240 86237 86242 86243 86244 86241 86246 86247 86248 86245 86250 86251 86252 86249 86254 86255 86256 86253 86258 86259 86260 86257 86262 86263 86264 86261 86266 86267 86268 86265 86270 86271 86272 86269 86274 86275 86276 86273 86278 86279 86280 86277 86282 86283 86284 86281 86286 86287 86288 86285 86290 86291 86292 86289 86294 86295 86296 86293 86298 86299 86300 86297 86302 86303 86304 86301 86306 86307 86308 86305 86310 86311 86312 86309 86314 86315 86316 86313 86318 86319 86320 86317 86322 86323 86324 86321 86326 86327 86328 86325 86330 86331 86332 86329 86334 86335 86336 86333 86338 86339 86340 86337 86342 86343 86344 86341 86346 86347 86348 86345 86350 86351 86352 86349 86354 86355 86356 86353 86358 86359 86360 86357 86362 86363 86364 86361 86366 86367 86368 86365 86370 86371 86372 86369 86374 86375 86376 86373 86378 86379 86380 86377 86382 86383 86384 86381 86386 86387 86388 86385 86390 86391 86392 86389 86394 86395 86396 86393 86398 86399 86400 86397 86402 86403 86404 86401 86406 86407 86408 86405 86410 86411 86412 86409 86414 86415 86416 86413 86418 86419 86420 86417 86422 86423 86424 86421 86426 86427 86428 86425 86430 86431 86432 86429 86434 86435 86436 86433 86438 86439 86440 86437 86442 86443 86444 86441 86446 86447 86448 86445 86450 86451 86452 86449 86454 86455 86456 86453 86458 86459 86460 86457 86462 86463 86464 86461 86466 86467 86468 86465 86470 86471 86472 86469 86474 86475 86476 86473 86478 86479 86480 86477 86482 86483 86484 86481 86486 86487 86488 86485 86490 86491 86492 86489 86494 86495 86496 86493 86498 86499 86500 86497 86502 86503 86504 86501 86506 86507 86508 86505 86510 86511 86512 86509 86514 86515 86516 86513 86518 86519 86520 86517 86522 86523 86524 86521 86526 86527 86528 86525 86530 86531 86532 86529 86534 86535 86536 86533 86538 86539 86540 86537 86542 86543 86544 86541 86546 86547 86548 86545 86550 86551 86552 86549 86554 86555 86556 86553 86558 86559 86560 86557 86562 86563 86564 86561 86566 86567 86568 86565 86570 86571 86572 86569 86574 86575 86576 86573 86578 86579 86580 86577 86582 86583 86584 86581 86586 86587 86588 86585 86590 86591 86592 86589 86594 86595 86596 86593 86598 86599 86600 86597 86602 86603 86604 86601 86606 86607 86608 86605 86610 86611 86612 86609 86614 86615 86616 86613 86618 86619 86620 86617 86622 86623 86624 86621 86626 86627 86628 86625 86630 86631 86632 86629 86634 86635 86636 86633 86638 86639 86640 86637 86642 86643 86644 86641 86646 86647 86648 86645 86650 86651 86652 86649 86654 86655 86656 86653 86658 86659 86660 86657 86662 86663 86664 86661 86666 86667 86668 86665 86670 86671 86672 86669 86674 86675 86676 86673 86678 86679 86680 86677 86682 86683 86684 86681 86686 86687 86688 86685 86690 86691 86692 86689 86694 86695 86696 86693 86698 86699 86700 86697 86702 86703 86704 86701 86706 86707 86708 86705 86710 86711 86712 86709 86714 86715 86716 86713 86718 86719 86720 86717 86722 86723 86724 86721 86726 86727 86728 86725 86730 86731 86732 86729 86734 86735 86736 86733 86738 86739 86740 86737 86742 86743 86744 86741 86746 86747 86748 86745 86750 86751 86752 86749 86754 86755 86756 86753 86758 86759 86760 86757 86762 86763 86764 86761 86766 86767 86768 86765 86770 86771 86772 86769 86774 86775 86776 86773 86778 86779 86780 86777 86782 86783 86784 86781 86786 86787 86788 86785 86790 86791 86792 86789 86794 86795 86796 86793 86798 86799 86800 86797 86802 86803 86804 86801 86806 86807 86808 86805 86810 86811 86812 86809 86814 86815 86816 86813 86818 86819 86820 86817 86822 86823 86824 86821 86826 86827 86828 86825 86830 86831 86832 86829 86834 86835 86836 86833 86838 86839 86840 86837 86842 86843 86844 86841 86846 86847 86848 86845 86850 86851 86852 86849 86854 86855 86856 86853 86858 86859 86860 86857 86862 86863 86864 86861 86866 86867 86868 86865 86870 86871 86872 86869 86874 86875 86876 86873 86878 86879 86880 86877 86882 86883 86884 86881 86886 86887 86888 86885 86890 86891 86892 86889 86894 86895 86896 86893 86898 86899 86900 86897 86902 86903 86904 86901 86906 86907 86908 86905 86910 86911 86912 86909 86914 86915 86916 86913 86918 86919 86920 86917 86922 86923 86924 86921 86926 86927 86928 86925 86930 86931 86932 86929 86934 86935 86936 86933 86938 86939 86940 86937 86942 86943 86944 86941 86946 86947 86948 86945 86950 86951 86952 86949 86954 86955 86956 86953 86958 86959 86960 86957 86962 86963 86964 86961 86966 86967 86968 86965 86970 86971 86972 86969 86974 86975 86976 86973 86978 86979 86980 86977 86982 86983 86984 86981 86986 86987 86988 86985 86990 86991 86992 86989 86994 86995 86996 86993 86998 86999 87000 86997 87002 87003 87004 87001 87006 87007 87008 87005 87010 87011 87012 87009 87014 87015 87016 87013 87018 87019 87020 87017 87022 87023 87024 87021 87026 87027 87028 87025 87030 87031 87032 87029 87034 87035 87036 87033 87038 87039 87040 87037 87042 87043 87044 87041 87046 87047 87048 87045 87050 87051 87052 87049 87054 87055 87056 87053 87058 87059 87060 87057 87062 87063 87064 87061 87066 87067 87068 87065 87070 87071 87072 87069 87074 87075 87076 87073 87078 87079 87080 87077 87082 87083 87084 87081 87086 87087 87088 87085 87090 87091 87092 87089 87094 87095 87096 87093 87098 87099 87100 87097 87102 87103 87104 87101 87106 87107 87108 87105 87110 87111 87112 87109 87114 87115 87116 87113 87118 87119 87120 87117 87122 87123 87124 87121 87126 87127 87128 87125 87130 87131 87132 87129 87134 87135 87136 87133 87138 87139 87140 87137 87142 87143 87144 87141 87146 87147 87148 87145 87150 87151 87152 87149 87154 87155 87156 87153 87158 87159 87160 87157 87162 87163 87164 87161 87166 87167 87168 87165 87170 87171 87172 87169 87174 87175 87176 87173 87178 87179 87180 87177 87182 87183 87184 87181 87186 87187 87188 87185 87190 87191 87192 87189 87194 87195 87196 87193 87198 87199 87200 87197 87202 87203 87204 87201 87206 87207 87208 87205 87210 87211 87212 87209 87214 87215 87216 87213 87218 87219 87220 87217 87222 87223 87224 87221 87226 87227 87228 87225 87230 87231 87232 87229 87234 87235 87236 87233 87238 87239 87240 87237 87242 87243 87244 87241 87246 87247 87248 87245 87250 87251 87252 87249 87254 87255 87256 87253 87258 87259 87260 87257 87262 87263 87264 87261 87266 87267 87268 87265 87270 87271 87272 87269 87274 87275 87276 87273 87278 87279 87280 87277 87282 87283 87284 87281 87286 87287 87288 87285 87290 87291 87292 87289 87294 87295 87296 87293 87298 87299 87300 87297 87302 87303 87304 87301 87306 87307 87308 87305 87310 87311 87312 87309 87314 87315 87316 87313 87318 87319 87320 87317 87322 87323 87324 87321 87326 87327 87328 87325 87330 87331 87332 87329 87334 87335 87336 87333 87338 87339 87340 87337 87342 87343 87344 87341 87346 87347 87348 87345 87350 87351 87352 87349 87354 87355 87356 87353 87358 87359 87360 87357 87362 87363 87364 87361 87366 87367 87368 87365 87370 87371 87372 87369 87374 87375 87376 87373 87378 87379 87380 87377 87382 87383 87384 87381 87386 87387 87388 87385 87390 87391 87392 87389 87394 87395 87396 87393 87398 87399 87400 87397 87402 87403 87404 87401 87406 87407 87408 87405 87410 87411 87412 87409 87414 87415 87416 87413 87418 87419 87420 87417 87422 87423 87424 87421 87426 87427 87428 87425 87430 87431 87432 87429 87434 87435 87436 87433 87438 87439 87440 87437 87442 87443 87444 87441 87446 87447 87448 87445 87450 87451 87452 87449 87454 87455 87456 87453 87458 87459 87460 87457 87462 87463 87464 87461 87466 87467 87468 87465 87470 87471 87472 87469 87474 87475 87476 87473 87478 87479 87480 87477 87482 87483 87484 87481 87486 87487 87488 87485 87490 87491 87492 87489 87494 87495 87496 87493 87498 87499 87500 87497 87502 87503 87504 87501 87506 87507 87508 87505 87510 87511 87512 87509 87514 87515 87516 87513 87518 87519 87520 87517 87522 87523 87524 87521 87526 87527 87528 87525 87530 87531 87532 87529 87534 87535 87536 87533 87538 87539 87540 87537 87542 87543 87544 87541 87546 87547 87548 87545 87550 87551 87552 87549 87554 87555 87556 87553 87558 87559 87560 87557 87562 87563 87564 87561 87566 87567 87568 87565 87570 87571 87572 87569 87574 87575 87576 87573 87578 87579 87580 87577 87582 87583 87584 87581 87586 87587 87588 87585 87590 87591 87592 87589 87594 87595 87596 87593 87598 87599 87600 87597 87602 87603 87604 87601 87606 87607 87608 87605 87610 87611 87612 87609 87614 87615 87616 87613 87618 87619 87620 87617 87622 87623 87624 87621 87626 87627 87628 87625 87630 87631 87632 87629 87634 87635 87636 87633 87638 87639 87640 87637 87642 87643 87644 87641 87646 87647 87648 87645 87650 87651 87652 87649 87654 87655 87656 87653 87658 87659 87660 87657 87662 87663 87664 87661 87666 87667 87668 87665 87670 87671 87672 87669 87674 87675 87676 87673 87678 87679 87680 87677 87682 87683 87684 87681 87686 87687 87688 87685 87690 87691 87692 87689 87694 87695 87696 87693 87698 87699 87700 87697 87702 87703 87704 87701 87706 87707 87708 87705 87710 87711 87712 87709 87714 87715 87716 87713 87718 87719 87720 87717 87722 87723 87724 87721 87726 87727 87728 87725 87730 87731 87732 87729 87734 87735 87736 87733 87738 87739 87740 87737 87742 87743 87744 87741 87746 87747 87748 87745 87750 87751 87752 87749 87754 87755 87756 87753 87758 87759 87760 87757 87762 87763 87764 87761 87766 87767 87768 87765 87770 87771 87772 87769 87774 87775 87776 87773 87778 87779 87780 87777 87782 87783 87784 87781 87786 87787 87788 87785 87790 87791 87792 87789 87794 87795 87796 87793 87798 87799 87800 87797 87802 87803 87804 87801 87806 87807 87808 87805 87810 87811 87812 87809 87814 87815 87816 87813 87818 87819 87820 87817 87822 87823 87824 87821 87826 87827 87828 87825 87830 87831 87832 87829 87834 87835 87836 87833 87838 87839 87840 87837 87842 87843 87844 87841 87846 87847 87848 87845 87850 87851 87852 87849 87854 87855 87856 87853 87858 87859 87860 87857 87862 87863 87864 87861 87866 87867 87868 87865 87870 87871 87872 87869 87874 87875 87876 87873 87878 87879 87880 87877 87882 87883 87884 87881 87886 87887 87888 87885 87890 87891 87892 87889 87894 87895 87896 87893 87898 87899 87900 87897 87902 87903 87904 87901 87906 87907 87908 87905 87910 87911 87912 87909 87914 87915 87916 87913 87918 87919 87920 87917 87922 87923 87924 87921 87926 87927 87928 87925 87930 87931 87932 87929 87934 87935 87936 87933 87938 87939 87940 87937 87942 87943 87944 87941 87946 87947 87948 87945 87950 87951 87952 87949 87954 87955 87956 87953 87958 87959 87960 87957 87962 87963 87964 87961 87966 87967 87968 87965 87970 87971 87972 87969 87974 87975 87976 87973 87978 87979 87980 87977 87982 87983 87984 87981 87986 87987 87988 87985 87990 87991 87992 87989 87994 87995 87996 87993 87998 87999 88000 87997 88002 88003 88004 88001 88006 88007 88008 88005 88010 88011 88012 88009 88014 88015 88016 88013 88018 88019 88020 88017 88022 88023 88024 88021 88026 88027 88028 88025 88030 88031 88032 88029 88034 88035 88036 88033 88038 88039 88040 88037 88042 88043 88044 88041 88046 88047 88048 88045 88050 88051 88052 88049 88054 88055 88056 88053 88058 88059 88060 88057 88062 88063 88064 88061 88066 88067 88068 88065 88070 88071 88072 88069 88074 88075 88076 88073 88078 88079 88080 88077 88082 88083 88084 88081 88086 88087 88088 88085 88090 88091 88092 88089 88094 88095 88096 88093 88098 88099 88100 88097 88102 88103 88104 88101 88106 88107 88108 88105 88110 88111 88112 88109 88114 88115 88116 88113 88118 88119 88120 88117 88122 88123 88124 88121 88126 88127 88128 88125 88130 88131 88132 88129 88134 88135 88136 88133 88138 88139 88140 88137 88142 88143 88144 88141 88146 88147 88148 88145 88150 88151 88152 88149 88154 88155 88156 88153 88158 88159 88160 88157 88162 88163 88164 88161 88166 88167 88168 88165 88170 88171 88172 88169 88174 88175 88176 88173 88178 88179 88180 88177 88182 88183 88184 88181 88186 88187 88188 88185 88190 88191 88192 88189 88194 88195 88196 88193 88198 88199 88200 88197 88202 88203 88204 88201 88206 88207 88208 88205 88210 88211 88212 88209 88214 88215 88216 88213 88218 88219 88220 88217 88222 88223 88224 88221 88226 88227 88228 88225 88230 88231 88232 88229 88234 88235 88236 88233 88238 88239 88240 88237 88242 88243 88244 88241 88246 88247 88248 88245 88250 88251 88252 88249 88254 88255 88256 88253 88258 88259 88260 88257 88262 88263 88264 88261 88266 88267 88268 88265 88270 88271 88272 88269 88274 88275 88276 88273 88278 88279 88280 88277 88282 88283 88284 88281 88286 88287 88288 88285 88290 88291 88292 88289 88294 88295 88296 88293 88298 88299 88300 88297 88302 88303 88304 88301 88306 88307 88308 88305 88310 88311 88312 88309 88314 88315 88316 88313 88318 88319 88320 88317 88322 88323 88324 88321 88326 88327 88328 88325 88330 88331 88332 88329 88334 88335 88336 88333 88338 88339 88340 88337 88342 88343 88344 88341 88346 88347 88348 88345 88350 88351 88352 88349 88354 88355 88356 88353 88358 88359 88360 88357 88362 88363 88364 88361 88366 88367 88368 88365 88370 88371 88372 88369 88374 88375 88376 88373 88378 88379 88380 88377 88382 88383 88384 88381 88386 88387 88388 88385 88390 88391 88392 88389 88394 88395 88396 88393 88398 88399 88400 88397 88402 88403 88404 88401 88406 88407 88408 88405 88410 88411 88412 88409 88414 88415 88416 88413 88418 88419 88420 88417 88422 88423 88424 88421 88426 88427 88428 88425 88430 88431 88432 88429 88434 88435 88436 88433 88438 88439 88440 88437 88442 88443 88444 88441 88446 88447 88448 88445 88450 88451 88452 88449 88454 88455 88456 88453 88458 88459 88460 88457 88462 88463 88464 88461 88466 88467 88468 88465 88470 88471 88472 88469 88474 88475 88476 88473 88478 88479 88480 88477 88482 88483 88484 88481 88486 88487 88488 88485 88490 88491 88492 88489 88494 88495 88496 88493 88498 88499 88500 88497 88502 88503 88504 88501 88506 88507 88508 88505 88510 88511 88512 88509 88514 88515 88516 88513 88518 88519 88520 88517 88522 88523 88524 88521 88526 88527 88528 88525 88530 88531 88532 88529 88534 88535 88536 88533 88538 88539 88540 88537 88542 88543 88544 88541 88546 88547 88548 88545 88550 88551 88552 88549 88554 88555 88556 88553 88558 88559 88560 88557 88562 88563 88564 88561 88566 88567 88568 88565 88570 88571 88572 88569 88574 88575 88576 88573 88578 88579 88580 88577 88582 88583 88584 88581 88586 88587 88588 88585 88590 88591 88592 88589 88594 88595 88596 88593 88598 88599 88600 88597 88602 88603 88604 88601 88606 88607 88608 88605 88610 88611 88612 88609 88614 88615 88616 88613 88618 88619 88620 88617 88622 88623 88624 88621 88626 88627 88628 88625 88630 88631 88632 88629 88634 88635 88636 88633 88638 88639 88640 88637 88642 88643 88644 88641 88646 88647 88648 88645 88650 88651 88652 88649 88654 88655 88656 88653 88658 88659 88660 88657 88662 88663 88664 88661 88666 88667 88668 88665 88670 88671 88672 88669 88674 88675 88676 88673 88678 88679 88680 88677 88682 88683 88684 88681 88686 88687 88688 88685 88690 88691 88692 88689 88694 88695 88696 88693 88698 88699 88700 88697 88702 88703 88704 88701 88706 88707 88708 88705 88710 88711 88712 88709 88714 88715 88716 88713 88718 88719 88720 88717 88722 88723 88724 88721 88726 88727 88728 88725 88730 88731 88732 88729 88734 88735 88736 88733 88738 88739 88740 88737 88742 88743 88744 88741 88746 88747 88748 88745 88750 88751 88752 88749 88754 88755 88756 88753 88758 88759 88760 88757 88762 88763 88764 88761 88766 88767 88768 88765 88770 88771 88772 88769 88774 88775 88776 88773 88778 88779 88780 88777 88782 88783 88784 88781 88786 88787 88788 88785 88790 88791 88792 88789 88794 88795 88796 88793 88798 88799 88800 88797 88802 88803 88804 88801 88806 88807 88808 88805 88810 88811 88812 88809 88814 88815 88816 88813 88818 88819 88820 88817 88822 88823 88824 88821 88826 88827 88828 88825 88830 88831 88832 88829 88834 88835 88836 88833 88838 88839 88840 88837 88842 88843 88844 88841 88846 88847 88848 88845 88850 88851 88852 88849 88854 88855 88856 88853 88858 88859 88860 88857 88862 88863 88864 88861 88866 88867 88868 88865 88870 88871 88872 88869 88874 88875 88876 88873 88878 88879 88880 88877 88882 88883 88884 88881 88886 88887 88888 88885 88890 88891 88892 88889 88894 88895 88896 88893 88898 88899 88900 88897 88902 88903 88904 88901 88906 88907 88908 88905 88910 88911 88912 88909 88914 88915 88916 88913 88918 88919 88920 88917 88922 88923 88924 88921 88926 88927 88928 88925 88930 88931 88932 88929 88934 88935 88936 88933 88938 88939 88940 88937 88942 88943 88944 88941 88946 88947 88948 88945 88950 88951 88952 88949 88954 88955 88956 88953 88958 88959 88960 88957 88962 88963 88964 88961 88966 88967 88968 88965 88970 88971 88972 88969 88974 88975 88976 88973 88978 88979 88980 88977 88982 88983 88984 88981 88986 88987 88988 88985 88990 88991 88992 88989 88994 88995 88996 88993 88998 88999 89000 88997 89002 89003 89004 89001 89006 89007 89008 89005 89010 89011 89012 89009 89014 89015 89016 89013 89018 89019 89020 89017 89022 89023 89024 89021 89026 89027 89028 89025 89030 89031 89032 89029 89034 89035 89036 89033 89038 89039 89040 89037 89042 89043 89044 89041 89046 89047 89048 89045 89050 89051 89052 89049 89054 89055 89056 89053 89058 89059 89060 89057 89062 89063 89064 89061 89066 89067 89068 89065 89070 89071 89072 89069 89074 89075 89076 89073 89078 89079 89080 89077 89082 89083 89084 89081 89086 89087 89088 89085 89090 89091 89092 89089 89094 89095 89096 89093 89098 89099 89100 89097 89102 89103 89104 89101 89106 89107 89108 89105 89110 89111 89112 89109 89114 89115 89116 89113 89118 89119 89120 89117 89122 89123 89124 89121 89126 89127 89128 89125 89130 89131 89132 89129 89134 89135 89136 89133 89138 89139 89140 89137 89142 89143 89144 89141 89146 89147 89148 89145 89150 89151 89152 89149 89154 89155 89156 89153 89158 89159 89160 89157 89162 89163 89164 89161 89166 89167 89168 89165 89170 89171 89172 89169 89174 89175 89176 89173 89178 89179 89180 89177 89182 89183 89184 89181 89186 89187 89188 89185 89190 89191 89192 89189 89194 89195 89196 89193 89198 89199 89200 89197 89202 89203 89204 89201 89206 89207 89208 89205 89210 89211 89212 89209 89214 89215 89216 89213 89218 89219 89220 89217 89222 89223 89224 89221 89226 89227 89228 89225 89230 89231 89232 89229 89234 89235 89236 89233 89238 89239 89240 89237 89242 89243 89244 89241 89246 89247 89248 89245 89250 89251 89252 89249 89254 89255 89256 89253 89258 89259 89260 89257 89262 89263 89264 89261 89266 89267 89268 89265 89270 89271 89272 89269 89274 89275 89276 89273 89278 89279 89280 89277 89282 89283 89284 89281 89286 89287 89288 89285 89290 89291 89292 89289 89294 89295 89296 89293 89298 89299 89300 89297 89302 89303 89304 89301 89306 89307 89308 89305 89310 89311 89312 89309 89314 89315 89316 89313 89318 89319 89320 89317 89322 89323 89324 89321 89326 89327 89328 89325 89330 89331 89332 89329 89334 89335 89336 89333 89338 89339 89340 89337 89342 89343 89344 89341 89346 89347 89348 89345 89350 89351 89352 89349 89354 89355 89356 89353 89358 89359 89360 89357 89362 89363 89364 89361 89366 89367 89368 89365 89370 89371 89372 89369 89374 89375 89376 89373 89378 89379 89380 89377 89382 89383 89384 89381 89386 89387 89388 89385 89390 89391 89392 89389 89394 89395 89396 89393 89398 89399 89400 89397 89402 89403 89404 89401 89406 89407 89408 89405 89410 89411 89412 89409 89414 89415 89416 89413 89418 89419 89420 89417 89422 89423 89424 89421 89426 89427 89428 89425 89430 89431 89432 89429 89434 89435 89436 89433 89438 89439 89440 89437 89442 89443 89444 89441 89446 89447 89448 89445 89450 89451 89452 89449 89454 89455 89456 89453 89458 89459 89460 89457 89462 89463 89464 89461 89466 89467 89468 89465 89470 89471 89472 89469 89474 89475 89476 89473 89478 89479 89480 89477 89482 89483 89484 89481 89486 89487 89488 89485 89490 89491 89492 89489 89494 89495 89496 89493 89498 89499 89500 89497 89502 89503 89504 89501 89506 89507 89508 89505 89510 89511 89512 89509 89514 89515 89516 89513 89518 89519 89520 89517 89522 89523 89524 89521 89526 89527 89528 89525 89530 89531 89532 89529 89534 89535 89536 89533 89538 89539 89540 89537 89542 89543 89544 89541 89546 89547 89548 89545 89550 89551 89552 89549 89554 89555 89556 89553 89558 89559 89560 89557 89562 89563 89564 89561 89566 89567 89568 89565 89570 89571 89572 89569 89574 89575 89576 89573 89578 89579 89580 89577 89582 89583 89584 89581 89586 89587 89588 89585 89590 89591 89592 89589 89594 89595 89596 89593 89598 89599 89600 89597 89602 89603 89604 89601 89606 89607 89608 89605 89610 89611 89612 89609 89614 89615 89616 89613 89618 89619 89620 89617 89622 89623 89624 89621 89626 89627 89628 89625 89630 89631 89632 89629 89634 89635 89636 89633 89638 89639 89640 89637 89642 89643 89644 89641 89646 89647 89648 89645 89650 89651 89652 89649 89654 89655 89656 89653 89658 89659 89660 89657 89662 89663 89664 89661 89666 89667 89668 89665 89670 89671 89672 89669 89674 89675 89676 89673 89678 89679 89680 89677 89682 89683 89684 89681 89686 89687 89688 89685 89690 89691 89692 89689 89694 89695 89696 89693 89698 89699 89700 89697 89702 89703 89704 89701 89706 89707 89708 89705 89710 89711 89712 89709 89714 89715 89716 89713 89718 89719 89720 89717 89722 89723 89724 89721 89726 89727 89728 89725 89730 89731 89732 89729 89734 89735 89736 89733 89738 89739 89740 89737 89742 89743 89744 89741 89746 89747 89748 89745 89750 89751 89752 89749 89754 89755 89756 89753 89758 89759 89760 89757 89762 89763 89764 89761 89766 89767 89768 89765 89770 89771 89772 89769 89774 89775 89776 89773 89778 89779 89780 89777 89782 89783 89784 89781 89786 89787 89788 89785 89790 89791 89792 89789 89794 89795 89796 89793 89798 89799 89800 89797 89802 89803 89804 89801 89806 89807 89808 89805 89810 89811 89812 89809 89814 89815 89816 89813 89818 89819 89820 89817 89822 89823 89824 89821 89826 89827 89828 89825 89830 89831 89832 89829 89834 89835 89836 89833 89838 89839 89840 89837 89842 89843 89844 89841 89846 89847 89848 89845 89850 89851 89852 89849 89854 89855 89856 89853 89858 89859 89860 89857 89862 89863 89864 89861 89866 89867 89868 89865 89870 89871 89872 89869 89874 89875 89876 89873 89878 89879 89880 89877 89882 89883 89884 89881 89886 89887 89888 89885 89890 89891 89892 89889 89894 89895 89896 89893 89898 89899 89900 89897 89902 89903 89904 89901 89906 89907 89908 89905 89910 89911 89912 89909 89914 89915 89916 89913 89918 89919 89920 89917 89922 89923 89924 89921 89926 89927 89928 89925 89930 89931 89932 89929 89934 89935 89936 89933 89938 89939 89940 89937 89942 89943 89944 89941 89946 89947 89948 89945 89950 89951 89952 89949 89954 89955 89956 89953 89958 89959 89960 89957 89962 89963 89964 89961 89966 89967 89968 89965 89970 89971 89972 89969 89974 89975 89976 89973 89978 89979 89980 89977 89982 89983 89984 89981 89986 89987 89988 89985 89990 89991 89992 89989 89994 89995 89996 89993 89998 89999 90000 89997 90002 90003 90004 90001 90006 90007 90008 90005 90010 90011 90012 90009 90014 90015 90016 90013 90018 90019 90020 90017 90022 90023 90024 90021 90026 90027 90028 90025 90030 90031 90032 90029 90034 90035 90036 90033 90038 90039 90040 90037 90042 90043 90044 90041 90046 90047 90048 90045 90050 90051 90052 90049 90054 90055 90056 90053 90058 90059 90060 90057 90062 90063 90064 90061 90066 90067 90068 90065 90070 90071 90072 90069 90074 90075 90076 90073 90078 90079 90080 90077 90082 90083 90084 90081 90086 90087 90088 90085 90090 90091 90092 90089 90094 90095 90096 90093 90098 90099 90100 90097 90102 90103 90104 90101 90106 90107 90108 90105 90110 90111 90112 90109 90114 90115 90116 90113 90118 90119 90120 90117 90122 90123 90124 90121 90126 90127 90128 90125 90130 90131 90132 90129 90134 90135 90136 90133 90138 90139 90140 90137 90142 90143 90144 90141 90146 90147 90148 90145 90150 90151 90152 90149 90154 90155 90156 90153 90158 90159 90160 90157 90162 90163 90164 90161 90166 90167 90168 90165 90170 90171 90172 90169 90174 90175 90176 90173 90178 90179 90180 90177 90182 90183 90184 90181 90186 90187 90188 90185 90190 90191 90192 90189 90194 90195 90196 90193 90198 90199 90200 90197 90202 90203 90204 90201 90206 90207 90208 90205 90210 90211 90212 90209 90214 90215 90216 90213 90218 90219 90220 90217 90222 90223 90224 90221 90226 90227 90228 90225 90230 90231 90232 90229 90234 90235 90236 90233 90238 90239 90240 90237 90242 90243 90244 90241 90246 90247 90248 90245 90250 90251 90252 90249 90254 90255 90256 90253 90258 90259 90260 90257 90262 90263 90264 90261 90266 90267 90268 90265 90270 90271 90272 90269 90274 90275 90276 90273 90278 90279 90280 90277 90282 90283 90284 90281 90286 90287 90288 90285 90290 90291 90292 90289 90294 90295 90296 90293 90298 90299 90300 90297 90302 90303 90304 90301 90306 90307 90308 90305 90310 90311 90312 90309 90314 90315 90316 90313 90318 90319 90320 90317 90322 90323 90324 90321 90326 90327 90328 90325 90330 90331 90332 90329 90334 90335 90336 90333 90338 90339 90340 90337 90342 90343 90344 90341 90346 90347 90348 90345 90350 90351 90352 90349 90354 90355 90356 90353 90358 90359 90360 90357 90362 90363 90364 90361 90366 90367 90368 90365 90370 90371 90372 90369 90374 90375 90376 90373 90378 90379 90380 90377 90382 90383 90384 90381 90386 90387 90388 90385 90390 90391 90392 90389 90394 90395 90396 90393 90398 90399 90400 90397 90402 90403 90404 90401 90406 90407 90408 90405 90410 90411 90412 90409 90414 90415 90416 90413 90418 90419 90420 90417 90422 90423 90424 90421 90426 90427 90428 90425 90430 90431 90432 90429 90434 90435 90436 90433 90438 90439 90440 90437 90442 90443 90444 90441 90446 90447 90448 90445 90450 90451 90452 90449 90454 90455 90456 90453 90458 90459 90460 90457 90462 90463 90464 90461 90466 90467 90468 90465 90470 90471 90472 90469 90474 90475 90476 90473 90478 90479 90480 90477 90482 90483 90484 90481 90486 90487 90488 90485 90490 90491 90492 90489 90494 90495 90496 90493 90498 90499 90500 90497 90502 90503 90504 90501 90506 90507 90508 90505 90510 90511 90512 90509 90514 90515 90516 90513 90518 90519 90520 90517 90522 90523 90524 90521 90526 90527 90528 90525 90530 90531 90532 90529 90534 90535 90536 90533 90538 90539 90540 90537 90542 90543 90544 90541 90546 90547 90548 90545 90550 90551 90552 90549 90554 90555 90556 90553 90558 90559 90560 90557 90562 90563 90564 90561 90566 90567 90568 90565 90570 90571 90572 90569 90574 90575 90576 90573 90578 90579 90580 90577 90582 90583 90584 90581 90586 90587 90588 90585 90590 90591 90592 90589 90594 90595 90596 90593 90598 90599 90600 90597 90602 90603 90604 90601 90606 90607 90608 90605 90610 90611 90612 90609 90614 90615 90616 90613 90618 90619 90620 90617 90622 90623 90624 90621 90626 90627 90628 90625 90630 90631 90632 90629 90634 90635 90636 90633 90638 90639 90640 90637 90642 90643 90644 90641 90646 90647 90648 90645 90650 90651 90652 90649 90654 90655 90656 90653 90658 90659 90660 90657 90662 90663 90664 90661 90666 90667 90668 90665 90670 90671 90672 90669 90674 90675 90676 90673 90678 90679 90680 90677 90682 90683 90684 90681 90686 90687 90688 90685 90690 90691 90692 90689 90694 90695 90696 90693 90698 90699 90700 90697 90702 90703 90704 90701 90706 90707 90708 90705 90710 90711 90712 90709 90714 90715 90716 90713 90718 90719 90720 90717 90722 90723 90724 90721 90726 90727 90728 90725 90730 90731 90732 90729 90734 90735 90736 90733 90738 90739 90740 90737 90742 90743 90744 90741 90746 90747 90748 90745 90750 90751 90752 90749 90754 90755 90756 90753 90758 90759 90760 90757 90762 90763 90764 90761 90766 90767 90768 90765 90770 90771 90772 90769 90774 90775 90776 90773 90778 90779 90780 90777 90782 90783 90784 90781 90786 90787 90788 90785 90790 90791 90792 90789 90794 90795 90796 90793 90798 90799 90800 90797 90802 90803 90804 90801 90806 90807 90808 90805 90810 90811 90812 90809 90814 90815 90816 90813 90818 90819 90820 90817 90822 90823 90824 90821 90826 90827 90828 90825 90830 90831 90832 90829 90834 90835 90836 90833 90838 90839 90840 90837 90842 90843 90844 90841 90846 90847 90848 90845 90850 90851 90852 90849 90854 90855 90856 90853 90858 90859 90860 90857 90862 90863 90864 90861 90866 90867 90868 90865 90870 90871 90872 90869 90874 90875 90876 90873 90878 90879 90880 90877 90882 90883 90884 90881 90886 90887 90888 90885 90890 90891 90892 90889 90894 90895 90896 90893 90898 90899 90900 90897 90902 90903 90904 90901 90906 90907 90908 90905 90910 90911 90912 90909 90914 90915 90916 90913 90918 90919 90920 90917 90922 90923 90924 90921 90926 90927 90928 90925 90930 90931 90932 90929 90934 90935 90936 90933 90938 90939 90940 90937 90942 90943 90944 90941 90946 90947 90948 90945 90950 90951 90952 90949 90954 90955 90956 90953 90958 90959 90960 90957 90962 90963 90964 90961 90966 90967 90968 90965 90970 90971 90972 90969 90974 90975 90976 90973 90978 90979 90980 90977 90982 90983 90984 90981 90986 90987 90988 90985 90990 90991 90992 90989 90994 90995 90996 90993 90998 90999 91000 90997 91002 91003 91004 91001 91006 91007 91008 91005 91010 91011 91012 91009 91014 91015 91016 91013 91018 91019 91020 91017 91022 91023 91024 91021 91026 91027 91028 91025 91030 91031 91032 91029 91034 91035 91036 91033 91038 91039 91040 91037 91042 91043 91044 91041 91046 91047 91048 91045 91050 91051 91052 91049 91054 91055 91056 91053 91058 91059 91060 91057 91062 91063 91064 91061 91066 91067 91068 91065 91070 91071 91072 91069 91074 91075 91076 91073 91078 91079 91080 91077 91082 91083 91084 91081 91086 91087 91088 91085 91090 91091 91092 91089 91094 91095 91096 91093 91098 91099 91100 91097 91102 91103 91104 91101 91106 91107 91108 91105 91110 91111 91112 91109 91114 91115 91116 91113 91118 91119 91120 91117 91122 91123 91124 91121 91126 91127 91128 91125 91130 91131 91132 91129 91134 91135 91136 91133 91138 91139 91140 91137 91142 91143 91144 91141 91146 91147 91148 91145 91150 91151 91152 91149 91154 91155 91156 91153 91158 91159 91160 91157 91162 91163 91164 91161 91166 91167 91168 91165 91170 91171 91172 91169 91174 91175 91176 91173 91178 91179 91180 91177 91182 91183 91184 91181 91186 91187 91188 91185 91190 91191 91192 91189 91194 91195 91196 91193 91198 91199 91200 91197 91202 91203 91204 91201 91206 91207 91208 91205 91210 91211 91212 91209 91214 91215 91216 91213 91218 91219 91220 91217 91222 91223 91224 91221 91226 91227 91228 91225 91230 91231 91232 91229 91234 91235 91236 91233 91238 91239 91240 91237 91242 91243 91244 91241 91246 91247 91248 91245 91250 91251 91252 91249 91254 91255 91256 91253 91258 91259 91260 91257 91262 91263 91264 91261 91266 91267 91268 91265 91270 91271 91272 91269 91274 91275 91276 91273 91278 91279 91280 91277 91282 91283 91284 91281 91286 91287 91288 91285 91290 91291 91292 91289 91294 91295 91296 91293 91298 91299 91300 91297 91302 91303 91304 91301 91306 91307 91308 91305 91310 91311 91312 91309 91314 91315 91316 91313 91318 91319 91320 91317 91322 91323 91324 91321 91326 91327 91328 91325 91330 91331 91332 91329 91334 91335 91336 91333 91338 91339 91340 91337 91342 91343 91344 91341 91346 91347 91348 91345 91350 91351 91352 91349 91354 91355 91356 91353 91358 91359 91360 91357 91362 91363 91364 91361 91366 91367 91368 91365 91370 91371 91372 91369 91374 91375 91376 91373 91378 91379 91380 91377 91382 91383 91384 91381 91386 91387 91388 91385 91390 91391 91392 91389 91394 91395 91396 91393 91398 91399 91400 91397 91402 91403 91404 91401 91406 91407 91408 91405 91410 91411 91412 91409 91414 91415 91416 91413 91418 91419 91420 91417 91422 91423 91424 91421 91426 91427 91428 91425 91430 91431 91432 91429 91434 91435 91436 91433 91438 91439 91440 91437 91442 91443 91444 91441 91446 91447 91448 91445 91450 91451 91452 91449 91454 91455 91456 91453 91458 91459 91460 91457 91462 91463 91464 91461 91466 91467 91468 91465 91470 91471 91472 91469 91474 91475 91476 91473 91478 91479 91480 91477 91482 91483 91484 91481 91486 91487 91488 91485 91490 91491 91492 91489 91494 91495 91496 91493 91498 91499 91500 91497 91502 91503 91504 91501 91506 91507 91508 91505 91510 91511 91512 91509 91514 91515 91516 91513 91518 91519 91520 91517 91522 91523 91524 91521 91526 91527 91528 91525 91530 91531 91532 91529 91534 91535 91536 91533 91538 91539 91540 91537 91542 91543 91544 91541 91546 91547 91548 91545 91550 91551 91552 91549 91554 91555 91556 91553 91558 91559 91560 91557 91562 91563 91564 91561 91566 91567 91568 91565 91570 91571 91572 91569 91574 91575 91576 91573 91578 91579 91580 91577 91582 91583 91584 91581 91586 91587 91588 91585 91590 91591 91592 91589 91594 91595 91596 91593 91598 91599 91600 91597 91602 91603 91604 91601 91606 91607 91608 91605 91610 91611 91612 91609 91614 91615 91616 91613 91618 91619 91620 91617 91622 91623 91624 91621 91626 91627 91628 91625 91630 91631 91632 91629 91634 91635 91636 91633 91638 91639 91640 91637 91642 91643 91644 91641 91646 91647 91648 91645 91650 91651 91652 91649 91654 91655 91656 91653 91658 91659 91660 91657 91662 91663 91664 91661 91666 91667 91668 91665 91670 91671 91672 91669 91674 91675 91676 91673 91678 91679 91680 91677 91682 91683 91684 91681 91686 91687 91688 91685 91690 91691 91692 91689 91694 91695 91696 91693 91698 91699 91700 91697 91702 91703 91704 91701 91706 91707 91708 91705 91710 91711 91712 91709 91714 91715 91716 91713 91718 91719 91720 91717 91722 91723 91724 91721 91726 91727 91728 91725 91730 91731 91732 91729 91734 91735 91736 91733 91738 91739 91740 91737 91742 91743 91744 91741 91746 91747 91748 91745 91750 91751 91752 91749 91754 91755 91756 91753 91758 91759 91760 91757 91762 91763 91764 91761 91766 91767 91768 91765 91770 91771 91772 91769 91774 91775 91776 91773 91778 91779 91780 91777 91782 91783 91784 91781 91786 91787 91788 91785 91790 91791 91792 91789 91794 91795 91796 91793 91798 91799 91800 91797 91802 91803 91804 91801 91806 91807 91808 91805 91810 91811 91812 91809 91814 91815 91816 91813 91818 91819 91820 91817 91822 91823 91824 91821 91826 91827 91828 91825 91830 91831 91832 91829 91834 91835 91836 91833 91838 91839 91840 91837 91842 91843 91844 91841 91846 91847 91848 91845 91850 91851 91852 91849 91854 91855 91856 91853 91858 91859 91860 91857 91862 91863 91864 91861 91866 91867 91868 91865 91870 91871 91872 91869 91874 91875 91876 91873 91878 91879 91880 91877 91882 91883 91884 91881 91886 91887 91888 91885 91890 91891 91892 91889 91894 91895 91896 91893 91898 91899 91900 91897 91902 91903 91904 91901 91906 91907 91908 91905 91910 91911 91912 91909 91914 91915 91916 91913 91918 91919 91920 91917 91922 91923 91924 91921 91926 91927 91928 91925 91930 91931 91932 91929 91934 91935 91936 91933 91938 91939 91940 91937 91942 91943 91944 91941 91946 91947 91948 91945 91950 91951 91952 91949 91954 91955 91956 91953 91958 91959 91960 91957 91962 91963 91964 91961 91966 91967 91968 91965 91970 91971 91972 91969 91974 91975 91976 91973 91978 91979 91980 91977 91982 91983 91984 91981 91986 91987 91988 91985 91990 91991 91992 91989 91994 91995 91996 91993 91998 91999 92000 91997 92002 92003 92004 92001 92006 92007 92008 92005 92010 92011 92012 92009 92014 92015 92016 92013 92018 92019 92020 92017 92022 92023 92024 92021 92026 92027 92028 92025 92030 92031 92032 92029 92034 92035 92036 92033 92038 92039 92040 92037 92042 92043 92044 92041 92046 92047 92048 92045 92050 92051 92052 92049 92054 92055 92056 92053 92058 92059 92060 92057 92062 92063 92064 92061 92066 92067 92068 92065 92070 92071 92072 92069 92074 92075 92076 92073 92078 92079 92080 92077 92082 92083 92084 92081 92086 92087 92088 92085 92090 92091 92092 92089 92094 92095 92096 92093 92098 92099 92100 92097 92102 92103 92104 92101 92106 92107 92108 92105 92110 92111 92112 92109 92114 92115 92116 92113 92118 92119 92120 92117 92122 92123 92124 92121 92126 92127 92128 92125 92130 92131 92132 92129 92134 92135 92136 92133 92138 92139 92140 92137 92142 92143 92144 92141 92146 92147 92148 92145 92150 92151 92152 92149 92154 92155 92156 92153 92158 92159 92160 92157 92162 92163 92164 92161 92166 92167 92168 92165 92170 92171 92172 92169 92174 92175 92176 92173 92178 92179 92180 92177 92182 92183 92184 92181 92186 92187 92188 92185 92190 92191 92192 92189 92194 92195 92196 92193 92198 92199 92200 92197 92202 92203 92204 92201 92206 92207 92208 92205 92210 92211 92212 92209 92214 92215 92216 92213 92218 92219 92220 92217 92222 92223 92224 92221 92226 92227 92228 92225 92230 92231 92232 92229 92234 92235 92236 92233 92238 92239 92240 92237 92242 92243 92244 92241 92246 92247 92248 92245 92250 92251 92252 92249 92254 92255 92256 92253 92258 92259 92260 92257 92262 92263 92264 92261 92266 92267 92268 92265 92270 92271 92272 92269 92274 92275 92276 92273 92278 92279 92280 92277 92282 92283 92284 92281 92286 92287 92288 92285 92290 92291 92292 92289 92294 92295 92296 92293 92298 92299 92300 92297 92302 92303 92304 92301 92306 92307 92308 92305 92310 92311 92312 92309 92314 92315 92316 92313 92318 92319 92320 92317 92322 92323 92324 92321 92326 92327 92328 92325 92330 92331 92332 92329 92334 92335 92336 92333 92338 92339 92340 92337 92342 92343 92344 92341 92346 92347 92348 92345 92350 92351 92352 92349 92354 92355 92356 92353 92358 92359 92360 92357 92362 92363 92364 92361 92366 92367 92368 92365 92370 92371 92372 92369 92374 92375 92376 92373 92378 92379 92380 92377 92382 92383 92384 92381 92386 92387 92388 92385 92390 92391 92392 92389 92394 92395 92396 92393 92398 92399 92400 92397 92402 92403 92404 92401 92406 92407 92408 92405 92410 92411 92412 92409 92414 92415 92416 92413 92418 92419 92420 92417 92422 92423 92424 92421 92426 92427 92428 92425 92430 92431 92432 92429 92434 92435 92436 92433 92438 92439 92440 92437 92442 92443 92444 92441 92446 92447 92448 92445 92450 92451 92452 92449 92454 92455 92456 92453 92458 92459 92460 92457 92462 92463 92464 92461 92466 92467 92468 92465 92470 92471 92472 92469 92474 92475 92476 92473 92478 92479 92480 92477 92482 92483 92484 92481 92486 92487 92488 92485 92490 92491 92492 92489 92494 92495 92496 92493 92498 92499 92500 92497 92502 92503 92504 92501 92506 92507 92508 92505 92510 92511 92512 92509 92514 92515 92516 92513 92518 92519 92520 92517 92522 92523 92524 92521 92526 92527 92528 92525 92530 92531 92532 92529 92534 92535 92536 92533 92538 92539 92540 92537 92542 92543 92544 92541 92546 92547 92548 92545 92550 92551 92552 92549 92554 92555 92556 92553 92558 92559 92560 92557 92562 92563 92564 92561 92566 92567 92568 92565 92570 92571 92572 92569 92574 92575 92576 92573 92578 92579 92580 92577 92582 92583 92584 92581 92586 92587 92588 92585 92590 92591 92592 92589 92594 92595 92596 92593 92598 92599 92600 92597 92602 92603 92604 92601 92606 92607 92608 92605 92610 92611 92612 92609 92614 92615 92616 92613 92618 92619 92620 92617 92622 92623 92624 92621 92626 92627 92628 92625 92630 92631 92632 92629 92634 92635 92636 92633 92638 92639 92640 92637 92642 92643 92644 92641 92646 92647 92648 92645 92650 92651 92652 92649 92654 92655 92656 92653 92658 92659 92660 92657 92662 92663 92664 92661 92666 92667 92668 92665 92670 92671 92672 92669 92674 92675 92676 92673 92678 92679 92680 92677 92682 92683 92684 92681 92686 92687 92688 92685 92690 92691 92692 92689 92694 92695 92696 92693 92698 92699 92700 92697 92702 92703 92704 92701 92706 92707 92708 92705 92710 92711 92712 92709 92714 92715 92716 92713 92718 92719 92720 92717 92722 92723 92724 92721 92726 92727 92728 92725 92730 92731 92732 92729 92734 92735 92736 92733 92738 92739 92740 92737 92742 92743 92744 92741 92746 92747 92748 92745 92750 92751 92752 92749 92754 92755 92756 92753 92758 92759 92760 92757 92762 92763 92764 92761 92766 92767 92768 92765 92770 92771 92772 92769 92774 92775 92776 92773 92778 92779 92780 92777 92782 92783 92784 92781 92786 92787 92788 92785 92790 92791 92792 92789 92794 92795 92796 92793 92798 92799 92800 92797 92802 92803 92804 92801 92806 92807 92808 92805 92810 92811 92812 92809 92814 92815 92816 92813 92818 92819 92820 92817 92822 92823 92824 92821 92826 92827 92828 92825 92830 92831 92832 92829 92834 92835 92836 92833 92838 92839 92840 92837 92842 92843 92844 92841 92846 92847 92848 92845 92850 92851 92852 92849 92854 92855 92856 92853 92858 92859 92860 92857 92862 92863 92864 92861 92866 92867 92868 92865 92870 92871 92872 92869 92874 92875 92876 92873 92878 92879 92880 92877 92882 92883 92884 92881 92886 92887 92888 92885 92890 92891 92892 92889 92894 92895 92896 92893 92898 92899 92900 92897 92902 92903 92904 92901 92906 92907 92908 92905 92910 92911 92912 92909 92914 92915 92916 92913 92918 92919 92920 92917 92922 92923 92924 92921 92926 92927 92928 92925 92930 92931 92932 92929 92934 92935 92936 92933 92938 92939 92940 92937 92942 92943 92944 92941 92946 92947 92948 92945 92950 92951 92952 92949 92954 92955 92956 92953 92958 92959 92960 92957 92962 92963 92964 92961 92966 92967 92968 92965 92970 92971 92972 92969 92974 92975 92976 92973 92978 92979 92980 92977 92982 92983 92984 92981 92986 92987 92988 92985 92990 92991 92992 92989 92994 92995 92996 92993 92998 92999 93000 92997 93002 93003 93004 93001 93006 93007 93008 93005 93010 93011 93012 93009 93014 93015 93016 93013 93018 93019 93020 93017 93022 93023 93024 93021 93026 93027 93028 93025 93030 93031 93032 93029 93034 93035 93036 93033 93038 93039 93040 93037 93042 93043 93044 93041 93046 93047 93048 93045 93050 93051 93052 93049 93054 93055 93056 93053 93058 93059 93060 93057 93062 93063 93064 93061 93066 93067 93068 93065 93070 93071 93072 93069 93074 93075 93076 93073 93078 93079 93080 93077 93082 93083 93084 93081 93086 93087 93088 93085 93090 93091 93092 93089 93094 93095 93096 93093 93098 93099 93100 93097 93102 93103 93104 93101 93106 93107 93108 93105 93110 93111 93112 93109 93114 93115 93116 93113 93118 93119 93120 93117 93122 93123 93124 93121 93126 93127 93128 93125 93130 93131 93132 93129 93134 93135 93136 93133 93138 93139 93140 93137 93142 93143 93144 93141 93146 93147 93148 93145 93150 93151 93152 93149 93154 93155 93156 93153 93158 93159 93160 93157 93162 93163 93164 93161 93166 93167 93168 93165 93170 93171 93172 93169 93174 93175 93176 93173 93178 93179 93180 93177 93182 93183 93184 93181 93186 93187 93188 93185 93190 93191 93192 93189 93194 93195 93196 93193 93198 93199 93200 93197 93202 93203 93204 93201 93206 93207 93208 93205 93210 93211 93212 93209 93214 93215 93216 93213 93218 93219 93220 93217 93222 93223 93224 93221 93226 93227 93228 93225 93230 93231 93232 93229 93234 93235 93236 93233 93238 93239 93240 93237 93242 93243 93244 93241 93246 93247 93248 93245 93250 93251 93252 93249 93254 93255 93256 93253 93258 93259 93260 93257 93262 93263 93264 93261 93266 93267 93268 93265 93270 93271 93272 93269 93274 93275 93276 93273 93278 93279 93280 93277 93282 93283 93284 93281 93286 93287 93288 93285 93290 93291 93292 93289 93294 93295 93296 93293 93298 93299 93300 93297 93302 93303 93304 93301 93306 93307 93308 93305 93310 93311 93312 93309 93314 93315 93316 93313 93318 93319 93320 93317 93322 93323 93324 93321 93326 93327 93328 93325 93330 93331 93332 93329 93334 93335 93336 93333 93338 93339 93340 93337 93342 93343 93344 93341 93346 93347 93348 93345 93350 93351 93352 93349 93354 93355 93356 93353 93358 93359 93360 93357 93362 93363 93364 93361 93366 93367 93368 93365 93370 93371 93372 93369 93374 93375 93376 93373 93378 93379 93380 93377 93382 93383 93384 93381 93386 93387 93388 93385 93390 93391 93392 93389 93394 93395 93396 93393 93398 93399 93400 93397 93402 93403 93404 93401 93406 93407 93408 93405 93410 93411 93412 93409 93414 93415 93416 93413 93418 93419 93420 93417 93422 93423 93424 93421 93426 93427 93428 93425 93430 93431 93432 93429 93434 93435 93436 93433 93438 93439 93440 93437 93442 93443 93444 93441 93446 93447 93448 93445 93450 93451 93452 93449 93454 93455 93456 93453 93458 93459 93460 93457 93462 93463 93464 93461 93466 93467 93468 93465 93470 93471 93472 93469 93474 93475 93476 93473 93478 93479 93480 93477 93482 93483 93484 93481 93486 93487 93488 93485 93490 93491 93492 93489 93494 93495 93496 93493 93498 93499 93500 93497 93502 93503 93504 93501 93506 93507 93508 93505 93510 93511 93512 93509 93514 93515 93516 93513 93518 93519 93520 93517 93522 93523 93524 93521 93526 93527 93528 93525 93530 93531 93532 93529 93534 93535 93536 93533 93538 93539 93540 93537 93542 93543 93544 93541 93546 93547 93548 93545 93550 93551 93552 93549 93554 93555 93556 93553 93558 93559 93560 93557 93562 93563 93564 93561 93566 93567 93568 93565 93570 93571 93572 93569 93574 93575 93576 93573 93578 93579 93580 93577 93582 93583 93584 93581 93586 93587 93588 93585 93590 93591 93592 93589 93594 93595 93596 93593 93598 93599 93600 93597 93602 93603 93604 93601 93606 93607 93608 93605 93610 93611 93612 93609 93614 93615 93616 93613 93618 93619 93620 93617 93622 93623 93624 93621 93626 93627 93628 93625 93630 93631 93632 93629 93634 93635 93636 93633 93638 93639 93640 93637 93642 93643 93644 93641 93646 93647 93648 93645 93650 93651 93652 93649 93654 93655 93656 93653 93658 93659 93660 93657 93662 93663 93664 93661 93666 93667 93668 93665 93670 93671 93672 93669 93674 93675 93676 93673 93678 93679 93680 93677 93682 93683 93684 93681 93686 93687 93688 93685 93690 93691 93692 93689 93694 93695 93696 93693 93698 93699 93700 93697 93702 93703 93704 93701 93706 93707 93708 93705 93710 93711 93712 93709 93714 93715 93716 93713 93718 93719 93720 93717 93722 93723 93724 93721 93726 93727 93728 93725 93730 93731 93732 93729 93734 93735 93736 93733 93738 93739 93740 93737 93742 93743 93744 93741 93746 93747 93748 93745 93750 93751 93752 93749 93754 93755 93756 93753 93758 93759 93760 93757 93762 93763 93764 93761 93766 93767 93768 93765 93770 93771 93772 93769 93774 93775 93776 93773 93778 93779 93780 93777 93782 93783 93784 93781 93786 93787 93788 93785 93790 93791 93792 93789 93794 93795 93796 93793 93798 93799 93800 93797 93802 93803 93804 93801 93806 93807 93808 93805 93810 93811 93812 93809 93814 93815 93816 93813 93818 93819 93820 93817 93822 93823 93824 93821 93826 93827 93828 93825 93830 93831 93832 93829 93834 93835 93836 93833 93838 93839 93840 93837 93842 93843 93844 93841 93846 93847 93848 93845 93850 93851 93852 93849 93854 93855 93856 93853 93858 93859 93860 93857 93862 93863 93864 93861 93866 93867 93868 93865 93870 93871 93872 93869 93874 93875 93876 93873 93878 93879 93880 93877 93882 93883 93884 93881 93886 93887 93888 93885 93890 93891 93892 93889 93894 93895 93896 93893 93898 93899 93900 93897 93902 93903 93904 93901 93906 93907 93908 93905 93910 93911 93912 93909 93914 93915 93916 93913 93918 93919 93920 93917 93922 93923 93924 93921 93926 93927 93928 93925 93930 93931 93932 93929 93934 93935 93936 93933 93938 93939 93940 93937 93942 93943 93944 93941 93946 93947 93948 93945 93950 93951 93952 93949 93954 93955 93956 93953 93958 93959 93960 93957 93962 93963 93964 93961 93966 93967 93968 93965 93970 93971 93972 93969 93974 93975 93976 93973 93978 93979 93980 93977 93982 93983 93984 93981 93986 93987 93988 93985 93990 93991 93992 93989 93994 93995 93996 93993 93998 93999 94000 93997 94002 94003 94004 94001 94006 94007 94008 94005 94010 94011 94012 94009 94014 94015 94016 94013 94018 94019 94020 94017 94022 94023 94024 94021 94026 94027 94028 94025 94030 94031 94032 94029 94034 94035 94036 94033 94038 94039 94040 94037 94042 94043 94044 94041 94046 94047 94048 94045 94050 94051 94052 94049 94054 94055 94056 94053 94058 94059 94060 94057 94062 94063 94064 94061 94066 94067 94068 94065 94070 94071 94072 94069 94074 94075 94076 94073 94078 94079 94080 94077 94082 94083 94084 94081 94086 94087 94088 94085 94090 94091 94092 94089 94094 94095 94096 94093 94098 94099 94100 94097 94102 94103 94104 94101 94106 94107 94108 94105 94110 94111 94112 94109 94114 94115 94116 94113 94118 94119 94120 94117 94122 94123 94124 94121 94126 94127 94128 94125 94130 94131 94132 94129 94134 94135 94136 94133 94138 94139 94140 94137 94142 94143 94144 94141 94146 94147 94148 94145 94150 94151 94152 94149 94154 94155 94156 94153 94158 94159 94160 94157 94162 94163 94164 94161 94166 94167 94168 94165 94170 94171 94172 94169 94174 94175 94176 94173 94178 94179 94180 94177 94182 94183 94184 94181 94186 94187 94188 94185 94190 94191 94192 94189 94194 94195 94196 94193 94198 94199 94200 94197 94202 94203 94204 94201 94206 94207 94208 94205 94210 94211 94212 94209 94214 94215 94216 94213 94218 94219 94220 94217 94222 94223 94224 94221 94226 94227 94228 94225 94230 94231 94232 94229 94234 94235 94236 94233 94238 94239 94240 94237 94242 94243 94244 94241 94246 94247 94248 94245 94250 94251 94252 94249 94254 94255 94256 94253 94258 94259 94260 94257 94262 94263 94264 94261 94266 94267 94268 94265 94270 94271 94272 94269 94274 94275 94276 94273 94278 94279 94280 94277 94282 94283 94284 94281 94286 94287 94288 94285 94290 94291 94292 94289 94294 94295 94296 94293 94298 94299 94300 94297 94302 94303 94304 94301 94306 94307 94308 94305 94310 94311 94312 94309 94314 94315 94316 94313 94318 94319 94320 94317 94322 94323 94324 94321 94326 94327 94328 94325 94330 94331 94332 94329 94334 94335 94336 94333 94338 94339 94340 94337 94342 94343 94344 94341 94346 94347 94348 94345 94350 94351 94352 94349 94354 94355 94356 94353 94358 94359 94360 94357 94362 94363 94364 94361 94366 94367 94368 94365 94370 94371 94372 94369 94374 94375 94376 94373 94378 94379 94380 94377 94382 94383 94384 94381 94386 94387 94388 94385 94390 94391 94392 94389 94394 94395 94396 94393 94398 94399 94400 94397 94402 94403 94404 94401 94406 94407 94408 94405 94410 94411 94412 94409 94414 94415 94416 94413 94418 94419 94420 94417 94422 94423 94424 94421 94426 94427 94428 94425 94430 94431 94432 94429 94434 94435 94436 94433 94438 94439 94440 94437 94442 94443 94444 94441 94446 94447 94448 94445 94450 94451 94452 94449 94454 94455 94456 94453 94458 94459 94460 94457 94462 94463 94464 94461 94466 94467 94468 94465 94470 94471 94472 94469 94474 94475 94476 94473 94478 94479 94480 94477 94482 94483 94484 94481 94486 94487 94488 94485 94490 94491 94492 94489 94494 94495 94496 94493 94498 94499 94500 94497 94502 94503 94504 94501 94506 94507 94508 94505 94510 94511 94512 94509 94514 94515 94516 94513 94518 94519 94520 94517 94522 94523 94524 94521 94526 94527 94528 94525 94530 94531 94532 94529 94534 94535 94536 94533 94538 94539 94540 94537 94542 94543 94544 94541 94546 94547 94548 94545 94550 94551 94552 94549 94554 94555 94556 94553 94558 94559 94560 94557 94562 94563 94564 94561 94566 94567 94568 94565 94570 94571 94572 94569 94574 94575 94576 94573 94578 94579 94580 94577 94582 94583 94584 94581 94586 94587 94588 94585 94590 94591 94592 94589 94594 94595 94596 94593 94598 94599 94600 94597 94602 94603 94604 94601 94606 94607 94608 94605 94610 94611 94612 94609 94614 94615 94616 94613 94618 94619 94620 94617 94622 94623 94624 94621 94626 94627 94628 94625 94630 94631 94632 94629 94634 94635 94636 94633 94638 94639 94640 94637 94642 94643 94644 94641 94646 94647 94648 94645 94650 94651 94652 94649 94654 94655 94656 94653 94658 94659 94660 94657 94662 94663 94664 94661 94666 94667 94668 94665 94670 94671 94672 94669 94674 94675 94676 94673 94678 94679 94680 94677 94682 94683 94684 94681 94686 94687 94688 94685 94690 94691 94692 94689 94694 94695 94696 94693 94698 94699 94700 94697 94702 94703 94704 94701 94706 94707 94708 94705 94710 94711 94712 94709 94714 94715 94716 94713 94718 94719 94720 94717 94722 94723 94724 94721 94726 94727 94728 94725 94730 94731 94732 94729 94734 94735 94736 94733 94738 94739 94740 94737 94742 94743 94744 94741 94746 94747 94748 94745 94750 94751 94752 94749 94754 94755 94756 94753 94758 94759 94760 94757 94762 94763 94764 94761 94766 94767 94768 94765 94770 94771 94772 94769 94774 94775 94776 94773 94778 94779 94780 94777 94782 94783 94784 94781 94786 94787 94788 94785 94790 94791 94792 94789 94794 94795 94796 94793 94798 94799 94800 94797 94802 94803 94804 94801 94806 94807 94808 94805 94810 94811 94812 94809 94814 94815 94816 94813 94818 94819 94820 94817 94822 94823 94824 94821 94826 94827 94828 94825 94830 94831 94832 94829 94834 94835 94836 94833 94838 94839 94840 94837 94842 94843 94844 94841 94846 94847 94848 94845 94850 94851 94852 94849 94854 94855 94856 94853 94858 94859 94860 94857 94862 94863 94864 94861 94866 94867 94868 94865 94870 94871 94872 94869 94874 94875 94876 94873 94878 94879 94880 94877 94882 94883 94884 94881 94886 94887 94888 94885 94890 94891 94892 94889 94894 94895 94896 94893 94898 94899 94900 94897 94902 94903 94904 94901 94906 94907 94908 94905 94910 94911 94912 94909 94914 94915 94916 94913 94918 94919 94920 94917 94922 94923 94924 94921 94926 94927 94928 94925 94930 94931 94932 94929 94934 94935 94936 94933 94938 94939 94940 94937 94942 94943 94944 94941 94946 94947 94948 94945 94950 94951 94952 94949 94954 94955 94956 94953 94958 94959 94960 94957 94962 94963 94964 94961 94966 94967 94968 94965 94970 94971 94972 94969 94974 94975 94976 94973 94978 94979 94980 94977 94982 94983 94984 94981 94986 94987 94988 94985 94990 94991 94992 94989 94994 94995 94996 94993 94998 94999 95000 94997 95002 95003 95004 95001 95006 95007 95008 95005 95010 95011 95012 95009 95014 95015 95016 95013 95018 95019 95020 95017 95022 95023 95024 95021 95026 95027 95028 95025 95030 95031 95032 95029 95034 95035 95036 95033 95038 95039 95040 95037 95042 95043 95044 95041 95046 95047 95048 95045 95050 95051 95052 95049 95054 95055 95056 95053 95058 95059 95060 95057 95062 95063 95064 95061 95066 95067 95068 95065 95070 95071 95072 95069 95074 95075 95076 95073 95078 95079 95080 95077 95082 95083 95084 95081 95086 95087 95088 95085 95090 95091 95092 95089 95094 95095 95096 95093 95098 95099 95100 95097 95102 95103 95104 95101 95106 95107 95108 95105 95110 95111 95112 95109 95114 95115 95116 95113 95118 95119 95120 95117 95122 95123 95124 95121 95126 95127 95128 95125 95130 95131 95132 95129 95134 95135 95136 95133 95138 95139 95140 95137 95142 95143 95144 95141 95146 95147 95148 95145 95150 95151 95152 95149 95154 95155 95156 95153 95158 95159 95160 95157 95162 95163 95164 95161 95166 95167 95168 95165 95170 95171 95172 95169 95174 95175 95176 95173 95178 95179 95180 95177 95182 95183 95184 95181 95186 95187 95188 95185 95190 95191 95192 95189 95194 95195 95196 95193 95198 95199 95200 95197 95202 95203 95204 95201 95206 95207 95208 95205 95210 95211 95212 95209 95214 95215 95216 95213 95218 95219 95220 95217 95222 95223 95224 95221 95226 95227 95228 95225 95230 95231 95232 95229 95234 95235 95236 95233 95238 95239 95240 95237 95242 95243 95244 95241 95246 95247 95248 95245 95250 95251 95252 95249 95254 95255 95256 95253 95258 95259 95260 95257 95262 95263 95264 95261 95266 95267 95268 95265 95270 95271 95272 95269 95274 95275 95276 95273 95278 95279 95280 95277 95282 95283 95284 95281 95286 95287 95288 95285 95290 95291 95292 95289 95294 95295 95296 95293 95298 95299 95300 95297 95302 95303 95304 95301 95306 95307 95308 95305 95310 95311 95312 95309 95314 95315 95316 95313 95318 95319 95320 95317 95322 95323 95324 95321 95326 95327 95328 95325 95330 95331 95332 95329 95334 95335 95336 95333 95338 95339 95340 95337 95342 95343 95344 95341 95346 95347 95348 95345 95350 95351 95352 95349 95354 95355 95356 95353 95358 95359 95360 95357 95362 95363 95364 95361 95366 95367 95368 95365 95370 95371 95372 95369 95374 95375 95376 95373 95378 95379 95380 95377 95382 95383 95384 95381 95386 95387 95388 95385 95390 95391 95392 95389 95394 95395 95396 95393 95398 95399 95400 95397 95402 95403 95404 95401 95406 95407 95408 95405 95410 95411 95412 95409 95414 95415 95416 95413 95418 95419 95420 95417 95422 95423 95424 95421 95426 95427 95428 95425 95430 95431 95432 95429 95434 95435 95436 95433 95438 95439 95440 95437 95442 95443 95444 95441 95446 95447 95448 95445 95450 95451 95452 95449 95454 95455 95456 95453 95458 95459 95460 95457 95462 95463 95464 95461 95466 95467 95468 95465 95470 95471 95472 95469 95474 95475 95476 95473 95478 95479 95480 95477 95482 95483 95484 95481 95486 95487 95488 95485 95490 95491 95492 95489 95494 95495 95496 95493 95498 95499 95500 95497 95502 95503 95504 95501 95506 95507 95508 95505 95510 95511 95512 95509 95514 95515 95516 95513 95518 95519 95520 95517 95522 95523 95524 95521 95526 95527 95528 95525 95530 95531 95532 95529 95534 95535 95536 95533 95538 95539 95540 95537 95542 95543 95544 95541 95546 95547 95548 95545 95550 95551 95552 95549 95554 95555 95556 95553 95558 95559 95560 95557 95562 95563 95564 95561 95566 95567 95568 95565 95570 95571 95572 95569 95574 95575 95576 95573 95578 95579 95580 95577 95582 95583 95584 95581 95586 95587 95588 95585 95590 95591 95592 95589 95594 95595 95596 95593 95598 95599 95600 95597 95602 95603 95604 95601 95606 95607 95608 95605 95610 95611 95612 95609 95614 95615 95616 95613 95618 95619 95620 95617 95622 95623 95624 95621 95626 95627 95628 95625 95630 95631 95632 95629 95634 95635 95636 95633 95638 95639 95640 95637 95642 95643 95644 95641 95646 95647 95648 95645 95650 95651 95652 95649 95654 95655 95656 95653 95658 95659 95660 95657 95662 95663 95664 95661 95666 95667 95668 95665 95670 95671 95672 95669 95674 95675 95676 95673 95678 95679 95680 95677 95682 95683 95684 95681 95686 95687 95688 95685 95690 95691 95692 95689 95694 95695 95696 95693 95698 95699 95700 95697 95702 95703 95704 95701 95706 95707 95708 95705 95710 95711 95712 95709 95714 95715 95716 95713 95718 95719 95720 95717 95722 95723 95724 95721 95726 95727 95728 95725 95730 95731 95732 95729 95734 95735 95736 95733 95738 95739 95740 95737 95742 95743 95744 95741 95746 95747 95748 95745 95750 95751 95752 95749 95754 95755 95756 95753 95758 95759 95760 95757 95762 95763 95764 95761 95766 95767 95768 95765 95770 95771 95772 95769 95774 95775 95776 95773 95778 95779 95780 95777 95782 95783 95784 95781 95786 95787 95788 95785 95790 95791 95792 95789 95794 95795 95796 95793 95798 95799 95800 95797 95802 95803 95804 95801 95806 95807 95808 95805 95810 95811 95812 95809 95814 95815 95816 95813 95818 95819 95820 95817 95822 95823 95824 95821 95826 95827 95828 95825 95830 95831 95832 95829 95834 95835 95836 95833 95838 95839 95840 95837 95842 95843 95844 95841 95846 95847 95848 95845 95850 95851 95852 95849 95854 95855 95856 95853 95858 95859 95860 95857 95862 95863 95864 95861 95866 95867 95868 95865 95870 95871 95872 95869 95874 95875 95876 95873 95878 95879 95880 95877 95882 95883 95884 95881 95886 95887 95888 95885 95890 95891 95892 95889 95894 95895 95896 95893 95898 95899 95900 95897 95902 95903 95904 95901 95906 95907 95908 95905 95910 95911 95912 95909 95914 95915 95916 95913 95918 95919 95920 95917 95922 95923 95924 95921 95926 95927 95928 95925 95930 95931 95932 95929 95934 95935 95936 95933 95938 95939 95940 95937 95942 95943 95944 95941 95946 95947 95948 95945 95950 95951 95952 95949 95954 95955 95956 95953 95958 95959 95960 95957 95962 95963 95964 95961 95966 95967 95968 95965 95970 95971 95972 95969 95974 95975 95976 95973 95978 95979 95980 95977 95982 95983 95984 95981 95986 95987 95988 95985 95990 95991 95992 95989 95994 95995 95996 95993 95998 95999 96000 95997 96002 96003 96004 96001 96006 96007 96008 96005 96010 96011 96012 96009 96014 96015 96016 96013 96018 96019 96020 96017 96022 96023 96024 96021 96026 96027 96028 96025 96030 96031 96032 96029 96034 96035 96036 96033 96038 96039 96040 96037 96042 96043 96044 96041 96046 96047 96048 96045 96050 96051 96052 96049 96054 96055 96056 96053 96058 96059 96060 96057 96062 96063 96064 96061 96066 96067 96068 96065 96070 96071 96072 96069 96074 96075 96076 96073 96078 96079 96080 96077 96082 96083 96084 96081 96086 96087 96088 96085 96090 96091 96092 96089 96094 96095 96096 96093 96098 96099 96100 96097 96102 96103 96104 96101 96106 96107 96108 96105 96110 96111 96112 96109 96114 96115 96116 96113 96118 96119 96120 96117 96122 96123 96124 96121 96126 96127 96128 96125 96130 96131 96132 96129 96134 96135 96136 96133 96138 96139 96140 96137 96142 96143 96144 96141 96146 96147 96148 96145 96150 96151 96152 96149 96154 96155 96156 96153 96158 96159 96160 96157 96162 96163 96164 96161 96166 96167 96168 96165 96170 96171 96172 96169 96174 96175 96176 96173 96178 96179 96180 96177 96182 96183 96184 96181 96186 96187 96188 96185 96190 96191 96192 96189 96194 96195 96196 96193 96198 96199 96200 96197 96202 96203 96204 96201 96206 96207 96208 96205 96210 96211 96212 96209 96214 96215 96216 96213 96218 96219 96220 96217 96222 96223 96224 96221 96226 96227 96228 96225 96230 96231 96232 96229 96234 96235 96236 96233 96238 96239 96240 96237 96242 96243 96244 96241 96246 96247 96248 96245 96250 96251 96252 96249 96254 96255 96256 96253 96258 96259 96260 96257 96262 96263 96264 96261 96266 96267 96268 96265 96270 96271 96272 96269 96274 96275 96276 96273 96278 96279 96280 96277 96282 96283 96284 96281 96286 96287 96288 96285 96290 96291 96292 96289 96294 96295 96296 96293 96298 96299 96300 96297 96302 96303 96304 96301 96306 96307 96308 96305 96310 96311 96312 96309 96314 96315 96316 96313 96318 96319 96320 96317 96322 96323 96324 96321 96326 96327 96328 96325 96330 96331 96332 96329 96334 96335 96336 96333 96338 96339 96340 96337 96342 96343 96344 96341 96346 96347 96348 96345 96350 96351 96352 96349 96354 96355 96356 96353 96358 96359 96360 96357 96362 96363 96364 96361 96366 96367 96368 96365 96370 96371 96372 96369 96374 96375 96376 96373 96378 96379 96380 96377 96382 96383 96384 96381 96386 96387 96388 96385 96390 96391 96392 96389 96394 96395 96396 96393 96398 96399 96400 96397 96402 96403 96404 96401 96406 96407 96408 96405 96410 96411 96412 96409 96414 96415 96416 96413 96418 96419 96420 96417 96422 96423 96424 96421 96426 96427 96428 96425 96430 96431 96432 96429 96434 96435 96436 96433 96438 96439 96440 96437 96442 96443 96444 96441 96446 96447 96448 96445 96450 96451 96452 96449 96454 96455 96456 96453 96458 96459 96460 96457 96462 96463 96464 96461 96466 96467 96468 96465 96470 96471 96472 96469 96474 96475 96476 96473 96478 96479 96480 96477 96482 96483 96484 96481 96486 96487 96488 96485 96490 96491 96492 96489 96494 96495 96496 96493 96498 96499 96500 96497 96502 96503 96504 96501 96506 96507 96508 96505 96510 96511 96512 96509 96514 96515 96516 96513 96518 96519 96520 96517 96522 96523 96524 96521 96526 96527 96528 96525 96530 96531 96532 96529 96534 96535 96536 96533 96538 96539 96540 96537 96542 96543 96544 96541 96546 96547 96548 96545 96550 96551 96552 96549 96554 96555 96556 96553 96558 96559 96560 96557 96562 96563 96564 96561 96566 96567 96568 96565 96570 96571 96572 96569 96574 96575 96576 96573 96578 96579 96580 96577 96582 96583 96584 96581 96586 96587 96588 96585 96590 96591 96592 96589 96594 96595 96596 96593 96598 96599 96600 96597 96602 96603 96604 96601 96606 96607 96608 96605 96610 96611 96612 96609 96614 96615 96616 96613 96618 96619 96620 96617 96622 96623 96624 96621 96626 96627 96628 96625 96630 96631 96632 96629 96634 96635 96636 96633 96638 96639 96640 96637 96642 96643 96644 96641 96646 96647 96648 96645 96650 96651 96652 96649 96654 96655 96656 96653 96658 96659 96660 96657 96662 96663 96664 96661 96666 96667 96668 96665 96670 96671 96672 96669 96674 96675 96676 96673 96678 96679 96680 96677 96682 96683 96684 96681 96686 96687 96688 96685 96690 96691 96692 96689 96694 96695 96696 96693 96698 96699 96700 96697 96702 96703 96704 96701 96706 96707 96708 96705 96710 96711 96712 96709 96714 96715 96716 96713 96718 96719 96720 96717 96722 96723 96724 96721 96726 96727 96728 96725 96730 96731 96732 96729 96734 96735 96736 96733 96738 96739 96740 96737 96742 96743 96744 96741 96746 96747 96748 96745 96750 96751 96752 96749 96754 96755 96756 96753 96758 96759 96760 96757 96762 96763 96764 96761 96766 96767 96768 96765 96770 96771 96772 96769 96774 96775 96776 96773 96778 96779 96780 96777 96782 96783 96784 96781 96786 96787 96788 96785 96790 96791 96792 96789 96794 96795 96796 96793 96798 96799 96800 96797 96802 96803 96804 96801 96806 96807 96808 96805 96810 96811 96812 96809 96814 96815 96816 96813 96818 96819 96820 96817 96822 96823 96824 96821 96826 96827 96828 96825 96830 96831 96832 96829 96834 96835 96836 96833 96838 96839 96840 96837 96842 96843 96844 96841 96846 96847 96848 96845 96850 96851 96852 96849 96854 96855 96856 96853 96858 96859 96860 96857 96862 96863 96864 96861 96866 96867 96868 96865 96870 96871 96872 96869 96874 96875 96876 96873 96878 96879 96880 96877 96882 96883 96884 96881 96886 96887 96888 96885 96890 96891 96892 96889 96894 96895 96896 96893 96898 96899 96900 96897 96902 96903 96904 96901 96906 96907 96908 96905 96910 96911 96912 96909 96914 96915 96916 96913 96918 96919 96920 96917 96922 96923 96924 96921 96926 96927 96928 96925 96930 96931 96932 96929 96934 96935 96936 96933 96938 96939 96940 96937 96942 96943 96944 96941 96946 96947 96948 96945 96950 96951 96952 96949 96954 96955 96956 96953 96958 96959 96960 96957 96962 96963 96964 96961 96966 96967 96968 96965 96970 96971 96972 96969 96974 96975 96976 96973 96978 96979 96980 96977 96982 96983 96984 96981 96986 96987 96988 96985 96990 96991 96992 96989 96994 96995 96996 96993 96998 96999 97000 96997 97002 97003 97004 97001 97006 97007 97008 97005 97010 97011 97012 97009 97014 97015 97016 97013 97018 97019 97020 97017 97022 97023 97024 97021 97026 97027 97028 97025 97030 97031 97032 97029 97034 97035 97036 97033 97038 97039 97040 97037 97042 97043 97044 97041 97046 97047 97048 97045 97050 97051 97052 97049 97054 97055 97056 97053 97058 97059 97060 97057 97062 97063 97064 97061 97066 97067 97068 97065 97070 97071 97072 97069 97074 97075 97076 97073 97078 97079 97080 97077 97082 97083 97084 97081 97086 97087 97088 97085 97090 97091 97092 97089 97094 97095 97096 97093 97098 97099 97100 97097 97102 97103 97104 97101 97106 97107 97108 97105 97110 97111 97112 97109 97114 97115 97116 97113 97118 97119 97120 97117 97122 97123 97124 97121 97126 97127 97128 97125 97130 97131 97132 97129 97134 97135 97136 97133 97138 97139 97140 97137 97142 97143 97144 97141 97146 97147 97148 97145 97150 97151 97152 97149 97154 97155 97156 97153 97158 97159 97160 97157 97162 97163 97164 97161 97166 97167 97168 97165 97170 97171 97172 97169 97174 97175 97176 97173 97178 97179 97180 97177 97182 97183 97184 97181 97186 97187 97188 97185 97190 97191 97192 97189 97194 97195 97196 97193 97198 97199 97200 97197 97202 97203 97204 97201 97206 97207 97208 97205 97210 97211 97212 97209 97214 97215 97216 97213 97218 97219 97220 97217 97222 97223 97224 97221 97226 97227 97228 97225 97230 97231 97232 97229 97234 97235 97236 97233 97238 97239 97240 97237 97242 97243 97244 97241 97246 97247 97248 97245 97250 97251 97252 97249 97254 97255 97256 97253 97258 97259 97260 97257 97262 97263 97264 97261 97266 97267 97268 97265 97270 97271 97272 97269 97274 97275 97276 97273 97278 97279 97280 97277 97282 97283 97284 97281 97286 97287 97288 97285 97290 97291 97292 97289 97294 97295 97296 97293 97298 97299 97300 97297 97302 97303 97304 97301 97306 97307 97308 97305 97310 97311 97312 97309 97314 97315 97316 97313 97318 97319 97320 97317 97322 97323 97324 97321 97326 97327 97328 97325 97330 97331 97332 97329 97334 97335 97336 97333 97338 97339 97340 97337 97342 97343 97344 97341 97346 97347 97348 97345 97350 97351 97352 97349 97354 97355 97356 97353 97358 97359 97360 97357 97362 97363 97364 97361 97366 97367 97368 97365 97370 97371 97372 97369 97374 97375 97376 97373 97378 97379 97380 97377 97382 97383 97384 97381 97386 97387 97388 97385 97390 97391 97392 97389 97394 97395 97396 97393 97398 97399 97400 97397 97402 97403 97404 97401 97406 97407 97408 97405 97410 97411 97412 97409 97414 97415 97416 97413 97418 97419 97420 97417 97422 97423 97424 97421 97426 97427 97428 97425 97430 97431 97432 97429 97434 97435 97436 97433 97438 97439 97440 97437 97442 97443 97444 97441 97446 97447 97448 97445 97450 97451 97452 97449 97454 97455 97456 97453 97458 97459 97460 97457 97462 97463 97464 97461 97466 97467 97468 97465 97470 97471 97472 97469 97474 97475 97476 97473 97478 97479 97480 97477 97482 97483 97484 97481 97486 97487 97488 97485 97490 97491 97492 97489 97494 97495 97496 97493 97498 97499 97500 97497 97502 97503 97504 97501 97506 97507 97508 97505 97510 97511 97512 97509 97514 97515 97516 97513 97518 97519 97520 97517 97522 97523 97524 97521 97526 97527 97528 97525 97530 97531 97532 97529 97534 97535 97536 97533 97538 97539 97540 97537 97542 97543 97544 97541 97546 97547 97548 97545 97550 97551 97552 97549 97554 97555 97556 97553 97558 97559 97560 97557 97562 97563 97564 97561 97566 97567 97568 97565 97570 97571 97572 97569 97574 97575 97576 97573 97578 97579 97580 97577 97582 97583 97584 97581 97586 97587 97588 97585 97590 97591 97592 97589 97594 97595 97596 97593 97598 97599 97600 97597 97602 97603 97604 97601 97606 97607 97608 97605 97610 97611 97612 97609 97614 97615 97616 97613 97618 97619 97620 97617 97622 97623 97624 97621 97626 97627 97628 97625 97630 97631 97632 97629 97634 97635 97636 97633 97638 97639 97640 97637 97642 97643 97644 97641 97646 97647 97648 97645 97650 97651 97652 97649 97654 97655 97656 97653 97658 97659 97660 97657 97662 97663 97664 97661 97666 97667 97668 97665 97670 97671 97672 97669 97674 97675 97676 97673 97678 97679 97680 97677 97682 97683 97684 97681 97686 97687 97688 97685 97690 97691 97692 97689 97694 97695 97696 97693 97698 97699 97700 97697 97702 97703 97704 97701 97706 97707 97708 97705 97710 97711 97712 97709 97714 97715 97716 97713 97718 97719 97720 97717 97722 97723 97724 97721 97726 97727 97728 97725 97730 97731 97732 97729 97734 97735 97736 97733 97738 97739 97740 97737 97742 97743 97744 97741 97746 97747 97748 97745 97750 97751 97752 97749 97754 97755 97756 97753 97758 97759 97760 97757 97762 97763 97764 97761 97766 97767 97768 97765 97770 97771 97772 97769 97774 97775 97776 97773 97778 97779 97780 97777 97782 97783 97784 97781 97786 97787 97788 97785 97790 97791 97792 97789 97794 97795 97796 97793 97798 97799 97800 97797 97802 97803 97804 97801 97806 97807 97808 97805 97810 97811 97812 97809 97814 97815 97816 97813 97818 97819 97820 97817 97822 97823 97824 97821 97826 97827 97828 97825 97830 97831 97832 97829 97834 97835 97836 97833 97838 97839 97840 97837 97842 97843 97844 97841 97846 97847 97848 97845 97850 97851 97852 97849 97854 97855 97856 97853 97858 97859 97860 97857 97862 97863 97864 97861 97866 97867 97868 97865 97870 97871 97872 97869 97874 97875 97876 97873 97878 97879 97880 97877 97882 97883 97884 97881 97886 97887 97888 97885 97890 97891 97892 97889 97894 97895 97896 97893 97898 97899 97900 97897 97902 97903 97904 97901 97906 97907 97908 97905 97910 97911 97912 97909 97914 97915 97916 97913 97918 97919 97920 97917 97922 97923 97924 97921 97926 97927 97928 97925 97930 97931 97932 97929 97934 97935 97936 97933 97938 97939 97940 97937 97942 97943 97944 97941 97946 97947 97948 97945 97950 97951 97952 97949 97954 97955 97956 97953 97958 97959 97960 97957 97962 97963 97964 97961 97966 97967 97968 97965 97970 97971 97972 97969 97974 97975 97976 97973 97978 97979 97980 97977 97982 97983 97984 97981 97986 97987 97988 97985 97990 97991 97992 97989 97994 97995 97996 97993 97998 97999 98000 97997 98002 98003 98004 98001 98006 98007 98008 98005 98010 98011 98012 98009 98014 98015 98016 98013 98018 98019 98020 98017 98022 98023 98024 98021 98026 98027 98028 98025 98030 98031 98032 98029 98034 98035 98036 98033 98038 98039 98040 98037 98042 98043 98044 98041 98046 98047 98048 98045 98050 98051 98052 98049 98054 98055 98056 98053 98058 98059 98060 98057 98062 98063 98064 98061 98066 98067 98068 98065 98070 98071 98072 98069 98074 98075 98076 98073 98078 98079 98080 98077 98082 98083 98084 98081 98086 98087 98088 98085 98090 98091 98092 98089 98094 98095 98096 98093 98098 98099 98100 98097 98102 98103 98104 98101 98106 98107 98108 98105 98110 98111 98112 98109 98114 98115 98116 98113 98118 98119 98120 98117 98122 98123 98124 98121 98126 98127 98128 98125 98130 98131 98132 98129 98134 98135 98136 98133 98138 98139 98140 98137 98142 98143 98144 98141 98146 98147 98148 98145 98150 98151 98152 98149 98154 98155 98156 98153 98158 98159 98160 98157 98162 98163 98164 98161 98166 98167 98168 98165 98170 98171 98172 98169 98174 98175 98176 98173 98178 98179 98180 98177 98182 98183 98184 98181 98186 98187 98188 98185 98190 98191 98192 98189 98194 98195 98196 98193 98198 98199 98200 98197 98202 98203 98204 98201 98206 98207 98208 98205 98210 98211 98212 98209 98214 98215 98216 98213 98218 98219 98220 98217 98222 98223 98224 98221 98226 98227 98228 98225 98230 98231 98232 98229 98234 98235 98236 98233 98238 98239 98240 98237 98242 98243 98244 98241 98246 98247 98248 98245 98250 98251 98252 98249 98254 98255 98256 98253 98258 98259 98260 98257 98262 98263 98264 98261 98266 98267 98268 98265 98270 98271 98272 98269 98274 98275 98276 98273 98278 98279 98280 98277 98282 98283 98284 98281 98286 98287 98288 98285 98290 98291 98292 98289 98294 98295 98296 98293 98298 98299 98300 98297 98302 98303 98304 98301 98306 98307 98308 98305 98310 98311 98312 98309 98314 98315 98316 98313 98318 98319 98320 98317 98322 98323 98324 98321 98326 98327 98328 98325 98330 98331 98332 98329 98334 98335 98336 98333 98338 98339 98340 98337 98342 98343 98344 98341 98346 98347 98348 98345 98350 98351 98352 98349 98354 98355 98356 98353 98358 98359 98360 98357 98362 98363 98364 98361 98366 98367 98368 98365 98370 98371 98372 98369 98374 98375 98376 98373 98378 98379 98380 98377 98382 98383 98384 98381 98386 98387 98388 98385 98390 98391 98392 98389 98394 98395 98396 98393 98398 98399 98400 98397 98402 98403 98404 98401 98406 98407 98408 98405 98410 98411 98412 98409 98414 98415 98416 98413 98418 98419 98420 98417 98422 98423 98424 98421 98426 98427 98428 98425 98430 98431 98432 98429 98434 98435 98436 98433 98438 98439 98440 98437 98442 98443 98444 98441 98446 98447 98448 98445 98450 98451 98452 98449 98454 98455 98456 98453 98458 98459 98460 98457 98462 98463 98464 98461 98466 98467 98468 98465 98470 98471 98472 98469 98474 98475 98476 98473 98478 98479 98480 98477 98482 98483 98484 98481 98486 98487 98488 98485 98490 98491 98492 98489 98494 98495 98496 98493 98498 98499 98500 98497 98502 98503 98504 98501 98506 98507 98508 98505 98510 98511 98512 98509 98514 98515 98516 98513 98518 98519 98520 98517 98522 98523 98524 98521 98526 98527 98528 98525 98530 98531 98532 98529 98534 98535 98536 98533 98538 98539 98540 98537 98542 98543 98544 98541 98546 98547 98548 98545 98550 98551 98552 98549 98554 98555 98556 98553 98558 98559 98560 98557 98562 98563 98564 98561 98566 98567 98568 98565 98570 98571 98572 98569 98574 98575 98576 98573 98578 98579 98580 98577 98582 98583 98584 98581 98586 98587 98588 98585 98590 98591 98592 98589 98594 98595 98596 98593 98598 98599 98600 98597 98602 98603 98604 98601 98606 98607 98608 98605 98610 98611 98612 98609 98614 98615 98616 98613 98618 98619 98620 98617 98622 98623 98624 98621 98626 98627 98628 98625 98630 98631 98632 98629 98634 98635 98636 98633 98638 98639 98640 98637 98642 98643 98644 98641 98646 98647 98648 98645 98650 98651 98652 98649 98654 98655 98656 98653 98658 98659 98660 98657 98662 98663 98664 98661 98666 98667 98668 98665 98670 98671 98672 98669 98674 98675 98676 98673 98678 98679 98680 98677 98682 98683 98684 98681 98686 98687 98688 98685 98690 98691 98692 98689 98694 98695 98696 98693 98698 98699 98700 98697 98702 98703 98704 98701 98706 98707 98708 98705 98710 98711 98712 98709 98714 98715 98716 98713 98718 98719 98720 98717 98722 98723 98724 98721 98726 98727 98728 98725 98730 98731 98732 98729 98734 98735 98736 98733 98738 98739 98740 98737 98742 98743 98744 98741 98746 98747 98748 98745 98750 98751 98752 98749 98754 98755 98756 98753 98758 98759 98760 98757 98762 98763 98764 98761 98766 98767 98768 98765 98770 98771 98772 98769 98774 98775 98776 98773 98778 98779 98780 98777 98782 98783 98784 98781 98786 98787 98788 98785 98790 98791 98792 98789 98794 98795 98796 98793 98798 98799 98800 98797 98802 98803 98804 98801 98806 98807 98808 98805 98810 98811 98812 98809 98814 98815 98816 98813 98818 98819 98820 98817 98822 98823 98824 98821 98826 98827 98828 98825 98830 98831 98832 98829 98834 98835 98836 98833 98838 98839 98840 98837 98842 98843 98844 98841 98846 98847 98848 98845 98850 98851 98852 98849 98854 98855 98856 98853 98858 98859 98860 98857 98862 98863 98864 98861 98866 98867 98868 98865 98870 98871 98872 98869 98874 98875 98876 98873 98878 98879 98880 98877 98882 98883 98884 98881 98886 98887 98888 98885 98890 98891 98892 98889 98894 98895 98896 98893 98898 98899 98900 98897 98902 98903 98904 98901 98906 98907 98908 98905 98910 98911 98912 98909 98914 98915 98916 98913 98918 98919 98920 98917 98922 98923 98924 98921 98926 98927 98928 98925 98930 98931 98932 98929 98934 98935 98936 98933 98938 98939 98940 98937 98942 98943 98944 98941 98946 98947 98948 98945 98950 98951 98952 98949 98954 98955 98956 98953 98958 98959 98960 98957 98962 98963 98964 98961 98966 98967 98968 98965 98970 98971 98972 98969 98974 98975 98976 98973 98978 98979 98980 98977 98982 98983 98984 98981 98986 98987 98988 98985 98990 98991 98992 98989 98994 98995 98996 98993 98998 98999 99000 98997 99002 99003 99004 99001 99006 99007 99008 99005 99010 99011 99012 99009 99014 99015 99016 99013 99018 99019 99020 99017 99022 99023 99024 99021 99026 99027 99028 99025 99030 99031 99032 99029 99034 99035 99036 99033 99038 99039 99040 99037 99042 99043 99044 99041 99046 99047 99048 99045 99050 99051 99052 99049 99054 99055 99056 99053 99058 99059 99060 99057 99062 99063 99064 99061 99066 99067 99068 99065 99070 99071 99072 99069 99074 99075 99076 99073 99078 99079 99080 99077 99082 99083 99084 99081 99086 99087 99088 99085 99090 99091 99092 99089 99094 99095 99096 99093 99098 99099 99100 99097 99102 99103 99104 99101 99106 99107 99108 99105 99110 99111 99112 99109 99114 99115 99116 99113 99118 99119 99120 99117 99122 99123 99124 99121 99126 99127 99128 99125 99130 99131 99132 99129 99134 99135 99136 99133 99138 99139 99140 99137 99142 99143 99144 99141 99146 99147 99148 99145 99150 99151 99152 99149 99154 99155 99156 99153 99158 99159 99160 99157 99162 99163 99164 99161 99166 99167 99168 99165 99170 99171 99172 99169 99174 99175 99176 99173 99178 99179 99180 99177 99182 99183 99184 99181 99186 99187 99188 99185 99190 99191 99192 99189 99194 99195 99196 99193 99198 99199 99200 99197 99202 99203 99204 99201 99206 99207 99208 99205 99210 99211 99212 99209 99214 99215 99216 99213 99218 99219 99220 99217 99222 99223 99224 99221 99226 99227 99228 99225 99230 99231 99232 99229 99234 99235 99236 99233 99238 99239 99240 99237 99242 99243 99244 99241 99246 99247 99248 99245 99250 99251 99252 99249 99254 99255 99256 99253 99258 99259 99260 99257 99262 99263 99264 99261 99266 99267 99268 99265 99270 99271 99272 99269 99274 99275 99276 99273 99278 99279 99280 99277 99282 99283 99284 99281 99286 99287 99288 99285 99290 99291 99292 99289 99294 99295 99296 99293 99298 99299 99300 99297 99302 99303 99304 99301 99306 99307 99308 99305 99310 99311 99312 99309 99314 99315 99316 99313 99318 99319 99320 99317 99322 99323 99324 99321 99326 99327 99328 99325 99330 99331 99332 99329 99334 99335 99336 99333 99338 99339 99340 99337 99342 99343 99344 99341 99346 99347 99348 99345 99350 99351 99352 99349 99354 99355 99356 99353 99358 99359 99360 99357 99362 99363 99364 99361 99366 99367 99368 99365 99370 99371 99372 99369 99374 99375 99376 99373 99378 99379 99380 99377 99382 99383 99384 99381 99386 99387 99388 99385 99390 99391 99392 99389 99394 99395 99396 99393 99398 99399 99400 99397 99402 99403 99404 99401 99406 99407 99408 99405 99410 99411 99412 99409 99414 99415 99416 99413 99418 99419 99420 99417 99422 99423 99424 99421 99426 99427 99428 99425 99430 99431 99432 99429 99434 99435 99436 99433 99438 99439 99440 99437 99442 99443 99444 99441 99446 99447 99448 99445 99450 99451 99452 99449 99454 99455 99456 99453 99458 99459 99460 99457 99462 99463 99464 99461 99466 99467 99468 99465 99470 99471 99472 99469 99474 99475 99476 99473 99478 99479 99480 99477 99482 99483 99484 99481 99486 99487 99488 99485 99490 99491 99492 99489 99494 99495 99496 99493 99498 99499 99500 99497 99502 99503 99504 99501 99506 99507 99508 99505 99510 99511 99512 99509 99514 99515 99516 99513 99518 99519 99520 99517 99522 99523 99524 99521 99526 99527 99528 99525 99530 99531 99532 99529 99534 99535 99536 99533 99538 99539 99540 99537 99542 99543 99544 99541 99546 99547 99548 99545 99550 99551 99552 99549 99554 99555 99556 99553 99558 99559 99560 99557 99562 99563 99564 99561 99566 99567 99568 99565 99570 99571 99572 99569 99574 99575 99576 99573 99578 99579 99580 99577 99582 99583 99584 99581 99586 99587 99588 99585 99590 99591 99592 99589 99594 99595 99596 99593 99598 99599 99600 99597 99602 99603 99604 99601 99606 99607 99608 99605 99610 99611 99612 99609 99614 99615 99616 99613 99618 99619 99620 99617 99622 99623 99624 99621 99626 99627 99628 99625 99630 99631 99632 99629 99634 99635 99636 99633 99638 99639 99640 99637 99642 99643 99644 99641 99646 99647 99648 99645 99650 99651 99652 99649 99654 99655 99656 99653 99658 99659 99660 99657 99662 99663 99664 99661 99666 99667 99668 99665 99670 99671 99672 99669 99674 99675 99676 99673 99678 99679 99680 99677 99682 99683 99684 99681 99686 99687 99688 99685 99690 99691 99692 99689 99694 99695 99696 99693 99698 99699 99700 99697 99702 99703 99704 99701 99706 99707 99708 99705 99710 99711 99712 99709 99714 99715 99716 99713 99718 99719 99720 99717 99722 99723 99724 99721 99726 99727 99728 99725 99730 99731 99732 99729 99734 99735 99736 99733 99738 99739 99740 99737 99742 99743 99744 99741 99746 99747 99748 99745 99750 99751 99752 99749 99754 99755 99756 99753 99758 99759 99760 99757 99762 99763 99764 99761 99766 99767 99768 99765 99770 99771 99772 99769 99774 99775 99776 99773 99778 99779 99780 99777 99782 99783 99784 99781 99786 99787 99788 99785 99790 99791 99792 99789 99794 99795 99796 99793 99798 99799 99800 99797 99802 99803 99804 99801 99806 99807 99808 99805 99810 99811 99812 99809 99814 99815 99816 99813 99818 99819 99820 99817 99822 99823 99824 99821 99826 99827 99828 99825 99830 99831 99832 99829 99834 99835 99836 99833 99838 99839 99840 99837 99842 99843 99844 99841 99846 99847 99848 99845 99850 99851 99852 99849 99854 99855 99856 99853 99858 99859 99860 99857 99862 99863 99864 99861 99866 99867 99868 99865 99870 99871 99872 99869 99874 99875 99876 99873 99878 99879 99880 99877 99882 99883 99884 99881 99886 99887 99888 99885 99890 99891 99892 99889 99894 99895 99896 99893 99898 99899 99900 99897 99902 99903 99904 99901 99906 99907 99908 99905 99910 99911 99912 99909 99914 99915 99916 99913 99918 99919 99920 99917 99922 99923 99924 99921 99926 99927 99928 99925 99930 99931 99932 99929 99934 99935 99936 99933 99938 99939 99940 99937 99942 99943 99944 99941 99946 99947 99948 99945 99950 99951 99952 99949 99954 99955 99956 99953 99958 99959 99960 99957 99962 99963 99964 99961 99966 99967 99968 99965 99970 99971 99972 99969 99974 99975 99976 99973 99978 99979 99980 99977 99982 99983 99984 99981 99986 99987 99988 99985 99990 99991 99992 99989 99994 99995 99996 99993 99998 99999 100000 99997 100002 100003 100004 100001 100006 100007 100008 100005 100010 100011 100012 100009 100014 100015 100016 100013 100018 100019 100020 100017 100022 100023 100024 100021 100026 100027 100028 100025 100030 100031 100032 100029 100034 100035 100036 100033 100038 100039 100040 100037 100042 100043 100044 100041 100046 100047 100048 100045 100050 100051 100052 100049 100054 100055 100056 100053 100058 100059 100060 100057 100062 100063 100064 100061 100066 100067 100068 100065 100070 100071 100072 100069 100074 100075 100076 100073 100078 100079 100080 100077 100082 100083 100084 100081 100086 100087 100088 100085 100090 100091 100092 100089 100094 100095 100096 100093 100098 100099 100100 100097 100102 100103 100104 100101 100106 100107 100108 100105 100110 100111 100112 100109 100114 100115 100116 100113 100118 100119 100120 100117 100122 100123 100124 100121 100126 100127 100128 100125 100130 100131 100132 100129 100134 100135 100136 100133 100138 100139 100140 100137 100142 100143 100144 100141 100146 100147 100148 100145 100150 100151 100152 100149 100154 100155 100156 100153 100158 100159 100160 100157 100162 100163 100164 100161 100166 100167 100168 100165 100170 100171 100172 100169 100174 100175 100176 100173 100178 100179 100180 100177 100182 100183 100184 100181 100186 100187 100188 100185 100190 100191 100192 100189 100194 100195 100196 100193 100198 100199 100200 100197 100202 100203 100204 100201 100206 100207 100208 100205 100210 100211 100212 100209 100214 100215 100216 100213 100218 100219 100220 100217 100222 100223 100224 100221 100226 100227 100228 100225 100230 100231 100232 100229 100234 100235 100236 100233 100238 100239 100240 100237 100242 100243 100244 100241 100246 100247 100248 100245 100250 100251 100252 100249 100254 100255 100256 100253 100258 100259 100260 100257 100262 100263 100264 100261 100266 100267 100268 100265 100270 100271 100272 100269 100274 100275 100276 100273 100278 100279 100280 100277 100282 100283 100284 100281 100286 100287 100288 100285 100290 100291 100292 100289 100294 100295 100296 100293 100298 100299 100300 100297 100302 100303 100304 100301 100306 100307 100308 100305 100310 100311 100312 100309 100314 100315 100316 100313 100318 100319 100320 100317 100322 100323 100324 100321 100326 100327 100328 100325 100330 100331 100332 100329 100334 100335 100336 100333 100338 100339 100340 100337 100342 100343 100344 100341 100346 100347 100348 100345 100350 100351 100352 100349 100354 100355 100356 100353 100358 100359 100360 100357 100362 100363 100364 100361 100366 100367 100368 100365 100370 100371 100372 100369 100374 100375 100376 100373 100378 100379 100380 100377 100382 100383 100384 100381 100386 100387 100388 100385 100390 100391 100392 100389 100394 100395 100396 100393 100398 100399 100400 100397 100402 100403 100404 100401 100406 100407 100408 100405 100410 100411 100412 100409 100414 100415 100416 100413 100418 100419 100420 100417 100422 100423 100424 100421 100426 100427 100428 100425 100430 100431 100432 100429 100434 100435 100436 100433 100438 100439 100440 100437 100442 100443 100444 100441 100446 100447 100448 100445 100450 100451 100452 100449 100454 100455 100456 100453 100458 100459 100460 100457 100462 100463 100464 100461 100466 100467 100468 100465 100470 100471 100472 100469 100474 100475 100476 100473 100478 100479 100480 100477 100482 100483 100484 100481 100486 100487 100488 100485 100490 100491 100492 100489 100494 100495 100496 100493 100498 100499 100500 100497 100502 100503 100504 100501 100506 100507 100508 100505 100510 100511 100512 100509 100514 100515 100516 100513 100518 100519 100520 100517 100522 100523 100524 100521 100526 100527 100528 100525 100530 100531 100532 100529 100534 100535 100536 100533 100538 100539 100540 100537 100542 100543 100544 100541 100546 100547 100548 100545 100550 100551 100552 100549 100554 100555 100556 100553 100558 100559 100560 100557 100562 100563 100564 100561 100566 100567 100568 100565 100570 100571 100572 100569 100574 100575 100576 100573 100578 100579 100580 100577 100582 100583 100584 100581 100586 100587 100588 100585 100590 100591 100592 100589 100594 100595 100596 100593 100598 100599 100600 100597 100602 100603 100604 100601 100606 100607 100608 100605 100610 100611 100612 100609 100614 100615 100616 100613 100618 100619 100620 100617 100622 100623 100624 100621 100626 100627 100628 100625 100630 100631 100632 100629 100634 100635 100636 100633 100638 100639 100640 100637 100642 100643 100644 100641 100646 100647 100648 100645 100650 100651 100652 100649 100654 100655 100656 100653 100658 100659 100660 100657 100662 100663 100664 100661 100666 100667 100668 100665 100670 100671 100672 100669 100674 100675 100676 100673 100678 100679 100680 100677 100682 100683 100684 100681 100686 100687 100688 100685 100690 100691 100692 100689 100694 100695 100696 100693 100698 100699 100700 100697 100702 100703 100704 100701 100706 100707 100708 100705 100710 100711 100712 100709 100714 100715 100716 100713 100718 100719 100720 100717 100722 100723 100724 100721 100726 100727 100728 100725 100730 100731 100732 100729 100734 100735 100736 100733 100738 100739 100740 100737 100742 100743 100744 100741 100746 100747 100748 100745 100750 100751 100752 100749 100754 100755 100756 100753 100758 100759 100760 100757 100762 100763 100764 100761 100766 100767 100768 100765 100770 100771 100772 100769 100774 100775 100776 100773 100778 100779 100780 100777 100782 100783 100784 100781 100786 100787 100788 100785 100790 100791 100792 100789 100794 100795 100796 100793 100798 100799 100800 100797 100802 100803 100804 100801 100806 100807 100808 100805 100810 100811 100812 100809 100814 100815 100816 100813 100818 100819 100820 100817 100822 100823 100824 100821 100826 100827 100828 100825 100830 100831 100832 100829 100834 100835 100836 100833 100838 100839 100840 100837 100842 100843 100844 100841 100846 100847 100848 100845 100850 100851 100852 100849 100854 100855 100856 100853 100858 100859 100860 100857 100862 100863 100864 100861 100866 100867 100868 100865 100870 100871 100872 100869 100874 100875 100876 100873 100878 100879 100880 100877 100882 100883 100884 100881 100886 100887 100888 100885 100890 100891 100892 100889 100894 100895 100896 100893 100898 100899 100900 100897 100902 100903 100904 100901 100906 100907 100908 100905 100910 100911 100912 100909 100914 100915 100916 100913 100918 100919 100920 100917 100922 100923 100924 100921 100926 100927 100928 100925 100930 100931 100932 100929 100934 100935 100936 100933 100938 100939 100940 100937 100942 100943 100944 100941 100946 100947 100948 100945 100950 100951 100952 100949 100954 100955 100956 100953 100958 100959 100960 100957 100962 100963 100964 100961 100966 100967 100968 100965 100970 100971 100972 100969 100974 100975 100976 100973 100978 100979 100980 100977 100982 100983 100984 100981 100986 100987 100988 100985 100990 100991 100992 100989 100994 100995 100996 100993 100998 100999 101000 100997 101002 101003 101004 101001 101006 101007 101008 101005 101010 101011 101012 101009 101014 101015 101016 101013 101018 101019 101020 101017 101022 101023 101024 101021 101026 101027 101028 101025 101030 101031 101032 101029 101034 101035 101036 101033 101038 101039 101040 101037 101042 101043 101044 101041 101046 101047 101048 101045 101050 101051 101052 101049 101054 101055 101056 101053 101058 101059 101060 101057 101062 101063 101064 101061 101066 101067 101068 101065 101070 101071 101072 101069 101074 101075 101076 101073 101078 101079 101080 101077 101082 101083 101084 101081 101086 101087 101088 101085 101090 101091 101092 101089 101094 101095 101096 101093 101098 101099 101100 101097 101102 101103 101104 101101 101106 101107 101108 101105 101110 101111 101112 101109 101114 101115 101116 101113 101118 101119 101120 101117 101122 101123 101124 101121 101126 101127 101128 101125 101130 101131 101132 101129 101134 101135 101136 101133 101138 101139 101140 101137 101142 101143 101144 101141 101146 101147 101148 101145 101150 101151 101152 101149 101154 101155 101156 101153 101158 101159 101160 101157 101162 101163 101164 101161 101166 101167 101168 101165 101170 101171 101172 101169 101174 101175 101176 101173 101178 101179 101180 101177 101182 101183 101184 101181 101186 101187 101188 101185 101190 101191 101192 101189 101194 101195 101196 101193 101198 101199 101200 101197 101202 101203 101204 101201 101206 101207 101208 101205 101210 101211 101212 101209 101214 101215 101216 101213 101218 101219 101220 101217 101222 101223 101224 101221 101226 101227 101228 101225 101230 101231 101232 101229 101234 101235 101236 101233 101238 101239 101240 101237 101242 101243 101244 101241 101246 101247 101248 101245 101250 101251 101252 101249 101254 101255 101256 101253 101258 101259 101260 101257 101262 101263 101264 101261 101266 101267 101268 101265 101270 101271 101272 101269 101274 101275 101276 101273 101278 101279 101280 101277 101282 101283 101284 101281 101286 101287 101288 101285 101290 101291 101292 101289 101294 101295 101296 101293 101298 101299 101300 101297 101302 101303 101304 101301 101306 101307 101308 101305 101310 101311 101312 101309 101314 101315 101316 101313 101318 101319 101320 101317 101322 101323 101324 101321 101326 101327 101328 101325 101330 101331 101332 101329 101334 101335 101336 101333 101338 101339 101340 101337 101342 101343 101344 101341 101346 101347 101348 101345 101350 101351 101352 101349 101354 101355 101356 101353 101358 101359 101360 101357 101362 101363 101364 101361 101366 101367 101368 101365 101370 101371 101372 101369 101374 101375 101376 101373 101378 101379 101380 101377 101382 101383 101384 101381 101386 101387 101388 101385 101390 101391 101392 101389 101394 101395 101396 101393 101398 101399 101400 101397 101402 101403 101404 101401 101406 101407 101408 101405 101410 101411 101412 101409 101414 101415 101416 101413 101418 101419 101420 101417 101422 101423 101424 101421 101426 101427 101428 101425 101430 101431 101432 101429 101434 101435 101436 101433 101438 101439 101440 101437 101442 101443 101444 101441 101446 101447 101448 101445 101450 101451 101452 101449 101454 101455 101456 101453 101458 101459 101460 101457 101462 101463 101464 101461 101466 101467 101468 101465 101470 101471 101472 101469 101474 101475 101476 101473 101478 101479 101480 101477 101482 101483 101484 101481 101486 101487 101488 101485 101490 101491 101492 101489 101494 101495 101496 101493 101498 101499 101500 101497 101502 101503 101504 101501 101506 101507 101508 101505 101510 101511 101512 101509 101514 101515 101516 101513 101518 101519 101520 101517 101522 101523 101524 101521 101526 101527 101528 101525 101530 101531 101532 101529 101534 101535 101536 101533 101538 101539 101540 101537 101542 101543 101544 101541 101546 101547 101548 101545 101550 101551 101552 101549 101554 101555 101556 101553 101558 101559 101560 101557 101562 101563 101564 101561 101566 101567 101568 101565 101570 101571 101572 101569 101574 101575 101576 101573 101578 101579 101580 101577 101582 101583 101584 101581 101586 101587 101588 101585 101590 101591 101592 101589 101594 101595 101596 101593 101598 101599 101600 101597 101602 101603 101604 101601 101606 101607 101608 101605 101610 101611 101612 101609 101614 101615 101616 101613 101618 101619 101620 101617 101622 101623 101624 101621 101626 101627 101628 101625 101630 101631 101632 101629 101634 101635 101636 101633 101638 101639 101640 101637 101642 101643 101644 101641 101646 101647 101648 101645 101650 101651 101652 101649 101654 101655 101656 101653 101658 101659 101660 101657 101662 101663 101664 101661 101666 101667 101668 101665 101670 101671 101672 101669 101674 101675 101676 101673 101678 101679 101680 101677 101682 101683 101684 101681 101686 101687 101688 101685 101690 101691 101692 101689 101694 101695 101696 101693 101698 101699 101700 101697 101702 101703 101704 101701 101706 101707 101708 101705 101710 101711 101712 101709 101714 101715 101716 101713 101718 101719 101720 101717 101722 101723 101724 101721 101726 101727 101728 101725 101730 101731 101732 101729 101734 101735 101736 101733 101738 101739 101740 101737 101742 101743 101744 101741 101746 101747 101748 101745 101750 101751 101752 101749 101754 101755 101756 101753 101758 101759 101760 101757 101762 101763 101764 101761 101766 101767 101768 101765 101770 101771 101772 101769 101774 101775 101776 101773 101778 101779 101780 101777 101782 101783 101784 101781 101786 101787 101788 101785 101790 101791 101792 101789 101794 101795 101796 101793 101798 101799 101800 101797 101802 101803 101804 101801 101806 101807 101808 101805 101810 101811 101812 101809 101814 101815 101816 101813 101818 101819 101820 101817 101822 101823 101824 101821 101826 101827 101828 101825 101830 101831 101832 101829 101834 101835 101836 101833 101838 101839 101840 101837 101842 101843 101844 101841 101846 101847 101848 101845 101850 101851 101852 101849 101854 101855 101856 101853 101858 101859 101860 101857 101862 101863 101864 101861 101866 101867 101868 101865 101870 101871 101872 101869 101874 101875 101876 101873 101878 101879 101880 101877 101882 101883 101884 101881 101886 101887 101888 101885 101890 101891 101892 101889 101894 101895 101896 101893 101898 101899 101900 101897 101902 101903 101904 101901 101906 101907 101908 101905 101910 101911 101912 101909 101914 101915 101916 101913 101918 101919 101920 101917 101922 101923 101924 101921 101926 101927 101928 101925 101930 101931 101932 101929 101934 101935 101936 101933 101938 101939 101940 101937 101942 101943 101944 101941 101946 101947 101948 101945 101950 101951 101952 101949 101954 101955 101956 101953 101958 101959 101960 101957 101962 101963 101964 101961 101966 101967 101968 101965 101970 101971 101972 101969 101974 101975 101976 101973 101978 101979 101980 101977 101982 101983 101984 101981 101986 101987 101988 101985 101990 101991 101992 101989 101994 101995 101996 101993 101998 101999 102000 101997 102002 102003 102004 102001 102006 102007 102008 102005 102010 102011 102012 102009 102014 102015 102016 102013 102018 102019 102020 102017 102022 102023 102024 102021 102026 102027 102028 102025 102030 102031 102032 102029 102034 102035 102036 102033 102038 102039 102040 102037 102042 102043 102044 102041 102046 102047 102048 102045 102050 102051 102052 102049 102054 102055 102056 102053 102058 102059 102060 102057 102062 102063 102064 102061 102066 102067 102068 102065 102070 102071 102072 102069 102074 102075 102076 102073 102078 102079 102080 102077 102082 102083 102084 102081 102086 102087 102088 102085 102090 102091 102092 102089 102094 102095 102096 102093 102098 102099 102100 102097 102102 102103 102104 102101 102106 102107 102108 102105 102110 102111 102112 102109 102114 102115 102116 102113 102118 102119 102120 102117 102122 102123 102124 102121 102126 102127 102128 102125 102130 102131 102132 102129 102134 102135 102136 102133 102138 102139 102140 102137 102142 102143 102144 102141 102146 102147 102148 102145 102150 102151 102152 102149 102154 102155 102156 102153 102158 102159 102160 102157 102162 102163 102164 102161 102166 102167 102168 102165 102170 102171 102172 102169 102174 102175 102176 102173 102178 102179 102180 102177 102182 102183 102184 102181 102186 102187 102188 102185 102190 102191 102192 102189 102194 102195 102196 102193 102198 102199 102200 102197 102202 102203 102204 102201 102206 102207 102208 102205 102210 102211 102212 102209 102214 102215 102216 102213 102218 102219 102220 102217 102222 102223 102224 102221 102226 102227 102228 102225 102230 102231 102232 102229 102234 102235 102236 102233 102238 102239 102240 102237 102242 102243 102244 102241 102246 102247 102248 102245 102250 102251 102252 102249 102254 102255 102256 102253 102258 102259 102260 102257 102262 102263 102264 102261 102266 102267 102268 102265 102270 102271 102272 102269 102274 102275 102276 102273 102278 102279 102280 102277 102282 102283 102284 102281 102286 102287 102288 102285 102290 102291 102292 102289 102294 102295 102296 102293 102298 102299 102300 102297 102302 102303 102304 102301 102306 102307 102308 102305 102310 102311 102312 102309 102314 102315 102316 102313 102318 102319 102320 102317 102322 102323 102324 102321 102326 102327 102328 102325 102330 102331 102332 102329 102334 102335 102336 102333 102338 102339 102340 102337 102342 102343 102344 102341 102346 102347 102348 102345 102350 102351 102352 102349 102354 102355 102356 102353 102358 102359 102360 102357 102362 102363 102364 102361 102366 102367 102368 102365 102370 102371 102372 102369 102374 102375 102376 102373 102378 102379 102380 102377 102382 102383 102384 102381 102386 102387 102388 102385 102390 102391 102392 102389 102394 102395 102396 102393 102398 102399 102400 102397 102402 102403 102404 102401 102406 102407 102408 102405 102410 102411 102412 102409 102414 102415 102416 102413 102418 102419 102420 102417 102422 102423 102424 102421 102426 102427 102428 102425 102430 102431 102432 102429 102434 102435 102436 102433 102438 102439 102440 102437 102442 102443 102444 102441 102446 102447 102448 102445 102450 102451 102452 102449 102454 102455 102456 102453 102458 102459 102460 102457 102462 102463 102464 102461 102466 102467 102468 102465 102470 102471 102472 102469 102474 102475 102476 102473 102478 102479 102480 102477 102482 102483 102484 102481 102486 102487 102488 102485 102490 102491 102492 102489 102494 102495 102496 102493 102498 102499 102500 102497 102502 102503 102504 102501 102506 102507 102508 102505 102510 102511 102512 102509 102514 102515 102516 102513 102518 102519 102520 102517 102522 102523 102524 102521 102526 102527 102528 102525 102530 102531 102532 102529 102534 102535 102536 102533 102538 102539 102540 102537 102542 102543 102544 102541 102546 102547 102548 102545 102550 102551 102552 102549 102554 102555 102556 102553 102558 102559 102560 102557 102562 102563 102564 102561 102566 102567 102568 102565 102570 102571 102572 102569 102574 102575 102576 102573 102578 102579 102580 102577 102582 102583 102584 102581 102586 102587 102588 102585 102590 102591 102592 102589 102594 102595 102596 102593 102598 102599 102600 102597 102602 102603 102604 102601 102606 102607 102608 102605 102610 102611 102612 102609 102614 102615 102616 102613 102618 102619 102620 102617 102622 102623 102624 102621 102626 102627 102628 102625 102630 102631 102632 102629 102634 102635 102636 102633 102638 102639 102640 102637 102642 102643 102644 102641 102646 102647 102648 102645 102650 102651 102652 102649 102654 102655 102656 102653 102658 102659 102660 102657 102662 102663 102664 102661 102666 102667 102668 102665 102670 102671 102672 102669 102674 102675 102676 102673 102678 102679 102680 102677 102682 102683 102684 102681 102686 102687 102688 102685 102690 102691 102692 102689 102694 102695 102696 102693 102698 102699 102700 102697 102702 102703 102704 102701 102706 102707 102708 102705 102710 102711 102712 102709 102714 102715 102716 102713 102718 102719 102720 102717 102722 102723 102724 102721 102726 102727 102728 102725 102730 102731 102732 102729 102734 102735 102736 102733 102738 102739 102740 102737 102742 102743 102744 102741 102746 102747 102748 102745 102750 102751 102752 102749 102754 102755 102756 102753 102758 102759 102760 102757 102762 102763 102764 102761 102766 102767 102768 102765 102770 102771 102772 102769 102774 102775 102776 102773 102778 102779 102780 102777 102782 102783 102784 102781 102786 102787 102788 102785 102790 102791 102792 102789 102794 102795 102796 102793 102798 102799 102800 102797 102802 102803 102804 102801 102806 102807 102808 102805 102810 102811 102812 102809 102814 102815 102816 102813 102818 102819 102820 102817 102822 102823 102824 102821 102826 102827 102828 102825 102830 102831 102832 102829 102834 102835 102836 102833 102838 102839 102840 102837 102842 102843 102844 102841 102846 102847 102848 102845 102850 102851 102852 102849 102854 102855 102856 102853 102858 102859 102860 102857 102862 102863 102864 102861 102866 102867 102868 102865 102870 102871 102872 102869 102874 102875 102876 102873 102878 102879 102880 102877 102882 102883 102884 102881 102886 102887 102888 102885 102890 102891 102892 102889 102894 102895 102896 102893 102898 102899 102900 102897 102902 102903 102904 102901 102906 102907 102908 102905 102910 102911 102912 102909 102914 102915 102916 102913 102918 102919 102920 102917 102922 102923 102924 102921 102926 102927 102928 102925 102930 102931 102932 102929 102934 102935 102936 102933 102938 102939 102940 102937 102942 102943 102944 102941 102946 102947 102948 102945 102950 102951 102952 102949 102954 102955 102956 102953 102958 102959 102960 102957 102962 102963 102964 102961 102966 102967 102968 102965 102970 102971 102972 102969 102974 102975 102976 102973 102978 102979 102980 102977 102982 102983 102984 102981 102986 102987 102988 102985 102990 102991 102992 102989 102994 102995 102996 102993 102998 102999 103000 102997 103002 103003 103004 103001 103006 103007 103008 103005 103010 103011 103012 103009 103014 103015 103016 103013 103018 103019 103020 103017 103022 103023 103024 103021 103026 103027 103028 103025 103030 103031 103032 103029 103034 103035 103036 103033 103038 103039 103040 103037 103042 103043 103044 103041 103046 103047 103048 103045 103050 103051 103052 103049 103054 103055 103056 103053 103058 103059 103060 103057 103062 103063 103064 103061 103066 103067 103068 103065 103070 103071 103072 103069 103074 103075 103076 103073 103078 103079 103080 103077 103082 103083 103084 103081 103086 103087 103088 103085 103090 103091 103092 103089 103094 103095 103096 103093 103098 103099 103100 103097 103102 103103 103104 103101 103106 103107 103108 103105 103110 103111 103112 103109 103114 103115 103116 103113 103118 103119 103120 103117 103122 103123 103124 103121 103126 103127 103128 103125 103130 103131 103132 103129 103134 103135 103136 103133 103138 103139 103140 103137 103142 103143 103144 103141 103146 103147 103148 103145 103150 103151 103152 103149 103154 103155 103156 103153 103158 103159 103160 103157 103162 103163 103164 103161 103166 103167 103168 103165 103170 103171 103172 103169 103174 103175 103176 103173 103178 103179 103180 103177 103182 103183 103184 103181 103186 103187 103188 103185 103190 103191 103192 103189 103194 103195 103196 103193 103198 103199 103200 103197 103202 103203 103204 103201 103206 103207 103208 103205 103210 103211 103212 103209 103214 103215 103216 103213 103218 103219 103220 103217 103222 103223 103224 103221 103226 103227 103228 103225 103230 103231 103232 103229 103234 103235 103236 103233 103238 103239 103240 103237 103242 103243 103244 103241 103246 103247 103248 103245 103250 103251 103252 103249 103254 103255 103256 103253 103258 103259 103260 103257 103262 103263 103264 103261 103266 103267 103268 103265 103270 103271 103272 103269 103274 103275 103276 103273 103278 103279 103280 103277 103282 103283 103284 103281 103286 103287 103288 103285 103290 103291 103292 103289 103294 103295 103296 103293 103298 103299 103300 103297 103302 103303 103304 103301 103306 103307 103308 103305 103310 103311 103312 103309 103314 103315 103316 103313 103318 103319 103320 103317 103322 103323 103324 103321 103326 103327 103328 103325 103330 103331 103332 103329 103334 103335 103336 103333 103338 103339 103340 103337 103342 103343 103344 103341 103346 103347 103348 103345 103350 103351 103352 103349 103354 103355 103356 103353 103358 103359 103360 103357 103362 103363 103364 103361 103366 103367 103368 103365 103370 103371 103372 103369 103374 103375 103376 103373 103378 103379 103380 103377 103382 103383 103384 103381 103386 103387 103388 103385 103390 103391 103392 103389 103394 103395 103396 103393 103398 103399 103400 103397 103402 103403 103404 103401 103406 103407 103408 103405 103410 103411 103412 103409 103414 103415 103416 103413 103418 103419 103420 103417 103422 103423 103424 103421 103426 103427 103428 103425 103430 103431 103432 103429 103434 103435 103436 103433 103438 103439 103440 103437 103442 103443 103444 103441 103446 103447 103448 103445 103450 103451 103452 103449 103454 103455 103456 103453 103458 103459 103460 103457 103462 103463 103464 103461 103466 103467 103468 103465 103470 103471 103472 103469 103474 103475 103476 103473 103478 103479 103480 103477 103482 103483 103484 103481 103486 103487 103488 103485 103490 103491 103492 103489 103494 103495 103496 103493 103498 103499 103500 103497 103502 103503 103504 103501 103506 103507 103508 103505 103510 103511 103512 103509 103514 103515 103516 103513 103518 103519 103520 103517 103522 103523 103524 103521 103526 103527 103528 103525 103530 103531 103532 103529 103534 103535 103536 103533 103538 103539 103540 103537 103542 103543 103544 103541 103546 103547 103548 103545 103550 103551 103552 103549 103554 103555 103556 103553 103558 103559 103560 103557 103562 103563 103564 103561 103566 103567 103568 103565 103570 103571 103572 103569 103574 103575 103576 103573 103578 103579 103580 103577 103582 103583 103584 103581 103586 103587 103588 103585 103590 103591 103592 103589 103594 103595 103596 103593 103598 103599 103600 103597 103602 103603 103604 103601 103606 103607 103608 103605 103610 103611 103612 103609 103614 103615 103616 103613 103618 103619 103620 103617 103622 103623 103624 103621 103626 103627 103628 103625 103630 103631 103632 103629 103634 103635 103636 103633 103638 103639 103640 103637 103642 103643 103644 103641 103646 103647 103648 103645 103650 103651 103652 103649 103654 103655 103656 103653 103658 103659 103660 103657 103662 103663 103664 103661 103666 103667 103668 103665 103670 103671 103672 103669 103674 103675 103676 103673 103678 103679 103680 103677 103682 103683 103684 103681 103686 103687 103688 103685 103690 103691 103692 103689 103694 103695 103696 103693 103698 103699 103700 103697 103702 103703 103704 103701 103706 103707 103708 103705 103710 103711 103712 103709 103714 103715 103716 103713 103718 103719 103720 103717 103722 103723 103724 103721 103726 103727 103728 103725 103730 103731 103732 103729 103734 103735 103736 103733 103738 103739 103740 103737 103742 103743 103744 103741 103746 103747 103748 103745 103750 103751 103752 103749 103754 103755 103756 103753 103758 103759 103760 103757 103762 103763 103764 103761 103766 103767 103768 103765 103770 103771 103772 103769 103774 103775 103776 103773 103778 103779 103780 103777 103782 103783 103784 103781 103786 103787 103788 103785 103790 103791 103792 103789 103794 103795 103796 103793 103798 103799 103800 103797 103802 103803 103804 103801 103806 103807 103808 103805 103810 103811 103812 103809 103814 103815 103816 103813 103818 103819 103820 103817 103822 103823 103824 103821 103826 103827 103828 103825 103830 103831 103832 103829 103834 103835 103836 103833 103838 103839 103840 103837 103842 103843 103844 103841 103846 103847 103848 103845 103850 103851 103852 103849 103854 103855 103856 103853 103858 103859 103860 103857 103862 103863 103864 103861 103866 103867 103868 103865 103870 103871 103872 103869 103874 103875 103876 103873 103878 103879 103880 103877 103882 103883 103884 103881 103886 103887 103888 103885 103890 103891 103892 103889 103894 103895 103896 103893 103898 103899 103900 103897 103902 103903 103904 103901 103906 103907 103908 103905 103910 103911 103912 103909 103914 103915 103916 103913 103918 103919 103920 103917 103922 103923 103924 103921 103926 103927 103928 103925 103930 103931 103932 103929 103934 103935 103936 103933 103938 103939 103940 103937 103942 103943 103944 103941 103946 103947 103948 103945 103950 103951 103952 103949 103954 103955 103956 103953 103958 103959 103960 103957 103962 103963 103964 103961 103966 103967 103968 103965 103970 103971 103972 103969 103974 103975 103976 103973 103978 103979 103980 103977 103982 103983 103984 103981 103986 103987 103988 103985 103990 103991 103992 103989 103994 103995 103996 103993 103998 103999 104000 103997 104002 104003 104004 104001 104006 104007 104008 104005 104010 104011 104012 104009 104014 104015 104016 104013 104018 104019 104020 104017 104022 104023 104024 104021 104026 104027 104028 104025 104030 104031 104032 104029 104034 104035 104036 104033 104038 104039 104040 104037 104042 104043 104044 104041 104046 104047 104048 104045 104050 104051 104052 104049 104054 104055 104056 104053 104058 104059 104060 104057 104062 104063 104064 104061 104066 104067 104068 104065 104070 104071 104072 104069 104074 104075 104076 104073 104078 104079 104080 104077 104082 104083 104084 104081 104086 104087 104088 104085 104090 104091 104092 104089 104094 104095 104096 104093 104098 104099 104100 104097 104102 104103 104104 104101 104106 104107 104108 104105 104110 104111 104112 104109 104114 104115 104116 104113 104118 104119 104120 104117 104122 104123 104124 104121 104126 104127 104128 104125 104130 104131 104132 104129 104134 104135 104136 104133 104138 104139 104140 104137 104142 104143 104144 104141 104146 104147 104148 104145 104150 104151 104152 104149 104154 104155 104156 104153 104158 104159 104160 104157 104162 104163 104164 104161 104166 104167 104168 104165 104170 104171 104172 104169 104174 104175 104176 104173 104178 104179 104180 104177 104182 104183 104184 104181 104186 104187 104188 104185 104190 104191 104192 104189 104194 104195 104196 104193 104198 104199 104200 104197 104202 104203 104204 104201 104206 104207 104208 104205 104210 104211 104212 104209 104214 104215 104216 104213 104218 104219 104220 104217 104222 104223 104224 104221 104226 104227 104228 104225 104230 104231 104232 104229 104234 104235 104236 104233 104238 104239 104240 104237 104242 104243 104244 104241 104246 104247 104248 104245 104250 104251 104252 104249 104254 104255 104256 104253 104258 104259 104260 104257 104262 104263 104264 104261 104266 104267 104268 104265 104270 104271 104272 104269 104274 104275 104276 104273 104278 104279 104280 104277 104282 104283 104284 104281 104286 104287 104288 104285 104290 104291 104292 104289 104294 104295 104296 104293 104298 104299 104300 104297 104302 104303 104304 104301 104306 104307 104308 104305 104310 104311 104312 104309 104314 104315 104316 104313 104318 104319 104320 104317 104322 104323 104324 104321 104326 104327 104328 104325 104330 104331 104332 104329 104334 104335 104336 104333 104338 104339 104340 104337 104342 104343 104344 104341 104346 104347 104348 104345 104350 104351 104352 104349 104354 104355 104356 104353 104358 104359 104360 104357 104362 104363 104364 104361 104366 104367 104368 104365 104370 104371 104372 104369 104374 104375 104376 104373 104378 104379 104380 104377 104382 104383 104384 104381 104386 104387 104388 104385 104390 104391 104392 104389 104394 104395 104396 104393 104398 104399 104400 104397 104402 104403 104404 104401 104406 104407 104408 104405 104410 104411 104412 104409 104414 104415 104416 104413 104418 104419 104420 104417 104422 104423 104424 104421 104426 104427 104428 104425 104430 104431 104432 104429 104434 104435 104436 104433 104438 104439 104440 104437 104442 104443 104444 104441 104446 104447 104448 104445 104450 104451 104452 104449 104454 104455 104456 104453 104458 104459 104460 104457 104462 104463 104464 104461 104466 104467 104468 104465 104470 104471 104472 104469 104474 104475 104476 104473 104478 104479 104480 104477 104482 104483 104484 104481 104486 104487 104488 104485 104490 104491 104492 104489 104494 104495 104496 104493 104498 104499 104500 104497 104502 104503 104504 104501 104506 104507 104508 104505 104510 104511 104512 104509 104514 104515 104516 104513 104518 104519 104520 104517 104522 104523 104524 104521 104526 104527 104528 104525 104530 104531 104532 104529 104534 104535 104536 104533 104538 104539 104540 104537 104542 104543 104544 104541 104546 104547 104548 104545 104550 104551 104552 104549 104554 104555 104556 104553 104558 104559 104560 104557 104562 104563 104564 104561 104566 104567 104568 104565 104570 104571 104572 104569 104574 104575 104576 104573 104578 104579 104580 104577 104582 104583 104584 104581 104586 104587 104588 104585 104590 104591 104592 104589 104594 104595 104596 104593 104598 104599 104600 104597 104602 104603 104604 104601 104606 104607 104608 104605 104610 104611 104612 104609 104614 104615 104616 104613 104618 104619 104620 104617 104622 104623 104624 104621 104626 104627 104628 104625 104630 104631 104632 104629 104634 104635 104636 104633 104638 104639 104640 104637 104642 104643 104644 104641 104646 104647 104648 104645 104650 104651 104652 104649 104654 104655 104656 104653 104658 104659 104660 104657 104662 104663 104664 104661 104666 104667 104668 104665 104670 104671 104672 104669 104674 104675 104676 104673 104678 104679 104680 104677 104682 104683 104684 104681 104686 104687 104688 104685 104690 104691 104692 104689 104694 104695 104696 104693 104698 104699 104700 104697 104702 104703 104704 104701 104706 104707 104708 104705 104710 104711 104712 104709 104714 104715 104716 104713 104718 104719 104720 104717 104722 104723 104724 104721 104726 104727 104728 104725 104730 104731 104732 104729 104734 104735 104736 104733 104738 104739 104740 104737 104742 104743 104744 104741 104746 104747 104748 104745 104750 104751 104752 104749 104754 104755 104756 104753 104758 104759 104760 104757 104762 104763 104764 104761 104766 104767 104768 104765 104770 104771 104772 104769 104774 104775 104776 104773 104778 104779 104780 104777 104782 104783 104784 104781 104786 104787 104788 104785 104790 104791 104792 104789 104794 104795 104796 104793 104798 104799 104800 104797 104802 104803 104804 104801 104806 104807 104808 104805 104810 104811 104812 104809 104814 104815 104816 104813 104818 104819 104820 104817 104822 104823 104824 104821 104826 104827 104828 104825 104830 104831 104832 104829 104834 104835 104836 104833 104838 104839 104840 104837 104842 104843 104844 104841 104846 104847 104848 104845 104850 104851 104852 104849 104854 104855 104856 104853 104858 104859 104860 104857 104862 104863 104864 104861 104866 104867 104868 104865 104870 104871 104872 104869 104874 104875 104876 104873 104878 104879 104880 104877 104882 104883 104884 104881 104886 104887 104888 104885 104890 104891 104892 104889 104894 104895 104896 104893 104898 104899 104900 104897 104902 104903 104904 104901 104906 104907 104908 104905 104910 104911 104912 104909 104914 104915 104916 104913 104918 104919 104920 104917 104922 104923 104924 104921 104926 104927 104928 104925 104930 104931 104932 104929 104934 104935 104936 104933 104938 104939 104940 104937 104942 104943 104944 104941 104946 104947 104948 104945 104950 104951 104952 104949 104954 104955 104956 104953 104958 104959 104960 104957 104962 104963 104964 104961 104966 104967 104968 104965 104970 104971 104972 104969 104974 104975 104976 104973 104978 104979 104980 104977 104982 104983 104984 104981 104986 104987 104988 104985 104990 104991 104992 104989 104994 104995 104996 104993 104998 104999 105000 104997 105002 105003 105004 105001 105006 105007 105008 105005 105010 105011 105012 105009 105014 105015 105016 105013 105018 105019 105020 105017 105022 105023 105024 105021 105026 105027 105028 105025 105030 105031 105032 105029 105034 105035 105036 105033 105038 105039 105040 105037 105042 105043 105044 105041 105046 105047 105048 105045 105050 105051 105052 105049 105054 105055 105056 105053 105058 105059 105060 105057 105062 105063 105064 105061 105066 105067 105068 105065 105070 105071 105072 105069 105074 105075 105076 105073 105078 105079 105080 105077 105082 105083 105084 105081 105086 105087 105088 105085 105090 105091 105092 105089 105094 105095 105096 105093 105098 105099 105100 105097 105102 105103 105104 105101 105106 105107 105108 105105 105110 105111 105112 105109 105114 105115 105116 105113 105118 105119 105120 105117 105122 105123 105124 105121 105126 105127 105128 105125 105130 105131 105132 105129 105134 105135 105136 105133 105138 105139 105140 105137 105142 105143 105144 105141 105146 105147 105148 105145 105150 105151 105152 105149 105154 105155 105156 105153 105158 105159 105160 105157 105162 105163 105164 105161 105166 105167 105168 105165 105170 105171 105172 105169 105174 105175 105176 105173 105178 105179 105180 105177 105182 105183 105184 105181 105186 105187 105188 105185 105190 105191 105192 105189 105194 105195 105196 105193 105198 105199 105200 105197 105202 105203 105204 105201 105206 105207 105208 105205 105210 105211 105212 105209 105214 105215 105216 105213 105218 105219 105220 105217 105222 105223 105224 105221 105226 105227 105228 105225 105230 105231 105232 105229 105234 105235 105236 105233 105238 105239 105240 105237 105242 105243 105244 105241 105246 105247 105248 105245 105250 105251 105252 105249 105254 105255 105256 105253 105258 105259 105260 105257 105262 105263 105264 105261 105266 105267 105268 105265 105270 105271 105272 105269 105274 105275 105276 105273 105278 105279 105280 105277 105282 105283 105284 105281 105286 105287 105288 105285 105290 105291 105292 105289 105294 105295 105296 105293 105298 105299 105300 105297 105302 105303 105304 105301 105306 105307 105308 105305 105310 105311 105312 105309 105314 105315 105316 105313 105318 105319 105320 105317 105322 105323 105324 105321 105326 105327 105328 105325 105330 105331 105332 105329 105334 105335 105336 105333 105338 105339 105340 105337 105342 105343 105344 105341 105346 105347 105348 105345 105350 105351 105352 105349 105354 105355 105356 105353 105358 105359 105360 105357 105362 105363 105364 105361 105366 105367 105368 105365 105370 105371 105372 105369 105374 105375 105376 105373 105378 105379 105380 105377 105382 105383 105384 105381 105386 105387 105388 105385 105390 105391 105392 105389 105394 105395 105396 105393 105398 105399 105400 105397 105402 105403 105404 105401 105406 105407 105408 105405 105410 105411 105412 105409 105414 105415 105416 105413 105418 105419 105420 105417 105422 105423 105424 105421 105426 105427 105428 105425 105430 105431 105432 105429 105434 105435 105436 105433 105438 105439 105440 105437 105442 105443 105444 105441 105446 105447 105448 105445 105450 105451 105452 105449 105454 105455 105456 105453 105458 105459 105460 105457 105462 105463 105464 105461 105466 105467 105468 105465 105470 105471 105472 105469 105474 105475 105476 105473 105478 105479 105480 105477 105482 105483 105484 105481 105486 105487 105488 105485 105490 105491 105492 105489 105494 105495 105496 105493 105498 105499 105500 105497 105502 105503 105504 105501 105506 105507 105508 105505 105510 105511 105512 105509 105514 105515 105516 105513 105518 105519 105520 105517 105522 105523 105524 105521 105526 105527 105528 105525 105530 105531 105532 105529 105534 105535 105536 105533 105538 105539 105540 105537 105542 105543 105544 105541 105546 105547 105548 105545 105550 105551 105552 105549 105554 105555 105556 105553 105558 105559 105560 105557 105562 105563 105564 105561 105566 105567 105568 105565 105570 105571 105572 105569 105574 105575 105576 105573 105578 105579 105580 105577 105582 105583 105584 105581 105586 105587 105588 105585 105590 105591 105592 105589 105594 105595 105596 105593 105598 105599 105600 105597 105602 105603 105604 105601 105606 105607 105608 105605 105610 105611 105612 105609 105614 105615 105616 105613 105618 105619 105620 105617 105622 105623 105624 105621 105626 105627 105628 105625 105630 105631 105632 105629 105634 105635 105636 105633 105638 105639 105640 105637 105642 105643 105644 105641 105646 105647 105648 105645 105650 105651 105652 105649 105654 105655 105656 105653 105658 105659 105660 105657 105662 105663 105664 105661 105666 105667 105668 105665 105670 105671 105672 105669 105674 105675 105676 105673 105678 105679 105680 105677 105682 105683 105684 105681 105686 105687 105688 105685 105690 105691 105692 105689 105694 105695 105696 105693 105698 105699 105700 105697 105702 105703 105704 105701 105706 105707 105708 105705 105710 105711 105712 105709 105714 105715 105716 105713 105718 105719 105720 105717 105722 105723 105724 105721 105726 105727 105728 105725 105730 105731 105732 105729 105734 105735 105736 105733 105738 105739 105740 105737 105742 105743 105744 105741 105746 105747 105748 105745 105750 105751 105752 105749 105754 105755 105756 105753 105758 105759 105760 105757 105762 105763 105764 105761 105766 105767 105768 105765 105770 105771 105772 105769 105774 105775 105776 105773 105778 105779 105780 105777 105782 105783 105784 105781 105786 105787 105788 105785 105790 105791 105792 105789 105794 105795 105796 105793 105798 105799 105800 105797 105802 105803 105804 105801 105806 105807 105808 105805 105810 105811 105812 105809 105814 105815 105816 105813 105818 105819 105820 105817 105822 105823 105824 105821 105826 105827 105828 105825 105830 105831 105832 105829 105834 105835 105836 105833 105838 105839 105840 105837 105842 105843 105844 105841 105846 105847 105848 105845 105850 105851 105852 105849 105854 105855 105856 105853 105858 105859 105860 105857 105862 105863 105864 105861 105866 105867 105868 105865 105870 105871 105872 105869 105874 105875 105876 105873 105878 105879 105880 105877 105882 105883 105884 105881 105886 105887 105888 105885 105890 105891 105892 105889 105894 105895 105896 105893 105898 105899 105900 105897 105902 105903 105904 105901 105906 105907 105908 105905 105910 105911 105912 105909 105914 105915 105916 105913 105918 105919 105920 105917 105922 105923 105924 105921 105926 105927 105928 105925 105930 105931 105932 105929 105934 105935 105936 105933 105938 105939 105940 105937 105942 105943 105944 105941 105946 105947 105948 105945 105950 105951 105952 105949 105954 105955 105956 105953 105958 105959 105960 105957 105962 105963 105964 105961 105966 105967 105968 105965 105970 105971 105972 105969 105974 105975 105976 105973 105978 105979 105980 105977 105982 105983 105984 105981 105986 105987 105988 105985 105990 105991 105992 105989 105994 105995 105996 105993 105998 105999 106000 105997 106002 106003 106004 106001 106006 106007 106008 106005 106010 106011 106012 106009 106014 106015 106016 106013 106018 106019 106020 106017 106022 106023 106024 106021 106026 106027 106028 106025 106030 106031 106032 106029 106034 106035 106036 106033 106038 106039 106040 106037 106042 106043 106044 106041 106046 106047 106048 106045 106050 106051 106052 106049 106054 106055 106056 106053 106058 106059 106060 106057 106062 106063 106064 106061 106066 106067 106068 106065 106070 106071 106072 106069 106074 106075 106076 106073 106078 106079 106080 106077 106082 106083 106084 106081 106086 106087 106088 106085 106090 106091 106092 106089 106094 106095 106096 106093 106098 106099 106100 106097 106102 106103 106104 106101 106106 106107 106108 106105 106110 106111 106112 106109 106114 106115 106116 106113 106118 106119 106120 106117 106122 106123 106124 106121 106126 106127 106128 106125 106130 106131 106132 106129 106134 106135 106136 106133 106138 106139 106140 106137 106142 106143 106144 106141 106146 106147 106148 106145 106150 106151 106152 106149 106154 106155 106156 106153 106158 106159 106160 106157 106162 106163 106164 106161 106166 106167 106168 106165 106170 106171 106172 106169 106174 106175 106176 106173 106178 106179 106180 106177 106182 106183 106184 106181 106186 106187 106188 106185 106190 106191 106192 106189 106194 106195 106196 106193 106198 106199 106200 106197 106202 106203 106204 106201 106206 106207 106208 106205 106210 106211 106212 106209 106214 106215 106216 106213 106218 106219 106220 106217 106222 106223 106224 106221 106226 106227 106228 106225 106230 106231 106232 106229 106234 106235 106236 106233 106238 106239 106240 106237 106242 106243 106244 106241 106246 106247 106248 106245 106250 106251 106252 106249 106254 106255 106256 106253 106258 106259 106260 106257 106262 106263 106264 106261 106266 106267 106268 106265 106270 106271 106272 106269 106274 106275 106276 106273 106278 106279 106280 106277 106282 106283 106284 106281 106286 106287 106288 106285 106290 106291 106292 106289 106294 106295 106296 106293 106298 106299 106300 106297 106302 106303 106304 106301 106306 106307 106308 106305 106310 106311 106312 106309 106314 106315 106316 106313 106318 106319 106320 106317 106322 106323 106324 106321 106326 106327 106328 106325 106330 106331 106332 106329 106334 106335 106336 106333 106338 106339 106340 106337 106342 106343 106344 106341 106346 106347 106348 106345 106350 106351 106352 106349 106354 106355 106356 106353 106358 106359 106360 106357 106362 106363 106364 106361 106366 106367 106368 106365 106370 106371 106372 106369 106374 106375 106376 106373 106378 106379 106380 106377 106382 106383 106384 106381 106386 106387 106388 106385 106390 106391 106392 106389 106394 106395 106396 106393 106398 106399 106400 106397 106402 106403 106404 106401 106406 106407 106408 106405 106410 106411 106412 106409 106414 106415 106416 106413 106418 106419 106420 106417 106422 106423 106424 106421 106426 106427 106428 106425 106430 106431 106432 106429 106434 106435 106436 106433 106438 106439 106440 106437 106442 106443 106444 106441 106446 106447 106448 106445 106450 106451 106452 106449 106454 106455 106456 106453 106458 106459 106460 106457 106462 106463 106464 106461 106466 106467 106468 106465 106470 106471 106472 106469 106474 106475 106476 106473 106478 106479 106480 106477 106482 106483 106484 106481 106486 106487 106488 106485 106490 106491 106492 106489 106494 106495 106496 106493 106498 106499 106500 106497 106502 106503 106504 106501 106506 106507 106508 106505 106510 106511 106512 106509 106514 106515 106516 106513 106518 106519 106520 106517 106522 106523 106524 106521 106526 106527 106528 106525 106530 106531 106532 106529 106534 106535 106536 106533 106538 106539 106540 106537 106542 106543 106544 106541 106546 106547 106548 106545 106550 106551 106552 106549 106554 106555 106556 106553 106558 106559 106560 106557 106562 106563 106564 106561 106566 106567 106568 106565 106570 106571 106572 106569 106574 106575 106576 106573 106578 106579 106580 106577 106582 106583 106584 106581 106586 106587 106588 106585 106590 106591 106592 106589 106594 106595 106596 106593 106598 106599 106600 106597 106602 106603 106604 106601 106606 106607 106608 106605 106610 106611 106612 106609 106614 106615 106616 106613 106618 106619 106620 106617 106622 106623 106624 106621 106626 106627 106628 106625 106630 106631 106632 106629 106634 106635 106636 106633 106638 106639 106640 106637 106642 106643 106644 106641 106646 106647 106648 106645 106650 106651 106652 106649 106654 106655 106656 106653 106658 106659 106660 106657 106662 106663 106664 106661 106666 106667 106668 106665 106670 106671 106672 106669 106674 106675 106676 106673 106678 106679 106680 106677 106682 106683 106684 106681 106686 106687 106688 106685 106690 106691 106692 106689 106694 106695 106696 106693 106698 106699 106700 106697 106702 106703 106704 106701 106706 106707 106708 106705 106710 106711 106712 106709 106714 106715 106716 106713 106718 106719 106720 106717 106722 106723 106724 106721 106726 106727 106728 106725 106730 106731 106732 106729 106734 106735 106736 106733 106738 106739 106740 106737 106742 106743 106744 106741 106746 106747 106748 106745 106750 106751 106752 106749 106754 106755 106756 106753 106758 106759 106760 106757 106762 106763 106764 106761 106766 106767 106768 106765 106770 106771 106772 106769 106774 106775 106776 106773 106778 106779 106780 106777 106782 106783 106784 106781 106786 106787 106788 106785 106790 106791 106792 106789 106794 106795 106796 106793 106798 106799 106800 106797 106802 106803 106804 106801 106806 106807 106808 106805 106810 106811 106812 106809 106814 106815 106816 106813 106818 106819 106820 106817 106822 106823 106824 106821 106826 106827 106828 106825 106830 106831 106832 106829 106834 106835 106836 106833 106838 106839 106840 106837 106842 106843 106844 106841 106846 106847 106848 106845 106850 106851 106852 106849 106854 106855 106856 106853 106858 106859 106860 106857 106862 106863 106864 106861 106866 106867 106868 106865 106870 106871 106872 106869 106874 106875 106876 106873 106878 106879 106880 106877 106882 106883 106884 106881 106886 106887 106888 106885 106890 106891 106892 106889 106894 106895 106896 106893 106898 106899 106900 106897 106902 106903 106904 106901 106906 106907 106908 106905 106910 106911 106912 106909 106914 106915 106916 106913 106918 106919 106920 106917 106922 106923 106924 106921 106926 106927 106928 106925 106930 106931 106932 106929 106934 106935 106936 106933 106938 106939 106940 106937 106942 106943 106944 106941 106946 106947 106948 106945 106950 106951 106952 106949 106954 106955 106956 106953 106958 106959 106960 106957 106962 106963 106964 106961 106966 106967 106968 106965 106970 106971 106972 106969 106974 106975 106976 106973 106978 106979 106980 106977 106982 106983 106984 106981 106986 106987 106988 106985 106990 106991 106992 106989 106994 106995 106996 106993 106998 106999 107000 106997 107002 107003 107004 107001 107006 107007 107008 107005 107010 107011 107012 107009 107014 107015 107016 107013 107018 107019 107020 107017 107022 107023 107024 107021 107026 107027 107028 107025 107030 107031 107032 107029 107034 107035 107036 107033 107038 107039 107040 107037 107042 107043 107044 107041 107046 107047 107048 107045 107050 107051 107052 107049 107054 107055 107056 107053 107058 107059 107060 107057 107062 107063 107064 107061 107066 107067 107068 107065 107070 107071 107072 107069 107074 107075 107076 107073 107078 107079 107080 107077 107082 107083 107084 107081 107086 107087 107088 107085 107090 107091 107092 107089 107094 107095 107096 107093 107098 107099 107100 107097 107102 107103 107104 107101 107106 107107 107108 107105 107110 107111 107112 107109 107114 107115 107116 107113 107118 107119 107120 107117 107122 107123 107124 107121 107126 107127 107128 107125 107130 107131 107132 107129 107134 107135 107136 107133 107138 107139 107140 107137 107142 107143 107144 107141 107146 107147 107148 107145 107150 107151 107152 107149 107154 107155 107156 107153 107158 107159 107160 107157 107162 107163 107164 107161 107166 107167 107168 107165 107170 107171 107172 107169 107174 107175 107176 107173 107178 107179 107180 107177 107182 107183 107184 107181 107186 107187 107188 107185 107190 107191 107192 107189 107194 107195 107196 107193 107198 107199 107200 107197 107202 107203 107204 107201 107206 107207 107208 107205 107210 107211 107212 107209 107214 107215 107216 107213 107218 107219 107220 107217 107222 107223 107224 107221 107226 107227 107228 107225 107230 107231 107232 107229 107234 107235 107236 107233 107238 107239 107240 107237 107242 107243 107244 107241 107246 107247 107248 107245 107250 107251 107252 107249 107254 107255 107256 107253 107258 107259 107260 107257 107262 107263 107264 107261 107266 107267 107268 107265 107270 107271 107272 107269 107274 107275 107276 107273 107278 107279 107280 107277 107282 107283 107284 107281 107286 107287 107288 107285 107290 107291 107292 107289 107294 107295 107296 107293 107298 107299 107300 107297 107302 107303 107304 107301 107306 107307 107308 107305 107310 107311 107312 107309 107314 107315 107316 107313 107318 107319 107320 107317 107322 107323 107324 107321 107326 107327 107328 107325 107330 107331 107332 107329 107334 107335 107336 107333 107338 107339 107340 107337 107342 107343 107344 107341 107346 107347 107348 107345 107350 107351 107352 107349 107354 107355 107356 107353 107358 107359 107360 107357 107362 107363 107364 107361 107366 107367 107368 107365 107370 107371 107372 107369 107374 107375 107376 107373 107378 107379 107380 107377 107382 107383 107384 107381 107386 107387 107388 107385 107390 107391 107392 107389 107394 107395 107396 107393 107398 107399 107400 107397 107402 107403 107404 107401 107406 107407 107408 107405 107410 107411 107412 107409 107414 107415 107416 107413 107418 107419 107420 107417 107422 107423 107424 107421 107426 107427 107428 107425 107430 107431 107432 107429 107434 107435 107436 107433 107438 107439 107440 107437 107442 107443 107444 107441 107446 107447 107448 107445 107450 107451 107452 107449 107454 107455 107456 107453 107458 107459 107460 107457 107462 107463 107464 107461 107466 107467 107468 107465 107470 107471 107472 107469 107474 107475 107476 107473 107478 107479 107480 107477 107482 107483 107484 107481 107486 107487 107488 107485 107490 107491 107492 107489 107494 107495 107496 107493 107498 107499 107500 107497 107502 107503 107504 107501 107506 107507 107508 107505 107510 107511 107512 107509 107514 107515 107516 107513 107518 107519 107520 107517 107522 107523 107524 107521 107526 107527 107528 107525 107530 107531 107532 107529 107534 107535 107536 107533 107538 107539 107540 107537 107542 107543 107544 107541 107546 107547 107548 107545 107550 107551 107552 107549 107554 107555 107556 107553 107558 107559 107560 107557 107562 107563 107564 107561 107566 107567 107568 107565 107570 107571 107572 107569 107574 107575 107576 107573 107578 107579 107580 107577 107582 107583 107584 107581 107586 107587 107588 107585 107590 107591 107592 107589 107594 107595 107596 107593 107598 107599 107600 107597 107602 107603 107604 107601 107606 107607 107608 107605 107610 107611 107612 107609 107614 107615 107616 107613 107618 107619 107620 107617 107622 107623 107624 107621 107626 107627 107628 107625 107630 107631 107632 107629 107634 107635 107636 107633 107638 107639 107640 107637 107642 107643 107644 107641 107646 107647 107648 107645 107650 107651 107652 107649 107654 107655 107656 107653 107658 107659 107660 107657 107662 107663 107664 107661 107666 107667 107668 107665 107670 107671 107672 107669 107674 107675 107676 107673 107678 107679 107680 107677 107682 107683 107684 107681 107686 107687 107688 107685 107690 107691 107692 107689 107694 107695 107696 107693 107698 107699 107700 107697 107702 107703 107704 107701 107706 107707 107708 107705 107710 107711 107712 107709 107714 107715 107716 107713 107718 107719 107720 107717 107722 107723 107724 107721 107726 107727 107728 107725 107730 107731 107732 107729 107734 107735 107736 107733 107738 107739 107740 107737 107742 107743 107744 107741 107746 107747 107748 107745 107750 107751 107752 107749 107754 107755 107756 107753 107758 107759 107760 107757 107762 107763 107764 107761 107766 107767 107768 107765 107770 107771 107772 107769 107774 107775 107776 107773 107778 107779 107780 107777 107782 107783 107784 107781 107786 107787 107788 107785 107790 107791 107792 107789 107794 107795 107796 107793 107798 107799 107800 107797 107802 107803 107804 107801 107806 107807 107808 107805 107810 107811 107812 107809 107814 107815 107816 107813 107818 107819 107820 107817 107822 107823 107824 107821 107826 107827 107828 107825 107830 107831 107832 107829 107834 107835 107836 107833 107838 107839 107840 107837 107842 107843 107844 107841 107846 107847 107848 107845 107850 107851 107852 107849 107854 107855 107856 107853 107858 107859 107860 107857 107862 107863 107864 107861 107866 107867 107868 107865 107870 107871 107872 107869 107874 107875 107876 107873 107878 107879 107880 107877 107882 107883 107884 107881 107886 107887 107888 107885 107890 107891 107892 107889 107894 107895 107896 107893 107898 107899 107900 107897 107902 107903 107904 107901 107906 107907 107908 107905 107910 107911 107912 107909 107914 107915 107916 107913 107918 107919 107920 107917 107922 107923 107924 107921 107926 107927 107928 107925 107930 107931 107932 107929 107934 107935 107936 107933 107938 107939 107940 107937 107942 107943 107944 107941 107946 107947 107948 107945 107950 107951 107952 107949 107954 107955 107956 107953 107958 107959 107960 107957 107962 107963 107964 107961 107966 107967 107968 107965 107970 107971 107972 107969 107974 107975 107976 107973 107978 107979 107980 107977 107982 107983 107984 107981 107986 107987 107985 107989 107990 107991 107988 107993 107994 107995 107992 107997 107998 107999 107996 108001 108002 108000 108004 108005 108006 108003 108008 108009 108007 108011 108012 108013 108010 108015 108016 108017 108014 108019 108020 108021 108018 108023 108024 108025 108022 108027 108028 108029 108026 108031 108032 108033 108030 108035 108036 108037 108034 108039 108040 108041 108038 108043 108044 108045 108042 108047 108048 108049 108046 108051 108052 108053 108050 108055 108056 108057 108054 108059 108060 108061 108058 108063 108064 108065 108062 108067 108068 108069 108066 108071 108072 108073 108070 108075 108076 108077 108074 108079 108080 108081 108078 108083 108084 108085 108082 108087 108088 108089 108086 108091 108092 108093 108090 108095 108096 108097 108094 108099 108100 108101 108098 108103 108104 108105 108102 108107 108108 108109 108106 108111 108112 108110 108114 108115 108116 108113 108118 108119 108117 108121 108122 108123 108120 108125 108126 108127 108124 108129 108130 108131 108128 108133 108134 108135 108132 108137 108138 108139 108136 108141 108142 108143 108140 108145 108146 108147 108144 108149 108150 108151 108148 108153 108154 108155 108152 108157 108158 108159 108156 108161 108162 108163 108160 108165 108166 108167 108164 108169 108170 108171 108168 108173 108174 108175 108172 108177 108178 108179 108176 108181 108182 108183 108180 108185 108186 108187 108184 108189 108190 108191 108188 108193 108194 108195 108192 108197 108198 108199 108196 108201 108202 108203 108200 108205 108206 108207 108204 108209 108210 108211 108208 108213 108214 108215 108212 108217 108218 108219 108216 108221 108222 108223 108220 108225 108226 108227 108224 108229 108230 108231 108228 108233 108234 108235 108232 108237 108238 108239 108236 108241 108242 108243 108240 108245 108246 108247 108244 108249 108250 108251 108248 108253 108254 108255 108252 108257 108258 108259 108256 108261 108262 108263 108260 108265 108266 108267 108264 108269 108270 108271 108268 108273 108274 108275 108272 108277 108278 108279 108276 108281 108282 108283 108280 108285 108286 108287 108284 108289 108290 108291 108288 108293 108294 108295 108292 108297 108298 108299 108296 108301 108302 108303 108300 108305 108306 108307 108304 108309 108310 108311 108308 108313 108314 108315 108312 108317 108318 108319 108316 108321 108322 108323 108320 108325 108326 108327 108324 108329 108330 108331 108328 108333 108334 108335 108332 108337 108338 108339 108336 108341 108342 108343 108340 108345 108346 108347 108344 108349 108350 108351 108348 108353 108354 108355 108352 108357 108358 108359 108356 108361 108362 108363 108360 108365 108366 108367 108364 108369 108370 108371 108368 108373 108374 108375 108372 108377 108378 108379 108376 108381 108382 108383 108380 108385 108386 108387 108384 108389 108390 108391 108388 108393 108394 108395 108392 108397 108398 108399 108396 108401 108402 108403 108400 108405 108406 108407 108404 108409 108410 108411 108408 108413 108414 108415 108412 108417 108418 108419 108416 108421 108422 108423 108420 108425 108426 108427 108424 108429 108430 108431 108428 108433 108434 108435 108432 108437 108438 108439 108436 108441 108442 108443 108440 108445 108446 108447 108444 108449 108450 108451 108448 108453 108454 108455 108452 108457 108458 108459 108456 108461 108462 108463 108460 108465 108466 108467 108464 108469 108470 108471 108468 108473 108474 108475 108472 108477 108478 108479 108476 108481 108482 108483 108480 108485 108486 108487 108484 108489 108490 108491 108488 108493 108494 108495 108492 108497 108498 108499 108496 108501 108502 108503 108500 108505 108506 108507 108504 108509 108510 108511 108508 108513 108514 108515 108512 108517 108518 108519 108516 108521 108522 108523 108520 108525 108526 108527 108524 108529 108530 108531 108528 108533 108534 108535 108532 108537 108538 108539 108536 108541 108542 108543 108540 108545 108546 108547 108544 108549 108550 108551 108548 108553 108554 108555 108552 108557 108558 108559 108556 108561 108562 108563 108560 108565 108566 108567 108564 108569 108570 108571 108568 108573 108574 108575 108572 108577 108578 108579 108576 108581 108582 108583 108580 108585 108586 108587 108584 108589 108590 108591 108588 108593 108594 108595 108592 108597 108598 108599 108596 108601 108602 108603 108600 108605 108606 108607 108604 108609 108610 108611 108608 108613 108614 108615 108612 108617 108618 108619 108616 108621 108622 108623 108620 108625 108626 108627 108624 108629 108630 108631 108628 108633 108634 108635 108632 108637 108638 108639 108636 108641 108642 108643 108640 108645 108646 108647 108644 108649 108650 108651 108648 108653 108654 108655 108652 108657 108658 108659 108656 108661 108662 108663 108660 108665 108666 108667 108664 108669 108670 108671 108668 108673 108674 108675 108672 108677 108678 108679 108676 108681 108682 108683 108680 108685 108686 108687 108684 108689 108690 108691 108688 108693 108694 108695 108692 108697 108698 108699 108696 108701 108702 108703 108700 108705 108706 108707 108704 108709 108710 108711 108708 108713 108714 108715 108712 108717 108718 108719 108716 108721 108722 108723 108720 108725 108726 108727 108724 108729 108730 108731 108728 108733 108734 108735 108732 108737 108738 108739 108736 108741 108742 108743 108740 108745 108746 108747 108744 108749 108750 108751 108748 108753 108754 108755 108752 108757 108758 108759 108756 108761 108762 108763 108760 108765 108766 108767 108764 108769 108770 108771 108768 108773 108774 108775 108772 108777 108778 108779 108776 108781 108782 108783 108780 108785 108786 108787 108784 108789 108790 108791 108788 108793 108794 108795 108792 108797 108798 108799 108796 108801 108802 108803 108800 108805 108806 108807 108804 108809 108810 108811 108808 108813 108814 108815 108812 108817 108818 108819 108816 108821 108822 108823 108820 108825 108826 108827 108824 108829 108830 108831 108828 108833 108834 108835 108832 108837 108838 108839 108836 108841 108842 108843 108840 108845 108846 108847 108844 108849 108850 108851 108848 108853 108854 108855 108852 108857 108858 108859 108856 108861 108862 108863 108860 108865 108866 108867 108864 108869 108870 108871 108868 108873 108874 108875 108872 108877 108878 108879 108876 108881 108882 108883 108880 108885 108886 108887 108884 108889 108890 108891 108888 108893 108894 108895 108892 108897 108898 108899 108896 108901 108902 108903 108900 108905 108906 108907 108904 108909 108910 108911 108908 108913 108914 108915 108912 108917 108918 108919 108916 108921 108922 108923 108920 108925 108926 108927 108924 108929 108930 108931 108928 108933 108934 108935 108932 108937 108938 108939 108936 108941 108942 108943 108940 108945 108946 108947 108944 108949 108950 108951 108948 108953 108954 108955 108952 108957 108958 108959 108956 108961 108962 108963 108960 108965 108966 108967 108964 108969 108970 108971 108968 108973 108974 108975 108972 108977 108978 108979 108976 108981 108982 108983 108980 108985 108986 108987 108984 108989 108990 108991 108988 108993 108994 108995 108992 108997 108998 108999 108996 109001 109002 109003 109000 109005 109006 109007 109004 109009 109010 109011 109008 109013 109014 109015 109012 109017 109018 109019 109016 109021 109022 109023 109020 109025 109026 109027 109024 109029 109030 109031 109028 109033 109034 109035 109032 109037 109038 109039 109036 109041 109042 109043 109040 109045 109046 109047 109044 109049 109050 109051 109048 109053 109054 109055 109052 109057 109058 109059 109056 109061 109062 109063 109060 109065 109066 109067 109064 109069 109070 109071 109068 109073 109074 109075 109072 109077 109078 109079 109076 109081 109082 109083 109080 109085 109086 109087 109084 109089 109090 109091 109088 109093 109094 109095 109092 109097 109098 109099 109096 109101 109102 109103 109100 109105 109106 109107 109104 109109 109110 109111 109108 109113 109114 109115 109112 109117 109118 109119 109116 109121 109122 109123 109120 109125 109126 109127 109124 109129 109130 109131 109128 109133 109134 109135 109132 109137 109138 109139 109136 109141 109142 109143 109140 109145 109146 109147 109144 109149 109150 109151 109148 109153 109154 109155 109152 109157 109158 109159 109156 109161 109162 109163 109160 109165 109166 109167 109164 109169 109170 109171 109168 109173 109174 109175 109172 109177 109178 109179 109176 109181 109182 109183 109180 109185 109186 109187 109184 109189 109190 109191 109188 109193 109194 109195 109192 109197 109198 109199 109196 109201 109202 109203 109200 109205 109206 109207 109204 109209 109210 109211 109208 109213 109214 109215 109212 109217 109218 109219 109216 109221 109222 109223 109220 109225 109226 109227 109224 109229 109230 109231 109228 109233 109234 109235 109232 109237 109238 109239 109236 109241 109242 109243 109240 109245 109246 109247 109244 109249 109250 109251 109248 109253 109254 109255 109252 109257 109258 109259 109256 109261 109262 109263 109260 109265 109266 109267 109264 109269 109270 109271 109268 109273 109274 109275 109272 109277 109278 109279 109276 109281 109282 109283 109280 109285 109286 109287 109284 109289 109290 109291 109288 109293 109294 109295 109292 109297 109298 109299 109296 109301 109302 109303 109300 109305 109306 109307 109304 109309 109310 109311 109308 109313 109314 109315 109312 109317 109318 109319 109316 109321 109322 109323 109320 109325 109326 109327 109324 109329 109330 109331 109328 109333 109334 109335 109332 109337 109338 109339 109336 109341 109342 109343 109340 109345 109346 109347 109344 109349 109350 109351 109348 109353 109354 109355 109352 109357 109358 109359 109356 109361 109362 109363 109360 109365 109366 109367 109364 109369 109370 109371 109368 109373 109374 109375 109372 109377 109378 109379 109376 109381 109382 109383 109380 109385 109386 109387 109384 109389 109390 109391 109388 109393 109394 109395 109392 109397 109398 109399 109396 109401 109402 109403 109400 109405 109406 109407 109404 109409 109410 109411 109408 109413 109414 109415 109412 109417 109418 109419 109416 109421 109422 109423 109420 109425 109426 109427 109424 109429 109430 109431 109428 109433 109434 109435 109432 109437 109438 109439 109436 109441 109442 109443 109440 109445 109446 109447 109444 109449 109450 109451 109448 109453 109454 109455 109452 109457 109458 109459 109456 109461 109462 109463 109460 109465 109466 109467 109464 109469 109470 109471 109468 109473 109474 109475 109472 109477 109478 109479 109476 109481 109482 109483 109480 109485 109486 109487 109484 109489 109490 109491 109488 109493 109494 109495 109492 109497 109498 109499 109496 109501 109502 109503 109500 109505 109506 109507 109504 109509 109510 109511 109508 109513 109514 109515 109512 109517 109518 109519 109516 109521 109522 109523 109520 109525 109526 109527 109524 109529 109530 109531 109528 109533 109534 109535 109532 109537 109538 109539 109536 109541 109542 109543 109540 109545 109546 109547 109544 109549 109550 109551 109548 109553 109554 109555 109552 109557 109558 109559 109556 109561 109562 109563 109560 109565 109566 109567 109564 109569 109570 109571 109568 109573 109574 109575 109572 109577 109578 109579 109576 109581 109582 109583 109580 109585 109586 109587 109584 109589 109590 109591 109588 109593 109594 109595 109592 109597 109598 109599 109596 109601 109602 109603 109600 109605 109606 109607 109604 109609 109610 109611 109608 109613 109614 109615 109612 109617 109618 109619 109616 109621 109622 109623 109620 109625 109626 109627 109624 109629 109630 109631 109628 109633 109634 109635 109632 109637 109638 109639 109636 109641 109642 109643 109640 109645 109646 109647 109644 109649 109650 109651 109648 109653 109654 109655 109652 109657 109658 109659 109656 109661 109662 109663 109660 109665 109666 109667 109664 109669 109670 109671 109668 109673 109674 109675 109672 109677 109678 109679 109676 109681 109682 109683 109680 109685 109686 109687 109684 109689 109690 109691 109688 109693 109694 109695 109692 109697 109698 109699 109696 109701 109702 109703 109700 109705 109706 109707 109704 109709 109710 109711 109708 109713 109714 109715 109712 109717 109718 109719 109716 109721 109722 109723 109720 109725 109726 109727 109724 109729 109730 109731 109728 109733 109734 109735 109732 109737 109738 109739 109736 109741 109742 109743 109740 109745 109746 109747 109744 109749 109750 109751 109748 109753 109754 109755 109752 109757 109758 109759 109756 109761 109762 109763 109760 109765 109766 109767 109764 109769 109770 109771 109768 109773 109774 109775 109772 109777 109778 109779 109776 109781 109782 109783 109780 109785 109786 109787 109784 109789 109790 109791 109788 109793 109794 109795 109792 109797 109798 109799 109796 109801 109802 109803 109800 109805 109806 109807 109804 109809 109810 109811 109808 109813 109814 109815 109812 109817 109818 109819 109816 109821 109822 109823 109820 109825 109826 109827 109824 109829 109830 109831 109828 109833 109834 109835 109832 109837 109838 109839 109836 109841 109842 109843 109840 109845 109846 109847 109844 109849 109850 109851 109848 109853 109854 109855 109852 109857 109858 109859 109856 109861 109862 109863 109860 109865 109866 109867 109864 109869 109870 109871 109868 109873 109874 109875 109872 109877 109878 109879 109876 109881 109882 109883 109880 109885 109886 109887 109884 109889 109890 109891 109888 109893 109894 109895 109892 109897 109898 109899 109896 109901 109902 109903 109900 109905 109906 109907 109904 109909 109910 109911 109908 109913 109914 109915 109912 109917 109918 109919 109916 109921 109922 109923 109920 109925 109926 109927 109924 109929 109930 109931 109928 109933 109934 109935 109932 109937 109938 109939 109936 109941 109942 109943 109940 109945 109946 109947 109944 109949 109950 109951 109948 109953 109954 109955 109952 109957 109958 109959 109956 109961 109962 109963 109960 109965 109966 109967 109964 109969 109970 109971 109968 109973 109974 109975 109972 109977 109978 109979 109976 109981 109982 109983 109980 109985 109986 109987 109984 109989 109990 109991 109988 109993 109994 109995 109992 109997 109998 109999 109996 110001 110002 110003 110000 110005 110006 110007 110004 110009 110010 110011 110008 110013 110014 110015 110012 110017 110018 110019 110016 110021 110022 110023 110020 110025 110026 110027 110024 110029 110030 110031 110028 110033 110034 110035 110032 110037 110038 110039 110036 110041 110042 110043 110040 110045 110046 110047 110044 110049 110050 110051 110048 110053 110054 110055 110052 110057 110058 110059 110056 110061 110062 110063 110060 110065 110066 110067 110064 110069 110070 110071 110068 110073 110074 110075 110072 110077 110078 110079 110076 110081 110082 110083 110080 110085 110086 110087 110084 110089 110090 110091 110088 110093 110094 110095 110092 110097 110098 110099 110096 110101 110102 110103 110100 110105 110106 110107 110104 110109 110110 110111 110108 110113 110114 110115 110112 110117 110118 110119 110116 110121 110122 110123 110120 110125 110126 110127 110124 110129 110130 110131 110128 110133 110134 110135 110132 110137 110138 110139 110136 110141 110142 110143 110140 110145 110146 110147 110144 110149 110150 110151 110148 110153 110154 110155 110152 110157 110158 110159 110156 110161 110162 110163 110160 110165 110166 110167 110164 110169 110170 110171 110168 110173 110174 110175 110172 110177 110178 110179 110176 110181 110182 110183 110180 110185 110186 110187 110184 110189 110190 110191 110188 110193 110194 110195 110192 110197 110198 110199 110196 110201 110202 110203 110200 110205 110206 110207 110204 110209 110210 110211 110208 110213 110214 110215 110212 110217 110218 110219 110216 110221 110222 110223 110220 110225 110226 110227 110224 110229 110230 110231 110228 110233 110234 110235 110232 110237 110238 110239 110236 110241 110242 110243 110240 110245 110246 110247 110244 110249 110250 110251 110248 110253 110254 110255 110252 110257 110258 110259 110256 110261 110262 110263 110260 110265 110266 110267 110264 110269 110270 110271 110268 110273 110274 110275 110272 110277 110278 110279 110276 110281 110282 110283 110280 110285 110286 110287 110284 110289 110290 110291 110288 110293 110294 110295 110292 110297 110298 110299 110296 110301 110302 110303 110300 110305 110306 110307 110304 110309 110310 110311 110308 110313 110314 110315 110312 110317 110318 110319 110316 110321 110322 110323 110320 110325 110326 110327 110324 110329 110330 110331 110328 110333 110334 110335 110332 110337 110338 110339 110336 110341 110342 110343 110340 110345 110346 110347 110344 110349 110350 110351 110348 110353 110354 110355 110352 110357 110358 110359 110356 110361 110362 110363 110360 110365 110366 110367 110364 110369 110370 110371 110368 110373 110374 110375 110372 110377 110378 110379 110376 110381 110382 110383 110380 110385 110386 110387 110384 110389 110390 110391 110388 110393 110394 110395 110392 110397 110398 110399 110396 110401 110402 110403 110400 110405 110406 110407 110404 110409 110410 110411 110408 110413 110414 110415 110412 110417 110418 110419 110416 110421 110422 110423 110420 110425 110426 110427 110424 110429 110430 110431 110428 110433 110434 110435 110432 110437 110438 110439 110436 110441 110442 110443 110440 110445 110446 110447 110444 110449 110450 110451 110448 110453 110454 110455 110452 110457 110458 110459 110456 110461 110462 110463 110460 110465 110466 110467 110464 110469 110470 110471 110468 110473 110474 110475 110472 110477 110478 110479 110476 110481 110482 110483 110480 110485 110486 110487 110484 110489 110490 110491 110488 110493 110494 110495 110492 110497 110498 110499 110496 110501 110502 110503 110500 110505 110506 110507 110504 110509 110510 110511 110508 110513 110514 110515 110512 110517 110518 110519 110516 110521 110522 110523 110520 110525 110526 110527 110524 110529 110530 110531 110528 110533 110534 110535 110532 110537 110538 110539 110536 110541 110542 110543 110540 110545 110546 110547 110544 110549 110550 110551 110548 110553 110554 110555 110552 110557 110558 110559 110556 110561 110562 110563 110560 110565 110566 110567 110564 110569 110570 110571 110568 110573 110574 110575 110572 110577 110578 110579 110576 110581 110582 110583 110580 110585 110586 110587 110584 110589 110590 110591 110588 110593 110594 110595 110592 110597 110598 110599 110596 110601 110602 110603 110600 110605 110606 110607 110604 110609 110610 110611 110608 110613 110614 110615 110612 110617 110618 110619 110616 110621 110622 110623 110620 110625 110626 110627 110624 110629 110630 110631 110628 110633 110634 110635 110632 110637 110638 110639 110636 110641 110642 110643 110640 110645 110646 110647 110644 110649 110650 110651 110648 110653 110654 110655 110652 110657 110658 110659 110656 110661 110662 110663 110660 110665 110666 110667 110664 110669 110670 110671 110668 110673 110674 110675 110672 110677 110678 110679 110676 110681 110682 110683 110680 110685 110686 110687 110684 110689 110690 110691 110688 110693 110694 110695 110692 110697 110698 110699 110696 110701 110702 110703 110700 110705 110706 110707 110704 110709 110710 110711 110708 110713 110714 110715 110712 110717 110718 110719 110716 110721 110722 110723 110720 110725 110726 110727 110724 110729 110730 110731 110728 110733 110734 110735 110732 110737 110738 110739 110736 110741 110742 110743 110740 110745 110746 110747 110744 110749 110750 110751 110748 110753 110754 110755 110752 110757 110758 110759 110756 110761 110762 110763 110760 110765 110766 110767 110764 110769 110770 110771 110768 110773 110774 110775 110772 110777 110778 110779 110776 110781 110782 110783 110780 110785 110786 110784 110788 110789 110787 110791 110792 110790 110794 110795 110793 110797 110798 110796 110800 110801 110799 110803 110804 110802 110806 110807 110805 110809 110810 110808 110812 110813 110811 110815 110816 110814 110818 110819 110817 110821 110822 110820 110824 110825 110823 110827 110828 110826 110830 110831 110829 110833 110834 110832 110836 110837 110835 110839 110840 110838 110842 110843 110841 110845 110846 110844 110848 110849 110847 110851 110852 110850 110854 110855 110853 110857 110858 110856 110860 110861 110859 110863 110864 110862 110866 110867 110865 110869 110870 110868 110872 110873 110871 110875 110876 110874 110878 110879 110877 110881 110882 110880 110884 110885 110883 110887 110888 110886 110890 110891 110889 110893 110894 110892 110896 110897 110895 110899 110900 110898 110902 110903 110901 110905 110906 110904 110908 110909 110907 110911 110912 110910 110914 110915 110913 110917 110918 110916 110920 110921 110919 110923 110924 110922 110926 110927 110925 110929 110930 110928 110932 110933 110931 110935 110936 110934 110938 110939 110937 110941 110942 110940 110944 110945 110943 110947 110948 110946 110950 110951 110949 110953 110954 110952 110956 110957 110955 110959 110960 110958 110962 110963 110961 110965 110966 110964 110968 110969 110967 110971 110972 110970 110974 110975 110973 110977 110978 110976 110980 110981 110979 110983 110984 110982 110986 110987 110985 110989 110990 110988 110992 110993 110991 110995 110996 110994 110998 110999 110997 111001 111002 111000 111004 111005 111003 111007 111008 111006 111010 111011 111009 111013 111014 111012 111016 111017 111015 111019 111020 111018 111022 111023 111021 111025 111026 111024 111028 111029 111027 111031 111032 111030 111034 111035 111033 111037 111038 111036 111040 111041 111039 111043 111044 111042 111046 111047 111045 111049 111050 111048 111052 111053 111051</clockwise_edges>\n\t\t\t<edge_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</edge_selection>\n\t\t</polyhedra>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.PGPRemesh.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-0.27522219505192658 -3.0386117515173687 0.3303905765579504 -0.92624824511411885 -2.9073315033275029 0.33070357698442049 -0.60080829951087666 -3.0060200316910746 0.33054598469872354 -1.5351725921507346 -2.6389973122681303 0.33092958281495627 -1.2374538248836771 -2.7981078546070766 0.33082509059268767 -2.0738829514935926 -2.2450385150002803 0.33109356093118686 -1.8151867697388839 -2.4573258315509059 0.33101876833859473 -2.5165393888552536 -1.743094212083325 0.33120903606517244 -2.3062494919451639 -1.999316944178076 0.33115696321762977 -2.686400332065022 -1.4466220631593563 0.33124935693717211 -2.937630909274271 -0.82677170588005267 0.33130072725582171 -2.8384436579064527 -1.1537351851290831 0.33128156337969406 -3.0494641275686112 -0.16690357075599907 0.33131521858520124 -3.0163315375326714 -0.5033006592236251 0.33131336496742875 -3.0164511726920025 0.50205014313117724 0.33129561883338476 -3.0492225398756663 0.16934462037505171 0.33130936027525865 -2.8399588819323189 1.1487151763458221 0.33124492546739165 -2.9359152696332473 0.8324082587356546 0.3312726407705065 -2.6832954553976944 1.452412860628423 0.33120644948412981 -2.3040699727037892 2.001959496318614 0.3311146614575543 -2.5194235287786642 1.7395661620065919 0.33116508170738218 -1.8163340750554484 2.4563798004139454 0.33100134428663913 -2.0754021580217374 2.2437833787326635 0.33106093204465159 -1.2443759596427715 2.7944181962585617 0.33087097780049729 -1.5355139188487603 2.6388166910561277 0.33093769883948559 -0.61892396911609715 3.0005625353341911 0.33072886965182613 -0.92826416296738878 2.9067399970432559 0.33080033576655754 -0.29386090717936741 3.0368287047934359 0.33065554846976974 0.31275268418529167 3.034939978508381 0.33051453835461081 0.016867624386557957 3.0640957174857091 0.33058293131333655 1.1628243426586296 2.8354851665234011 0.33030832696044798 0.88604712530991647 2.9194588508767922 0.3303771330997764 0.60122381705534744 3.0058731899008526 0.33044545427015709 1.450997833682117 2.683833786031586 0.33023514646650826 1.9843577135534227 2.3182533178013078 0.33009130154210792 1.7255792740134406 2.5306456150949677 0.33016284266715712 2.4378469269858094 1.8385901124378163 0.32995552723738447 2.2253415351801058 2.0975493232771525 0.33002167861931297 2.7812300432481276 1.2686140439793614 0.32983458477877298 2.6242229028572415 1.5623782082236011 0.32989284388877105 2.9953257681475018 0.63550867386302845 0.32973375190891069 2.8994331115878587 0.95165719681968231 0.32978184874988253 3.036366296937111 0.29661352556263565 0.32969382541871145 3.0289616953597926 -0.37167185542627834 0.32963349063127972 3.0623672142681162 -0.032550801315994492 0.32965867951775529 2.8776312508831121 -1.0234076774770444 0.32960496581428483 2.9755447372027071 -0.70063650808635269 0.32961425955247825 2.5891078936891927 -1.6279560490744631 0.32961251136845776 2.7464149249389229 -1.3336515190217613 0.32960352339973054 2.1765967404619095 -2.1568322963184876 0.32966040426859772 2.3859332632073342 -1.9017456445549492 0.32963040543421596 1.9137737922334364 -2.3760801848215887 0.32970134857838651 1.3511794683632579 -2.7370946883577578 0.32982025644857466 1.6504173686852546 -2.5771339219864755 0.32975442528761867 0.72451547739705735 -2.9683795375554971 0.32999328768571345 1.0452484814278054 -2.8710666382548711 0.32989850851595459 0.063487310210662562 -3.0594339146451968 0.33023019025178135 0.39275189237214075 -3.0269786413230415 0.3301017791851526 -0.27477568104282024 -3.1264593226021047 0.76728466034094067 -0.31037679579538746 -3.3706230866813085 1.1379492607590356 -0.94655570545782497 -2.9926169289704285 0.76756914805643028 -1.0412570566022614 -3.2214613552397822 1.1382386284258319 -0.6173268667983004 -3.0923885802823623 0.76742692972297322 -0.66435835480572958 -3.3356864320536328 1.1380862365913367 -1.5752862394609382 -2.7169014831249871 0.76779700762614311 -1.7152880554190344 -2.9215707266220172 1.1384931721599463 -1.2708658629989045 -2.8795457140013512 0.76770171431209122 -1.3755646098071002 -3.1030688460233313 1.1383766649887157 -2.1318464508827901 -2.3109021198163693 0.7679512762839954 -2.3100682461050042 -2.4835379713536674 1.1386676986224507 -1.8644563691747849 -2.5302836180715258 0.76788167724025913 -2.0200593977933137 -2.7214718746244584 1.1385860829112204 -2.589018869057059 -1.7930728079770792 0.76805869685221762 -2.7981378208092131 -1.9268540327058892 1.1387886814437558 -2.3693136259835232 -2.0607319387355401 0.76800862692717264 -2.56666932004216 -2.2088413284852528 1.13873345407619 -2.7611281091687285 -1.4929634294382113 0.76809431513023119 -2.9889872707050924 -1.5896381613199275 1.13883173889633 -3.0211728677968788 -0.85373521106407702 0.76814356118657867 -3.2659712538477326 -0.89601574461805322 1.1388882752925877 -2.9205600977452355 -1.185371514387318 0.76812629600396898 -3.1521184437726175 -1.2712856625444853 1.1388653577308971 -3.1370533098324902 -0.17314877468803508 0.76815959194078376 -3.3854387892340467 -0.166455314746843 1.1389080970262653 -3.1030852466276486 -0.51801330296384362 0.76815679052400088 -3.3480447836687555 -0.54608439615920756 1.1389024030672248 -3.1031984641526256 0.51678597674916915 0.76814532120150414 -3.3454787038193343 0.57209638512999805 1.1388962332327786 -3.1371610899119009 0.1720287443379461 0.76815580061698485 -3.381832524812014 0.20305190948404628 1.1389053815125254 -2.9210707003026504 1.1836365505734223 0.76810371238765018 -3.147834880094786 1.2853854164536023 1.138856075457962 -3.021594706388822 0.85230493123025108 0.76812624595588996 -3.2524220349463309 0.94065827711463945 1.1388781229001241 -2.7622064332069582 1.490913409746915 0.76807119243629407 -2.9663560219953506 1.6319676955666669 1.1388242570150016 -2.3715950509331969 2.0579366024288523 0.76799392344425288 -2.5416593113423609 2.2393306727993938 1.138747345274882 -2.5908271841995409 1.7908461749495921 0.76803656844627188 -2.7872023452475534 1.9401798892506767 1.1387895792045695 -1.8687287934998571 2.5267913579184587 0.76789798450020974 -1.9994338135135983 2.7384549459503322 1.1386512889980167 -2.1352907023366399 2.3080730976730548 0.76794848860502585 -2.2903471660627379 2.4997519363168319 1.1387017512447128 -1.2785888892139872 2.8754821738318985 0.76778726347550619 -1.3639307802463609 3.1094104545187147 1.1385400581229153 -1.5814387119021107 2.7136483352881546 0.76784398056227299 -1.685926919894559 2.9373428095765077 1.1385969253826402 -0.63275601579491303 3.0878745239579897 0.76766628649774815 -0.66730803301955721 3.3350222155079914 1.1384180315778214 -0.95818082263299875 2.9892003697666847 0.76772727770322946 -1.0043936740738817 3.2328109341320084 1.1384792360609353 -0.30408522600765742 3.1237859614025525 0.76760400161239917 -0.28497907755508328 3.3733948463330639 1.1383537973976794 0.31954323262729978 3.1221833998409214 0.76748415223079181 0.022220430109538964 3.1515058025175513 0.76754201491058505 0.36079493106363852 3.3658502862258382 1.1382380344952805 0.04503578933952708 3.396986215213309 1.1382924630479838 1.1887485150710062 2.9189688685179433 0.76731057939116076 1.2615474686711445 3.1545182899478066 1.13806780912085 0.90285647095662735 3.0057334800527573 0.76736844252344072 1.0156546656623833 3.229143094884809 1.1381167938300181 1.4797669507867963 2.7675440390854904 0.76724850341861339 1.5938082500604853 2.9861342303624494 1.1380040353517944 2.0320596772625437 2.3920844381281934 0.7671252455767732 1.7692152977133635 2.6078477119637271 0.76718623704814048 2.1965336875902253 2.5760346038483237 1.1378786335722633 1.8942109407178545 2.8241983225934333 1.1379412364296295 2.5017030906500954 1.8983666854867025 0.76700858938349292 2.7005328321257362 2.0447081172115507 1.1377602953415407 2.2838936398017333 2.1638277190455955 0.76706530630371406 2.4571468445114473 2.341335501710252 1.1378182054851451 2.8573426422210817 1.3112798245265822 0.76690414661891304 3.0813321170440791 1.415211787957078 1.1376540166328688 2.6948294001811939 1.6153919569444042 0.76695465025588294 2.9048697288011862 1.7454223129820883 1.137705495447823 3.0793612691670678 0.65887302376261458 0.76681614713597512 3.319469949442702 0.7166202017640948 1.1375638106963324 2.9790819445020991 0.98954734095360453 0.76685879147566327 3.2136273452789021 1.0656359557968773 1.1376072242878781 3.1220455384713266 0.31617685812333529 0.76678161507668918 3.3679709157872755 0.33443984438866009 1.1375269672988482 3.1164207912447908 -0.37291307669503154 0.76672666354704289 3.3602891502867358 -0.41203436874299504 1.137468043080361 3.1503737623531189 -0.028335642029279563 0.76674919644772599 3.3987943372596012 -0.021258314694840769 1.1374936425388242 2.9620616578228769 -1.0452855837486175 0.76669721658586765 3.1935200874436802 -1.1315240856042865 1.1374340840027743 3.062630631440789 -0.71377811271061564 0.76670769560437191 3.3045637627875628 -0.76549323586952489 1.1374476560494122 2.6658336946820684 -1.6692747228127647 0.76669633554612748 2.8758217338118346 -1.7993750780875322 1.1374274535692015 2.829186694406773 -1.3636588041104676 0.76669353426072318 3.0512889742462179 -1.4710990101452184 1.1374274886532525 2.2412790317233933 -2.2153990933420009 0.76672693466609965 2.4214847067359582 -2.3844048763674519 1.1374508407980177 2.4611266588150595 -1.9474958885584264 0.76670967045249494 2.6509989261081572 -2.1047251232320234 1.1374357025674866 1.975857738953392 -2.4378931345080566 0.76675901206893249 2.1226605090056982 -2.6363134878473935 1.1374749394385928 1.3963470448855198 -2.8118285046825413 0.76684478129484801 1.4966249383757488 -3.0377372863273484 1.1375497777911783 1.7017242148666381 -2.6485632569070359 0.76679471474463667 1.8397204729071537 -2.8543175168743296 1.1375081519251149 0.75011912868231656 -3.0517902268707569 0.76697180080372651 0.80322731902793765 -3.2932689960893953 1.1376660271670036 1.0810805368858987 -2.951345821022346 0.76690220592710712 1.1651130445976612 -3.1834485018974998 1.1376031971344742 0.4115261536404054 -3.1128381689427029 0.76705656609359307 0.068051135909513949 -3.1467311761218411 0.76715185597728963 0.071451275625534688 -3.394078633534654 1.1378346762427418 0.43673338100803649 -3.3580410385279862 1.1377442096775821 -0.71748776550043258 -3.6096650014111078 1.4773864720721395 -0.7884537276968181 -3.9733855320790639 1.725087020288008 -0.32556150739616591 -3.6481467071589502 1.4773065168639246 -0.35942923437583235 -4.0155247596809165 1.7250095136908656 -1.1128915726167221 -3.4899793967218797 1.4774857401332397 -1.2365413681357511 -3.8379848516185318 1.7251789701345954 -1.8484227348071312 -3.1654566621732791 1.4776647120526751 -2.0545343201452937 -3.4735933092369478 1.7253569297603688 -1.4976876406898232 -3.3527913347838587 1.4775835064682312 -1.6411757557990998 -3.6943979311932753 1.7252739520050087 -2.497855993394559 -2.6889670884924231 1.4777981537545346 -2.7646470209561529 -2.9472704635286986 1.7254964511494151 -2.1925823518527383 -2.9393831953845719 1.4777382103166248 -2.4122307619567178 -3.2363657637113703 1.7254314458235904 -3.0300469751737431 -2.0824665125595967 1.4778908225855678 -3.3431403834134463 -2.2825101151107763 1.725595263561388 -2.7793964035403724 -2.3877853045219926 1.4778483082185845 -3.0644950947290877 -2.6219316310494007 1.7255489423861616 -3.2331344290772202 -1.722619407021337 1.4779219859634787 -3.5668629806933043 -1.8809002116176536 1.7256294922912079 -3.5324428750750245 -0.97536908959850566 1.4779653601269589 -3.8956468078733759 -1.0490159990378412 1.7256780374991043 -3.4143806008551767 -1.3644851775800866 1.4779491694944891 -3.7599432163555719 -1.4962703856594903 1.725658469101278 -3.6633743801611489 -0.18122712243385281 1.4779826981935791 -4.0351327790640488 -0.17081896822012818 1.7256987597218658 -3.624685329400549 -0.57397475577174173 1.4779781644759391 -3.9898380396386481 -0.63059291888743829 1.7256914379559181 -3.6198934852087414 0.62261369195455341 1.4779772777298126 -3.9824390961637821 0.70577427650489177 1.7256952959814036 -3.6585589468982045 0.23011650100140854 1.4779825313102404 -4.0261325042159504 0.26220385181187378 1.7256989939735918 -3.4040167380905908 1.3986643551606655 1.4779519177297402 -3.5184503164839835 1.0214989494598457 1.4779658621856286 -3.868035197796821 1.1400722496701041 1.7256844635197728 -3.2113431944695803 1.7634158955102479 1.4779308340753738 -3.5235434976094386 1.9620126968812581 1.7256508348412358 -3.7430855310066655 1.5513430678008533 1.7256712891353634 -2.7518071140168612 2.4214774377921082 1.4778800350204271 -3.0089231347086263 2.6897682576387965 1.7256009058349941 -3.0048838115438268 2.1131686036310455 1.4779081529694973 -3.3044072608817494 2.3297841152502663 1.7256282967440071 -2.1613934444088403 2.9651292566807568 1.4778160545187049 -2.3566747230515919 3.2821633731105795 1.7255372957722135 -2.4654213909159766 2.7156849038309301 1.4778497561462327 -2.7082236470665442 2.9937187694806568 1.7255705861272403 -1.4678815360395594 3.3689899224202091 1.4777415422854765 -1.5949446106659206 3.7194279098258223 1.7254627928794444 -1.814157558836222 3.1839659155349516 1.4777796657788329 -1.9821987087860791 3.5125004943903231 1.7255008151418736 -1.0789642273285138 3.5006056294515679 1.4777006470833065 -1.1586539497662394 3.8619892570856797 1.7254215241281587 -0.29751018787619299 3.6513723206087452 1.4776157496864875 -0.26686219722715998 4.0251282625598943 1.7253345461728493 -0.70109892965031084 3.6116872754783098 1.477659165546342 -0.7446365729240666 3.9781391157022483 1.7253796628592337 0.44387898488193023 3.6368330663284185 1.4775334393956916 0.7060481105324321 3.9817235513235674 1.7252352051814528 0.1281551627433834 3.6679835715699576 1.4775698036321412 0.20506839590694215 4.0311416528474915 1.7252859242010381 0.83396928638243539 3.5745963477587233 1.4774901094757573 1.3382014236137398 3.4215450213740226 1.4774295988769137 1.0290162797267273 3.5153930585701212 1.4774667027757507 0.79109862060094549 3.5876077865923821 1.4774944557019338 1.19709453546329 3.849959150169699 1.725184259639714 2.0315942018825184 3.0670077437901941 1.4773439365908787 2.2152965439323307 3.3871804665507224 1.7250705486608136 1.6917972329617164 3.2487060569449633 1.4773871914381502 1.8272830761601655 3.5946531917671067 1.7251150804347226 2.3509244333528945 2.8085944828841956 1.4773018673658393 2.5757526437175664 3.101389341231207 1.7250279261137258 2.905509505027188 2.232644593680837 1.4772215593223381 3.1960964019141151 2.4601614113350934 1.7249468507265844 2.6522078849674489 2.5413848576354234 1.4772604675236638 2.8998344348127918 2.8212498897216136 1.7249861337974168 3.3245815096527229 1.5490926799767382 1.4771493200715959 3.6600412917123522 1.7041888126139348 1.7248739910200086 3.1392240487569816 1.8959820914928189 1.4771841330073812 3.4424953028031569 2.1112998527546005 1.7249091610775373 3.5873357858411405 0.78990771019996242 1.4770875859165324 3.9468195509063362 0.8758764179296229 1.7248115770320929 3.4731036917753553 1.1666332754404227 1.4771173701897617 3.8174960090107111 1.3023535930466443 1.7248417069903046 4.0501557798732239 0.004047834751641043 1.7247616243716026 3.6421901566759156 0.38233006258209468 1.4770624072758638 4.0080317837913295 0.4321078909752169 1.7247858388826089 3.6383769601462639 -0.42042117091228393 1.477021281004459 4.0053299582982609 -0.4588957888305456 1.7247434443910923 3.6786801982769108 -0.011479819327300477 1.4770386740433714 3.4614951303454897 -1.2042779001039619 1.4769958158397762 3.8092029656441411 -1.3290482272165929 1.7247162171690447 3.5763401434287481 -0.82573476935241874 1.4770055881291586 3.9445815661939059 -0.88282150399488413 1.7247272707054995 3.1192940636622519 -1.9326477009125784 1.4769876584694634 3.4333942377871884 -2.1276847529183152 1.7247059688802786 3.3053377429220738 -1.5845897598210958 1.4769893364480384 3.6482429810385009 -1.7257408999539898 1.7247090940445802 2.6271629021013205 -2.5712869500558986 1.4769983840294323 2.8966044413171925 -2.8245473963267855 1.7247142774056308 2.8776554036112696 -2.2660444443865457 1.4769913520115749 3.1758188009921957 -2.4843103013308343 1.7247085641414928 2.3128756722603825 -2.8392642898831104 1.4770132965810787 2.5493476910311261 -3.1224803729347368 1.7247274447687322 1.6374282722470348 -3.2772100227842431 1.4770574631325093 1.7982915874496819 -3.6095639350587354 1.7247683690904345 1.9945685367530146 -3.0862694752805817 1.4770307585441171 2.2112782675407212 -3.3887763530563491 1.7247437349127608 0.88311873093186821 -3.5591233501025301 1.4771279467159193 0.96186619575408727 -3.9207729650237644 1.7248360743353603 1.2608967925916132 -3.4444638987789875 1.4770882856620995 1.4066340008958045 -3.7857954336192789 1.7247983641970088 0.47808765946591603 -3.6329296388211572 1.4771765203233338 0.0856222900414077 -3.6716685659067103 1.4772329560821371 0.089879579769247514 -4.0419671392288459 1.7249387240337926 0.53578858499109061 -3.9979666934671334 1.72488377164094 -0.86559226432391279 -4.3701196758114929 1.8916669685440639 -0.9497397353894057 -4.7991512692890597 1.9786552049018278 -0.39937173944482496 -4.4159058844014059 1.891640611625151 -0.4163465820209879 -4.8515607779774381 1.9786303146933635 -1.3571652163871788 -4.2219016528910256 1.8916975530747389 -1.4822493403728534 -4.6387463674953109 1.9786841788679816 -2.2506838579022639 -3.8250668629065081 1.8917576310936832 -2.4760578572824032 -4.198061073883669 1.978741572230386 -1.815155983912301 -4.0576981508842955 1.8917288613170145 -1.9848230355300369 -4.4604736317664191 1.9787137342330983 -3.0377001347359456 -3.2438440386260581 1.8918074170174242 -3.3497153638883588 -3.5507622272035793 1.9787912062524293 -2.6717371617298715 -3.5440318192986169 1.891784199579212 -2.9195239552501047 -3.9036590894376459 1.9787677055549817 -3.6807347936974564 -2.505636715677475 1.891844126196202 -4.0507538541382786 -2.7407706194825163 1.9788288422684652 -3.3835222644888558 -2.867655958344522 1.8918269738061413 -3.7084761242082434 -3.1576955057041229 1.9788108704502363 -3.9285995289870947 -2.0580409783172198 1.8918568559419888 -4.3144113724412749 -2.2594470971028606 1.9788419487452489 -4.2854173729041856 -1.1508447769031935 1.8918752602269302 -4.7092953281616285 -1.2527385951709626 1.9788616064475009 -4.1405233124465797 -1.6283712926605387 1.8918679967054752 -4.5486140530275048 -1.7822969747606028 1.9788536694052055 -4.4378583994128054 -0.18889046053110953 1.891883666320918 -4.8754649322054835 -0.18593237834125753 1.978871065483339 -4.3908870896495777 -0.66565678401518324 1.8918808963687659 -4.8213200769043096 -0.73549367221872353 1.9788675263874751 -4.3793487084292382 0.78293556199842307 1.891883396738447 -4.8068330687777383 0.88278780792984457 1.9788715440206444 -4.4250562787262808 0.31891393150367214 1.8918844765782994 -4.8600963041229459 0.34201830371756547 1.978871959346203 -4.2481041687356988 1.2739310496070899 1.8918799670434854 -4.6647012458886348 1.3998593411118669 1.9788682067519396 -3.8700013496130889 2.1677950789240681 1.8918685974757783 -4.2451001116476412 2.3892835089325821 1.9788574162790047 -4.1088569751651711 1.72100140266533 1.8918755479748603 -4.5045492245711003 1.9039594993625657 1.9788641191388128 -3.3081720005309663 2.9596630600554859 1.8918513876593921 -3.6206054409081694 3.2650010943959225 1.9788406494166426 -3.6179888939983362 2.5822251261702229 1.8918609030665805 -3.9700619456313482 2.8392599039733235 1.9788498794660405 -2.5877510485696358 3.6132493743892504 1.8918293048278716 -2.8186431999434696 3.9867810931333238 1.9788188943143492 -2.951138897768852 3.3151000727429651 1.8918409543804626 -3.245559195793938 3.6364937037305576 1.9788302525967241 -1.7400543557392367 4.0982629252343301 1.8918032696417402 -1.8888341884726456 4.5122304997940663 1.9787930152227795 -2.1520542948946129 3.8781199931338883 1.8918166000679475 -2.3624665152453503 4.2591434255924945 1.9788061791434493 -1.2488738945696547 4.2552283110867748 1.8917887583691404 -1.355340600082837 4.6777367061949908 1.9787784728300264 -0.26725610313050102 4.4295081797009841 1.8917579780521605 -0.24919164893939061 4.8686132782195015 1.9787475091469517 -0.77894090422796314 4.3791916075875967 1.8917738874657497 -0.82973268247748067 4.8115156350864448 1.978763553014022 0.2790462496622626 4.4282624430319792 1.8917411682481999 0.33440550681837555 4.8601347404712847 1.9787304613027847 1.4586319963213106 4.1911434536895147 1.8917016485087494 1.5633541876470387 4.6141950386324968 1.9786940401978947 0.88384632395611795 4.3656019227152187 1.89172061113809 0.96188759815905589 4.7967414657896681 1.9787119298899853 2.4047553253750875 3.7422052520204816 1.8916679613266973 2.6220285371245593 4.1195779696752881 1.9786604597620592 1.9829514958109808 3.9677545929703517 1.8916839135571282 2.1127506447373321 4.3918842305400307 1.9786765987068771 2.8132171449726986 3.4270720823227907 1.8916528522230853 3.0531511989688038 3.7932017376807874 1.9786452899108946 3.4959474168707181 2.7290666765005409 1.891624242446553 3.8195248812012998 3.0208506679046048 1.9786166728585661 3.1752818470871187 3.1199072880314174 1.8916379981628795 3.4675420543376201 3.4498510720834177 1.9786303784237775 4.0098712168015682 1.9032510929715856 1.8915985742681758 4.3944060576401238 2.1071249392902702 1.9785910750208899 3.7814968846825603 2.3306403221594887 1.8916109081968195 4.1342070677450344 2.5940529467469622 1.978603317680131 4.3336128806182099 0.98681697637489396 1.8915765409526244 4.1984597149476137 1.432540423799608 1.8915871685662635 4.7562616595367588 1.0928701697045535 1.9785691141590618 4.5964246271617677 1.6199634901880282 1.9785796297724116 4.4527255162732997 0.021360546504513467 1.8915588146814279 4.8884037739307074 0.038245654161252404 1.978551407143375 4.4071194706417574 0.48484651205804041 1.8915674350565275 4.8358987605100481 0.57177432547607898 1.978559955232974 4.4069840360354293 -0.48545267453018348 1.8915523708632493 4.8426255321037406 -0.50270778424230622 1.9785448997592852 4.1978140379355215 -1.4338999408596627 1.8915425510288886 4.6161522084589066 -1.5541614355930506 1.9785350157317689 4.3415460311218972 -0.96014599719562455 1.8915464348326163 4.7761844883947679 -1.0266727195417213 1.9785389036958505 3.7885490099678889 -2.3166782825442764 1.8915385054091589 4.1660453361825525 -2.5337182951852557 1.9785308207029453 4.0133360943937175 -1.896143930244524 1.8915397023212721 4.4263534198752783 -2.0467294260302382 1.978532074018025 3.1971699717848248 -3.0924698184517707 1.8915407796024555 3.515280727393173 -3.3909123295745141 1.9785328696684708 3.4936607070304819 -2.7311811861160495 1.8915390518188884 3.8629459081492326 -2.9672683289348329 1.978531252703698 2.8118583442685949 -3.4274900203455734 1.8915451309722922 3.1116819076132525 -3.7444664389235518 1.9785370763034644 1.9946696659806145 -3.9607817792879128 1.8915588787700051 2.2074161543096742 -4.3405691374202835 1.9785505057779429 2.4414103942528138 -3.7219453085215704 1.8915503159816489 2.6972561408389066 -4.078696272209398 1.9785420556365219 1.08023346463529 -4.3053034846081859 1.8915819320207625 1.1927624948763715 -4.7259805894964684 1.9785731184595883 1.5461178227249199 -4.1639103122227255 1.8915687923846931 1.7250364772507132 -4.5644496697443122 1.9785602322513092 0.57788338756634539 -4.3981091353187169 1.8915978680738279 0.11158337100280319 -4.4441316986547976 1.89161696770285 0.1161248272505857 -4.8810138901923983 1.978607211075454 0.67022094216142181 -4.8263480213088537 1.978588878330795 -1.0334456900013791 -5.2282534063182702 1.93435117657424 -0.47807884564767478 -5.2828295259777347 1.9343755911217684 -1.6314811128695843 -5.0482919212340409 1.9343242322660787 -2.7055344790504749 -4.5688935387917509 1.934268995476067 -2.173303282903885 -4.8532243219760423 1.9342959156763524 -3.6496591588324407 -3.8676182794406766 1.9342202003811808 -3.2004029949080706 -4.2361622859654977 1.934243530508597 -4.4188134437586628 -2.9783248866563596 1.9341822900915511 -4.0641786849421671 -3.4103053326687371 1.9342004550850251 -4.7152088162306258 -2.4328606242464801 1.9341688603702498 -5.1367547713127646 -1.3428856283848127 1.934148577801029 -4.9618041857380097 -1.919477646664135 1.9341568614455664 -5.3124275405177208 -0.1896659473173502 1.9341385227003911 -5.2554339820912599 -0.76814021129847454 1.9341422655072946 -5.2352852438510684 0.97295928961996347 1.9341374557628861 -5.2902614047617567 0.41479154900636345 1.9341371699598366 -5.0694687262906051 1.5648386560983871 1.9341404164120941 -4.6097528647973594 2.6303462142788043 1.9341508283255795 -4.8960019517312556 2.0948799108951031 1.9341444146280609 -3.9308913855516505 3.5729780821852333 1.9341672710519733 -4.3046790578648126 3.1175879267819582 1.9341582123705616 -3.062005211065908 4.3500969510952032 1.9341887523093371 -3.5040139573485276 3.9874227771605915 1.9341774688626836 -2.5282826346437779 4.6640209595342466 1.9342012470814509 -1.4354874787591283 5.1082449333006918 1.9342287907060078 -2.038043160961998 4.9255370517985835 1.9342143716824689 -0.24171191718665852 5.3066929541365262 1.9342595620236029 -0.8626401356089417 5.2456167217680401 1.9342436770315286 0.40397108647700702 5.2906289944924794 1.934276037209574 1.6883759089564632 5.0311020762286311 1.9343110342381713 1.044426038820899 5.2265316176289316 1.934293918809642 2.8195377499930361 4.5075313369390733 1.9343441205718048 2.284422976413945 4.7936471807448875 1.9343280728970431 3.7602216179810317 3.7758854277853184 1.9343741782818644 3.3245271208178018 4.1335473168902208 1.9343592444148519 4.1557761283768713 3.2972165503723501 1.9343877343381886 4.7789131931069457 2.3110851182370569 1.9344131736696655 4.4966254467719713 2.8393368171308127 1.9344010690660229 5.1733990129572716 1.2171497937216771 1.9344349650944193 5.0056000310102506 1.7704886694828881 1.9344245350581486 5.3232088612605848 0.064175250810200757 1.9344524927568925 5.2684514326825456 0.62057092936193881 1.9344439867420409 5.2754995620131817 -0.54825068843139724 1.93445886393302 5.031659600318771 -1.6838220258889065 1.9344686165823357 5.2080359028809751 -1.1024512644867579 1.9344649040374311 4.5478230160810096 -2.7427926376870833 1.9344727014215342 4.825792933821071 -2.2227595951515928 1.9344715617330766 3.8446816499480563 -3.6756329526100426 1.9344705743782182 4.2071177161417532 -3.2339902230929716 1.9344722360898823 3.3817987347769458 -4.0858527313591262 1.9344663145403849 2.403606524977568 -4.7292339715018112 1.934452923315797 2.9507351192344831 -4.4367392063671014 1.9344614617933802 1.3065826367260007 -5.146292926234076 1.9344305526103032 1.8810927464920915 -4.9719501791095491 1.934443369617656 0.14243091071068809 -5.3157795149547695 1.9343971626048586 0.71917142252754407 -5.2588842929950195 1.9344153112853131 -1.1171167969507818 -5.6570592125523111 1.8466106337452455 -1.1900235625982005 -6.0206728008798462 1.5988538181293623 -0.47361613218515541 -5.7203417814015252 1.846675256431616 -0.5261381987226138 -6.0859645639265185 1.5989174541997904 -1.7366516153142162 -5.4708778305631744 1.8465357703233722 -1.8818209981706084 -5.8124455452458994 1.5987846155001253 -2.9140883018522876 -4.9505069233002974 1.8463867037099468 -3.1267872209502041 -5.2552137950460738 1.5986404670031054 -2.3441448149388786 -5.2550226597756318 1.8464609595442105 -2.5059914611441729 -5.5869168515552712 1.5987110433961877 -3.9482387362710525 -4.1850842659870082 1.846251761312268 -4.2187488558529838 -4.4404220790776314 1.5985085084635735 -3.4494397862631456 -4.5943124273981111 1.8463169268178645 -3.6905572838981096 -4.8737749199321136 1.5985722321618661 -4.7890319585654826 -3.2125789908570055 1.8461441489759685 -4.380563476338744 -3.7101769431084413 1.8461962555628062 -4.6855334012357215 -3.9202076241115096 1.5984540826231397 -5.093708856369461 -2.6470634814071419 1.8461059187726518 -5.4436945406749091 -2.7750368876958236 1.5983643702940442 -5.1056256286951838 -3.4073994019856095 1.5984023296019736 -5.556326214415666 -1.4574757858489498 1.8460466203496482 -5.9252224824540844 -1.5125067518161199 1.5983048694737589 -5.3704743677454037 -2.0700223091362413 1.8460709648862736 -5.7228835095844532 -2.179401923541481 1.5983296277405805 -5.7483757986512956 -0.19899623257923316 1.8460162198487127 -6.1210671475868681 -0.17951276879497474 1.598274025815698 -5.6858064955522156 -0.83409381088478951 1.8460280140990553 -6.0546721572201658 -0.85344683000770205 1.5982862393913255 -5.6627117259625317 1.0688290364134185 1.8460115553958985 -6.0243479430822813 1.16159831687572 1.5982688278251049 -5.7250939449962859 0.43544306392567256 1.8460121261963904 -6.088889712045189 0.50628207719732254 1.5982696611278946 -5.4890198216881938 1.6794919788439726 1.8460199674043816 -5.8271425683347928 1.8359771990499407 1.5982767450925899 -4.9899110200307319 2.8414377785271552 1.8460482510063962 -5.2882151890672455 3.066107825320243 1.5983043838032962 -5.289224791951467 2.2815175375968679 1.8460303876210105 -5.616550970374572 2.4518889312761813 1.5982872459988904 -4.2503960615368452 3.8690267164953607 1.8460938940879041 -4.4990339561964117 4.1477035070015749 1.5983494500176367 -4.6537113999019466 3.3776447279549378 1.8460686899191292 -4.9313519659212304 3.6209804499634446 1.5983247617438672 -3.3018116195802456 4.7157815447626472 1.846154055784349 -3.4909690400424407 5.037887179822075 1.5984090449381978 -3.7950886366807004 4.3110200684715139 1.8461226507793489 -4.0071827940703848 4.6143014034097591 1.598377954760468 -2.7489090279710862 5.0391299510171867 1.8461896027875129 -2.8821212000118739 5.3863220310887758 1.5984441613952138 -1.5544030039516796 5.5265802603382239 1.8462672576765067 -1.6053130924058827 5.8967334908475442 1.598521068440462 -2.1788597927194164 5.3372170131321992 1.8462263633143672 -2.2937749739699473 5.6879533982320538 1.5984808890377327 -0.24792746639367857 5.7430508997726939 1.8463540462855959 -0.23108538450682586 6.1154895851158058 1.5986068477165802 -0.91593712101823277 5.6773246023397865 1.846309337846761 -0.94207025627205931 6.0455294914398587 1.5985628788160415 0.43557440376713052 5.7244994908589577 1.8464006842966818 0.49021583481677355 6.0898995310293484 1.5986522386836275 1.7902583464196009 5.4546779088861559 1.8464962549608854 1.9167339030584309 5.8019159381801071 1.5987453542954504 1.1278330665613321 5.6556967920195609 1.8464484713005407 1.1999637262266203 6.0194173137475069 1.5986994029409822 3.0139430522327495 4.8967932274007815 1.8465881588438244 3.2022684495078111 5.2145375619368419 1.5988362708544608 2.4255026280336152 5.2113973757036689 1.8465430450444589 2.5748418139641052 5.5499791251428263 1.5987918375388439 4.0475156246248583 4.1027980373022785 1.8466730880446176 4.2945918467268971 4.377385484857041 1.5989205284357226 3.544688293097622 4.5155386033456288 1.8466311316210544 3.7719358954194582 4.8063984573909995 1.5988788425267326 4.4607654771513454 3.6112404358744006 1.8467116786547189 4.7525936426415827 3.8373101417851982 1.5989585400256365 5.1496260739877666 2.5403090689477521 1.8467834392228351 5.4835824468350767 2.6983102893330102 1.5990295213597205 4.8490460521532999 3.1027626205276273 1.846749293953424 5.1535586953185533 3.3158469491797797 1.5989960836353956 5.5874722735206275 1.3507059075151822 1.8468447538644839 5.9458640825412399 1.4404317702382672 1.5990900740384355 5.4030102495881138 1.9589454768731609 1.846815563589141 5.7480751553954708 2.0926013241129731 1.5990614543676247 5.757251597769069 0.095541885978809749 1.8468939156955879 6.1262658029268149 0.11359532858931515 1.5991384123387831 5.6950574211276814 0.72736755317780311 1.8468703824452175 6.0611252243456635 0.7753301274023553 1.5991152864060363 5.7137623920522955 -0.53681901997186277 1.846912091170418 6.0805882630607 -0.57710140866997139 1.5991559022984281 5.4581504972228005 -1.7765383462223647 1.8469391489693214 5.8057104759818348 -1.901985883023283 1.5991817570808715 5.6428864373816303 -1.1675985004021772 1.8469288320669539 6.0109564717160859 -1.2254275885384833 1.5991725816312641 4.9385118067453551 -2.9347495357196007 1.8469500920453661 5.254348765255048 -3.1266642519604471 1.5991915988616674 5.2392559169024571 -2.3721058156241313 1.8469472639073912 5.5808719772417064 -2.5157881784512877 1.5991897348234232 4.1768192680837206 -3.9566859115150428 1.8469433814860243 4.4480467874907728 -4.2078729491782036 1.5991836953769236 4.5827267397810179 -3.4620737955892724 1.8469486761640703 4.8780326992624508 -3.6839194983026493 1.5991897017260761 3.206576233116611 -4.792469053732038 1.8469170772187449 3.4218762459569976 -5.093150577231917 1.5991562057182687 3.7026190999762729 -4.3853497495912706 1.8469313208638136 3.933690049924111 -4.673087673287327 1.5991708262713991 2.6393151926674223 -5.0965216339831816 1.8468927257220189 2.7913164305548852 -5.4336983164143184 1.5991309608496458 1.4427258214949505 -5.5595825610541842 1.8468291903946383 1.5211366001381608 -5.9214180858071721 1.5990672358507751 2.0598106994168801 -5.3723354115931246 1.846865490564602 2.1947328812963285 -5.7170279863644042 1.5991037950925231 0.81285841391275526 -5.6867633268521693 1.8467861781907442 0.17002535565058385 -5.750151902633994 1.8467360342242587 0.17300083458005805 -6.1206587186171779 1.5989754787535884 0.85564935527318164 -6.0533496563039311 1.599024958391003 -1.256308461275943 -6.3535970791594476 1.319749153299121 -1.3064809534118247 -6.5964221496325885 0.94894018759337406 -0.53642337893087966 -6.424438643339081 1.3198403382502135 -0.55998243324975583 -6.669886117257307 0.94902956373726877 -1.9614743429293582 -6.1412651815757782 1.3196472286970857 -2.0483254048516479 -6.3725846521442211 0.94884292684837357 -3.2889568961138025 -5.5514521105697989 1.3194413498280944 -3.4330489589318267 -5.7540105698937269 0.94864505377028208 -2.6514961735214952 -5.8921036836980019 1.3195451730464363 -2.7506715363155982 -6.1186754322230437 0.94874249382927722 -4.4531493073904871 -4.6848341274421026 1.319251031863651 -4.6359316494170839 -4.8537916184117371 0.94845976441147706 -3.8954943238773976 -5.1424095645378038 1.3193442408304423 -4.0495294204925374 -5.3349623913062967 0.94854939152119377 -4.9409511363575369 -4.1411529853400681 1.3191716982347779 -5.1395459625862987 -4.2878201473725319 0.94838232214042195 -5.7386292860539241 -2.939339846716158 1.3190395293229029 -5.9690765848180911 -3.0312414365845313 0.94825324603241568 -5.3950415469109068 -3.5820676979586521 1.3190959560408939 -5.6071338317912867 -3.7083109086273995 0.94830839308007098 -6.252317595218031 -1.5969785342198248 1.318950968794788 -6.4999166976927771 -1.6301182995093684 0.94816611166920373 -6.0449055239767491 -2.2806391808772983 1.3189882144610454 -6.2783847157543002 -2.3603275667376327 0.94820269682178582 -6.4602041437516737 -0.17964003422687735 1.3189043488863801 -6.7096452984329877 -0.16247137502324441 0.94811998781479823 -6.3904326924616397 -0.88791369220828575 1.3189231833025352 -6.6363147515961334 -0.90688156452862501 0.94813875914088563 -6.3552593308107781 1.2452209419542744 1.3188957493121782 -6.5964646768438921 1.3116708509888975 0.94811153567975703 -6.4247702898635772 0.53944973787184558 1.3188979003632195 -6.6683831712914463 0.58145466616054631 0.94811381403799622 -6.1498357037638671 1.9349148057730845 1.318907859652682 -6.377181883613865 2.0348179235636898 0.94812369481246006 -5.5804585260069421 3.2353851847899358 1.3189483215363125 -5.7788283572511183 3.3872969633523988 0.94816383321621156 -5.9150133258771183 2.6095130563759765 1.3189228868323524 -6.1344968236855673 2.7219232025719031 0.94813892348349171 -4.7424887228523165 4.3831446591144498 1.3190147380531092 -4.9057987480312537 4.5728017489412007 0.94822987136031556 -5.1912773105765826 3.8363324527982301 1.3189782272372159 -5.3797987183441887 3.9952688322998133 0.94819388693644135 -3.670947079820249 5.3268983318853902 1.3191029003035397 -3.7942966362550878 5.5446259200719545 0.9483175957233243 -4.2200288934325823 4.8763179789363749 1.319057044840487 -4.3657259602631875 5.0757050862428041 0.94827215070106452 -3.0395231439599342 5.6849928844300344 1.3191553311665745 -3.1339391887076982 5.9140956392303705 0.94836976383896066 -1.6954035807976122 6.2222393385793948 1.3192695048753074 -1.7332049670748872 6.4684254567140931 0.94848306053651943 -2.3960501544726767 6.0097421565737248 1.3192095918765545 -2.4723143381590615 6.2442601934301472 0.94842389477474087 -0.2380919750985071 6.45411840234698 1.3193963246854283 -0.22723401881045496 6.7029401921564364 0.94860869335894116 -0.97432037858047105 6.3816497691218972 1.3193311693171028 -0.99968111587658481 6.6269036472393559 0.94854455827634798 0.51691660079705337 6.4266118184954344 1.3194633055396781 0.54559322715502312 6.6715402632464818 0.94867496861215805 1.9951398757027876 6.1310856542674719 1.3196000258875056 2.0741854046159274 6.3647632949609907 0.94880955720605198 1.2664294576243218 6.3521849695172588 1.3195317746224438 1.315880195792934 6.5948392296959799 0.94874254663865798 3.3518769498479157 5.5176004479442939 1.3197333865650653 3.4791556581406837 5.7291425587694134 0.94894143236662387 2.7017338428225037 5.8651588718768002 1.3196674796378327 2.7924075369670112 6.0962659486218271 0.94887661533752199 4.5145203114287513 4.6339460866528226 1.319858036741673 4.6800026083391222 4.817102718724632 0.94906518714706412 3.9550941715059023 5.0931082768822842 1.3197963990323032 4.0968094019067793 5.295769500460783 0.94900417241339274 4.988298649218935 4.082681055942416 1.3199147144556354 5.1742409271149796 4.2447695616415562 0.94912136108839384 5.7674842923469569 2.8839731124674519 1.3200198184663661 5.9867449289907402 2.9968151458141445 0.94922526172695088 5.4298906286652366 3.515636589883111 1.3199700842608753 5.6296083633335883 3.6650394827743225 0.94917647635034363 6.265279866252162 1.5515947564424826 1.3201090744379667 6.5045556712493395 1.6121980222157639 0.94931318765848582 6.0600286604045426 2.2283143288598892 1.3200667188257056 6.2863313356640802 2.3316815499453152 0.94927202032721492 6.4627988343431682 0.14464227792773854 1.3201798873313288 6.7092880158334127 0.15753286193591912 0.94938264967820496 6.3935876480432174 0.84758435190165438 1.3201461163556409 6.6367208517599172 0.89454152479872062 0.94934994372651904 6.5957184847261052 -1.3102959929277271 0.94943094903363801 6.4207777171634657 -0.571115404759166 1.3202055996528286 6.667372168260397 -0.58294214330063088 0.94940762870221895 6.1399427763986401 -1.9644694864598855 1.3202427801306071 6.3762354500449945 -2.0349167069759897 0.94944257654415321 6.3490863527990431 -1.2750457179949635 1.3202295942533426 5.5617015729843127 -3.268633208640531 1.3202553839761093 5.7739418429481342 -3.3946212992054141 0.94945240897648375 5.8972618164607935 -2.6408473477202965 1.320253116282027 6.1323633062129481 -2.7240616594578406 0.94945258338084793 4.7098139151687253 -4.4216735430859453 1.32024112944809 4.8912452811627452 -4.5892715860620985 0.94943539732366711 5.1626545960516372 -3.8698750948613978 1.3202511296337136 5.3693895961679026 -4.0066381868113883 0.94944767157281085 3.6212812389517159 -5.3667164942185739 1.3201974306450035 3.7651445184052927 -5.5676289325427781 0.94938884425767756 4.175090213851008 -4.9121970992319302 1.320220814258513 4.3405509533680071 -5.0953835111122219 0.94941391235825645 2.9793092035495952 -5.7164210462454772 1.3201591353605597 3.0928975405222876 -5.9352947028598706 0.94934875938601548 1.6314494069070113 -6.2410888226634409 1.3200621603247429 1.6853118110388792 -6.4824212020169307 0.94924935510037622 2.3233031360885712 -6.0311791371345151 1.3201170634711097 2.4242066999470673 -6.2582405337695555 0.94930598936270016 0.9151147488419672 -6.3870348738191272 1.31999886630267 0.19619010729015796 -6.4578916467021905 1.3199257181566424 0.19709427132991711 -6.7055715587264455 0.9491132582118802 0.95617108927346606 -6.6307603179013004 0.94918614256829448 -1.3411001090080674 -6.75960501102875 0.5445018759737319 -1.3611250440525242 -6.844638949223862 0.10709205929948522 -0.56960848341439863 -6.8355697314783299 0.54460530058081813 -0.57586100662794215 -6.9219604345213206 0.10719397229096188 -2.0919582669472856 -6.5325548409259042 0.54438977891907259 -2.1206083056449438 -6.614346859470654 0.10698256125455255 -3.5094565700696574 -5.9010110023472455 0.54416343266059319 -3.5586856352903924 -5.9728754920866862 0.10676382567387997 -2.8226066081701826 -6.2681145280738928 0.54427671711348846 -2.859555153200052 -6.3465442146923357 0.10687211106144597 -4.7513659821973837 -4.9732579721914911 0.54395323190395495 -4.8174446559922321 -5.0310371357065939 0.10656109172809382 -4.1539487396763244 -5.4635189735051775 0.54405733462533867 -4.2066676756704764 -5.5322636603391366 0.10665945468184561 -5.2680900217279234 -4.3921394049644773 0.54386569570750531 -5.3367615800456401 -4.4449451739368326 0.10647510455468864 -6.1161967222874969 -3.1070597847105201 0.5437172157291561 -6.1963705919335794 -3.1407370748267098 0.10633194134009162 -5.7504781396023086 -3.7912444441864235 0.54378076048761315 -5.8260406526612316 -3.8335497447254121 0.10639365473422954 -6.6598168507649653 -1.6729587154396635 0.54361686997497194 -6.7464904927502962 -1.6854988687482637 0.10623506474285598 -6.4368164809419124 -2.4080633063589638 0.54365955575106484 -6.5193932828383492 -2.4341101336854503 0.10627598759935016 -6.8760807897606382 -0.16039598872421346 0.54356391028561046 -6.9639262519609346 -0.15181434793834683 0.10618414600913649 -6.8014534771256487 -0.9180551452125556 0.54358602578353177 -6.8876581045024485 -0.92613584302359531 0.10620494289561118 -6.832425408358894 0.60364964948835498 0.5435574064661941 -6.9180964784300993 0.61714407333597576 0.10617809235145359 -6.5335562454002023 2.089216485837464 0.54356945279218116 -6.6136991855634806 2.1232830902775732 0.10619114874262724 -6.7553963855325696 1.3579174829166942 0.54355488814699948 -6.8380437080129877 1.38372839132197 0.1061763699251385 -5.9214373592358891 3.4714710449248329 0.54361691380871158 -5.9915105014945613 3.524042319810428 0.10623913357628664 -6.2792790574875497 2.8020086738290471 0.54358748383945765 -6.3551520940950015 2.8437291613255518 0.10620958039717268 -5.0241886235116926 4.689387504852613 0.5436946064927789 -5.0802781613872181 4.7575204485538629 0.10631703152486603 -5.503765531583932 4.1050345579445642 0.54365228348721495 -5.5699342010988993 4.1608860427172827 0.10627471329758867 -3.8794172813417029 5.6888876149385874 0.54379766780253735 -3.9205775160740428 5.7671130819686134 0.10642009684691137 -4.4653512551993293 5.208037677024496 0.5437443754069754 -4.5171381894529032 5.2775420091770986 0.10636691364984209 -3.2061726726406277 6.0631879167482952 0.54385917182504429 -3.2402435014539188 6.1431497040226564 0.10648161181175966 -1.7757993786218811 6.6285428069354566 0.54399233637088418 -1.7905671895709867 6.714539881139304 0.10661447204718506 -2.5201776318940685 6.4027525429295533 0.5439226740999894 -2.544824716287045 6.4857527221575646 0.10654505216105653 -0.23242440802792708 6.8688720985792591 0.54413959637324116 -0.22803341825832657 6.9563045553664606 0.10676115083590219 -1.013541490970062 6.7919537709980711 0.54406423603122323 -1.0227389835796235 6.8780477781553788 0.10668629790766587 0.56086313954543643 6.8365083081871907 0.54421701140914303 0.56913032381138551 6.9226940758015854 0.10683840423331667 2.1150816773082166 6.5255435957181787 0.54437448060608662 2.1411806409362644 6.6081037426364455 0.10699497121902318 1.3499115702204254 6.75767169106234 0.54429577612174129 1.3686928696876075 6.8424515519952029 0.10691662997379599 3.5495940180543584 5.879475098976644 0.54452871411024095 3.5939214662606513 5.953955229083256 0.10714839137883807 2.8566893476396582 6.2498574701615643 0.54445249195335377 2.8892641339907255 6.3306194171272949 0.10707266721896083 4.7870125234268146 4.9438191737489987 0.54467346071859846 4.8471029729239961 5.0065099006075942 0.10729243153581017 4.1905996955881655 5.4333008583686357 0.54460189696470851 4.2387539198401338 5.5057872489176596 0.10722142701888389 5.2928563372434727 4.3616889797179015 0.54473925224656228 5.3569804481397778 4.4200329216186329 0.10735797980135221 6.1259246892445915 3.0883798010831454 0.54486082373215883 6.2021464188467057 3.1294497790238638 0.10747851683033992 5.7654709851639714 3.7627652490507626 0.54480367378007366 5.8370165671006236 3.812583448067719 0.10742192858816585 6.6597673653073164 1.6722037048657543 0.54496325292640024 6.74362351952146 1.6940331683534626 0.10757954466362848 6.4397845542908545 2.3974227406128428 0.54491501609006632 6.5196988165073382 2.4322461901659582 0.10753232018298514 6.8742633223761622 0.17586125833075628 0.5450433119010385 6.961091319571568 0.17762187766646753 0.10765772240422655 6.8003728366956278 0.92616087401578961 0.54500522273280261 6.8855932531513639 0.94424031026168276 0.10762122972323289 6.7600836184146349 -1.3350369966348912 0.54509790256585622 6.8455955026453275 -1.3501645775195197 0.10771021246129495 6.8340868588774493 -0.5837229445270713 0.54507143307667127 6.9208504501593158 -0.58613849615047897 0.10768534443251412 6.5395848914232548 -2.0682918969681312 0.5451103770971012 6.6231255106664806 -2.0911651017254216 0.10772144563247156 5.9274542818338549 -3.4595833310581385 0.54511916541168304 6.0029860063333595 -3.5019485839168567 0.10772646118816308 6.2882461432551988 -2.7845887350308836 0.54512035432662176 6.3694953324964834 -2.8162563678172887 0.10773002165736001 5.0223618539180359 -4.6911764358683534 0.54509506013032982 5.0852825314970493 -4.7509918265673514 0.10769756829829918 5.5074238059751286 -4.1001219404959164 0.54511043219598998 5.5807761299246978 -4.1472251456242306 0.107716746605641 3.8633499121587263 -5.7017568063317086 0.54503538439301702 3.9120883394798032 -5.7737693309214766 0.10763313589431693 4.4561068856949131 -5.2152857490281512 0.54506655014065453 4.5159459991654565 -5.2781872329384036 0.10766798401980369 3.1816445663607884 -6.0760455950805508 0.54498574016869783 3.223511788702413 -6.1518461090838592 0.10758151199465257 1.7433701027582744 -6.6381995780719016 0.54486510269171962 1.7643701558140019 -6.7223126203240167 0.10745582600557424 2.4875004695528622 -6.4124560539373299 0.54493299915836046 2.5205663364134598 -6.4929084504356593 0.10752624179023164 0.21062770406187514 -6.8709068314061277 0.54470293558027283 0.20906599030954909 -6.9580672440563216 0.10729123304385574 0.98166789527309617 -6.7949489060885817 0.54478887714640445 0.99750784737250831 -6.8803951389261453 0.10737850847446179 -0.56663361152226255 -6.8785065547035193 -0.33022032050397471 -2.1020192188644895 -6.5737632799596941 -0.33042875770390617 -1.3558562055572263 -6.8001314872026875 -0.33032176980645345 -3.5317816680564555 -5.9370046004497921 -0.33064220824134827 -2.8404734836836112 -6.3065402587010064 -0.33053646330013453 -4.7840730941682077 -5.0009908623527233 -0.33083872565352151 -4.1756783803324051 -5.5003123093566497 -0.33074184713191102 -5.2972029309443514 -4.423112415843887 -0.33091957624562574 -6.1529957892652938 -3.1275158159916492 -0.33105837015970713 -5.7885913956016743 -3.8092931637911356 -0.33099960212104357 -6.701203418247796 -1.681412207293163 -0.33115196353978349 -6.4764183619489044 -2.4224561507580811 -0.33111248620600159 -6.9187396664934697 -0.15616049057795056 -0.33120046032543821 -6.8427507223715773 -0.9277300839647632 -0.33118021061172997 -6.8747103391118367 0.60318875201140565 -0.33120491742757902 -6.573849140911241 2.1012165768578854 -0.33119070466631295 -6.794569763863322 1.3735874743676959 -0.33120642618689883 -5.9566386404317626 3.4948391238816345 -0.33114190581795994 -6.3162316511661798 2.8220753037874582 -0.3311719469019313 -5.0516231183525813 4.7223073966121296 -0.33106342650550452 -5.5381872383097255 4.1294140301727147 -0.33110595614793364 -3.8969936359568074 5.7289671117146321 -0.33095996687929452 -4.4948689731170939 5.238289879559793 -0.33101316606681336 -3.2269803767707042 6.0998668404568432 -0.33089813300206006 -1.7858122456969228 6.6696140496963645 -0.33076505398793243 -2.5307212572549802 6.4436339659136346 -0.33083469239618851 -0.23134839637221039 6.9114501285272603 -0.33061817179064518 -1.0210683760203845 6.8336545853037052 -0.33069315038052 0.55925365280470474 6.8791696912917759 -0.33054069225055538 2.1248011354083918 6.5668617369083595 -0.33038391727679262 1.361590826980744 6.7983627728240448 -0.33046261730005883 3.5712380741519003 5.9160071306104998 -0.33023046760945357 2.8719150440339205 6.2897860539629837 -0.33030631186308546 4.8195532038879874 4.9720656793273319 -0.33008666168940903 4.2116650441164474 5.4709284311976463 -0.33015760773541181 5.3226544859566651 4.392379854731705 -0.33002145238754454 6.163361580118095 3.1086085530768086 -0.32990159283608061 5.8032334031440147 3.7823373688658717 -0.32995782744065061 6.7016384783877916 1.6808988625987402 -0.32980160055221286 6.4797526688784206 2.4123264118342278 -0.32984843444042744 6.917406603911064 0.17267525253292237 -0.329724938704959 6.84221794233473 0.93600547885854368 -0.32976111725270951 6.8014647796800283 -1.3499532363851294 -0.32967498434469572 6.8770949798758298 -0.58201769885571986 -0.32969935981903797 6.5811541979196022 -2.0781747670186244 -0.32966601440971904 5.964624677666956 -3.480518689212956 -0.32966454708634724 6.3266463813133225 -2.8032260229205437 -0.32965906181244425 5.0522343450262568 -4.7219887365704842 -0.32969781597609055 5.5443167714709354 -4.1223909682026108 -0.32967729558012432 3.8832793996644064 -5.7405272908578278 -0.32976817856652807 4.488931778935032 -5.2434904432599847 -0.32973219531974313 3.2052626184566924 -6.1117162459798218 -0.32982433954673557 1.7549836169303781 -6.6791333989753214 -0.329954914775199 2.5016073311954954 -6.4526626849467634 -0.32988185350947624 0.20905116683787961 -6.9137447650245036 -0.33012272210730698 0.99232733031216946 -6.8366163221411895 -0.33003461459686639 -0.57142878331755931 -6.7901931460550271 -0.76729014707863297 -0.5395933494054973 -6.5455533435868292 -1.1381121173862296 -2.083524730520451 -6.4879426948095187 -0.76746603827677018 -1.9886693228961805 -6.2590396991835728 -1.1382870577420692 -1.3419661142699435 -6.7129545569874232 -0.76737607309542577 -1.2965947275412737 -6.469039839769378 -1.138198399201416 -3.4911988893439796 -5.8594031750785289 -0.76764250571312087 -3.3505184641063672 -5.6550050633687166 -1.1384601469802664 -2.8085277771566006 -6.2243642860710793 -0.76755523770982437 -2.7012139386167044 -6.0021295076018948 -1.1383753386872828 -4.7242796926121038 -4.9366912105995375 -0.76780311692188941 -4.5440320720282363 -4.7656345628680548 -1.1386164305629416 -4.1271941951567479 -5.4267739339851513 -0.76772485892079678 -3.9655939829618196 -5.2404119998476881 -1.1385402113794285 -5.2338436957056107 -4.3621277608823181 -0.76787045334427129 -5.0287997012325629 -4.2232974104703347 -1.138680362678087 -6.0761984300440011 -3.0851233670274358 -0.76798287259395248 -5.8418244728162803 -3.0005414244290862 -1.1387880227890108 -5.7144328592048366 -3.7620078623268616 -0.76793415898285478 -5.5030449040801024 -3.6344167124406539 -1.1387431529090735 -6.6160247323779044 -1.6599382548708137 -0.76805824629743713 -6.3691110680984071 -1.6244995470252634 -1.1388602838865438 -6.3941321927377439 -2.3914930724519552 -0.76802631550725731 -6.1576443801381782 -2.3216794514357679 -1.1388307480760407 -6.8305135754879567 -0.15657771050499636 -0.76809657051396241 -6.5812998904510378 -0.17133335380396325 -1.1388961845101371 -6.7559023504418354 -0.91422360181794859 -0.76808103269743866 -6.5090067599254642 -0.90543452448787365 -1.1388819308649574 -6.7870002020457418 0.59835345716196464 -0.76809995311957446 -6.5443526695067264 0.5464508690618417 -1.1388982355225949 -6.4899762444041595 2.0754002908929792 -0.76808624697274341 -6.7094179257319331 1.3519668397066524 -0.7680998563225877 -6.2653886570868114 1.9663753831838564 -1.1388826040708611 -6.4708648444957735 1.2889761135016582 -1.1388979081342858 -5.8811589423144248 3.4499307191981914 -0.76804374266337827 -5.6825121207599825 3.2985220775555657 -1.1388389181374374 -6.2369609426497288 2.7842355247012325 -0.76806959742583891 -6.020423353919365 2.6662966009216409 -1.1388658740541566 -4.9885447841793633 4.6609142863404944 -0.76797641089738444 -4.8230085989115015 4.4739599755756334 -1.1387706317215003 -5.4677171456706732 4.0770028328386942 -0.76801289461010414 -5.2848998258441311 3.9111049493694026 -1.1388077795256821 -3.8498275491193934 5.6542624177947252 -0.76788811881732999 -3.7236800772615877 5.4388240545844342 -1.1386815199863862 -4.4357691816702234 5.173353374733721 -0.76793365651461087 -4.29685320332971 4.9683935584105008 -1.1387274012851909 -3.1839037439496716 6.023510236980167 -0.76783563166597668 -3.0972560790011903 5.7902497692292902 -1.1386283972699869 -1.7622291492501219 6.5852285066287894 -0.76772239412790921 -1.7266641923972617 6.338360160385486 -1.1385143281129548 -2.5005252759921772 6.3612277107709323 -0.76778156137621412 -2.4259814952072256 6.1261829514066939 -1.1385742294300927 -0.22817762523252672 6.8237950860234173 -0.76759747252084665 -0.23716020714931985 6.5751557671009264 -1.1383884523031993 -1.0070689319591941 6.7470383621152017 -0.76766126690694581 -0.99015374101696352 6.5009493430074459 -1.1384528575708084 0.55757914177507106 6.7913958245202162 -0.76753168752480194 0.52070869098344652 6.5472733007923489 -1.138321671084062 2.1054840228337408 6.4813285273271086 -0.76739824118969557 2.0221522598744825 6.2489527207078828 -1.1381863797059233 1.3458990386006056 6.7116996692850677 -0.76746507827560562 1.2979718776075913 6.4685829968008255 -1.1382546519610797 3.5351194312177228 5.8362097283252803 -0.76726773761687006 3.4136102011719154 5.6215873206554514 -1.1380549788620342 2.8430791114890912 6.2060644014849125 -0.76733217370067164 2.7459789337418119 5.9783946211400671 -1.1381200282198862 4.7670679711357442 4.9021412466480863 -0.76714576540291257 4.607738858624721 4.7139399665926609 -1.1379326398602583 4.1692976767230476 5.3926669032811949 -0.76720591933282711 4.0228848556061543 5.1938653512763064 -1.1379929629860461 5.2658460632635249 4.3239502148481819 -0.76709057947478465 5.0765017701553035 4.1660138673789238 -1.137877454306931 6.0929656139900441 3.0551555629281211 -0.7669894145881474 5.874352574264103 2.9411124010373686 -1.1377765702693121 5.7354269487926652 3.723996329112139 -0.76703693169159626 5.5361954735814418 3.573692936790926 -1.1378239977729561 6.6212871477187125 1.6452309835593921 -0.76690551433997034 6.3847644228547562 1.5755704637083527 -1.1376933535064355 6.4020865641050433 2.3677485137538881 -0.76694478281719303 6.1743634270749563 2.2690802861266723 -1.1377323400929917 6.8313281477706278 0.1568187785042352 -0.76684194284308804 6.5857861989079787 0.13436650140466189 -1.1376309670391496 6.7574157962356507 0.90706165867086908 -0.76687169148741163 6.5138278935555416 0.86477215099305171 -1.1376603422740954 6.7883021463338249 -0.59381310972826051 -0.76682071572840271 6.542173790620585 -0.57730438813274942 -1.1376112630621502 6.4929738410020779 -2.0684767258940431 -0.76679486892582682 6.2577955344305476 -1.9943714799643124 -1.1375882840315459 6.7126500542729808 -1.3442852281104642 -0.76680188576360386 6.4636706363578531 -1.3156810423605132 -1.1375931647349795 5.882232021482463 -3.4496817668077271 -0.76679702928654048 5.6666648860394835 -3.3299264506649928 -1.1375938744331315 6.240398584896103 -2.7796077946488125 -0.76679097698534515 6.0073867452495557 -2.6924924153374024 -1.1375855601576201 4.9806848769393817 -4.6716935327083773 -0.76682974087564071 4.7938107281427627 -4.5107323269605999 -1.1376309058702982 5.4648112129825988 -4.0818048982577801 -0.76680969397638743 5.2615990238857266 -3.9407537603628366 -1.1376088477355426 3.8271442087049876 -5.6737325360275861 -0.76689490879906363 3.6770499631613021 -5.4779357167683393 -1.1377011732896003 4.4195715097823145 -5.1875698469628011 -0.7668602293658946 4.258815963071461 -5.00052363648006 -1.1376652092752233 3.1522207999335072 -6.0411175180876082 -0.76694385149005739 3.0445244807162868 -5.8190935468861671 -1.1377555079610966 1.722385109985058 -6.5977751520402625 -0.76706028480446187 1.6641190910048811 -6.357775689828685 -1.1378772703295954 2.46097540680866 -6.3737705816680581 -0.76699646580152314 2.3646183281352631 -6.1453285715897978 -1.1378096298173213 0.19909857905718242 -6.8269202470523824 -0.76720667139664289 0.19208418215237788 -6.5798365378877888 -1.138027516150105 0.9690791273936239 -6.751134901744666 -0.76713016572471937 0.935564565898239 -6.5066624949741625 -1.1379491187769262 -0.5265877257823639 -6.2676308837625836 -1.4775023167467611 -0.49399255821885341 -5.9000263035770697 -1.725272927572872 -1.9175277144815881 -5.9901969461112108 -1.4776199215603008 -1.790966548622104 -5.6429525966273442 -1.725391568235074 -1.2437310147579295 -6.1946831745144459 -1.4775606610567447 -1.1733942705362386 -5.8303834991410994 -1.7253322011071535 -3.2130436398187312 -5.4132971622001085 -1.4777339445622533 -3.0013153082145596 -5.1080309458629047 -1.7255041950539798 -2.5764262829882298 -5.753670873946457 -1.4776779021004542 -2.4314985866692727 -5.4126965835719485 -1.725449568136836 -4.3490991613949381 -4.5659539043011481 -1.477835171233649 -4.0788814655428522 -4.3103286534645999 -1.7256030519537859 -3.7920908162353069 -5.0231739506010795 -1.4777858077825199 -3.5653569473934188 -4.7318590067663813 -1.7255554730745026 -4.8142916609917599 -4.0464013195773987 -1.4778766618518204 -4.5208381566153779 -3.8222805483844873 -1.7256432373438935 -5.594703155569686 -2.872987773127984 -1.4779457231534823 -5.2531319594009265 -2.7292031384767697 -1.7257090558783992 -5.2647834256886687 -3.4903166368957237 -1.4779164585892399 -4.9506865871528074 -3.2951243893993647 -1.7256819134600914 -6.0976505786850037 -1.5613964042973592 -1.4779910424843579 -5.8903340104179902 -2.244925535501936 -1.4779719429672382 -5.7287998941396658 -1.5061191354457528 -1.7257515104847096 -5.5430253653284209 -2.1186211631905962 -1.7257348504310839 -6.3014354800667922 -0.17560802147240218 -1.4780127299378751 -5.9286603257629542 -0.19569286211616652 -1.7257713444057434 -6.2316789775195582 -0.88398815274307907 -1.4780041433800333 -5.8645061699870356 -0.8471668319167821 -1.7257643754626408 -6.1987339826750203 1.2183619767589329 -1.4780121933766424 -5.8371240134726348 1.1251072426433568 -1.725769330282714 -6.2682804355402633 0.51222580045347166 -1.4780134563013161 -5.9027471370109179 0.45879078217741487 -1.7257715484573788 -6.0014856995060573 1.8783544794850733 -1.4780017711111231 -5.6582764895055533 1.7385694443115054 -1.7257581760051235 -5.4454999582920092 3.1520461785218616 -1.4779714051207389 -5.1437123263099078 2.9338578955360761 -1.725726456523266 -5.7768795510115227 2.5320208405249378 -1.4779896753674304 -5.4433308865402354 2.3732496151706934 -1.7257458835119281 -4.6257554288308409 4.2760203102464374 -1.4779248240243887 -4.3770732754981658 3.9973748744426714 -1.7256788835183348 -5.0748131015349038 3.7287829059030706 -1.4779499744311249 -4.786115669270079 3.4988940420860537 -1.7257049652278047 -3.5771409304986457 5.1994271577259505 -1.4778644921252373 -3.3878582982178256 4.8774082916383357 -1.7256178017636947 -4.1262603334841623 4.7487166094753217 -1.4778955810238497 -3.9005835680835599 4.4565644819966872 -1.7256494898848354 -2.9727868013167553 5.5415568661417325 -1.4778288347737678 -2.8239419665738756 5.2027078789614034 -1.7255818195798516 -1.6595417252513132 6.0682505843618104 -1.4777519914765795 -1.5978410794633333 5.7013613799437524 -1.7255041262169848 -2.3429191730910115 5.8608877187640971 -1.4777922012030722 -2.2204997051843138 5.5124163304158733 -1.7255450023791004 -0.23439980804475524 6.2961623294757532 -1.4776670577593687 -0.25253506980721951 5.9235903953269489 -1.7254181863579858 -0.96829503300671405 6.2238151039640925 -1.4777103924101183 -0.92622164213446989 5.857171888485146 -1.7254624003467764 0.49553020544612925 6.2705109405508024 -1.4776218151336795 0.45248721203872616 5.9039656055665333 -1.725372230813812 1.9530261606706425 5.979568286124449 -1.4775301796434315 1.8376596933465592 5.6289649426089525 -1.7252781304715619 1.2429816622816423 6.1948861657738314 -1.4775762881752981 1.1698064067807101 5.8314818868024512 -1.725325762547812 3.2897354054508359 5.372798827757209 -1.4774412723589689 3.1067777562243304 5.0521939982785984 -1.7251880525184016 2.6360125050059526 5.722147201305515 -1.477484969683714 2.5026788238654061 5.3750164578190578 -1.7252325494915692 4.4301388662991013 4.5003636801705929 -1.4773590627115165 4.1881269714117693 4.2216318283525727 -1.7251055075357538 3.868379109762988 4.9613099490556065 -1.4773995707051928 3.6570586397718179 4.6573898213926208 -1.725146261732601 4.8804607898218819 3.9670757284150464 -1.4773222060809119 4.6016183680413452 3.7251986737161786 -1.7250686039243639 5.6405619580533157 2.7893748741520819 -1.4772548369651213 5.3115206794159464 2.6222019951289761 -1.725001210748125 5.3080768642886946 3.4113106078154933 -1.477286526860994 5.0103390490174533 3.1855727164879877 -1.7250330118983412 6.1229069080420384 1.4821983101908023 -1.4771995776374018 5.7663935356253981 1.3863212754186336 -1.7249462268686462 5.9174163950670042 2.1594766334660016 -1.4772255216508072 5.5781344400041553 2.0067955791879823 -1.7249721025063816 6.309770506025794 0.10395897043680469 -1.4771586570716717 5.9414162546180185 0.079330143121092322 -1.7249059185233271 6.2404995774057834 0.8069854996676753 -1.4771779401450533 5.876397889404978 0.73918313334337804 -1.7249249737731045 6.262817916720552 -0.58086843672924171 -1.4771460329693944 5.8940205903906939 -0.56072685460925031 -1.7248940426779238 5.9835147343563548 -1.9420592141785376 -1.4771320466416715 5.6304855303507786 -1.8346808773139067 -1.7248817242597265 6.1851815304640194 -1.2772375238197009 -1.4771350399588987 5.8150773416378785 -1.226153152946061 -1.7248836876030837 5.4135835192924064 -3.2143904487733099 -1.4771381165551711 5.0945311623373026 -3.028511570034166 -1.7248902005505382 5.7484508057873134 -2.5879169757681355 -1.4771320538341621 5.3970279320107046 -2.4626045858241619 -1.7248823934642665 4.5766322342434655 -4.3376584654125647 -1.4771660692396391 4.3012332560419111 -4.0915655029107532 -1.724921011276447 5.0289575461200142 -3.7865360673929005 -1.4771500585251547 4.7202818608163968 -3.5809950716592951 -1.7249032193511245 4.0622683489968177 -4.8025915088968754 -1.4771907496865764 3.8148608933300436 -4.5282674750955536 -1.7249476806983843 2.8925346440589443 -5.5854223152638323 -1.477254598331182 2.7220310061778235 -5.258135824878762 -1.7250160948447057 3.5090135117122156 -5.2559707690211876 -1.4772171319956133 3.2886329099454432 -4.9553486665992263 -1.724975907460929 1.5747996471786856 -6.0945973761295162 -1.4773404288963359 1.4918509516028506 -5.7341316815867795 -1.7251067086546314 2.2635813149585511 -5.8857292994248178 -1.4772944528511776 2.1089074243948818 -5.5470269116668076 -1.7250570660147984 0.17252842859404804 -6.30258899638571 -1.477444642525833 0.16571199329602559 -5.9324469598767111 -1.725214232913463 0.89062255986345873 -6.2319431055987335 -1.4773910492908657 0.82739227057810294 -5.8673608692124377 -1.7251582873725027 -0.45425654383054892 -5.4994616873316193 -1.8917514815400807 -0.43479493958602367 -5.0639907192412057 -1.9787533180957986 -1.6697622095107907 -5.2590403086049404 -1.8917936593100113 -1.5411547946940165 -4.84318009374278 -1.978796404973054 -1.093878581425404 -5.433842639671874 -1.8917726308274454 -1.0091990687266674 -5.0046580457523406 -1.9787751843867585 -2.8028823327473273 -4.7575984389171468 -1.8918331079533506 -2.5731273086792021 -4.3868391864869505 -1.9788358659600025 -2.2531146469650247 -5.0515638335833275 -1.8918139920358663 -2.0829876186593395 -4.6489317149178602 -1.9788169331004153 -3.7982410888699363 -4.0198012937876015 -1.8918670380877602 -3.3002929029456829 -4.4285634891759562 -1.8918505554182083 -3.4813437106877871 -3.7167715410775743 -1.9788690960779125 -3.051982779492687 -4.0692412452955704 -1.9788532910521794 -4.2344737931782461 -2.8503180886974198 -1.9788949127335782 -4.6074752882146726 -3.0819479134439214 -1.891893709207944 -4.1995521223459766 -3.5791074979607429 -1.8918805514106685 -3.8703488742746952 -3.2941038383587591 -1.9788824544260863 -4.8892399711793191 -2.5558589287017019 -1.8919027763230218 -4.4996945218830362 -2.3612705900942106 -1.9789036326649394 -5.3374276705865764 -1.4092304366854387 -1.8919168527739325 -4.9109392917954402 -1.3157095412980757 -1.9789166882176052 -5.1587388741020233 -1.9983850368979454 -1.8919112490682779 -4.7503241332489834 -1.8452725046600058 -1.9789117133009129 -5.5241569069379777 -0.19477020322033789 -1.8919229348970117 -5.0855577504161085 -0.20721689527528175 -1.9789218863382794 -5.4620111494319969 -0.82586139846641404 -1.8919206871951859 -5.0314112888481688 -0.75705242760129954 -1.978920372291636 -5.441924974537284 1.0297576150145313 -1.8919215127586235 -5.015050627358753 0.92319288307252889 -1.9789198262524539 -5.5043546095869473 0.39584520250019239 -1.8919225646200319 -5.0702109191076312 0.36305793039074341 -1.9789214545113298 -5.2799967406640249 1.5985459242301592 -1.8919173700820064 -4.8663040353799847 1.4628714165865837 -1.9789155768711195 -4.8001692735586268 2.7224662286866383 -1.8919058153632324 -4.4299325601336017 2.491787842839611 -1.9789034628644462 -5.0848178927314152 2.1898517890965188 -1.8919128187157253 -4.6896301539248899 2.0058502733003323 -1.9789107691520169 -4.0869759097351332 3.7162176437692285 -1.8918887129904196 -3.7811410249818422 3.4027767565044749 -1.9788858983858044 -4.4823773698850209 3.2343464927895598 -1.8918979791956263 -4.1308748282606418 2.9765490224467075 -1.9788955175976772 -3.1714545271240642 4.5341926531428589 -1.8918668956718592 -2.9469894832628891 4.1553395901596764 -1.9788637088102234 -3.6648397563281483 4.1292091189899836 -1.8918781345184872 -3.3755646333562241 3.8035420659128949 -1.9788752949001565 -2.6578421254955549 4.8350048467407971 -1.891854119464043 -2.4565589520726085 4.4490608787439037 -1.9788509184159888 -1.5088841372321078 5.3076697645839959 -1.8918266289328125 -1.4104920066363369 4.8826764034431358 -1.9788231469038287 -2.092848545427489 5.1304504934778841 -1.8918410896819899 -1.9475744767117309 4.7196779325580325 -1.9788377377591915 -0.2524760011575643 5.5191106430837324 -1.8917961757697566 -0.26682955369187134 5.0803373457375729 -1.9787924083693089 -0.9009803737299803 5.4551599817249645 -1.8918118014542715 -0.84243181844711768 5.0235657136135883 -1.9788082730812113 0.39900715986090551 5.5047625883164502 -1.8917794661982044 0.35872420887709167 5.071371214247856 -1.9787755600819334 1.7325688553733263 5.2402396220546787 -1.8917455551126143 1.6130819588588756 4.8216556107690609 -1.9787400987030088 1.0880901492297295 5.4356497724590493 -1.891762831947573 0.9994544607435093 5.0077033463658163 -1.9787581029631598 2.9251744228352781 4.6929107625663837 -1.8917134519149958 2.7108256563758544 4.3139666969109873 -1.978707395694876 2.3368942291372141 5.0072639978652722 -1.8917291542650503 2.193514867614371 4.5903846354088564 -1.9787233376981561 3.4184268451609445 4.3325964773836825 -1.8916986752841338 3.1799465518970806 3.9652637924732312 -1.9786926516831422 4.3032261800687568 3.4544302776291027 -1.8916713346231055 3.9810170170686812 3.1609673497823834 -1.978665243063821 3.9227665101146281 3.9179194705411873 -1.8916843006408695 3.62830823107369 3.5906415981205537 -1.9786782591205632 4.9654973517421714 2.4158992114847164 -1.8916476458104161 4.581724802769326 2.2105847420385549 -1.9786415104359985 4.6749682158063344 2.9593222532701988 -1.8916588336596811 4.3211100264877169 2.6980413229076836 -1.9786527576799131 5.3831060838118923 1.2636207911012041 -1.891628380020371 4.9608612195718029 1.1562133884787786 -1.9786222691945183 5.1992148173470758 1.8696725229546141 -1.8916374621099949 4.8007957173548608 1.6837216074131498 -1.9786313799581234 5.5400131304050939 0.049527967529305661 -1.8916143995674195 5.1047777824589238 0.028072643381312296 -1.9786084276444957 5.4777252826742133 0.6816081904850011 -1.8916210391702786 5.0490694835323398 0.59335180640119445 -1.9786150237520876 5.4917834481661654 -0.53941474095371444 -1.8916104305572132 5.0559879935821348 -0.52363746959084145 -1.9786046311411829 5.2402125240910626 -1.7350545045813608 -1.8916065192414346 4.8213940602246694 -1.6163390488344267 -1.9786011467187192 5.4156810337431631 -1.1566025887253273 -1.8916070855196936 4.9813539827344488 -1.0890157008896795 -1.9786015036784923 4.7336186512695146 -2.8501117705045118 -1.8916101439547661 4.3553817140333928 -2.6344253908126589 -1.9786054698536952 5.028109907776626 -2.2991877167937598 -1.8916072857208481 4.6155107166397107 -2.1477933664460371 -1.978602161815348 3.9938153638314673 -3.8318374365991894 -1.891622011171973 3.6730090454653821 -3.5366464607682317 -1.9786182878233673 4.3992219390161047 -3.3378993883380739 -1.8916155072713456 4.0289748387346531 -3.1029575655581856 -1.978611100984633 3.5490036817675863 -4.2258651936985983 -1.8916321828837976 3.2484097257476345 -3.9094900812706692 -1.9786289084210904 2.5226796591965321 -4.9083662294161812 -1.8916574790573377 2.3098038769259377 -4.5286107190175935 -1.9786556742613401 3.0539808846768457 -4.6244630435371299 -1.8916428067825011 2.7988933448562663 -4.2672739923358174 -1.9786403313140681 1.368695199180725 -5.3509062096476372 -1.8916907145317783 1.2570761652410378 -4.9299074691805922 -1.9786906211244233 1.9664019492216269 -5.1696866317686441 -1.8916729681799087 1.7884027807481433 -4.7688297016797145 -1.9786718004741348 0.14246254864994712 -5.5302781918329016 -1.8917301031633516 0.13732525750638333 -5.0933978132021833 -1.9787316590220649 0.78411313587161791 -5.4671813597203265 -1.8917101652443005 0.69304840724720773 -5.0387705271564158 -1.9787104416663568 -0.37101580397406286 -4.6329005866302797 -1.9342480159363875 -1.3909039944235 -4.4339030644826867 -1.93420424177507 -0.92165324028337314 -4.5763619429280986 -1.934225896862704 -2.3427503084429491 -4.0164315672541253 -1.934164756967476 -1.8923072171491788 -4.2573055074453192 -1.9341836344486492 -3.1806254423154998 -3.400484368355257 -1.9341320028253866 -2.7702372012393681 -3.7373825029569492 -1.934147640177198 -3.8639662508042583 -2.6156749147431819 -1.934107122308093 -3.5146629670669052 -3.0413985953117839 -1.934119345480622 -4.0984587216052502 -2.1885906732272828 -1.9340990266711342 -4.4832207406175879 -1.2263003410611524 -1.934086746395292 -4.3373749715790186 -1.7071665792155597 -1.9340912239023145 -4.6484947669892014 -0.20422297604173856 -1.9340822265888911 -4.5974108306121311 -0.72295035125524065 -1.9340834699438494 -4.5869801829201702 0.82892967864475642 -1.9340849428878377 -4.6398656542743772 0.29188238488899926 -1.9340831386975739 -4.4617890557300406 1.2969999163098418 -1.9340895765530759 -4.0658084918249537 2.2497073486052308 -1.9341020786416412 -4.2975373679660445 1.816092281127218 -1.934094462528511 -3.4717541183107086 3.0936880413580692 -1.9341199620492879 -3.795607079831357 2.6989948180758772 -1.9341101670744014 -2.7065322642875635 3.7896299722693736 -1.9341424146039436 -3.1164902087865962 3.4531106533336016 -1.9341307450093319 -1.8034472449036072 4.3047169439343635 -1.9341686144679937 -2.2905480280766195 4.0442810281293875 -1.9341553722704645 -1.3353018948187099 4.4506598650174123 -1.9341832190996908 -0.29036120141913896 4.6406724258906751 -1.9342138138036844 -0.81128877769786911 4.5892862436368933 -1.9341980412029343 0.90217363773438941 4.5805925861809875 -1.9342493048889089 0.28297867521009329 4.64148792160396 -1.9342313937476634 1.5070791855028429 4.3990003759430483 -1.9342690186772495 2.513931552875444 3.9257097272131123 -1.9343016232803589 2.0170884511646601 4.191187781294115 -1.9342857380793692 2.9067958852384654 3.6264032993270039 -1.9343163000485371 3.644278813841944 2.8852306323202228 -1.9343437044765948 3.3294273016506977 3.2687754119981012 -1.9343306570926695 4.1965946099067164 2.0078402097926582 -1.9343674481690936 3.9540497544671576 2.4614900237249202 -1.934356170508033 4.5432493594901358 1.0335818697079988 -1.934386676038597 4.3886390782016926 1.5431064443044822 -1.9343775541927986 4.6695092998369834 0.0071013160884727533 -1.9344004354405899 4.6155033350678547 0.55509697956727488 -1.934393850876426 4.6233219972916695 -0.47623508051719399 -1.9344040835482084 4.4064132480352063 -1.4850253094061932 -1.9344072868812086 4.5525711452364135 -1.0032028454278159 -1.9344070287963908 3.9743450178765869 -2.4240122598862359 -1.9344025272328638 4.2208336282624277 -1.9629007608575515 -1.9344059432861813 3.3464169231101555 -3.2485336764449242 -1.9343890073265875 3.690737000275055 -2.8290361656235938 -1.9343963258155923 2.9792115357250979 -3.5673700715972032 -1.9343776016968166 2.1145976630415011 -4.1394310161909988 -1.9343497245191184 2.5527691131292367 -3.9053143499284357 -1.9343657395742331 1.1443207705824987 -4.509274147200756 -1.9343134329194649 1.6392109862753264 -4.3592521512354967 -1.9343328102540387 0.1148820234903915 -4.6582426158600612 -1.9342709015487376 0.64990928753903154 -4.6056553606612356 -1.9342924498988816 -0.37097027623533724 -4.1959325648838321 -1.8463136694950819 -0.31408759317114027 -3.8307708914464178 -1.5985769989781995 -1.2831213713007308 -4.0121911856681747 -1.8461851646847545 -0.83556333423756501 -4.1480530778811708 -1.8462472597941058 -1.1379397230331949 -3.6706454528741168 -1.5984457427099221 -0.76116780067822154 -3.7850373995166215 -1.5985096288366123 -2.1340931437280473 -3.6349325645347519 -1.8460715710893156 -1.9224070229398706 -3.3296965712189386 -1.5983325763994278 -1.721553632150487 -3.8555300617393331 -1.8461251793344808 -1.5610621688496047 -3.5229292918480288 -1.5983857926250233 -2.8837492382174759 -3.0816668081942233 -1.8459795469230529 -2.6148401690989056 -2.8250265802967678 -1.5982422799788003 -2.5221165453056988 -3.3785345333294896 -1.8460228550425062 -2.2853873188387146 -3.0954829894630134 -1.598284549244793 -3.4964041824990129 -2.3782299462951904 -1.8459112522220369 -3.1813988609927439 -2.1804440281518618 -1.5981761484695931 -3.1996564108057326 -2.739894541810775 -1.8459437894920623 -2.9006657741626225 -2.5225927948776983 -1.5982078854756097 -3.7222835816579432 -1.9700925986753841 -1.8458885427160716 -3.3782593720195981 -1.8309921393606592 -1.5981552491021442 -4.0654787515032114 -1.1057688571344546 -1.8458563769456935 -3.6979883869370935 -1.0461572801178125 -1.5981251568534254 -3.9298351984861171 -1.5529861257179982 -1.8458681490141529 -3.5813355393439168 -1.4307612421637828 -1.5981351084187276 -4.2132677124928462 -0.18785702891418499 -1.8458459891544106 -3.8411253183110028 -0.20195533197871032 -1.5981161983324497 -4.1674999320783064 -0.65257857359444393 -1.845848191933132 -3.800177449094273 -0.61772220938097389 -1.5981172634145742 -4.1588573607439727 0.74044319823349125 -1.8458557683116945 -3.7966828874929082 0.65335203561549893 -1.5981270655857345 -4.2045827152226574 0.27608438428583282 -1.8458490886846755 -3.8391551903679533 0.22201267863585503 -1.5981197719367797 -4.0401107985211784 1.1894609814401131 -1.8458690826389583 -3.6970142512283122 1.0494494966545682 -1.5981409284898431 -3.6822570885908719 2.0450327379179765 -1.8459062154281007 -3.9019613140036324 1.6339253178567457 -1.8458841474404246 -3.3807793572108387 1.8263521685277317 -1.5981788568873923 -3.5665466655741525 1.4787337618349836 -1.5981559999466062 -3.1478005474875199 2.8031152890466182 -1.8459583544610405 -2.8964877428657476 2.5277388994048726 -1.5982313797038572 -3.4434872129361724 2.442753276919428 -1.8459299154438191 -3.1552084946031527 2.2124188971298944 -1.5982024779756148 -2.4612288648112295 3.4285044711448451 -1.8460232234401552 -2.2698530067868838 3.1082545491209652 -1.5982964237520412 -2.8217554890471659 3.1325626845493066 -1.8459893672061558 -2.5971031052581464 2.8396216851035847 -1.5982623514292871 -1.6533604616221669 3.8919349325149963 -1.846098451511583 -1.5312007442799844 3.5388665635258945 -1.5983715860169272 -2.0653869640902167 3.6716375136300323 -1.846060161275789 -1.9185900892771521 3.3317379091600632 -1.5983332540315316 -1.2078415341999842 4.0349566818395877 -1.8461399372753948 -1.1520463750339758 3.6663146669415574 -1.5984126026214862 -0.28079116903768642 4.2046844670618553 -1.8462268298966975 -0.3343557596447998 3.8286554209737229 -1.5984973318299085 -0.75555376269526564 4.1578575410241987 -1.8461821341401372 -0.72080240525603567 3.7905295130148797 -1.5984544110343815 0.80259255269733698 4.1534469115366566 -1.846330661532942 0.23150583695847016 4.2096116690435981 -1.8462756206084259 0.40207408428037805 3.8221016821184666 -1.5985747964328052 0.14540548148518315 3.8473373979437708 -1.5985454399631103 1.4013595271426826 3.9766435695794575 -1.8463904670872087 1.3298139518864867 3.6127954593234932 -1.5986734562379024 0.93395022305672626 3.7328118662722654 -1.5986300602153316 2.3109993045658039 3.5410726395350887 -1.8464851091235037 2.1303137184225425 3.2192965642647171 -1.5987639074348077 1.8878862549480235 3.7671560461071403 -1.8464405628888534 1.7325617275782195 3.4318253628938988 -1.5987200483050921 2.6796183738688035 3.2502466143342863 -1.8465265479826314 2.4368282220056616 2.9722006697878762 -1.5988046046434639 3.3299748748556546 2.5826518037041897 -1.8466043229074975 3.0317145463498463 2.3644921594767192 -1.5988820428692827 3.0334475421468201 2.9438840698020936 -1.8465671238435455 2.7754307630045463 2.6766877815181624 -1.5988449557102447 3.818617554003044 1.7923396366311686 -1.8466719541909513 3.4826199684431201 1.6382567907462413 -1.5989495390014685 3.5987094585323227 2.203656927432085 -1.8466397285026224 3.2844456104797493 2.0089130548725733 -1.5989172931513886 4.1246174083347045 0.91528035612143599 -1.8467267098212374 3.7647139322882675 0.83070295843155861 -1.599004221068888 3.9893025057568483 1.361219936155355 -1.8467006179330654 3.6380816505287479 1.2480195477279226 -1.5989780851714441 4.1882581687673204 0.45547347699422019 -1.8467469450647604 3.8200949362711936 0.42928029715833693 -1.5990243685618826 4.186706743449311 -0.47166373763011177 -1.8467757944610506 3.8219402754293257 -0.41098179189670464 -1.5990531628486948 4.2323680968095081 -0.0079007214450749919 -1.846765560016282 3.8607103332333748 -0.017185218336140545 -1.5990427931417481 3.9845940380978302 -1.3771707602470615 -1.8467842470912263 3.6388257929619998 -1.2459942820303853 -1.5990614720235432 4.1199390572444727 -0.9309953870744857 -1.8467837326969507 3.7582906688910742 -0.85216833944840853 -1.5990608824186403 3.5908454911408292 -2.2187793723687896 -1.8467694929953797 3.277645281202922 -2.0220436451177188 -1.5990464475115913 3.8108120488458077 -1.8072835156858615 -1.8467798197283414 3.4791828102892417 -1.6450260934533183 -1.5990567797883626 3.0231500622043503 -2.9568118275417525 -1.846729083814399 2.754981638541353 -2.7019820728442321 -1.5990055181526566 3.3194264342068047 -2.5958499290856469 -1.8467511923416771 3.0364310944045219 -2.3590870143703038 -1.5990277077756891 2.6686616033435824 -3.259564874732356 -1.8466958854296198 2.4506245894836414 -2.9611996694160085 -1.5989714065253962 1.8889670789881754 -3.7668701802610496 -1.8466133746895688 1.7414754153773668 -3.4273429073528447 -1.5988870354257896 2.3013853757764795 -3.546506662906542 -1.8466599488195607 2.0969899401146592 -3.2373973954224899 -1.5989349747671309 1.0170414836414534 -4.0934047438178354 -1.8465058411626762 0.94068441529252866 -3.7309970905023597 -1.5987765627014805 1.4646584177057191 -3.9577107208249633 -1.8465630812357234 1.3417245815683978 -3.6094348039009412 -1.598835619991773 0.094064738854085062 -4.2233043574244915 -1.8463798041907242 0.092383054917563379 -3.8527107718800995 -1.5986464156095037 0.55956768187775963 -4.1775529631138939 -1.8464443795231902 0.52535081528807437 -3.8101664446865686 -1.5987127491331652 -0.3025157860444922 -3.4926208575412661 -1.3193730927978393 -0.27666169912517996 -3.2474351154667938 -0.94861573343491712 -1.058488751202016 -3.3419610900496659 -1.3191712273307954 -0.97371909392795319 -3.1100383824965991 -0.94840743622911794 -0.69321706712563269 -3.4528319705567303 -1.3192675407629821 -0.64402335927948973 -3.2101189251468196 -0.94850592041407433 -1.7645514163151623 -3.0313396722587505 -1.3190001842683012 -1.6256228132190969 -2.8260459806195222 -0.94823663977957562 -1.4184354738871641 -3.2164023999531079 -1.3190796309637238 -1.3213982398336508 -2.9887164344179853 -0.94831493176386983 -2.3878126709829615 -2.5747463968705775 -1.3188671025301679 -2.2081225585990585 -2.4032772255637727 -0.94810611438305747 -2.0830299742415681 -2.8249284834318891 -1.3189291696335008 -1.9353980857784288 -2.6271478905466195 -0.94816595283681482 -2.8986482381071115 -1.9930371211188236 -1.3187716857616218 -2.6882676530775251 -1.8607632849668319 -0.94801316037294159 -2.6483569519742574 -2.2980653343903508 -1.3188169055649985 -2.4575716218754327 -2.1419128423300422 -0.94805669279163129 -3.0863491391108933 -1.6612703098977317 -1.3187409841976401 -2.8633694083929258 -1.5554385013563394 -0.94798349571186324 -3.3761851099420115 -0.94458530396707285 -1.3186988985022585 -3.1335824102566603 -0.89504178876144058 -0.94794336957403447 -3.2638909358602768 -1.3148024096157884 -1.3187132277309841 -3.0330275693185844 -1.2265563671407986 -0.94795633144841474 -3.5040471679160787 -0.18185611470499419 -1.3186882011265735 -3.2554309485916333 -0.19085275753990774 -0.94793386495449783 -3.4653620421805083 -0.57463817828708386 -1.3186889957047336 -3.2213965925559487 -0.5364071613234892 -0.94793353888781584 -3.463768800383666 0.59093310449128555 -1.3187064586284925 -3.2217290291826743 0.53316103741519072 -0.94795257769990038 -3.5024331786062812 0.19828572534170724 -1.3186944660655981 -3.2567744147696271 0.17725408426926503 -0.94794002163706614 -3.2570709871154717 1.337371498685862 -1.318751089633369 -3.0310746957963368 1.2330880900171282 -0.94799734981770944 -3.3715340195381001 0.95998317298669333 -1.3187273955436427 -3.1378505938867409 0.88104032691841105 -0.94797342733453061 -3.0792182780727875 1.6746733707907195 -1.3187850487038264 -2.8705295748662127 1.5421099995408705 -0.94803115384238046 -2.6395483914259015 2.308848380441455 -1.318864400991604 -2.4676783056054794 2.1296539683550764 -0.9481102671240319 -2.887126773158827 2.0071277401227476 -1.3188209837115579 -2.6869298795265193 1.862449696659068 -0.94806690082285905 -2.0735270065057776 2.8327557101464844 -1.3189621176623958 -1.9453594077085816 2.619008577493759 -0.94820749159405404 -2.3776749542211522 2.5831038811501688 -1.3189108994954384 -2.2152788739891633 2.3974475409434763 -0.94815651021486691 -1.4084455034624255 3.2217383035934706 -1.3190745290504287 -1.3262877185508128 2.986106162199142 -0.94831918725519826 -1.754831329999746 3.0365478879774241 -1.3190170562621508 -1.6419412142772389 2.81734278980265 -0.94826207278315078 -0.64720669184449264 3.2091081751699333 -0.94844102225518812 -1.0520321557744599 3.3438948429096906 -1.3191354889905074 -0.9963540235845092 3.103152739973781 -0.9483795010380407 -0.30920002513157285 3.4918877407246018 -1.3192611815148991 -0.31731194302382532 3.2433563174677116 -0.94850334069077402 -0.6789075713110716 3.4554321703854964 -1.3191974930314043 0.38121961767931478 3.4848739709544203 -1.3193802229875571 0.33482372240121766 3.2417121762629049 -0.94862399483440929 0.057726632387334706 3.5166977624623916 -1.3193241203414878 0.035958040748544216 3.2711091734671198 -0.94856607140666793 1.3048108139087451 3.2674992834549372 -1.3195442028980304 1.2298966652670043 3.0325958812853697 -0.94879327906710909 1.003009678968952 3.3590124499977332 -1.3194906588160928 0.93538443470617483 3.1218967954727144 -0.94873802622892178 0.70511574189734538 3.4493397445304566 -1.3194361987598979 0.64988059542010368 3.2084635765475533 -0.94868066153083197 1.6249400711768671 3.1064199569792903 -1.3196055836830924 1.5213545313993639 2.8822441607245022 -0.94885418297357427 2.2544440146635445 2.6849408636520464 -1.3197292503656637 2.0978448653668855 2.4945283996959771 -0.94897636595246782 1.9619982965259235 2.9248928261542386 -1.3196687592402772 1.8350952616457714 2.7101099245329183 -0.94891649513897114 2.7859866349585389 2.1314398696847041 -1.3198441954060784 2.5873856357917377 1.9848177461845407 -0.94909061147174179 2.5382601858823111 2.433237287710122 -1.3197887342175449 2.3695499048193347 2.2501935685613104 -0.94903548394892701 3.1875115459958203 1.4737069960889901 -1.3199448796079103 2.962579358435121 1.3715331809719484 -0.94919107999350472 3.0020463607021481 1.8206198503391937 -1.319896601224964 2.7962188890694932 1.6827036560432003 -0.9491428231380129 3.4382848008432876 0.7429115744366287 -1.3200266535735088 3.1975474238967658 0.68722308201399895 -0.94927294405943596 3.3239577213475204 1.1197076287707242 -1.3199874440469852 3.0919247041121913 1.035324313385146 -0.94923356231487133 3.4868789282021022 0.36545236095795763 -1.3200567157403196 3.2417798750678544 0.33874396731057604 -0.94930316833955097 3.4828533634715781 -0.40661773115721805 -1.3200999232726764 3.2383036711473125 -0.37433732656901242 -0.94934722240136404 3.5205840760102709 -0.023424758765122799 -1.3200842073125845 3.2722297754040364 -0.029767673533870217 -0.94933069325126551 3.3117650630510114 -1.1601880964584106 -1.3201125836449197 3.0809955446403734 -1.0716455307105488 -0.94936129806507119 3.4262449271079656 -0.78279645850614066 -1.3201116658826644 3.181875157228518 -0.73908467209057072 -0.94935896533740116 2.9812831749834472 -1.8597382674636633 -1.3200902955129175 2.772434672085851 -1.7274798828831786 -0.94934067003631994 3.1672628097879012 -1.5118166665836847 -1.3201057661059006 2.9411968410637495 -1.4117678643559095 -0.94935470112415477 2.5065453554714123 -2.4721337413181832 -1.3200289790896613 2.327891261366883 -2.3012124564286776 -0.94928132231214246 2.7568897722248438 -2.1671232632858257 -1.3200624430405825 2.5616226061315417 -2.0164438108833824 -0.94931358962052115 2.2145791201804186 -2.7178711858122178 -1.3199780798231 2.0610761636437016 -2.5249232532086299 -0.94923160198646428 1.5660257442636434 -3.1380951220725537 -1.3198506809825914 1.4631591809190247 -2.9135397986814877 -0.9491056116087867 1.9095234393607647 -2.9545459972874371 -1.3199225895049205 1.7682575122936215 -2.7505148494119922 -0.94917657581350379 0.84195311218445368 -3.4080012947628018 -1.3196818700516064 0.79133397719603671 -3.1657310452253133 -0.94893521233998257 1.2192655043172149 -3.2936072108755341 -1.3197716391024004 1.1266660431421951 -3.0640724964926194 -0.94902633763301403 0.076553293567078962 -3.5149479774727332 -1.3194804846496762 0.075743912359831203 -3.2672987671698381 -0.94872794433310348 0.46864832294378911 -3.4763985288060875 -1.3195830635442192 0.43426081852436377 -3.2320590849978319 -0.94883442939468654 -0.26801792072644393 -3.081848985512289 -0.54419163612335486 -0.2630536902650164 -2.9953502402182948 -0.10687504055593078 -0.9317627369153858 -2.9497684977745235 -0.54393658523989707 -0.90582072432877903 -2.8671698599387199 -0.10660116158292242 -0.61052007284195975 -3.0472412419984014 -0.54405670130403216 -0.5928076655236133 -2.9621469752375713 -0.10672511856837487 -1.5522744481444222 -2.677621507776772 -0.54373226128081176 -1.5069932280867624 -2.6036599908009905 -0.10639119508401029 -1.2525944047399309 -2.8378246880024283 -0.54382519526233219 -1.2178930715945899 -2.7582084078293008 -0.10648548421428039 -2.1009047250701385 -2.2772761296673414 -0.54357892598215007 -2.0390100209978033 -2.2160759951808964 -0.10623647383625436 -1.8350569959827685 -2.4954696943353745 -0.54364910573647751 -1.7850884925471759 -2.4244821348328025 -0.10630725847977146 -2.5515106828888885 -1.7667152546042053 -0.54347092448240453 -2.477402377410816 -1.7205489055799414 -0.10612752112379968 -2.3320616318701424 -2.0341303632494756 -0.54352113090822252 -2.2677192332236489 -1.9760644230011575 -0.10617837067979058 -2.7190019556379355 -1.4747325333530961 -0.54343568460266301 -2.6427627423346398 -1.4337114232421801 -0.10609185566285624 -2.9761261611571994 -0.84449971469722906 -0.54338894946020522 -2.8922445413262654 -0.82278056244376196 -0.10604389949121937 -2.8777806454129538 -1.1687121320694025 -0.54340464035852232 -2.7965846993487493 -1.1381398316091298 -0.10606007679463661 -3.0910353627830491 -0.17310397202159028 -0.54337805807648387 -3.0041561144213511 -0.17194318066151926 -0.1060318162225799 -3.0574631618765684 -0.51396782308662625 -0.54337784762522756 -2.9718478526721426 -0.49997531564488396 -0.10603223636513393 -3.0580753286251934 0.50779787819213895 -0.5434003711987454 -2.9730100536880282 0.48821734862696975 -0.10605306133302755 -3.0919984588604268 0.16334026655576431 -0.54338537297651524 -3.0053120797209898 0.16022053385912124 -0.10603878092280714 -2.8785904129782387 1.1660757168369189 -0.54345307723921243 -2.7992629389877557 1.129341453171661 -0.10610494110435091 -2.9791154406128837 0.83466971842365634 -0.54342463841120081 -2.8957056318904133 0.81139347507211212 -0.10607703934028249 -2.7239965838136553 1.4654120858634025 -0.54349246664320394 -2.6485142305600893 1.4229730314923568 -0.10614397337396216 -2.3391072127422508 2.0255653560607629 -0.5435854114454578 -2.2757714795071569 1.9662707516183278 -0.10623611725663126 -2.5543477779053889 1.7632780683843523 -0.54353445548306145 -2.4842954223741116 1.7121677958935193 -0.10618549459914496 -1.8432362716294863 2.4887700656142635 -0.54369959462160122 -1.7956857787537328 2.415795997811744 -0.10634955345698767 -2.1076885275935324 2.2717243360693713 -0.54363956755766807 -2.0491360004347889 2.2077795147812989 -0.10628995720098137 -1.2611763950408461 2.8332387360605757 -0.54383061917668296 -1.5640924167684329 2.6713116660105927 -0.54376342104453179 -1.2323354390476315 2.7504875342913011 -0.10647983815511654 -1.520081051909502 2.5966693357698389 -0.10641317042378756 -0.62428969637792608 3.0430470090717998 -0.54397324810292591 -0.61323879551711136 2.9559278818461943 -0.10662177493827345 -0.9498274124851811 2.9442813190565791 -0.54390120273876441 -0.92504122102141884 2.8613288477029748 -0.10655021791530635 -0.30501573608255822 3.0781761174517257 -0.5440463394513998 -0.30068021692865859 2.991608457672585 -0.10669459360019438 0.31448138488535426 3.0772720621407292 -0.54418825985408359 0.30274487515762327 2.9914333428893674 -0.10683654708241402 0.020939745689836024 3.106169720693329 -0.54411953896101117 0.014241804818646878 3.0198346716169988 -0.10676745362640687 1.1789164898594078 2.8748895537812449 -0.54439257678644204 1.1499320426506063 2.7932108434028451 -0.10704272323919718 0.89341671218074881 2.961480966488454 -0.54432490836402048 0.87081472190222087 2.8778659866222087 -0.10697422167769428 0.61283274546900335 3.0465810515005085 -0.54425659825231243 0.59403041629491649 2.9618133544375693 -0.1069054155742082 1.4612212403450799 2.7264548945096552 -0.54446483921728539 1.4258313257708743 2.6472043859309178 -0.1071149576951571 2.0051014825864395 2.356163309908843 -0.54460785575552495 1.9521824859545831 2.2875950522430211 -0.10725778712157241 1.7482691684579856 2.5669220598194888 -0.54453724146194249 1.702858995925796 2.49219147306763 -0.10718718687276553 2.4680578131935964 1.8687995547991438 -0.54474219520936451 2.4002302764158001 1.8149780467896701 -0.10739231769315292 2.2529951172626963 2.1308338898869659 -0.54467708085377375 2.1932811076499088 2.0671259428185098 -0.10732695463846909 2.8185773451320775 1.2890385165366576 -0.54486075831441316 2.7397258916203127 1.2529023398665209 -0.10751163268483761 2.6564339259976122 1.5923635988937639 -0.54480379984481397 2.5851756665828418 1.5420212565013658 -0.10745396281042692 3.0370584877437201 0.64470270927375162 -0.54495795519887735 2.9522670785293132 0.62598083167457508 -0.10761012048762449 2.9367367126988695 0.97538751676702085 -0.54491137644362964 2.8561585663619438 0.9427756278838455 -0.10756244930923257 3.0778160450388978 0.31058650198799675 -0.54499449637828101 2.9920539980454604 0.29808069742398557 -0.1076473249527112 3.0720021687393126 -0.36972404512084683 -0.54504810448120755 2.9858150895696913 -0.3615394022169669 -0.10770377400445899 3.1052492396907461 -0.032119128986354564 -0.5450274369933864 3.0180985953415798 -0.033714411094439012 -0.10768146438451254 2.919176057065942 -1.0333834802447448 -0.54506716898867136 2.8373238189493892 -1.0049777574172645 -0.10772711126700904 3.018743430474716 -0.705151400078462 -0.54506359383536485 2.9329872789208369 -0.68961302855153639 -0.10772041764037991 2.6262070730714728 -1.6490160540831771 -0.54504667458341904 2.7895116726546121 -1.3435013616926805 -0.54506268781972222 2.5532281496623659 -1.6018995016457245 -0.10771268307035904 2.7086007116275121 -1.3112224229662071 -0.10772349329779392 2.2066093003187675 -2.1874502064562704 -0.54498164379629699 2.1443002853716129 -2.1269113950620944 -0.10765431139083292 2.4263496608188126 -1.9197073085546543 -0.54501851782083977 2.3556587240830034 -1.8693802797739261 -0.10768599810046374 1.9475637229155869 -2.4034650369892021 -0.54492692482582417 1.8909458209212351 -2.3379390909352091 -0.10760301349721227 1.3759568723635873 -2.7721011581530677 -0.54478342604028118 1.3365421838947558 -2.6950099166576624 -0.10746909952716992 1.6759763015567153 -2.6117556211772746 -0.54486446082192497 1.6267181370432449 -2.5399246607223436 -0.10754493725512158 0.7387060968971455 -3.0084657853473735 -0.54458530807567584 0.7187807541060971 -2.9240478450629501 -0.10727808863916917 1.0672636254523069 -2.9088210892223523 -0.54469233856500321 1.0331557735617189 -2.8287044678606827 -0.10738077720967271 0.40929227298292092 -3.0679887527690308 -0.54446349689082973 0.065953594121964998 -3.1017792631283498 -0.54433581278136045 0.065911627989567984 -3.0147968794575819 -0.10702506071528765 0.39317838698004071 -2.9825900885331427 -0.10715663343260327 1.0290162797267273 3.5153930585701212 1.4774667027757507 0.14540548148518315 3.8473373979437708 -1.5985454399631103</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<polyhedra>\n\t\t\t<first_faces>0</first_faces>\n\t\t\t<face_counts>1603</face_counts>\n\t\t\t<types>polygons</types>\n\t\t\t<face_first_loops>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602</face_first_loops>\n\t\t\t<face_loop_counts>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</face_loop_counts>\n\t\t\t<face_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_selection>\n\t\t\t<face_materials>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_materials>\n\t\t\t<loop_first_edges>0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 699 703 706 710 714 718 722 726 730 734 738 742 746 750 754 758 762 766 770 774 778 782 786 790 794 798 802 806 810 814 818 822 826 830 834 838 842 846 850 854 858 862 866 870 874 878 882 886 890 894 898 902 906 910 914 918 922 926 930 934 938 942 946 950 954 958 962 966 970 974 978 982 986 990 994 998 1002 1006 1010 1014 1018 1022 1026 1030 1034 1038 1042 1046 1050 1054 1058 1062 1066 1070 1074 1078 1082 1086 1090 1094 1098 1102 1106 1110 1114 1118 1122 1126 1130 1134 1138 1142 1146 1149 1153 1157 1161 1165 1169 1173 1177 1181 1185 1189 1193 1197 1201 1205 1209 1213 1217 1221 1225 1229 1233 1237 1241 1245 1249 1253 1257 1261 1265 1269 1273 1277 1281 1285 1289 1293 1297 1301 1305 1309 1313 1317 1321 1325 1329 1333 1337 1341 1345 1349 1353 1357 1361 1365 1369 1373 1377 1381 1385 1389 1393 1397 1401 1405 1409 1413 1417 1421 1425 1429 1433 1437 1441 1445 1449 1453 1457 1461 1465 1469 1473 1477 1481 1485 1489 1493 1497 1501 1505 1509 1513 1517 1521 1525 1529 1533 1537 1541 1545 1549 1553 1557 1561 1565 1569 1573 1577 1581 1585 1589 1593 1597 1601 1605 1609 1613 1617 1621 1625 1629 1633 1637 1641 1645 1649 1653 1657 1661 1665 1669 1673 1677 1681 1685 1689 1693 1697 1701 1705 1709 1713 1717 1721 1725 1729 1733 1737 1741 1745 1749 1753 1757 1761 1765 1769 1773 1777 1781 1785 1789 1793 1797 1801 1805 1809 1813 1817 1821 1825 1829 1833 1837 1841 1845 1849 1853 1857 1861 1865 1869 1873 1877 1881 1885 1889 1893 1897 1901 1905 1909 1913 1917 1921 1925 1929 1933 1937 1941 1945 1949 1953 1957 1961 1965 1969 1973 1977 1981 1985 1989 1993 1997 2001 2005 2009 2013 2017 2021 2025 2029 2033 2037 2041 2045 2049 2053 2057 2061 2065 2069 2073 2077 2081 2085 2089 2093 2097 2101 2105 2109 2113 2117 2121 2125 2129 2133 2137 2141 2145 2149 2153 2157 2161 2165 2169 2173 2177 2181 2185 2189 2193 2197 2201 2205 2209 2213 2217 2221 2225 2229 2233 2237 2241 2245 2249 2253 2257 2261 2265 2269 2273 2277 2281 2285 2289 2293 2297 2301 2305 2309 2313 2317 2321 2325 2329 2333 2337 2341 2345 2349 2353 2357 2361 2365 2369 2373 2377 2381 2385 2389 2393 2397 2401 2405 2409 2413 2417 2421 2425 2429 2433 2437 2441 2445 2449 2453 2457 2461 2465 2469 2473 2477 2481 2485 2489 2493 2497 2501 2505 2509 2513 2517 2521 2525 2529 2533 2537 2541 2545 2549 2553 2557 2561 2565 2569 2573 2577 2581 2585 2589 2593 2597 2601 2605 2609 2613 2617 2621 2625 2629 2633 2637 2641 2645 2649 2653 2657 2661 2665 2669 2673 2677 2681 2685 2689 2693 2697 2701 2705 2709 2713 2717 2721 2725 2729 2733 2737 2741 2745 2749 2753 2757 2761 2765 2769 2773 2777 2781 2785 2789 2793 2797 2801 2805 2809 2813 2817 2821 2825 2829 2833 2837 2841 2845 2849 2853 2857 2861 2865 2869 2873 2877 2881 2885 2889 2893 2897 2901 2905 2909 2913 2917 2921 2925 2929 2933 2937 2941 2945 2949 2953 2957 2961 2965 2969 2973 2977 2981 2985 2989 2993 2997 3001 3005 3009 3013 3017 3021 3025 3029 3033 3037 3041 3045 3049 3053 3057 3061 3065 3069 3073 3077 3081 3085 3089 3093 3097 3101 3105 3109 3113 3117 3121 3125 3129 3133 3137 3141 3145 3149 3153 3157 3161 3165 3169 3173 3177 3181 3185 3189 3193 3197 3201 3205 3209 3213 3217 3221 3225 3229 3233 3237 3241 3245 3249 3253 3257 3261 3265 3269 3273 3277 3281 3285 3289 3293 3297 3301 3305 3309 3313 3317 3321 3325 3329 3333 3337 3341 3345 3349 3353 3357 3361 3365 3369 3373 3377 3381 3385 3389 3393 3397 3401 3405 3409 3413 3417 3421 3425 3429 3433 3437 3441 3445 3449 3453 3457 3461 3465 3469 3473 3477 3481 3485 3489 3493 3497 3501 3505 3509 3513 3517 3521 3525 3529 3533 3537 3541 3545 3549 3553 3557 3561 3565 3569 3573 3577 3581 3585 3589 3593 3597 3601 3605 3609 3613 3617 3621 3625 3629 3633 3637 3641 3645 3649 3653 3657 3661 3665 3669 3673 3677 3681 3685 3689 3693 3697 3701 3705 3709 3713 3717 3721 3725 3729 3733 3737 3741 3745 3749 3753 3757 3761 3765 3769 3773 3777 3781 3785 3789 3793 3797 3801 3805 3809 3813 3817 3821 3825 3829 3833 3837 3841 3845 3849 3853 3857 3861 3865 3869 3873 3877 3881 3885 3889 3893 3897 3901 3905 3909 3913 3917 3921 3925 3929 3933 3937 3941 3945 3949 3953 3957 3961 3965 3969 3973 3977 3981 3985 3989 3993 3997 4001 4005 4009 4013 4017 4021 4025 4029 4033 4037 4041 4045 4049 4053 4057 4061 4065 4069 4073 4077 4081 4085 4089 4093 4097 4101 4105 4109 4113 4117 4121 4125 4129 4133 4137 4141 4145 4149 4153 4157 4161 4165 4169 4173 4177 4181 4185 4189 4193 4197 4201 4205 4209 4213 4217 4221 4225 4229 4233 4237 4241 4245 4249 4253 4257 4261 4265 4269 4273 4277 4281 4285 4289 4293 4297 4301 4305 4309 4313 4317 4321 4325 4329 4333 4337 4341 4345 4349 4353 4357 4361 4365 4369 4373 4377 4381 4385 4389 4393 4397 4401 4405 4409 4413 4417 4421 4425 4429 4433 4437 4441 4445 4449 4453 4457 4461 4465 4469 4473 4477 4481 4485 4489 4493 4497 4501 4505 4509 4513 4517 4521 4525 4529 4533 4537 4541 4545 4549 4553 4557 4561 4565 4569 4573 4577 4581 4585 4589 4593 4597 4601 4605 4609 4613 4617 4621 4625 4629 4633 4637 4641 4645 4649 4653 4657 4661 4665 4669 4673 4677 4681 4685 4689 4693 4697 4701 4705 4709 4713 4717 4721 4725 4729 4733 4737 4741 4745 4749 4753 4757 4761 4765 4769 4773 4777 4781 4785 4789 4793 4797 4801 4805 4809 4813 4817 4821 4825 4829 4833 4837 4841 4845 4849 4853 4857 4861 4865 4869 4873 4877 4881 4885 4889 4893 4897 4901 4905 4909 4913 4917 4921 4925 4929 4933 4937 4941 4945 4949 4953 4957 4961 4965 4969 4973 4977 4981 4985 4989 4993 4997 5001 5005 5009 5013 5017 5021 5025 5029 5033 5037 5041 5045 5049 5053 5057 5061 5065 5069 5073 5077 5081 5085 5089 5093 5097 5101 5105 5109 5113 5117 5121 5125 5129 5133 5137 5141 5145 5149 5153 5157 5161 5165 5169 5173 5177 5181 5185 5189 5193 5197 5201 5205 5209 5213 5217 5221 5225 5229 5233 5237 5241 5245 5249 5253 5257 5261 5265 5269 5273 5277 5281 5285 5289 5293 5297 5301 5305 5309 5313 5317 5321 5325 5329 5333 5337 5341 5345 5349 5353 5357 5361 5365 5369 5373 5377 5381 5385 5389 5393 5397 5401 5405 5409 5413 5417 5421 5425 5429 5433 5437 5441 5445 5449 5453 5457 5461 5465 5469 5473 5477 5481 5485 5489 5493 5497 5501 5505 5509 5513 5517 5521 5525 5529 5533 5537 5541 5545 5549 5553 5557 5561 5565 5569 5573 5577 5581 5585 5589 5593 5597 5601 5605 5609 5613 5617 5621 5625 5629 5633 5637 5641 5645 5649 5653 5657 5661 5665 5669 5673 5677 5681 5685 5689 5693 5697 5701 5705 5709 5713 5717 5721 5725 5729 5733 5737 5741 5745 5749 5753 5757 5761 5765 5769 5773 5777 5781 5785 5789 5793 5797 5801 5805 5809 5813 5817 5821 5825 5829 5833 5837 5841 5845 5849 5853 5857 5861 5865 5869 5873 5877 5881 5885 5889 5893 5897 5901 5905 5909 5913 5917 5921 5925 5929 5933 5937 5941 5945 5949 5953 5957 5961 5965 5969 5973 5977 5981 5985 5989 5993 5997 6001 6005 6009 6013 6017 6021 6025 6029 6033 6037 6041 6045 6049 6053 6057 6061 6065 6069 6073 6077 6081 6085 6089 6093 6097 6101 6105 6109 6113 6117 6121 6125 6129 6133 6137 6141 6145 6149 6153 6157 6161 6165 6169 6173 6177 6181 6185 6189 6193 6197 6201 6205 6209 6213 6217 6221 6225 6229 6233 6237 6241 6245 6249 6253 6257 6261 6265 6269 6272 6275 6278 6281 6284 6287 6290 6293 6296 6299 6302 6305 6308 6311 6314 6317 6320 6323 6326 6329 6332 6335 6338 6341 6344 6347 6350 6353 6356 6359 6362 6365 6368 6371</loop_first_edges>\n\t\t\t<edge_points>56 1582 1469 0 1469 1473 2 0 58 169 56 0 2 62 58 0 2 1473 1471 1 1471 1477 4 1 60 62 2 1 4 66 60 1 4 1477 1475 3 1475 1481 6 3 64 66 4 3 6 70 64 3 6 1481 1479 5 1479 1485 8 5 68 70 6 5 8 74 68 5 8 1485 1483 7 1483 1487 9 7 72 74 8 7 9 76 72 7 1487 1491 11 9 11 80 76 9 11 1491 1489 10 1489 1495 13 10 78 80 11 10 13 84 78 10 13 1495 1493 12 1493 1499 15 12 82 84 13 12 15 88 82 12 15 1499 1497 14 1497 1503 17 14 86 88 15 14 17 92 86 14 17 1503 1501 16 1501 1505 18 16 90 92 17 16 18 94 90 16 1505 1509 20 18 20 98 94 18 20 1509 1507 19 1507 1513 22 19 96 98 20 19 22 102 96 19 22 1513 1511 21 1511 1517 24 21 100 102 22 21 24 106 100 21 24 1517 1516 23 1516 1521 26 23 104 106 24 23 26 110 104 23 26 1521 1519 25 1519 1523 27 25 108 110 26 25 27 112 108 25 1523 1527 29 27 29 115 112 27 29 1527 1525 28 1525 1533 32 28 114 115 29 28 31 1531 1529 30 1529 1535 33 30 118 120 31 30 33 122 118 30 32 1533 1531 31 1535 1539 35 33 35 125 122 33 35 1539 1537 34 1537 1543 37 34 124 125 35 34 37 130 124 34 37 1543 1541 36 1541 1547 39 36 128 130 37 36 39 134 128 36 39 1547 1545 38 1545 1551 41 38 132 134 39 38 41 138 132 38 41 1551 1549 40 1549 1553 42 40 136 138 41 40 42 140 136 40 1553 1557 44 42 44 144 140 42 44 1557 1555 43 1555 1561 46 43 142 144 44 43 46 148 142 43 46 1561 1559 45 1559 1565 48 45 146 148 46 45 48 152 146 45 48 1565 1564 47 1564 1569 50 47 150 152 48 47 50 156 150 47 50 1569 1567 49 1567 1571 51 49 154 156 50 49 51 158 154 49 1571 1575 53 51 53 162 158 51 53 1575 1573 52 1573 1579 55 52 160 162 53 52 55 166 160 52 55 1579 1577 54 1577 1583 57 54 164 166 55 54 57 168 164 54 57 1583 1582 56 56 169 168 57 59 170 169 58 62 63 59 58 174 284 170 59 172 174 59 63 61 63 62 60 66 67 61 60 61 176 172 63 67 180 176 61 65 67 66 64 70 71 65 64 178 180 67 65 71 184 178 65 69 71 70 68 74 75 69 68 182 184 71 69 75 188 182 69 73 75 74 72 76 77 73 72 186 188 75 73 77 190 186 73 80 81 77 76 81 194 190 77 79 81 80 78 84 85 79 78 192 194 81 79 85 198 192 79 83 85 84 82 88 89 83 82 196 198 85 83 89 202 196 83 87 89 88 86 92 93 87 86 200 202 89 87 93 205 200 87 91 93 92 90 94 95 91 90 204 205 93 91 95 207 204 91 98 99 95 94 99 212 207 95 97 99 98 96 102 103 97 96 210 212 99 97 103 216 210 97 101 103 102 100 106 107 101 100 214 216 103 101 107 220 214 101 105 107 106 104 110 111 105 104 218 220 107 105 111 222 218 105 109 111 110 108 112 113 109 108 109 226 222 111 224 226 109 113 115 117 113 112 117 230 224 113 116 117 115 114 228 230 117 116 116 235 228 122 123 119 118 233 234 121 125 127 123 122 237 239 123 127 126 127 125 124 130 131 126 124 126 241 237 127 131 245 241 126 129 131 130 128 134 135 129 128 243 245 131 129 135 249 243 129 133 135 134 132 138 139 133 132 247 249 135 133 139 253 247 133 137 139 138 136 140 141 137 136 251 253 139 137 141 256 251 137 144 145 141 140 145 260 256 141 143 145 144 142 148 149 143 142 258 260 145 143 149 263 258 143 147 149 148 146 152 153 147 146 261 263 149 147 153 267 261 147 151 153 152 150 156 157 151 150 265 267 153 151 157 271 265 151 155 157 156 154 158 159 155 154 269 271 157 155 159 273 269 155 162 163 159 158 163 277 273 159 161 163 162 160 166 167 161 160 275 277 163 161 167 281 275 161 165 167 166 164 168 171 165 164 279 281 167 165 171 283 279 165 170 171 168 169 170 284 283 171 173 175 174 172 176 177 173 172 287 289 175 173 177 291 287 173 175 285 284 174 289 396 285 175 180 181 177 176 181 295 291 177 179 181 180 178 184 185 179 178 293 295 181 179 185 299 293 179 183 185 184 182 188 189 183 182 297 299 185 183 189 303 297 183 187 189 188 186 190 191 187 186 301 303 189 187 191 305 301 187 194 195 191 190 195 309 305 191 193 195 194 192 198 199 193 192 307 309 195 193 199 313 307 193 197 199 198 196 202 203 197 196 311 313 199 197 203 317 311 197 201 203 202 200 205 206 201 200 315 317 203 201 206 319 315 201 204 209 206 205 208 209 204 207 209 323 319 206 212 213 208 207 321 323 209 208 213 327 321 208 211 213 212 210 216 217 211 210 325 327 213 211 217 331 325 211 215 217 216 214 220 221 215 214 329 331 217 215 221 335 329 215 219 221 220 218 222 223 219 218 333 335 221 219 223 337 333 219 226 227 223 222 227 341 337 223 225 227 226 224 230 231 225 224 339 341 227 225 231 343 339 225 229 231 230 228 235 236 229 228 229 347 343 231 345 347 229 236 239 240 233 238 240 239 237 241 242 238 237 349 351 240 238 242 353 349 238 245 246 242 241 246 357 353 242 244 246 245 243 249 250 244 243 355 357 246 244 250 361 355 244 248 250 249 247 253 254 248 247 359 361 250 248 254 364 359 248 252 254 253 251 256 257 252 251 363 364 254 252 257 369 363 252 259 371 367 255 367 369 257 255 255 260 258 259 256 260 255 257 263 264 259 258 264 375 371 259 262 264 263 261 267 268 262 261 373 375 264 262 268 379 373 262 266 268 267 265 271 272 266 265 377 379 268 266 272 383 377 266 270 272 271 269 273 274 270 269 381 383 272 270 274 385 381 270 277 278 274 273 278 389 385 274 276 278 277 275 281 282 276 275 387 389 278 276 282 393 387 276 280 282 281 279 283 286 280 279 391 393 282 280 286 395 391 280 285 286 283 284 285 396 395 286 288 290 289 287 291 292 288 287 399 400 290 288 292 401 399 288 290 397 396 289 400 453 397 290 295 296 292 291 296 403 401 292 294 296 295 293 299 300 294 293 402 403 296 294 300 405 402 294 298 300 299 297 303 304 298 297 404 405 300 298 304 407 404 298 302 304 303 301 305 306 302 301 406 407 304 302 306 408 406 302 309 310 306 305 310 410 408 306 308 310 309 307 313 314 308 307 409 410 310 308 314 412 409 308 312 314 313 311 317 318 312 311 411 412 314 312 318 414 411 312 316 318 317 315 319 320 316 315 413 414 318 316 320 415 413 316 323 324 320 319 324 417 415 320 322 324 323 321 327 328 322 321 416 417 324 322 328 419 416 322 326 328 327 325 331 332 326 325 418 419 328 326 332 421 418 326 330 332 331 329 335 336 330 329 420 421 332 330 336 422 420 330 334 336 335 333 337 338 334 333 334 424 422 336 423 424 334 338 341 342 338 337 342 426 423 338 340 342 341 339 343 344 340 339 425 426 342 340 344 427 425 340 347 348 344 343 348 429 427 344 346 348 347 345 351 352 346 345 428 429 348 346 352 431 428 346 350 352 351 349 353 354 350 349 430 431 352 350 354 433 430 350 357 358 354 353 432 433 354 358 356 358 357 355 361 362 356 355 356 434 432 358 362 436 434 356 360 362 361 359 364 366 360 359 435 436 362 360 366 438 435 360 365 366 364 363 369 370 365 363 437 438 366 365 370 440 437 365 368 370 369 367 371 372 368 367 439 440 370 368 372 441 439 368 375 376 372 371 376 443 441 372 374 376 375 373 379 380 374 373 442 443 376 374 380 445 442 374 378 380 379 377 383 384 378 377 444 445 380 378 384 447 444 378 382 384 383 381 385 386 382 381 446 447 384 382 386 448 446 382 389 390 386 385 390 450 448 386 388 390 389 387 393 394 388 387 449 450 390 388 394 452 449 388 392 394 393 391 395 398 392 391 451 452 394 392 398 454 451 392 397 398 395 396 453 454 398 397 455 457 400 399 401 459 455 399 457 564 453 400 403 463 459 401 461 463 403 402 405 467 461 402 465 467 405 404 407 470 465 404 469 470 407 406 408 472 469 406 410 477 472 408 475 477 410 409 412 481 475 409 479 481 412 411 414 485 479 411 483 485 414 413 415 487 483 413 417 491 487 415 489 491 417 416 419 495 489 416 493 495 419 418 421 499 493 418 497 499 421 420 422 501 497 420 424 505 501 422 503 505 424 423 426 509 503 423 507 509 426 425 427 511 507 425 429 515 511 427 513 515 429 428 431 519 513 428 517 519 431 430 433 523 517 430 434 525 521 432 521 523 433 432 436 529 525 434 527 529 436 435 438 533 527 435 531 533 438 437 440 537 531 437 535 537 440 439 441 539 535 439 443 543 539 441 541 543 443 442 445 547 541 442 545 547 445 444 447 551 545 444 549 551 447 446 448 555 549 446 553 555 448 450 449 557 553 450 452 561 557 449 559 561 452 451 454 563 559 451 453 564 563 454 456 458 457 455 459 460 456 455 567 569 458 456 460 571 567 456 458 565 564 457 569 676 565 458 463 464 460 459 464 575 571 460 462 464 463 461 467 468 462 461 573 575 464 462 468 579 573 462 466 468 467 465 470 471 466 465 577 579 468 466 471 581 577 466 469 474 471 470 473 474 469 472 474 585 581 471 477 478 473 472 583 585 474 473 478 589 583 473 476 478 477 475 481 482 476 475 587 589 478 476 482 593 587 476 480 482 481 479 485 486 480 479 591 593 482 480 486 597 591 480 484 486 485 483 487 488 484 483 595 597 486 484 488 599 595 484 491 492 488 487 492 603 599 488 490 492 491 489 495 496 490 489 601 603 492 490 496 607 601 490 494 496 495 493 499 500 494 493 605 607 496 494 500 611 605 494 498 500 499 497 501 502 498 497 609 611 500 498 502 613 609 498 505 506 502 501 506 617 613 502 504 506 505 503 509 510 504 503 615 617 506 504 510 621 615 504 508 510 509 507 511 512 508 507 619 621 510 508 512 623 619 508 515 516 512 511 516 627 623 512 514 516 515 513 519 520 514 513 625 627 516 514 520 631 625 514 518 520 519 517 523 524 518 517 629 631 520 518 524 635 629 518 522 524 523 521 525 526 522 521 633 635 524 522 526 637 633 522 529 530 526 525 530 641 637 526 528 530 529 527 533 534 528 527 639 641 530 528 534 645 639 528 532 534 533 531 537 538 532 531 643 645 534 532 538 649 643 532 536 538 537 535 539 540 536 535 647 649 538 536 540 652 647 536 543 544 540 539 544 656 652 540 542 544 543 541 547 548 542 541 654 656 544 542 548 659 654 542 546 548 547 545 551 552 546 545 657 659 548 546 552 663 657 546 550 552 551 549 555 556 550 549 661 663 552 550 556 667 661 550 554 556 555 553 557 558 554 553 665 667 556 554 558 669 665 554 561 562 558 557 562 673 669 558 560 562 561 559 563 566 560 559 671 673 562 560 566 675 671 560 565 566 563 564 565 676 675 566 568 570 569 567 571 572 568 567 679 681 570 568 572 683 679 568 570 677 676 569 681 787 677 570 575 576 572 571 576 687 683 572 574 576 575 573 579 580 574 573 685 687 576 574 580 691 685 574 578 580 579 577 581 582 578 577 689 691 580 578 582 693 689 578 585 586 582 581 586 697 693 582 584 586 585 583 589 590 584 583 695 697 586 584 590 701 695 584 588 590 589 587 593 594 588 587 699 701 590 588 594 705 699 588 592 594 593 591 597 598 592 591 703 705 594 592 598 707 703 592 596 598 597 595 599 600 596 595 596 711 707 598 709 711 596 600 603 604 600 599 604 715 709 600 602 604 603 601 607 608 602 601 713 715 604 602 608 719 713 602 606 608 607 605 611 612 606 605 717 719 608 606 612 723 717 606 610 612 611 609 613 614 610 609 721 723 612 610 614 725 721 610 617 618 614 613 618 729 725 614 616 618 617 615 621 622 616 615 727 729 618 616 622 733 727 616 620 622 621 619 623 624 620 619 731 733 622 620 624 735 731 620 627 628 624 623 628 739 735 624 626 628 627 625 631 632 626 625 737 739 628 626 632 743 737 626 630 632 631 629 635 636 630 629 741 743 632 630 636 747 741 630 634 636 635 633 637 638 634 633 745 747 636 634 638 749 745 634 641 642 638 637 642 753 749 638 640 642 641 639 645 646 640 639 751 753 642 640 646 757 751 640 644 646 645 643 649 650 644 643 755 757 646 644 650 761 755 644 648 650 649 647 652 653 648 647 759 761 650 648 653 765 759 648 655 767 763 651 763 765 653 651 651 656 654 655 652 656 651 653 659 660 655 654 660 771 767 655 658 660 659 657 663 664 658 657 769 771 660 658 664 775 769 658 662 664 663 661 667 668 662 661 773 775 664 662 668 779 773 662 666 668 667 665 669 670 666 665 777 779 668 666 670 781 777 666 673 674 670 669 674 785 781 670 672 674 673 671 675 678 672 671 783 785 674 672 678 789 783 672 677 678 675 676 787 789 678 677 680 682 681 679 683 684 680 679 680 793 791 682 792 793 680 684 682 788 787 681 791 845 788 682 687 688 684 683 688 795 792 684 686 688 687 685 691 692 686 685 794 795 688 686 692 797 794 686 690 692 691 689 693 694 690 689 796 797 692 690 694 798 796 690 697 698 694 693 698 800 798 694 696 698 697 695 701 702 696 695 799 800 698 696 702 802 799 696 700 702 701 699 705 706 700 699 801 802 702 700 706 804 801 700 704 706 705 703 707 708 704 703 803 804 706 704 708 805 803 704 711 712 708 707 712 807 805 708 710 712 711 709 715 716 710 709 806 807 712 710 716 809 806 710 714 716 715 713 719 720 714 713 808 809 716 714 720 811 808 714 718 720 719 717 723 724 718 717 810 811 720 718 724 813 810 718 722 724 723 721 725 726 722 721 812 813 724 722 726 814 812 722 729 730 726 725 730 816 814 726 728 730 729 727 733 734 728 727 815 816 730 728 734 818 815 728 732 734 733 731 735 736 732 731 817 818 734 732 736 819 817 732 739 740 736 735 740 821 819 736 738 740 739 737 743 744 738 737 820 821 740 738 744 823 820 738 742 744 743 741 747 748 742 741 822 823 744 742 748 825 822 742 746 748 747 745 749 750 746 745 824 825 748 746 750 826 824 746 753 754 750 749 754 828 826 750 752 754 753 751 757 758 752 751 827 828 754 752 758 830 827 752 756 758 757 755 761 762 756 755 829 830 758 756 762 832 829 756 760 762 761 759 765 766 760 759 831 832 762 760 766 834 831 760 764 766 765 763 767 768 764 763 833 834 766 764 768 835 833 764 771 772 768 767 772 837 835 768 770 772 771 769 775 776 770 769 836 837 772 770 776 839 836 770 774 776 775 773 779 780 774 773 838 839 776 774 780 841 838 774 778 780 779 777 781 782 778 777 840 841 780 778 782 842 840 778 785 786 782 781 786 844 842 782 784 786 785 783 789 790 784 783 843 844 786 784 790 846 843 784 788 790 789 787 845 846 790 788 847 955 845 791 793 851 847 791 849 851 793 792 795 855 849 792 853 855 795 794 797 859 853 794 857 859 797 796 798 861 857 796 800 865 861 798 863 865 800 799 802 869 863 799 867 869 802 801 804 873 867 801 871 873 804 803 805 875 871 803 807 878 875 805 877 878 807 806 809 883 877 806 881 883 809 808 811 887 881 808 885 887 811 810 813 891 885 810 889 891 813 812 814 893 889 812 816 897 893 814 895 897 816 815 818 901 895 815 899 901 818 817 819 903 899 817 821 907 903 819 905 907 821 820 823 911 905 820 909 911 823 822 825 915 909 822 913 915 825 824 826 917 913 824 828 921 917 826 919 921 828 827 830 925 919 827 923 925 830 829 832 929 923 829 927 929 832 831 834 931 927 831 833 935 931 834 933 935 833 835 837 939 933 835 937 939 837 836 839 943 937 836 941 943 839 838 841 947 941 838 945 947 841 840 842 949 945 840 844 953 949 842 951 953 844 843 846 957 951 843 955 957 846 845 848 956 955 847 851 852 848 847 959 1067 956 848 852 963 959 848 850 852 851 849 855 856 850 849 961 963 852 850 856 967 961 850 854 856 855 853 859 860 854 853 965 967 856 854 860 971 965 854 858 860 859 857 861 862 858 857 969 971 860 858 862 973 969 858 865 866 862 861 866 977 973 862 864 866 865 863 869 870 864 863 975 977 866 864 870 980 975 864 868 870 869 867 873 874 868 867 979 980 870 868 874 985 979 868 872 874 873 871 875 876 872 871 983 985 874 872 876 989 983 872 878 880 876 875 987 989 876 880 879 880 878 877 883 884 879 877 879 991 987 880 884 995 991 879 882 884 883 881 887 888 882 881 993 995 884 882 888 999 993 882 886 888 887 885 891 892 886 885 997 999 888 886 892 1003 997 886 890 892 891 889 893 894 890 889 1001 1003 892 890 894 1005 1001 890 897 898 894 893 898 1009 1005 894 896 898 897 895 901 902 896 895 1007 1009 898 896 902 1013 1007 896 900 902 901 899 903 904 900 899 1011 1013 902 900 904 1015 1011 900 907 908 904 903 908 1019 1015 904 906 908 907 905 911 912 906 905 1017 1019 908 906 912 1023 1017 906 910 912 911 909 915 916 910 909 1021 1023 912 910 916 1027 1021 910 914 916 915 913 917 918 914 913 1025 1027 916 914 918 1029 1025 914 921 922 918 917 922 1033 1029 918 920 922 921 919 925 926 920 919 1031 1033 922 920 926 1037 1031 920 924 926 925 923 929 930 924 923 1035 1037 926 924 930 1041 1035 924 928 930 929 927 931 932 928 927 1039 1041 930 928 932 1043 1039 928 935 936 932 931 936 1047 1043 932 934 936 935 933 939 940 934 933 1045 1047 936 934 940 1051 1045 934 938 940 939 937 943 944 938 937 1049 1051 940 938 944 1055 1049 938 942 944 943 941 947 948 942 941 1053 1055 944 942 948 1057 1053 942 946 948 947 945 949 950 946 945 946 1061 1057 948 1059 1061 946 950 953 954 950 949 954 1065 1059 950 952 954 953 951 957 958 952 951 1063 1065 954 952 958 1069 1063 952 956 958 957 955 1067 1069 958 956 960 1068 1067 959 963 964 960 959 1071 1179 1068 960 964 1075 1071 960 962 964 963 961 967 968 962 961 1073 1075 964 962 968 1079 1073 962 966 968 967 965 971 972 966 965 1077 1079 968 966 972 1082 1077 966 970 972 971 969 973 974 970 969 1081 1082 972 970 974 1087 1081 970 977 978 974 973 1086 1087 974 978 976 978 977 975 980 982 976 975 976 1089 1086 978 982 1093 1089 976 981 982 980 979 985 986 981 979 1091 1093 982 981 986 1097 1091 981 984 986 985 983 989 990 984 983 1095 1097 986 984 990 1101 1095 984 988 990 989 987 991 992 988 987 1099 1101 990 988 992 1103 1099 988 995 996 992 991 996 1107 1103 992 994 996 995 993 999 1000 994 993 1105 1107 996 994 1000 1111 1105 994 998 1000 999 997 1003 1004 998 997 1109 1111 1000 998 1004 1115 1109 998 1002 1004 1003 1001 1005 1006 1002 1001 1113 1115 1004 1002 1006 1117 1113 1002 1009 1010 1006 1005 1010 1121 1117 1006 1008 1010 1009 1007 1013 1014 1008 1007 1119 1121 1010 1008 1014 1125 1119 1008 1012 1014 1013 1011 1015 1016 1012 1011 1123 1125 1014 1012 1016 1127 1123 1012 1019 1020 1016 1015 1020 1131 1127 1016 1018 1020 1019 1017 1023 1024 1018 1017 1129 1131 1020 1018 1024 1135 1129 1018 1022 1024 1023 1021 1027 1028 1022 1021 1133 1135 1024 1022 1028 1137 1133 1022 1026 1028 1027 1025 1029 1030 1026 1025 1026 1141 1137 1028 1139 1141 1026 1030 1033 1034 1030 1029 1034 1145 1139 1030 1032 1034 1033 1031 1037 1038 1032 1031 1143 1145 1034 1032 1038 1149 1143 1032 1036 1038 1037 1035 1041 1042 1036 1035 1147 1149 1038 1036 1042 1153 1147 1036 1040 1042 1041 1039 1043 1044 1040 1039 1151 1153 1042 1040 1044 1155 1151 1040 1047 1048 1044 1043 1048 1159 1155 1044 1046 1048 1047 1045 1051 1052 1046 1045 1157 1159 1048 1046 1052 1163 1157 1046 1050 1052 1051 1049 1055 1056 1050 1049 1161 1163 1052 1050 1056 1167 1161 1050 1054 1056 1055 1053 1057 1058 1054 1053 1165 1167 1056 1054 1058 1169 1165 1054 1061 1062 1058 1057 1062 1173 1169 1058 1060 1062 1061 1059 1065 1066 1060 1059 1171 1173 1062 1060 1066 1177 1171 1060 1064 1066 1065 1063 1069 1070 1064 1063 1175 1177 1066 1064 1070 1181 1175 1064 1068 1070 1069 1067 1179 1181 1070 1068 1072 1180 1179 1071 1075 1076 1072 1071 1183 1237 1180 1072 1076 1185 1183 1072 1074 1076 1075 1073 1079 1080 1074 1073 1184 1185 1076 1074 1080 1187 1184 1074 1078 1080 1079 1077 1082 1084 1078 1077 1186 1187 1080 1078 1084 1189 1186 1078 1083 1084 1082 1081 1087 1088 1083 1081 1188 1189 1084 1083 1088 1191 1188 1083 1090 1192 1190 1085 1190 1191 1088 1085 1089 1090 1085 1086 1085 1088 1087 1086 1093 1094 1090 1089 1094 1194 1192 1090 1092 1094 1093 1091 1097 1098 1092 1091 1193 1194 1094 1092 1098 1196 1193 1092 1096 1098 1097 1095 1101 1102 1096 1095 1195 1196 1098 1096 1102 1198 1195 1096 1100 1102 1101 1099 1103 1104 1100 1099 1197 1198 1102 1100 1104 1199 1197 1100 1107 1108 1104 1103 1108 1201 1199 1104 1106 1108 1107 1105 1111 1112 1106 1105 1200 1201 1108 1106 1112 1203 1200 1106 1110 1112 1111 1109 1115 1116 1110 1109 1202 1203 1112 1110 1116 1205 1202 1110 1114 1116 1115 1113 1117 1118 1114 1113 1204 1205 1116 1114 1118 1207 1204 1114 1121 1122 1118 1117 1206 1207 1118 1122 1120 1122 1121 1119 1125 1126 1120 1119 1120 1208 1206 1122 1126 1210 1208 1120 1124 1126 1125 1123 1127 1128 1124 1123 1209 1210 1126 1124 1128 1212 1209 1124 1131 1132 1128 1127 1211 1212 1128 1132 1130 1132 1131 1129 1135 1136 1130 1129 1130 1213 1211 1132 1136 1215 1213 1130 1134 1136 1135 1133 1137 1138 1134 1133 1214 1215 1136 1134 1138 1216 1214 1134 1141 1142 1138 1137 1142 1218 1216 1138 1140 1142 1141 1139 1145 1146 1140 1139 1217 1218 1142 1140 1146 1220 1217 1140 1144 1146 1145 1143 1149 1150 1144 1143 1219 1220 1146 1144 1150 1222 1219 1144 1148 1150 1149 1147 1153 1154 1148 1147 1221 1222 1150 1148 1154 1224 1221 1148 1152 1154 1153 1151 1155 1156 1152 1151 1223 1224 1154 1152 1156 1225 1223 1152 1159 1160 1156 1155 1160 1227 1225 1156 1158 1160 1159 1157 1163 1164 1158 1157 1226 1227 1160 1158 1164 1229 1226 1158 1162 1164 1163 1161 1167 1168 1162 1161 1228 1229 1164 1162 1168 1231 1228 1162 1166 1168 1167 1165 1169 1170 1166 1165 1230 1231 1168 1166 1170 1232 1230 1166 1173 1174 1170 1169 1174 1234 1232 1170 1172 1174 1173 1171 1177 1178 1172 1171 1233 1234 1174 1172 1178 1236 1233 1172 1176 1178 1177 1175 1181 1182 1176 1175 1235 1236 1178 1176 1182 1238 1235 1176 1180 1182 1181 1179 1237 1238 1182 1180 1239 1348 1237 1183 1185 1242 1239 1183 1241 1242 1185 1184 1187 1247 1241 1184 1245 1247 1187 1186 1189 1251 1245 1186 1249 1251 1189 1188 1191 1255 1249 1188 1253 1255 1191 1190 1192 1257 1253 1190 1194 1261 1257 1192 1259 1261 1194 1193 1196 1265 1259 1193 1263 1265 1196 1195 1198 1269 1263 1195 1267 1269 1198 1197 1199 1271 1267 1197 1201 1274 1271 1199 1273 1274 1201 1200 1203 1279 1273 1200 1277 1279 1203 1202 1205 1283 1277 1202 1281 1283 1205 1204 1207 1287 1281 1204 1208 1289 1285 1206 1285 1287 1207 1206 1210 1293 1289 1208 1291 1293 1210 1209 1212 1296 1291 1209 1295 1296 1212 1211 1215 1304 1299 1213 1302 1304 1215 1214 1216 1306 1302 1214 1218 1310 1306 1216 1308 1310 1218 1217 1220 1314 1308 1217 1312 1314 1220 1219 1222 1318 1312 1219 1316 1318 1222 1221 1224 1320 1316 1221 1223 1324 1320 1224 1322 1324 1223 1225 1227 1328 1322 1225 1326 1328 1227 1226 1229 1332 1326 1226 1330 1332 1229 1228 1231 1336 1330 1228 1334 1336 1231 1230 1232 1338 1334 1230 1234 1342 1338 1232 1340 1342 1234 1233 1236 1346 1340 1233 1344 1346 1236 1235 1238 1350 1344 1235 1348 1350 1238 1237 1240 1349 1348 1239 1242 1244 1240 1239 1352 1464 1349 1240 1244 1356 1352 1240 1243 1244 1242 1241 1247 1248 1243 1241 1354 1356 1244 1243 1248 1360 1354 1243 1246 1248 1247 1245 1251 1252 1246 1245 1358 1360 1248 1246 1252 1364 1358 1246 1250 1252 1251 1249 1255 1256 1250 1249 1362 1364 1252 1250 1256 1368 1362 1250 1254 1256 1255 1253 1257 1258 1254 1253 1366 1368 1256 1254 1258 1370 1366 1254 1261 1262 1258 1257 1262 1374 1370 1258 1260 1262 1261 1259 1265 1266 1260 1259 1372 1374 1262 1260 1266 1378 1372 1260 1264 1266 1265 1263 1269 1270 1264 1263 1376 1378 1266 1264 1270 1382 1376 1264 1268 1270 1269 1267 1271 1272 1268 1267 1380 1382 1270 1268 1272 1386 1380 1268 1274 1276 1272 1271 1384 1386 1272 1276 1275 1276 1274 1273 1279 1280 1275 1273 1275 1388 1384 1276 1280 1392 1388 1275 1278 1280 1279 1277 1283 1284 1278 1277 1390 1392 1280 1278 1284 1396 1390 1278 1282 1284 1283 1281 1287 1288 1282 1281 1394 1396 1284 1282 1288 1400 1394 1282 1286 1288 1287 1285 1289 1290 1286 1285 1398 1400 1288 1286 1290 1403 1398 1286 1293 1294 1290 1289 1294 1407 1403 1290 1292 1294 1293 1291 1405 1407 1294 1292 1304 1305 1300 1299 1412 1414 1301 1300 1305 1418 1412 1300 1303 1305 1304 1302 1306 1307 1303 1302 1303 1422 1418 1305 1420 1422 1303 1307 1310 1311 1307 1306 1311 1426 1420 1307 1309 1311 1310 1308 1314 1315 1309 1308 1424 1426 1311 1309 1315 1430 1424 1309 1313 1315 1314 1312 1318 1319 1313 1312 1428 1430 1315 1313 1319 1434 1428 1313 1317 1319 1318 1316 1320 1321 1317 1316 1432 1434 1319 1317 1321 1436 1432 1317 1324 1325 1321 1320 1325 1440 1436 1321 1323 1325 1324 1322 1328 1329 1323 1322 1438 1440 1325 1323 1329 1444 1438 1323 1327 1329 1328 1326 1332 1333 1327 1326 1442 1444 1329 1327 1333 1448 1442 1327 1331 1333 1332 1330 1336 1337 1331 1330 1446 1448 1333 1331 1337 1452 1446 1331 1335 1337 1336 1334 1338 1339 1335 1334 1450 1452 1337 1335 1339 1454 1450 1335 1342 1343 1339 1338 1343 1458 1454 1339 1341 1343 1342 1340 1346 1347 1341 1340 1456 1458 1343 1341 1347 1462 1456 1341 1345 1347 1346 1344 1350 1351 1345 1344 1460 1462 1347 1345 1351 1466 1460 1345 1349 1351 1350 1348 1464 1466 1351 1349 1353 1465 1464 1352 1356 1357 1353 1352 1468 1581 1465 1353 1357 1472 1468 1353 1355 1357 1356 1354 1360 1361 1355 1354 1470 1472 1357 1355 1361 1476 1470 1355 1359 1361 1360 1358 1364 1365 1359 1358 1474 1476 1361 1359 1365 1480 1474 1359 1363 1365 1364 1362 1368 1369 1363 1362 1478 1480 1365 1363 1369 1484 1478 1363 1367 1369 1368 1366 1370 1371 1367 1366 1482 1484 1369 1367 1371 1486 1482 1367 1374 1375 1371 1370 1375 1490 1486 1371 1373 1375 1374 1372 1378 1379 1373 1372 1488 1490 1375 1373 1379 1494 1488 1373 1377 1379 1378 1376 1382 1383 1377 1376 1492 1494 1379 1377 1383 1498 1492 1377 1381 1383 1382 1380 1386 1387 1381 1380 1496 1498 1383 1381 1387 1502 1496 1381 1385 1387 1386 1384 1388 1389 1385 1384 1500 1502 1387 1385 1389 1504 1500 1385 1392 1393 1389 1388 1393 1508 1504 1389 1391 1393 1392 1390 1396 1397 1391 1390 1506 1508 1393 1391 1397 1512 1506 1391 1395 1397 1396 1394 1400 1401 1395 1394 1510 1512 1397 1395 1401 1515 1510 1395 1399 1401 1400 1398 1403 1404 1399 1398 1514 1515 1401 1399 1404 1520 1514 1399 1406 1522 1518 1402 1518 1520 1404 1402 1402 1407 1405 1406 1403 1407 1402 1404 1410 1411 1406 1405 1411 1526 1522 1406 1409 1411 1410 1408 1416 1417 1409 1408 1524 1526 1411 1409 1417 1532 1524 1409 1413 1415 1414 1412 1418 1419 1413 1412 1528 1530 1415 1413 1419 1534 1528 1413 1415 1417 1416 1414 1530 1532 1417 1415 1422 1423 1419 1418 1423 1538 1534 1419 1421 1423 1422 1420 1426 1427 1421 1420 1536 1538 1423 1421 1427 1542 1536 1421 1425 1427 1426 1424 1430 1431 1425 1424 1540 1542 1427 1425 1431 1546 1540 1425 1429 1431 1430 1428 1434 1435 1429 1428 1544 1546 1431 1429 1435 1550 1544 1429 1433 1435 1434 1432 1436 1437 1433 1432 1548 1550 1435 1433 1437 1552 1548 1433 1440 1441 1437 1436 1441 1556 1552 1437 1439 1441 1440 1438 1444 1445 1439 1438 1554 1556 1441 1439 1445 1560 1554 1439 1443 1445 1444 1442 1448 1449 1443 1442 1558 1560 1445 1443 1449 1563 1558 1443 1447 1449 1448 1446 1452 1453 1447 1446 1562 1563 1449 1447 1453 1568 1562 1447 1451 1453 1452 1450 1454 1455 1451 1450 1566 1568 1453 1451 1455 1570 1566 1451 1458 1459 1455 1454 1459 1574 1570 1455 1457 1459 1458 1456 1462 1463 1457 1456 1572 1574 1459 1457 1463 1578 1572 1457 1461 1463 1462 1460 1466 1467 1461 1460 1576 1578 1463 1461 1467 1580 1576 1461 1465 1467 1466 1464 1465 1581 1580 1467 1469 1582 1581 1468 1472 1473 1469 1468 1471 1473 1472 1470 1476 1477 1471 1470 1475 1477 1476 1474 1480 1481 1475 1474 1479 1481 1480 1478 1484 1485 1479 1478 1483 1485 1484 1482 1486 1487 1483 1482 1490 1491 1487 1486 1489 1491 1490 1488 1494 1495 1489 1488 1493 1495 1494 1492 1498 1499 1493 1492 1497 1499 1498 1496 1502 1503 1497 1496 1501 1503 1502 1500 1504 1505 1501 1500 1508 1509 1505 1504 1507 1509 1508 1506 1512 1513 1507 1506 1511 1513 1512 1510 1515 1517 1511 1510 1516 1517 1515 1514 1520 1521 1516 1514 1519 1521 1520 1518 1522 1523 1519 1518 1526 1527 1523 1522 1525 1527 1526 1524 1532 1533 1525 1524 1529 1531 1530 1528 1534 1535 1529 1528 1531 1533 1532 1530 1538 1539 1535 1534 1537 1539 1538 1536 1542 1543 1537 1536 1541 1543 1542 1540 1546 1547 1541 1540 1545 1547 1546 1544 1550 1551 1545 1544 1549 1551 1550 1548 1552 1553 1549 1548 1556 1557 1553 1552 1555 1557 1556 1554 1560 1561 1555 1554 1559 1561 1560 1558 1563 1565 1559 1558 1564 1565 1563 1562 1568 1569 1564 1562 1567 1569 1568 1566 1570 1571 1567 1566 1574 1575 1571 1570 1573 1575 1574 1572 1578 1579 1573 1572 1577 1579 1578 1576 1580 1583 1577 1576 1582 1583 1580 1581 120 114 28 120 28 32 120 32 31 120 118 121 120 121 1584 120 1584 232 120 232 235 120 235 116 120 116 114 232 1584 236 233 236 1584 236 233 345 240 345 233 345 240 351 121 118 119 232 236 235 239 233 121 239 121 119 239 119 123 1301 1295 1211 1301 1211 1213 1301 1213 1299 1301 1299 1300 1297 1416 1408 1297 1408 1585 1297 1585 1296 1297 1296 1295 1297 1295 1416 1414 1416 1295 1414 1295 1301 1585 1292 1291 1585 1291 1296 1298 1408 1410 1298 1410 1405 1298 1405 1292</edge_points>\n\t\t\t<clockwise_edges>1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 696 700 701 702 699 704 705 703 707 708 709 706 711 712 713 710 715 716 717 714 719 720 721 718 723 724 725 722 727 728 729 726 731 732 733 730 735 736 737 734 739 740 741 738 743 744 745 742 747 748 749 746 751 752 753 750 755 756 757 754 759 760 761 758 763 764 765 762 767 768 769 766 771 772 773 770 775 776 777 774 779 780 781 778 783 784 785 782 787 788 789 786 791 792 793 790 795 796 797 794 799 800 801 798 803 804 805 802 807 808 809 806 811 812 813 810 815 816 817 814 819 820 821 818 823 824 825 822 827 828 829 826 831 832 833 830 835 836 837 834 839 840 841 838 843 844 845 842 847 848 849 846 851 852 853 850 855 856 857 854 859 860 861 858 863 864 865 862 867 868 869 866 871 872 873 870 875 876 877 874 879 880 881 878 883 884 885 882 887 888 889 886 891 892 893 890 895 896 897 894 899 900 901 898 903 904 905 902 907 908 909 906 911 912 913 910 915 916 917 914 919 920 921 918 923 924 925 922 927 928 929 926 931 932 933 930 935 936 937 934 939 940 941 938 943 944 945 942 947 948 949 946 951 952 953 950 955 956 957 954 959 960 961 958 963 964 965 962 967 968 969 966 971 972 973 970 975 976 977 974 979 980 981 978 983 984 985 982 987 988 989 986 991 992 993 990 995 996 997 994 999 1000 1001 998 1003 1004 1005 1002 1007 1008 1009 1006 1011 1012 1013 1010 1015 1016 1017 1014 1019 1020 1021 1018 1023 1024 1025 1022 1027 1028 1029 1026 1031 1032 1033 1030 1035 1036 1037 1034 1039 1040 1041 1038 1043 1044 1045 1042 1047 1048 1049 1046 1051 1052 1053 1050 1055 1056 1057 1054 1059 1060 1061 1058 1063 1064 1065 1062 1067 1068 1069 1066 1071 1072 1073 1070 1075 1076 1077 1074 1079 1080 1081 1078 1083 1084 1085 1082 1087 1088 1089 1086 1091 1092 1093 1090 1095 1096 1097 1094 1099 1100 1101 1098 1103 1104 1105 1102 1107 1108 1109 1106 1111 1112 1113 1110 1115 1116 1117 1114 1119 1120 1121 1118 1123 1124 1125 1122 1127 1128 1129 1126 1131 1132 1133 1130 1135 1136 1137 1134 1139 1140 1141 1138 1143 1144 1145 1142 1147 1148 1146 1150 1151 1152 1149 1154 1155 1156 1153 1158 1159 1160 1157 1162 1163 1164 1161 1166 1167 1168 1165 1170 1171 1172 1169 1174 1175 1176 1173 1178 1179 1180 1177 1182 1183 1184 1181 1186 1187 1188 1185 1190 1191 1192 1189 1194 1195 1196 1193 1198 1199 1200 1197 1202 1203 1204 1201 1206 1207 1208 1205 1210 1211 1212 1209 1214 1215 1216 1213 1218 1219 1220 1217 1222 1223 1224 1221 1226 1227 1228 1225 1230 1231 1232 1229 1234 1235 1236 1233 1238 1239 1240 1237 1242 1243 1244 1241 1246 1247 1248 1245 1250 1251 1252 1249 1254 1255 1256 1253 1258 1259 1260 1257 1262 1263 1264 1261 1266 1267 1268 1265 1270 1271 1272 1269 1274 1275 1276 1273 1278 1279 1280 1277 1282 1283 1284 1281 1286 1287 1288 1285 1290 1291 1292 1289 1294 1295 1296 1293 1298 1299 1300 1297 1302 1303 1304 1301 1306 1307 1308 1305 1310 1311 1312 1309 1314 1315 1316 1313 1318 1319 1320 1317 1322 1323 1324 1321 1326 1327 1328 1325 1330 1331 1332 1329 1334 1335 1336 1333 1338 1339 1340 1337 1342 1343 1344 1341 1346 1347 1348 1345 1350 1351 1352 1349 1354 1355 1356 1353 1358 1359 1360 1357 1362 1363 1364 1361 1366 1367 1368 1365 1370 1371 1372 1369 1374 1375 1376 1373 1378 1379 1380 1377 1382 1383 1384 1381 1386 1387 1388 1385 1390 1391 1392 1389 1394 1395 1396 1393 1398 1399 1400 1397 1402 1403 1404 1401 1406 1407 1408 1405 1410 1411 1412 1409 1414 1415 1416 1413 1418 1419 1420 1417 1422 1423 1424 1421 1426 1427 1428 1425 1430 1431 1432 1429 1434 1435 1436 1433 1438 1439 1440 1437 1442 1443 1444 1441 1446 1447 1448 1445 1450 1451 1452 1449 1454 1455 1456 1453 1458 1459 1460 1457 1462 1463 1464 1461 1466 1467 1468 1465 1470 1471 1472 1469 1474 1475 1476 1473 1478 1479 1480 1477 1482 1483 1484 1481 1486 1487 1488 1485 1490 1491 1492 1489 1494 1495 1496 1493 1498 1499 1500 1497 1502 1503 1504 1501 1506 1507 1508 1505 1510 1511 1512 1509 1514 1515 1516 1513 1518 1519 1520 1517 1522 1523 1524 1521 1526 1527 1528 1525 1530 1531 1532 1529 1534 1535 1536 1533 1538 1539 1540 1537 1542 1543 1544 1541 1546 1547 1548 1545 1550 1551 1552 1549 1554 1555 1556 1553 1558 1559 1560 1557 1562 1563 1564 1561 1566 1567 1568 1565 1570 1571 1572 1569 1574 1575 1576 1573 1578 1579 1580 1577 1582 1583 1584 1581 1586 1587 1588 1585 1590 1591 1592 1589 1594 1595 1596 1593 1598 1599 1600 1597 1602 1603 1604 1601 1606 1607 1608 1605 1610 1611 1612 1609 1614 1615 1616 1613 1618 1619 1620 1617 1622 1623 1624 1621 1626 1627 1628 1625 1630 1631 1632 1629 1634 1635 1636 1633 1638 1639 1640 1637 1642 1643 1644 1641 1646 1647 1648 1645 1650 1651 1652 1649 1654 1655 1656 1653 1658 1659 1660 1657 1662 1663 1664 1661 1666 1667 1668 1665 1670 1671 1672 1669 1674 1675 1676 1673 1678 1679 1680 1677 1682 1683 1684 1681 1686 1687 1688 1685 1690 1691 1692 1689 1694 1695 1696 1693 1698 1699 1700 1697 1702 1703 1704 1701 1706 1707 1708 1705 1710 1711 1712 1709 1714 1715 1716 1713 1718 1719 1720 1717 1722 1723 1724 1721 1726 1727 1728 1725 1730 1731 1732 1729 1734 1735 1736 1733 1738 1739 1740 1737 1742 1743 1744 1741 1746 1747 1748 1745 1750 1751 1752 1749 1754 1755 1756 1753 1758 1759 1760 1757 1762 1763 1764 1761 1766 1767 1768 1765 1770 1771 1772 1769 1774 1775 1776 1773 1778 1779 1780 1777 1782 1783 1784 1781 1786 1787 1788 1785 1790 1791 1792 1789 1794 1795 1796 1793 1798 1799 1800 1797 1802 1803 1804 1801 1806 1807 1808 1805 1810 1811 1812 1809 1814 1815 1816 1813 1818 1819 1820 1817 1822 1823 1824 1821 1826 1827 1828 1825 1830 1831 1832 1829 1834 1835 1836 1833 1838 1839 1840 1837 1842 1843 1844 1841 1846 1847 1848 1845 1850 1851 1852 1849 1854 1855 1856 1853 1858 1859 1860 1857 1862 1863 1864 1861 1866 1867 1868 1865 1870 1871 1872 1869 1874 1875 1876 1873 1878 1879 1880 1877 1882 1883 1884 1881 1886 1887 1888 1885 1890 1891 1892 1889 1894 1895 1896 1893 1898 1899 1900 1897 1902 1903 1904 1901 1906 1907 1908 1905 1910 1911 1912 1909 1914 1915 1916 1913 1918 1919 1920 1917 1922 1923 1924 1921 1926 1927 1928 1925 1930 1931 1932 1929 1934 1935 1936 1933 1938 1939 1940 1937 1942 1943 1944 1941 1946 1947 1948 1945 1950 1951 1952 1949 1954 1955 1956 1953 1958 1959 1960 1957 1962 1963 1964 1961 1966 1967 1968 1965 1970 1971 1972 1969 1974 1975 1976 1973 1978 1979 1980 1977 1982 1983 1984 1981 1986 1987 1988 1985 1990 1991 1992 1989 1994 1995 1996 1993 1998 1999 2000 1997 2002 2003 2004 2001 2006 2007 2008 2005 2010 2011 2012 2009 2014 2015 2016 2013 2018 2019 2020 2017 2022 2023 2024 2021 2026 2027 2028 2025 2030 2031 2032 2029 2034 2035 2036 2033 2038 2039 2040 2037 2042 2043 2044 2041 2046 2047 2048 2045 2050 2051 2052 2049 2054 2055 2056 2053 2058 2059 2060 2057 2062 2063 2064 2061 2066 2067 2068 2065 2070 2071 2072 2069 2074 2075 2076 2073 2078 2079 2080 2077 2082 2083 2084 2081 2086 2087 2088 2085 2090 2091 2092 2089 2094 2095 2096 2093 2098 2099 2100 2097 2102 2103 2104 2101 2106 2107 2108 2105 2110 2111 2112 2109 2114 2115 2116 2113 2118 2119 2120 2117 2122 2123 2124 2121 2126 2127 2128 2125 2130 2131 2132 2129 2134 2135 2136 2133 2138 2139 2140 2137 2142 2143 2144 2141 2146 2147 2148 2145 2150 2151 2152 2149 2154 2155 2156 2153 2158 2159 2160 2157 2162 2163 2164 2161 2166 2167 2168 2165 2170 2171 2172 2169 2174 2175 2176 2173 2178 2179 2180 2177 2182 2183 2184 2181 2186 2187 2188 2185 2190 2191 2192 2189 2194 2195 2196 2193 2198 2199 2200 2197 2202 2203 2204 2201 2206 2207 2208 2205 2210 2211 2212 2209 2214 2215 2216 2213 2218 2219 2220 2217 2222 2223 2224 2221 2226 2227 2228 2225 2230 2231 2232 2229 2234 2235 2236 2233 2238 2239 2240 2237 2242 2243 2244 2241 2246 2247 2248 2245 2250 2251 2252 2249 2254 2255 2256 2253 2258 2259 2260 2257 2262 2263 2264 2261 2266 2267 2268 2265 2270 2271 2272 2269 2274 2275 2276 2273 2278 2279 2280 2277 2282 2283 2284 2281 2286 2287 2288 2285 2290 2291 2292 2289 2294 2295 2296 2293 2298 2299 2300 2297 2302 2303 2304 2301 2306 2307 2308 2305 2310 2311 2312 2309 2314 2315 2316 2313 2318 2319 2320 2317 2322 2323 2324 2321 2326 2327 2328 2325 2330 2331 2332 2329 2334 2335 2336 2333 2338 2339 2340 2337 2342 2343 2344 2341 2346 2347 2348 2345 2350 2351 2352 2349 2354 2355 2356 2353 2358 2359 2360 2357 2362 2363 2364 2361 2366 2367 2368 2365 2370 2371 2372 2369 2374 2375 2376 2373 2378 2379 2380 2377 2382 2383 2384 2381 2386 2387 2388 2385 2390 2391 2392 2389 2394 2395 2396 2393 2398 2399 2400 2397 2402 2403 2404 2401 2406 2407 2408 2405 2410 2411 2412 2409 2414 2415 2416 2413 2418 2419 2420 2417 2422 2423 2424 2421 2426 2427 2428 2425 2430 2431 2432 2429 2434 2435 2436 2433 2438 2439 2440 2437 2442 2443 2444 2441 2446 2447 2448 2445 2450 2451 2452 2449 2454 2455 2456 2453 2458 2459 2460 2457 2462 2463 2464 2461 2466 2467 2468 2465 2470 2471 2472 2469 2474 2475 2476 2473 2478 2479 2480 2477 2482 2483 2484 2481 2486 2487 2488 2485 2490 2491 2492 2489 2494 2495 2496 2493 2498 2499 2500 2497 2502 2503 2504 2501 2506 2507 2508 2505 2510 2511 2512 2509 2514 2515 2516 2513 2518 2519 2520 2517 2522 2523 2524 2521 2526 2527 2528 2525 2530 2531 2532 2529 2534 2535 2536 2533 2538 2539 2540 2537 2542 2543 2544 2541 2546 2547 2548 2545 2550 2551 2552 2549 2554 2555 2556 2553 2558 2559 2560 2557 2562 2563 2564 2561 2566 2567 2568 2565 2570 2571 2572 2569 2574 2575 2576 2573 2578 2579 2580 2577 2582 2583 2584 2581 2586 2587 2588 2585 2590 2591 2592 2589 2594 2595 2596 2593 2598 2599 2600 2597 2602 2603 2604 2601 2606 2607 2608 2605 2610 2611 2612 2609 2614 2615 2616 2613 2618 2619 2620 2617 2622 2623 2624 2621 2626 2627 2628 2625 2630 2631 2632 2629 2634 2635 2636 2633 2638 2639 2640 2637 2642 2643 2644 2641 2646 2647 2648 2645 2650 2651 2652 2649 2654 2655 2656 2653 2658 2659 2660 2657 2662 2663 2664 2661 2666 2667 2668 2665 2670 2671 2672 2669 2674 2675 2676 2673 2678 2679 2680 2677 2682 2683 2684 2681 2686 2687 2688 2685 2690 2691 2692 2689 2694 2695 2696 2693 2698 2699 2700 2697 2702 2703 2704 2701 2706 2707 2708 2705 2710 2711 2712 2709 2714 2715 2716 2713 2718 2719 2720 2717 2722 2723 2724 2721 2726 2727 2728 2725 2730 2731 2732 2729 2734 2735 2736 2733 2738 2739 2740 2737 2742 2743 2744 2741 2746 2747 2748 2745 2750 2751 2752 2749 2754 2755 2756 2753 2758 2759 2760 2757 2762 2763 2764 2761 2766 2767 2768 2765 2770 2771 2772 2769 2774 2775 2776 2773 2778 2779 2780 2777 2782 2783 2784 2781 2786 2787 2788 2785 2790 2791 2792 2789 2794 2795 2796 2793 2798 2799 2800 2797 2802 2803 2804 2801 2806 2807 2808 2805 2810 2811 2812 2809 2814 2815 2816 2813 2818 2819 2820 2817 2822 2823 2824 2821 2826 2827 2828 2825 2830 2831 2832 2829 2834 2835 2836 2833 2838 2839 2840 2837 2842 2843 2844 2841 2846 2847 2848 2845 2850 2851 2852 2849 2854 2855 2856 2853 2858 2859 2860 2857 2862 2863 2864 2861 2866 2867 2868 2865 2870 2871 2872 2869 2874 2875 2876 2873 2878 2879 2880 2877 2882 2883 2884 2881 2886 2887 2888 2885 2890 2891 2892 2889 2894 2895 2896 2893 2898 2899 2900 2897 2902 2903 2904 2901 2906 2907 2908 2905 2910 2911 2912 2909 2914 2915 2916 2913 2918 2919 2920 2917 2922 2923 2924 2921 2926 2927 2928 2925 2930 2931 2932 2929 2934 2935 2936 2933 2938 2939 2940 2937 2942 2943 2944 2941 2946 2947 2948 2945 2950 2951 2952 2949 2954 2955 2956 2953 2958 2959 2960 2957 2962 2963 2964 2961 2966 2967 2968 2965 2970 2971 2972 2969 2974 2975 2976 2973 2978 2979 2980 2977 2982 2983 2984 2981 2986 2987 2988 2985 2990 2991 2992 2989 2994 2995 2996 2993 2998 2999 3000 2997 3002 3003 3004 3001 3006 3007 3008 3005 3010 3011 3012 3009 3014 3015 3016 3013 3018 3019 3020 3017 3022 3023 3024 3021 3026 3027 3028 3025 3030 3031 3032 3029 3034 3035 3036 3033 3038 3039 3040 3037 3042 3043 3044 3041 3046 3047 3048 3045 3050 3051 3052 3049 3054 3055 3056 3053 3058 3059 3060 3057 3062 3063 3064 3061 3066 3067 3068 3065 3070 3071 3072 3069 3074 3075 3076 3073 3078 3079 3080 3077 3082 3083 3084 3081 3086 3087 3088 3085 3090 3091 3092 3089 3094 3095 3096 3093 3098 3099 3100 3097 3102 3103 3104 3101 3106 3107 3108 3105 3110 3111 3112 3109 3114 3115 3116 3113 3118 3119 3120 3117 3122 3123 3124 3121 3126 3127 3128 3125 3130 3131 3132 3129 3134 3135 3136 3133 3138 3139 3140 3137 3142 3143 3144 3141 3146 3147 3148 3145 3150 3151 3152 3149 3154 3155 3156 3153 3158 3159 3160 3157 3162 3163 3164 3161 3166 3167 3168 3165 3170 3171 3172 3169 3174 3175 3176 3173 3178 3179 3180 3177 3182 3183 3184 3181 3186 3187 3188 3185 3190 3191 3192 3189 3194 3195 3196 3193 3198 3199 3200 3197 3202 3203 3204 3201 3206 3207 3208 3205 3210 3211 3212 3209 3214 3215 3216 3213 3218 3219 3220 3217 3222 3223 3224 3221 3226 3227 3228 3225 3230 3231 3232 3229 3234 3235 3236 3233 3238 3239 3240 3237 3242 3243 3244 3241 3246 3247 3248 3245 3250 3251 3252 3249 3254 3255 3256 3253 3258 3259 3260 3257 3262 3263 3264 3261 3266 3267 3268 3265 3270 3271 3272 3269 3274 3275 3276 3273 3278 3279 3280 3277 3282 3283 3284 3281 3286 3287 3288 3285 3290 3291 3292 3289 3294 3295 3296 3293 3298 3299 3300 3297 3302 3303 3304 3301 3306 3307 3308 3305 3310 3311 3312 3309 3314 3315 3316 3313 3318 3319 3320 3317 3322 3323 3324 3321 3326 3327 3328 3325 3330 3331 3332 3329 3334 3335 3336 3333 3338 3339 3340 3337 3342 3343 3344 3341 3346 3347 3348 3345 3350 3351 3352 3349 3354 3355 3356 3353 3358 3359 3360 3357 3362 3363 3364 3361 3366 3367 3368 3365 3370 3371 3372 3369 3374 3375 3376 3373 3378 3379 3380 3377 3382 3383 3384 3381 3386 3387 3388 3385 3390 3391 3392 3389 3394 3395 3396 3393 3398 3399 3400 3397 3402 3403 3404 3401 3406 3407 3408 3405 3410 3411 3412 3409 3414 3415 3416 3413 3418 3419 3420 3417 3422 3423 3424 3421 3426 3427 3428 3425 3430 3431 3432 3429 3434 3435 3436 3433 3438 3439 3440 3437 3442 3443 3444 3441 3446 3447 3448 3445 3450 3451 3452 3449 3454 3455 3456 3453 3458 3459 3460 3457 3462 3463 3464 3461 3466 3467 3468 3465 3470 3471 3472 3469 3474 3475 3476 3473 3478 3479 3480 3477 3482 3483 3484 3481 3486 3487 3488 3485 3490 3491 3492 3489 3494 3495 3496 3493 3498 3499 3500 3497 3502 3503 3504 3501 3506 3507 3508 3505 3510 3511 3512 3509 3514 3515 3516 3513 3518 3519 3520 3517 3522 3523 3524 3521 3526 3527 3528 3525 3530 3531 3532 3529 3534 3535 3536 3533 3538 3539 3540 3537 3542 3543 3544 3541 3546 3547 3548 3545 3550 3551 3552 3549 3554 3555 3556 3553 3558 3559 3560 3557 3562 3563 3564 3561 3566 3567 3568 3565 3570 3571 3572 3569 3574 3575 3576 3573 3578 3579 3580 3577 3582 3583 3584 3581 3586 3587 3588 3585 3590 3591 3592 3589 3594 3595 3596 3593 3598 3599 3600 3597 3602 3603 3604 3601 3606 3607 3608 3605 3610 3611 3612 3609 3614 3615 3616 3613 3618 3619 3620 3617 3622 3623 3624 3621 3626 3627 3628 3625 3630 3631 3632 3629 3634 3635 3636 3633 3638 3639 3640 3637 3642 3643 3644 3641 3646 3647 3648 3645 3650 3651 3652 3649 3654 3655 3656 3653 3658 3659 3660 3657 3662 3663 3664 3661 3666 3667 3668 3665 3670 3671 3672 3669 3674 3675 3676 3673 3678 3679 3680 3677 3682 3683 3684 3681 3686 3687 3688 3685 3690 3691 3692 3689 3694 3695 3696 3693 3698 3699 3700 3697 3702 3703 3704 3701 3706 3707 3708 3705 3710 3711 3712 3709 3714 3715 3716 3713 3718 3719 3720 3717 3722 3723 3724 3721 3726 3727 3728 3725 3730 3731 3732 3729 3734 3735 3736 3733 3738 3739 3740 3737 3742 3743 3744 3741 3746 3747 3748 3745 3750 3751 3752 3749 3754 3755 3756 3753 3758 3759 3760 3757 3762 3763 3764 3761 3766 3767 3768 3765 3770 3771 3772 3769 3774 3775 3776 3773 3778 3779 3780 3777 3782 3783 3784 3781 3786 3787 3788 3785 3790 3791 3792 3789 3794 3795 3796 3793 3798 3799 3800 3797 3802 3803 3804 3801 3806 3807 3808 3805 3810 3811 3812 3809 3814 3815 3816 3813 3818 3819 3820 3817 3822 3823 3824 3821 3826 3827 3828 3825 3830 3831 3832 3829 3834 3835 3836 3833 3838 3839 3840 3837 3842 3843 3844 3841 3846 3847 3848 3845 3850 3851 3852 3849 3854 3855 3856 3853 3858 3859 3860 3857 3862 3863 3864 3861 3866 3867 3868 3865 3870 3871 3872 3869 3874 3875 3876 3873 3878 3879 3880 3877 3882 3883 3884 3881 3886 3887 3888 3885 3890 3891 3892 3889 3894 3895 3896 3893 3898 3899 3900 3897 3902 3903 3904 3901 3906 3907 3908 3905 3910 3911 3912 3909 3914 3915 3916 3913 3918 3919 3920 3917 3922 3923 3924 3921 3926 3927 3928 3925 3930 3931 3932 3929 3934 3935 3936 3933 3938 3939 3940 3937 3942 3943 3944 3941 3946 3947 3948 3945 3950 3951 3952 3949 3954 3955 3956 3953 3958 3959 3960 3957 3962 3963 3964 3961 3966 3967 3968 3965 3970 3971 3972 3969 3974 3975 3976 3973 3978 3979 3980 3977 3982 3983 3984 3981 3986 3987 3988 3985 3990 3991 3992 3989 3994 3995 3996 3993 3998 3999 4000 3997 4002 4003 4004 4001 4006 4007 4008 4005 4010 4011 4012 4009 4014 4015 4016 4013 4018 4019 4020 4017 4022 4023 4024 4021 4026 4027 4028 4025 4030 4031 4032 4029 4034 4035 4036 4033 4038 4039 4040 4037 4042 4043 4044 4041 4046 4047 4048 4045 4050 4051 4052 4049 4054 4055 4056 4053 4058 4059 4060 4057 4062 4063 4064 4061 4066 4067 4068 4065 4070 4071 4072 4069 4074 4075 4076 4073 4078 4079 4080 4077 4082 4083 4084 4081 4086 4087 4088 4085 4090 4091 4092 4089 4094 4095 4096 4093 4098 4099 4100 4097 4102 4103 4104 4101 4106 4107 4108 4105 4110 4111 4112 4109 4114 4115 4116 4113 4118 4119 4120 4117 4122 4123 4124 4121 4126 4127 4128 4125 4130 4131 4132 4129 4134 4135 4136 4133 4138 4139 4140 4137 4142 4143 4144 4141 4146 4147 4148 4145 4150 4151 4152 4149 4154 4155 4156 4153 4158 4159 4160 4157 4162 4163 4164 4161 4166 4167 4168 4165 4170 4171 4172 4169 4174 4175 4176 4173 4178 4179 4180 4177 4182 4183 4184 4181 4186 4187 4188 4185 4190 4191 4192 4189 4194 4195 4196 4193 4198 4199 4200 4197 4202 4203 4204 4201 4206 4207 4208 4205 4210 4211 4212 4209 4214 4215 4216 4213 4218 4219 4220 4217 4222 4223 4224 4221 4226 4227 4228 4225 4230 4231 4232 4229 4234 4235 4236 4233 4238 4239 4240 4237 4242 4243 4244 4241 4246 4247 4248 4245 4250 4251 4252 4249 4254 4255 4256 4253 4258 4259 4260 4257 4262 4263 4264 4261 4266 4267 4268 4265 4270 4271 4272 4269 4274 4275 4276 4273 4278 4279 4280 4277 4282 4283 4284 4281 4286 4287 4288 4285 4290 4291 4292 4289 4294 4295 4296 4293 4298 4299 4300 4297 4302 4303 4304 4301 4306 4307 4308 4305 4310 4311 4312 4309 4314 4315 4316 4313 4318 4319 4320 4317 4322 4323 4324 4321 4326 4327 4328 4325 4330 4331 4332 4329 4334 4335 4336 4333 4338 4339 4340 4337 4342 4343 4344 4341 4346 4347 4348 4345 4350 4351 4352 4349 4354 4355 4356 4353 4358 4359 4360 4357 4362 4363 4364 4361 4366 4367 4368 4365 4370 4371 4372 4369 4374 4375 4376 4373 4378 4379 4380 4377 4382 4383 4384 4381 4386 4387 4388 4385 4390 4391 4392 4389 4394 4395 4396 4393 4398 4399 4400 4397 4402 4403 4404 4401 4406 4407 4408 4405 4410 4411 4412 4409 4414 4415 4416 4413 4418 4419 4420 4417 4422 4423 4424 4421 4426 4427 4428 4425 4430 4431 4432 4429 4434 4435 4436 4433 4438 4439 4440 4437 4442 4443 4444 4441 4446 4447 4448 4445 4450 4451 4452 4449 4454 4455 4456 4453 4458 4459 4460 4457 4462 4463 4464 4461 4466 4467 4468 4465 4470 4471 4472 4469 4474 4475 4476 4473 4478 4479 4480 4477 4482 4483 4484 4481 4486 4487 4488 4485 4490 4491 4492 4489 4494 4495 4496 4493 4498 4499 4500 4497 4502 4503 4504 4501 4506 4507 4508 4505 4510 4511 4512 4509 4514 4515 4516 4513 4518 4519 4520 4517 4522 4523 4524 4521 4526 4527 4528 4525 4530 4531 4532 4529 4534 4535 4536 4533 4538 4539 4540 4537 4542 4543 4544 4541 4546 4547 4548 4545 4550 4551 4552 4549 4554 4555 4556 4553 4558 4559 4560 4557 4562 4563 4564 4561 4566 4567 4568 4565 4570 4571 4572 4569 4574 4575 4576 4573 4578 4579 4580 4577 4582 4583 4584 4581 4586 4587 4588 4585 4590 4591 4592 4589 4594 4595 4596 4593 4598 4599 4600 4597 4602 4603 4604 4601 4606 4607 4608 4605 4610 4611 4612 4609 4614 4615 4616 4613 4618 4619 4620 4617 4622 4623 4624 4621 4626 4627 4628 4625 4630 4631 4632 4629 4634 4635 4636 4633 4638 4639 4640 4637 4642 4643 4644 4641 4646 4647 4648 4645 4650 4651 4652 4649 4654 4655 4656 4653 4658 4659 4660 4657 4662 4663 4664 4661 4666 4667 4668 4665 4670 4671 4672 4669 4674 4675 4676 4673 4678 4679 4680 4677 4682 4683 4684 4681 4686 4687 4688 4685 4690 4691 4692 4689 4694 4695 4696 4693 4698 4699 4700 4697 4702 4703 4704 4701 4706 4707 4708 4705 4710 4711 4712 4709 4714 4715 4716 4713 4718 4719 4720 4717 4722 4723 4724 4721 4726 4727 4728 4725 4730 4731 4732 4729 4734 4735 4736 4733 4738 4739 4740 4737 4742 4743 4744 4741 4746 4747 4748 4745 4750 4751 4752 4749 4754 4755 4756 4753 4758 4759 4760 4757 4762 4763 4764 4761 4766 4767 4768 4765 4770 4771 4772 4769 4774 4775 4776 4773 4778 4779 4780 4777 4782 4783 4784 4781 4786 4787 4788 4785 4790 4791 4792 4789 4794 4795 4796 4793 4798 4799 4800 4797 4802 4803 4804 4801 4806 4807 4808 4805 4810 4811 4812 4809 4814 4815 4816 4813 4818 4819 4820 4817 4822 4823 4824 4821 4826 4827 4828 4825 4830 4831 4832 4829 4834 4835 4836 4833 4838 4839 4840 4837 4842 4843 4844 4841 4846 4847 4848 4845 4850 4851 4852 4849 4854 4855 4856 4853 4858 4859 4860 4857 4862 4863 4864 4861 4866 4867 4868 4865 4870 4871 4872 4869 4874 4875 4876 4873 4878 4879 4880 4877 4882 4883 4884 4881 4886 4887 4888 4885 4890 4891 4892 4889 4894 4895 4896 4893 4898 4899 4900 4897 4902 4903 4904 4901 4906 4907 4908 4905 4910 4911 4912 4909 4914 4915 4916 4913 4918 4919 4920 4917 4922 4923 4924 4921 4926 4927 4928 4925 4930 4931 4932 4929 4934 4935 4936 4933 4938 4939 4940 4937 4942 4943 4944 4941 4946 4947 4948 4945 4950 4951 4952 4949 4954 4955 4956 4953 4958 4959 4960 4957 4962 4963 4964 4961 4966 4967 4968 4965 4970 4971 4972 4969 4974 4975 4976 4973 4978 4979 4980 4977 4982 4983 4984 4981 4986 4987 4988 4985 4990 4991 4992 4989 4994 4995 4996 4993 4998 4999 5000 4997 5002 5003 5004 5001 5006 5007 5008 5005 5010 5011 5012 5009 5014 5015 5016 5013 5018 5019 5020 5017 5022 5023 5024 5021 5026 5027 5028 5025 5030 5031 5032 5029 5034 5035 5036 5033 5038 5039 5040 5037 5042 5043 5044 5041 5046 5047 5048 5045 5050 5051 5052 5049 5054 5055 5056 5053 5058 5059 5060 5057 5062 5063 5064 5061 5066 5067 5068 5065 5070 5071 5072 5069 5074 5075 5076 5073 5078 5079 5080 5077 5082 5083 5084 5081 5086 5087 5088 5085 5090 5091 5092 5089 5094 5095 5096 5093 5098 5099 5100 5097 5102 5103 5104 5101 5106 5107 5108 5105 5110 5111 5112 5109 5114 5115 5116 5113 5118 5119 5120 5117 5122 5123 5124 5121 5126 5127 5128 5125 5130 5131 5132 5129 5134 5135 5136 5133 5138 5139 5140 5137 5142 5143 5144 5141 5146 5147 5148 5145 5150 5151 5152 5149 5154 5155 5156 5153 5158 5159 5160 5157 5162 5163 5164 5161 5166 5167 5168 5165 5170 5171 5172 5169 5174 5175 5176 5173 5178 5179 5180 5177 5182 5183 5184 5181 5186 5187 5188 5185 5190 5191 5192 5189 5194 5195 5196 5193 5198 5199 5200 5197 5202 5203 5204 5201 5206 5207 5208 5205 5210 5211 5212 5209 5214 5215 5216 5213 5218 5219 5220 5217 5222 5223 5224 5221 5226 5227 5228 5225 5230 5231 5232 5229 5234 5235 5236 5233 5238 5239 5240 5237 5242 5243 5244 5241 5246 5247 5248 5245 5250 5251 5252 5249 5254 5255 5256 5253 5258 5259 5260 5257 5262 5263 5264 5261 5266 5267 5268 5265 5270 5271 5272 5269 5274 5275 5276 5273 5278 5279 5280 5277 5282 5283 5284 5281 5286 5287 5288 5285 5290 5291 5292 5289 5294 5295 5296 5293 5298 5299 5300 5297 5302 5303 5304 5301 5306 5307 5308 5305 5310 5311 5312 5309 5314 5315 5316 5313 5318 5319 5320 5317 5322 5323 5324 5321 5326 5327 5328 5325 5330 5331 5332 5329 5334 5335 5336 5333 5338 5339 5340 5337 5342 5343 5344 5341 5346 5347 5348 5345 5350 5351 5352 5349 5354 5355 5356 5353 5358 5359 5360 5357 5362 5363 5364 5361 5366 5367 5368 5365 5370 5371 5372 5369 5374 5375 5376 5373 5378 5379 5380 5377 5382 5383 5384 5381 5386 5387 5388 5385 5390 5391 5392 5389 5394 5395 5396 5393 5398 5399 5400 5397 5402 5403 5404 5401 5406 5407 5408 5405 5410 5411 5412 5409 5414 5415 5416 5413 5418 5419 5420 5417 5422 5423 5424 5421 5426 5427 5428 5425 5430 5431 5432 5429 5434 5435 5436 5433 5438 5439 5440 5437 5442 5443 5444 5441 5446 5447 5448 5445 5450 5451 5452 5449 5454 5455 5456 5453 5458 5459 5460 5457 5462 5463 5464 5461 5466 5467 5468 5465 5470 5471 5472 5469 5474 5475 5476 5473 5478 5479 5480 5477 5482 5483 5484 5481 5486 5487 5488 5485 5490 5491 5492 5489 5494 5495 5496 5493 5498 5499 5500 5497 5502 5503 5504 5501 5506 5507 5508 5505 5510 5511 5512 5509 5514 5515 5516 5513 5518 5519 5520 5517 5522 5523 5524 5521 5526 5527 5528 5525 5530 5531 5532 5529 5534 5535 5536 5533 5538 5539 5540 5537 5542 5543 5544 5541 5546 5547 5548 5545 5550 5551 5552 5549 5554 5555 5556 5553 5558 5559 5560 5557 5562 5563 5564 5561 5566 5567 5568 5565 5570 5571 5572 5569 5574 5575 5576 5573 5578 5579 5580 5577 5582 5583 5584 5581 5586 5587 5588 5585 5590 5591 5592 5589 5594 5595 5596 5593 5598 5599 5600 5597 5602 5603 5604 5601 5606 5607 5608 5605 5610 5611 5612 5609 5614 5615 5616 5613 5618 5619 5620 5617 5622 5623 5624 5621 5626 5627 5628 5625 5630 5631 5632 5629 5634 5635 5636 5633 5638 5639 5640 5637 5642 5643 5644 5641 5646 5647 5648 5645 5650 5651 5652 5649 5654 5655 5656 5653 5658 5659 5660 5657 5662 5663 5664 5661 5666 5667 5668 5665 5670 5671 5672 5669 5674 5675 5676 5673 5678 5679 5680 5677 5682 5683 5684 5681 5686 5687 5688 5685 5690 5691 5692 5689 5694 5695 5696 5693 5698 5699 5700 5697 5702 5703 5704 5701 5706 5707 5708 5705 5710 5711 5712 5709 5714 5715 5716 5713 5718 5719 5720 5717 5722 5723 5724 5721 5726 5727 5728 5725 5730 5731 5732 5729 5734 5735 5736 5733 5738 5739 5740 5737 5742 5743 5744 5741 5746 5747 5748 5745 5750 5751 5752 5749 5754 5755 5756 5753 5758 5759 5760 5757 5762 5763 5764 5761 5766 5767 5768 5765 5770 5771 5772 5769 5774 5775 5776 5773 5778 5779 5780 5777 5782 5783 5784 5781 5786 5787 5788 5785 5790 5791 5792 5789 5794 5795 5796 5793 5798 5799 5800 5797 5802 5803 5804 5801 5806 5807 5808 5805 5810 5811 5812 5809 5814 5815 5816 5813 5818 5819 5820 5817 5822 5823 5824 5821 5826 5827 5828 5825 5830 5831 5832 5829 5834 5835 5836 5833 5838 5839 5840 5837 5842 5843 5844 5841 5846 5847 5848 5845 5850 5851 5852 5849 5854 5855 5856 5853 5858 5859 5860 5857 5862 5863 5864 5861 5866 5867 5868 5865 5870 5871 5872 5869 5874 5875 5876 5873 5878 5879 5880 5877 5882 5883 5884 5881 5886 5887 5888 5885 5890 5891 5892 5889 5894 5895 5896 5893 5898 5899 5900 5897 5902 5903 5904 5901 5906 5907 5908 5905 5910 5911 5912 5909 5914 5915 5916 5913 5918 5919 5920 5917 5922 5923 5924 5921 5926 5927 5928 5925 5930 5931 5932 5929 5934 5935 5936 5933 5938 5939 5940 5937 5942 5943 5944 5941 5946 5947 5948 5945 5950 5951 5952 5949 5954 5955 5956 5953 5958 5959 5960 5957 5962 5963 5964 5961 5966 5967 5968 5965 5970 5971 5972 5969 5974 5975 5976 5973 5978 5979 5980 5977 5982 5983 5984 5981 5986 5987 5988 5985 5990 5991 5992 5989 5994 5995 5996 5993 5998 5999 6000 5997 6002 6003 6004 6001 6006 6007 6008 6005 6010 6011 6012 6009 6014 6015 6016 6013 6018 6019 6020 6017 6022 6023 6024 6021 6026 6027 6028 6025 6030 6031 6032 6029 6034 6035 6036 6033 6038 6039 6040 6037 6042 6043 6044 6041 6046 6047 6048 6045 6050 6051 6052 6049 6054 6055 6056 6053 6058 6059 6060 6057 6062 6063 6064 6061 6066 6067 6068 6065 6070 6071 6072 6069 6074 6075 6076 6073 6078 6079 6080 6077 6082 6083 6084 6081 6086 6087 6088 6085 6090 6091 6092 6089 6094 6095 6096 6093 6098 6099 6100 6097 6102 6103 6104 6101 6106 6107 6108 6105 6110 6111 6112 6109 6114 6115 6116 6113 6118 6119 6120 6117 6122 6123 6124 6121 6126 6127 6128 6125 6130 6131 6132 6129 6134 6135 6136 6133 6138 6139 6140 6137 6142 6143 6144 6141 6146 6147 6148 6145 6150 6151 6152 6149 6154 6155 6156 6153 6158 6159 6160 6157 6162 6163 6164 6161 6166 6167 6168 6165 6170 6171 6172 6169 6174 6175 6176 6173 6178 6179 6180 6177 6182 6183 6184 6181 6186 6187 6188 6185 6190 6191 6192 6189 6194 6195 6196 6193 6198 6199 6200 6197 6202 6203 6204 6201 6206 6207 6208 6205 6210 6211 6212 6209 6214 6215 6216 6213 6218 6219 6220 6217 6222 6223 6224 6221 6226 6227 6228 6225 6230 6231 6232 6229 6234 6235 6236 6233 6238 6239 6240 6237 6242 6243 6244 6241 6246 6247 6248 6245 6250 6251 6252 6249 6254 6255 6256 6253 6258 6259 6260 6257 6262 6263 6264 6261 6266 6267 6268 6265 6270 6271 6269 6273 6274 6272 6276 6277 6275 6279 6280 6278 6282 6283 6281 6285 6286 6284 6288 6289 6287 6291 6292 6290 6294 6295 6293 6297 6298 6296 6300 6301 6299 6303 6304 6302 6306 6307 6305 6309 6310 6308 6312 6313 6311 6315 6316 6314 6318 6319 6317 6321 6322 6320 6324 6325 6323 6327 6328 6326 6330 6331 6329 6333 6334 6332 6336 6337 6335 6339 6340 6338 6342 6343 6341 6345 6346 6344 6348 6349 6347 6351 6352 6350 6354 6355 6353 6357 6358 6356 6360 6361 6359 6363 6364 6362 6366 6367 6365 6369 6370 6368 6372 6373 6371</clockwise_edges>\n\t\t\t<edge_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</edge_selection>\n\t\t</polyhedra>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.PGPRemesh.torus.ply",
    "content": "ply\r\nformat ascii 1.0\r\ncomment created by torusply\r\ncomment modified by triply\r\ncomment modified by vizply\r\nelement vertex 4608\r\nproperty float32 x\r\nproperty float32 y\r\nproperty float32 z\r\nproperty int32 angle_deficit\r\nelement face 9216\r\nproperty list uint8 int32 vertex_indices\r\nproperty int32 ancestor\r\nend_header\r\n1.5 0 0 1 \r\n1.47721 0 0.260472 1 \r\n1.40954 0 0.51303 1 \r\n1.29904 0 0.75 1 \r\n1.14907 0 0.964181 1 \r\n0.964181 0 1.14907 1 \r\n0.75 0 1.29904 1 \r\n0.51303 0 1.40954 1 \r\n0.260472 0 1.47721 1 \r\n-6.55671e-008 0 1.5 1 \r\n-0.260472 0 1.47721 1 \r\n-0.51303 0 1.40954 1 \r\n-0.75 0 1.29904 1 \r\n-0.964181 0 1.14907 1 \r\n-1.14907 0 0.964181 1 \r\n-1.29904 0 0.75 1 \r\n-1.40954 0 0.51303 1 \r\n-1.47721 0 0.260472 1 \r\n-1.5 0 -1.31134e-007 1 \r\n-1.47721 0 -0.260472 1 \r\n-1.40954 0 -0.513031 1 \r\n-1.29904 0 -0.75 1 \r\n-1.14907 0 -0.964181 1 \r\n-0.964181 0 -1.14907 1 \r\n-0.75 0 -1.29904 1 \r\n-0.513031 0 -1.40954 1 \r\n-0.260472 0 -1.47721 1 \r\n1.78873e-008 0 -1.5 1 \r\n0.260472 0 -1.47721 1 \r\n0.51303 0 -1.40954 1 \r\n0.75 0 -1.29904 1 \r\n0.964181 0 -1.14907 1 \r\n1.14907 0 -0.964182 1 \r\n1.29904 0 -0.75 1 \r\n1.40954 0 -0.513031 1 \r\n1.47721 0 -0.260473 1 \r\n1.46194 0.191342 0 1 \r\n1.43973 0.191342 0.253863 1 \r\n1.37377 0.191342 0.500013 1 \r\n1.26608 0.191342 0.73097 1 \r\n1.11991 0.191342 0.939717 1 \r\n0.939717 0.191342 1.11991 1 \r\n0.73097 0.191342 1.26608 1 \r\n0.500013 0.191342 1.37377 1 \r\n0.253863 0.191342 1.43973 1 \r\n-6.39034e-008 0.191342 1.46194 1 \r\n-0.253863 0.191342 1.43973 1 \r\n-0.500013 0.191342 1.37377 1 \r\n-0.73097 0.191342 1.26608 1 \r\n-0.939717 0.191342 1.11991 1 \r\n-1.11991 0.191342 0.939717 1 \r\n-1.26608 0.191342 0.73097 1 \r\n-1.37377 0.191342 0.500013 1 \r\n-1.43973 0.191342 0.253863 1 \r\n-1.46194 0.191342 -1.27807e-007 1 \r\n-1.43973 0.191342 -0.253863 1 \r\n-1.37377 0.191342 -0.500013 1 \r\n-1.26608 0.191342 -0.73097 1 \r\n-1.11991 0.191342 -0.939717 1 \r\n-0.939717 0.191342 -1.11991 1 \r\n-0.73097 0.191342 -1.26608 1 \r\n-0.500013 0.191342 -1.37377 1 \r\n-0.253863 0.191342 -1.43973 1 \r\n1.74335e-008 0.191342 -1.46194 1 \r\n0.253863 0.191342 -1.43973 1 \r\n0.500013 0.191342 -1.37377 1 \r\n0.73097 0.191342 -1.26608 1 \r\n0.939717 0.191342 -1.11991 1 \r\n1.11991 0.191342 -0.939717 1 \r\n1.26608 0.191342 -0.73097 1 \r\n1.37377 0.191342 -0.500013 1 \r\n1.43973 0.191342 -0.253864 1 \r\n1.35355 0.353553 0 1 \r\n1.33299 0.353553 0.235042 1 \r\n1.27192 0.353553 0.462943 1 \r\n1.17221 0.353553 0.676777 1 \r\n1.03688 0.353553 0.870047 1 \r\n0.870047 0.353553 1.03688 1 \r\n0.676777 0.353553 1.17221 1 \r\n0.462943 0.353553 1.27192 1 \r\n0.235042 0.353553 1.33299 1 \r\n-5.91657e-008 0.353553 1.35355 1 \r\n-0.235042 0.353553 1.33299 1 \r\n-0.462943 0.353553 1.27192 1 \r\n-0.676777 0.353553 1.17221 1 \r\n-0.870047 0.353553 1.03688 1 \r\n-1.03688 0.353553 0.870047 1 \r\n-1.17221 0.353553 0.676777 1 \r\n-1.27192 0.353553 0.462943 1 \r\n-1.33299 0.353553 0.235042 1 \r\n-1.35355 0.353553 -1.18331e-007 1 \r\n-1.33299 0.353553 -0.235042 1 \r\n-1.27192 0.353553 -0.462943 1 \r\n-1.17221 0.353553 -0.676777 1 \r\n-1.03688 0.353553 -0.870047 1 \r\n-0.870047 0.353553 -1.03688 1 \r\n-0.676777 0.353553 -1.17221 1 \r\n-0.462943 0.353553 -1.27192 1 \r\n-0.235042 0.353553 -1.33299 1 \r\n1.6141e-008 0.353553 -1.35355 1 \r\n0.235042 0.353553 -1.33299 1 \r\n0.462942 0.353553 -1.27192 1 \r\n0.676777 0.353553 -1.17221 1 \r\n0.870047 0.353553 -1.03688 1 \r\n1.03688 0.353553 -0.870048 1 \r\n1.17221 0.353553 -0.676776 1 \r\n1.27192 0.353553 -0.462943 1 \r\n1.33299 0.353553 -0.235042 1 \r\n1.19134 0.46194 0 1 \r\n1.17324 0.46194 0.206874 1 \r\n1.1195 0.46194 0.407463 1 \r\n1.03173 0.46194 0.595671 1 \r\n0.912621 0.46194 0.76578 1 \r\n0.76578 0.46194 0.912621 1 \r\n0.595671 0.46194 1.03173 1 \r\n0.407463 0.46194 1.1195 1 \r\n0.206874 0.46194 1.17324 1 \r\n-5.20752e-008 0.46194 1.19134 1 \r\n-0.206874 0.46194 1.17324 1 \r\n-0.407463 0.46194 1.1195 1 \r\n-0.595671 0.46194 1.03173 1 \r\n-0.76578 0.46194 0.912621 1 \r\n-0.912621 0.46194 0.76578 1 \r\n-1.03173 0.46194 0.595671 1 \r\n-1.1195 0.46194 0.407463 1 \r\n-1.17324 0.46194 0.206874 1 \r\n-1.19134 0.46194 -1.0415e-007 1 \r\n-1.17324 0.46194 -0.206874 1 \r\n-1.1195 0.46194 -0.407463 1 \r\n-1.03173 0.46194 -0.595671 1 \r\n-0.912621 0.46194 -0.76578 1 \r\n-0.76578 0.46194 -0.912621 1 \r\n-0.595671 0.46194 -1.03173 1 \r\n-0.407463 0.46194 -1.11949 1 \r\n-0.206874 0.46194 -1.17324 1 \r\n1.42066e-008 0.46194 -1.19134 1 \r\n0.206874 0.46194 -1.17324 1 \r\n0.407463 0.46194 -1.1195 1 \r\n0.595671 0.46194 -1.03173 1 \r\n0.76578 0.46194 -0.912621 1 \r\n0.912621 0.46194 -0.76578 1 \r\n1.03173 0.46194 -0.595671 1 \r\n1.1195 0.46194 -0.407463 1 \r\n1.17324 0.46194 -0.206875 1 \r\n1 0.5 0 1 \r\n0.984808 0.5 0.173648 1 \r\n0.939693 0.5 0.34202 1 \r\n0.866025 0.5 0.5 1 \r\n0.766044 0.5 0.642788 1 \r\n0.642788 0.5 0.766044 1 \r\n0.5 0.5 0.866025 1 \r\n0.34202 0.5 0.939693 1 \r\n0.173648 0.5 0.984808 1 \r\n-4.37114e-008 0.5 1 1 \r\n-0.173648 0.5 0.984808 1 \r\n-0.34202 0.5 0.939693 1 \r\n-0.5 0.5 0.866025 1 \r\n-0.642788 0.5 0.766044 1 \r\n-0.766044 0.5 0.642788 1 \r\n-0.866025 0.5 0.5 1 \r\n-0.939693 0.5 0.34202 1 \r\n-0.984808 0.5 0.173648 1 \r\n-1 0.5 -8.74228e-008 1 \r\n-0.984808 0.5 -0.173648 1 \r\n-0.939693 0.5 -0.34202 1 \r\n-0.866025 0.5 -0.5 1 \r\n-0.766044 0.5 -0.642788 1 \r\n-0.642788 0.5 -0.766045 1 \r\n-0.5 0.5 -0.866025 1 \r\n-0.342021 0.5 -0.939692 1 \r\n-0.173648 0.5 -0.984808 1 \r\n1.19249e-008 0.5 -1 1 \r\n0.173648 0.5 -0.984808 1 \r\n0.34202 0.5 -0.939693 1 \r\n0.5 0.5 -0.866025 1 \r\n0.642788 0.5 -0.766044 1 \r\n0.766044 0.5 -0.642788 1 \r\n0.866026 0.5 -0.5 1 \r\n0.939693 0.5 -0.34202 1 \r\n0.984808 0.5 -0.173648 1 \r\n0.808658 0.46194 0 1 \r\n0.796373 0.46194 0.140422 1 \r\n0.75989 0.46194 0.276577 1 \r\n0.700319 0.46194 0.404329 1 \r\n0.619468 0.46194 0.519796 1 \r\n0.519796 0.46194 0.619468 1 \r\n0.404329 0.46194 0.700319 1 \r\n0.276577 0.46194 0.75989 1 \r\n0.140422 0.46194 0.796373 1 \r\n-3.53476e-008 0.46194 0.808658 1 \r\n-0.140422 0.46194 0.796373 1 \r\n-0.276577 0.46194 0.75989 1 \r\n-0.404329 0.46194 0.700319 1 \r\n-0.519796 0.46194 0.619468 1 \r\n-0.619468 0.46194 0.519796 1 \r\n-0.700319 0.46194 0.404329 1 \r\n-0.75989 0.46194 0.276577 1 \r\n-0.796373 0.46194 0.140422 1 \r\n-0.808658 0.46194 -7.06952e-008 1 \r\n-0.796373 0.46194 -0.140422 1 \r\n-0.75989 0.46194 -0.276578 1 \r\n-0.700319 0.46194 -0.404329 1 \r\n-0.619468 0.46194 -0.519796 1 \r\n-0.519795 0.46194 -0.619468 1 \r\n-0.404329 0.46194 -0.700319 1 \r\n-0.276578 0.46194 -0.75989 1 \r\n-0.140422 0.46194 -0.796373 1 \r\n9.64315e-009 0.46194 -0.808658 1 \r\n0.140422 0.46194 -0.796373 1 \r\n0.276577 0.46194 -0.75989 1 \r\n0.404329 0.46194 -0.700319 1 \r\n0.519795 0.46194 -0.619468 1 \r\n0.619468 0.46194 -0.519796 1 \r\n0.700319 0.46194 -0.404329 1 \r\n0.75989 0.46194 -0.276578 1 \r\n0.796373 0.46194 -0.140422 1 \r\n0.646447 0.353553 0 1 \r\n0.636626 0.353553 0.112254 1 \r\n0.607461 0.353553 0.221098 1 \r\n0.559839 0.353553 0.323223 1 \r\n0.495207 0.353553 0.415528 1 \r\n0.415528 0.353553 0.495207 1 \r\n0.323223 0.353553 0.559839 1 \r\n0.221098 0.353553 0.607461 1 \r\n0.112254 0.353553 0.636626 1 \r\n-2.82571e-008 0.353553 0.646447 1 \r\n-0.112254 0.353553 0.636626 1 \r\n-0.221098 0.353553 0.607461 1 \r\n-0.323223 0.353553 0.559839 1 \r\n-0.415528 0.353553 0.495207 1 \r\n-0.495207 0.353553 0.415528 1 \r\n-0.559839 0.353553 0.323223 1 \r\n-0.607461 0.353553 0.221098 1 \r\n-0.636626 0.353553 0.112254 1 \r\n-0.646447 0.353553 -5.65142e-008 1 \r\n-0.636626 0.353553 -0.112254 1 \r\n-0.607461 0.353553 -0.221098 1 \r\n-0.559839 0.353553 -0.323223 1 \r\n-0.495207 0.353553 -0.415528 1 \r\n-0.415528 0.353553 -0.495207 1 \r\n-0.323223 0.353553 -0.559839 1 \r\n-0.221098 0.353553 -0.607461 1 \r\n-0.112254 0.353553 -0.636626 1 \r\n7.7088e-009 0.353553 -0.646447 1 \r\n0.112254 0.353553 -0.636626 1 \r\n0.221098 0.353553 -0.607461 1 \r\n0.323223 0.353553 -0.559839 1 \r\n0.415528 0.353553 -0.495207 1 \r\n0.495207 0.353553 -0.415528 1 \r\n0.559839 0.353553 -0.323223 1 \r\n0.607461 0.353553 -0.221098 1 \r\n0.636626 0.353553 -0.112254 1 \r\n0.53806 0.191342 0 1 \r\n0.529886 0.191342 0.0934332 1 \r\n0.505611 0.191342 0.184027 1 \r\n0.465974 0.191342 0.26903 1 \r\n0.412178 0.191342 0.345858 1 \r\n0.345858 0.191342 0.412178 1 \r\n0.26903 0.191342 0.465974 1 \r\n0.184027 0.191342 0.505611 1 \r\n0.0934332 0.191342 0.529886 1 \r\n-2.35194e-008 0.191342 0.53806 1 \r\n-0.0934332 0.191342 0.529886 1 \r\n-0.184027 0.191342 0.505611 1 \r\n-0.26903 0.191342 0.465974 1 \r\n-0.345858 0.191342 0.412178 1 \r\n-0.412178 0.191342 0.345858 1 \r\n-0.465974 0.191342 0.26903 1 \r\n-0.505611 0.191342 0.184027 1 \r\n-0.529886 0.191342 0.0934332 1 \r\n-0.53806 0.191342 -4.70387e-008 1 \r\n-0.529886 0.191342 -0.0934332 1 \r\n-0.505611 0.191342 -0.184028 1 \r\n-0.465974 0.191342 -0.26903 1 \r\n-0.412178 0.191342 -0.345858 1 \r\n-0.345858 0.191342 -0.412178 1 \r\n-0.26903 0.191342 -0.465974 1 \r\n-0.184028 0.191342 -0.505611 1 \r\n-0.0934332 0.191342 -0.529886 1 \r\n6.4163e-009 0.191342 -0.53806 1 \r\n0.0934332 0.191342 -0.529886 1 \r\n0.184027 0.191342 -0.505611 1 \r\n0.26903 0.191342 -0.465974 1 \r\n0.345858 0.191342 -0.412178 1 \r\n0.412178 0.191342 -0.345859 1 \r\n0.465974 0.191342 -0.26903 1 \r\n0.505611 0.191342 -0.184028 1 \r\n0.529886 0.191342 -0.0934333 1 \r\n0.5 -4.37114e-008 0 1 \r\n0.492404 -4.37114e-008 0.0868241 1 \r\n0.469846 -4.37114e-008 0.17101 1 \r\n0.433013 -4.37114e-008 0.25 1 \r\n0.383022 -4.37114e-008 0.321394 1 \r\n0.321394 -4.37114e-008 0.383022 1 \r\n0.25 -4.37114e-008 0.433013 1 \r\n0.17101 -4.37114e-008 0.469846 1 \r\n0.0868241 -4.37114e-008 0.492404 1 \r\n-2.18557e-008 -4.37114e-008 0.5 1 \r\n-0.0868241 -4.37114e-008 0.492404 1 \r\n-0.17101 -4.37114e-008 0.469846 1 \r\n-0.25 -4.37114e-008 0.433013 1 \r\n-0.321394 -4.37114e-008 0.383022 1 \r\n-0.383022 -4.37114e-008 0.321394 1 \r\n-0.433013 -4.37114e-008 0.25 1 \r\n-0.469846 -4.37114e-008 0.17101 1 \r\n-0.492404 -4.37114e-008 0.0868241 1 \r\n-0.5 -4.37114e-008 -4.37114e-008 1 \r\n-0.492404 -4.37114e-008 -0.0868241 1 \r\n-0.469846 -4.37114e-008 -0.17101 1 \r\n-0.433013 -4.37114e-008 -0.25 1 \r\n-0.383022 -4.37114e-008 -0.321394 1 \r\n-0.321394 -4.37114e-008 -0.383022 1 \r\n-0.25 -4.37114e-008 -0.433013 1 \r\n-0.17101 -4.37114e-008 -0.469846 1 \r\n-0.0868241 -4.37114e-008 -0.492404 1 \r\n5.96244e-009 -4.37114e-008 -0.5 1 \r\n0.0868241 -4.37114e-008 -0.492404 1 \r\n0.17101 -4.37114e-008 -0.469846 1 \r\n0.25 -4.37114e-008 -0.433013 1 \r\n0.321394 -4.37114e-008 -0.383022 1 \r\n0.383022 -4.37114e-008 -0.321394 1 \r\n0.433013 -4.37114e-008 -0.25 1 \r\n0.469846 -4.37114e-008 -0.17101 1 \r\n0.492404 -4.37114e-008 -0.0868242 1 \r\n0.53806 -0.191342 0 1 \r\n0.529886 -0.191342 0.0934332 1 \r\n0.505611 -0.191342 0.184027 1 \r\n0.465974 -0.191342 0.26903 1 \r\n0.412178 -0.191342 0.345858 1 \r\n0.345858 -0.191342 0.412178 1 \r\n0.26903 -0.191342 0.465974 1 \r\n0.184027 -0.191342 0.505611 1 \r\n0.0934332 -0.191342 0.529886 1 \r\n-2.35194e-008 -0.191342 0.53806 1 \r\n-0.0934332 -0.191342 0.529886 1 \r\n-0.184027 -0.191342 0.505611 1 \r\n-0.26903 -0.191342 0.465974 1 \r\n-0.345858 -0.191342 0.412178 1 \r\n-0.412178 -0.191342 0.345858 1 \r\n-0.465974 -0.191342 0.26903 1 \r\n-0.505611 -0.191342 0.184027 1 \r\n-0.529886 -0.191342 0.0934332 1 \r\n-0.53806 -0.191342 -4.70387e-008 1 \r\n-0.529886 -0.191342 -0.0934332 1 \r\n-0.505611 -0.191342 -0.184028 1 \r\n-0.465974 -0.191342 -0.26903 1 \r\n-0.412178 -0.191342 -0.345858 1 \r\n-0.345858 -0.191342 -0.412178 1 \r\n-0.26903 -0.191342 -0.465974 1 \r\n-0.184028 -0.191342 -0.505611 1 \r\n-0.0934332 -0.191342 -0.529886 1 \r\n6.4163e-009 -0.191342 -0.53806 1 \r\n0.0934332 -0.191342 -0.529886 1 \r\n0.184027 -0.191342 -0.505611 1 \r\n0.26903 -0.191342 -0.465974 1 \r\n0.345858 -0.191342 -0.412178 1 \r\n0.412178 -0.191342 -0.345859 1 \r\n0.465974 -0.191342 -0.26903 1 \r\n0.505611 -0.191342 -0.184028 1 \r\n0.529886 -0.191342 -0.0934333 1 \r\n0.646447 -0.353553 0 1 \r\n0.636626 -0.353553 0.112254 1 \r\n0.607461 -0.353553 0.221098 1 \r\n0.559839 -0.353553 0.323223 1 \r\n0.495207 -0.353553 0.415528 1 \r\n0.415528 -0.353553 0.495207 1 \r\n0.323223 -0.353553 0.559839 1 \r\n0.221098 -0.353553 0.607461 1 \r\n0.112254 -0.353553 0.636626 1 \r\n-2.82571e-008 -0.353553 0.646447 1 \r\n-0.112254 -0.353553 0.636626 1 \r\n-0.221098 -0.353553 0.607461 1 \r\n-0.323223 -0.353553 0.559839 1 \r\n-0.415528 -0.353553 0.495207 1 \r\n-0.495207 -0.353553 0.415528 1 \r\n-0.559839 -0.353553 0.323223 1 \r\n-0.607461 -0.353553 0.221098 1 \r\n-0.636626 -0.353553 0.112254 1 \r\n-0.646447 -0.353553 -5.65142e-008 1 \r\n-0.636626 -0.353553 -0.112254 1 \r\n-0.607461 -0.353553 -0.221098 1 \r\n-0.559839 -0.353553 -0.323223 1 \r\n-0.495207 -0.353553 -0.415528 1 \r\n-0.415528 -0.353553 -0.495207 1 \r\n-0.323223 -0.353553 -0.559839 1 \r\n-0.221098 -0.353553 -0.607461 1 \r\n-0.112254 -0.353553 -0.636626 1 \r\n7.7088e-009 -0.353553 -0.646447 1 \r\n0.112254 -0.353553 -0.636626 1 \r\n0.221098 -0.353553 -0.607461 1 \r\n0.323223 -0.353553 -0.559839 1 \r\n0.415528 -0.353553 -0.495207 1 \r\n0.495207 -0.353553 -0.415528 1 \r\n0.559839 -0.353553 -0.323223 1 \r\n0.607461 -0.353553 -0.221098 1 \r\n0.636626 -0.353553 -0.112254 1 \r\n0.808658 -0.46194 0 1 \r\n0.796373 -0.46194 0.140422 1 \r\n0.75989 -0.46194 0.276577 1 \r\n0.700319 -0.46194 0.404329 1 \r\n0.619468 -0.46194 0.519795 1 \r\n0.519795 -0.46194 0.619468 1 \r\n0.404329 -0.46194 0.700319 1 \r\n0.276577 -0.46194 0.75989 1 \r\n0.140422 -0.46194 0.796373 1 \r\n-3.53476e-008 -0.46194 0.808658 1 \r\n-0.140422 -0.46194 0.796373 1 \r\n-0.276577 -0.46194 0.75989 1 \r\n-0.404329 -0.46194 0.700319 1 \r\n-0.519796 -0.46194 0.619468 1 \r\n-0.619468 -0.46194 0.519796 1 \r\n-0.700319 -0.46194 0.404329 1 \r\n-0.75989 -0.46194 0.276577 1 \r\n-0.796373 -0.46194 0.140422 1 \r\n-0.808658 -0.46194 -7.06952e-008 1 \r\n-0.796373 -0.46194 -0.140422 1 \r\n-0.75989 -0.46194 -0.276578 1 \r\n-0.700319 -0.46194 -0.404329 1 \r\n-0.619468 -0.46194 -0.519795 1 \r\n-0.519795 -0.46194 -0.619468 1 \r\n-0.404329 -0.46194 -0.700319 1 \r\n-0.276578 -0.46194 -0.75989 1 \r\n-0.140422 -0.46194 -0.796373 1 \r\n9.64315e-009 -0.46194 -0.808658 1 \r\n0.140422 -0.46194 -0.796373 1 \r\n0.276577 -0.46194 -0.75989 1 \r\n0.404329 -0.46194 -0.700319 1 \r\n0.519795 -0.46194 -0.619468 1 \r\n0.619468 -0.46194 -0.519796 1 \r\n0.700319 -0.46194 -0.404329 1 \r\n0.75989 -0.46194 -0.276578 1 \r\n0.796373 -0.46194 -0.140422 1 \r\n1 -0.5 0 1 \r\n0.984808 -0.5 0.173648 1 \r\n0.939693 -0.5 0.34202 1 \r\n0.866025 -0.5 0.5 1 \r\n0.766044 -0.5 0.642788 1 \r\n0.642788 -0.5 0.766044 1 \r\n0.5 -0.5 0.866025 1 \r\n0.34202 -0.5 0.939693 1 \r\n0.173648 -0.5 0.984808 1 \r\n-4.37114e-008 -0.5 1 1 \r\n-0.173648 -0.5 0.984808 1 \r\n-0.34202 -0.5 0.939693 1 \r\n-0.5 -0.5 0.866025 1 \r\n-0.642788 -0.5 0.766044 1 \r\n-0.766044 -0.5 0.642788 1 \r\n-0.866025 -0.5 0.5 1 \r\n-0.939693 -0.5 0.34202 1 \r\n-0.984808 -0.5 0.173648 1 \r\n-1 -0.5 -8.74228e-008 1 \r\n-0.984808 -0.5 -0.173648 1 \r\n-0.939693 -0.5 -0.34202 1 \r\n-0.866025 -0.5 -0.5 1 \r\n-0.766044 -0.5 -0.642788 1 \r\n-0.642788 -0.5 -0.766045 1 \r\n-0.5 -0.5 -0.866025 1 \r\n-0.342021 -0.5 -0.939692 1 \r\n-0.173648 -0.5 -0.984808 1 \r\n1.19249e-008 -0.5 -1 1 \r\n0.173648 -0.5 -0.984808 1 \r\n0.34202 -0.5 -0.939693 1 \r\n0.5 -0.5 -0.866025 1 \r\n0.642788 -0.5 -0.766044 1 \r\n0.766044 -0.5 -0.642788 1 \r\n0.866026 -0.5 -0.5 1 \r\n0.939693 -0.5 -0.34202 1 \r\n0.984808 -0.5 -0.173648 1 \r\n1.19134 -0.46194 0 1 \r\n1.17324 -0.46194 0.206874 1 \r\n1.1195 -0.46194 0.407463 1 \r\n1.03173 -0.46194 0.595671 1 \r\n0.912621 -0.46194 0.76578 1 \r\n0.76578 -0.46194 0.912621 1 \r\n0.595671 -0.46194 1.03173 1 \r\n0.407463 -0.46194 1.1195 1 \r\n0.206874 -0.46194 1.17324 1 \r\n-5.20752e-008 -0.46194 1.19134 1 \r\n-0.206874 -0.46194 1.17324 1 \r\n-0.407463 -0.46194 1.1195 1 \r\n-0.595671 -0.46194 1.03173 1 \r\n-0.76578 -0.46194 0.912621 1 \r\n-0.912621 -0.46194 0.76578 1 \r\n-1.03173 -0.46194 0.595671 1 \r\n-1.1195 -0.46194 0.407463 1 \r\n-1.17324 -0.46194 0.206874 1 \r\n-1.19134 -0.46194 -1.0415e-007 1 \r\n-1.17324 -0.46194 -0.206874 1 \r\n-1.1195 -0.46194 -0.407463 1 \r\n-1.03173 -0.46194 -0.595671 1 \r\n-0.912621 -0.46194 -0.76578 1 \r\n-0.76578 -0.46194 -0.912621 1 \r\n-0.595671 -0.46194 -1.03173 1 \r\n-0.407463 -0.46194 -1.11949 1 \r\n-0.206874 -0.46194 -1.17324 1 \r\n1.42066e-008 -0.46194 -1.19134 1 \r\n0.206874 -0.46194 -1.17324 1 \r\n0.407463 -0.46194 -1.1195 1 \r\n0.595671 -0.46194 -1.03173 1 \r\n0.76578 -0.46194 -0.912621 1 \r\n0.912621 -0.46194 -0.76578 1 \r\n1.03173 -0.46194 -0.595671 1 \r\n1.1195 -0.46194 -0.407463 1 \r\n1.17324 -0.46194 -0.206875 1 \r\n1.35355 -0.353553 0 1 \r\n1.33299 -0.353553 0.235042 1 \r\n1.27192 -0.353553 0.462942 1 \r\n1.17221 -0.353553 0.676777 1 \r\n1.03688 -0.353553 0.870047 1 \r\n0.870047 -0.353553 1.03688 1 \r\n0.676777 -0.353553 1.17221 1 \r\n0.462943 -0.353553 1.27192 1 \r\n0.235042 -0.353553 1.33299 1 \r\n-5.91657e-008 -0.353553 1.35355 1 \r\n-0.235042 -0.353553 1.33299 1 \r\n-0.462942 -0.353553 1.27192 1 \r\n-0.676777 -0.353553 1.17221 1 \r\n-0.870047 -0.353553 1.03688 1 \r\n-1.03688 -0.353553 0.870047 1 \r\n-1.17221 -0.353553 0.676777 1 \r\n-1.27192 -0.353553 0.462943 1 \r\n-1.33299 -0.353553 0.235042 1 \r\n-1.35355 -0.353553 -1.18331e-007 1 \r\n-1.33299 -0.353553 -0.235042 1 \r\n-1.27192 -0.353553 -0.462943 1 \r\n-1.17221 -0.353553 -0.676777 1 \r\n-1.03688 -0.353553 -0.870047 1 \r\n-0.870047 -0.353553 -1.03688 1 \r\n-0.676777 -0.353553 -1.17221 1 \r\n-0.462943 -0.353553 -1.27192 1 \r\n-0.235042 -0.353553 -1.33299 1 \r\n1.6141e-008 -0.353553 -1.35355 1 \r\n0.235042 -0.353553 -1.33299 1 \r\n0.462942 -0.353553 -1.27192 1 \r\n0.676777 -0.353553 -1.17221 1 \r\n0.870047 -0.353553 -1.03688 1 \r\n1.03688 -0.353553 -0.870048 1 \r\n1.17221 -0.353553 -0.676776 1 \r\n1.27192 -0.353553 -0.462943 1 \r\n1.33299 -0.353553 -0.235042 1 \r\n1.46194 -0.191342 0 1 \r\n1.43973 -0.191342 0.253863 1 \r\n1.37377 -0.191342 0.500013 1 \r\n1.26608 -0.191342 0.73097 1 \r\n1.11991 -0.191342 0.939717 1 \r\n0.939717 -0.191342 1.11991 1 \r\n0.73097 -0.191342 1.26608 1 \r\n0.500013 -0.191342 1.37377 1 \r\n0.253863 -0.191342 1.43973 1 \r\n-6.39034e-008 -0.191342 1.46194 1 \r\n-0.253863 -0.191342 1.43973 1 \r\n-0.500013 -0.191342 1.37377 1 \r\n-0.73097 -0.191342 1.26608 1 \r\n-0.939717 -0.191342 1.11991 1 \r\n-1.11991 -0.191342 0.939717 1 \r\n-1.26608 -0.191342 0.73097 1 \r\n-1.37377 -0.191342 0.500013 1 \r\n-1.43973 -0.191342 0.253863 1 \r\n-1.46194 -0.191342 -1.27807e-007 1 \r\n-1.43973 -0.191342 -0.253863 1 \r\n-1.37377 -0.191342 -0.500013 1 \r\n-1.26608 -0.191342 -0.73097 1 \r\n-1.11991 -0.191342 -0.939717 1 \r\n-0.939717 -0.191342 -1.11991 1 \r\n-0.73097 -0.191342 -1.26608 1 \r\n-0.500013 -0.191342 -1.37377 1 \r\n-0.253863 -0.191342 -1.43973 1 \r\n1.74335e-008 -0.191342 -1.46194 1 \r\n0.253863 -0.191342 -1.43973 1 \r\n0.500013 -0.191342 -1.37377 1 \r\n0.73097 -0.191342 -1.26608 1 \r\n0.939717 -0.191342 -1.11991 1 \r\n1.11991 -0.191342 -0.939717 1 \r\n1.26608 -0.191342 -0.73097 1 \r\n1.37377 -0.191342 -0.500013 1 \r\n1.43973 -0.191342 -0.253864 1 \r\n1.46972 0.095671 0.128584 1 \r\n1.42506 0.095671 0.381844 1 \r\n1.33711 0.095671 0.623503 1 \r\n1.20853 0.095671 0.846217 1 \r\n1.04322 0.095671 1.04322 1 \r\n0.846217 0.095671 1.20852 1 \r\n0.623503 0.095671 1.33711 1 \r\n0.381844 0.095671 1.42506 1 \r\n0.128584 0.095671 1.46972 1 \r\n-0.128584 0.095671 1.46972 1 \r\n-0.381844 0.095671 1.42506 1 \r\n-0.623503 0.095671 1.33711 1 \r\n-0.846217 0.095671 1.20853 1 \r\n-1.04322 0.095671 1.04322 1 \r\n-1.20852 0.095671 0.846217 1 \r\n-1.33711 0.095671 0.623503 1 \r\n-1.42506 0.095671 0.381844 1 \r\n-1.46972 0.095671 0.128584 1 \r\n-1.46972 0.095671 -0.128584 1 \r\n-1.42506 0.095671 -0.381845 1 \r\n-1.33711 0.095671 -0.623504 1 \r\n-1.20853 0.095671 -0.846217 1 \r\n-1.04322 0.095671 -1.04322 1 \r\n-0.846217 0.095671 -1.20852 1 \r\n-0.623504 0.095671 -1.33711 1 \r\n-0.381845 0.095671 -1.42506 1 \r\n-0.128584 0.095671 -1.46972 1 \r\n0.128584 0.095671 -1.46972 1 \r\n0.381844 0.095671 -1.42506 1 \r\n0.623503 0.095671 -1.33711 1 \r\n0.846217 0.095671 -1.20853 1 \r\n1.04322 0.095671 -1.04322 1 \r\n1.20852 0.095671 -0.846217 1 \r\n1.33711 0.095671 -0.623504 1 \r\n1.42506 0.095671 -0.381845 1 \r\n1.46972 0.095671 -0.128584 1 \r\n1.39705 0.272447 0.122226 1 \r\n1.3546 0.272447 0.362965 1 \r\n1.271 0.272447 0.592676 1 \r\n1.14877 0.272447 0.804378 1 \r\n0.991639 0.272447 0.991639 1 \r\n0.804378 0.272447 1.14877 1 \r\n0.592676 0.272447 1.271 1 \r\n0.362965 0.272447 1.3546 1 \r\n0.122226 0.272447 1.39705 1 \r\n-0.122226 0.272447 1.39705 1 \r\n-0.362965 0.272447 1.3546 1 \r\n-0.592676 0.272447 1.271 1 \r\n-0.804378 0.272447 1.14877 1 \r\n-0.991639 0.272447 0.991639 1 \r\n-1.14877 0.272447 0.804378 1 \r\n-1.271 0.272447 0.592676 1 \r\n-1.3546 0.272447 0.362965 1 \r\n-1.39705 0.272447 0.122226 1 \r\n-1.39705 0.272447 -0.122226 1 \r\n-1.3546 0.272447 -0.362965 1 \r\n-1.271 0.272447 -0.592676 1 \r\n-1.14877 0.272447 -0.804378 1 \r\n-0.991639 0.272447 -0.991639 1 \r\n-0.804378 0.272447 -1.14877 1 \r\n-0.592676 0.272447 -1.271 1 \r\n-0.362965 0.272447 -1.3546 1 \r\n-0.122226 0.272447 -1.39705 1 \r\n0.122226 0.272447 -1.39705 1 \r\n0.362965 0.272447 -1.3546 1 \r\n0.592676 0.272447 -1.271 1 \r\n0.804378 0.272447 -1.14877 1 \r\n0.991639 0.272447 -0.991639 1 \r\n1.14877 0.272447 -0.804378 1 \r\n1.271 0.272447 -0.592676 1 \r\n1.3546 0.272447 -0.362965 1 \r\n1.39705 0.272447 -0.122226 1 \r\n1.26278 0.407746 0.110479 1 \r\n1.22441 0.407746 0.328081 1 \r\n1.14884 0.407746 0.535713 1 \r\n1.03836 0.407746 0.727069 1 \r\n0.896332 0.407746 0.896332 1 \r\n0.727069 0.407746 1.03836 1 \r\n0.535713 0.407746 1.14884 1 \r\n0.328081 0.407746 1.22441 1 \r\n0.110479 0.407746 1.26278 1 \r\n-0.110479 0.407746 1.26278 1 \r\n-0.328081 0.407746 1.22441 1 \r\n-0.535713 0.407746 1.14884 1 \r\n-0.727069 0.407746 1.03836 1 \r\n-0.896332 0.407746 0.896332 1 \r\n-1.03836 0.407746 0.727069 1 \r\n-1.14884 0.407746 0.535713 1 \r\n-1.22441 0.407746 0.328081 1 \r\n-1.26278 0.407746 0.110479 1 \r\n-1.26278 0.407746 -0.110479 1 \r\n-1.22441 0.407746 -0.328081 1 \r\n-1.14884 0.407746 -0.535713 1 \r\n-1.03836 0.407746 -0.727069 1 \r\n-0.896332 0.407746 -0.896332 1 \r\n-0.727069 0.407746 -1.03836 1 \r\n-0.535713 0.407746 -1.14884 1 \r\n-0.328081 0.407746 -1.22441 1 \r\n-0.110479 0.407746 -1.26278 1 \r\n0.110479 0.407746 -1.26278 1 \r\n0.32808 0.407746 -1.22441 1 \r\n0.535713 0.407746 -1.14884 1 \r\n0.727069 0.407746 -1.03836 1 \r\n0.896332 0.407746 -0.896332 1 \r\n1.03836 0.407746 -0.727069 1 \r\n1.14884 0.407746 -0.535713 1 \r\n1.22441 0.407746 -0.328081 1 \r\n1.26278 0.407746 -0.110479 1 \r\n1.08735 0.48097 0.0951305 1 \r\n1.05431 0.48097 0.282501 1 \r\n0.989237 0.48097 0.461289 1 \r\n0.894105 0.48097 0.62606 1 \r\n0.771808 0.48097 0.771808 1 \r\n0.62606 0.48097 0.894105 1 \r\n0.461289 0.48097 0.989237 1 \r\n0.282501 0.48097 1.05431 1 \r\n0.0951305 0.48097 1.08735 1 \r\n-0.0951305 0.48097 1.08735 1 \r\n-0.282501 0.48097 1.05431 1 \r\n-0.461289 0.48097 0.989237 1 \r\n-0.62606 0.48097 0.894105 1 \r\n-0.771808 0.48097 0.771808 1 \r\n-0.894105 0.48097 0.62606 1 \r\n-0.989237 0.48097 0.461289 1 \r\n-1.05431 0.48097 0.282501 1 \r\n-1.08735 0.48097 0.0951305 1 \r\n-1.08735 0.48097 -0.0951305 1 \r\n-1.05431 0.48097 -0.282501 1 \r\n-0.989237 0.48097 -0.461289 1 \r\n-0.894105 0.48097 -0.62606 1 \r\n-0.771808 0.48097 -0.771809 1 \r\n-0.62606 0.48097 -0.894105 1 \r\n-0.461289 0.48097 -0.989234 1 \r\n-0.282502 0.48097 -1.05431 1 \r\n-0.0951305 0.48097 -1.08735 1 \r\n0.0951305 0.48097 -1.08735 1 \r\n0.282501 0.48097 -1.05431 1 \r\n0.461289 0.48097 -0.989237 1 \r\n0.62606 0.48097 -0.894105 1 \r\n0.771808 0.48097 -0.771808 1 \r\n0.894105 0.48097 -0.62606 1 \r\n0.989237 0.48097 -0.461289 1 \r\n1.05431 0.48097 -0.282502 1 \r\n1.08735 0.48097 -0.0951307 1 \r\n0.89746 0.48097 0.0785175 1 \r\n0.870191 0.48097 0.233167 1 \r\n0.816482 0.48097 0.380732 1 \r\n0.737964 0.48097 0.516728 1 \r\n0.637024 0.48097 0.637024 1 \r\n0.516728 0.48097 0.737964 1 \r\n0.380732 0.48097 0.816482 1 \r\n0.233167 0.48097 0.870191 1 \r\n0.0785175 0.48097 0.89746 1 \r\n-0.0785175 0.48097 0.89746 1 \r\n-0.233167 0.48097 0.870191 1 \r\n-0.380732 0.48097 0.816482 1 \r\n-0.516728 0.48097 0.737964 1 \r\n-0.637024 0.48097 0.637024 1 \r\n-0.737964 0.48097 0.516728 1 \r\n-0.816482 0.48097 0.380732 1 \r\n-0.870191 0.48097 0.233167 1 \r\n-0.89746 0.48097 0.0785175 1 \r\n-0.89746 0.48097 -0.0785175 1 \r\n-0.870191 0.48097 -0.233167 1 \r\n-0.816482 0.48097 -0.380732 1 \r\n-0.737964 0.48097 -0.516728 1 \r\n-0.637024 0.48097 -0.637024 1 \r\n-0.516728 0.48097 -0.737964 1 \r\n-0.380732 0.48097 -0.816482 1 \r\n-0.233167 0.48097 -0.870191 1 \r\n-0.0785175 0.48097 -0.89746 1 \r\n0.0785175 0.48097 -0.89746 1 \r\n0.233167 0.48097 -0.870191 1 \r\n0.380732 0.48097 -0.816482 1 \r\n0.516728 0.48097 -0.737964 1 \r\n0.637024 0.48097 -0.637024 1 \r\n0.737964 0.48097 -0.516728 1 \r\n0.816482 0.48097 -0.380732 1 \r\n0.870191 0.48097 -0.233167 1 \r\n0.89746 0.48097 -0.0785175 1 \r\n0.722026 0.407746 0.063169 1 \r\n0.700087 0.407746 0.187588 1 \r\n0.656877 0.407746 0.306307 1 \r\n0.593708 0.407746 0.415719 1 \r\n0.5125 0.407746 0.5125 1 \r\n0.415719 0.407746 0.593708 1 \r\n0.306307 0.407746 0.656877 1 \r\n0.187588 0.407746 0.700087 1 \r\n0.063169 0.407746 0.722026 1 \r\n-0.063169 0.407746 0.722026 1 \r\n-0.187588 0.407746 0.700087 1 \r\n-0.306307 0.407746 0.656877 1 \r\n-0.415719 0.407746 0.593708 1 \r\n-0.5125 0.407746 0.5125 1 \r\n-0.593708 0.407746 0.415719 1 \r\n-0.656877 0.407746 0.306307 1 \r\n-0.700087 0.407746 0.187588 1 \r\n-0.722026 0.407746 0.063169 1 \r\n-0.722026 0.407746 -0.063169 1 \r\n-0.700087 0.407746 -0.187588 1 \r\n-0.656877 0.407746 -0.306307 1 \r\n-0.593708 0.407746 -0.415719 1 \r\n-0.5125 0.407746 -0.5125 1 \r\n-0.415719 0.407746 -0.593708 1 \r\n-0.306307 0.407746 -0.656877 1 \r\n-0.187588 0.407746 -0.700087 1 \r\n-0.063169 0.407746 -0.722026 1 \r\n0.063169 0.407746 -0.722026 1 \r\n0.187588 0.407746 -0.700087 1 \r\n0.306307 0.407746 -0.656877 1 \r\n0.415719 0.407746 -0.593708 1 \r\n0.5125 0.407746 -0.5125 1 \r\n0.593708 0.407746 -0.415719 1 \r\n0.656877 0.407746 -0.306307 1 \r\n0.700087 0.407746 -0.187588 1 \r\n0.722026 0.407746 -0.063169 1 \r\n0.587755 0.272447 0.0514218 1 \r\n0.569896 0.272447 0.152703 1 \r\n0.534721 0.272447 0.249345 1 \r\n0.4833 0.272447 0.33841 1 \r\n0.417193 0.272447 0.417193 1 \r\n0.33841 0.272447 0.4833 1 \r\n0.249344 0.272447 0.534721 1 \r\n0.152703 0.272447 0.569896 1 \r\n0.0514218 0.272447 0.587755 1 \r\n-0.0514218 0.272447 0.587755 1 \r\n-0.152703 0.272447 0.569896 1 \r\n-0.249345 0.272447 0.534721 1 \r\n-0.33841 0.272447 0.4833 1 \r\n-0.417193 0.272447 0.417193 1 \r\n-0.4833 0.272447 0.33841 1 \r\n-0.534721 0.272447 0.249344 1 \r\n-0.569896 0.272447 0.152703 1 \r\n-0.587755 0.272447 0.0514218 1 \r\n-0.587755 0.272447 -0.0514218 1 \r\n-0.569896 0.272447 -0.152703 1 \r\n-0.534721 0.272447 -0.249345 1 \r\n-0.4833 0.272447 -0.33841 1 \r\n-0.417193 0.272447 -0.417193 1 \r\n-0.33841 0.272447 -0.4833 1 \r\n-0.249345 0.272447 -0.534721 1 \r\n-0.152703 0.272447 -0.569896 1 \r\n-0.0514218 0.272447 -0.587755 1 \r\n0.0514218 0.272447 -0.587755 1 \r\n0.152703 0.272447 -0.569896 1 \r\n0.249345 0.272447 -0.534721 1 \r\n0.33841 0.272447 -0.4833 1 \r\n0.417193 0.272447 -0.417193 1 \r\n0.4833 0.272447 -0.33841 1 \r\n0.534721 0.272447 -0.249345 1 \r\n0.569896 0.272447 -0.152703 1 \r\n0.587755 0.272447 -0.0514218 1 \r\n0.515087 0.095671 0.0450643 1 \r\n0.499437 0.095671 0.133824 1 \r\n0.468611 0.095671 0.218517 1 \r\n0.423547 0.095671 0.296571 1 \r\n0.365613 0.095671 0.365613 1 \r\n0.296571 0.095671 0.423547 1 \r\n0.218517 0.095671 0.468611 1 \r\n0.133824 0.095671 0.499437 1 \r\n0.0450643 0.095671 0.515087 1 \r\n-0.0450643 0.095671 0.515087 1 \r\n-0.133824 0.095671 0.499437 1 \r\n-0.218517 0.095671 0.468611 1 \r\n-0.296571 0.095671 0.423547 1 \r\n-0.365613 0.095671 0.365613 1 \r\n-0.423547 0.095671 0.296571 1 \r\n-0.468611 0.095671 0.218517 1 \r\n-0.499437 0.095671 0.133824 1 \r\n-0.515087 0.095671 0.0450643 1 \r\n-0.515087 0.095671 -0.0450643 1 \r\n-0.499437 0.095671 -0.133824 1 \r\n-0.468611 0.095671 -0.218517 1 \r\n-0.423547 0.095671 -0.296571 1 \r\n-0.365613 0.095671 -0.365613 1 \r\n-0.296571 0.095671 -0.423547 1 \r\n-0.218517 0.095671 -0.468611 1 \r\n-0.133824 0.095671 -0.499437 1 \r\n-0.0450643 0.095671 -0.515087 1 \r\n0.0450643 0.095671 -0.515087 1 \r\n0.133824 0.095671 -0.499437 1 \r\n0.218517 0.095671 -0.468611 1 \r\n0.296571 0.095671 -0.423547 1 \r\n0.365613 0.095671 -0.365613 1 \r\n0.423547 0.095671 -0.296571 1 \r\n0.468611 0.095671 -0.218517 1 \r\n0.499437 0.095671 -0.133824 1 \r\n0.515087 0.095671 -0.0450644 1 \r\n0.515087 -0.095671 0.0450643 1 \r\n0.499437 -0.095671 0.133824 1 \r\n0.468611 -0.095671 0.218517 1 \r\n0.423547 -0.095671 0.29657 1 \r\n0.365613 -0.095671 0.365613 1 \r\n0.29657 -0.095671 0.423547 1 \r\n0.218517 -0.095671 0.468611 1 \r\n0.133824 -0.095671 0.499437 1 \r\n0.0450643 -0.095671 0.515087 1 \r\n-0.0450643 -0.095671 0.515087 1 \r\n-0.133824 -0.095671 0.499437 1 \r\n-0.218517 -0.095671 0.468611 1 \r\n-0.29657 -0.095671 0.423547 1 \r\n-0.365613 -0.095671 0.365613 1 \r\n-0.423547 -0.095671 0.29657 1 \r\n-0.468611 -0.095671 0.218517 1 \r\n-0.499437 -0.095671 0.133824 1 \r\n-0.515087 -0.095671 0.0450643 1 \r\n-0.515087 -0.095671 -0.0450643 1 \r\n-0.499437 -0.095671 -0.133824 1 \r\n-0.468611 -0.095671 -0.218517 1 \r\n-0.423547 -0.095671 -0.29657 1 \r\n-0.365613 -0.095671 -0.365613 1 \r\n-0.29657 -0.095671 -0.423547 1 \r\n-0.218517 -0.095671 -0.468611 1 \r\n-0.133824 -0.095671 -0.499437 1 \r\n-0.0450643 -0.095671 -0.515087 1 \r\n0.0450643 -0.095671 -0.515087 1 \r\n0.133824 -0.095671 -0.499437 1 \r\n0.218517 -0.095671 -0.468611 1 \r\n0.29657 -0.095671 -0.423547 1 \r\n0.365613 -0.095671 -0.365613 1 \r\n0.423547 -0.095671 -0.296571 1 \r\n0.468611 -0.095671 -0.218517 1 \r\n0.499437 -0.095671 -0.133824 1 \r\n0.515087 -0.095671 -0.0450644 1 \r\n0.587755 -0.272447 0.0514218 1 \r\n0.569896 -0.272447 0.152703 1 \r\n0.534721 -0.272447 0.249344 1 \r\n0.483299 -0.272447 0.33841 1 \r\n0.417193 -0.272447 0.417193 1 \r\n0.33841 -0.272447 0.483299 1 \r\n0.249344 -0.272447 0.534721 1 \r\n0.152703 -0.272447 0.569896 1 \r\n0.0514218 -0.272447 0.587755 1 \r\n-0.0514218 -0.272447 0.587755 1 \r\n-0.152703 -0.272447 0.569896 1 \r\n-0.249344 -0.272447 0.534721 1 \r\n-0.33841 -0.272447 0.483299 1 \r\n-0.417193 -0.272447 0.417193 1 \r\n-0.483299 -0.272447 0.33841 1 \r\n-0.534721 -0.272447 0.249344 1 \r\n-0.569896 -0.272447 0.152703 1 \r\n-0.587755 -0.272447 0.0514218 1 \r\n-0.587755 -0.272447 -0.0514218 1 \r\n-0.569896 -0.272447 -0.152703 1 \r\n-0.534721 -0.272447 -0.249345 1 \r\n-0.483299 -0.272447 -0.33841 1 \r\n-0.417193 -0.272447 -0.417193 1 \r\n-0.33841 -0.272447 -0.483299 1 \r\n-0.249345 -0.272447 -0.534721 1 \r\n-0.152703 -0.272447 -0.569896 1 \r\n-0.0514218 -0.272447 -0.587755 1 \r\n0.0514218 -0.272447 -0.587755 1 \r\n0.152703 -0.272447 -0.569896 1 \r\n0.249344 -0.272447 -0.534721 1 \r\n0.33841 -0.272447 -0.483299 1 \r\n0.417193 -0.272447 -0.417193 1 \r\n0.483299 -0.272447 -0.33841 1 \r\n0.534721 -0.272447 -0.249345 1 \r\n0.569896 -0.272447 -0.152703 1 \r\n0.587755 -0.272447 -0.0514218 1 \r\n0.722026 -0.407746 0.063169 1 \r\n0.700088 -0.407746 0.187588 1 \r\n0.656877 -0.407746 0.306307 1 \r\n0.593708 -0.407746 0.415719 1 \r\n0.5125 -0.407746 0.5125 1 \r\n0.415719 -0.407746 0.593708 1 \r\n0.306307 -0.407746 0.656877 1 \r\n0.187588 -0.407746 0.700088 1 \r\n0.063169 -0.407746 0.722026 1 \r\n-0.063169 -0.407746 0.722026 1 \r\n-0.187588 -0.407746 0.700088 1 \r\n-0.306307 -0.407746 0.656877 1 \r\n-0.415719 -0.407746 0.593708 1 \r\n-0.5125 -0.407746 0.5125 1 \r\n-0.593708 -0.407746 0.415719 1 \r\n-0.656877 -0.407746 0.306307 1 \r\n-0.700088 -0.407746 0.187588 1 \r\n-0.722026 -0.407746 0.063169 1 \r\n-0.722026 -0.407746 -0.063169 1 \r\n-0.700088 -0.407746 -0.187588 1 \r\n-0.656877 -0.407746 -0.306307 1 \r\n-0.593708 -0.407746 -0.415719 1 \r\n-0.5125 -0.407746 -0.5125 1 \r\n-0.415719 -0.407746 -0.593708 1 \r\n-0.306307 -0.407746 -0.656877 1 \r\n-0.187588 -0.407746 -0.700088 1 \r\n-0.063169 -0.407746 -0.722026 1 \r\n0.063169 -0.407746 -0.722026 1 \r\n0.187588 -0.407746 -0.700088 1 \r\n0.306307 -0.407746 -0.656877 1 \r\n0.415719 -0.407746 -0.593708 1 \r\n0.5125 -0.407746 -0.5125 1 \r\n0.593708 -0.407746 -0.415719 1 \r\n0.656877 -0.407746 -0.306307 1 \r\n0.700088 -0.407746 -0.187588 1 \r\n0.722026 -0.407746 -0.063169 1 \r\n0.89746 -0.48097 0.0785175 1 \r\n0.870191 -0.48097 0.233167 1 \r\n0.816482 -0.48097 0.380732 1 \r\n0.737964 -0.48097 0.516728 1 \r\n0.637024 -0.48097 0.637024 1 \r\n0.516728 -0.48097 0.737964 1 \r\n0.380731 -0.48097 0.816482 1 \r\n0.233167 -0.48097 0.870191 1 \r\n0.0785175 -0.48097 0.89746 1 \r\n-0.0785175 -0.48097 0.89746 1 \r\n-0.233167 -0.48097 0.870191 1 \r\n-0.380732 -0.48097 0.816482 1 \r\n-0.516728 -0.48097 0.737964 1 \r\n-0.637024 -0.48097 0.637024 1 \r\n-0.737964 -0.48097 0.516728 1 \r\n-0.816482 -0.48097 0.380731 1 \r\n-0.870191 -0.48097 0.233167 1 \r\n-0.89746 -0.48097 0.0785175 1 \r\n-0.89746 -0.48097 -0.0785175 1 \r\n-0.870191 -0.48097 -0.233167 1 \r\n-0.816482 -0.48097 -0.380732 1 \r\n-0.737964 -0.48097 -0.516728 1 \r\n-0.637024 -0.48097 -0.637024 1 \r\n-0.516728 -0.48097 -0.737964 1 \r\n-0.380732 -0.48097 -0.816481 1 \r\n-0.233167 -0.48097 -0.870191 1 \r\n-0.0785175 -0.48097 -0.89746 1 \r\n0.0785175 -0.48097 -0.89746 1 \r\n0.233167 -0.48097 -0.870191 1 \r\n0.380732 -0.48097 -0.816482 1 \r\n0.516728 -0.48097 -0.737964 1 \r\n0.637024 -0.48097 -0.637024 1 \r\n0.737964 -0.48097 -0.516728 1 \r\n0.816482 -0.48097 -0.380732 1 \r\n0.870191 -0.48097 -0.233167 1 \r\n0.89746 -0.48097 -0.0785175 1 \r\n1.08735 -0.48097 0.0951305 1 \r\n1.05431 -0.48097 0.282501 1 \r\n0.989237 -0.48097 0.461289 1 \r\n0.894105 -0.48097 0.62606 1 \r\n0.771808 -0.48097 0.771808 1 \r\n0.62606 -0.48097 0.894105 1 \r\n0.461289 -0.48097 0.989237 1 \r\n0.282501 -0.48097 1.05431 1 \r\n0.0951305 -0.48097 1.08735 1 \r\n-0.0951305 -0.48097 1.08735 1 \r\n-0.282501 -0.48097 1.05431 1 \r\n-0.461289 -0.48097 0.989237 1 \r\n-0.62606 -0.48097 0.894105 1 \r\n-0.771808 -0.48097 0.771808 1 \r\n-0.894105 -0.48097 0.62606 1 \r\n-0.989237 -0.48097 0.461289 1 \r\n-1.05431 -0.48097 0.282501 1 \r\n-1.08735 -0.48097 0.0951305 1 \r\n-1.08735 -0.48097 -0.0951305 1 \r\n-1.05431 -0.48097 -0.282501 1 \r\n-0.989237 -0.48097 -0.461289 1 \r\n-0.894105 -0.48097 -0.62606 1 \r\n-0.771808 -0.48097 -0.771809 1 \r\n-0.62606 -0.48097 -0.894105 1 \r\n-0.461289 -0.48097 -0.989234 1 \r\n-0.282502 -0.48097 -1.05431 1 \r\n-0.0951305 -0.48097 -1.08735 1 \r\n0.0951305 -0.48097 -1.08735 1 \r\n0.282501 -0.48097 -1.05431 1 \r\n0.461289 -0.48097 -0.989237 1 \r\n0.62606 -0.48097 -0.894105 1 \r\n0.771808 -0.48097 -0.771808 1 \r\n0.894105 -0.48097 -0.62606 1 \r\n0.989237 -0.48097 -0.461289 1 \r\n1.05431 -0.48097 -0.282502 1 \r\n1.08735 -0.48097 -0.0951307 1 \r\n1.26278 -0.407746 0.110479 1 \r\n1.22441 -0.407746 0.32808 1 \r\n1.14884 -0.407746 0.535713 1 \r\n1.03836 -0.407746 0.727069 1 \r\n0.896332 -0.407746 0.896332 1 \r\n0.727069 -0.407746 1.03836 1 \r\n0.535713 -0.407746 1.14884 1 \r\n0.328081 -0.407746 1.22441 1 \r\n0.110479 -0.407746 1.26278 1 \r\n-0.110479 -0.407746 1.26278 1 \r\n-0.32808 -0.407746 1.22441 1 \r\n-0.535713 -0.407746 1.14884 1 \r\n-0.727069 -0.407746 1.03836 1 \r\n-0.896332 -0.407746 0.896332 1 \r\n-1.03836 -0.407746 0.727069 1 \r\n-1.14884 -0.407746 0.535713 1 \r\n-1.22441 -0.407746 0.328081 1 \r\n-1.26278 -0.407746 0.110479 1 \r\n-1.26278 -0.407746 -0.110479 1 \r\n-1.22441 -0.407746 -0.328081 1 \r\n-1.14884 -0.407746 -0.535713 1 \r\n-1.03836 -0.407746 -0.727069 1 \r\n-0.896332 -0.407746 -0.896332 1 \r\n-0.727069 -0.407746 -1.03836 1 \r\n-0.535713 -0.407746 -1.14884 1 \r\n-0.328081 -0.407746 -1.22441 1 \r\n-0.110479 -0.407746 -1.26278 1 \r\n0.110479 -0.407746 -1.26278 1 \r\n0.32808 -0.407746 -1.22441 1 \r\n0.535713 -0.407746 -1.14884 1 \r\n0.727069 -0.407746 -1.03836 1 \r\n0.896332 -0.407746 -0.896332 1 \r\n1.03836 -0.407746 -0.727069 1 \r\n1.14884 -0.407746 -0.535713 1 \r\n1.22441 -0.407746 -0.328081 1 \r\n1.26278 -0.407746 -0.110479 1 \r\n1.39705 -0.272447 0.122226 1 \r\n1.3546 -0.272447 0.362965 1 \r\n1.27099 -0.272447 0.592676 1 \r\n1.14877 -0.272447 0.804378 1 \r\n0.991638 -0.272447 0.991638 1 \r\n0.804378 -0.272447 1.14877 1 \r\n0.592676 -0.272447 1.271 1 \r\n0.362965 -0.272447 1.3546 1 \r\n0.122226 -0.272447 1.39705 1 \r\n-0.122226 -0.272447 1.39705 1 \r\n-0.362965 -0.272447 1.3546 1 \r\n-0.592676 -0.272447 1.27099 1 \r\n-0.804378 -0.272447 1.14877 1 \r\n-0.991638 -0.272447 0.991638 1 \r\n-1.14877 -0.272447 0.804378 1 \r\n-1.271 -0.272447 0.592676 1 \r\n-1.3546 -0.272447 0.362965 1 \r\n-1.39705 -0.272447 0.122226 1 \r\n-1.39705 -0.272447 -0.122226 1 \r\n-1.3546 -0.272447 -0.362965 1 \r\n-1.27099 -0.272447 -0.592676 1 \r\n-1.14877 -0.272447 -0.804378 1 \r\n-0.991638 -0.272447 -0.991638 1 \r\n-0.804378 -0.272447 -1.14877 1 \r\n-0.592676 -0.272447 -1.271 1 \r\n-0.362965 -0.272447 -1.3546 1 \r\n-0.122226 -0.272447 -1.39705 1 \r\n0.122226 -0.272447 -1.39705 1 \r\n0.362965 -0.272447 -1.3546 1 \r\n0.592676 -0.272447 -1.27099 1 \r\n0.804378 -0.272447 -1.14877 1 \r\n0.991638 -0.272447 -0.991639 1 \r\n1.14877 -0.272447 -0.804378 1 \r\n1.271 -0.272447 -0.592676 1 \r\n1.3546 -0.272447 -0.362965 1 \r\n1.39705 -0.272447 -0.122226 1 \r\n1.46972 -0.095671 0.128584 1 \r\n1.42506 -0.095671 0.381845 1 \r\n1.33711 -0.095671 0.623503 1 \r\n1.20853 -0.095671 0.846217 1 \r\n1.04322 -0.095671 1.04322 1 \r\n0.846217 -0.095671 1.20852 1 \r\n0.623503 -0.095671 1.33711 1 \r\n0.381845 -0.095671 1.42506 1 \r\n0.128584 -0.095671 1.46972 1 \r\n-0.128584 -0.095671 1.46972 1 \r\n-0.381845 -0.095671 1.42506 1 \r\n-0.623503 -0.095671 1.33711 1 \r\n-0.846217 -0.095671 1.20853 1 \r\n-1.04322 -0.095671 1.04322 1 \r\n-1.20852 -0.095671 0.846217 1 \r\n-1.33711 -0.095671 0.623503 1 \r\n-1.42506 -0.095671 0.381845 1 \r\n-1.46972 -0.095671 0.128584 1 \r\n-1.46972 -0.095671 -0.128584 1 \r\n-1.42506 -0.095671 -0.381845 1 \r\n-1.33711 -0.095671 -0.623504 1 \r\n-1.20853 -0.095671 -0.846217 1 \r\n-1.04322 -0.095671 -1.04322 1 \r\n-0.846217 -0.095671 -1.20852 1 \r\n-0.623504 -0.095671 -1.33711 1 \r\n-0.381845 -0.095671 -1.42506 1 \r\n-0.128584 -0.095671 -1.46972 1 \r\n0.128584 -0.095671 -1.46972 1 \r\n0.381845 -0.095671 -1.42506 1 \r\n0.623503 -0.095671 -1.33711 1 \r\n0.846217 -0.095671 -1.20853 1 \r\n1.04322 -0.095671 -1.04322 1 \r\n1.20852 -0.095671 -0.846217 1 \r\n1.33711 -0.095671 -0.623504 1 \r\n1.42506 -0.095671 -0.381845 1 \r\n1.46972 -0.095671 -0.128584 1 \r\n1.48861 0 0.130236 0 \r\n1.47346 0.0478355 0.194528 0 \r\n1.48486 0.0478355 0.064292 0 \r\n1.45847 0.095671 0.257168 0 \r\n1.45473 0.143506 0.191224 0 \r\n1.45083 0.191342 0.126932 0 \r\n1.46583 0.143506 0.064292 0 \r\n1.48097 0.095671 0 0 \r\n1.44338 0 0.386751 0 \r\n1.4173 0.0478355 0.447437 0 \r\n1.45114 0.0478355 0.321158 0 \r\n1.39165 0.095671 0.506521 0 \r\n1.39942 0.143506 0.440929 0 \r\n1.40675 0.191342 0.376938 0 \r\n1.43239 0.143506 0.317854 0 \r\n1.35429 0 0.631515 0 \r\n1.31807 0.0478355 0.686751 0 \r\n1.37333 0.0478355 0.568267 0 \r\n1.28256 0.095671 0.740485 0 \r\n1.30159 0.143506 0.677237 0 \r\n1.31993 0.191342 0.615492 0 \r\n1.35544 0.143506 0.561758 0 \r\n1.22406 0 0.85709 0 \r\n1.1788 0.0478355 0.905199 0 \r\n1.25378 0.0478355 0.798108 0 \r\n1.13449 0.095671 0.951949 0 \r\n1.16422 0.143506 0.892967 0 \r\n1.193 0.191342 0.835343 0 \r\n1.2373 0.143506 0.788594 0 \r\n1.05663 0 1.05663 0 \r\n1.0037 0.0478355 1.09615 0 \r\n1.09615 0.0478355 1.0037 0 \r\n0.951949 0.095671 1.13449 0 \r\n0.991469 0.143506 1.08157 0 \r\n1.02981 0.191342 1.02981 0 \r\n1.08157 0.143506 0.991469 0 \r\n0.85709 0 1.22406 0 \r\n0.798108 0.0478355 1.25378 0 \r\n0.905199 0.0478355 1.1788 0 \r\n0.740485 0.095671 1.28256 0 \r\n0.788594 0.143506 1.2373 0 \r\n0.835343 0.191342 1.193 0 \r\n0.892967 0.143506 1.16422 0 \r\n0.631515 0 1.35429 0 \r\n0.568267 0.0478355 1.37333 0 \r\n0.686751 0.0478355 1.31807 0 \r\n0.506521 0.095671 1.39165 0 \r\n0.561758 0.143506 1.35544 0 \r\n0.615492 0.191342 1.31993 0 \r\n0.677237 0.143506 1.30159 0 \r\n0.386751 0 1.44338 0 \r\n0.321158 0.0478355 1.45114 0 \r\n0.447437 0.0478355 1.4173 0 \r\n0.257168 0.095671 1.45847 0 \r\n0.317854 0.143506 1.43239 0 \r\n0.376938 0.191342 1.40675 0 \r\n0.440929 0.143506 1.39942 0 \r\n0.130236 0 1.48861 0 \r\n0.064292 0.0478355 1.48486 0 \r\n0.194528 0.0478355 1.47346 0 \r\n-6.47352e-008 0.095671 1.48097 0 \r\n0.064292 0.143506 1.46583 0 \r\n0.126931 0.191342 1.45083 0 \r\n0.191224 0.143506 1.45473 0 \r\n-0.130236 0 1.48861 0 \r\n-0.194528 0.0478355 1.47346 0 \r\n-0.064292 0.0478355 1.48486 0 \r\n-0.257168 0.095671 1.45847 0 \r\n-0.191224 0.143506 1.45473 0 \r\n-0.126932 0.191342 1.45083 0 \r\n-0.064292 0.143506 1.46583 0 \r\n-0.386751 0 1.44338 0 \r\n-0.447437 0.0478355 1.4173 0 \r\n-0.321158 0.0478355 1.45114 0 \r\n-0.506521 0.095671 1.39165 0 \r\n-0.440929 0.143506 1.39942 0 \r\n-0.376938 0.191342 1.40675 0 \r\n-0.317854 0.143506 1.43239 0 \r\n-0.631515 0 1.35429 0 \r\n-0.686751 0.0478355 1.31807 0 \r\n-0.568267 0.0478355 1.37333 0 \r\n-0.740485 0.095671 1.28256 0 \r\n-0.677237 0.143506 1.30159 0 \r\n-0.615492 0.191342 1.31993 0 \r\n-0.561758 0.143506 1.35544 0 \r\n-0.85709 0 1.22406 0 \r\n-0.905199 0.0478355 1.1788 0 \r\n-0.798108 0.0478355 1.25378 0 \r\n-0.951949 0.095671 1.13449 0 \r\n-0.892967 0.143506 1.16422 0 \r\n-0.835343 0.191342 1.193 0 \r\n-0.788594 0.143506 1.2373 0 \r\n-1.05663 0 1.05663 0 \r\n-1.09615 0.0478355 1.0037 0 \r\n-1.0037 0.0478355 1.09615 0 \r\n-1.13449 0.095671 0.951949 0 \r\n-1.08157 0.143506 0.991469 0 \r\n-1.02981 0.191342 1.02981 0 \r\n-0.991469 0.143506 1.08157 0 \r\n-1.22406 0 0.85709 0 \r\n-1.25378 0.0478355 0.798108 0 \r\n-1.1788 0.0478355 0.905199 0 \r\n-1.28256 0.095671 0.740485 0 \r\n-1.2373 0.143506 0.788594 0 \r\n-1.193 0.191342 0.835343 0 \r\n-1.16422 0.143506 0.892967 0 \r\n-1.35429 0 0.631515 0 \r\n-1.37333 0.0478355 0.568267 0 \r\n-1.31807 0.0478355 0.686751 0 \r\n-1.39165 0.095671 0.506521 0 \r\n-1.35544 0.143506 0.561758 0 \r\n-1.31993 0.191342 0.615492 0 \r\n-1.30159 0.143506 0.677237 0 \r\n-1.44338 0 0.386751 0 \r\n-1.45114 0.0478355 0.321158 0 \r\n-1.4173 0.0478355 0.447437 0 \r\n-1.45847 0.095671 0.257168 0 \r\n-1.43239 0.143506 0.317854 0 \r\n-1.40675 0.191342 0.376938 0 \r\n-1.39942 0.143506 0.440929 0 \r\n-1.48861 0 0.130236 0 \r\n-1.48486 0.0478355 0.0642919 0 \r\n-1.47346 0.0478355 0.194528 0 \r\n-1.48097 0.095671 -1.2947e-007 0 \r\n-1.46583 0.143506 0.0642919 0 \r\n-1.45083 0.191342 0.126931 0 \r\n-1.45473 0.143506 0.191224 0 \r\n-1.48861 0 -0.130236 0 \r\n-1.47346 0.0478355 -0.194528 0 \r\n-1.48486 0.0478355 -0.0642921 0 \r\n-1.45847 0.095671 -0.257168 0 \r\n-1.45473 0.143506 -0.191224 0 \r\n-1.45083 0.191342 -0.126932 0 \r\n-1.46583 0.143506 -0.0642921 0 \r\n-1.44338 0 -0.386752 0 \r\n-1.4173 0.0478355 -0.447438 0 \r\n-1.45114 0.0478355 -0.321158 0 \r\n-1.39165 0.095671 -0.506522 0 \r\n-1.39942 0.143506 -0.440929 0 \r\n-1.40675 0.191342 -0.376938 0 \r\n-1.43239 0.143506 -0.317854 0 \r\n-1.35429 0 -0.631516 0 \r\n-1.31807 0.0478355 -0.686752 0 \r\n-1.37333 0.0478355 -0.568267 0 \r\n-1.28256 0.095671 -0.740485 0 \r\n-1.30159 0.143506 -0.677237 0 \r\n-1.31993 0.191342 -0.615492 0 \r\n-1.35544 0.143506 -0.561759 0 \r\n-1.22406 0 -0.85709 0 \r\n-1.1788 0.0478355 -0.905199 0 \r\n-1.25378 0.0478355 -0.798108 0 \r\n-1.13449 0.095671 -0.951949 0 \r\n-1.16422 0.143506 -0.892967 0 \r\n-1.193 0.191342 -0.835343 0 \r\n-1.2373 0.143506 -0.788594 0 \r\n-1.05663 0 -1.05663 0 \r\n-1.0037 0.0478355 -1.09615 0 \r\n-1.09615 0.0478355 -1.0037 0 \r\n-0.951949 0.095671 -1.13449 0 \r\n-0.991469 0.143506 -1.08157 0 \r\n-1.02981 0.191342 -1.02981 0 \r\n-1.08157 0.143506 -0.991469 0 \r\n-0.85709 0 -1.22406 0 \r\n-0.798108 0.0478355 -1.25378 0 \r\n-0.905199 0.0478355 -1.1788 0 \r\n-0.740485 0.095671 -1.28256 0 \r\n-0.788594 0.143506 -1.2373 0 \r\n-0.835343 0.191342 -1.193 0 \r\n-0.892967 0.143506 -1.16422 0 \r\n-0.631516 0 -1.35429 0 \r\n-0.568267 0.0478355 -1.37333 0 \r\n-0.686752 0.0478355 -1.31807 0 \r\n-0.506522 0.095671 -1.39165 0 \r\n-0.561759 0.143506 -1.35544 0 \r\n-0.615492 0.191342 -1.31993 0 \r\n-0.677237 0.143506 -1.30159 0 \r\n-0.386752 0 -1.44338 0 \r\n-0.321158 0.0478355 -1.45114 0 \r\n-0.447438 0.0478355 -1.4173 0 \r\n-0.257168 0.095671 -1.45847 0 \r\n-0.317854 0.143506 -1.43239 0 \r\n-0.376938 0.191342 -1.40675 0 \r\n-0.440929 0.143506 -1.39942 0 \r\n-0.130236 0 -1.48861 0 \r\n-0.064292 0.0478355 -1.48486 0 \r\n-0.194528 0.0478355 -1.47346 0 \r\n1.76604e-008 0.095671 -1.48097 0 \r\n-0.064292 0.143506 -1.46583 0 \r\n-0.126931 0.191342 -1.45083 0 \r\n-0.191224 0.143506 -1.45473 0 \r\n0.130236 0 -1.48861 0 \r\n0.194528 0.0478355 -1.47346 0 \r\n0.064292 0.0478355 -1.48486 0 \r\n0.257168 0.095671 -1.45847 0 \r\n0.191224 0.143506 -1.45473 0 \r\n0.126932 0.191342 -1.45083 0 \r\n0.064292 0.143506 -1.46583 0 \r\n0.386751 0 -1.44338 0 \r\n0.447437 0.0478355 -1.4173 0 \r\n0.321158 0.0478355 -1.45114 0 \r\n0.506521 0.095671 -1.39165 0 \r\n0.440929 0.143506 -1.39942 0 \r\n0.376938 0.191342 -1.40675 0 \r\n0.317854 0.143506 -1.43239 0 \r\n0.631515 0 -1.35429 0 \r\n0.686751 0.0478355 -1.31807 0 \r\n0.568267 0.0478355 -1.37333 0 \r\n0.740485 0.095671 -1.28256 0 \r\n0.677237 0.143506 -1.30159 0 \r\n0.615492 0.191342 -1.31993 0 \r\n0.561758 0.143506 -1.35544 0 \r\n0.85709 0 -1.22406 0 \r\n0.905199 0.0478355 -1.1788 0 \r\n0.798108 0.0478355 -1.25378 0 \r\n0.951949 0.095671 -1.13449 0 \r\n0.892967 0.143506 -1.16422 0 \r\n0.835343 0.191342 -1.193 0 \r\n0.788594 0.143506 -1.2373 0 \r\n1.05663 0 -1.05663 0 \r\n1.09615 0.0478355 -1.0037 0 \r\n1.0037 0.0478355 -1.09615 0 \r\n1.13449 0.095671 -0.951949 0 \r\n1.08157 0.143506 -0.991469 0 \r\n1.02981 0.191342 -1.02981 0 \r\n0.991469 0.143506 -1.08157 0 \r\n1.22406 0 -0.857091 0 \r\n1.25378 0.0478355 -0.798108 0 \r\n1.1788 0.0478355 -0.9052 0 \r\n1.28256 0.095671 -0.740485 0 \r\n1.2373 0.143506 -0.788594 0 \r\n1.193 0.191342 -0.835343 0 \r\n1.16422 0.143506 -0.892967 0 \r\n1.35429 0 -0.631516 0 \r\n1.37333 0.0478355 -0.568267 0 \r\n1.31807 0.0478355 -0.686752 0 \r\n1.39165 0.095671 -0.506522 0 \r\n1.35544 0.143506 -0.561759 0 \r\n1.31993 0.191342 -0.615492 0 \r\n1.30159 0.143506 -0.677237 0 \r\n1.44338 0 -0.386752 0 \r\n1.45114 0.0478355 -0.321159 0 \r\n1.4173 0.0478355 -0.447438 0 \r\n1.45847 0.095671 -0.257169 0 \r\n1.43239 0.143506 -0.317854 0 \r\n1.40675 0.191342 -0.376938 0 \r\n1.39942 0.143506 -0.440929 0 \r\n1.48861 0 -0.130237 0 \r\n1.48486 0.0478355 -0.064292 0 \r\n1.47346 0.0478355 -0.194529 0 \r\n1.46583 0.143506 -0.064292 0 \r\n1.45083 0.191342 -0.126932 0 \r\n1.45473 0.143506 -0.191224 0 \r\n1.41839 0.231894 0.188045 0 \r\n1.4295 0.231894 0.061113 0 \r\n1.38636 0.272447 0.244453 0 \r\n1.36502 0.313 0.178634 0 \r\n1.34327 0.353553 0.117521 0 \r\n1.3753 0.313 0.061113 0 \r\n1.40775 0.272447 0 0 \r\n1.36418 0.231894 0.431489 0 \r\n1.39717 0.231894 0.308414 0 \r\n1.32284 0.272447 0.481478 0 \r\n1.31326 0.313 0.412954 0 \r\n1.30245 0.353553 0.348992 0 \r\n1.3438 0.313 0.299003 0 \r\n1.26854 0.231894 0.661823 0 \r\n1.32239 0.231894 0.546345 0 \r\n1.21915 0.272447 0.703874 0 \r\n1.22161 0.313 0.634727 0 \r\n1.22206 0.353553 0.56986 0 \r\n1.27146 0.313 0.52781 0 \r\n1.13434 0.231894 0.872047 0 \r\n1.20742 0.231894 0.767674 0 \r\n1.0784 0.272447 0.904882 0 \r\n1.09282 0.313 0.837212 0 \r\n1.10454 0.353553 0.773412 0 \r\n1.16049 0.313 0.740577 0 \r\n0.965678 0.231894 1.05577 0 \r\n1.05577 0.231894 0.965678 0 \r\n0.904882 0.272447 1.0784 0 \r\n0.930843 0.313 1.01426 0 \r\n0.953463 0.353553 0.953463 0 \r\n1.01426 0.313 0.930843 0 \r\n0.767674 0.231894 1.20742 0 \r\n0.872047 0.231894 1.13434 0 \r\n0.703874 0.272447 1.21915 0 \r\n0.740577 0.313 1.16049 0 \r\n0.773412 0.353553 1.10454 0 \r\n0.837212 0.313 1.09282 0 \r\n0.546345 0.231894 1.32239 0 \r\n0.661823 0.231894 1.26854 0 \r\n0.481478 0.272447 1.32284 0 \r\n0.52781 0.313 1.27146 0 \r\n0.56986 0.353553 1.22206 0 \r\n0.634727 0.313 1.22161 0 \r\n0.308414 0.231894 1.39717 0 \r\n0.431489 0.231894 1.36418 0 \r\n0.244453 0.272447 1.38636 0 \r\n0.299003 0.313 1.3438 0 \r\n0.348992 0.353553 1.30245 0 \r\n0.412954 0.313 1.31326 0 \r\n0.061113 0.231894 1.4295 0 \r\n0.188045 0.231894 1.41839 0 \r\n-6.15345e-008 0.272447 1.40775 0 \r\n0.061113 0.313 1.3753 0 \r\n0.117521 0.353553 1.34327 0 \r\n0.178634 0.313 1.36502 0 \r\n-0.188045 0.231894 1.41839 0 \r\n-0.061113 0.231894 1.4295 0 \r\n-0.244453 0.272447 1.38636 0 \r\n-0.178634 0.313 1.36502 0 \r\n-0.117521 0.353553 1.34327 0 \r\n-0.061113 0.313 1.3753 0 \r\n-0.431489 0.231894 1.36418 0 \r\n-0.308414 0.231894 1.39717 0 \r\n-0.481478 0.272447 1.32284 0 \r\n-0.412954 0.313 1.31326 0 \r\n-0.348992 0.353553 1.30245 0 \r\n-0.299003 0.313 1.3438 0 \r\n-0.661823 0.231894 1.26854 0 \r\n-0.546345 0.231894 1.32239 0 \r\n-0.703874 0.272447 1.21915 0 \r\n-0.634727 0.313 1.22161 0 \r\n-0.56986 0.353553 1.22206 0 \r\n-0.52781 0.313 1.27146 0 \r\n-0.872047 0.231894 1.13434 0 \r\n-0.767674 0.231894 1.20742 0 \r\n-0.904882 0.272447 1.0784 0 \r\n-0.837212 0.313 1.09282 0 \r\n-0.773412 0.353553 1.10454 0 \r\n-0.740577 0.313 1.16049 0 \r\n-1.05577 0.231894 0.965678 0 \r\n-0.965678 0.231894 1.05577 0 \r\n-1.0784 0.272447 0.904882 0 \r\n-1.01426 0.313 0.930843 0 \r\n-0.953463 0.353553 0.953463 0 \r\n-0.930843 0.313 1.01426 0 \r\n-1.20742 0.231894 0.767674 0 \r\n-1.13434 0.231894 0.872047 0 \r\n-1.21915 0.272447 0.703874 0 \r\n-1.16049 0.313 0.740577 0 \r\n-1.10454 0.353553 0.773412 0 \r\n-1.09282 0.313 0.837212 0 \r\n-1.32239 0.231894 0.546345 0 \r\n-1.26854 0.231894 0.661823 0 \r\n-1.32284 0.272447 0.481478 0 \r\n-1.27146 0.313 0.52781 0 \r\n-1.22206 0.353553 0.56986 0 \r\n-1.22161 0.313 0.634727 0 \r\n-1.39717 0.231894 0.308414 0 \r\n-1.36418 0.231894 0.431489 0 \r\n-1.38636 0.272447 0.244453 0 \r\n-1.3438 0.313 0.299003 0 \r\n-1.30245 0.353553 0.348992 0 \r\n-1.31326 0.313 0.412954 0 \r\n-1.4295 0.231894 0.0611129 0 \r\n-1.41839 0.231894 0.188045 0 \r\n-1.40775 0.272447 -1.23069e-007 0 \r\n-1.3753 0.313 0.0611129 0 \r\n-1.34327 0.353553 0.117521 0 \r\n-1.36502 0.313 0.178634 0 \r\n-1.41839 0.231894 -0.188045 0 \r\n-1.4295 0.231894 -0.0611131 0 \r\n-1.38636 0.272447 -0.244453 0 \r\n-1.36502 0.313 -0.178634 0 \r\n-1.34327 0.353553 -0.117521 0 \r\n-1.3753 0.313 -0.0611131 0 \r\n-1.36418 0.231894 -0.431489 0 \r\n-1.39717 0.231894 -0.308414 0 \r\n-1.32284 0.272447 -0.481478 0 \r\n-1.31326 0.313 -0.412954 0 \r\n-1.30245 0.353553 -0.348992 0 \r\n-1.3438 0.313 -0.299003 0 \r\n-1.26854 0.231894 -0.661823 0 \r\n-1.32239 0.231894 -0.546345 0 \r\n-1.21915 0.272447 -0.703874 0 \r\n-1.22161 0.313 -0.634727 0 \r\n-1.22206 0.353553 -0.56986 0 \r\n-1.27146 0.313 -0.52781 0 \r\n-1.13434 0.231894 -0.872047 0 \r\n-1.20742 0.231894 -0.767674 0 \r\n-1.0784 0.272447 -0.904882 0 \r\n-1.09282 0.313 -0.837212 0 \r\n-1.10454 0.353553 -0.773412 0 \r\n-1.16049 0.313 -0.740577 0 \r\n-0.965678 0.231894 -1.05577 0 \r\n-1.05577 0.231894 -0.965678 0 \r\n-0.904882 0.272447 -1.0784 0 \r\n-0.930843 0.313 -1.01426 0 \r\n-0.953463 0.353553 -0.953463 0 \r\n-1.01426 0.313 -0.930843 0 \r\n-0.767674 0.231894 -1.20742 0 \r\n-0.872047 0.231894 -1.13434 0 \r\n-0.703874 0.272447 -1.21915 0 \r\n-0.740577 0.313 -1.16049 0 \r\n-0.773412 0.353553 -1.10454 0 \r\n-0.837212 0.313 -1.09282 0 \r\n-0.546345 0.231894 -1.32239 0 \r\n-0.661823 0.231894 -1.26854 0 \r\n-0.481478 0.272447 -1.32284 0 \r\n-0.52781 0.313 -1.27146 0 \r\n-0.56986 0.353553 -1.22206 0 \r\n-0.634727 0.313 -1.22161 0 \r\n-0.308414 0.231894 -1.39717 0 \r\n-0.431489 0.231894 -1.36418 0 \r\n-0.244453 0.272447 -1.38636 0 \r\n-0.299003 0.313 -1.3438 0 \r\n-0.348992 0.353553 -1.30245 0 \r\n-0.412954 0.313 -1.31326 0 \r\n-0.061113 0.231894 -1.4295 0 \r\n-0.188045 0.231894 -1.41839 0 \r\n1.67873e-008 0.272447 -1.40775 0 \r\n-0.061113 0.313 -1.3753 0 \r\n-0.117521 0.353553 -1.34327 0 \r\n-0.178634 0.313 -1.36502 0 \r\n0.188045 0.231894 -1.41839 0 \r\n0.061113 0.231894 -1.4295 0 \r\n0.244453 0.272447 -1.38636 0 \r\n0.178634 0.313 -1.36502 0 \r\n0.117521 0.353553 -1.34327 0 \r\n0.061113 0.313 -1.3753 0 \r\n0.431489 0.231894 -1.36418 0 \r\n0.308414 0.231894 -1.39717 0 \r\n0.481477 0.272447 -1.32284 0 \r\n0.412953 0.313 -1.31326 0 \r\n0.348992 0.353553 -1.30245 0 \r\n0.299003 0.313 -1.3438 0 \r\n0.661823 0.231894 -1.26854 0 \r\n0.546345 0.231894 -1.32239 0 \r\n0.703874 0.272447 -1.21915 0 \r\n0.634727 0.313 -1.22161 0 \r\n0.56986 0.353553 -1.22206 0 \r\n0.527809 0.313 -1.27146 0 \r\n0.872047 0.231894 -1.13434 0 \r\n0.767674 0.231894 -1.20742 0 \r\n0.904882 0.272447 -1.0784 0 \r\n0.837212 0.313 -1.09282 0 \r\n0.773412 0.353553 -1.10454 0 \r\n0.740577 0.313 -1.16049 0 \r\n1.05577 0.231894 -0.965678 0 \r\n0.965678 0.231894 -1.05577 0 \r\n1.0784 0.272447 -0.904882 0 \r\n1.01426 0.313 -0.930843 0 \r\n0.953463 0.353553 -0.953464 0 \r\n0.930843 0.313 -1.01426 0 \r\n1.20742 0.231894 -0.767674 0 \r\n1.13434 0.231894 -0.872047 0 \r\n1.21915 0.272447 -0.703873 0 \r\n1.16049 0.313 -0.740577 0 \r\n1.10454 0.353553 -0.773412 0 \r\n1.09282 0.313 -0.837213 0 \r\n1.32239 0.231894 -0.546345 0 \r\n1.26854 0.231894 -0.661823 0 \r\n1.32284 0.272447 -0.481478 0 \r\n1.27146 0.313 -0.52781 0 \r\n1.22206 0.353553 -0.56986 0 \r\n1.22161 0.313 -0.634726 0 \r\n1.39717 0.231894 -0.308414 0 \r\n1.36418 0.231894 -0.431489 0 \r\n1.38636 0.272447 -0.244453 0 \r\n1.3438 0.313 -0.299003 0 \r\n1.30245 0.353553 -0.348992 0 \r\n1.31326 0.313 -0.412954 0 \r\n1.4295 0.231894 -0.061113 0 \r\n1.41839 0.231894 -0.188045 0 \r\n1.3753 0.313 -0.061113 0 \r\n1.34327 0.353553 -0.117521 0 \r\n1.36502 0.313 -0.178634 0 \r\n1.29788 0.38065 0.172761 0 \r\n1.30816 0.38065 0.0552395 0 \r\n1.25311 0.407746 0.220958 0 \r\n1.21801 0.434843 0.158677 0 \r\n1.18229 0.46194 0.103437 0 \r\n1.22706 0.434843 0.0552395 0 \r\n1.27244 0.407746 0 0 \r\n1.24817 0.38065 0.395512 0 \r\n1.2787 0.38065 0.281561 0 \r\n1.19571 0.407746 0.435203 0 \r\n1.17196 0.434843 0.367772 0 \r\n1.14637 0.46194 0.307169 0 \r\n1.19883 0.434843 0.267478 0 \r\n1.16052 0.38065 0.606245 0 \r\n1.21038 0.38065 0.499328 0 \r\n1.10197 0.407746 0.636224 0 \r\n1.09029 0.434843 0.565692 0 \r\n1.07562 0.46194 0.501567 0 \r\n1.13417 0.434843 0.471588 0 \r\n1.03762 0.38065 0.798558 0 \r\n1.10528 0.38065 0.701923 0 \r\n0.974751 0.407746 0.817913 0 \r\n0.975491 0.434843 0.746424 0 \r\n0.972176 0.46194 0.680725 0 \r\n1.03505 0.434843 0.66137 0 \r\n0.883189 0.38065 0.966606 0 \r\n0.966606 0.38065 0.883189 0 \r\n0.817913 0.407746 0.974751 0 \r\n0.831056 0.434843 0.904477 0 \r\n0.8392 0.46194 0.8392 0 \r\n0.904477 0.434843 0.831056 0 \r\n0.701923 0.38065 1.10528 0 \r\n0.798558 0.38065 1.03762 0 \r\n0.636224 0.407746 1.10197 0 \r\n0.66137 0.434843 1.03505 0 \r\n0.680725 0.46194 0.972176 0 \r\n0.746424 0.434843 0.975491 0 \r\n0.499328 0.38065 1.21038 0 \r\n0.606245 0.38065 1.16052 0 \r\n0.435203 0.407746 1.19571 0 \r\n0.471588 0.434843 1.13417 0 \r\n0.501567 0.46194 1.07562 0 \r\n0.565692 0.434843 1.09029 0 \r\n0.281561 0.38065 1.2787 0 \r\n0.395512 0.38065 1.24817 0 \r\n0.220958 0.407746 1.25311 0 \r\n0.267478 0.434843 1.19883 0 \r\n0.307169 0.46194 1.14637 0 \r\n0.367772 0.434843 1.17196 0 \r\n0.0552395 0.38065 1.30816 0 \r\n0.172761 0.38065 1.29788 0 \r\n-5.56205e-008 0.407746 1.27244 0 \r\n0.0552395 0.434843 1.22706 0 \r\n0.103437 0.46194 1.18229 0 \r\n0.158677 0.434843 1.21801 0 \r\n-0.172761 0.38065 1.29788 0 \r\n-0.0552395 0.38065 1.30816 0 \r\n-0.220958 0.407746 1.25311 0 \r\n-0.158677 0.434843 1.21801 0 \r\n-0.103437 0.46194 1.18229 0 \r\n-0.0552395 0.434843 1.22706 0 \r\n-0.395512 0.38065 1.24817 0 \r\n-0.281561 0.38065 1.2787 0 \r\n-0.435203 0.407746 1.19571 0 \r\n-0.367772 0.434843 1.17196 0 \r\n-0.307169 0.46194 1.14637 0 \r\n-0.267478 0.434843 1.19883 0 \r\n-0.606245 0.38065 1.16052 0 \r\n-0.499328 0.38065 1.21038 0 \r\n-0.636224 0.407746 1.10197 0 \r\n-0.565692 0.434843 1.09029 0 \r\n-0.501567 0.46194 1.07562 0 \r\n-0.471588 0.434843 1.13417 0 \r\n-0.798558 0.38065 1.03762 0 \r\n-0.701923 0.38065 1.10528 0 \r\n-0.817913 0.407746 0.974751 0 \r\n-0.746424 0.434843 0.975491 0 \r\n-0.680725 0.46194 0.972176 0 \r\n-0.66137 0.434843 1.03505 0 \r\n-0.966606 0.38065 0.883189 0 \r\n-0.883189 0.38065 0.966606 0 \r\n-0.974751 0.407746 0.817913 0 \r\n-0.904477 0.434843 0.831056 0 \r\n-0.8392 0.46194 0.8392 0 \r\n-0.831056 0.434843 0.904477 0 \r\n-1.10528 0.38065 0.701923 0 \r\n-1.03762 0.38065 0.798558 0 \r\n-1.10197 0.407746 0.636224 0 \r\n-1.03505 0.434843 0.66137 0 \r\n-0.972176 0.46194 0.680725 0 \r\n-0.975491 0.434843 0.746424 0 \r\n-1.21038 0.38065 0.499328 0 \r\n-1.16052 0.38065 0.606245 0 \r\n-1.19571 0.407746 0.435203 0 \r\n-1.13417 0.434843 0.471588 0 \r\n-1.07562 0.46194 0.501567 0 \r\n-1.09029 0.434843 0.565692 0 \r\n-1.2787 0.38065 0.281561 0 \r\n-1.24817 0.38065 0.395512 0 \r\n-1.25311 0.407746 0.220958 0 \r\n-1.19883 0.434843 0.267478 0 \r\n-1.14637 0.46194 0.307169 0 \r\n-1.17196 0.434843 0.367772 0 \r\n-1.30816 0.38065 0.0552394 0 \r\n-1.29788 0.38065 0.172761 0 \r\n-1.27244 0.407746 -1.1124e-007 0 \r\n-1.22706 0.434843 0.0552394 0 \r\n-1.18229 0.46194 0.103437 0 \r\n-1.21801 0.434843 0.158677 0 \r\n-1.29788 0.38065 -0.172761 0 \r\n-1.30816 0.38065 -0.0552396 0 \r\n-1.25311 0.407746 -0.220958 0 \r\n-1.21801 0.434843 -0.158677 0 \r\n-1.18229 0.46194 -0.103437 0 \r\n-1.22706 0.434843 -0.0552396 0 \r\n-1.24817 0.38065 -0.395512 0 \r\n-1.2787 0.38065 -0.281561 0 \r\n-1.19571 0.407746 -0.435203 0 \r\n-1.17196 0.434843 -0.367772 0 \r\n-1.14637 0.46194 -0.307169 0 \r\n-1.19883 0.434843 -0.267478 0 \r\n-1.16052 0.38065 -0.606245 0 \r\n-1.21038 0.38065 -0.499328 0 \r\n-1.10197 0.407746 -0.636224 0 \r\n-1.09029 0.434843 -0.565692 0 \r\n-1.07562 0.46194 -0.501567 0 \r\n-1.13417 0.434843 -0.471588 0 \r\n-1.03762 0.38065 -0.798558 0 \r\n-1.10528 0.38065 -0.701923 0 \r\n-0.974751 0.407746 -0.817913 0 \r\n-0.975491 0.434843 -0.746424 0 \r\n-0.972176 0.46194 -0.680725 0 \r\n-1.03505 0.434843 -0.66137 0 \r\n-0.883189 0.38065 -0.966606 0 \r\n-0.966606 0.38065 -0.883189 0 \r\n-0.817913 0.407746 -0.974751 0 \r\n-0.831056 0.434843 -0.904477 0 \r\n-0.8392 0.46194 -0.8392 0 \r\n-0.904477 0.434843 -0.831056 0 \r\n-0.701923 0.38065 -1.10528 0 \r\n-0.798558 0.38065 -1.03762 0 \r\n-0.636224 0.407746 -1.10197 0 \r\n-0.66137 0.434843 -1.03505 0 \r\n-0.680725 0.46194 -0.972176 0 \r\n-0.746424 0.434843 -0.975491 0 \r\n-0.499328 0.38065 -1.21038 0 \r\n-0.606245 0.38065 -1.16052 0 \r\n-0.435203 0.407746 -1.1957 0 \r\n-0.471588 0.434843 -1.13417 0 \r\n-0.501567 0.46194 -1.07561 0 \r\n-0.565692 0.434843 -1.09029 0 \r\n-0.281561 0.38065 -1.2787 0 \r\n-0.395512 0.38065 -1.24817 0 \r\n-0.220958 0.407746 -1.25311 0 \r\n-0.267478 0.434843 -1.19883 0 \r\n-0.307169 0.46194 -1.14636 0 \r\n-0.367772 0.434843 -1.17195 0 \r\n-0.0552395 0.38065 -1.30816 0 \r\n-0.172761 0.38065 -1.29788 0 \r\n1.51738e-008 0.407746 -1.27244 0 \r\n-0.0552395 0.434843 -1.22706 0 \r\n-0.103437 0.46194 -1.18229 0 \r\n-0.158677 0.434843 -1.21801 0 \r\n0.172761 0.38065 -1.29788 0 \r\n0.0552395 0.38065 -1.30816 0 \r\n0.220958 0.407746 -1.25311 0 \r\n0.158677 0.434843 -1.21801 0 \r\n0.103437 0.46194 -1.18229 0 \r\n0.0552395 0.434843 -1.22706 0 \r\n0.395511 0.38065 -1.24817 0 \r\n0.281561 0.38065 -1.2787 0 \r\n0.435203 0.407746 -1.19571 0 \r\n0.367772 0.434843 -1.17196 0 \r\n0.307169 0.46194 -1.14637 0 \r\n0.267477 0.434843 -1.19883 0 \r\n0.606245 0.38065 -1.16052 0 \r\n0.499328 0.38065 -1.21038 0 \r\n0.636224 0.407746 -1.10197 0 \r\n0.565692 0.434843 -1.09029 0 \r\n0.501567 0.46194 -1.07562 0 \r\n0.471588 0.434843 -1.13417 0 \r\n0.798558 0.38065 -1.03762 0 \r\n0.701923 0.38065 -1.10528 0 \r\n0.817913 0.407746 -0.974751 0 \r\n0.746424 0.434843 -0.975491 0 \r\n0.680725 0.46194 -0.972176 0 \r\n0.66137 0.434843 -1.03505 0 \r\n0.966606 0.38065 -0.88319 0 \r\n0.883189 0.38065 -0.966606 0 \r\n0.974751 0.407746 -0.817914 0 \r\n0.904477 0.434843 -0.831056 0 \r\n0.8392 0.46194 -0.8392 0 \r\n0.831056 0.434843 -0.904477 0 \r\n1.10528 0.38065 -0.701923 0 \r\n1.03762 0.38065 -0.798558 0 \r\n1.10197 0.407746 -0.636223 0 \r\n1.03505 0.434843 -0.66137 0 \r\n0.972176 0.46194 -0.680725 0 \r\n0.975491 0.434843 -0.746424 0 \r\n1.21038 0.38065 -0.499328 0 \r\n1.16052 0.38065 -0.606245 0 \r\n1.19571 0.407746 -0.435203 0 \r\n1.13417 0.434843 -0.471588 0 \r\n1.07562 0.46194 -0.501567 0 \r\n1.09029 0.434843 -0.565692 0 \r\n1.2787 0.38065 -0.281561 0 \r\n1.24817 0.38065 -0.395512 0 \r\n1.25311 0.407746 -0.220959 0 \r\n1.19883 0.434843 -0.267478 0 \r\n1.14637 0.46194 -0.307169 0 \r\n1.17196 0.434843 -0.367772 0 \r\n1.30816 0.38065 -0.0552395 0 \r\n1.29788 0.38065 -0.172761 0 \r\n1.22706 0.434843 -0.0552395 0 \r\n1.18229 0.46194 -0.103437 0 \r\n1.21801 0.434843 -0.158677 0 \r\n1.1303 0.471455 0.151002 0 \r\n1.13934 0.471455 0.0475653 0 \r\n1.07902 0.48097 0.190261 0 \r\n1.03608 0.490485 0.134389 0 \r\n0.992404 0.5 0.086824 0 \r\n1.04367 0.490485 0.0475653 0 \r\n1.09567 0.48097 0 0 \r\n1.08691 0.471455 0.344982 0 \r\n1.11378 0.471455 0.244687 0 \r\n1.0296 0.48097 0.374741 0 \r\n0.997001 0.490485 0.312261 0 \r\n0.96225 0.5 0.257834 0 \r\n1.01956 0.490485 0.228075 0 \r\n1.01048 0.471455 0.52848 0 \r\n1.05437 0.471455 0.434376 0 \r\n0.948878 0.48097 0.547835 0 \r\n0.927631 0.490485 0.480644 0 \r\n0.902859 0.5 0.42101 0 \r\n0.964465 0.490485 0.401654 0 \r\n0.903363 0.471455 0.69592 0 \r\n0.962918 0.471455 0.610865 0 \r\n0.839333 0.48097 0.704284 0 \r\n0.830075 0.490485 0.634424 0 \r\n0.816034 0.5 0.571394 0 \r\n0.880065 0.490485 0.56303 0 \r\n0.768794 0.471455 0.842215 0 \r\n0.842215 0.471455 0.768794 0 \r\n0.704284 0.48097 0.839333 0 \r\n0.707298 0.490485 0.768926 0 \r\n0.704416 0.5 0.704416 0 \r\n0.768926 0.490485 0.707298 0 \r\n0.610865 0.471455 0.962918 0 \r\n0.69592 0.471455 0.903363 0 \r\n0.547835 0.48097 0.948878 0 \r\n0.56303 0.490485 0.880065 0 \r\n0.571394 0.5 0.816034 0 \r\n0.634424 0.490485 0.830075 0 \r\n0.434376 0.471455 1.05437 0 \r\n0.52848 0.471455 1.01048 0 \r\n0.374741 0.48097 1.0296 0 \r\n0.401654 0.490485 0.964465 0 \r\n0.42101 0.5 0.902859 0 \r\n0.480644 0.490485 0.927631 0 \r\n0.244687 0.471455 1.11378 0 \r\n0.344982 0.471455 1.08691 0 \r\n0.190261 0.48097 1.07902 0 \r\n0.228075 0.490485 1.01956 0 \r\n0.257834 0.5 0.96225 0 \r\n0.312261 0.490485 0.997001 0 \r\n0.0475652 0.471455 1.13934 0 \r\n0.151002 0.471455 1.1303 0 \r\n-4.78933e-008 0.48097 1.09567 0 \r\n0.0475652 0.490485 1.04367 0 \r\n0.086824 0.5 0.992404 0 \r\n0.134389 0.490485 1.03608 0 \r\n-0.151002 0.471455 1.1303 0 \r\n-0.0475653 0.471455 1.13934 0 \r\n-0.190261 0.48097 1.07902 0 \r\n-0.134389 0.490485 1.03608 0 \r\n-0.086824 0.5 0.992404 0 \r\n-0.0475653 0.490485 1.04367 0 \r\n-0.344982 0.471455 1.08691 0 \r\n-0.244687 0.471455 1.11378 0 \r\n-0.374741 0.48097 1.0296 0 \r\n-0.312261 0.490485 0.997001 0 \r\n-0.257834 0.5 0.96225 0 \r\n-0.228075 0.490485 1.01956 0 \r\n-0.52848 0.471455 1.01048 0 \r\n-0.434376 0.471455 1.05437 0 \r\n-0.547835 0.48097 0.948878 0 \r\n-0.480644 0.490485 0.927631 0 \r\n-0.42101 0.5 0.902859 0 \r\n-0.401654 0.490485 0.964465 0 \r\n-0.69592 0.471455 0.903363 0 \r\n-0.610865 0.471455 0.962918 0 \r\n-0.704284 0.48097 0.839333 0 \r\n-0.634424 0.490485 0.830075 0 \r\n-0.571394 0.5 0.816034 0 \r\n-0.56303 0.490485 0.880065 0 \r\n-0.842215 0.471455 0.768794 0 \r\n-0.768794 0.471455 0.842215 0 \r\n-0.839333 0.48097 0.704284 0 \r\n-0.768926 0.490485 0.707298 0 \r\n-0.704416 0.5 0.704416 0 \r\n-0.707298 0.490485 0.768926 0 \r\n-0.962918 0.471455 0.610865 0 \r\n-0.903363 0.471455 0.69592 0 \r\n-0.948878 0.48097 0.547835 0 \r\n-0.880065 0.490485 0.56303 0 \r\n-0.816034 0.5 0.571394 0 \r\n-0.830075 0.490485 0.634424 0 \r\n-1.05437 0.471455 0.434376 0 \r\n-1.01048 0.471455 0.52848 0 \r\n-1.0296 0.48097 0.374741 0 \r\n-0.964465 0.490485 0.401654 0 \r\n-0.902859 0.5 0.42101 0 \r\n-0.927631 0.490485 0.480644 0 \r\n-1.11378 0.471455 0.244687 0 \r\n-1.08691 0.471455 0.344982 0 \r\n-1.07902 0.48097 0.190261 0 \r\n-1.01956 0.490485 0.228075 0 \r\n-0.96225 0.5 0.257834 0 \r\n-0.997001 0.490485 0.312261 0 \r\n-1.13934 0.471455 0.0475652 0 \r\n-1.1303 0.471455 0.151002 0 \r\n-1.09567 0.48097 -9.57864e-008 0 \r\n-1.04367 0.490485 0.0475652 0 \r\n-0.992404 0.5 0.086824 0 \r\n-1.03608 0.490485 0.134389 0 \r\n-1.1303 0.471455 -0.151002 0 \r\n-1.13934 0.471455 -0.0475653 0 \r\n-1.07902 0.48097 -0.190261 0 \r\n-1.03608 0.490485 -0.134389 0 \r\n-0.992404 0.5 -0.086824 0 \r\n-1.04367 0.490485 -0.0475653 0 \r\n-1.08691 0.471455 -0.344982 0 \r\n-1.11378 0.471455 -0.244687 0 \r\n-1.0296 0.48097 -0.374741 0 \r\n-0.997001 0.490485 -0.312261 0 \r\n-0.96225 0.5 -0.257834 0 \r\n-1.01956 0.490485 -0.228075 0 \r\n-1.01048 0.471455 -0.52848 0 \r\n-1.05437 0.471455 -0.434376 0 \r\n-0.948878 0.48097 -0.547835 0 \r\n-0.927631 0.490485 -0.480644 0 \r\n-0.902859 0.5 -0.42101 0 \r\n-0.964465 0.490485 -0.401654 0 \r\n-0.903363 0.471455 -0.69592 0 \r\n-0.962918 0.471455 -0.610865 0 \r\n-0.839333 0.48097 -0.704284 0 \r\n-0.830075 0.490485 -0.634424 0 \r\n-0.816034 0.5 -0.571394 0 \r\n-0.880065 0.490485 -0.56303 0 \r\n-0.768794 0.471455 -0.842215 0 \r\n-0.842215 0.471455 -0.768794 0 \r\n-0.704284 0.48097 -0.839333 0 \r\n-0.707298 0.490485 -0.768927 0 \r\n-0.704416 0.5 -0.704417 0 \r\n-0.768926 0.490485 -0.707299 0 \r\n-0.610865 0.471455 -0.962918 0 \r\n-0.69592 0.471455 -0.903363 0 \r\n-0.547835 0.48097 -0.948878 0 \r\n-0.56303 0.490485 -0.880065 0 \r\n-0.571394 0.5 -0.816035 0 \r\n-0.634424 0.490485 -0.830075 0 \r\n-0.434376 0.471455 -1.05436 0 \r\n-0.52848 0.471455 -1.01048 0 \r\n-0.374742 0.48097 -1.02959 0 \r\n-0.401655 0.490485 -0.964463 0 \r\n-0.42101 0.5 -0.902858 0 \r\n-0.480644 0.490485 -0.927629 0 \r\n-0.244688 0.471455 -1.11378 0 \r\n-0.344983 0.471455 -1.0869 0 \r\n-0.190261 0.48097 -1.07902 0 \r\n-0.228075 0.490485 -1.01956 0 \r\n-0.257834 0.5 -0.96225 0 \r\n-0.312261 0.490485 -0.997001 0 \r\n-0.0475652 0.471455 -1.13934 0 \r\n-0.151002 0.471455 -1.1303 0 \r\n1.30658e-008 0.48097 -1.09567 0 \r\n-0.0475652 0.490485 -1.04367 0 \r\n-0.086824 0.5 -0.992404 0 \r\n-0.134389 0.490485 -1.03608 0 \r\n0.151002 0.471455 -1.1303 0 \r\n0.0475653 0.471455 -1.13934 0 \r\n0.190261 0.48097 -1.07902 0 \r\n0.134389 0.490485 -1.03608 0 \r\n0.086824 0.5 -0.992404 0 \r\n0.0475653 0.490485 -1.04367 0 \r\n0.344982 0.471455 -1.08691 0 \r\n0.244687 0.471455 -1.11378 0 \r\n0.374741 0.48097 -1.0296 0 \r\n0.312261 0.490485 -0.997001 0 \r\n0.257834 0.5 -0.96225 0 \r\n0.228075 0.490485 -1.01956 0 \r\n0.52848 0.471455 -1.01048 0 \r\n0.434376 0.471455 -1.05437 0 \r\n0.547835 0.48097 -0.948878 0 \r\n0.480644 0.490485 -0.927631 0 \r\n0.42101 0.5 -0.902859 0 \r\n0.401654 0.490485 -0.964465 0 \r\n0.69592 0.471455 -0.903363 0 \r\n0.610865 0.471455 -0.962918 0 \r\n0.704284 0.48097 -0.839333 0 \r\n0.634424 0.490485 -0.830075 0 \r\n0.571394 0.5 -0.816034 0 \r\n0.56303 0.490485 -0.880065 0 \r\n0.842215 0.471455 -0.768794 0 \r\n0.768794 0.471455 -0.842215 0 \r\n0.839333 0.48097 -0.704284 0 \r\n0.768926 0.490485 -0.707298 0 \r\n0.704416 0.5 -0.704416 0 \r\n0.707298 0.490485 -0.768926 0 \r\n0.962918 0.471455 -0.610865 0 \r\n0.903363 0.471455 -0.69592 0 \r\n0.948878 0.48097 -0.547835 0 \r\n0.880066 0.490485 -0.56303 0 \r\n0.816035 0.5 -0.571394 0 \r\n0.830075 0.490485 -0.634424 0 \r\n1.05437 0.471455 -0.434376 0 \r\n1.01048 0.471455 -0.52848 0 \r\n1.0296 0.48097 -0.374741 0 \r\n0.964465 0.490485 -0.401654 0 \r\n0.902859 0.5 -0.42101 0 \r\n0.927631 0.490485 -0.480644 0 \r\n1.11378 0.471455 -0.244688 0 \r\n1.08691 0.471455 -0.344983 0 \r\n1.07902 0.48097 -0.190261 0 \r\n1.01956 0.490485 -0.228075 0 \r\n0.96225 0.5 -0.257834 0 \r\n0.997001 0.490485 -0.312261 0 \r\n1.13934 0.471455 -0.0475653 0 \r\n1.1303 0.471455 -0.151003 0 \r\n1.04367 0.490485 -0.0475653 0 \r\n0.992404 0.5 -0.086824 0 \r\n1.03608 0.490485 -0.134389 0 \r\n0.941134 0.490485 0.126083 0 \r\n0.94873 0.490485 0.0392587 0 \r\n0.890591 0.48097 0.157035 0 \r\n0.846916 0.471455 0.10947 0 \r\n0.802516 0.46194 0.070211 0 \r\n0.853059 0.471455 0.0392587 0 \r\n0.904329 0.48097 0 0 \r\n0.904942 0.490485 0.287593 0 \r\n0.9275 0.490485 0.203407 0 \r\n0.849792 0.48097 0.309299 0 \r\n0.81504 0.471455 0.254872 0 \r\n0.778131 0.46194 0.208499 0 \r\n0.833282 0.471455 0.186794 0 \r\n0.841254 0.490485 0.440366 0 \r\n0.878088 0.490485 0.361376 0 \r\n0.783172 0.48097 0.452165 0 \r\n0.7584 0.471455 0.392531 0 \r\n0.730105 0.46194 0.340453 0 \r\n0.788186 0.471455 0.328654 0 \r\n0.752004 0.490485 0.579758 0 \r\n0.801994 0.490485 0.508364 0 \r\n0.692756 0.48097 0.581292 0 \r\n0.678716 0.471455 0.518262 0 \r\n0.659894 0.46194 0.462063 0 \r\n0.719141 0.471455 0.460528 0 \r\n0.639906 0.490485 0.701534 0 \r\n0.701534 0.490485 0.639906 0 \r\n0.581292 0.48097 0.692756 0 \r\n0.57841 0.471455 0.628246 0 \r\n0.569632 0.46194 0.569632 0 \r\n0.628246 0.471455 0.57841 0 \r\n0.508364 0.490485 0.801994 0 \r\n0.579758 0.490485 0.752004 0 \r\n0.452165 0.48097 0.783172 0 \r\n0.460528 0.471455 0.719141 0 \r\n0.462063 0.46194 0.659894 0 \r\n0.518262 0.471455 0.678716 0 \r\n0.361376 0.490485 0.878088 0 \r\n0.440366 0.490485 0.841254 0 \r\n0.309299 0.48097 0.849792 0 \r\n0.328654 0.471455 0.788186 0 \r\n0.340453 0.46194 0.730105 0 \r\n0.392531 0.471455 0.7584 0 \r\n0.203407 0.490485 0.9275 0 \r\n0.287593 0.490485 0.904942 0 \r\n0.157035 0.48097 0.890591 0 \r\n0.186794 0.471455 0.833282 0 \r\n0.208499 0.46194 0.778131 0 \r\n0.254872 0.471455 0.81504 0 \r\n0.0392587 0.490485 0.94873 0 \r\n0.126083 0.490485 0.941134 0 \r\n-3.95295e-008 0.48097 0.904329 0 \r\n0.0392587 0.471455 0.853059 0 \r\n0.070211 0.46194 0.802516 0 \r\n0.10947 0.471455 0.846916 0 \r\n-0.126083 0.490485 0.941134 0 \r\n-0.0392588 0.490485 0.94873 0 \r\n-0.157035 0.48097 0.890591 0 \r\n-0.10947 0.471455 0.846916 0 \r\n-0.070211 0.46194 0.802516 0 \r\n-0.0392588 0.471455 0.853059 0 \r\n-0.287593 0.490485 0.904942 0 \r\n-0.203407 0.490485 0.9275 0 \r\n-0.309299 0.48097 0.849792 0 \r\n-0.254872 0.471455 0.81504 0 \r\n-0.208499 0.46194 0.778131 0 \r\n-0.186794 0.471455 0.833282 0 \r\n-0.440366 0.490485 0.841254 0 \r\n-0.361376 0.490485 0.878088 0 \r\n-0.452165 0.48097 0.783172 0 \r\n-0.392531 0.471455 0.7584 0 \r\n-0.340453 0.46194 0.730105 0 \r\n-0.328654 0.471455 0.788186 0 \r\n-0.579758 0.490485 0.752004 0 \r\n-0.508364 0.490485 0.801994 0 \r\n-0.581292 0.48097 0.692756 0 \r\n-0.518262 0.471455 0.678716 0 \r\n-0.462063 0.46194 0.659894 0 \r\n-0.460528 0.471455 0.719141 0 \r\n-0.701534 0.490485 0.639906 0 \r\n-0.639906 0.490485 0.701534 0 \r\n-0.692756 0.48097 0.581292 0 \r\n-0.628246 0.471455 0.57841 0 \r\n-0.569632 0.46194 0.569632 0 \r\n-0.57841 0.471455 0.628246 0 \r\n-0.801994 0.490485 0.508364 0 \r\n-0.752004 0.490485 0.579758 0 \r\n-0.783172 0.48097 0.452165 0 \r\n-0.719141 0.471455 0.460528 0 \r\n-0.659894 0.46194 0.462063 0 \r\n-0.678716 0.471455 0.518262 0 \r\n-0.878088 0.490485 0.361376 0 \r\n-0.841254 0.490485 0.440366 0 \r\n-0.849792 0.48097 0.309299 0 \r\n-0.788186 0.471455 0.328654 0 \r\n-0.730105 0.46194 0.340453 0 \r\n-0.7584 0.471455 0.392531 0 \r\n-0.9275 0.490485 0.203407 0 \r\n-0.904942 0.490485 0.287593 0 \r\n-0.890591 0.48097 0.157035 0 \r\n-0.833282 0.471455 0.186794 0 \r\n-0.778131 0.46194 0.208499 0 \r\n-0.81504 0.471455 0.254872 0 \r\n-0.94873 0.490485 0.0392587 0 \r\n-0.941134 0.490485 0.126083 0 \r\n-0.904329 0.48097 -7.9059e-008 0 \r\n-0.853059 0.471455 0.0392587 0 \r\n-0.802516 0.46194 0.070211 0 \r\n-0.846916 0.471455 0.10947 0 \r\n-0.941134 0.490485 -0.126083 0 \r\n-0.94873 0.490485 -0.0392588 0 \r\n-0.890591 0.48097 -0.157035 0 \r\n-0.846916 0.471455 -0.10947 0 \r\n-0.802516 0.46194 -0.070211 0 \r\n-0.853059 0.471455 -0.0392588 0 \r\n-0.904942 0.490485 -0.287593 0 \r\n-0.9275 0.490485 -0.203407 0 \r\n-0.849792 0.48097 -0.309299 0 \r\n-0.81504 0.471455 -0.254873 0 \r\n-0.778131 0.46194 -0.2085 0 \r\n-0.833282 0.471455 -0.186794 0 \r\n-0.841254 0.490485 -0.440366 0 \r\n-0.878088 0.490485 -0.361376 0 \r\n-0.783172 0.48097 -0.452165 0 \r\n-0.7584 0.471455 -0.392531 0 \r\n-0.730105 0.46194 -0.340454 0 \r\n-0.788186 0.471455 -0.328655 0 \r\n-0.752004 0.490485 -0.579758 0 \r\n-0.801994 0.490485 -0.508364 0 \r\n-0.692756 0.48097 -0.581292 0 \r\n-0.678716 0.471455 -0.518262 0 \r\n-0.659894 0.46194 -0.462063 0 \r\n-0.719141 0.471455 -0.460528 0 \r\n-0.639906 0.490485 -0.701535 0 \r\n-0.701534 0.490485 -0.639906 0 \r\n-0.581291 0.48097 -0.692756 0 \r\n-0.578409 0.471455 -0.628246 0 \r\n-0.569631 0.46194 -0.569632 0 \r\n-0.628246 0.471455 -0.57841 0 \r\n-0.508364 0.490485 -0.801994 0 \r\n-0.579758 0.490485 -0.752005 0 \r\n-0.452165 0.48097 -0.783172 0 \r\n-0.460528 0.471455 -0.719141 0 \r\n-0.462062 0.46194 -0.659894 0 \r\n-0.518261 0.471455 -0.678716 0 \r\n-0.361376 0.490485 -0.878087 0 \r\n-0.440366 0.490485 -0.841254 0 \r\n-0.309299 0.48097 -0.849791 0 \r\n-0.328655 0.471455 -0.788186 0 \r\n-0.340454 0.46194 -0.730105 0 \r\n-0.392531 0.471455 -0.7584 0 \r\n-0.203407 0.490485 -0.9275 0 \r\n-0.287594 0.490485 -0.904941 0 \r\n-0.157035 0.48097 -0.890591 0 \r\n-0.186794 0.471455 -0.833282 0 \r\n-0.2085 0.46194 -0.778131 0 \r\n-0.254873 0.471455 -0.81504 0 \r\n-0.0392587 0.490485 -0.94873 0 \r\n-0.126083 0.490485 -0.941134 0 \r\n1.0784e-008 0.48097 -0.904329 0 \r\n-0.0392587 0.471455 -0.853059 0 \r\n-0.070211 0.46194 -0.802516 0 \r\n-0.10947 0.471455 -0.846916 0 \r\n0.126083 0.490485 -0.941134 0 \r\n0.0392588 0.490485 -0.94873 0 \r\n0.157035 0.48097 -0.890591 0 \r\n0.10947 0.471455 -0.846916 0 \r\n0.070211 0.46194 -0.802516 0 \r\n0.0392588 0.471455 -0.853059 0 \r\n0.287593 0.490485 -0.904942 0 \r\n0.203407 0.490485 -0.9275 0 \r\n0.309299 0.48097 -0.849792 0 \r\n0.254872 0.471455 -0.81504 0 \r\n0.208499 0.46194 -0.778131 0 \r\n0.186794 0.471455 -0.833282 0 \r\n0.440366 0.490485 -0.841254 0 \r\n0.361376 0.490485 -0.878088 0 \r\n0.452165 0.48097 -0.783172 0 \r\n0.392531 0.471455 -0.7584 0 \r\n0.340453 0.46194 -0.730105 0 \r\n0.328654 0.471455 -0.788186 0 \r\n0.579758 0.490485 -0.752004 0 \r\n0.508364 0.490485 -0.801994 0 \r\n0.581291 0.48097 -0.692756 0 \r\n0.518261 0.471455 -0.678716 0 \r\n0.462062 0.46194 -0.659894 0 \r\n0.460528 0.471455 -0.719141 0 \r\n0.701534 0.490485 -0.639906 0 \r\n0.639906 0.490485 -0.701534 0 \r\n0.692756 0.48097 -0.581292 0 \r\n0.628246 0.471455 -0.57841 0 \r\n0.569631 0.46194 -0.569632 0 \r\n0.578409 0.471455 -0.628246 0 \r\n0.801995 0.490485 -0.508364 0 \r\n0.752004 0.490485 -0.579758 0 \r\n0.783172 0.48097 -0.452165 0 \r\n0.719141 0.471455 -0.460528 0 \r\n0.659894 0.46194 -0.462063 0 \r\n0.678716 0.471455 -0.518262 0 \r\n0.878088 0.490485 -0.361376 0 \r\n0.841254 0.490485 -0.440366 0 \r\n0.849792 0.48097 -0.309299 0 \r\n0.788186 0.471455 -0.328655 0 \r\n0.730105 0.46194 -0.340454 0 \r\n0.7584 0.471455 -0.392531 0 \r\n0.9275 0.490485 -0.203407 0 \r\n0.904942 0.490485 -0.287593 0 \r\n0.890591 0.48097 -0.157035 0 \r\n0.833282 0.471455 -0.186794 0 \r\n0.778131 0.46194 -0.2085 0 \r\n0.81504 0.471455 -0.254873 0 \r\n0.94873 0.490485 -0.0392587 0 \r\n0.941134 0.490485 -0.126083 0 \r\n0.853059 0.471455 -0.0392587 0 \r\n0.802516 0.46194 -0.070211 0 \r\n0.846916 0.471455 -0.10947 0 \r\n0.7592 0.434843 0.101796 0 \r\n0.765342 0.434843 0.0315845 0 \r\n0.7165 0.407746 0.126338 0 \r\n0.679326 0.38065 0.0877115 0 \r\n0.641536 0.353553 0.056127 0 \r\n0.684237 0.38065 0.0315845 0 \r\n0.727553 0.407746 0 0 \r\n0.729989 0.434843 0.232083 0 \r\n0.74823 0.434843 0.164005 0 \r\n0.683676 0.407746 0.248838 0 \r\n0.653774 0.38065 0.204343 0 \r\n0.622043 0.353553 0.166676 0 \r\n0.668357 0.38065 0.149921 0 \r\n0.678598 0.434843 0.355318 0 \r\n0.708384 0.434843 0.291442 0 \r\n0.630079 0.407746 0.363776 0 \r\n0.608358 0.38065 0.314765 0 \r\n0.58365 0.353553 0.272161 0 \r\n0.632169 0.38065 0.263703 0 \r\n0.606588 0.434843 0.467758 0 \r\n0.647013 0.434843 0.410024 0 \r\n0.557338 0.407746 0.467662 0 \r\n0.544457 0.38065 0.415623 0 \r\n0.527523 0.353553 0.369375 0 \r\n0.576774 0.38065 0.369471 0 \r\n0.516148 0.434843 0.565984 0 \r\n0.565984 0.434843 0.516148 0 \r\n0.467662 0.407746 0.557338 0 \r\n0.464014 0.38065 0.503853 0 \r\n0.455368 0.353553 0.455368 0 \r\n0.503853 0.38065 0.464014 0 \r\n0.410024 0.434843 0.647013 0 \r\n0.467758 0.434843 0.606588 0 \r\n0.363776 0.407746 0.630079 0 \r\n0.369471 0.38065 0.576774 0 \r\n0.369375 0.353553 0.527523 0 \r\n0.415623 0.38065 0.544457 0 \r\n0.291442 0.434843 0.708384 0 \r\n0.355318 0.434843 0.678598 0 \r\n0.248838 0.407746 0.683676 0 \r\n0.263703 0.38065 0.632169 0 \r\n0.272161 0.353553 0.58365 0 \r\n0.314765 0.38065 0.608358 0 \r\n0.164005 0.434843 0.74823 0 \r\n0.232083 0.434843 0.729989 0 \r\n0.126338 0.407746 0.7165 0 \r\n0.149921 0.38065 0.668357 0 \r\n0.166676 0.353553 0.622043 0 \r\n0.204343 0.38065 0.653774 0 \r\n0.0315845 0.434843 0.765342 0 \r\n0.101796 0.434843 0.7592 0 \r\n-3.18024e-008 0.407746 0.727553 0 \r\n0.0315845 0.38065 0.684237 0 \r\n0.056127 0.353553 0.641536 0 \r\n0.0877115 0.38065 0.679326 0 \r\n-0.101796 0.434843 0.7592 0 \r\n-0.0315845 0.434843 0.765342 0 \r\n-0.126338 0.407746 0.7165 0 \r\n-0.0877115 0.38065 0.679326 0 \r\n-0.056127 0.353553 0.641536 0 \r\n-0.0315845 0.38065 0.684237 0 \r\n-0.232083 0.434843 0.729989 0 \r\n-0.164005 0.434843 0.74823 0 \r\n-0.248838 0.407746 0.683676 0 \r\n-0.204343 0.38065 0.653774 0 \r\n-0.166676 0.353553 0.622043 0 \r\n-0.149921 0.38065 0.668357 0 \r\n-0.355318 0.434843 0.678598 0 \r\n-0.291442 0.434843 0.708384 0 \r\n-0.363776 0.407746 0.630079 0 \r\n-0.314765 0.38065 0.608358 0 \r\n-0.272161 0.353553 0.58365 0 \r\n-0.263703 0.38065 0.632169 0 \r\n-0.467758 0.434843 0.606588 0 \r\n-0.410024 0.434843 0.647013 0 \r\n-0.467662 0.407746 0.557338 0 \r\n-0.415623 0.38065 0.544457 0 \r\n-0.369375 0.353553 0.527523 0 \r\n-0.369471 0.38065 0.576774 0 \r\n-0.565984 0.434843 0.516148 0 \r\n-0.516148 0.434843 0.565984 0 \r\n-0.557338 0.407746 0.467662 0 \r\n-0.503853 0.38065 0.464014 0 \r\n-0.455368 0.353553 0.455368 0 \r\n-0.464014 0.38065 0.503853 0 \r\n-0.647013 0.434843 0.410024 0 \r\n-0.606588 0.434843 0.467758 0 \r\n-0.630079 0.407746 0.363776 0 \r\n-0.576774 0.38065 0.369471 0 \r\n-0.527523 0.353553 0.369375 0 \r\n-0.544457 0.38065 0.415623 0 \r\n-0.708384 0.434843 0.291442 0 \r\n-0.678598 0.434843 0.355318 0 \r\n-0.683676 0.407746 0.248838 0 \r\n-0.632169 0.38065 0.263703 0 \r\n-0.58365 0.353553 0.272161 0 \r\n-0.608358 0.38065 0.314765 0 \r\n-0.74823 0.434843 0.164005 0 \r\n-0.729989 0.434843 0.232083 0 \r\n-0.7165 0.407746 0.126338 0 \r\n-0.668357 0.38065 0.149921 0 \r\n-0.622043 0.353553 0.166676 0 \r\n-0.653774 0.38065 0.204343 0 \r\n-0.765342 0.434843 0.0315845 0 \r\n-0.7592 0.434843 0.101796 0 \r\n-0.727553 0.407746 -6.36047e-008 0 \r\n-0.684237 0.38065 0.0315845 0 \r\n-0.641536 0.353553 0.056127 0 \r\n-0.679326 0.38065 0.0877115 0 \r\n-0.7592 0.434843 -0.101796 0 \r\n-0.765342 0.434843 -0.0315845 0 \r\n-0.7165 0.407746 -0.126338 0 \r\n-0.679326 0.38065 -0.0877115 0 \r\n-0.641536 0.353553 -0.056127 0 \r\n-0.684237 0.38065 -0.0315845 0 \r\n-0.729989 0.434843 -0.232083 0 \r\n-0.74823 0.434843 -0.164005 0 \r\n-0.683676 0.407746 -0.248838 0 \r\n-0.653774 0.38065 -0.204343 0 \r\n-0.622043 0.353553 -0.166676 0 \r\n-0.668357 0.38065 -0.149921 0 \r\n-0.678598 0.434843 -0.355318 0 \r\n-0.708384 0.434843 -0.291443 0 \r\n-0.630079 0.407746 -0.363776 0 \r\n-0.608358 0.38065 -0.314765 0 \r\n-0.58365 0.353553 -0.272161 0 \r\n-0.632169 0.38065 -0.263703 0 \r\n-0.606588 0.434843 -0.467758 0 \r\n-0.647013 0.434843 -0.410024 0 \r\n-0.557338 0.407746 -0.467662 0 \r\n-0.544457 0.38065 -0.415623 0 \r\n-0.527523 0.353553 -0.369375 0 \r\n-0.576774 0.38065 -0.369471 0 \r\n-0.516147 0.434843 -0.565984 0 \r\n-0.565984 0.434843 -0.516148 0 \r\n-0.467661 0.407746 -0.557338 0 \r\n-0.464014 0.38065 -0.503853 0 \r\n-0.455368 0.353553 -0.455368 0 \r\n-0.503853 0.38065 -0.464014 0 \r\n-0.410024 0.434843 -0.647013 0 \r\n-0.467757 0.434843 -0.606588 0 \r\n-0.363776 0.407746 -0.630079 0 \r\n-0.369471 0.38065 -0.576774 0 \r\n-0.369375 0.353553 -0.527523 0 \r\n-0.415623 0.38065 -0.544457 0 \r\n-0.291443 0.434843 -0.708384 0 \r\n-0.355318 0.434843 -0.678598 0 \r\n-0.248838 0.407746 -0.683676 0 \r\n-0.263703 0.38065 -0.632169 0 \r\n-0.272161 0.353553 -0.58365 0 \r\n-0.314765 0.38065 -0.608358 0 \r\n-0.164005 0.434843 -0.74823 0 \r\n-0.232083 0.434843 -0.729989 0 \r\n-0.126338 0.407746 -0.7165 0 \r\n-0.149921 0.38065 -0.668357 0 \r\n-0.166676 0.353553 -0.622043 0 \r\n-0.204343 0.38065 -0.653774 0 \r\n-0.0315845 0.434843 -0.765342 0 \r\n-0.101796 0.434843 -0.7592 0 \r\n8.67598e-009 0.407746 -0.727553 0 \r\n-0.0315845 0.38065 -0.684237 0 \r\n-0.056127 0.353553 -0.641536 0 \r\n-0.0877115 0.38065 -0.679326 0 \r\n0.101796 0.434843 -0.7592 0 \r\n0.0315845 0.434843 -0.765342 0 \r\n0.126338 0.407746 -0.7165 0 \r\n0.0877115 0.38065 -0.679326 0 \r\n0.056127 0.353553 -0.641536 0 \r\n0.0315845 0.38065 -0.684237 0 \r\n0.232083 0.434843 -0.729989 0 \r\n0.164005 0.434843 -0.74823 0 \r\n0.248838 0.407746 -0.683676 0 \r\n0.204343 0.38065 -0.653774 0 \r\n0.166676 0.353553 -0.622043 0 \r\n0.149921 0.38065 -0.668357 0 \r\n0.355318 0.434843 -0.678598 0 \r\n0.291442 0.434843 -0.708384 0 \r\n0.363776 0.407746 -0.630079 0 \r\n0.314765 0.38065 -0.608358 0 \r\n0.272161 0.353553 -0.58365 0 \r\n0.263703 0.38065 -0.632169 0 \r\n0.467757 0.434843 -0.606588 0 \r\n0.410024 0.434843 -0.647013 0 \r\n0.467661 0.407746 -0.557338 0 \r\n0.415623 0.38065 -0.544457 0 \r\n0.369375 0.353553 -0.527523 0 \r\n0.369471 0.38065 -0.576774 0 \r\n0.565984 0.434843 -0.516148 0 \r\n0.516147 0.434843 -0.565984 0 \r\n0.557338 0.407746 -0.467662 0 \r\n0.503853 0.38065 -0.464014 0 \r\n0.455368 0.353553 -0.455368 0 \r\n0.464014 0.38065 -0.503853 0 \r\n0.647013 0.434843 -0.410024 0 \r\n0.606588 0.434843 -0.467758 0 \r\n0.630079 0.407746 -0.363776 0 \r\n0.576774 0.38065 -0.369471 0 \r\n0.527523 0.353553 -0.369375 0 \r\n0.544457 0.38065 -0.415623 0 \r\n0.708384 0.434843 -0.291443 0 \r\n0.678598 0.434843 -0.355318 0 \r\n0.683676 0.407746 -0.248838 0 \r\n0.632169 0.38065 -0.263703 0 \r\n0.58365 0.353553 -0.272161 0 \r\n0.608358 0.38065 -0.314765 0 \r\n0.74823 0.434843 -0.164005 0 \r\n0.729989 0.434843 -0.232083 0 \r\n0.7165 0.407746 -0.126338 0 \r\n0.668357 0.38065 -0.149921 0 \r\n0.622043 0.353553 -0.166676 0 \r\n0.653774 0.38065 -0.204343 0 \r\n0.765342 0.434843 -0.0315845 0 \r\n0.7592 0.434843 -0.101796 0 \r\n0.684237 0.38065 -0.0315845 0 \r\n0.641536 0.353553 -0.056127 0 \r\n0.679326 0.38065 -0.0877115 0 \r\n0.61219 0.313 0.0818379 0 \r\n0.617101 0.313 0.0257109 0 \r\n0.583256 0.272447 0.102844 0 \r\n0.55882 0.231894 0.0724275 0 \r\n0.533973 0.191342 0.0467166 0 \r\n0.562908 0.231894 0.0257109 0 \r\n0.592254 0.272447 0 0 \r\n0.588678 0.313 0.1869 0 \r\n0.603261 0.313 0.132479 0 \r\n0.556536 0.272447 0.202563 0 \r\n0.537753 0.231894 0.168365 0 \r\n0.517748 0.191342 0.13873 0 \r\n0.549891 0.231894 0.123068 0 \r\n0.54728 0.313 0.286284 0 \r\n0.571091 0.313 0.235222 0 \r\n0.512906 0.272447 0.296126 0 \r\n0.500347 0.231894 0.259188 0 \r\n0.485793 0.191342 0.226528 0 \r\n0.520166 0.231894 0.216686 0 \r\n0.489254 0.313 0.376969 0 \r\n0.521569 0.313 0.330817 0 \r\n0.453692 0.272447 0.380693 0 \r\n0.447739 0.231894 0.342134 0 \r\n0.439076 0.191342 0.307444 0 \r\n0.474637 0.231894 0.30372 0 \r\n0.41636 0.313 0.4562 0 \r\n0.4562 0.313 0.41636 0 \r\n0.380693 0.272447 0.453692 0 \r\n0.381526 0.231894 0.414685 0 \r\n0.379018 0.191342 0.379018 0 \r\n0.414685 0.231894 0.381526 0 \r\n0.330817 0.313 0.521569 0 \r\n0.376969 0.313 0.489254 0 \r\n0.296126 0.272447 0.512906 0 \r\n0.30372 0.231894 0.474637 0 \r\n0.307444 0.191342 0.439076 0 \r\n0.342134 0.231894 0.447739 0 \r\n0.235221 0.313 0.571091 0 \r\n0.286283 0.313 0.54728 0 \r\n0.202563 0.272447 0.556536 0 \r\n0.216686 0.231894 0.520166 0 \r\n0.226528 0.191342 0.485793 0 \r\n0.259187 0.231894 0.500347 0 \r\n0.132479 0.313 0.603261 0 \r\n0.1869 0.313 0.588678 0 \r\n0.102844 0.272447 0.583256 0 \r\n0.123068 0.231894 0.549891 0 \r\n0.13873 0.191342 0.517748 0 \r\n0.168365 0.231894 0.537753 0 \r\n0.0257109 0.313 0.617101 0 \r\n0.0818379 0.313 0.61219 0 \r\n-2.58882e-008 0.272447 0.592254 0 \r\n0.0257109 0.231894 0.562908 0 \r\n0.0467166 0.191342 0.533973 0 \r\n0.0724275 0.231894 0.55882 0 \r\n-0.0818379 0.313 0.61219 0 \r\n-0.0257109 0.313 0.617101 0 \r\n-0.102844 0.272447 0.583256 0 \r\n-0.0724275 0.231894 0.55882 0 \r\n-0.0467166 0.191342 0.533973 0 \r\n-0.0257109 0.231894 0.562908 0 \r\n-0.1869 0.313 0.588678 0 \r\n-0.132479 0.313 0.603261 0 \r\n-0.202563 0.272447 0.556536 0 \r\n-0.168365 0.231894 0.537753 0 \r\n-0.13873 0.191342 0.517748 0 \r\n-0.123068 0.231894 0.549891 0 \r\n-0.286284 0.313 0.54728 0 \r\n-0.235222 0.313 0.571091 0 \r\n-0.296126 0.272447 0.512906 0 \r\n-0.259188 0.231894 0.500347 0 \r\n-0.226528 0.191342 0.485793 0 \r\n-0.216686 0.231894 0.520166 0 \r\n-0.376969 0.313 0.489254 0 \r\n-0.330817 0.313 0.521569 0 \r\n-0.380693 0.272447 0.453692 0 \r\n-0.342134 0.231894 0.447739 0 \r\n-0.307444 0.191342 0.439076 0 \r\n-0.30372 0.231894 0.474637 0 \r\n-0.4562 0.313 0.41636 0 \r\n-0.41636 0.313 0.4562 0 \r\n-0.453692 0.272447 0.380693 0 \r\n-0.414685 0.231894 0.381526 0 \r\n-0.379018 0.191342 0.379018 0 \r\n-0.381526 0.231894 0.414685 0 \r\n-0.521569 0.313 0.330817 0 \r\n-0.489254 0.313 0.376969 0 \r\n-0.512906 0.272447 0.296126 0 \r\n-0.474637 0.231894 0.30372 0 \r\n-0.439076 0.191342 0.307444 0 \r\n-0.447739 0.231894 0.342134 0 \r\n-0.571091 0.313 0.235221 0 \r\n-0.54728 0.313 0.286283 0 \r\n-0.556536 0.272447 0.202563 0 \r\n-0.520166 0.231894 0.216686 0 \r\n-0.485793 0.191342 0.226528 0 \r\n-0.500347 0.231894 0.259187 0 \r\n-0.603261 0.313 0.132479 0 \r\n-0.588678 0.313 0.1869 0 \r\n-0.583256 0.272447 0.102844 0 \r\n-0.549891 0.231894 0.123068 0 \r\n-0.517748 0.191342 0.13873 0 \r\n-0.537753 0.231894 0.168365 0 \r\n-0.617101 0.313 0.0257109 0 \r\n-0.61219 0.313 0.0818379 0 \r\n-0.592254 0.272447 -5.17764e-008 0 \r\n-0.562908 0.231894 0.0257109 0 \r\n-0.533973 0.191342 0.0467166 0 \r\n-0.55882 0.231894 0.0724275 0 \r\n-0.61219 0.313 -0.0818379 0 \r\n-0.617101 0.313 -0.0257109 0 \r\n-0.583256 0.272447 -0.102844 0 \r\n-0.55882 0.231894 -0.0724275 0 \r\n-0.533973 0.191342 -0.0467166 0 \r\n-0.562908 0.231894 -0.0257109 0 \r\n-0.588678 0.313 -0.1869 0 \r\n-0.603261 0.313 -0.132479 0 \r\n-0.556536 0.272447 -0.202563 0 \r\n-0.537753 0.231894 -0.168366 0 \r\n-0.517748 0.191342 -0.138731 0 \r\n-0.549891 0.231894 -0.123068 0 \r\n-0.54728 0.313 -0.286284 0 \r\n-0.571091 0.313 -0.235222 0 \r\n-0.512906 0.272447 -0.296126 0 \r\n-0.500347 0.231894 -0.259188 0 \r\n-0.485793 0.191342 -0.226529 0 \r\n-0.520166 0.231894 -0.216687 0 \r\n-0.489254 0.313 -0.376969 0 \r\n-0.521569 0.313 -0.330817 0 \r\n-0.453692 0.272447 -0.380693 0 \r\n-0.447739 0.231894 -0.342134 0 \r\n-0.439076 0.191342 -0.307444 0 \r\n-0.474637 0.231894 -0.30372 0 \r\n-0.41636 0.313 -0.4562 0 \r\n-0.4562 0.313 -0.41636 0 \r\n-0.380693 0.272447 -0.453692 0 \r\n-0.381526 0.231894 -0.414685 0 \r\n-0.379018 0.191342 -0.379018 0 \r\n-0.414685 0.231894 -0.381526 0 \r\n-0.330817 0.313 -0.521569 0 \r\n-0.376969 0.313 -0.489254 0 \r\n-0.296126 0.272447 -0.512906 0 \r\n-0.30372 0.231894 -0.474637 0 \r\n-0.307444 0.191342 -0.439076 0 \r\n-0.342134 0.231894 -0.447739 0 \r\n-0.235222 0.313 -0.571091 0 \r\n-0.286284 0.313 -0.54728 0 \r\n-0.202563 0.272447 -0.556536 0 \r\n-0.216687 0.231894 -0.520166 0 \r\n-0.226529 0.191342 -0.485793 0 \r\n-0.259188 0.231894 -0.500347 0 \r\n-0.132479 0.313 -0.603261 0 \r\n-0.1869 0.313 -0.588678 0 \r\n-0.102844 0.272447 -0.583256 0 \r\n-0.123068 0.231894 -0.549891 0 \r\n-0.138731 0.191342 -0.517748 0 \r\n-0.168366 0.231894 -0.537753 0 \r\n-0.0257109 0.313 -0.617101 0 \r\n-0.0818379 0.313 -0.61219 0 \r\n7.06255e-009 0.272447 -0.592254 0 \r\n-0.0257109 0.231894 -0.562908 0 \r\n-0.0467166 0.191342 -0.533973 0 \r\n-0.0724275 0.231894 -0.55882 0 \r\n0.0818379 0.313 -0.61219 0 \r\n0.0257109 0.313 -0.617101 0 \r\n0.102844 0.272447 -0.583256 0 \r\n0.0724275 0.231894 -0.55882 0 \r\n0.0467166 0.191342 -0.533973 0 \r\n0.0257109 0.231894 -0.562908 0 \r\n0.1869 0.313 -0.588678 0 \r\n0.132479 0.313 -0.603261 0 \r\n0.202563 0.272447 -0.556536 0 \r\n0.168365 0.231894 -0.537753 0 \r\n0.13873 0.191342 -0.517748 0 \r\n0.123068 0.231894 -0.549891 0 \r\n0.286284 0.313 -0.54728 0 \r\n0.235222 0.313 -0.571091 0 \r\n0.296126 0.272447 -0.512906 0 \r\n0.259188 0.231894 -0.500347 0 \r\n0.226528 0.191342 -0.485793 0 \r\n0.216686 0.231894 -0.520166 0 \r\n0.376969 0.313 -0.489254 0 \r\n0.330817 0.313 -0.521569 0 \r\n0.380693 0.272447 -0.453692 0 \r\n0.342134 0.231894 -0.447739 0 \r\n0.307444 0.191342 -0.439076 0 \r\n0.30372 0.231894 -0.474637 0 \r\n0.4562 0.313 -0.41636 0 \r\n0.41636 0.313 -0.4562 0 \r\n0.453692 0.272447 -0.380693 0 \r\n0.414685 0.231894 -0.381526 0 \r\n0.379018 0.191342 -0.379018 0 \r\n0.381526 0.231894 -0.414685 0 \r\n0.521569 0.313 -0.330817 0 \r\n0.489254 0.313 -0.376969 0 \r\n0.512906 0.272447 -0.296126 0 \r\n0.474637 0.231894 -0.30372 0 \r\n0.439076 0.191342 -0.307445 0 \r\n0.447739 0.231894 -0.342134 0 \r\n0.571091 0.313 -0.235222 0 \r\n0.54728 0.313 -0.286284 0 \r\n0.556536 0.272447 -0.202563 0 \r\n0.520166 0.231894 -0.216687 0 \r\n0.485793 0.191342 -0.226529 0 \r\n0.500347 0.231894 -0.259188 0 \r\n0.603261 0.313 -0.132479 0 \r\n0.588678 0.313 -0.1869 0 \r\n0.583256 0.272447 -0.102844 0 \r\n0.549891 0.231894 -0.123068 0 \r\n0.517748 0.191342 -0.138731 0 \r\n0.537753 0.231894 -0.168366 0 \r\n0.617101 0.313 -0.0257109 0 \r\n0.61219 0.313 -0.0818379 0 \r\n0.562908 0.231894 -0.0257109 0 \r\n0.533973 0.191342 -0.0467166 0 \r\n0.55882 0.231894 -0.0724275 0 \r\n0.522487 0.143506 0.0692488 0 \r\n0.526574 0.143506 0.0225322 0 \r\n0.511145 0.095671 0.0901286 0 \r\n0.503745 0.0478355 0.0659442 0 \r\n0.496202 -4.37114e-008 0.043412 0 \r\n0.507544 0.0478355 0.0225322 0 \r\n0.51903 0.095671 0 0 \r\n0.502524 0.143506 0.158926 0 \r\n0.514661 0.143506 0.113629 0 \r\n0.487729 0.095671 0.177519 0 \r\n0.484641 0.0478355 0.152417 0 \r\n0.481125 -4.37114e-008 0.128917 0 \r\n0.495921 0.0478355 0.110324 0 \r\n0.467292 0.143506 0.243774 0 \r\n0.487111 0.143506 0.201272 0 \r\n0.449493 0.095671 0.259515 0 \r\n0.450812 0.0478355 0.234259 0 \r\n0.451429 -4.37114e-008 0.210505 0 \r\n0.469229 0.0478355 0.194764 0 \r\n0.417863 0.143506 0.321214 0 \r\n0.444761 0.143506 0.2828 0 \r\n0.3976 0.095671 0.333626 0 \r\n0.403284 0.0478355 0.308982 0 \r\n0.408018 -4.37114e-008 0.285697 0 \r\n0.42828 0.0478355 0.273286 0 \r\n0.355736 0.143506 0.388896 0 \r\n0.388896 0.143506 0.355736 0 \r\n0.333626 0.095671 0.3976 0 \r\n0.343504 0.0478355 0.374318 0 \r\n0.352208 -4.37114e-008 0.352208 0 \r\n0.374318 0.0478355 0.343504 0 \r\n0.2828 0.143506 0.444761 0 \r\n0.321214 0.143506 0.417863 0 \r\n0.259515 0.095671 0.449493 0 \r\n0.273286 0.0478355 0.42828 0 \r\n0.285697 -4.37114e-008 0.408018 0 \r\n0.308982 0.0478355 0.403284 0 \r\n0.201272 0.143506 0.487111 0 \r\n0.243774 0.143506 0.467292 0 \r\n0.177519 0.095671 0.487729 0 \r\n0.194764 0.0478355 0.469229 0 \r\n0.210505 -4.37114e-008 0.451429 0 \r\n0.234259 0.0478355 0.450812 0 \r\n0.113629 0.143506 0.514661 0 \r\n0.158926 0.143506 0.502524 0 \r\n0.0901286 0.095671 0.511145 0 \r\n0.110324 0.0478355 0.495921 0 \r\n0.128917 -4.37114e-008 0.481125 0 \r\n0.152417 0.0478355 0.484641 0 \r\n0.0225321 0.143506 0.526574 0 \r\n0.0692488 0.143506 0.522487 0 \r\n-2.26875e-008 0.095671 0.51903 0 \r\n0.0225321 0.0478355 0.507544 0 \r\n0.043412 -4.37114e-008 0.496202 0 \r\n0.0659442 0.0478355 0.503745 0 \r\n-0.0692488 0.143506 0.522487 0 \r\n-0.0225322 0.143506 0.526574 0 \r\n-0.0901286 0.095671 0.511145 0 \r\n-0.0659442 0.0478355 0.503745 0 \r\n-0.0434121 -4.37114e-008 0.496202 0 \r\n-0.0225322 0.0478355 0.507544 0 \r\n-0.158926 0.143506 0.502524 0 \r\n-0.113629 0.143506 0.514661 0 \r\n-0.177519 0.095671 0.487729 0 \r\n-0.152417 0.0478355 0.484641 0 \r\n-0.128917 -4.37114e-008 0.481125 0 \r\n-0.110324 0.0478355 0.495921 0 \r\n-0.243774 0.143506 0.467292 0 \r\n-0.201272 0.143506 0.487111 0 \r\n-0.259515 0.095671 0.449493 0 \r\n-0.234259 0.0478355 0.450812 0 \r\n-0.210505 -4.37114e-008 0.451429 0 \r\n-0.194764 0.0478355 0.469229 0 \r\n-0.321214 0.143506 0.417863 0 \r\n-0.2828 0.143506 0.444761 0 \r\n-0.333626 0.095671 0.3976 0 \r\n-0.308982 0.0478355 0.403284 0 \r\n-0.285697 -4.37114e-008 0.408018 0 \r\n-0.273286 0.0478355 0.42828 0 \r\n-0.388896 0.143506 0.355736 0 \r\n-0.355736 0.143506 0.388896 0 \r\n-0.3976 0.095671 0.333626 0 \r\n-0.374318 0.0478355 0.343504 0 \r\n-0.352208 -4.37114e-008 0.352208 0 \r\n-0.343504 0.0478355 0.374318 0 \r\n-0.444761 0.143506 0.2828 0 \r\n-0.417863 0.143506 0.321214 0 \r\n-0.449493 0.095671 0.259515 0 \r\n-0.42828 0.0478355 0.273286 0 \r\n-0.408018 -4.37114e-008 0.285697 0 \r\n-0.403284 0.0478355 0.308982 0 \r\n-0.487111 0.143506 0.201272 0 \r\n-0.467292 0.143506 0.243774 0 \r\n-0.487729 0.095671 0.177519 0 \r\n-0.469229 0.0478355 0.194764 0 \r\n-0.451429 -4.37114e-008 0.210505 0 \r\n-0.450812 0.0478355 0.234259 0 \r\n-0.514661 0.143506 0.113629 0 \r\n-0.502524 0.143506 0.158926 0 \r\n-0.511145 0.095671 0.0901286 0 \r\n-0.495921 0.0478355 0.110324 0 \r\n-0.481125 -4.37114e-008 0.128917 0 \r\n-0.484641 0.0478355 0.152417 0 \r\n-0.526574 0.143506 0.0225321 0 \r\n-0.522487 0.143506 0.0692488 0 \r\n-0.51903 0.095671 -4.5375e-008 0 \r\n-0.507544 0.0478355 0.0225321 0 \r\n-0.496202 -4.37114e-008 0.043412 0 \r\n-0.503745 0.0478355 0.0659442 0 \r\n-0.522487 0.143506 -0.0692488 0 \r\n-0.526574 0.143506 -0.0225322 0 \r\n-0.511145 0.095671 -0.0901286 0 \r\n-0.503745 0.0478355 -0.0659442 0 \r\n-0.496202 -4.37114e-008 -0.0434121 0 \r\n-0.507544 0.0478355 -0.0225322 0 \r\n-0.502524 0.143506 -0.158926 0 \r\n-0.514661 0.143506 -0.113629 0 \r\n-0.487729 0.095671 -0.177519 0 \r\n-0.484641 0.0478355 -0.152417 0 \r\n-0.481125 -4.37114e-008 -0.128917 0 \r\n-0.495921 0.0478355 -0.110324 0 \r\n-0.467292 0.143506 -0.243774 0 \r\n-0.487111 0.143506 -0.201273 0 \r\n-0.449493 0.095671 -0.259515 0 \r\n-0.450812 0.0478355 -0.234259 0 \r\n-0.451429 -4.37114e-008 -0.210505 0 \r\n-0.469229 0.0478355 -0.194764 0 \r\n-0.417863 0.143506 -0.321214 0 \r\n-0.444761 0.143506 -0.2828 0 \r\n-0.3976 0.095671 -0.333626 0 \r\n-0.403284 0.0478355 -0.308982 0 \r\n-0.408018 -4.37114e-008 -0.285697 0 \r\n-0.42828 0.0478355 -0.273286 0 \r\n-0.355736 0.143506 -0.388896 0 \r\n-0.388896 0.143506 -0.355736 0 \r\n-0.333626 0.095671 -0.3976 0 \r\n-0.343504 0.0478355 -0.374318 0 \r\n-0.352208 -4.37114e-008 -0.352208 0 \r\n-0.374318 0.0478355 -0.343504 0 \r\n-0.2828 0.143506 -0.444761 0 \r\n-0.321214 0.143506 -0.417863 0 \r\n-0.259515 0.095671 -0.449493 0 \r\n-0.273286 0.0478355 -0.42828 0 \r\n-0.285697 -4.37114e-008 -0.408018 0 \r\n-0.308982 0.0478355 -0.403284 0 \r\n-0.201273 0.143506 -0.487111 0 \r\n-0.243774 0.143506 -0.467292 0 \r\n-0.177519 0.095671 -0.487729 0 \r\n-0.194764 0.0478355 -0.469229 0 \r\n-0.210505 -4.37114e-008 -0.451429 0 \r\n-0.234259 0.0478355 -0.450812 0 \r\n-0.113629 0.143506 -0.514661 0 \r\n-0.158926 0.143506 -0.502524 0 \r\n-0.0901286 0.095671 -0.511145 0 \r\n-0.110324 0.0478355 -0.495921 0 \r\n-0.128917 -4.37114e-008 -0.481125 0 \r\n-0.152417 0.0478355 -0.484641 0 \r\n-0.0225321 0.143506 -0.526574 0 \r\n-0.0692488 0.143506 -0.522487 0 \r\n6.18937e-009 0.095671 -0.51903 0 \r\n-0.0225321 0.0478355 -0.507544 0 \r\n-0.043412 -4.37114e-008 -0.496202 0 \r\n-0.0659442 0.0478355 -0.503745 0 \r\n0.0692488 0.143506 -0.522487 0 \r\n0.0225322 0.143506 -0.526574 0 \r\n0.0901286 0.095671 -0.511145 0 \r\n0.0659442 0.0478355 -0.503745 0 \r\n0.0434121 -4.37114e-008 -0.496202 0 \r\n0.0225322 0.0478355 -0.507544 0 \r\n0.158926 0.143506 -0.502524 0 \r\n0.113629 0.143506 -0.514661 0 \r\n0.177519 0.095671 -0.487729 0 \r\n0.152417 0.0478355 -0.484641 0 \r\n0.128917 -4.37114e-008 -0.481125 0 \r\n0.110324 0.0478355 -0.495921 0 \r\n0.243774 0.143506 -0.467292 0 \r\n0.201272 0.143506 -0.487111 0 \r\n0.259515 0.095671 -0.449493 0 \r\n0.234259 0.0478355 -0.450812 0 \r\n0.210505 -4.37114e-008 -0.451429 0 \r\n0.194764 0.0478355 -0.469229 0 \r\n0.321214 0.143506 -0.417863 0 \r\n0.2828 0.143506 -0.444761 0 \r\n0.333626 0.095671 -0.3976 0 \r\n0.308982 0.0478355 -0.403284 0 \r\n0.285697 -4.37114e-008 -0.408018 0 \r\n0.273286 0.0478355 -0.42828 0 \r\n0.388896 0.143506 -0.355736 0 \r\n0.355736 0.143506 -0.388896 0 \r\n0.3976 0.095671 -0.333627 0 \r\n0.374318 0.0478355 -0.343504 0 \r\n0.352208 -4.37114e-008 -0.352208 0 \r\n0.343504 0.0478355 -0.374318 0 \r\n0.444761 0.143506 -0.2828 0 \r\n0.417863 0.143506 -0.321215 0 \r\n0.449493 0.095671 -0.259515 0 \r\n0.42828 0.0478355 -0.273286 0 \r\n0.408018 -4.37114e-008 -0.285697 0 \r\n0.403284 0.0478355 -0.308982 0 \r\n0.487111 0.143506 -0.201273 0 \r\n0.467292 0.143506 -0.243774 0 \r\n0.487729 0.095671 -0.177519 0 \r\n0.469229 0.0478355 -0.194764 0 \r\n0.451429 -4.37114e-008 -0.210505 0 \r\n0.450812 0.0478355 -0.234259 0 \r\n0.514661 0.143506 -0.113629 0 \r\n0.502524 0.143506 -0.158926 0 \r\n0.511145 0.095671 -0.0901287 0 \r\n0.495921 0.0478355 -0.110324 0 \r\n0.481125 -4.37114e-008 -0.128917 0 \r\n0.484641 0.0478355 -0.152417 0 \r\n0.526574 0.143506 -0.0225322 0 \r\n0.522487 0.143506 -0.0692488 0 \r\n0.507544 0.0478355 -0.0225322 0 \r\n0.496202 -4.37114e-008 -0.0434121 0 \r\n0.503745 0.0478355 -0.0659443 0 \r\n0.503745 -0.0478355 0.0659442 0 \r\n0.507544 -0.0478355 0.0225322 0 \r\n0.511145 -0.095671 0.0901286 0 \r\n0.522487 -0.143506 0.0692488 0 \r\n0.533973 -0.191342 0.0467166 0 \r\n0.526574 -0.143506 0.0225322 0 \r\n0.51903 -0.095671 0 0 \r\n0.484641 -0.0478355 0.152417 0 \r\n0.495921 -0.0478355 0.110324 0 \r\n0.487729 -0.095671 0.177519 0 \r\n0.502524 -0.143506 0.158926 0 \r\n0.517748 -0.191342 0.13873 0 \r\n0.514661 -0.143506 0.113629 0 \r\n0.450812 -0.0478355 0.234259 0 \r\n0.469229 -0.0478355 0.194764 0 \r\n0.449493 -0.095671 0.259515 0 \r\n0.467292 -0.143506 0.243774 0 \r\n0.485793 -0.191342 0.226528 0 \r\n0.487111 -0.143506 0.201272 0 \r\n0.403284 -0.0478355 0.308982 0 \r\n0.42828 -0.0478355 0.273285 0 \r\n0.3976 -0.095671 0.333626 0 \r\n0.417863 -0.143506 0.321214 0 \r\n0.439076 -0.191342 0.307444 0 \r\n0.444761 -0.143506 0.2828 0 \r\n0.343504 -0.0478355 0.374318 0 \r\n0.374318 -0.0478355 0.343504 0 \r\n0.333626 -0.095671 0.3976 0 \r\n0.355736 -0.143506 0.388896 0 \r\n0.379018 -0.191342 0.379018 0 \r\n0.388896 -0.143506 0.355736 0 \r\n0.273285 -0.0478355 0.42828 0 \r\n0.308982 -0.0478355 0.403284 0 \r\n0.259515 -0.095671 0.449493 0 \r\n0.2828 -0.143506 0.444761 0 \r\n0.307444 -0.191342 0.439076 0 \r\n0.321214 -0.143506 0.417863 0 \r\n0.194764 -0.0478355 0.469229 0 \r\n0.234259 -0.0478355 0.450812 0 \r\n0.177519 -0.095671 0.487729 0 \r\n0.201272 -0.143506 0.487111 0 \r\n0.226528 -0.191342 0.485793 0 \r\n0.243774 -0.143506 0.467292 0 \r\n0.110324 -0.0478355 0.495921 0 \r\n0.152417 -0.0478355 0.484641 0 \r\n0.0901286 -0.095671 0.511145 0 \r\n0.113629 -0.143506 0.514661 0 \r\n0.13873 -0.191342 0.517748 0 \r\n0.158926 -0.143506 0.502524 0 \r\n0.0225321 -0.0478355 0.507544 0 \r\n0.0659442 -0.0478355 0.503745 0 \r\n-2.26875e-008 -0.095671 0.51903 0 \r\n0.0225321 -0.143506 0.526574 0 \r\n0.0467166 -0.191342 0.533973 0 \r\n0.0692488 -0.143506 0.522487 0 \r\n-0.0659442 -0.0478355 0.503745 0 \r\n-0.0225322 -0.0478355 0.507544 0 \r\n-0.0901286 -0.095671 0.511145 0 \r\n-0.0692488 -0.143506 0.522487 0 \r\n-0.0467166 -0.191342 0.533973 0 \r\n-0.0225322 -0.143506 0.526574 0 \r\n-0.152417 -0.0478355 0.484641 0 \r\n-0.110324 -0.0478355 0.495921 0 \r\n-0.177519 -0.095671 0.487729 0 \r\n-0.158926 -0.143506 0.502524 0 \r\n-0.13873 -0.191342 0.517748 0 \r\n-0.113629 -0.143506 0.514661 0 \r\n-0.234259 -0.0478355 0.450812 0 \r\n-0.194764 -0.0478355 0.469229 0 \r\n-0.259515 -0.095671 0.449493 0 \r\n-0.243774 -0.143506 0.467292 0 \r\n-0.226528 -0.191342 0.485793 0 \r\n-0.201272 -0.143506 0.487111 0 \r\n-0.308982 -0.0478355 0.403284 0 \r\n-0.273285 -0.0478355 0.42828 0 \r\n-0.333626 -0.095671 0.3976 0 \r\n-0.321214 -0.143506 0.417863 0 \r\n-0.307444 -0.191342 0.439076 0 \r\n-0.2828 -0.143506 0.444761 0 \r\n-0.374318 -0.0478355 0.343504 0 \r\n-0.343504 -0.0478355 0.374318 0 \r\n-0.3976 -0.095671 0.333626 0 \r\n-0.388896 -0.143506 0.355736 0 \r\n-0.379018 -0.191342 0.379018 0 \r\n-0.355736 -0.143506 0.388896 0 \r\n-0.42828 -0.0478355 0.273285 0 \r\n-0.403284 -0.0478355 0.308982 0 \r\n-0.449493 -0.095671 0.259515 0 \r\n-0.444761 -0.143506 0.2828 0 \r\n-0.439076 -0.191342 0.307444 0 \r\n-0.417863 -0.143506 0.321214 0 \r\n-0.469229 -0.0478355 0.194764 0 \r\n-0.450812 -0.0478355 0.234259 0 \r\n-0.487729 -0.095671 0.177519 0 \r\n-0.487111 -0.143506 0.201272 0 \r\n-0.485793 -0.191342 0.226528 0 \r\n-0.467292 -0.143506 0.243774 0 \r\n-0.495921 -0.0478355 0.110324 0 \r\n-0.484641 -0.0478355 0.152417 0 \r\n-0.511145 -0.095671 0.0901286 0 \r\n-0.514661 -0.143506 0.113629 0 \r\n-0.517748 -0.191342 0.13873 0 \r\n-0.502524 -0.143506 0.158926 0 \r\n-0.507544 -0.0478355 0.0225321 0 \r\n-0.503745 -0.0478355 0.0659442 0 \r\n-0.51903 -0.095671 -4.5375e-008 0 \r\n-0.526574 -0.143506 0.0225321 0 \r\n-0.533973 -0.191342 0.0467166 0 \r\n-0.522487 -0.143506 0.0692488 0 \r\n-0.503745 -0.0478355 -0.0659442 0 \r\n-0.507544 -0.0478355 -0.0225322 0 \r\n-0.511145 -0.095671 -0.0901286 0 \r\n-0.522487 -0.143506 -0.0692488 0 \r\n-0.533973 -0.191342 -0.0467166 0 \r\n-0.526574 -0.143506 -0.0225322 0 \r\n-0.484641 -0.0478355 -0.152417 0 \r\n-0.495921 -0.0478355 -0.110324 0 \r\n-0.487729 -0.095671 -0.177519 0 \r\n-0.502524 -0.143506 -0.158926 0 \r\n-0.517748 -0.191342 -0.138731 0 \r\n-0.514661 -0.143506 -0.113629 0 \r\n-0.450812 -0.0478355 -0.234259 0 \r\n-0.469229 -0.0478355 -0.194764 0 \r\n-0.449493 -0.095671 -0.259515 0 \r\n-0.467292 -0.143506 -0.243774 0 \r\n-0.485793 -0.191342 -0.226529 0 \r\n-0.487111 -0.143506 -0.201273 0 \r\n-0.403284 -0.0478355 -0.308982 0 \r\n-0.42828 -0.0478355 -0.273285 0 \r\n-0.3976 -0.095671 -0.333626 0 \r\n-0.417863 -0.143506 -0.321214 0 \r\n-0.439076 -0.191342 -0.307444 0 \r\n-0.444761 -0.143506 -0.2828 0 \r\n-0.343504 -0.0478355 -0.374318 0 \r\n-0.374318 -0.0478355 -0.343504 0 \r\n-0.333626 -0.095671 -0.3976 0 \r\n-0.355736 -0.143506 -0.388896 0 \r\n-0.379018 -0.191342 -0.379018 0 \r\n-0.388896 -0.143506 -0.355736 0 \r\n-0.273285 -0.0478355 -0.42828 0 \r\n-0.308982 -0.0478355 -0.403284 0 \r\n-0.259515 -0.095671 -0.449493 0 \r\n-0.2828 -0.143506 -0.444761 0 \r\n-0.307444 -0.191342 -0.439076 0 \r\n-0.321214 -0.143506 -0.417863 0 \r\n-0.194764 -0.0478355 -0.469229 0 \r\n-0.234259 -0.0478355 -0.450812 0 \r\n-0.177519 -0.095671 -0.487729 0 \r\n-0.201273 -0.143506 -0.487111 0 \r\n-0.226529 -0.191342 -0.485793 0 \r\n-0.243774 -0.143506 -0.467292 0 \r\n-0.110324 -0.0478355 -0.495921 0 \r\n-0.152417 -0.0478355 -0.484641 0 \r\n-0.0901286 -0.095671 -0.511145 0 \r\n-0.113629 -0.143506 -0.514661 0 \r\n-0.138731 -0.191342 -0.517748 0 \r\n-0.158926 -0.143506 -0.502524 0 \r\n-0.0225321 -0.0478355 -0.507544 0 \r\n-0.0659442 -0.0478355 -0.503745 0 \r\n6.18937e-009 -0.095671 -0.51903 0 \r\n-0.0225321 -0.143506 -0.526574 0 \r\n-0.0467166 -0.191342 -0.533973 0 \r\n-0.0692488 -0.143506 -0.522487 0 \r\n0.0659442 -0.0478355 -0.503745 0 \r\n0.0225322 -0.0478355 -0.507544 0 \r\n0.0901286 -0.095671 -0.511145 0 \r\n0.0692488 -0.143506 -0.522487 0 \r\n0.0467166 -0.191342 -0.533973 0 \r\n0.0225322 -0.143506 -0.526574 0 \r\n0.152417 -0.0478355 -0.484641 0 \r\n0.110324 -0.0478355 -0.495921 0 \r\n0.177519 -0.095671 -0.487729 0 \r\n0.158926 -0.143506 -0.502524 0 \r\n0.13873 -0.191342 -0.517748 0 \r\n0.113629 -0.143506 -0.514661 0 \r\n0.234259 -0.0478355 -0.450812 0 \r\n0.194764 -0.0478355 -0.469229 0 \r\n0.259515 -0.095671 -0.449493 0 \r\n0.243774 -0.143506 -0.467292 0 \r\n0.226528 -0.191342 -0.485793 0 \r\n0.201272 -0.143506 -0.487111 0 \r\n0.308982 -0.0478355 -0.403284 0 \r\n0.273285 -0.0478355 -0.42828 0 \r\n0.333626 -0.095671 -0.3976 0 \r\n0.321214 -0.143506 -0.417863 0 \r\n0.307444 -0.191342 -0.439076 0 \r\n0.2828 -0.143506 -0.444761 0 \r\n0.374318 -0.0478355 -0.343504 0 \r\n0.343504 -0.0478355 -0.374318 0 \r\n0.3976 -0.095671 -0.333627 0 \r\n0.388896 -0.143506 -0.355736 0 \r\n0.379018 -0.191342 -0.379018 0 \r\n0.355736 -0.143506 -0.388896 0 \r\n0.42828 -0.0478355 -0.273286 0 \r\n0.403284 -0.0478355 -0.308982 0 \r\n0.449493 -0.095671 -0.259515 0 \r\n0.444761 -0.143506 -0.2828 0 \r\n0.439076 -0.191342 -0.307445 0 \r\n0.417863 -0.143506 -0.321215 0 \r\n0.469229 -0.0478355 -0.194764 0 \r\n0.450812 -0.0478355 -0.234259 0 \r\n0.487729 -0.095671 -0.177519 0 \r\n0.487111 -0.143506 -0.201273 0 \r\n0.485793 -0.191342 -0.226529 0 \r\n0.467292 -0.143506 -0.243774 0 \r\n0.495921 -0.0478355 -0.110324 0 \r\n0.484641 -0.0478355 -0.152417 0 \r\n0.511145 -0.095671 -0.0901287 0 \r\n0.514661 -0.143506 -0.113629 0 \r\n0.517748 -0.191342 -0.138731 0 \r\n0.502524 -0.143506 -0.158926 0 \r\n0.507544 -0.0478355 -0.0225322 0 \r\n0.503745 -0.0478355 -0.0659443 0 \r\n0.526574 -0.143506 -0.0225322 0 \r\n0.533973 -0.191342 -0.0467166 0 \r\n0.522487 -0.143506 -0.0692488 0 \r\n0.55882 -0.231894 0.0724275 0 \r\n0.562908 -0.231894 0.0257109 0 \r\n0.583256 -0.272447 0.102844 0 \r\n0.61219 -0.313 0.0818379 0 \r\n0.641536 -0.353553 0.056127 0 \r\n0.617101 -0.313 0.0257109 0 \r\n0.592254 -0.272447 0 0 \r\n0.537753 -0.231894 0.168365 0 \r\n0.549891 -0.231894 0.123068 0 \r\n0.556536 -0.272447 0.202563 0 \r\n0.588678 -0.313 0.1869 0 \r\n0.622043 -0.353553 0.166676 0 \r\n0.603261 -0.313 0.132479 0 \r\n0.500347 -0.231894 0.259187 0 \r\n0.520166 -0.231894 0.216686 0 \r\n0.512906 -0.272447 0.296126 0 \r\n0.54728 -0.313 0.286283 0 \r\n0.58365 -0.353553 0.272161 0 \r\n0.571091 -0.313 0.235221 0 \r\n0.447738 -0.231894 0.342134 0 \r\n0.474636 -0.231894 0.30372 0 \r\n0.453692 -0.272447 0.380693 0 \r\n0.489253 -0.313 0.376969 0 \r\n0.527523 -0.353553 0.369375 0 \r\n0.521569 -0.313 0.330817 0 \r\n0.381526 -0.231894 0.414685 0 \r\n0.414685 -0.231894 0.381526 0 \r\n0.380693 -0.272447 0.453692 0 \r\n0.41636 -0.313 0.4562 0 \r\n0.455368 -0.353553 0.455368 0 \r\n0.4562 -0.313 0.41636 0 \r\n0.30372 -0.231894 0.474636 0 \r\n0.342134 -0.231894 0.447738 0 \r\n0.296126 -0.272447 0.512906 0 \r\n0.330817 -0.313 0.521569 0 \r\n0.369375 -0.353553 0.527523 0 \r\n0.376969 -0.313 0.489253 0 \r\n0.216686 -0.231894 0.520166 0 \r\n0.259187 -0.231894 0.500347 0 \r\n0.202563 -0.272447 0.556536 0 \r\n0.235221 -0.313 0.571091 0 \r\n0.272161 -0.353553 0.58365 0 \r\n0.286283 -0.313 0.54728 0 \r\n0.123068 -0.231894 0.549891 0 \r\n0.168365 -0.231894 0.537753 0 \r\n0.102844 -0.272447 0.583256 0 \r\n0.132479 -0.313 0.603261 0 \r\n0.166676 -0.353553 0.622043 0 \r\n0.1869 -0.313 0.588678 0 \r\n0.0257109 -0.231894 0.562908 0 \r\n0.0724275 -0.231894 0.55882 0 \r\n-2.58882e-008 -0.272447 0.592254 0 \r\n0.0257109 -0.313 0.617101 0 \r\n0.056127 -0.353553 0.641536 0 \r\n0.0818379 -0.313 0.61219 0 \r\n-0.0724275 -0.231894 0.55882 0 \r\n-0.0257109 -0.231894 0.562908 0 \r\n-0.102844 -0.272447 0.583256 0 \r\n-0.0818379 -0.313 0.61219 0 \r\n-0.056127 -0.353553 0.641536 0 \r\n-0.0257109 -0.313 0.617101 0 \r\n-0.168365 -0.231894 0.537753 0 \r\n-0.123068 -0.231894 0.549891 0 \r\n-0.202563 -0.272447 0.556536 0 \r\n-0.1869 -0.313 0.588678 0 \r\n-0.166676 -0.353553 0.622043 0 \r\n-0.132479 -0.313 0.603261 0 \r\n-0.259187 -0.231894 0.500347 0 \r\n-0.216686 -0.231894 0.520166 0 \r\n-0.296126 -0.272447 0.512906 0 \r\n-0.286283 -0.313 0.54728 0 \r\n-0.272161 -0.353553 0.58365 0 \r\n-0.235221 -0.313 0.571091 0 \r\n-0.342134 -0.231894 0.447738 0 \r\n-0.30372 -0.231894 0.474636 0 \r\n-0.380693 -0.272447 0.453692 0 \r\n-0.376969 -0.313 0.489253 0 \r\n-0.369375 -0.353553 0.527523 0 \r\n-0.330817 -0.313 0.521569 0 \r\n-0.414685 -0.231894 0.381526 0 \r\n-0.381526 -0.231894 0.414685 0 \r\n-0.453692 -0.272447 0.380693 0 \r\n-0.4562 -0.313 0.41636 0 \r\n-0.455368 -0.353553 0.455368 0 \r\n-0.41636 -0.313 0.4562 0 \r\n-0.474636 -0.231894 0.30372 0 \r\n-0.447738 -0.231894 0.342134 0 \r\n-0.512906 -0.272447 0.296126 0 \r\n-0.521569 -0.313 0.330817 0 \r\n-0.527523 -0.353553 0.369375 0 \r\n-0.489253 -0.313 0.376969 0 \r\n-0.520166 -0.231894 0.216686 0 \r\n-0.500347 -0.231894 0.259187 0 \r\n-0.556536 -0.272447 0.202563 0 \r\n-0.571091 -0.313 0.235221 0 \r\n-0.58365 -0.353553 0.272161 0 \r\n-0.54728 -0.313 0.286283 0 \r\n-0.549891 -0.231894 0.123068 0 \r\n-0.537753 -0.231894 0.168365 0 \r\n-0.583256 -0.272447 0.102844 0 \r\n-0.603261 -0.313 0.132479 0 \r\n-0.622043 -0.353553 0.166676 0 \r\n-0.588678 -0.313 0.1869 0 \r\n-0.562908 -0.231894 0.0257109 0 \r\n-0.55882 -0.231894 0.0724275 0 \r\n-0.592254 -0.272447 -5.17764e-008 0 \r\n-0.617101 -0.313 0.0257109 0 \r\n-0.641536 -0.353553 0.056127 0 \r\n-0.61219 -0.313 0.0818379 0 \r\n-0.55882 -0.231894 -0.0724275 0 \r\n-0.562908 -0.231894 -0.0257109 0 \r\n-0.583256 -0.272447 -0.102844 0 \r\n-0.61219 -0.313 -0.0818379 0 \r\n-0.641536 -0.353553 -0.056127 0 \r\n-0.617101 -0.313 -0.0257109 0 \r\n-0.537753 -0.231894 -0.168366 0 \r\n-0.549891 -0.231894 -0.123068 0 \r\n-0.556536 -0.272447 -0.202563 0 \r\n-0.588678 -0.313 -0.1869 0 \r\n-0.622043 -0.353553 -0.166676 0 \r\n-0.603261 -0.313 -0.132479 0 \r\n-0.500347 -0.231894 -0.259188 0 \r\n-0.520166 -0.231894 -0.216687 0 \r\n-0.512906 -0.272447 -0.296126 0 \r\n-0.54728 -0.313 -0.286284 0 \r\n-0.58365 -0.353553 -0.272161 0 \r\n-0.571091 -0.313 -0.235222 0 \r\n-0.447738 -0.231894 -0.342134 0 \r\n-0.474636 -0.231894 -0.30372 0 \r\n-0.453692 -0.272447 -0.380693 0 \r\n-0.489253 -0.313 -0.376969 0 \r\n-0.527523 -0.353553 -0.369375 0 \r\n-0.521569 -0.313 -0.330817 0 \r\n-0.381526 -0.231894 -0.414685 0 \r\n-0.414685 -0.231894 -0.381526 0 \r\n-0.380693 -0.272447 -0.453692 0 \r\n-0.41636 -0.313 -0.4562 0 \r\n-0.455368 -0.353553 -0.455368 0 \r\n-0.4562 -0.313 -0.41636 0 \r\n-0.30372 -0.231894 -0.474636 0 \r\n-0.342134 -0.231894 -0.447738 0 \r\n-0.296126 -0.272447 -0.512906 0 \r\n-0.330817 -0.313 -0.521569 0 \r\n-0.369375 -0.353553 -0.527523 0 \r\n-0.376969 -0.313 -0.489253 0 \r\n-0.216687 -0.231894 -0.520166 0 \r\n-0.259188 -0.231894 -0.500347 0 \r\n-0.202563 -0.272447 -0.556536 0 \r\n-0.235222 -0.313 -0.571091 0 \r\n-0.272161 -0.353553 -0.58365 0 \r\n-0.286284 -0.313 -0.54728 0 \r\n-0.123068 -0.231894 -0.549891 0 \r\n-0.168366 -0.231894 -0.537753 0 \r\n-0.102844 -0.272447 -0.583256 0 \r\n-0.132479 -0.313 -0.603261 0 \r\n-0.166676 -0.353553 -0.622043 0 \r\n-0.1869 -0.313 -0.588678 0 \r\n-0.0257109 -0.231894 -0.562908 0 \r\n-0.0724275 -0.231894 -0.55882 0 \r\n7.06255e-009 -0.272447 -0.592254 0 \r\n-0.0257109 -0.313 -0.617101 0 \r\n-0.056127 -0.353553 -0.641536 0 \r\n-0.0818379 -0.313 -0.61219 0 \r\n0.0724275 -0.231894 -0.55882 0 \r\n0.0257109 -0.231894 -0.562908 0 \r\n0.102844 -0.272447 -0.583256 0 \r\n0.0818379 -0.313 -0.61219 0 \r\n0.056127 -0.353553 -0.641536 0 \r\n0.0257109 -0.313 -0.617101 0 \r\n0.168365 -0.231894 -0.537753 0 \r\n0.123068 -0.231894 -0.549891 0 \r\n0.202563 -0.272447 -0.556536 0 \r\n0.1869 -0.313 -0.588678 0 \r\n0.166676 -0.353553 -0.622043 0 \r\n0.132479 -0.313 -0.603261 0 \r\n0.259187 -0.231894 -0.500347 0 \r\n0.216686 -0.231894 -0.520166 0 \r\n0.296126 -0.272447 -0.512906 0 \r\n0.286283 -0.313 -0.54728 0 \r\n0.272161 -0.353553 -0.58365 0 \r\n0.235221 -0.313 -0.571091 0 \r\n0.342134 -0.231894 -0.447738 0 \r\n0.30372 -0.231894 -0.474636 0 \r\n0.380693 -0.272447 -0.453692 0 \r\n0.376969 -0.313 -0.489253 0 \r\n0.369375 -0.353553 -0.527523 0 \r\n0.330817 -0.313 -0.521569 0 \r\n0.414685 -0.231894 -0.381526 0 \r\n0.381526 -0.231894 -0.414685 0 \r\n0.453692 -0.272447 -0.380693 0 \r\n0.4562 -0.313 -0.41636 0 \r\n0.455368 -0.353553 -0.455368 0 \r\n0.41636 -0.313 -0.4562 0 \r\n0.474636 -0.231894 -0.30372 0 \r\n0.447738 -0.231894 -0.342134 0 \r\n0.512906 -0.272447 -0.296126 0 \r\n0.521569 -0.313 -0.330817 0 \r\n0.527523 -0.353553 -0.369375 0 \r\n0.489253 -0.313 -0.376969 0 \r\n0.520166 -0.231894 -0.216687 0 \r\n0.500347 -0.231894 -0.259188 0 \r\n0.556536 -0.272447 -0.202563 0 \r\n0.571091 -0.313 -0.235222 0 \r\n0.58365 -0.353553 -0.272161 0 \r\n0.54728 -0.313 -0.286284 0 \r\n0.549891 -0.231894 -0.123068 0 \r\n0.537753 -0.231894 -0.168366 0 \r\n0.583256 -0.272447 -0.102844 0 \r\n0.603261 -0.313 -0.132479 0 \r\n0.622043 -0.353553 -0.166676 0 \r\n0.588678 -0.313 -0.1869 0 \r\n0.562908 -0.231894 -0.0257109 0 \r\n0.55882 -0.231894 -0.0724275 0 \r\n0.617101 -0.313 -0.0257109 0 \r\n0.641536 -0.353553 -0.056127 0 \r\n0.61219 -0.313 -0.0818379 0 \r\n0.679326 -0.38065 0.0877115 0 \r\n0.684237 -0.38065 0.0315845 0 \r\n0.7165 -0.407746 0.126338 0 \r\n0.7592 -0.434843 0.101796 0 \r\n0.802516 -0.46194 0.070211 0 \r\n0.765342 -0.434843 0.0315845 0 \r\n0.727553 -0.407746 0 0 \r\n0.653774 -0.38065 0.204343 0 \r\n0.668357 -0.38065 0.149921 0 \r\n0.683676 -0.407746 0.248838 0 \r\n0.729989 -0.434843 0.232083 0 \r\n0.778131 -0.46194 0.208499 0 \r\n0.748231 -0.434843 0.164005 0 \r\n0.608358 -0.38065 0.314765 0 \r\n0.632169 -0.38065 0.263703 0 \r\n0.630079 -0.407746 0.363776 0 \r\n0.678598 -0.434843 0.355318 0 \r\n0.730105 -0.46194 0.340453 0 \r\n0.708384 -0.434843 0.291442 0 \r\n0.544457 -0.38065 0.415623 0 \r\n0.576774 -0.38065 0.369471 0 \r\n0.557338 -0.407746 0.467661 0 \r\n0.606588 -0.434843 0.467757 0 \r\n0.659894 -0.46194 0.462062 0 \r\n0.647013 -0.434843 0.410024 0 \r\n0.464014 -0.38065 0.503853 0 \r\n0.503853 -0.38065 0.464014 0 \r\n0.467661 -0.407746 0.557338 0 \r\n0.516147 -0.434843 0.565984 0 \r\n0.569631 -0.46194 0.569631 0 \r\n0.565984 -0.434843 0.516147 0 \r\n0.369471 -0.38065 0.576774 0 \r\n0.415623 -0.38065 0.544457 0 \r\n0.363776 -0.407746 0.630079 0 \r\n0.410024 -0.434843 0.647013 0 \r\n0.462062 -0.46194 0.659894 0 \r\n0.467757 -0.434843 0.606588 0 \r\n0.263703 -0.38065 0.632169 0 \r\n0.314765 -0.38065 0.608358 0 \r\n0.248838 -0.407746 0.683676 0 \r\n0.291442 -0.434843 0.708384 0 \r\n0.340453 -0.46194 0.730105 0 \r\n0.355318 -0.434843 0.678598 0 \r\n0.149921 -0.38065 0.668357 0 \r\n0.204343 -0.38065 0.653774 0 \r\n0.126338 -0.407746 0.7165 0 \r\n0.164005 -0.434843 0.748231 0 \r\n0.208499 -0.46194 0.778131 0 \r\n0.232083 -0.434843 0.729989 0 \r\n0.0315845 -0.38065 0.684237 0 \r\n0.0877115 -0.38065 0.679326 0 \r\n-3.18024e-008 -0.407746 0.727553 0 \r\n0.0315845 -0.434843 0.765342 0 \r\n0.070211 -0.46194 0.802516 0 \r\n0.101796 -0.434843 0.7592 0 \r\n-0.0877115 -0.38065 0.679326 0 \r\n-0.0315845 -0.38065 0.684237 0 \r\n-0.126338 -0.407746 0.7165 0 \r\n-0.101796 -0.434843 0.7592 0 \r\n-0.070211 -0.46194 0.802516 0 \r\n-0.0315845 -0.434843 0.765342 0 \r\n-0.204343 -0.38065 0.653774 0 \r\n-0.149921 -0.38065 0.668357 0 \r\n-0.248838 -0.407746 0.683676 0 \r\n-0.232083 -0.434843 0.729989 0 \r\n-0.208499 -0.46194 0.778131 0 \r\n-0.164005 -0.434843 0.748231 0 \r\n-0.314765 -0.38065 0.608358 0 \r\n-0.263703 -0.38065 0.632169 0 \r\n-0.363776 -0.407746 0.630079 0 \r\n-0.355318 -0.434843 0.678598 0 \r\n-0.340453 -0.46194 0.730105 0 \r\n-0.291442 -0.434843 0.708384 0 \r\n-0.415623 -0.38065 0.544457 0 \r\n-0.369471 -0.38065 0.576774 0 \r\n-0.467662 -0.407746 0.557338 0 \r\n-0.467758 -0.434843 0.606588 0 \r\n-0.462063 -0.46194 0.659894 0 \r\n-0.410024 -0.434843 0.647013 0 \r\n-0.503853 -0.38065 0.464014 0 \r\n-0.464014 -0.38065 0.503853 0 \r\n-0.557338 -0.407746 0.467662 0 \r\n-0.565984 -0.434843 0.516148 0 \r\n-0.569632 -0.46194 0.569632 0 \r\n-0.516148 -0.434843 0.565984 0 \r\n-0.576774 -0.38065 0.369471 0 \r\n-0.544457 -0.38065 0.415623 0 \r\n-0.630079 -0.407746 0.363776 0 \r\n-0.647013 -0.434843 0.410024 0 \r\n-0.659894 -0.46194 0.462063 0 \r\n-0.606588 -0.434843 0.467758 0 \r\n-0.632169 -0.38065 0.263703 0 \r\n-0.608358 -0.38065 0.314765 0 \r\n-0.683676 -0.407746 0.248838 0 \r\n-0.708384 -0.434843 0.291442 0 \r\n-0.730105 -0.46194 0.340453 0 \r\n-0.678598 -0.434843 0.355318 0 \r\n-0.668357 -0.38065 0.149921 0 \r\n-0.653774 -0.38065 0.204343 0 \r\n-0.7165 -0.407746 0.126338 0 \r\n-0.748231 -0.434843 0.164005 0 \r\n-0.778131 -0.46194 0.208499 0 \r\n-0.729989 -0.434843 0.232083 0 \r\n-0.684237 -0.38065 0.0315845 0 \r\n-0.679326 -0.38065 0.0877115 0 \r\n-0.727553 -0.407746 -6.36047e-008 0 \r\n-0.765342 -0.434843 0.0315845 0 \r\n-0.802516 -0.46194 0.070211 0 \r\n-0.7592 -0.434843 0.101796 0 \r\n-0.679326 -0.38065 -0.0877115 0 \r\n-0.684237 -0.38065 -0.0315845 0 \r\n-0.7165 -0.407746 -0.126338 0 \r\n-0.7592 -0.434843 -0.101796 0 \r\n-0.802516 -0.46194 -0.070211 0 \r\n-0.765342 -0.434843 -0.0315845 0 \r\n-0.653774 -0.38065 -0.204343 0 \r\n-0.668357 -0.38065 -0.149921 0 \r\n-0.683676 -0.407746 -0.248838 0 \r\n-0.729989 -0.434843 -0.232083 0 \r\n-0.778131 -0.46194 -0.2085 0 \r\n-0.748231 -0.434843 -0.164005 0 \r\n-0.608358 -0.38065 -0.314765 0 \r\n-0.632169 -0.38065 -0.263703 0 \r\n-0.630079 -0.407746 -0.363776 0 \r\n-0.678598 -0.434843 -0.355318 0 \r\n-0.730105 -0.46194 -0.340454 0 \r\n-0.708384 -0.434843 -0.291443 0 \r\n-0.544457 -0.38065 -0.415623 0 \r\n-0.576774 -0.38065 -0.369471 0 \r\n-0.557338 -0.407746 -0.467661 0 \r\n-0.606588 -0.434843 -0.467757 0 \r\n-0.659894 -0.46194 -0.462062 0 \r\n-0.647013 -0.434843 -0.410024 0 \r\n-0.464014 -0.38065 -0.503853 0 \r\n-0.503853 -0.38065 -0.464014 0 \r\n-0.467661 -0.407746 -0.557338 0 \r\n-0.516147 -0.434843 -0.565984 0 \r\n-0.569631 -0.46194 -0.569631 0 \r\n-0.565984 -0.434843 -0.516147 0 \r\n-0.369471 -0.38065 -0.576774 0 \r\n-0.415623 -0.38065 -0.544457 0 \r\n-0.363776 -0.407746 -0.630079 0 \r\n-0.410024 -0.434843 -0.647013 0 \r\n-0.462062 -0.46194 -0.659894 0 \r\n-0.467757 -0.434843 -0.606588 0 \r\n-0.263703 -0.38065 -0.632169 0 \r\n-0.314765 -0.38065 -0.608358 0 \r\n-0.248838 -0.407746 -0.683676 0 \r\n-0.291443 -0.434843 -0.708384 0 \r\n-0.340454 -0.46194 -0.730105 0 \r\n-0.355318 -0.434843 -0.678598 0 \r\n-0.149921 -0.38065 -0.668357 0 \r\n-0.204343 -0.38065 -0.653774 0 \r\n-0.126338 -0.407746 -0.7165 0 \r\n-0.164005 -0.434843 -0.748231 0 \r\n-0.2085 -0.46194 -0.778131 0 \r\n-0.232083 -0.434843 -0.729989 0 \r\n-0.0315845 -0.38065 -0.684237 0 \r\n-0.0877115 -0.38065 -0.679326 0 \r\n8.67598e-009 -0.407746 -0.727553 0 \r\n-0.0315845 -0.434843 -0.765342 0 \r\n-0.070211 -0.46194 -0.802516 0 \r\n-0.101796 -0.434843 -0.7592 0 \r\n0.0877115 -0.38065 -0.679326 0 \r\n0.0315845 -0.38065 -0.684237 0 \r\n0.126338 -0.407746 -0.7165 0 \r\n0.101796 -0.434843 -0.7592 0 \r\n0.070211 -0.46194 -0.802516 0 \r\n0.0315845 -0.434843 -0.765342 0 \r\n0.204343 -0.38065 -0.653774 0 \r\n0.149921 -0.38065 -0.668357 0 \r\n0.248838 -0.407746 -0.683676 0 \r\n0.232083 -0.434843 -0.729989 0 \r\n0.208499 -0.46194 -0.778131 0 \r\n0.164005 -0.434843 -0.748231 0 \r\n0.314765 -0.38065 -0.608358 0 \r\n0.263703 -0.38065 -0.632169 0 \r\n0.363776 -0.407746 -0.630079 0 \r\n0.355318 -0.434843 -0.678598 0 \r\n0.340453 -0.46194 -0.730105 0 \r\n0.291442 -0.434843 -0.708384 0 \r\n0.415623 -0.38065 -0.544457 0 \r\n0.369471 -0.38065 -0.576774 0 \r\n0.467661 -0.407746 -0.557338 0 \r\n0.467757 -0.434843 -0.606588 0 \r\n0.462062 -0.46194 -0.659894 0 \r\n0.410024 -0.434843 -0.647013 0 \r\n0.503853 -0.38065 -0.464014 0 \r\n0.464014 -0.38065 -0.503853 0 \r\n0.557338 -0.407746 -0.467662 0 \r\n0.565984 -0.434843 -0.516148 0 \r\n0.569631 -0.46194 -0.569632 0 \r\n0.516147 -0.434843 -0.565984 0 \r\n0.576774 -0.38065 -0.369471 0 \r\n0.544457 -0.38065 -0.415623 0 \r\n0.630079 -0.407746 -0.363776 0 \r\n0.647013 -0.434843 -0.410024 0 \r\n0.659894 -0.46194 -0.462063 0 \r\n0.606588 -0.434843 -0.467758 0 \r\n0.632169 -0.38065 -0.263703 0 \r\n0.608358 -0.38065 -0.314765 0 \r\n0.683676 -0.407746 -0.248838 0 \r\n0.708384 -0.434843 -0.291443 0 \r\n0.730105 -0.46194 -0.340454 0 \r\n0.678598 -0.434843 -0.355318 0 \r\n0.668357 -0.38065 -0.149921 0 \r\n0.653774 -0.38065 -0.204343 0 \r\n0.7165 -0.407746 -0.126338 0 \r\n0.748231 -0.434843 -0.164005 0 \r\n0.778131 -0.46194 -0.2085 0 \r\n0.729989 -0.434843 -0.232083 0 \r\n0.684237 -0.38065 -0.0315845 0 \r\n0.679326 -0.38065 -0.0877115 0 \r\n0.765342 -0.434843 -0.0315845 0 \r\n0.802516 -0.46194 -0.070211 0 \r\n0.7592 -0.434843 -0.101796 0 \r\n0.846916 -0.471455 0.10947 0 \r\n0.853059 -0.471455 0.0392587 0 \r\n0.890591 -0.48097 0.157035 0 \r\n0.941134 -0.490485 0.126083 0 \r\n0.992404 -0.5 0.086824 0 \r\n0.94873 -0.490485 0.0392587 0 \r\n0.904329 -0.48097 0 0 \r\n0.81504 -0.471455 0.254872 0 \r\n0.833282 -0.471455 0.186794 0 \r\n0.849792 -0.48097 0.309299 0 \r\n0.904942 -0.490485 0.287593 0 \r\n0.96225 -0.5 0.257834 0 \r\n0.9275 -0.490485 0.203407 0 \r\n0.7584 -0.471455 0.392531 0 \r\n0.788186 -0.471455 0.328654 0 \r\n0.783172 -0.48097 0.452165 0 \r\n0.841254 -0.490485 0.440366 0 \r\n0.902859 -0.5 0.42101 0 \r\n0.878088 -0.490485 0.361376 0 \r\n0.678716 -0.471455 0.518261 0 \r\n0.719141 -0.471455 0.460528 0 \r\n0.692756 -0.48097 0.581291 0 \r\n0.752004 -0.490485 0.579758 0 \r\n0.816034 -0.5 0.571394 0 \r\n0.801994 -0.490485 0.508364 0 \r\n0.578409 -0.471455 0.628246 0 \r\n0.628246 -0.471455 0.578409 0 \r\n0.581291 -0.48097 0.692756 0 \r\n0.639906 -0.490485 0.701534 0 \r\n0.704416 -0.5 0.704416 0 \r\n0.701534 -0.490485 0.639906 0 \r\n0.460528 -0.471455 0.719141 0 \r\n0.518261 -0.471455 0.678716 0 \r\n0.452165 -0.48097 0.783172 0 \r\n0.508364 -0.490485 0.801994 0 \r\n0.571394 -0.5 0.816034 0 \r\n0.579758 -0.490485 0.752004 0 \r\n0.328654 -0.471455 0.788186 0 \r\n0.39253 -0.471455 0.7584 0 \r\n0.309299 -0.48097 0.849792 0 \r\n0.361376 -0.490485 0.878088 0 \r\n0.42101 -0.5 0.902859 0 \r\n0.440365 -0.490485 0.841254 0 \r\n0.186794 -0.471455 0.833282 0 \r\n0.254872 -0.471455 0.81504 0 \r\n0.157035 -0.48097 0.890591 0 \r\n0.203407 -0.490485 0.9275 0 \r\n0.257834 -0.5 0.96225 0 \r\n0.287593 -0.490485 0.904942 0 \r\n0.0392587 -0.471455 0.853059 0 \r\n0.10947 -0.471455 0.846916 0 \r\n-3.95295e-008 -0.48097 0.904329 0 \r\n0.0392587 -0.490485 0.94873 0 \r\n0.086824 -0.5 0.992404 0 \r\n0.126083 -0.490485 0.941134 0 \r\n-0.10947 -0.471455 0.846916 0 \r\n-0.0392588 -0.471455 0.853059 0 \r\n-0.157035 -0.48097 0.890591 0 \r\n-0.126083 -0.490485 0.941134 0 \r\n-0.086824 -0.5 0.992404 0 \r\n-0.0392588 -0.490485 0.94873 0 \r\n-0.254872 -0.471455 0.81504 0 \r\n-0.186794 -0.471455 0.833282 0 \r\n-0.309299 -0.48097 0.849792 0 \r\n-0.287593 -0.490485 0.904942 0 \r\n-0.257834 -0.5 0.96225 0 \r\n-0.203407 -0.490485 0.9275 0 \r\n-0.392531 -0.471455 0.7584 0 \r\n-0.328654 -0.471455 0.788186 0 \r\n-0.452165 -0.48097 0.783172 0 \r\n-0.440366 -0.490485 0.841254 0 \r\n-0.42101 -0.5 0.902859 0 \r\n-0.361376 -0.490485 0.878088 0 \r\n-0.518262 -0.471455 0.678716 0 \r\n-0.460528 -0.471455 0.719141 0 \r\n-0.581292 -0.48097 0.692756 0 \r\n-0.579758 -0.490485 0.752004 0 \r\n-0.571394 -0.5 0.816034 0 \r\n-0.508364 -0.490485 0.801994 0 \r\n-0.628246 -0.471455 0.57841 0 \r\n-0.57841 -0.471455 0.628246 0 \r\n-0.692756 -0.48097 0.581292 0 \r\n-0.701534 -0.490485 0.639906 0 \r\n-0.704416 -0.5 0.704416 0 \r\n-0.639906 -0.490485 0.701534 0 \r\n-0.719141 -0.471455 0.460528 0 \r\n-0.678716 -0.471455 0.518262 0 \r\n-0.783172 -0.48097 0.452165 0 \r\n-0.801994 -0.490485 0.508364 0 \r\n-0.816034 -0.5 0.571394 0 \r\n-0.752004 -0.490485 0.579758 0 \r\n-0.788186 -0.471455 0.328654 0 \r\n-0.7584 -0.471455 0.39253 0 \r\n-0.849792 -0.48097 0.309299 0 \r\n-0.878088 -0.490485 0.361376 0 \r\n-0.902859 -0.5 0.42101 0 \r\n-0.841254 -0.490485 0.440365 0 \r\n-0.833282 -0.471455 0.186794 0 \r\n-0.81504 -0.471455 0.254872 0 \r\n-0.890591 -0.48097 0.157035 0 \r\n-0.9275 -0.490485 0.203407 0 \r\n-0.96225 -0.5 0.257834 0 \r\n-0.904942 -0.490485 0.287593 0 \r\n-0.853059 -0.471455 0.0392587 0 \r\n-0.846916 -0.471455 0.10947 0 \r\n-0.904329 -0.48097 -7.9059e-008 0 \r\n-0.94873 -0.490485 0.0392587 0 \r\n-0.992404 -0.5 0.086824 0 \r\n-0.941134 -0.490485 0.126083 0 \r\n-0.846916 -0.471455 -0.10947 0 \r\n-0.853059 -0.471455 -0.0392588 0 \r\n-0.890591 -0.48097 -0.157035 0 \r\n-0.941134 -0.490485 -0.126083 0 \r\n-0.992404 -0.5 -0.086824 0 \r\n-0.94873 -0.490485 -0.0392588 0 \r\n-0.81504 -0.471455 -0.254873 0 \r\n-0.833282 -0.471455 -0.186794 0 \r\n-0.849792 -0.48097 -0.309299 0 \r\n-0.904942 -0.490485 -0.287593 0 \r\n-0.96225 -0.5 -0.257834 0 \r\n-0.9275 -0.490485 -0.203407 0 \r\n-0.7584 -0.471455 -0.392531 0 \r\n-0.788186 -0.471455 -0.328655 0 \r\n-0.783172 -0.48097 -0.452165 0 \r\n-0.841254 -0.490485 -0.440366 0 \r\n-0.902859 -0.5 -0.42101 0 \r\n-0.878088 -0.490485 -0.361376 0 \r\n-0.678716 -0.471455 -0.518261 0 \r\n-0.719141 -0.471455 -0.460528 0 \r\n-0.692756 -0.48097 -0.581291 0 \r\n-0.752004 -0.490485 -0.579758 0 \r\n-0.816034 -0.5 -0.571394 0 \r\n-0.801994 -0.490485 -0.508364 0 \r\n-0.578409 -0.471455 -0.628246 0 \r\n-0.628246 -0.471455 -0.578409 0 \r\n-0.581291 -0.48097 -0.692756 0 \r\n-0.639906 -0.490485 -0.701535 0 \r\n-0.704416 -0.5 -0.704417 0 \r\n-0.701534 -0.490485 -0.639906 0 \r\n-0.460528 -0.471455 -0.719141 0 \r\n-0.518261 -0.471455 -0.678716 0 \r\n-0.452165 -0.48097 -0.783172 0 \r\n-0.508364 -0.490485 -0.801994 0 \r\n-0.571394 -0.5 -0.816035 0 \r\n-0.579758 -0.490485 -0.752005 0 \r\n-0.328655 -0.471455 -0.788185 0 \r\n-0.392531 -0.471455 -0.7584 0 \r\n-0.309299 -0.48097 -0.849791 0 \r\n-0.361376 -0.490485 -0.878087 0 \r\n-0.42101 -0.5 -0.902858 0 \r\n-0.440366 -0.490485 -0.841253 0 \r\n-0.186794 -0.471455 -0.833282 0 \r\n-0.254873 -0.471455 -0.81504 0 \r\n-0.157035 -0.48097 -0.890591 0 \r\n-0.203407 -0.490485 -0.9275 0 \r\n-0.257834 -0.5 -0.96225 0 \r\n-0.287594 -0.490485 -0.904941 0 \r\n-0.0392587 -0.471455 -0.853059 0 \r\n-0.10947 -0.471455 -0.846916 0 \r\n1.0784e-008 -0.48097 -0.904329 0 \r\n-0.0392587 -0.490485 -0.94873 0 \r\n-0.086824 -0.5 -0.992404 0 \r\n-0.126083 -0.490485 -0.941134 0 \r\n0.10947 -0.471455 -0.846916 0 \r\n0.0392588 -0.471455 -0.853059 0 \r\n0.157035 -0.48097 -0.890591 0 \r\n0.126083 -0.490485 -0.941134 0 \r\n0.086824 -0.5 -0.992404 0 \r\n0.0392588 -0.490485 -0.94873 0 \r\n0.254872 -0.471455 -0.81504 0 \r\n0.186794 -0.471455 -0.833282 0 \r\n0.309299 -0.48097 -0.849792 0 \r\n0.287593 -0.490485 -0.904942 0 \r\n0.257834 -0.5 -0.96225 0 \r\n0.203407 -0.490485 -0.9275 0 \r\n0.392531 -0.471455 -0.7584 0 \r\n0.328654 -0.471455 -0.788186 0 \r\n0.452165 -0.48097 -0.783172 0 \r\n0.440366 -0.490485 -0.841254 0 \r\n0.42101 -0.5 -0.902859 0 \r\n0.361376 -0.490485 -0.878088 0 \r\n0.518261 -0.471455 -0.678716 0 \r\n0.460528 -0.471455 -0.719141 0 \r\n0.581291 -0.48097 -0.692756 0 \r\n0.579758 -0.490485 -0.752004 0 \r\n0.571394 -0.5 -0.816034 0 \r\n0.508364 -0.490485 -0.801994 0 \r\n0.628246 -0.471455 -0.57841 0 \r\n0.578409 -0.471455 -0.628246 0 \r\n0.692756 -0.48097 -0.581292 0 \r\n0.701534 -0.490485 -0.639906 0 \r\n0.704416 -0.5 -0.704416 0 \r\n0.639906 -0.490485 -0.701534 0 \r\n0.719141 -0.471455 -0.460528 0 \r\n0.678716 -0.471455 -0.518262 0 \r\n0.783172 -0.48097 -0.452165 0 \r\n0.801995 -0.490485 -0.508364 0 \r\n0.816035 -0.5 -0.571394 0 \r\n0.752004 -0.490485 -0.579758 0 \r\n0.788186 -0.471455 -0.328655 0 \r\n0.7584 -0.471455 -0.392531 0 \r\n0.849792 -0.48097 -0.309299 0 \r\n0.878088 -0.490485 -0.361376 0 \r\n0.902859 -0.5 -0.42101 0 \r\n0.841254 -0.490485 -0.440366 0 \r\n0.833282 -0.471455 -0.186794 0 \r\n0.81504 -0.471455 -0.254873 0 \r\n0.890591 -0.48097 -0.157035 0 \r\n0.9275 -0.490485 -0.203407 0 \r\n0.96225 -0.5 -0.257834 0 \r\n0.904942 -0.490485 -0.287593 0 \r\n0.853059 -0.471455 -0.0392587 0 \r\n0.846916 -0.471455 -0.10947 0 \r\n0.94873 -0.490485 -0.0392587 0 \r\n0.992404 -0.5 -0.086824 0 \r\n0.941134 -0.490485 -0.126083 0 \r\n1.03608 -0.490485 0.134389 0 \r\n1.04367 -0.490485 0.0475653 0 \r\n1.07902 -0.48097 0.190261 0 \r\n1.1303 -0.471455 0.151002 0 \r\n1.18229 -0.46194 0.103437 0 \r\n1.13934 -0.471455 0.0475653 0 \r\n1.09567 -0.48097 0 0 \r\n0.997001 -0.490485 0.312261 0 \r\n1.01956 -0.490485 0.228075 0 \r\n1.0296 -0.48097 0.374741 0 \r\n1.08691 -0.471455 0.344982 0 \r\n1.14637 -0.46194 0.307169 0 \r\n1.11378 -0.471455 0.244687 0 \r\n0.927631 -0.490485 0.480644 0 \r\n0.964465 -0.490485 0.401654 0 \r\n0.948878 -0.48097 0.547835 0 \r\n1.01048 -0.471455 0.52848 0 \r\n1.07562 -0.46194 0.501567 0 \r\n1.05437 -0.471455 0.434376 0 \r\n0.830075 -0.490485 0.634424 0 \r\n0.880065 -0.490485 0.56303 0 \r\n0.839333 -0.48097 0.704284 0 \r\n0.903363 -0.471455 0.69592 0 \r\n0.972176 -0.46194 0.680725 0 \r\n0.962918 -0.471455 0.610865 0 \r\n0.707298 -0.490485 0.768926 0 \r\n0.768926 -0.490485 0.707298 0 \r\n0.704284 -0.48097 0.839333 0 \r\n0.768794 -0.471455 0.842215 0 \r\n0.8392 -0.46194 0.8392 0 \r\n0.842215 -0.471455 0.768794 0 \r\n0.56303 -0.490485 0.880065 0 \r\n0.634424 -0.490485 0.830075 0 \r\n0.547835 -0.48097 0.948878 0 \r\n0.610865 -0.471455 0.962918 0 \r\n0.680725 -0.46194 0.972176 0 \r\n0.69592 -0.471455 0.903363 0 \r\n0.401654 -0.490485 0.964465 0 \r\n0.480644 -0.490485 0.927631 0 \r\n0.374741 -0.48097 1.0296 0 \r\n0.434376 -0.471455 1.05437 0 \r\n0.501567 -0.46194 1.07562 0 \r\n0.52848 -0.471455 1.01048 0 \r\n0.228075 -0.490485 1.01956 0 \r\n0.312261 -0.490485 0.997001 0 \r\n0.190261 -0.48097 1.07902 0 \r\n0.244687 -0.471455 1.11378 0 \r\n0.307169 -0.46194 1.14637 0 \r\n0.344982 -0.471455 1.08691 0 \r\n0.0475652 -0.490485 1.04367 0 \r\n0.134389 -0.490485 1.03608 0 \r\n-4.78933e-008 -0.48097 1.09567 0 \r\n0.0475652 -0.471455 1.13934 0 \r\n0.103437 -0.46194 1.18229 0 \r\n0.151002 -0.471455 1.1303 0 \r\n-0.134389 -0.490485 1.03608 0 \r\n-0.0475653 -0.490485 1.04367 0 \r\n-0.190261 -0.48097 1.07902 0 \r\n-0.151002 -0.471455 1.1303 0 \r\n-0.103437 -0.46194 1.18229 0 \r\n-0.0475653 -0.471455 1.13934 0 \r\n-0.312261 -0.490485 0.997001 0 \r\n-0.228075 -0.490485 1.01956 0 \r\n-0.374741 -0.48097 1.0296 0 \r\n-0.344982 -0.471455 1.08691 0 \r\n-0.307169 -0.46194 1.14637 0 \r\n-0.244687 -0.471455 1.11378 0 \r\n-0.480644 -0.490485 0.927631 0 \r\n-0.401654 -0.490485 0.964465 0 \r\n-0.547835 -0.48097 0.948878 0 \r\n-0.52848 -0.471455 1.01048 0 \r\n-0.501567 -0.46194 1.07562 0 \r\n-0.434376 -0.471455 1.05437 0 \r\n-0.634424 -0.490485 0.830075 0 \r\n-0.56303 -0.490485 0.880065 0 \r\n-0.704284 -0.48097 0.839333 0 \r\n-0.69592 -0.471455 0.903363 0 \r\n-0.680725 -0.46194 0.972176 0 \r\n-0.610865 -0.471455 0.962918 0 \r\n-0.768926 -0.490485 0.707298 0 \r\n-0.707298 -0.490485 0.768926 0 \r\n-0.839333 -0.48097 0.704284 0 \r\n-0.842215 -0.471455 0.768794 0 \r\n-0.8392 -0.46194 0.8392 0 \r\n-0.768794 -0.471455 0.842215 0 \r\n-0.880065 -0.490485 0.56303 0 \r\n-0.830075 -0.490485 0.634424 0 \r\n-0.948878 -0.48097 0.547835 0 \r\n-0.962918 -0.471455 0.610865 0 \r\n-0.972176 -0.46194 0.680725 0 \r\n-0.903363 -0.471455 0.69592 0 \r\n-0.964465 -0.490485 0.401654 0 \r\n-0.927631 -0.490485 0.480644 0 \r\n-1.0296 -0.48097 0.374741 0 \r\n-1.05437 -0.471455 0.434376 0 \r\n-1.07562 -0.46194 0.501567 0 \r\n-1.01048 -0.471455 0.52848 0 \r\n-1.01956 -0.490485 0.228075 0 \r\n-0.997001 -0.490485 0.312261 0 \r\n-1.07902 -0.48097 0.190261 0 \r\n-1.11378 -0.471455 0.244687 0 \r\n-1.14637 -0.46194 0.307169 0 \r\n-1.08691 -0.471455 0.344982 0 \r\n-1.04367 -0.490485 0.0475652 0 \r\n-1.03608 -0.490485 0.134389 0 \r\n-1.09567 -0.48097 -9.57864e-008 0 \r\n-1.13934 -0.471455 0.0475652 0 \r\n-1.18229 -0.46194 0.103437 0 \r\n-1.1303 -0.471455 0.151002 0 \r\n-1.03608 -0.490485 -0.134389 0 \r\n-1.04367 -0.490485 -0.0475653 0 \r\n-1.07902 -0.48097 -0.190261 0 \r\n-1.1303 -0.471455 -0.151002 0 \r\n-1.18229 -0.46194 -0.103437 0 \r\n-1.13934 -0.471455 -0.0475653 0 \r\n-0.997001 -0.490485 -0.312261 0 \r\n-1.01956 -0.490485 -0.228075 0 \r\n-1.0296 -0.48097 -0.374741 0 \r\n-1.08691 -0.471455 -0.344982 0 \r\n-1.14637 -0.46194 -0.307169 0 \r\n-1.11378 -0.471455 -0.244687 0 \r\n-0.927631 -0.490485 -0.480644 0 \r\n-0.964465 -0.490485 -0.401654 0 \r\n-0.948878 -0.48097 -0.547835 0 \r\n-1.01048 -0.471455 -0.52848 0 \r\n-1.07562 -0.46194 -0.501567 0 \r\n-1.05437 -0.471455 -0.434376 0 \r\n-0.830075 -0.490485 -0.634424 0 \r\n-0.880065 -0.490485 -0.56303 0 \r\n-0.839333 -0.48097 -0.704284 0 \r\n-0.903363 -0.471455 -0.69592 0 \r\n-0.972176 -0.46194 -0.680725 0 \r\n-0.962918 -0.471455 -0.610865 0 \r\n-0.707298 -0.490485 -0.768927 0 \r\n-0.768926 -0.490485 -0.707299 0 \r\n-0.704284 -0.48097 -0.839333 0 \r\n-0.768794 -0.471455 -0.842215 0 \r\n-0.8392 -0.46194 -0.8392 0 \r\n-0.842215 -0.471455 -0.768794 0 \r\n-0.56303 -0.490485 -0.880065 0 \r\n-0.634424 -0.490485 -0.830075 0 \r\n-0.547835 -0.48097 -0.948878 0 \r\n-0.610865 -0.471455 -0.962918 0 \r\n-0.680725 -0.46194 -0.972176 0 \r\n-0.69592 -0.471455 -0.903363 0 \r\n-0.401655 -0.490485 -0.964463 0 \r\n-0.480644 -0.490485 -0.927629 0 \r\n-0.374742 -0.48097 -1.02959 0 \r\n-0.434376 -0.471455 -1.05436 0 \r\n-0.501567 -0.46194 -1.07561 0 \r\n-0.52848 -0.471455 -1.01048 0 \r\n-0.228075 -0.490485 -1.01956 0 \r\n-0.312261 -0.490485 -0.997001 0 \r\n-0.190261 -0.48097 -1.07902 0 \r\n-0.244688 -0.471455 -1.11378 0 \r\n-0.307169 -0.46194 -1.14636 0 \r\n-0.344983 -0.471455 -1.0869 0 \r\n-0.0475652 -0.490485 -1.04367 0 \r\n-0.134389 -0.490485 -1.03608 0 \r\n1.30658e-008 -0.48097 -1.09567 0 \r\n-0.0475652 -0.471455 -1.13934 0 \r\n-0.103437 -0.46194 -1.18229 0 \r\n-0.151002 -0.471455 -1.1303 0 \r\n0.134389 -0.490485 -1.03608 0 \r\n0.0475653 -0.490485 -1.04367 0 \r\n0.190261 -0.48097 -1.07902 0 \r\n0.151002 -0.471455 -1.1303 0 \r\n0.103437 -0.46194 -1.18229 0 \r\n0.0475653 -0.471455 -1.13934 0 \r\n0.312261 -0.490485 -0.997001 0 \r\n0.228075 -0.490485 -1.01956 0 \r\n0.374741 -0.48097 -1.0296 0 \r\n0.344982 -0.471455 -1.08691 0 \r\n0.307169 -0.46194 -1.14637 0 \r\n0.244687 -0.471455 -1.11378 0 \r\n0.480644 -0.490485 -0.927631 0 \r\n0.401654 -0.490485 -0.964465 0 \r\n0.547835 -0.48097 -0.948878 0 \r\n0.52848 -0.471455 -1.01048 0 \r\n0.501567 -0.46194 -1.07562 0 \r\n0.434376 -0.471455 -1.05437 0 \r\n0.634424 -0.490485 -0.830075 0 \r\n0.56303 -0.490485 -0.880065 0 \r\n0.704284 -0.48097 -0.839333 0 \r\n0.69592 -0.471455 -0.903363 0 \r\n0.680725 -0.46194 -0.972176 0 \r\n0.610865 -0.471455 -0.962918 0 \r\n0.768926 -0.490485 -0.707298 0 \r\n0.707298 -0.490485 -0.768926 0 \r\n0.839333 -0.48097 -0.704284 0 \r\n0.842215 -0.471455 -0.768794 0 \r\n0.8392 -0.46194 -0.8392 0 \r\n0.768794 -0.471455 -0.842215 0 \r\n0.880066 -0.490485 -0.56303 0 \r\n0.830075 -0.490485 -0.634424 0 \r\n0.948878 -0.48097 -0.547835 0 \r\n0.962918 -0.471455 -0.610865 0 \r\n0.972176 -0.46194 -0.680725 0 \r\n0.903363 -0.471455 -0.69592 0 \r\n0.964465 -0.490485 -0.401654 0 \r\n0.927631 -0.490485 -0.480644 0 \r\n1.0296 -0.48097 -0.374741 0 \r\n1.05437 -0.471455 -0.434376 0 \r\n1.07562 -0.46194 -0.501567 0 \r\n1.01048 -0.471455 -0.52848 0 \r\n1.01956 -0.490485 -0.228075 0 \r\n0.997001 -0.490485 -0.312261 0 \r\n1.07902 -0.48097 -0.190261 0 \r\n1.11378 -0.471455 -0.244688 0 \r\n1.14637 -0.46194 -0.307169 0 \r\n1.08691 -0.471455 -0.344983 0 \r\n1.04367 -0.490485 -0.0475653 0 \r\n1.03608 -0.490485 -0.134389 0 \r\n1.13934 -0.471455 -0.0475653 0 \r\n1.18229 -0.46194 -0.103437 0 \r\n1.1303 -0.471455 -0.151003 0 \r\n1.21801 -0.434843 0.158677 0 \r\n1.22706 -0.434843 0.0552395 0 \r\n1.25311 -0.407746 0.220958 0 \r\n1.29788 -0.38065 0.172761 0 \r\n1.34327 -0.353553 0.117521 0 \r\n1.30816 -0.38065 0.0552395 0 \r\n1.27244 -0.407746 0 0 \r\n1.17196 -0.434843 0.367772 0 \r\n1.19883 -0.434843 0.267477 0 \r\n1.19571 -0.407746 0.435203 0 \r\n1.24817 -0.38065 0.395511 0 \r\n1.30245 -0.353553 0.348992 0 \r\n1.2787 -0.38065 0.281561 0 \r\n1.09029 -0.434843 0.565692 0 \r\n1.13417 -0.434843 0.471588 0 \r\n1.10197 -0.407746 0.636224 0 \r\n1.16052 -0.38065 0.606245 0 \r\n1.22206 -0.353553 0.56986 0 \r\n1.21038 -0.38065 0.499328 0 \r\n0.975491 -0.434843 0.746424 0 \r\n1.03505 -0.434843 0.66137 0 \r\n0.974751 -0.407746 0.817913 0 \r\n1.03762 -0.38065 0.798558 0 \r\n1.10454 -0.353553 0.773412 0 \r\n1.10528 -0.38065 0.701923 0 \r\n0.831056 -0.434843 0.904477 0 \r\n0.904477 -0.434843 0.831056 0 \r\n0.817913 -0.407746 0.974751 0 \r\n0.883189 -0.38065 0.966606 0 \r\n0.953463 -0.353553 0.953463 0 \r\n0.966606 -0.38065 0.883189 0 \r\n0.66137 -0.434843 1.03505 0 \r\n0.746424 -0.434843 0.975491 0 \r\n0.636224 -0.407746 1.10197 0 \r\n0.701923 -0.38065 1.10528 0 \r\n0.773412 -0.353553 1.10454 0 \r\n0.798558 -0.38065 1.03762 0 \r\n0.471588 -0.434843 1.13417 0 \r\n0.565692 -0.434843 1.09029 0 \r\n0.435203 -0.407746 1.19571 0 \r\n0.499328 -0.38065 1.21038 0 \r\n0.56986 -0.353553 1.22206 0 \r\n0.606245 -0.38065 1.16052 0 \r\n0.267478 -0.434843 1.19883 0 \r\n0.367772 -0.434843 1.17196 0 \r\n0.220958 -0.407746 1.25311 0 \r\n0.281561 -0.38065 1.2787 0 \r\n0.348992 -0.353553 1.30245 0 \r\n0.395512 -0.38065 1.24817 0 \r\n0.0552395 -0.434843 1.22706 0 \r\n0.158677 -0.434843 1.21801 0 \r\n-5.56205e-008 -0.407746 1.27244 0 \r\n0.0552395 -0.38065 1.30816 0 \r\n0.117521 -0.353553 1.34327 0 \r\n0.172761 -0.38065 1.29788 0 \r\n-0.158677 -0.434843 1.21801 0 \r\n-0.0552395 -0.434843 1.22706 0 \r\n-0.220958 -0.407746 1.25311 0 \r\n-0.172761 -0.38065 1.29788 0 \r\n-0.117521 -0.353553 1.34327 0 \r\n-0.0552395 -0.38065 1.30816 0 \r\n-0.367772 -0.434843 1.17196 0 \r\n-0.267477 -0.434843 1.19883 0 \r\n-0.435203 -0.407746 1.19571 0 \r\n-0.395511 -0.38065 1.24817 0 \r\n-0.348992 -0.353553 1.30245 0 \r\n-0.281561 -0.38065 1.2787 0 \r\n-0.565692 -0.434843 1.09029 0 \r\n-0.471588 -0.434843 1.13417 0 \r\n-0.636224 -0.407746 1.10197 0 \r\n-0.606245 -0.38065 1.16052 0 \r\n-0.56986 -0.353553 1.22206 0 \r\n-0.499328 -0.38065 1.21038 0 \r\n-0.746424 -0.434843 0.975491 0 \r\n-0.66137 -0.434843 1.03505 0 \r\n-0.817913 -0.407746 0.974751 0 \r\n-0.798558 -0.38065 1.03762 0 \r\n-0.773412 -0.353553 1.10454 0 \r\n-0.701923 -0.38065 1.10528 0 \r\n-0.904477 -0.434843 0.831056 0 \r\n-0.831056 -0.434843 0.904477 0 \r\n-0.974751 -0.407746 0.817913 0 \r\n-0.966606 -0.38065 0.883189 0 \r\n-0.953463 -0.353553 0.953463 0 \r\n-0.883189 -0.38065 0.966606 0 \r\n-1.03505 -0.434843 0.66137 0 \r\n-0.975491 -0.434843 0.746424 0 \r\n-1.10197 -0.407746 0.636224 0 \r\n-1.10528 -0.38065 0.701923 0 \r\n-1.10454 -0.353553 0.773412 0 \r\n-1.03762 -0.38065 0.798558 0 \r\n-1.13417 -0.434843 0.471588 0 \r\n-1.09029 -0.434843 0.565692 0 \r\n-1.19571 -0.407746 0.435203 0 \r\n-1.21038 -0.38065 0.499328 0 \r\n-1.22206 -0.353553 0.56986 0 \r\n-1.16052 -0.38065 0.606245 0 \r\n-1.19883 -0.434843 0.267478 0 \r\n-1.17196 -0.434843 0.367772 0 \r\n-1.25311 -0.407746 0.220958 0 \r\n-1.2787 -0.38065 0.281561 0 \r\n-1.30245 -0.353553 0.348992 0 \r\n-1.24817 -0.38065 0.395512 0 \r\n-1.22706 -0.434843 0.0552394 0 \r\n-1.21801 -0.434843 0.158677 0 \r\n-1.27244 -0.407746 -1.1124e-007 0 \r\n-1.30816 -0.38065 0.0552394 0 \r\n-1.34327 -0.353553 0.117521 0 \r\n-1.29788 -0.38065 0.172761 0 \r\n-1.21801 -0.434843 -0.158677 0 \r\n-1.22706 -0.434843 -0.0552396 0 \r\n-1.25311 -0.407746 -0.220958 0 \r\n-1.29788 -0.38065 -0.172761 0 \r\n-1.34327 -0.353553 -0.117521 0 \r\n-1.30816 -0.38065 -0.0552396 0 \r\n-1.17196 -0.434843 -0.367772 0 \r\n-1.19883 -0.434843 -0.267478 0 \r\n-1.19571 -0.407746 -0.435203 0 \r\n-1.24817 -0.38065 -0.395512 0 \r\n-1.30245 -0.353553 -0.348992 0 \r\n-1.2787 -0.38065 -0.281561 0 \r\n-1.09029 -0.434843 -0.565692 0 \r\n-1.13417 -0.434843 -0.471588 0 \r\n-1.10197 -0.407746 -0.636224 0 \r\n-1.16052 -0.38065 -0.606245 0 \r\n-1.22206 -0.353553 -0.56986 0 \r\n-1.21038 -0.38065 -0.499328 0 \r\n-0.975491 -0.434843 -0.746424 0 \r\n-1.03505 -0.434843 -0.66137 0 \r\n-0.974751 -0.407746 -0.817913 0 \r\n-1.03762 -0.38065 -0.798558 0 \r\n-1.10454 -0.353553 -0.773412 0 \r\n-1.10528 -0.38065 -0.701923 0 \r\n-0.831056 -0.434843 -0.904477 0 \r\n-0.904477 -0.434843 -0.831056 0 \r\n-0.817913 -0.407746 -0.974751 0 \r\n-0.883189 -0.38065 -0.966606 0 \r\n-0.953463 -0.353553 -0.953463 0 \r\n-0.966606 -0.38065 -0.883189 0 \r\n-0.66137 -0.434843 -1.03505 0 \r\n-0.746424 -0.434843 -0.975491 0 \r\n-0.636224 -0.407746 -1.10197 0 \r\n-0.701923 -0.38065 -1.10528 0 \r\n-0.773412 -0.353553 -1.10454 0 \r\n-0.798558 -0.38065 -1.03762 0 \r\n-0.471588 -0.434843 -1.13417 0 \r\n-0.565692 -0.434843 -1.09029 0 \r\n-0.435203 -0.407746 -1.1957 0 \r\n-0.499328 -0.38065 -1.21038 0 \r\n-0.56986 -0.353553 -1.22206 0 \r\n-0.606245 -0.38065 -1.16052 0 \r\n-0.267478 -0.434843 -1.19883 0 \r\n-0.367772 -0.434843 -1.17195 0 \r\n-0.220958 -0.407746 -1.25311 0 \r\n-0.281561 -0.38065 -1.2787 0 \r\n-0.348992 -0.353553 -1.30245 0 \r\n-0.395512 -0.38065 -1.24817 0 \r\n-0.0552395 -0.434843 -1.22706 0 \r\n-0.158677 -0.434843 -1.21801 0 \r\n1.51738e-008 -0.407746 -1.27244 0 \r\n-0.0552395 -0.38065 -1.30816 0 \r\n-0.117521 -0.353553 -1.34327 0 \r\n-0.172761 -0.38065 -1.29788 0 \r\n0.158677 -0.434843 -1.21801 0 \r\n0.0552395 -0.434843 -1.22706 0 \r\n0.220958 -0.407746 -1.25311 0 \r\n0.172761 -0.38065 -1.29788 0 \r\n0.117521 -0.353553 -1.34327 0 \r\n0.0552395 -0.38065 -1.30816 0 \r\n0.367772 -0.434843 -1.17196 0 \r\n0.267477 -0.434843 -1.19883 0 \r\n0.435203 -0.407746 -1.19571 0 \r\n0.395511 -0.38065 -1.24817 0 \r\n0.348992 -0.353553 -1.30245 0 \r\n0.281561 -0.38065 -1.2787 0 \r\n0.565692 -0.434843 -1.09029 0 \r\n0.471588 -0.434843 -1.13417 0 \r\n0.636224 -0.407746 -1.10197 0 \r\n0.606245 -0.38065 -1.16052 0 \r\n0.56986 -0.353553 -1.22206 0 \r\n0.499328 -0.38065 -1.21038 0 \r\n0.746424 -0.434843 -0.975491 0 \r\n0.66137 -0.434843 -1.03505 0 \r\n0.817913 -0.407746 -0.974751 0 \r\n0.798558 -0.38065 -1.03762 0 \r\n0.773412 -0.353553 -1.10454 0 \r\n0.701923 -0.38065 -1.10528 0 \r\n0.904477 -0.434843 -0.831056 0 \r\n0.831056 -0.434843 -0.904477 0 \r\n0.974751 -0.407746 -0.817914 0 \r\n0.966606 -0.38065 -0.88319 0 \r\n0.953463 -0.353553 -0.953464 0 \r\n0.883189 -0.38065 -0.966606 0 \r\n1.03505 -0.434843 -0.66137 0 \r\n0.975491 -0.434843 -0.746424 0 \r\n1.10197 -0.407746 -0.636223 0 \r\n1.10528 -0.38065 -0.701923 0 \r\n1.10454 -0.353553 -0.773412 0 \r\n1.03762 -0.38065 -0.798558 0 \r\n1.13417 -0.434843 -0.471588 0 \r\n1.09029 -0.434843 -0.565692 0 \r\n1.19571 -0.407746 -0.435203 0 \r\n1.21038 -0.38065 -0.499328 0 \r\n1.22206 -0.353553 -0.56986 0 \r\n1.16052 -0.38065 -0.606245 0 \r\n1.19883 -0.434843 -0.267478 0 \r\n1.17196 -0.434843 -0.367772 0 \r\n1.25311 -0.407746 -0.220959 0 \r\n1.2787 -0.38065 -0.281561 0 \r\n1.30245 -0.353553 -0.348992 0 \r\n1.24817 -0.38065 -0.395512 0 \r\n1.22706 -0.434843 -0.0552395 0 \r\n1.21801 -0.434843 -0.158677 0 \r\n1.30816 -0.38065 -0.0552395 0 \r\n1.34327 -0.353553 -0.117521 0 \r\n1.29788 -0.38065 -0.172761 0 \r\n1.36502 -0.313 0.178634 0 \r\n1.3753 -0.313 0.061113 0 \r\n1.38636 -0.272447 0.244453 0 \r\n1.41839 -0.231894 0.188045 0 \r\n1.45083 -0.191342 0.126932 0 \r\n1.4295 -0.231894 0.061113 0 \r\n1.40775 -0.272447 0 0 \r\n1.31326 -0.313 0.412953 0 \r\n1.3438 -0.313 0.299003 0 \r\n1.32284 -0.272447 0.481477 0 \r\n1.36418 -0.231894 0.431489 0 \r\n1.40675 -0.191342 0.376938 0 \r\n1.39717 -0.231894 0.308414 0 \r\n1.2216 -0.313 0.634727 0 \r\n1.27146 -0.313 0.527809 0 \r\n1.21915 -0.272447 0.703874 0 \r\n1.26854 -0.231894 0.661823 0 \r\n1.31993 -0.191342 0.615492 0 \r\n1.32238 -0.231894 0.546345 0 \r\n1.09282 -0.313 0.837212 0 \r\n1.16049 -0.313 0.740577 0 \r\n1.0784 -0.272447 0.904882 0 \r\n1.13434 -0.231894 0.872047 0 \r\n1.193 -0.191342 0.835343 0 \r\n1.20742 -0.231894 0.767674 0 \r\n0.930843 -0.313 1.01426 0 \r\n1.01426 -0.313 0.930843 0 \r\n0.904882 -0.272447 1.0784 0 \r\n0.965677 -0.231894 1.05577 0 \r\n1.02981 -0.191342 1.02981 0 \r\n1.05577 -0.231894 0.965677 0 \r\n0.740577 -0.313 1.16049 0 \r\n0.837212 -0.313 1.09282 0 \r\n0.703874 -0.272447 1.21915 0 \r\n0.767674 -0.231894 1.20742 0 \r\n0.835343 -0.191342 1.193 0 \r\n0.872047 -0.231894 1.13434 0 \r\n0.52781 -0.313 1.27146 0 \r\n0.634727 -0.313 1.22161 0 \r\n0.481478 -0.272447 1.32284 0 \r\n0.546345 -0.231894 1.32239 0 \r\n0.615492 -0.191342 1.31993 0 \r\n0.661823 -0.231894 1.26854 0 \r\n0.299003 -0.313 1.3438 0 \r\n0.412954 -0.313 1.31326 0 \r\n0.244453 -0.272447 1.38636 0 \r\n0.308414 -0.231894 1.39717 0 \r\n0.376938 -0.191342 1.40675 0 \r\n0.431489 -0.231894 1.36418 0 \r\n0.061113 -0.313 1.3753 0 \r\n0.178634 -0.313 1.36502 0 \r\n-6.15345e-008 -0.272447 1.40775 0 \r\n0.061113 -0.231894 1.4295 0 \r\n0.126931 -0.191342 1.45083 0 \r\n0.188045 -0.231894 1.41839 0 \r\n-0.178634 -0.313 1.36502 0 \r\n-0.061113 -0.313 1.3753 0 \r\n-0.244453 -0.272447 1.38636 0 \r\n-0.188045 -0.231894 1.41839 0 \r\n-0.126932 -0.191342 1.45083 0 \r\n-0.061113 -0.231894 1.4295 0 \r\n-0.412953 -0.313 1.31326 0 \r\n-0.299003 -0.313 1.3438 0 \r\n-0.481477 -0.272447 1.32284 0 \r\n-0.431489 -0.231894 1.36418 0 \r\n-0.376938 -0.191342 1.40675 0 \r\n-0.308414 -0.231894 1.39717 0 \r\n-0.634727 -0.313 1.2216 0 \r\n-0.527809 -0.313 1.27146 0 \r\n-0.703874 -0.272447 1.21915 0 \r\n-0.661823 -0.231894 1.26854 0 \r\n-0.615492 -0.191342 1.31993 0 \r\n-0.546345 -0.231894 1.32238 0 \r\n-0.837212 -0.313 1.09282 0 \r\n-0.740577 -0.313 1.16049 0 \r\n-0.904882 -0.272447 1.0784 0 \r\n-0.872047 -0.231894 1.13434 0 \r\n-0.835343 -0.191342 1.193 0 \r\n-0.767674 -0.231894 1.20742 0 \r\n-1.01426 -0.313 0.930843 0 \r\n-0.930843 -0.313 1.01426 0 \r\n-1.0784 -0.272447 0.904882 0 \r\n-1.05577 -0.231894 0.965677 0 \r\n-1.02981 -0.191342 1.02981 0 \r\n-0.965677 -0.231894 1.05577 0 \r\n-1.16049 -0.313 0.740577 0 \r\n-1.09282 -0.313 0.837212 0 \r\n-1.21915 -0.272447 0.703874 0 \r\n-1.20742 -0.231894 0.767674 0 \r\n-1.193 -0.191342 0.835343 0 \r\n-1.13434 -0.231894 0.872047 0 \r\n-1.27146 -0.313 0.52781 0 \r\n-1.22161 -0.313 0.634727 0 \r\n-1.32284 -0.272447 0.481478 0 \r\n-1.32239 -0.231894 0.546345 0 \r\n-1.31993 -0.191342 0.615492 0 \r\n-1.26854 -0.231894 0.661823 0 \r\n-1.3438 -0.313 0.299003 0 \r\n-1.31326 -0.313 0.412954 0 \r\n-1.38636 -0.272447 0.244453 0 \r\n-1.39717 -0.231894 0.308414 0 \r\n-1.40675 -0.191342 0.376938 0 \r\n-1.36418 -0.231894 0.431489 0 \r\n-1.3753 -0.313 0.0611129 0 \r\n-1.36502 -0.313 0.178634 0 \r\n-1.40775 -0.272447 -1.23069e-007 0 \r\n-1.4295 -0.231894 0.0611129 0 \r\n-1.45083 -0.191342 0.126931 0 \r\n-1.41839 -0.231894 0.188045 0 \r\n-1.36502 -0.313 -0.178634 0 \r\n-1.3753 -0.313 -0.0611131 0 \r\n-1.38636 -0.272447 -0.244453 0 \r\n-1.41839 -0.231894 -0.188045 0 \r\n-1.45083 -0.191342 -0.126932 0 \r\n-1.4295 -0.231894 -0.0611131 0 \r\n-1.31326 -0.313 -0.412954 0 \r\n-1.3438 -0.313 -0.299003 0 \r\n-1.32284 -0.272447 -0.481478 0 \r\n-1.36418 -0.231894 -0.431489 0 \r\n-1.40675 -0.191342 -0.376938 0 \r\n-1.39717 -0.231894 -0.308414 0 \r\n-1.2216 -0.313 -0.634727 0 \r\n-1.27146 -0.313 -0.52781 0 \r\n-1.21915 -0.272447 -0.703874 0 \r\n-1.26854 -0.231894 -0.661823 0 \r\n-1.31993 -0.191342 -0.615492 0 \r\n-1.32238 -0.231894 -0.546345 0 \r\n-1.09282 -0.313 -0.837212 0 \r\n-1.16049 -0.313 -0.740577 0 \r\n-1.0784 -0.272447 -0.904882 0 \r\n-1.13434 -0.231894 -0.872047 0 \r\n-1.193 -0.191342 -0.835343 0 \r\n-1.20742 -0.231894 -0.767674 0 \r\n-0.930843 -0.313 -1.01426 0 \r\n-1.01426 -0.313 -0.930843 0 \r\n-0.904882 -0.272447 -1.0784 0 \r\n-0.965677 -0.231894 -1.05577 0 \r\n-1.02981 -0.191342 -1.02981 0 \r\n-1.05577 -0.231894 -0.965677 0 \r\n-0.740577 -0.313 -1.16049 0 \r\n-0.837212 -0.313 -1.09282 0 \r\n-0.703874 -0.272447 -1.21915 0 \r\n-0.767674 -0.231894 -1.20742 0 \r\n-0.835343 -0.191342 -1.193 0 \r\n-0.872047 -0.231894 -1.13434 0 \r\n-0.52781 -0.313 -1.27146 0 \r\n-0.634727 -0.313 -1.22161 0 \r\n-0.481478 -0.272447 -1.32284 0 \r\n-0.546345 -0.231894 -1.32239 0 \r\n-0.615492 -0.191342 -1.31993 0 \r\n-0.661823 -0.231894 -1.26854 0 \r\n-0.299003 -0.313 -1.3438 0 \r\n-0.412954 -0.313 -1.31326 0 \r\n-0.244453 -0.272447 -1.38636 0 \r\n-0.308414 -0.231894 -1.39717 0 \r\n-0.376938 -0.191342 -1.40675 0 \r\n-0.431489 -0.231894 -1.36418 0 \r\n-0.061113 -0.313 -1.3753 0 \r\n-0.178634 -0.313 -1.36502 0 \r\n1.67873e-008 -0.272447 -1.40775 0 \r\n-0.061113 -0.231894 -1.4295 0 \r\n-0.126931 -0.191342 -1.45083 0 \r\n-0.188045 -0.231894 -1.41839 0 \r\n0.178634 -0.313 -1.36502 0 \r\n0.061113 -0.313 -1.3753 0 \r\n0.244453 -0.272447 -1.38636 0 \r\n0.188045 -0.231894 -1.41839 0 \r\n0.126932 -0.191342 -1.45083 0 \r\n0.061113 -0.231894 -1.4295 0 \r\n0.412953 -0.313 -1.31326 0 \r\n0.299003 -0.313 -1.3438 0 \r\n0.481477 -0.272447 -1.32284 0 \r\n0.431489 -0.231894 -1.36418 0 \r\n0.376938 -0.191342 -1.40675 0 \r\n0.308414 -0.231894 -1.39717 0 \r\n0.634727 -0.313 -1.2216 0 \r\n0.527809 -0.313 -1.27146 0 \r\n0.703874 -0.272447 -1.21915 0 \r\n0.661823 -0.231894 -1.26854 0 \r\n0.615492 -0.191342 -1.31993 0 \r\n0.546345 -0.231894 -1.32238 0 \r\n0.837212 -0.313 -1.09282 0 \r\n0.740577 -0.313 -1.16049 0 \r\n0.904882 -0.272447 -1.0784 0 \r\n0.872047 -0.231894 -1.13434 0 \r\n0.835343 -0.191342 -1.193 0 \r\n0.767674 -0.231894 -1.20742 0 \r\n1.01426 -0.313 -0.930843 0 \r\n0.930843 -0.313 -1.01426 0 \r\n1.0784 -0.272447 -0.904882 0 \r\n1.05577 -0.231894 -0.965678 0 \r\n1.02981 -0.191342 -1.02981 0 \r\n0.965677 -0.231894 -1.05577 0 \r\n1.16049 -0.313 -0.740577 0 \r\n1.09282 -0.313 -0.837213 0 \r\n1.21915 -0.272447 -0.703873 0 \r\n1.20742 -0.231894 -0.767674 0 \r\n1.193 -0.191342 -0.835343 0 \r\n1.13434 -0.231894 -0.872047 0 \r\n1.27146 -0.313 -0.52781 0 \r\n1.22161 -0.313 -0.634726 0 \r\n1.32284 -0.272447 -0.481478 0 \r\n1.32239 -0.231894 -0.546345 0 \r\n1.31993 -0.191342 -0.615492 0 \r\n1.26854 -0.231894 -0.661823 0 \r\n1.3438 -0.313 -0.299003 0 \r\n1.31326 -0.313 -0.412954 0 \r\n1.38636 -0.272447 -0.244453 0 \r\n1.39717 -0.231894 -0.308414 0 \r\n1.40675 -0.191342 -0.376938 0 \r\n1.36418 -0.231894 -0.431489 0 \r\n1.3753 -0.313 -0.061113 0 \r\n1.36502 -0.313 -0.178634 0 \r\n1.4295 -0.231894 -0.061113 0 \r\n1.45083 -0.191342 -0.126932 0 \r\n1.41839 -0.231894 -0.188045 0 \r\n1.45473 -0.143506 0.191224 0 \r\n1.46583 -0.143506 0.064292 0 \r\n1.45847 -0.095671 0.257168 0 \r\n1.47346 -0.0478355 0.194528 0 \r\n1.48486 -0.0478355 0.064292 0 \r\n1.48097 -0.095671 0 0 \r\n1.39942 -0.143506 0.440929 0 \r\n1.43239 -0.143506 0.317854 0 \r\n1.39165 -0.095671 0.506521 0 \r\n1.4173 -0.0478355 0.447437 0 \r\n1.45114 -0.0478355 0.321158 0 \r\n1.30159 -0.143506 0.677237 0 \r\n1.35544 -0.143506 0.561758 0 \r\n1.28256 -0.095671 0.740485 0 \r\n1.31807 -0.0478355 0.686751 0 \r\n1.37333 -0.0478355 0.568267 0 \r\n1.16422 -0.143506 0.892967 0 \r\n1.2373 -0.143506 0.788594 0 \r\n1.13449 -0.095671 0.951949 0 \r\n1.1788 -0.0478355 0.905199 0 \r\n1.25378 -0.0478355 0.798108 0 \r\n0.991469 -0.143506 1.08157 0 \r\n1.08157 -0.143506 0.991469 0 \r\n0.951949 -0.095671 1.13449 0 \r\n1.0037 -0.0478355 1.09615 0 \r\n1.09615 -0.0478355 1.0037 0 \r\n0.788594 -0.143506 1.2373 0 \r\n0.892967 -0.143506 1.16422 0 \r\n0.740485 -0.095671 1.28256 0 \r\n0.798108 -0.0478355 1.25378 0 \r\n0.905199 -0.0478355 1.1788 0 \r\n0.561758 -0.143506 1.35544 0 \r\n0.677237 -0.143506 1.30159 0 \r\n0.506521 -0.095671 1.39165 0 \r\n0.568267 -0.0478355 1.37333 0 \r\n0.686751 -0.0478355 1.31807 0 \r\n0.317854 -0.143506 1.43239 0 \r\n0.440929 -0.143506 1.39942 0 \r\n0.257168 -0.095671 1.45847 0 \r\n0.321158 -0.0478355 1.45114 0 \r\n0.447437 -0.0478355 1.4173 0 \r\n0.064292 -0.143506 1.46583 0 \r\n0.191224 -0.143506 1.45473 0 \r\n-6.47352e-008 -0.095671 1.48097 0 \r\n0.064292 -0.0478355 1.48486 0 \r\n0.194528 -0.0478355 1.47346 0 \r\n-0.191224 -0.143506 1.45473 0 \r\n-0.064292 -0.143506 1.46583 0 \r\n-0.257168 -0.095671 1.45847 0 \r\n-0.194528 -0.0478355 1.47346 0 \r\n-0.064292 -0.0478355 1.48486 0 \r\n-0.440929 -0.143506 1.39942 0 \r\n-0.317854 -0.143506 1.43239 0 \r\n-0.506521 -0.095671 1.39165 0 \r\n-0.447437 -0.0478355 1.4173 0 \r\n-0.321158 -0.0478355 1.45114 0 \r\n-0.677237 -0.143506 1.30159 0 \r\n-0.561758 -0.143506 1.35544 0 \r\n-0.740485 -0.095671 1.28256 0 \r\n-0.686751 -0.0478355 1.31807 0 \r\n-0.568267 -0.0478355 1.37333 0 \r\n-0.892967 -0.143506 1.16422 0 \r\n-0.788594 -0.143506 1.2373 0 \r\n-0.951949 -0.095671 1.13449 0 \r\n-0.905199 -0.0478355 1.1788 0 \r\n-0.798108 -0.0478355 1.25378 0 \r\n-1.08157 -0.143506 0.991469 0 \r\n-0.991469 -0.143506 1.08157 0 \r\n-1.13449 -0.095671 0.951949 0 \r\n-1.09615 -0.0478355 1.0037 0 \r\n-1.0037 -0.0478355 1.09615 0 \r\n-1.2373 -0.143506 0.788594 0 \r\n-1.16422 -0.143506 0.892967 0 \r\n-1.28256 -0.095671 0.740485 0 \r\n-1.25378 -0.0478355 0.798108 0 \r\n-1.1788 -0.0478355 0.905199 0 \r\n-1.35544 -0.143506 0.561758 0 \r\n-1.30159 -0.143506 0.677237 0 \r\n-1.39165 -0.095671 0.506521 0 \r\n-1.37333 -0.0478355 0.568267 0 \r\n-1.31807 -0.0478355 0.686751 0 \r\n-1.43239 -0.143506 0.317854 0 \r\n-1.39942 -0.143506 0.440929 0 \r\n-1.45847 -0.095671 0.257168 0 \r\n-1.45114 -0.0478355 0.321158 0 \r\n-1.4173 -0.0478355 0.447437 0 \r\n-1.46583 -0.143506 0.0642919 0 \r\n-1.45473 -0.143506 0.191224 0 \r\n-1.48097 -0.095671 -1.2947e-007 0 \r\n-1.48486 -0.0478355 0.0642919 0 \r\n-1.47346 -0.0478355 0.194528 0 \r\n-1.45473 -0.143506 -0.191224 0 \r\n-1.46583 -0.143506 -0.0642921 0 \r\n-1.45847 -0.095671 -0.257168 0 \r\n-1.47346 -0.0478355 -0.194528 0 \r\n-1.48486 -0.0478355 -0.0642921 0 \r\n-1.39942 -0.143506 -0.440929 0 \r\n-1.43239 -0.143506 -0.317854 0 \r\n-1.39165 -0.095671 -0.506522 0 \r\n-1.4173 -0.0478355 -0.447438 0 \r\n-1.45114 -0.0478355 -0.321158 0 \r\n-1.30159 -0.143506 -0.677237 0 \r\n-1.35544 -0.143506 -0.561759 0 \r\n-1.28256 -0.095671 -0.740485 0 \r\n-1.31807 -0.0478355 -0.686752 0 \r\n-1.37333 -0.0478355 -0.568267 0 \r\n-1.16422 -0.143506 -0.892967 0 \r\n-1.2373 -0.143506 -0.788594 0 \r\n-1.13449 -0.095671 -0.951949 0 \r\n-1.1788 -0.0478355 -0.905199 0 \r\n-1.25378 -0.0478355 -0.798108 0 \r\n-0.991469 -0.143506 -1.08157 0 \r\n-1.08157 -0.143506 -0.991469 0 \r\n-0.951949 -0.095671 -1.13449 0 \r\n-1.0037 -0.0478355 -1.09615 0 \r\n-1.09615 -0.0478355 -1.0037 0 \r\n-0.788594 -0.143506 -1.2373 0 \r\n-0.892967 -0.143506 -1.16422 0 \r\n-0.740485 -0.095671 -1.28256 0 \r\n-0.798108 -0.0478355 -1.25378 0 \r\n-0.905199 -0.0478355 -1.1788 0 \r\n-0.561759 -0.143506 -1.35544 0 \r\n-0.677237 -0.143506 -1.30159 0 \r\n-0.506522 -0.095671 -1.39165 0 \r\n-0.568267 -0.0478355 -1.37333 0 \r\n-0.686752 -0.0478355 -1.31807 0 \r\n-0.317854 -0.143506 -1.43239 0 \r\n-0.440929 -0.143506 -1.39942 0 \r\n-0.257168 -0.095671 -1.45847 0 \r\n-0.321158 -0.0478355 -1.45114 0 \r\n-0.447438 -0.0478355 -1.4173 0 \r\n-0.064292 -0.143506 -1.46583 0 \r\n-0.191224 -0.143506 -1.45473 0 \r\n1.76604e-008 -0.095671 -1.48097 0 \r\n-0.064292 -0.0478355 -1.48486 0 \r\n-0.194528 -0.0478355 -1.47346 0 \r\n0.191224 -0.143506 -1.45473 0 \r\n0.064292 -0.143506 -1.46583 0 \r\n0.257168 -0.095671 -1.45847 0 \r\n0.194528 -0.0478355 -1.47346 0 \r\n0.064292 -0.0478355 -1.48486 0 \r\n0.440929 -0.143506 -1.39942 0 \r\n0.317854 -0.143506 -1.43239 0 \r\n0.506521 -0.095671 -1.39165 0 \r\n0.447437 -0.0478355 -1.4173 0 \r\n0.321158 -0.0478355 -1.45114 0 \r\n0.677237 -0.143506 -1.30159 0 \r\n0.561758 -0.143506 -1.35544 0 \r\n0.740485 -0.095671 -1.28256 0 \r\n0.686751 -0.0478355 -1.31807 0 \r\n0.568267 -0.0478355 -1.37333 0 \r\n0.892967 -0.143506 -1.16422 0 \r\n0.788594 -0.143506 -1.2373 0 \r\n0.951949 -0.095671 -1.13449 0 \r\n0.905199 -0.0478355 -1.1788 0 \r\n0.798108 -0.0478355 -1.25378 0 \r\n1.08157 -0.143506 -0.991469 0 \r\n0.991469 -0.143506 -1.08157 0 \r\n1.13449 -0.095671 -0.951949 0 \r\n1.09615 -0.0478355 -1.0037 0 \r\n1.0037 -0.0478355 -1.09615 0 \r\n1.2373 -0.143506 -0.788594 0 \r\n1.16422 -0.143506 -0.892967 0 \r\n1.28256 -0.095671 -0.740485 0 \r\n1.25378 -0.0478355 -0.798108 0 \r\n1.1788 -0.0478355 -0.9052 0 \r\n1.35544 -0.143506 -0.561759 0 \r\n1.30159 -0.143506 -0.677237 0 \r\n1.39165 -0.095671 -0.506522 0 \r\n1.37333 -0.0478355 -0.568267 0 \r\n1.31807 -0.0478355 -0.686752 0 \r\n1.43239 -0.143506 -0.317854 0 \r\n1.39942 -0.143506 -0.440929 0 \r\n1.45847 -0.095671 -0.257169 0 \r\n1.45114 -0.0478355 -0.321159 0 \r\n1.4173 -0.0478355 -0.447438 0 \r\n1.46583 -0.143506 -0.064292 0 \r\n1.45473 -0.143506 -0.191224 0 \r\n1.48486 -0.0478355 -0.064292 0 \r\n1.47346 -0.0478355 -0.194529 0 \r\n3 1154 1152 1153 0 \r\n3 1153 1155 1156 1 \r\n3 1156 1157 1158 2 \r\n3 1158 1159 1154 3 \r\n3 1162 1160 1161 4 \r\n3 1161 1163 1164 5 \r\n3 1164 1165 1166 6 \r\n3 1166 1155 1162 7 \r\n3 1169 1167 1168 8 \r\n3 1168 1170 1171 9 \r\n3 1171 1172 1173 10 \r\n3 1173 1163 1169 11 \r\n3 1176 1174 1175 12 \r\n3 1175 1177 1178 13 \r\n3 1178 1179 1180 14 \r\n3 1180 1170 1176 15 \r\n3 1183 1181 1182 16 \r\n3 1182 1184 1185 17 \r\n3 1185 1186 1187 18 \r\n3 1187 1177 1183 19 \r\n3 1190 1188 1189 20 \r\n3 1189 1191 1192 21 \r\n3 1192 1193 1194 22 \r\n3 1194 1184 1190 23 \r\n3 1197 1195 1196 24 \r\n3 1196 1198 1199 25 \r\n3 1199 1200 1201 26 \r\n3 1201 1191 1197 27 \r\n3 1204 1202 1203 28 \r\n3 1203 1205 1206 29 \r\n3 1206 1207 1208 30 \r\n3 1208 1198 1204 31 \r\n3 1211 1209 1210 32 \r\n3 1210 1212 1213 33 \r\n3 1213 1214 1215 34 \r\n3 1215 1205 1211 35 \r\n3 1218 1216 1217 36 \r\n3 1217 1219 1220 37 \r\n3 1220 1221 1222 38 \r\n3 1222 1212 1218 39 \r\n3 1225 1223 1224 40 \r\n3 1224 1226 1227 41 \r\n3 1227 1228 1229 42 \r\n3 1229 1219 1225 43 \r\n3 1232 1230 1231 44 \r\n3 1231 1233 1234 45 \r\n3 1234 1235 1236 46 \r\n3 1236 1226 1232 47 \r\n3 1239 1237 1238 48 \r\n3 1238 1240 1241 49 \r\n3 1241 1242 1243 50 \r\n3 1243 1233 1239 51 \r\n3 1246 1244 1245 52 \r\n3 1245 1247 1248 53 \r\n3 1248 1249 1250 54 \r\n3 1250 1240 1246 55 \r\n3 1253 1251 1252 56 \r\n3 1252 1254 1255 57 \r\n3 1255 1256 1257 58 \r\n3 1257 1247 1253 59 \r\n3 1260 1258 1259 60 \r\n3 1259 1261 1262 61 \r\n3 1262 1263 1264 62 \r\n3 1264 1254 1260 63 \r\n3 1267 1265 1266 64 \r\n3 1266 1268 1269 65 \r\n3 1269 1270 1271 66 \r\n3 1271 1261 1267 67 \r\n3 1274 1272 1273 68 \r\n3 1273 1275 1276 69 \r\n3 1276 1277 1278 70 \r\n3 1278 1268 1274 71 \r\n3 1281 1279 1280 72 \r\n3 1280 1282 1283 73 \r\n3 1283 1284 1285 74 \r\n3 1285 1275 1281 75 \r\n3 1288 1286 1287 76 \r\n3 1287 1289 1290 77 \r\n3 1290 1291 1292 78 \r\n3 1292 1282 1288 79 \r\n3 1295 1293 1294 80 \r\n3 1294 1296 1297 81 \r\n3 1297 1298 1299 82 \r\n3 1299 1289 1295 83 \r\n3 1302 1300 1301 84 \r\n3 1301 1303 1304 85 \r\n3 1304 1305 1306 86 \r\n3 1306 1296 1302 87 \r\n3 1309 1307 1308 88 \r\n3 1308 1310 1311 89 \r\n3 1311 1312 1313 90 \r\n3 1313 1303 1309 91 \r\n3 1316 1314 1315 92 \r\n3 1315 1317 1318 93 \r\n3 1318 1319 1320 94 \r\n3 1320 1310 1316 95 \r\n3 1323 1321 1322 96 \r\n3 1322 1324 1325 97 \r\n3 1325 1326 1327 98 \r\n3 1327 1317 1323 99 \r\n3 1330 1328 1329 100 \r\n3 1329 1331 1332 101 \r\n3 1332 1333 1334 102 \r\n3 1334 1324 1330 103 \r\n3 1337 1335 1336 104 \r\n3 1336 1338 1339 105 \r\n3 1339 1340 1341 106 \r\n3 1341 1331 1337 107 \r\n3 1344 1342 1343 108 \r\n3 1343 1345 1346 109 \r\n3 1346 1347 1348 110 \r\n3 1348 1338 1344 111 \r\n3 1351 1349 1350 112 \r\n3 1350 1352 1353 113 \r\n3 1353 1354 1355 114 \r\n3 1355 1345 1351 115 \r\n3 1358 1356 1357 116 \r\n3 1357 1359 1360 117 \r\n3 1360 1361 1362 118 \r\n3 1362 1352 1358 119 \r\n3 1365 1363 1364 120 \r\n3 1364 1366 1367 121 \r\n3 1367 1368 1369 122 \r\n3 1369 1359 1365 123 \r\n3 1372 1370 1371 124 \r\n3 1371 1373 1374 125 \r\n3 1374 1375 1376 126 \r\n3 1376 1366 1372 127 \r\n3 1379 1377 1378 128 \r\n3 1378 1380 1381 129 \r\n3 1381 1382 1383 130 \r\n3 1383 1373 1379 131 \r\n3 1386 1384 1385 132 \r\n3 1385 1387 1388 133 \r\n3 1388 1389 1390 134 \r\n3 1390 1380 1386 135 \r\n3 1393 1391 1392 136 \r\n3 1392 1394 1395 137 \r\n3 1395 1396 1397 138 \r\n3 1397 1387 1393 139 \r\n3 1400 1398 1399 140 \r\n3 1399 1159 1401 141 \r\n3 1401 1402 1403 142 \r\n3 1403 1394 1400 143 \r\n3 1405 1157 1404 144 \r\n3 1404 1406 1407 145 \r\n3 1407 1408 1409 146 \r\n3 1409 1410 1405 147 \r\n3 1412 1165 1411 148 \r\n3 1411 1413 1414 149 \r\n3 1414 1415 1416 150 \r\n3 1416 1406 1412 151 \r\n3 1418 1172 1417 152 \r\n3 1417 1419 1420 153 \r\n3 1420 1421 1422 154 \r\n3 1422 1413 1418 155 \r\n3 1424 1179 1423 156 \r\n3 1423 1425 1426 157 \r\n3 1426 1427 1428 158 \r\n3 1428 1419 1424 159 \r\n3 1430 1186 1429 160 \r\n3 1429 1431 1432 161 \r\n3 1432 1433 1434 162 \r\n3 1434 1425 1430 163 \r\n3 1436 1193 1435 164 \r\n3 1435 1437 1438 165 \r\n3 1438 1439 1440 166 \r\n3 1440 1431 1436 167 \r\n3 1442 1200 1441 168 \r\n3 1441 1443 1444 169 \r\n3 1444 1445 1446 170 \r\n3 1446 1437 1442 171 \r\n3 1448 1207 1447 172 \r\n3 1447 1449 1450 173 \r\n3 1450 1451 1452 174 \r\n3 1452 1443 1448 175 \r\n3 1454 1214 1453 176 \r\n3 1453 1455 1456 177 \r\n3 1456 1457 1458 178 \r\n3 1458 1449 1454 179 \r\n3 1460 1221 1459 180 \r\n3 1459 1461 1462 181 \r\n3 1462 1463 1464 182 \r\n3 1464 1455 1460 183 \r\n3 1466 1228 1465 184 \r\n3 1465 1467 1468 185 \r\n3 1468 1469 1470 186 \r\n3 1470 1461 1466 187 \r\n3 1472 1235 1471 188 \r\n3 1471 1473 1474 189 \r\n3 1474 1475 1476 190 \r\n3 1476 1467 1472 191 \r\n3 1478 1242 1477 192 \r\n3 1477 1479 1480 193 \r\n3 1480 1481 1482 194 \r\n3 1482 1473 1478 195 \r\n3 1484 1249 1483 196 \r\n3 1483 1485 1486 197 \r\n3 1486 1487 1488 198 \r\n3 1488 1479 1484 199 \r\n3 1490 1256 1489 200 \r\n3 1489 1491 1492 201 \r\n3 1492 1493 1494 202 \r\n3 1494 1485 1490 203 \r\n3 1496 1263 1495 204 \r\n3 1495 1497 1498 205 \r\n3 1498 1499 1500 206 \r\n3 1500 1491 1496 207 \r\n3 1502 1270 1501 208 \r\n3 1501 1503 1504 209 \r\n3 1504 1505 1506 210 \r\n3 1506 1497 1502 211 \r\n3 1508 1277 1507 212 \r\n3 1507 1509 1510 213 \r\n3 1510 1511 1512 214 \r\n3 1512 1503 1508 215 \r\n3 1514 1284 1513 216 \r\n3 1513 1515 1516 217 \r\n3 1516 1517 1518 218 \r\n3 1518 1509 1514 219 \r\n3 1520 1291 1519 220 \r\n3 1519 1521 1522 221 \r\n3 1522 1523 1524 222 \r\n3 1524 1515 1520 223 \r\n3 1526 1298 1525 224 \r\n3 1525 1527 1528 225 \r\n3 1528 1529 1530 226 \r\n3 1530 1521 1526 227 \r\n3 1532 1305 1531 228 \r\n3 1531 1533 1534 229 \r\n3 1534 1535 1536 230 \r\n3 1536 1527 1532 231 \r\n3 1538 1312 1537 232 \r\n3 1537 1539 1540 233 \r\n3 1540 1541 1542 234 \r\n3 1542 1533 1538 235 \r\n3 1544 1319 1543 236 \r\n3 1543 1545 1546 237 \r\n3 1546 1547 1548 238 \r\n3 1548 1539 1544 239 \r\n3 1550 1326 1549 240 \r\n3 1549 1551 1552 241 \r\n3 1552 1553 1554 242 \r\n3 1554 1545 1550 243 \r\n3 1556 1333 1555 244 \r\n3 1555 1557 1558 245 \r\n3 1558 1559 1560 246 \r\n3 1560 1551 1556 247 \r\n3 1562 1340 1561 248 \r\n3 1561 1563 1564 249 \r\n3 1564 1565 1566 250 \r\n3 1566 1557 1562 251 \r\n3 1568 1347 1567 252 \r\n3 1567 1569 1570 253 \r\n3 1570 1571 1572 254 \r\n3 1572 1563 1568 255 \r\n3 1574 1354 1573 256 \r\n3 1573 1575 1576 257 \r\n3 1576 1577 1578 258 \r\n3 1578 1569 1574 259 \r\n3 1580 1361 1579 260 \r\n3 1579 1581 1582 261 \r\n3 1582 1583 1584 262 \r\n3 1584 1575 1580 263 \r\n3 1586 1368 1585 264 \r\n3 1585 1587 1588 265 \r\n3 1588 1589 1590 266 \r\n3 1590 1581 1586 267 \r\n3 1592 1375 1591 268 \r\n3 1591 1593 1594 269 \r\n3 1594 1595 1596 270 \r\n3 1596 1587 1592 271 \r\n3 1598 1382 1597 272 \r\n3 1597 1599 1600 273 \r\n3 1600 1601 1602 274 \r\n3 1602 1593 1598 275 \r\n3 1604 1389 1603 276 \r\n3 1603 1605 1606 277 \r\n3 1606 1607 1608 278 \r\n3 1608 1599 1604 279 \r\n3 1610 1396 1609 280 \r\n3 1609 1611 1612 281 \r\n3 1612 1613 1614 282 \r\n3 1614 1605 1610 283 \r\n3 1616 1402 1615 284 \r\n3 1615 1410 1617 285 \r\n3 1617 1618 1619 286 \r\n3 1619 1611 1616 287 \r\n3 1621 1408 1620 288 \r\n3 1620 1622 1623 289 \r\n3 1623 1624 1625 290 \r\n3 1625 1626 1621 291 \r\n3 1628 1415 1627 292 \r\n3 1627 1629 1630 293 \r\n3 1630 1631 1632 294 \r\n3 1632 1622 1628 295 \r\n3 1634 1421 1633 296 \r\n3 1633 1635 1636 297 \r\n3 1636 1637 1638 298 \r\n3 1638 1629 1634 299 \r\n3 1640 1427 1639 300 \r\n3 1639 1641 1642 301 \r\n3 1642 1643 1644 302 \r\n3 1644 1635 1640 303 \r\n3 1646 1433 1645 304 \r\n3 1645 1647 1648 305 \r\n3 1648 1649 1650 306 \r\n3 1650 1641 1646 307 \r\n3 1652 1439 1651 308 \r\n3 1651 1653 1654 309 \r\n3 1654 1655 1656 310 \r\n3 1656 1647 1652 311 \r\n3 1658 1445 1657 312 \r\n3 1657 1659 1660 313 \r\n3 1660 1661 1662 314 \r\n3 1662 1653 1658 315 \r\n3 1664 1451 1663 316 \r\n3 1663 1665 1666 317 \r\n3 1666 1667 1668 318 \r\n3 1668 1659 1664 319 \r\n3 1670 1457 1669 320 \r\n3 1669 1671 1672 321 \r\n3 1672 1673 1674 322 \r\n3 1674 1665 1670 323 \r\n3 1676 1463 1675 324 \r\n3 1675 1677 1678 325 \r\n3 1678 1679 1680 326 \r\n3 1680 1671 1676 327 \r\n3 1682 1469 1681 328 \r\n3 1681 1683 1684 329 \r\n3 1684 1685 1686 330 \r\n3 1686 1677 1682 331 \r\n3 1688 1475 1687 332 \r\n3 1687 1689 1690 333 \r\n3 1690 1691 1692 334 \r\n3 1692 1683 1688 335 \r\n3 1694 1481 1693 336 \r\n3 1693 1695 1696 337 \r\n3 1696 1697 1698 338 \r\n3 1698 1689 1694 339 \r\n3 1700 1487 1699 340 \r\n3 1699 1701 1702 341 \r\n3 1702 1703 1704 342 \r\n3 1704 1695 1700 343 \r\n3 1706 1493 1705 344 \r\n3 1705 1707 1708 345 \r\n3 1708 1709 1710 346 \r\n3 1710 1701 1706 347 \r\n3 1712 1499 1711 348 \r\n3 1711 1713 1714 349 \r\n3 1714 1715 1716 350 \r\n3 1716 1707 1712 351 \r\n3 1718 1505 1717 352 \r\n3 1717 1719 1720 353 \r\n3 1720 1721 1722 354 \r\n3 1722 1713 1718 355 \r\n3 1724 1511 1723 356 \r\n3 1723 1725 1726 357 \r\n3 1726 1727 1728 358 \r\n3 1728 1719 1724 359 \r\n3 1730 1517 1729 360 \r\n3 1729 1731 1732 361 \r\n3 1732 1733 1734 362 \r\n3 1734 1725 1730 363 \r\n3 1736 1523 1735 364 \r\n3 1735 1737 1738 365 \r\n3 1738 1739 1740 366 \r\n3 1740 1731 1736 367 \r\n3 1742 1529 1741 368 \r\n3 1741 1743 1744 369 \r\n3 1744 1745 1746 370 \r\n3 1746 1737 1742 371 \r\n3 1748 1535 1747 372 \r\n3 1747 1749 1750 373 \r\n3 1750 1751 1752 374 \r\n3 1752 1743 1748 375 \r\n3 1754 1541 1753 376 \r\n3 1753 1755 1756 377 \r\n3 1756 1757 1758 378 \r\n3 1758 1749 1754 379 \r\n3 1760 1547 1759 380 \r\n3 1759 1761 1762 381 \r\n3 1762 1763 1764 382 \r\n3 1764 1755 1760 383 \r\n3 1766 1553 1765 384 \r\n3 1765 1767 1768 385 \r\n3 1768 1769 1770 386 \r\n3 1770 1761 1766 387 \r\n3 1772 1559 1771 388 \r\n3 1771 1773 1774 389 \r\n3 1774 1775 1776 390 \r\n3 1776 1767 1772 391 \r\n3 1778 1565 1777 392 \r\n3 1777 1779 1780 393 \r\n3 1780 1781 1782 394 \r\n3 1782 1773 1778 395 \r\n3 1784 1571 1783 396 \r\n3 1783 1785 1786 397 \r\n3 1786 1787 1788 398 \r\n3 1788 1779 1784 399 \r\n3 1790 1577 1789 400 \r\n3 1789 1791 1792 401 \r\n3 1792 1793 1794 402 \r\n3 1794 1785 1790 403 \r\n3 1796 1583 1795 404 \r\n3 1795 1797 1798 405 \r\n3 1798 1799 1800 406 \r\n3 1800 1791 1796 407 \r\n3 1802 1589 1801 408 \r\n3 1801 1803 1804 409 \r\n3 1804 1805 1806 410 \r\n3 1806 1797 1802 411 \r\n3 1808 1595 1807 412 \r\n3 1807 1809 1810 413 \r\n3 1810 1811 1812 414 \r\n3 1812 1803 1808 415 \r\n3 1814 1601 1813 416 \r\n3 1813 1815 1816 417 \r\n3 1816 1817 1818 418 \r\n3 1818 1809 1814 419 \r\n3 1820 1607 1819 420 \r\n3 1819 1821 1822 421 \r\n3 1822 1823 1824 422 \r\n3 1824 1815 1820 423 \r\n3 1826 1613 1825 424 \r\n3 1825 1827 1828 425 \r\n3 1828 1829 1830 426 \r\n3 1830 1821 1826 427 \r\n3 1832 1618 1831 428 \r\n3 1831 1626 1833 429 \r\n3 1833 1834 1835 430 \r\n3 1835 1827 1832 431 \r\n3 1837 1624 1836 432 \r\n3 1836 1838 1839 433 \r\n3 1839 1840 1841 434 \r\n3 1841 1842 1837 435 \r\n3 1844 1631 1843 436 \r\n3 1843 1845 1846 437 \r\n3 1846 1847 1848 438 \r\n3 1848 1838 1844 439 \r\n3 1850 1637 1849 440 \r\n3 1849 1851 1852 441 \r\n3 1852 1853 1854 442 \r\n3 1854 1845 1850 443 \r\n3 1856 1643 1855 444 \r\n3 1855 1857 1858 445 \r\n3 1858 1859 1860 446 \r\n3 1860 1851 1856 447 \r\n3 1862 1649 1861 448 \r\n3 1861 1863 1864 449 \r\n3 1864 1865 1866 450 \r\n3 1866 1857 1862 451 \r\n3 1868 1655 1867 452 \r\n3 1867 1869 1870 453 \r\n3 1870 1871 1872 454 \r\n3 1872 1863 1868 455 \r\n3 1874 1661 1873 456 \r\n3 1873 1875 1876 457 \r\n3 1876 1877 1878 458 \r\n3 1878 1869 1874 459 \r\n3 1880 1667 1879 460 \r\n3 1879 1881 1882 461 \r\n3 1882 1883 1884 462 \r\n3 1884 1875 1880 463 \r\n3 1886 1673 1885 464 \r\n3 1885 1887 1888 465 \r\n3 1888 1889 1890 466 \r\n3 1890 1881 1886 467 \r\n3 1892 1679 1891 468 \r\n3 1891 1893 1894 469 \r\n3 1894 1895 1896 470 \r\n3 1896 1887 1892 471 \r\n3 1898 1685 1897 472 \r\n3 1897 1899 1900 473 \r\n3 1900 1901 1902 474 \r\n3 1902 1893 1898 475 \r\n3 1904 1691 1903 476 \r\n3 1903 1905 1906 477 \r\n3 1906 1907 1908 478 \r\n3 1908 1899 1904 479 \r\n3 1910 1697 1909 480 \r\n3 1909 1911 1912 481 \r\n3 1912 1913 1914 482 \r\n3 1914 1905 1910 483 \r\n3 1916 1703 1915 484 \r\n3 1915 1917 1918 485 \r\n3 1918 1919 1920 486 \r\n3 1920 1911 1916 487 \r\n3 1922 1709 1921 488 \r\n3 1921 1923 1924 489 \r\n3 1924 1925 1926 490 \r\n3 1926 1917 1922 491 \r\n3 1928 1715 1927 492 \r\n3 1927 1929 1930 493 \r\n3 1930 1931 1932 494 \r\n3 1932 1923 1928 495 \r\n3 1934 1721 1933 496 \r\n3 1933 1935 1936 497 \r\n3 1936 1937 1938 498 \r\n3 1938 1929 1934 499 \r\n3 1940 1727 1939 500 \r\n3 1939 1941 1942 501 \r\n3 1942 1943 1944 502 \r\n3 1944 1935 1940 503 \r\n3 1946 1733 1945 504 \r\n3 1945 1947 1948 505 \r\n3 1948 1949 1950 506 \r\n3 1950 1941 1946 507 \r\n3 1952 1739 1951 508 \r\n3 1951 1953 1954 509 \r\n3 1954 1955 1956 510 \r\n3 1956 1947 1952 511 \r\n3 1958 1745 1957 512 \r\n3 1957 1959 1960 513 \r\n3 1960 1961 1962 514 \r\n3 1962 1953 1958 515 \r\n3 1964 1751 1963 516 \r\n3 1963 1965 1966 517 \r\n3 1966 1967 1968 518 \r\n3 1968 1959 1964 519 \r\n3 1970 1757 1969 520 \r\n3 1969 1971 1972 521 \r\n3 1972 1973 1974 522 \r\n3 1974 1965 1970 523 \r\n3 1976 1763 1975 524 \r\n3 1975 1977 1978 525 \r\n3 1978 1979 1980 526 \r\n3 1980 1971 1976 527 \r\n3 1982 1769 1981 528 \r\n3 1981 1983 1984 529 \r\n3 1984 1985 1986 530 \r\n3 1986 1977 1982 531 \r\n3 1988 1775 1987 532 \r\n3 1987 1989 1990 533 \r\n3 1990 1991 1992 534 \r\n3 1992 1983 1988 535 \r\n3 1994 1781 1993 536 \r\n3 1993 1995 1996 537 \r\n3 1996 1997 1998 538 \r\n3 1998 1989 1994 539 \r\n3 2000 1787 1999 540 \r\n3 1999 2001 2002 541 \r\n3 2002 2003 2004 542 \r\n3 2004 1995 2000 543 \r\n3 2006 1793 2005 544 \r\n3 2005 2007 2008 545 \r\n3 2008 2009 2010 546 \r\n3 2010 2001 2006 547 \r\n3 2012 1799 2011 548 \r\n3 2011 2013 2014 549 \r\n3 2014 2015 2016 550 \r\n3 2016 2007 2012 551 \r\n3 2018 1805 2017 552 \r\n3 2017 2019 2020 553 \r\n3 2020 2021 2022 554 \r\n3 2022 2013 2018 555 \r\n3 2024 1811 2023 556 \r\n3 2023 2025 2026 557 \r\n3 2026 2027 2028 558 \r\n3 2028 2019 2024 559 \r\n3 2030 1817 2029 560 \r\n3 2029 2031 2032 561 \r\n3 2032 2033 2034 562 \r\n3 2034 2025 2030 563 \r\n3 2036 1823 2035 564 \r\n3 2035 2037 2038 565 \r\n3 2038 2039 2040 566 \r\n3 2040 2031 2036 567 \r\n3 2042 1829 2041 568 \r\n3 2041 2043 2044 569 \r\n3 2044 2045 2046 570 \r\n3 2046 2037 2042 571 \r\n3 2048 1834 2047 572 \r\n3 2047 1842 2049 573 \r\n3 2049 2050 2051 574 \r\n3 2051 2043 2048 575 \r\n3 2053 1840 2052 576 \r\n3 2052 2054 2055 577 \r\n3 2055 2056 2057 578 \r\n3 2057 2058 2053 579 \r\n3 2060 1847 2059 580 \r\n3 2059 2061 2062 581 \r\n3 2062 2063 2064 582 \r\n3 2064 2054 2060 583 \r\n3 2066 1853 2065 584 \r\n3 2065 2067 2068 585 \r\n3 2068 2069 2070 586 \r\n3 2070 2061 2066 587 \r\n3 2072 1859 2071 588 \r\n3 2071 2073 2074 589 \r\n3 2074 2075 2076 590 \r\n3 2076 2067 2072 591 \r\n3 2078 1865 2077 592 \r\n3 2077 2079 2080 593 \r\n3 2080 2081 2082 594 \r\n3 2082 2073 2078 595 \r\n3 2084 1871 2083 596 \r\n3 2083 2085 2086 597 \r\n3 2086 2087 2088 598 \r\n3 2088 2079 2084 599 \r\n3 2090 1877 2089 600 \r\n3 2089 2091 2092 601 \r\n3 2092 2093 2094 602 \r\n3 2094 2085 2090 603 \r\n3 2096 1883 2095 604 \r\n3 2095 2097 2098 605 \r\n3 2098 2099 2100 606 \r\n3 2100 2091 2096 607 \r\n3 2102 1889 2101 608 \r\n3 2101 2103 2104 609 \r\n3 2104 2105 2106 610 \r\n3 2106 2097 2102 611 \r\n3 2108 1895 2107 612 \r\n3 2107 2109 2110 613 \r\n3 2110 2111 2112 614 \r\n3 2112 2103 2108 615 \r\n3 2114 1901 2113 616 \r\n3 2113 2115 2116 617 \r\n3 2116 2117 2118 618 \r\n3 2118 2109 2114 619 \r\n3 2120 1907 2119 620 \r\n3 2119 2121 2122 621 \r\n3 2122 2123 2124 622 \r\n3 2124 2115 2120 623 \r\n3 2126 1913 2125 624 \r\n3 2125 2127 2128 625 \r\n3 2128 2129 2130 626 \r\n3 2130 2121 2126 627 \r\n3 2132 1919 2131 628 \r\n3 2131 2133 2134 629 \r\n3 2134 2135 2136 630 \r\n3 2136 2127 2132 631 \r\n3 2138 1925 2137 632 \r\n3 2137 2139 2140 633 \r\n3 2140 2141 2142 634 \r\n3 2142 2133 2138 635 \r\n3 2144 1931 2143 636 \r\n3 2143 2145 2146 637 \r\n3 2146 2147 2148 638 \r\n3 2148 2139 2144 639 \r\n3 2150 1937 2149 640 \r\n3 2149 2151 2152 641 \r\n3 2152 2153 2154 642 \r\n3 2154 2145 2150 643 \r\n3 2156 1943 2155 644 \r\n3 2155 2157 2158 645 \r\n3 2158 2159 2160 646 \r\n3 2160 2151 2156 647 \r\n3 2162 1949 2161 648 \r\n3 2161 2163 2164 649 \r\n3 2164 2165 2166 650 \r\n3 2166 2157 2162 651 \r\n3 2168 1955 2167 652 \r\n3 2167 2169 2170 653 \r\n3 2170 2171 2172 654 \r\n3 2172 2163 2168 655 \r\n3 2174 1961 2173 656 \r\n3 2173 2175 2176 657 \r\n3 2176 2177 2178 658 \r\n3 2178 2169 2174 659 \r\n3 2180 1967 2179 660 \r\n3 2179 2181 2182 661 \r\n3 2182 2183 2184 662 \r\n3 2184 2175 2180 663 \r\n3 2186 1973 2185 664 \r\n3 2185 2187 2188 665 \r\n3 2188 2189 2190 666 \r\n3 2190 2181 2186 667 \r\n3 2192 1979 2191 668 \r\n3 2191 2193 2194 669 \r\n3 2194 2195 2196 670 \r\n3 2196 2187 2192 671 \r\n3 2198 1985 2197 672 \r\n3 2197 2199 2200 673 \r\n3 2200 2201 2202 674 \r\n3 2202 2193 2198 675 \r\n3 2204 1991 2203 676 \r\n3 2203 2205 2206 677 \r\n3 2206 2207 2208 678 \r\n3 2208 2199 2204 679 \r\n3 2210 1997 2209 680 \r\n3 2209 2211 2212 681 \r\n3 2212 2213 2214 682 \r\n3 2214 2205 2210 683 \r\n3 2216 2003 2215 684 \r\n3 2215 2217 2218 685 \r\n3 2218 2219 2220 686 \r\n3 2220 2211 2216 687 \r\n3 2222 2009 2221 688 \r\n3 2221 2223 2224 689 \r\n3 2224 2225 2226 690 \r\n3 2226 2217 2222 691 \r\n3 2228 2015 2227 692 \r\n3 2227 2229 2230 693 \r\n3 2230 2231 2232 694 \r\n3 2232 2223 2228 695 \r\n3 2234 2021 2233 696 \r\n3 2233 2235 2236 697 \r\n3 2236 2237 2238 698 \r\n3 2238 2229 2234 699 \r\n3 2240 2027 2239 700 \r\n3 2239 2241 2242 701 \r\n3 2242 2243 2244 702 \r\n3 2244 2235 2240 703 \r\n3 2246 2033 2245 704 \r\n3 2245 2247 2248 705 \r\n3 2248 2249 2250 706 \r\n3 2250 2241 2246 707 \r\n3 2252 2039 2251 708 \r\n3 2251 2253 2254 709 \r\n3 2254 2255 2256 710 \r\n3 2256 2247 2252 711 \r\n3 2258 2045 2257 712 \r\n3 2257 2259 2260 713 \r\n3 2260 2261 2262 714 \r\n3 2262 2253 2258 715 \r\n3 2264 2050 2263 716 \r\n3 2263 2058 2265 717 \r\n3 2265 2266 2267 718 \r\n3 2267 2259 2264 719 \r\n3 2269 2056 2268 720 \r\n3 2268 2270 2271 721 \r\n3 2271 2272 2273 722 \r\n3 2273 2274 2269 723 \r\n3 2276 2063 2275 724 \r\n3 2275 2277 2278 725 \r\n3 2278 2279 2280 726 \r\n3 2280 2270 2276 727 \r\n3 2282 2069 2281 728 \r\n3 2281 2283 2284 729 \r\n3 2284 2285 2286 730 \r\n3 2286 2277 2282 731 \r\n3 2288 2075 2287 732 \r\n3 2287 2289 2290 733 \r\n3 2290 2291 2292 734 \r\n3 2292 2283 2288 735 \r\n3 2294 2081 2293 736 \r\n3 2293 2295 2296 737 \r\n3 2296 2297 2298 738 \r\n3 2298 2289 2294 739 \r\n3 2300 2087 2299 740 \r\n3 2299 2301 2302 741 \r\n3 2302 2303 2304 742 \r\n3 2304 2295 2300 743 \r\n3 2306 2093 2305 744 \r\n3 2305 2307 2308 745 \r\n3 2308 2309 2310 746 \r\n3 2310 2301 2306 747 \r\n3 2312 2099 2311 748 \r\n3 2311 2313 2314 749 \r\n3 2314 2315 2316 750 \r\n3 2316 2307 2312 751 \r\n3 2318 2105 2317 752 \r\n3 2317 2319 2320 753 \r\n3 2320 2321 2322 754 \r\n3 2322 2313 2318 755 \r\n3 2324 2111 2323 756 \r\n3 2323 2325 2326 757 \r\n3 2326 2327 2328 758 \r\n3 2328 2319 2324 759 \r\n3 2330 2117 2329 760 \r\n3 2329 2331 2332 761 \r\n3 2332 2333 2334 762 \r\n3 2334 2325 2330 763 \r\n3 2336 2123 2335 764 \r\n3 2335 2337 2338 765 \r\n3 2338 2339 2340 766 \r\n3 2340 2331 2336 767 \r\n3 2342 2129 2341 768 \r\n3 2341 2343 2344 769 \r\n3 2344 2345 2346 770 \r\n3 2346 2337 2342 771 \r\n3 2348 2135 2347 772 \r\n3 2347 2349 2350 773 \r\n3 2350 2351 2352 774 \r\n3 2352 2343 2348 775 \r\n3 2354 2141 2353 776 \r\n3 2353 2355 2356 777 \r\n3 2356 2357 2358 778 \r\n3 2358 2349 2354 779 \r\n3 2360 2147 2359 780 \r\n3 2359 2361 2362 781 \r\n3 2362 2363 2364 782 \r\n3 2364 2355 2360 783 \r\n3 2366 2153 2365 784 \r\n3 2365 2367 2368 785 \r\n3 2368 2369 2370 786 \r\n3 2370 2361 2366 787 \r\n3 2372 2159 2371 788 \r\n3 2371 2373 2374 789 \r\n3 2374 2375 2376 790 \r\n3 2376 2367 2372 791 \r\n3 2378 2165 2377 792 \r\n3 2377 2379 2380 793 \r\n3 2380 2381 2382 794 \r\n3 2382 2373 2378 795 \r\n3 2384 2171 2383 796 \r\n3 2383 2385 2386 797 \r\n3 2386 2387 2388 798 \r\n3 2388 2379 2384 799 \r\n3 2390 2177 2389 800 \r\n3 2389 2391 2392 801 \r\n3 2392 2393 2394 802 \r\n3 2394 2385 2390 803 \r\n3 2396 2183 2395 804 \r\n3 2395 2397 2398 805 \r\n3 2398 2399 2400 806 \r\n3 2400 2391 2396 807 \r\n3 2402 2189 2401 808 \r\n3 2401 2403 2404 809 \r\n3 2404 2405 2406 810 \r\n3 2406 2397 2402 811 \r\n3 2408 2195 2407 812 \r\n3 2407 2409 2410 813 \r\n3 2410 2411 2412 814 \r\n3 2412 2403 2408 815 \r\n3 2414 2201 2413 816 \r\n3 2413 2415 2416 817 \r\n3 2416 2417 2418 818 \r\n3 2418 2409 2414 819 \r\n3 2420 2207 2419 820 \r\n3 2419 2421 2422 821 \r\n3 2422 2423 2424 822 \r\n3 2424 2415 2420 823 \r\n3 2426 2213 2425 824 \r\n3 2425 2427 2428 825 \r\n3 2428 2429 2430 826 \r\n3 2430 2421 2426 827 \r\n3 2432 2219 2431 828 \r\n3 2431 2433 2434 829 \r\n3 2434 2435 2436 830 \r\n3 2436 2427 2432 831 \r\n3 2438 2225 2437 832 \r\n3 2437 2439 2440 833 \r\n3 2440 2441 2442 834 \r\n3 2442 2433 2438 835 \r\n3 2444 2231 2443 836 \r\n3 2443 2445 2446 837 \r\n3 2446 2447 2448 838 \r\n3 2448 2439 2444 839 \r\n3 2450 2237 2449 840 \r\n3 2449 2451 2452 841 \r\n3 2452 2453 2454 842 \r\n3 2454 2445 2450 843 \r\n3 2456 2243 2455 844 \r\n3 2455 2457 2458 845 \r\n3 2458 2459 2460 846 \r\n3 2460 2451 2456 847 \r\n3 2462 2249 2461 848 \r\n3 2461 2463 2464 849 \r\n3 2464 2465 2466 850 \r\n3 2466 2457 2462 851 \r\n3 2468 2255 2467 852 \r\n3 2467 2469 2470 853 \r\n3 2470 2471 2472 854 \r\n3 2472 2463 2468 855 \r\n3 2474 2261 2473 856 \r\n3 2473 2475 2476 857 \r\n3 2476 2477 2478 858 \r\n3 2478 2469 2474 859 \r\n3 2480 2266 2479 860 \r\n3 2479 2274 2481 861 \r\n3 2481 2482 2483 862 \r\n3 2483 2475 2480 863 \r\n3 2485 2272 2484 864 \r\n3 2484 2486 2487 865 \r\n3 2487 2488 2489 866 \r\n3 2489 2490 2485 867 \r\n3 2492 2279 2491 868 \r\n3 2491 2493 2494 869 \r\n3 2494 2495 2496 870 \r\n3 2496 2486 2492 871 \r\n3 2498 2285 2497 872 \r\n3 2497 2499 2500 873 \r\n3 2500 2501 2502 874 \r\n3 2502 2493 2498 875 \r\n3 2504 2291 2503 876 \r\n3 2503 2505 2506 877 \r\n3 2506 2507 2508 878 \r\n3 2508 2499 2504 879 \r\n3 2510 2297 2509 880 \r\n3 2509 2511 2512 881 \r\n3 2512 2513 2514 882 \r\n3 2514 2505 2510 883 \r\n3 2516 2303 2515 884 \r\n3 2515 2517 2518 885 \r\n3 2518 2519 2520 886 \r\n3 2520 2511 2516 887 \r\n3 2522 2309 2521 888 \r\n3 2521 2523 2524 889 \r\n3 2524 2525 2526 890 \r\n3 2526 2517 2522 891 \r\n3 2528 2315 2527 892 \r\n3 2527 2529 2530 893 \r\n3 2530 2531 2532 894 \r\n3 2532 2523 2528 895 \r\n3 2534 2321 2533 896 \r\n3 2533 2535 2536 897 \r\n3 2536 2537 2538 898 \r\n3 2538 2529 2534 899 \r\n3 2540 2327 2539 900 \r\n3 2539 2541 2542 901 \r\n3 2542 2543 2544 902 \r\n3 2544 2535 2540 903 \r\n3 2546 2333 2545 904 \r\n3 2545 2547 2548 905 \r\n3 2548 2549 2550 906 \r\n3 2550 2541 2546 907 \r\n3 2552 2339 2551 908 \r\n3 2551 2553 2554 909 \r\n3 2554 2555 2556 910 \r\n3 2556 2547 2552 911 \r\n3 2558 2345 2557 912 \r\n3 2557 2559 2560 913 \r\n3 2560 2561 2562 914 \r\n3 2562 2553 2558 915 \r\n3 2564 2351 2563 916 \r\n3 2563 2565 2566 917 \r\n3 2566 2567 2568 918 \r\n3 2568 2559 2564 919 \r\n3 2570 2357 2569 920 \r\n3 2569 2571 2572 921 \r\n3 2572 2573 2574 922 \r\n3 2574 2565 2570 923 \r\n3 2576 2363 2575 924 \r\n3 2575 2577 2578 925 \r\n3 2578 2579 2580 926 \r\n3 2580 2571 2576 927 \r\n3 2582 2369 2581 928 \r\n3 2581 2583 2584 929 \r\n3 2584 2585 2586 930 \r\n3 2586 2577 2582 931 \r\n3 2588 2375 2587 932 \r\n3 2587 2589 2590 933 \r\n3 2590 2591 2592 934 \r\n3 2592 2583 2588 935 \r\n3 2594 2381 2593 936 \r\n3 2593 2595 2596 937 \r\n3 2596 2597 2598 938 \r\n3 2598 2589 2594 939 \r\n3 2600 2387 2599 940 \r\n3 2599 2601 2602 941 \r\n3 2602 2603 2604 942 \r\n3 2604 2595 2600 943 \r\n3 2606 2393 2605 944 \r\n3 2605 2607 2608 945 \r\n3 2608 2609 2610 946 \r\n3 2610 2601 2606 947 \r\n3 2612 2399 2611 948 \r\n3 2611 2613 2614 949 \r\n3 2614 2615 2616 950 \r\n3 2616 2607 2612 951 \r\n3 2618 2405 2617 952 \r\n3 2617 2619 2620 953 \r\n3 2620 2621 2622 954 \r\n3 2622 2613 2618 955 \r\n3 2624 2411 2623 956 \r\n3 2623 2625 2626 957 \r\n3 2626 2627 2628 958 \r\n3 2628 2619 2624 959 \r\n3 2630 2417 2629 960 \r\n3 2629 2631 2632 961 \r\n3 2632 2633 2634 962 \r\n3 2634 2625 2630 963 \r\n3 2636 2423 2635 964 \r\n3 2635 2637 2638 965 \r\n3 2638 2639 2640 966 \r\n3 2640 2631 2636 967 \r\n3 2642 2429 2641 968 \r\n3 2641 2643 2644 969 \r\n3 2644 2645 2646 970 \r\n3 2646 2637 2642 971 \r\n3 2648 2435 2647 972 \r\n3 2647 2649 2650 973 \r\n3 2650 2651 2652 974 \r\n3 2652 2643 2648 975 \r\n3 2654 2441 2653 976 \r\n3 2653 2655 2656 977 \r\n3 2656 2657 2658 978 \r\n3 2658 2649 2654 979 \r\n3 2660 2447 2659 980 \r\n3 2659 2661 2662 981 \r\n3 2662 2663 2664 982 \r\n3 2664 2655 2660 983 \r\n3 2666 2453 2665 984 \r\n3 2665 2667 2668 985 \r\n3 2668 2669 2670 986 \r\n3 2670 2661 2666 987 \r\n3 2672 2459 2671 988 \r\n3 2671 2673 2674 989 \r\n3 2674 2675 2676 990 \r\n3 2676 2667 2672 991 \r\n3 2678 2465 2677 992 \r\n3 2677 2679 2680 993 \r\n3 2680 2681 2682 994 \r\n3 2682 2673 2678 995 \r\n3 2684 2471 2683 996 \r\n3 2683 2685 2686 997 \r\n3 2686 2687 2688 998 \r\n3 2688 2679 2684 999 \r\n3 2690 2477 2689 1000 \r\n3 2689 2691 2692 1001 \r\n3 2692 2693 2694 1002 \r\n3 2694 2685 2690 1003 \r\n3 2696 2482 2695 1004 \r\n3 2695 2490 2697 1005 \r\n3 2697 2698 2699 1006 \r\n3 2699 2691 2696 1007 \r\n3 2701 2488 2700 1008 \r\n3 2700 2702 2703 1009 \r\n3 2703 2704 2705 1010 \r\n3 2705 2706 2701 1011 \r\n3 2708 2495 2707 1012 \r\n3 2707 2709 2710 1013 \r\n3 2710 2711 2712 1014 \r\n3 2712 2702 2708 1015 \r\n3 2714 2501 2713 1016 \r\n3 2713 2715 2716 1017 \r\n3 2716 2717 2718 1018 \r\n3 2718 2709 2714 1019 \r\n3 2720 2507 2719 1020 \r\n3 2719 2721 2722 1021 \r\n3 2722 2723 2724 1022 \r\n3 2724 2715 2720 1023 \r\n3 2726 2513 2725 1024 \r\n3 2725 2727 2728 1025 \r\n3 2728 2729 2730 1026 \r\n3 2730 2721 2726 1027 \r\n3 2732 2519 2731 1028 \r\n3 2731 2733 2734 1029 \r\n3 2734 2735 2736 1030 \r\n3 2736 2727 2732 1031 \r\n3 2738 2525 2737 1032 \r\n3 2737 2739 2740 1033 \r\n3 2740 2741 2742 1034 \r\n3 2742 2733 2738 1035 \r\n3 2744 2531 2743 1036 \r\n3 2743 2745 2746 1037 \r\n3 2746 2747 2748 1038 \r\n3 2748 2739 2744 1039 \r\n3 2750 2537 2749 1040 \r\n3 2749 2751 2752 1041 \r\n3 2752 2753 2754 1042 \r\n3 2754 2745 2750 1043 \r\n3 2756 2543 2755 1044 \r\n3 2755 2757 2758 1045 \r\n3 2758 2759 2760 1046 \r\n3 2760 2751 2756 1047 \r\n3 2762 2549 2761 1048 \r\n3 2761 2763 2764 1049 \r\n3 2764 2765 2766 1050 \r\n3 2766 2757 2762 1051 \r\n3 2768 2555 2767 1052 \r\n3 2767 2769 2770 1053 \r\n3 2770 2771 2772 1054 \r\n3 2772 2763 2768 1055 \r\n3 2774 2561 2773 1056 \r\n3 2773 2775 2776 1057 \r\n3 2776 2777 2778 1058 \r\n3 2778 2769 2774 1059 \r\n3 2780 2567 2779 1060 \r\n3 2779 2781 2782 1061 \r\n3 2782 2783 2784 1062 \r\n3 2784 2775 2780 1063 \r\n3 2786 2573 2785 1064 \r\n3 2785 2787 2788 1065 \r\n3 2788 2789 2790 1066 \r\n3 2790 2781 2786 1067 \r\n3 2792 2579 2791 1068 \r\n3 2791 2793 2794 1069 \r\n3 2794 2795 2796 1070 \r\n3 2796 2787 2792 1071 \r\n3 2798 2585 2797 1072 \r\n3 2797 2799 2800 1073 \r\n3 2800 2801 2802 1074 \r\n3 2802 2793 2798 1075 \r\n3 2804 2591 2803 1076 \r\n3 2803 2805 2806 1077 \r\n3 2806 2807 2808 1078 \r\n3 2808 2799 2804 1079 \r\n3 2810 2597 2809 1080 \r\n3 2809 2811 2812 1081 \r\n3 2812 2813 2814 1082 \r\n3 2814 2805 2810 1083 \r\n3 2816 2603 2815 1084 \r\n3 2815 2817 2818 1085 \r\n3 2818 2819 2820 1086 \r\n3 2820 2811 2816 1087 \r\n3 2822 2609 2821 1088 \r\n3 2821 2823 2824 1089 \r\n3 2824 2825 2826 1090 \r\n3 2826 2817 2822 1091 \r\n3 2828 2615 2827 1092 \r\n3 2827 2829 2830 1093 \r\n3 2830 2831 2832 1094 \r\n3 2832 2823 2828 1095 \r\n3 2834 2621 2833 1096 \r\n3 2833 2835 2836 1097 \r\n3 2836 2837 2838 1098 \r\n3 2838 2829 2834 1099 \r\n3 2840 2627 2839 1100 \r\n3 2839 2841 2842 1101 \r\n3 2842 2843 2844 1102 \r\n3 2844 2835 2840 1103 \r\n3 2846 2633 2845 1104 \r\n3 2845 2847 2848 1105 \r\n3 2848 2849 2850 1106 \r\n3 2850 2841 2846 1107 \r\n3 2852 2639 2851 1108 \r\n3 2851 2853 2854 1109 \r\n3 2854 2855 2856 1110 \r\n3 2856 2847 2852 1111 \r\n3 2858 2645 2857 1112 \r\n3 2857 2859 2860 1113 \r\n3 2860 2861 2862 1114 \r\n3 2862 2853 2858 1115 \r\n3 2864 2651 2863 1116 \r\n3 2863 2865 2866 1117 \r\n3 2866 2867 2868 1118 \r\n3 2868 2859 2864 1119 \r\n3 2870 2657 2869 1120 \r\n3 2869 2871 2872 1121 \r\n3 2872 2873 2874 1122 \r\n3 2874 2865 2870 1123 \r\n3 2876 2663 2875 1124 \r\n3 2875 2877 2878 1125 \r\n3 2878 2879 2880 1126 \r\n3 2880 2871 2876 1127 \r\n3 2882 2669 2881 1128 \r\n3 2881 2883 2884 1129 \r\n3 2884 2885 2886 1130 \r\n3 2886 2877 2882 1131 \r\n3 2888 2675 2887 1132 \r\n3 2887 2889 2890 1133 \r\n3 2890 2891 2892 1134 \r\n3 2892 2883 2888 1135 \r\n3 2894 2681 2893 1136 \r\n3 2893 2895 2896 1137 \r\n3 2896 2897 2898 1138 \r\n3 2898 2889 2894 1139 \r\n3 2900 2687 2899 1140 \r\n3 2899 2901 2902 1141 \r\n3 2902 2903 2904 1142 \r\n3 2904 2895 2900 1143 \r\n3 2906 2693 2905 1144 \r\n3 2905 2907 2908 1145 \r\n3 2908 2909 2910 1146 \r\n3 2910 2901 2906 1147 \r\n3 2912 2698 2911 1148 \r\n3 2911 2706 2913 1149 \r\n3 2913 2914 2915 1150 \r\n3 2915 2907 2912 1151 \r\n3 2917 2704 2916 1152 \r\n3 2916 2918 2919 1153 \r\n3 2919 2920 2921 1154 \r\n3 2921 2922 2917 1155 \r\n3 2924 2711 2923 1156 \r\n3 2923 2925 2926 1157 \r\n3 2926 2927 2928 1158 \r\n3 2928 2918 2924 1159 \r\n3 2930 2717 2929 1160 \r\n3 2929 2931 2932 1161 \r\n3 2932 2933 2934 1162 \r\n3 2934 2925 2930 1163 \r\n3 2936 2723 2935 1164 \r\n3 2935 2937 2938 1165 \r\n3 2938 2939 2940 1166 \r\n3 2940 2931 2936 1167 \r\n3 2942 2729 2941 1168 \r\n3 2941 2943 2944 1169 \r\n3 2944 2945 2946 1170 \r\n3 2946 2937 2942 1171 \r\n3 2948 2735 2947 1172 \r\n3 2947 2949 2950 1173 \r\n3 2950 2951 2952 1174 \r\n3 2952 2943 2948 1175 \r\n3 2954 2741 2953 1176 \r\n3 2953 2955 2956 1177 \r\n3 2956 2957 2958 1178 \r\n3 2958 2949 2954 1179 \r\n3 2960 2747 2959 1180 \r\n3 2959 2961 2962 1181 \r\n3 2962 2963 2964 1182 \r\n3 2964 2955 2960 1183 \r\n3 2966 2753 2965 1184 \r\n3 2965 2967 2968 1185 \r\n3 2968 2969 2970 1186 \r\n3 2970 2961 2966 1187 \r\n3 2972 2759 2971 1188 \r\n3 2971 2973 2974 1189 \r\n3 2974 2975 2976 1190 \r\n3 2976 2967 2972 1191 \r\n3 2978 2765 2977 1192 \r\n3 2977 2979 2980 1193 \r\n3 2980 2981 2982 1194 \r\n3 2982 2973 2978 1195 \r\n3 2984 2771 2983 1196 \r\n3 2983 2985 2986 1197 \r\n3 2986 2987 2988 1198 \r\n3 2988 2979 2984 1199 \r\n3 2990 2777 2989 1200 \r\n3 2989 2991 2992 1201 \r\n3 2992 2993 2994 1202 \r\n3 2994 2985 2990 1203 \r\n3 2996 2783 2995 1204 \r\n3 2995 2997 2998 1205 \r\n3 2998 2999 3000 1206 \r\n3 3000 2991 2996 1207 \r\n3 3002 2789 3001 1208 \r\n3 3001 3003 3004 1209 \r\n3 3004 3005 3006 1210 \r\n3 3006 2997 3002 1211 \r\n3 3008 2795 3007 1212 \r\n3 3007 3009 3010 1213 \r\n3 3010 3011 3012 1214 \r\n3 3012 3003 3008 1215 \r\n3 3014 2801 3013 1216 \r\n3 3013 3015 3016 1217 \r\n3 3016 3017 3018 1218 \r\n3 3018 3009 3014 1219 \r\n3 3020 2807 3019 1220 \r\n3 3019 3021 3022 1221 \r\n3 3022 3023 3024 1222 \r\n3 3024 3015 3020 1223 \r\n3 3026 2813 3025 1224 \r\n3 3025 3027 3028 1225 \r\n3 3028 3029 3030 1226 \r\n3 3030 3021 3026 1227 \r\n3 3032 2819 3031 1228 \r\n3 3031 3033 3034 1229 \r\n3 3034 3035 3036 1230 \r\n3 3036 3027 3032 1231 \r\n3 3038 2825 3037 1232 \r\n3 3037 3039 3040 1233 \r\n3 3040 3041 3042 1234 \r\n3 3042 3033 3038 1235 \r\n3 3044 2831 3043 1236 \r\n3 3043 3045 3046 1237 \r\n3 3046 3047 3048 1238 \r\n3 3048 3039 3044 1239 \r\n3 3050 2837 3049 1240 \r\n3 3049 3051 3052 1241 \r\n3 3052 3053 3054 1242 \r\n3 3054 3045 3050 1243 \r\n3 3056 2843 3055 1244 \r\n3 3055 3057 3058 1245 \r\n3 3058 3059 3060 1246 \r\n3 3060 3051 3056 1247 \r\n3 3062 2849 3061 1248 \r\n3 3061 3063 3064 1249 \r\n3 3064 3065 3066 1250 \r\n3 3066 3057 3062 1251 \r\n3 3068 2855 3067 1252 \r\n3 3067 3069 3070 1253 \r\n3 3070 3071 3072 1254 \r\n3 3072 3063 3068 1255 \r\n3 3074 2861 3073 1256 \r\n3 3073 3075 3076 1257 \r\n3 3076 3077 3078 1258 \r\n3 3078 3069 3074 1259 \r\n3 3080 2867 3079 1260 \r\n3 3079 3081 3082 1261 \r\n3 3082 3083 3084 1262 \r\n3 3084 3075 3080 1263 \r\n3 3086 2873 3085 1264 \r\n3 3085 3087 3088 1265 \r\n3 3088 3089 3090 1266 \r\n3 3090 3081 3086 1267 \r\n3 3092 2879 3091 1268 \r\n3 3091 3093 3094 1269 \r\n3 3094 3095 3096 1270 \r\n3 3096 3087 3092 1271 \r\n3 3098 2885 3097 1272 \r\n3 3097 3099 3100 1273 \r\n3 3100 3101 3102 1274 \r\n3 3102 3093 3098 1275 \r\n3 3104 2891 3103 1276 \r\n3 3103 3105 3106 1277 \r\n3 3106 3107 3108 1278 \r\n3 3108 3099 3104 1279 \r\n3 3110 2897 3109 1280 \r\n3 3109 3111 3112 1281 \r\n3 3112 3113 3114 1282 \r\n3 3114 3105 3110 1283 \r\n3 3116 2903 3115 1284 \r\n3 3115 3117 3118 1285 \r\n3 3118 3119 3120 1286 \r\n3 3120 3111 3116 1287 \r\n3 3122 2909 3121 1288 \r\n3 3121 3123 3124 1289 \r\n3 3124 3125 3126 1290 \r\n3 3126 3117 3122 1291 \r\n3 3128 2914 3127 1292 \r\n3 3127 2922 3129 1293 \r\n3 3129 3130 3131 1294 \r\n3 3131 3123 3128 1295 \r\n3 3133 2920 3132 1296 \r\n3 3132 3134 3135 1297 \r\n3 3135 3136 3137 1298 \r\n3 3137 3138 3133 1299 \r\n3 3140 2927 3139 1300 \r\n3 3139 3141 3142 1301 \r\n3 3142 3143 3144 1302 \r\n3 3144 3134 3140 1303 \r\n3 3146 2933 3145 1304 \r\n3 3145 3147 3148 1305 \r\n3 3148 3149 3150 1306 \r\n3 3150 3141 3146 1307 \r\n3 3152 2939 3151 1308 \r\n3 3151 3153 3154 1309 \r\n3 3154 3155 3156 1310 \r\n3 3156 3147 3152 1311 \r\n3 3158 2945 3157 1312 \r\n3 3157 3159 3160 1313 \r\n3 3160 3161 3162 1314 \r\n3 3162 3153 3158 1315 \r\n3 3164 2951 3163 1316 \r\n3 3163 3165 3166 1317 \r\n3 3166 3167 3168 1318 \r\n3 3168 3159 3164 1319 \r\n3 3170 2957 3169 1320 \r\n3 3169 3171 3172 1321 \r\n3 3172 3173 3174 1322 \r\n3 3174 3165 3170 1323 \r\n3 3176 2963 3175 1324 \r\n3 3175 3177 3178 1325 \r\n3 3178 3179 3180 1326 \r\n3 3180 3171 3176 1327 \r\n3 3182 2969 3181 1328 \r\n3 3181 3183 3184 1329 \r\n3 3184 3185 3186 1330 \r\n3 3186 3177 3182 1331 \r\n3 3188 2975 3187 1332 \r\n3 3187 3189 3190 1333 \r\n3 3190 3191 3192 1334 \r\n3 3192 3183 3188 1335 \r\n3 3194 2981 3193 1336 \r\n3 3193 3195 3196 1337 \r\n3 3196 3197 3198 1338 \r\n3 3198 3189 3194 1339 \r\n3 3200 2987 3199 1340 \r\n3 3199 3201 3202 1341 \r\n3 3202 3203 3204 1342 \r\n3 3204 3195 3200 1343 \r\n3 3206 2993 3205 1344 \r\n3 3205 3207 3208 1345 \r\n3 3208 3209 3210 1346 \r\n3 3210 3201 3206 1347 \r\n3 3212 2999 3211 1348 \r\n3 3211 3213 3214 1349 \r\n3 3214 3215 3216 1350 \r\n3 3216 3207 3212 1351 \r\n3 3218 3005 3217 1352 \r\n3 3217 3219 3220 1353 \r\n3 3220 3221 3222 1354 \r\n3 3222 3213 3218 1355 \r\n3 3224 3011 3223 1356 \r\n3 3223 3225 3226 1357 \r\n3 3226 3227 3228 1358 \r\n3 3228 3219 3224 1359 \r\n3 3230 3017 3229 1360 \r\n3 3229 3231 3232 1361 \r\n3 3232 3233 3234 1362 \r\n3 3234 3225 3230 1363 \r\n3 3236 3023 3235 1364 \r\n3 3235 3237 3238 1365 \r\n3 3238 3239 3240 1366 \r\n3 3240 3231 3236 1367 \r\n3 3242 3029 3241 1368 \r\n3 3241 3243 3244 1369 \r\n3 3244 3245 3246 1370 \r\n3 3246 3237 3242 1371 \r\n3 3248 3035 3247 1372 \r\n3 3247 3249 3250 1373 \r\n3 3250 3251 3252 1374 \r\n3 3252 3243 3248 1375 \r\n3 3254 3041 3253 1376 \r\n3 3253 3255 3256 1377 \r\n3 3256 3257 3258 1378 \r\n3 3258 3249 3254 1379 \r\n3 3260 3047 3259 1380 \r\n3 3259 3261 3262 1381 \r\n3 3262 3263 3264 1382 \r\n3 3264 3255 3260 1383 \r\n3 3266 3053 3265 1384 \r\n3 3265 3267 3268 1385 \r\n3 3268 3269 3270 1386 \r\n3 3270 3261 3266 1387 \r\n3 3272 3059 3271 1388 \r\n3 3271 3273 3274 1389 \r\n3 3274 3275 3276 1390 \r\n3 3276 3267 3272 1391 \r\n3 3278 3065 3277 1392 \r\n3 3277 3279 3280 1393 \r\n3 3280 3281 3282 1394 \r\n3 3282 3273 3278 1395 \r\n3 3284 3071 3283 1396 \r\n3 3283 3285 3286 1397 \r\n3 3286 3287 3288 1398 \r\n3 3288 3279 3284 1399 \r\n3 3290 3077 3289 1400 \r\n3 3289 3291 3292 1401 \r\n3 3292 3293 3294 1402 \r\n3 3294 3285 3290 1403 \r\n3 3296 3083 3295 1404 \r\n3 3295 3297 3298 1405 \r\n3 3298 3299 3300 1406 \r\n3 3300 3291 3296 1407 \r\n3 3302 3089 3301 1408 \r\n3 3301 3303 3304 1409 \r\n3 3304 3305 3306 1410 \r\n3 3306 3297 3302 1411 \r\n3 3308 3095 3307 1412 \r\n3 3307 3309 3310 1413 \r\n3 3310 3311 3312 1414 \r\n3 3312 3303 3308 1415 \r\n3 3314 3101 3313 1416 \r\n3 3313 3315 3316 1417 \r\n3 3316 3317 3318 1418 \r\n3 3318 3309 3314 1419 \r\n3 3320 3107 3319 1420 \r\n3 3319 3321 3322 1421 \r\n3 3322 3323 3324 1422 \r\n3 3324 3315 3320 1423 \r\n3 3326 3113 3325 1424 \r\n3 3325 3327 3328 1425 \r\n3 3328 3329 3330 1426 \r\n3 3330 3321 3326 1427 \r\n3 3332 3119 3331 1428 \r\n3 3331 3333 3334 1429 \r\n3 3334 3335 3336 1430 \r\n3 3336 3327 3332 1431 \r\n3 3338 3125 3337 1432 \r\n3 3337 3339 3340 1433 \r\n3 3340 3341 3342 1434 \r\n3 3342 3333 3338 1435 \r\n3 3344 3130 3343 1436 \r\n3 3343 3138 3345 1437 \r\n3 3345 3346 3347 1438 \r\n3 3347 3339 3344 1439 \r\n3 3349 3136 3348 1440 \r\n3 3348 3350 3351 1441 \r\n3 3351 3352 3353 1442 \r\n3 3353 3354 3349 1443 \r\n3 3356 3143 3355 1444 \r\n3 3355 3357 3358 1445 \r\n3 3358 3359 3360 1446 \r\n3 3360 3350 3356 1447 \r\n3 3362 3149 3361 1448 \r\n3 3361 3363 3364 1449 \r\n3 3364 3365 3366 1450 \r\n3 3366 3357 3362 1451 \r\n3 3368 3155 3367 1452 \r\n3 3367 3369 3370 1453 \r\n3 3370 3371 3372 1454 \r\n3 3372 3363 3368 1455 \r\n3 3374 3161 3373 1456 \r\n3 3373 3375 3376 1457 \r\n3 3376 3377 3378 1458 \r\n3 3378 3369 3374 1459 \r\n3 3380 3167 3379 1460 \r\n3 3379 3381 3382 1461 \r\n3 3382 3383 3384 1462 \r\n3 3384 3375 3380 1463 \r\n3 3386 3173 3385 1464 \r\n3 3385 3387 3388 1465 \r\n3 3388 3389 3390 1466 \r\n3 3390 3381 3386 1467 \r\n3 3392 3179 3391 1468 \r\n3 3391 3393 3394 1469 \r\n3 3394 3395 3396 1470 \r\n3 3396 3387 3392 1471 \r\n3 3398 3185 3397 1472 \r\n3 3397 3399 3400 1473 \r\n3 3400 3401 3402 1474 \r\n3 3402 3393 3398 1475 \r\n3 3404 3191 3403 1476 \r\n3 3403 3405 3406 1477 \r\n3 3406 3407 3408 1478 \r\n3 3408 3399 3404 1479 \r\n3 3410 3197 3409 1480 \r\n3 3409 3411 3412 1481 \r\n3 3412 3413 3414 1482 \r\n3 3414 3405 3410 1483 \r\n3 3416 3203 3415 1484 \r\n3 3415 3417 3418 1485 \r\n3 3418 3419 3420 1486 \r\n3 3420 3411 3416 1487 \r\n3 3422 3209 3421 1488 \r\n3 3421 3423 3424 1489 \r\n3 3424 3425 3426 1490 \r\n3 3426 3417 3422 1491 \r\n3 3428 3215 3427 1492 \r\n3 3427 3429 3430 1493 \r\n3 3430 3431 3432 1494 \r\n3 3432 3423 3428 1495 \r\n3 3434 3221 3433 1496 \r\n3 3433 3435 3436 1497 \r\n3 3436 3437 3438 1498 \r\n3 3438 3429 3434 1499 \r\n3 3440 3227 3439 1500 \r\n3 3439 3441 3442 1501 \r\n3 3442 3443 3444 1502 \r\n3 3444 3435 3440 1503 \r\n3 3446 3233 3445 1504 \r\n3 3445 3447 3448 1505 \r\n3 3448 3449 3450 1506 \r\n3 3450 3441 3446 1507 \r\n3 3452 3239 3451 1508 \r\n3 3451 3453 3454 1509 \r\n3 3454 3455 3456 1510 \r\n3 3456 3447 3452 1511 \r\n3 3458 3245 3457 1512 \r\n3 3457 3459 3460 1513 \r\n3 3460 3461 3462 1514 \r\n3 3462 3453 3458 1515 \r\n3 3464 3251 3463 1516 \r\n3 3463 3465 3466 1517 \r\n3 3466 3467 3468 1518 \r\n3 3468 3459 3464 1519 \r\n3 3470 3257 3469 1520 \r\n3 3469 3471 3472 1521 \r\n3 3472 3473 3474 1522 \r\n3 3474 3465 3470 1523 \r\n3 3476 3263 3475 1524 \r\n3 3475 3477 3478 1525 \r\n3 3478 3479 3480 1526 \r\n3 3480 3471 3476 1527 \r\n3 3482 3269 3481 1528 \r\n3 3481 3483 3484 1529 \r\n3 3484 3485 3486 1530 \r\n3 3486 3477 3482 1531 \r\n3 3488 3275 3487 1532 \r\n3 3487 3489 3490 1533 \r\n3 3490 3491 3492 1534 \r\n3 3492 3483 3488 1535 \r\n3 3494 3281 3493 1536 \r\n3 3493 3495 3496 1537 \r\n3 3496 3497 3498 1538 \r\n3 3498 3489 3494 1539 \r\n3 3500 3287 3499 1540 \r\n3 3499 3501 3502 1541 \r\n3 3502 3503 3504 1542 \r\n3 3504 3495 3500 1543 \r\n3 3506 3293 3505 1544 \r\n3 3505 3507 3508 1545 \r\n3 3508 3509 3510 1546 \r\n3 3510 3501 3506 1547 \r\n3 3512 3299 3511 1548 \r\n3 3511 3513 3514 1549 \r\n3 3514 3515 3516 1550 \r\n3 3516 3507 3512 1551 \r\n3 3518 3305 3517 1552 \r\n3 3517 3519 3520 1553 \r\n3 3520 3521 3522 1554 \r\n3 3522 3513 3518 1555 \r\n3 3524 3311 3523 1556 \r\n3 3523 3525 3526 1557 \r\n3 3526 3527 3528 1558 \r\n3 3528 3519 3524 1559 \r\n3 3530 3317 3529 1560 \r\n3 3529 3531 3532 1561 \r\n3 3532 3533 3534 1562 \r\n3 3534 3525 3530 1563 \r\n3 3536 3323 3535 1564 \r\n3 3535 3537 3538 1565 \r\n3 3538 3539 3540 1566 \r\n3 3540 3531 3536 1567 \r\n3 3542 3329 3541 1568 \r\n3 3541 3543 3544 1569 \r\n3 3544 3545 3546 1570 \r\n3 3546 3537 3542 1571 \r\n3 3548 3335 3547 1572 \r\n3 3547 3549 3550 1573 \r\n3 3550 3551 3552 1574 \r\n3 3552 3543 3548 1575 \r\n3 3554 3341 3553 1576 \r\n3 3553 3555 3556 1577 \r\n3 3556 3557 3558 1578 \r\n3 3558 3549 3554 1579 \r\n3 3560 3346 3559 1580 \r\n3 3559 3354 3561 1581 \r\n3 3561 3562 3563 1582 \r\n3 3563 3555 3560 1583 \r\n3 3565 3352 3564 1584 \r\n3 3564 3566 3567 1585 \r\n3 3567 3568 3569 1586 \r\n3 3569 3570 3565 1587 \r\n3 3572 3359 3571 1588 \r\n3 3571 3573 3574 1589 \r\n3 3574 3575 3576 1590 \r\n3 3576 3566 3572 1591 \r\n3 3578 3365 3577 1592 \r\n3 3577 3579 3580 1593 \r\n3 3580 3581 3582 1594 \r\n3 3582 3573 3578 1595 \r\n3 3584 3371 3583 1596 \r\n3 3583 3585 3586 1597 \r\n3 3586 3587 3588 1598 \r\n3 3588 3579 3584 1599 \r\n3 3590 3377 3589 1600 \r\n3 3589 3591 3592 1601 \r\n3 3592 3593 3594 1602 \r\n3 3594 3585 3590 1603 \r\n3 3596 3383 3595 1604 \r\n3 3595 3597 3598 1605 \r\n3 3598 3599 3600 1606 \r\n3 3600 3591 3596 1607 \r\n3 3602 3389 3601 1608 \r\n3 3601 3603 3604 1609 \r\n3 3604 3605 3606 1610 \r\n3 3606 3597 3602 1611 \r\n3 3608 3395 3607 1612 \r\n3 3607 3609 3610 1613 \r\n3 3610 3611 3612 1614 \r\n3 3612 3603 3608 1615 \r\n3 3614 3401 3613 1616 \r\n3 3613 3615 3616 1617 \r\n3 3616 3617 3618 1618 \r\n3 3618 3609 3614 1619 \r\n3 3620 3407 3619 1620 \r\n3 3619 3621 3622 1621 \r\n3 3622 3623 3624 1622 \r\n3 3624 3615 3620 1623 \r\n3 3626 3413 3625 1624 \r\n3 3625 3627 3628 1625 \r\n3 3628 3629 3630 1626 \r\n3 3630 3621 3626 1627 \r\n3 3632 3419 3631 1628 \r\n3 3631 3633 3634 1629 \r\n3 3634 3635 3636 1630 \r\n3 3636 3627 3632 1631 \r\n3 3638 3425 3637 1632 \r\n3 3637 3639 3640 1633 \r\n3 3640 3641 3642 1634 \r\n3 3642 3633 3638 1635 \r\n3 3644 3431 3643 1636 \r\n3 3643 3645 3646 1637 \r\n3 3646 3647 3648 1638 \r\n3 3648 3639 3644 1639 \r\n3 3650 3437 3649 1640 \r\n3 3649 3651 3652 1641 \r\n3 3652 3653 3654 1642 \r\n3 3654 3645 3650 1643 \r\n3 3656 3443 3655 1644 \r\n3 3655 3657 3658 1645 \r\n3 3658 3659 3660 1646 \r\n3 3660 3651 3656 1647 \r\n3 3662 3449 3661 1648 \r\n3 3661 3663 3664 1649 \r\n3 3664 3665 3666 1650 \r\n3 3666 3657 3662 1651 \r\n3 3668 3455 3667 1652 \r\n3 3667 3669 3670 1653 \r\n3 3670 3671 3672 1654 \r\n3 3672 3663 3668 1655 \r\n3 3674 3461 3673 1656 \r\n3 3673 3675 3676 1657 \r\n3 3676 3677 3678 1658 \r\n3 3678 3669 3674 1659 \r\n3 3680 3467 3679 1660 \r\n3 3679 3681 3682 1661 \r\n3 3682 3683 3684 1662 \r\n3 3684 3675 3680 1663 \r\n3 3686 3473 3685 1664 \r\n3 3685 3687 3688 1665 \r\n3 3688 3689 3690 1666 \r\n3 3690 3681 3686 1667 \r\n3 3692 3479 3691 1668 \r\n3 3691 3693 3694 1669 \r\n3 3694 3695 3696 1670 \r\n3 3696 3687 3692 1671 \r\n3 3698 3485 3697 1672 \r\n3 3697 3699 3700 1673 \r\n3 3700 3701 3702 1674 \r\n3 3702 3693 3698 1675 \r\n3 3704 3491 3703 1676 \r\n3 3703 3705 3706 1677 \r\n3 3706 3707 3708 1678 \r\n3 3708 3699 3704 1679 \r\n3 3710 3497 3709 1680 \r\n3 3709 3711 3712 1681 \r\n3 3712 3713 3714 1682 \r\n3 3714 3705 3710 1683 \r\n3 3716 3503 3715 1684 \r\n3 3715 3717 3718 1685 \r\n3 3718 3719 3720 1686 \r\n3 3720 3711 3716 1687 \r\n3 3722 3509 3721 1688 \r\n3 3721 3723 3724 1689 \r\n3 3724 3725 3726 1690 \r\n3 3726 3717 3722 1691 \r\n3 3728 3515 3727 1692 \r\n3 3727 3729 3730 1693 \r\n3 3730 3731 3732 1694 \r\n3 3732 3723 3728 1695 \r\n3 3734 3521 3733 1696 \r\n3 3733 3735 3736 1697 \r\n3 3736 3737 3738 1698 \r\n3 3738 3729 3734 1699 \r\n3 3740 3527 3739 1700 \r\n3 3739 3741 3742 1701 \r\n3 3742 3743 3744 1702 \r\n3 3744 3735 3740 1703 \r\n3 3746 3533 3745 1704 \r\n3 3745 3747 3748 1705 \r\n3 3748 3749 3750 1706 \r\n3 3750 3741 3746 1707 \r\n3 3752 3539 3751 1708 \r\n3 3751 3753 3754 1709 \r\n3 3754 3755 3756 1710 \r\n3 3756 3747 3752 1711 \r\n3 3758 3545 3757 1712 \r\n3 3757 3759 3760 1713 \r\n3 3760 3761 3762 1714 \r\n3 3762 3753 3758 1715 \r\n3 3764 3551 3763 1716 \r\n3 3763 3765 3766 1717 \r\n3 3766 3767 3768 1718 \r\n3 3768 3759 3764 1719 \r\n3 3770 3557 3769 1720 \r\n3 3769 3771 3772 1721 \r\n3 3772 3773 3774 1722 \r\n3 3774 3765 3770 1723 \r\n3 3776 3562 3775 1724 \r\n3 3775 3570 3777 1725 \r\n3 3777 3778 3779 1726 \r\n3 3779 3771 3776 1727 \r\n3 3781 3568 3780 1728 \r\n3 3780 3782 3783 1729 \r\n3 3783 3784 3785 1730 \r\n3 3785 3786 3781 1731 \r\n3 3788 3575 3787 1732 \r\n3 3787 3789 3790 1733 \r\n3 3790 3791 3792 1734 \r\n3 3792 3782 3788 1735 \r\n3 3794 3581 3793 1736 \r\n3 3793 3795 3796 1737 \r\n3 3796 3797 3798 1738 \r\n3 3798 3789 3794 1739 \r\n3 3800 3587 3799 1740 \r\n3 3799 3801 3802 1741 \r\n3 3802 3803 3804 1742 \r\n3 3804 3795 3800 1743 \r\n3 3806 3593 3805 1744 \r\n3 3805 3807 3808 1745 \r\n3 3808 3809 3810 1746 \r\n3 3810 3801 3806 1747 \r\n3 3812 3599 3811 1748 \r\n3 3811 3813 3814 1749 \r\n3 3814 3815 3816 1750 \r\n3 3816 3807 3812 1751 \r\n3 3818 3605 3817 1752 \r\n3 3817 3819 3820 1753 \r\n3 3820 3821 3822 1754 \r\n3 3822 3813 3818 1755 \r\n3 3824 3611 3823 1756 \r\n3 3823 3825 3826 1757 \r\n3 3826 3827 3828 1758 \r\n3 3828 3819 3824 1759 \r\n3 3830 3617 3829 1760 \r\n3 3829 3831 3832 1761 \r\n3 3832 3833 3834 1762 \r\n3 3834 3825 3830 1763 \r\n3 3836 3623 3835 1764 \r\n3 3835 3837 3838 1765 \r\n3 3838 3839 3840 1766 \r\n3 3840 3831 3836 1767 \r\n3 3842 3629 3841 1768 \r\n3 3841 3843 3844 1769 \r\n3 3844 3845 3846 1770 \r\n3 3846 3837 3842 1771 \r\n3 3848 3635 3847 1772 \r\n3 3847 3849 3850 1773 \r\n3 3850 3851 3852 1774 \r\n3 3852 3843 3848 1775 \r\n3 3854 3641 3853 1776 \r\n3 3853 3855 3856 1777 \r\n3 3856 3857 3858 1778 \r\n3 3858 3849 3854 1779 \r\n3 3860 3647 3859 1780 \r\n3 3859 3861 3862 1781 \r\n3 3862 3863 3864 1782 \r\n3 3864 3855 3860 1783 \r\n3 3866 3653 3865 1784 \r\n3 3865 3867 3868 1785 \r\n3 3868 3869 3870 1786 \r\n3 3870 3861 3866 1787 \r\n3 3872 3659 3871 1788 \r\n3 3871 3873 3874 1789 \r\n3 3874 3875 3876 1790 \r\n3 3876 3867 3872 1791 \r\n3 3878 3665 3877 1792 \r\n3 3877 3879 3880 1793 \r\n3 3880 3881 3882 1794 \r\n3 3882 3873 3878 1795 \r\n3 3884 3671 3883 1796 \r\n3 3883 3885 3886 1797 \r\n3 3886 3887 3888 1798 \r\n3 3888 3879 3884 1799 \r\n3 3890 3677 3889 1800 \r\n3 3889 3891 3892 1801 \r\n3 3892 3893 3894 1802 \r\n3 3894 3885 3890 1803 \r\n3 3896 3683 3895 1804 \r\n3 3895 3897 3898 1805 \r\n3 3898 3899 3900 1806 \r\n3 3900 3891 3896 1807 \r\n3 3902 3689 3901 1808 \r\n3 3901 3903 3904 1809 \r\n3 3904 3905 3906 1810 \r\n3 3906 3897 3902 1811 \r\n3 3908 3695 3907 1812 \r\n3 3907 3909 3910 1813 \r\n3 3910 3911 3912 1814 \r\n3 3912 3903 3908 1815 \r\n3 3914 3701 3913 1816 \r\n3 3913 3915 3916 1817 \r\n3 3916 3917 3918 1818 \r\n3 3918 3909 3914 1819 \r\n3 3920 3707 3919 1820 \r\n3 3919 3921 3922 1821 \r\n3 3922 3923 3924 1822 \r\n3 3924 3915 3920 1823 \r\n3 3926 3713 3925 1824 \r\n3 3925 3927 3928 1825 \r\n3 3928 3929 3930 1826 \r\n3 3930 3921 3926 1827 \r\n3 3932 3719 3931 1828 \r\n3 3931 3933 3934 1829 \r\n3 3934 3935 3936 1830 \r\n3 3936 3927 3932 1831 \r\n3 3938 3725 3937 1832 \r\n3 3937 3939 3940 1833 \r\n3 3940 3941 3942 1834 \r\n3 3942 3933 3938 1835 \r\n3 3944 3731 3943 1836 \r\n3 3943 3945 3946 1837 \r\n3 3946 3947 3948 1838 \r\n3 3948 3939 3944 1839 \r\n3 3950 3737 3949 1840 \r\n3 3949 3951 3952 1841 \r\n3 3952 3953 3954 1842 \r\n3 3954 3945 3950 1843 \r\n3 3956 3743 3955 1844 \r\n3 3955 3957 3958 1845 \r\n3 3958 3959 3960 1846 \r\n3 3960 3951 3956 1847 \r\n3 3962 3749 3961 1848 \r\n3 3961 3963 3964 1849 \r\n3 3964 3965 3966 1850 \r\n3 3966 3957 3962 1851 \r\n3 3968 3755 3967 1852 \r\n3 3967 3969 3970 1853 \r\n3 3970 3971 3972 1854 \r\n3 3972 3963 3968 1855 \r\n3 3974 3761 3973 1856 \r\n3 3973 3975 3976 1857 \r\n3 3976 3977 3978 1858 \r\n3 3978 3969 3974 1859 \r\n3 3980 3767 3979 1860 \r\n3 3979 3981 3982 1861 \r\n3 3982 3983 3984 1862 \r\n3 3984 3975 3980 1863 \r\n3 3986 3773 3985 1864 \r\n3 3985 3987 3988 1865 \r\n3 3988 3989 3990 1866 \r\n3 3990 3981 3986 1867 \r\n3 3992 3778 3991 1868 \r\n3 3991 3786 3993 1869 \r\n3 3993 3994 3995 1870 \r\n3 3995 3987 3992 1871 \r\n3 3997 3784 3996 1872 \r\n3 3996 3998 3999 1873 \r\n3 3999 4000 4001 1874 \r\n3 4001 4002 3997 1875 \r\n3 4004 3791 4003 1876 \r\n3 4003 4005 4006 1877 \r\n3 4006 4007 4008 1878 \r\n3 4008 3998 4004 1879 \r\n3 4010 3797 4009 1880 \r\n3 4009 4011 4012 1881 \r\n3 4012 4013 4014 1882 \r\n3 4014 4005 4010 1883 \r\n3 4016 3803 4015 1884 \r\n3 4015 4017 4018 1885 \r\n3 4018 4019 4020 1886 \r\n3 4020 4011 4016 1887 \r\n3 4022 3809 4021 1888 \r\n3 4021 4023 4024 1889 \r\n3 4024 4025 4026 1890 \r\n3 4026 4017 4022 1891 \r\n3 4028 3815 4027 1892 \r\n3 4027 4029 4030 1893 \r\n3 4030 4031 4032 1894 \r\n3 4032 4023 4028 1895 \r\n3 4034 3821 4033 1896 \r\n3 4033 4035 4036 1897 \r\n3 4036 4037 4038 1898 \r\n3 4038 4029 4034 1899 \r\n3 4040 3827 4039 1900 \r\n3 4039 4041 4042 1901 \r\n3 4042 4043 4044 1902 \r\n3 4044 4035 4040 1903 \r\n3 4046 3833 4045 1904 \r\n3 4045 4047 4048 1905 \r\n3 4048 4049 4050 1906 \r\n3 4050 4041 4046 1907 \r\n3 4052 3839 4051 1908 \r\n3 4051 4053 4054 1909 \r\n3 4054 4055 4056 1910 \r\n3 4056 4047 4052 1911 \r\n3 4058 3845 4057 1912 \r\n3 4057 4059 4060 1913 \r\n3 4060 4061 4062 1914 \r\n3 4062 4053 4058 1915 \r\n3 4064 3851 4063 1916 \r\n3 4063 4065 4066 1917 \r\n3 4066 4067 4068 1918 \r\n3 4068 4059 4064 1919 \r\n3 4070 3857 4069 1920 \r\n3 4069 4071 4072 1921 \r\n3 4072 4073 4074 1922 \r\n3 4074 4065 4070 1923 \r\n3 4076 3863 4075 1924 \r\n3 4075 4077 4078 1925 \r\n3 4078 4079 4080 1926 \r\n3 4080 4071 4076 1927 \r\n3 4082 3869 4081 1928 \r\n3 4081 4083 4084 1929 \r\n3 4084 4085 4086 1930 \r\n3 4086 4077 4082 1931 \r\n3 4088 3875 4087 1932 \r\n3 4087 4089 4090 1933 \r\n3 4090 4091 4092 1934 \r\n3 4092 4083 4088 1935 \r\n3 4094 3881 4093 1936 \r\n3 4093 4095 4096 1937 \r\n3 4096 4097 4098 1938 \r\n3 4098 4089 4094 1939 \r\n3 4100 3887 4099 1940 \r\n3 4099 4101 4102 1941 \r\n3 4102 4103 4104 1942 \r\n3 4104 4095 4100 1943 \r\n3 4106 3893 4105 1944 \r\n3 4105 4107 4108 1945 \r\n3 4108 4109 4110 1946 \r\n3 4110 4101 4106 1947 \r\n3 4112 3899 4111 1948 \r\n3 4111 4113 4114 1949 \r\n3 4114 4115 4116 1950 \r\n3 4116 4107 4112 1951 \r\n3 4118 3905 4117 1952 \r\n3 4117 4119 4120 1953 \r\n3 4120 4121 4122 1954 \r\n3 4122 4113 4118 1955 \r\n3 4124 3911 4123 1956 \r\n3 4123 4125 4126 1957 \r\n3 4126 4127 4128 1958 \r\n3 4128 4119 4124 1959 \r\n3 4130 3917 4129 1960 \r\n3 4129 4131 4132 1961 \r\n3 4132 4133 4134 1962 \r\n3 4134 4125 4130 1963 \r\n3 4136 3923 4135 1964 \r\n3 4135 4137 4138 1965 \r\n3 4138 4139 4140 1966 \r\n3 4140 4131 4136 1967 \r\n3 4142 3929 4141 1968 \r\n3 4141 4143 4144 1969 \r\n3 4144 4145 4146 1970 \r\n3 4146 4137 4142 1971 \r\n3 4148 3935 4147 1972 \r\n3 4147 4149 4150 1973 \r\n3 4150 4151 4152 1974 \r\n3 4152 4143 4148 1975 \r\n3 4154 3941 4153 1976 \r\n3 4153 4155 4156 1977 \r\n3 4156 4157 4158 1978 \r\n3 4158 4149 4154 1979 \r\n3 4160 3947 4159 1980 \r\n3 4159 4161 4162 1981 \r\n3 4162 4163 4164 1982 \r\n3 4164 4155 4160 1983 \r\n3 4166 3953 4165 1984 \r\n3 4165 4167 4168 1985 \r\n3 4168 4169 4170 1986 \r\n3 4170 4161 4166 1987 \r\n3 4172 3959 4171 1988 \r\n3 4171 4173 4174 1989 \r\n3 4174 4175 4176 1990 \r\n3 4176 4167 4172 1991 \r\n3 4178 3965 4177 1992 \r\n3 4177 4179 4180 1993 \r\n3 4180 4181 4182 1994 \r\n3 4182 4173 4178 1995 \r\n3 4184 3971 4183 1996 \r\n3 4183 4185 4186 1997 \r\n3 4186 4187 4188 1998 \r\n3 4188 4179 4184 1999 \r\n3 4190 3977 4189 2000 \r\n3 4189 4191 4192 2001 \r\n3 4192 4193 4194 2002 \r\n3 4194 4185 4190 2003 \r\n3 4196 3983 4195 2004 \r\n3 4195 4197 4198 2005 \r\n3 4198 4199 4200 2006 \r\n3 4200 4191 4196 2007 \r\n3 4202 3989 4201 2008 \r\n3 4201 4203 4204 2009 \r\n3 4204 4205 4206 2010 \r\n3 4206 4197 4202 2011 \r\n3 4208 3994 4207 2012 \r\n3 4207 4002 4209 2013 \r\n3 4209 4210 4211 2014 \r\n3 4211 4203 4208 2015 \r\n3 4213 4000 4212 2016 \r\n3 4212 4214 4215 2017 \r\n3 4215 4216 4217 2018 \r\n3 4217 4218 4213 2019 \r\n3 4220 4007 4219 2020 \r\n3 4219 4221 4222 2021 \r\n3 4222 4223 4224 2022 \r\n3 4224 4214 4220 2023 \r\n3 4226 4013 4225 2024 \r\n3 4225 4227 4228 2025 \r\n3 4228 4229 4230 2026 \r\n3 4230 4221 4226 2027 \r\n3 4232 4019 4231 2028 \r\n3 4231 4233 4234 2029 \r\n3 4234 4235 4236 2030 \r\n3 4236 4227 4232 2031 \r\n3 4238 4025 4237 2032 \r\n3 4237 4239 4240 2033 \r\n3 4240 4241 4242 2034 \r\n3 4242 4233 4238 2035 \r\n3 4244 4031 4243 2036 \r\n3 4243 4245 4246 2037 \r\n3 4246 4247 4248 2038 \r\n3 4248 4239 4244 2039 \r\n3 4250 4037 4249 2040 \r\n3 4249 4251 4252 2041 \r\n3 4252 4253 4254 2042 \r\n3 4254 4245 4250 2043 \r\n3 4256 4043 4255 2044 \r\n3 4255 4257 4258 2045 \r\n3 4258 4259 4260 2046 \r\n3 4260 4251 4256 2047 \r\n3 4262 4049 4261 2048 \r\n3 4261 4263 4264 2049 \r\n3 4264 4265 4266 2050 \r\n3 4266 4257 4262 2051 \r\n3 4268 4055 4267 2052 \r\n3 4267 4269 4270 2053 \r\n3 4270 4271 4272 2054 \r\n3 4272 4263 4268 2055 \r\n3 4274 4061 4273 2056 \r\n3 4273 4275 4276 2057 \r\n3 4276 4277 4278 2058 \r\n3 4278 4269 4274 2059 \r\n3 4280 4067 4279 2060 \r\n3 4279 4281 4282 2061 \r\n3 4282 4283 4284 2062 \r\n3 4284 4275 4280 2063 \r\n3 4286 4073 4285 2064 \r\n3 4285 4287 4288 2065 \r\n3 4288 4289 4290 2066 \r\n3 4290 4281 4286 2067 \r\n3 4292 4079 4291 2068 \r\n3 4291 4293 4294 2069 \r\n3 4294 4295 4296 2070 \r\n3 4296 4287 4292 2071 \r\n3 4298 4085 4297 2072 \r\n3 4297 4299 4300 2073 \r\n3 4300 4301 4302 2074 \r\n3 4302 4293 4298 2075 \r\n3 4304 4091 4303 2076 \r\n3 4303 4305 4306 2077 \r\n3 4306 4307 4308 2078 \r\n3 4308 4299 4304 2079 \r\n3 4310 4097 4309 2080 \r\n3 4309 4311 4312 2081 \r\n3 4312 4313 4314 2082 \r\n3 4314 4305 4310 2083 \r\n3 4316 4103 4315 2084 \r\n3 4315 4317 4318 2085 \r\n3 4318 4319 4320 2086 \r\n3 4320 4311 4316 2087 \r\n3 4322 4109 4321 2088 \r\n3 4321 4323 4324 2089 \r\n3 4324 4325 4326 2090 \r\n3 4326 4317 4322 2091 \r\n3 4328 4115 4327 2092 \r\n3 4327 4329 4330 2093 \r\n3 4330 4331 4332 2094 \r\n3 4332 4323 4328 2095 \r\n3 4334 4121 4333 2096 \r\n3 4333 4335 4336 2097 \r\n3 4336 4337 4338 2098 \r\n3 4338 4329 4334 2099 \r\n3 4340 4127 4339 2100 \r\n3 4339 4341 4342 2101 \r\n3 4342 4343 4344 2102 \r\n3 4344 4335 4340 2103 \r\n3 4346 4133 4345 2104 \r\n3 4345 4347 4348 2105 \r\n3 4348 4349 4350 2106 \r\n3 4350 4341 4346 2107 \r\n3 4352 4139 4351 2108 \r\n3 4351 4353 4354 2109 \r\n3 4354 4355 4356 2110 \r\n3 4356 4347 4352 2111 \r\n3 4358 4145 4357 2112 \r\n3 4357 4359 4360 2113 \r\n3 4360 4361 4362 2114 \r\n3 4362 4353 4358 2115 \r\n3 4364 4151 4363 2116 \r\n3 4363 4365 4366 2117 \r\n3 4366 4367 4368 2118 \r\n3 4368 4359 4364 2119 \r\n3 4370 4157 4369 2120 \r\n3 4369 4371 4372 2121 \r\n3 4372 4373 4374 2122 \r\n3 4374 4365 4370 2123 \r\n3 4376 4163 4375 2124 \r\n3 4375 4377 4378 2125 \r\n3 4378 4379 4380 2126 \r\n3 4380 4371 4376 2127 \r\n3 4382 4169 4381 2128 \r\n3 4381 4383 4384 2129 \r\n3 4384 4385 4386 2130 \r\n3 4386 4377 4382 2131 \r\n3 4388 4175 4387 2132 \r\n3 4387 4389 4390 2133 \r\n3 4390 4391 4392 2134 \r\n3 4392 4383 4388 2135 \r\n3 4394 4181 4393 2136 \r\n3 4393 4395 4396 2137 \r\n3 4396 4397 4398 2138 \r\n3 4398 4389 4394 2139 \r\n3 4400 4187 4399 2140 \r\n3 4399 4401 4402 2141 \r\n3 4402 4403 4404 2142 \r\n3 4404 4395 4400 2143 \r\n3 4406 4193 4405 2144 \r\n3 4405 4407 4408 2145 \r\n3 4408 4409 4410 2146 \r\n3 4410 4401 4406 2147 \r\n3 4412 4199 4411 2148 \r\n3 4411 4413 4414 2149 \r\n3 4414 4415 4416 2150 \r\n3 4416 4407 4412 2151 \r\n3 4418 4205 4417 2152 \r\n3 4417 4419 4420 2153 \r\n3 4420 4421 4422 2154 \r\n3 4422 4413 4418 2155 \r\n3 4424 4210 4423 2156 \r\n3 4423 4218 4425 2157 \r\n3 4425 4426 4427 2158 \r\n3 4427 4419 4424 2159 \r\n3 4429 4216 4428 2160 \r\n3 4428 4430 4431 2161 \r\n3 4431 1152 4432 2162 \r\n3 4432 4433 4429 2163 \r\n3 4435 4223 4434 2164 \r\n3 4434 4436 4437 2165 \r\n3 4437 1160 4438 2166 \r\n3 4438 4430 4435 2167 \r\n3 4440 4229 4439 2168 \r\n3 4439 4441 4442 2169 \r\n3 4442 1167 4443 2170 \r\n3 4443 4436 4440 2171 \r\n3 4445 4235 4444 2172 \r\n3 4444 4446 4447 2173 \r\n3 4447 1174 4448 2174 \r\n3 4448 4441 4445 2175 \r\n3 4450 4241 4449 2176 \r\n3 4449 4451 4452 2177 \r\n3 4452 1181 4453 2178 \r\n3 4453 4446 4450 2179 \r\n3 4455 4247 4454 2180 \r\n3 4454 4456 4457 2181 \r\n3 4457 1188 4458 2182 \r\n3 4458 4451 4455 2183 \r\n3 4460 4253 4459 2184 \r\n3 4459 4461 4462 2185 \r\n3 4462 1195 4463 2186 \r\n3 4463 4456 4460 2187 \r\n3 4465 4259 4464 2188 \r\n3 4464 4466 4467 2189 \r\n3 4467 1202 4468 2190 \r\n3 4468 4461 4465 2191 \r\n3 4470 4265 4469 2192 \r\n3 4469 4471 4472 2193 \r\n3 4472 1209 4473 2194 \r\n3 4473 4466 4470 2195 \r\n3 4475 4271 4474 2196 \r\n3 4474 4476 4477 2197 \r\n3 4477 1216 4478 2198 \r\n3 4478 4471 4475 2199 \r\n3 4480 4277 4479 2200 \r\n3 4479 4481 4482 2201 \r\n3 4482 1223 4483 2202 \r\n3 4483 4476 4480 2203 \r\n3 4485 4283 4484 2204 \r\n3 4484 4486 4487 2205 \r\n3 4487 1230 4488 2206 \r\n3 4488 4481 4485 2207 \r\n3 4490 4289 4489 2208 \r\n3 4489 4491 4492 2209 \r\n3 4492 1237 4493 2210 \r\n3 4493 4486 4490 2211 \r\n3 4495 4295 4494 2212 \r\n3 4494 4496 4497 2213 \r\n3 4497 1244 4498 2214 \r\n3 4498 4491 4495 2215 \r\n3 4500 4301 4499 2216 \r\n3 4499 4501 4502 2217 \r\n3 4502 1251 4503 2218 \r\n3 4503 4496 4500 2219 \r\n3 4505 4307 4504 2220 \r\n3 4504 4506 4507 2221 \r\n3 4507 1258 4508 2222 \r\n3 4508 4501 4505 2223 \r\n3 4510 4313 4509 2224 \r\n3 4509 4511 4512 2225 \r\n3 4512 1265 4513 2226 \r\n3 4513 4506 4510 2227 \r\n3 4515 4319 4514 2228 \r\n3 4514 4516 4517 2229 \r\n3 4517 1272 4518 2230 \r\n3 4518 4511 4515 2231 \r\n3 4520 4325 4519 2232 \r\n3 4519 4521 4522 2233 \r\n3 4522 1279 4523 2234 \r\n3 4523 4516 4520 2235 \r\n3 4525 4331 4524 2236 \r\n3 4524 4526 4527 2237 \r\n3 4527 1286 4528 2238 \r\n3 4528 4521 4525 2239 \r\n3 4530 4337 4529 2240 \r\n3 4529 4531 4532 2241 \r\n3 4532 1293 4533 2242 \r\n3 4533 4526 4530 2243 \r\n3 4535 4343 4534 2244 \r\n3 4534 4536 4537 2245 \r\n3 4537 1300 4538 2246 \r\n3 4538 4531 4535 2247 \r\n3 4540 4349 4539 2248 \r\n3 4539 4541 4542 2249 \r\n3 4542 1307 4543 2250 \r\n3 4543 4536 4540 2251 \r\n3 4545 4355 4544 2252 \r\n3 4544 4546 4547 2253 \r\n3 4547 1314 4548 2254 \r\n3 4548 4541 4545 2255 \r\n3 4550 4361 4549 2256 \r\n3 4549 4551 4552 2257 \r\n3 4552 1321 4553 2258 \r\n3 4553 4546 4550 2259 \r\n3 4555 4367 4554 2260 \r\n3 4554 4556 4557 2261 \r\n3 4557 1328 4558 2262 \r\n3 4558 4551 4555 2263 \r\n3 4560 4373 4559 2264 \r\n3 4559 4561 4562 2265 \r\n3 4562 1335 4563 2266 \r\n3 4563 4556 4560 2267 \r\n3 4565 4379 4564 2268 \r\n3 4564 4566 4567 2269 \r\n3 4567 1342 4568 2270 \r\n3 4568 4561 4565 2271 \r\n3 4570 4385 4569 2272 \r\n3 4569 4571 4572 2273 \r\n3 4572 1349 4573 2274 \r\n3 4573 4566 4570 2275 \r\n3 4575 4391 4574 2276 \r\n3 4574 4576 4577 2277 \r\n3 4577 1356 4578 2278 \r\n3 4578 4571 4575 2279 \r\n3 4580 4397 4579 2280 \r\n3 4579 4581 4582 2281 \r\n3 4582 1363 4583 2282 \r\n3 4583 4576 4580 2283 \r\n3 4585 4403 4584 2284 \r\n3 4584 4586 4587 2285 \r\n3 4587 1370 4588 2286 \r\n3 4588 4581 4585 2287 \r\n3 4590 4409 4589 2288 \r\n3 4589 4591 4592 2289 \r\n3 4592 1377 4593 2290 \r\n3 4593 4586 4590 2291 \r\n3 4595 4415 4594 2292 \r\n3 4594 4596 4597 2293 \r\n3 4597 1384 4598 2294 \r\n3 4598 4591 4595 2295 \r\n3 4600 4421 4599 2296 \r\n3 4599 4601 4602 2297 \r\n3 4602 1391 4603 2298 \r\n3 4603 4596 4600 2299 \r\n3 4605 4426 4604 2300 \r\n3 4604 4433 4606 2301 \r\n3 4606 1398 4607 2302 \r\n3 4607 4601 4605 2303 \r\n3 576 1154 1153 0 \r\n3 0 1152 1154 0 \r\n3 1 1153 1152 0 \r\n3 576 1153 1156 1 \r\n3 1 1155 1153 1 \r\n3 37 1156 1155 1 \r\n3 576 1156 1158 2 \r\n3 37 1157 1156 2 \r\n3 36 1158 1157 2 \r\n3 576 1158 1154 3 \r\n3 36 1159 1158 3 \r\n3 0 1154 1159 3 \r\n3 577 1162 1161 4 \r\n3 1 1160 1162 4 \r\n3 2 1161 1160 4 \r\n3 577 1161 1164 5 \r\n3 2 1163 1161 5 \r\n3 38 1164 1163 5 \r\n3 577 1164 1166 6 \r\n3 38 1165 1164 6 \r\n3 37 1166 1165 6 \r\n3 577 1166 1162 7 \r\n3 37 1155 1166 7 \r\n3 1 1162 1155 7 \r\n3 578 1169 1168 8 \r\n3 2 1167 1169 8 \r\n3 3 1168 1167 8 \r\n3 578 1168 1171 9 \r\n3 3 1170 1168 9 \r\n3 39 1171 1170 9 \r\n3 578 1171 1173 10 \r\n3 39 1172 1171 10 \r\n3 38 1173 1172 10 \r\n3 578 1173 1169 11 \r\n3 38 1163 1173 11 \r\n3 2 1169 1163 11 \r\n3 579 1176 1175 12 \r\n3 3 1174 1176 12 \r\n3 4 1175 1174 12 \r\n3 579 1175 1178 13 \r\n3 4 1177 1175 13 \r\n3 40 1178 1177 13 \r\n3 579 1178 1180 14 \r\n3 40 1179 1178 14 \r\n3 39 1180 1179 14 \r\n3 579 1180 1176 15 \r\n3 39 1170 1180 15 \r\n3 3 1176 1170 15 \r\n3 580 1183 1182 16 \r\n3 4 1181 1183 16 \r\n3 5 1182 1181 16 \r\n3 580 1182 1185 17 \r\n3 5 1184 1182 17 \r\n3 41 1185 1184 17 \r\n3 580 1185 1187 18 \r\n3 41 1186 1185 18 \r\n3 40 1187 1186 18 \r\n3 580 1187 1183 19 \r\n3 40 1177 1187 19 \r\n3 4 1183 1177 19 \r\n3 581 1190 1189 20 \r\n3 5 1188 1190 20 \r\n3 6 1189 1188 20 \r\n3 581 1189 1192 21 \r\n3 6 1191 1189 21 \r\n3 42 1192 1191 21 \r\n3 581 1192 1194 22 \r\n3 42 1193 1192 22 \r\n3 41 1194 1193 22 \r\n3 581 1194 1190 23 \r\n3 41 1184 1194 23 \r\n3 5 1190 1184 23 \r\n3 582 1197 1196 24 \r\n3 6 1195 1197 24 \r\n3 7 1196 1195 24 \r\n3 582 1196 1199 25 \r\n3 7 1198 1196 25 \r\n3 43 1199 1198 25 \r\n3 582 1199 1201 26 \r\n3 43 1200 1199 26 \r\n3 42 1201 1200 26 \r\n3 582 1201 1197 27 \r\n3 42 1191 1201 27 \r\n3 6 1197 1191 27 \r\n3 583 1204 1203 28 \r\n3 7 1202 1204 28 \r\n3 8 1203 1202 28 \r\n3 583 1203 1206 29 \r\n3 8 1205 1203 29 \r\n3 44 1206 1205 29 \r\n3 583 1206 1208 30 \r\n3 44 1207 1206 30 \r\n3 43 1208 1207 30 \r\n3 583 1208 1204 31 \r\n3 43 1198 1208 31 \r\n3 7 1204 1198 31 \r\n3 584 1211 1210 32 \r\n3 8 1209 1211 32 \r\n3 9 1210 1209 32 \r\n3 584 1210 1213 33 \r\n3 9 1212 1210 33 \r\n3 45 1213 1212 33 \r\n3 584 1213 1215 34 \r\n3 45 1214 1213 34 \r\n3 44 1215 1214 34 \r\n3 584 1215 1211 35 \r\n3 44 1205 1215 35 \r\n3 8 1211 1205 35 \r\n3 585 1218 1217 36 \r\n3 9 1216 1218 36 \r\n3 10 1217 1216 36 \r\n3 585 1217 1220 37 \r\n3 10 1219 1217 37 \r\n3 46 1220 1219 37 \r\n3 585 1220 1222 38 \r\n3 46 1221 1220 38 \r\n3 45 1222 1221 38 \r\n3 585 1222 1218 39 \r\n3 45 1212 1222 39 \r\n3 9 1218 1212 39 \r\n3 586 1225 1224 40 \r\n3 10 1223 1225 40 \r\n3 11 1224 1223 40 \r\n3 586 1224 1227 41 \r\n3 11 1226 1224 41 \r\n3 47 1227 1226 41 \r\n3 586 1227 1229 42 \r\n3 47 1228 1227 42 \r\n3 46 1229 1228 42 \r\n3 586 1229 1225 43 \r\n3 46 1219 1229 43 \r\n3 10 1225 1219 43 \r\n3 587 1232 1231 44 \r\n3 11 1230 1232 44 \r\n3 12 1231 1230 44 \r\n3 587 1231 1234 45 \r\n3 12 1233 1231 45 \r\n3 48 1234 1233 45 \r\n3 587 1234 1236 46 \r\n3 48 1235 1234 46 \r\n3 47 1236 1235 46 \r\n3 587 1236 1232 47 \r\n3 47 1226 1236 47 \r\n3 11 1232 1226 47 \r\n3 588 1239 1238 48 \r\n3 12 1237 1239 48 \r\n3 13 1238 1237 48 \r\n3 588 1238 1241 49 \r\n3 13 1240 1238 49 \r\n3 49 1241 1240 49 \r\n3 588 1241 1243 50 \r\n3 49 1242 1241 50 \r\n3 48 1243 1242 50 \r\n3 588 1243 1239 51 \r\n3 48 1233 1243 51 \r\n3 12 1239 1233 51 \r\n3 589 1246 1245 52 \r\n3 13 1244 1246 52 \r\n3 14 1245 1244 52 \r\n3 589 1245 1248 53 \r\n3 14 1247 1245 53 \r\n3 50 1248 1247 53 \r\n3 589 1248 1250 54 \r\n3 50 1249 1248 54 \r\n3 49 1250 1249 54 \r\n3 589 1250 1246 55 \r\n3 49 1240 1250 55 \r\n3 13 1246 1240 55 \r\n3 590 1253 1252 56 \r\n3 14 1251 1253 56 \r\n3 15 1252 1251 56 \r\n3 590 1252 1255 57 \r\n3 15 1254 1252 57 \r\n3 51 1255 1254 57 \r\n3 590 1255 1257 58 \r\n3 51 1256 1255 58 \r\n3 50 1257 1256 58 \r\n3 590 1257 1253 59 \r\n3 50 1247 1257 59 \r\n3 14 1253 1247 59 \r\n3 591 1260 1259 60 \r\n3 15 1258 1260 60 \r\n3 16 1259 1258 60 \r\n3 591 1259 1262 61 \r\n3 16 1261 1259 61 \r\n3 52 1262 1261 61 \r\n3 591 1262 1264 62 \r\n3 52 1263 1262 62 \r\n3 51 1264 1263 62 \r\n3 591 1264 1260 63 \r\n3 51 1254 1264 63 \r\n3 15 1260 1254 63 \r\n3 592 1267 1266 64 \r\n3 16 1265 1267 64 \r\n3 17 1266 1265 64 \r\n3 592 1266 1269 65 \r\n3 17 1268 1266 65 \r\n3 53 1269 1268 65 \r\n3 592 1269 1271 66 \r\n3 53 1270 1269 66 \r\n3 52 1271 1270 66 \r\n3 592 1271 1267 67 \r\n3 52 1261 1271 67 \r\n3 16 1267 1261 67 \r\n3 593 1274 1273 68 \r\n3 17 1272 1274 68 \r\n3 18 1273 1272 68 \r\n3 593 1273 1276 69 \r\n3 18 1275 1273 69 \r\n3 54 1276 1275 69 \r\n3 593 1276 1278 70 \r\n3 54 1277 1276 70 \r\n3 53 1278 1277 70 \r\n3 593 1278 1274 71 \r\n3 53 1268 1278 71 \r\n3 17 1274 1268 71 \r\n3 594 1281 1280 72 \r\n3 18 1279 1281 72 \r\n3 19 1280 1279 72 \r\n3 594 1280 1283 73 \r\n3 19 1282 1280 73 \r\n3 55 1283 1282 73 \r\n3 594 1283 1285 74 \r\n3 55 1284 1283 74 \r\n3 54 1285 1284 74 \r\n3 594 1285 1281 75 \r\n3 54 1275 1285 75 \r\n3 18 1281 1275 75 \r\n3 595 1288 1287 76 \r\n3 19 1286 1288 76 \r\n3 20 1287 1286 76 \r\n3 595 1287 1290 77 \r\n3 20 1289 1287 77 \r\n3 56 1290 1289 77 \r\n3 595 1290 1292 78 \r\n3 56 1291 1290 78 \r\n3 55 1292 1291 78 \r\n3 595 1292 1288 79 \r\n3 55 1282 1292 79 \r\n3 19 1288 1282 79 \r\n3 596 1295 1294 80 \r\n3 20 1293 1295 80 \r\n3 21 1294 1293 80 \r\n3 596 1294 1297 81 \r\n3 21 1296 1294 81 \r\n3 57 1297 1296 81 \r\n3 596 1297 1299 82 \r\n3 57 1298 1297 82 \r\n3 56 1299 1298 82 \r\n3 596 1299 1295 83 \r\n3 56 1289 1299 83 \r\n3 20 1295 1289 83 \r\n3 597 1302 1301 84 \r\n3 21 1300 1302 84 \r\n3 22 1301 1300 84 \r\n3 597 1301 1304 85 \r\n3 22 1303 1301 85 \r\n3 58 1304 1303 85 \r\n3 597 1304 1306 86 \r\n3 58 1305 1304 86 \r\n3 57 1306 1305 86 \r\n3 597 1306 1302 87 \r\n3 57 1296 1306 87 \r\n3 21 1302 1296 87 \r\n3 598 1309 1308 88 \r\n3 22 1307 1309 88 \r\n3 23 1308 1307 88 \r\n3 598 1308 1311 89 \r\n3 23 1310 1308 89 \r\n3 59 1311 1310 89 \r\n3 598 1311 1313 90 \r\n3 59 1312 1311 90 \r\n3 58 1313 1312 90 \r\n3 598 1313 1309 91 \r\n3 58 1303 1313 91 \r\n3 22 1309 1303 91 \r\n3 599 1316 1315 92 \r\n3 23 1314 1316 92 \r\n3 24 1315 1314 92 \r\n3 599 1315 1318 93 \r\n3 24 1317 1315 93 \r\n3 60 1318 1317 93 \r\n3 599 1318 1320 94 \r\n3 60 1319 1318 94 \r\n3 59 1320 1319 94 \r\n3 599 1320 1316 95 \r\n3 59 1310 1320 95 \r\n3 23 1316 1310 95 \r\n3 600 1323 1322 96 \r\n3 24 1321 1323 96 \r\n3 25 1322 1321 96 \r\n3 600 1322 1325 97 \r\n3 25 1324 1322 97 \r\n3 61 1325 1324 97 \r\n3 600 1325 1327 98 \r\n3 61 1326 1325 98 \r\n3 60 1327 1326 98 \r\n3 600 1327 1323 99 \r\n3 60 1317 1327 99 \r\n3 24 1323 1317 99 \r\n3 601 1330 1329 100 \r\n3 25 1328 1330 100 \r\n3 26 1329 1328 100 \r\n3 601 1329 1332 101 \r\n3 26 1331 1329 101 \r\n3 62 1332 1331 101 \r\n3 601 1332 1334 102 \r\n3 62 1333 1332 102 \r\n3 61 1334 1333 102 \r\n3 601 1334 1330 103 \r\n3 61 1324 1334 103 \r\n3 25 1330 1324 103 \r\n3 602 1337 1336 104 \r\n3 26 1335 1337 104 \r\n3 27 1336 1335 104 \r\n3 602 1336 1339 105 \r\n3 27 1338 1336 105 \r\n3 63 1339 1338 105 \r\n3 602 1339 1341 106 \r\n3 63 1340 1339 106 \r\n3 62 1341 1340 106 \r\n3 602 1341 1337 107 \r\n3 62 1331 1341 107 \r\n3 26 1337 1331 107 \r\n3 603 1344 1343 108 \r\n3 27 1342 1344 108 \r\n3 28 1343 1342 108 \r\n3 603 1343 1346 109 \r\n3 28 1345 1343 109 \r\n3 64 1346 1345 109 \r\n3 603 1346 1348 110 \r\n3 64 1347 1346 110 \r\n3 63 1348 1347 110 \r\n3 603 1348 1344 111 \r\n3 63 1338 1348 111 \r\n3 27 1344 1338 111 \r\n3 604 1351 1350 112 \r\n3 28 1349 1351 112 \r\n3 29 1350 1349 112 \r\n3 604 1350 1353 113 \r\n3 29 1352 1350 113 \r\n3 65 1353 1352 113 \r\n3 604 1353 1355 114 \r\n3 65 1354 1353 114 \r\n3 64 1355 1354 114 \r\n3 604 1355 1351 115 \r\n3 64 1345 1355 115 \r\n3 28 1351 1345 115 \r\n3 605 1358 1357 116 \r\n3 29 1356 1358 116 \r\n3 30 1357 1356 116 \r\n3 605 1357 1360 117 \r\n3 30 1359 1357 117 \r\n3 66 1360 1359 117 \r\n3 605 1360 1362 118 \r\n3 66 1361 1360 118 \r\n3 65 1362 1361 118 \r\n3 605 1362 1358 119 \r\n3 65 1352 1362 119 \r\n3 29 1358 1352 119 \r\n3 606 1365 1364 120 \r\n3 30 1363 1365 120 \r\n3 31 1364 1363 120 \r\n3 606 1364 1367 121 \r\n3 31 1366 1364 121 \r\n3 67 1367 1366 121 \r\n3 606 1367 1369 122 \r\n3 67 1368 1367 122 \r\n3 66 1369 1368 122 \r\n3 606 1369 1365 123 \r\n3 66 1359 1369 123 \r\n3 30 1365 1359 123 \r\n3 607 1372 1371 124 \r\n3 31 1370 1372 124 \r\n3 32 1371 1370 124 \r\n3 607 1371 1374 125 \r\n3 32 1373 1371 125 \r\n3 68 1374 1373 125 \r\n3 607 1374 1376 126 \r\n3 68 1375 1374 126 \r\n3 67 1376 1375 126 \r\n3 607 1376 1372 127 \r\n3 67 1366 1376 127 \r\n3 31 1372 1366 127 \r\n3 608 1379 1378 128 \r\n3 32 1377 1379 128 \r\n3 33 1378 1377 128 \r\n3 608 1378 1381 129 \r\n3 33 1380 1378 129 \r\n3 69 1381 1380 129 \r\n3 608 1381 1383 130 \r\n3 69 1382 1381 130 \r\n3 68 1383 1382 130 \r\n3 608 1383 1379 131 \r\n3 68 1373 1383 131 \r\n3 32 1379 1373 131 \r\n3 609 1386 1385 132 \r\n3 33 1384 1386 132 \r\n3 34 1385 1384 132 \r\n3 609 1385 1388 133 \r\n3 34 1387 1385 133 \r\n3 70 1388 1387 133 \r\n3 609 1388 1390 134 \r\n3 70 1389 1388 134 \r\n3 69 1390 1389 134 \r\n3 609 1390 1386 135 \r\n3 69 1380 1390 135 \r\n3 33 1386 1380 135 \r\n3 610 1393 1392 136 \r\n3 34 1391 1393 136 \r\n3 35 1392 1391 136 \r\n3 610 1392 1395 137 \r\n3 35 1394 1392 137 \r\n3 71 1395 1394 137 \r\n3 610 1395 1397 138 \r\n3 71 1396 1395 138 \r\n3 70 1397 1396 138 \r\n3 610 1397 1393 139 \r\n3 70 1387 1397 139 \r\n3 34 1393 1387 139 \r\n3 611 1400 1399 140 \r\n3 35 1398 1400 140 \r\n3 0 1399 1398 140 \r\n3 611 1399 1401 141 \r\n3 0 1159 1399 141 \r\n3 36 1401 1159 141 \r\n3 611 1401 1403 142 \r\n3 36 1402 1401 142 \r\n3 71 1403 1402 142 \r\n3 611 1403 1400 143 \r\n3 71 1394 1403 143 \r\n3 35 1400 1394 143 \r\n3 612 1405 1404 144 \r\n3 36 1157 1405 144 \r\n3 37 1404 1157 144 \r\n3 612 1404 1407 145 \r\n3 37 1406 1404 145 \r\n3 73 1407 1406 145 \r\n3 612 1407 1409 146 \r\n3 73 1408 1407 146 \r\n3 72 1409 1408 146 \r\n3 612 1409 1405 147 \r\n3 72 1410 1409 147 \r\n3 36 1405 1410 147 \r\n3 613 1412 1411 148 \r\n3 37 1165 1412 148 \r\n3 38 1411 1165 148 \r\n3 613 1411 1414 149 \r\n3 38 1413 1411 149 \r\n3 74 1414 1413 149 \r\n3 613 1414 1416 150 \r\n3 74 1415 1414 150 \r\n3 73 1416 1415 150 \r\n3 613 1416 1412 151 \r\n3 73 1406 1416 151 \r\n3 37 1412 1406 151 \r\n3 614 1418 1417 152 \r\n3 38 1172 1418 152 \r\n3 39 1417 1172 152 \r\n3 614 1417 1420 153 \r\n3 39 1419 1417 153 \r\n3 75 1420 1419 153 \r\n3 614 1420 1422 154 \r\n3 75 1421 1420 154 \r\n3 74 1422 1421 154 \r\n3 614 1422 1418 155 \r\n3 74 1413 1422 155 \r\n3 38 1418 1413 155 \r\n3 615 1424 1423 156 \r\n3 39 1179 1424 156 \r\n3 40 1423 1179 156 \r\n3 615 1423 1426 157 \r\n3 40 1425 1423 157 \r\n3 76 1426 1425 157 \r\n3 615 1426 1428 158 \r\n3 76 1427 1426 158 \r\n3 75 1428 1427 158 \r\n3 615 1428 1424 159 \r\n3 75 1419 1428 159 \r\n3 39 1424 1419 159 \r\n3 616 1430 1429 160 \r\n3 40 1186 1430 160 \r\n3 41 1429 1186 160 \r\n3 616 1429 1432 161 \r\n3 41 1431 1429 161 \r\n3 77 1432 1431 161 \r\n3 616 1432 1434 162 \r\n3 77 1433 1432 162 \r\n3 76 1434 1433 162 \r\n3 616 1434 1430 163 \r\n3 76 1425 1434 163 \r\n3 40 1430 1425 163 \r\n3 617 1436 1435 164 \r\n3 41 1193 1436 164 \r\n3 42 1435 1193 164 \r\n3 617 1435 1438 165 \r\n3 42 1437 1435 165 \r\n3 78 1438 1437 165 \r\n3 617 1438 1440 166 \r\n3 78 1439 1438 166 \r\n3 77 1440 1439 166 \r\n3 617 1440 1436 167 \r\n3 77 1431 1440 167 \r\n3 41 1436 1431 167 \r\n3 618 1442 1441 168 \r\n3 42 1200 1442 168 \r\n3 43 1441 1200 168 \r\n3 618 1441 1444 169 \r\n3 43 1443 1441 169 \r\n3 79 1444 1443 169 \r\n3 618 1444 1446 170 \r\n3 79 1445 1444 170 \r\n3 78 1446 1445 170 \r\n3 618 1446 1442 171 \r\n3 78 1437 1446 171 \r\n3 42 1442 1437 171 \r\n3 619 1448 1447 172 \r\n3 43 1207 1448 172 \r\n3 44 1447 1207 172 \r\n3 619 1447 1450 173 \r\n3 44 1449 1447 173 \r\n3 80 1450 1449 173 \r\n3 619 1450 1452 174 \r\n3 80 1451 1450 174 \r\n3 79 1452 1451 174 \r\n3 619 1452 1448 175 \r\n3 79 1443 1452 175 \r\n3 43 1448 1443 175 \r\n3 620 1454 1453 176 \r\n3 44 1214 1454 176 \r\n3 45 1453 1214 176 \r\n3 620 1453 1456 177 \r\n3 45 1455 1453 177 \r\n3 81 1456 1455 177 \r\n3 620 1456 1458 178 \r\n3 81 1457 1456 178 \r\n3 80 1458 1457 178 \r\n3 620 1458 1454 179 \r\n3 80 1449 1458 179 \r\n3 44 1454 1449 179 \r\n3 621 1460 1459 180 \r\n3 45 1221 1460 180 \r\n3 46 1459 1221 180 \r\n3 621 1459 1462 181 \r\n3 46 1461 1459 181 \r\n3 82 1462 1461 181 \r\n3 621 1462 1464 182 \r\n3 82 1463 1462 182 \r\n3 81 1464 1463 182 \r\n3 621 1464 1460 183 \r\n3 81 1455 1464 183 \r\n3 45 1460 1455 183 \r\n3 622 1466 1465 184 \r\n3 46 1228 1466 184 \r\n3 47 1465 1228 184 \r\n3 622 1465 1468 185 \r\n3 47 1467 1465 185 \r\n3 83 1468 1467 185 \r\n3 622 1468 1470 186 \r\n3 83 1469 1468 186 \r\n3 82 1470 1469 186 \r\n3 622 1470 1466 187 \r\n3 82 1461 1470 187 \r\n3 46 1466 1461 187 \r\n3 623 1472 1471 188 \r\n3 47 1235 1472 188 \r\n3 48 1471 1235 188 \r\n3 623 1471 1474 189 \r\n3 48 1473 1471 189 \r\n3 84 1474 1473 189 \r\n3 623 1474 1476 190 \r\n3 84 1475 1474 190 \r\n3 83 1476 1475 190 \r\n3 623 1476 1472 191 \r\n3 83 1467 1476 191 \r\n3 47 1472 1467 191 \r\n3 624 1478 1477 192 \r\n3 48 1242 1478 192 \r\n3 49 1477 1242 192 \r\n3 624 1477 1480 193 \r\n3 49 1479 1477 193 \r\n3 85 1480 1479 193 \r\n3 624 1480 1482 194 \r\n3 85 1481 1480 194 \r\n3 84 1482 1481 194 \r\n3 624 1482 1478 195 \r\n3 84 1473 1482 195 \r\n3 48 1478 1473 195 \r\n3 625 1484 1483 196 \r\n3 49 1249 1484 196 \r\n3 50 1483 1249 196 \r\n3 625 1483 1486 197 \r\n3 50 1485 1483 197 \r\n3 86 1486 1485 197 \r\n3 625 1486 1488 198 \r\n3 86 1487 1486 198 \r\n3 85 1488 1487 198 \r\n3 625 1488 1484 199 \r\n3 85 1479 1488 199 \r\n3 49 1484 1479 199 \r\n3 626 1490 1489 200 \r\n3 50 1256 1490 200 \r\n3 51 1489 1256 200 \r\n3 626 1489 1492 201 \r\n3 51 1491 1489 201 \r\n3 87 1492 1491 201 \r\n3 626 1492 1494 202 \r\n3 87 1493 1492 202 \r\n3 86 1494 1493 202 \r\n3 626 1494 1490 203 \r\n3 86 1485 1494 203 \r\n3 50 1490 1485 203 \r\n3 627 1496 1495 204 \r\n3 51 1263 1496 204 \r\n3 52 1495 1263 204 \r\n3 627 1495 1498 205 \r\n3 52 1497 1495 205 \r\n3 88 1498 1497 205 \r\n3 627 1498 1500 206 \r\n3 88 1499 1498 206 \r\n3 87 1500 1499 206 \r\n3 627 1500 1496 207 \r\n3 87 1491 1500 207 \r\n3 51 1496 1491 207 \r\n3 628 1502 1501 208 \r\n3 52 1270 1502 208 \r\n3 53 1501 1270 208 \r\n3 628 1501 1504 209 \r\n3 53 1503 1501 209 \r\n3 89 1504 1503 209 \r\n3 628 1504 1506 210 \r\n3 89 1505 1504 210 \r\n3 88 1506 1505 210 \r\n3 628 1506 1502 211 \r\n3 88 1497 1506 211 \r\n3 52 1502 1497 211 \r\n3 629 1508 1507 212 \r\n3 53 1277 1508 212 \r\n3 54 1507 1277 212 \r\n3 629 1507 1510 213 \r\n3 54 1509 1507 213 \r\n3 90 1510 1509 213 \r\n3 629 1510 1512 214 \r\n3 90 1511 1510 214 \r\n3 89 1512 1511 214 \r\n3 629 1512 1508 215 \r\n3 89 1503 1512 215 \r\n3 53 1508 1503 215 \r\n3 630 1514 1513 216 \r\n3 54 1284 1514 216 \r\n3 55 1513 1284 216 \r\n3 630 1513 1516 217 \r\n3 55 1515 1513 217 \r\n3 91 1516 1515 217 \r\n3 630 1516 1518 218 \r\n3 91 1517 1516 218 \r\n3 90 1518 1517 218 \r\n3 630 1518 1514 219 \r\n3 90 1509 1518 219 \r\n3 54 1514 1509 219 \r\n3 631 1520 1519 220 \r\n3 55 1291 1520 220 \r\n3 56 1519 1291 220 \r\n3 631 1519 1522 221 \r\n3 56 1521 1519 221 \r\n3 92 1522 1521 221 \r\n3 631 1522 1524 222 \r\n3 92 1523 1522 222 \r\n3 91 1524 1523 222 \r\n3 631 1524 1520 223 \r\n3 91 1515 1524 223 \r\n3 55 1520 1515 223 \r\n3 632 1526 1525 224 \r\n3 56 1298 1526 224 \r\n3 57 1525 1298 224 \r\n3 632 1525 1528 225 \r\n3 57 1527 1525 225 \r\n3 93 1528 1527 225 \r\n3 632 1528 1530 226 \r\n3 93 1529 1528 226 \r\n3 92 1530 1529 226 \r\n3 632 1530 1526 227 \r\n3 92 1521 1530 227 \r\n3 56 1526 1521 227 \r\n3 633 1532 1531 228 \r\n3 57 1305 1532 228 \r\n3 58 1531 1305 228 \r\n3 633 1531 1534 229 \r\n3 58 1533 1531 229 \r\n3 94 1534 1533 229 \r\n3 633 1534 1536 230 \r\n3 94 1535 1534 230 \r\n3 93 1536 1535 230 \r\n3 633 1536 1532 231 \r\n3 93 1527 1536 231 \r\n3 57 1532 1527 231 \r\n3 634 1538 1537 232 \r\n3 58 1312 1538 232 \r\n3 59 1537 1312 232 \r\n3 634 1537 1540 233 \r\n3 59 1539 1537 233 \r\n3 95 1540 1539 233 \r\n3 634 1540 1542 234 \r\n3 95 1541 1540 234 \r\n3 94 1542 1541 234 \r\n3 634 1542 1538 235 \r\n3 94 1533 1542 235 \r\n3 58 1538 1533 235 \r\n3 635 1544 1543 236 \r\n3 59 1319 1544 236 \r\n3 60 1543 1319 236 \r\n3 635 1543 1546 237 \r\n3 60 1545 1543 237 \r\n3 96 1546 1545 237 \r\n3 635 1546 1548 238 \r\n3 96 1547 1546 238 \r\n3 95 1548 1547 238 \r\n3 635 1548 1544 239 \r\n3 95 1539 1548 239 \r\n3 59 1544 1539 239 \r\n3 636 1550 1549 240 \r\n3 60 1326 1550 240 \r\n3 61 1549 1326 240 \r\n3 636 1549 1552 241 \r\n3 61 1551 1549 241 \r\n3 97 1552 1551 241 \r\n3 636 1552 1554 242 \r\n3 97 1553 1552 242 \r\n3 96 1554 1553 242 \r\n3 636 1554 1550 243 \r\n3 96 1545 1554 243 \r\n3 60 1550 1545 243 \r\n3 637 1556 1555 244 \r\n3 61 1333 1556 244 \r\n3 62 1555 1333 244 \r\n3 637 1555 1558 245 \r\n3 62 1557 1555 245 \r\n3 98 1558 1557 245 \r\n3 637 1558 1560 246 \r\n3 98 1559 1558 246 \r\n3 97 1560 1559 246 \r\n3 637 1560 1556 247 \r\n3 97 1551 1560 247 \r\n3 61 1556 1551 247 \r\n3 638 1562 1561 248 \r\n3 62 1340 1562 248 \r\n3 63 1561 1340 248 \r\n3 638 1561 1564 249 \r\n3 63 1563 1561 249 \r\n3 99 1564 1563 249 \r\n3 638 1564 1566 250 \r\n3 99 1565 1564 250 \r\n3 98 1566 1565 250 \r\n3 638 1566 1562 251 \r\n3 98 1557 1566 251 \r\n3 62 1562 1557 251 \r\n3 639 1568 1567 252 \r\n3 63 1347 1568 252 \r\n3 64 1567 1347 252 \r\n3 639 1567 1570 253 \r\n3 64 1569 1567 253 \r\n3 100 1570 1569 253 \r\n3 639 1570 1572 254 \r\n3 100 1571 1570 254 \r\n3 99 1572 1571 254 \r\n3 639 1572 1568 255 \r\n3 99 1563 1572 255 \r\n3 63 1568 1563 255 \r\n3 640 1574 1573 256 \r\n3 64 1354 1574 256 \r\n3 65 1573 1354 256 \r\n3 640 1573 1576 257 \r\n3 65 1575 1573 257 \r\n3 101 1576 1575 257 \r\n3 640 1576 1578 258 \r\n3 101 1577 1576 258 \r\n3 100 1578 1577 258 \r\n3 640 1578 1574 259 \r\n3 100 1569 1578 259 \r\n3 64 1574 1569 259 \r\n3 641 1580 1579 260 \r\n3 65 1361 1580 260 \r\n3 66 1579 1361 260 \r\n3 641 1579 1582 261 \r\n3 66 1581 1579 261 \r\n3 102 1582 1581 261 \r\n3 641 1582 1584 262 \r\n3 102 1583 1582 262 \r\n3 101 1584 1583 262 \r\n3 641 1584 1580 263 \r\n3 101 1575 1584 263 \r\n3 65 1580 1575 263 \r\n3 642 1586 1585 264 \r\n3 66 1368 1586 264 \r\n3 67 1585 1368 264 \r\n3 642 1585 1588 265 \r\n3 67 1587 1585 265 \r\n3 103 1588 1587 265 \r\n3 642 1588 1590 266 \r\n3 103 1589 1588 266 \r\n3 102 1590 1589 266 \r\n3 642 1590 1586 267 \r\n3 102 1581 1590 267 \r\n3 66 1586 1581 267 \r\n3 643 1592 1591 268 \r\n3 67 1375 1592 268 \r\n3 68 1591 1375 268 \r\n3 643 1591 1594 269 \r\n3 68 1593 1591 269 \r\n3 104 1594 1593 269 \r\n3 643 1594 1596 270 \r\n3 104 1595 1594 270 \r\n3 103 1596 1595 270 \r\n3 643 1596 1592 271 \r\n3 103 1587 1596 271 \r\n3 67 1592 1587 271 \r\n3 644 1598 1597 272 \r\n3 68 1382 1598 272 \r\n3 69 1597 1382 272 \r\n3 644 1597 1600 273 \r\n3 69 1599 1597 273 \r\n3 105 1600 1599 273 \r\n3 644 1600 1602 274 \r\n3 105 1601 1600 274 \r\n3 104 1602 1601 274 \r\n3 644 1602 1598 275 \r\n3 104 1593 1602 275 \r\n3 68 1598 1593 275 \r\n3 645 1604 1603 276 \r\n3 69 1389 1604 276 \r\n3 70 1603 1389 276 \r\n3 645 1603 1606 277 \r\n3 70 1605 1603 277 \r\n3 106 1606 1605 277 \r\n3 645 1606 1608 278 \r\n3 106 1607 1606 278 \r\n3 105 1608 1607 278 \r\n3 645 1608 1604 279 \r\n3 105 1599 1608 279 \r\n3 69 1604 1599 279 \r\n3 646 1610 1609 280 \r\n3 70 1396 1610 280 \r\n3 71 1609 1396 280 \r\n3 646 1609 1612 281 \r\n3 71 1611 1609 281 \r\n3 107 1612 1611 281 \r\n3 646 1612 1614 282 \r\n3 107 1613 1612 282 \r\n3 106 1614 1613 282 \r\n3 646 1614 1610 283 \r\n3 106 1605 1614 283 \r\n3 70 1610 1605 283 \r\n3 647 1616 1615 284 \r\n3 71 1402 1616 284 \r\n3 36 1615 1402 284 \r\n3 647 1615 1617 285 \r\n3 36 1410 1615 285 \r\n3 72 1617 1410 285 \r\n3 647 1617 1619 286 \r\n3 72 1618 1617 286 \r\n3 107 1619 1618 286 \r\n3 647 1619 1616 287 \r\n3 107 1611 1619 287 \r\n3 71 1616 1611 287 \r\n3 648 1621 1620 288 \r\n3 72 1408 1621 288 \r\n3 73 1620 1408 288 \r\n3 648 1620 1623 289 \r\n3 73 1622 1620 289 \r\n3 109 1623 1622 289 \r\n3 648 1623 1625 290 \r\n3 109 1624 1623 290 \r\n3 108 1625 1624 290 \r\n3 648 1625 1621 291 \r\n3 108 1626 1625 291 \r\n3 72 1621 1626 291 \r\n3 649 1628 1627 292 \r\n3 73 1415 1628 292 \r\n3 74 1627 1415 292 \r\n3 649 1627 1630 293 \r\n3 74 1629 1627 293 \r\n3 110 1630 1629 293 \r\n3 649 1630 1632 294 \r\n3 110 1631 1630 294 \r\n3 109 1632 1631 294 \r\n3 649 1632 1628 295 \r\n3 109 1622 1632 295 \r\n3 73 1628 1622 295 \r\n3 650 1634 1633 296 \r\n3 74 1421 1634 296 \r\n3 75 1633 1421 296 \r\n3 650 1633 1636 297 \r\n3 75 1635 1633 297 \r\n3 111 1636 1635 297 \r\n3 650 1636 1638 298 \r\n3 111 1637 1636 298 \r\n3 110 1638 1637 298 \r\n3 650 1638 1634 299 \r\n3 110 1629 1638 299 \r\n3 74 1634 1629 299 \r\n3 651 1640 1639 300 \r\n3 75 1427 1640 300 \r\n3 76 1639 1427 300 \r\n3 651 1639 1642 301 \r\n3 76 1641 1639 301 \r\n3 112 1642 1641 301 \r\n3 651 1642 1644 302 \r\n3 112 1643 1642 302 \r\n3 111 1644 1643 302 \r\n3 651 1644 1640 303 \r\n3 111 1635 1644 303 \r\n3 75 1640 1635 303 \r\n3 652 1646 1645 304 \r\n3 76 1433 1646 304 \r\n3 77 1645 1433 304 \r\n3 652 1645 1648 305 \r\n3 77 1647 1645 305 \r\n3 113 1648 1647 305 \r\n3 652 1648 1650 306 \r\n3 113 1649 1648 306 \r\n3 112 1650 1649 306 \r\n3 652 1650 1646 307 \r\n3 112 1641 1650 307 \r\n3 76 1646 1641 307 \r\n3 653 1652 1651 308 \r\n3 77 1439 1652 308 \r\n3 78 1651 1439 308 \r\n3 653 1651 1654 309 \r\n3 78 1653 1651 309 \r\n3 114 1654 1653 309 \r\n3 653 1654 1656 310 \r\n3 114 1655 1654 310 \r\n3 113 1656 1655 310 \r\n3 653 1656 1652 311 \r\n3 113 1647 1656 311 \r\n3 77 1652 1647 311 \r\n3 654 1658 1657 312 \r\n3 78 1445 1658 312 \r\n3 79 1657 1445 312 \r\n3 654 1657 1660 313 \r\n3 79 1659 1657 313 \r\n3 115 1660 1659 313 \r\n3 654 1660 1662 314 \r\n3 115 1661 1660 314 \r\n3 114 1662 1661 314 \r\n3 654 1662 1658 315 \r\n3 114 1653 1662 315 \r\n3 78 1658 1653 315 \r\n3 655 1664 1663 316 \r\n3 79 1451 1664 316 \r\n3 80 1663 1451 316 \r\n3 655 1663 1666 317 \r\n3 80 1665 1663 317 \r\n3 116 1666 1665 317 \r\n3 655 1666 1668 318 \r\n3 116 1667 1666 318 \r\n3 115 1668 1667 318 \r\n3 655 1668 1664 319 \r\n3 115 1659 1668 319 \r\n3 79 1664 1659 319 \r\n3 656 1670 1669 320 \r\n3 80 1457 1670 320 \r\n3 81 1669 1457 320 \r\n3 656 1669 1672 321 \r\n3 81 1671 1669 321 \r\n3 117 1672 1671 321 \r\n3 656 1672 1674 322 \r\n3 117 1673 1672 322 \r\n3 116 1674 1673 322 \r\n3 656 1674 1670 323 \r\n3 116 1665 1674 323 \r\n3 80 1670 1665 323 \r\n3 657 1676 1675 324 \r\n3 81 1463 1676 324 \r\n3 82 1675 1463 324 \r\n3 657 1675 1678 325 \r\n3 82 1677 1675 325 \r\n3 118 1678 1677 325 \r\n3 657 1678 1680 326 \r\n3 118 1679 1678 326 \r\n3 117 1680 1679 326 \r\n3 657 1680 1676 327 \r\n3 117 1671 1680 327 \r\n3 81 1676 1671 327 \r\n3 658 1682 1681 328 \r\n3 82 1469 1682 328 \r\n3 83 1681 1469 328 \r\n3 658 1681 1684 329 \r\n3 83 1683 1681 329 \r\n3 119 1684 1683 329 \r\n3 658 1684 1686 330 \r\n3 119 1685 1684 330 \r\n3 118 1686 1685 330 \r\n3 658 1686 1682 331 \r\n3 118 1677 1686 331 \r\n3 82 1682 1677 331 \r\n3 659 1688 1687 332 \r\n3 83 1475 1688 332 \r\n3 84 1687 1475 332 \r\n3 659 1687 1690 333 \r\n3 84 1689 1687 333 \r\n3 120 1690 1689 333 \r\n3 659 1690 1692 334 \r\n3 120 1691 1690 334 \r\n3 119 1692 1691 334 \r\n3 659 1692 1688 335 \r\n3 119 1683 1692 335 \r\n3 83 1688 1683 335 \r\n3 660 1694 1693 336 \r\n3 84 1481 1694 336 \r\n3 85 1693 1481 336 \r\n3 660 1693 1696 337 \r\n3 85 1695 1693 337 \r\n3 121 1696 1695 337 \r\n3 660 1696 1698 338 \r\n3 121 1697 1696 338 \r\n3 120 1698 1697 338 \r\n3 660 1698 1694 339 \r\n3 120 1689 1698 339 \r\n3 84 1694 1689 339 \r\n3 661 1700 1699 340 \r\n3 85 1487 1700 340 \r\n3 86 1699 1487 340 \r\n3 661 1699 1702 341 \r\n3 86 1701 1699 341 \r\n3 122 1702 1701 341 \r\n3 661 1702 1704 342 \r\n3 122 1703 1702 342 \r\n3 121 1704 1703 342 \r\n3 661 1704 1700 343 \r\n3 121 1695 1704 343 \r\n3 85 1700 1695 343 \r\n3 662 1706 1705 344 \r\n3 86 1493 1706 344 \r\n3 87 1705 1493 344 \r\n3 662 1705 1708 345 \r\n3 87 1707 1705 345 \r\n3 123 1708 1707 345 \r\n3 662 1708 1710 346 \r\n3 123 1709 1708 346 \r\n3 122 1710 1709 346 \r\n3 662 1710 1706 347 \r\n3 122 1701 1710 347 \r\n3 86 1706 1701 347 \r\n3 663 1712 1711 348 \r\n3 87 1499 1712 348 \r\n3 88 1711 1499 348 \r\n3 663 1711 1714 349 \r\n3 88 1713 1711 349 \r\n3 124 1714 1713 349 \r\n3 663 1714 1716 350 \r\n3 124 1715 1714 350 \r\n3 123 1716 1715 350 \r\n3 663 1716 1712 351 \r\n3 123 1707 1716 351 \r\n3 87 1712 1707 351 \r\n3 664 1718 1717 352 \r\n3 88 1505 1718 352 \r\n3 89 1717 1505 352 \r\n3 664 1717 1720 353 \r\n3 89 1719 1717 353 \r\n3 125 1720 1719 353 \r\n3 664 1720 1722 354 \r\n3 125 1721 1720 354 \r\n3 124 1722 1721 354 \r\n3 664 1722 1718 355 \r\n3 124 1713 1722 355 \r\n3 88 1718 1713 355 \r\n3 665 1724 1723 356 \r\n3 89 1511 1724 356 \r\n3 90 1723 1511 356 \r\n3 665 1723 1726 357 \r\n3 90 1725 1723 357 \r\n3 126 1726 1725 357 \r\n3 665 1726 1728 358 \r\n3 126 1727 1726 358 \r\n3 125 1728 1727 358 \r\n3 665 1728 1724 359 \r\n3 125 1719 1728 359 \r\n3 89 1724 1719 359 \r\n3 666 1730 1729 360 \r\n3 90 1517 1730 360 \r\n3 91 1729 1517 360 \r\n3 666 1729 1732 361 \r\n3 91 1731 1729 361 \r\n3 127 1732 1731 361 \r\n3 666 1732 1734 362 \r\n3 127 1733 1732 362 \r\n3 126 1734 1733 362 \r\n3 666 1734 1730 363 \r\n3 126 1725 1734 363 \r\n3 90 1730 1725 363 \r\n3 667 1736 1735 364 \r\n3 91 1523 1736 364 \r\n3 92 1735 1523 364 \r\n3 667 1735 1738 365 \r\n3 92 1737 1735 365 \r\n3 128 1738 1737 365 \r\n3 667 1738 1740 366 \r\n3 128 1739 1738 366 \r\n3 127 1740 1739 366 \r\n3 667 1740 1736 367 \r\n3 127 1731 1740 367 \r\n3 91 1736 1731 367 \r\n3 668 1742 1741 368 \r\n3 92 1529 1742 368 \r\n3 93 1741 1529 368 \r\n3 668 1741 1744 369 \r\n3 93 1743 1741 369 \r\n3 129 1744 1743 369 \r\n3 668 1744 1746 370 \r\n3 129 1745 1744 370 \r\n3 128 1746 1745 370 \r\n3 668 1746 1742 371 \r\n3 128 1737 1746 371 \r\n3 92 1742 1737 371 \r\n3 669 1748 1747 372 \r\n3 93 1535 1748 372 \r\n3 94 1747 1535 372 \r\n3 669 1747 1750 373 \r\n3 94 1749 1747 373 \r\n3 130 1750 1749 373 \r\n3 669 1750 1752 374 \r\n3 130 1751 1750 374 \r\n3 129 1752 1751 374 \r\n3 669 1752 1748 375 \r\n3 129 1743 1752 375 \r\n3 93 1748 1743 375 \r\n3 670 1754 1753 376 \r\n3 94 1541 1754 376 \r\n3 95 1753 1541 376 \r\n3 670 1753 1756 377 \r\n3 95 1755 1753 377 \r\n3 131 1756 1755 377 \r\n3 670 1756 1758 378 \r\n3 131 1757 1756 378 \r\n3 130 1758 1757 378 \r\n3 670 1758 1754 379 \r\n3 130 1749 1758 379 \r\n3 94 1754 1749 379 \r\n3 671 1760 1759 380 \r\n3 95 1547 1760 380 \r\n3 96 1759 1547 380 \r\n3 671 1759 1762 381 \r\n3 96 1761 1759 381 \r\n3 132 1762 1761 381 \r\n3 671 1762 1764 382 \r\n3 132 1763 1762 382 \r\n3 131 1764 1763 382 \r\n3 671 1764 1760 383 \r\n3 131 1755 1764 383 \r\n3 95 1760 1755 383 \r\n3 672 1766 1765 384 \r\n3 96 1553 1766 384 \r\n3 97 1765 1553 384 \r\n3 672 1765 1768 385 \r\n3 97 1767 1765 385 \r\n3 133 1768 1767 385 \r\n3 672 1768 1770 386 \r\n3 133 1769 1768 386 \r\n3 132 1770 1769 386 \r\n3 672 1770 1766 387 \r\n3 132 1761 1770 387 \r\n3 96 1766 1761 387 \r\n3 673 1772 1771 388 \r\n3 97 1559 1772 388 \r\n3 98 1771 1559 388 \r\n3 673 1771 1774 389 \r\n3 98 1773 1771 389 \r\n3 134 1774 1773 389 \r\n3 673 1774 1776 390 \r\n3 134 1775 1774 390 \r\n3 133 1776 1775 390 \r\n3 673 1776 1772 391 \r\n3 133 1767 1776 391 \r\n3 97 1772 1767 391 \r\n3 674 1778 1777 392 \r\n3 98 1565 1778 392 \r\n3 99 1777 1565 392 \r\n3 674 1777 1780 393 \r\n3 99 1779 1777 393 \r\n3 135 1780 1779 393 \r\n3 674 1780 1782 394 \r\n3 135 1781 1780 394 \r\n3 134 1782 1781 394 \r\n3 674 1782 1778 395 \r\n3 134 1773 1782 395 \r\n3 98 1778 1773 395 \r\n3 675 1784 1783 396 \r\n3 99 1571 1784 396 \r\n3 100 1783 1571 396 \r\n3 675 1783 1786 397 \r\n3 100 1785 1783 397 \r\n3 136 1786 1785 397 \r\n3 675 1786 1788 398 \r\n3 136 1787 1786 398 \r\n3 135 1788 1787 398 \r\n3 675 1788 1784 399 \r\n3 135 1779 1788 399 \r\n3 99 1784 1779 399 \r\n3 676 1790 1789 400 \r\n3 100 1577 1790 400 \r\n3 101 1789 1577 400 \r\n3 676 1789 1792 401 \r\n3 101 1791 1789 401 \r\n3 137 1792 1791 401 \r\n3 676 1792 1794 402 \r\n3 137 1793 1792 402 \r\n3 136 1794 1793 402 \r\n3 676 1794 1790 403 \r\n3 136 1785 1794 403 \r\n3 100 1790 1785 403 \r\n3 677 1796 1795 404 \r\n3 101 1583 1796 404 \r\n3 102 1795 1583 404 \r\n3 677 1795 1798 405 \r\n3 102 1797 1795 405 \r\n3 138 1798 1797 405 \r\n3 677 1798 1800 406 \r\n3 138 1799 1798 406 \r\n3 137 1800 1799 406 \r\n3 677 1800 1796 407 \r\n3 137 1791 1800 407 \r\n3 101 1796 1791 407 \r\n3 678 1802 1801 408 \r\n3 102 1589 1802 408 \r\n3 103 1801 1589 408 \r\n3 678 1801 1804 409 \r\n3 103 1803 1801 409 \r\n3 139 1804 1803 409 \r\n3 678 1804 1806 410 \r\n3 139 1805 1804 410 \r\n3 138 1806 1805 410 \r\n3 678 1806 1802 411 \r\n3 138 1797 1806 411 \r\n3 102 1802 1797 411 \r\n3 679 1808 1807 412 \r\n3 103 1595 1808 412 \r\n3 104 1807 1595 412 \r\n3 679 1807 1810 413 \r\n3 104 1809 1807 413 \r\n3 140 1810 1809 413 \r\n3 679 1810 1812 414 \r\n3 140 1811 1810 414 \r\n3 139 1812 1811 414 \r\n3 679 1812 1808 415 \r\n3 139 1803 1812 415 \r\n3 103 1808 1803 415 \r\n3 680 1814 1813 416 \r\n3 104 1601 1814 416 \r\n3 105 1813 1601 416 \r\n3 680 1813 1816 417 \r\n3 105 1815 1813 417 \r\n3 141 1816 1815 417 \r\n3 680 1816 1818 418 \r\n3 141 1817 1816 418 \r\n3 140 1818 1817 418 \r\n3 680 1818 1814 419 \r\n3 140 1809 1818 419 \r\n3 104 1814 1809 419 \r\n3 681 1820 1819 420 \r\n3 105 1607 1820 420 \r\n3 106 1819 1607 420 \r\n3 681 1819 1822 421 \r\n3 106 1821 1819 421 \r\n3 142 1822 1821 421 \r\n3 681 1822 1824 422 \r\n3 142 1823 1822 422 \r\n3 141 1824 1823 422 \r\n3 681 1824 1820 423 \r\n3 141 1815 1824 423 \r\n3 105 1820 1815 423 \r\n3 682 1826 1825 424 \r\n3 106 1613 1826 424 \r\n3 107 1825 1613 424 \r\n3 682 1825 1828 425 \r\n3 107 1827 1825 425 \r\n3 143 1828 1827 425 \r\n3 682 1828 1830 426 \r\n3 143 1829 1828 426 \r\n3 142 1830 1829 426 \r\n3 682 1830 1826 427 \r\n3 142 1821 1830 427 \r\n3 106 1826 1821 427 \r\n3 683 1832 1831 428 \r\n3 107 1618 1832 428 \r\n3 72 1831 1618 428 \r\n3 683 1831 1833 429 \r\n3 72 1626 1831 429 \r\n3 108 1833 1626 429 \r\n3 683 1833 1835 430 \r\n3 108 1834 1833 430 \r\n3 143 1835 1834 430 \r\n3 683 1835 1832 431 \r\n3 143 1827 1835 431 \r\n3 107 1832 1827 431 \r\n3 684 1837 1836 432 \r\n3 108 1624 1837 432 \r\n3 109 1836 1624 432 \r\n3 684 1836 1839 433 \r\n3 109 1838 1836 433 \r\n3 145 1839 1838 433 \r\n3 684 1839 1841 434 \r\n3 145 1840 1839 434 \r\n3 144 1841 1840 434 \r\n3 684 1841 1837 435 \r\n3 144 1842 1841 435 \r\n3 108 1837 1842 435 \r\n3 685 1844 1843 436 \r\n3 109 1631 1844 436 \r\n3 110 1843 1631 436 \r\n3 685 1843 1846 437 \r\n3 110 1845 1843 437 \r\n3 146 1846 1845 437 \r\n3 685 1846 1848 438 \r\n3 146 1847 1846 438 \r\n3 145 1848 1847 438 \r\n3 685 1848 1844 439 \r\n3 145 1838 1848 439 \r\n3 109 1844 1838 439 \r\n3 686 1850 1849 440 \r\n3 110 1637 1850 440 \r\n3 111 1849 1637 440 \r\n3 686 1849 1852 441 \r\n3 111 1851 1849 441 \r\n3 147 1852 1851 441 \r\n3 686 1852 1854 442 \r\n3 147 1853 1852 442 \r\n3 146 1854 1853 442 \r\n3 686 1854 1850 443 \r\n3 146 1845 1854 443 \r\n3 110 1850 1845 443 \r\n3 687 1856 1855 444 \r\n3 111 1643 1856 444 \r\n3 112 1855 1643 444 \r\n3 687 1855 1858 445 \r\n3 112 1857 1855 445 \r\n3 148 1858 1857 445 \r\n3 687 1858 1860 446 \r\n3 148 1859 1858 446 \r\n3 147 1860 1859 446 \r\n3 687 1860 1856 447 \r\n3 147 1851 1860 447 \r\n3 111 1856 1851 447 \r\n3 688 1862 1861 448 \r\n3 112 1649 1862 448 \r\n3 113 1861 1649 448 \r\n3 688 1861 1864 449 \r\n3 113 1863 1861 449 \r\n3 149 1864 1863 449 \r\n3 688 1864 1866 450 \r\n3 149 1865 1864 450 \r\n3 148 1866 1865 450 \r\n3 688 1866 1862 451 \r\n3 148 1857 1866 451 \r\n3 112 1862 1857 451 \r\n3 689 1868 1867 452 \r\n3 113 1655 1868 452 \r\n3 114 1867 1655 452 \r\n3 689 1867 1870 453 \r\n3 114 1869 1867 453 \r\n3 150 1870 1869 453 \r\n3 689 1870 1872 454 \r\n3 150 1871 1870 454 \r\n3 149 1872 1871 454 \r\n3 689 1872 1868 455 \r\n3 149 1863 1872 455 \r\n3 113 1868 1863 455 \r\n3 690 1874 1873 456 \r\n3 114 1661 1874 456 \r\n3 115 1873 1661 456 \r\n3 690 1873 1876 457 \r\n3 115 1875 1873 457 \r\n3 151 1876 1875 457 \r\n3 690 1876 1878 458 \r\n3 151 1877 1876 458 \r\n3 150 1878 1877 458 \r\n3 690 1878 1874 459 \r\n3 150 1869 1878 459 \r\n3 114 1874 1869 459 \r\n3 691 1880 1879 460 \r\n3 115 1667 1880 460 \r\n3 116 1879 1667 460 \r\n3 691 1879 1882 461 \r\n3 116 1881 1879 461 \r\n3 152 1882 1881 461 \r\n3 691 1882 1884 462 \r\n3 152 1883 1882 462 \r\n3 151 1884 1883 462 \r\n3 691 1884 1880 463 \r\n3 151 1875 1884 463 \r\n3 115 1880 1875 463 \r\n3 692 1886 1885 464 \r\n3 116 1673 1886 464 \r\n3 117 1885 1673 464 \r\n3 692 1885 1888 465 \r\n3 117 1887 1885 465 \r\n3 153 1888 1887 465 \r\n3 692 1888 1890 466 \r\n3 153 1889 1888 466 \r\n3 152 1890 1889 466 \r\n3 692 1890 1886 467 \r\n3 152 1881 1890 467 \r\n3 116 1886 1881 467 \r\n3 693 1892 1891 468 \r\n3 117 1679 1892 468 \r\n3 118 1891 1679 468 \r\n3 693 1891 1894 469 \r\n3 118 1893 1891 469 \r\n3 154 1894 1893 469 \r\n3 693 1894 1896 470 \r\n3 154 1895 1894 470 \r\n3 153 1896 1895 470 \r\n3 693 1896 1892 471 \r\n3 153 1887 1896 471 \r\n3 117 1892 1887 471 \r\n3 694 1898 1897 472 \r\n3 118 1685 1898 472 \r\n3 119 1897 1685 472 \r\n3 694 1897 1900 473 \r\n3 119 1899 1897 473 \r\n3 155 1900 1899 473 \r\n3 694 1900 1902 474 \r\n3 155 1901 1900 474 \r\n3 154 1902 1901 474 \r\n3 694 1902 1898 475 \r\n3 154 1893 1902 475 \r\n3 118 1898 1893 475 \r\n3 695 1904 1903 476 \r\n3 119 1691 1904 476 \r\n3 120 1903 1691 476 \r\n3 695 1903 1906 477 \r\n3 120 1905 1903 477 \r\n3 156 1906 1905 477 \r\n3 695 1906 1908 478 \r\n3 156 1907 1906 478 \r\n3 155 1908 1907 478 \r\n3 695 1908 1904 479 \r\n3 155 1899 1908 479 \r\n3 119 1904 1899 479 \r\n3 696 1910 1909 480 \r\n3 120 1697 1910 480 \r\n3 121 1909 1697 480 \r\n3 696 1909 1912 481 \r\n3 121 1911 1909 481 \r\n3 157 1912 1911 481 \r\n3 696 1912 1914 482 \r\n3 157 1913 1912 482 \r\n3 156 1914 1913 482 \r\n3 696 1914 1910 483 \r\n3 156 1905 1914 483 \r\n3 120 1910 1905 483 \r\n3 697 1916 1915 484 \r\n3 121 1703 1916 484 \r\n3 122 1915 1703 484 \r\n3 697 1915 1918 485 \r\n3 122 1917 1915 485 \r\n3 158 1918 1917 485 \r\n3 697 1918 1920 486 \r\n3 158 1919 1918 486 \r\n3 157 1920 1919 486 \r\n3 697 1920 1916 487 \r\n3 157 1911 1920 487 \r\n3 121 1916 1911 487 \r\n3 698 1922 1921 488 \r\n3 122 1709 1922 488 \r\n3 123 1921 1709 488 \r\n3 698 1921 1924 489 \r\n3 123 1923 1921 489 \r\n3 159 1924 1923 489 \r\n3 698 1924 1926 490 \r\n3 159 1925 1924 490 \r\n3 158 1926 1925 490 \r\n3 698 1926 1922 491 \r\n3 158 1917 1926 491 \r\n3 122 1922 1917 491 \r\n3 699 1928 1927 492 \r\n3 123 1715 1928 492 \r\n3 124 1927 1715 492 \r\n3 699 1927 1930 493 \r\n3 124 1929 1927 493 \r\n3 160 1930 1929 493 \r\n3 699 1930 1932 494 \r\n3 160 1931 1930 494 \r\n3 159 1932 1931 494 \r\n3 699 1932 1928 495 \r\n3 159 1923 1932 495 \r\n3 123 1928 1923 495 \r\n3 700 1934 1933 496 \r\n3 124 1721 1934 496 \r\n3 125 1933 1721 496 \r\n3 700 1933 1936 497 \r\n3 125 1935 1933 497 \r\n3 161 1936 1935 497 \r\n3 700 1936 1938 498 \r\n3 161 1937 1936 498 \r\n3 160 1938 1937 498 \r\n3 700 1938 1934 499 \r\n3 160 1929 1938 499 \r\n3 124 1934 1929 499 \r\n3 701 1940 1939 500 \r\n3 125 1727 1940 500 \r\n3 126 1939 1727 500 \r\n3 701 1939 1942 501 \r\n3 126 1941 1939 501 \r\n3 162 1942 1941 501 \r\n3 701 1942 1944 502 \r\n3 162 1943 1942 502 \r\n3 161 1944 1943 502 \r\n3 701 1944 1940 503 \r\n3 161 1935 1944 503 \r\n3 125 1940 1935 503 \r\n3 702 1946 1945 504 \r\n3 126 1733 1946 504 \r\n3 127 1945 1733 504 \r\n3 702 1945 1948 505 \r\n3 127 1947 1945 505 \r\n3 163 1948 1947 505 \r\n3 702 1948 1950 506 \r\n3 163 1949 1948 506 \r\n3 162 1950 1949 506 \r\n3 702 1950 1946 507 \r\n3 162 1941 1950 507 \r\n3 126 1946 1941 507 \r\n3 703 1952 1951 508 \r\n3 127 1739 1952 508 \r\n3 128 1951 1739 508 \r\n3 703 1951 1954 509 \r\n3 128 1953 1951 509 \r\n3 164 1954 1953 509 \r\n3 703 1954 1956 510 \r\n3 164 1955 1954 510 \r\n3 163 1956 1955 510 \r\n3 703 1956 1952 511 \r\n3 163 1947 1956 511 \r\n3 127 1952 1947 511 \r\n3 704 1958 1957 512 \r\n3 128 1745 1958 512 \r\n3 129 1957 1745 512 \r\n3 704 1957 1960 513 \r\n3 129 1959 1957 513 \r\n3 165 1960 1959 513 \r\n3 704 1960 1962 514 \r\n3 165 1961 1960 514 \r\n3 164 1962 1961 514 \r\n3 704 1962 1958 515 \r\n3 164 1953 1962 515 \r\n3 128 1958 1953 515 \r\n3 705 1964 1963 516 \r\n3 129 1751 1964 516 \r\n3 130 1963 1751 516 \r\n3 705 1963 1966 517 \r\n3 130 1965 1963 517 \r\n3 166 1966 1965 517 \r\n3 705 1966 1968 518 \r\n3 166 1967 1966 518 \r\n3 165 1968 1967 518 \r\n3 705 1968 1964 519 \r\n3 165 1959 1968 519 \r\n3 129 1964 1959 519 \r\n3 706 1970 1969 520 \r\n3 130 1757 1970 520 \r\n3 131 1969 1757 520 \r\n3 706 1969 1972 521 \r\n3 131 1971 1969 521 \r\n3 167 1972 1971 521 \r\n3 706 1972 1974 522 \r\n3 167 1973 1972 522 \r\n3 166 1974 1973 522 \r\n3 706 1974 1970 523 \r\n3 166 1965 1974 523 \r\n3 130 1970 1965 523 \r\n3 707 1976 1975 524 \r\n3 131 1763 1976 524 \r\n3 132 1975 1763 524 \r\n3 707 1975 1978 525 \r\n3 132 1977 1975 525 \r\n3 168 1978 1977 525 \r\n3 707 1978 1980 526 \r\n3 168 1979 1978 526 \r\n3 167 1980 1979 526 \r\n3 707 1980 1976 527 \r\n3 167 1971 1980 527 \r\n3 131 1976 1971 527 \r\n3 708 1982 1981 528 \r\n3 132 1769 1982 528 \r\n3 133 1981 1769 528 \r\n3 708 1981 1984 529 \r\n3 133 1983 1981 529 \r\n3 169 1984 1983 529 \r\n3 708 1984 1986 530 \r\n3 169 1985 1984 530 \r\n3 168 1986 1985 530 \r\n3 708 1986 1982 531 \r\n3 168 1977 1986 531 \r\n3 132 1982 1977 531 \r\n3 709 1988 1987 532 \r\n3 133 1775 1988 532 \r\n3 134 1987 1775 532 \r\n3 709 1987 1990 533 \r\n3 134 1989 1987 533 \r\n3 170 1990 1989 533 \r\n3 709 1990 1992 534 \r\n3 170 1991 1990 534 \r\n3 169 1992 1991 534 \r\n3 709 1992 1988 535 \r\n3 169 1983 1992 535 \r\n3 133 1988 1983 535 \r\n3 710 1994 1993 536 \r\n3 134 1781 1994 536 \r\n3 135 1993 1781 536 \r\n3 710 1993 1996 537 \r\n3 135 1995 1993 537 \r\n3 171 1996 1995 537 \r\n3 710 1996 1998 538 \r\n3 171 1997 1996 538 \r\n3 170 1998 1997 538 \r\n3 710 1998 1994 539 \r\n3 170 1989 1998 539 \r\n3 134 1994 1989 539 \r\n3 711 2000 1999 540 \r\n3 135 1787 2000 540 \r\n3 136 1999 1787 540 \r\n3 711 1999 2002 541 \r\n3 136 2001 1999 541 \r\n3 172 2002 2001 541 \r\n3 711 2002 2004 542 \r\n3 172 2003 2002 542 \r\n3 171 2004 2003 542 \r\n3 711 2004 2000 543 \r\n3 171 1995 2004 543 \r\n3 135 2000 1995 543 \r\n3 712 2006 2005 544 \r\n3 136 1793 2006 544 \r\n3 137 2005 1793 544 \r\n3 712 2005 2008 545 \r\n3 137 2007 2005 545 \r\n3 173 2008 2007 545 \r\n3 712 2008 2010 546 \r\n3 173 2009 2008 546 \r\n3 172 2010 2009 546 \r\n3 712 2010 2006 547 \r\n3 172 2001 2010 547 \r\n3 136 2006 2001 547 \r\n3 713 2012 2011 548 \r\n3 137 1799 2012 548 \r\n3 138 2011 1799 548 \r\n3 713 2011 2014 549 \r\n3 138 2013 2011 549 \r\n3 174 2014 2013 549 \r\n3 713 2014 2016 550 \r\n3 174 2015 2014 550 \r\n3 173 2016 2015 550 \r\n3 713 2016 2012 551 \r\n3 173 2007 2016 551 \r\n3 137 2012 2007 551 \r\n3 714 2018 2017 552 \r\n3 138 1805 2018 552 \r\n3 139 2017 1805 552 \r\n3 714 2017 2020 553 \r\n3 139 2019 2017 553 \r\n3 175 2020 2019 553 \r\n3 714 2020 2022 554 \r\n3 175 2021 2020 554 \r\n3 174 2022 2021 554 \r\n3 714 2022 2018 555 \r\n3 174 2013 2022 555 \r\n3 138 2018 2013 555 \r\n3 715 2024 2023 556 \r\n3 139 1811 2024 556 \r\n3 140 2023 1811 556 \r\n3 715 2023 2026 557 \r\n3 140 2025 2023 557 \r\n3 176 2026 2025 557 \r\n3 715 2026 2028 558 \r\n3 176 2027 2026 558 \r\n3 175 2028 2027 558 \r\n3 715 2028 2024 559 \r\n3 175 2019 2028 559 \r\n3 139 2024 2019 559 \r\n3 716 2030 2029 560 \r\n3 140 1817 2030 560 \r\n3 141 2029 1817 560 \r\n3 716 2029 2032 561 \r\n3 141 2031 2029 561 \r\n3 177 2032 2031 561 \r\n3 716 2032 2034 562 \r\n3 177 2033 2032 562 \r\n3 176 2034 2033 562 \r\n3 716 2034 2030 563 \r\n3 176 2025 2034 563 \r\n3 140 2030 2025 563 \r\n3 717 2036 2035 564 \r\n3 141 1823 2036 564 \r\n3 142 2035 1823 564 \r\n3 717 2035 2038 565 \r\n3 142 2037 2035 565 \r\n3 178 2038 2037 565 \r\n3 717 2038 2040 566 \r\n3 178 2039 2038 566 \r\n3 177 2040 2039 566 \r\n3 717 2040 2036 567 \r\n3 177 2031 2040 567 \r\n3 141 2036 2031 567 \r\n3 718 2042 2041 568 \r\n3 142 1829 2042 568 \r\n3 143 2041 1829 568 \r\n3 718 2041 2044 569 \r\n3 143 2043 2041 569 \r\n3 179 2044 2043 569 \r\n3 718 2044 2046 570 \r\n3 179 2045 2044 570 \r\n3 178 2046 2045 570 \r\n3 718 2046 2042 571 \r\n3 178 2037 2046 571 \r\n3 142 2042 2037 571 \r\n3 719 2048 2047 572 \r\n3 143 1834 2048 572 \r\n3 108 2047 1834 572 \r\n3 719 2047 2049 573 \r\n3 108 1842 2047 573 \r\n3 144 2049 1842 573 \r\n3 719 2049 2051 574 \r\n3 144 2050 2049 574 \r\n3 179 2051 2050 574 \r\n3 719 2051 2048 575 \r\n3 179 2043 2051 575 \r\n3 143 2048 2043 575 \r\n3 720 2053 2052 576 \r\n3 144 1840 2053 576 \r\n3 145 2052 1840 576 \r\n3 720 2052 2055 577 \r\n3 145 2054 2052 577 \r\n3 181 2055 2054 577 \r\n3 720 2055 2057 578 \r\n3 181 2056 2055 578 \r\n3 180 2057 2056 578 \r\n3 720 2057 2053 579 \r\n3 180 2058 2057 579 \r\n3 144 2053 2058 579 \r\n3 721 2060 2059 580 \r\n3 145 1847 2060 580 \r\n3 146 2059 1847 580 \r\n3 721 2059 2062 581 \r\n3 146 2061 2059 581 \r\n3 182 2062 2061 581 \r\n3 721 2062 2064 582 \r\n3 182 2063 2062 582 \r\n3 181 2064 2063 582 \r\n3 721 2064 2060 583 \r\n3 181 2054 2064 583 \r\n3 145 2060 2054 583 \r\n3 722 2066 2065 584 \r\n3 146 1853 2066 584 \r\n3 147 2065 1853 584 \r\n3 722 2065 2068 585 \r\n3 147 2067 2065 585 \r\n3 183 2068 2067 585 \r\n3 722 2068 2070 586 \r\n3 183 2069 2068 586 \r\n3 182 2070 2069 586 \r\n3 722 2070 2066 587 \r\n3 182 2061 2070 587 \r\n3 146 2066 2061 587 \r\n3 723 2072 2071 588 \r\n3 147 1859 2072 588 \r\n3 148 2071 1859 588 \r\n3 723 2071 2074 589 \r\n3 148 2073 2071 589 \r\n3 184 2074 2073 589 \r\n3 723 2074 2076 590 \r\n3 184 2075 2074 590 \r\n3 183 2076 2075 590 \r\n3 723 2076 2072 591 \r\n3 183 2067 2076 591 \r\n3 147 2072 2067 591 \r\n3 724 2078 2077 592 \r\n3 148 1865 2078 592 \r\n3 149 2077 1865 592 \r\n3 724 2077 2080 593 \r\n3 149 2079 2077 593 \r\n3 185 2080 2079 593 \r\n3 724 2080 2082 594 \r\n3 185 2081 2080 594 \r\n3 184 2082 2081 594 \r\n3 724 2082 2078 595 \r\n3 184 2073 2082 595 \r\n3 148 2078 2073 595 \r\n3 725 2084 2083 596 \r\n3 149 1871 2084 596 \r\n3 150 2083 1871 596 \r\n3 725 2083 2086 597 \r\n3 150 2085 2083 597 \r\n3 186 2086 2085 597 \r\n3 725 2086 2088 598 \r\n3 186 2087 2086 598 \r\n3 185 2088 2087 598 \r\n3 725 2088 2084 599 \r\n3 185 2079 2088 599 \r\n3 149 2084 2079 599 \r\n3 726 2090 2089 600 \r\n3 150 1877 2090 600 \r\n3 151 2089 1877 600 \r\n3 726 2089 2092 601 \r\n3 151 2091 2089 601 \r\n3 187 2092 2091 601 \r\n3 726 2092 2094 602 \r\n3 187 2093 2092 602 \r\n3 186 2094 2093 602 \r\n3 726 2094 2090 603 \r\n3 186 2085 2094 603 \r\n3 150 2090 2085 603 \r\n3 727 2096 2095 604 \r\n3 151 1883 2096 604 \r\n3 152 2095 1883 604 \r\n3 727 2095 2098 605 \r\n3 152 2097 2095 605 \r\n3 188 2098 2097 605 \r\n3 727 2098 2100 606 \r\n3 188 2099 2098 606 \r\n3 187 2100 2099 606 \r\n3 727 2100 2096 607 \r\n3 187 2091 2100 607 \r\n3 151 2096 2091 607 \r\n3 728 2102 2101 608 \r\n3 152 1889 2102 608 \r\n3 153 2101 1889 608 \r\n3 728 2101 2104 609 \r\n3 153 2103 2101 609 \r\n3 189 2104 2103 609 \r\n3 728 2104 2106 610 \r\n3 189 2105 2104 610 \r\n3 188 2106 2105 610 \r\n3 728 2106 2102 611 \r\n3 188 2097 2106 611 \r\n3 152 2102 2097 611 \r\n3 729 2108 2107 612 \r\n3 153 1895 2108 612 \r\n3 154 2107 1895 612 \r\n3 729 2107 2110 613 \r\n3 154 2109 2107 613 \r\n3 190 2110 2109 613 \r\n3 729 2110 2112 614 \r\n3 190 2111 2110 614 \r\n3 189 2112 2111 614 \r\n3 729 2112 2108 615 \r\n3 189 2103 2112 615 \r\n3 153 2108 2103 615 \r\n3 730 2114 2113 616 \r\n3 154 1901 2114 616 \r\n3 155 2113 1901 616 \r\n3 730 2113 2116 617 \r\n3 155 2115 2113 617 \r\n3 191 2116 2115 617 \r\n3 730 2116 2118 618 \r\n3 191 2117 2116 618 \r\n3 190 2118 2117 618 \r\n3 730 2118 2114 619 \r\n3 190 2109 2118 619 \r\n3 154 2114 2109 619 \r\n3 731 2120 2119 620 \r\n3 155 1907 2120 620 \r\n3 156 2119 1907 620 \r\n3 731 2119 2122 621 \r\n3 156 2121 2119 621 \r\n3 192 2122 2121 621 \r\n3 731 2122 2124 622 \r\n3 192 2123 2122 622 \r\n3 191 2124 2123 622 \r\n3 731 2124 2120 623 \r\n3 191 2115 2124 623 \r\n3 155 2120 2115 623 \r\n3 732 2126 2125 624 \r\n3 156 1913 2126 624 \r\n3 157 2125 1913 624 \r\n3 732 2125 2128 625 \r\n3 157 2127 2125 625 \r\n3 193 2128 2127 625 \r\n3 732 2128 2130 626 \r\n3 193 2129 2128 626 \r\n3 192 2130 2129 626 \r\n3 732 2130 2126 627 \r\n3 192 2121 2130 627 \r\n3 156 2126 2121 627 \r\n3 733 2132 2131 628 \r\n3 157 1919 2132 628 \r\n3 158 2131 1919 628 \r\n3 733 2131 2134 629 \r\n3 158 2133 2131 629 \r\n3 194 2134 2133 629 \r\n3 733 2134 2136 630 \r\n3 194 2135 2134 630 \r\n3 193 2136 2135 630 \r\n3 733 2136 2132 631 \r\n3 193 2127 2136 631 \r\n3 157 2132 2127 631 \r\n3 734 2138 2137 632 \r\n3 158 1925 2138 632 \r\n3 159 2137 1925 632 \r\n3 734 2137 2140 633 \r\n3 159 2139 2137 633 \r\n3 195 2140 2139 633 \r\n3 734 2140 2142 634 \r\n3 195 2141 2140 634 \r\n3 194 2142 2141 634 \r\n3 734 2142 2138 635 \r\n3 194 2133 2142 635 \r\n3 158 2138 2133 635 \r\n3 735 2144 2143 636 \r\n3 159 1931 2144 636 \r\n3 160 2143 1931 636 \r\n3 735 2143 2146 637 \r\n3 160 2145 2143 637 \r\n3 196 2146 2145 637 \r\n3 735 2146 2148 638 \r\n3 196 2147 2146 638 \r\n3 195 2148 2147 638 \r\n3 735 2148 2144 639 \r\n3 195 2139 2148 639 \r\n3 159 2144 2139 639 \r\n3 736 2150 2149 640 \r\n3 160 1937 2150 640 \r\n3 161 2149 1937 640 \r\n3 736 2149 2152 641 \r\n3 161 2151 2149 641 \r\n3 197 2152 2151 641 \r\n3 736 2152 2154 642 \r\n3 197 2153 2152 642 \r\n3 196 2154 2153 642 \r\n3 736 2154 2150 643 \r\n3 196 2145 2154 643 \r\n3 160 2150 2145 643 \r\n3 737 2156 2155 644 \r\n3 161 1943 2156 644 \r\n3 162 2155 1943 644 \r\n3 737 2155 2158 645 \r\n3 162 2157 2155 645 \r\n3 198 2158 2157 645 \r\n3 737 2158 2160 646 \r\n3 198 2159 2158 646 \r\n3 197 2160 2159 646 \r\n3 737 2160 2156 647 \r\n3 197 2151 2160 647 \r\n3 161 2156 2151 647 \r\n3 738 2162 2161 648 \r\n3 162 1949 2162 648 \r\n3 163 2161 1949 648 \r\n3 738 2161 2164 649 \r\n3 163 2163 2161 649 \r\n3 199 2164 2163 649 \r\n3 738 2164 2166 650 \r\n3 199 2165 2164 650 \r\n3 198 2166 2165 650 \r\n3 738 2166 2162 651 \r\n3 198 2157 2166 651 \r\n3 162 2162 2157 651 \r\n3 739 2168 2167 652 \r\n3 163 1955 2168 652 \r\n3 164 2167 1955 652 \r\n3 739 2167 2170 653 \r\n3 164 2169 2167 653 \r\n3 200 2170 2169 653 \r\n3 739 2170 2172 654 \r\n3 200 2171 2170 654 \r\n3 199 2172 2171 654 \r\n3 739 2172 2168 655 \r\n3 199 2163 2172 655 \r\n3 163 2168 2163 655 \r\n3 740 2174 2173 656 \r\n3 164 1961 2174 656 \r\n3 165 2173 1961 656 \r\n3 740 2173 2176 657 \r\n3 165 2175 2173 657 \r\n3 201 2176 2175 657 \r\n3 740 2176 2178 658 \r\n3 201 2177 2176 658 \r\n3 200 2178 2177 658 \r\n3 740 2178 2174 659 \r\n3 200 2169 2178 659 \r\n3 164 2174 2169 659 \r\n3 741 2180 2179 660 \r\n3 165 1967 2180 660 \r\n3 166 2179 1967 660 \r\n3 741 2179 2182 661 \r\n3 166 2181 2179 661 \r\n3 202 2182 2181 661 \r\n3 741 2182 2184 662 \r\n3 202 2183 2182 662 \r\n3 201 2184 2183 662 \r\n3 741 2184 2180 663 \r\n3 201 2175 2184 663 \r\n3 165 2180 2175 663 \r\n3 742 2186 2185 664 \r\n3 166 1973 2186 664 \r\n3 167 2185 1973 664 \r\n3 742 2185 2188 665 \r\n3 167 2187 2185 665 \r\n3 203 2188 2187 665 \r\n3 742 2188 2190 666 \r\n3 203 2189 2188 666 \r\n3 202 2190 2189 666 \r\n3 742 2190 2186 667 \r\n3 202 2181 2190 667 \r\n3 166 2186 2181 667 \r\n3 743 2192 2191 668 \r\n3 167 1979 2192 668 \r\n3 168 2191 1979 668 \r\n3 743 2191 2194 669 \r\n3 168 2193 2191 669 \r\n3 204 2194 2193 669 \r\n3 743 2194 2196 670 \r\n3 204 2195 2194 670 \r\n3 203 2196 2195 670 \r\n3 743 2196 2192 671 \r\n3 203 2187 2196 671 \r\n3 167 2192 2187 671 \r\n3 744 2198 2197 672 \r\n3 168 1985 2198 672 \r\n3 169 2197 1985 672 \r\n3 744 2197 2200 673 \r\n3 169 2199 2197 673 \r\n3 205 2200 2199 673 \r\n3 744 2200 2202 674 \r\n3 205 2201 2200 674 \r\n3 204 2202 2201 674 \r\n3 744 2202 2198 675 \r\n3 204 2193 2202 675 \r\n3 168 2198 2193 675 \r\n3 745 2204 2203 676 \r\n3 169 1991 2204 676 \r\n3 170 2203 1991 676 \r\n3 745 2203 2206 677 \r\n3 170 2205 2203 677 \r\n3 206 2206 2205 677 \r\n3 745 2206 2208 678 \r\n3 206 2207 2206 678 \r\n3 205 2208 2207 678 \r\n3 745 2208 2204 679 \r\n3 205 2199 2208 679 \r\n3 169 2204 2199 679 \r\n3 746 2210 2209 680 \r\n3 170 1997 2210 680 \r\n3 171 2209 1997 680 \r\n3 746 2209 2212 681 \r\n3 171 2211 2209 681 \r\n3 207 2212 2211 681 \r\n3 746 2212 2214 682 \r\n3 207 2213 2212 682 \r\n3 206 2214 2213 682 \r\n3 746 2214 2210 683 \r\n3 206 2205 2214 683 \r\n3 170 2210 2205 683 \r\n3 747 2216 2215 684 \r\n3 171 2003 2216 684 \r\n3 172 2215 2003 684 \r\n3 747 2215 2218 685 \r\n3 172 2217 2215 685 \r\n3 208 2218 2217 685 \r\n3 747 2218 2220 686 \r\n3 208 2219 2218 686 \r\n3 207 2220 2219 686 \r\n3 747 2220 2216 687 \r\n3 207 2211 2220 687 \r\n3 171 2216 2211 687 \r\n3 748 2222 2221 688 \r\n3 172 2009 2222 688 \r\n3 173 2221 2009 688 \r\n3 748 2221 2224 689 \r\n3 173 2223 2221 689 \r\n3 209 2224 2223 689 \r\n3 748 2224 2226 690 \r\n3 209 2225 2224 690 \r\n3 208 2226 2225 690 \r\n3 748 2226 2222 691 \r\n3 208 2217 2226 691 \r\n3 172 2222 2217 691 \r\n3 749 2228 2227 692 \r\n3 173 2015 2228 692 \r\n3 174 2227 2015 692 \r\n3 749 2227 2230 693 \r\n3 174 2229 2227 693 \r\n3 210 2230 2229 693 \r\n3 749 2230 2232 694 \r\n3 210 2231 2230 694 \r\n3 209 2232 2231 694 \r\n3 749 2232 2228 695 \r\n3 209 2223 2232 695 \r\n3 173 2228 2223 695 \r\n3 750 2234 2233 696 \r\n3 174 2021 2234 696 \r\n3 175 2233 2021 696 \r\n3 750 2233 2236 697 \r\n3 175 2235 2233 697 \r\n3 211 2236 2235 697 \r\n3 750 2236 2238 698 \r\n3 211 2237 2236 698 \r\n3 210 2238 2237 698 \r\n3 750 2238 2234 699 \r\n3 210 2229 2238 699 \r\n3 174 2234 2229 699 \r\n3 751 2240 2239 700 \r\n3 175 2027 2240 700 \r\n3 176 2239 2027 700 \r\n3 751 2239 2242 701 \r\n3 176 2241 2239 701 \r\n3 212 2242 2241 701 \r\n3 751 2242 2244 702 \r\n3 212 2243 2242 702 \r\n3 211 2244 2243 702 \r\n3 751 2244 2240 703 \r\n3 211 2235 2244 703 \r\n3 175 2240 2235 703 \r\n3 752 2246 2245 704 \r\n3 176 2033 2246 704 \r\n3 177 2245 2033 704 \r\n3 752 2245 2248 705 \r\n3 177 2247 2245 705 \r\n3 213 2248 2247 705 \r\n3 752 2248 2250 706 \r\n3 213 2249 2248 706 \r\n3 212 2250 2249 706 \r\n3 752 2250 2246 707 \r\n3 212 2241 2250 707 \r\n3 176 2246 2241 707 \r\n3 753 2252 2251 708 \r\n3 177 2039 2252 708 \r\n3 178 2251 2039 708 \r\n3 753 2251 2254 709 \r\n3 178 2253 2251 709 \r\n3 214 2254 2253 709 \r\n3 753 2254 2256 710 \r\n3 214 2255 2254 710 \r\n3 213 2256 2255 710 \r\n3 753 2256 2252 711 \r\n3 213 2247 2256 711 \r\n3 177 2252 2247 711 \r\n3 754 2258 2257 712 \r\n3 178 2045 2258 712 \r\n3 179 2257 2045 712 \r\n3 754 2257 2260 713 \r\n3 179 2259 2257 713 \r\n3 215 2260 2259 713 \r\n3 754 2260 2262 714 \r\n3 215 2261 2260 714 \r\n3 214 2262 2261 714 \r\n3 754 2262 2258 715 \r\n3 214 2253 2262 715 \r\n3 178 2258 2253 715 \r\n3 755 2264 2263 716 \r\n3 179 2050 2264 716 \r\n3 144 2263 2050 716 \r\n3 755 2263 2265 717 \r\n3 144 2058 2263 717 \r\n3 180 2265 2058 717 \r\n3 755 2265 2267 718 \r\n3 180 2266 2265 718 \r\n3 215 2267 2266 718 \r\n3 755 2267 2264 719 \r\n3 215 2259 2267 719 \r\n3 179 2264 2259 719 \r\n3 756 2269 2268 720 \r\n3 180 2056 2269 720 \r\n3 181 2268 2056 720 \r\n3 756 2268 2271 721 \r\n3 181 2270 2268 721 \r\n3 217 2271 2270 721 \r\n3 756 2271 2273 722 \r\n3 217 2272 2271 722 \r\n3 216 2273 2272 722 \r\n3 756 2273 2269 723 \r\n3 216 2274 2273 723 \r\n3 180 2269 2274 723 \r\n3 757 2276 2275 724 \r\n3 181 2063 2276 724 \r\n3 182 2275 2063 724 \r\n3 757 2275 2278 725 \r\n3 182 2277 2275 725 \r\n3 218 2278 2277 725 \r\n3 757 2278 2280 726 \r\n3 218 2279 2278 726 \r\n3 217 2280 2279 726 \r\n3 757 2280 2276 727 \r\n3 217 2270 2280 727 \r\n3 181 2276 2270 727 \r\n3 758 2282 2281 728 \r\n3 182 2069 2282 728 \r\n3 183 2281 2069 728 \r\n3 758 2281 2284 729 \r\n3 183 2283 2281 729 \r\n3 219 2284 2283 729 \r\n3 758 2284 2286 730 \r\n3 219 2285 2284 730 \r\n3 218 2286 2285 730 \r\n3 758 2286 2282 731 \r\n3 218 2277 2286 731 \r\n3 182 2282 2277 731 \r\n3 759 2288 2287 732 \r\n3 183 2075 2288 732 \r\n3 184 2287 2075 732 \r\n3 759 2287 2290 733 \r\n3 184 2289 2287 733 \r\n3 220 2290 2289 733 \r\n3 759 2290 2292 734 \r\n3 220 2291 2290 734 \r\n3 219 2292 2291 734 \r\n3 759 2292 2288 735 \r\n3 219 2283 2292 735 \r\n3 183 2288 2283 735 \r\n3 760 2294 2293 736 \r\n3 184 2081 2294 736 \r\n3 185 2293 2081 736 \r\n3 760 2293 2296 737 \r\n3 185 2295 2293 737 \r\n3 221 2296 2295 737 \r\n3 760 2296 2298 738 \r\n3 221 2297 2296 738 \r\n3 220 2298 2297 738 \r\n3 760 2298 2294 739 \r\n3 220 2289 2298 739 \r\n3 184 2294 2289 739 \r\n3 761 2300 2299 740 \r\n3 185 2087 2300 740 \r\n3 186 2299 2087 740 \r\n3 761 2299 2302 741 \r\n3 186 2301 2299 741 \r\n3 222 2302 2301 741 \r\n3 761 2302 2304 742 \r\n3 222 2303 2302 742 \r\n3 221 2304 2303 742 \r\n3 761 2304 2300 743 \r\n3 221 2295 2304 743 \r\n3 185 2300 2295 743 \r\n3 762 2306 2305 744 \r\n3 186 2093 2306 744 \r\n3 187 2305 2093 744 \r\n3 762 2305 2308 745 \r\n3 187 2307 2305 745 \r\n3 223 2308 2307 745 \r\n3 762 2308 2310 746 \r\n3 223 2309 2308 746 \r\n3 222 2310 2309 746 \r\n3 762 2310 2306 747 \r\n3 222 2301 2310 747 \r\n3 186 2306 2301 747 \r\n3 763 2312 2311 748 \r\n3 187 2099 2312 748 \r\n3 188 2311 2099 748 \r\n3 763 2311 2314 749 \r\n3 188 2313 2311 749 \r\n3 224 2314 2313 749 \r\n3 763 2314 2316 750 \r\n3 224 2315 2314 750 \r\n3 223 2316 2315 750 \r\n3 763 2316 2312 751 \r\n3 223 2307 2316 751 \r\n3 187 2312 2307 751 \r\n3 764 2318 2317 752 \r\n3 188 2105 2318 752 \r\n3 189 2317 2105 752 \r\n3 764 2317 2320 753 \r\n3 189 2319 2317 753 \r\n3 225 2320 2319 753 \r\n3 764 2320 2322 754 \r\n3 225 2321 2320 754 \r\n3 224 2322 2321 754 \r\n3 764 2322 2318 755 \r\n3 224 2313 2322 755 \r\n3 188 2318 2313 755 \r\n3 765 2324 2323 756 \r\n3 189 2111 2324 756 \r\n3 190 2323 2111 756 \r\n3 765 2323 2326 757 \r\n3 190 2325 2323 757 \r\n3 226 2326 2325 757 \r\n3 765 2326 2328 758 \r\n3 226 2327 2326 758 \r\n3 225 2328 2327 758 \r\n3 765 2328 2324 759 \r\n3 225 2319 2328 759 \r\n3 189 2324 2319 759 \r\n3 766 2330 2329 760 \r\n3 190 2117 2330 760 \r\n3 191 2329 2117 760 \r\n3 766 2329 2332 761 \r\n3 191 2331 2329 761 \r\n3 227 2332 2331 761 \r\n3 766 2332 2334 762 \r\n3 227 2333 2332 762 \r\n3 226 2334 2333 762 \r\n3 766 2334 2330 763 \r\n3 226 2325 2334 763 \r\n3 190 2330 2325 763 \r\n3 767 2336 2335 764 \r\n3 191 2123 2336 764 \r\n3 192 2335 2123 764 \r\n3 767 2335 2338 765 \r\n3 192 2337 2335 765 \r\n3 228 2338 2337 765 \r\n3 767 2338 2340 766 \r\n3 228 2339 2338 766 \r\n3 227 2340 2339 766 \r\n3 767 2340 2336 767 \r\n3 227 2331 2340 767 \r\n3 191 2336 2331 767 \r\n3 768 2342 2341 768 \r\n3 192 2129 2342 768 \r\n3 193 2341 2129 768 \r\n3 768 2341 2344 769 \r\n3 193 2343 2341 769 \r\n3 229 2344 2343 769 \r\n3 768 2344 2346 770 \r\n3 229 2345 2344 770 \r\n3 228 2346 2345 770 \r\n3 768 2346 2342 771 \r\n3 228 2337 2346 771 \r\n3 192 2342 2337 771 \r\n3 769 2348 2347 772 \r\n3 193 2135 2348 772 \r\n3 194 2347 2135 772 \r\n3 769 2347 2350 773 \r\n3 194 2349 2347 773 \r\n3 230 2350 2349 773 \r\n3 769 2350 2352 774 \r\n3 230 2351 2350 774 \r\n3 229 2352 2351 774 \r\n3 769 2352 2348 775 \r\n3 229 2343 2352 775 \r\n3 193 2348 2343 775 \r\n3 770 2354 2353 776 \r\n3 194 2141 2354 776 \r\n3 195 2353 2141 776 \r\n3 770 2353 2356 777 \r\n3 195 2355 2353 777 \r\n3 231 2356 2355 777 \r\n3 770 2356 2358 778 \r\n3 231 2357 2356 778 \r\n3 230 2358 2357 778 \r\n3 770 2358 2354 779 \r\n3 230 2349 2358 779 \r\n3 194 2354 2349 779 \r\n3 771 2360 2359 780 \r\n3 195 2147 2360 780 \r\n3 196 2359 2147 780 \r\n3 771 2359 2362 781 \r\n3 196 2361 2359 781 \r\n3 232 2362 2361 781 \r\n3 771 2362 2364 782 \r\n3 232 2363 2362 782 \r\n3 231 2364 2363 782 \r\n3 771 2364 2360 783 \r\n3 231 2355 2364 783 \r\n3 195 2360 2355 783 \r\n3 772 2366 2365 784 \r\n3 196 2153 2366 784 \r\n3 197 2365 2153 784 \r\n3 772 2365 2368 785 \r\n3 197 2367 2365 785 \r\n3 233 2368 2367 785 \r\n3 772 2368 2370 786 \r\n3 233 2369 2368 786 \r\n3 232 2370 2369 786 \r\n3 772 2370 2366 787 \r\n3 232 2361 2370 787 \r\n3 196 2366 2361 787 \r\n3 773 2372 2371 788 \r\n3 197 2159 2372 788 \r\n3 198 2371 2159 788 \r\n3 773 2371 2374 789 \r\n3 198 2373 2371 789 \r\n3 234 2374 2373 789 \r\n3 773 2374 2376 790 \r\n3 234 2375 2374 790 \r\n3 233 2376 2375 790 \r\n3 773 2376 2372 791 \r\n3 233 2367 2376 791 \r\n3 197 2372 2367 791 \r\n3 774 2378 2377 792 \r\n3 198 2165 2378 792 \r\n3 199 2377 2165 792 \r\n3 774 2377 2380 793 \r\n3 199 2379 2377 793 \r\n3 235 2380 2379 793 \r\n3 774 2380 2382 794 \r\n3 235 2381 2380 794 \r\n3 234 2382 2381 794 \r\n3 774 2382 2378 795 \r\n3 234 2373 2382 795 \r\n3 198 2378 2373 795 \r\n3 775 2384 2383 796 \r\n3 199 2171 2384 796 \r\n3 200 2383 2171 796 \r\n3 775 2383 2386 797 \r\n3 200 2385 2383 797 \r\n3 236 2386 2385 797 \r\n3 775 2386 2388 798 \r\n3 236 2387 2386 798 \r\n3 235 2388 2387 798 \r\n3 775 2388 2384 799 \r\n3 235 2379 2388 799 \r\n3 199 2384 2379 799 \r\n3 776 2390 2389 800 \r\n3 200 2177 2390 800 \r\n3 201 2389 2177 800 \r\n3 776 2389 2392 801 \r\n3 201 2391 2389 801 \r\n3 237 2392 2391 801 \r\n3 776 2392 2394 802 \r\n3 237 2393 2392 802 \r\n3 236 2394 2393 802 \r\n3 776 2394 2390 803 \r\n3 236 2385 2394 803 \r\n3 200 2390 2385 803 \r\n3 777 2396 2395 804 \r\n3 201 2183 2396 804 \r\n3 202 2395 2183 804 \r\n3 777 2395 2398 805 \r\n3 202 2397 2395 805 \r\n3 238 2398 2397 805 \r\n3 777 2398 2400 806 \r\n3 238 2399 2398 806 \r\n3 237 2400 2399 806 \r\n3 777 2400 2396 807 \r\n3 237 2391 2400 807 \r\n3 201 2396 2391 807 \r\n3 778 2402 2401 808 \r\n3 202 2189 2402 808 \r\n3 203 2401 2189 808 \r\n3 778 2401 2404 809 \r\n3 203 2403 2401 809 \r\n3 239 2404 2403 809 \r\n3 778 2404 2406 810 \r\n3 239 2405 2404 810 \r\n3 238 2406 2405 810 \r\n3 778 2406 2402 811 \r\n3 238 2397 2406 811 \r\n3 202 2402 2397 811 \r\n3 779 2408 2407 812 \r\n3 203 2195 2408 812 \r\n3 204 2407 2195 812 \r\n3 779 2407 2410 813 \r\n3 204 2409 2407 813 \r\n3 240 2410 2409 813 \r\n3 779 2410 2412 814 \r\n3 240 2411 2410 814 \r\n3 239 2412 2411 814 \r\n3 779 2412 2408 815 \r\n3 239 2403 2412 815 \r\n3 203 2408 2403 815 \r\n3 780 2414 2413 816 \r\n3 204 2201 2414 816 \r\n3 205 2413 2201 816 \r\n3 780 2413 2416 817 \r\n3 205 2415 2413 817 \r\n3 241 2416 2415 817 \r\n3 780 2416 2418 818 \r\n3 241 2417 2416 818 \r\n3 240 2418 2417 818 \r\n3 780 2418 2414 819 \r\n3 240 2409 2418 819 \r\n3 204 2414 2409 819 \r\n3 781 2420 2419 820 \r\n3 205 2207 2420 820 \r\n3 206 2419 2207 820 \r\n3 781 2419 2422 821 \r\n3 206 2421 2419 821 \r\n3 242 2422 2421 821 \r\n3 781 2422 2424 822 \r\n3 242 2423 2422 822 \r\n3 241 2424 2423 822 \r\n3 781 2424 2420 823 \r\n3 241 2415 2424 823 \r\n3 205 2420 2415 823 \r\n3 782 2426 2425 824 \r\n3 206 2213 2426 824 \r\n3 207 2425 2213 824 \r\n3 782 2425 2428 825 \r\n3 207 2427 2425 825 \r\n3 243 2428 2427 825 \r\n3 782 2428 2430 826 \r\n3 243 2429 2428 826 \r\n3 242 2430 2429 826 \r\n3 782 2430 2426 827 \r\n3 242 2421 2430 827 \r\n3 206 2426 2421 827 \r\n3 783 2432 2431 828 \r\n3 207 2219 2432 828 \r\n3 208 2431 2219 828 \r\n3 783 2431 2434 829 \r\n3 208 2433 2431 829 \r\n3 244 2434 2433 829 \r\n3 783 2434 2436 830 \r\n3 244 2435 2434 830 \r\n3 243 2436 2435 830 \r\n3 783 2436 2432 831 \r\n3 243 2427 2436 831 \r\n3 207 2432 2427 831 \r\n3 784 2438 2437 832 \r\n3 208 2225 2438 832 \r\n3 209 2437 2225 832 \r\n3 784 2437 2440 833 \r\n3 209 2439 2437 833 \r\n3 245 2440 2439 833 \r\n3 784 2440 2442 834 \r\n3 245 2441 2440 834 \r\n3 244 2442 2441 834 \r\n3 784 2442 2438 835 \r\n3 244 2433 2442 835 \r\n3 208 2438 2433 835 \r\n3 785 2444 2443 836 \r\n3 209 2231 2444 836 \r\n3 210 2443 2231 836 \r\n3 785 2443 2446 837 \r\n3 210 2445 2443 837 \r\n3 246 2446 2445 837 \r\n3 785 2446 2448 838 \r\n3 246 2447 2446 838 \r\n3 245 2448 2447 838 \r\n3 785 2448 2444 839 \r\n3 245 2439 2448 839 \r\n3 209 2444 2439 839 \r\n3 786 2450 2449 840 \r\n3 210 2237 2450 840 \r\n3 211 2449 2237 840 \r\n3 786 2449 2452 841 \r\n3 211 2451 2449 841 \r\n3 247 2452 2451 841 \r\n3 786 2452 2454 842 \r\n3 247 2453 2452 842 \r\n3 246 2454 2453 842 \r\n3 786 2454 2450 843 \r\n3 246 2445 2454 843 \r\n3 210 2450 2445 843 \r\n3 787 2456 2455 844 \r\n3 211 2243 2456 844 \r\n3 212 2455 2243 844 \r\n3 787 2455 2458 845 \r\n3 212 2457 2455 845 \r\n3 248 2458 2457 845 \r\n3 787 2458 2460 846 \r\n3 248 2459 2458 846 \r\n3 247 2460 2459 846 \r\n3 787 2460 2456 847 \r\n3 247 2451 2460 847 \r\n3 211 2456 2451 847 \r\n3 788 2462 2461 848 \r\n3 212 2249 2462 848 \r\n3 213 2461 2249 848 \r\n3 788 2461 2464 849 \r\n3 213 2463 2461 849 \r\n3 249 2464 2463 849 \r\n3 788 2464 2466 850 \r\n3 249 2465 2464 850 \r\n3 248 2466 2465 850 \r\n3 788 2466 2462 851 \r\n3 248 2457 2466 851 \r\n3 212 2462 2457 851 \r\n3 789 2468 2467 852 \r\n3 213 2255 2468 852 \r\n3 214 2467 2255 852 \r\n3 789 2467 2470 853 \r\n3 214 2469 2467 853 \r\n3 250 2470 2469 853 \r\n3 789 2470 2472 854 \r\n3 250 2471 2470 854 \r\n3 249 2472 2471 854 \r\n3 789 2472 2468 855 \r\n3 249 2463 2472 855 \r\n3 213 2468 2463 855 \r\n3 790 2474 2473 856 \r\n3 214 2261 2474 856 \r\n3 215 2473 2261 856 \r\n3 790 2473 2476 857 \r\n3 215 2475 2473 857 \r\n3 251 2476 2475 857 \r\n3 790 2476 2478 858 \r\n3 251 2477 2476 858 \r\n3 250 2478 2477 858 \r\n3 790 2478 2474 859 \r\n3 250 2469 2478 859 \r\n3 214 2474 2469 859 \r\n3 791 2480 2479 860 \r\n3 215 2266 2480 860 \r\n3 180 2479 2266 860 \r\n3 791 2479 2481 861 \r\n3 180 2274 2479 861 \r\n3 216 2481 2274 861 \r\n3 791 2481 2483 862 \r\n3 216 2482 2481 862 \r\n3 251 2483 2482 862 \r\n3 791 2483 2480 863 \r\n3 251 2475 2483 863 \r\n3 215 2480 2475 863 \r\n3 792 2485 2484 864 \r\n3 216 2272 2485 864 \r\n3 217 2484 2272 864 \r\n3 792 2484 2487 865 \r\n3 217 2486 2484 865 \r\n3 253 2487 2486 865 \r\n3 792 2487 2489 866 \r\n3 253 2488 2487 866 \r\n3 252 2489 2488 866 \r\n3 792 2489 2485 867 \r\n3 252 2490 2489 867 \r\n3 216 2485 2490 867 \r\n3 793 2492 2491 868 \r\n3 217 2279 2492 868 \r\n3 218 2491 2279 868 \r\n3 793 2491 2494 869 \r\n3 218 2493 2491 869 \r\n3 254 2494 2493 869 \r\n3 793 2494 2496 870 \r\n3 254 2495 2494 870 \r\n3 253 2496 2495 870 \r\n3 793 2496 2492 871 \r\n3 253 2486 2496 871 \r\n3 217 2492 2486 871 \r\n3 794 2498 2497 872 \r\n3 218 2285 2498 872 \r\n3 219 2497 2285 872 \r\n3 794 2497 2500 873 \r\n3 219 2499 2497 873 \r\n3 255 2500 2499 873 \r\n3 794 2500 2502 874 \r\n3 255 2501 2500 874 \r\n3 254 2502 2501 874 \r\n3 794 2502 2498 875 \r\n3 254 2493 2502 875 \r\n3 218 2498 2493 875 \r\n3 795 2504 2503 876 \r\n3 219 2291 2504 876 \r\n3 220 2503 2291 876 \r\n3 795 2503 2506 877 \r\n3 220 2505 2503 877 \r\n3 256 2506 2505 877 \r\n3 795 2506 2508 878 \r\n3 256 2507 2506 878 \r\n3 255 2508 2507 878 \r\n3 795 2508 2504 879 \r\n3 255 2499 2508 879 \r\n3 219 2504 2499 879 \r\n3 796 2510 2509 880 \r\n3 220 2297 2510 880 \r\n3 221 2509 2297 880 \r\n3 796 2509 2512 881 \r\n3 221 2511 2509 881 \r\n3 257 2512 2511 881 \r\n3 796 2512 2514 882 \r\n3 257 2513 2512 882 \r\n3 256 2514 2513 882 \r\n3 796 2514 2510 883 \r\n3 256 2505 2514 883 \r\n3 220 2510 2505 883 \r\n3 797 2516 2515 884 \r\n3 221 2303 2516 884 \r\n3 222 2515 2303 884 \r\n3 797 2515 2518 885 \r\n3 222 2517 2515 885 \r\n3 258 2518 2517 885 \r\n3 797 2518 2520 886 \r\n3 258 2519 2518 886 \r\n3 257 2520 2519 886 \r\n3 797 2520 2516 887 \r\n3 257 2511 2520 887 \r\n3 221 2516 2511 887 \r\n3 798 2522 2521 888 \r\n3 222 2309 2522 888 \r\n3 223 2521 2309 888 \r\n3 798 2521 2524 889 \r\n3 223 2523 2521 889 \r\n3 259 2524 2523 889 \r\n3 798 2524 2526 890 \r\n3 259 2525 2524 890 \r\n3 258 2526 2525 890 \r\n3 798 2526 2522 891 \r\n3 258 2517 2526 891 \r\n3 222 2522 2517 891 \r\n3 799 2528 2527 892 \r\n3 223 2315 2528 892 \r\n3 224 2527 2315 892 \r\n3 799 2527 2530 893 \r\n3 224 2529 2527 893 \r\n3 260 2530 2529 893 \r\n3 799 2530 2532 894 \r\n3 260 2531 2530 894 \r\n3 259 2532 2531 894 \r\n3 799 2532 2528 895 \r\n3 259 2523 2532 895 \r\n3 223 2528 2523 895 \r\n3 800 2534 2533 896 \r\n3 224 2321 2534 896 \r\n3 225 2533 2321 896 \r\n3 800 2533 2536 897 \r\n3 225 2535 2533 897 \r\n3 261 2536 2535 897 \r\n3 800 2536 2538 898 \r\n3 261 2537 2536 898 \r\n3 260 2538 2537 898 \r\n3 800 2538 2534 899 \r\n3 260 2529 2538 899 \r\n3 224 2534 2529 899 \r\n3 801 2540 2539 900 \r\n3 225 2327 2540 900 \r\n3 226 2539 2327 900 \r\n3 801 2539 2542 901 \r\n3 226 2541 2539 901 \r\n3 262 2542 2541 901 \r\n3 801 2542 2544 902 \r\n3 262 2543 2542 902 \r\n3 261 2544 2543 902 \r\n3 801 2544 2540 903 \r\n3 261 2535 2544 903 \r\n3 225 2540 2535 903 \r\n3 802 2546 2545 904 \r\n3 226 2333 2546 904 \r\n3 227 2545 2333 904 \r\n3 802 2545 2548 905 \r\n3 227 2547 2545 905 \r\n3 263 2548 2547 905 \r\n3 802 2548 2550 906 \r\n3 263 2549 2548 906 \r\n3 262 2550 2549 906 \r\n3 802 2550 2546 907 \r\n3 262 2541 2550 907 \r\n3 226 2546 2541 907 \r\n3 803 2552 2551 908 \r\n3 227 2339 2552 908 \r\n3 228 2551 2339 908 \r\n3 803 2551 2554 909 \r\n3 228 2553 2551 909 \r\n3 264 2554 2553 909 \r\n3 803 2554 2556 910 \r\n3 264 2555 2554 910 \r\n3 263 2556 2555 910 \r\n3 803 2556 2552 911 \r\n3 263 2547 2556 911 \r\n3 227 2552 2547 911 \r\n3 804 2558 2557 912 \r\n3 228 2345 2558 912 \r\n3 229 2557 2345 912 \r\n3 804 2557 2560 913 \r\n3 229 2559 2557 913 \r\n3 265 2560 2559 913 \r\n3 804 2560 2562 914 \r\n3 265 2561 2560 914 \r\n3 264 2562 2561 914 \r\n3 804 2562 2558 915 \r\n3 264 2553 2562 915 \r\n3 228 2558 2553 915 \r\n3 805 2564 2563 916 \r\n3 229 2351 2564 916 \r\n3 230 2563 2351 916 \r\n3 805 2563 2566 917 \r\n3 230 2565 2563 917 \r\n3 266 2566 2565 917 \r\n3 805 2566 2568 918 \r\n3 266 2567 2566 918 \r\n3 265 2568 2567 918 \r\n3 805 2568 2564 919 \r\n3 265 2559 2568 919 \r\n3 229 2564 2559 919 \r\n3 806 2570 2569 920 \r\n3 230 2357 2570 920 \r\n3 231 2569 2357 920 \r\n3 806 2569 2572 921 \r\n3 231 2571 2569 921 \r\n3 267 2572 2571 921 \r\n3 806 2572 2574 922 \r\n3 267 2573 2572 922 \r\n3 266 2574 2573 922 \r\n3 806 2574 2570 923 \r\n3 266 2565 2574 923 \r\n3 230 2570 2565 923 \r\n3 807 2576 2575 924 \r\n3 231 2363 2576 924 \r\n3 232 2575 2363 924 \r\n3 807 2575 2578 925 \r\n3 232 2577 2575 925 \r\n3 268 2578 2577 925 \r\n3 807 2578 2580 926 \r\n3 268 2579 2578 926 \r\n3 267 2580 2579 926 \r\n3 807 2580 2576 927 \r\n3 267 2571 2580 927 \r\n3 231 2576 2571 927 \r\n3 808 2582 2581 928 \r\n3 232 2369 2582 928 \r\n3 233 2581 2369 928 \r\n3 808 2581 2584 929 \r\n3 233 2583 2581 929 \r\n3 269 2584 2583 929 \r\n3 808 2584 2586 930 \r\n3 269 2585 2584 930 \r\n3 268 2586 2585 930 \r\n3 808 2586 2582 931 \r\n3 268 2577 2586 931 \r\n3 232 2582 2577 931 \r\n3 809 2588 2587 932 \r\n3 233 2375 2588 932 \r\n3 234 2587 2375 932 \r\n3 809 2587 2590 933 \r\n3 234 2589 2587 933 \r\n3 270 2590 2589 933 \r\n3 809 2590 2592 934 \r\n3 270 2591 2590 934 \r\n3 269 2592 2591 934 \r\n3 809 2592 2588 935 \r\n3 269 2583 2592 935 \r\n3 233 2588 2583 935 \r\n3 810 2594 2593 936 \r\n3 234 2381 2594 936 \r\n3 235 2593 2381 936 \r\n3 810 2593 2596 937 \r\n3 235 2595 2593 937 \r\n3 271 2596 2595 937 \r\n3 810 2596 2598 938 \r\n3 271 2597 2596 938 \r\n3 270 2598 2597 938 \r\n3 810 2598 2594 939 \r\n3 270 2589 2598 939 \r\n3 234 2594 2589 939 \r\n3 811 2600 2599 940 \r\n3 235 2387 2600 940 \r\n3 236 2599 2387 940 \r\n3 811 2599 2602 941 \r\n3 236 2601 2599 941 \r\n3 272 2602 2601 941 \r\n3 811 2602 2604 942 \r\n3 272 2603 2602 942 \r\n3 271 2604 2603 942 \r\n3 811 2604 2600 943 \r\n3 271 2595 2604 943 \r\n3 235 2600 2595 943 \r\n3 812 2606 2605 944 \r\n3 236 2393 2606 944 \r\n3 237 2605 2393 944 \r\n3 812 2605 2608 945 \r\n3 237 2607 2605 945 \r\n3 273 2608 2607 945 \r\n3 812 2608 2610 946 \r\n3 273 2609 2608 946 \r\n3 272 2610 2609 946 \r\n3 812 2610 2606 947 \r\n3 272 2601 2610 947 \r\n3 236 2606 2601 947 \r\n3 813 2612 2611 948 \r\n3 237 2399 2612 948 \r\n3 238 2611 2399 948 \r\n3 813 2611 2614 949 \r\n3 238 2613 2611 949 \r\n3 274 2614 2613 949 \r\n3 813 2614 2616 950 \r\n3 274 2615 2614 950 \r\n3 273 2616 2615 950 \r\n3 813 2616 2612 951 \r\n3 273 2607 2616 951 \r\n3 237 2612 2607 951 \r\n3 814 2618 2617 952 \r\n3 238 2405 2618 952 \r\n3 239 2617 2405 952 \r\n3 814 2617 2620 953 \r\n3 239 2619 2617 953 \r\n3 275 2620 2619 953 \r\n3 814 2620 2622 954 \r\n3 275 2621 2620 954 \r\n3 274 2622 2621 954 \r\n3 814 2622 2618 955 \r\n3 274 2613 2622 955 \r\n3 238 2618 2613 955 \r\n3 815 2624 2623 956 \r\n3 239 2411 2624 956 \r\n3 240 2623 2411 956 \r\n3 815 2623 2626 957 \r\n3 240 2625 2623 957 \r\n3 276 2626 2625 957 \r\n3 815 2626 2628 958 \r\n3 276 2627 2626 958 \r\n3 275 2628 2627 958 \r\n3 815 2628 2624 959 \r\n3 275 2619 2628 959 \r\n3 239 2624 2619 959 \r\n3 816 2630 2629 960 \r\n3 240 2417 2630 960 \r\n3 241 2629 2417 960 \r\n3 816 2629 2632 961 \r\n3 241 2631 2629 961 \r\n3 277 2632 2631 961 \r\n3 816 2632 2634 962 \r\n3 277 2633 2632 962 \r\n3 276 2634 2633 962 \r\n3 816 2634 2630 963 \r\n3 276 2625 2634 963 \r\n3 240 2630 2625 963 \r\n3 817 2636 2635 964 \r\n3 241 2423 2636 964 \r\n3 242 2635 2423 964 \r\n3 817 2635 2638 965 \r\n3 242 2637 2635 965 \r\n3 278 2638 2637 965 \r\n3 817 2638 2640 966 \r\n3 278 2639 2638 966 \r\n3 277 2640 2639 966 \r\n3 817 2640 2636 967 \r\n3 277 2631 2640 967 \r\n3 241 2636 2631 967 \r\n3 818 2642 2641 968 \r\n3 242 2429 2642 968 \r\n3 243 2641 2429 968 \r\n3 818 2641 2644 969 \r\n3 243 2643 2641 969 \r\n3 279 2644 2643 969 \r\n3 818 2644 2646 970 \r\n3 279 2645 2644 970 \r\n3 278 2646 2645 970 \r\n3 818 2646 2642 971 \r\n3 278 2637 2646 971 \r\n3 242 2642 2637 971 \r\n3 819 2648 2647 972 \r\n3 243 2435 2648 972 \r\n3 244 2647 2435 972 \r\n3 819 2647 2650 973 \r\n3 244 2649 2647 973 \r\n3 280 2650 2649 973 \r\n3 819 2650 2652 974 \r\n3 280 2651 2650 974 \r\n3 279 2652 2651 974 \r\n3 819 2652 2648 975 \r\n3 279 2643 2652 975 \r\n3 243 2648 2643 975 \r\n3 820 2654 2653 976 \r\n3 244 2441 2654 976 \r\n3 245 2653 2441 976 \r\n3 820 2653 2656 977 \r\n3 245 2655 2653 977 \r\n3 281 2656 2655 977 \r\n3 820 2656 2658 978 \r\n3 281 2657 2656 978 \r\n3 280 2658 2657 978 \r\n3 820 2658 2654 979 \r\n3 280 2649 2658 979 \r\n3 244 2654 2649 979 \r\n3 821 2660 2659 980 \r\n3 245 2447 2660 980 \r\n3 246 2659 2447 980 \r\n3 821 2659 2662 981 \r\n3 246 2661 2659 981 \r\n3 282 2662 2661 981 \r\n3 821 2662 2664 982 \r\n3 282 2663 2662 982 \r\n3 281 2664 2663 982 \r\n3 821 2664 2660 983 \r\n3 281 2655 2664 983 \r\n3 245 2660 2655 983 \r\n3 822 2666 2665 984 \r\n3 246 2453 2666 984 \r\n3 247 2665 2453 984 \r\n3 822 2665 2668 985 \r\n3 247 2667 2665 985 \r\n3 283 2668 2667 985 \r\n3 822 2668 2670 986 \r\n3 283 2669 2668 986 \r\n3 282 2670 2669 986 \r\n3 822 2670 2666 987 \r\n3 282 2661 2670 987 \r\n3 246 2666 2661 987 \r\n3 823 2672 2671 988 \r\n3 247 2459 2672 988 \r\n3 248 2671 2459 988 \r\n3 823 2671 2674 989 \r\n3 248 2673 2671 989 \r\n3 284 2674 2673 989 \r\n3 823 2674 2676 990 \r\n3 284 2675 2674 990 \r\n3 283 2676 2675 990 \r\n3 823 2676 2672 991 \r\n3 283 2667 2676 991 \r\n3 247 2672 2667 991 \r\n3 824 2678 2677 992 \r\n3 248 2465 2678 992 \r\n3 249 2677 2465 992 \r\n3 824 2677 2680 993 \r\n3 249 2679 2677 993 \r\n3 285 2680 2679 993 \r\n3 824 2680 2682 994 \r\n3 285 2681 2680 994 \r\n3 284 2682 2681 994 \r\n3 824 2682 2678 995 \r\n3 284 2673 2682 995 \r\n3 248 2678 2673 995 \r\n3 825 2684 2683 996 \r\n3 249 2471 2684 996 \r\n3 250 2683 2471 996 \r\n3 825 2683 2686 997 \r\n3 250 2685 2683 997 \r\n3 286 2686 2685 997 \r\n3 825 2686 2688 998 \r\n3 286 2687 2686 998 \r\n3 285 2688 2687 998 \r\n3 825 2688 2684 999 \r\n3 285 2679 2688 999 \r\n3 249 2684 2679 999 \r\n3 826 2690 2689 1000 \r\n3 250 2477 2690 1000 \r\n3 251 2689 2477 1000 \r\n3 826 2689 2692 1001 \r\n3 251 2691 2689 1001 \r\n3 287 2692 2691 1001 \r\n3 826 2692 2694 1002 \r\n3 287 2693 2692 1002 \r\n3 286 2694 2693 1002 \r\n3 826 2694 2690 1003 \r\n3 286 2685 2694 1003 \r\n3 250 2690 2685 1003 \r\n3 827 2696 2695 1004 \r\n3 251 2482 2696 1004 \r\n3 216 2695 2482 1004 \r\n3 827 2695 2697 1005 \r\n3 216 2490 2695 1005 \r\n3 252 2697 2490 1005 \r\n3 827 2697 2699 1006 \r\n3 252 2698 2697 1006 \r\n3 287 2699 2698 1006 \r\n3 827 2699 2696 1007 \r\n3 287 2691 2699 1007 \r\n3 251 2696 2691 1007 \r\n3 828 2701 2700 1008 \r\n3 252 2488 2701 1008 \r\n3 253 2700 2488 1008 \r\n3 828 2700 2703 1009 \r\n3 253 2702 2700 1009 \r\n3 289 2703 2702 1009 \r\n3 828 2703 2705 1010 \r\n3 289 2704 2703 1010 \r\n3 288 2705 2704 1010 \r\n3 828 2705 2701 1011 \r\n3 288 2706 2705 1011 \r\n3 252 2701 2706 1011 \r\n3 829 2708 2707 1012 \r\n3 253 2495 2708 1012 \r\n3 254 2707 2495 1012 \r\n3 829 2707 2710 1013 \r\n3 254 2709 2707 1013 \r\n3 290 2710 2709 1013 \r\n3 829 2710 2712 1014 \r\n3 290 2711 2710 1014 \r\n3 289 2712 2711 1014 \r\n3 829 2712 2708 1015 \r\n3 289 2702 2712 1015 \r\n3 253 2708 2702 1015 \r\n3 830 2714 2713 1016 \r\n3 254 2501 2714 1016 \r\n3 255 2713 2501 1016 \r\n3 830 2713 2716 1017 \r\n3 255 2715 2713 1017 \r\n3 291 2716 2715 1017 \r\n3 830 2716 2718 1018 \r\n3 291 2717 2716 1018 \r\n3 290 2718 2717 1018 \r\n3 830 2718 2714 1019 \r\n3 290 2709 2718 1019 \r\n3 254 2714 2709 1019 \r\n3 831 2720 2719 1020 \r\n3 255 2507 2720 1020 \r\n3 256 2719 2507 1020 \r\n3 831 2719 2722 1021 \r\n3 256 2721 2719 1021 \r\n3 292 2722 2721 1021 \r\n3 831 2722 2724 1022 \r\n3 292 2723 2722 1022 \r\n3 291 2724 2723 1022 \r\n3 831 2724 2720 1023 \r\n3 291 2715 2724 1023 \r\n3 255 2720 2715 1023 \r\n3 832 2726 2725 1024 \r\n3 256 2513 2726 1024 \r\n3 257 2725 2513 1024 \r\n3 832 2725 2728 1025 \r\n3 257 2727 2725 1025 \r\n3 293 2728 2727 1025 \r\n3 832 2728 2730 1026 \r\n3 293 2729 2728 1026 \r\n3 292 2730 2729 1026 \r\n3 832 2730 2726 1027 \r\n3 292 2721 2730 1027 \r\n3 256 2726 2721 1027 \r\n3 833 2732 2731 1028 \r\n3 257 2519 2732 1028 \r\n3 258 2731 2519 1028 \r\n3 833 2731 2734 1029 \r\n3 258 2733 2731 1029 \r\n3 294 2734 2733 1029 \r\n3 833 2734 2736 1030 \r\n3 294 2735 2734 1030 \r\n3 293 2736 2735 1030 \r\n3 833 2736 2732 1031 \r\n3 293 2727 2736 1031 \r\n3 257 2732 2727 1031 \r\n3 834 2738 2737 1032 \r\n3 258 2525 2738 1032 \r\n3 259 2737 2525 1032 \r\n3 834 2737 2740 1033 \r\n3 259 2739 2737 1033 \r\n3 295 2740 2739 1033 \r\n3 834 2740 2742 1034 \r\n3 295 2741 2740 1034 \r\n3 294 2742 2741 1034 \r\n3 834 2742 2738 1035 \r\n3 294 2733 2742 1035 \r\n3 258 2738 2733 1035 \r\n3 835 2744 2743 1036 \r\n3 259 2531 2744 1036 \r\n3 260 2743 2531 1036 \r\n3 835 2743 2746 1037 \r\n3 260 2745 2743 1037 \r\n3 296 2746 2745 1037 \r\n3 835 2746 2748 1038 \r\n3 296 2747 2746 1038 \r\n3 295 2748 2747 1038 \r\n3 835 2748 2744 1039 \r\n3 295 2739 2748 1039 \r\n3 259 2744 2739 1039 \r\n3 836 2750 2749 1040 \r\n3 260 2537 2750 1040 \r\n3 261 2749 2537 1040 \r\n3 836 2749 2752 1041 \r\n3 261 2751 2749 1041 \r\n3 297 2752 2751 1041 \r\n3 836 2752 2754 1042 \r\n3 297 2753 2752 1042 \r\n3 296 2754 2753 1042 \r\n3 836 2754 2750 1043 \r\n3 296 2745 2754 1043 \r\n3 260 2750 2745 1043 \r\n3 837 2756 2755 1044 \r\n3 261 2543 2756 1044 \r\n3 262 2755 2543 1044 \r\n3 837 2755 2758 1045 \r\n3 262 2757 2755 1045 \r\n3 298 2758 2757 1045 \r\n3 837 2758 2760 1046 \r\n3 298 2759 2758 1046 \r\n3 297 2760 2759 1046 \r\n3 837 2760 2756 1047 \r\n3 297 2751 2760 1047 \r\n3 261 2756 2751 1047 \r\n3 838 2762 2761 1048 \r\n3 262 2549 2762 1048 \r\n3 263 2761 2549 1048 \r\n3 838 2761 2764 1049 \r\n3 263 2763 2761 1049 \r\n3 299 2764 2763 1049 \r\n3 838 2764 2766 1050 \r\n3 299 2765 2764 1050 \r\n3 298 2766 2765 1050 \r\n3 838 2766 2762 1051 \r\n3 298 2757 2766 1051 \r\n3 262 2762 2757 1051 \r\n3 839 2768 2767 1052 \r\n3 263 2555 2768 1052 \r\n3 264 2767 2555 1052 \r\n3 839 2767 2770 1053 \r\n3 264 2769 2767 1053 \r\n3 300 2770 2769 1053 \r\n3 839 2770 2772 1054 \r\n3 300 2771 2770 1054 \r\n3 299 2772 2771 1054 \r\n3 839 2772 2768 1055 \r\n3 299 2763 2772 1055 \r\n3 263 2768 2763 1055 \r\n3 840 2774 2773 1056 \r\n3 264 2561 2774 1056 \r\n3 265 2773 2561 1056 \r\n3 840 2773 2776 1057 \r\n3 265 2775 2773 1057 \r\n3 301 2776 2775 1057 \r\n3 840 2776 2778 1058 \r\n3 301 2777 2776 1058 \r\n3 300 2778 2777 1058 \r\n3 840 2778 2774 1059 \r\n3 300 2769 2778 1059 \r\n3 264 2774 2769 1059 \r\n3 841 2780 2779 1060 \r\n3 265 2567 2780 1060 \r\n3 266 2779 2567 1060 \r\n3 841 2779 2782 1061 \r\n3 266 2781 2779 1061 \r\n3 302 2782 2781 1061 \r\n3 841 2782 2784 1062 \r\n3 302 2783 2782 1062 \r\n3 301 2784 2783 1062 \r\n3 841 2784 2780 1063 \r\n3 301 2775 2784 1063 \r\n3 265 2780 2775 1063 \r\n3 842 2786 2785 1064 \r\n3 266 2573 2786 1064 \r\n3 267 2785 2573 1064 \r\n3 842 2785 2788 1065 \r\n3 267 2787 2785 1065 \r\n3 303 2788 2787 1065 \r\n3 842 2788 2790 1066 \r\n3 303 2789 2788 1066 \r\n3 302 2790 2789 1066 \r\n3 842 2790 2786 1067 \r\n3 302 2781 2790 1067 \r\n3 266 2786 2781 1067 \r\n3 843 2792 2791 1068 \r\n3 267 2579 2792 1068 \r\n3 268 2791 2579 1068 \r\n3 843 2791 2794 1069 \r\n3 268 2793 2791 1069 \r\n3 304 2794 2793 1069 \r\n3 843 2794 2796 1070 \r\n3 304 2795 2794 1070 \r\n3 303 2796 2795 1070 \r\n3 843 2796 2792 1071 \r\n3 303 2787 2796 1071 \r\n3 267 2792 2787 1071 \r\n3 844 2798 2797 1072 \r\n3 268 2585 2798 1072 \r\n3 269 2797 2585 1072 \r\n3 844 2797 2800 1073 \r\n3 269 2799 2797 1073 \r\n3 305 2800 2799 1073 \r\n3 844 2800 2802 1074 \r\n3 305 2801 2800 1074 \r\n3 304 2802 2801 1074 \r\n3 844 2802 2798 1075 \r\n3 304 2793 2802 1075 \r\n3 268 2798 2793 1075 \r\n3 845 2804 2803 1076 \r\n3 269 2591 2804 1076 \r\n3 270 2803 2591 1076 \r\n3 845 2803 2806 1077 \r\n3 270 2805 2803 1077 \r\n3 306 2806 2805 1077 \r\n3 845 2806 2808 1078 \r\n3 306 2807 2806 1078 \r\n3 305 2808 2807 1078 \r\n3 845 2808 2804 1079 \r\n3 305 2799 2808 1079 \r\n3 269 2804 2799 1079 \r\n3 846 2810 2809 1080 \r\n3 270 2597 2810 1080 \r\n3 271 2809 2597 1080 \r\n3 846 2809 2812 1081 \r\n3 271 2811 2809 1081 \r\n3 307 2812 2811 1081 \r\n3 846 2812 2814 1082 \r\n3 307 2813 2812 1082 \r\n3 306 2814 2813 1082 \r\n3 846 2814 2810 1083 \r\n3 306 2805 2814 1083 \r\n3 270 2810 2805 1083 \r\n3 847 2816 2815 1084 \r\n3 271 2603 2816 1084 \r\n3 272 2815 2603 1084 \r\n3 847 2815 2818 1085 \r\n3 272 2817 2815 1085 \r\n3 308 2818 2817 1085 \r\n3 847 2818 2820 1086 \r\n3 308 2819 2818 1086 \r\n3 307 2820 2819 1086 \r\n3 847 2820 2816 1087 \r\n3 307 2811 2820 1087 \r\n3 271 2816 2811 1087 \r\n3 848 2822 2821 1088 \r\n3 272 2609 2822 1088 \r\n3 273 2821 2609 1088 \r\n3 848 2821 2824 1089 \r\n3 273 2823 2821 1089 \r\n3 309 2824 2823 1089 \r\n3 848 2824 2826 1090 \r\n3 309 2825 2824 1090 \r\n3 308 2826 2825 1090 \r\n3 848 2826 2822 1091 \r\n3 308 2817 2826 1091 \r\n3 272 2822 2817 1091 \r\n3 849 2828 2827 1092 \r\n3 273 2615 2828 1092 \r\n3 274 2827 2615 1092 \r\n3 849 2827 2830 1093 \r\n3 274 2829 2827 1093 \r\n3 310 2830 2829 1093 \r\n3 849 2830 2832 1094 \r\n3 310 2831 2830 1094 \r\n3 309 2832 2831 1094 \r\n3 849 2832 2828 1095 \r\n3 309 2823 2832 1095 \r\n3 273 2828 2823 1095 \r\n3 850 2834 2833 1096 \r\n3 274 2621 2834 1096 \r\n3 275 2833 2621 1096 \r\n3 850 2833 2836 1097 \r\n3 275 2835 2833 1097 \r\n3 311 2836 2835 1097 \r\n3 850 2836 2838 1098 \r\n3 311 2837 2836 1098 \r\n3 310 2838 2837 1098 \r\n3 850 2838 2834 1099 \r\n3 310 2829 2838 1099 \r\n3 274 2834 2829 1099 \r\n3 851 2840 2839 1100 \r\n3 275 2627 2840 1100 \r\n3 276 2839 2627 1100 \r\n3 851 2839 2842 1101 \r\n3 276 2841 2839 1101 \r\n3 312 2842 2841 1101 \r\n3 851 2842 2844 1102 \r\n3 312 2843 2842 1102 \r\n3 311 2844 2843 1102 \r\n3 851 2844 2840 1103 \r\n3 311 2835 2844 1103 \r\n3 275 2840 2835 1103 \r\n3 852 2846 2845 1104 \r\n3 276 2633 2846 1104 \r\n3 277 2845 2633 1104 \r\n3 852 2845 2848 1105 \r\n3 277 2847 2845 1105 \r\n3 313 2848 2847 1105 \r\n3 852 2848 2850 1106 \r\n3 313 2849 2848 1106 \r\n3 312 2850 2849 1106 \r\n3 852 2850 2846 1107 \r\n3 312 2841 2850 1107 \r\n3 276 2846 2841 1107 \r\n3 853 2852 2851 1108 \r\n3 277 2639 2852 1108 \r\n3 278 2851 2639 1108 \r\n3 853 2851 2854 1109 \r\n3 278 2853 2851 1109 \r\n3 314 2854 2853 1109 \r\n3 853 2854 2856 1110 \r\n3 314 2855 2854 1110 \r\n3 313 2856 2855 1110 \r\n3 853 2856 2852 1111 \r\n3 313 2847 2856 1111 \r\n3 277 2852 2847 1111 \r\n3 854 2858 2857 1112 \r\n3 278 2645 2858 1112 \r\n3 279 2857 2645 1112 \r\n3 854 2857 2860 1113 \r\n3 279 2859 2857 1113 \r\n3 315 2860 2859 1113 \r\n3 854 2860 2862 1114 \r\n3 315 2861 2860 1114 \r\n3 314 2862 2861 1114 \r\n3 854 2862 2858 1115 \r\n3 314 2853 2862 1115 \r\n3 278 2858 2853 1115 \r\n3 855 2864 2863 1116 \r\n3 279 2651 2864 1116 \r\n3 280 2863 2651 1116 \r\n3 855 2863 2866 1117 \r\n3 280 2865 2863 1117 \r\n3 316 2866 2865 1117 \r\n3 855 2866 2868 1118 \r\n3 316 2867 2866 1118 \r\n3 315 2868 2867 1118 \r\n3 855 2868 2864 1119 \r\n3 315 2859 2868 1119 \r\n3 279 2864 2859 1119 \r\n3 856 2870 2869 1120 \r\n3 280 2657 2870 1120 \r\n3 281 2869 2657 1120 \r\n3 856 2869 2872 1121 \r\n3 281 2871 2869 1121 \r\n3 317 2872 2871 1121 \r\n3 856 2872 2874 1122 \r\n3 317 2873 2872 1122 \r\n3 316 2874 2873 1122 \r\n3 856 2874 2870 1123 \r\n3 316 2865 2874 1123 \r\n3 280 2870 2865 1123 \r\n3 857 2876 2875 1124 \r\n3 281 2663 2876 1124 \r\n3 282 2875 2663 1124 \r\n3 857 2875 2878 1125 \r\n3 282 2877 2875 1125 \r\n3 318 2878 2877 1125 \r\n3 857 2878 2880 1126 \r\n3 318 2879 2878 1126 \r\n3 317 2880 2879 1126 \r\n3 857 2880 2876 1127 \r\n3 317 2871 2880 1127 \r\n3 281 2876 2871 1127 \r\n3 858 2882 2881 1128 \r\n3 282 2669 2882 1128 \r\n3 283 2881 2669 1128 \r\n3 858 2881 2884 1129 \r\n3 283 2883 2881 1129 \r\n3 319 2884 2883 1129 \r\n3 858 2884 2886 1130 \r\n3 319 2885 2884 1130 \r\n3 318 2886 2885 1130 \r\n3 858 2886 2882 1131 \r\n3 318 2877 2886 1131 \r\n3 282 2882 2877 1131 \r\n3 859 2888 2887 1132 \r\n3 283 2675 2888 1132 \r\n3 284 2887 2675 1132 \r\n3 859 2887 2890 1133 \r\n3 284 2889 2887 1133 \r\n3 320 2890 2889 1133 \r\n3 859 2890 2892 1134 \r\n3 320 2891 2890 1134 \r\n3 319 2892 2891 1134 \r\n3 859 2892 2888 1135 \r\n3 319 2883 2892 1135 \r\n3 283 2888 2883 1135 \r\n3 860 2894 2893 1136 \r\n3 284 2681 2894 1136 \r\n3 285 2893 2681 1136 \r\n3 860 2893 2896 1137 \r\n3 285 2895 2893 1137 \r\n3 321 2896 2895 1137 \r\n3 860 2896 2898 1138 \r\n3 321 2897 2896 1138 \r\n3 320 2898 2897 1138 \r\n3 860 2898 2894 1139 \r\n3 320 2889 2898 1139 \r\n3 284 2894 2889 1139 \r\n3 861 2900 2899 1140 \r\n3 285 2687 2900 1140 \r\n3 286 2899 2687 1140 \r\n3 861 2899 2902 1141 \r\n3 286 2901 2899 1141 \r\n3 322 2902 2901 1141 \r\n3 861 2902 2904 1142 \r\n3 322 2903 2902 1142 \r\n3 321 2904 2903 1142 \r\n3 861 2904 2900 1143 \r\n3 321 2895 2904 1143 \r\n3 285 2900 2895 1143 \r\n3 862 2906 2905 1144 \r\n3 286 2693 2906 1144 \r\n3 287 2905 2693 1144 \r\n3 862 2905 2908 1145 \r\n3 287 2907 2905 1145 \r\n3 323 2908 2907 1145 \r\n3 862 2908 2910 1146 \r\n3 323 2909 2908 1146 \r\n3 322 2910 2909 1146 \r\n3 862 2910 2906 1147 \r\n3 322 2901 2910 1147 \r\n3 286 2906 2901 1147 \r\n3 863 2912 2911 1148 \r\n3 287 2698 2912 1148 \r\n3 252 2911 2698 1148 \r\n3 863 2911 2913 1149 \r\n3 252 2706 2911 1149 \r\n3 288 2913 2706 1149 \r\n3 863 2913 2915 1150 \r\n3 288 2914 2913 1150 \r\n3 323 2915 2914 1150 \r\n3 863 2915 2912 1151 \r\n3 323 2907 2915 1151 \r\n3 287 2912 2907 1151 \r\n3 864 2917 2916 1152 \r\n3 288 2704 2917 1152 \r\n3 289 2916 2704 1152 \r\n3 864 2916 2919 1153 \r\n3 289 2918 2916 1153 \r\n3 325 2919 2918 1153 \r\n3 864 2919 2921 1154 \r\n3 325 2920 2919 1154 \r\n3 324 2921 2920 1154 \r\n3 864 2921 2917 1155 \r\n3 324 2922 2921 1155 \r\n3 288 2917 2922 1155 \r\n3 865 2924 2923 1156 \r\n3 289 2711 2924 1156 \r\n3 290 2923 2711 1156 \r\n3 865 2923 2926 1157 \r\n3 290 2925 2923 1157 \r\n3 326 2926 2925 1157 \r\n3 865 2926 2928 1158 \r\n3 326 2927 2926 1158 \r\n3 325 2928 2927 1158 \r\n3 865 2928 2924 1159 \r\n3 325 2918 2928 1159 \r\n3 289 2924 2918 1159 \r\n3 866 2930 2929 1160 \r\n3 290 2717 2930 1160 \r\n3 291 2929 2717 1160 \r\n3 866 2929 2932 1161 \r\n3 291 2931 2929 1161 \r\n3 327 2932 2931 1161 \r\n3 866 2932 2934 1162 \r\n3 327 2933 2932 1162 \r\n3 326 2934 2933 1162 \r\n3 866 2934 2930 1163 \r\n3 326 2925 2934 1163 \r\n3 290 2930 2925 1163 \r\n3 867 2936 2935 1164 \r\n3 291 2723 2936 1164 \r\n3 292 2935 2723 1164 \r\n3 867 2935 2938 1165 \r\n3 292 2937 2935 1165 \r\n3 328 2938 2937 1165 \r\n3 867 2938 2940 1166 \r\n3 328 2939 2938 1166 \r\n3 327 2940 2939 1166 \r\n3 867 2940 2936 1167 \r\n3 327 2931 2940 1167 \r\n3 291 2936 2931 1167 \r\n3 868 2942 2941 1168 \r\n3 292 2729 2942 1168 \r\n3 293 2941 2729 1168 \r\n3 868 2941 2944 1169 \r\n3 293 2943 2941 1169 \r\n3 329 2944 2943 1169 \r\n3 868 2944 2946 1170 \r\n3 329 2945 2944 1170 \r\n3 328 2946 2945 1170 \r\n3 868 2946 2942 1171 \r\n3 328 2937 2946 1171 \r\n3 292 2942 2937 1171 \r\n3 869 2948 2947 1172 \r\n3 293 2735 2948 1172 \r\n3 294 2947 2735 1172 \r\n3 869 2947 2950 1173 \r\n3 294 2949 2947 1173 \r\n3 330 2950 2949 1173 \r\n3 869 2950 2952 1174 \r\n3 330 2951 2950 1174 \r\n3 329 2952 2951 1174 \r\n3 869 2952 2948 1175 \r\n3 329 2943 2952 1175 \r\n3 293 2948 2943 1175 \r\n3 870 2954 2953 1176 \r\n3 294 2741 2954 1176 \r\n3 295 2953 2741 1176 \r\n3 870 2953 2956 1177 \r\n3 295 2955 2953 1177 \r\n3 331 2956 2955 1177 \r\n3 870 2956 2958 1178 \r\n3 331 2957 2956 1178 \r\n3 330 2958 2957 1178 \r\n3 870 2958 2954 1179 \r\n3 330 2949 2958 1179 \r\n3 294 2954 2949 1179 \r\n3 871 2960 2959 1180 \r\n3 295 2747 2960 1180 \r\n3 296 2959 2747 1180 \r\n3 871 2959 2962 1181 \r\n3 296 2961 2959 1181 \r\n3 332 2962 2961 1181 \r\n3 871 2962 2964 1182 \r\n3 332 2963 2962 1182 \r\n3 331 2964 2963 1182 \r\n3 871 2964 2960 1183 \r\n3 331 2955 2964 1183 \r\n3 295 2960 2955 1183 \r\n3 872 2966 2965 1184 \r\n3 296 2753 2966 1184 \r\n3 297 2965 2753 1184 \r\n3 872 2965 2968 1185 \r\n3 297 2967 2965 1185 \r\n3 333 2968 2967 1185 \r\n3 872 2968 2970 1186 \r\n3 333 2969 2968 1186 \r\n3 332 2970 2969 1186 \r\n3 872 2970 2966 1187 \r\n3 332 2961 2970 1187 \r\n3 296 2966 2961 1187 \r\n3 873 2972 2971 1188 \r\n3 297 2759 2972 1188 \r\n3 298 2971 2759 1188 \r\n3 873 2971 2974 1189 \r\n3 298 2973 2971 1189 \r\n3 334 2974 2973 1189 \r\n3 873 2974 2976 1190 \r\n3 334 2975 2974 1190 \r\n3 333 2976 2975 1190 \r\n3 873 2976 2972 1191 \r\n3 333 2967 2976 1191 \r\n3 297 2972 2967 1191 \r\n3 874 2978 2977 1192 \r\n3 298 2765 2978 1192 \r\n3 299 2977 2765 1192 \r\n3 874 2977 2980 1193 \r\n3 299 2979 2977 1193 \r\n3 335 2980 2979 1193 \r\n3 874 2980 2982 1194 \r\n3 335 2981 2980 1194 \r\n3 334 2982 2981 1194 \r\n3 874 2982 2978 1195 \r\n3 334 2973 2982 1195 \r\n3 298 2978 2973 1195 \r\n3 875 2984 2983 1196 \r\n3 299 2771 2984 1196 \r\n3 300 2983 2771 1196 \r\n3 875 2983 2986 1197 \r\n3 300 2985 2983 1197 \r\n3 336 2986 2985 1197 \r\n3 875 2986 2988 1198 \r\n3 336 2987 2986 1198 \r\n3 335 2988 2987 1198 \r\n3 875 2988 2984 1199 \r\n3 335 2979 2988 1199 \r\n3 299 2984 2979 1199 \r\n3 876 2990 2989 1200 \r\n3 300 2777 2990 1200 \r\n3 301 2989 2777 1200 \r\n3 876 2989 2992 1201 \r\n3 301 2991 2989 1201 \r\n3 337 2992 2991 1201 \r\n3 876 2992 2994 1202 \r\n3 337 2993 2992 1202 \r\n3 336 2994 2993 1202 \r\n3 876 2994 2990 1203 \r\n3 336 2985 2994 1203 \r\n3 300 2990 2985 1203 \r\n3 877 2996 2995 1204 \r\n3 301 2783 2996 1204 \r\n3 302 2995 2783 1204 \r\n3 877 2995 2998 1205 \r\n3 302 2997 2995 1205 \r\n3 338 2998 2997 1205 \r\n3 877 2998 3000 1206 \r\n3 338 2999 2998 1206 \r\n3 337 3000 2999 1206 \r\n3 877 3000 2996 1207 \r\n3 337 2991 3000 1207 \r\n3 301 2996 2991 1207 \r\n3 878 3002 3001 1208 \r\n3 302 2789 3002 1208 \r\n3 303 3001 2789 1208 \r\n3 878 3001 3004 1209 \r\n3 303 3003 3001 1209 \r\n3 339 3004 3003 1209 \r\n3 878 3004 3006 1210 \r\n3 339 3005 3004 1210 \r\n3 338 3006 3005 1210 \r\n3 878 3006 3002 1211 \r\n3 338 2997 3006 1211 \r\n3 302 3002 2997 1211 \r\n3 879 3008 3007 1212 \r\n3 303 2795 3008 1212 \r\n3 304 3007 2795 1212 \r\n3 879 3007 3010 1213 \r\n3 304 3009 3007 1213 \r\n3 340 3010 3009 1213 \r\n3 879 3010 3012 1214 \r\n3 340 3011 3010 1214 \r\n3 339 3012 3011 1214 \r\n3 879 3012 3008 1215 \r\n3 339 3003 3012 1215 \r\n3 303 3008 3003 1215 \r\n3 880 3014 3013 1216 \r\n3 304 2801 3014 1216 \r\n3 305 3013 2801 1216 \r\n3 880 3013 3016 1217 \r\n3 305 3015 3013 1217 \r\n3 341 3016 3015 1217 \r\n3 880 3016 3018 1218 \r\n3 341 3017 3016 1218 \r\n3 340 3018 3017 1218 \r\n3 880 3018 3014 1219 \r\n3 340 3009 3018 1219 \r\n3 304 3014 3009 1219 \r\n3 881 3020 3019 1220 \r\n3 305 2807 3020 1220 \r\n3 306 3019 2807 1220 \r\n3 881 3019 3022 1221 \r\n3 306 3021 3019 1221 \r\n3 342 3022 3021 1221 \r\n3 881 3022 3024 1222 \r\n3 342 3023 3022 1222 \r\n3 341 3024 3023 1222 \r\n3 881 3024 3020 1223 \r\n3 341 3015 3024 1223 \r\n3 305 3020 3015 1223 \r\n3 882 3026 3025 1224 \r\n3 306 2813 3026 1224 \r\n3 307 3025 2813 1224 \r\n3 882 3025 3028 1225 \r\n3 307 3027 3025 1225 \r\n3 343 3028 3027 1225 \r\n3 882 3028 3030 1226 \r\n3 343 3029 3028 1226 \r\n3 342 3030 3029 1226 \r\n3 882 3030 3026 1227 \r\n3 342 3021 3030 1227 \r\n3 306 3026 3021 1227 \r\n3 883 3032 3031 1228 \r\n3 307 2819 3032 1228 \r\n3 308 3031 2819 1228 \r\n3 883 3031 3034 1229 \r\n3 308 3033 3031 1229 \r\n3 344 3034 3033 1229 \r\n3 883 3034 3036 1230 \r\n3 344 3035 3034 1230 \r\n3 343 3036 3035 1230 \r\n3 883 3036 3032 1231 \r\n3 343 3027 3036 1231 \r\n3 307 3032 3027 1231 \r\n3 884 3038 3037 1232 \r\n3 308 2825 3038 1232 \r\n3 309 3037 2825 1232 \r\n3 884 3037 3040 1233 \r\n3 309 3039 3037 1233 \r\n3 345 3040 3039 1233 \r\n3 884 3040 3042 1234 \r\n3 345 3041 3040 1234 \r\n3 344 3042 3041 1234 \r\n3 884 3042 3038 1235 \r\n3 344 3033 3042 1235 \r\n3 308 3038 3033 1235 \r\n3 885 3044 3043 1236 \r\n3 309 2831 3044 1236 \r\n3 310 3043 2831 1236 \r\n3 885 3043 3046 1237 \r\n3 310 3045 3043 1237 \r\n3 346 3046 3045 1237 \r\n3 885 3046 3048 1238 \r\n3 346 3047 3046 1238 \r\n3 345 3048 3047 1238 \r\n3 885 3048 3044 1239 \r\n3 345 3039 3048 1239 \r\n3 309 3044 3039 1239 \r\n3 886 3050 3049 1240 \r\n3 310 2837 3050 1240 \r\n3 311 3049 2837 1240 \r\n3 886 3049 3052 1241 \r\n3 311 3051 3049 1241 \r\n3 347 3052 3051 1241 \r\n3 886 3052 3054 1242 \r\n3 347 3053 3052 1242 \r\n3 346 3054 3053 1242 \r\n3 886 3054 3050 1243 \r\n3 346 3045 3054 1243 \r\n3 310 3050 3045 1243 \r\n3 887 3056 3055 1244 \r\n3 311 2843 3056 1244 \r\n3 312 3055 2843 1244 \r\n3 887 3055 3058 1245 \r\n3 312 3057 3055 1245 \r\n3 348 3058 3057 1245 \r\n3 887 3058 3060 1246 \r\n3 348 3059 3058 1246 \r\n3 347 3060 3059 1246 \r\n3 887 3060 3056 1247 \r\n3 347 3051 3060 1247 \r\n3 311 3056 3051 1247 \r\n3 888 3062 3061 1248 \r\n3 312 2849 3062 1248 \r\n3 313 3061 2849 1248 \r\n3 888 3061 3064 1249 \r\n3 313 3063 3061 1249 \r\n3 349 3064 3063 1249 \r\n3 888 3064 3066 1250 \r\n3 349 3065 3064 1250 \r\n3 348 3066 3065 1250 \r\n3 888 3066 3062 1251 \r\n3 348 3057 3066 1251 \r\n3 312 3062 3057 1251 \r\n3 889 3068 3067 1252 \r\n3 313 2855 3068 1252 \r\n3 314 3067 2855 1252 \r\n3 889 3067 3070 1253 \r\n3 314 3069 3067 1253 \r\n3 350 3070 3069 1253 \r\n3 889 3070 3072 1254 \r\n3 350 3071 3070 1254 \r\n3 349 3072 3071 1254 \r\n3 889 3072 3068 1255 \r\n3 349 3063 3072 1255 \r\n3 313 3068 3063 1255 \r\n3 890 3074 3073 1256 \r\n3 314 2861 3074 1256 \r\n3 315 3073 2861 1256 \r\n3 890 3073 3076 1257 \r\n3 315 3075 3073 1257 \r\n3 351 3076 3075 1257 \r\n3 890 3076 3078 1258 \r\n3 351 3077 3076 1258 \r\n3 350 3078 3077 1258 \r\n3 890 3078 3074 1259 \r\n3 350 3069 3078 1259 \r\n3 314 3074 3069 1259 \r\n3 891 3080 3079 1260 \r\n3 315 2867 3080 1260 \r\n3 316 3079 2867 1260 \r\n3 891 3079 3082 1261 \r\n3 316 3081 3079 1261 \r\n3 352 3082 3081 1261 \r\n3 891 3082 3084 1262 \r\n3 352 3083 3082 1262 \r\n3 351 3084 3083 1262 \r\n3 891 3084 3080 1263 \r\n3 351 3075 3084 1263 \r\n3 315 3080 3075 1263 \r\n3 892 3086 3085 1264 \r\n3 316 2873 3086 1264 \r\n3 317 3085 2873 1264 \r\n3 892 3085 3088 1265 \r\n3 317 3087 3085 1265 \r\n3 353 3088 3087 1265 \r\n3 892 3088 3090 1266 \r\n3 353 3089 3088 1266 \r\n3 352 3090 3089 1266 \r\n3 892 3090 3086 1267 \r\n3 352 3081 3090 1267 \r\n3 316 3086 3081 1267 \r\n3 893 3092 3091 1268 \r\n3 317 2879 3092 1268 \r\n3 318 3091 2879 1268 \r\n3 893 3091 3094 1269 \r\n3 318 3093 3091 1269 \r\n3 354 3094 3093 1269 \r\n3 893 3094 3096 1270 \r\n3 354 3095 3094 1270 \r\n3 353 3096 3095 1270 \r\n3 893 3096 3092 1271 \r\n3 353 3087 3096 1271 \r\n3 317 3092 3087 1271 \r\n3 894 3098 3097 1272 \r\n3 318 2885 3098 1272 \r\n3 319 3097 2885 1272 \r\n3 894 3097 3100 1273 \r\n3 319 3099 3097 1273 \r\n3 355 3100 3099 1273 \r\n3 894 3100 3102 1274 \r\n3 355 3101 3100 1274 \r\n3 354 3102 3101 1274 \r\n3 894 3102 3098 1275 \r\n3 354 3093 3102 1275 \r\n3 318 3098 3093 1275 \r\n3 895 3104 3103 1276 \r\n3 319 2891 3104 1276 \r\n3 320 3103 2891 1276 \r\n3 895 3103 3106 1277 \r\n3 320 3105 3103 1277 \r\n3 356 3106 3105 1277 \r\n3 895 3106 3108 1278 \r\n3 356 3107 3106 1278 \r\n3 355 3108 3107 1278 \r\n3 895 3108 3104 1279 \r\n3 355 3099 3108 1279 \r\n3 319 3104 3099 1279 \r\n3 896 3110 3109 1280 \r\n3 320 2897 3110 1280 \r\n3 321 3109 2897 1280 \r\n3 896 3109 3112 1281 \r\n3 321 3111 3109 1281 \r\n3 357 3112 3111 1281 \r\n3 896 3112 3114 1282 \r\n3 357 3113 3112 1282 \r\n3 356 3114 3113 1282 \r\n3 896 3114 3110 1283 \r\n3 356 3105 3114 1283 \r\n3 320 3110 3105 1283 \r\n3 897 3116 3115 1284 \r\n3 321 2903 3116 1284 \r\n3 322 3115 2903 1284 \r\n3 897 3115 3118 1285 \r\n3 322 3117 3115 1285 \r\n3 358 3118 3117 1285 \r\n3 897 3118 3120 1286 \r\n3 358 3119 3118 1286 \r\n3 357 3120 3119 1286 \r\n3 897 3120 3116 1287 \r\n3 357 3111 3120 1287 \r\n3 321 3116 3111 1287 \r\n3 898 3122 3121 1288 \r\n3 322 2909 3122 1288 \r\n3 323 3121 2909 1288 \r\n3 898 3121 3124 1289 \r\n3 323 3123 3121 1289 \r\n3 359 3124 3123 1289 \r\n3 898 3124 3126 1290 \r\n3 359 3125 3124 1290 \r\n3 358 3126 3125 1290 \r\n3 898 3126 3122 1291 \r\n3 358 3117 3126 1291 \r\n3 322 3122 3117 1291 \r\n3 899 3128 3127 1292 \r\n3 323 2914 3128 1292 \r\n3 288 3127 2914 1292 \r\n3 899 3127 3129 1293 \r\n3 288 2922 3127 1293 \r\n3 324 3129 2922 1293 \r\n3 899 3129 3131 1294 \r\n3 324 3130 3129 1294 \r\n3 359 3131 3130 1294 \r\n3 899 3131 3128 1295 \r\n3 359 3123 3131 1295 \r\n3 323 3128 3123 1295 \r\n3 900 3133 3132 1296 \r\n3 324 2920 3133 1296 \r\n3 325 3132 2920 1296 \r\n3 900 3132 3135 1297 \r\n3 325 3134 3132 1297 \r\n3 361 3135 3134 1297 \r\n3 900 3135 3137 1298 \r\n3 361 3136 3135 1298 \r\n3 360 3137 3136 1298 \r\n3 900 3137 3133 1299 \r\n3 360 3138 3137 1299 \r\n3 324 3133 3138 1299 \r\n3 901 3140 3139 1300 \r\n3 325 2927 3140 1300 \r\n3 326 3139 2927 1300 \r\n3 901 3139 3142 1301 \r\n3 326 3141 3139 1301 \r\n3 362 3142 3141 1301 \r\n3 901 3142 3144 1302 \r\n3 362 3143 3142 1302 \r\n3 361 3144 3143 1302 \r\n3 901 3144 3140 1303 \r\n3 361 3134 3144 1303 \r\n3 325 3140 3134 1303 \r\n3 902 3146 3145 1304 \r\n3 326 2933 3146 1304 \r\n3 327 3145 2933 1304 \r\n3 902 3145 3148 1305 \r\n3 327 3147 3145 1305 \r\n3 363 3148 3147 1305 \r\n3 902 3148 3150 1306 \r\n3 363 3149 3148 1306 \r\n3 362 3150 3149 1306 \r\n3 902 3150 3146 1307 \r\n3 362 3141 3150 1307 \r\n3 326 3146 3141 1307 \r\n3 903 3152 3151 1308 \r\n3 327 2939 3152 1308 \r\n3 328 3151 2939 1308 \r\n3 903 3151 3154 1309 \r\n3 328 3153 3151 1309 \r\n3 364 3154 3153 1309 \r\n3 903 3154 3156 1310 \r\n3 364 3155 3154 1310 \r\n3 363 3156 3155 1310 \r\n3 903 3156 3152 1311 \r\n3 363 3147 3156 1311 \r\n3 327 3152 3147 1311 \r\n3 904 3158 3157 1312 \r\n3 328 2945 3158 1312 \r\n3 329 3157 2945 1312 \r\n3 904 3157 3160 1313 \r\n3 329 3159 3157 1313 \r\n3 365 3160 3159 1313 \r\n3 904 3160 3162 1314 \r\n3 365 3161 3160 1314 \r\n3 364 3162 3161 1314 \r\n3 904 3162 3158 1315 \r\n3 364 3153 3162 1315 \r\n3 328 3158 3153 1315 \r\n3 905 3164 3163 1316 \r\n3 329 2951 3164 1316 \r\n3 330 3163 2951 1316 \r\n3 905 3163 3166 1317 \r\n3 330 3165 3163 1317 \r\n3 366 3166 3165 1317 \r\n3 905 3166 3168 1318 \r\n3 366 3167 3166 1318 \r\n3 365 3168 3167 1318 \r\n3 905 3168 3164 1319 \r\n3 365 3159 3168 1319 \r\n3 329 3164 3159 1319 \r\n3 906 3170 3169 1320 \r\n3 330 2957 3170 1320 \r\n3 331 3169 2957 1320 \r\n3 906 3169 3172 1321 \r\n3 331 3171 3169 1321 \r\n3 367 3172 3171 1321 \r\n3 906 3172 3174 1322 \r\n3 367 3173 3172 1322 \r\n3 366 3174 3173 1322 \r\n3 906 3174 3170 1323 \r\n3 366 3165 3174 1323 \r\n3 330 3170 3165 1323 \r\n3 907 3176 3175 1324 \r\n3 331 2963 3176 1324 \r\n3 332 3175 2963 1324 \r\n3 907 3175 3178 1325 \r\n3 332 3177 3175 1325 \r\n3 368 3178 3177 1325 \r\n3 907 3178 3180 1326 \r\n3 368 3179 3178 1326 \r\n3 367 3180 3179 1326 \r\n3 907 3180 3176 1327 \r\n3 367 3171 3180 1327 \r\n3 331 3176 3171 1327 \r\n3 908 3182 3181 1328 \r\n3 332 2969 3182 1328 \r\n3 333 3181 2969 1328 \r\n3 908 3181 3184 1329 \r\n3 333 3183 3181 1329 \r\n3 369 3184 3183 1329 \r\n3 908 3184 3186 1330 \r\n3 369 3185 3184 1330 \r\n3 368 3186 3185 1330 \r\n3 908 3186 3182 1331 \r\n3 368 3177 3186 1331 \r\n3 332 3182 3177 1331 \r\n3 909 3188 3187 1332 \r\n3 333 2975 3188 1332 \r\n3 334 3187 2975 1332 \r\n3 909 3187 3190 1333 \r\n3 334 3189 3187 1333 \r\n3 370 3190 3189 1333 \r\n3 909 3190 3192 1334 \r\n3 370 3191 3190 1334 \r\n3 369 3192 3191 1334 \r\n3 909 3192 3188 1335 \r\n3 369 3183 3192 1335 \r\n3 333 3188 3183 1335 \r\n3 910 3194 3193 1336 \r\n3 334 2981 3194 1336 \r\n3 335 3193 2981 1336 \r\n3 910 3193 3196 1337 \r\n3 335 3195 3193 1337 \r\n3 371 3196 3195 1337 \r\n3 910 3196 3198 1338 \r\n3 371 3197 3196 1338 \r\n3 370 3198 3197 1338 \r\n3 910 3198 3194 1339 \r\n3 370 3189 3198 1339 \r\n3 334 3194 3189 1339 \r\n3 911 3200 3199 1340 \r\n3 335 2987 3200 1340 \r\n3 336 3199 2987 1340 \r\n3 911 3199 3202 1341 \r\n3 336 3201 3199 1341 \r\n3 372 3202 3201 1341 \r\n3 911 3202 3204 1342 \r\n3 372 3203 3202 1342 \r\n3 371 3204 3203 1342 \r\n3 911 3204 3200 1343 \r\n3 371 3195 3204 1343 \r\n3 335 3200 3195 1343 \r\n3 912 3206 3205 1344 \r\n3 336 2993 3206 1344 \r\n3 337 3205 2993 1344 \r\n3 912 3205 3208 1345 \r\n3 337 3207 3205 1345 \r\n3 373 3208 3207 1345 \r\n3 912 3208 3210 1346 \r\n3 373 3209 3208 1346 \r\n3 372 3210 3209 1346 \r\n3 912 3210 3206 1347 \r\n3 372 3201 3210 1347 \r\n3 336 3206 3201 1347 \r\n3 913 3212 3211 1348 \r\n3 337 2999 3212 1348 \r\n3 338 3211 2999 1348 \r\n3 913 3211 3214 1349 \r\n3 338 3213 3211 1349 \r\n3 374 3214 3213 1349 \r\n3 913 3214 3216 1350 \r\n3 374 3215 3214 1350 \r\n3 373 3216 3215 1350 \r\n3 913 3216 3212 1351 \r\n3 373 3207 3216 1351 \r\n3 337 3212 3207 1351 \r\n3 914 3218 3217 1352 \r\n3 338 3005 3218 1352 \r\n3 339 3217 3005 1352 \r\n3 914 3217 3220 1353 \r\n3 339 3219 3217 1353 \r\n3 375 3220 3219 1353 \r\n3 914 3220 3222 1354 \r\n3 375 3221 3220 1354 \r\n3 374 3222 3221 1354 \r\n3 914 3222 3218 1355 \r\n3 374 3213 3222 1355 \r\n3 338 3218 3213 1355 \r\n3 915 3224 3223 1356 \r\n3 339 3011 3224 1356 \r\n3 340 3223 3011 1356 \r\n3 915 3223 3226 1357 \r\n3 340 3225 3223 1357 \r\n3 376 3226 3225 1357 \r\n3 915 3226 3228 1358 \r\n3 376 3227 3226 1358 \r\n3 375 3228 3227 1358 \r\n3 915 3228 3224 1359 \r\n3 375 3219 3228 1359 \r\n3 339 3224 3219 1359 \r\n3 916 3230 3229 1360 \r\n3 340 3017 3230 1360 \r\n3 341 3229 3017 1360 \r\n3 916 3229 3232 1361 \r\n3 341 3231 3229 1361 \r\n3 377 3232 3231 1361 \r\n3 916 3232 3234 1362 \r\n3 377 3233 3232 1362 \r\n3 376 3234 3233 1362 \r\n3 916 3234 3230 1363 \r\n3 376 3225 3234 1363 \r\n3 340 3230 3225 1363 \r\n3 917 3236 3235 1364 \r\n3 341 3023 3236 1364 \r\n3 342 3235 3023 1364 \r\n3 917 3235 3238 1365 \r\n3 342 3237 3235 1365 \r\n3 378 3238 3237 1365 \r\n3 917 3238 3240 1366 \r\n3 378 3239 3238 1366 \r\n3 377 3240 3239 1366 \r\n3 917 3240 3236 1367 \r\n3 377 3231 3240 1367 \r\n3 341 3236 3231 1367 \r\n3 918 3242 3241 1368 \r\n3 342 3029 3242 1368 \r\n3 343 3241 3029 1368 \r\n3 918 3241 3244 1369 \r\n3 343 3243 3241 1369 \r\n3 379 3244 3243 1369 \r\n3 918 3244 3246 1370 \r\n3 379 3245 3244 1370 \r\n3 378 3246 3245 1370 \r\n3 918 3246 3242 1371 \r\n3 378 3237 3246 1371 \r\n3 342 3242 3237 1371 \r\n3 919 3248 3247 1372 \r\n3 343 3035 3248 1372 \r\n3 344 3247 3035 1372 \r\n3 919 3247 3250 1373 \r\n3 344 3249 3247 1373 \r\n3 380 3250 3249 1373 \r\n3 919 3250 3252 1374 \r\n3 380 3251 3250 1374 \r\n3 379 3252 3251 1374 \r\n3 919 3252 3248 1375 \r\n3 379 3243 3252 1375 \r\n3 343 3248 3243 1375 \r\n3 920 3254 3253 1376 \r\n3 344 3041 3254 1376 \r\n3 345 3253 3041 1376 \r\n3 920 3253 3256 1377 \r\n3 345 3255 3253 1377 \r\n3 381 3256 3255 1377 \r\n3 920 3256 3258 1378 \r\n3 381 3257 3256 1378 \r\n3 380 3258 3257 1378 \r\n3 920 3258 3254 1379 \r\n3 380 3249 3258 1379 \r\n3 344 3254 3249 1379 \r\n3 921 3260 3259 1380 \r\n3 345 3047 3260 1380 \r\n3 346 3259 3047 1380 \r\n3 921 3259 3262 1381 \r\n3 346 3261 3259 1381 \r\n3 382 3262 3261 1381 \r\n3 921 3262 3264 1382 \r\n3 382 3263 3262 1382 \r\n3 381 3264 3263 1382 \r\n3 921 3264 3260 1383 \r\n3 381 3255 3264 1383 \r\n3 345 3260 3255 1383 \r\n3 922 3266 3265 1384 \r\n3 346 3053 3266 1384 \r\n3 347 3265 3053 1384 \r\n3 922 3265 3268 1385 \r\n3 347 3267 3265 1385 \r\n3 383 3268 3267 1385 \r\n3 922 3268 3270 1386 \r\n3 383 3269 3268 1386 \r\n3 382 3270 3269 1386 \r\n3 922 3270 3266 1387 \r\n3 382 3261 3270 1387 \r\n3 346 3266 3261 1387 \r\n3 923 3272 3271 1388 \r\n3 347 3059 3272 1388 \r\n3 348 3271 3059 1388 \r\n3 923 3271 3274 1389 \r\n3 348 3273 3271 1389 \r\n3 384 3274 3273 1389 \r\n3 923 3274 3276 1390 \r\n3 384 3275 3274 1390 \r\n3 383 3276 3275 1390 \r\n3 923 3276 3272 1391 \r\n3 383 3267 3276 1391 \r\n3 347 3272 3267 1391 \r\n3 924 3278 3277 1392 \r\n3 348 3065 3278 1392 \r\n3 349 3277 3065 1392 \r\n3 924 3277 3280 1393 \r\n3 349 3279 3277 1393 \r\n3 385 3280 3279 1393 \r\n3 924 3280 3282 1394 \r\n3 385 3281 3280 1394 \r\n3 384 3282 3281 1394 \r\n3 924 3282 3278 1395 \r\n3 384 3273 3282 1395 \r\n3 348 3278 3273 1395 \r\n3 925 3284 3283 1396 \r\n3 349 3071 3284 1396 \r\n3 350 3283 3071 1396 \r\n3 925 3283 3286 1397 \r\n3 350 3285 3283 1397 \r\n3 386 3286 3285 1397 \r\n3 925 3286 3288 1398 \r\n3 386 3287 3286 1398 \r\n3 385 3288 3287 1398 \r\n3 925 3288 3284 1399 \r\n3 385 3279 3288 1399 \r\n3 349 3284 3279 1399 \r\n3 926 3290 3289 1400 \r\n3 350 3077 3290 1400 \r\n3 351 3289 3077 1400 \r\n3 926 3289 3292 1401 \r\n3 351 3291 3289 1401 \r\n3 387 3292 3291 1401 \r\n3 926 3292 3294 1402 \r\n3 387 3293 3292 1402 \r\n3 386 3294 3293 1402 \r\n3 926 3294 3290 1403 \r\n3 386 3285 3294 1403 \r\n3 350 3290 3285 1403 \r\n3 927 3296 3295 1404 \r\n3 351 3083 3296 1404 \r\n3 352 3295 3083 1404 \r\n3 927 3295 3298 1405 \r\n3 352 3297 3295 1405 \r\n3 388 3298 3297 1405 \r\n3 927 3298 3300 1406 \r\n3 388 3299 3298 1406 \r\n3 387 3300 3299 1406 \r\n3 927 3300 3296 1407 \r\n3 387 3291 3300 1407 \r\n3 351 3296 3291 1407 \r\n3 928 3302 3301 1408 \r\n3 352 3089 3302 1408 \r\n3 353 3301 3089 1408 \r\n3 928 3301 3304 1409 \r\n3 353 3303 3301 1409 \r\n3 389 3304 3303 1409 \r\n3 928 3304 3306 1410 \r\n3 389 3305 3304 1410 \r\n3 388 3306 3305 1410 \r\n3 928 3306 3302 1411 \r\n3 388 3297 3306 1411 \r\n3 352 3302 3297 1411 \r\n3 929 3308 3307 1412 \r\n3 353 3095 3308 1412 \r\n3 354 3307 3095 1412 \r\n3 929 3307 3310 1413 \r\n3 354 3309 3307 1413 \r\n3 390 3310 3309 1413 \r\n3 929 3310 3312 1414 \r\n3 390 3311 3310 1414 \r\n3 389 3312 3311 1414 \r\n3 929 3312 3308 1415 \r\n3 389 3303 3312 1415 \r\n3 353 3308 3303 1415 \r\n3 930 3314 3313 1416 \r\n3 354 3101 3314 1416 \r\n3 355 3313 3101 1416 \r\n3 930 3313 3316 1417 \r\n3 355 3315 3313 1417 \r\n3 391 3316 3315 1417 \r\n3 930 3316 3318 1418 \r\n3 391 3317 3316 1418 \r\n3 390 3318 3317 1418 \r\n3 930 3318 3314 1419 \r\n3 390 3309 3318 1419 \r\n3 354 3314 3309 1419 \r\n3 931 3320 3319 1420 \r\n3 355 3107 3320 1420 \r\n3 356 3319 3107 1420 \r\n3 931 3319 3322 1421 \r\n3 356 3321 3319 1421 \r\n3 392 3322 3321 1421 \r\n3 931 3322 3324 1422 \r\n3 392 3323 3322 1422 \r\n3 391 3324 3323 1422 \r\n3 931 3324 3320 1423 \r\n3 391 3315 3324 1423 \r\n3 355 3320 3315 1423 \r\n3 932 3326 3325 1424 \r\n3 356 3113 3326 1424 \r\n3 357 3325 3113 1424 \r\n3 932 3325 3328 1425 \r\n3 357 3327 3325 1425 \r\n3 393 3328 3327 1425 \r\n3 932 3328 3330 1426 \r\n3 393 3329 3328 1426 \r\n3 392 3330 3329 1426 \r\n3 932 3330 3326 1427 \r\n3 392 3321 3330 1427 \r\n3 356 3326 3321 1427 \r\n3 933 3332 3331 1428 \r\n3 357 3119 3332 1428 \r\n3 358 3331 3119 1428 \r\n3 933 3331 3334 1429 \r\n3 358 3333 3331 1429 \r\n3 394 3334 3333 1429 \r\n3 933 3334 3336 1430 \r\n3 394 3335 3334 1430 \r\n3 393 3336 3335 1430 \r\n3 933 3336 3332 1431 \r\n3 393 3327 3336 1431 \r\n3 357 3332 3327 1431 \r\n3 934 3338 3337 1432 \r\n3 358 3125 3338 1432 \r\n3 359 3337 3125 1432 \r\n3 934 3337 3340 1433 \r\n3 359 3339 3337 1433 \r\n3 395 3340 3339 1433 \r\n3 934 3340 3342 1434 \r\n3 395 3341 3340 1434 \r\n3 394 3342 3341 1434 \r\n3 934 3342 3338 1435 \r\n3 394 3333 3342 1435 \r\n3 358 3338 3333 1435 \r\n3 935 3344 3343 1436 \r\n3 359 3130 3344 1436 \r\n3 324 3343 3130 1436 \r\n3 935 3343 3345 1437 \r\n3 324 3138 3343 1437 \r\n3 360 3345 3138 1437 \r\n3 935 3345 3347 1438 \r\n3 360 3346 3345 1438 \r\n3 395 3347 3346 1438 \r\n3 935 3347 3344 1439 \r\n3 395 3339 3347 1439 \r\n3 359 3344 3339 1439 \r\n3 936 3349 3348 1440 \r\n3 360 3136 3349 1440 \r\n3 361 3348 3136 1440 \r\n3 936 3348 3351 1441 \r\n3 361 3350 3348 1441 \r\n3 397 3351 3350 1441 \r\n3 936 3351 3353 1442 \r\n3 397 3352 3351 1442 \r\n3 396 3353 3352 1442 \r\n3 936 3353 3349 1443 \r\n3 396 3354 3353 1443 \r\n3 360 3349 3354 1443 \r\n3 937 3356 3355 1444 \r\n3 361 3143 3356 1444 \r\n3 362 3355 3143 1444 \r\n3 937 3355 3358 1445 \r\n3 362 3357 3355 1445 \r\n3 398 3358 3357 1445 \r\n3 937 3358 3360 1446 \r\n3 398 3359 3358 1446 \r\n3 397 3360 3359 1446 \r\n3 937 3360 3356 1447 \r\n3 397 3350 3360 1447 \r\n3 361 3356 3350 1447 \r\n3 938 3362 3361 1448 \r\n3 362 3149 3362 1448 \r\n3 363 3361 3149 1448 \r\n3 938 3361 3364 1449 \r\n3 363 3363 3361 1449 \r\n3 399 3364 3363 1449 \r\n3 938 3364 3366 1450 \r\n3 399 3365 3364 1450 \r\n3 398 3366 3365 1450 \r\n3 938 3366 3362 1451 \r\n3 398 3357 3366 1451 \r\n3 362 3362 3357 1451 \r\n3 939 3368 3367 1452 \r\n3 363 3155 3368 1452 \r\n3 364 3367 3155 1452 \r\n3 939 3367 3370 1453 \r\n3 364 3369 3367 1453 \r\n3 400 3370 3369 1453 \r\n3 939 3370 3372 1454 \r\n3 400 3371 3370 1454 \r\n3 399 3372 3371 1454 \r\n3 939 3372 3368 1455 \r\n3 399 3363 3372 1455 \r\n3 363 3368 3363 1455 \r\n3 940 3374 3373 1456 \r\n3 364 3161 3374 1456 \r\n3 365 3373 3161 1456 \r\n3 940 3373 3376 1457 \r\n3 365 3375 3373 1457 \r\n3 401 3376 3375 1457 \r\n3 940 3376 3378 1458 \r\n3 401 3377 3376 1458 \r\n3 400 3378 3377 1458 \r\n3 940 3378 3374 1459 \r\n3 400 3369 3378 1459 \r\n3 364 3374 3369 1459 \r\n3 941 3380 3379 1460 \r\n3 365 3167 3380 1460 \r\n3 366 3379 3167 1460 \r\n3 941 3379 3382 1461 \r\n3 366 3381 3379 1461 \r\n3 402 3382 3381 1461 \r\n3 941 3382 3384 1462 \r\n3 402 3383 3382 1462 \r\n3 401 3384 3383 1462 \r\n3 941 3384 3380 1463 \r\n3 401 3375 3384 1463 \r\n3 365 3380 3375 1463 \r\n3 942 3386 3385 1464 \r\n3 366 3173 3386 1464 \r\n3 367 3385 3173 1464 \r\n3 942 3385 3388 1465 \r\n3 367 3387 3385 1465 \r\n3 403 3388 3387 1465 \r\n3 942 3388 3390 1466 \r\n3 403 3389 3388 1466 \r\n3 402 3390 3389 1466 \r\n3 942 3390 3386 1467 \r\n3 402 3381 3390 1467 \r\n3 366 3386 3381 1467 \r\n3 943 3392 3391 1468 \r\n3 367 3179 3392 1468 \r\n3 368 3391 3179 1468 \r\n3 943 3391 3394 1469 \r\n3 368 3393 3391 1469 \r\n3 404 3394 3393 1469 \r\n3 943 3394 3396 1470 \r\n3 404 3395 3394 1470 \r\n3 403 3396 3395 1470 \r\n3 943 3396 3392 1471 \r\n3 403 3387 3396 1471 \r\n3 367 3392 3387 1471 \r\n3 944 3398 3397 1472 \r\n3 368 3185 3398 1472 \r\n3 369 3397 3185 1472 \r\n3 944 3397 3400 1473 \r\n3 369 3399 3397 1473 \r\n3 405 3400 3399 1473 \r\n3 944 3400 3402 1474 \r\n3 405 3401 3400 1474 \r\n3 404 3402 3401 1474 \r\n3 944 3402 3398 1475 \r\n3 404 3393 3402 1475 \r\n3 368 3398 3393 1475 \r\n3 945 3404 3403 1476 \r\n3 369 3191 3404 1476 \r\n3 370 3403 3191 1476 \r\n3 945 3403 3406 1477 \r\n3 370 3405 3403 1477 \r\n3 406 3406 3405 1477 \r\n3 945 3406 3408 1478 \r\n3 406 3407 3406 1478 \r\n3 405 3408 3407 1478 \r\n3 945 3408 3404 1479 \r\n3 405 3399 3408 1479 \r\n3 369 3404 3399 1479 \r\n3 946 3410 3409 1480 \r\n3 370 3197 3410 1480 \r\n3 371 3409 3197 1480 \r\n3 946 3409 3412 1481 \r\n3 371 3411 3409 1481 \r\n3 407 3412 3411 1481 \r\n3 946 3412 3414 1482 \r\n3 407 3413 3412 1482 \r\n3 406 3414 3413 1482 \r\n3 946 3414 3410 1483 \r\n3 406 3405 3414 1483 \r\n3 370 3410 3405 1483 \r\n3 947 3416 3415 1484 \r\n3 371 3203 3416 1484 \r\n3 372 3415 3203 1484 \r\n3 947 3415 3418 1485 \r\n3 372 3417 3415 1485 \r\n3 408 3418 3417 1485 \r\n3 947 3418 3420 1486 \r\n3 408 3419 3418 1486 \r\n3 407 3420 3419 1486 \r\n3 947 3420 3416 1487 \r\n3 407 3411 3420 1487 \r\n3 371 3416 3411 1487 \r\n3 948 3422 3421 1488 \r\n3 372 3209 3422 1488 \r\n3 373 3421 3209 1488 \r\n3 948 3421 3424 1489 \r\n3 373 3423 3421 1489 \r\n3 409 3424 3423 1489 \r\n3 948 3424 3426 1490 \r\n3 409 3425 3424 1490 \r\n3 408 3426 3425 1490 \r\n3 948 3426 3422 1491 \r\n3 408 3417 3426 1491 \r\n3 372 3422 3417 1491 \r\n3 949 3428 3427 1492 \r\n3 373 3215 3428 1492 \r\n3 374 3427 3215 1492 \r\n3 949 3427 3430 1493 \r\n3 374 3429 3427 1493 \r\n3 410 3430 3429 1493 \r\n3 949 3430 3432 1494 \r\n3 410 3431 3430 1494 \r\n3 409 3432 3431 1494 \r\n3 949 3432 3428 1495 \r\n3 409 3423 3432 1495 \r\n3 373 3428 3423 1495 \r\n3 950 3434 3433 1496 \r\n3 374 3221 3434 1496 \r\n3 375 3433 3221 1496 \r\n3 950 3433 3436 1497 \r\n3 375 3435 3433 1497 \r\n3 411 3436 3435 1497 \r\n3 950 3436 3438 1498 \r\n3 411 3437 3436 1498 \r\n3 410 3438 3437 1498 \r\n3 950 3438 3434 1499 \r\n3 410 3429 3438 1499 \r\n3 374 3434 3429 1499 \r\n3 951 3440 3439 1500 \r\n3 375 3227 3440 1500 \r\n3 376 3439 3227 1500 \r\n3 951 3439 3442 1501 \r\n3 376 3441 3439 1501 \r\n3 412 3442 3441 1501 \r\n3 951 3442 3444 1502 \r\n3 412 3443 3442 1502 \r\n3 411 3444 3443 1502 \r\n3 951 3444 3440 1503 \r\n3 411 3435 3444 1503 \r\n3 375 3440 3435 1503 \r\n3 952 3446 3445 1504 \r\n3 376 3233 3446 1504 \r\n3 377 3445 3233 1504 \r\n3 952 3445 3448 1505 \r\n3 377 3447 3445 1505 \r\n3 413 3448 3447 1505 \r\n3 952 3448 3450 1506 \r\n3 413 3449 3448 1506 \r\n3 412 3450 3449 1506 \r\n3 952 3450 3446 1507 \r\n3 412 3441 3450 1507 \r\n3 376 3446 3441 1507 \r\n3 953 3452 3451 1508 \r\n3 377 3239 3452 1508 \r\n3 378 3451 3239 1508 \r\n3 953 3451 3454 1509 \r\n3 378 3453 3451 1509 \r\n3 414 3454 3453 1509 \r\n3 953 3454 3456 1510 \r\n3 414 3455 3454 1510 \r\n3 413 3456 3455 1510 \r\n3 953 3456 3452 1511 \r\n3 413 3447 3456 1511 \r\n3 377 3452 3447 1511 \r\n3 954 3458 3457 1512 \r\n3 378 3245 3458 1512 \r\n3 379 3457 3245 1512 \r\n3 954 3457 3460 1513 \r\n3 379 3459 3457 1513 \r\n3 415 3460 3459 1513 \r\n3 954 3460 3462 1514 \r\n3 415 3461 3460 1514 \r\n3 414 3462 3461 1514 \r\n3 954 3462 3458 1515 \r\n3 414 3453 3462 1515 \r\n3 378 3458 3453 1515 \r\n3 955 3464 3463 1516 \r\n3 379 3251 3464 1516 \r\n3 380 3463 3251 1516 \r\n3 955 3463 3466 1517 \r\n3 380 3465 3463 1517 \r\n3 416 3466 3465 1517 \r\n3 955 3466 3468 1518 \r\n3 416 3467 3466 1518 \r\n3 415 3468 3467 1518 \r\n3 955 3468 3464 1519 \r\n3 415 3459 3468 1519 \r\n3 379 3464 3459 1519 \r\n3 956 3470 3469 1520 \r\n3 380 3257 3470 1520 \r\n3 381 3469 3257 1520 \r\n3 956 3469 3472 1521 \r\n3 381 3471 3469 1521 \r\n3 417 3472 3471 1521 \r\n3 956 3472 3474 1522 \r\n3 417 3473 3472 1522 \r\n3 416 3474 3473 1522 \r\n3 956 3474 3470 1523 \r\n3 416 3465 3474 1523 \r\n3 380 3470 3465 1523 \r\n3 957 3476 3475 1524 \r\n3 381 3263 3476 1524 \r\n3 382 3475 3263 1524 \r\n3 957 3475 3478 1525 \r\n3 382 3477 3475 1525 \r\n3 418 3478 3477 1525 \r\n3 957 3478 3480 1526 \r\n3 418 3479 3478 1526 \r\n3 417 3480 3479 1526 \r\n3 957 3480 3476 1527 \r\n3 417 3471 3480 1527 \r\n3 381 3476 3471 1527 \r\n3 958 3482 3481 1528 \r\n3 382 3269 3482 1528 \r\n3 383 3481 3269 1528 \r\n3 958 3481 3484 1529 \r\n3 383 3483 3481 1529 \r\n3 419 3484 3483 1529 \r\n3 958 3484 3486 1530 \r\n3 419 3485 3484 1530 \r\n3 418 3486 3485 1530 \r\n3 958 3486 3482 1531 \r\n3 418 3477 3486 1531 \r\n3 382 3482 3477 1531 \r\n3 959 3488 3487 1532 \r\n3 383 3275 3488 1532 \r\n3 384 3487 3275 1532 \r\n3 959 3487 3490 1533 \r\n3 384 3489 3487 1533 \r\n3 420 3490 3489 1533 \r\n3 959 3490 3492 1534 \r\n3 420 3491 3490 1534 \r\n3 419 3492 3491 1534 \r\n3 959 3492 3488 1535 \r\n3 419 3483 3492 1535 \r\n3 383 3488 3483 1535 \r\n3 960 3494 3493 1536 \r\n3 384 3281 3494 1536 \r\n3 385 3493 3281 1536 \r\n3 960 3493 3496 1537 \r\n3 385 3495 3493 1537 \r\n3 421 3496 3495 1537 \r\n3 960 3496 3498 1538 \r\n3 421 3497 3496 1538 \r\n3 420 3498 3497 1538 \r\n3 960 3498 3494 1539 \r\n3 420 3489 3498 1539 \r\n3 384 3494 3489 1539 \r\n3 961 3500 3499 1540 \r\n3 385 3287 3500 1540 \r\n3 386 3499 3287 1540 \r\n3 961 3499 3502 1541 \r\n3 386 3501 3499 1541 \r\n3 422 3502 3501 1541 \r\n3 961 3502 3504 1542 \r\n3 422 3503 3502 1542 \r\n3 421 3504 3503 1542 \r\n3 961 3504 3500 1543 \r\n3 421 3495 3504 1543 \r\n3 385 3500 3495 1543 \r\n3 962 3506 3505 1544 \r\n3 386 3293 3506 1544 \r\n3 387 3505 3293 1544 \r\n3 962 3505 3508 1545 \r\n3 387 3507 3505 1545 \r\n3 423 3508 3507 1545 \r\n3 962 3508 3510 1546 \r\n3 423 3509 3508 1546 \r\n3 422 3510 3509 1546 \r\n3 962 3510 3506 1547 \r\n3 422 3501 3510 1547 \r\n3 386 3506 3501 1547 \r\n3 963 3512 3511 1548 \r\n3 387 3299 3512 1548 \r\n3 388 3511 3299 1548 \r\n3 963 3511 3514 1549 \r\n3 388 3513 3511 1549 \r\n3 424 3514 3513 1549 \r\n3 963 3514 3516 1550 \r\n3 424 3515 3514 1550 \r\n3 423 3516 3515 1550 \r\n3 963 3516 3512 1551 \r\n3 423 3507 3516 1551 \r\n3 387 3512 3507 1551 \r\n3 964 3518 3517 1552 \r\n3 388 3305 3518 1552 \r\n3 389 3517 3305 1552 \r\n3 964 3517 3520 1553 \r\n3 389 3519 3517 1553 \r\n3 425 3520 3519 1553 \r\n3 964 3520 3522 1554 \r\n3 425 3521 3520 1554 \r\n3 424 3522 3521 1554 \r\n3 964 3522 3518 1555 \r\n3 424 3513 3522 1555 \r\n3 388 3518 3513 1555 \r\n3 965 3524 3523 1556 \r\n3 389 3311 3524 1556 \r\n3 390 3523 3311 1556 \r\n3 965 3523 3526 1557 \r\n3 390 3525 3523 1557 \r\n3 426 3526 3525 1557 \r\n3 965 3526 3528 1558 \r\n3 426 3527 3526 1558 \r\n3 425 3528 3527 1558 \r\n3 965 3528 3524 1559 \r\n3 425 3519 3528 1559 \r\n3 389 3524 3519 1559 \r\n3 966 3530 3529 1560 \r\n3 390 3317 3530 1560 \r\n3 391 3529 3317 1560 \r\n3 966 3529 3532 1561 \r\n3 391 3531 3529 1561 \r\n3 427 3532 3531 1561 \r\n3 966 3532 3534 1562 \r\n3 427 3533 3532 1562 \r\n3 426 3534 3533 1562 \r\n3 966 3534 3530 1563 \r\n3 426 3525 3534 1563 \r\n3 390 3530 3525 1563 \r\n3 967 3536 3535 1564 \r\n3 391 3323 3536 1564 \r\n3 392 3535 3323 1564 \r\n3 967 3535 3538 1565 \r\n3 392 3537 3535 1565 \r\n3 428 3538 3537 1565 \r\n3 967 3538 3540 1566 \r\n3 428 3539 3538 1566 \r\n3 427 3540 3539 1566 \r\n3 967 3540 3536 1567 \r\n3 427 3531 3540 1567 \r\n3 391 3536 3531 1567 \r\n3 968 3542 3541 1568 \r\n3 392 3329 3542 1568 \r\n3 393 3541 3329 1568 \r\n3 968 3541 3544 1569 \r\n3 393 3543 3541 1569 \r\n3 429 3544 3543 1569 \r\n3 968 3544 3546 1570 \r\n3 429 3545 3544 1570 \r\n3 428 3546 3545 1570 \r\n3 968 3546 3542 1571 \r\n3 428 3537 3546 1571 \r\n3 392 3542 3537 1571 \r\n3 969 3548 3547 1572 \r\n3 393 3335 3548 1572 \r\n3 394 3547 3335 1572 \r\n3 969 3547 3550 1573 \r\n3 394 3549 3547 1573 \r\n3 430 3550 3549 1573 \r\n3 969 3550 3552 1574 \r\n3 430 3551 3550 1574 \r\n3 429 3552 3551 1574 \r\n3 969 3552 3548 1575 \r\n3 429 3543 3552 1575 \r\n3 393 3548 3543 1575 \r\n3 970 3554 3553 1576 \r\n3 394 3341 3554 1576 \r\n3 395 3553 3341 1576 \r\n3 970 3553 3556 1577 \r\n3 395 3555 3553 1577 \r\n3 431 3556 3555 1577 \r\n3 970 3556 3558 1578 \r\n3 431 3557 3556 1578 \r\n3 430 3558 3557 1578 \r\n3 970 3558 3554 1579 \r\n3 430 3549 3558 1579 \r\n3 394 3554 3549 1579 \r\n3 971 3560 3559 1580 \r\n3 395 3346 3560 1580 \r\n3 360 3559 3346 1580 \r\n3 971 3559 3561 1581 \r\n3 360 3354 3559 1581 \r\n3 396 3561 3354 1581 \r\n3 971 3561 3563 1582 \r\n3 396 3562 3561 1582 \r\n3 431 3563 3562 1582 \r\n3 971 3563 3560 1583 \r\n3 431 3555 3563 1583 \r\n3 395 3560 3555 1583 \r\n3 972 3565 3564 1584 \r\n3 396 3352 3565 1584 \r\n3 397 3564 3352 1584 \r\n3 972 3564 3567 1585 \r\n3 397 3566 3564 1585 \r\n3 433 3567 3566 1585 \r\n3 972 3567 3569 1586 \r\n3 433 3568 3567 1586 \r\n3 432 3569 3568 1586 \r\n3 972 3569 3565 1587 \r\n3 432 3570 3569 1587 \r\n3 396 3565 3570 1587 \r\n3 973 3572 3571 1588 \r\n3 397 3359 3572 1588 \r\n3 398 3571 3359 1588 \r\n3 973 3571 3574 1589 \r\n3 398 3573 3571 1589 \r\n3 434 3574 3573 1589 \r\n3 973 3574 3576 1590 \r\n3 434 3575 3574 1590 \r\n3 433 3576 3575 1590 \r\n3 973 3576 3572 1591 \r\n3 433 3566 3576 1591 \r\n3 397 3572 3566 1591 \r\n3 974 3578 3577 1592 \r\n3 398 3365 3578 1592 \r\n3 399 3577 3365 1592 \r\n3 974 3577 3580 1593 \r\n3 399 3579 3577 1593 \r\n3 435 3580 3579 1593 \r\n3 974 3580 3582 1594 \r\n3 435 3581 3580 1594 \r\n3 434 3582 3581 1594 \r\n3 974 3582 3578 1595 \r\n3 434 3573 3582 1595 \r\n3 398 3578 3573 1595 \r\n3 975 3584 3583 1596 \r\n3 399 3371 3584 1596 \r\n3 400 3583 3371 1596 \r\n3 975 3583 3586 1597 \r\n3 400 3585 3583 1597 \r\n3 436 3586 3585 1597 \r\n3 975 3586 3588 1598 \r\n3 436 3587 3586 1598 \r\n3 435 3588 3587 1598 \r\n3 975 3588 3584 1599 \r\n3 435 3579 3588 1599 \r\n3 399 3584 3579 1599 \r\n3 976 3590 3589 1600 \r\n3 400 3377 3590 1600 \r\n3 401 3589 3377 1600 \r\n3 976 3589 3592 1601 \r\n3 401 3591 3589 1601 \r\n3 437 3592 3591 1601 \r\n3 976 3592 3594 1602 \r\n3 437 3593 3592 1602 \r\n3 436 3594 3593 1602 \r\n3 976 3594 3590 1603 \r\n3 436 3585 3594 1603 \r\n3 400 3590 3585 1603 \r\n3 977 3596 3595 1604 \r\n3 401 3383 3596 1604 \r\n3 402 3595 3383 1604 \r\n3 977 3595 3598 1605 \r\n3 402 3597 3595 1605 \r\n3 438 3598 3597 1605 \r\n3 977 3598 3600 1606 \r\n3 438 3599 3598 1606 \r\n3 437 3600 3599 1606 \r\n3 977 3600 3596 1607 \r\n3 437 3591 3600 1607 \r\n3 401 3596 3591 1607 \r\n3 978 3602 3601 1608 \r\n3 402 3389 3602 1608 \r\n3 403 3601 3389 1608 \r\n3 978 3601 3604 1609 \r\n3 403 3603 3601 1609 \r\n3 439 3604 3603 1609 \r\n3 978 3604 3606 1610 \r\n3 439 3605 3604 1610 \r\n3 438 3606 3605 1610 \r\n3 978 3606 3602 1611 \r\n3 438 3597 3606 1611 \r\n3 402 3602 3597 1611 \r\n3 979 3608 3607 1612 \r\n3 403 3395 3608 1612 \r\n3 404 3607 3395 1612 \r\n3 979 3607 3610 1613 \r\n3 404 3609 3607 1613 \r\n3 440 3610 3609 1613 \r\n3 979 3610 3612 1614 \r\n3 440 3611 3610 1614 \r\n3 439 3612 3611 1614 \r\n3 979 3612 3608 1615 \r\n3 439 3603 3612 1615 \r\n3 403 3608 3603 1615 \r\n3 980 3614 3613 1616 \r\n3 404 3401 3614 1616 \r\n3 405 3613 3401 1616 \r\n3 980 3613 3616 1617 \r\n3 405 3615 3613 1617 \r\n3 441 3616 3615 1617 \r\n3 980 3616 3618 1618 \r\n3 441 3617 3616 1618 \r\n3 440 3618 3617 1618 \r\n3 980 3618 3614 1619 \r\n3 440 3609 3618 1619 \r\n3 404 3614 3609 1619 \r\n3 981 3620 3619 1620 \r\n3 405 3407 3620 1620 \r\n3 406 3619 3407 1620 \r\n3 981 3619 3622 1621 \r\n3 406 3621 3619 1621 \r\n3 442 3622 3621 1621 \r\n3 981 3622 3624 1622 \r\n3 442 3623 3622 1622 \r\n3 441 3624 3623 1622 \r\n3 981 3624 3620 1623 \r\n3 441 3615 3624 1623 \r\n3 405 3620 3615 1623 \r\n3 982 3626 3625 1624 \r\n3 406 3413 3626 1624 \r\n3 407 3625 3413 1624 \r\n3 982 3625 3628 1625 \r\n3 407 3627 3625 1625 \r\n3 443 3628 3627 1625 \r\n3 982 3628 3630 1626 \r\n3 443 3629 3628 1626 \r\n3 442 3630 3629 1626 \r\n3 982 3630 3626 1627 \r\n3 442 3621 3630 1627 \r\n3 406 3626 3621 1627 \r\n3 983 3632 3631 1628 \r\n3 407 3419 3632 1628 \r\n3 408 3631 3419 1628 \r\n3 983 3631 3634 1629 \r\n3 408 3633 3631 1629 \r\n3 444 3634 3633 1629 \r\n3 983 3634 3636 1630 \r\n3 444 3635 3634 1630 \r\n3 443 3636 3635 1630 \r\n3 983 3636 3632 1631 \r\n3 443 3627 3636 1631 \r\n3 407 3632 3627 1631 \r\n3 984 3638 3637 1632 \r\n3 408 3425 3638 1632 \r\n3 409 3637 3425 1632 \r\n3 984 3637 3640 1633 \r\n3 409 3639 3637 1633 \r\n3 445 3640 3639 1633 \r\n3 984 3640 3642 1634 \r\n3 445 3641 3640 1634 \r\n3 444 3642 3641 1634 \r\n3 984 3642 3638 1635 \r\n3 444 3633 3642 1635 \r\n3 408 3638 3633 1635 \r\n3 985 3644 3643 1636 \r\n3 409 3431 3644 1636 \r\n3 410 3643 3431 1636 \r\n3 985 3643 3646 1637 \r\n3 410 3645 3643 1637 \r\n3 446 3646 3645 1637 \r\n3 985 3646 3648 1638 \r\n3 446 3647 3646 1638 \r\n3 445 3648 3647 1638 \r\n3 985 3648 3644 1639 \r\n3 445 3639 3648 1639 \r\n3 409 3644 3639 1639 \r\n3 986 3650 3649 1640 \r\n3 410 3437 3650 1640 \r\n3 411 3649 3437 1640 \r\n3 986 3649 3652 1641 \r\n3 411 3651 3649 1641 \r\n3 447 3652 3651 1641 \r\n3 986 3652 3654 1642 \r\n3 447 3653 3652 1642 \r\n3 446 3654 3653 1642 \r\n3 986 3654 3650 1643 \r\n3 446 3645 3654 1643 \r\n3 410 3650 3645 1643 \r\n3 987 3656 3655 1644 \r\n3 411 3443 3656 1644 \r\n3 412 3655 3443 1644 \r\n3 987 3655 3658 1645 \r\n3 412 3657 3655 1645 \r\n3 448 3658 3657 1645 \r\n3 987 3658 3660 1646 \r\n3 448 3659 3658 1646 \r\n3 447 3660 3659 1646 \r\n3 987 3660 3656 1647 \r\n3 447 3651 3660 1647 \r\n3 411 3656 3651 1647 \r\n3 988 3662 3661 1648 \r\n3 412 3449 3662 1648 \r\n3 413 3661 3449 1648 \r\n3 988 3661 3664 1649 \r\n3 413 3663 3661 1649 \r\n3 449 3664 3663 1649 \r\n3 988 3664 3666 1650 \r\n3 449 3665 3664 1650 \r\n3 448 3666 3665 1650 \r\n3 988 3666 3662 1651 \r\n3 448 3657 3666 1651 \r\n3 412 3662 3657 1651 \r\n3 989 3668 3667 1652 \r\n3 413 3455 3668 1652 \r\n3 414 3667 3455 1652 \r\n3 989 3667 3670 1653 \r\n3 414 3669 3667 1653 \r\n3 450 3670 3669 1653 \r\n3 989 3670 3672 1654 \r\n3 450 3671 3670 1654 \r\n3 449 3672 3671 1654 \r\n3 989 3672 3668 1655 \r\n3 449 3663 3672 1655 \r\n3 413 3668 3663 1655 \r\n3 990 3674 3673 1656 \r\n3 414 3461 3674 1656 \r\n3 415 3673 3461 1656 \r\n3 990 3673 3676 1657 \r\n3 415 3675 3673 1657 \r\n3 451 3676 3675 1657 \r\n3 990 3676 3678 1658 \r\n3 451 3677 3676 1658 \r\n3 450 3678 3677 1658 \r\n3 990 3678 3674 1659 \r\n3 450 3669 3678 1659 \r\n3 414 3674 3669 1659 \r\n3 991 3680 3679 1660 \r\n3 415 3467 3680 1660 \r\n3 416 3679 3467 1660 \r\n3 991 3679 3682 1661 \r\n3 416 3681 3679 1661 \r\n3 452 3682 3681 1661 \r\n3 991 3682 3684 1662 \r\n3 452 3683 3682 1662 \r\n3 451 3684 3683 1662 \r\n3 991 3684 3680 1663 \r\n3 451 3675 3684 1663 \r\n3 415 3680 3675 1663 \r\n3 992 3686 3685 1664 \r\n3 416 3473 3686 1664 \r\n3 417 3685 3473 1664 \r\n3 992 3685 3688 1665 \r\n3 417 3687 3685 1665 \r\n3 453 3688 3687 1665 \r\n3 992 3688 3690 1666 \r\n3 453 3689 3688 1666 \r\n3 452 3690 3689 1666 \r\n3 992 3690 3686 1667 \r\n3 452 3681 3690 1667 \r\n3 416 3686 3681 1667 \r\n3 993 3692 3691 1668 \r\n3 417 3479 3692 1668 \r\n3 418 3691 3479 1668 \r\n3 993 3691 3694 1669 \r\n3 418 3693 3691 1669 \r\n3 454 3694 3693 1669 \r\n3 993 3694 3696 1670 \r\n3 454 3695 3694 1670 \r\n3 453 3696 3695 1670 \r\n3 993 3696 3692 1671 \r\n3 453 3687 3696 1671 \r\n3 417 3692 3687 1671 \r\n3 994 3698 3697 1672 \r\n3 418 3485 3698 1672 \r\n3 419 3697 3485 1672 \r\n3 994 3697 3700 1673 \r\n3 419 3699 3697 1673 \r\n3 455 3700 3699 1673 \r\n3 994 3700 3702 1674 \r\n3 455 3701 3700 1674 \r\n3 454 3702 3701 1674 \r\n3 994 3702 3698 1675 \r\n3 454 3693 3702 1675 \r\n3 418 3698 3693 1675 \r\n3 995 3704 3703 1676 \r\n3 419 3491 3704 1676 \r\n3 420 3703 3491 1676 \r\n3 995 3703 3706 1677 \r\n3 420 3705 3703 1677 \r\n3 456 3706 3705 1677 \r\n3 995 3706 3708 1678 \r\n3 456 3707 3706 1678 \r\n3 455 3708 3707 1678 \r\n3 995 3708 3704 1679 \r\n3 455 3699 3708 1679 \r\n3 419 3704 3699 1679 \r\n3 996 3710 3709 1680 \r\n3 420 3497 3710 1680 \r\n3 421 3709 3497 1680 \r\n3 996 3709 3712 1681 \r\n3 421 3711 3709 1681 \r\n3 457 3712 3711 1681 \r\n3 996 3712 3714 1682 \r\n3 457 3713 3712 1682 \r\n3 456 3714 3713 1682 \r\n3 996 3714 3710 1683 \r\n3 456 3705 3714 1683 \r\n3 420 3710 3705 1683 \r\n3 997 3716 3715 1684 \r\n3 421 3503 3716 1684 \r\n3 422 3715 3503 1684 \r\n3 997 3715 3718 1685 \r\n3 422 3717 3715 1685 \r\n3 458 3718 3717 1685 \r\n3 997 3718 3720 1686 \r\n3 458 3719 3718 1686 \r\n3 457 3720 3719 1686 \r\n3 997 3720 3716 1687 \r\n3 457 3711 3720 1687 \r\n3 421 3716 3711 1687 \r\n3 998 3722 3721 1688 \r\n3 422 3509 3722 1688 \r\n3 423 3721 3509 1688 \r\n3 998 3721 3724 1689 \r\n3 423 3723 3721 1689 \r\n3 459 3724 3723 1689 \r\n3 998 3724 3726 1690 \r\n3 459 3725 3724 1690 \r\n3 458 3726 3725 1690 \r\n3 998 3726 3722 1691 \r\n3 458 3717 3726 1691 \r\n3 422 3722 3717 1691 \r\n3 999 3728 3727 1692 \r\n3 423 3515 3728 1692 \r\n3 424 3727 3515 1692 \r\n3 999 3727 3730 1693 \r\n3 424 3729 3727 1693 \r\n3 460 3730 3729 1693 \r\n3 999 3730 3732 1694 \r\n3 460 3731 3730 1694 \r\n3 459 3732 3731 1694 \r\n3 999 3732 3728 1695 \r\n3 459 3723 3732 1695 \r\n3 423 3728 3723 1695 \r\n3 1000 3734 3733 1696 \r\n3 424 3521 3734 1696 \r\n3 425 3733 3521 1696 \r\n3 1000 3733 3736 1697 \r\n3 425 3735 3733 1697 \r\n3 461 3736 3735 1697 \r\n3 1000 3736 3738 1698 \r\n3 461 3737 3736 1698 \r\n3 460 3738 3737 1698 \r\n3 1000 3738 3734 1699 \r\n3 460 3729 3738 1699 \r\n3 424 3734 3729 1699 \r\n3 1001 3740 3739 1700 \r\n3 425 3527 3740 1700 \r\n3 426 3739 3527 1700 \r\n3 1001 3739 3742 1701 \r\n3 426 3741 3739 1701 \r\n3 462 3742 3741 1701 \r\n3 1001 3742 3744 1702 \r\n3 462 3743 3742 1702 \r\n3 461 3744 3743 1702 \r\n3 1001 3744 3740 1703 \r\n3 461 3735 3744 1703 \r\n3 425 3740 3735 1703 \r\n3 1002 3746 3745 1704 \r\n3 426 3533 3746 1704 \r\n3 427 3745 3533 1704 \r\n3 1002 3745 3748 1705 \r\n3 427 3747 3745 1705 \r\n3 463 3748 3747 1705 \r\n3 1002 3748 3750 1706 \r\n3 463 3749 3748 1706 \r\n3 462 3750 3749 1706 \r\n3 1002 3750 3746 1707 \r\n3 462 3741 3750 1707 \r\n3 426 3746 3741 1707 \r\n3 1003 3752 3751 1708 \r\n3 427 3539 3752 1708 \r\n3 428 3751 3539 1708 \r\n3 1003 3751 3754 1709 \r\n3 428 3753 3751 1709 \r\n3 464 3754 3753 1709 \r\n3 1003 3754 3756 1710 \r\n3 464 3755 3754 1710 \r\n3 463 3756 3755 1710 \r\n3 1003 3756 3752 1711 \r\n3 463 3747 3756 1711 \r\n3 427 3752 3747 1711 \r\n3 1004 3758 3757 1712 \r\n3 428 3545 3758 1712 \r\n3 429 3757 3545 1712 \r\n3 1004 3757 3760 1713 \r\n3 429 3759 3757 1713 \r\n3 465 3760 3759 1713 \r\n3 1004 3760 3762 1714 \r\n3 465 3761 3760 1714 \r\n3 464 3762 3761 1714 \r\n3 1004 3762 3758 1715 \r\n3 464 3753 3762 1715 \r\n3 428 3758 3753 1715 \r\n3 1005 3764 3763 1716 \r\n3 429 3551 3764 1716 \r\n3 430 3763 3551 1716 \r\n3 1005 3763 3766 1717 \r\n3 430 3765 3763 1717 \r\n3 466 3766 3765 1717 \r\n3 1005 3766 3768 1718 \r\n3 466 3767 3766 1718 \r\n3 465 3768 3767 1718 \r\n3 1005 3768 3764 1719 \r\n3 465 3759 3768 1719 \r\n3 429 3764 3759 1719 \r\n3 1006 3770 3769 1720 \r\n3 430 3557 3770 1720 \r\n3 431 3769 3557 1720 \r\n3 1006 3769 3772 1721 \r\n3 431 3771 3769 1721 \r\n3 467 3772 3771 1721 \r\n3 1006 3772 3774 1722 \r\n3 467 3773 3772 1722 \r\n3 466 3774 3773 1722 \r\n3 1006 3774 3770 1723 \r\n3 466 3765 3774 1723 \r\n3 430 3770 3765 1723 \r\n3 1007 3776 3775 1724 \r\n3 431 3562 3776 1724 \r\n3 396 3775 3562 1724 \r\n3 1007 3775 3777 1725 \r\n3 396 3570 3775 1725 \r\n3 432 3777 3570 1725 \r\n3 1007 3777 3779 1726 \r\n3 432 3778 3777 1726 \r\n3 467 3779 3778 1726 \r\n3 1007 3779 3776 1727 \r\n3 467 3771 3779 1727 \r\n3 431 3776 3771 1727 \r\n3 1008 3781 3780 1728 \r\n3 432 3568 3781 1728 \r\n3 433 3780 3568 1728 \r\n3 1008 3780 3783 1729 \r\n3 433 3782 3780 1729 \r\n3 469 3783 3782 1729 \r\n3 1008 3783 3785 1730 \r\n3 469 3784 3783 1730 \r\n3 468 3785 3784 1730 \r\n3 1008 3785 3781 1731 \r\n3 468 3786 3785 1731 \r\n3 432 3781 3786 1731 \r\n3 1009 3788 3787 1732 \r\n3 433 3575 3788 1732 \r\n3 434 3787 3575 1732 \r\n3 1009 3787 3790 1733 \r\n3 434 3789 3787 1733 \r\n3 470 3790 3789 1733 \r\n3 1009 3790 3792 1734 \r\n3 470 3791 3790 1734 \r\n3 469 3792 3791 1734 \r\n3 1009 3792 3788 1735 \r\n3 469 3782 3792 1735 \r\n3 433 3788 3782 1735 \r\n3 1010 3794 3793 1736 \r\n3 434 3581 3794 1736 \r\n3 435 3793 3581 1736 \r\n3 1010 3793 3796 1737 \r\n3 435 3795 3793 1737 \r\n3 471 3796 3795 1737 \r\n3 1010 3796 3798 1738 \r\n3 471 3797 3796 1738 \r\n3 470 3798 3797 1738 \r\n3 1010 3798 3794 1739 \r\n3 470 3789 3798 1739 \r\n3 434 3794 3789 1739 \r\n3 1011 3800 3799 1740 \r\n3 435 3587 3800 1740 \r\n3 436 3799 3587 1740 \r\n3 1011 3799 3802 1741 \r\n3 436 3801 3799 1741 \r\n3 472 3802 3801 1741 \r\n3 1011 3802 3804 1742 \r\n3 472 3803 3802 1742 \r\n3 471 3804 3803 1742 \r\n3 1011 3804 3800 1743 \r\n3 471 3795 3804 1743 \r\n3 435 3800 3795 1743 \r\n3 1012 3806 3805 1744 \r\n3 436 3593 3806 1744 \r\n3 437 3805 3593 1744 \r\n3 1012 3805 3808 1745 \r\n3 437 3807 3805 1745 \r\n3 473 3808 3807 1745 \r\n3 1012 3808 3810 1746 \r\n3 473 3809 3808 1746 \r\n3 472 3810 3809 1746 \r\n3 1012 3810 3806 1747 \r\n3 472 3801 3810 1747 \r\n3 436 3806 3801 1747 \r\n3 1013 3812 3811 1748 \r\n3 437 3599 3812 1748 \r\n3 438 3811 3599 1748 \r\n3 1013 3811 3814 1749 \r\n3 438 3813 3811 1749 \r\n3 474 3814 3813 1749 \r\n3 1013 3814 3816 1750 \r\n3 474 3815 3814 1750 \r\n3 473 3816 3815 1750 \r\n3 1013 3816 3812 1751 \r\n3 473 3807 3816 1751 \r\n3 437 3812 3807 1751 \r\n3 1014 3818 3817 1752 \r\n3 438 3605 3818 1752 \r\n3 439 3817 3605 1752 \r\n3 1014 3817 3820 1753 \r\n3 439 3819 3817 1753 \r\n3 475 3820 3819 1753 \r\n3 1014 3820 3822 1754 \r\n3 475 3821 3820 1754 \r\n3 474 3822 3821 1754 \r\n3 1014 3822 3818 1755 \r\n3 474 3813 3822 1755 \r\n3 438 3818 3813 1755 \r\n3 1015 3824 3823 1756 \r\n3 439 3611 3824 1756 \r\n3 440 3823 3611 1756 \r\n3 1015 3823 3826 1757 \r\n3 440 3825 3823 1757 \r\n3 476 3826 3825 1757 \r\n3 1015 3826 3828 1758 \r\n3 476 3827 3826 1758 \r\n3 475 3828 3827 1758 \r\n3 1015 3828 3824 1759 \r\n3 475 3819 3828 1759 \r\n3 439 3824 3819 1759 \r\n3 1016 3830 3829 1760 \r\n3 440 3617 3830 1760 \r\n3 441 3829 3617 1760 \r\n3 1016 3829 3832 1761 \r\n3 441 3831 3829 1761 \r\n3 477 3832 3831 1761 \r\n3 1016 3832 3834 1762 \r\n3 477 3833 3832 1762 \r\n3 476 3834 3833 1762 \r\n3 1016 3834 3830 1763 \r\n3 476 3825 3834 1763 \r\n3 440 3830 3825 1763 \r\n3 1017 3836 3835 1764 \r\n3 441 3623 3836 1764 \r\n3 442 3835 3623 1764 \r\n3 1017 3835 3838 1765 \r\n3 442 3837 3835 1765 \r\n3 478 3838 3837 1765 \r\n3 1017 3838 3840 1766 \r\n3 478 3839 3838 1766 \r\n3 477 3840 3839 1766 \r\n3 1017 3840 3836 1767 \r\n3 477 3831 3840 1767 \r\n3 441 3836 3831 1767 \r\n3 1018 3842 3841 1768 \r\n3 442 3629 3842 1768 \r\n3 443 3841 3629 1768 \r\n3 1018 3841 3844 1769 \r\n3 443 3843 3841 1769 \r\n3 479 3844 3843 1769 \r\n3 1018 3844 3846 1770 \r\n3 479 3845 3844 1770 \r\n3 478 3846 3845 1770 \r\n3 1018 3846 3842 1771 \r\n3 478 3837 3846 1771 \r\n3 442 3842 3837 1771 \r\n3 1019 3848 3847 1772 \r\n3 443 3635 3848 1772 \r\n3 444 3847 3635 1772 \r\n3 1019 3847 3850 1773 \r\n3 444 3849 3847 1773 \r\n3 480 3850 3849 1773 \r\n3 1019 3850 3852 1774 \r\n3 480 3851 3850 1774 \r\n3 479 3852 3851 1774 \r\n3 1019 3852 3848 1775 \r\n3 479 3843 3852 1775 \r\n3 443 3848 3843 1775 \r\n3 1020 3854 3853 1776 \r\n3 444 3641 3854 1776 \r\n3 445 3853 3641 1776 \r\n3 1020 3853 3856 1777 \r\n3 445 3855 3853 1777 \r\n3 481 3856 3855 1777 \r\n3 1020 3856 3858 1778 \r\n3 481 3857 3856 1778 \r\n3 480 3858 3857 1778 \r\n3 1020 3858 3854 1779 \r\n3 480 3849 3858 1779 \r\n3 444 3854 3849 1779 \r\n3 1021 3860 3859 1780 \r\n3 445 3647 3860 1780 \r\n3 446 3859 3647 1780 \r\n3 1021 3859 3862 1781 \r\n3 446 3861 3859 1781 \r\n3 482 3862 3861 1781 \r\n3 1021 3862 3864 1782 \r\n3 482 3863 3862 1782 \r\n3 481 3864 3863 1782 \r\n3 1021 3864 3860 1783 \r\n3 481 3855 3864 1783 \r\n3 445 3860 3855 1783 \r\n3 1022 3866 3865 1784 \r\n3 446 3653 3866 1784 \r\n3 447 3865 3653 1784 \r\n3 1022 3865 3868 1785 \r\n3 447 3867 3865 1785 \r\n3 483 3868 3867 1785 \r\n3 1022 3868 3870 1786 \r\n3 483 3869 3868 1786 \r\n3 482 3870 3869 1786 \r\n3 1022 3870 3866 1787 \r\n3 482 3861 3870 1787 \r\n3 446 3866 3861 1787 \r\n3 1023 3872 3871 1788 \r\n3 447 3659 3872 1788 \r\n3 448 3871 3659 1788 \r\n3 1023 3871 3874 1789 \r\n3 448 3873 3871 1789 \r\n3 484 3874 3873 1789 \r\n3 1023 3874 3876 1790 \r\n3 484 3875 3874 1790 \r\n3 483 3876 3875 1790 \r\n3 1023 3876 3872 1791 \r\n3 483 3867 3876 1791 \r\n3 447 3872 3867 1791 \r\n3 1024 3878 3877 1792 \r\n3 448 3665 3878 1792 \r\n3 449 3877 3665 1792 \r\n3 1024 3877 3880 1793 \r\n3 449 3879 3877 1793 \r\n3 485 3880 3879 1793 \r\n3 1024 3880 3882 1794 \r\n3 485 3881 3880 1794 \r\n3 484 3882 3881 1794 \r\n3 1024 3882 3878 1795 \r\n3 484 3873 3882 1795 \r\n3 448 3878 3873 1795 \r\n3 1025 3884 3883 1796 \r\n3 449 3671 3884 1796 \r\n3 450 3883 3671 1796 \r\n3 1025 3883 3886 1797 \r\n3 450 3885 3883 1797 \r\n3 486 3886 3885 1797 \r\n3 1025 3886 3888 1798 \r\n3 486 3887 3886 1798 \r\n3 485 3888 3887 1798 \r\n3 1025 3888 3884 1799 \r\n3 485 3879 3888 1799 \r\n3 449 3884 3879 1799 \r\n3 1026 3890 3889 1800 \r\n3 450 3677 3890 1800 \r\n3 451 3889 3677 1800 \r\n3 1026 3889 3892 1801 \r\n3 451 3891 3889 1801 \r\n3 487 3892 3891 1801 \r\n3 1026 3892 3894 1802 \r\n3 487 3893 3892 1802 \r\n3 486 3894 3893 1802 \r\n3 1026 3894 3890 1803 \r\n3 486 3885 3894 1803 \r\n3 450 3890 3885 1803 \r\n3 1027 3896 3895 1804 \r\n3 451 3683 3896 1804 \r\n3 452 3895 3683 1804 \r\n3 1027 3895 3898 1805 \r\n3 452 3897 3895 1805 \r\n3 488 3898 3897 1805 \r\n3 1027 3898 3900 1806 \r\n3 488 3899 3898 1806 \r\n3 487 3900 3899 1806 \r\n3 1027 3900 3896 1807 \r\n3 487 3891 3900 1807 \r\n3 451 3896 3891 1807 \r\n3 1028 3902 3901 1808 \r\n3 452 3689 3902 1808 \r\n3 453 3901 3689 1808 \r\n3 1028 3901 3904 1809 \r\n3 453 3903 3901 1809 \r\n3 489 3904 3903 1809 \r\n3 1028 3904 3906 1810 \r\n3 489 3905 3904 1810 \r\n3 488 3906 3905 1810 \r\n3 1028 3906 3902 1811 \r\n3 488 3897 3906 1811 \r\n3 452 3902 3897 1811 \r\n3 1029 3908 3907 1812 \r\n3 453 3695 3908 1812 \r\n3 454 3907 3695 1812 \r\n3 1029 3907 3910 1813 \r\n3 454 3909 3907 1813 \r\n3 490 3910 3909 1813 \r\n3 1029 3910 3912 1814 \r\n3 490 3911 3910 1814 \r\n3 489 3912 3911 1814 \r\n3 1029 3912 3908 1815 \r\n3 489 3903 3912 1815 \r\n3 453 3908 3903 1815 \r\n3 1030 3914 3913 1816 \r\n3 454 3701 3914 1816 \r\n3 455 3913 3701 1816 \r\n3 1030 3913 3916 1817 \r\n3 455 3915 3913 1817 \r\n3 491 3916 3915 1817 \r\n3 1030 3916 3918 1818 \r\n3 491 3917 3916 1818 \r\n3 490 3918 3917 1818 \r\n3 1030 3918 3914 1819 \r\n3 490 3909 3918 1819 \r\n3 454 3914 3909 1819 \r\n3 1031 3920 3919 1820 \r\n3 455 3707 3920 1820 \r\n3 456 3919 3707 1820 \r\n3 1031 3919 3922 1821 \r\n3 456 3921 3919 1821 \r\n3 492 3922 3921 1821 \r\n3 1031 3922 3924 1822 \r\n3 492 3923 3922 1822 \r\n3 491 3924 3923 1822 \r\n3 1031 3924 3920 1823 \r\n3 491 3915 3924 1823 \r\n3 455 3920 3915 1823 \r\n3 1032 3926 3925 1824 \r\n3 456 3713 3926 1824 \r\n3 457 3925 3713 1824 \r\n3 1032 3925 3928 1825 \r\n3 457 3927 3925 1825 \r\n3 493 3928 3927 1825 \r\n3 1032 3928 3930 1826 \r\n3 493 3929 3928 1826 \r\n3 492 3930 3929 1826 \r\n3 1032 3930 3926 1827 \r\n3 492 3921 3930 1827 \r\n3 456 3926 3921 1827 \r\n3 1033 3932 3931 1828 \r\n3 457 3719 3932 1828 \r\n3 458 3931 3719 1828 \r\n3 1033 3931 3934 1829 \r\n3 458 3933 3931 1829 \r\n3 494 3934 3933 1829 \r\n3 1033 3934 3936 1830 \r\n3 494 3935 3934 1830 \r\n3 493 3936 3935 1830 \r\n3 1033 3936 3932 1831 \r\n3 493 3927 3936 1831 \r\n3 457 3932 3927 1831 \r\n3 1034 3938 3937 1832 \r\n3 458 3725 3938 1832 \r\n3 459 3937 3725 1832 \r\n3 1034 3937 3940 1833 \r\n3 459 3939 3937 1833 \r\n3 495 3940 3939 1833 \r\n3 1034 3940 3942 1834 \r\n3 495 3941 3940 1834 \r\n3 494 3942 3941 1834 \r\n3 1034 3942 3938 1835 \r\n3 494 3933 3942 1835 \r\n3 458 3938 3933 1835 \r\n3 1035 3944 3943 1836 \r\n3 459 3731 3944 1836 \r\n3 460 3943 3731 1836 \r\n3 1035 3943 3946 1837 \r\n3 460 3945 3943 1837 \r\n3 496 3946 3945 1837 \r\n3 1035 3946 3948 1838 \r\n3 496 3947 3946 1838 \r\n3 495 3948 3947 1838 \r\n3 1035 3948 3944 1839 \r\n3 495 3939 3948 1839 \r\n3 459 3944 3939 1839 \r\n3 1036 3950 3949 1840 \r\n3 460 3737 3950 1840 \r\n3 461 3949 3737 1840 \r\n3 1036 3949 3952 1841 \r\n3 461 3951 3949 1841 \r\n3 497 3952 3951 1841 \r\n3 1036 3952 3954 1842 \r\n3 497 3953 3952 1842 \r\n3 496 3954 3953 1842 \r\n3 1036 3954 3950 1843 \r\n3 496 3945 3954 1843 \r\n3 460 3950 3945 1843 \r\n3 1037 3956 3955 1844 \r\n3 461 3743 3956 1844 \r\n3 462 3955 3743 1844 \r\n3 1037 3955 3958 1845 \r\n3 462 3957 3955 1845 \r\n3 498 3958 3957 1845 \r\n3 1037 3958 3960 1846 \r\n3 498 3959 3958 1846 \r\n3 497 3960 3959 1846 \r\n3 1037 3960 3956 1847 \r\n3 497 3951 3960 1847 \r\n3 461 3956 3951 1847 \r\n3 1038 3962 3961 1848 \r\n3 462 3749 3962 1848 \r\n3 463 3961 3749 1848 \r\n3 1038 3961 3964 1849 \r\n3 463 3963 3961 1849 \r\n3 499 3964 3963 1849 \r\n3 1038 3964 3966 1850 \r\n3 499 3965 3964 1850 \r\n3 498 3966 3965 1850 \r\n3 1038 3966 3962 1851 \r\n3 498 3957 3966 1851 \r\n3 462 3962 3957 1851 \r\n3 1039 3968 3967 1852 \r\n3 463 3755 3968 1852 \r\n3 464 3967 3755 1852 \r\n3 1039 3967 3970 1853 \r\n3 464 3969 3967 1853 \r\n3 500 3970 3969 1853 \r\n3 1039 3970 3972 1854 \r\n3 500 3971 3970 1854 \r\n3 499 3972 3971 1854 \r\n3 1039 3972 3968 1855 \r\n3 499 3963 3972 1855 \r\n3 463 3968 3963 1855 \r\n3 1040 3974 3973 1856 \r\n3 464 3761 3974 1856 \r\n3 465 3973 3761 1856 \r\n3 1040 3973 3976 1857 \r\n3 465 3975 3973 1857 \r\n3 501 3976 3975 1857 \r\n3 1040 3976 3978 1858 \r\n3 501 3977 3976 1858 \r\n3 500 3978 3977 1858 \r\n3 1040 3978 3974 1859 \r\n3 500 3969 3978 1859 \r\n3 464 3974 3969 1859 \r\n3 1041 3980 3979 1860 \r\n3 465 3767 3980 1860 \r\n3 466 3979 3767 1860 \r\n3 1041 3979 3982 1861 \r\n3 466 3981 3979 1861 \r\n3 502 3982 3981 1861 \r\n3 1041 3982 3984 1862 \r\n3 502 3983 3982 1862 \r\n3 501 3984 3983 1862 \r\n3 1041 3984 3980 1863 \r\n3 501 3975 3984 1863 \r\n3 465 3980 3975 1863 \r\n3 1042 3986 3985 1864 \r\n3 466 3773 3986 1864 \r\n3 467 3985 3773 1864 \r\n3 1042 3985 3988 1865 \r\n3 467 3987 3985 1865 \r\n3 503 3988 3987 1865 \r\n3 1042 3988 3990 1866 \r\n3 503 3989 3988 1866 \r\n3 502 3990 3989 1866 \r\n3 1042 3990 3986 1867 \r\n3 502 3981 3990 1867 \r\n3 466 3986 3981 1867 \r\n3 1043 3992 3991 1868 \r\n3 467 3778 3992 1868 \r\n3 432 3991 3778 1868 \r\n3 1043 3991 3993 1869 \r\n3 432 3786 3991 1869 \r\n3 468 3993 3786 1869 \r\n3 1043 3993 3995 1870 \r\n3 468 3994 3993 1870 \r\n3 503 3995 3994 1870 \r\n3 1043 3995 3992 1871 \r\n3 503 3987 3995 1871 \r\n3 467 3992 3987 1871 \r\n3 1044 3997 3996 1872 \r\n3 468 3784 3997 1872 \r\n3 469 3996 3784 1872 \r\n3 1044 3996 3999 1873 \r\n3 469 3998 3996 1873 \r\n3 505 3999 3998 1873 \r\n3 1044 3999 4001 1874 \r\n3 505 4000 3999 1874 \r\n3 504 4001 4000 1874 \r\n3 1044 4001 3997 1875 \r\n3 504 4002 4001 1875 \r\n3 468 3997 4002 1875 \r\n3 1045 4004 4003 1876 \r\n3 469 3791 4004 1876 \r\n3 470 4003 3791 1876 \r\n3 1045 4003 4006 1877 \r\n3 470 4005 4003 1877 \r\n3 506 4006 4005 1877 \r\n3 1045 4006 4008 1878 \r\n3 506 4007 4006 1878 \r\n3 505 4008 4007 1878 \r\n3 1045 4008 4004 1879 \r\n3 505 3998 4008 1879 \r\n3 469 4004 3998 1879 \r\n3 1046 4010 4009 1880 \r\n3 470 3797 4010 1880 \r\n3 471 4009 3797 1880 \r\n3 1046 4009 4012 1881 \r\n3 471 4011 4009 1881 \r\n3 507 4012 4011 1881 \r\n3 1046 4012 4014 1882 \r\n3 507 4013 4012 1882 \r\n3 506 4014 4013 1882 \r\n3 1046 4014 4010 1883 \r\n3 506 4005 4014 1883 \r\n3 470 4010 4005 1883 \r\n3 1047 4016 4015 1884 \r\n3 471 3803 4016 1884 \r\n3 472 4015 3803 1884 \r\n3 1047 4015 4018 1885 \r\n3 472 4017 4015 1885 \r\n3 508 4018 4017 1885 \r\n3 1047 4018 4020 1886 \r\n3 508 4019 4018 1886 \r\n3 507 4020 4019 1886 \r\n3 1047 4020 4016 1887 \r\n3 507 4011 4020 1887 \r\n3 471 4016 4011 1887 \r\n3 1048 4022 4021 1888 \r\n3 472 3809 4022 1888 \r\n3 473 4021 3809 1888 \r\n3 1048 4021 4024 1889 \r\n3 473 4023 4021 1889 \r\n3 509 4024 4023 1889 \r\n3 1048 4024 4026 1890 \r\n3 509 4025 4024 1890 \r\n3 508 4026 4025 1890 \r\n3 1048 4026 4022 1891 \r\n3 508 4017 4026 1891 \r\n3 472 4022 4017 1891 \r\n3 1049 4028 4027 1892 \r\n3 473 3815 4028 1892 \r\n3 474 4027 3815 1892 \r\n3 1049 4027 4030 1893 \r\n3 474 4029 4027 1893 \r\n3 510 4030 4029 1893 \r\n3 1049 4030 4032 1894 \r\n3 510 4031 4030 1894 \r\n3 509 4032 4031 1894 \r\n3 1049 4032 4028 1895 \r\n3 509 4023 4032 1895 \r\n3 473 4028 4023 1895 \r\n3 1050 4034 4033 1896 \r\n3 474 3821 4034 1896 \r\n3 475 4033 3821 1896 \r\n3 1050 4033 4036 1897 \r\n3 475 4035 4033 1897 \r\n3 511 4036 4035 1897 \r\n3 1050 4036 4038 1898 \r\n3 511 4037 4036 1898 \r\n3 510 4038 4037 1898 \r\n3 1050 4038 4034 1899 \r\n3 510 4029 4038 1899 \r\n3 474 4034 4029 1899 \r\n3 1051 4040 4039 1900 \r\n3 475 3827 4040 1900 \r\n3 476 4039 3827 1900 \r\n3 1051 4039 4042 1901 \r\n3 476 4041 4039 1901 \r\n3 512 4042 4041 1901 \r\n3 1051 4042 4044 1902 \r\n3 512 4043 4042 1902 \r\n3 511 4044 4043 1902 \r\n3 1051 4044 4040 1903 \r\n3 511 4035 4044 1903 \r\n3 475 4040 4035 1903 \r\n3 1052 4046 4045 1904 \r\n3 476 3833 4046 1904 \r\n3 477 4045 3833 1904 \r\n3 1052 4045 4048 1905 \r\n3 477 4047 4045 1905 \r\n3 513 4048 4047 1905 \r\n3 1052 4048 4050 1906 \r\n3 513 4049 4048 1906 \r\n3 512 4050 4049 1906 \r\n3 1052 4050 4046 1907 \r\n3 512 4041 4050 1907 \r\n3 476 4046 4041 1907 \r\n3 1053 4052 4051 1908 \r\n3 477 3839 4052 1908 \r\n3 478 4051 3839 1908 \r\n3 1053 4051 4054 1909 \r\n3 478 4053 4051 1909 \r\n3 514 4054 4053 1909 \r\n3 1053 4054 4056 1910 \r\n3 514 4055 4054 1910 \r\n3 513 4056 4055 1910 \r\n3 1053 4056 4052 1911 \r\n3 513 4047 4056 1911 \r\n3 477 4052 4047 1911 \r\n3 1054 4058 4057 1912 \r\n3 478 3845 4058 1912 \r\n3 479 4057 3845 1912 \r\n3 1054 4057 4060 1913 \r\n3 479 4059 4057 1913 \r\n3 515 4060 4059 1913 \r\n3 1054 4060 4062 1914 \r\n3 515 4061 4060 1914 \r\n3 514 4062 4061 1914 \r\n3 1054 4062 4058 1915 \r\n3 514 4053 4062 1915 \r\n3 478 4058 4053 1915 \r\n3 1055 4064 4063 1916 \r\n3 479 3851 4064 1916 \r\n3 480 4063 3851 1916 \r\n3 1055 4063 4066 1917 \r\n3 480 4065 4063 1917 \r\n3 516 4066 4065 1917 \r\n3 1055 4066 4068 1918 \r\n3 516 4067 4066 1918 \r\n3 515 4068 4067 1918 \r\n3 1055 4068 4064 1919 \r\n3 515 4059 4068 1919 \r\n3 479 4064 4059 1919 \r\n3 1056 4070 4069 1920 \r\n3 480 3857 4070 1920 \r\n3 481 4069 3857 1920 \r\n3 1056 4069 4072 1921 \r\n3 481 4071 4069 1921 \r\n3 517 4072 4071 1921 \r\n3 1056 4072 4074 1922 \r\n3 517 4073 4072 1922 \r\n3 516 4074 4073 1922 \r\n3 1056 4074 4070 1923 \r\n3 516 4065 4074 1923 \r\n3 480 4070 4065 1923 \r\n3 1057 4076 4075 1924 \r\n3 481 3863 4076 1924 \r\n3 482 4075 3863 1924 \r\n3 1057 4075 4078 1925 \r\n3 482 4077 4075 1925 \r\n3 518 4078 4077 1925 \r\n3 1057 4078 4080 1926 \r\n3 518 4079 4078 1926 \r\n3 517 4080 4079 1926 \r\n3 1057 4080 4076 1927 \r\n3 517 4071 4080 1927 \r\n3 481 4076 4071 1927 \r\n3 1058 4082 4081 1928 \r\n3 482 3869 4082 1928 \r\n3 483 4081 3869 1928 \r\n3 1058 4081 4084 1929 \r\n3 483 4083 4081 1929 \r\n3 519 4084 4083 1929 \r\n3 1058 4084 4086 1930 \r\n3 519 4085 4084 1930 \r\n3 518 4086 4085 1930 \r\n3 1058 4086 4082 1931 \r\n3 518 4077 4086 1931 \r\n3 482 4082 4077 1931 \r\n3 1059 4088 4087 1932 \r\n3 483 3875 4088 1932 \r\n3 484 4087 3875 1932 \r\n3 1059 4087 4090 1933 \r\n3 484 4089 4087 1933 \r\n3 520 4090 4089 1933 \r\n3 1059 4090 4092 1934 \r\n3 520 4091 4090 1934 \r\n3 519 4092 4091 1934 \r\n3 1059 4092 4088 1935 \r\n3 519 4083 4092 1935 \r\n3 483 4088 4083 1935 \r\n3 1060 4094 4093 1936 \r\n3 484 3881 4094 1936 \r\n3 485 4093 3881 1936 \r\n3 1060 4093 4096 1937 \r\n3 485 4095 4093 1937 \r\n3 521 4096 4095 1937 \r\n3 1060 4096 4098 1938 \r\n3 521 4097 4096 1938 \r\n3 520 4098 4097 1938 \r\n3 1060 4098 4094 1939 \r\n3 520 4089 4098 1939 \r\n3 484 4094 4089 1939 \r\n3 1061 4100 4099 1940 \r\n3 485 3887 4100 1940 \r\n3 486 4099 3887 1940 \r\n3 1061 4099 4102 1941 \r\n3 486 4101 4099 1941 \r\n3 522 4102 4101 1941 \r\n3 1061 4102 4104 1942 \r\n3 522 4103 4102 1942 \r\n3 521 4104 4103 1942 \r\n3 1061 4104 4100 1943 \r\n3 521 4095 4104 1943 \r\n3 485 4100 4095 1943 \r\n3 1062 4106 4105 1944 \r\n3 486 3893 4106 1944 \r\n3 487 4105 3893 1944 \r\n3 1062 4105 4108 1945 \r\n3 487 4107 4105 1945 \r\n3 523 4108 4107 1945 \r\n3 1062 4108 4110 1946 \r\n3 523 4109 4108 1946 \r\n3 522 4110 4109 1946 \r\n3 1062 4110 4106 1947 \r\n3 522 4101 4110 1947 \r\n3 486 4106 4101 1947 \r\n3 1063 4112 4111 1948 \r\n3 487 3899 4112 1948 \r\n3 488 4111 3899 1948 \r\n3 1063 4111 4114 1949 \r\n3 488 4113 4111 1949 \r\n3 524 4114 4113 1949 \r\n3 1063 4114 4116 1950 \r\n3 524 4115 4114 1950 \r\n3 523 4116 4115 1950 \r\n3 1063 4116 4112 1951 \r\n3 523 4107 4116 1951 \r\n3 487 4112 4107 1951 \r\n3 1064 4118 4117 1952 \r\n3 488 3905 4118 1952 \r\n3 489 4117 3905 1952 \r\n3 1064 4117 4120 1953 \r\n3 489 4119 4117 1953 \r\n3 525 4120 4119 1953 \r\n3 1064 4120 4122 1954 \r\n3 525 4121 4120 1954 \r\n3 524 4122 4121 1954 \r\n3 1064 4122 4118 1955 \r\n3 524 4113 4122 1955 \r\n3 488 4118 4113 1955 \r\n3 1065 4124 4123 1956 \r\n3 489 3911 4124 1956 \r\n3 490 4123 3911 1956 \r\n3 1065 4123 4126 1957 \r\n3 490 4125 4123 1957 \r\n3 526 4126 4125 1957 \r\n3 1065 4126 4128 1958 \r\n3 526 4127 4126 1958 \r\n3 525 4128 4127 1958 \r\n3 1065 4128 4124 1959 \r\n3 525 4119 4128 1959 \r\n3 489 4124 4119 1959 \r\n3 1066 4130 4129 1960 \r\n3 490 3917 4130 1960 \r\n3 491 4129 3917 1960 \r\n3 1066 4129 4132 1961 \r\n3 491 4131 4129 1961 \r\n3 527 4132 4131 1961 \r\n3 1066 4132 4134 1962 \r\n3 527 4133 4132 1962 \r\n3 526 4134 4133 1962 \r\n3 1066 4134 4130 1963 \r\n3 526 4125 4134 1963 \r\n3 490 4130 4125 1963 \r\n3 1067 4136 4135 1964 \r\n3 491 3923 4136 1964 \r\n3 492 4135 3923 1964 \r\n3 1067 4135 4138 1965 \r\n3 492 4137 4135 1965 \r\n3 528 4138 4137 1965 \r\n3 1067 4138 4140 1966 \r\n3 528 4139 4138 1966 \r\n3 527 4140 4139 1966 \r\n3 1067 4140 4136 1967 \r\n3 527 4131 4140 1967 \r\n3 491 4136 4131 1967 \r\n3 1068 4142 4141 1968 \r\n3 492 3929 4142 1968 \r\n3 493 4141 3929 1968 \r\n3 1068 4141 4144 1969 \r\n3 493 4143 4141 1969 \r\n3 529 4144 4143 1969 \r\n3 1068 4144 4146 1970 \r\n3 529 4145 4144 1970 \r\n3 528 4146 4145 1970 \r\n3 1068 4146 4142 1971 \r\n3 528 4137 4146 1971 \r\n3 492 4142 4137 1971 \r\n3 1069 4148 4147 1972 \r\n3 493 3935 4148 1972 \r\n3 494 4147 3935 1972 \r\n3 1069 4147 4150 1973 \r\n3 494 4149 4147 1973 \r\n3 530 4150 4149 1973 \r\n3 1069 4150 4152 1974 \r\n3 530 4151 4150 1974 \r\n3 529 4152 4151 1974 \r\n3 1069 4152 4148 1975 \r\n3 529 4143 4152 1975 \r\n3 493 4148 4143 1975 \r\n3 1070 4154 4153 1976 \r\n3 494 3941 4154 1976 \r\n3 495 4153 3941 1976 \r\n3 1070 4153 4156 1977 \r\n3 495 4155 4153 1977 \r\n3 531 4156 4155 1977 \r\n3 1070 4156 4158 1978 \r\n3 531 4157 4156 1978 \r\n3 530 4158 4157 1978 \r\n3 1070 4158 4154 1979 \r\n3 530 4149 4158 1979 \r\n3 494 4154 4149 1979 \r\n3 1071 4160 4159 1980 \r\n3 495 3947 4160 1980 \r\n3 496 4159 3947 1980 \r\n3 1071 4159 4162 1981 \r\n3 496 4161 4159 1981 \r\n3 532 4162 4161 1981 \r\n3 1071 4162 4164 1982 \r\n3 532 4163 4162 1982 \r\n3 531 4164 4163 1982 \r\n3 1071 4164 4160 1983 \r\n3 531 4155 4164 1983 \r\n3 495 4160 4155 1983 \r\n3 1072 4166 4165 1984 \r\n3 496 3953 4166 1984 \r\n3 497 4165 3953 1984 \r\n3 1072 4165 4168 1985 \r\n3 497 4167 4165 1985 \r\n3 533 4168 4167 1985 \r\n3 1072 4168 4170 1986 \r\n3 533 4169 4168 1986 \r\n3 532 4170 4169 1986 \r\n3 1072 4170 4166 1987 \r\n3 532 4161 4170 1987 \r\n3 496 4166 4161 1987 \r\n3 1073 4172 4171 1988 \r\n3 497 3959 4172 1988 \r\n3 498 4171 3959 1988 \r\n3 1073 4171 4174 1989 \r\n3 498 4173 4171 1989 \r\n3 534 4174 4173 1989 \r\n3 1073 4174 4176 1990 \r\n3 534 4175 4174 1990 \r\n3 533 4176 4175 1990 \r\n3 1073 4176 4172 1991 \r\n3 533 4167 4176 1991 \r\n3 497 4172 4167 1991 \r\n3 1074 4178 4177 1992 \r\n3 498 3965 4178 1992 \r\n3 499 4177 3965 1992 \r\n3 1074 4177 4180 1993 \r\n3 499 4179 4177 1993 \r\n3 535 4180 4179 1993 \r\n3 1074 4180 4182 1994 \r\n3 535 4181 4180 1994 \r\n3 534 4182 4181 1994 \r\n3 1074 4182 4178 1995 \r\n3 534 4173 4182 1995 \r\n3 498 4178 4173 1995 \r\n3 1075 4184 4183 1996 \r\n3 499 3971 4184 1996 \r\n3 500 4183 3971 1996 \r\n3 1075 4183 4186 1997 \r\n3 500 4185 4183 1997 \r\n3 536 4186 4185 1997 \r\n3 1075 4186 4188 1998 \r\n3 536 4187 4186 1998 \r\n3 535 4188 4187 1998 \r\n3 1075 4188 4184 1999 \r\n3 535 4179 4188 1999 \r\n3 499 4184 4179 1999 \r\n3 1076 4190 4189 2000 \r\n3 500 3977 4190 2000 \r\n3 501 4189 3977 2000 \r\n3 1076 4189 4192 2001 \r\n3 501 4191 4189 2001 \r\n3 537 4192 4191 2001 \r\n3 1076 4192 4194 2002 \r\n3 537 4193 4192 2002 \r\n3 536 4194 4193 2002 \r\n3 1076 4194 4190 2003 \r\n3 536 4185 4194 2003 \r\n3 500 4190 4185 2003 \r\n3 1077 4196 4195 2004 \r\n3 501 3983 4196 2004 \r\n3 502 4195 3983 2004 \r\n3 1077 4195 4198 2005 \r\n3 502 4197 4195 2005 \r\n3 538 4198 4197 2005 \r\n3 1077 4198 4200 2006 \r\n3 538 4199 4198 2006 \r\n3 537 4200 4199 2006 \r\n3 1077 4200 4196 2007 \r\n3 537 4191 4200 2007 \r\n3 501 4196 4191 2007 \r\n3 1078 4202 4201 2008 \r\n3 502 3989 4202 2008 \r\n3 503 4201 3989 2008 \r\n3 1078 4201 4204 2009 \r\n3 503 4203 4201 2009 \r\n3 539 4204 4203 2009 \r\n3 1078 4204 4206 2010 \r\n3 539 4205 4204 2010 \r\n3 538 4206 4205 2010 \r\n3 1078 4206 4202 2011 \r\n3 538 4197 4206 2011 \r\n3 502 4202 4197 2011 \r\n3 1079 4208 4207 2012 \r\n3 503 3994 4208 2012 \r\n3 468 4207 3994 2012 \r\n3 1079 4207 4209 2013 \r\n3 468 4002 4207 2013 \r\n3 504 4209 4002 2013 \r\n3 1079 4209 4211 2014 \r\n3 504 4210 4209 2014 \r\n3 539 4211 4210 2014 \r\n3 1079 4211 4208 2015 \r\n3 539 4203 4211 2015 \r\n3 503 4208 4203 2015 \r\n3 1080 4213 4212 2016 \r\n3 504 4000 4213 2016 \r\n3 505 4212 4000 2016 \r\n3 1080 4212 4215 2017 \r\n3 505 4214 4212 2017 \r\n3 541 4215 4214 2017 \r\n3 1080 4215 4217 2018 \r\n3 541 4216 4215 2018 \r\n3 540 4217 4216 2018 \r\n3 1080 4217 4213 2019 \r\n3 540 4218 4217 2019 \r\n3 504 4213 4218 2019 \r\n3 1081 4220 4219 2020 \r\n3 505 4007 4220 2020 \r\n3 506 4219 4007 2020 \r\n3 1081 4219 4222 2021 \r\n3 506 4221 4219 2021 \r\n3 542 4222 4221 2021 \r\n3 1081 4222 4224 2022 \r\n3 542 4223 4222 2022 \r\n3 541 4224 4223 2022 \r\n3 1081 4224 4220 2023 \r\n3 541 4214 4224 2023 \r\n3 505 4220 4214 2023 \r\n3 1082 4226 4225 2024 \r\n3 506 4013 4226 2024 \r\n3 507 4225 4013 2024 \r\n3 1082 4225 4228 2025 \r\n3 507 4227 4225 2025 \r\n3 543 4228 4227 2025 \r\n3 1082 4228 4230 2026 \r\n3 543 4229 4228 2026 \r\n3 542 4230 4229 2026 \r\n3 1082 4230 4226 2027 \r\n3 542 4221 4230 2027 \r\n3 506 4226 4221 2027 \r\n3 1083 4232 4231 2028 \r\n3 507 4019 4232 2028 \r\n3 508 4231 4019 2028 \r\n3 1083 4231 4234 2029 \r\n3 508 4233 4231 2029 \r\n3 544 4234 4233 2029 \r\n3 1083 4234 4236 2030 \r\n3 544 4235 4234 2030 \r\n3 543 4236 4235 2030 \r\n3 1083 4236 4232 2031 \r\n3 543 4227 4236 2031 \r\n3 507 4232 4227 2031 \r\n3 1084 4238 4237 2032 \r\n3 508 4025 4238 2032 \r\n3 509 4237 4025 2032 \r\n3 1084 4237 4240 2033 \r\n3 509 4239 4237 2033 \r\n3 545 4240 4239 2033 \r\n3 1084 4240 4242 2034 \r\n3 545 4241 4240 2034 \r\n3 544 4242 4241 2034 \r\n3 1084 4242 4238 2035 \r\n3 544 4233 4242 2035 \r\n3 508 4238 4233 2035 \r\n3 1085 4244 4243 2036 \r\n3 509 4031 4244 2036 \r\n3 510 4243 4031 2036 \r\n3 1085 4243 4246 2037 \r\n3 510 4245 4243 2037 \r\n3 546 4246 4245 2037 \r\n3 1085 4246 4248 2038 \r\n3 546 4247 4246 2038 \r\n3 545 4248 4247 2038 \r\n3 1085 4248 4244 2039 \r\n3 545 4239 4248 2039 \r\n3 509 4244 4239 2039 \r\n3 1086 4250 4249 2040 \r\n3 510 4037 4250 2040 \r\n3 511 4249 4037 2040 \r\n3 1086 4249 4252 2041 \r\n3 511 4251 4249 2041 \r\n3 547 4252 4251 2041 \r\n3 1086 4252 4254 2042 \r\n3 547 4253 4252 2042 \r\n3 546 4254 4253 2042 \r\n3 1086 4254 4250 2043 \r\n3 546 4245 4254 2043 \r\n3 510 4250 4245 2043 \r\n3 1087 4256 4255 2044 \r\n3 511 4043 4256 2044 \r\n3 512 4255 4043 2044 \r\n3 1087 4255 4258 2045 \r\n3 512 4257 4255 2045 \r\n3 548 4258 4257 2045 \r\n3 1087 4258 4260 2046 \r\n3 548 4259 4258 2046 \r\n3 547 4260 4259 2046 \r\n3 1087 4260 4256 2047 \r\n3 547 4251 4260 2047 \r\n3 511 4256 4251 2047 \r\n3 1088 4262 4261 2048 \r\n3 512 4049 4262 2048 \r\n3 513 4261 4049 2048 \r\n3 1088 4261 4264 2049 \r\n3 513 4263 4261 2049 \r\n3 549 4264 4263 2049 \r\n3 1088 4264 4266 2050 \r\n3 549 4265 4264 2050 \r\n3 548 4266 4265 2050 \r\n3 1088 4266 4262 2051 \r\n3 548 4257 4266 2051 \r\n3 512 4262 4257 2051 \r\n3 1089 4268 4267 2052 \r\n3 513 4055 4268 2052 \r\n3 514 4267 4055 2052 \r\n3 1089 4267 4270 2053 \r\n3 514 4269 4267 2053 \r\n3 550 4270 4269 2053 \r\n3 1089 4270 4272 2054 \r\n3 550 4271 4270 2054 \r\n3 549 4272 4271 2054 \r\n3 1089 4272 4268 2055 \r\n3 549 4263 4272 2055 \r\n3 513 4268 4263 2055 \r\n3 1090 4274 4273 2056 \r\n3 514 4061 4274 2056 \r\n3 515 4273 4061 2056 \r\n3 1090 4273 4276 2057 \r\n3 515 4275 4273 2057 \r\n3 551 4276 4275 2057 \r\n3 1090 4276 4278 2058 \r\n3 551 4277 4276 2058 \r\n3 550 4278 4277 2058 \r\n3 1090 4278 4274 2059 \r\n3 550 4269 4278 2059 \r\n3 514 4274 4269 2059 \r\n3 1091 4280 4279 2060 \r\n3 515 4067 4280 2060 \r\n3 516 4279 4067 2060 \r\n3 1091 4279 4282 2061 \r\n3 516 4281 4279 2061 \r\n3 552 4282 4281 2061 \r\n3 1091 4282 4284 2062 \r\n3 552 4283 4282 2062 \r\n3 551 4284 4283 2062 \r\n3 1091 4284 4280 2063 \r\n3 551 4275 4284 2063 \r\n3 515 4280 4275 2063 \r\n3 1092 4286 4285 2064 \r\n3 516 4073 4286 2064 \r\n3 517 4285 4073 2064 \r\n3 1092 4285 4288 2065 \r\n3 517 4287 4285 2065 \r\n3 553 4288 4287 2065 \r\n3 1092 4288 4290 2066 \r\n3 553 4289 4288 2066 \r\n3 552 4290 4289 2066 \r\n3 1092 4290 4286 2067 \r\n3 552 4281 4290 2067 \r\n3 516 4286 4281 2067 \r\n3 1093 4292 4291 2068 \r\n3 517 4079 4292 2068 \r\n3 518 4291 4079 2068 \r\n3 1093 4291 4294 2069 \r\n3 518 4293 4291 2069 \r\n3 554 4294 4293 2069 \r\n3 1093 4294 4296 2070 \r\n3 554 4295 4294 2070 \r\n3 553 4296 4295 2070 \r\n3 1093 4296 4292 2071 \r\n3 553 4287 4296 2071 \r\n3 517 4292 4287 2071 \r\n3 1094 4298 4297 2072 \r\n3 518 4085 4298 2072 \r\n3 519 4297 4085 2072 \r\n3 1094 4297 4300 2073 \r\n3 519 4299 4297 2073 \r\n3 555 4300 4299 2073 \r\n3 1094 4300 4302 2074 \r\n3 555 4301 4300 2074 \r\n3 554 4302 4301 2074 \r\n3 1094 4302 4298 2075 \r\n3 554 4293 4302 2075 \r\n3 518 4298 4293 2075 \r\n3 1095 4304 4303 2076 \r\n3 519 4091 4304 2076 \r\n3 520 4303 4091 2076 \r\n3 1095 4303 4306 2077 \r\n3 520 4305 4303 2077 \r\n3 556 4306 4305 2077 \r\n3 1095 4306 4308 2078 \r\n3 556 4307 4306 2078 \r\n3 555 4308 4307 2078 \r\n3 1095 4308 4304 2079 \r\n3 555 4299 4308 2079 \r\n3 519 4304 4299 2079 \r\n3 1096 4310 4309 2080 \r\n3 520 4097 4310 2080 \r\n3 521 4309 4097 2080 \r\n3 1096 4309 4312 2081 \r\n3 521 4311 4309 2081 \r\n3 557 4312 4311 2081 \r\n3 1096 4312 4314 2082 \r\n3 557 4313 4312 2082 \r\n3 556 4314 4313 2082 \r\n3 1096 4314 4310 2083 \r\n3 556 4305 4314 2083 \r\n3 520 4310 4305 2083 \r\n3 1097 4316 4315 2084 \r\n3 521 4103 4316 2084 \r\n3 522 4315 4103 2084 \r\n3 1097 4315 4318 2085 \r\n3 522 4317 4315 2085 \r\n3 558 4318 4317 2085 \r\n3 1097 4318 4320 2086 \r\n3 558 4319 4318 2086 \r\n3 557 4320 4319 2086 \r\n3 1097 4320 4316 2087 \r\n3 557 4311 4320 2087 \r\n3 521 4316 4311 2087 \r\n3 1098 4322 4321 2088 \r\n3 522 4109 4322 2088 \r\n3 523 4321 4109 2088 \r\n3 1098 4321 4324 2089 \r\n3 523 4323 4321 2089 \r\n3 559 4324 4323 2089 \r\n3 1098 4324 4326 2090 \r\n3 559 4325 4324 2090 \r\n3 558 4326 4325 2090 \r\n3 1098 4326 4322 2091 \r\n3 558 4317 4326 2091 \r\n3 522 4322 4317 2091 \r\n3 1099 4328 4327 2092 \r\n3 523 4115 4328 2092 \r\n3 524 4327 4115 2092 \r\n3 1099 4327 4330 2093 \r\n3 524 4329 4327 2093 \r\n3 560 4330 4329 2093 \r\n3 1099 4330 4332 2094 \r\n3 560 4331 4330 2094 \r\n3 559 4332 4331 2094 \r\n3 1099 4332 4328 2095 \r\n3 559 4323 4332 2095 \r\n3 523 4328 4323 2095 \r\n3 1100 4334 4333 2096 \r\n3 524 4121 4334 2096 \r\n3 525 4333 4121 2096 \r\n3 1100 4333 4336 2097 \r\n3 525 4335 4333 2097 \r\n3 561 4336 4335 2097 \r\n3 1100 4336 4338 2098 \r\n3 561 4337 4336 2098 \r\n3 560 4338 4337 2098 \r\n3 1100 4338 4334 2099 \r\n3 560 4329 4338 2099 \r\n3 524 4334 4329 2099 \r\n3 1101 4340 4339 2100 \r\n3 525 4127 4340 2100 \r\n3 526 4339 4127 2100 \r\n3 1101 4339 4342 2101 \r\n3 526 4341 4339 2101 \r\n3 562 4342 4341 2101 \r\n3 1101 4342 4344 2102 \r\n3 562 4343 4342 2102 \r\n3 561 4344 4343 2102 \r\n3 1101 4344 4340 2103 \r\n3 561 4335 4344 2103 \r\n3 525 4340 4335 2103 \r\n3 1102 4346 4345 2104 \r\n3 526 4133 4346 2104 \r\n3 527 4345 4133 2104 \r\n3 1102 4345 4348 2105 \r\n3 527 4347 4345 2105 \r\n3 563 4348 4347 2105 \r\n3 1102 4348 4350 2106 \r\n3 563 4349 4348 2106 \r\n3 562 4350 4349 2106 \r\n3 1102 4350 4346 2107 \r\n3 562 4341 4350 2107 \r\n3 526 4346 4341 2107 \r\n3 1103 4352 4351 2108 \r\n3 527 4139 4352 2108 \r\n3 528 4351 4139 2108 \r\n3 1103 4351 4354 2109 \r\n3 528 4353 4351 2109 \r\n3 564 4354 4353 2109 \r\n3 1103 4354 4356 2110 \r\n3 564 4355 4354 2110 \r\n3 563 4356 4355 2110 \r\n3 1103 4356 4352 2111 \r\n3 563 4347 4356 2111 \r\n3 527 4352 4347 2111 \r\n3 1104 4358 4357 2112 \r\n3 528 4145 4358 2112 \r\n3 529 4357 4145 2112 \r\n3 1104 4357 4360 2113 \r\n3 529 4359 4357 2113 \r\n3 565 4360 4359 2113 \r\n3 1104 4360 4362 2114 \r\n3 565 4361 4360 2114 \r\n3 564 4362 4361 2114 \r\n3 1104 4362 4358 2115 \r\n3 564 4353 4362 2115 \r\n3 528 4358 4353 2115 \r\n3 1105 4364 4363 2116 \r\n3 529 4151 4364 2116 \r\n3 530 4363 4151 2116 \r\n3 1105 4363 4366 2117 \r\n3 530 4365 4363 2117 \r\n3 566 4366 4365 2117 \r\n3 1105 4366 4368 2118 \r\n3 566 4367 4366 2118 \r\n3 565 4368 4367 2118 \r\n3 1105 4368 4364 2119 \r\n3 565 4359 4368 2119 \r\n3 529 4364 4359 2119 \r\n3 1106 4370 4369 2120 \r\n3 530 4157 4370 2120 \r\n3 531 4369 4157 2120 \r\n3 1106 4369 4372 2121 \r\n3 531 4371 4369 2121 \r\n3 567 4372 4371 2121 \r\n3 1106 4372 4374 2122 \r\n3 567 4373 4372 2122 \r\n3 566 4374 4373 2122 \r\n3 1106 4374 4370 2123 \r\n3 566 4365 4374 2123 \r\n3 530 4370 4365 2123 \r\n3 1107 4376 4375 2124 \r\n3 531 4163 4376 2124 \r\n3 532 4375 4163 2124 \r\n3 1107 4375 4378 2125 \r\n3 532 4377 4375 2125 \r\n3 568 4378 4377 2125 \r\n3 1107 4378 4380 2126 \r\n3 568 4379 4378 2126 \r\n3 567 4380 4379 2126 \r\n3 1107 4380 4376 2127 \r\n3 567 4371 4380 2127 \r\n3 531 4376 4371 2127 \r\n3 1108 4382 4381 2128 \r\n3 532 4169 4382 2128 \r\n3 533 4381 4169 2128 \r\n3 1108 4381 4384 2129 \r\n3 533 4383 4381 2129 \r\n3 569 4384 4383 2129 \r\n3 1108 4384 4386 2130 \r\n3 569 4385 4384 2130 \r\n3 568 4386 4385 2130 \r\n3 1108 4386 4382 2131 \r\n3 568 4377 4386 2131 \r\n3 532 4382 4377 2131 \r\n3 1109 4388 4387 2132 \r\n3 533 4175 4388 2132 \r\n3 534 4387 4175 2132 \r\n3 1109 4387 4390 2133 \r\n3 534 4389 4387 2133 \r\n3 570 4390 4389 2133 \r\n3 1109 4390 4392 2134 \r\n3 570 4391 4390 2134 \r\n3 569 4392 4391 2134 \r\n3 1109 4392 4388 2135 \r\n3 569 4383 4392 2135 \r\n3 533 4388 4383 2135 \r\n3 1110 4394 4393 2136 \r\n3 534 4181 4394 2136 \r\n3 535 4393 4181 2136 \r\n3 1110 4393 4396 2137 \r\n3 535 4395 4393 2137 \r\n3 571 4396 4395 2137 \r\n3 1110 4396 4398 2138 \r\n3 571 4397 4396 2138 \r\n3 570 4398 4397 2138 \r\n3 1110 4398 4394 2139 \r\n3 570 4389 4398 2139 \r\n3 534 4394 4389 2139 \r\n3 1111 4400 4399 2140 \r\n3 535 4187 4400 2140 \r\n3 536 4399 4187 2140 \r\n3 1111 4399 4402 2141 \r\n3 536 4401 4399 2141 \r\n3 572 4402 4401 2141 \r\n3 1111 4402 4404 2142 \r\n3 572 4403 4402 2142 \r\n3 571 4404 4403 2142 \r\n3 1111 4404 4400 2143 \r\n3 571 4395 4404 2143 \r\n3 535 4400 4395 2143 \r\n3 1112 4406 4405 2144 \r\n3 536 4193 4406 2144 \r\n3 537 4405 4193 2144 \r\n3 1112 4405 4408 2145 \r\n3 537 4407 4405 2145 \r\n3 573 4408 4407 2145 \r\n3 1112 4408 4410 2146 \r\n3 573 4409 4408 2146 \r\n3 572 4410 4409 2146 \r\n3 1112 4410 4406 2147 \r\n3 572 4401 4410 2147 \r\n3 536 4406 4401 2147 \r\n3 1113 4412 4411 2148 \r\n3 537 4199 4412 2148 \r\n3 538 4411 4199 2148 \r\n3 1113 4411 4414 2149 \r\n3 538 4413 4411 2149 \r\n3 574 4414 4413 2149 \r\n3 1113 4414 4416 2150 \r\n3 574 4415 4414 2150 \r\n3 573 4416 4415 2150 \r\n3 1113 4416 4412 2151 \r\n3 573 4407 4416 2151 \r\n3 537 4412 4407 2151 \r\n3 1114 4418 4417 2152 \r\n3 538 4205 4418 2152 \r\n3 539 4417 4205 2152 \r\n3 1114 4417 4420 2153 \r\n3 539 4419 4417 2153 \r\n3 575 4420 4419 2153 \r\n3 1114 4420 4422 2154 \r\n3 575 4421 4420 2154 \r\n3 574 4422 4421 2154 \r\n3 1114 4422 4418 2155 \r\n3 574 4413 4422 2155 \r\n3 538 4418 4413 2155 \r\n3 1115 4424 4423 2156 \r\n3 539 4210 4424 2156 \r\n3 504 4423 4210 2156 \r\n3 1115 4423 4425 2157 \r\n3 504 4218 4423 2157 \r\n3 540 4425 4218 2157 \r\n3 1115 4425 4427 2158 \r\n3 540 4426 4425 2158 \r\n3 575 4427 4426 2158 \r\n3 1115 4427 4424 2159 \r\n3 575 4419 4427 2159 \r\n3 539 4424 4419 2159 \r\n3 1116 4429 4428 2160 \r\n3 540 4216 4429 2160 \r\n3 541 4428 4216 2160 \r\n3 1116 4428 4431 2161 \r\n3 541 4430 4428 2161 \r\n3 1 4431 4430 2161 \r\n3 1116 4431 4432 2162 \r\n3 1 1152 4431 2162 \r\n3 0 4432 1152 2162 \r\n3 1116 4432 4429 2163 \r\n3 0 4433 4432 2163 \r\n3 540 4429 4433 2163 \r\n3 1117 4435 4434 2164 \r\n3 541 4223 4435 2164 \r\n3 542 4434 4223 2164 \r\n3 1117 4434 4437 2165 \r\n3 542 4436 4434 2165 \r\n3 2 4437 4436 2165 \r\n3 1117 4437 4438 2166 \r\n3 2 1160 4437 2166 \r\n3 1 4438 1160 2166 \r\n3 1117 4438 4435 2167 \r\n3 1 4430 4438 2167 \r\n3 541 4435 4430 2167 \r\n3 1118 4440 4439 2168 \r\n3 542 4229 4440 2168 \r\n3 543 4439 4229 2168 \r\n3 1118 4439 4442 2169 \r\n3 543 4441 4439 2169 \r\n3 3 4442 4441 2169 \r\n3 1118 4442 4443 2170 \r\n3 3 1167 4442 2170 \r\n3 2 4443 1167 2170 \r\n3 1118 4443 4440 2171 \r\n3 2 4436 4443 2171 \r\n3 542 4440 4436 2171 \r\n3 1119 4445 4444 2172 \r\n3 543 4235 4445 2172 \r\n3 544 4444 4235 2172 \r\n3 1119 4444 4447 2173 \r\n3 544 4446 4444 2173 \r\n3 4 4447 4446 2173 \r\n3 1119 4447 4448 2174 \r\n3 4 1174 4447 2174 \r\n3 3 4448 1174 2174 \r\n3 1119 4448 4445 2175 \r\n3 3 4441 4448 2175 \r\n3 543 4445 4441 2175 \r\n3 1120 4450 4449 2176 \r\n3 544 4241 4450 2176 \r\n3 545 4449 4241 2176 \r\n3 1120 4449 4452 2177 \r\n3 545 4451 4449 2177 \r\n3 5 4452 4451 2177 \r\n3 1120 4452 4453 2178 \r\n3 5 1181 4452 2178 \r\n3 4 4453 1181 2178 \r\n3 1120 4453 4450 2179 \r\n3 4 4446 4453 2179 \r\n3 544 4450 4446 2179 \r\n3 1121 4455 4454 2180 \r\n3 545 4247 4455 2180 \r\n3 546 4454 4247 2180 \r\n3 1121 4454 4457 2181 \r\n3 546 4456 4454 2181 \r\n3 6 4457 4456 2181 \r\n3 1121 4457 4458 2182 \r\n3 6 1188 4457 2182 \r\n3 5 4458 1188 2182 \r\n3 1121 4458 4455 2183 \r\n3 5 4451 4458 2183 \r\n3 545 4455 4451 2183 \r\n3 1122 4460 4459 2184 \r\n3 546 4253 4460 2184 \r\n3 547 4459 4253 2184 \r\n3 1122 4459 4462 2185 \r\n3 547 4461 4459 2185 \r\n3 7 4462 4461 2185 \r\n3 1122 4462 4463 2186 \r\n3 7 1195 4462 2186 \r\n3 6 4463 1195 2186 \r\n3 1122 4463 4460 2187 \r\n3 6 4456 4463 2187 \r\n3 546 4460 4456 2187 \r\n3 1123 4465 4464 2188 \r\n3 547 4259 4465 2188 \r\n3 548 4464 4259 2188 \r\n3 1123 4464 4467 2189 \r\n3 548 4466 4464 2189 \r\n3 8 4467 4466 2189 \r\n3 1123 4467 4468 2190 \r\n3 8 1202 4467 2190 \r\n3 7 4468 1202 2190 \r\n3 1123 4468 4465 2191 \r\n3 7 4461 4468 2191 \r\n3 547 4465 4461 2191 \r\n3 1124 4470 4469 2192 \r\n3 548 4265 4470 2192 \r\n3 549 4469 4265 2192 \r\n3 1124 4469 4472 2193 \r\n3 549 4471 4469 2193 \r\n3 9 4472 4471 2193 \r\n3 1124 4472 4473 2194 \r\n3 9 1209 4472 2194 \r\n3 8 4473 1209 2194 \r\n3 1124 4473 4470 2195 \r\n3 8 4466 4473 2195 \r\n3 548 4470 4466 2195 \r\n3 1125 4475 4474 2196 \r\n3 549 4271 4475 2196 \r\n3 550 4474 4271 2196 \r\n3 1125 4474 4477 2197 \r\n3 550 4476 4474 2197 \r\n3 10 4477 4476 2197 \r\n3 1125 4477 4478 2198 \r\n3 10 1216 4477 2198 \r\n3 9 4478 1216 2198 \r\n3 1125 4478 4475 2199 \r\n3 9 4471 4478 2199 \r\n3 549 4475 4471 2199 \r\n3 1126 4480 4479 2200 \r\n3 550 4277 4480 2200 \r\n3 551 4479 4277 2200 \r\n3 1126 4479 4482 2201 \r\n3 551 4481 4479 2201 \r\n3 11 4482 4481 2201 \r\n3 1126 4482 4483 2202 \r\n3 11 1223 4482 2202 \r\n3 10 4483 1223 2202 \r\n3 1126 4483 4480 2203 \r\n3 10 4476 4483 2203 \r\n3 550 4480 4476 2203 \r\n3 1127 4485 4484 2204 \r\n3 551 4283 4485 2204 \r\n3 552 4484 4283 2204 \r\n3 1127 4484 4487 2205 \r\n3 552 4486 4484 2205 \r\n3 12 4487 4486 2205 \r\n3 1127 4487 4488 2206 \r\n3 12 1230 4487 2206 \r\n3 11 4488 1230 2206 \r\n3 1127 4488 4485 2207 \r\n3 11 4481 4488 2207 \r\n3 551 4485 4481 2207 \r\n3 1128 4490 4489 2208 \r\n3 552 4289 4490 2208 \r\n3 553 4489 4289 2208 \r\n3 1128 4489 4492 2209 \r\n3 553 4491 4489 2209 \r\n3 13 4492 4491 2209 \r\n3 1128 4492 4493 2210 \r\n3 13 1237 4492 2210 \r\n3 12 4493 1237 2210 \r\n3 1128 4493 4490 2211 \r\n3 12 4486 4493 2211 \r\n3 552 4490 4486 2211 \r\n3 1129 4495 4494 2212 \r\n3 553 4295 4495 2212 \r\n3 554 4494 4295 2212 \r\n3 1129 4494 4497 2213 \r\n3 554 4496 4494 2213 \r\n3 14 4497 4496 2213 \r\n3 1129 4497 4498 2214 \r\n3 14 1244 4497 2214 \r\n3 13 4498 1244 2214 \r\n3 1129 4498 4495 2215 \r\n3 13 4491 4498 2215 \r\n3 553 4495 4491 2215 \r\n3 1130 4500 4499 2216 \r\n3 554 4301 4500 2216 \r\n3 555 4499 4301 2216 \r\n3 1130 4499 4502 2217 \r\n3 555 4501 4499 2217 \r\n3 15 4502 4501 2217 \r\n3 1130 4502 4503 2218 \r\n3 15 1251 4502 2218 \r\n3 14 4503 1251 2218 \r\n3 1130 4503 4500 2219 \r\n3 14 4496 4503 2219 \r\n3 554 4500 4496 2219 \r\n3 1131 4505 4504 2220 \r\n3 555 4307 4505 2220 \r\n3 556 4504 4307 2220 \r\n3 1131 4504 4507 2221 \r\n3 556 4506 4504 2221 \r\n3 16 4507 4506 2221 \r\n3 1131 4507 4508 2222 \r\n3 16 1258 4507 2222 \r\n3 15 4508 1258 2222 \r\n3 1131 4508 4505 2223 \r\n3 15 4501 4508 2223 \r\n3 555 4505 4501 2223 \r\n3 1132 4510 4509 2224 \r\n3 556 4313 4510 2224 \r\n3 557 4509 4313 2224 \r\n3 1132 4509 4512 2225 \r\n3 557 4511 4509 2225 \r\n3 17 4512 4511 2225 \r\n3 1132 4512 4513 2226 \r\n3 17 1265 4512 2226 \r\n3 16 4513 1265 2226 \r\n3 1132 4513 4510 2227 \r\n3 16 4506 4513 2227 \r\n3 556 4510 4506 2227 \r\n3 1133 4515 4514 2228 \r\n3 557 4319 4515 2228 \r\n3 558 4514 4319 2228 \r\n3 1133 4514 4517 2229 \r\n3 558 4516 4514 2229 \r\n3 18 4517 4516 2229 \r\n3 1133 4517 4518 2230 \r\n3 18 1272 4517 2230 \r\n3 17 4518 1272 2230 \r\n3 1133 4518 4515 2231 \r\n3 17 4511 4518 2231 \r\n3 557 4515 4511 2231 \r\n3 1134 4520 4519 2232 \r\n3 558 4325 4520 2232 \r\n3 559 4519 4325 2232 \r\n3 1134 4519 4522 2233 \r\n3 559 4521 4519 2233 \r\n3 19 4522 4521 2233 \r\n3 1134 4522 4523 2234 \r\n3 19 1279 4522 2234 \r\n3 18 4523 1279 2234 \r\n3 1134 4523 4520 2235 \r\n3 18 4516 4523 2235 \r\n3 558 4520 4516 2235 \r\n3 1135 4525 4524 2236 \r\n3 559 4331 4525 2236 \r\n3 560 4524 4331 2236 \r\n3 1135 4524 4527 2237 \r\n3 560 4526 4524 2237 \r\n3 20 4527 4526 2237 \r\n3 1135 4527 4528 2238 \r\n3 20 1286 4527 2238 \r\n3 19 4528 1286 2238 \r\n3 1135 4528 4525 2239 \r\n3 19 4521 4528 2239 \r\n3 559 4525 4521 2239 \r\n3 1136 4530 4529 2240 \r\n3 560 4337 4530 2240 \r\n3 561 4529 4337 2240 \r\n3 1136 4529 4532 2241 \r\n3 561 4531 4529 2241 \r\n3 21 4532 4531 2241 \r\n3 1136 4532 4533 2242 \r\n3 21 1293 4532 2242 \r\n3 20 4533 1293 2242 \r\n3 1136 4533 4530 2243 \r\n3 20 4526 4533 2243 \r\n3 560 4530 4526 2243 \r\n3 1137 4535 4534 2244 \r\n3 561 4343 4535 2244 \r\n3 562 4534 4343 2244 \r\n3 1137 4534 4537 2245 \r\n3 562 4536 4534 2245 \r\n3 22 4537 4536 2245 \r\n3 1137 4537 4538 2246 \r\n3 22 1300 4537 2246 \r\n3 21 4538 1300 2246 \r\n3 1137 4538 4535 2247 \r\n3 21 4531 4538 2247 \r\n3 561 4535 4531 2247 \r\n3 1138 4540 4539 2248 \r\n3 562 4349 4540 2248 \r\n3 563 4539 4349 2248 \r\n3 1138 4539 4542 2249 \r\n3 563 4541 4539 2249 \r\n3 23 4542 4541 2249 \r\n3 1138 4542 4543 2250 \r\n3 23 1307 4542 2250 \r\n3 22 4543 1307 2250 \r\n3 1138 4543 4540 2251 \r\n3 22 4536 4543 2251 \r\n3 562 4540 4536 2251 \r\n3 1139 4545 4544 2252 \r\n3 563 4355 4545 2252 \r\n3 564 4544 4355 2252 \r\n3 1139 4544 4547 2253 \r\n3 564 4546 4544 2253 \r\n3 24 4547 4546 2253 \r\n3 1139 4547 4548 2254 \r\n3 24 1314 4547 2254 \r\n3 23 4548 1314 2254 \r\n3 1139 4548 4545 2255 \r\n3 23 4541 4548 2255 \r\n3 563 4545 4541 2255 \r\n3 1140 4550 4549 2256 \r\n3 564 4361 4550 2256 \r\n3 565 4549 4361 2256 \r\n3 1140 4549 4552 2257 \r\n3 565 4551 4549 2257 \r\n3 25 4552 4551 2257 \r\n3 1140 4552 4553 2258 \r\n3 25 1321 4552 2258 \r\n3 24 4553 1321 2258 \r\n3 1140 4553 4550 2259 \r\n3 24 4546 4553 2259 \r\n3 564 4550 4546 2259 \r\n3 1141 4555 4554 2260 \r\n3 565 4367 4555 2260 \r\n3 566 4554 4367 2260 \r\n3 1141 4554 4557 2261 \r\n3 566 4556 4554 2261 \r\n3 26 4557 4556 2261 \r\n3 1141 4557 4558 2262 \r\n3 26 1328 4557 2262 \r\n3 25 4558 1328 2262 \r\n3 1141 4558 4555 2263 \r\n3 25 4551 4558 2263 \r\n3 565 4555 4551 2263 \r\n3 1142 4560 4559 2264 \r\n3 566 4373 4560 2264 \r\n3 567 4559 4373 2264 \r\n3 1142 4559 4562 2265 \r\n3 567 4561 4559 2265 \r\n3 27 4562 4561 2265 \r\n3 1142 4562 4563 2266 \r\n3 27 1335 4562 2266 \r\n3 26 4563 1335 2266 \r\n3 1142 4563 4560 2267 \r\n3 26 4556 4563 2267 \r\n3 566 4560 4556 2267 \r\n3 1143 4565 4564 2268 \r\n3 567 4379 4565 2268 \r\n3 568 4564 4379 2268 \r\n3 1143 4564 4567 2269 \r\n3 568 4566 4564 2269 \r\n3 28 4567 4566 2269 \r\n3 1143 4567 4568 2270 \r\n3 28 1342 4567 2270 \r\n3 27 4568 1342 2270 \r\n3 1143 4568 4565 2271 \r\n3 27 4561 4568 2271 \r\n3 567 4565 4561 2271 \r\n3 1144 4570 4569 2272 \r\n3 568 4385 4570 2272 \r\n3 569 4569 4385 2272 \r\n3 1144 4569 4572 2273 \r\n3 569 4571 4569 2273 \r\n3 29 4572 4571 2273 \r\n3 1144 4572 4573 2274 \r\n3 29 1349 4572 2274 \r\n3 28 4573 1349 2274 \r\n3 1144 4573 4570 2275 \r\n3 28 4566 4573 2275 \r\n3 568 4570 4566 2275 \r\n3 1145 4575 4574 2276 \r\n3 569 4391 4575 2276 \r\n3 570 4574 4391 2276 \r\n3 1145 4574 4577 2277 \r\n3 570 4576 4574 2277 \r\n3 30 4577 4576 2277 \r\n3 1145 4577 4578 2278 \r\n3 30 1356 4577 2278 \r\n3 29 4578 1356 2278 \r\n3 1145 4578 4575 2279 \r\n3 29 4571 4578 2279 \r\n3 569 4575 4571 2279 \r\n3 1146 4580 4579 2280 \r\n3 570 4397 4580 2280 \r\n3 571 4579 4397 2280 \r\n3 1146 4579 4582 2281 \r\n3 571 4581 4579 2281 \r\n3 31 4582 4581 2281 \r\n3 1146 4582 4583 2282 \r\n3 31 1363 4582 2282 \r\n3 30 4583 1363 2282 \r\n3 1146 4583 4580 2283 \r\n3 30 4576 4583 2283 \r\n3 570 4580 4576 2283 \r\n3 1147 4585 4584 2284 \r\n3 571 4403 4585 2284 \r\n3 572 4584 4403 2284 \r\n3 1147 4584 4587 2285 \r\n3 572 4586 4584 2285 \r\n3 32 4587 4586 2285 \r\n3 1147 4587 4588 2286 \r\n3 32 1370 4587 2286 \r\n3 31 4588 1370 2286 \r\n3 1147 4588 4585 2287 \r\n3 31 4581 4588 2287 \r\n3 571 4585 4581 2287 \r\n3 1148 4590 4589 2288 \r\n3 572 4409 4590 2288 \r\n3 573 4589 4409 2288 \r\n3 1148 4589 4592 2289 \r\n3 573 4591 4589 2289 \r\n3 33 4592 4591 2289 \r\n3 1148 4592 4593 2290 \r\n3 33 1377 4592 2290 \r\n3 32 4593 1377 2290 \r\n3 1148 4593 4590 2291 \r\n3 32 4586 4593 2291 \r\n3 572 4590 4586 2291 \r\n3 1149 4595 4594 2292 \r\n3 573 4415 4595 2292 \r\n3 574 4594 4415 2292 \r\n3 1149 4594 4597 2293 \r\n3 574 4596 4594 2293 \r\n3 34 4597 4596 2293 \r\n3 1149 4597 4598 2294 \r\n3 34 1384 4597 2294 \r\n3 33 4598 1384 2294 \r\n3 1149 4598 4595 2295 \r\n3 33 4591 4598 2295 \r\n3 573 4595 4591 2295 \r\n3 1150 4600 4599 2296 \r\n3 574 4421 4600 2296 \r\n3 575 4599 4421 2296 \r\n3 1150 4599 4602 2297 \r\n3 575 4601 4599 2297 \r\n3 35 4602 4601 2297 \r\n3 1150 4602 4603 2298 \r\n3 35 1391 4602 2298 \r\n3 34 4603 1391 2298 \r\n3 1150 4603 4600 2299 \r\n3 34 4596 4603 2299 \r\n3 574 4600 4596 2299 \r\n3 1151 4605 4604 2300 \r\n3 575 4426 4605 2300 \r\n3 540 4604 4426 2300 \r\n3 1151 4604 4606 2301 \r\n3 540 4433 4604 2301 \r\n3 0 4606 4433 2301 \r\n3 1151 4606 4607 2302 \r\n3 0 1398 4606 2302 \r\n3 35 4607 1398 2302 \r\n3 1151 4607 4605 2303 \r\n3 35 4601 4607 2303 \r\n3 575 4605 4601 2303 \r\nPress any key to continue"
  },
  {
    "path": "tests/meshes/mesh.modifier.PGPRemesh.torus.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0.90550895942869014 0.049648852205393515 1.1781442432611438 -1.3744100433494877 0.051073516655302062 0.5644307254457831 1.1776907728527199 0.050207644065621108 -0.9059644440775324 1.3249550909312369 0.3297695066171592 0.32618852456166497 0.089951539308473896 0.32973920086290082 1.3615929666309481 -0.38482884435748888 0.20053719677637541 1.39829770941666 -0.37497595551659507 0.32990410699993927 1.31178679716044 -0.83475340197201919 0.2007834635389098 1.1857388298985836 -0.79600149533143827 0.33013505594630138 1.1077528161848349 -1.1857145744512099 0.20108790178909772 0.83443463997252021 -1.1226837493789175 0.33044926112210593 0.77431498024562129 -1.3159709293029291 0.33084374220781959 0.35694749788327457 -1.0990480113331793 0.33196490269419127 -0.80630863114648355 -0.76466922670333226 0.33219049789382787 -1.1280232442805302 -0.33842210392271044 0.33218448625362462 -1.3200117682309562 0.12794962062283047 0.33192624807193855 -1.3568078412957552 0.57902663457402048 0.33145909044613009 -1.2340182978617029 1.0348255548498611 0.20113427106010801 -1.0155768832319487 0.96279615944995445 0.33088597488931615 -0.96546924586224103 1.3173217328303375 0.20064922691272458 -0.60642586178354796 1.2337053141147745 0.33033348648405414 -0.58147150834663763 1.4443754278400758 0.20032170626298046 -0.13213767203875618 1.3578446615922617 0.3299481120311995 -0.13120643492456385 0.84074958945930778 0.42431534380888219 0.91698019646349072 -1.2416121649999119 0.42565570942172126 0.046050205859045693 -1.2305757050654078 0.4256208683196685 0.17279299101711154 -1.1472952498459326 0.42586583382088494 -0.47510892966540802 -0.4635772157142391 0.42670877137383217 -1.1512835292520276 -0.046357130446951403 0.4264780973793269 -1.2403546349104893 0.37541708354010234 0.42603302264319093 -1.1835087798985306 1.1008867885799085 0.47977182637475135 0.0092140777853497949 0.97139680298162678 0.479339671803378 0.51886103461569022 1.0266387700545978 0.47952546063098606 0.39820692416447234 0.7274700513812894 0.47944653602088982 0.82693701406590325 0.82023153601111642 0.47932481728530679 0.73503752827572888 0.40039221731882424 0.4794538324480932 1.0260154156349031 0.51564694004726752 0.47926413397083389 0.97331288302109953 0.032013078282849647 0.47938795983178817 1.100820235410416 0.15703440641250599 0.47934797115912026 1.0900879437385116 -0.34036810514456578 0.47934470547451569 1.0472360962076657 -0.21818083767418517 0.4794677890408745 1.079332424767806 -0.67468778702421062 0.47934867806069881 0.8699686689306414 -0.57020630061220434 0.47957225440950108 0.94175929398018055 -0.85396139666294069 0.47972020651116631 0.6943049009864104 -1.0381124733425595 0.47987882608550425 0.36408605184950532 -1.0883818694998275 0.47975061248547246 -0.15340401925677927 -1.0287183930921637 0.48018273837440451 -0.38595971111926519 -0.83628455006281832 0.48034499374012013 -0.71175918896669543 -0.546623401811002 0.4804813672226742 -0.95214298385523788 0.18605098414802482 0.48038682537642297 -1.0823210919488235 0.53992981331385803 0.48017991060874998 -0.95692986105057576 0.83382063310970456 0.4799929288487656 -0.71671659396020948 0.43931534381920284 0.48972824910671758 -0.83756211880342279 0.76911751589485511 0.45599977586587709 0.2079207063737169 0.64145882115482744 0.3689456238310363 0.18288259195993573 0.60764663797197005 0.36901010562881364 0.27522865312145978 0.2940015102878577 0.36909992586692492 0.59904031986859241 0.16530878901906709 0.36907476602717176 0.64636725489705826 -0.064988682105983811 0.36899938688981943 0.66387780304400867 -0.20092523296642167 0.45605733267689696 0.77108073761425411 -0.16522508588833371 0.36895413859244491 0.64620349528491339 -0.46036384506466421 0.45590062007136734 0.65009165311999173 -0.60812104257260757 0.36842890831839381 0.27216102708748041 -0.77047604228165867 0.45533551821323892 0.19902412260194235 -0.79307484091199265 0.45514183556696147 0.061833192342872441 -0.56601709635918263 0.45421937563005937 -0.55696777724972302 -0.44853081824461388 0.45410021145670387 -0.65509968437311639 -0.288543981377821 0.36720850771783242 -0.59847384346370958 -0.17941317749704452 0.36720316975285977 -0.63969900722348894 0.17538523174699189 0.36746435111148951 -0.64118147580690343 0.34099410449630174 0.45450266164412495 -0.71761805275015 0.38148365343797447 0.36780016456959735 -0.54497488543888084 0.56158052962931659 0.45492433927310538 -0.56289059020927645 0.54720919906530052 0.36819636244365495 -0.3793226354837313 0.30587539071112002 0.24649505787687723 0.4849922340931076 -0.30286816673100631 0.24593404052928561 0.48664188892000554 -0.56671466980838059 0.2447546497521737 -0.080413170635356176 0.48466244070590586 0.2454786003216132 -0.30516676552827027 0.53147302584257872 0.24563377563335129 -0.21407942981865991 0.5604811551100124 0.24586586477586081 -0.1194783389763806 0.57266425309087143 0.24611351681948274 -0.022794890627123015 0.49202260673845566 0.10292982600657381 0.16705181928082208 0.38544066089643325 0.10308776797810605 0.34786464899733804 0.16814153843038288 0.10286522237257489 0.49171738722097225 0.013627774712593629 0.10276263692291797 0.51924854785119434 -0.27721612169106813 0.1024465185642645 0.43873846908569375 -0.38939299884693834 0.10210466112086317 0.34363653791746501 -0.51337892585433242 0.10155016831171303 0.077960622617880906 -0.51398544374151744 0.10137695527833818 -0.070633314039162093 -0.39385307207559672 0.10084063766074555 -0.33882193271315103 -0.27250618645896985 -0.050951319118150283 0.42957903465917729 0.56858078354843511 -0.33147001586903968 0.26969501589326728 0.52169575934185763 -0.33154334797552271 0.3521552641742311 0.27432701699795964 -0.33183710086949531 0.5666904203110914 0.055125678569238168 -0.33208217836518239 0.62727742837327705 -0.058665972613538092 -0.33221374651454982 0.62705556979235444 -0.14557061777457389 -0.20225546756041388 0.523435897629969 -0.43600442444557608 -0.33266591563186915 0.45506878037681031 -0.56815185011415736 -0.33279789487496408 0.27270630770454951 -0.49527446024794058 -0.20273349486096193 -0.22413802641388181 -0.56874574075337336 -0.33253453242511666 -0.27101843953274757 -0.17697249951764185 -0.33179750496575205 -0.60429186387700895 -0.058230449906147196 -0.33163983407298919 -0.62671020537580291 0.36524397046612123 -0.33126912515459533 -0.51230811396752263 0.44672379366181902 -0.20155972711883266 -0.30838031068556754 0.51835790164060624 -0.3312202079828076 -0.35654721636884329 0.74487488543482139 -0.4253373204322447 0.10292593154496639 -0.28371218105161633 -0.42616567789834553 0.69771402883687439 -0.66276111490834977 -0.42589576345279523 -0.3577167047837938 -0.59318181555318428 -0.42591495164594217 -0.46369631780255804 -0.2813357073521503 -0.42551895888130836 -0.69775874363425827 0.2347116664891985 -0.42510505856104869 -0.71425425815855637 0.15562355833218181 -0.42520064912161237 -0.73559383045315418 0.46547794151849936 -0.42501647201766812 -0.5902991568124617 0.39405877954586893 -0.42498313329609311 -0.64024673856160241 0.59325586521499107 -0.42516927702247698 -0.46165307255825622 0.74496267823514128 -0.42530845482256247 -0.10142812198576109 0.88673488802717626 -0.47958438504199985 0.12148159367826666 0.82774273167187584 -0.47965992480217534 0.34105786762933643 0.47564943406414728 -0.47969774664465914 0.75894864200670686 0.56388188625306546 -0.47946016684955595 0.69571503003387092 0.18625589565846321 -0.47974345432486981 0.87640141442035135 0.28689169640912715 -0.47958856820516133 0.84863289924699703 -0.11785259183227914 -0.479896365934189 0.8886207707819811 -0.015927285416062982 -0.47959279105946034 0.89601187657027959 -0.31460870539114483 -0.47956394657799106 0.83954606093346684 -0.58516809723263996 -0.47965847786570132 0.67959076985357569 -0.8874135349458937 -0.47986840357485971 0.13004694328801344 -0.88831972725973352 -0.47992388692915211 -0.12287596726679095 -0.69979757002071175 -0.47964447312495473 -0.55966076432271505 -0.76572615673837496 -0.47967139592542107 -0.46574053516640818 -0.47457055246174235 -0.47967669595640661 -0.75957541553416363 -0.55492716383158414 -0.47965273697961841 -0.70316290775342094 -0.18621966157941083 -0.47958881780585444 -0.87560934099583976 -0.28896857862975039 -0.47945162309406625 -0.84736583821578926 0.12257920007942276 -0.47954701221288615 -0.88645099109102166 0.020665214789790515 -0.47940606224704058 -0.89465862769246041 0.31845583947447209 -0.47926696967685228 -0.83611096355974224 0.66067437565729192 -0.47955659843013831 -0.60336290877821841 0.58442956998721107 -0.47923712534271656 -0.67734404446745933 0.83357525466921123 -0.47935209812148771 -0.32490271816747562 0.78642022533988432 -0.47939014096761173 -0.42647711876797473 1.1612106666334236 -0.45425919260596392 0.29602793497666252 1.2875670582347734 -0.36779518473061523 0.32250778670757929 0.98847100970650925 -0.454097362264134 0.67784001007840222 1.1043208136652007 -0.36764231379104512 0.73710328726445229 0.69464424186395812 -0.45394618607708448 0.97697902267826331 0.31979402932525397 -0.45378971836621462 1.1555681817719281 -0.090088904533404818 -0.45361176169969658 1.1959218106386875 -0.78431562067600602 -0.36688683237939756 1.0726395063893202 -1.1001727712501397 -0.36673787629149673 0.74537857121034268 -1.2854602891877565 -0.36665571494722277 0.33693446487803225 -0.98158767976959715 -0.45344825160290897 -0.68935706685784415 -1.0730732513730454 -0.36683592130005005 -0.78382845797543921 -0.692279750293608 -0.45368213767641385 -0.97911536452491577 -0.74766312167997795 -0.36702764042330238 -1.098045878422703 -0.32087759162298068 -0.45391786520642596 -1.1550704996843539 -0.3326533990455196 -0.36724676182110533 -1.2856951744236413 0.12200108833166234 -0.36745685093654479 -1.3220672471723649 0.56228741977348939 -0.36763526394906587 -1.2024273728267805 0.93707020045007161 -0.36777370737946902 -0.93987374611663477 1.2009446706290607 -0.36786270619540384 -0.56466459752322906 1.3211277329631532 -0.3678916710839516 -0.12530139083245623 -0.53921665498061189 -0.24482898548306736 1.3162041677630416 -0.95259725816529028 -0.24475297202467872 1.0567469818332607 -1.3211088742055219 -0.24463062495394428 0.52902381398017673 -1.253080394610782 -0.24477869951806672 0.67468432328465955 -1.4217436637021943 -0.24416547667862556 -0.056038820880086083 -1.3514501478443701 -0.24456417301851088 -0.44641247363227088 0.76025815868180291 -0.24537695954563346 -1.2016574026641791 1.1225189437575578 -0.24578119538553725 -0.872813202489092 1.3928873823149193 -0.24639155915197991 -0.28710869699450686 1.351285221082819 -0.24618425333735661 -0.44286226772641429 1.4766153769980459 -0.10342160922617651 0.032150683912408044 1.1419995248033588 -0.10336933433175272 0.93856542038721791 0.75838256076120392 -0.10313265280840736 1.2682220724107465 0.28428365669069111 -0.10285989458928635 1.4497282236701239 0.44838552734001808 -0.10254182651828658 1.4058240602389811 -0.22298259290308711 -0.10253124070495087 1.4600971046175286 -0.053811750272231812 -0.10237239107456911 1.4749289051308263 -0.70348736561668268 -0.10216045166566715 1.2983904728290259 -0.54957892141137976 -0.10216212148348129 1.3701594353981927 -1.1005102833140024 -0.10176624402882573 0.98422449946592871 -0.98058467513856917 -0.10193235883567933 1.1041031245507293 -1.3663724518118463 -0.10133977730543066 0.55808894756871541 -1.2955137875794496 -0.10173395331265965 0.70985752896623544 -1.4581921149715344 -0.10175593727141539 0.2465178805202187 -1.4752758301543738 -0.10109994498801872 -0.052739516886813116 -1.4002576129237325 -0.10117770676812368 -0.47019620519900052 -1.2697422606404158 -0.10135357318823493 -0.75682623467525156 0.49296967058786406 -0.10243030217681022 -1.3938959799299784 0.93527481639980692 -0.10279228493706048 -1.144443408450595 1.2664572256162616 -0.10310538688956143 -0.76091224514772726 1.1692845230348792 -0.102524051744546 -0.89989376384029107 1.4471306756678939 -0.1032468825061973 -0.29368112482711017 1.4040217451102635 -0.10297566327172844 -0.45477775258973702 1.4732823390161682 0.049527854916122521 0.19271326418410203 1.4872916118076347 0.049790485885011102 0.032054794360890392 1.4429193643701252 0.04956192789005763 0.35051232023303325 1.400305243388541 0.050090569355355594 0.50912974862775406 1.3303174523738481 0.049562882156043653 0.65968125848220327 1.2482494944747891 0.049567123005995986 0.80540899534326016 1.1510085187250167 0.049978001525819396 0.94414611612860921 1.0333216145396442 0.049598939529107898 1.0660340303457372 0.76523741165604209 0.050005115454737847 1.2762733747578083 0.61263717332186851 0.049716261495068415 1.3522249078007011 0.28839718279340004 0.050125851928543484 1.4594466158645478 0.45393246500032358 0.049849809527354023 1.4151460045243103 0.11909447790286713 0.049903801797596188 1.4796516616912416 -0.22206524148836648 0.050307000356704962 1.4705612908987686 -0.051562447065244384 0.050108742247347765 1.4855215555615924 -0.38825135317784681 0.050149828874343605 1.4326854745332298 -0.70594108350228635 0.05053895421668695 1.3085321253867255 -0.55097836893289487 0.050423145073365684 1.3808229146640789 -0.84968671437934329 0.050443281667232678 1.2170365011199642 -1.1060833644139336 0.050809314737391725 0.99293207959017393 -0.98548291700950175 0.05078368852757361 1.1135388922674005 -1.2104413026086298 0.050775045642471969 0.85899092725584458 -1.3032899093738344 0.0511942583530961 0.71687783568560515 -1.4272989092002288 0.051121613112419917 0.4076078710971664 -1.4813997165363617 0.051332269533179709 0.095879130244741873 -1.4678365952432024 0.051714543577429432 0.25003269017877822 -1.4729360548444181 0.051520538493049231 -0.19214342244413268 -1.4852314645877356 0.051573293346444546 -0.051548548687834747 -1.4477592252774572 0.051593465826554698 -0.33089589810635628 -1.4095161763340973 0.051923405787496747 -0.47335438416542197 -1.3495621984770803 0.051733309231386561 -0.61740125934002232 -1.1824888531710962 0.051832047287082302 -0.89855016326110893 -1.2780228691706317 0.052182428678005342 -0.7619869520279563 -1.0728482112385931 0.051860849490799131 -1.0258733394576134 -0.81249634351215494 0.051851549048480508 -1.2427340700096885 -0.95244015999000753 0.05237687025409609 -1.1446201669628158 -0.66495789987506648 0.05182002848708217 -1.3273633857136478 -0.51057668406493595 0.052309766924372759 -1.3992434354170542 -0.34498456019273865 0.051684022832148444 -1.4439652178636928 -0.17730255031184877 0.051588312309900193 -1.4742215387226001 -0.0074479044446472886 0.05196651353522596 -1.4890116672851066 0.16346503078141172 0.051336706226055226 -1.4754828168594532 0.33162536189431663 0.051192867020604382 -1.4476459300004878 0.49639838929179436 0.051472461302804536 -1.403433295859069 0.65277595845453784 0.050863575254534263 -1.3332536566474178 0.80188596950147806 0.050692254048971999 -1.2504440979032057 0.94170486081434968 0.050904655517798686 -1.152493850194815 1.065228488831711 0.050343194396922933 -1.0339185148190768 1.2752888185344815 0.050346678326811327 -0.76652539250638452 1.3512956721986737 0.049874290574413109 -0.61455589845904102 1.4574585376221509 0.0498645448136429 -0.29601939721041726 1.4140400447384969 0.049857736747000128 -0.45805453396679413 1.4786342411713871 0.049558387436510455 -0.13150289928344999 1.45270044997166 0.20142099923306953 0.028633710158115465 1.4391326528349773 0.2009111892000443 0.18757848603208341 1.3536236652687959 0.33041166855316706 0.17592006204698643 1.3662352046024291 0.33154051142778085 0.023130292192477191 1.4093198539820155 0.20050068319309516 0.34379732070870705 1.2981896320365556 0.20051004567087138 0.64767268890073071 1.217648870846737 0.32990972395516255 0.61657703801297725 1.2823087723668019 0.33188549832865599 0.47478992944888943 1.3663654385377282 0.20189536518532125 0.49926942885204401 1.2167709631390859 0.20065155686360303 0.79058637049337577 1.1210066578288627 0.2015865062056176 0.92626201805216535 1.139218709260591 0.32970135757336277 0.75157048353600364 1.0056230731069491 0.20034059237031956 1.0455272361475734 0.93692827307485116 0.32970679116541068 0.99244682530744144 1.0473381710880205 0.3319965050358703 0.87988257480682619 0.87948385294902387 0.20076435720082084 1.1544317708304757 0.74207289486747774 0.20147556701683653 1.2500694277845819 0.68654095918918268 0.33192641269335837 1.1829485991559952 0.81677693588277345 0.32977196401506731 1.0935002210030593 0.59294982942879415 0.20032423196889101 1.3238439598885496 0.5448149456871284 0.32963485938696602 1.2513098772611124 0.43724420184915314 0.20093216018774962 1.3839795309022029 0.27548596846677781 0.20150839284550162 1.426930663516929 0.24594695331465985 0.33183494200773644 1.3450346973290606 0.39813808536010598 0.32996335587272435 1.3055393248585569 0.1104483324773507 0.20037323491170567 1.4462393437569514 -0.056324584484347531 0.20116939608614282 1.4504448328890189 -0.22289562143449362 0.20159121897352905 1.4355898245334839 -0.22244894080678382 0.33177288088951945 1.3486443460260293 -0.066213799293057526 0.3302587526652479 1.3633222537632088 -0.54326553781313158 0.20145701675066355 1.346176526736949 -0.69474202990523304 0.20172713635298489 1.2753462010285659 -0.66474205888454152 0.33178495870778146 1.1938128523177001 -0.52288112918948981 0.33060880159289596 1.2608231012432958 -0.96626828292284128 0.20180031527799394 1.0835108530762818 -1.0842116223502594 0.20191210311753913 0.96546233553019256 -1.0283278202575665 0.33186320303625144 0.89901775941486006 -0.91813968076620367 0.33103126822026724 1.0099887757592805 -1.2747925708073686 0.20223221476952102 0.69513372880314683 -1.3444344169963385 0.2021021793847094 0.54598595968369135 -1.2695888012666703 0.33195710722216648 0.50196055006999574 -1.2045675846962201 0.33158978112070314 0.64198607544945796 -1.395615359140328 0.20146683054008638 0.39244620062285063 -1.4469988125073108 0.20195526309660369 0.089696629635801897 -1.3619018555269302 0.33145968749332533 0.073278527413894526 -1.3489573830359167 0.33261421472694291 0.21244214949118242 -1.433242377807012 0.20294393548732395 0.23940318219721837 -1.4498960038292714 0.20257988576474273 -0.051829408517338194 -1.4381826184182585 0.20248108597322484 -0.18644723173923719 -1.3527150985836847 0.33197588035832837 -0.17435876113931925 -1.3631013184834042 0.3320626742255382 -0.054960576478046426 -1.4144718084578738 0.20254281815651753 -0.3193201095474662 -1.3774396445580952 0.20299545455305867 -0.45634237825290996 -1.298971281921192 0.33247939430639772 -0.41618112807412438 -1.3324142074825471 0.3322773906144853 -0.29190739537382393 -1.3210461187436613 0.2021961195423802 -0.59600251242758073 -1.1850721897717338 0.33420131437154016 -0.67967774260131852 -1.2490771028368512 0.33175657818877496 -0.54626057171492592 -1.1590549982357161 0.20276781043510539 -0.87055663135895667 -1.2518075905429566 0.20366928949221211 -0.73704532054727245 -1.0530198859278097 0.20272068513724473 -0.99589048212737619 -0.93552373137811162 0.20413528238925208 -1.1120606065571941 -0.89056508169309878 0.33406012840994037 -1.0347125230212728 -1.0012440871298793 0.3326407332685179 -0.92536912698865326 -0.79991266815622042 0.20275101844736049 -1.208534429380496 -0.65632106263578149 0.20289690428423557 -1.2924035897776731 -0.50503958158585682 0.20394392579326687 -1.36217131529126 -0.48884882698068244 0.33392569394641813 -1.2742564031109369 -0.6309844843806599 0.33299258352085354 -1.2086664351523948 -0.34460007451149705 0.20258855482805649 -1.4076661053787038 -0.18089887142985572 0.20283503955897469 -1.4384312780531097 -0.014584283525662118 0.20356899300366504 -1.4524949447894135 -0.028959222711065078 0.33356650460276061 -1.3643710304510142 -0.18496978835666236 0.33303852256712524 -1.3510769003522136 0.15162561535584249 0.20222555319701732 -1.4413984768901065 0.31610222319689307 0.2025787249480408 -1.4153093534103192 0.47735336023955288 0.20304074802192021 -1.3717781809214655 0.43394861206572766 0.33298566858104511 -1.2938618239164437 0.28288509168286113 0.33283569431906285 -1.3344474686663577 0.63010204853099949 0.20170455710241567 -1.3055058686391472 0.77628615223106634 0.20218545298372945 -1.2255369588953489 0.91314448842882112 0.20246208230306234 -1.1294804621301444 0.84609558030497911 0.33227191781444043 -1.0709411980446257 0.71764428370717959 0.33244954862424098 -1.1607425865233401 1.1455360226360805 0.20174982238989 -0.89104345449996913 1.2412836848228854 0.20187859371284428 -0.75415286132487658 1.1594920156624771 0.33157518885760123 -0.72044450739074806 1.0690257169015884 0.33196226816208774 -0.84919166262325141 1.3793749117242724 0.20141539926863494 -0.45318471531737237 1.4221331398116497 0.20135635215113307 -0.29378089474909441 1.3351407720259278 0.33098079226202448 -0.28506872960590679 1.2942723135346368 0.33153208771487741 -0.43615623909092899 1.2333824460577285 0.42449502602165928 0.15997755011677528 1.244065155168582 0.42577011403195297 0.016036581846259772 1.2060745550785288 0.42423596546964132 0.30153503286463934 1.1045755624945945 0.42434879888627253 0.57207399369453937 1.1642564953064958 0.42564756328839931 0.43950591829157537 1.0297431478698487 0.4241079161737788 0.69684931277461148 0.9424863142320653 0.4254863268426089 0.81277401149215101 0.72822757502447821 0.4240677594808685 1.0078436270561424 0.47816868478205687 0.42429620598833645 1.1484504056775209 0.60777595083582792 0.42547820352269783 1.0860673804584131 0.34306290850287169 0.42410076501632554 1.195157367177913 0.06274794067304805 0.42429436863190395 1.2421894405296725 0.20463182193661025 0.42568061569023852 1.2276993829158713 -0.079947363371840899 0.42417665725645143 1.2408613667612254 -0.35958542854299136 0.42433548722599651 1.1903692847974288 -0.2212458126902179 0.42597261577815748 1.2249023075423939 -0.62213454142074975 0.42626406125979105 1.0780774801043025 -0.49401898151511164 0.42432792169116273 1.1410066364225571 -0.74040788447195904 0.42443379843536988 0.99864829307156289 -0.9490966828986086 0.42628237797117996 0.80448514725086151 -0.8502299402868001 0.42456281574471816 0.90697783108585994 -1.0333228834904111 0.42464835837733494 0.69033260008901465 -1.1636139942405281 0.42631763970811964 0.43852004740581929 -1.1056900203776507 0.42488961634585176 0.56777628060840579 -1.2039474841191415 0.42495572730898712 0.30532854666246634 -1.232050295491268 0.42551939185283377 -0.15768231553625703 -1.2404287127032596 0.42537409208827709 -0.064405160250946419 -1.1893507017299454 0.42556216779317224 -0.35631961328090883 -1.2169579679247957 0.42627584035157479 -0.24916133615835795 -1.0884535493974854 0.42682141242179739 -0.59792235028671881 -1.0135586386893003 0.4258505848640825 -0.71543256393236998 -0.82529753697501762 0.42677864553973155 -0.92723823072865175 -0.92646477666012406 0.42666218465116595 -0.8263165495428012 -0.71360929862105682 0.42607025048680702 -1.014435594435535 -0.59345860355698699 0.42702193943196098 -1.0902056278749315 -0.32834604651038229 0.42611027348003228 -1.1959949861159256 -0.18921021234288871 0.427131715881232 -1.2268776071270253 0.095982928846893439 0.42594878000872838 -1.2368062386436929 0.23698957949218655 0.42706689254663155 -1.2189968134088096 0.50827507314829201 0.42561684426052027 -1.1322389058664779 0.75353826332194485 0.4255079757330455 -0.98749963903399662 0.63508997048747717 0.42687531347741053 -1.0679493477129873 0.86220890270725314 0.42518444520431808 -0.89368808201548755 1.045565806686436 0.42505878197487157 -0.6717817463187401 0.9606688895384019 0.42653629740248922 -0.78918410606951273 1.1165588839205449 0.4247537984287435 -0.54494650815707313 1.2134194318177869 0.4247205318056172 -0.27133648137826255 1.1737421776647188 0.42608440878252518 -0.41156141682580755 1.2362808438667841 0.42442662350564547 -0.12802495862554014 1.091943090977417 0.47924992543523465 0.14148980702366243 1.0669966472644909 0.47909017608828325 0.27153212233636798 0.90206302029157193 0.47902510800257114 0.63167674733831369 0.62506497398312155 0.47900885945786864 0.90679188589747084 0.28010778931516855 0.47901752379241436 1.0650755719284273 -0.09350090007906664 0.47904172567799769 1.0971860721993292 -0.45799006767917133 0.47908182060108206 1.0012098796627451 -0.76914268498282912 0.47915691331303306 0.78731510647728919 -0.92774582183236354 0.47936119262789162 0.59206279491929348 -0.98907563064022708 0.47927599301065082 0.4817067302221153 -1.0731281896179583 0.47946777948204666 0.24134723945029346 -1.0996735967493496 0.48015792915523109 0.0009015036535059591 -1.0930775546825184 0.47942080858444502 0.11869547598978648 -1.0949310158550432 0.47943833637849831 -0.096490151345206374 -1.0921539979386747 0.47952887250892168 -0.12304341358371522 -1.0644639381143495 0.47952273064353707 -0.27261378472902126 -0.9781203197774706 0.47972571592892088 -0.49986839748547968 -0.91335347136998701 0.47970449074670646 -0.6096199248187778 -0.74892758438127371 0.47982992713891626 -0.80276422279204807 -0.652351657955759 0.4798127743665202 -0.88277087005372146 -0.43391496407599817 0.47985883702633991 -1.008137877469591 -0.19111272644783001 0.48051147985339265 -1.0811693068132968 -0.31506482095762423 0.4798584960961339 -1.0513466303943839 -0.065484507974572684 0.47982619612588118 -1.0956899581375286 0.060434703725821222 0.47982370650689593 -1.0961435991941149 0.30840327398668416 0.47971205687518109 -1.0538941155226922 0.42648348161894067 0.47973658901972488 -1.0122844332177712 0.64613013286551713 0.47954457339167983 -0.8887668953058141 0.74427641105394382 0.47960187985545799 -0.80903013433635484 0.91237606503719348 0.47938644531684482 -0.61379305750554702 1.0323946252234597 0.47994277157809001 -0.38092075856627278 0.97892832497833504 0.47942063180124728 -0.50175071963491436 1.0706305762963568 0.4792892329474514 -0.25412201401779144 1.0935723947140261 0.47923535153864633 -0.12369874348542635 0.94025428631336305 0.49023022514710063 0.12149795314765467 0.94812608630091588 0.48971275265466624 0.0017835820106502664 0.91667667480073667 0.49025727512388656 0.23939293584558019 0.82864453241342484 0.48998050378627744 0.46142775483912507 0.87994266947561595 0.49017631184327937 0.35374038977415045 0.7642882850596816 0.4903116090330763 0.56070002073612002 0.68923404510144048 0.49031998577391461 0.65103720674045695 0.51446800037012419 0.49032840197010819 0.79676256463788231 0.60508979854988099 0.48989830776065307 0.73067957640498937 0.41762554041384092 0.49032639657975519 0.85098170818909324 0.21440260436729183 0.49032026466051809 0.92369953818140516 0.31704982877150439 0.4899186558363956 0.89411294120683527 0.10832896662394358 0.49031249775164976 0.94182001610526489 0.0010991268758036646 0.4898129975703201 0.94868993057224915 -0.10537650549880991 0.49029668885569522 0.94199884307976822 -0.21212309285814893 0.49028339103718493 0.92411915564097824 -0.31669823902071154 0.48986879586464671 0.89394862793322705 -0.4174549585090373 0.49025576758767631 0.85067095552973782 -0.51394677102670716 0.49023481086861659 0.79655532439773591 -0.60266467094200404 0.48981924205422867 0.73189426065861096 -0.68047923126864218 0.49019017544754051 0.65887261148076937 -0.81077818843235228 0.48986967416171434 0.4904466755225575 -0.75072876944478351 0.49015375611759676 0.5786869330124027 -0.86202464863939554 0.49009299257588851 0.39117816159168095 -0.90392086345796818 0.49004812585085394 0.28295031035580243 -0.93242988097155755 0.48951433818189383 0.16622543842356521 -0.94536584445641714 0.48995434941151395 0.047218532743218154 -0.93998137485006006 0.48988662838314595 -0.10487294510857188 -0.90602193552258159 0.48981184951626316 -0.27053718545145111 -0.86082883493986606 0.48975493242133006 -0.38973639615996686 -0.73746905903429982 0.48942102376939212 -0.59122591113601219 -0.80428710579626184 0.48955089090322429 -0.49693318919562796 -0.66280849248920559 0.48963170799350714 -0.67258842089942528 -0.49617324438707139 0.48942225667110145 -0.804032778800857 -0.58259232690488816 0.48949319401025876 -0.7439563280694188 -0.39997605579214662 0.48957124173045213 -0.85503843992532669 -0.19156358941442936 0.48941186275523152 -0.92510930030038174 -0.29790523656261109 0.48938870066562051 -0.89649398069693764 -0.082258640362506685 0.48958304405823633 -0.9404336025641884 0.13357291763796297 0.48951120108581381 -0.9355831271363555 0.02680966782967574 0.48942855053602446 -0.9445079242342298 0.23929714165749105 0.48966651483684948 -0.91363928810084083 0.34172989077308402 0.48944257257735463 -0.88148852838972958 0.53189716985759417 0.48980194459109361 -0.78133998391723525 0.69810464755736312 0.48990525882273356 -0.63922921293466617 0.61848107946531816 0.48951366530903601 -0.71607885799887949 0.76907525749254468 0.48996280176279816 -0.55081828541970368 0.88095376381230173 0.48989042365941704 -0.34818406875066454 0.83112019094283107 0.48979399126141099 -0.4539090772749162 0.91714863946933112 0.49011646687215432 -0.23490692203609642 0.94024201118703266 0.49015973266595275 -0.11758747395180814 0.78988599902872059 0.455369096539188 0.1021698960953684 0.66153645704100272 0.36865838228408854 0.085917309313606582 0.7339433194947057 0.45559727485503326 0.30984549903317138 0.68640314256544332 0.45496215122864303 0.40606522587574728 0.62627234502736639 0.45535541051855455 0.492963553657154 0.56068617378315899 0.36890385818125254 0.36191484515514194 0.55774269637772866 0.4561664807066374 0.56934826954955509 0.43272353748654246 0.36830227486940942 0.50910984416125393 0.50163016801645666 0.36860382184597051 0.44083847771339318 0.48099116725221491 0.45571316931919642 0.63530683394655107 0.40000262355551114 0.45480906789089476 0.69036972262203911 0.36194285798561465 0.36894956985690885 0.56074975705866836 0.31903438548143503 0.4559321104172766 0.73020940041050353 0.23444068952944536 0.45570683619032637 0.76155954374310575 0.14762811005012058 0.45502399056578374 0.783767321437288 0.22584659053708941 0.36825138670917301 0.62887574403515445 0.061793166763173299 0.45614279003458058 0.79457635679593619 0.0019942089982405323 0.368164044635518 0.6681395910023028 0.089684921526086051 0.36879325744468816 0.66140871806154 -0.027632883528948018 0.45537677180664776 0.79641825867301308 -0.11484507318993477 0.45526826313647489 0.78862610041915737 -0.11161472358395565 0.3681867113886052 0.65858285206425748 -0.2893015457042305 0.45506195152595463 0.74264223674559215 -0.37704899972226646 0.45515546027960463 0.70187917607449302 -0.24540081030325264 0.36850319562473438 0.62072174714732209 -0.33968358504697654 0.36811319147526472 0.57481376560033148 -0.53533440056347426 0.45516793265388855 0.58965120139917704 -0.5953826057316296 0.4549172323404273 0.52907441335067817 -0.43720641183383968 0.36813324719715035 0.50427025583645313 -0.64231179583565123 0.45549428810419207 0.47041834308894953 -0.68753873696725609 0.45435162192957862 0.40285655531680242 -0.73248617941850924 0.45506992033439003 0.31111002809484167 -0.65489094746079091 0.36756094267975165 0.12477989996606745 -0.65788281265873239 0.3672866695401818 -0.10421703978103726 -0.75193752544624259 0.45367282787044261 -0.25863547923421865 -0.69562421648760608 0.45349961702879182 -0.38462140148656693 -0.59606450210294548 0.36756880130439334 -0.29498174524348564 -0.63070698773717759 0.45381359188454046 -0.48262278497713368 -0.51166392449876408 0.36655340915072471 -0.42581734682553601 -0.50880389932777037 0.45285287705871857 -0.61062522180834888 -0.3734236263959585 0.45335882202375216 -0.70061431616713776 -0.28482825258609717 0.45305938263180173 -0.74143434920920481 -0.18852701253711598 0.45388026650067237 -0.77104284608217155 -0.093392495885038049 0.45375722318294359 -0.78824168460404409 -0.0028239588318294474 0.45282033239008146 -0.79476271402335219 -0.079639549602350451 0.36710797836229681 -0.65976532224251883 0.085256080663452485 0.45405531307464453 -0.78939967932418742 0.097191772204400867 0.36694436361336552 -0.657984986964674 0.041664877149227439 0.36728708659995329 -0.66335594735283876 0.0055098275590783237 0.36652593656388588 -0.6653803503023441 0.17219360904116501 0.45374643216659399 -0.77521283346327952 0.25752405281504887 0.45342036345883507 -0.75184547182557282 0.32380708001725977 0.36706858082302846 -0.58180012849217955 0.25472063980297333 0.36733625156827843 -0.61445621078895762 0.41857594446724922 0.45387072194652256 -0.6756565843185961 0.49197592254223094 0.45400522453375253 -0.6245057846863753 0.49076000030037348 0.36780901043445968 -0.45003295839299595 0.43022815275141085 0.36704969070893684 -0.50896405561276814 0.62506482289860776 0.45430890863915541 -0.49196790509472133 0.68249147200331695 0.45421958563817849 -0.40972157022095979 0.72987457871462402 0.45512411755678511 -0.31690298483882773 0.59577874802050579 0.36830035916590131 -0.29817523986568489 0.76589339822362235 0.45548476722258707 -0.21698769184937686 0.63327420771974463 0.36812514686734166 -0.20870199144280588 0.78825199379285038 0.45491221131165177 -0.11303065807443918 0.79713505818075625 0.45456997925291986 -0.0056369269388344013 0.66721874383570967 0.36823049304087407 -0.013654306919592235 0.65785910602690811 0.36779720762033252 -0.11322480554145888 0.56834169064183193 0.24634551488972942 0.073964925175214677 0.5477882829483276 0.24648797083419721 0.16844613986888365 0.51153140352507254 0.24659624180086429 0.25835944900653279 0.45997040164876474 0.24666321941338687 0.34180564681243736 0.39272233527729555 0.24667138358484328 0.41739946337643308 0.037966955296002858 0.24656619302876112 0.57163924236533392 -0.15782463154704665 0.24640331196941015 0.55057619476189879 -0.41996536261539474 0.24594610295921532 0.38947361383977785 -0.51693375837974209 0.24571771998522179 0.24538962742278819 -0.56592829888840235 0.24484144170261951 0.090064967327075349 -0.5183950763157007 0.24472144800305914 -0.24068777486696782 -0.42883833750821293 0.24406460275243563 -0.37882915922457716 -0.29626000656914964 0.24384102965769036 -0.48956789122152766 -0.15934368777625268 0.24433559239700972 -0.54874438223800415 0.011645599898732317 0.24398986945775708 -0.57222055246168202 0.19401161845867804 0.24403661605897145 -0.53924894115784383 0.41683574798095668 0.24539624918716507 -0.39208570256232167 0.51455287713158293 0.10298109872666554 0.067794496840466373 0.44963843047935803 0.10285902602351675 0.26179070089021333 0.29620964199366379 0.10318735069544452 0.42561824458483677 -0.1394297998608714 0.10276139066614534 0.49938944417869152 -0.46957195166360977 0.10203921788870995 0.21944209769053435 -0.47240693520403204 0.10126105158247949 -0.21299787678656457 -0.28153062841674836 0.1010107462957571 -0.43537016750899299 -0.14799191702418646 0.10109480374113292 -0.49675315639912893 0.002283922378562884 0.100981666322683 -0.51988657403899563 0.15440352422737019 0.10152768692207055 -0.49512385342847748 0.29348925511592072 0.10194481266766163 -0.42722252460822208 0.39772530955748808 0.10192154612366419 -0.33525329578643587 0.46228967080262451 0.10248545253529741 -0.23526840322994472 0.5006166826259133 0.10276074318882386 -0.13484926055175339 0.51753127472129945 0.10289744113638168 -0.033560360588672226 0.50389439161181027 -0.050121364246387995 0.069435120680247736 0.48019541518184755 -0.049946565106599505 0.17062604968162978 0.43363877583896077 -0.050045644174904494 0.26639534534816972 0.36461637167207517 -0.050177333318512971 0.35386183415416989 0.27150096400620111 -0.050227390337275156 0.43010777452117183 0.14826342484354557 -0.050382299133883229 0.48627654447483892 0.0052749475911514155 -0.050382859011864893 0.50956026564970935 -0.13943566107852784 -0.050759740940774949 0.48871962381593881 -0.38246424529276446 -0.051080021489011029 0.33626648992146485 -0.46055872428655648 -0.051396408241788254 0.21502681983138899 -0.50350015884629862 -0.051452556763538854 0.076970840256628148 -0.50430542801650413 -0.051664439942082793 -0.068244744836278098 -0.46420289852770963 -0.051760317273965725 -0.20738255792899679 -0.38814722806054741 -0.051566177094796051 -0.33071939033112552 -0.27918585061456092 -0.051682573521873068 -0.42507870294449518 -0.14894409957467819 -0.051535603546442779 -0.48633073974394353 -0.0048028819411548903 -0.051157940533021258 -0.50975573286710285 0.13944270117336247 -0.051101986338756511 -0.48878794909252238 0.2718665969325077 -0.050819125295337338 -0.42999489590098317 0.37688151147524757 -0.05059009561318073 -0.3417123734855827 0.44747018122116244 -0.050353103235360797 -0.2426056254647545 0.4885093072318496 -0.050315873958304905 -0.13988068626869474 0.50692971715107382 -0.050221849894018303 -0.034975824068242956 0.53795938107249808 -0.20117678771812342 0.076265629278898919 0.62366756489941366 -0.3309150487578309 0.087472977472258753 0.51582832316871408 -0.20116634100497019 0.17116192170125108 0.60296600671043754 -0.33132625249728531 0.18070871069321909 0.47651750456679343 -0.20115228079131439 0.26187074993044118 0.41941797274331999 -0.20107563882741572 0.34681422245623467 0.46384490377796811 -0.33133187179688905 0.42597225038959946 0.34049977989205182 -0.20129372705677862 0.42401663442296778 0.33294081919568369 -0.33129517906509048 0.53494821010854587 0.39790796019874997 -0.33090834397395991 0.48914366215679561 0.21889379273808238 -0.33089623345161751 0.59184861529514288 0.15485213452211721 -0.20177795454592026 0.520619890865752 0.14492082915152193 -0.33188659431155898 0.61294201049404762 0.0084728732978996187 -0.20161706667084944 0.54418466836833768 -0.21891701055321686 -0.33139402968954446 0.59220339460194327 -0.28784554400319579 -0.20213207653758625 0.46156707900482796 -0.32924727166711937 -0.3319350092505623 0.5380543758834333 -0.402324644333791 -0.20234175317428976 0.36606634623211237 -0.48971852819369349 -0.20272698045329213 0.23604123358367407 -0.62137196734287858 -0.33180894201991301 0.11326113666797941 -0.53787310592806048 -0.20235596557791252 0.086258048258920084 -0.5392402371140832 -0.20255349013182661 -0.072139646403430402 -0.62496009057948476 -0.3323603663104861 -0.083737391252611829 -0.41146285743891664 -0.20215995888311619 -0.35675699490777302 -0.47894583553144815 -0.33143518038447861 -0.41096831856756966 -0.29261459091058761 -0.20220173138425748 -0.45828432942109709 -0.30383879289849797 -0.3313147560315774 -0.55254523000477462 -0.15817009903596352 -0.20208167228908441 -0.5199404345967672 -0.0063629378437148037 -0.20157121478648166 -0.54433861515287663 0.1488963171498611 -0.2018343070255596 -0.52225454260991278 0.11591733332434512 -0.33056663124245578 -0.61980414298729725 0.29958901951650829 -0.3307601861703296 -0.55411940359520406 0.21792838475904547 -0.33034338652088202 -0.59189276783610212 0.27854383684785156 -0.20125958613657019 -0.46737127712214371 0.46780131891965698 -0.33079814463709412 -0.42151329328483778 0.4172289079571081 -0.3306708525291292 -0.47196576885565056 0.49917112844064404 -0.20135678326225687 -0.21361293679121529 0.56358384665597294 -0.33122499619745238 -0.28002543828604098 0.53013163626107551 -0.2012522286599783 -0.11800363002416471 0.59877777983319136 -0.33079631272520821 -0.19497678308659552 0.54282614974780963 -0.20120036936989066 -0.02081874470196577 0.63030295074814602 -0.33047260341917728 -0.0082556700672064588 0.62187705300077867 -0.33035931122259726 -0.10369665875895434 0.75248402411292992 -0.42443633206059433 0.00053935206971094133 0.72338815965212477 -0.42560836455550466 0.20352373959366354 0.68933046926362063 -0.42566346754031581 0.29991908856080596 0.58559691318301932 -0.42512611458043703 0.47247864013081087 0.64278222182282085 -0.42516264383757668 0.39090445549624764 0.51918335276962801 -0.42581716296598127 0.54391767728570939 0.44707185245977216 -0.42587617347831969 0.60475198251189433 0.2911058510081993 -0.42591942774438124 0.69386113827203932 0.3699310583419938 -0.42507051060703971 0.65570797517710999 0.2089084371577683 -0.42603816710642844 0.72260868338005313 0.035764133118021534 -0.42608936005450149 0.75187574198632223 0.12199717212581582 -0.4252843464049631 0.74312723353050014 -0.12500153114390766 -0.42535869181199798 0.74297562499628977 -0.046271403122789094 -0.42621190515058505 0.75114002164524463 -0.20159969840680592 -0.4263169598385545 0.7249974254715329 -0.37051046212013683 -0.42557475340095741 0.6562672846979466 -0.45466748585702554 -0.42645307456610265 0.60048381648180937 -0.52943900001705202 -0.42653989333733661 0.53518651993529376 -0.6470650793611552 -0.42587009562416867 0.38662692392574644 -0.60912469746656894 -0.42658473636519789 0.44266924160839871 -0.5862967362097169 -0.42593135190416287 0.4735732200262518 -0.69377979861961436 -0.42658576757397065 0.29363107632819424 -0.73327172435567467 -0.4266046608903164 0.17237774434726905 -0.75371751952373445 -0.42575531267750955 0.0090020154026958128 -0.72624366563615972 -0.42644030198782129 -0.19765928151879233 -0.52469188547272427 -0.42608829754127564 -0.53898080157125183 -0.43555120676187131 -0.42597532765190899 -0.61299927262328846 -0.46980995888221277 -0.42549862841014641 -0.58814351917758845 -0.37396768862676433 -0.42490092235320975 -0.65354670462755349 -0.18411164833680779 -0.42571909073635833 -0.72876067603889505 -0.0011094857058088475 -0.42451993698309315 -0.75255925969956405 -0.088842157277280162 -0.4256444647939992 -0.74656676591378845 0.079196154029182828 -0.42553359343354391 -0.74724465938132423 0.31636453412252891 -0.42543237998998557 -0.68128165272559371 0.53264962193000265 -0.42539478971830641 -0.52956123792477383 0.64680525623185148 -0.42458586359410483 -0.38365995550905257 0.69109292967668212 -0.42540576463826413 -0.29523100771038002 0.72393586051726555 -0.4254509391218127 -0.2005729551330063 0.89492160391080788 -0.4792234730402129 0.0071664151417554387 0.86421183712470029 -0.47981140320429777 0.23306203439617337 0.77798814370467884 -0.4792751288906093 0.44319672113188996 0.71611517884011611 -0.47976429511295399 0.53740329709649648 0.64429214546830604 -0.47984096337771487 0.62175894609370741 0.38376438652315931 -0.47994389772509033 0.80939724568342897 0.085723416843843533 -0.47999840248470532 0.89194489526258713 -0.21653001049403245 -0.48002821230413495 0.86976580019453387 -0.41135618375082778 -0.47998523806783155 0.79675979818195342 -0.50196685536264229 -0.48009458454472576 0.74294740074177712 -0.65900217225481361 -0.48003705975400696 0.60843808112847975 -0.77519792759601636 -0.47959004088984003 0.45150376804073739 -0.720409213935986 -0.48009576247537972 0.5341654406541213 -0.82259901146145298 -0.48010923427063901 0.35741287804652594 -0.86139855171940161 -0.48013099486787914 0.24974503156826586 -0.89696202854387375 -0.4795837367664692 0.0045459427050089296 -0.86372256452979501 -0.48010240540363008 -0.24051898120061413 -0.82189632377115596 -0.48001010514406056 -0.35774579523000988 -0.62870675178759039 -0.47997644789699068 -0.63830410087892486 -0.38538385870553382 -0.47987922685418538 -0.80828432303249642 -0.08162962510195293 -0.47980905457351936 -0.89135115407129428 0.22223240362822835 -0.47973098825674854 -0.86669674165989574 0.41234520476965869 -0.47959056796173 -0.79411765533306133 0.50170981566527217 -0.47968671429252763 -0.74063370512184024 0.72877631213911132 -0.47971457066884327 -0.51888751441686765 0.86776657104489141 -0.47970679479292316 -0.2177716399935902 0.88841018710519892 -0.47965704600191039 -0.10650805655806841 1.0383432942017723 -0.48992463078530363 0.140711774656642 1.0476174548448101 -0.49029180741288769 0.013576234464725979 1.0131322152526927 -0.48982081229352559 0.26491372411915853 0.92045733046370659 -0.49005792128719583 0.50108834759663956 0.97434117223468952 -0.49004444212499559 0.38569785891007136 0.85308723680394272 -0.48975863136124448 0.60790109538668835 0.68461818469242663 -0.49015085745925474 0.79397281995405999 0.77480315297050129 -0.48981467027881842 0.70616868308982894 0.58611200216936665 -0.4896987246638283 0.86871019798452831 0.36870805859489458 -0.49013486737657253 0.98176499542617668 0.48081693968673472 -0.48968957349432551 0.93194582153358407 0.25321834319824071 -0.48963748648672406 1.0172167077252945 0.014372496827186687 -0.49002487120874255 1.0488897007327045 0.13502198193233783 -0.48963603927850768 1.0402927736439331 -0.10507025892509191 -0.48957102404141173 1.0432381514376208 -0.34010877622443869 -0.48989040956619029 0.99262413897815516 -0.22328632888939118 -0.48964118944342416 1.025217489721129 -0.45156029797557007 -0.48950397958999126 0.94661426934270265 -0.65699139652565031 -0.48979384132068732 0.8184988753539536 -0.55776690152016883 -0.48961857073489318 0.88904744915831291 -0.74545325978760735 -0.4894486750560969 0.738110730818753 -0.89362106128788843 -0.48966394808142916 0.55083880062583002 -0.82476618495033183 -0.48964351691815683 0.64935332766892317 -0.950419907130996 -0.48942027124750415 0.44439115262504997 -1.0284547236898987 -0.48967926128611655 0.21046405560887382 -0.99632879459338575 -0.48966071615048895 0.33072520019771046 -1.0453709108496831 -0.4894297459745896 0.088798341726753688 -1.0490706630504516 -0.48960045552192916 -0.036673036249118024 -1.0217339455391505 -0.48947426458322774 -0.23951904485696421 -0.98677082480412981 -0.49009622334697717 -0.35797553553109884 -0.93698363036562937 -0.48952578496420096 -0.4719546629379574 -0.87472930718753927 -0.4895561718849476 -0.57876043517508746 -0.71735426703105776 -0.48962083916004256 -0.76499133489499727 -0.80133380790245512 -0.49015103147775013 -0.67725615145273554 -0.62547829509810038 -0.48965390520615187 -0.84141998376200999 -0.52629856243000395 -0.49026461724981912 -0.90713167635823144 -0.41824430704671645 -0.48971693951486361 -0.96097136970080943 -0.30493789728362064 -0.489748412768507 -1.0027824959228451 -0.18720183124730283 -0.49031451599969239 -1.0313923144173303 -0.066489009440958396 -0.48980029246393414 -1.0454581797585349 0.053951323497165179 -0.48982434798770097 -1.046433269624423 0.17332719210240125 -0.49033713197176571 -1.0334129760360744 0.290628270642871 -0.48985885579698873 -1.006044334929459 0.51248503674731549 -0.49032321855351163 -0.91367674257557141 0.40401189860884595 -0.48988109109075217 -0.96670276730550586 0.61465928578147677 -0.48988925525108562 -0.84755654099725852 0.7948617754078946 -0.49035272337714675 -0.68229948524916006 0.70936178057562826 -0.48990769013080654 -0.77095116608044512 0.86980652026023786 -0.48989519429101802 -0.58283179424905518 0.93340651676851183 -0.48989525639981313 -0.47524728474032563 0.98398906924503871 -0.49047005815338046 -0.35996723108776785 1.0199999949683896 -0.48987918364492217 -0.23815507659878019 1.0410194319217345 -0.48987119323193667 -0.11318724910584686 1.1985936159525903 -0.45593026747371385 0.01989283787841312 1.1874775581923449 -0.4552172970899081 0.15913952144623777 1.3161462119693197 -0.36831913968900676 0.17493580436842962 1.3283303989420998 -0.36894245842003898 0.024983168070277909 1.119156790772732 -0.45575169481439487 0.43002857355142532 1.060738328347945 -0.45510122447812651 0.55759689663537559 1.1818697852313906 -0.36799633667506232 0.60509954635502461 1.2444901685709737 -0.36916272013973628 0.46670060255868628 0.90232823959162156 -0.45550479536206451 0.78964079474794846 0.80359373011579072 -0.45502155618216672 0.88939400374311262 0.90652307806033627 -0.36780120654127901 0.97036228853754203 1.0136026246885104 -0.36917671741484043 0.86038269072689177 0.78791131702580841 -0.36753947297745332 1.0689342031129012 0.57626064615461225 -0.45530498401366426 1.0516983675430991 0.45065593708874646 -0.45487322281665299 1.1109833748485396 0.52244590563091753 -0.36762051389197553 1.221031448601045 0.6603264596729066 -0.36910763908349431 1.1542925053162565 0.37779397493817807 -0.36744889884126863 1.2732890739389151 0.18430397345717742 -0.45518897837320821 1.1853182295779665 0.047156533218041502 -0.4546105859309561 1.1981832555003444 0.077662396071148776 -0.36739032850250741 1.3260452727966701 0.22929503283755176 -0.36905844336153776 1.3102852970744774 -0.22768303295705677 -0.36883528412317457 1.3107602758996957 -0.075662150804269218 -0.36736348508121641 1.3262604209532745 -0.22739560032520989 -0.45511436528016153 1.1782779132177237 -0.36063409396162144 -0.45430604729765017 1.1438296313968228 -0.37540096698566167 -0.3671245680097957 1.2744305817111188 -0.48916633668973369 -0.4535049733044213 1.0952768511430506 -0.65760757694121919 -0.36849714800506234 1.1565643953410134 -0.51975224907205431 -0.36727755393825667 1.2228516919104366 -0.61283789539902389 -0.45503436267611891 1.0322795073658275 -0.726485597783745 -0.45401775620012669 0.95455333574238499 -0.83074885463287129 -0.45344886176804866 0.86555446963882554 -1.0095418260156472 -0.36815929668122727 0.86658873969879724 -0.90259333303949907 -0.36720830823825623 0.97554215899602215 -1.0057544811660637 -0.45374071251228437 0.65408341731674058 -0.92551061928453648 -0.45506491595921089 0.76524174862039396 -1.0736733333973216 -0.45350288068726208 0.53550092357596557 -1.2415229509459116 -0.36777554138077706 0.4779579215127156 -1.1784134697408051 -0.36721617567215342 0.61526514947645294 -1.1667774331395537 -0.45348615165589762 0.27970362767131812 -1.1292331508386058 -0.45522655293502584 0.40980836467696297 -1.1902760014663591 -0.45382687842822855 0.15093821025365123 -1.1999176895667052 -0.45449091249993018 0.029379792951007181 -1.3279166499144086 -0.36707546937607932 0.06165631705478522 -1.315465891757569 -0.36751995039306085 0.19638821145088137 -1.1976003821950791 -0.45354810243785482 -0.071992615290812467 -1.1895420425480139 -0.45400597782607982 -0.15626344995068356 -1.3180603491050367 -0.36714740672586677 -0.17310298562823373 -1.3279237531364265 -0.36708355762033396 -0.061436864281448511 -1.1759763341050764 -0.45450855708783744 -0.23947713615559879 -1.1505181706389001 -0.45358505330893389 -0.33982269744728916 -1.2665942667396326 -0.36726665199283726 -0.40383157942005937 -1.2986646658772516 -0.3672277121042733 -0.28436573239953084 -1.1098734103836798 -0.45422341394697224 -0.45532857147319178 -1.0536184449858419 -0.45470845153960027 -0.57424797045443277 -1.1554544983825445 -0.36842004382793841 -0.66026017825597771 -1.2182935989167685 -0.36681706034131095 -0.53115078054014109 -0.8967174691245452 -0.45475516871861116 -0.79683202363529626 -0.79974776344505294 -0.45474407434427627 -0.89382508162504049 -0.86899026127246137 -0.36823291579790007 -1.0069851174754141 -0.97728809639393133 -0.36731335763369144 -0.90062593103608402 -0.57574218431117874 -0.4551521583130469 -1.0521902745328537 -0.45124757928817233 -0.45485720596279983 -1.1107264559537211 -0.47811928832019385 -0.36825416329787586 -1.2406599367873481 -0.61716238031831727 -0.36763962686865365 -1.1768322947656207 -0.18566103979247725 -0.45549658613992883 -1.1847391331633734 -0.048293968760776275 -0.45499236478808852 -1.1975123734900461 -0.030131576474252932 -0.3683180204742329 -1.328814428359677 -0.18300834683785011 -0.36794526115292409 -1.3159996864098484 0.089190948095387163 -0.45413351604595859 -1.1952195231814076 0.22635021083739648 -0.45579344157991158 -1.1775097810312403 0.3596963627588235 -0.45506644174222172 -1.142907134188698 0.42107236868120768 -0.36841759288424875 -1.2601986812947412 0.27291774534266511 -0.36822848228164057 -1.3001882478366904 0.48833606183618561 -0.45439449054201642 -1.09420086289439 0.61190306118400151 -0.45601985535252354 -1.0311402809080401 0.72622964483121399 -0.45510478525228248 -0.95275413932485242 0.82322151048931325 -0.36849404729401125 -1.0424741764698695 0.69713023302769439 -0.36846404982254449 -1.1308167106208888 0.83152966724852029 -0.45453139869226311 -0.86249116264425441 0.92716153202127494 -0.45610978108215705 -0.7601680910724139 1.0086637941297525 -0.45517783059054173 -0.64619249647349408 1.1286398667854467 -0.36855484015337736 -0.70000249996351471 1.0399920066229678 -0.36863027994244757 -0.82641295492629019 1.0773408436858334 -0.45452038508998333 -0.5240484355588213 1.132173768480115 -0.45605601037501597 -0.39405794138978273 1.1697035262844315 -0.45526159705485636 -0.25855272199658252 1.2990440253911355 -0.36854580295420886 -0.27535964846725725 1.2590911688732518 -0.36874440525883062 -0.42332462705225227 1.192084146184234 -0.45440838745066287 -0.12032515395915712 1.4092852793183561 -0.24577268775347877 0.18611627944220763 1.4223393225733434 -0.24673032180769289 0.029647716478447061 1.3793361365408159 -0.2454989747823213 0.33996726677025557 1.2695617916755206 -0.24537780971693929 0.63838738275793605 1.3362055337380656 -0.2471989218418936 0.49258530144265877 1.0950656579663574 -0.24702554049854333 0.9105806491184355 1.1894429883717741 -0.24534290237888454 0.77774186880126905 0.98126048769507324 -0.24522112529177251 1.0276421950038086 0.7223933661158547 -0.24670732146770377 1.227095986156737 0.85743118376699867 -0.24525697274968769 1.1337151521704343 0.57521253630209768 -0.24505144397564582 1.2992647177429995 0.26384920420562141 -0.24637483827573911 1.3991303774846113 0.42248268282271634 -0.24511413238882601 1.3574840754542166 0.10113067255949437 -0.24483801475420561 1.417347078314368 -0.22512882995401728 -0.24598316602435685 1.4057326797043712 -0.062196062475612657 -0.24494210503043864 1.4206856422642398 -0.38431452972413682 -0.24458695734054536 1.3680774748344113 -0.68713793564915981 -0.2455613563840727 1.2466987456749141 -0.82427177784098504 -0.24432795369401769 1.1576883388039345 -1.0676509768930347 -0.24512795551872221 0.94134218699115368 -1.1665124541588436 -0.2440899095279099 0.8119453991153549 -1.3701373347468715 -0.24391255489711339 0.37836378367969464 -1.4197400104698994 -0.24384927393804068 0.081340502598367018 -1.4060020897637251 -0.2452348167165149 0.2277658747683341 -1.4105431043995911 -0.24399160297002656 -0.1853416774890333 -1.3875991907571776 -0.24393771012698773 -0.31315560435200551 -1.2962587658000093 -0.24384395820662702 -0.58354335386360512 -1.137707722770753 -0.24393343793679567 -0.85326577154759942 -1.2283187977440366 -0.24546919606494175 -0.72208397956606452 -0.9185859659171608 -0.24584622817422019 -1.0897352050785845 -1.0342274819921902 -0.24396893436869382 -0.97585384050460644 -0.7856431686835933 -0.24410719311507256 -1.1849147348600082 -0.49692666119962486 -0.24589968081464281 -1.3351375057825221 -0.64549643788499644 -0.24424065967184858 -1.2670854163381493 -0.33928457463108563 -0.24437285483952745 -1.3802952134524675 -0.016217655055675743 -0.24604392912417947 -1.4239726112855111 -0.17925407953342046 -0.24458564876280001 -1.4106785998590701 0.14740773257244311 -0.24467474207365442 -1.4134056903994852 0.46631055846807518 -0.24619979930226729 -1.3449920774421327 0.30846137757544734 -0.24495532427638866 -1.3881563093156684 0.61686989986971774 -0.24497662945723189 -1.2798887097113196 0.89407161749934927 -0.24636344405885821 -1.1071625276394212 1.0138797923645213 -0.24525048098723881 -0.99499602841730039 1.2159062290356557 -0.24647439687472114 -0.73863993320495391 1.2904767451834822 -0.24547071069876339 -0.59339744844013376 1.4144341792197348 -0.2455956252269515 -0.12862612679481208 1.4627034108387535 -0.10299172982433361 0.19214673848346289 1.4323009072502373 -0.10278849991800647 0.34937227152488837 1.3202506883472032 -0.10271197781369579 0.65635025995429253 1.3898273266897685 -0.10370244014251022 0.50666461274887109 1.2383718337502547 -0.10274691070208086 0.80114536557830174 1.0248873304214372 -0.10254532702195511 1.0596278809637012 0.89734843420535737 -0.10266067518260039 1.1710334160344902 0.60665681550339812 -0.10235677315021828 1.34350328813723 0.11617506101080192 -0.10211007807296475 1.4695248572173989 -0.38774050835496643 -0.10181938469327584 1.422219478585403 -0.84581755947024817 -0.10151542793286319 1.2073952723964725 -1.203664980344139 -0.10120186200069145 0.85124091978556582 -1.4184651565109252 -0.10098016582821051 0.40239726607670895 -1.4717999406272946 -0.10089402708662799 0.092935997707997986 -1.4631544380001484 -0.10090586157348425 -0.19173114296395358 -1.4382098374681691 -0.10082703845720467 -0.32882380841853465 -1.3409581312819057 -0.10059320088998858 -0.61294300396859747 -1.1752096893790542 -0.10077934665619576 -0.89203476208013588 -1.0662063105037565 -0.10070034181968125 -1.0188265565311401 -0.80781109515310245 -0.10084206334018792 -1.2341632573860795 -0.94625081075519224 -0.10160312442651549 -1.1370450554520684 -0.50731191509803686 -0.10188242470674691 -1.3899238427724225 -0.6611992175294118 -0.10089136493229983 -1.3183874924092529 -0.3434363716199943 -0.10105881001674209 -1.4342465479828124 -0.0075056390082604407 -0.10210557847822521 -1.4790334003409109 -0.17688694369673216 -0.10120478323720902 -1.4643937649871455 0.16172644000391465 -0.1013903841353576 -1.4656832940562914 0.32866504318174017 -0.10161367424878412 -1.4380909329221843 0.64796533018158398 -0.10178719154860812 -1.3243635927883781 0.79589974428712906 -0.10206790710482294 -1.242208374915758 1.0578134936029067 -0.10218909643735158 -1.0268013675760785 1.3419115748297938 -0.10252689077801838 -0.60999137593824548 1.46817802674419 -0.10275328623132345 -0.13011204076456992</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<polyhedra>\n\t\t\t<first_faces>0</first_faces>\n\t\t\t<face_counts>982</face_counts>\n\t\t\t<types>polygons</types>\n\t\t\t<face_first_loops>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981</face_first_loops>\n\t\t\t<face_loop_counts>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</face_loop_counts>\n\t\t\t<face_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_selection>\n\t\t\t<face_materials>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_materials>\n\t\t\t<loop_first_edges>0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1900 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048 2052 2056 2060 2064 2068 2072 2076 2080 2084 2088 2092 2096 2100 2104 2108 2112 2116 2120 2124 2128 2132 2136 2140 2144 2148 2152 2156 2160 2164 2168 2172 2176 2180 2184 2188 2192 2196 2200 2204 2208 2212 2216 2220 2224 2228 2232 2236 2240 2244 2248 2252 2256 2260 2264 2268 2272 2276 2280 2284 2288 2292 2296 2300 2304 2308 2312 2316 2320 2324 2328 2332 2336 2340 2344 2348 2352 2356 2360 2364 2368 2372 2376 2380 2384 2388 2392 2396 2400 2404 2408 2412 2416 2420 2424 2428 2432 2436 2440 2444 2448 2452 2456 2460 2464 2468 2472 2476 2480 2484 2488 2492 2496 2500 2504 2508 2512 2516 2520 2524 2528 2532 2536 2540 2544 2548 2552 2556 2560 2564 2568 2572 2576 2580 2584 2588 2592 2596 2600 2604 2608 2612 2616 2620 2624 2628 2632 2636 2640 2644 2648 2652 2656 2660 2664 2668 2672 2676 2680 2684 2688 2692 2696 2700 2704 2708 2712 2716 2720 2724 2728 2732 2736 2740 2744 2748 2752 2756 2760 2764 2768 2772 2776 2780 2784 2788 2792 2796 2800 2804 2808 2812 2816 2820 2824 2828 2832 2836 2840 2844 2848 2852 2856 2860 2864 2868 2872 2876 2880 2884 2888 2892 2896 2900 2904 2908 2912 2916 2920 2924 2928 2932 2936 2940 2944 2948 2952 2956 2960 2964 2968 2972 2976 2980 2984 2988 2992 2996 3000 3004 3008 3012 3016 3020 3024 3028 3032 3036 3040 3044 3048 3052 3056 3060 3064 3068 3072 3076 3080 3084 3088 3092 3096 3100 3104 3108 3112 3116 3120 3124 3128 3132 3136 3140 3144 3148 3152 3156 3160 3164 3168 3172 3176 3180 3184 3188 3192 3196 3200 3204 3208 3212 3216 3220 3224 3228 3232 3236 3240 3244 3248 3252 3256 3260 3264 3268 3272 3276 3280 3284 3288 3292 3296 3300 3304 3308 3312 3316 3320 3324 3328 3332 3336 3340 3344 3348 3352 3356 3360 3364 3368 3372 3376 3380 3384 3388 3392 3396 3400 3404 3408 3412 3416 3420 3424 3428 3432 3436 3440 3444 3448 3452 3456 3460 3464 3468 3472 3476 3480 3484 3488 3492 3496 3500 3504 3507 3510 3513 3516 3519 3522 3525 3528 3531 3534 3537 3540 3543 3546 3549 3552 3555 3558 3561 3564 3567 3570 3573 3576 3579 3582 3585 3588 3591 3594 3597 3600 3603 3606 3609 3612 3615 3618 3621 3624 3627 3630 3633 3636 3639 3642 3645 3648 3651 3654 3657 3660 3663 3666 3669 3672 3675 3678 3681 3684 3687 3690 3693 3696 3699 3702 3705 3708 3711 3714 3717 3720 3723 3726 3729 3732 3735 3738 3741 3744 3747 3750 3753 3756 3759 3762 3765 3768 3771 3774 3777 3780 3783 3786 3789 3792 3795 3798 3801 3804 3807 3810 3813 3816 3819</loop_first_edges>\n\t\t\t<edge_points>0 902 175 204 204 265 264 0 901 902 0 203 0 264 261 203 184 908 219 1 219 291 288 1 1 218 185 184 1 288 287 218 192 244 2 193 244 334 333 2 243 926 193 2 2 333 17 243 253 257 256 3 256 345 343 3 250 253 3 251 3 343 341 251 275 278 4 274 278 354 352 4 271 274 4 272 352 353 272 4 6 277 276 5 5 276 209 211 279 282 6 5 213 279 5 211 282 358 355 6 355 356 277 6 8 281 280 7 7 280 212 214 283 286 8 7 216 283 7 214 286 361 359 8 8 359 357 281 10 285 284 9 9 284 215 217 287 290 10 9 218 287 9 217 290 364 362 10 10 362 360 285 291 295 294 11 25 365 11 294 288 291 11 289 11 365 363 289 309 312 12 307 312 373 371 12 305 308 307 12 12 371 370 305 314 317 13 313 317 375 374 13 310 313 13 311 13 374 372 311 319 322 14 318 322 377 376 14 315 318 14 316 14 376 27 316 324 327 15 323 327 379 378 15 320 323 15 321 15 378 28 321 329 332 16 328 332 382 380 16 325 328 16 326 16 380 29 326 18 331 330 17 17 330 242 243 333 336 18 17 336 385 383 18 18 383 381 331 20 335 334 19 19 334 244 245 337 340 20 19 247 337 19 245 340 388 386 20 20 386 384 335 22 339 338 21 21 338 246 248 249 252 22 21 197 249 21 248 342 389 22 252 22 389 387 339 34 347 23 33 23 347 263 262 348 393 33 23 267 348 23 262 401 402 25 24 25 294 293 24 367 403 401 24 299 367 24 293 25 402 400 365 46 405 368 26 26 368 302 306 370 406 46 26 305 370 26 306 27 410 48 375 27 375 317 316 376 412 410 27 28 413 411 377 28 377 322 321 378 414 413 28 29 415 49 379 29 379 327 326 380 416 415 29 341 390 30 342 424 425 30 390 30 423 389 342 425 474 423 30 346 392 31 344 392 429 427 31 32 345 344 31 427 428 32 31 32 391 343 345 32 428 426 391 431 432 33 393 33 432 430 34 34 392 346 347 34 430 429 392 351 394 35 349 434 435 35 394 36 350 349 35 35 435 433 36 36 393 348 350 36 433 431 393 354 395 37 352 395 438 437 37 38 353 352 37 37 437 436 38 38 394 351 353 38 436 434 394 358 396 39 355 396 441 440 39 40 356 355 39 39 440 439 40 40 395 354 356 40 439 438 395 361 397 41 359 397 444 443 41 357 359 41 42 41 443 442 42 42 396 358 357 42 442 441 396 362 398 43 360 445 446 43 398 43 397 361 360 43 446 444 397 365 400 44 363 400 449 448 44 44 399 364 363 44 448 447 399 368 405 45 369 45 404 366 369 406 453 452 46 372 408 47 373 408 456 454 47 47 407 371 373 454 455 407 47 410 459 457 48 48 409 374 375 457 458 409 48 415 465 463 49 49 414 378 379 463 464 414 49 381 417 50 382 417 467 52 50 50 416 380 382 52 466 416 50 384 419 51 385 419 470 468 51 51 418 383 385 468 469 418 51 467 529 70 52 70 526 466 52 54 476 475 53 53 475 424 426 53 477 55 54 428 477 53 426 55 545 544 54 54 544 543 476 478 480 55 477 480 546 545 55 487 490 56 485 56 486 484 485 489 493 57 488 57 490 487 488 495 496 58 494 491 494 58 492 60 496 495 59 59 495 438 439 497 499 60 59 440 497 59 439 61 503 500 498 61 498 441 442 443 501 61 442 63 507 62 506 507 552 551 62 62 551 550 503 63 506 447 448 448 449 64 63 65 512 454 456 458 514 65 456 66 514 458 457 459 515 66 457 516 517 68 67 68 556 555 67 67 555 554 513 518 520 68 517 520 557 556 68 70 528 69 526 525 526 69 522 70 529 527 528 72 532 71 530 529 530 71 527 72 530 469 468 72 533 531 532 470 533 72 468 535 536 73 534 77 559 73 536 533 534 73 531 83 562 547 74 74 547 483 482 74 548 84 83 85 563 549 75 75 549 499 500 75 550 86 85 503 550 75 500 87 552 76 88 76 552 507 508 553 565 88 76 511 553 76 508 77 571 570 559 78 572 571 77 536 538 78 77 79 573 572 78 538 542 79 78 80 574 573 79 79 542 541 80 560 574 80 543 476 543 80 541 545 561 81 544 561 577 576 81 81 560 543 544 81 576 575 560 547 562 82 546 562 579 578 82 82 561 545 546 82 578 577 561 84 581 580 83 83 580 579 562 549 563 84 548 563 582 581 84 86 583 90 85 90 582 563 85 551 564 86 550 564 584 583 86 88 586 585 87 87 564 551 552 87 585 584 564 565 587 586 88 555 566 89 554 566 589 588 89 89 565 553 554 89 588 587 565 583 615 613 90 90 613 96 582 602 603 92 91 92 645 643 91 600 602 91 601 91 643 642 601 603 605 604 92 644 645 92 604 648 649 93 608 93 649 647 606 651 652 94 95 609 611 94 610 94 652 650 610 96 611 581 582 613 614 612 96 615 616 98 97 613 615 97 614 97 657 656 614 616 618 617 98 617 663 662 98 100 620 619 99 99 619 586 587 621 622 100 99 588 621 99 587 100 622 109 108 108 665 620 100 625 626 102 101 102 672 670 101 623 625 101 624 101 670 110 624 633 675 113 103 114 629 103 113 104 631 593 594 634 637 635 104 595 634 104 594 635 677 676 105 105 676 115 632 117 679 641 106 106 641 639 599 642 680 117 106 601 642 106 599 125 686 655 107 656 687 125 107 614 656 107 612 130 696 665 108 129 130 108 109 666 697 129 109 134 698 669 110 110 670 133 134 137 700 112 111 674 701 137 111 630 674 111 628 112 700 135 673 139 702 114 113 113 675 138 139 114 702 701 674 114 674 630 629 115 703 138 675 115 675 633 632 141 703 115 676 116 705 704 678 116 678 637 640 679 705 116 641 639 641 116 640 680 708 706 117 706 707 679 117 645 681 118 643 709 710 118 681 118 680 642 643 118 710 708 680 648 684 119 649 684 716 714 119 647 649 119 120 119 714 712 120 120 683 646 647 712 713 683 120 651 685 121 652 685 719 717 121 650 652 121 122 121 717 715 122 122 684 648 650 715 716 684 122 655 686 123 653 686 722 720 123 124 654 653 123 123 720 718 124 124 685 651 654 718 719 685 124 687 723 721 125 721 722 686 125 661 689 126 658 689 726 724 126 126 688 657 658 724 725 688 126 694 732 730 127 127 693 663 664 730 731 693 127 695 735 734 128 738 739 129 697 129 739 737 130 130 737 736 696 669 698 131 667 698 742 741 131 132 668 667 131 131 741 740 132 132 697 666 668 132 740 738 697 672 699 133 670 699 745 744 133 133 744 743 134 134 743 742 698 700 748 747 135 671 673 135 136 135 747 746 136 136 699 672 671 136 746 745 699 749 750 137 701 137 750 748 700 703 754 752 138 752 753 139 138 139 753 751 702 678 704 140 677 704 757 756 140 676 677 140 141 140 756 755 141 141 755 754 703 143 761 760 142 142 760 706 708 763 766 143 142 710 763 142 708 766 854 852 143 143 852 850 761 145 765 764 144 144 764 709 711 767 770 145 144 713 767 144 711 855 856 145 770 145 856 853 765 146 771 769 768 146 768 712 714 772 775 771 146 716 772 146 714 147 776 774 773 147 773 715 717 777 780 776 147 719 777 147 717 148 782 779 778 148 778 718 720 148 783 781 782 722 783 148 720 791 793 149 790 164 868 149 793 789 790 149 787 149 868 867 787 796 798 150 794 166 870 150 798 792 795 794 150 150 870 869 792 801 804 151 799 804 873 871 151 797 800 799 151 151 871 165 797 153 815 814 152 152 814 736 737 817 820 153 152 739 817 152 737 820 880 877 153 877 878 815 153 155 819 818 154 154 818 738 740 821 824 155 154 741 821 154 740 824 883 881 155 155 881 879 819 157 823 822 156 156 822 742 743 825 828 157 156 744 825 156 743 828 886 884 157 157 884 882 823 830 833 158 829 833 889 887 158 826 829 158 827 158 887 885 827 835 838 159 834 169 890 159 838 831 834 159 832 159 890 888 832 840 843 160 839 170 892 160 843 836 839 160 837 160 892 891 837 845 848 161 844 172 894 161 848 841 844 161 842 161 894 893 842 162 849 759 762 851 895 162 762 846 849 162 847 162 895 171 847 181 905 866 163 163 866 785 788 163 867 180 181 787 867 163 788 183 906 868 164 164 869 182 183 792 869 164 793 184 185 166 165 166 798 797 165 871 908 184 165 185 907 870 166 187 909 872 167 167 872 803 808 874 910 187 167 807 874 167 808 188 911 875 168 168 875 812 811 876 912 188 168 816 876 168 811 169 925 924 890 191 925 169 891 837 891 169 838 193 926 892 170 170 893 192 193 842 893 170 843 194 195 172 171 172 848 847 171 895 928 194 171 195 927 894 172 850 896 173 851 173 896 196 197 173 928 895 851 248 928 173 197 857 901 174 855 174 901 203 202 174 900 856 855 201 900 174 202 860 903 175 858 175 903 205 204 175 902 859 858 863 904 176 861 176 904 208 206 177 862 861 176 206 207 177 176 177 903 860 862 205 903 177 207 866 905 178 864 178 905 211 209 179 865 864 178 209 210 179 178 179 904 863 865 208 904 179 210 868 906 180 867 180 906 214 212 212 213 181 180 211 905 181 213 870 907 182 869 182 907 217 215 215 216 183 182 214 906 183 216 217 907 185 218 872 909 186 873 186 909 220 221 186 908 871 873 219 908 186 221 187 910 222 223 220 909 187 223 188 912 226 225 224 911 188 225 877 913 189 878 189 913 227 228 189 912 876 878 226 912 189 228 890 924 190 888 190 924 240 239 190 923 889 888 238 923 190 239 892 926 191 891 191 926 243 242 241 925 191 242 894 927 192 893 192 927 245 244 194 928 248 246 246 247 195 194 245 927 195 247 196 250 249 197 198 253 250 196 896 897 198 196 199 257 253 198 897 899 199 198 199 899 898 200 254 257 199 200 201 258 254 200 898 900 201 200 202 259 258 201 203 261 259 202 205 268 265 204 207 270 268 205 208 274 271 206 206 271 270 207 210 275 274 208 209 276 275 210 212 280 279 213 215 284 283 216 221 295 291 219 292 295 221 220 223 296 292 220 222 297 296 223 224 300 297 222 910 911 224 222 225 301 300 224 226 304 301 225 228 308 304 226 307 308 228 227 229 309 307 227 913 914 229 227 231 310 309 229 914 916 231 229 230 313 310 231 231 916 915 230 232 314 313 230 915 918 232 230 233 315 314 232 232 918 917 233 917 919 234 233 234 318 315 233 235 319 318 234 919 921 235 234 236 320 319 235 235 921 920 236 920 922 237 236 237 323 320 236 238 324 323 237 922 923 238 237 239 325 324 238 240 328 325 239 241 329 328 240 924 925 241 240 242 330 329 241 246 338 337 247 251 252 249 250 341 342 252 251 258 260 255 254 256 257 254 255 260 346 344 255 344 345 256 255 259 263 260 258 262 263 259 261 263 347 346 260 264 267 262 261 266 267 264 265 268 269 266 265 266 350 348 267 349 350 266 269 270 273 269 268 273 351 349 269 272 273 270 271 272 353 351 273 277 278 275 276 277 356 354 278 281 282 279 280 357 358 282 281 285 286 283 284 360 361 286 285 289 290 287 288 363 364 290 289 296 299 293 292 294 295 292 293 298 299 296 297 300 303 298 297 303 369 366 298 366 367 299 298 302 303 300 301 304 306 302 301 368 369 303 302 304 308 305 306 311 312 309 310 372 373 312 311 316 317 314 315 321 322 319 320 326 327 324 325 331 332 329 330 381 382 332 331 335 336 333 334 384 385 336 335 339 340 337 338 387 388 340 339 343 391 390 341 364 399 398 362 366 404 403 367 371 407 406 370 374 409 408 372 411 412 376 377 383 418 417 381 386 421 419 384 420 421 386 388 387 422 420 388 389 423 422 387 391 426 424 390 399 447 445 398 402 450 449 400 401 451 450 402 407 455 453 406 409 458 456 408 412 461 459 410 413 462 460 411 460 461 412 411 414 464 462 413 416 466 465 415 418 469 467 417 421 472 470 419 422 473 471 420 471 472 421 420 423 474 473 422 475 540 425 424 425 540 539 474 429 479 478 427 427 478 477 428 430 481 479 429 432 484 481 430 431 485 484 432 433 487 485 431 435 488 487 433 434 489 488 435 436 491 489 434 437 494 491 436 438 495 494 437 441 498 497 440 444 502 501 443 446 504 502 444 447 506 505 445 445 505 504 446 455 510 509 453 454 512 510 455 461 516 515 459 462 518 517 460 460 517 516 461 464 519 518 462 465 525 521 463 463 521 519 464 466 526 525 465 469 530 529 467 472 534 533 470 473 537 535 471 471 535 534 472 474 539 537 473 476 541 540 475 479 483 480 478 482 483 479 481 483 547 546 480 484 486 482 481 492 493 489 491 498 500 499 497 510 511 508 509 512 513 511 510 513 554 553 511 519 524 520 518 523 524 519 521 521 525 522 523 537 538 536 535 539 542 538 537 541 542 539 540 556 567 566 555 557 568 567 556 558 569 568 557 559 570 569 558 575 597 574 560 567 590 589 566 568 591 590 567 569 592 591 568 570 593 592 569 571 594 593 570 572 595 594 571 573 596 595 572 574 597 596 573 576 600 598 575 598 638 597 575 577 602 600 576 578 603 602 577 579 605 603 578 580 609 605 579 581 611 609 580 584 616 615 583 585 618 616 584 586 619 618 585 589 623 621 588 590 625 623 589 591 626 625 590 592 627 626 591 593 631 627 592 596 636 634 595 597 638 636 596 600 601 599 598 599 639 638 598 607 646 644 604 606 647 646 607 610 650 648 608 619 620 617 618 623 624 622 621 627 631 629 630 636 640 637 634 637 678 677 635 639 640 636 638 646 683 682 644 644 682 681 645 657 688 687 656 662 692 690 659 690 691 660 659 660 691 689 661 663 693 692 662 707 758 705 679 682 711 709 681 683 713 711 682 688 725 723 687 691 728 726 689 692 729 727 690 727 728 691 690 693 731 729 692 696 736 735 695 702 751 749 701 705 758 757 704 706 760 759 707 759 849 758 707 709 764 763 710 712 768 767 713 715 773 772 716 718 778 777 719 723 786 784 721 721 784 783 722 725 789 786 723 726 791 790 724 724 790 789 725 728 795 791 726 729 796 794 727 794 795 728 727 731 800 796 729 732 801 799 730 799 800 731 730 733 802 801 732 735 813 810 734 736 814 813 735 738 818 817 739 742 822 821 741 745 826 825 744 746 829 826 745 747 830 829 746 748 831 830 747 750 834 831 748 751 836 835 749 749 835 834 750 753 839 836 751 754 841 840 752 752 840 839 753 755 844 841 754 756 845 844 755 757 846 845 756 758 849 846 757 761 762 759 760 850 851 762 761 765 766 763 764 853 854 766 765 769 770 767 768 771 859 857 769 769 857 855 770 858 859 771 775 774 775 772 773 776 862 860 774 774 860 858 775 861 862 776 780 779 780 777 778 782 865 863 779 779 863 861 780 864 865 782 781 785 866 864 781 784 785 781 783 786 788 785 784 786 789 787 788 791 795 792 793 796 800 797 798 803 804 801 802 805 808 803 802 872 873 804 803 807 808 805 806 809 812 807 806 812 875 874 807 811 812 809 810 813 816 811 810 815 816 813 814 815 878 876 816 819 820 817 818 879 880 820 819 823 824 821 822 882 883 824 823 827 828 825 826 885 886 828 827 832 833 830 831 888 889 833 832 837 838 835 836 842 843 840 841 847 848 845 846 852 897 896 850 854 899 897 852 856 900 898 853 898 899 854 853 859 902 901 857 875 911 910 874 880 914 913 877 915 916 879 881 879 916 914 880 883 918 915 881 884 919 917 882 917 918 883 882 886 921 919 884 887 922 920 885 920 921 886 885 889 923 922 887 46 452 451 46 451 401 46 401 403 46 403 404 46 404 45 46 45 405 493 548 74 493 74 482 493 482 486 493 486 56 493 56 490 493 490 57 499 549 548 499 548 493 499 493 492 499 492 58 499 58 496 499 496 60 505 506 62 505 62 503 505 503 61 505 61 501 505 501 502 505 502 504 64 509 508 64 508 507 64 507 63 453 509 64 453 64 449 453 449 450 453 450 451 453 451 452 515 516 67 515 67 513 515 513 512 515 512 65 515 65 514 515 514 66 528 558 557 528 557 520 528 520 524 528 524 523 528 523 522 528 522 69 73 559 558 73 558 528 73 528 527 73 527 71 73 71 532 73 532 531 609 610 608 609 608 93 609 93 606 609 606 607 609 607 604 609 604 605 96 612 95 96 95 94 96 94 611 107 655 653 107 653 654 107 654 651 107 651 95 107 95 612 98 662 659 98 659 660 98 660 661 98 661 658 98 658 657 98 657 97 627 630 628 627 628 102 627 102 626 112 673 671 112 671 672 112 672 102 112 102 628 112 628 111 104 635 105 104 105 632 104 632 633 104 633 103 104 103 629 104 629 631 110 669 667 110 667 668 110 668 666 110 666 109 110 109 622 110 622 624 665 696 695 665 695 128 665 128 694 665 694 127 665 127 664 128 734 733 128 733 732 128 732 694 620 665 664 620 664 663 620 663 617 734 810 809 734 809 806 734 806 805 734 805 802 734 802 733</edge_points>\n\t\t\t<clockwise_edges>1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1891 1888 1893 1894 1895 1892 1897 1898 1899 1896 1901 1902 1903 1900 1905 1906 1907 1904 1909 1910 1911 1908 1913 1914 1915 1912 1917 1918 1919 1916 1921 1922 1923 1920 1925 1926 1927 1924 1929 1930 1931 1928 1933 1934 1935 1932 1937 1938 1939 1936 1941 1942 1943 1940 1945 1946 1947 1944 1949 1950 1951 1948 1953 1954 1955 1952 1957 1958 1959 1956 1961 1962 1963 1960 1965 1966 1967 1964 1969 1970 1971 1968 1973 1974 1975 1972 1977 1978 1979 1976 1981 1982 1983 1980 1985 1986 1987 1984 1989 1990 1991 1988 1993 1994 1995 1992 1997 1998 1999 1996 2001 2002 2003 2000 2005 2006 2007 2004 2009 2010 2011 2008 2013 2014 2015 2012 2017 2018 2019 2016 2021 2022 2023 2020 2025 2026 2027 2024 2029 2030 2031 2028 2033 2034 2035 2032 2037 2038 2039 2036 2041 2042 2043 2040 2045 2046 2047 2044 2049 2050 2051 2048 2053 2054 2055 2052 2057 2058 2059 2056 2061 2062 2063 2060 2065 2066 2067 2064 2069 2070 2071 2068 2073 2074 2075 2072 2077 2078 2079 2076 2081 2082 2083 2080 2085 2086 2087 2084 2089 2090 2091 2088 2093 2094 2095 2092 2097 2098 2099 2096 2101 2102 2103 2100 2105 2106 2107 2104 2109 2110 2111 2108 2113 2114 2115 2112 2117 2118 2119 2116 2121 2122 2123 2120 2125 2126 2127 2124 2129 2130 2131 2128 2133 2134 2135 2132 2137 2138 2139 2136 2141 2142 2143 2140 2145 2146 2147 2144 2149 2150 2151 2148 2153 2154 2155 2152 2157 2158 2159 2156 2161 2162 2163 2160 2165 2166 2167 2164 2169 2170 2171 2168 2173 2174 2175 2172 2177 2178 2179 2176 2181 2182 2183 2180 2185 2186 2187 2184 2189 2190 2191 2188 2193 2194 2195 2192 2197 2198 2199 2196 2201 2202 2203 2200 2205 2206 2207 2204 2209 2210 2211 2208 2213 2214 2215 2212 2217 2218 2219 2216 2221 2222 2223 2220 2225 2226 2227 2224 2229 2230 2231 2228 2233 2234 2235 2232 2237 2238 2239 2236 2241 2242 2243 2240 2245 2246 2247 2244 2249 2250 2251 2248 2253 2254 2255 2252 2257 2258 2259 2256 2261 2262 2263 2260 2265 2266 2267 2264 2269 2270 2271 2268 2273 2274 2275 2272 2277 2278 2279 2276 2281 2282 2283 2280 2285 2286 2287 2284 2289 2290 2291 2288 2293 2294 2295 2292 2297 2298 2299 2296 2301 2302 2303 2300 2305 2306 2307 2304 2309 2310 2311 2308 2313 2314 2315 2312 2317 2318 2319 2316 2321 2322 2323 2320 2325 2326 2327 2324 2329 2330 2331 2328 2333 2334 2335 2332 2337 2338 2339 2336 2341 2342 2343 2340 2345 2346 2347 2344 2349 2350 2351 2348 2353 2354 2355 2352 2357 2358 2359 2356 2361 2362 2363 2360 2365 2366 2367 2364 2369 2370 2371 2368 2373 2374 2375 2372 2377 2378 2379 2376 2381 2382 2383 2380 2385 2386 2387 2384 2389 2390 2391 2388 2393 2394 2395 2392 2397 2398 2399 2396 2401 2402 2403 2400 2405 2406 2407 2404 2409 2410 2411 2408 2413 2414 2415 2412 2417 2418 2419 2416 2421 2422 2423 2420 2425 2426 2427 2424 2429 2430 2431 2428 2433 2434 2435 2432 2437 2438 2439 2436 2441 2442 2443 2440 2445 2446 2447 2444 2449 2450 2451 2448 2453 2454 2455 2452 2457 2458 2459 2456 2461 2462 2463 2460 2465 2466 2467 2464 2469 2470 2471 2468 2473 2474 2475 2472 2477 2478 2479 2476 2481 2482 2483 2480 2485 2486 2487 2484 2489 2490 2491 2488 2493 2494 2495 2492 2497 2498 2499 2496 2501 2502 2503 2500 2505 2506 2507 2504 2509 2510 2511 2508 2513 2514 2515 2512 2517 2518 2519 2516 2521 2522 2523 2520 2525 2526 2527 2524 2529 2530 2531 2528 2533 2534 2535 2532 2537 2538 2539 2536 2541 2542 2543 2540 2545 2546 2547 2544 2549 2550 2551 2548 2553 2554 2555 2552 2557 2558 2559 2556 2561 2562 2563 2560 2565 2566 2567 2564 2569 2570 2571 2568 2573 2574 2575 2572 2577 2578 2579 2576 2581 2582 2583 2580 2585 2586 2587 2584 2589 2590 2591 2588 2593 2594 2595 2592 2597 2598 2599 2596 2601 2602 2603 2600 2605 2606 2607 2604 2609 2610 2611 2608 2613 2614 2615 2612 2617 2618 2619 2616 2621 2622 2623 2620 2625 2626 2627 2624 2629 2630 2631 2628 2633 2634 2635 2632 2637 2638 2639 2636 2641 2642 2643 2640 2645 2646 2647 2644 2649 2650 2651 2648 2653 2654 2655 2652 2657 2658 2659 2656 2661 2662 2663 2660 2665 2666 2667 2664 2669 2670 2671 2668 2673 2674 2675 2672 2677 2678 2679 2676 2681 2682 2683 2680 2685 2686 2687 2684 2689 2690 2691 2688 2693 2694 2695 2692 2697 2698 2699 2696 2701 2702 2703 2700 2705 2706 2707 2704 2709 2710 2711 2708 2713 2714 2715 2712 2717 2718 2719 2716 2721 2722 2723 2720 2725 2726 2727 2724 2729 2730 2731 2728 2733 2734 2735 2732 2737 2738 2739 2736 2741 2742 2743 2740 2745 2746 2747 2744 2749 2750 2751 2748 2753 2754 2755 2752 2757 2758 2759 2756 2761 2762 2763 2760 2765 2766 2767 2764 2769 2770 2771 2768 2773 2774 2775 2772 2777 2778 2779 2776 2781 2782 2783 2780 2785 2786 2787 2784 2789 2790 2791 2788 2793 2794 2795 2792 2797 2798 2799 2796 2801 2802 2803 2800 2805 2806 2807 2804 2809 2810 2811 2808 2813 2814 2815 2812 2817 2818 2819 2816 2821 2822 2823 2820 2825 2826 2827 2824 2829 2830 2831 2828 2833 2834 2835 2832 2837 2838 2839 2836 2841 2842 2843 2840 2845 2846 2847 2844 2849 2850 2851 2848 2853 2854 2855 2852 2857 2858 2859 2856 2861 2862 2863 2860 2865 2866 2867 2864 2869 2870 2871 2868 2873 2874 2875 2872 2877 2878 2879 2876 2881 2882 2883 2880 2885 2886 2887 2884 2889 2890 2891 2888 2893 2894 2895 2892 2897 2898 2899 2896 2901 2902 2903 2900 2905 2906 2907 2904 2909 2910 2911 2908 2913 2914 2915 2912 2917 2918 2919 2916 2921 2922 2923 2920 2925 2926 2927 2924 2929 2930 2931 2928 2933 2934 2935 2932 2937 2938 2939 2936 2941 2942 2943 2940 2945 2946 2947 2944 2949 2950 2951 2948 2953 2954 2955 2952 2957 2958 2959 2956 2961 2962 2963 2960 2965 2966 2967 2964 2969 2970 2971 2968 2973 2974 2975 2972 2977 2978 2979 2976 2981 2982 2983 2980 2985 2986 2987 2984 2989 2990 2991 2988 2993 2994 2995 2992 2997 2998 2999 2996 3001 3002 3003 3000 3005 3006 3007 3004 3009 3010 3011 3008 3013 3014 3015 3012 3017 3018 3019 3016 3021 3022 3023 3020 3025 3026 3027 3024 3029 3030 3031 3028 3033 3034 3035 3032 3037 3038 3039 3036 3041 3042 3043 3040 3045 3046 3047 3044 3049 3050 3051 3048 3053 3054 3055 3052 3057 3058 3059 3056 3061 3062 3063 3060 3065 3066 3067 3064 3069 3070 3071 3068 3073 3074 3075 3072 3077 3078 3079 3076 3081 3082 3083 3080 3085 3086 3087 3084 3089 3090 3091 3088 3093 3094 3095 3092 3097 3098 3099 3096 3101 3102 3103 3100 3105 3106 3107 3104 3109 3110 3111 3108 3113 3114 3115 3112 3117 3118 3119 3116 3121 3122 3123 3120 3125 3126 3127 3124 3129 3130 3131 3128 3133 3134 3135 3132 3137 3138 3139 3136 3141 3142 3143 3140 3145 3146 3147 3144 3149 3150 3151 3148 3153 3154 3155 3152 3157 3158 3159 3156 3161 3162 3163 3160 3165 3166 3167 3164 3169 3170 3171 3168 3173 3174 3175 3172 3177 3178 3179 3176 3181 3182 3183 3180 3185 3186 3187 3184 3189 3190 3191 3188 3193 3194 3195 3192 3197 3198 3199 3196 3201 3202 3203 3200 3205 3206 3207 3204 3209 3210 3211 3208 3213 3214 3215 3212 3217 3218 3219 3216 3221 3222 3223 3220 3225 3226 3227 3224 3229 3230 3231 3228 3233 3234 3235 3232 3237 3238 3239 3236 3241 3242 3243 3240 3245 3246 3247 3244 3249 3250 3251 3248 3253 3254 3255 3252 3257 3258 3259 3256 3261 3262 3263 3260 3265 3266 3267 3264 3269 3270 3271 3268 3273 3274 3275 3272 3277 3278 3279 3276 3281 3282 3283 3280 3285 3286 3287 3284 3289 3290 3291 3288 3293 3294 3295 3292 3297 3298 3299 3296 3301 3302 3303 3300 3305 3306 3307 3304 3309 3310 3311 3308 3313 3314 3315 3312 3317 3318 3319 3316 3321 3322 3323 3320 3325 3326 3327 3324 3329 3330 3331 3328 3333 3334 3335 3332 3337 3338 3339 3336 3341 3342 3343 3340 3345 3346 3347 3344 3349 3350 3351 3348 3353 3354 3355 3352 3357 3358 3359 3356 3361 3362 3363 3360 3365 3366 3367 3364 3369 3370 3371 3368 3373 3374 3375 3372 3377 3378 3379 3376 3381 3382 3383 3380 3385 3386 3387 3384 3389 3390 3391 3388 3393 3394 3395 3392 3397 3398 3399 3396 3401 3402 3403 3400 3405 3406 3407 3404 3409 3410 3411 3408 3413 3414 3415 3412 3417 3418 3419 3416 3421 3422 3423 3420 3425 3426 3427 3424 3429 3430 3431 3428 3433 3434 3435 3432 3437 3438 3439 3436 3441 3442 3443 3440 3445 3446 3447 3444 3449 3450 3451 3448 3453 3454 3455 3452 3457 3458 3459 3456 3461 3462 3463 3460 3465 3466 3467 3464 3469 3470 3471 3468 3473 3474 3475 3472 3477 3478 3479 3476 3481 3482 3483 3480 3485 3486 3487 3484 3489 3490 3491 3488 3493 3494 3495 3492 3497 3498 3499 3496 3501 3502 3503 3500 3505 3506 3504 3508 3509 3507 3511 3512 3510 3514 3515 3513 3517 3518 3516 3520 3521 3519 3523 3524 3522 3526 3527 3525 3529 3530 3528 3532 3533 3531 3535 3536 3534 3538 3539 3537 3541 3542 3540 3544 3545 3543 3547 3548 3546 3550 3551 3549 3553 3554 3552 3556 3557 3555 3559 3560 3558 3562 3563 3561 3565 3566 3564 3568 3569 3567 3571 3572 3570 3574 3575 3573 3577 3578 3576 3580 3581 3579 3583 3584 3582 3586 3587 3585 3589 3590 3588 3592 3593 3591 3595 3596 3594 3598 3599 3597 3601 3602 3600 3604 3605 3603 3607 3608 3606 3610 3611 3609 3613 3614 3612 3616 3617 3615 3619 3620 3618 3622 3623 3621 3625 3626 3624 3628 3629 3627 3631 3632 3630 3634 3635 3633 3637 3638 3636 3640 3641 3639 3643 3644 3642 3646 3647 3645 3649 3650 3648 3652 3653 3651 3655 3656 3654 3658 3659 3657 3661 3662 3660 3664 3665 3663 3667 3668 3666 3670 3671 3669 3673 3674 3672 3676 3677 3675 3679 3680 3678 3682 3683 3681 3685 3686 3684 3688 3689 3687 3691 3692 3690 3694 3695 3693 3697 3698 3696 3700 3701 3699 3703 3704 3702 3706 3707 3705 3709 3710 3708 3712 3713 3711 3715 3716 3714 3718 3719 3717 3721 3722 3720 3724 3725 3723 3727 3728 3726 3730 3731 3729 3733 3734 3732 3736 3737 3735 3739 3740 3738 3742 3743 3741 3745 3746 3744 3748 3749 3747 3751 3752 3750 3754 3755 3753 3757 3758 3756 3760 3761 3759 3763 3764 3762 3766 3767 3765 3769 3770 3768 3772 3773 3771 3775 3776 3774 3778 3779 3777 3781 3782 3780 3784 3785 3783 3787 3788 3786 3790 3791 3789 3793 3794 3792 3796 3797 3795 3799 3800 3798 3802 3803 3801 3805 3806 3804 3808 3809 3807 3811 3812 3810 3814 3815 3813 3817 3818 3816 3820 3821 3819</clockwise_edges>\n\t\t\t<edge_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</edge_selection>\n\t\t</polyhedra>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.PGPRemesh.triang.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-0.38526572809325221 -3.0167307006386448 0.27487513010998588 -0.15281208277150379 -3.0363323097867454 0.25831971609271009 -0.12806778305166594 -3.1345820469994381 0.74000236695232646 -0.37335762054586952 -3.1137721098218667 0.75683894272989616 -1.070642581082548 -2.862008606517267 0.32334913690587003 -0.85007914948079388 -2.9257646570927971 0.3081161043005734 -0.61438040416115425 -2.9937995768610186 0.29137299205331135 -1.5053085347108035 -2.6606615706723225 0.35633112543360584 -1.2910070084205076 -2.7714772152656026 0.33970929581960257 -2.0885807504770626 -2.2520857410906769 0.4057155608043419 -1.9038369008131923 -2.3995160326350873 0.38937291542556174 -1.7104522710507333 -2.5537440561701623 0.37188387065065465 -2.5670393493365227 -1.7204892633937545 0.45596782394645258 -2.4168820021682946 -1.8984017241397637 0.43976850574654275 -2.2587109649004384 -2.0857129352640258 0.42239638248824191 -2.8021050161923005 -1.2969190621804125 0.49023996951967663 -2.6859637272269223 -1.507082616460226 0.47328123469507671 -2.9418550376530241 -0.61749240809347916 0.044829238745783276 -3.0428286373849787 -0.62286738484139215 0.54083190115860724 -2.871127910817791 -0.83945154253241205 0.028409788950800249 -2.8004007839825578 -1.0614106769713449 0.011990339155817214 -2.9711359044409584 -0.84785296319079317 0.52418261506959685 -2.8971316111964995 -1.0800835325683966 0.5069831248672958 -3.0002683172314977 -0.15423412435858386 0.077717905572113097 -3.1004642410559491 -0.14093960839877787 0.57485405448674753 -2.9742159264348609 -0.38565102767640269 0.061329707737870061 -3.07328258181446 -0.38253164382547916 0.55782685463478943 -2.9715799226573063 0.54455231565465334 0.12675755037092529 -3.0675612971861641 0.57605551016036793 0.62488730304155715 -2.9911929658066581 0.31258320131046474 0.11049953433839933 -3.0108060089560098 0.080614086966275963 0.094241518305873365 -3.08777916522825 0.33717698961833198 0.6082487565218978 -3.1083056449203932 0.09477294743648762 0.59141604447938745 -2.8500384873743174 0.99805645919692609 0.15904208358327548 -2.914558194590787 0.77445584532611189 0.1430468879845008 -2.9394752886713102 1.0434119027934876 0.65790241786129333 -3.0069824062274608 0.80960045284713722 0.64137540422003825 -2.5571166442908755 1.6360141702379301 0.20627515387567474 -2.6640654123764835 1.429407061843367 0.19074874171552608 -2.6347860716195126 1.7006376161161609 0.70619597448378435 -2.7467648442391264 1.4844004917320475 0.69014676476850112 -2.7726537349125899 1.2196610028837893 0.17505192114869789 -2.8587436168587401 1.2681633673479342 0.674097555053218 -2.2714829377336851 2.0120811884028429 0.2363000426627799 -2.4167402394245343 1.8304980559471846 0.22160117813287639 -2.3399132258787771 2.0848680587564155 0.73678275351318789 -2.4921551319617561 1.8945991795769701 0.7215231179284215 -1.7560482730318128 2.4921815287870239 0.27760627124903581 -1.9339571695398412 2.3428036187947332 0.2644392246297253 -2.1176583680440375 2.1885574048912613 0.25082433618363986 -2.1793645981111887 2.2661700385172976 0.75165341573955169 -1.3469517166984728 2.7325823235913966 0.29964919556629938 -1.5535924004053616 2.6198150468171848 0.28933311384298954 -0.6864695776755424 2.9768011253049371 0.31491313563194873 -0.90641451354034208 2.9096241917314996 0.31270216020328762 -1.1392591827844492 2.838194502713796 0.30884920037970426 -0.2189982316560552 3.0338801077814663 0.27876371731162303 -0.44973775369786062 3.0159473495016154 0.30286026354024043 0.50584530671359307 3.017547142253842 0.3386846040855509 0.19499299549442972 2.9979856416063528 0.086423863955150892 0.40757278321262552 3.0449915879637603 0.42799753717708533 0.0037758616412031558 3.0494388436407363 0.25041546792105002 0.087075380103583788 3.1298395018632053 0.6958626055828685 1.0400742298529773 2.8869408769433065 0.39904919666214284 0.80812293935528512 2.999240268797795 0.60178215859957862 1.6104066593122832 2.5794411487318722 0.24475448206193687 1.4135522706313381 2.6894574839664158 0.26611912872325016 1.6128886548250359 2.6893166144875775 0.74017888268455545 1.3917518292504847 2.8123105793817484 0.76153638651350641 1.1987509199764015 2.8090654852694996 0.28747849617221116 1.9834164436367707 2.2963262988747406 0.24144999393711805 2.1984224484458847 2.2466073357035268 0.73633676093812295 2.0087640813003134 2.4012443490965136 0.73238652805300186 1.8030758449932192 2.4434734464574772 0.23811295835152044 1.8191057141547422 2.5558813624895 0.72843629516788078 2.4628831934362099 1.7881392914787755 0.26604001572211938 2.3149689098065802 1.9651100583476411 0.25558195121762145 2.513899657604362 1.8791160652311123 0.75681587511699677 2.3580614424382476 2.0656433839772976 0.74604122491789415 2.1606353766442505 2.1498226754445469 0.24486741774152865 2.8206456976461283 1.1844854040823634 0.30509929801632629 2.7094191196810979 1.3868879497586761 0.29155485202364845 2.5956853896824175 1.593976835176492 0.27800037630632796 2.9665948461309624 0.73387640741250582 0.33509289937716169 2.8962285340013438 0.95553169121895776 0.31997210608081927 3.0723315911254332 0.037851623748031138 0.38237768555914697 3.0465180475278726 0.26743933872598813 0.36628453158392288 3.0198855940667033 0.50590983087045582 0.35047274435309889 3.0395429998888264 -0.43672688845456653 0.41504128226954701 3.059484106559796 -0.2010246161782645 0.39858408082390767 2.8753007547840852 -1.1235767070458134 0.46522896993508289 2.9398090163366843 -0.8993302753352419 0.44823140363736047 3.0067414637457164 -0.66741008109212441 0.43169972987538446 2.5665467785181839 -1.5372137119612255 0.013010701327920739 2.6667187310635767 -1.5538277432082344 0.49885745339645277 2.7772276377351566 -1.3400322281800883 0.48207403801459875 2.1590200705417804 -2.0959044727060707 0.065765728890331554 2.254169219697653 -2.1311465944597372 0.55026407613447681 2.3028167817999079 -1.9151794781156852 0.048113384513306073 2.4466134930580359 -1.7344544835252995 0.030461040136280593 2.4023958966094767 -1.9451751837381737 0.53309729068406386 2.5531017982973188 -1.7562676227449099 0.51620224768385936 1.8105620303918397 -2.402246674362349 0.10111413689380053 1.9868511526849448 -2.2530177612572988 0.083337962913554026 1.8992936644236114 -2.4532322367056674 0.58457423115655682 2.0845992153659294 -2.2967925657103794 0.56753545147418083 1.2190702716448021 -2.7682944630949895 0.15422389121860083 1.421072390510203 -2.6563295628419779 0.13643654190354909 1.2900474406406885 -2.8385871002362681 0.63641021779676521 1.5035903317719876 -2.7205902058864915 0.61923178869222784 1.6247477676861874 -2.5434901037622901 0.11873747791111275 1.7171332229032865 -2.6025933115367152 0.60205335958769046 0.77671607751429472 -2.9234476810760315 0.1893343764745696 0.99652005023286883 -2.8531237286212892 0.17170355468815859 0.83618859978221505 -3.0050820222295718 0.67117809151367369 1.0703017335368941 -2.9304908354296302 0.6539021063613204 0.31501950287897756 -3.013552738126196 0.22411603479906006 0.086249530716970224 -3.0395102529241886 0.24133788600370959 0.11520680335838657 -3.1324634692486035 0.72298344684208282 0.36045735651737237 -3.104883748980777 0.70576657310923596 0.55271229004272482 -2.9867169388002011 0.20689687846664115 0.60570790967635812 -3.0773040287129505 0.68854969937638899 -0.65471624987439869 -3.3650554751319359 1.1803733415443496 -0.10218527638279971 -3.3992866567341258 1.1501593115984587 -0.40177256105961895 -3.3803309943656208 1.1659501632188176 -1.1023233668575405 -2.9688120385085548 0.80131112621105127 -1.2172480750536365 -3.2205267157358466 1.2137213838500751 -0.86161117381104235 -3.0318143767344767 0.78689587471342082 -0.94365783311598705 -3.2922212849077312 1.1974623443881862 -0.6203599963564923 -3.0949592105496775 0.77245039718358943 -1.567652861427097 -2.7688073941160289 0.83122714269080311 -1.3421318217038654 -2.8781353014819957 0.81635217511662261 -1.741322059783402 -2.9894001983752894 1.2469094239460508 -1.4733135343819486 -3.1196819670982467 1.2297052885022157 -2.2013155400232294 -2.3474123100723232 0.87666962711690033 -2.4333694064086218 -2.5173745335218847 1.2956354257460467 -2.0016886088609835 -2.4983309773094766 0.86166081538673411 -2.2085439667342497 -2.6878299571794848 1.2792977429986627 -1.7935364083585938 -2.6558594052170656 0.84620241421619913 -1.9763279573627974 -2.8640153929888243 1.2625703104426165 -2.5573543082513259 -1.9774819281382952 0.9071809107837755 -2.3919679757345245 -2.1633224590095752 0.89221856479946648 -2.813015944739488 -2.1067065968482162 1.3276691888334859 -2.6245272671532121 -2.3194482259804312 1.311515076785001 -2.9791128908262441 -1.3450639935445452 0.95235485148790544 -2.8539446957303194 -1.5582899603786458 0.93750516060050981 -3.2612604218046068 -1.4128911644151194 1.3746432869113914 -3.1208335359657928 -1.6535144640843398 1.3589785852289076 -2.7204130653222554 -1.7865326691306886 0.92220875444912009 -2.9804066501269784 -1.8941377637535604 1.343313883546424 -3.1664787807400376 -0.86537751044172251 0.98233451782669667 -3.4498299871138816 -0.90006292456821779 1.4052446865909847 -3.083693122611272 -1.1042564403276771 0.9674794514139099 -3.3600994224443541 -1.1607644988748125 1.3899218005281373 -3.3152929281015644 -0.11736334145312977 1.0266911026170427 -3.2815862092888759 -0.36071393372666516 1.0121159921313234 -3.2449439545314047 -0.63070005741758262 0.99707369359347953 -3.2920519103152039 0.65051902214070823 1.0704971026166092 -3.3065750385877477 0.40542589316139577 1.0561050861585959 -3.3226713445676976 0.14238837187909895 1.0414224428204555 -3.15746909830917 1.1631869334996305 1.0993756123062184 -3.2221557965267227 0.9172611859177775 1.0851083649687094 -2.8388922195292561 1.8741927713056352 1.1414876793581847 -2.9465650668154155 1.6533929879083187 1.1277645867749477 -3.0682044738749412 1.405772950475495 1.1135518803745039 -2.5127963005964693 2.3057290639755763 1.1685404898370408 -2.6744710106151839 2.0946666843668602 1.1551256987064844 -1.807704466737162 2.5849990713416817 0.77734477343830632 -1.9373005673205261 2.8474469676597858 1.2060763653515882 -1.9926050693455437 2.4230540220091124 0.76548616309143713 -2.1291657884479607 2.679610385592949 1.1940133683732159 -2.33934446876005 2.4962820226096278 1.181412936900236 -1.3862043901742891 2.8399732895068737 0.79698228500559121 -1.4588240784183444 3.1255966726190612 1.22727811267784 -1.5999818641798909 2.7185785308899142 0.78752817612441128 -1.6999218886367411 2.9888373543162343 1.2168139981155495 -0.6931543121836945 3.100711361960693 0.81250617964705962 -0.69828283658978241 3.3998908791308216 1.245291867614247 -0.92773874769865949 3.0271281129842755 0.80901949213200453 -1.1623231832136245 2.9535448640078585 0.80553280461694943 -0.949314670697186 3.3206882728867071 1.2408984176282321 -1.222551527557832 3.233899180835337 1.2352807812648827 -0.19734257309502889 3.1443191473243912 0.78259991987403266 -0.11162050879199234 3.4433320470795317 1.2174686763013456 -0.44181535081953549 3.1327672393797785 0.80134724028389426 -0.39941228875234597 3.4252504564425319 1.2328289782677657 0.64216905705277549 3.4107997301833137 1.2469849658859802 0.17745988389729353 3.358925087066261 1.1008496418981504 1.0910589332191967 3.0238500490255507 0.87559847053332085 0.62277640783359811 3.0905596820925894 0.76717394023514673 1.6820246540943546 2.9591630134431868 1.1647701623602387 1.4106811575297733 3.1171461306215535 1.1819414379698772 2.3270400147955153 2.4842702179460945 1.1557105137094177 2.1224708055381543 2.6488508315037111 1.151868488198551 1.9003563309068257 2.827290073786251 1.1473982551109283 2.6936841536599729 2.0889644766377109 1.1720206973127294 2.5125231722045709 2.2996685034391349 1.1624410209413669 2.9005339683165801 1.2642478593947764 0.79084634749384841 3.1217043889994738 1.4335900079972286 1.2042272238180856 2.7794745263163758 1.4746051093767467 0.77941233416327071 2.6584150843161711 1.6849623593587175 0.76797832083269302 2.9898341004150759 1.6640566992647474 1.1927108139674487 2.8533082011171809 1.9031833719280182 1.1811589206679856 3.3966439064650285 0.69958017727445165 1.2411855211190856 3.0685827817064713 0.80650758795584998 0.81575386504419312 2.9902436920744129 1.0358908267102129 0.8031525348955193 3.3147874408257278 0.9406617547957854 1.2286292003893597 3.2273024257102936 1.2004631616452563 1.2161449042998544 3.2034767096321484 0.087323129623445572 0.85491829430476796 3.1709887537858452 0.32726341875121501 0.84166450325906406 3.471535167339415 0.16174865685538686 1.2670666580828958 3.436190935555945 0.43269588099582096 1.2541086571071205 3.138350251876787 0.56883799395180845 0.82842630245443249 3.4520286295524647 -0.62898185510246996 1.3067445437543377 3.1900132678554702 -0.40695737012668887 0.88188381236980984 3.2046752610096485 -0.16553543571973955 0.86824076625993962 3.4693214191832924 -0.36330701748038424 1.2934638169252191 3.4872710831254405 -0.09157655782961506 1.2802735563218743 3.0447488673496461 -1.1307204876162023 0.92298779929239716 3.106002860222004 -0.89698663173875592 0.90910286772389326 3.3246151617127313 -1.1482658373830443 1.3334004701110169 3.3948841429761951 -0.88618597997958837 1.3201146654209917 3.17153639591699 -0.64979652698798573 0.89550235018027768 2.7406267464830303 -1.8084213816816668 0.9645347487601752 2.8461569452089988 -1.5911782392014213 0.95049124889174397 3.0086277674032122 -1.8839250855571232 1.3735029848110505 3.128309809848572 -1.6412292883518862 1.3601851115550905 2.9544844167144846 -1.3689040901865916 0.93659117737168951 3.2479918522939322 -1.3985334911466492 1.3468672382991307 2.4359021716263127 -2.2145640965886262 0.99217769913471487 2.5818715030764179 -2.0218549993233759 0.9780151609700688 2.6993087499960304 -2.3214117997840944 1.4003210826040773 2.864233292574442 -2.1064415178040203 1.3869559297411393 1.8910079680410055 -2.7375727660364877 1.0341841936409339 2.072372782035135 -2.5764506296883569 1.0199089606821168 2.269250603789243 -2.4030130241244154 1.0061170063119327 2.5342279787305717 -2.5361543937570499 1.413688978554789 1.4413873709799663 -3.0105521786670062 1.0623364639779951 1.6621838974110155 -2.8818149735909122 1.0481201202866572 0.71198629097990307 -3.2986439746359815 1.1055704110587665 0.94465342781405381 -3.217989516813347 1.091070618313192 1.2150019988770753 -3.1260080197092623 1.0767197699037256 0.1617650690791704 -3.3834374443477948 1.1352215173836993 0.43322735295540876 -3.3468309214053442 1.1204502854334033 -0.69310631109235921 -3.6933313193519099 1.5316859785336991 -0.74915468861512691 -4.1001075814583201 1.8071737227010138 -0.3891512764824695 -3.7072047650486817 1.5209526828187192 -0.056390174925844173 -3.7233408933022933 1.5098355402575787 -0.36175549853521161 -4.1205354670722585 1.7953285162219956 -1.3391671627820283 -3.5432959202353556 1.5558428849599912 -1.0416586083274479 -3.6152703018262731 1.5441019186270617 -1.4894872634565621 -3.9287037571553824 1.8327652356879609 -1.1112830553327002 -4.0231255091087181 1.8197191003617799 -1.9486533327745374 -3.2848661951432354 1.5800940563320847 -1.6620158209104985 -3.4180487901342635 1.5682346265578138 -1.8372300681020515 -3.7927776307217718 1.845579181411003 -2.7342826164701592 -2.759110653443777 1.6149065738822468 -2.4958547554987653 -2.9330908478906785 1.6036479906846492 -2.2260497859167927 -3.1317936002424918 1.5918558827702793 -3.1614585451934523 -2.2959932592886205 1.6370438904352744 -2.9585904761592232 -2.5175188740266972 1.6261101019712358 -3.6530101050798458 -1.5405316660262198 1.6689129041330615 -3.5071737004048842 -1.7803323706675755 1.6584556964379413 -3.3422535161700879 -2.0551877106728127 1.6477932044392969 -3.86802720640231 -0.95565037769916306 1.6897354103817153 -3.7640253031786117 -1.2452511362405172 1.6793574314661257 -3.613426100971632 -0.088502849932113548 1.438506154412095 -4.0378365086825978 -0.063942848131661095 1.7204718324779125 -3.5714372796728111 -0.36215919549048237 1.4284594045182522 -3.5294484583739902 -0.6358155410488513 1.4184126546244096 -3.9936904089475349 -0.35763360786816961 1.7103020970437293 -3.9469139177607517 -0.67575253177166839 1.6999824040942983 -3.6053737499574647 0.47260038186744308 1.4584031471105141 -3.6178501265433241 0.19545892090070557 1.4485009569660532 -4.0183092779417917 0.57077726173542631 1.7407788516561669 -4.0349189931390841 0.24763583733516284 1.7306112193014571 -3.44807877042027 1.303973455416449 1.4878065079365983 -3.8323199010732161 1.4883845772390025 1.7706236065621428 -3.5148908256958431 1.0338357615488005 1.4780833372091964 -3.910739556776146 1.1789308648674217 1.760695617211911 -3.5844147761444569 0.75451262737664992 1.468312314504284 -3.9908498810232147 0.86375070143635191 1.7507377956491523 -3.2212852309752509 1.8364565487251285 1.5069352937780864 -3.3402347689749683 1.5840211610088675 1.4974730279783917 -3.5748298073617746 2.0692681879909993 1.7899656107983191 -3.7159230788030126 1.7747781407568624 1.7803050100783822 -2.7473985973960686 2.5599760235323132 1.5345839350939781 -2.9142382590571052 2.3354278475074599 1.5255312564230372 -3.0387985105074193 2.870137688888057 1.8179328568216766 -3.2359121985852188 2.6083227278592416 1.8087192681382604 -3.0985730794137898 2.0893434440662269 1.5163855889251321 -3.4330258866630188 2.3465077668304266 1.7995056794548441 -2.3213710193516994 2.9762469110633711 1.5517269055838012 -2.5703405971289941 3.318027875130543 1.8351599079507221 -2.5391511906784627 2.7813600838415113 1.5433401167511827 -2.8166373560302351 3.0995513035785867 1.8266761757901426 -1.5860429020099918 3.4687073890189728 1.5741856902755829 -1.8300192186562305 3.3264664727211906 1.5671790736239921 -2.112240927716269 3.1636236765203809 1.5600781351882664 -2.3212181797739442 3.5305860326491332 1.8435099382050582 -1.0064590967235614 3.687039189320195 1.5833530908793254 -1.3015809822168889 3.5916541142118263 1.5795875023596522 -0.073371782789125595 3.8093918486293132 1.5684505074754638 -0.37782650784394389 3.793248440996392 1.5776999476699167 -0.72776806031375552 3.7716678504725758 1.586309859774605 0.69642889920750095 3.8132569598233101 1.6120363886667359 0.28272801390516589 3.6326578396661504 1.4641383206234408 0.32633510786014036 4.0598585203001614 1.7524544659157459 1.4372326056073763 3.5043170430243853 1.5499119267299775 1.0361099539201291 3.4206123846774656 1.4179525945640654 1.1027001674697021 3.9185368599476287 1.7508479890493382 1.9979133561334206 3.1555127286257023 1.5190905599803108 1.7342330336549359 3.316402958217151 1.5309036931941356 2.1442909099907173 3.5654626630576329 1.8081638095402515 1.8307506734473886 3.7568145892121403 1.8222335688927198 2.9453293298312131 2.9554805512321343 1.8067172059281182 2.4809944270712552 2.7849924978838154 1.5204541327198662 2.2570769794210035 2.962846494356238 1.517386636402887 2.6896120350076322 3.1603225692724748 1.8041119183358674 2.4253638983337522 3.3724045763163306 1.8016306259789077 3.085787678366672 2.1538389644643625 1.5372210213631929 2.9007896168106915 2.3639161715611352 1.5306855900851806 3.3778927134139298 2.459569672394275 1.8190485893726966 3.16170871895357 2.7084220398975445 1.8128432571187294 2.7030298947630689 2.5898606427264199 1.5242852393156272 3.3972993253655397 1.6506273884259204 1.5523437464202618 3.8921498382612016 1.6370482474600576 1.8410628676366507 3.7285773463723366 1.9191682986213734 1.8334976780136076 3.2552661410441468 1.8915775653335036 1.5445023574971775 3.5650048544834716 2.2012883497826894 1.8259324883905645 3.7261569247812925 0.84478910014285435 1.5769767050896781 3.6338494104214001 1.1056396890551921 1.568508958635441 3.53197982961313 1.3991050062714188 1.5602542033005102 3.829874531879998 0.25468713856849845 1.5940689355532183 3.7881862431561384 0.54665246683731472 1.5854279065436843 3.8328325619762671 -0.62249182951059423 1.620250600254761 3.8470914869376096 -0.34276309638218233 1.6113692028584798 3.8659476712895198 -0.021536872210507506 1.6028286522467301 3.641009975910888 -1.4825987741715763 1.64657914999198 3.7076832388644689 -1.2167339809410036 1.6375995956257989 3.7859339050514831 -0.9145689236661938 1.6289835930232546 3.3795903775403824 -2.0359393784464688 1.6638094417489659 3.5086808901089452 -1.7669214383006675 1.6551035749135838 2.8776172127140085 -2.7658285813264287 1.6898491128543145 3.0491656760065262 -2.5360742237564766 1.6810228249833092 3.2394569440584102 -2.2844698870699043 1.672617447768729 2.1251268235311898 -2.9067841048410537 1.4320870698763961 2.3296553644199154 -2.7213722576439094 1.4229734868089698 2.4262942314920775 -3.1891204479366904 1.7069009186155251 2.6626746227382263 -2.9788631465955073 1.6984592871546 1.4154820381351176 -3.3668447741157221 1.4598868232252351 1.6578717170131525 -3.6996728761334987 1.7336817098257296 1.6569896738504097 -3.2219961681281832 1.4505547688195173 1.8984973095657018 -3.0771475621406443 1.4412227144137997 1.929366281304389 -3.5394585518366997 1.7247420193748506 2.2113327352476273 -3.3738782859713674 1.715939348359893 0.85748792195059775 -3.5701209523600297 1.4791984581611752 1.1301206132316659 -3.4723444034154713 1.4695131898955089 1.0377590121913121 -3.9411225484710903 1.7527022495214124 1.3658163514691002 -3.8267326472889658 1.7431451800544417 0.54651137564389274 -3.6443148584129483 1.4892868354598947 0.25181322271562556 -3.6885321043362453 1.4994378128606303 0.019581799252766183 -4.1366755625030658 1.7835945827830675 0.3645354779999031 -4.0870356858496484 1.7731276280704948 0.731195615119695 -4.0350536566409509 1.7625241958610833 -0.79608491220796507 -4.575319658927909 1.9311220534400713 -0.37063852736612074 -4.5955176369588502 1.9268046936318943 -1.6904488619530085 -4.3769316524816508 1.9406871901458891 -1.2593212456178513 -4.4826326398598528 1.9358901539859912 -2.1817395437910894 -3.6337452991541146 1.8515366852787016 -2.4946886627953062 -4.0254722970662336 1.9500740842860214 -2.0991321941592322 -4.2103727586534037 1.9453977371252267 -2.7942394365910057 -3.239065694178588 1.8601985051284133 -2.5058021901476879 -3.4482917902292463 1.8559514265187926 -3.1633461327284849 -3.5738108804137472 1.9587208684670836 -2.8321181944608278 -3.8180679993734006 1.9544604420936229 -3.5382472258181923 -2.5249166093060653 1.8722737141790389 -3.9594913698718854 -2.7880266421600273 1.9707203304113718 -3.3113851024695298 -2.7703185412587543 1.8683390873649806 -3.7078574903805155 -3.0637983026736233 1.9668091939642878 -3.0791663894125243 -3.0222875560826514 1.8644095400558736 -3.4524830909896935 -3.3441557734692444 1.9629016045481291 -4.0779912016377589 -1.6907832019215872 1.8835875500645327 -3.9096237989563591 -1.9660743346485205 1.8798468026777868 -3.741256396274959 -2.2413654673754539 1.8761060552910411 -4.3543950242005582 -2.1790587050172738 1.978315799671132 -4.1633696124018638 -2.4964526322500711 1.9745479772199777 -4.3099069833421266 -1.0543424844866562 1.8909602251546325 -4.1991822095424736 -1.3562142090788167 1.8872968662867904 -4.7897877203479373 -1.1714328921611563 1.9895398421238144 -4.6635528997665299 -1.5232388989577013 1.9858071202215561 -4.5373180791851215 -1.8750449057542462 1.9820743983192977 -4.5008603573472943 -0.060812415536091735 1.9019063376807113 -4.4511433384514492 -0.38083500198607467 1.8982866208744564 -4.9408812857338731 -0.44403036867304391 1.9969396257908547 -4.3989724175089933 -0.72415804722288957 1.8946352755772116 -4.885462096536866 -0.81819659312242421 1.9932464133688139 -4.4796507349448627 0.64334308111923022 1.9090999319080513 -4.4946963554842281 0.30816746142414958 1.9055262133152149 -4.2749911605710755 1.6640262141255939 1.9196561501251497 -4.353262069250218 1.3459032673371789 1.916169208520339 -4.4458011910668933 0.98024066453905445 1.9126530442112943 -3.979869311238764 2.3292742950267993 1.9264500726803968 -4.1354706697534409 2.0022883375790306 1.9230697964341363 -3.3864299913540741 3.2139135501524203 1.9361814336191192 -3.5929030663035122 2.9370417593574865 1.9329754896118143 -3.8254575037678631 2.6286077437648365 1.9297971887751189 -2.84330430683712 3.7284575927530677 1.9420335477077555 -3.1308925203591813 3.4739163276997549 1.9391715346870493 -1.7444995315980814 3.8656653407721127 1.8512212231260674 -1.930428321874146 4.3240253333027239 1.9495363786011974 -2.0330316235899955 3.6974405833740196 1.8487531880248387 -2.2468835959585776 4.1415011195723004 1.9471786548748535 -2.5868303423892103 3.9469469272426014 1.9449137349200851 -1.1060189271664784 4.1025449206407041 1.8542967388544893 -1.4303223889539747 3.9972449783840944 1.8529724809598505 -1.2027842223978005 4.5837561145499031 1.9519515548565298 -1.584788343266873 4.4631542798653516 1.951048357078069 -0.051608011241423224 4.2361178115325 1.8490654462058227 -0.055231980190682178 4.719811790465875 1.9453491583917739 -0.41040372644768891 4.2153040763864338 1.8519545604949783 -0.76919944165395415 4.1944903412403685 1.8548436747841337 -0.43648419929824778 4.6984446416100365 1.9485681407705142 -0.85844055147420284 4.6760743880241176 1.9523850343233398 0.75265464792450421 4.2840274054679899 1.8723295725263969 0.82422837467984644 4.8080837147716871 1.9779730658546646 0.37982748923782461 4.5392208799792151 1.9157865948310766 1.521137484647912 4.0195574877508964 1.8625093022795027 1.6744245323003697 4.5795794106682939 1.9785175364423504 1.210255296574303 4.4493075919778411 1.926669293832638 2.3636400064130871 4.0286274896741787 1.9382828136018275 2.0125296035174309 4.2564868583828632 1.9453667218516519 3.252874975077491 3.3492961284461433 1.935384333262091 2.9804967030182139 3.567812077095172 1.9346088521396958 2.6704445646850523 3.8215372667990541 1.9344963685123866 3.7537584622214082 2.7885404250892507 1.9389986480088244 3.5098608891302687 3.0702500988430037 1.9370357476776179 4.3337525441991174 1.878919429391795 1.9463978463101133 4.158429083701054 2.1789452915038363 1.9437614423606246 3.9654547934852946 2.5138335782931307 1.941298408064327 4.1112699158104125 1.0239268614549 1.8512025229498636 4.5927561715559886 1.1715723315201931 1.9518620476950985 4.0020939996726002 1.3333598531999959 1.8482741206551101 4.4685065601398888 1.5340041181064639 1.949125547419944 4.2915669730614372 0.056778829067237191 1.8601962725048529 4.7910474839295025 0.10684590971647592 1.9605299954796485 4.2444991149463078 0.38036605419890379 1.8571733419414278 4.1974312568311785 0.70395327933057072 1.8541504113780027 4.7409565788122032 0.46693251490507481 1.9576208086095228 4.6892419738401081 0.84662319441209499 1.9547727142788656 4.26796174632383 -0.60610733125961902 1.8662628825667311 4.284631078950393 -0.28088759590679779 1.863207187694355 4.768195884642271 -0.63575245852672213 1.9663464216421709 4.7911883656785665 -0.25501859294729168 1.9634608930812012 4.0700668138338596 -1.5761256729145376 1.8753605815675509 4.1493833710098453 -1.2620281585783306 1.8723071973443939 4.5483275399544301 -1.7182748196757869 1.975084264858505 4.6445716593270294 -1.3513686742901512 1.9722045979631615 4.2305367958593161 -0.94220019905875929 1.8692726637826655 4.7408157786996288 -0.98446252890451535 1.9693249310678183 4.0991155114354338 -2.71444563617947 1.9837610336704643 3.7987415840318768 -2.1893323550568637 1.8813366134379119 3.9368794727403724 -1.8987278962836243 1.878305861163228 4.2579491299545529 -2.3866120997069169 1.9808706611682763 4.4227706114387901 -2.0480071327208687 1.978020904524938 3.2519253781794744 -3.015474092218196 1.8902377816422997 3.4426635271551391 -2.7593802419294895 1.8872353349165858 3.654821081438973 -3.3064284901852488 1.9893801104913773 3.8797442756540281 -3.0102590578047703 1.9865778818061226 3.6528976957759016 -2.48043094914309 1.884347074228151 2.5331952718160329 -3.7049506975459727 1.8990800163391386 2.7708575104355551 -3.4903997608250572 1.8960661461560877 2.8685712032231496 -4.0683598362495674 1.9977540775257325 3.1440929014671686 -3.824287885265067 1.9949796042710661 3.0212688178080063 -3.2659077038600719 1.8931328922293036 3.4196145997111875 -3.5802159342805666 1.9922051310164 1.934160523510442 -4.0698905896771063 1.9050907173783322 2.2214820076903274 -3.8986170555424708 1.9019711987771251 0.919827158770121 -4.4760371812833926 1.9149310022570347 1.2510463577540767 -4.3577305059638372 1.9115202241481786 1.6196877458215568 -4.2288115520180849 1.908250911561844 0.09814676896191965 -4.6006156126045985 1.9224803148870746 0.47615760838449528 -4.5443390683283411 1.9186918843967251 -0.82781311422814452 -5.0659359730412872 1.9706667018191122 -0.31603273270744942 -5.0931932498453394 1.9752712627839808 -0.26124233923650969 -5.597236202399241 1.8760842930972368 -0.89095127123244966 -5.5590733897645075 1.8713386211923542 -1.8732234780812376 -4.8374865268317278 1.9606185803155625 -1.3744220969421566 -4.9622930793854474 1.9656878002122216 -2.0854754300492102 -5.2935565497251202 1.8610718679509399 -1.4747219445123543 -5.4513598201861564 1.8663253904558288 -2.7680569677072331 -4.4402262844314313 1.9510587782107376 -2.346201870688029 -4.6385752754692522 1.9558423669078346 -3.0441262063600352 -4.8564979810979825 1.8516696253518952 -2.5682746536015659 -5.0844083830061724 1.8563298745329857 -3.4948520359081905 -3.9414915298571156 1.9424358158423851 -3.1541882237804115 -4.1935509980941843 1.9466871993703103 -4.3574842114098029 -3.0828449474251411 1.9304049184611123 -4.100927769406125 -3.3644707601927717 1.9343343149529926 -3.8171509314354934 -3.6794696838946677 1.9382377223574818 -4.9909940330732105 -2.0785966073547697 1.9189340127716079 -4.7987526564116534 -2.3979955482604014 1.9227272649695411 -4.5892491707096585 -2.7494657362159947 1.9265416119209149 -5.2711502770064813 -1.2930122143659299 1.9113366663129834 -5.1356289142201099 -1.6745047167088127 1.9151231809324805 -4.9963711214488429 -0.069364793349437806 1.9993628921829478 -5.4938691962647184 -0.085592681072467314 1.900086449238731 -5.4363870806866874 -0.47880574698561462 1.9038168535464657 -5.3749257782251254 -0.91090977125958394 1.9075768484193301 -4.9711862609573849 0.69748573487248522 1.9920668556660941 -4.9906401262606996 0.31413329577009247 1.9957075595479266 -5.4626386589487703 0.77671847275696537 1.8927586346240448 -5.4874008167344801 0.33863998386279215 1.8964156001810473 -4.7399990239025911 1.8367360193204221 1.9813818711509616 -5.2057748999300619 2.0127008100263759 1.8820841397583807 -4.8349772425304414 1.4626918875237989 1.9849178149359783 -4.9299554611582916 1.0886477557271756 1.9884537587209949 -5.3130038245722906 1.5983859769717761 1.8856134422610291 -5.4241628440071281 1.1711520784263449 1.8891406142032654 -4.4178418123165795 2.560420769101778 1.9745681280904317 -4.5854044090311303 2.2109242221485306 1.977960906130974 -4.8518781901138359 2.8017236308776408 1.8753232262013342 -5.0460566225515588 2.4029100097494154 1.8786709996966728 -3.7539982104697187 3.5462353794844717 1.9648891629561616 -3.9881390331968594 3.2358276087708986 1.9680726294780309 -4.12035424063055 3.8811693862273904 1.8658158270611305 -4.3905597470066091 3.5275952095696979 1.8689005755246118 -4.2347153337944006 2.910535612506135 1.9712220569870409 -4.6607652533826682 3.1740210329120053 1.871985323988093 -3.1633378759141171 4.1052463512487254 1.9591705685354288 -3.4851409246176344 4.4812716263455865 1.8602682783518398 -3.4562734030434887 3.8463871659791793 1.9620216879034105 -3.822090634456869 4.1874467472008696 1.86294081855428 -2.1448827420389764 4.7673830162779858 1.9521052863599921 -2.4864199374836522 4.5720329247794611 1.9543606498851023 -2.365735500709893 5.2072956253335425 1.853751374162008 -2.7591944827038706 4.9860502992405555 1.8556793022154625 -2.8611578677870093 4.3601244504707122 1.9564066389067476 -3.1526534646978486 4.7648049731475686 1.8576072302689173 -1.3496130725916646 5.0503992950797878 1.9502753105877559 -1.5081407734424732 5.5136085667741623 1.8524801995531606 -1.7435187566476489 4.9268751061950109 1.9510469262117418 -1.949858227149996 5.3783028778322093 1.8527311749514426 -0.074131946901460966 5.2009578836812729 1.958574660913315 -0.090991779041123474 5.6793206894064046 1.8630920791213397 -0.49313528545525698 5.1784646450910223 1.9548400835559161 -0.57769167772849195 5.6572182762241709 1.8579535077370644 -0.95097896779642754 5.1561956393595496 1.9502999761897295 -1.0655182868901008 5.6351223677606397 1.8527915689206369 0.88364777036316489 5.3062136329169425 1.9217786380829527 0.38591734393716504 5.0273179748849941 1.9870055492032006 0.40789003680066999 5.5210403972143416 1.8883675828470989 1.8434531638672362 5.1139432748987019 1.9094684659593482 1.319402109884684 4.9845334801072889 1.9646262096122089 1.4052309231303644 5.4953658766394247 1.8619403384503834 2.5796378404939855 4.5228549713448754 1.9542464149456027 2.2093266553064543 4.7672386976176586 1.9460587987036011 3.5739531149142101 3.7559369197678514 1.9610750341760412 3.2637761863716568 4.0097586696944019 1.9611884220388849 3.9191297464006101 4.1520385875474499 1.8561070818196435 3.564268654705812 4.4490381055038322 1.8552151926775893 2.931284673328205 4.2851427335436529 1.9607997900116798 3.2094075630110144 4.7460376234602144 1.8543233035355351 4.1273670910943885 3.1437389287638831 1.9582379281064872 3.8708227105015691 3.4416025145827698 1.9601065237150082 4.5201788018600624 3.4863961961245113 1.8540977450906599 4.2284440426537406 3.8311629509083338 1.8554561552518547 4.7815429550992299 2.1248989178267497 1.9514921420445472 4.5867663527595237 2.4627468713414604 1.9539940160458356 5.2407007792411591 2.3618275577944927 1.848231126662738 5.0203230559941954 2.7509814048307986 1.8504117502883943 4.3774870143097369 2.8296590145582967 1.9563139054598109 4.7999453327472308 3.140135251867104 1.8525923739140506 5.070393123725168 1.3532918174174076 1.9462376824665879 4.9413028111438528 1.7318268174223044 1.948965737248765 5.2965850900015754 0.16110835294931231 1.937849258386966 5.2442450326915484 0.54474848580916668 1.940744388557373 5.1879665604204348 0.97697446846121883 1.943471065101448 5.2748410380366977 -0.67030424795768706 1.9321986819015911 5.301415006889175 -0.25566174085878129 1.9350361178029396 5.0340181337352892 -1.86280533213689 1.9236327856068631 5.1349994386111932 -1.4801472438226642 1.9265203163337625 5.2492436330104271 -1.0561347755088644 1.9292704828708593 4.5341386297920048 -2.9732744248957577 1.9151688291271709 4.700649021410177 -2.6310152410081518 1.9180651766233312 4.8924605208846215 -2.2431351068674852 1.9208000216778072 4.0319977159617268 -3.6424070729900584 1.9097422611697537 4.2828972997865016 -3.3151551001585187 1.9124722419451539 3.1650332722238192 -4.4764587800809386 1.9016012967335254 3.4611052814994814 -4.2157861315380503 1.9043349022714258 3.7806937552006201 -3.9365557794121693 1.9069539019387396 2.1218316595603066 -5.1131622192234145 1.8933253346321055 2.2323964753395318 -4.4688806082572556 1.9964778825525105 2.5608607821102543 -4.2767691996316071 1.9993940829518906 2.458679925933402 -4.9168364856367397 1.8961944708275456 2.8300988754276553 -4.7031332717535257 1.8988695410019254 1.1150507330870421 -4.9292498585539413 1.9870568015955232 1.26435652371005 -5.4051569089253144 1.8873680690566657 1.5051955597017599 -4.7938696653229167 1.990314301934287 1.6898267549336787 -5.2603776072755881 1.8903737195858743 1.8970882133769083 -4.6580244238859336 1.9935593412717638 0.66461830485619322 -5.0177942379123044 1.9834398636525645 0.20494960462107881 -5.0824634465022989 1.979581800505078 0.27783556294721323 -5.5745148743443158 1.8802787657797493 0.80134659632149341 -5.5047098666294723 1.8839076576406284 -0.92404171391675427 -6.0030355029297748 1.6281429098779938 -0.24023611343864115 -6.0498642214725251 1.6418541056943725 -2.2457475981576414 -5.7026731650541791 1.5983839859925884 -1.5980004103303369 -5.8755195191208243 1.6135763100640004 -3.2509087013555376 -5.2327833547717182 1.5726376474311374 -2.7630129012533535 -5.4718815441707074 1.5854795440976028 -3.8089145414773897 -4.3217120421047222 1.8346844355768464 -3.4437964459400034 -4.598400379152908 1.8465989652148489 -4.0695734500996696 -4.6585338298768848 1.5488463440465361 -3.6762513006051054 -4.9591101897929608 1.5603760010650054 -4.7352214524055638 -3.3855873765030537 1.8003812169565021 -5.0666140708392478 -3.6531677513345731 1.5144127862744079 -4.4489889224680184 -3.707936490879383 1.8116371814105927 -4.1627563925304729 -4.0302856052557123 1.8228931458646833 -4.7519435807390753 -4.0100354290509799 1.5257254821382373 -4.4343298721443452 -4.3704756440888772 1.5370440494827711 -5.4201964612477065 -2.2857086002686624 1.7671513646599388 -5.798979174976906 -2.4808644295407172 1.481094844825213 -5.2045084651393125 -2.6543459914267107 1.7781929759374657 -4.9888204690309186 -3.022983382584759 1.7892345872149924 -5.5670371076244649 -2.8798249445539144 1.4921637083174286 -5.3295258850212059 -3.2891751140668082 1.5032419092742249 -5.717046310761801 -1.4454705753018309 1.7451236343531358 -5.5754769812379763 -1.8557038207976952 1.7561273843824829 -6.1196999551182536 -1.5860352126053894 1.459022181574521 -5.9645509653506261 -2.0408699797164727 1.470058015900545 -5.9557812691555858 -0.12291709081310875 1.7124390721104283 -5.8966584100298221 -0.55835759190486378 1.7232874287716868 -6.3797414320771217 -0.16722400066514798 1.4262421167489658 -6.3157689913530097 -0.65124619133557982 1.4371337064485412 -5.8355851148536431 -1.0133369906979328 1.7341531731755355 -6.2517965506288968 -1.1352683820060117 1.4480252961481164 -5.9209425153490933 0.79741306901846531 1.69132910284942 -5.9493070208786838 0.34942977692374139 1.7018582602150285 -6.3809710946005085 0.3161013805722076 1.4156228842195753 -5.6374138627262207 2.1413078091591582 1.6606685161019394 -5.7518059581210075 1.7121070091095616 1.6708229499028298 -5.8784546204781156 1.2430762436591773 1.6808654092560529 -5.2489997628456688 3.0031573471412027 1.6414490077605595 -5.4601002088843744 2.5781917946991086 1.650951767289097 -4.4599999292083785 4.1570321140746112 1.614635013533507 -4.7418309189345198 3.7930597160779373 1.6233924667385995 -5.045836362327818 3.402697971730583 1.6318814490160696 -3.4180278383573084 5.1102128258794357 1.5919399451958116 -3.7578518195099773 4.8165659258547171 1.5996008005929159 -4.1326342113482593 4.4952987834750191 1.6067066369589083 -2.5600110803122518 5.5854783580735505 1.5824655436931112 -2.9786694904729938 5.3533003859858947 1.5874396851580026 -1.6229965099770243 5.9177598702628158 1.581565093311285 -2.1162460984466116 5.7701021828377392 1.5803006904428174 -0.12928319692132434 6.0989690059056114 1.6163451327028941 -0.62794051599126077 6.0731959083264684 1.6007496017002558 -1.1754739387736481 6.0475708475803014 1.5818386265091577 0.93204388807680139 5.7819192518055527 1.7753614434809122 1.0023152269490718 6.1980152370446842 1.4927104484272482 0.4369919455872362 5.9673256043385674 1.6840561743236198 1.9876718143263035 5.5908040668313559 1.7205590874780783 2.131606863240739 6.0105906096664308 1.4227928369034315 1.5221999511491817 5.927304716062852 1.5950778229044047 2.8104027432405023 5.0152189469696697 1.8408852399218882 2.4076570966443609 5.2764546050235301 1.8136686962625035 3.067037062839121 5.3921418772555922 1.5364719375556779 2.6064985066828923 5.6905300813807411 1.5055477032796269 4.247633361414592 4.4707447072528961 1.5704677756729355 3.8746731331661994 4.7836812685063919 1.5669094489069393 3.4806949531977081 5.1161320673964656 1.5621754385041637 4.9024557461343337 3.7299967797621085 1.5668878255420782 4.5811398125950351 4.1151751451130778 1.5695909338038541 5.6610054059845467 2.5167049750079244 1.5514499818755487 5.4287747381027067 2.9327554688566 1.5572807350423608 5.1864857080999469 3.3687650681448544 1.5627502863659293 5.5535348985661823 1.523749758693286 1.8349232115776135 5.4129819466772755 1.9496113726403685 1.8422279609235304 5.9920439781011314 1.6008254019652801 1.5381586470762216 5.8383640637012482 2.0729128538740662 1.5448880419148026 5.7987670805386093 0.20298665411208761 1.8120832327047751 6.2434384812820625 0.18395259452518137 1.5162159304738096 5.7434115150414158 0.64685271441012715 1.8198598794384446 6.1847651179548899 0.66708768128855578 1.5236251700326719 5.6878803325775236 1.0927973544367893 1.8276170786539441 6.1253114081882218 1.1594588476911869 1.5309479953808447 5.7417880714363179 -1.1408595358512164 1.7884341140966877 5.7736509956589979 -0.69668106559017395 1.7963753080642972 5.8055139198816779 -0.25250259532913139 1.8043165020319065 6.2074579406815173 -0.7796493732433214 1.5010546423932833 6.2446192102688629 -0.28793302899649081 1.5085840556110368 5.5024956627321195 -2.0112132250538339 1.7727090840777748 5.6196399766065683 -1.5843211723181163 1.7806452389566774 5.9062138979187688 -2.1911294934002279 1.4782539773899528 6.0376385542175113 -1.7192206503328056 1.4857887951238735 6.1690632105162528 -1.2473118072653833 1.4933236128577942 4.9441222162181084 -3.2329033535176768 1.7492619259007569 5.2987004337816526 -3.4975849125577714 1.4555326865554346 5.1413690596227353 -2.8390419637649678 1.7571233430357858 5.5158264238476269 -3.0674872502692612 1.4630918465584748 5.3399326121772868 -2.4427804392167443 1.7649647399587753 5.7370724176281387 -2.6298795283191461 1.4705883630020224 4.4003799550218679 -3.9492615519294181 1.7340758678880217 4.6673528005068903 -3.6058523675232674 1.7417861446276053 4.7115587755072514 -4.2584346972698759 1.4408825795672506 5.0092267756758897 -3.8785813305569841 1.4481848186651645 3.4440416087958297 -4.8583337363415131 1.7115869869766216 3.7674802160484191 -4.5783062983579761 1.7191584000223592 3.6785475877522607 -5.2290546918232055 1.4192945022394079 4.0384292788552125 -4.9199489605004656 1.4264352564442619 4.1091649153204921 -4.2837201249442769 1.7265141935318351 4.398310969958164 -4.6108432291777248 1.4335760106491162 2.2989412274578829 -5.5454582363117702 1.6887916874409987 2.674578030805574 -5.3316013383354335 1.696533723657623 3.0617173953302181 -5.11178062215639 1.7041665536153574 1.3906413032760636 -5.846882993503689 1.6723897014571865 1.8281228980170725 -5.7008721452080851 1.6809364139042351 0.35397113042840389 -6.0213906323197266 1.6533946651051987 0.89394631285819481 -5.9532417268340545 1.6633946212482689 -0.95052270420543417 -6.3965652929881891 1.3005163542257292 -0.21786311397794114 -6.4547915013530757 1.3213707516412103 -0.25377178427300201 -6.7469907089720911 0.87877069506055827 -1.0067704891608165 -6.6858707471225918 0.85924906329805906 -2.3756636700950984 -6.0599795245230661 1.2558129887521741 -1.6741987874452819 -6.2567412658329076 1.2788748769499061 -2.4653057201323056 -6.338145193405099 0.81637430713515691 -1.7394312703977257 -6.5432174256911049 0.83813247903468802 -3.4085412944088471 -5.5640002880899431 1.2180246021501286 -2.9138621828780957 -5.81417256707467 1.2369097142947654 -3.5209874207900373 -5.8342779065152168 0.77984816884549424 -3.0135933578034253 -6.0920835328610758 0.79762310379732915 -4.6420139141321233 -4.6621697570283489 1.1654155197949396 -4.2510184911365201 -4.9679496216570538 1.1829711894154125 -3.8552506014835659 -5.2778775616647451 1.2002578435810569 -5.3092139930423921 -3.8903170453444487 1.1303751086970939 -4.9914119693806684 -4.2593945591395048 1.1477054292235749 -6.0823429289540503 -2.634300710720586 1.0794256643889684 -5.8477629384819538 -3.0492919018746689 1.0963523495656451 -5.5987537769047488 -3.4913308956970646 1.1132416594900989 -6.4152615451905808 -1.6847972181234994 1.0461229251630035 -6.2585331325654519 -2.1633130166643877 1.0627764322692406 -6.6754052003339792 -0.18437742582660804 0.99613490267839855 -6.614647522920313 -0.68862749818099223 1.0127373193301432 -6.551789031871956 -1.2143009016739226 1.0293259667393424 -6.3441115379259854 0.80543947808351546 1.4004046203552374 -6.6315389107696028 0.84509951611808753 0.96439315708240791 -6.6723558755913563 0.32417950394471029 0.98009132164315538 -6.0302057842070536 2.248809914028906 1.3540373620441446 -6.3030759467999271 2.3464803313466813 0.91871466744050179 -6.1639025774812533 1.7731230881985791 1.3692935045790786 -6.4447407767104004 1.8452653585358507 0.93364822610931097 -6.2979333126603638 1.2963663729562593 1.3845361275638819 -6.5874077163693299 1.3408398074964083 0.94854121462869756 -5.6385318772615669 3.7514133704531138 0.87611024737255627 -5.3914831841371527 3.6004786960552635 1.3107636069728505 -5.6173237466974379 3.157770417465311 1.3250766883595331 -5.8431643092577232 2.7150621388753589 1.3393897697462158 -5.8734234843044844 3.2920840017991764 0.89020199106217701 -6.1151310058842174 2.8202380744649407 0.90412705577570329 -4.765487689054992 4.3905178010101693 1.2852444762207449 -5.0743421560220483 4.0006708186601569 1.2981303051101085 -4.9833064276814589 4.5797547369820224 0.85149463642069634 -5.3123211904472365 4.1659771945480815 0.8637748167296152 -3.6462909625561277 5.4044555847908429 1.2524660894936772 -3.8176640608380819 5.635499840762864 0.82038437039311907 -4.0278115444708904 5.0821452401575362 1.263166219001238 -4.2207093505413438 5.296196941160451 0.83030293931703325 -4.4114758524157969 4.7581425435181597 1.2737885099716275 -4.6270257996311006 4.9543116438672596 0.84010273268011604 -2.7463953424424234 5.9016336501751949 1.239630975604868 -3.1886643740814975 5.6601298607017458 1.2464030236759478 -2.8816860184970383 6.1537737738055336 0.80931514584630115 -3.3536244843640364 5.8975222504041431 0.81461382319570119 -1.3455841646888642 6.6774259459952301 0.81692557698276458 -1.2744003302611948 6.4033838275914174 1.2423722703639228 -1.7670989913158823 6.2552467911588314 1.2404705556818376 -1.8662026050971363 6.5224657724156785 0.81265477814149978 -2.2670342277241726 6.1053412541415284 1.2379547940253903 -2.3921298272339051 6.3662082194636715 0.80793351189007956 -0.1692461466088826 6.4724559202785361 1.3021003576902628 -0.18228790081223714 6.7501544353561451 0.88457276863101608 -0.70980258387497375 6.4380001078770164 1.2739875916834655 -0.76369267530112372 6.7156805545678857 0.8504658845188986 1.0486543418135785 6.5097479105303133 1.1166617182462943 0.40900791025200267 6.3825212809069853 1.4013555015025099 0.43876651373020437 6.658405694488013 0.98407879677610133 2.3082644548110793 6.2592383249595285 0.99848394409962071 1.633323716430457 6.2826943478960171 1.2593697618390596 1.719850497163889 6.5446126914347778 0.84467242833088063 3.2857107083610506 5.6845178577846136 1.1452608502132715 2.8068926371921661 5.9739636891885795 1.1008144097074324 4.5402146338576852 4.718240552941988 1.1973534270938513 4.1463478381034413 5.0474834568673552 1.1903729348158656 3.7343630407531037 5.3922964755696032 1.1825774732316807 5.2202052441951441 3.9332576461966862 1.1928802083247965 4.8961576552080688 4.3240402546964853 1.1967636098981453 6.0165006817967042 2.6269798740354888 1.171940383569732 5.7754456194775763 3.0663840468917001 1.180148219320013 5.5250468319133255 3.5238167193034999 1.1879678431142897 6.3507030966741143 1.65376840422866 1.1525739109806601 6.1971469202861238 2.1369919677066287 1.1626071325729741 6.5963223466190346 0.14415490263335473 1.1204196698918711 6.5400798498688388 0.64018495854286661 1.1314762945983121 6.4811110432451375 1.165523949350477 1.1422929112494056 6.5385279205747286 -0.88240136914654466 1.0980955433491613 6.5812528319238668 -0.3723585134833578 1.1093349407965418 6.1967265813101147 -2.3639194215870005 1.0641482663472122 6.3342443436478453 -1.8845149879627834 1.0755285813358191 6.4798307478986459 -1.3789033821660304 1.0867379564416337 5.7531359932586756 -3.3036684955292861 1.0415239139160557 5.9940311033912508 -2.8370526649035472 1.0528187986184909 4.8891671405597341 -4.529807232323555 1.0085820250345521 5.2003359326686347 -4.1392272436031323 1.0194767854856754 5.5191935343280676 -3.7394593107800409 1.0301989642481799 3.7827997124690098 -5.5300310561345718 0.97625238999662312 4.1542072291226759 -5.2159291705744666 0.98705844450702063 4.544960329989614 -4.8860905042154288 0.99770206450649268 2.853143978772303 -5.7238867927384529 1.3996971244212566 2.8722781520317229 -6.0496778298816194 0.95404429339396035 3.2776856019213323 -5.4885395671270363 1.4108709902807219 3.3341070959504009 -5.7944367236067977 0.96516960762434112 1.47245502492272 -6.2583150015115132 1.3646801148734646 1.4682927609840661 -6.568130993991411 0.92064339596269873 1.9482412864624492 -6.105688286945723 1.3766224633923547 1.9485027597146887 -6.4146227935095288 0.93192312881213801 2.424216139471921 -5.9530239931302402 1.3885365634738753 2.4305848042923208 -6.2607415640756061 0.94292245465306146 0.95098162629095362 -6.3623561258394208 1.3516463445153315 0.3947306203832065 -6.4267391411576362 1.337283309567953 0.37029037542703469 -6.7249281389164057 0.89461449774286272 0.93322124939810214 -6.6606520184936713 0.90783292190522813 -1.0736708166601132 -6.825722132672901 0.34452619891557584 -0.39238830428021376 -6.8886543126544462 0.36548161159481768 -2.5243776712363815 -6.453045921430915 0.29463833290903302 -1.8035072373871786 -6.6664309536812798 0.32020428646386834 -3.6055535535118706 -5.9153860702179735 0.25128063478539286 -3.0858227534877614 -6.1884156950101783 0.27254193571952778 -4.7882521483512654 -4.8975815107720297 0.72125837427545936 -4.8728576927585472 -4.9638216478258963 0.19145237805205614 -4.3852403602806378 -5.2231222941888529 0.74157386191872154 -3.982228572210011 -5.5486630776056751 0.76188934956198373 -4.4685686515946212 -5.2905103458868377 0.21137853776665738 -4.0626371331073114 -5.6186751991295818 0.23080404314928518 -5.496094138702313 -4.0724054154459388 0.678176980007418 -5.6345144710355486 -4.069503554299148 0.14694674231706598 -5.1488147319633892 -4.4888350043572363 0.69974999823434325 -5.2552587554971799 -4.5246447657568005 0.16932614564335524 -6.3039206298548338 -2.7254270004496632 0.61617194465005887 -6.4433111541495309 -2.6873702571442841 0.085789375339589843 -6.0560825454863219 -3.1804954045045579 0.63666107216256163 -5.808244461117809 -3.635563808559453 0.65715019967506449 -6.1895138727156116 -3.1536979491040054 0.10601556892657969 -5.9334367555271426 -3.6243331554577729 0.12614117074627448 -6.6342483849653311 -1.7350645209947673 0.57614520805302594 -6.4799281599718777 -2.2300971213442478 0.59622491469969385 -6.7640850987729841 -1.6683073183586079 0.046390294616029122 -6.6051700133480766 -2.1787554538726823 0.066076545461577887 -6.8826417115810559 -0.14954380586031057 0.51595338423832304 -6.8261023770808196 -0.68297322729147647 0.53606838384437139 -6.9409565467253111 -0.5861132850548838 0.0066176544007628471 -6.7685046468305323 -1.2273261984816379 0.55609550557945975 -6.8822697101533885 -1.1417067653803312 0.026554348387261374 -6.8147817890231135 0.9148754443062308 0.47815450503699491 -6.8630642047904571 0.38650683236148053 0.4970439806511493 -6.443861163264871 2.4665129771969903 0.423892748134855 -6.5943110153398266 1.9582747494884616 0.44188797958549403 -6.7478790018812793 1.4400651640907043 0.45943191403569139 -5.9722910831594183 3.4406458485171569 0.39046012349187237 -6.2254084257612439 2.9601554430569039 0.40698938434940812 -5.0294554722861662 4.7448901506785797 0.34525595008550042 -5.3669328788293464 4.3290982558835402 0.3599159952149304 -5.7094518416135358 3.9073332696814997 0.3740310334160577 -4.221690386870308 5.4648421351907031 0.32179589198210018 -4.6408479704141179 5.1180139141462675 0.33286451547426177 -2.8375010172212125 6.3149910634299813 0.29996513568080796 -3.3164699488362168 6.0576727541137787 0.30577504147987977 -3.8016909576657278 5.7971999567676553 0.31075041871866144 -1.793167549520376 6.67154273144532 0.31065556240200559 -2.3258485935758504 6.5115989765381839 0.30271174684228741 -0.10384532866857654 6.908009941013364 0.41104627083304868 -0.67269643734129847 6.8599976490002517 0.37075389441160139 -1.2595507685435032 6.8116956878508024 0.32300349245315324 1.119399432999598 6.7514317831303066 0.69536649539919426 1.3250295612299285 6.8203755213973443 0.24694521650148191 0.52903365840456507 6.8384158711502865 0.5503874035208387 0.69652773430354498 6.913322686243518 0.090870768700070922 2.4920764303625123 6.4071172423280398 0.56403128645594824 1.9409731563708332 6.6081389707115799 0.40041310121894763 3.5003290072136379 5.8728275830317065 0.69146118432861126 3.7549623918571347 5.8500902098395793 0.18639184536514364 3.0058596905077 6.1484209571845003 0.64114440896279756 3.2516389996563153 6.1295663758122343 0.13986111899424597 2.7444731113988663 6.4107275976967308 0.09497346403623419 4.8115956442131305 4.8722350790068916 0.74542604158664927 4.3900549038239118 5.2206287288192499 0.73588183820148978 3.9685141634346941 5.5690223786316082 0.72633763481633029 4.6292955091924934 5.158186307144895 0.21301439879608772 4.1994599980727507 5.5131396066380631 0.20443743294850833 5.504685352868921 4.0428764076866663 0.73926123321062165 5.7253937415605893 3.9388437672763872 0.2107950614895864 5.1614447900657261 4.4599955485887373 0.74285277167604791 5.3787660712719996 4.3600511281771634 0.21451152853844499 5.0285370237433549 4.7856053314852636 0.21836082720216843 6.3179951543465487 2.657430444796308 0.71539033603985536 6.0637898737041169 3.1292513064436851 0.7243531406914 5.8095845930616843 3.6010721680910622 0.73331594534294464 6.2581539429886979 2.9885196423690434 0.19355777107547051 5.9991530611573713 3.4692542893620257 0.20265905872293308 6.6405061255945181 1.6350783801097881 0.69251616402482019 6.8049638709336691 1.4558426510370517 0.16033913504393674 6.4829724732235006 2.1465501008726853 0.7040233650617902 6.6448952703094415 1.9755730360161106 0.17198995771503287 6.4834584153721746 2.4997610871110001 0.18371830106927906 6.8656684962168271 0.04154532524221155 0.65475891777283779 6.810475008018261 0.57605302432312266 0.66757398223794884 6.7552815198196949 1.1105607234040342 0.68038904670306 6.9369252145401594 0.36878821957587926 0.13449297559844908 6.8804643229383622 0.91564860113513158 0.14756327995327906 6.7746016453210629 -1.0197132959250066 0.62824329521354683 6.8584244765310567 -1.2466800304698402 0.094454950077365443 6.8240132485274625 -0.49132427419116054 0.64146606812271623 6.9087082717840378 -0.70895646848543858 0.10791491247359687 6.9590870670039777 -0.17021617971609432 0.12140070976883022 6.3792766734113577 -2.567608951145643 0.58785407784544819 6.5307745496357459 -2.0590484965662896 0.60125553229835749 6.5668471004598858 -2.3047109285097802 0.066631202184646104 6.6829000934996472 -1.5483771918967295 0.61471814703016181 6.7244501648590447 -1.77561868895671 0.080627549520300823 5.8869354157436655 -3.5289079710953817 0.5605522055595733 6.1374883708055483 -3.0544808950900753 0.57406741183756005 5.8662770297274003 -3.7925420451908458 0.024786938481827753 6.1237093871509103 -3.3050475435646942 0.038771194689071156 6.3811417445744194 -2.8175530419385426 0.052755450896314567 4.954785658426438 -4.7809487047754571 0.52128242745174924 5.2797117323541176 -4.3810098553018708 0.53415037348507477 5.6068346795736161 -3.978352570467492 0.54715143652447884 5.5505370252410078 -4.2141057366849539 0.011465087865742138 4.1479104763775165 -5.4811474639208715 0.49456934010629916 4.5481438226974751 -5.1493742655614492 0.50749555713027472 2.7865489346494483 -6.3075437718057001 0.4544782312872433 3.2577807607303044 -6.0526457603301091 0.46792996279767218 3.7330480500988164 -5.795553705462849 0.48154672863865849 1.3786167199281296 -6.7755183474798244 0.41592868121481485 1.8642699079837821 -6.6254559094182275 0.42917980834283304 2.3300814091078177 -6.481528525194463 0.44186947935780851 0.20916751460839478 -6.9031620841873655 0.38326784184621937 0.78321763089557184 -6.8434125639086085 0.39940820943915661 -1.2212280707021179 -6.8406975466325131 -0.19617677562699429 -0.60393225880241475 -6.9052918181748106 -0.17709329282599248 -0.87838657749934479 -6.7685980308345881 -0.72840338871871968 -0.05688515723496617 -6.9625974416243634 -0.15986868905278365 -0.40296159549224608 -6.8184725082508129 -0.71307400630042428 -2.6351267561138059 -6.4295588918178392 -0.24577319513667023 -1.9153641856166077 -6.6531707871751102 -0.22027644984216763 -1.3768208529092132 -6.7080817106194353 -0.74456043334252331 -3.661320145780258 -5.8773637287958813 -0.28787752938876088 -3.1367643357926536 -6.1626158430012179 -0.2661755371508846 -4.5275396557918111 -5.2121190917454392 -0.32850870671115556 -4.1180909181556489 -5.5532602942315235 -0.30853348396651886 -5.6737682578566604 -3.9447835747886626 -0.39335648568968062 -5.2972604987487539 -4.4107215678559832 -0.37040424702243457 -4.9294023229137478 -4.8657653019601712 -0.34858876643936443 -6.1980513874199525 -3.00005780608562 -0.43384863118361555 -5.9491886467443456 -3.4740675121076459 -0.41379713078840424 -6.7311494249281347 -1.4716447132584407 -0.49399614986406776 -6.578146809494041 -1.9896708194189276 -0.47398818917043212 -6.4239902089479344 -2.5113512414886867 -0.4541999909738888 -6.9945808239061922 -0.027604459301739104 -0.013575697649354106 -6.855958683276187 -0.38603344862755362 -0.53300024539611435 -6.8059741550713282 -0.93279872076894266 -0.51355876568194936 -6.8862976088404642 1.0511495018841794 -0.051144138068402969 -6.7616095921504797 1.2304220352646074 -0.58922638355123635 -6.9431225152626741 0.51208579083888206 -0.032383288395767096 -6.8178948109840789 0.6961190396065936 -0.57082145970697484 -6.8738219723384928 0.16497455599640096 -0.55265267600670365 -6.4627685816249789 2.621651497284069 -0.10499325065657061 -6.6242781779420064 2.1013597519255285 -0.087199641241209297 -6.7857877742590338 1.5810680065669886 -0.069406031825847994 -6.463686440276172 2.2645292143763189 -0.62424774967125241 -6.6233496899318141 1.750032100324997 -0.60688227345725398 -5.9487923580611115 3.5905952615779348 -0.13807068022810454 -5.7605327662855377 3.7179434425953719 -0.67354016174385201 -6.2116853887861225 3.1057203567994653 -0.12148855991508936 -6.0179142425221066 3.2431740837304357 -0.65744823342443026 -6.2746456593525464 2.7695966218500865 -0.64141412072071413 -4.9570303906510373 4.8840135135222456 -0.1822206378140615 -5.3053184771538771 4.4641021811355523 -0.16786682559497995 -5.093058490184613 4.5560867973013179 -0.7019528874511215 -5.6530031426603058 4.044914694583599 -0.15354962683932347 -5.4346020117853584 4.1442660438645733 -0.68800831170513099 -4.119537084271971 5.5787159877165831 -0.20449467688966538 -4.5443597923725445 5.2329169365748305 -0.19338913936024982 -3.8944028294120017 5.627254071336214 -0.73645119576816576 -4.3113687239149261 5.2878015548260739 -0.72574156815051705 -4.7283346184178514 4.948349038315933 -0.71503194053286823 -2.7031069046730765 6.4041326028201428 -0.22286221976395704 -3.1900204098909377 6.145006680757735 -0.21780663167221362 -2.9529041969192509 6.1530332781901684 -0.74670067380070959 -3.6738942488000155 5.8874662186768383 -0.21292602267309552 -3.4294678415947639 5.8993057413573124 -0.74224087781985182 -1.6498771741740459 6.7366564480771114 -0.20601062497950978 -2.1817945950018389 6.5735500519545571 -0.21447525807272738 -1.4175644510425567 6.6994060258263772 -0.72675266122303195 -1.9397094853889949 6.5389454011688866 -0.73675769145163195 -2.4618545197354331 6.3784847765113959 -0.74676272168023183 -0.53052409911361875 6.9220333366945335 -0.12927602545643141 -0.3007895802825884 6.8458909149312852 -0.62582281248441607 -1.1049872990748 6.8559469592792928 -0.17706938692133972 -0.86147511360335871 6.7799519691610115 -0.67969699282131268 0.87684778663442908 6.8426919002485089 -0.35667028475826307 0.045642719407909885 6.9810512527175659 -0.072661805725356993 0.27640024333916402 6.8690913393891391 -0.52126277577413449 2.1450324844008954 6.6192545330421764 -0.04744204730925812 2.2596465030458246 6.4876954819235069 -0.51534475099807653 1.5097434286496645 6.7797106662874604 -0.20337548000812966 1.6742368925134363 6.6366019643273626 -0.65396657401761749 3.3632428892711927 6.0196184491561562 -0.36393126598446063 2.8524462034965707 6.283683333547696 -0.40385686579816588 4.7376962224294354 5.045302442758409 -0.30642838051147669 4.3045112634058702 5.3986275572811016 -0.31494357677216056 3.8803354532767496 5.7451829602301023 -0.32102242720476287 5.4602130947783545 4.2308322032101211 -0.31057508264140748 5.1146567920596304 4.6532483465726218 -0.306234034432667 6.3027920541575044 2.846014090111352 -0.33404129559673762 6.0476605699889419 3.3271193075199772 -0.32502130356464731 5.7973955725862467 3.7994976940211833 -0.31510181945757409 6.6512873825580083 1.8281984738483041 -0.35720271074432414 6.4967475602248488 2.3458916404608017 -0.34511405544483909 6.8987969383075001 0.2279270585054845 -0.39592412917648545 6.8479279572767959 0.77091869076346975 -0.38279761082079855 6.7981953746201933 1.3036589967056149 -0.36903397341287791 6.8331492725194085 -0.83790923669505979 -0.42392472616656596 6.8881939267332735 -0.30771018608659551 -0.40972447457833799 6.4520820286738774 -2.4101428022743989 -0.46681431943134616 6.6131673224708782 -1.8889466786684734 -0.45239804761066127 6.7727557564441803 -1.3730592787079565 -0.43743298523261503 5.9809418404616679 -3.3799461649745375 -0.4964660017845014 6.2373479303164263 -2.9065712944038267 -0.48139883778432896 5.2196384138454865 -4.6203388414891684 -0.0017483731898074394 5.0400994921839857 -4.6711966768409692 -0.53985974297514583 5.3770849400597731 -4.2650760566835082 -0.52544694038292927 5.7154448989612492 -3.8574232731776847 -0.51057687498622806 3.9971589527370823 -5.7203417788140127 -0.043637792236632611 4.4322170431600938 -5.366933565847992 -0.029444191437998264 4.8672751335831057 -5.0135253528819712 -0.015250590639363902 4.2211711024454681 -5.4016761178404291 -0.57012270371776808 4.6560361037837001 -5.0488264130201088 -0.55436693515716817 3.0538227905288826 -6.2506285078887656 -0.07157598427900369 2.8290478228927425 -6.248719595941771 -0.6153457350732715 3.5310232900782363 -5.9986560468210293 -0.057780459730590095 3.3057967442946961 -5.9972955235839613 -0.60018240564561487 3.7825019376349198 -5.7459245538297603 -0.58488662637170552 1.6646738607550471 -6.7518703522343948 -0.11076628760889842 1.3698473624985112 -6.7279337439764602 -0.6588189636180275 2.1170364545818252 -6.6172258539748459 -0.098302930830899304 1.8487449455681404 -6.5855705953515171 -0.64475719489995631 2.573341215386002 -6.481434635499884 -0.085602106205871359 2.3422765433380923 -6.4389506203197469 -0.62981390391654291 0.53765338995875755 -6.9186306686211676 -0.14285232666213585 0.093085969605911506 -6.8520998942370124 -0.69745255064430511 1.1487938737764989 -6.8618745242843273 -0.12557869200578781 0.73698968287130229 -6.7925587157304337 -0.67795752431234291 -0.98030599751697478 -6.4600503100274977 -1.2011141709997186 -0.48904122894689733 -6.5182203458828774 -1.1864703634553042 -2.0888076391179116 -6.4850135935851769 -0.76937506355415985 -2.0653400537307331 -6.1684488144371343 -1.2351855470324005 -1.4881605453906901 -6.3566993546951709 -1.2162398275365938 -3.6962584081751064 -5.7075898688961484 -0.82362020229517829 -3.5825561518886664 -5.4183238328401746 -1.287870977187352 -3.2153112283894991 -5.9774177617430277 -0.80670188330173975 -2.7343640486038918 -6.2472456545899071 -0.78978356430830121 -3.115957323219118 -5.680332952322904 -1.2711508300585967 -2.6608176443134659 -5.9360976961122134 -1.2545889506679273 -4.5271762935196618 -5.0211699442788866 -0.8576401340018408 -4.1166648407888724 -5.3727320598324226 -0.84059330169311297 -4.3865442107843586 -4.7375205010449015 -1.3215469680631231 -3.9868765666838657 -5.0800016506721972 -1.3047113393901086 -5.2633480820739003 -4.1950951447228304 -0.89292613171056812 -5.0735434993974957 -3.9418179133647469 -1.3552062054948577 -4.9072918397355609 -4.6481672672750385 -0.8745931599041743 -4.7494388060871344 -4.3543293358313191 -1.3384260376327204 -6.0915219748496776 -2.8076463007799335 -0.94436553664657985 -5.8520569692667284 -3.2792237417211796 -0.92765661175766467 -5.8491180147101263 -2.6122695444608177 -1.4043640806558277 -5.619600300905728 -3.0643747613015715 -1.3882663414612451 -5.6182677536683059 -3.7396905952798036 -0.91129642114937637 -5.3900825871013298 -3.5164799781423253 -1.3721686022666624 -6.4238806540932618 -1.8141755236623314 -0.97723993718395163 -6.2800144010239354 -2.3263262498828579 -0.96070049373230182 -6.6494122809449561 -0.24633459810704628 -1.025903394836456 -6.6070746396455373 -0.78722775170576842 -1.0095369864477415 -6.5674764385371454 -1.2950032030506449 -0.99395235818529182 -6.5762262506892961 0.78125229790628392 -1.0565856617608917 -6.6365651583546326 0.27112650150008893 -1.0414760765157889 -6.1954110631113712 2.2842534683262921 -1.1008190959665067 -6.3574832168884345 1.783418326558339 -1.0862188243636848 -6.5122934258186076 1.3058188347696105 -1.0719257809005955 -5.485466998469497 3.6630694166028883 -1.1417441363829519 -5.7450353408744776 3.1966084343289323 -1.128163409935226 -5.9905467663171468 2.7561214189342627 -1.1148128484304163 -4.8300466525774288 4.4374343415003015 -1.1654355387338959 -5.1624217146409075 4.0448477313285736 -1.1535926090095945 -3.6592336465700805 5.4436217814811121 -1.1945880768877577 -4.0722784160642291 5.1125254678119445 -1.1854267656449811 -4.4639739480807892 4.7991023463627673 -1.1760883772179311 -2.7589970086738291 5.9223118499786134 -1.203272569492168 -3.213893505488584 5.6823216606391531 -1.1990854483749314 -1.7873860970113018 6.281715366753768 -1.1935236289856388 -2.276656721754819 6.1277463838468922 -1.2015111100597418 -0.17875016329908539 6.6157798395804521 -1.0862000354463686 -0.74315119748567848 6.5280293930606899 -1.1343335655853162 -1.2681016663032167 6.4431909615081882 -1.18392408121276 1.0666632885614864 6.7194684133694453 -0.80013823593936573 1.038836542297463 6.4464985902305365 -1.2127681866481694 0.38928090055560732 6.6837342945795086 -0.95346618595149357 0.45877524812042331 6.3912351758727235 -1.3809783910397342 2.2910950045783052 6.2944692126668809 -0.95527867097212371 2.1914870060264215 6.031954821089009 -1.3765442969858404 1.6500102781636115 6.4013018879291836 -1.0813981797524272 3.3891470299134507 5.8520640719303092 -0.84972162054002998 2.8629425322119366 6.1084554857015014 -0.88270707012465 3.2238349558774617 5.6171286250696379 -1.2785017497431312 2.7382916284425542 5.8567575756044556 -1.3048937764753157 4.7371880985071968 4.8859938589361791 -0.81442324745458461 4.5189624053940323 4.6914349114164446 -1.2487899821854869 4.3105452421709396 5.2318124945971203 -0.81944300287389427 3.8839023858346819 5.5776311302580623 -0.82446275829320392 4.1093664847050659 5.0247908484182604 -1.2520341976278371 3.7108005688429686 5.3500829533501868 -1.2541295723095154 5.4266720669001867 4.0708667813041357 -0.82158135268688115 5.0883674028674077 4.4876196894479339 -0.81726199620301332 5.1764638108075554 3.9179547151578209 -1.2583286338260318 4.8600149764212874 4.309837313723615 -1.2523291380286667 6.2231953361406083 2.7027200308346746 -0.84411361442488386 5.9454566816585457 2.603118557921571 -1.2830797458978667 5.9778988063477598 3.1734060433017905 -0.83577083463740287 5.7326022765549114 3.6440920557689069 -0.82742805484992188 5.7115065651106223 3.0538126660772749 -1.2738609380335315 5.4818425149423877 3.4969549050135651 -1.264311213745934 6.5362212264940149 1.7013649651063831 -0.86481826313386478 6.3887121650194301 2.2114958218330956 -0.85440291777192834 6.2465860737499046 1.6474961890346038 -1.3051459868068094 6.1092695332050591 2.126303821900748 -1.2937366248071607 6.7443534568735029 0.14340891654791466 -0.89898541767038931 6.6999904203741787 0.67200962057300195 -0.88746216891812568 6.447238230856871 0.15895205312228322 -1.3413586752221371 6.4066807489123656 0.65542432333910816 -1.3288758327549783 6.6563234012479029 1.1947341907055802 -0.87576341515417089 6.3661232669678602 1.1518965935559331 -1.3163929902878193 6.6545417875743142 -0.88864367245250842 -0.92354838845125542 6.7141745416639305 -0.36497813223945724 -0.91149143289019241 6.3630354493279855 -0.83909208436620575 -1.3671224970436382 6.420464016331219 -0.34496822452464532 -1.3540098141203067 6.2554194263562879 -2.405506930542435 -0.96152909095921357 6.4186496057517282 -1.8961708611120358 -0.94897334115651377 5.9815359456860069 -2.2871089209783326 -1.4073585453975974 6.1354456675032925 -1.8108910264094238 -1.3937582580747099 6.5772164537233015 -1.4034049036356555 -0.93589497488349005 6.2893553893205789 -1.3346731318405149 -1.3801579707518223 5.7798719437201882 -3.3293587232183777 -0.98785267103831231 6.0367038373621718 -2.8669709141636823 -0.97501371991106645 4.8419730677542798 -4.5679549748649464 -1.0270505317686802 5.1815282586708085 -4.1673424650961097 -1.0145177304048481 5.5100110992555642 -3.7815112801005237 -1.0007545856044129 4.0431006704158126 -5.2489208328699766 -1.0547050327940055 4.4628697729850959 -4.9163287341644786 -1.0408673368380974 2.6731211132288095 -6.0490991351557231 -1.095995951505794 3.1469802504372826 -5.8055638369407099 -1.0830678390063941 3.6050134509010592 -5.5719004734502908 -1.0682659716747069 1.695366256821446 -6.3576181276141757 -1.1244632604007152 2.1866638882726339 -6.2183958075694417 -1.1103440590885409 0.016213512225526361 -6.5751169042975768 -1.1710147764871148 0.63427678617398675 -6.5252504333734915 -1.1545409659431276 1.1930535674097484 -6.4813895132728714 -1.1378182085657216 -0.97257842443188092 -6.0700389051635328 -1.5801784741144407 -0.47317099933206347 -6.1345539107209177 -1.5699368541803993 -1.9934503402798163 -5.7713202107821946 -1.6034510634458317 -1.4618717860954156 -5.9515043249698296 -1.5912875429297899 -3.3740868633308008 -5.0578375014511687 -1.6372426806236 -2.9252072049056603 -5.3162046527068032 -1.6263261456028935 -2.5012217203319 -5.5614269044144251 -1.6153140916033228 -4.1133069371545226 -4.4103666225292946 -1.6590193690672572 -3.7317777188370287 -4.7446622663760332 -1.6480253699910412 -4.7282751120755595 -3.6759848914971633 -1.6802947821443159 -4.4410054435915143 -4.0507822366596482 -1.6697492802705385 -5.4418070499549609 -2.4198939074585026 -1.7118852185325952 -5.2285165996744949 -2.8519212051178622 -1.7014441797671369 -5.025337428766532 -3.2644359898724611 -1.6911916617305709 -6.1480741552902991 -1.6474571864976797 -1.4288205575898765 -6.0164231127243566 -2.1355031071829487 -1.418286068426682 -5.7101741624811471 -1.5342680012683458 -1.7322323314067014 -5.5920036871570886 -1.9756061029461764 -1.7221399437465261 -6.3299773892141724 -0.1634346303450902 -1.4597427650254475 -5.8788116514298849 -0.14482312454585328 -1.762426893611351 -6.2960309828878946 -0.66376550622533359 -1.4494983278031959 -6.2620845765616169 -1.164096382105577 -1.4392538905809444 -5.8481480441708973 -0.60759756456983394 -1.7524605436554115 -5.8183864799167377 -1.0600522988926622 -1.7425706061353741 -6.2365019372002379 0.81163726577691986 -1.4795429458944991 -6.29986148151304 0.31834406470209059 -1.4696710043044297 -5.7885652015269473 0.76511712666983289 -1.7819061872683479 -5.8470684150582724 0.31782284715878639 -1.7722519599567295 -5.8491288372117838 2.2254200661346246 -1.5082479302627039 -6.0071308050667636 1.7531764549152955 -1.4987720476873561 -5.4239232148288172 2.0775015627998283 -1.8102723217011887 -5.5678036540620548 1.6511487686166475 -1.8009253899997666 -6.1608841366207701 1.2947396627991683 -1.4893349615751019 -5.7116840932952933 1.2247959744334667 -1.7915784582983447 -5.4033095246289049 3.0786138322767798 -1.526195151412987 -5.6490586326770948 2.6468133388553472 -1.5173445890174497 -5.0002591948415471 2.8784427577717593 -1.8282086402887399 -5.2235188307895335 2.4888044749757388 -1.8193304259130365 -4.5229090966487524 4.2300280438570175 -1.5508928201245744 -4.846996705054786 3.8536497412977329 -1.5430028993568656 -4.470662825913287 3.6029756773694235 -1.8450951565242857 -5.1523479575883728 3.5004437852349772 -1.5349672943099892 -4.7647700178663275 3.2636759082714213 -1.8369721234379475 -3.7995943487881134 4.8499131424974271 -1.5645135470185927 -4.1812717154145096 4.5489779725186521 -1.5581300831715283 -2.5527302741798508 5.5980383910578446 -1.5773327277673104 -2.9986276085545223 5.3646278260911995 -1.5744155731017515 -3.407360401405517 5.1525840999733834 -1.5706090491283609 -1.6369200988983894 5.9285418744541003 -1.5719239311183257 -2.110279149007515 5.7775711089076118 -1.5766648602099436 -0.11023321143158282 6.2812712371452042 -1.4957883528643408 -0.098027346046746233 5.8169802365800471 -1.806820947411514 -0.64959732126922443 6.1764602007057539 -1.5303253763280185 -0.57044292083252568 5.7228136728305072 -1.8386514347779821 -1.1486753061144905 6.0780544509082208 -1.5632337480008225 1.0035779221188583 6.0951564526120148 -1.5613553931255855 0.41614551712671843 5.9696055617731441 -1.6839046558368074 2.0145452748654686 5.6618168103843542 -1.6696956838746697 1.5867976563208164 6.1034355297038809 -1.469323488988322 1.4691224314131424 5.7012017473449896 -1.7506940216847506 3.0042594908993716 5.3071303745431466 -1.6066791692605307 2.5442276053859709 5.5274130747190053 -1.621843359130827 4.2384719699001625 4.4387032423749133 -1.5909997543437127 3.8391383965600476 4.7637375986334902 -1.5923960099496799 3.4757736948600551 5.0626862704618585 -1.5920104035368079 4.8556634270829084 3.712121977415527 -1.598787001014045 4.5522666548458242 4.0921147126726867 -1.5943986793094673 5.5749062552641204 2.4707865247980734 -1.6169653115855431 5.3488805257509116 2.9136432147447615 -1.6106377256738631 5.1448090040544372 3.3180137307450761 -1.6034912686987104 5.8502591372715207 1.5835056448740221 -1.6326311656459715 5.7255132793837662 2.0356089781123767 -1.624665318026669 6.0318929650901127 0.18055810905076347 -1.657789515926694 5.9968308460968967 0.66444618023985413 -1.6493726726134923 5.9662381204186952 1.1110928170235574 -1.6404203294396156 5.9502040515048149 -0.73170450274471177 -1.6761014404821162 6.0084420372405267 -0.28207844416586558 -1.6667778867524561 5.5859440646073821 -2.0882072733460437 -1.7040872301237029 5.7359737539813453 -1.642014182336506 -1.6946562837849968 5.8803565556391018 -1.2161112504180354 -1.6848989053807777 5.5195736129339705 -3.1711724201482769 -1.4280565272262176 5.7672211722714204 -2.7370366471299756 -1.4188209495970225 5.1625199779902795 -2.9048515890307902 -1.7237703726731051 5.3886983778925792 -2.5134919346682052 -1.7137086803814059 4.6100530956259966 -4.3462741293248568 -1.4561506191173605 4.3126799767442572 -4.0097905118586521 -1.7538112312169696 4.937316238286984 -3.9694682236821137 -1.4467947027627936 5.2645793809479722 -3.5926623180393711 -1.4374387864082268 4.6160008430367769 -3.6641688761500602 -1.7435989551232942 4.916024866797132 -3.3228413027883903 -1.7332687586127262 3.8434094707159869 -4.985211728322299 -1.4756298947759445 4.2460704451075975 -4.6733784298914918 -1.4659649113479722 3.5991875611879314 -4.6097567597646867 -1.7745177655713948 3.9640134983231139 -4.3308266464820147 -1.7638911779409339 2.5331774344817877 -5.7299079603195944 -1.5054370045460213 2.9908971769457877 -5.5018542820772112 -1.4956060574403185 2.3794508887225487 -5.3034007031380348 -1.8066403437778715 2.7969841636762141 -5.0986638100197688 -1.7957218447440586 3.4383479854808461 -5.2797587917699413 -1.4854972058661233 3.2145174386298789 -4.8939269169015036 -1.7848033457102457 1.582277886188082 -6.0166961958096703 -1.5259344952855194 2.0723506519038413 -5.8834693360411352 -1.5160174369557267 1.4740719869574657 -5.5784217470084982 -1.8286156123869508 1.9285333858462423 -5.4579159953598957 -1.8174659044403922 0.01561471590854524 -6.196609830998371 -1.5585841250702817 0.56818596756703932 -6.1586865613513178 -1.5475590115799862 1.0928956677119199 -6.1238840494210995 -1.5362822390235913 1.0092846741773311 -5.6778754316479656 -1.8397980968360219 -0.91757720383375241 -5.6082759476152653 -1.861029991071089 -0.79904932273033813 -5.091518702261741 -1.9661414965757431 -0.43634933984975205 -5.675734544704814 -1.857039453041458 -0.37153714846050578 -5.1545083827136366 -1.961987528758671 -1.8513208783737363 -5.3225747064308484 -1.8691074020987752 -1.37761297350995 -5.4874657965472204 -1.8650537830910274 -1.6403384401031782 -4.8371689311287227 -1.9741914553277899 -1.2363881446199478 -4.9807991657795245 -1.9701569853355165 -2.785108563097185 -4.2341672591162816 -1.9857749895402017 -3.1054217180444637 -4.6592896623478923 -1.8806570118016162 -2.6942748094325877 -4.9005593715056044 -1.8768658710019717 -2.4172414819093953 -4.4523652050989551 -1.9819729573881579 -2.2854733140269072 -5.1405787795123725 -1.8730741399799704 -2.0571821583586232 -4.6664009640801822 -1.9781689604168224 -3.784201499132136 -4.0562458406281179 -1.8880163708972131 -3.4326083313913847 -4.36870797038506 -1.8843210556152714 -3.4047948234148997 -3.6877513847549506 -1.9930592057120105 -3.0990080558711455 -3.9622381788166061 -1.9894230651303559 -4.3458421056004504 -3.37471325188428 -1.8951950057331979 -4.0713949566702299 -3.7374167307499704 -1.8916080250203886 -3.6813465118196675 -3.3843642059412629 -1.9966393795142585 -4.9878716252036277 -2.2242565683378146 -1.905760280943344 -4.7888783764070348 -2.6339392333327312 -1.9022371486983596 -4.6086568767122911 -3.0079228945127867 -1.8987686200962168 -5.2276861087856581 -1.4137457968961378 -1.9126449482798495 -5.118669745656832 -1.8325226683463793 -1.9091986359228101 -5.3736563229147398 -0.14372004349709205 -1.9228594941127932 -5.3466490063792325 -0.59190216206422253 -1.9194511765904549 -5.32483658138446 -0.98468235389559988 -1.9160949188051941 -5.2884172315867479 0.66936226860682302 -1.9295166635690375 -5.3451140040588001 0.26301263865353924 -1.9261998342221422 -4.9491641814781335 1.8723007577291362 -1.9393117245568041 -5.0886749778239935 1.4681540143786032 -1.9360765704525131 -5.2172359890531874 1.1002110196753141 -1.9328351997525028 -4.5741814954822573 2.5752042291354784 -1.9456166271173507 -4.7713776883520138 2.2395419908336467 -1.9424823037446766 -4.1770953005649751 3.9394826535583585 -1.8496549530192774 -3.8193723161784185 3.548214374252149 -1.9545375804910421 -4.0894218330285694 3.2420807610885634 -1.9516310026275796 -4.3474741268427088 2.9509138687416678 -1.9486802907342888 -3.4960108407048835 4.5093018446624233 -1.8545591632390999 -3.8489358928070763 4.234927129525949 -1.8522008882309668 -3.2072160349027174 4.0648915356221913 -1.959841885080583 -3.5168080479802617 3.827680707689546 -1.9572361881604197 -2.3433073319836244 5.1857227935402861 -1.8596672899777831 -2.1603607510618716 4.6806690136974671 -1.9659323544963752 -2.7446085476646616 4.9790910972697207 -1.8582803192861312 -2.5166102630043898 4.5005429711856122 -1.9641179168165537 -3.1432912555597796 4.7739999700560087 -1.8568685032380587 -2.8674667224550738 4.3235898693217019 -1.9622523078887122 -1.4887121237624157 5.4879676558759192 -1.8585117542536187 -1.9297821590605222 5.3478871966101407 -1.859713555346034 -1.385938097288582 4.9554560930852283 -1.9663273335795826 -1.7689992759072981 4.8384565124767933 -1.966480203306717 -0.10929218944534272 5.2633513466892197 -1.9454749996030689 -1.0506319422454051 5.6201351420352381 -1.8560643542032076 -0.55788610295678565 5.1672303469151197 -1.9558061808921434 -0.96871393346777679 5.08184728480256 -1.9647413348871561 0.93527617773280847 5.6696457163151583 -1.84847604169567 0.81190814472970696 5.1732685791488464 -1.9496285158149713 0.36439465549093714 5.4909676980408628 -1.8952015395297621 1.8556608911413015 5.2456742409459842 -1.8835642114723421 1.668676269748598 4.7888289794501011 -1.9817931767737302 1.320741996653823 5.2577317891433246 -1.9122942988276859 2.7828025686424942 4.9412680815907759 -1.8613488744540763 2.3419777389310799 5.1500449253857301 -1.8660816399818165 2.5093655575857627 4.5304268384819784 -1.9595327709663501 2.1318847756410326 4.7134760953363957 -1.9628323398166994 3.9194891408852244 4.1410232766931472 -1.8577634350507854 3.5516063094168455 3.7987562447020675 -1.9572927784963943 3.5633247452160468 4.4349793419011059 -1.8575070335210735 3.2294459462879583 4.0679166933479243 -1.9565557461680787 3.2094571095849305 4.7272606180624592 -1.857218168382524 2.9223826868499279 4.3260683890209322 -1.9556053234721666 4.4974033948896084 3.4600099693686364 -1.8609624203174957 4.218268197889655 3.8145938065419931 -1.8591293324138516 4.0769820385568449 3.1831979036970162 -1.9610193188549376 3.8362321821064578 3.4942212189343169 -1.9587789326544929 5.1556807404740441 2.3107736715632305 -1.8680282509007395 4.6799810683690497 2.1327169990981001 -1.9686582249121694 4.9561768826565595 2.7108140564625507 -1.8655036245610124 4.505105609311701 2.489349980564723 -1.965882116026642 4.7593931061347652 3.1060603145767018 -1.8629512232540335 4.3336526454968984 2.839950834925292 -1.9630710597689784 5.4105220340840763 1.4810178597169636 -1.8737710706645179 5.2951278491332792 1.9113277544406229 -1.8708754803959911 4.9167299476635504 1.3697878112750317 -1.9746714659185016 4.8187870356128926 1.7465743020427826 -1.9715434606294735 5.5694201566719483 0.18834617202587112 -1.8830453689485969 5.5413525959138425 0.63278358253290135 -1.8799213102826255 5.0593919020438012 0.19365842949113654 -1.9843922232307516 5.0378695209406636 0.582409459337213 -1.9810572080782627 5.5158789884787049 1.05515164127661 -1.8767136463822602 5.0163471398375252 0.97116048918328957 -1.9777221929257738 5.4896116640591703 -0.66029002458886721 -1.8896743384702015 4.985547313773993 -0.59348940540651296 -1.9912476731959305 5.5492963351442413 -0.22245291664235317 -1.8863800552996466 5.041114215791298 -0.20743012896024896 -1.9877580775303627 5.1455114412180833 -1.9036826995271001 -1.8999359235501354 5.2914990723431181 -1.4810512280778538 -1.8965344513865663 4.7979542923034257 -1.3534281129305561 -1.9983386802987764 5.4261985220290345 -1.0984300242409311 -1.8929706306043237 4.9287730973958173 -0.9845616161323808 -1.994719047400763 4.7534388770754887 -2.6484354005923354 -1.9071183720324496 4.9700496139993993 -2.2814204056952905 -1.9035158394792584 3.9618014120899012 -3.6620189337497466 -1.918101194790695 4.259562971938446 -3.3277148148332572 -1.9144849575317082 4.5254390169323102 -3.0341310826869523 -1.9106318878794182 3.3170277243232844 -4.1952216372300075 -1.9257811513263672 3.6504055829791873 -3.9467910947440537 -1.9218929328319931 2.1871753449674194 -4.827909663870309 -1.937451197635589 2.5866634867411822 -4.6364144090294657 -1.9335668965231869 2.9527090661239681 -4.4638311950284288 -1.9294998666157097 1.3781281061852892 -5.0662319397339823 -1.9455925686458588 1.781770992341728 -4.9653556759466904 -1.9414673963838005 0.03971122315229958 -5.734951830990771 -1.8530310025321888 0.058079627010360901 -5.2062485788120112 -1.9578367597583728 0.52316053133153662 -5.707498137016116 -1.8490205499117625 0.51335755938159833 -5.1820032914265379 -1.9537400252681763 0.93300899974649254 -5.1618154655041328 -1.9495341757541131 -0.70012922508955067 -4.5822599860284372 -1.9306226872867016 -0.29490787029114846 -4.6426580409290743 -1.9346978517008695 -1.427630252088359 -4.3630080409817591 -1.9227751522168519 -1.0740265239839875 -4.4905662803287827 -1.9266566972814572 -2.4544803808767366 -3.8284425296417433 -1.9115544500680033 -2.1082667391697911 -4.0344473182491551 -1.915247341762951 -1.8095474036627639 -4.2148059147946784 -1.9188944099232828 -2.9987781307102539 -3.3580474250404619 -1.904517167665136 -2.730369517618747 -3.6009977114023952 -1.9080202715759813 -3.6951433134476557 -2.506928013177995 -1.894234054763599 -3.9237296461916604 -3.0612953032845671 -1.9998452130543707 -3.4662548353508211 -2.8127525557483617 -1.8976478866386548 -3.2638243669085933 -3.0861373627533246 -1.9010362879718381 -4.4983071484225166 -2.0308026451755037 -1.989715008341038 -3.993024034182056 -1.8919782981616746 -1.887566729937868 -4.3273113097610381 -2.386337647310655 -1.9930715408798954 -4.1563154710995605 -2.7418726494458059 -1.9964280734187529 -3.8465977443900505 -2.2012779913155733 -1.8908979251101143 -4.2940138359184177 -0.87719994297610904 -1.8776424541525887 -4.7189412915287692 -1.293586595527628 -1.9830765986207533 -4.6213996590944078 -1.6722293563221415 -1.9863890578663379 -4.2053976921884839 -1.2262416051819147 -1.8809446028170835 -4.1243045242550238 -1.5503335581217856 -1.8842380610608569 -4.8498103104103167 -0.15796990103646014 -1.9732202266110579 -4.8280870562559901 -0.54570350680583779 -1.9764953531133402 -4.3311874466825397 -0.21121632883567898 -1.87110288420079 -4.3149567037553922 -0.5428458822968838 -1.8743713957492327 -4.807675746777945 -0.92003606345595546 -1.9797688995636002 -4.2241548323441815 0.8006866276611212 -1.8613611793793072 -4.7754414421546807 0.58194697136929463 -1.9667335408285731 -4.8293815430632758 0.19927176409453018 -1.9699658434688785 -4.2733724445821517 0.46637566509440054 -1.8646016321879162 -4.3218690603591083 0.13944861632953326 -1.8678433293070813 -4.473187726354058 1.656791128599693 -1.957145081716458 -4.6001111718536878 1.2930209957387593 -1.9603153499784376 -4.0081694969161843 1.4284950309497393 -1.8549559703896701 -4.1190229923390476 1.1182306564237685 -1.8581570030576073 -4.7178184812500534 0.95993648098912543 -1.9635032616650132 -3.9411873140174136 2.6286910309055065 -1.9478425939064097 -4.1359517038664064 2.2968846621499752 -1.9509115553204026 -3.7060747194063932 2.0158166765723715 -1.848653162333993 -4.3241673210727036 1.9774938123708468 -1.953995933735295 -3.8747629241532566 1.7334469562747439 -1.8517835118265016 -3.4635483595079282 3.1654922250245621 -1.9419568447556783 -3.7187918944113947 2.877285437564939 -1.9448489275005467 -2.6166650812796739 3.8618185172156285 -1.9339008383999927 -2.9233204533190973 3.6267065513487684 -1.9364584568243968 -3.204609707729519 3.4131424995638553 -1.9391289381960983 -1.979842330054048 4.1854092118479169 -1.9297577852719983 -2.3177557865938541 4.0156447748678072 -1.9316710737556166 -0.91639529324232638 4.545829872525446 -1.9280810111457236 -1.2996618827277939 4.4287746329066442 -1.9279294136767977 -1.6405939647580667 4.3278127183213879 -1.9283996853393843 -0.1384622326347611 4.7012245454668253 -1.9432825025292972 -0.56026159036128464 4.6139968731830319 -1.9341953776836984 0.70496439882794149 4.6432365500228245 -1.942846406639176 0.32154741756438099 4.9237931552226213 -1.9911410024237775 0.22810867194874096 4.3536112341536306 -1.8758941934187205 1.4898188783700261 4.3300490879214193 -1.9200793713131901 1.192849225872852 4.7733358213134371 -1.987635704223933 1.0444301963296683 4.281438719259306 -1.8849400324637324 2.2669169608450832 4.105386973485972 -1.9427002255872987 1.9166284409172134 4.2761895510741654 -1.9398039514990113 3.213747828197711 3.4340015095793901 -1.9435104730685124 2.9072913977937103 3.6917208092019567 -1.9444710337344258 2.640442276475754 3.9194361642576179 -1.9458180020140523 3.6824799710993696 2.8773605417641508 -1.9392480651559303 3.4565303370334268 3.171210497753973 -1.9415975955682554 4.2250039569395801 1.9199635672262432 -1.9310955063132169 4.0546055182030836 2.2686312085843912 -1.9339102997881608 3.911165742785756 2.5688475603451977 -1.9369121038648507 4.4282219168966774 1.2472218448323025 -1.9247810943116206 4.3417680357981512 1.5877744018484627 -1.9280042722687847 4.5543221192215579 0.17600680618066783 -1.9147973348312375 4.5348968738630298 0.54521844521628993 -1.9181666969227413 4.5197554370533366 0.87582821703182034 -1.9216319062262499 4.4860754750056744 -0.50709244977170098 -1.9077085844886335 4.5365884002752299 -0.17837278780970664 -1.9113162311335901 4.6676227601815601 -1.7208531917442802 -1.9980512547319784 4.1955146613877226 -1.5320927806097313 -1.8967999604620995 4.315144401527979 -1.2013262711462485 -1.9004900642155262 4.4294710647217386 -0.88882481785089085 -1.9042256070508934 4.1041654053208561 -2.7388771673336532 -1.9869531450373314 4.3044194075738638 -2.403662628595848 -1.9906686626567589 4.5046734098268724 -2.0684480898580424 -1.9943841802761866 3.8685679054593152 -2.1423500037490215 -1.8892184751786472 4.0429257465737205 -1.8570321372330909 -1.8930704579886652 3.5850253712710884 -3.3117935554379194 -1.9792765878450305 3.2194108602463571 -2.9548973025585097 -1.8775330244198312 3.8488703208157817 -3.0204458925971616 -1.9830993743308121 3.4481958389529415 -2.7073570444760415 -1.8814936044906561 3.6766218018237145 -2.4602653763854665 -1.8854555955746084 2.9919570126056989 -3.7966774862569248 -1.9714229350652761 3.3106020701060919 -3.5605757567283414 -1.9753479127742388 2.6752850964317347 -3.3970326070173957 -1.869521913995928 2.9499178179620826 -3.1979423023745497 -1.8735846230385076 1.9741062813390391 -4.3565693648064148 -1.9593883925222584 2.3370552943936334 -4.1853585339200219 -1.9634055781648156 1.7621954864249378 -3.8901638237128644 -1.8572069839519938 2.0735309610878199 -3.7472667403257014 -1.8613520979573841 2.6736388429898907 -4.0286110614204889 -1.9674881127605466 2.3848664357507023 -3.6043696569385379 -1.8654972119627742 1.2378368763408358 -4.5690149917712919 -1.9511658216290362 1.0909889723389927 -4.0786689109761056 -1.8488579686745874 1.6269189253934304 -4.4724178426987828 -1.9552646243207537 1.4280651743586494 -3.9983355612809088 -1.853050109931786 0.064427398664373858 -4.6858485978812485 -1.9387736082491043 0.47978016334704615 -4.6656830420121924 -1.9428996715168243 0.85181704734739039 -4.6499545626279613 -1.9470597159010055 -0.61301516412112811 -4.09247822292643 -1.7931166263858085 -0.26799247643488067 -4.1434162071317271 -1.8044464073662174 -0.50891878912726196 -3.6752986102669931 -1.5075155540261045 -0.22359982987072613 -3.719684124674687 -1.5183962081785447 -1.3757017144387 -3.4081180650355418 -1.4761115934076745 -1.2579976314835895 -3.9036071016348539 -1.7715231622013845 -0.92968821955754155 -4.0198820550711352 -1.7822422503623865 -1.0899846141812939 -3.5108745413369924 -1.4864463114126103 -0.81913276372776334 -3.6089128999382201 -1.4966468794227881 -2.1515343811582945 -3.4478416454241358 -1.7408091821673737 -1.8549859767025472 -3.6234380914903301 -1.7509275504263402 -1.8752751038165669 -3.1155293040172753 -1.4565999231299447 -1.6294297853661699 -3.2633304823133744 -1.4663074086611199 -1.5824644129749104 -3.7858631011741952 -1.7608512123146225 -2.5417201421336642 -2.5572112770164792 -1.4280992561434112 -2.6463351374490682 -3.0366104851587603 -1.7214710067134182 -2.3282458943217161 -2.7505633098326623 -1.4375235350215687 -2.3942801512125857 -3.2620919308178307 -1.7311376723433092 -2.1168063024306796 -2.9422209142178271 -1.4469350310018425 -3.2677837437607256 -2.298221129482505 -1.6931764813578001 -3.0655928901816405 -2.566647235372606 -1.7025709241032134 -2.7136179998137013 -2.3293895364744333 -1.4188357366092963 -2.8840957474247824 -2.8096450789528915 -1.7118746832675313 -3.5505457431786778 -1.7506059057843038 -1.674729216867038 -3.4117714226656752 -2.0393509368756466 -1.6839446382626306 -3.8310251058058582 -0.85969338515633409 -1.6472594594668861 -3.7483387739457896 -1.1791566401335367 -1.6563969705678876 -3.6782521928105494 -1.4570202751700798 -1.6655220454062252 -3.8810186504238917 -0.26735265022830246 -1.6290758584640284 -3.8649288455309336 -0.56870363815551839 -1.6381568583840447 -3.8037978494918256 0.63943398894162695 -1.6019651866148736 -3.8481205783251626 0.32630696308489837 -1.6109738440475698 -3.8888012548170505 0.050577803380927808 -1.6200101079345044 -3.6325754669267059 1.1896783716060897 -1.5840696316736773 -3.7273854401332134 0.92297197533483777 -1.5930039103115341 -3.5403837046666129 2.2966923430367117 -1.8415489970962535 -3.227971929659597 1.984356739341457 -1.5577053016780527 -3.3796049389740475 1.7282555240442179 -1.5664357334727781 -3.5218394860504811 1.4898240894639196 -1.5751935409170952 -3.1194584356436383 2.788022476008218 -1.8248199464218189 -3.3351635961789037 2.5447427626528434 -1.8331503709569912 -2.8660747412681182 2.4298416306638249 -1.5407485113357169 -3.0516932787744708 2.2234270071239606 -1.5491660121171968 -2.3796639449591686 3.4094808849560652 -1.8014081407261229 -2.2108449040460241 2.9998495320728047 -1.5168994713961617 -2.6389507569416142 3.2113848903001188 -1.8090350667910235 -2.8982375689240603 3.0132888956441723 -1.8166619928559242 -2.4358823567798633 2.8300916544153845 -1.5246459739820042 -2.6580506245284869 2.6627077569311779 -1.5324024938985645 -1.4329423096658573 3.4207368646783145 -1.4973242649727476 -1.8117777251304137 3.7104021286081208 -1.7887462929714313 -2.1066932373816503 3.5630659970573522 -1.7948449552456798 -1.7039956426012937 3.2863721350911153 -1.5035513023377445 -1.9553228063330672 3.1627304860136949 -1.5098844636542936 -0.87802725948577487 4.0314171826740814 -1.7795848323589589 -1.2032446824705727 3.9357179911312019 -1.7814830596376476 -0.88245150150887786 3.5827072274068343 -1.4921505659270737 -1.1572438743004307 3.5032502052213901 -1.4946565332790409 -1.5214452023488794 3.8422789803552937 -1.7834658570494704 -0.17823608898085419 4.1597547496379068 -1.8094566178923406 -0.54218181446315361 4.0976105097651905 -1.7918843785757657 -0.2652922479780771 3.7076530576510289 -1.513101078056369 -0.57044503822887493 3.6556546782259329 -1.4984389316031452 0.58903551061363479 4.1059208432709058 -1.800520600695495 0.45620355081284203 3.6231658396730375 -1.4692123683616625 0.11141206839574237 3.8280236984408149 -1.5834033370604237 1.3432331765818408 3.8718313537585498 -1.7677196673738036 1.220430805933187 3.4708962534103485 -1.4861842556792821 0.91692830339125253 3.8299659610786625 -1.6577340733176436 2.0483680050688444 3.6695713913882475 -1.8394502215716342 1.725459871518612 3.8300518928545699 -1.8322750641549479 1.8495573458772732 3.2947640013670276 -1.5545908607099939 1.5750960678707557 3.4282292747627694 -1.5467526074047344 2.8848570921216705 3.0647607216632693 -1.8376770269785381 2.6082470476893405 2.7407495503195909 -1.5516935392241018 2.6259056144047239 3.2852249194476801 -1.8418022145740955 2.3669541366877773 3.505689117232091 -1.8459274021696532 2.3692594893549446 2.9448060758058063 -1.5558064226502872 2.1509004408521788 3.1319087245090227 -1.5599065923064963 3.3086305622647112 2.5563513815690158 -1.8243240719204208 3.106254296716497 2.8200014824997512 -1.8315879972945537 2.9741998996795433 2.2915460574577233 -1.5379608737723636 2.8034061349946877 2.5168112631778961 -1.5452667513483906 3.7868110948828551 1.7031950134907397 -1.7996239382905117 3.4049196506435551 1.5121097661924399 -1.5130149832964854 3.6429247887092049 1.9996271892038759 -1.808245379261773 3.2770198035884124 1.7787792301948946 -1.5216825858736374 3.5001364486317783 2.2940152319324816 -1.8168699906585701 3.1560255015878362 2.0325923296240163 -1.5303701285167477 3.969676520366948 1.0894513759441149 -1.7811230709307542 3.8877513350808943 1.4076604744744836 -1.7905051836533039 3.562505798364946 0.96026074144454321 -1.4943361907208832 3.4945643945771279 1.2327664284104589 -1.503795277089286 4.077731730206315 0.13591140086314946 -1.7518652070404612 4.0602218282779203 0.46401422006206949 -1.7617578625074428 3.6513215008091593 0.10424618850412493 -1.4648631178362888 3.6385956528318064 0.38500819579696527 -1.4748368841431274 4.0444292019816599 0.77512366428576274 -1.7716796333795208 3.6258698048544535 0.66577020308980561 -1.4848106504499661 4.0125118253761327 -0.48721184259587325 -1.7314056898531156 3.5847928645578477 -0.46696684133841299 -1.4442806966700272 4.0598421463432421 -0.163010097020091 -1.7416951304383785 3.6277157914568106 -0.18868140667482525 -1.4546469563037308 3.749431314225864 -1.3981919660772708 -1.6997890275112626 3.8602990688389811 -1.0872277972170676 -1.7104145824058075 3.4352975517063178 -1.0144975544125288 -1.4231755598157898 3.961459189638969 -0.8085173341985632 -1.7210892377902482 3.5323752821240131 -0.74935087233756892 -1.433870863627188 3.4556385173005295 -1.9385186779705583 -1.6780062207653781 3.6176670695432502 -1.6699936266262616 -1.6889600286693682 2.8672002614793328 -2.6722611649767436 -1.6445886125883458 3.0904091375962999 -2.4266294466233655 -1.655811716546042 3.2835537312077379 -2.2176662062538273 -1.6670497470082459 2.3951205569042333 -3.0507100858915783 -1.6217867149933078 2.6387638336488295 -2.8728221952571715 -1.6332386209345604 1.5730064648890694 -3.4974898013567577 -1.5871026353108213 1.8650697746419027 -3.3610326380382838 -1.5987403595673384 2.1259338157522167 -3.2411187956443843 -1.6102993091586295 1.0005653070563536 -3.6586339291638001 -1.5639539827805731 1.2837263567855015 -3.5907279941359049 -1.5755125935977514 0.064893250940110891 -4.1803355309507468 -1.8157491809497961 0.07482755377964842 -3.7508794971662107 -1.5294496082464499 0.41081063474932583 -4.1637448520547018 -1.8274284154663278 0.75672801855854077 -4.1471541731586559 -1.8391076499828594 0.38903874504613245 -3.7371307213977958 -1.5409411618933613 0.67759505470079118 -3.7256814550451942 -1.5522808546542826 -0.45463971240160239 -3.3516448760929505 -1.1308111195364028 -0.18411872666583121 -3.3887647351440591 -1.1464893632483699 -1.2260644244464494 -3.1294717791185329 -1.0865336717854837 -0.95649243159414421 -3.2216332156190512 -1.1014824799504326 -0.72344877059639801 -3.3020000963969829 -1.1154040535707623 -1.676264605385287 -2.8824725342182056 -1.058974162238048 -1.4508125065248922 -3.01335841594415 -1.0727398660503396 -2.2946802421367125 -2.3923143146505601 -1.0179405199536704 -2.0890450831363752 -2.5728519982380127 -1.0316314738341883 -1.9054677700609635 -2.7349957503037987 -1.0449835327006509 -2.8838600450925846 -2.1039811151388781 -1.4074245261700906 -2.6096118950957474 -2.0017513231289374 -0.99108355679733318 -2.4587618814408332 -2.1995942295819311 -1.0044701635057351 -3.2794150339629331 -1.3681386566924565 -1.366995851561948 -2.9879799994001255 -1.3261748925960697 -0.95072442705920379 -3.1555442502192519 -1.6188681571680712 -1.3804534645319149 -3.0316734664755707 -1.8695976576436859 -1.3939110775018817 -2.8732472508838489 -1.5597647753614101 -0.9641511626209498 -2.7658805128237742 -1.7795387119055581 -0.97755300844369242 -3.4235449272542731 -0.83768954663744144 -1.3401893547827661 -3.3513398779641554 -1.1064130987428316 -1.3535892431031402 -3.1306342117773429 -0.84960539264393098 -0.92386566365132872 -3.0683279109918264 -1.0857536025495271 -0.93729019855410989 -3.5071865784653258 -0.023786572387981542 -1.3000867676232752 -3.2211621428015671 -0.10266259012152415 -0.8836474949574461 -3.4888813460423123 -0.30022796987232625 -1.3134392878250853 -3.4705761136192987 -0.57666936735667107 -1.3267918080268954 -3.2058382272129031 -0.34917663476592692 -0.89705049545369264 -3.1908268095022487 -0.59255373195503691 -0.91045878723086282 -3.4416882449745589 0.50843592583784025 -1.2735002568831739 -3.4775223690954307 0.23468349042018533 -1.2867779375521819 -3.1747513424504743 0.39296437611853574 -0.85698012033642734 -3.2074223086185505 0.15167884489132555 -0.87030951322971684 -3.215549344356682 1.2801007572668204 -1.2339964369450649 -3.303814393627774 1.0192159722903145 -1.2471303319780755 -2.979444864780239 1.1040705789083223 -0.81737547647348685 -3.0583686295915506 0.87402420061355779 -0.83052871856617527 -3.3897888171043791 0.76589323620657279 -1.2602689712059705 -3.1372923944028623 0.64397782231879341 -0.84368196065886358 -2.6314280770189797 1.7506659086186269 -0.77876394770920432 -2.9612308743939377 1.7395018191075424 -1.2082587744089999 -3.0983696453578768 1.5010751140642897 -1.221119717077203 -2.7539071273125875 1.5396081870931881 -0.7915841814322212 -2.8759142636809094 1.3294315058504007 -0.80440310468564935 -2.4687037343743374 2.3620000033373794 -1.1709675359259459 -2.6494966226719665 2.1546476852760348 -1.1833169404036219 -2.4716477030875574 1.9345010901689199 -0.76654284022454122 -2.8177074321402751 1.9625343432172133 -1.1955782578940319 -2.0688853348535483 2.6897532522507603 -1.1482949503521795 -2.2794609377252146 2.526632101739811 -1.1595638695628869 -1.3836579376559759 3.0845253078521035 -1.119520267412291 -1.6317866781716466 2.9588692499095224 -1.1287664148986176 -1.851052177101373 2.8481984470883219 -1.1374257269888508 -0.89074374083631902 3.2486453993295119 -1.1116533153690946 -1.1440908110883123 3.1738896648532315 -1.1146700251392305 -0.052187611994588962 3.4073717692932819 -1.1548897418301458 -0.36473242134034178 3.3623635288086344 -1.1336001303506706 -0.62079442325911649 3.3226811020224583 -1.1119554382728347 0.32901854694209309 3.2664555140158011 -0.98479931757514039 1.2034423659777833 3.1592485403996484 -1.1195096526630866 0.82200954055235509 3.4175575614902023 -1.3247279749391645 0.73515641409233012 3.1176610150610053 -0.85523404765932465 1.7309773740601007 2.955601679519885 -1.1947498620469608 1.4667823300493117 3.0873046001812905 -1.1821339746271162 2.398967098291505 2.4545917369848409 -1.1898302240690173 2.1799106188511961 2.6396950700497595 -1.1960243481110702 1.9762061316295472 2.8113608131811771 -1.2012436833251809 1.8565659213405572 2.5353583534915951 -0.76625327602258486 2.7309271955878418 2.0408059612241685 -1.1693706508224415 2.5592710916503849 2.261455990158161 -1.1803290857678577 3.1183331686504512 1.3381663731120423 -1.1321094178378563 2.9943570677633895 1.5885259388652646 -1.1451651014032029 2.8806023543480697 1.8192195497343657 -1.1578357880604024 3.2594203098342991 0.83854352327910586 -1.1043717220802676 3.1904793517287358 1.0980213922873301 -1.1184327924313879 3.3443466486542812 0.051698660536604435 -1.0604939102742603 3.3269094262275627 0.33006218135041465 -1.0754288256028162 3.312376247254714 0.57677300693278777 -1.0900442531366485 3.2843143297934616 -0.45474213068373054 -1.0300589326829173 3.3197134463190912 -0.19908766002259345 -1.0453532691907477 3.3391465054190461 -1.2795579066603431 -1.4116271498412702 3.0636192420777899 -1.2060861188383507 -0.98304440433310447 3.1518009390587105 -0.95170025833818495 -0.99889541292568285 3.2334316442619779 -0.71839846259731777 -1.0145230590983592 3.0732538650511194 -1.7708546544555002 -1.3790583429775147 2.8189745339364971 -1.6428901181259965 -0.95109890010177978 3.215109875203372 -1.5285374038528181 -1.3954175997653249 2.9448937465002007 -1.4298456106465425 -0.96707328465601072 2.5540637197850962 -2.4239903866057428 -1.3293383518258037 2.3325678057050969 -2.2461125309632588 -0.90215074358738012 2.7412709859403153 -2.2133819121077605 -1.3460379311231023 2.5050728646876399 -2.0530922225247736 -0.91853880785068021 2.9276043063022232 -2.0038189339464321 -1.3627189929794266 2.6704043514221998 -1.8686536173948782 -0.93477487618735 2.1255532269918413 -2.7700611932607924 -1.2957149979474769 2.3511885865206081 -2.5994754349133147 -1.3126738562673095 1.9384196887135525 -2.5568189221965465 -0.86929195979825513 2.136696602345646 -2.4082018667273064 -0.88568841329764991 1.4006907643756867 -3.1699684439783624 -1.2449160659845242 1.6562335548625469 -3.0462649447963317 -1.2620077272375132 1.2761865092478639 -2.9160184441688024 -0.81984643024301851 1.4995227836101364 -2.8090204356565955 -0.83626268491685618 1.900357620529229 -2.9284843278101542 -1.2788599250900141 1.7228590579724088 -2.7020224271443887 -0.85267893959069374 0.88129543843150682 -3.3208308603577539 -1.2114102400987377 0.79436333345343646 -3.0524199970809627 -0.78719263131432493 1.1566769992560126 -3.2491248348027946 -1.2284347819221044 1.0337658779295456 -2.9910809445941102 -0.80342978512185559 0.068733690470480058 -3.4104234255523211 -1.1618958064998648 0.35353664508322202 -3.3935206485259193 -1.178579766478574 0.6128014714244191 -3.3787410937121991 -1.1946769613952948 0.55183660862844586 -3.1016814541747277 -0.7710415166717367 -0.41757899866652748 -3.0981992050733465 -0.70044486675161122 -0.17589141032730501 -3.1254622745512628 -0.71783403050217631 -0.1583166062144554 -3.029703879571148 -0.22772191035008157 -0.38631114994497084 -3.0039171276584207 -0.21097458897024046 -1.1170351792492843 -2.915779363979492 -0.65131566809507757 -1.0611004421048535 -2.8317627763124946 -0.16314371778249973 -0.88533229726701579 -2.9893957697732145 -0.6674138672074299 -0.84098617333712178 -2.9017313360619714 -0.17860149629580249 -0.65472687777046024 -3.0626667179946541 -0.68345141733879355 -0.62246718704028037 -2.9711977352212924 -0.19397111484235616 -1.5453149394804027 -2.6984339137156801 -0.61988213350401589 -1.3318739480636599 -2.8160387525561883 -0.63555654616861901 -1.4773946468427204 -2.6251941622620154 -0.13184536680896575 -1.2756343838311826 -2.736522529910471 -0.14737279545434762 -2.1234836786176623 -2.2662458118433566 -0.57286537336736254 -1.936745805782532 -2.4234968223021811 -0.58848220289464181 -2.036798242905955 -2.2123518700269336 -0.08460562553301558 -1.8600854581609045 -2.3614283230851978 -0.10042871571586934 -1.7544418147358685 -2.5771324010698877 -0.60419025709308727 -1.6833726734158541 -2.5105047761434625 -0.11625180589872311 -2.4900550458163351 -1.6834558902392447 -0.036662510677072539 -2.4370691281671353 -1.905478105431953 -0.54127699944983398 -2.3451940210261988 -1.8649697246640713 -0.052686750053685644 -2.2854536677738082 -2.0951276416492122 -0.55699806444239774 -2.2007958303923583 -2.0459260764365799 -0.068731763847066557 -2.8070660857725107 -1.2891032601379606 -0.49373031201668222 -2.6947477227005114 -1.5058540619034586 -0.50948982796249553 -2.7057935039716736 -1.273067362207208 -0.0043567999623926254 -2.599476258651944 -1.4787629437526899 -0.020526099967182066 -2.5871451969088652 -1.7139173788022677 -0.52557136307573527 -3.0281949631905318 -0.60639326299435248 -0.44593265159039647 -2.9604121753156751 -0.84062575911400916 -0.46174446674374775 -2.8943202481957191 -1.0694083699408676 -0.47773831694092328 -3.069051133257604 -0.13485576096858867 -0.41391728171959963 -3.0484761541392387 -0.37578698213288109 -0.42977690376431821 -3.0161600975295206 0.57572833155565017 -0.36631401966998461 -3.0430935263691095 0.33403587523059652 -0.38204355763944858 -3.0691149966548692 0.10208732812345728 -0.39801306429390021 -2.8785349191459342 1.0240555859115068 -0.33492353263582719 -2.9502946134853887 0.79816198092222246 -0.35056497040861079 -2.5637348705608605 1.6583892135636364 -0.28904302606126042 -2.6797897100231829 1.4476340872535038 -0.30420788052395858 -2.7914235075079321 1.2451970758514026 -0.31948448434324217 -2.3150837905059372 2.1199770494253789 -0.75233932849688323 -2.2710502229412413 2.0200113758588869 -0.26002450167258828 -2.4208759385080225 1.8419547048669078 -0.27446664527761921 -1.7666941277527477 2.5947972885382833 -0.71243696204627138 -1.7438231980678491 2.4874902385422764 -0.22010861910290624 -1.9560237980807935 2.4427584009545926 -0.72547946058790236 -2.1453534684088393 2.2907195133709015 -0.73852195912953333 -1.9283124528639917 2.3394071411027619 -0.23308615337245664 -2.1084992967454048 2.1948401539187632 -0.2460059440471804 -1.3407202116885906 2.8239429116746804 -0.69183686814858736 -1.5562333356126052 2.7110318830340727 -0.70200862840234768 -1.3393215069262274 2.7142001239278213 -0.19958325234601612 -1.5436841543947601 2.6071675804516183 -0.20939161026051245 -0.65343986677372223 3.0620592350439595 -0.67862745895651855 -0.6816366710732723 2.9516747249729849 -0.18636148219701038 -0.88798381334125098 2.9915079513972218 -0.68151269080496035 -1.12252775990878 2.9209566677504837 -0.68439792265340216 -0.90503070789093476 2.8843905059605102 -0.18868970727189435 -1.1249761544875945 2.8181167675171039 -0.19084565399157938 -0.16014727957163633 3.1283035102462984 -0.72432218495567924 -0.41215703602992126 3.0984185900633974 -0.69886310628531401 -0.22936111960093269 3.022269101772078 -0.22552242933956296 -0.45352572108488121 2.995247081034794 -0.20066859737699516 0.44942326484014661 3.0821730562273544 -0.63564365528610756 0.25873108553819191 3.0672393940727298 -0.46614588625619752 0.45212741030525366 2.982385292915938 -0.13531564883428898 0.16863569522590532 3.0609570680071054 -0.38995179288157283 0.088904858981037713 3.0555660948519505 -0.32337083925753646 0.37239657406038607 2.9769943197607831 -0.068734695210252619 0.0091740227361701149 3.0501751216967952 -0.25678988563350008 0.29266573781551841 2.9716033466056282 -0.0021537415862162399 0.81471919010357763 2.9637465070517561 -0.43987316601427789 1.0004845283222121 2.8340973760248143 -0.085541064348740495 0.71110287406762662 2.9777644060733954 -0.35569255048447102 0.89686821228626123 2.8481152750464536 -0.0013604488189335425 0.60748655803167573 2.9917823050950352 -0.27151193495466414 1.6528321835263304 2.6725886780043866 -0.760772125904699 1.6151245552493492 2.5794995033700627 -0.25624936786346159 1.4314614556597554 2.7867102465424494 -0.7420445910675505 1.4070417149483401 2.6861126844001202 -0.23571364136501191 1.2122884992936624 2.8995899532722866 -0.72301798746713852 1.2094356074859183 2.7868059349986618 -0.21375226004649103 2.0454563487579192 2.3785802990972607 -0.76147290415284508 1.9859550942114952 2.2984097362126739 -0.25772151544143912 1.8085493247706939 2.4448407231087823 -0.26099325060442541 2.5395141042437439 1.8404899194612854 -0.73305318584790757 2.4636207015952509 1.7761823390000981 -0.23060102815407152 2.3862390688615758 2.0308894092770626 -0.74469703570026746 2.2329640334794081 2.2212888990928397 -0.75634088555262735 2.3156399669792731 1.9599405019766105 -0.24163532743395305 2.1702620365575975 2.1404336306990501 -0.25236995715278171 2.8964484618037361 1.2047308594260273 -0.69102481074655087 2.783886710049841 1.4214101598078572 -0.70552971964719924 2.671324958295946 1.6380894601896874 -0.7200346285478475 2.6983042534808628 1.3708475098441393 -0.20383851567960051 2.5912193671217589 1.5770167150102901 -0.21771570203087864 3.0321005069560276 0.73890457270967436 -0.65912994937140301 2.937187145226253 0.71039148086616377 -0.1584931217698938 2.9642723507664224 0.97343560901665627 -0.67516023321661522 2.8725765733903201 0.93396264899624704 -0.17400588507894116 2.8080174309990906 1.1573586360362935 -0.18951037640787172 3.1193169202231084 0.018322586482442005 -0.60891908871466138 3.0207554949058468 0.0096693463926871837 -0.1091326933944529 3.0987258735947836 0.26167542739883798 -0.62589699827841294 3.0781348269664583 0.50502826831523373 -0.6428749078421645 3.0008489433123327 0.24539598662563966 -0.12577568073259182 2.9812944423274939 0.47720030681834508 -0.14224641032247923 3.0687753746175157 -0.4609370721149505 -0.57399001989423526 3.096200011192316 -0.21810899403399964 -0.59162672311334019 2.9702689571762648 -0.45319284014908384 -0.074930262961072608 2.9964412703092784 -0.2220033962013768 -0.092033977536788186 2.8763313064559171 -1.1577391613440318 -0.52030733759614045 2.950752747241844 -0.92476897267197611 -0.53843878495848607 2.7829070970125573 -1.1261907774026436 -0.022418267507734006 2.8537677932482808 -0.90456094805316445 -0.039966310551024523 3.0240656057559514 -0.69532942797727548 -0.55638859848659017 2.9246284894840042 -0.68293111870368528 -0.057514353594315046 2.6498091898197655 -1.5791764692281602 -0.48388645492551147 2.7684198140020855 -1.365046659384785 -0.50240150308871656 2.6741332449629502 -1.3323757450711751 -0.0045382683546971447 2.2090383513452143 -2.1481113646074927 -0.42839621928938915 2.3673122621237384 -1.9611204853616111 -0.44719664359721129 2.5201604544529315 -1.780590814960588 -0.46551620207195682 1.8430056718670476 -2.4499510013530643 -0.39137254070943722 2.0311702255731725 -2.3003154171201934 -0.41006601546143345 1.2230506375636652 -2.8068450140385797 -0.33545176469677163 1.4401481955127338 -2.6950545456555974 -0.35438888522459361 1.6467653915169131 -2.5887078497108544 -0.3726216534147388 0.77549047159647377 -2.9464986898545726 -0.29896896413787372 1.0013142225128511 -2.8817651537924176 -0.31719053529845226 0.30769451080545918 -3.1196066321560747 -0.7536579967623025 0.064500617954802053 -3.1399233384879688 -0.7353795884825427 0.074323045600443782 -3.0414008474465866 -0.24493715072306438 0.31142914833181984 -3.0216193306589609 -0.26289177095097016 0.54150232021654299 -3.0024560925867543 -0.28047233443036113</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<polyhedra>\n\t\t\t<first_faces>0</first_faces>\n\t\t\t<face_counts>1882</face_counts>\n\t\t\t<types>polygons</types>\n\t\t\t<face_first_loops>7006 7030 12 512 7529 469 965 492 514 7023 7046 505 520 7031 513 7047 7070 521 548 7063 7090 541 560 7071 549 7083 7106 588 589 7091 561 7107 7103 577 604 7119 7130 85 104 620 621 7123 89 7122 605 7131 7142 105 128 617 632 7139 7150 125 144 629 640 7143 129 633 7151 7162 145 167 641 652 7159 7174 161 184 7163 169 649 660 653 7175 7198 185 199 661 680 7195 7214 673 692 7199 672 681 7215 7238 693 712 7235 7254 709 732 7239 713 7255 7278 733 725 7281 7282 753 7300 247 752 744 7324 749 755 7317 7336 270 291 7325 761 772 1233 7337 7360 293 314 315 769 780 773 7357 7380 309 796 7361 781 804 816 793 7401 7400 7381 797 7397 7424 817 844 7421 7440 833 856 7425 845 7441 7464 857 884 7457 7476 873 904 7465 885 7475 7488 7477 400 905 893 7485 7496 397 416 917 936 7489 401 916 7497 7508 417 439 937 933 7505 7516 433 456 7509 441 949 960 948 7517 7536 457 479 961 957 7537 7533 481 473 969 968 996 981 515 1441 985 509 528 997 1012 529 551 1013 1028 545 568 1025 1036 553 1029 569 591 1037 1048 585 607 593 1045 1056 1049 609 1072 1057 1080 1069 1088 1073 1116 1117 1089 1109 1128 1156 1157 1129 1145 1172 677 696 1188 1189 1173 697 720 1185 1200 717 736 1212 1213 721 1201 737 1209 1220 1232 1225 1221 1244 1245 1237 1265 1292 1264 1293 1281 801 824 1309 1324 805 1308 1332 1321 847 846 825 1325 841 864 1333 1344 1356 1341 887 886 865 1345 881 907 1357 1353 924 901 909 1365 1376 1364 925 939 1377 1373 1408 1385 1384 1392 1409 1405 1436 1425 1424 1440 989 1004 1461 1468 1446 1449 1921 1005 1015 1469 1480 1472 1488 1481 1516 1517 1489 1509 1532 1529 1548 1533 1549 1576 1077 1096 1569 1588 1081 1577 1097 1119 1589 1600 1113 1136 1597 1608 1121 1601 1137 1159 1609 1620 1153 1175 1161 1617 1628 1621 1177 1191 1629 1648 1641 1656 1640 1649 1657 1680 1677 1669 1681 1701 1693 1700 1705 1713 1712 1253 1272 1721 1732 1720 1740 1729 1295 1294 1273 1733 1289 1311 1741 1752 1313 1326 1764 1749 1768 1753 1765 1784 1785 1781 1801 1828 1800 1844 1817 1829 1845 1872 1892 1861 1873 1393 1416 1893 1881 1413 1432 1905 1916 1417 1904 1433 1452 1917 1913 1453 1925 1924 1933 1948 2405 1949 1964 1496 1965 1980 1497 1519 1981 1992 1513 1540 1989 2004 1521 1993 1560 1561 1541 2005 2001 1557 1579 2013 2028 2012 2016 2036 1581 2029 2025 2037 2060 2057 2076 2061 2077 2104 2093 2120 2105 2121 2144 1645 1664 2133 2160 2145 1665 1688 2161 2184 1685 2177 2196 1689 2185 2197 2201 2208 2209 2213 2220 2221 2240 2229 2252 2241 2253 2280 2269 2292 2281 1769 1792 2293 2304 1789 1808 2301 2312 1793 2305 1809 1831 2313 2324 1825 1852 1833 2321 2336 2325 2344 2333 1875 1874 1853 2337 1869 1895 2345 2356 1889 2368 1897 2353 2376 2357 2369 2396 2400 2389 2397 2404 1940 1956 2409 2865 2421 2428 1957 1972 2429 2436 1973 2444 2437 2452 2445 2468 2465 2492 2469 2508 2489 2493 2509 2536 2044 2525 2548 2537 2045 2068 2549 2564 2065 2084 2561 2572 2069 2565 2085 2107 2573 2584 2101 2123 2109 2581 2596 2585 2125 2147 2597 2593 2141 2163 2149 2605 2612 2604 2165 2187 2613 2624 2181 2200 2621 2636 2189 2625 2637 2629 2649 2656 2648 2657 2653 2237 2260 2245 2673 2684 2677 2676 2261 2283 2685 2696 2277 2704 2285 2693 2712 2697 2705 2732 2725 2748 2733 2749 2745 2765 2796 2764 2789 2808 2797 2809 2836 2825 2852 2837 2860 2849 2399 2398 2377 2853 2393 2412 2861 2868 2413 2869 2877 2892 3309 2893 2908 2909 2928 2453 2476 2929 2925 2473 2500 2937 2948 2477 2936 2497 2516 2945 2956 2501 2949 2517 2539 2957 2968 2533 2551 2541 2965 2980 2969 2972 3000 2981 2993 3020 3001 3021 3017 3037 3064 3036 3076 3057 3065 3077 3104 3105 3097 3121 3132 3120 3133 3137 3144 3145 2664 3149 3156 2665 3157 3168 3165 3176 3169 3177 3188 3185 3196 3189 2713 2735 3197 3208 2729 2756 3205 3216 2737 3209 2776 2777 2757 3217 3228 2773 2799 3225 3236 3229 2793 2816 3248 3249 2801 3237 2817 2839 3245 3260 2833 3272 2841 3257 3276 3261 3296 3297 3273 3289 3304 3308 2884 2900 3313 3777 3325 3332 2901 2916 3333 3340 2917 3356 3341 3364 3376 3353 3357 3377 3396 3393 3412 3397 3413 3436 3429 3448 3437 3003 3449 3460 2997 3028 3457 3468 3005 3461 3481 3480 3044 3025 3029 3469 3045 3067 3477 3488 3061 3084 3500 3501 3069 3489 3085 3107 3497 3508 3521 3520 3124 3101 3109 3509 3125 3136 3517 3532 3533 3525 3545 3556 3544 3557 3576 3573 3596 3577 3597 3616 3613 3636 3617 3637 3656 3653 3676 3657 3677 3700 3693 3712 3701 3713 3736 3733 3748 3737 3760 3761 3749 3277 3299 3757 3772 3293 3316 3769 3780 3301 3773 3317 3781 3789 3808 3797 3809 3820 3821 3828 3361 3380 3840 3841 3365 3829 3381 3404 3837 3848 3401 3420 3860 3861 3405 3849 3421 3439 3857 3872 3864 3884 3441 3873 3892 3885 3904 3901 3924 3905 3925 3948 3941 3960 3949 3961 3988 3981 4000 3989 4001 4024 4036 4037 4025 3537 4052 4053 4041 4045 3565 3561 3584 4076 4077 4065 4064 3604 3605 3585 4073 4084 3601 3624 4096 4097 4085 3644 3645 3625 4093 4104 3641 3664 4116 4117 4105 3684 3685 3665 4113 4124 3681 3703 4136 4137 4125 3724 3725 3705 4133 4144 3721 3739 4160 4161 4145 4172 4173 4148 4157 4169 4192 4220 4221 4193 4236 4237 4213 4229 3812 4252 3801 4249 4260 4233 4681 4276 4277 4261 4273 4292 4293 4312 4336 4337 4313 4325 4348 4360 4361 4349 3893 4357 4368 3889 3912 4380 4381 4369 3932 3933 3913 4377 4392 3929 3951 4389 4400 4393 3972 3973 3953 4401 4412 3969 3991 4409 4420 4413 4012 4013 3993 4421 4428 4009 4027 4440 4441 4429 4029 4039 4437 4452 4453 4445 4057 4469 4476 4468 4477 4500 4497 4516 4501 4517 4540 4537 4556 4541 4557 4584 4573 4596 4585 4597 4624 4613 4636 4625 4637 4648 4180 4645 4656 4649 4200 4201 4181 4657 4668 4197 4223 4665 4676 4669 4217 4239 4688 4689 4225 4677 4241 4685 4697 4704 5109 4284 4705 4716 4281 4300 4713 4724 4285 4717 4301 4315 4725 4732 4317 4339 4733 4744 4333 4752 4341 4741 4760 4745 4753 4776 4773 4792 4777 4793 4820 4809 4832 4821 4856 4857 4833 4849 4868 4880 4881 4869 4877 4888 4889 4908 4901 4893 4909 4457 4917 4924 4916 4925 4484 4929 4936 4485 4508 4937 4948 4505 4524 4945 4956 4509 4949 4525 4548 4957 4968 4545 4564 4965 4976 4549 4969 4565 4587 4977 4988 4581 4604 4589 4985 4996 4989 4605 4627 4997 5008 4621 5016 4629 5005 5024 5009 5017 5040 5037 5056 5041 5057 5084 5073 5096 5085 5097 5116 5113 5117 5133 5144 5585 5145 5172 5165 5184 5173 5185 5200 5201 5216 5213 5224 5217 4761 4784 5225 5236 4781 4800 5233 5244 4785 5237 4801 4823 5245 5256 4817 4840 4825 5253 5264 5257 4841 4859 5265 5280 5268 5288 4861 5281 5277 5289 5316 5309 5328 5317 5329 5344 4905 5349 5364 5345 5353 5365 5357 5377 5384 5376 5385 5412 5405 5424 5413 5425 5452 5445 5464 5453 5465 5492 5481 5508 5493 5509 5528 5521 5540 5529 5025 5048 5541 5552 5045 5064 5549 5560 5049 5553 5065 5087 5561 5572 5081 5104 5089 5569 5580 5573 5105 5119 5581 5600 5593 5592 5601 5137 5152 5609 5616 5589 6029 5153 5175 5617 5628 5636 5625 5192 5169 5177 5629 5193 5203 5637 5652 5644 5668 5653 5665 5684 5669 5685 5712 5701 5724 5713 5725 5752 5741 5768 5753 5769 5761 5296 5781 5792 5780 5297 5319 5793 5789 5313 5336 5801 5812 5321 5800 5337 5352 5813 5809 5821 5828 5820 5829 5833 5840 5841 5392 5845 5852 5393 5415 5853 5864 5409 5432 5861 5872 5417 5865 5433 5455 5873 5884 5449 5472 5881 5892 5457 5885 5473 5495 5893 5904 5489 5511 5497 5901 5912 5905 5513 5531 5913 5928 5916 5940 5533 5929 5925 5941 5937 5961 5976 5960 5977 6004 5993 6020 6005 6021 6036 5597 6033 6037 6045 6064 6521 6065 6092 6081 6108 6093 6109 6128 6136 6121 5672 5670 6129 5673 5692 6137 6148 6156 6145 5715 5714 5693 6149 5709 5732 6157 6168 6176 6165 5755 5754 5733 6169 5749 5771 6177 6192 6200 6180 5773 6193 6189 6201 6224 6244 6221 6225 6245 6272 6280 6261 6273 6281 6277 6301 6293 6300 6313 6320 6312 6321 6344 6341 6360 6345 6361 6388 6381 6400 6389 6401 6428 6417 6444 6429 6445 6464 5948 6457 6476 6465 5968 5969 5949 6477 6488 5965 5984 6485 6496 6489 5985 6007 6497 6508 6001 6023 6009 6505 6516 6509 6025 6532 6517 6540 6529 6533 6053 6072 6525 6549 6560 6977 6568 6557 6095 6094 6073 6561 6089 6111 6569 6580 6592 6577 6131 6130 6113 6581 6584 6608 6593 6609 6605 6625 6648 6624 6649 6645 6665 6692 6664 6693 6681 6208 6709 6732 6708 6209 6232 6733 6725 6229 6252 6741 6752 6233 6740 6760 6749 6275 6274 6253 6753 6269 6288 6761 6772 6289 6773 6769 6766 7241 6784 6785 6328 6789 6796 6329 6352 6797 6808 6349 6368 6805 6820 6353 6809 6369 6391 6821 6832 6385 6408 6829 6840 6393 6833 6409 6431 6841 6852 6425 6447 6433 6849 6860 6853 6449 6467 6861 6876 6864 6888 6469 6877 6873 6889 6912 6905 6924 6913 6925 6952 6941 6968 6953 6969 6984 6537 6981 6541 6985 6997 7024 7523 7017 7036 7025 7037 7064 7053 7084 7065 6616 7085 7108 6613 6632 7097 7120 6617 7109 6633 6656 7121 7117 6653 6672 7129 7140 6657 7128 6673 6695 7141 7137 6689 6716 6697 7149 7160 7148 7172 7157 6735 6734 6717 7161 7164 7188 7173 7189 7185 7205 7228 7204 7229 7225 7245 7244 7276 7257 7318 7319 7292 7311 7303 7350 7351 7326 7334 7335 7347 7370 7367 7390 7371 7391 7414 7411 7430 7415 7431 7458 6892 7447 7470 7459 6893 6915 7471 7486 6909 6932 7483 7494 6917 7487 6933 6955 7495 7506 6949 6971 6957 7503 7514 7507 6973 6987 7515 7534 7522 7518 7535 7004 7027 7527 7021 7044 7029 7045 7067 7061 7087 7069 7111 7110 7089 7105 7196 7193 7212 7197 7213 7236 7233 7252 7237 7253 7299 7298 7273 7280 7296 7321 7301 7315 7323 7358 7355 7378 7359 7398 7399 7379 7395 7422 7419 7438 7423 7439 7461 7455 7474 7463 7531</face_first_loops>\n\t\t\t<face_loop_counts>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</face_loop_counts>\n\t\t\t<face_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_selection>\n\t\t\t<face_materials>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_materials>\n\t\t\t<loop_first_edges>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537</loop_first_edges>\n\t\t\t<edge_points>1752 6 1 3 1751 0 117 1 2 3 118 123 0 129 2 124 1754 8 5 125 1756 4 6 127 1758 5 0 129 1761 11 8 130 1762 7 4 131 1765 14 10 134 1766 9 11 136 1768 10 7 138 1769 16 13 148 1771 12 14 140 1773 13 9 141 1776 22 16 144 1777 15 12 145 1779 25 19 17 18 26 21 156 1780 17 20 21 1781 19 1776 22 19 18 22 150 20 21 15 152 1782 30 25 23 24 32 26 154 1783 23 17 26 25 24 18 155 1784 34 29 27 28 36 31 157 1785 27 30 31 1786 29 23 32 29 28 32 158 30 31 24 159 1787 41 34 35 1788 33 27 36 33 42 36 160 34 35 28 161 1789 44 38 39 1790 37 41 40 37 46 40 162 38 39 42 163 1791 38 33 41 42 40 35 164 1793 49 44 45 1794 43 37 46 43 50 46 165 44 45 39 166 1796 52 48 167 1799 47 49 169 1800 48 43 49 50 169 45 171 1803 55 52 172 1804 51 47 174 1806 57 54 176 1809 53 55 178 1810 54 51 179 1813 61 57 182 1814 56 53 184 1822 1820 60 64 1822 61 59 60 58 62 189 59 56 61 62 60 182 187 1824 69 64 58 63 189 188 1829 73 66 67 1831 65 69 68 65 74 68 190 66 67 188 191 1833 66 63 1835 79 73 72 79 78 72 192 70 71 74 193 1836 70 65 73 74 72 67 194 1838 82 76 77 1841 75 79 78 75 200 78 195 76 77 71 196 1842 76 70 71 197 81 84 1852 1846 80 82 199 1847 81 75 200 1849 87 84 204 1851 83 80 205 1854 89 86 208 1857 85 87 209 1858 86 83 212 1861 92 89 214 1862 88 85 215 1865 95 91 218 1866 90 92 219 1868 91 88 222 1869 99 1871 93 94 101 95 224 1871 94 90 227 1872 103 98 96 97 105 100 229 1873 96 99 100 1874 98 93 101 98 97 101 230 99 100 94 223 1875 110 103 104 1876 102 96 105 102 111 105 234 103 104 97 235 1877 113 107 108 1878 106 110 109 106 115 109 237 107 108 111 238 1879 107 102 110 111 109 104 233 1880 120 113 114 1881 112 106 115 112 121 115 240 113 114 108 241 1885 117 120 119 1884 1 116 118 117 2 119 242 116 118 121 243 1886 116 112 120 121 119 114 239 244 124 128 129 2 124 242 247 3 122 123 246 4 131 127 125 126 133 128 249 5 125 129 128 127 126 122 250 6 127 3 122 7 138 131 132 8 130 125 133 130 139 133 253 131 132 126 254 9 141 136 134 135 143 137 256 10 134 138 137 136 135 139 257 11 136 130 138 139 137 132 258 13 148 141 142 14 140 134 143 140 149 143 259 141 142 135 260 15 152 145 146 16 144 148 147 144 153 147 261 145 146 149 262 12 145 140 148 149 147 142 263 21 156 152 151 150 269 153 264 22 150 144 152 153 151 146 265 24 159 155 266 26 154 156 268 18 155 150 269 28 161 158 280 31 157 159 272 32 158 154 273 35 164 161 276 36 160 157 278 39 166 163 290 40 162 164 282 42 163 160 283 45 171 166 286 46 165 162 287 47 174 169 167 168 175 170 298 48 167 50 170 169 168 171 292 50 170 165 294 51 179 174 172 173 181 175 296 52 172 167 175 174 173 168 297 53 184 178 176 177 185 180 304 54 176 179 180 55 178 172 181 178 177 181 300 179 180 173 301 56 62 184 182 183 187 185 302 57 182 176 185 184 183 177 303 305 306 188 189 62 189 183 306 64 68 186 309 60 64 187 186 67 194 191 312 68 190 309 308 71 196 193 316 72 192 194 317 74 193 190 311 77 202 196 321 78 195 192 324 80 205 199 197 198 207 201 325 81 197 200 201 82 199 77 202 199 198 202 328 200 201 195 320 330 206 211 212 83 212 205 206 84 204 197 207 204 203 207 331 205 206 198 332 85 215 209 210 86 208 212 211 208 217 211 333 209 210 203 334 87 209 204 203 335 216 221 222 88 222 215 216 89 214 208 217 214 213 217 336 215 216 210 337 90 227 219 220 91 218 222 221 218 228 221 339 219 220 213 340 92 219 214 213 225 224 230 101 94 223 227 226 223 232 226 341 224 225 228 342 95 224 218 227 228 226 220 338 97 235 230 231 100 229 223 232 229 236 232 344 230 231 225 345 346 234 238 111 104 233 235 347 105 234 229 235 236 347 231 343 108 241 238 352 109 237 233 353 356 240 243 121 114 239 241 357 115 240 237 350 118 123 243 361 119 242 239 360 122 250 246 244 245 252 248 365 124 244 247 248 123 246 361 362 246 245 362 366 126 254 250 251 128 249 244 252 249 255 252 367 250 251 245 368 132 258 254 369 133 253 249 254 255 369 251 371 135 260 257 380 137 256 258 372 139 257 253 373 142 263 260 376 143 259 256 378 146 265 262 382 147 261 263 383 149 262 259 384 151 271 265 387 153 264 261 388 154 273 268 266 267 275 270 392 155 266 269 270 156 268 151 271 268 267 271 393 269 270 264 395 158 280 273 274 159 272 266 275 272 281 275 397 273 274 267 398 160 283 278 276 277 285 279 399 161 276 280 279 278 277 281 400 157 278 272 280 281 279 274 401 163 290 283 284 164 282 276 285 282 291 285 402 283 284 277 403 165 294 287 288 166 286 290 289 286 295 289 404 287 288 291 405 162 287 282 290 291 289 284 406 170 298 294 293 292 299 295 407 171 292 286 294 295 293 288 408 173 301 297 409 175 296 298 411 168 297 292 298 299 411 293 413 180 304 301 414 181 300 296 415 183 306 303 418 185 302 304 420 177 303 300 421 186 309 307 424 187 186 302 307 306 305 418 426 427 310 312 191 188 191 305 310 309 308 424 429 194 317 312 313 190 311 308 314 311 319 314 430 312 313 427 431 432 318 323 324 192 324 317 318 193 316 311 319 316 315 319 433 317 318 313 434 202 328 321 322 195 320 324 323 320 329 323 435 321 322 315 436 196 321 316 315 198 332 328 327 332 442 327 437 325 326 329 438 201 325 320 328 329 327 322 439 203 334 331 440 206 330 332 442 207 331 325 326 210 337 334 446 211 333 330 447 213 340 336 450 216 335 337 451 217 336 333 444 454 339 342 228 220 338 340 455 221 339 335 458 225 345 342 461 226 341 338 462 465 344 349 236 231 343 345 466 232 344 341 469 233 353 347 348 234 346 236 349 346 355 349 471 347 348 343 474 241 357 352 350 351 359 354 476 237 350 353 354 238 352 346 355 352 351 355 477 353 354 348 470 239 360 357 358 240 356 350 359 356 364 359 479 357 358 351 480 243 361 356 364 242 247 360 363 481 363 248 247 361 362 364 482 360 363 358 478 245 368 366 483 248 365 481 484 251 371 368 487 252 367 365 488 253 373 255 369 370 375 371 491 255 370 367 492 257 380 373 374 258 372 369 375 372 381 375 495 373 374 370 496 259 384 378 376 377 386 379 497 260 376 380 379 378 377 381 498 256 378 372 380 381 379 374 499 261 388 383 391 262 382 384 385 263 383 376 386 383 391 386 501 384 385 377 502 264 395 388 389 265 387 382 390 387 396 390 503 388 389 391 504 382 390 385 500 267 398 393 505 270 392 395 394 393 505 396 507 271 393 387 395 396 394 389 508 274 401 398 509 275 397 392 510 277 403 400 513 279 399 401 515 281 400 397 516 284 406 403 519 285 402 399 520 288 408 405 523 289 404 406 524 291 405 402 527 293 413 408 529 295 407 404 531 296 415 411 409 410 417 412 533 297 409 299 412 411 410 413 534 299 412 407 537 300 421 415 416 301 414 409 417 414 423 417 539 415 416 410 541 302 307 420 418 419 426 422 543 303 418 421 422 304 420 414 423 420 419 423 545 421 422 416 547 305 310 426 425 424 429 550 549 307 424 419 550 308 314 429 428 427 431 553 552 310 427 425 553 313 434 431 555 314 430 428 556 315 436 433 557 318 432 434 558 319 433 430 561 322 439 436 563 323 435 432 564 326 443 438 567 327 437 439 568 329 438 435 571 330 447 442 440 441 449 443 573 331 440 326 443 442 441 437 574 337 451 446 444 445 453 448 575 333 444 447 448 334 446 440 449 446 445 449 576 447 448 441 577 335 458 451 452 336 450 444 453 450 459 453 578 451 452 445 579 338 462 455 456 339 454 458 457 454 464 457 580 455 456 459 581 340 455 450 458 459 457 452 582 583 463 468 469 341 469 462 463 342 461 454 464 461 460 464 584 462 463 456 585 343 474 466 467 344 465 469 468 465 475 468 586 466 467 460 587 345 466 461 460 355 477 471 472 348 470 474 473 470 593 473 588 471 472 475 589 349 471 465 474 475 473 467 590 351 480 477 592 354 476 470 593 596 479 482 364 358 478 480 598 359 479 476 600 362 366 482 602 363 481 478 601 365 488 484 486 366 483 602 485 484 486 603 606 483 490 485 605 367 492 488 489 368 487 483 490 487 494 490 607 488 489 486 608 370 496 492 493 371 491 487 494 491 612 494 609 492 493 489 610 374 499 496 611 375 495 491 612 377 502 498 615 379 497 499 617 381 498 495 618 621 501 504 391 385 500 502 623 386 501 497 624 389 508 504 627 390 503 500 628 392 510 394 505 506 512 507 631 394 506 508 632 396 507 503 635 397 516 510 511 398 509 505 512 509 518 512 637 510 511 506 638 399 520 515 513 514 522 517 640 400 513 516 517 401 515 509 518 515 514 518 641 516 517 511 642 402 527 520 521 403 519 513 522 519 528 522 643 520 521 514 644 404 531 524 525 405 523 527 526 523 532 526 645 524 525 528 646 406 524 519 527 528 526 521 647 407 537 531 530 529 538 532 649 408 529 523 531 532 530 525 650 410 541 534 535 412 533 537 536 533 542 536 651 534 535 538 652 413 534 529 537 538 536 530 648 416 547 541 540 539 548 542 653 417 539 533 541 542 540 535 654 419 550 545 543 544 551 546 655 422 543 547 546 545 544 548 656 423 545 539 547 548 546 540 657 425 553 551 658 426 425 543 551 550 549 544 660 428 556 554 661 429 428 549 554 553 552 658 663 430 561 556 664 431 555 552 665 432 564 558 559 433 557 561 560 557 566 560 668 558 559 562 669 434 558 555 561 562 560 664 670 435 571 564 565 436 563 557 566 563 572 566 671 564 565 559 672 437 574 568 569 438 567 571 570 567 677 570 673 568 569 572 674 439 568 563 571 572 570 565 675 441 577 574 676 443 573 567 677 445 579 576 680 448 575 577 682 449 576 573 684 452 582 579 687 453 578 575 688 456 585 581 691 457 580 582 692 459 581 578 686 460 587 584 696 463 583 585 698 464 584 580 700 467 590 587 702 468 586 583 703 472 595 589 706 473 588 590 707 475 589 586 710 712 594 599 600 476 600 593 594 477 592 472 595 592 591 595 713 593 594 588 714 478 601 598 596 597 604 599 715 479 596 600 599 598 597 591 716 480 598 592 591 482 602 596 604 481 484 601 603 602 485 604 717 601 603 597 718 486 608 606 719 485 605 717 720 489 610 608 723 490 607 605 724 493 614 610 727 494 609 607 728 495 618 612 613 496 611 493 614 611 620 614 732 612 613 609 733 497 624 617 615 616 626 619 734 498 615 618 619 499 617 611 620 617 616 620 735 618 619 613 731 500 628 623 621 622 630 625 736 501 621 624 625 502 623 615 626 623 622 626 737 624 625 616 738 503 635 628 629 504 627 621 630 627 636 630 739 628 629 622 740 506 638 632 633 507 631 635 634 631 639 634 741 632 633 636 742 508 632 627 635 636 634 629 743 511 642 638 744 512 637 631 638 639 744 633 746 514 644 641 747 517 640 642 749 518 641 637 751 521 647 644 755 522 643 640 756 525 650 646 759 526 645 647 760 528 646 643 754 763 649 652 538 530 648 650 765 532 649 645 767 535 654 652 769 536 651 648 770 540 657 654 775 542 653 651 777 544 660 656 779 546 655 657 781 548 656 653 774 549 554 660 659 658 663 784 783 551 658 655 784 552 665 663 662 661 667 787 786 554 661 659 787 555 562 665 666 556 664 661 667 664 670 667 789 665 666 662 790 559 672 669 791 560 668 670 792 562 669 666 793 565 675 672 794 566 671 668 795 569 679 674 796 570 673 675 797 572 674 671 798 573 684 677 678 574 676 569 679 676 685 679 799 677 678 673 800 575 688 682 680 681 690 683 801 576 680 684 683 682 681 685 802 577 682 676 684 685 683 678 803 582 692 687 695 578 686 688 689 579 687 680 690 687 695 690 804 688 689 681 805 580 700 692 693 581 691 686 694 691 701 694 806 692 693 695 807 686 694 689 808 583 703 698 696 697 705 699 813 584 696 700 699 698 697 701 809 585 698 691 700 701 699 693 810 586 710 703 704 587 702 696 705 702 711 705 811 703 704 697 812 588 714 707 708 589 706 710 709 706 819 709 814 707 708 711 815 590 707 702 710 711 709 704 816 591 716 713 825 594 712 714 817 595 713 706 819 597 718 716 821 599 715 712 823 603 606 718 828 604 717 715 827 605 724 720 722 606 719 828 721 720 722 829 832 719 726 721 831 607 728 724 725 608 723 719 726 723 730 726 833 724 725 722 834 609 733 728 729 610 727 723 730 727 840 730 835 728 729 725 836 837 732 735 620 613 731 733 839 614 732 727 840 616 738 735 843 619 734 731 845 622 740 737 847 625 736 738 849 626 737 734 850 629 743 740 853 630 739 736 854 633 746 742 857 634 741 743 858 636 742 739 860 637 751 639 745 744 752 746 862 639 745 741 863 640 756 749 747 748 758 750 864 641 747 751 750 749 748 752 865 642 749 744 751 752 750 745 866 871 757 762 753 754 755 760 647 643 754 756 757 644 755 747 758 755 753 758 867 756 757 748 868 645 767 760 761 646 759 754 762 759 768 762 869 760 761 753 870 648 770 765 763 764 772 766 876 649 763 767 766 765 764 768 872 650 765 759 767 768 766 761 873 651 777 770 771 652 769 763 772 769 778 772 874 770 771 764 875 881 776 782 773 774 775 781 657 653 774 777 776 775 773 778 877 654 775 769 777 778 776 771 878 655 784 781 779 780 785 782 879 656 779 774 782 781 780 773 880 659 787 785 882 660 659 779 785 784 783 780 884 662 790 788 886 663 662 783 788 787 786 882 887 666 793 790 888 667 789 786 890 668 795 792 893 669 791 793 894 670 792 789 895 671 798 795 898 672 794 791 900 673 800 797 903 674 796 798 904 675 797 794 905 678 803 800 908 679 799 796 910 681 805 802 913 683 801 803 914 685 802 799 915 689 808 805 918 690 804 801 920 693 810 807 923 694 806 808 924 695 807 804 926 699 813 810 928 701 809 806 929 704 816 812 933 705 811 813 934 697 812 809 935 708 820 815 941 709 814 816 937 711 815 811 938 713 825 819 817 818 826 820 939 714 817 708 820 819 818 814 940 715 827 823 821 822 830 824 942 716 821 825 824 823 822 826 943 712 823 817 825 826 824 818 944 718 828 821 830 717 720 827 829 828 721 830 945 827 829 822 946 722 834 832 947 721 831 945 948 725 836 834 952 726 833 831 953 729 842 836 955 730 835 833 956 731 845 839 837 838 846 841 961 732 837 840 841 733 839 729 842 839 838 842 957 840 841 835 958 734 850 845 843 844 852 846 959 735 843 837 846 845 844 838 960 736 854 849 847 848 856 851 966 737 847 850 851 738 849 843 852 849 848 852 962 850 851 844 963 739 860 854 855 740 853 847 856 853 861 856 964 854 855 848 965 741 863 858 967 742 857 860 859 858 967 861 968 743 858 853 860 861 859 855 969 745 866 863 970 746 862 857 972 748 868 865 975 750 864 866 976 752 865 862 977 757 871 868 980 758 867 864 982 761 873 870 985 762 869 871 986 753 870 867 988 766 876 873 990 768 872 869 991 771 878 875 995 772 874 876 996 764 875 872 998 776 881 878 1000 778 877 874 1001 780 884 880 1010 782 879 881 1005 773 880 877 1007 783 788 884 882 883 887 885 1014 785 882 879 885 884 883 1010 1009 786 890 887 892 788 886 883 1012 789 895 890 888 889 897 891 1020 790 888 886 891 890 889 892 1016 886 891 1012 1017 791 900 894 902 792 893 895 896 793 894 888 897 894 902 897 1018 895 896 889 1019 794 905 900 898 899 907 901 1025 795 898 893 901 900 899 902 1021 893 901 896 1022 796 910 904 912 797 903 905 906 798 904 898 907 904 912 907 1023 905 906 899 1024 799 915 910 908 909 917 911 1030 800 908 903 911 910 909 912 1026 903 911 906 1027 801 920 914 922 802 913 915 916 803 914 908 917 914 922 917 1028 915 916 909 1029 804 926 920 918 919 927 921 1035 805 918 913 921 920 919 922 1031 913 921 916 1032 806 929 924 932 807 923 926 925 924 932 927 1033 808 924 918 926 927 925 919 1034 809 935 929 930 810 928 923 931 928 936 931 1041 929 930 932 1036 923 931 925 1037 811 938 934 1044 812 933 935 1038 813 934 928 935 936 1038 930 1040 815 941 938 1042 816 937 933 1043 818 944 940 1056 820 939 941 1047 814 940 937 1049 822 946 943 1060 824 942 944 1052 826 943 939 1054 829 832 946 950 830 945 942 1058 831 953 948 954 832 947 950 949 948 954 951 1062 945 948 1058 950 951 949 1059 1063 833 956 953 1070 834 952 947 1064 947 1064 949 1066 835 958 956 1067 836 955 952 1069 841 961 958 1073 842 957 955 1074 844 963 960 1085 846 959 961 1077 838 960 957 1079 851 966 963 1081 852 962 959 1082 855 969 965 1091 856 964 966 1087 848 965 962 1088 857 972 859 974 859 974 969 1089 861 968 964 1090 862 977 972 970 971 979 973 1096 863 970 967 973 972 971 974 1092 967 973 968 1093 864 982 976 984 865 975 977 978 866 976 970 979 976 984 979 1094 977 978 971 1095 867 988 982 980 981 989 983 1097 868 980 975 983 982 981 984 1098 975 983 978 1099 869 991 986 994 870 985 988 987 986 994 989 1100 871 986 980 988 989 987 981 1101 872 998 991 992 873 990 985 993 990 999 993 1102 991 992 994 1103 985 993 987 1104 874 1001 996 1004 875 995 998 997 996 1004 999 1105 876 996 990 998 999 997 992 1106 877 1007 1001 1002 878 1000 995 1003 1000 1008 1003 1111 1001 1002 1004 1107 995 1003 997 1108 880 1010 1007 1006 1005 1011 1008 1109 881 1005 1000 1007 1008 1006 1002 1110 885 1014 1011 1112 879 885 1005 1010 1011 1009 1006 1114 887 892 1014 1012 1013 1017 1015 1116 883 1012 1009 1014 1015 1013 1112 1118 891 1020 1017 1119 892 1016 1013 1120 896 1022 1019 1123 897 1018 1020 1125 889 1019 1016 1126 901 1025 1022 1129 902 1021 1018 1130 906 1027 1024 1133 907 1023 1025 1135 899 1024 1021 1136 911 1030 1027 1139 912 1026 1023 1140 916 1032 1029 1143 917 1028 1030 1144 909 1029 1026 1147 921 1035 1032 1149 922 1031 1028 1150 925 1037 1034 1153 927 1033 1035 1154 919 1034 1031 1157 931 1041 1037 1159 932 1036 1033 1160 934 1044 936 1038 1039 1046 1040 1161 936 1039 1041 1162 930 1040 1036 1163 937 1049 1043 1051 938 1042 1044 1045 933 1043 1038 1046 1043 1051 1046 1164 1044 1045 1039 1165 940 1056 1049 1047 1048 1057 1050 1166 941 1047 1042 1050 1049 1048 1051 1167 1042 1050 1045 1168 943 1060 1054 1052 1053 1061 1055 1173 944 1052 1056 1055 1054 1053 1057 1169 939 1054 1047 1056 1057 1055 1048 1170 946 950 1060 1058 1059 951 1061 1171 942 1058 1052 1060 1061 1059 1053 1172 949 1066 1063 1174 951 1062 1171 1175 953 1070 954 1065 1064 1072 1066 1176 954 1065 1062 1177 955 1074 1069 1067 1068 1076 1071 1178 956 1067 1070 1071 952 1069 1064 1072 1069 1068 1072 1179 1070 1071 1065 1180 957 1079 1074 1075 958 1073 1067 1076 1073 1080 1076 1181 1074 1075 1068 1182 960 1085 1079 1078 1077 1086 1080 1183 961 1077 1073 1079 1080 1078 1075 1184 962 1088 1082 1083 963 1081 1085 1084 1081 1189 1084 1185 1082 1083 1086 1186 959 1082 1077 1085 1086 1084 1078 1187 965 1091 1088 1188 966 1087 1081 1189 968 1093 1090 1192 969 1089 1091 1194 964 1090 1087 1195 973 1096 1093 1198 974 1092 1089 1199 978 1099 1095 1202 979 1094 1096 1203 971 1095 1092 1206 981 1101 1098 1215 983 1097 1099 1208 984 1098 1094 1209 987 1104 1101 1212 989 1100 1097 1213 992 1106 1103 1221 993 1102 1104 1217 994 1103 1100 1218 997 1108 1106 1219 999 1105 1102 1220 1003 1111 1108 1222 1004 1107 1105 1223 1006 1114 1110 1224 1008 1109 1111 1226 1002 1110 1107 1228 1009 1015 1114 1112 1113 1118 1115 1229 1011 1112 1109 1115 1114 1113 1224 1230 1013 1120 1118 1117 1116 1122 1232 1231 1015 1116 1113 1232 1016 1126 1120 1121 1017 1119 1116 1122 1119 1128 1122 1234 1120 1121 1117 1235 1018 1130 1125 1123 1124 1132 1127 1236 1019 1123 1126 1127 1020 1125 1119 1128 1125 1124 1128 1237 1126 1127 1121 1238 1021 1136 1130 1131 1022 1129 1123 1132 1129 1138 1132 1239 1130 1131 1124 1240 1023 1140 1135 1133 1134 1142 1137 1241 1024 1133 1136 1137 1025 1135 1129 1138 1135 1134 1138 1242 1136 1137 1131 1243 1026 1147 1140 1141 1027 1139 1133 1142 1139 1148 1142 1244 1140 1141 1134 1245 1028 1150 1144 1145 1029 1143 1147 1146 1143 1152 1146 1246 1144 1145 1148 1247 1030 1144 1139 1147 1148 1146 1141 1248 1031 1157 1150 1151 1032 1149 1143 1152 1149 1158 1152 1249 1150 1151 1145 1250 1033 1160 1154 1155 1034 1153 1157 1156 1153 1255 1156 1251 1154 1155 1158 1252 1035 1154 1149 1157 1158 1156 1151 1253 1036 1163 1160 1254 1037 1159 1153 1255 1039 1165 1162 1258 1040 1161 1163 1260 1041 1162 1159 1261 1045 1168 1165 1264 1046 1164 1161 1265 1048 1170 1167 1268 1050 1166 1168 1269 1051 1167 1164 1272 1055 1173 1170 1274 1057 1169 1166 1275 1059 1063 1172 1278 1061 1171 1173 1279 1053 1172 1169 1280 1062 1177 1175 1282 1063 1174 1278 1284 1065 1180 1177 1286 1066 1176 1174 1287 1068 1182 1179 1291 1071 1178 1180 1292 1072 1179 1176 1294 1075 1184 1182 1296 1076 1181 1178 1297 1078 1187 1184 1300 1080 1183 1181 1301 1083 1191 1186 1303 1084 1185 1187 1304 1086 1186 1183 1305 1087 1195 1189 1190 1088 1188 1083 1191 1188 1197 1191 1306 1189 1190 1185 1307 1089 1199 1194 1192 1193 1201 1196 1308 1090 1192 1195 1196 1091 1194 1188 1197 1194 1193 1197 1309 1195 1196 1190 1310 1092 1206 1199 1200 1093 1198 1192 1201 1198 1207 1201 1311 1199 1200 1193 1312 1094 1209 1203 1204 1095 1202 1206 1205 1202 1211 1205 1313 1203 1204 1207 1314 1096 1203 1198 1206 1207 1205 1200 1315 1098 1215 1209 1210 1099 1208 1202 1211 1208 1216 1211 1316 1209 1210 1204 1317 1100 1218 1213 1318 1101 1212 1215 1214 1213 1318 1216 1320 1097 1213 1208 1215 1216 1214 1210 1321 1103 1221 1218 1322 1104 1217 1212 1323 1105 1223 1220 1326 1106 1219 1221 1328 1102 1220 1217 1330 1107 1228 1223 1332 1108 1222 1219 1333 1109 1115 1226 1224 1225 1230 1227 1336 1110 1224 1228 1227 1226 1225 1337 1338 1111 1226 1222 1337 1113 1232 1230 1340 1115 1229 1225 1342 1117 1235 1233 1343 1118 1117 1229 1233 1232 1231 1340 1345 1121 1238 1235 1346 1122 1234 1231 1347 1124 1240 1237 1350 1127 1236 1238 1352 1128 1237 1234 1354 1131 1243 1240 1356 1132 1239 1236 1357 1134 1245 1242 1360 1137 1241 1243 1362 1138 1242 1239 1364 1141 1248 1245 1366 1142 1244 1241 1367 1145 1250 1247 1370 1146 1246 1248 1371 1148 1247 1244 1374 1151 1253 1250 1376 1152 1249 1246 1378 1155 1257 1252 1380 1156 1251 1253 1381 1158 1252 1249 1383 1159 1261 1255 1256 1160 1254 1155 1257 1254 1263 1257 1385 1255 1256 1251 1386 1161 1265 1260 1258 1259 1267 1262 1387 1162 1258 1261 1262 1163 1260 1254 1263 1260 1259 1263 1388 1261 1262 1256 1389 1164 1272 1265 1266 1165 1264 1258 1267 1264 1273 1267 1390 1265 1266 1259 1391 1166 1275 1269 1270 1167 1268 1272 1271 1268 1277 1271 1392 1269 1270 1273 1393 1168 1269 1264 1272 1273 1271 1266 1394 1169 1280 1275 1276 1170 1274 1268 1277 1274 1281 1277 1395 1275 1276 1270 1396 1171 1175 1279 1397 1172 1278 1280 1399 1173 1279 1274 1280 1281 1399 1276 1401 1174 1287 1284 1282 1283 1289 1285 1402 1175 1282 1397 1285 1284 1283 1398 1403 1176 1294 1287 1288 1177 1286 1282 1289 1286 1295 1289 1404 1287 1288 1283 1405 1406 1293 1299 1290 1291 1292 1297 1178 1179 1291 1294 1293 1292 1290 1295 1407 1180 1292 1286 1294 1295 1293 1288 1408 1181 1301 1297 1298 1182 1296 1291 1299 1296 1302 1299 1409 1297 1298 1290 1410 1183 1305 1301 1412 1184 1300 1296 1301 1302 1412 1298 1414 1185 1307 1304 1415 1186 1303 1305 1417 1187 1304 1300 1418 1190 1310 1307 1421 1191 1306 1303 1422 1193 1312 1309 1425 1196 1308 1310 1426 1197 1309 1306 1429 1200 1315 1312 1431 1201 1311 1308 1432 1204 1317 1314 1435 1205 1313 1315 1436 1207 1314 1311 1439 1210 1321 1317 1441 1211 1316 1313 1443 1212 1323 1214 1318 1319 1325 1320 1445 1214 1319 1321 1446 1216 1320 1316 1440 1217 1330 1323 1324 1218 1322 1318 1325 1322 1331 1325 1448 1323 1324 1319 1449 1219 1333 1328 1326 1327 1335 1329 1450 1220 1326 1330 1329 1328 1327 1331 1451 1221 1328 1322 1330 1331 1329 1324 1447 1222 1337 1333 1334 1223 1332 1326 1335 1332 1339 1335 1453 1333 1334 1327 1454 1225 1342 1338 1455 1228 1227 1332 1339 1227 1336 1339 1456 1337 1338 1334 1452 1229 1233 1342 1340 1341 1345 1458 1457 1230 1340 1336 1458 1231 1347 1345 1344 1343 1349 1461 1460 1233 1343 1341 1461 1234 1354 1347 1348 1235 1346 1343 1349 1346 1355 1349 1463 1347 1348 1344 1464 1236 1357 1352 1350 1351 1359 1353 1465 1237 1350 1354 1353 1352 1351 1355 1466 1238 1352 1346 1354 1355 1353 1348 1467 1239 1364 1357 1358 1240 1356 1350 1359 1356 1365 1359 1468 1357 1358 1351 1469 1241 1367 1362 1360 1361 1369 1363 1470 1242 1360 1364 1363 1362 1361 1365 1471 1243 1362 1356 1364 1365 1363 1358 1472 1244 1374 1367 1368 1245 1366 1360 1369 1366 1375 1369 1473 1367 1368 1361 1474 1246 1378 1371 1372 1247 1370 1374 1373 1370 1379 1373 1475 1371 1372 1375 1476 1248 1371 1366 1374 1375 1373 1368 1477 1249 1383 1378 1377 1376 1384 1379 1478 1250 1376 1370 1378 1379 1377 1372 1479 1251 1386 1381 1480 1252 1380 1383 1382 1381 1480 1384 1482 1253 1381 1376 1383 1384 1382 1377 1483 1256 1389 1386 1485 1257 1385 1380 1486 1259 1391 1388 1489 1262 1387 1389 1491 1263 1388 1385 1484 1266 1394 1391 1494 1267 1390 1387 1495 1270 1396 1393 1498 1271 1392 1394 1499 1273 1393 1390 1502 1276 1401 1396 1504 1277 1395 1392 1506 1278 1284 1399 1397 1398 1285 1400 1508 1279 1397 1281 1400 1399 1398 1401 1509 1281 1400 1395 1510 1283 1405 1403 1511 1285 1402 1508 1512 1288 1408 1405 1516 1289 1404 1402 1517 1290 1410 1407 1520 1293 1406 1408 1521 1295 1407 1404 1524 1298 1414 1410 1526 1299 1409 1406 1528 1530 1413 1419 1418 1300 1418 1302 1413 1412 1411 1414 1531 1302 1413 1409 1533 1303 1422 1417 1415 1416 1424 1419 1534 1304 1415 1418 1419 1305 1417 1412 1411 1417 1416 1411 1535 1536 1423 1428 1429 1306 1429 1422 1423 1307 1421 1415 1424 1421 1420 1424 1537 1422 1423 1416 1538 1308 1432 1426 1427 1309 1425 1429 1428 1425 1434 1428 1539 1426 1427 1420 1540 1310 1426 1421 1420 1541 1433 1438 1439 1311 1439 1432 1433 1312 1431 1425 1434 1431 1430 1434 1542 1432 1433 1427 1543 1313 1443 1436 1437 1314 1435 1439 1438 1435 1444 1438 1544 1436 1437 1430 1545 1315 1436 1431 1430 1546 1441 1446 1321 1316 1440 1443 1442 1441 1546 1444 1548 1317 1441 1435 1443 1444 1442 1437 1549 1319 1449 1446 1550 1320 1445 1440 1551 1554 1448 1451 1331 1324 1447 1449 1556 1325 1448 1445 1557 1327 1454 1451 1561 1329 1450 1447 1562 1565 1453 1456 1339 1334 1452 1454 1566 1335 1453 1450 1569 1336 1458 1456 1570 1338 1455 1452 1571 1341 1461 1459 1574 1342 1341 1455 1459 1458 1457 1570 1576 1344 1464 1462 1577 1345 1344 1457 1462 1461 1460 1574 1579 1348 1467 1464 1580 1349 1463 1460 1581 1351 1469 1466 1584 1353 1465 1467 1586 1355 1466 1463 1587 1358 1472 1469 1590 1359 1468 1465 1591 1361 1474 1471 1594 1363 1470 1472 1596 1365 1471 1468 1598 1368 1477 1474 1600 1369 1473 1470 1601 1372 1479 1476 1604 1373 1475 1477 1605 1375 1476 1473 1608 1377 1483 1479 1610 1379 1478 1475 1612 1380 1486 1382 1480 1481 1488 1482 1614 1382 1481 1483 1615 1384 1482 1478 1617 1389 1491 1485 1493 1385 1484 1486 1487 1386 1485 1480 1488 1485 1493 1488 1619 1486 1487 1481 1620 1387 1495 1491 1489 1490 1497 1492 1621 1388 1489 1484 1492 1491 1490 1493 1622 1484 1492 1487 1623 1390 1502 1495 1496 1391 1494 1489 1497 1494 1503 1497 1624 1495 1496 1490 1625 1392 1506 1499 1500 1393 1498 1502 1501 1498 1507 1501 1626 1499 1500 1503 1627 1394 1499 1494 1502 1503 1501 1496 1628 1395 1510 1506 1505 1504 1634 1507 1629 1396 1504 1498 1506 1507 1505 1500 1630 1398 1403 1509 1631 1400 1508 1510 1633 1401 1509 1504 1634 1402 1517 1512 1513 1403 1511 1631 1514 1511 1519 1514 1637 1512 1513 1632 1638 1639 1518 1523 1524 1404 1524 1517 1518 1405 1516 1511 1519 1516 1515 1519 1640 1517 1518 1513 1641 1406 1528 1521 1522 1407 1520 1524 1523 1520 1529 1523 1642 1521 1522 1515 1643 1408 1521 1516 1515 1644 1527 1532 1533 1409 1533 1528 1527 1526 1525 1529 1645 1410 1526 1520 1528 1529 1527 1522 1646 1411 1535 1531 1647 1413 1530 1533 1532 1531 1647 1525 1649 1414 1531 1526 1525 1416 1538 1535 1652 1419 1534 1530 1653 1420 1540 1537 1656 1423 1536 1538 1657 1424 1537 1534 1650 1427 1543 1540 1662 1428 1539 1536 1663 1430 1545 1542 1666 1433 1541 1543 1667 1434 1542 1539 1660 1437 1549 1545 1671 1438 1544 1541 1674 1440 1551 1442 1546 1547 1553 1548 1677 1442 1547 1549 1678 1444 1548 1544 1670 1445 1557 1551 1552 1446 1550 1546 1553 1550 1559 1553 1682 1551 1552 1547 1684 1447 1562 1556 1554 1555 1564 1558 1685 1448 1554 1557 1558 1449 1556 1550 1559 1556 1555 1559 1686 1557 1558 1552 1681 1687 1563 1568 1569 1450 1569 1562 1563 1451 1561 1554 1564 1561 1560 1564 1688 1562 1563 1555 1689 1452 1571 1566 1567 1453 1565 1569 1568 1565 1573 1568 1690 1566 1567 1560 1691 1454 1566 1561 1560 1455 1459 1571 1572 1456 1570 1565 1573 1570 1576 1573 1693 1571 1572 1567 1694 1457 1462 1576 1575 1574 1579 1692 1695 1459 1574 1572 1692 1460 1581 1579 1578 1577 1583 1697 1696 1462 1577 1575 1697 1463 1587 1581 1582 1464 1580 1577 1583 1580 1589 1583 1699 1581 1582 1578 1700 1465 1591 1586 1584 1585 1593 1588 1701 1466 1584 1587 1588 1467 1586 1580 1589 1586 1585 1589 1702 1587 1588 1582 1703 1468 1598 1591 1592 1469 1590 1584 1593 1590 1599 1593 1705 1591 1592 1585 1706 1470 1601 1596 1594 1595 1603 1597 1707 1471 1594 1598 1597 1596 1595 1599 1708 1472 1596 1590 1598 1599 1597 1592 1709 1473 1608 1601 1602 1474 1600 1594 1603 1600 1609 1603 1710 1601 1602 1595 1711 1475 1612 1605 1606 1476 1604 1608 1607 1604 1613 1607 1712 1605 1606 1609 1713 1477 1605 1600 1608 1609 1607 1602 1714 1478 1617 1612 1611 1610 1618 1613 1715 1479 1610 1604 1612 1613 1611 1606 1716 1481 1620 1615 1717 1482 1614 1617 1616 1615 1717 1618 1719 1483 1615 1610 1617 1618 1616 1611 1720 1487 1623 1620 1721 1488 1619 1614 1723 1490 1625 1622 1725 1492 1621 1623 1727 1493 1622 1619 1729 1496 1628 1625 1731 1497 1624 1621 1732 1500 1630 1627 1735 1501 1626 1628 1736 1503 1627 1624 1739 1505 1636 1630 1741 1507 1629 1626 1743 1508 1512 1633 1631 1632 1514 1635 1745 1509 1631 1634 1635 1510 1633 1505 1636 1633 1632 1636 1746 1634 1635 1629 1747 1513 1641 1638 1749 1514 1637 1745 1750 1515 1643 1640 1753 1518 1639 1641 1755 1519 1640 1637 1757 1522 1646 1643 1759 1523 1642 1639 1760 1525 1649 1645 1763 1527 1644 1646 1764 1529 1645 1642 1767 1530 1653 1532 1647 1648 1655 1649 1770 1532 1648 1644 1772 1538 1657 1652 1650 1651 1659 1654 1774 1534 1650 1653 1654 1535 1652 1647 1655 1652 1651 1655 1775 1653 1654 1648 1778 1536 1663 1657 1658 1537 1656 1650 1659 1656 1665 1659 1780 1657 1658 1651 1781 1543 1667 1662 1660 1661 1669 1664 1782 1539 1660 1663 1664 1540 1662 1656 1665 1662 1661 1665 1783 1663 1664 1658 1779 1541 1674 1667 1668 1542 1666 1660 1669 1666 1675 1669 1785 1667 1668 1661 1786 1549 1678 1671 1672 1544 1670 1674 1673 1670 1680 1673 1787 1671 1672 1675 1788 1545 1671 1666 1674 1675 1673 1668 1784 1789 1679 1683 1684 1547 1684 1678 1679 1548 1677 1670 1680 1677 1676 1680 1790 1678 1679 1672 1791 1559 1686 1682 1792 1552 1681 1684 1683 1682 1792 1676 1794 1553 1682 1677 1676 1555 1689 1686 1797 1558 1685 1681 1798 1560 1691 1688 1801 1563 1687 1689 1802 1564 1688 1685 1795 1567 1694 1691 1807 1568 1690 1687 1808 1811 1693 1575 1576 1572 1692 1694 1812 1573 1693 1690 1805 1575 1697 1811 1815 1578 1700 1698 1832 1579 1578 1695 1698 1697 1696 1815 1823 1582 1703 1700 1828 1583 1699 1696 1830 1585 1706 1702 1840 1588 1701 1703 1834 1589 1702 1699 1703 1704 1834 1828 1836 1592 1709 1706 1837 1593 1705 1701 1839 1595 1711 1708 1843 1597 1707 1709 1844 1599 1708 1705 1845 1602 1714 1711 1848 1603 1710 1707 1850 1606 1716 1713 1853 1607 1712 1714 1855 1609 1713 1710 1856 1611 1720 1716 1859 1613 1715 1712 1860 1614 1723 1616 1717 1718 1724 1719 1863 1616 1718 1720 1864 1618 1719 1715 1867 1619 1729 1723 1721 1722 1730 1724 1869 1620 1721 1717 1724 1723 1722 1718 1870 1621 1732 1727 1725 1726 1734 1728 1872 1622 1725 1729 1728 1727 1726 1730 1873 1623 1727 1721 1729 1730 1728 1722 1874 1624 1739 1732 1733 1625 1731 1725 1734 1731 1740 1734 1875 1732 1733 1726 1876 1626 1743 1736 1737 1627 1735 1739 1738 1735 1744 1738 1877 1736 1737 1740 1878 1628 1736 1731 1739 1740 1738 1733 1879 1629 1747 1743 1742 1741 1748 1744 1880 1630 1741 1735 1743 1744 1742 1737 1881 1632 1638 1746 1883 1635 1745 1747 1882 1636 1746 1741 1747 1748 1882 1742 1886 1637 1757 1750 1752 1638 1749 1883 1751 1750 1752 1884 1 1749 1758 1751 0 1639 1760 1755 1753 1754 1762 1756 4 1640 1753 1757 1756 1755 1754 1758 5 1641 1755 1749 1757 1758 1756 1752 6 1642 1767 1760 1761 1643 1759 1753 1762 1759 1768 1762 7 1760 1761 1754 8 1644 1772 1764 1765 1645 1763 1767 1766 1763 1773 1766 9 1764 1765 1768 10 1646 1764 1759 1767 1768 1766 1761 11 12 1771 1777 1778 1648 1778 1772 1771 1770 1769 1773 13 1649 1770 1763 1772 1773 1771 1765 14 1651 1781 1775 1776 1654 1774 1778 1777 1774 20 1777 15 1775 1776 1769 16 1655 1775 1770 1769 17 1780 1783 1665 1658 1779 1781 19 1659 1780 1774 20 1661 1786 1783 23 1664 1782 1779 25 27 1785 1788 1675 1668 1784 1786 29 1669 1785 1782 30 1672 1791 1788 33 1673 1787 1784 34 1676 1794 1790 37 1679 1789 1791 38 1680 1790 1787 41 1681 1798 1683 1792 1793 1800 1794 43 1683 1793 1789 44 1689 1802 1797 1795 1796 1804 1799 47 1685 1795 1798 1799 1686 1797 1792 1800 1797 1796 1800 48 1798 1799 1793 49 1687 1808 1802 1803 1688 1801 1795 1804 1801 1810 1804 51 1802 1803 1796 52 1694 1812 1807 1805 1806 1814 1809 53 1690 1805 1808 1809 1691 1807 1801 1810 1807 1806 1810 54 1808 1809 1803 55 1692 1695 1812 1813 1693 1811 1805 1814 1811 1821 1814 56 1812 1813 1806 57 1695 1698 1816 1825 1815 1818 1827 1820 1827 1817 1818 1819 1816 1818 1821 1819 1820 1817 1822 58 1819 1813 1821 1822 1820 59 58 1698 1832 1825 1823 1824 1833 1826 63 1815 1823 1827 1825 1826 1824 1827 1816 1825 1817 1826 1699 1704 1830 1828 1829 1836 1831 65 1700 1828 1832 1831 1830 1829 1833 66 1696 1830 1823 1832 1833 1831 1824 69 1702 1840 1704 1835 1834 1842 1836 70 1704 1835 1829 73 1705 1845 1839 1837 1838 1847 1841 75 1706 1837 1840 1841 1701 1839 1834 1842 1839 1838 1842 76 1840 1841 1835 79 1707 1850 1844 1852 1708 1843 1845 1846 1709 1844 1837 1847 1844 1852 1847 81 1845 1846 1838 82 1710 1856 1850 1848 1849 1858 1851 83 1711 1848 1843 1851 1850 1849 1852 84 1843 1851 1846 80 1712 1860 1855 1853 1854 1862 1857 85 1713 1853 1856 1857 1714 1855 1848 1858 1855 1854 1858 86 1856 1857 1849 87 1715 1867 1860 1861 1716 1859 1853 1862 1859 1868 1862 88 1860 1861 1854 89 1718 1870 1864 1865 1719 1863 1867 1866 1863 1871 1866 90 1864 1865 1868 91 1720 1864 1859 1867 1868 1866 1861 92 1722 1874 1870 93 1724 1869 1863 1871 1870 93 1865 95 1726 1876 1873 96 1728 1872 1874 98 1730 1873 1869 99 1733 1879 1876 102 1734 1875 1872 103 1737 1881 1878 106 1738 1877 1879 107 1740 1878 1875 110 1742 1886 1881 112 1744 1880 1877 113 1746 1883 1748 1885 1745 1750 1882 1883 1884 1751 1885 117 1882 1884 1886 116 1748 1885 1880 120</edge_points>\n\t\t\t<clockwise_edges>5 7007 12 26 465 7003 7 469 2 8 488 14 9 3 492 514 21 7015 496 34 25 7023 504 18 1 7031 512 22 33 7043 516 46 17 7047 520 30 41 7059 532 58 45 7063 540 38 29 7071 548 42 53 7072 588 66 57 7083 556 50 37 7091 560 54 65 7103 572 90 49 7107 576 62 77 7112 71 85 102 72 620 106 81 7119 84 70 7101 7123 88 78 89 79 596 74 61 83 604 86 101 7127 95 105 122 96 612 130 69 7131 104 94 73 103 616 98 117 7132 111 125 138 112 624 146 121 7139 124 110 93 7143 128 118 129 119 628 114 97 123 632 126 137 7147 140 166 109 7151 144 134 145 135 636 170 113 139 640 142 153 7155 156 178 165 7159 160 150 161 151 644 186 169 155 648 158 133 7163 167 141 154 168 652 162 177 7171 180 198 149 7175 184 174 185 175 656 202 157 179 660 182 193 7183 664 210 197 7195 672 190 173 7199 199 181 194 200 680 674 209 7211 684 222 189 7215 692 206 217 7223 700 230 221 7235 708 214 205 7239 712 218 229 7251 724 244 213 7255 732 226 240 7282 253 7275 243 238 247 7281 239 752 234 225 245 725 237 246 744 241 254 7290 275 753 235 748 252 262 7309 265 290 274 7317 269 259 270 260 756 294 749 264 760 267 251 7325 263 289 7333 284 314 285 315 764 310 293 279 768 282 258 7337 291 266 278 292 772 286 301 7345 304 326 313 7357 308 298 309 299 776 798 281 303 780 306 277 7361 280 302 334 784 7401 321 325 7377 792 317 297 7381 796 322 333 7389 812 346 318 7397 816 330 341 7409 828 354 345 7421 832 338 329 7425 844 342 353 7437 852 366 337 7441 856 350 361 7453 868 378 365 7457 872 358 349 7465 884 362 7475 7469 371 377 394 372 892 402 357 7477 904 374 389 7481 383 397 410 384 912 418 393 7485 396 382 369 7489 400 390 401 391 916 386 373 395 891 398 409 7493 412 438 381 7497 416 406 417 407 932 442 385 411 936 414 425 7501 428 450 437 7505 432 422 433 423 944 458 441 427 948 430 405 7509 439 413 426 440 931 434 449 7513 452 478 421 7517 456 446 457 447 956 482 429 451 960 454 477 7533 472 466 461 7529 468 6 473 467 964 10 481 463 968 470 445 7537 479 453 462 480 955 474 510 972 515 493 965 11 984 494 489 15 980 485 505 19 499 509 522 500 992 530 513 23 508 498 486 507 996 502 13 27 487 506 521 31 524 550 497 35 528 518 529 519 1008 554 501 523 1012 526 541 39 535 545 562 536 1020 570 549 43 544 534 553 543 1024 538 517 47 551 525 542 552 1028 546 561 55 564 590 533 59 568 558 569 559 1032 594 537 563 1036 566 577 63 580 606 589 67 584 574 585 575 1040 610 593 579 1044 582 557 51 591 565 578 592 1048 586 605 87 600 622 609 599 1052 1074 573 91 607 581 598 608 1056 602 617 99 1060 634 621 107 1068 614 597 75 1072 618 629 115 1116 642 633 127 1084 626 613 131 1088 630 641 143 1100 654 625 147 1108 638 649 159 1156 662 653 163 1124 646 637 171 1128 650 661 183 1140 682 645 187 1144 658 673 191 667 677 694 668 1188 698 201 195 676 666 681 675 1164 670 657 203 1172 678 693 207 687 697 714 688 1180 722 665 211 696 686 669 695 1184 690 709 215 703 717 734 704 1212 738 713 219 716 702 685 223 720 710 721 711 1196 706 689 715 1200 718 733 227 727 737 248 728 1204 746 701 231 736 726 705 735 1208 730 750 1216 755 1221 729 249 1220 754 742 256 1232 271 745 242 743 255 761 268 1244 774 1233 272 1231 758 769 283 1260 782 773 287 1264 766 757 295 1240 770 781 307 1280 806 765 311 1292 778 793 316 787 801 818 788 1296 826 797 323 800 786 305 327 804 794 805 795 1308 790 777 799 1276 802 842 1316 847 821 817 331 820 846 785 335 824 814 825 815 1320 809 789 819 1324 822 833 339 836 858 845 343 840 830 841 831 1328 866 810 835 1332 838 813 347 811 834 882 1336 887 861 857 351 860 886 829 355 864 854 865 855 1340 849 837 859 1344 862 873 359 876 906 885 363 880 870 881 871 1352 910 850 875 1356 878 853 367 851 874 918 896 403 893 905 375 900 889 901 888 1360 926 909 895 1364 898 869 379 907 877 894 908 1351 902 917 387 920 938 890 399 924 914 925 915 1372 942 897 919 1376 922 950 1380 443 933 937 415 1384 929 913 419 939 921 934 940 1371 1386 949 431 1404 962 930 435 1408 946 970 1420 483 957 961 455 1424 953 945 459 1396 958 969 471 1440 490 954 475 1436 966 981 484 975 989 998 976 1456 1006 985 495 988 974 1441 491 1447 982 1446 983 1460 978 997 503 1000 1014 973 511 1004 994 1005 995 1464 1018 977 999 1468 1002 1013 527 1472 1030 993 531 1015 1001 1010 1016 1480 1474 1025 539 1516 1038 1029 547 1484 1022 1009 555 1488 1026 1037 567 1500 1050 1021 571 1508 1034 1045 583 1524 1058 1049 587 1528 1042 1033 595 1532 1046 1057 603 1544 1082 1041 611 1548 1054 1069 615 1063 1077 1090 1064 1564 1098 1073 619 1076 1062 601 623 1080 1070 1081 1071 1568 1066 1053 1075 1576 1078 1089 631 1092 1118 1061 635 1096 1086 1097 1087 1584 1122 1065 1091 1588 1094 1109 639 1103 1113 1130 1104 1592 1138 1117 643 1112 1102 1121 1111 1596 1106 1085 627 1119 1093 1110 1120 1600 1114 1129 651 1132 1158 1101 655 1136 1126 1137 1127 1604 1162 1105 1131 1608 1134 1145 659 1148 1174 1157 663 1152 1142 1153 1143 1612 1178 1161 1147 1616 1150 1125 647 1159 1133 1146 1160 1620 1154 1173 679 1168 1190 1177 1167 1624 1194 1141 683 1175 1149 1166 1176 1628 1170 1185 691 1632 1202 1189 699 1640 1182 1165 671 1191 1169 1186 1192 1648 1642 1201 719 1652 1214 1181 723 1656 1198 1209 731 1668 1222 1213 739 1676 1206 1197 707 1680 1210 1225 740 1692 1234 1205 747 1224 741 1669 1223 1700 1218 1246 1704 763 1237 1217 751 1236 762 1693 1235 1712 1229 1245 775 1248 1266 1230 759 1252 1242 1253 1243 1716 1274 1705 1247 1720 1250 1290 1724 1295 1269 1265 767 1268 1294 1241 771 1272 1262 1273 1263 1728 1257 1249 1267 1732 1270 1281 807 1284 1310 1293 779 1288 1278 1289 1279 1736 1314 1258 1283 1740 1286 1261 783 1259 1282 1309 791 1304 1326 1305 1327 1744 1766 1313 1299 1748 1302 1277 803 1311 1285 1298 1312 1752 1306 1321 808 1756 1334 1325 823 1764 1318 1297 827 1300 1322 1333 839 1780 1346 1317 843 1784 1330 1341 848 1796 1358 1345 863 1800 1338 1329 867 1772 1342 1366 1812 911 1353 1357 879 1816 1349 1337 883 1828 1354 1365 899 1840 1378 1350 903 1844 1362 1394 1856 943 1373 1377 923 1860 1369 1361 927 1872 1374 1385 928 1388 1410 941 935 1392 1382 1393 1383 1880 1418 1370 1387 1892 1390 1405 963 1399 1413 1426 1400 1900 1434 1409 947 1412 1398 1381 951 1416 1406 1417 1407 1904 1402 1389 1411 1876 1414 1425 952 1428 1438 1397 959 1432 1422 1433 1423 1912 1454 1401 1427 1916 1430 1421 971 1452 1442 1437 967 1448 986 990 1920 987 1449 1453 1443 1924 1445 1429 1439 1911 1450 1461 979 1928 1470 1921 991 1932 1458 1469 1003 1944 1482 1457 1007 1948 1466 1017 1011 1475 1481 1490 1476 1960 1498 1465 1019 1964 1478 1489 1027 1492 1518 1473 1031 1496 1486 1497 1487 1976 1522 1477 1491 1980 1494 1509 1035 1503 1513 1534 1504 1984 1542 1517 1039 1512 1502 1521 1511 1988 1506 1485 1023 1519 1493 1510 1520 1992 1514 1529 1043 1560 1550 1533 1047 1536 1526 1501 1051 1540 1530 1541 1531 2000 1562 1505 1535 2004 1538 1549 1055 1552 1578 1525 1059 1556 1546 1557 1547 2008 1582 1561 1551 2012 1554 1537 1527 1999 1558 1569 1067 2016 1590 1577 1079 1572 1566 1581 1571 2024 2018 1545 1083 1579 1553 1570 1580 2028 1574 1589 1095 2032 1602 1565 1099 2036 1586 1597 1107 2048 1610 1601 1115 2056 1594 1585 1123 2060 1598 1609 1135 2072 1622 1593 1139 2076 1606 1617 1151 2088 1630 1621 1155 2092 1614 1605 1163 2104 1618 1629 1171 2112 1650 1613 1179 2120 1626 1641 1183 1635 1645 1658 1636 2128 1666 1193 1187 1644 1634 1649 1643 2132 1638 1625 1195 2144 1646 1657 1199 1660 1682 1633 1203 1664 1654 1665 1655 2152 1690 1637 1659 2160 1662 1677 1207 1671 1685 1226 1672 2168 1702 1681 1211 1684 1670 1653 1215 1688 1678 1689 1679 2176 1674 1661 1683 2184 1686 1701 1219 1696 1238 2197 1695 2192 1714 1673 1227 2196 1694 1713 1228 1708 1254 2209 1707 2204 1722 1697 1239 2208 1706 1721 1251 2216 1734 1709 1255 2220 1718 1729 1256 2224 1742 1733 1271 2228 1726 1717 1275 2240 1730 1741 1287 2248 1754 1725 1291 2252 1738 1749 1303 2264 1770 1753 1307 2268 1746 1737 1315 2280 1750 1765 1319 1759 1769 1786 1760 2288 1794 1301 1323 1768 1758 1745 1767 2292 1762 1781 1347 1775 1789 1802 1776 2296 1810 1785 1331 1788 1774 1757 1335 1792 1782 1793 1783 2300 1778 1761 1787 2304 1790 1801 1339 1804 1830 1773 1343 1808 1798 1809 1799 2308 1834 1777 1803 2312 1806 1817 1348 1820 1846 1829 1355 1824 1814 1825 1815 2316 1854 1833 1819 2320 1822 1797 1359 1831 1805 1818 1832 2324 1826 1870 2328 1875 1849 1845 1363 1848 1874 1813 1367 1852 1842 1853 1843 2332 1837 1821 1847 2336 1850 1861 1368 1864 1894 1873 1375 1868 1858 1869 1859 2340 1898 1838 1863 2344 1866 1841 1379 1839 1862 1881 1419 1884 1906 1893 1391 1888 1878 1889 1879 2348 2370 1897 1883 2352 1886 1857 1395 1895 1865 1882 1896 2356 1890 1905 1403 2364 1918 1877 1415 2368 1902 1926 2380 1455 1913 1917 1431 2388 1909 1901 1435 2396 1914 1925 1444 2404 1462 1910 1451 2400 1922 1933 1459 1940 1950 2405 1463 1936 1930 2409 1935 2420 1942 1937 1931 2416 1958 1949 1467 1952 1966 1929 1471 1956 1946 1957 1947 2424 1974 1941 1951 2428 1954 1965 1479 1968 1982 1945 1483 1972 1962 1973 1963 2432 2446 1953 1967 2436 1970 1981 1495 2440 1994 1961 1499 2444 1978 1989 1507 2456 2006 1993 1515 2464 1986 1977 1523 2468 1990 2014 2480 1563 2001 2005 1539 2488 1997 1985 1543 2492 2002 2013 1555 2504 2030 1998 1559 2508 2010 1573 1567 2019 2025 2038 2020 2520 2046 2029 1575 2524 2022 2009 1583 2536 2026 2037 1587 2040 2062 2017 1591 2044 2034 2045 2035 2544 2070 2021 2039 2548 2042 2057 1595 2051 2065 2078 2052 2556 2086 2061 1599 2064 2050 2033 1603 2068 2058 2069 2059 2560 2054 2041 2063 2564 2066 2077 1607 2080 2106 2049 1611 2084 2074 2085 2075 2568 2110 2053 2079 2572 2082 2093 1615 2096 2122 2105 1619 2100 2090 2101 2091 2576 2126 2109 2095 2580 2098 2073 1623 2107 2081 2094 2108 2584 2102 2121 1627 2116 2146 2125 2115 2592 2150 2089 1631 2123 2097 2114 2124 2596 2118 2133 1639 2136 2162 2145 1647 2140 2130 2141 2131 2600 2166 2149 2135 2604 2138 2113 1651 2147 2117 2134 2148 2591 2142 2161 1663 2156 2186 2165 2155 2608 2190 2129 1667 2163 2137 2154 2164 2612 2158 2177 1675 2171 2181 2198 2172 2616 2202 2185 1687 2180 2170 2189 2179 2620 2174 2153 1691 2187 2157 2178 2188 2624 2182 2201 1699 2628 2210 2169 1703 2200 1698 2173 2199 2636 2194 2213 1711 2640 2222 2193 1715 2212 1710 2629 2211 2648 2206 2221 1719 2652 2242 2205 1723 2656 2218 2229 1727 2232 2254 2241 1731 2236 2226 2237 2227 2668 2262 2245 2231 2672 2234 2217 1735 2243 2653 2230 2244 2676 2238 2253 1739 2256 2282 2225 1743 2260 2250 2261 2251 2680 2286 2233 2255 2684 2258 2269 1747 2272 2294 2281 1751 2276 2266 2277 2267 2688 2706 2285 2271 2692 2274 2249 1755 2283 2257 2270 2284 2696 2278 2293 1763 2700 2306 2265 1771 2704 2290 2301 1779 2716 2314 2305 1791 2724 2298 2289 1795 2732 2302 2313 1807 2744 2326 2297 1811 2748 2310 2321 1823 2760 2338 2325 1827 2764 2318 2309 1835 2740 2322 2333 1836 2780 2346 2337 1851 2788 2330 2317 1855 2796 2334 2345 1867 2804 2358 2329 1871 2808 2342 2353 1887 2820 2378 2357 1891 2824 2350 2341 1899 2836 2354 2394 2844 2399 2373 2369 1903 2372 2398 1885 1907 2376 2366 2377 2367 2848 2361 2349 2371 2852 2374 2389 1908 2383 2393 2402 2384 2856 2414 2397 1915 2392 2382 2362 2391 2860 2386 2365 1919 2363 2390 2381 1927 2412 2406 2401 1923 2408 1934 2413 2407 2864 1938 2385 2403 2868 2410 2421 1943 2872 2430 2865 1939 2876 2418 2429 1955 2888 2438 2417 1959 2892 2426 2437 1971 2904 2454 2425 1975 2908 2434 2445 1979 2448 2470 1969 1983 2452 2442 2453 2443 2924 2478 2433 2447 2928 2450 2465 1987 2459 2473 2494 2460 2932 2502 2469 1991 2472 2458 2441 1995 2476 2466 2477 2467 2936 2462 2449 2471 2923 2474 2489 1996 2483 2497 2510 2484 2940 2518 2493 2003 2496 2482 2457 2007 2500 2490 2501 2491 2944 2486 2461 2495 2948 2498 2509 2011 2512 2538 2481 2015 2516 2506 2517 2507 2952 2542 2485 2511 2956 2514 2525 2023 2528 2550 2537 2027 2532 2522 2533 2523 2960 2554 2541 2527 2964 2530 2505 2031 2539 2513 2526 2540 2968 2534 2549 2043 2972 2566 2521 2047 2551 2529 2546 2552 2980 2974 2561 2055 2984 2574 2565 2067 2992 2558 2545 2071 3000 2562 2573 2083 3016 2586 2557 2087 3020 2570 2581 2099 3032 2598 2585 2103 3036 2578 2569 2111 3015 2582 2606 3048 2151 2593 2597 2119 3056 2589 2577 2127 3064 2594 2605 2139 3072 2614 2590 2143 3076 2602 2613 2159 3096 2626 2601 2167 3104 2610 2621 2175 3112 2638 2625 2183 3120 2618 2609 2191 3095 2622 2637 2195 2632 2214 3133 2631 3128 2650 2617 2203 3132 2630 2649 2207 2644 2658 3145 2643 3140 2666 2633 2215 3144 2642 2657 2219 2660 2246 2641 2223 2664 2654 2665 2655 3152 2678 2645 2659 3156 2662 2673 2235 3160 2686 2677 2239 3164 2670 2661 2247 3168 2674 2685 2259 3172 2698 2669 2263 3176 2682 2693 2275 3180 2714 2697 2279 3184 2690 2681 2287 3188 2694 2705 2291 2708 2734 2273 2295 2712 2702 2713 2703 3192 2738 2689 2707 3196 2710 2725 2299 2719 2729 2750 2720 3200 2758 2733 2303 2728 2718 2737 2727 3204 2722 2701 2307 2735 2709 2726 2736 3208 2730 2745 2327 2776 2766 2749 2311 2752 2742 2717 2315 2756 2746 2757 2747 3212 2778 2721 2751 3216 2754 2765 2319 2768 2798 2741 2323 2772 2762 2773 2763 3220 2802 2777 2767 3224 2770 2753 2743 3228 2774 2789 2331 2783 2793 2810 2784 3248 2818 2797 2335 2792 2782 2801 2791 3232 2786 2761 2339 2799 2769 2790 2800 3236 2794 2809 2343 2812 2838 2781 2347 2816 2806 2817 2807 3240 2842 2785 2811 3244 2814 2825 2351 2828 2854 2837 2355 2832 2822 2833 2823 3252 3274 2841 2827 3256 2830 2805 2359 2839 2813 2826 2840 3260 2834 2849 2360 3296 2862 2853 2375 3264 2846 2821 2379 3272 2850 2861 2387 3280 2870 2845 2395 3288 2858 2869 2411 3308 2422 2857 2415 3304 2866 2877 2419 2884 2894 3309 2423 2880 2874 3313 2879 3324 2886 2881 2875 3320 2902 2893 2427 2896 2910 2873 2431 2900 2890 2901 2891 3328 2918 2885 2895 3332 2898 2909 2435 2912 2930 2889 2439 2916 2906 2917 2907 3336 3358 2897 2911 3340 2914 2938 3344 2479 2925 2929 2451 3352 2921 2905 2455 3356 2926 2937 2463 3368 2950 2922 2475 3376 2934 2945 2487 3384 2958 2949 2499 3392 2942 2933 2503 3396 2946 2957 2515 3408 2970 2941 2519 3412 2954 2965 2531 3424 2982 2969 2535 3428 2962 2953 2543 3436 2966 2553 2547 2976 3002 2981 2975 3444 3006 2961 2555 3448 2978 2993 2559 2987 2997 3022 2988 3452 3030 3001 2563 2996 2986 3005 2995 3456 2990 2973 2567 3003 2977 2994 3004 3460 2998 3046 3480 3011 3038 3025 3012 2587 3017 3021 2571 3024 3013 2985 2575 3028 3018 3029 3019 3464 3009 2989 3023 3468 3026 3037 2579 3040 3066 3014 2583 3044 3034 3045 3035 3472 3070 3010 3039 3476 3042 3057 2588 3051 3061 3078 3052 3500 3086 3065 2595 3060 3050 3069 3059 3484 3054 3033 2599 3067 3041 3058 3068 3488 3062 3077 2603 3080 3106 3049 2607 3084 3074 3085 3075 3492 3110 3053 3079 3496 3082 3126 3520 3091 3122 3101 3092 2627 3097 3105 2611 3100 3093 3109 3099 3504 3089 3073 2615 3107 3081 3098 3108 3508 3102 3121 2619 3115 3125 3134 3116 3512 3138 3094 2623 3124 3114 3090 3123 3516 3118 3137 2635 3524 3146 3113 2639 3136 2634 3117 3135 3532 3130 3149 2647 3540 3158 3129 2651 3148 2646 3525 3147 3544 3142 3157 2663 3548 3170 3141 2667 3556 3154 3165 2671 3568 3178 3169 2675 3572 3162 3153 2679 3576 3166 3177 2683 3588 3190 3161 2687 3596 3174 3185 2691 3608 3198 3189 2695 3612 3182 3173 2699 3616 3186 3197 2711 3628 3210 3181 2715 3636 3194 3205 2723 3648 3218 3209 2731 3652 3202 3193 2739 3656 3206 3217 2755 3668 3230 3201 2759 3676 3214 3225 2771 3688 3238 3229 2775 3692 3222 3213 2779 3700 3226 3237 2795 3708 3250 3221 2803 3712 3234 3245 2815 3728 3262 3249 2819 3732 3242 3233 2787 3736 3246 3257 2831 3760 3278 3261 2835 3744 3254 3241 2843 3748 3258 3273 2851 3267 3277 3298 3268 3752 3302 2829 2855 3276 3266 3253 3275 3756 3270 3289 2859 3283 3293 3306 3284 3764 3318 3297 2863 3292 3282 3301 3291 3768 3286 3265 2847 3299 3269 3290 3300 3772 3294 3281 2871 3316 3310 3305 2867 3312 2878 3317 3311 3776 2882 3285 3307 3780 3314 3325 2887 3784 3334 3777 2883 3788 3322 3333 2899 3804 3342 3321 2903 3808 3330 3341 2915 3816 3366 3329 2919 3820 3338 3353 2920 3347 3361 3378 3348 3840 3382 3357 2927 3360 3346 2913 2931 3364 3354 3365 3355 3824 3350 3337 3359 3828 3362 3377 2935 3371 3381 3398 3372 3832 3406 3345 2939 3380 3370 3349 3379 3836 3374 3393 2943 3387 3401 3414 3388 3860 3422 3397 2947 3400 3386 3369 2951 3404 3394 3405 3395 3844 3390 3373 3399 3848 3402 3413 2955 3416 3438 3385 2959 3420 3410 3421 3411 3852 3442 3389 3415 3856 3418 3429 2963 3864 3450 3437 2967 3432 3426 3441 3431 3868 3866 3409 2971 3439 3417 3430 3440 3872 3434 3449 2979 3876 3462 3425 2983 3884 3446 3457 2991 3896 3470 3461 2999 3900 3454 3445 3007 3904 3458 3469 3027 3916 3482 3453 3031 3924 3466 3477 3043 3936 3490 3481 3047 3940 3474 3465 3008 3948 3478 3489 3063 3956 3502 3473 3071 3960 3486 3497 3083 3976 3510 3501 3087 3980 3494 3485 3055 3988 3498 3509 3103 3996 3522 3493 3111 4000 3506 3517 3119 4036 3534 3521 3127 4016 3514 3505 3088 4024 3518 3533 3131 3527 3537 3150 3528 4052 3546 3513 3139 3536 3526 4037 3535 4032 3530 3545 3143 3564 3558 3529 3151 4044 3542 3557 3155 3551 3561 3578 3552 4076 3586 3541 3159 3560 3550 3565 3559 4060 3554 4045 3543 4064 3562 3573 3163 3604 3598 3577 3167 3580 3570 3549 3171 3584 3574 3585 3575 4068 3606 3553 3579 4072 3582 3597 3175 3591 3601 3618 3592 4096 3626 3569 3179 3600 3590 3605 3599 4080 3594 3581 3571 4084 3602 3613 3183 3644 3638 3617 3187 3620 3610 3589 3191 3624 3614 3625 3615 4088 3646 3593 3619 4092 3622 3637 3195 3631 3641 3658 3632 4116 3666 3609 3199 3640 3630 3645 3639 4100 3634 3621 3611 4104 3642 3653 3203 3684 3678 3657 3207 3660 3650 3629 3211 3664 3654 3665 3655 4108 3686 3633 3659 4112 3662 3677 3215 3671 3681 3702 3672 4136 3706 3649 3219 3680 3670 3685 3679 4120 3674 3661 3651 4124 3682 3693 3223 3724 3714 3701 3227 3696 3690 3705 3695 4128 3726 3669 3231 3703 3673 3694 3704 4132 3698 3713 3235 3716 3738 3689 3239 3720 3710 3721 3711 4160 3742 3725 3715 4140 3718 3697 3691 4144 3722 3733 3243 4172 3750 3737 3247 4148 3730 3709 3251 3739 3717 3734 3740 4156 4150 3749 3259 4164 3762 3729 3263 4168 3746 3757 3271 4220 3774 3761 3279 4184 3754 3745 3255 4192 3758 3769 3287 4236 3782 3773 3295 4204 3766 3753 3303 4212 3770 3781 3315 3796 3326 3765 3319 4228 3778 3789 3323 3812 3810 3797 3327 3792 3786 3801 3791 4244 3814 4229 3779 3799 4233 3790 3800 4248 3794 3809 3331 4276 3822 3785 3335 4252 3806 3793 3787 4260 4254 3821 3339 4264 3830 3805 3343 4272 3818 3829 3363 4288 3842 3817 3367 4292 3826 3837 3375 4336 3850 3841 3383 4304 3834 3825 3351 4312 3838 3849 3403 4320 3862 3833 3407 4324 3846 3857 3419 4360 3874 3861 3423 4344 3854 3845 3391 4348 3858 3433 3427 3892 3886 3873 3435 4352 3894 3853 3443 4356 3870 3885 3447 3879 3889 3906 3880 4380 3914 3865 3451 3888 3878 3893 3887 4364 3882 3869 3867 4368 3890 3901 3455 3932 3926 3905 3459 3908 3898 3877 3463 3912 3902 3913 3903 4372 3934 3881 3907 4376 3910 3925 3467 3919 3929 3950 3920 4384 3954 3897 3471 3928 3918 3933 3927 4388 3922 3909 3899 4392 3930 3941 3475 3972 3962 3949 3479 3944 3938 3953 3943 4396 3974 3917 3483 3951 3921 3942 3952 4400 3946 3961 3487 3964 3990 3937 3491 3968 3958 3969 3959 4404 3994 3973 3963 4408 3966 3945 3939 4412 3970 3981 3495 4012 4002 3989 3499 3984 3978 3993 3983 4416 4014 3957 3503 3991 3965 3982 3992 4420 3986 4001 3507 4004 4026 3977 3511 4008 3998 4009 3999 4440 4030 4013 4003 4424 4006 3985 3979 4428 4010 4025 3519 4020 4038 4029 4019 4432 4042 3997 3523 4027 4005 4018 4028 4436 4022 4041 3539 4444 4054 4017 3515 4039 4021 3538 4040 4452 4034 4053 3547 4047 4057 3566 4048 4460 4066 4033 3531 4055 4445 4046 4056 4468 4050 4065 3563 4472 4078 4049 3567 4476 4062 4073 3583 4488 4086 4077 3587 4496 4070 4061 3555 4500 4074 4085 3603 4512 4098 4069 3607 4516 4082 4093 3623 4528 4106 4097 3627 4536 4090 4081 3595 4540 4094 4105 3643 4552 4118 4089 3647 4556 4102 4113 3663 4568 4126 4117 3667 4572 4110 4101 3635 4584 4114 4125 3683 4592 4138 4109 3687 4596 4122 4133 3699 4608 4146 4137 3707 4612 4130 4121 3675 4624 4134 4145 3723 4632 4162 4129 3727 4636 4142 3741 3735 4151 4157 4174 4152 4640 4182 4161 3743 4644 4154 4141 3719 4648 4158 4169 3747 4200 4194 4173 3751 4176 4166 4149 3731 4180 4170 4181 4171 4652 4202 4153 4175 4656 4178 4193 3759 4187 4197 4222 4188 4660 4226 4165 3763 4196 4186 4201 4195 4664 4190 4177 4167 4668 4198 4213 3771 4207 4217 4238 4208 4688 4242 4221 3775 4216 4206 4225 4215 4672 4210 4185 3755 4223 4189 4214 4224 4676 4218 4237 3783 4231 4241 3798 4232 4680 3802 4205 3767 4239 4209 4230 4240 4684 4234 4249 3795 4692 4262 4681 3803 4696 4246 3813 3811 4256 4278 4261 4255 4700 4286 4245 3815 4704 4258 4273 3819 4267 4281 4294 4268 4708 4302 4277 3823 4280 4266 4253 3807 4284 4274 4285 4275 4712 4270 4257 4279 4716 4282 4293 3827 4296 4314 4265 3831 4300 4290 4301 4291 4720 4318 4269 4295 4724 4298 4313 3839 4308 4338 4317 4307 4728 4342 4289 3843 4315 4297 4306 4316 4732 4310 4325 3847 4328 4350 4337 3851 4332 4322 4333 4323 4736 4754 4341 4327 4740 4330 4305 3835 4339 4309 4326 4340 4744 4334 4349 3859 4748 4362 4321 3863 4752 4346 4357 3871 4764 4370 4361 3875 4772 4354 4345 3855 4776 4358 4369 3891 4788 4382 4353 3895 4792 4366 4377 3911 4804 4394 4381 3915 4808 4374 4365 3883 4820 4378 4389 3923 4856 4402 4393 3931 4828 4386 4373 3935 4832 4390 4401 3947 4844 4414 4385 3955 4848 4398 4409 3967 4880 4422 4413 3971 4864 4406 4397 3975 4868 4410 4421 3987 4872 4430 4405 3995 4876 4418 4429 4011 4884 4442 4417 4015 4888 4426 4437 4023 4892 4454 4441 4031 4900 4434 4425 4007 4908 4438 4453 4035 4447 4457 4058 4448 4912 4470 4433 4043 4456 4446 4893 4455 4916 4450 4469 4051 4464 4478 4925 4463 4920 4486 4449 4059 4924 4462 4477 4063 4480 4502 4461 4067 4484 4474 4485 4475 4932 4510 4465 4479 4936 4482 4497 4071 4491 4505 4518 4492 4940 4526 4501 4075 4504 4490 4473 4079 4508 4498 4509 4499 4944 4494 4481 4503 4948 4506 4517 4083 4520 4542 4489 4087 4524 4514 4525 4515 4952 4550 4493 4519 4956 4522 4537 4091 4531 4545 4558 4532 4960 4566 4541 4095 4544 4530 4513 4099 4548 4538 4549 4539 4964 4534 4521 4543 4968 4546 4557 4103 4560 4586 4529 4107 4564 4554 4565 4555 4972 4590 4533 4559 4976 4562 4573 4111 4576 4598 4585 4115 4580 4570 4581 4571 4980 4606 4589 4575 4984 4578 4553 4119 4587 4561 4574 4588 4988 4582 4597 4123 4600 4626 4569 4127 4604 4594 4605 4595 4992 4630 4577 4599 4996 4602 4613 4131 4616 4638 4625 4135 4620 4610 4621 4611 5000 5018 4629 4615 5004 4618 4593 4139 4627 4601 4614 4628 5008 4622 4637 4143 5012 4650 4609 4147 5016 4634 4645 4155 5028 4658 4649 4159 5036 4642 4633 4163 5040 4646 4657 4179 5052 4670 4641 4183 5056 4654 4665 4191 5068 4678 4669 4199 5072 4662 4653 4203 5084 4666 4677 4219 5092 4690 4661 4227 5096 4674 4685 4235 5108 4250 4689 4243 5112 4682 4673 4211 5116 4686 4697 4247 5124 4706 5109 4251 5132 4694 4705 4259 5140 4718 4693 4263 5144 4702 4713 4271 5163 4726 4717 4283 5164 4710 4701 4287 5172 4714 4725 4299 5180 4734 4709 4303 5184 4722 4733 4311 5196 4746 4721 4319 5200 4730 4741 4331 5208 4762 4745 4335 5212 4738 4729 4343 5216 4742 4753 4347 4756 4778 4329 4351 4760 4750 4761 4751 5220 4786 4737 4755 5224 4758 4773 4355 4767 4781 4794 4768 5228 4802 4777 4359 4780 4766 4749 4363 4784 4774 4785 4775 5232 4770 4757 4779 5236 4782 4793 4367 4796 4822 4765 4371 4800 4790 4801 4791 5240 4826 4769 4795 5244 4798 4809 4375 4812 4834 4821 4379 4816 4806 4817 4807 5248 4842 4825 4811 5252 4814 4789 4383 4823 4797 4810 4824 5256 4818 4833 4391 4836 4858 4805 4395 4840 4830 4841 4831 5260 4862 4813 4835 5264 4838 4849 4399 5268 4870 4857 4403 4852 4846 4861 4851 5276 5270 4829 4387 4859 4837 4850 4860 5280 4854 4869 4411 5284 4882 4845 4415 5288 4866 4877 4419 5300 4890 4881 4423 5308 4874 4865 4407 5316 4878 4889 4427 5324 4910 4873 4431 5328 4886 4901 4435 4895 4905 4458 4896 5340 4918 4909 4439 4904 4894 5345 4903 5348 4898 4885 4443 5344 4902 4917 4451 5356 4926 4897 4459 5364 4914 4929 4467 5368 4938 4913 4471 4928 4466 5357 4927 5376 4922 4937 4483 5380 4950 4921 4487 5384 4934 4945 4495 5396 4958 4949 4507 5404 4942 4933 4511 5412 4946 4957 4523 5420 4970 4941 4527 5424 4954 4965 4535 5436 4978 4969 4547 5444 4962 4953 4551 5452 4966 4977 4563 5460 4990 4961 4567 5464 4974 4985 4579 5476 4998 4989 4583 5480 4982 4973 4591 5492 4986 4997 4603 5500 5010 4981 4607 5508 4994 5005 4619 5516 5026 5009 4623 5520 5002 4993 4631 5528 5006 5017 4635 5020 5042 4617 4639 5024 5014 5025 5015 5536 5050 5001 5019 5540 5022 5037 4643 5031 5045 5058 5032 5544 5066 5041 4647 5044 5030 5013 4651 5048 5038 5049 5039 5548 5034 5021 5043 5552 5046 5057 4655 5060 5086 5029 4659 5064 5054 5065 5055 5556 5090 5033 5059 5560 5062 5073 4663 5076 5098 5085 4667 5080 5070 5081 5071 5564 5106 5089 5075 5568 5078 5053 4671 5087 5061 5074 5088 5572 5082 5097 4675 5100 5118 5069 4679 5104 5094 5105 5095 5576 5122 5077 5099 5580 5102 5113 4683 5584 4698 5117 4687 5592 5110 5093 4691 5119 5101 5114 5120 5600 5594 5133 4695 5127 5137 5146 5128 5604 5154 5585 4699 5136 5126 5589 5135 5608 5130 5145 4703 5148 5174 5125 4707 5152 5142 5153 5143 5612 5178 5129 5147 5616 5150 5194 5620 5159 5186 5169 5160 4711 5165 5173 4715 5168 5161 5177 5167 5624 5157 5141 4719 5175 5149 5166 5176 5628 5170 5185 4723 5188 5202 5162 4727 5192 5182 5193 5183 5632 5206 5158 5187 5636 5190 5201 4731 5644 5218 5181 4735 5203 5189 5198 5204 5652 5646 5213 4739 5656 5226 5217 4743 5664 5210 5197 4747 5668 5214 5225 4759 5680 5238 5209 4763 5684 5222 5233 4771 5696 5246 5237 4783 5700 5230 5221 4787 5712 5234 5245 4799 5720 5258 5229 4803 5724 5242 5253 4815 5736 5266 5257 4819 5740 5250 5241 4827 5752 5254 5265 4839 5760 5282 5249 4843 5768 5262 4853 4847 5271 5277 5290 5272 5776 5298 5281 4855 5780 5274 5261 4863 5759 5278 5289 4867 5292 5318 5269 4871 5296 5286 5297 5287 5788 5322 5273 5291 5792 5294 5309 4875 5303 5313 5330 5304 5796 5338 5317 4879 5312 5302 5321 5311 5800 5306 5285 4883 5319 5293 5310 5320 5787 5314 5329 4887 5332 5346 5301 4891 5336 5326 5337 5327 5808 5354 5305 5331 5812 5334 5349 4899 5816 5366 5325 4911 5352 4906 5353 4907 5820 5342 5333 5347 5807 5350 5365 4915 5359 5829 4930 5360 5824 5378 5341 4919 5828 5358 5377 4923 5372 5386 5841 5371 5836 5394 5361 4931 5840 5370 5385 4935 5388 5414 5369 4939 5392 5382 5393 5383 5848 5418 5373 5387 5852 5390 5405 4943 5399 5409 5426 5400 5856 5434 5413 4947 5408 5398 5417 5407 5860 5402 5381 4951 5415 5389 5406 5416 5864 5410 5425 4955 5428 5454 5397 4959 5432 5422 5433 5423 5868 5458 5401 5427 5872 5430 5445 4963 5439 5449 5466 5440 5876 5474 5453 4967 5448 5438 5457 5447 5880 5442 5421 4971 5455 5429 5446 5456 5884 5450 5465 4975 5468 5494 5437 4979 5472 5462 5473 5463 5888 5498 5441 5467 5892 5470 5481 4983 5484 5510 5493 4987 5488 5478 5489 5479 5896 5514 5497 5483 5900 5486 5461 4991 5495 5469 5482 5496 5904 5490 5509 4995 5504 5530 5513 5503 5908 5534 5477 4999 5511 5485 5502 5512 5912 5506 5521 5003 5916 5542 5529 5007 5524 5518 5533 5523 5924 5918 5501 5011 5531 5505 5522 5532 5928 5526 5541 5023 5936 5554 5517 5027 5940 5538 5549 5035 5952 5562 5553 5047 5960 5546 5537 5051 5932 5550 5561 5063 5972 5574 5545 5067 5976 5558 5569 5079 5988 5582 5573 5083 5992 5566 5557 5091 6004 5570 5581 5103 6012 5602 5565 5107 6020 5578 5593 5111 5587 5597 5134 5588 6028 5138 5121 5115 5596 5586 5601 5595 6032 5590 5577 5123 6036 5598 5609 5131 6040 5618 6029 5139 6044 5606 5617 5151 6060 5630 5605 5155 6064 5614 5625 5156 6076 5638 5629 5171 6080 5622 5613 5179 6092 5626 5637 5191 6100 5654 5621 5195 6108 5634 5674 6116 5671 5649 5205 5199 5648 5670 5653 5647 6120 5641 5633 5207 6128 5650 5665 5211 5659 5673 5686 5660 6132 5694 5669 5215 5672 5658 5645 5219 5643 5666 5642 5667 6136 5662 5710 6140 5715 5689 5685 5223 5688 5714 5657 5227 5692 5682 5693 5683 6144 5677 5661 5687 6148 5690 5701 5231 5704 5726 5713 5235 5708 5698 5709 5699 6152 5734 5678 5703 6156 5706 5681 5239 5679 5702 5750 6160 5755 5729 5725 5243 5728 5754 5697 5247 5732 5722 5733 5723 6164 5717 5705 5727 6168 5730 5741 5251 5744 5770 5753 5255 5748 5738 5749 5739 6172 5774 5718 5743 6176 5746 5721 5259 5719 5742 5782 6180 5283 5761 5769 5263 5764 5757 5773 5763 6188 6182 5737 5267 5771 5745 5762 5772 6192 5766 5781 5275 6196 5794 5758 5279 6200 5778 5802 6212 5323 5789 5793 5295 6220 5785 5777 5299 6224 5790 5801 5307 6240 5814 5786 5315 6244 5798 5822 6256 5355 5809 5813 5335 6260 5805 5797 5339 6272 5810 5821 5343 6276 5830 5806 5351 6280 5818 5833 5363 6292 5842 5817 5367 5832 5362 6277 5831 6300 5826 5845 5375 6304 5854 5825 5379 5844 5374 6293 5843 6312 5838 5853 5391 6316 5866 5837 5395 6320 5850 5861 5403 6332 5874 5865 5411 6340 5858 5849 5419 6344 5862 5873 5431 6356 5886 5857 5435 6360 5870 5881 5443 6372 5894 5885 5451 6380 5878 5869 5459 6388 5882 5893 5471 6396 5906 5877 5475 6400 5890 5901 5487 6412 5914 5905 5491 6416 5898 5889 5499 6428 5902 5913 5507 6436 5930 5897 5515 6444 5910 5525 5519 5919 5925 5942 5920 6452 5950 5929 5527 6456 5922 5909 5535 6464 5926 5937 5555 5968 5962 5941 5539 5944 5934 5917 5543 5948 5938 5949 5939 6472 5970 5921 5943 6476 5946 5961 5547 5955 5965 5978 5956 6480 5986 5933 5551 5964 5954 5969 5963 6484 5958 5945 5935 6488 5966 5977 5559 5980 6006 5953 5563 5984 5974 5985 5975 6492 6010 5957 5979 6496 5982 5993 5567 5996 6022 6005 5571 6000 5990 6001 5991 6500 6026 6009 5995 6504 5998 5973 5575 6007 5981 5994 6008 6508 6002 6021 5579 6016 6038 6025 6015 6512 6534 5989 5583 6023 5997 6014 6024 6516 6018 6033 5591 6520 5610 6037 5599 6528 6030 6013 5603 6532 6034 6045 5607 6048 6066 6521 5611 6052 6042 6053 6043 6544 6074 6525 6047 6548 6050 6090 6552 6095 6069 6065 5615 6068 6094 6041 5619 6072 6062 6073 6063 6556 6057 6049 6067 6560 6070 6081 5623 6084 6110 6093 5627 6088 6078 6089 6079 6564 6114 6058 6083 6568 6086 6061 5631 6059 6082 6126 6572 6131 6105 6109 5635 6104 6130 6113 6103 6576 6097 6077 5639 6111 6085 6102 6112 6580 6106 6121 5640 6584 6138 6129 5651 6124 6118 6098 6123 6592 6586 6101 5655 6099 6122 6137 5663 6604 6150 6117 5675 6608 6134 6145 5676 6620 6158 6149 5691 6624 6142 6133 5695 6596 6146 6157 5707 6644 6170 6141 5711 6648 6154 6165 5716 6660 6178 6169 5731 6664 6162 6153 5735 6636 6166 6177 5747 6680 6194 6161 5751 6692 6174 5765 5756 6183 6189 6202 6184 6704 6210 6193 5767 6708 6186 6173 5775 6676 6190 6201 5779 6204 6226 6181 5783 6208 6198 6209 6199 6724 6234 6185 6203 6732 6206 6221 5784 6215 6229 6246 6216 6736 6254 6225 5791 6228 6214 6197 5795 6232 6222 6233 6223 6740 6218 6205 6227 6720 6230 6270 6744 6275 6249 6245 5799 6248 6274 6213 5803 6252 6242 6253 6243 6748 6237 6217 6247 6752 6250 6261 5804 6264 6282 6273 5811 6268 6258 6269 6259 6756 6290 6238 6263 6760 6266 6241 5815 6239 6262 6281 5819 6284 5834 6257 5823 6288 6278 6289 6279 6768 6302 6265 6283 6772 6286 6301 5827 6296 5846 6766 6295 6776 6314 6285 5835 6767 6294 6313 5839 6308 6322 6785 6307 6780 6330 6297 5847 6784 6306 6321 5851 6324 6346 6305 5855 6328 6318 6329 6319 6792 6354 6309 6323 6796 6326 6341 5859 6335 6349 6362 6336 6800 6370 6345 5863 6348 6334 6317 5867 6352 6342 6353 6343 6804 6338 6325 6347 6808 6350 6361 5871 6364 6390 6333 5875 6368 6358 6369 6359 6816 6394 6337 6363 6820 6366 6381 5879 6375 6385 6402 6376 6824 6410 6389 5883 6384 6374 6393 6383 6828 6378 6357 5887 6391 6365 6382 6392 6832 6386 6401 5891 6404 6430 6373 5895 6408 6398 6409 6399 6836 6434 6377 6403 6840 6406 6417 5899 6420 6446 6429 5903 6424 6414 6425 6415 6844 6450 6433 6419 6848 6422 6397 5907 6431 6405 6418 6432 6852 6426 6445 5911 6440 6466 6449 6439 6856 6470 6413 5915 6447 6421 6438 6448 6860 6442 6457 5923 6864 6478 6465 5927 6460 6454 6469 6459 6872 6866 6437 5931 6467 6441 6458 6468 6876 6462 6477 5947 6880 6490 6453 5951 6888 6474 6485 5959 6896 6498 6489 5967 6904 6482 6473 5971 6912 6486 6497 5983 6920 6510 6481 5987 6924 6494 6505 5999 6936 6518 6509 6003 6940 6502 6493 6011 6952 6506 6517 6019 6960 6542 6501 6027 6968 6514 6529 6031 6523 6537 6046 6524 6976 6054 6533 6035 6536 6522 6017 6039 6540 6530 6541 6531 6980 6526 6513 6535 6984 6538 6549 6051 6992 6562 6977 6055 6996 6546 6557 6056 7008 6570 6561 6071 7016 6554 6545 6075 7024 6558 6569 6087 7032 6582 6553 6091 7036 6566 6577 6096 7048 6594 6581 6107 7052 6574 6565 6115 7064 6578 6125 6119 6587 6593 6610 6588 7076 6618 6573 6127 7084 6590 6605 6151 6599 6613 6626 6600 7092 6634 6609 6135 6612 6598 6585 6139 6616 6606 6617 6607 7096 6602 6589 6611 7108 6614 6625 6143 6628 6650 6597 6147 6632 6622 6633 6623 7116 6658 6601 6627 7120 6630 6645 6171 6639 6653 6666 6640 7124 6674 6649 6155 6652 6638 6621 6159 6656 6646 6657 6647 7128 6642 6629 6651 7115 6654 6665 6163 6668 6694 6637 6167 6672 6662 6673 6663 7136 6698 6641 6667 7140 6670 6681 6195 6684 6710 6693 6175 6688 6678 6689 6679 7144 6718 6697 6683 7148 6686 6661 6179 6695 6669 6682 6696 7135 6690 6730 7152 6735 6713 6709 6187 6712 6734 6677 6191 6716 6706 6717 6707 7156 6701 6685 6711 7160 6714 6725 6235 7164 6742 6733 6207 6728 6722 6702 6727 7172 7166 6705 6211 6703 6726 6741 6219 7184 6754 6721 6231 7188 6738 6749 6236 7200 6762 6753 6251 7204 6746 6737 6255 7176 6750 6761 6267 7224 6774 6745 6271 7228 6758 6298 7240 6303 6769 6773 6287 7244 6765 6757 6291 7216 6770 7241 6299 7256 6786 6789 6311 7318 6798 6777 6315 6788 6310 7257 6787 7283 6782 6797 6327 7302 6810 6781 6331 7310 6794 6805 6339 7350 6822 6809 6351 7326 6802 6793 6355 6811 7303 6806 6812 7334 7328 6821 6367 7338 6834 6801 6371 7346 6818 6829 6379 7362 6842 6833 6387 7366 6826 6817 6395 7370 6830 6841 6407 7382 6854 6825 6411 7390 6838 6849 6423 7402 6862 6853 6427 7410 6846 6837 6435 7414 6850 6861 6443 7426 6878 6845 6451 7430 6858 6461 6455 6867 6873 6890 6868 7442 6894 6877 6463 7446 6870 6857 6471 7458 6874 6889 6475 6883 6893 6914 6884 7466 6918 6865 6479 6892 6882 6869 6891 7470 6886 6905 6483 6899 6909 6926 6900 7478 6934 6913 6487 6908 6898 6917 6907 7482 6902 6881 6491 6915 6885 6906 6916 7486 6910 6925 6495 6928 6954 6897 6499 6932 6922 6933 6923 7490 6958 6901 6927 7494 6930 6941 6503 6944 6970 6953 6507 6948 6938 6949 6939 7498 6974 6957 6943 7502 6946 6921 6511 6955 6929 6942 6956 7506 6950 6969 6515 6964 6986 6973 6963 7510 6990 6937 6519 6971 6945 6962 6972 7514 6966 6981 6527 7522 6550 6985 6539 7518 6978 6961 6543 6987 6965 6982 6988 7534 7520 6997 6547 7004 7026 7523 6551 7000 6994 7527 6999 4 7006 7001 6995 0 7030 7017 6555 7011 7021 7038 7012 16 7046 7025 6559 7020 7010 7029 7019 20 7014 6993 6563 7027 7005 7018 7028 24 7022 7037 6567 7040 7066 7009 6571 7044 7034 7045 7035 28 7070 7013 7039 32 7042 7053 6575 7056 7086 7065 6579 7060 7050 7061 7051 36 7090 7069 7055 40 7058 7033 6583 7067 7041 7054 7068 44 7062 7106 48 7111 7081 7085 6591 7080 7110 7089 7079 52 7073 7049 6595 7087 7057 7078 7088 56 7082 7097 6603 7100 7122 7109 6615 7104 7094 7105 7095 60 82 7074 7099 64 7102 7077 6619 7075 7098 7130 68 6659 7117 7121 6631 76 7113 7093 6635 80 7118 7129 6643 92 7142 7114 6655 100 7126 7150 108 6699 7137 7141 6671 116 7133 7125 6675 120 7138 7149 6687 132 7162 7134 6691 136 7146 7157 6700 148 7174 7161 6715 152 7154 7145 6719 164 7158 6729 6723 7167 7173 7190 7168 172 7198 7153 6731 176 7170 7185 6755 7179 7193 7206 7180 188 7214 7189 6739 7192 7178 7165 6743 7196 7186 7197 7187 192 7182 7169 7191 196 7194 7205 6747 7208 7230 7177 6751 7212 7202 7213 7203 204 7238 7181 7207 208 7210 7225 6775 7219 7233 7246 7220 212 7254 7229 6759 7232 7218 7201 6763 7236 7226 7237 7227 216 7222 7209 7231 220 7234 7245 6764 7248 6778 7217 6771 7252 7242 7253 7243 224 7277 7221 7247 228 7250 7260 6779 7291 6790 7268 7298 7258 7300 7265 7261 7273 7266 7269 7276 7271 7280 7267 7272 233 7263 7249 7278 236 7270 7279 232 7274 7292 6791 7286 7296 7320 7287 250 7324 7299 7259 7294 7301 7285 7295 7289 7264 7262 7297 7293 7311 6795 7305 7315 6814 7306 257 7336 7319 6799 7314 7304 7323 7313 261 7308 7284 6783 7321 7288 7312 7322 273 7316 6813 6807 7330 7352 7335 7329 276 7360 7307 6815 288 7332 7347 6819 7341 7355 7372 7342 296 7380 7351 6823 7354 7340 7327 6803 7358 7348 7359 7349 300 7344 7331 7353 312 7356 7367 6827 7398 7392 7371 6831 7374 7364 7339 6835 7378 7368 7379 7369 320 7400 7343 7373 324 7376 7391 6839 7385 7395 7416 7386 328 7424 7363 6843 7394 7384 7399 7393 332 7388 7375 7365 319 7396 7411 6847 7405 7419 7432 7406 336 7440 7415 6851 7418 7404 7383 6855 7422 7412 7423 7413 340 7408 7387 7417 344 7420 7431 6859 7434 7460 7403 6863 7438 7428 7439 7429 348 7464 7407 7433 352 7436 7447 6871 7450 7472 7459 6875 7454 7444 7455 7445 356 7476 7463 7449 360 7452 7427 6879 7461 7435 7448 7462 364 7456 7471 6887 368 7488 7443 6895 7474 7468 7451 7473 376 370 7483 6903 380 7496 7487 6911 388 7480 7467 6919 392 7484 7495 6931 404 7508 7479 6935 408 7492 7503 6947 420 7516 7507 6951 424 7500 7491 6959 436 7504 7515 6967 444 7536 7499 6975 448 7512 6989 6983 7530 7524 7519 6979 7525 7531 6998 7526 464 7002 7535 7521 460 7528 7511 6991 476 7532</clockwise_edges>\n\t\t\t<edge_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</edge_selection>\n\t\t</polyhedra>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.PointsToBlobby.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 -2.5 2.5 2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 2.5 2.5 2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 2.5 -2.5 2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 -2.5 -2.5 2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 -2.5 2.5 -2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 2.5 2.5 -2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 2.5 -2.5 -2.5 1 1 0 0 0 0 1 0 0 0 0 1 0 -2.5 -2.5 -2.5 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\">8 0 1 2 3 4 5 6 7</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0 16 32 48 64 80 96 112</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16 16 16 16 16 16 16 16</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001 1001 1001 1001 1001 1001 1001 1001</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.PointsToParticles.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"particle\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"constantwidth\" type=\"k3d::double_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.PolyToBilinear.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"bilinear_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 4 5 1 2 5 6 2 3 6 7 3 0 7 4 1 0 2 3 4 5 7 6\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 3 2 4 5 7 6 8 9 11 10 12 13 15 14 16 17 19 18 20 21 23 22</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.QSlim.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-1.2963308494714931 -2.7664409270575776 -0.23546187638665814 -3.0718559687459064 -0.44133677731162912 0.72797881787985452 -2.4392508325254467 1.6425543812560197 0.45160204739653159 1.6060562251566426 2.7377271956120435 -0.74572689265824732 2.5044861851259621 1.590367325900059 -0.34119418765957538 2.9025064373982872 -1.0983056129050446 -0.41485829786588047 0.33022983085867841 -3.4369661620726486 1.4113943044299626 -1.8147351032693846 -3.2564876557918745 1.4806169539227763 0.49281054791517076 3.4248389414920331 1.0427110021711865 3.2641627161541522 -1.8157303800546212 1.4872115034493845 -5.0979878279359756 2.5146228793201733 2.0246923100785663 -3.0912221228459194 3.6855535152273724 2.000478319031036 2.7350884279434866 4.8224416227572737 2.0590794932169803 3.5463567107575695 1.771796380129415 1.7054977997857299 -1.8004814203274626 -5.2854028492440186 1.9820911028944461 -5.7919395873354489 -2.379762657737797 1.8491082300764619 6.1151639183437947 -1.0062549727360122 1.8688937763285516 -1.117987706836679 6.2468456106125529 1.7080463808075779 3.4795876443378169 -4.530491937682207 1.9952977636719318 1.9217556537623208 -6.5657669914057983 1.1473666347409353 -6.1569785696321668 3.1861170476210283 0.98492760448321959 5.7277364468609466 3.053428392274339 1.5214264625577012 5.5985187185146508 -3.8167405430861812 1.1336123927083475 -0.67994065062958242 7.1274342247750386 0.407919132819416 3.9525932233047865 5.8790724449363534 0.39998566529583479 -0.23469920937646749 -7.0246771850646086 -0.84236683392867906 -3.0507787210909036 -6.3574120242246721 0.80229431576394483 -6.9190116578282597 -1.4153555592830185 0.40943392570282217 -7.039247519971874 -0.58151367166981927 -0.82751317876266361 -4.7973790742754767 5.296692834458324 0.001454812288260221 6.8935236112282121 2.1142115425014518 -0.19391601479558712 6.5526988031433238 -2.6923269483866608 -0.39998566529584489 3.8162850266407227 -5.9675177008876599 -0.32026134895166081 0.63651818731151899 6.8750423490705437 -0.9810033143070791 -3.9349331896279218 -5.16020065994352 -1.571620227783963 -5.3191571780015332 -4.5363156506820657 -0.80535672732777686 -5.9116858416891578 2.6722834559378903 -1.636405648686803 -1.9793771583497957 5.749421939711028 -1.9250006465621028 4.0083921831369125 5.0926396521618722 -1.5682607260181363 6.3449228055771627 0.12219323522226833 -1.7080463808075754 4.2407508664015232 -4.808909322954058 -1.6139576823576522 0.10538285628258681 -4.7677447171714809 -2.1050896541389199 -5.5819861523367136 -0.47970392732779149 -1.9796566033613894 -3.1889984738269974 -2.9912328092278431 -1.9520249104417728 4.6493188002600947 1.3053733242398957 -2.003579260752046 -1.3479041236856006 3.0278675656369778 -1.2827624958076991 -3.7848680674780084 0.43682230494632812 -1.5468030434252504 1.0800236374033203 3.8716669063818858 -1.6817503847396305 3.5137816528850969 -2.8662344330177261 -1.9862206452435809 1.541521231740421 -2.9038709554640727 -1.0024028001858609</points>\n\t\t<point_selection>-1.2963308494714931 -0.44133677731162912 0.45160204739653159 -1.666710699058807 -2.77163859753386 0 0.58527096604838458 1.1480502970952693 -0.5852709660483858 2.7716385975338604 -1.2063103806389013 -1.7512912307793376 0.76536686473017956 -1.2063103806389015 1.2063103806389013 1.7512912307793367 0.76536686473017956 -0.61497169907716753 0.76536686473017956 0.76536686473017956 -2.9814724590933674 -1.3722210616792521 -2.1955884274840076e-16 -0.69955223079769957 3.5857864376269051 2.9814724590933674 1.4142135623730949 3.5168865566940046 1.4142135623730949 1.4142135623730949 2.5355339059327382 -2.9814724590933674 -3.3128346976800565 1.8477590650225735 -3.5209687712263102 1.8477590650225735 -2.3526361177143831 1.8477590650225735 4.2346331352698208 1.8477590650225735 3.5209687712263102 3.5209687712263094 4.1532658469804211 2 -1.9134171618254492 4.6193976625564339 4.9039264020161513 4.619397662556433 -4.1573480615127263 -4.6193976625564321</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 39 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63 67 68 66 70 71 69 73 74 72 76 77 75 79 80 78 82 83 81 85 86 84 88 89 87 91 92 90 94 95 93 97 98 96 100 101 99 103 104 102 106 107 105 109 110 108 112 113 111 115 116 114 118 119 117 121 122 120 124 125 123 127 128 126 130 131 129 133 134 132 136 137 135 139 140 138 142 143 141 145 146 144 148 149 147 151 152 150 154 155 153 157 158 156 160 161 159 163 164 162 166 167 165 169 170 168 172 173 171 175 176 174 178 179 177 181 182 180 184 185 183 187 188 186 190 191 189 193 194 192 196 197 195 199 200 198 202 203 201 205 206 204 208 209 207 211 212 210 214 215 213 217 218 216 220 221 219 223 224 222 226 227 225 229 230 228 232 233 231 235 236 234 238 239 237 241 242 240 244 245 243 247 248 246 250 251 249 253 254 252 256 257 255 259 260 258 262 263 261 265 266 264 268 269 267 271 272 270 274 275 273 277 278 276 280 281 279 283 284 282 286 287 285 289 290 288 292 293 291 295 296 294 298 299 297</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">49 0 7 45 8 2 45 3 8 3 4 8 4 5 9 5 6 9 49 7 6 0 1 7 4 13 8 4 9 13 1 10 7 1 2 11 1 11 10 2 8 11 8 12 11 8 13 12 6 7 14 7 15 14 7 10 15 13 16 12 13 9 16 9 18 16 9 6 14 9 14 18 11 17 10 11 12 17 12 16 21 14 26 19 14 15 26 10 17 20 16 18 22 18 19 22 18 14 19 15 10 20 15 20 27 20 17 29 17 23 29 17 12 24 17 24 23 12 21 24 21 16 30 19 26 25 26 15 35 15 27 35 27 20 28 24 21 30 16 31 30 16 22 31 22 32 31 22 19 32 19 25 32 26 34 25 26 35 34 35 27 28 28 20 36 20 29 36 29 23 37 23 33 37 23 24 33 24 38 33 24 30 38 31 32 40 29 37 36 30 39 38 30 31 39 31 40 39 32 25 40 25 34 41 35 28 42 35 42 34 28 36 42 33 38 37 40 25 41 34 43 41 34 42 43 36 37 42 38 44 37 38 39 44 39 48 44 39 40 48 40 41 48 43 42 46 42 37 45 42 45 46 37 47 45 37 44 47 47 44 3 44 4 3 44 48 4 48 41 49 41 43 0 43 1 0 43 46 1 46 45 2 47 3 45 4 48 5 48 49 5 41 0 49 46 2 1 49 6 5\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.QuadrilateralRemeshing.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 5 0 0 -5 1.0847817289097574 -0.10684167481653498 4.8687550220247529 2.1133326299242485 -0.20814509648172477 4.5031164032872155 3.0371898699888504 -0.29913709255736315 3.9219233393613298 3.8132096175774604 -0.37556836653023984 3.1535147535597909 4.4055226458166823 -0.43390610790825307 2.2346289707572389 4.7869550985903482 -0.47147392546789829 1.208524705087904 4.939980016560332 -0.48654556438732666 0.12297052466174224 4.8572642304212748 -0.47839877053068269 -0.97179361202060721 4.5211457778736932 -0.44529399244503232 -2.0159962902971333 3.9689753376281147 -0.39090995089290137 -2.9616806643253382 3.2272068485795025 -0.31785213144037772 -3.764310088925483 2.3303497537418467 -0.22951941755898034 -4.3858758475290136 1.0119296084206701 0.41915496797473767 4.868755022024752 1.9714047569838515 0.81658258726954835 4.5031164032872173 2.8593855947542695 1.0872917060197496 3.9219233393613315 3.6055833386399381 1.3136483169427495 3.1535147535597923 4.1751341093769003 1.4864196543918136 2.2346289707572389 4.5419083269002583 1.5976793969102028 1.2085247050879044 4.6890525830900138 1.6423151190372345 0.12297052466174296 4.6095155182247325 1.6181878141864898 -0.97179361202060532 4.2863139093111489 1.5201456779860194 -2.0159962902971311 3.7553630694234568 1.3590835015475571 -2.9616806643253368 3.0421003274204219 1.1427176142202553 -3.7643100889254817 2.1797089477741252 0.88111404923299097 -4.3858758475290118 0.91071258706634495 -0.60851869596195129 4.8687550220247529 1.7742174074634942 -1.1854941706916673 4.5031164032872146 2.5923232132791707 -1.6242381572175697 3.9219233393613302 3.2800229926368853 -1.991821347475172 3.1535147535597923 3.8049239891599163 -2.2723867753884019 2.2346289707572411 4.1429450439429205 -2.4530627933556888 1.2085247050879051 4.2785539671065305 -2.5255472729209338 0.12297052466174185 4.2052521883128984 -2.4863666558707345 -0.97179361202060899 3.9073878796103223 -2.3271548658669214 -2.015996290297136 3.4180607830967418 -2.0656040836579415 -2.9616806643253404 2.7607140753121051 -1.7142449481664599 -3.7643100889254861 1.9659296279423149 -1.2894238103668065 -4.3858758475290163 1.0742587424200492 0.21368334963306676 4.868755022024752 2.1006563471756334 0.33684955510990455 4.5031164032872164 3.0245135872402344 0.42784155118554895 3.9219233393613311 3.8005333348288457 0.50427282515842597 3.1535147535597914 4.3928463630680676 0.56261056653643948 2.2346289707572384 4.7742788158417335 0.60017838409608415 1.208524705087904 4.9273037338117129 0.61525002301556309 0.12297052466174252 4.8445879476726468 0.60710322915901971 -0.97179361202060621 4.5084694951250643 0.57399845107337166 -2.0159962902971325 3.9562990548794863 0.51961440952124205 -2.9616806643253377 3.2145305658308745 0.44655659006872123 -3.7643100889254817 2.3176734709932183 0.35822387618733437 -4.3858758475290127 1.0119296084206675 -0.41915496797473578 4.8687550220247529 1.9945767363181341 -0.74019480857778153 4.5031164032872155 2.8829306607521614 -1.0096740254244112 3.9219233393613298 3.6291284046378296 -1.2360306363474083 3.1535147535597918 4.1986791753747914 -1.408801973796473 2.2346289707572393 4.5654533928981431 -1.520061716314882 1.2085247050879047 4.7125976490878871 -1.564697438441951 0.12297052466174224 4.6330605842226058 -1.5405701335912056 -0.97179361202060788 4.3098589753090275 -1.4425279973907139 -2.0159962902971338 3.7789081354213354 -1.2814658209522487 -2.9616806643253395 3.0656453934182997 -1.0650999336249463 -3.7643100889254848 2.2032540137719994 -0.80349636863767726 -4.3858758475290163 0.65454834888584157 0.87293702716250832 4.8687550220247511 1.3102113293718674 1.6718646804822437 4.5031164032872137 1.8991359912110544 2.389471457238991 3.9219233393613284 2.3938197449446923 2.9922453552145134 3.1535147535597878 2.7713972912702864 3.4523249265951024 2.2346289707572367 3.0145463066403599 3.7486028590667813 1.2085247050879044 3.1120940057438897 3.8674650743374266 0.12297052466174463 3.0593657656347348 3.8032155278663731 -0.9717936120206021 2.8451027416304515 3.5421352777140127 -2.0159962902971271 2.4931146035318852 3.1132364904757597 -2.9616806643253342 2.0202647544086934 2.5370672822454075 -3.7643100889254786 1.4485516818798669 1.8404328877442917 -4.3858758475290092 3.6249089001755466 2.5611031110025317 2.2346289707572389 3.9211868326472268 2.8042521263726043 1.2085247050879047 4.040049047917873 2.9017998254761332 0.12297052466174418 3.9757995014468182 2.8490715853669792 -0.9717936120206031 3.7147192512944569 2.6348085613626968 -2.0159962902971285 3.2858204640562039 2.2828204232641309 -2.9616806643253351 2.7093541675171053 1.8103325772925551 -3.7643100889254804 1.9564109501849916 1.3072320039050089 -4.3858758475290101 0.47166982017052184 -0.98385983511921138 4.868755022024752 0.95887136718278587 -1.8953498195993768 4.5031164032872155 1.3964818696227321 -2.7140614852814191 3.9219233393613333 1.764065059880332 -3.4017612646391373 3.153514753559794 2.0446304877935599 -3.92666226116217 2.2346289707572424 2.2253065057608943 -4.2646833159451498 1.2085247050879053 2.2977909853261402 -4.4002922391087589 0.12297052466174113 2.2586103682759413 -4.3269904603151259 -0.97179361202061165 2.0993985782721287 -4.0291261516125481 -2.0159962902971387 1.8378477960631507 -3.5397990550989649 -2.9616806643253444 1.4864886605716712 -2.8824523473143278 -3.7643100889254884 1.0616675227720203 -2.0876678999445364 -4.385875847529018 0.77449739172456511 -0.774497391724565 4.8687550220247529 1.508847877966895 -1.508847877966895 4.5031164032872146 2.1341434335821741 -2.1966058335981198 3.9219233393613311 2.6288271873157822 -2.7993797315736666 3.1535147535597918 3.0064047336413737 -3.2594593029542596 2.2346289707572411 3.2495537490114477 -3.5557372354259407 1.2085247050879055 3.347101448114977 -3.6745994506965873 0.12297052466174141 3.2943732080058221 -3.6103499042255316 -0.97179361202061065 3.0801101840015366 -3.3492696540731672 -2.0159962902971382 2.7281220459029707 -2.920370866834912 -2.961680664325343 2.2552721967797793 -2.3442016586045549 -3.7643100889254875 1.6637907497695112 -1.663790749769511 -4.385875847529018 0.21368334963306618 1.0742587424200487 4.868755022024752 0.34128352337655254 2.1002196394186177 4.5031164032872129 0.43227551945219378 3.0240768794832209 3.9219233393613235 0.5087067934250683 3.8000966270718295 3.1535147535597838 0.56704453480308037 4.392409655311047 2.2346289707572349 0.60461235236272437 4.773842108084712 1.2085247050879029 0.61968399128220197 4.9268670260546905 0.12297052466174371 0.61153719742557455 4.8441512399156323 -0.97179361202060266 0.57843241933992451 4.5080327873680535 -2.0159962902971276 0.52404837778779279 3.9558623471224763 -2.9616806643253324 0.45099055833526874 3.2140938580738685 -3.7643100889254764 0.36265784445387844 2.3172367632362163 -4.3858758475290074 1.793413385970231 4.0609405996280268 2.2346289707572353 1.9740894039375667 4.3989616544110026 1.2085247050879033 2.0465738835028113 4.5345705775746117 0.12297052466174396 2.0073932664526137 4.4612687987809796 -0.97179361202060222 1.8481814764488045 4.1634044900784053 -2.015996290297128 1.5866306942398285 3.6740773935648239 -2.9616806643253342 1.2469787674463326 3.0104730523602194 -3.7643100889254777 0.90043706523458378 2.173847374952758 -4.3858758475290083 6.7065855692489964e-017 -1.0953047153994682 4.8687550220247529 1.3065528060762573e-016 -2.1338331325786442 4.5031164032872164 0.077126836670326507 -3.0590559716508423 3.9219233393613342 0.15355811064320396 -3.8350757192394558 3.153514753559794 0.21189585202121913 -4.4273887474786768 2.2346289707572424 0.24946366958086336 -4.8088212002523445 1.2085247050879062 0.26453530850034052 -4.9618461182223248 0.12297052466174227 0.25638851464371215 -4.8791303320832657 -0.97179361202060921 0.22328373655806083 -4.5430118795356833 -2.0159962902971369 0.16889969500592905 -3.9908414392901022 -2.9616806643253426 0.095841875553406231 -3.2490729502414881 -3.7643100889254875 0.0075091616720148677 -2.352215855403831 -4.3858758475290172 -0.46452086647413171 0.98768103048032807 4.8687550220247529 -0.95172241348640185 1.8991710149604992 4.503116403287212 -1.3893329159262595 2.7178826806425884 3.9219233393613266 -1.7569161061838647 3.4055824600003008 3.1535147535597887 -2.0374815340970929 3.9304834565233304 2.2346289707572375 -2.2181575520644272 4.2685045113063085 1.2085247050879047 -2.2906420316296718 4.4041134344699167 0.1229705246617443 -2.2514614145794738 4.3308116556762855 -0.97179361202060255 -2.0922496245756639 4.0329473469737129 -2.0159962902971267 -1.8306988423666881 3.5436202504601333 -2.9616806643253306 -1.4793397068752094 2.8862735426755015 -3.764310088925475 -1.0545185690755601 2.0914890953057137 -4.3858758475290074 -0.21368334963306629 1.0742587424200472 4.8687550220247529 -0.4024777350480267 2.0941925356337596 4.503116403287212 -0.49346973112366949 3.0180497756983602 3.9219233393613249 -0.56990100509654584 3.7940695232869697 3.1535147535597847 -0.62823874647455968 4.3863825515261876 2.2346289707572353 -0.66580656403420413 4.7678150042998517 1.2085247050879036 -0.68087820295368262 4.9208399222698311 0.12297052466174407 -0.67273140909705564 4.838124136130773 -0.97179361202060233 -0.63962663101140627 4.5020056835831941 -2.0159962902971271 -0.58524258945927798 3.9498352433376183 -2.9616806643253306 -0.5121847700067591 3.2080667542890087 -3.7643100889254746 -0.42385205612537075 2.311209659451356 -4.3858758475290065 -0.50023553982567426 -0.96859113985708412 4.868755022024752 -0.98743708683793707 -1.8800811243372508 4.5031164032872155 -1.4250475892778298 -2.6987927900193198 3.9219233393613337 -1.7926307795354306 -3.3864925693770362 3.1535147535597967 -2.0731962074486598 -3.9113935659000689 2.2346289707572451 -2.2538722254159955 -4.2494146206830488 1.2085247050879093 -2.3263567049812406 -4.3850235438466587 0.12297052466174557 -2.2871760879310443 -4.3117217650530266 -0.97179361202060477 -2.1279642979272348 -4.0138574563504505 -2.0159962902971316 -1.8664135157182591 -3.5245303598368665 -2.9616806643253386 -1.5150543802267826 -2.8671836520522289 -3.7643100889254839 -1.0902332424271344 -2.0723992046824393 -4.3858758475290136 -0.21368334963306596 -1.0742587424200483 4.868755022024752 -0.41629019296345138 -2.0928321272698498 4.5031164032872164 -0.59827418511472918 -3.0077274379466892 3.9219233393613333 -0.81828925472867731 -3.7558488673574182 3.153514753559794 -0.8467621348960751 -4.7499924361803689 1.2085247050879071 -0.86183377381555482 -4.9030173541503483 0.1229705246617433 -0.85368697995892939 -4.8203015680112902 -0.97179361202060699 -0.82058220187328212 -4.4841831154637077 -2.0159962902971333 -0.7661981603211554 -3.9320126752181266 -2.9616806643253408 -0.63570426288089132 -3.195901146093858 -3.7643100889254852 -0.45903883511811094 -2.3077440642087259 -4.3858758475290154 -0.91071258706634528 0.60851869596195107 4.8687550220247529 -1.7134671691403112 1.2595185502687787 4.5031164032872137 -2.4310739458970629 1.848443212107961 3.9219233393613275 -3.0338478438726018 2.3431269658415759 3.1535147535597896 -3.4939274152532258 2.7207045121671274 2.2346289707572398 -3.7902053477249069 2.9638535275371996 1.2085247050879069 -3.9090675629955531 3.0614012266407289 0.12297052466174629 -3.8448180165245014 3.0086729865315727 -0.97179361202060066 -3.5837377663721419 2.7944099625272889 -2.0159962902971258 -3.1548389791338893 2.442421824428723 -2.9616806643253324 -2.5786697709035367 1.9695719753055321 -3.7643100889254772 -1.8820353764024209 1.3978589027767037 -4.3858758475290092 -0.91071258706634384 -0.60851869596195041 4.8687550220247529 -1.7724448216392183 -1.1876540727679479 4.5031164032872173 -2.490051598395969 -1.7765787346071267 3.9219233393613355 -3.0928254963714963 -2.2712624883407613 3.1535147535597967 -3.5529050677520893 -2.6488400346663568 2.2346289707572442 -3.8491830002237704 -2.8919890500364316 1.2085247050879084 -3.9680452154944157 -2.9895367491399623 0.12297052466174582 -3.9037956690233617 -2.9368085090308078 -0.97179361202060455 -3.6427154188709987 -2.722545485026524 -2.0159962902971325 -3.2138166316327443 -2.3705573469279564 -2.9616806643253395 -2.6376474234023801 -1.8977074978047774 -3.7643100889254835 -1.9410130289012648 -1.3259944252759475 -4.3858758475290136 -0.77449739172456444 -0.77449739172456455 4.8687550220247529 -1.4354517324163483 -1.5690825379487987 4.5031164032872164 -2.024376394255532 -2.2866893147055443 3.9219233393613351 -2.5190601479891677 -2.8894632126810706 3.1535147535597967 -2.8966376943147609 -3.3495427840616645 2.2346289707572442 -3.139786709684834 -3.6458207165333469 1.2085247050879091 -3.2373344087883651 -3.7646829318039927 0.12297052466174596 -3.1846061686792098 -3.7004333853329392 -0.9717936120206041 -2.9703431446749251 -3.4393531351805771 -2.0159962902971316 -2.6183550065763557 -3.0104543479423254 -2.9616806643253382 -2.1455051574531629 -2.4342851397119722 -3.7643100889254826 -1.5737920849243312 -1.7376507452108583 -4.3858758475290127 -1.0567825765031196 0.27129454784727747 4.8687550220247529 -2.0458068432096201 0.57131177915987763 4.5031164032872129 -2.934160767643645 0.84079099600650553 3.9219233393613293 -3.6803585115293131 1.0671476069295012 3.1535147535597914 -4.2499092822662741 1.2399189443785632 2.2346289707572407 -4.6166834997896391 1.3511786868969291 1.2085247050879069 -4.7638277559794009 1.3958144090239426 0.12297052466174602 -4.6842906911141196 1.3716871041731979 -0.97179361202060133 -4.3610890822005439 1.2736449679727084 -2.015996290297128 -3.8301382423128518 1.1125827915342441 -2.9616806643253355 -3.116875500309817 0.89621690420694478 -3.7643100889254799 -2.2544841206635207 0.634613339219679 -4.3858758475290118 -1.0742587424200467 -0.21368334963306612 4.8687550220247529 -2.092832127269852 -0.41629019296345271 4.5031164032872146 -3.0121321111061699 -0.55355278802482566 3.9219233393613306 -3.7881518586947798 -0.62998406199770296 3.1535147535597927 -4.3804648869340008 -0.68832180337571858 2.2346289707572415 -4.7618973397076676 -0.72588962093536347 1.2085247050879071 -4.9149222576776479 -0.74096125985484151 0.12297052466174496 -4.8322064715385755 -0.7328144659983562 -0.97179361202060399 -4.4960880189909957 -0.69970968791270594 -2.0159962902971302 -3.9439175787454164 -0.64532564636057266 -2.9616806643253368 -3.2021490896968055 -0.57226782690805011 -3.7643100889254808 -2.307744064208733 -0.45903883511811339 -4.3858758475290118 -1.011929608420667 -0.41915496797473573 4.8687550220247529 -1.9714047569838544 -0.81658258726954835 4.5031164032872155 -2.8332172951750643 -1.1735570288115285 3.9219233393613333 -3.5355781068066232 -1.5137113569037741 3.1535147535597949 -4.0604791033296559 -1.794276784817004 2.2346289707572429 -4.3985001581126344 -1.9749528027843413 1.2085247050879078 -4.5341090812762426 -2.0474372823495877 0.1229705246617453 -4.4608073024826105 -2.0082566652993901 -0.97179361202060421 -4.1629429937800362 -1.8490448752955784 -2.015996290297132 -3.6736158972664597 -1.5874940930865897 -2.9616806643253382 -3.0104730523602146 -1.24697876744633 -3.764310088925483 -2.1738473749527496 -0.90043706523457989 -4.3858758475290127 -1.0953047153994659 -1.3413171138497966e-016 4.8687550220247529 -2.130720501632049 0.031603072354573394 4.5031164032872137 -3.0545777416966478 0.12259506843021239 3.9219233393613298 -3.8305974892852577 0.19902634240308731 3.1535147535597918 -4.4229105175244792 0.25736408378110076 2.2346289707572398 -4.8043429702981451 0.29493190134074471 1.2085247050879064 -4.9573678882681351 0.31000354026011739 0.12297052466174552 -4.8746521021290796 0.30185674640346771 -0.97179361202060277 -4.5385336495814999 0.26875196831782061 -2.0159962902971289 -3.9863632093359205 0.21436792676569147 -2.9616806643253359 -3.2445947202873096 0.14131010731317009 -3.7643100889254804 -2.3477376254496534 0.052977393431783329 -4.3858758475290118</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<polyhedra>\n\t\t\t<first_faces>0</first_faces>\n\t\t\t<face_counts>287</face_counts>\n\t\t\t<types>polygons</types>\n\t\t\t<face_first_loops>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286</face_first_loops>\n\t\t\t<face_loop_counts>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</face_loop_counts>\n\t\t\t<face_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_selection>\n\t\t\t<face_materials>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_materials>\n\t\t\t<loop_first_edges>0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 61 65 69 73 77 81 85 89 93 97 101 105 109 113 117 121 125 129 133 137 141 145 149 153 157 161 165 169 173 177 181 185 189 193 197 201 205 209 213 217 221 225 229 233 238 242 246 250 254 258 262 266 270 274 278 282 286 290 294 298 302 306 310 314 318 322 326 330 334 338 342 346 350 354 358 362 366 370 374 378 382 386 390 394 398 402 406 410 414 418 422 426 430 434 438 442 446 450 454 458 462 466 470 474 478 482 486 490 494 498 502 506 510 514 518 522 526 530 534 538 542 546 550 554 558 562 566 570 574 578 582 586 590 594 598 603 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 979 982 985 988 991 994 997 1000 1003 1006 1009 1012 1015 1018 1021 1024 1027 1030 1033 1036 1039 1042 1045 1048 1051 1054 1057 1060 1063 1066 1069 1072 1075 1078 1081 1084 1087 1090 1093 1096 1099 1102 1105</loop_first_edges>\n\t\t\t<edge_points>2 3 39 38 3 4 40 39 4 5 41 40 5 6 42 41 6 7 43 42 7 8 44 43 8 9 45 44 9 10 46 45 10 11 47 46 11 12 48 47 12 13 49 48 14 15 63 62 15 16 64 63 16 17 65 64 17 18 74 66 65 18 19 75 74 19 20 76 75 20 21 77 76 21 22 78 77 22 23 79 78 23 24 80 79 24 25 81 80 26 27 51 50 27 28 52 51 28 29 53 52 29 30 54 53 30 31 55 54 31 32 56 55 32 33 57 56 33 34 58 57 34 35 59 58 35 36 60 59 36 37 61 60 38 39 15 14 39 40 16 15 40 41 17 16 41 42 18 17 42 43 19 18 43 44 20 19 44 45 21 20 45 46 22 21 46 47 23 22 47 48 24 23 48 49 25 24 50 51 3 2 51 52 4 3 52 53 5 4 53 54 6 5 54 55 7 6 55 56 8 7 56 57 9 8 57 58 10 9 58 59 11 10 59 60 12 11 60 61 13 12 62 63 107 106 63 64 108 107 64 65 109 108 65 66 118 110 109 66 67 119 118 67 68 120 119 68 69 121 120 69 70 122 121 70 71 123 122 71 72 124 123 72 73 125 124 74 75 67 66 75 76 68 67 76 77 69 68 77 78 70 69 78 79 71 70 79 80 72 71 80 81 73 72 82 83 95 94 83 84 96 95 84 85 97 96 85 86 98 97 86 87 99 98 87 88 100 99 88 89 101 100 89 90 102 101 90 91 103 102 91 92 104 103 92 93 105 104 94 95 27 26 95 96 28 27 96 97 29 28 97 98 30 29 98 99 31 30 99 100 32 31 100 101 33 32 101 102 34 33 102 103 35 34 103 104 36 35 104 105 37 36 106 107 151 150 107 108 152 151 108 109 153 152 109 110 154 153 110 111 155 154 111 112 156 155 112 113 157 156 113 114 158 157 114 115 159 158 115 116 160 159 116 117 161 160 118 119 111 110 119 120 112 111 120 121 113 112 121 122 114 113 122 123 115 114 123 124 116 115 124 125 117 116 126 127 83 82 127 128 84 83 128 129 85 84 129 130 86 85 130 131 87 86 131 132 88 87 132 133 89 88 133 134 90 89 134 135 91 90 135 136 92 91 136 137 93 92 138 139 186 185 139 140 187 186 140 141 188 187 141 142 189 188 142 143 190 189 143 144 191 190 144 145 192 191 145 146 193 192 146 147 194 193 147 148 195 194 148 149 196 195 150 151 139 138 151 152 140 139 152 153 141 140 153 154 142 141 154 155 143 142 155 156 144 143 156 157 145 144 157 158 146 145 158 159 147 146 159 160 148 147 160 161 149 148 162 163 175 174 163 164 176 175 164 165 177 176 165 166 130 129 177 166 167 178 131 130 167 168 179 178 168 169 180 179 169 170 181 180 170 171 182 181 171 172 183 182 172 173 184 183 174 175 127 126 175 176 128 127 176 177 129 128 178 179 132 131 179 180 133 132 180 181 134 133 181 182 135 134 182 183 136 135 183 184 137 136 185 186 222 221 186 187 223 222 187 188 224 223 188 189 225 224 189 190 226 225 190 191 227 226 191 192 228 227 192 193 229 228 193 194 230 229 194 195 231 230 195 196 232 231 197 198 210 209 198 199 211 210 199 200 212 211 200 201 213 212 201 202 214 213 202 203 215 214 203 204 216 215 204 205 217 216 205 206 218 217 206 207 219 218 207 208 220 219 209 210 163 162 210 211 164 163 211 212 165 164 212 213 166 165 213 214 167 166 214 215 168 167 215 216 169 168 216 217 170 169 217 218 171 170 218 219 172 171 219 220 173 172 221 222 258 257 222 223 259 258 223 224 260 259 224 225 261 260 225 226 262 261 226 227 263 262 227 228 264 263 228 229 265 264 229 230 266 265 230 231 267 266 231 232 268 267 233 234 246 245 234 235 247 246 235 236 248 247 236 237 249 248 237 238 250 249 238 239 251 250 239 240 252 251 240 241 253 252 241 242 254 253 242 243 255 254 243 244 256 255 245 246 198 197 246 247 199 198 247 248 200 199 248 249 201 200 249 250 202 201 250 251 203 202 251 252 204 203 252 253 205 204 253 254 206 205 254 255 207 206 255 256 208 207 257 258 234 233 258 259 235 234 259 260 236 235 260 261 237 236 261 262 238 237 262 263 239 238 263 264 240 239 264 265 241 240 265 266 242 241 266 267 243 242 267 268 244 243 0 38 14 0 14 62 0 62 106 0 106 150 0 150 138 0 138 185 0 185 221 0 221 257 0 257 233 0 233 245 0 245 197 0 197 209 0 209 162 0 162 174 0 174 126 0 126 82 0 82 94 0 94 26 0 26 50 0 50 2 0 2 38 1 196 149 1 232 196 1 268 232 1 244 268 1 256 244 1 208 256 1 220 208 1 173 220 1 184 173 1 137 184 1 93 137 1 105 93 1 37 105 1 61 37 1 13 61 1 49 13 1 25 49 1 81 25 1 73 81 1 125 73 1 117 125 1 161 117 1 149 161</edge_points>\n\t\t\t<clockwise_edges>1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 60 56 62 63 64 61 66 67 68 65 70 71 72 69 74 75 76 73 78 79 80 77 82 83 84 81 86 87 88 85 90 91 92 89 94 95 96 93 98 99 100 97 102 103 104 101 106 107 108 105 110 111 112 109 114 115 116 113 118 119 120 117 122 123 124 121 126 127 128 125 130 131 132 129 134 135 136 133 138 139 140 137 142 143 144 141 146 147 148 145 150 151 152 149 154 155 156 153 158 159 160 157 162 163 164 161 166 167 168 165 170 171 172 169 174 175 176 173 178 179 180 177 182 183 184 181 186 187 188 185 190 191 192 189 194 195 196 193 198 199 200 197 202 203 204 201 206 207 208 205 210 211 212 209 214 215 216 213 218 219 220 217 222 223 224 221 226 227 228 225 230 231 232 229 234 235 236 237 233 239 240 241 238 243 244 245 242 247 248 249 246 251 252 253 250 255 256 257 254 259 260 261 258 263 264 265 262 267 268 269 266 271 272 273 270 275 276 277 274 279 280 281 278 283 284 285 282 287 288 289 286 291 292 293 290 295 296 297 294 299 300 301 298 303 304 305 302 307 308 309 306 311 312 313 310 315 316 317 314 319 320 321 318 323 324 325 322 327 328 329 326 331 332 333 330 335 336 337 334 339 340 341 338 343 344 345 342 347 348 349 346 351 352 353 350 355 356 357 354 359 360 361 358 363 364 365 362 367 368 369 366 371 372 373 370 375 376 377 374 379 380 381 378 383 384 385 382 387 388 389 386 391 392 393 390 395 396 397 394 399 400 401 398 403 404 405 402 407 408 409 406 411 412 413 410 415 416 417 414 419 420 421 418 423 424 425 422 427 428 429 426 431 432 433 430 435 436 437 434 439 440 441 438 443 444 445 442 447 448 449 446 451 452 453 450 455 456 457 454 459 460 461 458 463 464 465 462 467 468 469 466 471 472 473 470 475 476 477 474 479 480 481 478 483 484 485 482 487 488 489 486 491 492 493 490 495 496 497 494 499 500 501 498 503 504 505 502 507 508 509 506 511 512 513 510 515 516 517 514 519 520 521 518 523 524 525 522 527 528 529 526 531 532 533 530 535 536 537 534 539 540 541 538 543 544 545 542 547 548 549 546 551 552 553 550 555 556 557 554 559 560 561 558 563 564 565 562 567 568 569 566 571 572 573 570 575 576 577 574 579 580 581 578 583 584 585 582 587 588 589 586 591 592 593 590 595 596 597 594 599 600 601 602 598 604 605 606 607 603 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 976 980 981 979 983 984 982 986 987 985 989 990 988 992 993 991 995 996 994 998 999 997 1001 1002 1000 1004 1005 1003 1007 1008 1006 1010 1011 1009 1013 1014 1012 1016 1017 1015 1019 1020 1018 1022 1023 1021 1025 1026 1024 1028 1029 1027 1031 1032 1030 1034 1035 1033 1037 1038 1036 1040 1041 1039 1043 1044 1042 1046 1047 1045 1049 1050 1048 1052 1053 1051 1055 1056 1054 1058 1059 1057 1061 1062 1060 1064 1065 1063 1067 1068 1066 1070 1071 1069 1073 1074 1072 1076 1077 1075 1079 1080 1078 1082 1083 1081 1085 1086 1084 1088 1089 1087 1091 1092 1090 1094 1095 1093 1097 1098 1096 1100 1101 1099 1103 1104 1102 1106 1107 1105</clockwise_edges>\n\t\t\t<edge_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</edge_selection>\n\t\t</polyhedra>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.RotatePoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-3.4544332266900906 -0.75292169734939185 2.5 -0.75292169734939185 3.4544332266900906 2.5 3.4544332266900906 0.75292169734939185 2.5 0.75292169734939185 -3.4544332266900906 2.5 -3.4544332266900906 -0.75292169734939185 -2.5 -0.75292169734939185 3.4544332266900906 -2.5 3.4544332266900906 0.75292169734939185 -2.5 0.75292169734939185 -3.4544332266900906 -2.5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SDSCorner.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 1 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"corner\" type=\"k3d::double_t\">0 3.5 0 0 3.5 0 0 0 0 0 0 0 0 0 0 0 3.5 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SDSCrease.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"crease\" type=\"k3d::double_t\">0 0 2.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SDSHole.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 1 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"hole\" type=\"k3d::bool_t\">0 0 0 1 0 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.ScalePoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 2.5 2.5 5 2.5 2.5 5 -2.5 2.5 -5 -2.5 2.5 -5 2.5 -2.5 5 2.5 -2.5 5 -2.5 -2.5 -5 -2.5 -2.5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SelectConnectedComponents.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 3 5 0 1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 1 1 0 -1 1 0 -3 1 0 -5 1 0 5 -1 -0 3 -1 -0 1 -1 -0 -1 -1 0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 1 -3 -0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 8 7 2 3 9 8 3 4 10 9 4 5 11 10 6 7 13 12 7 8 14 13 8 9 15 14 9 10 16 15 10 11 17 16 12 13 19 18 13 14 20 19 14 15 21 20 15 16 22 21 16 17 23 22 18 19 25 24 19 20 26 25 20 21 27 26 21 22 28 27 22 23 29 28 24 25 31 30 25 26 32 31 26 27 33 32 27 28 34 33 28 29 35 34\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SelectCube.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 1 1 0 0 1 1 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SelectNSided.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-3.419082940155 1.588421844645 -0.63472822535500006 -1.2026379177099999 2.9772427449049998 -2.0750372779899999 0.26241144770199998 0.9419837447149999 -3.6959300433150002 -1.0485832717250001 -1.7046963935799999 -3.2573878117650001 -3.3238719328100004 -1.3051756762 -1.3654610418449999 -3.15741727779 3.5182209767299999 1.62875329403 -0.94097225534500006 4.9070418769900002 0.18844424139149998 1.3343164057400001 4.507521159615 -1.7034825285300002 2.7993657711550002 2.47226215942 -3.3243752938549997 2.8945767784999998 -0.42133536142349998 -4.0551081103449995 1.5835820590749998 -3.068015499715 -3.6165658787999999 -0.63286296337000003 -4.4568363999800003 -2.1762568261599999 -2.9081516244599999 -4.0573156826000005 -0.28433005623750002 -4.3732009898699999 -2.0220566824050001 1.3365627090849999 -4.468411997215 0.87154083843499996 2.0672955255750001 2.8615516407649997 1.7518453461899999 1.8326625762900002 0.50010749597500004 1.2317394608250001 3.5845226211300001 -0.13906782707199999 -1.6809568743600001 3.4309089399550001 1.8273442433 -2.9609963230449998 1.5841104190149999 3.6818290617299998 -0.83940787409000006 0.59633984387499994 1.82112500682 4.48773893073 1.24245844966 -0.54031913796499997 3.9676330453649999 2.9943184944950003 -2.3948039563950001 1.8460445964050001 3.9820890696349998 -3.03397927944 -1.0666517387799999 3.8284753884650002 -2.2137018584749999 -3.6579049590599997 2.5921526560500001 -0.24728978810300001 -4.9379444077450003 0.74535413511000004 2.1141543566849998 -4.4178385223749999 -1.006505909725 3.9686391751099999 -2.29625007342 -1.9942764848700001 4.6078144981599998 0.61644626176500006 -1.8406628036950001 3.7875370771950001 3.2076994820450002 -0.60434007128</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 4 0 6 7 8 5 10 11 9 13 14 15 12 17 18 16 20 21 22 19 24 25 23 27 28 29 26 31 32 30 34 35 36 33 38 39 37 41 42 43 44 40 46 47 48 45 50 51 49 53 54 55 52 57 58 56 60 61 62 59 64 65 63 67 68 69 66 71 72 70 74 75 76 73 78 79 77 81 82 80 84 85 83 87 88 86 90 91 89 93 94 92 96 97 95 99 100 98 102 103 101 105 106 104 108 109 107 111 112 110 114 115 113 117 118 116 120 121 119 123 124 122 126 127 125 129 130 128 132 133 131 135 136 134 138 139 137</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 5 9 12 16 19 23 26 30 33 37 40 45 49 52 56 59 63 66 70 73 77 80 83 86 89 92 95 98 101 104 107 110 113 116 119 122 125 128 131 134 137</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 3 4 1 0 5 6 1 6 7 2 1 7 8 2 8 9 3 2 9 10 3 10 11 4 3 11 12 4 12 13 0 4 13 14 0 14 5 15 16 17 18 19 16 15 20 21 16 21 22 17 16 22 23 17 23 24 18 17 24 25 18 25 26 19 18 26 27 19 27 28 15 19 28 29 15 29 20 10 26 11 11 26 25 11 25 12 12 25 24 12 24 13 13 24 23 13 23 14 14 23 22 14 22 5 5 22 21 5 21 6 6 21 20 6 20 7 7 20 29 7 29 8 8 29 28 8 28 9 9 28 27 9 27 10 10 27 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SelectedFacesToPolyhedron.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 3 5 0 5 3 0 3 3 0</points>\n\t\t<point_selection>0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 3 2\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SetColor.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 3 5 0 1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 1 1 0 -1 1 0 -3 1 0 -5 1 0 5 -1 -0 3 -1 -0 1 -1 -0 -1 -1 0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 1 -3 -0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 8 7 2 3 9 8 3 4 10 9 4 5 11 10 6 7 13 12 7 8 14 13 8 9 15 14 9 10 16 15 10 11 17 16 12 13 19 18 13 14 20 19 14 15 21 20 15 16 22 21 16 17 23 22 18 19 25 24 19 20 26 25 20 21 27 26 21 22 28 27 22 23 29 28 24 25 31 30 25 26 32 31 26 27 33 32 27 28 34 33 28 29 35 34\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SetPosition.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 2.5 2.5 0 2.5 2.5 0 -2.5 2.5 0 -2.5 2.5 0 2.5 -2.5 0 2.5 -2.5 0 -2.5 -2.5 0 -2.5 -2.5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.ShearPoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 0 2.5 2.5 5 2.5 -2.5 5 -2.5 -2.5 0 -2.5 2.5 -5 2.5 2.5 0 2.5 -2.5 0 -2.5 -2.5 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SimplifyPolyhedra.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 4.9039264020161522 -0.97545161008064118 5 4.6193976625564339 -1.913417161825449 5 4.1573480615127263 -2.7778511650980109 5 3.5355339059327378 -3.5355339059327373 5 2.7778511650980113 -4.1573480615127263 5 1.9134171618254492 -4.6193976625564339 5 0.97545161008064163 -4.9039264020161522 5 3.0615158845559431e-16 -5 5 -0.97545161008064096 -4.9039264020161522 5 -1.9134171618254485 -4.6193976625564339 5 -2.77785116509801 -4.1573480615127272 5 -3.5355339059327373 -3.5355339059327378 5 -4.1573480615127263 -2.7778511650980109 5 -4.6193976625564339 -1.9134171618254494 5 -4.9039264020161522 -0.97545161008064307 5 -5 -6.1230317691118863e-16 5 -4.9039264020161522 0.97545161008064185 5 -4.6193976625564339 1.9134171618254483 5 -4.1573480615127272 2.77785116509801 5 -3.5355339059327386 3.5355339059327373 5 -2.7778511650980109 4.1573480615127263 5 -1.9134171618254516 4.6193976625564321 5 -0.97545161008064329 4.9039264020161513 5 -9.1845476536678294e-16 5 5 0.97545161008064152 4.9039264020161522 5 1.9134171618254501 4.619397662556433 5 2.7778511650980091 4.1573480615127272 5 3.5355339059327369 3.5355339059327386 5 4.1573480615127263 2.7778511650980109 5 4.6193976625564321 1.9134171618254521 5 4.9039264020161513 0.97545161008064363 5 5 0 -5 4.9039264020161522 -0.97545161008064118 -5 4.6193976625564339 -1.913417161825449 -5 4.1573480615127263 -2.7778511650980109 -5 3.5355339059327378 -3.5355339059327373 -5 2.7778511650980113 -4.1573480615127263 -5 1.9134171618254492 -4.6193976625564339 -5 0.97545161008064163 -4.9039264020161522 -5 3.0615158845559431e-16 -5 -5 -0.97545161008064096 -4.9039264020161522 -5 -1.9134171618254485 -4.6193976625564339 -5 -2.77785116509801 -4.1573480615127272 -5 -3.5355339059327373 -3.5355339059327378 -5 -4.1573480615127263 -2.7778511650980109 -5 -4.6193976625564339 -1.9134171618254494 -5 -4.9039264020161522 -0.97545161008064307 -5 -5 -6.1230317691118863e-16 -5 -4.9039264020161522 0.97545161008064185 -5 -4.6193976625564339 1.9134171618254483 -5 -4.1573480615127272 2.77785116509801 -5 -3.5355339059327386 3.5355339059327373 -5 -2.7778511650980109 4.1573480615127263 -5 -1.9134171618254516 4.6193976625564321 -5 -0.97545161008064329 4.9039264020161513 -5 -9.1845476536678294e-16 5 -5 0.97545161008064152 4.9039264020161522 -5 1.9134171618254501 4.619397662556433 -5 2.7778511650980091 4.1573480615127272 -5 3.5355339059327369 3.5355339059327386 -5 4.1573480615127263 2.7778511650980109 -5 4.6193976625564321 1.9134171618254521 -5 4.9039264020161513 0.97545161008064363 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<vertex_data/>\n\t\t<polyhedra>\n\t\t\t<first_faces>0</first_faces>\n\t\t\t<face_counts>34</face_counts>\n\t\t\t<types>polygons</types>\n\t\t\t<constant_data/>\n\t\t\t<face_first_loops>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33</face_first_loops>\n\t\t\t<face_loop_counts>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</face_loop_counts>\n\t\t\t<face_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</face_selection>\n\t\t\t<face_materials>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_materials>\n\t\t\t<uniform_data/>\n\t\t\t<loop_first_edges>0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 128 160</loop_first_edges>\n\t\t\t<edge_points>0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 0 33 32 34 33 35 34 36 35 37 36 38 37 39 38 40 39 41 40 42 41 43 42 44 43 45 44 46 45 47 46 48 47 49 48 50 49 51 50 52 51 53 52 54 53 55 54 56 55 57 56 58 57 59 58 60 59 61 60 62 61 63 62 32 63 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63</edge_points>\n\t\t\t<clockwise_edges>1 64 3 66 5 68 7 70 9 72 11 74 13 76 15 78 17 80 19 82 21 84 23 86 25 88 27 90 29 92 31 94 33 96 35 98 37 100 39 102 41 104 43 106 45 108 47 110 49 112 51 114 53 116 55 118 57 120 59 122 61 124 63 126 65 0 67 2 69 4 71 6 73 8 75 10 77 12 79 14 81 16 83 18 85 20 87 22 89 24 91 26 93 28 95 30 97 32 99 34 101 36 103 38 105 40 107 42 109 44 111 46 113 48 115 50 117 52 119 54 121 56 123 58 125 60 127 62 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 128 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 160</clockwise_edges>\n\t\t\t<edge_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</edge_selection>\n\t\t\t<face_varying_data/>\n\t\t</polyhedra>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SmoothPoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-1.6666666666666665 1.6666666666666665 1.6666666666666665 0 1.875 1.875 1.6666666666666665 1.6666666666666665 1.6666666666666665 1.875 0 1.875 1.6666666666666665 -1.6666666666666665 1.6666666666666665 0 -1.875 1.875 -1.6666666666666665 -1.6666666666666665 1.6666666666666665 -1.875 0 1.875 -1.875 1.875 0 0 2.5 0 1.875 1.875 0 2.5 0 0 1.875 -1.875 0 0 -2.5 0 -1.875 -1.875 0 -2.5 0 0 -1.6666666666666665 1.6666666666666665 -1.6666666666666665 0 1.875 -1.875 1.6666666666666665 1.6666666666666665 -1.6666666666666665 1.875 0 -1.875 1.6666666666666665 -1.6666666666666665 -1.6666666666666665 0 -1.875 -1.875 -1.6666666666666665 -1.6666666666666665 -1.6666666666666665 -1.875 0 -1.875 0 0 2.5 0 0 -2.5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 9 8 1 2 10 9 2 3 11 10 3 4 12 11 4 5 13 12 5 6 14 13 6 7 15 14 7 0 8 15 8 9 17 16 9 10 18 17 10 11 19 18 11 12 20 19 12 13 21 20 13 14 22 21 14 15 23 22 15 8 16 23 2 1 24 3 1 0 7 24 3 24 5 4 24 7 6 5 16 17 25 23 17 18 19 25 23 25 21 22 25 19 20 21\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SphereizePoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 0 3.061862178478973 3.061862178478973 2.5 2.5 2.5 3.061862178478973 0 3.061862178478973 2.5 -2.5 2.5 0 -3.061862178478973 3.061862178478973 -2.5 -2.5 2.5 -3.061862178478973 0 3.061862178478973 -3.061862178478973 3.061862178478973 0 0 4.3301270189221936 0 3.061862178478973 3.061862178478973 0 4.3301270189221936 0 0 3.061862178478973 -3.061862178478973 0 0 -4.3301270189221936 0 -3.061862178478973 -3.061862178478973 0 -4.3301270189221936 0 0 -2.5 2.5 -2.5 0 3.061862178478973 -3.061862178478973 2.5 2.5 -2.5 3.061862178478973 0 -3.061862178478973 2.5 -2.5 -2.5 0 -3.061862178478973 -3.061862178478973 -2.5 -2.5 -2.5 -3.061862178478973 0 -3.061862178478973 0 0 4.3301270189221936 0 0 -4.3301270189221936</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 9 8 1 2 10 9 2 3 11 10 3 4 12 11 4 5 13 12 5 6 14 13 6 7 15 14 7 0 8 15 8 9 17 16 9 10 18 17 10 11 19 18 11 12 20 19 12 13 21 20 13 14 22 21 14 15 23 22 15 8 16 23 2 1 24 3 1 0 7 24 3 24 5 4 24 7 6 5 16 17 25 23 17 18 19 25 23 25 21 22 25 19 20 21\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SubdivideEdges.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-7.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 -7.5 2.5 -7.5 -7.5 2.5 -7.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -7.5 -2.5 -7.5 -7.5 -2.5 -6.25 -3.75 0 -3.75 -3.75 0 -3.75 -6.25 0 -6.25 -6.25 0 -6.25 -3.75 2.5 -6.25 -6.25 2.5 -3.75 -3.75 2.5 -3.75 -6.25 2.5 0.0050000000000000001 5 7.5 -0.0024999999999999988 4.995669872981078 7.5 -0.0025000000000000022 5.004330127018922 7.5 5 5 -2.5 -2.4999999999999991 0.66987298107780635 -2.5 -2.5000000000000022 9.330127018922191 -2.5 10 -5 5 6.5450849718747373 -9.7552825814757682 5 0.95491502812526363 -7.9389262614623668 5 0.95491502812526186 -2.061073738537635 5 6.5450849718747364 -0.24471741852423179 5 10 -5 0 6.5450849718747373 -9.7552825814757682 0 0.95491502812526363 -7.9389262614623668 0 0.95491502812526186 -2.061073738537635 0 6.5450849718747364 -0.24471741852423179 0 10 -5 -5 6.5450849718747373 -9.7552825814757682 -5 0.95491502812526363 -7.9389262614623668 -5 0.95491502812526186 -2.061073738537635 -5 6.5450849718747364 -0.24471741852423179 -5 -4.166666666666667 -7.5 -2.5 -5.833333333333333 -7.5 -2.5 -7.5 -5.833333333333333 -2.5 -7.5 -4.166666666666667 -2.5 -5.833333333333333 -2.5 -2.5 -4.166666666666667 -2.5 -2.5 -2.5 -4.166666666666667 -2.5 -2.5 -5.833333333333333 -2.5 -4.583333333333333 -6.25 2.5 -5.416666666666667 -6.25 2.5 0.0025000000000000005 4.9985566243270263 7.5 8.6714997975158997e-19 4.9971132486540517 7.5 -0.83499999999999974 3.5537375756799876 4.166666666666667 -1.6674999999999993 2.1118052783788968 0.83333333333333337 5.9229964682883107e-16 2.1132486540518709 -2.5 2.5000000000000004 3.5566243270259355 -2.5 3.335 5 0.83333333333333337 1.6699999999999999 5 4.166666666666667 8.84836165729158 -6.5850941938252561 5 7.6967233145831582 -8.1701883876505121 5 6.5450849718747373 -9.7552825814757682 3.3333333333333335 6.5450849718747373 -9.7552825814757682 1.6666666666666667 7.6967233145831582 -8.1701883876505121 0 8.84836165729158 -6.5850941938252561 0 10 -5 1.6666666666666667 10 -5 3.3333333333333335 6.5450849718747373 -9.7552825814757682 -3.3333333333333335 6.5450849718747373 -9.7552825814757682 -1.6666666666666667</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 6 6 7 7 4 4 5 5 15 15 16 16 17 17 20 20 19 19 22 22 23 23 28 28 27 27 33 33</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">48 50 52 54 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 56 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 1 51 2 53 3 55 0 57 24</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 2 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">6 7 4 5 4 7 3 0 3 7 6 2 2 6 5 1 5 4 0 1 0 3 2 1 13 12 14 15 8 12 13 11 13 15 10 11 15 14 9 10 9 14 12 8 10 9 8 11 37 38 39 40 41 42 43 44 45 46\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 0 0 1 1 2 2 3 3 27 27</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 0 0 1 1 2 2 3 3 27 27</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">18 20 22 24 5 6 7 4 9 10 11 8 13 14 12 16 17 15 19 1 21 2 23 3 25 0</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 15</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">16 17 20 19 17 18 21 20 18 16 19 21 16 18 17 19 20 21 47 48 49 50 51 52 53 54\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 0 0 1 1 2 2 3 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 0 0 1 1 2 2 3 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">50 52 54 56 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 58 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 44 40 46 47 48 49 45 51 1 53 2 55 3 57 0 59 24</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 45</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">22 23 28 27 23 24 29 28 24 25 30 29 25 26 31 30 26 22 27 31 27 28 33 32 28 29 34 33 29 30 35 34 30 31 36 35 31 27 32 36 22 26 25 24 23 32 33 34 35 36 55 56 57 58 59 60 61 62 63 64\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 0 0 1 1 2 2 3 3 27 27</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 0 0 1 1 2 2 3 3 27 27</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SubdivideFaces.Center.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-7.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 -7.5 2.5 -7.5 -7.5 2.5 -7.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -7.5 -2.5 -7.5 -7.5 -2.5 -6.25 -3.75 0 -3.75 -3.75 0 -3.75 -6.25 0 -6.25 -6.25 0 -6.25 -3.75 2.5 -6.25 -6.25 2.5 -3.75 -3.75 2.5 -3.75 -6.25 2.5 0.0050000000000000001 5 7.5 -0.0024999999999999988 4.995669872981078 7.5 -0.0025000000000000022 5.004330127018922 7.5 5 5 -2.5 -2.4999999999999991 0.66987298107780635 -2.5 -2.5000000000000022 9.330127018922191 -2.5 10 -5 5 6.5450849718747373 -9.7552825814757682 5 0.95491502812526363 -7.9389262614623668 5 0.95491502812526186 -2.061073738537635 5 6.5450849718747364 -0.24471741852423179 5 10 -5 0 6.5450849718747373 -9.7552825814757682 0 0.95491502812526363 -7.9389262614623668 0 0.95491502812526186 -2.061073738537635 0 6.5450849718747364 -0.24471741852423179 0 10 -5 -5 6.5450849718747373 -9.7552825814757682 -5 0.95491502812526363 -7.9389262614623668 -5 0.95491502812526186 -2.061073738537635 -5 6.5450849718747364 -0.24471741852423179 -5 -6.25 -5 1.25 -3.75 -5 1.25 3.75 -8.8471044214690675 -2.5 3.7499999999999991 -1.1528955785309334 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 10 10 30 31</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 40 44 45 43 47 48 46 50 51 49 53 54 52 56 57 55 59 60 58 62 63 61</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 43 46 49 52 55 58 61</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">6 7 4 5 4 7 3 0 3 7 6 2 2 6 5 1 5 4 0 1 0 3 2 1 13 12 14 15 13 15 10 11 9 14 12 8 10 9 8 11 8 12 37 12 13 37 13 11 37 11 8 37 15 14 38 14 9 38 9 10 38 10 15 38\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 32 33 34 35 40 41 42 43 44 45 46 47 28 28 28 29 29 29 30 30 30 31 31 31 36 36 36 37 37 37 38 38 38 39 39 39</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 9 10 6 6 6 6 8 8 8 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 32 33 34 35 40 41 42 43 44 45 46 47 28 29 28 29 30 29 30 31 30 31 28 29 36 37 36 37 38 37 38 39 38 39 36 37</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 12 16 17 15</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 15</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">16 17 20 19 17 18 21 20 18 16 19 21 16 18 17 19 20 21\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 36 32 38 39 40 41 37 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 37 42 45 48 51 54 57 60 63</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">22 23 28 27 23 24 29 28 24 25 30 29 25 26 31 30 26 22 27 31 27 28 33 32 29 30 35 34 31 27 32 36 22 26 25 24 23 32 33 34 35 36 28 29 39 29 34 39 34 33 39 33 28 39 30 31 40 31 36 40 36 35 40 35 30 40\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 28 29 30 31 36 37 38 39 40 41 42 43 44 45 46 47 48 49 24 24 24 25 25 25 26 26 26 27 27 27 32 32 32 33 33 33 34 34 34 35 35 35</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 9 10 11 6 6 6 6 8 8 8 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 28 29 30 31 36 37 38 39 40 41 42 43 44 45 46 47 48 49 24 25 24 25 26 25 26 27 26 27 24 25 32 33 32 33 34 33 34 35 34 35 32 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SubdivideFaces.CenterMidpoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-7.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 -7.5 2.5 -7.5 -7.5 2.5 -7.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -7.5 -2.5 -7.5 -7.5 -2.5 -6.25 -3.75 0 -3.75 -3.75 0 -3.75 -6.25 0 -6.25 -6.25 0 -6.25 -3.75 2.5 -6.25 -6.25 2.5 -3.75 -3.75 2.5 -3.75 -6.25 2.5 0.0050000000000000001 5 7.5 -0.0024999999999999988 4.995669872981078 7.5 -0.0025000000000000022 5.004330127018922 7.5 5 5 -2.5 -2.4999999999999991 0.66987298107780635 -2.5 -2.5000000000000022 9.330127018922191 -2.5 10 -5 5 6.5450849718747373 -9.7552825814757682 5 0.95491502812526363 -7.9389262614623668 5 0.95491502812526186 -2.061073738537635 5 6.5450849718747364 -0.24471741852423179 5 10 -5 0 6.5450849718747373 -9.7552825814757682 0 0.95491502812526363 -7.9389262614623668 0 0.95491502812526186 -2.061073738537635 0 6.5450849718747364 -0.24471741852423179 0 10 -5 -5 6.5450849718747373 -9.7552825814757682 -5 0.95491502812526363 -7.9389262614623668 -5 0.95491502812526186 -2.061073738537635 -5 6.5450849718747364 -0.24471741852423179 -5 -6.25 -5 1.25 -6.25 -3.75 1.25 -6.25 -5 2.5 -6.25 -6.25 1.25 -6.25 -5 0 -3.75 -5 1.25 -3.75 -5 2.5 -3.75 -3.75 1.25 -3.75 -5 0 -3.75 -6.25 1.25 3.75 -8.8471044214690675 -2.5 3.7500000000000004 -8.8471044214690675 0 0.95491502812526363 -7.9389262614623668 -2.5 3.7500000000000004 -8.8471044214690675 -5 6.5450849718747373 -9.7552825814757682 -2.5 3.7499999999999991 -1.1528955785309334 -2.5 3.7499999999999991 -1.1528955785309334 0 6.5450849718747364 -0.24471741852423179 -2.5 3.7499999999999991 -1.1528955785309334 -5 0.95491502812526186 -2.061073738537635 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 10 10 12 11 9 10 14 11 9 12 30 28 31 33 30 31 30 33 35 32</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">6 7 4 5 4 7 3 0 3 7 6 2 2 6 5 1 5 4 0 1 0 3 2 1 13 12 14 15 13 15 10 11 9 14 12 8 10 9 8 11 38 12 39 37 39 13 40 37 40 11 41 37 41 8 38 37 43 14 44 42 44 9 45 42 45 10 46 42 46 15 43 42\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 32 33 34 35 40 41 42 43 44 45 46 47 28 29 29 28 29 30 30 29 30 31 31 30 31 28 28 31 36 37 37 36 37 38 38 37 38 39 39 38 39 36 36 39</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 9 10 6 6 6 6 8 8 8 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 32 33 34 35 40 41 42 43 44 45 46 47 28 29 29 28 29 30 30 29 30 31 29 29 29 28 28 28 36 37 37 36 37 38 38 37 38 39 37 37 37 36 36 36</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 12 16 17 15</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 15</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">16 17 20 19 17 18 21 20 18 16 19 21 16 18 17 19 20 21\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 36 32 38 39 40 41 37 43 44 45 42 47 48 49 46 51 52 53 50 55 56 57 54 59 60 61 58 63 64 65 62 67 68 69 66 71 72 73 70</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 37 42 46 50 54 58 62 66 70</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">22 23 28 27 23 24 29 28 24 25 30 29 25 26 31 30 26 22 27 31 27 28 33 32 29 30 35 34 31 27 32 36 22 26 25 24 23 32 33 34 35 36 48 29 49 47 49 34 50 47 50 33 51 47 51 28 48 47 53 31 54 52 54 36 55 52 55 35 56 52 56 30 53 52\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 1 1 0 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 28 29 30 31 36 37 38 39 40 41 42 43 44 45 46 47 48 49 24 25 25 24 25 26 26 25 26 27 27 26 27 24 24 27 32 33 33 32 33 34 34 33 34 35 35 34 35 32 32 35</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 9 10 11 6 6 6 6 8 8 8 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 28 29 30 31 36 37 38 39 40 41 42 43 44 45 46 47 48 49 24 25 25 24 25 26 26 25 26 27 25 25 25 24 24 24 32 33 33 32 33 34 34 33 34 35 33 33 33 32 32 32</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.SubdivideFaces.Midpoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-7.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 -7.5 2.5 -7.5 -7.5 2.5 -7.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -7.5 -2.5 -7.5 -7.5 -2.5 -6.25 -3.75 0 -3.75 -3.75 0 -3.75 -6.25 0 -6.25 -6.25 0 -6.25 -3.75 2.5 -6.25 -6.25 2.5 -3.75 -3.75 2.5 -3.75 -6.25 2.5 0.0050000000000000001 5 7.5 -0.0024999999999999988 4.995669872981078 7.5 -0.0025000000000000022 5.004330127018922 7.5 5 5 -2.5 -2.4999999999999991 0.66987298107780635 -2.5 -2.5000000000000022 9.330127018922191 -2.5 10 -5 5 6.5450849718747373 -9.7552825814757682 5 0.95491502812526363 -7.9389262614623668 5 0.95491502812526186 -2.061073738537635 5 6.5450849718747364 -0.24471741852423179 5 10 -5 0 6.5450849718747373 -9.7552825814757682 0 0.95491502812526363 -7.9389262614623668 0 0.95491502812526186 -2.061073738537635 0 6.5450849718747364 -0.24471741852423179 0 10 -5 -5 6.5450849718747373 -9.7552825814757682 -5 0.95491502812526363 -7.9389262614623668 -5 0.95491502812526186 -2.061073738537635 -5 6.5450849718747364 -0.24471741852423179 -5 -6.25 -3.75 1.25 -6.25 -5 2.5 -6.25 -6.25 1.25 -6.25 -5 0 -3.75 -5 2.5 -3.75 -3.75 1.25 -3.75 -5 0 -3.75 -6.25 1.25 3.7500000000000004 -8.8471044214690675 0 0.95491502812526363 -7.9389262614623668 -2.5 3.7500000000000004 -8.8471044214690675 -5 6.5450849718747373 -9.7552825814757682 -2.5 3.7499999999999991 -1.1528955785309334 0 6.5450849718747364 -0.24471741852423179 -2.5 3.7499999999999991 -1.1528955785309334 -5 0.95491502812526186 -2.061073738537635 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 10 12 11 9 14 11 9 12 28 31 33 30 30 33 35 32</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 40 44 45 43 47 48 46 50 51 49 53 54 55 52 57 58 56 60 61 59 63 64 62 66 67 65 69 70 71 68</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 8 9 10 11 12 13 14 15 16 17 18 19</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 43 46 49 52 56 59 62 65 68</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">6 7 4 5 4 7 3 0 3 7 6 2 2 6 5 1 5 4 0 1 0 3 2 1 13 12 14 15 13 15 10 11 9 14 12 8 10 9 8 11 37 12 38 38 13 39 39 11 40 40 8 37 37 38 39 40 41 14 42 42 9 43 43 10 44 44 15 41 41 42 43 44\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 0.5 0 1 1 0 0 1 0 0.5 1 0 0 1 0 0 1 1 0 1 0.5 0 1 1 1 0 0 0.5 0.5 0.5 1 0.5 0 0.5 1 0 0 1 0.5 0.5 0.5 0.5 1 1 0 0 1 0 0.5 1 0 0 1 0 0 1 1 0 1 0.5 0 1 1 0 0 1 0 0.5 1 0 0 1 1 1 0 0.5 0.5 0.5 0.5 1 0 0 1 0.5 0 0.5 1 0.5 0.5 0.5</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 32 33 34 35 40 41 42 43 44 45 46 47 28 29 28 29 30 29 30 31 30 31 28 29 28 29 30 29 36 37 36 37 38 37 38 39 38 39 36 37 36 37 38 37</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 9 10 6 6 6 6 6 8 8 8 8 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 32 33 34 35 40 41 42 43 44 45 46 47 28 29 29 29 30 30 30 31 29 29 28 28 28 29 30 29 36 37 37 37 38 38 38 39 37 37 36 36 36 37 38 37</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 12 16 17 15</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 15</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">16 17 20 19 17 18 21 20 18 16 19 21 16 18 17 19 20 21\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 36 32 38 39 40 41 37 43 44 42 46 47 45 49 50 48 52 53 51 55 56 57 54 59 60 58 62 63 61 65 66 64 68 69 67 71 72 73 70</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 37 42 45 48 51 54 58 61 64 67 70</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">22 23 28 27 23 24 29 28 24 25 30 29 25 26 31 30 26 22 27 31 27 28 33 32 29 30 35 34 31 27 32 36 22 26 25 24 23 32 33 34 35 36 45 29 46 46 34 47 47 33 48 48 28 45 45 46 47 48 49 31 50 50 36 51 51 35 52 52 30 49 49 50 51 52\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0.5 1 0 0 1 1 0 1 0.5 0 1 1 0 1 1 1 1 1 0.5 1 1 1 1 0 1 1 0.5 1 1 0 0.5 1 0.5 0 1 1 0.5 1 0.5 1 1 0 0 1 1 0 1 0.5 0 1 1 0 1 1 1 1 1 0.5 1 1 1 1 1 0 0 1 0.5 0.5 1 0 0 0 0 1 0.5 0 0.5 0.5 0 1 1 0.5 1 1 0.5 0.5 0.5 0 0.5</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 28 29 30 31 36 37 38 39 40 41 42 43 44 45 46 47 48 49 24 25 24 25 26 25 26 27 26 27 24 25 24 25 26 25 32 33 32 33 34 33 34 35 34 35 32 33 32 33 34 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 9 10 11 6 6 6 6 6 8 8 8 8 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 28 29 30 31 36 37 38 39 40 41 42 43 44 45 46 47 48 49 24 25 25 25 26 26 26 27 25 25 24 24 24 25 26 25 32 33 33 33 34 34 34 35 33 33 32 32 32 33 34 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.TaperPoints.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 5 0 -0 5 0 -0 5 0 -0 5 0 -0 5 0 -0 5 0 -0 5 0 -0 5 0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 0 5 -0 0 5 -0 0 5 -0 0 5 -0 0 5 -0 0 5 -0 0 5 -0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 2 0 3 1.9615705608064609 -0.3901806440322565 3 1.8477590650225737 -0.76536686473017967 3 1.6629392246050907 -1.1111404660392044 3 1.4142135623730951 -1.4142135623730949 3 1.1111404660392046 -1.6629392246050902 3 0.76536686473017967 -1.8477590650225737 3 0.39018064403225661 -1.9615705608064609 3 1.2246467991473532e-16 -2 3 -0.39018064403225639 -1.9615705608064609 3 -0.76536686473017945 -1.8477590650225737 3 -1.1111404660392041 -1.6629392246050909 3 -1.4142135623730949 -1.4142135623730951 3 -1.6629392246050907 -1.1111404660392044 3 -1.8477590650225737 -0.76536686473017967 3 -1.9615705608064609 -0.39018064403225722 3 -2 -2.4492935982947064e-16 3 -1.9615705608064609 0.39018064403225677 3 -1.8477590650225737 0.76536686473017934 3 -1.6629392246050909 1.1111404660392041 3 -1.4142135623730956 1.4142135623730949 3 -1.1111404660392044 1.6629392246050907 3 -0.76536686473018067 1.847759065022573 3 -0.39018064403225733 1.9615705608064606 3 -3.6739403974420594e-16 2 3 0.39018064403225661 1.9615705608064609 3 0.76536686473018012 1.8477590650225733 3 1.1111404660392037 1.6629392246050914 3 1.4142135623730949 1.4142135623730956 3 1.6629392246050907 1.1111404660392044 3 1.847759065022573 0.7653668647301809 3 1.9615705608064606 0.3901806440322575 3 4 0 1 3.9231411216129217 -0.78036128806451299 1 3.6955181300451474 -1.5307337294603593 1 3.3258784492101814 -2.2222809320784087 1 2.8284271247461903 -2.8284271247461898 1 2.2222809320784092 -3.3258784492101805 1 1.5307337294603593 -3.6955181300451474 1 0.78036128806451321 -3.9231411216129217 1 2.4492935982947064e-16 -4 1 -0.78036128806451277 -3.9231411216129217 1 -1.5307337294603589 -3.6955181300451474 1 -2.2222809320784083 -3.3258784492101818 1 -2.8284271247461898 -2.8284271247461903 1 -3.3258784492101814 -2.2222809320784087 1 -3.6955181300451474 -1.5307337294603593 1 -3.9231411216129217 -0.78036128806451444 1 -4 -4.8985871965894128e-16 1 -3.9231411216129217 0.78036128806451355 1 -3.6955181300451474 1.5307337294603587 1 -3.3258784492101818 2.2222809320784083 1 -2.8284271247461912 2.8284271247461898 1 -2.2222809320784087 3.3258784492101814 1 -1.5307337294603613 3.6955181300451461 1 -0.78036128806451466 3.9231411216129213 1 -7.3478807948841188e-16 4 1 0.78036128806451321 3.9231411216129217 1 1.5307337294603602 3.6955181300451465 1 2.2222809320784074 3.3258784492101827 1 2.8284271247461898 2.8284271247461912 1 3.3258784492101814 2.2222809320784087 1 3.6955181300451461 1.5307337294603618 1 3.9231411216129213 0.78036128806451499 1 4 0 -1 3.9231411216129217 -0.78036128806451299 -1 3.6955181300451474 -1.5307337294603593 -1 3.3258784492101814 -2.2222809320784087 -1 2.8284271247461903 -2.8284271247461898 -1 2.2222809320784092 -3.3258784492101805 -1 1.5307337294603593 -3.6955181300451474 -1 0.78036128806451321 -3.9231411216129217 -1 2.4492935982947064e-16 -4 -1 -0.78036128806451277 -3.9231411216129217 -1 -1.5307337294603589 -3.6955181300451474 -1 -2.2222809320784083 -3.3258784492101818 -1 -2.8284271247461898 -2.8284271247461903 -1 -3.3258784492101814 -2.2222809320784087 -1 -3.6955181300451474 -1.5307337294603593 -1 -3.9231411216129217 -0.78036128806451444 -1 -4 -4.8985871965894128e-16 -1 -3.9231411216129217 0.78036128806451355 -1 -3.6955181300451474 1.5307337294603587 -1 -3.3258784492101818 2.2222809320784083 -1 -2.8284271247461912 2.8284271247461898 -1 -2.2222809320784087 3.3258784492101814 -1 -1.5307337294603613 3.6955181300451461 -1 -0.78036128806451466 3.9231411216129213 -1 -7.3478807948841188e-16 4 -1 0.78036128806451321 3.9231411216129217 -1 1.5307337294603602 3.6955181300451465 -1 2.2222809320784074 3.3258784492101827 -1 2.8284271247461898 2.8284271247461912 -1 3.3258784492101814 2.2222809320784087 -1 3.6955181300451461 1.5307337294603618 -1 3.9231411216129213 0.78036128806451499 -1 2 0 -3 1.9615705608064609 -0.3901806440322565 -3 1.8477590650225737 -0.76536686473017967 -3 1.6629392246050907 -1.1111404660392044 -3 1.4142135623730951 -1.4142135623730949 -3 1.1111404660392046 -1.6629392246050902 -3 0.76536686473017967 -1.8477590650225737 -3 0.39018064403225661 -1.9615705608064609 -3 1.2246467991473532e-16 -2 -3 -0.39018064403225639 -1.9615705608064609 -3 -0.76536686473017945 -1.8477590650225737 -3 -1.1111404660392041 -1.6629392246050909 -3 -1.4142135623730949 -1.4142135623730951 -3 -1.6629392246050907 -1.1111404660392044 -3 -1.8477590650225737 -0.76536686473017967 -3 -1.9615705608064609 -0.39018064403225722 -3 -2 -2.4492935982947064e-16 -3 -1.9615705608064609 0.39018064403225677 -3 -1.8477590650225737 0.76536686473017934 -3 -1.6629392246050909 1.1111404660392041 -3 -1.4142135623730956 1.4142135623730949 -3 -1.1111404660392044 1.6629392246050907 -3 -0.76536686473018067 1.847759065022573 -3 -0.39018064403225733 1.9615705608064606 -3 -3.6739403974420594e-16 2 -3 0.39018064403225661 1.9615705608064609 -3 0.76536686473018012 1.8477590650225733 -3 1.1111404660392037 1.6629392246050914 -3 1.4142135623730949 1.4142135623730956 -3 1.6629392246050907 1.1111404660392044 -3 1.847759065022573 0.7653668647301809 -3 1.9615705608064606 0.3901806440322575 -3 0 0 -5 0 -0 -5 0 -0 -5 0 -0 -5 0 -0 -5 0 -0 -5 0 -0 -5 0 -0 -5 0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 0 -5 -0 0 -5 -0 0 -5 -0 0 -5 -0 0 -5 -0 0 -5 -0 0 -5 -0 0 -5 0 0 -5 0 0 -5 0 0 -5 0 0 -5 0 0 -5 0 0 -5 0 0 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.TaperPoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 5 0 -0 5 0 -0 5 0 -0 5 0 -0 5 0 -0 5 0 -0 5 0 -0 5 0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 -0 5 -0 0 5 -0 0 5 -0 0 5 -0 0 5 -0 0 5 -0 0 5 -0 0 5 -0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 2 0 3 1.9615705608064609 -0.3901806440322565 3 1.8477590650225737 -0.76536686473017967 3 1.6629392246050907 -1.1111404660392044 3 1.4142135623730951 -1.4142135623730949 3 1.1111404660392046 -1.6629392246050907 3 0.76536686473017967 -1.8477590650225737 3 0.39018064403225666 -1.9615705608064609 3 1.2246063538223773e-16 -2 3 -0.39018064403225639 -1.9615705608064609 3 -0.76536686473017945 -1.8477590650225737 3 -1.1111404660392041 -1.6629392246050909 3 -1.4142135623730949 -1.4142135623730951 3 -1.6629392246050907 -1.1111404660392044 3 -1.8477590650225737 -0.76536686473017979 3 -1.9615705608064609 -0.39018064403225727 3 -2 -2.4492127076447545e-16 3 -1.9615705608064609 0.39018064403225677 3 -1.8477590650225737 0.76536686473017934 3 -1.6629392246050909 1.1111404660392041 3 -1.4142135623730956 1.4142135623730949 3 -1.1111404660392044 1.6629392246050907 3 -0.76536686473018067 1.847759065022573 3 -0.39018064403225733 1.9615705608064606 3 -3.6738190614671318e-16 2 3 0.39018064403225661 1.9615705608064609 3 0.76536686473018012 1.8477590650225733 3 1.1111404660392037 1.6629392246050909 3 1.4142135623730949 1.4142135623730956 3 1.6629392246050907 1.1111404660392044 3 1.847759065022573 0.7653668647301809 3 1.9615705608064606 0.3901806440322575 3 4 0 0.99999999999999978 3.9231411216129217 -0.78036128806451299 0.99999999999999978 3.6955181300451474 -1.5307337294603593 0.99999999999999978 3.3258784492101814 -2.2222809320784087 0.99999999999999978 2.8284271247461903 -2.8284271247461898 0.99999999999999978 2.2222809320784092 -3.3258784492101814 0.99999999999999978 1.5307337294603593 -3.6955181300451474 0.99999999999999978 0.78036128806451333 -3.9231411216129217 0.99999999999999978 2.4492127076447545e-16 -4 0.99999999999999978 -0.78036128806451277 -3.9231411216129217 0.99999999999999978 -1.5307337294603589 -3.6955181300451474 0.99999999999999978 -2.2222809320784083 -3.3258784492101818 0.99999999999999978 -2.8284271247461898 -2.8284271247461903 0.99999999999999978 -3.3258784492101814 -2.2222809320784087 0.99999999999999978 -3.6955181300451474 -1.5307337294603596 0.99999999999999978 -3.9231411216129217 -0.78036128806451455 0.99999999999999978 -4 -4.898425415289509e-16 0.99999999999999978 -3.9231411216129217 0.78036128806451355 0.99999999999999978 -3.6955181300451474 1.5307337294603587 0.99999999999999978 -3.3258784492101818 2.2222809320784083 0.99999999999999978 -2.8284271247461912 2.8284271247461898 0.99999999999999978 -2.2222809320784087 3.3258784492101814 0.99999999999999978 -1.5307337294603613 3.6955181300451461 0.99999999999999978 -0.78036128806451466 3.9231411216129213 0.99999999999999978 -7.3476381229342635e-16 4 0.99999999999999978 0.78036128806451321 3.9231411216129217 0.99999999999999978 1.5307337294603602 3.6955181300451465 0.99999999999999978 2.2222809320784074 3.3258784492101818 0.99999999999999978 2.8284271247461898 2.8284271247461912 0.99999999999999978 3.3258784492101814 2.2222809320784087 0.99999999999999978 3.6955181300451461 1.5307337294603618 0.99999999999999978 3.9231411216129213 0.78036128806451499 0.99999999999999978 4 0 -0.99999999999999978 3.9231411216129217 -0.78036128806451299 -0.99999999999999978 3.6955181300451474 -1.5307337294603593 -0.99999999999999978 3.3258784492101814 -2.2222809320784087 -0.99999999999999978 2.8284271247461903 -2.8284271247461898 -0.99999999999999978 2.2222809320784092 -3.3258784492101814 -0.99999999999999978 1.5307337294603593 -3.6955181300451474 -0.99999999999999978 0.78036128806451333 -3.9231411216129217 -0.99999999999999978 2.4492127076447545e-16 -4 -0.99999999999999978 -0.78036128806451277 -3.9231411216129217 -0.99999999999999978 -1.5307337294603589 -3.6955181300451474 -0.99999999999999978 -2.2222809320784083 -3.3258784492101818 -0.99999999999999978 -2.8284271247461898 -2.8284271247461903 -0.99999999999999978 -3.3258784492101814 -2.2222809320784087 -0.99999999999999978 -3.6955181300451474 -1.5307337294603596 -0.99999999999999978 -3.9231411216129217 -0.78036128806451455 -0.99999999999999978 -4 -4.898425415289509e-16 -0.99999999999999978 -3.9231411216129217 0.78036128806451355 -0.99999999999999978 -3.6955181300451474 1.5307337294603587 -0.99999999999999978 -3.3258784492101818 2.2222809320784083 -0.99999999999999978 -2.8284271247461912 2.8284271247461898 -0.99999999999999978 -2.2222809320784087 3.3258784492101814 -0.99999999999999978 -1.5307337294603613 3.6955181300451461 -0.99999999999999978 -0.78036128806451466 3.9231411216129213 -0.99999999999999978 -7.3476381229342635e-16 4 -0.99999999999999978 0.78036128806451321 3.9231411216129217 -0.99999999999999978 1.5307337294603602 3.6955181300451465 -0.99999999999999978 2.2222809320784074 3.3258784492101818 -0.99999999999999978 2.8284271247461898 2.8284271247461912 -0.99999999999999978 3.3258784492101814 2.2222809320784087 -0.99999999999999978 3.6955181300451461 1.5307337294603618 -0.99999999999999978 3.9231411216129213 0.78036128806451499 -0.99999999999999978 1.9999999999999996 0 -3.0000000000000004 1.9615705608064604 -0.39018064403225639 -3.0000000000000004 1.8477590650225733 -0.76536686473017945 -3.0000000000000004 1.6629392246050902 -1.1111404660392041 -3.0000000000000004 1.4142135623730947 -1.4142135623730947 -3.0000000000000004 1.1111404660392044 -1.6629392246050902 -3.0000000000000004 0.76536686473017945 -1.8477590650225733 -3.0000000000000004 0.39018064403225655 -1.9615705608064604 -3.0000000000000004 1.224606353822377e-16 -1.9999999999999996 -3.0000000000000004 -0.39018064403225627 -1.9615705608064604 -3.0000000000000004 -0.76536686473017923 -1.8477590650225733 -3.0000000000000004 -1.1111404660392037 -1.6629392246050905 -3.0000000000000004 -1.4142135623730947 -1.4142135623730947 -3.0000000000000004 -1.6629392246050902 -1.1111404660392041 -3.0000000000000004 -1.8477590650225733 -0.76536686473017956 -3.0000000000000004 -1.9615705608064604 -0.39018064403225716 -3.0000000000000004 -1.9999999999999996 -2.449212707644754e-16 -3.0000000000000004 -1.9615705608064604 0.39018064403225666 -3.0000000000000004 -1.8477590650225733 0.76536686473017912 -3.0000000000000004 -1.6629392246050905 1.1111404660392037 -3.0000000000000004 -1.4142135623730951 1.4142135623730947 -3.0000000000000004 -1.1111404660392041 1.6629392246050902 -3.0000000000000004 -0.76536686473018045 1.8477590650225724 -3.0000000000000004 -0.39018064403225722 1.96157056080646 -3.0000000000000004 -3.6738190614671308e-16 1.9999999999999996 -3.0000000000000004 0.3901806440322565 1.9615705608064604 -3.0000000000000004 0.7653668647301799 1.8477590650225728 -3.0000000000000004 1.1111404660392035 1.6629392246050905 -3.0000000000000004 1.4142135623730945 1.4142135623730951 -3.0000000000000004 1.6629392246050902 1.1111404660392041 -3.0000000000000004 1.8477590650225724 0.76536686473018067 -3.0000000000000004 1.96157056080646 0.39018064403225738 -3.0000000000000004 0 0 -5 0 -0 -5 0 -0 -5 0 -0 -5 0 -0 -5 0 -0 -5 0 -0 -5 0 -0 -5 0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 -0 -5 -0 0 -5 -0 0 -5 -0 0 -5 -0 0 -5 -0 0 -5 -0 0 -5 -0 0 -5 -0 0 -5 0 0 -5 0 0 -5 0 0 -5 0 0 -5 0 0 -5 0 0 -5 0 0 -5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.TransformPoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 3.5 2.5 2.5 3.5 2.5 -2.5 3.5 -2.5 -2.5 3.5 -2.5 2.5 -1.5 2.5 2.5 -1.5 2.5 -2.5 -1.5 -2.5 -2.5 -1.5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.TranslatePoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-1.5 2.5 2.5 3.5 2.5 2.5 3.5 -2.5 2.5 -1.5 -2.5 2.5 -1.5 2.5 -2.5 3.5 2.5 -2.5 3.5 -2.5 -2.5 -1.5 -2.5 -2.5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.TriangulateFaces.PolyCube.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 0 5 4 1 2 6 1 6 5 2 3 7 2 7 6 3 0 4 3 4 7 1 0 3 1 3 2 4 5 6 4 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14 12 14 15 16 17 18 16 18 19 20 21 22 20 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 1 2 2 3 3 4 4 5 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14 12 14 15 16 17 18 16 18 19 20 21 22 20 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.TriangulateFaces.PolyGrid.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 -5 5 0 5 -5 -0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 3 0 3 2\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 0 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 0 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.TriangulateFaces.PolyGrid.selection.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 1.6666666666666665 5 0 -1.6666666666666665 5 0 -5 5 0 5 1.6666666666666665 0 1.6666666666666665 1.6666666666666665 0 -1.6666666666666665 1.6666666666666665 0 -5 1.6666666666666665 0 5 -1.6666666666666665 -0 1.6666666666666665 -1.6666666666666665 -0 -1.6666666666666665 -1.6666666666666665 0 -5 -1.6666666666666665 0 5 -5 -0 1.6666666666666665 -5 -0 -1.6666666666666665 -5 0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 21 18 23 24 25 22 27 28 29 26 31 32 33 30 35 36 37 34 39 40 41 38</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 1 1 1 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 22 26 30 34 38</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 0 5 4 1 2 6 1 6 5 2 3 7 2 7 6 4 5 9 8 5 6 10 9 6 7 11 10 8 9 13 12 9 10 14 13 10 11 15 14\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 1 2 2 3 4 5 6 7 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.TriangulateFaces.self_intersection.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 5 0 5 5 0 -5 -5 0 5 -5 0 0 0 0</points>\n\t\t<point_selection>0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 0</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">3 4 2 1 0 4\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">3 0 2 1 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 1 1 0.5 0.5 0.5 0 0 1 0 1 0 1 0 0 0.5 0.5 0.5</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">3 0 2 1 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.TriangulateFaces.vertex.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 1 1 0 1 2 0 0 2 0 1 1 0 0 0 0 0 1.5 0 0.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 1</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 4 0 4 5 1 6 4 3 2 6\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 0 2 3 4 4 7 6 5 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 0 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 0 0 0.5 0.5 0.5 1 1 1 0 0 1 0 1 0 0.5 0.5 0.5</array>\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 0 2 3 4 4 7 6 5 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.TwistPoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-3.2042819102789428 1.4941811936505993 2.5 1.4941811936505993 3.2042819102789428 2.5 3.2042819102789428 -1.4941811936505993 2.5 -1.4941811936505993 -3.2042819102789428 2.5 -1.4941811936505993 3.2042819102789428 -2.5 3.2042819102789428 1.4941811936505993 -2.5 1.4941811936505993 -3.2042819102789428 -2.5 -3.2042819102789428 -1.4941811936505993 -2.5</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.modifier.WeldPoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.selection.GrowSelection.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 3 5 0 1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 1 1 0 -1 1 0 -3 1 0 -5 1 0 5 -1 -0 3 -1 -0 1 -1 -0 -1 -1 0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 1 -3 -0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 8 7 2 3 9 8 3 4 10 9 4 5 11 10 6 7 13 12 7 8 14 13 8 9 15 14 9 10 16 15 10 11 17 16 12 13 19 18 13 14 20 19 14 15 21 20 15 16 22 21 16 17 23 22 18 19 25 24 19 20 26 25 20 21 27 26 21 22 28 27 22 23 29 28 24 25 31 30 25 26 32 31 26 27 33 32 27 28 34 33 28 29 35 34\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.selection.SelectBoundaryEdges.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 3 5 0 1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 1 1 0 -1 1 0 -3 1 0 -5 1 0 5 -1 -0 3 -1 -0 1 -1 -0 -1 -1 0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 1 -3 -0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 8 7 2 3 9 8 3 4 10 9 4 5 11 10 6 7 13 12 7 8 14 13 8 9 15 14 9 10 16 15 10 11 17 16 12 13 19 18 13 14 20 19 14 15 21 20 15 16 22 21 16 17 23 22 18 19 25 24 19 20 26 25 20 21 27 26 21 22 28 27 22 23 29 28 24 25 31 30 25 26 32 31 26 27 33 32 27 28 34 33 28 29 35 34\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.selection.SelectDegenerateFaces.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 3 0 0 3 0 0 3 0 0 3 0 0 3 0 0 3 0 5 1 0 3 1 0 1 1 0 -1 1 0 -3 1 0 -5 1 0 5 -1 0 3 -1 0 1 -1 0 -1 -1 0 -3 -1 0 -5 -1 0 5 -3 0 3 -3 0 1 -3 0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 0 3 -5 0 1 -5 0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 8 7 2 3 9 8 3 4 10 9 4 5 11 10 6 7 13 12 7 8 14 13 8 9 15 14 9 10 16 15 10 11 17 16 12 13 19 18 13 14 20 19 14 15 21 20 15 16 22 21 16 17 23 22 18 19 25 24 19 20 26 25 20 21 27 26 21 22 28 27 22 23 29 28 24 25 31 30 25 26 32 31 26 27 33 32 27 28 34 33 28 29 35 34\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.selection.all.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>10 5 0 -10 5 0 10 -5 0 -10 -5 0</points>\n\t\t<point_selection>1 1 1 1</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 3 2\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.selection.none.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 -5 5 0 5 -5 0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 3 2\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.selection.null.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 -5 5 0 5 -5 0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 3 2\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.selection.points.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>10 5 0 -10 5 0 5 -5 0 -5 -5 0</points>\n\t\t<point_selection>1 1 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 3 2\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.sink.K3DMeshWriter.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.sink.OBJMeshWriter.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.sink.PLYMeshWriter.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 0 5 4 1 2 6 1 6 5 2 3 7 2 7 6 3 0 4 3 4 7 1 0 3 1 3 2 4 5 6 4 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.sink.STLMeshWriter.magics.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 -2.5 -2.5 -2.5 2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 0 2 3 1 4 5 1 5 2 4 6 7 4 7 5 6 0 3 6 3 7 1 0 6 1 6 4 3 2 5 3 5 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.sink.STLMeshWriter.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 -2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5 2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">1 0 2 3 0 1 4 2 5 1 2 4 6 5 7 4 5 6 3 7 0 6 7 3 7 2 0 5 2 7 4 3 1 6 3 4\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.sink.STLMeshWriter.viscam.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 -2.5 -2.5 -2.5 2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 0 2 3 1 4 5 1 5 2 4 6 7 4 7 5 6 0 3 6 3 7 1 0 6 1 6 4 3 2 5 3 5 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.3DSMeshReader.test.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1 0.99999994039535522 -1 1 -1 -1 -1.0000001192092896 -0.99999982118606567 -1 -0.99999964237213135 1.0000003576278687 -1 1.0000004768371582 0.99999946355819702 1 0.99999934434890747 -1.0000005960464478 1 -1.0000003576278687 -0.99999964237213135 1 -0.99999994039535522 1 1</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 0 2 3 4 7 6 4 6 5 0 4 5 0 5 1 1 5 6 1 6 2 2 6 7 2 7 3 4 0 3 4 3 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.BlobbyEllipsoid.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.BlobbySegment.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">0 0 0 3 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">23</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1002</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.COLLADAMeshReader.duck.dae",
    "content": "<?xml version=\"1.0\"?>\r\n<!--\r\n  Copyright 2006 Sony Computer Entertainment Inc.\r\n \r\n  Licensed under the SCEA Shared Source License, Version 1.0 (the \"License\"); you may not use this \r\n  file except in compliance with the License. You may obtain a copy of the License at:\r\n  http://research.scea.com/scea_shared_source_license.html\r\n \r\n  Unless required by applicable law or agreed to in writing, software distributed under the License \r\n  is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or \r\n  implied. See the License for the specific language governing permissions and limitations under the \r\n  License. \r\n-->\r\n<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">\r\n    <asset>\r\n        <contributor>\r\n            <author>gcorson</author>\r\n            <authoring_tool>Maya 7.0 | ColladaMaya v2.03b Jul 27 2006 at 18:43:34 | FCollada v1.13</authoring_tool>\r\n            <comments>Collada Maya Export Options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;\r\ncurveConstrainSampling=0;exportCameraAsLookat=0;\r\nexportLights=1;exportCameras=1;exportJointsAndSkin=1;\r\nexportAnimations=1;exportTriangles=0;exportInvisibleNodes=0;\r\nexportNormals=1;exportTexCoords=1;exportVertexColors=1;exportTangents=0;\r\nexportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;\r\ndereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>\r\n            <source_data>file:///C:/Documents%20and%20Settings/gcorson/My%20Documents/maya/projects/default/untitled</source_data>\r\n        </contributor>\r\n        <created>2006-08-23T22:29:59Z</created>\r\n        <modified>2006-08-23T22:30:00Z</modified>\r\n        <unit meter=\"0.01\" name=\"centimeter\"/>\r\n        <up_axis>Y_UP</up_axis>\r\n    </asset>\r\n    <library_physics_scenes>\r\n        <physics_scene id=\"MayaNativePhysicsScene\">\r\n            <technique_common>\r\n                <gravity>0 -980 0 </gravity>\r\n                <time_step>0.083</time_step>\r\n            </technique_common>\r\n        </physics_scene>\r\n    </library_physics_scenes>\r\n    <library_images>\r\n        <image id=\"file2\" name=\"file2\">\r\n            <init_from>images/duckCM.tga</init_from>\r\n        </image>\r\n    </library_images>\r\n    <library_materials>\r\n        <material id=\"blinn3\" name=\"blinn3\">\r\n            <instance_effect url=\"#blinn3-fx\"/>\r\n        </material>\r\n    </library_materials>\r\n    <library_effects>\r\n        <effect id=\"blinn3-fx\">\r\n            <profile_COMMON>\r\n                <newparam sid=\"file2-surface\">\r\n                    <surface type=\"2D\">\r\n                        <init_from>file2</init_from>\r\n                        <format>A8R8G8B8</format>\r\n                    </surface>\r\n                </newparam>\r\n                <newparam sid=\"file2-sampler\">\r\n                    <sampler2D>\r\n                        <source>file2-surface</source>\r\n                        <minfilter>LINEAR_MIPMAP_LINEAR</minfilter>\r\n                        <magfilter>LINEAR</magfilter>\r\n                    </sampler2D>\r\n                </newparam>\r\n                <technique sid=\"common\">\r\n                    <blinn>\r\n                        <emission>\r\n                            <color>0 0 0 1 </color>\r\n                        </emission>\r\n                        <ambient>\r\n                            <color>0 0 0 1 </color>\r\n                        </ambient>\r\n                        <diffuse>\r\n                            <texture texture=\"file2-sampler\" texcoord=\"UVSET0\">\r\n                            </texture>\r\n                        </diffuse>\r\n                        <specular>\r\n                            <color>0 0 0 1 </color>\r\n                        </specular>\r\n                        <shininess>\r\n                            <float>0.3</float>\r\n                        </shininess>\r\n                        <reflective>\r\n                            <color>0 0 0 1 </color>\r\n                        </reflective>\r\n                        <reflectivity>\r\n                            <float>0.5</float>\r\n                        </reflectivity>\r\n                        <transparent>\r\n                            <color>0 0 0 1 </color>\r\n                        </transparent>\r\n                        <transparency>\r\n                            <float>0</float>\r\n                        </transparency>\r\n                        <index_of_refraction>\r\n                            <float>0</float>\r\n                        </index_of_refraction>\r\n                    </blinn>\r\n                </technique>\r\n            </profile_COMMON>\r\n        </effect>\r\n    </library_effects>\r\n    <library_geometries>\r\n        <geometry id=\"LOD3spShape-lib\" name=\"LOD3spShape\">\r\n            <mesh>\r\n                <source id=\"LOD3spShape-lib-positions\" name=\"position\">\r\n                    <float_array id=\"LOD3spShape-lib-positions-array\" count=\"6324\">315.16 849.43 386.38 106.71 853.88 374.44 -32.73 878.5 301.82 -98.8 840.17 132.87 450.5 849.84 338.51 -568.84 -199.36 410.11 -368.95 -202.05 532.84 542 -117.38 564.24 729.2 -108.39 436.46 598.25 -201.96 377.25 -470.58 -111.4 624.7 -709.14 -104.88 470.88 685.07 -202.44 246.21 655.18 24.09 605.17 804.43 35.44 466.77 -601.94 44.28 657.53 -817.42 34.09 494.78 838.33 206.82 473.85 722.87 202.14 609.07 822.79 385.67 465.6 714.44 392.17 587.23 740.83 539.61 447.73 591.59 557.38 553.12 429.46 664.81 500.98 610.69 655.43 418.43 41.87 640.14 545.32 -320.74 641.88 461.18 41.08 707.26 460.77 -202.79 696.62 383.98 -491.46 698.95 174.33 -90.55 742.06 284.5 -895.32 857.37 190.43 -880.9 651.84 434.94 -752.97 694.41 423.52 -1030.64 640.54 167.61 -987.62 529.89 411.36 -736.22 469.93 603.21 -1033.44 416.21 364.35 -817.55 308.16 608.23 -944.47 236.55 449.27 -586.1 599.27 522.11 -603.85 754.31 187.46 493.5 737.37 372.27 303.02 730.53 430.54 52.56 741.44 400.54 -148.36 737.28 125 47.53 -202.29 562.3 76.09 -121.94 655.11 434.42 558.19 608.85 597.87 401.31 648.14 603.74 207.12 670.48 476.12 35.07 667.82 86.12 -68.4 683.68 -484.46 45.2 697.89 -658.06 246 670.4 -640.96 424.68 647.5 -483.1 544.8 605.64 -349.6 230.21 770.99 -20.28 234.93 798.45 -297.12 133.63 770.24 -352.84 348.87 759.61 -31.04 347.59 792.79 174.16 141.84 778.81 -5.89 124.3 780.56 207.29 244.8 784.4 185.88 386.78 773.46 -32.7 443.06 761.85 129.74 475.21 750.83 -306.44 417.09 749.6 -465.18 369.68 726.69 -459.17 228.23 743.47 -337.18 108.42 755.92 -359.78 449.68 718.68 8.73 70.52 765.31 223.14 115.48 765.62 313.93 239.37 762.48 297.7 397.76 746.15 177.95 498.52 726.78 -22.85 492.01 723.98 -66.39 783.87 109.41 -19.35 789.77 248.42 99.73 790.38 347.27 318.34 789.93 367.98 447.91 792.94 324.13 573.12 860.38 248.35 191.31 848.47 388.89 38.79 864.07 348.7 -76.38 851.89 207.49 639.95 858.13 116.68 -480.05 -200.6 484.02 -311.76 -220.75 473.39 -488.09 -219.76 370.65 -631.33 -198.6 310.12 672.91 -163.68 411.13 432 -202.02 475.98 487.06 -165.79 524.6 -419.66 -163.19 582.67 -643.66 -160.54 444.49 -601.34 -105.89 566.46 -779.97 -104.5 347.96 831.99 -108.73 272.36 771.72 -40.43 454.46 595.13 -52.73 591.03 -521.6 -39.67 651.59 -767.25 -37.03 488.23 -711.18 39.44 603.57 914.53 37.51 287.84 881.12 -39.66 281.2 825.85 117.53 473.56 695.75 109.91 608.35 946.89 211.83 296.77 934.36 121.11 292.45 734.07 298.71 600.45 840.85 298.43 471.52 924.07 388.13 299.72 943.23 302.53 299.92 668.13 480.12 574.15 789.21 466.76 457.41 852.53 538.4 295.04 891.95 466.82 297.2 675.83 601.93 433.35 748.93 661.44 295.52 808.93 603.82 295.93 -257.02 671 426.88 42.86 673.11 503.37 -439.73 655.46 359.76 -282.77 697.08 309.37 -125.74 739.89 215.47 -903.14 742.81 343.4 -752.04 761.64 355.45 -810 685.87 434.75 -1018.17 585.73 309.93 -942.96 596.57 427.44 -941.45 458.61 497.13 -834.17 571.53 517.53 -879.54 266.39 543.1 -1007.85 355 395.58 -1015.68 463.7 386.28 -891.28 28.74 362.98 -324.76 173.14 771.7 -860.94 103.75 489.23 -688.05 145.22 648.73 -1009.68 93.71 175.98 -359.1 292.53 766.7 -335.49 563.11 591.06 -438.3 613.99 497.17 -616.88 637.27 383.62 369.97 691.17 468.96 548 699.76 398.86 229.55 656.01 539.69 173.62 715.06 463.59 628.38 745.01 272.6 686.93 707.42 288.55 -697.49 632.53 462.5 -999.95 220.73 335.56 -1050.81 422.96 287.12 -782.99 393.21 615.14 465.11 767.23 341.68 555.57 824.19 237.44 171.83 739.56 427.4 79.44 766.38 363.23 315.27 816.55 366.75 -80.86 763.54 111.23 372.47 -221.25 421.67 513.68 -221.35 336.93 39.92 -221.14 499.98 223.3 -202.05 537.52 587.02 -220.89 225.18 60.29 -167.63 613.57 288.95 -117 629.2 97.97 132.12 780.43 -14.18 178.63 791.79 88.97 241.47 796.7 192.84 183.31 782.93 -25.9 292.45 797.86 71.05 366.76 789.88 205.23 316.43 781.86 -34.12 397.33 782.17 58.3 464.81 757.03 156.28 442.39 761.69 47.81 600.55 590.28 -670.83 542.25 578.76 -581.72 497.5 628.1 -331.65 391.51 754.4 -559.26 223.35 698.78 -408.9 64.31 716.18 -565.42 396.99 674.07 332.25 64.92 719.35 470.11 220.78 715.7 458.68 405.42 695.03 285.89 536.29 668.57 9.47 550.99 654.03 -415.48 158.39 750.91 -476.36 303.12 734.98 127.44 85.4 765.45 280.15 169.36 765.2 318.18 318.75 755.99 84.49 504.1 724.43 247.66 461.12 735.33 -432.67 421.27 720.23 -253.15 460.5 721.34 -232.03 418.91 754.22 -240.92 337.47 778.89 -237.52 228.98 788.21 -220.19 125.77 775.42 -234.12 81.42 760.46 -269.43 -115.13 656.11 -193.58 -203.2 562.96 -525.39 222.25 719.46 -533.37 386.21 698.52 -378.99 78.45 736.14 -407.87 485.25 686.15 26.58 22.33 745.49 401.07 229.65 738.34 279.61 85.09 743.77 388.63 403.77 719 233.57 521.03 696.88 -8.14 529.44 687.39 -668.75 -197.3 165.51 -835.19 -108.16 170.45 865.49 -108.11 110.78 709.71 -198.95 107.01 959.73 36.8 110.78 1001 212.16 110.78 988.08 388.45 115.07 920.93 536.7 115.07 826.31 664.24 113.17 -336.32 699.64 162.59 -729.37 878.33 192.82 -1050.78 215.35 173.52 -1074.03 432.99 165.52 -39 743.86 344.16 -40.54 765.35 256.08 -74.04 808.5 116.15 -17.64 822.63 259.89 -50.39 786.85 181.51 106.12 818.57 349.63 29.78 790.59 304.26 317.5 763.86 388.24 194.21 789.46 372.28 442.03 819.58 322.81 586.86 773.16 249.46 562.67 797.77 237.94 -409.78 -219.85 431 -542.28 -218.9 284.23 -543.58 -161.8 529.43 -709.47 -158.69 330.39 768.28 -164.63 260.98 -656 -35.94 591.54 497.05 616.98 528.4 -355.53 677.09 337.12 -825.04 775.12 351.24 -970.96 673.77 328.23 -892.98 518.84 515.2 -977.46 399.06 456.51 -840.27 -39.26 357.66 -766.01 118.34 598.23 -936.07 96.25 361.25 -528.83 637.68 379.92 201.84 681.76 501.58 -688.52 694.61 371.43 -1041.89 340.66 303.92 -761.9 605.93 504.37 -1041.57 500.96 294.44 184.1 765.43 391.88 6.25 766.46 314.92 192.97 -220.96 476.29 254.55 -166.05 586.67 91.81 183.21 790.01 81.4 304.52 797.06 60.52 420.7 776.76 277.92 606.96 583.29 536.6 489.16 630.35 620.22 303.56 662.47 556.52 116.67 672.37 331.27 -43.97 663.31 -585.68 137.7 688.55 -667.44 339.4 660.44 -507.31 136.98 708.79 -578.91 313.46 686.95 203.64 14.88 720.1 155.84 558.44 658.56 -289.54 514.82 644.82 -234.56 381.37 770.01 -242.78 284.94 787.22 -227.11 174.62 784.2 -333.46 -38.51 686.78 -227.61 -166.29 614.07 -166.37 -221.08 500.44 -545 308.36 708.91 -478.93 138.16 728.82 -490.3 446.75 690.06 -253.77 40.32 741.57 357.41 149.77 742.56 165.97 42.31 744.33 412.91 317.01 730.37 326.02 475.84 706.96 119.36 537.27 690.26 -278.01 497.06 685.94 -576.86 -219.01 157.25 -752.97 -158.52 169.3 795.56 -162.08 110.63 920.92 -40.4 110.78 983.57 120.66 110.78 1002.22 302.81 115.07 959.9 466.86 115.08 878.02 606.06 115.04 -416.19 693.3 170.08 -812.01 888.25 193.4 -968.61 782.24 182.83 -909.23 -45.39 175.4 -551.06 718.18 180.19 -657.68 833.08 191.37 -1074.42 339.48 167.62 -1059.72 528.84 166.59 612.6 -219.25 101.96 -67.65 764.27 187.68 -53.75 813.98 187.64 36.99 820.88 312.22 196.3 816.47 370.09 683.14 892.59 110.67 -138.53 577.97 591.58 -136.13 526.6 651.45 -139.37 509.09 686.98 -90.37 -221.33 508 -94.75 -203.13 570.98 -96.76 -168.41 623.62 -102.15 -121.69 663.8 -116.35 -66.91 690.16 -115.73 24.56 744.64 -115.26 70.51 763.4 -116.34 122.05 778.79 -121.96 175.27 790.03 -128.7 229.7 797.12 -133.5 284.73 796.59 -135.12 336.89 790.06 -134.24 383.33 778.96 -133.37 426.31 759.13 -136.68 473.3 723.37 -131.09 626.23 528.04 -108.01 667.71 483.15 -85.48 701.6 434.81 632.86 825.26 101.26 640.58 801.4 99.69 673.06 779.55 105.09 719 751.43 110.14 773.61 711.32 111.73 285.17 853.85 -339.2 90.29 849.83 -306.14 -40.2 851.85 -212.02 -124.93 862.69 -61.81 400.68 860.01 -316.03 -576.75 -201.38 -373.53 -375.56 -202.25 -492.97 -667.63 -198.11 -170.78 532.2 -115.74 -519.3 725.1 -108.39 -396.44 591.87 -201.53 -336.68 -463.51 -108.26 -578.59 -713.24 -104.88 -430.87 -830.32 -111.68 -191.26 680.29 -202.16 -205.89 642.79 27.68 -556.57 799.43 35.43 -425.94 -604.98 46.73 -612.83 -822.97 33.31 -455.21 833.87 207 -432.56 714.39 204.77 -557.29 826.12 386.94 -428.32 705 388.64 -543.54 750.61 539.83 -415.98 595.43 544.33 -524.6 435.65 650.86 -465.87 622.77 658.59 -389.32 52.39 630.96 -502.24 -321.99 640.3 -420.33 50.47 706.63 -407.87 -184.75 701.4 -326.41 -491.53 676.68 -194.93 -326.26 699.75 -167.16 -98.61 737.96 -254.78 -910.03 820.5 -226.61 -746.66 835.43 -229.85 -887.29 652.58 -395.97 -757.25 694.16 -382.92 -1040.71 622.87 -178.45 -992.91 530.67 -373.35 -743.42 459.11 -569.38 -1036.53 413.58 -326.94 -956.55 20.28 -201.8 -820.91 307.4 -567.8 -952.55 233.49 -408.83 -1052.03 212.92 -191.05 53.01 588.54 -550.35 -604.03 579.65 -488.21 -622.38 723.16 -219.68 499.62 738.82 -345.21 304.58 730.51 -390.81 66.36 737.86 -359.05 -147.39 738.83 -96.31 -1074.6 428.97 -169.19 42.14 -202.63 -522.55 71.03 -120.89 -614.12 -333.71 228.43 -722.58 -16.27 236.05 -752.76 -283 138.36 -725.31 -349 343.86 -711.81 -29.67 345.14 -738.49 169.81 143.71 -745.56 -3.59 125.91 -741.86 201.45 245.99 -751.7 186.22 378.79 -731.74 -35.73 439.51 -701.44 130.57 460.56 -700.43 -308.23 416.28 -697.26 -457.22 360.35 -684.44 -431.62 224.71 -701.79 -320.57 116.38 -713.42 -358.47 444.67 -673.67 8.56 71.62 -727.29 217.18 118.58 -731.32 299.98 243.97 -731.74 284.49 393.71 -711.1 174.17 487.14 -681.8 -26.51 484.31 -674.17 -72.1 785.15 -58.22 -23.13 789.22 -199.55 99.35 790.72 -299.56 311.69 790.83 -325.68 438.86 791.86 -290.15 528.94 866.74 -247.79 180.63 851.82 -332.87 17.6 849.91 -264.81 -86.33 855.27 -147.39 -113.41 838.6 34.39 610.61 854.79 -70.96 -485.5 -201.94 -446.25 -319.75 -221.39 -434.24 -496 -222.26 -336 -635.67 -199.29 -275.19 -574.87 -219.18 -158.15 665.53 -163.27 -369.79 422.52 -200.95 -433.58 476.33 -164.48 -479.08 -420.48 -162.57 -541.06 -649.34 -161.16 -405.79 -604.84 -105.69 -525.43 -752.32 -161.36 -181.05 -786.56 -108.11 -310.35 827.89 -108.73 -232.35 767.62 -40.43 -414.45 582.44 -49.89 -545.49 -519.77 -36.64 -605.13 -771.36 -37.03 -448.22 -715.21 39.6 -559.68 910.43 37.51 -247.82 877.02 -39.66 -241.19 821.49 117.59 -433.14 685.99 113.33 -558.2 942.79 211.83 -256.76 930.26 121.11 -252.43 722.29 298.65 -550.84 838.71 298.81 -431.95 931.06 390.32 -263.45 944.37 303.34 -261.04 662.78 472.56 -536.23 797.43 468.16 -425.08 861.74 541.03 -260.99 903.08 470.13 -263.41 692.35 602.09 -403.56 744.63 661.65 -258.3 806.82 604.14 -258.62 -249.69 670.63 -377.99 50.37 670.54 -453.78 -436.06 655.29 -317.56 -408.87 684.75 -184.72 -269.41 700.63 -256.21 -130.71 739.76 -176.38 -910.39 740.54 -313.94 -826.53 848.88 -231.86 -756.66 757.95 -319.58 -813.79 685.49 -394.61 -1024.63 583.32 -278.17 -989.53 748.43 -211.81 -950.05 597.55 -388.92 -945.51 458.3 -457.22 -838.43 571.5 -477.56 -888 264.15 -499.15 -1018.45 352.87 -360.55 -1019.51 462.9 -349.21 -898.44 -48.49 -198.3 -901.07 24.32 -327.42 -308.31 175.41 -725.02 -873.07 106.19 -448.47 -693.38 147.41 -605.91 -1008.65 95.15 -200.59 -348.92 287.5 -717.77 -562.77 686.61 -206.28 -448.21 605.38 -460.12 -619.26 640.58 -344.82 371.72 691.06 -429.03 554.85 702.27 -372.18 243.44 638.3 -496.03 182.92 713.56 -411.83 624.25 745.98 -242.06 684.25 708.22 -255.86 -702.03 632.68 -422.28 -678.17 785.31 -227.63 -1008.71 217.74 -304.51 -1074.89 335.12 -176.86 -1056.64 420.55 -261.85 -787.33 390.41 -577.58 -1062 521.91 -170.44 464.51 766.65 -315.17 530.02 821.47 -206.76 183.37 737.26 -378.81 84.51 766.03 -320.21 301.87 818.8 -320.39 -87.38 763.37 -70.44 366.06 -220.63 -382.22 508.97 -220.94 -297.4 34.14 -222.17 -462.47 216.97 -202.05 -497.41 585.09 -221.07 -185.16 53.7 -167.97 -574.42 285.12 -116.11 -587.19 97.05 133.07 -745.73 -10.72 180.49 -750.25 90.8 241.61 -756.03 187.68 185.36 -750.59 -22.54 291.78 -748.64 74.4 359 -740.36 202.98 314.17 -746.52 -35.49 394.1 -722.95 58.2 452.65 -702.09 156.75 429.23 -713.96 438.1 540.42 -568.74 286.75 588.6 -543.89 -685.84 517.88 -545.43 591.89 392.7 -600.16 534 475.45 -586.33 598.18 209.7 -620.51 612.57 302.13 -610.92 470.14 37.99 -623.54 551.78 120.37 -624.86 78.9 -67.53 -645.61 325.01 -42.49 -622.46 -492.58 53.27 -642.05 -664.27 246.44 -627.02 -594.04 143.61 -638.82 -647.04 406.47 -611.46 -671.01 329.81 -622.38 -495.18 532.83 -566.66 -332.97 388.71 -705.34 -556.43 220.18 -657.87 -396.2 76.84 -676.07 -575.93 384.98 -632.33 38.11 -10.3 -683.85 323.75 70.38 -679.41 450.79 226.98 -677.2 439.86 400.88 -658.16 282.66 525.17 -627.65 8.2 542.98 -607.61 -384.86 163.81 -708.19 -457.68 293.42 -693.5 125.51 85.72 -729.99 271.55 173.76 -733.13 304.69 320.5 -724.53 82.4 495.39 -676.14 239.27 452.09 -694.88 -426.86 413.69 -677.16 -254.84 457.92 -673.43 -233.52 420.04 -698.68 -238.22 336.47 -725.29 -227.64 230.14 -736.51 -210.67 129.92 -731.48 -226.75 87.54 -718.81 -340.44 -33.37 -638.46 -279.46 -111.28 -610.96 -201.16 -202.6 -521.93 -510.84 219.56 -678.78 -542.84 378.29 -655.66 -360.7 93.52 -694.86 -411.11 479.92 -642.24 23.01 18.56 -707.33 379.67 236.62 -704.99 271.86 90.54 -706.86 367.66 401.13 -685.35 227.6 511.57 -655.48 -10.43 523.98 -641.82 -680.35 -197.28 -69 -850.2 -110.6 -78.99 866.91 -109.72 -72.09 711 -200.72 -65.52 958.15 36.7 -73.83 997.51 212.14 -84.4 986.43 390.29 -96.29 916.86 539.36 -103.15 809.42 663.92 -100.24 -497.93 711.41 -81.21 -350.92 700.8 -71.58 -904.65 873.04 -133.28 -739.75 884.97 -130.8 -1041.18 652.55 -79.33 -980.53 22.08 -81.44 -597.05 786.04 -97.87 -1064.69 216.82 -76.07 -1086.23 435.32 -69.64 -149.88 737.93 -12.78 -28.75 737.26 -317.26 -44.24 765.74 -213.62 -82.61 812.75 -53.55 -71.49 781.87 20.94 -23.42 816.42 -198 -56.55 787.77 -133.01 101.37 817 -295.52 27.9 789.97 -255.89 315.28 764.18 -350.56 195.67 791.12 -324.42 420.49 820.46 -287.41 577.42 772.2 -219.56 546.71 795.1 -204.05 -415.86 -221.71 -395.03 -548.47 -220.6 -252.14 -548.3 -162.25 -490.49 -716.05 -161.54 -294.85 763.52 -164.47 -220.95 -658.57 -35.84 -547.83 506.29 600.76 -500.04 -353.65 677.14 -293.13 -830.12 771.52 -319.83 -981.6 670.37 -296.63 -899.83 520.96 -475.36 -984.03 396.89 -418.44 -847.79 -43.64 -321.06 -775.56 121.76 -553.53 -948.85 98.22 -325.6 -525.5 640.38 -337.93 208.68 678.68 -453.32 -691.89 696.77 -331.25 -1049.17 336.23 -277.19 -765.99 605.3 -464.23 -1045.31 499.16 -266.18 191.41 765.11 -345.32 6.6 766.03 -273.95 186.52 -222.14 -441.38 248.47 -165.95 -546.14 91.61 184.16 -754.77 85.4 301.49 -752.42 61.76 409.54 -722.84 -592.54 480.25 -592.52 -345.18 558.65 -548.22 -492.62 143.44 -668.67 -582.4 302.43 -646.05 199.21 14.82 -679.63 156.45 547.71 -615.17 -294.19 513.15 -603.84 -234.86 381.67 -714.59 -236 284.67 -732.7 -216.27 177.61 -735.97 -237.81 -164.51 -570.76 -169.7 -221.81 -462.63 -541.84 298.68 -667.67 -449.8 149.53 -688 -500.65 441.96 -646.28 -248.96 49.83 -700.5 342.27 157.86 -707.4 163.12 41.11 -706.72 390.57 320.35 -698.04 312.94 469.04 -669.6 118.46 531.11 -645.61 -281.07 494.97 -641.31 -586.01 -219.06 -63.44 -768.01 -160.59 -74.97 797.46 -164.31 -70.67 920.94 -41.05 -72.4 980.71 120.83 -78.12 1000.07 303.71 -91.06 958.36 469.45 -100.05 868.07 607.2 -109.53 -430.47 695.74 -80.26 -823.28 897.9 -135.47 -978.23 798.41 -120.71 -919.05 -47.64 -80.21 -1025.17 105.72 -79.49 -550.11 737.48 -83.23 -660.53 848.28 -124.87 -1087.97 340.2 -72.13 -1069.7 536.47 -70.32 -80.12 763.76 11.41 612.82 -220.07 -58.25 -75.78 764.28 -146.46 -83.57 805.38 27.16 -61.17 815.83 -131.38 30.09 816.4 -253.37 193.21 818.53 -319.45 -313.72 1299.83 188.27 -309.59 1298.62 201.92 -305.26 1294.23 215.3 -301.06 1286.86 227.4 -297.16 1276.85 237.63 -293.75 1264.68 245.53 -290.98 1250.93 250.71 -289.01 1236.24 252.95 -287.87 1221.31 252.12 -287.64 1206.85 248.28 -288.35 1193.52 241.56 -290.17 1181.68 231.51 -301.83 1166.74 188.73 -306.95 1369.46 184.64 -298.72 1367.08 212.03 -290.19 1358.37 238.69 -281.92 1343.74 262.81 -274.29 1323.84 283.26 -267.62 1299.6 299 -262.27 1272.2 309.37 -258.27 1242.94 313.53 -256.13 1213.26 311.82 -255.78 1184.54 304.11 -257.26 1158.1 290.62 -261.06 1134.65 270.56 -268.85 1114.4 239.36 -283.42 1101.54 186.35 -291.49 1437.63 178.53 -279.26 1434.11 219.24 -266.61 1421.21 258.75 -254.36 1399.52 294.49 -243.07 1370.05 324.8 -233.28 1334.18 348.26 -225.43 1293.58 363.76 -219.9 1250.16 370.59 -216.86 1205.99 368.18 -216.52 1163.19 356.86 -218.75 1124.02 336.67 -224.25 1089.83 305.67 -257.35 1038.2 181.97 -267.87 1503.46 170.09 -251.81 1498.85 223.52 -235.24 1481.95 275.3 -219.19 1453.52 322.15 -204.39 1414.9 361.87 -191.55 1367.89 392.61 -181.27 1314.69 412.93 -174.02 1257.78 421.89 -170.14 1199.83 419.05 -169.78 1143.65 404.3 -172.81 1092.53 377.27 -180.4 1047.79 336.58 -223.43 979.37 175.63 -236.44 1566 159.45 -216.79 1560.36 224.83 -196.54 1539.7 288.12 -176.91 1504.95 345.39 -158.82 1457.74 393.94 -143.13 1400.28 431.52 -130.56 1335.24 456.36 -121.7 1265.68 467.3 -116.96 1194.85 463.84 -116.57 1126.06 446.12 -120.49 1063.35 413.46 -130.18 1010.3 360.99 -182.88 927.19 166.74 -197.65 1624.32 146.76 -174.7 1617.75 223.13 -151.06 1593.63 297.02 -128.15 1553.06 363.86 -107.03 1497.95 420.54 -88.71 1430.87 464.41 -74.04 1354.96 493.4 -63.69 1273.76 506.18 -58.17 1191.07 502.13 -57.71 1110.77 481.45 -62.45 1037.55 443.29 -74.13 976.58 380.29 -139.53 878.35 151.01 -152.07 1677.58 132.21 -126.16 1670.16 218.46 -99.47 1642.94 301.86 -73.61 1597.15 377.31 -49.78 1534.94 441.29 -29.1 1459.23 490.8 -12.53 1373.54 523.53 -0.86 1281.88 537.95 5.38 1188.55 533.38 5.9 1097.9 510.04 0.59 1014.53 468.33 -12.27 945.01 397.16 -100.37 1725.01 116 -71.87 1716.85 210.87 -42.52 1686.92 302.57 -14.09 1636.58 385.53 12.11 1568.18 455.87 34.85 1484.93 510.31 53.07 1390.71 546.3 65.9 1289.94 562.15 72.76 1187.32 557.13 73.32 1087.66 531.47 67.48 996.05 485.74 54.86 921.46 418.99 -43.3 1765.91 98.39 -12.62 1757.13 200.49 18.95 1724.93 299.15 49.54 1670.76 388.4 77.73 1597.17 464.09 102.2 1507.6 522.66 121.79 1406.23 561.38 135.61 1297.81 578.43 142.99 1187.4 573.03 143.59 1080.17 545.42 137.17 982.06 495.84 123.67 903.53 429.85 18.31 1799.68 79.61 50.72 1790.41 187.46 84.05 1756.41 291.64 116.36 1699.21 385.89 146.13 1621.5 465.81 171.96 1526.92 527.66 192.65 1419.88 568.54 207.24 1305.39 586.56 215.03 1188.8 580.85 215.67 1075.56 551.69 209.06 971.26 500.13 196.2 889.19 432.53 83.56 1825.84 59.95 117.22 1816.21 171.96 151.84 1780.9 280.15 185.39 1721.5 378.02 216.3 1640.81 461.02 243.12 1542.59 525.24 264.61 1431.44 567.7 279.75 1312.55 586.4 288.39 1191.27 580.66 289.76 1073.55 550.63 282.3 965.18 497.23 273.92 876.22 424.91 220.87 1839.06 144.4 256.39 1802.82 255.41 290.82 1741.88 355.85 322.54 1659.07 441.01 350.07 1558.28 506.92 372.12 1444.22 550.49 387.39 1322.2 568.73 396.83 1197.33 561.6 400.75 1076.88 534.35 390 965.76 477.06 375.32 869.06 402.75 186.32 1848.94 29.41 291.45 1855.36 -1.43 325.89 1845.53 113.17 361.28 1809.42 223.78 395.58 1748.7 323.85 457.29 1669.16 396.91 476.16 1579.44 455.95 500.62 1480.04 489.03 491.91 1331.26 532 510.82 1212.27 533.04 516.06 1088.5 508.48 499.49 976.66 446.43 479.73 879.65 370.26 361.43 1848.42 -21.69 395.11 1838.8 90.41 429.73 1803.48 198.6 487.45 1736.71 305.69 560.21 1388.99 481.97 617.56 1264.84 480.52 621.77 1112.35 464.93 604.85 997.28 406.84 577.06 904.76 322.69 430.04 1833.14 -41.37 462.48 1823.88 66.61 522.77 1776.52 205.36 496.29 1809.76 -60.16 527.02 1800.99 42.12 575.41 1769.63 155.18 703.34 1256.45 413.53 704.78 1128.25 404.58 691.17 1022.49 353.06 662.4 939.8 269.48 559.21 1778.62 -77.79 587.77 1770.46 17.29 627.63 1746.14 109 750.46 1256.56 354.85 756.62 1144.3 340.95 751.49 1045.44 302.39 720.06 967.49 226.54 617.88 1740.16 -94.02 643.87 1732.75 -7.52 681.6 1707.16 72.53 782.84 1260.27 294.99 797.81 1158.05 282.2 792.87 1074.02 245.08 767.29 1002.35 181.72 671.44 1694.95 -108.6 694.47 1688.39 -31.94 730 1659.22 43.57 827.29 1175.46 208.57 822.11 1115.62 168.65 806.08 1028.87 -8.94 734.53 1617.23 -125.19 754.96 1608.36 -48.55 772.58 1594.67 7.32 802.09 1535.28 18.91 826.44 1470.46 27.25 840.26 1395.46 84.03 838.47 1316.96 164.03 786.8 1534.35 -138.51 812.22 1515.19 -59.57 -310.64 1230.41 189.53 697.42 1427.46 337.91 635.67 1596.5 333.92 746.62 1394.01 298.8 795.22 1516.62 149.83 698.92 1645.13 199.2 690.07 1440.14 306.68 724.67 1415.03 273.86 635.94 1555.94 298.31 654.28 1492.42 320.08 750.64 1414.88 235.51 650.69 1594.48 249.3 769.31 1447.05 201.02 688.16 1593.74 206.19 767.96 1502.16 178.25 734.82 1558.66 179.47 700.39 1443.71 310.94 734.82 1417.73 280.15 646.65 1564.34 305.73 761.26 1417.05 239.46 780.64 1449.59 201.27 697.09 1602.76 208.58 779.14 1508.77 175.82 744.24 1567.56 178.97 791.03 1372.84 242.83 820.95 1437.42 161.61 798.89 1528.03 123.53 615.94 1507.36 401.24 683.8 1412.8 378.03 751.75 1616.76 130.66 688.26 1688.19 181.24 632.29 1695.97 270.61 598.21 1630.89 363.8 752.07 1372.96 321.64 675.9 1515.04 299.77 653.65 1559.93 286.7 707.43 1472.99 292.6 732.24 1442.91 269.7 750.37 1436.83 244.66 763.71 1464.75 226.18 756.75 1509.88 216.79 728.27 1554.8 218.36 690.63 1585.57 229.4 660.29 1588.67 254.8 665.17 1496.32 325.81 664.18 1603.96 255.51 725.19 1425.47 272.22 708.61 1424.87 291.88 693.02 1450.93 302.38 659.63 1499.38 313.96 641.35 1525.12 314.75 640.97 1556.55 294.27 671.09 1463.11 316.53 749.36 1424.43 238.99 738.48 1411.31 254.74 639.11 1580.25 275.71 653.52 1592.28 251.07 766.89 1455.27 210.39 761.05 1426.72 217.19 667.54 1599.16 225.24 689.58 1590.91 214.07 763.83 1505.89 192.06 772.82 1473.05 187.35 711.25 1579.73 190.7 733.17 1557.59 193.35 754.28 1531.36 175.38 686.07 1577.15 249.84 666.44 1585.29 257.98 717.03 1547.26 248.52 744.91 1507.62 246.06 751.7 1446.44 249.15 743.75 1459.71 261.75 727.45 1494.87 273.24 698.58 1533.54 277.49 671.56 1566.96 272.3 780.24 1393.22 240.72 815.48 1482.43 135.51 808.23 1442.96 181.79 642.51 1453.86 392.43 651.43 1499.42 357.1 720.56 1658.29 151.68 750.76 1591.34 155.79 610.85 1672.46 321.19 660.08 1649.8 267.55 599.85 1571.81 392.04 722.36 1387.52 354.24 772.84 1367.29 284.22 777.46 1572.37 120.98 659.42 1702.14 222.01 810.49 1397.53 200.17 826.75 1419.13 129.6 805.25 1334.34 241.21 799 1535.95 81.93 657.63 1376.76 413.01 562.44 1496.57 450.12 654.45 1727.02 147.42 744.46 1642.02 91.99 523.37 1657.78 387.51 577.56 1736.94 261.25 743.87 1337.98 336 662.37 1538.07 295.9 691.72 1492.95 298.72 721.04 1456.01 282.21 741.12 1435.39 257.31 758.72 1447.47 233.71 763.26 1486.51 220.49 744.73 1533.12 215.93 709.49 1572.73 223.05 673.9 1591.43 238.91 652.53 1577.19 272.64 681.94 1466.39 320.93 652.36 1589.43 282.97 651.82 1531.09 320.91 718.48 1427.94 297.62 748.85 1413.87 260.2 772.14 1428.69 219.4 783.81 1477.47 185.87 765.06 1539.79 173.08 719.31 1588.88 191.56 678.96 1607.74 229.63 710.53 1435.85 288.62 646.82 1528.7 308.37 675.59 1472.5 311.5 737.95 1421.35 255.56 643.03 1578.7 274.51 759.48 1436.22 223.75 669.87 1596.43 229.86 769.03 1479.39 199.46 711.65 1577.57 201.92 751.33 1532.59 189.62 676.11 1586.09 248.37 700.72 1563.97 249.58 732.21 1527.93 246.94 753.08 1487.2 245.47 745.77 1447.28 257.49 737.64 1476.24 268.01 713.66 1514.16 276.37 683.8 1551.59 275.98 662.87 1577.13 269.24 797.13 1412.01 210.23 806.33 1479.25 161.04 672.64 1458.3 349.72 722.46 1622.64 174.16 645.37 1630.94 304.66 636.3 1548.31 351.75 724.47 1406.71 322.41 764.05 1388.93 270.15 775.91 1555.05 147.07 678.38 1654.77 230.5 822.02 1364.36 185.45 819.24 1479.43 94.13 605.17 1432.45 444.67 701.85 1689.67 112.78 544.44 1707.52 326.46 532.34 1589.06 433.08 705.81 1350.09 374.81 776.4 1332.97 294.15 774.16 1590.29 80.48 614.53 1743.3 200.09 756.45 1468.43 244.75 757.12 1454.96 242.99 809.32 1479.61 -143.8 818.21 1073.08 -134.74 841.43 1223.97 -146.82 857.14 1080.57 -148.4 919.95 1091.14 -166.99 1075.37 1120.12 -213.47 1033.74 1075.7 -199.7 912.34 1185.37 -167.05 970.28 1087.84 -181.45 977.27 1174.12 -184.96 994.58 1080.08 -188.37 845.68 1476.54 -154.34 907.78 1455.26 -171.97 961.62 1439.35 -187.31 988.21 1454.49 -195.43 1016.07 1487.33 -204.33 1063.34 1524.42 -219 1106.75 1524.61 -231.67 1124.06 1450.71 -234.99 1130.84 1505.4 -238.26 1084.93 1404.42 -222.49 1034.6 1354.47 -206.63 998.13 1329.21 -195.39 941.4 1303.62 -178.23 852.54 1205.85 -150.06 854.97 1251.02 -150.56 886.02 1085.65 -156.95 1063.01 1087.88 -208.53 879.07 1194.13 -157.61 946.96 1086.67 -174.77 946.43 1177.47 -175.92 1024.29 1170.23 -199.48 825.38 1484.36 -150.77 876.22 1466.89 -163.03 936.29 1445.21 -180.05 977.44 1444.1 -192.04 999.94 1467.62 -199.16 1132.16 1478.18 -238 1107.87 1426.99 -229.71 1058.36 1378.37 -214.12 1016.47 1339.11 -200.97 972.66 1318.55 -187.7 892.4 1282.94 -163.45 1069.05 1143.57 -212.22 820.68 1103.47 42.88 857.4 1375.35 33.97 827.5 1460.89 -85.68 854.18 1273.22 154.76 866.77 1228.96 -56 853.86 1215.83 -60.22 897.12 1358.22 11 873.74 1125.77 116.79 865.63 1102.58 11.04 945.62 1365.1 -8.63 877.02 1182 168.21 876.4 1265.08 153.1 954.05 1261.45 115.39 931.58 1111.06 -25.02 969.1 1231.1 104.43 962.22 1198.62 94.97 1089.39 1141.49 -128.51 1061.77 1135.99 -52.38 1129.55 1389.13 -31.12 1138.92 1488.76 -164.67 953.36 1256.64 -53.84 933.14 1199.86 -59.07 992.77 1324.18 46.71 986.9 1386.54 -29.76 999.28 1232.72 23.58 1013.82 1281.39 -57.37 1001.5 1247.29 75.52 1018.89 1421.15 -52.42 1039.83 1456.75 -78.71 1058.02 1280.4 -6.94 1114.01 1356.61 -58.7 1056.08 1311.2 -67.51 1094.1 1354.54 -89.06 1067.63 1296.52 31.52 986.96 1112.01 -58.86 1002.9 1191.45 33.81 1010.53 1102.65 -78.05 1066.61 1331.06 36.92 827.96 1085.3 -67.98 855.5 1213.31 -50.81 867.46 1208.87 -62.71 849.99 1224.91 -108.28 876.08 1363.4 19.7 866.11 1091.54 -77.21 844.84 1421.3 -21.1 890.33 1409.6 -36.39 921.13 1361.89 1.99 873.56 1226.77 172.25 916.53 1267.18 137.04 915.68 1185.5 150.8 899.51 1106.82 -7.1 923.37 1102.04 -112.61 939.8 1405.43 -51.09 968.77 1210.38 106.59 962.27 1181.75 118.39 1080.42 1109.53 -119.39 1085.35 1125.95 -171.75 1109.06 1419.38 -29.41 1140.02 1451.64 -83.82 948.36 1231.38 -17.56 908.08 1244.23 -54.79 898.51 1205.3 -60.93 943.69 1208.72 -1.33 920.03 1188.04 -129.74 969.5 1370.36 -20.38 969.5 1220.45 29.36 1006.34 1253.05 -18.67 986.13 1268.75 -55.29 998.88 1232.84 56.32 960.01 1209.25 67.85 976.25 1239.52 87.98 955.25 1289.97 -85.26 1017.8 1321.73 -90.74 1031.04 1440.74 -66.45 1087.55 1313.81 -26.01 1102.85 1354.3 -75.79 1077.79 1333.8 -77.92 1055.85 1292.66 -35.42 1063.15 1282 16.43 1103.1 1334.58 9.69 1124.83 1368.34 -42.44 1010.9 1445.72 -84.36 1037.39 1476.12 -103.2 1054.25 1349.51 -99.31 1095.94 1381.24 -116.5 1124.65 1401.83 -108.17 961.31 1114.11 -41.65 998.27 1172.98 42.91 975.26 1193.89 61.23 965.31 1196.52 -68.35 999.36 1196.62 -27.5 977.78 1100.39 -126.11 984.77 1179.1 -144.94 1038.59 1180.72 -4.98 1031.85 1158.65 0.91 1024.68 1189.7 -42.8 1072.46 1157.88 -65.34 1046.7 1099.07 -101.27 982.39 1416.41 -67.63 1036.05 1294.85 -60.92 1035.66 1264.31 56.77 1002.71 1280.16 78.69 1004.2 1403.05 -40.28 1027.46 1247.11 11.45 1072.81 1443.31 -50.39 1040.74 1373.92 9.54 943.34 1301.07 82.31 880.85 1292.06 110.83 941.5 1139.61 67.13 999.2 1137.19 22.09 867.7 1453.52 -96.66 923.48 1435.52 -112.03 974.99 1430.71 -126.32 1001.99 1451.44 -136.16 1029.98 1482.53 -150.14 1074.34 1512.94 -157.25 1115.98 1510.47 -160.52 1129.45 1434.47 -170.02 1095.02 1397.44 -165.38 1047.13 1356.38 -149.48 1008.67 1328.54 -139.34 955.18 1302.91 -124.58 1082.24 1160.97 -130.04 960.57 1203.75 63.79 1006.5 1197.41 10.44 870.06 1216.08 -47.98 860 1206.78 -115.69 868.5 1254.74 -99.65 863.18 1416.85 -28.92 915.03 1230.71 161.9 908.74 1127.55 93.52 894.99 1095.55 -91 915.41 1407.42 -43.21 951.3 1223.35 134.07 1074.44 1090.58 -167.31 1115.37 1475.47 -82.22 910.99 1213.72 -33.37 886.94 1195.74 -123.03 977.52 1243.05 -14.66 967.49 1222.31 66.78 990.19 1305.81 -88.97 1081.04 1320.75 -50.71 1096.73 1316.9 -4.27 1023.68 1461.69 -94.89 1075.47 1367.63 -108.18 1111.82 1389.97 -115.43 971.57 1141.88 43.15 971.6 1180.16 72.44 970.89 1202.79 -12.89 951.86 1102.42 -117.94 952.31 1182.85 -136.32 1002.01 1092.9 -136.03 1033.17 1174.06 -159.67 1032.61 1182.53 -80.55 1042.86 1082.48 -154.72 963.83 1405.47 -61.26 1036.75 1334.23 -93.8 1037.24 1298.98 57.78 1031.36 1269.98 -25.21 1077.47 1485.47 -94.21 1059.31 1406.74 -16.07 964.73 1307.84 63.5 916.34 1299.85 98.06 845.82 1225.84 177.42 1023.8 1128.42 -14.86 843.22 1461.51 -90.16 892.75 1445.26 -103.47 949.53 1429.4 -119.83 991.14 1439.19 -131.04 1014.49 1466.09 -142.66 1138.78 1460.87 -166.74 1115.63 1414.1 -170.89 1069.82 1376.67 -156.65 1028.19 1340.78 -144.1 984.45 1316.5 -133.27 905.58 1282.93 -113.06 1078.73 1148.75 -170.8 979.75 1201.88 37.4 972.27 1270.74 95.08 1037.56 1187.48 -22.9 1030.81 1248.51 40.63 1089.17 1371.36 10.9 1069.12 1170.57 -74.71 1135.38 1422.98 -96.65 1041.27 1115.36 -53.92 862.81 1287.36 120.46 901.92 1268.42 -82.33 999.11 1430.63 -74.27 1019.05 1346.3 30.22 953.98 1205.56 25.28 996.41 1190.61 -74.03 1036.91 1180.13 -122.56 991.67 1183.22 -111.98 958.71 1189.73 -104.64 926.07 1192.39 -97.21 892.25 1198.46 -91.8 863.87 1206.95 -86.79 851 1221.31 -80.63 864.39 1245.22 -75.49 784.8 1556.83 -54.41 759.51 1575.08 -131.49 824.97 1261.52 218.36 809.18 1059.81 80.36 779.58 1002.37 -124.03 840.8 1185.3 165.54 828.92 1138.91 119.19 827.04 1482 -72.97 804.85 1501.48 -143 805.75 1048.9 -132.66 843 1439.04 -0.03 857.2 1381.35 52.25 855.34 1290.95 154.91 844.78 1243.65 190.34 840.98 1183.18 178.94 833.58 1132.12 137.47 824.95 1086.03 58.08 954.91 1171.81 100.56 916.02 1147.95 115.16 923.96 1158.52 127.06 -294.01 1171.33 215.57 824.47 1065.16 -26.76 -235.85 1059.87 260.26 -195.73 1007.99 277.76 -147.89 964.47 291.26 -94.18 923.36 299.15 737.5 928.31 73.2 -317.6 1297.99 174.62 -321.12 1292.99 161.23 -323.97 1285.04 149.1 -326.26 1274.58 138.82 -327.5 1262.02 130.87 -327.77 1248 125.63 -327.09 1233.18 123.35 -325.5 1218.27 124.12 -323.04 1203.97 127.89 -319.86 1190.93 134.53 -315.9 1179.53 144.42 -314.71 1365.8 157.26 -321.74 1355.84 130.6 -327.56 1340.07 106.47 -331.89 1319.22 86.01 -334.52 1294.27 70.17 -335.34 1266.38 59.69 -334.22 1236.87 55.11 -331.19 1207.15 56.65 -326.39 1178.67 64.23 -320.14 1152.75 77.45 -312.49 1130.15 96.85 -301.9 1109.69 129.88 -303.02 1432.2 137.83 -313.45 1417.45 98.32 -322.06 1394.08 62.57 -328.47 1363.19 32.25 -332.37 1326.22 8.78 -333.58 1284.9 -6.75 -332.05 1241.16 -13.6 -327.83 1197.04 -11.46 -321.07 1154.66 -0.36 -311.81 1116.22 19.35 -300.66 1082.85 47.62 -283.01 1496.35 116.67 -296.67 1477.02 64.89 -307.96 1446.39 18.03 -316.36 1405.91 -21.7 -321.48 1357.46 -52.46 -323.06 1303.3 -72.8 -321.05 1245.98 -81.78 -315.53 1188.16 -78.98 -306.76 1132.56 -64.52 -294.62 1082.25 -38.5 -280.13 1038.63 -1.63 -254.96 1557.3 94.08 -271.66 1533.67 30.78 -285.46 1496.24 -26.49 -295.73 1446.75 -75.06 -301.98 1387.52 -112.66 -303.92 1321.32 -137.52 -301.46 1251.25 -148.5 -294.71 1180.58 -145.07 -283.72 1112.82 -127.03 -268.35 1052.05 -94.19 -249.08 999.99 -45.65 -219.29 1614.17 70.4 -238.78 1586.58 -3.49 -254.9 1542.89 -70.34 -266.88 1485.12 -127.04 -274.18 1415.98 -170.93 -276.44 1338.71 -199.96 -273.57 1256.91 -212.77 -265.69 1174.41 -208.77 -252.78 1095.41 -187.5 -235.16 1024.3 -149.49 -212.87 963.2 -94.45 -176.51 1666.12 45.97 -198.51 1634.99 -37.43 -216.7 1585.66 -112.89 -230.23 1520.46 -176.89 -238.47 1442.42 -226.43 -241.02 1355.19 -259.2 -237.78 1262.86 -273.66 -228.88 1169.74 -269.14 -214.58 1080.36 -245.52 -195.17 999.5 -203.44 -168.77 930.36 -143.65 -127.25 1712.41 21.15 -151.44 1678.17 -70.55 -171.44 1623.94 -153.52 -186.32 1552.25 -223.89 -195.37 1466.44 -278.36 -198.18 1370.54 -314.39 -194.61 1269.02 -330.29 -184.84 1166.64 -325.32 -169.31 1068.18 -299.71 -148.33 979.02 -254.07 -121.2 907.96 -195.41 -72.23 1752.35 -3.7 -98.26 1715.52 -102.36 -119.78 1657.17 -191.63 -135.78 1580.03 -267.34 -145.52 1487.71 -325.95 -148.54 1384.53 -364.71 -144.71 1275.31 -381.82 -134.19 1165.15 -376.47 -117.48 1059.21 -348.92 -94.58 964.78 -299.65 -66.93 896.75 -245.35 -12.24 1785.36 -28.22 -39.73 1746.47 -132.4 -62.45 1684.85 -226.67 -79.36 1603.4 -306.62 -89.64 1505.91 -368.5 -92.83 1396.96 -409.44 -88.78 1281.62 -427.5 -77.67 1165.3 -421.85 -60.03 1053.43 -392.76 -35.08 956.05 -340.99 -5.6 892.5 -292.67 51.82 1810.96 -52.05 23.28 1770.58 -160.24 -0.32 1706.6 -258.13 -17.87 1622.01 -341.14 -28.55 1520.78 -405.41 -31.86 1407.64 -447.91 -27.65 1287.87 -466.67 -16.12 1167.08 -460.81 2.2 1050.91 -430.6 32.41 951.45 -378.63 67.27 891.04 -333.11 153.74 1833.67 -85.56 124.45 1792.23 -196.57 100.23 1726.57 -297.03 82.23 1639.78 -382.22 71.26 1535.9 -448.16 67.86 1419.79 -491.78 72.18 1296.89 -511.03 84.02 1172.94 -505.01 102.82 1053.73 -474.01 128.87 952.25 -417.96 158.67 894.31 -366 258.98 1840.16 -116.01 229.8 1798.87 -226.62 205.68 1733.45 -326.71 219.42 1650.07 -417.97 204.71 1557.64 -473.96 208.72 1456.58 -510.93 177.73 1305.34 -539.93 189.52 1181.84 -533.93 208.25 1063.07 -503.04 233.62 962.58 -445.67 261.04 900.58 -384.07 329.67 1833.54 -133.79 301.12 1793.16 -241.97 293.04 1721.1 -360.3 263.66 1367.48 -538.35 399.45 1818.82 -149.33 376.26 1764.75 -296.52 302.87 1236.44 -558.94 318.55 1086.41 -532.02 340.26 983.15 -461.22 367.95 915.19 -384.39 467.31 1796.2 -162.42 447.71 1759.38 -282.29 417.02 1228.88 -558.63 422.47 1108.44 -539.8 443 1005.4 -476.71 480.63 923.33 -379.71 532.27 1766.01 -172.86 516.86 1737.25 -270.47 492.97 1231.41 -546.07 499.86 1126.92 -523.54 521.98 1026.41 -468.73 564.14 948.69 -372.84 593.37 1728.69 -180.5 582.46 1699.2 -267.09 554.75 1238.16 -512.31 566.03 1145.67 -485.82 587.86 1055.36 -441.94 635 985.42 -358.04 649.73 1684.79 -185.24 639.44 1651.95 -266.71 633.66 1163.15 -430.82 652.33 1105.3 -392.1 742.9 1008.96 -241.85 710.66 1604.8 -200.32 696.47 1588.33 -255.7 714.21 1526.18 -278.16 733.25 1454.38 -296.05 717.14 1372.06 -347.65 671.05 1280.45 -414.7 765.95 1509.03 -219.24 455.84 1408.11 -489.21 404.58 1577.94 -457.71 518.53 1376.06 -480.7 638.73 1504.51 -384.65 529.73 1631.55 -380.38 466.5 1422.2 -458.53 513.53 1398.02 -447.78 424.47 1538.96 -426.12 428.96 1474.31 -451.83 556.48 1399.06 -429.08 462.77 1579.39 -394.45 590.58 1432.74 -411.25 517.55 1580.05 -378.27 601.07 1488.69 -393.62 571.7 1545.57 -379.35 473.01 1425.4 -468.16 518.76 1400.5 -459.17 429.4 1546.89 -438.5 563.32 1401.12 -438.53 599.93 1435.05 -417.8 523.68 1588.83 -385.48 612.15 1495.52 -398.46 579.79 1554.36 -384.37 585.74 1356.2 -455.47 652.91 1421.56 -404.28 656.47 1516.87 -366.13 352.76 1486.19 -500.38 422.08 1392.06 -517.6 611.75 1605.56 -350.11 529.86 1675.47 -361.4 434.52 1680.09 -406.89 356.5 1611.49 -464.22 510.57 1354.06 -504.58 457.89 1497.53 -447.07 445.58 1543.23 -426.04 488.75 1455.4 -456.6 522.26 1425.98 -449.75 551.19 1420.79 -437.72 572.12 1449.37 -430.15 570.73 1494.95 -420.46 545.31 1540.11 -408.4 507.25 1570.84 -398.78 467.98 1573.23 -404 435.01 1477.82 -462.68 470.68 1588.43 -407.35 514.95 1408.6 -447.38 490.17 1407.44 -455.07 471.38 1433.02 -456.99 436.7 1481.48 -449.71 420.58 1507.39 -441.54 430.87 1539.68 -425.46 445.19 1444.87 -457.48 553.49 1408.67 -431.98 535.73 1395.1 -438.96 438.98 1564.19 -409.85 464.24 1577.08 -397.37 583.4 1440.54 -418.16 575.15 1411.73 -419.62 489.86 1584.9 -383.45 514.55 1576.86 -385.54 590.05 1491.94 -403.27 600.57 1459.22 -402.72 545.52 1566.42 -377.03 562.85 1543.91 -390.1 590.65 1518.22 -385.19 492.53 1561.61 -413.19 471.5 1569.63 -409.84 519.72 1531.42 -427.43 545.03 1491.57 -438.64 549.8 1430.2 -442.53 536.17 1443.02 -449.39 515.86 1477.89 -451.58 488.75 1516.7 -441.31 468.34 1550.64 -423.85 578.72 1376.77 -448.92 663.15 1468.74 -381.79 632.78 1429.32 -415.16 379.81 1432.63 -507.27 406.51 1479.72 -481.97 573.36 1646.48 -352.58 597.47 1578.96 -369.44 389.54 1654.69 -436.93 460.18 1633.75 -417.26 343.45 1551.23 -486.33 467.46 1367.57 -518.03 548.42 1349.67 -481.66 640.13 1560.84 -354.39 483.44 1688.01 -380.81 627.98 1382.45 -432.4 678.1 1400.97 -382.04 597.88 1319.16 -465.76 678.15 1525.49 -331.49 383.03 1358.87 -534.12 281.49 1473.97 -512.39 519.05 1716.15 -316.42 626.01 1632.64 -314.61 280.32 1638.27 -445.1 392.9 1722.11 -371.34 497.59 1314.79 -525.69 448.27 1520.88 -437.54 472.04 1475.3 -453.86 505.95 1438.68 -454.71 536.53 1418.9 -443.67 564.06 1431.84 -433.15 574.53 1471.35 -426.06 560.76 1518.35 -414.27 526.73 1558.05 -403.03 487.96 1576.5 -398.05 451.99 1561.09 -414.35 452.04 1447.83 -467.17 446.13 1572.87 -423.49 426.02 1512.96 -452.62 495.56 1410.23 -465.83 541.56 1397.32 -449.59 583.23 1413.56 -427.69 610.79 1463.63 -408.1 600.86 1526.6 -389.41 551.74 1575.42 -382.49 497.01 1593.14 -393.66 493.57 1418.33 -453.99 428.57 1511.18 -439.27 451.68 1454.46 -455.66 534.82 1404.92 -439.87 442.96 1562.64 -410.88 570.19 1421.02 -424.71 489.37 1581.94 -388.48 590.79 1465.08 -411.16 539.85 1563.78 -386.61 580.48 1518.87 -395.65 484.81 1570.73 -406.98 505.18 1548.27 -420.27 533.6 1511.98 -433.43 552.5 1471.09 -441.65 540.27 1430.75 -446.53 527.48 1459.36 -451.94 502.31 1497.19 -447.64 476.88 1534.97 -432.87 462.53 1561.04 -417.04 609.89 1397.23 -432.83 642.21 1466.28 -398.43 428.45 1438.5 -487.08 563.32 1609.87 -370.99 428.06 1613.49 -439.78 396.13 1529.03 -470.98 487.24 1387.91 -489.86 548.92 1371.84 -465.17 624.35 1542.21 -374.48 495.46 1640.09 -396.12 644.84 1344.61 -425.98 689.39 1463.52 -349 319.4 1409.56 -532.49 578.11 1679.74 -311.12 330.28 1690.33 -407.17 264.24 1567.54 -485.33 442.75 1326.38 -536.72 547.15 1313.13 -496.42 656.71 1582.45 -320.42 456.87 1730.64 -340 555.96 1452.33 -442.06 557.62 1438.94 -440.43 725.31 1094.1 -291.91 759.25 1354.48 -313.36 793.77 1455.45 -202.3 688.12 1257.14 -410.96 822.78 1225.6 -240.4 817.19 1214.33 -229.98 805.65 1340.48 -311.51 727.44 1114.34 -381.99 778.29 1095.57 -288.17 855.05 1353.45 -322.84 699.71 1169.53 -427.42 708.89 1251.61 -420.75 794.99 1248.27 -430.17 853.17 1104.77 -293.64 813.89 1218.37 -427.73 813.37 1186.67 -414.93 1040.61 1135.24 -292.39 977.32 1129.21 -341.68 1019.84 1380.32 -406.95 1098.3 1485.5 -303.84 889.1 1247.66 -287.91 870.83 1194.63 -271.41 863.5 1313.8 -396.14 898.88 1379.47 -331.29 882.47 1223.16 -376.3 939.2 1273.4 -318.19 856.33 1235.63 -421.78 937.6 1414.63 -330.9 968.93 1451.06 -321.56 947.91 1271.56 -384.16 1021.98 1349.23 -373.98 978.45 1304.97 -333.44 1021.54 1348.71 -337.62 935.12 1285.88 -422.41 918.04 1106.48 -294.97 879.25 1177.85 -384.4 948.34 1097.66 -291.07 930.92 1320.16 -427.9 789.23 1082.19 -200.63 814.19 1211.62 -237.78 825.88 1206.8 -234.2 832.63 1223.75 -185.22 783.59 1341.83 -308.1 826.28 1088.34 -213.65 776.08 1403.72 -263.55 823.33 1395.8 -272.52 829.73 1347.21 -317.44 694.57 1213.2 -432.68 751.43 1253.67 -428.6 743.67 1171.77 -435.83 816.55 1100.16 -291.3 893.46 1099.64 -215.09 872.16 1395.58 -286.05 812.58 1197.91 -428.71 801.03 1168.8 -433.95 1029.41 1105.44 -294.14 1061.48 1124.57 -254.18 1001.26 1410.72 -398.69 1056.22 1444.91 -370.91 859.49 1225.37 -315.06 844.36 1239.03 -264.67 847.72 1202.37 -251.45 850.56 1197.59 -323.74 898.5 1186.97 -202.26 880.49 1361.28 -327.35 854.19 1210.93 -364.56 911.38 1243.57 -345.28 918.36 1256.79 -303.17 864.63 1222.06 -403.58 825.96 1198.49 -391.36 828.55 1227.86 -418.35 906.44 1291.31 -267.55 958.62 1317.34 -294.03 955.14 1434.65 -326.47 982.64 1305.39 -385.43 1021.79 1347.8 -353.48 1002.07 1327.72 -337.33 961.24 1285.07 -359.54 939.64 1272.08 -406.67 976.28 1324.4 -424.74 1022.2 1360.1 -393.99 947.72 1440.65 -300.77 979.81 1471.5 -300.46 993.52 1344.64 -307.33 1037.52 1376.55 -316.66 1056.98 1396.4 -339.99 887.13 1108.16 -295.76 872.09 1162.85 -389.37 842.5 1182.91 -393.25 901.88 1191.53 -280.54 911.32 1193.01 -329.86 946.61 1097.89 -232.9 960.14 1174.34 -222.18 931.16 1170.58 -370.56 923.15 1149.92 -371.44 940.9 1187.4 -330.48 993.13 1149.74 -336.13 991.37 1094.63 -290.82 915.07 1411.01 -298.26 958.41 1287.96 -327.62 894.99 1253.02 -425.09 855.23 1268.32 -426.52 918.91 1396.2 -332.44 912.66 1237.86 -381.78 981.68 1436 -362.56 923.29 1364.5 -392.78 803.87 1289.15 -398.02 736.79 1275.24 -386.3 811.62 1129.18 -377.8 884.51 1127.98 -370.79 833.83 1449.58 -213.87 889.73 1430.43 -228.66 940.21 1427.91 -245.48 968 1448.71 -252.61 998.72 1480.02 -257.23 1039.55 1510.15 -276.41 1076.45 1507.29 -295.94 1093.87 1431.61 -291.91 1062.82 1394.86 -275.7 1014.41 1353.76 -261.56 976.88 1325.99 -248.21 924.34 1300.54 -230.97 1035.39 1154.15 -288.2 828.69 1193.16 -388.01 895.31 1184.86 -366.74 822.74 1213.3 -247.64 841.63 1204.84 -183.45 845.65 1253.84 -203.11 796.07 1400.59 -265.78 737.33 1215.91 -447.11 769.96 1116.41 -381.88 857.99 1092.58 -217.73 847.83 1396.15 -279.68 783.18 1208.96 -442.43 1050.37 1088.65 -249.76 1034.28 1468.95 -360.03 842.74 1207.7 -280.41 867.32 1194.18 -191.05 883.24 1236.88 -333.55 832.67 1211.49 -395.05 935.22 1304.41 -281.64 990.33 1313.47 -361.43 978.64 1307.42 -408.8 963.96 1456.9 -299.47 1015.95 1362.86 -312.07 1050.22 1385.02 -326.47 849.84 1132.11 -373.87 833.63 1169.08 -400.2 878.94 1193.37 -327.45 920.33 1099.88 -225.93 930.05 1182.37 -212.76 972.47 1090.52 -237.25 1009.46 1170.54 -237.51 967.18 1177.32 -302.26 1017.08 1080.41 -243.03 897.15 1397.56 -291.3 976 1329.35 -301.91 895.35 1287.59 -428.28 935.22 1261.68 -354.14 1008.64 1479.94 -329.99 952.31 1398.15 -382.61 831.68 1297.79 -394.46 773.42 1283.87 -394.99 667.15 1212.25 -420.57 925.23 1120.5 -352.53 809.5 1455.95 -208.92 858.92 1441.67 -220.65 915.76 1424.89 -236.03 956.25 1436.39 -250.56 981.85 1463.47 -254.5 1099.64 1457.72 -300.82 1082.95 1411.48 -282.86 1037.13 1374.04 -268.6 995.74 1338.17 -255.24 953.35 1314.01 -239.78 876.89 1281.96 -213.84 1054.9 1147.09 -252.36 858.12 1187.74 -375.72 821.2 1258.43 -423.31 940.55 1179.72 -354.51 899.78 1237.99 -408.21 963.42 1361.26 -419.86 995.04 1161.72 -326.99 1059.56 1416.89 -356.38 961.13 1108.92 -328.47 716.56 1269.35 -384.11 857.63 1273.93 -243.04 932.55 1425.28 -302.27 894.24 1336.28 -397.34 843.29 1195.06 -352.59 933.96 1190 -289.22 991.23 1172.11 -269.6 949.68 1181.65 -253.89 917.48 1186.22 -244.13 885.61 1190.41 -234.24 857.22 1197.05 -221.6 835.31 1206.17 -212.14 824.04 1219.98 -211.51 832.96 1243.18 -224.11 739.39 1553.7 -210.27 629.85 1245.37 -445.18 701.37 1035.24 -328.34 668.25 1174.17 -404.65 687.15 1128.51 -358.58 786.16 1476.64 -214.29 763.17 1419.72 -282.29 752.36 1358.57 -327.02 689.93 1271.58 -414.29 659.82 1230.66 -433.21 662.51 1171.24 -417.11 680.26 1121.45 -376.01 722.74 1072.61 -309 804.55 1159.73 -414.54 764.21 1135.76 -404.9 764.59 1145.39 -419.47 -310.36 1169.7 160.6 766.26 1057.38 -232.84 -284.67 1051.92 97.49 -259.18 999.21 62.67 -225.57 954.92 24.34 -182.63 911.01 -14.99 608.99 902.94 -243.5 677.97 947.63 -243.81 644.06 1539.7 336.33 658.3 1497.87 341.45 677.35 1462.35 335.33 699.04 1435.72 324.26 641.16 1580.42 319.82 721.71 1417.47 309.81 648.87 1610.19 293.81 740.71 1406.01 289.33 662.13 1626.88 261.53 756.47 1401.53 265.16 678.67 1631.26 230.07 770.71 1405.03 240.08 698.01 1623.94 203.89 784.53 1420.61 215.31 720.89 1605.76 182.86 795.29 1446.23 192.5 747.52 1579.41 167.4 795.67 1477.79 175.1 770.62 1547.02 160.52 787.33 1512.23 163.91 464.43 1416.76 -478.68 440.24 1443.16 -477.13 420.76 1478.77 -472.33 411.08 1520.99 -461.8 491.4 1399.07 -477.85 416.99 1562.42 -448.1 518.66 1388.28 -469.93 437.1 1593.18 -431.63 545.24 1384.58 -457.38 465.43 1611.09 -412.3 571.01 1388.89 -443.71 496.24 1616.61 -394.89 596.04 1405.56 -430.49 526.71 1610.19 -382.93 615.4 1432.78 -417.66 557.53 1592.65 -376.74 625.22 1464.66 -404.72 588.63 1566.66 -376.9 624.76 1499.28 -392.45 612.62 1534.39 -381.95 -138.57 574.15 -548.71 -137.26 520.89 -606.92 -142.42 505.79 -641.95 -95.18 -221.62 -469.59 -95.62 -202.26 -529.62 -99.49 -167.12 -581 -108.33 -119.01 -620.12 -122.79 -64.78 -649.01 -119.2 -6.43 -684.27 -116.48 25.88 -704.78 -112.41 73.08 -723.39 -110.61 124.99 -736.83 -114.83 178.15 -743.92 -121.66 232.32 -745.15 -128.19 286.16 -741.89 -132.83 337.55 -733.34 -135.05 384.52 -719.98 -136.37 427.73 -700.35 -140.4 469.48 -673.78 -127.5 626.74 -484.89 -101.91 666.68 -433.91 -73.76 702.86 -379.82 604.75 823.46 -64.82 621.87 798.48 -68.47 652.02 776.95 -73.73 699.05 749.87 -84.52 754.28 710.8 -94.29 -294.31 1104 154.97 -306.56 1167.43 173.32 -163.7 882.21 64.35 -273.47 1042.54 135.05 -244.22 985.81 110.93 -207.54 934.53 84.43 -967.93 24.65 178.06 -276.57 1105.79 211.65 -297.99 1167.99 201.63 -120.27 892.46 219.16 -247.85 1045.06 219.18 -211.32 988.06 223.83 -168.08 936.38 224.41 710.75 922.49 -97.53 652.54 876.62 -78.34 -312.84 -219.27 339.86 -231.37 -219.37 365.4 -372.02 -219.18 292.06 -417.92 -219.08 228.07 -461.19 -219.04 130.5 284.09 -219.55 321.07 385.88 -219.63 255.48 34.67 -219.45 381.97 150.3 -219.51 363.85 -120.77 -219.46 382.91 441.85 -219.58 173.23 -65.21 -219.46 390.03 471.05 -219.21 81.98 -463.8 -219.08 -47.54 470.49 -219.31 -41.57 -245.87 -219.39 -334.63 -327.14 -219.27 -310.18 -406.68 -219.09 -274.3 -449.87 -219.07 -205.74 -449.16 -219.14 -121.64 391.22 -219.47 -224.93 287.36 -219.29 -295.21 152.5 -219.15 -358.2 29.47 -219.1 -382.68 -128.66 -219.3 -366.44 446.6 -219.49 -138.12 -75.7 -219.3 -367.56 12.61 -218.97 19.81 641.1 882.03 191.88 -658.11 843.57 30.98 -586.14 -220.15 44.55 -496.46 -219.12 41.37 -817.65 916.77 24.83 -733.71 894.79 27.37 -767.46 -160.06 44.41 -680.53 -198.54 44.91 -852.68 -110.66 42.72 -923.83 -47.01 43.58 -984.36 23.72 44.15 -1029.62 104.54 45.13 -1070.64 219.41 45.65 -1091.87 345.65 44.38 -1088.9 440.49 44.35 -1074.53 541.91 44.65 -1051.63 661.83 42.56 -988.38 812.88 31.23 -905.04 891.11 25.45 -600.45 770.18 44.8 -550.59 727.83 48.48 -494.69 705.18 46.56 -423.33 694.52 44.91 -343.62 700.22 45.51 -149.12 737.61 56.11 -80.49 763.65 61.32 -69.41 782.69 58.09 -79.99 806.58 66.66 -106.79 837.87 86.09 -151.24 878.05 109.17 -195.26 927.29 125.72 -233.65 980.71 142.27 -265.58 1039.3 156.65 -289.36 1102.19 168.57 -304.67 1166.98 179.41 -517.97 463.24 660.13 -429.35 504.89 645.69 -270.88 14.21 721.7 44.4 -9.39 723.8 -115.47 -6.91 724.95 418.23 136.4 719.34 486.61 313.31 707.51 389.78 483.48 681.27 -433.39 496.22 -607.35 -529.84 454.83 -618.37 -269.64 23.61 -680.86 405.15 143.52 -679.71 464.66 315.02 -670.13 377.72 474.13 -642.96 -538.5 474.64 646.76 -441.74 514.83 633.74 -300.3 528.27 627.73 -135.89 544.97 627.3 -435.1 56.68 705.91 -534.18 135.77 700.13 -588.91 228.09 688.27 -606.73 319.93 676.14 -289.95 -3.79 707.11 -590.65 405.71 662.33 383.8 52.03 698.49 246.54 -6.85 698.62 64.05 -33.42 705.83 -115.08 -31.62 708.83 474.3 126.9 699.33 527.63 214.01 696.25 544.91 308.82 688.39 518.89 404.5 674.81 450.59 487.53 658.71 27.69 571.41 625.58 200.01 577.94 628.16 343.41 546.64 642.27 -136.46 537.08 -586.08 -307.39 527.1 -585.65 -450.45 507.15 -593.67 -551.58 463.78 -606.69 -612.34 308.73 -635.55 -592.71 225.72 -645.54 -532.61 140.97 -655.33 -432.24 65.09 -661.01 -292.76 2.39 -664.05 -600 390.67 -622.57 -120.4 -30.08 -668.37 57.1 -33.61 -667.05 240.72 -4.89 -658.31 377.97 56.02 -655.58 466.63 132.2 -654.36 517.34 217.76 -651.04 532.53 308.14 -643.16 508.01 396.88 -631.36 444.66 474.92 -616.9 343.76 531.22 -600.97 203.34 561.32 -586.85 26.68 559.17 -584.86 </float_array>\r\n                    <technique_common>\r\n                        <accessor count=\"2108\" source=\"#LOD3spShape-lib-positions-array\" stride=\"3\">\r\n                            <param name=\"X\" type=\"float\"/>\r\n                            <param name=\"Y\" type=\"float\"/>\r\n                            <param name=\"Z\" type=\"float\"/>\r\n                        </accessor>\r\n                    </technique_common>\r\n                </source>\r\n                <source id=\"LOD3spShape-lib-normals\" name=\"normal\">\r\n                    <float_array id=\"LOD3spShape-lib-normals-array\" count=\"6870\">-0.192105 -0.934574 0.299444 -0.063137 -0.993627 0.093379 -0.038768 -0.993008 0.1115 -0.116943 -0.921307 0.370834 -0.085244 -0.993929 0.06956 -0.258206 -0.942078 0.214051 -0.30524 -0.944237 0.123468 -0.102996 -0.993875 0.040058 -0.109847 -0.993698 0.022299 -0.31987 -0.945465 0.06147 0.322014 -0.653115 0.685382 0.238003 -0.809448 0.536795 0.395576 -0.829373 0.394537 0.547108 -0.665776 0.507362 0.149282 -0.925886 0.34706 0.227377 -0.943125 0.242517 -0.182093 -0.790185 0.585193 -0.310546 -0.820659 0.479666 -0.418252 -0.841387 0.342247 -0.407245 -0.671921 0.618606 -0.544902 -0.711892 0.443048 -0.234362 -0.618085 0.750364 -0.474252 -0.857348 0.200096 -0.472506 -0.875417 0.101894 -0.601137 -0.750563 0.274389 -0.593416 -0.791429 0.146622 0.28227 -0.953511 0.105546 0.497191 -0.845397 0.195207 0.680188 -0.678638 0.277119 0.475424 -0.378708 0.794073 0.394705 -0.508079 0.765548 0.651802 -0.507547 0.563516 0.728712 -0.354445 0.585959 -0.28008 -0.456966 0.844238 -0.472077 -0.527464 0.706346 -0.629957 -0.589592 0.505506 -0.525513 -0.402807 0.749388 -0.688268 -0.483476 0.540868 -0.345689 -0.333642 0.87703 0.797507 -0.502743 0.333516 0.868862 -0.332167 0.367076 0.77923 -0.208314 0.591105 0.556737 -0.232341 0.797535 0.611427 -0.086962 0.786508 0.805964 -0.078024 0.5868 0.901017 -0.198566 0.385667 0.912955 -0.073238 0.401435 0.587301 0.316928 0.744738 0.626297 0.112266 0.771458 0.80759 0.102136 0.580833 0.767557 0.296272 0.5684 0.90596 0.097132 0.41207 0.868979 0.273142 0.412637 0.369046 0.664285 0.650024 0.498273 0.502361 0.706652 0.692858 0.459154 0.555991 0.584343 0.597973 0.548609 0.81307 0.415129 0.408148 0.751108 0.515142 0.412874 0.196275 0.766921 0.61099 0.270008 0.715602 0.644212 0.477417 0.672125 0.565969 0.380902 0.730921 0.566276 0.665621 0.613832 0.424452 0.560117 0.712908 0.421936 -0.142244 0.892593 0.427838 -0.115439 0.801946 0.586137 -0.145787 0.823133 0.548815 -0.183743 0.901337 0.392212 -0.170612 0.892161 0.418258 -0.198939 0.940455 0.275621 -0.083925 0.784602 0.614293 -0.10478 0.836918 0.537206 -0.071281 0.762801 0.642692 -0.083728 0.958156 0.273727 -0.15202 0.9639 0.218603 -0.043763 0.995476 0.08434 0.114346 0.98314 0.14269 -0.188558 0.971096 0.146348 -0.153656 0.986839 0.050394 -0.277869 0.955109 0.102745 -0.278502 0.959787 0.035287 -0.266254 0.943942 0.195147 -0.494479 0.642105 0.585826 -0.123696 0.744153 0.656457 -0.094312 0.919594 0.381382 -0.521994 0.776797 0.35229 0.287491 0.725141 0.625716 0.351054 0.8663 0.355366 -0.085417 0.659133 0.74716 0.224057 0.689812 0.688446 -0.411466 0.564911 0.715242 -0.896433 0.304314 0.322182 -0.755952 0.475948 0.449456 -0.804068 0.526335 0.276491 -0.929835 0.307417 0.202242 -0.651395 0.428272 0.626313 -0.812822 0.26113 0.520703 -0.700814 0.143516 0.698758 -0.528958 0.34005 0.777541 -0.323565 0.505561 0.799821 -0.384659 0.217755 0.897006 -0.267683 0.410287 0.871786 -0.517297 -0.021464 0.855537 -0.703155 -0.184805 0.686601 -0.802321 -0.033849 0.595932 -0.877921 -0.144525 0.456473 -0.806043 -0.267057 0.528181 -0.893238 0.116382 0.43426 -0.929772 -0.002536 0.368127 -0.693476 -0.636084 0.33836 -0.705366 -0.683814 0.186701 -0.755874 -0.532487 0.380935 -0.796558 -0.566462 0.211227 -0.077404 -0.240518 0.967553 -0.089779 -0.134756 0.986803 -0.16848 -0.121851 0.978145 -0.1385 -0.221469 0.965282 -0.113523 -0.03893 0.992772 -0.196004 -0.01747 0.980447 -0.602192 -0.290794 0.743508 -0.742443 -0.374888 0.555191 -0.432924 -0.200313 0.878892 -0.81811 -0.413901 0.399226 -0.879813 -0.419683 0.223148 -0.883197 -0.285159 0.372353 -0.940381 -0.263399 0.215185 -0.205308 0.092762 0.974291 -0.124591 0.080263 0.988956 -0.122229 0.178902 0.976245 -0.196018 0.189899 0.962037 -0.047896 0.778818 0.625419 -0.065643 0.712191 0.69891 -0.086262 0.666108 0.740851 -0.054126 0.736681 0.674071 0.32738 0.918427 0.222066 0.038281 0.947016 0.318896 -0.06742 0.912058 0.40448 0.299045 0.868082 0.396239 0.020784 0.86406 0.502959 0.600993 0.749845 0.276658 0.100131 0.787806 0.60773 0.137886 0.800725 0.582946 0.29315 0.782719 0.549012 0.251526 0.793734 0.553824 0.033788 0.760604 0.648336 0.012822 0.792841 0.609294 -0.001463 0.805932 0.592006 0.470183 0.782284 0.408607 0.406579 0.824127 0.394346 -0.228103 0.919665 0.319665 -0.149178 0.877206 0.456351 0.222002 0.775651 0.59083 0.47715 0.718895 0.505488 0.642217 0.702698 0.306223 -0.941955 -0.151987 0.299368 -0.977275 -0.097624 0.188159 -0.969668 0.027369 0.242887 -0.984275 0.065093 0.164214 -0.081931 0.660821 0.746058 -0.143877 0.635631 0.758467 -0.950765 0.179011 0.252985 -0.969442 0.180576 0.166054 0.433755 0.791155 0.431196 0.286616 0.730735 0.619578 0.635939 0.499322 0.588438 0.410198 0.415864 0.811662 -0.030926 0.832103 0.553758 -0.063271 0.738082 0.671738 -0.236424 0.785278 0.572225 -0.098467 0.365743 0.925492 -0.356851 0.365077 0.85987 0.116452 0.704273 0.700314 0.160352 0.369362 0.915346 -0.380382 0.818135 0.431237 -0.491183 0.823513 0.283841 -0.599124 0.341163 0.724333 -0.79874 0.301744 0.520542 0.047578 -0.992569 0.111995 0.069353 -0.994738 0.07541 0.015597 -0.990696 0.135198 0.028502 -0.991142 0.12971 0.086411 -0.911351 0.402459 0.046375 -0.905885 0.420978 -0.018846 -0.991895 0.125653 -0.057064 -0.909795 0.411117 0.087759 -0.995759 0.027609 0.126144 -0.779516 0.613549 0.06715 -0.760564 0.645781 0.153708 -0.607994 0.77892 0.075386 -0.576764 0.813425 -0.08524 -0.76005 0.644251 -0.102578 -0.56625 0.817826 0.045087 -0.227715 0.972683 0.047144 -0.133927 0.989869 0.005657 -0.158947 0.987271 0.006383 -0.238842 0.971037 0.058636 -0.040894 0.997441 0.002968 -0.056685 0.998388 0.127619 -0.116249 0.984987 0.152276 -0.014785 0.988227 0.100582 -0.205115 0.973556 0.059273 0.068169 0.995911 -0.006761 0.055533 0.998434 0.050298 0.180654 0.98226 -0.021937 0.163023 0.986378 0.163736 0.099064 0.981518 0.156174 0.22069 0.962759 0.020676 0.317859 0.947913 -0.05028 0.316737 0.94718 -0.0254 0.533871 0.845184 -0.08689 0.522774 0.848032 0.127715 0.356856 0.925388 0.071449 0.515979 0.853616 -0.061044 0.766613 0.639201 0.078283 0.74129 0.666604 0.208503 0.671411 0.71115 0.31329 0.499709 0.807552 0.378686 0.310584 0.871857 0.40034 0.118623 0.908657 0.381554 -0.070387 0.921663 0.331086 -0.227735 0.915707 0.260302 -0.364956 0.893896 0.178108 -0.473098 0.862819 0.071346 -0.485087 0.871551 -0.127927 -0.411335 0.902462 -0.21715 -0.272308 0.937387 -0.286126 -0.114594 0.951315 -0.297807 0.014156 0.954521 -0.259201 0.153068 0.953617 -0.214496 0.319775 0.922895 -0.151909 0.528651 0.835136 -0.103667 0.295325 0.949756 -0.165784 0.313165 0.935117 -0.083668 0.49287 0.866071 -0.119838 0.470098 0.874441 -0.087589 0.774562 0.626403 -0.256938 -0.123462 0.958509 -0.282895 0.013189 0.95906 -0.378704 -0.276753 0.883171 -0.438398 -0.070592 0.896004 -0.437713 -0.063566 0.896865 -0.390688 -0.276212 0.878106 -0.251501 -0.431258 0.866466 -0.276372 -0.456201 0.845872 -0.199071 -0.303262 0.931881 -0.274649 0.135234 0.951987 -0.24989 0.293919 0.922587 -0.442082 0.0996 0.891428 -0.416834 0.295751 0.859524 -0.412812 0.324044 0.851224 -0.438386 0.113041 0.89165 0.156414 -0.497415 0.853295 0.061408 -0.535723 0.842158 0.119444 -0.451978 0.883996 0.032666 -0.468593 0.88281 0.050042 -0.559279 0.827468 0.150719 -0.524692 0.837844 0.208737 -0.361481 0.908714 0.238763 -0.413598 0.878595 0.232431 -0.391683 0.890259 -0.125822 -0.451367 0.883423 -0.12867 -0.465577 0.875604 -0.150997 -0.530958 0.833836 0.284033 -0.235262 0.929504 0.269395 -0.199777 0.94208 0.293523 -0.238539 0.925712 0.286187 -0.032296 0.957629 0.310919 -0.056238 0.948771 0.312734 -0.062229 0.9478 0.322662 0.120176 0.938854 0.286699 0.125442 0.949773 0.312949 0.123788 0.941668 0.279721 0.29417 0.913904 0.303912 0.313653 0.899588 0.309098 0.311371 0.898614 0.037576 0.808427 0.587396 0.169809 0.698636 0.695034 -0.000992 0.780216 0.62551 0.138258 0.681303 0.718826 0.161534 0.715465 0.679718 0.018782 0.826535 0.562572 -0.099959 0.801373 0.589754 -0.09864 0.852959 0.512573 -0.076803 0.814817 0.574608 0.262913 0.511392 0.818141 0.242579 0.492018 0.836106 0.262902 0.521528 0.811721 -0.185717 0.495793 0.848351 -0.322475 0.528815 0.785089 -0.160238 0.722249 0.672815 -0.1463 0.77286 0.617482 -0.312054 0.577236 0.7546 -0.076566 0.797942 0.597851 -0.071614 0.840186 0.537549 -0.107373 0.80621 0.581804 -0.11299 0.848803 0.516494 -0.28755 -0.018158 0.957593 -0.24684 -0.156049 0.956409 -0.173541 -0.290822 0.940907 -0.283247 0.226808 0.931842 -0.297511 0.100471 0.949417 0.01455 -0.330323 0.943756 0.072167 -0.32917 0.941509 0.150157 -0.268874 0.951399 -0.091497 -0.34135 0.935472 0.211916 -0.141446 0.966998 0.233572 -0.009443 0.972294 0.240824 0.120377 0.963075 0.233783 0.260441 0.936758 0.102887 0.613162 0.783228 -0.030393 0.694002 0.719332 -0.098715 0.675429 0.730788 0.204906 0.428811 0.879849 -0.132488 0.557427 0.819586 -0.232969 0.388 0.891729 -0.07538 0.634763 0.769021 -0.096847 0.652624 0.751467 -0.092385 0.509498 0.855498 -0.081264 0.316519 0.945099 -0.068257 0.171979 0.982733 -0.054548 0.065366 0.996369 -0.043345 -0.055433 0.997521 -0.033398 -0.160142 0.986529 -0.028887 -0.245337 0.969007 -0.033309 -0.336013 0.941268 -0.042364 -0.467723 0.882859 -0.046571 -0.556121 0.829795 -0.037676 -0.519497 0.853641 -0.022573 -0.457443 0.888952 -0.012972 -0.556884 0.830489 -0.007748 -0.753866 0.656982 -0.003795 -0.90728 0.42051 -0.00113 -0.991208 0.132304 0.512332 -0.857387 0.049021 0.705549 -0.704427 0.077351 0.297091 -0.954566 0.023266 0.842868 -0.528877 0.099309 0.93026 -0.348815 0.113777 0.968095 -0.218407 0.122841 0.986592 -0.093128 0.134027 0.985675 0.081584 0.14761 0.952815 0.259744 0.15709 0.894832 0.417712 0.157458 0.84411 0.514902 0.149511 0.774081 0.618632 0.134512 0.673778 0.729236 0.119324 0.59428 0.795841 0.116055 0.520486 0.845859 0.116692 0.525073 0.841884 0.124619 0.765587 0.621617 0.165736 0.097104 -0.995262 0.004891 -0.565487 0.809409 0.158369 -0.611373 0.78929 0.056948 -0.920923 0.236246 0.309983 -0.979385 0.144836 0.140812 -0.738264 -0.362444 0.568859 -0.830425 -0.418736 0.367498 -0.844467 -0.498619 0.195587 -0.637332 -0.672703 0.375871 -0.668065 -0.709841 0.223194 -0.553906 -0.63586 0.537467 -0.346187 -0.290986 0.891898 -0.56422 -0.330576 0.756555 -0.43616 -0.617409 0.654653 -0.266325 -0.628621 0.730689 -0.097998 -0.251549 0.96287 -0.086914 -0.643904 0.760153 0.176808 -0.222937 0.958665 0.120692 -0.699227 0.704638 0.465191 -0.190484 0.864473 0.373031 -0.681738 0.629349 0.749166 -0.14147 0.647099 0.572084 -0.682023 0.455592 0.984146 0.022959 0.175865 0.738389 -0.656529 0.154114 -0.095642 0.769685 0.631219 -0.315046 -0.948906 0.017992 -0.110312 -0.993885 0.004937 -0.45769 -0.888534 0.032051 -0.589108 -0.80717 0.037794 0.510072 -0.858616 -0.051035 0.706228 -0.703128 -0.082783 0.29442 -0.955397 -0.023087 0.843868 -0.525188 -0.109836 0.928969 -0.346428 -0.1304 0.964677 -0.219443 -0.145749 0.981881 -0.104843 -0.15785 0.98501 0.058606 -0.162235 0.958193 0.238389 -0.158228 0.897815 0.414059 -0.149943 0.829346 0.538001 -0.150799 0.747692 0.644522 -0.159835 0.659158 0.734433 -0.161617 0.265067 0.963479 0.038045 0.039024 0.999086 0.017429 0.018608 0.997848 -0.062879 0.244851 0.96254 -0.116469 -0.130659 0.99135 0.012353 -0.138122 0.990161 -0.022438 -0.273264 0.961899 0.008832 -0.274223 0.961666 0.000456 -0.05358 0.998129 0.029446 -0.515921 0.8552 0.049574 0.344118 0.898832 -0.271449 -0.055876 0.956547 -0.286173 0.365292 0.93075 0.01632 -0.828134 0.557883 0.054407 -0.952772 0.299577 0.049792 -0.71172 -0.701466 0.037417 -0.905756 -0.418032 -0.069674 -0.8121 -0.578722 -0.07466 -0.818397 -0.573475 0.036781 -0.910275 -0.41206 0.040068 0.709534 0.701444 0.067368 0.515623 0.854186 0.067083 0.526247 0.835424 -0.158529 0.711552 0.677342 -0.186817 0.587213 0.793912 -0.15775 0.504741 0.8499 -0.15135 0.655698 0.754164 0.036014 0.627906 0.742235 -0.23414 -0.995756 -0.076044 0.051846 -0.966252 -0.253073 0.048067 -0.995209 0.084613 0.048994 -0.982451 0.18055 0.046815 0.5007 0.849411 -0.166736 0.699496 0.67424 -0.236864 -0.644953 0.764152 0.010324 -0.658148 0.752564 0.022105 -0.997005 0.052622 0.056674 -0.999009 0.030971 0.031971 0.095196 -0.995453 -0.003472 -0.828462 -0.551208 0.099097 -0.833527 -0.552249 0.015939 -0.680855 -0.72299 0.11714 -0.704394 -0.709809 0.000319 0.942478 0.129992 -0.307956 0.760785 -0.603242 -0.239385 -0.191595 -0.926135 -0.324907 -0.114053 -0.910401 -0.397695 -0.034542 -0.992382 -0.11826 -0.056323 -0.993627 -0.097634 -0.082295 -0.994468 -0.065269 -0.263911 -0.938065 -0.224465 -0.301453 -0.945273 -0.124838 -0.102697 -0.994174 -0.032737 -0.109858 -0.993814 -0.016288 -0.306209 -0.95011 -0.059387 0.319119 -0.647592 -0.691944 0.534298 -0.666951 -0.519328 0.385243 -0.830076 -0.403189 0.239588 -0.805169 -0.542495 0.228594 -0.939198 -0.256228 0.158282 -0.918606 -0.36209 -0.178478 -0.756748 -0.62887 -0.309478 -0.797511 -0.51788 -0.420816 -0.8318 -0.361971 -0.538666 -0.700905 -0.467516 -0.394207 -0.645973 -0.653697 -0.222741 -0.580398 -0.783278 -0.463931 -0.858392 -0.218933 -0.461417 -0.880379 -0.10967 -0.599795 -0.782409 -0.167574 -0.593082 -0.744351 -0.306913 0.280101 -0.952347 -0.12074 0.489168 -0.845973 -0.212238 0.674729 -0.677812 -0.292083 0.467445 -0.36492 -0.805188 0.712303 -0.345384 -0.61101 0.641582 -0.494013 -0.586791 0.391214 -0.48952 -0.779308 -0.257894 -0.431039 -0.864694 -0.450357 -0.520347 -0.725546 -0.610806 -0.588396 -0.529817 -0.665059 -0.488469 -0.564884 -0.505188 -0.409002 -0.759935 -0.312905 -0.315001 -0.896027 0.796289 -0.495911 -0.346405 0.865735 -0.328642 -0.377489 0.760431 -0.204646 -0.616332 0.545205 -0.224703 -0.807626 0.593643 -0.079999 -0.800742 0.783914 -0.086131 -0.614866 0.896385 -0.199745 -0.395723 0.906271 -0.095035 -0.411876 0.55148 0.253949 -0.794594 0.749755 0.226643 -0.621691 0.783116 0.056583 -0.619296 0.596901 0.085912 -0.797702 0.905261 0.045528 -0.422409 0.880717 0.218407 -0.42028 0.336343 0.599634 -0.726163 0.572034 0.582302 -0.57767 0.679989 0.408784 -0.608695 0.46199 0.4254 -0.778203 0.822753 0.398503 -0.405305 0.738654 0.550109 -0.389577 0.158289 0.71392 -0.682101 0.37644 0.723497 -0.578658 0.467119 0.676082 -0.569836 0.228365 0.685686 -0.691147 0.64837 0.657518 -0.383779 0.564634 0.73282 -0.379688 -0.132947 0.895479 -0.424786 -0.167833 0.911033 -0.376632 -0.127559 0.841932 -0.524289 -0.095043 0.810725 -0.57766 -0.191257 0.937853 -0.289573 -0.161108 0.887896 -0.430911 -0.099614 0.831055 -0.547197 -0.068855 0.78256 -0.618756 -0.042804 0.756721 -0.652336 -0.106608 0.957284 -0.26878 0.061838 0.967519 -0.245118 -0.090994 0.984178 -0.152029 -0.171427 0.958941 -0.225931 -0.17017 0.981995 -0.082019 -0.19565 0.967131 -0.162414 -0.282661 0.958483 -0.037587 -0.282513 0.952365 -0.114838 -0.26264 0.936926 -0.23063 -0.457703 0.605022 -0.651503 -0.494685 0.71531 -0.493577 -0.076215 0.822264 -0.56398 -0.087927 0.702017 -0.706712 0.319663 0.765999 -0.557728 0.294838 0.694845 -0.655943 0.224188 0.682817 -0.695342 -0.063718 0.649519 -0.757671 -0.387101 0.557985 -0.734034 -0.896045 0.261572 -0.358724 -0.944001 0.274388 -0.183229 -0.810196 0.488178 -0.324445 -0.74295 0.435413 -0.508371 -0.645643 0.412335 -0.642748 -0.811091 0.243391 -0.531877 -0.699154 0.136172 -0.701883 -0.530868 0.331813 -0.779794 -0.304277 0.511425 -0.803654 -0.248497 0.40863 -0.87822 -0.387329 0.198997 -0.900209 -0.511752 -0.03369 -0.858472 -0.688195 -0.178343 -0.703265 -0.790779 -0.260465 -0.553919 -0.872039 -0.112084 -0.476429 -0.79441 -0.013365 -0.607235 -0.920107 0.042305 -0.389375 -0.884542 0.127624 -0.448662 -0.67697 -0.636722 -0.369184 -0.702445 -0.678562 -0.214766 -0.780282 -0.577743 -0.239525 -0.733845 -0.540698 -0.411238 -0.092146 -0.181551 -0.979055 -0.144346 -0.166446 -0.975428 -0.159433 -0.0793 -0.984019 -0.09459 -0.066005 -0.993326 -0.168505 -9.8e-005 -0.985701 -0.104515 0.011536 -0.994456 -0.726294 -0.369683 -0.57951 -0.58845 -0.292203 -0.753886 -0.407289 -0.200727 -0.890968 -0.869482 -0.428707 -0.24538 -0.799739 -0.410778 -0.437812 -0.938756 -0.260148 -0.225964 -0.869601 -0.274802 -0.410217 -0.170544 0.079519 -0.982136 -0.161163 0.16971 -0.972227 -0.090406 0.181407 -0.979244 -0.103963 0.092063 -0.990311 -0.06148 0.779504 -0.623372 -0.054957 0.743776 -0.666166 -0.103094 0.668639 -0.736406 -0.089261 0.714201 -0.694225 0.31363 0.879361 -0.358275 0.027406 0.941997 -0.3345 -0.080633 0.891855 -0.445077 0.022354 0.831017 -0.555798 0.289188 0.850634 -0.439082 0.556014 0.699287 -0.449273 0.050619 0.77372 -0.631503 0.231632 0.808093 -0.541602 0.288864 0.771709 -0.566589 0.103253 0.74479 -0.659263 0.031941 0.724554 -0.688478 0.00327 0.749939 -0.661499 -0.026178 0.792686 -0.609067 0.482125 0.794986 -0.368174 0.39819 0.851477 -0.34122 -0.221082 0.901732 -0.371486 -0.143616 0.850846 -0.505407 0.234403 0.743588 -0.626204 0.4613 0.70383 -0.540209 0.562036 0.649806 -0.51173 -0.977475 -0.09125 -0.190304 -0.936548 -0.12725 -0.326627 -0.984002 0.070673 -0.163538 -0.961334 0.050437 -0.270725 -0.121369 0.620779 -0.774534 -0.05521 0.647509 -0.760056 -0.94446 0.162933 -0.285392 -0.972852 0.171495 -0.155397 0.237588 0.800477 -0.550262 0.395612 0.847698 -0.353412 0.352709 0.570394 -0.741786 0.568092 0.651952 -0.502225 -0.054492 0.806886 -0.588189 -0.221387 0.774334 -0.592785 -0.082145 0.728436 -0.680171 -0.342466 0.449464 -0.825045 -0.118412 0.432894 -0.893634 0.102365 0.477954 -0.8724 0.062161 0.735187 -0.675008 -0.351629 0.822967 -0.446187 -0.453204 0.83982 -0.298847 -0.753611 0.408046 -0.515334 -0.565572 0.457655 -0.686061 0.070664 -0.994095 -0.082349 0.053041 -0.99155 -0.11839 0.013214 -0.990079 -0.139887 0.042012 -0.89934 -0.435226 0.096958 -0.90473 -0.414805 0.032984 -0.990442 -0.133926 -0.056129 -0.897894 -0.436619 -0.016737 -0.990737 -0.134762 0.086451 -0.995646 -0.034867 0.061045 -0.750035 -0.658575 0.137192 -0.7745 -0.617518 0.069231 -0.578032 -0.813072 0.16572 -0.607502 -0.776838 -0.08926 -0.735219 -0.671927 -0.114232 -0.544749 -0.830782 0.0199 -0.230667 -0.972829 -0.03059 -0.214976 -0.97614 -0.045949 -0.097765 -0.994148 0.002652 -0.09551 -0.995425 -0.05214 0.011311 -0.998576 0.002126 0.018178 -0.999833 0.120703 0.014716 -0.99258 0.113382 -0.110686 -0.987367 0.096735 -0.223219 -0.969956 -0.055453 0.119903 -0.991236 -0.00362 0.136071 -0.990692 -0.05736 0.236921 -0.969834 -0.013518 0.263625 -0.96453 0.087312 0.29439 -0.951689 0.113303 0.153087 -0.981696 -0.061342 0.359864 -0.930986 -0.028723 0.371745 -0.92789 -0.069243 0.4799 -0.874586 -0.043065 0.485174 -0.873356 0.017105 0.479389 -0.877436 0.052658 0.398115 -0.915823 -0.034662 0.760895 -0.647949 0.071561 0.732107 -0.677421 0.19193 0.634438 -0.748767 0.303764 0.45856 -0.835135 0.384423 0.282016 -0.879025 0.419852 0.110043 -0.900897 0.406421 -0.062873 -0.91152 0.353948 -0.220409 -0.908923 0.281497 -0.354275 -0.891767 0.067514 -0.500145 -0.863306 0.193672 -0.469968 -0.861174 -0.149573 -0.414804 -0.897533 -0.228364 -0.298828 -0.926581 -0.288289 -0.161703 -0.943791 -0.298673 -0.022505 -0.95409 -0.190837 0.301541 -0.93416 -0.246393 0.126272 -0.960909 -0.150186 0.520269 -0.840693 -0.129719 0.30909 -0.942145 -0.066401 0.30513 -0.949993 -0.05506 0.462228 -0.88505 -0.090054 0.449043 -0.888961 -0.071737 0.766971 -0.637659 -0.28308 -0.028542 -0.958671 -0.281907 -0.191932 -0.940048 -0.35128 -0.084777 -0.932424 -0.309861 -0.241819 -0.919516 -0.329872 -0.25678 -0.908432 -0.37191 -0.083601 -0.924497 -0.244241 -0.370498 -0.896146 -0.261883 -0.399783 -0.878402 -0.239012 -0.350972 -0.905369 -0.228584 0.26964 -0.935438 -0.253339 0.114703 -0.960553 -0.387728 0.261522 -0.883897 -0.382104 0.068919 -0.921546 -0.395896 0.08722 -0.914144 -0.400449 0.295267 -0.867443 0.059717 -0.537345 -0.841246 0.170808 -0.490619 -0.854469 0.023676 -0.491989 -0.87028 0.13803 -0.482656 -0.864865 0.172547 -0.546783 -0.819302 0.048048 -0.585351 -0.809355 0.245352 -0.391125 -0.887031 0.271569 -0.425596 -0.863203 0.253368 -0.383228 -0.888223 -0.163913 -0.464506 -0.870268 -0.156065 -0.436285 -0.886171 -0.174109 -0.495956 -0.850713 0.311333 -0.23414 -0.921005 0.314461 -0.22766 -0.921567 0.331859 -0.25307 -0.908749 0.334949 -0.047464 -0.94104 0.358799 -0.06945 -0.930828 0.352028 -0.064116 -0.933791 0.370019 0.120945 -0.921118 0.325854 0.137848 -0.935317 0.365493 0.126797 -0.922137 0.293833 0.331416 -0.896563 0.34575 0.339236 -0.874858 0.349674 0.318497 -0.881072 0.181169 0.722007 -0.667745 0.050428 0.825992 -0.561421 0.124915 0.68236 -0.720265 -6.4e-005 0.771436 -0.636307 0.029383 0.862631 -0.504979 0.172419 0.753175 -0.634823 -0.088463 0.796994 -0.597474 -0.084754 0.878473 -0.470215 -0.056364 0.816907 -0.574008 0.287197 0.527288 -0.799678 0.229302 0.522437 -0.821267 0.284401 0.557632 -0.779848 -0.184805 0.4794 -0.857917 -0.159069 0.705704 -0.690419 -0.306813 0.513918 -0.801096 -0.31363 0.566778 -0.761839 -0.157736 0.765168 -0.624209 -0.07398 0.778037 -0.623847 -0.070336 0.835625 -0.544778 -0.087807 0.795682 -0.599317 -0.0906 0.859182 -0.503584 -0.232894 -0.14448 -0.96171 -0.244694 -0.029464 -0.969153 -0.189637 -0.261806 -0.946306 -0.25147 0.075308 -0.964931 -0.245158 0.195505 -0.949566 0.06974 -0.345483 -0.93583 -0.006893 -0.323083 -0.946346 0.169715 -0.300955 -0.938415 -0.116189 -0.315505 -0.941784 0.239136 -0.16692 -0.956531 0.255866 -0.011583 -0.966643 0.242803 0.152651 -0.95799 0.20225 0.315078 -0.927265 -0.03262 0.607099 -0.793957 0.060482 0.564264 -0.823376 -0.076308 0.598816 -0.797243 0.144813 0.453952 -0.87918 -0.202985 0.364192 -0.908934 -0.11608 0.523882 -0.843844 -0.061276 0.585859 -0.808093 -0.069249 0.590834 -0.803815 -0.061472 0.471179 -0.879893 -0.062085 0.339503 -0.938554 -0.069743 0.213082 -0.974542 -0.075706 0.107004 -0.991372 -0.074754 0.010258 -0.997149 -0.065912 -0.084881 -0.994209 -0.056368 -0.195516 -0.979079 -0.058266 -0.312571 -0.948106 -0.06995 -0.465685 -0.882182 -0.071192 -0.557979 -0.826796 -0.045759 -0.478407 -0.876945 -0.060654 -0.526507 -0.848004 -0.029987 -0.553196 -0.832511 -0.018383 -0.737566 -0.675025 -0.00908 -0.897437 -0.44105 -0.001567 -0.989994 -0.141104 -0.308311 -0.951069 -0.020317 -0.110716 -0.993809 -0.009213 -0.455218 -0.889798 -0.032192 -0.596473 -0.800897 -0.052764 -0.511404 0.823206 -0.246572 -0.95224 0.291333 -0.091451 -0.828385 0.538446 -0.154447 -0.712914 -0.697666 -0.070815 -0.964196 -0.256019 -0.069138 -0.99426 -0.077623 -0.073639 -0.993524 0.085059 -0.075332 -0.980406 0.180688 -0.078466 -0.618509 0.785229 -0.029372 -0.985083 0.143581 -0.094846 -0.540304 0.826149 -0.159842 -0.899961 0.302173 -0.314264 -0.858857 -0.489253 -0.151644 -0.711607 -0.680928 -0.173067 -0.767862 -0.270704 -0.580609 -0.848866 -0.38342 -0.363889 -0.671956 -0.656554 -0.342654 -0.602092 -0.614178 -0.510167 -0.382164 -0.137815 -0.91376 -0.607461 -0.181285 -0.773387 -0.492075 -0.563363 -0.66369 -0.327916 -0.537005 -0.777237 -0.137848 -0.132628 -0.981533 -0.138262 -0.548206 -0.824836 0.069956 -0.573928 -0.815912 0.118908 -0.117334 -0.985948 0.269632 -0.627689 -0.730278 0.418915 -0.085169 -0.904023 0.751137 0.018174 -0.659897 0.495872 -0.698086 -0.516515 -0.959308 0.03494 0.280191 -0.952246 0.032665 0.30358 -0.931439 0.167113 0.323256 -0.946666 0.171856 0.27256 -0.944873 0.025034 0.326479 -0.915523 0.15098 0.372858 -0.937561 0.012081 0.347611 -0.899991 0.123982 0.417906 -0.930687 -0.005709 0.365771 -0.88562 0.086935 0.456202 -0.924751 -0.02701 0.379614 -0.873362 0.042295 0.485232 -0.919722 -0.051962 0.389116 -0.863686 -0.010093 0.503929 -0.915882 -0.07818 0.393761 -0.857078 -0.06456 0.511126 -0.913923 -0.104025 0.392331 -0.85419 -0.11699 0.506629 -0.913693 -0.130232 0.384974 -0.854275 -0.170708 0.490992 -0.915233 -0.154922 0.371951 -0.856987 -0.224799 0.463722 -0.918585 -0.175592 0.354076 -0.86267 -0.271385 0.426792 -0.92433 -0.190963 0.330373 -0.87471 -0.302689 0.378498 -0.934899 -0.20202 0.291807 -0.900156 -0.325593 0.289324 -0.890605 -0.319629 0.323513 -0.930768 -0.199823 0.306172 -0.896015 0.289446 0.336717 -0.918723 0.296139 0.261248 -0.872121 0.265917 0.410723 -0.848721 0.226454 0.477904 -0.827128 0.172693 0.534823 -0.808599 0.107435 0.578469 -0.794367 0.032869 0.606548 -0.785332 -0.046839 0.6173 -0.781527 -0.126653 0.610881 -0.781925 -0.208794 0.587365 -0.785852 -0.293498 0.54433 -0.793926 -0.361166 0.489122 -0.811011 -0.403509 0.423605 -0.835249 -0.430591 0.341981 -0.847362 0.403787 0.344867 -0.877007 0.412522 0.246342 -0.816107 0.373007 0.441401 -0.785466 0.321457 0.528875 -0.757114 0.251747 0.602829 -0.732491 0.167253 0.659911 -0.712844 0.071978 0.697619 -0.699432 -0.030221 0.714059 -0.693359 -0.134971 0.707839 -0.69471 -0.244214 0.676563 -0.700164 -0.360048 0.616552 -0.70616 -0.453554 0.543716 -0.723571 -0.510433 0.464653 -0.757487 -0.546171 0.357646 -0.786224 0.510861 0.347668 -0.822285 0.521486 0.227814 -0.748155 0.473318 0.46501 -0.710822 0.410465 0.571184 -0.676281 0.325562 0.660798 -0.646302 0.222794 0.729833 -0.622399 0.10706 0.775344 -0.605757 -0.016287 0.795483 -0.597542 -0.142071 0.789151 -0.599085 -0.273393 0.752564 -0.60563 -0.422024 0.674617 -0.607327 -0.542223 0.580644 -0.620457 -0.609415 0.493606 -0.663097 -0.648857 0.373212 -0.713977 0.60914 0.345234 -0.755845 0.621474 0.206076 -0.669759 0.565415 0.481383 -0.626411 0.492244 0.604405 -0.586335 0.393519 0.708063 -0.551589 0.274196 0.78776 -0.523915 0.140003 0.840186 -0.50466 -0.002875 0.863313 -0.49473 -0.148064 0.856341 -0.496894 -0.296651 0.815533 -0.511217 -0.470317 0.719347 -0.523453 -0.603055 0.601932 -0.545143 -0.669199 0.504967 -0.589674 -0.712382 0.380521 -0.632099 0.697394 0.337775 -0.679096 0.71124 0.181568 -0.582486 0.648154 0.490516 -0.5339 0.565788 0.628358 -0.489044 0.454789 0.744314 -0.450209 0.320827 0.833296 -0.419313 0.170382 0.89171 -0.397824 0.010361 0.917403 -0.386724 -0.152177 0.909553 -0.388886 -0.314587 0.865911 -0.416833 -0.497639 0.760661 -0.461005 -0.625946 0.62902 -0.542095 0.774686 0.325568 -0.59349 0.789827 0.154737 -0.487905 0.720667 0.492532 -0.43493 0.630343 0.643043 -0.38611 0.508755 0.769472 -0.343915 0.36222 0.866325 -0.310386 0.197876 0.929788 -0.287067 0.023241 0.957628 -0.274986 -0.154067 0.949024 -0.274134 -0.330452 0.903134 -0.301719 -0.514593 0.802596 -0.360872 -0.638403 0.679863 -0.445437 0.840326 0.308929 -0.500465 0.856536 0.126018 -0.38753 0.782322 0.48764 -0.33105 0.685367 0.648597 -0.279115 0.554983 0.783638 -0.234315 0.398046 0.886936 -0.198757 0.222249 0.954516 -0.17402 0.035609 0.984098 -0.16115 -0.153814 0.97487 -0.161642 -0.341921 0.925722 -0.183317 -0.527133 0.829775 -0.220874 -0.657099 0.720719 -0.343537 0.893826 0.288198 -0.401407 0.910873 0.095829 -0.282794 0.832673 0.476113 -0.223705 0.730484 0.645251 -0.169507 0.59318 0.787022 -0.12285 0.428085 0.89535 -0.085859 0.243336 0.966134 -0.060462 0.047524 0.997039 -0.048288 -0.151037 0.987348 -0.051166 -0.346804 0.936541 -0.071344 -0.536886 0.840633 -0.087804 -0.68822 0.72017 -0.21987 0.940432 0.259317 -0.280041 0.958155 0.059292 -0.156941 0.876708 0.4547 -0.09594 0.770249 0.630486 -0.04016 0.627311 0.777732 0.007748 0.4556 0.890151 0.046906 0.262807 0.963708 0.076495 0.059131 0.995315 0.087975 -0.141669 0.985997 0.082651 -0.346527 0.934392 0.066742 -0.54311 0.837005 0.044894 -0.706862 0.705925 -0.074457 0.972487 0.220737 -0.135905 0.990585 0.016456 -0.010481 0.907321 0.420308 0.052437 0.798073 0.600275 0.112276 0.651464 0.750326 0.172846 0.475283 0.862688 0.224613 0.286577 0.931355 0.237251 0.088995 0.967363 0.218283 -0.113022 0.969319 0.208531 -0.342411 0.916117 0.208339 -0.548429 0.809827 0.177582 -0.726081 0.664283 0.072466 0.981536 0.177017 0.011192 0.999581 -0.026694 0.13045 0.917735 0.37516 0.173769 0.810669 0.559124 0.202231 0.677503 0.707172 0.281781 0.466259 0.838571 0.389458 0.279968 0.877462 0.380119 0.146892 0.913199 0.357392 -0.04095 0.933056 0.345942 -0.321256 0.881544 0.344131 -0.559381 0.7541 0.33176 -0.740655 0.584264 0.196149 0.971316 0.134431 0.140051 0.988071 -0.06404 0.222274 0.915545 0.335219 0.21521 0.826535 0.52012 0.485052 0.203685 0.850434 0.549193 0.08539 0.831322 0.518864 -0.274118 0.809716 0.494356 -0.559536 0.665231 0.486225 -0.71695 0.499567 0.288962 0.953067 0.090359 0.249178 0.963755 -0.095325 0.279428 0.910565 0.304616 0.388149 0.921066 0.031277 0.35571 0.926126 -0.125541 0.404047 0.903787 0.141123 0.685474 -0.217015 0.695004 0.70254 0.095579 0.705197 0.629526 -0.529045 0.569042 0.593735 -0.693072 0.408815 0.496704 0.867491 -0.02729 0.458288 0.875309 -0.154295 0.528057 0.848537 0.033781 0.80676 -0.152043 0.570983 0.808454 0.086816 0.582121 0.751948 -0.463858 0.468413 0.679152 -0.659904 0.32137 0.597194 0.799139 -0.068818 0.55546 0.811568 -0.181167 0.64161 0.766826 -0.017747 0.890952 -0.10638 0.441461 0.86652 0.068016 0.494487 0.874767 -0.373412 0.308782 0.812868 -0.546799 0.200642 0.71299 0.692171 -0.111997 0.675203 0.706014 -0.213647 0.759985 0.647969 -0.050594 0.881663 0.086623 0.46386 0.915062 -0.143099 0.377072 0.919428 -0.337742 0.201451 0.893268 -0.4335 0.118956 0.740474 -0.669061 0.063685 0.859372 -0.511103 0.015909 0.647034 -0.745123 -0.161673 0.622084 -0.770365 0.13982 0.519702 -0.840963 -0.150634 0.820483 0.555117 -0.136576 0.782454 0.574047 -0.241321 0.857426 0.511441 -0.057005 0.806656 0.536768 -0.247358 0.862458 0.496213 -0.099695 0.878975 0.473395 -0.057451 0.818207 0.51631 -0.252905 -0.955041 -0.087041 0.283408 0.458096 0.336508 0.822746 0.548616 0.436793 0.712904 0.498815 0.508154 0.702113 0.409055 0.43883 0.800064 0.458654 0.419397 0.783417 0.488571 0.295924 0.820809 0.338617 0.547524 0.765217 0.401093 0.540762 0.739392 0.447936 0.573943 0.685523 0.57256 0.090515 0.814851 0.659916 0.242583 0.711101 0.600733 0.356615 0.715504 0.50784 0.222844 0.832129 0.52547 0.175403 0.832535 0.592655 0.076762 0.80179 0.696504 -0.16077 0.699311 0.747172 -0.06053 0.661869 0.716343 0.089713 0.691957 0.643576 -0.04443 0.764091 0.679851 -0.004008 0.733339 0.751893 -0.071524 0.655394 0.836604 -0.293056 0.46283 0.828258 -0.230458 0.510762 0.762898 -0.199338 0.615021 0.753722 -0.259335 0.603861 0.803611 -0.130312 0.580714 0.857272 -0.175102 0.484174 0.916816 -0.199648 0.345817 0.913843 -0.162988 0.371922 0.958869 -0.051912 0.279061 0.954632 -0.015404 0.297391 0.878595 0.023662 0.476981 0.887849 -0.142316 0.437574 0.881607 0.374145 0.287723 0.786263 0.361349 0.501215 0.845784 0.202983 0.493403 0.93839 0.191482 0.28768 0.964719 0.141263 0.222175 0.91988 0.344652 0.18718 0.735863 0.601166 0.311616 0.665177 0.537764 0.518025 0.72411 0.464671 0.509653 0.811269 0.503435 0.297313 0.847371 0.503019 0.170099 0.757315 0.630389 0.170538 0.550937 0.76696 0.328999 0.550197 0.662462 0.508358 0.604133 0.603421 0.520486 0.650197 0.687413 0.323586 0.647224 0.739856 0.183613 0.520687 0.823175 0.226423 0.23274 0.841014 0.488392 0.333284 0.772356 0.540729 0.454201 0.758229 0.467751 0.39101 0.84687 0.360447 0.372508 0.869047 0.325569 0.284845 0.827646 0.483597 0.339999 0.673243 0.656616 0.238772 0.704795 0.668021 0.320576 0.691678 0.647157 0.829948 0.324212 0.453953 0.788174 0.413086 0.456226 0.818935 0.437732 0.371128 0.868596 0.367437 0.332463 0.594782 0.761687 -0.257038 0.732869 0.586054 -0.345607 0.753876 0.53386 0.382968 0.862993 0.204714 0.461882 0.86722 0.193655 0.458724 0.940854 -0.000458 0.338812 0.908491 -0.022391 0.417304 0.966399 -0.169019 -0.193661 0.923421 -0.383403 0.017201 0.951126 0.102708 0.291222 0.867322 0.198025 0.456661 0.856876 0.261314 0.444386 0.920107 0.262227 0.29093 0.845965 0.375507 -0.378599 0.934229 0.11539 -0.337494 0.724278 0.540157 0.428547 0.705129 0.593606 0.387848 0.719253 0.596045 0.356938 0.40553 0.913994 -0.012695 0.486479 0.862074 -0.142007 0.717856 0.605776 0.343102 0.730074 0.584365 0.354273 0.725706 0.562021 0.396841 0.693875 0.591778 0.410289 0.217409 0.868421 0.44562 0.312448 0.932857 0.179314 0.629761 0.545599 0.552922 0.214438 0.527563 0.822006 0.173051 0.702268 0.690559 0.576994 0.45965 0.67513 0.602466 0.389187 0.696827 0.688089 0.494063 0.531447 0.68934 0.382272 0.615368 0.751634 0.334485 0.568477 0.797561 0.361626 0.482828 0.671307 0.364972 0.645091 0.411192 0.319361 0.853774 0.313465 0.402297 0.860172 0.718019 0.380024 0.583121 0.802639 0.402776 0.439933 0.786622 0.41627 0.45601 0.726027 0.396227 0.56204 0.493875 0.121564 0.860994 0.469701 0.240945 0.849309 0.710331 0.363162 0.602946 0.767298 0.380841 0.51596 0.773688 0.312309 0.551243 0.718925 0.257257 0.645729 0.615731 -0.251593 0.74671 0.530838 -0.044525 0.846303 0.775476 0.113015 0.62118 0.813297 0.246182 0.527202 0.846512 0.21287 0.48796 0.849496 0.012345 0.527451 0.842447 -0.473971 0.256191 0.735799 -0.426285 0.526195 0.717886 0.082983 0.691197 0.784229 0.042303 0.619028 0.717886 0.082983 0.691197 0.6324 0.126373 0.764264 0.528397 0.414857 0.740736 0.538735 0.293136 0.789833 0.528397 0.414857 0.740736 0.489731 0.521318 0.69885 0.566743 0.187763 0.802214 0.6324 0.126373 0.764264 0.566743 0.187763 0.802214 0.538735 0.293136 0.789833 0.822361 -0.008804 0.568897 0.860775 -0.076325 0.503231 0.822361 -0.008804 0.568897 0.784229 0.042303 0.619028 0.412307 0.657775 0.630345 0.489731 0.521318 0.69885 0.412307 0.657775 0.630345 0.342528 0.801993 0.489368 0.907019 -0.108815 0.406786 0.950138 -0.042902 0.308863 0.907019 -0.108815 0.406786 0.860775 -0.076325 0.503231 0.385817 0.862741 0.326839 0.342528 0.801993 0.489368 0.385817 0.862741 0.326839 0.515096 0.833089 0.201592 0.963907 0.127114 0.233935 0.926348 0.333234 0.175596 0.963907 0.127114 0.233935 0.950138 -0.042902 0.308863 0.640156 0.755357 0.140129 0.515096 0.833089 0.201592 0.640156 0.755357 0.140129 0.758869 0.63844 0.128497 0.854654 0.50003 0.139773 0.758869 0.63844 0.128497 0.854654 0.50003 0.139773 0.926348 0.333234 0.175596 -0.035406 0.929348 -0.367504 0.063465 0.812158 -0.579976 0.063465 0.812158 -0.579976 0.138899 0.626319 -0.767093 0.396879 0.179876 -0.900073 0.563372 -0.104352 -0.819587 0.563372 -0.104352 -0.819587 0.678124 -0.411193 -0.609154 0.138899 0.626319 -0.767093 0.249398 0.412636 -0.876089 0.396879 0.179876 -0.900073 0.249398 0.412636 -0.876089 -0.257986 0.943569 0.207654 -0.166459 0.978908 -0.11845 -0.035406 0.929348 -0.367504 -0.166459 0.978908 -0.11845 0.678124 -0.411193 -0.609154 0.666104 -0.677096 -0.312805 0.666104 -0.677096 -0.312805 0.577645 -0.815992 0.021959 -0.159274 0.583893 0.796053 -0.249913 0.792509 0.556302 -0.257986 0.943569 0.207654 -0.249913 0.792509 0.556302 0.577645 -0.815992 0.021959 0.478517 -0.784466 0.394506 0.478517 -0.784466 0.394506 0.373276 -0.58569 0.719467 0.06516 0.225276 0.972114 -0.043199 0.395894 0.91728 -0.159274 0.583893 0.796053 -0.043199 0.395894 0.91728 0.373276 -0.58569 0.719467 0.28278 -0.35326 0.891764 0.28278 -0.35326 0.891764 0.210318 -0.150831 0.965928 0.210318 -0.150831 0.965928 0.146224 0.048119 0.988081 0.06516 0.225276 0.972114 0.146224 0.048119 0.988081 0.856807 0.237311 0.457783 0.923374 0.210648 0.320948 0.807883 0.342492 0.479609 0.926317 0.306424 0.219184 0.89303 0.401371 0.203464 0.707506 0.350532 0.613647 0.690024 0.404142 0.600447 0.701485 0.296816 0.647934 0.791752 0.518612 0.322755 0.75672 0.567342 0.324806 0.829448 0.472739 0.297547 0.598548 0.538422 0.593163 0.612014 0.432346 0.662205 0.636105 0.597406 0.48834 0.661735 0.334885 0.67079 0.723219 0.374625 0.580181 0.790329 0.347695 0.504469 0.811979 0.371805 0.449947 0.863789 0.442519 0.240928 0.701112 0.600433 0.384607 0.932764 0.160582 0.322746 0.970851 0.170411 0.16855 0.883636 0.175726 0.433944 0.958132 0.276011 0.076161 0.918468 0.391159 0.058409 0.596053 0.268918 0.756574 0.631701 0.239492 0.73729 0.526217 0.296747 0.796892 0.713347 0.696389 0.078596 0.607872 0.785113 0.118696 0.815342 0.574917 0.068473 0.317458 0.747594 0.583373 0.32877 0.607439 0.723138 0.38248 0.824584 0.416858 0.421224 0.422337 0.802622 0.694415 0.183055 0.695901 0.790984 0.142678 0.594969 0.85152 0.154666 0.50099 0.882062 0.467132 0.061279 0.494096 0.834445 0.244072 0.89839 0.239418 0.368204 0.928432 0.290661 0.231365 0.927903 0.362198 0.088369 0.906133 0.422892 -0.009259 0.502351 -0.531313 -0.682166 0.481402 0.03509 -0.875797 0.821596 0.007771 -0.570017 0.60106 0.059815 -0.796962 0.288313 0.933791 -0.211921 0.988467 0.045861 -0.144328 0.606734 0.786578 -0.114758 0.631178 0.754277 -0.180775 0.972577 0.018811 -0.231818 0.505485 0.858174 -0.089566 0.979449 0.125393 -0.157974 0.681304 -0.70444 -0.198968 0.649901 -0.67027 -0.358283 0.486331 -0.865846 -0.117446 0.446355 -0.866556 -0.223264 0.749971 -0.639348 -0.169641 0.164384 0.814398 0.556537 0.23088 0.745782 0.624902 0.513065 0.656839 0.552564 0.434027 0.729307 0.528897 0.671598 0.573694 0.468862 0.412743 0.628292 0.659463 0.124146 -0.973252 0.193309 0.05331 -0.971601 0.230543 0.174554 -0.974418 0.141566 0.18485 -0.973904 0.131684 0.162256 -0.986486 -0.022772 0.174554 -0.974418 0.141566 0.164893 -0.986064 -0.022075 0.404318 0.749496 0.524197 0.430589 0.757479 0.490733 0.671598 0.573694 0.468862 0.430589 0.757479 0.490733 0.245991 0.889625 0.384779 0.117529 0.901513 0.416487 0.316461 0.757984 0.570361 0.349515 0.870782 0.3458 0.299146 0.736414 0.6068 0.21028 0.76356 0.610539 0.17399 0.765394 0.619596 0.197236 0.787307 0.584162 0.208091 0.150686 0.966433 0.454121 0.145836 0.878923 0.34139 0.60658 0.717993 0.193891 0.65648 0.728999 0.702268 0.014837 0.711758 0.629728 0.408783 0.660559 0.464374 -0.299906 0.833315 0.195833 -0.470892 0.86018 0.247369 -0.957009 0.151468 0.400129 -0.846061 0.352246 0.156114 -0.842987 0.514782 0.487365 -0.796986 0.356774 0.242334 -0.955276 0.169473 0.220096 -0.968069 0.120002 0.144734 -0.978459 0.147209 0.183196 -0.982605 -0.030449 0.067654 -0.997702 0.003633 0.333632 0.885236 0.32411 0.262641 0.7868 0.558538 0.249014 0.818005 0.518518 0.310879 0.905695 0.288221 0.981634 -0.064618 0.179498 0.953489 -0.110064 0.280614 0.829075 -0.397083 0.393648 0.928588 0.156124 0.336675 0.777768 -0.421749 0.466052 0.769166 -0.579043 0.270356 0.99593 0.044411 0.078425 0.45297 -0.77236 0.445285 0.255608 -0.911572 0.322028 0.985608 -0.0138 -0.168484 0.724075 -0.68915 0.028062 0.669056 -0.721513 -0.178277 0.95985 -0.037465 -0.277999 0.142973 -0.970852 0.192368 0.080184 -0.99678 0.000349 0.399727 0.880191 0.255895 0.376443 0.743845 0.552255 0.932957 0.251932 0.25714 0.923536 0.376623 0.072366 0.341103 0.563925 0.752088 0.901142 0.062614 0.428978 0.473297 -0.704992 -0.528182 0.538546 0.034106 -0.841906 0.284694 -0.650003 -0.704589 0.28858 -0.71782 -0.633605 0.664843 -0.691251 -0.283118 0.687196 0.601578 -0.407266 0.194534 0.943344 -0.26881 0.142699 0.967472 -0.208889 0.158041 0.977382 -0.140528 0.267199 0.95697 -0.113199 0.206582 0.964838 -0.162517 0.111154 0.975921 -0.187678 0.290051 0.951394 -0.103532 0.197673 0.977651 -0.071585 0.133242 0.73077 0.669493 -0.021126 0.776463 0.629809 -0.048851 0.69245 0.71981 -0.267324 0.736759 0.621066 0.502193 -0.841775 -0.198034 0.347481 -0.823245 -0.448916 0.32325 -0.832151 -0.450592 0.365505 -0.90999 -0.195768 0.278983 -0.744777 -0.606198 0.310509 -0.724258 -0.615657 0.470559 -0.845706 0.251705 0.639964 -0.75177 0.159022 0.847598 -0.526664 -0.06483 0.931787 0.360539 -0.042237 0.731097 -0.373814 0.570753 0.545811 -0.440048 0.713055 0.286543 -0.807822 -0.515088 0.336234 -0.798387 -0.499524 0.390303 -0.778952 -0.490812 0.394906 -0.900383 -0.182645 0.453719 -0.877221 -0.156916 0.356795 -0.910868 -0.207406 -0.344168 0.695094 0.631183 -0.149439 0.640447 0.753323 -0.149048 0.665505 0.73136 -0.349751 0.693841 0.629491 -0.13624 0.702351 0.698672 -0.323456 0.705396 0.630708 0.682952 -0.682471 -0.260403 0.598976 -0.703987 -0.381615 0.629926 -0.65618 -0.415476 0.770976 -0.571235 -0.281578 0.427027 -0.693701 -0.580024 0.470893 -0.685647 -0.555112 0.547209 -0.734999 -0.400423 0.403884 -0.692271 -0.598029 0.639201 -0.729925 -0.24214 0.756326 -0.646175 0.102123 0.818367 -0.573534 0.036536 0.814857 -0.159418 0.557309 0.75347 -0.300751 0.584664 0.91633 -0.395267 -0.064054 -0.552303 0.717523 0.424408 -0.549872 0.723501 0.417357 -0.689144 0.695597 0.20304 -0.69216 0.693835 0.198768 -0.44995 0.772189 0.44863 -0.582334 0.776775 0.239806 0.459095 -0.73614 -0.497323 0.42852 -0.755071 -0.496224 0.469999 -0.756335 -0.455037 0.6044 -0.773478 -0.19087 0.573058 -0.784785 -0.236043 0.620503 -0.767488 -0.161053 -0.154628 0.83046 0.535188 -0.208055 0.933431 0.292266 0.84 -0.487972 -0.237242 0.649726 -0.668912 -0.361127 0.686327 -0.68519 -0.243864 0.87045 -0.456196 -0.184937 0.113929 -0.971139 0.209547 0.420145 -0.778454 0.466356 0.36716 -0.763208 0.531702 -0.025902 -0.968892 0.246126 0.73528 0.502717 0.454576 0.760751 -0.231881 0.606209 0.709768 -0.164691 0.684913 0.677072 0.518378 0.522357 0.15018 0.985892 -0.073907 0.110775 0.979195 -0.170016 0.149236 0.977328 -0.150198 0.102067 0.98066 -0.166995 0.092939 0.97652 -0.194346 0.035068 -0.98169 0.187228 -0.094114 -0.972522 0.212938 -0.040176 -0.998572 0.035218 -0.134395 -0.988941 0.062717 0.104978 0.981239 -0.161706 0.15135 0.986053 -0.069232 0.069999 0.986192 -0.150087 0.095114 0.99265 -0.074833 -0.031978 -0.959849 0.278687 0.395865 -0.77131 0.498369 0.753958 -0.269609 0.599048 0.811468 0.34565 0.471218 0.245719 0.963493 -0.10632 0.226765 0.963216 -0.144195 -0.201792 -0.975971 0.082225 -0.14467 -0.963789 0.224014 0.238383 0.953883 -0.182431 0.26323 0.95727 -0.119769 0.137236 0.954 0.266552 0.004079 0.860298 0.509775 -0.324346 0.823278 0.465847 -0.221073 0.946641 0.234514 0.552699 -0.819884 -0.149376 0.435649 -0.752677 -0.493646 0.365213 -0.70187 -0.611554 0.358282 0.298735 0.884529 0.369091 0.261787 0.891762 0.680602 -0.368607 0.633175 0.350239 0.273854 0.895732 -0.101408 0.652873 0.750649 -0.314146 0.712795 0.627085 0.528337 -0.819105 -0.223443 0.449038 -0.780507 -0.434941 0.341921 0.423681 0.838799 0.504872 0.340182 0.793335 0.412743 0.628292 0.659463 0.111975 0.119931 0.986447 0.465714 -0.606639 0.644282 0.117529 0.901513 0.416487 0.064578 0.996126 -0.059695 -0.173805 0.984758 0.006635 0.286402 0.951055 -0.116053 0.288677 0.95033 -0.116352 0.27569 0.953941 -0.118283 0.149938 0.985468 -0.079819 -0.160194 0.986884 0.019954 -0.55782 0.804212 0.205135 -0.528743 0.838025 0.134706 -0.690008 0.699754 0.185023 -0.704064 0.68439 0.189486 -0.638988 0.750436 0.168941 -0.301259 0.95128 0.065647 0.321998 0.939605 -0.116017 0.978364 -0.179417 -0.10302 0.950507 -0.146431 -0.274034 0.864768 0.428118 -0.262471 0.864506 -0.440507 -0.242037 0.7207 -0.665319 -0.194789 0.631828 -0.756971 -0.166699 0.640225 -0.749292 -0.169331 0.627461 -0.760893 -0.165332 0.542026 -0.82882 -0.1388 0.434782 -0.89428 -0.10596 0.396519 -0.913162 -0.094385 0.378162 -0.921221 -0.09135 0.733821 0.635397 -0.240371 0.720346 0.687761 -0.089928 0.744498 0.624576 -0.235857 0.345811 0.928573 0.134788 0.993128 0.093742 0.070064 0.356147 0.925039 0.132145 0.187298 0.978167 -0.090051 0.502413 0.858884 0.0995 0.251381 0.962393 -0.102992 0.653389 -0.73589 0.177622 0.651183 0.755562 0.071326 0.961659 -0.257766 -0.093637 0.412743 0.628292 0.659463 0.370002 -0.806268 -0.461553 -0.486876 0.759449 0.431497 0.942604 0.183022 -0.279287 0.902756 0.332126 -0.273357 0.941168 0.315323 -0.121546 0.965429 0.179834 -0.188698 0.95667 0.29046 0.020405 0.996395 0.077162 -0.035246 0.964428 0.229746 0.130752 0.952512 0.132336 0.274242 0.99396 -0.055334 0.094767 0.940578 -0.003272 0.339562 0.996322 -0.078838 -0.033562 0.973141 -0.138974 0.183527 0.986334 -0.164013 0.015677 0.985059 0.038451 -0.167872 0.800063 -0.569924 -0.187312 0.874326 -0.431967 -0.221266 0.945303 -0.326076 -0.008725 0.111975 0.119931 0.986447 -0.05605 -0.447101 0.892726 -0.087746 -0.839628 0.536027 0.05331 -0.971601 0.230543 0.985131 -0.170097 0.024176 -0.087746 -0.839628 0.536027 -0.05605 -0.447101 0.892726 0.982942 -0.181369 -0.030498 0.887459 -0.394772 -0.237848 0.965429 0.179834 -0.188698 0.978679 0.180695 -0.097652 0.978679 0.180695 -0.097652 0.996395 0.077162 -0.035246 0.99396 -0.055334 0.094767 0.984881 -0.09216 0.146681 0.984881 -0.09216 0.146681 0.996322 -0.078838 -0.033562 0.985059 0.038451 -0.167872 0.993141 0.09046 -0.074075 0.993141 0.09046 -0.074075 0.982942 -0.181369 -0.030498 0.796327 -0.523685 0.302682 0.474068 -0.734713 0.485237 -0.961035 0.165055 0.22174 -0.966024 0.031777 0.256492 -0.974177 0.146618 0.171705 -0.972342 0.022707 0.232454 -0.984797 0.118512 0.127006 -0.976769 0.011627 0.213978 -0.992784 0.080853 0.088559 -0.980419 -0.006183 0.196824 -0.997692 0.034742 0.058339 -0.983095 -0.030994 0.180453 -0.999083 -0.016539 0.039487 -0.983548 -0.055734 0.171833 -0.996953 -0.071051 0.032183 -0.982319 -0.081528 0.168529 -0.991357 -0.125857 0.037019 -0.979445 -0.107793 0.170496 -0.982536 -0.178327 0.053122 -0.975175 -0.132451 0.177455 -0.971182 -0.224991 0.078648 -0.969885 -0.153649 0.188982 -0.957833 -0.26378 0.113909 -0.963939 -0.1701 0.204666 -0.939605 -0.296372 0.171192 -0.955633 -0.183403 0.230495 -0.916161 -0.318391 0.243466 -0.943663 -0.194823 0.267479 -0.940076 0.285909 0.185779 -0.959429 0.258908 0.111632 -0.975319 0.216331 0.044198 -0.986983 0.160295 -0.013021 -0.993968 0.093473 -0.057357 -0.996061 0.018712 -0.086674 -0.993226 -0.060574 -0.099156 -0.985627 -0.14059 -0.093666 -0.972896 -0.220357 -0.070117 -0.95571 -0.292575 -0.03191 -0.9339 -0.356776 0.023254 -0.90454 -0.412785 0.106841 -0.874166 -0.443368 0.198139 -0.904883 0.399169 0.147819 -0.930054 0.363859 0.051058 -0.950608 0.308199 -0.036848 -0.965594 0.235009 -0.111355 -0.974465 0.147826 -0.169011 -0.976977 0.050772 -0.207213 -0.973155 -0.051658 -0.22428 -0.963024 -0.155856 -0.21976 -0.94516 -0.26363 -0.192802 -0.918343 -0.367418 -0.14714 -0.88447 -0.460322 -0.076263 -0.846408 -0.531745 0.029003 -0.816832 -0.56147 0.132426 -0.856197 0.505244 0.107963 -0.886726 0.462193 -0.00969 -0.911552 0.394349 -0.116452 -0.92955 0.305228 -0.206817 -0.940102 0.199206 -0.276631 -0.942964 0.081323 -0.322808 -0.938209 -0.042978 -0.343389 -0.925518 -0.170788 -0.338006 -0.903043 -0.303137 -0.304337 -0.869126 -0.431085 -0.242459 -0.825612 -0.542655 -0.154564 -0.786775 -0.615382 -0.047848 -0.763773 -0.641757 0.069276 -0.79522 0.602617 0.066921 -0.8306 0.552502 -0.069607 -0.859285 0.473548 -0.193345 -0.879994 0.369943 -0.297915 -0.892052 0.246862 -0.378553 -0.895221 0.110192 -0.431784 -0.889623 -0.033783 -0.455444 -0.875482 -0.181863 -0.447724 -0.852675 -0.331111 -0.404116 -0.8198 -0.473091 -0.322666 -0.773173 -0.597366 -0.212974 -0.732325 -0.67211 -0.109399 -0.703797 -0.710152 0.018802 -0.723296 0.690072 0.025366 -0.762981 0.633663 -0.127797 -0.795102 0.544818 -0.266432 -0.818238 0.42836 -0.383398 -0.831658 0.290202 -0.473422 -0.835126 0.136998 -0.532726 -0.828809 -0.024241 -0.559007 -0.813773 -0.188227 -0.549858 -0.791068 -0.350443 -0.5014 -0.757685 -0.507144 -0.410754 -0.712164 -0.640648 -0.28704 -0.672677 -0.725926 0.143309 -0.641829 0.766679 -0.016088 -0.685243 0.704824 -0.183482 -0.720376 0.607426 -0.334802 -0.74567 0.479887 -0.46226 -0.76033 0.328788 -0.560176 -0.764118 0.161448 -0.624547 -0.757229 -0.014506 -0.652989 -0.740588 -0.191827 -0.643997 -0.71348 -0.368155 -0.596161 -0.673205 -0.539521 -0.505681 -0.633618 -0.666506 -0.392807 -0.552223 0.831753 -0.056886 -0.59877 0.765363 -0.235998 -0.636482 0.660845 -0.397712 -0.663669 0.524109 -0.533716 -0.679468 0.362307 -0.63801 -0.683614 0.183322 -0.706445 -0.676314 -0.004718 -0.736598 -0.658115 -0.193713 -0.727571 -0.624989 -0.385406 -0.67886 -0.573323 -0.567513 -0.590956 -0.539731 -0.669883 -0.50985 -0.455844 0.884809 -0.096532 -0.50491 0.81484 -0.284783 -0.544756 0.704708 -0.454563 -0.573567 0.56074 -0.597153 -0.590401 0.390548 -0.706328 -0.594951 0.202463 -0.777845 -0.587406 0.005007 -0.809277 -0.568326 -0.193393 -0.799753 -0.531726 -0.39925 -0.746904 -0.472075 -0.58863 -0.656247 -0.438248 -0.663696 -0.606174 -0.336647 0.931056 -0.140723 -0.387852 0.85817 -0.336326 -0.429607 0.74346 -0.512548 -0.459957 0.593608 -0.660355 -0.477854 0.416613 -0.773362 -0.482917 0.221174 -0.847274 -0.475294 0.016126 -0.879679 -0.455529 -0.189839 -0.869744 -0.417915 -0.406054 -0.812691 -0.353572 -0.6042 -0.714093 -0.307966 -0.666624 -0.6788 -0.193718 0.962912 -0.187812 -0.246275 0.88839 -0.387442 -0.288626 0.77069 -0.568094 -0.317016 0.616998 -0.720288 -0.324377 0.43558 -0.839672 -0.320356 0.248906 -0.914012 -0.326175 0.04118 -0.944412 -0.317904 -0.181756 -0.930538 -0.279527 -0.404391 -0.870823 -0.213284 -0.614523 -0.759521 -0.156715 -0.682531 -0.713857 -0.046462 0.971988 -0.230391 -0.103319 0.898967 -0.425657 -0.16437 0.783521 -0.599231 -0.218305 0.64374 -0.733445 -0.220035 0.426952 -0.877096 -0.163379 0.257771 -0.952293 -0.189124 0.091233 -0.977706 -0.196115 -0.13799 -0.970823 -0.158485 -0.396012 -0.904465 -0.068785 -0.626695 -0.776223 0.011491 -0.702816 -0.711279 0.080833 0.962058 -0.260598 -0.004405 0.897346 -0.441305 -0.108661 0.800533 -0.589355 -0.077279 0.160781 -0.98396 -0.047358 -0.005125 -0.998865 -0.055308 -0.376845 -0.924624 0.024218 -0.640501 -0.767575 0.122665 -0.746284 -0.654228 0.183006 0.94456 -0.272608 0.060297 0.892972 -0.446056 0.298798 0.913892 -0.274812 0.253353 0.891688 -0.375107 0.114851 -0.33834 -0.933989 0.102213 0.013376 -0.994673 0.151774 -0.614691 -0.774028 0.247576 -0.78954 -0.561545 0.422481 0.861531 -0.281556 0.416312 0.839566 -0.349019 0.371991 -0.274901 -0.886596 0.353483 0.017641 -0.935275 0.378306 -0.507377 -0.774244 0.386429 -0.730108 -0.563574 0.530364 0.793801 -0.297647 0.540475 0.75922 -0.362589 0.588909 -0.200338 -0.782976 0.568642 0.014771 -0.822452 0.58245 -0.344011 -0.736484 0.575736 -0.569219 -0.586956 0.652413 0.687715 -0.318443 0.658925 0.6426 -0.391004 0.527972 0.032779 -0.848629 0.572258 -0.222359 -0.789352 0.647457 -0.27021 -0.712591 0.719563 -0.352043 -0.598578 0.761442 -0.513317 -0.395869 0.588703 -0.723991 -0.359537 0.425423 -0.82584 -0.370141 0.758286 0.54836 -0.352567 0.752445 0.495497 -0.433945 0.762859 0.455485 -0.458889 0.774528 0.480978 -0.410812 -0.059483 0.299679 -0.952184 -0.090605 0.399189 -0.912381 0.036579 0.471045 -0.881351 0.073662 0.399253 -0.913877 -0.030005 0.266287 -0.963427 -0.038599 0.381265 -0.92366 -0.132901 0.509668 -0.850045 -0.066255 0.503241 -0.861603 0.001778 0.538122 -0.842865 0.050731 0.065718 -0.996548 -0.019211 0.193593 -0.980894 0.117679 0.320506 -0.939908 0.173066 0.20966 -0.962336 0.074023 0.047448 -0.996127 -0.002776 0.154099 -0.988052 0.222597 -0.189656 -0.956285 0.142066 -0.070766 -0.987324 0.235959 0.06094 -0.96985 0.284022 -0.085324 -0.955014 0.284229 -0.119428 -0.951289 0.185032 -0.046923 -0.981612 0.470004 -0.314803 -0.824618 0.324829 -0.28655 -0.901319 0.327451 -0.221031 -0.918652 0.436313 -0.25166 -0.863885 0.473579 -0.208925 -0.855613 0.371626 -0.174252 -0.911883 0.59372 -0.220325 -0.773921 0.645608 -0.038911 -0.762677 0.659385 -0.074781 -0.748077 0.577232 -0.188454 -0.794536 0.520238 -0.164922 -0.837946 0.486649 -0.003444 -0.873591 0.583798 0.350235 -0.732472 0.634015 0.167077 -0.755056 0.445881 0.172545 -0.878304 0.388815 0.329874 -0.860236 0.670902 0.324567 -0.666743 0.692143 0.119567 -0.711788 0.445222 0.577833 -0.684022 0.517715 0.479867 -0.708307 0.330547 0.433077 -0.83856 0.275441 0.506475 -0.817077 0.538798 0.612846 -0.578028 0.616803 0.484378 -0.62043 0.277888 0.745039 -0.606379 0.36548 0.664555 -0.65176 0.221829 0.572729 -0.78916 0.182137 0.632912 -0.752495 0.306833 0.806005 -0.506171 0.437578 0.723025 -0.534565 -0.077003 0.816147 -0.57269 0.125148 0.825525 -0.550315 0.121836 0.731545 -0.670819 -0.019521 0.744032 -0.667859 -0.030329 0.802339 -0.596097 0.128026 0.849417 -0.511958 -0.166791 0.672235 -0.721305 -0.074924 0.639929 -0.764773 -0.08644 0.658998 -0.747161 0.419307 0.406733 -0.811634 0.452871 0.310468 -0.835773 0.550382 0.354544 -0.755896 0.489061 0.426312 -0.760972 0.798456 0.589599 -0.121823 0.629651 0.764842 -0.13622 0.428157 0.516651 -0.741453 0.481993 0.162728 -0.860931 0.476594 0.173694 -0.861794 0.541782 -0.051832 -0.838919 0.610995 -0.026941 -0.791176 0.774058 -0.395394 -0.494467 0.920973 -0.172666 -0.349279 0.643944 0.078047 -0.761081 0.480769 0.233778 -0.845109 0.483134 0.167181 -0.859437 0.61672 0.24005 -0.749688 0.967778 0.117795 -0.222553 0.913203 0.379901 -0.147428 0.390583 0.591126 -0.705702 0.382913 0.53513 -0.753003 0.41411 0.577572 -0.703508 0.4764 0.860741 -0.179354 0.34037 0.907831 -0.244932 0.4215 0.58441 -0.693399 0.405455 0.540986 -0.736845 0.431484 0.576056 -0.694248 0.364968 0.565615 -0.739512 0.16023 0.921088 -0.354857 -0.06388 0.850389 -0.522262 0.231918 0.516483 -0.824293 -0.235018 0.674549 -0.699821 -0.263861 0.488622 -0.83164 0.143751 0.349007 -0.926029 0.121946 0.430142 -0.894487 0.244204 0.368163 -0.897118 0.28685 0.465637 -0.837197 0.431849 0.3089 -0.8474 0.349117 0.306222 -0.885633 0.242845 0.317455 -0.916651 -0.193261 0.358349 -0.913365 -0.108962 0.280342 -0.953696 0.308778 0.342284 -0.887411 0.400312 0.380088 -0.833837 0.437109 0.358487 -0.824877 0.306968 0.362843 -0.879838 -0.062587 0.201397 -0.977508 -0.048046 0.078069 -0.99579 0.266944 0.326921 -0.906567 0.35021 0.27807 -0.894444 0.354965 0.347412 -0.867931 0.255425 0.219956 -0.941476 -0.00699 -0.087705 -0.996122 0.120739 -0.291331 -0.948972 0.318315 0.076311 -0.944909 0.448575 0.180922 -0.875241 0.399053 0.212925 -0.891863 0.432383 -0.021143 -0.901442 0.342735 -0.45784 -0.820314 0.578427 -0.495167 -0.648253 0.327081 -0.016361 -0.944855 0.235034 0.026083 -0.971637 0.235034 0.026083 -0.971637 0.123423 0.087662 -0.988475 0.030247 0.267878 -0.962978 0.043904 0.378525 -0.924549 0.043904 0.378525 -0.924549 0.03052 0.484447 -0.874288 0.123423 0.087662 -0.988475 0.047495 0.167443 -0.984737 0.047495 0.167443 -0.984737 0.030247 0.267878 -0.962978 0.465663 -0.119132 -0.876907 0.391041 -0.061614 -0.918308 0.391041 -0.061614 -0.918308 0.327081 -0.016361 -0.944855 0.03052 0.484447 -0.874288 0.000362 0.624694 -0.78087 0.000362 0.624694 -0.78087 0.015518 0.775735 -0.630868 0.635813 -0.066864 -0.768941 0.552606 -0.139163 -0.821742 0.552606 -0.139163 -0.821742 0.465663 -0.119132 -0.876907 0.015518 0.775735 -0.630868 0.138643 0.842895 -0.51991 0.138643 0.842895 -0.51991 0.315347 0.81705 -0.482686 0.68312 0.313511 -0.659589 0.685418 0.105132 -0.720521 0.685418 0.105132 -0.720521 0.635813 -0.066864 -0.768941 0.315347 0.81705 -0.482686 0.454804 0.740477 -0.49482 0.454804 0.740477 -0.49482 0.562612 0.622685 -0.543812 0.562612 0.622685 -0.543812 0.639517 0.482489 -0.598517 0.639517 0.482489 -0.598517 0.68312 0.313511 -0.659589 0.354135 0.838779 0.413567 0.154696 0.945163 0.28764 0.354135 0.838779 0.413567 0.524773 0.658667 0.539233 0.917154 -0.078299 0.390765 0.819532 0.201619 0.536392 0.917154 -0.078299 0.390765 0.904413 -0.393024 0.16604 0.683487 0.434713 0.586405 0.524773 0.658667 0.539233 0.683487 0.434713 0.586405 0.819532 0.201619 0.536392 -0.088432 0.984424 0.151949 -0.342777 0.937241 -0.063904 -0.088432 0.984424 0.151949 0.154696 0.945163 0.28764 0.738281 -0.6713 -0.065553 0.904413 -0.393024 0.16604 0.738281 -0.6713 -0.065553 0.485451 -0.823393 -0.293874 -0.526546 0.771976 -0.356093 -0.578929 0.552074 -0.600047 -0.526546 0.771976 -0.356093 -0.342777 0.937241 -0.063904 0.201162 -0.806729 -0.555628 0.485451 -0.823393 -0.293874 0.201162 -0.806729 -0.555628 -0.064801 -0.620857 -0.781241 -0.553229 0.356102 -0.753079 -0.489535 0.180502 -0.853097 -0.553229 0.356102 -0.753079 -0.578929 0.552074 -0.600047 -0.236666 -0.394964 -0.887689 -0.064801 -0.620857 -0.781241 -0.236666 -0.394964 -0.887689 -0.340184 -0.195029 -0.919912 -0.414881 0.001699 -0.909874 -0.340184 -0.195029 -0.919912 -0.414881 0.001699 -0.909874 -0.489535 0.180502 -0.853097 0.612446 0.206799 -0.762984 0.464896 0.248372 -0.849814 0.407418 0.351969 -0.842691 0.648174 0.357769 -0.672214 0.67175 0.259946 -0.693672 0.260774 0.444268 -0.857102 0.266259 0.359017 -0.894546 0.23952 0.282378 -0.92892 0.456139 0.54321 -0.704883 0.485 0.494854 -0.721038 0.523396 0.452675 -0.721901 0.154425 0.395608 -0.905344 0.178861 0.504727 -0.844547 0.266144 0.567704 -0.779025 0.193271 0.300008 -0.934153 0.427529 0.439369 -0.790047 0.30767 0.464103 -0.830631 0.465677 0.41908 -0.779434 0.585969 0.418408 -0.693956 0.376687 0.574387 -0.726765 0.723989 0.167915 -0.669062 0.615206 0.144242 -0.775058 0.538482 0.19443 -0.819899 0.755978 0.352655 -0.551481 0.765033 0.251831 -0.59271 0.10429 0.25187 -0.962125 0.084605 0.265317 -0.960442 0.005849 0.281942 -0.959414 0.438739 0.771535 -0.460698 0.549064 0.684585 -0.47945 0.639075 0.567112 -0.519584 -0.119331 0.571463 -0.811906 -0.05548 0.717653 -0.694188 0.087904 0.800933 -0.592266 -0.082243 0.383976 -0.919673 0.371972 0.25102 -0.893659 0.168158 0.254222 -0.952415 0.515848 0.24491 -0.820926 0.711725 0.448678 -0.540496 0.274784 0.816837 -0.507219 0.645681 0.281912 -0.709663 0.539239 0.220462 -0.812784 0.769033 0.394069 -0.503287 0.726738 0.338645 -0.597638 0.910648 0.13263 0.391317 0.999593 0.019615 0.020732 0.954033 0.02481 0.298674 0.445681 0.894715 -0.029203 0.965907 0.006398 -0.258812 0.638115 0.749792 -0.174987 0.564465 0.80877 -0.16514 0.95591 0.074364 -0.284087 0.833041 -0.550981 -0.049633 0.747784 -0.638846 -0.180817 0.496235 -0.862298 -0.10096 -0.20791 0.848121 -0.487304 0.067716 0.763957 -0.641704 0.127353 0.626153 -0.769229 -0.218772 0.72838 -0.649309 0.372493 0.501153 -0.781086 -0.001976 0.635051 -0.772468 0.017323 -0.981176 -0.192335 0.100694 -0.980828 -0.166846 0.090117 -0.981619 -0.168234 -0.055458 -0.980045 -0.190882 0.164893 -0.986064 -0.022075 0.090117 -0.981619 -0.168234 0.372493 0.501153 -0.781086 0.078895 0.682679 -0.726447 0.016606 0.67434 -0.738234 0.078895 0.682679 -0.726447 -0.201579 0.842141 -0.500164 -0.052373 0.836039 -0.546165 0.07316 0.824548 -0.561042 -0.110485 0.686575 -0.718615 -0.15501 0.743094 -0.650987 -0.209717 0.80644 -0.552877 -0.277232 0.748353 -0.602586 -0.254313 0.755765 -0.603443 -0.358088 0.092571 -0.929087 -0.250906 0.673343 -0.695453 -0.112669 0.603166 -0.789618 -0.091999 0.08968 -0.991713 0.154606 0.382327 -0.911001 0.205444 -0.026492 -0.97831 -0.072558 -0.353021 -0.932798 -0.315092 -0.516195 -0.796404 0.13782 -0.965905 -0.219165 -0.147076 -0.862048 -0.485017 0.153538 -0.866541 -0.474904 0.229067 -0.817724 -0.528068 0.125207 -0.96468 -0.231767 0.05519 -0.985648 -0.159539 0.133222 -0.975043 -0.177602 0.081618 0.84569 -0.527396 0.078783 0.875266 -0.477182 -0.135905 0.783091 -0.606876 -0.143137 0.731129 -0.667054 0.652226 -0.134275 -0.746037 0.728512 -0.084547 -0.679796 0.489924 -0.423039 -0.762242 0.60415 0.140094 -0.784459 0.789901 0.03703 -0.612116 0.511142 -0.597091 -0.618236 0.415468 -0.442457 -0.794744 0.053816 -0.927772 -0.369246 0.152168 -0.796509 -0.585165 0.917438 -0.016262 -0.397547 0.603226 -0.69911 -0.38388 0.02941 -0.980046 -0.196582 0.188294 0.863216 -0.468405 0.734914 0.36148 -0.573788 0.645073 0.228818 -0.729057 0.011027 0.714507 -0.699541 0.528237 0.032676 -0.848468 -0.123952 0.526587 -0.841036 0.708983 -0.679175 0.189905 0.54883 -0.680138 0.486003 0.696643 -0.536166 0.47667 0.93705 0.142013 0.319015 0.883644 -0.39109 0.257335 0.772063 0.621063 -0.134906 0.801974 -0.58299 -0.130233 0.360444 0.931913 0.040218 0.246723 0.968981 0.014266 0.199406 0.97991 0.003676 0.202578 0.978354 0.042268 0.2974 0.95475 0.002265 0.296891 0.953345 -0.054681 -0.448241 0.750304 -0.485927 -0.29922 0.711331 -0.635984 -0.449947 0.662018 -0.599399 -0.604384 0.702652 -0.375501 0.543727 -0.837742 -0.050487 0.418255 -0.908306 0.006517 0.525653 -0.828012 0.195157 0.513357 -0.837463 0.187406 0.632464 -0.69016 0.351665 0.562968 -0.723476 0.399561 0.270896 -0.86072 -0.431018 0.466068 -0.760811 -0.451605 0.785459 -0.470969 -0.401549 0.80717 0.379356 -0.45229 0.311666 -0.406113 -0.859032 0.080125 -0.476446 -0.875545 0.492223 -0.783278 0.379726 0.564233 -0.759375 0.324023 0.615454 -0.747387 0.250257 0.467322 -0.880776 -0.07644 0.423551 -0.905124 -0.036805 0.38818 -0.92131 -0.022438 -0.638299 0.67148 -0.376416 -0.642081 0.670371 -0.371935 -0.5273 0.635136 -0.564408 -0.539124 0.609161 -0.581609 -0.499391 0.673195 -0.54536 -0.620714 0.681531 -0.387595 0.724375 -0.679145 -0.118503 0.808567 -0.568216 -0.152806 0.762726 -0.645517 0.039449 0.719028 -0.694348 0.029644 0.704111 -0.666921 0.243811 0.680626 -0.67334 0.288724 0.675454 -0.668576 0.311077 0.688802 -0.721754 0.067992 0.678716 -0.726029 -0.110572 0.590841 -0.659385 -0.464885 0.324611 -0.335182 -0.884466 0.389289 -0.193584 -0.900544 0.677493 -0.584843 -0.446051 0.811922 -0.403648 -0.421723 -0.702861 0.705436 -0.091357 -0.699138 0.693275 0.174862 -0.698916 0.694811 0.169568 -0.697097 0.711681 -0.086984 -0.629665 0.772974 0.077672 -0.630289 0.75771 -0.169148 0.665438 -0.718371 0.202818 0.637598 -0.738285 0.220009 0.650436 -0.741847 0.16308 0.619921 -0.781023 -0.075507 0.621911 -0.772072 -0.130886 0.619377 -0.767579 -0.164909 -0.428598 0.808465 -0.403346 -0.344315 0.922491 -0.174518 0.841866 -0.487823 -0.230847 0.839011 -0.458721 -0.292635 0.718361 -0.682618 -0.134126 0.750354 -0.660833 -0.01641 -0.004393 -0.980638 -0.19578 0.11324 -0.803094 -0.584993 0.033243 -0.790017 -0.612184 -0.141971 -0.97821 -0.151488 0.398832 0.500369 -0.768482 0.284866 0.522089 -0.803912 0.240801 -0.182237 -0.953312 0.326027 -0.256899 -0.909785 0.106099 0.992627 0.058613 0.101916 0.991713 -0.078224 0.185122 0.981751 0.043528 0.161247 0.983157 0.086038 0.203665 0.9761 0.07583 -0.181238 -0.979627 -0.086513 -0.058426 -0.98924 -0.134132 0.186936 0.98177 0.034395 0.160893 0.986549 0.028903 -0.164715 -0.970507 -0.176028 0.07547 -0.797033 -0.599202 0.419602 0.33226 -0.844711 0.322596 -0.288795 -0.901404 0.338122 0.937702 -0.079923 0.299592 0.953205 -0.040561 -0.230193 -0.970709 -0.068807 0.273764 0.960656 -0.046823 -0.093643 0.935084 -0.341831 -0.357731 0.927415 -0.109222 -0.580211 0.784643 -0.218382 -0.370228 0.823898 -0.429096 0.555427 -0.82036 -0.136052 0.648216 -0.730747 0.214069 0.665059 -0.670139 0.329559 -0.177342 0.255732 -0.950343 0.237951 -0.404146 -0.883202 -0.171653 0.218373 -0.96065 -0.191226 0.229743 -0.95428 -0.611011 0.68896 -0.389871 -0.497351 0.621084 -0.60572 0.578563 -0.812145 -0.075406 0.636764 -0.76092 0.12463 -0.16812 0.382732 -0.908434 -0.015784 0.298583 -0.954253 -0.001976 0.635051 -0.772468 -0.453742 0.063198 -0.888889 0.030795 -0.642019 -0.76607 -0.201579 0.842141 -0.500164 -0.173805 0.984758 0.006635 -0.590699 0.801573 0.092497 0.882451 -0.187119 -0.431587 0.631214 0.690223 -0.353781 0.716752 0.651156 -0.249525 0.810107 0.079404 -0.58088 0.218424 0.918025 -0.33094 0.14095 0.983257 -0.11549 0.1784 0.905091 -0.385983 0.364291 0.81705 -0.446902 0.299811 0.939833 -0.163791 0.464621 -0.750473 -0.470019 0.536197 0.720638 -0.439516 0.86431 -0.265582 -0.427124 -0.001976 0.635051 -0.772468 0.648814 -0.746751 0.146295 -0.652045 0.746187 -0.134319 0.942604 0.183022 -0.279287 0.916386 0.167363 -0.36363 0.854449 0.301528 -0.423082 0.797836 0.265939 -0.541049 0.890683 -0.009998 -0.454515 0.801722 -0.192439 -0.565871 0.649277 0.072739 -0.757066 0.753411 0.191795 -0.628956 0.604365 -0.070384 -0.793593 0.885831 -0.070677 -0.458594 0.910114 0.100761 -0.401919 0.805467 -0.097274 -0.584603 0.710899 -0.181825 -0.679383 0.859555 -0.250968 -0.445175 -0.52683 -0.492626 -0.692654 -0.453742 0.063198 -0.888889 -0.055458 -0.980045 -0.190882 -0.354768 -0.856003 -0.37603 0.83859 -0.043733 -0.543005 -0.354768 -0.856003 -0.37603 -0.52683 -0.492626 -0.692654 0.87042 -0.142791 -0.471147 0.887459 -0.394772 -0.237848 0.916386 0.167363 -0.36363 0.890596 0.155916 -0.427235 0.890596 0.155916 -0.427235 0.890683 -0.009998 -0.454515 0.801722 -0.192439 -0.565871 0.782365 -0.172664 -0.598408 0.782365 -0.172664 -0.598408 0.885831 -0.070677 -0.458594 0.910114 0.100761 -0.401919 0.869884 0.148906 -0.470244 0.869884 0.148906 -0.470244 0.87042 -0.142791 -0.471147 0.516732 -0.546543 -0.658998 0.137676 -0.761331 -0.633577 -0.07353 0.769687 -0.634173 -0.902887 -0.325788 0.280458 -0.936479 -0.200695 0.287627 -0.858837 -0.448077 0.248247 -0.800561 -0.564102 0.202213 -0.740863 -0.649576 0.170804 -0.640525 -0.727809 0.244992 -0.852271 -0.443437 0.277486 -0.785155 -0.56124 0.261804 -0.709365 -0.657189 0.254763 0.578733 -0.759749 0.296393 -0.000108 -0.999989 -0.004593 -0.000519 -0.999977 -0.006835 -2.6e-005 -0.999995 -0.003091 -0.000597 -0.999998 -0.00167 0.001315 -0.999998 0.001283 -0.003463 -0.999976 -0.006059 -0.004198 -0.999979 -0.004986 -0.000628 -0.99997 -0.007745 -0.001975 -0.999974 -0.006923 -2.7e-005 -0.99997 -0.0077 -0.002648 -0.99998 -0.005712 -4.7e-005 -0.999967 -0.008163 -0.001418 -0.999996 -0.002489 0.003648 -0.999993 6.6e-005 -0.002678 -0.999991 0.003219 0.002716 -0.999944 0.010229 0.004924 -0.999932 0.010565 0.006766 -0.99992 0.010673 0.004599 -0.999966 0.006806 0.001139 -0.999997 0.002306 -0.004828 -0.999982 0.003532 -0.003596 -0.999964 0.007716 -0.002976 -0.999888 0.014666 -0.001249 -0.999863 0.016533 0.001872 -0.999933 0.011459 -0.004407 -0.999983 0.003681 0.001135 -0.999907 0.013602 0.001342 -0.999999 -0.000697 -0.000333 -1 -0.000292 </float_array>\r\n                    <technique_common>\r\n                        <accessor count=\"2290\" source=\"#LOD3spShape-lib-normals-array\" stride=\"3\">\r\n                            <param name=\"X\" type=\"float\"/>\r\n                            <param name=\"Y\" type=\"float\"/>\r\n                            <param name=\"Z\" type=\"float\"/>\r\n                        </accessor>\r\n                    </technique_common>\r\n                </source>\r\n                <source id=\"LOD3spShape-lib-map1\" name=\"map1\">\r\n                    <float_array id=\"LOD3spShape-lib-map1-array\" count=\"4554\">0.245158 0.423975 0.25011 0.468112 0.150442 0.543685 0.148569 0.498875 0.302841 0.416173 0.345064 0.636086 0.339502 0.673242 0.260986 0.672117 0.283208 0.642063 0.331126 0.714598 0.241009 0.71553 0.233372 0.762934 0.302959 0.373132 0.224027 0.289653 0.23558 0.359702 0.143764 0.429085 0.134156 0.320572 0.298228 0.319321 0.288073 0.263566 0.326898 0.757163 0.328393 0.797118 0.23841 0.805793 0.60087 0.640918 0.866606 0.398924 0.510699 0.676291 0.517366 0.634965 0.871384 0.397619 0.505796 0.719121 0.878048 0.397558 0.87416 0.398826 0.86606 0.397625 0.86057 0.399008 0.501279 0.762876 0.856321 0.39906 0.497144 0.804816 0.862375 0.397683 0.860024 0.397676 0.853776 0.399148 0.494669 0.842655 0.936097 0.40457 0.495808 0.877438 0.932361 0.401286 0.944998 0.401429 0.333511 0.830512 0.255441 0.838224 0.335539 0.859065 0.275714 0.857682 0.13703 0.645509 0.099669 0.709478 0.072436 0.710311 0.114209 0.64461 0.217381 0.600094 0.193334 0.589335 0.083907 0.774978 0.093256 0.834193 0.067488 0.842396 0.056643 0.778851 0.948825 0.405179 0.543475 0.557405 0.5578 0.533271 0.685834 0.551732 0.928618 0.398828 0.939922 0.398832 0.318062 0.571086 0.304302 0.551225 0.870712 0.401462 0.862287 0.401557 0.855482 0.401642 0.85836 0.405349 0.85103 0.405417 0.86725 0.404976 0.851008 0.401767 0.84805 0.401779 0.618068 0.949096 0.595914 0.442419 0.701364 0.36472 0.704143 0.312403 0.595493 0.387203 0.757075 0.288915 0.749567 0.262372 0.79867 0.019963 0.720188 0.090411 0.342229 0.232442 0.353643 0.285267 0.846214 0.405443 0.84246 0.405195 0.945825 0.3988 0.51556 0.94314 0.529717 0.959537 0.951482 0.401365 0.955814 0.405156 0.355112 0.336459 0.416748 0.23909 0.409212 0.301844 0.412385 0.174765 0.722678 0.141004 0.371257 0.129527 0.316583 0.183819 0.278107 0.146712 0.815355 0.094326 0.586596 0.164171 0.31201 0.090946 0.272238 0.213152 0.591566 0.221736 0.775513 0.183818 0.258385 0.177707 0.714664 0.225413 0.594393 0.311859 0.803506 0.201004 0.853165 0.100422 0.240207 0.064107 0.220228 0.127313 0.134162 0.116701 0.137886 0.045291 0.20962 0.176711 0.132836 0.176022 0.393776 0.367451 0.346805 0.380154 0.21424 0.228892 0.133514 0.241035 0.127886 0.880246 0.194162 0.909528 0.176891 0.924466 0.105635 0.892789 0.298575 0.918513 0.289302 0.932026 0.41004 0.927663 0.412647 0.940987 0.152917 0.714025 0.188039 0.660899 0.251002 0.622891 0.148083 0.821618 0.139091 0.770988 0.529124 0.59406 0.624566 0.605374 0.943792 0.414167 0.33386 0.602351 0.939709 0.408955 0.951716 0.40979 0.95394 0.414936 0.863781 0.409841 0.854643 0.410095 0.847079 0.410021 0.50373 0.914675 0.043999 0.560029 0.039161 0.51728 0.035514 0.442488 0.02836 0.327681 0.57657 0.399149 0.579657 0.45714 0.483058 0.467543 0.484696 0.402538 0.027211 0.11532 0.026409 0.041836 0.027231 0.176259 0.027041 0.244825 0.496033 0.232082 0.498386 0.171519 0.545104 0.178866 0.55478 0.242428 0.486973 0.320445 0.572701 0.32584 0.253473 0.42034 0.198325 0.471074 0.201641 0.514357 0.257191 0.464291 0.304409 0.414784 0.305266 0.371658 0.230885 0.286168 0.167912 0.306331 0.188981 0.401339 0.242536 0.354324 0.300813 0.31779 0.290984 0.262458 0.644363 0.422582 0.643061 0.366324 0.70337 0.314326 0.703499 0.366966 0.745969 0.26707 0.75382 0.293297 0.343946 0.231017 0.355397 0.284532 0.356783 0.335152 0.414764 0.29281 0.419941 0.236001 0.413771 0.173263 0.370421 0.125545 0.313385 0.086563 0.282902 0.142155 0.319456 0.18046 0.261679 0.175104 0.275739 0.211488 0.247515 0.05956 0.175872 0.043369 0.166908 0.113803 0.230266 0.122298 0.162066 0.173298 0.220575 0.173418 0.399643 0.347472 0.348371 0.378515 0.850892 0.415208 0.23283 0.882474 0.174218 0.860862 0.318561 0.890705 0.412205 0.900441 0.414872 0.864697 0.414169 0.832004 0.413463 0.796679 0.414763 0.757 0.418623 0.715141 0.424042 0.67374 0.797949 0.022112 0.816816 0.093012 0.720595 0.147032 0.715991 0.092651 0.636546 0.210325 0.627672 0.148444 0.772502 0.189202 0.711355 0.231084 0.641706 0.289174 0.223314 0.226619 0.162858 0.235961 0.139391 0.505963 0.140772 0.546375 0.105327 0.324975 0.131454 0.436403 0.855305 0.0942 0.800674 0.205793 0.103269 0.042003 0.100779 0.11305 0.099208 0.173793 0.099637 0.242841 0.428561 0.633258 0.429426 0.594048 0.429051 0.559095 0.429259 0.535162 0.35272 0.639241 0.294558 0.645659 0.274212 0.673847 0.348213 0.675519 0.253789 0.714174 0.339072 0.715472 0.241562 0.759109 0.241492 0.801977 0.330569 0.796358 0.332348 0.756954 0.843668 0.414845 0.519216 0.636196 0.513483 0.677706 0.858319 0.415536 0.509018 0.719971 0.595108 0.724198 0.959154 0.409842 0.961426 0.415077 0.955396 0.420505 0.503982 0.762367 0.946551 0.419988 0.498249 0.80295 0.581926 0.813498 0.948394 0.426244 0.956245 0.426562 0.493564 0.840197 0.962774 0.420748 0.49337 0.874734 0.5689 0.884732 0.963626 0.426902 0.947821 0.439136 0.254385 0.836095 0.333265 0.830744 0.334347 0.859927 0.274272 0.857068 0.111374 0.707428 0.160452 0.654158 0.126019 0.649524 0.074711 0.707898 0.232092 0.611555 0.203545 0.598866 0.085639 0.828171 0.086444 0.767612 0.053832 0.770468 0.05904 0.833261 0.5406 0.554531 0.653253 0.57169 0.949156 0.432796 0.552741 0.532581 0.956416 0.432776 0.955188 0.438695 0.321928 0.578317 0.3053 0.558373 0.963377 0.433055 0.962074 0.438861 0.939469 0.450342 0.944673 0.445101 0.952905 0.444195 0.949616 0.449137 0.959891 0.444199 0.95721 0.449055 0.928445 0.45763 0.933041 0.454385 0.647892 0.957038 0.945196 0.453364 0.513713 0.938992 0.528694 0.953445 0.940767 0.456994 0.954246 0.453493 0.191556 0.905473 0.119561 0.876603 0.09609 0.886393 0.173642 0.917872 0.296111 0.916924 0.285563 0.930752 0.407594 0.925155 0.699705 0.808301 0.767751 0.813767 0.770203 0.857847 0.710393 0.859091 0.67046 0.86001 0.652167 0.800156 0.732575 0.902022 0.706983 0.910753 0.776574 0.894725 0.709069 0.706824 0.772884 0.721001 0.769128 0.766819 0.69961 0.756109 0.650715 0.739559 0.665169 0.685443 0.747389 0.629544 0.781976 0.645207 0.777571 0.679447 0.726035 0.663915 0.69251 0.641696 0.7256 0.608173 0.800842 0.598447 0.800844 0.613722 0.782354 0.62203 0.77064 0.606739 0.761516 0.586356 0.801211 0.57812 0.833474 0.606525 0.843418 0.585771 0.884582 0.608278 0.861681 0.62927 0.826927 0.645008 0.821482 0.621769 0.901508 0.709495 0.841154 0.721344 0.835351 0.679466 0.88519 0.664947 0.920582 0.64464 0.946246 0.692573 0.905321 0.811872 0.840491 0.814502 0.842749 0.767471 0.908491 0.759591 0.957769 0.748636 0.953229 0.808266 0.87648 0.901039 0.832824 0.894364 0.83647 0.858222 0.893987 0.860506 0.934495 0.863509 0.904941 0.908789 0.811165 0.93926 0.808557 0.928096 0.833115 0.918674 0.850764 0.928355 0.866017 0.939324 0.815782 0.955298 0.781351 0.919619 0.767445 0.930389 0.756778 0.947206 0.874321 0.260529 0.87457 0.258357 0.870642 0.262514 0.870232 0.260129 0.875205 0.262091 0.87418 0.274349 0.878088 0.275377 0.879128 0.284194 0.875282 0.284248 0.876451 0.268146 0.87176 0.26763 0.879196 0.270887 0.875496 0.265391 0.893101 0.28442 0.892287 0.271326 0.879947 0.284131 0.862255 0.219399 0.877309 0.242158 0.869772 0.241647 0.855575 0.218438 0.862432 0.239621 0.84944 0.210845 0.867315 0.244511 0.849901 0.240235 0.863194 0.266321 0.876212 0.265675 0.880423 0.283451 0.866718 0.283089 0.870498 0.254293 0.863904 0.253791 0.870234 0.270504 0.864805 0.270607 0.879852 0.25405 0.878645 0.27023 0.884908 0.221559 0.894641 0.243235 0.885819 0.242521 0.87478 0.219802 0.853855 0.205189 0.868038 0.204565 0.870975 0.210424 0.856654 0.209577 0.882303 0.208527 0.885027 0.21281 0.869343 0.207181 0.855354 0.205901 0.879862 0.246326 0.872817 0.221463 0.859409 0.2185 0.885826 0.225344 0.891813 0.248223 0.886742 0.266822 0.897889 0.269881 0.890434 0.283337 0.902191 0.283202 0.887267 0.269985 0.888486 0.253806 0.897003 0.253871 0.897865 0.269734 0.890567 0.21382 0.890889 0.214313 0.887336 0.211472 0.940502 0.247339 0.935827 0.245027 0.948386 0.259727 0.952135 0.261243 0.929477 0.246937 0.935892 0.257903 0.955141 0.271935 0.951237 0.271687 0.951697 0.282445 0.956107 0.282705 0.939971 0.271031 0.941535 0.28252 0.963745 0.266939 0.955791 0.248173 0.96377 0.246708 0.971434 0.266214 0.948554 0.235961 0.955224 0.234835 0.896396 0.245174 0.886107 0.251776 0.887306 0.25714 0.901578 0.253513 0.893935 0.234459 0.893306 0.241625 0.88488 0.259333 0.895682 0.256287 0.898524 0.274248 0.887363 0.275119 0.885952 0.26722 0.897217 0.265981 0.888292 0.284017 0.899782 0.283788 0.893557 0.224473 0.903384 0.244263 0.904117 0.226402 0.909834 0.245212 0.898452 0.232315 0.90536 0.242289 0.914901 0.24109 0.908475 0.23147 0.912117 0.251402 0.92111 0.249824 0.905103 0.223634 0.894105 0.223477 0.891627 0.223783 0.892209 0.224715 0.894785 0.217728 0.904032 0.218825 0.905292 0.26092 0.916745 0.259188 0.925679 0.257542 0.919312 0.270264 0.927598 0.269904 0.909165 0.270372 0.922229 0.248254 0.923018 0.231732 0.931448 0.236491 0.927474 0.250713 0.939132 0.243721 0.931475 0.252998 0.941395 0.236759 0.941774 0.24318 0.951181 0.24757 0.953028 0.242625 0.943442 0.249961 0.949719 0.251412 0.932269 0.241398 0.935522 0.24909 0.930136 0.234395 0.929446 0.228394 0.942151 0.230847 0.942787 0.227016 0.929372 0.224433 0.954848 0.237908 0.922857 0.256527 0.927955 0.258098 0.929776 0.270263 0.925166 0.269641 0.93313 0.259066 0.935431 0.270899 0.938091 0.256867 0.945703 0.257403 0.953024 0.257866 0.948714 0.269472 0.957575 0.269677 0.940805 0.269454 0.944953 0.253898 0.950208 0.269278 0.961307 0.253711 0.957956 0.256418 0.964661 0.269455 0.96896 0.268209 0.902892 0.249987 0.897745 0.228849 0.908596 0.231834 0.912735 0.252197 0.897122 0.224227 0.89485 0.22181 0.90624 0.226903 0.908607 0.228742 0.903082 0.242361 0.906809 0.256103 0.917237 0.255133 0.919494 0.264606 0.908311 0.265315 0.907454 0.269025 0.916487 0.269043 0.911531 0.283044 0.919593 0.2829 0.909419 0.273405 0.911476 0.28336 0.920571 0.273041 0.922157 0.283218 0.922114 0.255039 0.920062 0.238863 0.921052 0.234472 0.923775 0.23538 0.929369 0.253983 0.934895 0.263753 0.927988 0.282737 0.92516 0.269608 0.937386 0.272947 0.938515 0.283177 0.906903 0.269654 0.905634 0.25451 0.912156 0.254648 0.915624 0.269303 0.934262 0.269581 0.931993 0.256855 0.928513 0.24901 0.928512 0.223212 0.917128 0.220406 0.916725 0.220767 0.9041 0.217973 0.914088 0.228391 0.916363 0.246441 0.918617 0.23227 0.923487 0.240784 0.938248 0.22777 0.892821 0.216321 0.844542 0.206031 0.874322 0.212263 0.870581 0.286403 0.864795 0.285932 0.877377 0.285736 0.887924 0.285532 0.898823 0.285311 0.908672 0.285115 0.917425 0.284957 0.921216 0.269224 0.922914 0.284906 0.926665 0.284912 0.930758 0.284928 0.936388 0.28496 0.952837 0.284936 0.967867 0.284724 0.971593 0.266723 0.976556 0.284338 0.976161 0.284497 0.973686 0.284223 0.968029 0.284169 0.960033 0.284154 0.950775 0.284138 0.942494 0.284121 0.936182 0.284123 0.929809 0.284158 0.920968 0.284223 0.910111 0.284292 0.952943 0.272204 0.950019 0.262148 0.953976 0.282879 0.900909 0.229617 0.889642 0.217102 0.912068 0.234085 0.913562 0.243735 0.925227 0.239763 0.92311 0.245509 0.916786 0.225007 0.940372 0.24984 0.963568 0.250138 0.888081 0.264217 0.918118 0.254988 0.844126 0.209259 0.844951 0.221286 0.886769 0.216308 0.872985 0.215718 0.879346 0.309871 0.875833 0.306046 0.875654 0.308144 0.879007 0.306407 0.876295 0.294136 0.878977 0.293033 0.879812 0.300399 0.876175 0.301094 0.880254 0.30345 0.882198 0.297454 0.893175 0.297687 0.865817 0.349629 0.859181 0.350621 0.872916 0.327332 0.880252 0.326495 0.865713 0.330422 0.852822 0.359205 0.869257 0.322943 0.877097 0.301439 0.864055 0.301093 0.852819 0.327816 0.866118 0.317194 0.872679 0.31623 0.865658 0.301152 0.871305 0.301562 0.879516 0.300927 0.881998 0.315802 0.888262 0.347411 0.878301 0.348969 0.888479 0.326114 0.897047 0.325511 0.857019 0.363938 0.860381 0.359999 0.874655 0.358691 0.872015 0.364197 0.888629 0.3558 0.886097 0.359632 0.872907 0.361011 0.858128 0.36229 0.881706 0.320824 0.862423 0.349295 0.875903 0.346079 0.888714 0.341972 0.893556 0.318638 0.898554 0.296744 0.887564 0.300041 0.888147 0.300674 0.898715 0.300283 0.89883 0.31539 0.89048 0.315686 0.894383 0.353795 0.894065 0.354129 0.890921 0.356254 0.942171 0.318343 0.9529 0.304272 0.949521 0.305533 0.937705 0.320863 0.937122 0.30759 0.931259 0.318903 0.955735 0.293528 0.951772 0.293299 0.940544 0.294181 0.964624 0.302435 0.972337 0.302695 0.965634 0.321964 0.957594 0.320997 0.957663 0.333351 0.950951 0.332759 0.897685 0.323309 0.904388 0.314564 0.887892 0.312338 0.888936 0.316243 0.699423 0.809253 0.710111 0.860044 0.769921 0.8588 0.767468 0.81472 0.651885 0.801109 0.669688 0.860514 0.732293 0.902975 0.706453 0.911484 0.776292 0.895678 0.708787 0.707777 0.699329 0.757062 0.768846 0.767772 0.772602 0.721954 0.664887 0.686395 0.650433 0.740512 0.747107 0.630497 0.725753 0.664868 0.777288 0.6804 0.781693 0.64616 0.725318 0.609127 0.692228 0.642648 0.80056 0.5994 0.770358 0.607692 0.782072 0.622983 0.800562 0.614675 0.800928 0.579073 0.761234 0.587309 0.833192 0.607478 0.861399 0.630223 0.8843 0.609231 0.843136 0.586725 0.8212 0.622722 0.826645 0.645961 0.901226 0.710448 0.884907 0.6659 0.835069 0.680418 0.840872 0.722297 0.945964 0.693526 0.920299 0.645594 0.905039 0.812825 0.908209 0.760544 0.842467 0.768423 0.840209 0.815454 0.952947 0.809219 0.957487 0.749588 0.876198 0.901993 0.893705 0.861459 0.836187 0.859175 0.832541 0.895317 0.904659 0.909742 0.934213 0.864462 0.810883 0.940213 0.850482 0.929308 0.832833 0.919627 0.808275 0.929049 0.815494 0.955807 0.865735 0.940277 0.767163 0.931342 0.781069 0.920572 0.878641 0.308129 0.757688 0.947696 0.89571 0.326063 0.896265 0.333541 0.887647 0.308911 0.896958 0.311973 0.898883 0.293285 0.897963 0.301935 0.887703 0.301029 0.887878 0.29293 0.905567 0.324686 0.896731 0.344468 0.906991 0.342485 0.911791 0.324251 0.900908 0.335596 0.911043 0.336295 0.917143 0.326675 0.907054 0.325968 0.923285 0.31808 0.915184 0.316034 0.908088 0.344187 0.897103 0.344536 0.894607 0.344154 0.895142 0.343144 0.898106 0.350443 0.90726 0.349181 0.907871 0.308374 0.918398 0.309598 0.927049 0.310818 0.928305 0.298442 0.920004 0.298182 0.909927 0.298243 0.924036 0.321254 0.929162 0.318872 0.933826 0.332572 0.925629 0.337191 0.941158 0.32555 0.933051 0.316658 0.943727 0.330971 0.955075 0.325269 0.952983 0.320359 0.943791 0.324629 0.951332 0.316568 0.945126 0.31796 0.937248 0.318798 0.934373 0.326359 0.932584 0.333273 0.932192 0.3393 0.932318 0.343421 0.945607 0.340893 0.944776 0.336887 0.957129 0.33006 0.924262 0.313255 0.925922 0.300164 0.930502 0.299579 0.929283 0.311724 0.936126 0.298969 0.93441 0.310774 0.939442 0.311396 0.947027 0.310849 0.954323 0.310334 0.958291 0.298597 0.94944 0.298819 0.941532 0.298832 0.946483 0.315703 0.950981 0.300512 0.962811 0.314479 0.969751 0.300159 0.965388 0.298807 0.959326 0.311738 0.904541 0.316598 0.900452 0.33816 0.911146 0.334819 0.914268 0.314088 0.900043 0.343367 0.910827 0.338483 0.909045 0.340214 0.897918 0.345703 0.907714 0.311836 0.905082 0.324826 0.918749 0.311513 0.909052 0.30192 0.920236 0.301846 0.91718 0.297035 0.908155 0.297332 0.909931 0.29344 0.92041 0.293444 0.923496 0.310879 0.922253 0.327378 0.925923 0.331262 0.923469 0.332076 0.930583 0.312153 0.934974 0.302503 0.925817 0.29614 0.93758 0.293425 0.907706 0.300101 0.916398 0.300537 0.913653 0.315103 0.907277 0.314776 0.934984 0.298714 0.933344 0.311407 0.930312 0.318902 0.931529 0.345055 0.919853 0.347075 0.920283 0.347817 0.907379 0.350402 0.918259 0.323025 0.916863 0.340467 0.921166 0.335346 0.925584 0.327014 0.941044 0.340685 0.896265 0.352186 0.847118 0.363087 0.877923 0.355511 0.921992 0.300554 0.972463 0.301867 0.950828 0.303658 0.953466 0.293583 0.892951 0.350759 0.90326 0.337983 0.915596 0.322974 0.91417 0.333036 0.927312 0.326701 0.92504 0.320904 0.919699 0.342662 0.941871 0.316003 0.965254 0.318221 0.889956 0.306147 0.919598 0.314755 0.845891 0.359181 0.847322 0.346695 0.890112 0.35133 0.87636 0.352039 0.950166 0.457401 0.877438 0.456074 0.890333 0.455013 0.891902 0.457826 0.881771 0.45805 0.893433 0.460126 0.885457 0.459788 0.90216 0.458193 0.902038 0.46051 0.902093 0.455956 0.869348 0.456995 0.875073 0.458463 0.870949 0.459563 0.865831 0.459946 0.88002 0.459819 0.876379 0.459992 0.890696 0.462723 0.889158 0.462546 0.893089 0.46287 0.842115 0.409869 0.837426 0.409453 0.838646 0.414482 0.833434 0.414204 0.847163 0.42056 0.840709 0.41957 0.839445 0.430603 0.83503 0.428579 0.852464 0.422383 0.843659 0.433436 0.835601 0.419062 0.830596 0.418889 0.831257 0.427506 0.827802 0.427141 0.876435 0.450731 0.866399 0.449489 0.869211 0.447456 0.878828 0.448367 0.861778 0.461251 0.86329 0.45579 0.869445 0.454182 0.919848 0.462088 0.9244 0.459418 0.936505 0.460001 0.932799 0.462552 0.914853 0.457033 0.912969 0.45878 0.983064 0.742705 0.970242 0.681277 0.978343 0.807461 0.961861 0.871181 0.925 0.920764 0.93957 0.629718 0.896636 0.591965 0.87816 0.953598 0.820182 0.969676 0.849136 0.56846 0.801508 0.561342 0.753635 0.961316 0.693916 0.922274 0.756457 0.570463 0.715065 0.59271 0.62759 0.729278 0.628526 0.797321 0.647916 0.672373 0.648988 0.865355 0.678001 0.627321 0.970524 0.680324 0.983346 0.741752 0.978626 0.806509 0.962143 0.870229 0.925282 0.919811 0.896919 0.591012 0.939853 0.628765 0.878442 0.952645 0.819304 0.969461 0.80179 0.560389 0.849419 0.567507 0.753465 0.960832 0.694447 0.921544 0.715348 0.591757 0.756739 0.569509 0.628808 0.796368 0.627873 0.728326 0.648199 0.671421 0.648584 0.866073 0.678283 0.626368 0.411737 0.936637 0.212659 0.665019 0.175067 0.711347 0.264355 0.628942 0.154113 0.763611 0.154483 0.81452 0.911051 0.461039 0.528987 0.594894 0.945951 0.460521 0.339791 0.607004 0.94197 0.46307 0.896594 0.462992 0.902819 0.462828 0.939147 0.46498 0.588358 0.917245 0.930869 0.464578 0.500784 0.908814 0.937502 0.466649 0.178893 0.855096 0.23388 0.878659 0.317203 0.888741 0.409219 0.897533 0.412456 0.865776 0.413517 0.832907 0.415303 0.797177 0.41903 0.758087 0.424284 0.717135 0.429773 0.675932 0.433166 0.635493 0.431719 0.596003 0.42845 0.560105 0.426262 0.535529 0.166927 0.932027 0.089131 0.90146 0.412839 0.954955 0.280654 0.94225 0.092604 0.643694 0.172265 0.583534 0.034269 0.783775 0.048602 0.713913 0.288973 0.53753 0.047197 0.849027 0.9297 0.466322 0.910929 0.462701 0.429574 0.516361 0.573602 0.514995 0.911763 0.464455 0.904647 0.46452 0.91245 0.466086 0.906026 0.466148 0.920833 0.464349 0.682918 0.980037 0.544365 0.975068 0.92089 0.466118 0.274953 0.94136 0.412382 0.948959 0.078614 0.893197 0.159929 0.926191 0.045546 0.712112 0.029763 0.775258 0.174568 0.589926 0.093871 0.647648 0.286715 0.542233 0.039682 0.837587 0.568016 0.514851 0.425296 0.517534 0.89967 0.464526 0.715649 0.536695 0.89649 0.46445 0.90127 0.466162 0.89793 0.466107 0.92457 0.397524 0.934172 0.397517 0.90196 0.397532 0.543555 0.96576 0.912366 0.397543 0.914428 0.398827 0.902477 0.39881 0.887934 0.397535 0.886084 0.398748 0.939158 0.397548 0.916553 0.401268 0.903345 0.401161 0.918892 0.404595 0.904419 0.40426 0.88377 0.401252 0.880927 0.404722 0.905294 0.428912 0.905488 0.424961 0.912357 0.424967 0.91334 0.429138 0.905906 0.421495 0.911087 0.422154 0.904076 0.437412 0.90478 0.43319 0.913199 0.433998 0.911884 0.43877 0.90321 0.444063 0.903361 0.441071 0.909872 0.442542 0.908067 0.444769 0.902496 0.453271 0.918142 0.453706 0.928783 0.450398 0.93573 0.445715 0.939896 0.439756 0.941415 0.433124 0.940295 0.426582 0.937084 0.420446 0.931618 0.414911 0.921769 0.409549 0.905101 0.407893 0.876573 0.40992 0.866307 0.415598 0.859425 0.421874 0.854503 0.429219 0.846009 0.439206 0.853866 0.435555 0.855666 0.44134 0.849189 0.44441 0.859693 0.44628 0.853635 0.449316 0.859396 0.453185 0.889827 0.45174 0.862926 0.421743 0.859205 0.428005 0.869662 0.416377 0.857993 0.434235 0.859086 0.440054 0.916008 0.412068 0.903601 0.410265 0.918257 0.418305 0.91053 0.415402 0.913091 0.413541 0.921836 0.416936 0.92534 0.416062 0.879532 0.412275 0.931494 0.42114 0.923547 0.422692 0.927682 0.421785 0.926515 0.428111 0.931209 0.427509 0.93512 0.42705 0.936295 0.433481 0.92732 0.434037 0.932331 0.433786 0.925669 0.439922 0.930432 0.440034 0.934525 0.439972 0.912845 0.451737 0.922595 0.449614 0.907361 0.448978 0.915126 0.447877 0.918684 0.448912 0.909842 0.450414 0.901128 0.451294 0.929882 0.445604 0.921412 0.444811 0.925747 0.445329 0.862632 0.44473 0.90791 0.418325 0.914417 0.420366 0.918293 0.424021 0.92059 0.42877 0.920879 0.434155 0.919487 0.439514 0.911345 0.446349 0.90499 0.446728 0.916084 0.443813 0.891421 0.410387 0.891335 0.407994 0.8923 0.404278 0.892667 0.401108 0.892803 0.398753 0.893101 0.397518 0.953337 0.401538 0.958091 0.405199 0.9475 0.399036 0.96186 0.409791 0.964499 0.415028 0.96612 0.420717 0.967305 0.426924 0.967388 0.433074 0.966427 0.438883 0.96451 0.444202 0.961861 0.44894 0.958944 0.453645 0.955428 0.457592 0.951844 0.460785 0.948132 0.463506 0.945008 0.465414 0.9428 0.466896 0.940897 0.39766 0.894646 0.464377 0.893748 0.464327 0.895819 0.465909 0.894732 0.465707 0.898046 0.468336 0.895591 0.467749 0.894211 0.467377 0.894053 0.470321 0.892528 0.469525 0.89702 0.472125 0.906461 0.46806 0.901761 0.468217 0.901883 0.471147 0.906501 0.470456 0.912592 0.467918 0.912253 0.470089 0.920682 0.467923 0.920674 0.470154 0.9293 0.468129 0.929876 0.470181 0.93702 0.468441 0.938213 0.470896 0.942275 0.468514 0.942757 0.470744 0.890006 0.4495 0.852976 0.399065 0.859393 0.397599 0.847065 0.401675 0.84127 0.405026 0.953466 0.401386 0.958188 0.405089 0.947588 0.398916 0.961862 0.409747 0.964391 0.415022 0.965926 0.420729 0.967068 0.426923 0.967242 0.433135 0.966314 0.439008 0.964406 0.444378 0.961584 0.44912 0.958267 0.453722 0.954279 0.457569 0.865611 0.460368 0.870463 0.459645 0.869977 0.459728 0.865391 0.460791 0.875883 0.460032 0.875386 0.460071 0.889107 0.462568 0.889055 0.46259 0.836433 0.409343 0.829542 0.419704 0.832578 0.41403 0.832317 0.414141 0.82924 0.419624 0.86181 0.461905 0.861843 0.46256 0.95053 0.46075 0.946775 0.4634 0.943577 0.465237 0.941527 0.466697 0.893773 0.464335 0.893798 0.464342 0.894526 0.465626 0.894385 0.465571 0.940912 0.397604 0.893807 0.467247 0.893563 0.467166 0.891985 0.469369 0.891535 0.469419 0.940364 0.468392 0.940762 0.470517 0.866236 0.398834 0.873711 0.398813 0.877506 0.397514 0.870971 0.397493 0.865522 0.397455 0.860032 0.398872 0.856026 0.399014 0.861954 0.397568 0.860159 0.397664 0.853853 0.399094 0.935431 0.404681 0.948546 0.405179 0.944496 0.401457 0.931632 0.401375 0.939488 0.398861 0.927974 0.398901 0.870657 0.401504 0.861966 0.401526 0.855096 0.4016 0.850751 0.405417 0.858121 0.405363 0.867731 0.405188 0.850561 0.401575 0.848094 0.401586 0.842791 0.404957 0.845766 0.405198 0.9455 0.398818 0.951158 0.401375 0.955535 0.405156 0.94295 0.41441 0.9536 0.414936 0.951437 0.40979 0.938847 0.409148 0.863906 0.410047 0.854469 0.410101 0.8468 0.410021 0.843291 0.414792 0.850618 0.415218 0.858112 0.415702 0.958875 0.409842 0.961147 0.415077 0.9551 0.420509 0.945887 0.42022 0.947818 0.426423 0.955942 0.426574 0.962495 0.420748 0.963347 0.426902 0.947179 0.438896 0.955415 0.438781 0.95627 0.432802 0.948355 0.432791 0.963455 0.433109 0.96255 0.43901 0.93973 0.449457 0.950281 0.449152 0.953464 0.44429 0.944309 0.444589 0.960647 0.444424 0.957836 0.449233 0.928866 0.456683 0.941589 0.457208 0.946319 0.453375 0.933669 0.453285 0.954103 0.453514 0.949874 0.457416 0.877353 0.455968 0.882269 0.458025 0.892317 0.457757 0.890577 0.455047 0.886684 0.460112 0.89423 0.460211 0.902677 0.460467 0.90267 0.458019 0.902808 0.455334 0.869597 0.456984 0.865825 0.458435 0.871446 0.458982 0.8752 0.458466 0.877063 0.46 0.880928 0.46006 0.889224 0.462652 0.890358 0.462714 0.892541 0.462593 0.841603 0.409572 0.838159 0.409243 0.834209 0.413908 0.837981 0.414182 0.839885 0.419736 0.846514 0.420792 0.834481 0.428371 0.838869 0.430451 0.84343 0.433385 0.852102 0.422532 0.830666 0.418987 0.834732 0.419195 0.827717 0.426976 0.830662 0.427303 0.875777 0.450429 0.878346 0.448288 0.868619 0.446935 0.865577 0.448677 0.860982 0.459109 0.863516 0.455972 0.868771 0.453598 0.919955 0.462087 0.933215 0.46265 0.936971 0.460171 0.92452 0.45941 0.915797 0.455832 0.913434 0.458571 0.911682 0.460937 0.945768 0.460575 0.941689 0.463136 0.897291 0.462545 0.903757 0.462585 0.930828 0.464538 0.938505 0.464915 0.929084 0.466249 0.936418 0.466469 0.911714 0.462545 0.904992 0.464496 0.91226 0.464434 0.906001 0.466171 0.912549 0.466198 0.920438 0.466178 0.920682 0.464371 0.899694 0.464496 0.896238 0.464476 0.897673 0.46607 0.901142 0.46612 0.933851 0.397545 0.924135 0.397565 0.901567 0.397461 0.902111 0.398787 0.913998 0.398826 0.911927 0.397463 0.885568 0.398789 0.887707 0.397486 0.939027 0.397536 0.902897 0.401138 0.916139 0.401275 0.904075 0.404332 0.918631 0.404656 0.883077 0.401373 0.880245 0.404983 0.905419 0.428922 0.912942 0.429219 0.912006 0.425106 0.905474 0.425025 0.910791 0.422281 0.905844 0.421559 0.904305 0.436885 0.911907 0.438227 0.913047 0.433844 0.905052 0.432984 0.903203 0.443238 0.908124 0.443775 0.909903 0.441649 0.903445 0.440313 0.90285 0.452456 0.918742 0.45246 0.929033 0.449192 0.935553 0.444785 0.939489 0.439171 0.940895 0.433027 0.939916 0.426757 0.936762 0.420698 0.931211 0.415109 0.90461 0.407951 0.921344 0.40965 0.876099 0.410269 0.865754 0.416146 0.858856 0.422274 0.85408 0.42925 0.845714 0.439016 0.8487 0.443676 0.855252 0.440105 0.853622 0.434905 0.852614 0.447663 0.858958 0.44511 0.858176 0.451853 0.889824 0.45148 0.858947 0.427844 0.863033 0.422095 0.869857 0.416948 0.858451 0.439034 0.857612 0.433475 0.903128 0.410252 0.915613 0.4122 0.910336 0.415321 0.91773 0.418674 0.921258 0.417307 0.91279 0.413538 0.924944 0.416332 0.879341 0.412694 0.930972 0.4215 0.922517 0.423241 0.926792 0.422268 0.92506 0.428584 0.929895 0.42793 0.93442 0.427304 0.935453 0.433435 0.925801 0.434263 0.930838 0.433902 0.924243 0.439743 0.929152 0.439726 0.933786 0.439455 0.922618 0.448568 0.913071 0.450609 0.91472 0.447235 0.9073 0.44856 0.909883 0.449686 0.918464 0.448158 0.90106 0.450464 0.929479 0.444749 0.920523 0.44435 0.924927 0.444695 0.861743 0.443993 0.907779 0.418347 0.914012 0.420577 0.917709 0.42432 0.919641 0.429082 0.919962 0.434273 0.918588 0.43924 0.904848 0.446138 0.911088 0.445577 0.915514 0.4432 0.890897 0.408138 0.891059 0.410492 0.89188 0.404459 0.892481 0.401195 0.892744 0.398811 0.892774 0.397499 0.852987 0.39915 0.859402 0.397672 0.847027 0.401638 0.84144 0.40503 0.836758 0.409301 0.826856 0.427241 0.893304 0.464316 0.894343 0.465793 0.894093 0.464377 0.895401 0.465971 0.893628 0.467665 0.890751 0.471053 0.897653 0.467915 0.895086 0.467874 0.893376 0.47055 0.896513 0.470318 0.906138 0.467954 0.901291 0.467913 0.900442 0.470186 0.905385 0.470181 0.912382 0.468058 0.911527 0.470316 0.918635 0.470453 0.91977 0.468076 0.926488 0.470872 0.927835 0.468189 0.935282 0.468257 0.935209 0.471328 0.877915 0.500707 0.878197 0.500625 0.878935 0.505269 0.878376 0.50543 0.87849 0.500327 0.879515 0.504678 0.878776 0.499827 0.880077 0.503685 0.879041 0.499148 0.880596 0.502336 0.879273 0.498323 0.88105 0.500691 0.879461 0.49739 0.881414 0.498833 0.879595 0.496393 0.881685 0.496848 0.879673 0.495381 0.881831 0.494834 0.879688 0.4944 0.881855 0.492886 0.879641 0.493495 0.881754 0.491093 0.879517 0.492692 0.881496 0.489502 0.879256 0.49199 0.880966 0.488128 0.878724 0.491679 0.879976 0.487255 0.880441 0.487544 0.878985 0.491764 0.880259 0.509816 0.879427 0.510054 0.881118 0.508941 0.881951 0.507469 0.882719 0.50547 0.883385 0.503037 0.883918 0.500283 0.884295 0.497337 0.884501 0.494341 0.884524 0.491438 0.884373 0.488781 0.883999 0.486461 0.88321 0.484429 0.882394 0.483424 0.882124 0.514208 0.881033 0.51452 0.883251 0.513061 0.884343 0.511133 0.885349 0.508513 0.886222 0.505324 0.886921 0.501715 0.887414 0.497854 0.887677 0.493924 0.887702 0.490113 0.887496 0.486645 0.88698 0.48361 0.885938 0.48091 0.884878 0.479558 0.884506 0.51838 0.88317 0.518762 0.885883 0.516979 0.887217 0.514621 0.888447 0.511419 0.889514 0.507521 0.890369 0.503109 0.890971 0.49839 0.891293 0.493586 0.89132 0.488919 0.891054 0.484665 0.890395 0.481066 0.88919 0.477958 0.887817 0.476052 0.887367 0.522273 0.885807 0.522719 0.888975 0.520637 0.890533 0.517885 0.891968 0.514147 0.893214 0.509596 0.894212 0.504446 0.894915 0.498938 0.895291 0.493329 0.895322 0.487882 0.895 0.482915 0.894205 0.478779 0.892842 0.475169 0.891068 0.473073 0.890668 0.525829 0.888906 0.526332 0.892483 0.523982 0.894241 0.520876 0.895861 0.516656 0.897267 0.51152 0.898394 0.505707 0.899187 0.499489 0.899612 0.493158 0.899646 0.487009 0.899286 0.481354 0.898411 0.476638 0.894359 0.528996 0.892421 0.529549 0.896354 0.526965 0.898288 0.52355 0.900069 0.518911 0.901615 0.513263 0.902854 0.506872 0.903726 0.500036 0.904193 0.493075 0.904231 0.486314 0.903834 0.4801 0.902975 0.47504 0.898388 0.531728 0.896302 0.532323 0.900534 0.529543 0.902614 0.525869 0.904531 0.520877 0.906194 0.514801 0.907527 0.507925 0.908466 0.50057 0.908967 0.493081 0.909009 0.485806 0.908572 0.479151 0.907654 0.473824 0.902694 0.533986 0.900491 0.534614 0.90496 0.531679 0.907157 0.527799 0.909181 0.522528 0.910937 0.516111 0.912345 0.50885 0.913336 0.501084 0.913866 0.493175 0.913909 0.485494 0.91346 0.478418 0.912585 0.472851 0.907215 0.535736 0.904927 0.536388 0.909569 0.53334 0.91185 0.529311 0.913952 0.523838 0.915776 0.517175 0.917237 0.509635 0.918266 0.50157 0.918854 0.493342 0.918947 0.485357 0.91844 0.478006 0.91787 0.471971 0.914263 0.537286 0.911914 0.537955 0.916678 0.534827 0.919019 0.530693 0.921175 0.525076 0.923047 0.518239 0.924546 0.510502 0.925585 0.502224 0.926227 0.493754 0.926493 0.485583 0.925762 0.478045 0.924764 0.471485 0.921403 0.537724 0.919062 0.538392 0.92381 0.535275 0.926142 0.531156 0.930338 0.525761 0.93162 0.519674 0.933283 0.512932 0.932692 0.502839 0.933977 0.494768 0.934333 0.486371 0.933206 0.478784 0.931863 0.472204 0.92611 0.537268 0.92382 0.53792 0.928464 0.534872 0.932388 0.530343 0.937335 0.506755 0.941235 0.498334 0.941521 0.487989 0.940371 0.480184 0.938481 0.473907 0.930691 0.536256 0.928485 0.536884 0.934789 0.533043 0.935078 0.534703 0.932989 0.535298 0.938368 0.532576 0.947164 0.489068 0.947066 0.497764 0.946239 0.481893 0.944283 0.476284 0.939209 0.532632 0.937267 0.533185 0.941919 0.530982 0.950689 0.490156 0.950271 0.497772 0.95034 0.48345 0.948203 0.478162 0.943023 0.530074 0.941256 0.530577 0.945589 0.528338 0.95349 0.491089 0.952472 0.498024 0.953154 0.485389 0.951415 0.480527 0.946464 0.527065 0.944898 0.52751 0.948879 0.525086 0.955336 0.498108 0.955494 0.49227 0.955142 0.488211 0.954263 0.484425 0.949389 0.475505 0.954052 0.482326 0.94757 0.475109 0.945693 0.473082 0.943613 0.471998 0.950577 0.521636 0.949187 0.522238 0.951775 0.520708 0.950886 0.519379 0.952605 0.518141 0.95447 0.515316 0.952742 0.516616 0.878125 0.495997 0.943537 0.514246 0.944979 0.511457 0.945299 0.511731 0.944004 0.514141 0.946866 0.510467 0.945612 0.512005 0.946775 0.509925 0.944125 0.524447 0.943125 0.523168 0.943363 0.52176 0.944265 0.522893 0.943213 0.51865 0.9436 0.520352 0.942839 0.519741 0.942465 0.520831 0.942508 0.517563 0.943036 0.516979 0.944472 0.514036 0.943564 0.516394 0.946664 0.509365 0.948503 0.507957 0.948316 0.508687 0.949207 0.508705 0.948096 0.509397 0.949608 0.50791 0.950009 0.507096 0.951195 0.506751 0.950679 0.507606 0.951005 0.508659 0.950161 0.508443 0.951647 0.507843 0.952323 0.510866 0.951744 0.509448 0.952587 0.5089 0.953318 0.510638 0.952296 0.507042 0.953444 0.508317 0.954198 0.510416 0.954069 0.512878 0.953344 0.512779 0.95222 0.51488 0.952538 0.512757 0.952777 0.515115 0.953314 0.515413 0.952001 0.51802 0.951641 0.517475 0.949848 0.518868 0.951263 0.516984 0.950071 0.519673 0.950291 0.520481 0.948367 0.522605 0.94826 0.52146 0.946642 0.521256 0.948152 0.520315 0.946704 0.522693 0.946766 0.524131 0.94537 0.524785 0.945389 0.52319 0.944404 0.521338 0.945409 0.521595 0.948517 0.508521 0.947425 0.509189 0.946164 0.510225 0.943731 0.513771 0.942852 0.515989 0.942484 0.51808 0.944874 0.511783 0.950283 0.508511 0.949456 0.508269 0.942699 0.51973 0.943487 0.520694 0.951552 0.510694 0.95099 0.509314 0.944633 0.521012 0.946034 0.520645 0.951461 0.514432 0.951791 0.512457 0.947604 0.519694 0.949207 0.518265 0.95053 0.516413 0.954352 0.507334 0.955064 0.51004 0.953029 0.50566 0.954691 0.513093 0.953563 0.516187 0.942931 0.511155 0.945738 0.50837 0.941124 0.514785 0.948237 0.525023 0.946042 0.527051 0.950358 0.522206 0.940778 0.525984 0.939919 0.523165 0.942236 0.527579 0.940031 0.519157 0.94836 0.506655 0.95038 0.505668 0.951792 0.505283 0.952106 0.519194 0.94408 0.527997 0.955136 0.505085 0.955458 0.508799 0.953996 0.503048 0.954947 0.51289 0.953571 0.516724 0.940392 0.509704 0.943959 0.505926 0.937487 0.514053 0.946965 0.527152 0.943743 0.529685 0.949863 0.52392 0.936263 0.528363 0.934831 0.524989 0.938515 0.530358 0.93544 0.520327 0.947235 0.504116 0.949823 0.503295 0.952034 0.502955 0.951882 0.52041 0.941028 0.53079 0.956255 0.501869 0.956376 0.507194 0.955436 0.512282 0.95378 0.516679 0.954272 0.512902 0.953969 0.514386 0.955477 0.513065 0.955509 0.511632 0.956562 0.510151 0.957541 0.50583 0.957528 0.506237 0.957401 0.500104 0.957323 0.498901 0.956684 0.496896 0.956413 0.492938 0.956425 0.492794 0.955922 0.48933 0.955605 0.489791 0.952251 0.480529 0.95403 0.483685 0.955302 0.484788 0.955335 0.486204 0.955539 0.486154 0.954877 0.485325 0.956687 0.508947 0.956754 0.495687 0.955045 0.487387 0.877848 0.505182 0.877652 0.500582 0.87737 0.504506 0.877412 0.500243 0.876974 0.503437 0.877218 0.499703 0.87668 0.502023 0.877063 0.498994 0.876501 0.50033 0.876979 0.498142 0.876446 0.498438 0.87696 0.497191 0.876522 0.496436 0.877006 0.496186 0.876728 0.49442 0.877115 0.495174 0.877054 0.492488 0.877281 0.494204 0.877479 0.49073 0.877498 0.49332 0.877999 0.489197 0.877767 0.492546 0.878719 0.487808 0.878144 0.491879 0.879235 0.487423 0.878402 0.491725 0.878643 0.509686 0.877934 0.508686 0.877348 0.507101 0.876912 0.505005 0.876647 0.502497 0.876565 0.499694 0.876669 0.496727 0.876956 0.493734 0.877416 0.490859 0.878045 0.488251 0.878803 0.485988 0.879891 0.48389 0.880652 0.483253 0.880004 0.514038 0.879075 0.512727 0.878307 0.510649 0.877736 0.507903 0.877388 0.504616 0.87728 0.500942 0.877417 0.497054 0.877793 0.493132 0.878389 0.48936 0.879214 0.485947 0.880199 0.482989 0.881623 0.480314 0.882641 0.479405 0.881911 0.518172 0.880775 0.516569 0.879836 0.51403 0.879138 0.510673 0.878713 0.506655 0.878582 0.502165 0.878749 0.497412 0.879208 0.492618 0.879955 0.488021 0.881001 0.483899 0.88231 0.480367 0.883909 0.47731 0.885135 0.475926 0.884336 0.52203 0.883011 0.520159 0.881915 0.517195 0.8811 0.513276 0.880604 0.508586 0.88045 0.503344 0.880646 0.497795 0.881181 0.492199 0.882059 0.48684 0.883257 0.482017 0.884772 0.477872 0.886828 0.474331 0.888116 0.472377 0.887245 0.525554 0.885749 0.523442 0.884512 0.520096 0.883592 0.515673 0.883032 0.510379 0.882858 0.504462 0.883079 0.498199 0.883683 0.491882 0.884656 0.485819 0.885976 0.480334 0.887771 0.475644 0.888962 0.472096 0.890594 0.528694 0.888949 0.526372 0.887589 0.522693 0.886578 0.51783 0.885962 0.512009 0.885771 0.505504 0.886014 0.498617 0.886678 0.491672 0.887734 0.484992 0.889161 0.478945 0.891005 0.474124 0.894335 0.531403 0.892565 0.528905 0.891102 0.524947 0.890014 0.519714 0.889351 0.513452 0.889146 0.506453 0.889407 0.499043 0.890122 0.491571 0.891258 0.484384 0.892815 0.477978 0.894695 0.473363 0.898413 0.533643 0.896544 0.531004 0.894999 0.526825 0.89385 0.5213 0.893151 0.514687 0.892934 0.507295 0.893209 0.499472 0.893965 0.491581 0.895164 0.483992 0.89686 0.477387 0.898865 0.473076 0.902769 0.53538 0.900829 0.53264 0.899224 0.5283 0.898031 0.522562 0.897305 0.515695 0.897079 0.50802 0.897366 0.499895 0.89815 0.491701 0.899396 0.483821 0.901449 0.477074 0.903819 0.472976 0.909699 0.53692 0.907707 0.534109 0.906061 0.529655 0.904836 0.523767 0.904091 0.516721 0.90386 0.508844 0.904153 0.500507 0.904958 0.492099 0.906237 0.484012 0.908008 0.477129 0.910034 0.473198 0.916854 0.53736 0.91487 0.534559 0.91323 0.530122 0.914164 0.524465 0.913164 0.518196 0.913437 0.51134 0.91133 0.50108 0.912131 0.492703 0.913405 0.484646 0.91513 0.47783 0.916994 0.473623 0.92166 0.536911 0.919719 0.534172 0.91917 0.529284 0.917172 0.505296 0.919838 0.496406 0.920904 0.486229 0.92238 0.479225 0.924263 0.474614 0.926405 0.535913 0.924828 0.532245 0.931019 0.534378 0.929686 0.53188 0.92797 0.487724 0.927599 0.495894 0.929366 0.480734 0.931925 0.475167 0.935435 0.53233 0.934387 0.530379 0.933232 0.488977 0.932764 0.496065 0.934736 0.482159 0.937602 0.476887 0.93959 0.529799 0.938848 0.527798 0.937731 0.490249 0.936964 0.496523 0.939215 0.484123 0.942421 0.479379 0.943421 0.526821 0.942722 0.524593 0.94207 0.497013 0.942329 0.491435 0.943599 0.487511 0.946933 0.482758 0.949756 0.480976 0.945342 0.476815 0.940652 0.473783 0.947564 0.521395 0.9466 0.520277 0.951324 0.514898 0.949518 0.517928 0.928377 0.510114 0.926885 0.51291 0.927854 0.512845 0.929178 0.51043 0.92998 0.510746 0.931406 0.509225 0.930823 0.508639 0.92835 0.521984 0.930534 0.523359 0.930891 0.521821 0.928964 0.520607 0.929579 0.519229 0.928441 0.517467 0.927597 0.51852 0.926179 0.516255 0.926753 0.519573 0.927195 0.51571 0.928211 0.515165 0.928823 0.512781 0.932374 0.506682 0.930239 0.508053 0.932657 0.507439 0.93294 0.508196 0.934517 0.507536 0.93451 0.506707 0.936567 0.505592 0.934502 0.505878 0.936317 0.506456 0.936067 0.50732 0.937546 0.507578 0.93807 0.506748 0.938901 0.508422 0.940036 0.50988 0.941088 0.509726 0.939772 0.507879 0.940713 0.507314 0.938594 0.505926 0.942911 0.511998 0.942269 0.509491 0.941755 0.511888 0.940774 0.511818 0.940867 0.513981 0.941724 0.514237 0.941696 0.517149 0.942674 0.514592 0.940898 0.516619 0.940099 0.51609 0.938667 0.517973 0.939267 0.518807 0.937547 0.521739 0.939868 0.519641 0.937153 0.52057 0.936759 0.519402 0.934851 0.520311 0.935057 0.52176 0.932933 0.523788 0.935263 0.523209 0.932985 0.522196 0.933038 0.520604 0.931248 0.520284 0.932573 0.508007 0.934161 0.507367 0.930964 0.509008 0.927841 0.514787 0.928411 0.512543 0.928106 0.516928 0.929515 0.510546 0.935671 0.507169 0.937081 0.507438 0.929093 0.51864 0.93071 0.519671 0.938351 0.508298 0.9394 0.509723 0.932552 0.520045 0.934434 0.519715 0.940079 0.511519 0.940113 0.513519 0.936336 0.518792 0.938116 0.517377 0.939405 0.515521 0.943638 0.508965 0.941943 0.506311 0.939071 0.504531 0.94388 0.51543 0.944335 0.512165 0.927944 0.506963 0.925069 0.509715 0.923231 0.513349 0.935271 0.526189 0.938229 0.524222 0.940839 0.521447 0.923484 0.521848 0.925731 0.524779 0.928789 0.526502 0.922597 0.517761 0.93396 0.504385 0.931029 0.505302 0.936534 0.504088 0.942769 0.518413 0.932116 0.527039 0.945351 0.507568 0.943089 0.503744 0.939896 0.502018 0.945354 0.516015 0.946118 0.511811 0.925289 0.504712 0.920962 0.50815 0.918385 0.51252 0.934537 0.528948 0.938552 0.526478 0.941809 0.523283 0.918305 0.523665 0.921702 0.527196 0.925959 0.529352 0.917212 0.518867 0.933078 0.501722 0.929349 0.502508 0.936447 0.501609 0.943896 0.519878 0.930309 0.529931 0.948005 0.505607 0.944871 0.499392 0.947806 0.516062 0.9491 0.511191 0.953215 0.511264 0.952698 0.512701 0.951135 0.50884 0.950868 0.504414 0.946032 0.497811 0.946155 0.49879 0.9504 0.504692 0.944108 0.496015 0.944681 0.492183 0.945966 0.489086 0.945497 0.488606 0.944291 0.491984 0.951345 0.48426 0.948386 0.485293 0.952907 0.485943 0.952013 0.507755 0.944606 0.494766 0.94856 0.486751 0.889967 0.448966 0.879572 0.4873 0.878531 0.491695 0.881189 0.483034 0.883359 0.479059 0.88597 0.475436 0.826451 0.427416 0.889758 0.472115 0.881748 0.482959 0.884054 0.478968 0.886811 0.475429 0.942835 0.472365 0.877975 0.397658 0.883515 0.397651 0.873951 0.397664 0.870831 0.397671 0.867889 0.397674 0.918562 0.397639 0.925482 0.397634 0.901603 0.397646 0.909465 0.397642 0.891034 0.397645 0.929288 0.397637 0.894812 0.397645 0.931273 0.397662 0.86549 0.397668 0.931235 0.397655 0.882529 0.39765 0.877003 0.397658 0.871595 0.397671 0.868659 0.397671 0.868707 0.397667 0.925845 0.397644 0.918784 0.397657 0.909614 0.397666 0.901249 0.39767 0.890498 0.397656 0.92961 0.397643 0.894099 0.397656 0.867711 0.397671 0.900103 0.397679 0.595916 0.679782 0.593633 0.724091 0.587548 0.772055 0.579229 0.819401 0.570764 0.860428 0.56898 0.893979 0.055194 0.327681 0.056512 0.244825 0.056323 0.176259 0.056343 0.11532 0.057144 0.041836 0.468306 0.320445 0.459246 0.232082 0.470583 0.402538 0.456894 0.171519 0.044392 0.51728 0.04804 0.442488 0.039555 0.560029 0.472222 0.467543 0.655545 0.572596 0.685594 0.967391 0.590033 0.92387 0.595756 0.680499 0.590769 0.76975 0.682275 0.551691 0.647404 0.965201 0.571758 0.851938 0.600135 0.64164 0.623018 0.605621 0.617347 0.944413 0.720327 0.535205 </float_array>\r\n                    <technique_common>\r\n                        <accessor count=\"2277\" source=\"#LOD3spShape-lib-map1-array\" stride=\"2\">\r\n                            <param name=\"S\" type=\"float\"/>\r\n                            <param name=\"T\" type=\"float\"/>\r\n                        </accessor>\r\n                    </technique_common>\r\n                </source>\r\n                <vertices id=\"LOD3spShape-lib-vertices\">\r\n                    <input semantic=\"POSITION\" source=\"#LOD3spShape-lib-positions\"/>\r\n                </vertices>\r\n                <polylist count=\"2144\" material=\"blinn3SG\">\r\n                    <input offset=\"0\" semantic=\"VERTEX\" source=\"#LOD3spShape-lib-vertices\"/>\r\n                    <input offset=\"1\" semantic=\"NORMAL\" source=\"#LOD3spShape-lib-normals\"/>\r\n                    <input offset=\"2\" semantic=\"TEXCOORD\" source=\"#LOD3spShape-lib-map1\" set=\"0\"/>\r\n                    <vcount>4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 </vcount>\r\n                    <p>89 0 23 243 1 26 90 2 28 6 3 29 91 4 30 243 1 26 89 0 23 5 5 31 92 6 33 244 7 35 91 4 30 5 5 31 299 8 36 244 7 35 92 6 33 218 9 37 7 10 39 95 11 41 93 12 42 8 13 57 93 12 42 95 11 41 94 14 61 9 15 62 96 16 65 245 17 66 89 0 23 6 3 29 89 0 23 245 17 66 97 18 67 5 5 31 97 18 67 245 17 66 98 19 68 11 20 69 98 19 68 245 17 66 96 16 65 10 21 70 97 18 67 246 22 71 92 6 33 5 5 31 92 6 33 246 22 71 300 23 72 218 9 37 300 23 72 246 22 71 99 24 84 219 25 85 99 24 84 246 22 71 97 18 67 11 20 69 12 26 86 247 27 89 93 12 42 9 15 62 93 12 42 247 27 89 100 28 90 8 13 57 13 29 135 102 30 137 101 31 138 14 32 139 101 31 138 102 30 137 7 10 39 8 13 57 103 33 140 248 34 141 98 19 68 10 21 70 98 19 68 248 34 141 104 35 142 11 20 69 104 35 142 248 34 141 105 36 200 16 37 246 105 36 200 248 34 141 103 33 140 15 38 249 100 28 90 107 39 252 101 31 138 8 13 57 101 31 138 107 39 252 106 40 253 14 32 139 108 41 254 109 42 256 13 29 135 14 32 139 18 43 259 109 42 256 108 41 254 17 44 260 106 40 253 111 45 262 108 41 254 14 32 139 108 41 254 111 45 262 110 46 265 17 44 260 20 47 266 112 48 283 113 49 285 19 50 286 113 49 285 112 48 283 18 43 259 17 44 260 110 46 265 115 51 289 113 49 285 17 44 260 113 49 285 115 51 289 114 52 290 19 50 286 22 53 291 116 54 292 117 55 293 21 56 294 117 55 293 116 54 292 20 47 266 19 50 286 114 52 290 119 57 295 117 55 293 19 50 286 117 55 293 119 57 295 118 58 296 21 56 294 23 59 297 249 60 298 120 61 300 24 62 303 120 61 300 249 60 298 22 53 291 21 56 294 118 58 296 122 63 304 120 61 300 21 56 294 120 61 300 122 63 304 121 64 884 24 62 303 26 65 885 339 66 886 340 67 887 123 68 888 123 68 888 340 67 887 341 69 889 28 70 890 341 69 889 340 67 887 124 71 891 27 72 892 124 71 891 340 67 887 339 66 886 25 73 893 125 74 894 250 75 895 307 76 896 29 77 897 307 76 896 250 75 895 126 78 898 227 79 899 126 78 898 250 75 895 123 68 888 28 70 890 123 68 888 250 75 895 125 74 894 26 65 885 126 78 898 127 80 900 45 81 901 227 79 899 126 78 898 28 70 890 30 82 902 127 80 900 128 83 0 251 84 1 308 85 2 31 86 3 308 85 74 251 84 75 129 87 76 228 88 77 129 87 76 251 84 75 130 89 78 33 90 79 130 89 4 251 84 1 128 83 0 32 91 12 131 92 13 252 93 14 309 94 15 34 95 16 309 94 15 252 93 14 128 83 0 31 86 3 128 83 0 252 93 14 132 96 17 32 91 12 132 96 17 252 93 14 131 92 13 35 97 18 133 98 82 253 99 83 132 96 17 35 97 18 132 96 17 253 99 83 134 100 91 32 91 12 134 100 91 253 99 83 156 101 92 36 102 93 156 101 92 253 99 83 133 98 82 38 103 94 135 104 96 254 105 97 136 106 98 39 107 101 136 106 98 254 105 97 137 108 102 37 109 105 137 108 102 254 105 97 133 98 82 35 97 18 133 98 82 254 105 97 135 104 96 38 103 94 104 35 142 255 110 903 99 24 84 11 20 69 99 24 84 255 110 903 310 111 904 219 25 85 310 111 904 255 110 903 138 112 905 1978 113 906 138 112 905 255 110 903 104 35 142 16 37 246 204 114 5 285 115 6 139 116 7 59 117 8 139 116 7 285 115 6 203 118 9 57 119 10 105 36 200 256 120 907 140 121 908 16 37 246 140 121 908 256 120 907 135 104 909 39 107 910 135 104 909 256 120 907 141 122 911 38 103 912 141 122 911 256 120 907 105 36 200 15 38 249 138 112 905 257 123 913 142 124 914 1978 113 906 142 124 914 257 123 913 154 125 915 229 126 916 154 125 915 257 123 913 140 121 908 39 107 910 140 121 908 257 123 913 138 112 905 16 37 246 143 127 11 284 128 19 202 129 20 60 130 21 203 118 9 284 128 19 143 127 11 57 119 10 144 131 917 56 132 918 2065 133 919 2066 134 920 311 135 921 258 136 922 125 74 894 29 77 897 125 74 894 258 136 922 145 137 923 26 65 885 145 137 80 258 136 81 146 138 95 40 139 99 146 138 95 258 136 81 311 135 100 41 140 103 43 141 924 147 142 925 148 143 926 42 144 927 148 143 926 147 142 925 23 59 297 24 62 303 149 145 928 259 146 929 124 71 891 25 73 893 124 71 891 259 146 929 150 147 976 27 72 892 150 147 976 259 146 929 147 142 925 43 141 924 147 142 925 259 146 929 149 145 928 23 59 297 121 64 884 152 148 978 148 143 926 24 62 303 148 143 926 152 148 978 151 149 980 42 144 927 231 150 981 30 82 902 28 70 890 341 69 889 231 150 981 341 69 889 27 72 892 44 151 982 153 152 104 260 153 106 129 87 76 33 90 79 129 87 76 260 153 106 312 154 107 228 88 77 312 154 107 260 153 106 146 138 95 41 140 103 146 138 95 260 153 106 153 152 104 40 139 99 154 125 110 261 155 111 313 156 112 229 126 113 313 156 112 261 155 111 155 157 114 230 158 115 155 157 114 261 155 111 136 106 98 37 109 105 136 106 98 261 155 111 154 125 110 39 107 101 153 152 104 262 159 108 181 160 109 40 139 99 181 160 116 262 159 117 134 100 91 36 102 93 134 100 91 262 159 117 130 89 4 32 91 12 130 89 78 262 159 108 153 152 104 33 90 79 137 108 102 263 161 118 155 157 114 37 109 105 155 157 114 263 161 118 314 162 119 230 158 115 314 162 119 263 161 118 131 92 13 34 95 16 131 92 13 263 161 118 137 108 102 35 97 18 151 149 980 241 163 983 157 164 985 42 144 927 157 164 985 241 163 983 242 165 987 83 166 1012 159 167 1013 264 168 1016 160 169 1017 44 151 982 160 169 1017 264 168 1016 239 170 1018 81 171 1019 239 170 1018 264 168 1016 238 172 1020 82 173 1023 238 172 1020 264 168 1016 159 167 1013 43 141 924 82 173 1023 238 172 1020 157 164 985 83 166 1012 157 164 985 238 172 1020 43 141 924 42 144 927 160 169 1017 265 174 1036 231 150 981 44 151 982 231 150 981 265 174 1036 232 175 1038 30 82 902 232 175 1038 265 174 1036 237 176 1039 80 177 1040 237 176 1039 265 174 1036 160 169 1017 81 171 1019 94 14 61 163 178 1041 164 179 1042 9 15 62 165 180 1043 266 181 1045 166 182 1046 46 183 1047 166 182 1046 266 181 1045 163 178 1041 94 14 61 90 2 28 288 184 1048 207 185 1049 6 3 29 164 179 1042 167 186 1050 12 26 86 9 15 62 166 182 1046 267 187 1051 168 188 1052 46 183 1047 168 188 1052 267 187 1051 169 189 1053 47 190 1054 169 189 1053 267 187 1051 95 11 41 7 10 39 95 11 41 267 187 1051 166 182 1046 94 14 61 207 185 1049 287 191 1055 96 16 65 6 3 29 96 16 65 287 191 1055 206 192 1056 10 21 70 170 193 22 268 194 2246 171 195 24 63 196 25 171 195 24 268 194 2246 172 197 2247 58 198 27 172 197 1057 268 194 1058 173 199 1059 64 200 1060 173 199 1059 268 194 1058 170 193 1061 62 201 1062 172 197 2247 269 202 2248 174 203 32 58 198 27 174 203 32 269 202 2248 175 204 2249 61 205 34 175 204 1063 269 202 1064 176 206 1065 65 207 1066 176 206 1065 269 202 1064 172 197 1057 64 200 1060 175 204 2249 270 208 2250 177 209 38 61 205 34 177 209 38 270 208 2250 178 210 2251 66 211 40 178 210 1067 270 208 1068 179 212 1069 67 213 1070 179 212 1069 270 208 1068 175 204 1063 65 207 1066 180 214 1071 271 215 1072 149 145 928 25 73 893 149 145 928 271 215 1072 249 60 298 23 59 297 249 60 298 271 215 1072 48 216 1073 22 53 291 150 147 976 159 167 1013 44 151 982 27 72 892 159 167 1013 150 147 976 43 141 924 48 216 1073 272 217 1074 116 54 292 22 53 291 116 54 292 272 217 1074 49 218 1075 20 47 266 49 218 1075 273 219 1076 112 48 283 20 47 266 112 48 283 273 219 1076 50 220 1077 18 43 259 50 220 1077 274 221 1078 109 42 256 18 43 259 109 42 256 274 221 1078 51 222 1079 13 29 135 169 189 1053 275 223 1080 52 224 1081 47 190 1054 51 222 1079 275 223 1080 102 30 137 13 29 135 102 30 137 275 223 1080 169 189 1053 7 10 39 206 192 1056 286 225 1082 103 33 140 10 21 70 103 33 140 286 225 1082 53 226 1083 15 38 249 53 226 1083 276 227 1084 141 122 911 15 38 249 141 122 911 276 227 1084 54 228 1085 38 103 912 156 101 1086 277 229 1087 55 230 1088 36 102 1089 54 228 1085 277 229 1087 156 101 1086 38 103 912 55 230 1088 182 231 1090 181 160 1091 36 102 1089 181 160 1091 182 231 1090 56 132 918 40 139 1092 202 129 20 283 232 43 183 233 44 60 130 21 201 234 45 68 235 46 183 233 44 283 232 43 56 132 918 144 131 917 145 137 923 40 139 1092 144 131 917 321 236 1093 339 66 886 26 65 885 145 137 923 276 227 1084 2069 237 1094 2070 238 1095 54 228 1085 290 239 47 208 240 48 184 241 49 278 242 50 210 243 51 290 239 47 278 242 50 185 244 52 2068 245 1096 2069 237 1094 276 227 1084 53 226 1083 277 229 1087 2071 246 1097 2073 247 1098 55 230 1088 289 248 53 209 249 54 186 250 55 279 251 56 208 240 48 289 248 53 279 251 56 184 241 49 2070 238 1095 2071 246 1097 277 229 1087 54 228 1085 275 223 1080 2075 252 1099 2076 253 1100 52 224 1081 294 254 2265 212 255 58 2053 256 59 280 257 60 214 258 1101 294 254 1102 280 257 1103 187 259 1104 2074 260 1105 2075 252 1099 275 223 1080 51 222 1079 286 225 1082 2072 261 1106 2068 245 1096 53 226 1083 292 262 63 210 243 51 185 244 52 2052 263 64 274 221 1078 2078 264 1107 2074 260 1105 51 222 1079 293 265 1108 214 258 1101 187 259 1104 2055 266 1109 213 267 1110 293 265 1108 2055 266 1109 188 268 1111 2079 269 1112 2078 264 1107 274 221 1078 50 220 1077 273 219 1076 2080 270 1113 2079 269 1112 50 220 1077 295 271 1114 213 267 1110 188 268 1111 2056 272 1115 215 273 1116 295 271 1114 2056 272 1115 189 274 1117 2081 275 1118 2080 270 1113 273 219 1076 49 218 1075 271 215 1072 2084 276 1119 2085 277 1120 48 216 1073 297 278 1121 216 279 1122 190 280 1123 281 281 1124 217 282 87 297 278 73 281 281 2271 191 283 88 2083 284 1125 2084 276 1119 271 215 1072 180 214 1071 272 217 1074 2082 285 1126 2081 275 1118 49 218 1075 296 286 1127 215 273 1116 189 274 1117 2057 287 1128 216 279 1122 296 286 1127 2057 287 1128 190 280 1123 2085 277 1120 2082 285 1126 272 217 1074 48 216 1073 182 231 1090 2064 288 1129 2065 133 919 56 132 918 291 289 120 211 290 121 2051 291 122 2050 292 123 209 249 54 291 289 120 2050 292 123 186 250 55 2073 247 1098 2064 288 1129 182 231 1090 55 230 1088 211 290 121 298 293 124 282 294 125 2051 291 122 298 293 124 323 295 126 322 296 127 282 294 125 70 297 128 192 298 129 139 116 7 57 119 10 59 117 8 139 116 7 192 298 129 71 299 130 69 300 131 193 301 132 143 127 11 60 130 21 70 297 128 57 119 10 143 127 11 193 301 132 73 302 133 194 303 134 170 193 22 63 196 25 62 201 1062 170 193 1061 194 303 1130 74 304 1131 59 117 8 71 299 130 205 305 136 204 114 5 62 201 1062 74 304 1131 195 306 1132 173 199 1059 64 200 1060 173 199 1059 195 306 1132 75 307 1133 64 200 1060 75 307 1133 196 308 1134 176 206 1065 65 207 1066 176 206 1065 196 308 1134 76 309 1135 77 310 1136 197 311 1137 178 210 1067 67 213 1070 66 211 40 178 210 2251 197 311 2267 78 312 143 65 207 1066 76 309 1135 198 313 1138 179 212 1069 77 310 1136 67 213 1070 179 212 1069 198 313 1138 72 314 201 199 315 202 183 233 44 68 235 46 69 300 131 60 130 21 183 233 44 199 315 202 200 316 203 72 314 201 68 235 46 201 234 45 338 317 204 200 316 203 201 234 45 337 318 205 338 317 204 337 318 205 66 211 40 78 312 143 283 232 43 336 319 206 337 318 205 201 234 45 177 209 38 336 319 206 335 320 207 61 205 34 284 128 19 334 321 208 335 320 207 202 129 20 174 203 32 334 321 208 333 322 209 58 198 27 285 115 6 332 323 210 333 322 209 203 118 9 171 195 24 332 323 210 331 324 232 63 196 25 331 324 232 204 114 5 205 305 136 330 325 233 331 324 232 330 325 233 73 302 133 63 196 25 329 326 234 292 262 63 2052 263 64 2054 327 235 2076 253 1100 2077 328 1139 328 329 1140 52 224 1081 52 224 1081 328 329 1140 327 330 1141 47 190 1054 287 191 1055 326 331 1142 327 330 1141 206 192 1056 168 188 1052 326 331 1142 325 332 1143 46 183 1047 288 184 1048 324 333 1144 325 332 1143 207 185 1049 193 301 132 289 248 53 208 240 48 70 297 128 209 249 54 289 248 53 193 301 132 69 300 131 210 243 51 292 262 63 205 305 136 71 299 130 208 240 48 290 239 47 192 298 129 70 297 128 192 298 129 290 239 47 210 243 51 71 299 130 199 315 202 291 289 120 209 249 54 69 300 131 211 290 121 291 289 120 199 315 202 72 314 201 292 262 63 329 326 234 330 325 233 205 305 136 2053 256 59 212 255 58 329 326 234 2054 327 235 195 306 1132 293 265 1108 213 267 1110 75 307 1133 214 258 1101 293 265 1108 195 306 1132 74 304 1131 212 255 58 294 254 2265 194 303 134 73 302 133 194 303 1130 294 254 1102 214 258 1101 74 304 1131 213 267 1110 295 271 1114 196 308 1134 75 307 1133 196 308 1134 295 271 1114 215 273 1116 76 309 1135 215 273 1116 296 286 1127 198 313 1138 76 309 1135 198 313 1138 296 286 1127 216 279 1122 77 310 1136 323 295 126 217 282 87 191 283 88 322 296 127 217 282 87 323 295 126 338 317 204 78 312 143 216 279 1122 297 278 1121 197 311 1137 77 310 1136 197 311 2267 297 278 73 217 282 87 78 312 143 200 316 203 298 293 124 211 290 121 72 314 201 247 27 89 301 334 1145 220 335 1146 100 28 90 221 336 1147 301 334 1145 247 27 89 12 26 86 107 39 252 302 337 1148 222 338 1149 106 40 253 220 335 1146 302 337 1148 107 39 252 100 28 90 111 45 262 303 339 1150 223 340 1151 110 46 265 222 338 1149 303 339 1150 111 45 262 106 40 253 115 51 289 304 341 1152 224 342 1153 114 52 290 223 340 1151 304 341 1152 115 51 289 110 46 265 119 57 295 305 343 1154 225 344 1155 118 58 296 224 342 1153 305 343 1154 119 57 295 114 52 290 122 63 304 306 345 1156 226 346 1157 121 64 884 225 344 1155 306 345 1156 122 63 304 118 58 296 152 148 978 346 347 1158 345 348 1159 151 149 980 152 148 978 121 64 884 226 346 1157 346 347 1158 241 163 983 344 349 1160 343 350 1161 242 165 987 241 163 983 151 149 980 345 348 1159 344 349 1160 167 186 1050 315 351 1162 221 336 1147 12 26 86 232 175 1038 316 352 1163 127 80 900 30 82 902 127 80 900 316 352 1163 162 353 1164 45 81 901 162 353 1164 316 352 1163 235 354 1165 79 355 1166 235 354 1165 316 352 1163 232 175 1038 80 177 1040 234 356 1167 317 357 1168 235 354 1165 80 177 1040 235 354 1165 317 357 1168 233 358 1169 79 355 1166 233 358 1169 317 357 1168 87 359 1170 3 360 1171 87 359 1170 317 357 1168 234 356 1167 2 361 1172 236 362 1173 318 363 1174 237 176 1039 81 171 1019 237 176 1039 318 363 1174 234 356 1167 80 177 1040 234 356 1167 318 363 1174 86 364 1175 2 361 1172 86 364 1175 318 363 1174 236 362 1173 1 365 1176 239 170 1018 319 366 1177 236 362 1173 81 171 1019 236 362 1173 319 366 1177 85 367 1178 1 365 1176 85 367 1178 319 366 1177 161 368 1179 0 369 1180 161 368 1179 319 366 1177 239 170 1018 82 173 1023 0 369 1180 161 368 1179 240 370 1181 4 371 1182 240 370 1181 161 368 1179 82 173 1023 83 166 1012 242 165 987 158 372 1183 240 370 1181 83 166 1012 240 370 1181 158 372 1183 84 373 1184 4 371 1182 343 350 1161 342 374 1185 158 372 1183 242 165 987 158 372 1183 342 374 1185 88 375 1186 84 373 1184 144 131 917 2066 134 920 2067 376 1187 321 236 1093 339 66 886 321 236 1093 180 214 1071 25 73 893 2067 376 1187 2083 284 1125 180 214 1071 321 236 1093 46 183 1047 325 332 1143 324 333 1144 165 180 1043 207 185 1049 325 332 1143 326 331 1142 287 191 1055 47 190 1054 327 330 1141 326 331 1142 168 188 1052 206 192 1056 327 330 1141 328 329 1140 286 225 1082 286 225 1082 328 329 1140 2077 328 1139 2072 261 1106 73 302 133 330 325 233 329 326 234 212 255 58 204 114 5 331 324 232 332 323 210 285 115 6 58 198 27 333 322 209 332 323 210 171 195 24 203 118 9 333 322 209 334 321 208 284 128 19 61 205 34 335 320 207 334 321 208 174 203 32 202 129 20 335 320 207 336 319 206 283 232 43 66 211 40 337 318 205 336 319 206 177 209 38 200 316 203 338 317 204 323 295 126 298 293 124 299 8 36 218 9 37 2022 377 1188 2017 378 1189 218 9 37 300 23 72 2021 379 1190 2022 377 1188 300 23 72 219 25 85 2023 380 1191 2021 379 1190 220 335 1146 301 334 1145 674 381 1192 592 382 1193 301 334 1145 221 336 1147 593 383 1194 674 381 1192 222 338 1149 302 337 1148 675 384 1195 594 385 1196 302 337 1148 220 335 1146 592 382 1193 675 384 1195 223 340 1151 303 339 1150 676 386 1197 595 387 1198 303 339 1150 222 338 1149 594 385 1196 676 386 1197 224 342 1153 304 341 1152 677 388 1199 596 389 1200 304 341 1152 223 340 1151 595 387 1198 677 388 1199 225 344 1155 305 343 1154 678 390 1201 597 391 1202 305 343 1154 224 342 1153 596 389 1200 678 390 1201 226 346 1157 306 345 1156 679 392 1203 598 393 1204 306 345 1156 225 344 1155 597 391 1202 679 392 1203 2036 394 1205 2037 395 1206 680 396 1207 599 397 1208 2037 395 1206 2038 398 1209 600 399 1210 680 396 1207 2038 398 1209 2039 400 1211 608 401 1212 600 399 1210 31 86 3 308 85 2 2019 402 144 2033 403 2261 602 404 148 681 405 149 2019 402 2264 2020 406 2259 34 95 16 309 94 15 2032 407 2262 2031 408 2252 309 94 15 31 86 3 2033 403 2261 2032 407 2262 219 25 85 310 111 904 2024 409 1213 2023 380 1191 684 410 1214 604 411 1215 2025 412 1216 2026 413 1217 2034 414 2258 2035 415 2260 685 416 158 605 417 159 2035 415 1218 2036 394 1205 599 397 1208 685 416 1219 345 348 1159 346 347 1158 1971 418 1220 1970 419 1221 346 347 1158 226 346 1157 598 393 1204 1971 418 1220 2020 406 2259 2016 420 2257 686 421 161 602 404 148 2016 420 2257 2034 414 2258 605 417 159 686 421 161 229 126 113 313 156 112 2028 422 2255 2027 423 2256 313 156 112 230 158 115 2029 424 2254 2028 422 2255 230 158 115 314 162 119 2030 425 2253 2029 424 2254 314 162 119 34 95 16 2031 408 2252 2030 425 2253 343 350 1161 344 349 1160 1969 426 1222 1968 427 1223 344 349 1160 345 348 1159 1970 419 1221 1969 426 1222 2039 400 1211 2040 428 1224 689 429 1225 608 401 1212 2040 428 1224 2041 430 1226 612 431 1227 689 429 1225 221 336 1147 315 351 1162 690 432 1228 593 383 1194 2041 430 1226 2042 433 1229 692 434 1230 612 431 1227 2042 433 1229 2043 435 1231 434 436 1232 692 434 1230 88 375 1186 342 374 1185 1967 437 1233 435 438 1234 342 374 1185 343 350 1161 1968 427 1223 1967 437 1233 436 439 1235 353 440 1236 437 441 1237 622 442 1238 438 443 1239 352 444 1240 436 439 1235 622 442 1238 439 445 1241 352 444 1240 438 443 1239 623 446 1242 440 447 1243 354 448 1244 439 445 1241 623 446 1242 355 449 1245 356 450 1246 441 451 1247 443 452 1248 441 451 1247 357 453 1249 442 454 1250 443 452 1248 444 455 1251 353 440 1236 436 439 1235 624 456 1252 436 439 1235 352 444 1240 445 457 1253 624 456 1252 445 457 1253 359 458 1254 446 459 1255 624 456 1252 446 459 1255 358 460 1256 444 455 1251 624 456 1252 445 457 1253 352 444 1240 439 445 1241 625 461 1257 439 445 1241 354 448 1244 447 462 1258 625 461 1257 447 462 1258 360 463 1259 448 464 1260 625 461 1257 448 464 1260 359 458 1254 445 457 1253 625 461 1257 361 465 1261 357 453 1249 441 451 1247 626 466 1262 441 451 1247 356 450 1246 449 467 1263 626 466 1262 362 468 1264 363 469 1265 450 470 1266 451 471 1267 450 470 1266 356 450 1246 355 449 1245 451 471 1267 452 472 1268 358 460 1256 446 459 1255 627 473 1269 446 459 1255 359 458 1254 453 474 1270 627 473 1269 453 474 1270 365 475 1271 454 476 1272 627 473 1269 454 476 1272 364 477 1273 452 472 1268 627 473 1269 449 467 1263 356 450 1246 450 470 1266 456 478 1274 450 470 1266 363 469 1265 455 479 1275 456 478 1274 457 480 1276 363 469 1265 362 468 1264 458 481 1277 367 482 1278 366 483 1279 457 480 1276 458 481 1277 455 479 1275 363 469 1265 457 480 1276 460 484 1280 457 480 1276 366 483 1279 459 485 1281 460 484 1280 369 486 1282 368 487 1283 462 488 1284 461 489 1285 462 488 1284 366 483 1279 367 482 1278 461 489 1285 459 485 1281 366 483 1279 462 488 1284 464 490 1286 462 488 1284 368 487 1283 463 491 1287 464 490 1286 371 492 1288 370 493 1289 466 494 1290 465 495 1291 466 494 1290 368 487 1283 369 486 1282 465 495 1291 463 491 1287 368 487 1283 466 494 1290 468 496 1292 466 494 1290 370 493 1289 467 497 1293 468 496 1292 372 498 1294 373 499 1295 469 500 1296 628 501 1297 469 500 1296 370 493 1289 371 492 1288 628 501 1297 467 497 1293 370 493 1289 469 500 1296 471 502 1298 469 500 1296 373 499 1295 470 503 1299 471 502 1298 375 504 1300 472 505 1301 1965 506 1302 1964 507 1303 472 505 1301 377 508 1304 1966 509 1305 1965 506 1302 1966 509 1305 376 510 1306 473 511 1307 1965 506 1302 473 511 1307 374 512 1308 1964 507 1303 1965 506 1302 474 513 1309 378 514 1310 475 515 1311 629 516 1312 475 515 1311 379 517 1313 476 518 1314 629 516 1312 476 518 1314 377 508 1304 472 505 1301 629 516 1312 472 505 1301 375 504 1300 474 513 1309 629 516 1312 476 518 1314 379 517 1313 399 519 1315 477 520 1316 476 518 1314 477 520 1316 380 521 1317 377 508 1304 478 522 162 381 523 163 479 524 164 630 525 165 479 524 174 382 526 175 480 527 176 630 525 177 480 527 176 384 528 178 481 529 179 630 525 177 481 529 166 383 530 167 478 522 162 630 525 165 482 531 168 385 532 169 483 533 170 631 534 171 483 533 170 381 523 163 478 522 162 631 534 171 478 522 162 383 530 167 484 535 172 631 534 171 484 535 172 386 536 173 482 531 168 631 534 171 485 537 180 386 536 173 484 535 172 632 538 181 484 535 172 383 530 167 486 539 182 632 538 181 486 539 182 387 540 183 511 541 184 632 538 181 511 541 184 390 542 185 485 537 180 632 538 181 487 543 186 391 544 187 488 545 188 633 546 189 488 545 188 388 547 190 489 548 191 633 546 189 489 548 191 386 536 173 485 537 180 633 546 189 485 537 180 390 542 185 487 543 186 633 546 189 453 474 1270 359 458 1254 448 464 1260 634 549 1318 448 464 1260 360 463 1259 490 550 1319 634 549 1318 490 550 1319 389 551 1320 491 552 1321 634 549 1318 491 552 1321 365 475 1271 453 474 1270 634 549 1318 575 553 236 405 554 237 492 555 238 659 556 239 492 555 238 403 557 240 574 558 241 659 556 239 454 476 1272 365 475 1271 493 559 1322 635 560 1323 493 559 1322 391 544 1324 487 543 1325 635 560 1323 487 543 1325 390 542 1326 494 561 1327 635 560 1323 494 561 1327 364 477 1273 454 476 1272 635 560 1323 491 552 1321 389 551 1320 495 562 1328 636 563 1329 495 562 1328 392 564 1330 508 565 1331 636 563 1329 508 565 1331 391 544 1324 493 559 1322 636 563 1329 493 559 1322 365 475 1271 491 552 1321 636 563 1329 496 566 242 406 567 243 573 568 244 658 569 245 574 558 241 403 557 240 496 566 242 658 569 245 651 570 1332 2087 571 1333 2088 572 1334 552 573 1335 497 574 1336 378 514 1310 474 513 1309 637 575 1337 474 513 1309 375 504 1300 498 576 1338 637 575 1337 498 576 211 394 577 212 499 578 213 637 575 214 499 578 213 395 579 215 497 574 216 637 575 214 397 580 1339 396 581 1340 501 582 1341 500 583 1342 501 582 1341 373 499 1295 372 498 1294 500 583 1342 502 584 1343 374 512 1308 473 511 1307 638 585 1344 473 511 1307 376 510 1306 503 586 1345 638 585 1344 503 586 1345 397 580 1339 500 583 1342 638 585 1344 500 583 1342 372 498 1294 502 584 1343 638 585 1344 470 503 1299 373 499 1295 501 582 1341 505 587 1346 501 582 1341 396 581 1340 504 588 1347 505 587 1346 609 589 1348 1966 509 1305 377 508 1304 380 521 1317 609 589 1348 398 590 1349 376 510 1306 1966 509 1305 506 591 217 384 528 178 480 527 176 639 592 218 480 527 176 382 526 175 507 593 219 639 592 218 507 593 219 395 579 215 499 578 213 639 592 218 499 578 213 394 577 212 506 591 217 639 592 218 508 565 192 392 564 193 509 594 194 640 595 195 509 594 194 400 596 196 510 597 197 640 595 195 510 597 197 388 547 190 488 545 188 640 595 195 488 545 188 391 544 187 508 565 192 640 595 195 506 591 217 394 577 212 538 598 226 641 599 227 538 598 198 387 540 183 486 539 182 641 599 199 486 539 182 383 530 167 481 529 166 641 599 199 481 529 179 384 528 178 506 591 217 641 599 227 489 548 191 388 547 190 510 597 197 642 600 220 510 597 197 400 596 196 512 601 221 642 600 220 512 601 221 385 532 169 482 531 168 642 600 220 482 531 168 386 536 173 489 548 191 642 600 220 504 588 1347 396 581 1340 513 602 1350 620 603 1351 513 602 1350 429 604 1352 621 605 1353 620 603 1351 515 606 1354 398 590 1349 516 607 1355 643 608 1356 516 607 1355 427 609 1357 618 610 1358 643 608 1356 618 610 1358 428 611 1359 617 612 1360 643 608 1356 617 612 1360 397 580 1339 515 606 1354 643 608 1356 428 611 1359 429 604 1352 513 602 1350 617 612 1360 513 602 1350 396 581 1340 397 580 1339 617 612 1360 516 607 1355 398 590 1349 609 589 1348 644 613 1361 609 589 1348 380 521 1317 610 614 1362 644 613 1361 610 614 1362 426 615 1363 616 616 1364 644 613 1361 616 616 1364 427 609 1357 516 607 1355 644 613 1361 442 454 1250 357 453 1249 520 617 1365 519 618 1366 521 619 1367 401 620 1368 522 621 1369 645 622 1370 522 621 1369 442 454 1250 519 618 1366 645 622 1370 437 441 1237 353 440 1236 579 623 1371 661 624 1372 520 617 1365 357 453 1249 361 465 1261 523 625 1373 522 621 1369 401 620 1368 524 626 1374 646 627 1375 524 626 1374 402 628 1376 525 629 1377 646 627 1375 525 629 1377 355 449 1245 443 452 1248 646 627 1375 443 452 1248 442 454 1250 522 621 1369 646 627 1375 579 623 1371 353 440 1236 444 455 1251 660 630 1378 444 455 1251 358 460 1256 578 631 1379 660 630 1378 526 632 2273 409 633 247 527 634 248 647 635 2268 527 634 248 404 636 250 528 637 251 647 635 2268 528 637 1380 410 638 1381 529 639 1382 647 635 1383 529 639 1382 408 640 1384 526 632 1385 647 635 1383 528 637 251 404 636 250 530 641 255 648 642 2269 530 641 255 407 643 257 531 644 258 648 642 2269 531 644 1386 411 645 1387 532 646 1388 648 642 1389 532 646 1388 410 638 1381 528 637 1380 648 642 1389 531 644 258 407 643 257 533 647 261 649 648 2272 533 647 261 412 649 263 534 650 264 649 648 2272 534 650 1390 413 651 1391 535 652 1392 649 648 1393 535 652 1392 411 645 1387 531 644 1386 649 648 1393 393 653 1394 374 512 1308 502 584 1343 537 654 1395 502 584 1343 372 498 1294 628 501 1297 537 654 1395 628 501 1297 371 492 1288 536 655 1396 537 654 1395 503 586 1345 376 510 1306 398 590 1349 515 606 1354 515 606 1354 397 580 1339 503 586 1345 536 655 1396 371 492 1288 465 495 1291 540 656 1397 465 495 1291 369 486 1282 539 657 1398 540 656 1397 539 657 1398 369 486 1282 461 489 1285 542 658 1399 461 489 1285 367 482 1278 541 659 1400 542 658 1399 541 659 1400 367 482 1278 458 481 1277 544 660 1401 458 481 1277 362 468 1264 543 661 1402 544 660 1401 525 629 1377 402 628 1376 545 662 1403 546 663 1404 543 661 1402 362 468 1264 451 471 1267 546 663 1404 451 471 1267 355 449 1245 525 629 1377 546 663 1404 578 631 1379 358 460 1256 452 472 1268 577 664 1405 452 472 1268 364 477 1273 547 665 1406 577 664 1405 547 665 1406 364 477 1273 494 561 1327 549 666 1407 494 561 1327 390 542 1326 548 667 1408 549 666 1407 511 541 1409 387 540 1410 550 668 1411 551 669 1412 548 667 1408 390 542 1326 511 541 1409 551 669 1412 550 668 1411 387 540 1410 538 598 1413 650 670 1414 538 598 1413 394 577 1415 552 573 1335 650 670 1414 573 568 244 406 567 243 553 671 267 657 672 268 572 673 269 657 672 268 553 671 267 414 674 270 552 573 1335 394 577 1415 498 576 1338 651 570 1332 651 570 1332 498 576 1338 375 504 1300 1964 507 1303 1945 675 1416 549 666 1407 548 667 1408 2091 676 1417 2092 677 1418 580 678 271 663 679 272 652 680 273 554 681 274 663 679 272 582 682 275 555 683 276 652 680 273 2093 684 1419 547 665 1406 549 666 1407 2092 677 1418 551 669 1412 550 668 1411 2095 685 1420 2090 686 1421 581 687 277 662 688 278 653 689 279 556 690 280 662 688 278 580 678 271 554 681 274 653 689 279 2091 676 1417 548 667 1408 551 669 1412 2090 686 1421 546 663 1404 545 662 1403 2097 691 1422 2098 692 1423 584 693 281 667 694 282 654 695 2270 557 696 284 667 694 1424 586 697 1425 558 698 1426 654 695 1427 2099 699 1428 543 661 1402 546 663 1404 2098 692 1423 577 664 1405 547 665 1406 2093 684 1419 2094 700 1429 582 682 275 665 701 287 2060 702 288 555 683 276 544 660 1401 543 661 1402 2099 699 1428 2100 703 1430 586 697 1425 666 704 1431 2061 705 1432 558 698 1426 666 704 1431 585 706 1433 559 707 1434 2061 705 1432 2101 708 1435 541 659 1400 544 660 1401 2100 703 1430 542 658 1399 541 659 1400 2101 708 1435 2102 709 1436 585 706 1433 668 710 1437 2062 711 1438 559 707 1434 668 710 1437 587 712 1439 560 713 1440 2062 711 1438 2103 714 1441 539 657 1398 542 658 1399 2102 709 1436 537 654 1395 536 655 1396 2105 715 1442 2106 716 1443 588 717 1444 670 718 1445 655 719 1446 561 720 1447 670 718 2275 589 721 301 562 722 302 655 719 299 2107 723 1448 393 653 1394 537 654 1395 2106 716 1443 540 656 1397 539 657 1398 2103 714 1441 2104 724 1449 587 712 1439 669 725 1450 2063 726 1451 560 713 1440 669 725 1450 588 717 1444 561 720 1447 2063 726 1451 2105 715 1442 536 655 1396 540 656 1397 2104 724 1449 650 670 1414 552 573 1335 2088 572 1334 2089 727 1452 583 728 305 664 729 306 2059 730 307 2058 731 308 664 729 306 581 687 277 556 690 280 2059 730 307 2095 685 1420 550 668 1411 650 670 1414 2089 727 1452 671 732 309 583 728 305 2058 731 308 656 733 310 1947 734 311 671 732 309 656 733 310 1946 735 970 563 736 971 416 737 972 403 557 240 492 555 238 563 736 971 492 555 238 405 554 237 417 738 973 564 739 974 415 740 975 406 567 243 496 566 242 564 739 974 496 566 242 403 557 240 416 737 972 565 741 2274 419 742 977 409 633 247 526 632 2273 565 741 1453 526 632 1385 408 640 1384 420 743 1454 576 744 979 417 738 973 405 554 237 575 553 236 566 745 1455 420 743 1454 408 640 1384 529 639 1382 566 745 1455 529 639 1382 410 638 1381 421 746 1456 567 747 1457 421 746 1456 410 638 1381 532 646 1388 567 747 1457 532 646 1388 411 645 1387 422 748 1458 568 749 1459 423 750 1460 413 651 1391 534 650 1390 568 749 984 534 650 264 412 649 263 424 751 986 569 752 1461 422 748 1458 411 645 1387 535 652 1392 569 752 1461 535 652 1392 413 651 1391 423 750 1460 570 753 988 418 754 989 414 674 270 553 671 267 570 753 988 553 671 267 406 567 243 415 740 975 414 674 270 418 754 989 571 755 990 572 673 269 572 673 269 571 755 990 1963 756 991 1962 757 992 424 751 986 412 649 263 1962 757 992 1963 756 991 657 672 268 572 673 269 1962 757 992 1961 758 993 533 647 261 407 643 257 1960 759 994 1961 758 993 658 569 245 573 568 244 1960 759 994 1959 760 995 530 641 255 404 636 250 1958 761 996 1959 760 995 659 556 239 574 558 241 1958 761 996 1957 762 997 527 634 248 409 633 247 1956 763 998 1957 762 997 576 744 979 575 553 236 1956 763 998 1955 764 999 409 633 247 419 742 977 1955 764 999 1956 763 998 2060 702 288 665 701 287 1954 765 1000 1953 766 1001 2097 691 1422 545 662 1403 1952 767 1462 2096 768 1463 545 662 1403 402 628 1376 1951 769 1464 1952 767 1462 660 630 1378 578 631 1379 1951 769 1464 1950 770 1465 524 626 1374 401 620 1368 1949 771 1466 1950 770 1465 661 624 1372 579 623 1371 1949 771 1466 1948 772 1467 564 739 974 416 737 972 580 678 271 662 688 278 581 687 277 415 740 975 564 739 974 662 688 278 582 682 275 417 738 973 576 744 979 665 701 287 580 678 271 416 737 972 563 736 971 663 679 272 563 736 971 417 738 973 582 682 275 663 679 272 570 753 988 415 740 975 581 687 277 664 729 306 583 728 305 418 754 989 570 753 988 664 729 306 665 701 287 576 744 979 1955 764 999 1954 765 1000 1954 765 1000 584 693 281 557 696 284 1953 766 1001 566 745 1455 421 746 1456 585 706 1433 666 704 1431 586 697 1425 420 743 1454 566 745 1455 666 704 1431 584 693 281 419 742 977 565 741 2274 667 694 282 565 741 1453 420 743 1454 586 697 1425 667 694 1424 585 706 1433 421 746 1456 567 747 1457 668 710 1437 567 747 1457 422 748 1458 587 712 1439 668 710 1437 587 712 1439 422 748 1458 569 752 1461 669 725 1450 569 752 1461 423 750 1460 588 717 1444 669 725 1450 589 721 301 1947 734 311 1946 735 970 562 722 302 589 721 301 424 751 986 1963 756 991 1947 734 311 588 717 1444 423 750 1460 568 749 1459 670 718 1445 568 749 984 424 751 986 589 721 301 670 718 2275 571 755 990 418 754 989 583 728 305 671 732 309 590 773 1468 354 448 1244 440 447 1243 672 774 1469 447 462 1258 354 448 1244 590 773 1468 673 775 1470 591 776 1471 360 463 1259 447 462 1258 673 775 1470 626 466 1262 449 467 1263 592 382 1193 674 381 1192 593 383 1194 361 465 1261 626 466 1262 674 381 1192 456 478 1274 455 479 1275 594 385 1196 675 384 1195 592 382 1193 449 467 1263 456 478 1274 675 384 1195 460 484 1280 459 485 1281 595 387 1198 676 386 1197 594 385 1196 455 479 1275 460 484 1280 676 386 1197 464 490 1286 463 491 1287 596 389 1200 677 388 1199 595 387 1198 459 485 1281 464 490 1286 677 388 1199 468 496 1292 467 497 1293 597 391 1202 678 390 1201 596 389 1200 463 491 1287 468 496 1292 678 390 1201 471 502 1298 470 503 1299 598 393 1204 679 392 1203 597 391 1202 467 497 1293 471 502 1298 679 392 1203 475 515 1311 378 514 1310 599 397 1208 680 396 1207 600 399 1210 379 517 1313 475 515 1311 680 396 1207 399 519 1315 379 517 1313 600 399 1210 608 401 1212 479 524 164 381 523 163 601 777 222 681 405 223 602 404 148 382 526 175 479 524 174 681 405 149 483 533 170 385 532 169 603 778 224 682 779 225 601 777 222 381 523 163 483 533 170 682 779 225 490 550 1319 360 463 1259 591 776 1471 683 780 1472 604 411 1215 389 551 1320 490 550 1319 683 780 1472 495 562 1328 389 551 1320 604 411 1215 684 410 1214 606 781 1473 392 564 1330 495 562 1328 684 410 1214 497 574 216 395 579 215 605 417 159 685 416 158 599 397 1208 378 514 1310 497 574 1336 685 416 1219 505 587 1346 504 588 1347 1970 419 1221 1971 418 1220 505 587 1346 1971 418 1220 598 393 1204 470 503 1299 507 593 219 382 526 175 602 404 148 686 421 161 605 417 159 395 579 215 507 593 219 686 421 161 509 594 194 392 564 193 606 781 228 687 782 229 607 783 230 400 596 196 509 594 194 687 782 229 512 601 221 400 596 196 607 783 230 688 784 231 603 778 224 385 532 169 512 601 221 688 784 231 620 603 1351 621 605 1353 1968 427 1223 1969 426 1222 620 603 1351 1969 426 1222 1970 419 1221 504 588 1347 518 785 1474 399 519 1315 608 401 1212 689 429 1225 612 431 1227 425 786 1475 518 785 1474 689 429 1225 523 625 1373 361 465 1261 593 383 1194 690 432 1228 610 614 1362 380 521 1317 477 520 1316 691 787 1476 477 520 1316 399 519 1315 518 785 1474 691 787 1476 518 785 1474 425 786 1475 614 788 1477 691 787 1476 614 788 1477 426 615 1363 610 614 1362 691 787 1476 611 789 1478 425 786 1475 612 431 1227 692 434 1230 434 436 1232 350 790 1479 611 789 1478 692 434 1230 613 791 1480 426 615 1363 614 788 1477 693 792 1481 614 788 1477 425 786 1475 611 789 1478 693 792 1481 611 789 1478 350 790 1479 433 793 1482 693 792 1481 433 793 1482 349 794 1483 613 791 1480 693 792 1481 615 795 1484 427 609 1357 616 616 1364 694 796 1485 616 616 1364 426 615 1363 613 791 1480 694 796 1485 613 791 1480 349 794 1483 432 797 1486 694 796 1485 432 797 1486 348 798 1487 615 795 1484 694 796 1485 618 610 1358 427 609 1357 615 795 1484 695 799 1488 615 795 1484 348 798 1487 431 800 1489 695 799 1488 431 800 1489 347 801 1490 517 802 1491 695 799 1488 517 802 1491 428 611 1359 618 610 1358 695 799 1488 347 801 1490 351 803 1492 619 804 1493 517 802 1491 619 804 1493 429 604 1352 428 611 1359 517 802 1491 621 605 1353 429 604 1352 619 804 1493 514 805 1494 619 804 1493 351 803 1492 430 806 1495 514 805 1494 1968 427 1223 621 605 1353 514 805 1494 1967 437 1233 514 805 1494 430 806 1495 435 438 1234 1967 437 1233 696 807 1496 697 808 1497 710 809 1498 709 810 1499 697 808 1497 698 811 1500 711 812 1501 710 809 1498 698 811 1500 699 813 1502 712 814 1503 711 812 1501 699 813 1502 700 815 1504 713 816 1505 712 814 1503 700 815 1504 701 817 1506 714 818 1507 713 816 1505 701 817 1506 702 819 1508 715 820 1509 714 818 1507 702 819 1508 703 821 1510 716 822 1511 715 820 1509 703 821 1510 704 823 1512 717 824 1513 716 822 1511 704 823 1512 705 825 1514 718 826 1515 717 824 1513 705 825 1514 706 827 1516 719 828 1517 718 826 1515 706 827 1516 707 829 1518 720 830 1519 719 828 1517 707 829 1518 1331 831 1520 721 832 1521 720 830 1519 708 833 1522 722 834 1523 1979 835 1524 1980 836 1525 709 810 1499 710 809 1498 724 837 1526 723 838 1527 710 809 1498 711 812 1501 725 839 1528 724 837 1526 711 812 1501 712 814 1503 726 840 1529 725 839 1528 712 814 1503 713 816 1505 727 841 1530 726 840 1529 713 816 1505 714 818 1507 728 842 1531 727 841 1530 714 818 1507 715 820 1509 729 843 1532 728 842 1531 715 820 1509 716 822 1511 730 844 1533 729 843 1532 716 822 1511 717 824 1513 731 845 1534 730 844 1533 717 824 1513 718 826 1515 732 846 1535 731 845 1534 718 826 1515 719 828 1517 733 847 1536 732 846 1535 719 828 1517 720 830 1519 734 848 1537 733 847 1536 1333 849 1538 721 832 1521 1979 835 1524 1982 850 1539 723 838 1527 724 837 1526 737 851 1540 736 852 1541 724 837 1526 725 839 1528 738 853 1542 737 851 1540 725 839 1528 726 840 1529 739 854 1543 738 853 1542 726 840 1529 727 841 1530 740 855 1544 739 854 1543 727 841 1530 728 842 1531 741 856 1545 740 855 1544 728 842 1531 729 843 1532 742 857 1546 741 856 1545 729 843 1532 730 844 1533 743 858 1547 742 857 1546 730 844 1533 731 845 1534 744 859 1548 743 858 1547 731 845 1534 732 846 1535 745 860 1549 744 859 1548 732 846 1535 733 847 1536 746 861 1550 745 860 1549 733 847 1536 734 848 1537 747 862 1551 746 861 1550 1334 863 1552 1333 849 1538 1982 850 1539 1983 864 1553 736 852 1541 737 851 1540 750 865 1554 749 866 1555 737 851 1540 738 853 1542 751 867 1556 750 865 1554 738 853 1542 739 854 1543 752 868 1557 751 867 1556 739 854 1543 740 855 1544 753 869 1558 752 868 1557 740 855 1544 741 856 1545 754 870 1559 753 869 1558 741 856 1545 742 857 1546 755 871 1560 754 870 1559 742 857 1546 743 858 1547 756 872 1561 755 871 1560 743 858 1547 744 859 1548 757 873 1562 756 872 1561 744 859 1548 745 860 1549 758 874 1563 757 873 1562 745 860 1549 746 861 1550 759 875 1564 758 874 1563 746 861 1550 747 862 1551 760 876 1565 759 875 1564 1335 877 1566 1334 863 1552 1983 864 1553 1984 878 1567 749 866 1555 750 865 1554 763 879 1568 762 880 1569 750 865 1554 751 867 1556 764 881 1570 763 879 1568 751 867 1556 752 868 1557 765 882 1571 764 881 1570 752 868 1557 753 869 1558 766 883 1572 765 882 1571 753 869 1558 754 870 1559 767 884 1573 766 883 1572 754 870 1559 755 871 1560 768 885 1574 767 884 1573 755 871 1560 756 872 1561 769 886 1575 768 885 1574 756 872 1561 757 873 1562 770 887 1576 769 886 1575 757 873 1562 758 874 1563 771 888 1577 770 887 1576 758 874 1563 759 875 1564 772 889 1578 771 888 1577 759 875 1564 760 876 1565 773 890 1579 772 889 1578 1336 891 1580 1335 877 1566 1984 878 1567 1981 892 1581 762 880 1569 763 879 1568 776 893 1582 775 894 1583 763 879 1568 764 881 1570 777 895 1584 776 893 1582 764 881 1570 765 882 1571 778 896 1585 777 895 1584 765 882 1571 766 883 1572 779 897 1586 778 896 1585 766 883 1572 767 884 1573 780 898 1587 779 897 1586 767 884 1573 768 885 1574 781 899 1588 780 898 1587 768 885 1574 769 886 1575 782 900 1589 781 899 1588 769 886 1575 770 887 1576 783 901 1590 782 900 1589 770 887 1576 771 888 1577 784 902 1591 783 901 1590 771 888 1577 772 889 1578 785 903 1592 784 902 1591 772 889 1578 773 890 1579 786 904 1593 785 903 1592 2 361 1172 1336 891 1580 1981 892 1581 87 359 1170 775 894 1583 776 893 1582 788 905 1594 787 906 1595 776 893 1582 777 895 1584 789 907 1596 788 905 1594 777 895 1584 778 896 1585 790 908 1597 789 907 1596 778 896 1585 779 897 1586 791 909 1598 790 908 1597 779 897 1586 780 898 1587 792 910 1599 791 909 1598 780 898 1587 781 899 1588 793 911 1600 792 910 1599 781 899 1588 782 900 1589 794 912 1601 793 911 1600 782 900 1589 783 901 1590 795 913 1602 794 912 1601 783 901 1590 784 902 1591 796 914 1603 795 913 1602 784 902 1591 785 903 1592 797 915 1604 796 914 1603 785 903 1592 786 904 1593 798 916 1605 797 915 1604 787 906 1595 788 905 1594 800 917 1606 799 918 1607 788 905 1594 789 907 1596 801 919 1608 800 917 1606 789 907 1596 790 908 1597 802 920 1609 801 919 1608 790 908 1597 791 909 1598 803 921 1610 802 920 1609 791 909 1598 792 910 1599 804 922 1611 803 921 1610 792 910 1599 793 911 1600 805 923 1612 804 922 1611 793 911 1600 794 912 1601 806 924 1613 805 923 1612 794 912 1601 795 913 1602 807 925 1614 806 924 1613 795 913 1602 796 914 1603 808 926 1615 807 925 1614 796 914 1603 797 915 1604 809 927 1616 808 926 1615 797 915 1604 798 916 1605 810 928 1617 809 927 1616 799 918 1607 800 917 1606 812 929 1618 811 930 1619 800 917 1606 801 919 1608 813 931 1620 812 929 1618 801 919 1608 802 920 1609 814 932 1621 813 931 1620 802 920 1609 803 921 1610 815 933 1622 814 932 1621 803 921 1610 804 922 1611 816 934 1623 815 933 1622 804 922 1611 805 923 1612 817 935 1624 816 934 1623 805 923 1612 806 924 1613 818 936 1625 817 935 1624 806 924 1613 807 925 1614 819 937 1626 818 936 1625 807 925 1614 808 926 1615 820 938 1627 819 937 1626 808 926 1615 809 927 1616 821 939 1628 820 938 1627 809 927 1616 810 928 1617 822 940 1629 821 939 1628 811 930 1619 812 929 1618 824 941 1630 823 942 1631 812 929 1618 813 931 1620 825 943 1632 824 941 1630 813 931 1620 814 932 1621 826 944 1633 825 943 1632 814 932 1621 815 933 1622 827 945 1634 826 944 1633 815 933 1622 816 934 1623 828 946 1635 827 945 1634 816 934 1623 817 935 1624 829 947 1636 828 946 1635 817 935 1624 818 936 1625 830 948 1637 829 947 1636 818 936 1625 819 937 1626 831 949 1638 830 948 1637 819 937 1626 820 938 1627 832 950 1639 831 949 1638 820 938 1627 821 939 1628 833 951 1640 832 950 1639 821 939 1628 822 940 1629 834 952 1641 833 951 1640 823 942 1631 824 941 1630 835 953 1642 846 954 1643 824 941 1630 825 943 1632 836 955 1644 835 953 1642 825 943 1632 826 944 1633 837 956 1645 836 955 1644 826 944 1633 827 945 1634 838 957 1646 837 956 1645 827 945 1634 828 946 1635 839 958 1647 838 957 1646 828 946 1635 829 947 1636 840 959 1648 839 958 1647 829 947 1636 830 948 1637 841 960 1649 840 959 1648 830 948 1637 831 949 1638 842 961 1650 841 960 1649 831 949 1638 832 950 1639 843 962 1651 842 961 1650 832 950 1639 833 951 1640 844 963 1652 843 962 1651 833 951 1640 834 952 1641 845 964 1653 844 963 1652 846 954 1643 835 953 1642 848 965 1654 847 966 1655 835 953 1642 836 955 1644 849 967 1656 848 965 1654 836 955 1644 837 956 1645 850 968 1657 849 967 1656 837 956 1645 838 957 1646 851 969 1658 850 968 1657 838 957 1646 839 958 1647 852 970 1659 851 969 1658 839 958 1647 840 959 1648 853 971 1660 852 970 1659 840 959 1648 841 960 1649 854 972 1661 853 971 1660 841 960 1649 842 961 1650 855 973 1662 854 972 1661 842 961 1650 843 962 1651 856 974 1663 855 973 1662 843 962 1651 844 963 1652 857 975 1664 856 974 1663 844 963 1652 845 964 1653 858 976 1665 857 975 1664 847 966 1655 848 965 1654 860 977 1666 859 978 1667 848 965 1654 849 967 1656 861 979 1668 860 977 1666 849 967 1656 850 968 1657 862 980 1669 861 979 1668 853 971 1660 854 972 1661 863 981 1670 854 972 1661 855 973 1662 864 982 1671 863 981 1670 855 973 1662 856 974 1663 865 983 1672 864 982 1671 856 974 1663 857 975 1664 866 984 1673 865 983 1672 857 975 1664 858 976 1665 867 985 1674 866 984 1673 859 978 1667 860 977 1666 869 986 1675 868 987 1676 860 977 1666 861 979 1668 870 988 1677 869 986 1675 868 987 1676 869 986 1675 872 989 1678 871 990 1679 869 986 1675 870 988 1677 873 991 1680 872 989 1678 875 992 1681 874 993 1682 864 982 1671 865 983 1672 865 983 1672 866 984 1673 876 994 1683 875 992 1681 866 984 1673 867 985 1674 877 995 1684 876 994 1683 871 990 1679 872 989 1678 879 996 1685 878 997 1686 872 989 1678 873 991 1680 880 998 1687 879 996 1685 882 999 1688 881 1000 1689 874 993 1682 875 992 1681 875 992 1681 876 994 1683 883 1001 1690 882 999 1688 876 994 1683 877 995 1684 884 1002 1691 883 1001 1690 878 997 1686 879 996 1685 886 1003 1692 885 1004 1693 879 996 1685 880 998 1687 887 1005 1694 886 1003 1692 889 1006 1695 888 1007 1696 881 1000 1689 882 999 1688 882 999 1688 883 1001 1690 890 1008 1697 889 1006 1695 883 1001 1690 884 1002 1691 891 1009 1698 890 1008 1697 885 1004 1693 886 1003 1692 893 1010 1699 892 1011 1700 886 1003 1692 887 1005 1694 894 1012 1701 893 1010 1699 1313 1013 1702 888 1007 1696 889 1006 1695 895 1014 1703 889 1006 1695 890 1008 1697 896 1015 1704 895 1014 1703 890 1008 1697 891 1009 1698 1314 1016 1705 896 1015 1704 891 1009 1698 1337 1017 1706 897 1018 1707 1314 1016 1705 1985 1019 1708 1337 1017 1706 320 1020 1709 1986 1021 1710 892 1011 1700 893 1010 1699 899 1022 1711 898 1023 1712 893 1010 1699 894 1012 1701 900 1024 1713 899 1022 1711 1312 1025 1714 1311 1026 1715 906 1027 1716 905 1028 1717 697 808 1497 696 807 1496 907 1029 1718 698 811 1500 697 808 1497 907 1029 1718 699 813 1502 698 811 1500 907 1029 1718 700 815 1504 699 813 1502 907 1029 1718 701 817 1506 700 815 1504 907 1029 1718 702 819 1508 701 817 1506 907 1029 1718 703 821 1510 702 819 1508 907 1029 1718 704 823 1512 703 821 1510 907 1029 1718 705 825 1514 704 823 1512 907 1029 1718 706 827 1516 705 825 1514 907 1029 1718 707 829 1518 706 827 1516 907 1029 1718 707 829 1518 907 1029 1718 1331 831 1520 708 833 1522 1980 836 1525 907 1029 1718 941 1030 312 980 1031 313 1044 1032 314 1007 1033 315 1007 1033 315 1028 1034 316 956 1035 317 941 1030 312 942 1036 318 958 1037 319 1028 1034 316 1007 1033 315 1007 1033 315 1044 1032 314 981 1038 320 942 1036 318 943 1039 321 979 1040 322 1043 1041 323 1008 1042 324 1008 1042 324 1029 1043 325 955 1044 326 943 1039 321 941 1030 312 956 1035 317 1029 1043 325 1008 1042 324 1008 1042 324 1043 1041 323 980 1031 313 941 1030 312 944 1045 327 978 1046 328 1042 1047 329 1009 1048 330 1009 1048 330 1027 1049 331 953 1050 332 944 1045 327 943 1039 321 955 1044 326 1027 1049 331 1009 1048 330 1009 1048 330 1042 1047 329 979 1040 322 943 1039 321 945 1051 333 977 1052 334 1041 1053 335 1010 1054 336 1010 1054 336 1030 1055 337 960 1056 338 945 1051 333 944 1045 327 953 1050 332 1030 1055 337 1010 1054 336 1010 1054 336 1041 1053 335 978 1046 328 944 1045 327 1011 1057 339 1032 1058 340 964 1059 341 946 1060 342 945 1051 333 960 1056 338 1032 1058 340 1011 1057 339 1011 1057 339 946 1060 342 1066 1061 343 1067 1062 344 947 1063 345 976 1064 346 1040 1065 347 1012 1066 348 1012 1066 348 1034 1067 349 968 1068 350 947 1063 345 946 1060 342 964 1059 341 1034 1067 349 1012 1066 348 1012 1066 348 1040 1065 347 1066 1061 343 946 1060 342 948 1069 351 975 1070 352 1039 1071 353 1013 1072 354 1013 1072 354 1036 1073 355 971 1074 356 948 1069 351 947 1063 345 968 1068 350 1036 1073 355 1013 1072 354 1013 1072 354 1039 1071 353 976 1064 346 947 1063 345 949 1075 357 973 1076 358 1038 1077 359 1014 1078 360 1014 1078 360 1035 1079 361 967 1080 362 949 1075 357 948 1069 351 971 1074 356 1035 1079 361 1014 1078 360 1014 1078 360 1038 1077 359 975 1070 352 948 1069 351 950 1081 363 974 1082 364 1037 1083 365 1015 1084 366 1015 1084 366 1033 1085 367 963 1086 368 950 1081 363 949 1075 357 967 1080 362 1033 1085 367 1015 1084 366 1015 1084 366 1037 1083 365 973 1076 358 949 1075 357 942 1036 318 981 1038 320 1045 1087 369 1016 1088 370 1016 1088 370 1031 1089 371 958 1037 319 942 1036 318 950 1081 363 963 1086 368 1031 1089 371 1016 1088 370 1016 1088 370 1045 1087 369 974 1082 364 950 1081 363 1044 1032 314 1038 1077 359 973 1076 358 981 1038 320 986 1090 1719 1048 1091 1720 1907 1092 1721 1906 1093 1722 923 1094 1723 1017 1095 1724 1907 1092 1721 1908 1096 1725 990 1097 1726 1050 1098 1727 1911 1099 1728 1913 1100 1729 925 1101 1730 1018 1102 1731 1911 1099 1728 1909 1103 1732 909 1104 1733 1051 1105 1734 1905 1106 1735 1909 1103 1732 951 1107 1736 1019 1108 1737 1905 1106 1735 1906 1093 1722 908 1109 1738 1052 1110 1739 1910 1111 1740 1908 1096 1725 924 1112 1741 1020 1113 1742 1910 1111 1740 1912 1114 1743 910 1115 1744 1053 1116 1745 1914 1117 1746 1912 1114 1743 926 1118 1747 1021 1119 1748 1914 1117 1746 1916 1120 1749 927 1121 1750 1022 1122 1751 1918 1123 1752 1920 1124 1753 982 1125 1754 1046 1126 1755 1918 1123 1752 1916 1120 1749 984 1127 1756 1047 1128 1757 1922 1129 1758 1920 1124 1753 929 1130 1759 1023 1131 1760 1922 1129 1758 1924 1132 1761 911 1133 1762 1054 1134 1763 1923 1135 1764 1924 1132 1761 930 1136 1765 1024 1137 1766 1923 1135 1764 1921 1138 1767 988 1139 1768 1049 1140 1769 1919 1141 1770 1921 1138 1767 928 1142 1771 1025 1143 1772 1919 1141 1770 1917 1144 1773 912 1145 1774 1055 1146 1775 1915 1147 1776 1917 1144 1773 952 1148 1777 1026 1149 1778 1915 1147 1776 1913 1100 1729 953 1050 332 1027 1049 331 954 1150 969 914 1151 963 954 1152 969 1027 1049 331 955 1044 326 913 1153 967 956 1035 317 1028 1034 316 957 1154 968 916 1155 965 957 1156 968 1028 1034 316 958 1037 319 915 1157 962 955 1044 326 1029 1043 325 959 1158 966 913 1159 967 959 1160 966 1029 1043 325 956 1035 317 916 1161 965 960 1056 338 1030 1055 337 961 1162 964 917 1163 959 961 1164 964 1030 1055 337 953 1050 332 914 1165 963 958 1037 319 1031 1089 371 962 1166 961 915 1167 962 962 1168 961 1031 1089 371 963 1086 368 918 1169 958 964 1059 341 1032 1058 340 965 1170 960 919 1171 955 965 1172 960 1032 1058 340 960 1056 338 917 1173 959 963 1086 368 1033 1085 367 966 1174 957 918 1175 958 966 1176 957 1033 1085 367 967 1080 362 920 1177 954 968 1068 350 1034 1067 349 969 1178 956 921 1179 950 969 1180 956 1034 1067 349 964 1059 341 919 1181 955 967 1080 362 1035 1079 361 970 1182 953 920 1183 954 970 1184 953 1035 1079 361 971 1074 356 922 1185 952 971 1074 356 1036 1073 355 972 1186 951 922 1187 952 972 1188 951 1036 1073 355 968 1068 350 921 1189 950 914 1190 1779 954 1191 1780 1020 1113 1742 924 1112 1741 923 1094 1723 1020 1113 1742 954 1192 1780 913 1193 1781 916 1194 1782 957 1195 1783 1019 1108 1737 951 1107 1736 925 1101 1730 1019 1108 1737 957 1196 1783 915 1197 1784 923 1094 1723 913 1198 1781 959 1199 1785 1017 1095 1724 916 1200 1782 951 1107 1736 1017 1095 1724 959 1201 1785 917 1202 1786 961 1203 1787 1021 1119 1748 926 1118 1747 914 1204 1779 924 1112 1741 1021 1119 1748 961 1205 1787 925 1101 1730 915 1206 1784 962 1207 1788 1018 1102 1731 952 1148 1777 1018 1102 1731 962 1208 1788 918 1209 1789 919 1210 1790 965 1211 1791 1022 1122 1751 927 1121 1750 917 1212 1786 926 1118 1747 1022 1122 1751 965 1213 1791 952 1148 1777 918 1214 1789 966 1215 1792 1026 1149 1778 928 1142 1771 1026 1149 1778 966 1216 1792 920 1217 1793 921 1218 1794 969 1219 1795 1023 1131 1760 929 1130 1759 919 1220 1790 927 1121 1750 1023 1131 1760 969 1221 1795 928 1142 1771 920 1222 1793 970 1223 1796 1025 1143 1772 930 1136 1765 1025 1143 1772 970 1224 1796 922 1225 1797 930 1136 1765 922 1226 1797 972 1227 1798 1024 1137 1766 921 1228 1794 929 1130 1759 1024 1137 1766 972 1229 1798 984 1127 1756 1046 1126 1755 996 1230 1799 932 1231 1800 996 1230 1799 1046 1126 1755 982 1125 1754 931 1232 1801 911 1133 1762 1047 1128 1757 983 1233 1802 933 1234 1803 983 1233 1802 1047 1128 1757 984 1127 1756 932 1231 1800 908 1109 1738 1048 1091 1720 985 1235 1804 935 1236 1805 985 1235 1804 1048 1091 1720 986 1090 1719 934 1237 1806 912 1145 1774 1049 1140 1769 987 1238 1807 937 1239 1808 987 1238 1807 1049 1140 1769 988 1139 1768 936 1240 1809 909 1104 1733 1050 1098 1727 989 1241 1810 939 1242 1811 989 1241 1810 1050 1098 1727 990 1097 1726 938 1243 1812 986 1090 1719 1051 1105 1734 991 1244 1813 934 1237 1806 991 1244 1813 1051 1105 1734 909 1104 1733 939 1242 1811 910 1115 1744 1052 1110 1739 992 1245 1814 940 1246 1815 992 1245 1814 1052 1110 1739 908 1109 1738 935 1236 1805 982 1125 1754 1053 1116 1745 993 1247 1816 931 1232 1801 993 1247 1816 1053 1116 1745 910 1115 1744 940 1246 1815 988 1139 1768 1054 1134 1763 994 1248 1817 936 1240 1809 994 1248 1817 1054 1134 1763 911 1133 1762 933 1234 1803 990 1097 1726 1055 1146 1775 995 1249 1818 938 1243 1812 995 1249 1818 1055 1146 1775 912 1145 1774 937 1239 1808 996 1230 1799 1056 1250 1819 997 1251 1820 932 1231 1800 998 1252 1821 1056 1250 1819 996 1230 1799 931 1232 1801 983 1233 1802 1057 1253 1822 999 1254 1823 933 1234 1803 997 1251 1820 1057 1253 1822 983 1233 1802 932 1231 1800 985 1235 1804 1058 1255 1824 1000 1256 1825 935 1236 1805 1001 1257 1826 1058 1255 1824 985 1235 1804 934 1237 1806 987 1238 1807 1059 1258 1827 1002 1259 1828 937 1239 1808 1003 1260 1829 1059 1258 1827 987 1238 1807 936 1240 1809 989 1241 1810 1060 1261 1830 1004 1262 1831 939 1242 1811 1005 1263 1832 1060 1261 1830 989 1241 1810 938 1243 1812 991 1244 1813 1061 1264 1833 1001 1257 1826 934 1237 1806 1004 1262 1831 1061 1264 1833 991 1244 1813 939 1242 1811 992 1245 1814 1062 1265 1834 1006 1266 1835 940 1246 1815 1000 1256 1825 1062 1265 1834 992 1245 1814 935 1236 1805 993 1247 1816 1063 1267 1836 998 1252 1821 931 1232 1801 1006 1266 1835 1063 1267 1836 993 1247 1816 940 1246 1815 994 1248 1817 1064 1268 1837 1003 1260 1829 936 1240 1809 999 1254 1823 1064 1268 1837 994 1248 1817 933 1234 1803 995 1249 1818 1065 1269 1838 1005 1263 1832 938 1243 1812 1002 1259 1828 1065 1269 1838 995 1249 1818 937 1239 1808 973 1076 358 1037 1083 365 974 1082 364 1045 1087 369 981 1038 320 980 1031 313 1043 1041 323 1039 1071 353 975 1070 352 1044 1032 314 980 1031 313 975 1070 352 1038 1077 359 1043 1041 323 979 1040 322 976 1064 346 1039 1071 353 978 1046 328 1041 1053 335 977 1052 334 1067 1062 344 1066 1061 343 979 1040 322 1042 1047 329 1040 1065 347 976 1064 346 1011 1057 339 1067 1062 344 977 1052 334 945 1051 333 978 1046 328 1066 1061 343 1040 1065 347 1042 1047 329 997 1251 1820 1056 1250 1819 904 1270 1839 903 1271 1840 1056 1250 1819 998 1252 1821 1313 1013 1702 904 1270 1839 999 1254 1823 1057 1253 1822 902 1272 1841 901 1273 1842 1000 1256 1825 1058 1255 1824 863 981 1670 864 982 1671 1058 1255 1824 1001 1257 1826 853 971 1660 863 981 1670 1002 1259 1828 1059 1258 1827 887 1005 1694 880 998 1687 1059 1258 1827 1003 1260 1829 894 1012 1701 887 1005 1694 1004 1262 1831 1060 1261 1830 862 980 1669 851 969 1658 1060 1261 1830 1005 1263 1832 870 988 1677 862 980 1669 1001 1257 1826 1061 1264 1833 852 970 1659 853 971 1660 1061 1264 1833 1004 1262 1831 851 969 1658 852 970 1659 1006 1266 1835 1062 1265 1834 874 993 1682 881 1000 1689 1062 1265 1834 1000 1256 1825 864 982 1671 874 993 1682 1063 1267 1836 1006 1266 1835 881 1000 1689 888 1007 1696 1003 1260 1829 1064 1268 1837 900 1024 1713 894 1012 1701 1064 1268 1837 999 1254 1823 901 1273 1842 900 1024 1713 1005 1263 1832 1065 1269 1838 873 991 1680 870 988 1677 1065 1269 1838 1002 1259 1828 880 998 1687 873 991 1680 1057 1253 1822 997 1251 1820 903 1271 1840 902 1272 1841 870 988 1677 861 979 1668 862 980 1669 862 980 1669 850 968 1657 851 969 1658 1063 1267 1836 888 1007 1696 1313 1013 1702 998 1252 1821 1116 1274 372 1237 1275 373 1117 1276 374 1151 1277 375 1237 1275 373 1152 1278 376 1117 1276 374 1153 1279 377 1238 1280 378 1092 1281 379 1070 1282 380 1308 1283 381 1238 1280 378 1153 1279 377 1309 1284 382 1153 1279 377 1239 1285 383 1310 1286 384 1309 1284 382 1110 1287 385 1287 1288 386 1239 1285 383 1093 1289 387 1093 1289 387 1239 1285 383 1153 1279 377 1070 1282 380 1219 1290 388 1118 1291 389 1154 1292 390 1297 1293 391 1113 1294 392 1115 1295 393 1297 1293 391 1154 1292 390 1120 1296 394 1112 1297 395 1150 1298 396 1155 1299 397 1071 1300 398 1155 1299 397 1150 1301 396 1069 1302 399 1154 1292 390 1240 1303 400 1156 1304 401 1113 1305 392 1156 1306 401 1240 1303 400 1277 1307 402 1114 1308 403 1277 1307 402 1240 1303 400 1157 1309 404 1222 1310 405 1157 1309 404 1240 1303 400 1154 1292 390 1118 1291 389 1218 1311 406 1121 1312 407 1158 1313 408 1274 1314 409 1219 1290 388 1274 1314 409 1158 1313 408 1118 1291 389 1159 1315 410 1241 1316 411 1160 1317 412 1123 1318 413 1160 1317 412 1241 1316 411 1245 1319 414 1124 1320 415 1245 1319 414 1241 1316 411 1161 1321 416 1161 1321 416 1241 1316 411 1159 1315 410 1122 1322 417 1162 1323 418 1242 1324 419 1119 1325 420 1120 1296 394 1220 1326 421 1242 1324 419 1162 1323 418 1125 1327 422 1162 1323 418 1243 1328 423 1163 1329 424 1125 1327 422 1163 1329 424 1243 1328 423 1094 1330 425 1072 1331 426 1094 1330 425 1243 1328 423 1155 1299 397 1071 1300 398 1155 1299 397 1243 1328 423 1162 1323 418 1120 1296 394 1278 1332 427 1244 1333 428 1164 1334 429 1223 1335 430 1164 1334 429 1244 1333 428 1158 1313 408 1121 1312 407 1158 1313 408 1244 1333 428 1157 1309 404 1118 1291 389 1157 1309 404 1244 1333 428 1278 1332 427 1222 1310 405 1124 1320 415 1245 1319 414 1165 1336 431 1126 1337 432 1165 1336 431 1245 1319 414 1166 1338 433 1208 1339 434 1129 1340 435 1167 1341 436 1128 1342 437 1167 1341 436 1129 1340 435 1296 1343 438 1209 1344 439 1168 1345 440 1246 1346 441 1095 1347 442 1073 1348 443 1095 1347 442 1246 1346 441 1266 1349 444 1074 1350 445 1266 1349 444 1246 1346 441 1167 1341 436 1209 1344 439 1167 1341 436 1246 1346 441 1168 1345 440 1128 1342 437 1228 1351 446 1247 1352 447 1170 1353 448 1131 1354 449 1170 1353 448 1247 1352 447 1169 1355 450 1130 1356 451 1171 1357 452 1248 1358 453 1172 1359 454 1132 1360 455 1172 1359 454 1248 1358 453 1237 1275 373 1116 1274 372 1171 1357 452 1301 1361 456 1174 1362 457 1248 1358 453 1237 1275 373 1248 1358 453 1173 1363 458 1152 1278 376 1173 1363 458 1248 1358 453 1174 1362 457 1133 1364 459 1175 1365 460 1249 1366 461 1307 1367 462 1306 1368 463 1307 1367 462 1249 1366 461 1238 1280 378 1308 1283 381 1238 1280 378 1249 1366 461 1096 1369 464 1092 1281 379 1096 1369 464 1249 1366 461 1175 1365 460 1075 1370 465 1218 1311 406 1273 1371 466 1176 1372 467 1121 1312 407 1134 1373 468 1135 1374 469 1176 1372 467 1273 1371 466 1177 1375 470 1250 1376 471 1178 1377 472 1136 1378 473 1178 1377 472 1250 1376 471 1179 1379 474 1137 1380 475 1179 1379 474 1250 1376 471 1171 1357 452 1132 1360 455 1180 1381 476 1251 1382 477 1177 1375 470 1136 1378 473 1181 1383 478 1235 1384 479 1174 1362 457 1301 1361 456 1181 1383 478 1251 1382 477 1182 1385 480 1126 1337 432 1182 1385 480 1251 1382 477 1180 1381 476 1138 1386 481 1183 1387 482 1252 1388 483 1179 1379 474 1132 1360 455 1179 1379 474 1252 1388 483 1184 1389 484 1137 1380 475 1184 1389 484 1252 1388 483 1286 1390 485 1232 1391 486 1286 1390 485 1252 1388 483 1183 1387 482 1233 1392 487 1139 1393 488 1217 1394 489 1272 1395 490 1185 1396 491 1216 1397 492 1140 1398 493 1185 1396 491 1272 1395 490 1186 1399 494 1253 1400 495 1187 1401 496 1142 1402 497 1187 1401 496 1253 1400 495 1188 1403 498 1144 1404 499 1188 1403 498 1253 1400 495 1189 1405 500 1143 1406 501 1189 1405 500 1253 1400 495 1186 1399 494 1141 1407 502 1190 1408 503 1254 1409 504 1191 1410 505 1145 1411 506 1191 1410 505 1254 1409 504 1192 1412 507 1130 1356 451 1192 1412 507 1254 1409 504 1186 1399 494 1142 1402 497 1186 1399 494 1254 1409 504 1190 1408 503 1141 1407 502 1193 1413 508 1255 1414 509 1281 1415 510 1225 1416 511 1281 1415 510 1255 1414 509 1194 1417 512 1226 1418 513 1194 1417 512 1255 1414 509 1185 1396 491 1140 1398 493 1185 1396 491 1255 1414 509 1193 1413 508 1139 1393 488 1195 1419 514 1256 1420 515 1188 1403 498 1143 1406 501 1188 1403 498 1256 1420 515 1196 1421 516 1144 1404 499 1196 1421 516 1256 1420 515 1284 1422 517 1230 1423 518 1284 1422 517 1256 1420 515 1195 1419 514 1231 1424 519 1216 1397 492 1271 1425 520 1194 1417 512 1140 1398 493 1227 1426 521 1226 1418 513 1194 1417 512 1271 1425 520 1197 1427 522 1257 1428 523 1283 1429 524 1229 1430 525 1283 1429 524 1257 1428 523 1196 1421 516 1230 1423 518 1196 1421 516 1257 1428 523 1187 1401 496 1144 1404 499 1187 1401 496 1257 1428 523 1197 1427 522 1142 1402 497 1198 1431 526 1258 1432 527 1220 1326 421 1125 1327 422 1221 1433 528 1258 1432 527 1198 1431 526 1146 1434 529 1200 1435 530 1259 1436 531 1199 1437 532 1147 1438 533 1174 1362 457 1260 1439 534 1201 1440 535 1133 1364 459 1302 1441 536 1304 1442 537 1305 1443 538 1201 1440 535 1198 1431 526 1261 1444 539 1203 1445 540 1146 1434 529 1203 1445 540 1261 1444 539 1097 1446 541 1076 1447 542 1097 1446 541 1261 1444 539 1163 1329 424 1072 1331 426 1163 1329 424 1261 1444 539 1198 1431 526 1125 1327 422 1305 1443 538 1262 1448 543 1175 1365 460 1306 1368 463 1175 1365 460 1262 1448 543 1098 1449 544 1075 1370 465 1098 1449 544 1262 1448 543 1204 1450 545 1077 1451 546 1204 1450 545 1262 1448 543 1305 1443 538 1304 1442 537 1148 1452 547 1276 1453 548 1221 1433 528 1146 1434 529 1199 1437 532 1206 1454 549 1205 1455 550 1147 1438 533 1265 1456 551 1303 1457 552 1304 1442 537 1302 1441 536 1078 1458 553 1263 1459 554 1203 1445 540 1076 1447 542 1203 1445 540 1263 1459 554 1148 1452 547 1146 1434 529 1204 1450 545 1264 1460 555 1099 1461 556 1077 1451 546 1303 1457 552 1264 1460 555 1204 1450 545 1304 1442 537 1206 1454 549 1129 1340 435 1208 1339 434 1205 1455 550 1074 1350 445 1266 1349 444 1263 1459 554 1078 1458 553 1263 1459 554 1266 1349 444 1209 1344 439 1148 1452 547 1279 1462 557 1267 1463 558 1210 1464 559 1224 1465 560 1210 1464 559 1267 1463 558 1176 1372 467 1135 1374 469 1176 1372 467 1267 1463 558 1164 1334 429 1121 1312 407 1164 1334 429 1267 1463 558 1279 1462 557 1223 1335 430 1285 1466 561 1268 1467 562 1184 1389 484 1232 1391 486 1184 1389 484 1268 1467 562 1211 1468 563 1137 1380 475 1211 1468 563 1268 1467 562 1195 1419 514 1143 1406 501 1195 1419 514 1268 1467 562 1285 1466 561 1231 1424 519 1149 1469 564 1269 1470 565 1212 1471 566 1145 1411 506 1212 1471 566 1269 1470 565 1213 1472 567 1138 1386 481 1134 1373 468 1300 1473 568 1214 1474 569 1135 1374 469 1139 1393 488 1214 1474 569 1300 1473 568 1217 1394 489 1215 1475 570 1270 1476 571 1189 1405 500 1141 1407 502 1189 1405 500 1270 1476 571 1211 1468 563 1143 1406 501 1211 1468 563 1270 1476 571 1178 1377 472 1137 1380 475 1178 1377 472 1270 1476 571 1215 1475 570 1136 1378 473 1227 1426 521 1271 1425 520 1247 1352 447 1228 1351 446 1247 1352 447 1271 1425 520 1216 1397 492 1169 1355 450 1216 1397 492 1272 1395 490 1293 1477 572 1169 1355 450 1293 1477 572 1272 1395 490 1217 1394 489 1149 1469 564 1134 1373 468 1273 1371 466 1290 1478 573 1213 1472 567 1290 1478 573 1273 1371 466 1218 1311 406 1124 1320 415 1218 1311 406 1274 1314 409 1160 1317 412 1124 1320 415 1160 1317 412 1274 1314 409 1219 1290 388 1123 1318 413 1115 1479 393 1275 1480 574 1159 1315 410 1123 1318 413 1330 1481 575 1161 1321 416 1122 1322 417 1259 1436 531 1258 1432 527 1221 1433 528 1199 1437 532 1221 1433 528 1276 1453 548 1206 1454 549 1199 1437 532 1276 1453 548 1296 1343 438 1129 1340 435 1206 1454 549 1114 1482 403 1277 1307 402 1100 1483 576 1068 1484 577 1100 1483 576 1277 1307 402 1222 1310 405 1079 1485 578 1222 1310 405 1278 1332 427 1101 1486 579 1079 1485 578 1101 1486 579 1278 1332 427 1223 1335 430 1080 1487 580 1223 1335 430 1279 1462 557 1102 1488 581 1080 1487 580 1102 1488 581 1279 1462 557 1224 1465 560 1081 1489 582 1224 1465 560 1280 1490 583 1103 1491 584 1081 1489 582 1103 1491 584 1280 1490 583 1225 1416 511 1082 1492 585 1225 1416 511 1281 1415 510 1104 1493 586 1082 1492 585 1104 1493 586 1281 1415 510 1226 1418 513 1083 1494 587 1083 1494 587 1226 1418 513 1227 1426 521 1084 1495 588 1084 1495 588 1227 1426 521 1228 1351 446 1085 1496 589 1131 1354 449 1282 1497 590 1105 1498 591 1087 1499 592 1105 1498 591 1282 1497 590 1229 1430 525 1086 1500 593 1106 1501 594 1283 1429 524 1230 1423 518 1088 1502 595 1229 1430 525 1283 1429 524 1106 1501 594 1086 1500 593 1230 1423 518 1284 1422 517 1107 1503 596 1088 1502 595 1107 1503 596 1284 1422 517 1231 1424 519 1089 1504 597 1108 1505 598 1285 1466 561 1232 1391 486 1090 1506 599 1231 1424 519 1285 1466 561 1108 1505 598 1089 1504 597 1232 1391 486 1286 1390 485 1109 1507 600 1090 1506 599 1109 1507 600 1286 1390 485 1233 1392 487 1091 1508 601 1233 1392 487 1287 1288 386 1110 1287 385 1091 1508 601 1168 1345 440 1288 1509 602 1234 1510 603 1128 1342 437 1234 1510 603 1288 1509 602 1264 1460 555 1303 1457 552 1264 1460 555 1288 1509 602 1111 1511 604 1099 1461 556 1111 1511 604 1288 1509 602 1168 1345 440 1073 1348 443 1085 1496 589 1228 1351 446 1131 1354 449 1087 1499 592 1200 1435 530 1289 1512 605 1235 1384 479 1127 1513 606 1235 1384 479 1289 1512 605 1260 1439 534 1174 1362 457 1260 1439 534 1289 1512 605 1236 1514 607 1202 1515 608 1236 1514 607 1289 1512 605 1200 1435 530 1147 1438 533 1213 1472 567 1290 1478 573 1182 1385 480 1138 1386 481 1126 1337 432 1182 1385 480 1290 1478 573 1124 1320 415 1205 1455 550 1291 1516 609 1236 1514 607 1147 1438 533 1236 1514 607 1291 1516 609 1207 1517 610 1202 1515 608 1215 1475 570 1292 1518 611 1180 1381 476 1136 1378 473 1180 1381 476 1292 1518 611 1212 1471 566 1138 1386 481 1212 1471 566 1292 1518 611 1190 1408 503 1145 1411 506 1190 1408 503 1292 1518 611 1215 1475 570 1141 1407 502 1208 1339 434 1294 1519 612 1291 1516 609 1205 1455 550 1291 1516 609 1294 1519 612 1265 1456 551 1207 1517 610 1169 1355 450 1293 1477 572 1191 1410 505 1130 1356 451 1191 1410 505 1293 1477 572 1149 1469 564 1145 1411 506 1234 1510 603 1294 1519 612 1208 1339 434 1128 1342 437 1282 1497 590 1295 1520 613 1197 1427 522 1229 1430 525 1197 1427 522 1295 1520 613 1192 1412 507 1142 1402 497 1192 1412 507 1295 1520 613 1170 1353 448 1130 1356 451 1170 1353 448 1295 1520 613 1282 1497 590 1131 1354 449 1209 1344 439 1296 1343 438 1276 1453 548 1148 1452 547 1219 1290 388 1297 1293 391 1115 1521 393 1123 1318 413 1235 1384 479 1181 1383 478 1126 1337 432 1165 1336 431 1127 1513 606 1183 1387 482 1298 1522 614 1287 1288 386 1233 1392 487 1287 1288 386 1298 1522 614 1239 1285 383 1239 1285 383 1298 1522 614 1310 1286 384 1172 1359 454 1298 1522 614 1183 1387 482 1132 1360 455 1210 1464 559 1299 1523 615 1280 1490 583 1224 1465 560 1280 1490 583 1299 1523 615 1193 1413 508 1225 1416 511 1193 1413 508 1299 1523 615 1214 1474 569 1139 1393 488 1214 1474 569 1299 1523 615 1210 1464 559 1135 1374 469 1217 1394 489 1300 1473 568 1269 1470 565 1149 1469 564 1269 1470 565 1300 1473 568 1134 1373 468 1213 1472 567 1301 1361 456 1177 1375 470 1251 1382 477 1181 1383 478 1171 1357 452 1250 1376 471 1177 1375 470 1301 1361 456 1202 1515 608 1207 1517 610 1265 1456 551 1302 1441 536 1201 1440 535 1260 1439 534 1202 1515 608 1302 1441 536 1265 1456 551 1294 1519 612 1234 1510 603 1303 1457 552 1201 1440 535 1305 1443 538 1306 1368 463 1133 1364 459 1307 1367 462 1173 1363 458 1133 1364 459 1306 1368 463 1173 1363 458 1307 1367 462 1308 1283 381 1152 1278 376 1152 1278 376 1308 1283 381 1309 1284 382 1117 1276 374 1310 1286 384 1116 1274 372 1117 1276 374 1309 1284 382 1298 1522 614 1172 1359 454 1116 1274 372 1310 1286 384 1068 1524 1843 1319 1525 1844 1318 1526 1845 1114 1527 1846 902 1272 1841 1321 1528 1847 1318 1526 1845 906 1027 1716 902 1272 1841 906 1027 1716 1311 1026 1715 901 1273 1842 1311 1026 1715 899 1022 1711 900 1024 1713 901 1273 1842 898 1023 1712 899 1022 1711 1311 1026 1715 1312 1025 1714 1113 1529 1848 1322 1530 1849 1323 1531 1850 1115 1532 1851 1313 1013 1702 1324 1533 1852 1323 1531 1850 904 1270 1839 1316 1534 1853 1325 1535 1854 1326 1536 1855 1317 1537 1856 1315 1538 1857 1320 1539 1858 1332 1540 1859 897 1018 1707 903 1271 1840 1322 1530 1849 1321 1528 1847 902 1272 1841 895 1014 1703 1325 1535 1854 1324 1533 1852 1313 1013 1702 1159 1315 410 1275 1541 574 1316 1542 616 1122 1322 417 1120 1296 394 1119 1325 420 1317 1543 617 1112 1544 395 1314 1016 1705 1327 1545 1860 1326 1536 1855 896 1015 1704 1317 1546 617 1119 1325 420 1122 1322 417 1316 1547 616 906 1027 1716 1318 1526 1845 1319 1525 1844 905 1028 1717 1150 1548 1861 1332 1540 1859 1320 1539 1858 1069 1549 1862 1114 1550 1846 1318 1526 1845 1321 1528 1847 1156 1551 1863 1156 1552 1863 1321 1528 1847 1322 1530 1849 1113 1553 1848 904 1270 1839 1323 1531 1850 1322 1530 1849 903 1271 1840 1115 1554 1851 1323 1531 1850 1324 1533 1852 1275 1555 1864 1275 1556 1864 1324 1533 1852 1325 1535 1854 1316 1557 1853 896 1015 1704 1326 1536 1855 1325 1535 1854 895 1014 1703 1317 1558 1856 1326 1536 1855 1327 1545 1860 1112 1559 1865 1112 1560 1865 1327 1545 1860 1332 1540 1859 1150 1561 1861 1328 1562 618 1259 1436 531 1200 1435 530 1127 1513 606 1220 1326 421 1258 1432 527 1259 1436 531 1328 1562 618 1329 1563 619 1242 1324 419 1220 1326 421 1328 1562 618 1166 1338 433 1328 1562 618 1127 1513 606 1165 1336 431 1330 1481 575 1329 1563 619 1328 1562 618 1166 1338 433 1119 1325 420 1329 1563 619 1330 1481 575 1122 1322 417 1119 1325 420 1242 1324 419 1329 1563 619 1161 1321 416 1330 1481 575 1166 1338 433 1245 1319 414 1314 1016 1705 897 1018 1707 1332 1540 1859 1327 1545 1860 720 830 1519 721 832 1521 1333 849 1538 734 848 1537 734 848 1537 1333 849 1538 1334 863 1552 747 862 1551 747 862 1551 1334 863 1552 1335 877 1566 760 876 1565 760 876 1565 1335 877 1566 1336 891 1580 773 890 1579 773 890 1579 1336 891 1580 2 361 1172 786 904 1593 786 904 1593 2 361 1172 86 364 1175 798 916 1605 884 1002 1691 320 1020 1709 1337 1017 1706 891 1009 1698 696 807 1496 709 810 1499 1349 1564 1866 1338 1565 1867 1338 1565 1867 1349 1564 1866 1350 1566 1868 1339 1567 1869 1339 1567 1869 1350 1566 1868 1351 1568 1870 1340 1569 1871 1340 1569 1871 1351 1568 1870 1352 1570 1872 1341 1571 1873 1341 1571 1873 1352 1570 1872 1353 1572 1874 1342 1573 1875 1342 1573 1875 1353 1572 1874 1354 1574 1876 1343 1575 1877 1343 1575 1877 1354 1574 1876 1355 1576 1878 1344 1577 1879 1344 1577 1879 1355 1576 1878 1356 1578 1880 1345 1579 1881 1345 1579 1881 1356 1578 1880 1357 1580 1882 1346 1581 1883 1346 1581 1883 1357 1580 1882 1358 1582 1884 1347 1583 1885 1347 1583 1885 1358 1582 1884 1359 1584 1886 1348 1585 1887 1348 1585 1887 1359 1584 1886 1360 1586 1888 1897 1587 1889 1897 1587 1889 1360 1586 1888 1972 1588 1890 1973 1589 1891 709 810 1499 723 838 1527 1361 1590 1892 1349 1564 1866 1349 1564 1866 1361 1590 1892 1362 1591 1893 1350 1566 1868 1350 1566 1868 1362 1591 1893 1363 1592 1894 1351 1568 1870 1351 1568 1870 1363 1592 1894 1364 1593 1895 1352 1570 1872 1352 1570 1872 1364 1593 1895 1365 1594 1896 1353 1572 1874 1353 1572 1874 1365 1594 1896 1366 1595 1897 1354 1574 1876 1354 1574 1876 1366 1595 1897 1367 1596 1898 1355 1576 1878 1355 1576 1878 1367 1596 1898 1368 1597 1899 1356 1578 1880 1356 1578 1880 1368 1597 1899 1369 1598 1900 1357 1580 1882 1357 1580 1882 1369 1598 1900 1370 1599 1901 1358 1582 1884 1358 1582 1884 1370 1599 1901 1371 1600 1902 1359 1584 1886 1360 1586 1888 1899 1601 1903 1975 1602 1904 1972 1588 1890 723 838 1527 736 852 1541 1372 1603 1905 1361 1590 1892 1361 1590 1892 1372 1603 1905 1373 1604 1906 1362 1591 1893 1362 1591 1893 1373 1604 1906 1374 1605 1907 1363 1592 1894 1363 1592 1894 1374 1605 1907 1375 1606 1908 1364 1593 1895 1364 1593 1895 1375 1606 1908 1376 1607 1909 1365 1594 1896 1365 1594 1896 1376 1607 1909 1377 1608 1910 1366 1595 1897 1366 1595 1897 1377 1608 1910 1378 1609 1911 1367 1596 1898 1367 1596 1898 1378 1609 1911 1379 1610 1912 1368 1597 1899 1368 1597 1899 1379 1610 1912 1380 1611 1913 1369 1598 1900 1369 1598 1900 1380 1611 1913 1381 1612 1914 1370 1599 1901 1370 1599 1901 1381 1612 1914 1382 1613 1915 1371 1600 1902 1899 1601 1903 1900 1614 1916 1976 1615 1917 1975 1602 1904 736 852 1541 749 866 1555 1383 1616 1918 1372 1603 1905 1372 1603 1905 1383 1616 1918 1384 1617 1919 1373 1604 1906 1373 1604 1906 1384 1617 1919 1385 1618 1920 1374 1605 1907 1374 1605 1907 1385 1618 1920 1386 1619 1921 1375 1606 1908 1375 1606 1908 1386 1619 1921 1387 1620 1922 1376 1607 1909 1376 1607 1909 1387 1620 1922 1388 1621 1923 1377 1608 1910 1377 1608 1910 1388 1621 1923 1389 1622 1924 1378 1609 1911 1378 1609 1911 1389 1622 1924 1390 1623 1925 1379 1610 1912 1379 1610 1912 1390 1623 1925 1391 1624 1926 1380 1611 1913 1380 1611 1913 1391 1624 1926 1392 1625 1927 1381 1612 1914 1381 1612 1914 1392 1625 1927 1393 1626 1928 1382 1613 1915 1900 1614 1916 1901 1627 1929 1977 1628 1930 1976 1615 1917 749 866 1555 762 880 1569 1394 1629 1931 1383 1616 1918 1383 1616 1918 1394 1629 1931 1395 1630 1932 1384 1617 1919 1384 1617 1919 1395 1630 1932 1396 1631 1933 1385 1618 1920 1385 1618 1920 1396 1631 1933 1397 1632 1934 1386 1619 1921 1386 1619 1921 1397 1632 1934 1398 1633 1935 1387 1620 1922 1387 1620 1922 1398 1633 1935 1399 1634 1936 1388 1621 1923 1388 1621 1923 1399 1634 1936 1400 1635 1937 1389 1622 1924 1389 1622 1924 1400 1635 1937 1401 1636 1938 1390 1623 1925 1390 1623 1925 1401 1636 1938 1402 1637 1939 1391 1624 1926 1391 1624 1926 1402 1637 1939 1403 1638 1940 1392 1625 1927 1392 1625 1927 1403 1638 1940 1404 1639 1941 1393 1626 1928 1901 1627 1929 1902 1640 1942 1974 1641 1943 1977 1628 1930 762 880 1569 775 894 1583 1405 1642 1944 1394 1629 1931 1394 1629 1931 1405 1642 1944 1406 1643 1945 1395 1630 1932 1395 1630 1932 1406 1643 1945 1407 1644 1946 1396 1631 1933 1396 1631 1933 1407 1644 1946 1408 1645 1947 1397 1632 1934 1397 1632 1934 1408 1645 1947 1409 1646 1948 1398 1633 1935 1398 1633 1935 1409 1646 1948 1410 1647 1949 1399 1634 1936 1399 1634 1936 1410 1647 1949 1411 1648 1950 1400 1635 1937 1400 1635 1937 1411 1648 1950 1412 1649 1951 1401 1636 1938 1401 1636 1938 1412 1649 1951 1413 1650 1952 1402 1637 1939 1402 1637 1939 1413 1650 1952 1414 1651 1953 1403 1638 1940 1403 1638 1940 1414 1651 1953 1415 1652 1954 1404 1639 1941 2043 435 1231 2044 1653 1955 1974 1641 1943 434 436 1232 775 894 1583 787 906 1595 1416 1654 1956 1405 1642 1944 1405 1642 1944 1416 1654 1956 1417 1655 1957 1406 1643 1945 1406 1643 1945 1417 1655 1957 1418 1656 1958 1407 1644 1946 1407 1644 1946 1418 1656 1958 1419 1657 1959 1408 1645 1947 1408 1645 1947 1419 1657 1959 1420 1658 1960 1409 1646 1948 1409 1646 1948 1420 1658 1960 1421 1659 1961 1410 1647 1949 1410 1647 1949 1421 1659 1961 1422 1660 1962 1411 1648 1950 1411 1648 1950 1422 1660 1962 1423 1661 1963 1412 1649 1951 1412 1649 1951 1423 1661 1963 1424 1662 1964 1413 1650 1952 1413 1650 1952 1424 1662 1964 1425 1663 1965 1414 1651 1953 1414 1651 1953 1425 1663 1965 1426 1664 1966 1415 1652 1954 787 906 1595 799 918 1607 1427 1665 1967 1416 1654 1956 1416 1654 1956 1427 1665 1967 1428 1666 1968 1417 1655 1957 1417 1655 1957 1428 1666 1968 1429 1667 1969 1418 1656 1958 1418 1656 1958 1429 1667 1969 1430 1668 1970 1419 1657 1959 1419 1657 1959 1430 1668 1970 1431 1669 1971 1420 1658 1960 1420 1658 1960 1431 1669 1971 1432 1670 1972 1421 1659 1961 1421 1659 1961 1432 1670 1972 1433 1671 1973 1422 1660 1962 1422 1660 1962 1433 1671 1973 1434 1672 1974 1423 1661 1963 1423 1661 1963 1434 1672 1974 1435 1673 1975 1424 1662 1964 1424 1662 1964 1435 1673 1975 1436 1674 1976 1425 1663 1965 1425 1663 1965 1436 1674 1976 1437 1675 1977 1426 1664 1966 799 918 1607 811 930 1619 1438 1676 1978 1427 1665 1967 1427 1665 1967 1438 1676 1978 1439 1677 1979 1428 1666 1968 1428 1666 1968 1439 1677 1979 1440 1678 1980 1429 1667 1969 1429 1667 1969 1440 1678 1980 1441 1679 1981 1430 1668 1970 1430 1668 1970 1441 1679 1981 1442 1680 1982 1431 1669 1971 1431 1669 1971 1442 1680 1982 1443 1681 1983 1432 1670 1972 1432 1670 1972 1443 1681 1983 1444 1682 1984 1433 1671 1973 1433 1671 1973 1444 1682 1984 1445 1683 1985 1434 1672 1974 1434 1672 1974 1445 1683 1985 1446 1684 1986 1435 1673 1975 1435 1673 1975 1446 1684 1986 1447 1685 1987 1436 1674 1976 1436 1674 1976 1447 1685 1987 1448 1686 1988 1437 1675 1977 811 930 1619 823 942 1631 1449 1687 1989 1438 1676 1978 1438 1676 1978 1449 1687 1989 1450 1688 1990 1439 1677 1979 1439 1677 1979 1450 1688 1990 1451 1689 1991 1440 1678 1980 1440 1678 1980 1451 1689 1991 1452 1690 1992 1441 1679 1981 1441 1679 1981 1452 1690 1992 1453 1691 1993 1442 1680 1982 1442 1680 1982 1453 1691 1993 1454 1692 1994 1443 1681 1983 1443 1681 1983 1454 1692 1994 1455 1693 1995 1444 1682 1984 1444 1682 1984 1455 1693 1995 1456 1694 1996 1445 1683 1985 1445 1683 1985 1456 1694 1996 1457 1695 1997 1446 1684 1986 1446 1684 1986 1457 1695 1997 1458 1696 1998 1447 1685 1987 1447 1685 1987 1458 1696 1998 1459 1697 1999 1448 1686 1988 823 942 1631 846 954 1643 1460 1698 2000 1449 1687 1989 1449 1687 1989 1460 1698 2000 1461 1699 2001 1450 1688 1990 1450 1688 1990 1461 1699 2001 1462 1700 2002 1451 1689 1991 1451 1689 1991 1462 1700 2002 1463 1701 2003 1452 1690 1992 1452 1690 1992 1463 1701 2003 1464 1702 2004 1453 1691 1993 1453 1691 1993 1464 1702 2004 1465 1703 2005 1454 1692 1994 1454 1692 1994 1465 1703 2005 1466 1704 2006 1455 1693 1995 1455 1693 1995 1466 1704 2006 1467 1705 2007 1456 1694 1996 1456 1694 1996 1467 1705 2007 1468 1706 2008 1457 1695 1997 1457 1695 1997 1468 1706 2008 1469 1707 2009 1458 1696 1998 1458 1696 1998 1469 1707 2009 1470 1708 2010 1459 1697 1999 846 954 1643 847 966 1655 1471 1709 2011 1460 1698 2000 1460 1698 2000 1471 1709 2011 1472 1710 2012 1461 1699 2001 1461 1699 2001 1472 1710 2012 1473 1711 2013 1462 1700 2002 1462 1700 2002 1473 1711 2013 1474 1712 2014 1463 1701 2003 1463 1701 2003 1474 1712 2014 1475 1713 2015 1464 1702 2004 1464 1702 2004 1475 1713 2015 1476 1714 2016 1465 1703 2005 1465 1703 2005 1476 1714 2016 1477 1715 2017 1466 1704 2006 1466 1704 2006 1477 1715 2017 1478 1716 2018 1467 1705 2007 1467 1705 2007 1478 1716 2018 1479 1717 2019 1468 1706 2008 1468 1706 2008 1479 1717 2019 1480 1718 2020 1469 1707 2009 1469 1707 2009 1480 1718 2020 1481 1719 2021 1470 1708 2010 847 966 1655 859 978 1667 1482 1720 2022 1471 1709 2011 1471 1709 2011 1482 1720 2022 1483 1721 2023 1472 1710 2012 1472 1710 2012 1483 1721 2023 1484 1722 2024 1473 1711 2013 1476 1714 2016 1485 1723 2025 1477 1715 2017 1477 1715 2017 1485 1723 2025 1488 1724 2026 1478 1716 2018 1478 1716 2018 1488 1724 2026 1489 1725 2027 1479 1717 2019 1479 1717 2019 1489 1725 2027 1490 1726 2028 1480 1718 2020 1480 1718 2020 1490 1726 2028 1491 1727 2029 1481 1719 2021 859 978 1667 868 987 1676 1486 1728 2030 1482 1720 2022 1482 1720 2022 1486 1728 2030 1487 1729 2031 1483 1721 2023 868 987 1676 871 990 1679 1492 1730 2032 1486 1728 2030 1486 1728 2030 1492 1730 2032 1493 1731 2033 1487 1729 2031 1495 1732 2034 1489 1725 2027 1488 1724 2026 1494 1733 2035 1489 1725 2027 1495 1732 2034 1496 1734 2036 1490 1726 2028 1490 1726 2028 1496 1734 2036 1497 1735 2037 1491 1727 2029 871 990 1679 878 997 1686 1498 1736 2038 1492 1730 2032 1492 1730 2032 1498 1736 2038 1499 1737 2039 1493 1731 2033 1501 1738 2040 1495 1732 2034 1494 1733 2035 1500 1739 2041 1495 1732 2034 1501 1738 2040 1502 1740 2042 1496 1734 2036 1496 1734 2036 1502 1740 2042 1503 1741 2043 1497 1735 2037 878 997 1686 885 1004 1693 1504 1742 2044 1498 1736 2038 1498 1736 2038 1504 1742 2044 1505 1743 2045 1499 1737 2039 1507 1744 2046 1501 1738 2040 1500 1739 2041 1506 1745 2047 1501 1738 2040 1507 1744 2046 1508 1746 2048 1502 1740 2042 1502 1740 2042 1508 1746 2048 1509 1747 2049 1503 1741 2043 885 1004 1693 892 1011 1700 1510 1748 2050 1504 1742 2044 1504 1742 2044 1510 1748 2050 1511 1749 2051 1505 1743 2045 1882 1750 2052 1512 1751 2053 1507 1744 2046 1506 1745 2047 1507 1744 2046 1512 1751 2053 1513 1752 2054 1508 1746 2048 1508 1746 2048 1513 1752 2054 1883 1753 2055 1509 1747 2049 1509 1747 2049 1883 1753 2055 1514 1754 2056 1904 1755 2057 1904 1755 2057 1985 1019 1708 1986 1021 1710 1903 1756 2058 892 1011 1700 898 1023 1712 1515 1757 2059 1510 1748 2050 1510 1748 2050 1515 1757 2059 1516 1758 2060 1511 1749 2051 1312 1025 1714 905 1028 1717 1521 1759 2061 1881 1760 2062 1338 1565 1867 907 1029 1718 696 807 1496 1339 1567 1869 907 1029 1718 1338 1565 1867 1340 1569 1871 907 1029 1718 1339 1567 1869 1341 1571 1873 907 1029 1718 1340 1569 1871 1342 1573 1875 907 1029 1718 1341 1571 1873 1343 1575 1877 907 1029 1718 1342 1573 1875 1344 1577 1879 907 1029 1718 1343 1575 1877 1345 1579 1881 907 1029 1718 1344 1577 1879 1346 1581 1883 907 1029 1718 1345 1579 1881 1347 1583 1885 907 1029 1718 1346 1581 1883 1348 1585 1887 907 1029 1718 1347 1583 1885 1348 1585 1887 1897 1587 1889 907 1029 1718 1973 1589 1891 907 1029 1718 1897 1587 1889 1555 1761 692 1621 1762 693 1658 1763 694 1594 1764 695 1621 1762 693 1555 1761 692 1570 1765 696 1642 1766 697 1556 1767 698 1621 1762 693 1642 1766 697 1572 1768 699 1621 1762 693 1556 1767 698 1595 1769 700 1658 1763 694 1557 1770 701 1622 1771 702 1657 1772 703 1593 1773 704 1622 1771 702 1557 1770 701 1569 1774 705 1643 1775 706 1555 1761 692 1622 1771 702 1643 1775 706 1570 1765 696 1622 1771 702 1555 1761 692 1594 1764 695 1657 1772 703 1558 1776 707 1623 1777 708 1656 1778 709 1592 1779 710 1623 1777 708 1558 1776 707 1567 1780 711 1641 1781 712 1557 1770 701 1623 1777 708 1641 1781 712 1569 1774 705 1623 1777 708 1557 1770 701 1593 1773 704 1656 1778 709 1559 1782 713 1624 1783 714 1655 1784 715 1591 1785 716 1624 1783 714 1559 1782 713 1574 1786 717 1644 1787 718 1558 1776 707 1624 1783 714 1644 1787 718 1567 1780 711 1624 1783 714 1558 1776 707 1592 1779 710 1655 1784 715 1625 1788 719 1560 1789 720 1578 1790 721 1646 1791 722 1559 1782 713 1625 1788 719 1646 1791 722 1574 1786 717 1625 1788 719 1681 1792 723 1680 1793 724 1560 1789 720 1561 1794 725 1626 1795 726 1654 1796 727 1590 1797 728 1626 1795 726 1561 1794 725 1582 1798 729 1648 1799 730 1560 1789 720 1626 1795 726 1648 1799 730 1578 1790 721 1626 1795 726 1560 1789 720 1680 1793 724 1654 1796 727 1562 1800 731 1627 1801 732 1653 1802 733 1589 1803 734 1627 1801 732 1562 1800 731 1585 1804 735 1650 1805 736 1561 1794 725 1627 1801 732 1650 1805 736 1582 1798 729 1627 1801 732 1561 1794 725 1590 1797 728 1653 1802 733 1563 1806 737 1628 1807 738 1652 1808 739 1587 1809 740 1628 1807 738 1563 1806 737 1581 1810 741 1649 1811 742 1562 1800 731 1628 1807 738 1649 1811 742 1585 1804 735 1628 1807 738 1562 1800 731 1589 1803 734 1652 1808 739 1564 1812 743 1629 1813 744 1651 1814 745 1588 1815 746 1629 1813 744 1564 1812 743 1577 1816 747 1647 1817 748 1563 1806 737 1629 1813 744 1647 1817 748 1581 1810 741 1629 1813 744 1563 1806 737 1587 1809 740 1651 1814 745 1556 1767 698 1630 1818 749 1659 1819 750 1595 1769 700 1630 1818 749 1556 1767 698 1572 1768 699 1645 1820 752 1564 1812 743 1630 1818 749 1645 1820 752 1577 1816 747 1630 1818 749 1564 1812 743 1588 1815 746 1659 1819 750 1658 1763 694 1595 1769 700 1587 1809 740 1652 1808 739 1662 1821 2063 1600 1822 2064 1927 1823 2065 1926 1824 2066 1631 1825 2067 1537 1826 2068 1925 1827 2069 1926 1824 2066 1664 1828 2070 1604 1829 2071 1934 1830 2072 1932 1831 2073 1632 1832 2074 1539 1833 2075 1930 1834 2076 1932 1831 2073 1665 1835 2077 1523 1836 2078 1930 1834 2076 1928 1837 2079 1633 1838 2080 1565 1839 2081 1927 1823 2065 1928 1837 2079 1666 1840 2082 1522 1841 2083 1925 1827 2069 1929 1842 2084 1634 1843 2085 1538 1844 2086 1931 1845 2087 1929 1842 2084 1667 1846 2088 1524 1847 2089 1931 1845 2087 1933 1848 2090 1635 1849 2091 1540 1850 2092 1935 1851 2093 1933 1848 2090 1636 1852 2094 1541 1853 2095 1939 1854 2096 1937 1855 2097 1660 1856 2098 1596 1857 2099 1935 1851 2093 1937 1855 2097 1661 1858 2100 1598 1859 2101 1939 1854 2096 1941 1860 2102 1637 1861 2103 1543 1862 2104 1943 1863 2105 1941 1860 2102 1668 1864 2106 1525 1865 2107 1943 1863 2105 1944 1866 2108 1638 1867 2109 1544 1868 2110 1942 1869 2111 1944 1866 2108 1663 1870 2112 1602 1871 2113 1942 1869 2111 1940 1872 2114 1639 1873 2115 1542 1874 2116 1938 1875 2117 1940 1872 2114 1669 1876 2118 1526 1877 2119 1938 1875 2117 1936 1878 2120 1640 1879 2121 1566 1880 2122 1934 1830 2072 1936 1878 2120 1567 1780 711 1528 1881 944 1568 1882 949 1641 1781 712 1568 1883 949 1527 1884 947 1569 1774 705 1641 1781 712 1570 1765 696 1530 1885 946 1571 1886 948 1642 1766 697 1571 1887 948 1529 1888 942 1572 1768 699 1642 1766 697 1569 1774 705 1527 1889 947 1573 1890 945 1643 1775 706 1573 1891 945 1530 1892 946 1570 1765 696 1643 1775 706 1574 1786 717 1531 1893 940 1575 1894 943 1644 1787 718 1575 1895 943 1528 1896 944 1567 1780 711 1644 1787 718 1572 1768 699 1529 1897 942 1576 1898 941 1645 1820 752 1576 1899 941 1532 1900 938 1577 1816 747 1645 1820 752 1578 1790 721 1533 1901 936 1579 1902 939 1646 1791 722 1579 1903 939 1531 1904 940 1574 1786 717 1646 1791 722 1577 1816 747 1532 1905 938 1580 1906 937 1647 1817 748 1580 1907 937 1534 1908 934 1581 1810 741 1647 1817 748 1582 1798 729 1535 1909 931 1583 1910 935 1648 1799 730 1583 1911 935 1533 1912 936 1578 1790 721 1648 1799 730 1581 1810 741 1534 1913 934 1584 1914 933 1649 1811 742 1584 1915 933 1536 1916 932 1585 1804 735 1649 1811 742 1585 1804 735 1536 1917 932 1586 1918 930 1650 1805 736 1586 1919 930 1535 1920 931 1582 1798 729 1650 1805 736 1568 1921 2123 1528 1922 2124 1538 1844 2086 1634 1843 2085 1568 1923 2123 1634 1843 2085 1537 1826 2068 1527 1924 2125 1571 1925 2126 1530 1926 2127 1565 1839 2081 1633 1838 2080 1571 1927 2126 1633 1838 2080 1539 1833 2075 1529 1928 2128 1573 1929 2129 1527 1930 2125 1537 1826 2068 1631 1825 2067 1573 1931 2129 1631 1825 2067 1565 1839 2081 1530 1932 2127 1575 1933 2130 1531 1934 2131 1540 1850 2092 1635 1849 2091 1575 1935 2130 1635 1849 2091 1538 1844 2086 1528 1936 2124 1576 1937 2132 1529 1938 2128 1539 1833 2075 1632 1832 2074 1576 1939 2132 1632 1832 2074 1566 1880 2122 1532 1940 2133 1579 1941 2134 1533 1942 2135 1541 1853 2095 1636 1852 2094 1579 1943 2134 1636 1852 2094 1540 1850 2092 1531 1944 2131 1580 1945 2136 1532 1946 2133 1566 1880 2122 1640 1879 2121 1580 1947 2136 1640 1879 2121 1542 1874 2116 1534 1948 2137 1583 1949 2138 1535 1950 2139 1543 1862 2104 1637 1861 2103 1583 1951 2138 1637 1861 2103 1541 1853 2095 1533 1952 2135 1584 1953 2140 1534 1954 2137 1542 1874 2116 1639 1873 2115 1584 1955 2140 1639 1873 2115 1544 1868 2110 1536 1956 2141 1586 1957 2142 1536 1958 2141 1544 1868 2110 1638 1867 2109 1586 1959 2142 1638 1867 2109 1543 1862 2104 1535 1960 2139 1598 1859 2101 1546 1961 2143 1610 1962 2144 1660 1856 2098 1610 1962 2144 1545 1963 2145 1596 1857 2099 1660 1856 2098 1525 1865 2107 1547 1964 2146 1597 1965 2147 1661 1858 2100 1597 1965 2147 1546 1961 2143 1598 1859 2101 1661 1858 2100 1522 1841 2083 1549 1966 2148 1599 1967 2149 1662 1821 2063 1599 1967 2149 1548 1968 2150 1600 1822 2064 1662 1821 2063 1526 1877 2119 1551 1969 2151 1601 1970 2152 1663 1870 2112 1601 1970 2152 1550 1971 2153 1602 1871 2113 1663 1870 2112 1523 1836 2078 1553 1972 2154 1603 1973 2155 1664 1828 2070 1603 1973 2155 1552 1974 2156 1604 1829 2071 1664 1828 2070 1600 1822 2064 1548 1968 2150 1605 1975 2157 1665 1835 2077 1605 1975 2157 1553 1972 2154 1523 1836 2078 1665 1835 2077 1524 1847 2089 1554 1976 2158 1606 1977 2159 1666 1840 2082 1606 1977 2159 1549 1966 2148 1522 1841 2083 1666 1840 2082 1596 1857 2099 1545 1963 2145 1607 1978 2160 1667 1846 2088 1607 1978 2160 1554 1976 2158 1524 1847 2089 1667 1846 2088 1602 1871 2113 1550 1971 2153 1608 1979 2161 1668 1864 2106 1608 1979 2161 1547 1964 2146 1525 1865 2107 1668 1864 2106 1604 1829 2071 1552 1974 2156 1609 1980 2162 1669 1876 2118 1609 1980 2162 1551 1969 2151 1526 1877 2119 1669 1876 2118 1610 1962 2144 1546 1961 2143 1611 1981 2163 1670 1982 2164 1612 1983 2165 1545 1963 2145 1610 1962 2144 1670 1982 2164 1597 1965 2147 1547 1964 2146 1613 1984 2166 1671 1985 2167 1611 1981 2163 1546 1961 2143 1597 1965 2147 1671 1985 2167 1599 1967 2149 1549 1966 2148 1614 1986 2168 1672 1987 2169 1615 1988 2170 1548 1968 2150 1599 1967 2149 1672 1987 2169 1601 1970 2152 1551 1969 2151 1616 1989 2171 1673 1990 2172 1617 1991 2173 1550 1971 2153 1601 1970 2152 1673 1990 2172 1603 1973 2155 1553 1972 2154 1618 1992 2174 1674 1993 2175 1619 1994 2176 1552 1974 2156 1603 1973 2155 1674 1993 2175 1605 1975 2157 1548 1968 2150 1615 1988 2170 1675 1995 2177 1618 1992 2174 1553 1972 2154 1605 1975 2157 1675 1995 2177 1606 1977 2159 1554 1976 2158 1620 1996 2178 1676 1997 2179 1614 1986 2168 1549 1966 2148 1606 1977 2159 1676 1997 2179 1607 1978 2160 1545 1963 2145 1612 1983 2165 1677 1998 2180 1620 1996 2178 1554 1976 2158 1607 1978 2160 1677 1998 2180 1608 1979 2161 1550 1971 2153 1617 1991 2173 1678 1999 2181 1613 1984 2166 1547 1964 2146 1608 1979 2161 1678 1999 2181 1609 1980 2162 1552 1974 2156 1619 1994 2176 1679 2000 2182 1616 1989 2171 1551 1969 2151 1609 1980 2162 1679 2000 2182 1587 1809 740 1595 1769 700 1659 1819 750 1588 1815 746 1651 1814 745 1594 1764 695 1589 1803 734 1653 1802 733 1657 1772 703 1658 1763 694 1652 1808 739 1589 1803 734 1594 1764 695 1657 1772 703 1653 1802 733 1590 1797 728 1593 1773 704 1592 1779 710 1680 1793 724 1681 1792 723 1591 1785 716 1655 1784 715 1593 1773 704 1590 1797 728 1654 1796 727 1656 1778 709 1625 1788 719 1559 1782 713 1591 1785 716 1681 1792 723 1592 1779 710 1656 1778 709 1654 1796 727 1680 1793 724 1611 1981 2163 1519 2001 2183 1520 2002 2184 1670 1982 2164 1670 1982 2164 1520 2002 2184 1882 1750 2052 1612 1983 2165 1613 1984 2166 1517 2003 2185 1518 2004 2186 1671 1985 2167 1614 1986 2168 1488 1724 2026 1485 1723 2025 1672 1987 2169 1672 1987 2169 1485 1723 2025 1476 1714 2016 1615 1988 2170 1616 1989 2171 1499 1737 2039 1505 1743 2045 1673 1990 2172 1673 1990 2172 1505 1743 2045 1511 1749 2051 1617 1991 2173 1618 1992 2174 1474 1712 2014 1484 1722 2024 1674 1993 2175 1674 1993 2175 1484 1722 2024 1487 1729 2031 1619 1994 2176 1615 1988 2170 1476 1714 2016 1475 1713 2015 1675 1995 2177 1675 1995 2177 1475 1713 2015 1474 1712 2014 1618 1992 2174 1620 1996 2178 1500 1739 2041 1494 1733 2035 1676 1997 2179 1676 1997 2179 1494 1733 2035 1488 1724 2026 1614 1986 2168 1677 1998 2180 1506 1745 2047 1500 1739 2041 1620 1996 2178 1617 1991 2173 1511 1749 2051 1516 1758 2060 1678 1999 2181 1678 1999 2181 1516 1758 2060 1517 2003 2185 1613 1984 2166 1619 1994 2176 1487 1729 2031 1493 1731 2033 1679 2000 2182 1679 2000 2182 1493 1731 2033 1499 1737 2039 1616 1989 2171 1671 1985 2167 1518 2004 2186 1519 2001 2183 1611 1981 2163 1487 1729 2031 1484 1722 2024 1483 1721 2023 1484 1722 2024 1474 1712 2014 1473 1711 2013 1677 1998 2180 1612 1983 2165 1882 1750 2052 1506 1745 2047 1807 2005 620 1687 2006 621 1721 2007 622 1721 2007 622 1687 2006 621 1722 2008 623 1807 2005 620 1723 2009 624 1070 1282 380 1092 1281 379 1808 2010 625 1878 2011 626 1879 2012 627 1723 2009 624 1808 2010 625 1723 2009 624 1879 2012 627 1880 2013 628 1809 2014 629 1110 1287 385 1093 1289 387 1809 2014 629 1857 2015 630 1093 1289 387 1070 1282 380 1723 2009 624 1809 2014 629 1789 2016 631 1867 2017 632 1724 2018 633 1688 2019 634 1683 2020 635 1724 2018 633 1867 2017 632 1685 2021 636 1690 2022 637 1725 2023 638 1720 2024 639 1682 2025 640 1071 1300 398 1069 2026 399 1720 2027 639 1725 2023 638 1724 2018 633 1683 2028 635 1726 2029 641 1810 2030 642 1726 2031 641 1684 2032 643 1847 2033 644 1810 2030 642 1847 2033 644 1792 2034 645 1727 2035 646 1810 2030 642 1727 2035 646 1688 2019 634 1724 2018 633 1810 2030 642 1788 2036 647 1844 2037 648 1728 2038 649 1691 2039 650 1789 2016 631 1688 2019 634 1728 2038 649 1844 2037 648 1729 2040 651 1693 2041 652 1730 2042 653 1811 2043 654 1730 2042 653 1694 2044 655 1815 2045 656 1811 2043 654 1815 2045 656 1731 2046 657 1811 2043 654 1731 2046 657 1692 2047 658 1729 2040 651 1811 2043 654 1732 2048 659 1690 2022 637 1689 2049 660 1812 2050 661 1790 2051 662 1695 2052 663 1732 2048 659 1812 2050 661 1732 2048 659 1695 2052 663 1733 2053 664 1813 2054 665 1733 2053 664 1072 1331 426 1094 1330 425 1813 2054 665 1094 1330 425 1071 1300 398 1725 2023 638 1813 2054 665 1725 2023 638 1690 2022 637 1732 2048 659 1813 2054 665 1848 2055 666 1793 2056 667 1734 2057 668 1814 2058 669 1734 2057 668 1691 2039 650 1728 2038 649 1814 2058 669 1728 2038 649 1688 2019 634 1727 2035 646 1814 2058 669 1727 2035 646 1792 2034 645 1848 2055 666 1814 2058 669 1694 2044 655 1696 2059 670 1735 2060 671 1815 2045 656 1735 2060 671 1736 2061 672 1815 2045 656 1778 2062 673 1698 2063 674 1737 2064 675 1699 2065 676 1737 2064 675 1779 2066 677 1866 2067 678 1699 2065 676 1738 2068 679 1073 1348 443 1095 1347 442 1816 2069 680 1095 1347 442 1074 1350 445 1836 2070 681 1816 2069 680 1836 2070 681 1779 2066 677 1737 2064 675 1816 2069 680 1737 2064 675 1698 2063 674 1738 2068 679 1816 2069 680 1798 2071 682 1701 2072 683 1740 2073 684 1817 2074 685 1740 2073 684 1700 2075 686 1739 2076 687 1817 2074 685 1741 2077 688 1702 2078 689 1742 2079 690 1818 2080 691 1742 2079 690 1686 2081 751 1807 2005 620 1818 2080 691 1741 2077 688 1818 2080 691 1744 2082 753 1871 2083 754 1807 2005 620 1722 2008 623 1743 2084 755 1818 2080 691 1743 2084 755 1703 2085 756 1744 2082 753 1818 2080 691 1745 2086 757 1876 2087 758 1877 2088 759 1819 2089 760 1877 2088 759 1878 2011 626 1808 2010 625 1819 2089 760 1808 2010 625 1092 1281 379 1096 1369 464 1819 2089 760 1096 1369 464 1075 1370 465 1745 2086 757 1819 2089 760 1788 2036 647 1691 2039 650 1746 2090 761 1843 2091 762 1704 2092 763 1843 2091 762 1746 2090 761 1705 2093 764 1747 2094 765 1706 2095 766 1748 2096 767 1820 2097 768 1748 2096 767 1707 2098 769 1749 2099 770 1820 2097 768 1749 2099 770 1702 2078 689 1741 2077 688 1820 2097 768 1750 2100 771 1706 2095 766 1747 2094 765 1821 2101 772 1751 2102 773 1871 2083 754 1744 2082 753 1805 2103 774 1751 2102 773 1696 2059 670 1752 2104 775 1821 2101 772 1752 2104 775 1708 2105 776 1750 2100 771 1821 2101 772 1753 2106 777 1702 2078 689 1749 2099 770 1822 2107 778 1749 2099 770 1707 2098 769 1754 2108 779 1822 2107 778 1754 2108 779 1802 2109 780 1856 2110 781 1822 2107 778 1856 2110 781 1803 2111 782 1753 2106 777 1822 2107 778 1709 2112 783 1755 2113 784 1842 2114 785 1787 2115 786 1786 2116 787 1842 2114 785 1755 2113 784 1710 2117 788 1756 2118 789 1712 2119 790 1757 2120 791 1823 2121 792 1757 2120 791 1714 2122 793 1758 2123 794 1823 2121 792 1758 2123 794 1713 2124 795 1759 2125 796 1823 2121 792 1759 2125 796 1711 2126 797 1756 2118 789 1823 2121 792 1760 2127 798 1715 2128 799 1761 2129 800 1824 2130 801 1761 2129 800 1700 2075 686 1762 2131 802 1824 2130 801 1762 2131 802 1712 2119 790 1756 2118 789 1824 2130 801 1756 2118 789 1711 2126 797 1760 2127 798 1824 2130 801 1763 2132 803 1795 2133 804 1851 2134 805 1825 2135 806 1851 2134 805 1796 2136 807 1764 2137 808 1825 2135 806 1764 2137 808 1710 2117 788 1755 2113 784 1825 2135 806 1755 2113 784 1709 2112 783 1763 2132 803 1825 2135 806 1765 2138 809 1713 2124 795 1758 2123 794 1826 2139 810 1758 2123 794 1714 2122 793 1766 2140 811 1826 2139 810 1766 2140 811 1800 2141 812 1854 2142 813 1826 2139 810 1854 2142 813 1801 2143 814 1765 2138 809 1826 2139 810 1786 2116 787 1710 2117 788 1764 2137 808 1841 2144 815 1797 2145 816 1841 2144 815 1764 2137 808 1796 2136 807 1767 2146 817 1799 2147 818 1853 2148 819 1827 2149 820 1853 2148 819 1800 2141 812 1766 2140 811 1827 2149 820 1766 2140 811 1714 2122 793 1757 2120 791 1827 2149 820 1757 2120 791 1712 2119 790 1767 2146 817 1827 2149 820 1768 2150 821 1695 2052 663 1790 2051 662 1828 2151 822 1791 2152 823 1716 2153 824 1768 2150 821 1828 2151 822 1770 2154 825 1717 2155 826 1769 2156 827 1829 2157 828 1744 2082 753 1703 2085 756 1771 2158 829 1830 2159 830 1872 2160 831 1771 2158 829 1875 2161 832 1874 2162 833 1768 2150 821 1716 2153 824 1773 2163 834 1831 2164 835 1773 2163 834 1076 1447 542 1097 1446 541 1831 2164 835 1097 1446 541 1072 1331 426 1733 2053 664 1831 2164 835 1733 2053 664 1695 2052 663 1768 2150 821 1831 2164 835 1875 2161 832 1876 2087 758 1745 2086 757 1832 2165 836 1745 2086 757 1075 1370 465 1098 1449 544 1832 2165 836 1098 1449 544 1077 1451 546 1774 2166 837 1832 2165 836 1774 2166 837 1874 2162 833 1875 2161 832 1832 2165 836 1718 2167 838 1716 2153 824 1791 2152 823 1846 2168 839 1769 2156 827 1717 2155 826 1775 2169 840 1776 2170 841 1835 2171 842 1872 2160 831 1874 2162 833 1873 2172 843 1078 1458 553 1076 1447 542 1773 2163 834 1833 2173 844 1773 2163 834 1716 2153 824 1718 2167 838 1833 2173 844 1774 2166 837 1077 1451 546 1099 1461 556 1834 2174 845 1873 2172 843 1874 2162 833 1774 2166 837 1834 2174 845 1776 2170 841 1775 2169 840 1778 2062 673 1699 2065 676 1074 1350 445 1078 1458 553 1833 2173 844 1836 2070 681 1833 2173 844 1718 2167 838 1779 2066 677 1836 2070 681 1849 2175 846 1794 2176 847 1780 2177 848 1837 2178 849 1780 2177 848 1705 2093 764 1746 2090 761 1837 2178 849 1746 2090 761 1691 2039 650 1734 2057 668 1837 2178 849 1734 2057 668 1793 2056 667 1849 2175 846 1837 2178 849 1855 2179 850 1802 2109 780 1754 2108 779 1838 2180 851 1754 2108 779 1707 2098 769 1781 2181 852 1838 2180 851 1781 2181 852 1713 2124 795 1765 2138 809 1838 2180 851 1765 2138 809 1801 2143 814 1855 2179 850 1838 2180 851 1719 2182 853 1715 2128 799 1782 2183 854 1839 2184 855 1782 2183 854 1708 2105 776 1783 2185 856 1839 2184 855 1704 2092 763 1705 2093 764 1784 2186 857 1870 2187 858 1709 2112 783 1787 2115 786 1870 2187 858 1784 2186 857 1785 2188 859 1711 2126 797 1759 2125 796 1840 2189 860 1759 2125 796 1713 2124 795 1781 2181 852 1840 2189 860 1781 2181 852 1707 2098 769 1748 2096 767 1840 2189 860 1748 2096 767 1706 2095 766 1785 2188 859 1840 2189 860 1797 2145 816 1798 2071 682 1817 2074 685 1841 2144 815 1817 2074 685 1739 2076 687 1786 2116 787 1841 2144 815 1786 2116 787 1739 2076 687 1863 2190 861 1842 2114 785 1863 2190 861 1719 2182 853 1787 2115 786 1842 2114 785 1704 2092 763 1783 2185 856 1860 2191 862 1843 2091 762 1860 2191 862 1694 2044 655 1788 2036 647 1843 2091 762 1788 2036 647 1694 2044 655 1730 2042 653 1844 2037 648 1730 2042 653 1693 2041 652 1789 2016 631 1844 2037 648 1685 2192 636 1693 2041 652 1729 2040 651 1845 2193 863 1896 2194 864 1692 2047 658 1731 2046 657 1829 2157 828 1769 2156 827 1791 2152 823 1828 2151 822 1791 2152 823 1769 2156 827 1776 2170 841 1846 2168 839 1846 2168 839 1776 2170 841 1699 2065 676 1866 2067 678 1684 2195 643 1068 2196 577 1100 1483 576 1847 2033 644 1100 1483 576 1079 1485 578 1792 2034 645 1847 2033 644 1792 2034 645 1079 1485 578 1101 1486 579 1848 2055 666 1101 1486 579 1080 1487 580 1793 2056 667 1848 2055 666 1793 2056 667 1080 1487 580 1102 1488 581 1849 2175 846 1102 1488 581 1081 1489 582 1794 2176 847 1849 2175 846 1794 2176 847 1081 1489 582 1103 1491 584 1850 2197 865 1103 1491 584 1082 1492 585 1795 2133 804 1850 2197 865 1795 2133 804 1082 1492 585 1104 1493 586 1851 2134 805 1104 1493 586 1083 1494 587 1796 2136 807 1851 2134 805 1083 1494 587 1084 1495 588 1797 2145 816 1796 2136 807 1084 1495 588 1085 1496 589 1798 2071 682 1797 2145 816 1701 2072 683 1087 1499 592 1105 1498 591 1852 2198 866 1105 1498 591 1086 1500 593 1799 2147 818 1852 2198 866 1106 1501 594 1088 1502 595 1800 2141 812 1853 2148 819 1799 2147 818 1086 1500 593 1106 1501 594 1853 2148 819 1800 2141 812 1088 1502 595 1107 1503 596 1854 2142 813 1107 1503 596 1089 1504 597 1801 2143 814 1854 2142 813 1108 1505 598 1090 1506 599 1802 2109 780 1855 2179 850 1801 2143 814 1089 1504 597 1108 1505 598 1855 2179 850 1802 2109 780 1090 1506 599 1109 1507 600 1856 2110 781 1109 1507 600 1091 1508 601 1803 2111 782 1856 2110 781 1803 2111 782 1091 1508 601 1110 1287 385 1857 2015 630 1738 2068 679 1698 2063 674 1804 2199 867 1858 2200 868 1804 2199 867 1873 2172 843 1834 2174 845 1858 2200 868 1834 2174 845 1099 1461 556 1111 1511 604 1858 2200 868 1111 1511 604 1073 1348 443 1738 2068 679 1858 2200 868 1085 1496 589 1087 1499 592 1701 2072 683 1798 2071 682 1770 2154 825 1697 2201 869 1805 2103 774 1859 2202 870 1805 2103 774 1744 2082 753 1830 2159 830 1859 2202 870 1830 2159 830 1772 2203 871 1806 2204 872 1859 2202 870 1806 2204 872 1717 2155 826 1770 2154 825 1859 2202 870 1783 2185 856 1708 2105 776 1752 2104 775 1860 2191 862 1696 2059 670 1694 2044 655 1860 2191 862 1752 2104 775 1775 2169 840 1717 2155 826 1806 2204 872 1861 2205 873 1806 2204 872 1772 2203 871 1777 2206 874 1861 2205 873 1785 2188 859 1706 2095 766 1750 2100 771 1862 2207 875 1750 2100 771 1708 2105 776 1782 2183 854 1862 2207 875 1782 2183 854 1715 2128 799 1760 2127 798 1862 2207 875 1760 2127 798 1711 2126 797 1785 2188 859 1862 2207 875 1778 2062 673 1775 2169 840 1861 2205 873 1864 2208 876 1861 2205 873 1777 2206 874 1835 2171 842 1864 2208 876 1739 2076 687 1700 2075 686 1761 2129 800 1863 2190 861 1761 2129 800 1715 2128 799 1719 2182 853 1863 2190 861 1804 2199 867 1698 2063 674 1778 2062 673 1864 2208 876 1852 2198 866 1799 2147 818 1767 2146 817 1865 2209 877 1767 2146 817 1712 2119 790 1762 2131 802 1865 2209 877 1762 2131 802 1700 2075 686 1740 2073 684 1865 2209 877 1740 2073 684 1701 2072 683 1852 2198 866 1865 2209 877 1779 2066 677 1718 2167 838 1846 2168 839 1866 2067 678 1789 2016 631 1693 2041 652 1685 2210 636 1867 2017 632 1805 2103 774 1697 2201 869 1735 2060 671 1696 2059 670 1751 2102 773 1753 2106 777 1803 2111 782 1857 2015 630 1868 2211 878 1857 2015 630 1809 2014 629 1868 2211 878 1809 2014 629 1880 2013 628 1868 2211 878 1742 2079 690 1702 2078 689 1753 2106 777 1868 2211 878 1780 2177 848 1794 2176 847 1850 2197 865 1869 2212 879 1850 2197 865 1795 2133 804 1763 2132 803 1869 2212 879 1763 2132 803 1709 2112 783 1784 2186 857 1869 2212 879 1784 2186 857 1705 2093 764 1780 2177 848 1869 2212 879 1787 2115 786 1719 2182 853 1839 2184 855 1870 2187 858 1839 2184 855 1783 2185 856 1704 2092 763 1870 2187 858 1871 2083 754 1751 2102 773 1821 2101 772 1747 2094 765 1741 2077 688 1871 2083 754 1747 2094 765 1820 2097 768 1772 2203 871 1872 2160 831 1835 2171 842 1777 2206 874 1771 2158 829 1872 2160 831 1772 2203 871 1830 2159 830 1835 2171 842 1873 2172 843 1804 2199 867 1864 2208 876 1771 2158 829 1703 2085 756 1876 2087 758 1875 2161 832 1877 2088 759 1876 2087 758 1703 2085 756 1743 2084 755 1743 2084 755 1722 2008 623 1878 2011 626 1877 2088 759 1722 2008 623 1687 2006 621 1879 2012 627 1878 2011 626 1880 2013 628 1879 2012 627 1687 2006 621 1686 2081 751 1868 2211 878 1880 2013 628 1686 2081 751 1742 2079 690 1068 2213 1843 1684 2214 2187 1886 2215 2188 1319 1525 1844 1518 2004 2186 1521 1759 2061 1886 2215 2188 1887 2216 2189 1518 2004 2186 1517 2003 2185 1881 1760 2062 1521 1759 2061 1881 1760 2062 1517 2003 2185 1516 1758 2060 1515 1757 2059 898 1023 1712 1312 1025 1714 1881 1760 2062 1515 1757 2059 1683 2217 2190 1685 2218 2191 1889 2219 2192 1888 2220 2193 1882 1750 2052 1520 2002 2184 1889 2219 2192 1890 2221 2194 1884 2222 2195 1885 2223 2196 1892 2224 2197 1891 2225 2198 1315 1538 1857 1514 1754 2056 1898 2226 2199 1320 1539 1858 1519 2001 2183 1518 2004 2186 1887 2216 2189 1888 2220 2193 1512 1751 2053 1882 1750 2052 1890 2221 2194 1891 2225 2198 1729 2040 651 1692 2047 658 1884 2227 880 1845 2228 863 1690 2022 637 1682 2229 640 1885 2230 881 1689 2049 660 1883 1753 2055 1513 1752 2054 1892 2224 2197 1893 2231 2200 1885 2232 881 1884 2233 880 1692 2047 658 1689 2049 660 1521 1759 2061 905 1028 1717 1319 1525 1844 1886 2215 2188 1720 2234 2201 1069 2235 1862 1320 1539 1858 1898 2226 2199 1684 2236 2187 1726 2237 2202 1887 2216 2189 1886 2215 2188 1726 2238 2202 1683 2239 2190 1888 2220 2193 1887 2216 2189 1520 2002 2184 1519 2001 2183 1888 2220 2193 1889 2219 2192 1685 2240 2191 1845 2241 2203 1890 2221 2194 1889 2219 2192 1845 2242 2203 1884 2243 2195 1891 2225 2198 1890 2221 2194 1513 1752 2054 1512 1751 2053 1891 2225 2198 1892 2224 2197 1885 2244 2196 1682 2245 2204 1893 2231 2200 1892 2224 2197 1682 2246 2204 1720 2247 2201 1898 2226 2199 1893 2231 2200 1894 2248 882 1697 2201 869 1770 2154 825 1829 2157 828 1790 2051 662 1894 2248 882 1829 2157 828 1828 2151 822 1895 2249 883 1894 2248 882 1790 2051 662 1812 2050 661 1736 2061 672 1735 2060 671 1697 2201 869 1894 2248 882 1896 2194 864 1736 2061 672 1894 2248 882 1895 2249 883 1689 2049 660 1692 2047 658 1896 2194 864 1895 2249 883 1689 2049 660 1895 2249 883 1812 2050 661 1731 2046 657 1815 2045 656 1736 2061 672 1896 2194 864 1883 1753 2055 1893 2231 2200 1898 2226 2199 1514 1754 2056 1359 1584 1886 1371 1600 1902 1899 1601 1903 1360 1586 1888 1371 1600 1902 1382 1613 1915 1900 1614 1916 1899 1601 1903 1382 1613 1915 1393 1626 1928 1901 1627 1929 1900 1614 1916 1393 1626 1928 1404 1639 1941 1902 1640 1942 1901 1627 1929 1404 1639 1941 1415 1652 1954 350 790 1479 1902 1640 1942 1415 1652 1954 1426 1664 1966 433 793 1482 350 790 1479 1497 1735 2037 1903 1756 2058 430 806 1495 1503 1741 2043 1509 1747 2049 1904 1755 2057 1903 1756 2058 1051 1105 1734 986 1090 1719 1906 1093 1722 1905 1106 1735 1048 1091 1720 908 1109 1738 1908 1096 1725 1907 1092 1721 1017 1095 1724 951 1107 1736 1906 1093 1722 1907 1092 1721 1019 1108 1737 925 1101 1730 1909 1103 1732 1905 1106 1735 1020 1113 1742 923 1094 1723 1908 1096 1725 1910 1111 1740 1050 1098 1727 909 1104 1733 1909 1103 1732 1911 1099 1728 1052 1110 1739 910 1115 1744 1912 1114 1743 1910 1111 1740 1018 1102 1731 952 1148 1777 1913 1100 1729 1911 1099 1728 1021 1119 1748 924 1112 1741 1912 1114 1743 1914 1117 1746 1055 1146 1775 990 1097 1726 1913 1100 1729 1915 1147 1776 1053 1116 1745 982 1125 1754 1916 1120 1749 1914 1117 1746 1026 1149 1778 928 1142 1771 1917 1144 1773 1915 1147 1776 1022 1122 1751 926 1118 1747 1916 1120 1749 1918 1123 1752 1049 1140 1769 912 1145 1774 1917 1144 1773 1919 1141 1770 1046 1126 1755 984 1127 1756 1920 1124 1753 1918 1123 1752 1025 1143 1772 930 1136 1765 1921 1138 1767 1919 1141 1770 1023 1131 1760 927 1121 1750 1920 1124 1753 1922 1129 1758 1054 1134 1763 988 1139 1768 1921 1138 1767 1923 1135 1764 1047 1128 1757 911 1133 1762 1924 1132 1761 1922 1129 1758 1024 1137 1766 929 1130 1759 1924 1132 1761 1923 1135 1764 1522 1841 2083 1662 1821 2063 1926 1824 2066 1925 1827 2069 1600 1822 2064 1665 1835 2077 1928 1837 2079 1927 1823 2065 1565 1839 2081 1631 1825 2067 1926 1824 2066 1927 1823 2065 1537 1826 2068 1634 1843 2085 1929 1842 2084 1925 1827 2069 1539 1833 2075 1633 1838 2080 1928 1837 2079 1930 1834 2076 1524 1847 2089 1666 1840 2082 1929 1842 2084 1931 1845 2087 1523 1836 2078 1664 1828 2070 1932 1831 2073 1930 1834 2076 1538 1844 2086 1635 1849 2091 1933 1848 2090 1931 1845 2087 1566 1880 2122 1632 1832 2074 1932 1831 2073 1934 1830 2072 1596 1857 2099 1667 1846 2088 1933 1848 2090 1935 1851 2093 1604 1829 2071 1669 1876 2118 1936 1878 2120 1934 1830 2072 1540 1850 2092 1636 1852 2094 1937 1855 2097 1935 1851 2093 1542 1874 2116 1640 1879 2121 1936 1878 2120 1938 1875 2117 1598 1859 2101 1660 1856 2098 1937 1855 2097 1939 1854 2096 1526 1877 2119 1663 1870 2112 1940 1872 2114 1938 1875 2117 1541 1853 2095 1637 1861 2103 1941 1860 2102 1939 1854 2096 1544 1868 2110 1639 1873 2115 1940 1872 2114 1942 1869 2111 1525 1865 2107 1661 1858 2100 1941 1860 2102 1943 1863 2105 1602 1871 2113 1668 1864 2106 1944 1866 2108 1942 1869 2111 1543 1862 2104 1638 1867 2109 1944 1866 2108 1943 1863 2105 651 570 1332 1945 675 1416 2086 2250 2205 2087 571 1333 1964 507 1303 374 512 1308 393 653 1394 1945 675 1416 2086 2250 2205 1945 675 1416 393 653 1394 2107 723 1448 401 620 1368 521 619 1367 1948 772 1467 1949 771 1466 579 623 1371 660 630 1378 1950 770 1465 1949 771 1466 402 628 1376 524 626 1374 1950 770 1465 1951 769 1464 578 631 1379 577 664 1405 1952 767 1462 1951 769 1464 577 664 1405 2094 700 1429 2096 768 1463 1952 767 1462 419 742 977 584 693 281 1954 765 1000 1955 764 999 575 553 236 659 556 239 1957 762 997 1956 763 998 404 636 250 527 634 248 1957 762 997 1958 761 996 574 558 241 658 569 245 1959 760 995 1958 761 996 407 643 257 530 641 255 1959 760 995 1960 759 994 573 568 244 657 672 268 1961 758 993 1960 759 994 412 649 263 533 647 261 1961 758 993 1962 757 992 571 755 990 671 732 309 1947 734 311 1963 756 991 1470 1708 2010 1481 1719 2021 347 801 1490 431 800 1489 1459 1697 1999 1470 1708 2010 431 800 1489 348 798 1487 1448 1686 1988 1459 1697 1999 348 798 1487 432 797 1486 1437 1675 1977 1448 1686 1988 432 797 1486 349 794 1483 1491 1727 2029 351 803 1492 347 801 1490 1481 1719 2021 1497 1735 2037 430 806 1495 351 803 1492 1491 1727 2029 435 438 1234 430 806 1495 1903 1756 2058 1986 1021 1710 435 438 1234 1986 1021 1710 320 1020 1709 88 375 1186 433 793 1482 1426 1664 1966 1437 1675 1977 349 794 1483 2048 2251 2206 2049 2252 2207 1973 1589 1891 1972 1588 1890 1902 1640 1942 350 790 1479 434 436 1232 1974 1641 1943 2047 2253 2208 2048 2251 2206 1972 1588 1890 1975 1602 1904 2046 2254 2209 2047 2253 2208 1975 1602 1904 1976 1615 1917 2045 2255 2210 2046 2254 2209 1976 1615 1917 1977 1628 1930 2044 1653 1955 2045 2255 2210 1977 1628 1930 1974 1641 1943 606 781 1473 684 410 1214 2026 413 1217 2027 423 2211 310 111 904 1978 113 906 2025 412 1216 2024 409 1213 867 985 1674 858 976 1665 4 371 1182 84 373 1184 858 976 1665 845 964 1653 0 369 1180 4 371 1182 721 832 1521 1331 831 1520 1980 836 1525 1979 835 1524 774 2256 2212 3 360 1171 87 359 1170 1981 892 1581 722 834 1523 735 2257 2213 1982 850 1539 1979 835 1524 735 2257 2213 748 2258 2214 1983 864 1553 1982 850 1539 748 2258 2214 761 2259 2215 1984 878 1567 1983 864 1553 761 2259 2215 774 2256 2212 1981 892 1581 1984 878 1567 810 928 1617 798 916 1605 86 364 1175 1 365 1176 1 365 1176 85 367 1178 822 940 1629 810 928 1617 834 952 1641 822 940 1629 85 367 1178 0 369 1180 845 964 1653 834 952 1641 0 369 1180 88 375 1186 320 1020 1709 2015 2260 2216 2015 2260 2216 84 373 1184 88 375 1186 1904 1755 2057 1514 1754 2056 1315 1538 1857 1985 1019 1708 1337 1017 1706 1985 1019 1708 1315 1538 1857 897 1018 1707 90 2 28 243 1 26 1987 2261 2217 1988 2262 2218 243 1 26 91 4 30 1989 2263 2219 1987 2261 2217 91 4 30 244 7 35 1990 2264 2220 1989 2263 2219 244 7 35 299 8 36 1991 2265 2221 1990 2264 2220 164 179 1042 163 178 1041 1992 2266 2222 1993 2267 2223 266 181 1045 165 180 1043 1994 2268 2224 1995 2269 2225 163 178 1041 266 181 1045 1995 2269 2225 1992 2266 2222 288 184 1048 90 2 28 1988 2262 2218 1996 2270 2226 167 186 1050 164 179 1042 1993 2267 2223 1997 2271 2227 324 333 1144 288 184 1048 1996 2270 2226 1998 2272 2228 315 351 1162 167 186 1050 1997 2271 2227 1999 2273 2229 165 180 1043 324 333 1144 1998 2272 2228 1994 2268 2224 1991 2265 2221 299 8 36 2017 378 1189 2018 2274 2230 690 432 1228 315 351 1162 1999 2273 2229 2001 2275 2231 622 442 1238 437 441 1237 2002 2276 2232 2003 2277 2233 438 443 1239 622 442 1238 2003 2277 2233 2004 2278 2234 623 446 1242 438 443 1239 2004 2278 2234 2005 2279 2235 440 447 1243 623 446 1242 2005 2279 2235 2006 2280 2236 519 618 1366 520 617 1365 2007 2281 2237 2008 2282 2238 521 619 1367 645 622 1370 2009 2283 2239 2010 2284 2240 645 622 1370 519 618 1366 2008 2282 2238 2009 2283 2239 437 441 1237 661 624 1372 2011 2285 2241 2002 2276 2232 520 617 1365 523 625 1373 2012 2286 2242 2007 2281 2237 661 624 1372 1948 772 1467 2013 2287 2243 2011 2285 2241 672 774 1469 440 447 1243 2006 2280 2236 2000 2288 2244 523 625 1373 690 432 1228 2001 2275 2231 2012 2286 2242 1948 772 1467 521 619 1367 2010 2284 2240 2013 2287 2243 1988 2262 2218 1987 2261 2217 2014 2289 2245 1987 2261 2217 1989 2263 2219 2014 2289 2245 1989 2263 2219 1990 2264 2220 2014 2289 2245 1990 2264 2220 1991 2265 2221 2014 2289 2245 1993 2267 2223 1992 2266 2222 2014 2289 2245 1995 2269 2225 1994 2268 2224 2014 2289 2245 1992 2266 2222 1995 2269 2225 2014 2289 2245 1996 2270 2226 1988 2262 2218 2014 2289 2245 1997 2271 2227 1993 2267 2223 2014 2289 2245 1998 2272 2228 1996 2270 2226 2014 2289 2245 1999 2273 2229 1997 2271 2227 2014 2289 2245 1994 2268 2224 1998 2272 2228 2014 2289 2245 1991 2265 2221 2018 2274 2230 2000 2288 2244 2014 2289 2245 2001 2275 2231 1999 2273 2229 2014 2289 2245 2003 2277 2233 2002 2276 2232 2014 2289 2245 2004 2278 2234 2003 2277 2233 2014 2289 2245 2005 2279 2235 2004 2278 2234 2014 2289 2245 2006 2280 2236 2005 2279 2235 2014 2289 2245 2008 2282 2238 2007 2281 2237 2014 2289 2245 2010 2284 2240 2009 2283 2239 2014 2289 2245 2009 2283 2239 2008 2282 2238 2014 2289 2245 2002 2276 2232 2011 2285 2241 2014 2289 2245 2007 2281 2237 2012 2286 2242 2014 2289 2245 2011 2285 2241 2013 2287 2243 2014 2289 2245 2000 2288 2244 2006 2280 2236 2014 2289 2245 2012 2286 2242 2001 2275 2231 2014 2289 2245 2013 2287 2243 2010 2284 2240 2014 2289 2245 2015 2260 2216 320 1020 1709 884 1002 1691 877 995 1684 877 995 1684 867 985 1674 84 373 1184 2015 2260 2216 1497 1735 2037 1503 1741 2043 1903 1756 2058 672 774 1469 2000 2288 2244 2018 2274 2230 2017 378 1189 308 85 74 228 88 77 2020 406 151 2019 402 150 673 775 1470 590 773 1468 2022 377 1188 2021 379 1190 590 773 1468 672 774 1469 2017 378 1189 2022 377 1188 591 776 1471 673 775 1470 2021 379 1190 2023 380 1191 683 780 1472 591 776 1471 2023 380 1191 2024 409 1213 604 411 1215 683 780 1472 2024 409 1213 2025 412 1216 1978 113 906 142 124 914 2026 413 1217 2025 412 1216 142 124 914 229 126 916 2027 423 2211 2026 413 1217 687 782 229 606 781 228 2027 423 153 2028 422 152 607 783 230 687 782 229 2028 422 152 2029 424 154 688 784 231 607 783 230 2029 424 154 2030 425 155 603 778 224 688 784 231 2030 425 155 2031 408 147 682 779 225 603 778 224 2031 408 147 2032 407 146 601 777 222 682 779 225 2032 407 146 2033 403 145 681 405 223 601 777 222 2033 403 145 2019 402 2263 2020 406 151 228 88 77 312 154 107 2016 420 160 312 154 107 41 140 103 2034 414 156 2016 420 160 41 140 103 311 135 100 2035 415 157 2034 414 156 311 135 921 29 77 897 2036 394 1205 2035 415 1218 29 77 897 307 76 896 2037 395 1206 2036 394 1205 307 76 896 227 79 899 2038 398 1209 2037 395 1206 227 79 899 45 81 901 2039 400 1211 2038 398 1209 45 81 901 162 353 1164 2040 428 1224 2039 400 1211 162 353 1164 79 355 1166 2041 430 1226 2040 428 1224 79 355 1166 233 358 1169 2042 433 1229 2041 430 1226 233 358 1169 3 360 1171 2043 435 1231 2042 433 1229 3 360 1171 774 2256 2212 2044 1653 1955 2043 435 1231 774 2256 2212 761 2259 2215 2045 2255 2210 2044 1653 1955 761 2259 2215 748 2258 2214 2046 2254 2209 2045 2255 2210 748 2258 2214 735 2257 2213 2047 2253 2208 2046 2254 2209 735 2257 2213 722 834 1523 2048 2251 2206 2047 2253 2208 722 834 1523 708 833 1522 2049 2252 2207 2048 2251 2206 907 1029 1718 2049 2252 2207 708 833 1522 1973 1589 1891 2049 2252 2207 907 1029 1718 907 1029 1718 1980 836 1525 1331 831 1520 2050 292 123 2051 291 122 2065 133 1002 2064 288 1003 282 294 125 322 296 127 2067 376 1004 2066 134 1005 2051 291 122 282 294 125 2066 134 1005 2065 133 1002 185 244 52 278 242 50 2069 237 1006 2068 245 1007 184 241 49 279 251 56 2071 246 1008 2070 238 1009 278 242 50 184 241 49 2070 238 1009 2069 237 1006 2052 263 64 185 244 52 2068 245 1007 2072 261 1010 186 250 55 2050 292 123 2064 288 1003 2073 247 1011 279 251 56 186 250 55 2073 247 1011 2071 246 1008 187 259 1104 280 257 1103 2075 252 1099 2074 260 1105 2053 256 59 2054 327 235 2077 328 1014 2076 253 1015 280 257 60 2053 256 59 2076 253 1015 2075 252 2276 2055 266 1109 187 259 1104 2074 260 1105 2078 264 1107 2054 327 235 2052 263 64 2072 261 1010 2077 328 1014 188 268 1111 2055 266 1109 2078 264 1107 2079 269 1112 2056 272 1115 188 268 1111 2079 269 1112 2080 270 1113 189 274 1117 2056 272 1115 2080 270 1113 2081 275 1118 2057 287 1128 189 274 1117 2081 275 1118 2082 285 1126 191 283 88 281 281 2271 2084 276 1021 2083 284 1022 190 280 1123 2057 287 1128 2082 285 1126 2085 277 1120 281 281 1124 190 280 1123 2085 277 1120 2084 276 1119 322 296 127 191 283 88 2083 284 1022 2067 376 1004 1946 735 970 656 733 310 2087 571 1024 2086 2250 1025 2058 731 308 2059 730 307 2089 727 1026 2088 572 1027 656 733 310 2058 731 308 2088 572 1027 2087 571 1024 653 689 279 554 681 274 2091 676 1028 2090 686 1029 652 680 273 555 683 276 2093 684 1030 2092 677 1031 554 681 274 652 680 273 2092 677 1031 2091 676 1028 555 683 276 2060 702 288 2094 700 1032 2093 684 1030 2059 730 307 556 690 280 2095 685 1033 2089 727 1026 556 690 280 653 689 279 2090 686 1029 2095 685 1033 1953 766 1001 557 696 284 2097 691 1034 2096 768 1035 654 695 1427 558 698 1426 2099 699 1428 2098 692 1423 557 696 284 654 695 2270 2098 692 1037 2097 691 1034 558 698 1426 2061 705 1432 2100 703 1430 2099 699 1428 2060 702 288 1953 766 1001 2096 768 1035 2094 700 1032 2061 705 1432 559 707 1434 2101 708 1435 2100 703 1430 559 707 1434 2062 711 1438 2102 709 1436 2101 708 1435 2062 711 1438 560 713 1440 2103 714 1441 2102 709 1436 560 713 1440 2063 726 1451 2104 724 1449 2103 714 1441 2063 726 1451 561 720 1447 2105 715 1442 2104 724 1449 655 719 299 562 722 302 2107 723 1044 2106 716 2266 561 720 1447 655 719 1446 2106 716 1443 2105 715 1442 562 722 302 1946 735 970 2086 2250 1025 2107 723 1044 1686 2081 751 1687 2006 621 1807 2005 620 1117 1276 374 1237 1275 373 1151 1277 375 </p>\r\n                </polylist>\r\n            </mesh>\r\n        </geometry>\r\n    </library_geometries>\r\n    <library_visual_scenes>\r\n        <visual_scene id=\"VisualSceneNode\" name=\"untitled\">\r\n            <node id=\"___DummyTransform___1\" name=\"___DummyTransform___1\">\r\n                <rotate sid=\"rotateZ\">0 0 1 0 </rotate>\r\n                <rotate sid=\"rotateY\">0 1 0 0 </rotate>\r\n                <rotate sid=\"rotateX\">1 0 0 0 </rotate>\r\n            </node>\r\n            <node id=\"___DummyTransform___2\" name=\"___DummyTransform___2\">\r\n                <rotate sid=\"rotateZ\">0 0 1 0 </rotate>\r\n                <rotate sid=\"rotateY\">0 1 0 0 </rotate>\r\n                <rotate sid=\"rotateX\">1 0 0 0 </rotate>\r\n            </node>\r\n            <node id=\"LOD3sp\" name=\"LOD3sp\">\r\n                <translate sid=\"rotatePivot\">20.63 815.2 21.21 </translate>\r\n                <rotate sid=\"rotateZ\">0 0 1 0 </rotate>\r\n                <rotate sid=\"rotateY\">0 1 0 0 </rotate>\r\n                <rotate sid=\"rotateX\">1 0 0 90 </rotate>\n\t\t\t\t<scale sid=\"scale\">0.01 0.01 0.01</scale>\r\n                <translate sid=\"rotatePivotInverse\">-20.63 -815.2 -21.21 </translate>\r\n                <translate sid=\"scalePivot\">20.63 815.2 21.21 </translate>\r\n                <translate sid=\"scalePivotInverse\">-20.63 -815.2 -21.21 </translate>\r\n                <instance_geometry url=\"#LOD3spShape-lib\">\r\n                    <bind_material>\r\n                        <technique_common>\r\n                            <instance_material symbol=\"blinn3SG\" target=\"#blinn3\">\r\n                                <bind_vertex_input semantic=\"UVSET0\" input_semantic=\"TEXCOORD\" input_set=\"0\"/>\r\n                            </instance_material>\r\n                        </technique_common>\r\n                    </bind_material>\r\n                </instance_geometry>\r\n            </node>\r\n        </visual_scene>\r\n    </library_visual_scenes>\r\n    <scene>\r\n        <instance_physics_scene url=\"#MayaNativePhysicsScene\"/>\r\n        <instance_visual_scene url=\"#VisualSceneNode\"/>\r\n    </scene>\r\n</COLLADA>\r\n"
  },
  {
    "path": "tests/meshes/mesh.source.COLLADAMeshReader.duck.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>315.16000000000003 849.42999999999995 386.38 106.70999999999999 853.88 374.44 -32.729999999999997 878.5 301.81999999999999 -98.799999999999997 840.16999999999996 132.87 450.5 849.84000000000003 338.50999999999999 -568.84000000000003 -199.36000000000001 410.11000000000001 -368.94999999999999 -202.05000000000001 532.84000000000003 542 -117.38 564.24000000000001 729.20000000000005 -108.39 436.45999999999998 598.25 -201.96000000000001 377.25 -470.57999999999998 -111.40000000000001 624.70000000000005 -709.13999999999999 -104.88 470.88 685.07000000000005 -202.44 246.21000000000001 655.17999999999995 24.09 605.16999999999996 804.42999999999995 35.439999999999998 466.76999999999998 -601.94000000000005 44.280000000000001 657.52999999999997 -817.41999999999996 34.090000000000003 494.77999999999997 838.33000000000004 206.81999999999999 473.85000000000002 722.87 202.13999999999999 609.07000000000005 822.78999999999996 385.67000000000002 465.60000000000002 714.44000000000005 392.17000000000002 587.23000000000002 740.83000000000004 539.61000000000001 447.73000000000002 591.59000000000003 557.38 553.12 429.45999999999998 664.80999999999995 500.98000000000002 610.69000000000005 655.42999999999995 418.43000000000001 41.869999999999997 640.13999999999999 545.32000000000005 -320.74000000000001 641.88 461.18000000000001 41.079999999999998 707.25999999999999 460.76999999999998 -202.78999999999999 696.62 383.98000000000002 -491.45999999999998 698.95000000000005 174.33000000000001 -90.549999999999997 742.05999999999995 284.5 -895.32000000000005 857.37 190.43000000000001 -880.89999999999998 651.84000000000003 434.94 -752.97000000000003 694.40999999999997 423.51999999999998 -1030.6400000000001 640.53999999999996 167.61000000000001 -987.62 529.88999999999999 411.36000000000001 -736.22000000000003 469.93000000000001 603.21000000000004 -1033.4400000000001 416.20999999999998 364.35000000000002 -817.54999999999995 308.16000000000003 608.23000000000002 -944.47000000000003 236.55000000000001 449.26999999999998 -586.10000000000002 599.26999999999998 522.11000000000001 -603.85000000000002 754.30999999999995 187.46000000000001 493.5 737.37 372.26999999999998 303.01999999999998 730.52999999999997 430.54000000000002 52.560000000000002 741.44000000000005 400.54000000000002 -148.36000000000001 737.27999999999997 125 47.530000000000001 -202.28999999999999 562.29999999999995 76.090000000000003 -121.94 655.11000000000001 434.42000000000002 558.19000000000005 608.85000000000002 597.87 401.31 648.13999999999999 603.74000000000001 207.12 670.48000000000002 476.12 35.07 667.82000000000005 86.120000000000005 -68.400000000000006 683.67999999999995 -484.45999999999998 45.200000000000003 697.88999999999999 -658.05999999999995 246 670.39999999999998 -640.96000000000004 424.68000000000001 647.5 -483.10000000000002 544.79999999999995 605.63999999999999 -349.60000000000002 230.21000000000001 770.99000000000001 -20.280000000000001 234.93000000000001 798.45000000000005 -297.12 133.63 770.24000000000001 -352.83999999999997 348.87 759.61000000000001 -31.039999999999999 347.58999999999997 792.78999999999996 174.16 141.84 778.80999999999995 -5.8899999999999997 124.3 780.55999999999995 207.28999999999999 244.80000000000001 784.39999999999998 185.88 386.77999999999997 773.46000000000004 -32.700000000000003 443.06 761.85000000000002 129.74000000000001 475.20999999999998 750.83000000000004 -306.44 417.08999999999997 749.60000000000002 -465.18000000000001 369.68000000000001 726.69000000000005 -459.17000000000002 228.22999999999999 743.47000000000003 -337.18000000000001 108.42 755.91999999999996 -359.77999999999997 449.68000000000001 718.67999999999995 8.7300000000000004 70.519999999999996 765.30999999999995 223.13999999999999 115.48 765.62 313.93000000000001 239.37 762.48000000000002 297.69999999999999 397.75999999999999 746.14999999999998 177.94999999999999 498.51999999999998 726.77999999999997 -22.850000000000001 492.00999999999999 723.98000000000002 -66.390000000000001 783.87 109.41 -19.350000000000001 789.76999999999998 248.41999999999999 99.730000000000004 790.38 347.26999999999998 318.33999999999997 789.92999999999995 367.98000000000002 447.91000000000003 792.94000000000005 324.13 573.12 860.38 248.34999999999999 191.31 848.47000000000003 388.88999999999999 38.789999999999999 864.07000000000005 348.69999999999999 -76.379999999999995 851.88999999999999 207.49000000000001 639.95000000000005 858.13 116.68000000000001 -480.05000000000001 -200.59999999999999 484.01999999999998 -311.75999999999999 -220.75 473.38999999999999 -488.08999999999997 -219.75999999999999 370.64999999999998 -631.33000000000004 -198.59999999999999 310.12 672.90999999999997 -163.68000000000001 411.13 432 -202.02000000000001 475.98000000000002 487.06 -165.78999999999999 524.60000000000002 -419.66000000000003 -163.19 582.66999999999996 -643.65999999999997 -160.53999999999999 444.49000000000001 -601.34000000000003 -105.89 566.46000000000004 -779.97000000000003 -104.5 347.95999999999998 831.99000000000001 -108.73 272.36000000000001 771.72000000000003 -40.43 454.45999999999998 595.13 -52.729999999999997 591.02999999999997 -521.60000000000002 -39.670000000000002 651.59000000000003 -767.25 -37.030000000000001 488.23000000000002 -711.17999999999995 39.439999999999998 603.57000000000005 914.52999999999997 37.509999999999998 287.83999999999997 881.12 -39.659999999999997 281.19999999999999 825.85000000000002 117.53 473.56 695.75 109.91 608.35000000000002 946.88999999999999 211.83000000000001 296.76999999999998 934.36000000000001 121.11 292.44999999999999 734.07000000000005 298.70999999999998 600.45000000000005 840.85000000000002 298.43000000000001 471.51999999999998 924.07000000000005 388.13 299.72000000000003 943.23000000000002 302.52999999999997 299.92000000000002 668.13 480.12 574.14999999999998 789.21000000000004 466.75999999999999 457.41000000000003 852.52999999999997 538.39999999999998 295.04000000000002 891.95000000000005 466.81999999999999 297.19999999999999 675.83000000000004 601.92999999999995 433.35000000000002 748.92999999999995 661.44000000000005 295.51999999999998 808.92999999999995 603.82000000000005 295.93000000000001 -257.01999999999998 671 426.88 42.859999999999999 673.11000000000001 503.37 -439.73000000000002 655.46000000000004 359.75999999999999 -282.76999999999998 697.08000000000004 309.37 -125.73999999999999 739.88999999999999 215.47 -903.13999999999999 742.80999999999995 343.39999999999998 -752.03999999999996 761.63999999999999 355.44999999999999 -810 685.87 434.75 -1018.17 585.73000000000002 309.93000000000001 -942.96000000000004 596.57000000000005 427.44 -941.45000000000005 458.61000000000001 497.13 -834.16999999999996 571.52999999999997 517.52999999999997 -879.53999999999996 266.38999999999999 543.10000000000002 -1007.85 355 395.57999999999998 -1015.6799999999999 463.69999999999999 386.27999999999997 -891.27999999999997 28.739999999999998 362.98000000000002 -324.75999999999999 173.13999999999999 771.70000000000005 -860.94000000000005 103.75 489.23000000000002 -688.04999999999995 145.22 648.73000000000002 -1009.6799999999999 93.709999999999994 175.97999999999999 -359.10000000000002 292.52999999999997 766.70000000000005 -335.49000000000001 563.11000000000001 591.05999999999995 -438.30000000000001 613.99000000000001 497.17000000000002 -616.88 637.26999999999998 383.62 369.97000000000003 691.16999999999996 468.95999999999998 548 699.75999999999999 398.86000000000001 229.55000000000001 656.00999999999999 539.69000000000005 173.62 715.05999999999995 463.58999999999997 628.38 745.00999999999999 272.60000000000002 686.92999999999995 707.41999999999996 288.55000000000001 -697.49000000000001 632.52999999999997 462.5 -999.95000000000005 220.72999999999999 335.56 -1050.8099999999999 422.95999999999998 287.12 -782.99000000000001 393.20999999999998 615.13999999999999 465.11000000000001 767.23000000000002 341.68000000000001 555.57000000000005 824.19000000000005 237.44 171.83000000000001 739.55999999999995 427.39999999999998 79.439999999999998 766.38 363.23000000000002 315.26999999999998 816.54999999999995 366.75 -80.859999999999999 763.53999999999996 111.23 372.47000000000003 -221.25 421.67000000000002 513.67999999999995 -221.34999999999999 336.93000000000001 39.920000000000002 -221.13999999999999 499.98000000000002 223.30000000000001 -202.05000000000001 537.51999999999998 587.01999999999998 -220.88999999999999 225.18000000000001 60.289999999999999 -167.63 613.57000000000005 288.94999999999999 -117 629.20000000000005 97.969999999999999 132.12 780.42999999999995 -14.18 178.63 791.78999999999996 88.969999999999999 241.47 796.70000000000005 192.84 183.31 782.92999999999995 -25.899999999999999 292.44999999999999 797.86000000000001 71.049999999999997 366.75999999999999 789.88 205.22999999999999 316.43000000000001 781.86000000000001 -34.119999999999997 397.32999999999998 782.16999999999996 58.299999999999997 464.81 757.02999999999997 156.28 442.38999999999999 761.69000000000005 47.810000000000002 600.54999999999995 590.27999999999997 -670.83000000000004 542.25 578.75999999999999 -581.72000000000003 497.5 628.10000000000002 -331.64999999999998 391.50999999999999 754.39999999999998 -559.25999999999999 223.34999999999999 698.77999999999997 -408.89999999999998 64.310000000000002 716.17999999999995 -565.41999999999996 396.99000000000001 674.07000000000005 332.25 64.920000000000002 719.35000000000002 470.11000000000001 220.78 715.70000000000005 458.68000000000001 405.42000000000002 695.02999999999997 285.88999999999999 536.28999999999996 668.57000000000005 9.4700000000000006 550.99000000000001 654.02999999999997 -415.48000000000002 158.38999999999999 750.90999999999997 -476.36000000000001 303.12 734.98000000000002 127.44 85.400000000000006 765.45000000000005 280.14999999999998 169.36000000000001 765.20000000000005 318.18000000000001 318.75 755.99000000000001 84.489999999999995 504.10000000000002 724.42999999999995 247.66 461.12 735.33000000000004 -432.67000000000002 421.26999999999998 720.23000000000002 -253.15000000000001 460.5 721.34000000000003 -232.03 418.91000000000003 754.22000000000003 -240.91999999999999 337.47000000000003 778.88999999999999 -237.52000000000001 228.97999999999999 788.21000000000004 -220.19 125.77 775.41999999999996 -234.12 81.420000000000002 760.46000000000004 -269.43000000000001 -115.13 656.11000000000001 -193.58000000000001 -203.19999999999999 562.96000000000004 -525.38999999999999 222.25 719.46000000000004 -533.37 386.20999999999998 698.51999999999998 -378.99000000000001 78.450000000000003 736.13999999999999 -407.87 485.25 686.14999999999998 26.579999999999998 22.329999999999998 745.49000000000001 401.06999999999999 229.65000000000001 738.34000000000003 279.61000000000001 85.090000000000003 743.76999999999998 388.63 403.76999999999998 719 233.56999999999999 521.02999999999997 696.88 -8.1400000000000006 529.44000000000005 687.38999999999999 -668.75 -197.30000000000001 165.50999999999999 -835.19000000000005 -108.16 170.44999999999999 865.49000000000001 -108.11 110.78 709.71000000000004 -198.94999999999999 107.01000000000001 959.73000000000002 36.799999999999997 110.78 1001 212.16 110.78 988.08000000000004 388.44999999999999 115.06999999999999 920.92999999999995 536.70000000000005 115.06999999999999 826.30999999999995 664.24000000000001 113.17 -336.31999999999999 699.63999999999999 162.59 -729.37 878.33000000000004 192.81999999999999 -1050.78 215.34999999999999 173.52000000000001 -1074.03 432.99000000000001 165.52000000000001 -39 743.86000000000001 344.16000000000003 -40.539999999999999 765.35000000000002 256.07999999999998 -74.040000000000006 808.5 116.15000000000001 -17.640000000000001 822.63 259.88999999999999 -50.390000000000001 786.85000000000002 181.50999999999999 106.12 818.57000000000005 349.63 29.780000000000001 790.59000000000003 304.25999999999999 317.5 763.86000000000001 388.24000000000001 194.21000000000001 789.46000000000004 372.27999999999997 442.02999999999997 819.58000000000004 322.81 586.86000000000001 773.15999999999997 249.46000000000001 562.66999999999996 797.76999999999998 237.94 -409.77999999999997 -219.84999999999999 431 -542.27999999999997 -218.90000000000001 284.23000000000002 -543.58000000000004 -161.80000000000001 529.42999999999995 -709.47000000000003 -158.69 330.38999999999999 768.27999999999997 -164.63 260.98000000000002 -656 -35.939999999999998 591.53999999999996 497.05000000000001 616.98000000000002 528.39999999999998 -355.52999999999997 677.09000000000003 337.12 -825.03999999999996 775.12 351.24000000000001 -970.96000000000004 673.76999999999998 328.23000000000002 -892.98000000000002 518.84000000000003 515.20000000000005 -977.46000000000004 399.06 456.50999999999999 -840.26999999999998 -39.259999999999998 357.66000000000003 -766.00999999999999 118.34 598.23000000000002 -936.07000000000005 96.25 361.25 -528.83000000000004 637.67999999999995 379.92000000000002 201.84 681.75999999999999 501.57999999999998 -688.51999999999998 694.61000000000001 371.43000000000001 -1041.8900000000001 340.66000000000003 303.92000000000002 -761.89999999999998 605.92999999999995 504.37 -1041.5699999999999 500.95999999999998 294.44 184.09999999999999 765.42999999999995 391.88 6.25 766.46000000000004 314.92000000000002 192.97 -220.96000000000001 476.29000000000002 254.55000000000001 -166.05000000000001 586.66999999999996 91.810000000000002 183.21000000000001 790.00999999999999 81.400000000000006 304.51999999999998 797.05999999999995 60.520000000000003 420.69999999999999 776.75999999999999 277.92000000000002 606.96000000000004 583.28999999999996 536.60000000000002 489.16000000000003 630.35000000000002 620.22000000000003 303.56 662.47000000000003 556.51999999999998 116.67 672.37 331.26999999999998 -43.969999999999999 663.30999999999995 -585.67999999999995 137.69999999999999 688.54999999999995 -667.44000000000005 339.39999999999998 660.44000000000005 -507.31 136.97999999999999 708.78999999999996 -578.90999999999997 313.45999999999998 686.95000000000005 203.63999999999999 14.880000000000001 720.10000000000002 155.84 558.44000000000005 658.55999999999995 -289.54000000000002 514.82000000000005 644.82000000000005 -234.56 381.37 770.00999999999999 -242.78 284.94 787.22000000000003 -227.11000000000001 174.62 784.20000000000005 -333.45999999999998 -38.509999999999998 686.77999999999997 -227.61000000000001 -166.28999999999999 614.07000000000005 -166.37 -221.08000000000001 500.44 -545 308.36000000000001 708.90999999999997 -478.93000000000001 138.16 728.82000000000005 -490.30000000000001 446.75 690.05999999999995 -253.77000000000001 40.32 741.57000000000005 357.41000000000003 149.77000000000001 742.55999999999995 165.97 42.310000000000002 744.33000000000004 412.91000000000003 317.00999999999999 730.37 326.01999999999998 475.83999999999997 706.96000000000004 119.36 537.26999999999998 690.25999999999999 -278.00999999999999 497.06 685.94000000000005 -576.86000000000001 -219.00999999999999 157.25 -752.97000000000003 -158.52000000000001 169.30000000000001 795.55999999999995 -162.08000000000001 110.63 920.91999999999996 -40.399999999999999 110.78 983.57000000000005 120.66 110.78 1002.22 302.81 115.06999999999999 959.89999999999998 466.86000000000001 115.08 878.01999999999998 606.05999999999995 115.04000000000001 -416.19 693.29999999999995 170.08000000000001 -812.00999999999999 888.25 193.40000000000001 -968.61000000000001 782.24000000000001 182.83000000000001 -909.23000000000002 -45.390000000000001 175.40000000000001 -551.05999999999995 718.17999999999995 180.19 -657.67999999999995 833.08000000000004 191.37 -1074.4200000000001 339.48000000000002 167.62 -1059.72 528.84000000000003 166.59 612.60000000000002 -219.25 101.95999999999999 -67.650000000000006 764.26999999999998 187.68000000000001 -53.75 813.98000000000002 187.63999999999999 36.990000000000002 820.88 312.22000000000003 196.30000000000001 816.47000000000003 370.08999999999997 683.13999999999999 892.59000000000003 110.67 -138.53 577.97000000000003 591.58000000000004 -136.13 526.60000000000002 651.45000000000005 -139.37 509.08999999999997 686.98000000000002 -90.370000000000005 -221.33000000000001 508 -94.75 -203.13 570.98000000000002 -96.760000000000005 -168.41 623.62 -102.15000000000001 -121.69 663.79999999999995 -116.34999999999999 -66.909999999999997 690.15999999999997 -115.73 24.559999999999999 744.63999999999999 -115.26000000000001 70.510000000000005 763.39999999999998 -116.34 122.05 778.78999999999996 -121.95999999999999 175.27000000000001 790.02999999999997 -128.69999999999999 229.69999999999999 797.12 -133.5 284.73000000000002 796.59000000000003 -135.12 336.88999999999999 790.05999999999995 -134.24000000000001 383.32999999999998 778.96000000000004 -133.37 426.31 759.13 -136.68000000000001 473.30000000000001 723.37 -131.09 626.23000000000002 528.03999999999996 -108.01000000000001 667.71000000000004 483.14999999999998 -85.480000000000004 701.60000000000002 434.81 632.86000000000001 825.25999999999999 101.26000000000001 640.58000000000004 801.39999999999998 99.689999999999998 673.05999999999995 779.54999999999995 105.09 719 751.42999999999995 110.14 773.61000000000001 711.32000000000005 111.73 285.17000000000002 853.85000000000002 -339.19999999999999 90.290000000000006 849.83000000000004 -306.13999999999999 -40.200000000000003 851.85000000000002 -212.02000000000001 -124.93000000000001 862.69000000000005 -61.810000000000002 400.68000000000001 860.00999999999999 -316.02999999999997 -576.75 -201.38 -373.52999999999997 -375.56 -202.25 -492.97000000000003 -667.63 -198.11000000000001 -170.78 532.20000000000005 -115.73999999999999 -519.29999999999995 725.10000000000002 -108.39 -396.44 591.87 -201.53 -336.68000000000001 -463.50999999999999 -108.26000000000001 -578.59000000000003 -713.24000000000001 -104.88 -430.87 -830.32000000000005 -111.68000000000001 -191.25999999999999 680.28999999999996 -202.16 -205.88999999999999 642.78999999999996 27.68 -556.57000000000005 799.42999999999995 35.43 -425.94 -604.98000000000002 46.729999999999997 -612.83000000000004 -822.97000000000003 33.310000000000002 -455.20999999999998 833.87 207 -432.56 714.38999999999999 204.77000000000001 -557.28999999999996 826.12 386.94 -428.31999999999999 705 388.63999999999999 -543.53999999999996 750.61000000000001 539.83000000000004 -415.98000000000002 595.42999999999995 544.33000000000004 -524.60000000000002 435.64999999999998 650.86000000000001 -465.87 622.76999999999998 658.59000000000003 -389.31999999999999 52.390000000000001 630.96000000000004 -502.24000000000001 -321.99000000000001 640.29999999999995 -420.32999999999998 50.469999999999999 706.63 -407.87 -184.75 701.39999999999998 -326.41000000000003 -491.52999999999997 676.67999999999995 -194.93000000000001 -326.25999999999999 699.75 -167.16 -98.609999999999999 737.96000000000004 -254.78 -910.02999999999997 820.5 -226.61000000000001 -746.65999999999997 835.42999999999995 -229.84999999999999 -887.28999999999996 652.58000000000004 -395.97000000000003 -757.25 694.15999999999997 -382.92000000000002 -1040.71 622.87 -178.44999999999999 -992.90999999999997 530.66999999999996 -373.35000000000002 -743.41999999999996 459.11000000000001 -569.38 -1036.53 413.57999999999998 -326.94 -956.54999999999995 20.280000000000001 -201.80000000000001 -820.90999999999997 307.39999999999998 -567.79999999999995 -952.54999999999995 233.49000000000001 -408.82999999999998 -1052.03 212.91999999999999 -191.05000000000001 53.009999999999998 588.53999999999996 -550.35000000000002 -604.02999999999997 579.64999999999998 -488.20999999999998 -622.38 723.15999999999997 -219.68000000000001 499.62 738.82000000000005 -345.20999999999998 304.57999999999998 730.50999999999999 -390.81 66.359999999999999 737.86000000000001 -359.05000000000001 -147.38999999999999 738.83000000000004 -96.310000000000002 -1074.5999999999999 428.97000000000003 -169.19 42.140000000000001 -202.63 -522.54999999999995 71.030000000000001 -120.89 -614.12 -333.70999999999998 228.43000000000001 -722.58000000000004 -16.27 236.05000000000001 -752.75999999999999 -283 138.36000000000001 -725.30999999999995 -349 343.86000000000001 -711.80999999999995 -29.670000000000002 345.13999999999999 -738.49000000000001 169.81 143.71000000000001 -745.55999999999995 -3.5899999999999999 125.91 -741.86000000000001 201.44999999999999 245.99000000000001 -751.70000000000005 186.22 378.79000000000002 -731.74000000000001 -35.729999999999997 439.50999999999999 -701.44000000000005 130.56999999999999 460.56 -700.42999999999995 -308.23000000000002 416.27999999999997 -697.25999999999999 -457.22000000000003 360.35000000000002 -684.44000000000005 -431.62 224.71000000000001 -701.78999999999996 -320.56999999999999 116.38 -713.41999999999996 -358.47000000000003 444.67000000000002 -673.66999999999996 8.5600000000000005 71.620000000000005 -727.28999999999996 217.18000000000001 118.58 -731.32000000000005 299.98000000000002 243.97 -731.74000000000001 284.49000000000001 393.70999999999998 -711.10000000000002 174.16999999999999 487.13999999999999 -681.79999999999995 -26.510000000000002 484.31 -674.16999999999996 -72.099999999999994 785.14999999999998 -58.219999999999999 -23.129999999999999 789.22000000000003 -199.55000000000001 99.349999999999994 790.72000000000003 -299.56 311.69 790.83000000000004 -325.68000000000001 438.86000000000001 791.86000000000001 -290.14999999999998 528.94000000000005 866.74000000000001 -247.78999999999999 180.63 851.82000000000005 -332.87 17.600000000000001 849.90999999999997 -264.81 -86.329999999999998 855.26999999999998 -147.38999999999999 -113.41 838.60000000000002 34.390000000000001 610.61000000000001 854.78999999999996 -70.959999999999994 -485.5 -201.94 -446.25 -319.75 -221.38999999999999 -434.24000000000001 -496 -222.25999999999999 -336 -635.66999999999996 -199.28999999999999 -275.19 -574.87 -219.18000000000001 -158.15000000000001 665.52999999999997 -163.27000000000001 -369.79000000000002 422.51999999999998 -200.94999999999999 -433.57999999999998 476.32999999999998 -164.47999999999999 -479.07999999999998 -420.48000000000002 -162.56999999999999 -541.05999999999995 -649.34000000000003 -161.16 -405.79000000000002 -604.84000000000003 -105.69 -525.42999999999995 -752.32000000000005 -161.36000000000001 -181.05000000000001 -786.55999999999995 -108.11 -310.35000000000002 827.88999999999999 -108.73 -232.34999999999999 767.62 -40.43 -414.44999999999999 582.44000000000005 -49.890000000000001 -545.49000000000001 -519.76999999999998 -36.640000000000001 -605.13 -771.36000000000001 -37.030000000000001 -448.22000000000003 -715.21000000000004 39.600000000000001 -559.67999999999995 910.42999999999995 37.509999999999998 -247.81999999999999 877.01999999999998 -39.659999999999997 -241.19 821.49000000000001 117.59 -433.13999999999999 685.99000000000001 113.33 -558.20000000000005 942.78999999999996 211.83000000000001 -256.75999999999999 930.25999999999999 121.11 -252.43000000000001 722.28999999999996 298.64999999999998 -550.84000000000003 838.71000000000004 298.81 -431.94999999999999 931.05999999999995 390.31999999999999 -263.44999999999999 944.37 303.33999999999997 -261.04000000000002 662.77999999999997 472.56 -536.23000000000002 797.42999999999995 468.16000000000003 -425.07999999999998 861.74000000000001 541.02999999999997 -260.99000000000001 903.08000000000004 470.13 -263.41000000000003 692.35000000000002 602.09000000000003 -403.56 744.63 661.64999999999998 -258.30000000000001 806.82000000000005 604.13999999999999 -258.62 -249.69 670.63 -377.99000000000001 50.369999999999997 670.53999999999996 -453.77999999999997 -436.06 655.28999999999996 -317.56 -408.87 684.75 -184.72 -269.41000000000003 700.63 -256.20999999999998 -130.71000000000001 739.75999999999999 -176.38 -910.38999999999999 740.53999999999996 -313.94 -826.52999999999997 848.88 -231.86000000000001 -756.65999999999997 757.95000000000005 -319.57999999999998 -813.78999999999996 685.49000000000001 -394.61000000000001 -1024.6300000000001 583.32000000000005 -278.17000000000002 -989.52999999999997 748.42999999999995 -211.81 -950.04999999999995 597.54999999999995 -388.92000000000002 -945.50999999999999 458.30000000000001 -457.22000000000003 -838.42999999999995 571.5 -477.56 -888 264.14999999999998 -499.14999999999998 -1018.45 352.87 -360.55000000000001 -1019.51 462.89999999999998 -349.20999999999998 -898.44000000000005 -48.490000000000002 -198.30000000000001 -901.07000000000005 24.32 -327.42000000000002 -308.31 175.41 -725.01999999999998 -873.07000000000005 106.19 -448.47000000000003 -693.38 147.41 -605.90999999999997 -1008.65 95.150000000000006 -200.59 -348.92000000000002 287.5 -717.76999999999998 -562.76999999999998 686.61000000000001 -206.28 -448.20999999999998 605.38 -460.12 -619.25999999999999 640.58000000000004 -344.81999999999999 371.72000000000003 691.05999999999995 -429.02999999999997 554.85000000000002 702.26999999999998 -372.18000000000001 243.44 638.29999999999995 -496.02999999999997 182.91999999999999 713.55999999999995 -411.82999999999998 624.25 745.98000000000002 -242.06 684.25 708.22000000000003 -255.86000000000001 -702.02999999999997 632.67999999999995 -422.27999999999997 -678.16999999999996 785.30999999999995 -227.63 -1008.71 217.74000000000001 -304.50999999999999 -1074.8900000000001 335.12 -176.86000000000001 -1056.6400000000001 420.55000000000001 -261.85000000000002 -787.33000000000004 390.41000000000003 -577.58000000000004 -1062 521.90999999999997 -170.44 464.50999999999999 766.64999999999998 -315.17000000000002 530.01999999999998 821.47000000000003 -206.75999999999999 183.37 737.25999999999999 -378.81 84.510000000000005 766.02999999999997 -320.20999999999998 301.87 818.79999999999995 -320.38999999999999 -87.379999999999995 763.37 -70.439999999999998 366.06 -220.63 -382.22000000000003 508.97000000000003 -220.94 -297.39999999999998 34.140000000000001 -222.16999999999999 -462.47000000000003 216.97 -202.05000000000001 -497.41000000000003 585.09000000000003 -221.06999999999999 -185.16 53.700000000000003 -167.97 -574.41999999999996 285.12 -116.11 -587.19000000000005 97.049999999999997 133.06999999999999 -745.73000000000002 -10.720000000000001 180.49000000000001 -750.25 90.799999999999997 241.61000000000001 -756.02999999999997 187.68000000000001 185.36000000000001 -750.59000000000003 -22.539999999999999 291.77999999999997 -748.63999999999999 74.400000000000006 359 -740.36000000000001 202.97999999999999 314.17000000000002 -746.51999999999998 -35.490000000000002 394.10000000000002 -722.95000000000005 58.200000000000003 452.64999999999998 -702.09000000000003 156.75 429.23000000000002 -713.96000000000004 438.10000000000002 540.41999999999996 -568.74000000000001 286.75 588.60000000000002 -543.88999999999999 -685.84000000000003 517.88 -545.42999999999995 591.88999999999999 392.69999999999999 -600.15999999999997 534 475.44999999999999 -586.33000000000004 598.17999999999995 209.69999999999999 -620.50999999999999 612.57000000000005 302.13 -610.91999999999996 470.13999999999999 37.990000000000002 -623.53999999999996 551.77999999999997 120.37 -624.86000000000001 78.900000000000006 -67.530000000000001 -645.61000000000001 325.00999999999999 -42.490000000000002 -622.46000000000004 -492.57999999999998 53.270000000000003 -642.04999999999995 -664.26999999999998 246.44 -627.01999999999998 -594.03999999999996 143.61000000000001 -638.82000000000005 -647.03999999999996 406.47000000000003 -611.46000000000004 -671.00999999999999 329.81 -622.38 -495.18000000000001 532.83000000000004 -566.65999999999997 -332.97000000000003 388.70999999999998 -705.34000000000003 -556.42999999999995 220.18000000000001 -657.87 -396.19999999999999 76.840000000000003 -676.07000000000005 -575.92999999999995 384.98000000000002 -632.33000000000004 38.109999999999999 -10.300000000000001 -683.85000000000002 323.75 70.379999999999995 -679.40999999999997 450.79000000000002 226.97999999999999 -677.20000000000005 439.86000000000001 400.88 -658.15999999999997 282.66000000000003 525.16999999999996 -627.64999999999998 8.1999999999999993 542.98000000000002 -607.61000000000001 -384.86000000000001 163.81 -708.19000000000005 -457.68000000000001 293.42000000000002 -693.5 125.51000000000001 85.719999999999999 -729.99000000000001 271.55000000000001 173.75999999999999 -733.13 304.69 320.5 -724.52999999999997 82.400000000000006 495.38999999999999 -676.13999999999999 239.27000000000001 452.08999999999997 -694.88 -426.86000000000001 413.69 -677.15999999999997 -254.84 457.92000000000002 -673.42999999999995 -233.52000000000001 420.04000000000002 -698.67999999999995 -238.22 336.47000000000003 -725.28999999999996 -227.63999999999999 230.13999999999999 -736.50999999999999 -210.66999999999999 129.91999999999999 -731.48000000000002 -226.75 87.540000000000006 -718.80999999999995 -340.44 -33.369999999999997 -638.46000000000004 -279.45999999999998 -111.28 -610.96000000000004 -201.16 -202.59999999999999 -521.92999999999995 -510.83999999999997 219.56 -678.77999999999997 -542.84000000000003 378.29000000000002 -655.65999999999997 -360.69999999999999 93.519999999999996 -694.86000000000001 -411.11000000000001 479.92000000000002 -642.24000000000001 23.010000000000002 18.559999999999999 -707.33000000000004 379.67000000000002 236.62 -704.99000000000001 271.86000000000001 90.540000000000006 -706.86000000000001 367.66000000000003 401.13 -685.35000000000002 227.59999999999999 511.56999999999999 -655.48000000000002 -10.43 523.98000000000002 -641.82000000000005 -680.35000000000002 -197.28 -69 -850.20000000000005 -110.59999999999999 -78.989999999999995 866.90999999999997 -109.72 -72.090000000000003 711 -200.72 -65.519999999999996 958.14999999999998 36.700000000000003 -73.829999999999998 997.50999999999999 212.13999999999999 -84.400000000000006 986.42999999999995 390.29000000000002 -96.290000000000006 916.86000000000001 539.36000000000001 -103.15000000000001 809.41999999999996 663.91999999999996 -100.23999999999999 -497.93000000000001 711.40999999999997 -81.209999999999994 -350.92000000000002 700.79999999999995 -71.579999999999998 -904.64999999999998 873.03999999999996 -133.28 -739.75 884.97000000000003 -130.80000000000001 -1041.1800000000001 652.54999999999995 -79.329999999999998 -980.52999999999997 22.079999999999998 -81.439999999999998 -597.04999999999995 786.03999999999996 -97.870000000000005 -1064.6900000000001 216.81999999999999 -76.069999999999993 -1086.23 435.31999999999999 -69.640000000000001 -149.88 737.92999999999995 -12.779999999999999 -28.75 737.25999999999999 -317.25999999999999 -44.240000000000002 765.74000000000001 -213.62 -82.609999999999999 812.75 -53.549999999999997 -71.489999999999995 781.87 20.940000000000001 -23.420000000000002 816.41999999999996 -198 -56.549999999999997 787.76999999999998 -133.00999999999999 101.37 817 -295.51999999999998 27.899999999999999 789.97000000000003 -255.88999999999999 315.27999999999997 764.17999999999995 -350.56 195.66999999999999 791.12 -324.42000000000002 420.49000000000001 820.46000000000004 -287.41000000000003 577.41999999999996 772.20000000000005 -219.56 546.71000000000004 795.10000000000002 -204.05000000000001 -415.86000000000001 -221.71000000000001 -395.02999999999997 -548.47000000000003 -220.59999999999999 -252.13999999999999 -548.29999999999995 -162.25 -490.49000000000001 -716.04999999999995 -161.53999999999999 -294.85000000000002 763.51999999999998 -164.47 -220.94999999999999 -658.57000000000005 -35.840000000000003 -547.83000000000004 506.29000000000002 600.75999999999999 -500.04000000000002 -353.64999999999998 677.13999999999999 -293.13 -830.12 771.51999999999998 -319.82999999999998 -981.60000000000002 670.37 -296.63 -899.83000000000004 520.96000000000004 -475.36000000000001 -984.02999999999997 396.88999999999999 -418.44 -847.78999999999996 -43.640000000000001 -321.06 -775.55999999999995 121.76000000000001 -553.52999999999997 -948.85000000000002 98.219999999999999 -325.60000000000002 -525.5 640.38 -337.93000000000001 208.68000000000001 678.67999999999995 -453.31999999999999 -691.88999999999999 696.76999999999998 -331.25 -1049.1700000000001 336.23000000000002 -277.19 -765.99000000000001 605.29999999999995 -464.23000000000002 -1045.3099999999999 499.16000000000003 -266.18000000000001 191.41 765.11000000000001 -345.31999999999999 6.5999999999999996 766.02999999999997 -273.94999999999999 186.52000000000001 -222.13999999999999 -441.38 248.47 -165.94999999999999 -546.13999999999999 91.609999999999999 184.16 -754.76999999999998 85.400000000000006 301.49000000000001 -752.41999999999996 61.759999999999998 409.54000000000002 -722.84000000000003 -592.53999999999996 480.25 -592.51999999999998 -345.18000000000001 558.64999999999998 -548.22000000000003 -492.62 143.44 -668.66999999999996 -582.39999999999998 302.43000000000001 -646.04999999999995 199.21000000000001 14.82 -679.63 156.44999999999999 547.71000000000004 -615.16999999999996 -294.19 513.14999999999998 -603.84000000000003 -234.86000000000001 381.67000000000002 -714.59000000000003 -236 284.67000000000002 -732.70000000000005 -216.27000000000001 177.61000000000001 -735.97000000000003 -237.81 -164.50999999999999 -570.75999999999999 -169.69999999999999 -221.81 -462.63 -541.84000000000003 298.68000000000001 -667.66999999999996 -449.80000000000001 149.53 -688 -500.64999999999998 441.95999999999998 -646.27999999999997 -248.96000000000001 49.829999999999998 -700.5 342.26999999999998 157.86000000000001 -707.39999999999998 163.12 41.109999999999999 -706.72000000000003 390.56999999999999 320.35000000000002 -698.03999999999996 312.94 469.04000000000002 -669.60000000000002 118.45999999999999 531.11000000000001 -645.61000000000001 -281.06999999999999 494.97000000000003 -641.30999999999995 -586.00999999999999 -219.06 -63.439999999999998 -768.00999999999999 -160.59 -74.969999999999999 797.46000000000004 -164.31 -70.670000000000002 920.94000000000005 -41.049999999999997 -72.400000000000006 980.71000000000004 120.83 -78.120000000000005 1000.0700000000001 303.70999999999998 -91.060000000000002 958.36000000000001 469.44999999999999 -100.05 868.07000000000005 607.20000000000005 -109.53 -430.47000000000003 695.74000000000001 -80.260000000000005 -823.27999999999997 897.89999999999998 -135.47 -978.23000000000002 798.40999999999997 -120.70999999999999 -919.04999999999995 -47.640000000000001 -80.209999999999994 -1025.1700000000001 105.72 -79.489999999999995 -550.11000000000001 737.48000000000002 -83.230000000000004 -660.52999999999997 848.27999999999997 -124.87 -1087.97 340.19999999999999 -72.129999999999995 -1069.7 536.47000000000003 -70.319999999999993 -80.120000000000005 763.75999999999999 11.41 612.82000000000005 -220.06999999999999 -58.25 -75.780000000000001 764.27999999999997 -146.46000000000001 -83.569999999999993 805.38 27.16 -61.170000000000002 815.83000000000004 -131.38 30.09 816.39999999999998 -253.37 193.21000000000001 818.52999999999997 -319.44999999999999 -313.72000000000003 1299.8299999999999 188.27000000000001 -309.58999999999997 1298.6199999999999 201.91999999999999 -305.25999999999999 1294.23 215.30000000000001 -301.06 1286.8599999999999 227.40000000000001 -297.16000000000003 1276.8499999999999 237.63 -293.75 1264.6800000000001 245.53 -290.98000000000002 1250.9300000000001 250.71000000000001 -289.00999999999999 1236.24 252.94999999999999 -287.87 1221.3099999999999 252.12 -287.63999999999999 1206.8499999999999 248.28 -288.35000000000002 1193.52 241.56 -290.17000000000002 1181.6800000000001 231.50999999999999 -301.82999999999998 1166.74 188.72999999999999 -306.94999999999999 1369.46 184.63999999999999 -298.72000000000003 1367.0799999999999 212.03 -290.19 1358.3699999999999 238.69 -281.92000000000002 1343.74 262.81 -274.29000000000002 1323.8399999999999 283.25999999999999 -267.62 1299.5999999999999 299 -262.26999999999998 1272.2 309.37 -258.26999999999998 1242.9400000000001 313.52999999999997 -256.13 1213.26 311.81999999999999 -255.78 1184.54 304.11000000000001 -257.25999999999999 1158.0999999999999 290.62 -261.06 1134.6500000000001 270.56 -268.85000000000002 1114.4000000000001 239.36000000000001 -283.42000000000002 1101.54 186.34999999999999 -291.49000000000001 1437.6300000000001 178.53 -279.25999999999999 1434.1099999999999 219.24000000000001 -266.61000000000001 1421.21 258.75 -254.36000000000001 1399.52 294.49000000000001 -243.06999999999999 1370.05 324.80000000000001 -233.28 1334.1800000000001 348.25999999999999 -225.43000000000001 1293.5799999999999 363.75999999999999 -219.90000000000001 1250.1600000000001 370.58999999999997 -216.86000000000001 1205.99 368.18000000000001 -216.52000000000001 1163.1900000000001 356.86000000000001 -218.75 1124.02 336.67000000000002 -224.25 1089.8299999999999 305.67000000000002 -257.35000000000002 1038.2 181.97 -267.87 1503.46 170.09 -251.81 1498.8499999999999 223.52000000000001 -235.24000000000001 1481.95 275.30000000000001 -219.19 1453.52 322.14999999999998 -204.38999999999999 1414.9000000000001 361.87 -191.55000000000001 1367.8900000000001 392.61000000000001 -181.27000000000001 1314.6900000000001 412.93000000000001 -174.02000000000001 1257.78 421.88999999999999 -170.13999999999999 1199.8299999999999 419.05000000000001 -169.78 1143.6500000000001 404.30000000000001 -172.81 1092.53 377.26999999999998 -180.40000000000001 1047.79 336.57999999999998 -223.43000000000001 979.37 175.63 -236.44 1566 159.44999999999999 -216.78999999999999 1560.3599999999999 224.83000000000001 -196.53999999999999 1539.7 288.12 -176.91 1504.95 345.38999999999999 -158.81999999999999 1457.74 393.94 -143.13 1400.28 431.51999999999998 -130.56 1335.24 456.36000000000001 -121.7 1265.6800000000001 467.30000000000001 -116.95999999999999 1194.8499999999999 463.83999999999997 -116.56999999999999 1126.0599999999999 446.12 -120.48999999999999 1063.3499999999999 413.45999999999998 -130.18000000000001 1010.3 360.99000000000001 -182.88 927.19000000000005 166.74000000000001 -197.65000000000001 1624.3199999999999 146.75999999999999 -174.69999999999999 1617.75 223.13 -151.06 1593.6300000000001 297.01999999999998 -128.15000000000001 1553.0599999999999 363.86000000000001 -107.03 1497.95 420.54000000000002 -88.709999999999994 1430.8699999999999 464.41000000000003 -74.040000000000006 1354.96 493.39999999999998 -63.689999999999998 1273.76 506.18000000000001 -58.170000000000002 1191.0699999999999 502.13 -57.710000000000001 1110.77 481.44999999999999 -62.450000000000003 1037.55 443.29000000000002 -74.129999999999995 976.58000000000004 380.29000000000002 -139.53 878.35000000000002 151.00999999999999 -152.06999999999999 1677.5799999999999 132.21000000000001 -126.16 1670.1600000000001 218.46000000000001 -99.469999999999999 1642.9400000000001 301.86000000000001 -73.609999999999999 1597.1500000000001 377.31 -49.780000000000001 1534.9400000000001 441.29000000000002 -29.100000000000001 1459.23 490.80000000000001 -12.529999999999999 1373.54 523.52999999999997 -0.85999999999999999 1281.8800000000001 537.95000000000005 5.3799999999999999 1188.55 533.38 5.9000000000000004 1097.9000000000001 510.04000000000002 0.58999999999999997 1014.53 468.32999999999998 -12.27 945.00999999999999 397.16000000000003 -100.37 1725.01 116 -71.870000000000005 1716.8499999999999 210.87 -42.520000000000003 1686.9200000000001 302.56999999999999 -14.09 1636.5799999999999 385.52999999999997 12.109999999999999 1568.1800000000001 455.87 34.850000000000001 1484.9300000000001 510.31 53.07 1390.71 546.29999999999995 65.900000000000006 1289.9400000000001 562.14999999999998 72.760000000000005 1187.3199999999999 557.13 73.319999999999993 1087.6600000000001 531.47000000000003 67.480000000000004 996.04999999999995 485.74000000000001 54.859999999999999 921.46000000000004 418.99000000000001 -43.299999999999997 1765.9100000000001 98.390000000000001 -12.619999999999999 1757.1300000000001 200.49000000000001 18.949999999999999 1724.9300000000001 299.14999999999998 49.539999999999999 1670.76 388.39999999999998 77.730000000000004 1597.1700000000001 464.08999999999997 102.2 1507.5999999999999 522.65999999999997 121.79000000000001 1406.23 561.38 135.61000000000001 1297.8099999999999 578.42999999999995 142.99000000000001 1187.4000000000001 573.02999999999997 143.59 1080.1700000000001 545.41999999999996 137.16999999999999 982.05999999999995 495.83999999999997 123.67 903.52999999999997 429.85000000000002 18.309999999999999 1799.6800000000001 79.609999999999999 50.719999999999999 1790.4100000000001 187.46000000000001 84.049999999999997 1756.4100000000001 291.63999999999999 116.36 1699.21 385.88999999999999 146.13 1621.5 465.81 171.96000000000001 1526.9200000000001 527.65999999999997 192.65000000000001 1419.8800000000001 568.53999999999996 207.24000000000001 1305.3900000000001 586.55999999999995 215.03 1188.8 580.85000000000002 215.66999999999999 1075.5599999999999 551.69000000000005 209.06 971.25999999999999 500.13 196.19999999999999 889.19000000000005 432.52999999999997 83.560000000000002 1825.8399999999999 59.950000000000003 117.22 1816.21 171.96000000000001 151.84 1780.9000000000001 280.14999999999998 185.38999999999999 1721.5 378.01999999999998 216.30000000000001 1640.8099999999999 461.01999999999998 243.12 1542.5899999999999 525.24000000000001 264.61000000000001 1431.4400000000001 567.70000000000005 279.75 1312.55 586.39999999999998 288.38999999999999 1191.27 580.65999999999997 289.75999999999999 1073.55 550.63 282.30000000000001 965.17999999999995 497.23000000000002 273.92000000000002 876.22000000000003 424.91000000000003 220.87 1839.0599999999999 144.40000000000001 256.38999999999999 1802.8199999999999 255.41 290.81999999999999 1741.8800000000001 355.85000000000002 322.54000000000002 1659.0699999999999 441.00999999999999 350.06999999999999 1558.28 506.92000000000002 372.12 1444.22 550.49000000000001 387.38999999999999 1322.2 568.73000000000002 396.82999999999998 1197.3299999999999 561.60000000000002 400.75 1076.8800000000001 534.35000000000002 390 965.75999999999999 477.06 375.31999999999999 869.05999999999995 402.75 186.31999999999999 1848.9400000000001 29.41 291.44999999999999 1855.3599999999999 -1.4299999999999999 325.88999999999999 1845.53 113.17 361.27999999999997 1809.4200000000001 223.78 395.57999999999998 1748.7 323.85000000000002 457.29000000000002 1669.1600000000001 396.91000000000003 476.16000000000003 1579.4400000000001 455.94999999999999 500.62 1480.04 489.02999999999997 491.91000000000003 1331.26 532 510.81999999999999 1212.27 533.03999999999996 516.05999999999995 1088.5 508.48000000000002 499.49000000000001 976.65999999999997 446.43000000000001 479.73000000000002 879.64999999999998 370.25999999999999 361.43000000000001 1848.4200000000001 -21.690000000000001 395.11000000000001 1838.8 90.409999999999997 429.73000000000002 1803.48 198.59999999999999 487.44999999999999 1736.71 305.69 560.21000000000004 1388.99 481.97000000000003 617.55999999999995 1264.8399999999999 480.51999999999998 621.76999999999998 1112.3499999999999 464.93000000000001 604.85000000000002 997.27999999999997 406.83999999999997 577.05999999999995 904.75999999999999 322.69 430.04000000000002 1833.1400000000001 -41.369999999999997 462.48000000000002 1823.8800000000001 66.609999999999999 522.76999999999998 1776.52 205.36000000000001 496.29000000000002 1809.76 -60.159999999999997 527.01999999999998 1800.99 42.119999999999997 575.40999999999997 1769.6300000000001 155.18000000000001 703.34000000000003 1256.45 413.52999999999997 704.77999999999997 1128.25 404.57999999999998 691.16999999999996 1022.49 353.06 662.39999999999998 939.79999999999995 269.48000000000002 559.21000000000004 1778.6199999999999 -77.790000000000006 587.76999999999998 1770.46 17.289999999999999 627.63 1746.1400000000001 109 750.46000000000004 1256.5599999999999 354.85000000000002 756.62 1144.3 340.94999999999999 751.49000000000001 1045.4400000000001 302.38999999999999 720.05999999999995 967.49000000000001 226.53999999999999 617.88 1740.1600000000001 -94.019999999999996 643.87 1732.75 -7.5199999999999996 681.60000000000002 1707.1600000000001 72.530000000000001 782.84000000000003 1260.27 294.99000000000001 797.80999999999995 1158.05 282.19999999999999 792.87 1074.02 245.08000000000001 767.28999999999996 1002.35 181.72 671.44000000000005 1694.95 -108.59999999999999 694.47000000000003 1688.3900000000001 -31.940000000000001 730 1659.22 43.57 827.28999999999996 1175.46 208.56999999999999 822.11000000000001 1115.6199999999999 168.65000000000001 806.08000000000004 1028.8699999999999 -8.9399999999999995 734.52999999999997 1617.23 -125.19 754.96000000000004 1608.3599999999999 -48.549999999999997 772.58000000000004 1594.6700000000001 7.3200000000000003 802.09000000000003 1535.28 18.91 826.44000000000005 1470.46 27.25 840.25999999999999 1395.46 84.030000000000001 838.47000000000003 1316.96 164.03 786.79999999999995 1534.3499999999999 -138.50999999999999 812.22000000000003 1515.1900000000001 -59.57 -310.63999999999999 1230.4100000000001 189.53 697.41999999999996 1427.46 337.91000000000003 635.66999999999996 1596.5 333.92000000000002 746.62 1394.01 298.80000000000001 795.22000000000003 1516.6199999999999 149.83000000000001 698.91999999999996 1645.1300000000001 199.19999999999999 690.07000000000005 1440.1400000000001 306.68000000000001 724.66999999999996 1415.03 273.86000000000001 635.94000000000005 1555.9400000000001 298.31 654.27999999999997 1492.4200000000001 320.07999999999998 750.63999999999999 1414.8800000000001 235.50999999999999 650.69000000000005 1594.48 249.30000000000001 769.30999999999995 1447.05 201.02000000000001 688.15999999999997 1593.74 206.19 767.96000000000004 1502.1600000000001 178.25 734.82000000000005 1558.6600000000001 179.47 700.38999999999999 1443.71 310.94 734.82000000000005 1417.73 280.14999999999998 646.64999999999998 1564.3399999999999 305.73000000000002 761.25999999999999 1417.05 239.46000000000001 780.63999999999999 1449.5899999999999 201.27000000000001 697.09000000000003 1602.76 208.58000000000001 779.13999999999999 1508.77 175.81999999999999 744.24000000000001 1567.5599999999999 178.97 791.02999999999997 1372.8399999999999 242.83000000000001 820.95000000000005 1437.4200000000001 161.61000000000001 798.88999999999999 1528.03 123.53 615.94000000000005 1507.3599999999999 401.24000000000001 683.79999999999995 1412.8 378.02999999999997 751.75 1616.76 130.66 688.25999999999999 1688.1900000000001 181.24000000000001 632.28999999999996 1695.97 270.61000000000001 598.21000000000004 1630.8900000000001 363.80000000000001 752.07000000000005 1372.96 321.63999999999999 675.89999999999998 1515.04 299.76999999999998 653.64999999999998 1559.9300000000001 286.69999999999999 707.42999999999995 1472.99 292.60000000000002 732.24000000000001 1442.9100000000001 269.69999999999999 750.37 1436.8299999999999 244.66 763.71000000000004 1464.75 226.18000000000001 756.75 1509.8800000000001 216.78999999999999 728.26999999999998 1554.8 218.36000000000001 690.63 1585.5699999999999 229.40000000000001 660.28999999999996 1588.6700000000001 254.80000000000001 665.16999999999996 1496.3199999999999 325.81 664.17999999999995 1603.96 255.50999999999999 725.19000000000005 1425.47 272.22000000000003 708.61000000000001 1424.8699999999999 291.88 693.01999999999998 1450.9300000000001 302.38 659.63 1499.3800000000001 313.95999999999998 641.35000000000002 1525.1199999999999 314.75 640.97000000000003 1556.55 294.26999999999998 671.09000000000003 1463.1099999999999 316.52999999999997 749.36000000000001 1424.4300000000001 238.99000000000001 738.48000000000002 1411.3099999999999 254.74000000000001 639.11000000000001 1580.25 275.70999999999998 653.51999999999998 1592.28 251.06999999999999 766.88999999999999 1455.27 210.38999999999999 761.04999999999995 1426.72 217.19 667.53999999999996 1599.1600000000001 225.24000000000001 689.58000000000004 1590.9100000000001 214.06999999999999 763.83000000000004 1505.8900000000001 192.06 772.82000000000005 1473.05 187.34999999999999 711.25 1579.73 190.69999999999999 733.16999999999996 1557.5899999999999 193.34999999999999 754.27999999999997 1531.3599999999999 175.38 686.07000000000005 1577.1500000000001 249.84 666.44000000000005 1585.29 257.98000000000002 717.02999999999997 1547.26 248.52000000000001 744.90999999999997 1507.6199999999999 246.06 751.70000000000005 1446.4400000000001 249.15000000000001 743.75 1459.71 261.75 727.45000000000005 1494.8699999999999 273.24000000000001 698.58000000000004 1533.54 277.49000000000001 671.55999999999995 1566.96 272.30000000000001 780.24000000000001 1393.22 240.72 815.48000000000002 1482.4300000000001 135.50999999999999 808.23000000000002 1442.96 181.78999999999999 642.50999999999999 1453.8599999999999 392.43000000000001 651.42999999999995 1499.4200000000001 357.10000000000002 720.55999999999995 1658.29 151.68000000000001 750.75999999999999 1591.3399999999999 155.78999999999999 610.85000000000002 1672.46 321.19 660.08000000000004 1649.8 267.55000000000001 599.85000000000002 1571.8099999999999 392.04000000000002 722.36000000000001 1387.52 354.24000000000001 772.84000000000003 1367.29 284.22000000000003 777.46000000000004 1572.3699999999999 120.98 659.41999999999996 1702.1400000000001 222.00999999999999 810.49000000000001 1397.53 200.16999999999999 826.75 1419.1300000000001 129.59999999999999 805.25 1334.3399999999999 241.21000000000001 799 1535.95 81.930000000000007 657.63 1376.76 413.00999999999999 562.44000000000005 1496.5699999999999 450.12 654.45000000000005 1727.02 147.41999999999999 744.46000000000004 1642.02 91.989999999999995 523.37 1657.78 387.50999999999999 577.55999999999995 1736.9400000000001 261.25 743.87 1337.98 336 662.37 1538.0699999999999 295.89999999999998 691.72000000000003 1492.95 298.72000000000003 721.03999999999996 1456.01 282.20999999999998 741.12 1435.3900000000001 257.31 758.72000000000003 1447.47 233.71000000000001 763.25999999999999 1486.51 220.49000000000001 744.73000000000002 1533.1199999999999 215.93000000000001 709.49000000000001 1572.73 223.05000000000001 673.89999999999998 1591.4300000000001 238.91 652.52999999999997 1577.1900000000001 272.63999999999999 681.94000000000005 1466.3900000000001 320.93000000000001 652.36000000000001 1589.4300000000001 282.97000000000003 651.82000000000005 1531.0899999999999 320.91000000000003 718.48000000000002 1427.9400000000001 297.62 748.85000000000002 1413.8699999999999 260.19999999999999 772.13999999999999 1428.6900000000001 219.40000000000001 783.80999999999995 1477.47 185.87 765.05999999999995 1539.79 173.08000000000001 719.30999999999995 1588.8800000000001 191.56 678.96000000000004 1607.74 229.63 710.52999999999997 1435.8499999999999 288.62 646.82000000000005 1528.7 308.37 675.59000000000003 1472.5 311.5 737.95000000000005 1421.3499999999999 255.56 643.02999999999997 1578.7 274.50999999999999 759.48000000000002 1436.22 223.75 669.87 1596.4300000000001 229.86000000000001 769.02999999999997 1479.3900000000001 199.46000000000001 711.64999999999998 1577.5699999999999 201.91999999999999 751.33000000000004 1532.5899999999999 189.62 676.11000000000001 1586.0899999999999 248.37 700.72000000000003 1563.97 249.58000000000001 732.21000000000004 1527.9300000000001 246.94 753.08000000000004 1487.2 245.47 745.76999999999998 1447.28 257.49000000000001 737.63999999999999 1476.24 268.00999999999999 713.65999999999997 1514.1600000000001 276.37 683.79999999999995 1551.5899999999999 275.98000000000002 662.87 1577.1300000000001 269.24000000000001 797.13 1412.01 210.22999999999999 806.33000000000004 1479.25 161.03999999999999 672.63999999999999 1458.3 349.72000000000003 722.46000000000004 1622.6400000000001 174.16 645.37 1630.9400000000001 304.66000000000003 636.29999999999995 1548.3099999999999 351.75 724.47000000000003 1406.71 322.41000000000003 764.04999999999995 1388.9300000000001 270.14999999999998 775.90999999999997 1555.05 147.06999999999999 678.38 1654.77 230.5 822.01999999999998 1364.3599999999999 185.44999999999999 819.24000000000001 1479.4300000000001 94.129999999999995 605.16999999999996 1432.45 444.67000000000002 701.85000000000002 1689.6700000000001 112.78 544.44000000000005 1707.52 326.45999999999998 532.34000000000003 1589.0599999999999 433.07999999999998 705.80999999999995 1350.0899999999999 374.81 776.39999999999998 1332.97 294.14999999999998 774.15999999999997 1590.29 80.480000000000004 614.52999999999997 1743.3 200.09 756.45000000000005 1468.4300000000001 244.75 757.12 1454.96 242.99000000000001 809.32000000000005 1479.6099999999999 -143.80000000000001 818.21000000000004 1073.0799999999999 -134.74000000000001 841.42999999999995 1223.97 -146.81999999999999 857.13999999999999 1080.5699999999999 -148.40000000000001 919.95000000000005 1091.1400000000001 -166.99000000000001 1075.3699999999999 1120.1199999999999 -213.47 1033.74 1075.7 -199.69999999999999 912.34000000000003 1185.3699999999999 -167.05000000000001 970.27999999999997 1087.8399999999999 -181.44999999999999 977.26999999999998 1174.1199999999999 -184.96000000000001 994.58000000000004 1080.0799999999999 -188.37 845.67999999999995 1476.54 -154.34 907.77999999999997 1455.26 -171.97 961.62 1439.3499999999999 -187.31 988.21000000000004 1454.49 -195.43000000000001 1016.0700000000001 1487.3299999999999 -204.33000000000001 1063.3399999999999 1524.4200000000001 -219 1106.75 1524.6099999999999 -231.66999999999999 1124.0599999999999 1450.71 -234.99000000000001 1130.8399999999999 1505.4000000000001 -238.25999999999999 1084.9300000000001 1404.4200000000001 -222.49000000000001 1034.5999999999999 1354.47 -206.63 998.13 1329.21 -195.38999999999999 941.39999999999998 1303.6199999999999 -178.22999999999999 852.53999999999996 1205.8499999999999 -150.06 854.97000000000003 1251.02 -150.56 886.01999999999998 1085.6500000000001 -156.94999999999999 1063.01 1087.8800000000001 -208.53 879.07000000000005 1194.1300000000001 -157.61000000000001 946.96000000000004 1086.6700000000001 -174.77000000000001 946.42999999999995 1177.47 -175.91999999999999 1024.29 1170.23 -199.47999999999999 825.38 1484.3599999999999 -150.77000000000001 876.22000000000003 1466.8900000000001 -163.03 936.28999999999996 1445.21 -180.05000000000001 977.44000000000005 1444.0999999999999 -192.03999999999999 999.94000000000005 1467.6199999999999 -199.16 1132.1600000000001 1478.1800000000001 -238 1107.8699999999999 1426.99 -229.71000000000001 1058.3599999999999 1378.3699999999999 -214.12 1016.47 1339.1099999999999 -200.97 972.65999999999997 1318.55 -187.69999999999999 892.39999999999998 1282.9400000000001 -163.44999999999999 1069.05 1143.5699999999999 -212.22 820.67999999999995 1103.47 42.880000000000003 857.39999999999998 1375.3499999999999 33.969999999999999 827.5 1460.8900000000001 -85.680000000000007 854.17999999999995 1273.22 154.75999999999999 866.76999999999998 1228.96 -56 853.86000000000001 1215.8299999999999 -60.219999999999999 897.12 1358.22 11 873.74000000000001 1125.77 116.79000000000001 865.63 1102.5799999999999 11.039999999999999 945.62 1365.0999999999999 -8.6300000000000008 877.01999999999998 1182 168.21000000000001 876.39999999999998 1265.0799999999999 153.09999999999999 954.04999999999995 1261.45 115.39 931.58000000000004 1111.0599999999999 -25.02 969.10000000000002 1231.0999999999999 104.43000000000001 962.22000000000003 1198.6199999999999 94.969999999999999 1089.3900000000001 1141.49 -128.50999999999999 1061.77 1135.99 -52.380000000000003 1129.55 1389.1300000000001 -31.120000000000001 1138.9200000000001 1488.76 -164.66999999999999 953.36000000000001 1256.6400000000001 -53.840000000000003 933.13999999999999 1199.8599999999999 -59.07 992.76999999999998 1324.1800000000001 46.710000000000001 986.89999999999998 1386.54 -29.760000000000002 999.27999999999997 1232.72 23.579999999999998 1013.8200000000001 1281.3900000000001 -57.369999999999997 1001.5 1247.29 75.519999999999996 1018.89 1421.1500000000001 -52.420000000000002 1039.8299999999999 1456.75 -78.709999999999994 1058.02 1280.4000000000001 -6.9400000000000004 1114.01 1356.6099999999999 -58.700000000000003 1056.0799999999999 1311.2 -67.510000000000005 1094.0999999999999 1354.54 -89.060000000000002 1067.6300000000001 1296.52 31.52 986.96000000000004 1112.01 -58.859999999999999 1002.9 1191.45 33.810000000000002 1010.53 1102.6500000000001 -78.049999999999997 1066.6099999999999 1331.0599999999999 36.920000000000002 827.96000000000004 1085.3 -67.980000000000004 855.5 1213.3099999999999 -50.810000000000002 867.46000000000004 1208.8699999999999 -62.710000000000001 849.99000000000001 1224.9100000000001 -108.28 876.08000000000004 1363.4000000000001 19.699999999999999 866.11000000000001 1091.54 -77.209999999999994 844.84000000000003 1421.3 -21.100000000000001 890.33000000000004 1409.5999999999999 -36.390000000000001 921.13 1361.8900000000001 1.99 873.55999999999995 1226.77 172.25 916.52999999999997 1267.1800000000001 137.03999999999999 915.67999999999995 1185.5 150.80000000000001 899.50999999999999 1106.8199999999999 -7.0999999999999996 923.37 1102.04 -112.61 939.79999999999995 1405.4300000000001 -51.090000000000003 968.76999999999998 1210.3800000000001 106.59 962.26999999999998 1181.75 118.39 1080.4200000000001 1109.53 -119.39 1085.3499999999999 1125.95 -171.75 1109.0599999999999 1419.3800000000001 -29.41 1140.02 1451.6400000000001 -83.819999999999993 948.36000000000001 1231.3800000000001 -17.559999999999999 908.08000000000004 1244.23 -54.789999999999999 898.50999999999999 1205.3 -60.93 943.69000000000005 1208.72 -1.3300000000000001 920.02999999999997 1188.04 -129.74000000000001 969.5 1370.3599999999999 -20.379999999999999 969.5 1220.45 29.359999999999999 1006.34 1253.05 -18.670000000000002 986.13 1268.75 -55.289999999999999 998.88 1232.8399999999999 56.32 960.00999999999999 1209.25 67.849999999999994 976.25 1239.52 87.980000000000004 955.25 1289.97 -85.260000000000005 1017.8 1321.73 -90.739999999999995 1031.04 1440.74 -66.450000000000003 1087.55 1313.8099999999999 -26.010000000000002 1102.8499999999999 1354.3 -75.790000000000006 1077.79 1333.8 -77.920000000000002 1055.8499999999999 1292.6600000000001 -35.420000000000002 1063.1500000000001 1282 16.43 1103.0999999999999 1334.5799999999999 9.6899999999999995 1124.8299999999999 1368.3399999999999 -42.439999999999998 1010.9 1445.72 -84.359999999999999 1037.3900000000001 1476.1199999999999 -103.2 1054.25 1349.51 -99.310000000000002 1095.9400000000001 1381.24 -116.5 1124.6500000000001 1401.8299999999999 -108.17 961.30999999999995 1114.1099999999999 -41.649999999999999 998.26999999999998 1172.98 42.909999999999997 975.25999999999999 1193.8900000000001 61.229999999999997 965.30999999999995 1196.52 -68.349999999999994 999.36000000000001 1196.6199999999999 -27.5 977.77999999999997 1100.3900000000001 -126.11 984.76999999999998 1179.0999999999999 -144.94 1038.5899999999999 1180.72 -4.9800000000000004 1031.8499999999999 1158.6500000000001 0.91000000000000003 1024.6800000000001 1189.7 -42.799999999999997 1072.46 1157.8800000000001 -65.340000000000003 1046.7 1099.0699999999999 -101.27 982.38999999999999 1416.4100000000001 -67.629999999999995 1036.05 1294.8499999999999 -60.920000000000002 1035.6600000000001 1264.3099999999999 56.770000000000003 1002.71 1280.1600000000001 78.689999999999998 1004.2 1403.05 -40.280000000000001 1027.46 1247.1099999999999 11.449999999999999 1072.8099999999999 1443.3099999999999 -50.390000000000001 1040.74 1373.9200000000001 9.5399999999999991 943.34000000000003 1301.0699999999999 82.310000000000002 880.85000000000002 1292.0599999999999 110.83 941.5 1139.6099999999999 67.129999999999995 999.20000000000005 1137.1900000000001 22.09 867.70000000000005 1453.52 -96.659999999999997 923.48000000000002 1435.52 -112.03 974.99000000000001 1430.71 -126.31999999999999 1001.99 1451.4400000000001 -136.16 1029.98 1482.53 -150.13999999999999 1074.3399999999999 1512.9400000000001 -157.25 1115.98 1510.47 -160.52000000000001 1129.45 1434.47 -170.02000000000001 1095.02 1397.4400000000001 -165.38 1047.1300000000001 1356.3800000000001 -149.47999999999999 1008.67 1328.54 -139.34 955.17999999999995 1302.9100000000001 -124.58 1082.24 1160.97 -130.03999999999999 960.57000000000005 1203.75 63.789999999999999 1006.5 1197.4100000000001 10.44 870.05999999999995 1216.0799999999999 -47.979999999999997 860 1206.78 -115.69 868.5 1254.74 -99.650000000000006 863.17999999999995 1416.8499999999999 -28.920000000000002 915.02999999999997 1230.71 161.90000000000001 908.74000000000001 1127.55 93.519999999999996 894.99000000000001 1095.55 -91 915.40999999999997 1407.4200000000001 -43.210000000000001 951.29999999999995 1223.3499999999999 134.06999999999999 1074.4400000000001 1090.5799999999999 -167.31 1115.3699999999999 1475.47 -82.219999999999999 910.99000000000001 1213.72 -33.369999999999997 886.94000000000005 1195.74 -123.03 977.51999999999998 1243.05 -14.66 967.49000000000001 1222.3099999999999 66.780000000000001 990.19000000000005 1305.8099999999999 -88.969999999999999 1081.04 1320.75 -50.710000000000001 1096.73 1316.9000000000001 -4.2699999999999996 1023.6799999999999 1461.6900000000001 -94.890000000000001 1075.47 1367.6300000000001 -108.18000000000001 1111.8199999999999 1389.97 -115.43000000000001 971.57000000000005 1141.8800000000001 43.149999999999999 971.60000000000002 1180.1600000000001 72.439999999999998 970.88999999999999 1202.79 -12.890000000000001 951.86000000000001 1102.4200000000001 -117.94 952.30999999999995 1182.8499999999999 -136.31999999999999 1002.01 1092.9000000000001 -136.03 1033.1700000000001 1174.0599999999999 -159.66999999999999 1032.6099999999999 1182.53 -80.549999999999997 1042.8599999999999 1082.48 -154.72 963.83000000000004 1405.47 -61.259999999999998 1036.75 1334.23 -93.799999999999997 1037.24 1298.98 57.780000000000001 1031.3599999999999 1269.98 -25.210000000000001 1077.47 1485.47 -94.209999999999994 1059.3099999999999 1406.74 -16.07 964.73000000000002 1307.8399999999999 63.5 916.34000000000003 1299.8499999999999 98.060000000000002 845.82000000000005 1225.8399999999999 177.41999999999999 1023.8 1128.4200000000001 -14.859999999999999 843.22000000000003 1461.51 -90.159999999999997 892.75 1445.26 -103.47 949.52999999999997 1429.4000000000001 -119.83 991.13999999999999 1439.1900000000001 -131.03999999999999 1014.49 1466.0899999999999 -142.66 1138.78 1460.8699999999999 -166.74000000000001 1115.6300000000001 1414.0999999999999 -170.88999999999999 1069.8199999999999 1376.6700000000001 -156.65000000000001 1028.1900000000001 1340.78 -144.09999999999999 984.45000000000005 1316.5 -133.27000000000001 905.58000000000004 1282.9300000000001 -113.06 1078.73 1148.75 -170.80000000000001 979.75 1201.8800000000001 37.399999999999999 972.26999999999998 1270.74 95.079999999999998 1037.5599999999999 1187.48 -22.899999999999999 1030.8099999999999 1248.51 40.630000000000003 1089.1700000000001 1371.3599999999999 10.9 1069.1199999999999 1170.5699999999999 -74.709999999999994 1135.3800000000001 1422.98 -96.650000000000006 1041.27 1115.3599999999999 -53.920000000000002 862.80999999999995 1287.3599999999999 120.45999999999999 901.91999999999996 1268.4200000000001 -82.329999999999998 999.11000000000001 1430.6300000000001 -74.269999999999996 1019.05 1346.3 30.219999999999999 953.98000000000002 1205.5599999999999 25.280000000000001 996.40999999999997 1190.6099999999999 -74.030000000000001 1036.9100000000001 1180.1300000000001 -122.56 991.66999999999996 1183.22 -111.98 958.71000000000004 1189.73 -104.64 926.07000000000005 1192.3900000000001 -97.209999999999994 892.25 1198.46 -91.799999999999997 863.87 1206.95 -86.790000000000006 851 1221.3099999999999 -80.629999999999995 864.38999999999999 1245.22 -75.489999999999995 784.79999999999995 1556.8299999999999 -54.409999999999997 759.50999999999999 1575.0799999999999 -131.49000000000001 824.97000000000003 1261.52 218.36000000000001 809.17999999999995 1059.8099999999999 80.359999999999999 779.58000000000004 1002.37 -124.03 840.79999999999995 1185.3 165.53999999999999 828.91999999999996 1138.9100000000001 119.19 827.03999999999996 1482 -72.969999999999999 804.85000000000002 1501.48 -143 805.75 1048.9000000000001 -132.66 843 1439.04 -0.029999999999999999 857.20000000000005 1381.3499999999999 52.25 855.34000000000003 1290.95 154.91 844.77999999999997 1243.6500000000001 190.34 840.98000000000002 1183.1800000000001 178.94 833.58000000000004 1132.1199999999999 137.47 824.95000000000005 1086.03 58.079999999999998 954.90999999999997 1171.8099999999999 100.56 916.01999999999998 1147.95 115.16 923.96000000000004 1158.52 127.06 -294.00999999999999 1171.3299999999999 215.56999999999999 824.47000000000003 1065.1600000000001 -26.760000000000002 -235.84999999999999 1059.8699999999999 260.25999999999999 -195.72999999999999 1007.99 277.75999999999999 -147.88999999999999 964.47000000000003 291.25999999999999 -94.180000000000007 923.36000000000001 299.14999999999998 737.5 928.30999999999995 73.200000000000003 -317.60000000000002 1297.99 174.62 -321.12 1292.99 161.22999999999999 -323.97000000000003 1285.04 149.09999999999999 -326.25999999999999 1274.5799999999999 138.81999999999999 -327.5 1262.02 130.87 -327.76999999999998 1248 125.63 -327.08999999999997 1233.1800000000001 123.34999999999999 -325.5 1218.27 124.12 -323.04000000000002 1203.97 127.89 -319.86000000000001 1190.9300000000001 134.53 -315.89999999999998 1179.53 144.41999999999999 -314.70999999999998 1365.8 157.25999999999999 -321.74000000000001 1355.8399999999999 130.59999999999999 -327.56 1340.0699999999999 106.47 -331.88999999999999 1319.22 86.010000000000005 -334.51999999999998 1294.27 70.170000000000002 -335.33999999999997 1266.3800000000001 59.689999999999998 -334.22000000000003 1236.8699999999999 55.109999999999999 -331.19 1207.1500000000001 56.649999999999999 -326.38999999999999 1178.6700000000001 64.230000000000004 -320.13999999999999 1152.75 77.450000000000003 -312.49000000000001 1130.1500000000001 96.849999999999994 -301.89999999999998 1109.6900000000001 129.88 -303.01999999999998 1432.2 137.83000000000001 -313.44999999999999 1417.45 98.319999999999993 -322.06 1394.0799999999999 62.57 -328.47000000000003 1363.1900000000001 32.25 -332.37 1326.22 8.7799999999999994 -333.57999999999998 1284.9000000000001 -6.75 -332.05000000000001 1241.1600000000001 -13.6 -327.82999999999998 1197.04 -11.460000000000001 -321.06999999999999 1154.6600000000001 -0.35999999999999999 -311.81 1116.22 19.350000000000001 -300.66000000000003 1082.8499999999999 47.619999999999997 -283.00999999999999 1496.3499999999999 116.67 -296.67000000000002 1477.02 64.890000000000001 -307.95999999999998 1446.3900000000001 18.030000000000001 -316.36000000000001 1405.9100000000001 -21.699999999999999 -321.48000000000002 1357.46 -52.460000000000001 -323.06 1303.3 -72.799999999999997 -321.05000000000001 1245.98 -81.780000000000001 -315.52999999999997 1188.1600000000001 -78.980000000000004 -306.75999999999999 1132.5599999999999 -64.519999999999996 -294.62 1082.25 -38.5 -280.13 1038.6300000000001 -1.6299999999999999 -254.96000000000001 1557.3 94.079999999999998 -271.66000000000003 1533.6700000000001 30.780000000000001 -285.45999999999998 1496.24 -26.489999999999998 -295.73000000000002 1446.75 -75.060000000000002 -301.98000000000002 1387.52 -112.66 -303.92000000000002 1321.3199999999999 -137.52000000000001 -301.45999999999998 1251.25 -148.5 -294.70999999999998 1180.5799999999999 -145.06999999999999 -283.72000000000003 1112.8199999999999 -127.03 -268.35000000000002 1052.05 -94.189999999999998 -249.08000000000001 999.99000000000001 -45.649999999999999 -219.28999999999999 1614.1700000000001 70.400000000000006 -238.78 1586.5799999999999 -3.4900000000000002 -254.90000000000001 1542.8900000000001 -70.340000000000003 -266.88 1485.1199999999999 -127.04000000000001 -274.18000000000001 1415.98 -170.93000000000001 -276.44 1338.71 -199.96000000000001 -273.56999999999999 1256.9100000000001 -212.77000000000001 -265.69 1174.4100000000001 -208.77000000000001 -252.78 1095.4100000000001 -187.5 -235.16 1024.3 -149.49000000000001 -212.87 963.20000000000005 -94.450000000000003 -176.50999999999999 1666.1199999999999 45.969999999999999 -198.50999999999999 1634.99 -37.43 -216.69999999999999 1585.6600000000001 -112.89 -230.22999999999999 1520.46 -176.88999999999999 -238.47 1442.4200000000001 -226.43000000000001 -241.02000000000001 1355.1900000000001 -259.19999999999999 -237.78 1262.8599999999999 -273.66000000000003 -228.88 1169.74 -269.13999999999999 -214.58000000000001 1080.3599999999999 -245.52000000000001 -195.16999999999999 999.5 -203.44 -168.77000000000001 930.36000000000001 -143.65000000000001 -127.25 1712.4100000000001 21.149999999999999 -151.44 1678.1700000000001 -70.549999999999997 -171.44 1623.9400000000001 -153.52000000000001 -186.31999999999999 1552.25 -223.88999999999999 -195.37 1466.4400000000001 -278.36000000000001 -198.18000000000001 1370.54 -314.38999999999999 -194.61000000000001 1269.02 -330.29000000000002 -184.84 1166.6400000000001 -325.31999999999999 -169.31 1068.1800000000001 -299.70999999999998 -148.33000000000001 979.01999999999998 -254.06999999999999 -121.2 907.96000000000004 -195.41 -72.230000000000004 1752.3499999999999 -3.7000000000000002 -98.260000000000005 1715.52 -102.36 -119.78 1657.1700000000001 -191.63 -135.78 1580.03 -267.33999999999997 -145.52000000000001 1487.71 -325.94999999999999 -148.53999999999999 1384.53 -364.70999999999998 -144.71000000000001 1275.3099999999999 -381.81999999999999 -134.19 1165.1500000000001 -376.47000000000003 -117.48 1059.21 -348.92000000000002 -94.579999999999998 964.77999999999997 -299.64999999999998 -66.930000000000007 896.75 -245.34999999999999 -12.24 1785.3599999999999 -28.219999999999999 -39.729999999999997 1746.47 -132.40000000000001 -62.450000000000003 1684.8499999999999 -226.66999999999999 -79.359999999999999 1603.4000000000001 -306.62 -89.640000000000001 1505.9100000000001 -368.5 -92.829999999999998 1396.96 -409.44 -88.780000000000001 1281.6199999999999 -427.5 -77.670000000000002 1165.3 -421.85000000000002 -60.030000000000001 1053.4300000000001 -392.75999999999999 -35.079999999999998 956.04999999999995 -340.99000000000001 -5.5999999999999996 892.5 -292.67000000000002 51.82 1810.96 -52.049999999999997 23.280000000000001 1770.5799999999999 -160.24000000000001 -0.32000000000000001 1706.5999999999999 -258.13 -17.870000000000001 1622.01 -341.13999999999999 -28.550000000000001 1520.78 -405.41000000000003 -31.859999999999999 1407.6400000000001 -447.91000000000003 -27.649999999999999 1287.8699999999999 -466.67000000000002 -16.120000000000001 1167.0799999999999 -460.81 2.2000000000000002 1050.9100000000001 -430.60000000000002 32.409999999999997 951.45000000000005 -378.63 67.269999999999996 891.03999999999996 -333.11000000000001 153.74000000000001 1833.6700000000001 -85.560000000000002 124.45 1792.23 -196.56999999999999 100.23 1726.5699999999999 -297.02999999999997 82.230000000000004 1639.78 -382.22000000000003 71.260000000000005 1535.9000000000001 -448.16000000000003 67.859999999999999 1419.79 -491.77999999999997 72.180000000000007 1296.8900000000001 -511.02999999999997 84.019999999999996 1172.9400000000001 -505.00999999999999 102.81999999999999 1053.73 -474.00999999999999 128.87 952.25 -417.95999999999998 158.66999999999999 894.30999999999995 -366 258.98000000000002 1840.1600000000001 -116.01000000000001 229.80000000000001 1798.8699999999999 -226.62 205.68000000000001 1733.45 -326.70999999999998 219.41999999999999 1650.0699999999999 -417.97000000000003 204.71000000000001 1557.6400000000001 -473.95999999999998 208.72 1456.5799999999999 -510.93000000000001 177.72999999999999 1305.3399999999999 -539.92999999999995 189.52000000000001 1181.8399999999999 -533.92999999999995 208.25 1063.0699999999999 -503.04000000000002 233.62 962.58000000000004 -445.67000000000002 261.04000000000002 900.58000000000004 -384.06999999999999 329.67000000000002 1833.54 -133.78999999999999 301.12 1793.1600000000001 -241.97 293.04000000000002 1721.0999999999999 -360.30000000000001 263.66000000000003 1367.48 -538.35000000000002 399.44999999999999 1818.8199999999999 -149.33000000000001 376.25999999999999 1764.75 -296.51999999999998 302.87 1236.4400000000001 -558.94000000000005 318.55000000000001 1086.4100000000001 -532.01999999999998 340.25999999999999 983.14999999999998 -461.22000000000003 367.94999999999999 915.19000000000005 -384.38999999999999 467.31 1796.2 -162.41999999999999 447.70999999999998 1759.3800000000001 -282.29000000000002 417.01999999999998 1228.8800000000001 -558.63 422.47000000000003 1108.4400000000001 -539.79999999999995 443 1005.4 -476.70999999999998 480.63 923.33000000000004 -379.70999999999998 532.26999999999998 1766.01 -172.86000000000001 516.86000000000001 1737.25 -270.47000000000003 492.97000000000003 1231.4100000000001 -546.07000000000005 499.86000000000001 1126.9200000000001 -523.53999999999996 521.98000000000002 1026.4100000000001 -468.73000000000002 564.13999999999999 948.69000000000005 -372.83999999999997 593.37 1728.6900000000001 -180.5 582.46000000000004 1699.2 -267.08999999999997 554.75 1238.1600000000001 -512.30999999999995 566.02999999999997 1145.6700000000001 -485.81999999999999 587.86000000000001 1055.3599999999999 -441.94 635 985.41999999999996 -358.04000000000002 649.73000000000002 1684.79 -185.24000000000001 639.44000000000005 1651.95 -266.70999999999998 633.65999999999997 1163.1500000000001 -430.81999999999999 652.33000000000004 1105.3 -392.10000000000002 742.89999999999998 1008.96 -241.84999999999999 710.65999999999997 1604.8 -200.31999999999999 696.47000000000003 1588.3299999999999 -255.69999999999999 714.21000000000004 1526.1800000000001 -278.16000000000003 733.25 1454.3800000000001 -296.05000000000001 717.13999999999999 1372.0599999999999 -347.64999999999998 671.04999999999995 1280.45 -414.69999999999999 765.95000000000005 1509.03 -219.24000000000001 455.83999999999997 1408.1099999999999 -489.20999999999998 404.57999999999998 1577.9400000000001 -457.70999999999998 518.52999999999997 1376.0599999999999 -480.69999999999999 638.73000000000002 1504.51 -384.64999999999998 529.73000000000002 1631.55 -380.38 466.5 1422.2 -458.52999999999997 513.52999999999997 1398.02 -447.77999999999997 424.47000000000003 1538.96 -426.12 428.95999999999998 1474.3099999999999 -451.82999999999998 556.48000000000002 1399.0599999999999 -429.07999999999998 462.76999999999998 1579.3900000000001 -394.44999999999999 590.58000000000004 1432.74 -411.25 517.54999999999995 1580.05 -378.26999999999998 601.07000000000005 1488.6900000000001 -393.62 571.70000000000005 1545.5699999999999 -379.35000000000002 473.00999999999999 1425.4000000000001 -468.16000000000003 518.75999999999999 1400.5 -459.17000000000002 429.39999999999998 1546.8900000000001 -438.5 563.32000000000005 1401.1199999999999 -438.52999999999997 599.92999999999995 1435.05 -417.80000000000001 523.67999999999995 1588.8299999999999 -385.48000000000002 612.14999999999998 1495.52 -398.45999999999998 579.78999999999996 1554.3599999999999 -384.37 585.74000000000001 1356.2 -455.47000000000003 652.90999999999997 1421.5599999999999 -404.27999999999997 656.47000000000003 1516.8699999999999 -366.13 352.75999999999999 1486.1900000000001 -500.38 422.07999999999998 1392.0599999999999 -517.60000000000002 611.75 1605.5599999999999 -350.11000000000001 529.86000000000001 1675.47 -361.39999999999998 434.51999999999998 1680.0899999999999 -406.88999999999999 356.5 1611.49 -464.22000000000003 510.56999999999999 1354.0599999999999 -504.57999999999998 457.88999999999999 1497.53 -447.06999999999999 445.57999999999998 1543.23 -426.04000000000002 488.75 1455.4000000000001 -456.60000000000002 522.25999999999999 1425.98 -449.75 551.19000000000005 1420.79 -437.72000000000003 572.12 1449.3699999999999 -430.14999999999998 570.73000000000002 1494.95 -420.45999999999998 545.30999999999995 1540.1099999999999 -408.39999999999998 507.25 1570.8399999999999 -398.77999999999997 467.98000000000002 1573.23 -404 435.00999999999999 1477.8199999999999 -462.68000000000001 470.68000000000001 1588.4300000000001 -407.35000000000002 514.95000000000005 1408.5999999999999 -447.38 490.17000000000002 1407.4400000000001 -455.06999999999999 471.38 1433.02 -456.99000000000001 436.69999999999999 1481.48 -449.70999999999998 420.57999999999998 1507.3900000000001 -441.54000000000002 430.87 1539.6800000000001 -425.45999999999998 445.19 1444.8699999999999 -457.48000000000002 553.49000000000001 1408.6700000000001 -431.98000000000002 535.73000000000002 1395.0999999999999 -438.95999999999998 438.98000000000002 1564.1900000000001 -409.85000000000002 464.24000000000001 1577.0799999999999 -397.37 583.39999999999998 1440.54 -418.16000000000003 575.14999999999998 1411.73 -419.62 489.86000000000001 1584.9000000000001 -383.44999999999999 514.54999999999995 1576.8599999999999 -385.54000000000002 590.04999999999995 1491.9400000000001 -403.26999999999998 600.57000000000005 1459.22 -402.72000000000003 545.51999999999998 1566.4200000000001 -377.02999999999997 562.85000000000002 1543.9100000000001 -390.10000000000002 590.64999999999998 1518.22 -385.19 492.52999999999997 1561.6099999999999 -413.19 471.5 1569.6300000000001 -409.83999999999997 519.72000000000003 1531.4200000000001 -427.43000000000001 545.02999999999997 1491.5699999999999 -438.63999999999999 549.79999999999995 1430.2 -442.52999999999997 536.16999999999996 1443.02 -449.38999999999999 515.86000000000001 1477.8900000000001 -451.57999999999998 488.75 1516.7 -441.31 468.33999999999997 1550.6400000000001 -423.85000000000002 578.72000000000003 1376.77 -448.92000000000002 663.14999999999998 1468.74 -381.79000000000002 632.77999999999997 1429.3199999999999 -415.16000000000003 379.81 1432.6300000000001 -507.26999999999998 406.50999999999999 1479.72 -481.97000000000003 573.36000000000001 1646.48 -352.57999999999998 597.47000000000003 1578.96 -369.44 389.54000000000002 1654.6900000000001 -436.93000000000001 460.18000000000001 1633.75 -417.25999999999999 343.44999999999999 1551.23 -486.32999999999998 467.45999999999998 1367.5699999999999 -518.02999999999997 548.41999999999996 1349.6700000000001 -481.66000000000003 640.13 1560.8399999999999 -354.38999999999999 483.44 1688.01 -380.81 627.98000000000002 1382.45 -432.39999999999998 678.10000000000002 1400.97 -382.04000000000002 597.88 1319.1600000000001 -465.75999999999999 678.14999999999998 1525.49 -331.49000000000001 383.02999999999997 1358.8699999999999 -534.12 281.49000000000001 1473.97 -512.38999999999999 519.04999999999995 1716.1500000000001 -316.42000000000002 626.00999999999999 1632.6400000000001 -314.61000000000001 280.31999999999999 1638.27 -445.10000000000002 392.89999999999998 1722.1099999999999 -371.33999999999997 497.58999999999997 1314.79 -525.69000000000005 448.26999999999998 1520.8800000000001 -437.54000000000002 472.04000000000002 1475.3 -453.86000000000001 505.94999999999999 1438.6800000000001 -454.70999999999998 536.52999999999997 1418.9000000000001 -443.67000000000002 564.05999999999995 1431.8399999999999 -433.14999999999998 574.52999999999997 1471.3499999999999 -426.06 560.75999999999999 1518.3499999999999 -414.26999999999998 526.73000000000002 1558.05 -403.02999999999997 487.95999999999998 1576.5 -398.05000000000001 451.99000000000001 1561.0899999999999 -414.35000000000002 452.04000000000002 1447.8299999999999 -467.17000000000002 446.13 1572.8699999999999 -423.49000000000001 426.01999999999998 1512.96 -452.62 495.56 1410.23 -465.82999999999998 541.55999999999995 1397.3199999999999 -449.58999999999997 583.23000000000002 1413.5599999999999 -427.69 610.78999999999996 1463.6300000000001 -408.10000000000002 600.86000000000001 1526.5999999999999 -389.41000000000003 551.74000000000001 1575.4200000000001 -382.49000000000001 497.00999999999999 1593.1400000000001 -393.66000000000003 493.56999999999999 1418.3299999999999 -453.99000000000001 428.56999999999999 1511.1800000000001 -439.26999999999998 451.68000000000001 1454.46 -455.66000000000003 534.82000000000005 1404.9200000000001 -439.87 442.95999999999998 1562.6400000000001 -410.88 570.19000000000005 1421.02 -424.70999999999998 489.37 1581.9400000000001 -388.48000000000002 590.78999999999996 1465.0799999999999 -411.16000000000003 539.85000000000002 1563.78 -386.61000000000001 580.48000000000002 1518.8699999999999 -395.64999999999998 484.81 1570.73 -406.98000000000002 505.18000000000001 1548.27 -420.26999999999998 533.60000000000002 1511.98 -433.43000000000001 552.5 1471.0899999999999 -441.64999999999998 540.26999999999998 1430.75 -446.52999999999997 527.48000000000002 1459.3599999999999 -451.94 502.31 1497.1900000000001 -447.63999999999999 476.88 1534.97 -432.87 462.52999999999997 1561.04 -417.04000000000002 609.88999999999999 1397.23 -432.82999999999998 642.21000000000004 1466.28 -398.43000000000001 428.44999999999999 1438.5 -487.07999999999998 563.32000000000005 1609.8699999999999 -370.99000000000001 428.06 1613.49 -439.77999999999997 396.13 1529.03 -470.98000000000002 487.24000000000001 1387.9100000000001 -489.86000000000001 548.91999999999996 1371.8399999999999 -465.17000000000002 624.35000000000002 1542.21 -374.48000000000002 495.45999999999998 1640.0899999999999 -396.12 644.84000000000003 1344.6099999999999 -425.98000000000002 689.38999999999999 1463.52 -349 319.39999999999998 1409.5599999999999 -532.49000000000001 578.11000000000001 1679.74 -311.12 330.27999999999997 1690.3299999999999 -407.17000000000002 264.24000000000001 1567.54 -485.32999999999998 442.75 1326.3800000000001 -536.72000000000003 547.14999999999998 1313.1300000000001 -496.42000000000002 656.71000000000004 1582.45 -320.42000000000002 456.87 1730.6400000000001 -340 555.96000000000004 1452.3299999999999 -442.06 557.62 1438.9400000000001 -440.43000000000001 725.30999999999995 1094.0999999999999 -291.91000000000003 759.25 1354.48 -313.36000000000001 793.76999999999998 1455.45 -202.30000000000001 688.12 1257.1400000000001 -410.95999999999998 822.77999999999997 1225.5999999999999 -240.40000000000001 817.19000000000005 1214.3299999999999 -229.97999999999999 805.64999999999998 1340.48 -311.50999999999999 727.44000000000005 1114.3399999999999 -381.99000000000001 778.28999999999996 1095.5699999999999 -288.17000000000002 855.04999999999995 1353.45 -322.83999999999997 699.71000000000004 1169.53 -427.42000000000002 708.88999999999999 1251.6099999999999 -420.75 794.99000000000001 1248.27 -430.17000000000002 853.16999999999996 1104.77 -293.63999999999999 813.88999999999999 1218.3699999999999 -427.73000000000002 813.37 1186.6700000000001 -414.93000000000001 1040.6099999999999 1135.24 -292.38999999999999 977.32000000000005 1129.21 -341.68000000000001 1019.84 1380.3199999999999 -406.94999999999999 1098.3 1485.5 -303.83999999999997 889.10000000000002 1247.6600000000001 -287.91000000000003 870.83000000000004 1194.6300000000001 -271.41000000000003 863.5 1313.8 -396.13999999999999 898.88 1379.47 -331.29000000000002 882.47000000000003 1223.1600000000001 -376.30000000000001 939.20000000000005 1273.4000000000001 -318.19 856.33000000000004 1235.6300000000001 -421.77999999999997 937.60000000000002 1414.6300000000001 -330.89999999999998 968.92999999999995 1451.0599999999999 -321.56 947.90999999999997 1271.5599999999999 -384.16000000000003 1021.98 1349.23 -373.98000000000002 978.45000000000005 1304.97 -333.44 1021.54 1348.71 -337.62 935.12 1285.8800000000001 -422.41000000000003 918.03999999999996 1106.48 -294.97000000000003 879.25 1177.8499999999999 -384.39999999999998 948.34000000000003 1097.6600000000001 -291.06999999999999 930.91999999999996 1320.1600000000001 -427.89999999999998 789.23000000000002 1082.1900000000001 -200.63 814.19000000000005 1211.6199999999999 -237.78 825.88 1206.8 -234.19999999999999 832.63 1223.75 -185.22 783.59000000000003 1341.8299999999999 -308.10000000000002 826.27999999999997 1088.3399999999999 -213.65000000000001 776.08000000000004 1403.72 -263.55000000000001 823.33000000000004 1395.8 -272.51999999999998 829.73000000000002 1347.21 -317.44 694.57000000000005 1213.2 -432.68000000000001 751.42999999999995 1253.6700000000001 -428.60000000000002 743.66999999999996 1171.77 -435.82999999999998 816.54999999999995 1100.1600000000001 -291.30000000000001 893.46000000000004 1099.6400000000001 -215.09 872.15999999999997 1395.5799999999999 -286.05000000000001 812.58000000000004 1197.9100000000001 -428.70999999999998 801.02999999999997 1168.8 -433.94999999999999 1029.4100000000001 1105.4400000000001 -294.13999999999999 1061.48 1124.5699999999999 -254.18000000000001 1001.26 1410.72 -398.69 1056.22 1444.9100000000001 -370.91000000000003 859.49000000000001 1225.3699999999999 -315.06 844.36000000000001 1239.03 -264.67000000000002 847.72000000000003 1202.3699999999999 -251.44999999999999 850.55999999999995 1197.5899999999999 -323.74000000000001 898.5 1186.97 -202.25999999999999 880.49000000000001 1361.28 -327.35000000000002 854.19000000000005 1210.9300000000001 -364.56 911.38 1243.5699999999999 -345.27999999999997 918.36000000000001 1256.79 -303.17000000000002 864.63 1222.0599999999999 -403.57999999999998 825.96000000000004 1198.49 -391.36000000000001 828.54999999999995 1227.8599999999999 -418.35000000000002 906.44000000000005 1291.3099999999999 -267.55000000000001 958.62 1317.3399999999999 -294.02999999999997 955.13999999999999 1434.6500000000001 -326.47000000000003 982.63999999999999 1305.3900000000001 -385.43000000000001 1021.79 1347.8 -353.48000000000002 1002.0700000000001 1327.72 -337.32999999999998 961.24000000000001 1285.0699999999999 -359.54000000000002 939.63999999999999 1272.0799999999999 -406.67000000000002 976.27999999999997 1324.4000000000001 -424.74000000000001 1022.2 1360.0999999999999 -393.99000000000001 947.72000000000003 1440.6500000000001 -300.76999999999998 979.80999999999995 1471.5 -300.45999999999998 993.51999999999998 1344.6400000000001 -307.32999999999998 1037.52 1376.55 -316.66000000000003 1056.98 1396.4000000000001 -339.99000000000001 887.13 1108.1600000000001 -295.75999999999999 872.09000000000003 1162.8499999999999 -389.37 842.5 1182.9100000000001 -393.25 901.88 1191.53 -280.54000000000002 911.32000000000005 1193.01 -329.86000000000001 946.61000000000001 1097.8900000000001 -232.90000000000001 960.13999999999999 1174.3399999999999 -222.18000000000001 931.15999999999997 1170.5799999999999 -370.56 923.14999999999998 1149.9200000000001 -371.44 940.89999999999998 1187.4000000000001 -330.48000000000002 993.13 1149.74 -336.13 991.37 1094.6300000000001 -290.81999999999999 915.07000000000005 1411.01 -298.25999999999999 958.40999999999997 1287.96 -327.62 894.99000000000001 1253.02 -425.08999999999997 855.23000000000002 1268.3199999999999 -426.51999999999998 918.90999999999997 1396.2 -332.44 912.65999999999997 1237.8599999999999 -381.77999999999997 981.67999999999995 1436 -362.56 923.28999999999996 1364.5 -392.77999999999997 803.87 1289.1500000000001 -398.01999999999998 736.78999999999996 1275.24 -386.30000000000001 811.62 1129.1800000000001 -377.80000000000001 884.50999999999999 1127.98 -370.79000000000002 833.83000000000004 1449.5799999999999 -213.87 889.73000000000002 1430.4300000000001 -228.66 940.21000000000004 1427.9100000000001 -245.47999999999999 968 1448.71 -252.61000000000001 998.72000000000003 1480.02 -257.23000000000002 1039.55 1510.1500000000001 -276.41000000000003 1076.45 1507.29 -295.94 1093.8699999999999 1431.6099999999999 -291.91000000000003 1062.8199999999999 1394.8599999999999 -275.69999999999999 1014.41 1353.76 -261.56 976.88 1325.99 -248.21000000000001 924.34000000000003 1300.54 -230.97 1035.3900000000001 1154.1500000000001 -288.19999999999999 828.69000000000005 1193.1600000000001 -388.00999999999999 895.30999999999995 1184.8599999999999 -366.74000000000001 822.74000000000001 1213.3 -247.63999999999999 841.63 1204.8399999999999 -183.44999999999999 845.64999999999998 1253.8399999999999 -203.11000000000001 796.07000000000005 1400.5899999999999 -265.77999999999997 737.33000000000004 1215.9100000000001 -447.11000000000001 769.96000000000004 1116.4100000000001 -381.88 857.99000000000001 1092.5799999999999 -217.72999999999999 847.83000000000004 1396.1500000000001 -279.68000000000001 783.17999999999995 1208.96 -442.43000000000001 1050.3699999999999 1088.6500000000001 -249.75999999999999 1034.28 1468.95 -360.02999999999997 842.74000000000001 1207.7 -280.41000000000003 867.32000000000005 1194.1800000000001 -191.05000000000001 883.24000000000001 1236.8800000000001 -333.55000000000001 832.66999999999996 1211.49 -395.05000000000001 935.22000000000003 1304.4100000000001 -281.63999999999999 990.33000000000004 1313.47 -361.43000000000001 978.63999999999999 1307.4200000000001 -408.80000000000001 963.96000000000004 1456.9000000000001 -299.47000000000003 1015.95 1362.8599999999999 -312.06999999999999 1050.22 1385.02 -326.47000000000003 849.84000000000003 1132.1099999999999 -373.87 833.63 1169.0799999999999 -400.19999999999999 878.94000000000005 1193.3699999999999 -327.44999999999999 920.33000000000004 1099.8800000000001 -225.93000000000001 930.04999999999995 1182.3699999999999 -212.75999999999999 972.47000000000003 1090.52 -237.25 1009.46 1170.54 -237.50999999999999 967.17999999999995 1177.3199999999999 -302.25999999999999 1017.08 1080.4100000000001 -243.03 897.14999999999998 1397.5599999999999 -291.30000000000001 976 1329.3499999999999 -301.91000000000003 895.35000000000002 1287.5899999999999 -428.27999999999997 935.22000000000003 1261.6800000000001 -354.13999999999999 1008.64 1479.9400000000001 -329.99000000000001 952.30999999999995 1398.1500000000001 -382.61000000000001 831.67999999999995 1297.79 -394.45999999999998 773.41999999999996 1283.8699999999999 -394.99000000000001 667.14999999999998 1212.25 -420.56999999999999 925.23000000000002 1120.5 -352.52999999999997 809.5 1455.95 -208.91999999999999 858.91999999999996 1441.6700000000001 -220.65000000000001 915.75999999999999 1424.8900000000001 -236.03 956.25 1436.3900000000001 -250.56 981.85000000000002 1463.47 -254.5 1099.6400000000001 1457.72 -300.81999999999999 1082.95 1411.48 -282.86000000000001 1037.1300000000001 1374.04 -268.60000000000002 995.74000000000001 1338.1700000000001 -255.24000000000001 953.35000000000002 1314.01 -239.78 876.88999999999999 1281.96 -213.84 1054.9000000000001 1147.0899999999999 -252.36000000000001 858.12 1187.74 -375.72000000000003 821.20000000000005 1258.4300000000001 -423.31 940.54999999999995 1179.72 -354.50999999999999 899.77999999999997 1237.99 -408.20999999999998 963.41999999999996 1361.26 -419.86000000000001 995.03999999999996 1161.72 -326.99000000000001 1059.5599999999999 1416.8900000000001 -356.38 961.13 1108.9200000000001 -328.47000000000003 716.55999999999995 1269.3499999999999 -384.11000000000001 857.63 1273.9300000000001 -243.03999999999999 932.54999999999995 1425.28 -302.26999999999998 894.24000000000001 1336.28 -397.33999999999997 843.28999999999996 1195.0599999999999 -352.58999999999997 933.96000000000004 1190 -289.22000000000003 991.23000000000002 1172.1099999999999 -269.60000000000002 949.67999999999995 1181.6500000000001 -253.88999999999999 917.48000000000002 1186.22 -244.13 885.61000000000001 1190.4100000000001 -234.24000000000001 857.22000000000003 1197.05 -221.59999999999999 835.30999999999995 1206.1700000000001 -212.13999999999999 824.03999999999996 1219.98 -211.50999999999999 832.96000000000004 1243.1800000000001 -224.11000000000001 739.38999999999999 1553.7 -210.27000000000001 629.85000000000002 1245.3699999999999 -445.18000000000001 701.37 1035.24 -328.33999999999997 668.25 1174.1700000000001 -404.64999999999998 687.14999999999998 1128.51 -358.57999999999998 786.15999999999997 1476.6400000000001 -214.28999999999999 763.16999999999996 1419.72 -282.29000000000002 752.36000000000001 1358.5699999999999 -327.01999999999998 689.92999999999995 1271.5799999999999 -414.29000000000002 659.82000000000005 1230.6600000000001 -433.20999999999998 662.50999999999999 1171.24 -417.11000000000001 680.25999999999999 1121.45 -376.00999999999999 722.74000000000001 1072.6099999999999 -309 804.54999999999995 1159.73 -414.54000000000002 764.21000000000004 1135.76 -404.89999999999998 764.59000000000003 1145.3900000000001 -419.47000000000003 -310.36000000000001 1169.7 160.59999999999999 766.25999999999999 1057.3800000000001 -232.84 -284.67000000000002 1051.9200000000001 97.489999999999995 -259.18000000000001 999.21000000000004 62.670000000000002 -225.56999999999999 954.91999999999996 24.34 -182.63 911.00999999999999 -14.99 608.99000000000001 902.94000000000005 -243.5 677.97000000000003 947.63 -243.81 644.05999999999995 1539.7 336.32999999999998 658.29999999999995 1497.8699999999999 341.44999999999999 677.35000000000002 1462.3499999999999 335.32999999999998 699.03999999999996 1435.72 324.25999999999999 641.15999999999997 1580.4200000000001 319.81999999999999 721.71000000000004 1417.47 309.81 648.87 1610.1900000000001 293.81 740.71000000000004 1406.01 289.32999999999998 662.13 1626.8800000000001 261.52999999999997 756.47000000000003 1401.53 265.16000000000003 678.66999999999996 1631.26 230.06999999999999 770.71000000000004 1405.03 240.08000000000001 698.00999999999999 1623.9400000000001 203.88999999999999 784.52999999999997 1420.6099999999999 215.31 720.88999999999999 1605.76 182.86000000000001 795.28999999999996 1446.23 192.5 747.51999999999998 1579.4100000000001 167.40000000000001 795.66999999999996 1477.79 175.09999999999999 770.62 1547.02 160.52000000000001 787.33000000000004 1512.23 163.91 464.43000000000001 1416.76 -478.68000000000001 440.24000000000001 1443.1600000000001 -477.13 420.75999999999999 1478.77 -472.32999999999998 411.07999999999998 1520.99 -461.80000000000001 491.39999999999998 1399.0699999999999 -477.85000000000002 416.99000000000001 1562.4200000000001 -448.10000000000002 518.65999999999997 1388.28 -469.93000000000001 437.10000000000002 1593.1800000000001 -431.63 545.24000000000001 1384.5799999999999 -457.38 465.43000000000001 1611.0899999999999 -412.30000000000001 571.00999999999999 1388.8900000000001 -443.70999999999998 496.24000000000001 1616.6099999999999 -394.88999999999999 596.03999999999996 1405.5599999999999 -430.49000000000001 526.71000000000004 1610.1900000000001 -382.93000000000001 615.39999999999998 1432.78 -417.66000000000003 557.52999999999997 1592.6500000000001 -376.74000000000001 625.22000000000003 1464.6600000000001 -404.72000000000003 588.63 1566.6600000000001 -376.89999999999998 624.75999999999999 1499.28 -392.44999999999999 612.62 1534.3900000000001 -381.94999999999999 -138.56999999999999 574.14999999999998 -548.71000000000004 -137.25999999999999 520.88999999999999 -606.91999999999996 -142.41999999999999 505.79000000000002 -641.95000000000005 -95.180000000000007 -221.62 -469.58999999999997 -95.620000000000005 -202.25999999999999 -529.62 -99.489999999999995 -167.12 -581 -108.33 -119.01000000000001 -620.12 -122.79000000000001 -64.780000000000001 -649.00999999999999 -119.2 -6.4299999999999997 -684.26999999999998 -116.48 25.879999999999999 -704.77999999999997 -112.41 73.079999999999998 -723.38999999999999 -110.61 124.98999999999999 -736.83000000000004 -114.83 178.15000000000001 -743.91999999999996 -121.66 232.31999999999999 -745.14999999999998 -128.19 286.16000000000003 -741.88999999999999 -132.83000000000001 337.55000000000001 -733.34000000000003 -135.05000000000001 384.51999999999998 -719.98000000000002 -136.37 427.73000000000002 -700.35000000000002 -140.40000000000001 469.48000000000002 -673.77999999999997 -127.5 626.74000000000001 -484.88999999999999 -101.91 666.67999999999995 -433.91000000000003 -73.760000000000005 702.86000000000001 -379.81999999999999 604.75 823.46000000000004 -64.819999999999993 621.87 798.48000000000002 -68.469999999999999 652.01999999999998 776.95000000000005 -73.730000000000004 699.04999999999995 749.87 -84.519999999999996 754.27999999999997 710.79999999999995 -94.290000000000006 -294.31 1104 154.97 -306.56 1167.4300000000001 173.31999999999999 -163.69999999999999 882.21000000000004 64.349999999999994 -273.47000000000003 1042.54 135.05000000000001 -244.22 985.80999999999995 110.93000000000001 -207.53999999999999 934.52999999999997 84.430000000000007 -967.92999999999995 24.649999999999999 178.06 -276.56999999999999 1105.79 211.65000000000001 -297.99000000000001 1167.99 201.63 -120.27 892.46000000000004 219.16 -247.84999999999999 1045.0599999999999 219.18000000000001 -211.31999999999999 988.05999999999995 223.83000000000001 -168.08000000000001 936.38 224.41 710.75 922.49000000000001 -97.530000000000001 652.53999999999996 876.62 -78.340000000000003 -312.83999999999997 -219.27000000000001 339.86000000000001 -231.37 -219.37 365.39999999999998 -372.01999999999998 -219.18000000000001 292.06 -417.92000000000002 -219.08000000000001 228.06999999999999 -461.19 -219.03999999999999 130.5 284.08999999999997 -219.55000000000001 321.06999999999999 385.88 -219.63 255.47999999999999 34.670000000000002 -219.44999999999999 381.97000000000003 150.30000000000001 -219.50999999999999 363.85000000000002 -120.77 -219.46000000000001 382.91000000000003 441.85000000000002 -219.58000000000001 173.22999999999999 -65.209999999999994 -219.46000000000001 390.02999999999997 471.05000000000001 -219.21000000000001 81.980000000000004 -463.80000000000001 -219.08000000000001 -47.539999999999999 470.49000000000001 -219.31 -41.57 -245.87 -219.38999999999999 -334.63 -327.13999999999999 -219.27000000000001 -310.18000000000001 -406.68000000000001 -219.09 -274.30000000000001 -449.87 -219.06999999999999 -205.74000000000001 -449.16000000000003 -219.13999999999999 -121.64 391.22000000000003 -219.47 -224.93000000000001 287.36000000000001 -219.28999999999999 -295.20999999999998 152.5 -219.15000000000001 -358.19999999999999 29.469999999999999 -219.09999999999999 -382.68000000000001 -128.66 -219.30000000000001 -366.44 446.60000000000002 -219.49000000000001 -138.12 -75.700000000000003 -219.30000000000001 -367.56 12.609999999999999 -218.97 19.809999999999999 641.10000000000002 882.02999999999997 191.88 -658.11000000000001 843.57000000000005 30.98 -586.13999999999999 -220.15000000000001 44.549999999999997 -496.45999999999998 -219.12 41.369999999999997 -817.64999999999998 916.76999999999998 24.829999999999998 -733.71000000000004 894.78999999999996 27.370000000000001 -767.46000000000004 -160.06 44.409999999999997 -680.52999999999997 -198.53999999999999 44.909999999999997 -852.67999999999995 -110.66 42.719999999999999 -923.83000000000004 -47.009999999999998 43.579999999999998 -984.36000000000001 23.719999999999999 44.149999999999999 -1029.6199999999999 104.54000000000001 45.130000000000003 -1070.6400000000001 219.41 45.649999999999999 -1091.8699999999999 345.64999999999998 44.380000000000003 -1088.9000000000001 440.49000000000001 44.350000000000001 -1074.53 541.90999999999997 44.649999999999999 -1051.6300000000001 661.83000000000004 42.560000000000002 -988.38 812.88 31.23 -905.03999999999996 891.11000000000001 25.449999999999999 -600.45000000000005 770.17999999999995 44.799999999999997 -550.59000000000003 727.83000000000004 48.479999999999997 -494.69 705.17999999999995 46.560000000000002 -423.32999999999998 694.51999999999998 44.909999999999997 -343.62 700.22000000000003 45.509999999999998 -149.12 737.61000000000001 56.109999999999999 -80.489999999999995 763.64999999999998 61.32 -69.409999999999997 782.69000000000005 58.090000000000003 -79.989999999999995 806.58000000000004 66.659999999999997 -106.79000000000001 837.87 86.090000000000003 -151.24000000000001 878.04999999999995 109.17 -195.25999999999999 927.28999999999996 125.72 -233.65000000000001 980.71000000000004 142.27000000000001 -265.57999999999998 1039.3 156.65000000000001 -289.36000000000001 1102.1900000000001 168.56999999999999 -304.67000000000002 1166.98 179.41 -517.97000000000003 463.24000000000001 660.13 -429.35000000000002 504.88999999999999 645.69000000000005 -270.88 14.210000000000001 721.70000000000005 44.399999999999999 -9.3900000000000006 723.79999999999995 -115.47 -6.9100000000000001 724.95000000000005 418.23000000000002 136.40000000000001 719.34000000000003 486.61000000000001 313.31 707.50999999999999 389.77999999999997 483.48000000000002 681.26999999999998 -433.38999999999999 496.22000000000003 -607.35000000000002 -529.84000000000003 454.82999999999998 -618.37 -269.63999999999999 23.609999999999999 -680.86000000000001 405.14999999999998 143.52000000000001 -679.71000000000004 464.66000000000003 315.01999999999998 -670.13 377.72000000000003 474.13 -642.96000000000004 -538.5 474.63999999999999 646.75999999999999 -441.74000000000001 514.83000000000004 633.74000000000001 -300.30000000000001 528.26999999999998 627.73000000000002 -135.88999999999999 544.97000000000003 627.29999999999995 -435.10000000000002 56.68 705.90999999999997 -534.17999999999995 135.77000000000001 700.13 -588.90999999999997 228.09 688.26999999999998 -606.73000000000002 319.93000000000001 676.13999999999999 -289.94999999999999 -3.79 707.11000000000001 -590.64999999999998 405.70999999999998 662.33000000000004 383.80000000000001 52.030000000000001 698.49000000000001 246.53999999999999 -6.8499999999999996 698.62 64.049999999999997 -33.420000000000002 705.83000000000004 -115.08 -31.620000000000001 708.83000000000004 474.30000000000001 126.90000000000001 699.33000000000004 527.63 214.00999999999999 696.25 544.90999999999997 308.81999999999999 688.38999999999999 518.88999999999999 404.5 674.80999999999995 450.58999999999997 487.52999999999997 658.71000000000004 27.690000000000001 571.40999999999997 625.58000000000004 200.00999999999999 577.94000000000005 628.15999999999997 343.41000000000003 546.63999999999999 642.26999999999998 -136.46000000000001 537.08000000000004 -586.08000000000004 -307.38999999999999 527.10000000000002 -585.64999999999998 -450.44999999999999 507.14999999999998 -593.66999999999996 -551.58000000000004 463.77999999999997 -606.69000000000005 -612.34000000000003 308.73000000000002 -635.54999999999995 -592.71000000000004 225.72 -645.53999999999996 -532.61000000000001 140.97 -655.33000000000004 -432.24000000000001 65.090000000000003 -661.00999999999999 -292.75999999999999 2.3900000000000001 -664.04999999999995 -600 390.67000000000002 -622.57000000000005 -120.40000000000001 -30.079999999999998 -668.37 57.100000000000001 -33.609999999999999 -667.04999999999995 240.72 -4.8899999999999997 -658.30999999999995 377.97000000000003 56.020000000000003 -655.58000000000004 466.63 132.19999999999999 -654.36000000000001 517.34000000000003 217.75999999999999 -651.03999999999996 532.52999999999997 308.13999999999999 -643.15999999999997 508.00999999999999 396.88 -631.36000000000001 444.66000000000003 474.92000000000002 -616.89999999999998 343.75999999999999 531.22000000000003 -600.97000000000003 203.34 561.32000000000005 -586.85000000000002 26.68 559.16999999999996 -584.86000000000001</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 608 612 613 614 611 616 617 618 615 620 621 622 619 624 625 626 623 628 629 630 627 632 633 634 631 636 637 638 635 640 641 642 639 644 645 646 643 648 649 650 647 652 653 654 651 656 657 658 655 660 661 662 659 664 665 666 663 668 669 670 667 672 673 674 671 676 677 678 675 680 681 682 679 684 685 686 683 688 689 690 687 692 693 694 695 691 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1891 1888 1893 1894 1895 1892 1897 1898 1899 1896 1901 1902 1903 1900 1905 1906 1907 1904 1909 1910 1911 1908 1913 1914 1915 1912 1917 1918 1919 1916 1921 1922 1923 1920 1925 1926 1927 1924 1929 1930 1931 1928 1933 1934 1935 1932 1937 1938 1939 1936 1941 1942 1943 1940 1945 1946 1947 1944 1949 1950 1951 1948 1953 1954 1955 1952 1957 1958 1959 1956 1961 1962 1963 1960 1965 1966 1967 1964 1969 1970 1971 1968 1973 1974 1975 1972 1977 1978 1979 1976 1981 1982 1983 1980 1985 1986 1987 1984 1989 1990 1991 1988 1993 1994 1995 1992 1997 1998 1999 1996 2001 2002 2003 2000 2005 2006 2007 2004 2009 2010 2011 2008 2013 2014 2015 2012 2017 2018 2019 2016 2021 2022 2023 2020 2025 2026 2027 2024 2029 2030 2031 2028 2033 2034 2035 2032 2037 2038 2039 2036 2041 2042 2043 2040 2045 2046 2047 2044 2049 2050 2051 2048 2053 2054 2055 2052 2057 2058 2059 2056 2061 2062 2063 2060 2065 2066 2064 2068 2069 2070 2067 2072 2073 2074 2071 2076 2077 2078 2075 2080 2081 2082 2079 2084 2085 2086 2083 2088 2089 2090 2087 2092 2093 2094 2091 2096 2097 2098 2095 2100 2101 2102 2099 2104 2105 2106 2103 2108 2109 2110 2107 2112 2113 2114 2111 2116 2117 2118 2115 2120 2121 2122 2119 2124 2125 2126 2123 2128 2129 2130 2127 2132 2133 2134 2131 2136 2137 2138 2135 2140 2141 2142 2139 2144 2145 2146 2143 2148 2149 2150 2151 2147 2153 2154 2155 2152 2157 2158 2159 2156 2161 2162 2163 2160 2165 2166 2167 2164 2169 2170 2171 2168 2173 2174 2175 2172 2177 2178 2179 2176 2181 2182 2183 2180 2185 2186 2187 2184 2189 2190 2191 2188 2193 2194 2195 2192 2197 2198 2199 2196 2201 2202 2203 2200 2205 2206 2207 2204 2209 2210 2211 2208 2213 2214 2215 2212 2217 2218 2219 2216 2221 2222 2223 2220 2225 2226 2227 2224 2229 2230 2231 2228 2233 2234 2235 2232 2237 2238 2239 2236 2241 2242 2243 2240 2245 2246 2247 2244 2249 2250 2251 2248 2253 2254 2255 2252 2257 2258 2259 2256 2261 2262 2263 2260 2265 2266 2267 2264 2269 2270 2271 2268 2273 2274 2275 2272 2277 2278 2279 2276 2281 2282 2283 2280 2285 2286 2287 2284 2289 2290 2291 2288 2293 2294 2295 2292 2297 2298 2299 2296 2301 2302 2303 2300 2305 2306 2307 2304 2309 2310 2311 2308 2313 2314 2315 2312 2317 2318 2319 2316 2321 2322 2323 2320 2325 2326 2327 2324 2329 2330 2331 2328 2333 2334 2335 2332 2337 2338 2339 2336 2341 2342 2343 2340 2345 2346 2347 2344 2349 2350 2351 2348 2353 2354 2355 2352 2357 2358 2359 2356 2361 2362 2363 2360 2365 2366 2367 2364 2369 2370 2371 2368 2373 2374 2375 2372 2377 2378 2379 2376 2381 2382 2383 2380 2385 2386 2387 2384 2389 2390 2391 2388 2393 2394 2395 2392 2397 2398 2399 2396 2401 2402 2403 2400 2405 2406 2407 2404 2409 2410 2411 2408 2413 2414 2415 2412 2417 2418 2419 2416 2421 2422 2423 2420 2425 2426 2427 2424 2429 2430 2431 2428 2433 2434 2435 2432 2437 2438 2439 2436 2441 2442 2443 2440 2445 2446 2447 2444 2449 2450 2451 2448 2453 2454 2455 2452 2457 2458 2459 2456 2461 2462 2463 2460 2465 2466 2467 2464 2469 2470 2471 2468 2473 2474 2475 2472 2477 2478 2479 2476 2481 2482 2483 2480 2485 2486 2487 2484 2489 2490 2491 2488 2493 2494 2495 2492 2497 2498 2499 2496 2501 2502 2503 2500 2505 2506 2507 2504 2509 2510 2511 2508 2513 2514 2515 2512 2517 2518 2519 2516 2521 2522 2523 2520 2525 2526 2527 2524 2529 2530 2531 2528 2533 2534 2535 2532 2537 2538 2539 2536 2541 2542 2543 2540 2545 2546 2547 2544 2549 2550 2551 2548 2553 2554 2555 2552 2557 2558 2559 2556 2561 2562 2563 2560 2565 2566 2567 2564 2569 2570 2571 2568 2573 2574 2575 2572 2577 2578 2579 2576 2581 2582 2583 2580 2585 2586 2587 2584 2589 2590 2591 2588 2593 2594 2595 2592 2597 2598 2599 2596 2601 2602 2603 2600 2605 2606 2607 2604 2609 2610 2611 2608 2613 2614 2615 2612 2617 2618 2619 2616 2621 2622 2623 2620 2625 2626 2627 2624 2629 2630 2631 2628 2633 2634 2635 2632 2637 2638 2639 2636 2641 2642 2643 2640 2645 2646 2647 2644 2649 2650 2651 2648 2653 2654 2655 2652 2657 2658 2659 2656 2661 2662 2663 2660 2665 2666 2667 2664 2669 2670 2671 2668 2673 2674 2675 2672 2677 2678 2679 2676 2681 2682 2683 2680 2685 2686 2687 2684 2689 2690 2691 2688 2693 2694 2695 2692 2697 2698 2699 2696 2701 2702 2703 2700 2705 2706 2707 2704 2709 2710 2711 2708 2713 2714 2715 2712 2717 2718 2719 2716 2721 2722 2723 2720 2725 2726 2727 2724 2729 2730 2731 2728 2733 2734 2735 2732 2737 2738 2739 2736 2741 2742 2743 2740 2745 2746 2747 2744 2749 2750 2751 2748 2753 2754 2755 2752 2757 2758 2759 2756 2761 2762 2763 2760 2765 2766 2767 2764 2769 2770 2771 2768 2773 2774 2775 2772 2777 2778 2779 2776 2781 2782 2783 2780 2785 2786 2787 2784 2789 2790 2791 2788 2793 2794 2795 2792 2797 2798 2799 2796 2801 2802 2803 2800 2805 2806 2807 2804 2809 2810 2811 2808 2813 2814 2815 2812 2817 2818 2819 2816 2821 2822 2823 2820 2825 2826 2827 2824 2829 2830 2831 2828 2833 2834 2835 2832 2837 2838 2839 2836 2841 2842 2843 2840 2845 2846 2847 2844 2849 2850 2851 2848 2853 2854 2855 2852 2857 2858 2859 2856 2861 2862 2863 2860 2865 2866 2867 2864 2869 2870 2871 2868 2873 2874 2875 2872 2877 2878 2879 2876 2881 2882 2883 2880 2885 2886 2887 2884 2889 2890 2891 2888 2893 2894 2895 2892 2897 2898 2899 2896 2901 2902 2903 2900 2905 2906 2907 2904 2909 2910 2911 2908 2913 2914 2915 2912 2917 2918 2919 2916 2921 2922 2923 2920 2925 2926 2927 2924 2929 2930 2931 2928 2933 2934 2935 2932 2937 2938 2939 2936 2941 2942 2943 2940 2945 2946 2947 2944 2949 2950 2951 2948 2953 2954 2955 2952 2957 2958 2959 2956 2961 2962 2963 2960 2965 2966 2967 2964 2969 2970 2971 2968 2973 2974 2975 2972 2977 2978 2979 2976 2981 2982 2983 2980 2985 2986 2987 2984 2989 2990 2991 2988 2993 2994 2995 2992 2997 2998 2999 2996 3001 3002 3003 3000 3005 3006 3007 3004 3009 3010 3011 3008 3013 3014 3015 3012 3017 3018 3019 3016 3021 3022 3023 3020 3025 3026 3027 3024 3029 3030 3031 3028 3033 3034 3035 3032 3037 3038 3039 3036 3041 3042 3043 3040 3045 3046 3047 3044 3049 3050 3051 3048 3053 3054 3055 3052 3057 3058 3059 3056 3061 3062 3063 3060 3065 3066 3067 3064 3069 3070 3071 3068 3073 3074 3075 3072 3077 3078 3079 3076 3081 3082 3083 3080 3085 3086 3087 3084 3089 3090 3091 3088 3093 3094 3095 3092 3097 3098 3099 3096 3101 3102 3103 3100 3105 3106 3107 3104 3109 3110 3111 3108 3113 3114 3115 3112 3117 3118 3119 3116 3121 3122 3123 3120 3125 3126 3127 3124 3129 3130 3131 3128 3133 3134 3135 3132 3137 3138 3139 3136 3141 3142 3143 3140 3145 3146 3147 3144 3149 3150 3151 3148 3153 3154 3155 3152 3157 3158 3159 3156 3161 3162 3163 3160 3165 3166 3167 3164 3169 3170 3171 3168 3173 3174 3175 3172 3177 3178 3179 3176 3181 3182 3183 3180 3185 3186 3187 3184 3189 3190 3191 3188 3193 3194 3195 3192 3197 3198 3199 3196 3201 3202 3203 3200 3205 3206 3207 3204 3209 3210 3211 3208 3213 3214 3215 3212 3217 3218 3219 3216 3221 3222 3223 3220 3225 3226 3227 3224 3229 3230 3231 3228 3233 3234 3235 3232 3237 3238 3239 3236 3241 3242 3243 3240 3245 3246 3247 3244 3249 3250 3251 3248 3253 3254 3255 3252 3257 3258 3259 3256 3261 3262 3263 3260 3265 3266 3267 3264 3269 3270 3271 3268 3273 3274 3275 3272 3277 3278 3279 3276 3281 3282 3283 3280 3285 3286 3287 3284 3289 3290 3291 3288 3293 3294 3295 3292 3297 3298 3299 3296 3301 3302 3303 3300 3305 3306 3307 3304 3309 3310 3311 3308 3313 3314 3315 3312 3317 3318 3319 3316 3321 3322 3323 3320 3325 3326 3327 3324 3329 3330 3331 3328 3333 3334 3335 3332 3337 3338 3339 3336 3341 3342 3343 3340 3345 3346 3347 3344 3349 3350 3348 3352 3353 3354 3351 3356 3357 3358 3355 3360 3361 3362 3359 3364 3365 3366 3363 3368 3369 3370 3367 3372 3373 3374 3371 3376 3377 3378 3375 3380 3381 3382 3379 3384 3385 3386 3383 3388 3389 3390 3387 3392 3393 3394 3391 3396 3397 3398 3395 3400 3401 3402 3399 3404 3405 3406 3403 3408 3409 3410 3407 3412 3413 3414 3411 3416 3417 3418 3415 3420 3421 3422 3419 3424 3425 3426 3423 3428 3429 3430 3427 3432 3433 3434 3431 3436 3437 3438 3435 3440 3441 3442 3439 3444 3445 3446 3443 3448 3449 3450 3447 3452 3453 3454 3451 3456 3457 3458 3455 3460 3461 3462 3459 3464 3465 3466 3463 3468 3469 3470 3467 3472 3473 3474 3471 3476 3477 3475 3479 3480 3478 3482 3483 3481 3485 3486 3484 3488 3489 3487 3491 3492 3490 3494 3495 3493 3497 3498 3496 3500 3501 3499 3503 3504 3502 3506 3507 3505 3509 3510 3508 3512 3513 3511 3515 3516 3517 3514 3519 3520 3521 3518 3523 3524 3525 3522 3527 3528 3529 3526 3531 3532 3533 3530 3535 3536 3537 3534 3539 3540 3541 3538 3543 3544 3545 3542 3547 3548 3549 3546 3551 3552 3553 3550 3555 3556 3557 3554 3559 3560 3561 3558 3563 3564 3565 3562 3567 3568 3569 3566 3571 3572 3573 3570 3575 3576 3577 3574 3579 3580 3581 3578 3583 3584 3585 3582 3587 3588 3589 3586 3591 3592 3593 3590 3595 3596 3597 3594 3599 3600 3601 3598 3603 3604 3605 3602 3607 3608 3609 3606 3611 3612 3613 3610 3615 3616 3617 3614 3619 3620 3621 3618 3623 3624 3625 3622 3627 3628 3629 3626 3631 3632 3633 3630 3635 3636 3637 3634 3639 3640 3641 3638 3643 3644 3645 3642 3647 3648 3649 3646 3651 3652 3653 3650 3655 3656 3657 3654 3659 3660 3661 3658 3663 3664 3665 3662 3667 3668 3669 3666 3671 3672 3673 3670 3675 3676 3677 3674 3679 3680 3681 3678 3683 3684 3685 3682 3687 3688 3689 3686 3691 3692 3693 3690 3695 3696 3697 3694 3699 3700 3701 3698 3703 3704 3705 3702 3707 3708 3709 3706 3711 3712 3713 3710 3715 3716 3717 3714 3719 3720 3721 3718 3723 3724 3725 3722 3727 3728 3729 3726 3731 3732 3733 3730 3735 3736 3737 3734 3739 3740 3741 3738 3743 3744 3745 3742 3747 3748 3749 3746 3751 3752 3753 3750 3755 3756 3757 3754 3759 3760 3761 3758 3763 3764 3765 3762 3767 3768 3769 3766 3771 3772 3773 3770 3775 3776 3777 3774 3779 3780 3781 3778 3783 3784 3785 3782 3787 3788 3789 3786 3791 3792 3793 3790 3795 3796 3797 3794 3799 3800 3801 3798 3803 3804 3805 3802 3807 3808 3809 3806 3811 3812 3813 3810 3815 3816 3817 3814 3819 3820 3821 3818 3823 3824 3825 3822 3827 3828 3829 3826 3831 3832 3833 3830 3835 3836 3837 3834 3839 3840 3841 3838 3843 3844 3845 3842 3847 3848 3849 3846 3851 3852 3853 3850 3855 3856 3857 3854 3859 3860 3861 3858 3863 3864 3865 3862 3867 3868 3869 3866 3871 3872 3873 3870 3875 3876 3877 3874 3879 3880 3881 3878 3883 3884 3885 3882 3887 3888 3889 3886 3891 3892 3893 3890 3895 3896 3897 3894 3899 3900 3901 3898 3903 3904 3905 3902 3907 3908 3909 3906 3911 3912 3913 3910 3915 3916 3917 3914 3919 3920 3921 3918 3923 3924 3925 3922 3927 3928 3929 3926 3931 3932 3933 3930 3935 3936 3937 3934 3939 3940 3941 3938 3943 3944 3945 3942 3947 3948 3949 3946 3951 3952 3953 3950 3955 3956 3957 3954 3959 3960 3961 3958 3963 3964 3965 3962 3967 3968 3969 3966 3971 3972 3973 3970 3975 3976 3977 3974 3979 3980 3981 3978 3983 3984 3985 3982 3987 3988 3989 3986 3991 3992 3993 3990 3995 3996 3997 3994 3999 4000 4001 3998 4003 4004 4005 4002 4007 4008 4009 4006 4011 4012 4013 4010 4015 4016 4017 4014 4019 4020 4021 4018 4023 4024 4025 4022 4027 4028 4029 4026 4031 4032 4033 4030 4035 4036 4037 4034 4039 4040 4041 4038 4043 4044 4045 4042 4047 4048 4049 4046 4051 4052 4053 4050 4055 4056 4057 4054 4059 4060 4061 4058 4063 4064 4065 4062 4067 4068 4069 4066 4071 4072 4073 4070 4075 4076 4077 4078 4074 4080 4081 4082 4079 4084 4085 4086 4083 4088 4089 4090 4087 4092 4093 4094 4095 4091 4097 4098 4099 4096 4101 4102 4103 4100 4105 4106 4107 4104 4109 4110 4111 4108 4113 4114 4115 4112 4117 4118 4119 4116 4121 4122 4123 4120 4125 4126 4127 4124 4129 4130 4131 4128 4133 4134 4135 4132 4137 4138 4139 4136 4141 4142 4143 4140 4145 4146 4147 4144 4149 4150 4151 4148 4153 4154 4155 4152 4157 4158 4159 4156 4161 4162 4163 4160 4165 4166 4167 4164 4169 4170 4171 4168 4173 4174 4175 4172 4177 4178 4179 4176 4181 4182 4183 4180 4185 4186 4184 4188 4189 4187 4191 4192 4193 4190 4195 4196 4194 4198 4199 4200 4197 4202 4203 4204 4201 4206 4207 4208 4205 4210 4211 4212 4209 4214 4215 4216 4213 4218 4219 4220 4217 4222 4223 4224 4221 4226 4227 4228 4225 4230 4231 4232 4229 4234 4235 4236 4233 4238 4239 4240 4237 4242 4243 4244 4241 4246 4247 4248 4245 4250 4251 4252 4249 4254 4255 4256 4253 4258 4259 4260 4257 4262 4263 4264 4261 4266 4267 4268 4265 4270 4271 4269 4273 4274 4275 4272 4277 4278 4279 4276 4281 4282 4283 4280 4285 4286 4287 4284 4289 4290 4291 4288 4293 4294 4295 4292 4297 4298 4299 4296 4301 4302 4303 4300 4305 4306 4307 4304 4309 4310 4311 4308 4313 4314 4315 4312 4317 4318 4319 4316 4321 4322 4320 4324 4325 4326 4323 4328 4329 4330 4327 4332 4333 4334 4331 4336 4337 4338 4335 4340 4341 4342 4339 4344 4345 4346 4343 4348 4349 4350 4347 4352 4353 4354 4351 4356 4357 4358 4355 4360 4361 4362 4359 4364 4365 4366 4363 4368 4369 4370 4367 4372 4373 4374 4371 4376 4377 4378 4375 4380 4381 4382 4379 4384 4385 4386 4383 4388 4389 4390 4387 4392 4393 4394 4391 4396 4397 4398 4395 4400 4401 4402 4399 4404 4405 4406 4403 4408 4409 4410 4407 4412 4413 4414 4411 4416 4417 4418 4415 4420 4421 4422 4419 4424 4425 4426 4423 4428 4429 4430 4427 4432 4433 4434 4431 4436 4437 4438 4435 4440 4441 4442 4439 4444 4445 4446 4443 4448 4449 4450 4447 4452 4453 4454 4451 4456 4457 4458 4455 4460 4461 4462 4459 4464 4465 4466 4463 4468 4469 4470 4467 4472 4473 4474 4471 4476 4477 4478 4475 4480 4481 4482 4479 4484 4485 4486 4483 4488 4489 4490 4487 4492 4493 4494 4491 4496 4497 4498 4495 4500 4501 4502 4499 4504 4505 4506 4503 4508 4509 4510 4507 4512 4513 4514 4511 4516 4517 4518 4515 4520 4521 4522 4519 4524 4525 4526 4523 4528 4529 4530 4527 4532 4533 4534 4531 4536 4537 4538 4535 4540 4541 4542 4539 4544 4545 4546 4543 4548 4549 4550 4547 4552 4553 4554 4551 4556 4557 4558 4555 4560 4561 4562 4559 4564 4565 4566 4563 4568 4569 4570 4567 4572 4573 4574 4571 4576 4577 4578 4575 4580 4581 4582 4579 4584 4585 4586 4583 4588 4589 4590 4587 4592 4593 4594 4591 4596 4597 4598 4595 4600 4601 4602 4599 4604 4605 4606 4603 4608 4609 4610 4607 4612 4613 4614 4611 4616 4617 4618 4615 4620 4621 4622 4619 4624 4625 4626 4623 4628 4629 4630 4627 4632 4633 4634 4631 4636 4637 4638 4635 4640 4641 4642 4639 4644 4645 4646 4643 4648 4649 4650 4647 4652 4653 4654 4651 4656 4657 4658 4655 4660 4661 4662 4659 4664 4665 4666 4663 4668 4669 4670 4667 4672 4673 4674 4671 4676 4677 4678 4675 4680 4681 4682 4679 4684 4685 4686 4683 4688 4689 4690 4687 4692 4693 4694 4691 4696 4697 4698 4695 4700 4701 4702 4699 4704 4705 4706 4703 4708 4709 4710 4707 4712 4713 4714 4711 4716 4717 4718 4715 4720 4721 4722 4719 4724 4725 4726 4723 4728 4729 4730 4727 4732 4733 4731 4735 4736 4737 4734 4739 4740 4741 4738 4743 4744 4745 4742 4747 4748 4749 4746 4751 4752 4753 4750 4755 4756 4757 4754 4759 4760 4761 4758 4763 4764 4765 4762 4767 4768 4769 4766 4771 4772 4773 4770 4775 4776 4777 4774 4779 4780 4781 4778 4783 4784 4785 4782 4787 4788 4789 4786 4791 4792 4793 4790 4795 4796 4797 4794 4799 4800 4801 4798 4803 4804 4805 4802 4807 4808 4809 4806 4811 4812 4813 4810 4815 4816 4817 4814 4819 4820 4821 4818 4823 4824 4825 4822 4827 4828 4829 4826 4831 4832 4833 4830 4835 4836 4837 4834 4839 4840 4841 4838 4843 4844 4845 4842 4847 4848 4849 4846 4851 4852 4853 4850 4855 4856 4857 4854 4859 4860 4861 4858 4863 4864 4865 4862 4867 4868 4869 4866 4871 4872 4873 4870 4875 4876 4877 4874 4879 4880 4881 4878 4883 4884 4885 4882 4887 4888 4889 4886 4891 4892 4893 4890 4895 4896 4897 4894 4899 4900 4901 4898 4903 4904 4905 4902 4907 4908 4909 4906 4911 4912 4913 4910 4915 4916 4917 4914 4919 4920 4921 4918 4923 4924 4925 4922 4927 4928 4929 4926 4931 4932 4933 4930 4935 4936 4937 4934 4939 4940 4941 4938 4943 4944 4945 4942 4947 4948 4949 4946 4951 4952 4953 4954 4950 4956 4957 4958 4955 4960 4961 4959 4963 4964 4962 4966 4967 4968 4965 4970 4971 4972 4969 4974 4975 4976 4973 4978 4979 4980 4977 4982 4983 4984 4981 4986 4987 4988 4985 4990 4991 4992 4989 4994 4995 4996 4993 4998 4999 5000 4997 5002 5003 5004 5001 5006 5007 5008 5005 5010 5011 5012 5009 5014 5015 5016 5013 5018 5019 5020 5017 5022 5023 5024 5021 5026 5027 5028 5025 5030 5031 5032 5029 5034 5035 5036 5033 5038 5039 5040 5037 5042 5043 5044 5041 5046 5047 5048 5045 5050 5051 5052 5049 5054 5055 5056 5053 5058 5059 5060 5057 5062 5063 5064 5061 5066 5067 5068 5065 5070 5071 5072 5069 5074 5075 5076 5073 5078 5079 5080 5077 5082 5083 5084 5081 5086 5087 5088 5085 5090 5091 5092 5089 5094 5095 5096 5093 5098 5099 5100 5097 5102 5103 5104 5101 5106 5107 5108 5105 5110 5111 5112 5109 5114 5115 5116 5113 5118 5119 5120 5117 5122 5123 5124 5121 5126 5127 5128 5125 5130 5131 5132 5129 5134 5135 5136 5133 5138 5139 5140 5137 5142 5143 5144 5141 5146 5147 5148 5145 5150 5151 5152 5149 5154 5155 5156 5153 5158 5159 5160 5157 5162 5163 5161 5165 5166 5167 5164 5169 5170 5171 5168 5173 5174 5175 5172 5177 5178 5179 5176 5181 5182 5183 5180 5185 5186 5187 5184 5189 5190 5191 5188 5193 5194 5195 5192 5197 5198 5199 5196 5201 5202 5203 5200 5205 5206 5207 5204 5209 5210 5211 5208 5213 5214 5215 5212 5217 5218 5219 5216 5221 5222 5223 5220 5225 5226 5227 5224 5229 5230 5231 5228 5233 5234 5235 5232 5237 5238 5239 5236 5241 5242 5243 5240 5245 5246 5247 5244 5249 5250 5251 5248 5253 5254 5255 5252 5257 5258 5259 5256 5261 5262 5263 5260 5265 5266 5267 5264 5269 5270 5271 5268 5273 5274 5275 5272 5277 5278 5279 5276 5281 5282 5283 5280 5285 5286 5287 5284 5289 5290 5291 5288 5293 5294 5295 5292 5297 5298 5299 5296 5301 5302 5303 5300 5305 5306 5307 5304 5309 5310 5311 5308 5313 5314 5315 5312 5317 5318 5319 5316 5321 5322 5323 5320 5325 5326 5327 5324 5329 5330 5331 5328 5333 5334 5335 5332 5337 5338 5339 5336 5341 5342 5343 5340 5345 5346 5347 5344 5349 5350 5351 5348 5353 5354 5355 5352 5357 5358 5359 5356 5361 5362 5363 5360 5365 5366 5367 5364 5369 5370 5371 5368 5373 5374 5375 5372 5377 5378 5379 5376 5381 5382 5383 5380 5385 5386 5387 5384 5389 5390 5391 5388 5393 5394 5395 5392 5397 5398 5399 5396 5401 5402 5403 5400 5405 5406 5407 5404 5409 5410 5411 5408 5413 5414 5415 5412 5417 5418 5419 5416 5421 5422 5423 5420 5425 5426 5427 5424 5429 5430 5431 5428 5433 5434 5435 5432 5437 5438 5439 5436 5441 5442 5443 5440 5445 5446 5447 5444 5449 5450 5451 5448 5453 5454 5455 5452 5457 5458 5459 5456 5461 5462 5463 5460 5465 5466 5467 5464 5469 5470 5471 5468 5473 5474 5475 5472 5477 5478 5479 5476 5481 5482 5483 5480 5485 5486 5487 5484 5489 5490 5491 5488 5493 5494 5495 5492 5497 5498 5499 5496 5501 5502 5503 5500 5505 5506 5507 5504 5509 5510 5511 5508 5513 5514 5515 5512 5517 5518 5519 5516 5521 5522 5523 5520 5525 5526 5527 5524 5529 5530 5531 5528 5533 5534 5535 5532 5537 5538 5539 5536 5541 5542 5543 5540 5545 5546 5547 5544 5549 5550 5551 5548 5553 5554 5555 5552 5557 5558 5559 5556 5561 5562 5563 5560 5565 5566 5567 5564 5569 5570 5571 5568 5573 5574 5575 5572 5577 5578 5579 5576 5581 5582 5583 5580 5585 5586 5587 5584 5589 5590 5591 5588 5593 5594 5595 5592 5597 5598 5599 5596 5601 5602 5603 5600 5605 5606 5607 5604 5609 5610 5611 5608 5613 5614 5615 5612 5617 5618 5619 5616 5621 5622 5623 5620 5625 5626 5627 5624 5629 5630 5631 5628 5633 5634 5635 5632 5637 5638 5639 5636 5641 5642 5643 5640 5645 5646 5647 5644 5649 5650 5651 5648 5653 5654 5655 5652 5657 5658 5659 5656 5661 5662 5663 5660 5665 5666 5667 5664 5669 5670 5671 5668 5673 5674 5675 5672 5677 5678 5679 5676 5681 5682 5683 5680 5685 5686 5687 5684 5689 5690 5691 5688 5693 5694 5695 5692 5697 5698 5699 5696 5701 5702 5703 5700 5705 5706 5707 5704 5709 5710 5711 5708 5713 5714 5715 5712 5717 5718 5719 5716 5721 5722 5723 5720 5725 5726 5727 5724 5729 5730 5731 5728 5733 5734 5735 5732 5737 5738 5739 5736 5741 5742 5743 5740 5745 5746 5747 5744 5749 5750 5751 5748 5753 5754 5755 5752 5757 5758 5759 5756 5761 5762 5763 5760 5765 5766 5767 5764 5769 5770 5768 5772 5773 5774 5771 5776 5777 5778 5775 5780 5781 5782 5779 5784 5785 5786 5783 5788 5789 5790 5787 5792 5793 5794 5791 5796 5797 5798 5795 5800 5801 5802 5799 5804 5805 5806 5803 5808 5809 5810 5807 5812 5813 5814 5811 5816 5817 5818 5815 5820 5821 5822 5819 5824 5825 5826 5823 5828 5829 5830 5827 5832 5833 5834 5831 5836 5837 5838 5835 5840 5841 5842 5839 5844 5845 5846 5843 5848 5849 5850 5847 5852 5853 5854 5851 5856 5857 5858 5855 5860 5861 5862 5859 5864 5865 5866 5863 5868 5869 5870 5867 5872 5873 5874 5871 5876 5877 5878 5875 5880 5881 5882 5879 5884 5885 5886 5883 5888 5889 5890 5887 5892 5893 5894 5891 5896 5897 5895 5899 5900 5898 5902 5903 5901 5905 5906 5904 5908 5909 5907 5911 5912 5910 5914 5915 5913 5917 5918 5916 5920 5921 5919 5923 5924 5922 5926 5927 5925 5929 5930 5928 5932 5933 5931 5935 5936 5937 5934 5939 5940 5941 5938 5943 5944 5945 5942 5947 5948 5949 5946 5951 5952 5953 5950 5955 5956 5957 5954 5959 5960 5961 5958 5963 5964 5965 5962 5967 5968 5969 5966 5971 5972 5973 5970 5975 5976 5977 5974 5979 5980 5981 5978 5983 5984 5985 5982 5987 5988 5989 5986 5991 5992 5993 5990 5995 5996 5997 5994 5999 6000 6001 5998 6003 6004 6005 6002 6007 6008 6009 6006 6011 6012 6013 6010 6015 6016 6017 6014 6019 6020 6021 6018 6023 6024 6025 6022 6027 6028 6029 6026 6031 6032 6033 6030 6035 6036 6037 6034 6039 6040 6041 6038 6043 6044 6045 6042 6047 6048 6049 6046 6051 6052 6053 6050 6055 6056 6057 6054 6059 6060 6061 6058 6063 6064 6065 6062 6067 6068 6069 6066 6071 6072 6073 6070 6075 6076 6077 6074 6079 6080 6081 6078 6083 6084 6085 6082 6087 6088 6089 6086 6091 6092 6093 6090 6095 6096 6097 6094 6099 6100 6101 6098 6103 6104 6105 6102 6107 6108 6109 6106 6111 6112 6113 6110 6115 6116 6117 6114 6119 6120 6121 6118 6123 6124 6125 6122 6127 6128 6129 6126 6131 6132 6133 6130 6135 6136 6137 6134 6139 6140 6141 6138 6143 6144 6145 6142 6147 6148 6149 6146 6151 6152 6153 6150 6155 6156 6157 6154 6159 6160 6161 6158 6163 6164 6165 6162 6167 6168 6169 6166 6171 6172 6173 6170 6175 6176 6177 6174 6179 6180 6181 6178 6183 6184 6185 6182 6187 6188 6189 6186 6191 6192 6193 6190 6195 6196 6197 6194 6199 6200 6201 6198 6203 6204 6205 6202 6207 6208 6209 6206 6211 6212 6213 6210 6215 6216 6217 6214 6219 6220 6221 6218 6223 6224 6225 6222 6227 6228 6229 6226 6231 6232 6233 6230 6235 6236 6237 6234 6239 6240 6241 6238 6243 6244 6245 6242 6247 6248 6249 6246 6251 6252 6253 6250 6255 6256 6257 6254 6259 6260 6261 6258 6263 6264 6265 6262 6267 6268 6269 6266 6271 6272 6273 6270 6275 6276 6277 6274 6279 6280 6281 6278 6283 6284 6285 6282 6287 6288 6289 6286 6291 6292 6293 6290 6295 6296 6297 6294 6299 6300 6301 6298 6303 6304 6305 6302 6307 6308 6309 6306 6311 6312 6313 6310 6315 6316 6317 6314 6319 6320 6321 6318 6323 6324 6325 6322 6327 6328 6329 6326 6331 6332 6333 6330 6335 6336 6337 6334 6339 6340 6341 6338 6343 6344 6345 6342 6347 6348 6349 6346 6351 6352 6353 6350 6355 6356 6357 6354 6359 6360 6361 6358 6363 6364 6365 6362 6367 6368 6369 6366 6371 6372 6373 6370 6375 6376 6377 6374 6379 6380 6381 6378 6383 6384 6385 6382 6387 6388 6389 6386 6391 6392 6393 6390 6395 6396 6397 6394 6399 6400 6401 6398 6403 6404 6405 6402 6407 6408 6409 6406 6411 6412 6413 6410 6415 6416 6417 6414 6419 6420 6421 6418 6423 6424 6425 6422 6427 6428 6429 6426 6431 6432 6433 6430 6435 6436 6437 6434 6439 6440 6441 6438 6443 6444 6445 6442 6447 6448 6449 6446 6451 6452 6453 6450 6455 6456 6457 6454 6459 6460 6461 6458 6463 6464 6465 6462 6467 6468 6469 6466 6471 6472 6473 6470 6475 6476 6477 6474 6479 6480 6481 6478 6483 6484 6485 6482 6487 6488 6489 6486 6491 6492 6493 6490 6495 6496 6497 6498 6494 6500 6501 6502 6499 6504 6505 6506 6503 6508 6509 6510 6507 6512 6513 6514 6515 6511 6517 6518 6519 6516 6521 6522 6523 6520 6525 6526 6527 6524 6529 6530 6531 6528 6533 6534 6535 6532 6537 6538 6539 6536 6541 6542 6543 6540 6545 6546 6547 6544 6549 6550 6551 6548 6553 6554 6555 6552 6557 6558 6559 6556 6561 6562 6563 6560 6565 6566 6567 6564 6569 6570 6571 6568 6573 6574 6575 6572 6577 6578 6579 6576 6581 6582 6583 6580 6585 6586 6587 6584 6589 6590 6591 6588 6593 6594 6595 6592 6597 6598 6599 6596 6601 6602 6603 6600 6605 6606 6604 6608 6609 6607 6611 6612 6613 6610 6615 6616 6614 6618 6619 6620 6617 6622 6623 6624 6621 6626 6627 6628 6625 6630 6631 6632 6629 6634 6635 6636 6633 6638 6639 6640 6637 6642 6643 6644 6641 6646 6647 6648 6645 6650 6651 6652 6649 6654 6655 6656 6653 6658 6659 6660 6657 6662 6663 6664 6661 6666 6667 6668 6665 6670 6671 6672 6669 6674 6675 6676 6673 6678 6679 6680 6677 6682 6683 6684 6681 6686 6687 6688 6685 6690 6691 6689 6693 6694 6695 6692 6697 6698 6699 6696 6701 6702 6703 6700 6705 6706 6707 6704 6709 6710 6711 6708 6713 6714 6715 6712 6717 6718 6719 6716 6721 6722 6723 6720 6725 6726 6727 6724 6729 6730 6731 6728 6733 6734 6735 6732 6737 6738 6739 6736 6741 6742 6740 6744 6745 6746 6743 6748 6749 6750 6747 6752 6753 6754 6751 6756 6757 6758 6755 6760 6761 6762 6759 6764 6765 6766 6763 6768 6769 6770 6767 6772 6773 6774 6771 6776 6777 6778 6775 6780 6781 6782 6779 6784 6785 6786 6783 6788 6789 6790 6787 6792 6793 6794 6791 6796 6797 6798 6795 6800 6801 6802 6799 6804 6805 6806 6803 6808 6809 6810 6807 6812 6813 6814 6811 6816 6817 6818 6815 6820 6821 6822 6819 6824 6825 6826 6823 6828 6829 6830 6827 6832 6833 6834 6831 6836 6837 6838 6835 6840 6841 6842 6839 6844 6845 6846 6843 6848 6849 6850 6847 6852 6853 6854 6851 6856 6857 6858 6855 6860 6861 6862 6859 6864 6865 6866 6863 6868 6869 6870 6867 6872 6873 6874 6871 6876 6877 6878 6875 6880 6881 6882 6879 6884 6885 6886 6883 6888 6889 6890 6887 6892 6893 6894 6891 6896 6897 6898 6895 6900 6901 6902 6899 6904 6905 6906 6903 6908 6909 6910 6907 6912 6913 6914 6911 6916 6917 6918 6915 6920 6921 6922 6919 6924 6925 6926 6923 6928 6929 6930 6927 6932 6933 6934 6931 6936 6937 6938 6935 6940 6941 6942 6939 6944 6945 6946 6943 6948 6949 6950 6947 6952 6953 6954 6951 6956 6957 6958 6955 6960 6961 6962 6959 6964 6965 6966 6963 6968 6969 6970 6967 6972 6973 6974 6971 6976 6977 6978 6975 6980 6981 6982 6979 6984 6985 6986 6983 6988 6989 6990 6987 6992 6993 6994 6991 6996 6997 6998 6995 7000 7001 7002 6999 7004 7005 7006 7003 7008 7009 7010 7007 7012 7013 7014 7011 7016 7017 7018 7015 7020 7021 7022 7019 7024 7025 7026 7023 7028 7029 7030 7027 7032 7033 7034 7031 7036 7037 7038 7035 7040 7041 7042 7039 7044 7045 7046 7043 7048 7049 7050 7047 7052 7053 7054 7051 7056 7057 7058 7055 7060 7061 7062 7059 7064 7065 7066 7063 7068 7069 7070 7067 7072 7073 7074 7071 7076 7077 7078 7075 7080 7081 7082 7079 7084 7085 7086 7083 7088 7089 7090 7087 7092 7093 7094 7091 7096 7097 7098 7095 7100 7101 7102 7099 7104 7105 7106 7103 7108 7109 7110 7107 7112 7113 7114 7111 7116 7117 7118 7115 7120 7121 7122 7119 7124 7125 7126 7123 7128 7129 7130 7127 7132 7133 7134 7131 7136 7137 7138 7135 7140 7141 7142 7139 7144 7145 7146 7143 7148 7149 7150 7147 7152 7153 7151 7155 7156 7157 7154 7159 7160 7161 7158 7163 7164 7165 7162 7167 7168 7169 7166 7171 7172 7173 7170 7175 7176 7177 7174 7179 7180 7181 7178 7183 7184 7185 7182 7187 7188 7189 7186 7191 7192 7193 7190 7195 7196 7197 7194 7199 7200 7201 7198 7203 7204 7205 7202 7207 7208 7209 7206 7211 7212 7213 7210 7215 7216 7217 7214 7219 7220 7221 7218 7223 7224 7225 7222 7227 7228 7229 7226 7231 7232 7233 7230 7235 7236 7237 7234 7239 7240 7241 7238 7243 7244 7245 7242 7247 7248 7249 7246 7251 7252 7253 7250 7255 7256 7257 7254 7259 7260 7261 7258 7263 7264 7265 7262 7267 7268 7269 7266 7271 7272 7273 7270 7275 7276 7277 7274 7279 7280 7281 7278 7283 7284 7285 7282 7287 7288 7289 7286 7291 7292 7293 7290 7295 7296 7297 7294 7299 7300 7301 7298 7303 7304 7305 7302 7307 7308 7309 7306 7311 7312 7313 7310 7315 7316 7317 7314 7319 7320 7321 7318 7323 7324 7325 7322 7327 7328 7329 7326 7331 7332 7333 7330 7335 7336 7337 7334 7339 7340 7341 7338 7343 7344 7345 7342 7347 7348 7349 7346 7351 7352 7353 7350 7355 7356 7357 7354 7359 7360 7361 7358 7363 7364 7365 7362 7367 7368 7369 7366 7371 7372 7373 7374 7370 7376 7377 7378 7375 7380 7381 7379 7383 7384 7382 7386 7387 7388 7385 7390 7391 7392 7389 7394 7395 7396 7393 7398 7399 7400 7397 7402 7403 7404 7401 7406 7407 7408 7405 7410 7411 7412 7409 7414 7415 7416 7413 7418 7419 7420 7417 7422 7423 7424 7421 7426 7427 7428 7425 7430 7431 7432 7429 7434 7435 7436 7433 7438 7439 7440 7437 7442 7443 7444 7441 7446 7447 7448 7445 7450 7451 7452 7449 7454 7455 7456 7453 7458 7459 7460 7457 7462 7463 7464 7461 7466 7467 7468 7465 7470 7471 7472 7469 7474 7475 7476 7473 7478 7479 7480 7477 7482 7483 7484 7481 7486 7487 7488 7485 7490 7491 7492 7489 7494 7495 7496 7493 7498 7499 7500 7497 7502 7503 7504 7501 7506 7507 7508 7505 7510 7511 7512 7509 7514 7515 7516 7513 7518 7519 7520 7517 7522 7523 7524 7521 7526 7527 7528 7525 7530 7531 7532 7529 7534 7535 7536 7533 7538 7539 7540 7537 7542 7543 7544 7541 7546 7547 7548 7545 7550 7551 7552 7549 7554 7555 7556 7553 7558 7559 7560 7557 7562 7563 7564 7561 7566 7567 7568 7565 7570 7571 7572 7569 7574 7575 7576 7573 7578 7579 7580 7577 7582 7583 7581 7585 7586 7587 7584 7589 7590 7591 7588 7593 7594 7595 7592 7597 7598 7599 7596 7601 7602 7603 7600 7605 7606 7607 7604 7609 7610 7611 7608 7613 7614 7615 7612 7617 7618 7616 7620 7621 7622 7619 7624 7625 7626 7623 7628 7629 7630 7627 7632 7633 7634 7631 7636 7637 7638 7635 7640 7641 7642 7639 7644 7645 7646 7643 7648 7649 7650 7647 7652 7653 7654 7651 7656 7657 7658 7655 7660 7661 7662 7659 7664 7665 7666 7663 7668 7669 7670 7667 7672 7673 7674 7671 7676 7677 7678 7675 7680 7681 7682 7679 7684 7685 7686 7683 7688 7689 7690 7687 7692 7693 7694 7691 7696 7697 7698 7695 7700 7701 7702 7699 7704 7705 7706 7703 7708 7709 7710 7707 7712 7713 7714 7711 7716 7717 7718 7715 7720 7721 7722 7719 7724 7725 7726 7723 7728 7729 7730 7727 7732 7733 7734 7731 7736 7737 7738 7735 7740 7741 7742 7739 7744 7745 7746 7743 7748 7749 7750 7747 7752 7753 7754 7751 7756 7757 7758 7755 7760 7761 7762 7759 7764 7765 7766 7763 7768 7769 7770 7767 7772 7773 7774 7771 7776 7777 7778 7775 7780 7781 7782 7779 7784 7785 7786 7783 7788 7789 7790 7787 7792 7793 7794 7791 7796 7797 7798 7795 7800 7801 7802 7799 7804 7805 7806 7803 7808 7809 7810 7807 7812 7813 7814 7811 7816 7817 7818 7815 7820 7821 7822 7819 7824 7825 7826 7823 7828 7829 7830 7827 7832 7833 7834 7831 7836 7837 7838 7835 7840 7841 7842 7839 7844 7845 7846 7843 7848 7849 7850 7847 7852 7853 7854 7851 7856 7857 7858 7855 7860 7861 7862 7859 7864 7865 7866 7863 7868 7869 7870 7867 7872 7873 7874 7871 7876 7877 7878 7875 7880 7881 7882 7879 7884 7885 7886 7883 7888 7889 7890 7887 7892 7893 7894 7891 7896 7897 7898 7895 7900 7901 7902 7899 7904 7905 7906 7903 7908 7909 7910 7907 7912 7913 7914 7911 7916 7917 7918 7915 7920 7921 7922 7919 7924 7925 7926 7923 7928 7929 7930 7927 7932 7933 7934 7931 7936 7937 7938 7935 7940 7941 7942 7939 7944 7945 7946 7943 7948 7949 7950 7947 7952 7953 7954 7951 7956 7957 7958 7955 7960 7961 7959 7963 7964 7962 7966 7967 7965 7969 7970 7971 7968 7973 7974 7975 7972 7977 7978 7979 7976 7981 7982 7983 7980 7985 7986 7987 7984 7989 7990 7991 7988 7993 7994 7995 7992 7997 7998 7999 7996 8001 8002 8003 8000 8005 8006 8007 8004 8009 8010 8011 8008 8013 8014 8015 8012 8017 8018 8019 8016 8021 8022 8023 8020 8025 8026 8027 8024 8029 8030 8031 8028 8033 8034 8035 8032 8037 8038 8039 8036 8041 8042 8043 8040 8045 8046 8047 8044 8049 8050 8051 8048 8053 8054 8055 8052 8057 8058 8059 8056 8061 8062 8063 8060 8065 8066 8067 8064 8069 8070 8071 8068 8073 8074 8075 8072 8077 8078 8079 8076 8081 8082 8083 8080 8085 8086 8084 8088 8089 8087 8091 8092 8090 8094 8095 8093 8097 8098 8096 8100 8101 8099 8103 8104 8102 8106 8107 8105 8109 8110 8108 8112 8113 8111 8115 8116 8114 8118 8119 8117 8121 8122 8123 8120 8125 8126 8124 8128 8129 8127 8131 8132 8130 8134 8135 8133 8137 8138 8136 8140 8141 8139 8143 8144 8142 8146 8147 8145 8149 8150 8148 8152 8153 8151 8155 8156 8154 8158 8159 8157 8161 8162 8160 8164 8165 8163 8167 8168 8169 8166 8171 8172 8173 8170 8175 8176 8174 8178 8179 8180 8177 8182 8183 8184 8181 8186 8187 8188 8185 8190 8191 8192 8189 8194 8195 8196 8193 8198 8199 8200 8197 8202 8203 8204 8201 8206 8207 8208 8205 8210 8211 8212 8209 8214 8215 8216 8213 8218 8219 8220 8217 8222 8223 8224 8221 8226 8227 8228 8225 8230 8231 8232 8229 8234 8235 8236 8233 8238 8239 8240 8237 8242 8243 8244 8241 8246 8247 8248 8245 8250 8251 8252 8249 8254 8255 8256 8253 8258 8259 8260 8257 8262 8263 8264 8261 8266 8267 8268 8265 8270 8271 8272 8269 8274 8275 8276 8273 8278 8279 8280 8277 8282 8283 8284 8281 8286 8287 8288 8285 8290 8291 8292 8289 8294 8295 8296 8293 8298 8299 8300 8297 8302 8303 8304 8301 8306 8307 8308 8305 8310 8311 8309 8313 8314 8312 8316 8317 8315 8319 8320 8321 8318 8323 8324 8325 8322 8327 8328 8329 8326 8331 8332 8333 8330 8335 8336 8337 8334 8339 8340 8341 8338 8343 8344 8345 8342 8347 8348 8349 8346 8351 8352 8353 8350 8355 8356 8357 8354 8359 8360 8361 8358 8363 8364 8365 8362 8367 8368 8369 8366 8371 8372 8373 8370 8375 8376 8377 8374 8379 8380 8381 8378 8383 8384 8385 8382 8387 8388 8389 8386 8391 8392 8393 8390 8395 8396 8397 8394 8399 8400 8401 8398 8403 8404 8405 8402 8407 8408 8409 8406 8411 8412 8413 8410 8415 8416 8417 8414 8419 8420 8421 8418 8423 8424 8425 8422 8427 8428 8429 8426 8431 8432 8433 8430 8435 8436 8437 8434 8439 8440 8441 8438 8443 8444 8445 8442 8447 8448 8449 8446 8451 8452 8453 8450 8455 8456 8457 8454 8459 8460 8461 8458 8463 8464 8465 8462 8467 8468 8469 8466 8471 8472 8473 8470 8475 8476 8477 8474 8479 8480 8481 8478 8483 8484 8485 8482 8487 8488 8489 8486 8491 8492 8493 8490 8495 8496 8494 8498 8499 8497</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 611 615 619 623 627 631 635 639 643 647 651 655 659 663 667 671 675 679 683 687 691 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1900 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048 2052 2056 2060 2064 2067 2071 2075 2079 2083 2087 2091 2095 2099 2103 2107 2111 2115 2119 2123 2127 2131 2135 2139 2143 2147 2152 2156 2160 2164 2168 2172 2176 2180 2184 2188 2192 2196 2200 2204 2208 2212 2216 2220 2224 2228 2232 2236 2240 2244 2248 2252 2256 2260 2264 2268 2272 2276 2280 2284 2288 2292 2296 2300 2304 2308 2312 2316 2320 2324 2328 2332 2336 2340 2344 2348 2352 2356 2360 2364 2368 2372 2376 2380 2384 2388 2392 2396 2400 2404 2408 2412 2416 2420 2424 2428 2432 2436 2440 2444 2448 2452 2456 2460 2464 2468 2472 2476 2480 2484 2488 2492 2496 2500 2504 2508 2512 2516 2520 2524 2528 2532 2536 2540 2544 2548 2552 2556 2560 2564 2568 2572 2576 2580 2584 2588 2592 2596 2600 2604 2608 2612 2616 2620 2624 2628 2632 2636 2640 2644 2648 2652 2656 2660 2664 2668 2672 2676 2680 2684 2688 2692 2696 2700 2704 2708 2712 2716 2720 2724 2728 2732 2736 2740 2744 2748 2752 2756 2760 2764 2768 2772 2776 2780 2784 2788 2792 2796 2800 2804 2808 2812 2816 2820 2824 2828 2832 2836 2840 2844 2848 2852 2856 2860 2864 2868 2872 2876 2880 2884 2888 2892 2896 2900 2904 2908 2912 2916 2920 2924 2928 2932 2936 2940 2944 2948 2952 2956 2960 2964 2968 2972 2976 2980 2984 2988 2992 2996 3000 3004 3008 3012 3016 3020 3024 3028 3032 3036 3040 3044 3048 3052 3056 3060 3064 3068 3072 3076 3080 3084 3088 3092 3096 3100 3104 3108 3112 3116 3120 3124 3128 3132 3136 3140 3144 3148 3152 3156 3160 3164 3168 3172 3176 3180 3184 3188 3192 3196 3200 3204 3208 3212 3216 3220 3224 3228 3232 3236 3240 3244 3248 3252 3256 3260 3264 3268 3272 3276 3280 3284 3288 3292 3296 3300 3304 3308 3312 3316 3320 3324 3328 3332 3336 3340 3344 3348 3351 3355 3359 3363 3367 3371 3375 3379 3383 3387 3391 3395 3399 3403 3407 3411 3415 3419 3423 3427 3431 3435 3439 3443 3447 3451 3455 3459 3463 3467 3471 3475 3478 3481 3484 3487 3490 3493 3496 3499 3502 3505 3508 3511 3514 3518 3522 3526 3530 3534 3538 3542 3546 3550 3554 3558 3562 3566 3570 3574 3578 3582 3586 3590 3594 3598 3602 3606 3610 3614 3618 3622 3626 3630 3634 3638 3642 3646 3650 3654 3658 3662 3666 3670 3674 3678 3682 3686 3690 3694 3698 3702 3706 3710 3714 3718 3722 3726 3730 3734 3738 3742 3746 3750 3754 3758 3762 3766 3770 3774 3778 3782 3786 3790 3794 3798 3802 3806 3810 3814 3818 3822 3826 3830 3834 3838 3842 3846 3850 3854 3858 3862 3866 3870 3874 3878 3882 3886 3890 3894 3898 3902 3906 3910 3914 3918 3922 3926 3930 3934 3938 3942 3946 3950 3954 3958 3962 3966 3970 3974 3978 3982 3986 3990 3994 3998 4002 4006 4010 4014 4018 4022 4026 4030 4034 4038 4042 4046 4050 4054 4058 4062 4066 4070 4074 4079 4083 4087 4091 4096 4100 4104 4108 4112 4116 4120 4124 4128 4132 4136 4140 4144 4148 4152 4156 4160 4164 4168 4172 4176 4180 4184 4187 4190 4194 4197 4201 4205 4209 4213 4217 4221 4225 4229 4233 4237 4241 4245 4249 4253 4257 4261 4265 4269 4272 4276 4280 4284 4288 4292 4296 4300 4304 4308 4312 4316 4320 4323 4327 4331 4335 4339 4343 4347 4351 4355 4359 4363 4367 4371 4375 4379 4383 4387 4391 4395 4399 4403 4407 4411 4415 4419 4423 4427 4431 4435 4439 4443 4447 4451 4455 4459 4463 4467 4471 4475 4479 4483 4487 4491 4495 4499 4503 4507 4511 4515 4519 4523 4527 4531 4535 4539 4543 4547 4551 4555 4559 4563 4567 4571 4575 4579 4583 4587 4591 4595 4599 4603 4607 4611 4615 4619 4623 4627 4631 4635 4639 4643 4647 4651 4655 4659 4663 4667 4671 4675 4679 4683 4687 4691 4695 4699 4703 4707 4711 4715 4719 4723 4727 4731 4734 4738 4742 4746 4750 4754 4758 4762 4766 4770 4774 4778 4782 4786 4790 4794 4798 4802 4806 4810 4814 4818 4822 4826 4830 4834 4838 4842 4846 4850 4854 4858 4862 4866 4870 4874 4878 4882 4886 4890 4894 4898 4902 4906 4910 4914 4918 4922 4926 4930 4934 4938 4942 4946 4950 4955 4959 4962 4965 4969 4973 4977 4981 4985 4989 4993 4997 5001 5005 5009 5013 5017 5021 5025 5029 5033 5037 5041 5045 5049 5053 5057 5061 5065 5069 5073 5077 5081 5085 5089 5093 5097 5101 5105 5109 5113 5117 5121 5125 5129 5133 5137 5141 5145 5149 5153 5157 5161 5164 5168 5172 5176 5180 5184 5188 5192 5196 5200 5204 5208 5212 5216 5220 5224 5228 5232 5236 5240 5244 5248 5252 5256 5260 5264 5268 5272 5276 5280 5284 5288 5292 5296 5300 5304 5308 5312 5316 5320 5324 5328 5332 5336 5340 5344 5348 5352 5356 5360 5364 5368 5372 5376 5380 5384 5388 5392 5396 5400 5404 5408 5412 5416 5420 5424 5428 5432 5436 5440 5444 5448 5452 5456 5460 5464 5468 5472 5476 5480 5484 5488 5492 5496 5500 5504 5508 5512 5516 5520 5524 5528 5532 5536 5540 5544 5548 5552 5556 5560 5564 5568 5572 5576 5580 5584 5588 5592 5596 5600 5604 5608 5612 5616 5620 5624 5628 5632 5636 5640 5644 5648 5652 5656 5660 5664 5668 5672 5676 5680 5684 5688 5692 5696 5700 5704 5708 5712 5716 5720 5724 5728 5732 5736 5740 5744 5748 5752 5756 5760 5764 5768 5771 5775 5779 5783 5787 5791 5795 5799 5803 5807 5811 5815 5819 5823 5827 5831 5835 5839 5843 5847 5851 5855 5859 5863 5867 5871 5875 5879 5883 5887 5891 5895 5898 5901 5904 5907 5910 5913 5916 5919 5922 5925 5928 5931 5934 5938 5942 5946 5950 5954 5958 5962 5966 5970 5974 5978 5982 5986 5990 5994 5998 6002 6006 6010 6014 6018 6022 6026 6030 6034 6038 6042 6046 6050 6054 6058 6062 6066 6070 6074 6078 6082 6086 6090 6094 6098 6102 6106 6110 6114 6118 6122 6126 6130 6134 6138 6142 6146 6150 6154 6158 6162 6166 6170 6174 6178 6182 6186 6190 6194 6198 6202 6206 6210 6214 6218 6222 6226 6230 6234 6238 6242 6246 6250 6254 6258 6262 6266 6270 6274 6278 6282 6286 6290 6294 6298 6302 6306 6310 6314 6318 6322 6326 6330 6334 6338 6342 6346 6350 6354 6358 6362 6366 6370 6374 6378 6382 6386 6390 6394 6398 6402 6406 6410 6414 6418 6422 6426 6430 6434 6438 6442 6446 6450 6454 6458 6462 6466 6470 6474 6478 6482 6486 6490 6494 6499 6503 6507 6511 6516 6520 6524 6528 6532 6536 6540 6544 6548 6552 6556 6560 6564 6568 6572 6576 6580 6584 6588 6592 6596 6600 6604 6607 6610 6614 6617 6621 6625 6629 6633 6637 6641 6645 6649 6653 6657 6661 6665 6669 6673 6677 6681 6685 6689 6692 6696 6700 6704 6708 6712 6716 6720 6724 6728 6732 6736 6740 6743 6747 6751 6755 6759 6763 6767 6771 6775 6779 6783 6787 6791 6795 6799 6803 6807 6811 6815 6819 6823 6827 6831 6835 6839 6843 6847 6851 6855 6859 6863 6867 6871 6875 6879 6883 6887 6891 6895 6899 6903 6907 6911 6915 6919 6923 6927 6931 6935 6939 6943 6947 6951 6955 6959 6963 6967 6971 6975 6979 6983 6987 6991 6995 6999 7003 7007 7011 7015 7019 7023 7027 7031 7035 7039 7043 7047 7051 7055 7059 7063 7067 7071 7075 7079 7083 7087 7091 7095 7099 7103 7107 7111 7115 7119 7123 7127 7131 7135 7139 7143 7147 7151 7154 7158 7162 7166 7170 7174 7178 7182 7186 7190 7194 7198 7202 7206 7210 7214 7218 7222 7226 7230 7234 7238 7242 7246 7250 7254 7258 7262 7266 7270 7274 7278 7282 7286 7290 7294 7298 7302 7306 7310 7314 7318 7322 7326 7330 7334 7338 7342 7346 7350 7354 7358 7362 7366 7370 7375 7379 7382 7385 7389 7393 7397 7401 7405 7409 7413 7417 7421 7425 7429 7433 7437 7441 7445 7449 7453 7457 7461 7465 7469 7473 7477 7481 7485 7489 7493 7497 7501 7505 7509 7513 7517 7521 7525 7529 7533 7537 7541 7545 7549 7553 7557 7561 7565 7569 7573 7577 7581 7584 7588 7592 7596 7600 7604 7608 7612 7616 7619 7623 7627 7631 7635 7639 7643 7647 7651 7655 7659 7663 7667 7671 7675 7679 7683 7687 7691 7695 7699 7703 7707 7711 7715 7719 7723 7727 7731 7735 7739 7743 7747 7751 7755 7759 7763 7767 7771 7775 7779 7783 7787 7791 7795 7799 7803 7807 7811 7815 7819 7823 7827 7831 7835 7839 7843 7847 7851 7855 7859 7863 7867 7871 7875 7879 7883 7887 7891 7895 7899 7903 7907 7911 7915 7919 7923 7927 7931 7935 7939 7943 7947 7951 7955 7959 7962 7965 7968 7972 7976 7980 7984 7988 7992 7996 8000 8004 8008 8012 8016 8020 8024 8028 8032 8036 8040 8044 8048 8052 8056 8060 8064 8068 8072 8076 8080 8084 8087 8090 8093 8096 8099 8102 8105 8108 8111 8114 8117 8120 8124 8127 8130 8133 8136 8139 8142 8145 8148 8151 8154 8157 8160 8163 8166 8170 8174 8177 8181 8185 8189 8193 8197 8201 8205 8209 8213 8217 8221 8225 8229 8233 8237 8241 8245 8249 8253 8257 8261 8265 8269 8273 8277 8281 8285 8289 8293 8297 8301 8305 8309 8312 8315 8318 8322 8326 8330 8334 8338 8342 8346 8350 8354 8358 8362 8366 8370 8374 8378 8382 8386 8390 8394 8398 8402 8406 8410 8414 8418 8422 8426 8430 8434 8438 8442 8446 8450 8454 8458 8462 8466 8470 8474 8478 8482 8486 8490 8494 8497</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">89 243 90 6 91 243 89 5 92 244 91 5 299 244 92 218 7 95 93 8 93 95 94 9 96 245 89 6 89 245 97 5 97 245 98 11 98 245 96 10 97 246 92 5 92 246 300 218 300 246 99 219 99 246 97 11 12 247 93 9 93 247 100 8 13 102 101 14 101 102 7 8 103 248 98 10 98 248 104 11 104 248 105 16 105 248 103 15 100 107 101 8 101 107 106 14 108 109 13 14 18 109 108 17 106 111 108 14 108 111 110 17 20 112 113 19 113 112 18 17 110 115 113 17 113 115 114 19 22 116 117 21 117 116 20 19 114 119 117 19 117 119 118 21 23 249 120 24 120 249 22 21 118 122 120 21 120 122 121 24 26 339 340 123 123 340 341 28 341 340 124 27 124 340 339 25 125 250 307 29 307 250 126 227 126 250 123 28 123 250 125 26 126 127 45 227 126 28 30 127 128 251 308 31 308 251 129 228 129 251 130 33 130 251 128 32 131 252 309 34 309 252 128 31 128 252 132 32 132 252 131 35 133 253 132 35 132 253 134 32 134 253 156 36 156 253 133 38 135 254 136 39 136 254 137 37 137 254 133 35 133 254 135 38 104 255 99 11 99 255 310 219 310 255 138 1978 138 255 104 16 204 285 139 59 139 285 203 57 105 256 140 16 140 256 135 39 135 256 141 38 141 256 105 15 138 257 142 1978 142 257 154 229 154 257 140 39 140 257 138 16 143 284 202 60 203 284 143 57 144 56 2065 2066 311 258 125 29 125 258 145 26 145 258 146 40 146 258 311 41 43 147 148 42 148 147 23 24 149 259 124 25 124 259 150 27 150 259 147 43 147 259 149 23 121 152 148 24 148 152 151 42 231 30 28 341 231 341 27 44 153 260 129 33 129 260 312 228 312 260 146 41 146 260 153 40 154 261 313 229 313 261 155 230 155 261 136 37 136 261 154 39 153 262 181 40 181 262 134 36 134 262 130 32 130 262 153 33 137 263 155 37 155 263 314 230 314 263 131 34 131 263 137 35 151 241 157 42 157 241 242 83 159 264 160 44 160 264 239 81 239 264 238 82 238 264 159 43 82 238 157 83 157 238 43 42 160 265 231 44 231 265 232 30 232 265 237 80 237 265 160 81 94 163 164 9 165 266 166 46 166 266 163 94 90 288 207 6 164 167 12 9 166 267 168 46 168 267 169 47 169 267 95 7 95 267 166 94 207 287 96 6 96 287 206 10 170 268 171 63 171 268 172 58 172 268 173 64 173 268 170 62 172 269 174 58 174 269 175 61 175 269 176 65 176 269 172 64 175 270 177 61 177 270 178 66 178 270 179 67 179 270 175 65 180 271 149 25 149 271 249 23 249 271 48 22 150 159 44 27 159 150 43 48 272 116 22 116 272 49 20 49 273 112 20 112 273 50 18 50 274 109 18 109 274 51 13 169 275 52 47 51 275 102 13 102 275 169 7 206 286 103 10 103 286 53 15 53 276 141 15 141 276 54 38 156 277 55 36 54 277 156 38 55 182 181 36 181 182 56 40 202 283 183 60 201 68 183 283 56 144 145 40 144 321 339 26 145 276 2069 2070 54 290 208 184 278 210 290 278 185 2068 2069 276 53 277 2071 2073 55 289 209 186 279 208 289 279 184 2070 2071 277 54 275 2075 2076 52 294 212 2053 280 214 294 280 187 2074 2075 275 51 286 2072 2068 53 292 210 185 2052 274 2078 2074 51 293 214 187 2055 213 293 2055 188 2079 2078 274 50 273 2080 2079 50 295 213 188 2056 215 295 2056 189 2081 2080 273 49 271 2084 2085 48 297 216 190 281 217 297 281 191 2083 2084 271 180 272 2082 2081 49 296 215 189 2057 216 296 2057 190 2085 2082 272 48 182 2064 2065 56 291 211 2051 2050 209 291 2050 186 2073 2064 182 55 211 298 282 2051 298 323 322 282 70 192 139 57 59 139 192 71 69 193 143 60 70 57 143 193 73 194 170 63 62 170 194 74 59 71 205 204 62 74 195 173 64 173 195 75 64 75 196 176 65 176 196 76 77 197 178 67 66 178 197 78 65 76 198 179 77 67 179 198 72 199 183 68 69 60 183 199 200 72 68 201 338 200 201 337 338 337 66 78 283 336 337 201 177 336 335 61 284 334 335 202 174 334 333 58 285 332 333 203 171 332 331 63 331 204 205 330 331 330 73 63 329 292 2052 2054 2076 2077 328 52 52 328 327 47 287 326 327 206 168 326 325 46 288 324 325 207 193 289 208 70 209 289 193 69 210 292 205 71 208 290 192 70 192 290 210 71 199 291 209 69 211 291 199 72 292 329 330 205 2053 212 329 2054 195 293 213 75 214 293 195 74 212 294 194 73 194 294 214 74 213 295 196 75 196 295 215 76 215 296 198 76 198 296 216 77 323 217 191 322 217 323 338 78 216 297 197 77 197 297 217 78 200 298 211 72 247 301 220 100 221 301 247 12 107 302 222 106 220 302 107 100 111 303 223 110 222 303 111 106 115 304 224 114 223 304 115 110 119 305 225 118 224 305 119 114 122 306 226 121 225 306 122 118 152 346 345 151 152 121 226 346 241 344 343 242 241 151 345 344 167 315 221 12 232 316 127 30 127 316 162 45 162 316 235 79 235 316 232 80 234 317 235 80 235 317 233 79 233 317 87 3 87 317 234 2 236 318 237 81 237 318 234 80 234 318 86 2 86 318 236 1 239 319 236 81 236 319 85 1 85 319 161 0 161 319 239 82 0 161 240 4 240 161 82 83 242 158 240 83 240 158 84 4 343 342 158 242 158 342 88 84 144 2066 2067 321 339 321 180 25 2067 2083 180 321 46 325 324 165 207 325 326 287 47 327 326 168 206 327 328 286 286 328 2077 2072 73 330 329 212 204 331 332 285 58 333 332 171 203 333 334 284 61 335 334 174 202 335 336 283 66 337 336 177 200 338 323 298 299 218 2022 2017 218 300 2021 2022 300 219 2023 2021 220 301 674 592 301 221 593 674 222 302 675 594 302 220 592 675 223 303 676 595 303 222 594 676 224 304 677 596 304 223 595 677 225 305 678 597 305 224 596 678 226 306 679 598 306 225 597 679 2036 2037 680 599 2037 2038 600 680 2038 2039 608 600 31 308 2019 2033 602 681 2019 2020 34 309 2032 2031 309 31 2033 2032 219 310 2024 2023 684 604 2025 2026 2034 2035 685 605 2035 2036 599 685 345 346 1971 1970 346 226 598 1971 2020 2016 686 602 2016 2034 605 686 229 313 2028 2027 313 230 2029 2028 230 314 2030 2029 314 34 2031 2030 343 344 1969 1968 344 345 1970 1969 2039 2040 689 608 2040 2041 612 689 221 315 690 593 2041 2042 692 612 2042 2043 434 692 88 342 1967 435 342 343 1968 1967 436 353 437 622 438 352 436 622 439 352 438 623 440 354 439 623 355 356 441 443 441 357 442 443 444 353 436 624 436 352 445 624 445 359 446 624 446 358 444 624 445 352 439 625 439 354 447 625 447 360 448 625 448 359 445 625 361 357 441 626 441 356 449 626 362 363 450 451 450 356 355 451 452 358 446 627 446 359 453 627 453 365 454 627 454 364 452 627 449 356 450 456 450 363 455 456 457 363 362 458 367 366 457 458 455 363 457 460 457 366 459 460 369 368 462 461 462 366 367 461 459 366 462 464 462 368 463 464 371 370 466 465 466 368 369 465 463 368 466 468 466 370 467 468 372 373 469 628 469 370 371 628 467 370 469 471 469 373 470 471 375 472 1965 1964 472 377 1966 1965 1966 376 473 1965 473 374 1964 1965 474 378 475 629 475 379 476 629 476 377 472 629 472 375 474 629 476 379 399 477 476 477 380 377 478 381 479 630 479 382 480 630 480 384 481 630 481 383 478 630 482 385 483 631 483 381 478 631 478 383 484 631 484 386 482 631 485 386 484 632 484 383 486 632 486 387 511 632 511 390 485 632 487 391 488 633 488 388 489 633 489 386 485 633 485 390 487 633 453 359 448 634 448 360 490 634 490 389 491 634 491 365 453 634 575 405 492 659 492 403 574 659 454 365 493 635 493 391 487 635 487 390 494 635 494 364 454 635 491 389 495 636 495 392 508 636 508 391 493 636 493 365 491 636 496 406 573 658 574 403 496 658 651 2087 2088 552 497 378 474 637 474 375 498 637 498 394 499 637 499 395 497 637 397 396 501 500 501 373 372 500 502 374 473 638 473 376 503 638 503 397 500 638 500 372 502 638 470 373 501 505 501 396 504 505 609 1966 377 380 609 398 376 1966 506 384 480 639 480 382 507 639 507 395 499 639 499 394 506 639 508 392 509 640 509 400 510 640 510 388 488 640 488 391 508 640 506 394 538 641 538 387 486 641 486 383 481 641 481 384 506 641 489 388 510 642 510 400 512 642 512 385 482 642 482 386 489 642 504 396 513 620 513 429 621 620 515 398 516 643 516 427 618 643 618 428 617 643 617 397 515 643 428 429 513 617 513 396 397 617 516 398 609 644 609 380 610 644 610 426 616 644 616 427 516 644 442 357 520 519 521 401 522 645 522 442 519 645 437 353 579 661 520 357 361 523 522 401 524 646 524 402 525 646 525 355 443 646 443 442 522 646 579 353 444 660 444 358 578 660 526 409 527 647 527 404 528 647 528 410 529 647 529 408 526 647 528 404 530 648 530 407 531 648 531 411 532 648 532 410 528 648 531 407 533 649 533 412 534 649 534 413 535 649 535 411 531 649 393 374 502 537 502 372 628 537 628 371 536 537 503 376 398 515 515 397 503 536 371 465 540 465 369 539 540 539 369 461 542 461 367 541 542 541 367 458 544 458 362 543 544 525 402 545 546 543 362 451 546 451 355 525 546 578 358 452 577 452 364 547 577 547 364 494 549 494 390 548 549 511 387 550 551 548 390 511 551 550 387 538 650 538 394 552 650 573 406 553 657 572 657 553 414 552 394 498 651 651 498 375 1964 1945 549 548 2091 2092 580 663 652 554 663 582 555 652 2093 547 549 2092 551 550 2095 2090 581 662 653 556 662 580 554 653 2091 548 551 2090 546 545 2097 2098 584 667 654 557 667 586 558 654 2099 543 546 2098 577 547 2093 2094 582 665 2060 555 544 543 2099 2100 586 666 2061 558 666 585 559 2061 2101 541 544 2100 542 541 2101 2102 585 668 2062 559 668 587 560 2062 2103 539 542 2102 537 536 2105 2106 588 670 655 561 670 589 562 655 2107 393 537 2106 540 539 2103 2104 587 669 2063 560 669 588 561 2063 2105 536 540 2104 650 552 2088 2089 583 664 2059 2058 664 581 556 2059 2095 550 650 2089 671 583 2058 656 1947 671 656 1946 563 416 403 492 563 492 405 417 564 415 406 496 564 496 403 416 565 419 409 526 565 526 408 420 576 417 405 575 566 420 408 529 566 529 410 421 567 421 410 532 567 532 411 422 568 423 413 534 568 534 412 424 569 422 411 535 569 535 413 423 570 418 414 553 570 553 406 415 414 418 571 572 572 571 1963 1962 424 412 1962 1963 657 572 1962 1961 533 407 1960 1961 658 573 1960 1959 530 404 1958 1959 659 574 1958 1957 527 409 1956 1957 576 575 1956 1955 409 419 1955 1956 2060 665 1954 1953 2097 545 1952 2096 545 402 1951 1952 660 578 1951 1950 524 401 1949 1950 661 579 1949 1948 564 416 580 662 581 415 564 662 582 417 576 665 580 416 563 663 563 417 582 663 570 415 581 664 583 418 570 664 665 576 1955 1954 1954 584 557 1953 566 421 585 666 586 420 566 666 584 419 565 667 565 420 586 667 585 421 567 668 567 422 587 668 587 422 569 669 569 423 588 669 589 1947 1946 562 589 424 1963 1947 588 423 568 670 568 424 589 670 571 418 583 671 590 354 440 672 447 354 590 673 591 360 447 673 626 449 592 674 593 361 626 674 456 455 594 675 592 449 456 675 460 459 595 676 594 455 460 676 464 463 596 677 595 459 464 677 468 467 597 678 596 463 468 678 471 470 598 679 597 467 471 679 475 378 599 680 600 379 475 680 399 379 600 608 479 381 601 681 602 382 479 681 483 385 603 682 601 381 483 682 490 360 591 683 604 389 490 683 495 389 604 684 606 392 495 684 497 395 605 685 599 378 497 685 505 504 1970 1971 505 1971 598 470 507 382 602 686 605 395 507 686 509 392 606 687 607 400 509 687 512 400 607 688 603 385 512 688 620 621 1968 1969 620 1969 1970 504 518 399 608 689 612 425 518 689 523 361 593 690 610 380 477 691 477 399 518 691 518 425 614 691 614 426 610 691 611 425 612 692 434 350 611 692 613 426 614 693 614 425 611 693 611 350 433 693 433 349 613 693 615 427 616 694 616 426 613 694 613 349 432 694 432 348 615 694 618 427 615 695 615 348 431 695 431 347 517 695 517 428 618 695 347 351 619 517 619 429 428 517 621 429 619 514 619 351 430 514 1968 621 514 1967 514 430 435 1967 696 697 710 709 697 698 711 710 698 699 712 711 699 700 713 712 700 701 714 713 701 702 715 714 702 703 716 715 703 704 717 716 704 705 718 717 705 706 719 718 706 707 720 719 707 1331 721 720 708 722 1979 1980 709 710 724 723 710 711 725 724 711 712 726 725 712 713 727 726 713 714 728 727 714 715 729 728 715 716 730 729 716 717 731 730 717 718 732 731 718 719 733 732 719 720 734 733 1333 721 1979 1982 723 724 737 736 724 725 738 737 725 726 739 738 726 727 740 739 727 728 741 740 728 729 742 741 729 730 743 742 730 731 744 743 731 732 745 744 732 733 746 745 733 734 747 746 1334 1333 1982 1983 736 737 750 749 737 738 751 750 738 739 752 751 739 740 753 752 740 741 754 753 741 742 755 754 742 743 756 755 743 744 757 756 744 745 758 757 745 746 759 758 746 747 760 759 1335 1334 1983 1984 749 750 763 762 750 751 764 763 751 752 765 764 752 753 766 765 753 754 767 766 754 755 768 767 755 756 769 768 756 757 770 769 757 758 771 770 758 759 772 771 759 760 773 772 1336 1335 1984 1981 762 763 776 775 763 764 777 776 764 765 778 777 765 766 779 778 766 767 780 779 767 768 781 780 768 769 782 781 769 770 783 782 770 771 784 783 771 772 785 784 772 773 786 785 2 1336 1981 87 775 776 788 787 776 777 789 788 777 778 790 789 778 779 791 790 779 780 792 791 780 781 793 792 781 782 794 793 782 783 795 794 783 784 796 795 784 785 797 796 785 786 798 797 787 788 800 799 788 789 801 800 789 790 802 801 790 791 803 802 791 792 804 803 792 793 805 804 793 794 806 805 794 795 807 806 795 796 808 807 796 797 809 808 797 798 810 809 799 800 812 811 800 801 813 812 801 802 814 813 802 803 815 814 803 804 816 815 804 805 817 816 805 806 818 817 806 807 819 818 807 808 820 819 808 809 821 820 809 810 822 821 811 812 824 823 812 813 825 824 813 814 826 825 814 815 827 826 815 816 828 827 816 817 829 828 817 818 830 829 818 819 831 830 819 820 832 831 820 821 833 832 821 822 834 833 823 824 835 846 824 825 836 835 825 826 837 836 826 827 838 837 827 828 839 838 828 829 840 839 829 830 841 840 830 831 842 841 831 832 843 842 832 833 844 843 833 834 845 844 846 835 848 847 835 836 849 848 836 837 850 849 837 838 851 850 838 839 852 851 839 840 853 852 840 841 854 853 841 842 855 854 842 843 856 855 843 844 857 856 844 845 858 857 847 848 860 859 848 849 861 860 849 850 862 861 853 854 863 854 855 864 863 855 856 865 864 856 857 866 865 857 858 867 866 859 860 869 868 860 861 870 869 868 869 872 871 869 870 873 872 875 874 864 865 865 866 876 875 866 867 877 876 871 872 879 878 872 873 880 879 882 881 874 875 875 876 883 882 876 877 884 883 878 879 886 885 879 880 887 886 889 888 881 882 882 883 890 889 883 884 891 890 885 886 893 892 886 887 894 893 1313 888 889 895 889 890 896 895 890 891 1314 896 891 1337 897 1314 1985 1337 320 1986 892 893 899 898 893 894 900 899 1312 1311 906 905 697 696 907 698 697 907 699 698 907 700 699 907 701 700 907 702 701 907 703 702 907 704 703 907 705 704 907 706 705 907 707 706 907 707 907 1331 708 1980 907 941 980 1044 1007 1007 1028 956 941 942 958 1028 1007 1007 1044 981 942 943 979 1043 1008 1008 1029 955 943 941 956 1029 1008 1008 1043 980 941 944 978 1042 1009 1009 1027 953 944 943 955 1027 1009 1009 1042 979 943 945 977 1041 1010 1010 1030 960 945 944 953 1030 1010 1010 1041 978 944 1011 1032 964 946 945 960 1032 1011 1011 946 1066 1067 947 976 1040 1012 1012 1034 968 947 946 964 1034 1012 1012 1040 1066 946 948 975 1039 1013 1013 1036 971 948 947 968 1036 1013 1013 1039 976 947 949 973 1038 1014 1014 1035 967 949 948 971 1035 1014 1014 1038 975 948 950 974 1037 1015 1015 1033 963 950 949 967 1033 1015 1015 1037 973 949 942 981 1045 1016 1016 1031 958 942 950 963 1031 1016 1016 1045 974 950 1044 1038 973 981 986 1048 1907 1906 923 1017 1907 1908 990 1050 1911 1913 925 1018 1911 1909 909 1051 1905 1909 951 1019 1905 1906 908 1052 1910 1908 924 1020 1910 1912 910 1053 1914 1912 926 1021 1914 1916 927 1022 1918 1920 982 1046 1918 1916 984 1047 1922 1920 929 1023 1922 1924 911 1054 1923 1924 930 1024 1923 1921 988 1049 1919 1921 928 1025 1919 1917 912 1055 1915 1917 952 1026 1915 1913 953 1027 954 914 954 1027 955 913 956 1028 957 916 957 1028 958 915 955 1029 959 913 959 1029 956 916 960 1030 961 917 961 1030 953 914 958 1031 962 915 962 1031 963 918 964 1032 965 919 965 1032 960 917 963 1033 966 918 966 1033 967 920 968 1034 969 921 969 1034 964 919 967 1035 970 920 970 1035 971 922 971 1036 972 922 972 1036 968 921 914 954 1020 924 923 1020 954 913 916 957 1019 951 925 1019 957 915 923 913 959 1017 916 951 1017 959 917 961 1021 926 914 924 1021 961 925 915 962 1018 952 1018 962 918 919 965 1022 927 917 926 1022 965 952 918 966 1026 928 1026 966 920 921 969 1023 929 919 927 1023 969 928 920 970 1025 930 1025 970 922 930 922 972 1024 921 929 1024 972 984 1046 996 932 996 1046 982 931 911 1047 983 933 983 1047 984 932 908 1048 985 935 985 1048 986 934 912 1049 987 937 987 1049 988 936 909 1050 989 939 989 1050 990 938 986 1051 991 934 991 1051 909 939 910 1052 992 940 992 1052 908 935 982 1053 993 931 993 1053 910 940 988 1054 994 936 994 1054 911 933 990 1055 995 938 995 1055 912 937 996 1056 997 932 998 1056 996 931 983 1057 999 933 997 1057 983 932 985 1058 1000 935 1001 1058 985 934 987 1059 1002 937 1003 1059 987 936 989 1060 1004 939 1005 1060 989 938 991 1061 1001 934 1004 1061 991 939 992 1062 1006 940 1000 1062 992 935 993 1063 998 931 1006 1063 993 940 994 1064 1003 936 999 1064 994 933 995 1065 1005 938 1002 1065 995 937 973 1037 974 1045 981 980 1043 1039 975 1044 980 975 1038 1043 979 976 1039 978 1041 977 1067 1066 979 1042 1040 976 1011 1067 977 945 978 1066 1040 1042 997 1056 904 903 1056 998 1313 904 999 1057 902 901 1000 1058 863 864 1058 1001 853 863 1002 1059 887 880 1059 1003 894 887 1004 1060 862 851 1060 1005 870 862 1001 1061 852 853 1061 1004 851 852 1006 1062 874 881 1062 1000 864 874 1063 1006 881 888 1003 1064 900 894 1064 999 901 900 1005 1065 873 870 1065 1002 880 873 1057 997 903 902 870 861 862 862 850 851 1063 888 1313 998 1116 1237 1117 1151 1237 1152 1117 1153 1238 1092 1070 1308 1238 1153 1309 1153 1239 1310 1309 1110 1287 1239 1093 1093 1239 1153 1070 1219 1118 1154 1297 1113 1115 1297 1154 1120 1112 1150 1155 1071 1155 1150 1069 1154 1240 1156 1113 1156 1240 1277 1114 1277 1240 1157 1222 1157 1240 1154 1118 1218 1121 1158 1274 1219 1274 1158 1118 1159 1241 1160 1123 1160 1241 1245 1124 1245 1241 1161 1161 1241 1159 1122 1162 1242 1119 1120 1220 1242 1162 1125 1162 1243 1163 1125 1163 1243 1094 1072 1094 1243 1155 1071 1155 1243 1162 1120 1278 1244 1164 1223 1164 1244 1158 1121 1158 1244 1157 1118 1157 1244 1278 1222 1124 1245 1165 1126 1165 1245 1166 1208 1129 1167 1128 1167 1129 1296 1209 1168 1246 1095 1073 1095 1246 1266 1074 1266 1246 1167 1209 1167 1246 1168 1128 1228 1247 1170 1131 1170 1247 1169 1130 1171 1248 1172 1132 1172 1248 1237 1116 1171 1301 1174 1248 1237 1248 1173 1152 1173 1248 1174 1133 1175 1249 1307 1306 1307 1249 1238 1308 1238 1249 1096 1092 1096 1249 1175 1075 1218 1273 1176 1121 1134 1135 1176 1273 1177 1250 1178 1136 1178 1250 1179 1137 1179 1250 1171 1132 1180 1251 1177 1136 1181 1235 1174 1301 1181 1251 1182 1126 1182 1251 1180 1138 1183 1252 1179 1132 1179 1252 1184 1137 1184 1252 1286 1232 1286 1252 1183 1233 1139 1217 1272 1185 1216 1140 1185 1272 1186 1253 1187 1142 1187 1253 1188 1144 1188 1253 1189 1143 1189 1253 1186 1141 1190 1254 1191 1145 1191 1254 1192 1130 1192 1254 1186 1142 1186 1254 1190 1141 1193 1255 1281 1225 1281 1255 1194 1226 1194 1255 1185 1140 1185 1255 1193 1139 1195 1256 1188 1143 1188 1256 1196 1144 1196 1256 1284 1230 1284 1256 1195 1231 1216 1271 1194 1140 1227 1226 1194 1271 1197 1257 1283 1229 1283 1257 1196 1230 1196 1257 1187 1144 1187 1257 1197 1142 1198 1258 1220 1125 1221 1258 1198 1146 1200 1259 1199 1147 1174 1260 1201 1133 1302 1304 1305 1201 1198 1261 1203 1146 1203 1261 1097 1076 1097 1261 1163 1072 1163 1261 1198 1125 1305 1262 1175 1306 1175 1262 1098 1075 1098 1262 1204 1077 1204 1262 1305 1304 1148 1276 1221 1146 1199 1206 1205 1147 1265 1303 1304 1302 1078 1263 1203 1076 1203 1263 1148 1146 1204 1264 1099 1077 1303 1264 1204 1304 1206 1129 1208 1205 1074 1266 1263 1078 1263 1266 1209 1148 1279 1267 1210 1224 1210 1267 1176 1135 1176 1267 1164 1121 1164 1267 1279 1223 1285 1268 1184 1232 1184 1268 1211 1137 1211 1268 1195 1143 1195 1268 1285 1231 1149 1269 1212 1145 1212 1269 1213 1138 1134 1300 1214 1135 1139 1214 1300 1217 1215 1270 1189 1141 1189 1270 1211 1143 1211 1270 1178 1137 1178 1270 1215 1136 1227 1271 1247 1228 1247 1271 1216 1169 1216 1272 1293 1169 1293 1272 1217 1149 1134 1273 1290 1213 1290 1273 1218 1124 1218 1274 1160 1124 1160 1274 1219 1123 1115 1275 1159 1123 1330 1161 1122 1259 1258 1221 1199 1221 1276 1206 1199 1276 1296 1129 1206 1114 1277 1100 1068 1100 1277 1222 1079 1222 1278 1101 1079 1101 1278 1223 1080 1223 1279 1102 1080 1102 1279 1224 1081 1224 1280 1103 1081 1103 1280 1225 1082 1225 1281 1104 1082 1104 1281 1226 1083 1083 1226 1227 1084 1084 1227 1228 1085 1131 1282 1105 1087 1105 1282 1229 1086 1106 1283 1230 1088 1229 1283 1106 1086 1230 1284 1107 1088 1107 1284 1231 1089 1108 1285 1232 1090 1231 1285 1108 1089 1232 1286 1109 1090 1109 1286 1233 1091 1233 1287 1110 1091 1168 1288 1234 1128 1234 1288 1264 1303 1264 1288 1111 1099 1111 1288 1168 1073 1085 1228 1131 1087 1200 1289 1235 1127 1235 1289 1260 1174 1260 1289 1236 1202 1236 1289 1200 1147 1213 1290 1182 1138 1126 1182 1290 1124 1205 1291 1236 1147 1236 1291 1207 1202 1215 1292 1180 1136 1180 1292 1212 1138 1212 1292 1190 1145 1190 1292 1215 1141 1208 1294 1291 1205 1291 1294 1265 1207 1169 1293 1191 1130 1191 1293 1149 1145 1234 1294 1208 1128 1282 1295 1197 1229 1197 1295 1192 1142 1192 1295 1170 1130 1170 1295 1282 1131 1209 1296 1276 1148 1219 1297 1115 1123 1235 1181 1126 1165 1127 1183 1298 1287 1233 1287 1298 1239 1239 1298 1310 1172 1298 1183 1132 1210 1299 1280 1224 1280 1299 1193 1225 1193 1299 1214 1139 1214 1299 1210 1135 1217 1300 1269 1149 1269 1300 1134 1213 1301 1177 1251 1181 1171 1250 1177 1301 1202 1207 1265 1302 1201 1260 1202 1302 1265 1294 1234 1303 1201 1305 1306 1133 1307 1173 1133 1306 1173 1307 1308 1152 1152 1308 1309 1117 1310 1116 1117 1309 1298 1172 1116 1310 1068 1319 1318 1114 902 1321 1318 906 902 906 1311 901 1311 899 900 901 898 899 1311 1312 1113 1322 1323 1115 1313 1324 1323 904 1316 1325 1326 1317 1315 1320 1332 897 903 1322 1321 902 895 1325 1324 1313 1159 1275 1316 1122 1120 1119 1317 1112 1314 1327 1326 896 1317 1119 1122 1316 906 1318 1319 905 1150 1332 1320 1069 1114 1318 1321 1156 1156 1321 1322 1113 904 1323 1322 903 1115 1323 1324 1275 1275 1324 1325 1316 896 1326 1325 895 1317 1326 1327 1112 1112 1327 1332 1150 1328 1259 1200 1127 1220 1258 1259 1328 1329 1242 1220 1328 1166 1328 1127 1165 1330 1329 1328 1166 1119 1329 1330 1122 1119 1242 1329 1161 1330 1166 1245 1314 897 1332 1327 720 721 1333 734 734 1333 1334 747 747 1334 1335 760 760 1335 1336 773 773 1336 2 786 786 2 86 798 884 320 1337 891 696 709 1349 1338 1338 1349 1350 1339 1339 1350 1351 1340 1340 1351 1352 1341 1341 1352 1353 1342 1342 1353 1354 1343 1343 1354 1355 1344 1344 1355 1356 1345 1345 1356 1357 1346 1346 1357 1358 1347 1347 1358 1359 1348 1348 1359 1360 1897 1897 1360 1972 1973 709 723 1361 1349 1349 1361 1362 1350 1350 1362 1363 1351 1351 1363 1364 1352 1352 1364 1365 1353 1353 1365 1366 1354 1354 1366 1367 1355 1355 1367 1368 1356 1356 1368 1369 1357 1357 1369 1370 1358 1358 1370 1371 1359 1360 1899 1975 1972 723 736 1372 1361 1361 1372 1373 1362 1362 1373 1374 1363 1363 1374 1375 1364 1364 1375 1376 1365 1365 1376 1377 1366 1366 1377 1378 1367 1367 1378 1379 1368 1368 1379 1380 1369 1369 1380 1381 1370 1370 1381 1382 1371 1899 1900 1976 1975 736 749 1383 1372 1372 1383 1384 1373 1373 1384 1385 1374 1374 1385 1386 1375 1375 1386 1387 1376 1376 1387 1388 1377 1377 1388 1389 1378 1378 1389 1390 1379 1379 1390 1391 1380 1380 1391 1392 1381 1381 1392 1393 1382 1900 1901 1977 1976 749 762 1394 1383 1383 1394 1395 1384 1384 1395 1396 1385 1385 1396 1397 1386 1386 1397 1398 1387 1387 1398 1399 1388 1388 1399 1400 1389 1389 1400 1401 1390 1390 1401 1402 1391 1391 1402 1403 1392 1392 1403 1404 1393 1901 1902 1974 1977 762 775 1405 1394 1394 1405 1406 1395 1395 1406 1407 1396 1396 1407 1408 1397 1397 1408 1409 1398 1398 1409 1410 1399 1399 1410 1411 1400 1400 1411 1412 1401 1401 1412 1413 1402 1402 1413 1414 1403 1403 1414 1415 1404 2043 2044 1974 434 775 787 1416 1405 1405 1416 1417 1406 1406 1417 1418 1407 1407 1418 1419 1408 1408 1419 1420 1409 1409 1420 1421 1410 1410 1421 1422 1411 1411 1422 1423 1412 1412 1423 1424 1413 1413 1424 1425 1414 1414 1425 1426 1415 787 799 1427 1416 1416 1427 1428 1417 1417 1428 1429 1418 1418 1429 1430 1419 1419 1430 1431 1420 1420 1431 1432 1421 1421 1432 1433 1422 1422 1433 1434 1423 1423 1434 1435 1424 1424 1435 1436 1425 1425 1436 1437 1426 799 811 1438 1427 1427 1438 1439 1428 1428 1439 1440 1429 1429 1440 1441 1430 1430 1441 1442 1431 1431 1442 1443 1432 1432 1443 1444 1433 1433 1444 1445 1434 1434 1445 1446 1435 1435 1446 1447 1436 1436 1447 1448 1437 811 823 1449 1438 1438 1449 1450 1439 1439 1450 1451 1440 1440 1451 1452 1441 1441 1452 1453 1442 1442 1453 1454 1443 1443 1454 1455 1444 1444 1455 1456 1445 1445 1456 1457 1446 1446 1457 1458 1447 1447 1458 1459 1448 823 846 1460 1449 1449 1460 1461 1450 1450 1461 1462 1451 1451 1462 1463 1452 1452 1463 1464 1453 1453 1464 1465 1454 1454 1465 1466 1455 1455 1466 1467 1456 1456 1467 1468 1457 1457 1468 1469 1458 1458 1469 1470 1459 846 847 1471 1460 1460 1471 1472 1461 1461 1472 1473 1462 1462 1473 1474 1463 1463 1474 1475 1464 1464 1475 1476 1465 1465 1476 1477 1466 1466 1477 1478 1467 1467 1478 1479 1468 1468 1479 1480 1469 1469 1480 1481 1470 847 859 1482 1471 1471 1482 1483 1472 1472 1483 1484 1473 1476 1485 1477 1477 1485 1488 1478 1478 1488 1489 1479 1479 1489 1490 1480 1480 1490 1491 1481 859 868 1486 1482 1482 1486 1487 1483 868 871 1492 1486 1486 1492 1493 1487 1495 1489 1488 1494 1489 1495 1496 1490 1490 1496 1497 1491 871 878 1498 1492 1492 1498 1499 1493 1501 1495 1494 1500 1495 1501 1502 1496 1496 1502 1503 1497 878 885 1504 1498 1498 1504 1505 1499 1507 1501 1500 1506 1501 1507 1508 1502 1502 1508 1509 1503 885 892 1510 1504 1504 1510 1511 1505 1882 1512 1507 1506 1507 1512 1513 1508 1508 1513 1883 1509 1509 1883 1514 1904 1904 1985 1986 1903 892 898 1515 1510 1510 1515 1516 1511 1312 905 1521 1881 1338 907 696 1339 907 1338 1340 907 1339 1341 907 1340 1342 907 1341 1343 907 1342 1344 907 1343 1345 907 1344 1346 907 1345 1347 907 1346 1348 907 1347 1348 1897 907 1973 907 1897 1555 1621 1658 1594 1621 1555 1570 1642 1556 1621 1642 1572 1621 1556 1595 1658 1557 1622 1657 1593 1622 1557 1569 1643 1555 1622 1643 1570 1622 1555 1594 1657 1558 1623 1656 1592 1623 1558 1567 1641 1557 1623 1641 1569 1623 1557 1593 1656 1559 1624 1655 1591 1624 1559 1574 1644 1558 1624 1644 1567 1624 1558 1592 1655 1625 1560 1578 1646 1559 1625 1646 1574 1625 1681 1680 1560 1561 1626 1654 1590 1626 1561 1582 1648 1560 1626 1648 1578 1626 1560 1680 1654 1562 1627 1653 1589 1627 1562 1585 1650 1561 1627 1650 1582 1627 1561 1590 1653 1563 1628 1652 1587 1628 1563 1581 1649 1562 1628 1649 1585 1628 1562 1589 1652 1564 1629 1651 1588 1629 1564 1577 1647 1563 1629 1647 1581 1629 1563 1587 1651 1556 1630 1659 1595 1630 1556 1572 1645 1564 1630 1645 1577 1630 1564 1588 1659 1658 1595 1587 1652 1662 1600 1927 1926 1631 1537 1925 1926 1664 1604 1934 1932 1632 1539 1930 1932 1665 1523 1930 1928 1633 1565 1927 1928 1666 1522 1925 1929 1634 1538 1931 1929 1667 1524 1931 1933 1635 1540 1935 1933 1636 1541 1939 1937 1660 1596 1935 1937 1661 1598 1939 1941 1637 1543 1943 1941 1668 1525 1943 1944 1638 1544 1942 1944 1663 1602 1942 1940 1639 1542 1938 1940 1669 1526 1938 1936 1640 1566 1934 1936 1567 1528 1568 1641 1568 1527 1569 1641 1570 1530 1571 1642 1571 1529 1572 1642 1569 1527 1573 1643 1573 1530 1570 1643 1574 1531 1575 1644 1575 1528 1567 1644 1572 1529 1576 1645 1576 1532 1577 1645 1578 1533 1579 1646 1579 1531 1574 1646 1577 1532 1580 1647 1580 1534 1581 1647 1582 1535 1583 1648 1583 1533 1578 1648 1581 1534 1584 1649 1584 1536 1585 1649 1585 1536 1586 1650 1586 1535 1582 1650 1568 1528 1538 1634 1568 1634 1537 1527 1571 1530 1565 1633 1571 1633 1539 1529 1573 1527 1537 1631 1573 1631 1565 1530 1575 1531 1540 1635 1575 1635 1538 1528 1576 1529 1539 1632 1576 1632 1566 1532 1579 1533 1541 1636 1579 1636 1540 1531 1580 1532 1566 1640 1580 1640 1542 1534 1583 1535 1543 1637 1583 1637 1541 1533 1584 1534 1542 1639 1584 1639 1544 1536 1586 1536 1544 1638 1586 1638 1543 1535 1598 1546 1610 1660 1610 1545 1596 1660 1525 1547 1597 1661 1597 1546 1598 1661 1522 1549 1599 1662 1599 1548 1600 1662 1526 1551 1601 1663 1601 1550 1602 1663 1523 1553 1603 1664 1603 1552 1604 1664 1600 1548 1605 1665 1605 1553 1523 1665 1524 1554 1606 1666 1606 1549 1522 1666 1596 1545 1607 1667 1607 1554 1524 1667 1602 1550 1608 1668 1608 1547 1525 1668 1604 1552 1609 1669 1609 1551 1526 1669 1610 1546 1611 1670 1612 1545 1610 1670 1597 1547 1613 1671 1611 1546 1597 1671 1599 1549 1614 1672 1615 1548 1599 1672 1601 1551 1616 1673 1617 1550 1601 1673 1603 1553 1618 1674 1619 1552 1603 1674 1605 1548 1615 1675 1618 1553 1605 1675 1606 1554 1620 1676 1614 1549 1606 1676 1607 1545 1612 1677 1620 1554 1607 1677 1608 1550 1617 1678 1613 1547 1608 1678 1609 1552 1619 1679 1616 1551 1609 1679 1587 1595 1659 1588 1651 1594 1589 1653 1657 1658 1652 1589 1594 1657 1653 1590 1593 1592 1680 1681 1591 1655 1593 1590 1654 1656 1625 1559 1591 1681 1592 1656 1654 1680 1611 1519 1520 1670 1670 1520 1882 1612 1613 1517 1518 1671 1614 1488 1485 1672 1672 1485 1476 1615 1616 1499 1505 1673 1673 1505 1511 1617 1618 1474 1484 1674 1674 1484 1487 1619 1615 1476 1475 1675 1675 1475 1474 1618 1620 1500 1494 1676 1676 1494 1488 1614 1677 1506 1500 1620 1617 1511 1516 1678 1678 1516 1517 1613 1619 1487 1493 1679 1679 1493 1499 1616 1671 1518 1519 1611 1487 1484 1483 1484 1474 1473 1677 1612 1882 1506 1807 1687 1721 1721 1687 1722 1807 1723 1070 1092 1808 1878 1879 1723 1808 1723 1879 1880 1809 1110 1093 1809 1857 1093 1070 1723 1809 1789 1867 1724 1688 1683 1724 1867 1685 1690 1725 1720 1682 1071 1069 1720 1725 1724 1683 1726 1810 1726 1684 1847 1810 1847 1792 1727 1810 1727 1688 1724 1810 1788 1844 1728 1691 1789 1688 1728 1844 1729 1693 1730 1811 1730 1694 1815 1811 1815 1731 1811 1731 1692 1729 1811 1732 1690 1689 1812 1790 1695 1732 1812 1732 1695 1733 1813 1733 1072 1094 1813 1094 1071 1725 1813 1725 1690 1732 1813 1848 1793 1734 1814 1734 1691 1728 1814 1728 1688 1727 1814 1727 1792 1848 1814 1694 1696 1735 1815 1735 1736 1815 1778 1698 1737 1699 1737 1779 1866 1699 1738 1073 1095 1816 1095 1074 1836 1816 1836 1779 1737 1816 1737 1698 1738 1816 1798 1701 1740 1817 1740 1700 1739 1817 1741 1702 1742 1818 1742 1686 1807 1818 1741 1818 1744 1871 1807 1722 1743 1818 1743 1703 1744 1818 1745 1876 1877 1819 1877 1878 1808 1819 1808 1092 1096 1819 1096 1075 1745 1819 1788 1691 1746 1843 1704 1843 1746 1705 1747 1706 1748 1820 1748 1707 1749 1820 1749 1702 1741 1820 1750 1706 1747 1821 1751 1871 1744 1805 1751 1696 1752 1821 1752 1708 1750 1821 1753 1702 1749 1822 1749 1707 1754 1822 1754 1802 1856 1822 1856 1803 1753 1822 1709 1755 1842 1787 1786 1842 1755 1710 1756 1712 1757 1823 1757 1714 1758 1823 1758 1713 1759 1823 1759 1711 1756 1823 1760 1715 1761 1824 1761 1700 1762 1824 1762 1712 1756 1824 1756 1711 1760 1824 1763 1795 1851 1825 1851 1796 1764 1825 1764 1710 1755 1825 1755 1709 1763 1825 1765 1713 1758 1826 1758 1714 1766 1826 1766 1800 1854 1826 1854 1801 1765 1826 1786 1710 1764 1841 1797 1841 1764 1796 1767 1799 1853 1827 1853 1800 1766 1827 1766 1714 1757 1827 1757 1712 1767 1827 1768 1695 1790 1828 1791 1716 1768 1828 1770 1717 1769 1829 1744 1703 1771 1830 1872 1771 1875 1874 1768 1716 1773 1831 1773 1076 1097 1831 1097 1072 1733 1831 1733 1695 1768 1831 1875 1876 1745 1832 1745 1075 1098 1832 1098 1077 1774 1832 1774 1874 1875 1832 1718 1716 1791 1846 1769 1717 1775 1776 1835 1872 1874 1873 1078 1076 1773 1833 1773 1716 1718 1833 1774 1077 1099 1834 1873 1874 1774 1834 1776 1775 1778 1699 1074 1078 1833 1836 1833 1718 1779 1836 1849 1794 1780 1837 1780 1705 1746 1837 1746 1691 1734 1837 1734 1793 1849 1837 1855 1802 1754 1838 1754 1707 1781 1838 1781 1713 1765 1838 1765 1801 1855 1838 1719 1715 1782 1839 1782 1708 1783 1839 1704 1705 1784 1870 1709 1787 1870 1784 1785 1711 1759 1840 1759 1713 1781 1840 1781 1707 1748 1840 1748 1706 1785 1840 1797 1798 1817 1841 1817 1739 1786 1841 1786 1739 1863 1842 1863 1719 1787 1842 1704 1783 1860 1843 1860 1694 1788 1843 1788 1694 1730 1844 1730 1693 1789 1844 1685 1693 1729 1845 1896 1692 1731 1829 1769 1791 1828 1791 1769 1776 1846 1846 1776 1699 1866 1684 1068 1100 1847 1100 1079 1792 1847 1792 1079 1101 1848 1101 1080 1793 1848 1793 1080 1102 1849 1102 1081 1794 1849 1794 1081 1103 1850 1103 1082 1795 1850 1795 1082 1104 1851 1104 1083 1796 1851 1083 1084 1797 1796 1084 1085 1798 1797 1701 1087 1105 1852 1105 1086 1799 1852 1106 1088 1800 1853 1799 1086 1106 1853 1800 1088 1107 1854 1107 1089 1801 1854 1108 1090 1802 1855 1801 1089 1108 1855 1802 1090 1109 1856 1109 1091 1803 1856 1803 1091 1110 1857 1738 1698 1804 1858 1804 1873 1834 1858 1834 1099 1111 1858 1111 1073 1738 1858 1085 1087 1701 1798 1770 1697 1805 1859 1805 1744 1830 1859 1830 1772 1806 1859 1806 1717 1770 1859 1783 1708 1752 1860 1696 1694 1860 1752 1775 1717 1806 1861 1806 1772 1777 1861 1785 1706 1750 1862 1750 1708 1782 1862 1782 1715 1760 1862 1760 1711 1785 1862 1778 1775 1861 1864 1861 1777 1835 1864 1739 1700 1761 1863 1761 1715 1719 1863 1804 1698 1778 1864 1852 1799 1767 1865 1767 1712 1762 1865 1762 1700 1740 1865 1740 1701 1852 1865 1779 1718 1846 1866 1789 1693 1685 1867 1805 1697 1735 1696 1751 1753 1803 1857 1868 1857 1809 1868 1809 1880 1868 1742 1702 1753 1868 1780 1794 1850 1869 1850 1795 1763 1869 1763 1709 1784 1869 1784 1705 1780 1869 1787 1719 1839 1870 1839 1783 1704 1870 1871 1751 1821 1747 1741 1871 1747 1820 1772 1872 1835 1777 1771 1872 1772 1830 1835 1873 1804 1864 1771 1703 1876 1875 1877 1876 1703 1743 1743 1722 1878 1877 1722 1687 1879 1878 1880 1879 1687 1686 1868 1880 1686 1742 1068 1684 1886 1319 1518 1521 1886 1887 1518 1517 1881 1521 1881 1517 1516 1515 898 1312 1881 1515 1683 1685 1889 1888 1882 1520 1889 1890 1884 1885 1892 1891 1315 1514 1898 1320 1519 1518 1887 1888 1512 1882 1890 1891 1729 1692 1884 1845 1690 1682 1885 1689 1883 1513 1892 1893 1885 1884 1692 1689 1521 905 1319 1886 1720 1069 1320 1898 1684 1726 1887 1886 1726 1683 1888 1887 1520 1519 1888 1889 1685 1845 1890 1889 1845 1884 1891 1890 1513 1512 1891 1892 1885 1682 1893 1892 1682 1720 1898 1893 1894 1697 1770 1829 1790 1894 1829 1828 1895 1894 1790 1812 1736 1735 1697 1894 1896 1736 1894 1895 1689 1692 1896 1895 1689 1895 1812 1731 1815 1736 1896 1883 1893 1898 1514 1359 1371 1899 1360 1371 1382 1900 1899 1382 1393 1901 1900 1393 1404 1902 1901 1404 1415 350 1902 1415 1426 433 350 1497 1903 430 1503 1509 1904 1903 1051 986 1906 1905 1048 908 1908 1907 1017 951 1906 1907 1019 925 1909 1905 1020 923 1908 1910 1050 909 1909 1911 1052 910 1912 1910 1018 952 1913 1911 1021 924 1912 1914 1055 990 1913 1915 1053 982 1916 1914 1026 928 1917 1915 1022 926 1916 1918 1049 912 1917 1919 1046 984 1920 1918 1025 930 1921 1919 1023 927 1920 1922 1054 988 1921 1923 1047 911 1924 1922 1024 929 1924 1923 1522 1662 1926 1925 1600 1665 1928 1927 1565 1631 1926 1927 1537 1634 1929 1925 1539 1633 1928 1930 1524 1666 1929 1931 1523 1664 1932 1930 1538 1635 1933 1931 1566 1632 1932 1934 1596 1667 1933 1935 1604 1669 1936 1934 1540 1636 1937 1935 1542 1640 1936 1938 1598 1660 1937 1939 1526 1663 1940 1938 1541 1637 1941 1939 1544 1639 1940 1942 1525 1661 1941 1943 1602 1668 1944 1942 1543 1638 1944 1943 651 1945 2086 2087 1964 374 393 1945 2086 1945 393 2107 401 521 1948 1949 579 660 1950 1949 402 524 1950 1951 578 577 1952 1951 577 2094 2096 1952 419 584 1954 1955 575 659 1957 1956 404 527 1957 1958 574 658 1959 1958 407 530 1959 1960 573 657 1961 1960 412 533 1961 1962 571 671 1947 1963 1470 1481 347 431 1459 1470 431 348 1448 1459 348 432 1437 1448 432 349 1491 351 347 1481 1497 430 351 1491 435 430 1903 1986 435 1986 320 88 433 1426 1437 349 2048 2049 1973 1972 1902 350 434 1974 2047 2048 1972 1975 2046 2047 1975 1976 2045 2046 1976 1977 2044 2045 1977 1974 606 684 2026 2027 310 1978 2025 2024 867 858 4 84 858 845 0 4 721 1331 1980 1979 774 3 87 1981 722 735 1982 1979 735 748 1983 1982 748 761 1984 1983 761 774 1981 1984 810 798 86 1 1 85 822 810 834 822 85 0 845 834 0 88 320 2015 2015 84 88 1904 1514 1315 1985 1337 1985 1315 897 90 243 1987 1988 243 91 1989 1987 91 244 1990 1989 244 299 1991 1990 164 163 1992 1993 266 165 1994 1995 163 266 1995 1992 288 90 1988 1996 167 164 1993 1997 324 288 1996 1998 315 167 1997 1999 165 324 1998 1994 1991 299 2017 2018 690 315 1999 2001 622 437 2002 2003 438 622 2003 2004 623 438 2004 2005 440 623 2005 2006 519 520 2007 2008 521 645 2009 2010 645 519 2008 2009 437 661 2011 2002 520 523 2012 2007 661 1948 2013 2011 672 440 2006 2000 523 690 2001 2012 1948 521 2010 2013 1988 1987 2014 1987 1989 2014 1989 1990 2014 1990 1991 2014 1993 1992 2014 1995 1994 2014 1992 1995 2014 1996 1988 2014 1997 1993 2014 1998 1996 2014 1999 1997 2014 1994 1998 2014 1991 2018 2000 2014 2001 1999 2014 2003 2002 2014 2004 2003 2014 2005 2004 2014 2006 2005 2014 2008 2007 2014 2010 2009 2014 2009 2008 2014 2002 2011 2014 2007 2012 2014 2011 2013 2014 2000 2006 2014 2012 2001 2014 2013 2010 2014 2015 320 884 877 877 867 84 2015 1497 1503 1903 672 2000 2018 2017 308 228 2020 2019 673 590 2022 2021 590 672 2017 2022 591 673 2021 2023 683 591 2023 2024 604 683 2024 2025 1978 142 2026 2025 142 229 2027 2026 687 606 2027 2028 607 687 2028 2029 688 607 2029 2030 603 688 2030 2031 682 603 2031 2032 601 682 2032 2033 681 601 2033 2019 2020 228 312 2016 312 41 2034 2016 41 311 2035 2034 311 29 2036 2035 29 307 2037 2036 307 227 2038 2037 227 45 2039 2038 45 162 2040 2039 162 79 2041 2040 79 233 2042 2041 233 3 2043 2042 3 774 2044 2043 774 761 2045 2044 761 748 2046 2045 748 735 2047 2046 735 722 2048 2047 722 708 2049 2048 907 2049 708 1973 2049 907 907 1980 1331 2050 2051 2065 2064 282 322 2067 2066 2051 282 2066 2065 185 278 2069 2068 184 279 2071 2070 278 184 2070 2069 2052 185 2068 2072 186 2050 2064 2073 279 186 2073 2071 187 280 2075 2074 2053 2054 2077 2076 280 2053 2076 2075 2055 187 2074 2078 2054 2052 2072 2077 188 2055 2078 2079 2056 188 2079 2080 189 2056 2080 2081 2057 189 2081 2082 191 281 2084 2083 190 2057 2082 2085 281 190 2085 2084 322 191 2083 2067 1946 656 2087 2086 2058 2059 2089 2088 656 2058 2088 2087 653 554 2091 2090 652 555 2093 2092 554 652 2092 2091 555 2060 2094 2093 2059 556 2095 2089 556 653 2090 2095 1953 557 2097 2096 654 558 2099 2098 557 654 2098 2097 558 2061 2100 2099 2060 1953 2096 2094 2061 559 2101 2100 559 2062 2102 2101 2062 560 2103 2102 560 2063 2104 2103 2063 561 2105 2104 655 562 2107 2106 561 655 2106 2105 562 1946 2086 2107 1686 1687 1807 1117 1237 1151\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.GTSMeshReader.cube.gts",
    "content": "8 18 12\n0 -1.63299 -1.1547\n-1.63299 0 -1.1547\n0 1.63299 -1.1547\n1.63299 0 -1.1547\n0 -1.63299 1.1547\n-1.63299 0 1.1547\n0 1.63299 1.1547\n1.63299 0 1.1547\n3 1\n2 1\n6 1\n2 6\n2 7\n3 2\n3 7\n3 8\n4 3\n4 8\n5 1\n4 5\n1 4\n6 5\n7 6\n5 8\n7 5\n8 7\n9 13 1\n6 1 2\n4 2 3\n14 3 11\n4 15 5\n6 5 7\n7 18 8\n9 8 10\n10 16 12\n13 12 11\n15 14 17\n18 17 16\n"
  },
  {
    "path": "tests/meshes/mesh.source.GTSMeshReader.cube.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 -1.6329899999999999 -1.1547000000000001 -1.6329899999999999 0 -1.1547000000000001 0 1.6329899999999999 -1.1547000000000001 1.6329899999999999 0 -1.1547000000000001 0 -1.6329899999999999 1.1547000000000001 -1.6329899999999999 0 1.1547000000000001 0 1.6329899999999999 1.1547000000000001 1.6329899999999999 0 1.1547000000000001</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">2 3 0 1 2 0 5 1 0 4 5 0 1 5 6 2 1 6 2 6 7 3 2 7 3 7 4 0 3 4 6 5 4 7 6 4\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.GTSMeshReader.gz.cube.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 -1.6329899999999999 -1.1547000000000001 -1.6329899999999999 0 -1.1547000000000001 0 1.6329899999999999 -1.1547000000000001 1.6329899999999999 0 -1.1547000000000001 0 -1.6329899999999999 1.1547000000000001 -1.6329899999999999 0 1.1547000000000001 0 1.6329899999999999 1.1547000000000001 1.6329899999999999 0 1.1547000000000001</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">2 3 0 1 2 0 5 1 0 4 5 0 1 5 6 2 1 6 2 6 7 3 2 7 3 7 4 0 3 4 6 5 4 7 6 4\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.GTSPolySphere.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0.80311017820011577 3.4689023878022462 3.5102322238808155 2.1266270208800995 2.9389262614623659 3.4409548011779338 1.2994595650387719 2.1694428227634739 4.3133424020809308 -1.2994595650387719 2.1694428227634739 -4.3133424020809308 -0.80311017820011577 3.4689023878022462 -3.5102322238808155 -0 2.6286555605956679 -4.2532540417601989 -2.5 -1.5450849718747373 -4.0450849718747373 -2.6286555605956679 0 -4.2532540417601998 -1.3143277802978339 -0.81229924058226588 -4.7552825814757673 -1.5450849718747373 -4.0450849718747373 2.5 -2.9389262614623659 -3.4409548011779338 2.1266270208800995 -2.1266270208800995 -2.9389262614623659 3.4409548011779338 0.80311017820011577 -3.4689023878022462 3.5102322238808155 1.2994595650387719 -2.1694428227634739 4.3133424020809308 -0 -2.6286555605956679 4.2532540417601989 4.2532540417601989 0 -2.6286555605956679 4.8096917889195874 0 -1.3663326445633583 4.3133424020809308 1.2994595650387719 -2.1694428227634739 -2.1694428227634739 -4.3133424020809308 1.2994595650387719 -3.4689023878022462 -3.5102322238808155 0.80311017820011577 -0 -1.3663326445633583 4.8096917889195874 1.3143277802978339 -0.81229924058226588 4.7552825814757673 -0 0 5 2.1694428227634739 4.3133424020809308 1.2994595650387719 0.81229924058226588 4.7552825814757673 1.3143277802978339 1.5450849718747373 4.0450849718747373 2.5 -0.81229924058226588 4.7552825814757673 -1.3143277802978339 -0 4.2532540417601998 -2.6286555605956679 -1.5450849718747373 4.0450849718747373 -2.5 -4.2532540417601998 -2.6286555605956679 -0 -4.7552825814757673 -1.3143277802978339 -0.81229924058226588 -4.7552825814757673 -1.3143277802978339 0.81229924058226588 -0 1.3663326445633583 -4.8096917889195874 -2.9389262614623659 3.4409548011779338 -2.1266270208800995 -2.1694428227634739 4.3133424020809308 -1.2994595650387719 3.4689023878022462 3.5102322238808155 0.80311017820011577 3.4689023878022462 3.5102322238808155 -0.80311017820011577 2.6286555605956679 4.2532540417601989 -0 -4.2532540417601989 0 2.6286555605956679 -4.3133424020809308 1.2994595650387719 2.1694428227634739 -3.5102322238808155 0.80311017820011577 3.4689023878022462 2.9389262614623659 3.4409548011779338 -2.1266270208800995 2.1266270208800995 2.9389262614623659 -3.4409548011779338 1.5450849718747373 4.0450849718747373 -2.5 1.2994595650387719 -2.1694428227634739 -4.3133424020809308 0.80311017820011577 -3.4689023878022462 -3.5102322238808155 -0 -2.6286555605956679 -4.2532540417601989 -0 -5 -0 -1.3663326445633583 -4.8096917889195874 -0 -0.81229924058226588 -4.7552825814757673 -1.3143277802978339 -4.2532540417601989 0 -2.6286555605956679 -3.5102322238808155 -0.80311017820011577 -3.4689023878022462 -3.5102322238808155 0.80311017820011577 -3.4689023878022462 -4.0450849718747373 2.5 1.5450849718747373 -3.4409548011779338 2.1266270208800995 2.9389262614623659 -2.9389262614623659 3.4409548011779338 2.1266270208800995 -2.1266270208800995 2.9389262614623659 -3.4409548011779338 -2.5 -1.5450849718747373 4.0450849718747373 -1.2994595650387719 -2.1694428227634739 4.3133424020809308 -3.4409548011779338 -2.1266270208800995 -2.9389262614623659 -2.1266270208800995 -2.9389262614623659 -3.4409548011779338 -1.3143277802978339 -0.81229924058226588 4.7552825814757673 3.5102322238808155 -0.80311017820011577 -3.4689023878022462 3.5102322238808155 0.80311017820011577 -3.4689023878022462 -0.80311017820011577 -3.4689023878022462 -3.5102322238808155 -1.2994595650387719 -2.1694428227634739 -4.3133424020809308 1.3143277802978339 -0.81229924058226588 -4.7552825814757673 -0 -1.3663326445633583 -4.8096917889195874 -0 0 -5 3.4409548011779338 -2.1266270208800995 -2.9389262614623659 4.3133424020809308 -1.2994595650387719 -2.1694428227634739 -3.5102322238808155 -0.80311017820011577 3.4689023878022462 -3.4409548011779338 -2.1266270208800995 2.9389262614623659 2.5 -1.5450849718747373 4.0450849718747373 2.6286555605956679 0 4.2532540417601998 0.80311017820011577 3.4689023878022462 -3.5102322238808155 3.4409548011779338 -2.1266270208800995 2.9389262614623659 2.1266270208800995 -2.9389262614623659 3.4409548011779338 -1.5450849718747373 -4.0450849718747373 -2.5 -0 -4.2532540417601998 -2.6286555605956679 -4.8096917889195874 0 -1.3663326445633583 -4.3133424020809308 1.2994595650387719 -2.1694428227634739 -1.3143277802978339 0.81229924058226588 -4.7552825814757673 -2.1694428227634739 -4.3133424020809308 -1.2994595650387719 -2.9389262614623659 -3.4409548011779338 -2.1266270208800995 2.1694428227634739 4.3133424020809308 -1.2994595650387719 1.3143277802978339 0.81229924058226588 4.7552825814757673 -0 1.3663326445633583 4.8096917889195874 5 0 -0 4.8096917889195874 0 1.3663326445633583 4.7552825814757673 -1.3143277802978339 0.81229924058226588 -2.1694428227634739 4.3133424020809308 1.2994595650387719 -1.3663326445633583 4.8096917889195874 -0 -0.81229924058226588 4.7552825814757673 1.3143277802978339 2.5 1.5450849718747373 4.0450849718747373 2.1266270208800995 -2.9389262614623659 -3.4409548011779338 -0 5 -0 2.1694428227634739 -4.3133424020809308 -1.2994595650387719 0.81229924058226588 -4.7552825814757673 -1.3143277802978339 1.5450849718747373 -4.0450849718747373 -2.5 3.5102322238808155 -0.80311017820011577 3.4689023878022462 -1.5450849718747373 4.0450849718747373 2.5 -0 4.2532540417601998 2.6286555605956679 2.1694428227634739 -4.3133424020809308 1.2994595650387719 1.3663326445633583 -4.8096917889195874 -0 0.81229924058226588 -4.7552825814757673 1.3143277802978339 -4.0450849718747373 2.5 -1.5450849718747373 -4.2532540417601998 2.6286555605956679 -0 -3.4689023878022462 3.5102322238808155 -0.80311017820011577 -2.5 1.5450849718747373 4.0450849718747373 -2.1266270208800995 2.9389262614623659 3.4409548011779338 -1.2994595650387719 2.1694428227634739 4.3133424020809308 4.3133424020809308 -1.2994595650387719 2.1694428227634739 -5 0 -0 -4.7552825814757673 1.3143277802978339 0.81229924058226588 -4.7552825814757673 1.3143277802978339 -0.81229924058226588 -2.6286555605956679 -4.2532540417601989 -0 3.4689023878022462 -3.5102322238808155 -0.80311017820011577 3.4689023878022462 -3.5102322238808155 0.80311017820011577 2.6286555605956679 -4.2532540417601989 -0 2.5 -1.5450849718747373 -4.0450849718747373 2.9389262614623659 3.4409548011779338 2.1266270208800995 2.9389262614623659 -3.4409548011779338 2.1266270208800995 4.7552825814757673 1.3143277802978339 -0.81229924058226588 1.3663326445633583 4.8096917889195874 -0 -4.8096917889195874 0 1.3663326445633583 2.9389262614623659 -3.4409548011779338 -2.1266270208800995 4.0450849718747373 2.5 -1.5450849718747373 4.2532540417601998 -2.6286555605956679 -0 4.7552825814757673 -1.3143277802978339 -0.81229924058226588 -0.80311017820011577 -3.4689023878022462 3.5102322238808155 -4.0450849718747373 -2.5 -1.5450849718747373 2.6286555605956679 0 -4.2532540417601998 2.5 1.5450849718747373 -4.0450849718747373 1.5450849718747373 -4.0450849718747373 2.5 -0 -4.2532540417601998 2.6286555605956679 -3.4409548011779338 2.1266270208800995 -2.9389262614623659 -4.3133424020809308 -1.2994595650387719 -2.1694428227634739 -3.4689023878022462 -3.5102322238808155 -0.80311017820011577 0.81229924058226588 4.7552825814757673 -1.3143277802978339 4.0450849718747373 -2.5 1.5450849718747373 1.2994595650387719 2.1694428227634739 -4.3133424020809308 3.5102322238808155 0.80311017820011577 3.4689023878022462 4.7552825814757673 1.3143277802978339 0.81229924058226588 4.2532540417601998 2.6286555605956679 -0 4.0450849718747373 2.5 1.5450849718747373 -2.6286555605956679 0 4.2532540417601998 3.4409548011779338 2.1266270208800995 -2.9389262614623659 -4.0450849718747373 -2.5 1.5450849718747373 -2.6286555605956679 4.2532540417601989 -0 -3.4689023878022462 3.5102322238808155 0.80311017820011577 -0.80311017820011577 3.4689023878022462 3.5102322238808155 -0.81229924058226588 -4.7552825814757673 1.3143277802978339 -4.3133424020809308 -1.2994595650387719 2.1694428227634739 4.3133424020809308 1.2994595650387719 2.1694428227634739 3.4409548011779338 2.1266270208800995 2.9389262614623659 1.3143277802978339 0.81229924058226588 -4.7552825814757673 4.0450849718747373 -2.5 -1.5450849718747373 -2.5 1.5450849718747373 -4.0450849718747373 4.2532540417601989 0 2.6286555605956679 -0 2.6286555605956679 4.2532540417601989 -1.3143277802978339 0.81229924058226588 4.7552825814757673</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<polyhedra>\n\t\t\t<first_faces>0</first_faces>\n\t\t\t<face_counts>320</face_counts>\n\t\t\t<types>polygons</types>\n\t\t\t<face_first_loops>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319</face_first_loops>\n\t\t\t<face_loop_counts>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</face_loop_counts>\n\t\t\t<face_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_selection>\n\t\t\t<face_materials>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_materials>\n\t\t\t<loop_first_edges>0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 945 948 951 954 957</loop_first_edges>\n\t\t\t<edge_points>0 2 1 4 5 3 7 8 6 9 11 10 13 14 12 15 17 16 18 10 19 21 22 20 18 9 10 24 25 23 27 28 26 29 31 30 3 5 32 34 28 33 36 37 35 38 40 39 42 43 41 45 46 44 48 49 47 50 52 51 54 55 53 4 3 56 11 58 57 6 60 59 27 4 28 20 22 61 62 63 15 65 46 64 67 68 66 69 62 70 72 57 71 74 21 73 75 4 27 73 77 76 78 79 49 40 54 39 80 81 50 82 8 7 84 78 83 41 85 36 2 87 86 89 90 88 91 93 92 8 67 65 94 2 86 71 40 38 11 72 10 45 44 95 96 26 92 78 64 79 98 99 97 100 74 73 101 102 93 103 105 104 107 108 106 64 45 79 109 111 110 112 90 89 114 115 113 80 30 113 48 18 116 118 119 117 69 120 62 23 121 35 122 103 118 82 68 8 16 123 88 25 1 121 37 85 124 38 39 125 95 69 126 39 54 53 119 97 117 127 41 36 83 78 49 51 7 6 128 129 90 110 101 55 130 14 58 59 84 131 75 5 4 132 133 63 134 12 135 106 136 81 50 51 137 132 63 62 42 75 43 84 83 138 86 22 21 85 139 124 76 122 140 49 98 47 115 106 81 86 21 74 28 56 33 141 75 42 142 74 100 112 140 90 3 32 82 144 145 143 53 107 114 86 87 22 146 109 40 42 41 147 140 122 118 15 63 17 10 72 148 97 126 117 88 143 89 61 146 57 92 34 149 79 45 99 142 94 74 93 24 96 150 149 108 110 151 101 107 106 115 73 13 77 137 131 30 29 19 148 152 9 18 131 29 30 88 129 16 31 153 125 13 12 77 145 155 154 17 127 123 121 155 145 124 139 96 99 95 126 68 32 156 125 114 113 79 98 49 40 109 54 117 126 157 36 85 37 52 158 7 110 55 54 25 0 1 146 40 71 159 100 112 60 78 84 68 156 66 119 103 104 37 23 35 135 130 9 81 52 50 72 71 153 137 59 131 32 141 156 141 5 75 34 33 108 115 81 80 77 134 122 79 99 98 134 135 105 56 136 33 149 91 92 33 136 106 63 147 17 52 7 51 2 160 87 53 55 150 135 152 105 152 18 48 118 103 119 17 147 127 14 20 58 11 57 72 89 154 159 161 109 146 143 154 89 26 28 34 64 46 45 60 84 59 102 25 24 111 160 151 77 12 134 138 116 19 140 128 90 30 31 113 16 70 15 22 87 161 138 19 29 100 76 112 6 8 65 154 142 159 1 94 155 85 43 139 126 69 157 28 4 56 131 138 29 156 141 133 53 150 107 39 53 114 97 99 126 73 21 13 116 18 19 41 43 85 96 24 124 43 27 139 144 143 123 149 34 108 127 36 144 65 64 60 133 42 147 99 45 95 1 2 94 83 49 48 87 111 161 112 76 140 66 132 120 104 105 47 35 121 145 12 14 130 136 158 52 130 58 11 102 0 25 51 6 59 67 66 44 6 65 60 150 108 107 127 144 123 46 67 44 105 152 47 148 72 153 1 155 121 92 93 96 31 148 153 56 158 136 55 91 150 150 91 149 12 130 135 156 132 66 122 134 103 63 133 147 131 84 138 143 145 154 36 35 144 133 141 42 107 115 114 158 3 82 47 98 104 113 31 125 90 129 88 29 148 31 129 157 70 161 111 109 129 70 16 137 30 80 65 67 46 155 94 142 140 118 128 157 69 70 95 120 69 155 142 154 56 3 158 158 82 7 32 5 141 13 20 14 19 10 148 124 23 37 139 26 96 161 146 61 108 33 106 144 35 145 51 59 137 50 137 80 147 41 127 95 44 120 116 83 48 0 160 2 20 61 58 100 73 76 109 110 54 156 133 132 24 23 124 103 134 105 23 25 121 136 52 81 9 130 11 43 75 27 58 61 57 151 160 0 120 132 62 60 64 78 39 114 125 123 143 88 44 66 120 135 9 152 153 71 38 102 24 93 91 101 93 94 86 74 101 151 102 111 151 110 113 115 80 55 101 91 77 122 76 138 83 116 21 20 13 159 112 89 151 0 102 17 123 16 57 146 71 27 26 139 82 32 68 104 97 119 159 142 100 125 153 38 128 157 129 22 161 61 98 97 104 87 160 111 118 117 128 26 34 92 8 68 67 47 152 48 128 117 157 70 62 15</edge_points>\n\t\t\t<clockwise_edges>1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 39 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63 67 68 66 70 71 69 73 74 72 76 77 75 79 80 78 82 83 81 85 86 84 88 89 87 91 92 90 94 95 93 97 98 96 100 101 99 103 104 102 106 107 105 109 110 108 112 113 111 115 116 114 118 119 117 121 122 120 124 125 123 127 128 126 130 131 129 133 134 132 136 137 135 139 140 138 142 143 141 145 146 144 148 149 147 151 152 150 154 155 153 157 158 156 160 161 159 163 164 162 166 167 165 169 170 168 172 173 171 175 176 174 178 179 177 181 182 180 184 185 183 187 188 186 190 191 189 193 194 192 196 197 195 199 200 198 202 203 201 205 206 204 208 209 207 211 212 210 214 215 213 217 218 216 220 221 219 223 224 222 226 227 225 229 230 228 232 233 231 235 236 234 238 239 237 241 242 240 244 245 243 247 248 246 250 251 249 253 254 252 256 257 255 259 260 258 262 263 261 265 266 264 268 269 267 271 272 270 274 275 273 277 278 276 280 281 279 283 284 282 286 287 285 289 290 288 292 293 291 295 296 294 298 299 297 301 302 300 304 305 303 307 308 306 310 311 309 313 314 312 316 317 315 319 320 318 322 323 321 325 326 324 328 329 327 331 332 330 334 335 333 337 338 336 340 341 339 343 344 342 346 347 345 349 350 348 352 353 351 355 356 354 358 359 357 361 362 360 364 365 363 367 368 366 370 371 369 373 374 372 376 377 375 379 380 378 382 383 381 385 386 384 388 389 387 391 392 390 394 395 393 397 398 396 400 401 399 403 404 402 406 407 405 409 410 408 412 413 411 415 416 414 418 419 417 421 422 420 424 425 423 427 428 426 430 431 429 433 434 432 436 437 435 439 440 438 442 443 441 445 446 444 448 449 447 451 452 450 454 455 453 457 458 456 460 461 459 463 464 462 466 467 465 469 470 468 472 473 471 475 476 474 478 479 477 481 482 480 484 485 483 487 488 486 490 491 489 493 494 492 496 497 495 499 500 498 502 503 501 505 506 504 508 509 507 511 512 510 514 515 513 517 518 516 520 521 519 523 524 522 526 527 525 529 530 528 532 533 531 535 536 534 538 539 537 541 542 540 544 545 543 547 548 546 550 551 549 553 554 552 556 557 555 559 560 558 562 563 561 565 566 564 568 569 567 571 572 570 574 575 573 577 578 576 580 581 579 583 584 582 586 587 585 589 590 588 592 593 591 595 596 594 598 599 597 601 602 600 604 605 603 607 608 606 610 611 609 613 614 612 616 617 615 619 620 618 622 623 621 625 626 624 628 629 627 631 632 630 634 635 633 637 638 636 640 641 639 643 644 642 646 647 645 649 650 648 652 653 651 655 656 654 658 659 657 661 662 660 664 665 663 667 668 666 670 671 669 673 674 672 676 677 675 679 680 678 682 683 681 685 686 684 688 689 687 691 692 690 694 695 693 697 698 696 700 701 699 703 704 702 706 707 705 709 710 708 712 713 711 715 716 714 718 719 717 721 722 720 724 725 723 727 728 726 730 731 729 733 734 732 736 737 735 739 740 738 742 743 741 745 746 744 748 749 747 751 752 750 754 755 753 757 758 756 760 761 759 763 764 762 766 767 765 769 770 768 772 773 771 775 776 774 778 779 777 781 782 780 784 785 783 787 788 786 790 791 789 793 794 792 796 797 795 799 800 798 802 803 801 805 806 804 808 809 807 811 812 810 814 815 813 817 818 816 820 821 819 823 824 822 826 827 825 829 830 828 832 833 831 835 836 834 838 839 837 841 842 840 844 845 843 847 848 846 850 851 849 853 854 852 856 857 855 859 860 858 862 863 861 865 866 864 868 869 867 871 872 870 874 875 873 877 878 876 880 881 879 883 884 882 886 887 885 889 890 888 892 893 891 895 896 894 898 899 897 901 902 900 904 905 903 907 908 906 910 911 909 913 914 912 916 917 915 919 920 918 922 923 921 925 926 924 928 929 927 931 932 930 934 935 933 937 938 936 940 941 939 943 944 942 946 947 945 949 950 948 952 953 951 955 956 954 958 959 957</clockwise_edges>\n\t\t\t<edge_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</edge_selection>\n\t\t</polyhedra>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.LSystemParser.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-0.024227030830253557 -0.024680041023449492 -0.0047069525246271338 -0.03426186700014458 -0 -0.0066565722603276921 -0.024227030830253557 0.024680041023449492 -0.0047069525246271338 -0 0.03490251401536227 0 0.024227030830253557 0.024680041023449492 0.0047069525246271338 0.03426186700014458 -0 0.0066565722603276921 0.024227030830253557 -0.024680041023449492 0.0047069525246271338 -0 -0.03490251401536227 0 -0.050853575221349444 -0.024680041023449492 0.13234182978007561 -0.060888411391240474 -0 0.13039221004437504 -0.050853575221349444 0.024680041023449492 0.13234182978007561 -0.026626544391095894 0.03490251401536227 0.13704878230470274 -0.0023995135608423368 0.024680041023449492 0.14175573482932985 0.0076353226090486864 -0 0.14370535456503042 -0.0023995135608423368 -0.024680041023449492 0.14175573482932985 -0.026626544391095894 -0.03490251401536227 0.13704878230470274 -0.050853575221349444 -0.024680041023449492 0.13234182978007561 -0.060888411391240474 -0 0.13039221004437504 -0.050853575221349444 0.024680041023449492 0.13234182978007561 -0.026626544391095894 0.03490251401536227 0.13704878230470274 -0.0023995135608423368 0.024680041023449492 0.14175573482932985 0.0076353226090486864 -0 0.14370535456503042 -0.0023995135608423368 -0.024680041023449492 0.14175573482932985 -0.026626544391095894 -0.03490251401536227 0.13704878230470274 -0.079994728236578161 -0.024680041023449492 0.26839672852148511 -0.089990558742693391 -0 0.26625609156875291 -0.079994728236578161 0.024680041023449492 0.26839672852148511 -0.055861868492215007 0.03490251401536227 0.27356485250200707 -0.031729008747851846 0.024680041023449492 0.27873297648252904 -0.021733178241736626 -0 0.28087361343526124 -0.031729008747851846 -0.024680041023449492 0.27873297648252904 -0.055861868492215007 -0.03490251401536227 0.27356485250200707 -0.079994728236578161 -0.024680041023449492 0.26839672852148511 -0.089990558742693391 -0 0.26625609156875291 -0.079994728236578161 0.024680041023449492 0.26839672852148511 -0.055861868492215007 0.03490251401536227 0.27356485250200707 -0.031729008747851846 0.024680041023449492 0.27873297648252904 -0.021733178241736626 -0 0.28087361343526124 -0.031729008747851846 -0.024680041023449492 0.27873297648252904 -0.055861868492215007 -0.03490251401536227 0.27356485250200707 -0.1119686423195194 -0.024680041023449496 0.40376652665800122 -0.12191745856517169 -0 0.40141705663677696 -0.1119686423195194 0.024680041023449496 0.40376652665800122 -0.087949288756862989 0.034902514015362276 0.40943883477297999 -0.063929935194206561 0.024680041023449496 0.41511114288795881 -0.053981118948554271 -0 0.41746061290918302 -0.063929935194206561 -0.024680041023449496 0.41511114288795881 -0.087949288756862989 -0.034902514015362276 0.40943883477297999 -0.1119686423195194 -0.024680041023449496 0.40376652665800122 -0.12191745856517169 -0 0.40141705663677696 -0.1119686423195194 0.024680041023449496 0.40376652665800122 -0.087949288756862989 0.034902514015362276 0.40943883477297999 -0.063929935194206561 0.024680041023449496 0.41511114288795881 -0.053981118948554271 -0 0.41746061290918302 -0.063929935194206561 -0.024680041023449496 0.41511114288795881 -0.087949288756862989 -0.034902514015362276 0.40943883477297999 -0.14703345580215429 -0.024680041023449496 0.53831671195481468 -0.15692565048958065 -0 0.53573922512915684 -0.14703345580215429 0.024680041023449496 0.53831671195481468 -0.12315080324921762 0.034902514015362276 0.54453951935620981 -0.099268150696280963 0.024680041023449496 0.55076232675760495 -0.089375956008854604 -0 0.55333981358326279 -0.099268150696280963 -0.024680041023449496 0.55076232675760495 -0.12315080324921762 -0.034902514015362276 0.54453951935620981 -0.26153493960106572 -0 0.5260686665452019 -0.26153493960106572 -0 0.5260686665452019 -0.12315080324921762 -0 0.54453951935620981 -0.12315080324921762 -0 0.54453951935620981 -0.1688805466528342 -0.13178771549845777 0.55020787091109269 -0.16888148173042497 -0.13178728944583987 0.55021023214911879 -0.16888148173042497 -0.13178728944583987 0.55021023214911879 -0.12315080324921762 -0 0.54453951935620981 -0.12315080324921762 -0 0.54453951935620981 -0.018960205685380944 -0.081454141016833626 0.58927075998189804 -0.018961325921575012 -0.081454303705827541 0.58927307297543674 -0.018961325921575012 -0.081454303705827541 0.58927307297543674 -0.12315080324921762 -0 0.54453951935620981 -0.12315080324921762 -0 0.54453951935620981 -0.018952390313202606 0.081443024683573492 0.5892727963367681 -0.018953025938112322 0.081442498077110265 0.58927523559947559 -0.018953025938112322 0.081442498077110265 0.58927523559947559 -0.12315080324921762 -0 0.54453951935620981 -0.12315080324921762 -0 0.54453951935620981 -0.16886790080192257 0.13179196111460037 0.55021116588406427 -0.16886805174256991 0.1317917983218049 0.55021373143495567 -0.16886805174256991 0.1317917983218049 0.55021373143495567 -0.12315080324921762 -0 0.54453951935620981 -0.12315080324921762 -0 0.54453951935620981 -0.26153460287637864 1.4166459484364304e-05 0.52606614940176 -0.14703345580215429 -0.024680041023449496 0.53831671195481468 -0.15692565048958065 -0 0.53573922512915684 -0.14703345580215429 0.024680041023449496 0.53831671195481468 -0.12315080324921762 0.034902514015362276 0.54453951935620981 -0.099268150696280963 0.024680041023449496 0.55076232675760495 -0.089375956008854604 -0 0.55333981358326279 -0.099268150696280963 -0.024680041023449496 0.55076232675760495 -0.12315080324921762 -0.034902514015362276 0.54453951935620981 -0.18223497029450894 -0.024680041023449496 0.67341739653804455 -0.1921271649819353 -0 0.67083990971238672 -0.18223497029450894 0.024680041023449496 0.67341739653804455 -0.15835231774157227 0.034902514015362276 0.67964020393943969 -0.1344696651886356 0.024680041023449496 0.68586301134083472 -0.12457747050120924 -0 0.68844049816649266 -0.1344696651886356 -0.024680041023449496 0.68586301134083472 -0.15835231774157227 -0.034902514015362276 0.67964020393943969 -0.18223497029450894 -0.024680041023449496 0.67341739653804455 -0.1921271649819353 -0 0.67083990971238672 -0.18223497029450894 0.024680041023449496 0.67341739653804455 -0.15835231774157227 0.034902514015362276 0.67964020393943969 -0.1344696651886356 0.024680041023449496 0.68586301134083472 -0.12457747050120924 -0 0.68844049816649266 -0.1344696651886356 -0.024680041023449496 0.68586301134083472 -0.15835231774157227 -0.034902514015362276 0.67964020393943969 -0.21743648478686356 -0.024680041023449496 0.80851808112127432 -0.22732867947428997 -0 0.80594059429561649 -0.21743648478686356 0.024680041023449496 0.80851808112127432 -0.19355383223392691 0.034902514015362276 0.81474088852266946 -0.16967117968099024 0.024680041023449496 0.8209636959240646 -0.15977898499356388 -0 0.82354118274972243 -0.16967117968099024 -0.024680041023449496 0.8209636959240646 -0.19355383223392691 -0.034902514015362276 0.81474088852266946</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 128 132 133 131 135 136 134 138 139 137 141 142 140 144 145 143 147 148 146 150 151 149 153 154 152 156 157 155 159 160 158 162 163 161 165 166 164 168 169 167 171 172 170 174 175 176 173 178 179 180 177 182 183 184 181 186 187 188 185 190 191 192 189 194 195 196 193 198 199 200 197 202 203 204 201 206 207 208 205 210 211 212 209 214 215 216 213 218 219 220 217 222 223 224 221 226 227 228 225 230 231 232 229 234 235 236 233</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 131 134 137 140 143 146 149 152 155 158 161 164 167 170 173 177 181 185 189 193 197 201 205 209 213 217 221 225 229 233</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 8 9 1 1 9 10 2 2 10 11 3 3 11 12 4 4 12 13 5 5 13 14 6 6 14 15 7 7 15 8 0 16 24 25 17 17 25 26 18 18 26 27 19 19 27 28 20 20 28 29 21 21 29 30 22 22 30 31 23 23 31 24 16 32 40 41 33 33 41 42 34 34 42 43 35 35 43 44 36 36 44 45 37 37 45 46 38 38 46 47 39 39 47 40 32 48 56 57 49 49 57 58 50 50 58 59 51 51 59 60 52 52 60 61 53 53 61 62 54 54 62 63 55 55 63 56 48 64 65 66 64 66 67 64 67 68 69 70 71 69 71 72 69 72 73 74 75 76 74 76 77 74 77 78 79 80 81 79 81 82 79 82 83 84 85 86 84 86 87 84 87 88 89 97 98 90 90 98 99 91 91 99 100 92 92 100 101 93 93 101 102 94 94 102 103 95 95 103 104 96 96 104 97 89 105 113 114 106 106 114 115 107 107 115 116 108 108 116 117 109 109 117 118 110 110 118 119 111 111 119 120 112 112 120 113 105\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.LeastSquaresPlot.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-10 -10 -50.390352690297107 -8.6666666666666661 -10 -40.86628207307384 -7.333333333333333 -10 -32.012889469871041 -6 -10 -23.830174880688705 -4.666666666666667 -10 -16.31813830552683 -3.3333333333333335 -10 -9.4767797443854072 -2 -10 -3.3060991972644462 -0.66666666666666663 -10 2.1939033358360538 0.66666666666666663 -10 7.0232278549160929 2 -10 11.181874359975673 3.3333333333333335 -10 14.669842851014794 4.666666666666667 -10 17.487133328033451 6 -10 19.63374579103165 7.333333333333333 -10 21.109680240009389 8.6666666666666661 -10 21.914936674966668 10 -10 22.049515095903487 -10 -8.6666666666666661 -56.183833599852406 -8.6666666666666661 -8.6666666666666661 -47.303672918506479 -7.333333333333333 -8.6666666666666661 -39.094190251181018 -6 -8.6666666666666661 -31.555385597876022 -4.666666666666667 -8.6666666666666661 -24.687258958591482 -3.3333333333333335 -8.6666666666666661 -18.489810333327398 -2 -8.6666666666666661 -12.963039722083778 -0.66666666666666663 -8.6666666666666661 -8.106947124860616 0.66666666666666663 -8.6666666666666661 -3.9215325416579159 2 -8.6666666666666661 -0.40679597247567473 3.3333333333333335 -8.6666666666666661 2.437262582686107 4.666666666666667 -8.6666666666666661 4.6106431238274252 6 -8.6666666666666661 6.1133456509482889 7.333333333333333 -8.6666666666666661 6.9453701640486862 8.6666666666666661 -8.6666666666666661 7.1067166631286254 10 -8.6666666666666661 6.5973851481881027 -10 -7.333333333333333 -52.906612546548999 -8.6666666666666661 -7.333333333333333 -44.670361801080411 -7.333333333333333 -7.333333333333333 -37.10478906963229 -6 -7.333333333333333 -30.209894352204628 -4.666666666666667 -7.333333333333333 -23.985677648797424 -3.3333333333333335 -7.333333333333333 -18.432138959410679 -2 -7.333333333333333 -13.549278284044398 -0.66666666666666663 -7.333333333333333 -9.3370956226985751 0.66666666666666663 -7.333333333333333 -5.7955909753732131 2 -7.333333333333333 -2.9247643420683112 3.3333333333333335 -7.333333333333333 -0.72461572278386899 4.666666666666667 -7.333333333333333 0.80485488248011194 6 -7.333333333333333 1.6636474737236346 7.333333333333333 -7.333333333333333 1.8517620509466948 8.6666666666666661 -7.333333333333333 1.3691986141492973 10 -7.333333333333333 0.21595716333143655 -10 -6 -38.184708704442535 -8.6666666666666661 -6 -30.592367894851286 -7.333333333333333 -6 -23.670705099280504 -6 -6 -17.419720317730178 -4.666666666666667 -6 -11.839413550200316 -3.3333333333333335 -6 -6.9297847966909112 -2 -6 -2.6908340572019669 -0.66666666666666663 -6 0.87743866826651695 0.66666666666666663 -6 3.7750333797145408 2 -6 6.001950077142105 3.3333333333333335 -6 7.558188760549208 4.666666666666667 -6 8.4437494299358509 6 -6 8.6586320853020347 7.333333333333333 -6 8.2028367266477602 8.6666666666666661 -6 7.0763633539730231 10 -6 5.2792119672778233 -10 -4.666666666666667 -27.14906801227373 -8.6666666666666661 -4.666666666666667 -20.20063713855982 -7.333333333333333 -4.666666666666667 -13.922884278866375 -6 -4.666666666666667 -8.3158094331933903 -4.666666666666667 -4.666666666666667 -3.3794126015408676 -3.3333333333333335 -4.666666666666667 0.88630621609120053 -2 -4.666666666666667 4.481347019702806 -0.66666666666666663 -4.666666666666667 7.4057098092939517 0.66666666666666663 -4.666666666666667 9.6593945848646374 2 -4.666666666666667 11.242401346414862 3.3333333333333335 -4.666666666666667 12.154730093944627 4.666666666666667 -4.666666666666667 12.396380827453932 6 -4.666666666666667 11.967353546942777 7.333333333333333 -4.666666666666667 10.867648252411161 8.6666666666666661 -4.666666666666667 9.097264943859086 10 -4.666666666666667 6.6562036212865507 -10 -3.3333333333333335 -29.292405304803122 -8.6666666666666661 -3.3333333333333335 -22.987884366966551 -7.333333333333333 -3.3333333333333335 -17.354041443150443 -6 -3.3333333333333335 -12.390876533354795 -4.666666666666667 -3.3333333333333335 -8.0983896375796114 -3.3333333333333335 -3.3333333333333335 -4.4765807558248829 -2 -3.3333333333333335 -1.5254498880906158 -0.66666666666666663 -3.3333333333333335 0.75500296562319091 0.66666666666666663 -3.3333333333333335 2.3647778053165376 2 -3.3333333333333335 3.3038746309894242 3.3333333333333335 -3.3333333333333335 3.5722934426418509 4.666666666666667 -3.3333333333333335 3.1700342402738162 6 -3.3333333333333335 2.0970970238853228 7.333333333333333 -3.3333333333333335 0.35348179347636877 8.6666666666666661 -3.3333333333333335 -2.060811450953044 10 -3.3333333333333335 -5.14578270940292 -10 -2 -33.949861046862708 -8.6666666666666661 -2 -28.289250044903472 -7.333333333333333 -2 -23.299317056964707 -6 -2 -18.980062083046395 -4.666666666666667 -2 -15.33148512314855 -3.3333333333333335 -2 -12.353586177271159 -2 -2 -10.046365245414233 -0.66666666666666663 -2 -8.4098223275777624 0.66666666666666663 -2 -7.4439574237617547 2 -2 -7.148770533966208 3.3333333333333335 -2 -7.5242616581911204 4.666666666666667 -2 -8.5704307964364936 6 -2 -10.287277948702325 7.333333333333333 -2 -12.674803114988618 8.6666666666666661 -2 -15.73300629529537 10 -2 -19.461887489622587 -10 -0.66666666666666663 -26.611169050351599 -8.6666666666666661 -0.66666666666666663 -21.594467984269706 -7.333333333333333 -0.66666666666666663 -17.24844493220828 -6 -0.66666666666666663 -13.57309989416731 -4.666666666666667 -0.66666666666666663 -10.5684328701468 -3.3333333333333335 -0.66666666666666663 -8.2344438601467491 -2 -0.66666666666666663 -6.5711328641671596 -0.66666666666666663 -0.66666666666666663 -5.5784998822080301 0.66666666666666663 -0.66666666666666663 -5.2565449142693605 2 -0.66666666666666663 -5.605267960351151 3.3333333333333335 -0.66666666666666663 -6.6246690204534033 4.666666666666667 -0.66666666666666663 -8.3147480945761139 6 -0.66666666666666663 -10.675505182719284 7.333333333333333 -0.66666666666666663 -13.706940284882917 8.6666666666666661 -0.66666666666666663 -17.409053401067005 10 -0.66666666666666663 -21.78184453127156 -10 0.66666666666666663 -11.114469238299284 -8.6666666666666661 0.66666666666666663 -6.7416781080947299 -7.333333333333333 0.66666666666666663 -3.0395649919106398 -6 0.66666666666666663 -0.0081298897470085674 -4.666666666666667 0.66666666666666663 2.3526271983961613 -3.3333333333333335 0.66666666666666663 4.0427062725188732 -2 0.66666666666666663 5.0621073326211246 -0.66666666666666663 0.66666666666666663 5.4108303787029151 0.66666666666666663 0.66666666666666663 5.0888754107642455 2 0.66666666666666663 4.096242428805116 3.3333333333333335 0.66666666666666663 2.4329314328255265 4.666666666666667 0.66666666666666663 0.098942422825476051 6 0.66666666666666663 -2.9057246011950326 7.333333333333333 0.66666666666666663 -6.5810696392360022 8.6666666666666661 0.66666666666666663 -10.92709269129743 10 0.66666666666666663 -15.943793757379323 -10 2 -3.7757772417881812 -8.6666666666666661 2 -0.046896047460965928 -7.333333333333333 2 3.0113071328457863 -6 2 5.3988322991320787 -4.666666666666667 2 7.1156794513979102 -3.3333333333333335 2 8.1618485896432844 -2 2 8.5373397138681959 -0.66666666666666663 2 8.2421528240726474 0.66666666666666663 2 7.2762879202566397 2 2 5.6397450024201721 3.3333333333333335 2 3.332524070563244 4.666666666666667 2 0.35462512468585411 6 2 -3.2939518352119928 7.333333333333333 2 -7.6132068091303005 8.6666666666666661 2 -12.603139797069069 10 2 -18.263750799028301 -10 3.3333333333333335 -8.4332329838477644 -8.6666666666666661 3.3333333333333335 -5.3482617253978875 -7.333333333333333 3.3333333333333335 -2.933968480968475 -6 3.3333333333333335 -1.1903532505595207 -4.666666666666667 3.3333333333333335 -0.11741603417102753 -3.3333333333333335 3.3333333333333335 0.28484316819700722 -2 3.3333333333333335 0.016424356544580701 -0.66666666666666663 3.3333333333333335 -0.92267246912830592 0.66666666666666663 3.3333333333333335 -2.5324473088216526 2 3.3333333333333335 -4.8129001625354588 3.3333333333333335 3.3333333333333335 -7.7640310302697264 4.666666666666667 3.3333333333333335 -11.385839912024455 6 3.3333333333333335 -15.678326807799639 7.333333333333333 3.3333333333333335 -20.641491717595287 8.6666666666666661 3.3333333333333335 -26.275334641411394 10 3.3333333333333335 -32.579855579247962 -10 4.666666666666667 -10.576570276377154 -8.6666666666666661 4.666666666666667 -8.1355089538046172 -7.333333333333333 4.666666666666667 -6.3651256452525429 -6 4.666666666666667 -5.2654203507209276 -4.666666666666667 4.666666666666667 -4.8363930702097715 -3.3333333333333335 4.666666666666667 -5.0780438037190754 -2 4.666666666666667 -5.990372551248841 -0.66666666666666663 4.666666666666667 -7.5733793127990667 0.66666666666666663 4.666666666666667 -9.8270640883697524 2 4.666666666666667 -12.751426877960897 3.3333333333333335 4.666666666666667 -16.346467681572502 4.666666666666667 4.666666666666667 -20.612186499204572 6 4.666666666666667 -25.548583330857095 7.333333333333333 4.666666666666667 -31.155658176530078 8.6666666666666661 4.666666666666667 -37.433411036223525 10 4.666666666666667 -44.381841909937435 -10 6 0.45907041579164964 -8.6666666666666661 6 2.2562218024868494 -7.333333333333333 6 3.3826951751615857 -6 6 3.8384905338158619 -4.666666666666667 6 3.6236078784496772 -3.3333333333333335 6 2.7380472090630352 -2 6 1.1818085256559319 -0.66666666666666663 6 -1.045108171771632 0.66666666666666663 6 -3.9427028832196558 2 6 -7.5109756086881401 3.3333333333333335 6 -11.749926348177084 4.666666666666667 6 -16.65955510168649 6 6 -22.239861869216352 7.333333333333333 6 -28.490846650766677 8.6666666666666661 6 -35.412509446337459 10 6 -43.004850255928709 -10 7.333333333333333 15.180974257898113 -8.6666666666666661 7.333333333333333 16.334215708715973 -7.333333333333333 7.333333333333333 16.816779145513369 -6 7.333333333333333 16.628664568290311 -4.666666666666667 7.333333333333333 15.769871977046787 -3.3333333333333335 7.333333333333333 14.240401371782806 -2 7.333333333333333 12.040252752498363 -0.66666666666666663 7.333333333333333 9.1694261191934601 0.66666666666666663 7.333333333333333 5.6279214718680981 2 7.333333333333333 1.4157388105222761 3.3333333333333335 7.333333333333333 -3.4671218648440059 4.666666666666667 7.333333333333333 -9.0206605542307514 6 7.333333333333333 -15.244877257637953 7.333333333333333 7.333333333333333 -22.139771975065614 8.6666666666666661 7.333333333333333 -29.705344706513735 10 7.333333333333333 -37.941595451982323 -10 8.6666666666666661 18.458195311201521 -8.6666666666666661 8.6666666666666661 18.967526826142041 -7.333333333333333 8.6666666666666661 18.806180327062101 -6 8.6666666666666661 17.974155813961705 -4.666666666666667 8.6666666666666661 16.471453286840841 -3.3333333333333335 8.6666666666666661 14.298072745699523 -2 8.6666666666666661 11.454014190537741 -0.66666666666666663 8.6666666666666661 7.9392776213555001 0.66666666666666663 8.6666666666666661 3.7538630381528 2 8.6666666666666661 -1.1022295590703612 3.3333333333333335 8.6666666666666661 -6.6290001703139829 4.666666666666667 8.6666666666666661 -12.826448795578065 6 8.6666666666666661 -19.694575434862607 7.333333333333333 8.6666666666666661 -27.233380088167603 8.6666666666666661 8.6666666666666661 -35.442862755493067 10 8.6666666666666661 -44.323023436838987 -10 10 12.664714401646222 -8.6666666666666661 10 12.530135980709403 -7.333333333333333 10 11.724879545752128 -6 10 10.248945096774388 -4.666666666666667 10 8.1023326337761894 -3.3333333333333335 10 5.2850421567575312 -2 10 1.7970736657184112 -0.66666666666666663 10 -2.3615728393411688 0.66666666666666663 10 -7.1908973584212079 2 10 -12.690899891521708 3.3333333333333335 10 -18.861580438642669 4.666666666666667 10 -25.702938999784092 6 10 -33.214975574945967 7.333333333333333 10 -41.397690164128306 8.6666666666666661 10 -50.251082767331106 10 10 -59.775153384554372</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 17 16 1 2 18 17 2 3 19 18 3 4 20 19 4 5 21 20 5 6 22 21 6 7 23 22 7 8 24 23 8 9 25 24 9 10 26 25 10 11 27 26 11 12 28 27 12 13 29 28 13 14 30 29 14 15 31 30 16 17 33 32 17 18 34 33 18 19 35 34 19 20 36 35 20 21 37 36 21 22 38 37 22 23 39 38 23 24 40 39 24 25 41 40 25 26 42 41 26 27 43 42 27 28 44 43 28 29 45 44 29 30 46 45 30 31 47 46 32 33 49 48 33 34 50 49 34 35 51 50 35 36 52 51 36 37 53 52 37 38 54 53 38 39 55 54 39 40 56 55 40 41 57 56 41 42 58 57 42 43 59 58 43 44 60 59 44 45 61 60 45 46 62 61 46 47 63 62 48 49 65 64 49 50 66 65 50 51 67 66 51 52 68 67 52 53 69 68 53 54 70 69 54 55 71 70 55 56 72 71 56 57 73 72 57 58 74 73 58 59 75 74 59 60 76 75 60 61 77 76 61 62 78 77 62 63 79 78 64 65 81 80 65 66 82 81 66 67 83 82 67 68 84 83 68 69 85 84 69 70 86 85 70 71 87 86 71 72 88 87 72 73 89 88 73 74 90 89 74 75 91 90 75 76 92 91 76 77 93 92 77 78 94 93 78 79 95 94 80 81 97 96 81 82 98 97 82 83 99 98 83 84 100 99 84 85 101 100 85 86 102 101 86 87 103 102 87 88 104 103 88 89 105 104 89 90 106 105 90 91 107 106 91 92 108 107 92 93 109 108 93 94 110 109 94 95 111 110 96 97 113 112 97 98 114 113 98 99 115 114 99 100 116 115 100 101 117 116 101 102 118 117 102 103 119 118 103 104 120 119 104 105 121 120 105 106 122 121 106 107 123 122 107 108 124 123 108 109 125 124 109 110 126 125 110 111 127 126 112 113 129 128 113 114 130 129 114 115 131 130 115 116 132 131 116 117 133 132 117 118 134 133 118 119 135 134 119 120 136 135 120 121 137 136 121 122 138 137 122 123 139 138 123 124 140 139 124 125 141 140 125 126 142 141 126 127 143 142 128 129 145 144 129 130 146 145 130 131 147 146 131 132 148 147 132 133 149 148 133 134 150 149 134 135 151 150 135 136 152 151 136 137 153 152 137 138 154 153 138 139 155 154 139 140 156 155 140 141 157 156 141 142 158 157 142 143 159 158 144 145 161 160 145 146 162 161 146 147 163 162 147 148 164 163 148 149 165 164 149 150 166 165 150 151 167 166 151 152 168 167 152 153 169 168 153 154 170 169 154 155 171 170 155 156 172 171 156 157 173 172 157 158 174 173 158 159 175 174 160 161 177 176 161 162 178 177 162 163 179 178 163 164 180 179 164 165 181 180 165 166 182 181 166 167 183 182 167 168 184 183 168 169 185 184 169 170 186 185 170 171 187 186 171 172 188 187 172 173 189 188 173 174 190 189 174 175 191 190 176 177 193 192 177 178 194 193 178 179 195 194 179 180 196 195 180 181 197 196 181 182 198 197 182 183 199 198 183 184 200 199 184 185 201 200 185 186 202 201 186 187 203 202 187 188 204 203 188 189 205 204 189 190 206 205 190 191 207 206 192 193 209 208 193 194 210 209 194 195 211 210 195 196 212 211 196 197 213 212 197 198 214 213 198 199 215 214 199 200 216 215 200 201 217 216 201 202 218 217 202 203 219 218 203 204 220 219 204 205 221 220 205 206 222 221 206 207 223 222 208 209 225 224 209 210 226 225 210 211 227 226 211 212 228 227 212 213 229 228 213 214 230 229 214 215 231 230 215 216 232 231 216 217 233 232 217 218 234 233 218 219 235 234 219 220 236 235 220 221 237 236 221 222 238 237 222 223 239 238 224 225 241 240 225 226 242 241 226 227 243 242 227 228 244 243 228 229 245 244 229 230 246 245 230 231 247 246 231 232 248 247 232 233 249 248 233 234 250 249 234 235 251 250 235 236 252 251 236 237 253 252 237 238 254 253 238 239 255 254\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.LinearKnot.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>7.5 0 0 7.2900034797613076 1.3906425379733223 0.62172471791213701 6.6858057932702151 2.647097774937746 1.2043841852542883 5.7603610498770061 3.655636283073616 1.7113677648217211 4.6213454452856908 4.3397322340982356 2.1108198137550378 3.3930153414657171 4.6700849718747364 2.3776412907378837 2.1957337151308494 4.6661716641013946 2.495066821070679 1.1269498408714587 4.3891798405984561 2.4557181268217216 0.24711534034108174 3.9277858586583658 2.2620676311650487 -0.42694014335486363 3.3795792285718784 1.926283106939473 -0.92008497187473681 2.8317303707412345 1.4694631307311832 -1.288960275083459 2.3446100363903586 0.92031138171169535 -1.6061256707429374 1.9414724245905677 0.31333308391076242 -1.941472424590567 1.6061256707429381 -0.31333308391076187 -2.3446100363903586 1.2889602750834595 -0.9203113817116948 -2.8317303707412345 0.92008497187473737 -1.4694631307311825 -3.3795792285718789 0.42694014335486263 -1.9262831069394735 -3.9277858586583676 -0.24711534034108376 -2.2620676311650496 -4.3891798405984561 -1.12694984087146 -2.4557181268217216 -4.6661716641013946 -2.1957337151308458 -2.495066821070679 -4.6700849718747373 -3.3930153414657154 -2.3776412907378841 -4.3397322340982365 -4.6213454452856881 -2.1108198137550387 -3.6556362830736195 -5.7603610498770017 -1.7113677648217225 -2.6470977749377447 -6.685805793270216 -1.2043841852542883 -1.3906425379733287 -7.2900034797613049 -0.62172471791214057 -1.3777276490407724e-15 -7.5 -6.1232339957367663e-16 1.3906425379733258 -7.2900034797613067 0.62172471791213946 2.6470977749377482 -6.6858057932702151 1.2043841852542894 3.6556362830736164 -5.7603610498770053 1.7113677648217216 4.3397322340982329 -4.621345445285697 2.1108198137550356 4.6700849718747381 -3.3930153414657176 2.3776412907378837 4.6661716641013937 -2.1957337151308449 2.495066821070679 4.3891798405984552 -1.1269498408714573 2.4557181268217216 3.9277858586583649 -0.24711534034108154 2.2620676311650483 3.3795792285718762 0.42694014335486574 1.9262831069394715 2.8317303707412349 0.92008497187473659 1.4694631307311834 2.3446100363903581 1.2889602750834608 0.92031138171169491 1.9414724245905657 1.606125670742939 0.31333308391075976 1.6061256707429399 1.9414724245905648 -0.31333308391075793 1.2889602750834614 2.3446100363903568 -0.92031138171169313 0.92008497187473781 2.8317303707412336 -1.4694631307311821 0.42694014335486741 3.3795792285718749 -1.9262831069394701 -0.24711534034107929 3.9277858586583632 -2.2620676311650474 -1.1269498408714593 4.3891798405984579 -2.4557181268217221 -2.1957337151308423 4.6661716641013946 -2.495066821070679 -3.3930153414657136 4.6700849718747381 -2.3776412907378845 -4.6213454452856926 4.3397322340982338 -2.1108198137550378 -5.7603610498769999 3.6556362830736191 -1.7113677648217243 -6.6858057932702071 2.6470977749377567 -1.2043841852542945 -7.2900034797613058 1.39064253797333 -0.62172471791213901 -7.5 2.7554552980815448e-15 -1.2246467991473533e-15 -7.2900034797613067 -1.3906425379733247 0.62172471791213657 -6.6858057932702106 -2.6470977749377522 1.2043841852542927 -5.7603610498770035 -3.6556362830736155 1.7113677648217227 -4.6213454452856855 -4.3397322340982374 2.1108198137550387 -3.3930153414657078 -4.670084971874739 2.377641290737885 -2.1957337151308467 -4.6661716641013946 2.495066821070679 -1.1269498408714633 -4.3891798405984597 2.4557181268217225 -0.24711534034108984 -3.9277858586583729 2.2620676311650518 0.42694014335485969 -3.379579228571882 1.9262831069394746 0.92008497187473615 -2.8317303707412362 1.4694631307311843 1.2889602750834603 -2.3446100363903581 0.92031138171169546 1.6061256707429399 -1.9414724245905646 0.31333308391075593 1.9414724245905663 -1.6061256707429385 -0.31333308391076176 2.3446100363903599 -1.2889602750834583 -0.9203113817116968 2.8317303707412327 -0.92008497187473826 -1.4694631307311814 3.3795792285718824 -0.42694014335486297 -1.9262831069394752 3.9277858586583667 0.24711534034107885 -2.2620676311650492 4.3891798405984597 1.1269498408714671 -2.4557181268217225 4.6661716641013937 2.1957337151308307 -2.4950668210706795 4.6700849718747364 3.3930153414657132 -2.3776412907378845 4.33973223409824 4.6213454452856801 -2.1108198137550405 3.6556362830736115 5.7603610498770088 -1.7113677648217218 2.6470977749377465 6.6858057932702151 -1.2043841852542914 1.3906425379733185 7.2900034797613076 -0.62172471791213524 4.1331829471223176e-15 7.5 -1.8369701987210296e-15 -1.3906425379733103 7.2900034797613102 0.6217247179121318 -2.6470977749377393 6.6858057932702186 1.204384185254288 -3.6556362830736062 5.7603610498770141 1.7113677648217189 -4.3397322340982374 4.6213454452856872 2.1108198137550387 -4.6700849718747364 3.3930153414657211 2.3776412907378832 -4.6661716641013955 2.1957337151308378 2.495066821070679 -4.3891798405984623 1.1269498408714731 2.4557181268217234 -3.9277858586583698 0.24711534034108329 2.2620676311650505 -3.3795792285718851 -0.42694014335485941 1.9262831069394775 -2.8317303707412429 -0.92008497187473226 1.4694631307311918 -2.3446100363903577 -1.2889602750834592 0.92031138171169191 -1.9414724245905686 -1.6061256707429363 0.31333308391076098 -1.6061256707429421 -1.9414724245905628 -0.3133330839107567 -1.2889602750834586 -2.344610036390359 -0.92031138171169613 -0.92008497187473859 -2.8317303707412327 -1.469463130731181 -0.4269401433548573 -3.379579228571882 -1.926283106939475 0.24711534034108498 -3.9277858586583658 -2.2620676311650487 1.1269498408714764 -4.3891798405984659 -2.4557181268217243 2.1957337151308383 -4.6661716641013911 -2.4950668210706795 3.3930153414657256 -4.670084971874739 -2.3776412907378819 4.6213454452856659 -4.3397322340982436 -2.1108198137550453 5.7603610498770008 -3.6556362830736222 -1.711367764821722 6.6858057932702089 -2.6470977749377593 -1.204384185254292 7.2900034797613076 -1.3906425379733198 -0.6217247179121359</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"linear_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"periodic\" type=\"k3d::bool_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">100</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"width\" type=\"k3d::double_t\">0.10000000000000001</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.LinearKnot.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>7.5 0 0 7.2900034797613076 1.390642537973322 0.62172471791213679 6.6858057932702168 2.6470977749377456 1.204384185254288 5.7603610498770044 3.6556362830736164 1.7113677648217218 4.6213454452856908 4.3397322340982356 2.1108198137550374 3.3930153414657163 4.6700849718747373 2.3776412907378837 2.195733715130848 4.6661716641013946 2.495066821070679 1.1269498408714587 4.3891798405984561 2.4557181268217216 0.24711534034108276 3.9277858586583672 2.2620676311650492 -0.42694014335486286 3.3795792285718789 1.926283106939473 -0.92008497187473692 2.8317303707412349 1.4694631307311832 -1.288960275083459 2.344610036390359 0.92031138171169535 -1.6061256707429383 1.9414724245905663 0.3133330839107602 -1.9414724245905661 1.6061256707429388 -0.31333308391075959 -2.3446100363903586 1.2889602750834592 -0.9203113817116948 -2.831730370741234 0.92008497187473726 -1.4694631307311825 -3.3795792285718775 0.42694014335486408 -1.9262831069394721 -3.9277858586583654 -0.24711534034108196 -2.2620676311650483 -4.389179840598457 -1.126949840871458 -2.4557181268217216 -4.6661716641013946 -2.1957337151308485 -2.495066821070679 -4.6700849718747373 -3.3930153414657154 -2.3776412907378841 -4.3397322340982365 -4.6213454452856881 -2.1108198137550387 -3.6556362830736191 -5.7603610498770026 -1.7113677648217225 -2.6470977749377451 -6.6858057932702168 -1.2043841852542883 -1.3906425379733223 -7.2900034797613076 -0.62172471791213624 -1.3776821480501744e-15 -7.5 -6.1230317691118863e-16 1.3906425379733196 -7.2900034797613076 0.62172471791213502 2.6470977749377425 -6.6858057932702177 1.2043841852542871 3.6556362830736173 -5.7603610498770044 1.7113677648217216 4.3397322340982347 -4.6213454452856908 2.1108198137550378 4.6700849718747373 -3.393015341465718 2.3776412907378837 4.6661716641013955 -2.1957337151308507 2.495066821070679 4.3891798405984588 -1.1269498408714622 2.4557181268217225 3.9277858586583645 -0.24711534034108157 2.2620676311650483 3.3795792285718802 0.42694014335486313 1.9262831069394744 2.8317303707412353 0.92008497187473648 1.4694631307311834 2.344610036390359 1.2889602750834583 0.92031138171169491 1.9414724245905677 1.6061256707429374 0.3133330839107642 1.6061256707429383 1.9414724245905666 -0.31333308391076231 1.2889602750834595 2.3446100363903577 -0.92031138171169313 0.92008497187473781 2.8317303707412336 -1.4694631307311821 0.42694014335486485 3.3795792285718789 -1.926283106939473 -0.24711534034107926 3.9277858586583627 -2.2620676311650474 -1.1269498408714596 4.3891798405984579 -2.4557181268217221 -2.1957337151308423 4.6661716641013955 -2.495066821070679 -3.3930153414657145 4.6700849718747381 -2.3776412907378845 -4.6213454452856926 4.3397322340982338 -2.1108198137550378 -5.7603610498769999 3.6556362830736187 -1.7113677648217247 -6.6858057932702177 2.6470977749377465 -1.2043841852542869 -7.2900034797613058 1.39064253797333 -0.62172471791213901 -7.5 2.7553642961003488e-15 -1.2246063538223773e-15 -7.2900034797613067 -1.3906425379733247 0.62172471791213668 -6.6858057932702204 -2.6470977749377416 1.2043841852542847 -5.7603610498770035 -3.6556362830736151 1.7113677648217227 -4.621345445285697 -4.3397322340982321 2.1108198137550365 -3.3930153414657189 -4.6700849718747373 2.3776412907378837 -2.1957337151308467 -4.6661716641013955 2.495066821070679 -1.1269498408714633 -4.3891798405984597 2.4557181268217225 -0.24711534034108229 -3.9277858586583649 2.2620676311650483 0.42694014335485964 -3.3795792285718815 1.9262831069394746 0.92008497187473615 -2.8317303707412358 1.4694631307311838 1.2889602750834601 -2.3446100363903581 0.92031138171169546 1.606125670742937 -1.9414724245905679 0.31333308391076475 1.9414724245905663 -1.6061256707429385 -0.31333308391076176 2.3446100363903546 -1.288960275083461 -0.92031138171168858 2.8317303707412331 -0.92008497187473826 -1.4694631307311814 3.379579228571882 -0.4269401433548628 -1.9262831069394752 3.9277858586583667 0.24711534034107877 -2.2620676311650492 4.3891798405984535 1.1269498408714576 -2.4557181268217212 4.6661716641013902 2.1957337151308391 -2.4950668210706795 4.6700849718747373 3.3930153414657127 -2.3776412907378845 4.3397322340982365 4.6213454452856944 -2.1108198137550356 3.6556362830736209 5.7603610498770017 -1.7113677648217216 2.6470977749377469 6.6858057932702142 -1.2043841852542914 1.3906425379733309 7.290003479761304 -0.6217247179121439 4.1330464441505232e-15 7.5 -1.8369095307335659e-15 -1.3906425379733232 7.2900034797613058 0.62172471791214035 -2.6470977749377398 6.6858057932702195 1.204384185254288 -3.6556362830736164 5.7603610498770079 1.7113677648217189 -4.3397322340982338 4.6213454452857015 2.1108198137550338 -4.6700849718747373 3.3930153414657198 2.3776412907378832 -4.6661716641013919 2.1957337151308463 2.495066821070679 -4.3891798405984552 1.1269498408714631 2.4557181268217216 -3.9277858586583698 0.24711534034108329 2.2620676311650505 -3.3795792285718851 -0.42694014335485947 1.9262831069394779 -2.8317303707412429 -0.92008497187473226 1.4694631307311918 -2.3446100363903573 -1.288960275083459 0.92031138171169191 -1.9414724245905683 -1.6061256707429366 0.31333308391076098 -1.6061256707429421 -1.9414724245905628 -0.3133330839107567 -1.2889602750834588 -2.3446100363903595 -0.92031138171169613 -0.9200849718747387 -2.8317303707412331 -1.4694631307311812 -0.42694014335486857 -3.379579228571874 -1.9262831069394695 0.24711534034108501 -3.9277858586583658 -2.2620676311650487 1.1269498408714564 -4.3891798405984526 -2.4557181268217212 2.1957337151308383 -4.6661716641013902 -2.4950668210706795 3.3930153414657251 -4.6700849718747381 -2.3776412907378819 4.6213454452856926 -4.3397322340982374 -2.110819813755036 5.7603610498770008 -3.6556362830736222 -1.711367764821722 6.6858057932702089 -2.6470977749377598 -1.204384185254292 7.2900034797613076 -1.3906425379733198 -0.6217247179121359</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"linear_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"periodic\" type=\"k3d::bool_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">100</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"width\" type=\"k3d::double_t\">0.10000000000000001</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.LinearLissajousCurve.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 5 0 0.32317943298734508 5.1367899902323195 0 0.6564659149439398 5.1964627944717279 0 0.98145912799579937 5.1449889263132365 0 1.2799934978417193 4.9852455300757148 0 1.545084971874737 4.7552825814757682 0 1.7865282176546853 4.5122552028578982 0 2.0276614153887391 4.3089998462381107 0 2.2942246277576843 4.1731791056371454 0 2.6003962029270338 4.0975687518328794 0 2.9389262614623659 4.0450849718747373 0 3.2807870539013755 3.965790294078861 0 3.5854962760945606 3.818165727928025 0 3.818165727928025 3.5854962760945615 0 3.9657902940788601 3.2807870539013737 0 4.0450849718747364 2.9389262614623664 0 4.0975687518328803 2.6003962029270342 0 4.1731791056371454 2.2942246277576839 0 4.3089998462381116 2.02766141538874 0 4.5122552028578973 1.7865282176546862 0 4.7552825814757673 1.5450849718747375 0 4.985245530075713 1.2799934978417213 0 5.1449889263132365 0.98145912799579915 0 5.1964627944717279 0.65646591494394124 0 5.1367899902323195 0.32317943298734619 0 5 6.1232339957367663e-16 0 4.8434772940503974 -0.30472576230578846 0 4.7246842186730502 -0.59686642069910301 0 4.677883580973651 -0.89235401786144752 0 4.7005860812105977 -1.2069053738068276 0 4.7552825814757682 -1.5450849718747364 0 4.7855096560246153 -1.8947173091920939 0 4.7392706784220842 -2.2301315002619879 0 4.5898876948014893 -2.5233121132594691 0 4.3457105031872691 -2.7578717468629326 0 4.0450849718747373 -2.938926261462365 0 3.7393421336790316 -3.0934528435855215 0 3.471520546286091 -3.2599747831923263 0 3.2599747831923267 -3.4715205462860896 0 3.093452843585522 -3.739342133679032 0 2.9389262614623664 -4.0450849718747364 0 2.7578717468629339 -4.3457105031872683 0 2.5233121132594696 -4.5898876948014866 0 2.2301315002619888 -4.7392706784220833 0 1.8947173091920952 -4.7855096560246162 0 1.5450849718747375 -4.7552825814757673 0 1.2069053738068289 -4.700586081210596 0 0.89235401786144863 -4.6778835809736501 0 0.59686642069910401 -4.7246842186730502 0 0.30472576230578963 -4.8434772940503965 0 6.1232339957367653e-16 -4.9999999999999991 0 -0.32317943298734492 -5.1367899902323195 -0 -0.65646591494394002 -5.1964627944717279 -0 -0.98145912799580037 -5.1449889263132365 -0 -1.2799934978417202 -4.985245530075713 -0 -1.5450849718747384 -4.7552825814757673 -0 -1.7865282176546868 -4.5122552028578964 -0 -2.0276614153887373 -4.3089998462381134 -0 -2.294224627757683 -4.1731791056371463 -0 -2.6003962029270324 -4.0975687518328794 -0 -2.9389262614623646 -4.0450849718747373 -0 -3.2807870539013755 -3.9657902940788627 -0 -3.585496276094561 -3.818165727928025 -0 -3.8181657279280237 -3.5854962760945623 -0 -3.9657902940788619 -3.2807870539013755 -0 -4.0450849718747355 -2.9389262614623659 -0 -4.0975687518328794 -2.600396202927032 -0 -4.1731791056371454 -2.2942246277576843 -0 -4.3089998462381134 -2.0276614153887369 -0 -4.5122552028578964 -1.7865282176546884 -0 -4.7552825814757664 -1.5450849718747379 -0 -4.9852455300757121 -1.2799934978417218 -0 -5.1449889263132365 -0.98145912799579993 -0 -5.196462794471727 -0.65646591494394202 -0 -5.1367899902323177 -0.32317943298734447 -0 -5.0000000000000009 -1.2246467991473535e-15 -0 -4.8434772940503974 0.30472576230578569 -0 -4.7246842186730511 0.59686642069910234 -0 -4.6778835809736501 0.89235401786144464 -0 -4.7005860812105968 1.2069053738068294 -0 -4.7552825814757673 1.5450849718747357 -0 -4.7855096560246153 1.8947173091920959 -0 -4.739270678422085 2.2301315002619826 -0 -4.5898876948014919 2.5233121132594669 -0 -4.3457105031872745 2.7578717468629299 -0 -4.0450849718747373 2.9389262614623641 -0 -3.7393421336790347 3.0934528435855206 -0 -3.471520546286091 3.2599747831923258 -0 -3.2599747831923276 3.4715205462860883 -0 -3.0934528435855215 3.7393421336790316 -0 -2.9389262614623659 4.0450849718747355 -0 -2.7578717468629312 4.3457105031872718 -0 -2.5233121132594687 4.5898876948014893 -0 -2.2301315002619848 4.739270678422085 -0 -1.8947173091920981 4.7855096560246153 -0 -1.5450849718747386 4.7552825814757682 -0 -1.2069053738068314 4.700586081210596 -0 -0.89235401786144697 4.6778835809736501 -0 -0.59686642069910478 4.7246842186730502 -0 -0.30472576230578813 4.8434772940503974 -0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"linear_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"periodic\" type=\"k3d::bool_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">100</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"width\" type=\"k3d::double_t\">0.10000000000000001</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.LinearLissajousCurve.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 5 0 0.32317943298734514 5.1367899902323195 0 0.6564659149439398 5.1964627944717279 0 0.98145912799579949 5.1449889263132365 0 1.2799934978417193 4.9852455300757139 0 1.545084971874737 4.7552825814757682 0 1.7865282176546853 4.5122552028578991 0 2.0276614153887391 4.3089998462381107 0 2.2942246277576843 4.1731791056371454 0 2.6003962029270338 4.0975687518328794 0 2.9389262614623655 4.0450849718747373 0 3.2807870539013755 3.965790294078861 0 3.5854962760945606 3.8181657279280241 0 3.8181657279280246 3.5854962760945619 0 3.9657902940788605 3.2807870539013737 0 4.0450849718747373 2.9389262614623659 0 4.0975687518328803 2.6003962029270342 0 4.1731791056371454 2.2942246277576839 0 4.3089998462381107 2.02766141538874 0 4.5122552028578982 1.7865282176546862 0 4.7552825814757682 1.5450849718747377 0 4.985245530075713 1.2799934978417213 0 5.1449889263132365 0.98145912799579926 0 5.1964627944717279 0.65646591494394135 0 5.1367899902323195 0.32317943298734619 0 5 6.1230317691118863e-16 0 4.8434772940503974 -0.30472576230578846 0 4.7246842186730511 -0.59686642069910301 0 4.677883580973651 -0.89235401786144741 0 4.7005860812105968 -1.2069053738068276 0 4.7552825814757682 -1.5450849718747366 0 4.7855096560246162 -1.8947173091920939 0 4.7392706784220842 -2.2301315002619879 0 4.5898876948014893 -2.5233121132594691 0 4.3457105031872691 -2.757871746862933 0 4.0450849718747373 -2.938926261462365 0 3.7393421336790316 -3.0934528435855215 0 3.4715205462860901 -3.2599747831923263 0 3.2599747831923271 -3.4715205462860896 0 3.093452843585522 -3.739342133679032 0 2.9389262614623659 -4.0450849718747364 0 2.7578717468629339 -4.3457105031872683 0 2.5233121132594696 -4.5898876948014866 0 2.2301315002619888 -4.7392706784220833 0 1.8947173091920952 -4.7855096560246162 0 1.5450849718747377 -4.7552825814757673 0 1.2069053738068289 -4.7005860812105968 0 0.89235401786144863 -4.6778835809736501 0 0.59686642069910412 -4.7246842186730502 0 0.30472576230578963 -4.8434772940503965 0 6.1230317691118853e-16 -4.9999999999999991 0 -0.32317943298734492 -5.1367899902323195 -0 -0.65646591494394002 -5.1964627944717279 -0 -0.98145912799580026 -5.1449889263132365 -0 -1.27999349784172 -4.985245530075713 -0 -1.5450849718747384 -4.7552825814757673 -0 -1.7865282176546866 -4.5122552028578964 -0 -2.0276614153887373 -4.3089998462381134 -0 -2.294224627757683 -4.1731791056371463 -0 -2.6003962029270324 -4.0975687518328785 -0 -2.9389262614623646 -4.0450849718747373 -0 -3.2807870539013755 -3.9657902940788627 -0 -3.585496276094561 -3.8181657279280246 -0 -3.8181657279280237 -3.5854962760945623 -0 -3.9657902940788619 -3.280787053901375 -0 -4.0450849718747355 -2.9389262614623659 -0 -4.0975687518328794 -2.600396202927032 -0 -4.1731791056371454 -2.2942246277576843 -0 -4.3089998462381134 -2.0276614153887369 -0 -4.5122552028578964 -1.7865282176546886 -0 -4.7552825814757664 -1.5450849718747379 -0 -4.985245530075713 -1.2799934978417218 -0 -5.1449889263132365 -0.98145912799579993 -0 -5.196462794471727 -0.65646591494394191 -0 -5.1367899902323177 -0.32317943298734447 -0 -5.0000000000000009 -1.2246063538223775e-15 -0 -4.8434772940503974 0.30472576230578574 -0 -4.7246842186730511 0.59686642069910234 -0 -4.677883580973651 0.89235401786144464 -0 -4.7005860812105968 1.2069053738068294 -0 -4.7552825814757673 1.5450849718747357 -0 -4.7855096560246153 1.8947173091920957 -0 -4.739270678422085 2.2301315002619821 -0 -4.5898876948014919 2.5233121132594665 -0 -4.3457105031872745 2.7578717468629295 -0 -4.0450849718747373 2.9389262614623641 -0 -3.7393421336790347 3.0934528435855202 -0 -3.4715205462860905 3.2599747831923258 -0 -3.2599747831923276 3.4715205462860892 -0 -3.0934528435855211 3.739342133679032 -0 -2.9389262614623659 4.0450849718747355 -0 -2.7578717468629312 4.3457105031872727 -0 -2.5233121132594687 4.5898876948014893 -0 -2.2301315002619848 4.739270678422085 -0 -1.8947173091920984 4.7855096560246153 -0 -1.5450849718747386 4.7552825814757682 -0 -1.2069053738068314 4.700586081210596 -0 -0.89235401786144697 4.6778835809736501 -0 -0.59686642069910467 4.7246842186730502 -0 -0.30472576230578813 4.8434772940503974 -0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"linear_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"periodic\" type=\"k3d::bool_t\">1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">100</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"width\" type=\"k3d::double_t\">0.10000000000000001</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MD2MeshReader.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1.3534071445465088 -0.2405409961938858 1.5584758520126343 1.4290925264358521 -0.2405409961938858 -0.44434881210327148 0.01629958301782608 -1.6433757543563843 -0.49158522486686707 -0.059385750442743301 -1.6433757543563843 1.5017920732498169 -0.034157305955886841 1.1934678554534912 1.5112394094467163 0.01629958301782608 1.1934678554534912 -0.49158522486686707 -1.3964933156967163 -0.2405409961938858 -0.68053096532821655 -1.4469501972198486 -0.17819277942180634 1.5962649583816528 0.54609692096710205 1.785775899887085 -0.11369380354881287 0.49564003944396973 1.785775899887085 1.1144533157348633 1.7822906970977783 1.6610795259475708 -0.066457375884056091 1.731833815574646 1.6610795259475708 1.1616897583007812 1.580463171005249 2.1910393238067627 1.0294277667999268 1.6309200525283813 2.1910393238067627 0.056357346475124359 0.79838138818740845 2.7209992408752441 1.0010858774185181 0.82360982894897461 2.7209992408752441 0.028015486896038055 1.0506658554077148 3.2509589195251465 -0.066457375884056091 1.0254373550415039 3.2509589195251465 1.1144533157348633 2.0345752239227295 2.5963027477264404 -0.038115516304969788 1.9841182231903076 2.5963027477264404 1.1522425413131714 2.4886870384216309 3.5003519058227539 0.85937666893005371 2.5139155387878418 3.5003519058227539 0.29253947734832764 2.0093467235565186 3.8120927810668945 0.84048205614089966 2.0345752239227295 3.8120927810668945 0.27364492416381836 -2.0019760131835938 -0.83284902572631836 0.92550766468048096 -1.9515191316604614 -0.83284902572631836 -0.29319223761558533 -1.4217216968536377 -1.8927686214447021 0.94440221786499023 -1.3712648153305054 -1.8927686214447021 -0.27429765462875366 -2.203803539276123 -1.9862909317016602 -0.038115516304969788 -2.229032039642334 -1.9862909317016602 0.65153634548187256 -2.8092861175537109 -1.6433757543563843 -0.057010084390640259 -2.8345146179199219 -1.6433757543563843 0.62319451570510864 -3.0363421440124512 -2.2980320453643799 0.4720379114151001 -3.0111136436462402 -2.2980320453643799 0.07525191456079483 -2.6831440925598145 -2.4850766658782959 0.49093249440193176 -2.6579155921936035 -2.4850766658782959 0.084699198603630066 -2.8345146179199219 -2.9838624000549316 0.16972477734088898 -2.8345146179199219 -2.9838624000549316 0.38701236248016357 -3.0615706443786621 -3.0462105274200439 0.16027748584747314 -3.0615706443786621 -3.0462105274200439 0.37756505608558655 1.5300062894821167 -0.42758563160896301 0.60429990291595459 0.72269600629806519 -0.92637133598327637 -0.46324336528778076 -0.0089288614690303802 -1.6433757543563843 0.50982707738876343 0.6470106840133667 -0.92637133598327637 1.5301339626312256 0.82360982894897461 -1.1445901393890381 0.57595807313919067 1.7822906970977783 -0.70815259218215942 0.8499293327331543 2.463458776473999 -0.11584456264972687 1.1522425413131714 1.7570621967315674 -0.70815259218215942 1.3222936391830444 3.0184845924377441 -1.3939828872680664 1.2561626434326172 3.3716826438903809 -1.0822418928146362 1.1711370944976807 3.043712854385376 -1.3939828872680664 1.0199805498123169 2.0598034858703613 -0.7705007791519165 0.25475034117698669 2.5391440391540527 -0.17819277942180634 0.018568200990557671 2.0598034858703613 -0.7705007791519165 -0.14203566312789917 2.9932560920715332 -1.4563311338424683 -0.066457375884056091 3.3464541435241699 -1.0198936462402344 0.056357346475124359 2.9932560920715332 -1.4563311338424683 0.22640849649906158 0.97498047351837158 -2.4227285385131836 0.67987823486328125 0.94975203275680542 -2.4227285385131836 1.4167665243148804 0.24335558712482452 -2.5474247932434082 0.65153634548187256 0.21812713146209717 -2.5474247932434082 1.3884246349334717 0.066756471991539001 -3.2956035137176514 1.3128464221954346 0.091984912753105164 -3.2956035137176514 0.7176673412322998 0.6470106840133667 -3.4514739513397217 1.3317409753799438 0.67223912477493286 -3.4514739513397217 0.73656195402145386 0.21812713146209717 -4.1061301231384277 0.79324567317962646 0.21812713146209717 -4.1061301231384277 1.2467154264450073 -0.21075642108917236 -3.9814338684082031 0.77435106039047241 -0.23598486185073853 -4.0126080513000488 1.2278207540512085 0.8992951512336731 -2.4539024829864502 0.39645963907241821 0.19289869070053101 -2.4850766658782959 0.37756505608558655 0.92452359199523926 -2.4539024829864502 -0.32153409719467163 0.21812713146209717 -2.4850766658782959 -0.34987595677375793 0.39472624659538269 -3.3891258239746094 -0.23650851845741272 0.87406671047210693 -3.326777458190918 -0.21761395037174225 0.36949780583381653 -3.3891258239746094 0.26419764757156372 0.87406671047210693 -3.3579516410827637 0.283092200756073 0.8992951512336731 -4.1061301231384277 0.25475034117698669 0.44518312811851501 -4.1373043060302734 0.23585577309131622 0.8992951512336731 -4.1061301231384277 -0.17982479929924011 0.47041159868240356 -4.1373043060302734 -0.19871938228607178 -0.74055373668670654 0.53881168365478516 1.7190796136856079 -1.4217216968536377 -0.11584456264972687 0.43424877524375916 -0.69009685516357422 0.44528934359550476 -0.68997824192047119 -0.0089288614690303802 1.3805125951766968 0.46259063482284546 -0.96760976314544678 0.7570304274559021 0.42480149865150452</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 39 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63 67 68 66 70 71 69 73 74 72 76 77 75 79 80 78 82 83 81 85 86 84 88 89 87 91 92 90 94 95 93 97 98 96 100 101 99 103 104 102 106 107 105 109 110 108 112 113 111 115 116 114 118 119 117 121 122 120 124 125 123 127 128 126 130 131 129 133 134 132 136 137 135 139 140 138 142 143 141 145 146 144 148 149 147 151 152 150 154 155 153 157 158 156 160 161 159 163 164 162 166 167 165 169 170 168 172 173 171 175 176 174 178 179 177 181 182 180 184 185 183 187 188 186 190 191 189 193 194 192 196 197 195 199 200 198 202 203 201 205 206 204 208 209 207 211 212 210 214 215 213 217 218 216 220 221 219 223 224 222 226 227 225 229 230 228 232 233 231 235 236 234 238 239 237 241 242 240 244 245 243 247 248 246 250 251 249 253 254 252 256 257 255 259 260 258 262 263 261 265 266 264 268 269 267 271 272 270 274 275 273 277 278 276 280 281 279 283 284 282 286 287 285 289 290 288 292 293 291 295 296 294 298 299 297 301 302 300 304 305 303 307 308 306 310 311 309 313 314 312 316 317 315 319 320 318 322 323 321 325 326 324 328 329 327 331 332 330 334 335 333 337 338 336 340 341 339 343 344 342 346 347 345 349 350 348 352 353 351 355 356 354 358 359 357 361 362 360 364 365 363 367 368 366 370 371 369 373 374 372 376 377 375 379 380 378 382 383 381 385 386 384 388 389 387 391 392 390 394 395 393 397 398 396 400 401 399 403 404 402 406 407 405 409 410 408 412 413 411 415 416 414 418 419 417 421 422 420 424 425 423 427 428 426 430 431 429 433 434 432 436 437 435 439 440 438 442 443 441 445 446 444 448 449 447 451 452 450 454 455 453 457 458 456 460 461 459 463 464 462 466 467 465 469 470 468 472 473 471 475 476 474 478 479 477 481 482 480 484 485 483 487 488 486 490 491 489 493 494 492 496 497 495 499 500 498 502 503 501</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">41 2 6 43 0 4 9 84 4 25 82 6 26 42 3 27 2 42 26 27 42 10 11 40 7 3 43 81 7 43 5 1 41 83 5 41 49 48 50 55 56 54 41 6 83 43 4 81 24 7 82 25 24 82 8 5 84 9 8 84 85 84 5 83 85 5 85 83 6 82 85 6 85 82 7 81 85 7 77 78 80 79 77 80 78 75 73 80 78 73 80 73 74 79 80 74 79 74 76 77 79 76 77 76 75 78 77 75 76 69 70 75 76 70 74 71 69 76 74 69 73 72 71 74 73 71 75 70 72 73 75 72 70 42 2 72 70 2 72 2 41 71 72 41 71 41 44 69 71 44 69 44 42 70 69 42 65 66 68 67 65 68 68 61 62 67 68 62 66 63 61 68 66 61 67 62 64 65 67 64 65 64 63 66 65 63 64 57 58 63 64 58 62 59 57 64 62 57 63 58 60 61 63 60 61 60 59 62 61 59 60 3 42 59 60 42 58 43 3 60 58 3 59 42 44 57 59 44 57 44 43 58 57 43 55 52 51 56 55 51 56 51 53 54 56 53 54 53 52 55 54 52 53 1 10 52 53 10 51 40 1 53 51 1 52 10 40 51 52 40 50 45 46 49 50 46 48 47 45 50 48 45 49 46 47 48 49 47 46 11 0 47 46 0 47 0 40 45 47 40 45 40 11 46 45 11 44 41 1 40 44 1 39 38 36 37 39 36 37 34 32 39 37 32 38 33 35 36 38 35 39 32 33 38 39 33 36 35 34 37 36 34 35 28 29 34 35 29 32 31 30 33 32 30 33 30 28 35 33 28 34 29 31 32 34 31 29 26 24 31 29 24 30 25 27 28 30 27 31 24 25 30 31 25 28 27 26 29 28 26 25 6 2 27 25 2 26 3 7 24 26 7 23 22 20 21 23 20 21 18 16 23 21 16 22 17 19 20 22 19 23 16 17 22 23 17 20 19 18 21 20 18 19 12 13 18 19 13 16 15 14 17 16 14 17 14 12 19 17 12 18 13 15 16 18 15 13 10 8 15 13 8 14 9 11 12 14 11 15 8 9 14 15 9 12 11 10 13 12 10 9 4 0 11 9 0 10 1 5 8 10 5 85 81 4 84 85 4 44 40 0 43 44 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.bezier_triangle_patches.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>3 -3 3 1 -1 7 1 -7 1 -1 1 7 -11 -11 11 -1 -7 -1 -3 3 3 -7 1 1 -7 -1 -1 -3 -3 -3 15 -3 3 13 -1 7 13 -7 1 11 1 7 1 -11 11 11 -7 -1 9 3 3 5 1 1 5 -1 -1 9 -3 -3</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"bezier_triangle_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0 10</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_orders\" type=\"k3d::uint_t\">4 4</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.bicubic.patches.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 0 5 -2 2 5 2 -2 5 5 0 5 -5 2 2 -2 5 2 2 -5 2 5 -2 2 -5 2 -2 -2 5 -2 2 -5 -2 5 -2 -2 -5 0 -5 -2 2 -5 2 -2 -5 5 0 -5 7 0 5 10 2 5 14 -2 5 17 0 5 7 2 2 10 5 2 14 -5 2 17 -2 2 7 2 -2 10 5 -2 14 -5 -2 17 -2 -2 7 0 -5 10 2 -5 14 -2 -5 17 0 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"bicubic_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.bilinear.patches.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 0 5 5 0 5 0 -5 -5 0 5 -5 7 0 5 17 0 5 12 -5 -5 12 5 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"bilinear_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.blobby.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"blobby\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"float\">\n\t\t\t\t\t\t<array name=\"floats\" type=\"k3d::double_t\">1 0 0 0 0 1 0 0 0 0 1 0 -1 0 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 -1 1 1 0 0 0 0 1 0 0 0 0 1 0 -1 0 -1 1 -1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operand\">\n\t\t\t\t\t\t<array name=\"operands\" type=\"k3d::uint_t\">5 0 1 2 3 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"operator\">\n\t\t\t\t\t\t<array name=\"operator_first_operands\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"operator_operand_counts\" type=\"k3d::uint_t\">6</array>\n\t\t\t\t\t\t<array name=\"operators\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"first_operators\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"first_primitives\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"operator_counts\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t<array name=\"primitive_counts\" type=\"k3d::uint_t\">5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"primitive_first_floats\" type=\"k3d::uint_t\">0 16 32 48 64</array>\n\t\t\t\t\t\t<array name=\"primitive_float_counts\" type=\"k3d::uint_t\">16 16 16 16 23</array>\n\t\t\t\t\t\t<array name=\"primitives\" type=\"k3d::int32_t\">1001 1001 1001 1001 1002</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 0 1 0 0 0 1 1 1 0 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.cones.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"cone\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"heights\" type=\"k3d::double_t\">5 5</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 -5 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">4 4</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.cubic.curves.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 5 -5 0 5 -5 0 0 0 0 0 5 0 0 5 0 -5 0 0 -5 5 0 5 0 0 5 0 0 0 5 0 0 10 0 0 10 0 -5 5 0 -5 10 0 5 5 0 5 5 0 0 10 0 0 15 0 0 15 0 -5 10 0 -5 15 0 5 10 0 5 10 0 0 15 0 0 20 0 0 20 0 -5 15 0 -5 20 0 5 15 0 5 15 0 0 20 0 0 25 0 0 25 0 -5 20 0 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"cubic_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"periodic\" type=\"k3d::bool_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0 7 14 21 28</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">7 7 7 7 7</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"constantwidth\" type=\"k3d::double_t\">0.5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 1 0 1 1 0.20000000000000001 1 1 0.40000000000000002 1 1 0.60000000000000009 1 1 0.80000000000000004</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.cylinders.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"cylinder\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 -3 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 3 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">2 2</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"z_max\" type=\"k3d::double_t\">5 5</array>\n\t\t\t\t\t\t<array name=\"z_min\" type=\"k3d::double_t\">-5 -5</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.disks.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"disk\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"heights\" type=\"k3d::double_t\">0 0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 -5 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">4 4</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.hyperboloids.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"hyperboloid\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"end_points\" type=\"k3d::point3\">2 2 -2 2 2 -2</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 -5 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"start_points\" type=\"k3d::point3\">-2 2 2 -2 2 2</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.linear.curves.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 5 5 0 0 0 0 -5 5 0 5 10 0 0 5 0 -5 10 0 5 15 0 0 10 0 -5 15 0 5 20 0 0 15 0 -5 20 0 5 25 0 0 20 0 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"linear_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"periodic\" type=\"k3d::bool_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0 3 6 9 12</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">3 3 3 3 3</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"constantwidth\" type=\"k3d::double_t\">0.5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 1 0 1 1 0.20000000000000001 1 1 0.40000000000000002 1 1 0.60000000000000009 1 1 0.80000000000000004</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.nurbs.curves.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 -5 0 5 -5 0 5 5 0 -5 5 0 5 -5 0 15 -5 0 15 5 0 5 5 0 15 -5 0 25 -5 0 25 5 0 15 5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0 7 14</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0 4 8</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3 3 3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">4 4 4</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">1 1 1 2 3 3 3 1 1 1 2 3 3 3 1 1 1 2 3 3 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.5 1 1 1 0.5 1 1 1 0.5 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.nurbs.patches.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 5 5 5 5 5 5 5 10 -5 -5 5 5 -5 5 5 -5 10 -5 5 -5 5 5 -5 5 5 0 -5 -5 -5 5 -5 -5 5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0 6</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0 6</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3 3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">3 3</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0 4</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2 2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">1 1 1 2 2 2 1 1 1 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">1 1 2 2 1 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 10 1 1 0.5 1 1 10 1 1 0.5 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.paraboloids.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"paraboloid\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 -5 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">3 3</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"z_max\" type=\"k3d::double_t\">6 6</array>\n\t\t\t\t\t\t<array name=\"z_min\" type=\"k3d::double_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.particles.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 0 -5 -5 0 -4 -5 0 -3 -5 0 -2 -5 0 -1 -5 0 0 -5 0 1 -5 0 2 -5 0 3 -5 0 4 -5 0 5 -4 0 -5 -4 0 -4 -4 0 -3 -4 0 -2 -4 0 -1 -4 0 0 -4 0 1 -4 0 2 -4 0 3 -4 0 4 -4 0 5 -3 0 -5 -3 0 -4 -3 0 -3 -3 0 -2 -3 0 -1 -3 0 0 -3 0 1 -3 0 2 -3 0 3 -3 0 4 -3 0 5 -2 0 -5 -2 0 -4 -2 0 -3 -2 0 -2 -2 0 -1 -2 0 0 -2 0 1 -2 0 2 -2 0 3 -2 0 4 -2 0 5 -1 0 -5 -1 0 -4 -1 0 -3 -1 0 -2 -1 0 -1 -1 0 0 -1 0 1 -1 0 2 -1 0 3 -1 0 4 -1 0 5 0 0 -5 0 0 -4 0 0 -3 0 0 -2 0 0 -1 0 0 0 0 0 1 0 0 2 0 0 3 0 0 4 0 0 5 1 0 -5 1 0 -4 1 0 -3 1 0 -2 1 0 -1 1 0 0 1 0 1 1 0 2 1 0 3 1 0 4 1 0 5 2 0 -5 2 0 -4 2 0 -3 2 0 -2 2 0 -1 2 0 0 2 0 1 2 0 2 2 0 3 2 0 4 2 0 5 3 0 -5 3 0 -4 3 0 -3 3 0 -2 3 0 -1 3 0 0 3 0 1 3 0 2 3 0 3 3 0 4 3 0 5 4 0 -5 4 0 -4 4 0 -3 4 0 -2 4 0 -1 4 0 0 4 0 1 4 0 2 4 0 3 4 0 4 4 0 5 5 0 -5 5 0 -4 5 0 -3 5 0 -2 5 0 -1 5 0 0 5 0 1 5 0 2 5 0 3 5 0 4 5 0 5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"particle\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"constantwidth\" type=\"k3d::double_t\">0.5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">0 1 0 0 1 0.099999999999999978 0 1 0.20000000000000001 0 1 0.29999999999999999 0 1 0.40000000000000002 0 1 0.5 0 1 0.59999999999999998 0 1 0.69999999999999996 0 1 0.80000000000000004 0 1 0.90000000000000002 0 1 1 0.099999999999999978 1 0 0.099999999999999978 1 0.099999999999999978 0.099999999999999978 1 0.20000000000000001 0.099999999999999978 1 0.29999999999999999 0.099999999999999978 1 0.40000000000000002 0.099999999999999978 1 0.5 0.099999999999999978 1 0.59999999999999998 0.099999999999999978 1 0.69999999999999996 0.099999999999999978 1 0.80000000000000004 0.099999999999999978 1 0.90000000000000002 0.099999999999999978 1 1 0.20000000000000001 1 0 0.20000000000000001 1 0.099999999999999978 0.20000000000000001 1 0.20000000000000001 0.20000000000000001 1 0.29999999999999999 0.20000000000000001 1 0.40000000000000002 0.20000000000000001 1 0.5 0.20000000000000001 1 0.59999999999999998 0.20000000000000001 1 0.69999999999999996 0.20000000000000001 1 0.80000000000000004 0.20000000000000001 1 0.90000000000000002 0.20000000000000001 1 1 0.29999999999999999 1 0 0.29999999999999999 1 0.099999999999999978 0.29999999999999999 1 0.20000000000000001 0.29999999999999999 1 0.29999999999999999 0.29999999999999999 1 0.40000000000000002 0.29999999999999999 1 0.5 0.29999999999999999 1 0.59999999999999998 0.29999999999999999 1 0.69999999999999996 0.29999999999999999 1 0.80000000000000004 0.29999999999999999 1 0.90000000000000002 0.29999999999999999 1 1 0.40000000000000002 1 0 0.40000000000000002 1 0.099999999999999978 0.40000000000000002 1 0.20000000000000001 0.40000000000000002 1 0.29999999999999999 0.40000000000000002 1 0.40000000000000002 0.40000000000000002 1 0.5 0.40000000000000002 1 0.59999999999999998 0.40000000000000002 1 0.69999999999999996 0.40000000000000002 1 0.80000000000000004 0.40000000000000002 1 0.90000000000000002 0.40000000000000002 1 1 0.5 1 0 0.5 1 0.099999999999999978 0.5 1 0.20000000000000001 0.5 1 0.29999999999999999 0.5 1 0.40000000000000002 0.5 1 0.5 0.5 1 0.59999999999999998 0.5 1 0.69999999999999996 0.5 1 0.80000000000000004 0.5 1 0.90000000000000002 0.5 1 1 0.59999999999999998 1 0 0.59999999999999998 1 0.099999999999999978 0.59999999999999998 1 0.20000000000000001 0.59999999999999998 1 0.29999999999999999 0.59999999999999998 1 0.40000000000000002 0.59999999999999998 1 0.5 0.59999999999999998 1 0.59999999999999998 0.59999999999999998 1 0.69999999999999996 0.59999999999999998 1 0.80000000000000004 0.59999999999999998 1 0.90000000000000002 0.59999999999999998 1 1 0.69999999999999996 1 0 0.69999999999999996 1 0.099999999999999978 0.69999999999999996 1 0.20000000000000001 0.69999999999999996 1 0.29999999999999999 0.69999999999999996 1 0.40000000000000002 0.69999999999999996 1 0.5 0.69999999999999996 1 0.59999999999999998 0.69999999999999996 1 0.69999999999999996 0.69999999999999996 1 0.80000000000000004 0.69999999999999996 1 0.90000000000000002 0.69999999999999996 1 1 0.80000000000000004 1 0 0.80000000000000004 1 0.099999999999999978 0.80000000000000004 1 0.20000000000000001 0.80000000000000004 1 0.29999999999999999 0.80000000000000004 1 0.40000000000000002 0.80000000000000004 1 0.5 0.80000000000000004 1 0.59999999999999998 0.80000000000000004 1 0.69999999999999996 0.80000000000000004 1 0.80000000000000004 0.80000000000000004 1 0.90000000000000002 0.80000000000000004 1 1 0.90000000000000002 1 0 0.90000000000000002 1 0.099999999999999978 0.90000000000000002 1 0.20000000000000001 0.90000000000000002 1 0.29999999999999999 0.90000000000000002 1 0.40000000000000002 0.90000000000000002 1 0.5 0.90000000000000002 1 0.59999999999999998 0.90000000000000002 1 0.69999999999999996 0.90000000000000002 1 0.80000000000000004 0.90000000000000002 1 0.90000000000000002 0.90000000000000002 1 1 1 1 0 1 1 0.099999999999999978 1 1 0.20000000000000001 1 1 0.29999999999999999 1 1 0.40000000000000002 1 1 0.5 1 1 0.59999999999999998 1 1 0.69999999999999996 1 1 0.80000000000000004 1 1 0.90000000000000002 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.polyhedra.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 0 5 5 0 5 5 0 -5 -5 0 -5 6 0 5 16 0 5 16 0 -5 6 0 -5 17 0 5 27 0 5 27 0 -5 17 0 -5 -5 -11 5 5 -11 5 5 -11 -5 -5 -11 -5 6 -11 5 16 -11 5 16 -11 -5 6 -11 -5 17 -11 5 27 -11 5 27 -11 -5 17 -11 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 0.5 0 1 1 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">12 13 14 15 16 17 18 19 20 21 22 23\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 1 1 0.5 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.simple_polyhedron.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-3 -3 0 3 -3 0 3 3 0 -3 3 0</points>\n\t\t<point_selection>0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 3 1 2 3\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.spheres.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"sphere\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 -3 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 3 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">2 2</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"z_max\" type=\"k3d::double_t\">1 1</array>\n\t\t\t\t\t\t<array name=\"z_min\" type=\"k3d::double_t\">-1 -1</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.teapots.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"teapot\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 -7 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 7 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 0 1 0 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.MeshSourceScript.tori.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"torus\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"major_radii\" type=\"k3d::double_t\">3 3</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 -5 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"minor_radii\" type=\"k3d::double_t\">2 2</array>\n\t\t\t\t\t\t<array name=\"phi_max\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"phi_min\" type=\"k3d::double_t\">0 0</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.Newell.teacup.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0.40909099999999998 0 0.77272700000000005 0.40909099999999998 -0.22909099999999999 0.77272700000000005 0.22909099999999999 -0.40909099999999998 0.77272700000000005 0 -0.40909099999999998 0.77272700000000005 0.40909099999999998 0 0.88636400000000004 0.40909099999999998 -0.22909099999999999 0.88636400000000004 0.22909099999999999 -0.40909099999999998 0.88636400000000004 0 -0.40909099999999998 0.88636400000000004 0.45454499999999998 0 0.88636400000000004 0.45454499999999998 -0.25454500000000002 0.88636400000000004 0.25454500000000002 -0.45454499999999998 0.88636400000000004 0 -0.45454499999999998 0.88636400000000004 0.45454499999999998 0 0.77272700000000005 0.45454499999999998 -0.25454500000000002 0.77272700000000005 0.25454500000000002 -0.45454499999999998 0.77272700000000005 0 -0.45454499999999998 0.77272700000000005 -0.22909099999999999 -0.40909099999999998 0.77272700000000005 -0.40909099999999998 -0.22909099999999999 0.77272700000000005 -0.40909099999999998 0 0.77272700000000005 -0.22909099999999999 -0.40909099999999998 0.88636400000000004 -0.40909099999999998 -0.22909099999999999 0.88636400000000004 -0.40909099999999998 0 0.88636400000000004 -0.25454500000000002 -0.45454499999999998 0.88636400000000004 -0.45454499999999998 -0.25454500000000002 0.88636400000000004 -0.45454499999999998 0 0.88636400000000004 -0.25454500000000002 -0.45454499999999998 0.77272700000000005 -0.45454499999999998 -0.25454500000000002 0.77272700000000005 -0.45454499999999998 0 0.77272700000000005 -0.40909099999999998 0.22909099999999999 0.77272700000000005 -0.22909099999999999 0.40909099999999998 0.77272700000000005 0 0.40909099999999998 0.77272700000000005 -0.40909099999999998 0.22909099999999999 0.88636400000000004 -0.22909099999999999 0.40909099999999998 0.88636400000000004 0 0.40909099999999998 0.88636400000000004 -0.45454499999999998 0.25454500000000002 0.88636400000000004 -0.25454500000000002 0.45454499999999998 0.88636400000000004 0 0.45454499999999998 0.88636400000000004 -0.45454499999999998 0.25454500000000002 0.77272700000000005 -0.25454500000000002 0.45454499999999998 0.77272700000000005 0 0.45454499999999998 0.77272700000000005 0.22909099999999999 0.40909099999999998 0.77272700000000005 0.40909099999999998 0.22909099999999999 0.77272700000000005 0.22909099999999999 0.40909099999999998 0.88636400000000004 0.40909099999999998 0.22909099999999999 0.88636400000000004 0.25454500000000002 0.45454499999999998 0.88636400000000004 0.45454499999999998 0.25454500000000002 0.88636400000000004 0.25454500000000002 0.45454499999999998 0.77272700000000005 0.45454499999999998 0.25454500000000002 0.77272700000000005 0.45454499999999998 0 0.54545500000000002 0.45454499999999998 -0.25454500000000002 0.54545500000000002 0.25454500000000002 -0.45454499999999998 0.54545500000000002 0 -0.45454499999999998 0.54545500000000002 0.45454499999999998 0 0.272727 0.45454499999999998 -0.25454500000000002 0.272727 0.25454500000000002 -0.45454499999999998 0.272727 0 -0.45454499999999998 0.272727 0.31818200000000002 0 0.045454500000000002 0.31818200000000002 -0.17818200000000001 0.045454500000000002 0.17818200000000001 -0.31818200000000002 0.045454500000000002 0 -0.31818200000000002 0.045454500000000002 -0.25454500000000002 -0.45454499999999998 0.54545500000000002 -0.45454499999999998 -0.25454500000000002 0.54545500000000002 -0.45454499999999998 0 0.54545500000000002 -0.25454500000000002 -0.45454499999999998 0.272727 -0.45454499999999998 -0.25454500000000002 0.272727 -0.45454499999999998 0 0.272727 -0.17818200000000001 -0.31818200000000002 0.045454500000000002 -0.31818200000000002 -0.17818200000000001 0.045454500000000002 -0.31818200000000002 0 0.045454500000000002 -0.45454499999999998 0.25454500000000002 0.54545500000000002 -0.25454500000000002 0.45454499999999998 0.54545500000000002 0 0.45454499999999998 0.54545500000000002 -0.45454499999999998 0.25454500000000002 0.272727 -0.25454500000000002 0.45454499999999998 0.272727 0 0.45454499999999998 0.272727 -0.31818200000000002 0.17818200000000001 0.045454500000000002 -0.17818200000000001 0.31818200000000002 0.045454500000000002 0 0.31818200000000002 0.045454500000000002 0.25454500000000002 0.45454499999999998 0.54545500000000002 0.45454499999999998 0.25454500000000002 0.54545500000000002 0.25454500000000002 0.45454499999999998 0.272727 0.45454499999999998 0.25454500000000002 0.272727 0.17818200000000001 0.31818200000000002 0.045454500000000002 0.31818200000000002 0.17818200000000001 0.045454500000000002 0.54545500000000002 0 0.045454500000000002 0.54545500000000002 -0.30545499999999998 0.045454500000000002 0.30545499999999998 -0.54545500000000002 0.045454500000000002 0 -0.54545500000000002 0.045454500000000002 0.72727299999999995 0 0.13636400000000001 0.72727299999999995 -0.407273 0.13636400000000001 0.407273 -0.72727299999999995 0.13636400000000001 0 -0.72727299999999995 0.13636400000000001 0.90909099999999998 0 0.13636400000000001 0.90909099999999998 -0.50909099999999996 0.13636400000000001 0.50909099999999996 -0.90909099999999998 0.13636400000000001 0 -0.90909099999999998 0.13636400000000001 -0.30545499999999998 -0.54545500000000002 0.045454500000000002 -0.54545500000000002 -0.30545499999999998 0.045454500000000002 -0.54545500000000002 0 0.045454500000000002 -0.407273 -0.72727299999999995 0.13636400000000001 -0.72727299999999995 -0.407273 0.13636400000000001 -0.72727299999999995 0 0.13636400000000001 -0.50909099999999996 -0.90909099999999998 0.13636400000000001 -0.90909099999999998 -0.50909099999999996 0.13636400000000001 -0.90909099999999998 0 0.13636400000000001 -0.54545500000000002 0.30545499999999998 0.045454500000000002 -0.30545499999999998 0.54545500000000002 0.045454500000000002 0 0.54545500000000002 0.045454500000000002 -0.72727299999999995 0.407273 0.13636400000000001 -0.407273 0.72727299999999995 0.13636400000000001 0 0.72727299999999995 0.13636400000000001 -0.90909099999999998 0.50909099999999996 0.13636400000000001 -0.50909099999999996 0.90909099999999998 0.13636400000000001 0 0.90909099999999998 0.13636400000000001 0.30545499999999998 0.54545500000000002 0.045454500000000002 0.54545500000000002 0.30545499999999998 0.045454500000000002 0.407273 0.72727299999999995 0.13636400000000001 0.72727299999999995 0.407273 0.13636400000000001 0.50909099999999996 0.90909099999999998 0.13636400000000001 0.90909099999999998 0.50909099999999996 0.13636400000000001 1 0 0.13636400000000001 1 -0.56000000000000005 0.13636400000000001 0.56000000000000005 -1 0.13636400000000001 0 -1 0.13636400000000001 1 0 0.090909100000000007 1 -0.56000000000000005 0.090909100000000007 0.56000000000000005 -1 0.090909100000000007 0 -1 0.090909100000000007 0.90909099999999998 0 0.090909100000000007 0.90909099999999998 -0.50909099999999996 0.090909100000000007 0.50909099999999996 -0.90909099999999998 0.090909100000000007 0 -0.90909099999999998 0.090909100000000007 -0.56000000000000005 -1 0.13636400000000001 -1 -0.56000000000000005 0.13636400000000001 -1 0 0.13636400000000001 -0.56000000000000005 -1 0.090909100000000007 -1 -0.56000000000000005 0.090909100000000007 -1 0 0.090909100000000007 -0.50909099999999996 -0.90909099999999998 0.090909100000000007 -0.90909099999999998 -0.50909099999999996 0.090909100000000007 -0.90909099999999998 0 0.090909100000000007 -1 0.56000000000000005 0.13636400000000001 -0.56000000000000005 1 0.13636400000000001 0 1 0.13636400000000001 -1 0.56000000000000005 0.090909100000000007 -0.56000000000000005 1 0.090909100000000007 0 1 0.090909100000000007 -0.90909099999999998 0.50909099999999996 0.090909100000000007 -0.50909099999999996 0.90909099999999998 0.090909100000000007 0 0.90909099999999998 0.090909100000000007 0.56000000000000005 1 0.13636400000000001 1 0.56000000000000005 0.13636400000000001 0.56000000000000005 1 0.090909100000000007 1 0.56000000000000005 0.090909100000000007 0.50909099999999996 0.90909099999999998 0.090909100000000007 0.90909099999999998 0.50909099999999996 0.090909100000000007 0.72727299999999995 0 0.090909100000000007 0.72727299999999995 -0.407273 0.090909100000000007 0.407273 -0.72727299999999995 0.090909100000000007 0 -0.72727299999999995 0.090909100000000007 0.54545500000000002 0 0 0.54545500000000002 -0.30545499999999998 0 0.30545499999999998 -0.54545500000000002 0 0 -0.54545500000000002 0 0.31818200000000002 0 0 0.31818200000000002 -0.17818200000000001 0 0.17818200000000001 -0.31818200000000002 0 0 -0.31818200000000002 0 -0.407273 -0.72727299999999995 0.090909100000000007 -0.72727299999999995 -0.407273 0.090909100000000007 -0.72727299999999995 0 0.090909100000000007 -0.30545499999999998 -0.54545500000000002 0 -0.54545500000000002 -0.30545499999999998 0 -0.54545500000000002 0 0 -0.17818200000000001 -0.31818200000000002 0 -0.31818200000000002 -0.17818200000000001 0 -0.31818200000000002 0 0 -0.72727299999999995 0.407273 0.090909100000000007 -0.407273 0.72727299999999995 0.090909100000000007 0 0.72727299999999995 0.090909100000000007 -0.54545500000000002 0.30545499999999998 0 -0.30545499999999998 0.54545500000000002 0 0 0.54545500000000002 0 -0.31818200000000002 0.17818200000000001 0 -0.17818200000000001 0.31818200000000002 0 0 0.31818200000000002 0 0.407273 0.72727299999999995 0.090909100000000007 0.72727299999999995 0.407273 0.090909100000000007 0.30545499999999998 0.54545500000000002 0 0.54545500000000002 0.30545499999999998 0 0.17818200000000001 0.31818200000000002 0 0.31818200000000002 0.17818200000000001 0 0.272727 0 0.045454500000000002 0.272727 -0.152727 0.045454500000000002 0.152727 -0.272727 0.045454500000000002 0 -0.272727 0.045454500000000002 0.40909099999999998 0 0.272727 0.40909099999999998 -0.22909099999999999 0.272727 0.22909099999999999 -0.40909099999999998 0.272727 0 -0.40909099999999998 0.272727 0.40909099999999998 0 0.54545500000000002 0.40909099999999998 -0.22909099999999999 0.54545500000000002 0.22909099999999999 -0.40909099999999998 0.54545500000000002 0 -0.40909099999999998 0.54545500000000002 -0.152727 -0.272727 0.045454500000000002 -0.272727 -0.152727 0.045454500000000002 -0.272727 0 0.045454500000000002 -0.22909099999999999 -0.40909099999999998 0.272727 -0.40909099999999998 -0.22909099999999999 0.272727 -0.40909099999999998 0 0.272727 -0.22909099999999999 -0.40909099999999998 0.54545500000000002 -0.40909099999999998 -0.22909099999999999 0.54545500000000002 -0.40909099999999998 0 0.54545500000000002 -0.272727 0.152727 0.045454500000000002 -0.152727 0.272727 0.045454500000000002 0 0.272727 0.045454500000000002 -0.40909099999999998 0.22909099999999999 0.272727 -0.22909099999999999 0.40909099999999998 0.272727 0 0.40909099999999998 0.272727 -0.40909099999999998 0.22909099999999999 0.54545500000000002 -0.22909099999999999 0.40909099999999998 0.54545500000000002 0 0.40909099999999998 0.54545500000000002 0.152727 0.272727 0.045454500000000002 0.272727 0.152727 0.045454500000000002 0.22909099999999999 0.40909099999999998 0.272727 0.40909099999999998 0.22909099999999999 0.272727 0.22909099999999999 0.40909099999999998 0.54545500000000002 0.40909099999999998 0.22909099999999999 0.54545500000000002 -0.45454499999999998 0 0.70454499999999998 -0.45454499999999998 -0.045454500000000002 0.70454499999999998 -0.45454499999999998 -0.045454500000000002 0.77272700000000005 -0.77272700000000005 0 0.86363599999999996 -0.77272700000000005 -0.045454500000000002 0.86363599999999996 -0.81818199999999996 -0.045454500000000002 0.95454499999999998 -0.81818199999999996 0 0.95454499999999998 -0.77272700000000005 0 0.52272700000000005 -0.77272700000000005 -0.045454500000000002 0.52272700000000005 -0.90909099999999998 -0.045454500000000002 0.477273 -0.90909099999999998 0 0.477273 -0.40909099999999998 0 0.36363600000000001 -0.40909099999999998 -0.045454500000000002 0.36363600000000001 -0.40909099999999998 -0.045454500000000002 0.29545500000000002 -0.40909099999999998 0 0.29545500000000002 -0.45454499999999998 0.045454500000000002 0.77272700000000005 -0.45454499999999998 0.045454500000000002 0.70454499999999998 -0.81818199999999996 0.045454500000000002 0.95454499999999998 -0.77272700000000005 0.045454500000000002 0.86363599999999996 -0.90909099999999998 0.045454500000000002 0.477273 -0.77272700000000005 0.045454500000000002 0.52272700000000005 -0.40909099999999998 0.045454500000000002 0.29545500000000002 -0.40909099999999998 0.045454500000000002 0.36363600000000001</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"bicubic_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 3 16 17 18 7 19 20 21 11 22 23 24 15 25 26 27 18 28 29 30 21 31 32 33 24 34 35 36 27 37 38 39 30 40 41 0 33 42 43 4 36 44 45 8 39 46 47 12 12 13 14 15 48 49 50 51 52 53 54 55 56 57 58 59 15 25 26 27 51 60 61 62 55 63 64 65 59 66 67 68 27 37 38 39 62 69 70 71 65 72 73 74 68 75 76 77 39 46 47 12 71 78 79 48 74 80 81 52 77 82 83 56 192 193 194 195 196 197 198 199 200 201 202 203 0 1 2 3 195 204 205 206 199 207 208 209 203 210 211 212 3 16 17 18 206 213 214 215 209 216 217 218 212 219 220 221 18 28 29 30 215 222 223 192 218 224 225 196 221 226 227 200 30 40 41 0 228 229 230 27 231 232 233 234 235 236 237 238 239 240 241 242 27 243 244 228 234 245 246 231 238 247 248 235 242 249 250 239 56 57 58 59 84 85 86 87 88 89 90 91 92 93 94 95 59 66 67 68 87 96 97 98 91 99 100 101 95 102 103 104 68 75 76 77 98 105 106 107 101 108 109 110 104 111 112 113 77 82 83 56 107 114 115 84 110 116 117 88 113 118 119 92 92 93 94 95 120 121 122 123 124 125 126 127 128 129 130 131 95 102 103 104 123 132 133 134 127 135 136 137 131 138 139 140 104 111 112 113 134 141 142 143 137 144 145 146 140 147 148 149 113 118 119 92 143 150 151 120 146 152 153 124 149 154 155 128 128 129 130 131 156 157 158 159 160 161 162 163 164 165 166 167 131 138 139 140 159 168 169 170 163 171 172 173 167 174 175 176 140 147 148 149 170 177 178 179 173 180 181 182 176 183 184 185 149 154 155 128 179 186 187 156 182 188 189 160 185 190 191 164\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.Newell.teapot.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>1.3999999999999999 0 2.3999999999999999 1.3999999999999999 -0.78400000000000003 2.3999999999999999 0.78400000000000003 -1.3999999999999999 2.3999999999999999 0 -1.3999999999999999 2.3999999999999999 1.3374999999999999 0 2.53125 1.3374999999999999 -0.749 2.53125 0.749 -1.3374999999999999 2.53125 0 -1.3374999999999999 2.53125 1.4375 0 2.53125 1.4375 -0.80500000000000005 2.53125 0.80500000000000005 -1.4375 2.53125 0 -1.4375 2.53125 1.5 0 2.3999999999999999 1.5 -0.83999999999999997 2.3999999999999999 0.83999999999999997 -1.5 2.3999999999999999 0 -1.5 2.3999999999999999 -0.78400000000000003 -1.3999999999999999 2.3999999999999999 -1.3999999999999999 -0.78400000000000003 2.3999999999999999 -1.3999999999999999 0 2.3999999999999999 -0.749 -1.3374999999999999 2.53125 -1.3374999999999999 -0.749 2.53125 -1.3374999999999999 0 2.53125 -0.80500000000000005 -1.4375 2.53125 -1.4375 -0.80500000000000005 2.53125 -1.4375 0 2.53125 -0.83999999999999997 -1.5 2.3999999999999999 -1.5 -0.83999999999999997 2.3999999999999999 -1.5 0 2.3999999999999999 -1.3999999999999999 0.78400000000000003 2.3999999999999999 -0.78400000000000003 1.3999999999999999 2.3999999999999999 0 1.3999999999999999 2.3999999999999999 -1.3374999999999999 0.749 2.53125 -0.749 1.3374999999999999 2.53125 0 1.3374999999999999 2.53125 -1.4375 0.80500000000000005 2.53125 -0.80500000000000005 1.4375 2.53125 0 1.4375 2.53125 -1.5 0.83999999999999997 2.3999999999999999 -0.83999999999999997 1.5 2.3999999999999999 0 1.5 2.3999999999999999 0.78400000000000003 1.3999999999999999 2.3999999999999999 1.3999999999999999 0.78400000000000003 2.3999999999999999 0.749 1.3374999999999999 2.53125 1.3374999999999999 0.749 2.53125 0.80500000000000005 1.4375 2.53125 1.4375 0.80500000000000005 2.53125 0.83999999999999997 1.5 2.3999999999999999 1.5 0.83999999999999997 2.3999999999999999 1.75 0 1.875 1.75 -0.97999999999999998 1.875 0.97999999999999998 -1.75 1.875 0 -1.75 1.875 2 0 1.3500000000000001 2 -1.1200000000000001 1.3500000000000001 1.1200000000000001 -2 1.3500000000000001 0 -2 1.3500000000000001 2 0 0.90000000000000002 2 -1.1200000000000001 0.90000000000000002 1.1200000000000001 -2 0.90000000000000002 0 -2 0.90000000000000002 -0.97999999999999998 -1.75 1.875 -1.75 -0.97999999999999998 1.875 -1.75 0 1.875 -1.1200000000000001 -2 1.3500000000000001 -2 -1.1200000000000001 1.3500000000000001 -2 0 1.3500000000000001 -1.1200000000000001 -2 0.90000000000000002 -2 -1.1200000000000001 0.90000000000000002 -2 0 0.90000000000000002 -1.75 0.97999999999999998 1.875 -0.97999999999999998 1.75 1.875 0 1.75 1.875 -2 1.1200000000000001 1.3500000000000001 -1.1200000000000001 2 1.3500000000000001 0 2 1.3500000000000001 -2 1.1200000000000001 0.90000000000000002 -1.1200000000000001 2 0.90000000000000002 0 2 0.90000000000000002 0.97999999999999998 1.75 1.875 1.75 0.97999999999999998 1.875 1.1200000000000001 2 1.3500000000000001 2 1.1200000000000001 1.3500000000000001 1.1200000000000001 2 0.90000000000000002 2 1.1200000000000001 0.90000000000000002 2 0 0.45000000000000001 2 -1.1200000000000001 0.45000000000000001 1.1200000000000001 -2 0.45000000000000001 0 -2 0.45000000000000001 1.5 0 0.22500000000000001 1.5 -0.83999999999999997 0.22500000000000001 0.83999999999999997 -1.5 0.22500000000000001 0 -1.5 0.22500000000000001 1.5 0 0.14999999999999999 1.5 -0.83999999999999997 0.14999999999999999 0.83999999999999997 -1.5 0.14999999999999999 0 -1.5 0.14999999999999999 -1.1200000000000001 -2 0.45000000000000001 -2 -1.1200000000000001 0.45000000000000001 -2 0 0.45000000000000001 -0.83999999999999997 -1.5 0.22500000000000001 -1.5 -0.83999999999999997 0.22500000000000001 -1.5 0 0.22500000000000001 -0.83999999999999997 -1.5 0.14999999999999999 -1.5 -0.83999999999999997 0.14999999999999999 -1.5 0 0.14999999999999999 -2 1.1200000000000001 0.45000000000000001 -1.1200000000000001 2 0.45000000000000001 0 2 0.45000000000000001 -1.5 0.83999999999999997 0.22500000000000001 -0.83999999999999997 1.5 0.22500000000000001 0 1.5 0.22500000000000001 -1.5 0.83999999999999997 0.14999999999999999 -0.83999999999999997 1.5 0.14999999999999999 0 1.5 0.14999999999999999 1.1200000000000001 2 0.45000000000000001 2 1.1200000000000001 0.45000000000000001 0.83999999999999997 1.5 0.22500000000000001 1.5 0.83999999999999997 0.22500000000000001 0.83999999999999997 1.5 0.14999999999999999 1.5 0.83999999999999997 0.14999999999999999 -1.6000000000000001 0 2.0249999999999999 -1.6000000000000001 -0.29999999999999999 2.0249999999999999 -1.5 -0.29999999999999999 2.25 -1.5 0 2.25 -2.2999999999999998 0 2.0249999999999999 -2.2999999999999998 -0.29999999999999999 2.0249999999999999 -2.5 -0.29999999999999999 2.25 -2.5 0 2.25 -2.7000000000000002 0 2.0249999999999999 -2.7000000000000002 -0.29999999999999999 2.0249999999999999 -3 -0.29999999999999999 2.25 -3 0 2.25 -2.7000000000000002 0 1.8 -2.7000000000000002 -0.29999999999999999 1.8 -3 -0.29999999999999999 1.8 -3 0 1.8 -1.5 0.29999999999999999 2.25 -1.6000000000000001 0.29999999999999999 2.0249999999999999 -2.5 0.29999999999999999 2.25 -2.2999999999999998 0.29999999999999999 2.0249999999999999 -3 0.29999999999999999 2.25 -2.7000000000000002 0.29999999999999999 2.0249999999999999 -3 0.29999999999999999 1.8 -2.7000000000000002 0.29999999999999999 1.8 -2.7000000000000002 0 1.575 -2.7000000000000002 -0.29999999999999999 1.575 -3 -0.29999999999999999 1.3500000000000001 -3 0 1.3500000000000001 -2.5 0 1.125 -2.5 -0.29999999999999999 1.125 -2.6499999999999999 -0.29999999999999999 0.9375 -2.6499999999999999 0 0.9375 -2 -0.29999999999999999 0.90000000000000002 -1.8999999999999999 -0.29999999999999999 0.59999999999999998 -1.8999999999999999 0 0.59999999999999998 -3 0.29999999999999999 1.3500000000000001 -2.7000000000000002 0.29999999999999999 1.575 -2.6499999999999999 0.29999999999999999 0.9375 -2.5 0.29999999999999999 1.125 -1.8999999999999999 0.29999999999999999 0.59999999999999998 -2 0.29999999999999999 0.90000000000000002 1.7 0 1.425 1.7 -0.66000000000000003 1.425 1.7 -0.66000000000000003 0.59999999999999998 1.7 0 0.59999999999999998 2.6000000000000001 0 1.425 2.6000000000000001 -0.66000000000000003 1.425 3.1000000000000001 -0.66000000000000003 0.82499999999999996 3.1000000000000001 0 0.82499999999999996 2.2999999999999998 0 2.1000000000000001 2.2999999999999998 -0.25 2.1000000000000001 2.3999999999999999 -0.25 2.0249999999999999 2.3999999999999999 0 2.0249999999999999 2.7000000000000002 0 2.3999999999999999 2.7000000000000002 -0.25 2.3999999999999999 3.2999999999999998 -0.25 2.3999999999999999 3.2999999999999998 0 2.3999999999999999 1.7 0.66000000000000003 0.59999999999999998 1.7 0.66000000000000003 1.425 3.1000000000000001 0.66000000000000003 0.82499999999999996 2.6000000000000001 0.66000000000000003 1.425 2.3999999999999999 0.25 2.0249999999999999 2.2999999999999998 0.25 2.1000000000000001 3.2999999999999998 0.25 2.3999999999999999 2.7000000000000002 0.25 2.3999999999999999 2.7999999999999998 0 2.4750000000000001 2.7999999999999998 -0.25 2.4750000000000001 3.5249999999999999 -0.25 2.4937499999999999 3.5249999999999999 0 2.4937499999999999 2.8999999999999999 0 2.4750000000000001 2.8999999999999999 -0.14999999999999999 2.4750000000000001 3.4500000000000002 -0.14999999999999999 2.5125000000000002 3.4500000000000002 0 2.5125000000000002 2.7999999999999998 0 2.3999999999999999 2.7999999999999998 -0.14999999999999999 2.3999999999999999 3.2000000000000002 -0.14999999999999999 2.3999999999999999 3.2000000000000002 0 2.3999999999999999 3.5249999999999999 0.25 2.4937499999999999 2.7999999999999998 0.25 2.4750000000000001 3.4500000000000002 0.14999999999999999 2.5125000000000002 2.8999999999999999 0.14999999999999999 2.4750000000000001 3.2000000000000002 0.14999999999999999 2.3999999999999999 2.7999999999999998 0.14999999999999999 2.3999999999999999 0 0 3.1499999999999999 0 -0.002 3.1499999999999999 0.002 0 3.1499999999999999 0.80000000000000004 0 3.1499999999999999 0.80000000000000004 -0.45000000000000001 3.1499999999999999 0.45000000000000001 -0.80000000000000004 3.1499999999999999 0 -0.80000000000000004 3.1499999999999999 0 0 2.8500000000000001 0.20000000000000001 0 2.7000000000000002 0.20000000000000001 -0.112 2.7000000000000002 0.112 -0.20000000000000001 2.7000000000000002 0 -0.20000000000000001 2.7000000000000002 -0.002 0 3.1499999999999999 -0.45000000000000001 -0.80000000000000004 3.1499999999999999 -0.80000000000000004 -0.45000000000000001 3.1499999999999999 -0.80000000000000004 0 3.1499999999999999 -0.112 -0.20000000000000001 2.7000000000000002 -0.20000000000000001 -0.112 2.7000000000000002 -0.20000000000000001 0 2.7000000000000002 0 0.002 3.1499999999999999 -0.80000000000000004 0.45000000000000001 3.1499999999999999 -0.45000000000000001 0.80000000000000004 3.1499999999999999 0 0.80000000000000004 3.1499999999999999 -0.20000000000000001 0.112 2.7000000000000002 -0.112 0.20000000000000001 2.7000000000000002 0 0.20000000000000001 2.7000000000000002 0.45000000000000001 0.80000000000000004 3.1499999999999999 0.80000000000000004 0.45000000000000001 3.1499999999999999 0.112 0.20000000000000001 2.7000000000000002 0.20000000000000001 0.112 2.7000000000000002 0.40000000000000002 0 2.5499999999999998 0.40000000000000002 -0.224 2.5499999999999998 0.224 -0.40000000000000002 2.5499999999999998 0 -0.40000000000000002 2.5499999999999998 1.3 0 2.5499999999999998 1.3 -0.72799999999999998 2.5499999999999998 0.72799999999999998 -1.3 2.5499999999999998 0 -1.3 2.5499999999999998 1.3 0 2.3999999999999999 1.3 -0.72799999999999998 2.3999999999999999 0.72799999999999998 -1.3 2.3999999999999999 0 -1.3 2.3999999999999999 -0.224 -0.40000000000000002 2.5499999999999998 -0.40000000000000002 -0.224 2.5499999999999998 -0.40000000000000002 0 2.5499999999999998 -0.72799999999999998 -1.3 2.5499999999999998 -1.3 -0.72799999999999998 2.5499999999999998 -1.3 0 2.5499999999999998 -0.72799999999999998 -1.3 2.3999999999999999 -1.3 -0.72799999999999998 2.3999999999999999 -1.3 0 2.3999999999999999 -0.40000000000000002 0.224 2.5499999999999998 -0.224 0.40000000000000002 2.5499999999999998 0 0.40000000000000002 2.5499999999999998 -1.3 0.72799999999999998 2.5499999999999998 -0.72799999999999998 1.3 2.5499999999999998 0 1.3 2.5499999999999998 -1.3 0.72799999999999998 2.3999999999999999 -0.72799999999999998 1.3 2.3999999999999999 0 1.3 2.3999999999999999 0.224 0.40000000000000002 2.5499999999999998 0.40000000000000002 0.224 2.5499999999999998 0.72799999999999998 1.3 2.5499999999999998 1.3 0.72799999999999998 2.5499999999999998 0.72799999999999998 1.3 2.3999999999999999 1.3 0.72799999999999998 2.3999999999999999 0 0 0 1.5 0 0.14999999999999999 1.5 0.83999999999999997 0.14999999999999999 0.83999999999999997 1.5 0.14999999999999999 0 1.5 0.14999999999999999 1.5 0 0.074999999999999997 1.5 0.83999999999999997 0.074999999999999997 0.83999999999999997 1.5 0.074999999999999997 0 1.5 0.074999999999999997 1.425 0 0 1.425 0.79800000000000004 0 0.79800000000000004 1.425 0 0 1.425 0 -0.83999999999999997 1.5 0.14999999999999999 -1.5 0.83999999999999997 0.14999999999999999 -1.5 0 0.14999999999999999 -0.83999999999999997 1.5 0.074999999999999997 -1.5 0.83999999999999997 0.074999999999999997 -1.5 0 0.074999999999999997 -0.79800000000000004 1.425 0 -1.425 0.79800000000000004 0 -1.425 0 0 -1.5 -0.83999999999999997 0.14999999999999999 -0.83999999999999997 -1.5 0.14999999999999999 0 -1.5 0.14999999999999999 -1.5 -0.83999999999999997 0.074999999999999997 -0.83999999999999997 -1.5 0.074999999999999997 0 -1.5 0.074999999999999997 -1.425 -0.79800000000000004 0 -0.79800000000000004 -1.425 0 0 -1.425 0 0.83999999999999997 -1.5 0.14999999999999999 1.5 -0.83999999999999997 0.14999999999999999 0.83999999999999997 -1.5 0.074999999999999997 1.5 -0.83999999999999997 0.074999999999999997 0.79800000000000004 -1.425 0 1.425 -0.79800000000000004 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"bicubic_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 3 16 17 18 7 19 20 21 11 22 23 24 15 25 26 27 18 28 29 30 21 31 32 33 24 34 35 36 27 37 38 39 30 40 41 0 33 42 43 4 36 44 45 8 39 46 47 12 12 13 14 15 48 49 50 51 52 53 54 55 56 57 58 59 15 25 26 27 51 60 61 62 55 63 64 65 59 66 67 68 27 37 38 39 62 69 70 71 65 72 73 74 68 75 76 77 39 46 47 12 71 78 79 48 74 80 81 52 77 82 83 56 56 57 58 59 84 85 86 87 88 89 90 91 92 93 94 95 59 66 67 68 87 96 97 98 91 99 100 101 95 102 103 104 68 75 76 77 98 105 106 107 101 108 109 110 104 111 112 113 77 82 83 56 107 114 115 84 110 116 117 88 113 118 119 92 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 123 136 137 120 127 138 139 124 131 140 141 128 135 142 143 132 132 133 134 135 144 145 146 147 148 149 150 151 68 152 153 154 135 142 143 132 147 155 156 144 151 157 158 148 154 159 160 68 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 164 177 178 161 168 179 180 165 172 181 182 169 176 183 184 173 173 174 175 176 185 186 187 188 189 190 191 192 193 194 195 196 176 183 184 173 188 197 198 185 192 199 200 189 196 201 202 193 203 203 203 203 206 207 208 209 210 210 210 210 211 212 213 214 203 203 203 203 209 216 217 218 210 210 210 210 214 219 220 221 203 203 203 203 218 223 224 225 210 210 210 210 221 226 227 228 203 203 203 203 225 229 230 206 210 210 210 210 228 231 232 211 211 212 213 214 233 234 235 236 237 238 239 240 241 242 243 244 214 219 220 221 236 245 246 247 240 248 249 250 244 251 252 253 221 226 227 228 247 254 255 256 250 257 258 259 253 260 261 262 228 231 232 211 256 263 264 233 259 265 266 237 262 267 268 241 269 269 269 269 278 279 280 281 274 275 276 277 270 271 272 273 269 269 269 269 281 288 289 290 277 285 286 287 273 282 283 284 269 269 269 269 290 297 298 299 287 294 295 296 284 291 292 293 269 269 269 269 299 304 305 278 296 302 303 274 293 300 301 270\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.Newell.teaspoon.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0.20535700000000001 -0.000107143 0 0.19642899999999999 0 -0.017857100000000001 0.19642899999999999 0 -0.017857100000000001 0.20535700000000001 0.000107143 0 0.20535700000000001 -0.053571399999999998 0 0.17857100000000001 -0.0222714 -0.0534286 0.17857100000000001 0.0222714 -0.0534286 0.20535700000000001 0.053571399999999998 0 0.095242900000000005 -0.107143 -0.017857100000000001 0.095242900000000005 -0.044642899999999999 -0.089285699999999996 0.095242900000000005 0.044642899999999999 -0.089285699999999996 0.095242900000000005 0.107143 -0.017857100000000001 0 -0.107143 -0.017857100000000001 0 -0.044642899999999999 -0.089285699999999996 0 0.044642899999999999 -0.089285699999999996 0 0.107143 -0.017857100000000001 0.20535700000000001 0.000107143 0 0.207589 0.000135714 0.0044642900000000001 0.21651799999999999 0.000157143 0.0044642900000000001 0.214286 0.000125 0 0.20535700000000001 0.053571399999999998 0 0.21205399999999999 0.061396399999999997 0.0133571 0.22098200000000001 0.071428599999999995 0.015625 0.214286 0.0625 0 0.095242900000000005 0.107143 -0.017857100000000001 0.095242900000000005 0.122768 0 0.095242900000000005 0.14285700000000001 0.0044642900000000001 0.095242900000000005 0.125 -0.017857100000000001 0 0.107143 -0.017857100000000001 0 0.122768 0 0 0.14285700000000001 0.0044642900000000001 0 0.125 -0.017857100000000001 0.214286 0.000125 0 0.20535700000000001 0 -0.017857100000000001 0.20535700000000001 0 -0.017857100000000001 0.214286 -0.000125 0 0.214286 0.0625 0 0.1875 0.026785699999999999 -0.0625 0.1875 -0.026785699999999999 -0.0625 0.214286 -0.0625 0 0.095242900000000005 0.125 -0.017857100000000001 0.095242900000000005 0.053571399999999998 -0.107143 0.095242900000000005 -0.053571399999999998 -0.107143 0.095242900000000005 -0.125 -0.017857100000000001 0 0.125 -0.017857100000000001 0 0.053571399999999998 -0.107143 0 -0.053571399999999998 -0.107143 0 -0.125 -0.017857100000000001 0.214286 -0.000125 0 0.21651799999999999 -0.000157143 0.0044642900000000001 0.207589 -0.000135714 0.0044642900000000001 0.20535700000000001 -0.000107143 0 0.214286 -0.0625 0 0.22098200000000001 -0.071428599999999995 0.015625 0.21205399999999999 -0.061396399999999997 0.0133571 0.20535700000000001 -0.053571399999999998 0 0.095242900000000005 -0.125 -0.017857100000000001 0.095242900000000005 -0.14285700000000001 0.0044642900000000001 0.095242900000000005 -0.122768 0 0.095242900000000005 -0.107143 -0.017857100000000001 0 -0.125 -0.017857100000000001 0 -0.14285700000000001 0.0044642900000000001 0 -0.122768 0 0 -0.107143 -0.017857100000000001 0 -0.107143 -0.017857100000000001 0 -0.044642899999999999 -0.089285699999999996 0 0.044642899999999999 -0.089285699999999996 0 0.107143 -0.017857100000000001 -0.14285700000000001 -0.107143 -0.017857100000000001 -0.14285700000000001 -0.044642899999999999 -0.089285699999999996 -0.14285700000000001 0.044642899999999999 -0.089285699999999996 -0.14285700000000001 0.107143 -0.017857100000000001 -0.160714 -0.013392899999999999 0.038689300000000003 -0.160714 -0.0055785699999999997 0.038689300000000003 -0.160714 0.0055785699999999997 0.038689300000000003 -0.160714 0.013392899999999999 0.038689300000000003 -0.25 -0.013392899999999999 0.053571399999999998 -0.25 -0.0055785699999999997 0.053571399999999998 -0.25 0.0055785699999999997 0.053571399999999998 -0.25 0.013392899999999999 0.053571399999999998 0 0.107143 -0.017857100000000001 0 0.122768 0 0 0.14285700000000001 0.0044642900000000001 0 0.125 -0.017857100000000001 -0.14285700000000001 0.107143 -0.017857100000000001 -0.14285700000000001 0.122768 0 -0.14285700000000001 0.14285700000000001 0.0044642900000000001 -0.14285700000000001 0.125 -0.017857100000000001 -0.160714 0.013392899999999999 0.038689300000000003 -0.160714 0.0153464 0.038689300000000003 -0.160714 0.017857100000000001 0.031435699999999997 -0.160714 0.015625 0.029760700000000001 -0.25 0.013392899999999999 0.053571399999999998 -0.25 0.0153464 0.053571399999999998 -0.25 0.017857100000000001 0.046317900000000002 -0.25 0.015625 0.044642899999999999 0 0.125 -0.017857100000000001 0 0.053571399999999998 -0.107143 0 -0.053571399999999998 -0.107143 0 -0.125 -0.017857100000000001 -0.14285700000000001 0.125 -0.017857100000000001 -0.14285700000000001 0.053571399999999998 -0.107143 -0.14285700000000001 -0.053571399999999998 -0.107143 -0.14285700000000001 -0.125 -0.017857100000000001 -0.160714 0.015625 0.029760700000000001 -0.160714 0.0066964299999999997 0.023064299999999999 -0.160714 -0.0078107100000000002 0.020832099999999999 -0.160714 -0.015625 0.029760700000000001 -0.25 0.015625 0.044642899999999999 -0.25 0.0066964299999999997 0.037946399999999998 -0.25 -0.0078107100000000002 0.035714299999999997 -0.25 -0.015625 0.044642899999999999 0 -0.125 -0.017857100000000001 0 -0.14285700000000001 0.0044642900000000001 0 -0.122768 0 0 -0.107143 -0.017857100000000001 -0.14285700000000001 -0.125 -0.017857100000000001 -0.14285700000000001 -0.14285700000000001 0.0044642900000000001 -0.14285700000000001 -0.122768 0 -0.14285700000000001 -0.107143 -0.017857100000000001 -0.160714 -0.015625 0.029760700000000001 -0.160714 -0.0175786 0.031992899999999998 -0.160714 -0.0153464 0.038689300000000003 -0.160714 -0.013392899999999999 0.038689300000000003 -0.25 -0.015625 0.044642899999999999 -0.25 -0.0175786 0.046875 -0.25 -0.0153464 0.053571399999999998 -0.25 -0.013392899999999999 0.053571399999999998 -0.25 -0.013392899999999999 0.053571399999999998 -0.25 -0.0055785699999999997 0.053571399999999998 -0.25 0.0055785699999999997 0.053571399999999998 -0.25 0.013392899999999999 0.053571399999999998 -0.46425 -0.013392899999999999 0.089285699999999996 -0.46425 -0.0055785699999999997 0.089285699999999996 -0.46425 0.0055785699999999997 0.089285699999999996 -0.46425 0.013392899999999999 0.089285699999999996 -0.67857100000000004 -0.044642899999999999 0.053571399999999998 -0.67857100000000004 -0.0089285700000000003 0.0625 -0.67857100000000004 0.0089285700000000003 0.0625 -0.67857100000000004 0.044642899999999999 0.053571399999999998 -0.85714299999999999 -0.044642899999999999 0.035714299999999997 -0.85714299999999999 -0.0089285700000000003 0.044642899999999999 -0.85714299999999999 0.0089285700000000003 0.044642899999999999 -0.85714299999999999 0.044642899999999999 0.035714299999999997 -0.25 0.013392899999999999 0.053571399999999998 -0.25 0.0153464 0.053571399999999998 -0.25 0.017857100000000001 0.046317900000000002 -0.25 0.015625 0.044642899999999999 -0.46425 0.013392899999999999 0.089285699999999996 -0.46428599999999998 0.0153464 0.089285699999999996 -0.46425 0.017857100000000001 0.082032099999999997 -0.46425 0.015625 0.080357100000000001 -0.67857100000000004 0.044642899999999999 0.053571399999999998 -0.67857100000000004 0.053571399999999998 0.051339299999999997 -0.67857100000000004 0.053571399999999998 0.033482100000000001 -0.67857100000000004 0.044642899999999999 0.035714299999999997 -0.85714299999999999 0.044642899999999999 0.035714299999999997 -0.85714299999999999 0.053571399999999998 0.033482100000000001 -0.85714299999999999 0.053571399999999998 0.015625 -0.85714299999999999 0.044642899999999999 0.017857100000000001 -0.25 0.015625 0.044642899999999999 -0.25 0.0066964299999999997 0.037946399999999998 -0.25 -0.0078107100000000002 0.035714299999999997 -0.25 -0.015625 0.044642899999999999 -0.46425 0.015625 0.080357100000000001 -0.46428599999999998 0.0066964299999999997 0.073660699999999996 -0.46425 -0.0078107100000000002 0.071428599999999995 -0.46425 -0.015625 0.080357100000000001 -0.67857100000000004 0.044642899999999999 0.035714299999999997 -0.67857100000000004 0.0089285700000000003 0.044642899999999999 -0.67857100000000004 -0.0089285700000000003 0.044642899999999999 -0.67857100000000004 -0.044642899999999999 0.035714299999999997 -0.85714299999999999 0.044642899999999999 0.017857100000000001 -0.85714299999999999 0.0089285700000000003 0.026785699999999999 -0.85714299999999999 -0.0089285700000000003 0.026785699999999999 -0.85714299999999999 -0.044642899999999999 0.017857100000000001 -0.25 -0.015625 0.044642899999999999 -0.25 -0.0175786 0.046875 -0.25 -0.0153464 0.053571399999999998 -0.25 -0.013392899999999999 0.053571399999999998 -0.46425 -0.015625 0.080357100000000001 -0.46428599999999998 -0.0175786 0.082589300000000004 -0.46428599999999998 -0.0153464 0.089285699999999996 -0.46425 -0.013392899999999999 0.089285699999999996 -0.67857100000000004 -0.044642899999999999 0.035714299999999997 -0.67857100000000004 -0.053571399999999998 0.033482100000000001 -0.67857100000000004 -0.053571399999999998 0.051339299999999997 -0.67857100000000004 -0.044642899999999999 0.053571399999999998 -0.85714299999999999 -0.044642899999999999 0.017857100000000001 -0.85714299999999999 -0.053571399999999998 0.015625 -0.85714299999999999 -0.053571399999999998 0.033482100000000001 -0.85714299999999999 -0.044642899999999999 0.035714299999999997 -0.85714299999999999 -0.044642899999999999 0.035714299999999997 -0.85714299999999999 -0.0089285700000000003 0.044642899999999999 -0.85714299999999999 0.0089285700000000003 0.044642899999999999 -0.85714299999999999 0.044642899999999999 0.035714299999999997 -0.92857100000000004 -0.044642899999999999 0.0285714 -0.92857100000000004 -0.0089285700000000003 0.037499999999999999 -0.92857100000000004 0.0089285700000000003 0.037499999999999999 -0.92857100000000004 0.044642899999999999 0.0285714 -0.99964299999999995 -0.0539286 0.017857100000000001 -0.99964299999999995 0.00035714299999999998 0.017857100000000001 -0.99964299999999995 0 0.017857100000000001 -0.99964299999999995 0.053571399999999998 0.017857100000000001 -1 -0.00035714299999999998 0.017857100000000001 -1 0.00035714299999999998 0.017857100000000001 -1 0 0.017857100000000001 -1 0 0.017857100000000001 -0.85714299999999999 0.044642899999999999 0.035714299999999997 -0.85714299999999999 0.053571399999999998 0.033482100000000001 -0.85714299999999999 0.053571399999999998 0.015625 -0.85714299999999999 0.044642899999999999 0.017857100000000001 -0.92857100000000004 0.044642899999999999 0.0285714 -0.92857100000000004 0.053571399999999998 0.0263393 -0.92857100000000004 0.053571399999999998 0.0084821400000000009 -0.92857100000000004 0.044642899999999999 0.0107143 -0.99964299999999995 0.053571399999999998 0.017857100000000001 -0.99964299999999995 0.066964300000000004 0.017857100000000001 -0.99964299999999995 0.067321400000000003 0 -0.99964299999999995 0.0539286 0 -1 0 0.017857100000000001 -1 0 0.017857100000000001 -1 0.00035714299999999998 0 -1 0.00035714299999999998 0 -0.85714299999999999 0.044642899999999999 0.017857100000000001 -0.85714299999999999 0.0089285700000000003 0.026785699999999999 -0.85714299999999999 -0.0089285700000000003 0.026785699999999999 -0.85714299999999999 -0.044642899999999999 0.017857100000000001 -0.92857100000000004 0.044642899999999999 0.0107143 -0.92857100000000004 0.0089285700000000003 0.019642900000000001 -0.92857100000000004 -0.0089285700000000003 0.019642900000000001 -0.92857100000000004 -0.044642899999999999 0.0107143 -0.99964299999999995 0.0539286 0 -0.99964299999999995 0.00035714299999999998 0 -0.99964299999999995 -0.00035714299999999998 0 -0.99964299999999995 -0.0539286 0 -1 0.00035714299999999998 0 -1 0.00035714299999999998 0 -1 -0.00035714299999999998 0 -1 -0.00035714299999999998 0 -0.85714299999999999 -0.044642899999999999 0.017857100000000001 -0.85714299999999999 -0.053571399999999998 0.015625 -0.85714299999999999 -0.053571399999999998 0.033482100000000001 -0.85714299999999999 -0.044642899999999999 0.035714299999999997 -0.92857100000000004 -0.044642899999999999 0.0107143 -0.92857100000000004 -0.053571399999999998 0.0084821400000000009 -0.92857100000000004 -0.053571399999999998 0.0263393 -0.92857100000000004 -0.044642899999999999 0.0285714 -0.99964299999999995 -0.0539286 0 -0.99964299999999995 -0.067321400000000003 0 -0.99964299999999995 -0.067500000000000004 0.017857100000000001 -0.99964299999999995 -0.0539286 0.017857100000000001 -1 -0.00035714299999999998 0 -1 -0.00035714299999999998 0 -1 -0.00053571399999999996 0.017857100000000001 -1 -0.00035714299999999998 0.017857100000000001</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"bicubic_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsCircle.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119672569625e-11 -0 -4.9999999999489653 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsCircle.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744826 -0 -5 -5.1034119692792285e-11 -0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsCone.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119672569625e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0 2.5 0 5 2.5 2.5000000000127587 5 -1.2758529918142406e-11 2.5 5 -2.5000000000255169 2.4999999999872409 5 -2.5 -2.5517059836284813e-11 5 -2.4999999999744831 -2.5000000000382756 5 3.8275589754427217e-11 -2.5 5 2.5000000000510343 -2.4999999999617244 5 2.5 5.1034119672569625e-11 5 0 0 10 0 0 10 0 0 10 0 0 10 0 0 10 0 0 10 0 0 10 0 0 10 0 0 10</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsCone.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119692792285e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0 2.5 0 5 2.5 2.5000000000127587 5 -1.2758529923198071e-11 2.5 5 -2.5000000000255169 2.4999999999872409 5 -2.5 -2.5517059846396142e-11 5 -2.4999999999744831 -2.5000000000382756 5 3.8275589769594213e-11 -2.5 5 2.5000000000510343 -2.4999999999617244 5 2.5 5.1034119692792285e-11 5 0 0 10 0 0 10 0 0 10 0 0 10 0 0 10 0 0 10 0 0 10 0 0 10 0 0 10</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsCurve.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 0 1 0 0 2 0 0 3 0 0</points>\n\t\t<point_selection>0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 0 1 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsCylinder.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 -5 5 5.0000000000255174 -5 -2.5517059836284813e-11 5 -5 -5.0000000000510338 4.9999999999744817 -5 -5 -5.1034119672569625e-11 -5 -4.9999999999489662 -5.0000000000765512 -5 7.6551179508854434e-11 -5 -5 5.0000000001020686 -4.9999999999234488 -5 5 1.0206823934513925e-10 -5 5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119672569625e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0 5 0 5 5 5.0000000000255174 5 -2.5517059836284813e-11 5 5 -5.0000000000510338 4.9999999999744817 5 -5 -5.1034119672569625e-11 5 -4.9999999999489662 -5.0000000000765512 5 7.6551179508854434e-11 -5 5 5.0000000001020686 -4.9999999999234488 5 5 1.0206823934513925e-10 5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsCylinder.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 -5 5 5.0000000000255174 -5 -2.5517059846396142e-11 5 -5 -5.0000000000510338 4.9999999999744817 -5 -5 -5.1034119692792285e-11 -5 -4.9999999999489662 -5.0000000000765512 -5 7.6551179539188427e-11 -5 -5 5.0000000001020686 -4.9999999999234488 -5 5 1.0206823938558457e-10 -5 5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119692792285e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0 5 0 5 5 5.0000000000255174 5 -2.5517059846396142e-11 5 5 -5.0000000000510338 4.9999999999744817 5 -5 -5.1034119692792285e-11 5 -4.9999999999489662 -5.0000000000765512 5 7.6551179539188427e-11 -5 5 5.0000000001020686 -4.9999999999234488 5 5 1.0206823938558457e-10 5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsDisk.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119672569625e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0 2.5 0 0 2.5 2.5000000000127587 0 -1.2758529918142406e-11 2.5 0 -2.5000000000255169 2.4999999999872409 0 -2.5 -2.5517059836284813e-11 0 -2.4999999999744831 -2.5000000000382756 0 3.8275589754427217e-11 -2.5 0 2.5000000000510343 -2.4999999999617244 0 2.5 5.1034119672569625e-11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsDisk.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119692792285e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0 2.5 0 0 2.5 2.5000000000127587 0 -1.2758529923198071e-11 2.5 0 -2.5000000000255169 2.4999999999872409 0 -2.5 -2.5517059846396142e-11 0 -2.4999999999744831 -2.5000000000382756 0 3.8275589769594213e-11 -2.5 0 2.5000000000510343 -2.4999999999617244 0 2.5 5.1034119692792285e-11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsGrid.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-5 5 0 -1.6666666666666665 5 0 1.6666666666666665 5 0 5 5 0 -5 1.6666666666666665 0 -1.6666666666666665 1.6666666666666665 0 1.6666666666666665 1.6666666666666665 0 5 1.6666666666666665 0 -5 -1.6666666666666665 0 -1.6666666666666665 -1.6666666666666665 0 1.6666666666666665 -1.6666666666666665 0 5 -1.6666666666666665 0 -5 -5 0 -1.6666666666666665 -5 0 1.6666666666666665 -5 0 5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsHyperboloid.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5.0000000000000009 -5 -5 10.000000000025517 2.5517142638528714e-11 -5 4.9999999999744835 5.0000000000255165 -5 -7.6551427915586135e-11 10.000000000025517 -5 -5.0000000000510338 4.9999999999489653 -5 -10.000000000025517 -1.2758492814641421e-10 -5 -4.9999999999234488 -5.0000000000765512 -5 1.78619998469701e-10 -10.000000000025517 -5 5.0000000001020686 -4.9999999998979323 -5 5.0000000000000009 5 5 -2.5516357592299372e-11 10.000000000025517 5 -5.0000000000255165 4.9999999999744835 5 -10.000000000025517 -7.6551427915586135e-11 5 -4.9999999999489662 -5.0000000000510338 5 1.2758571319264356e-10 -10.000000000025517 5 5.0000000000765512 -4.9999999999234488 5 10.000000000025517 1.7861921342347165e-10 5 4.9999999998979323 5.0000000001020686 5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsHyperboloid.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5.0000000000000009 -5 -5 10.000000000025517 2.5517927684758055e-11 -5 4.9999999999744826 5.0000000000255174 -5 -7.6552213345138837e-11 10.000000000025517 -5 -5.0000000000510347 4.9999999999489662 -5 -10.000000000025517 -1.2758492852973757e-10 -5 -4.9999999999234488 -5.0000000000765512 -5 1.7861921342347165e-10 -10.000000000025517 -5 5.0000000001020686 -4.9999999998979323 -5 5.0000000000000009 5 5 -2.5516357592299372e-11 10.000000000025517 5 -5.0000000000255165 4.9999999999744835 5 -10.000000000025517 -7.65506428693568e-11 5 -4.9999999999489662 -5.0000000000510338 5 1.2758492814641421e-10 -10.000000000025517 5 5.0000000000765512 -4.9999999999234488 5 10.000000000025517 1.7861921342347165e-10 5 4.9999999998979323 5.0000000001020686 5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsParaboloid.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.5 0 0 2.5 2.5000000000127587 0 -1.2758529918142406e-11 2.5 0 -2.5000000000255169 2.4999999999872409 0 -2.5 -2.5517059836284813e-11 0 -2.4999999999744831 -2.5000000000382756 0 3.8275589754427217e-11 -2.5 0 2.5000000000510343 -2.4999999999617244 0 2.5 5.1034119672569625e-11 0 5 0 10 5 5.0000000000255174 10 -2.5517059836284813e-11 5 10 -5.0000000000510338 4.9999999999744817 10 -5 -5.1034119672569625e-11 10 -4.9999999999489662 -5.0000000000765512 10 7.6551179508854434e-11 -5 10 5.0000000001020686 -4.9999999999234488 10 5 1.0206823934513925e-10 10</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsParaboloid.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.5 0 0 2.5 2.5000000000127587 0 -1.2758529923198071e-11 2.5 0 -2.5000000000255169 2.4999999999872409 0 -2.5 -2.5517059846396142e-11 0 -2.4999999999744831 -2.5000000000382756 0 3.8275589769594213e-11 -2.5 0 2.5000000000510343 -2.4999999999617244 0 2.5 5.1034119692792285e-11 0 5 0 10 5 5.0000000000255174 10 -2.5517059846396142e-11 5 10 -5.0000000000510338 4.9999999999744817 10 -5 -5.1034119692792285e-11 10 -4.9999999999489662 -5.0000000000765512 10 7.6551179539188427e-11 -5 10 5.0000000001020686 -4.9999999999234488 10 5 1.0206823938558457e-10 10</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsPolygon.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>3.0616169978683831e-16 5 0 -5 6.1232339957367663e-16 0 -9.1848509936051479e-16 -5 0 5 -1.2246467991473533e-15 0</points>\n\t\t<point_selection>0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">5</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 1 2 3 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsPolygon.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>3.0615158845559431e-16 5 0 -5 6.1230317691118863e-16 0 -9.1845476536678294e-16 -5 0 5 -1.2246063538223773e-15 0</points>\n\t\t<point_selection>0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">2</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">5</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 1 2 3 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 2 3 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsSphere.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>3.0616169978683831e-16 0 -5 3.0616169978683831e-16 3.061616997884008e-16 -5 -1.5624692826078842e-27 3.0616169978683831e-16 -5 -3.0616169978996324e-16 3.0616169978527578e-16 -5 -3.0616169978683831e-16 -3.1249385652157683e-27 -5 -3.0616169978371339e-16 -3.0616169979152573e-16 -5 4.6874078478236525e-27 -3.0616169978683831e-16 -5 3.0616169979308821e-16 -3.061616997821509e-16 -5 3.0616169978683831e-16 6.2498771304315366e-27 -5 5 0 -4.9999999999999991 5 5.0000000000255174 -4.9999999999999991 -2.5517059836284813e-11 5 -4.9999999999999991 -5.0000000000510338 4.9999999999744817 -4.9999999999999991 -5 -5.1034119672569625e-11 -4.9999999999999991 -4.9999999999489662 -5.0000000000765512 -4.9999999999999991 7.6551179508854434e-11 -5 -4.9999999999999991 5.0000000001020686 -4.9999999999234488 -4.9999999999999991 5 1.0206823934513925e-10 -4.9999999999999991 5 0 0 5 5.0000000000255174 0 -2.5517059836284813e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119672569625e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179508854434e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823934513925e-10 0 5 0 4.9999999999999991 5 5.0000000000255174 4.9999999999999991 -2.5517059836284813e-11 5 4.9999999999999991 -5.0000000000510338 4.9999999999744817 4.9999999999999991 -5 -5.1034119672569625e-11 4.9999999999999991 -4.9999999999489662 -5.0000000000765512 4.9999999999999991 7.6551179508854434e-11 -5 4.9999999999999991 5.0000000001020686 -4.9999999999234488 4.9999999999999991 5 1.0206823934513925e-10 4.9999999999999991 3.0616169978683831e-16 0 5 3.0616169978683831e-16 3.061616997884008e-16 5 -1.5624692826078842e-27 3.0616169978683831e-16 5 -3.0616169978996324e-16 3.0616169978527578e-16 5 -3.0616169978683831e-16 -3.1249385652157683e-27 5 -3.0616169978371339e-16 -3.0616169979152573e-16 5 4.6874078478236525e-27 -3.0616169978683831e-16 5 3.0616169979308821e-16 -3.061616997821509e-16 5 3.0616169978683831e-16 6.2498771304315366e-27 5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsSphere.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>3.0615158845559431e-16 0 -5 3.0615158845559431e-16 3.0615158845715675e-16 -5 -1.5624176809381285e-27 3.0615158845559431e-16 -5 -3.0615158845871914e-16 3.0615158845403183e-16 -5 -3.0615158845559431e-16 -3.124835361876257e-27 -5 -3.0615158845246949e-16 -3.0615158846028158e-16 -5 4.6872530428143855e-27 -3.0615158845559431e-16 -5 3.0615158846184402e-16 -3.0615158845090705e-16 -5 3.0615158845559431e-16 6.249670723752514e-27 -5 5 0 -4.9999999999999991 5 5.0000000000255174 -4.9999999999999991 -2.5517059846396142e-11 5 -4.9999999999999991 -5.0000000000510338 4.9999999999744817 -4.9999999999999991 -5 -5.1034119692792285e-11 -4.9999999999999991 -4.9999999999489662 -5.0000000000765512 -4.9999999999999991 7.6551179539188427e-11 -5 -4.9999999999999991 5.0000000001020686 -4.9999999999234488 -4.9999999999999991 5 1.0206823938558457e-10 -4.9999999999999991 5 0 0 5 5.0000000000255174 0 -2.5517059846396142e-11 5 0 -5.0000000000510338 4.9999999999744817 0 -5 -5.1034119692792285e-11 0 -4.9999999999489662 -5.0000000000765512 0 7.6551179539188427e-11 -5 0 5.0000000001020686 -4.9999999999234488 0 5 1.0206823938558457e-10 0 5 0 4.9999999999999991 5 5.0000000000255174 4.9999999999999991 -2.5517059846396142e-11 5 4.9999999999999991 -5.0000000000510338 4.9999999999744817 4.9999999999999991 -5 -5.1034119692792285e-11 4.9999999999999991 -4.9999999999489662 -5.0000000000765512 4.9999999999999991 7.6551179539188427e-11 -5 4.9999999999999991 5.0000000001020686 -4.9999999999234488 4.9999999999999991 5 1.0206823938558457e-10 4.9999999999999991 3.0615158845559431e-16 0 5 3.0615158845559431e-16 3.0615158845715675e-16 5 -1.5624176809381285e-27 3.0615158845559431e-16 5 -3.0615158845871914e-16 3.0615158845403183e-16 5 -3.0615158845559431e-16 -3.124835361876257e-27 5 -3.0615158845246949e-16 -3.0615158846028158e-16 5 4.6872530428143855e-27 -3.0615158845559431e-16 5 3.0615158846184402e-16 -3.0615158845090705e-16 5 3.0615158845559431e-16 6.249670723752514e-27 5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">5</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 0.49999999999872419 0.70710678118654757 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsTorus.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>7 0 0 7 7.0000000000357243 0 -3.5723883770798734e-11 7 0 -7.0000000000714468 6.9999999999642748 0 -7 -7.1447767541597469e-11 0 -6.9999999999285532 -7.0000000001071712 0 1.0717165131239622e-10 -7 0 7.0000000001428955 -6.9999999998928288 0 7 1.4289553508319494e-10 0 7 0 2.0000000000102069 7 7.0000000000357243 2.0000000000102069 -3.5723883770798734e-11 7 2.0000000000102069 -7.0000000000714468 6.9999999999642748 2.0000000000102069 -7 -7.1447767541597469e-11 2.0000000000102069 -6.9999999999285532 -7.0000000001071712 2.0000000000102069 1.0717165131239622e-10 -7 2.0000000000102069 7.0000000001428955 -6.9999999998928288 2.0000000000102069 7 1.4289553508319494e-10 2.0000000000102069 4.9999999999897931 0 2 4.9999999999897931 5.0000000000153104 2 -2.5517059836232723e-11 4.9999999999897931 2 -5.0000000000408269 4.9999999999642748 2 -4.9999999999897931 -5.1034119672465446e-11 2 -4.9999999999387592 -5.0000000000663443 2 7.6551179508698162e-11 -4.9999999999897931 2 5.0000000000918616 -4.9999999999132418 2 4.9999999999897931 1.0206823934493089e-10 2 2.9999999999795866 0 1.9999999999897928 2.9999999999795866 2.999999999994897 1.9999999999897928 -1.5310235901666708e-11 2.9999999999795866 1.9999999999897928 -3.0000000000102065 2.9999999999642757 1.9999999999897928 -2.9999999999795866 -3.0620471803333416e-11 1.9999999999897928 -2.9999999999489666 -3.0000000000255169 1.9999999999897928 4.5930707705000127e-11 -2.9999999999795866 1.9999999999897928 3.0000000000408273 -2.9999999999336562 1.9999999999897928 2.9999999999795866 6.1240943606666832e-11 1.9999999999897928 3 0 -2.041364786902785e-11 3 3.0000000000153104 -2.041364786902785e-11 -1.5310235901770888e-11 3 -2.041364786902785e-11 -3.00000000003062 2.9999999999846891 -2.041364786902785e-11 -3 -3.0620471803541775e-11 -2.041364786902785e-11 -2.99999999996938 -3.0000000000459304 -2.041364786902785e-11 4.5930707705312666e-11 -3 -2.041364786902785e-11 3.0000000000612408 -2.9999999999540696 -2.041364786902785e-11 3 6.124094360708355e-11 -2.041364786902785e-11 3.0000000000204134 0 -2.0000000000306204 3.0000000000204134 3.0000000000357239 -2.0000000000306204 -1.5310235901875067e-11 3.0000000000204134 -2.0000000000306204 -3.0000000000510338 3.0000000000051026 -2.0000000000306204 -3.0000000000204134 -3.0620471803750134e-11 -2.0000000000306204 -2.9999999999897931 -3.0000000000663443 -2.0000000000306204 4.5930707705625198e-11 -3.0000000000204134 -2.0000000000306204 3.0000000000816547 -2.9999999999744826 -2.0000000000306204 3.0000000000204134 6.1240943607500268e-11 -2.0000000000306204 5.0000000000306208 0 -2 5.0000000000306208 5.0000000000561382 -2 -2.5517059836441082e-11 5.0000000000306208 -2 -5.0000000000816547 5.0000000000051026 -2 -5.0000000000306208 -5.1034119672882164e-11 -2 -4.999999999979587 -5.000000000107172 -2 7.6551179509323252e-11 -5.0000000000306208 -2 5.0000000001326894 -4.9999999999540696 -2 5.0000000000306208 1.0206823934576433e-10 -2 7.0000000000408278 0 -1.9999999999693796 7.0000000000408278 7.0000000000765521 -1.9999999999693796 -3.57238837710071e-11 7.0000000000408278 -1.9999999999693796 -7.0000000001122746 7.0000000000051026 -1.9999999999693796 -7.0000000000408278 -7.14477675420142e-11 -1.9999999999693796 -6.9999999999693809 -7.0000000001479989 -1.9999999999693796 1.0717165131302129e-10 -7.0000000000408278 -1.9999999999693796 7.0000000001837233 -6.9999999999336566 -1.9999999999693796 7.0000000000408278 1.428955350840284e-10 -1.9999999999693796 7 0 4.08272957380557e-11 7 7.0000000000357243 4.08272957380557e-11 -3.5723883770798734e-11 7 4.08272957380557e-11 -7.0000000000714468 6.9999999999642748 4.08272957380557e-11 -7 -7.1447767541597469e-11 4.08272957380557e-11 -6.9999999999285532 -7.0000000001071712 4.08272957380557e-11 1.0717165131239622e-10 -7 4.08272957380557e-11 7.0000000001428955 -6.9999999998928288 4.08272957380557e-11 7 1.4289553508319494e-10 4.08272957380557e-11</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.NurbsTorus.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>7 0 0 7 7.0000000000357243 0 -3.5723883784954599e-11 7 0 -7.0000000000714468 6.9999999999642748 0 -7 -7.1447767569909199e-11 0 -6.9999999999285532 -7.0000000001071712 0 1.071716513548638e-10 -7 0 7.0000000001428955 -6.9999999998928288 0 7 1.428955351398184e-10 0 7 0 2.0000000000102069 7 7.0000000000357243 2.0000000000102069 -3.5723883784954599e-11 7 2.0000000000102069 -7.0000000000714468 6.9999999999642748 2.0000000000102069 -7 -7.1447767569909199e-11 2.0000000000102069 -6.9999999999285532 -7.0000000001071712 2.0000000000102069 1.071716513548638e-10 -7 2.0000000000102069 7.0000000001428955 -6.9999999998928288 2.0000000000102069 7 1.428955351398184e-10 2.0000000000102069 4.9999999999897931 0 2 4.9999999999897931 5.0000000000153104 2 -2.5517059846344053e-11 4.9999999999897931 2 -5.0000000000408269 4.9999999999642748 2 -4.9999999999897931 -5.1034119692688105e-11 2 -4.9999999999387592 -5.0000000000663443 2 7.6551179539032154e-11 -4.9999999999897931 2 5.0000000000918616 -4.9999999999132418 2 4.9999999999897931 1.0206823938537621e-10 2 2.9999999999795866 0 1.9999999999897928 2.9999999999795866 2.999999999994897 1.9999999999897928 -1.5310235907733506e-11 2.9999999999795866 1.9999999999897928 -3.0000000000102069 2.9999999999642757 1.9999999999897928 -2.9999999999795866 -3.0620471815467012e-11 1.9999999999897928 -2.9999999999489662 -3.0000000000255174 1.9999999999897928 4.5930707723200524e-11 -2.9999999999795866 1.9999999999897928 3.0000000000408278 -2.9999999999336557 1.9999999999897928 2.9999999999795866 6.1240943630934024e-11 1.9999999999897928 3 0 -2.0413647877116914e-11 3 3.0000000000153104 -2.0413647877116914e-11 -1.5310235907837685e-11 3 -2.0413647877116914e-11 -3.00000000003062 2.9999999999846891 -2.0413647877116914e-11 -3 -3.0620471815675371e-11 -2.0413647877116914e-11 -2.99999999996938 -3.0000000000459304 -2.0413647877116914e-11 4.5930707723513056e-11 -3 -2.0413647877116914e-11 3.0000000000612408 -2.9999999999540696 -2.0413647877116914e-11 3 6.1240943631350742e-11 -2.0413647877116914e-11 3.0000000000204134 0 -2.0000000000306204 3.0000000000204134 3.0000000000357239 -2.0000000000306204 -1.5310235907941865e-11 3.0000000000204134 -2.0000000000306204 -3.0000000000510338 3.0000000000051026 -2.0000000000306204 -3.0000000000204134 -3.062047181588373e-11 -2.0000000000306204 -2.9999999999897931 -3.0000000000663443 -2.0000000000306204 4.5930707723825588e-11 -3.0000000000204134 -2.0000000000306204 3.0000000000816547 -2.9999999999744826 -2.0000000000306204 3.0000000000204134 6.124094363176746e-11 -2.0000000000306204 5.0000000000306208 0 -2 5.0000000000306208 5.0000000000561382 -2 -2.5517059846552412e-11 5.0000000000306208 -2 -5.0000000000816547 5.0000000000051026 -2 -5.0000000000306208 -5.1034119693104823e-11 -2 -4.999999999979587 -5.000000000107172 -2 7.6551179539657245e-11 -5.0000000000306208 -2 5.0000000001326894 -4.9999999999540696 -2 5.0000000000306208 1.0206823938620965e-10 -2 7.0000000000408278 0 -1.9999999999693796 7.0000000000408278 7.0000000000765521 -1.9999999999693796 -3.5723883785162958e-11 7.0000000000408278 -1.9999999999693796 -7.0000000001122746 7.0000000000051026 -1.9999999999693796 -7.0000000000408278 -7.1447767570325917e-11 -1.9999999999693796 -6.9999999999693809 -7.0000000001479989 -1.9999999999693796 1.0717165135548887e-10 -7.0000000000408278 -1.9999999999693796 7.0000000001837233 -6.9999999999336566 -1.9999999999693796 7.0000000000408278 1.4289553514065183e-10 -1.9999999999693796 7 0 4.0827295754233828e-11 7 7.0000000000357243 4.0827295754233828e-11 -3.5723883784954599e-11 7 4.0827295754233828e-11 -7.0000000000714468 6.9999999999642748 4.0827295754233828e-11 -7 -7.1447767569909199e-11 4.0827295754233828e-11 -6.9999999999285532 -7.0000000001071712 4.0827295754233828e-11 1.071716513548638e-10 -7 4.0827295754233828e-11 7.0000000001428955 -6.9999999998928288 4.0827295754233828e-11 7 1.428955351398184e-10 4.0827295754233828e-11</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">9</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0 0 1 1 2 2 3 3 4 4 4</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 0.49999999999744837 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1 0.70710678118474324 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.OBJMeshReader.nurbs.obj",
    "content": "v 0 0 0\nv 0.804938 1.05208 0.215683\nv 0.996111 2.15625 0.266907\nv 0.347122 2.75608 0.093011\nv 0 0 0\nv 0.721688 1.05208 0.416667\nv 0.893089 2.15625 0.515625\nv 0.311221 2.75608 0.179683\nv 0 0 0\nv 0.589256 1.05208 0.589256\nv 0.729204 2.15625 0.729204\nv 0.254111 2.75608 0.254111\nv 0 0 0\nv 0.416667 1.05208 0.721688\nv 0.515625 2.15625 0.893089\nv 0.179683 2.75608 0.311221\nv 0 0 0\nv 0.215683 1.05208 0.804938\nv 0.266907 2.15625 0.996111\nv 0.093011 2.75608 0.347122\nv 0 0 0\nv 2.23413e-16 1.05208 0.833333\nv 2.76474e-16 2.15625 1.03125\nv 9.63449e-17 2.75608 0.359367\nv 0 0 0\nv -0.215683 1.05208 0.804938\nv -0.266907 2.15625 0.996111\nv -0.093011 2.75608 0.347122\nv 0 0 0\nv -0.416667 1.05208 0.721688\nv -0.515625 2.15625 0.893089\nv -0.179683 2.75608 0.311221\nv 0 0 0\nv -0.589256 1.05208 0.589256\nv -0.729204 2.15625 0.729204\nv -0.254111 2.75608 0.254111\nv 0 0 0\nv -0.721688 1.05208 0.416667\nv -0.893089 2.15625 0.515625\nv -0.311221 2.75608 0.179683\nv 0 0 0\nv -0.804938 1.05208 0.215683\nv -0.996111 2.15625 0.266907\nv -0.347122 2.75608 0.093011\nv 0 0 0\nv -0.833333 1.05208 4.02149e-16\nv -1.03125 2.15625 4.97659e-16\nv -0.359367 2.75608 1.73423e-16\nv 0 0 0\nv -0.804938 1.05208 -0.215683\nv -0.996111 2.15625 -0.266907\nv -0.347122 2.75608 -0.093011\nv 0 0 0\nv -0.721688 1.05208 -0.416667\nv -0.893089 2.15625 -0.515625\nv -0.311221 2.75608 -0.179683\nv 0 0 0\nv -0.589256 1.05208 -0.589256\nv -0.729204 2.15625 -0.729204\nv -0.254111 2.75608 -0.254111\nv 0 0 0\nv -0.416667 1.05208 -0.721688\nv -0.515625 2.15625 -0.893089\nv -0.179683 2.75608 -0.311221\nv 0 0 0\nv -0.215683 1.05208 -0.804938\nv -0.266907 2.15625 -0.996111\nv -0.093011 2.75608 -0.347122\nv 0 0 0\nv -5.56941e-16 1.05208 -0.833333\nv -6.89215e-16 2.15625 -1.03125\nv -2.40175e-16 2.75608 -0.359367\nv 0 0 0\nv 0.215683 1.05208 -0.804938\nv 0.266907 2.15625 -0.996111\nv 0.093011 2.75608 -0.347122\nv 0 0 0\nv 0.416667 1.05208 -0.721688\nv 0.515625 2.15625 -0.893089\nv 0.179683 2.75608 -0.311221\nv 0 0 0\nv 0.589256 1.05208 -0.589256\nv 0.729204 2.15625 -0.729204\nv 0.254111 2.75608 -0.254111\nv 0 0 0\nv 0.721688 1.05208 -0.416667\nv 0.893089 2.15625 -0.515625\nv 0.311221 2.75608 -0.179683\nv 0 0 0\nv 0.804938 1.05208 -0.215683\nv 0.996111 2.15625 -0.266907\nv 0.347122 2.75608 -0.093011\nv 0 0 0\nv 0.833333 1.05208 -6.7024e-16\nv 1.03125 2.15625 -8.29422e-16\nv 0.359367 2.75608 -2.89035e-16\nv 0 0 0\nv 0.804938 1.05208 0.215683\nv 0.996111 2.15625 0.266907\nv 0.347122 2.75608 0.093011\nv 0 0 0\nv 0.721688 1.05208 0.416667\nv 0.893089 2.15625 0.515625\nv 0.311221 2.75608 0.179683\ncstype bspline\ndeg 3 2\nsurf 0 1 0.0714286 0.928571 -104 -103 -102 -101 -100 -99 -98 -97 -96 -95 -94 -93 -92 -91 -90 -89 -88 -87 -86 -85 -84 -83 -82 -81 -80 -79 -78 -77 -76 -75 -74 -73 -72 -71 -70 -69 -68 -67 -66 -65 -64 -63 -62 -61 -60 -59 -58 -57 -56 -55 -54 -53 -52 -51 -50 -49 -48 -47 -46 -45 -44 -43 -42 -41 -40 -39 -38 -37 -36 -35 -34 -33 -32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1\nparm u 0 0 0 0 1 1 1 1\nparm v 0 0.0357143 0.0714286 0.107143 0.142857 0.178571 0.214286 0.25 0.285714 0.321429 0.357143 0.392857 0.428571 0.464286 0.5 0.535714 0.571429 0.607143 0.642857 0.678571 0.714286 0.75 0.785714 0.821429 0.857143 0.892857 0.928571 0.964286 1\nend\n"
  },
  {
    "path": "tests/meshes/mesh.source.OBJMeshReader.nurbs.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 0 0.80493800000000004 1.0520799999999999 0.21568300000000001 0.99611099999999997 2.15625 0.26690700000000001 0.34712199999999999 2.7560799999999999 0.093010999999999996 0 0 0 0.721688 1.0520799999999999 0.41666700000000001 0.89308900000000002 2.15625 0.515625 0.31122100000000003 2.7560799999999999 0.17968300000000001 0 0 0 0.589256 1.0520799999999999 0.589256 0.72920399999999996 2.15625 0.72920399999999996 0.25411099999999998 2.7560799999999999 0.25411099999999998 0 0 0 0.41666700000000001 1.0520799999999999 0.721688 0.515625 2.15625 0.89308900000000002 0.17968300000000001 2.7560799999999999 0.31122100000000003 0 0 0 0.21568300000000001 1.0520799999999999 0.80493800000000004 0.26690700000000001 2.15625 0.99611099999999997 0.093010999999999996 2.7560799999999999 0.34712199999999999 0 0 0 2.2341300000000002e-16 1.0520799999999999 0.83333299999999999 2.76474e-16 2.15625 1.03125 9.6344899999999996e-17 2.7560799999999999 0.35936699999999999 0 0 0 -0.21568300000000001 1.0520799999999999 0.80493800000000004 -0.26690700000000001 2.15625 0.99611099999999997 -0.093010999999999996 2.7560799999999999 0.34712199999999999 0 0 0 -0.41666700000000001 1.0520799999999999 0.721688 -0.515625 2.15625 0.89308900000000002 -0.17968300000000001 2.7560799999999999 0.31122100000000003 0 0 0 -0.589256 1.0520799999999999 0.589256 -0.72920399999999996 2.15625 0.72920399999999996 -0.25411099999999998 2.7560799999999999 0.25411099999999998 0 0 0 -0.721688 1.0520799999999999 0.41666700000000001 -0.89308900000000002 2.15625 0.515625 -0.31122100000000003 2.7560799999999999 0.17968300000000001 0 0 0 -0.80493800000000004 1.0520799999999999 0.21568300000000001 -0.99611099999999997 2.15625 0.26690700000000001 -0.34712199999999999 2.7560799999999999 0.093010999999999996 0 0 0 -0.83333299999999999 1.0520799999999999 4.0214900000000002e-16 -1.03125 2.15625 4.9765899999999997e-16 -0.35936699999999999 2.7560799999999999 1.7342299999999999e-16 0 0 0 -0.80493800000000004 1.0520799999999999 -0.21568300000000001 -0.99611099999999997 2.15625 -0.26690700000000001 -0.34712199999999999 2.7560799999999999 -0.093010999999999996 0 0 0 -0.721688 1.0520799999999999 -0.41666700000000001 -0.89308900000000002 2.15625 -0.515625 -0.31122100000000003 2.7560799999999999 -0.17968300000000001 0 0 0 -0.589256 1.0520799999999999 -0.589256 -0.72920399999999996 2.15625 -0.72920399999999996 -0.25411099999999998 2.7560799999999999 -0.25411099999999998 0 0 0 -0.41666700000000001 1.0520799999999999 -0.721688 -0.515625 2.15625 -0.89308900000000002 -0.17968300000000001 2.7560799999999999 -0.31122100000000003 0 0 0 -0.21568300000000001 1.0520799999999999 -0.80493800000000004 -0.26690700000000001 2.15625 -0.99611099999999997 -0.093010999999999996 2.7560799999999999 -0.34712199999999999 0 0 0 -5.5694099999999995e-16 1.0520799999999999 -0.83333299999999999 -6.89215e-16 2.15625 -1.03125 -2.40175e-16 2.7560799999999999 -0.35936699999999999 0 0 0 0.21568300000000001 1.0520799999999999 -0.80493800000000004 0.26690700000000001 2.15625 -0.99611099999999997 0.093010999999999996 2.7560799999999999 -0.34712199999999999 0 0 0 0.41666700000000001 1.0520799999999999 -0.721688 0.515625 2.15625 -0.89308900000000002 0.17968300000000001 2.7560799999999999 -0.31122100000000003 0 0 0 0.589256 1.0520799999999999 -0.589256 0.72920399999999996 2.15625 -0.72920399999999996 0.25411099999999998 2.7560799999999999 -0.25411099999999998 0 0 0 0.721688 1.0520799999999999 -0.41666700000000001 0.89308900000000002 2.15625 -0.515625 0.31122100000000003 2.7560799999999999 -0.17968300000000001 0 0 0 0.80493800000000004 1.0520799999999999 -0.21568300000000001 0.99611099999999997 2.15625 -0.26690700000000001 0.34712199999999999 2.7560799999999999 -0.093010999999999996 0 0 0 0.83333299999999999 1.0520799999999999 -6.7024000000000002e-16 1.03125 2.15625 -8.2942200000000001e-16 0.35936699999999999 2.7560799999999999 -2.8903500000000002e-16 0 0 0 0.80493800000000004 1.0520799999999999 0.21568300000000001 0.99611099999999997 2.15625 0.26690700000000001 0.34712199999999999 2.7560799999999999 0.093010999999999996 0 0 0 0.721688 1.0520799999999999 0.41666700000000001 0.89308900000000002 2.15625 0.515625 0.31122100000000003 2.7560799999999999 0.17968300000000001</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_patch\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"patch\">\n\t\t\t\t\t\t<array name=\"patch_first_points\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_first_trim_loops\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"patch_selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"patch_trim_loop_counts\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_u_orders\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_u_point_counts\" type=\"k3d::uint_t\">4</array>\n\t\t\t\t\t\t<array name=\"patch_v_first_knots\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t<array name=\"patch_v_orders\" type=\"k3d::uint_t\">3</array>\n\t\t\t\t\t\t<array name=\"patch_v_point_counts\" type=\"k3d::uint_t\">26</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_loop\">\n\t\t\t\t\t\t<array name=\"trim_loop_curve_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_first_curves\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"trim_loop_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_point\">\n\t\t\t\t\t\t<array name=\"point_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"points\" type=\"k3d::point2\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_uniform\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"trim_vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\"/>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\"/>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"u_knot\">\n\t\t\t\t\t\t<array name=\"patch_u_knots\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"v_knot\">\n\t\t\t\t\t\t<array name=\"patch_v_knots\" type=\"k3d::double_t\">0 0.035714299999999997 0.071428599999999995 0.107143 0.14285700000000001 0.17857100000000001 0.214286 0.25 0.28571400000000002 0.32142900000000002 0.35714299999999999 0.39285700000000001 0.42857099999999998 0.46428599999999998 0.5 0.53571400000000002 0.57142899999999996 0.60714299999999999 0.64285700000000001 0.67857100000000004 0.71428599999999998 0.75 0.78571400000000002 0.82142899999999996 0.85714299999999999 0.89285700000000001 0.92857100000000004 0.96428599999999998 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"patch_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"patch_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"patch\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.OBJMeshReader.polyhedron.obj",
    "content": "# Alias OBJ Model File\r\n# Exported from SketchUp, (c) 2000-2006 Google, Inc.\r\n# File units = meters\r\n\r\nmtllib test.mtl\r\n\r\ng Mesh1 Model\r\n\r\nusemtl FrontColor\r\nv 2.3547 0 -2.97803\r\nvt -92.7046 117.245\r\nvn 0 -1 0\r\nv 0.764696 0 -1.52803\r\nvt -30.1061 60.1587\r\nv 0.764696 0 -2.97803\r\nvt -30.1061 117.245\r\nf 1/1/1 2/2/1 3/3/1\r\n\r\nv 2.3547 0 -1.52803\r\nvt -92.7046 60.1587\r\nf 2/2/1 1/1/1 4/4/1\r\n\r\nusemtl BackColor\r\nvn 0 1 0\r\nf 3/3/2 2/2/2 1/1/2\r\n\r\nusemtl Wood_Logs\r\nvt -1.67108 0\r\nvn -1 0 0\r\nv 0.764696 3.83 -2.97803\r\nvt -3.25681 4.18854\r\nvt -3.25681 0\r\nf 2/5/3 5/6/3 3/7/3\r\n\r\nv 0.764696 3.83 -1.52803\r\nvt -1.67108 4.18854\r\nf 5/6/3 2/5/3 6/8/3\r\n\r\nusemtl BackColor\r\nvt -60.1587 150.787\r\nvn 1 0 0\r\nvt -60.1587 0\r\nvt -117.245 150.787\r\nf 6/9/4 2/10/4 5/11/4\r\n\r\nusemtl Wood_Logs\r\nvt 0.836282 0\r\nvn 0 0 1\r\nv 2.3547 3.83 -1.52803\r\nvt 2.57513 4.18854\r\nvt 0.836282 4.18854\r\nf 2/12/5 7/13/5 6/14/5\r\n\r\nvt 2.57513 0\r\nf 7/13/5 2/12/5 4/15/5\r\n\r\nusemtl BackColor\r\nvt 92.7046 0\r\nvn 0 0 -1\r\nvt 30.1061 0\r\nvt 92.7046 150.787\r\nf 4/16/6 2/17/6 7/18/6\r\n\r\nf 4/4/2 1/1/2 2/2/2\r\n\r\nusemtl Wood_Logs\r\nvt 3.25681 0\r\nvt 1.67108 4.18854\r\nvt 1.67108 0\r\nf 1/19/4 7/20/4 4/21/4\r\n\r\nv 2.3547 3.83 -2.97803\r\nvt 3.25681 4.18854\r\nf 7/20/4 1/19/4 8/22/4\r\n\r\nusemtl BackColor\r\nvt 60.1587 0\r\nvt 60.1587 150.787\r\nvt 117.245 0\r\nf 4/23/3 7/24/3 1/25/3\r\n\r\nvt 117.245 150.787\r\nf 8/26/3 1/25/3 7/24/3\r\n\r\nusemtl Wood_Logs\r\nvt -2.57513 0\r\nvt -0.836282 4.18854\r\nvt -2.57513 4.18854\r\nf 1/27/6 5/28/6 8/29/6\r\n\r\nvt -0.836282 0\r\nf 5/28/6 1/27/6 3/30/6\r\n\r\nusemtl BackColor\r\nvt -30.1061 0\r\nvt -92.7046 0\r\nvt -30.1061 150.787\r\nf 3/31/5 1/32/5 5/33/5\r\n\r\nvt -92.7046 150.787\r\nf 8/34/5 5/33/5 1/32/5\r\n\r\nusemtl Roofing_Shingles_Multi\r\nvt 0.278761 3.25681\r\nvt 0.858376 1.67108\r\nvt 0.858376 3.25681\r\nf 5/35/2 7/36/2 8/37/2\r\n\r\nvt 0.278761 1.67108\r\nf 7/36/2 5/35/2 6/38/2\r\n\r\nusemtl BackColor\r\nvt 30.1061 60.1587\r\nvt 30.1061 117.245\r\nvt 92.7046 60.1587\r\nf 6/39/1 5/40/1 7/41/1\r\n\r\nvt 92.7046 117.245\r\nf 8/42/1 7/41/1 5/40/1\r\n\r\nvt 30.1061 150.787\r\nf 6/43/6 7/18/6 2/17/6\r\n\r\nvt -117.245 0\r\nf 3/44/4 5/11/4 2/10/4\r\n\r\ng Mesh2 Model\r\n\r\nl 3 2\r\n\r\nl 1 3\r\n\r\nl 4 1\r\n\r\nl 2 4\r\n\r\nl 2 6\r\n\r\nl 6 7\r\n\r\nl 5 6\r\n\r\nl 8 5\r\n\r\nl 7 8\r\n\r\nl 4 7\r\n\r\nl 1 8\r\n\r\nl 3 5\r\n\r\n"
  },
  {
    "path": "tests/meshes/mesh.source.OBJMeshReader.polyhedron.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>2.3546999999999998 0 -2.97803 0.76469600000000004 0 -1.52803 0.76469600000000004 0 -2.97803 2.3546999999999998 0 -1.52803 0.76469600000000004 3.8300000000000001 -2.97803 0.76469600000000004 3.8300000000000001 -1.52803 2.3546999999999998 3.8300000000000001 -1.52803 2.3546999999999998 3.8300000000000001 -2.97803</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 39 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63 67 68 66 70 71 69</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 1 0 3 2 1 0 1 4 2 4 1 5 5 1 4 1 6 5 6 1 3 3 1 6 3 0 1 0 6 3 6 0 7 3 6 0 7 0 6 0 4 7 4 0 2 2 0 4 7 4 0 4 6 7 6 4 5 5 4 6 7 6 4 5 6 1 2 4 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PLYMeshReader.ply",
    "content": "ply\nformat ascii 1.0\ncomment zipper output\nelement vertex 453\nproperty float x\nproperty float y\nproperty float z\nproperty float confidence\nproperty float intensity\nelement face 948\nproperty list uchar int vertex_indices\nend_header\n-0.0312216 0.126304 0.00514924 0.850855 0.5 \n-0.0446774 0.131204 0.00570479 0.900159 0.5 \n-0.0683011 0.144828 0.0413688 0.398443 0.5 \n-0.00600095 0.130398 0.0178986 0.85268 0.5 \n-0.0173568 0.127613 0.00526885 0.675938 0.5 \n0.0330513 0.107034 0.0319543 0.652757 0.5 \n0.0400873 0.10521 0.0173419 0.708171 0.5 \n-0.0301802 0.106322 0.0399745 0.454541 0.437538 \n0.0304193 0.118572 0.0188068 0.533079 0.5 \n-0.0640822 0.159391 -0.0169096 0.404517 0.5 \n0.0447046 0.0927877 0.00507585 0.579563 0.425995 \n-0.0316754 0.170395 -0.00635023 0.365607 0.5 \n-0.0848523 0.134078 0.0470177 0.499575 0.5 \n-0.0688547 0.122052 0.0517569 0.564827 0.5 \n0.00595475 0.131024 0.0178252 0.748371 0.5 \n0.0404629 0.105142 0.00640978 0.680399 0.5 \n0.0387342 0.102161 -0.00463112 0.600054 0.5 \n-0.0914513 0.134136 0.0171026 0.824561 0.5 \n-0.0818721 0.107166 0.031016 0.690889 0.5 \n-0.067218 0.156155 0.0178863 0.807492 0.5 \n-0.0795687 0.152875 0.0299311 0.248168 0.41865 \n0.00596007 0.122504 0.0346272 0.555044 0.354559 \n-0.0516317 0.145001 0.0184804 0.691477 0.5 \n-0.0779781 0.13255 0.0513494 0.566256 0.5 \n-0.00590708 0.127934 0.0274623 0.271491 0.462815 \n-0.0479133 0.129301 0.0269646 0.539149 0.5 \n-0.082427 0.0928134 -0.00556046 0.710999 0.5 \n0.01744 0.127694 0.0185348 0.530957 0.5 \n-0.0906868 0.120305 0.0066804 0.635593 0.5 \n-0.0294038 0.17903 -0.00787959 0.269231 0.447035 \n-0.0797891 0.14376 0.0426994 0.414139 0.5 \n-0.018288 0.108329 0.0415098 0.482541 0.5 \n-0.0202326 0.181846 -0.0183274 0.341071 0.440034 \n-0.0377039 0.167987 -0.0130391 0.396317 0.473039 \n0.00582164 0.12806 0.0279016 0.350014 0.41288 \n-0.0435389 0.130014 0.0175333 0.599596 0.5 \n0.0188699 0.119862 0.032409 0.625269 0.5 \n-0.0440101 0.167035 0.00231898 0.413994 0.469929 \n-0.089811 0.132401 0.00705743 0.625486 0.5 \n-0.057352 0.144989 0.0315196 0.696873 0.5 \n0.0442622 0.0934526 0.0176417 0.665192 0.5 \n0.0412343 0.0921731 0.0285603 0.671611 0.5 \n-0.0563953 0.154565 0.016878 0.394763 0.437313 \n-0.0206135 0.159773 -0.00717522 0.136389 0.380194 \n-0.0729893 0.0656116 0.0181693 0.413051 0.5 \n-0.0673967 0.155256 0.00581389 0.855717 0.5 \n-0.0904864 0.118611 0.0412148 0.673877 0.5 \n0.0273142 0.117965 0.0286191 0.635485 0.5 \n0.041907 0.0916386 -0.00556945 0.585857 0.459742 \n-0.0702109 0.165303 -0.0194661 0.548789 0.5 \n-0.0061847 0.122729 0.034787 0.602316 0.374044 \n0.0300138 0.0932786 0.0421476 0.649753 0.5 \n-0.0175129 0.162126 -0.0145489 0.338176 0.5 \n-0.0763977 0.171291 -0.0411021 0.256591 0.4298 \n-0.0854227 0.105386 0.00339486 0.523819 0.297125 \n0.0370431 0.110443 0.0207229 0.52623 0.448558 \n-0.00659732 0.0427285 0.0469391 0.280725 0.5 \n0.00639794 0.0437006 0.046826 0.331809 0.5 \n-0.0559247 0.157606 0.00656455 0.561042 0.5 \n-0.0911449 0.118816 0.0298442 0.848517 0.5 \n-0.0595109 0.128352 0.0399626 0.658867 0.444043 \n-0.0176335 0.127605 0.0179366 0.547632 0.5 \n-0.066633 0.153831 0.0308703 0.855321 0.5 \n-0.0436418 0.169438 -0.00550226 0.274377 0.177706 \n-0.0572759 0.043243 0.042862 0.417977 0.459314 \n-0.0763773 0.157221 -0.0168889 0.267801 0.372187 \n-0.0434461 0.15605 0.00615795 0.447592 0.5 \n-0.0427118 0.0421645 0.0427004 0.509262 0.5 \n-0.0254201 0.0886622 0.0503827 0.608282 0.5 \n-0.014179 0.12627 0.0266417 0.420759 0.5 \n-0.0882582 0.0898687 0.00696625 0.753697 0.5 \n-0.0688695 0.157773 -0.00687593 0.595216 0.5 \n-0.0679676 0.142877 -0.00757643 0.446131 0.5 \n0.0188538 0.106293 0.0416902 0.669811 0.5 \n-0.036487 0.171225 0.000545037 0.438578 0.5 \n-0.0664352 0.117198 -0.00987161 0.569796 0.5 \n-0.0682606 0.170398 -0.0436995 0.381568 0.451091 \n-0.090925 0.14605 0.0190382 0.648478 0.5 \n0.00678622 0.115841 0.0388077 0.549283 0.408623 \n0.0310139 0.0930696 -0.017798 0.732658 0.5 \n0.0056976 0.10589 0.0435511 0.592572 0.5 \n-0.0706519 0.13063 0.0502497 0.563116 0.5 \n0.0059746 0.130858 0.00579479 0.795238 0.5 \n0.0184217 0.0423182 0.042477 0.259499 0.426724 \n0.0147876 0.0909747 0.0509658 0.654705 0.5 \n-0.00598232 0.115409 0.0402027 0.615633 0.5 \n-0.0811312 0.117972 -0.00359453 0.505277 0.5 \n-0.0787032 0.144274 -0.00389052 0.466714 0.5 \n0.00581988 0.106226 -0.0208968 0.792948 0.5 \n-0.0192761 0.119853 0.0328061 0.445477 0.415699 \n-0.00593116 0.130215 0.005954 0.738924 0.5 \n-0.0893322 0.142745 0.0290326 0.80362 0.5 \n-0.00762538 0.123273 -0.00981555 0.767738 0.284429 \n-0.0692263 0.178922 -0.0542743 0.245129 0.411885 \n-0.0298757 0.124252 0.0209674 0.32811 0.5 \n-0.0848266 0.148987 0.0327697 0.331963 0.314683 \n-0.0888516 0.0909723 0.0179034 0.603378 0.5 \n-0.0305879 0.122384 -0.00635771 0.63839 0.5 \n-0.0307198 0.117989 0.0306166 0.543293 0.5 \n-0.0780612 0.120653 0.0513999 0.490413 0.5 \n0.0332714 0.108498 -0.00743195 0.534403 0.5 \n-0.0677112 0.0928918 -0.0168814 0.511499 0.5 \n-0.075666 0.0911817 -0.0136967 0.429902 0.5 \n-0.082422 0.0951121 0.0310878 0.678588 0.5 \n-0.0856984 0.136903 0.00192122 0.517441 0.5 \n-0.0292804 0.0417747 0.051397 0.553401 0.5 \n-0.017732 0.0423864 0.051684 0.709553 0.5 \n-0.0656987 0.171007 -0.056644 0.549906 0.5 \n-0.0298523 0.170905 -0.0165609 0.436075 0.5 \n-0.0562502 0.135013 0.0330455 0.727547 0.5 \n-0.0666127 0.133021 0.0447044 0.724494 0.5 \n-0.0425379 0.155441 -0.00749353 0.424682 0.5 \n-0.0545308 0.0714603 0.0397042 0.682177 0.456916 \n-0.0413159 0.0906923 -0.0225881 0.72469 0.5 \n-0.0172876 0.0921774 0.0536212 0.546444 0.5 \n-0.00598119 0.0940308 0.0542643 0.455087 0.5 \n0.0423724 0.0672563 0.0295801 0.33948 0.5 \n0.0285741 0.116909 -0.00391772 0.66246 0.5 \n-0.0331811 0.0450744 0.0451146 0.432059 0.466683 \n-0.0539402 0.118566 0.0353731 0.515399 0.5 \n0.0422724 0.0795546 -0.00579461 0.568535 0.5 \n0.0297273 0.0425502 0.0304975 0.650152 0.5 \n-0.0315639 0.0959331 -0.0236801 0.474586 0.431409 \n0.0381804 0.105121 0.0266947 0.534482 0.490368 \n-0.0284988 0.090492 -0.0290854 0.294426 0.332222 \n-0.0173189 0.0437942 0.0432695 0.576068 0.5 \n0.00376754 0.0477551 0.0502037 0.495901 0.44823 \n0.0432673 0.0458291 0.0278251 0.807573 0.5 \n-0.0233322 0.181239 -0.0112893 0.246322 0.458572 \n-0.0056258 0.0565038 0.0538818 0.61481 0.5 \n0.00529431 0.0556798 0.0532881 0.560812 0.423049 \n-0.0883219 0.105757 0.0172983 0.604102 0.5 \n-0.0566374 0.0470184 0.0305809 0 0 \n-0.0296243 0.0543188 0.0398951 0.676102 0.5 \n-0.00597407 0.105897 0.0440669 0.338462 0.5 \n-0.0214122 0.0546976 0.044641 0.195646 0.404388 \n-0.0161488 0.0574363 0.050904 0.451613 0.5 \n-0.0568305 0.146392 -0.0026426 0.48145 0.5 \n-0.0931466 0.119067 0.0179948 0.570519 0.5 \n-0.061862 0.158417 -0.0293026 0.690546 0.5 \n-0.0855858 0.10684 0.021729 0.519516 0.5 \n0.0336642 0.0540543 0.0350841 0.609925 0.5 \n0.042771 0.0560351 0.031559 0.669803 0.5 \n-0.0434589 0.117191 0.0317044 0.657986 0.5 \n-0.0680962 0.156721 -0.0426174 0.523327 0.5 \n0.0272384 0.103156 0.0397058 0.689793 0.5 \n-0.0293932 0.178536 -0.0145563 0.314049 0.5 \n-0.0762697 0.0912245 0.0383419 0.647987 0.457049 \n-0.0191285 0.0985952 0.0456676 0.271215 0.427554 \n-0.053091 0.0567402 0.0293963 0.192432 0.5 \n-0.0431978 0.0555777 0.0390838 0.311543 0.5 \n-0.0833055 0.115643 0.046828 0.438131 0.5 \n0.0144345 0.127081 0.026297 0.479299 0.429147 \n-0.0388913 0.123761 0.0249778 0.514489 0.5 \n-0.0594359 0.119905 0.0399756 0.634635 0.5 \n-0.0702332 0.154262 -0.0312401 0.685413 0.5 \n-0.0574473 0.152576 0.0284508 0.93076 0.5 \n-0.0480038 0.056366 0.0362663 0.58186 0.5 \n-0.0107262 0.179662 -0.0277472 0.400699 0.458536 \n-0.0882293 0.106066 0.00846756 0.477822 0.5 \n-0.078994 0.153984 0.00651862 0.57436 0.5 \n-0.0295675 0.126072 0.0146338 0.393422 0.5 \n-0.0817356 0.15439 0.0177332 0.505065 0.5 \n-0.0795469 0.104194 -0.00620274 0.528684 0.5 \n-0.0248608 0.122913 0.0245429 0.379391 0.5 \n-0.0664416 0.159957 -0.0533713 0.38665 0.5 \n-0.0784878 0.0705283 0.0174461 0.703257 0.5 \n-0.00967101 0.173225 -0.0264945 0.379771 0.5 \n-0.0566284 0.0547031 0.00744563 0.270787 0.5 \n-0.0184015 0.122219 -0.00775134 0.782181 0.5 \n-0.0695952 0.146412 -0.018032 0.130446 0.5 \n-0.0412517 0.123196 -0.00958087 0.590842 0.5 \n-0.0684972 0.148194 -0.028726 0.690046 0.5 \n-0.0540036 0.055543 0.0177674 0.079935 0 \n-0.0169203 0.0682168 0.0531499 0.608033 0.445048 \n-0.00607221 0.0677102 0.0564501 0.650491 0.470895 \n0.00708728 0.0673218 0.0553369 0.748671 0.5 \n-0.0143174 0.116971 0.037836 0.441459 0.5 \n0.0538923 0.0557547 0.0266244 0.405493 0.41666 \n0.00517855 0.0931738 0.0535873 0.395048 0.366076 \n-0.0431038 0.0674388 0.0407737 0.587502 0.5 \n-0.0293069 0.0680733 0.041016 0.650585 0.5 \n-0.0379555 0.161954 -0.0128021 0.499753 0.5 \n-0.0561165 0.0654329 0.0341979 0.277414 0.5 \n-0.0761707 0.155559 -0.0059272 0.708579 0.5 \n-0.0552181 0.122506 -0.00946488 0.538005 0.5 \n0.0177004 0.105983 -0.0186138 0.576137 0.468722 \n0.0534583 0.0656375 0.0264336 0.501229 0.5 \n-0.0869152 0.0944156 0.00293118 0.494536 0.346642 \n-0.0764257 0.161707 -0.0297517 0.476378 0.5 \n-0.0440959 0.127453 -0.00327875 0.853498 0.5 \n-0.0312919 0.0798298 0.0434944 0.693464 0.5 \n-0.0549448 0.106348 -0.0185625 0.484023 0.5 \n-0.0723735 0.110057 -0.00943257 0.44421 0.5 \n-0.0553659 0.0919829 -0.0211783 0.619673 0.5 \n-0.0488091 0.0660127 0.0373959 0.829801 0.5 \n-0.0473086 0.145156 0.00688469 0.636632 0.45621 \n-0.0803913 0.129634 -0.00469755 0.386393 0.5 \n-0.041802 0.105934 -0.0198692 0.79815 0.5 \n-0.00632139 0.0931652 -0.0328935 0.564234 0.5 \n-0.00597054 0.106138 -0.0222282 0.740261 0.5 \n-0.0294827 0.158293 -0.00619266 0.209483 0.5 \n-0.0177953 0.106289 -0.0217771 0.723165 0.5 \n-0.0885261 0.137839 0.0393964 0.651389 0.5 \n-0.0674935 0.128392 -0.00863471 0.737784 0.5 \n0.0463693 0.0715128 0.0216754 0.461473 0.448797 \n-0.0409565 0.117168 -0.0145809 0.602235 0.5 \n-0.0106656 0.167541 -0.0199013 0.359593 0.5 \n-0.0532547 0.157456 -0.00281896 0.292939 0.5 \n0.00530988 0.0933129 -0.0301852 0.75972 0.5 \n-0.0773436 0.0727226 0.0266546 0.757943 0.5 \n-0.0625087 0.149934 -0.0150319 0.415531 0.480025 \n-0.0688014 0.0685726 0.0306649 0.49936 0.45677 \n-0.0545252 0.0808478 -0.0201707 0.75515 0.5 \n-0.0436768 0.078916 0.0428855 0.696934 0.5 \n-0.0185748 0.0789703 0.0557353 0.607912 0.5 \n-0.00599993 0.0794548 0.0578008 0.791265 0.5 \n0.00706485 0.0811917 0.0558187 0.523043 0.5 \n-0.0850269 0.146034 0.00585954 0.583528 0.5 \n0.0370111 0.110397 0.00265294 0.516602 0.481774 \n-0.0683084 0.0803316 0.0407109 0.610448 0.476331 \n-0.055894 0.0792594 0.0435335 0.634349 0.5 \n0.0381456 0.0881056 -0.0138675 0.676152 0.5 \n-0.0642837 0.0396418 0.039624 0.532543 0.5 \n-0.0698696 0.168536 -0.0313319 0.458525 0.324439 \n-0.061796 0.155741 -0.0207923 0.443336 0.5 \n-0.0622848 0.16236 -0.0396288 0.427869 0.464762 \n-0.0686864 0.0923704 0.0421978 0.59211 0.5 \n-0.049353 0.139298 0.0147955 0.761861 0.5 \n-0.0784177 0.110126 0.0417886 0.498936 0.5 \n0.0179416 0.0792747 0.0518862 0.491924 0.475524 \n0.00532732 0.123661 -0.00997105 0.555015 0.5 \n-0.0556774 0.0935206 0.044207 0.778337 0.5 \n-0.0431924 0.0921154 0.0432689 0.605881 0.5 \n-0.0298626 0.0940124 0.0444805 0.668172 0.5 \n0.0205955 0.087113 0.0492325 0.678548 0.5 \n0.01721 0.127663 0.00512593 0.595962 0.5 \n-0.0290125 0.106719 -0.0207479 0.809584 0.5 \n0.0185443 0.0948112 0.0477587 0.669841 0.5 \n-0.00588676 0.116622 -0.0160049 0.826286 0.5 \n-0.0528191 0.162649 0.00296711 0.343566 0.5 \n0.0358078 0.0958594 -0.0120328 0.738943 0.5 \n-0.0912064 0.131415 0.0295307 0.816274 0.5 \n-0.067874 0.106952 0.0403725 0.481571 0.5 \n-0.0441636 0.104918 0.0401706 0.648927 0.395789 \n0.00749586 0.09835 0.0488255 0.46146 0.5 \n-0.0554961 0.103898 0.0411405 0.529374 0.5 \n-0.0669044 0.115717 0.0473479 0.429195 0.5 \n-0.0501524 0.140326 0.00258818 0.569746 0.5 \n-0.0554508 0.13242 -0.00485445 0.673026 0.5 \n-0.014752 0.181897 -0.0262781 0.40888 0.5 \n-0.029558 0.161783 -0.0143368 0.852313 0.5 \n-0.0561854 0.111277 0.0373713 0.588374 0.5 \n-0.040984 0.110496 0.0370883 0.553647 0.5 \n-0.0320055 0.110468 0.0370438 0.565129 0.5 \n0.0250033 0.110611 0.0368459 0.631257 0.5 \n-0.046987 0.147434 -0.00222536 0.521986 0.5 \n-0.0183407 0.0352362 0.0507938 0.291685 0.457265 \n-0.0178406 0.170484 -0.0181143 0.809186 0.5 \n-0.0569472 0.0349416 0.0423717 0.341981 0.5 \n0.00583339 0.0351076 0.0420914 0.261253 0.345588 \n-0.0428024 0.0351574 0.0416872 0.193197 0.5 \n-0.066462 0.104777 -0.0148582 0.608847 0.5 \n0.0257452 0.0459137 0.0381185 0.444171 0.5 \n0.0379451 0.0817167 -0.0141547 0.644934 0.5 \n-0.0844262 0.0797714 0.0186332 0.67606 0.5 \n0.0532504 0.04759 0.0181903 0.342211 0.398387 \n0.0186424 0.0536035 0.046215 0.589102 0.5 \n0.00732515 0.118243 -0.0153012 0.54369 0.457314 \n-0.0314704 0.157066 0.000976216 0.445666 0.44081 \n0.0286229 0.056876 0.0407635 0.635463 0.446542 \n0.0581591 0.0550016 0.0180254 0.474964 0.5 \n0.016864 0.089935 -0.0269104 0.546403 0.5 \n0.0145778 0.0585769 0.0501691 0.387785 0.5 \n0.0367248 0.0918184 0.0366248 0.726421 0.5 \n-0.0198801 0.166404 -0.0112699 0.688671 0.5 \n0.0150294 0.0677357 0.0520671 0.554385 0.463079 \n0.0210524 0.0681161 0.0484346 0.414803 0.412252 \n0.0298776 0.0679936 0.0419172 0.611901 0.5 \n0.0368358 0.0678495 0.036641 0.593561 0.5 \n0.0574748 0.0682218 0.0171425 0.550839 0.448044 \n0.0316842 0.0785087 -0.019208 0.760295 0.5 \n-0.0760271 0.175704 -0.0506937 0.340571 0.5 \n-0.0655396 0.0607885 0.0175707 0.414933 0.425841 \n-0.0806026 0.081447 0.0306516 0.756683 0.5 \n0.0189749 0.121506 -0.00694565 0.549 0.5 \n0.030684 0.0795461 0.0431507 0.572664 0.5 \n0.0371888 0.0792484 0.0367937 0.505468 0.5 \n0.0419366 0.0795911 0.0295911 0.645662 0.5 \n0.046032 0.0793694 0.0177694 0.458504 0.467907 \n-0.0787921 0.0707773 0.00685585 0.704234 0.277826 \n-0.0293987 0.115917 -0.0147065 0.856895 0.5 \n-0.0869924 0.113518 0.00410409 0.344807 0.5 \n-0.0142186 0.174013 -0.0259807 0.439072 0.5 \n0.0174795 0.0352131 -0.00592856 0 0 \n0.0162141 0.0358475 -0.0162131 0.173751 0.5 \n0.0193248 0.0358322 0.0313206 0.156956 0.287305 \n0.0435544 0.0411101 0.00579916 0.245023 0.5 \n0.0226191 0.0406052 -0.00793544 0.173629 0.5 \n0.0191348 0.042782 -0.0192095 0.367832 0.5 \n0.0414633 0.0456301 -0.00354513 0.514406 0.5 \n0.0436925 0.0411968 0.01772 0.265572 0.5 \n0.0512872 0.0463959 0.00580531 0.199267 0.5 \n0.0285777 0.105181 -0.0142381 0.728425 0.5 \n0.0306748 0.0445124 -0.00617993 0.464947 0.5 \n-0.0184118 0.0948059 -0.0307434 0.520871 0.5 \n-0.0315484 0.0343023 -0.0284081 0.16856 0.5 \n0.0260381 0.0475902 -0.0165794 0.515417 0.5 \n0.0554197 0.0686378 0.00589653 0.629664 0.372945 \n0.0520374 0.055073 -0.0024816 0.592036 0.5 \n0.0567375 0.0542224 0.00512483 0.511629 0.5 \n0.0428049 0.0553286 -0.00604704 0.434179 0.5 \n-0.0620037 0.167422 -0.0527165 0.538383 0.466596 \n0.0341128 0.0541776 -0.00948346 0.591066 0.5 \n0.029518 0.0560564 -0.0175875 0.574224 0.5 \n-0.0177887 0.115911 -0.0157838 0.559736 0.5 \n-0.0417838 0.0357602 -0.0264107 0.0979878 0.5 \n-0.00518939 0.043046 -0.0273333 0.274297 0.5 \n-0.0664059 0.0343649 -0.00416668 0.135623 0.5 \n0.0475414 0.0712174 0.00542617 0.590477 0.5 \n0.0249138 0.0825163 -0.0245877 0.759593 0.5 \n-0.0299024 0.0426031 -0.0283179 0.537642 0.5 \n0.0218121 0.0515865 -0.0236492 0.56032 0.5 \n-0.0271537 0.0351608 0.0509267 0.96808 0.5 \n0.0161181 0.11563 -0.0145451 0.45799 0.403894 \n0.031738 0.0679983 -0.0183532 0.581486 0.5 \n0.0418226 0.0675201 -0.00551555 0.572144 0.5 \n0.0514871 0.0637279 -0.00174794 0.518067 0.5 \n-0.0893303 0.128309 0.0428023 0.633972 0.457764 \n0.0459385 0.0796307 0.00579632 0.323813 0.5 \n-0.0705433 0.149897 -0.0387319 0.143598 0.5 \n-0.0429617 0.0430242 -0.0176288 0.371561 0.5 \n-0.0719677 0.177848 -0.0474604 0.498199 0.393806 \n-0.0760529 0.177651 -0.0471457 0.200482 0.341482 \n0.0304173 0.118495 0.00573814 0.517745 0.5 \n-0.0771451 0.167706 -0.0298798 0.259817 0.452429 \n0.0202668 0.092861 -0.0237363 0.630702 0.48336 \n-0.0254815 0.0798697 0.0510546 0.764034 0.5 \n-0.0650541 0.0353259 0.0162237 0.352362 0.5 \n-0.0647676 0.0350792 0.0294481 0.161121 0.384305 \n-0.0644267 0.0414591 0.0304476 0.206373 0.5 \n-0.06432 0.0352261 0.0387914 0.349097 0.5 \n-0.0676 0.0340299 0.00590491 0.228898 0.5 \n-0.0679534 0.0418588 0.00668394 0.30841 0.5 \n-0.0573497 0.0431548 0.0200229 0 0 \n-0.0634632 0.0414321 0.0142052 0.258252 0.450399 \n-0.059413 0.0471382 0.00628538 0.460736 0.319245 \n-0.0233834 0.0656416 0.0450976 0.709715 0.5 \n-0.063538 0.071665 0.0379463 0.556494 0.5 \n-0.0193036 0.0810128 -0.0384318 0.500126 0.449734 \n-0.0427206 0.0343557 -0.0191302 0.176398 0.205782 \n-0.00690237 0.03464 -0.0202171 0.15305 0.5 \n-0.0656787 0.0408332 -0.00401793 0.169982 0.409113 \n-0.0383907 0.0419218 -0.0264039 0.3765 0.5 \n-0.0556585 0.0432866 -0.00758834 0.62257 0.5 \n-0.0416785 0.0420276 -0.00999679 0.340556 0.5 \n-0.0322294 0.0446593 -0.0167499 0.299501 0.5 \n-0.0307385 0.0563307 -0.018517 0.265727 0.5 \n-0.0429026 0.0561897 -0.0113043 0.555432 0.5 \n-0.0550285 0.0566557 -0.00531375 0.527245 0.5 \n-0.0261858 0.0568836 -0.0282694 0.366688 0.5 \n-0.0552189 0.117461 -0.0133744 0.568329 0.5 \n-0.0190658 0.0546695 -0.0318646 0.484351 0.5 \n-0.0687629 0.0686694 -0.00654941 0.168435 0.5 \n-0.0730504 0.06542 0.00552859 0.275779 0.5 \n-0.0207234 0.0672793 -0.036553 0.45692 0.5 \n-0.0290792 0.067426 -0.0290521 0.452259 0.5 \n-0.0328056 0.0664637 -0.0195215 0.908229 0.5 \n-0.0177608 0.0343319 -0.0259142 0.174612 0.215481 \n-0.0773687 0.0732571 -0.00409771 0.293636 0.296358 \n0.0151616 0.126104 -0.00266395 0.542796 0.5 \n-0.0845255 0.0800572 0.00530702 0.615888 0.5 \n-0.0793517 0.0798559 -0.00640565 0.260107 0.5 \n-0.0309728 0.0794701 -0.0312475 0.64535 0.304239 \n-0.0355144 0.081801 -0.0226887 0.930953 0.5 \n-0.068141 0.0801227 -0.0164278 0.485274 0.5 \n-0.0512932 0.034227 -0.0129013 0.159841 0.5 \n0.0161924 0.080479 -0.0292174 0.750174 0.5 \n-0.0144478 0.0879274 -0.0380297 0.689122 0.5 \n-0.0173157 0.0432674 -0.0282906 0.230538 0.5 \n-0.0193328 0.0979251 -0.024792 0.661276 0.5 \n-0.0555479 0.0336816 -0.00619013 0.1361 0.5 \n0.00702627 0.0978418 -0.0246055 0.732067 0.326346 \n-0.0148892 0.126068 -0.00252126 0.467449 0.5 \n0.0175205 0.0552114 -0.0272756 0.685576 0.5 \n-0.00953661 0.0794104 -0.0379859 0.670336 0.467319 \n0.00524266 0.0391336 -0.021947 0.540697 0.5 \n0.0175653 0.0679339 -0.0289388 0.690366 0.5 \n-0.0057907 0.128077 -0.00285105 0.714685 0.5 \n0.00626556 0.128047 -0.0031705 0.574275 0.5 \n0.00559979 0.0346604 -0.0179318 0.278473 0.5 \n0.029824 0.0359142 0.00488977 0.290019 0.5 \n0.00625193 0.0459623 -0.0263782 0.665265 0.460024 \n0.0143253 0.0473484 -0.0251513 0.546545 0.456757 \n0.00604086 0.0555073 -0.0304314 0.840924 0.5 \n-0.00613413 0.0546372 -0.032635 0.634884 0.475184 \n-0.0346694 0.057124 -0.0114953 0.102172 0.5 \n-0.00684543 0.0679742 -0.0359406 0.670518 0.457134 \n0.0056558 0.0676237 -0.0329199 0.79033 0.385997 \n-0.0569732 0.0651628 -0.00958219 0.452904 0.5 \n-0.0422796 0.0699944 -0.0161463 0.543504 0.5 \n-0.0175719 0.0705473 -0.0382261 0.581028 0.470136 \n-0.055586 0.0722983 -0.0161218 0.401473 0.5 \n-0.0637884 0.0712697 -0.0138535 0.437166 0.5 \n0.00568561 0.0790547 -0.0339189 0.719764 0.5 \n-0.00338429 0.0804511 -0.0367226 0.799862 0.5 \n-0.0248988 0.0815004 -0.0371078 0.39297 0.457854 \n-0.0412513 0.0791378 -0.0197746 0.273711 0.5 \n-0.0735819 0.0777026 -0.0122023 0.445372 0.5 \n-0.018062 0.0352627 -0.0195401 0.319674 0.5 \n-0.031577 0.0358487 -0.0179669 0.482378 0.5 \n-0.00602034 0.0381237 -0.0145184 0.909294 0.5 \n-0.0177811 0.0382546 -0.0154503 0.887215 0.5 \n0.00753447 0.0355596 -0.00650063 0.962688 0.5 \n0.00430437 0.0384017 -0.0071754 0.927286 0.5 \n-0.00593935 0.038948 -0.00592129 0.816802 0.5 \n-0.0176142 0.0386055 -0.00584508 0.759701 0.5 \n-0.0430308 0.0341391 -0.00565972 0.772585 0.5 \n0.0189222 0.0351076 0.00499769 0.579133 0.5 \n-0.0299129 0.0383912 -0.00582677 0.752109 0.5 \n0.00512066 0.0348398 0.00558498 0.588251 0.5 \n0.00103528 0.0375917 0.000952222 0.441385 0.5 \n-0.00584714 0.0383419 0.00590803 0.728422 0.5 \n-0.0424621 0.0343144 0.00590597 0.266658 0.5 \n-0.017873 0.0383166 0.00599471 0.753895 0.5 \n0.028662 0.0358411 0.0187496 0.360666 0.5 \n-0.055026 0.0336204 0.00583816 0.742717 0.5 \n-0.0284733 0.0381489 0.00441853 0.456211 0.5 \n-0.000947006 0.0357374 0.0103469 0.779853 0.5 \n0.0193224 0.0351814 0.0196616 0.180494 0.5 \n-0.0342325 0.033759 0.00717517 0.152905 0 \n0.00536022 0.0345956 0.0179871 0.676527 0.5 \n-0.000385714 0.0351459 0.0134171 0.848157 0.5 \n0.0334119 0.0376179 0.0210082 0.70177 0.5 \n-0.00589791 0.0381782 0.0177062 0.797449 0.5 \n-0.0352445 0.0350571 0.0178257 0.572312 0.5 \n-0.0178078 0.0381962 0.0178114 0.753708 0.5 \n-0.0261898 0.0377592 0.0177044 0.146481 0.5 \n-0.0563247 0.0336762 0.0175265 0.458851 0.5 \n0.00114114 0.037661 0.0223414 0.978558 0.5 \n0.0100253 0.0355029 0.029656 0.701449 0.5 \n0.00550127 0.0385556 0.0296609 0.996029 0.5 \n-0.00596581 0.0388946 0.0299252 0.805634 0.5 \n-0.0330745 0.0355217 0.0292236 0.263742 0.5 \n-0.0277717 0.0382563 0.0322865 0.074682 0.5 \n-0.0179091 0.0385902 0.0296167 0.782021 0.5 \n-0.0419404 0.0343698 0.0299668 0.109729 0 \n0.015243 0.0356116 0.0412692 0.759188 0.5 \n-0.0554301 0.0342555 0.0297952 0.808252 0.5 \n-0.0660515 0.0611144 0.00585548 0.442355 0.5 \n-0.00654912 0.0350372 0.0453959 0.139343 0 \n-0.0307826 0.0347596 0.0432959 0.154826 0.5 \n-0.0180834 0.0348142 0.0458772 0.143796 0.5 \n3 164 94 98 \n3 224 335 49 \n3 331 350 376 \n3 124 122 237 \n3 61 89 69 \n3 61 161 94 \n3 24 89 50 \n3 109 25 35 \n3 27 34 152 \n3 444 443 435 \n3 94 35 153 \n3 3 61 69 \n3 24 69 89 \n3 38 218 104 \n3 22 42 39 \n3 14 24 34 \n3 290 166 371 \n3 226 76 224 \n3 204 197 72 \n3 82 3 14 \n3 13 81 23 \n3 99 13 23 \n3 23 110 30 \n3 110 2 30 \n3 166 265 371 \n3 90 61 3 \n3 34 24 50 \n3 293 167 207 \n3 80 78 85 \n3 61 94 164 \n3 84 238 80 \n3 4 161 61 \n3 132 149 64 \n3 196 22 228 \n3 59 46 242 \n3 179 84 80 \n3 265 96 371 \n3 52 258 207 \n3 121 127 141 \n3 343 168 346 \n3 232 227 220 \n3 232 243 227 \n3 232 246 243 \n3 57 126 56 \n3 57 130 126 \n3 221 232 220 \n3 4 61 90 \n3 134 80 85 \n3 176 217 175 \n3 4 0 161 \n3 78 21 50 \n3 126 130 129 \n3 56 126 129 \n3 111 182 201 \n3 96 70 371 \n3 89 164 98 \n3 123 6 55 \n3 197 87 72 \n3 416 419 412 \n3 245 80 179 \n3 21 78 36 \n3 61 164 89 \n3 67 132 64 \n3 150 149 132 \n3 384 387 325 \n3 214 221 112 \n3 214 233 232 \n3 221 214 232 \n3 244 246 232 \n3 233 244 232 \n3 244 252 246 \n3 244 143 119 \n3 252 244 119 \n3 127 142 141 \n3 67 150 132 \n3 82 90 3 \n3 112 180 214 \n3 244 253 143 \n3 111 201 269 \n3 37 74 63 \n3 133 150 67 \n3 118 133 67 \n3 133 180 150 \n3 191 214 180 \n3 181 191 180 \n3 191 234 233 \n3 214 191 233 \n3 234 244 233 \n3 234 7 244 \n3 244 98 253 \n3 253 98 143 \n3 216 217 115 \n3 181 180 133 \n3 15 16 219 \n3 254 98 244 \n3 7 254 244 \n3 74 11 63 \n3 14 3 24 \n3 3 69 24 \n3 217 216 175 \n3 85 78 50 \n3 73 78 80 \n3 7 98 254 \n3 105 133 118 \n3 1 248 196 \n3 48 241 100 \n3 42 156 39 \n3 149 173 344 \n3 135 133 105 \n3 106 135 105 \n3 31 7 234 \n3 148 31 234 \n3 89 98 7 \n3 31 89 7 \n3 235 84 230 \n3 14 27 236 \n3 106 125 135 \n3 19 20 62 \n3 131 54 159 \n3 34 50 21 \n3 82 14 236 \n3 201 52 43 \n3 310 308 280 \n3 131 159 54 \n3 271 310 280 \n3 27 14 34 \n3 177 89 31 \n3 238 73 80 \n3 130 176 175 \n3 354 331 381 \n3 129 130 175 \n3 125 136 135 \n3 251 52 201 \n3 106 56 125 \n3 56 129 136 \n3 125 56 136 \n3 129 175 174 \n3 136 129 174 \n3 175 216 215 \n3 174 175 215 \n3 115 114 215 \n3 216 115 215 \n3 134 85 31 \n3 85 177 31 \n3 50 89 177 \n3 85 50 177 \n3 179 80 245 \n3 400 407 367 \n3 263 83 121 \n3 217 179 115 \n3 149 132 64 \n3 178 187 116 \n3 142 178 116 \n3 326 120 319 \n3 57 83 267 \n3 304 391 294 \n3 355 354 359 \n3 128 29 11 \n3 267 273 130 \n3 48 16 10 \n3 301 302 266 \n3 196 66 22 \n3 230 84 217 \n3 247 13 243 \n3 110 81 13 \n3 271 178 266 \n3 110 13 247 \n3 278 277 267 \n3 48 10 329 \n3 258 11 275 \n3 1 196 228 \n3 154 247 243 \n3 154 110 247 \n3 263 141 270 \n3 154 60 110 \n3 60 154 110 \n3 154 60 110 \n3 11 74 37 \n3 274 5 51 \n3 252 154 243 \n3 119 252 243 \n3 109 110 60 \n3 39 2 110 \n3 109 39 110 \n3 32 128 29 \n3 32 128 11 \n3 309 300 311 \n3 252 119 154 \n3 73 145 255 \n3 67 64 259 \n3 32 29 128 \n3 258 275 43 \n3 154 119 60 \n3 119 109 60 \n3 137 256 248 \n3 270 267 83 \n3 235 238 84 \n3 267 130 57 \n3 258 32 11 \n3 302 310 271 \n3 51 238 235 \n3 266 302 271 \n3 5 36 255 \n3 51 235 230 \n3 51 145 73 \n3 286 51 230 \n3 287 274 286 \n3 119 25 109 \n3 10 40 289 \n3 120 48 329 \n3 274 51 286 \n3 276 230 217 \n3 10 16 15 \n3 51 5 145 \n3 43 11 201 \n3 176 276 217 \n3 143 25 119 \n3 158 207 167 \n3 360 321 357 \n3 130 273 276 \n3 122 198 237 \n3 270 278 267 \n3 77 218 38 \n3 15 6 40 \n3 280 187 178 \n3 271 280 178 \n3 258 207 32 \n3 66 58 22 \n3 279 287 278 \n3 155 139 172 \n3 121 141 263 \n3 288 41 274 \n3 287 288 274 \n3 276 176 130 \n3 289 288 205 \n3 274 41 5 \n3 288 287 279 \n3 329 10 289 \n3 16 100 219 \n3 127 178 142 \n3 273 267 276 \n3 252 119 243 \n3 116 279 141 \n3 41 123 5 \n3 116 288 279 \n3 142 116 141 \n3 207 158 32 \n3 276 277 230 \n3 101 102 163 \n3 299 298 294 \n3 287 286 278 \n3 5 255 145 \n3 131 159 70 \n3 275 11 43 \n3 32 158 250 \n3 205 288 116 \n3 73 36 78 \n3 120 329 319 \n3 297 391 300 \n3 84 179 217 \n3 17 77 38 \n3 255 36 73 \n3 263 270 83 \n3 249 248 1 \n3 286 230 277 \n3 11 37 66 \n3 43 52 258 \n3 267 277 276 \n3 279 278 270 \n3 141 279 270 \n3 51 73 238 \n3 47 36 5 \n3 201 66 269 \n3 201 11 66 \n3 309 310 302 \n3 300 309 302 \n3 182 33 251 \n3 278 286 277 \n3 243 246 252 \n3 416 427 419 \n3 96 131 70 \n3 66 256 111 \n3 65 335 189 \n3 113 374 407 \n3 144 139 155 \n3 226 224 139 \n3 358 400 396 \n3 30 91 203 \n3 226 139 144 \n3 46 328 242 \n3 307 304 298 \n3 70 159 54 \n3 103 265 284 \n3 443 261 446 \n3 17 38 28 \n3 88 200 239 \n3 72 170 211 \n3 138 17 28 \n3 35 1 228 \n3 295 299 294 \n3 18 131 140 \n3 18 59 131 \n3 207 258 52 \n3 188 70 54 \n3 104 87 197 \n3 222 48 120 \n3 325 326 311 \n3 326 281 120 \n3 54 159 292 \n3 386 299 295 \n3 138 59 17 \n3 48 100 16 \n3 59 242 17 \n3 296 121 83 \n3 10 15 40 \n3 242 91 17 \n3 225 9 211 \n3 314 322 384 \n3 326 325 281 \n3 170 225 211 \n3 17 91 77 \n3 144 76 226 \n3 155 9 225 \n3 159 131 28 \n3 172 139 170 \n3 131 138 28 \n3 281 264 120 \n3 264 222 120 \n3 139 155 225 \n3 139 225 170 \n3 314 325 313 \n3 386 295 390 \n3 292 159 28 \n3 132 149 344 \n3 424 427 416 \n3 49 335 65 \n3 314 313 304 \n3 111 269 66 \n3 9 71 72 \n3 211 9 72 \n3 306 316 353 \n3 307 314 304 \n3 325 311 313 \n3 40 41 288 \n3 289 40 288 \n3 40 6 41 \n3 6 123 41 \n3 22 39 109 \n3 165 312 76 \n3 299 307 298 \n3 144 165 76 \n3 312 107 76 \n3 376 381 331 \n3 165 107 312 \n3 155 172 330 \n3 35 228 22 \n3 45 184 160 \n3 42 62 156 \n3 2 39 62 \n3 58 42 22 \n3 49 71 9 \n3 280 116 187 \n3 280 205 116 \n3 155 330 144 \n3 280 289 205 \n3 319 280 308 \n3 162 77 20 \n3 20 77 91 \n3 329 289 280 \n3 319 329 280 \n3 156 62 39 \n3 372 408 375 \n3 190 1 0 \n3 1 35 0 \n3 42 19 62 \n3 35 161 0 \n3 190 0 97 \n3 35 22 109 \n3 76 53 224 \n3 161 35 94 \n3 49 9 155 \n3 224 49 155 \n3 29 63 11 \n3 160 162 19 \n3 76 333 53 \n3 153 25 143 \n3 71 49 65 \n3 2 20 30 \n3 62 20 2 \n3 55 8 5 \n3 169 0 4 \n3 6 8 55 \n3 35 25 153 \n3 160 218 162 \n3 218 77 162 \n3 15 334 6 \n3 334 8 6 \n3 332 76 93 \n3 8 47 5 \n3 98 153 143 \n3 94 153 98 \n3 219 334 15 \n3 332 333 76 \n3 93 76 107 \n3 100 334 219 \n3 160 19 45 \n3 19 162 20 \n3 340 132 344 \n3 45 19 42 \n3 27 47 8 \n3 27 36 47 \n3 80 115 179 \n3 45 42 58 \n3 71 184 45 \n3 236 27 8 \n3 334 236 8 \n3 332 93 333 \n3 27 152 36 \n3 223 64 340 \n3 236 334 117 \n3 152 21 36 \n3 134 148 115 \n3 115 148 114 \n3 152 34 21 \n3 5 123 55 \n3 337 68 191 \n3 333 93 282 \n3 256 66 196 \n3 135 174 347 \n3 183 180 195 \n3 117 285 236 \n3 182 111 63 \n3 354 318 352 \n3 114 234 68 \n3 71 65 184 \n3 135 136 174 \n3 191 215 337 \n3 337 215 114 \n3 63 33 182 \n3 133 135 181 \n3 135 347 181 \n3 110 23 81 \n3 157 180 183 \n3 149 157 183 \n3 227 147 220 \n3 12 23 30 \n3 151 99 46 \n3 174 215 191 \n3 99 328 46 \n3 114 148 234 \n3 149 150 157 \n3 220 147 284 \n3 79 186 336 \n3 68 234 191 \n3 396 357 356 \n3 99 23 12 \n3 328 99 12 \n3 337 114 68 \n3 356 358 396 \n3 338 343 342 \n3 223 340 339 \n3 265 103 96 \n3 341 223 339 \n3 347 174 191 \n3 182 251 201 \n3 134 115 80 \n3 12 30 203 \n3 345 343 338 \n3 147 227 103 \n3 33 108 251 \n3 95 20 91 \n3 181 347 191 \n3 345 346 343 \n3 157 150 180 \n3 103 227 18 \n3 66 240 58 \n3 345 344 346 \n3 146 32 108 \n3 445 125 444 \n3 30 95 91 \n3 124 373 374 \n3 137 249 72 \n3 344 345 338 \n3 344 168 346 \n3 12 203 328 \n3 284 147 103 \n3 240 66 37 \n3 344 173 168 \n3 314 384 322 \n3 107 282 93 \n3 76 53 107 \n3 107 53 282 \n3 282 53 333 \n3 165 76 107 \n3 315 202 291 \n3 165 144 76 \n3 407 374 367 \n3 144 53 76 \n3 388 389 92 \n3 155 144 330 \n3 144 224 53 \n3 432 431 434 \n3 155 189 144 \n3 144 189 224 \n3 189 335 53 \n3 224 189 53 \n3 146 29 32 \n3 382 88 209 \n3 331 316 350 \n3 331 353 316 \n3 357 367 366 \n3 360 357 366 \n3 367 374 373 \n3 366 367 373 \n3 373 407 374 \n3 388 92 169 \n3 170 65 155 \n3 155 65 189 \n3 328 203 91 \n3 413 421 414 \n3 356 331 358 \n3 242 328 91 \n3 168 343 346 \n3 113 198 122 \n3 124 113 122 \n3 239 200 315 \n3 331 356 357 \n3 372 26 102 \n3 375 372 102 \n3 26 163 102 \n3 408 372 375 \n3 72 87 65 \n3 170 72 65 \n3 87 184 65 \n3 63 108 11 \n3 63 29 108 \n3 370 285 231 \n3 389 370 231 \n3 131 18 140 \n3 33 63 108 \n3 368 306 321 \n3 374 113 124 \n3 285 324 268 \n3 231 285 268 \n3 336 272 186 \n3 224 155 139 \n3 363 369 372 \n3 86 193 163 \n3 208 63 111 \n3 380 305 202 \n3 356 357 321 \n3 346 354 352 \n3 346 168 354 \n3 168 359 354 \n3 364 290 369 \n3 363 364 369 \n3 290 371 372 \n3 369 290 372 \n3 371 70 26 \n3 372 371 26 \n3 70 188 26 \n3 188 54 26 \n3 54 163 26 \n3 54 86 163 \n3 54 28 86 \n3 28 38 86 \n3 38 197 86 \n3 38 104 197 \n3 104 218 87 \n3 218 160 87 \n3 160 184 87 \n3 58 240 208 \n3 240 37 63 \n3 208 240 63 \n3 340 64 132 \n3 343 168 346 \n3 400 367 357 \n3 396 400 357 \n3 54 292 28 \n3 96 103 18 \n3 346 168 343 \n3 249 137 248 \n3 200 209 199 \n3 79 222 281 \n3 327 308 309 \n3 343 346 352 \n3 383 388 169 \n3 200 88 209 \n3 285 186 324 \n3 241 48 79 \n3 16 100 79 \n3 303 100 79 \n3 323 105 451 \n3 100 303 186 \n3 100 16 79 \n3 321 353 331 \n3 236 285 370 \n3 389 231 92 \n3 100 285 117 \n3 108 63 11 \n3 186 303 79 \n3 88 382 209 \n3 82 236 389 \n3 100 241 79 \n3 45 72 71 \n3 0 169 97 \n3 45 137 72 \n3 285 100 186 \n3 137 45 58 \n3 199 378 305 \n3 208 137 58 \n3 356 331 357 \n3 305 380 202 \n3 378 349 305 \n3 169 92 315 \n3 192 262 75 \n3 361 192 75 \n3 291 202 237 \n3 258 293 207 \n3 272 79 377 \n3 324 186 268 \n3 268 186 88 \n3 90 389 388 \n3 169 315 291 \n3 97 169 291 \n3 79 320 377 \n3 4 383 169 \n3 379 317 368 \n3 200 202 315 \n3 92 239 315 \n3 306 353 321 \n3 370 389 236 \n3 48 222 79 \n3 206 361 185 \n3 361 206 185 \n3 92 231 239 \n3 356 321 331 \n3 190 171 185 \n3 249 190 185 \n3 206 198 361 \n3 198 192 361 \n3 90 388 383 \n3 305 124 237 \n3 327 311 326 \n3 4 90 383 \n3 190 249 1 \n3 206 361 185 \n3 171 206 185 \n3 202 305 237 \n3 108 29 146 \n3 308 310 309 \n3 334 100 117 \n3 90 82 389 \n3 79 336 186 \n3 224 53 335 \n3 354 381 318 \n3 231 268 239 \n3 186 272 209 \n3 88 186 209 \n3 200 199 202 \n3 327 326 319 \n3 308 327 319 \n3 309 311 327 \n3 435 443 446 \n3 199 305 202 \n3 97 171 190 \n3 171 97 206 \n3 97 291 206 \n3 237 198 206 \n3 291 237 206 \n3 406 124 305 \n3 399 402 400 \n3 373 374 407 \n3 300 304 311 \n3 304 313 311 \n3 407 213 113 \n3 208 111 256 \n3 403 402 399 \n3 363 403 399 \n3 29 128 32 \n3 403 375 402 \n3 363 399 359 \n3 194 192 198 \n3 193 86 75 \n3 400 213 407 \n3 272 336 79 \n3 79 281 320 \n3 300 302 297 \n3 294 298 304 \n3 299 322 314 \n3 307 299 314 \n3 322 384 314 \n3 377 281 325 \n3 387 377 325 \n3 281 377 320 \n3 355 358 331 \n3 101 102 262 \n3 363 375 403 \n3 197 204 75 \n3 102 101 262 \n3 299 384 322 \n3 262 163 193 \n3 318 343 352 \n3 299 322 384 \n3 299 393 322 \n3 322 393 384 \n3 137 208 256 \n3 86 197 75 \n3 186 79 336 \n3 222 264 281 \n3 185 361 75 \n3 365 360 366 \n3 386 392 393 \n3 299 386 393 \n3 393 392 384 \n3 392 394 384 \n3 394 398 387 \n3 384 394 387 \n3 404 377 387 \n3 398 404 387 \n3 404 209 377 \n3 209 272 377 \n3 399 400 358 \n3 359 399 358 \n3 101 163 262 \n3 262 193 75 \n3 102 101 375 \n3 204 72 249 \n3 31 148 134 \n3 424 437 427 \n3 359 358 355 \n3 400 402 213 \n3 204 249 185 \n3 351 317 386 \n3 390 351 386 \n3 317 392 386 \n3 392 317 394 \n3 317 395 394 \n3 395 397 398 \n3 394 395 398 \n3 397 405 404 \n3 398 397 404 \n3 199 209 404 \n3 405 199 404 \n3 268 88 239 \n3 75 204 185 \n3 318 352 354 \n3 243 18 227 \n3 397 385 405 \n3 385 199 405 \n3 262 192 194 \n3 101 262 194 \n3 18 131 96 \n3 349 378 199 \n3 385 349 199 \n3 250 158 167 \n3 293 250 167 \n3 379 362 395 \n3 317 379 395 \n3 395 362 397 \n3 362 365 397 \n3 365 401 397 \n3 401 349 385 \n3 397 401 385 \n3 375 194 213 \n3 213 194 113 \n3 375 101 194 \n3 354 352 318 \n3 342 343 318 \n3 375 213 402 \n3 451 261 443 \n3 32 250 293 \n3 258 32 293 \n3 113 194 198 \n3 351 409 368 \n3 355 331 354 \n3 339 340 344 \n3 372 375 363 \n3 339 344 338 \n3 368 321 379 \n3 360 362 379 \n3 360 365 362 \n3 366 365 362 \n3 365 366 362 \n3 406 349 401 \n3 365 406 401 \n3 108 258 52 \n3 258 108 32 \n3 305 349 406 \n3 297 302 301 \n3 52 251 108 \n3 321 360 379 \n3 384 325 314 \n3 373 406 365 \n3 366 373 365 \n3 373 349 406 \n3 349 373 406 \n3 373 124 406 \n3 106 105 323 \n3 439 434 431 \n3 18 243 229 \n3 83 57 260 \n3 447 83 260 \n3 418 425 429 \n3 439 441 434 \n3 441 442 434 \n3 257 106 323 \n3 391 425 418 \n3 435 437 444 \n3 257 323 452 \n3 391 418 294 \n3 296 440 441 \n3 440 296 441 \n3 131 59 138 \n3 294 413 295 \n3 95 30 20 \n3 428 432 434 \n3 422 424 415 \n3 294 420 413 \n3 425 296 429 \n3 414 422 415 \n3 425 121 296 \n3 296 440 431 \n3 452 323 451 \n3 296 83 447 \n3 431 441 439 \n3 445 444 436 \n3 429 296 431 \n3 450 56 106 \n3 301 121 433 \n3 106 257 452 \n3 414 415 411 \n3 390 413 386 \n3 18 229 59 \n3 59 229 46 \n3 386 414 411 \n3 301 433 425 \n3 248 256 196 \n3 411 416 412 \n3 300 391 304 \n3 422 436 424 \n3 46 229 151 \n3 127 121 301 \n3 412 419 356 \n3 295 413 390 \n3 351 390 411 \n3 442 56 125 \n3 409 351 412 \n3 247 243 13 \n3 330 172 155 \n3 451 118 67 \n3 364 44 290 \n3 290 44 166 \n3 166 210 265 \n3 265 210 284 \n3 442 436 434 \n3 229 99 151 \n3 364 449 44 \n3 449 283 44 \n3 418 420 294 \n3 363 449 364 \n3 212 284 210 \n3 44 210 166 \n3 420 428 422 \n3 44 212 210 \n3 247 229 243 \n3 229 247 99 \n3 127 266 178 \n3 56 450 260 \n3 413 420 421 \n3 359 168 363 \n3 363 168 449 \n3 415 424 416 \n3 296 447 260 \n3 212 220 284 \n3 436 437 424 \n3 351 411 412 \n3 440 441 431 \n3 283 212 44 \n3 451 67 261 \n3 168 173 449 \n3 449 173 283 \n3 426 342 318 \n3 381 426 318 \n3 212 348 220 \n3 266 127 301 \n3 426 338 342 \n3 149 283 173 \n3 149 212 283 \n3 438 338 426 \n3 433 121 425 \n3 149 183 212 \n3 414 421 422 \n3 172 170 155 \n3 368 317 351 \n3 350 381 376 \n3 67 259 261 \n3 183 112 212 \n3 212 112 348 \n3 348 112 220 \n3 432 431 434 \n3 448 339 338 \n3 438 448 338 \n3 420 431 432 \n3 112 221 220 \n3 428 420 432 \n3 431 432 434 \n3 417 381 350 \n3 422 428 434 \n3 423 426 381 \n3 417 423 381 \n3 56 260 57 \n3 451 105 118 \n3 296 260 440 \n3 386 413 414 \n3 306 350 316 \n3 448 341 339 \n3 415 416 411 \n3 436 444 437 \n3 259 341 448 \n3 297 425 391 \n3 442 125 445 \n3 450 106 452 \n3 410 350 306 \n3 341 259 223 \n3 355 417 350 \n3 410 355 350 \n3 259 64 223 \n3 410 356 350 \n3 356 410 350 \n3 356 355 410 \n3 355 419 417 \n3 247 13 99 \n3 195 112 183 \n3 180 112 195 \n3 419 355 356 \n3 301 425 297 \n3 390 386 411 \n3 446 259 448 \n3 446 261 259 \n3 434 436 422 \n3 421 420 422 \n3 409 410 306 \n3 368 409 306 \n3 412 356 410 \n3 409 412 410 \n3 442 445 436 \n3 435 423 430 \n"
  },
  {
    "path": "tests/meshes/mesh.source.PLYMeshReader.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-0.031221599999999999 0.126304 0.0051492400000000002 -0.044677399999999999 0.13120399999999999 0.0057047900000000004 -0.068301100000000003 0.14482800000000001 0.041368799999999997 -0.0060009499999999997 0.13039799999999999 0.017898600000000001 -0.017356799999999999 0.127613 0.0052688500000000003 0.033051299999999999 0.107034 0.031954299999999998 0.040087299999999999 0.10521 0.0173419 -0.030180200000000001 0.106322 0.039974500000000003 0.0304193 0.118572 0.018806799999999999 -0.064082200000000006 0.159391 -0.0169096 0.044704599999999997 0.092787700000000001 0.0050758499999999998 -0.031675399999999999 0.17039499999999999 -0.0063502300000000001 -0.084852300000000005 0.134078 0.047017700000000003 -0.068854700000000005 0.12205199999999999 0.051756900000000002 0.00595475 0.131024 0.017825199999999999 0.040462900000000003 0.105142 0.0064097800000000003 0.038734200000000003 0.102161 -0.0046311199999999999 -0.091451299999999999 0.13413600000000001 0.017102599999999999 -0.081872100000000003 0.107166 0.031015999999999998 -0.067218 0.15615499999999999 0.017886300000000001 -0.079568700000000006 0.15287500000000001 0.029931099999999999 0.0059600699999999996 0.122504 0.034627199999999997 -0.051631700000000003 0.14500099999999999 0.018480400000000001 -0.077978099999999995 0.13255 0.051349400000000003 -0.0059070800000000003 0.12793399999999999 0.027462299999999999 -0.047913299999999999 0.129301 0.026964599999999998 -0.082427 0.092813400000000004 -0.0055604599999999997 0.017440000000000001 0.127694 0.018534800000000001 -0.090686799999999998 0.120305 0.0066804000000000004 -0.029403800000000001 0.17902999999999999 -0.0078795900000000006 -0.079789100000000002 0.14376 0.042699399999999998 -0.018287999999999999 0.10832899999999999 0.041509799999999999 -0.0202326 0.18184600000000001 -0.018327400000000001 -0.037703899999999999 0.167987 -0.0130391 0.0058216400000000003 0.12806000000000001 0.027901599999999999 -0.043538899999999998 0.13001399999999999 0.017533300000000002 0.018869899999999998 0.119862 0.032409 -0.044010100000000003 0.16703499999999999 0.00231898 -0.089811000000000002 0.13240099999999999 0.00705743 -0.057352 0.14498900000000001 0.031519600000000002 0.044262200000000002 0.093452599999999997 0.0176417 0.041234300000000002 0.092173099999999994 0.0285603 -0.056395300000000002 0.15456500000000001 0.016878000000000001 -0.0206135 0.159773 -0.0071752200000000004 -0.072989299999999993 0.065611600000000006 0.018169299999999999 -0.067396700000000004 0.15525600000000001 0.0058138900000000004 -0.090486399999999995 0.11861099999999999 0.041214800000000003 0.0273142 0.117965 0.028619100000000001 0.041907 0.091638600000000001 -0.0055694500000000001 -0.070210900000000007 0.16530300000000001 -0.0194661 -0.0061846999999999996 0.122729 0.034786999999999998 0.0300138 0.093278600000000003 0.0421476 -0.017512900000000001 0.16212599999999999 -0.0145489 -0.076397699999999999 0.171291 -0.041102100000000003 -0.085422700000000004 0.10538599999999999 0.00339486 0.037043100000000002 0.110443 0.020722899999999999 -0.0065973200000000003 0.042728500000000003 0.046939099999999997 0.0063979400000000004 0.043700599999999999 0.046826 -0.055924700000000001 0.157606 0.0065645499999999997 -0.091144900000000001 0.118816 0.029844200000000001 -0.059510899999999999 0.12835199999999999 0.039962600000000001 -0.0176335 0.127605 0.0179366 -0.066632999999999998 0.153831 0.0308703 -0.043641800000000001 0.16943800000000001 -0.0055022600000000001 -0.057275899999999998 0.043242999999999997 0.042861999999999997 -0.076377299999999995 0.157221 -0.016888899999999998 -0.043446100000000001 0.15604999999999999 0.0061579499999999997 -0.042711800000000001 0.042164500000000001 0.042700399999999999 -0.025420100000000001 0.088662199999999997 0.050382700000000002 -0.014179000000000001 0.12626999999999999 0.026641700000000001 -0.088258199999999995 0.089868699999999996 0.0069662500000000002 -0.0688695 0.157773 -0.0068759299999999997 -0.067967600000000003 0.142877 -0.0075764300000000003 0.0188538 0.106293 0.041690199999999997 -0.036486999999999999 0.17122499999999999 0.00054503699999999995 -0.0664352 0.117198 -0.0098716099999999994 -0.068260600000000005 0.17039799999999999 -0.043699500000000002 -0.090925000000000006 0.14605000000000001 0.019038200000000002 0.0067862199999999999 0.115841 0.038807700000000001 0.0310139 0.093069600000000002 -0.017798000000000001 0.0056975999999999997 0.10589 0.043551100000000002 -0.070651900000000004 0.13063 0.050249700000000001 0.0059746 0.130858 0.0057947900000000002 0.018421699999999999 0.0423182 0.042477000000000001 0.0147876 0.090974700000000006 0.050965799999999999 -0.0059823200000000002 0.115409 0.040202700000000001 -0.081131200000000001 0.11797199999999999 -0.0035945299999999999 -0.078703200000000001 0.14427400000000001 -0.0038905200000000002 0.0058198800000000004 0.106226 -0.0208968 -0.019276100000000001 0.119853 0.032806099999999998 -0.0059311600000000004 0.130215 0.0059540000000000001 -0.0893322 0.14274500000000001 0.029032599999999999 -0.0076253800000000002 0.12327299999999999 -0.0098155499999999993 -0.069226300000000004 0.178922 -0.054274299999999998 -0.029875700000000002 0.124252 0.020967400000000001 -0.084826600000000002 0.14898700000000001 0.032769699999999999 -0.088851600000000003 0.090972300000000006 0.0179034 -0.030587900000000001 0.12238400000000001 -0.0063577099999999999 -0.030719799999999998 0.117989 0.030616600000000001 -0.078061199999999997 0.120653 0.051399899999999998 0.0332714 0.108498 -0.0074319499999999997 -0.067711199999999999 0.092891799999999997 -0.016881400000000001 -0.075665999999999997 0.091181700000000004 -0.013696699999999999 -0.082421999999999995 0.095112100000000005 0.031087799999999999 -0.085698399999999994 0.136903 0.00192122 -0.029280400000000002 0.041774699999999998 0.051396999999999998 -0.017732000000000001 0.042386399999999998 0.051684000000000001 -0.065698699999999999 0.17100699999999999 -0.056644 -0.029852299999999998 0.170905 -0.0165609 -0.0562502 0.13501299999999999 0.033045499999999998 -0.066612699999999997 0.133021 0.044704399999999998 -0.042537899999999997 0.155441 -0.00749353 -0.054530799999999997 0.071460300000000004 0.039704200000000002 -0.041315900000000003 0.090692300000000003 -0.0225881 -0.0172876 0.092177400000000007 0.053621200000000001 -0.0059811899999999999 0.094030799999999998 0.054264300000000001 0.042372399999999998 0.067256300000000005 0.029580100000000002 0.028574100000000002 0.116909 -0.0039177200000000004 -0.033181099999999998 0.045074400000000001 0.045114599999999998 -0.053940200000000001 0.118566 0.035373099999999998 0.042272400000000002 0.079554600000000003 -0.0057946100000000004 0.029727300000000002 0.042550200000000003 0.0304975 -0.031563899999999999 0.095933099999999993 -0.023680099999999999 0.038180400000000003 0.10512100000000001 0.026694699999999998 -0.028498800000000001 0.090492000000000003 -0.029085400000000001 -0.017318900000000002 0.043794199999999998 0.043269500000000002 0.0037675400000000002 0.047755100000000002 0.050203699999999997 0.043267300000000002 0.045829099999999998 0.027825099999999998 -0.023332200000000001 0.18123900000000001 -0.0112893 -0.0056258000000000002 0.0565038 0.053881800000000001 0.00529431 0.055679800000000002 0.053288099999999998 -0.088321899999999995 0.105757 0.017298299999999999 -0.056637399999999997 0.047018400000000002 0.030580900000000001 -0.029624299999999999 0.0543188 0.039895100000000003 -0.0059740699999999997 0.10589700000000001 0.044066899999999999 -0.021412199999999999 0.054697599999999999 0.044641 -0.016148800000000001 0.057436300000000003 0.050903999999999998 -0.056830499999999999 0.14639199999999999 -0.0026426000000000002 -0.093146599999999996 0.11906700000000001 0.017994799999999998 -0.061862 0.158417 -0.029302600000000002 -0.085585800000000004 0.10684 0.021728999999999998 0.033664199999999998 0.0540543 0.0350841 0.042771000000000003 0.056035099999999997 0.031558999999999997 -0.043458900000000002 0.117191 0.031704400000000001 -0.068096199999999996 0.156721 -0.0426174 0.027238399999999999 0.103156 0.039705799999999999 -0.029393200000000001 0.178536 -0.014556299999999999 -0.076269699999999996 0.0912245 0.038341899999999998 -0.0191285 0.098595199999999994 0.045667600000000003 -0.053090999999999999 0.056740199999999998 0.0293963 -0.043197800000000001 0.055577700000000001 0.039083800000000002 -0.083305500000000005 0.115643 0.046828000000000002 0.014434499999999999 0.127081 0.026297000000000001 -0.038891299999999997 0.123761 0.024977800000000001 -0.0594359 0.119905 0.0399756 -0.070233199999999996 0.15426200000000001 -0.0312401 -0.0574473 0.15257599999999999 0.028450799999999998 -0.048003799999999999 0.056365999999999999 0.036266300000000001 -0.0107262 0.17966199999999999 -0.0277472 -0.088229299999999997 0.10606599999999999 0.0084675600000000007 -0.078993999999999995 0.15398400000000001 0.0065186200000000001 -0.0295675 0.12607199999999999 0.014633800000000001 -0.081735600000000005 0.15439 0.017733200000000001 -0.079546900000000004 0.10419399999999999 -0.00620274 -0.024860799999999999 0.12291299999999999 0.024542899999999999 -0.066441600000000003 0.15995699999999999 -0.053371300000000003 -0.078487799999999996 0.070528300000000002 0.017446099999999999 -0.0096710100000000007 0.17322499999999999 -0.026494500000000001 -0.056628400000000002 0.054703099999999998 0.00744563 -0.018401500000000001 0.12221899999999999 -0.0077513399999999998 -0.069595199999999996 0.14641199999999999 -0.018031999999999999 -0.041251700000000002 0.123196 -0.00958087 -0.068497199999999994 0.14819399999999999 -0.028726000000000002 -0.054003599999999999 0.055543000000000002 0.017767399999999999 -0.016920299999999999 0.068216799999999994 0.0531499 -0.0060722099999999998 0.067710199999999998 0.056450100000000003 0.0070872799999999996 0.067321800000000001 0.055336900000000001 -0.014317399999999999 0.11697100000000001 0.037836000000000002 0.053892299999999997 0.055754699999999997 0.026624399999999999 0.0051785499999999996 0.093173800000000001 0.053587299999999997 -0.043103799999999998 0.067438799999999993 0.040773700000000003 -0.0293069 0.068073300000000003 0.041015999999999997 -0.037955500000000003 0.16195399999999999 -0.0128021 -0.0561165 0.065432900000000002 0.034197900000000003 -0.076170699999999994 0.155559 -0.0059271999999999997 -0.055218099999999999 0.122506 -0.0094648800000000002 0.017700400000000002 0.10598299999999999 -0.0186138 0.0534583 0.065637500000000001 0.026433600000000002 -0.086915199999999998 0.094415600000000002 0.0029311799999999998 -0.076425699999999999 0.16170699999999999 -0.029751699999999999 -0.0440959 0.12745300000000001 -0.00327875 -0.031291899999999997 0.079829800000000006 0.043494400000000003 -0.054944800000000002 0.106348 -0.018562499999999999 -0.072373499999999993 0.110057 -0.0094325699999999995 -0.055365900000000003 0.091982900000000006 -0.021178300000000001 -0.048809100000000001 0.066012699999999994 0.037395900000000003 -0.047308599999999999 0.14515600000000001 0.0068846899999999997 -0.080391299999999999 0.129634 -0.00469755 -0.041801999999999999 0.105934 -0.0198692 -0.0063213899999999996 0.093165200000000004 -0.032893499999999999 -0.0059705399999999999 0.106138 -0.0222282 -0.029482700000000001 0.15829299999999999 -0.00619266 -0.0177953 0.10628899999999999 -0.021777100000000001 -0.088526099999999996 0.13783899999999999 0.039396399999999998 -0.067493499999999998 0.12839200000000001 -0.0086347100000000003 0.046369300000000002 0.071512800000000001 0.021675400000000001 -0.0409565 0.11716799999999999 -0.014580900000000001 -0.010665600000000001 0.167541 -0.0199013 -0.053254700000000002 0.15745600000000001 -0.0028189600000000001 0.0053098800000000003 0.093312900000000004 -0.030185199999999999 -0.077343599999999998 0.072722599999999998 0.026654600000000001 -0.0625087 0.14993400000000001 -0.015031900000000001 -0.068801399999999999 0.068572599999999997 0.030664899999999998 -0.054525200000000003 0.080847799999999997 -0.0201707 -0.043676800000000002 0.078916 0.0428855 -0.018574799999999999 0.078970299999999993 0.055735300000000002 -0.0059999299999999997 0.079454800000000006 0.057800799999999999 0.0070648500000000001 0.081191700000000006 0.055818699999999999 -0.085026900000000002 0.146034 0.0058595399999999999 0.037011099999999998 0.110397 0.0026529399999999999 -0.068308400000000005 0.080331600000000003 0.040710900000000001 -0.055893999999999999 0.079259399999999994 0.043533500000000003 0.038145600000000002 0.088105600000000006 -0.0138675 -0.064283699999999999 0.039641799999999998 0.039623999999999999 -0.069869600000000004 0.16853599999999999 -0.031331900000000003 -0.061795999999999997 0.15574099999999999 -0.0207923 -0.062284800000000001 0.16236 -0.039628799999999999 -0.068686399999999995 0.092370400000000005 0.042197800000000001 -0.049353000000000001 0.13929800000000001 0.0147955 -0.078417700000000007 0.110126 0.041788600000000002 0.017941599999999999 0.079274700000000003 0.0518862 0.00532732 0.12366099999999999 -0.0099710500000000004 -0.055677400000000002 0.093520599999999995 0.044207000000000003 -0.043192399999999999 0.0921154 0.043268899999999999 -0.0298626 0.094012399999999996 0.044480499999999999 0.020595499999999999 0.087112999999999996 0.049232499999999998 0.01721 0.127663 0.0051259299999999999 -0.0290125 0.10671899999999999 -0.0207479 0.0185443 0.094811199999999998 0.047758700000000001 -0.0058867600000000004 0.116622 -0.016004899999999999 -0.052819100000000001 0.16264899999999999 0.0029671099999999998 0.035807800000000001 0.095859399999999997 -0.0120328 -0.091206400000000007 0.131415 0.0295307 -0.067874000000000004 0.10695200000000001 0.040372499999999999 -0.044163599999999997 0.104918 0.040170600000000001 0.00749586 0.098350000000000007 0.048825500000000001 -0.0554961 0.103898 0.041140500000000003 -0.066904400000000003 0.115717 0.047347899999999998 -0.0501524 0.14032600000000001 0.0025881799999999998 -0.055450800000000001 0.13242000000000001 -0.0048544499999999997 -0.014751999999999999 0.181897 -0.026278099999999999 -0.029558000000000001 0.16178300000000001 -0.0143368 -0.056185400000000003 0.111277 0.037371300000000003 -0.040984 0.110496 0.037088299999999998 -0.032005499999999999 0.110468 0.037043800000000002 0.025003299999999999 0.110611 0.036845900000000001 -0.046987000000000001 0.14743400000000001 -0.00222536 -0.018340700000000001 0.035236200000000002 0.0507938 -0.017840600000000002 0.170484 -0.0181143 -0.056947200000000003 0.034941600000000003 0.042371699999999998 0.0058333899999999999 0.035107600000000003 0.042091400000000001 -0.042802399999999997 0.035157399999999998 0.041687200000000001 -0.066461999999999993 0.104777 -0.0148582 0.025745199999999999 0.045913700000000002 0.0381185 0.037945100000000002 0.081716700000000003 -0.014154699999999999 -0.084426200000000007 0.079771400000000006 0.018633199999999999 0.053250400000000003 0.04759 0.0181903 0.0186424 0.053603499999999998 0.046214999999999999 0.0073251499999999999 0.118243 -0.015301199999999999 -0.031470400000000003 0.15706600000000001 0.00097621600000000002 0.0286229 0.056876000000000003 0.040763500000000001 0.058159099999999998 0.055001599999999998 0.0180254 0.016864000000000001 0.089935000000000001 -0.026910400000000001 0.0145778 0.058576900000000001 0.050169100000000001 0.036724800000000002 0.091818399999999994 0.036624799999999999 -0.019880100000000001 0.166404 -0.011269899999999999 0.0150294 0.067735699999999996 0.052067099999999998 0.021052399999999999 0.068116099999999999 0.048434600000000001 0.029877600000000001 0.067993600000000001 0.041917200000000002 0.036835800000000002 0.067849499999999993 0.036641 0.0574748 0.068221799999999999 0.017142500000000001 0.031684200000000003 0.078508700000000001 -0.019207999999999999 -0.0760271 0.175704 -0.050693700000000001 -0.065539600000000003 0.060788500000000002 0.017570700000000002 -0.080602599999999996 0.081447000000000006 0.030651600000000001 0.018974899999999999 0.121506 -0.0069456500000000003 0.030683999999999999 0.079546099999999995 0.0431507 0.037188800000000001 0.079248399999999997 0.036793699999999999 0.041936599999999997 0.079591099999999998 0.029591099999999999 0.046031999999999997 0.079369400000000007 0.017769400000000001 -0.078792100000000004 0.070777300000000001 0.0068558500000000001 -0.0293987 0.11591700000000001 -0.014706500000000001 -0.086992399999999998 0.11351799999999999 0.0041040900000000003 -0.0142186 0.174013 -0.025980699999999999 0.017479499999999999 0.035213099999999997 -0.0059285600000000003 0.016214099999999999 0.035847499999999997 -0.016213100000000001 0.0193248 0.035832200000000002 0.031320599999999997 0.0435544 0.041110099999999997 0.0057991600000000003 0.0226191 0.040605200000000001 -0.0079354400000000002 0.0191348 0.042782000000000001 -0.019209500000000001 0.041463300000000002 0.0456301 -0.0035451300000000001 0.043692500000000002 0.041196799999999999 0.01772 0.051287199999999998 0.046395899999999997 0.0058053100000000002 0.028577700000000001 0.105181 -0.0142381 0.030674799999999999 0.044512400000000001 -0.0061799300000000001 -0.018411799999999999 0.094805899999999999 -0.030743400000000001 -0.031548399999999997 0.034302300000000001 -0.028408099999999999 0.026038100000000002 0.047590199999999999 -0.016579400000000001 0.055419700000000002 0.068637799999999999 0.0058965299999999997 0.052037399999999998 0.055072999999999997 -0.0024816 0.056737500000000003 0.054222399999999997 0.0051248300000000004 0.0428049 0.055328599999999999 -0.0060470400000000001 -0.062003700000000002 0.16742199999999999 -0.052716499999999999 0.034112799999999999 0.054177599999999999 -0.0094834600000000008 0.029517999999999999 0.056056399999999999 -0.017587499999999999 -0.017788700000000001 0.115911 -0.015783800000000001 -0.041783800000000003 0.035760199999999999 -0.026410699999999999 -0.0051893900000000003 0.043046000000000001 -0.027333300000000001 -0.066405900000000004 0.034364899999999997 -0.0041666799999999999 0.047541399999999998 0.0712174 0.0054261700000000001 0.0249138 0.082516300000000001 -0.024587700000000001 -0.029902399999999999 0.042603099999999998 -0.0283179 0.021812100000000001 0.0515865 -0.023649199999999999 -0.027153699999999999 0.035160799999999999 0.050926699999999998 0.0161181 0.11563 -0.0145451 0.031738000000000002 0.067998299999999998 -0.0183532 0.041822600000000001 0.0675201 -0.0055155500000000001 0.051487100000000001 0.063727900000000004 -0.0017479399999999999 -0.089330300000000001 0.12830900000000001 0.042802300000000001 0.0459385 0.079630699999999999 0.0057963199999999998 -0.070543300000000003 0.149897 -0.0387319 -0.042961699999999999 0.043024199999999999 -0.0176288 -0.071967699999999996 0.17784800000000001 -0.0474604 -0.076052900000000007 0.177651 -0.047145699999999999 0.030417300000000001 0.118495 0.0057381400000000001 -0.077145099999999994 0.16770599999999999 -0.029879800000000001 0.020266800000000001 0.092860999999999999 -0.023736299999999998 -0.025481500000000001 0.079869700000000002 0.051054599999999999 -0.065054100000000004 0.0353259 0.016223700000000001 -0.064767599999999995 0.035079199999999998 0.029448100000000001 -0.064426700000000003 0.041459099999999999 0.030447599999999998 -0.064320000000000002 0.035226100000000003 0.038791399999999997 -0.067599999999999993 0.034029900000000002 0.0059049100000000002 -0.067953399999999997 0.041858800000000002 0.0066839400000000002 -0.057349700000000003 0.0431548 0.0200229 -0.063463199999999997 0.041432099999999999 0.014205199999999999 -0.059413000000000001 0.047138199999999998 0.0062853800000000001 -0.023383399999999999 0.065641599999999994 0.045097600000000002 -0.063537999999999997 0.071665000000000006 0.037946300000000002 -0.019303600000000001 0.081012799999999996 -0.038431800000000002 -0.042720599999999997 0.034355700000000003 -0.0191302 -0.0069023699999999997 0.034639999999999997 -0.020217099999999998 -0.065678700000000007 0.0408332 -0.0040179300000000003 -0.0383907 0.041921800000000002 -0.026403900000000001 -0.0556585 0.043286600000000001 -0.0075883399999999998 -0.0416785 0.042027599999999998 -0.0099967900000000002 -0.032229399999999998 0.044659299999999999 -0.016749900000000002 -0.030738499999999998 0.056330699999999997 -0.018516999999999999 -0.042902599999999999 0.056189700000000002 -0.0113043 -0.055028500000000001 0.056655700000000003 -0.0053137499999999999 -0.026185799999999999 0.056883599999999999 -0.0282694 -0.055218900000000001 0.117461 -0.0133744 -0.019065800000000001 0.054669500000000003 -0.0318646 -0.068762900000000002 0.068669400000000005 -0.0065494100000000003 -0.073050400000000001 0.065420000000000006 0.0055285899999999999 -0.020723399999999999 0.0672793 -0.036553000000000002 -0.029079199999999999 0.067426 -0.029052100000000001 -0.032805599999999997 0.066463700000000001 -0.019521500000000001 -0.0177608 0.034331899999999999 -0.025914199999999998 -0.077368699999999999 0.073257100000000006 -0.0040977100000000001 0.015161600000000001 0.12610399999999999 -0.00266395 -0.084525500000000003 0.080057199999999995 0.00530702 -0.079351699999999997 0.079855899999999994 -0.0064056499999999997 -0.030972800000000002 0.079470100000000002 -0.031247500000000001 -0.035514400000000002 0.081800999999999999 -0.022688699999999999 -0.068140999999999993 0.080122700000000005 -0.016427799999999999 -0.051293199999999997 0.034227 -0.012901299999999999 0.016192399999999999 0.080478999999999995 -0.029217400000000001 -0.0144478 0.087927400000000003 -0.0380297 -0.0173157 0.043267399999999998 -0.028290599999999999 -0.019332800000000001 0.097925100000000001 -0.024792000000000002 -0.055547899999999997 0.033681599999999999 -0.0061901300000000003 0.0070262700000000003 0.097841800000000007 -0.024605499999999999 -0.0148892 0.12606800000000001 -0.00252126 0.017520500000000001 0.055211400000000001 -0.027275600000000001 -0.0095366099999999992 0.079410400000000006 -0.037985900000000003 0.0052426599999999997 0.039133599999999998 -0.021947000000000001 0.017565299999999999 0.067933900000000005 -0.028938800000000001 -0.0057907000000000002 0.128077 -0.0028510499999999999 0.0062655599999999999 0.12804699999999999 -0.0031705000000000001 0.0055997900000000003 0.034660400000000001 -0.017931800000000001 0.029824 0.0359142 0.0048897699999999999 0.0062519300000000002 0.045962299999999998 -0.026378200000000001 0.014325299999999999 0.047348399999999999 -0.025151300000000001 0.0060408600000000003 0.055507300000000002 -0.030431400000000001 -0.0061341299999999998 0.054637199999999997 -0.032634999999999997 -0.034669400000000003 0.057124000000000001 -0.0114953 -0.0068454299999999996 0.067974199999999999 -0.035940600000000003 0.0056557999999999999 0.067623699999999995 -0.032919900000000002 -0.056973200000000002 0.065162800000000007 -0.0095821900000000008 -0.042279600000000001 0.069994399999999998 -0.016146299999999999 -0.017571900000000001 0.070547299999999993 -0.038226099999999999 -0.055586000000000003 0.072298299999999996 -0.016121799999999999 -0.063788399999999995 0.071269700000000005 -0.013853499999999999 0.0056856099999999998 0.079054700000000006 -0.033918900000000002 -0.0033842899999999999 0.080451099999999998 -0.036722600000000001 -0.024898799999999999 0.081500400000000001 -0.037107800000000003 -0.041251299999999998 0.079137799999999994 -0.0197746 -0.073581900000000006 0.077702599999999997 -0.012202299999999999 -0.018062000000000002 0.035262700000000001 -0.019540100000000001 -0.031577000000000001 0.035848699999999997 -0.017966900000000001 -0.0060203399999999999 0.038123700000000003 -0.014518400000000001 -0.017781100000000001 0.0382546 -0.0154503 0.0075344699999999997 0.035559599999999997 -0.0065006300000000003 0.0043043700000000001 0.038401699999999997 -0.0071754000000000002 -0.0059393500000000004 0.038948000000000003 -0.0059212900000000001 -0.0176142 0.038605500000000001 -0.0058450799999999999 -0.043030800000000001 0.034139099999999999 -0.00565972 0.0189222 0.035107600000000003 0.0049976899999999999 -0.029912899999999999 0.0383912 -0.0058267700000000002 0.00512066 0.034839799999999997 0.0055849799999999998 0.00103528 0.037591699999999999 0.00095222199999999996 -0.0058471399999999998 0.038341899999999998 0.0059080299999999999 -0.042462100000000003 0.034314400000000002 0.00590597 -0.017873 0.038316599999999999 0.0059947100000000003 0.028662 0.035841100000000001 0.018749600000000002 -0.055025999999999999 0.033620400000000002 0.0058381600000000002 -0.0284733 0.038148899999999999 0.0044185300000000004 -0.00094700600000000002 0.035737400000000002 0.010346899999999999 0.0193224 0.035181400000000002 0.019661600000000001 -0.034232499999999999 0.033758999999999997 0.0071751699999999998 0.0053602199999999997 0.034595599999999997 0.017987099999999999 -0.000385714 0.035145900000000001 0.0134171 0.033411900000000001 0.037617900000000003 0.021008200000000001 -0.0058979100000000001 0.038178200000000002 0.017706199999999998 -0.035244499999999998 0.035057100000000001 0.0178257 -0.017807799999999999 0.0381962 0.017811400000000002 -0.026189799999999999 0.0377592 0.017704399999999999 -0.056324699999999998 0.033676200000000003 0.0175265 0.0011411399999999999 0.037661 0.022341400000000001 0.010025299999999999 0.035502899999999997 0.029655999999999998 0.0055012699999999999 0.038555600000000002 0.0296609 -0.0059658100000000002 0.038894600000000001 0.029925199999999999 -0.0330745 0.035521700000000003 0.029223599999999999 -0.0277717 0.0382563 0.032286500000000003 -0.017909100000000001 0.038590199999999998 0.029616699999999999 -0.041940400000000003 0.034369799999999999 0.029966799999999998 0.015243 0.0356116 0.041269199999999999 -0.055430100000000003 0.034255500000000001 0.029795200000000001 -0.066051499999999999 0.061114399999999999 0.0058554799999999997 -0.0065491200000000003 0.035037199999999998 0.045395900000000003 -0.0307826 0.034759600000000002 0.043295899999999998 -0.018083399999999999 0.034814199999999997 0.0458772</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 39 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63 67 68 66 70 71 69 73 74 72 76 77 75 79 80 78 82 83 81 85 86 84 88 89 87 91 92 90 94 95 93 97 98 96 100 101 99 103 104 102 106 107 105 109 110 108 112 113 111 115 116 114 118 119 117 121 122 120 124 125 123 127 128 126 130 131 129 133 134 132 136 137 135 139 140 138 142 143 141 145 146 144 148 149 147 151 152 150 154 155 153 157 158 156 160 161 159 163 164 162 166 167 165 169 170 168 172 173 171 175 176 174 178 179 177 181 182 180 184 185 183 187 188 186 190 191 189 193 194 192 196 197 195 199 200 198 202 203 201 205 206 204 208 209 207 211 212 210 214 215 213 217 218 216 220 221 219 223 224 222 226 227 225 229 230 228 232 233 231 235 236 234 238 239 237 241 242 240 244 245 243 247 248 246 250 251 249 253 254 252 256 257 255 259 260 258 262 263 261 265 266 264 268 269 267 271 272 270 274 275 273 277 278 276 280 281 279 283 284 282 286 287 285 289 290 288 292 293 291 295 296 294 298 299 297 301 302 300 304 305 303 307 308 306 310 311 309 313 314 312 316 317 315 319 320 318 322 323 321 325 326 324 328 329 327 331 332 330 334 335 333 337 338 336 340 341 339 343 344 342 346 347 345 349 350 348 352 353 351 355 356 354 358 359 357 361 362 360 364 365 363 367 368 366 370 371 369 373 374 372 376 377 375 379 380 378 382 383 381 385 386 384 388 389 387 391 392 390 394 395 393 397 398 396 400 401 399 403 404 402 406 407 405 409 410 408 412 413 411 415 416 414 418 419 417 421 422 420 424 425 423 427 428 426 430 431 429 433 434 432 436 437 435 439 440 438 442 443 441 445 446 444 448 449 447 451 452 450 454 455 453 457 458 456 460 461 459 463 464 462 466 467 465 469 470 468 472 473 471 475 476 474 478 479 477 481 482 480 484 485 483 487 488 486 490 491 489 493 494 492 496 497 495 499 500 498 502 503 501 505 506 504 508 509 507 511 512 510 514 515 513 517 518 516 520 521 519 523 524 522 526 527 525 529 530 528 532 533 531 535 536 534 538 539 537 541 542 540 544 545 543 547 548 546 550 551 549 553 554 552 556 557 555 559 560 558 562 563 561 565 566 564 568 569 567 571 572 570 574 575 573 577 578 576 580 581 579 583 584 582 586 587 585 589 590 588 592 593 591 595 596 594 598 599 597 601 602 600 604 605 603 607 608 606 610 611 609 613 614 612 616 617 615 619 620 618 622 623 621 625 626 624 628 629 627 631 632 630 634 635 633 637 638 636 640 641 639 643 644 642 646 647 645 649 650 648 652 653 651 655 656 654 658 659 657 661 662 660 664 665 663 667 668 666 670 671 669 673 674 672 676 677 675 679 680 678 682 683 681 685 686 684 688 689 687 691 692 690 694 695 693 697 698 696 700 701 699 703 704 702 706 707 705 709 710 708 712 713 711 715 716 714 718 719 717 721 722 720 724 725 723 727 728 726 730 731 729 733 734 732 736 737 735 739 740 738 742 743 741 745 746 744 748 749 747 751 752 750 754 755 753 757 758 756 760 761 759 763 764 762 766 767 765 769 770 768 772 773 771 775 776 774 778 779 777 781 782 780 784 785 783 787 788 786 790 791 789 793 794 792 796 797 795 799 800 798 802 803 801 805 806 804 808 809 807 811 812 810 814 815 813 817 818 816 820 821 819 823 824 822 826 827 825 829 830 828 832 833 831 835 836 834 838 839 837 841 842 840 844 845 843 847 848 846 850 851 849 853 854 852 856 857 855 859 860 858 862 863 861 865 866 864 868 869 867 871 872 870 874 875 873 877 878 876 880 881 879 883 884 882 886 887 885 889 890 888 892 893 891 895 896 894 898 899 897 901 902 900 904 905 903 907 908 906 910 911 909 913 914 912 916 917 915 919 920 918 922 923 921 925 926 924 928 929 927 931 932 930 934 935 933 937 938 936 940 941 939 943 944 942 946 947 945 949 950 948 952 953 951 955 956 954 958 959 957 961 962 960 964 965 963 967 968 966 970 971 969 973 974 972 976 977 975 979 980 978 982 983 981 985 986 984 988 989 987 991 992 990 994 995 993 997 998 996 1000 1001 999 1003 1004 1002 1006 1007 1005 1009 1010 1008 1012 1013 1011 1015 1016 1014 1018 1019 1017 1021 1022 1020 1024 1025 1023 1027 1028 1026 1030 1031 1029 1033 1034 1032 1036 1037 1035 1039 1040 1038 1042 1043 1041 1045 1046 1044 1048 1049 1047 1051 1052 1050 1054 1055 1053 1057 1058 1056 1060 1061 1059 1063 1064 1062 1066 1067 1065 1069 1070 1068 1072 1073 1071 1075 1076 1074 1078 1079 1077 1081 1082 1080 1084 1085 1083 1087 1088 1086 1090 1091 1089 1093 1094 1092 1096 1097 1095 1099 1100 1098 1102 1103 1101 1105 1106 1104 1108 1109 1107 1111 1112 1110 1114 1115 1113 1117 1118 1116 1120 1121 1119 1123 1124 1122 1126 1127 1125 1129 1130 1128 1132 1133 1131 1135 1136 1134 1138 1139 1137 1141 1142 1140 1144 1145 1143 1147 1148 1146 1150 1151 1149 1153 1154 1152 1156 1157 1155 1159 1160 1158 1162 1163 1161 1165 1166 1164 1168 1169 1167 1171 1172 1170 1174 1175 1173 1177 1178 1176 1180 1181 1179 1183 1184 1182 1186 1187 1185 1189 1190 1188 1192 1193 1191 1195 1196 1194 1198 1199 1197 1201 1202 1200 1204 1205 1203 1207 1208 1206 1210 1211 1209 1213 1214 1212 1216 1217 1215 1219 1220 1218 1222 1223 1221 1225 1226 1224 1228 1229 1227 1231 1232 1230 1234 1235 1233 1237 1238 1236 1240 1241 1239 1243 1244 1242 1246 1247 1245 1249 1250 1248 1252 1253 1251 1255 1256 1254 1258 1259 1257 1261 1262 1260 1264 1265 1263 1267 1268 1266 1270 1271 1269 1273 1274 1272 1276 1277 1275 1279 1280 1278 1282 1283 1281 1285 1286 1284 1288 1289 1287 1291 1292 1290 1294 1295 1293 1297 1298 1296 1300 1301 1299 1303 1304 1302 1306 1307 1305 1309 1310 1308 1312 1313 1311 1315 1316 1314 1318 1319 1317 1321 1322 1320 1324 1325 1323 1327 1328 1326 1330 1331 1329 1333 1334 1332 1336 1337 1335 1339 1340 1338 1342 1343 1341 1345 1346 1344 1348 1349 1347 1351 1352 1350 1354 1355 1353 1357 1358 1356 1360 1361 1359 1363 1364 1362 1366 1367 1365 1369 1370 1368 1372 1373 1371 1375 1376 1374 1378 1379 1377 1381 1382 1380 1384 1385 1383 1387 1388 1386 1390 1391 1389 1393 1394 1392 1396 1397 1395 1399 1400 1398 1402 1403 1401 1405 1406 1404 1408 1409 1407 1411 1412 1410 1414 1415 1413 1417 1418 1416 1420 1421 1419 1423 1424 1422 1426 1427 1425 1429 1430 1428 1432 1433 1431 1435 1436 1434 1438 1439 1437 1441 1442 1440 1444 1445 1443 1447 1448 1446 1450 1451 1449 1453 1454 1452 1456 1457 1455 1459 1460 1458 1462 1463 1461 1465 1466 1464 1468 1469 1467 1471 1472 1470 1474 1475 1473 1477 1478 1476 1480 1481 1479 1483 1484 1482 1486 1487 1485 1489 1490 1488 1492 1493 1491 1495 1496 1494 1498 1499 1497 1501 1502 1500 1504 1505 1503 1507 1508 1506 1510 1511 1509 1513 1514 1512 1516 1517 1515 1519 1520 1518 1522 1523 1521 1525 1526 1524 1528 1529 1527 1531 1532 1530 1534 1535 1533 1537 1538 1536 1540 1541 1539 1543 1544 1542 1546 1547 1545 1549 1550 1548 1552 1553 1551 1555 1556 1554 1558 1559 1557 1561 1562 1560 1564 1565 1563 1567 1568 1566 1570 1571 1569 1573 1574 1572 1576 1577 1575 1579 1580 1578 1582 1583 1581 1585 1586 1584 1588 1589 1587 1591 1592 1590 1594 1595 1593 1597 1598 1596 1600 1601 1599 1603 1604 1602 1606 1607 1605 1609 1610 1608 1612 1613 1611 1615 1616 1614 1618 1619 1617 1621 1622 1620 1624 1625 1623 1627 1628 1626 1630 1631 1629 1633 1634 1632 1636 1637 1635 1639 1640 1638 1642 1643 1641 1645 1646 1644 1648 1649 1647 1651 1652 1650 1654 1655 1653 1657 1658 1656 1660 1661 1659 1663 1664 1662 1666 1667 1665 1669 1670 1668 1672 1673 1671 1675 1676 1674 1678 1679 1677 1681 1682 1680 1684 1685 1683 1687 1688 1686 1690 1691 1689 1693 1694 1692 1696 1697 1695 1699 1700 1698 1702 1703 1701 1705 1706 1704 1708 1709 1707 1711 1712 1710 1714 1715 1713 1717 1718 1716 1720 1721 1719 1723 1724 1722 1726 1727 1725 1729 1730 1728 1732 1733 1731 1735 1736 1734 1738 1739 1737 1741 1742 1740 1744 1745 1743 1747 1748 1746 1750 1751 1749 1753 1754 1752 1756 1757 1755 1759 1760 1758 1762 1763 1761 1765 1766 1764 1768 1769 1767 1771 1772 1770 1774 1775 1773 1777 1778 1776 1780 1781 1779 1783 1784 1782 1786 1787 1785 1789 1790 1788 1792 1793 1791 1795 1796 1794 1798 1799 1797 1801 1802 1800 1804 1805 1803 1807 1808 1806 1810 1811 1809 1813 1814 1812 1816 1817 1815 1819 1820 1818 1822 1823 1821 1825 1826 1824 1828 1829 1827 1831 1832 1830 1834 1835 1833 1837 1838 1836 1840 1841 1839 1843 1844 1842 1846 1847 1845 1849 1850 1848 1852 1853 1851 1855 1856 1854 1858 1859 1857 1861 1862 1860 1864 1865 1863 1867 1868 1866 1870 1871 1869 1873 1874 1872 1876 1877 1875 1879 1880 1878 1882 1883 1881 1885 1886 1884 1888 1889 1887 1891 1892 1890 1894 1895 1893 1897 1898 1896 1900 1901 1899 1903 1904 1902 1906 1907 1905 1909 1910 1908 1912 1913 1911 1915 1916 1914 1918 1919 1917 1921 1922 1920 1924 1925 1923 1927 1928 1926 1930 1931 1929 1933 1934 1932 1936 1937 1935 1939 1940 1938 1942 1943 1941 1945 1946 1944 1948 1949 1947 1951 1952 1950 1954 1955 1953 1957 1958 1956 1960 1961 1959 1963 1964 1962 1966 1967 1965 1969 1970 1968 1972 1973 1971 1975 1976 1974 1978 1979 1977 1981 1982 1980 1984 1985 1983 1987 1988 1986 1990 1991 1989 1993 1994 1992 1996 1997 1995 1999 2000 1998 2002 2003 2001 2005 2006 2004 2008 2009 2007 2011 2012 2010 2014 2015 2013 2017 2018 2016 2020 2021 2019 2023 2024 2022 2026 2027 2025 2029 2030 2028 2032 2033 2031 2035 2036 2034 2038 2039 2037 2041 2042 2040 2044 2045 2043 2047 2048 2046 2050 2051 2049 2053 2054 2052 2056 2057 2055 2059 2060 2058 2062 2063 2061 2065 2066 2064 2068 2069 2067 2071 2072 2070 2074 2075 2073 2077 2078 2076 2080 2081 2079 2083 2084 2082 2086 2087 2085 2089 2090 2088 2092 2093 2091 2095 2096 2094 2098 2099 2097 2101 2102 2100 2104 2105 2103 2107 2108 2106 2110 2111 2109 2113 2114 2112 2116 2117 2115 2119 2120 2118 2122 2123 2121 2125 2126 2124 2128 2129 2127 2131 2132 2130 2134 2135 2133 2137 2138 2136 2140 2141 2139 2143 2144 2142 2146 2147 2145 2149 2150 2148 2152 2153 2151 2155 2156 2154 2158 2159 2157 2161 2162 2160 2164 2165 2163 2167 2168 2166 2170 2171 2169 2173 2174 2172 2176 2177 2175 2179 2180 2178 2182 2183 2181 2185 2186 2184 2188 2189 2187 2191 2192 2190 2194 2195 2193 2197 2198 2196 2200 2201 2199 2203 2204 2202 2206 2207 2205 2209 2210 2208 2212 2213 2211 2215 2216 2214 2218 2219 2217 2221 2222 2220 2224 2225 2223 2227 2228 2226 2230 2231 2229 2233 2234 2232 2236 2237 2235 2239 2240 2238 2242 2243 2241 2245 2246 2244 2248 2249 2247 2251 2252 2250 2254 2255 2253 2257 2258 2256 2260 2261 2259 2263 2264 2262 2266 2267 2265 2269 2270 2268 2272 2273 2271 2275 2276 2274 2278 2279 2277 2281 2282 2280 2284 2285 2283 2287 2288 2286 2290 2291 2289 2293 2294 2292 2296 2297 2295 2299 2300 2298 2302 2303 2301 2305 2306 2304 2308 2309 2307 2311 2312 2310 2314 2315 2313 2317 2318 2316 2320 2321 2319 2323 2324 2322 2326 2327 2325 2329 2330 2328 2332 2333 2331 2335 2336 2334 2338 2339 2337 2341 2342 2340 2344 2345 2343 2347 2348 2346 2350 2351 2349 2353 2354 2352 2356 2357 2355 2359 2360 2358 2362 2363 2361 2365 2366 2364 2368 2369 2367 2371 2372 2370 2374 2375 2373 2377 2378 2376 2380 2381 2379 2383 2384 2382 2386 2387 2385 2389 2390 2388 2392 2393 2391 2395 2396 2394 2398 2399 2397 2401 2402 2400 2404 2405 2403 2407 2408 2406 2410 2411 2409 2413 2414 2412 2416 2417 2415 2419 2420 2418 2422 2423 2421 2425 2426 2424 2428 2429 2427 2431 2432 2430 2434 2435 2433 2437 2438 2436 2440 2441 2439 2443 2444 2442 2446 2447 2445 2449 2450 2448 2452 2453 2451 2455 2456 2454 2458 2459 2457 2461 2462 2460 2464 2465 2463 2467 2468 2466 2470 2471 2469 2473 2474 2472 2476 2477 2475 2479 2480 2478 2482 2483 2481 2485 2486 2484 2488 2489 2487 2491 2492 2490 2494 2495 2493 2497 2498 2496 2500 2501 2499 2503 2504 2502 2506 2507 2505 2509 2510 2508 2512 2513 2511 2515 2516 2514 2518 2519 2517 2521 2522 2520 2524 2525 2523 2527 2528 2526 2530 2531 2529 2533 2534 2532 2536 2537 2535 2539 2540 2538 2542 2543 2541 2545 2546 2544 2548 2549 2547 2551 2552 2550 2554 2555 2553 2557 2558 2556 2560 2561 2559 2563 2564 2562 2566 2567 2565 2569 2570 2568 2572 2573 2571 2575 2576 2574 2578 2579 2577 2581 2582 2580 2584 2585 2583 2587 2588 2586 2590 2591 2589 2593 2594 2592 2596 2597 2595 2599 2600 2598 2602 2603 2601 2605 2606 2604 2608 2609 2607 2611 2612 2610 2614 2615 2613 2617 2618 2616 2620 2621 2619 2623 2624 2622 2626 2627 2625 2629 2630 2628 2632 2633 2631 2635 2636 2634 2638 2639 2637 2641 2642 2640 2644 2645 2643 2647 2648 2646 2650 2651 2649 2653 2654 2652 2656 2657 2655 2659 2660 2658 2662 2663 2661 2665 2666 2664 2668 2669 2667 2671 2672 2670 2674 2675 2673 2677 2678 2676 2680 2681 2679 2683 2684 2682 2686 2687 2685 2689 2690 2688 2692 2693 2691 2695 2696 2694 2698 2699 2697 2701 2702 2700 2704 2705 2703 2707 2708 2706 2710 2711 2709 2713 2714 2712 2716 2717 2715 2719 2720 2718 2722 2723 2721 2725 2726 2724 2728 2729 2727 2731 2732 2730 2734 2735 2733 2737 2738 2736 2740 2741 2739 2743 2744 2742 2746 2747 2745 2749 2750 2748 2752 2753 2751 2755 2756 2754 2758 2759 2757 2761 2762 2760 2764 2765 2763 2767 2768 2766 2770 2771 2769 2773 2774 2772 2776 2777 2775 2779 2780 2778 2782 2783 2781 2785 2786 2784 2788 2789 2787 2791 2792 2790 2794 2795 2793 2797 2798 2796 2800 2801 2799 2803 2804 2802 2806 2807 2805 2809 2810 2808 2812 2813 2811 2815 2816 2814 2818 2819 2817 2821 2822 2820 2824 2825 2823 2827 2828 2826 2830 2831 2829 2833 2834 2832 2836 2837 2835 2839 2840 2838 2842 2843 2841</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 945 948 951 954 957 960 963 966 969 972 975 978 981 984 987 990 993 996 999 1002 1005 1008 1011 1014 1017 1020 1023 1026 1029 1032 1035 1038 1041 1044 1047 1050 1053 1056 1059 1062 1065 1068 1071 1074 1077 1080 1083 1086 1089 1092 1095 1098 1101 1104 1107 1110 1113 1116 1119 1122 1125 1128 1131 1134 1137 1140 1143 1146 1149 1152 1155 1158 1161 1164 1167 1170 1173 1176 1179 1182 1185 1188 1191 1194 1197 1200 1203 1206 1209 1212 1215 1218 1221 1224 1227 1230 1233 1236 1239 1242 1245 1248 1251 1254 1257 1260 1263 1266 1269 1272 1275 1278 1281 1284 1287 1290 1293 1296 1299 1302 1305 1308 1311 1314 1317 1320 1323 1326 1329 1332 1335 1338 1341 1344 1347 1350 1353 1356 1359 1362 1365 1368 1371 1374 1377 1380 1383 1386 1389 1392 1395 1398 1401 1404 1407 1410 1413 1416 1419 1422 1425 1428 1431 1434 1437 1440 1443 1446 1449 1452 1455 1458 1461 1464 1467 1470 1473 1476 1479 1482 1485 1488 1491 1494 1497 1500 1503 1506 1509 1512 1515 1518 1521 1524 1527 1530 1533 1536 1539 1542 1545 1548 1551 1554 1557 1560 1563 1566 1569 1572 1575 1578 1581 1584 1587 1590 1593 1596 1599 1602 1605 1608 1611 1614 1617 1620 1623 1626 1629 1632 1635 1638 1641 1644 1647 1650 1653 1656 1659 1662 1665 1668 1671 1674 1677 1680 1683 1686 1689 1692 1695 1698 1701 1704 1707 1710 1713 1716 1719 1722 1725 1728 1731 1734 1737 1740 1743 1746 1749 1752 1755 1758 1761 1764 1767 1770 1773 1776 1779 1782 1785 1788 1791 1794 1797 1800 1803 1806 1809 1812 1815 1818 1821 1824 1827 1830 1833 1836 1839 1842 1845 1848 1851 1854 1857 1860 1863 1866 1869 1872 1875 1878 1881 1884 1887 1890 1893 1896 1899 1902 1905 1908 1911 1914 1917 1920 1923 1926 1929 1932 1935 1938 1941 1944 1947 1950 1953 1956 1959 1962 1965 1968 1971 1974 1977 1980 1983 1986 1989 1992 1995 1998 2001 2004 2007 2010 2013 2016 2019 2022 2025 2028 2031 2034 2037 2040 2043 2046 2049 2052 2055 2058 2061 2064 2067 2070 2073 2076 2079 2082 2085 2088 2091 2094 2097 2100 2103 2106 2109 2112 2115 2118 2121 2124 2127 2130 2133 2136 2139 2142 2145 2148 2151 2154 2157 2160 2163 2166 2169 2172 2175 2178 2181 2184 2187 2190 2193 2196 2199 2202 2205 2208 2211 2214 2217 2220 2223 2226 2229 2232 2235 2238 2241 2244 2247 2250 2253 2256 2259 2262 2265 2268 2271 2274 2277 2280 2283 2286 2289 2292 2295 2298 2301 2304 2307 2310 2313 2316 2319 2322 2325 2328 2331 2334 2337 2340 2343 2346 2349 2352 2355 2358 2361 2364 2367 2370 2373 2376 2379 2382 2385 2388 2391 2394 2397 2400 2403 2406 2409 2412 2415 2418 2421 2424 2427 2430 2433 2436 2439 2442 2445 2448 2451 2454 2457 2460 2463 2466 2469 2472 2475 2478 2481 2484 2487 2490 2493 2496 2499 2502 2505 2508 2511 2514 2517 2520 2523 2526 2529 2532 2535 2538 2541 2544 2547 2550 2553 2556 2559 2562 2565 2568 2571 2574 2577 2580 2583 2586 2589 2592 2595 2598 2601 2604 2607 2610 2613 2616 2619 2622 2625 2628 2631 2634 2637 2640 2643 2646 2649 2652 2655 2658 2661 2664 2667 2670 2673 2676 2679 2682 2685 2688 2691 2694 2697 2700 2703 2706 2709 2712 2715 2718 2721 2724 2727 2730 2733 2736 2739 2742 2745 2748 2751 2754 2757 2760 2763 2766 2769 2772 2775 2778 2781 2784 2787 2790 2793 2796 2799 2802 2805 2808 2811 2814 2817 2820 2823 2826 2829 2832 2835 2838 2841</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">164 94 98 224 335 49 331 350 376 124 122 237 61 89 69 61 161 94 24 89 50 109 25 35 27 34 152 444 443 435 94 35 153 3 61 69 24 69 89 38 218 104 22 42 39 14 24 34 290 166 371 226 76 224 204 197 72 82 3 14 13 81 23 99 13 23 23 110 30 110 2 30 166 265 371 90 61 3 34 24 50 293 167 207 80 78 85 61 94 164 84 238 80 4 161 61 132 149 64 196 22 228 59 46 242 179 84 80 265 96 371 52 258 207 121 127 141 343 168 346 232 227 220 232 243 227 232 246 243 57 126 56 57 130 126 221 232 220 4 61 90 134 80 85 176 217 175 4 0 161 78 21 50 126 130 129 56 126 129 111 182 201 96 70 371 89 164 98 123 6 55 197 87 72 416 419 412 245 80 179 21 78 36 61 164 89 67 132 64 150 149 132 384 387 325 214 221 112 214 233 232 221 214 232 244 246 232 233 244 232 244 252 246 244 143 119 252 244 119 127 142 141 67 150 132 82 90 3 112 180 214 244 253 143 111 201 269 37 74 63 133 150 67 118 133 67 133 180 150 191 214 180 181 191 180 191 234 233 214 191 233 234 244 233 234 7 244 244 98 253 253 98 143 216 217 115 181 180 133 15 16 219 254 98 244 7 254 244 74 11 63 14 3 24 3 69 24 217 216 175 85 78 50 73 78 80 7 98 254 105 133 118 1 248 196 48 241 100 42 156 39 149 173 344 135 133 105 106 135 105 31 7 234 148 31 234 89 98 7 31 89 7 235 84 230 14 27 236 106 125 135 19 20 62 131 54 159 34 50 21 82 14 236 201 52 43 310 308 280 131 159 54 271 310 280 27 14 34 177 89 31 238 73 80 130 176 175 354 331 381 129 130 175 125 136 135 251 52 201 106 56 125 56 129 136 125 56 136 129 175 174 136 129 174 175 216 215 174 175 215 115 114 215 216 115 215 134 85 31 85 177 31 50 89 177 85 50 177 179 80 245 400 407 367 263 83 121 217 179 115 149 132 64 178 187 116 142 178 116 326 120 319 57 83 267 304 391 294 355 354 359 128 29 11 267 273 130 48 16 10 301 302 266 196 66 22 230 84 217 247 13 243 110 81 13 271 178 266 110 13 247 278 277 267 48 10 329 258 11 275 1 196 228 154 247 243 154 110 247 263 141 270 154 60 110 60 154 110 154 60 110 11 74 37 274 5 51 252 154 243 119 252 243 109 110 60 39 2 110 109 39 110 32 128 29 32 128 11 309 300 311 252 119 154 73 145 255 67 64 259 32 29 128 258 275 43 154 119 60 119 109 60 137 256 248 270 267 83 235 238 84 267 130 57 258 32 11 302 310 271 51 238 235 266 302 271 5 36 255 51 235 230 51 145 73 286 51 230 287 274 286 119 25 109 10 40 289 120 48 329 274 51 286 276 230 217 10 16 15 51 5 145 43 11 201 176 276 217 143 25 119 158 207 167 360 321 357 130 273 276 122 198 237 270 278 267 77 218 38 15 6 40 280 187 178 271 280 178 258 207 32 66 58 22 279 287 278 155 139 172 121 141 263 288 41 274 287 288 274 276 176 130 289 288 205 274 41 5 288 287 279 329 10 289 16 100 219 127 178 142 273 267 276 252 119 243 116 279 141 41 123 5 116 288 279 142 116 141 207 158 32 276 277 230 101 102 163 299 298 294 287 286 278 5 255 145 131 159 70 275 11 43 32 158 250 205 288 116 73 36 78 120 329 319 297 391 300 84 179 217 17 77 38 255 36 73 263 270 83 249 248 1 286 230 277 11 37 66 43 52 258 267 277 276 279 278 270 141 279 270 51 73 238 47 36 5 201 66 269 201 11 66 309 310 302 300 309 302 182 33 251 278 286 277 243 246 252 416 427 419 96 131 70 66 256 111 65 335 189 113 374 407 144 139 155 226 224 139 358 400 396 30 91 203 226 139 144 46 328 242 307 304 298 70 159 54 103 265 284 443 261 446 17 38 28 88 200 239 72 170 211 138 17 28 35 1 228 295 299 294 18 131 140 18 59 131 207 258 52 188 70 54 104 87 197 222 48 120 325 326 311 326 281 120 54 159 292 386 299 295 138 59 17 48 100 16 59 242 17 296 121 83 10 15 40 242 91 17 225 9 211 314 322 384 326 325 281 170 225 211 17 91 77 144 76 226 155 9 225 159 131 28 172 139 170 131 138 28 281 264 120 264 222 120 139 155 225 139 225 170 314 325 313 386 295 390 292 159 28 132 149 344 424 427 416 49 335 65 314 313 304 111 269 66 9 71 72 211 9 72 306 316 353 307 314 304 325 311 313 40 41 288 289 40 288 40 6 41 6 123 41 22 39 109 165 312 76 299 307 298 144 165 76 312 107 76 376 381 331 165 107 312 155 172 330 35 228 22 45 184 160 42 62 156 2 39 62 58 42 22 49 71 9 280 116 187 280 205 116 155 330 144 280 289 205 319 280 308 162 77 20 20 77 91 329 289 280 319 329 280 156 62 39 372 408 375 190 1 0 1 35 0 42 19 62 35 161 0 190 0 97 35 22 109 76 53 224 161 35 94 49 9 155 224 49 155 29 63 11 160 162 19 76 333 53 153 25 143 71 49 65 2 20 30 62 20 2 55 8 5 169 0 4 6 8 55 35 25 153 160 218 162 218 77 162 15 334 6 334 8 6 332 76 93 8 47 5 98 153 143 94 153 98 219 334 15 332 333 76 93 76 107 100 334 219 160 19 45 19 162 20 340 132 344 45 19 42 27 47 8 27 36 47 80 115 179 45 42 58 71 184 45 236 27 8 334 236 8 332 93 333 27 152 36 223 64 340 236 334 117 152 21 36 134 148 115 115 148 114 152 34 21 5 123 55 337 68 191 333 93 282 256 66 196 135 174 347 183 180 195 117 285 236 182 111 63 354 318 352 114 234 68 71 65 184 135 136 174 191 215 337 337 215 114 63 33 182 133 135 181 135 347 181 110 23 81 157 180 183 149 157 183 227 147 220 12 23 30 151 99 46 174 215 191 99 328 46 114 148 234 149 150 157 220 147 284 79 186 336 68 234 191 396 357 356 99 23 12 328 99 12 337 114 68 356 358 396 338 343 342 223 340 339 265 103 96 341 223 339 347 174 191 182 251 201 134 115 80 12 30 203 345 343 338 147 227 103 33 108 251 95 20 91 181 347 191 345 346 343 157 150 180 103 227 18 66 240 58 345 344 346 146 32 108 445 125 444 30 95 91 124 373 374 137 249 72 344 345 338 344 168 346 12 203 328 284 147 103 240 66 37 344 173 168 314 384 322 107 282 93 76 53 107 107 53 282 282 53 333 165 76 107 315 202 291 165 144 76 407 374 367 144 53 76 388 389 92 155 144 330 144 224 53 432 431 434 155 189 144 144 189 224 189 335 53 224 189 53 146 29 32 382 88 209 331 316 350 331 353 316 357 367 366 360 357 366 367 374 373 366 367 373 373 407 374 388 92 169 170 65 155 155 65 189 328 203 91 413 421 414 356 331 358 242 328 91 168 343 346 113 198 122 124 113 122 239 200 315 331 356 357 372 26 102 375 372 102 26 163 102 408 372 375 72 87 65 170 72 65 87 184 65 63 108 11 63 29 108 370 285 231 389 370 231 131 18 140 33 63 108 368 306 321 374 113 124 285 324 268 231 285 268 336 272 186 224 155 139 363 369 372 86 193 163 208 63 111 380 305 202 356 357 321 346 354 352 346 168 354 168 359 354 364 290 369 363 364 369 290 371 372 369 290 372 371 70 26 372 371 26 70 188 26 188 54 26 54 163 26 54 86 163 54 28 86 28 38 86 38 197 86 38 104 197 104 218 87 218 160 87 160 184 87 58 240 208 240 37 63 208 240 63 340 64 132 343 168 346 400 367 357 396 400 357 54 292 28 96 103 18 346 168 343 249 137 248 200 209 199 79 222 281 327 308 309 343 346 352 383 388 169 200 88 209 285 186 324 241 48 79 16 100 79 303 100 79 323 105 451 100 303 186 100 16 79 321 353 331 236 285 370 389 231 92 100 285 117 108 63 11 186 303 79 88 382 209 82 236 389 100 241 79 45 72 71 0 169 97 45 137 72 285 100 186 137 45 58 199 378 305 208 137 58 356 331 357 305 380 202 378 349 305 169 92 315 192 262 75 361 192 75 291 202 237 258 293 207 272 79 377 324 186 268 268 186 88 90 389 388 169 315 291 97 169 291 79 320 377 4 383 169 379 317 368 200 202 315 92 239 315 306 353 321 370 389 236 48 222 79 206 361 185 361 206 185 92 231 239 356 321 331 190 171 185 249 190 185 206 198 361 198 192 361 90 388 383 305 124 237 327 311 326 4 90 383 190 249 1 206 361 185 171 206 185 202 305 237 108 29 146 308 310 309 334 100 117 90 82 389 79 336 186 224 53 335 354 381 318 231 268 239 186 272 209 88 186 209 200 199 202 327 326 319 308 327 319 309 311 327 435 443 446 199 305 202 97 171 190 171 97 206 97 291 206 237 198 206 291 237 206 406 124 305 399 402 400 373 374 407 300 304 311 304 313 311 407 213 113 208 111 256 403 402 399 363 403 399 29 128 32 403 375 402 363 399 359 194 192 198 193 86 75 400 213 407 272 336 79 79 281 320 300 302 297 294 298 304 299 322 314 307 299 314 322 384 314 377 281 325 387 377 325 281 377 320 355 358 331 101 102 262 363 375 403 197 204 75 102 101 262 299 384 322 262 163 193 318 343 352 299 322 384 299 393 322 322 393 384 137 208 256 86 197 75 186 79 336 222 264 281 185 361 75 365 360 366 386 392 393 299 386 393 393 392 384 392 394 384 394 398 387 384 394 387 404 377 387 398 404 387 404 209 377 209 272 377 399 400 358 359 399 358 101 163 262 262 193 75 102 101 375 204 72 249 31 148 134 424 437 427 359 358 355 400 402 213 204 249 185 351 317 386 390 351 386 317 392 386 392 317 394 317 395 394 395 397 398 394 395 398 397 405 404 398 397 404 199 209 404 405 199 404 268 88 239 75 204 185 318 352 354 243 18 227 397 385 405 385 199 405 262 192 194 101 262 194 18 131 96 349 378 199 385 349 199 250 158 167 293 250 167 379 362 395 317 379 395 395 362 397 362 365 397 365 401 397 401 349 385 397 401 385 375 194 213 213 194 113 375 101 194 354 352 318 342 343 318 375 213 402 451 261 443 32 250 293 258 32 293 113 194 198 351 409 368 355 331 354 339 340 344 372 375 363 339 344 338 368 321 379 360 362 379 360 365 362 366 365 362 365 366 362 406 349 401 365 406 401 108 258 52 258 108 32 305 349 406 297 302 301 52 251 108 321 360 379 384 325 314 373 406 365 366 373 365 373 349 406 349 373 406 373 124 406 106 105 323 439 434 431 18 243 229 83 57 260 447 83 260 418 425 429 439 441 434 441 442 434 257 106 323 391 425 418 435 437 444 257 323 452 391 418 294 296 440 441 440 296 441 131 59 138 294 413 295 95 30 20 428 432 434 422 424 415 294 420 413 425 296 429 414 422 415 425 121 296 296 440 431 452 323 451 296 83 447 431 441 439 445 444 436 429 296 431 450 56 106 301 121 433 106 257 452 414 415 411 390 413 386 18 229 59 59 229 46 386 414 411 301 433 425 248 256 196 411 416 412 300 391 304 422 436 424 46 229 151 127 121 301 412 419 356 295 413 390 351 390 411 442 56 125 409 351 412 247 243 13 330 172 155 451 118 67 364 44 290 290 44 166 166 210 265 265 210 284 442 436 434 229 99 151 364 449 44 449 283 44 418 420 294 363 449 364 212 284 210 44 210 166 420 428 422 44 212 210 247 229 243 229 247 99 127 266 178 56 450 260 413 420 421 359 168 363 363 168 449 415 424 416 296 447 260 212 220 284 436 437 424 351 411 412 440 441 431 283 212 44 451 67 261 168 173 449 449 173 283 426 342 318 381 426 318 212 348 220 266 127 301 426 338 342 149 283 173 149 212 283 438 338 426 433 121 425 149 183 212 414 421 422 172 170 155 368 317 351 350 381 376 67 259 261 183 112 212 212 112 348 348 112 220 432 431 434 448 339 338 438 448 338 420 431 432 112 221 220 428 420 432 431 432 434 417 381 350 422 428 434 423 426 381 417 423 381 56 260 57 451 105 118 296 260 440 386 413 414 306 350 316 448 341 339 415 416 411 436 444 437 259 341 448 297 425 391 442 125 445 450 106 452 410 350 306 341 259 223 355 417 350 410 355 350 259 64 223 410 356 350 356 410 350 356 355 410 355 419 417 247 13 99 195 112 183 180 112 195 419 355 356 301 425 297 390 386 411 446 259 448 446 261 259 434 436 422 421 420 422 409 410 306 368 409 306 412 356 410 409 412 410 442 445 436 435 423 430\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyCone.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0.0050000000000000001 0 10 0.0049039264020161524 -0.00097545161008064129 10 0.0046193976625564341 -0.001913417161825449 10 0.0041573480615127263 -0.0027778511650980108 10 0.0035355339059327381 -0.0035355339059327372 10 0.0027778511650980117 -0.0041573480615127254 10 0.0019134171618254492 -0.0046193976625564341 10 0.0009754516100806415 -0.0049039264020161524 10 3.061616997868383e-19 -0.0050000000000000001 10 -0.00097545161008064096 -0.0049039264020161524 10 -0.0019134171618254486 -0.0046193976625564341 10 -0.0027778511650980099 -0.0041573480615127271 10 -0.0035355339059327372 -0.0035355339059327381 10 -0.0041573480615127271 -0.0027778511650980108 10 -0.0046193976625564341 -0.0019134171618254492 10 -0.0049039264020161524 -0.00097545161008064291 10 -0.0050000000000000001 -6.123233995736766e-19 10 -0.0049039264020161524 0.00097545161008064183 10 -0.0046193976625564341 0.0019134171618254484 10 -0.0041573480615127271 0.0027778511650980099 10 -0.0035355339059327385 0.0035355339059327372 10 -0.0027778511650980108 0.0041573480615127263 10 -0.0019134171618254516 0.0046193976625564324 10 -0.00097545161008064335 0.0049039264020161516 10 -9.184850993605148e-19 0.0050000000000000001 10 0.0009754516100806414 0.0049039264020161524 10 0.0019134171618254501 0.0046193976625564332 10 0.0027778511650980091 0.004157348061512728 10 0.0035355339059327372 0.0035355339059327385 10 0.0041573480615127263 0.0027778511650980108 10 0.0046193976625564324 0.0019134171618254521 10 0.0049039264020161516 0.00097545161008064367 10 1.004 0 8 0.98470842152484339 -0.19587068330419277 8 0.92757505064133194 -0.38421416609455017 8 0.83479549075175541 -0.55779251395168061 8 0.70993520831129375 -0.70993520831129364 8 0.55779251395168072 -0.8347954907517553 8 0.38421416609455022 -0.92757505064133194 8 0.19587068330419283 -0.98470842152484339 8 6.147726931719713e-17 -1.004 8 -0.19587068330419272 -0.98470842152484339 8 -0.38421416609455011 -0.92757505064133194 8 -0.55779251395168039 -0.83479549075175563 8 -0.70993520831129364 -0.70993520831129375 8 -0.83479549075175552 -0.55779251395168061 8 -0.92757505064133194 -0.38421416609455022 8 -0.98470842152484339 -0.19587068330419311 8 -1.004 -1.2295453863439426e-16 8 -0.98470842152484339 0.19587068330419288 8 -0.92757505064133194 0.38421416609455006 8 -0.83479549075175563 0.55779251395168039 8 -0.70993520831129386 0.70993520831129364 8 -0.55779251395168061 0.83479549075175541 8 -0.38421416609455072 0.92757505064133161 8 -0.19587068330419319 0.98470842152484328 8 -1.8443180795159138e-16 1.004 8 0.1958706833041928 0.98470842152484339 8 0.38421416609455039 0.92757505064133172 8 0.55779251395168028 0.83479549075175574 8 0.70993520831129364 0.70993520831129386 8 0.83479549075175541 0.55779251395168061 8 0.92757505064133161 0.38421416609455078 8 0.98470842152484328 0.19587068330419324 8 2.0030000000000001 0 6 1.9645129166476707 -0.39076591499830493 6 1.8505307036201075 -0.76651491502727487 6 1.6654336334419981 -1.1128071767382632 6 1.4163348827166549 -1.4163348827166546 6 1.1128071767382635 -1.6654336334419979 6 0.76651491502727498 -1.8505307036201075 6 0.39076591499830504 -1.9645129166476707 6 1.2264837693460744e-16 -2.0030000000000001 6 -0.39076591499830476 -1.9645129166476707 6 -0.76651491502727476 -1.8505307036201075 6 -1.1128071767382628 -1.6654336334419986 6 -1.4163348827166546 -1.4163348827166549 6 -1.6654336334419984 -1.1128071767382632 6 -1.8505307036201075 -0.76651491502727498 6 -1.9645129166476707 -0.3907659149983056 6 -2.0030000000000001 -2.4529675386921488e-16 6 -1.9645129166476707 0.39076591499830515 6 -1.8505307036201075 0.76651491502727465 6 -1.6654336334419986 1.1128071767382628 6 -1.4163348827166551 1.4163348827166546 6 -1.1128071767382632 1.6654336334419981 6 -0.76651491502727598 1.8505307036201071 6 -0.39076591499830576 1.9645129166476705 6 -3.6794513080382228e-16 2.0030000000000001 6 0.39076591499830499 1.9645129166476707 6 0.76651491502727531 1.8505307036201073 6 1.1128071767382626 1.6654336334419988 6 1.4163348827166546 1.4163348827166551 6 1.6654336334419981 1.1128071767382632 6 1.8505307036201071 0.76651491502727609 6 1.9645129166476705 0.39076591499830587 6 3.0019999999999998 0 4 2.9443174117704976 -0.58566114669241698 4 2.7734863565988825 -1.1488156639599993 4 2.4960717761322404 -1.6678218395248456 4 2.1227345571220155 -2.1227345571220155 4 1.6678218395248459 -2.4960717761322404 4 1.1488156639599996 -2.7734863565988825 4 0.58566114669241709 -2.9443174117704976 4 1.8381948455201769e-16 -3.0019999999999998 4 -0.58566114669241676 -2.9443174117704976 4 -1.1488156639599993 -2.7734863565988825 4 -1.667821839524845 -2.4960717761322413 4 -2.1227345571220155 -2.1227345571220155 4 -2.4960717761322408 -1.6678218395248456 4 -2.7734863565988825 -1.1488156639599996 4 -2.9443174117704976 -0.58566114669241798 4 -3.0019999999999998 -3.6763896910403538e-16 4 -2.9443174117704976 0.58566114669241731 4 -2.7734863565988825 1.1488156639599991 4 -2.4960717761322413 1.667821839524845 4 -2.122734557122016 2.1227345571220155 4 -1.6678218395248456 2.4960717761322404 4 -1.1488156639600011 2.7734863565988821 4 -0.5856611466924182 2.9443174117704971 4 -5.5145845365605305e-16 3.0019999999999998 4 0.58566114669241709 2.9443174117704976 4 1.14881566396 2.7734863565988821 4 1.6678218395248445 2.4960717761322417 4 2.1227345571220155 2.122734557122016 4 2.4960717761322404 1.6678218395248456 4 2.7734863565988821 1.1488156639600013 4 2.9443174117704971 0.58566114669241842 4 4.0010000000000003 0 1.9999999999999996 3.9241219068933253 -0.78055637838652914 1.9999999999999996 3.6964420095776584 -1.5311164128927244 1.9999999999999996 3.3267099188224836 -2.2228365023114285 1.9999999999999996 2.8291342315273771 -2.8291342315273766 1.9999999999999996 2.2228365023114289 -3.3267099188224831 1.9999999999999996 1.5311164128927246 -3.6964420095776584 1.9999999999999996 0.78055637838652936 -3.9241219068933253 1.9999999999999996 2.4499059216942804e-16 -4.0010000000000003 1.9999999999999996 -0.78055637838652892 -3.9241219068933253 1.9999999999999996 -1.5311164128927242 -3.6964420095776584 1.9999999999999996 -2.2228365023114276 -3.3267099188224845 1.9999999999999996 -2.8291342315273766 -2.8291342315273771 1.9999999999999996 -3.326709918822484 -2.2228365023114285 1.9999999999999996 -3.6964420095776584 -1.5311164128927246 1.9999999999999996 -3.9241219068933253 -0.78055637838653047 1.9999999999999996 -4.0010000000000003 -4.8998118433885608e-16 1.9999999999999996 -3.9241219068933253 0.78055637838652958 1.9999999999999996 -3.6964420095776584 1.5311164128927239 1.9999999999999996 -3.3267099188224845 2.2228365023114276 1.9999999999999996 -2.8291342315273775 2.8291342315273766 1.9999999999999996 -2.2228365023114285 3.3267099188224836 1.9999999999999996 -1.5311164128927266 3.6964420095776576 1.9999999999999996 -0.7805563783865308 3.9241219068933249 1.9999999999999996 -7.3497177650828407e-16 4.0010000000000003 1.9999999999999996 0.78055637838652925 3.9241219068933253 1.9999999999999996 1.5311164128927253 3.696442009577658 1.9999999999999996 2.2228365023114272 3.3267099188224849 1.9999999999999996 2.8291342315273766 2.8291342315273775 1.9999999999999996 3.3267099188224836 2.2228365023114285 1.9999999999999996 3.6964420095776576 1.5311164128927268 1.9999999999999996 3.9241219068933249 0.78055637838653102 1.9999999999999996 5 0 0 4.9039264020161522 -0.97545161008064118 0 4.6193976625564339 -1.913417161825449 0 4.1573480615127263 -2.7778511650980109 0 3.5355339059327378 -3.5355339059327373 0 2.7778511650980113 -4.1573480615127254 0 1.9134171618254492 -4.6193976625564339 0 0.97545161008064152 -4.9039264020161522 0 3.0616169978683831e-16 -5 0 -0.97545161008064096 -4.9039264020161522 0 -1.9134171618254485 -4.6193976625564339 0 -2.77785116509801 -4.1573480615127272 0 -3.5355339059327373 -3.5355339059327378 0 -4.1573480615127263 -2.7778511650980109 0 -4.6193976625564339 -1.9134171618254492 0 -4.9039264020161522 -0.97545161008064296 0 -5 -6.1232339957367663e-16 0 -4.9039264020161522 0.97545161008064185 0 -4.6193976625564339 1.9134171618254483 0 -4.1573480615127272 2.77785116509801 0 -3.5355339059327386 3.5355339059327373 0 -2.7778511650980109 4.1573480615127263 0 -1.9134171618254516 4.6193976625564321 0 -0.97545161008064329 4.9039264020161513 0 -9.1848509936051479e-16 5 0 0.97545161008064141 4.9039264020161522 0 1.9134171618254501 4.619397662556433 0 2.7778511650980091 4.1573480615127281 0 3.5355339059327373 3.5355339059327386 0 4.1573480615127263 2.7778511650980109 0 4.6193976625564321 1.9134171618254521 0 4.9039264020161513 0.97545161008064363 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyCone.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0.0050000000000000001 0 10 0.0049039264020161524 -0.00097545161008064129 10 0.0046193976625564341 -0.001913417161825449 10 0.0041573480615127263 -0.0027778511650980108 10 0.0035355339059327381 -0.0035355339059327372 10 0.0027778511650980117 -0.0041573480615127263 10 0.0019134171618254492 -0.0046193976625564341 10 0.00097545161008064172 -0.0049039264020161524 10 3.0615158845559431e-19 -0.0050000000000000001 10 -0.00097545161008064096 -0.0049039264020161524 10 -0.0019134171618254486 -0.0046193976625564341 10 -0.0027778511650980099 -0.0041573480615127271 10 -0.0035355339059327372 -0.0035355339059327381 10 -0.0041573480615127271 -0.0027778511650980108 10 -0.0046193976625564341 -0.0019134171618254495 10 -0.0049039264020161524 -0.00097545161008064302 10 -0.0050000000000000001 -6.1230317691118863e-19 10 -0.0049039264020161524 0.00097545161008064183 10 -0.0046193976625564341 0.0019134171618254484 10 -0.0041573480615127271 0.0027778511650980099 10 -0.0035355339059327385 0.0035355339059327372 10 -0.0027778511650980108 0.0041573480615127263 10 -0.0019134171618254516 0.0046193976625564324 10 -0.00097545161008064335 0.0049039264020161516 10 -9.1845476536678289e-19 0.0050000000000000001 10 0.0009754516100806415 0.0049039264020161524 10 0.0019134171618254501 0.0046193976625564332 10 0.0027778511650980091 0.0041573480615127271 10 0.0035355339059327368 0.0035355339059327385 10 0.0041573480615127263 0.0027778511650980108 10 0.0046193976625564324 0.0019134171618254521 10 0.0049039264020161516 0.00097545161008064367 10 1.004 0 8 0.98470842152484339 -0.19587068330419277 8 0.92757505064133194 -0.38421416609455017 8 0.83479549075175541 -0.55779251395168061 8 0.70993520831129375 -0.70993520831129364 8 0.55779251395168072 -0.83479549075175541 8 0.38421416609455022 -0.92757505064133194 8 0.19587068330419286 -0.98470842152484339 8 6.147523896188334e-17 -1.004 8 -0.19587068330419272 -0.98470842152484339 8 -0.38421416609455011 -0.92757505064133194 8 -0.55779251395168039 -0.83479549075175563 8 -0.70993520831129364 -0.70993520831129375 8 -0.83479549075175552 -0.55779251395168061 8 -0.92757505064133194 -0.38421416609455028 8 -0.98470842152484339 -0.19587068330419313 8 -1.004 -1.2295047792376668e-16 8 -0.98470842152484339 0.19587068330419288 8 -0.92757505064133206 0.38421416609455006 8 -0.83479549075175563 0.55779251395168039 8 -0.70993520831129386 0.70993520831129364 8 -0.55779251395168061 0.83479549075175541 8 -0.38421416609455072 0.92757505064133161 8 -0.19587068330419319 0.98470842152484328 8 -1.8442571688565002e-16 1.004 8 0.19587068330419283 0.98470842152484339 8 0.38421416609455039 0.92757505064133172 8 0.55779251395168028 0.83479549075175563 8 0.70993520831129353 0.70993520831129386 8 0.83479549075175541 0.55779251395168061 8 0.92757505064133161 0.38421416609455078 8 0.98470842152484328 0.19587068330419324 8 2.0030000000000001 0 6 1.9645129166476707 -0.39076591499830493 6 1.8505307036201075 -0.76651491502727487 6 1.6654336334419981 -1.1128071767382632 6 1.4163348827166549 -1.4163348827166546 6 1.1128071767382635 -1.6654336334419981 6 0.76651491502727498 -1.8505307036201075 6 0.3907659149983051 -1.9645129166476707 6 1.2264432633531108e-16 -2.0030000000000001 6 -0.39076591499830476 -1.9645129166476707 6 -0.76651491502727476 -1.8505307036201075 6 -1.1128071767382628 -1.6654336334419986 6 -1.4163348827166546 -1.4163348827166549 6 -1.6654336334419984 -1.1128071767382632 6 -1.8505307036201075 -0.76651491502727509 6 -1.9645129166476707 -0.39076591499830565 6 -2.0030000000000001 -2.4528865267062217e-16 6 -1.9645129166476707 0.39076591499830515 6 -1.8505307036201077 0.76651491502727465 6 -1.6654336334419986 1.1128071767382628 6 -1.4163348827166551 1.4163348827166546 6 -1.1128071767382632 1.6654336334419981 6 -0.76651491502727598 1.8505307036201071 6 -0.39076591499830576 1.9645129166476705 6 -3.6793297900593325e-16 2.0030000000000001 6 0.39076591499830504 1.9645129166476707 6 0.76651491502727531 1.8505307036201073 6 1.1128071767382626 1.6654336334419986 6 1.4163348827166544 1.4163348827166551 6 1.6654336334419981 1.1128071767382632 6 1.8505307036201071 0.76651491502727609 6 1.9645129166476705 0.39076591499830587 6 3.0019999999999998 0 4 2.9443174117704976 -0.58566114669241698 4 2.7734863565988825 -1.1488156639599993 4 2.4960717761322404 -1.6678218395248456 4 2.1227345571220155 -2.1227345571220155 4 1.6678218395248459 -2.4960717761322404 4 1.1488156639599996 -2.7734863565988825 4 0.5856611466924172 -2.9443174117704976 4 1.838134137087388e-16 -3.0019999999999998 4 -0.58566114669241676 -2.9443174117704976 4 -1.1488156639599993 -2.7734863565988825 4 -1.667821839524845 -2.4960717761322413 4 -2.1227345571220155 -2.1227345571220155 4 -2.4960717761322408 -1.6678218395248456 4 -2.7734863565988825 -1.1488156639599998 4 -2.9443174117704976 -0.58566114669241809 4 -3.0019999999999998 -3.6762682741747761e-16 4 -2.9443174117704976 0.58566114669241731 4 -2.773486356598883 1.1488156639599991 4 -2.4960717761322413 1.667821839524845 4 -2.122734557122016 2.1227345571220155 4 -1.6678218395248456 2.4960717761322404 4 -1.1488156639600011 2.7734863565988821 4 -0.5856611466924182 2.9443174117704971 4 -5.5144024112621648e-16 3.0019999999999998 4 0.58566114669241709 2.9443174117704976 4 1.14881566396 2.7734863565988821 4 1.6678218395248445 2.4960717761322413 4 2.1227345571220151 2.122734557122016 4 2.4960717761322404 1.6678218395248456 4 2.7734863565988821 1.1488156639600013 4 2.9443174117704971 0.58566114669241842 4 4.0010000000000003 0 1.9999999999999996 3.9241219068933253 -0.78055637838652914 1.9999999999999996 3.6964420095776584 -1.5311164128927244 1.9999999999999996 3.3267099188224836 -2.2228365023114285 1.9999999999999996 2.8291342315273771 -2.8291342315273766 1.9999999999999996 2.2228365023114289 -3.3267099188224836 1.9999999999999996 1.5311164128927246 -3.6964420095776584 1.9999999999999996 0.78055637838652947 -3.9241219068933253 1.9999999999999996 2.4498250108216657e-16 -4.0010000000000003 1.9999999999999996 -0.78055637838652892 -3.9241219068933253 1.9999999999999996 -1.5311164128927242 -3.6964420095776584 1.9999999999999996 -2.2228365023114276 -3.3267099188224845 1.9999999999999996 -2.8291342315273766 -2.8291342315273771 1.9999999999999996 -3.326709918822484 -2.2228365023114285 1.9999999999999996 -3.6964420095776584 -1.5311164128927248 1.9999999999999996 -3.9241219068933253 -0.78055637838653058 1.9999999999999996 -4.0010000000000003 -4.8996500216433314e-16 1.9999999999999996 -3.9241219068933253 0.78055637838652958 1.9999999999999996 -3.6964420095776589 1.5311164128927239 1.9999999999999996 -3.3267099188224845 2.2228365023114276 1.9999999999999996 -2.8291342315273775 2.8291342315273766 1.9999999999999996 -2.2228365023114285 3.3267099188224836 1.9999999999999996 -1.5311164128927266 3.6964420095776576 1.9999999999999996 -0.7805563783865308 3.9241219068933249 1.9999999999999996 -7.3494750324649976e-16 4.0010000000000003 1.9999999999999996 0.78055637838652936 3.9241219068933253 1.9999999999999996 1.5311164128927253 3.696442009577658 1.9999999999999996 2.2228365023114272 3.3267099188224845 1.9999999999999996 2.8291342315273762 2.8291342315273775 1.9999999999999996 3.3267099188224836 2.2228365023114285 1.9999999999999996 3.6964420095776576 1.5311164128927268 1.9999999999999996 3.9241219068933249 0.78055637838653102 1.9999999999999996 5 0 0 4.9039264020161522 -0.97545161008064118 0 4.6193976625564339 -1.913417161825449 0 4.1573480615127263 -2.7778511650980109 0 3.5355339059327378 -3.5355339059327373 0 2.7778511650980113 -4.1573480615127263 0 1.9134171618254492 -4.6193976625564339 0 0.97545161008064163 -4.9039264020161522 0 3.0615158845559431e-16 -5 0 -0.97545161008064096 -4.9039264020161522 0 -1.9134171618254485 -4.6193976625564339 0 -2.77785116509801 -4.1573480615127272 0 -3.5355339059327373 -3.5355339059327378 0 -4.1573480615127263 -2.7778511650980109 0 -4.6193976625564339 -1.9134171618254494 0 -4.9039264020161522 -0.97545161008064307 0 -5 -6.1230317691118863e-16 0 -4.9039264020161522 0.97545161008064185 0 -4.6193976625564339 1.9134171618254483 0 -4.1573480615127272 2.77785116509801 0 -3.5355339059327386 3.5355339059327373 0 -2.7778511650980109 4.1573480615127263 0 -1.9134171618254516 4.6193976625564321 0 -0.97545161008064329 4.9039264020161513 0 -9.1845476536678294e-16 5 0 0.97545161008064152 4.9039264020161522 0 1.9134171618254501 4.619397662556433 0 2.7778511650980091 4.1573480615127272 0 3.5355339059327369 3.5355339059327386 0 4.1573480615127263 2.7778511650980109 0 4.6193976625564321 1.9134171618254521 0 4.9039264020161513 0.97545161008064363 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyCube.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.5 2.5 2.5 2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyCushion.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>4 5.9021130325903073 4.6180339887498949 4 5.6180339887498949 5.1755705045849458 4 5.1755705045849467 5.6180339887498949 4 4.6180339887498949 5.9021130325903073 4 4 6 4.1909830056250525 5.9021130325903073 4.5877852522924734 4.3632712640026803 5.6180339887498949 5.1180339887498949 4.5 5.1755705045849467 5.538841768587627 4.5877852522924734 4.6180339887498949 5.8090169943749475 4.6180339887498949 4 5.9021130325903073 4.3632712640026803 5.9021130325903073 4.5 4.6909830056250525 5.6180339887498949 4.9510565162951536 4.9510565162951536 5.1755705045849467 5.3090169943749475 5.1180339887498949 4.6180339887498949 5.538841768587627 5.1755705045849467 4 5.6180339887498949 4.5 5.9021130325903073 4.3632712640026803 4.9510565162951536 5.6180339887498949 4.6909830056250525 5.3090169943749475 5.1755705045849467 4.9510565162951536 5.538841768587627 4.6180339887498949 5.1180339887498949 5.6180339887498949 4 5.1755705045849467 4.5877852522924734 5.9021130325903073 4.1909830056250525 5.1180339887498949 5.6180339887498949 4.3632712640026803 5.538841768587627 5.1755705045849467 4.5 5.8090169943749475 4.6180339887498949 4.5877852522924734 5.9021130325903073 4 4.6180339887498949 4.6180339887498949 5.9021130325903073 4 5.1755705045849458 5.6180339887498949 4 5.6180339887498949 5.1755705045849467 4 5.9021130325903073 4.6180339887498949 4 6 4 4 4 6 4 4 -4 6 4 -4.6180339887498949 5.9021130325903073 4 -5.1755705045849467 5.6180339887498949 4 -5.6180339887498949 5.1755705045849458 4 -5.9021130325903073 4.6180339887498949 4.6180339887498949 -4 5.9021130325903073 4.5877852522924734 -4.6180339887498949 5.8090169943749475 4.5 -5.1755705045849467 5.538841768587627 4.3632712640026803 -5.6180339887498949 5.1180339887498949 4.1909830056250525 -5.9021130325903073 4.5877852522924734 5.1755705045849467 -4 5.6180339887498949 5.1180339887498949 -4.6180339887498949 5.538841768587627 4.9510565162951536 -5.1755705045849467 5.3090169943749475 4.6909830056250525 -5.6180339887498949 4.9510565162951536 4.3632712640026803 -5.9021130325903073 4.5 5.6180339887498949 -4 5.1755705045849467 5.538841768587627 -4.6180339887498949 5.1180339887498949 5.3090169943749475 -5.1755705045849467 4.9510565162951536 4.9510565162951536 -5.6180339887498949 4.6909830056250525 4.5 -5.9021130325903073 4.3632712640026803 5.9021130325903073 -4 4.6180339887498949 5.8090169943749475 -4.6180339887498949 4.5877852522924734 5.538841768587627 -5.1755705045849467 4.5 5.1180339887498949 -5.6180339887498949 4.3632712640026803 4.5877852522924734 -5.9021130325903073 4.1909830056250525 6 -4 4 5.9021130325903073 -4.6180339887498949 4 5.6180339887498949 -5.1755705045849467 4 5.1755705045849458 -5.6180339887498949 4 4.6180339887498949 -5.9021130325903073 4 4 -6 4 4.6180339887498949 5.9021130325903073 -4 5.1755705045849458 5.6180339887498949 -4 5.6180339887498949 5.1755705045849467 -4 5.9021130325903073 4.6180339887498949 -4 6 4 -4 4.5877852522924734 5.9021130325903073 -4.1909830056250525 5.1180339887498949 5.6180339887498949 -4.3632712640026803 5.538841768587627 5.1755705045849467 -4.5 5.8090169943749475 4.6180339887498949 -4.5877852522924734 5.9021130325903073 4 -4.6180339887498949 4.5 5.9021130325903073 -4.3632712640026803 4.9510565162951536 5.6180339887498949 -4.6909830056250525 5.3090169943749475 5.1755705045849467 -4.9510565162951536 5.538841768587627 4.6180339887498949 -5.1180339887498949 5.6180339887498949 4 -5.1755705045849458 4.3632712640026803 5.9021130325903073 -4.5 4.6909830056250525 5.6180339887498949 -4.9510565162951536 4.9510565162951536 5.1755705045849467 -5.3090169943749475 5.1180339887498949 4.6180339887498949 -5.538841768587627 5.1755705045849467 4 -5.6180339887498949 4.1909830056250525 5.9021130325903073 -4.5877852522924734 4.3632712640026803 5.6180339887498949 -5.1180339887498949 4.5 5.1755705045849467 -5.538841768587627 4.5877852522924734 4.6180339887498949 -5.8090169943749475 4.6180339887498949 4 -5.9021130325903073 4 5.9021130325903073 -4.6180339887498949 4 5.6180339887498949 -5.1755705045849458 4 5.1755705045849467 -5.6180339887498949 4 4.6180339887498949 -5.9021130325903073 4 4 -6 4 6 -4 6 -4 -4 5.9021130325903073 -4.6180339887498949 -4 5.6180339887498949 -5.1755705045849467 -4 5.1755705045849458 -5.6180339887498949 -4 4.6180339887498949 -5.9021130325903073 -4 5.9021130325903073 -4 -4.6180339887498949 5.8090169943749475 -4.6180339887498949 -4.5877852522924734 5.538841768587627 -5.1755705045849467 -4.5 5.1180339887498949 -5.6180339887498949 -4.3632712640026803 4.5877852522924734 -5.9021130325903073 -4.1909830056250525 5.6180339887498949 -4 -5.1755705045849458 5.538841768587627 -4.6180339887498949 -5.1180339887498949 5.3090169943749475 -5.1755705045849467 -4.9510565162951536 4.9510565162951536 -5.6180339887498949 -4.6909830056250525 4.5 -5.9021130325903073 -4.3632712640026803 5.1755705045849467 -4 -5.6180339887498949 5.1180339887498949 -4.6180339887498949 -5.538841768587627 4.9510565162951536 -5.1755705045849467 -5.3090169943749475 4.6909830056250525 -5.6180339887498949 -4.9510565162951536 4.3632712640026803 -5.9021130325903073 -4.5 4.6180339887498949 -4 -5.9021130325903073 4.5877852522924734 -4.6180339887498949 -5.8090169943749475 4.5 -5.1755705045849467 -5.538841768587627 4.3632712640026803 -5.6180339887498949 -5.1180339887498949 4.1909830056250525 -5.9021130325903073 -4.5877852522924734 4 -4 -6 4 -4.6180339887498949 -5.9021130325903073 4 -5.1755705045849467 -5.6180339887498949 4 -5.6180339887498949 -5.1755705045849458 4 -5.9021130325903073 -4.6180339887498949 4 -6 -4 -4 5.9021130325903073 -4.6180339887498949 -4 5.6180339887498949 -5.1755705045849458 -4 5.1755705045849467 -5.6180339887498949 -3.9999999999999996 4.6180339887498949 -5.9021130325903073 -3.9999999999999996 4 -6 -4.1909830056250525 5.9021130325903073 -4.5877852522924734 -4.3632712640026803 5.6180339887498949 -5.1180339887498949 -4.5 5.1755705045849467 -5.538841768587627 -4.5877852522924734 4.6180339887498949 -5.8090169943749475 -4.6180339887498949 4 -5.9021130325903073 -4.3632712640026803 5.9021130325903073 -4.5 -4.6909830056250525 5.6180339887498949 -4.9510565162951536 -4.9510565162951536 5.1755705045849467 -5.3090169943749475 -5.1180339887498949 4.6180339887498949 -5.538841768587627 -5.1755705045849458 4 -5.6180339887498949 -4.5 5.9021130325903073 -4.3632712640026803 -4.9510565162951536 5.6180339887498949 -4.6909830056250525 -5.3090169943749475 5.1755705045849467 -4.9510565162951536 -5.538841768587627 4.6180339887498949 -5.1180339887498949 -5.6180339887498949 4 -5.1755705045849467 -4.5877852522924734 5.9021130325903073 -4.1909830056250525 -5.1180339887498949 5.6180339887498949 -4.3632712640026803 -5.538841768587627 5.1755705045849467 -4.5 -5.8090169943749475 4.6180339887498949 -4.5877852522924734 -5.9021130325903073 4 -4.6180339887498949 -4.6180339887498949 5.9021130325903073 -4 -5.1755705045849458 5.6180339887498949 -4 -5.6180339887498949 5.1755705045849467 -4 -5.9021130325903073 4.6180339887498949 -4 -6 4 -4 -4 6 -4 -3.9999999999999996 -4 -6 -3.9999999999999996 -4.6180339887498949 -5.9021130325903073 -4 -5.1755705045849467 -5.6180339887498949 -4 -5.6180339887498949 -5.1755705045849458 -4 -5.9021130325903073 -4.6180339887498949 -4.6180339887498949 -4 -5.9021130325903073 -4.5877852522924734 -4.6180339887498949 -5.8090169943749475 -4.5 -5.1755705045849467 -5.538841768587627 -4.3632712640026803 -5.6180339887498949 -5.1180339887498949 -4.1909830056250525 -5.9021130325903073 -4.5877852522924734 -5.1755705045849458 -4 -5.6180339887498949 -5.1180339887498949 -4.6180339887498949 -5.538841768587627 -4.9510565162951536 -5.1755705045849467 -5.3090169943749475 -4.6909830056250525 -5.6180339887498949 -4.9510565162951536 -4.3632712640026803 -5.9021130325903073 -4.5 -5.6180339887498949 -4 -5.1755705045849467 -5.538841768587627 -4.6180339887498949 -5.1180339887498949 -5.3090169943749475 -5.1755705045849467 -4.9510565162951536 -4.9510565162951536 -5.6180339887498949 -4.6909830056250525 -4.5 -5.9021130325903073 -4.3632712640026803 -5.9021130325903073 -4 -4.6180339887498949 -5.8090169943749475 -4.6180339887498949 -4.5877852522924734 -5.538841768587627 -5.1755705045849467 -4.5 -5.1180339887498949 -5.6180339887498949 -4.3632712640026803 -4.5877852522924734 -5.9021130325903073 -4.1909830056250525 -6 -4 -4 -5.9021130325903073 -4.6180339887498949 -4 -5.6180339887498949 -5.1755705045849467 -4 -5.1755705045849458 -5.6180339887498949 -4 -4.6180339887498949 -5.9021130325903073 -4 -4 -6 -4 -4.6180339887498949 5.9021130325903073 4 -5.1755705045849458 5.6180339887498949 4 -5.6180339887498949 5.1755705045849467 3.9999999999999996 -5.9021130325903073 4.6180339887498949 3.9999999999999996 -6 4 3.9999999999999996 -4.5877852522924734 5.9021130325903073 4.1909830056250525 -5.1180339887498949 5.6180339887498949 4.3632712640026803 -5.538841768587627 5.1755705045849467 4.5 -5.8090169943749475 4.6180339887498949 4.5877852522924725 -5.9021130325903073 4 4.6180339887498949 -4.5 5.9021130325903073 4.3632712640026803 -4.9510565162951536 5.6180339887498949 4.6909830056250525 -5.3090169943749475 5.1755705045849467 4.9510565162951536 -5.538841768587627 4.6180339887498949 5.1180339887498949 -5.6180339887498949 4 5.1755705045849458 -4.3632712640026803 5.9021130325903073 4.5 -4.6909830056250525 5.6180339887498949 4.9510565162951536 -4.9510565162951536 5.1755705045849467 5.3090169943749475 -5.1180339887498949 4.6180339887498949 5.5388417685876261 -5.1755705045849467 4 5.6180339887498949 -4.1909830056250525 5.9021130325903073 4.5877852522924734 -4.3632712640026803 5.6180339887498949 5.1180339887498949 -4.5 5.1755705045849467 5.538841768587627 -4.5877852522924734 4.6180339887498949 5.8090169943749475 -4.6180339887498949 4 5.9021130325903073 -4 5.9021130325903073 4.6180339887498949 -4 5.6180339887498949 5.1755705045849458 -4 5.1755705045849467 5.6180339887498949 -4 4.6180339887498949 5.9021130325903073 -4 4 6 -4 6 4 -6 -4 3.9999999999999996 -5.9021130325903073 -4.6180339887498949 3.9999999999999996 -5.6180339887498949 -5.1755705045849467 3.9999999999999996 -5.1755705045849458 -5.6180339887498949 4 -4.6180339887498949 -5.9021130325903073 4 -5.9021130325903073 -4 4.6180339887498949 -5.8090169943749475 -4.6180339887498949 4.5877852522924725 -5.538841768587627 -5.1755705045849467 4.5 -5.1180339887498949 -5.6180339887498949 4.3632712640026803 -4.5877852522924734 -5.9021130325903073 4.1909830056250525 -5.6180339887498949 -4 5.1755705045849458 -5.538841768587627 -4.6180339887498949 5.1180339887498949 -5.3090169943749475 -5.1755705045849467 4.9510565162951536 -4.9510565162951536 -5.6180339887498949 4.6909830056250525 -4.5 -5.9021130325903073 4.3632712640026803 -5.1755705045849467 -4 5.6180339887498949 -5.1180339887498949 -4.6180339887498949 5.5388417685876261 -4.9510565162951536 -5.1755705045849467 5.3090169943749475 -4.6909830056250525 -5.6180339887498949 4.9510565162951536 -4.3632712640026803 -5.9021130325903073 4.5 -4.6180339887498949 -4 5.9021130325903073 -4.5877852522924734 -4.6180339887498949 5.8090169943749475 -4.5 -5.1755705045849467 5.538841768587627 -4.3632712640026803 -5.6180339887498949 5.1180339887498949 -4.1909830056250525 -5.9021130325903073 4.5877852522924734 -4 -4 6 -4 -4.6180339887498949 5.9021130325903073 -4 -5.1755705045849467 5.6180339887498949 -4 -5.6180339887498949 5.1755705045849458 -4 -5.9021130325903073 4.6180339887498949 -4 -6 4</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 80 84 85 83 87 88 86 90 91 89 93 94 92 96 97 98 95 100 101 102 99 104 105 106 103 108 109 110 107 112 113 114 111 116 117 118 115 120 121 122 119 124 125 126 123 128 129 130 127 132 133 134 131 136 137 138 135 140 141 142 139 144 145 146 143 148 149 150 147 152 153 154 151 156 157 158 155 160 161 162 159 164 165 166 163 168 169 170 167 172 173 174 171 176 177 175 179 180 178 182 183 181 185 186 184 188 189 187 191 192 193 190 195 196 197 194 199 200 201 198 203 204 205 202 207 208 209 206 211 212 213 210 215 216 217 214 219 220 221 218 223 224 225 222 227 228 229 226 231 232 233 230 235 236 237 234 239 240 241 238 243 244 245 242 247 248 249 246 251 252 253 250 255 256 257 254 259 260 261 258 263 264 265 262 267 268 269 266 271 272 270 274 275 273 277 278 276 280 281 279 283 284 282 286 287 288 285 290 291 292 289 294 295 296 293 298 299 300 297 302 303 304 301 306 307 308 305 310 311 312 309 314 315 316 313 318 319 320 317 322 323 324 321 326 327 328 325 330 331 332 329 334 335 336 333 338 339 340 337 342 343 344 341 346 347 348 345 350 351 352 349 354 355 356 353 358 359 360 357 362 363 364 361 366 367 365 369 370 368 372 373 371 375 376 374 378 379 377 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 460 464 465 463 467 468 466 470 471 469 473 474 472 476 477 478 475 480 481 482 479 484 485 486 483 488 489 490 487 492 493 494 491 496 497 498 495 500 501 502 499 504 505 506 503 508 509 510 507 512 513 514 511 516 517 518 515 520 521 522 519 524 525 526 523 528 529 530 527 532 533 534 531 536 537 538 535 540 541 542 539 544 545 546 543 548 549 550 547 552 553 554 551 556 557 555 559 560 558 562 563 561 565 566 564 568 569 567 571 572 573 570 575 576 577 574 579 580 581 578 583 584 585 582 587 588 589 586 591 592 593 590 595 596 597 594 599 600 601 598 603 604 605 602 607 608 609 606 611 612 613 610 615 616 617 614 619 620 621 618 623 624 625 622 627 628 629 626 631 632 633 630 635 636 637 634 639 640 641 638 643 644 645 642 647 648 649 646 651 652 650 654 655 653 657 658 656 660 661 659 663 664 662 666 667 668 665 670 671 672 669 674 675 676 673 678 679 680 677 682 683 684 681 686 687 688 685 690 691 692 689 694 695 696 693 698 699 700 697 702 703 704 701 706 707 708 705 710 711 712 709 714 715 716 713 718 719 720 717 722 723 724 721 726 727 728 725 730 731 732 729 734 735 736 733 738 739 740 737 742 743 744 741 746 747 745 749 750 748 752 753 751 755 756 754 758 759 757 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 83 86 89 92 95 99 103 107 111 115 119 123 127 131 135 139 143 147 151 155 159 163 167 171 175 178 181 184 187 190 194 198 202 206 210 214 218 222 226 230 234 238 242 246 250 254 258 262 266 270 273 276 279 282 285 289 293 297 301 305 309 313 317 321 325 329 333 337 341 345 349 353 357 361 365 368 371 374 377 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 463 466 469 472 475 479 483 487 491 495 499 503 507 511 515 519 523 527 531 535 539 543 547 551 555 558 561 564 567 570 574 578 582 586 590 594 598 602 606 610 614 618 622 626 630 634 638 642 646 650 653 656 659 662 665 669 673 677 681 685 689 693 697 701 705 709 713 717 721 725 729 733 737 741 745 748 751 754 757 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 6 5 1 2 7 6 2 3 8 7 3 4 9 8 5 6 11 10 6 7 12 11 7 8 13 12 8 9 14 13 10 11 16 15 11 12 17 16 12 13 18 17 13 14 19 18 15 16 21 20 16 17 22 21 17 18 23 22 18 19 24 23 20 21 26 25 21 22 27 26 22 23 28 27 23 24 29 28 0 5 30 5 10 30 10 15 30 15 20 30 20 25 30 31 32 37 36 32 33 38 37 33 34 39 38 34 35 40 39 36 37 42 41 37 38 43 42 38 39 44 43 39 40 45 44 41 42 47 46 42 43 48 47 43 44 49 48 44 45 50 49 46 47 52 51 47 48 53 52 48 49 54 53 49 50 55 54 51 52 57 56 52 53 58 57 53 54 59 58 54 55 60 59 35 61 40 40 61 45 45 61 50 50 61 55 55 61 60 62 63 68 67 63 64 69 68 64 65 70 69 65 66 71 70 67 68 73 72 68 69 74 73 69 70 75 74 70 71 76 75 72 73 78 77 73 74 79 78 74 75 80 79 75 76 81 80 77 78 83 82 78 79 84 83 79 80 85 84 80 81 86 85 82 83 88 87 83 84 89 88 84 85 90 89 85 86 91 90 62 67 92 67 72 92 72 77 92 77 82 92 82 87 92 93 94 99 98 94 95 100 99 95 96 101 100 96 97 102 101 98 99 104 103 99 100 105 104 100 101 106 105 101 102 107 106 103 104 109 108 104 105 110 109 105 106 111 110 106 107 112 111 108 109 114 113 109 110 115 114 110 111 116 115 111 112 117 116 113 114 119 118 114 115 120 119 115 116 121 120 116 117 122 121 97 123 102 102 123 107 107 123 112 112 123 117 117 123 122 124 125 130 129 125 126 131 130 126 127 132 131 127 128 133 132 129 130 135 134 130 131 136 135 131 132 137 136 132 133 138 137 134 135 140 139 135 136 141 140 136 137 142 141 137 138 143 142 139 140 145 144 140 141 146 145 141 142 147 146 142 143 148 147 144 145 150 149 145 146 151 150 146 147 152 151 147 148 153 152 124 129 154 129 134 154 134 139 154 139 144 154 144 149 154 155 156 161 160 156 157 162 161 157 158 163 162 158 159 164 163 160 161 166 165 161 162 167 166 162 163 168 167 163 164 169 168 165 166 171 170 166 167 172 171 167 168 173 172 168 169 174 173 170 171 176 175 171 172 177 176 172 173 178 177 173 174 179 178 175 176 181 180 176 177 182 181 177 178 183 182 178 179 184 183 159 185 164 164 185 169 169 185 174 174 185 179 179 185 184 186 187 192 191 187 188 193 192 188 189 194 193 189 190 195 194 191 192 197 196 192 193 198 197 193 194 199 198 194 195 200 199 196 197 202 201 197 198 203 202 198 199 204 203 199 200 205 204 201 202 207 206 202 203 208 207 203 204 209 208 204 205 210 209 206 207 212 211 207 208 213 212 208 209 214 213 209 210 215 214 186 191 216 191 196 216 196 201 216 201 206 216 206 211 216 217 218 223 222 218 219 224 223 219 220 225 224 220 221 226 225 222 223 228 227 223 224 229 228 224 225 230 229 225 226 231 230 227 228 233 232 228 229 234 233 229 230 235 234 230 231 236 235 232 233 238 237 233 234 239 238 234 235 240 239 235 236 241 240 237 238 243 242 238 239 244 243 239 240 245 244 240 241 246 245 221 247 226 226 247 231 231 247 236 236 247 241 241 247 246 25 26 63 62 26 27 64 63 27 28 65 64 28 29 66 65 56 57 94 93 57 58 95 94 58 59 96 95 59 60 97 96 87 88 125 124 88 89 126 125 89 90 127 126 90 91 128 127 118 119 156 155 119 120 157 156 120 121 158 157 121 122 159 158 149 150 187 186 150 151 188 187 151 152 189 188 152 153 190 189 180 181 218 217 181 182 219 218 182 183 220 219 183 184 221 220 211 212 1 0 212 213 2 1 213 214 3 2 214 215 4 3 242 243 32 31 243 244 33 32 244 245 34 33 245 246 35 34 0 30 216 211 25 62 92 30 87 124 154 92 149 186 216 154 35 246 247 61 60 61 123 97 122 123 185 159 184 185 247 221 4 31 36 9 9 36 41 14 14 41 46 19 19 46 51 24 24 51 56 29 66 93 98 71 71 98 103 76 76 103 108 81 81 108 113 86 86 113 118 91 128 155 160 133 133 160 165 138 138 165 170 143 143 170 175 148 148 175 180 153 190 217 222 195 195 222 227 200 200 227 232 205 205 232 237 210 210 237 242 215 4 215 242 31 29 56 93 66 91 118 155 128 153 180 217 190 30 92 154 216 61 247 185 123\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyCylinder.caps.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 4.9039264020161522 -0.97545161008064118 5 4.6193976625564339 -1.913417161825449 5 4.1573480615127263 -2.7778511650980109 5 3.5355339059327378 -3.5355339059327373 5 2.7778511650980113 -4.1573480615127254 5 1.9134171618254492 -4.6193976625564339 5 0.97545161008064152 -4.9039264020161522 5 3.0616169978683831e-16 -5 5 -0.97545161008064096 -4.9039264020161522 5 -1.9134171618254485 -4.6193976625564339 5 -2.77785116509801 -4.1573480615127272 5 -3.5355339059327373 -3.5355339059327378 5 -4.1573480615127263 -2.7778511650980109 5 -4.6193976625564339 -1.9134171618254492 5 -4.9039264020161522 -0.97545161008064296 5 -5 -6.1232339957367663e-16 5 -4.9039264020161522 0.97545161008064185 5 -4.6193976625564339 1.9134171618254483 5 -4.1573480615127272 2.77785116509801 5 -3.5355339059327386 3.5355339059327373 5 -2.7778511650980109 4.1573480615127263 5 -1.9134171618254516 4.6193976625564321 5 -0.97545161008064329 4.9039264020161513 5 -9.1848509936051479e-16 5 5 0.97545161008064141 4.9039264020161522 5 1.9134171618254501 4.619397662556433 5 2.7778511650980091 4.1573480615127281 5 3.5355339059327373 3.5355339059327386 5 4.1573480615127263 2.7778511650980109 5 4.6193976625564321 1.9134171618254521 5 4.9039264020161513 0.97545161008064363 5 5 0 3 4.9039264020161522 -0.97545161008064118 3 4.6193976625564339 -1.913417161825449 3 4.1573480615127263 -2.7778511650980109 3 3.5355339059327378 -3.5355339059327373 3 2.7778511650980113 -4.1573480615127254 3 1.9134171618254492 -4.6193976625564339 3 0.97545161008064152 -4.9039264020161522 3 3.0616169978683831e-16 -5 3 -0.97545161008064096 -4.9039264020161522 3 -1.9134171618254485 -4.6193976625564339 3 -2.77785116509801 -4.1573480615127272 3 -3.5355339059327373 -3.5355339059327378 3 -4.1573480615127263 -2.7778511650980109 3 -4.6193976625564339 -1.9134171618254492 3 -4.9039264020161522 -0.97545161008064296 3 -5 -6.1232339957367663e-16 3 -4.9039264020161522 0.97545161008064185 3 -4.6193976625564339 1.9134171618254483 3 -4.1573480615127272 2.77785116509801 3 -3.5355339059327386 3.5355339059327373 3 -2.7778511650980109 4.1573480615127263 3 -1.9134171618254516 4.6193976625564321 3 -0.97545161008064329 4.9039264020161513 3 -9.1848509936051479e-16 5 3 0.97545161008064141 4.9039264020161522 3 1.9134171618254501 4.619397662556433 3 2.7778511650980091 4.1573480615127281 3 3.5355339059327373 3.5355339059327386 3 4.1573480615127263 2.7778511650980109 3 4.6193976625564321 1.9134171618254521 3 4.9039264020161513 0.97545161008064363 3 5 0 1 4.9039264020161522 -0.97545161008064118 1 4.6193976625564339 -1.913417161825449 1 4.1573480615127263 -2.7778511650980109 1 3.5355339059327378 -3.5355339059327373 1 2.7778511650980113 -4.1573480615127254 1 1.9134171618254492 -4.6193976625564339 1 0.97545161008064152 -4.9039264020161522 1 3.0616169978683831e-16 -5 1 -0.97545161008064096 -4.9039264020161522 1 -1.9134171618254485 -4.6193976625564339 1 -2.77785116509801 -4.1573480615127272 1 -3.5355339059327373 -3.5355339059327378 1 -4.1573480615127263 -2.7778511650980109 1 -4.6193976625564339 -1.9134171618254492 1 -4.9039264020161522 -0.97545161008064296 1 -5 -6.1232339957367663e-16 1 -4.9039264020161522 0.97545161008064185 1 -4.6193976625564339 1.9134171618254483 1 -4.1573480615127272 2.77785116509801 1 -3.5355339059327386 3.5355339059327373 1 -2.7778511650980109 4.1573480615127263 1 -1.9134171618254516 4.6193976625564321 1 -0.97545161008064329 4.9039264020161513 1 -9.1848509936051479e-16 5 1 0.97545161008064141 4.9039264020161522 1 1.9134171618254501 4.619397662556433 1 2.7778511650980091 4.1573480615127281 1 3.5355339059327373 3.5355339059327386 1 4.1573480615127263 2.7778511650980109 1 4.6193976625564321 1.9134171618254521 1 4.9039264020161513 0.97545161008064363 1 5 0 -1 4.9039264020161522 -0.97545161008064118 -1 4.6193976625564339 -1.913417161825449 -1 4.1573480615127263 -2.7778511650980109 -1 3.5355339059327378 -3.5355339059327373 -1 2.7778511650980113 -4.1573480615127254 -1 1.9134171618254492 -4.6193976625564339 -1 0.97545161008064152 -4.9039264020161522 -1 3.0616169978683831e-16 -5 -1 -0.97545161008064096 -4.9039264020161522 -1 -1.9134171618254485 -4.6193976625564339 -1 -2.77785116509801 -4.1573480615127272 -1 -3.5355339059327373 -3.5355339059327378 -1 -4.1573480615127263 -2.7778511650980109 -1 -4.6193976625564339 -1.9134171618254492 -1 -4.9039264020161522 -0.97545161008064296 -1 -5 -6.1232339957367663e-16 -1 -4.9039264020161522 0.97545161008064185 -1 -4.6193976625564339 1.9134171618254483 -1 -4.1573480615127272 2.77785116509801 -1 -3.5355339059327386 3.5355339059327373 -1 -2.7778511650980109 4.1573480615127263 -1 -1.9134171618254516 4.6193976625564321 -1 -0.97545161008064329 4.9039264020161513 -1 -9.1848509936051479e-16 5 -1 0.97545161008064141 4.9039264020161522 -1 1.9134171618254501 4.619397662556433 -1 2.7778511650980091 4.1573480615127281 -1 3.5355339059327373 3.5355339059327386 -1 4.1573480615127263 2.7778511650980109 -1 4.6193976625564321 1.9134171618254521 -1 4.9039264020161513 0.97545161008064363 -1 5 0 -3 4.9039264020161522 -0.97545161008064118 -3 4.6193976625564339 -1.913417161825449 -3 4.1573480615127263 -2.7778511650980109 -3 3.5355339059327378 -3.5355339059327373 -3 2.7778511650980113 -4.1573480615127254 -3 1.9134171618254492 -4.6193976625564339 -3 0.97545161008064152 -4.9039264020161522 -3 3.0616169978683831e-16 -5 -3 -0.97545161008064096 -4.9039264020161522 -3 -1.9134171618254485 -4.6193976625564339 -3 -2.77785116509801 -4.1573480615127272 -3 -3.5355339059327373 -3.5355339059327378 -3 -4.1573480615127263 -2.7778511650980109 -3 -4.6193976625564339 -1.9134171618254492 -3 -4.9039264020161522 -0.97545161008064296 -3 -5 -6.1232339957367663e-16 -3 -4.9039264020161522 0.97545161008064185 -3 -4.6193976625564339 1.9134171618254483 -3 -4.1573480615127272 2.77785116509801 -3 -3.5355339059327386 3.5355339059327373 -3 -2.7778511650980109 4.1573480615127263 -3 -1.9134171618254516 4.6193976625564321 -3 -0.97545161008064329 4.9039264020161513 -3 -9.1848509936051479e-16 5 -3 0.97545161008064141 4.9039264020161522 -3 1.9134171618254501 4.619397662556433 -3 2.7778511650980091 4.1573480615127281 -3 3.5355339059327373 3.5355339059327386 -3 4.1573480615127263 2.7778511650980109 -3 4.6193976625564321 1.9134171618254521 -3 4.9039264020161513 0.97545161008064363 -3 5 0 -5 4.9039264020161522 -0.97545161008064118 -5 4.6193976625564339 -1.913417161825449 -5 4.1573480615127263 -2.7778511650980109 -5 3.5355339059327378 -3.5355339059327373 -5 2.7778511650980113 -4.1573480615127254 -5 1.9134171618254492 -4.6193976625564339 -5 0.97545161008064152 -4.9039264020161522 -5 3.0616169978683831e-16 -5 -5 -0.97545161008064096 -4.9039264020161522 -5 -1.9134171618254485 -4.6193976625564339 -5 -2.77785116509801 -4.1573480615127272 -5 -3.5355339059327373 -3.5355339059327378 -5 -4.1573480615127263 -2.7778511650980109 -5 -4.6193976625564339 -1.9134171618254492 -5 -4.9039264020161522 -0.97545161008064296 -5 -5 -6.1232339957367663e-16 -5 -4.9039264020161522 0.97545161008064185 -5 -4.6193976625564339 1.9134171618254483 -5 -4.1573480615127272 2.77785116509801 -5 -3.5355339059327386 3.5355339059327373 -5 -2.7778511650980109 4.1573480615127263 -5 -1.9134171618254516 4.6193976625564321 -5 -0.97545161008064329 4.9039264020161513 -5 -9.1848509936051479e-16 5 -5 0.97545161008064141 4.9039264020161522 -5 1.9134171618254501 4.619397662556433 -5 2.7778511650980091 4.1573480615127281 -5 3.5355339059327373 3.5355339059327386 -5 4.1573480615127263 2.7778511650980109 -5 4.6193976625564321 1.9134171618254521 -5 4.9039264020161513 0.97545161008064363 -5 0 0 5 2.5 0 5 2.4519632010080761 -0.48772580504032059 5 2.309698831278217 -0.95670858091272448 5 2.0786740307563631 -1.3889255825490054 5 1.7677669529663689 -1.7677669529663687 5 1.3889255825490057 -2.0786740307563627 5 0.95670858091272459 -2.309698831278217 5 0.48772580504032076 -2.4519632010080761 5 1.5308084989341916e-16 -2.5 5 -0.48772580504032048 -2.4519632010080761 5 -0.95670858091272426 -2.309698831278217 5 -1.388925582549005 -2.0786740307563636 5 -1.7677669529663687 -1.7677669529663689 5 -2.0786740307563631 -1.3889255825490054 5 -2.309698831278217 -0.95670858091272459 5 -2.4519632010080761 -0.48772580504032148 5 -2.5 -3.0616169978683831e-16 5 -2.4519632010080761 0.48772580504032093 5 -2.309698831278217 0.95670858091272415 5 -2.0786740307563636 1.388925582549005 5 -1.7677669529663693 1.7677669529663687 5 -1.3889255825490054 2.0786740307563631 5 -0.95670858091272581 2.3096988312782161 5 -0.48772580504032165 2.4519632010080756 5 -4.592425496802574e-16 2.5 5 0.4877258050403207 2.4519632010080761 5 0.95670858091272504 2.3096988312782165 5 1.3889255825490046 2.078674030756364 5 1.7677669529663687 1.7677669529663693 5 2.0786740307563631 1.3889255825490054 5 2.3096988312782161 0.95670858091272604 5 2.4519632010080756 0.48772580504032181 5 0 0 -5 2.5 0 -5 2.4519632010080761 -0.48772580504032059 -5 2.309698831278217 -0.95670858091272448 -5 2.0786740307563631 -1.3889255825490054 -5 1.7677669529663689 -1.7677669529663687 -5 1.3889255825490057 -2.0786740307563627 -5 0.95670858091272459 -2.309698831278217 -5 0.48772580504032076 -2.4519632010080761 -5 1.5308084989341916e-16 -2.5 -5 -0.48772580504032048 -2.4519632010080761 -5 -0.95670858091272426 -2.309698831278217 -5 -1.388925582549005 -2.0786740307563636 -5 -1.7677669529663687 -1.7677669529663689 -5 -2.0786740307563631 -1.3889255825490054 -5 -2.309698831278217 -0.95670858091272459 -5 -2.4519632010080761 -0.48772580504032148 -5 -2.5 -3.0616169978683831e-16 -5 -2.4519632010080761 0.48772580504032093 -5 -2.309698831278217 0.95670858091272415 -5 -2.0786740307563636 1.388925582549005 -5 -1.7677669529663693 1.7677669529663687 -5 -1.3889255825490054 2.0786740307563631 -5 -0.95670858091272581 2.3096988312782161 -5 -0.48772580504032165 2.4519632010080756 -5 -4.592425496802574e-16 2.5 -5 0.4877258050403207 2.4519632010080761 -5 0.95670858091272504 2.3096988312782165 -5 1.3889255825490046 2.078674030756364 -5 1.7677669529663687 1.7677669529663693 -5 2.0786740307563631 1.3889255825490054 -5 2.3096988312782161 0.95670858091272604 -5 2.4519632010080756 0.48772580504032181 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 768 772 773 771 775 776 774 778 779 777 781 782 780 784 785 783 787 788 786 790 791 789 793 794 792 796 797 795 799 800 798 802 803 801 805 806 804 808 809 807 811 812 810 814 815 813 817 818 816 820 821 819 823 824 822 826 827 825 829 830 828 832 833 831 835 836 834 838 839 837 841 842 840 844 845 843 847 848 846 850 851 849 853 854 852 856 857 855 859 860 858 862 863 861 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 992 996 997 995 999 1000 998 1002 1003 1001 1005 1006 1004 1008 1009 1007 1011 1012 1010 1014 1015 1013 1017 1018 1016 1020 1021 1019 1023 1024 1022 1026 1027 1025 1029 1030 1028 1032 1033 1031 1035 1036 1034 1038 1039 1037 1041 1042 1040 1044 1045 1043 1047 1048 1046 1050 1051 1049 1053 1054 1052 1056 1057 1055 1059 1060 1058 1062 1063 1061 1065 1066 1064 1068 1069 1067 1071 1072 1070 1074 1075 1073 1077 1078 1076 1080 1081 1079 1083 1084 1082 1086 1087 1085</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 995 998 1001 1004 1007 1010 1013 1016 1019 1022 1025 1028 1031 1034 1037 1040 1043 1046 1049 1052 1055 1058 1061 1064 1067 1070 1073 1076 1079 1082 1085</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 1 0 193 194 2 1 194 195 3 2 195 196 4 3 196 197 5 4 197 198 6 5 198 199 7 6 199 200 8 7 200 201 9 8 201 202 10 9 202 203 11 10 203 204 12 11 204 205 13 12 205 206 14 13 206 207 15 14 207 208 16 15 208 209 17 16 209 210 18 17 210 211 19 18 211 212 20 19 212 213 21 20 213 214 22 21 214 215 23 22 215 216 24 23 216 217 25 24 217 218 26 25 218 219 27 26 219 220 28 27 220 221 29 28 221 222 30 29 222 223 31 30 223 224 0 31 224 193 194 193 192 195 194 192 196 195 192 197 196 192 198 197 192 199 198 192 200 199 192 201 200 192 202 201 192 203 202 192 204 203 192 205 204 192 206 205 192 207 206 192 208 207 192 209 208 192 210 209 192 211 210 192 212 211 192 213 212 192 214 213 192 215 214 192 216 215 192 217 216 192 218 217 192 219 218 192 220 219 192 221 220 192 222 221 192 223 222 192 224 223 192 193 224 192 160 161 227 226 161 162 228 227 162 163 229 228 163 164 230 229 164 165 231 230 165 166 232 231 166 167 233 232 167 168 234 233 168 169 235 234 169 170 236 235 170 171 237 236 171 172 238 237 172 173 239 238 173 174 240 239 174 175 241 240 175 176 242 241 176 177 243 242 177 178 244 243 178 179 245 244 179 180 246 245 180 181 247 246 181 182 248 247 182 183 249 248 183 184 250 249 184 185 251 250 185 186 252 251 186 187 253 252 187 188 254 253 188 189 255 254 189 190 256 255 190 191 257 256 191 160 226 257 226 227 225 227 228 225 228 229 225 229 230 225 230 231 225 231 232 225 232 233 225 233 234 225 234 235 225 235 236 225 236 237 225 237 238 225 238 239 225 239 240 225 240 241 225 241 242 225 242 243 225 243 244 225 244 245 225 245 246 225 246 247 225 247 248 225 248 249 225 249 250 225 250 251 225 251 252 225 252 253 225 253 254 225 254 255 225 255 256 225 256 257 225 257 226 225\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyCylinder.caps.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 4.9039264020161522 -0.97545161008064118 5 4.6193976625564339 -1.913417161825449 5 4.1573480615127263 -2.7778511650980109 5 3.5355339059327378 -3.5355339059327373 5 2.7778511650980113 -4.1573480615127263 5 1.9134171618254492 -4.6193976625564339 5 0.97545161008064163 -4.9039264020161522 5 3.0615158845559431e-16 -5 5 -0.97545161008064096 -4.9039264020161522 5 -1.9134171618254485 -4.6193976625564339 5 -2.77785116509801 -4.1573480615127272 5 -3.5355339059327373 -3.5355339059327378 5 -4.1573480615127263 -2.7778511650980109 5 -4.6193976625564339 -1.9134171618254494 5 -4.9039264020161522 -0.97545161008064307 5 -5 -6.1230317691118863e-16 5 -4.9039264020161522 0.97545161008064185 5 -4.6193976625564339 1.9134171618254483 5 -4.1573480615127272 2.77785116509801 5 -3.5355339059327386 3.5355339059327373 5 -2.7778511650980109 4.1573480615127263 5 -1.9134171618254516 4.6193976625564321 5 -0.97545161008064329 4.9039264020161513 5 -9.1845476536678294e-16 5 5 0.97545161008064152 4.9039264020161522 5 1.9134171618254501 4.619397662556433 5 2.7778511650980091 4.1573480615127272 5 3.5355339059327369 3.5355339059327386 5 4.1573480615127263 2.7778511650980109 5 4.6193976625564321 1.9134171618254521 5 4.9039264020161513 0.97545161008064363 5 5 0 3 4.9039264020161522 -0.97545161008064118 3 4.6193976625564339 -1.913417161825449 3 4.1573480615127263 -2.7778511650980109 3 3.5355339059327378 -3.5355339059327373 3 2.7778511650980113 -4.1573480615127263 3 1.9134171618254492 -4.6193976625564339 3 0.97545161008064163 -4.9039264020161522 3 3.0615158845559431e-16 -5 3 -0.97545161008064096 -4.9039264020161522 3 -1.9134171618254485 -4.6193976625564339 3 -2.77785116509801 -4.1573480615127272 3 -3.5355339059327373 -3.5355339059327378 3 -4.1573480615127263 -2.7778511650980109 3 -4.6193976625564339 -1.9134171618254494 3 -4.9039264020161522 -0.97545161008064307 3 -5 -6.1230317691118863e-16 3 -4.9039264020161522 0.97545161008064185 3 -4.6193976625564339 1.9134171618254483 3 -4.1573480615127272 2.77785116509801 3 -3.5355339059327386 3.5355339059327373 3 -2.7778511650980109 4.1573480615127263 3 -1.9134171618254516 4.6193976625564321 3 -0.97545161008064329 4.9039264020161513 3 -9.1845476536678294e-16 5 3 0.97545161008064152 4.9039264020161522 3 1.9134171618254501 4.619397662556433 3 2.7778511650980091 4.1573480615127272 3 3.5355339059327369 3.5355339059327386 3 4.1573480615127263 2.7778511650980109 3 4.6193976625564321 1.9134171618254521 3 4.9039264020161513 0.97545161008064363 3 5 0 0.99999999999999978 4.9039264020161522 -0.97545161008064118 0.99999999999999978 4.6193976625564339 -1.913417161825449 0.99999999999999978 4.1573480615127263 -2.7778511650980109 0.99999999999999978 3.5355339059327378 -3.5355339059327373 0.99999999999999978 2.7778511650980113 -4.1573480615127263 0.99999999999999978 1.9134171618254492 -4.6193976625564339 0.99999999999999978 0.97545161008064163 -4.9039264020161522 0.99999999999999978 3.0615158845559431e-16 -5 0.99999999999999978 -0.97545161008064096 -4.9039264020161522 0.99999999999999978 -1.9134171618254485 -4.6193976625564339 0.99999999999999978 -2.77785116509801 -4.1573480615127272 0.99999999999999978 -3.5355339059327373 -3.5355339059327378 0.99999999999999978 -4.1573480615127263 -2.7778511650980109 0.99999999999999978 -4.6193976625564339 -1.9134171618254494 0.99999999999999978 -4.9039264020161522 -0.97545161008064307 0.99999999999999978 -5 -6.1230317691118863e-16 0.99999999999999978 -4.9039264020161522 0.97545161008064185 0.99999999999999978 -4.6193976625564339 1.9134171618254483 0.99999999999999978 -4.1573480615127272 2.77785116509801 0.99999999999999978 -3.5355339059327386 3.5355339059327373 0.99999999999999978 -2.7778511650980109 4.1573480615127263 0.99999999999999978 -1.9134171618254516 4.6193976625564321 0.99999999999999978 -0.97545161008064329 4.9039264020161513 0.99999999999999978 -9.1845476536678294e-16 5 0.99999999999999978 0.97545161008064152 4.9039264020161522 0.99999999999999978 1.9134171618254501 4.619397662556433 0.99999999999999978 2.7778511650980091 4.1573480615127272 0.99999999999999978 3.5355339059327369 3.5355339059327386 0.99999999999999978 4.1573480615127263 2.7778511650980109 0.99999999999999978 4.6193976625564321 1.9134171618254521 0.99999999999999978 4.9039264020161513 0.97545161008064363 0.99999999999999978 5 0 -0.99999999999999978 4.9039264020161522 -0.97545161008064118 -0.99999999999999978 4.6193976625564339 -1.913417161825449 -0.99999999999999978 4.1573480615127263 -2.7778511650980109 -0.99999999999999978 3.5355339059327378 -3.5355339059327373 -0.99999999999999978 2.7778511650980113 -4.1573480615127263 -0.99999999999999978 1.9134171618254492 -4.6193976625564339 -0.99999999999999978 0.97545161008064163 -4.9039264020161522 -0.99999999999999978 3.0615158845559431e-16 -5 -0.99999999999999978 -0.97545161008064096 -4.9039264020161522 -0.99999999999999978 -1.9134171618254485 -4.6193976625564339 -0.99999999999999978 -2.77785116509801 -4.1573480615127272 -0.99999999999999978 -3.5355339059327373 -3.5355339059327378 -0.99999999999999978 -4.1573480615127263 -2.7778511650980109 -0.99999999999999978 -4.6193976625564339 -1.9134171618254494 -0.99999999999999978 -4.9039264020161522 -0.97545161008064307 -0.99999999999999978 -5 -6.1230317691118863e-16 -0.99999999999999978 -4.9039264020161522 0.97545161008064185 -0.99999999999999978 -4.6193976625564339 1.9134171618254483 -0.99999999999999978 -4.1573480615127272 2.77785116509801 -0.99999999999999978 -3.5355339059327386 3.5355339059327373 -0.99999999999999978 -2.7778511650980109 4.1573480615127263 -0.99999999999999978 -1.9134171618254516 4.6193976625564321 -0.99999999999999978 -0.97545161008064329 4.9039264020161513 -0.99999999999999978 -9.1845476536678294e-16 5 -0.99999999999999978 0.97545161008064152 4.9039264020161522 -0.99999999999999978 1.9134171618254501 4.619397662556433 -0.99999999999999978 2.7778511650980091 4.1573480615127272 -0.99999999999999978 3.5355339059327369 3.5355339059327386 -0.99999999999999978 4.1573480615127263 2.7778511650980109 -0.99999999999999978 4.6193976625564321 1.9134171618254521 -0.99999999999999978 4.9039264020161513 0.97545161008064363 -0.99999999999999978 5 0 -3.0000000000000004 4.9039264020161522 -0.97545161008064118 -3.0000000000000004 4.6193976625564339 -1.913417161825449 -3.0000000000000004 4.1573480615127263 -2.7778511650980109 -3.0000000000000004 3.5355339059327378 -3.5355339059327373 -3.0000000000000004 2.7778511650980113 -4.1573480615127263 -3.0000000000000004 1.9134171618254492 -4.6193976625564339 -3.0000000000000004 0.97545161008064163 -4.9039264020161522 -3.0000000000000004 3.0615158845559431e-16 -5 -3.0000000000000004 -0.97545161008064096 -4.9039264020161522 -3.0000000000000004 -1.9134171618254485 -4.6193976625564339 -3.0000000000000004 -2.77785116509801 -4.1573480615127272 -3.0000000000000004 -3.5355339059327373 -3.5355339059327378 -3.0000000000000004 -4.1573480615127263 -2.7778511650980109 -3.0000000000000004 -4.6193976625564339 -1.9134171618254494 -3.0000000000000004 -4.9039264020161522 -0.97545161008064307 -3.0000000000000004 -5 -6.1230317691118863e-16 -3.0000000000000004 -4.9039264020161522 0.97545161008064185 -3.0000000000000004 -4.6193976625564339 1.9134171618254483 -3.0000000000000004 -4.1573480615127272 2.77785116509801 -3.0000000000000004 -3.5355339059327386 3.5355339059327373 -3.0000000000000004 -2.7778511650980109 4.1573480615127263 -3.0000000000000004 -1.9134171618254516 4.6193976625564321 -3.0000000000000004 -0.97545161008064329 4.9039264020161513 -3.0000000000000004 -9.1845476536678294e-16 5 -3.0000000000000004 0.97545161008064152 4.9039264020161522 -3.0000000000000004 1.9134171618254501 4.619397662556433 -3.0000000000000004 2.7778511650980091 4.1573480615127272 -3.0000000000000004 3.5355339059327369 3.5355339059327386 -3.0000000000000004 4.1573480615127263 2.7778511650980109 -3.0000000000000004 4.6193976625564321 1.9134171618254521 -3.0000000000000004 4.9039264020161513 0.97545161008064363 -3.0000000000000004 5 0 -5 4.9039264020161522 -0.97545161008064118 -5 4.6193976625564339 -1.913417161825449 -5 4.1573480615127263 -2.7778511650980109 -5 3.5355339059327378 -3.5355339059327373 -5 2.7778511650980113 -4.1573480615127263 -5 1.9134171618254492 -4.6193976625564339 -5 0.97545161008064163 -4.9039264020161522 -5 3.0615158845559431e-16 -5 -5 -0.97545161008064096 -4.9039264020161522 -5 -1.9134171618254485 -4.6193976625564339 -5 -2.77785116509801 -4.1573480615127272 -5 -3.5355339059327373 -3.5355339059327378 -5 -4.1573480615127263 -2.7778511650980109 -5 -4.6193976625564339 -1.9134171618254494 -5 -4.9039264020161522 -0.97545161008064307 -5 -5 -6.1230317691118863e-16 -5 -4.9039264020161522 0.97545161008064185 -5 -4.6193976625564339 1.9134171618254483 -5 -4.1573480615127272 2.77785116509801 -5 -3.5355339059327386 3.5355339059327373 -5 -2.7778511650980109 4.1573480615127263 -5 -1.9134171618254516 4.6193976625564321 -5 -0.97545161008064329 4.9039264020161513 -5 -9.1845476536678294e-16 5 -5 0.97545161008064152 4.9039264020161522 -5 1.9134171618254501 4.619397662556433 -5 2.7778511650980091 4.1573480615127272 -5 3.5355339059327369 3.5355339059327386 -5 4.1573480615127263 2.7778511650980109 -5 4.6193976625564321 1.9134171618254521 -5 4.9039264020161513 0.97545161008064363 -5 0 0 5 2.5 0 5 2.4519632010080761 -0.48772580504032059 5 2.309698831278217 -0.95670858091272448 5 2.0786740307563631 -1.3889255825490054 5 1.7677669529663689 -1.7677669529663687 5 1.3889255825490057 -2.0786740307563631 5 0.95670858091272459 -2.309698831278217 5 0.48772580504032081 -2.4519632010080761 5 1.5307579422779716e-16 -2.5 5 -0.48772580504032048 -2.4519632010080761 5 -0.95670858091272426 -2.309698831278217 5 -1.388925582549005 -2.0786740307563636 5 -1.7677669529663687 -1.7677669529663689 5 -2.0786740307563631 -1.3889255825490054 5 -2.309698831278217 -0.9567085809127247 5 -2.4519632010080761 -0.48772580504032154 5 -2.5 -3.0615158845559431e-16 5 -2.4519632010080761 0.48772580504032093 5 -2.309698831278217 0.95670858091272415 5 -2.0786740307563636 1.388925582549005 5 -1.7677669529663693 1.7677669529663687 5 -1.3889255825490054 2.0786740307563631 5 -0.95670858091272581 2.3096988312782161 5 -0.48772580504032165 2.4519632010080756 5 -4.5922738268339147e-16 2.5 5 0.48772580504032076 2.4519632010080761 5 0.95670858091272504 2.3096988312782165 5 1.3889255825490046 2.0786740307563636 5 1.7677669529663684 1.7677669529663693 5 2.0786740307563631 1.3889255825490054 5 2.3096988312782161 0.95670858091272604 5 2.4519632010080756 0.48772580504032181 5 0 0 -5 2.5 0 -5 2.4519632010080761 -0.48772580504032059 -5 2.309698831278217 -0.95670858091272448 -5 2.0786740307563631 -1.3889255825490054 -5 1.7677669529663689 -1.7677669529663687 -5 1.3889255825490057 -2.0786740307563631 -5 0.95670858091272459 -2.309698831278217 -5 0.48772580504032081 -2.4519632010080761 -5 1.5307579422779716e-16 -2.5 -5 -0.48772580504032048 -2.4519632010080761 -5 -0.95670858091272426 -2.309698831278217 -5 -1.388925582549005 -2.0786740307563636 -5 -1.7677669529663687 -1.7677669529663689 -5 -2.0786740307563631 -1.3889255825490054 -5 -2.309698831278217 -0.9567085809127247 -5 -2.4519632010080761 -0.48772580504032154 -5 -2.5 -3.0615158845559431e-16 -5 -2.4519632010080761 0.48772580504032093 -5 -2.309698831278217 0.95670858091272415 -5 -2.0786740307563636 1.388925582549005 -5 -1.7677669529663693 1.7677669529663687 -5 -1.3889255825490054 2.0786740307563631 -5 -0.95670858091272581 2.3096988312782161 -5 -0.48772580504032165 2.4519632010080756 -5 -4.5922738268339147e-16 2.5 -5 0.48772580504032076 2.4519632010080761 -5 0.95670858091272504 2.3096988312782165 -5 1.3889255825490046 2.0786740307563636 -5 1.7677669529663684 1.7677669529663693 -5 2.0786740307563631 1.3889255825490054 -5 2.3096988312782161 0.95670858091272604 -5 2.4519632010080756 0.48772580504032181 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 768 772 773 771 775 776 774 778 779 777 781 782 780 784 785 783 787 788 786 790 791 789 793 794 792 796 797 795 799 800 798 802 803 801 805 806 804 808 809 807 811 812 810 814 815 813 817 818 816 820 821 819 823 824 822 826 827 825 829 830 828 832 833 831 835 836 834 838 839 837 841 842 840 844 845 843 847 848 846 850 851 849 853 854 852 856 857 855 859 860 858 862 863 861 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 992 996 997 995 999 1000 998 1002 1003 1001 1005 1006 1004 1008 1009 1007 1011 1012 1010 1014 1015 1013 1017 1018 1016 1020 1021 1019 1023 1024 1022 1026 1027 1025 1029 1030 1028 1032 1033 1031 1035 1036 1034 1038 1039 1037 1041 1042 1040 1044 1045 1043 1047 1048 1046 1050 1051 1049 1053 1054 1052 1056 1057 1055 1059 1060 1058 1062 1063 1061 1065 1066 1064 1068 1069 1067 1071 1072 1070 1074 1075 1073 1077 1078 1076 1080 1081 1079 1083 1084 1082 1086 1087 1085</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 995 998 1001 1004 1007 1010 1013 1016 1019 1022 1025 1028 1031 1034 1037 1040 1043 1046 1049 1052 1055 1058 1061 1064 1067 1070 1073 1076 1079 1082 1085</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 1 0 193 194 2 1 194 195 3 2 195 196 4 3 196 197 5 4 197 198 6 5 198 199 7 6 199 200 8 7 200 201 9 8 201 202 10 9 202 203 11 10 203 204 12 11 204 205 13 12 205 206 14 13 206 207 15 14 207 208 16 15 208 209 17 16 209 210 18 17 210 211 19 18 211 212 20 19 212 213 21 20 213 214 22 21 214 215 23 22 215 216 24 23 216 217 25 24 217 218 26 25 218 219 27 26 219 220 28 27 220 221 29 28 221 222 30 29 222 223 31 30 223 224 0 31 224 193 194 193 192 195 194 192 196 195 192 197 196 192 198 197 192 199 198 192 200 199 192 201 200 192 202 201 192 203 202 192 204 203 192 205 204 192 206 205 192 207 206 192 208 207 192 209 208 192 210 209 192 211 210 192 212 211 192 213 212 192 214 213 192 215 214 192 216 215 192 217 216 192 218 217 192 219 218 192 220 219 192 221 220 192 222 221 192 223 222 192 224 223 192 193 224 192 160 161 227 226 161 162 228 227 162 163 229 228 163 164 230 229 164 165 231 230 165 166 232 231 166 167 233 232 167 168 234 233 168 169 235 234 169 170 236 235 170 171 237 236 171 172 238 237 172 173 239 238 173 174 240 239 174 175 241 240 175 176 242 241 176 177 243 242 177 178 244 243 178 179 245 244 179 180 246 245 180 181 247 246 181 182 248 247 182 183 249 248 183 184 250 249 184 185 251 250 185 186 252 251 186 187 253 252 187 188 254 253 188 189 255 254 189 190 256 255 190 191 257 256 191 160 226 257 226 227 225 227 228 225 228 229 225 229 230 225 230 231 225 231 232 225 232 233 225 233 234 225 234 235 225 235 236 225 236 237 225 237 238 225 238 239 225 239 240 225 240 241 225 241 242 225 242 243 225 243 244 225 244 245 225 245 246 225 246 247 225 247 248 225 248 249 225 249 250 225 250 251 225 251 252 225 252 253 225 253 254 225 254 255 225 255 256 225 256 257 225 257 226 225\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyCylinder.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 4.9039264020161522 -0.97545161008064118 5 4.6193976625564339 -1.913417161825449 5 4.1573480615127263 -2.7778511650980109 5 3.5355339059327378 -3.5355339059327373 5 2.7778511650980113 -4.1573480615127254 5 1.9134171618254492 -4.6193976625564339 5 0.97545161008064152 -4.9039264020161522 5 3.0616169978683831e-16 -5 5 -0.97545161008064096 -4.9039264020161522 5 -1.9134171618254485 -4.6193976625564339 5 -2.77785116509801 -4.1573480615127272 5 -3.5355339059327373 -3.5355339059327378 5 -4.1573480615127263 -2.7778511650980109 5 -4.6193976625564339 -1.9134171618254492 5 -4.9039264020161522 -0.97545161008064296 5 -5 -6.1232339957367663e-16 5 -4.9039264020161522 0.97545161008064185 5 -4.6193976625564339 1.9134171618254483 5 -4.1573480615127272 2.77785116509801 5 -3.5355339059327386 3.5355339059327373 5 -2.7778511650980109 4.1573480615127263 5 -1.9134171618254516 4.6193976625564321 5 -0.97545161008064329 4.9039264020161513 5 -9.1848509936051479e-16 5 5 0.97545161008064141 4.9039264020161522 5 1.9134171618254501 4.619397662556433 5 2.7778511650980091 4.1573480615127281 5 3.5355339059327373 3.5355339059327386 5 4.1573480615127263 2.7778511650980109 5 4.6193976625564321 1.9134171618254521 5 4.9039264020161513 0.97545161008064363 5 5 0 3 4.9039264020161522 -0.97545161008064118 3 4.6193976625564339 -1.913417161825449 3 4.1573480615127263 -2.7778511650980109 3 3.5355339059327378 -3.5355339059327373 3 2.7778511650980113 -4.1573480615127254 3 1.9134171618254492 -4.6193976625564339 3 0.97545161008064152 -4.9039264020161522 3 3.0616169978683831e-16 -5 3 -0.97545161008064096 -4.9039264020161522 3 -1.9134171618254485 -4.6193976625564339 3 -2.77785116509801 -4.1573480615127272 3 -3.5355339059327373 -3.5355339059327378 3 -4.1573480615127263 -2.7778511650980109 3 -4.6193976625564339 -1.9134171618254492 3 -4.9039264020161522 -0.97545161008064296 3 -5 -6.1232339957367663e-16 3 -4.9039264020161522 0.97545161008064185 3 -4.6193976625564339 1.9134171618254483 3 -4.1573480615127272 2.77785116509801 3 -3.5355339059327386 3.5355339059327373 3 -2.7778511650980109 4.1573480615127263 3 -1.9134171618254516 4.6193976625564321 3 -0.97545161008064329 4.9039264020161513 3 -9.1848509936051479e-16 5 3 0.97545161008064141 4.9039264020161522 3 1.9134171618254501 4.619397662556433 3 2.7778511650980091 4.1573480615127281 3 3.5355339059327373 3.5355339059327386 3 4.1573480615127263 2.7778511650980109 3 4.6193976625564321 1.9134171618254521 3 4.9039264020161513 0.97545161008064363 3 5 0 1 4.9039264020161522 -0.97545161008064118 1 4.6193976625564339 -1.913417161825449 1 4.1573480615127263 -2.7778511650980109 1 3.5355339059327378 -3.5355339059327373 1 2.7778511650980113 -4.1573480615127254 1 1.9134171618254492 -4.6193976625564339 1 0.97545161008064152 -4.9039264020161522 1 3.0616169978683831e-16 -5 1 -0.97545161008064096 -4.9039264020161522 1 -1.9134171618254485 -4.6193976625564339 1 -2.77785116509801 -4.1573480615127272 1 -3.5355339059327373 -3.5355339059327378 1 -4.1573480615127263 -2.7778511650980109 1 -4.6193976625564339 -1.9134171618254492 1 -4.9039264020161522 -0.97545161008064296 1 -5 -6.1232339957367663e-16 1 -4.9039264020161522 0.97545161008064185 1 -4.6193976625564339 1.9134171618254483 1 -4.1573480615127272 2.77785116509801 1 -3.5355339059327386 3.5355339059327373 1 -2.7778511650980109 4.1573480615127263 1 -1.9134171618254516 4.6193976625564321 1 -0.97545161008064329 4.9039264020161513 1 -9.1848509936051479e-16 5 1 0.97545161008064141 4.9039264020161522 1 1.9134171618254501 4.619397662556433 1 2.7778511650980091 4.1573480615127281 1 3.5355339059327373 3.5355339059327386 1 4.1573480615127263 2.7778511650980109 1 4.6193976625564321 1.9134171618254521 1 4.9039264020161513 0.97545161008064363 1 5 0 -1 4.9039264020161522 -0.97545161008064118 -1 4.6193976625564339 -1.913417161825449 -1 4.1573480615127263 -2.7778511650980109 -1 3.5355339059327378 -3.5355339059327373 -1 2.7778511650980113 -4.1573480615127254 -1 1.9134171618254492 -4.6193976625564339 -1 0.97545161008064152 -4.9039264020161522 -1 3.0616169978683831e-16 -5 -1 -0.97545161008064096 -4.9039264020161522 -1 -1.9134171618254485 -4.6193976625564339 -1 -2.77785116509801 -4.1573480615127272 -1 -3.5355339059327373 -3.5355339059327378 -1 -4.1573480615127263 -2.7778511650980109 -1 -4.6193976625564339 -1.9134171618254492 -1 -4.9039264020161522 -0.97545161008064296 -1 -5 -6.1232339957367663e-16 -1 -4.9039264020161522 0.97545161008064185 -1 -4.6193976625564339 1.9134171618254483 -1 -4.1573480615127272 2.77785116509801 -1 -3.5355339059327386 3.5355339059327373 -1 -2.7778511650980109 4.1573480615127263 -1 -1.9134171618254516 4.6193976625564321 -1 -0.97545161008064329 4.9039264020161513 -1 -9.1848509936051479e-16 5 -1 0.97545161008064141 4.9039264020161522 -1 1.9134171618254501 4.619397662556433 -1 2.7778511650980091 4.1573480615127281 -1 3.5355339059327373 3.5355339059327386 -1 4.1573480615127263 2.7778511650980109 -1 4.6193976625564321 1.9134171618254521 -1 4.9039264020161513 0.97545161008064363 -1 5 0 -3 4.9039264020161522 -0.97545161008064118 -3 4.6193976625564339 -1.913417161825449 -3 4.1573480615127263 -2.7778511650980109 -3 3.5355339059327378 -3.5355339059327373 -3 2.7778511650980113 -4.1573480615127254 -3 1.9134171618254492 -4.6193976625564339 -3 0.97545161008064152 -4.9039264020161522 -3 3.0616169978683831e-16 -5 -3 -0.97545161008064096 -4.9039264020161522 -3 -1.9134171618254485 -4.6193976625564339 -3 -2.77785116509801 -4.1573480615127272 -3 -3.5355339059327373 -3.5355339059327378 -3 -4.1573480615127263 -2.7778511650980109 -3 -4.6193976625564339 -1.9134171618254492 -3 -4.9039264020161522 -0.97545161008064296 -3 -5 -6.1232339957367663e-16 -3 -4.9039264020161522 0.97545161008064185 -3 -4.6193976625564339 1.9134171618254483 -3 -4.1573480615127272 2.77785116509801 -3 -3.5355339059327386 3.5355339059327373 -3 -2.7778511650980109 4.1573480615127263 -3 -1.9134171618254516 4.6193976625564321 -3 -0.97545161008064329 4.9039264020161513 -3 -9.1848509936051479e-16 5 -3 0.97545161008064141 4.9039264020161522 -3 1.9134171618254501 4.619397662556433 -3 2.7778511650980091 4.1573480615127281 -3 3.5355339059327373 3.5355339059327386 -3 4.1573480615127263 2.7778511650980109 -3 4.6193976625564321 1.9134171618254521 -3 4.9039264020161513 0.97545161008064363 -3 5 0 -5 4.9039264020161522 -0.97545161008064118 -5 4.6193976625564339 -1.913417161825449 -5 4.1573480615127263 -2.7778511650980109 -5 3.5355339059327378 -3.5355339059327373 -5 2.7778511650980113 -4.1573480615127254 -5 1.9134171618254492 -4.6193976625564339 -5 0.97545161008064152 -4.9039264020161522 -5 3.0616169978683831e-16 -5 -5 -0.97545161008064096 -4.9039264020161522 -5 -1.9134171618254485 -4.6193976625564339 -5 -2.77785116509801 -4.1573480615127272 -5 -3.5355339059327373 -3.5355339059327378 -5 -4.1573480615127263 -2.7778511650980109 -5 -4.6193976625564339 -1.9134171618254492 -5 -4.9039264020161522 -0.97545161008064296 -5 -5 -6.1232339957367663e-16 -5 -4.9039264020161522 0.97545161008064185 -5 -4.6193976625564339 1.9134171618254483 -5 -4.1573480615127272 2.77785116509801 -5 -3.5355339059327386 3.5355339059327373 -5 -2.7778511650980109 4.1573480615127263 -5 -1.9134171618254516 4.6193976625564321 -5 -0.97545161008064329 4.9039264020161513 -5 -9.1848509936051479e-16 5 -5 0.97545161008064141 4.9039264020161522 -5 1.9134171618254501 4.619397662556433 -5 2.7778511650980091 4.1573480615127281 -5 3.5355339059327373 3.5355339059327386 -5 4.1573480615127263 2.7778511650980109 -5 4.6193976625564321 1.9134171618254521 -5 4.9039264020161513 0.97545161008064363 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyCylinder.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 0 5 4.9039264020161522 -0.97545161008064118 5 4.6193976625564339 -1.913417161825449 5 4.1573480615127263 -2.7778511650980109 5 3.5355339059327378 -3.5355339059327373 5 2.7778511650980113 -4.1573480615127263 5 1.9134171618254492 -4.6193976625564339 5 0.97545161008064163 -4.9039264020161522 5 3.0615158845559431e-16 -5 5 -0.97545161008064096 -4.9039264020161522 5 -1.9134171618254485 -4.6193976625564339 5 -2.77785116509801 -4.1573480615127272 5 -3.5355339059327373 -3.5355339059327378 5 -4.1573480615127263 -2.7778511650980109 5 -4.6193976625564339 -1.9134171618254494 5 -4.9039264020161522 -0.97545161008064307 5 -5 -6.1230317691118863e-16 5 -4.9039264020161522 0.97545161008064185 5 -4.6193976625564339 1.9134171618254483 5 -4.1573480615127272 2.77785116509801 5 -3.5355339059327386 3.5355339059327373 5 -2.7778511650980109 4.1573480615127263 5 -1.9134171618254516 4.6193976625564321 5 -0.97545161008064329 4.9039264020161513 5 -9.1845476536678294e-16 5 5 0.97545161008064152 4.9039264020161522 5 1.9134171618254501 4.619397662556433 5 2.7778511650980091 4.1573480615127272 5 3.5355339059327369 3.5355339059327386 5 4.1573480615127263 2.7778511650980109 5 4.6193976625564321 1.9134171618254521 5 4.9039264020161513 0.97545161008064363 5 5 0 3 4.9039264020161522 -0.97545161008064118 3 4.6193976625564339 -1.913417161825449 3 4.1573480615127263 -2.7778511650980109 3 3.5355339059327378 -3.5355339059327373 3 2.7778511650980113 -4.1573480615127263 3 1.9134171618254492 -4.6193976625564339 3 0.97545161008064163 -4.9039264020161522 3 3.0615158845559431e-16 -5 3 -0.97545161008064096 -4.9039264020161522 3 -1.9134171618254485 -4.6193976625564339 3 -2.77785116509801 -4.1573480615127272 3 -3.5355339059327373 -3.5355339059327378 3 -4.1573480615127263 -2.7778511650980109 3 -4.6193976625564339 -1.9134171618254494 3 -4.9039264020161522 -0.97545161008064307 3 -5 -6.1230317691118863e-16 3 -4.9039264020161522 0.97545161008064185 3 -4.6193976625564339 1.9134171618254483 3 -4.1573480615127272 2.77785116509801 3 -3.5355339059327386 3.5355339059327373 3 -2.7778511650980109 4.1573480615127263 3 -1.9134171618254516 4.6193976625564321 3 -0.97545161008064329 4.9039264020161513 3 -9.1845476536678294e-16 5 3 0.97545161008064152 4.9039264020161522 3 1.9134171618254501 4.619397662556433 3 2.7778511650980091 4.1573480615127272 3 3.5355339059327369 3.5355339059327386 3 4.1573480615127263 2.7778511650980109 3 4.6193976625564321 1.9134171618254521 3 4.9039264020161513 0.97545161008064363 3 5 0 0.99999999999999978 4.9039264020161522 -0.97545161008064118 0.99999999999999978 4.6193976625564339 -1.913417161825449 0.99999999999999978 4.1573480615127263 -2.7778511650980109 0.99999999999999978 3.5355339059327378 -3.5355339059327373 0.99999999999999978 2.7778511650980113 -4.1573480615127263 0.99999999999999978 1.9134171618254492 -4.6193976625564339 0.99999999999999978 0.97545161008064163 -4.9039264020161522 0.99999999999999978 3.0615158845559431e-16 -5 0.99999999999999978 -0.97545161008064096 -4.9039264020161522 0.99999999999999978 -1.9134171618254485 -4.6193976625564339 0.99999999999999978 -2.77785116509801 -4.1573480615127272 0.99999999999999978 -3.5355339059327373 -3.5355339059327378 0.99999999999999978 -4.1573480615127263 -2.7778511650980109 0.99999999999999978 -4.6193976625564339 -1.9134171618254494 0.99999999999999978 -4.9039264020161522 -0.97545161008064307 0.99999999999999978 -5 -6.1230317691118863e-16 0.99999999999999978 -4.9039264020161522 0.97545161008064185 0.99999999999999978 -4.6193976625564339 1.9134171618254483 0.99999999999999978 -4.1573480615127272 2.77785116509801 0.99999999999999978 -3.5355339059327386 3.5355339059327373 0.99999999999999978 -2.7778511650980109 4.1573480615127263 0.99999999999999978 -1.9134171618254516 4.6193976625564321 0.99999999999999978 -0.97545161008064329 4.9039264020161513 0.99999999999999978 -9.1845476536678294e-16 5 0.99999999999999978 0.97545161008064152 4.9039264020161522 0.99999999999999978 1.9134171618254501 4.619397662556433 0.99999999999999978 2.7778511650980091 4.1573480615127272 0.99999999999999978 3.5355339059327369 3.5355339059327386 0.99999999999999978 4.1573480615127263 2.7778511650980109 0.99999999999999978 4.6193976625564321 1.9134171618254521 0.99999999999999978 4.9039264020161513 0.97545161008064363 0.99999999999999978 5 0 -0.99999999999999978 4.9039264020161522 -0.97545161008064118 -0.99999999999999978 4.6193976625564339 -1.913417161825449 -0.99999999999999978 4.1573480615127263 -2.7778511650980109 -0.99999999999999978 3.5355339059327378 -3.5355339059327373 -0.99999999999999978 2.7778511650980113 -4.1573480615127263 -0.99999999999999978 1.9134171618254492 -4.6193976625564339 -0.99999999999999978 0.97545161008064163 -4.9039264020161522 -0.99999999999999978 3.0615158845559431e-16 -5 -0.99999999999999978 -0.97545161008064096 -4.9039264020161522 -0.99999999999999978 -1.9134171618254485 -4.6193976625564339 -0.99999999999999978 -2.77785116509801 -4.1573480615127272 -0.99999999999999978 -3.5355339059327373 -3.5355339059327378 -0.99999999999999978 -4.1573480615127263 -2.7778511650980109 -0.99999999999999978 -4.6193976625564339 -1.9134171618254494 -0.99999999999999978 -4.9039264020161522 -0.97545161008064307 -0.99999999999999978 -5 -6.1230317691118863e-16 -0.99999999999999978 -4.9039264020161522 0.97545161008064185 -0.99999999999999978 -4.6193976625564339 1.9134171618254483 -0.99999999999999978 -4.1573480615127272 2.77785116509801 -0.99999999999999978 -3.5355339059327386 3.5355339059327373 -0.99999999999999978 -2.7778511650980109 4.1573480615127263 -0.99999999999999978 -1.9134171618254516 4.6193976625564321 -0.99999999999999978 -0.97545161008064329 4.9039264020161513 -0.99999999999999978 -9.1845476536678294e-16 5 -0.99999999999999978 0.97545161008064152 4.9039264020161522 -0.99999999999999978 1.9134171618254501 4.619397662556433 -0.99999999999999978 2.7778511650980091 4.1573480615127272 -0.99999999999999978 3.5355339059327369 3.5355339059327386 -0.99999999999999978 4.1573480615127263 2.7778511650980109 -0.99999999999999978 4.6193976625564321 1.9134171618254521 -0.99999999999999978 4.9039264020161513 0.97545161008064363 -0.99999999999999978 5 0 -3.0000000000000004 4.9039264020161522 -0.97545161008064118 -3.0000000000000004 4.6193976625564339 -1.913417161825449 -3.0000000000000004 4.1573480615127263 -2.7778511650980109 -3.0000000000000004 3.5355339059327378 -3.5355339059327373 -3.0000000000000004 2.7778511650980113 -4.1573480615127263 -3.0000000000000004 1.9134171618254492 -4.6193976625564339 -3.0000000000000004 0.97545161008064163 -4.9039264020161522 -3.0000000000000004 3.0615158845559431e-16 -5 -3.0000000000000004 -0.97545161008064096 -4.9039264020161522 -3.0000000000000004 -1.9134171618254485 -4.6193976625564339 -3.0000000000000004 -2.77785116509801 -4.1573480615127272 -3.0000000000000004 -3.5355339059327373 -3.5355339059327378 -3.0000000000000004 -4.1573480615127263 -2.7778511650980109 -3.0000000000000004 -4.6193976625564339 -1.9134171618254494 -3.0000000000000004 -4.9039264020161522 -0.97545161008064307 -3.0000000000000004 -5 -6.1230317691118863e-16 -3.0000000000000004 -4.9039264020161522 0.97545161008064185 -3.0000000000000004 -4.6193976625564339 1.9134171618254483 -3.0000000000000004 -4.1573480615127272 2.77785116509801 -3.0000000000000004 -3.5355339059327386 3.5355339059327373 -3.0000000000000004 -2.7778511650980109 4.1573480615127263 -3.0000000000000004 -1.9134171618254516 4.6193976625564321 -3.0000000000000004 -0.97545161008064329 4.9039264020161513 -3.0000000000000004 -9.1845476536678294e-16 5 -3.0000000000000004 0.97545161008064152 4.9039264020161522 -3.0000000000000004 1.9134171618254501 4.619397662556433 -3.0000000000000004 2.7778511650980091 4.1573480615127272 -3.0000000000000004 3.5355339059327369 3.5355339059327386 -3.0000000000000004 4.1573480615127263 2.7778511650980109 -3.0000000000000004 4.6193976625564321 1.9134171618254521 -3.0000000000000004 4.9039264020161513 0.97545161008064363 -3.0000000000000004 5 0 -5 4.9039264020161522 -0.97545161008064118 -5 4.6193976625564339 -1.913417161825449 -5 4.1573480615127263 -2.7778511650980109 -5 3.5355339059327378 -3.5355339059327373 -5 2.7778511650980113 -4.1573480615127263 -5 1.9134171618254492 -4.6193976625564339 -5 0.97545161008064163 -4.9039264020161522 -5 3.0615158845559431e-16 -5 -5 -0.97545161008064096 -4.9039264020161522 -5 -1.9134171618254485 -4.6193976625564339 -5 -2.77785116509801 -4.1573480615127272 -5 -3.5355339059327373 -3.5355339059327378 -5 -4.1573480615127263 -2.7778511650980109 -5 -4.6193976625564339 -1.9134171618254494 -5 -4.9039264020161522 -0.97545161008064307 -5 -5 -6.1230317691118863e-16 -5 -4.9039264020161522 0.97545161008064185 -5 -4.6193976625564339 1.9134171618254483 -5 -4.1573480615127272 2.77785116509801 -5 -3.5355339059327386 3.5355339059327373 -5 -2.7778511650980109 4.1573480615127263 -5 -1.9134171618254516 4.6193976625564321 -5 -0.97545161008064329 4.9039264020161513 -5 -9.1845476536678294e-16 5 -5 0.97545161008064152 4.9039264020161522 -5 1.9134171618254501 4.619397662556433 -5 2.7778511650980091 4.1573480615127272 -5 3.5355339059327369 3.5355339059327386 -5 4.1573480615127263 2.7778511650980109 -5 4.6193976625564321 1.9134171618254521 -5 4.9039264020161513 0.97545161008064363 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 640 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 672</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 672</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyDisk.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 -0 -0 0 -0 -0 0 -0 -0 0 -0 -0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 2.5 -0 0 2.309698831278217 -0.95670858091272448 0 1.7677669529663689 -1.7677669529663687 0 0.95670858091272459 -2.309698831278217 0 1.5308084989341916e-16 -2.5 0 -0.95670858091272426 -2.309698831278217 0 -1.7677669529663687 -1.7677669529663689 0 -2.309698831278217 -0.95670858091272459 0 -2.5 -3.0616169978683831e-16 0 -2.309698831278217 0.95670858091272415 0 -1.7677669529663693 1.7677669529663687 0 -0.95670858091272581 2.3096988312782161 0 -4.592425496802574e-16 2.5 0 0.95670858091272504 2.3096988312782165 0 1.7677669529663687 1.7677669529663693 0 2.3096988312782161 0.95670858091272604 0 5 -0 0 4.6193976625564339 -1.913417161825449 0 3.5355339059327378 -3.5355339059327373 0 1.9134171618254492 -4.6193976625564339 0 3.0616169978683831e-16 -5 0 -1.9134171618254485 -4.6193976625564339 0 -3.5355339059327373 -3.5355339059327378 0 -4.6193976625564339 -1.9134171618254492 0 -5 -6.1232339957367663e-16 0 -4.6193976625564339 1.9134171618254483 0 -3.5355339059327386 3.5355339059327373 0 -1.9134171618254516 4.6193976625564321 0 -9.1848509936051479e-16 5 0 1.9134171618254501 4.619397662556433 0 3.5355339059327373 3.5355339059327386 0 4.6193976625564321 1.9134171618254521 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 17 16 1 2 18 17 2 3 19 18 3 4 20 19 4 5 21 20 5 6 22 21 6 7 23 22 7 8 24 23 8 9 25 24 9 10 26 25 10 11 27 26 11 12 28 27 12 13 29 28 13 14 30 29 14 15 31 30 15 0 16 31 16 17 33 32 17 18 34 33 18 19 35 34 19 20 36 35 20 21 37 36 21 22 38 37 22 23 39 38 23 24 40 39 24 25 41 40 25 26 42 41 26 27 43 42 27 28 44 43 28 29 45 44 29 30 46 45 30 31 47 46 31 16 32 47\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyDisk.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 -0 -0 0 -0 -0 0 -0 -0 0 -0 -0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 2.5 -0 0 2.309698831278217 -0.95670858091272448 0 1.7677669529663689 -1.7677669529663687 0 0.95670858091272459 -2.309698831278217 0 1.5307579422779716e-16 -2.5 0 -0.95670858091272426 -2.309698831278217 0 -1.7677669529663687 -1.7677669529663689 0 -2.309698831278217 -0.9567085809127247 0 -2.5 -3.0615158845559431e-16 0 -2.309698831278217 0.95670858091272415 0 -1.7677669529663693 1.7677669529663687 0 -0.95670858091272581 2.3096988312782161 0 -4.5922738268339147e-16 2.5 0 0.95670858091272504 2.3096988312782165 0 1.7677669529663684 1.7677669529663693 0 2.3096988312782161 0.95670858091272604 0 5 -0 0 4.6193976625564339 -1.913417161825449 0 3.5355339059327378 -3.5355339059327373 0 1.9134171618254492 -4.6193976625564339 0 3.0615158845559431e-16 -5 0 -1.9134171618254485 -4.6193976625564339 0 -3.5355339059327373 -3.5355339059327378 0 -4.6193976625564339 -1.9134171618254494 0 -5 -6.1230317691118863e-16 0 -4.6193976625564339 1.9134171618254483 0 -3.5355339059327386 3.5355339059327373 0 -1.9134171618254516 4.6193976625564321 0 -9.1845476536678294e-16 5 0 1.9134171618254501 4.619397662556433 0 3.5355339059327369 3.5355339059327386 0 4.6193976625564321 1.9134171618254521 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 17 16 1 2 18 17 2 3 19 18 3 4 20 19 4 5 21 20 5 6 22 21 6 7 23 22 7 8 24 23 8 9 25 24 9 10 26 25 10 11 27 26 11 12 28 27 12 13 29 28 13 14 30 29 14 15 31 30 15 0 16 31 16 17 33 32 17 18 34 33 18 19 35 34 19 20 36 35 20 21 37 36 21 22 38 37 22 23 39 38 23 24 40 39 24 25 41 40 25 26 42 41 26 27 43 42 27 28 44 43 28 29 45 44 29 30 46 45 30 31 47 46 31 16 32 47\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyGrid.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 3 5 0 1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 1 1 0 -1 1 0 -3 1 0 -5 1 0 5 -1 -0 3 -1 -0 1 -1 -0 -1 -1 0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 1 -3 -0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 7 6 1 2 8 7 2 3 9 8 3 4 10 9 4 5 11 10 6 7 13 12 7 8 14 13 8 9 15 14 9 10 16 15 10 11 17 16 12 13 19 18 13 14 20 19 14 15 21 20 15 16 22 21 16 17 23 22 18 19 25 24 19 20 26 25 20 21 27 26 21 22 28 27 22 23 29 28 24 25 31 30 25 26 32 31 26 27 33 32 27 28 34 33 28 29 35 34\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyGridAndTransformPoints.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 1 3 5 1 0.99999994039535522 5 1 -1.0000002384185791 5 1 -3 5 1 -5 5 1 5 3 1 3 3 1 0.99999994039535522 3 1 -1.0000002384185791 3 1 -3 3 1 -5 3 1 5 0.99999994039535522 1 3 0.99999994039535522 1 0.99999994039535522 0.99999994039535522 1 -1.0000002384185791 0.99999994039535522 1 -3 0.99999994039535522 1 -5 0.99999994039535522 1 5 -1.0000002384185791 1 3 -1.0000002384185791 1 0.99999994039535522 -1.0000002384185791 1 -1.0000002384185791 -1.0000002384185791 1 -3 -1.0000002384185791 1 -5 -1.0000002384185791 1 5 -3 1 3 -3 1 0.99999994039535522 -3 1 -1.0000002384185791 -3 1 -3 -3 1 -5 -3 1 5 -5 1 3 -5 1 0.99999994039535522 -5 1 -1.0000002384185791 -5 1 -3 -5 1 -5 -5 1</points>\n\t\t<point_selection>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</point_selection>\n\t\t<polyhedra>\n\t\t\t<first_faces>0</first_faces>\n\t\t\t<face_counts>25</face_counts>\n\t\t\t<types>polygons</types>\n\t\t\t<face_first_loops>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</face_first_loops>\n\t\t\t<face_loop_counts>1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</face_loop_counts>\n\t\t\t<face_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_selection>\n\t\t\t<face_materials>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</face_materials>\n\t\t\t<loop_first_edges>0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96</loop_first_edges>\n\t\t\t<edge_points>0 1 7 6 1 2 8 7 2 3 9 8 3 4 10 9 4 5 11 10 6 7 13 12 7 8 14 13 8 9 15 14 9 10 16 15 10 11 17 16 12 13 19 18 13 14 20 19 14 15 21 20 15 16 22 21 16 17 23 22 18 19 25 24 19 20 26 25 20 21 27 26 21 22 28 27 22 23 29 28 24 25 31 30 25 26 32 31 26 27 33 32 27 28 34 33 28 29 35 34</edge_points>\n\t\t\t<clockwise_edges>1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96</clockwise_edges>\n\t\t\t<edge_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</edge_selection>\n\t\t</polyhedra>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyIcosahedron.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.6286555605956679 0 4.2532540417601989 2.6286555605956679 0 4.2532540417601989 -2.6286555605956679 0 -4.2532540417601989 2.6286555605956679 0 -4.2532540417601989 0 4.2532540417601989 2.6286555605956679 0 4.2532540417601989 -2.6286555605956679 0 -4.2532540417601989 2.6286555605956679 0 -4.2532540417601989 -2.6286555605956679 4.2532540417601989 2.6286555605956679 0 -4.2532540417601989 2.6286555605956679 0 4.2532540417601989 -2.6286555605956679 0 -4.2532540417601989 -2.6286555605956679 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 39 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">1 4 0 4 9 0 4 5 9 8 5 4 1 8 4 1 10 8 10 3 8 8 3 5 3 2 5 3 7 2 3 10 7 10 6 7 6 11 7 6 0 11 6 1 0 10 1 6 11 0 9 2 11 9 5 2 9 11 2 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolySphere.1.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 5 0.97947615847056058 0 4.9039264020161522 0.96065579873382767 -0.19108631916314192 4.9039264020161522 0.90491797539373253 -0.3748292982432867 4.9039264020161522 0.81440466174310333 -0.5441677975986341 4.9039264020161522 0.69259423366508288 -0.69259423366508277 4.9039264020161522 0.54416779759863421 -0.81440466174310322 4.9039264020161522 0.37482929824328676 -0.90491797539373253 4.9039264020161522 0.19108631916314198 -0.96065579873382767 4.9039264020161522 5.9975617115605883e-17 -0.97947615847056058 4.9039264020161522 -0.19108631916314187 -0.96065579873382767 4.9039264020161522 -0.3748292982432867 -0.90491797539373253 4.9039264020161522 -0.54416779759863387 -0.81440466174310355 4.9039264020161522 -0.69259423366508277 -0.69259423366508288 4.9039264020161522 -0.81440466174310344 -0.5441677975986341 4.9039264020161522 -0.90491797539373253 -0.37482929824328676 4.9039264020161522 -0.96065579873382767 -0.19108631916314225 4.9039264020161522 -0.97947615847056058 -1.1995123423121177e-16 4.9039264020161522 -0.96065579873382767 0.19108631916314203 4.9039264020161522 -0.90491797539373253 0.37482929824328665 4.9039264020161522 -0.81440466174310355 0.54416779759863387 4.9039264020161522 -0.69259423366508299 0.69259423366508277 4.9039264020161522 -0.5441677975986341 0.81440466174310333 4.9039264020161522 -0.37482929824328726 0.90491797539373231 4.9039264020161522 -0.19108631916314234 0.96065579873382756 4.9039264020161522 -1.7992685134681764e-16 0.97947615847056058 4.9039264020161522 0.19108631916314195 0.96065579873382767 4.9039264020161522 0.37482929824328692 0.90491797539373242 4.9039264020161522 0.54416779759863376 0.81440466174310366 4.9039264020161522 0.69259423366508277 0.69259423366508299 4.9039264020161522 0.81440466174310333 0.5441677975986341 4.9039264020161522 0.90491797539373231 0.37482929824328731 4.9039264020161522 0.96065579873382756 0.19108631916314239 4.9039264020161522 1.9165037446636235 0 4.6193976625564339 1.8796786626037532 -0.37389133269154196 4.6193976625564339 1.7706185836759589 -0.73341423114842308 4.6193976625564339 1.5935146255518391 -1.0647524320057096 4.6193976625564339 1.3551727940210598 -1.3551727940210596 4.6193976625564339 1.0647524320057096 -1.5935146255518389 4.6193976625564339 0.73341423114842319 -1.7706185836759589 4.6193976625564339 0.37389133269154207 -1.8796786626037532 4.6193976625564339 1.1735200882281113e-16 -1.9165037446636235 4.6193976625564339 -0.37389133269154184 -1.8796786626037532 4.6193976625564339 -0.73341423114842297 -1.7706185836759589 4.6193976625564339 -1.0647524320057091 -1.5935146255518395 4.6193976625564339 -1.3551727940210596 -1.3551727940210598 4.6193976625564339 -1.5935146255518393 -1.0647524320057096 4.6193976625564339 -1.7706185836759589 -0.73341423114842319 4.6193976625564339 -1.8796786626037532 -0.37389133269154257 4.6193976625564339 -1.9165037446636235 -2.3470401764562226e-16 4.6193976625564339 -1.8796786626037532 0.37389133269154218 4.6193976625564339 -1.7706185836759589 0.73341423114842286 4.6193976625564339 -1.5935146255518395 1.0647524320057091 4.6193976625564339 -1.3551727940210601 1.3551727940210596 4.6193976625564339 -1.0647524320057096 1.5935146255518391 4.6193976625564339 -0.73341423114842408 1.7706185836759585 4.6193976625564339 -0.37389133269154273 1.8796786626037529 4.6193976625564339 -3.5205602646843339e-16 1.9165037446636235 4.6193976625564339 0.37389133269154201 1.8796786626037532 4.6193976625564339 0.73341423114842352 1.7706185836759587 4.6193976625564339 1.0647524320057089 1.5935146255518398 4.6193976625564339 1.3551727940210596 1.3551727940210601 4.6193976625564339 1.5935146255518391 1.0647524320057096 4.6193976625564339 1.7706185836759585 0.73341423114842419 4.6193976625564339 1.8796786626037529 0.37389133269154284 4.6193976625564339 2.7800733139329128 0 4.1573480615127263 2.7266549847472299 -0.54236539804361672 4.1573480615127263 2.5684528336234433 -1.0638879980024369 4.1573480615127263 2.3115464805084511 -1.5445259788332859 4.1573480615127263 1.9658086924777203 -1.9658086924777201 4.1573480615127263 1.5445259788332864 -2.3115464805084507 4.1573480615127263 1.0638879980024369 -2.5684528336234433 4.1573480615127263 0.54236539804361694 -2.7266549847472299 4.1573480615127263 1.7023039426514583e-16 -2.7800733139329128 4.1573480615127263 -0.54236539804361661 -2.7266549847472299 4.1573480615127263 -1.0638879980024367 -2.5684528336234433 4.1573480615127263 -1.5445259788332855 -2.3115464805084516 4.1573480615127263 -1.9658086924777201 -1.9658086924777203 4.1573480615127263 -2.3115464805084516 -1.5445259788332859 4.1573480615127263 -2.5684528336234433 -1.0638879980024369 4.1573480615127263 -2.7266549847472299 -0.54236539804361772 4.1573480615127263 -2.7800733139329128 -3.4046078853029166e-16 4.1573480615127263 -2.7266549847472299 0.54236539804361705 4.1573480615127263 -2.5684528336234433 1.0638879980024365 4.1573480615127263 -2.3115464805084516 1.5445259788332855 4.1573480615127263 -1.9658086924777207 1.9658086924777201 4.1573480615127263 -1.5445259788332859 2.3115464805084511 4.1573480615127263 -1.0638879980024385 2.5684528336234425 4.1573480615127263 -0.54236539804361794 2.7266549847472294 4.1573480615127263 -5.1069118279543739e-16 2.7800733139329128 4.1573480615127263 0.54236539804361683 2.7266549847472299 4.1573480615127263 1.0638879980024374 2.5684528336234429 4.1573480615127263 1.544525978833285 2.311546480508452 4.1573480615127263 1.9658086924777201 1.9658086924777207 4.1573480615127263 2.3115464805084511 1.5445259788332859 4.1573480615127263 2.5684528336234425 1.0638879980024385 4.1573480615127263 2.7266549847472294 0.54236539804361805 4.1573480615127263 3.5369983720268046 0 3.5355339059327378 3.4690359400940789 -0.69003415136923063 3.5355339059327378 3.2677604024413065 -1.3535506772769523 3.5355339059327378 2.9409066651038609 -1.9650510097368854 3.5355339059327378 2.5010355339059327 -2.5010355339059323 3.5355339059327378 1.9650510097368858 -2.9409066651038605 3.5355339059327378 1.3535506772769526 -3.2677604024413065 3.5355339059327378 0.69003415136923085 -3.4690359400940789 3.5355339059327378 2.1657868674460127e-16 -3.5369983720268046 3.5355339059327378 -0.69003415136923052 -3.4690359400940789 3.5355339059327378 -1.3535506772769521 -3.2677604024413065 3.5355339059327378 -1.9650510097368845 -2.9409066651038618 3.5355339059327378 -2.5010355339059323 -2.5010355339059327 3.5355339059327378 -2.9409066651038613 -1.9650510097368854 3.5355339059327378 -3.2677604024413065 -1.3535506772769526 3.5355339059327378 -3.4690359400940789 -0.69003415136923185 3.5355339059327378 -3.5369983720268046 -4.3315737348920254e-16 3.5355339059327378 -3.4690359400940789 0.69003415136923107 3.5355339059327378 -3.2677604024413065 1.3535506772769519 3.5355339059327378 -2.9409066651038618 1.9650510097368845 3.5355339059327378 -2.5010355339059331 2.5010355339059323 3.5355339059327378 -1.9650510097368854 2.9409066651038609 3.5355339059327378 -1.3535506772769543 3.2677604024413056 3.5355339059327378 -0.69003415136923218 3.4690359400940785 3.5355339059327378 -6.4973606023380378e-16 3.5369983720268046 3.5355339059327378 0.69003415136923074 3.4690359400940789 3.5355339059327378 1.3535506772769532 3.2677604024413061 3.5355339059327378 1.9650510097368843 2.9409066651038622 3.5355339059327378 2.5010355339059323 2.5010355339059331 3.5355339059327378 2.9409066651038609 1.9650510097368854 3.5355339059327378 3.2677604024413056 1.3535506772769546 3.5355339059327378 3.4690359400940785 0.6900341513692323 3.5355339059327378 4.158190713451213 0 2.7778511650980113 4.0782922448623564 -0.81122276529167126 2.7778511650980113 3.8416672924360804 -1.5912706946521518 2.7778511650980113 3.4574092203933242 -2.3101669836120364 2.7778511650980113 2.9402848509482808 -2.9402848509482804 2.7778511650980113 2.3101669836120369 -3.4574092203933238 2.7778511650980113 1.591270694652152 -3.8416672924360804 2.7778511650980113 0.81122276529167148 -4.0782922448623564 2.7778511650980113 2.5461574737361384e-16 -4.158190713451213 2.7778511650980113 -0.81122276529167103 -4.0782922448623564 2.7778511650980113 -1.5912706946521515 -3.8416672924360804 2.7778511650980113 -2.3101669836120355 -3.4574092203933251 2.7778511650980113 -2.9402848509482804 -2.9402848509482808 2.7778511650980113 -3.4574092203933247 -2.3101669836120364 2.7778511650980113 -3.8416672924360804 -1.591270694652152 2.7778511650980113 -4.0782922448623564 -0.81122276529167259 2.7778511650980113 -4.158190713451213 -5.0923149474722769e-16 2.7778511650980113 -4.0782922448623564 0.8112227652916717 2.7778511650980113 -3.8416672924360804 1.5912706946521513 2.7778511650980113 -3.4574092203933251 2.3101669836120355 2.7778511650980113 -2.9402848509482813 2.9402848509482804 2.7778511650980113 -2.3101669836120364 3.4574092203933242 2.7778511650980113 -1.591270694652154 3.8416672924360795 2.7778511650980113 -0.81122276529167292 4.0782922448623564 2.7778511650980113 -7.6384724212084148e-16 4.158190713451213 2.7778511650980113 0.81122276529167137 4.0782922448623564 2.7778511650980113 1.5912706946521527 3.84166729243608 2.7778511650980113 2.3101669836120351 3.4574092203933255 2.7778511650980113 2.9402848509482804 2.9402848509482813 2.7778511650980113 3.4574092203933242 2.3101669836120364 2.7778511650980113 3.8416672924360795 1.5912706946521542 2.7778511650980113 4.0782922448623564 0.81122276529167314 2.7778511650980113 4.6197782648938777 0 1.9134171618254492 4.5310105209346911 -0.90127402934125678 1.9134171618254492 4.2681185836759594 -1.7679126031752281 1.9134171618254492 3.8412052428350374 -2.5666112871259852 1.9134171618254492 3.2666765386846834 -3.266676538684683 1.9134171618254492 2.5666112871259856 -3.8412052428350369 1.9134171618254492 1.7679126031752284 -4.2681185836759594 1.9134171618254492 0.90127402934125711 -4.5310105209346911 1.9134171618254492 2.8287983324364e-16 -4.6197782648938777 1.9134171618254492 -0.90127402934125656 -4.5310105209346911 1.9134171618254492 -1.7679126031752277 -4.2681185836759594 1.9134171618254492 -2.5666112871259839 -3.8412052428350387 1.9134171618254492 -3.266676538684683 -3.2666765386846834 1.9134171618254492 -3.8412052428350383 -2.5666112871259852 1.9134171618254492 -4.2681185836759594 -1.7679126031752284 1.9134171618254492 -4.5310105209346911 -0.90127402934125833 1.9134171618254492 -4.6197782648938777 -5.6575966648728e-16 1.9134171618254492 -4.5310105209346911 0.90127402934125733 1.9134171618254492 -4.2681185836759594 1.7679126031752275 1.9134171618254492 -3.8412052428350387 2.5666112871259839 1.9134171618254492 -3.2666765386846839 3.266676538684683 1.9134171618254492 -2.5666112871259852 3.8412052428350374 1.9134171618254492 -1.7679126031752306 4.2681185836759576 1.9134171618254492 -0.90127402934125878 4.5310105209346903 1.9134171618254492 -8.4863949973092005e-16 4.6197782648938777 1.9134171618254492 0.901274029341257 4.5310105209346911 1.9134171618254492 1.767912603175229 4.2681185836759585 1.9134171618254492 2.5666112871259834 3.8412052428350392 1.9134171618254492 3.266676538684683 3.2666765386846839 1.9134171618254492 3.8412052428350374 2.5666112871259852 1.9134171618254492 4.2681185836759576 1.7679126031752308 1.9134171618254492 4.5310105209346903 0.901274029341259 1.9134171618254492 4.904022475614136 0 0.97545161008064152 4.809793058848955 -0.95672732394189219 0.97545161008064152 4.5307259921952312 -1.8766881533635624 0.97545161008064152 4.0775456665218535 -2.7245289095103118 0.97545161008064152 3.4676675475979963 -3.4676675475979954 0.97545161008064152 2.7245289095103122 -4.0775456665218535 0.97545161008064152 1.8766881533635627 -4.5307259921952312 0.97545161008064152 0.95672732394189253 -4.809793058848955 0.97545161008064152 3.0028477138537652e-16 -4.904022475614136 0.97545161008064152 -0.95672732394189197 -4.809793058848955 0.97545161008064152 -1.876688153363562 -4.5307259921952312 0.97545161008064152 -2.7245289095103109 -4.0775456665218552 0.97545161008064152 -3.4676675475979954 -3.4676675475979963 0.97545161008064152 -4.0775456665218544 -2.7245289095103118 0.97545161008064152 -4.5307259921952312 -1.8766881533635627 0.97545161008064152 -4.809793058848955 -0.95672732394189386 0.97545161008064152 -4.904022475614136 -6.0056954277075304e-16 0.97545161008064152 -4.809793058848955 0.95672732394189275 0.97545161008064152 -4.5307259921952312 1.8766881533635618 0.97545161008064152 -4.0775456665218552 2.7245289095103109 0.97545161008064152 -3.4676675475979968 3.4676675475979954 0.97545161008064152 -2.7245289095103118 4.0775456665218535 0.97545161008064152 -1.8766881533635651 4.5307259921952303 0.97545161008064152 -0.9567273239418943 4.8097930588489541 0.97545161008064152 -9.008543141561295e-16 4.904022475614136 0.97545161008064152 0.9567273239418923 4.809793058848955 0.97545161008064152 1.8766881533635635 4.5307259921952303 0.97545161008064152 2.72452890951031 4.0775456665218552 0.97545161008064152 3.4676675475979954 3.4676675475979968 0.97545161008064152 4.0775456665218535 2.7245289095103118 0.97545161008064152 4.5307259921952303 1.8766881533635653 0.97545161008064152 4.8097930588489541 0.95672732394189453 0.97545161008064152 5 0 3.0616169978683831e-16 4.9039264020161522 -0.97545161008064118 3.0616169978683831e-16 4.6193976625564339 -1.913417161825449 3.0616169978683831e-16 4.1573480615127263 -2.7778511650980109 3.0616169978683831e-16 3.5355339059327378 -3.5355339059327373 3.0616169978683831e-16 2.7778511650980113 -4.1573480615127254 3.0616169978683831e-16 1.9134171618254492 -4.6193976625564339 3.0616169978683831e-16 0.97545161008064152 -4.9039264020161522 3.0616169978683831e-16 3.0616169978683831e-16 -5 3.0616169978683831e-16 -0.97545161008064096 -4.9039264020161522 3.0616169978683831e-16 -1.9134171618254485 -4.6193976625564339 3.0616169978683831e-16 -2.77785116509801 -4.1573480615127272 3.0616169978683831e-16 -3.5355339059327373 -3.5355339059327378 3.0616169978683831e-16 -4.1573480615127263 -2.7778511650980109 3.0616169978683831e-16 -4.6193976625564339 -1.9134171618254492 3.0616169978683831e-16 -4.9039264020161522 -0.97545161008064296 3.0616169978683831e-16 -5 -6.1232339957367663e-16 3.0616169978683831e-16 -4.9039264020161522 0.97545161008064185 3.0616169978683831e-16 -4.6193976625564339 1.9134171618254483 3.0616169978683831e-16 -4.1573480615127272 2.77785116509801 3.0616169978683831e-16 -3.5355339059327386 3.5355339059327373 3.0616169978683831e-16 -2.7778511650980109 4.1573480615127263 3.0616169978683831e-16 -1.9134171618254516 4.6193976625564321 3.0616169978683831e-16 -0.97545161008064329 4.9039264020161513 3.0616169978683831e-16 -9.1848509936051479e-16 5 3.0616169978683831e-16 0.97545161008064141 4.9039264020161522 3.0616169978683831e-16 1.9134171618254501 4.619397662556433 3.0616169978683831e-16 2.7778511650980091 4.1573480615127281 3.0616169978683831e-16 3.5355339059327373 3.5355339059327386 3.0616169978683831e-16 4.1573480615127263 2.7778511650980109 3.0616169978683831e-16 4.6193976625564321 1.9134171618254521 3.0616169978683831e-16 4.9039264020161513 0.97545161008064363 3.0616169978683831e-16 4.904022475614136 0 -0.97545161008064096 4.809793058848955 -0.95672732394189219 -0.97545161008064096 4.5307259921952312 -1.8766881533635624 -0.97545161008064096 4.0775456665218535 -2.7245289095103118 -0.97545161008064096 3.4676675475979963 -3.4676675475979954 -0.97545161008064096 2.7245289095103122 -4.0775456665218535 -0.97545161008064096 1.8766881533635627 -4.5307259921952312 -0.97545161008064096 0.95672732394189253 -4.809793058848955 -0.97545161008064096 3.0028477138537652e-16 -4.904022475614136 -0.97545161008064096 -0.95672732394189197 -4.809793058848955 -0.97545161008064096 -1.876688153363562 -4.5307259921952312 -0.97545161008064096 -2.7245289095103109 -4.0775456665218552 -0.97545161008064096 -3.4676675475979954 -3.4676675475979963 -0.97545161008064096 -4.0775456665218544 -2.7245289095103118 -0.97545161008064096 -4.5307259921952312 -1.8766881533635627 -0.97545161008064096 -4.809793058848955 -0.95672732394189386 -0.97545161008064096 -4.904022475614136 -6.0056954277075304e-16 -0.97545161008064096 -4.809793058848955 0.95672732394189275 -0.97545161008064096 -4.5307259921952312 1.8766881533635618 -0.97545161008064096 -4.0775456665218552 2.7245289095103109 -0.97545161008064096 -3.4676675475979968 3.4676675475979954 -0.97545161008064096 -2.7245289095103118 4.0775456665218535 -0.97545161008064096 -1.8766881533635651 4.5307259921952303 -0.97545161008064096 -0.9567273239418943 4.8097930588489541 -0.97545161008064096 -9.008543141561295e-16 4.904022475614136 -0.97545161008064096 0.9567273239418923 4.809793058848955 -0.97545161008064096 1.8766881533635635 4.5307259921952303 -0.97545161008064096 2.72452890951031 4.0775456665218552 -0.97545161008064096 3.4676675475979954 3.4676675475979968 -0.97545161008064096 4.0775456665218535 2.7245289095103118 -0.97545161008064096 4.5307259921952303 1.8766881533635653 -0.97545161008064096 4.8097930588489541 0.95672732394189453 -0.97545161008064096 4.6197782648938777 0 -1.9134171618254485 4.5310105209346911 -0.90127402934125678 -1.9134171618254485 4.2681185836759594 -1.7679126031752281 -1.9134171618254485 3.8412052428350374 -2.5666112871259852 -1.9134171618254485 3.2666765386846834 -3.266676538684683 -1.9134171618254485 2.5666112871259856 -3.8412052428350369 -1.9134171618254485 1.7679126031752284 -4.2681185836759594 -1.9134171618254485 0.90127402934125711 -4.5310105209346911 -1.9134171618254485 2.8287983324364e-16 -4.6197782648938777 -1.9134171618254485 -0.90127402934125656 -4.5310105209346911 -1.9134171618254485 -1.7679126031752277 -4.2681185836759594 -1.9134171618254485 -2.5666112871259839 -3.8412052428350387 -1.9134171618254485 -3.266676538684683 -3.2666765386846834 -1.9134171618254485 -3.8412052428350383 -2.5666112871259852 -1.9134171618254485 -4.2681185836759594 -1.7679126031752284 -1.9134171618254485 -4.5310105209346911 -0.90127402934125833 -1.9134171618254485 -4.6197782648938777 -5.6575966648728e-16 -1.9134171618254485 -4.5310105209346911 0.90127402934125733 -1.9134171618254485 -4.2681185836759594 1.7679126031752275 -1.9134171618254485 -3.8412052428350387 2.5666112871259839 -1.9134171618254485 -3.2666765386846839 3.266676538684683 -1.9134171618254485 -2.5666112871259852 3.8412052428350374 -1.9134171618254485 -1.7679126031752306 4.2681185836759576 -1.9134171618254485 -0.90127402934125878 4.5310105209346903 -1.9134171618254485 -8.4863949973092005e-16 4.6197782648938777 -1.9134171618254485 0.901274029341257 4.5310105209346911 -1.9134171618254485 1.767912603175229 4.2681185836759585 -1.9134171618254485 2.5666112871259834 3.8412052428350392 -1.9134171618254485 3.266676538684683 3.2666765386846839 -1.9134171618254485 3.8412052428350374 2.5666112871259852 -1.9134171618254485 4.2681185836759576 1.7679126031752308 -1.9134171618254485 4.5310105209346903 0.901274029341259 -1.9134171618254485 4.1581907134512148 0 -2.77785116509801 4.0782922448623582 -0.81122276529167159 -2.77785116509801 3.8416672924360822 -1.5912706946521524 -2.77785116509801 3.4574092203933255 -2.3101669836120373 -2.77785116509801 2.9402848509482822 -2.9402848509482817 -2.77785116509801 2.3101669836120378 -3.4574092203933251 -2.77785116509801 1.5912706946521527 -3.8416672924360822 -2.77785116509801 0.81122276529167181 -4.0782922448623582 -2.77785116509801 2.5461574737361394e-16 -4.1581907134512148 -2.77785116509801 -0.81122276529167137 -4.0782922448623582 -2.77785116509801 -1.5912706946521522 -3.8416672924360822 -2.77785116509801 -2.3101669836120364 -3.4574092203933264 -2.77785116509801 -2.9402848509482817 -2.9402848509482822 -2.77785116509801 -3.457409220393326 -2.3101669836120373 -2.77785116509801 -3.8416672924360822 -1.5912706946521527 -2.77785116509801 -4.0782922448623582 -0.81122276529167292 -2.77785116509801 -4.1581907134512148 -5.0923149474722788e-16 -2.77785116509801 -4.0782922448623582 0.81122276529167203 -2.77785116509801 -3.8416672924360822 1.591270694652152 -2.77785116509801 -3.4574092203933264 2.3101669836120364 -2.77785116509801 -2.9402848509482826 2.9402848509482817 -2.77785116509801 -2.3101669836120373 3.4574092203933255 -2.77785116509801 -1.5912706946521546 3.8416672924360813 -2.77785116509801 -0.81122276529167325 4.0782922448623582 -2.77785116509801 -7.6384724212084188e-16 4.1581907134512148 -2.77785116509801 0.8112227652916717 4.0782922448623582 -2.77785116509801 1.5912706946521533 3.8416672924360817 -2.77785116509801 2.310166983612036 3.4574092203933269 -2.77785116509801 2.9402848509482817 2.9402848509482826 -2.77785116509801 3.4574092203933255 2.3101669836120373 -2.77785116509801 3.8416672924360813 1.5912706946521549 -2.77785116509801 4.0782922448623582 0.81122276529167348 -2.77785116509801 3.536998372026805 0 -3.5355339059327373 3.4690359400940793 -0.69003415136923074 -3.5355339059327373 3.2677604024413069 -1.3535506772769526 -3.5355339059327373 2.9409066651038613 -1.9650510097368856 -3.5355339059327373 2.5010355339059331 -2.5010355339059327 -3.5355339059327373 1.9650510097368861 -2.9409066651038609 -3.5355339059327373 1.3535506772769528 -3.2677604024413069 -3.5355339059327373 0.69003415136923096 -3.4690359400940793 -3.5355339059327373 2.1657868674460129e-16 -3.536998372026805 -3.5355339059327373 -0.69003415136923052 -3.4690359400940793 -3.5355339059327373 -1.3535506772769523 -3.2677604024413069 -3.5355339059327373 -1.9650510097368847 -2.9409066651038618 -3.5355339059327373 -2.5010355339059327 -2.5010355339059331 -3.5355339059327373 -2.9409066651038618 -1.9650510097368856 -3.5355339059327373 -3.2677604024413069 -1.3535506772769528 -3.5355339059327373 -3.4690359400940793 -0.69003415136923196 -3.5355339059327373 -3.536998372026805 -4.3315737348920259e-16 -3.5355339059327373 -3.4690359400940793 0.69003415136923119 -3.5355339059327373 -3.2677604024413069 1.3535506772769521 -3.5355339059327373 -2.9409066651038618 1.9650510097368847 -3.5355339059327373 -2.5010355339059336 2.5010355339059327 -3.5355339059327373 -1.9650510097368856 2.9409066651038613 -3.5355339059327373 -1.3535506772769546 3.2677604024413061 -3.5355339059327373 -0.6900341513692323 3.4690359400940789 -3.5355339059327373 -6.4973606023380388e-16 3.536998372026805 -3.5355339059327373 0.69003415136923085 3.4690359400940793 -3.5355339059327373 1.3535506772769532 3.2677604024413065 -3.5355339059327373 1.9650510097368845 2.9409066651038622 -3.5355339059327373 2.5010355339059327 2.5010355339059336 -3.5355339059327373 2.9409066651038613 1.9650510097368856 -3.5355339059327373 3.2677604024413061 1.3535506772769546 -3.5355339059327373 3.4690359400940789 0.69003415136923241 -3.5355339059327373 2.7800733139329128 0 -4.1573480615127263 2.7266549847472299 -0.54236539804361672 -4.1573480615127263 2.5684528336234433 -1.0638879980024369 -4.1573480615127263 2.3115464805084511 -1.5445259788332859 -4.1573480615127263 1.9658086924777203 -1.9658086924777201 -4.1573480615127263 1.5445259788332864 -2.3115464805084507 -4.1573480615127263 1.0638879980024369 -2.5684528336234433 -4.1573480615127263 0.54236539804361694 -2.7266549847472299 -4.1573480615127263 1.7023039426514583e-16 -2.7800733139329128 -4.1573480615127263 -0.54236539804361661 -2.7266549847472299 -4.1573480615127263 -1.0638879980024367 -2.5684528336234433 -4.1573480615127263 -1.5445259788332855 -2.3115464805084516 -4.1573480615127263 -1.9658086924777201 -1.9658086924777203 -4.1573480615127263 -2.3115464805084516 -1.5445259788332859 -4.1573480615127263 -2.5684528336234433 -1.0638879980024369 -4.1573480615127263 -2.7266549847472299 -0.54236539804361772 -4.1573480615127263 -2.7800733139329128 -3.4046078853029166e-16 -4.1573480615127263 -2.7266549847472299 0.54236539804361705 -4.1573480615127263 -2.5684528336234433 1.0638879980024365 -4.1573480615127263 -2.3115464805084516 1.5445259788332855 -4.1573480615127263 -1.9658086924777207 1.9658086924777201 -4.1573480615127263 -1.5445259788332859 2.3115464805084511 -4.1573480615127263 -1.0638879980024385 2.5684528336234425 -4.1573480615127263 -0.54236539804361794 2.7266549847472294 -4.1573480615127263 -5.1069118279543739e-16 2.7800733139329128 -4.1573480615127263 0.54236539804361683 2.7266549847472299 -4.1573480615127263 1.0638879980024374 2.5684528336234429 -4.1573480615127263 1.544525978833285 2.311546480508452 -4.1573480615127263 1.9658086924777201 1.9658086924777207 -4.1573480615127263 2.3115464805084511 1.5445259788332859 -4.1573480615127263 2.5684528336234425 1.0638879980024385 -4.1573480615127263 2.7266549847472294 0.54236539804361805 -4.1573480615127263 1.9165037446636237 0 -4.6193976625564339 1.8796786626037534 -0.37389133269154196 -4.6193976625564339 1.7706185836759591 -0.73341423114842319 -4.6193976625564339 1.5935146255518393 -1.0647524320057096 -4.6193976625564339 1.3551727940210601 -1.3551727940210598 -4.6193976625564339 1.0647524320057098 -1.5935146255518391 -4.6193976625564339 0.7334142311484233 -1.7706185836759591 -4.6193976625564339 0.37389133269154207 -1.8796786626037534 -4.6193976625564339 1.1735200882281115e-16 -1.9165037446636237 -4.6193976625564339 -0.3738913326915419 -1.8796786626037534 -4.6193976625564339 -0.73341423114842308 -1.7706185836759591 -4.6193976625564339 -1.0647524320057091 -1.5935146255518398 -4.6193976625564339 -1.3551727940210598 -1.3551727940210601 -4.6193976625564339 -1.5935146255518395 -1.0647524320057096 -4.6193976625564339 -1.7706185836759591 -0.7334142311484233 -4.6193976625564339 -1.8796786626037534 -0.37389133269154262 -4.6193976625564339 -1.9165037446636237 -2.3470401764562231e-16 -4.6193976625564339 -1.8796786626037534 0.37389133269154218 -4.6193976625564339 -1.7706185836759591 0.73341423114842297 -4.6193976625564339 -1.5935146255518398 1.0647524320057091 -4.6193976625564339 -1.3551727940210603 1.3551727940210598 -4.6193976625564339 -1.0647524320057096 1.5935146255518393 -4.6193976625564339 -0.73341423114842419 1.7706185836759587 -4.6193976625564339 -0.37389133269154279 1.8796786626037532 -4.6193976625564339 -3.5205602646843344e-16 1.9165037446636237 -4.6193976625564339 0.37389133269154201 1.8796786626037534 -4.6193976625564339 0.73341423114842352 1.7706185836759589 -4.6193976625564339 1.0647524320057089 1.59351462555184 -4.6193976625564339 1.3551727940210598 1.3551727940210603 -4.6193976625564339 1.5935146255518393 1.0647524320057096 -4.6193976625564339 1.7706185836759587 0.7334142311484243 -4.6193976625564339 1.8796786626037532 0.3738913326915429 -4.6193976625564339 0.97947615847056235 0 -4.9039264020161522 0.96065579873382945 -0.19108631916314228 -4.9039264020161522 0.9049179753937342 -0.37482929824328742 -4.9039264020161522 0.81440466174310489 -0.54416779759863509 -4.9039264020161522 0.6925942336650841 -0.69259423366508399 -4.9039264020161522 0.54416779759863521 -0.81440466174310477 -4.9039264020161522 0.37482929824328748 -0.9049179753937342 -4.9039264020161522 0.19108631916314234 -0.96065579873382945 -4.9039264020161522 5.9975617115605994e-17 -0.97947615847056235 -4.9039264020161522 -0.19108631916314223 -0.96065579873382945 -4.9039264020161522 -0.37482929824328737 -0.9049179753937342 -4.9039264020161522 -0.54416779759863487 -0.81440466174310511 -4.9039264020161522 -0.69259423366508399 -0.6925942336650841 -4.9039264020161522 -0.814404661743105 -0.54416779759863509 -4.9039264020161522 -0.9049179753937342 -0.37482929824328748 -4.9039264020161522 -0.96065579873382945 -0.19108631916314259 -4.9039264020161522 -0.97947615847056235 -1.1995123423121199e-16 -4.9039264020161522 -0.96065579873382945 0.19108631916314239 -4.9039264020161522 -0.9049179753937342 0.37482929824328731 -4.9039264020161522 -0.81440466174310511 0.54416779759863487 -4.9039264020161522 -0.69259423366508421 0.69259423366508399 -4.9039264020161522 -0.54416779759863509 0.81440466174310489 -4.9039264020161522 -0.37482929824328798 0.90491797539373398 -4.9039264020161522 -0.19108631916314267 0.96065579873382934 -4.9039264020161522 -1.7992685134681798e-16 0.97947615847056235 -4.9039264020161522 0.19108631916314231 0.96065579873382945 -4.9039264020161522 0.37482929824328765 0.90491797539373409 -4.9039264020161522 0.54416779759863476 0.81440466174310522 -4.9039264020161522 0.69259423366508399 0.69259423366508421 -4.9039264020161522 0.81440466174310489 0.54416779759863509 -4.9039264020161522 0.90491797539373398 0.37482929824328803 -4.9039264020161522 0.96065579873382934 0.19108631916314273 -4.9039264020161522 0 0 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 39 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63 67 68 66 70 71 69 73 74 72 76 77 75 79 80 78 82 83 81 85 86 84 88 89 87 91 92 90 94 95 93 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1888 1892 1893 1891 1895 1896 1894 1898 1899 1897 1901 1902 1900 1904 1905 1903 1907 1908 1906 1910 1911 1909 1913 1914 1912 1916 1917 1915 1919 1920 1918 1922 1923 1921 1925 1926 1924 1928 1929 1927 1931 1932 1930 1934 1935 1933 1937 1938 1936 1940 1941 1939 1943 1944 1942 1946 1947 1945 1949 1950 1948 1952 1953 1951 1955 1956 1954 1958 1959 1957 1961 1962 1960 1964 1965 1963 1967 1968 1966 1970 1971 1969 1973 1974 1972 1976 1977 1975 1979 1980 1978 1982 1983 1981</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1891 1894 1897 1900 1903 1906 1909 1912 1915 1918 1921 1924 1927 1930 1933 1936 1939 1942 1945 1948 1951 1954 1957 1960 1963 1966 1969 1972 1975 1978 1981</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">2 1 0 3 2 0 4 3 0 5 4 0 6 5 0 7 6 0 8 7 0 9 8 0 10 9 0 11 10 0 12 11 0 13 12 0 14 13 0 15 14 0 16 15 0 17 16 0 18 17 0 19 18 0 20 19 0 21 20 0 22 21 0 23 22 0 24 23 0 25 24 0 26 25 0 27 26 0 28 27 0 29 28 0 30 29 0 31 30 0 32 31 0 1 32 0 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 32 64 63 32 1 33 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 64 96 95 64 33 65 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 96 128 127 96 65 97 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 128 160 159 128 97 129 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 160 192 191 160 129 161 192 161 162 194 193 162 163 195 194 163 164 196 195 164 165 197 196 165 166 198 197 166 167 199 198 167 168 200 199 168 169 201 200 169 170 202 201 170 171 203 202 171 172 204 203 172 173 205 204 173 174 206 205 174 175 207 206 175 176 208 207 176 177 209 208 177 178 210 209 178 179 211 210 179 180 212 211 180 181 213 212 181 182 214 213 182 183 215 214 183 184 216 215 184 185 217 216 185 186 218 217 186 187 219 218 187 188 220 219 188 189 221 220 189 190 222 221 190 191 223 222 191 192 224 223 192 161 193 224 193 194 226 225 194 195 227 226 195 196 228 227 196 197 229 228 197 198 230 229 198 199 231 230 199 200 232 231 200 201 233 232 201 202 234 233 202 203 235 234 203 204 236 235 204 205 237 236 205 206 238 237 206 207 239 238 207 208 240 239 208 209 241 240 209 210 242 241 210 211 243 242 211 212 244 243 212 213 245 244 213 214 246 245 214 215 247 246 215 216 248 247 216 217 249 248 217 218 250 249 218 219 251 250 219 220 252 251 220 221 253 252 221 222 254 253 222 223 255 254 223 224 256 255 224 193 225 256 225 226 258 257 226 227 259 258 227 228 260 259 228 229 261 260 229 230 262 261 230 231 263 262 231 232 264 263 232 233 265 264 233 234 266 265 234 235 267 266 235 236 268 267 236 237 269 268 237 238 270 269 238 239 271 270 239 240 272 271 240 241 273 272 241 242 274 273 242 243 275 274 243 244 276 275 244 245 277 276 245 246 278 277 246 247 279 278 247 248 280 279 248 249 281 280 249 250 282 281 250 251 283 282 251 252 284 283 252 253 285 284 253 254 286 285 254 255 287 286 255 256 288 287 256 225 257 288 257 258 290 289 258 259 291 290 259 260 292 291 260 261 293 292 261 262 294 293 262 263 295 294 263 264 296 295 264 265 297 296 265 266 298 297 266 267 299 298 267 268 300 299 268 269 301 300 269 270 302 301 270 271 303 302 271 272 304 303 272 273 305 304 273 274 306 305 274 275 307 306 275 276 308 307 276 277 309 308 277 278 310 309 278 279 311 310 279 280 312 311 280 281 313 312 281 282 314 313 282 283 315 314 283 284 316 315 284 285 317 316 285 286 318 317 286 287 319 318 287 288 320 319 288 257 289 320 289 290 322 321 290 291 323 322 291 292 324 323 292 293 325 324 293 294 326 325 294 295 327 326 295 296 328 327 296 297 329 328 297 298 330 329 298 299 331 330 299 300 332 331 300 301 333 332 301 302 334 333 302 303 335 334 303 304 336 335 304 305 337 336 305 306 338 337 306 307 339 338 307 308 340 339 308 309 341 340 309 310 342 341 310 311 343 342 311 312 344 343 312 313 345 344 313 314 346 345 314 315 347 346 315 316 348 347 316 317 349 348 317 318 350 349 318 319 351 350 319 320 352 351 320 289 321 352 321 322 354 353 322 323 355 354 323 324 356 355 324 325 357 356 325 326 358 357 326 327 359 358 327 328 360 359 328 329 361 360 329 330 362 361 330 331 363 362 331 332 364 363 332 333 365 364 333 334 366 365 334 335 367 366 335 336 368 367 336 337 369 368 337 338 370 369 338 339 371 370 339 340 372 371 340 341 373 372 341 342 374 373 342 343 375 374 343 344 376 375 344 345 377 376 345 346 378 377 346 347 379 378 347 348 380 379 348 349 381 380 349 350 382 381 350 351 383 382 351 352 384 383 352 321 353 384 353 354 386 385 354 355 387 386 355 356 388 387 356 357 389 388 357 358 390 389 358 359 391 390 359 360 392 391 360 361 393 392 361 362 394 393 362 363 395 394 363 364 396 395 364 365 397 396 365 366 398 397 366 367 399 398 367 368 400 399 368 369 401 400 369 370 402 401 370 371 403 402 371 372 404 403 372 373 405 404 373 374 406 405 374 375 407 406 375 376 408 407 376 377 409 408 377 378 410 409 378 379 411 410 379 380 412 411 380 381 413 412 381 382 414 413 382 383 415 414 383 384 416 415 384 353 385 416 385 386 418 417 386 387 419 418 387 388 420 419 388 389 421 420 389 390 422 421 390 391 423 422 391 392 424 423 392 393 425 424 393 394 426 425 394 395 427 426 395 396 428 427 396 397 429 428 397 398 430 429 398 399 431 430 399 400 432 431 400 401 433 432 401 402 434 433 402 403 435 434 403 404 436 435 404 405 437 436 405 406 438 437 406 407 439 438 407 408 440 439 408 409 441 440 409 410 442 441 410 411 443 442 411 412 444 443 412 413 445 444 413 414 446 445 414 415 447 446 415 416 448 447 416 385 417 448 417 418 450 449 418 419 451 450 419 420 452 451 420 421 453 452 421 422 454 453 422 423 455 454 423 424 456 455 424 425 457 456 425 426 458 457 426 427 459 458 427 428 460 459 428 429 461 460 429 430 462 461 430 431 463 462 431 432 464 463 432 433 465 464 433 434 466 465 434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 448 480 479 448 417 449 480 449 450 481 450 451 481 451 452 481 452 453 481 453 454 481 454 455 481 455 456 481 456 457 481 457 458 481 458 459 481 459 460 481 460 461 481 461 462 481 462 463 481 463 464 481 464 465 481 465 466 481 466 467 481 467 468 481 468 469 481 469 470 481 470 471 481 471 472 481 472 473 481 473 474 481 474 475 481 475 476 481 476 477 481 477 478 481 478 479 481 479 480 481 480 449 481\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolySphere.1.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 5 0.97947615847056058 0 4.9039264020161522 0.96065579873382767 -0.19108631916314192 4.9039264020161522 0.90491797539373253 -0.3748292982432867 4.9039264020161522 0.81440466174310333 -0.5441677975986341 4.9039264020161522 0.69259423366508288 -0.69259423366508277 4.9039264020161522 0.54416779759863421 -0.81440466174310333 4.9039264020161522 0.37482929824328676 -0.90491797539373253 4.9039264020161522 0.191086319163142 -0.96065579873382767 4.9039264020161522 5.9973636354029111e-17 -0.97947615847056058 4.9039264020161522 -0.19108631916314187 -0.96065579873382767 4.9039264020161522 -0.3748292982432867 -0.90491797539373253 4.9039264020161522 -0.54416779759863387 -0.81440466174310355 4.9039264020161522 -0.69259423366508277 -0.69259423366508288 4.9039264020161522 -0.81440466174310344 -0.5441677975986341 4.9039264020161522 -0.90491797539373253 -0.37482929824328681 4.9039264020161522 -0.96065579873382767 -0.19108631916314228 4.9039264020161522 -0.97947615847056058 -1.1994727270805822e-16 4.9039264020161522 -0.96065579873382767 0.19108631916314203 4.9039264020161522 -0.90491797539373264 0.37482929824328665 4.9039264020161522 -0.81440466174310355 0.54416779759863387 4.9039264020161522 -0.69259423366508299 0.69259423366508277 4.9039264020161522 -0.5441677975986341 0.81440466174310333 4.9039264020161522 -0.37482929824328726 0.90491797539373231 4.9039264020161522 -0.19108631916314234 0.96065579873382756 4.9039264020161522 -1.7992090906208733e-16 0.97947615847056058 4.9039264020161522 0.19108631916314198 0.96065579873382767 4.9039264020161522 0.37482929824328692 0.90491797539373242 4.9039264020161522 0.54416779759863376 0.81440466174310355 4.9039264020161522 0.69259423366508266 0.69259423366508299 4.9039264020161522 0.81440466174310333 0.5441677975986341 4.9039264020161522 0.90491797539373231 0.37482929824328731 4.9039264020161522 0.96065579873382756 0.19108631916314239 4.9039264020161522 1.9165037446636235 0 4.6193976625564339 1.8796786626037532 -0.37389133269154196 4.6193976625564339 1.7706185836759589 -0.73341423114842308 4.6193976625564339 1.5935146255518391 -1.0647524320057096 4.6193976625564339 1.3551727940210598 -1.3551727940210596 4.6193976625564339 1.0647524320057096 -1.5935146255518391 4.6193976625564339 0.73341423114842319 -1.7706185836759589 4.6193976625564339 0.37389133269154212 -1.8796786626037532 4.6193976625564339 1.173481331419726e-16 -1.9165037446636235 4.6193976625564339 -0.37389133269154184 -1.8796786626037532 4.6193976625564339 -0.73341423114842297 -1.7706185836759589 4.6193976625564339 -1.0647524320057091 -1.5935146255518395 4.6193976625564339 -1.3551727940210596 -1.3551727940210598 4.6193976625564339 -1.5935146255518393 -1.0647524320057096 4.6193976625564339 -1.7706185836759589 -0.7334142311484233 4.6193976625564339 -1.8796786626037532 -0.37389133269154262 4.6193976625564339 -1.9165037446636235 -2.3469626628394521e-16 4.6193976625564339 -1.8796786626037532 0.37389133269154218 4.6193976625564339 -1.7706185836759591 0.73341423114842286 4.6193976625564339 -1.5935146255518395 1.0647524320057091 4.6193976625564339 -1.3551727940210601 1.3551727940210596 4.6193976625564339 -1.0647524320057096 1.5935146255518391 4.6193976625564339 -0.73341423114842408 1.7706185836759585 4.6193976625564339 -0.37389133269154273 1.8796786626037529 4.6193976625564339 -3.5204439942591786e-16 1.9165037446636235 4.6193976625564339 0.37389133269154207 1.8796786626037532 4.6193976625564339 0.73341423114842352 1.7706185836759587 4.6193976625564339 1.0647524320057089 1.5935146255518395 4.6193976625564339 1.3551727940210594 1.3551727940210601 4.6193976625564339 1.5935146255518391 1.0647524320057096 4.6193976625564339 1.7706185836759585 0.73341423114842419 4.6193976625564339 1.8796786626037529 0.37389133269154284 4.6193976625564339 2.7800733139329128 0 4.1573480615127263 2.7266549847472299 -0.54236539804361672 4.1573480615127263 2.5684528336234433 -1.0638879980024369 4.1573480615127263 2.3115464805084511 -1.5445259788332859 4.1573480615127263 1.9658086924777203 -1.9658086924777201 4.1573480615127263 1.5445259788332864 -2.3115464805084511 4.1573480615127263 1.0638879980024369 -2.5684528336234433 4.1573480615127263 0.54236539804361694 -2.7266549847472299 4.1573480615127263 1.7022477221671387e-16 -2.7800733139329128 4.1573480615127263 -0.54236539804361661 -2.7266549847472299 4.1573480615127263 -1.0638879980024367 -2.5684528336234433 4.1573480615127263 -1.5445259788332855 -2.3115464805084516 4.1573480615127263 -1.9658086924777201 -1.9658086924777203 4.1573480615127263 -2.3115464805084516 -1.5445259788332859 4.1573480615127263 -2.5684528336234433 -1.0638879980024372 4.1573480615127263 -2.7266549847472299 -0.54236539804361772 4.1573480615127263 -2.7800733139329128 -3.4044954443342775e-16 4.1573480615127263 -2.7266549847472299 0.54236539804361705 4.1573480615127263 -2.5684528336234433 1.0638879980024365 4.1573480615127263 -2.3115464805084516 1.5445259788332855 4.1573480615127263 -1.9658086924777207 1.9658086924777201 4.1573480615127263 -1.5445259788332859 2.3115464805084511 4.1573480615127263 -1.0638879980024385 2.5684528336234425 4.1573480615127263 -0.54236539804361794 2.7266549847472294 4.1573480615127263 -5.1067431665014159e-16 2.7800733139329128 4.1573480615127263 0.54236539804361694 2.7266549847472299 4.1573480615127263 1.0638879980024374 2.5684528336234429 4.1573480615127263 1.544525978833285 2.3115464805084516 4.1573480615127263 1.9658086924777198 1.9658086924777207 4.1573480615127263 2.3115464805084511 1.5445259788332859 4.1573480615127263 2.5684528336234425 1.0638879980024385 4.1573480615127263 2.7266549847472294 0.54236539804361805 4.1573480615127263 3.5369983720268046 0 3.5355339059327378 3.4690359400940789 -0.69003415136923063 3.5355339059327378 3.2677604024413065 -1.3535506772769523 3.5355339059327378 2.9409066651038609 -1.9650510097368854 3.5355339059327378 2.5010355339059327 -2.5010355339059323 3.5355339059327378 1.9650510097368858 -2.9409066651038609 3.5355339059327378 1.3535506772769526 -3.2677604024413065 3.5355339059327378 0.69003415136923096 -3.4690359400940789 3.5355339059327378 2.1657153399217148e-16 -3.5369983720268046 3.5355339059327378 -0.69003415136923052 -3.4690359400940789 3.5355339059327378 -1.3535506772769521 -3.2677604024413065 3.5355339059327378 -1.9650510097368845 -2.9409066651038618 3.5355339059327378 -2.5010355339059323 -2.5010355339059327 3.5355339059327378 -2.9409066651038613 -1.9650510097368854 3.5355339059327378 -3.2677604024413065 -1.3535506772769528 3.5355339059327378 -3.4690359400940789 -0.69003415136923196 3.5355339059327378 -3.5369983720268046 -4.3314306798434296e-16 3.5355339059327378 -3.4690359400940789 0.69003415136923107 3.5355339059327378 -3.2677604024413069 1.3535506772769519 3.5355339059327378 -2.9409066651038618 1.9650510097368845 3.5355339059327378 -2.5010355339059331 2.5010355339059323 3.5355339059327378 -1.9650510097368854 2.9409066651038609 3.5355339059327378 -1.3535506772769543 3.2677604024413056 3.5355339059327378 -0.69003415136923218 3.4690359400940785 3.5355339059327378 -6.4971460197651439e-16 3.5369983720268046 3.5355339059327378 0.69003415136923085 3.4690359400940789 3.5355339059327378 1.3535506772769532 3.2677604024413061 3.5355339059327378 1.9650510097368843 2.9409066651038618 3.5355339059327378 2.5010355339059318 2.5010355339059331 3.5355339059327378 2.9409066651038609 1.9650510097368854 3.5355339059327378 3.2677604024413056 1.3535506772769546 3.5355339059327378 3.4690359400940785 0.6900341513692323 3.5355339059327378 4.158190713451213 0 2.7778511650980113 4.0782922448623564 -0.81122276529167126 2.7778511650980113 3.8416672924360804 -1.5912706946521518 2.7778511650980113 3.4574092203933242 -2.3101669836120364 2.7778511650980113 2.9402848509482808 -2.9402848509482804 2.7778511650980113 2.3101669836120369 -3.4574092203933242 2.7778511650980113 1.591270694652152 -3.8416672924360804 2.7778511650980113 0.81122276529167159 -4.0782922448623564 2.7778511650980113 2.5460733840487798e-16 -4.158190713451213 2.7778511650980113 -0.81122276529167103 -4.0782922448623564 2.7778511650980113 -1.5912706946521515 -3.8416672924360804 2.7778511650980113 -2.3101669836120355 -3.4574092203933251 2.7778511650980113 -2.9402848509482804 -2.9402848509482808 2.7778511650980113 -3.4574092203933247 -2.3101669836120364 2.7778511650980113 -3.8416672924360804 -1.5912706946521522 2.7778511650980113 -4.0782922448623564 -0.8112227652916727 2.7778511650980113 -4.158190713451213 -5.0921467680975597e-16 2.7778511650980113 -4.0782922448623564 0.8112227652916717 2.7778511650980113 -3.8416672924360808 1.5912706946521513 2.7778511650980113 -3.4574092203933251 2.3101669836120355 2.7778511650980113 -2.9402848509482813 2.9402848509482804 2.7778511650980113 -2.3101669836120364 3.4574092203933242 2.7778511650980113 -1.591270694652154 3.8416672924360795 2.7778511650980113 -0.81122276529167292 4.0782922448623564 2.7778511650980113 -7.6382201521463395e-16 4.158190713451213 2.7778511650980113 0.81122276529167148 4.0782922448623564 2.7778511650980113 1.5912706946521527 3.84166729243608 2.7778511650980113 2.3101669836120351 3.4574092203933251 2.7778511650980113 2.94028485094828 2.9402848509482813 2.7778511650980113 3.4574092203933242 2.3101669836120364 2.7778511650980113 3.8416672924360795 1.5912706946521542 2.7778511650980113 4.0782922448623564 0.81122276529167314 2.7778511650980113 4.6197782648938777 0 1.9134171618254492 4.5310105209346911 -0.90127402934125678 1.9134171618254492 4.2681185836759594 -1.7679126031752281 1.9134171618254492 3.8412052428350374 -2.5666112871259852 1.9134171618254492 3.2666765386846834 -3.266676538684683 1.9134171618254492 2.5666112871259856 -3.8412052428350374 1.9134171618254492 1.7679126031752284 -4.2681185836759594 1.9134171618254492 0.90127402934125722 -4.5310105209346911 1.9134171618254492 2.8287049082197799e-16 -4.6197782648938777 1.9134171618254492 -0.90127402934125656 -4.5310105209346911 1.9134171618254492 -1.7679126031752277 -4.2681185836759594 1.9134171618254492 -2.5666112871259839 -3.8412052428350387 1.9134171618254492 -3.266676538684683 -3.2666765386846834 1.9134171618254492 -3.8412052428350383 -2.5666112871259852 1.9134171618254492 -4.2681185836759594 -1.7679126031752286 1.9134171618254492 -4.5310105209346911 -0.90127402934125844 1.9134171618254492 -4.6197782648938777 -5.6574098164395597e-16 1.9134171618254492 -4.5310105209346911 0.90127402934125733 1.9134171618254492 -4.2681185836759594 1.7679126031752275 1.9134171618254492 -3.8412052428350387 2.5666112871259839 1.9134171618254492 -3.2666765386846839 3.266676538684683 1.9134171618254492 -2.5666112871259852 3.8412052428350374 1.9134171618254492 -1.7679126031752306 4.2681185836759576 1.9134171618254492 -0.90127402934125878 4.5310105209346903 1.9134171618254492 -8.4861147246593396e-16 4.6197782648938777 1.9134171618254492 0.90127402934125711 4.5310105209346911 1.9134171618254492 1.767912603175229 4.2681185836759585 1.9134171618254492 2.5666112871259834 3.8412052428350387 1.9134171618254492 3.2666765386846826 3.2666765386846839 1.9134171618254492 3.8412052428350374 2.5666112871259852 1.9134171618254492 4.2681185836759576 1.7679126031752308 1.9134171618254492 4.5310105209346903 0.901274029341259 1.9134171618254492 4.904022475614136 0 0.97545161008064163 4.809793058848955 -0.95672732394189219 0.97545161008064163 4.5307259921952312 -1.8766881533635624 0.97545161008064163 4.0775456665218535 -2.7245289095103118 0.97545161008064163 3.4676675475979963 -3.4676675475979954 0.97545161008064163 2.7245289095103122 -4.0775456665218535 0.97545161008064163 1.8766881533635627 -4.5307259921952312 0.97545161008064163 0.95672732394189264 -4.809793058848955 0.97545161008064163 3.0027485414624075e-16 -4.904022475614136 0.97545161008064163 -0.95672732394189197 -4.809793058848955 0.97545161008064163 -1.876688153363562 -4.5307259921952312 0.97545161008064163 -2.7245289095103109 -4.0775456665218552 0.97545161008064163 -3.4676675475979954 -3.4676675475979963 0.97545161008064163 -4.0775456665218544 -2.7245289095103118 0.97545161008064163 -4.5307259921952312 -1.8766881533635629 0.97545161008064163 -4.809793058848955 -0.95672732394189397 0.97545161008064163 -4.904022475614136 -6.005497082924815e-16 0.97545161008064163 -4.809793058848955 0.95672732394189275 0.97545161008064163 -4.5307259921952312 1.8766881533635618 0.97545161008064163 -4.0775456665218552 2.7245289095103109 0.97545161008064163 -3.4676675475979968 3.4676675475979954 0.97545161008064163 -2.7245289095103118 4.0775456665218535 0.97545161008064163 -1.8766881533635651 4.5307259921952303 0.97545161008064163 -0.9567273239418943 4.8097930588489541 0.97545161008064163 -9.0082456243872235e-16 4.904022475614136 0.97545161008064163 0.95672732394189253 4.809793058848955 0.97545161008064163 1.8766881533635635 4.5307259921952303 0.97545161008064163 2.72452890951031 4.0775456665218552 0.97545161008064163 3.467667547597995 3.4676675475979968 0.97545161008064163 4.0775456665218535 2.7245289095103118 0.97545161008064163 4.5307259921952303 1.8766881533635653 0.97545161008064163 4.8097930588489541 0.95672732394189453 0.97545161008064163 5 0 3.0615158845559431e-16 4.9039264020161522 -0.97545161008064118 3.0615158845559431e-16 4.6193976625564339 -1.913417161825449 3.0615158845559431e-16 4.1573480615127263 -2.7778511650980109 3.0615158845559431e-16 3.5355339059327378 -3.5355339059327373 3.0615158845559431e-16 2.7778511650980113 -4.1573480615127263 3.0615158845559431e-16 1.9134171618254492 -4.6193976625564339 3.0615158845559431e-16 0.97545161008064163 -4.9039264020161522 3.0615158845559431e-16 3.0615158845559431e-16 -5 3.0615158845559431e-16 -0.97545161008064096 -4.9039264020161522 3.0615158845559431e-16 -1.9134171618254485 -4.6193976625564339 3.0615158845559431e-16 -2.77785116509801 -4.1573480615127272 3.0615158845559431e-16 -3.5355339059327373 -3.5355339059327378 3.0615158845559431e-16 -4.1573480615127263 -2.7778511650980109 3.0615158845559431e-16 -4.6193976625564339 -1.9134171618254494 3.0615158845559431e-16 -4.9039264020161522 -0.97545161008064307 3.0615158845559431e-16 -5 -6.1230317691118863e-16 3.0615158845559431e-16 -4.9039264020161522 0.97545161008064185 3.0615158845559431e-16 -4.6193976625564339 1.9134171618254483 3.0615158845559431e-16 -4.1573480615127272 2.77785116509801 3.0615158845559431e-16 -3.5355339059327386 3.5355339059327373 3.0615158845559431e-16 -2.7778511650980109 4.1573480615127263 3.0615158845559431e-16 -1.9134171618254516 4.6193976625564321 3.0615158845559431e-16 -0.97545161008064329 4.9039264020161513 3.0615158845559431e-16 -9.1845476536678294e-16 5 3.0615158845559431e-16 0.97545161008064152 4.9039264020161522 3.0615158845559431e-16 1.9134171618254501 4.619397662556433 3.0615158845559431e-16 2.7778511650980091 4.1573480615127272 3.0615158845559431e-16 3.5355339059327369 3.5355339059327386 3.0615158845559431e-16 4.1573480615127263 2.7778511650980109 3.0615158845559431e-16 4.6193976625564321 1.9134171618254521 3.0615158845559431e-16 4.9039264020161513 0.97545161008064363 3.0615158845559431e-16 4.904022475614136 0 -0.97545161008064096 4.809793058848955 -0.95672732394189219 -0.97545161008064096 4.5307259921952312 -1.8766881533635624 -0.97545161008064096 4.0775456665218535 -2.7245289095103118 -0.97545161008064096 3.4676675475979963 -3.4676675475979954 -0.97545161008064096 2.7245289095103122 -4.0775456665218535 -0.97545161008064096 1.8766881533635627 -4.5307259921952312 -0.97545161008064096 0.95672732394189264 -4.809793058848955 -0.97545161008064096 3.0027485414624075e-16 -4.904022475614136 -0.97545161008064096 -0.95672732394189197 -4.809793058848955 -0.97545161008064096 -1.876688153363562 -4.5307259921952312 -0.97545161008064096 -2.7245289095103109 -4.0775456665218552 -0.97545161008064096 -3.4676675475979954 -3.4676675475979963 -0.97545161008064096 -4.0775456665218544 -2.7245289095103118 -0.97545161008064096 -4.5307259921952312 -1.8766881533635629 -0.97545161008064096 -4.809793058848955 -0.95672732394189397 -0.97545161008064096 -4.904022475614136 -6.005497082924815e-16 -0.97545161008064096 -4.809793058848955 0.95672732394189275 -0.97545161008064096 -4.5307259921952312 1.8766881533635618 -0.97545161008064096 -4.0775456665218552 2.7245289095103109 -0.97545161008064096 -3.4676675475979968 3.4676675475979954 -0.97545161008064096 -2.7245289095103118 4.0775456665218535 -0.97545161008064096 -1.8766881533635651 4.5307259921952303 -0.97545161008064096 -0.9567273239418943 4.8097930588489541 -0.97545161008064096 -9.0082456243872235e-16 4.904022475614136 -0.97545161008064096 0.95672732394189253 4.809793058848955 -0.97545161008064096 1.8766881533635635 4.5307259921952303 -0.97545161008064096 2.72452890951031 4.0775456665218552 -0.97545161008064096 3.467667547597995 3.4676675475979968 -0.97545161008064096 4.0775456665218535 2.7245289095103118 -0.97545161008064096 4.5307259921952303 1.8766881533635653 -0.97545161008064096 4.8097930588489541 0.95672732394189453 -0.97545161008064096 4.6197782648938777 0 -1.9134171618254485 4.5310105209346911 -0.90127402934125678 -1.9134171618254485 4.2681185836759594 -1.7679126031752281 -1.9134171618254485 3.8412052428350374 -2.5666112871259852 -1.9134171618254485 3.2666765386846834 -3.266676538684683 -1.9134171618254485 2.5666112871259856 -3.8412052428350374 -1.9134171618254485 1.7679126031752284 -4.2681185836759594 -1.9134171618254485 0.90127402934125722 -4.5310105209346911 -1.9134171618254485 2.8287049082197799e-16 -4.6197782648938777 -1.9134171618254485 -0.90127402934125656 -4.5310105209346911 -1.9134171618254485 -1.7679126031752277 -4.2681185836759594 -1.9134171618254485 -2.5666112871259839 -3.8412052428350387 -1.9134171618254485 -3.266676538684683 -3.2666765386846834 -1.9134171618254485 -3.8412052428350383 -2.5666112871259852 -1.9134171618254485 -4.2681185836759594 -1.7679126031752286 -1.9134171618254485 -4.5310105209346911 -0.90127402934125844 -1.9134171618254485 -4.6197782648938777 -5.6574098164395597e-16 -1.9134171618254485 -4.5310105209346911 0.90127402934125733 -1.9134171618254485 -4.2681185836759594 1.7679126031752275 -1.9134171618254485 -3.8412052428350387 2.5666112871259839 -1.9134171618254485 -3.2666765386846839 3.266676538684683 -1.9134171618254485 -2.5666112871259852 3.8412052428350374 -1.9134171618254485 -1.7679126031752306 4.2681185836759576 -1.9134171618254485 -0.90127402934125878 4.5310105209346903 -1.9134171618254485 -8.4861147246593396e-16 4.6197782648938777 -1.9134171618254485 0.90127402934125711 4.5310105209346911 -1.9134171618254485 1.767912603175229 4.2681185836759585 -1.9134171618254485 2.5666112871259834 3.8412052428350387 -1.9134171618254485 3.2666765386846826 3.2666765386846839 -1.9134171618254485 3.8412052428350374 2.5666112871259852 -1.9134171618254485 4.2681185836759576 1.7679126031752308 -1.9134171618254485 4.5310105209346903 0.901274029341259 -1.9134171618254485 4.1581907134512148 0 -2.77785116509801 4.0782922448623582 -0.81122276529167159 -2.77785116509801 3.8416672924360822 -1.5912706946521524 -2.77785116509801 3.4574092203933255 -2.3101669836120373 -2.77785116509801 2.9402848509482822 -2.9402848509482817 -2.77785116509801 2.3101669836120378 -3.4574092203933255 -2.77785116509801 1.5912706946521527 -3.8416672924360822 -2.77785116509801 0.81122276529167192 -4.0782922448623582 -2.77785116509801 2.5460733840487808e-16 -4.1581907134512148 -2.77785116509801 -0.81122276529167137 -4.0782922448623582 -2.77785116509801 -1.5912706946521522 -3.8416672924360822 -2.77785116509801 -2.3101669836120364 -3.4574092203933264 -2.77785116509801 -2.9402848509482817 -2.9402848509482822 -2.77785116509801 -3.457409220393326 -2.3101669836120373 -2.77785116509801 -3.8416672924360822 -1.5912706946521529 -2.77785116509801 -4.0782922448623582 -0.81122276529167303 -2.77785116509801 -4.1581907134512148 -5.0921467680975617e-16 -2.77785116509801 -4.0782922448623582 0.81122276529167203 -2.77785116509801 -3.8416672924360826 1.591270694652152 -2.77785116509801 -3.4574092203933264 2.3101669836120364 -2.77785116509801 -2.9402848509482826 2.9402848509482817 -2.77785116509801 -2.3101669836120373 3.4574092203933255 -2.77785116509801 -1.5912706946521546 3.8416672924360813 -2.77785116509801 -0.81122276529167325 4.0782922448623582 -2.77785116509801 -7.6382201521463425e-16 4.1581907134512148 -2.77785116509801 0.81122276529167181 4.0782922448623582 -2.77785116509801 1.5912706946521533 3.8416672924360817 -2.77785116509801 2.310166983612036 3.4574092203933264 -2.77785116509801 2.9402848509482813 2.9402848509482826 -2.77785116509801 3.4574092203933255 2.3101669836120373 -2.77785116509801 3.8416672924360813 1.5912706946521549 -2.77785116509801 4.0782922448623582 0.81122276529167348 -2.77785116509801 3.536998372026805 0 -3.5355339059327373 3.4690359400940793 -0.69003415136923074 -3.5355339059327373 3.2677604024413069 -1.3535506772769526 -3.5355339059327373 2.9409066651038613 -1.9650510097368856 -3.5355339059327373 2.5010355339059331 -2.5010355339059327 -3.5355339059327373 1.9650510097368861 -2.9409066651038613 -3.5355339059327373 1.3535506772769528 -3.2677604024413069 -3.5355339059327373 0.69003415136923107 -3.4690359400940793 -3.5355339059327373 2.165715339921715e-16 -3.536998372026805 -3.5355339059327373 -0.69003415136923052 -3.4690359400940793 -3.5355339059327373 -1.3535506772769523 -3.2677604024413069 -3.5355339059327373 -1.9650510097368847 -2.9409066651038618 -3.5355339059327373 -2.5010355339059327 -2.5010355339059331 -3.5355339059327373 -2.9409066651038618 -1.9650510097368856 -3.5355339059327373 -3.2677604024413069 -1.353550677276953 -3.5355339059327373 -3.4690359400940793 -0.69003415136923207 -3.5355339059327373 -3.536998372026805 -4.3314306798434301e-16 -3.5355339059327373 -3.4690359400940793 0.69003415136923119 -3.5355339059327373 -3.2677604024413074 1.3535506772769521 -3.5355339059327373 -2.9409066651038618 1.9650510097368847 -3.5355339059327373 -2.5010355339059336 2.5010355339059327 -3.5355339059327373 -1.9650510097368856 2.9409066651038613 -3.5355339059327373 -1.3535506772769546 3.2677604024413061 -3.5355339059327373 -0.6900341513692323 3.4690359400940789 -3.5355339059327373 -6.4971460197651449e-16 3.536998372026805 -3.5355339059327373 0.69003415136923096 3.4690359400940793 -3.5355339059327373 1.3535506772769532 3.2677604024413065 -3.5355339059327373 1.9650510097368845 2.9409066651038618 -3.5355339059327373 2.5010355339059323 2.5010355339059336 -3.5355339059327373 2.9409066651038613 1.9650510097368856 -3.5355339059327373 3.2677604024413061 1.3535506772769546 -3.5355339059327373 3.4690359400940789 0.69003415136923241 -3.5355339059327373 2.7800733139329128 0 -4.1573480615127263 2.7266549847472299 -0.54236539804361672 -4.1573480615127263 2.5684528336234433 -1.0638879980024369 -4.1573480615127263 2.3115464805084511 -1.5445259788332859 -4.1573480615127263 1.9658086924777203 -1.9658086924777201 -4.1573480615127263 1.5445259788332864 -2.3115464805084511 -4.1573480615127263 1.0638879980024369 -2.5684528336234433 -4.1573480615127263 0.54236539804361694 -2.7266549847472299 -4.1573480615127263 1.7022477221671387e-16 -2.7800733139329128 -4.1573480615127263 -0.54236539804361661 -2.7266549847472299 -4.1573480615127263 -1.0638879980024367 -2.5684528336234433 -4.1573480615127263 -1.5445259788332855 -2.3115464805084516 -4.1573480615127263 -1.9658086924777201 -1.9658086924777203 -4.1573480615127263 -2.3115464805084516 -1.5445259788332859 -4.1573480615127263 -2.5684528336234433 -1.0638879980024372 -4.1573480615127263 -2.7266549847472299 -0.54236539804361772 -4.1573480615127263 -2.7800733139329128 -3.4044954443342775e-16 -4.1573480615127263 -2.7266549847472299 0.54236539804361705 -4.1573480615127263 -2.5684528336234433 1.0638879980024365 -4.1573480615127263 -2.3115464805084516 1.5445259788332855 -4.1573480615127263 -1.9658086924777207 1.9658086924777201 -4.1573480615127263 -1.5445259788332859 2.3115464805084511 -4.1573480615127263 -1.0638879980024385 2.5684528336234425 -4.1573480615127263 -0.54236539804361794 2.7266549847472294 -4.1573480615127263 -5.1067431665014159e-16 2.7800733139329128 -4.1573480615127263 0.54236539804361694 2.7266549847472299 -4.1573480615127263 1.0638879980024374 2.5684528336234429 -4.1573480615127263 1.544525978833285 2.3115464805084516 -4.1573480615127263 1.9658086924777198 1.9658086924777207 -4.1573480615127263 2.3115464805084511 1.5445259788332859 -4.1573480615127263 2.5684528336234425 1.0638879980024385 -4.1573480615127263 2.7266549847472294 0.54236539804361805 -4.1573480615127263 1.9165037446636239 0 -4.6193976625564339 1.8796786626037536 -0.37389133269154201 -4.6193976625564339 1.7706185836759594 -0.73341423114842319 -4.6193976625564339 1.5935146255518395 -1.0647524320057098 -4.6193976625564339 1.3551727940210603 -1.3551727940210601 -4.6193976625564339 1.06475243200571 -1.5935146255518395 -4.6193976625564339 0.7334142311484233 -1.7706185836759594 -4.6193976625564339 0.37389133269154218 -1.8796786626037536 -4.6193976625564339 1.1734813314197265e-16 -1.9165037446636239 -4.6193976625564339 -0.3738913326915419 -1.8796786626037536 -4.6193976625564339 -0.73341423114842308 -1.7706185836759594 -4.6193976625564339 -1.0647524320057093 -1.59351462555184 -4.6193976625564339 -1.3551727940210601 -1.3551727940210603 -4.6193976625564339 -1.5935146255518398 -1.0647524320057098 -4.6193976625564339 -1.7706185836759594 -0.73341423114842341 -4.6193976625564339 -1.8796786626037536 -0.37389133269154273 -4.6193976625564339 -1.9165037446636239 -2.3469626628394531e-16 -4.6193976625564339 -1.8796786626037536 0.37389133269154223 -4.6193976625564339 -1.7706185836759596 0.73341423114842297 -4.6193976625564339 -1.59351462555184 1.0647524320057093 -4.6193976625564339 -1.3551727940210603 1.3551727940210601 -4.6193976625564339 -1.0647524320057098 1.5935146255518395 -4.6193976625564339 -0.7334142311484243 1.7706185836759589 -4.6193976625564339 -0.37389133269154284 1.8796786626037534 -4.6193976625564339 -3.5204439942591791e-16 1.9165037446636239 -4.6193976625564339 0.37389133269154212 1.8796786626037536 -4.6193976625564339 0.73341423114842363 1.7706185836759591 -4.6193976625564339 1.0647524320057091 1.59351462555184 -4.6193976625564339 1.3551727940210598 1.3551727940210603 -4.6193976625564339 1.5935146255518395 1.0647524320057098 -4.6193976625564339 1.7706185836759589 0.73341423114842441 -4.6193976625564339 1.8796786626037534 0.37389133269154295 -4.6193976625564339 0.97947615847056235 0 -4.9039264020161522 0.96065579873382945 -0.19108631916314228 -4.9039264020161522 0.9049179753937342 -0.37482929824328742 -4.9039264020161522 0.81440466174310489 -0.54416779759863509 -4.9039264020161522 0.6925942336650841 -0.69259423366508399 -4.9039264020161522 0.54416779759863521 -0.81440466174310489 -4.9039264020161522 0.37482929824328748 -0.9049179753937342 -4.9039264020161522 0.19108631916314237 -0.96065579873382945 -4.9039264020161522 5.9973636354029222e-17 -0.97947615847056235 -4.9039264020161522 -0.19108631916314223 -0.96065579873382945 -4.9039264020161522 -0.37482929824328737 -0.9049179753937342 -4.9039264020161522 -0.54416779759863487 -0.81440466174310511 -4.9039264020161522 -0.69259423366508399 -0.6925942336650841 -4.9039264020161522 -0.814404661743105 -0.54416779759863509 -4.9039264020161522 -0.9049179753937342 -0.37482929824328753 -4.9039264020161522 -0.96065579873382945 -0.19108631916314262 -4.9039264020161522 -0.97947615847056235 -1.1994727270805844e-16 -4.9039264020161522 -0.96065579873382945 0.19108631916314239 -4.9039264020161522 -0.90491797539373431 0.37482929824328731 -4.9039264020161522 -0.81440466174310511 0.54416779759863487 -4.9039264020161522 -0.69259423366508421 0.69259423366508399 -4.9039264020161522 -0.54416779759863509 0.81440466174310489 -4.9039264020161522 -0.37482929824328798 0.90491797539373398 -4.9039264020161522 -0.19108631916314267 0.96065579873382934 -4.9039264020161522 -1.7992090906208765e-16 0.97947615847056235 -4.9039264020161522 0.19108631916314234 0.96065579873382945 -4.9039264020161522 0.37482929824328765 0.90491797539373409 -4.9039264020161522 0.54416779759863476 0.81440466174310511 -4.9039264020161522 0.69259423366508388 0.69259423366508421 -4.9039264020161522 0.81440466174310489 0.54416779759863509 -4.9039264020161522 0.90491797539373398 0.37482929824328803 -4.9039264020161522 0.96065579873382934 0.19108631916314273 -4.9039264020161522 0 0 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 39 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63 67 68 66 70 71 69 73 74 72 76 77 75 79 80 78 82 83 81 85 86 84 88 89 87 91 92 90 94 95 93 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1888 1892 1893 1891 1895 1896 1894 1898 1899 1897 1901 1902 1900 1904 1905 1903 1907 1908 1906 1910 1911 1909 1913 1914 1912 1916 1917 1915 1919 1920 1918 1922 1923 1921 1925 1926 1924 1928 1929 1927 1931 1932 1930 1934 1935 1933 1937 1938 1936 1940 1941 1939 1943 1944 1942 1946 1947 1945 1949 1950 1948 1952 1953 1951 1955 1956 1954 1958 1959 1957 1961 1962 1960 1964 1965 1963 1967 1968 1966 1970 1971 1969 1973 1974 1972 1976 1977 1975 1979 1980 1978 1982 1983 1981</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1891 1894 1897 1900 1903 1906 1909 1912 1915 1918 1921 1924 1927 1930 1933 1936 1939 1942 1945 1948 1951 1954 1957 1960 1963 1966 1969 1972 1975 1978 1981</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">2 1 0 3 2 0 4 3 0 5 4 0 6 5 0 7 6 0 8 7 0 9 8 0 10 9 0 11 10 0 12 11 0 13 12 0 14 13 0 15 14 0 16 15 0 17 16 0 18 17 0 19 18 0 20 19 0 21 20 0 22 21 0 23 22 0 24 23 0 25 24 0 26 25 0 27 26 0 28 27 0 29 28 0 30 29 0 31 30 0 32 31 0 1 32 0 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 32 64 63 32 1 33 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 64 96 95 64 33 65 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 96 128 127 96 65 97 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 128 160 159 128 97 129 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 160 192 191 160 129 161 192 161 162 194 193 162 163 195 194 163 164 196 195 164 165 197 196 165 166 198 197 166 167 199 198 167 168 200 199 168 169 201 200 169 170 202 201 170 171 203 202 171 172 204 203 172 173 205 204 173 174 206 205 174 175 207 206 175 176 208 207 176 177 209 208 177 178 210 209 178 179 211 210 179 180 212 211 180 181 213 212 181 182 214 213 182 183 215 214 183 184 216 215 184 185 217 216 185 186 218 217 186 187 219 218 187 188 220 219 188 189 221 220 189 190 222 221 190 191 223 222 191 192 224 223 192 161 193 224 193 194 226 225 194 195 227 226 195 196 228 227 196 197 229 228 197 198 230 229 198 199 231 230 199 200 232 231 200 201 233 232 201 202 234 233 202 203 235 234 203 204 236 235 204 205 237 236 205 206 238 237 206 207 239 238 207 208 240 239 208 209 241 240 209 210 242 241 210 211 243 242 211 212 244 243 212 213 245 244 213 214 246 245 214 215 247 246 215 216 248 247 216 217 249 248 217 218 250 249 218 219 251 250 219 220 252 251 220 221 253 252 221 222 254 253 222 223 255 254 223 224 256 255 224 193 225 256 225 226 258 257 226 227 259 258 227 228 260 259 228 229 261 260 229 230 262 261 230 231 263 262 231 232 264 263 232 233 265 264 233 234 266 265 234 235 267 266 235 236 268 267 236 237 269 268 237 238 270 269 238 239 271 270 239 240 272 271 240 241 273 272 241 242 274 273 242 243 275 274 243 244 276 275 244 245 277 276 245 246 278 277 246 247 279 278 247 248 280 279 248 249 281 280 249 250 282 281 250 251 283 282 251 252 284 283 252 253 285 284 253 254 286 285 254 255 287 286 255 256 288 287 256 225 257 288 257 258 290 289 258 259 291 290 259 260 292 291 260 261 293 292 261 262 294 293 262 263 295 294 263 264 296 295 264 265 297 296 265 266 298 297 266 267 299 298 267 268 300 299 268 269 301 300 269 270 302 301 270 271 303 302 271 272 304 303 272 273 305 304 273 274 306 305 274 275 307 306 275 276 308 307 276 277 309 308 277 278 310 309 278 279 311 310 279 280 312 311 280 281 313 312 281 282 314 313 282 283 315 314 283 284 316 315 284 285 317 316 285 286 318 317 286 287 319 318 287 288 320 319 288 257 289 320 289 290 322 321 290 291 323 322 291 292 324 323 292 293 325 324 293 294 326 325 294 295 327 326 295 296 328 327 296 297 329 328 297 298 330 329 298 299 331 330 299 300 332 331 300 301 333 332 301 302 334 333 302 303 335 334 303 304 336 335 304 305 337 336 305 306 338 337 306 307 339 338 307 308 340 339 308 309 341 340 309 310 342 341 310 311 343 342 311 312 344 343 312 313 345 344 313 314 346 345 314 315 347 346 315 316 348 347 316 317 349 348 317 318 350 349 318 319 351 350 319 320 352 351 320 289 321 352 321 322 354 353 322 323 355 354 323 324 356 355 324 325 357 356 325 326 358 357 326 327 359 358 327 328 360 359 328 329 361 360 329 330 362 361 330 331 363 362 331 332 364 363 332 333 365 364 333 334 366 365 334 335 367 366 335 336 368 367 336 337 369 368 337 338 370 369 338 339 371 370 339 340 372 371 340 341 373 372 341 342 374 373 342 343 375 374 343 344 376 375 344 345 377 376 345 346 378 377 346 347 379 378 347 348 380 379 348 349 381 380 349 350 382 381 350 351 383 382 351 352 384 383 352 321 353 384 353 354 386 385 354 355 387 386 355 356 388 387 356 357 389 388 357 358 390 389 358 359 391 390 359 360 392 391 360 361 393 392 361 362 394 393 362 363 395 394 363 364 396 395 364 365 397 396 365 366 398 397 366 367 399 398 367 368 400 399 368 369 401 400 369 370 402 401 370 371 403 402 371 372 404 403 372 373 405 404 373 374 406 405 374 375 407 406 375 376 408 407 376 377 409 408 377 378 410 409 378 379 411 410 379 380 412 411 380 381 413 412 381 382 414 413 382 383 415 414 383 384 416 415 384 353 385 416 385 386 418 417 386 387 419 418 387 388 420 419 388 389 421 420 389 390 422 421 390 391 423 422 391 392 424 423 392 393 425 424 393 394 426 425 394 395 427 426 395 396 428 427 396 397 429 428 397 398 430 429 398 399 431 430 399 400 432 431 400 401 433 432 401 402 434 433 402 403 435 434 403 404 436 435 404 405 437 436 405 406 438 437 406 407 439 438 407 408 440 439 408 409 441 440 409 410 442 441 410 411 443 442 411 412 444 443 412 413 445 444 413 414 446 445 414 415 447 446 415 416 448 447 416 385 417 448 417 418 450 449 418 419 451 450 419 420 452 451 420 421 453 452 421 422 454 453 422 423 455 454 423 424 456 455 424 425 457 456 425 426 458 457 426 427 459 458 427 428 460 459 428 429 461 460 429 430 462 461 430 431 463 462 431 432 464 463 432 433 465 464 433 434 466 465 434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 448 480 479 448 417 449 480 449 450 481 450 451 481 451 452 481 452 453 481 453 454 481 454 455 481 455 456 481 456 457 481 457 458 481 458 459 481 459 460 481 460 461 481 461 462 481 462 463 481 463 464 481 464 465 481 465 466 481 466 467 481 467 468 481 468 469 481 469 470 481 470 471 481 471 472 481 472 473 481 473 474 481 474 475 481 475 476 481 476 477 481 477 478 481 478 479 481 479 480 481 480 449 481\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolySphere.2.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 5 0.97947615847056058 0 4.9039264020161522 0.96065579873382767 -0.19108631916314192 4.9039264020161522 0.90491797539373253 -0.3748292982432867 4.9039264020161522 0.81440466174310333 -0.5441677975986341 4.9039264020161522 0.69259423366508288 -0.69259423366508277 4.9039264020161522 0.54416779759863421 -0.81440466174310322 4.9039264020161522 0.37482929824328676 -0.90491797539373253 4.9039264020161522 0.19108631916314198 -0.96065579873382767 4.9039264020161522 5.9975617115605883e-17 -0.97947615847056058 4.9039264020161522 -0.19108631916314187 -0.96065579873382767 4.9039264020161522 -0.3748292982432867 -0.90491797539373253 4.9039264020161522 -0.54416779759863387 -0.81440466174310355 4.9039264020161522 -0.69259423366508277 -0.69259423366508288 4.9039264020161522 -0.81440466174310344 -0.5441677975986341 4.9039264020161522 -0.90491797539373253 -0.37482929824328676 4.9039264020161522 -0.96065579873382767 -0.19108631916314225 4.9039264020161522 -0.97947615847056058 -1.1995123423121177e-16 4.9039264020161522 -0.96065579873382767 0.19108631916314203 4.9039264020161522 -0.90491797539373253 0.37482929824328665 4.9039264020161522 -0.81440466174310355 0.54416779759863387 4.9039264020161522 -0.69259423366508299 0.69259423366508277 4.9039264020161522 -0.5441677975986341 0.81440466174310333 4.9039264020161522 -0.37482929824328726 0.90491797539373231 4.9039264020161522 -0.19108631916314234 0.96065579873382756 4.9039264020161522 -1.7992685134681764e-16 0.97947615847056058 4.9039264020161522 0.19108631916314195 0.96065579873382767 4.9039264020161522 0.37482929824328692 0.90491797539373242 4.9039264020161522 0.54416779759863376 0.81440466174310366 4.9039264020161522 0.69259423366508277 0.69259423366508299 4.9039264020161522 0.81440466174310333 0.5441677975986341 4.9039264020161522 0.90491797539373231 0.37482929824328731 4.9039264020161522 0.96065579873382756 0.19108631916314239 4.9039264020161522 1.9165037446636235 0 4.6193976625564339 1.8796786626037532 -0.37389133269154196 4.6193976625564339 1.7706185836759589 -0.73341423114842308 4.6193976625564339 1.5935146255518391 -1.0647524320057096 4.6193976625564339 1.3551727940210598 -1.3551727940210596 4.6193976625564339 1.0647524320057096 -1.5935146255518389 4.6193976625564339 0.73341423114842319 -1.7706185836759589 4.6193976625564339 0.37389133269154207 -1.8796786626037532 4.6193976625564339 1.1735200882281113e-16 -1.9165037446636235 4.6193976625564339 -0.37389133269154184 -1.8796786626037532 4.6193976625564339 -0.73341423114842297 -1.7706185836759589 4.6193976625564339 -1.0647524320057091 -1.5935146255518395 4.6193976625564339 -1.3551727940210596 -1.3551727940210598 4.6193976625564339 -1.5935146255518393 -1.0647524320057096 4.6193976625564339 -1.7706185836759589 -0.73341423114842319 4.6193976625564339 -1.8796786626037532 -0.37389133269154257 4.6193976625564339 -1.9165037446636235 -2.3470401764562226e-16 4.6193976625564339 -1.8796786626037532 0.37389133269154218 4.6193976625564339 -1.7706185836759589 0.73341423114842286 4.6193976625564339 -1.5935146255518395 1.0647524320057091 4.6193976625564339 -1.3551727940210601 1.3551727940210596 4.6193976625564339 -1.0647524320057096 1.5935146255518391 4.6193976625564339 -0.73341423114842408 1.7706185836759585 4.6193976625564339 -0.37389133269154273 1.8796786626037529 4.6193976625564339 -3.5205602646843339e-16 1.9165037446636235 4.6193976625564339 0.37389133269154201 1.8796786626037532 4.6193976625564339 0.73341423114842352 1.7706185836759587 4.6193976625564339 1.0647524320057089 1.5935146255518398 4.6193976625564339 1.3551727940210596 1.3551727940210601 4.6193976625564339 1.5935146255518391 1.0647524320057096 4.6193976625564339 1.7706185836759585 0.73341423114842419 4.6193976625564339 1.8796786626037529 0.37389133269154284 4.6193976625564339 2.7800733139329128 0 4.1573480615127263 2.7266549847472299 -0.54236539804361672 4.1573480615127263 2.5684528336234433 -1.0638879980024369 4.1573480615127263 2.3115464805084511 -1.5445259788332859 4.1573480615127263 1.9658086924777203 -1.9658086924777201 4.1573480615127263 1.5445259788332864 -2.3115464805084507 4.1573480615127263 1.0638879980024369 -2.5684528336234433 4.1573480615127263 0.54236539804361694 -2.7266549847472299 4.1573480615127263 1.7023039426514583e-16 -2.7800733139329128 4.1573480615127263 -0.54236539804361661 -2.7266549847472299 4.1573480615127263 -1.0638879980024367 -2.5684528336234433 4.1573480615127263 -1.5445259788332855 -2.3115464805084516 4.1573480615127263 -1.9658086924777201 -1.9658086924777203 4.1573480615127263 -2.3115464805084516 -1.5445259788332859 4.1573480615127263 -2.5684528336234433 -1.0638879980024369 4.1573480615127263 -2.7266549847472299 -0.54236539804361772 4.1573480615127263 -2.7800733139329128 -3.4046078853029166e-16 4.1573480615127263 -2.7266549847472299 0.54236539804361705 4.1573480615127263 -2.5684528336234433 1.0638879980024365 4.1573480615127263 -2.3115464805084516 1.5445259788332855 4.1573480615127263 -1.9658086924777207 1.9658086924777201 4.1573480615127263 -1.5445259788332859 2.3115464805084511 4.1573480615127263 -1.0638879980024385 2.5684528336234425 4.1573480615127263 -0.54236539804361794 2.7266549847472294 4.1573480615127263 -5.1069118279543739e-16 2.7800733139329128 4.1573480615127263 0.54236539804361683 2.7266549847472299 4.1573480615127263 1.0638879980024374 2.5684528336234429 4.1573480615127263 1.544525978833285 2.311546480508452 4.1573480615127263 1.9658086924777201 1.9658086924777207 4.1573480615127263 2.3115464805084511 1.5445259788332859 4.1573480615127263 2.5684528336234425 1.0638879980024385 4.1573480615127263 2.7266549847472294 0.54236539804361805 4.1573480615127263 3.5369983720268046 0 3.5355339059327378 3.4690359400940789 -0.69003415136923063 3.5355339059327378 3.2677604024413065 -1.3535506772769523 3.5355339059327378 2.9409066651038609 -1.9650510097368854 3.5355339059327378 2.5010355339059327 -2.5010355339059323 3.5355339059327378 1.9650510097368858 -2.9409066651038605 3.5355339059327378 1.3535506772769526 -3.2677604024413065 3.5355339059327378 0.69003415136923085 -3.4690359400940789 3.5355339059327378 2.1657868674460127e-16 -3.5369983720268046 3.5355339059327378 -0.69003415136923052 -3.4690359400940789 3.5355339059327378 -1.3535506772769521 -3.2677604024413065 3.5355339059327378 -1.9650510097368845 -2.9409066651038618 3.5355339059327378 -2.5010355339059323 -2.5010355339059327 3.5355339059327378 -2.9409066651038613 -1.9650510097368854 3.5355339059327378 -3.2677604024413065 -1.3535506772769526 3.5355339059327378 -3.4690359400940789 -0.69003415136923185 3.5355339059327378 -3.5369983720268046 -4.3315737348920254e-16 3.5355339059327378 -3.4690359400940789 0.69003415136923107 3.5355339059327378 -3.2677604024413065 1.3535506772769519 3.5355339059327378 -2.9409066651038618 1.9650510097368845 3.5355339059327378 -2.5010355339059331 2.5010355339059323 3.5355339059327378 -1.9650510097368854 2.9409066651038609 3.5355339059327378 -1.3535506772769543 3.2677604024413056 3.5355339059327378 -0.69003415136923218 3.4690359400940785 3.5355339059327378 -6.4973606023380378e-16 3.5369983720268046 3.5355339059327378 0.69003415136923074 3.4690359400940789 3.5355339059327378 1.3535506772769532 3.2677604024413061 3.5355339059327378 1.9650510097368843 2.9409066651038622 3.5355339059327378 2.5010355339059323 2.5010355339059331 3.5355339059327378 2.9409066651038609 1.9650510097368854 3.5355339059327378 3.2677604024413056 1.3535506772769546 3.5355339059327378 3.4690359400940785 0.6900341513692323 3.5355339059327378 4.158190713451213 0 2.7778511650980113 4.0782922448623564 -0.81122276529167126 2.7778511650980113 3.8416672924360804 -1.5912706946521518 2.7778511650980113 3.4574092203933242 -2.3101669836120364 2.7778511650980113 2.9402848509482808 -2.9402848509482804 2.7778511650980113 2.3101669836120369 -3.4574092203933238 2.7778511650980113 1.591270694652152 -3.8416672924360804 2.7778511650980113 0.81122276529167148 -4.0782922448623564 2.7778511650980113 2.5461574737361384e-16 -4.158190713451213 2.7778511650980113 -0.81122276529167103 -4.0782922448623564 2.7778511650980113 -1.5912706946521515 -3.8416672924360804 2.7778511650980113 -2.3101669836120355 -3.4574092203933251 2.7778511650980113 -2.9402848509482804 -2.9402848509482808 2.7778511650980113 -3.4574092203933247 -2.3101669836120364 2.7778511650980113 -3.8416672924360804 -1.591270694652152 2.7778511650980113 -4.0782922448623564 -0.81122276529167259 2.7778511650980113 -4.158190713451213 -5.0923149474722769e-16 2.7778511650980113 -4.0782922448623564 0.8112227652916717 2.7778511650980113 -3.8416672924360804 1.5912706946521513 2.7778511650980113 -3.4574092203933251 2.3101669836120355 2.7778511650980113 -2.9402848509482813 2.9402848509482804 2.7778511650980113 -2.3101669836120364 3.4574092203933242 2.7778511650980113 -1.591270694652154 3.8416672924360795 2.7778511650980113 -0.81122276529167292 4.0782922448623564 2.7778511650980113 -7.6384724212084148e-16 4.158190713451213 2.7778511650980113 0.81122276529167137 4.0782922448623564 2.7778511650980113 1.5912706946521527 3.84166729243608 2.7778511650980113 2.3101669836120351 3.4574092203933255 2.7778511650980113 2.9402848509482804 2.9402848509482813 2.7778511650980113 3.4574092203933242 2.3101669836120364 2.7778511650980113 3.8416672924360795 1.5912706946521542 2.7778511650980113 4.0782922448623564 0.81122276529167314 2.7778511650980113 4.6197782648938777 0 1.9134171618254492 4.5310105209346911 -0.90127402934125678 1.9134171618254492 4.2681185836759594 -1.7679126031752281 1.9134171618254492 3.8412052428350374 -2.5666112871259852 1.9134171618254492 3.2666765386846834 -3.266676538684683 1.9134171618254492 2.5666112871259856 -3.8412052428350369 1.9134171618254492 1.7679126031752284 -4.2681185836759594 1.9134171618254492 0.90127402934125711 -4.5310105209346911 1.9134171618254492 2.8287983324364e-16 -4.6197782648938777 1.9134171618254492 -0.90127402934125656 -4.5310105209346911 1.9134171618254492 -1.7679126031752277 -4.2681185836759594 1.9134171618254492 -2.5666112871259839 -3.8412052428350387 1.9134171618254492 -3.266676538684683 -3.2666765386846834 1.9134171618254492 -3.8412052428350383 -2.5666112871259852 1.9134171618254492 -4.2681185836759594 -1.7679126031752284 1.9134171618254492 -4.5310105209346911 -0.90127402934125833 1.9134171618254492 -4.6197782648938777 -5.6575966648728e-16 1.9134171618254492 -4.5310105209346911 0.90127402934125733 1.9134171618254492 -4.2681185836759594 1.7679126031752275 1.9134171618254492 -3.8412052428350387 2.5666112871259839 1.9134171618254492 -3.2666765386846839 3.266676538684683 1.9134171618254492 -2.5666112871259852 3.8412052428350374 1.9134171618254492 -1.7679126031752306 4.2681185836759576 1.9134171618254492 -0.90127402934125878 4.5310105209346903 1.9134171618254492 -8.4863949973092005e-16 4.6197782648938777 1.9134171618254492 0.901274029341257 4.5310105209346911 1.9134171618254492 1.767912603175229 4.2681185836759585 1.9134171618254492 2.5666112871259834 3.8412052428350392 1.9134171618254492 3.266676538684683 3.2666765386846839 1.9134171618254492 3.8412052428350374 2.5666112871259852 1.9134171618254492 4.2681185836759576 1.7679126031752308 1.9134171618254492 4.5310105209346903 0.901274029341259 1.9134171618254492 4.904022475614136 0 0.97545161008064152 4.809793058848955 -0.95672732394189219 0.97545161008064152 4.5307259921952312 -1.8766881533635624 0.97545161008064152 4.0775456665218535 -2.7245289095103118 0.97545161008064152 3.4676675475979963 -3.4676675475979954 0.97545161008064152 2.7245289095103122 -4.0775456665218535 0.97545161008064152 1.8766881533635627 -4.5307259921952312 0.97545161008064152 0.95672732394189253 -4.809793058848955 0.97545161008064152 3.0028477138537652e-16 -4.904022475614136 0.97545161008064152 -0.95672732394189197 -4.809793058848955 0.97545161008064152 -1.876688153363562 -4.5307259921952312 0.97545161008064152 -2.7245289095103109 -4.0775456665218552 0.97545161008064152 -3.4676675475979954 -3.4676675475979963 0.97545161008064152 -4.0775456665218544 -2.7245289095103118 0.97545161008064152 -4.5307259921952312 -1.8766881533635627 0.97545161008064152 -4.809793058848955 -0.95672732394189386 0.97545161008064152 -4.904022475614136 -6.0056954277075304e-16 0.97545161008064152 -4.809793058848955 0.95672732394189275 0.97545161008064152 -4.5307259921952312 1.8766881533635618 0.97545161008064152 -4.0775456665218552 2.7245289095103109 0.97545161008064152 -3.4676675475979968 3.4676675475979954 0.97545161008064152 -2.7245289095103118 4.0775456665218535 0.97545161008064152 -1.8766881533635651 4.5307259921952303 0.97545161008064152 -0.9567273239418943 4.8097930588489541 0.97545161008064152 -9.008543141561295e-16 4.904022475614136 0.97545161008064152 0.9567273239418923 4.809793058848955 0.97545161008064152 1.8766881533635635 4.5307259921952303 0.97545161008064152 2.72452890951031 4.0775456665218552 0.97545161008064152 3.4676675475979954 3.4676675475979968 0.97545161008064152 4.0775456665218535 2.7245289095103118 0.97545161008064152 4.5307259921952303 1.8766881533635653 0.97545161008064152 4.8097930588489541 0.95672732394189453 0.97545161008064152 5 0 3.0616169978683831e-16 4.9039264020161522 -0.97545161008064118 3.0616169978683831e-16 4.6193976625564339 -1.913417161825449 3.0616169978683831e-16 4.1573480615127263 -2.7778511650980109 3.0616169978683831e-16 3.5355339059327378 -3.5355339059327373 3.0616169978683831e-16 2.7778511650980113 -4.1573480615127254 3.0616169978683831e-16 1.9134171618254492 -4.6193976625564339 3.0616169978683831e-16 0.97545161008064152 -4.9039264020161522 3.0616169978683831e-16 3.0616169978683831e-16 -5 3.0616169978683831e-16 -0.97545161008064096 -4.9039264020161522 3.0616169978683831e-16 -1.9134171618254485 -4.6193976625564339 3.0616169978683831e-16 -2.77785116509801 -4.1573480615127272 3.0616169978683831e-16 -3.5355339059327373 -3.5355339059327378 3.0616169978683831e-16 -4.1573480615127263 -2.7778511650980109 3.0616169978683831e-16 -4.6193976625564339 -1.9134171618254492 3.0616169978683831e-16 -4.9039264020161522 -0.97545161008064296 3.0616169978683831e-16 -5 -6.1232339957367663e-16 3.0616169978683831e-16 -4.9039264020161522 0.97545161008064185 3.0616169978683831e-16 -4.6193976625564339 1.9134171618254483 3.0616169978683831e-16 -4.1573480615127272 2.77785116509801 3.0616169978683831e-16 -3.5355339059327386 3.5355339059327373 3.0616169978683831e-16 -2.7778511650980109 4.1573480615127263 3.0616169978683831e-16 -1.9134171618254516 4.6193976625564321 3.0616169978683831e-16 -0.97545161008064329 4.9039264020161513 3.0616169978683831e-16 -9.1848509936051479e-16 5 3.0616169978683831e-16 0.97545161008064141 4.9039264020161522 3.0616169978683831e-16 1.9134171618254501 4.619397662556433 3.0616169978683831e-16 2.7778511650980091 4.1573480615127281 3.0616169978683831e-16 3.5355339059327373 3.5355339059327386 3.0616169978683831e-16 4.1573480615127263 2.7778511650980109 3.0616169978683831e-16 4.6193976625564321 1.9134171618254521 3.0616169978683831e-16 4.9039264020161513 0.97545161008064363 3.0616169978683831e-16 4.904022475614136 0 -0.97545161008064096 4.809793058848955 -0.95672732394189219 -0.97545161008064096 4.5307259921952312 -1.8766881533635624 -0.97545161008064096 4.0775456665218535 -2.7245289095103118 -0.97545161008064096 3.4676675475979963 -3.4676675475979954 -0.97545161008064096 2.7245289095103122 -4.0775456665218535 -0.97545161008064096 1.8766881533635627 -4.5307259921952312 -0.97545161008064096 0.95672732394189253 -4.809793058848955 -0.97545161008064096 3.0028477138537652e-16 -4.904022475614136 -0.97545161008064096 -0.95672732394189197 -4.809793058848955 -0.97545161008064096 -1.876688153363562 -4.5307259921952312 -0.97545161008064096 -2.7245289095103109 -4.0775456665218552 -0.97545161008064096 -3.4676675475979954 -3.4676675475979963 -0.97545161008064096 -4.0775456665218544 -2.7245289095103118 -0.97545161008064096 -4.5307259921952312 -1.8766881533635627 -0.97545161008064096 -4.809793058848955 -0.95672732394189386 -0.97545161008064096 -4.904022475614136 -6.0056954277075304e-16 -0.97545161008064096 -4.809793058848955 0.95672732394189275 -0.97545161008064096 -4.5307259921952312 1.8766881533635618 -0.97545161008064096 -4.0775456665218552 2.7245289095103109 -0.97545161008064096 -3.4676675475979968 3.4676675475979954 -0.97545161008064096 -2.7245289095103118 4.0775456665218535 -0.97545161008064096 -1.8766881533635651 4.5307259921952303 -0.97545161008064096 -0.9567273239418943 4.8097930588489541 -0.97545161008064096 -9.008543141561295e-16 4.904022475614136 -0.97545161008064096 0.9567273239418923 4.809793058848955 -0.97545161008064096 1.8766881533635635 4.5307259921952303 -0.97545161008064096 2.72452890951031 4.0775456665218552 -0.97545161008064096 3.4676675475979954 3.4676675475979968 -0.97545161008064096 4.0775456665218535 2.7245289095103118 -0.97545161008064096 4.5307259921952303 1.8766881533635653 -0.97545161008064096 4.8097930588489541 0.95672732394189453 -0.97545161008064096 4.6197782648938777 0 -1.9134171618254485 4.5310105209346911 -0.90127402934125678 -1.9134171618254485 4.2681185836759594 -1.7679126031752281 -1.9134171618254485 3.8412052428350374 -2.5666112871259852 -1.9134171618254485 3.2666765386846834 -3.266676538684683 -1.9134171618254485 2.5666112871259856 -3.8412052428350369 -1.9134171618254485 1.7679126031752284 -4.2681185836759594 -1.9134171618254485 0.90127402934125711 -4.5310105209346911 -1.9134171618254485 2.8287983324364e-16 -4.6197782648938777 -1.9134171618254485 -0.90127402934125656 -4.5310105209346911 -1.9134171618254485 -1.7679126031752277 -4.2681185836759594 -1.9134171618254485 -2.5666112871259839 -3.8412052428350387 -1.9134171618254485 -3.266676538684683 -3.2666765386846834 -1.9134171618254485 -3.8412052428350383 -2.5666112871259852 -1.9134171618254485 -4.2681185836759594 -1.7679126031752284 -1.9134171618254485 -4.5310105209346911 -0.90127402934125833 -1.9134171618254485 -4.6197782648938777 -5.6575966648728e-16 -1.9134171618254485 -4.5310105209346911 0.90127402934125733 -1.9134171618254485 -4.2681185836759594 1.7679126031752275 -1.9134171618254485 -3.8412052428350387 2.5666112871259839 -1.9134171618254485 -3.2666765386846839 3.266676538684683 -1.9134171618254485 -2.5666112871259852 3.8412052428350374 -1.9134171618254485 -1.7679126031752306 4.2681185836759576 -1.9134171618254485 -0.90127402934125878 4.5310105209346903 -1.9134171618254485 -8.4863949973092005e-16 4.6197782648938777 -1.9134171618254485 0.901274029341257 4.5310105209346911 -1.9134171618254485 1.767912603175229 4.2681185836759585 -1.9134171618254485 2.5666112871259834 3.8412052428350392 -1.9134171618254485 3.266676538684683 3.2666765386846839 -1.9134171618254485 3.8412052428350374 2.5666112871259852 -1.9134171618254485 4.2681185836759576 1.7679126031752308 -1.9134171618254485 4.5310105209346903 0.901274029341259 -1.9134171618254485 4.1581907134512148 0 -2.77785116509801 4.0782922448623582 -0.81122276529167159 -2.77785116509801 3.8416672924360822 -1.5912706946521524 -2.77785116509801 3.4574092203933255 -2.3101669836120373 -2.77785116509801 2.9402848509482822 -2.9402848509482817 -2.77785116509801 2.3101669836120378 -3.4574092203933251 -2.77785116509801 1.5912706946521527 -3.8416672924360822 -2.77785116509801 0.81122276529167181 -4.0782922448623582 -2.77785116509801 2.5461574737361394e-16 -4.1581907134512148 -2.77785116509801 -0.81122276529167137 -4.0782922448623582 -2.77785116509801 -1.5912706946521522 -3.8416672924360822 -2.77785116509801 -2.3101669836120364 -3.4574092203933264 -2.77785116509801 -2.9402848509482817 -2.9402848509482822 -2.77785116509801 -3.457409220393326 -2.3101669836120373 -2.77785116509801 -3.8416672924360822 -1.5912706946521527 -2.77785116509801 -4.0782922448623582 -0.81122276529167292 -2.77785116509801 -4.1581907134512148 -5.0923149474722788e-16 -2.77785116509801 -4.0782922448623582 0.81122276529167203 -2.77785116509801 -3.8416672924360822 1.591270694652152 -2.77785116509801 -3.4574092203933264 2.3101669836120364 -2.77785116509801 -2.9402848509482826 2.9402848509482817 -2.77785116509801 -2.3101669836120373 3.4574092203933255 -2.77785116509801 -1.5912706946521546 3.8416672924360813 -2.77785116509801 -0.81122276529167325 4.0782922448623582 -2.77785116509801 -7.6384724212084188e-16 4.1581907134512148 -2.77785116509801 0.8112227652916717 4.0782922448623582 -2.77785116509801 1.5912706946521533 3.8416672924360817 -2.77785116509801 2.310166983612036 3.4574092203933269 -2.77785116509801 2.9402848509482817 2.9402848509482826 -2.77785116509801 3.4574092203933255 2.3101669836120373 -2.77785116509801 3.8416672924360813 1.5912706946521549 -2.77785116509801 4.0782922448623582 0.81122276529167348 -2.77785116509801 3.536998372026805 0 -3.5355339059327373 3.4690359400940793 -0.69003415136923074 -3.5355339059327373 3.2677604024413069 -1.3535506772769526 -3.5355339059327373 2.9409066651038613 -1.9650510097368856 -3.5355339059327373 2.5010355339059331 -2.5010355339059327 -3.5355339059327373 1.9650510097368861 -2.9409066651038609 -3.5355339059327373 1.3535506772769528 -3.2677604024413069 -3.5355339059327373 0.69003415136923096 -3.4690359400940793 -3.5355339059327373 2.1657868674460129e-16 -3.536998372026805 -3.5355339059327373 -0.69003415136923052 -3.4690359400940793 -3.5355339059327373 -1.3535506772769523 -3.2677604024413069 -3.5355339059327373 -1.9650510097368847 -2.9409066651038618 -3.5355339059327373 -2.5010355339059327 -2.5010355339059331 -3.5355339059327373 -2.9409066651038618 -1.9650510097368856 -3.5355339059327373 -3.2677604024413069 -1.3535506772769528 -3.5355339059327373 -3.4690359400940793 -0.69003415136923196 -3.5355339059327373 -3.536998372026805 -4.3315737348920259e-16 -3.5355339059327373 -3.4690359400940793 0.69003415136923119 -3.5355339059327373 -3.2677604024413069 1.3535506772769521 -3.5355339059327373 -2.9409066651038618 1.9650510097368847 -3.5355339059327373 -2.5010355339059336 2.5010355339059327 -3.5355339059327373 -1.9650510097368856 2.9409066651038613 -3.5355339059327373 -1.3535506772769546 3.2677604024413061 -3.5355339059327373 -0.6900341513692323 3.4690359400940789 -3.5355339059327373 -6.4973606023380388e-16 3.536998372026805 -3.5355339059327373 0.69003415136923085 3.4690359400940793 -3.5355339059327373 1.3535506772769532 3.2677604024413065 -3.5355339059327373 1.9650510097368845 2.9409066651038622 -3.5355339059327373 2.5010355339059327 2.5010355339059336 -3.5355339059327373 2.9409066651038613 1.9650510097368856 -3.5355339059327373 3.2677604024413061 1.3535506772769546 -3.5355339059327373 3.4690359400940789 0.69003415136923241 -3.5355339059327373 2.7800733139329128 0 -4.1573480615127263 2.7266549847472299 -0.54236539804361672 -4.1573480615127263 2.5684528336234433 -1.0638879980024369 -4.1573480615127263 2.3115464805084511 -1.5445259788332859 -4.1573480615127263 1.9658086924777203 -1.9658086924777201 -4.1573480615127263 1.5445259788332864 -2.3115464805084507 -4.1573480615127263 1.0638879980024369 -2.5684528336234433 -4.1573480615127263 0.54236539804361694 -2.7266549847472299 -4.1573480615127263 1.7023039426514583e-16 -2.7800733139329128 -4.1573480615127263 -0.54236539804361661 -2.7266549847472299 -4.1573480615127263 -1.0638879980024367 -2.5684528336234433 -4.1573480615127263 -1.5445259788332855 -2.3115464805084516 -4.1573480615127263 -1.9658086924777201 -1.9658086924777203 -4.1573480615127263 -2.3115464805084516 -1.5445259788332859 -4.1573480615127263 -2.5684528336234433 -1.0638879980024369 -4.1573480615127263 -2.7266549847472299 -0.54236539804361772 -4.1573480615127263 -2.7800733139329128 -3.4046078853029166e-16 -4.1573480615127263 -2.7266549847472299 0.54236539804361705 -4.1573480615127263 -2.5684528336234433 1.0638879980024365 -4.1573480615127263 -2.3115464805084516 1.5445259788332855 -4.1573480615127263 -1.9658086924777207 1.9658086924777201 -4.1573480615127263 -1.5445259788332859 2.3115464805084511 -4.1573480615127263 -1.0638879980024385 2.5684528336234425 -4.1573480615127263 -0.54236539804361794 2.7266549847472294 -4.1573480615127263 -5.1069118279543739e-16 2.7800733139329128 -4.1573480615127263 0.54236539804361683 2.7266549847472299 -4.1573480615127263 1.0638879980024374 2.5684528336234429 -4.1573480615127263 1.544525978833285 2.311546480508452 -4.1573480615127263 1.9658086924777201 1.9658086924777207 -4.1573480615127263 2.3115464805084511 1.5445259788332859 -4.1573480615127263 2.5684528336234425 1.0638879980024385 -4.1573480615127263 2.7266549847472294 0.54236539804361805 -4.1573480615127263 1.9165037446636237 0 -4.6193976625564339 1.8796786626037534 -0.37389133269154196 -4.6193976625564339 1.7706185836759591 -0.73341423114842319 -4.6193976625564339 1.5935146255518393 -1.0647524320057096 -4.6193976625564339 1.3551727940210601 -1.3551727940210598 -4.6193976625564339 1.0647524320057098 -1.5935146255518391 -4.6193976625564339 0.7334142311484233 -1.7706185836759591 -4.6193976625564339 0.37389133269154207 -1.8796786626037534 -4.6193976625564339 1.1735200882281115e-16 -1.9165037446636237 -4.6193976625564339 -0.3738913326915419 -1.8796786626037534 -4.6193976625564339 -0.73341423114842308 -1.7706185836759591 -4.6193976625564339 -1.0647524320057091 -1.5935146255518398 -4.6193976625564339 -1.3551727940210598 -1.3551727940210601 -4.6193976625564339 -1.5935146255518395 -1.0647524320057096 -4.6193976625564339 -1.7706185836759591 -0.7334142311484233 -4.6193976625564339 -1.8796786626037534 -0.37389133269154262 -4.6193976625564339 -1.9165037446636237 -2.3470401764562231e-16 -4.6193976625564339 -1.8796786626037534 0.37389133269154218 -4.6193976625564339 -1.7706185836759591 0.73341423114842297 -4.6193976625564339 -1.5935146255518398 1.0647524320057091 -4.6193976625564339 -1.3551727940210603 1.3551727940210598 -4.6193976625564339 -1.0647524320057096 1.5935146255518393 -4.6193976625564339 -0.73341423114842419 1.7706185836759587 -4.6193976625564339 -0.37389133269154279 1.8796786626037532 -4.6193976625564339 -3.5205602646843344e-16 1.9165037446636237 -4.6193976625564339 0.37389133269154201 1.8796786626037534 -4.6193976625564339 0.73341423114842352 1.7706185836759589 -4.6193976625564339 1.0647524320057089 1.59351462555184 -4.6193976625564339 1.3551727940210598 1.3551727940210603 -4.6193976625564339 1.5935146255518393 1.0647524320057096 -4.6193976625564339 1.7706185836759587 0.7334142311484243 -4.6193976625564339 1.8796786626037532 0.3738913326915429 -4.6193976625564339 0.97947615847056235 0 -4.9039264020161522 0.96065579873382945 -0.19108631916314228 -4.9039264020161522 0.9049179753937342 -0.37482929824328742 -4.9039264020161522 0.81440466174310489 -0.54416779759863509 -4.9039264020161522 0.6925942336650841 -0.69259423366508399 -4.9039264020161522 0.54416779759863521 -0.81440466174310477 -4.9039264020161522 0.37482929824328748 -0.9049179753937342 -4.9039264020161522 0.19108631916314234 -0.96065579873382945 -4.9039264020161522 5.9975617115605994e-17 -0.97947615847056235 -4.9039264020161522 -0.19108631916314223 -0.96065579873382945 -4.9039264020161522 -0.37482929824328737 -0.9049179753937342 -4.9039264020161522 -0.54416779759863487 -0.81440466174310511 -4.9039264020161522 -0.69259423366508399 -0.6925942336650841 -4.9039264020161522 -0.814404661743105 -0.54416779759863509 -4.9039264020161522 -0.9049179753937342 -0.37482929824328748 -4.9039264020161522 -0.96065579873382945 -0.19108631916314259 -4.9039264020161522 -0.97947615847056235 -1.1995123423121199e-16 -4.9039264020161522 -0.96065579873382945 0.19108631916314239 -4.9039264020161522 -0.9049179753937342 0.37482929824328731 -4.9039264020161522 -0.81440466174310511 0.54416779759863487 -4.9039264020161522 -0.69259423366508421 0.69259423366508399 -4.9039264020161522 -0.54416779759863509 0.81440466174310489 -4.9039264020161522 -0.37482929824328798 0.90491797539373398 -4.9039264020161522 -0.19108631916314267 0.96065579873382934 -4.9039264020161522 -1.7992685134681798e-16 0.97947615847056235 -4.9039264020161522 0.19108631916314231 0.96065579873382945 -4.9039264020161522 0.37482929824328765 0.90491797539373409 -4.9039264020161522 0.54416779759863476 0.81440466174310522 -4.9039264020161522 0.69259423366508399 0.69259423366508421 -4.9039264020161522 0.81440466174310489 0.54416779759863509 -4.9039264020161522 0.90491797539373398 0.37482929824328803 -4.9039264020161522 0.96065579873382934 0.19108631916314273 -4.9039264020161522 0 0 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1891 1888 1893 1894 1895 1892 1897 1898 1899 1896 1901 1902 1903 1900 1905 1906 1907 1904 1909 1910 1911 1908 1913 1914 1915 1912 1917 1918 1919 1916</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1900 1904 1908 1912 1916</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">3 2 1 0 5 4 3 0 7 6 5 0 9 8 7 0 11 10 9 0 13 12 11 0 15 14 13 0 17 16 15 0 19 18 17 0 21 20 19 0 23 22 21 0 25 24 23 0 27 26 25 0 29 28 27 0 31 30 29 0 1 32 31 0 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 32 64 63 32 1 33 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 64 96 95 64 33 65 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 96 128 127 96 65 97 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 128 160 159 128 97 129 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 160 192 191 160 129 161 192 161 162 194 193 162 163 195 194 163 164 196 195 164 165 197 196 165 166 198 197 166 167 199 198 167 168 200 199 168 169 201 200 169 170 202 201 170 171 203 202 171 172 204 203 172 173 205 204 173 174 206 205 174 175 207 206 175 176 208 207 176 177 209 208 177 178 210 209 178 179 211 210 179 180 212 211 180 181 213 212 181 182 214 213 182 183 215 214 183 184 216 215 184 185 217 216 185 186 218 217 186 187 219 218 187 188 220 219 188 189 221 220 189 190 222 221 190 191 223 222 191 192 224 223 192 161 193 224 193 194 226 225 194 195 227 226 195 196 228 227 196 197 229 228 197 198 230 229 198 199 231 230 199 200 232 231 200 201 233 232 201 202 234 233 202 203 235 234 203 204 236 235 204 205 237 236 205 206 238 237 206 207 239 238 207 208 240 239 208 209 241 240 209 210 242 241 210 211 243 242 211 212 244 243 212 213 245 244 213 214 246 245 214 215 247 246 215 216 248 247 216 217 249 248 217 218 250 249 218 219 251 250 219 220 252 251 220 221 253 252 221 222 254 253 222 223 255 254 223 224 256 255 224 193 225 256 225 226 258 257 226 227 259 258 227 228 260 259 228 229 261 260 229 230 262 261 230 231 263 262 231 232 264 263 232 233 265 264 233 234 266 265 234 235 267 266 235 236 268 267 236 237 269 268 237 238 270 269 238 239 271 270 239 240 272 271 240 241 273 272 241 242 274 273 242 243 275 274 243 244 276 275 244 245 277 276 245 246 278 277 246 247 279 278 247 248 280 279 248 249 281 280 249 250 282 281 250 251 283 282 251 252 284 283 252 253 285 284 253 254 286 285 254 255 287 286 255 256 288 287 256 225 257 288 257 258 290 289 258 259 291 290 259 260 292 291 260 261 293 292 261 262 294 293 262 263 295 294 263 264 296 295 264 265 297 296 265 266 298 297 266 267 299 298 267 268 300 299 268 269 301 300 269 270 302 301 270 271 303 302 271 272 304 303 272 273 305 304 273 274 306 305 274 275 307 306 275 276 308 307 276 277 309 308 277 278 310 309 278 279 311 310 279 280 312 311 280 281 313 312 281 282 314 313 282 283 315 314 283 284 316 315 284 285 317 316 285 286 318 317 286 287 319 318 287 288 320 319 288 257 289 320 289 290 322 321 290 291 323 322 291 292 324 323 292 293 325 324 293 294 326 325 294 295 327 326 295 296 328 327 296 297 329 328 297 298 330 329 298 299 331 330 299 300 332 331 300 301 333 332 301 302 334 333 302 303 335 334 303 304 336 335 304 305 337 336 305 306 338 337 306 307 339 338 307 308 340 339 308 309 341 340 309 310 342 341 310 311 343 342 311 312 344 343 312 313 345 344 313 314 346 345 314 315 347 346 315 316 348 347 316 317 349 348 317 318 350 349 318 319 351 350 319 320 352 351 320 289 321 352 321 322 354 353 322 323 355 354 323 324 356 355 324 325 357 356 325 326 358 357 326 327 359 358 327 328 360 359 328 329 361 360 329 330 362 361 330 331 363 362 331 332 364 363 332 333 365 364 333 334 366 365 334 335 367 366 335 336 368 367 336 337 369 368 337 338 370 369 338 339 371 370 339 340 372 371 340 341 373 372 341 342 374 373 342 343 375 374 343 344 376 375 344 345 377 376 345 346 378 377 346 347 379 378 347 348 380 379 348 349 381 380 349 350 382 381 350 351 383 382 351 352 384 383 352 321 353 384 353 354 386 385 354 355 387 386 355 356 388 387 356 357 389 388 357 358 390 389 358 359 391 390 359 360 392 391 360 361 393 392 361 362 394 393 362 363 395 394 363 364 396 395 364 365 397 396 365 366 398 397 366 367 399 398 367 368 400 399 368 369 401 400 369 370 402 401 370 371 403 402 371 372 404 403 372 373 405 404 373 374 406 405 374 375 407 406 375 376 408 407 376 377 409 408 377 378 410 409 378 379 411 410 379 380 412 411 380 381 413 412 381 382 414 413 382 383 415 414 383 384 416 415 384 353 385 416 385 386 418 417 386 387 419 418 387 388 420 419 388 389 421 420 389 390 422 421 390 391 423 422 391 392 424 423 392 393 425 424 393 394 426 425 394 395 427 426 395 396 428 427 396 397 429 428 397 398 430 429 398 399 431 430 399 400 432 431 400 401 433 432 401 402 434 433 402 403 435 434 403 404 436 435 404 405 437 436 405 406 438 437 406 407 439 438 407 408 440 439 408 409 441 440 409 410 442 441 410 411 443 442 411 412 444 443 412 413 445 444 413 414 446 445 414 415 447 446 415 416 448 447 416 385 417 448 417 418 450 449 418 419 451 450 419 420 452 451 420 421 453 452 421 422 454 453 422 423 455 454 423 424 456 455 424 425 457 456 425 426 458 457 426 427 459 458 427 428 460 459 428 429 461 460 429 430 462 461 430 431 463 462 431 432 464 463 432 433 465 464 433 434 466 465 434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 448 480 479 448 417 449 480 449 450 451 481 451 452 453 481 453 454 455 481 455 456 457 481 457 458 459 481 459 460 461 481 461 462 463 481 463 464 465 481 465 466 467 481 467 468 469 481 469 470 471 481 471 472 473 481 473 474 475 481 475 476 477 481 477 478 479 481 479 480 449 481\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolySphere.2.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 0 5 0.97947615847056058 0 4.9039264020161522 0.96065579873382767 -0.19108631916314192 4.9039264020161522 0.90491797539373253 -0.3748292982432867 4.9039264020161522 0.81440466174310333 -0.5441677975986341 4.9039264020161522 0.69259423366508288 -0.69259423366508277 4.9039264020161522 0.54416779759863421 -0.81440466174310333 4.9039264020161522 0.37482929824328676 -0.90491797539373253 4.9039264020161522 0.191086319163142 -0.96065579873382767 4.9039264020161522 5.9973636354029111e-17 -0.97947615847056058 4.9039264020161522 -0.19108631916314187 -0.96065579873382767 4.9039264020161522 -0.3748292982432867 -0.90491797539373253 4.9039264020161522 -0.54416779759863387 -0.81440466174310355 4.9039264020161522 -0.69259423366508277 -0.69259423366508288 4.9039264020161522 -0.81440466174310344 -0.5441677975986341 4.9039264020161522 -0.90491797539373253 -0.37482929824328681 4.9039264020161522 -0.96065579873382767 -0.19108631916314228 4.9039264020161522 -0.97947615847056058 -1.1994727270805822e-16 4.9039264020161522 -0.96065579873382767 0.19108631916314203 4.9039264020161522 -0.90491797539373264 0.37482929824328665 4.9039264020161522 -0.81440466174310355 0.54416779759863387 4.9039264020161522 -0.69259423366508299 0.69259423366508277 4.9039264020161522 -0.5441677975986341 0.81440466174310333 4.9039264020161522 -0.37482929824328726 0.90491797539373231 4.9039264020161522 -0.19108631916314234 0.96065579873382756 4.9039264020161522 -1.7992090906208733e-16 0.97947615847056058 4.9039264020161522 0.19108631916314198 0.96065579873382767 4.9039264020161522 0.37482929824328692 0.90491797539373242 4.9039264020161522 0.54416779759863376 0.81440466174310355 4.9039264020161522 0.69259423366508266 0.69259423366508299 4.9039264020161522 0.81440466174310333 0.5441677975986341 4.9039264020161522 0.90491797539373231 0.37482929824328731 4.9039264020161522 0.96065579873382756 0.19108631916314239 4.9039264020161522 1.9165037446636235 0 4.6193976625564339 1.8796786626037532 -0.37389133269154196 4.6193976625564339 1.7706185836759589 -0.73341423114842308 4.6193976625564339 1.5935146255518391 -1.0647524320057096 4.6193976625564339 1.3551727940210598 -1.3551727940210596 4.6193976625564339 1.0647524320057096 -1.5935146255518391 4.6193976625564339 0.73341423114842319 -1.7706185836759589 4.6193976625564339 0.37389133269154212 -1.8796786626037532 4.6193976625564339 1.173481331419726e-16 -1.9165037446636235 4.6193976625564339 -0.37389133269154184 -1.8796786626037532 4.6193976625564339 -0.73341423114842297 -1.7706185836759589 4.6193976625564339 -1.0647524320057091 -1.5935146255518395 4.6193976625564339 -1.3551727940210596 -1.3551727940210598 4.6193976625564339 -1.5935146255518393 -1.0647524320057096 4.6193976625564339 -1.7706185836759589 -0.7334142311484233 4.6193976625564339 -1.8796786626037532 -0.37389133269154262 4.6193976625564339 -1.9165037446636235 -2.3469626628394521e-16 4.6193976625564339 -1.8796786626037532 0.37389133269154218 4.6193976625564339 -1.7706185836759591 0.73341423114842286 4.6193976625564339 -1.5935146255518395 1.0647524320057091 4.6193976625564339 -1.3551727940210601 1.3551727940210596 4.6193976625564339 -1.0647524320057096 1.5935146255518391 4.6193976625564339 -0.73341423114842408 1.7706185836759585 4.6193976625564339 -0.37389133269154273 1.8796786626037529 4.6193976625564339 -3.5204439942591786e-16 1.9165037446636235 4.6193976625564339 0.37389133269154207 1.8796786626037532 4.6193976625564339 0.73341423114842352 1.7706185836759587 4.6193976625564339 1.0647524320057089 1.5935146255518395 4.6193976625564339 1.3551727940210594 1.3551727940210601 4.6193976625564339 1.5935146255518391 1.0647524320057096 4.6193976625564339 1.7706185836759585 0.73341423114842419 4.6193976625564339 1.8796786626037529 0.37389133269154284 4.6193976625564339 2.7800733139329128 0 4.1573480615127263 2.7266549847472299 -0.54236539804361672 4.1573480615127263 2.5684528336234433 -1.0638879980024369 4.1573480615127263 2.3115464805084511 -1.5445259788332859 4.1573480615127263 1.9658086924777203 -1.9658086924777201 4.1573480615127263 1.5445259788332864 -2.3115464805084511 4.1573480615127263 1.0638879980024369 -2.5684528336234433 4.1573480615127263 0.54236539804361694 -2.7266549847472299 4.1573480615127263 1.7022477221671387e-16 -2.7800733139329128 4.1573480615127263 -0.54236539804361661 -2.7266549847472299 4.1573480615127263 -1.0638879980024367 -2.5684528336234433 4.1573480615127263 -1.5445259788332855 -2.3115464805084516 4.1573480615127263 -1.9658086924777201 -1.9658086924777203 4.1573480615127263 -2.3115464805084516 -1.5445259788332859 4.1573480615127263 -2.5684528336234433 -1.0638879980024372 4.1573480615127263 -2.7266549847472299 -0.54236539804361772 4.1573480615127263 -2.7800733139329128 -3.4044954443342775e-16 4.1573480615127263 -2.7266549847472299 0.54236539804361705 4.1573480615127263 -2.5684528336234433 1.0638879980024365 4.1573480615127263 -2.3115464805084516 1.5445259788332855 4.1573480615127263 -1.9658086924777207 1.9658086924777201 4.1573480615127263 -1.5445259788332859 2.3115464805084511 4.1573480615127263 -1.0638879980024385 2.5684528336234425 4.1573480615127263 -0.54236539804361794 2.7266549847472294 4.1573480615127263 -5.1067431665014159e-16 2.7800733139329128 4.1573480615127263 0.54236539804361694 2.7266549847472299 4.1573480615127263 1.0638879980024374 2.5684528336234429 4.1573480615127263 1.544525978833285 2.3115464805084516 4.1573480615127263 1.9658086924777198 1.9658086924777207 4.1573480615127263 2.3115464805084511 1.5445259788332859 4.1573480615127263 2.5684528336234425 1.0638879980024385 4.1573480615127263 2.7266549847472294 0.54236539804361805 4.1573480615127263 3.5369983720268046 0 3.5355339059327378 3.4690359400940789 -0.69003415136923063 3.5355339059327378 3.2677604024413065 -1.3535506772769523 3.5355339059327378 2.9409066651038609 -1.9650510097368854 3.5355339059327378 2.5010355339059327 -2.5010355339059323 3.5355339059327378 1.9650510097368858 -2.9409066651038609 3.5355339059327378 1.3535506772769526 -3.2677604024413065 3.5355339059327378 0.69003415136923096 -3.4690359400940789 3.5355339059327378 2.1657153399217148e-16 -3.5369983720268046 3.5355339059327378 -0.69003415136923052 -3.4690359400940789 3.5355339059327378 -1.3535506772769521 -3.2677604024413065 3.5355339059327378 -1.9650510097368845 -2.9409066651038618 3.5355339059327378 -2.5010355339059323 -2.5010355339059327 3.5355339059327378 -2.9409066651038613 -1.9650510097368854 3.5355339059327378 -3.2677604024413065 -1.3535506772769528 3.5355339059327378 -3.4690359400940789 -0.69003415136923196 3.5355339059327378 -3.5369983720268046 -4.3314306798434296e-16 3.5355339059327378 -3.4690359400940789 0.69003415136923107 3.5355339059327378 -3.2677604024413069 1.3535506772769519 3.5355339059327378 -2.9409066651038618 1.9650510097368845 3.5355339059327378 -2.5010355339059331 2.5010355339059323 3.5355339059327378 -1.9650510097368854 2.9409066651038609 3.5355339059327378 -1.3535506772769543 3.2677604024413056 3.5355339059327378 -0.69003415136923218 3.4690359400940785 3.5355339059327378 -6.4971460197651439e-16 3.5369983720268046 3.5355339059327378 0.69003415136923085 3.4690359400940789 3.5355339059327378 1.3535506772769532 3.2677604024413061 3.5355339059327378 1.9650510097368843 2.9409066651038618 3.5355339059327378 2.5010355339059318 2.5010355339059331 3.5355339059327378 2.9409066651038609 1.9650510097368854 3.5355339059327378 3.2677604024413056 1.3535506772769546 3.5355339059327378 3.4690359400940785 0.6900341513692323 3.5355339059327378 4.158190713451213 0 2.7778511650980113 4.0782922448623564 -0.81122276529167126 2.7778511650980113 3.8416672924360804 -1.5912706946521518 2.7778511650980113 3.4574092203933242 -2.3101669836120364 2.7778511650980113 2.9402848509482808 -2.9402848509482804 2.7778511650980113 2.3101669836120369 -3.4574092203933242 2.7778511650980113 1.591270694652152 -3.8416672924360804 2.7778511650980113 0.81122276529167159 -4.0782922448623564 2.7778511650980113 2.5460733840487798e-16 -4.158190713451213 2.7778511650980113 -0.81122276529167103 -4.0782922448623564 2.7778511650980113 -1.5912706946521515 -3.8416672924360804 2.7778511650980113 -2.3101669836120355 -3.4574092203933251 2.7778511650980113 -2.9402848509482804 -2.9402848509482808 2.7778511650980113 -3.4574092203933247 -2.3101669836120364 2.7778511650980113 -3.8416672924360804 -1.5912706946521522 2.7778511650980113 -4.0782922448623564 -0.8112227652916727 2.7778511650980113 -4.158190713451213 -5.0921467680975597e-16 2.7778511650980113 -4.0782922448623564 0.8112227652916717 2.7778511650980113 -3.8416672924360808 1.5912706946521513 2.7778511650980113 -3.4574092203933251 2.3101669836120355 2.7778511650980113 -2.9402848509482813 2.9402848509482804 2.7778511650980113 -2.3101669836120364 3.4574092203933242 2.7778511650980113 -1.591270694652154 3.8416672924360795 2.7778511650980113 -0.81122276529167292 4.0782922448623564 2.7778511650980113 -7.6382201521463395e-16 4.158190713451213 2.7778511650980113 0.81122276529167148 4.0782922448623564 2.7778511650980113 1.5912706946521527 3.84166729243608 2.7778511650980113 2.3101669836120351 3.4574092203933251 2.7778511650980113 2.94028485094828 2.9402848509482813 2.7778511650980113 3.4574092203933242 2.3101669836120364 2.7778511650980113 3.8416672924360795 1.5912706946521542 2.7778511650980113 4.0782922448623564 0.81122276529167314 2.7778511650980113 4.6197782648938777 0 1.9134171618254492 4.5310105209346911 -0.90127402934125678 1.9134171618254492 4.2681185836759594 -1.7679126031752281 1.9134171618254492 3.8412052428350374 -2.5666112871259852 1.9134171618254492 3.2666765386846834 -3.266676538684683 1.9134171618254492 2.5666112871259856 -3.8412052428350374 1.9134171618254492 1.7679126031752284 -4.2681185836759594 1.9134171618254492 0.90127402934125722 -4.5310105209346911 1.9134171618254492 2.8287049082197799e-16 -4.6197782648938777 1.9134171618254492 -0.90127402934125656 -4.5310105209346911 1.9134171618254492 -1.7679126031752277 -4.2681185836759594 1.9134171618254492 -2.5666112871259839 -3.8412052428350387 1.9134171618254492 -3.266676538684683 -3.2666765386846834 1.9134171618254492 -3.8412052428350383 -2.5666112871259852 1.9134171618254492 -4.2681185836759594 -1.7679126031752286 1.9134171618254492 -4.5310105209346911 -0.90127402934125844 1.9134171618254492 -4.6197782648938777 -5.6574098164395597e-16 1.9134171618254492 -4.5310105209346911 0.90127402934125733 1.9134171618254492 -4.2681185836759594 1.7679126031752275 1.9134171618254492 -3.8412052428350387 2.5666112871259839 1.9134171618254492 -3.2666765386846839 3.266676538684683 1.9134171618254492 -2.5666112871259852 3.8412052428350374 1.9134171618254492 -1.7679126031752306 4.2681185836759576 1.9134171618254492 -0.90127402934125878 4.5310105209346903 1.9134171618254492 -8.4861147246593396e-16 4.6197782648938777 1.9134171618254492 0.90127402934125711 4.5310105209346911 1.9134171618254492 1.767912603175229 4.2681185836759585 1.9134171618254492 2.5666112871259834 3.8412052428350387 1.9134171618254492 3.2666765386846826 3.2666765386846839 1.9134171618254492 3.8412052428350374 2.5666112871259852 1.9134171618254492 4.2681185836759576 1.7679126031752308 1.9134171618254492 4.5310105209346903 0.901274029341259 1.9134171618254492 4.904022475614136 0 0.97545161008064163 4.809793058848955 -0.95672732394189219 0.97545161008064163 4.5307259921952312 -1.8766881533635624 0.97545161008064163 4.0775456665218535 -2.7245289095103118 0.97545161008064163 3.4676675475979963 -3.4676675475979954 0.97545161008064163 2.7245289095103122 -4.0775456665218535 0.97545161008064163 1.8766881533635627 -4.5307259921952312 0.97545161008064163 0.95672732394189264 -4.809793058848955 0.97545161008064163 3.0027485414624075e-16 -4.904022475614136 0.97545161008064163 -0.95672732394189197 -4.809793058848955 0.97545161008064163 -1.876688153363562 -4.5307259921952312 0.97545161008064163 -2.7245289095103109 -4.0775456665218552 0.97545161008064163 -3.4676675475979954 -3.4676675475979963 0.97545161008064163 -4.0775456665218544 -2.7245289095103118 0.97545161008064163 -4.5307259921952312 -1.8766881533635629 0.97545161008064163 -4.809793058848955 -0.95672732394189397 0.97545161008064163 -4.904022475614136 -6.005497082924815e-16 0.97545161008064163 -4.809793058848955 0.95672732394189275 0.97545161008064163 -4.5307259921952312 1.8766881533635618 0.97545161008064163 -4.0775456665218552 2.7245289095103109 0.97545161008064163 -3.4676675475979968 3.4676675475979954 0.97545161008064163 -2.7245289095103118 4.0775456665218535 0.97545161008064163 -1.8766881533635651 4.5307259921952303 0.97545161008064163 -0.9567273239418943 4.8097930588489541 0.97545161008064163 -9.0082456243872235e-16 4.904022475614136 0.97545161008064163 0.95672732394189253 4.809793058848955 0.97545161008064163 1.8766881533635635 4.5307259921952303 0.97545161008064163 2.72452890951031 4.0775456665218552 0.97545161008064163 3.467667547597995 3.4676675475979968 0.97545161008064163 4.0775456665218535 2.7245289095103118 0.97545161008064163 4.5307259921952303 1.8766881533635653 0.97545161008064163 4.8097930588489541 0.95672732394189453 0.97545161008064163 5 0 3.0615158845559431e-16 4.9039264020161522 -0.97545161008064118 3.0615158845559431e-16 4.6193976625564339 -1.913417161825449 3.0615158845559431e-16 4.1573480615127263 -2.7778511650980109 3.0615158845559431e-16 3.5355339059327378 -3.5355339059327373 3.0615158845559431e-16 2.7778511650980113 -4.1573480615127263 3.0615158845559431e-16 1.9134171618254492 -4.6193976625564339 3.0615158845559431e-16 0.97545161008064163 -4.9039264020161522 3.0615158845559431e-16 3.0615158845559431e-16 -5 3.0615158845559431e-16 -0.97545161008064096 -4.9039264020161522 3.0615158845559431e-16 -1.9134171618254485 -4.6193976625564339 3.0615158845559431e-16 -2.77785116509801 -4.1573480615127272 3.0615158845559431e-16 -3.5355339059327373 -3.5355339059327378 3.0615158845559431e-16 -4.1573480615127263 -2.7778511650980109 3.0615158845559431e-16 -4.6193976625564339 -1.9134171618254494 3.0615158845559431e-16 -4.9039264020161522 -0.97545161008064307 3.0615158845559431e-16 -5 -6.1230317691118863e-16 3.0615158845559431e-16 -4.9039264020161522 0.97545161008064185 3.0615158845559431e-16 -4.6193976625564339 1.9134171618254483 3.0615158845559431e-16 -4.1573480615127272 2.77785116509801 3.0615158845559431e-16 -3.5355339059327386 3.5355339059327373 3.0615158845559431e-16 -2.7778511650980109 4.1573480615127263 3.0615158845559431e-16 -1.9134171618254516 4.6193976625564321 3.0615158845559431e-16 -0.97545161008064329 4.9039264020161513 3.0615158845559431e-16 -9.1845476536678294e-16 5 3.0615158845559431e-16 0.97545161008064152 4.9039264020161522 3.0615158845559431e-16 1.9134171618254501 4.619397662556433 3.0615158845559431e-16 2.7778511650980091 4.1573480615127272 3.0615158845559431e-16 3.5355339059327369 3.5355339059327386 3.0615158845559431e-16 4.1573480615127263 2.7778511650980109 3.0615158845559431e-16 4.6193976625564321 1.9134171618254521 3.0615158845559431e-16 4.9039264020161513 0.97545161008064363 3.0615158845559431e-16 4.904022475614136 0 -0.97545161008064096 4.809793058848955 -0.95672732394189219 -0.97545161008064096 4.5307259921952312 -1.8766881533635624 -0.97545161008064096 4.0775456665218535 -2.7245289095103118 -0.97545161008064096 3.4676675475979963 -3.4676675475979954 -0.97545161008064096 2.7245289095103122 -4.0775456665218535 -0.97545161008064096 1.8766881533635627 -4.5307259921952312 -0.97545161008064096 0.95672732394189264 -4.809793058848955 -0.97545161008064096 3.0027485414624075e-16 -4.904022475614136 -0.97545161008064096 -0.95672732394189197 -4.809793058848955 -0.97545161008064096 -1.876688153363562 -4.5307259921952312 -0.97545161008064096 -2.7245289095103109 -4.0775456665218552 -0.97545161008064096 -3.4676675475979954 -3.4676675475979963 -0.97545161008064096 -4.0775456665218544 -2.7245289095103118 -0.97545161008064096 -4.5307259921952312 -1.8766881533635629 -0.97545161008064096 -4.809793058848955 -0.95672732394189397 -0.97545161008064096 -4.904022475614136 -6.005497082924815e-16 -0.97545161008064096 -4.809793058848955 0.95672732394189275 -0.97545161008064096 -4.5307259921952312 1.8766881533635618 -0.97545161008064096 -4.0775456665218552 2.7245289095103109 -0.97545161008064096 -3.4676675475979968 3.4676675475979954 -0.97545161008064096 -2.7245289095103118 4.0775456665218535 -0.97545161008064096 -1.8766881533635651 4.5307259921952303 -0.97545161008064096 -0.9567273239418943 4.8097930588489541 -0.97545161008064096 -9.0082456243872235e-16 4.904022475614136 -0.97545161008064096 0.95672732394189253 4.809793058848955 -0.97545161008064096 1.8766881533635635 4.5307259921952303 -0.97545161008064096 2.72452890951031 4.0775456665218552 -0.97545161008064096 3.467667547597995 3.4676675475979968 -0.97545161008064096 4.0775456665218535 2.7245289095103118 -0.97545161008064096 4.5307259921952303 1.8766881533635653 -0.97545161008064096 4.8097930588489541 0.95672732394189453 -0.97545161008064096 4.6197782648938777 0 -1.9134171618254485 4.5310105209346911 -0.90127402934125678 -1.9134171618254485 4.2681185836759594 -1.7679126031752281 -1.9134171618254485 3.8412052428350374 -2.5666112871259852 -1.9134171618254485 3.2666765386846834 -3.266676538684683 -1.9134171618254485 2.5666112871259856 -3.8412052428350374 -1.9134171618254485 1.7679126031752284 -4.2681185836759594 -1.9134171618254485 0.90127402934125722 -4.5310105209346911 -1.9134171618254485 2.8287049082197799e-16 -4.6197782648938777 -1.9134171618254485 -0.90127402934125656 -4.5310105209346911 -1.9134171618254485 -1.7679126031752277 -4.2681185836759594 -1.9134171618254485 -2.5666112871259839 -3.8412052428350387 -1.9134171618254485 -3.266676538684683 -3.2666765386846834 -1.9134171618254485 -3.8412052428350383 -2.5666112871259852 -1.9134171618254485 -4.2681185836759594 -1.7679126031752286 -1.9134171618254485 -4.5310105209346911 -0.90127402934125844 -1.9134171618254485 -4.6197782648938777 -5.6574098164395597e-16 -1.9134171618254485 -4.5310105209346911 0.90127402934125733 -1.9134171618254485 -4.2681185836759594 1.7679126031752275 -1.9134171618254485 -3.8412052428350387 2.5666112871259839 -1.9134171618254485 -3.2666765386846839 3.266676538684683 -1.9134171618254485 -2.5666112871259852 3.8412052428350374 -1.9134171618254485 -1.7679126031752306 4.2681185836759576 -1.9134171618254485 -0.90127402934125878 4.5310105209346903 -1.9134171618254485 -8.4861147246593396e-16 4.6197782648938777 -1.9134171618254485 0.90127402934125711 4.5310105209346911 -1.9134171618254485 1.767912603175229 4.2681185836759585 -1.9134171618254485 2.5666112871259834 3.8412052428350387 -1.9134171618254485 3.2666765386846826 3.2666765386846839 -1.9134171618254485 3.8412052428350374 2.5666112871259852 -1.9134171618254485 4.2681185836759576 1.7679126031752308 -1.9134171618254485 4.5310105209346903 0.901274029341259 -1.9134171618254485 4.1581907134512148 0 -2.77785116509801 4.0782922448623582 -0.81122276529167159 -2.77785116509801 3.8416672924360822 -1.5912706946521524 -2.77785116509801 3.4574092203933255 -2.3101669836120373 -2.77785116509801 2.9402848509482822 -2.9402848509482817 -2.77785116509801 2.3101669836120378 -3.4574092203933255 -2.77785116509801 1.5912706946521527 -3.8416672924360822 -2.77785116509801 0.81122276529167192 -4.0782922448623582 -2.77785116509801 2.5460733840487808e-16 -4.1581907134512148 -2.77785116509801 -0.81122276529167137 -4.0782922448623582 -2.77785116509801 -1.5912706946521522 -3.8416672924360822 -2.77785116509801 -2.3101669836120364 -3.4574092203933264 -2.77785116509801 -2.9402848509482817 -2.9402848509482822 -2.77785116509801 -3.457409220393326 -2.3101669836120373 -2.77785116509801 -3.8416672924360822 -1.5912706946521529 -2.77785116509801 -4.0782922448623582 -0.81122276529167303 -2.77785116509801 -4.1581907134512148 -5.0921467680975617e-16 -2.77785116509801 -4.0782922448623582 0.81122276529167203 -2.77785116509801 -3.8416672924360826 1.591270694652152 -2.77785116509801 -3.4574092203933264 2.3101669836120364 -2.77785116509801 -2.9402848509482826 2.9402848509482817 -2.77785116509801 -2.3101669836120373 3.4574092203933255 -2.77785116509801 -1.5912706946521546 3.8416672924360813 -2.77785116509801 -0.81122276529167325 4.0782922448623582 -2.77785116509801 -7.6382201521463425e-16 4.1581907134512148 -2.77785116509801 0.81122276529167181 4.0782922448623582 -2.77785116509801 1.5912706946521533 3.8416672924360817 -2.77785116509801 2.310166983612036 3.4574092203933264 -2.77785116509801 2.9402848509482813 2.9402848509482826 -2.77785116509801 3.4574092203933255 2.3101669836120373 -2.77785116509801 3.8416672924360813 1.5912706946521549 -2.77785116509801 4.0782922448623582 0.81122276529167348 -2.77785116509801 3.536998372026805 0 -3.5355339059327373 3.4690359400940793 -0.69003415136923074 -3.5355339059327373 3.2677604024413069 -1.3535506772769526 -3.5355339059327373 2.9409066651038613 -1.9650510097368856 -3.5355339059327373 2.5010355339059331 -2.5010355339059327 -3.5355339059327373 1.9650510097368861 -2.9409066651038613 -3.5355339059327373 1.3535506772769528 -3.2677604024413069 -3.5355339059327373 0.69003415136923107 -3.4690359400940793 -3.5355339059327373 2.165715339921715e-16 -3.536998372026805 -3.5355339059327373 -0.69003415136923052 -3.4690359400940793 -3.5355339059327373 -1.3535506772769523 -3.2677604024413069 -3.5355339059327373 -1.9650510097368847 -2.9409066651038618 -3.5355339059327373 -2.5010355339059327 -2.5010355339059331 -3.5355339059327373 -2.9409066651038618 -1.9650510097368856 -3.5355339059327373 -3.2677604024413069 -1.353550677276953 -3.5355339059327373 -3.4690359400940793 -0.69003415136923207 -3.5355339059327373 -3.536998372026805 -4.3314306798434301e-16 -3.5355339059327373 -3.4690359400940793 0.69003415136923119 -3.5355339059327373 -3.2677604024413074 1.3535506772769521 -3.5355339059327373 -2.9409066651038618 1.9650510097368847 -3.5355339059327373 -2.5010355339059336 2.5010355339059327 -3.5355339059327373 -1.9650510097368856 2.9409066651038613 -3.5355339059327373 -1.3535506772769546 3.2677604024413061 -3.5355339059327373 -0.6900341513692323 3.4690359400940789 -3.5355339059327373 -6.4971460197651449e-16 3.536998372026805 -3.5355339059327373 0.69003415136923096 3.4690359400940793 -3.5355339059327373 1.3535506772769532 3.2677604024413065 -3.5355339059327373 1.9650510097368845 2.9409066651038618 -3.5355339059327373 2.5010355339059323 2.5010355339059336 -3.5355339059327373 2.9409066651038613 1.9650510097368856 -3.5355339059327373 3.2677604024413061 1.3535506772769546 -3.5355339059327373 3.4690359400940789 0.69003415136923241 -3.5355339059327373 2.7800733139329128 0 -4.1573480615127263 2.7266549847472299 -0.54236539804361672 -4.1573480615127263 2.5684528336234433 -1.0638879980024369 -4.1573480615127263 2.3115464805084511 -1.5445259788332859 -4.1573480615127263 1.9658086924777203 -1.9658086924777201 -4.1573480615127263 1.5445259788332864 -2.3115464805084511 -4.1573480615127263 1.0638879980024369 -2.5684528336234433 -4.1573480615127263 0.54236539804361694 -2.7266549847472299 -4.1573480615127263 1.7022477221671387e-16 -2.7800733139329128 -4.1573480615127263 -0.54236539804361661 -2.7266549847472299 -4.1573480615127263 -1.0638879980024367 -2.5684528336234433 -4.1573480615127263 -1.5445259788332855 -2.3115464805084516 -4.1573480615127263 -1.9658086924777201 -1.9658086924777203 -4.1573480615127263 -2.3115464805084516 -1.5445259788332859 -4.1573480615127263 -2.5684528336234433 -1.0638879980024372 -4.1573480615127263 -2.7266549847472299 -0.54236539804361772 -4.1573480615127263 -2.7800733139329128 -3.4044954443342775e-16 -4.1573480615127263 -2.7266549847472299 0.54236539804361705 -4.1573480615127263 -2.5684528336234433 1.0638879980024365 -4.1573480615127263 -2.3115464805084516 1.5445259788332855 -4.1573480615127263 -1.9658086924777207 1.9658086924777201 -4.1573480615127263 -1.5445259788332859 2.3115464805084511 -4.1573480615127263 -1.0638879980024385 2.5684528336234425 -4.1573480615127263 -0.54236539804361794 2.7266549847472294 -4.1573480615127263 -5.1067431665014159e-16 2.7800733139329128 -4.1573480615127263 0.54236539804361694 2.7266549847472299 -4.1573480615127263 1.0638879980024374 2.5684528336234429 -4.1573480615127263 1.544525978833285 2.3115464805084516 -4.1573480615127263 1.9658086924777198 1.9658086924777207 -4.1573480615127263 2.3115464805084511 1.5445259788332859 -4.1573480615127263 2.5684528336234425 1.0638879980024385 -4.1573480615127263 2.7266549847472294 0.54236539804361805 -4.1573480615127263 1.9165037446636239 0 -4.6193976625564339 1.8796786626037536 -0.37389133269154201 -4.6193976625564339 1.7706185836759594 -0.73341423114842319 -4.6193976625564339 1.5935146255518395 -1.0647524320057098 -4.6193976625564339 1.3551727940210603 -1.3551727940210601 -4.6193976625564339 1.06475243200571 -1.5935146255518395 -4.6193976625564339 0.7334142311484233 -1.7706185836759594 -4.6193976625564339 0.37389133269154218 -1.8796786626037536 -4.6193976625564339 1.1734813314197265e-16 -1.9165037446636239 -4.6193976625564339 -0.3738913326915419 -1.8796786626037536 -4.6193976625564339 -0.73341423114842308 -1.7706185836759594 -4.6193976625564339 -1.0647524320057093 -1.59351462555184 -4.6193976625564339 -1.3551727940210601 -1.3551727940210603 -4.6193976625564339 -1.5935146255518398 -1.0647524320057098 -4.6193976625564339 -1.7706185836759594 -0.73341423114842341 -4.6193976625564339 -1.8796786626037536 -0.37389133269154273 -4.6193976625564339 -1.9165037446636239 -2.3469626628394531e-16 -4.6193976625564339 -1.8796786626037536 0.37389133269154223 -4.6193976625564339 -1.7706185836759596 0.73341423114842297 -4.6193976625564339 -1.59351462555184 1.0647524320057093 -4.6193976625564339 -1.3551727940210603 1.3551727940210601 -4.6193976625564339 -1.0647524320057098 1.5935146255518395 -4.6193976625564339 -0.7334142311484243 1.7706185836759589 -4.6193976625564339 -0.37389133269154284 1.8796786626037534 -4.6193976625564339 -3.5204439942591791e-16 1.9165037446636239 -4.6193976625564339 0.37389133269154212 1.8796786626037536 -4.6193976625564339 0.73341423114842363 1.7706185836759591 -4.6193976625564339 1.0647524320057091 1.59351462555184 -4.6193976625564339 1.3551727940210598 1.3551727940210603 -4.6193976625564339 1.5935146255518395 1.0647524320057098 -4.6193976625564339 1.7706185836759589 0.73341423114842441 -4.6193976625564339 1.8796786626037534 0.37389133269154295 -4.6193976625564339 0.97947615847056235 0 -4.9039264020161522 0.96065579873382945 -0.19108631916314228 -4.9039264020161522 0.9049179753937342 -0.37482929824328742 -4.9039264020161522 0.81440466174310489 -0.54416779759863509 -4.9039264020161522 0.6925942336650841 -0.69259423366508399 -4.9039264020161522 0.54416779759863521 -0.81440466174310489 -4.9039264020161522 0.37482929824328748 -0.9049179753937342 -4.9039264020161522 0.19108631916314237 -0.96065579873382945 -4.9039264020161522 5.9973636354029222e-17 -0.97947615847056235 -4.9039264020161522 -0.19108631916314223 -0.96065579873382945 -4.9039264020161522 -0.37482929824328737 -0.9049179753937342 -4.9039264020161522 -0.54416779759863487 -0.81440466174310511 -4.9039264020161522 -0.69259423366508399 -0.6925942336650841 -4.9039264020161522 -0.814404661743105 -0.54416779759863509 -4.9039264020161522 -0.9049179753937342 -0.37482929824328753 -4.9039264020161522 -0.96065579873382945 -0.19108631916314262 -4.9039264020161522 -0.97947615847056235 -1.1994727270805844e-16 -4.9039264020161522 -0.96065579873382945 0.19108631916314239 -4.9039264020161522 -0.90491797539373431 0.37482929824328731 -4.9039264020161522 -0.81440466174310511 0.54416779759863487 -4.9039264020161522 -0.69259423366508421 0.69259423366508399 -4.9039264020161522 -0.54416779759863509 0.81440466174310489 -4.9039264020161522 -0.37482929824328798 0.90491797539373398 -4.9039264020161522 -0.19108631916314267 0.96065579873382934 -4.9039264020161522 -1.7992090906208765e-16 0.97947615847056235 -4.9039264020161522 0.19108631916314234 0.96065579873382945 -4.9039264020161522 0.37482929824328765 0.90491797539373409 -4.9039264020161522 0.54416779759863476 0.81440466174310511 -4.9039264020161522 0.69259423366508388 0.69259423366508421 -4.9039264020161522 0.81440466174310489 0.54416779759863509 -4.9039264020161522 0.90491797539373398 0.37482929824328803 -4.9039264020161522 0.96065579873382934 0.19108631916314273 -4.9039264020161522 0 0 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1891 1888 1893 1894 1895 1892 1897 1898 1899 1896 1901 1902 1903 1900 1905 1906 1907 1904 1909 1910 1911 1908 1913 1914 1915 1912 1917 1918 1919 1916</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1900 1904 1908 1912 1916</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">3 2 1 0 5 4 3 0 7 6 5 0 9 8 7 0 11 10 9 0 13 12 11 0 15 14 13 0 17 16 15 0 19 18 17 0 21 20 19 0 23 22 21 0 25 24 23 0 27 26 25 0 29 28 27 0 31 30 29 0 1 32 31 0 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 32 64 63 32 1 33 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 64 96 95 64 33 65 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 96 128 127 96 65 97 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 128 160 159 128 97 129 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 160 192 191 160 129 161 192 161 162 194 193 162 163 195 194 163 164 196 195 164 165 197 196 165 166 198 197 166 167 199 198 167 168 200 199 168 169 201 200 169 170 202 201 170 171 203 202 171 172 204 203 172 173 205 204 173 174 206 205 174 175 207 206 175 176 208 207 176 177 209 208 177 178 210 209 178 179 211 210 179 180 212 211 180 181 213 212 181 182 214 213 182 183 215 214 183 184 216 215 184 185 217 216 185 186 218 217 186 187 219 218 187 188 220 219 188 189 221 220 189 190 222 221 190 191 223 222 191 192 224 223 192 161 193 224 193 194 226 225 194 195 227 226 195 196 228 227 196 197 229 228 197 198 230 229 198 199 231 230 199 200 232 231 200 201 233 232 201 202 234 233 202 203 235 234 203 204 236 235 204 205 237 236 205 206 238 237 206 207 239 238 207 208 240 239 208 209 241 240 209 210 242 241 210 211 243 242 211 212 244 243 212 213 245 244 213 214 246 245 214 215 247 246 215 216 248 247 216 217 249 248 217 218 250 249 218 219 251 250 219 220 252 251 220 221 253 252 221 222 254 253 222 223 255 254 223 224 256 255 224 193 225 256 225 226 258 257 226 227 259 258 227 228 260 259 228 229 261 260 229 230 262 261 230 231 263 262 231 232 264 263 232 233 265 264 233 234 266 265 234 235 267 266 235 236 268 267 236 237 269 268 237 238 270 269 238 239 271 270 239 240 272 271 240 241 273 272 241 242 274 273 242 243 275 274 243 244 276 275 244 245 277 276 245 246 278 277 246 247 279 278 247 248 280 279 248 249 281 280 249 250 282 281 250 251 283 282 251 252 284 283 252 253 285 284 253 254 286 285 254 255 287 286 255 256 288 287 256 225 257 288 257 258 290 289 258 259 291 290 259 260 292 291 260 261 293 292 261 262 294 293 262 263 295 294 263 264 296 295 264 265 297 296 265 266 298 297 266 267 299 298 267 268 300 299 268 269 301 300 269 270 302 301 270 271 303 302 271 272 304 303 272 273 305 304 273 274 306 305 274 275 307 306 275 276 308 307 276 277 309 308 277 278 310 309 278 279 311 310 279 280 312 311 280 281 313 312 281 282 314 313 282 283 315 314 283 284 316 315 284 285 317 316 285 286 318 317 286 287 319 318 287 288 320 319 288 257 289 320 289 290 322 321 290 291 323 322 291 292 324 323 292 293 325 324 293 294 326 325 294 295 327 326 295 296 328 327 296 297 329 328 297 298 330 329 298 299 331 330 299 300 332 331 300 301 333 332 301 302 334 333 302 303 335 334 303 304 336 335 304 305 337 336 305 306 338 337 306 307 339 338 307 308 340 339 308 309 341 340 309 310 342 341 310 311 343 342 311 312 344 343 312 313 345 344 313 314 346 345 314 315 347 346 315 316 348 347 316 317 349 348 317 318 350 349 318 319 351 350 319 320 352 351 320 289 321 352 321 322 354 353 322 323 355 354 323 324 356 355 324 325 357 356 325 326 358 357 326 327 359 358 327 328 360 359 328 329 361 360 329 330 362 361 330 331 363 362 331 332 364 363 332 333 365 364 333 334 366 365 334 335 367 366 335 336 368 367 336 337 369 368 337 338 370 369 338 339 371 370 339 340 372 371 340 341 373 372 341 342 374 373 342 343 375 374 343 344 376 375 344 345 377 376 345 346 378 377 346 347 379 378 347 348 380 379 348 349 381 380 349 350 382 381 350 351 383 382 351 352 384 383 352 321 353 384 353 354 386 385 354 355 387 386 355 356 388 387 356 357 389 388 357 358 390 389 358 359 391 390 359 360 392 391 360 361 393 392 361 362 394 393 362 363 395 394 363 364 396 395 364 365 397 396 365 366 398 397 366 367 399 398 367 368 400 399 368 369 401 400 369 370 402 401 370 371 403 402 371 372 404 403 372 373 405 404 373 374 406 405 374 375 407 406 375 376 408 407 376 377 409 408 377 378 410 409 378 379 411 410 379 380 412 411 380 381 413 412 381 382 414 413 382 383 415 414 383 384 416 415 384 353 385 416 385 386 418 417 386 387 419 418 387 388 420 419 388 389 421 420 389 390 422 421 390 391 423 422 391 392 424 423 392 393 425 424 393 394 426 425 394 395 427 426 395 396 428 427 396 397 429 428 397 398 430 429 398 399 431 430 399 400 432 431 400 401 433 432 401 402 434 433 402 403 435 434 403 404 436 435 404 405 437 436 405 406 438 437 406 407 439 438 407 408 440 439 408 409 441 440 409 410 442 441 410 411 443 442 411 412 444 443 412 413 445 444 413 414 446 445 414 415 447 446 415 416 448 447 416 385 417 448 417 418 450 449 418 419 451 450 419 420 452 451 420 421 453 452 421 422 454 453 422 423 455 454 423 424 456 455 424 425 457 456 425 426 458 457 426 427 459 458 427 428 460 459 428 429 461 460 429 430 462 461 430 431 463 462 431 432 464 463 432 433 465 464 433 434 466 465 434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 448 480 479 448 417 449 480 449 450 451 481 451 452 453 481 453 454 455 481 455 456 457 481 457 458 459 481 459 460 461 481 461 462 463 481 463 464 465 481 465 466 467 481 467 468 469 481 469 470 471 481 471 472 473 481 473 474 475 481 475 476 477 481 477 478 479 481 479 480 449 481\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolySphere.3.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0.0050000000000000001 0 5 0.0049039264020161524 -0.00097545161008064129 5 0.0046193976625564341 -0.001913417161825449 5 0.0041573480615127263 -0.0027778511650980108 5 0.0035355339059327381 -0.0035355339059327372 5 0.0027778511650980117 -0.0041573480615127254 5 0.0019134171618254492 -0.0046193976625564341 5 0.0009754516100806415 -0.0049039264020161524 5 3.061616997868383e-19 -0.0050000000000000001 5 -0.00097545161008064096 -0.0049039264020161524 5 -0.0019134171618254486 -0.0046193976625564341 5 -0.0027778511650980099 -0.0041573480615127271 5 -0.0035355339059327372 -0.0035355339059327381 5 -0.0041573480615127271 -0.0027778511650980108 5 -0.0046193976625564341 -0.0019134171618254492 5 -0.0049039264020161524 -0.00097545161008064291 5 -0.0050000000000000001 -6.123233995736766e-19 5 -0.0049039264020161524 0.00097545161008064183 5 -0.0046193976625564341 0.0019134171618254484 5 -0.0041573480615127271 0.0027778511650980099 5 -0.0035355339059327385 0.0035355339059327372 5 -0.0027778511650980108 0.0041573480615127263 5 -0.0019134171618254516 0.0046193976625564324 5 -0.00097545161008064335 0.0049039264020161516 5 -9.184850993605148e-19 0.0050000000000000001 5 0.0009754516100806414 0.0049039264020161524 5 0.0019134171618254501 0.0046193976625564332 5 0.0027778511650980091 0.004157348061512728 5 0.0035355339059327372 0.0035355339059327385 5 0.0041573480615127263 0.0027778511650980108 5 0.0046193976625564324 0.0019134171618254521 5 0.0049039264020161516 0.00097545161008064367 5 0.97947615847056058 0 4.9039264020161522 0.96065579873382767 -0.19108631916314192 4.9039264020161522 0.90491797539373253 -0.3748292982432867 4.9039264020161522 0.81440466174310333 -0.5441677975986341 4.9039264020161522 0.69259423366508288 -0.69259423366508277 4.9039264020161522 0.54416779759863421 -0.81440466174310322 4.9039264020161522 0.37482929824328676 -0.90491797539373253 4.9039264020161522 0.19108631916314198 -0.96065579873382767 4.9039264020161522 5.9975617115605883e-17 -0.97947615847056058 4.9039264020161522 -0.19108631916314187 -0.96065579873382767 4.9039264020161522 -0.3748292982432867 -0.90491797539373253 4.9039264020161522 -0.54416779759863387 -0.81440466174310355 4.9039264020161522 -0.69259423366508277 -0.69259423366508288 4.9039264020161522 -0.81440466174310344 -0.5441677975986341 4.9039264020161522 -0.90491797539373253 -0.37482929824328676 4.9039264020161522 -0.96065579873382767 -0.19108631916314225 4.9039264020161522 -0.97947615847056058 -1.1995123423121177e-16 4.9039264020161522 -0.96065579873382767 0.19108631916314203 4.9039264020161522 -0.90491797539373253 0.37482929824328665 4.9039264020161522 -0.81440466174310355 0.54416779759863387 4.9039264020161522 -0.69259423366508299 0.69259423366508277 4.9039264020161522 -0.5441677975986341 0.81440466174310333 4.9039264020161522 -0.37482929824328726 0.90491797539373231 4.9039264020161522 -0.19108631916314234 0.96065579873382756 4.9039264020161522 -1.7992685134681764e-16 0.97947615847056058 4.9039264020161522 0.19108631916314195 0.96065579873382767 4.9039264020161522 0.37482929824328692 0.90491797539373242 4.9039264020161522 0.54416779759863376 0.81440466174310366 4.9039264020161522 0.69259423366508277 0.69259423366508299 4.9039264020161522 0.81440466174310333 0.5441677975986341 4.9039264020161522 0.90491797539373231 0.37482929824328731 4.9039264020161522 0.96065579873382756 0.19108631916314239 4.9039264020161522 1.9165037446636235 0 4.6193976625564339 1.8796786626037532 -0.37389133269154196 4.6193976625564339 1.7706185836759589 -0.73341423114842308 4.6193976625564339 1.5935146255518391 -1.0647524320057096 4.6193976625564339 1.3551727940210598 -1.3551727940210596 4.6193976625564339 1.0647524320057096 -1.5935146255518389 4.6193976625564339 0.73341423114842319 -1.7706185836759589 4.6193976625564339 0.37389133269154207 -1.8796786626037532 4.6193976625564339 1.1735200882281113e-16 -1.9165037446636235 4.6193976625564339 -0.37389133269154184 -1.8796786626037532 4.6193976625564339 -0.73341423114842297 -1.7706185836759589 4.6193976625564339 -1.0647524320057091 -1.5935146255518395 4.6193976625564339 -1.3551727940210596 -1.3551727940210598 4.6193976625564339 -1.5935146255518393 -1.0647524320057096 4.6193976625564339 -1.7706185836759589 -0.73341423114842319 4.6193976625564339 -1.8796786626037532 -0.37389133269154257 4.6193976625564339 -1.9165037446636235 -2.3470401764562226e-16 4.6193976625564339 -1.8796786626037532 0.37389133269154218 4.6193976625564339 -1.7706185836759589 0.73341423114842286 4.6193976625564339 -1.5935146255518395 1.0647524320057091 4.6193976625564339 -1.3551727940210601 1.3551727940210596 4.6193976625564339 -1.0647524320057096 1.5935146255518391 4.6193976625564339 -0.73341423114842408 1.7706185836759585 4.6193976625564339 -0.37389133269154273 1.8796786626037529 4.6193976625564339 -3.5205602646843339e-16 1.9165037446636235 4.6193976625564339 0.37389133269154201 1.8796786626037532 4.6193976625564339 0.73341423114842352 1.7706185836759587 4.6193976625564339 1.0647524320057089 1.5935146255518398 4.6193976625564339 1.3551727940210596 1.3551727940210601 4.6193976625564339 1.5935146255518391 1.0647524320057096 4.6193976625564339 1.7706185836759585 0.73341423114842419 4.6193976625564339 1.8796786626037529 0.37389133269154284 4.6193976625564339 2.7800733139329128 0 4.1573480615127263 2.7266549847472299 -0.54236539804361672 4.1573480615127263 2.5684528336234433 -1.0638879980024369 4.1573480615127263 2.3115464805084511 -1.5445259788332859 4.1573480615127263 1.9658086924777203 -1.9658086924777201 4.1573480615127263 1.5445259788332864 -2.3115464805084507 4.1573480615127263 1.0638879980024369 -2.5684528336234433 4.1573480615127263 0.54236539804361694 -2.7266549847472299 4.1573480615127263 1.7023039426514583e-16 -2.7800733139329128 4.1573480615127263 -0.54236539804361661 -2.7266549847472299 4.1573480615127263 -1.0638879980024367 -2.5684528336234433 4.1573480615127263 -1.5445259788332855 -2.3115464805084516 4.1573480615127263 -1.9658086924777201 -1.9658086924777203 4.1573480615127263 -2.3115464805084516 -1.5445259788332859 4.1573480615127263 -2.5684528336234433 -1.0638879980024369 4.1573480615127263 -2.7266549847472299 -0.54236539804361772 4.1573480615127263 -2.7800733139329128 -3.4046078853029166e-16 4.1573480615127263 -2.7266549847472299 0.54236539804361705 4.1573480615127263 -2.5684528336234433 1.0638879980024365 4.1573480615127263 -2.3115464805084516 1.5445259788332855 4.1573480615127263 -1.9658086924777207 1.9658086924777201 4.1573480615127263 -1.5445259788332859 2.3115464805084511 4.1573480615127263 -1.0638879980024385 2.5684528336234425 4.1573480615127263 -0.54236539804361794 2.7266549847472294 4.1573480615127263 -5.1069118279543739e-16 2.7800733139329128 4.1573480615127263 0.54236539804361683 2.7266549847472299 4.1573480615127263 1.0638879980024374 2.5684528336234429 4.1573480615127263 1.544525978833285 2.311546480508452 4.1573480615127263 1.9658086924777201 1.9658086924777207 4.1573480615127263 2.3115464805084511 1.5445259788332859 4.1573480615127263 2.5684528336234425 1.0638879980024385 4.1573480615127263 2.7266549847472294 0.54236539804361805 4.1573480615127263 3.5369983720268046 0 3.5355339059327378 3.4690359400940789 -0.69003415136923063 3.5355339059327378 3.2677604024413065 -1.3535506772769523 3.5355339059327378 2.9409066651038609 -1.9650510097368854 3.5355339059327378 2.5010355339059327 -2.5010355339059323 3.5355339059327378 1.9650510097368858 -2.9409066651038605 3.5355339059327378 1.3535506772769526 -3.2677604024413065 3.5355339059327378 0.69003415136923085 -3.4690359400940789 3.5355339059327378 2.1657868674460127e-16 -3.5369983720268046 3.5355339059327378 -0.69003415136923052 -3.4690359400940789 3.5355339059327378 -1.3535506772769521 -3.2677604024413065 3.5355339059327378 -1.9650510097368845 -2.9409066651038618 3.5355339059327378 -2.5010355339059323 -2.5010355339059327 3.5355339059327378 -2.9409066651038613 -1.9650510097368854 3.5355339059327378 -3.2677604024413065 -1.3535506772769526 3.5355339059327378 -3.4690359400940789 -0.69003415136923185 3.5355339059327378 -3.5369983720268046 -4.3315737348920254e-16 3.5355339059327378 -3.4690359400940789 0.69003415136923107 3.5355339059327378 -3.2677604024413065 1.3535506772769519 3.5355339059327378 -2.9409066651038618 1.9650510097368845 3.5355339059327378 -2.5010355339059331 2.5010355339059323 3.5355339059327378 -1.9650510097368854 2.9409066651038609 3.5355339059327378 -1.3535506772769543 3.2677604024413056 3.5355339059327378 -0.69003415136923218 3.4690359400940785 3.5355339059327378 -6.4973606023380378e-16 3.5369983720268046 3.5355339059327378 0.69003415136923074 3.4690359400940789 3.5355339059327378 1.3535506772769532 3.2677604024413061 3.5355339059327378 1.9650510097368843 2.9409066651038622 3.5355339059327378 2.5010355339059323 2.5010355339059331 3.5355339059327378 2.9409066651038609 1.9650510097368854 3.5355339059327378 3.2677604024413056 1.3535506772769546 3.5355339059327378 3.4690359400940785 0.6900341513692323 3.5355339059327378 4.158190713451213 0 2.7778511650980113 4.0782922448623564 -0.81122276529167126 2.7778511650980113 3.8416672924360804 -1.5912706946521518 2.7778511650980113 3.4574092203933242 -2.3101669836120364 2.7778511650980113 2.9402848509482808 -2.9402848509482804 2.7778511650980113 2.3101669836120369 -3.4574092203933238 2.7778511650980113 1.591270694652152 -3.8416672924360804 2.7778511650980113 0.81122276529167148 -4.0782922448623564 2.7778511650980113 2.5461574737361384e-16 -4.158190713451213 2.7778511650980113 -0.81122276529167103 -4.0782922448623564 2.7778511650980113 -1.5912706946521515 -3.8416672924360804 2.7778511650980113 -2.3101669836120355 -3.4574092203933251 2.7778511650980113 -2.9402848509482804 -2.9402848509482808 2.7778511650980113 -3.4574092203933247 -2.3101669836120364 2.7778511650980113 -3.8416672924360804 -1.591270694652152 2.7778511650980113 -4.0782922448623564 -0.81122276529167259 2.7778511650980113 -4.158190713451213 -5.0923149474722769e-16 2.7778511650980113 -4.0782922448623564 0.8112227652916717 2.7778511650980113 -3.8416672924360804 1.5912706946521513 2.7778511650980113 -3.4574092203933251 2.3101669836120355 2.7778511650980113 -2.9402848509482813 2.9402848509482804 2.7778511650980113 -2.3101669836120364 3.4574092203933242 2.7778511650980113 -1.591270694652154 3.8416672924360795 2.7778511650980113 -0.81122276529167292 4.0782922448623564 2.7778511650980113 -7.6384724212084148e-16 4.158190713451213 2.7778511650980113 0.81122276529167137 4.0782922448623564 2.7778511650980113 1.5912706946521527 3.84166729243608 2.7778511650980113 2.3101669836120351 3.4574092203933255 2.7778511650980113 2.9402848509482804 2.9402848509482813 2.7778511650980113 3.4574092203933242 2.3101669836120364 2.7778511650980113 3.8416672924360795 1.5912706946521542 2.7778511650980113 4.0782922448623564 0.81122276529167314 2.7778511650980113 4.6197782648938777 0 1.9134171618254492 4.5310105209346911 -0.90127402934125678 1.9134171618254492 4.2681185836759594 -1.7679126031752281 1.9134171618254492 3.8412052428350374 -2.5666112871259852 1.9134171618254492 3.2666765386846834 -3.266676538684683 1.9134171618254492 2.5666112871259856 -3.8412052428350369 1.9134171618254492 1.7679126031752284 -4.2681185836759594 1.9134171618254492 0.90127402934125711 -4.5310105209346911 1.9134171618254492 2.8287983324364e-16 -4.6197782648938777 1.9134171618254492 -0.90127402934125656 -4.5310105209346911 1.9134171618254492 -1.7679126031752277 -4.2681185836759594 1.9134171618254492 -2.5666112871259839 -3.8412052428350387 1.9134171618254492 -3.266676538684683 -3.2666765386846834 1.9134171618254492 -3.8412052428350383 -2.5666112871259852 1.9134171618254492 -4.2681185836759594 -1.7679126031752284 1.9134171618254492 -4.5310105209346911 -0.90127402934125833 1.9134171618254492 -4.6197782648938777 -5.6575966648728e-16 1.9134171618254492 -4.5310105209346911 0.90127402934125733 1.9134171618254492 -4.2681185836759594 1.7679126031752275 1.9134171618254492 -3.8412052428350387 2.5666112871259839 1.9134171618254492 -3.2666765386846839 3.266676538684683 1.9134171618254492 -2.5666112871259852 3.8412052428350374 1.9134171618254492 -1.7679126031752306 4.2681185836759576 1.9134171618254492 -0.90127402934125878 4.5310105209346903 1.9134171618254492 -8.4863949973092005e-16 4.6197782648938777 1.9134171618254492 0.901274029341257 4.5310105209346911 1.9134171618254492 1.767912603175229 4.2681185836759585 1.9134171618254492 2.5666112871259834 3.8412052428350392 1.9134171618254492 3.266676538684683 3.2666765386846839 1.9134171618254492 3.8412052428350374 2.5666112871259852 1.9134171618254492 4.2681185836759576 1.7679126031752308 1.9134171618254492 4.5310105209346903 0.901274029341259 1.9134171618254492 4.904022475614136 0 0.97545161008064152 4.809793058848955 -0.95672732394189219 0.97545161008064152 4.5307259921952312 -1.8766881533635624 0.97545161008064152 4.0775456665218535 -2.7245289095103118 0.97545161008064152 3.4676675475979963 -3.4676675475979954 0.97545161008064152 2.7245289095103122 -4.0775456665218535 0.97545161008064152 1.8766881533635627 -4.5307259921952312 0.97545161008064152 0.95672732394189253 -4.809793058848955 0.97545161008064152 3.0028477138537652e-16 -4.904022475614136 0.97545161008064152 -0.95672732394189197 -4.809793058848955 0.97545161008064152 -1.876688153363562 -4.5307259921952312 0.97545161008064152 -2.7245289095103109 -4.0775456665218552 0.97545161008064152 -3.4676675475979954 -3.4676675475979963 0.97545161008064152 -4.0775456665218544 -2.7245289095103118 0.97545161008064152 -4.5307259921952312 -1.8766881533635627 0.97545161008064152 -4.809793058848955 -0.95672732394189386 0.97545161008064152 -4.904022475614136 -6.0056954277075304e-16 0.97545161008064152 -4.809793058848955 0.95672732394189275 0.97545161008064152 -4.5307259921952312 1.8766881533635618 0.97545161008064152 -4.0775456665218552 2.7245289095103109 0.97545161008064152 -3.4676675475979968 3.4676675475979954 0.97545161008064152 -2.7245289095103118 4.0775456665218535 0.97545161008064152 -1.8766881533635651 4.5307259921952303 0.97545161008064152 -0.9567273239418943 4.8097930588489541 0.97545161008064152 -9.008543141561295e-16 4.904022475614136 0.97545161008064152 0.9567273239418923 4.809793058848955 0.97545161008064152 1.8766881533635635 4.5307259921952303 0.97545161008064152 2.72452890951031 4.0775456665218552 0.97545161008064152 3.4676675475979954 3.4676675475979968 0.97545161008064152 4.0775456665218535 2.7245289095103118 0.97545161008064152 4.5307259921952303 1.8766881533635653 0.97545161008064152 4.8097930588489541 0.95672732394189453 0.97545161008064152 5 0 3.0616169978683831e-16 4.9039264020161522 -0.97545161008064118 3.0616169978683831e-16 4.6193976625564339 -1.913417161825449 3.0616169978683831e-16 4.1573480615127263 -2.7778511650980109 3.0616169978683831e-16 3.5355339059327378 -3.5355339059327373 3.0616169978683831e-16 2.7778511650980113 -4.1573480615127254 3.0616169978683831e-16 1.9134171618254492 -4.6193976625564339 3.0616169978683831e-16 0.97545161008064152 -4.9039264020161522 3.0616169978683831e-16 3.0616169978683831e-16 -5 3.0616169978683831e-16 -0.97545161008064096 -4.9039264020161522 3.0616169978683831e-16 -1.9134171618254485 -4.6193976625564339 3.0616169978683831e-16 -2.77785116509801 -4.1573480615127272 3.0616169978683831e-16 -3.5355339059327373 -3.5355339059327378 3.0616169978683831e-16 -4.1573480615127263 -2.7778511650980109 3.0616169978683831e-16 -4.6193976625564339 -1.9134171618254492 3.0616169978683831e-16 -4.9039264020161522 -0.97545161008064296 3.0616169978683831e-16 -5 -6.1232339957367663e-16 3.0616169978683831e-16 -4.9039264020161522 0.97545161008064185 3.0616169978683831e-16 -4.6193976625564339 1.9134171618254483 3.0616169978683831e-16 -4.1573480615127272 2.77785116509801 3.0616169978683831e-16 -3.5355339059327386 3.5355339059327373 3.0616169978683831e-16 -2.7778511650980109 4.1573480615127263 3.0616169978683831e-16 -1.9134171618254516 4.6193976625564321 3.0616169978683831e-16 -0.97545161008064329 4.9039264020161513 3.0616169978683831e-16 -9.1848509936051479e-16 5 3.0616169978683831e-16 0.97545161008064141 4.9039264020161522 3.0616169978683831e-16 1.9134171618254501 4.619397662556433 3.0616169978683831e-16 2.7778511650980091 4.1573480615127281 3.0616169978683831e-16 3.5355339059327373 3.5355339059327386 3.0616169978683831e-16 4.1573480615127263 2.7778511650980109 3.0616169978683831e-16 4.6193976625564321 1.9134171618254521 3.0616169978683831e-16 4.9039264020161513 0.97545161008064363 3.0616169978683831e-16 4.904022475614136 0 -0.97545161008064096 4.809793058848955 -0.95672732394189219 -0.97545161008064096 4.5307259921952312 -1.8766881533635624 -0.97545161008064096 4.0775456665218535 -2.7245289095103118 -0.97545161008064096 3.4676675475979963 -3.4676675475979954 -0.97545161008064096 2.7245289095103122 -4.0775456665218535 -0.97545161008064096 1.8766881533635627 -4.5307259921952312 -0.97545161008064096 0.95672732394189253 -4.809793058848955 -0.97545161008064096 3.0028477138537652e-16 -4.904022475614136 -0.97545161008064096 -0.95672732394189197 -4.809793058848955 -0.97545161008064096 -1.876688153363562 -4.5307259921952312 -0.97545161008064096 -2.7245289095103109 -4.0775456665218552 -0.97545161008064096 -3.4676675475979954 -3.4676675475979963 -0.97545161008064096 -4.0775456665218544 -2.7245289095103118 -0.97545161008064096 -4.5307259921952312 -1.8766881533635627 -0.97545161008064096 -4.809793058848955 -0.95672732394189386 -0.97545161008064096 -4.904022475614136 -6.0056954277075304e-16 -0.97545161008064096 -4.809793058848955 0.95672732394189275 -0.97545161008064096 -4.5307259921952312 1.8766881533635618 -0.97545161008064096 -4.0775456665218552 2.7245289095103109 -0.97545161008064096 -3.4676675475979968 3.4676675475979954 -0.97545161008064096 -2.7245289095103118 4.0775456665218535 -0.97545161008064096 -1.8766881533635651 4.5307259921952303 -0.97545161008064096 -0.9567273239418943 4.8097930588489541 -0.97545161008064096 -9.008543141561295e-16 4.904022475614136 -0.97545161008064096 0.9567273239418923 4.809793058848955 -0.97545161008064096 1.8766881533635635 4.5307259921952303 -0.97545161008064096 2.72452890951031 4.0775456665218552 -0.97545161008064096 3.4676675475979954 3.4676675475979968 -0.97545161008064096 4.0775456665218535 2.7245289095103118 -0.97545161008064096 4.5307259921952303 1.8766881533635653 -0.97545161008064096 4.8097930588489541 0.95672732394189453 -0.97545161008064096 4.6197782648938777 0 -1.9134171618254485 4.5310105209346911 -0.90127402934125678 -1.9134171618254485 4.2681185836759594 -1.7679126031752281 -1.9134171618254485 3.8412052428350374 -2.5666112871259852 -1.9134171618254485 3.2666765386846834 -3.266676538684683 -1.9134171618254485 2.5666112871259856 -3.8412052428350369 -1.9134171618254485 1.7679126031752284 -4.2681185836759594 -1.9134171618254485 0.90127402934125711 -4.5310105209346911 -1.9134171618254485 2.8287983324364e-16 -4.6197782648938777 -1.9134171618254485 -0.90127402934125656 -4.5310105209346911 -1.9134171618254485 -1.7679126031752277 -4.2681185836759594 -1.9134171618254485 -2.5666112871259839 -3.8412052428350387 -1.9134171618254485 -3.266676538684683 -3.2666765386846834 -1.9134171618254485 -3.8412052428350383 -2.5666112871259852 -1.9134171618254485 -4.2681185836759594 -1.7679126031752284 -1.9134171618254485 -4.5310105209346911 -0.90127402934125833 -1.9134171618254485 -4.6197782648938777 -5.6575966648728e-16 -1.9134171618254485 -4.5310105209346911 0.90127402934125733 -1.9134171618254485 -4.2681185836759594 1.7679126031752275 -1.9134171618254485 -3.8412052428350387 2.5666112871259839 -1.9134171618254485 -3.2666765386846839 3.266676538684683 -1.9134171618254485 -2.5666112871259852 3.8412052428350374 -1.9134171618254485 -1.7679126031752306 4.2681185836759576 -1.9134171618254485 -0.90127402934125878 4.5310105209346903 -1.9134171618254485 -8.4863949973092005e-16 4.6197782648938777 -1.9134171618254485 0.901274029341257 4.5310105209346911 -1.9134171618254485 1.767912603175229 4.2681185836759585 -1.9134171618254485 2.5666112871259834 3.8412052428350392 -1.9134171618254485 3.266676538684683 3.2666765386846839 -1.9134171618254485 3.8412052428350374 2.5666112871259852 -1.9134171618254485 4.2681185836759576 1.7679126031752308 -1.9134171618254485 4.5310105209346903 0.901274029341259 -1.9134171618254485 4.1581907134512148 0 -2.77785116509801 4.0782922448623582 -0.81122276529167159 -2.77785116509801 3.8416672924360822 -1.5912706946521524 -2.77785116509801 3.4574092203933255 -2.3101669836120373 -2.77785116509801 2.9402848509482822 -2.9402848509482817 -2.77785116509801 2.3101669836120378 -3.4574092203933251 -2.77785116509801 1.5912706946521527 -3.8416672924360822 -2.77785116509801 0.81122276529167181 -4.0782922448623582 -2.77785116509801 2.5461574737361394e-16 -4.1581907134512148 -2.77785116509801 -0.81122276529167137 -4.0782922448623582 -2.77785116509801 -1.5912706946521522 -3.8416672924360822 -2.77785116509801 -2.3101669836120364 -3.4574092203933264 -2.77785116509801 -2.9402848509482817 -2.9402848509482822 -2.77785116509801 -3.457409220393326 -2.3101669836120373 -2.77785116509801 -3.8416672924360822 -1.5912706946521527 -2.77785116509801 -4.0782922448623582 -0.81122276529167292 -2.77785116509801 -4.1581907134512148 -5.0923149474722788e-16 -2.77785116509801 -4.0782922448623582 0.81122276529167203 -2.77785116509801 -3.8416672924360822 1.591270694652152 -2.77785116509801 -3.4574092203933264 2.3101669836120364 -2.77785116509801 -2.9402848509482826 2.9402848509482817 -2.77785116509801 -2.3101669836120373 3.4574092203933255 -2.77785116509801 -1.5912706946521546 3.8416672924360813 -2.77785116509801 -0.81122276529167325 4.0782922448623582 -2.77785116509801 -7.6384724212084188e-16 4.1581907134512148 -2.77785116509801 0.8112227652916717 4.0782922448623582 -2.77785116509801 1.5912706946521533 3.8416672924360817 -2.77785116509801 2.310166983612036 3.4574092203933269 -2.77785116509801 2.9402848509482817 2.9402848509482826 -2.77785116509801 3.4574092203933255 2.3101669836120373 -2.77785116509801 3.8416672924360813 1.5912706946521549 -2.77785116509801 4.0782922448623582 0.81122276529167348 -2.77785116509801 3.536998372026805 0 -3.5355339059327373 3.4690359400940793 -0.69003415136923074 -3.5355339059327373 3.2677604024413069 -1.3535506772769526 -3.5355339059327373 2.9409066651038613 -1.9650510097368856 -3.5355339059327373 2.5010355339059331 -2.5010355339059327 -3.5355339059327373 1.9650510097368861 -2.9409066651038609 -3.5355339059327373 1.3535506772769528 -3.2677604024413069 -3.5355339059327373 0.69003415136923096 -3.4690359400940793 -3.5355339059327373 2.1657868674460129e-16 -3.536998372026805 -3.5355339059327373 -0.69003415136923052 -3.4690359400940793 -3.5355339059327373 -1.3535506772769523 -3.2677604024413069 -3.5355339059327373 -1.9650510097368847 -2.9409066651038618 -3.5355339059327373 -2.5010355339059327 -2.5010355339059331 -3.5355339059327373 -2.9409066651038618 -1.9650510097368856 -3.5355339059327373 -3.2677604024413069 -1.3535506772769528 -3.5355339059327373 -3.4690359400940793 -0.69003415136923196 -3.5355339059327373 -3.536998372026805 -4.3315737348920259e-16 -3.5355339059327373 -3.4690359400940793 0.69003415136923119 -3.5355339059327373 -3.2677604024413069 1.3535506772769521 -3.5355339059327373 -2.9409066651038618 1.9650510097368847 -3.5355339059327373 -2.5010355339059336 2.5010355339059327 -3.5355339059327373 -1.9650510097368856 2.9409066651038613 -3.5355339059327373 -1.3535506772769546 3.2677604024413061 -3.5355339059327373 -0.6900341513692323 3.4690359400940789 -3.5355339059327373 -6.4973606023380388e-16 3.536998372026805 -3.5355339059327373 0.69003415136923085 3.4690359400940793 -3.5355339059327373 1.3535506772769532 3.2677604024413065 -3.5355339059327373 1.9650510097368845 2.9409066651038622 -3.5355339059327373 2.5010355339059327 2.5010355339059336 -3.5355339059327373 2.9409066651038613 1.9650510097368856 -3.5355339059327373 3.2677604024413061 1.3535506772769546 -3.5355339059327373 3.4690359400940789 0.69003415136923241 -3.5355339059327373 2.7800733139329128 0 -4.1573480615127263 2.7266549847472299 -0.54236539804361672 -4.1573480615127263 2.5684528336234433 -1.0638879980024369 -4.1573480615127263 2.3115464805084511 -1.5445259788332859 -4.1573480615127263 1.9658086924777203 -1.9658086924777201 -4.1573480615127263 1.5445259788332864 -2.3115464805084507 -4.1573480615127263 1.0638879980024369 -2.5684528336234433 -4.1573480615127263 0.54236539804361694 -2.7266549847472299 -4.1573480615127263 1.7023039426514583e-16 -2.7800733139329128 -4.1573480615127263 -0.54236539804361661 -2.7266549847472299 -4.1573480615127263 -1.0638879980024367 -2.5684528336234433 -4.1573480615127263 -1.5445259788332855 -2.3115464805084516 -4.1573480615127263 -1.9658086924777201 -1.9658086924777203 -4.1573480615127263 -2.3115464805084516 -1.5445259788332859 -4.1573480615127263 -2.5684528336234433 -1.0638879980024369 -4.1573480615127263 -2.7266549847472299 -0.54236539804361772 -4.1573480615127263 -2.7800733139329128 -3.4046078853029166e-16 -4.1573480615127263 -2.7266549847472299 0.54236539804361705 -4.1573480615127263 -2.5684528336234433 1.0638879980024365 -4.1573480615127263 -2.3115464805084516 1.5445259788332855 -4.1573480615127263 -1.9658086924777207 1.9658086924777201 -4.1573480615127263 -1.5445259788332859 2.3115464805084511 -4.1573480615127263 -1.0638879980024385 2.5684528336234425 -4.1573480615127263 -0.54236539804361794 2.7266549847472294 -4.1573480615127263 -5.1069118279543739e-16 2.7800733139329128 -4.1573480615127263 0.54236539804361683 2.7266549847472299 -4.1573480615127263 1.0638879980024374 2.5684528336234429 -4.1573480615127263 1.544525978833285 2.311546480508452 -4.1573480615127263 1.9658086924777201 1.9658086924777207 -4.1573480615127263 2.3115464805084511 1.5445259788332859 -4.1573480615127263 2.5684528336234425 1.0638879980024385 -4.1573480615127263 2.7266549847472294 0.54236539804361805 -4.1573480615127263 1.9165037446636237 0 -4.6193976625564339 1.8796786626037534 -0.37389133269154196 -4.6193976625564339 1.7706185836759591 -0.73341423114842319 -4.6193976625564339 1.5935146255518393 -1.0647524320057096 -4.6193976625564339 1.3551727940210601 -1.3551727940210598 -4.6193976625564339 1.0647524320057098 -1.5935146255518391 -4.6193976625564339 0.7334142311484233 -1.7706185836759591 -4.6193976625564339 0.37389133269154207 -1.8796786626037534 -4.6193976625564339 1.1735200882281115e-16 -1.9165037446636237 -4.6193976625564339 -0.3738913326915419 -1.8796786626037534 -4.6193976625564339 -0.73341423114842308 -1.7706185836759591 -4.6193976625564339 -1.0647524320057091 -1.5935146255518398 -4.6193976625564339 -1.3551727940210598 -1.3551727940210601 -4.6193976625564339 -1.5935146255518395 -1.0647524320057096 -4.6193976625564339 -1.7706185836759591 -0.7334142311484233 -4.6193976625564339 -1.8796786626037534 -0.37389133269154262 -4.6193976625564339 -1.9165037446636237 -2.3470401764562231e-16 -4.6193976625564339 -1.8796786626037534 0.37389133269154218 -4.6193976625564339 -1.7706185836759591 0.73341423114842297 -4.6193976625564339 -1.5935146255518398 1.0647524320057091 -4.6193976625564339 -1.3551727940210603 1.3551727940210598 -4.6193976625564339 -1.0647524320057096 1.5935146255518393 -4.6193976625564339 -0.73341423114842419 1.7706185836759587 -4.6193976625564339 -0.37389133269154279 1.8796786626037532 -4.6193976625564339 -3.5205602646843344e-16 1.9165037446636237 -4.6193976625564339 0.37389133269154201 1.8796786626037534 -4.6193976625564339 0.73341423114842352 1.7706185836759589 -4.6193976625564339 1.0647524320057089 1.59351462555184 -4.6193976625564339 1.3551727940210598 1.3551727940210603 -4.6193976625564339 1.5935146255518393 1.0647524320057096 -4.6193976625564339 1.7706185836759587 0.7334142311484243 -4.6193976625564339 1.8796786626037532 0.3738913326915429 -4.6193976625564339 0.97947615847056235 0 -4.9039264020161522 0.96065579873382945 -0.19108631916314228 -4.9039264020161522 0.9049179753937342 -0.37482929824328742 -4.9039264020161522 0.81440466174310489 -0.54416779759863509 -4.9039264020161522 0.6925942336650841 -0.69259423366508399 -4.9039264020161522 0.54416779759863521 -0.81440466174310477 -4.9039264020161522 0.37482929824328748 -0.9049179753937342 -4.9039264020161522 0.19108631916314234 -0.96065579873382945 -4.9039264020161522 5.9975617115605994e-17 -0.97947615847056235 -4.9039264020161522 -0.19108631916314223 -0.96065579873382945 -4.9039264020161522 -0.37482929824328737 -0.9049179753937342 -4.9039264020161522 -0.54416779759863487 -0.81440466174310511 -4.9039264020161522 -0.69259423366508399 -0.6925942336650841 -4.9039264020161522 -0.814404661743105 -0.54416779759863509 -4.9039264020161522 -0.9049179753937342 -0.37482929824328748 -4.9039264020161522 -0.96065579873382945 -0.19108631916314259 -4.9039264020161522 -0.97947615847056235 -1.1995123423121199e-16 -4.9039264020161522 -0.96065579873382945 0.19108631916314239 -4.9039264020161522 -0.9049179753937342 0.37482929824328731 -4.9039264020161522 -0.81440466174310511 0.54416779759863487 -4.9039264020161522 -0.69259423366508421 0.69259423366508399 -4.9039264020161522 -0.54416779759863509 0.81440466174310489 -4.9039264020161522 -0.37482929824328798 0.90491797539373398 -4.9039264020161522 -0.19108631916314267 0.96065579873382934 -4.9039264020161522 -1.7992685134681798e-16 0.97947615847056235 -4.9039264020161522 0.19108631916314231 0.96065579873382945 -4.9039264020161522 0.37482929824328765 0.90491797539373409 -4.9039264020161522 0.54416779759863476 0.81440466174310522 -4.9039264020161522 0.69259423366508399 0.69259423366508421 -4.9039264020161522 0.81440466174310489 0.54416779759863509 -4.9039264020161522 0.90491797539373398 0.37482929824328803 -4.9039264020161522 0.96065579873382934 0.19108631916314273 -4.9039264020161522 0.0050000000000006116 0 -5 0.0049039264020167518 -0.00097545161008076055 -5 0.0046193976625569988 -0.001913417161825683 -5 0.0041573480615132346 -0.0027778511650983508 -5 0.0035355339059331705 -0.0035355339059331696 -5 0.0027778511650983512 -0.0041573480615132346 -5 0.0019134171618256832 -0.0046193976625569988 -5 0.00097545161008076088 -0.0049039264020167518 -5 3.0616169978687576e-19 -0.0050000000000006116 -5 -0.00097545161008076023 -0.0049039264020167518 -5 -0.0019134171618256828 -0.0046193976625569988 -5 -0.0027778511650983495 -0.0041573480615132354 -5 -0.0035355339059331696 -0.0035355339059331705 -5 -0.0041573480615132354 -0.0027778511650983508 -5 -0.0046193976625569988 -0.0019134171618256832 -5 -0.0049039264020167518 -0.00097545161008076218 -5 -0.0050000000000006116 -6.1232339957375151e-19 -5 -0.0049039264020167518 0.00097545161008076109 -5 -0.0046193976625569988 0.0019134171618256824 -5 -0.0041573480615132354 0.0027778511650983495 -5 -0.0035355339059331709 0.0035355339059331696 -5 -0.0027778511650983508 0.0041573480615132346 -5 -0.0019134171618256858 0.0046193976625569979 -5 -0.00097545161008076261 0.0049039264020167518 -5 -9.1848509936062727e-19 0.0050000000000006116 -5 0.00097545161008076066 0.0049039264020167518 -5 0.0019134171618256841 0.0046193976625569979 -5 0.0027778511650983491 0.0041573480615132363 -5 0.0035355339059331696 0.0035355339059331709 -5 0.0041573480615132346 0.0027778511650983508 -5 0.0046193976625569979 0.001913417161825686 -5 0.0049039264020167518 0.00097545161008076294 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1891 1888 1893 1894 1895 1892 1897 1898 1899 1896 1901 1902 1903 1900 1905 1906 1907 1904 1909 1910 1911 1908 1913 1914 1915 1912 1917 1918 1919 1916 1921 1922 1923 1920 1925 1926 1927 1924 1929 1930 1931 1928 1933 1934 1935 1932 1937 1938 1939 1936 1941 1942 1943 1940 1945 1946 1947 1944 1949 1950 1951 1948 1953 1954 1955 1952 1957 1958 1959 1956 1961 1962 1963 1960 1965 1966 1967 1964 1969 1970 1971 1968 1973 1974 1975 1972 1977 1978 1979 1976 1981 1982 1983 1980 1985 1986 1987 1984 1989 1990 1991 1988 1993 1994 1995 1992 1997 1998 1999 1996 2001 2002 2003 2000 2005 2006 2007 2004 2009 2010 2011 2008 2013 2014 2015 2012 2017 2018 2019 2016 2021 2022 2023 2020 2025 2026 2027 2024 2029 2030 2031 2028 2033 2034 2035 2032 2037 2038 2039 2036 2041 2042 2043 2040 2045 2046 2047 2044 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2048 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2080</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1900 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048 2080</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 160 161 193 192 161 162 194 193 162 163 195 194 163 164 196 195 164 165 197 196 165 166 198 197 166 167 199 198 167 168 200 199 168 169 201 200 169 170 202 201 170 171 203 202 171 172 204 203 172 173 205 204 173 174 206 205 174 175 207 206 175 176 208 207 176 177 209 208 177 178 210 209 178 179 211 210 179 180 212 211 180 181 213 212 181 182 214 213 182 183 215 214 183 184 216 215 184 185 217 216 185 186 218 217 186 187 219 218 187 188 220 219 188 189 221 220 189 190 222 221 190 191 223 222 191 160 192 223 192 193 225 224 193 194 226 225 194 195 227 226 195 196 228 227 196 197 229 228 197 198 230 229 198 199 231 230 199 200 232 231 200 201 233 232 201 202 234 233 202 203 235 234 203 204 236 235 204 205 237 236 205 206 238 237 206 207 239 238 207 208 240 239 208 209 241 240 209 210 242 241 210 211 243 242 211 212 244 243 212 213 245 244 213 214 246 245 214 215 247 246 215 216 248 247 216 217 249 248 217 218 250 249 218 219 251 250 219 220 252 251 220 221 253 252 221 222 254 253 222 223 255 254 223 192 224 255 224 225 257 256 225 226 258 257 226 227 259 258 227 228 260 259 228 229 261 260 229 230 262 261 230 231 263 262 231 232 264 263 232 233 265 264 233 234 266 265 234 235 267 266 235 236 268 267 236 237 269 268 237 238 270 269 238 239 271 270 239 240 272 271 240 241 273 272 241 242 274 273 242 243 275 274 243 244 276 275 244 245 277 276 245 246 278 277 246 247 279 278 247 248 280 279 248 249 281 280 249 250 282 281 250 251 283 282 251 252 284 283 252 253 285 284 253 254 286 285 254 255 287 286 255 224 256 287 256 257 289 288 257 258 290 289 258 259 291 290 259 260 292 291 260 261 293 292 261 262 294 293 262 263 295 294 263 264 296 295 264 265 297 296 265 266 298 297 266 267 299 298 267 268 300 299 268 269 301 300 269 270 302 301 270 271 303 302 271 272 304 303 272 273 305 304 273 274 306 305 274 275 307 306 275 276 308 307 276 277 309 308 277 278 310 309 278 279 311 310 279 280 312 311 280 281 313 312 281 282 314 313 282 283 315 314 283 284 316 315 284 285 317 316 285 286 318 317 286 287 319 318 287 256 288 319 288 289 321 320 289 290 322 321 290 291 323 322 291 292 324 323 292 293 325 324 293 294 326 325 294 295 327 326 295 296 328 327 296 297 329 328 297 298 330 329 298 299 331 330 299 300 332 331 300 301 333 332 301 302 334 333 302 303 335 334 303 304 336 335 304 305 337 336 305 306 338 337 306 307 339 338 307 308 340 339 308 309 341 340 309 310 342 341 310 311 343 342 311 312 344 343 312 313 345 344 313 314 346 345 314 315 347 346 315 316 348 347 316 317 349 348 317 318 350 349 318 319 351 350 319 288 320 351 320 321 353 352 321 322 354 353 322 323 355 354 323 324 356 355 324 325 357 356 325 326 358 357 326 327 359 358 327 328 360 359 328 329 361 360 329 330 362 361 330 331 363 362 331 332 364 363 332 333 365 364 333 334 366 365 334 335 367 366 335 336 368 367 336 337 369 368 337 338 370 369 338 339 371 370 339 340 372 371 340 341 373 372 341 342 374 373 342 343 375 374 343 344 376 375 344 345 377 376 345 346 378 377 346 347 379 378 347 348 380 379 348 349 381 380 349 350 382 381 350 351 383 382 351 320 352 383 352 353 385 384 353 354 386 385 354 355 387 386 355 356 388 387 356 357 389 388 357 358 390 389 358 359 391 390 359 360 392 391 360 361 393 392 361 362 394 393 362 363 395 394 363 364 396 395 364 365 397 396 365 366 398 397 366 367 399 398 367 368 400 399 368 369 401 400 369 370 402 401 370 371 403 402 371 372 404 403 372 373 405 404 373 374 406 405 374 375 407 406 375 376 408 407 376 377 409 408 377 378 410 409 378 379 411 410 379 380 412 411 380 381 413 412 381 382 414 413 382 383 415 414 383 352 384 415 384 385 417 416 385 386 418 417 386 387 419 418 387 388 420 419 388 389 421 420 389 390 422 421 390 391 423 422 391 392 424 423 392 393 425 424 393 394 426 425 394 395 427 426 395 396 428 427 396 397 429 428 397 398 430 429 398 399 431 430 399 400 432 431 400 401 433 432 401 402 434 433 402 403 435 434 403 404 436 435 404 405 437 436 405 406 438 437 406 407 439 438 407 408 440 439 408 409 441 440 409 410 442 441 410 411 443 442 411 412 444 443 412 413 445 444 413 414 446 445 414 415 447 446 415 384 416 447 416 417 449 448 417 418 450 449 418 419 451 450 419 420 452 451 420 421 453 452 421 422 454 453 422 423 455 454 423 424 456 455 424 425 457 456 425 426 458 457 426 427 459 458 427 428 460 459 428 429 461 460 429 430 462 461 430 431 463 462 431 432 464 463 432 433 465 464 433 434 466 465 434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 416 448 479 448 449 481 480 449 450 482 481 450 451 483 482 451 452 484 483 452 453 485 484 453 454 486 485 454 455 487 486 455 456 488 487 456 457 489 488 457 458 490 489 458 459 491 490 459 460 492 491 460 461 493 492 461 462 494 493 462 463 495 494 463 464 496 495 464 465 497 496 465 466 498 497 466 467 499 498 467 468 500 499 468 469 501 500 469 470 502 501 470 471 503 502 471 472 504 503 472 473 505 504 473 474 506 505 474 475 507 506 475 476 508 507 476 477 509 508 477 478 510 509 478 479 511 510 479 448 480 511 480 481 513 512 481 482 514 513 482 483 515 514 483 484 516 515 484 485 517 516 485 486 518 517 486 487 519 518 487 488 520 519 488 489 521 520 489 490 522 521 490 491 523 522 491 492 524 523 492 493 525 524 493 494 526 525 494 495 527 526 495 496 528 527 496 497 529 528 497 498 530 529 498 499 531 530 499 500 532 531 500 501 533 532 501 502 534 533 502 503 535 534 503 504 536 535 504 505 537 536 505 506 538 537 506 507 539 538 507 508 540 539 508 509 541 540 509 510 542 541 510 511 543 542 511 480 512 543 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolySphere.3.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0.0050000000000000001 0 5 0.0049039264020161524 -0.00097545161008064129 5 0.0046193976625564341 -0.001913417161825449 5 0.0041573480615127263 -0.0027778511650980108 5 0.0035355339059327381 -0.0035355339059327372 5 0.0027778511650980117 -0.0041573480615127263 5 0.0019134171618254492 -0.0046193976625564341 5 0.00097545161008064172 -0.0049039264020161524 5 3.0615158845559431e-19 -0.0050000000000000001 5 -0.00097545161008064096 -0.0049039264020161524 5 -0.0019134171618254486 -0.0046193976625564341 5 -0.0027778511650980099 -0.0041573480615127271 5 -0.0035355339059327372 -0.0035355339059327381 5 -0.0041573480615127271 -0.0027778511650980108 5 -0.0046193976625564341 -0.0019134171618254495 5 -0.0049039264020161524 -0.00097545161008064302 5 -0.0050000000000000001 -6.1230317691118863e-19 5 -0.0049039264020161524 0.00097545161008064183 5 -0.0046193976625564341 0.0019134171618254484 5 -0.0041573480615127271 0.0027778511650980099 5 -0.0035355339059327385 0.0035355339059327372 5 -0.0027778511650980108 0.0041573480615127263 5 -0.0019134171618254516 0.0046193976625564324 5 -0.00097545161008064335 0.0049039264020161516 5 -9.1845476536678289e-19 0.0050000000000000001 5 0.0009754516100806415 0.0049039264020161524 5 0.0019134171618254501 0.0046193976625564332 5 0.0027778511650980091 0.0041573480615127271 5 0.0035355339059327368 0.0035355339059327385 5 0.0041573480615127263 0.0027778511650980108 5 0.0046193976625564324 0.0019134171618254521 5 0.0049039264020161516 0.00097545161008064367 5 0.97947615847056058 0 4.9039264020161522 0.96065579873382767 -0.19108631916314192 4.9039264020161522 0.90491797539373253 -0.3748292982432867 4.9039264020161522 0.81440466174310333 -0.5441677975986341 4.9039264020161522 0.69259423366508288 -0.69259423366508277 4.9039264020161522 0.54416779759863421 -0.81440466174310333 4.9039264020161522 0.37482929824328676 -0.90491797539373253 4.9039264020161522 0.191086319163142 -0.96065579873382767 4.9039264020161522 5.9973636354029111e-17 -0.97947615847056058 4.9039264020161522 -0.19108631916314187 -0.96065579873382767 4.9039264020161522 -0.3748292982432867 -0.90491797539373253 4.9039264020161522 -0.54416779759863387 -0.81440466174310355 4.9039264020161522 -0.69259423366508277 -0.69259423366508288 4.9039264020161522 -0.81440466174310344 -0.5441677975986341 4.9039264020161522 -0.90491797539373253 -0.37482929824328681 4.9039264020161522 -0.96065579873382767 -0.19108631916314228 4.9039264020161522 -0.97947615847056058 -1.1994727270805822e-16 4.9039264020161522 -0.96065579873382767 0.19108631916314203 4.9039264020161522 -0.90491797539373264 0.37482929824328665 4.9039264020161522 -0.81440466174310355 0.54416779759863387 4.9039264020161522 -0.69259423366508299 0.69259423366508277 4.9039264020161522 -0.5441677975986341 0.81440466174310333 4.9039264020161522 -0.37482929824328726 0.90491797539373231 4.9039264020161522 -0.19108631916314234 0.96065579873382756 4.9039264020161522 -1.7992090906208733e-16 0.97947615847056058 4.9039264020161522 0.19108631916314198 0.96065579873382767 4.9039264020161522 0.37482929824328692 0.90491797539373242 4.9039264020161522 0.54416779759863376 0.81440466174310355 4.9039264020161522 0.69259423366508266 0.69259423366508299 4.9039264020161522 0.81440466174310333 0.5441677975986341 4.9039264020161522 0.90491797539373231 0.37482929824328731 4.9039264020161522 0.96065579873382756 0.19108631916314239 4.9039264020161522 1.9165037446636235 0 4.6193976625564339 1.8796786626037532 -0.37389133269154196 4.6193976625564339 1.7706185836759589 -0.73341423114842308 4.6193976625564339 1.5935146255518391 -1.0647524320057096 4.6193976625564339 1.3551727940210598 -1.3551727940210596 4.6193976625564339 1.0647524320057096 -1.5935146255518391 4.6193976625564339 0.73341423114842319 -1.7706185836759589 4.6193976625564339 0.37389133269154212 -1.8796786626037532 4.6193976625564339 1.173481331419726e-16 -1.9165037446636235 4.6193976625564339 -0.37389133269154184 -1.8796786626037532 4.6193976625564339 -0.73341423114842297 -1.7706185836759589 4.6193976625564339 -1.0647524320057091 -1.5935146255518395 4.6193976625564339 -1.3551727940210596 -1.3551727940210598 4.6193976625564339 -1.5935146255518393 -1.0647524320057096 4.6193976625564339 -1.7706185836759589 -0.7334142311484233 4.6193976625564339 -1.8796786626037532 -0.37389133269154262 4.6193976625564339 -1.9165037446636235 -2.3469626628394521e-16 4.6193976625564339 -1.8796786626037532 0.37389133269154218 4.6193976625564339 -1.7706185836759591 0.73341423114842286 4.6193976625564339 -1.5935146255518395 1.0647524320057091 4.6193976625564339 -1.3551727940210601 1.3551727940210596 4.6193976625564339 -1.0647524320057096 1.5935146255518391 4.6193976625564339 -0.73341423114842408 1.7706185836759585 4.6193976625564339 -0.37389133269154273 1.8796786626037529 4.6193976625564339 -3.5204439942591786e-16 1.9165037446636235 4.6193976625564339 0.37389133269154207 1.8796786626037532 4.6193976625564339 0.73341423114842352 1.7706185836759587 4.6193976625564339 1.0647524320057089 1.5935146255518395 4.6193976625564339 1.3551727940210594 1.3551727940210601 4.6193976625564339 1.5935146255518391 1.0647524320057096 4.6193976625564339 1.7706185836759585 0.73341423114842419 4.6193976625564339 1.8796786626037529 0.37389133269154284 4.6193976625564339 2.7800733139329128 0 4.1573480615127263 2.7266549847472299 -0.54236539804361672 4.1573480615127263 2.5684528336234433 -1.0638879980024369 4.1573480615127263 2.3115464805084511 -1.5445259788332859 4.1573480615127263 1.9658086924777203 -1.9658086924777201 4.1573480615127263 1.5445259788332864 -2.3115464805084511 4.1573480615127263 1.0638879980024369 -2.5684528336234433 4.1573480615127263 0.54236539804361694 -2.7266549847472299 4.1573480615127263 1.7022477221671387e-16 -2.7800733139329128 4.1573480615127263 -0.54236539804361661 -2.7266549847472299 4.1573480615127263 -1.0638879980024367 -2.5684528336234433 4.1573480615127263 -1.5445259788332855 -2.3115464805084516 4.1573480615127263 -1.9658086924777201 -1.9658086924777203 4.1573480615127263 -2.3115464805084516 -1.5445259788332859 4.1573480615127263 -2.5684528336234433 -1.0638879980024372 4.1573480615127263 -2.7266549847472299 -0.54236539804361772 4.1573480615127263 -2.7800733139329128 -3.4044954443342775e-16 4.1573480615127263 -2.7266549847472299 0.54236539804361705 4.1573480615127263 -2.5684528336234433 1.0638879980024365 4.1573480615127263 -2.3115464805084516 1.5445259788332855 4.1573480615127263 -1.9658086924777207 1.9658086924777201 4.1573480615127263 -1.5445259788332859 2.3115464805084511 4.1573480615127263 -1.0638879980024385 2.5684528336234425 4.1573480615127263 -0.54236539804361794 2.7266549847472294 4.1573480615127263 -5.1067431665014159e-16 2.7800733139329128 4.1573480615127263 0.54236539804361694 2.7266549847472299 4.1573480615127263 1.0638879980024374 2.5684528336234429 4.1573480615127263 1.544525978833285 2.3115464805084516 4.1573480615127263 1.9658086924777198 1.9658086924777207 4.1573480615127263 2.3115464805084511 1.5445259788332859 4.1573480615127263 2.5684528336234425 1.0638879980024385 4.1573480615127263 2.7266549847472294 0.54236539804361805 4.1573480615127263 3.5369983720268046 0 3.5355339059327378 3.4690359400940789 -0.69003415136923063 3.5355339059327378 3.2677604024413065 -1.3535506772769523 3.5355339059327378 2.9409066651038609 -1.9650510097368854 3.5355339059327378 2.5010355339059327 -2.5010355339059323 3.5355339059327378 1.9650510097368858 -2.9409066651038609 3.5355339059327378 1.3535506772769526 -3.2677604024413065 3.5355339059327378 0.69003415136923096 -3.4690359400940789 3.5355339059327378 2.1657153399217148e-16 -3.5369983720268046 3.5355339059327378 -0.69003415136923052 -3.4690359400940789 3.5355339059327378 -1.3535506772769521 -3.2677604024413065 3.5355339059327378 -1.9650510097368845 -2.9409066651038618 3.5355339059327378 -2.5010355339059323 -2.5010355339059327 3.5355339059327378 -2.9409066651038613 -1.9650510097368854 3.5355339059327378 -3.2677604024413065 -1.3535506772769528 3.5355339059327378 -3.4690359400940789 -0.69003415136923196 3.5355339059327378 -3.5369983720268046 -4.3314306798434296e-16 3.5355339059327378 -3.4690359400940789 0.69003415136923107 3.5355339059327378 -3.2677604024413069 1.3535506772769519 3.5355339059327378 -2.9409066651038618 1.9650510097368845 3.5355339059327378 -2.5010355339059331 2.5010355339059323 3.5355339059327378 -1.9650510097368854 2.9409066651038609 3.5355339059327378 -1.3535506772769543 3.2677604024413056 3.5355339059327378 -0.69003415136923218 3.4690359400940785 3.5355339059327378 -6.4971460197651439e-16 3.5369983720268046 3.5355339059327378 0.69003415136923085 3.4690359400940789 3.5355339059327378 1.3535506772769532 3.2677604024413061 3.5355339059327378 1.9650510097368843 2.9409066651038618 3.5355339059327378 2.5010355339059318 2.5010355339059331 3.5355339059327378 2.9409066651038609 1.9650510097368854 3.5355339059327378 3.2677604024413056 1.3535506772769546 3.5355339059327378 3.4690359400940785 0.6900341513692323 3.5355339059327378 4.158190713451213 0 2.7778511650980113 4.0782922448623564 -0.81122276529167126 2.7778511650980113 3.8416672924360804 -1.5912706946521518 2.7778511650980113 3.4574092203933242 -2.3101669836120364 2.7778511650980113 2.9402848509482808 -2.9402848509482804 2.7778511650980113 2.3101669836120369 -3.4574092203933242 2.7778511650980113 1.591270694652152 -3.8416672924360804 2.7778511650980113 0.81122276529167159 -4.0782922448623564 2.7778511650980113 2.5460733840487798e-16 -4.158190713451213 2.7778511650980113 -0.81122276529167103 -4.0782922448623564 2.7778511650980113 -1.5912706946521515 -3.8416672924360804 2.7778511650980113 -2.3101669836120355 -3.4574092203933251 2.7778511650980113 -2.9402848509482804 -2.9402848509482808 2.7778511650980113 -3.4574092203933247 -2.3101669836120364 2.7778511650980113 -3.8416672924360804 -1.5912706946521522 2.7778511650980113 -4.0782922448623564 -0.8112227652916727 2.7778511650980113 -4.158190713451213 -5.0921467680975597e-16 2.7778511650980113 -4.0782922448623564 0.8112227652916717 2.7778511650980113 -3.8416672924360808 1.5912706946521513 2.7778511650980113 -3.4574092203933251 2.3101669836120355 2.7778511650980113 -2.9402848509482813 2.9402848509482804 2.7778511650980113 -2.3101669836120364 3.4574092203933242 2.7778511650980113 -1.591270694652154 3.8416672924360795 2.7778511650980113 -0.81122276529167292 4.0782922448623564 2.7778511650980113 -7.6382201521463395e-16 4.158190713451213 2.7778511650980113 0.81122276529167148 4.0782922448623564 2.7778511650980113 1.5912706946521527 3.84166729243608 2.7778511650980113 2.3101669836120351 3.4574092203933251 2.7778511650980113 2.94028485094828 2.9402848509482813 2.7778511650980113 3.4574092203933242 2.3101669836120364 2.7778511650980113 3.8416672924360795 1.5912706946521542 2.7778511650980113 4.0782922448623564 0.81122276529167314 2.7778511650980113 4.6197782648938777 0 1.9134171618254492 4.5310105209346911 -0.90127402934125678 1.9134171618254492 4.2681185836759594 -1.7679126031752281 1.9134171618254492 3.8412052428350374 -2.5666112871259852 1.9134171618254492 3.2666765386846834 -3.266676538684683 1.9134171618254492 2.5666112871259856 -3.8412052428350374 1.9134171618254492 1.7679126031752284 -4.2681185836759594 1.9134171618254492 0.90127402934125722 -4.5310105209346911 1.9134171618254492 2.8287049082197799e-16 -4.6197782648938777 1.9134171618254492 -0.90127402934125656 -4.5310105209346911 1.9134171618254492 -1.7679126031752277 -4.2681185836759594 1.9134171618254492 -2.5666112871259839 -3.8412052428350387 1.9134171618254492 -3.266676538684683 -3.2666765386846834 1.9134171618254492 -3.8412052428350383 -2.5666112871259852 1.9134171618254492 -4.2681185836759594 -1.7679126031752286 1.9134171618254492 -4.5310105209346911 -0.90127402934125844 1.9134171618254492 -4.6197782648938777 -5.6574098164395597e-16 1.9134171618254492 -4.5310105209346911 0.90127402934125733 1.9134171618254492 -4.2681185836759594 1.7679126031752275 1.9134171618254492 -3.8412052428350387 2.5666112871259839 1.9134171618254492 -3.2666765386846839 3.266676538684683 1.9134171618254492 -2.5666112871259852 3.8412052428350374 1.9134171618254492 -1.7679126031752306 4.2681185836759576 1.9134171618254492 -0.90127402934125878 4.5310105209346903 1.9134171618254492 -8.4861147246593396e-16 4.6197782648938777 1.9134171618254492 0.90127402934125711 4.5310105209346911 1.9134171618254492 1.767912603175229 4.2681185836759585 1.9134171618254492 2.5666112871259834 3.8412052428350387 1.9134171618254492 3.2666765386846826 3.2666765386846839 1.9134171618254492 3.8412052428350374 2.5666112871259852 1.9134171618254492 4.2681185836759576 1.7679126031752308 1.9134171618254492 4.5310105209346903 0.901274029341259 1.9134171618254492 4.904022475614136 0 0.97545161008064163 4.809793058848955 -0.95672732394189219 0.97545161008064163 4.5307259921952312 -1.8766881533635624 0.97545161008064163 4.0775456665218535 -2.7245289095103118 0.97545161008064163 3.4676675475979963 -3.4676675475979954 0.97545161008064163 2.7245289095103122 -4.0775456665218535 0.97545161008064163 1.8766881533635627 -4.5307259921952312 0.97545161008064163 0.95672732394189264 -4.809793058848955 0.97545161008064163 3.0027485414624075e-16 -4.904022475614136 0.97545161008064163 -0.95672732394189197 -4.809793058848955 0.97545161008064163 -1.876688153363562 -4.5307259921952312 0.97545161008064163 -2.7245289095103109 -4.0775456665218552 0.97545161008064163 -3.4676675475979954 -3.4676675475979963 0.97545161008064163 -4.0775456665218544 -2.7245289095103118 0.97545161008064163 -4.5307259921952312 -1.8766881533635629 0.97545161008064163 -4.809793058848955 -0.95672732394189397 0.97545161008064163 -4.904022475614136 -6.005497082924815e-16 0.97545161008064163 -4.809793058848955 0.95672732394189275 0.97545161008064163 -4.5307259921952312 1.8766881533635618 0.97545161008064163 -4.0775456665218552 2.7245289095103109 0.97545161008064163 -3.4676675475979968 3.4676675475979954 0.97545161008064163 -2.7245289095103118 4.0775456665218535 0.97545161008064163 -1.8766881533635651 4.5307259921952303 0.97545161008064163 -0.9567273239418943 4.8097930588489541 0.97545161008064163 -9.0082456243872235e-16 4.904022475614136 0.97545161008064163 0.95672732394189253 4.809793058848955 0.97545161008064163 1.8766881533635635 4.5307259921952303 0.97545161008064163 2.72452890951031 4.0775456665218552 0.97545161008064163 3.467667547597995 3.4676675475979968 0.97545161008064163 4.0775456665218535 2.7245289095103118 0.97545161008064163 4.5307259921952303 1.8766881533635653 0.97545161008064163 4.8097930588489541 0.95672732394189453 0.97545161008064163 5 0 3.0615158845559431e-16 4.9039264020161522 -0.97545161008064118 3.0615158845559431e-16 4.6193976625564339 -1.913417161825449 3.0615158845559431e-16 4.1573480615127263 -2.7778511650980109 3.0615158845559431e-16 3.5355339059327378 -3.5355339059327373 3.0615158845559431e-16 2.7778511650980113 -4.1573480615127263 3.0615158845559431e-16 1.9134171618254492 -4.6193976625564339 3.0615158845559431e-16 0.97545161008064163 -4.9039264020161522 3.0615158845559431e-16 3.0615158845559431e-16 -5 3.0615158845559431e-16 -0.97545161008064096 -4.9039264020161522 3.0615158845559431e-16 -1.9134171618254485 -4.6193976625564339 3.0615158845559431e-16 -2.77785116509801 -4.1573480615127272 3.0615158845559431e-16 -3.5355339059327373 -3.5355339059327378 3.0615158845559431e-16 -4.1573480615127263 -2.7778511650980109 3.0615158845559431e-16 -4.6193976625564339 -1.9134171618254494 3.0615158845559431e-16 -4.9039264020161522 -0.97545161008064307 3.0615158845559431e-16 -5 -6.1230317691118863e-16 3.0615158845559431e-16 -4.9039264020161522 0.97545161008064185 3.0615158845559431e-16 -4.6193976625564339 1.9134171618254483 3.0615158845559431e-16 -4.1573480615127272 2.77785116509801 3.0615158845559431e-16 -3.5355339059327386 3.5355339059327373 3.0615158845559431e-16 -2.7778511650980109 4.1573480615127263 3.0615158845559431e-16 -1.9134171618254516 4.6193976625564321 3.0615158845559431e-16 -0.97545161008064329 4.9039264020161513 3.0615158845559431e-16 -9.1845476536678294e-16 5 3.0615158845559431e-16 0.97545161008064152 4.9039264020161522 3.0615158845559431e-16 1.9134171618254501 4.619397662556433 3.0615158845559431e-16 2.7778511650980091 4.1573480615127272 3.0615158845559431e-16 3.5355339059327369 3.5355339059327386 3.0615158845559431e-16 4.1573480615127263 2.7778511650980109 3.0615158845559431e-16 4.6193976625564321 1.9134171618254521 3.0615158845559431e-16 4.9039264020161513 0.97545161008064363 3.0615158845559431e-16 4.904022475614136 0 -0.97545161008064096 4.809793058848955 -0.95672732394189219 -0.97545161008064096 4.5307259921952312 -1.8766881533635624 -0.97545161008064096 4.0775456665218535 -2.7245289095103118 -0.97545161008064096 3.4676675475979963 -3.4676675475979954 -0.97545161008064096 2.7245289095103122 -4.0775456665218535 -0.97545161008064096 1.8766881533635627 -4.5307259921952312 -0.97545161008064096 0.95672732394189264 -4.809793058848955 -0.97545161008064096 3.0027485414624075e-16 -4.904022475614136 -0.97545161008064096 -0.95672732394189197 -4.809793058848955 -0.97545161008064096 -1.876688153363562 -4.5307259921952312 -0.97545161008064096 -2.7245289095103109 -4.0775456665218552 -0.97545161008064096 -3.4676675475979954 -3.4676675475979963 -0.97545161008064096 -4.0775456665218544 -2.7245289095103118 -0.97545161008064096 -4.5307259921952312 -1.8766881533635629 -0.97545161008064096 -4.809793058848955 -0.95672732394189397 -0.97545161008064096 -4.904022475614136 -6.005497082924815e-16 -0.97545161008064096 -4.809793058848955 0.95672732394189275 -0.97545161008064096 -4.5307259921952312 1.8766881533635618 -0.97545161008064096 -4.0775456665218552 2.7245289095103109 -0.97545161008064096 -3.4676675475979968 3.4676675475979954 -0.97545161008064096 -2.7245289095103118 4.0775456665218535 -0.97545161008064096 -1.8766881533635651 4.5307259921952303 -0.97545161008064096 -0.9567273239418943 4.8097930588489541 -0.97545161008064096 -9.0082456243872235e-16 4.904022475614136 -0.97545161008064096 0.95672732394189253 4.809793058848955 -0.97545161008064096 1.8766881533635635 4.5307259921952303 -0.97545161008064096 2.72452890951031 4.0775456665218552 -0.97545161008064096 3.467667547597995 3.4676675475979968 -0.97545161008064096 4.0775456665218535 2.7245289095103118 -0.97545161008064096 4.5307259921952303 1.8766881533635653 -0.97545161008064096 4.8097930588489541 0.95672732394189453 -0.97545161008064096 4.6197782648938777 0 -1.9134171618254485 4.5310105209346911 -0.90127402934125678 -1.9134171618254485 4.2681185836759594 -1.7679126031752281 -1.9134171618254485 3.8412052428350374 -2.5666112871259852 -1.9134171618254485 3.2666765386846834 -3.266676538684683 -1.9134171618254485 2.5666112871259856 -3.8412052428350374 -1.9134171618254485 1.7679126031752284 -4.2681185836759594 -1.9134171618254485 0.90127402934125722 -4.5310105209346911 -1.9134171618254485 2.8287049082197799e-16 -4.6197782648938777 -1.9134171618254485 -0.90127402934125656 -4.5310105209346911 -1.9134171618254485 -1.7679126031752277 -4.2681185836759594 -1.9134171618254485 -2.5666112871259839 -3.8412052428350387 -1.9134171618254485 -3.266676538684683 -3.2666765386846834 -1.9134171618254485 -3.8412052428350383 -2.5666112871259852 -1.9134171618254485 -4.2681185836759594 -1.7679126031752286 -1.9134171618254485 -4.5310105209346911 -0.90127402934125844 -1.9134171618254485 -4.6197782648938777 -5.6574098164395597e-16 -1.9134171618254485 -4.5310105209346911 0.90127402934125733 -1.9134171618254485 -4.2681185836759594 1.7679126031752275 -1.9134171618254485 -3.8412052428350387 2.5666112871259839 -1.9134171618254485 -3.2666765386846839 3.266676538684683 -1.9134171618254485 -2.5666112871259852 3.8412052428350374 -1.9134171618254485 -1.7679126031752306 4.2681185836759576 -1.9134171618254485 -0.90127402934125878 4.5310105209346903 -1.9134171618254485 -8.4861147246593396e-16 4.6197782648938777 -1.9134171618254485 0.90127402934125711 4.5310105209346911 -1.9134171618254485 1.767912603175229 4.2681185836759585 -1.9134171618254485 2.5666112871259834 3.8412052428350387 -1.9134171618254485 3.2666765386846826 3.2666765386846839 -1.9134171618254485 3.8412052428350374 2.5666112871259852 -1.9134171618254485 4.2681185836759576 1.7679126031752308 -1.9134171618254485 4.5310105209346903 0.901274029341259 -1.9134171618254485 4.1581907134512148 0 -2.77785116509801 4.0782922448623582 -0.81122276529167159 -2.77785116509801 3.8416672924360822 -1.5912706946521524 -2.77785116509801 3.4574092203933255 -2.3101669836120373 -2.77785116509801 2.9402848509482822 -2.9402848509482817 -2.77785116509801 2.3101669836120378 -3.4574092203933255 -2.77785116509801 1.5912706946521527 -3.8416672924360822 -2.77785116509801 0.81122276529167192 -4.0782922448623582 -2.77785116509801 2.5460733840487808e-16 -4.1581907134512148 -2.77785116509801 -0.81122276529167137 -4.0782922448623582 -2.77785116509801 -1.5912706946521522 -3.8416672924360822 -2.77785116509801 -2.3101669836120364 -3.4574092203933264 -2.77785116509801 -2.9402848509482817 -2.9402848509482822 -2.77785116509801 -3.457409220393326 -2.3101669836120373 -2.77785116509801 -3.8416672924360822 -1.5912706946521529 -2.77785116509801 -4.0782922448623582 -0.81122276529167303 -2.77785116509801 -4.1581907134512148 -5.0921467680975617e-16 -2.77785116509801 -4.0782922448623582 0.81122276529167203 -2.77785116509801 -3.8416672924360826 1.591270694652152 -2.77785116509801 -3.4574092203933264 2.3101669836120364 -2.77785116509801 -2.9402848509482826 2.9402848509482817 -2.77785116509801 -2.3101669836120373 3.4574092203933255 -2.77785116509801 -1.5912706946521546 3.8416672924360813 -2.77785116509801 -0.81122276529167325 4.0782922448623582 -2.77785116509801 -7.6382201521463425e-16 4.1581907134512148 -2.77785116509801 0.81122276529167181 4.0782922448623582 -2.77785116509801 1.5912706946521533 3.8416672924360817 -2.77785116509801 2.310166983612036 3.4574092203933264 -2.77785116509801 2.9402848509482813 2.9402848509482826 -2.77785116509801 3.4574092203933255 2.3101669836120373 -2.77785116509801 3.8416672924360813 1.5912706946521549 -2.77785116509801 4.0782922448623582 0.81122276529167348 -2.77785116509801 3.536998372026805 0 -3.5355339059327373 3.4690359400940793 -0.69003415136923074 -3.5355339059327373 3.2677604024413069 -1.3535506772769526 -3.5355339059327373 2.9409066651038613 -1.9650510097368856 -3.5355339059327373 2.5010355339059331 -2.5010355339059327 -3.5355339059327373 1.9650510097368861 -2.9409066651038613 -3.5355339059327373 1.3535506772769528 -3.2677604024413069 -3.5355339059327373 0.69003415136923107 -3.4690359400940793 -3.5355339059327373 2.165715339921715e-16 -3.536998372026805 -3.5355339059327373 -0.69003415136923052 -3.4690359400940793 -3.5355339059327373 -1.3535506772769523 -3.2677604024413069 -3.5355339059327373 -1.9650510097368847 -2.9409066651038618 -3.5355339059327373 -2.5010355339059327 -2.5010355339059331 -3.5355339059327373 -2.9409066651038618 -1.9650510097368856 -3.5355339059327373 -3.2677604024413069 -1.353550677276953 -3.5355339059327373 -3.4690359400940793 -0.69003415136923207 -3.5355339059327373 -3.536998372026805 -4.3314306798434301e-16 -3.5355339059327373 -3.4690359400940793 0.69003415136923119 -3.5355339059327373 -3.2677604024413074 1.3535506772769521 -3.5355339059327373 -2.9409066651038618 1.9650510097368847 -3.5355339059327373 -2.5010355339059336 2.5010355339059327 -3.5355339059327373 -1.9650510097368856 2.9409066651038613 -3.5355339059327373 -1.3535506772769546 3.2677604024413061 -3.5355339059327373 -0.6900341513692323 3.4690359400940789 -3.5355339059327373 -6.4971460197651449e-16 3.536998372026805 -3.5355339059327373 0.69003415136923096 3.4690359400940793 -3.5355339059327373 1.3535506772769532 3.2677604024413065 -3.5355339059327373 1.9650510097368845 2.9409066651038618 -3.5355339059327373 2.5010355339059323 2.5010355339059336 -3.5355339059327373 2.9409066651038613 1.9650510097368856 -3.5355339059327373 3.2677604024413061 1.3535506772769546 -3.5355339059327373 3.4690359400940789 0.69003415136923241 -3.5355339059327373 2.7800733139329128 0 -4.1573480615127263 2.7266549847472299 -0.54236539804361672 -4.1573480615127263 2.5684528336234433 -1.0638879980024369 -4.1573480615127263 2.3115464805084511 -1.5445259788332859 -4.1573480615127263 1.9658086924777203 -1.9658086924777201 -4.1573480615127263 1.5445259788332864 -2.3115464805084511 -4.1573480615127263 1.0638879980024369 -2.5684528336234433 -4.1573480615127263 0.54236539804361694 -2.7266549847472299 -4.1573480615127263 1.7022477221671387e-16 -2.7800733139329128 -4.1573480615127263 -0.54236539804361661 -2.7266549847472299 -4.1573480615127263 -1.0638879980024367 -2.5684528336234433 -4.1573480615127263 -1.5445259788332855 -2.3115464805084516 -4.1573480615127263 -1.9658086924777201 -1.9658086924777203 -4.1573480615127263 -2.3115464805084516 -1.5445259788332859 -4.1573480615127263 -2.5684528336234433 -1.0638879980024372 -4.1573480615127263 -2.7266549847472299 -0.54236539804361772 -4.1573480615127263 -2.7800733139329128 -3.4044954443342775e-16 -4.1573480615127263 -2.7266549847472299 0.54236539804361705 -4.1573480615127263 -2.5684528336234433 1.0638879980024365 -4.1573480615127263 -2.3115464805084516 1.5445259788332855 -4.1573480615127263 -1.9658086924777207 1.9658086924777201 -4.1573480615127263 -1.5445259788332859 2.3115464805084511 -4.1573480615127263 -1.0638879980024385 2.5684528336234425 -4.1573480615127263 -0.54236539804361794 2.7266549847472294 -4.1573480615127263 -5.1067431665014159e-16 2.7800733139329128 -4.1573480615127263 0.54236539804361694 2.7266549847472299 -4.1573480615127263 1.0638879980024374 2.5684528336234429 -4.1573480615127263 1.544525978833285 2.3115464805084516 -4.1573480615127263 1.9658086924777198 1.9658086924777207 -4.1573480615127263 2.3115464805084511 1.5445259788332859 -4.1573480615127263 2.5684528336234425 1.0638879980024385 -4.1573480615127263 2.7266549847472294 0.54236539804361805 -4.1573480615127263 1.9165037446636239 0 -4.6193976625564339 1.8796786626037536 -0.37389133269154201 -4.6193976625564339 1.7706185836759594 -0.73341423114842319 -4.6193976625564339 1.5935146255518395 -1.0647524320057098 -4.6193976625564339 1.3551727940210603 -1.3551727940210601 -4.6193976625564339 1.06475243200571 -1.5935146255518395 -4.6193976625564339 0.7334142311484233 -1.7706185836759594 -4.6193976625564339 0.37389133269154218 -1.8796786626037536 -4.6193976625564339 1.1734813314197265e-16 -1.9165037446636239 -4.6193976625564339 -0.3738913326915419 -1.8796786626037536 -4.6193976625564339 -0.73341423114842308 -1.7706185836759594 -4.6193976625564339 -1.0647524320057093 -1.59351462555184 -4.6193976625564339 -1.3551727940210601 -1.3551727940210603 -4.6193976625564339 -1.5935146255518398 -1.0647524320057098 -4.6193976625564339 -1.7706185836759594 -0.73341423114842341 -4.6193976625564339 -1.8796786626037536 -0.37389133269154273 -4.6193976625564339 -1.9165037446636239 -2.3469626628394531e-16 -4.6193976625564339 -1.8796786626037536 0.37389133269154223 -4.6193976625564339 -1.7706185836759596 0.73341423114842297 -4.6193976625564339 -1.59351462555184 1.0647524320057093 -4.6193976625564339 -1.3551727940210603 1.3551727940210601 -4.6193976625564339 -1.0647524320057098 1.5935146255518395 -4.6193976625564339 -0.7334142311484243 1.7706185836759589 -4.6193976625564339 -0.37389133269154284 1.8796786626037534 -4.6193976625564339 -3.5204439942591791e-16 1.9165037446636239 -4.6193976625564339 0.37389133269154212 1.8796786626037536 -4.6193976625564339 0.73341423114842363 1.7706185836759591 -4.6193976625564339 1.0647524320057091 1.59351462555184 -4.6193976625564339 1.3551727940210598 1.3551727940210603 -4.6193976625564339 1.5935146255518395 1.0647524320057098 -4.6193976625564339 1.7706185836759589 0.73341423114842441 -4.6193976625564339 1.8796786626037534 0.37389133269154295 -4.6193976625564339 0.97947615847056235 0 -4.9039264020161522 0.96065579873382945 -0.19108631916314228 -4.9039264020161522 0.9049179753937342 -0.37482929824328742 -4.9039264020161522 0.81440466174310489 -0.54416779759863509 -4.9039264020161522 0.6925942336650841 -0.69259423366508399 -4.9039264020161522 0.54416779759863521 -0.81440466174310489 -4.9039264020161522 0.37482929824328748 -0.9049179753937342 -4.9039264020161522 0.19108631916314237 -0.96065579873382945 -4.9039264020161522 5.9973636354029222e-17 -0.97947615847056235 -4.9039264020161522 -0.19108631916314223 -0.96065579873382945 -4.9039264020161522 -0.37482929824328737 -0.9049179753937342 -4.9039264020161522 -0.54416779759863487 -0.81440466174310511 -4.9039264020161522 -0.69259423366508399 -0.6925942336650841 -4.9039264020161522 -0.814404661743105 -0.54416779759863509 -4.9039264020161522 -0.9049179753937342 -0.37482929824328753 -4.9039264020161522 -0.96065579873382945 -0.19108631916314262 -4.9039264020161522 -0.97947615847056235 -1.1994727270805844e-16 -4.9039264020161522 -0.96065579873382945 0.19108631916314239 -4.9039264020161522 -0.90491797539373431 0.37482929824328731 -4.9039264020161522 -0.81440466174310511 0.54416779759863487 -4.9039264020161522 -0.69259423366508421 0.69259423366508399 -4.9039264020161522 -0.54416779759863509 0.81440466174310489 -4.9039264020161522 -0.37482929824328798 0.90491797539373398 -4.9039264020161522 -0.19108631916314267 0.96065579873382934 -4.9039264020161522 -1.7992090906208765e-16 0.97947615847056235 -4.9039264020161522 0.19108631916314234 0.96065579873382945 -4.9039264020161522 0.37482929824328765 0.90491797539373409 -4.9039264020161522 0.54416779759863476 0.81440466174310511 -4.9039264020161522 0.69259423366508388 0.69259423366508421 -4.9039264020161522 0.81440466174310489 0.54416779759863509 -4.9039264020161522 0.90491797539373398 0.37482929824328803 -4.9039264020161522 0.96065579873382934 0.19108631916314273 -4.9039264020161522 0.0050000000000006116 0 -5 0.0049039264020167518 -0.00097545161008076055 -5 0.0046193976625569988 -0.001913417161825683 -5 0.0041573480615132346 -0.0027778511650983508 -5 0.0035355339059331705 -0.0035355339059331696 -5 0.0027778511650983512 -0.0041573480615132346 -5 0.0019134171618256832 -0.0046193976625569988 -5 0.00097545161008076098 -0.0049039264020167518 -5 3.0615158845563177e-19 -0.0050000000000006116 -5 -0.00097545161008076023 -0.0049039264020167518 -5 -0.0019134171618256828 -0.0046193976625569988 -5 -0.0027778511650983495 -0.0041573480615132354 -5 -0.0035355339059331696 -0.0035355339059331705 -5 -0.0041573480615132354 -0.0027778511650983508 -5 -0.0046193976625569988 -0.0019134171618256834 -5 -0.0049039264020167518 -0.00097545161008076239 -5 -0.0050000000000006116 -6.1230317691126354e-19 -5 -0.0049039264020167518 0.00097545161008076109 -5 -0.0046193976625569996 0.0019134171618256824 -5 -0.0041573480615132354 0.0027778511650983495 -5 -0.0035355339059331709 0.0035355339059331696 -5 -0.0027778511650983508 0.0041573480615132346 -5 -0.0019134171618256858 0.0046193976625569979 -5 -0.00097545161008076261 0.0049039264020167518 -5 -9.1845476536689536e-19 0.0050000000000006116 -5 0.00097545161008076088 0.0049039264020167518 -5 0.0019134171618256841 0.0046193976625569979 -5 0.0027778511650983491 0.0041573480615132354 -5 0.0035355339059331692 0.0035355339059331709 -5 0.0041573480615132346 0.0027778511650983508 -5 0.0046193976625569979 0.001913417161825686 -5 0.0049039264020167518 0.00097545161008076294 -5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1891 1888 1893 1894 1895 1892 1897 1898 1899 1896 1901 1902 1903 1900 1905 1906 1907 1904 1909 1910 1911 1908 1913 1914 1915 1912 1917 1918 1919 1916 1921 1922 1923 1920 1925 1926 1927 1924 1929 1930 1931 1928 1933 1934 1935 1932 1937 1938 1939 1936 1941 1942 1943 1940 1945 1946 1947 1944 1949 1950 1951 1948 1953 1954 1955 1952 1957 1958 1959 1956 1961 1962 1963 1960 1965 1966 1967 1964 1969 1970 1971 1968 1973 1974 1975 1972 1977 1978 1979 1976 1981 1982 1983 1980 1985 1986 1987 1984 1989 1990 1991 1988 1993 1994 1995 1992 1997 1998 1999 1996 2001 2002 2003 2000 2005 2006 2007 2004 2009 2010 2011 2008 2013 2014 2015 2012 2017 2018 2019 2016 2021 2022 2023 2020 2025 2026 2027 2024 2029 2030 2031 2028 2033 2034 2035 2032 2037 2038 2039 2036 2041 2042 2043 2040 2045 2046 2047 2044 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2048 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2080</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1900 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048 2080</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 160 161 193 192 161 162 194 193 162 163 195 194 163 164 196 195 164 165 197 196 165 166 198 197 166 167 199 198 167 168 200 199 168 169 201 200 169 170 202 201 170 171 203 202 171 172 204 203 172 173 205 204 173 174 206 205 174 175 207 206 175 176 208 207 176 177 209 208 177 178 210 209 178 179 211 210 179 180 212 211 180 181 213 212 181 182 214 213 182 183 215 214 183 184 216 215 184 185 217 216 185 186 218 217 186 187 219 218 187 188 220 219 188 189 221 220 189 190 222 221 190 191 223 222 191 160 192 223 192 193 225 224 193 194 226 225 194 195 227 226 195 196 228 227 196 197 229 228 197 198 230 229 198 199 231 230 199 200 232 231 200 201 233 232 201 202 234 233 202 203 235 234 203 204 236 235 204 205 237 236 205 206 238 237 206 207 239 238 207 208 240 239 208 209 241 240 209 210 242 241 210 211 243 242 211 212 244 243 212 213 245 244 213 214 246 245 214 215 247 246 215 216 248 247 216 217 249 248 217 218 250 249 218 219 251 250 219 220 252 251 220 221 253 252 221 222 254 253 222 223 255 254 223 192 224 255 224 225 257 256 225 226 258 257 226 227 259 258 227 228 260 259 228 229 261 260 229 230 262 261 230 231 263 262 231 232 264 263 232 233 265 264 233 234 266 265 234 235 267 266 235 236 268 267 236 237 269 268 237 238 270 269 238 239 271 270 239 240 272 271 240 241 273 272 241 242 274 273 242 243 275 274 243 244 276 275 244 245 277 276 245 246 278 277 246 247 279 278 247 248 280 279 248 249 281 280 249 250 282 281 250 251 283 282 251 252 284 283 252 253 285 284 253 254 286 285 254 255 287 286 255 224 256 287 256 257 289 288 257 258 290 289 258 259 291 290 259 260 292 291 260 261 293 292 261 262 294 293 262 263 295 294 263 264 296 295 264 265 297 296 265 266 298 297 266 267 299 298 267 268 300 299 268 269 301 300 269 270 302 301 270 271 303 302 271 272 304 303 272 273 305 304 273 274 306 305 274 275 307 306 275 276 308 307 276 277 309 308 277 278 310 309 278 279 311 310 279 280 312 311 280 281 313 312 281 282 314 313 282 283 315 314 283 284 316 315 284 285 317 316 285 286 318 317 286 287 319 318 287 256 288 319 288 289 321 320 289 290 322 321 290 291 323 322 291 292 324 323 292 293 325 324 293 294 326 325 294 295 327 326 295 296 328 327 296 297 329 328 297 298 330 329 298 299 331 330 299 300 332 331 300 301 333 332 301 302 334 333 302 303 335 334 303 304 336 335 304 305 337 336 305 306 338 337 306 307 339 338 307 308 340 339 308 309 341 340 309 310 342 341 310 311 343 342 311 312 344 343 312 313 345 344 313 314 346 345 314 315 347 346 315 316 348 347 316 317 349 348 317 318 350 349 318 319 351 350 319 288 320 351 320 321 353 352 321 322 354 353 322 323 355 354 323 324 356 355 324 325 357 356 325 326 358 357 326 327 359 358 327 328 360 359 328 329 361 360 329 330 362 361 330 331 363 362 331 332 364 363 332 333 365 364 333 334 366 365 334 335 367 366 335 336 368 367 336 337 369 368 337 338 370 369 338 339 371 370 339 340 372 371 340 341 373 372 341 342 374 373 342 343 375 374 343 344 376 375 344 345 377 376 345 346 378 377 346 347 379 378 347 348 380 379 348 349 381 380 349 350 382 381 350 351 383 382 351 320 352 383 352 353 385 384 353 354 386 385 354 355 387 386 355 356 388 387 356 357 389 388 357 358 390 389 358 359 391 390 359 360 392 391 360 361 393 392 361 362 394 393 362 363 395 394 363 364 396 395 364 365 397 396 365 366 398 397 366 367 399 398 367 368 400 399 368 369 401 400 369 370 402 401 370 371 403 402 371 372 404 403 372 373 405 404 373 374 406 405 374 375 407 406 375 376 408 407 376 377 409 408 377 378 410 409 378 379 411 410 379 380 412 411 380 381 413 412 381 382 414 413 382 383 415 414 383 352 384 415 384 385 417 416 385 386 418 417 386 387 419 418 387 388 420 419 388 389 421 420 389 390 422 421 390 391 423 422 391 392 424 423 392 393 425 424 393 394 426 425 394 395 427 426 395 396 428 427 396 397 429 428 397 398 430 429 398 399 431 430 399 400 432 431 400 401 433 432 401 402 434 433 402 403 435 434 403 404 436 435 404 405 437 436 405 406 438 437 406 407 439 438 407 408 440 439 408 409 441 440 409 410 442 441 410 411 443 442 411 412 444 443 412 413 445 444 413 414 446 445 414 415 447 446 415 384 416 447 416 417 449 448 417 418 450 449 418 419 451 450 419 420 452 451 420 421 453 452 421 422 454 453 422 423 455 454 423 424 456 455 424 425 457 456 425 426 458 457 426 427 459 458 427 428 460 459 428 429 461 460 429 430 462 461 430 431 463 462 431 432 464 463 432 433 465 464 433 434 466 465 434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 416 448 479 448 449 481 480 449 450 482 481 450 451 483 482 451 452 484 483 452 453 485 484 453 454 486 485 454 455 487 486 455 456 488 487 456 457 489 488 457 458 490 489 458 459 491 490 459 460 492 491 460 461 493 492 461 462 494 493 462 463 495 494 463 464 496 495 464 465 497 496 465 466 498 497 466 467 499 498 467 468 500 499 468 469 501 500 469 470 502 501 470 471 503 502 471 472 504 503 472 473 505 504 473 474 506 505 474 475 507 506 475 476 508 507 476 477 509 508 477 478 510 509 478 479 511 510 479 448 480 511 480 481 513 512 481 482 514 513 482 483 515 514 483 484 516 515 484 485 517 516 485 486 518 517 486 487 519 518 487 488 520 519 488 489 521 520 489 490 522 521 490 491 523 522 491 492 524 523 492 493 525 524 493 494 526 525 494 495 527 526 495 496 528 527 496 497 529 528 497 498 530 529 498 499 531 530 499 500 532 531 500 501 533 532 501 502 534 533 502 503 535 534 503 504 536 535 504 505 537 536 505 506 538 537 506 507 539 538 507 508 540 539 508 509 541 540 509 510 542 541 510 511 543 542 511 480 512 543 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyText.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5.8137583892617446 -3.1960545583534586e-11 6.2625838926174495 5.8137583892617446 -2.5731129130213376e-11 5.0419463087248326 3.7374161073825505 -2.5731129130213376e-11 5.0419463087248326 3.7374161073825505 0 0 2.1224832214765099 0 0 2.1224832214765099 -2.5731129130213376e-11 5.0419463087248326 0.041946308724832217 -2.5731129130213376e-11 5.0419463087248326 0.041946308724832217 -3.1960545583534586e-11 6.2625838926174495 11.270973154362416 -9.8685944501067937e-12 1.9337248322147651 7.7600671140939594 -9.8685944501067937e-12 1.9337248322147651 7.8267151379567483 -8.2202608868568534e-12 1.6107382550335574 7.9539522744220736 -6.8716243351069001e-12 1.3464765100671141 8.1417785234899327 -5.822684794856937e-12 1.1409395973154361 8.3887956748695007 -5.073442266106965e-12 0.99412751677852373 8.6936055182699477 -4.6238967488569792e-12 0.90604026845637586 9.0562080536912752 -4.4740482431069845e-12 0.87667785234899331 9.374533929903059 -4.5525403175474582e-12 0.89205816554809847 9.6975205070842652 -4.7880165408688785e-12 0.93819910514541394 10.025167785234899 -5.1804769130712453e-12 1.0151006711409396 10.360738255033556 -5.7465712681267811e-12 1.1260253542132737 10.701901565995525 -6.4744068674838984e-12 1.2686428038777033 11.048657718120804 -7.3639837111425962e-12 1.4429530201342282 11.048657718120804 -1.4556711987142343e-12 0.28523489932885904 10.693512304250561 -8.2773460319044701e-13 0.16219239373601793 10.338366890380314 -3.1396829776189367e-13 0.061521252796420588 9.9832214765100673 8.5627717571425544e-14 -0.016778523489932886 9.6280760626398223 3.8294618136109758e-13 -0.075037285607755411 9.2729306487695755 5.6133725963490076e-13 -0.10999254287844891 8.9177852348993287 6.2080095239283518e-13 -0.12164429530201343 8.1305928411633115 2.545046050039593e-13 -0.049869500372856083 7.4692393736017895 -8.4438443716266856e-13 0.16545488441461595 6.9337248322147653 -2.6758661741070482e-12 0.52432885906040272 6.5422259507829974 -5.1828554607815632e-12 1.0155667412378824 6.3073266219239379 -8.2797245796147869e-12 1.6223900074571216 6.2290268456375841 -1.196647353060672e-11 2.3447986577181208 6.3059284116331096 -1.5598515884261353e-11 3.0564876957494409 6.5366331096196868 -1.8673978073701722e-11 3.6591163310961972 6.9211409395973149 -2.1192860098927822e-11 4.1526845637583891 7.4431394481730049 -2.3060020051526965e-11 4.5185495898583152 8.0807233407904544 -2.4180316023086448e-11 4.7380686055182704 8.8338926174496635 -2.4553748013606275e-11 4.8112416107382554 9.5227442207307984 -2.4175558927665814e-11 4.7371364653243857 10.112788963460105 -2.3040991669844426e-11 4.5148210290827748 10.604026845637584 -2.1150046240142109e-11 4.1442953020134228 10.974552572706934 -1.8626407119495376e-11 3.6497949291573457 11.196868008948545 -1.5593758788840719e-11 3.0555555555555558 11.270973154362416 -1.2052101248178145e-11 2.3615771812080535 9.6993847874720363 -1.5960055136229595e-11 3.1273303504847134 9.615492170022371 -1.7130300609705742e-11 3.3566368381804623 9.4756711409395979 -1.8110262266356502e-11 3.5486577181208054 9.2934377330350486 -1.8859504795106476e-11 3.6954697986577183 9.0767151379567483 -1.930905031235646e-11 3.7835570469798658 8.8255033557046971 -1.9458898818106454e-11 3.8129194630872485 8.5528523489932891 -1.9318564503197731e-11 3.785421327367636 8.3165548098433995 -1.8897561558471554e-11 3.7029269202087995 8.1166107382550337 -1.8195889983927927e-11 3.5654362416107381 7.957680835197614 -1.7244470899800978e-11 3.3790082028337065 7.8444258016405666 -1.6045682853801021e-11 3.1441088739746457 7.776845637583893 -1.4599525845928054e-11 2.8607382550335569 9.7273489932885902 -1.4599525845928054e-11 2.8607382550335569 11.900167785234899 -2.3975760919999153e-11 4.6979865771812079 13.48993288590604 -2.3975760919999153e-11 4.6979865771812079 14.450503355704699 -1.6868660361570831e-11 3.3053691275167787 15.423657718120806 -2.3975760919999153e-11 4.6979865771812079 17.013422818791945 -2.3975760919999153e-11 4.6979865771812079 15.318791946308725 -1.2308984400892422e-11 2.4119127516778525 17.097315436241612 0 0 15.507550335570471 0 0 14.450503355704699 -7.5780530050711601e-12 1.4848993288590604 13.406040268456376 0 0 11.816275167785236 0 0 13.594798657718121 -1.2266170542106709e-11 2.4035234899328861 19.588926174496642 -2.3975760919999153e-11 4.6979865771812079 21.136744966442954 -2.3975760919999153e-11 4.6979865771812079 21.136744966442954 -1.8495586995427917e-11 3.6241610738255035 19.588926174496642 -1.8495586995427917e-11 3.6241610738255035 19.588926174496642 -8.3272955338211337e-12 1.6317114093959733 19.603374347501862 -7.3330625909084718e-12 1.4368941088739748 19.646718866517524 -6.5766844190275455e-12 1.2886838180462341 19.718959731543624 -6.0581610181783573e-12 1.1870805369127517 19.834079045488441 -5.7370570772855123e-12 1.1241610738255037 20.006058911260254 -5.544394712749804e-12 1.0864093959731544 20.234899328859061 -5.4801739245712348e-12 1.0738255033557047 21.006711409395972 -5.4801739245712348e-12 1.0738255033557047 21.006711409395972 0 0 19.718959731543624 0 0 19.183445190156601 -2.0931219850792907e-13 0.041014168530947054 18.76258389261745 -8.3724879403171629e-13 0.16405667412378822 18.456375838926174 -1.8838097865713618e-12 0.36912751677852351 18.25130499627144 -3.4465156322498786e-12 0.67533557046979875 18.128262490678598 -5.5943442146664694e-12 1.0961968680089487 18.087248322147651 -8.3272955338211337e-12 1.6317114093959733 18.087248322147651 -1.8495586995427917e-11 3.6241610738255035 17.340604026845636 -1.8495586995427917e-11 3.6241610738255035 17.340604026845636 -2.3975760919999153e-11 4.6979865771812079 18.087248322147651 -2.3975760919999153e-11 4.6979865771812079 18.087248322147651 -3.0783164466927481e-11 6.0318791946308723 19.588926174496642 -3.0783164466927481e-11 6.0318791946308723 24.047818791946309 -3.1960545583534586e-11 6.2625838926174495 24.047818791946309 -1.9694375041427875e-11 3.8590604026845639 23.833892617449663 -1.0746278555213906e-11 2.1057046979865772 22.751677852348994 -1.0746278555213906e-11 2.1057046979865772 22.537751677852349 -1.9694375041427875e-11 3.8590604026845639 22.537751677852349 -3.1960545583534586e-11 6.2625838926174495 24.047818791946309 -7.6208668638568729e-12 1.4932885906040267 24.047818791946309 0 0 22.537751677852349 0 0 22.537751677852349 -7.6208668638568729e-12 1.4932885906040267</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 4 5 6 7 0 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 8 48 49 50 51 52 53 54 55 56 57 58 59 47 61 62 63 64 65 66 67 68 69 70 71 60 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 72 99 100 101 102 103 98 105 106 107 104</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 3 4 5 6</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 2 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 8 47 60 72 98 104</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyText.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5.8137583892617446 -3.1960545596199193e-11 6.2625838926174495 5.8137583892617446 -2.5731129140409531e-11 5.0419463087248326 3.7374161073825505 -2.5731129140409531e-11 5.0419463087248326 3.7374161073825505 0 0 2.1224832214765099 0 0 2.1224832214765099 -2.5731129140409531e-11 5.0419463087248326 0.041946308724832217 -2.5731129140409531e-11 5.0419463087248326 0.041946308724832217 -3.1960545596199193e-11 6.2625838926174495 11.270973154362416 -9.8685944540172998e-12 1.9337248322147651 7.7600671140939594 -9.8685944540172998e-12 1.9337248322147651 7.8267151379567492 -8.2202608901141953e-12 1.6107382550335574 7.9539522744220728 -6.8716243378298333e-12 1.3464765100671141 8.1417785234899327 -5.82268479716422e-12 1.1409395973154361 8.3887956748695007 -5.0734422681173548e-12 0.99412751677852373 8.6936055182699477 -4.6238967506892336e-12 0.90604026845637586 9.0562080536912752 -4.4740482448798604e-12 0.87667785234899331 9.3745339299030572 -4.5525403193514373e-12 0.89205816554809847 9.6975205070842652 -4.7880165427661667e-12 0.93819910514541394 10.025167785234899 -5.1804769151240491e-12 1.0151006711409396 10.360738255033556 -5.7465712704039036e-12 1.1260253542132737 10.701901565995525 -6.4744068700494314e-12 1.2686428038777033 11.048657718120806 -7.3639837140606309e-12 1.4429530201342282 11.048657718120806 -1.455671199291055e-12 0.28523489932885904 10.693512304250559 -8.2773460351844321e-13 0.16219239373601793 10.338366890380314 -3.13968297886306e-13 0.061521252796420588 9.9832214765100673 8.562771760535618e-14 -0.016778523489932886 9.6280760626398223 3.8294618151284292e-13 -0.075037285607755411 9.2729306487695755 5.6133725985733489e-13 -0.10999254287844891 8.9177852348993287 6.2080095263883236e-13 -0.12164429530201343 8.1305928411633115 2.5450460510480869e-13 -0.049869500372856083 7.4692393736017895 -8.4438443749726231e-13 0.16545488441461595 6.9337248322147653 -2.6758661751673807e-12 0.52432885906040272 6.5422259507829974 -5.1828554628353097e-12 1.0155667412378824 6.307326621923937 -8.2797245828956906e-12 1.6223900074571216 6.2290268456375841 -1.1966473535348526e-11 2.3447986577181208 6.3059284116331096 -1.5598515890442386e-11 3.0564876957494409 6.5366331096196868 -1.8673978081101428e-11 3.6591163310961972 6.9211409395973158 -2.1192860107325654e-11 4.1526845637583891 7.4431394481730049 -2.3060020060664674e-11 4.5185495898583152 8.0807233407904544 -2.4180316032668082e-11 4.7380686055182704 8.8338926174496653 -2.4553748023335884e-11 4.8112416107382554 9.5227442207307984 -2.4175558937245564e-11 4.7371364653243857 10.112788963460105 -2.3040991678974596e-11 4.5148210290827748 10.604026845637584 -2.1150046248522977e-11 4.1442953020134228 10.974552572706935 -1.8626407126876231e-11 3.6497949291573457 11.196868008948545 -1.5593758795019865e-11 3.0555555555555558 11.270973154362416 -1.2052101252953882e-11 2.3615771812080535 9.6993847874720363 -1.5960055142553892e-11 3.1273303504847134 9.615492170022371 -1.7130300616493754e-11 3.3566368381804623 9.4756711409395979 -1.8110262273532833e-11 3.5486577181208054 9.2934377330350486 -1.88595048025797e-11 3.6954697986577183 9.0767151379567483 -1.9309050320007819e-11 3.7835570469798658 8.8255033557046971 -1.9458898825817193e-11 3.8129194630872485 8.5528523489932891 -1.9318564510852858e-11 3.785421327367636 8.3165548098433995 -1.8897561565959859e-11 3.7029269202087995 8.1166107382550337 -1.8195889991138189e-11 3.5654362416107381 7.957680835197614 -1.7244470906634233e-11 3.3790082028337065 7.8444258016405666 -1.6045682860159244e-11 3.1441088739746457 7.776845637583893 -1.4599525851713229e-11 2.8607382550335569 9.7273489932885902 -1.4599525851713229e-11 2.8607382550335569 11.900167785234899 -2.3975760929499729e-11 4.6979865771812079 13.489932885906041 -2.3975760929499729e-11 4.6979865771812079 14.450503355704699 -1.6868660368255168e-11 3.3053691275167787 15.423657718120806 -2.3975760929499729e-11 4.6979865771812079 17.013422818791948 -2.3975760929499729e-11 4.6979865771812079 15.318791946308725 -1.2308984405769951e-11 2.4119127516778525 17.097315436241612 0 0 15.507550335570469 0 0 14.450503355704699 -7.5780530080740212e-12 1.4848993288590604 13.406040268456376 0 0 11.816275167785236 0 0 13.594798657718121 -1.2266170546967273e-11 2.4035234899328861 19.588926174496645 -2.3975760929499729e-11 4.6979865771812079 21.136744966442954 -2.3975760929499729e-11 4.6979865771812079 21.136744966442954 -1.8495587002756934e-11 3.6241610738255035 19.588926174496645 -1.8495587002756934e-11 3.6241610738255035 19.588926174496645 -8.3272955371208881e-12 1.6317114093959733 19.603374347501862 -7.3330625938142539e-12 1.4368941088739748 19.646718866517524 -6.5766844216336071e-12 1.2886838180462341 19.718959731543624 -6.0581610205789501e-12 1.1870805369127517 19.834079045488441 -5.7370570795588655e-12 1.1241610738255037 20.006058911260254 -5.5443947149468126e-12 1.0864093959731544 20.234899328859061 -5.4801739267427955e-12 1.0738255033557047 21.006711409395972 -5.4801739267427955e-12 1.0738255033557047 21.006711409395972 0 0 19.718959731543624 0 0 19.183445190156601 -2.0931219859087064e-13 0.041014168530947054 18.76258389261745 -8.3724879436348256e-13 0.16405667412378822 18.456375838926174 -1.8838097873178358e-12 0.36912751677852351 18.25130499627144 -3.446515633615587e-12 0.67533557046979875 18.128262490678598 -5.5943442168832714e-12 1.0961968680089487 18.087248322147651 -8.3272955371208881e-12 1.6317114093959733 18.087248322147651 -1.8495587002756934e-11 3.6241610738255035 17.340604026845636 -1.8495587002756934e-11 3.6241610738255035 17.340604026845636 -2.3975760929499729e-11 4.6979865771812079 18.087248322147651 -2.3975760929499729e-11 4.6979865771812079 18.087248322147651 -3.0783164479125545e-11 6.0318791946308723 19.588926174496645 -3.0783164479125545e-11 6.0318791946308723 24.047818791946309 -3.1960545596199193e-11 6.2625838926174495 24.047818791946309 -1.969437504923192e-11 3.8590604026845639 23.833892617449663 -1.0746278559472201e-11 2.1057046979865772 22.751677852348994 -1.0746278559472201e-11 2.1057046979865772 22.537751677852349 -1.969437504923192e-11 3.8590604026845639 22.537751677852349 -3.1960545596199193e-11 6.2625838926174495 24.047818791946309 -7.6208668668766993e-12 1.4932885906040267 24.047818791946309 0 0 22.537751677852349 0 0 22.537751677852349 -7.6208668668766993e-12 1.4932885906040267</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 4 5 6 7 0 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 8 48 49 50 51 52 53 54 55 56 57 58 59 47 61 62 63 64 65 66 67 68 69 70 71 60 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 72 99 100 101 102 103 98 105 106 107 104</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 3 4 5 6</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 2 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 8 47 60 72 98 104</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyTorus.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 -3 0 -0.5852709660483848 -2.9423558412096913 0 -1.1480502970952693 -2.77163859753386 0 -1.6667106990588065 -2.4944088369076356 0 -2.1213203435596424 -2.1213203435596428 0 -2.4944088369076356 -1.666710699058807 0 -2.77163859753386 -1.1480502970952695 0 -2.9423558412096913 -0.58527096604838491 0 -3 -1.8369701987210297e-16 0 -2.9423558412096913 0.58527096604838458 0 -2.77163859753386 1.1480502970952693 0 -2.4944088369076365 1.6667106990588059 0 -2.1213203435596428 2.1213203435596424 0 -1.6667106990588065 2.494408836907636 0 -1.1480502970952695 2.77163859753386 0 -0.58527096604838569 2.9423558412096913 0 -3.6739403974420594e-16 3 0 0.58527096604838502 2.9423558412096913 0 1.1480502970952691 2.77163859753386 0 1.6667106990588059 2.4944088369076365 0 2.1213203435596424 2.1213203435596428 0 2.4944088369076356 1.6667106990588065 0 2.7716385975338595 1.1480502970952711 0 2.9423558412096908 0.58527096604838602 0 3 5.5109105961630896e-16 0 2.9423558412096913 -0.5852709660483848 0 2.77163859753386 -1.14805029709527 0 2.4944088369076365 -1.6667106990588056 0 2.1213203435596428 -2.1213203435596424 0 1.6667106990588065 -2.4944088369076356 0 1.1480502970952711 -2.7716385975338595 0 0.58527096604838613 -2.9423558412096908 0 0 -3.1522409349774265 0.76536686473017956 -0.61497169907716731 -3.0916715093103764 0.76536686473017956 -1.2063103806389013 -2.9122908813698865 0.76536686473017956 -1.7512912307793376 -2.6209925480898937 0.76536686473017956 -2.2289709410563607 -2.2289709410563612 0.76536686473017956 -2.6209925480898932 -1.7512912307793378 0.76536686473017956 -2.9122908813698865 -1.2063103806389015 0.76536686473017956 -3.0916715093103764 -0.61497169907716753 0.76536686473017956 -3.1522409349774265 -1.9301908855806826e-16 0.76536686473017956 -3.0916715093103764 0.6149716990771672 0.76536686473017956 -2.9122908813698865 1.2063103806389013 0.76536686473017956 -2.6209925480898941 1.7512912307793367 0.76536686473017956 -2.2289709410563612 2.2289709410563607 0.76536686473017956 -1.7512912307793376 2.6209925480898937 0.76536686473017956 -1.2063103806389015 2.9122908813698865 0.76536686473017956 -0.61497169907716842 3.0916715093103764 0.76536686473017956 -3.8603817711613653e-16 3.1522409349774265 0.76536686473017956 0.61497169907716764 3.0916715093103764 0.76536686473017956 1.2063103806389011 2.9122908813698865 0.76536686473017956 1.7512912307793367 2.6209925480898941 0.76536686473017956 2.2289709410563607 2.2289709410563616 0.76536686473017956 2.6209925480898937 1.7512912307793376 0.76536686473017956 2.9122908813698856 1.2063103806389031 0.76536686473017956 3.0916715093103764 0.61497169907716864 0.76536686473017956 3.1522409349774265 5.7905726567420479e-16 0.76536686473017956 3.0916715093103764 -0.61497169907716742 0.76536686473017956 2.912290881369886 -1.2063103806389022 0.76536686473017956 2.6209925480898946 -1.7512912307793365 0.76536686473017956 2.2289709410563616 -2.2289709410563607 0.76536686473017956 1.7512912307793376 -2.6209925480898937 0.76536686473017956 1.2063103806389033 -2.9122908813698856 0.76536686473017956 0.61497169907716887 -3.0916715093103764 0.76536686473017956 0 -3.5857864376269051 1.4142135623730949 -0.69955223079769824 -3.5168865566940046 1.4142135623730949 -1.3722210616792521 -3.3128346976800573 1.4142135623730949 -1.9921562067109089 -2.9814724590933674 1.4142135623730949 -2.5355339059327373 -2.5355339059327378 1.4142135623730949 -2.981472459093367 -1.9921562067109093 1.4142135623730949 -3.3128346976800573 -1.3722210616792521 1.4142135623730949 -3.5168865566940046 -0.69955223079769846 1.4142135623730949 -3.5857864376269051 -2.1956609416328899e-16 1.4142135623730949 -3.5168865566940046 0.69955223079769813 1.4142135623730949 -3.3128346976800573 1.3722210616792518 1.4142135623730949 -2.9814724590933683 1.992156206710908 1.4142135623730949 -2.5355339059327378 2.5355339059327373 1.4142135623730949 -1.9921562067109089 2.9814724590933679 1.4142135623730949 -1.3722210616792521 3.3128346976800573 1.4142135623730949 -0.69955223079769946 3.5168865566940046 1.4142135623730949 -4.3913218832657797e-16 3.5857864376269051 1.4142135623730949 0.69955223079769868 3.5168865566940046 1.4142135623730949 1.3722210616792516 3.3128346976800573 1.4142135623730949 1.992156206710908 2.9814724590933683 1.4142135623730949 2.5355339059327373 2.5355339059327382 1.4142135623730949 2.9814724590933674 1.9921562067109089 1.4142135623730949 3.3128346976800565 1.3722210616792538 1.4142135623730949 3.5168865566940046 0.69955223079769979 1.4142135623730949 3.5857864376269051 6.5869828248986693e-16 1.4142135623730949 3.5168865566940046 -0.69955223079769835 1.4142135623730949 3.3128346976800569 -1.3722210616792527 1.4142135623730949 2.9814724590933688 -1.9921562067109075 1.4142135623730949 2.5355339059327382 -2.5355339059327373 1.4142135623730949 1.9921562067109089 -2.9814724590933674 1.4142135623730949 1.3722210616792541 -3.3128346976800565 1.4142135623730949 0.69955223079770001 -3.5168865566940046 1.4142135623730949 0 -4.2346331352698208 1.8477590650225735 -0.8261359419799561 -4.153265846980422 1.8477590650225735 -1.6205239430119966 -3.9122908813698865 1.8477590650225735 -2.3526361177143831 -3.5209687712263094 1.8477590650225735 -2.9943378057865404 -2.9943378057865409 1.8477590650225735 -3.5209687712263089 -2.3526361177143835 1.8477590650225735 -3.9122908813698865 -1.6205239430119969 1.8477590650225735 -4.153265846980422 -0.82613594197995632 1.8477590650225735 -4.2346331352698208 -2.5929649573357535e-16 1.8477590650225735 -4.153265846980422 0.82613594197995588 1.8477590650225735 -3.9122908813698865 1.6205239430119962 1.8477590650225735 -3.5209687712263102 2.3526361177143817 1.8477590650225735 -2.9943378057865409 2.9943378057865404 1.8477590650225735 -2.3526361177143831 3.5209687712263098 1.8477590650225735 -1.6205239430119969 3.9122908813698865 1.8477590650225735 -0.82613594197995754 4.153265846980422 1.8477590650225735 -5.1859299146715069e-16 4.2346331352698208 1.8477590650225735 0.82613594197995655 4.153265846980422 1.8477590650225735 1.620523943011996 3.9122908813698865 1.8477590650225735 2.3526361177143817 3.5209687712263102 1.8477590650225735 2.9943378057865404 2.9943378057865417 1.8477590650225735 3.5209687712263094 2.3526361177143831 1.8477590650225735 3.9122908813698856 1.6205239430119989 1.8477590650225735 4.1532658469804211 0.82613594197995788 1.8477590650225735 4.2346331352698208 7.7788948720072599e-16 1.8477590650225735 4.153265846980422 -0.82613594197995621 1.8477590650225735 3.912290881369886 -1.6205239430119975 1.8477590650225735 3.5209687712263107 -2.3526361177143813 1.8477590650225735 2.9943378057865417 -2.9943378057865404 1.8477590650225735 2.3526361177143831 -3.5209687712263094 1.8477590650225735 1.6205239430119991 -3.9122908813698856 1.8477590650225735 0.8261359419799581 -4.1532658469804211 1.8477590650225735 0 -5 2 -0.97545161008064118 -4.9039264020161522 2 -1.913417161825449 -4.6193976625564339 2 -2.7778511650980109 -4.1573480615127263 2 -3.5355339059327373 -3.5355339059327378 2 -4.1573480615127254 -2.7778511650980113 2 -4.6193976625564339 -1.9134171618254492 2 -4.9039264020161522 -0.97545161008064152 2 -5 -3.0616169978683831e-16 2 -4.9039264020161522 0.97545161008064096 2 -4.6193976625564339 1.9134171618254485 2 -4.1573480615127272 2.77785116509801 2 -3.5355339059327378 3.5355339059327373 2 -2.7778511650980109 4.1573480615127263 2 -1.9134171618254492 4.6193976625564339 2 -0.97545161008064296 4.9039264020161522 2 -6.1232339957367663e-16 5 2 0.97545161008064185 4.9039264020161522 2 1.9134171618254483 4.6193976625564339 2 2.77785116509801 4.1573480615127272 2 3.5355339059327373 3.5355339059327386 2 4.1573480615127263 2.7778511650980109 2 4.6193976625564321 1.9134171618254516 2 4.9039264020161513 0.97545161008064329 2 5 9.1848509936051479e-16 2 4.9039264020161522 -0.97545161008064141 2 4.619397662556433 -1.9134171618254501 2 4.1573480615127281 -2.7778511650980091 2 3.5355339059327386 -3.5355339059327373 2 2.7778511650980109 -4.1573480615127263 2 1.9134171618254521 -4.6193976625564321 2 0.97545161008064363 -4.9039264020161513 2 0 -5.7653668647301792 1.8477590650225735 -1.1247672781813263 -5.6545869570518823 1.8477590650225735 -2.2063103806389011 -5.3265044437429809 1.8477590650225735 -3.2030662124816387 -4.7937273517991432 1.8477590650225735 -4.0767300060789342 -4.0767300060789351 1.8477590650225735 -4.7937273517991423 -3.2030662124816396 1.8477590650225735 -5.3265044437429809 -2.2063103806389015 1.8477590650225735 -5.6545869570518823 -1.1247672781813267 1.8477590650225735 -5.7653668647301792 -3.5302690384010128e-16 1.8477590650225735 -5.6545869570518823 1.124767278181326 1.8477590650225735 -5.3265044437429809 2.2063103806389011 1.8477590650225735 -4.7937273517991441 3.2030662124816378 1.8477590650225735 -4.0767300060789351 4.0767300060789342 1.8477590650225735 -3.2030662124816387 4.7937273517991432 1.8477590650225735 -2.2063103806389015 5.3265044437429809 1.8477590650225735 -1.1247672781813283 5.6545869570518823 1.8477590650225735 -7.0605380768020256e-16 5.7653668647301792 1.8477590650225735 1.1247672781813269 5.6545869570518823 1.8477590650225735 2.2063103806389006 5.3265044437429809 1.8477590650225735 3.2030662124816378 4.7937273517991441 1.8477590650225735 4.0767300060789342 4.0767300060789351 1.8477590650225735 4.7937273517991432 3.2030662124816387 1.8477590650225735 5.32650444374298 2.2063103806389046 1.8477590650225735 5.6545869570518814 1.1247672781813287 1.8477590650225735 5.7653668647301792 1.0590807115203037e-15 1.8477590650225735 5.6545869570518823 -1.1247672781813265 1.8477590650225735 5.32650444374298 -2.2063103806389024 1.8477590650225735 4.793727351799145 -3.2030662124816369 1.8477590650225735 4.0767300060789351 -4.0767300060789342 1.8477590650225735 3.2030662124816387 -4.7937273517991432 1.8477590650225735 2.2063103806389046 -5.32650444374298 1.8477590650225735 1.1247672781813292 -5.6545869570518814 1.8477590650225735 0 -6.4142135623730949 1.4142135623730951 -1.2513509893635841 -6.2909662473382992 1.4142135623730951 -2.4546132619716459 -5.9259606274328105 1.4142135623730951 -3.5635461234851129 -5.3332236639320847 1.4142135623730951 -4.5355339059327369 -4.5355339059327378 1.4142135623730951 -5.3332236639320838 -3.5635461234851138 1.4142135623730951 -5.9259606274328105 -2.4546132619716463 1.4142135623730951 -6.2909662473382992 -1.2513509893635846 1.4142135623730951 -6.4142135623730949 -3.9275730541038762e-16 1.4142135623730951 -6.2909662473382992 1.2513509893635839 1.4142135623730951 -5.9259606274328105 2.4546132619716454 1.4142135623730951 -5.3332236639320865 3.5635461234851116 1.4142135623730951 -4.5355339059327378 4.5355339059327369 1.4142135623730951 -3.5635461234851129 5.3332236639320856 1.4142135623730951 -2.4546132619716463 5.9259606274328105 1.4142135623730951 -1.2513509893635864 6.2909662473382992 1.4142135623730951 -7.8551461082077524e-16 6.4142135623730949 1.4142135623730951 1.251350989363585 6.2909662473382992 1.4142135623730951 2.454613261971645 5.9259606274328105 1.4142135623730951 3.5635461234851116 5.3332236639320865 1.4142135623730951 4.5355339059327369 4.5355339059327386 1.4142135623730951 5.3332236639320847 3.5635461234851129 1.4142135623730951 5.9259606274328087 2.4546132619716494 1.4142135623730951 6.2909662473382983 1.2513509893635868 1.4142135623730951 6.4142135623730949 1.1782719162311628e-15 1.4142135623730951 6.2909662473382992 -1.2513509893635844 1.4142135623730951 5.9259606274328096 -2.4546132619716472 1.4142135623730951 5.3332236639320874 -3.5635461234851107 1.4142135623730951 4.5355339059327386 -4.5355339059327369 1.4142135623730951 3.5635461234851129 -5.3332236639320847 1.4142135623730951 2.4546132619716499 -5.9259606274328087 1.4142135623730951 1.2513509893635872 -6.2909662473382983 1.4142135623730951 0 -6.8477590650225739 0.76536686473017967 -1.3359315210841152 -6.7161812947219284 0.76536686473017967 -2.6205239430119964 -6.3265044437429818 0.76536686473017967 -3.8044110994166846 -5.6937035749355589 0.76536686473017967 -4.8420968708091143 -4.8420968708091143 0.76536686473017967 -5.693703574935558 -3.8044110994166851 0.76536686473017967 -6.3265044437429818 -2.6205239430119969 0.76536686473017967 -6.7161812947219284 -1.3359315210841156 0.76536686473017967 -6.8477590650225739 -4.1930431101560836e-16 0.76536686473017967 -6.7161812947219284 1.3359315210841149 0.76536686473017967 -6.3265044437429818 2.6205239430119964 0.76536686473017967 -5.6937035749355607 3.8044110994166829 0.76536686473017967 -4.8420968708091143 4.8420968708091143 0.76536686473017967 -3.8044110994166846 5.6937035749355598 0.76536686473017967 -2.6205239430119969 6.3265044437429818 0.76536686473017967 -1.3359315210841176 6.7161812947219284 0.76536686473017967 -8.3860862203121673e-16 6.8477590650225739 0.76536686473017967 1.3359315210841161 6.7161812947219284 0.76536686473017967 2.620523943011996 6.3265044437429818 0.76536686473017967 3.8044110994166829 5.6937035749355607 0.76536686473017967 4.8420968708091143 4.8420968708091152 0.76536686473017967 5.6937035749355589 3.8044110994166846 0.76536686473017967 6.32650444374298 2.6205239430120004 0.76536686473017967 6.7161812947219275 1.3359315210841181 0.76536686473017967 6.8477590650225739 1.257912933046825e-15 0.76536686473017967 6.7161812947219284 -1.3359315210841154 0.76536686473017967 6.3265044437429809 -2.6205239430119982 0.76536686473017967 5.6937035749355616 -3.8044110994166824 0.76536686473017967 4.8420968708091152 -4.8420968708091143 0.76536686473017967 3.8044110994166846 -5.6937035749355589 0.76536686473017967 2.6205239430120009 -6.32650444374298 0.76536686473017967 1.3359315210841185 -6.7161812947219275 0.76536686473017967 0 -7 2.4492935982947064e-16 -1.3656322541128978 -6.865496962822613 2.4492935982947064e-16 -2.6787840265556286 -6.4671567275790069 2.4492935982947064e-16 -3.8889916311372152 -5.820287286117817 2.4492935982947064e-16 -4.9497474683058318 -4.9497474683058327 2.4492935982947064e-16 -5.8202872861178161 -3.8889916311372161 2.4492935982947064e-16 -6.4671567275790069 -2.6787840265556291 2.4492935982947064e-16 -6.865496962822613 -1.365632254112898 2.4492935982947064e-16 -7 -4.2862637970157361e-16 2.4492935982947064e-16 -6.865496962822613 1.3656322541128973 2.4492935982947064e-16 -6.4671567275790069 2.6787840265556282 2.4492935982947064e-16 -5.8202872861178179 3.8889916311372135 2.4492935982947064e-16 -4.9497474683058327 4.9497474683058318 2.4492935982947064e-16 -3.8889916311372152 5.8202872861178179 2.4492935982947064e-16 -2.6787840265556291 6.4671567275790069 2.4492935982947064e-16 -1.3656322541129 6.865496962822613 2.4492935982947064e-16 -8.5725275940314722e-16 7 2.4492935982947064e-16 1.3656322541128985 6.865496962822613 2.4492935982947064e-16 2.6787840265556278 6.4671567275790069 2.4492935982947064e-16 3.8889916311372135 5.8202872861178179 2.4492935982947064e-16 4.9497474683058318 4.9497474683058336 2.4492935982947064e-16 5.820287286117817 3.8889916311372152 2.4492935982947064e-16 6.4671567275790061 2.6787840265556322 2.4492935982947064e-16 6.8654969628226121 1.3656322541129007 2.4492935982947064e-16 7 1.2858791391047208e-15 2.4492935982947064e-16 6.865496962822613 -1.365632254112898 2.4492935982947064e-16 6.4671567275790061 -2.67878402655563 2.4492935982947064e-16 5.8202872861178188 -3.888991631137213 2.4492935982947064e-16 4.9497474683058336 -4.9497474683058318 2.4492935982947064e-16 3.8889916311372152 -5.820287286117817 2.4492935982947064e-16 2.6787840265556326 -6.4671567275790061 2.4492935982947064e-16 1.3656322541129011 -6.8654969628226121 2.4492935982947064e-16 0 -6.8477590650225739 -0.76536686473017934 -1.3359315210841152 -6.7161812947219284 -0.76536686473017934 -2.6205239430119964 -6.3265044437429818 -0.76536686473017934 -3.8044110994166846 -5.6937035749355589 -0.76536686473017934 -4.8420968708091143 -4.8420968708091143 -0.76536686473017934 -5.693703574935558 -3.8044110994166851 -0.76536686473017934 -6.3265044437429818 -2.6205239430119969 -0.76536686473017934 -6.7161812947219284 -1.3359315210841156 -0.76536686473017934 -6.8477590650225739 -4.1930431101560836e-16 -0.76536686473017934 -6.7161812947219284 1.3359315210841149 -0.76536686473017934 -6.3265044437429818 2.6205239430119964 -0.76536686473017934 -5.6937035749355607 3.8044110994166829 -0.76536686473017934 -4.8420968708091143 4.8420968708091143 -0.76536686473017934 -3.8044110994166846 5.6937035749355598 -0.76536686473017934 -2.6205239430119969 6.3265044437429818 -0.76536686473017934 -1.3359315210841176 6.7161812947219284 -0.76536686473017934 -8.3860862203121673e-16 6.8477590650225739 -0.76536686473017934 1.3359315210841161 6.7161812947219284 -0.76536686473017934 2.620523943011996 6.3265044437429818 -0.76536686473017934 3.8044110994166829 5.6937035749355607 -0.76536686473017934 4.8420968708091143 4.8420968708091152 -0.76536686473017934 5.6937035749355589 3.8044110994166846 -0.76536686473017934 6.32650444374298 2.6205239430120004 -0.76536686473017934 6.7161812947219275 1.3359315210841181 -0.76536686473017934 6.8477590650225739 1.257912933046825e-15 -0.76536686473017934 6.7161812947219284 -1.3359315210841154 -0.76536686473017934 6.3265044437429809 -2.6205239430119982 -0.76536686473017934 5.6937035749355616 -3.8044110994166824 -0.76536686473017934 4.8420968708091152 -4.8420968708091143 -0.76536686473017934 3.8044110994166846 -5.6937035749355589 -0.76536686473017934 2.6205239430120009 -6.32650444374298 -0.76536686473017934 1.3359315210841185 -6.7161812947219275 -0.76536686473017934 0 -6.4142135623730958 -1.4142135623730949 -1.2513509893635844 -6.2909662473383001 -1.4142135623730949 -2.4546132619716463 -5.9259606274328105 -1.4142135623730949 -3.5635461234851133 -5.3332236639320856 -1.4142135623730949 -4.5355339059327378 -4.5355339059327386 -1.4142135623730949 -5.3332236639320847 -3.5635461234851142 -1.4142135623730949 -5.9259606274328105 -2.4546132619716468 -1.4142135623730949 -6.2909662473383001 -1.2513509893635848 -1.4142135623730949 -6.4142135623730958 -3.9275730541038767e-16 -1.4142135623730949 -6.2909662473383001 1.2513509893635839 -1.4142135623730949 -5.9259606274328105 2.4546132619716459 -1.4142135623730949 -5.3332236639320874 3.563546123485112 -1.4142135623730949 -4.5355339059327386 4.5355339059327378 -1.4142135623730949 -3.5635461234851133 5.3332236639320865 -1.4142135623730949 -2.4546132619716468 5.9259606274328105 -1.4142135623730949 -1.2513509893635866 6.2909662473383001 -1.4142135623730949 -7.8551461082077533e-16 6.4142135623730958 -1.4142135623730949 1.251350989363585 6.2909662473383001 -1.4142135623730949 2.4546132619716454 5.9259606274328105 -1.4142135623730949 3.563546123485112 5.3332236639320874 -1.4142135623730949 4.5355339059327378 4.5355339059327395 -1.4142135623730949 5.3332236639320856 3.5635461234851133 -1.4142135623730949 5.9259606274328096 2.4546132619716499 -1.4142135623730949 6.2909662473382992 1.251350989363587 -1.4142135623730949 6.4142135623730958 1.178271916231163e-15 -1.4142135623730949 6.2909662473383001 -1.2513509893635846 -1.4142135623730949 5.9259606274328105 -2.4546132619716476 -1.4142135623730949 5.3332236639320874 -3.5635461234851111 -1.4142135623730949 4.5355339059327395 -4.5355339059327378 -1.4142135623730949 3.5635461234851133 -5.3332236639320856 -1.4142135623730949 2.4546132619716503 -5.9259606274328096 -1.4142135623730949 1.2513509893635875 -6.2909662473382992 -1.4142135623730949 0 -5.765366864730181 -1.847759065022573 -1.1247672781813267 -5.6545869570518841 -1.847759065022573 -2.2063103806389019 -5.3265044437429827 -1.847759065022573 -3.20306621248164 -4.7937273517991441 -1.847759065022573 -4.0767300060789351 -4.076730006078936 -1.847759065022573 -4.7937273517991441 -3.2030662124816405 -1.847759065022573 -5.3265044437429827 -2.2063103806389024 -1.847759065022573 -5.6545869570518841 -1.1247672781813269 -1.847759065022573 -5.765366864730181 -3.5302690384010138e-16 -1.847759065022573 -5.6545869570518841 1.1247672781813265 -1.847759065022573 -5.3265044437429827 2.2063103806389015 -1.847759065022573 -4.7937273517991459 3.2030662124816387 -1.847759065022573 -4.076730006078936 4.0767300060789351 -1.847759065022573 -3.20306621248164 4.793727351799145 -1.847759065022573 -2.2063103806389024 5.3265044437429827 -1.847759065022573 -1.1247672781813287 5.6545869570518841 -1.847759065022573 -7.0605380768020276e-16 5.765366864730181 -1.847759065022573 1.1247672781813274 5.6545869570518841 -1.847759065022573 2.2063103806389015 5.3265044437429827 -1.847759065022573 3.2030662124816387 4.7937273517991459 -1.847759065022573 4.0767300060789351 4.0767300060789369 -1.847759065022573 4.7937273517991441 3.20306621248164 -1.847759065022573 5.3265044437429809 2.2063103806389051 -1.847759065022573 5.6545869570518832 1.1247672781813292 -1.847759065022573 5.765366864730181 1.0590807115203041e-15 -1.847759065022573 5.6545869570518841 -1.1247672781813269 -1.847759065022573 5.3265044437429818 -2.2063103806389033 -1.847759065022573 4.7937273517991459 -3.2030662124816378 -1.847759065022573 4.0767300060789369 -4.0767300060789351 -1.847759065022573 3.20306621248164 -4.7937273517991441 -1.847759065022573 2.2063103806389055 -5.3265044437429809 -1.847759065022573 1.1247672781813294 -5.6545869570518832 -1.847759065022573 0 -5 -2 -0.97545161008064118 -4.9039264020161522 -2 -1.913417161825449 -4.6193976625564339 -2 -2.7778511650980109 -4.1573480615127263 -2 -3.5355339059327373 -3.5355339059327378 -2 -4.1573480615127254 -2.7778511650980113 -2 -4.6193976625564339 -1.9134171618254492 -2 -4.9039264020161522 -0.97545161008064152 -2 -5 -3.0616169978683831e-16 -2 -4.9039264020161522 0.97545161008064096 -2 -4.6193976625564339 1.9134171618254485 -2 -4.1573480615127272 2.77785116509801 -2 -3.5355339059327378 3.5355339059327373 -2 -2.7778511650980109 4.1573480615127263 -2 -1.9134171618254492 4.6193976625564339 -2 -0.97545161008064296 4.9039264020161522 -2 -6.1232339957367663e-16 5 -2 0.97545161008064185 4.9039264020161522 -2 1.9134171618254483 4.6193976625564339 -2 2.77785116509801 4.1573480615127272 -2 3.5355339059327373 3.5355339059327386 -2 4.1573480615127263 2.7778511650980109 -2 4.6193976625564321 1.9134171618254516 -2 4.9039264020161513 0.97545161008064329 -2 5 9.1848509936051479e-16 -2 4.9039264020161522 -0.97545161008064141 -2 4.619397662556433 -1.9134171618254501 -2 4.1573480615127281 -2.7778511650980091 -2 3.5355339059327386 -3.5355339059327373 -2 2.7778511650980109 -4.1573480615127263 -2 1.9134171618254521 -4.6193976625564321 -2 0.97545161008064363 -4.9039264020161513 -2 0 -4.2346331352698199 -1.8477590650225733 -0.82613594197995588 -4.1532658469804211 -1.8477590650225733 -1.6205239430119962 -3.9122908813698856 -1.8477590650225733 -2.3526361177143822 -3.5209687712263089 -1.8477590650225733 -2.99433780578654 -2.9943378057865404 -1.8477590650225733 -3.5209687712263085 -2.3526361177143826 -1.8477590650225733 -3.9122908813698856 -1.6205239430119964 -1.8477590650225733 -4.1532658469804211 -0.82613594197995621 -1.8477590650225733 -4.2346331352698199 -2.592964957335753e-16 -1.8477590650225733 -4.1532658469804211 0.82613594197995566 -1.8477590650225733 -3.9122908813698856 1.620523943011996 -1.8477590650225733 -3.5209687712263098 2.3526361177143813 -1.8477590650225733 -2.9943378057865404 2.99433780578654 -1.8477590650225733 -2.3526361177143822 3.5209687712263094 -1.8477590650225733 -1.6205239430119964 3.9122908813698856 -1.8477590650225733 -0.82613594197995732 4.1532658469804211 -1.8477590650225733 -5.1859299146715059e-16 4.2346331352698199 -1.8477590650225733 0.82613594197995643 4.1532658469804211 -1.8477590650225733 1.6205239430119958 3.9122908813698856 -1.8477590650225733 2.3526361177143813 3.5209687712263098 -1.8477590650225733 2.99433780578654 2.9943378057865409 -1.8477590650225733 3.5209687712263089 2.3526361177143822 -1.8477590650225733 3.9122908813698847 1.6205239430119986 -1.8477590650225733 4.1532658469804202 0.82613594197995766 -1.8477590650225733 4.2346331352698199 7.7788948720072579e-16 -1.8477590650225733 4.1532658469804211 -0.8261359419799561 -1.8477590650225733 3.9122908813698851 -1.6205239430119971 -1.8477590650225733 3.5209687712263102 -2.3526361177143809 -1.8477590650225733 2.9943378057865409 -2.99433780578654 -1.8477590650225733 2.3526361177143822 -3.5209687712263089 -1.8477590650225733 1.6205239430119989 -3.9122908813698847 -1.8477590650225733 0.82613594197995788 -4.1532658469804202 -1.8477590650225733 0 -3.5857864376269051 -1.4142135623730954 -0.69955223079769824 -3.5168865566940046 -1.4142135623730954 -1.3722210616792521 -3.3128346976800573 -1.4142135623730954 -1.9921562067109089 -2.9814724590933674 -1.4142135623730954 -2.5355339059327373 -2.5355339059327378 -1.4142135623730954 -2.981472459093367 -1.9921562067109093 -1.4142135623730954 -3.3128346976800573 -1.3722210616792521 -1.4142135623730954 -3.5168865566940046 -0.69955223079769846 -1.4142135623730954 -3.5857864376269051 -2.1956609416328899e-16 -1.4142135623730954 -3.5168865566940046 0.69955223079769813 -1.4142135623730954 -3.3128346976800573 1.3722210616792518 -1.4142135623730954 -2.9814724590933683 1.992156206710908 -1.4142135623730954 -2.5355339059327378 2.5355339059327373 -1.4142135623730954 -1.9921562067109089 2.9814724590933679 -1.4142135623730954 -1.3722210616792521 3.3128346976800573 -1.4142135623730954 -0.69955223079769946 3.5168865566940046 -1.4142135623730954 -4.3913218832657797e-16 3.5857864376269051 -1.4142135623730954 0.69955223079769868 3.5168865566940046 -1.4142135623730954 1.3722210616792516 3.3128346976800573 -1.4142135623730954 1.992156206710908 2.9814724590933683 -1.4142135623730954 2.5355339059327373 2.5355339059327382 -1.4142135623730954 2.9814724590933674 1.9921562067109089 -1.4142135623730954 3.3128346976800565 1.3722210616792538 -1.4142135623730954 3.5168865566940046 0.69955223079769979 -1.4142135623730954 3.5857864376269051 6.5869828248986693e-16 -1.4142135623730954 3.5168865566940046 -0.69955223079769835 -1.4142135623730954 3.3128346976800569 -1.3722210616792527 -1.4142135623730954 2.9814724590933688 -1.9921562067109075 -1.4142135623730954 2.5355339059327382 -2.5355339059327373 -1.4142135623730954 1.9921562067109089 -2.9814724590933674 -1.4142135623730954 1.3722210616792541 -3.3128346976800565 -1.4142135623730954 0.69955223079770001 -3.5168865566940046 -1.4142135623730954 0 -3.152240934977427 -0.76536686473018078 -0.61497169907716742 -3.0916715093103768 -0.76536686473018078 -1.2063103806389015 -2.9122908813698865 -0.76536686473018078 -1.7512912307793378 -2.6209925480898941 -0.76536686473018078 -2.2289709410563612 -2.2289709410563616 -0.76536686473018078 -2.6209925480898937 -1.751291230779338 -0.76536686473018078 -2.9122908813698865 -1.2063103806389017 -0.76536686473018078 -3.0916715093103768 -0.61497169907716764 -0.76536686473018078 -3.152240934977427 -1.9301908855806829e-16 -0.76536686473018078 -3.0916715093103768 0.6149716990771672 -0.76536686473018078 -2.9122908813698865 1.2063103806389013 -0.76536686473018078 -2.6209925480898946 1.7512912307793371 -0.76536686473018078 -2.2289709410563616 2.2289709410563612 -0.76536686473018078 -1.7512912307793378 2.6209925480898941 -0.76536686473018078 -1.2063103806389017 2.9122908813698865 -0.76536686473018078 -0.61497169907716842 3.0916715093103768 -0.76536686473018078 -3.8603817711613658e-16 3.152240934977427 -0.76536686473018078 0.61497169907716775 3.0916715093103768 -0.76536686473018078 1.2063103806389013 2.9122908813698865 -0.76536686473018078 1.7512912307793371 2.6209925480898946 -0.76536686473018078 2.2289709410563612 2.2289709410563621 -0.76536686473018078 2.6209925480898941 1.7512912307793378 -0.76536686473018078 2.912290881369886 1.2063103806389033 -0.76536686473018078 3.0916715093103768 0.61497169907716875 -0.76536686473018078 3.152240934977427 5.7905726567420489e-16 -0.76536686473018078 3.0916715093103768 -0.61497169907716753 -0.76536686473018078 2.9122908813698865 -1.2063103806389022 -0.76536686473018078 2.620992548089895 -1.7512912307793367 -0.76536686473018078 2.2289709410563621 -2.2289709410563612 -0.76536686473018078 1.7512912307793378 -2.6209925480898941 -0.76536686473018078 1.2063103806389035 -2.912290881369886 -0.76536686473018078 0.61497169907716887 -3.0916715093103768 -0.76536686473018078</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1891 1888 1893 1894 1895 1892 1897 1898 1899 1896 1901 1902 1903 1900 1905 1906 1907 1904 1909 1910 1911 1908 1913 1914 1915 1912 1917 1918 1919 1916 1921 1922 1923 1920 1925 1926 1927 1924 1929 1930 1931 1928 1933 1934 1935 1932 1937 1938 1939 1936 1941 1942 1943 1940 1945 1946 1947 1944 1949 1950 1951 1948 1953 1954 1955 1952 1957 1958 1959 1956 1961 1962 1963 1960 1965 1966 1967 1964 1969 1970 1971 1968 1973 1974 1975 1972 1977 1978 1979 1976 1981 1982 1983 1980 1985 1986 1987 1984 1989 1990 1991 1988 1993 1994 1995 1992 1997 1998 1999 1996 2001 2002 2003 2000 2005 2006 2007 2004 2009 2010 2011 2008 2013 2014 2015 2012 2017 2018 2019 2016 2021 2022 2023 2020 2025 2026 2027 2024 2029 2030 2031 2028 2033 2034 2035 2032 2037 2038 2039 2036 2041 2042 2043 2040 2045 2046 2047 2044</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1900 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 160 161 193 192 161 162 194 193 162 163 195 194 163 164 196 195 164 165 197 196 165 166 198 197 166 167 199 198 167 168 200 199 168 169 201 200 169 170 202 201 170 171 203 202 171 172 204 203 172 173 205 204 173 174 206 205 174 175 207 206 175 176 208 207 176 177 209 208 177 178 210 209 178 179 211 210 179 180 212 211 180 181 213 212 181 182 214 213 182 183 215 214 183 184 216 215 184 185 217 216 185 186 218 217 186 187 219 218 187 188 220 219 188 189 221 220 189 190 222 221 190 191 223 222 191 160 192 223 192 193 225 224 193 194 226 225 194 195 227 226 195 196 228 227 196 197 229 228 197 198 230 229 198 199 231 230 199 200 232 231 200 201 233 232 201 202 234 233 202 203 235 234 203 204 236 235 204 205 237 236 205 206 238 237 206 207 239 238 207 208 240 239 208 209 241 240 209 210 242 241 210 211 243 242 211 212 244 243 212 213 245 244 213 214 246 245 214 215 247 246 215 216 248 247 216 217 249 248 217 218 250 249 218 219 251 250 219 220 252 251 220 221 253 252 221 222 254 253 222 223 255 254 223 192 224 255 224 225 257 256 225 226 258 257 226 227 259 258 227 228 260 259 228 229 261 260 229 230 262 261 230 231 263 262 231 232 264 263 232 233 265 264 233 234 266 265 234 235 267 266 235 236 268 267 236 237 269 268 237 238 270 269 238 239 271 270 239 240 272 271 240 241 273 272 241 242 274 273 242 243 275 274 243 244 276 275 244 245 277 276 245 246 278 277 246 247 279 278 247 248 280 279 248 249 281 280 249 250 282 281 250 251 283 282 251 252 284 283 252 253 285 284 253 254 286 285 254 255 287 286 255 224 256 287 256 257 289 288 257 258 290 289 258 259 291 290 259 260 292 291 260 261 293 292 261 262 294 293 262 263 295 294 263 264 296 295 264 265 297 296 265 266 298 297 266 267 299 298 267 268 300 299 268 269 301 300 269 270 302 301 270 271 303 302 271 272 304 303 272 273 305 304 273 274 306 305 274 275 307 306 275 276 308 307 276 277 309 308 277 278 310 309 278 279 311 310 279 280 312 311 280 281 313 312 281 282 314 313 282 283 315 314 283 284 316 315 284 285 317 316 285 286 318 317 286 287 319 318 287 256 288 319 288 289 321 320 289 290 322 321 290 291 323 322 291 292 324 323 292 293 325 324 293 294 326 325 294 295 327 326 295 296 328 327 296 297 329 328 297 298 330 329 298 299 331 330 299 300 332 331 300 301 333 332 301 302 334 333 302 303 335 334 303 304 336 335 304 305 337 336 305 306 338 337 306 307 339 338 307 308 340 339 308 309 341 340 309 310 342 341 310 311 343 342 311 312 344 343 312 313 345 344 313 314 346 345 314 315 347 346 315 316 348 347 316 317 349 348 317 318 350 349 318 319 351 350 319 288 320 351 320 321 353 352 321 322 354 353 322 323 355 354 323 324 356 355 324 325 357 356 325 326 358 357 326 327 359 358 327 328 360 359 328 329 361 360 329 330 362 361 330 331 363 362 331 332 364 363 332 333 365 364 333 334 366 365 334 335 367 366 335 336 368 367 336 337 369 368 337 338 370 369 338 339 371 370 339 340 372 371 340 341 373 372 341 342 374 373 342 343 375 374 343 344 376 375 344 345 377 376 345 346 378 377 346 347 379 378 347 348 380 379 348 349 381 380 349 350 382 381 350 351 383 382 351 320 352 383 352 353 385 384 353 354 386 385 354 355 387 386 355 356 388 387 356 357 389 388 357 358 390 389 358 359 391 390 359 360 392 391 360 361 393 392 361 362 394 393 362 363 395 394 363 364 396 395 364 365 397 396 365 366 398 397 366 367 399 398 367 368 400 399 368 369 401 400 369 370 402 401 370 371 403 402 371 372 404 403 372 373 405 404 373 374 406 405 374 375 407 406 375 376 408 407 376 377 409 408 377 378 410 409 378 379 411 410 379 380 412 411 380 381 413 412 381 382 414 413 382 383 415 414 383 352 384 415 384 385 417 416 385 386 418 417 386 387 419 418 387 388 420 419 388 389 421 420 389 390 422 421 390 391 423 422 391 392 424 423 392 393 425 424 393 394 426 425 394 395 427 426 395 396 428 427 396 397 429 428 397 398 430 429 398 399 431 430 399 400 432 431 400 401 433 432 401 402 434 433 402 403 435 434 403 404 436 435 404 405 437 436 405 406 438 437 406 407 439 438 407 408 440 439 408 409 441 440 409 410 442 441 410 411 443 442 411 412 444 443 412 413 445 444 413 414 446 445 414 415 447 446 415 384 416 447 416 417 449 448 417 418 450 449 418 419 451 450 419 420 452 451 420 421 453 452 421 422 454 453 422 423 455 454 423 424 456 455 424 425 457 456 425 426 458 457 426 427 459 458 427 428 460 459 428 429 461 460 429 430 462 461 430 431 463 462 431 432 464 463 432 433 465 464 433 434 466 465 434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 416 448 479 448 449 481 480 449 450 482 481 450 451 483 482 451 452 484 483 452 453 485 484 453 454 486 485 454 455 487 486 455 456 488 487 456 457 489 488 457 458 490 489 458 459 491 490 459 460 492 491 460 461 493 492 461 462 494 493 462 463 495 494 463 464 496 495 464 465 497 496 465 466 498 497 466 467 499 498 467 468 500 499 468 469 501 500 469 470 502 501 470 471 503 502 471 472 504 503 472 473 505 504 473 474 506 505 474 475 507 506 475 476 508 507 476 477 509 508 477 478 510 509 478 479 511 510 479 448 480 511 480 481 1 0 481 482 2 1 482 483 3 2 483 484 4 3 484 485 5 4 485 486 6 5 486 487 7 6 487 488 8 7 488 489 9 8 489 490 10 9 490 491 11 10 491 492 12 11 492 493 13 12 493 494 14 13 494 495 15 14 495 496 16 15 496 497 17 16 497 498 18 17 498 499 19 18 499 500 20 19 500 501 21 20 501 502 22 21 502 503 23 22 503 504 24 23 504 505 25 24 505 506 26 25 506 507 27 26 507 508 28 27 508 509 29 28 509 510 30 29 510 511 31 30 511 480 0 31\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.PolyTorus.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>0 -3 0 -0.5852709660483848 -2.9423558412096913 0 -1.1480502970952693 -2.77163859753386 0 -1.6667106990588065 -2.4944088369076356 0 -2.1213203435596424 -2.1213203435596428 0 -2.4944088369076356 -1.666710699058807 0 -2.77163859753386 -1.1480502970952695 0 -2.9423558412096913 -0.58527096604838502 0 -3 -1.8369095307335659e-16 0 -2.9423558412096913 0.58527096604838458 0 -2.77163859753386 1.1480502970952693 0 -2.4944088369076365 1.6667106990588059 0 -2.1213203435596428 2.1213203435596424 0 -1.6667106990588065 2.494408836907636 0 -1.1480502970952697 2.77163859753386 0 -0.5852709660483858 2.9423558412096913 0 -3.6738190614671318e-16 3 0 0.58527096604838502 2.9423558412096913 0 1.1480502970952691 2.7716385975338604 0 1.6667106990588059 2.4944088369076365 0 2.1213203435596424 2.1213203435596428 0 2.4944088369076356 1.6667106990588065 0 2.7716385975338595 1.1480502970952711 0 2.9423558412096908 0.58527096604838602 0 3 5.5107285922006977e-16 0 2.9423558412096913 -0.58527096604838491 0 2.77163859753386 -1.14805029709527 0 2.4944088369076365 -1.6667106990588056 0 2.1213203435596428 -2.1213203435596419 0 1.6667106990588065 -2.4944088369076356 0 1.1480502970952711 -2.7716385975338595 0 0.58527096604838613 -2.9423558412096908 0 0 -3.1522409349774265 0.76536686473017956 -0.61497169907716731 -3.0916715093103764 0.76536686473017956 -1.2063103806389013 -2.9122908813698865 0.76536686473017956 -1.7512912307793376 -2.6209925480898937 0.76536686473017956 -2.2289709410563607 -2.2289709410563612 0.76536686473017956 -2.6209925480898937 -1.7512912307793378 0.76536686473017956 -2.9122908813698865 -1.2063103806389015 0.76536686473017956 -3.0916715093103764 -0.61497169907716764 0.76536686473017956 -3.1522409349774265 -1.9301271388761739e-16 0.76536686473017956 -3.0916715093103764 0.6149716990771672 0.76536686473017956 -2.9122908813698865 1.2063103806389013 0.76536686473017956 -2.6209925480898941 1.7512912307793367 0.76536686473017956 -2.2289709410563612 2.2289709410563607 0.76536686473017956 -1.7512912307793376 2.6209925480898937 0.76536686473017956 -1.2063103806389017 2.9122908813698865 0.76536686473017956 -0.61497169907716842 3.0916715093103764 0.76536686473017956 -3.8602542777523477e-16 3.1522409349774265 0.76536686473017956 0.61497169907716764 3.0916715093103764 0.76536686473017956 1.2063103806389011 2.9122908813698865 0.76536686473017956 1.7512912307793367 2.6209925480898941 0.76536686473017956 2.2289709410563607 2.2289709410563616 0.76536686473017956 2.6209925480898937 1.7512912307793376 0.76536686473017956 2.9122908813698856 1.2063103806389031 0.76536686473017956 3.0916715093103764 0.61497169907716864 0.76536686473017956 3.1522409349774265 5.7903814166285211e-16 0.76536686473017956 3.0916715093103764 -0.61497169907716753 0.76536686473017956 2.912290881369886 -1.2063103806389022 0.76536686473017956 2.6209925480898941 -1.7512912307793365 0.76536686473017956 2.2289709410563616 -2.2289709410563607 0.76536686473017956 1.7512912307793376 -2.6209925480898937 0.76536686473017956 1.2063103806389033 -2.9122908813698856 0.76536686473017956 0.61497169907716887 -3.0916715093103764 0.76536686473017956 0 -3.5857864376269051 1.4142135623730949 -0.69955223079769824 -3.5168865566940046 1.4142135623730949 -1.3722210616792521 -3.3128346976800573 1.4142135623730949 -1.9921562067109089 -2.9814724590933674 1.4142135623730949 -2.5355339059327373 -2.5355339059327378 1.4142135623730949 -2.9814724590933674 -1.9921562067109093 1.4142135623730949 -3.3128346976800573 -1.3722210616792521 1.4142135623730949 -3.5168865566940046 -0.69955223079769857 1.4142135623730949 -3.5857864376269051 -2.1955884274840076e-16 1.4142135623730949 -3.5168865566940046 0.69955223079769813 1.4142135623730949 -3.3128346976800573 1.3722210616792518 1.4142135623730949 -2.9814724590933683 1.992156206710908 1.4142135623730949 -2.5355339059327378 2.5355339059327373 1.4142135623730949 -1.9921562067109089 2.9814724590933679 1.4142135623730949 -1.3722210616792523 3.3128346976800573 1.4142135623730949 -0.69955223079769957 3.5168865566940046 1.4142135623730949 -4.3911768549680152e-16 3.5857864376269051 1.4142135623730949 0.69955223079769868 3.5168865566940046 1.4142135623730949 1.3722210616792516 3.3128346976800578 1.4142135623730949 1.992156206710908 2.9814724590933683 1.4142135623730949 2.5355339059327373 2.5355339059327382 1.4142135623730949 2.9814724590933674 1.9921562067109089 1.4142135623730949 3.3128346976800565 1.3722210616792538 1.4142135623730949 3.5168865566940046 0.69955223079769979 1.4142135623730949 3.5857864376269051 6.5867652824520231e-16 1.4142135623730949 3.5168865566940046 -0.69955223079769846 1.4142135623730949 3.3128346976800569 -1.3722210616792527 1.4142135623730949 2.9814724590933683 -1.9921562067109075 1.4142135623730949 2.5355339059327382 -2.5355339059327373 1.4142135623730949 1.9921562067109089 -2.9814724590933674 1.4142135623730949 1.3722210616792541 -3.3128346976800565 1.4142135623730949 0.69955223079770001 -3.5168865566940046 1.4142135623730949 0 -4.2346331352698208 1.8477590650225735 -0.8261359419799561 -4.153265846980422 1.8477590650225735 -1.6205239430119966 -3.9122908813698865 1.8477590650225735 -2.3526361177143831 -3.5209687712263094 1.8477590650225735 -2.9943378057865404 -2.9943378057865409 1.8477590650225735 -3.5209687712263094 -2.3526361177143835 1.8477590650225735 -3.9122908813698865 -1.6205239430119969 1.8477590650225735 -4.153265846980422 -0.82613594197995643 1.8477590650225735 -4.2346331352698208 -2.5928793217790986e-16 1.8477590650225735 -4.153265846980422 0.82613594197995588 1.8477590650225735 -3.9122908813698865 1.6205239430119962 1.8477590650225735 -3.5209687712263102 2.3526361177143817 1.8477590650225735 -2.9943378057865409 2.9943378057865404 1.8477590650225735 -2.3526361177143831 3.5209687712263098 1.8477590650225735 -1.6205239430119971 3.9122908813698865 1.8477590650225735 -0.82613594197995766 4.153265846980422 1.8477590650225735 -5.1857586435581973e-16 4.2346331352698208 1.8477590650225735 0.82613594197995655 4.153265846980422 1.8477590650225735 1.620523943011996 3.9122908813698869 1.8477590650225735 2.3526361177143817 3.5209687712263102 1.8477590650225735 2.9943378057865404 2.9943378057865417 1.8477590650225735 3.5209687712263094 2.3526361177143831 1.8477590650225735 3.9122908813698856 1.6205239430119989 1.8477590650225735 4.1532658469804211 0.82613594197995788 1.8477590650225735 4.2346331352698208 7.7786379653372949e-16 1.8477590650225735 4.153265846980422 -0.82613594197995632 1.8477590650225735 3.912290881369886 -1.6205239430119975 1.8477590650225735 3.5209687712263102 -2.3526361177143813 1.8477590650225735 2.9943378057865417 -2.99433780578654 1.8477590650225735 2.3526361177143831 -3.5209687712263094 1.8477590650225735 1.6205239430119991 -3.9122908813698856 1.8477590650225735 0.8261359419799581 -4.1532658469804211 1.8477590650225735 0 -5 2 -0.97545161008064118 -4.9039264020161522 2 -1.913417161825449 -4.6193976625564339 2 -2.7778511650980109 -4.1573480615127263 2 -3.5355339059327373 -3.5355339059327378 2 -4.1573480615127263 -2.7778511650980113 2 -4.6193976625564339 -1.9134171618254492 2 -4.9039264020161522 -0.97545161008064163 2 -5 -3.0615158845559431e-16 2 -4.9039264020161522 0.97545161008064096 2 -4.6193976625564339 1.9134171618254485 2 -4.1573480615127272 2.77785116509801 2 -3.5355339059327378 3.5355339059327373 2 -2.7778511650980109 4.1573480615127263 2 -1.9134171618254494 4.6193976625564339 2 -0.97545161008064307 4.9039264020161522 2 -6.1230317691118863e-16 5 2 0.97545161008064185 4.9039264020161522 2 1.9134171618254483 4.6193976625564339 2 2.77785116509801 4.1573480615127272 2 3.5355339059327373 3.5355339059327386 2 4.1573480615127263 2.7778511650980109 2 4.6193976625564321 1.9134171618254516 2 4.9039264020161513 0.97545161008064329 2 5 9.1845476536678294e-16 2 4.9039264020161522 -0.97545161008064152 2 4.619397662556433 -1.9134171618254501 2 4.1573480615127272 -2.7778511650980091 2 3.5355339059327386 -3.5355339059327369 2 2.7778511650980109 -4.1573480615127263 2 1.9134171618254521 -4.6193976625564321 2 0.97545161008064363 -4.9039264020161513 2 0 -5.7653668647301792 1.8477590650225735 -1.1247672781813263 -5.6545869570518823 1.8477590650225735 -2.2063103806389011 -5.3265044437429809 1.8477590650225735 -3.2030662124816387 -4.7937273517991432 1.8477590650225735 -4.0767300060789342 -4.0767300060789351 1.8477590650225735 -4.7937273517991432 -3.2030662124816396 1.8477590650225735 -5.3265044437429809 -2.2063103806389015 1.8477590650225735 -5.6545869570518823 -1.1247672781813269 1.8477590650225735 -5.7653668647301792 -3.5301524473327877e-16 1.8477590650225735 -5.6545869570518823 1.124767278181326 1.8477590650225735 -5.3265044437429809 2.2063103806389011 1.8477590650225735 -4.7937273517991441 3.2030662124816378 1.8477590650225735 -4.0767300060789351 4.0767300060789342 1.8477590650225735 -3.2030662124816387 4.7937273517991432 1.8477590650225735 -2.2063103806389019 5.3265044437429809 1.8477590650225735 -1.1247672781813285 5.6545869570518823 1.8477590650225735 -7.0603048946655753e-16 5.7653668647301792 1.8477590650225735 1.1247672781813269 5.6545869570518823 1.8477590650225735 2.2063103806389006 5.3265044437429818 1.8477590650225735 3.2030662124816378 4.7937273517991441 1.8477590650225735 4.0767300060789342 4.0767300060789351 1.8477590650225735 4.7937273517991432 3.2030662124816387 1.8477590650225735 5.32650444374298 2.2063103806389046 1.8477590650225735 5.6545869570518814 1.1247672781813287 1.8477590650225735 5.7653668647301792 1.0590457341998364e-15 1.8477590650225735 5.6545869570518823 -1.1247672781813267 1.8477590650225735 5.32650444374298 -2.2063103806389024 1.8477590650225735 4.7937273517991441 -3.2030662124816369 1.8477590650225735 4.0767300060789351 -4.0767300060789333 1.8477590650225735 3.2030662124816387 -4.7937273517991432 1.8477590650225735 2.2063103806389046 -5.32650444374298 1.8477590650225735 1.1247672781813292 -5.6545869570518814 1.8477590650225735 0 -6.4142135623730949 1.4142135623730951 -1.2513509893635841 -6.2909662473382992 1.4142135623730951 -2.4546132619716459 -5.9259606274328105 1.4142135623730951 -3.5635461234851129 -5.3332236639320847 1.4142135623730951 -4.5355339059327369 -4.5355339059327378 1.4142135623730951 -5.3332236639320847 -3.5635461234851138 1.4142135623730951 -5.9259606274328105 -2.4546132619716463 1.4142135623730951 -6.2909662473382992 -1.2513509893635848 1.4142135623730951 -6.4142135623730949 -3.9274433416278784e-16 1.4142135623730951 -6.2909662473382992 1.2513509893635839 1.4142135623730951 -5.9259606274328105 2.4546132619716454 1.4142135623730951 -5.3332236639320865 3.5635461234851116 1.4142135623730951 -4.5355339059327378 4.5355339059327369 1.4142135623730951 -3.5635461234851129 5.3332236639320856 1.4142135623730951 -2.4546132619716468 5.9259606274328105 1.4142135623730951 -1.2513509893635866 6.2909662473382992 1.4142135623730951 -7.8548866832557569e-16 6.4142135623730949 1.4142135623730951 1.251350989363585 6.2909662473382992 1.4142135623730951 2.454613261971645 5.9259606274328105 1.4142135623730951 3.5635461234851116 5.3332236639320865 1.4142135623730951 4.5355339059327369 4.5355339059327386 1.4142135623730951 5.3332236639320847 3.5635461234851129 1.4142135623730951 5.9259606274328087 2.4546132619716494 1.4142135623730951 6.2909662473382983 1.2513509893635868 1.4142135623730951 6.4142135623730949 1.1782330024883636e-15 1.4142135623730951 6.2909662473382992 -1.2513509893635846 1.4142135623730951 5.9259606274328096 -2.4546132619716472 1.4142135623730951 5.3332236639320865 -3.5635461234851107 1.4142135623730951 4.5355339059327386 -4.535533905932736 1.4142135623730951 3.5635461234851129 -5.3332236639320847 1.4142135623730951 2.4546132619716499 -5.9259606274328087 1.4142135623730951 1.2513509893635872 -6.2909662473382983 1.4142135623730951 0 -6.8477590650225739 0.76536686473017979 -1.3359315210841152 -6.7161812947219284 0.76536686473017979 -2.6205239430119964 -6.3265044437429818 0.76536686473017979 -3.8044110994166846 -5.6937035749355589 0.76536686473017979 -4.8420968708091143 -4.8420968708091143 0.76536686473017979 -5.6937035749355589 -3.8044110994166851 0.76536686473017979 -6.3265044437429818 -2.6205239430119969 0.76536686473017979 -6.7161812947219284 -1.3359315210841158 0.76536686473017979 -6.8477590650225739 -4.1929046302357129e-16 0.76536686473017979 -6.7161812947219284 1.3359315210841149 0.76536686473017979 -6.3265044437429818 2.6205239430119964 0.76536686473017979 -5.6937035749355607 3.8044110994166829 0.76536686473017979 -4.8420968708091143 4.8420968708091143 0.76536686473017979 -3.8044110994166846 5.6937035749355598 0.76536686473017979 -2.6205239430119973 6.3265044437429818 0.76536686473017979 -1.3359315210841176 6.7161812947219284 0.76536686473017979 -8.3858092604714259e-16 6.8477590650225739 0.76536686473017979 1.3359315210841161 6.7161812947219284 0.76536686473017979 2.620523943011996 6.3265044437429827 0.76536686473017979 3.8044110994166829 5.6937035749355607 0.76536686473017979 4.8420968708091143 4.8420968708091152 0.76536686473017979 5.6937035749355589 3.8044110994166846 0.76536686473017979 6.32650444374298 2.6205239430120004 0.76536686473017979 6.7161812947219275 1.3359315210841181 0.76536686473017979 6.8477590650225739 1.2578713890707138e-15 0.76536686473017979 6.7161812947219284 -1.3359315210841156 0.76536686473017979 6.3265044437429809 -2.6205239430119982 0.76536686473017979 5.6937035749355607 -3.8044110994166824 0.76536686473017979 4.8420968708091152 -4.8420968708091134 0.76536686473017979 3.8044110994166846 -5.6937035749355589 0.76536686473017979 2.6205239430120009 -6.32650444374298 0.76536686473017979 1.3359315210841185 -6.7161812947219275 0.76536686473017979 0 -7 2.4492127076447545e-16 -1.3656322541128978 -6.865496962822613 2.4492127076447545e-16 -2.6787840265556286 -6.4671567275790069 2.4492127076447545e-16 -3.8889916311372152 -5.820287286117817 2.4492127076447545e-16 -4.9497474683058318 -4.9497474683058327 2.4492127076447545e-16 -5.820287286117817 -3.8889916311372161 2.4492127076447545e-16 -6.4671567275790069 -2.6787840265556291 2.4492127076447545e-16 -6.865496962822613 -1.3656322541128982 2.4492127076447545e-16 -7 -4.2861222383783204e-16 2.4492127076447545e-16 -6.865496962822613 1.3656322541128973 2.4492127076447545e-16 -6.4671567275790069 2.6787840265556282 2.4492127076447545e-16 -5.8202872861178179 3.8889916311372135 2.4492127076447545e-16 -4.9497474683058327 4.9497474683058318 2.4492127076447545e-16 -3.8889916311372152 5.8202872861178179 2.4492127076447545e-16 -2.6787840265556291 6.4671567275790069 2.4492127076447545e-16 -1.3656322541129002 6.865496962822613 2.4492127076447545e-16 -8.5722444767566408e-16 7 2.4492127076447545e-16 1.3656322541128985 6.865496962822613 2.4492127076447545e-16 2.6787840265556278 6.4671567275790078 2.4492127076447545e-16 3.8889916311372135 5.8202872861178179 2.4492127076447545e-16 4.9497474683058318 4.9497474683058336 2.4492127076447545e-16 5.820287286117817 3.8889916311372152 2.4492127076447545e-16 6.4671567275790061 2.6787840265556322 2.4492127076447545e-16 6.8654969628226121 1.3656322541129007 2.4492127076447545e-16 7 1.2858366715134961e-15 2.4492127076447545e-16 6.865496962822613 -1.365632254112898 2.4492127076447545e-16 6.4671567275790061 -2.67878402655563 2.4492127076447545e-16 5.8202872861178179 -3.888991631137213 2.4492127076447545e-16 4.9497474683058336 -4.9497474683058318 2.4492127076447545e-16 3.8889916311372152 -5.820287286117817 2.4492127076447545e-16 2.6787840265556326 -6.4671567275790061 2.4492127076447545e-16 1.3656322541129011 -6.8654969628226121 2.4492127076447545e-16 0 -6.8477590650225739 -0.76536686473017934 -1.3359315210841152 -6.7161812947219284 -0.76536686473017934 -2.6205239430119964 -6.3265044437429818 -0.76536686473017934 -3.8044110994166846 -5.6937035749355589 -0.76536686473017934 -4.8420968708091143 -4.8420968708091143 -0.76536686473017934 -5.6937035749355589 -3.8044110994166851 -0.76536686473017934 -6.3265044437429818 -2.6205239430119969 -0.76536686473017934 -6.7161812947219284 -1.3359315210841158 -0.76536686473017934 -6.8477590650225739 -4.1929046302357129e-16 -0.76536686473017934 -6.7161812947219284 1.3359315210841149 -0.76536686473017934 -6.3265044437429818 2.6205239430119964 -0.76536686473017934 -5.6937035749355607 3.8044110994166829 -0.76536686473017934 -4.8420968708091143 4.8420968708091143 -0.76536686473017934 -3.8044110994166846 5.6937035749355598 -0.76536686473017934 -2.6205239430119973 6.3265044437429818 -0.76536686473017934 -1.3359315210841176 6.7161812947219284 -0.76536686473017934 -8.3858092604714259e-16 6.8477590650225739 -0.76536686473017934 1.3359315210841161 6.7161812947219284 -0.76536686473017934 2.620523943011996 6.3265044437429827 -0.76536686473017934 3.8044110994166829 5.6937035749355607 -0.76536686473017934 4.8420968708091143 4.8420968708091152 -0.76536686473017934 5.6937035749355589 3.8044110994166846 -0.76536686473017934 6.32650444374298 2.6205239430120004 -0.76536686473017934 6.7161812947219275 1.3359315210841181 -0.76536686473017934 6.8477590650225739 1.2578713890707138e-15 -0.76536686473017934 6.7161812947219284 -1.3359315210841156 -0.76536686473017934 6.3265044437429809 -2.6205239430119982 -0.76536686473017934 5.6937035749355607 -3.8044110994166824 -0.76536686473017934 4.8420968708091152 -4.8420968708091134 -0.76536686473017934 3.8044110994166846 -5.6937035749355589 -0.76536686473017934 2.6205239430120009 -6.32650444374298 -0.76536686473017934 1.3359315210841185 -6.7161812947219275 -0.76536686473017934 0 -6.4142135623730958 -1.4142135623730949 -1.2513509893635844 -6.2909662473383001 -1.4142135623730949 -2.4546132619716463 -5.9259606274328105 -1.4142135623730949 -3.5635461234851133 -5.3332236639320856 -1.4142135623730949 -4.5355339059327378 -4.5355339059327386 -1.4142135623730949 -5.3332236639320856 -3.5635461234851142 -1.4142135623730949 -5.9259606274328105 -2.4546132619716468 -1.4142135623730949 -6.2909662473383001 -1.2513509893635848 -1.4142135623730949 -6.4142135623730958 -3.9274433416278789e-16 -1.4142135623730949 -6.2909662473383001 1.2513509893635839 -1.4142135623730949 -5.9259606274328105 2.4546132619716459 -1.4142135623730949 -5.3332236639320874 3.563546123485112 -1.4142135623730949 -4.5355339059327386 4.5355339059327378 -1.4142135623730949 -3.5635461234851133 5.3332236639320865 -1.4142135623730949 -2.4546132619716468 5.9259606274328105 -1.4142135623730949 -1.2513509893635868 6.2909662473383001 -1.4142135623730949 -7.8548866832557579e-16 6.4142135623730958 -1.4142135623730949 1.251350989363585 6.2909662473383001 -1.4142135623730949 2.4546132619716454 5.9259606274328114 -1.4142135623730949 3.563546123485112 5.3332236639320874 -1.4142135623730949 4.5355339059327378 4.5355339059327395 -1.4142135623730949 5.3332236639320856 3.5635461234851133 -1.4142135623730949 5.9259606274328096 2.4546132619716499 -1.4142135623730949 6.2909662473382992 1.251350989363587 -1.4142135623730949 6.4142135623730958 1.1782330024883638e-15 -1.4142135623730949 6.2909662473383001 -1.2513509893635848 -1.4142135623730949 5.9259606274328105 -2.4546132619716476 -1.4142135623730949 5.3332236639320874 -3.5635461234851111 -1.4142135623730949 4.5355339059327395 -4.5355339059327369 -1.4142135623730949 3.5635461234851133 -5.3332236639320856 -1.4142135623730949 2.4546132619716503 -5.9259606274328096 -1.4142135623730949 1.2513509893635875 -6.2909662473382992 -1.4142135623730949 0 -5.765366864730181 -1.847759065022573 -1.1247672781813267 -5.6545869570518841 -1.847759065022573 -2.2063103806389019 -5.3265044437429827 -1.847759065022573 -3.20306621248164 -4.7937273517991441 -1.847759065022573 -4.0767300060789351 -4.076730006078936 -1.847759065022573 -4.7937273517991441 -3.2030662124816405 -1.847759065022573 -5.3265044437429827 -2.2063103806389024 -1.847759065022573 -5.6545869570518841 -1.1247672781813272 -1.847759065022573 -5.765366864730181 -3.5301524473327891e-16 -1.847759065022573 -5.6545869570518841 1.1247672781813265 -1.847759065022573 -5.3265044437429827 2.2063103806389015 -1.847759065022573 -4.7937273517991459 3.2030662124816387 -1.847759065022573 -4.076730006078936 4.0767300060789351 -1.847759065022573 -3.20306621248164 4.793727351799145 -1.847759065022573 -2.2063103806389024 5.3265044437429827 -1.847759065022573 -1.1247672781813287 5.6545869570518841 -1.847759065022573 -7.0603048946655783e-16 5.765366864730181 -1.847759065022573 1.1247672781813274 5.6545869570518841 -1.847759065022573 2.2063103806389015 5.3265044437429836 -1.847759065022573 3.2030662124816387 4.7937273517991459 -1.847759065022573 4.0767300060789351 4.0767300060789369 -1.847759065022573 4.7937273517991441 3.20306621248164 -1.847759065022573 5.3265044437429809 2.2063103806389051 -1.847759065022573 5.6545869570518832 1.1247672781813292 -1.847759065022573 5.765366864730181 1.0590457341998366e-15 -1.847759065022573 5.6545869570518841 -1.1247672781813269 -1.847759065022573 5.3265044437429818 -2.2063103806389033 -1.847759065022573 4.7937273517991459 -3.2030662124816378 -1.847759065022573 4.0767300060789369 -4.0767300060789342 -1.847759065022573 3.20306621248164 -4.7937273517991441 -1.847759065022573 2.2063103806389055 -5.3265044437429809 -1.847759065022573 1.1247672781813294 -5.6545869570518832 -1.847759065022573 0 -5 -2 -0.97545161008064118 -4.9039264020161522 -2 -1.913417161825449 -4.6193976625564339 -2 -2.7778511650980109 -4.1573480615127263 -2 -3.5355339059327373 -3.5355339059327378 -2 -4.1573480615127263 -2.7778511650980113 -2 -4.6193976625564339 -1.9134171618254492 -2 -4.9039264020161522 -0.97545161008064163 -2 -5 -3.0615158845559431e-16 -2 -4.9039264020161522 0.97545161008064096 -2 -4.6193976625564339 1.9134171618254485 -2 -4.1573480615127272 2.77785116509801 -2 -3.5355339059327378 3.5355339059327373 -2 -2.7778511650980109 4.1573480615127263 -2 -1.9134171618254494 4.6193976625564339 -2 -0.97545161008064307 4.9039264020161522 -2 -6.1230317691118863e-16 5 -2 0.97545161008064185 4.9039264020161522 -2 1.9134171618254483 4.6193976625564339 -2 2.77785116509801 4.1573480615127272 -2 3.5355339059327373 3.5355339059327386 -2 4.1573480615127263 2.7778511650980109 -2 4.6193976625564321 1.9134171618254516 -2 4.9039264020161513 0.97545161008064329 -2 5 9.1845476536678294e-16 -2 4.9039264020161522 -0.97545161008064152 -2 4.619397662556433 -1.9134171618254501 -2 4.1573480615127272 -2.7778511650980091 -2 3.5355339059327386 -3.5355339059327369 -2 2.7778511650980109 -4.1573480615127263 -2 1.9134171618254521 -4.6193976625564321 -2 0.97545161008064363 -4.9039264020161513 -2 0 -4.2346331352698199 -1.8477590650225733 -0.82613594197995588 -4.1532658469804211 -1.8477590650225733 -1.6205239430119962 -3.9122908813698856 -1.8477590650225733 -2.3526361177143822 -3.5209687712263089 -1.8477590650225733 -2.99433780578654 -2.9943378057865404 -1.8477590650225733 -3.5209687712263089 -2.3526361177143826 -1.8477590650225733 -3.9122908813698856 -1.6205239430119964 -1.8477590650225733 -4.1532658469804211 -0.82613594197995632 -1.8477590650225733 -4.2346331352698199 -2.5928793217790977e-16 -1.8477590650225733 -4.1532658469804211 0.82613594197995566 -1.8477590650225733 -3.9122908813698856 1.620523943011996 -1.8477590650225733 -3.5209687712263098 2.3526361177143813 -1.8477590650225733 -2.9943378057865404 2.99433780578654 -1.8477590650225733 -2.3526361177143822 3.5209687712263094 -1.8477590650225733 -1.6205239430119966 3.9122908813698856 -1.8477590650225733 -0.82613594197995743 4.1532658469804211 -1.8477590650225733 -5.1857586435581953e-16 4.2346331352698199 -1.8477590650225733 0.82613594197995643 4.1532658469804211 -1.8477590650225733 1.6205239430119958 3.912290881369886 -1.8477590650225733 2.3526361177143813 3.5209687712263098 -1.8477590650225733 2.99433780578654 2.9943378057865409 -1.8477590650225733 3.5209687712263089 2.3526361177143822 -1.8477590650225733 3.9122908813698847 1.6205239430119986 -1.8477590650225733 4.1532658469804202 0.82613594197995766 -1.8477590650225733 4.2346331352698199 7.7786379653372939e-16 -1.8477590650225733 4.1532658469804211 -0.82613594197995621 -1.8477590650225733 3.9122908813698851 -1.6205239430119971 -1.8477590650225733 3.5209687712263098 -2.3526361177143809 -1.8477590650225733 2.9943378057865409 -2.9943378057865395 -1.8477590650225733 2.3526361177143822 -3.5209687712263089 -1.8477590650225733 1.6205239430119989 -3.9122908813698847 -1.8477590650225733 0.82613594197995788 -4.1532658469804202 -1.8477590650225733 0 -3.5857864376269051 -1.4142135623730954 -0.69955223079769824 -3.5168865566940046 -1.4142135623730954 -1.3722210616792521 -3.3128346976800573 -1.4142135623730954 -1.9921562067109089 -2.9814724590933674 -1.4142135623730954 -2.5355339059327373 -2.5355339059327378 -1.4142135623730954 -2.9814724590933674 -1.9921562067109093 -1.4142135623730954 -3.3128346976800573 -1.3722210616792521 -1.4142135623730954 -3.5168865566940046 -0.69955223079769857 -1.4142135623730954 -3.5857864376269051 -2.1955884274840076e-16 -1.4142135623730954 -3.5168865566940046 0.69955223079769813 -1.4142135623730954 -3.3128346976800573 1.3722210616792518 -1.4142135623730954 -2.9814724590933683 1.992156206710908 -1.4142135623730954 -2.5355339059327378 2.5355339059327373 -1.4142135623730954 -1.9921562067109089 2.9814724590933679 -1.4142135623730954 -1.3722210616792523 3.3128346976800573 -1.4142135623730954 -0.69955223079769957 3.5168865566940046 -1.4142135623730954 -4.3911768549680152e-16 3.5857864376269051 -1.4142135623730954 0.69955223079769868 3.5168865566940046 -1.4142135623730954 1.3722210616792516 3.3128346976800578 -1.4142135623730954 1.992156206710908 2.9814724590933683 -1.4142135623730954 2.5355339059327373 2.5355339059327382 -1.4142135623730954 2.9814724590933674 1.9921562067109089 -1.4142135623730954 3.3128346976800565 1.3722210616792538 -1.4142135623730954 3.5168865566940046 0.69955223079769979 -1.4142135623730954 3.5857864376269051 6.5867652824520231e-16 -1.4142135623730954 3.5168865566940046 -0.69955223079769846 -1.4142135623730954 3.3128346976800569 -1.3722210616792527 -1.4142135623730954 2.9814724590933683 -1.9921562067109075 -1.4142135623730954 2.5355339059327382 -2.5355339059327373 -1.4142135623730954 1.9921562067109089 -2.9814724590933674 -1.4142135623730954 1.3722210616792541 -3.3128346976800565 -1.4142135623730954 0.69955223079770001 -3.5168865566940046 -1.4142135623730954 0 -3.152240934977427 -0.76536686473018078 -0.61497169907716742 -3.0916715093103768 -0.76536686473018078 -1.2063103806389015 -2.9122908813698865 -0.76536686473018078 -1.7512912307793378 -2.6209925480898941 -0.76536686473018078 -2.2289709410563612 -2.2289709410563616 -0.76536686473018078 -2.6209925480898941 -1.751291230779338 -0.76536686473018078 -2.9122908813698865 -1.2063103806389017 -0.76536686473018078 -3.0916715093103768 -0.61497169907716764 -0.76536686473018078 -3.152240934977427 -1.9301271388761741e-16 -0.76536686473018078 -3.0916715093103768 0.6149716990771672 -0.76536686473018078 -2.9122908813698865 1.2063103806389013 -0.76536686473018078 -2.6209925480898946 1.7512912307793371 -0.76536686473018078 -2.2289709410563616 2.2289709410563612 -0.76536686473018078 -1.7512912307793378 2.6209925480898941 -0.76536686473018078 -1.2063103806389019 2.9122908813698865 -0.76536686473018078 -0.61497169907716853 3.0916715093103768 -0.76536686473018078 -3.8602542777523482e-16 3.152240934977427 -0.76536686473018078 0.61497169907716775 3.0916715093103768 -0.76536686473018078 1.2063103806389013 2.9122908813698869 -0.76536686473018078 1.7512912307793371 2.6209925480898946 -0.76536686473018078 2.2289709410563612 2.2289709410563621 -0.76536686473018078 2.6209925480898941 1.7512912307793378 -0.76536686473018078 2.912290881369886 1.2063103806389033 -0.76536686473018078 3.0916715093103768 0.61497169907716875 -0.76536686473018078 3.152240934977427 5.7903814166285221e-16 -0.76536686473018078 3.0916715093103768 -0.61497169907716764 -0.76536686473018078 2.9122908813698865 -1.2063103806389022 -0.76536686473018078 2.6209925480898946 -1.7512912307793367 -0.76536686473018078 2.2289709410563621 -2.2289709410563607 -0.76536686473018078 1.7512912307793378 -2.6209925480898941 -0.76536686473018078 1.2063103806389035 -2.912290881369886 -0.76536686473018078 0.61497169907716887 -3.0916715093103768 -0.76536686473018078</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896 901 902 903 900 905 906 907 904 909 910 911 908 913 914 915 912 917 918 919 916 921 922 923 920 925 926 927 924 929 930 931 928 933 934 935 932 937 938 939 936 941 942 943 940 945 946 947 944 949 950 951 948 953 954 955 952 957 958 959 956 961 962 963 960 965 966 967 964 969 970 971 968 973 974 975 972 977 978 979 976 981 982 983 980 985 986 987 984 989 990 991 988 993 994 995 992 997 998 999 996 1001 1002 1003 1000 1005 1006 1007 1004 1009 1010 1011 1008 1013 1014 1015 1012 1017 1018 1019 1016 1021 1022 1023 1020 1025 1026 1027 1024 1029 1030 1031 1028 1033 1034 1035 1032 1037 1038 1039 1036 1041 1042 1043 1040 1045 1046 1047 1044 1049 1050 1051 1048 1053 1054 1055 1052 1057 1058 1059 1056 1061 1062 1063 1060 1065 1066 1067 1064 1069 1070 1071 1068 1073 1074 1075 1072 1077 1078 1079 1076 1081 1082 1083 1080 1085 1086 1087 1084 1089 1090 1091 1088 1093 1094 1095 1092 1097 1098 1099 1096 1101 1102 1103 1100 1105 1106 1107 1104 1109 1110 1111 1108 1113 1114 1115 1112 1117 1118 1119 1116 1121 1122 1123 1120 1125 1126 1127 1124 1129 1130 1131 1128 1133 1134 1135 1132 1137 1138 1139 1136 1141 1142 1143 1140 1145 1146 1147 1144 1149 1150 1151 1148 1153 1154 1155 1152 1157 1158 1159 1156 1161 1162 1163 1160 1165 1166 1167 1164 1169 1170 1171 1168 1173 1174 1175 1172 1177 1178 1179 1176 1181 1182 1183 1180 1185 1186 1187 1184 1189 1190 1191 1188 1193 1194 1195 1192 1197 1198 1199 1196 1201 1202 1203 1200 1205 1206 1207 1204 1209 1210 1211 1208 1213 1214 1215 1212 1217 1218 1219 1216 1221 1222 1223 1220 1225 1226 1227 1224 1229 1230 1231 1228 1233 1234 1235 1232 1237 1238 1239 1236 1241 1242 1243 1240 1245 1246 1247 1244 1249 1250 1251 1248 1253 1254 1255 1252 1257 1258 1259 1256 1261 1262 1263 1260 1265 1266 1267 1264 1269 1270 1271 1268 1273 1274 1275 1272 1277 1278 1279 1276 1281 1282 1283 1280 1285 1286 1287 1284 1289 1290 1291 1288 1293 1294 1295 1292 1297 1298 1299 1296 1301 1302 1303 1300 1305 1306 1307 1304 1309 1310 1311 1308 1313 1314 1315 1312 1317 1318 1319 1316 1321 1322 1323 1320 1325 1326 1327 1324 1329 1330 1331 1328 1333 1334 1335 1332 1337 1338 1339 1336 1341 1342 1343 1340 1345 1346 1347 1344 1349 1350 1351 1348 1353 1354 1355 1352 1357 1358 1359 1356 1361 1362 1363 1360 1365 1366 1367 1364 1369 1370 1371 1368 1373 1374 1375 1372 1377 1378 1379 1376 1381 1382 1383 1380 1385 1386 1387 1384 1389 1390 1391 1388 1393 1394 1395 1392 1397 1398 1399 1396 1401 1402 1403 1400 1405 1406 1407 1404 1409 1410 1411 1408 1413 1414 1415 1412 1417 1418 1419 1416 1421 1422 1423 1420 1425 1426 1427 1424 1429 1430 1431 1428 1433 1434 1435 1432 1437 1438 1439 1436 1441 1442 1443 1440 1445 1446 1447 1444 1449 1450 1451 1448 1453 1454 1455 1452 1457 1458 1459 1456 1461 1462 1463 1460 1465 1466 1467 1464 1469 1470 1471 1468 1473 1474 1475 1472 1477 1478 1479 1476 1481 1482 1483 1480 1485 1486 1487 1484 1489 1490 1491 1488 1493 1494 1495 1492 1497 1498 1499 1496 1501 1502 1503 1500 1505 1506 1507 1504 1509 1510 1511 1508 1513 1514 1515 1512 1517 1518 1519 1516 1521 1522 1523 1520 1525 1526 1527 1524 1529 1530 1531 1528 1533 1534 1535 1532 1537 1538 1539 1536 1541 1542 1543 1540 1545 1546 1547 1544 1549 1550 1551 1548 1553 1554 1555 1552 1557 1558 1559 1556 1561 1562 1563 1560 1565 1566 1567 1564 1569 1570 1571 1568 1573 1574 1575 1572 1577 1578 1579 1576 1581 1582 1583 1580 1585 1586 1587 1584 1589 1590 1591 1588 1593 1594 1595 1592 1597 1598 1599 1596 1601 1602 1603 1600 1605 1606 1607 1604 1609 1610 1611 1608 1613 1614 1615 1612 1617 1618 1619 1616 1621 1622 1623 1620 1625 1626 1627 1624 1629 1630 1631 1628 1633 1634 1635 1632 1637 1638 1639 1636 1641 1642 1643 1640 1645 1646 1647 1644 1649 1650 1651 1648 1653 1654 1655 1652 1657 1658 1659 1656 1661 1662 1663 1660 1665 1666 1667 1664 1669 1670 1671 1668 1673 1674 1675 1672 1677 1678 1679 1676 1681 1682 1683 1680 1685 1686 1687 1684 1689 1690 1691 1688 1693 1694 1695 1692 1697 1698 1699 1696 1701 1702 1703 1700 1705 1706 1707 1704 1709 1710 1711 1708 1713 1714 1715 1712 1717 1718 1719 1716 1721 1722 1723 1720 1725 1726 1727 1724 1729 1730 1731 1728 1733 1734 1735 1732 1737 1738 1739 1736 1741 1742 1743 1740 1745 1746 1747 1744 1749 1750 1751 1748 1753 1754 1755 1752 1757 1758 1759 1756 1761 1762 1763 1760 1765 1766 1767 1764 1769 1770 1771 1768 1773 1774 1775 1772 1777 1778 1779 1776 1781 1782 1783 1780 1785 1786 1787 1784 1789 1790 1791 1788 1793 1794 1795 1792 1797 1798 1799 1796 1801 1802 1803 1800 1805 1806 1807 1804 1809 1810 1811 1808 1813 1814 1815 1812 1817 1818 1819 1816 1821 1822 1823 1820 1825 1826 1827 1824 1829 1830 1831 1828 1833 1834 1835 1832 1837 1838 1839 1836 1841 1842 1843 1840 1845 1846 1847 1844 1849 1850 1851 1848 1853 1854 1855 1852 1857 1858 1859 1856 1861 1862 1863 1860 1865 1866 1867 1864 1869 1870 1871 1868 1873 1874 1875 1872 1877 1878 1879 1876 1881 1882 1883 1880 1885 1886 1887 1884 1889 1890 1891 1888 1893 1894 1895 1892 1897 1898 1899 1896 1901 1902 1903 1900 1905 1906 1907 1904 1909 1910 1911 1908 1913 1914 1915 1912 1917 1918 1919 1916 1921 1922 1923 1920 1925 1926 1927 1924 1929 1930 1931 1928 1933 1934 1935 1932 1937 1938 1939 1936 1941 1942 1943 1940 1945 1946 1947 1944 1949 1950 1951 1948 1953 1954 1955 1952 1957 1958 1959 1956 1961 1962 1963 1960 1965 1966 1967 1964 1969 1970 1971 1968 1973 1974 1975 1972 1977 1978 1979 1976 1981 1982 1983 1980 1985 1986 1987 1984 1989 1990 1991 1988 1993 1994 1995 1992 1997 1998 1999 1996 2001 2002 2003 2000 2005 2006 2007 2004 2009 2010 2011 2008 2013 2014 2015 2012 2017 2018 2019 2016 2021 2022 2023 2020 2025 2026 2027 2024 2029 2030 2031 2028 2033 2034 2035 2032 2037 2038 2039 2036 2041 2042 2043 2040 2045 2046 2047 2044</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896 900 904 908 912 916 920 924 928 932 936 940 944 948 952 956 960 964 968 972 976 980 984 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1800 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1900 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 33 32 1 2 34 33 2 3 35 34 3 4 36 35 4 5 37 36 5 6 38 37 6 7 39 38 7 8 40 39 8 9 41 40 9 10 42 41 10 11 43 42 11 12 44 43 12 13 45 44 13 14 46 45 14 15 47 46 15 16 48 47 16 17 49 48 17 18 50 49 18 19 51 50 19 20 52 51 20 21 53 52 21 22 54 53 22 23 55 54 23 24 56 55 24 25 57 56 25 26 58 57 26 27 59 58 27 28 60 59 28 29 61 60 29 30 62 61 30 31 63 62 31 0 32 63 32 33 65 64 33 34 66 65 34 35 67 66 35 36 68 67 36 37 69 68 37 38 70 69 38 39 71 70 39 40 72 71 40 41 73 72 41 42 74 73 42 43 75 74 43 44 76 75 44 45 77 76 45 46 78 77 46 47 79 78 47 48 80 79 48 49 81 80 49 50 82 81 50 51 83 82 51 52 84 83 52 53 85 84 53 54 86 85 54 55 87 86 55 56 88 87 56 57 89 88 57 58 90 89 58 59 91 90 59 60 92 91 60 61 93 92 61 62 94 93 62 63 95 94 63 32 64 95 64 65 97 96 65 66 98 97 66 67 99 98 67 68 100 99 68 69 101 100 69 70 102 101 70 71 103 102 71 72 104 103 72 73 105 104 73 74 106 105 74 75 107 106 75 76 108 107 76 77 109 108 77 78 110 109 78 79 111 110 79 80 112 111 80 81 113 112 81 82 114 113 82 83 115 114 83 84 116 115 84 85 117 116 85 86 118 117 86 87 119 118 87 88 120 119 88 89 121 120 89 90 122 121 90 91 123 122 91 92 124 123 92 93 125 124 93 94 126 125 94 95 127 126 95 64 96 127 96 97 129 128 97 98 130 129 98 99 131 130 99 100 132 131 100 101 133 132 101 102 134 133 102 103 135 134 103 104 136 135 104 105 137 136 105 106 138 137 106 107 139 138 107 108 140 139 108 109 141 140 109 110 142 141 110 111 143 142 111 112 144 143 112 113 145 144 113 114 146 145 114 115 147 146 115 116 148 147 116 117 149 148 117 118 150 149 118 119 151 150 119 120 152 151 120 121 153 152 121 122 154 153 122 123 155 154 123 124 156 155 124 125 157 156 125 126 158 157 126 127 159 158 127 96 128 159 128 129 161 160 129 130 162 161 130 131 163 162 131 132 164 163 132 133 165 164 133 134 166 165 134 135 167 166 135 136 168 167 136 137 169 168 137 138 170 169 138 139 171 170 139 140 172 171 140 141 173 172 141 142 174 173 142 143 175 174 143 144 176 175 144 145 177 176 145 146 178 177 146 147 179 178 147 148 180 179 148 149 181 180 149 150 182 181 150 151 183 182 151 152 184 183 152 153 185 184 153 154 186 185 154 155 187 186 155 156 188 187 156 157 189 188 157 158 190 189 158 159 191 190 159 128 160 191 160 161 193 192 161 162 194 193 162 163 195 194 163 164 196 195 164 165 197 196 165 166 198 197 166 167 199 198 167 168 200 199 168 169 201 200 169 170 202 201 170 171 203 202 171 172 204 203 172 173 205 204 173 174 206 205 174 175 207 206 175 176 208 207 176 177 209 208 177 178 210 209 178 179 211 210 179 180 212 211 180 181 213 212 181 182 214 213 182 183 215 214 183 184 216 215 184 185 217 216 185 186 218 217 186 187 219 218 187 188 220 219 188 189 221 220 189 190 222 221 190 191 223 222 191 160 192 223 192 193 225 224 193 194 226 225 194 195 227 226 195 196 228 227 196 197 229 228 197 198 230 229 198 199 231 230 199 200 232 231 200 201 233 232 201 202 234 233 202 203 235 234 203 204 236 235 204 205 237 236 205 206 238 237 206 207 239 238 207 208 240 239 208 209 241 240 209 210 242 241 210 211 243 242 211 212 244 243 212 213 245 244 213 214 246 245 214 215 247 246 215 216 248 247 216 217 249 248 217 218 250 249 218 219 251 250 219 220 252 251 220 221 253 252 221 222 254 253 222 223 255 254 223 192 224 255 224 225 257 256 225 226 258 257 226 227 259 258 227 228 260 259 228 229 261 260 229 230 262 261 230 231 263 262 231 232 264 263 232 233 265 264 233 234 266 265 234 235 267 266 235 236 268 267 236 237 269 268 237 238 270 269 238 239 271 270 239 240 272 271 240 241 273 272 241 242 274 273 242 243 275 274 243 244 276 275 244 245 277 276 245 246 278 277 246 247 279 278 247 248 280 279 248 249 281 280 249 250 282 281 250 251 283 282 251 252 284 283 252 253 285 284 253 254 286 285 254 255 287 286 255 224 256 287 256 257 289 288 257 258 290 289 258 259 291 290 259 260 292 291 260 261 293 292 261 262 294 293 262 263 295 294 263 264 296 295 264 265 297 296 265 266 298 297 266 267 299 298 267 268 300 299 268 269 301 300 269 270 302 301 270 271 303 302 271 272 304 303 272 273 305 304 273 274 306 305 274 275 307 306 275 276 308 307 276 277 309 308 277 278 310 309 278 279 311 310 279 280 312 311 280 281 313 312 281 282 314 313 282 283 315 314 283 284 316 315 284 285 317 316 285 286 318 317 286 287 319 318 287 256 288 319 288 289 321 320 289 290 322 321 290 291 323 322 291 292 324 323 292 293 325 324 293 294 326 325 294 295 327 326 295 296 328 327 296 297 329 328 297 298 330 329 298 299 331 330 299 300 332 331 300 301 333 332 301 302 334 333 302 303 335 334 303 304 336 335 304 305 337 336 305 306 338 337 306 307 339 338 307 308 340 339 308 309 341 340 309 310 342 341 310 311 343 342 311 312 344 343 312 313 345 344 313 314 346 345 314 315 347 346 315 316 348 347 316 317 349 348 317 318 350 349 318 319 351 350 319 288 320 351 320 321 353 352 321 322 354 353 322 323 355 354 323 324 356 355 324 325 357 356 325 326 358 357 326 327 359 358 327 328 360 359 328 329 361 360 329 330 362 361 330 331 363 362 331 332 364 363 332 333 365 364 333 334 366 365 334 335 367 366 335 336 368 367 336 337 369 368 337 338 370 369 338 339 371 370 339 340 372 371 340 341 373 372 341 342 374 373 342 343 375 374 343 344 376 375 344 345 377 376 345 346 378 377 346 347 379 378 347 348 380 379 348 349 381 380 349 350 382 381 350 351 383 382 351 320 352 383 352 353 385 384 353 354 386 385 354 355 387 386 355 356 388 387 356 357 389 388 357 358 390 389 358 359 391 390 359 360 392 391 360 361 393 392 361 362 394 393 362 363 395 394 363 364 396 395 364 365 397 396 365 366 398 397 366 367 399 398 367 368 400 399 368 369 401 400 369 370 402 401 370 371 403 402 371 372 404 403 372 373 405 404 373 374 406 405 374 375 407 406 375 376 408 407 376 377 409 408 377 378 410 409 378 379 411 410 379 380 412 411 380 381 413 412 381 382 414 413 382 383 415 414 383 352 384 415 384 385 417 416 385 386 418 417 386 387 419 418 387 388 420 419 388 389 421 420 389 390 422 421 390 391 423 422 391 392 424 423 392 393 425 424 393 394 426 425 394 395 427 426 395 396 428 427 396 397 429 428 397 398 430 429 398 399 431 430 399 400 432 431 400 401 433 432 401 402 434 433 402 403 435 434 403 404 436 435 404 405 437 436 405 406 438 437 406 407 439 438 407 408 440 439 408 409 441 440 409 410 442 441 410 411 443 442 411 412 444 443 412 413 445 444 413 414 446 445 414 415 447 446 415 384 416 447 416 417 449 448 417 418 450 449 418 419 451 450 419 420 452 451 420 421 453 452 421 422 454 453 422 423 455 454 423 424 456 455 424 425 457 456 425 426 458 457 426 427 459 458 427 428 460 459 428 429 461 460 429 430 462 461 430 431 463 462 431 432 464 463 432 433 465 464 433 434 466 465 434 435 467 466 435 436 468 467 436 437 469 468 437 438 470 469 438 439 471 470 439 440 472 471 440 441 473 472 441 442 474 473 442 443 475 474 443 444 476 475 444 445 477 476 445 446 478 477 446 447 479 478 447 416 448 479 448 449 481 480 449 450 482 481 450 451 483 482 451 452 484 483 452 453 485 484 453 454 486 485 454 455 487 486 455 456 488 487 456 457 489 488 457 458 490 489 458 459 491 490 459 460 492 491 460 461 493 492 461 462 494 493 462 463 495 494 463 464 496 495 464 465 497 496 465 466 498 497 466 467 499 498 467 468 500 499 468 469 501 500 469 470 502 501 470 471 503 502 471 472 504 503 472 473 505 504 473 474 506 505 474 475 507 506 475 476 508 507 476 477 509 508 477 478 510 509 478 479 511 510 479 448 480 511 480 481 1 0 481 482 2 1 482 483 3 2 483 484 4 3 484 485 5 4 485 486 6 5 486 487 7 6 487 488 8 7 488 489 9 8 489 490 10 9 490 491 11 10 491 492 12 11 492 493 13 12 493 494 14 13 494 495 15 14 495 496 16 15 496 497 17 16 497 498 18 17 498 499 19 18 499 500 20 19 500 501 21 20 501 502 22 21 502 503 23 22 503 504 24 23 504 505 25 24 505 506 26 25 506 507 27 26 507 508 28 27 508 509 29 28 509 510 30 29 510 511 31 30 511 480 0 31\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.QuadricCone.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"cone\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"heights\" type=\"k3d::double_t\">10</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">5</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.QuadricCylinder.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"cylinder\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">5</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"z_max\" type=\"k3d::double_t\">5</array>\n\t\t\t\t\t\t<array name=\"z_min\" type=\"k3d::double_t\">-5</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.QuadricDisk.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"disk\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"heights\" type=\"k3d::double_t\">0</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">5</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.QuadricHyperboloid.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"hyperboloid\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"end_points\" type=\"k3d::point3\">5 5 5</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"start_points\" type=\"k3d::point3\">5 -5 -5</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.QuadricLogo.reference.Darwin-i386.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"cylinder\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">0 -0.10000000000000001 0 1.1500000000000001 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -1.1500000000000001 0 0 0 1 0 -0.070710678118654752 0.070710678118654752 3.75 -0.10000000000000001 0 0 0 0 -0.070710678118654752 -0.070710678118654752 -6.3000000000000007 0 0 0 1 0 0 0.10000000000000001 7.1000000000000005 -0.10000000000000001 0 0 0 0 -0.10000000000000001 0 -5.75 0 0 0 1 0 0 -0.10000000000000001 14.5 -0.10000000000000001 0 0 0 0 0.10000000000000001 0 -3 0 0 0 1 0 0.07587511008748879 0.065138066207183778 12.225000000000001 -0.10000000000000001 0 0 0 0 -0.065138066207183778 0.07587511008748879 -5.6500000000000004 0 0 0 1 0 -0.10000000000000001 0 17.199999999999999 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -2.9000000000000004 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">10 10 10 10 10 10</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"z_max\" type=\"k3d::double_t\">58.5 35.945066114836962 19.917000000000002 44.5 34.925814235318839 75.5</array>\n\t\t\t\t\t\t<array name=\"z_min\" type=\"k3d::double_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"sphere\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">0 -0.10000000000000001 0 1.1500000000000001 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -7.0000000000000009 0 0 0 1 0 -0.10000000000000001 0 1.1500000000000001 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -1.1500000000000001 0 0 0 1 0 -0.070710678118654752 0.070710678118654752 6.2917000000000005 -0.10000000000000001 0 0 0 0 -0.070710678118654752 -0.070710678118654752 -8.8417000000000012 0 0 0 1 0 -0.070710678118654752 0.070710678118654752 3.75 -0.10000000000000001 0 0 0 0 -0.070710678118654752 -0.070710678118654752 -6.3000000000000007 0 0 0 1 0.10000000000000001 0 0 4.7000000000000002 0 0.10000000000000001 0 0 0 0 0.10000000000000001 -3.9000000000000004 0 0 0 1 0 0 0.10000000000000001 9.0917000000000012 -0.10000000000000001 0 0 0 0 -0.10000000000000001 0 -5.75 0 0 0 1 0 0 0.10000000000000001 7.1000000000000005 -0.10000000000000001 0 0 0 0 -0.10000000000000001 0 -5.75 0 0 0 1 0 0 -0.10000000000000001 10.050000000000001 -0.10000000000000001 0 0 0 0 0.10000000000000001 0 -3 0 0 0 1 0 0 -0.10000000000000001 14.5 -0.10000000000000001 0 0 0 0 0.10000000000000001 0 -3 0 0 0 1 0 0.07587511008748879 0.065138066207183778 14.500000000000002 -0.10000000000000001 0 0 0 0 -0.065138066207183778 0.07587511008748879 -3.0000000000000004 0 0 0 1 0 0.07587511008748879 0.065138066207183778 12.225000000000001 -0.10000000000000001 0 0 0 0 -0.065138066207183778 0.07587511008748879 -5.6500000000000004 0 0 0 1 -0.10000000000000001 1.4997597826618576e-33 -1.2246467991473533e-17 9.8500000000000014 0 -0.10000000000000001 -1.2246467991473533e-17 0 -1.2246467991473533e-17 -1.2246467991473533e-17 0.10000000000000001 -8.0250000000000004 0 0 0 1 6.1232339957367648e-18 -6.1232339957367656e-18 0.10000000000000001 12.225000000000001 -6.1232339957367663e-18 -0.10000000000000001 -6.1232339957367656e-18 -1.4542680739874821e-16 0.10000000000000001 -6.1232339957367663e-18 -6.1232339957367648e-18 -5.6500000000000004 0 0 0 1 0 -0.10000000000000001 0 17.199999999999999 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -10.450000000000001 0 0 0 1 0 -0.10000000000000001 0 17.199999999999999 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -2.9000000000000004 0 0 0 1 6.1232339957367663e-18 1.2246467991473533e-17 -0.10000000000000001 19.75 0 -0.10000000000000001 -1.2246467991473533e-17 0 -0.10000000000000001 7.498798913309288e-34 -6.1232339957367663e-18 -10.450000000000001 0 0 0 1 6.1232339957367663e-18 0 0.10000000000000001 19.75 7.4987989133092889e-34 -0.10000000000000001 0 2.8307965897742564e-32 0.10000000000000001 7.498798913309288e-34 -6.1232339957367663e-18 -2.9000000000000004 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"z_max\" type=\"k3d::double_t\">1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0</array>\n\t\t\t\t\t\t<array name=\"z_min\" type=\"k3d::double_t\">0 -1 0 -1 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"torus\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"major_radii\" type=\"k3d::double_t\">23.75 37.75</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">-0.10000000000000001 1.2246467991473533e-17 7.498798913309288e-34 12.225000000000001 0 6.1232339957367663e-18 -0.10000000000000001 0 -1.2246467991473533e-17 -0.10000000000000001 -6.1232339957367663e-18 -8.0250000000000004 0 0 0 1 6.1232339957367663e-18 0.10000000000000001 6.1232339957367663e-18 19.75 0 6.1232339957367663e-18 -0.10000000000000001 0 -0.10000000000000001 6.1232339957367663e-18 3.749399456654644e-34 -6.6750000000000007 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"minor_radii\" type=\"k3d::double_t\">10 10</array>\n\t\t\t\t\t\t<array name=\"phi_max\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"phi_min\" type=\"k3d::double_t\">0 0</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">4.7123889803846897 3.1415926535897931</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.QuadricLogo.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"cylinder\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">0 -0.10000000000000001 0 1.1500000000000001 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -1.1500000000000001 0 0 0 1 0 -0.070710678118654766 0.070710678118654766 3.75 -0.10000000000000001 0 0 0 0 -0.070710678118654766 -0.070710678118654766 -6.3000000000000007 0 0 0 1 0 0 0.10000000000000001 7.1000000000000005 -0.10000000000000001 0 0 0 0 -0.10000000000000001 0 -5.75 0 0 0 1 0 0 -0.10000000000000001 14.5 -0.10000000000000001 0 0 0 0 0.10000000000000001 0 -3 0 0 0 1 0 0.075875110087488803 0.065138066207183778 12.225000000000001 -0.10000000000000001 0 0 0 0 -0.065138066207183778 0.075875110087488803 -5.6500000000000004 0 0 0 1 0 -0.10000000000000001 0 17.199999999999999 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -2.9000000000000004 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">10 10 10 10 10 10</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"z_max\" type=\"k3d::double_t\">58.5 35.945066114836962 19.917000000000002 44.5 34.925814235318839 75.5</array>\n\t\t\t\t\t\t<array name=\"z_min\" type=\"k3d::double_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"sphere\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">0 -0.10000000000000001 0 1.1500000000000001 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -7.0000000000000009 0 0 0 1 0 -0.10000000000000001 0 1.1500000000000001 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -1.1500000000000001 0 0 0 1 0 -0.070710678118654766 0.070710678118654766 6.2917000000000005 -0.10000000000000001 0 0 0 0 -0.070710678118654766 -0.070710678118654766 -8.8417000000000012 0 0 0 1 0 -0.070710678118654766 0.070710678118654766 3.75 -0.10000000000000001 0 0 0 0 -0.070710678118654766 -0.070710678118654766 -6.3000000000000007 0 0 0 1 0.10000000000000001 0 0 4.7000000000000002 0 0.10000000000000001 0 0 0 0 0.10000000000000001 -3.9000000000000004 0 0 0 1 0 0 0.10000000000000001 9.0917000000000012 -0.10000000000000001 0 0 0 0 -0.10000000000000001 0 -5.75 0 0 0 1 0 0 0.10000000000000001 7.1000000000000005 -0.10000000000000001 0 0 0 0 -0.10000000000000001 0 -5.75 0 0 0 1 0 0 -0.10000000000000001 10.049999999999999 -0.10000000000000001 0 0 0 0 0.10000000000000001 0 -3 0 0 0 1 0 0 -0.10000000000000001 14.5 -0.10000000000000001 0 0 0 0 0.10000000000000001 0 -3 0 0 0 1 0 0.075875110087488803 0.065138066207183778 14.500000000000002 -0.10000000000000001 0 0 0 0 -0.065138066207183778 0.075875110087488803 -3 0 0 0 1 0 0.075875110087488803 0.065138066207183778 12.225000000000001 -0.10000000000000001 0 0 0 0 -0.065138066207183778 0.075875110087488803 -5.6500000000000004 0 0 0 1 -0.10000000000000001 1.4996607218221375e-33 -1.2246063538223773e-17 9.8500000000000014 0 -0.10000000000000001 -1.2246063538223773e-17 0 -1.2246063538223773e-17 -1.2246063538223773e-17 0.10000000000000001 -8.0250000000000004 0 0 0 1 6.1230317691118872e-18 -6.1230317691118857e-18 0.10000000000000001 12.225000000000001 -6.1230317691118864e-18 -0.10000000000000001 -6.1230317691118857e-18 -1.454220045164073e-16 0.10000000000000001 -6.1230317691118864e-18 -6.1230317691118872e-18 -5.6500000000000004 0 0 0 1 0 -0.10000000000000001 0 17.199999999999999 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -10.450000000000001 0 0 0 1 0 -0.10000000000000001 0 17.199999999999999 -0.10000000000000001 0 0 0 0 0 -0.10000000000000001 -2.9000000000000004 0 0 0 1 6.1230317691118864e-18 1.2246063538223773e-17 -0.10000000000000001 19.75 0 -0.10000000000000001 -1.2246063538223773e-17 0 -0.10000000000000001 7.4983036091106877e-34 -6.1230317691118864e-18 -10.450000000000001 0 0 0 1 6.1230317691118864e-18 -1.8582214697798721e-34 0.10000000000000001 19.75 7.4983036091106877e-34 -0.10000000000000001 -1.8582214697798721e-34 2.8306096124392847e-32 0.10000000000000001 7.4983036091106877e-34 -6.1230317691118864e-18 -2.9000000000000004 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"z_max\" type=\"k3d::double_t\">1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0</array>\n\t\t\t\t\t\t<array name=\"z_min\" type=\"k3d::double_t\">0 -1 0 -1 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"torus\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"major_radii\" type=\"k3d::double_t\">23.75 37.75</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0 0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">-0.10000000000000001 1.2246063538223773e-17 7.4983036091106877e-34 12.225000000000001 0 6.1230317691118864e-18 -0.10000000000000001 0 -1.2246063538223773e-17 -0.10000000000000001 -6.1230317691118864e-18 -8.0250000000000004 0 0 0 1 6.1230317691118864e-18 0.10000000000000001 6.1230317691118864e-18 19.75 0 6.1230317691118864e-18 -0.10000000000000001 0 -0.10000000000000001 6.1230317691118864e-18 3.7491518045553439e-34 -6.6750000000000007 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"minor_radii\" type=\"k3d::double_t\">10 10</array>\n\t\t\t\t\t\t<array name=\"phi_max\" type=\"k3d::double_t\">6.2831853071795862 6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"phi_min\" type=\"k3d::double_t\">0 0</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">4.7123889803846897 3.1415926535897931</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.QuadricParaboloid.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"paraboloid\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">5</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"z_max\" type=\"k3d::double_t\">10</array>\n\t\t\t\t\t\t<array name=\"z_min\" type=\"k3d::double_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.QuadricSphere.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"sphere\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"radii\" type=\"k3d::double_t\">5</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"z_max\" type=\"k3d::double_t\">1</array>\n\t\t\t\t\t\t<array name=\"z_min\" type=\"k3d::double_t\">-1</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.QuadricTorus.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"torus\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"major_radii\" type=\"k3d::double_t\">5</array>\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"minor_radii\" type=\"k3d::double_t\">2</array>\n\t\t\t\t\t\t<array name=\"phi_max\" type=\"k3d::double_t\">6.2831853071795862</array>\n\t\t\t\t\t\t<array name=\"phi_min\" type=\"k3d::double_t\">0</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"sweep_angles\" type=\"k3d::double_t\">6.2831853071795862</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.STLMeshReader.magics.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.STLMeshReader.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 -2.5 2.5 2.5 -2.5 2.5 2.5 2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 2.5 -2.5 -2.5 2.5 2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 0 2 3 0 3 4 0 4 5 1 0 5 1 5 6 2 1 6 2 6 7 3 2 7 3 7 4 6 5 4 6 4 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.STLMeshReader.stl",
    "content": "solid\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex -2.5 -2.5 2.5\n    vertex 2.5 -2.5 2.5\n    vertex 2.5 2.5 2.5\n  endloop\nendfacet\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex -2.5 -2.5 2.5\n    vertex 2.5 2.5 2.5\n    vertex -2.5 2.5 2.5\n  endloop\nendfacet\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex -2.5 -2.5 2.5\n    vertex -2.5 2.5 2.5\n    vertex -2.5 2.5 -2.5\n  endloop\nendfacet\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex -2.5 -2.5 2.5\n    vertex -2.5 2.5 -2.5\n    vertex -2.5 -2.5 -2.5\n  endloop\nendfacet\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex 2.5 -2.5 2.5\n    vertex -2.5 -2.5 2.5\n    vertex -2.5 -2.5 -2.5\n  endloop\nendfacet\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex 2.5 -2.5 2.5\n    vertex -2.5 -2.5 -2.5\n    vertex 2.5 -2.5 -2.5\n  endloop\nendfacet\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex 2.5 2.5 2.5\n    vertex 2.5 -2.5 2.5\n    vertex 2.5 -2.5 -2.5\n  endloop\nendfacet\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex 2.5 2.5 2.5\n    vertex 2.5 -2.5 -2.5\n    vertex 2.5 2.5 -2.5\n  endloop\nendfacet\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex -2.5 2.5 2.5\n    vertex 2.5 2.5 2.5\n    vertex 2.5 2.5 -2.5\n  endloop\nendfacet\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex -2.5 2.5 2.5\n    vertex 2.5 2.5 -2.5\n    vertex -2.5 2.5 -2.5\n  endloop\nendfacet\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex 2.5 -2.5 -2.5\n    vertex -2.5 -2.5 -2.5\n    vertex -2.5 2.5 -2.5\n  endloop\nendfacet\nfacet normal 0.0 0.0 0.0\n  outer loop\n    vertex 2.5 -2.5 -2.5\n    vertex -2.5 2.5 -2.5\n    vertex 2.5 2.5 -2.5\n  endloop\nendfacet\n"
  },
  {
    "path": "tests/meshes/mesh.source.STLMeshReader.viscam.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-7.630000114440918 3.619999885559082 5.0900001525878906 7.630000114440918 3.619999885559082 5.0900001525878906 7.630000114440918 3.619999885559082 1.6966667175292969 -7.630000114440918 3.619999885559082 1.6966667175292969 7.630000114440918 -3.619999885559082 5.0900001525878906 7.630000114440918 -3.619999885559082 1.6966667175292969 -7.630000114440918 -3.619999885559082 5.0900001525878906 -7.630000114440918 -3.619999885559082 1.6966667175292969 7.630000114440918 3.619999885559082 -1.6966667175292969 -7.630000114440918 3.619999885559082 -1.6966667175292969 7.630000114440918 -3.619999885559082 -1.6966667175292969 -7.630000114440918 -3.619999885559082 -1.6966667175292969 7.630000114440918 3.619999885559082 -5.0900001525878906 -7.630000114440918 3.619999885559082 -5.0900001525878906 7.630000114440918 -3.619999885559082 -5.0900001525878906 -7.630000114440918 -3.619999885559082 -5.0900001525878906</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20 18 22 23 21 25 26 24 28 29 27 31 32 30 34 35 33 37 38 36 40 41 39 43 44 42 46 47 45 49 50 48 52 53 51 55 56 54 58 59 57 61 62 60 64 65 63 67 68 66 70 71 69 73 74 72 76 77 75 79 80 78 82 83 81</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 0 2 3 1 4 5 1 5 2 4 6 7 4 7 5 6 0 3 6 3 7 3 2 8 3 8 9 2 5 10 2 10 8 5 7 11 5 11 10 7 3 9 7 9 11 9 8 12 9 12 13 8 10 14 8 14 12 10 11 15 10 15 14 11 9 13 11 13 15 1 0 6 1 6 4 13 12 14 13 14 15\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 0.80000000000000004 0.80000000000000004 0.80000000000000004 0.80000000000000004 0.80000000000000004 0.80000000000000004 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 0.80000000000000004 0.80000000000000004 0.80000000000000004 0.80000000000000004 0.80000000000000004 0.80000000000000004 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675 1 0.22580645161290322 0.77419354838709675</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.SVGMeshReader.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>87.337108228424 146.647920898102 0 290.19425822842402 146.647920898102 0 326.94863217881601 315.21936214316798 0 124.09148217881599 315.21936214316798 0 398.57141000000001 148.07649000000001 0 601.42856000000006 148.07649000000001 0 601.42856000000006 316.64792 0 398.57141000000001 316.64792 0 392.85712000000001 388.07648 0 392.85712000000001 368.07648 0 442.85712000000001 368.07648 0 545.71426999999994 368.07648 0 595.71426999999994 368.07648 0 595.71426999999994 388.07648 0 595.71426999999994 516.64791000000002 0 595.71426999999994 536.64791000000002 0 545.71426999999994 536.64791000000002 0 442.85712000000001 536.64791000000002 0 392.85712000000001 536.64791000000002 0 392.85712000000001 516.64791000000002 0 0 0 0 100 100 0 110 50 0 110 110 0 50.000000000000007 110 0 -9.9999999999999929 110 0 -10 50.000000000000007 0 -10.000000000000007 -9.9999999999999858 0 49.999999999999986 -10 0 109.99999999999999 -10.000000000000007 0 110 49.999999999999986 0 130 50 0 130 120 0 50.000000000000007 120 0 -29.999999999999986 120 0 -30 50.000000000000007 0 -30.000000000000014 -19.999999999999986 0 49.999999999999986 -20 0 130 -20.000000000000014 0 130 49.999999999999986 0 200 200 0 300 300 0 200 300 0 400 400 0 500 500 0 400 500 0 600 800 0 700 900 0 800 900 0 800 950 0 800 1050 0 900 1050 0 900 1150 0 300 800 0 300 900 0 400 900 0 400 1100 0 400 1300 0 500 1250 0 600 1200 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"nurbs_curve\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"material\" type=\"k3d::imaterial*\">2</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"curve\">\n\t\t\t\t\t\t<array name=\"curve_first_knots\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 38 42 48 52 58 62 68 72 76 88 100 105 111 115 119 123 131 135 143 151</array>\n\t\t\t\t\t\t<array name=\"curve_first_points\" type=\"k3d::uint_t\">0 2 4 6 8 10 12 14 16 19 21 24 26 29 31 34 36 38 47 56 59 63 65 67 69 73 75 79 83</array>\n\t\t\t\t\t\t<array name=\"curve_orders\" type=\"k3d::uint_t\">2 2 2 2 2 2 2 2 3 2 3 2 3 2 3 2 2 3 3 2 2 2 2 2 4 2 4 4 2</array>\n\t\t\t\t\t\t<array name=\"curve_point_counts\" type=\"k3d::uint_t\">2 2 2 2 2 2 2 2 3 2 3 2 3 2 3 2 2 9 9 3 4 2 2 2 4 2 4 4 2</array>\n\t\t\t\t\t\t<array name=\"curve_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"knot\">\n\t\t\t\t\t\t<array name=\"curve_knots\" type=\"k3d::double_t\">0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1 2 2 3 3 4 4 4 0 0 0 1 1 2 2 3 3 4 4 4 0 0 1 2 2 0 0 1 2 3 3 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"curve_point_weights\" type=\"k3d::double_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.70710678118654757 1 1 1 1 0.70710678118654757 1 1 1 1 0.70710678118654757 1 1 1 1 0.70710678118654757 1 1 1 1 1 1 0.70710678118654757 1 0.70710678118654757 1 0.70710678118654757 1 0.70710678118654757 1 1 0.70710678118654757 1 0.70710678118654757 1 0.70710678118654757 1 0.70710678118654757 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"curve_points\" type=\"k3d::uint_t\">0 1 1 2 2 3 3 0 4 5 5 6 6 7 7 4 8 9 10 10 11 11 12 13 13 14 14 15 16 16 17 17 18 19 19 8 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 43 46 47 47 48 48 49 49 50 51 52 52 46 53 54 55 56 56 57 58 59 59 53\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"curve\"/>\n\t\t\t\t\t<table type=\"parameter\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.SphereEversion.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.3891928076198598e-09 1.393381665747619e-08 -5 -0.13273293600906821 0.77410093896211007 -4.9999999947704303 -0.23879699815184485 1.456575369804747 -4.5541657294473969 -0.29388289915620586 1.9124335777598276 -3.9241838901962742 -3.301158975278074e-09 1.3777444353883936e-08 -5 -0.18339772398782497 0.76541358861512054 -4.9999999947704303 -0.33222779902080585 1.4412339084801546 -4.5542552121822473 -0.4227670445041749 1.8926282954478797 -3.9240958338115348 -4.1977016459768423e-09 1.3531257310235093e-08 -5 -0.23320565100984914 0.7517365303998893 -4.9999999947704303 -0.42647213182498234 1.4180925512183746 -4.5542332598784592 -0.54503155377182178 1.856696331843787 -3.9237978632131192 -5.0616379163795472e-09 1.319997388329281e-08 -5 -0.28120211131750328 0.73333189525220166 -4.9999999947704303 -0.51928942098023378 1.3845320165618489 -4.5540927235145698 -0.65880253358904184 1.8114333977524353 -3.9235932029191516 -5.9255741867822506e-09 1.2868690456350528e-08 -5 -0.32919857162515731 0.71492726010451402 -4.9999999947704303 -0.61210671013548534 1.3509714819053231 -4.5539521871506805 -0.7725735134062619 1.7661704636610833 -3.923388542625184 -6.7568613318353538e-09 1.2452327029385933e-08 -5 -0.37538119160431432 0.69179595820611484 -4.9999999947704303 -0.69804226227048827 1.3058671965647468 -4.5499065825209621 -0.87911768584279226 1.6966023680393247 -3.9418063511561829 -7.5395671186120148e-09 1.1958863515405128e-08 -5 -0.41886484718796768 0.6643813180650161 -4.9999999947704303 -0.77859391379943088 1.2559020052932015 -4.5499960652558125 -0.98901030045929861 1.6299226233399104 -3.9417182947714435 -8.3222729053886773e-09 1.1465400001424323e-08 -5 -0.46234850277162093 0.63696667792391759 -4.9999999947704303 -0.85914556532837361 1.2059368140216566 -4.5500855479906637 -1.098902915075805 1.5632428786404964 -3.9416302383867041 -9.0563586260029225e-09 1.0894860804142925e-08 -5 -0.50313104352162308 0.60527005530212219 -4.9999999947704303 -0.93823808004942744 1.148639658613622 -4.554131152620382 -1.2091286301545354 1.5014130522323044 -3.9232124298557061 -9.7277549847141762e-09 1.0258180729228352e-08 -5 -0.54043084188311075 0.56989893941392789 -4.9999999947704303 -1.0095983318105226 1.0804173341964742 -4.5540927235145698 -1.3018597269021539 1.42143342588618 -3.9235932029191516 -1.039915134342543e-08 9.6215006543137789e-09 -5 -0.57773064024459853 0.53452782352573358 -4.9999999947704303 -1.080958583571618 1.0121950097793266 -4.5540542944087576 -1.3945908236497726 1.3414537995400555 -3.9239739759825976 -1.1007825137037626e-08 8.9187111881050329e-09 -5 -0.61154585159553576 0.49548396361222663 -4.9999999947704303 -1.1435917964881988 0.93801294878014152 -4.5540762467125457 -1.4829709385340506 1.2496274631237831 -3.9242719465810136 -1.1542110682141615e-08 8.1632818104813583e-09 -5 -0.64122838240179381 0.45351566412416949 -4.9999999947704303 -1.1988092980184004 0.8610993445780788 -4.5541657294473969 -1.5601013422709398 1.1444881605347093 -3.9241838901962742 -0.34896880016056686 2.3682917857149079 -3.2942020509451519 -0.35440257013029636 2.6092230410694173 -2.4930626592556555 -0.3236670173717579 2.7418514601399591 -1.7515749127262328 -0.51330628998754391 2.3440226824156047 -3.2939364554408233 -0.54956526024171759 2.5820644792650587 -2.4926871801890322 -0.56802875516418982 2.7110441325220442 -1.7471630864971588 -0.66359097571866099 2.2953001124691994 -3.2933624665477801 -0.7115785093999567 2.515421992037485 -2.4926321599348364 -0.7279315475098842 2.5994237369097033 -1.7520298853594396 -0.79831564619784978 2.2383347789430217 -3.2930936823237333 -0.8411609239525164 2.4485932979840515 -2.4936206142624369 -0.8195033501168264 2.5326228968077213 -1.7593940340559813 -0.93304031667703857 2.1813694454168435 -3.292824898099687 -0.97074333850507588 2.3817646039306175 -2.4946090685900368 -0.9110751527237686 2.4658220567057394 -1.7667581827525232 -1.0601931094150963 2.0873375395139027 -3.3337061197914029 -1.1046416157343399 2.2705204390977189 -2.5858527378715501 -1.0419533435613204 2.3279343401651746 -1.9154012332922599 -1.1994266871191663 2.0039432413866196 -3.3334405242870746 -1.2679810426661533 2.1745365338988081 -2.5854772588049268 -1.2430682032092273 2.2128456728059214 -1.9109894070631861 -1.3386602648232362 1.9205489432593366 -3.3331749287827455 -1.4313204695979667 2.0785526286998972 -2.5851017797383031 -1.4441830628571339 2.0977570054466681 -1.9065775808341123 -1.4800191802596432 1.8541864458509869 -3.2922937070910292 -1.5904809234459556 2.0196699005113183 -2.4938581104567903 -1.617365404068055 2.0673183296891211 -1.757934530294375 -1.5941211219937852 1.7624495175758856 -3.2930936823237333 -1.7141674489267047 1.9403068819022362 -2.4936206142624369 -1.7263151950341624 2.0262281030727016 -1.7593940340559813 -1.708223063727927 1.6707125893007844 -3.2938936575564384 -1.8378539744074538 1.8609438632931539 -2.493383118068083 -1.8352649860002699 1.9851378764562824 -1.7608535378175878 -1.8223500805799024 1.5612419774674244 -3.2944676464494811 -1.9768029081841854 1.7516037101908277 -2.4934381383222783 -2.0166431317145013 1.9044885297656291 -1.7559867389553068 -1.9213933865234791 1.4278769764913397 -3.2942020509451519 -2.0955997665774442 1.5943988453592972 -2.4930626592556555 -2.1676489033011959 1.7099146176412081 -1.7515749127262328 -0.29293146461321945 2.8744798792105009 -1.0100871661968105 -0.22746247248711865 2.9119387162937747 -0.328043792749388 -0.15613639887297381 3.0055369055101107 0.18152937719693438 -0.58649225008666206 2.8400237857790294 -1.0016389928052856 -0.59069802723054465 2.8709117504924069 -0.31180660564986462 -0.61892871126326088 2.9686808037775378 0.22366590436094613 -0.74428458561981192 2.6834254817819216 -1.011427610784043 -0.73299167128358245 2.6382788666223886 -0.34130352212293025 -0.74625089298334324 2.6247693021333358 0.22969079296653705 -0.7978457762811364 2.6166524956313912 -1.0251674538495261 -0.71683672383972574 2.5852492378606096 -0.36466121884116554 -0.63966248721335595 2.5942339645234815 0.18912176411698328 -0.8514069669424611 2.5498795094808617 -1.038907296915009 -0.70068177639586926 2.5322196090988296 -0.38801891555940093 -0.53307408144336865 2.5636986269136268 0.14855273526742951 -0.97926507138830066 2.3853482412326303 -1.2449497287129703 -0.815747067063055 2.326224973972689 -0.66871004740253426 -0.61869615947435064 2.2506495863571852 -0.12629319400467287 -1.218155363752301 2.2511548117130347 -1.2365015553214456 -1.1068560897159476 2.1635614418005265 -0.65247286030301077 -0.98912134811938701 2.0594778141106072 -0.084156666840661143 -1.4570456561163012 2.1169613821934394 -1.2280533819299209 -1.3979651123688401 2.0008979096283634 -0.6362356732034874 -1.3595465367644233 1.8683060418640292 -0.042020139676649443 -1.6442498846901541 2.1149667588669239 -1.0220109501319596 -1.5977051794353154 2.0522143606805483 -0.35554454136035385 -1.604766879550277 2.0319129502223907 0.23282578959545314 -1.7384629411416199 2.112149324243167 -1.0251674538495261 -1.6516028291716986 2.1141373193754878 -0.36466121884116554 -1.5837414375536227 2.1519714262068583 0.18912176411698331 -1.8326759975930862 2.1093318896194106 -1.0283239575670924 -1.7055004789080819 2.1760602780704277 -0.37377789632197722 -1.5627159955569683 2.2720299021913264 0.14541773863851351 -2.0564833552448176 2.0573733493404305 -1.0185353395883352 -1.9920559912545999 2.1840681255866681 -0.34428097984891154 -1.9344582505167862 2.3681352023948818 0.13939285003292259 -2.2396980400249475 1.825430389923119 -1.0100871661968105 -2.2198918694520779 1.8982113559298783 -0.328043792749388 -2.2356406334257581 2.0148304205595036 0.18152937719693438 -0.084810325258828936 3.0991350947264462 0.69110254714325681 -0.0084807141874981493 3.256848601196868 1.0312035941324103 0.045572497917633209 3.5131107390272627 1.1730960496382663 -0.6471593952959771 3.0664498570626697 0.75913841437175678 -0.69648600705520058 3.2678169556429215 1.1631975583091827 -0.78954072253810625 3.5749766014200612 1.2972917779210966 -0.75951011468310403 2.6112597376442821 0.80068510805600424 -0.79076306366068172 2.6180712726214139 1.3899488237909088 -0.90271821958913634 3.0818509411269739 1.8165930114767295 -0.56248825058698604 2.6032186911863531 0.7429047470751321 -0.47891632680356744 2.6200252854547017 1.2932038013394727 -0.49045848441890982 3.0873651176672912 1.7266197299589461 -0.36546638649086799 2.5951776447284249 0.68512438609425996 -0.1670695899464531 2.6219792982879895 1.1964587788880363 -0.078198749248683336 3.0928792942076084 1.6366464484411627 -0.42164525188564622 2.1750741987416813 0.41612365939318852 -0.13919039959998855 1.932471381659022 1.1171476502217945 -0.076192861890120173 2.5331045353017516 1.9913728011403986 -0.8713866065228264 1.9553941864206879 0.48415952662168854 -0.69460787422744852 1.7159403169663547 1.2491416143985667 -0.80857096790396532 2.3029920134528137 2.1155685294232289 -1.3211279611600064 1.7357141740996949 0.55219539385018857 -1.2500253488549082 1.4994092522736873 1.3811355785753392 -1.5409490739178104 2.0728794916038757 2.2397642577060592 -1.6118285796652387 2.0116115397642331 0.82119612055126012 -1.6673190366197457 2.0391647466935052 1.4604467072415808 -1.9788424112371625 2.4669705800508472 1.8850379050068233 -1.5158800459355468 2.1898055330382289 0.7429047470751321 -1.4451012612404317 2.2373143921367706 1.2932038013394727 -1.6346080354943049 2.6646631053521026 1.7266197299589461 -1.4199315122058547 2.3679995263122251 0.6646133735990043 -1.2228834858611184 2.4354640375800356 1.1259608954373641 -1.2903736597514472 2.8623556306533575 1.5682015549110688 -1.8768605097789726 2.5522022792030956 0.62306667991475673 -1.8146874958292596 2.7756803709646687 0.8992096299556378 -1.8176598122476009 3.0631374993595175 1.048900321355436 -2.2513893973994383 2.1314494851891288 0.69110254714325681 -2.3089365017155115 2.2969429606929421 1.0312035941324103 -2.4519198043122921 2.5163690489386292 1.1730960496382663 0.099625710022764574 3.7693728768576573 1.3149885051441224 0.1306928360949951 4.1232358384520671 1.2581375373672679 0.1243586548260758 4.4347575758829132 1.0373325875161723 -0.88259543802101204 3.8821362471972005 1.4313859975330103 -1.0174383927525505 4.2102661452645629 1.3480667340146337 -1.1461026088771107 4.4986625055709952 1.1441283323599889 -1.014673375517591 3.5456306096325338 2.2432371991625502 -1.1921457377177747 4.2752887354654581 2.2805261218631858 -1.3777685792723757 4.8552807324802556 1.9999751181598331 -0.50200064203425221 3.5547049498798806 2.1600356585784199 -0.5987356030160248 4.3353515540801251 2.2005090518265744 -0.72921857720161865 4.9468220083874392 1.8972820474325414 0.010672091449086438 3.5637792901272269 2.0768341179942893 -0.0053254683142748959 4.3954143726947912 2.120491981789963 -0.08066857513086173 5.0383632842946238 1.7945889767052496 -0.013195324180251789 3.133737688944481 2.8655979520590029 -0.1917760377392046 4.4780053140955278 3.1777897925181477 -0.43422270847473832 5.5155513698075342 2.7998638882620592 -0.92253406158048212 2.8900437099392731 2.9819954444478913 -1.3034685972980888 4.1290984323575417 3.2677189891655134 -1.6937144055861753 5.0811097849095965 2.9066596331058756 -1.8318727989807126 2.6463497309340638 3.0983929368367797 -2.4151611568569735 3.780191550619556 3.357648185812879 -2.953206102697612 4.6466682000116588 3.0134553779496924 -2.2903657858545792 2.8947764134081893 2.3096291027720652 -2.740368280764633 3.5029998588440137 2.3003503750846943 -3.1328966861154548 3.9635477042201837 2.0081804663928828 -1.8241148097481781 3.0920118185674346 2.1600356585784199 -2.2122267822370163 3.776216371414272 2.2005090518265744 -2.566776943672449 4.2912077364576291 1.8972820474325414 -1.3578638336417761 3.2892472237266803 2.0104422143847742 -1.6840852837094002 4.0494328839845304 2.1006677285684545 -2.0006572012294437 4.6188677686950754 1.7863836284721999 -1.8206321286659422 3.3505946277543659 1.1985910127552342 -1.9497631334195775 3.7582934699504111 1.168208340719902 -2.1043729227654211 4.0769461686176403 0.93053684267235548 -2.5949031069090731 2.7357951371843163 1.3149885051441224 -2.8231542311455824 3.0079818124561299 1.2581375373672679 -3.0479123066984668 3.2237820029519786 1.0373325875161723 0.11802447355715651 4.7462793133137602 0.81652763766507663 0.073740518829690224 5 0.43005606989021922 2.5869934795916274e-17 5 1.508739382800288e-16 -1.2747668250016708 4.7870588658774267 0.94018993070534407 -1.3950498392746833 5.0048263056714015 0.5886127725731497 -1.462597259259115 5 0.19467496971038228 -1.5633914208269766 5.4352727294950522 1.7194241144564801 -1.7812344769064947 5.9570848669522292 1.0386848179837014 -1.9251006988178909 5.938538843445472 0.19467496971038248 -0.8597015513872126 5.5582924626947534 1.5940550430385083 -1.0615466284688078 6.1103104279389484 0.88012811530077095 -1.2095599964999952 6.080868738500028 3.184784616492628e-16 -0.15601168194744855 5.6813121958944546 1.4686859716205367 -0.34185878003112069 6.2635359889256668 0.72157141261784052 -0.49401929418209967 6.2231986335545839 -0.19467496971038181 -0.67666937921027204 6.5530974255195407 2.4219379840059707 -1.1046529533785527 7.535335395281848 1.2248667171871683 -1.3354710697580918 7.4565320529130075 -0.19467496971038173 -2.0839602138742617 6.0331211374616514 2.5456002770462383 -2.6127023020369231 6.9274855542166147 1.383423419870099 -2.831857399501664 6.8367085405835217 3.9502081453687136e-16 -3.4912510485382513 5.513144849403762 2.6692625700865058 -4.1207516506952935 6.3196357131513814 1.5419801225530296 -4.3282437292452354 6.2168850282540351 0.19467496971038253 -3.5254250914662766 4.4240955495963536 1.7160105577010714 -3.9253237595927724 4.8219798585402751 1.0386848179837014 -4.0511415615041493 4.7497903474104577 0.19467496971038251 -2.9213271051078813 4.8061991015009866 1.5940550430385083 -3.319055770228573 5.2389544342650449 0.88012811530077106 -3.4445354447215344 5.1551115962757805 3.6400954689007538e-16 -2.3172291187494869 5.1883026534056214 1.4720995283759453 -2.7127877808643723 5.6559290099898156 0.72157141261784052 -2.8379293279389195 5.5604328451411034 -0.19467496971038178 -2.2589827121112647 4.3955988672848694 0.69286534462480909 -2.4413871491947021 4.6228552357341197 0.27149936720728862 -2.5013214657657579 4.5697463460997163 -0.19467496971038198 -3.2726703822513512 3.4395821934478277 0.81652763766507663 -3.4833914850200491 3.5876763268454259 0.43005606989021922 -3.5355339059327373 3.5355339059327378 1.508739382800288e-16 -2.3891928076198598e-09 -1.3933816045173013e-08 5 -0.13273293600906821 -0.77410093896210941 4.9999999947704303 -0.23879699815184485 -1.4565753698047463 4.5541657294473969 -0.29388289915620586 -1.9124335777598271 3.9241838901962747 -3.301158975278074e-09 -1.3777443741580759e-08 5 -0.18339772398782497 -0.76541358861511988 4.9999999947704303 -0.33222779902080585 -1.441233908480154 4.5542552121822473 -0.4227670445041749 -1.8926282954478792 3.9240958338115353 -4.1977016459768423e-09 -1.3531256697931916e-08 5 -0.23320565100984914 -0.75173653039988864 4.9999999947704303 -0.42647213182498234 -1.418092551218374 4.5542332598784592 -0.54503155377182178 -1.8566963318437866 3.9237978632131196 -5.0616379163795472e-09 -1.3199973270989633e-08 5 -0.28120211131750328 -0.73333189525220099 4.9999999947704303 -0.51928942098023378 -1.3845320165618482 4.5540927235145698 -0.65880253358904184 -1.8114333977524348 3.9235932029191516 -5.9255741867822506e-09 -1.2868689844047351e-08 5 -0.32919857162515731 -0.71492726010451335 4.9999999947704303 -0.61210671013548534 -1.3509714819053225 4.5539521871506805 -0.7725735134062619 -1.7661704636610829 3.923388542625184 -6.7568613318353538e-09 -1.2452326417082756e-08 5 -0.37538119160431432 -0.69179595820611417 4.9999999947704303 -0.69804226227048827 -1.3058671965647461 4.5499065825209621 -0.87911768584279226 -1.6966023680393243 3.9418063511561829 -7.5395671186120148e-09 -1.1958862903101951e-08 5 -0.41886484718796768 -0.66438131806501544 4.9999999947704303 -0.77859391379943088 -1.2559020052932008 4.5499960652558125 -0.98901030045929861 -1.62992262333991 3.9417182947714435 -8.3222729053886773e-09 -1.1465399389121146e-08 5 -0.46234850277162093 -0.63696667792391692 4.9999999947704303 -0.85914556532837361 -1.205936814021656 4.5500855479906637 -1.098902915075805 -1.5632428786404959 3.9416302383867041 -9.0563586260029225e-09 -1.0894860191839748e-08 5 -0.50313104352162308 -0.60527005530212152 4.9999999947704303 -0.93823808004942744 -1.1486396586136214 4.554131152620382 -1.2091286301545354 -1.5014130522323039 3.9232124298557061 -9.7277549847141762e-09 -1.0258180116925175e-08 5 -0.54043084188311075 -0.56989893941392722 4.9999999947704303 -1.0095983318105226 -1.0804173341964736 4.5540927235145698 -1.3018597269021539 -1.4214334258861796 3.9235932029191516 -1.039915134342543e-08 -9.621500042010602e-09 5 -0.57773064024459853 -0.53452782352573291 4.9999999947704303 -1.080958583571618 -1.012195009779326 4.5540542944087576 -1.3945908236497726 -1.3414537995400551 3.9239739759825976 -1.1007825137037626e-08 -8.9187105758018559e-09 5 -0.61154585159553576 -0.49548396361222602 4.9999999947704303 -1.1435917964881988 -0.93801294878014096 4.5540762467125457 -1.4829709385340506 -1.2496274631237827 3.9242719465810136 -1.1542110682141615e-08 -8.1632811981781814e-09 5 -0.64122838240179381 -0.45351566412416888 4.9999999947704303 -1.1988092980184004 -0.86109934457807824 4.5541657294473969 -1.5601013422709398 -1.1444881605347088 3.9241838901962742 -0.34896880016056686 -2.3682917857149075 3.2942020509451524 -0.35440257013029636 -2.6092230410694168 2.493062659255656 -0.3236670173717579 -2.7418514601399591 1.7515749127262332 -0.51330628998754391 -2.3440226824156043 3.2939364554408237 -0.54956526024171759 -2.5820644792650582 2.4926871801890327 -0.56802875516418982 -2.7110441325220442 1.747163086497159 -0.66359097571866099 -2.295300112469199 3.2933624665477805 -0.7115785093999567 -2.5154219920374845 2.4926321599348369 -0.7279315475098842 -2.5994237369097033 1.7520298853594398 -0.79831564619784978 -2.2383347789430212 3.2930936823237338 -0.8411609239525164 -2.448593297984051 2.4936206142624373 -0.8195033501168264 -2.5326228968077213 1.7593940340559815 -0.93304031667703857 -2.1813694454168431 3.2928248980996875 -0.97074333850507588 -2.3817646039306171 2.4946090685900373 -0.9110751527237686 -2.4658220567057394 1.7667581827525234 -1.0601931094150963 -2.0873375395139022 3.3337061197914033 -1.1046416157343399 -2.2705204390977185 2.5858527378715506 -1.0419533435613204 -2.3279343401651742 1.9154012332922601 -1.1994266871191663 -2.0039432413866192 3.333440524287075 -1.2679810426661533 -2.1745365338988076 2.5854772588049273 -1.2430682032092273 -2.2128456728059209 1.9109894070631863 -1.3386602648232362 -1.9205489432593361 3.3331749287827459 -1.4313204695979667 -2.0785526286998968 2.5851017797383036 -1.4441830628571339 -2.0977570054466677 1.9065775808341126 -1.4800191802596432 -1.8541864458509865 3.2922937070910296 -1.5904809234459556 -2.0196699005113179 2.4938581104567907 -1.617365404068055 -2.0673183296891211 1.7579345302943752 -1.5941211219937852 -1.7624495175758852 3.2930936823237333 -1.7141674489267047 -1.940306881902236 2.4936206142624373 -1.7263151950341624 -2.0262281030727016 1.7593940340559815 -1.708223063727927 -1.6707125893007839 3.2938936575564384 -1.8378539744074538 -1.8609438632931536 2.4933831180680834 -1.8352649860002699 -1.9851378764562821 1.760853537817588 -1.8223500805799024 -1.561241977467424 3.2944676464494811 -1.9768029081841854 -1.7516037101908275 2.4934381383222783 -2.0166431317145013 -1.9044885297656289 1.755986738955307 -1.9213933865234791 -1.4278769764913393 3.2942020509451519 -2.0955997665774442 -1.594398845359297 2.4930626592556555 -2.1676489033011959 -1.7099146176412079 1.751574912726233 -0.29293146461321945 -2.8744798792105009 1.0100871661968109 -0.22746247248711865 -2.9119387162937747 0.32804379274938833 -0.15613639887297381 -3.0055369055101107 -0.18152937719693402 -0.58649225008666206 -2.8400237857790294 1.001638992805286 -0.59069802723054465 -2.8709117504924069 0.31180660564986495 -0.61892871126326088 -2.9686808037775378 -0.22366590436094577 -0.74428458561981192 -2.6834254817819216 1.0114276107840432 -0.73299167128358245 -2.6382788666223886 0.34130352212293058 -0.74625089298334324 -2.6247693021333358 -0.22969079296653672 -0.7978457762811364 -2.6166524956313912 1.0251674538495263 -0.71683672383972574 -2.5852492378606096 0.36466121884116587 -0.63966248721335595 -2.5942339645234815 -0.18912176411698298 -0.8514069669424611 -2.5498795094808617 1.0389072969150093 -0.70068177639586926 -2.5322196090988296 0.38801891555940127 -0.53307408144336865 -2.5636986269136268 -0.14855273526742921 -0.97926507138830066 -2.3853482412326303 1.2449497287129705 -0.815747067063055 -2.326224973972689 0.66871004740253459 -0.61869615947435064 -2.2506495863571852 0.12629319400467315 -1.218155363752301 -2.2511548117130347 1.2365015553214458 -1.1068560897159476 -2.1635614418005265 0.65247286030301099 -0.98912134811938701 -2.0594778141106072 0.084156666840661393 -1.4570456561163012 -2.1169613821934394 1.2280533819299211 -1.3979651123688401 -2.0008979096283634 0.63623567320348762 -1.3595465367644233 -1.8683060418640292 0.042020139676649672 -1.6442498846901541 -2.1149667588669239 1.0220109501319599 -1.5977051794353154 -2.0522143606805483 0.35554454136035413 -1.604766879550277 -2.0319129502223907 -0.23282578959545289 -1.7384629411416199 -2.112149324243167 1.0251674538495263 -1.6516028291716986 -2.1141373193754878 0.36466121884116581 -1.5837414375536227 -2.1519714262068583 -0.18912176411698306 -1.8326759975930862 -2.1093318896194106 1.0283239575670926 -1.7055004789080819 -2.1760602780704277 0.3737778963219775 -1.5627159955569683 -2.2720299021913264 -0.14541773863851323 -2.0564833552448176 -2.0573733493404305 1.0185353395883354 -1.9920559912545999 -2.1840681255866681 0.34428097984891182 -1.9344582505167862 -2.3681352023948818 -0.13939285003292232 -2.2396980400249475 -1.8254303899231188 1.0100871661968107 -2.2198918694520779 -1.8982113559298783 0.32804379274938822 -2.2356406334257581 -2.0148304205595036 -0.18152937719693413 -0.084810325258828936 -3.0991350947264462 -0.69110254714325647 -0.0084807141874981493 -3.256848601196868 -1.0312035941324098 0.045572497917633209 -3.5131107390272627 -1.1730960496382659 -0.6471593952959771 -3.0664498570626697 -0.75913841437175644 -0.69648600705520058 -3.2678169556429215 -1.1631975583091823 -0.78954072253810625 -3.5749766014200612 -1.2972917779210962 -0.75951011468310403 -2.6112597376442821 -0.8006851080560039 -0.79076306366068172 -2.6180712726214139 -1.3899488237909086 -0.90271821958913634 -3.0818509411269743 -1.816593011476729 -0.56248825058698604 -2.6032186911863531 -0.74290474707513177 -0.47891632680356744 -2.6200252854547017 -1.2932038013394724 -0.49045848441890982 -3.0873651176672912 -1.7266197299589456 -0.36546638649086799 -2.5951776447284249 -0.68512438609425963 -0.1670695899464531 -2.6219792982879895 -1.1964587788880361 -0.078198749248683336 -3.0928792942076084 -1.6366464484411622 -0.42164525188564622 -2.1750741987416813 -0.41612365939318824 -0.13919039959998855 -1.9324713816590222 -1.1171476502217943 -0.076192861890120173 -2.5331045353017521 -1.9913728011403984 -0.8713866065228264 -1.9553941864206879 -0.48415952662168832 -0.69460787422744852 -1.715940316966355 -1.2491416143985665 -0.80857096790396532 -2.3029920134528141 -2.1155685294232285 -1.3211279611600064 -1.7357141740996949 -0.55219539385018834 -1.2500253488549082 -1.4994092522736875 -1.381135578575339 -1.5409490739178104 -2.0728794916038762 -2.2397642577060588 -1.6118285796652387 -2.0116115397642331 -0.8211961205512599 -1.6673190366197457 -2.0391647466935052 -1.4604467072415805 -1.9788424112371625 -2.4669705800508477 -1.8850379050068231 -1.5158800459355468 -2.1898055330382289 -0.74290474707513188 -1.4451012612404317 -2.2373143921367706 -1.2932038013394724 -1.6346080354943049 -2.6646631053521026 -1.7266197299589459 -1.4199315122058547 -2.3679995263122251 -0.66461337359900396 -1.2228834858611184 -2.4354640375800356 -1.1259608954373639 -1.2903736597514472 -2.8623556306533575 -1.5682015549110684 -1.8768605097789726 -2.5522022792030956 -0.62306667991475639 -1.8146874958292596 -2.7756803709646687 -0.89920962995563747 -1.8176598122476009 -3.0631374993595175 -1.0489003213554355 -2.2513893973994383 -2.1314494851891288 -0.69110254714325658 -2.3089365017155115 -2.2969429606929421 -1.03120359413241 -2.4519198043122921 -2.5163690489386292 -1.1730960496382661 0.099625710022764574 -3.7693728768576573 -1.3149885051441219 0.1306928360949951 -4.1232358384520671 -1.2581375373672674 0.1243586548260758 -4.4347575758829132 -1.0373325875161719 -0.88259543802101204 -3.8821362471972005 -1.4313859975330099 -1.0174383927525505 -4.2102661452645629 -1.3480667340146333 -1.1461026088771107 -4.4986625055709952 -1.1441283323599885 -1.014673375517591 -3.5456306096325343 -2.2432371991625497 -1.1921457377177747 -4.2752887354654581 -2.2805261218631854 -1.3777685792723757 -4.8552807324802556 -1.9999751181598324 -0.50200064203425221 -3.5547049498798811 -2.1600356585784195 -0.5987356030160248 -4.3353515540801251 -2.200509051826574 -0.72921857720161865 -4.9468220083874392 -1.8972820474325407 0.010672091449086438 -3.5637792901272274 -2.0768341179942889 -0.0053254683142748959 -4.3954143726947912 -2.1204919817899626 -0.08066857513086173 -5.0383632842946238 -1.794588976705249 -0.013195324180251789 -3.1337376889444815 -2.8655979520590025 -0.1917760377392046 -4.4780053140955278 -3.1777897925181473 -0.43422270847473832 -5.5155513698075342 -2.7998638882620583 -0.92253406158048212 -2.8900437099392735 -2.9819954444478909 -1.3034685972980888 -4.1290984323575417 -3.267718989165513 -1.6937144055861753 -5.0811097849095965 -2.9066596331058752 -1.8318727989807126 -2.6463497309340642 -3.0983929368367793 -2.4151611568569735 -3.7801915506195565 -3.3576481858128786 -2.953206102697612 -4.6466682000116588 -3.013455377949692 -2.2903657858545792 -2.8947764134081897 -2.3096291027720648 -2.740368280764633 -3.5029998588440141 -2.3003503750846939 -3.1328966861154548 -3.9635477042201841 -2.0081804663928824 -1.8241148097481781 -3.092011818567435 -2.1600356585784195 -2.2122267822370163 -3.7762163714142725 -2.200509051826574 -2.566776943672449 -4.2912077364576291 -1.8972820474325409 -1.3578638336417761 -3.2892472237266808 -2.0104422143847738 -1.6840852837094002 -4.0494328839845304 -2.1006677285684541 -2.0006572012294437 -4.6188677686950754 -1.7863836284721992 -1.8206321286659422 -3.3505946277543659 -1.1985910127552337 -1.9497631334195775 -3.7582934699504111 -1.1682083407199015 -2.1043729227654211 -4.0769461686176403 -0.93053684267235504 -2.5949031069090731 -2.7357951371843163 -1.3149885051441219 -2.8231542311455824 -3.0079818124561299 -1.2581375373672674 -3.0479123066984668 -3.2237820029519786 -1.0373325875161719 0.11802447355715651 -4.7462793133137602 -0.81652763766507608 0.073740518829690224 -5 -0.43005606989021861 2.5869934795916274e-17 -5 4.6142923863115981e-16 -1.2747668250016708 -4.7870588658774267 -0.94018993070534351 -1.3950498392746833 -5.0048263056714015 -0.58861277257314903 -1.462597259259115 -5 -0.19467496971038167 -1.5633914208269766 -5.4352727294950522 -1.7194241144564795 -1.7812344769064947 -5.9570848669522292 -1.0386848179837007 -1.9251006988178909 -5.938538843445472 -0.19467496971038176 -0.8597015513872126 -5.5582924626947534 -1.5940550430385076 -1.0615466284688078 -6.1103104279389484 -0.88012811530077018 -1.2095599964999952 -6.080868738500028 4.2618858774343699e-16 -0.15601168194744855 -5.6813121958944546 -1.468685971620536 -0.34185878003112069 -6.2635359889256668 -0.72157141261783975 -0.49401929418209967 -6.2231986335545839 0.19467496971038256 -0.67666937921027204 -6.5530974255195407 -2.4219379840059698 -1.1046529533785527 -7.535335395281848 -1.2248667171871674 -1.3354710697580918 -7.4565320529130075 0.19467496971038264 -2.0839602138742617 -6.0331211374616514 -2.5456002770462374 -2.6127023020369231 -6.9274855542166147 -1.3834234198700981 -2.831857399501664 -6.8367085405835217 4.4220685726615793e-16 -3.4912510485382513 -5.513144849403762 -2.6692625700865049 -4.1207516506952935 -6.3196357131513814 -1.541980122553029 -4.3282437292452354 -6.2168850282540351 -0.19467496971038178 -3.5254250914662766 -4.4240955495963536 -1.7160105577010709 -3.9253237595927724 -4.8219798585402751 -1.0386848179837007 -4.0511415615041493 -4.7497903474104577 -0.19467496971038192 -2.9213271051078813 -4.8061991015009866 -1.5940550430385076 -3.319055770228573 -5.2389544342650449 -0.8801281153007704 -3.4445354447215344 -5.1551115962757805 2.6728869465619848e-16 -2.3172291187494869 -5.1883026534056214 -1.4720995283759446 -2.7127877808643723 -5.6559290099898156 -0.72157141261783986 -2.8379293279389195 -5.5604328451411034 0.19467496971038248 -2.2589827121112647 -4.3955988672848694 -0.69286534462480853 -2.4413871491947021 -4.6228552357341197 -0.27149936720728807 -2.5013214657657579 -4.5697463460997163 0.19467496971038253 -3.2726703822513512 -3.4395821934478277 -0.81652763766507619 -3.4833914850200491 -3.5876763268454259 -0.43005606989021877 -3.5355339059327373 -3.5355339059327378 2.8208979025593897e-16 -1.1542110682141616e-08 8.1632818104813583e-09 -5 -0.64122838240179392 0.4535156641241696 -4.9999999947704303 -1.1988092980184006 0.86109934457807891 -4.5541657294473969 -1.56010134227094 1.1444881605347093 -3.9241838901962742 -1.2076396227245603e-08 7.4078524328576829e-09 -5 -0.67091091320805185 0.41154736463611241 -4.9999999947704303 -1.2540267995486025 0.78418574037601618 -4.5542552121822473 -1.6372317460078292 1.0393488579456354 -3.9240958338115348 -1.2536267101315434e-08 6.5998205027791211e-09 -5 -0.69645929555149666 0.36665670107132126 -4.9999999947704303 -1.3043041957171724 0.70118152291611602 -4.5542332598784592 -1.6982780744836257 0.92748705921823471 -3.9237978632131192 -1.2912909538944595e-08 5.7546725497787473e-09 -5 -0.71738387578979568 0.31970403619663385 -4.9999999947704303 -1.3462050486543278 0.61181890670720962 -4.5540927235145698 -1.7467205781822253 0.81503310025484599 -3.9235932029191516 -1.3289551976573755e-08 4.9095245967783752e-09 -5 -0.73830845602809458 0.27275137132194649 -4.9999999947704303 -1.3881059015914832 0.52245629049830311 -4.5539521871506805 -1.7951630818808246 0.70257914129145704 -3.923388542625184 -1.3582947351309275e-08 4.027302416753386e-09 -5 -0.7546081993582866 0.22373902713169191 -4.9999999947704303 -1.4169779672262595 0.42979713281373799 -4.5499065825209621 -1.8213091165382245 0.57804896229729796 -3.9418063511561829 -1.3787472523809034e-08 3.124914450245687e-09 -5 -0.76597070914470833 0.17360636145015051 -4.9999999947704303 -1.4386058606867578 0.33750778821045441 -4.5499960652558125 -1.8518652298911324 0.45319344965490282 -3.9417182947714435 -1.3991997696308794e-08 2.2225264837379868e-09 -5 -0.77733321893113005 0.12347369576860932 -4.9999999947704303 -1.4602337541472568 0.24521844360717099 -4.5500855479906637 -1.8824213432440404 0.32833793701250785 -3.9416302383867041 -1.4107642551996935e-08 1.3000173573890351e-09 -5 -0.78375793325289089 0.072223187853683646 -4.9999999947704303 -1.4756454005158901 0.14877638297509627 -4.554131152620382 -1.9166424043045276 0.20667629688638162 -3.9232124298557061 -1.4132190671687164e-08 3.7506764086189807e-10 -5 -0.78512171770851225 0.020837091592707416 -4.9999999947704303 -1.4778642502196659 0.050076596823972801 -4.5540927235145698 -1.9256590554955235 0.084551373403164029 -3.9235932029191516 -1.4156738791377395e-08 -5.4988207566523903e-10 -5 -0.78648550216413371 -0.030549004668268889 -4.9999999947704303 -1.480083099923442 -0.048623189327150665 -4.5540542944087576 -1.9346757066865197 -0.037573550080053877 -3.9239739759825976 -1.4090188961068442e-08 -1.4772266399616424e-09 -5 -0.78278828930909938 -0.082068148030311303 -4.9999999947704303 -1.4719168311293394 -0.14536619728288369 -4.5540762467125457 -1.9322388600717753 -0.16499875380823636 -3.9242719465810136 -1.3933816657476189e-08 -2.3891928076198569e-09 -5 -0.77410093896210996 -0.13273293600906808 -4.9999999947704303 -1.4565753698047468 -0.23879699815184455 -4.5541657294473969 -1.9124335777598274 -0.29388289915620541 -3.9241838901962742 -1.9213933865234791 1.4278769764913395 -3.2942020509451519 -2.0955997665774437 1.5943988453592972 -2.4930626592556555 -2.1676489033011959 1.7099146176412079 -1.7515749127262328 -2.0204366924670558 1.2945119755152545 -3.2939364554408233 -2.2143966249707026 1.4371939805277665 -2.4926871801890322 -2.3186546748878905 1.5153407055167871 -1.7471630864971588 -2.092251953250079 1.1537925955203534 -3.2933624665477801 -2.2818339374588041 1.2755099587721548 -2.4926321599348364 -2.3527954850299837 1.3233448180622709 -1.7520298853594396 -2.1472361077101225 1.0182472938024825 -3.2930936823237333 -2.3262075187684217 1.1366263319764895 -2.4936206142624369 -2.370311200593759 1.2113584484483564 -1.7593940340559813 -2.2022202621701661 0.88270199208461098 -3.292824898099687 -2.3705811000780384 0.99774270518082409 -2.4946090685900368 -2.3878269161575338 1.0993720788344419 -1.7667581827525232 -2.2256402658501897 0.72630079178085794 -3.3337061197914029 -2.3865999765752708 0.82440082204203846 -2.5858527378715501 -2.3828704330000323 0.90932588317562002 -1.9154012332922599 -2.2651245990955071 0.56887911109935141 -3.3334405242870746 -2.4342275227429639 0.64103153537251212 -2.5854772588049268 -2.4437001369269971 0.68573622499375353 -1.9109894070631861 -2.3046089323408245 0.4114574304178451 -3.3331749287827455 -2.4818550689106571 0.45766224870298572 -2.5851017797383031 -2.5045298408539618 0.46214656681188709 -1.9065775808341123 -2.3576394080931649 0.2645762107976673 -3.2922937070910292 -2.5527621287263904 0.30348243609343584 -2.4938581104567903 -2.6054648546674666 0.31816476492138229 -1.757934530294375 -2.3734538607713809 0.1190261499823551 -3.2930936823237333 -2.5841035810013144 0.1599047265506793 -2.4936206142624369 -2.6534488127874956 0.2120704510394287 -1.7593940340559813 -2.3892683134495969 -0.02652391083295693 -3.2938936575564384 -2.6154450332762389 0.01632701700792262 -2.493383118068083 -2.701432770907525 0.10597613715747524 -1.7608535378175878 -2.3925608890142112 -0.18463131033358929 -3.2944676464494811 -2.6363816028737759 -0.15923988001887493 -2.4934381383222783 -2.7726587877578739 -0.079305279579325275 -1.7559867389553068 -2.3682917857149079 -0.34896880016056631 -3.2942020509451519 -2.6092230410694173 -0.35440257013029608 -2.4930626592556555 -2.7418514601399591 -0.3236670173717574 -1.7515749127262328 -2.2396980400249475 1.8254303899231188 -1.0100871661968105 -2.2198918694520779 1.8982113559298783 -0.328043792749388 -2.2356406334257581 2.0148304205595036 0.18152937719693438 -2.4229127248050775 1.5934874305058073 -1.0016389928052856 -2.4477277476495565 1.6123545862730886 -0.31180660564986462 -2.5368230163347296 1.6615256387241253 0.22366590436094613 -2.4237570326011637 1.3711796773523868 -1.011427610784043 -2.3838482585677316 1.3472414959319683 -0.34130352212293025 -2.3836712394838022 1.3283131056937254 0.22969079296653705 -2.4144148824190963 1.2860905649202232 -1.0251674538495261 -2.334927375579209 1.3211671587179725 -0.36466121884116554 -2.2867101106782322 1.3820907459197982 0.18912176411698328 -2.4050727322370298 1.2010014524880601 -1.038907296915009 -2.2860064925906864 1.2950928215039759 -0.38801891555940093 -2.1897489818726621 1.4358683861458705 0.14855273526742951 -2.3791408894247934 0.99425094430920169 -1.2449497287129703 -2.2217097365149119 1.068069170808265 -0.66871004740253426 -2.0289338344462506 1.1539653347294769 -0.12629319400467287 -2.4531727511110297 0.73044091461499505 -1.2365015553214456 -2.3125344138466684 0.74720352017512415 -0.65247286030301077 -2.1556851407324564 0.75685631538926013 -0.084156666840661143 -2.5272046127972665 0.4666308849207888 -1.2280533819299209 -2.4033590911784244 0.42633786954198294 -0.6362356732034874 -2.2824364470186622 0.35974729604904337 -0.042020139676649443 -2.6581675806085423 0.33284709374932897 -1.0220109501319596 -2.5808828576012122 0.32138652417004993 -0.35554454136035385 -2.5715209686365927 0.30203788312944008 0.23282578959545314 -2.7227940445736767 0.26423617552817824 -1.0251674538495261 -2.6627803952241522 0.32706127455576223 -0.36466121884116554 -2.6415478985308534 0.40179927825025807 0.18912176411698331 -2.7874205085388115 0.19562525730702754 -1.0283239575670924 -2.7446779328470927 0.33273602494147481 -0.37377789632197722 -2.711574828425114 0.50156067337107646 0.14541773863851351 -2.9089359726419723 0.00062932086022406749 -1.0185353395883352 -2.9529656820951424 0.13577308225630796 -0.34428097984891154 -3.0423930072426826 0.30665591351731369 0.13939285003292259 -2.8744798792105009 -0.29293146461321867 -1.0100871661968105 -2.9119387162937747 -0.22746247248711801 -0.328043792749388 -3.0055369055101107 -0.15613639887297343 0.18152937719693438 -2.2513893973994379 2.1314494851891288 0.69110254714325681 -2.3089365017155119 2.2969429606929426 1.0312035941324103 -2.4519198043122925 2.5163690489386292 1.1730960496382663 -2.6259182850199037 1.7106966911751624 0.75913841437175678 -2.8031855076017629 1.8182055504212156 1.1631975583091827 -3.0861797963769839 1.9696005985177414 1.2972917779210966 -2.3834942203998719 1.3093847154554819 0.80068510805600424 -2.4104098751266134 1.2921020258739786 1.3899488237909088 -2.8175158736491519 1.5408795245049016 1.8165930114767295 -2.2384928457772548 1.4430143331216234 0.7429047470751321 -2.1912826285289944 1.5139926639214845 1.2932038013394727 -2.5299033309244323 1.8362902904782572 1.7266197299589461 -2.0934914711546382 1.5766439507877659 0.68512438609425996 -1.9721553819313755 1.7358833019689901 1.1964587788880363 -2.2422907881997132 2.1317010564516128 1.6366464484411627 -1.8361579323775894 1.2398614986506891 0.41612365939318852 -1.4648860938532484 1.2680411429868141 1.1171476502217945 -1.8450518836867806 1.737298905045753 1.9913728011403986 -1.9988358676182447 0.76650911060339622 0.48415952662168854 -1.7045149723701045 0.72219109610650201 1.2491416143985667 -2.2002072842064093 1.0567152552554813 2.1155685294232289 -2.1615138028589 0.29315672255610387 0.55219539385018857 -1.9441438508869604 0.17634104922618984 1.3811355785753392 -2.5553626847260378 0.37613160546520963 2.2397642577060592 -2.5621590796719733 0.28268924208883006 0.82119612055126012 -2.6208798175387695 0.26293462314828248 1.4604467072415808 -3.1436645140270012 0.34515873825632853 1.8850379050068233 -2.6203154018375541 0.47653728194475387 0.7429047470751321 -2.6038610796505108 0.56017927700182746 1.2932038013394727 -3.040043777852119 0.72835892489203191 1.7266197299589461 -2.6784717240031353 0.67038532180067811 0.6646133735990043 -2.5868423417622521 0.85742393085537161 1.1259608954373641 -2.9364230416772368 1.111559111527735 1.5682015549110688 -3.1318203323902232 0.47753874477831942 0.62306667991475673 -3.2458802467508132 0.6795245786802051 0.8992096299556378 -3.4512448766344641 0.88068571837337362 1.048900321355436 -3.0991350947264462 -0.084810325258828811 0.69110254714325681 -3.2568486011968676 -0.0084807141874975577 1.0312035941324103 -3.5131107390272622 0.045572497917633945 1.1730960496382663 -2.5949031069090731 2.7357951371843163 1.3149885051441224 -2.8231542311455833 3.0079818124561299 1.2581375373672679 -3.0479123066984672 3.2237820029519786 1.0373325875161723 -3.3691740851522041 2.1209956466142672 1.4313859975330103 -3.6965453288715882 2.2576701549618483 1.3480667340146337 -3.9914516906315134 2.3706178372863174 1.1441283323599889 -3.2246218721716899 1.7896570231358246 2.2432371991625502 -3.8660599916809626 2.1801113210752074 2.2805261218631858 -4.4074314358104285 2.4589724251919245 1.9999751181598331 -2.8685240333198703 2.1585879170350299 2.1600356585784199 -3.4889264877481412 2.6421864776872463 2.2005090518265744 -4.0135667883600847 2.9822959865471446 1.8972820474325414 -2.5124261944680506 2.527518810934235 2.0768341179942893 -3.1117929838153193 3.1042616342992839 2.120491981789963 -3.6197021409097418 3.5056195479023651 1.7945889767052496 -2.2252176735203131 2.2065566671046914 2.8655979520590029 -3.302034060540822 3.030821787031865 3.1777897925181477 -4.2071255972813351 3.5930419538659821 2.7998638882620592 -2.6958995960427146 1.3912394144044609 2.9819954444478913 -3.8414049859199562 1.9980220174935652 3.2677189891655134 -4.7905241264462228 2.3952502432795688 2.9066596331058756 -3.1665815185651152 0.57592216170422905 3.0983929368367797 -4.3807759112990912 0.96522224795526557 3.357648185812879 -5.3739226556111097 1.1974585326931559 3.0134553779496924 -3.666449210515232 0.4273828533643747 2.3096291027720652 -4.4147279489613132 0.53926196040692842 2.3003503750846943 -5.0179439507195651 0.58735896770136387 2.0081804663928828 -3.4762264760537276 0.89653857278223636 2.1600356585784199 -4.2344687626969799 1.1059076442124005 2.2005090518265744 -4.8493274725934343 1.2193567072652953 1.8972820474325414 -3.2860037415922223 1.365694292200099 2.0104422143847742 -4.0542095764326467 1.6725533280178719 2.1006677285684545 -4.6807109944673044 1.8513544468292273 1.7863836284721999 -3.6566095065181146 1.0818468580665417 1.1985910127552342 -4.0362055316395704 1.2788240649425415 1.168208340719902 -4.3708526461948312 1.3948199185292633 0.93053684267235548 -3.7693728768576573 0.099625710022765129 1.3149885051441224 -4.1232358384520662 0.13069283609499649 1.2581375373672679 -4.4347575758829123 0.12435865482607689 1.0373325875161723 -3.2726703822513521 3.4395821934478281 0.81652763766507663 -3.4833914850200491 3.5876763268454259 0.43005606989021922 -3.5355339059327373 3.5355339059327378 1.508739382800288e-16 -4.2863580523914377 2.483565519610786 0.94018993070534407 -4.5253958208453966 2.5524974179567335 0.5886127725731497 -4.5697463460997163 2.5013214657657588 0.19467496971038228 -4.9488028799398931 2.7378335293086407 1.7194241144564801 -5.4718180830295386 2.9527721280218286 1.0386848179837014 -5.5604328451411025 2.8379293279389186 0.19467496971038248 -4.5382070889720278 3.3224054954070423 1.5940550430385083 -5.0712687582865161 3.5700151192144953 0.88012811530077095 -5.1551115962757796 3.4445354447215335 3.184784616492628e-16 -4.1276112980041635 3.9069774615054444 1.4686859716205367 -4.6707194335434927 4.1872581104071616 0.72157141261784052 -4.7497903474104568 4.0511415615041484 -0.19467496971038181 -5.1122171340218481 4.1552621207000993 2.4219379840059707 -6.1093943507105299 4.5471791623270867 1.2248667171871683 -6.2168850282540351 4.3282437292452371 -0.19467496971038173 -5.7396432669724886 2.7924784690655726 2.5456002770462383 -6.7459315269504279 3.0510124969664054 1.383423419870099 -6.8367085405835217 2.8318573995016649 3.9502081453687136e-16 -6.3670693999231291 1.429694817431046 2.6692625700865058 -7.3824687031903267 1.5548458316057243 1.5419801225530296 -7.4565320529130066 1.3354710697580927 0.19467496971038253 -5.6211599524778162 0.63545597499579931 1.7160105577010714 -6.1852777054794998 0.63403160795805558 1.0386848179837014 -6.2231986335545848 0.49401929418209961 0.19467496971038251 -5.4641861824898879 1.332805770318191 1.5940550430385083 -6.0514270490611093 1.3575733645311829 0.88012811530077106 -6.0808687385000288 1.2095599964999952 3.6400954689007538e-16 -5.3072124125019622 2.0301555656405834 1.4720995283759453 -5.9175763926427178 2.081115121104312 0.72157141261784052 -5.9385388434454729 1.9251006988178911 -0.19467496971038178 -4.7054997607500919 1.5108157721159849 0.69286534462480909 -4.9951736943285985 1.5425308769340649 0.27149936720728862 -4.9999999999999991 1.4625972592591154 -0.19467496971038198 -4.7462793133137593 0.11802447355715759 0.81652763766507663 -5 0.073740518829690807 0.43005606989021922 -5 7.0646613559155469e-16 1.508739382800288e-16 -1.1542110682141616e-08 -8.1632811981781814e-09 5 -0.64122838240179392 -0.45351566412416899 4.9999999947704303 -1.1988092980184006 -0.86109934457807835 4.5541657294473969 -1.56010134227094 -1.1444881605347088 3.9241838901962742 -1.2076396227245603e-08 -7.407851820554506e-09 5 -0.67091091320805185 -0.4115473646361118 4.9999999947704303 -1.2540267995486025 -0.78418574037601563 4.5542552121822473 -1.6372317460078292 -1.0393488579456349 3.9240958338115348 -1.2536267101315434e-08 -6.5998198904759442e-09 5 -0.69645929555149666 -0.36665670107132065 4.9999999947704303 -1.3043041957171724 -0.70118152291611546 4.5542332598784592 -1.6982780744836257 -0.92748705921823416 3.9237978632131192 -1.2912909538944595e-08 -5.7546719374755704e-09 5 -0.71738387578979568 -0.31970403619663323 4.9999999947704303 -1.3462050486543278 -0.61181890670720906 4.5540927235145698 -1.7467205781822253 -0.81503310025484543 3.9235932029191516 -1.3289551976573755e-08 -4.9095239844751982e-09 5 -0.73830845602809458 -0.27275137132194588 4.9999999947704303 -1.3881059015914832 -0.52245629049830256 4.5539521871506805 -1.7951630818808246 -0.7025791412914566 3.923388542625184 -1.3582947351309275e-08 -4.027301804450209e-09 5 -0.7546081993582866 -0.2237390271316913 4.9999999947704303 -1.4169779672262595 -0.42979713281373744 4.5499065825209621 -1.8213091165382245 -0.57804896229729752 3.9418063511561829 -1.3787472523809034e-08 -3.1249138379425101e-09 5 -0.76597070914470833 -0.1736063614501499 4.9999999947704303 -1.4386058606867578 -0.3375077882104538 4.5499960652558125 -1.8518652298911324 -0.45319344965490233 3.9417182947714435 -1.3991997696308794e-08 -2.2225258714348099e-09 5 -0.77733321893113005 -0.12347369576860871 4.9999999947704303 -1.4602337541472568 -0.24521844360717043 4.5500855479906637 -1.8824213432440404 -0.32833793701250735 3.9416302383867041 -1.4107642551996935e-08 -1.3000167450858581e-09 5 -0.78375793325289089 -0.072223187853683035 4.9999999947704303 -1.4756454005158901 -0.14877638297509571 4.554131152620382 -1.9166424043045276 -0.20667629688638114 3.9232124298557061 -1.4132190671687164e-08 -3.7506702855872115e-10 5 -0.78512171770851225 -0.020837091592706806 4.9999999947704303 -1.4778642502196659 -0.050076596823972239 4.5540927235145698 -1.9256590554955235 -0.084551373403163543 3.9235932029191516 -1.4156738791377395e-08 5.4988268796841594e-10 5 -0.78648550216413371 0.030549004668269503 4.9999999947704303 -1.480083099923442 0.048623189327151227 4.5540542944087576 -1.9346757066865197 0.037573550080054356 3.9239739759825976 -1.4090188961068442e-08 1.4772272522648193e-09 5 -0.78278828930909938 0.082068148030311913 4.9999999947704303 -1.4719168311293394 0.14536619728288425 4.5540762467125457 -1.9322388600717753 0.16499875380823684 3.9242719465810136 -1.3933816657476189e-08 2.3891934199230338e-09 5 -0.77410093896210996 0.13273293600906869 4.9999999947704303 -1.4565753698047468 0.2387969981518451 4.5541657294473969 -1.9124335777598274 0.29388289915620591 3.9241838901962742 -1.9213933865234791 -1.427876976491339 3.2942020509451519 -2.0955997665774437 -1.5943988453592968 2.4930626592556555 -2.1676489033011959 -1.7099146176412077 1.751574912726233 -2.0204366924670558 -1.2945119755152543 3.2939364554408233 -2.2143966249707026 -1.4371939805277663 2.4926871801890322 -2.3186546748878905 -1.5153407055167869 1.747163086497159 -2.092251953250079 -1.153792595520353 3.2933624665477801 -2.2818339374588041 -1.2755099587721543 2.4926321599348364 -2.3527954850299837 -1.3233448180622707 1.7520298853594398 -2.1472361077101225 -1.018247293802482 3.2930936823237333 -2.3262075187684217 -1.1366263319764891 2.4936206142624369 -2.370311200593759 -1.2113584484483562 1.7593940340559815 -2.2022202621701661 -0.88270199208461053 3.292824898099687 -2.3705811000780384 -0.99774270518082375 2.4946090685900368 -2.3878269161575338 -1.0993720788344417 1.7667581827525234 -2.2256402658501897 -0.72630079178085749 3.3337061197914029 -2.3865999765752708 -0.82440082204203824 2.5858527378715501 -2.3828704330000323 -0.9093258831756198 1.9154012332922601 -2.2651245990955071 -0.56887911109935108 3.3334405242870746 -2.4342275227429639 -0.64103153537251178 2.5854772588049268 -2.4437001369269971 -0.68573622499375331 1.9109894070631861 -2.3046089323408245 -0.41145743041784472 3.3331749287827455 -2.4818550689106571 -0.45766224870298539 2.5851017797383031 -2.5045298408539618 -0.46214656681188687 1.9065775808341123 -2.3576394080931649 -0.26457621079766686 3.2922937070910292 -2.5527621287263904 -0.3034824360934355 2.4938581104567903 -2.6054648546674666 -0.31816476492138213 1.757934530294375 -2.3734538607713809 -0.1190261499823547 3.2930936823237333 -2.5841035810013144 -0.159904726550679 2.4936206142624369 -2.6534488127874956 -0.21207045103942848 1.7593940340559813 -2.3892683134495969 0.026523910832957336 3.2938936575564384 -2.6154450332762389 -0.016327017007922315 2.493383118068083 -2.701432770907525 -0.10597613715747502 1.7608535378175878 -2.3925608890142112 0.18463131033358968 3.2944676464494811 -2.6363816028737759 0.15923988001887524 2.4934381383222783 -2.7726587877578739 0.079305279579325483 1.7559867389553068 -2.3682917857149079 0.34896880016056669 3.2942020509451519 -2.6092230410694173 0.35440257013029641 2.4930626592556555 -2.7418514601399591 0.32366701737175757 1.7515749127262328 -2.2396980400249475 -1.8254303899231186 1.0100871661968107 -2.2198918694520779 -1.8982113559298783 0.32804379274938822 -2.2356406334257581 -2.0148304205595036 -0.18152937719693413 -2.4229127248050775 -1.5934874305058073 1.0016389928052858 -2.4477277476495565 -1.6123545862730886 0.31180660564986484 -2.5368230163347296 -1.6615256387241253 -0.22366590436094594 -2.4237570326011637 -1.3711796773523866 1.0114276107840432 -2.3838482585677316 -1.3472414959319683 0.34130352212293041 -2.3836712394838022 -1.3283131056937254 -0.22969079296653688 -2.4144148824190963 -1.286090564920223 1.0251674538495263 -2.334927375579209 -1.3211671587179723 0.3646612188411657 -2.2867101106782322 -1.3820907459197982 -0.18912176411698312 -2.4050727322370298 -1.2010014524880599 1.0389072969150093 -2.2860064925906864 -1.2950928215039759 0.3880189155594011 -2.1897489818726621 -1.4358683861458705 -0.14855273526742935 -2.3791408894247934 -0.99425094430920158 1.2449497287129705 -2.2217097365149119 -1.068069170808265 0.66871004740253437 -2.0289338344462506 -1.1539653347294769 0.12629319400467301 -2.4531727511110297 -0.73044091461499494 1.2365015553214456 -2.3125344138466684 -0.74720352017512404 0.65247286030301088 -2.1556851407324564 -0.75685631538926013 0.08415666684066124 -2.5272046127972665 -0.46663088492078864 1.2280533819299209 -2.4033590911784244 -0.42633786954198288 0.6362356732034874 -2.2824364470186622 -0.35974729604904337 0.042020139676649484 -2.6581675806085423 -0.33284709374932886 1.0220109501319596 -2.5808828576012122 -0.32138652417004993 0.35554454136035391 -2.5715209686365927 -0.30203788312944013 -0.23282578959545311 -2.7227940445736767 -0.26423617552817813 1.0251674538495261 -2.6627803952241522 -0.32706127455576217 0.36466121884116559 -2.6415478985308534 -0.40179927825025807 -0.18912176411698325 -2.7874205085388115 -0.19562525730702743 1.0283239575670924 -2.7446779328470927 -0.33273602494147475 0.37377789632197728 -2.711574828425114 -0.50156067337107646 -0.14541773863851346 -2.9089359726419723 -0.0006293208602239428 1.0185353395883352 -2.9529656820951424 -0.13577308225630791 0.34428097984891154 -3.0423930072426826 -0.30665591351731369 -0.13939285003292257 -2.8744798792105009 0.29293146461321878 1.0100871661968105 -2.9119387162937747 0.22746247248711807 0.32804379274938794 -3.0055369055101107 0.1561363988729734 -0.1815293771969344 -2.2513893973994379 -2.1314494851891288 -0.69110254714325658 -2.3089365017155119 -2.2969429606929426 -1.03120359413241 -2.4519198043122925 -2.5163690489386297 -1.1730960496382661 -2.6259182850199037 -1.7106966911751624 -0.75913841437175655 -2.8031855076017629 -1.8182055504212156 -1.1631975583091825 -3.0861797963769839 -1.9696005985177416 -1.2972917779210964 -2.3834942203998719 -1.3093847154554819 -0.80068510805600412 -2.4104098751266134 -1.2921020258739788 -1.3899488237909086 -2.8175158736491519 -1.5408795245049018 -1.8165930114767292 -2.2384928457772548 -1.4430143331216236 -0.74290474707513188 -2.1912826285289944 -1.5139926639214845 -1.2932038013394724 -2.5299033309244323 -1.8362902904782574 -1.7266197299589459 -2.0934914711546382 -1.5766439507877659 -0.68512438609425974 -1.9721553819313755 -1.7358833019689903 -1.1964587788880361 -2.2422907881997132 -2.1317010564516128 -1.6366464484411625 -1.8361579323775894 -1.2398614986506891 -0.41612365939318835 -1.4648860938532484 -1.2680411429868144 -1.1171476502217943 -1.8450518836867806 -1.7372989050457532 -1.9913728011403984 -1.9988358676182447 -0.76650911060339622 -0.48415952662168843 -1.7045149723701045 -0.72219109610650212 -1.2491416143985667 -2.2002072842064093 -1.0567152552554815 -2.1155685294232289 -2.1615138028589 -0.29315672255610392 -0.55219539385018857 -1.9441438508869604 -0.17634104922619001 -1.3811355785753392 -2.5553626847260378 -0.37613160546520991 -2.2397642577060592 -2.5621590796719733 -0.28268924208883017 -0.82119612055126012 -2.6208798175387695 -0.26293462314828264 -1.4604467072415808 -3.1436645140270012 -0.34515873825632876 -1.8850379050068233 -2.6203154018375541 -0.47653728194475398 -0.74290474707513199 -2.6038610796505108 -0.56017927700182757 -1.2932038013394727 -3.040043777852119 -0.72835892489203213 -1.7266197299589461 -2.6784717240031353 -0.67038532180067822 -0.66461337359900419 -2.5868423417622521 -0.85742393085537183 -1.1259608954373641 -2.9364230416772368 -1.1115591115277352 -1.5682015549110686 -3.1318203323902232 -0.47753874477831953 -0.62306667991475662 -3.2458802467508132 -0.67952457868020522 -0.89920962995563769 -3.4512448766344641 -0.88068571837337373 -1.048900321355436 -3.0991350947264462 0.084810325258828728 -0.69110254714325681 -3.2568486011968676 0.0084807141874974311 -1.0312035941324103 -3.5131107390272622 -0.04557249791763409 -1.1730960496382663 -2.5949031069090731 -2.7357951371843163 -1.3149885051441219 -2.8231542311455833 -3.0079818124561299 -1.2581375373672674 -3.0479123066984672 -3.2237820029519786 -1.0373325875161719 -3.3691740851522041 -2.1209956466142672 -1.4313859975330101 -3.6965453288715882 -2.2576701549618483 -1.3480667340146335 -3.9914516906315134 -2.3706178372863174 -1.1441283323599887 -3.2246218721716899 -1.7896570231358249 -2.2432371991625502 -3.8660599916809626 -2.1801113210752079 -2.2805261218631854 -4.4074314358104285 -2.4589724251919245 -1.9999751181598329 -2.8685240333198703 -2.1585879170350304 -2.1600356585784195 -3.4889264877481412 -2.6421864776872463 -2.200509051826574 -4.0135667883600847 -2.9822959865471446 -1.8972820474325409 -2.5124261944680506 -2.527518810934235 -2.0768341179942889 -3.1117929838153193 -3.1042616342992844 -2.1204919817899626 -3.6197021409097418 -3.5056195479023651 -1.7945889767052492 -2.2252176735203131 -2.2065566671046919 -2.8655979520590025 -3.302034060540822 -3.030821787031865 -3.1777897925181473 -4.2071255972813351 -3.5930419538659826 -2.7998638882620588 -2.6958995960427146 -1.3912394144044613 -2.9819954444478913 -3.8414049859199562 -1.9980220174935657 -3.267718989165513 -4.7905241264462228 -2.3952502432795693 -2.9066596331058752 -3.1665815185651152 -0.5759221617042295 -3.0983929368367797 -4.3807759112990912 -0.96522224795526601 -3.357648185812879 -5.3739226556111097 -1.1974585326931564 -3.0134553779496924 -3.666449210515232 -0.42738285336437498 -2.3096291027720652 -4.4147279489613132 -0.53926196040692864 -2.3003503750846943 -5.0179439507195651 -0.58735896770136409 -2.0081804663928828 -3.4762264760537276 -0.8965385727822367 -2.1600356585784199 -4.2344687626969799 -1.1059076442124007 -2.2005090518265744 -4.8493274725934343 -1.2193567072652955 -1.8972820474325411 -3.2860037415922223 -1.3656942922000992 -2.0104422143847742 -4.0542095764326467 -1.6725533280178724 -2.1006677285684545 -4.6807109944673044 -1.8513544468292276 -1.7863836284721997 -3.6566095065181146 -1.0818468580665419 -1.1985910127552339 -4.0362055316395704 -1.2788240649425417 -1.1682083407199018 -4.3708526461948312 -1.3948199185292633 -0.93053684267235526 -3.7693728768576573 -0.099625710022765296 -1.3149885051441224 -4.1232358384520662 -0.13069283609499666 -1.2581375373672679 -4.4347575758829123 -0.12435865482607701 -1.0373325875161723 -3.2726703822513521 -3.4395821934478281 -0.81652763766507619 -3.4833914850200491 -3.5876763268454264 -0.43005606989021877 -3.5355339059327373 -3.5355339059327378 2.8208979025593897e-16 -4.2863580523914377 -2.483565519610786 -0.94018993070534373 -4.5253958208453966 -2.5524974179567335 -0.58861277257314937 -4.5697463460997163 -2.5013214657657588 -0.19467496971038198 -4.9488028799398931 -2.7378335293086407 -1.7194241144564797 -5.4718180830295386 -2.9527721280218286 -1.0386848179837009 -5.5604328451411025 -2.8379293279389186 -0.19467496971038212 -4.5382070889720278 -3.3224054954070428 -1.5940550430385079 -5.0712687582865161 -3.5700151192144953 -0.88012811530077051 -5.1551115962757796 -3.4445354447215335 1.0334153750797498e-16 -4.1276112980041635 -3.9069774615054444 -1.4686859716205363 -4.6707194335434927 -4.1872581104071616 -0.72157141261783997 -4.7497903474104568 -4.0511415615041484 0.19467496971038231 -5.1122171340218481 -4.1552621207000993 -2.4219379840059703 -6.1093943507105299 -4.5471791623270867 -1.2248667171871677 -6.2168850282540351 -4.3282437292452371 0.19467496971038226 -5.7396432669724886 -2.7924784690655731 -2.5456002770462378 -6.7459315269504279 -3.0510124969664059 -1.3834234198700985 -6.8367085405835217 -2.8318573995016649 -4.8229758082006086e-17 -6.3670693999231291 -1.4296948174310464 -2.6692625700865058 -7.3824687031903267 -1.5548458316057243 -1.5419801225530294 -7.4565320529130066 -1.3354710697580929 -0.19467496971038237 -5.6211599524778162 -0.63545597499579942 -1.7160105577010714 -6.1852777054794998 -0.6340316079580558 -1.0386848179837014 -6.2231986335545848 -0.49401929418209961 -0.19467496971038245 -5.4641861824898879 -1.332805770318191 -1.5940550430385081 -6.0514270490611093 -1.3575733645311829 -0.88012811530077095 -6.0808687385000288 -1.2095599964999952 -2.1588606118574872e-16 -5.3072124125019622 -2.0301555656405834 -1.472099528375945 -5.9175763926427178 -2.081115121104312 -0.7215714126178403 -5.9385388434454729 -1.9251006988178911 0.19467496971038201 -4.7054997607500919 -1.5108157721159849 -0.69286534462480887 -4.9951736943285985 -1.5425308769340649 -0.27149936720728846 -4.9999999999999991 -1.4625972592591154 0.19467496971038215 -4.7462793133137593 -0.11802447355715769 -0.81652763766507663 -5 -0.073740518829690863 -0.43005606989021922 -5 -7.0646613559155469e-16 -1.5087393828002873e-16 -1.393381665747619e-08 -2.3891928076198589e-09 -5 -0.77410093896211007 -0.13273293600906816 -4.9999999947704303 -1.456575369804747 -0.23879699815184477 -4.5541657294473969 -1.9124335777598276 -0.29388289915620575 -3.9241838901962742 -1.3777444353883936e-08 -3.3011589752780732e-09 -5 -0.76541358861512054 -0.18339772398782492 -4.9999999947704303 -1.4412339084801546 -0.33222779902080574 -4.5542552121822473 -1.8926282954478797 -0.42276704450417479 -3.9240958338115348 -1.3531257310235093e-08 -4.1977016459768414e-09 -5 -0.7517365303998893 -0.23320565100984908 -4.9999999947704303 -1.4180925512183746 -0.42647213182498223 -4.5542332598784592 -1.856696331843787 -0.54503155377182166 -3.9237978632131192 -1.319997388329281e-08 -5.0616379163795464e-09 -5 -0.73333189525220166 -0.28120211131750322 -4.9999999947704303 -1.3845320165618489 -0.51928942098023367 -4.5540927235145698 -1.8114333977524353 -0.65880253358904173 -3.9235932029191516 -1.2868690456350528e-08 -5.9255741867822497e-09 -5 -0.71492726010451402 -0.32919857162515725 -4.9999999947704303 -1.3509714819053231 -0.61210671013548523 -4.5539521871506805 -1.7661704636610833 -0.77257351340626179 -3.923388542625184 -1.2452327029385933e-08 -6.756861331835353e-09 -5 -0.69179595820611484 -0.37538119160431427 -4.9999999947704303 -1.3058671965647468 -0.69804226227048816 -4.5499065825209621 -1.6966023680393247 -0.87911768584279215 -3.9418063511561829 -1.1958863515405128e-08 -7.5395671186120148e-09 -5 -0.6643813180650161 -0.41886484718796763 -4.9999999947704303 -1.2559020052932015 -0.77859391379943077 -4.5499960652558125 -1.6299226233399104 -0.9890103004592985 -3.9417182947714435 -1.1465400001424323e-08 -8.3222729053886773e-09 -5 -0.63696667792391759 -0.46234850277162087 -4.9999999947704303 -1.2059368140216566 -0.8591455653283735 -4.5500855479906637 -1.5632428786404964 -1.098902915075805 -3.9416302383867041 -1.0894860804142925e-08 -9.0563586260029225e-09 -5 -0.60527005530212219 -0.50313104352162308 -4.9999999947704303 -1.148639658613622 -0.93823808004942733 -4.554131152620382 -1.5014130522323044 -1.2091286301545354 -3.9232124298557061 -1.0258180729228352e-08 -9.7277549847141762e-09 -5 -0.56989893941392789 -0.54043084188311075 -4.9999999947704303 -1.0804173341964742 -1.0095983318105226 -4.5540927235145698 -1.42143342588618 -1.3018597269021539 -3.9235932029191516 -9.6215006543137789e-09 -1.039915134342543e-08 -5 -0.53452782352573358 -0.57773064024459853 -4.9999999947704303 -1.0121950097793266 -1.080958583571618 -4.5540542944087576 -1.3414537995400555 -1.3945908236497726 -3.9239739759825976 -8.9187111881050329e-09 -1.1007825137037626e-08 -5 -0.49548396361222669 -0.61154585159553576 -4.9999999947704303 -0.93801294878014163 -1.1435917964881988 -4.5540762467125457 -1.2496274631237831 -1.4829709385340506 -3.9242719465810136 -8.1632818104813583e-09 -1.1542110682141615e-08 -5 -0.45351566412416955 -0.64122838240179381 -4.9999999947704303 -0.86109934457807891 -1.1988092980184004 -4.5541657294473969 -1.1444881605347093 -1.5601013422709398 -3.9241838901962742 -2.3682917857149079 -0.34896880016056669 -3.2942020509451519 -2.6092230410694173 -0.35440257013029619 -2.4930626592556555 -2.7418514601399591 -0.32366701737175774 -1.7515749127262328 -2.3440226824156047 -0.5133062899875438 -3.2939364554408233 -2.5820644792650587 -0.54956526024171748 -2.4926871801890322 -2.7110441325220442 -0.56802875516418971 -1.7471630864971588 -2.2953001124691994 -0.66359097571866088 -3.2933624665477801 -2.515421992037485 -0.71157850939995659 -2.4926321599348364 -2.5994237369097033 -0.72793154750988409 -1.7520298853594396 -2.2383347789430217 -0.79831564619784967 -3.2930936823237333 -2.4485932979840515 -0.84116092395251629 -2.4936206142624369 -2.5326228968077213 -0.81950335011682629 -1.7593940340559813 -2.1813694454168435 -0.93304031667703846 -3.292824898099687 -2.3817646039306175 -0.97074333850507577 -2.4946090685900368 -2.4658220567057394 -0.91107515272376849 -1.7667581827525232 -2.0873375395139027 -1.060193109415096 -3.3337061197914029 -2.2705204390977189 -1.1046416157343397 -2.5858527378715501 -2.3279343401651746 -1.0419533435613202 -1.9154012332922599 -2.0039432413866196 -1.1994266871191661 -3.3334405242870746 -2.1745365338988081 -1.2679810426661531 -2.5854772588049268 -2.2128456728059214 -1.2430682032092271 -1.9109894070631861 -1.9205489432593366 -1.338660264823236 -3.3331749287827455 -2.0785526286998972 -1.4313204695979664 -2.5851017797383031 -2.0977570054466681 -1.4441830628571337 -1.9065775808341123 -1.8541864458509869 -1.480019180259643 -3.2922937070910292 -2.0196699005113183 -1.5904809234459554 -2.4938581104567903 -2.0673183296891211 -1.6173654040680547 -1.757934530294375 -1.7624495175758856 -1.5941211219937852 -3.2930936823237333 -1.9403068819022362 -1.7141674489267045 -2.4936206142624369 -2.0262281030727016 -1.7263151950341622 -1.7593940340559813 -1.6707125893007844 -1.708223063727927 -3.2938936575564384 -1.8609438632931541 -1.8378539744074536 -2.493383118068083 -1.9851378764562826 -1.8352649860002697 -1.7608535378175878 -1.5612419774674247 -1.8223500805799024 -3.2944676464494811 -1.7516037101908279 -1.9768029081841854 -2.4934381383222783 -1.9044885297656293 -2.0166431317145013 -1.7559867389553068 -1.4278769764913399 -1.9213933865234791 -3.2942020509451519 -1.5943988453592974 -2.0955997665774442 -2.4930626592556555 -1.7099146176412083 -2.1676489033011959 -1.7515749127262328 -2.8744798792105009 -0.29293146461321928 -1.0100871661968105 -2.9119387162937747 -0.22746247248711848 -0.328043792749388 -3.0055369055101107 -0.15613639887297362 0.18152937719693438 -2.8400237857790294 -0.58649225008666184 -1.0016389928052856 -2.8709117504924069 -0.59069802723054443 -0.31180660564986462 -2.9686808037775378 -0.61892871126326066 0.22366590436094613 -2.6834254817819216 -0.74428458561981181 -1.011427610784043 -2.6382788666223886 -0.73299167128358234 -0.34130352212293025 -2.6247693021333358 -0.74625089298334313 0.22969079296653705 -2.6166524956313912 -0.79784577628113629 -1.0251674538495261 -2.5852492378606096 -0.71683672383972563 -0.36466121884116554 -2.5942339645234815 -0.63966248721335583 0.18912176411698328 -2.5498795094808617 -0.85140696694246099 -1.038907296915009 -2.5322196090988296 -0.70068177639586915 -0.38801891555940093 -2.5636986269136268 -0.53307408144336854 0.14855273526742951 -2.3853482412326303 -0.97926507138830055 -1.2449497287129703 -2.326224973972689 -0.81574706706305489 -0.66871004740253426 -2.2506495863571852 -0.61869615947435053 -0.12629319400467287 -2.2511548117130347 -1.2181553637523008 -1.2365015553214456 -2.1635614418005265 -1.1068560897159474 -0.65247286030301077 -2.0594778141106072 -0.9891213481193869 -0.084156666840661143 -2.1169613821934394 -1.457045656116301 -1.2280533819299209 -2.0008979096283634 -1.3979651123688399 -0.6362356732034874 -1.8683060418640292 -1.3595465367644231 -0.042020139676649443 -2.1149667588669239 -1.6442498846901539 -1.0220109501319596 -2.0522143606805483 -1.5977051794353152 -0.35554454136035385 -2.0319129502223907 -1.6047668795502767 0.23282578959545314 -2.112149324243167 -1.7384629411416197 -1.0251674538495261 -2.1141373193754878 -1.6516028291716984 -0.36466121884116554 -2.1519714262068583 -1.5837414375536225 0.18912176411698331 -2.1093318896194106 -1.832675997593086 -1.0283239575670924 -2.1760602780704277 -1.7055004789080817 -0.37377789632197722 -2.2720299021913264 -1.5627159955569681 0.14541773863851351 -2.0573733493404305 -2.0564833552448176 -1.0185353395883352 -2.1840681255866681 -1.9920559912545996 -0.34428097984891154 -2.3681352023948818 -1.934458250516786 0.13939285003292259 -1.8254303899231192 -2.2396980400249475 -1.0100871661968105 -1.8982113559298786 -2.2198918694520779 -0.328043792749388 -2.0148304205595036 -2.2356406334257581 0.18152937719693438 -3.0991350947264462 -0.084810325258828742 0.69110254714325681 -3.256848601196868 -0.0084807141874979498 1.0312035941324103 -3.5131107390272627 0.045572497917633424 1.1730960496382663 -3.0664498570626697 -0.64715939529597688 0.75913841437175678 -3.2678169556429215 -0.69648600705520036 1.1631975583091827 -3.5749766014200612 -0.78954072253810603 1.2972917779210966 -2.6112597376442821 -0.75951011468310392 0.80068510805600424 -2.6180712726214139 -0.79076306366068161 1.3899488237909088 -3.0818509411269739 -0.90271821958913612 1.8165930114767295 -2.6032186911863531 -0.56248825058698593 0.7429047470751321 -2.6200252854547017 -0.47891632680356727 1.2932038013394727 -3.0873651176672912 -0.49045848441890966 1.7266197299589461 -2.5951776447284249 -0.36546638649086782 0.68512438609425996 -2.6219792982879895 -0.16706958994645293 1.1964587788880363 -3.0928792942076084 -0.078198749248683141 1.6366464484411627 -2.1750741987416813 -0.42164525188564611 0.41612365939318852 -1.932471381659022 -0.13919039959998844 1.1171476502217945 -2.5331045353017516 -0.07619286189012002 1.9913728011403986 -1.9553941864206879 -0.87138660652282629 0.48415952662168854 -1.7159403169663547 -0.69460787422744841 1.2491416143985667 -2.3029920134528137 -0.80857096790396521 2.1155685294232289 -1.7357141740996949 -1.3211279611600064 0.55219539385018857 -1.4994092522736873 -1.2500253488549082 1.3811355785753392 -2.0728794916038757 -1.5409490739178102 2.2397642577060592 -2.0116115397642331 -1.6118285796652385 0.82119612055126012 -2.0391647466935052 -1.6673190366197455 1.4604467072415808 -2.4669705800508472 -1.9788424112371623 1.8850379050068233 -2.1898055330382289 -1.5158800459355466 0.7429047470751321 -2.2373143921367706 -1.4451012612404315 1.2932038013394727 -2.6646631053521026 -1.6346080354943047 1.7266197299589461 -2.3679995263122251 -1.4199315122058545 0.6646133735990043 -2.4354640375800356 -1.2228834858611182 1.1259608954373641 -2.8623556306533575 -1.290373659751447 1.5682015549110688 -2.5522022792030956 -1.8768605097789723 0.62306667991475673 -2.7756803709646687 -1.8146874958292594 0.8992096299556378 -3.0631374993595175 -1.8176598122476006 1.048900321355436 -2.1314494851891288 -2.2513893973994383 0.69110254714325681 -2.2969429606929421 -2.3089365017155115 1.0312035941324103 -2.5163690489386292 -2.4519198043122921 1.1730960496382663 -3.7693728768576573 0.09962571002276481 1.3149885051441224 -4.1232358384520671 0.13069283609499535 1.2581375373672679 -4.4347575758829132 0.12435865482607608 1.0373325875161723 -3.8821362471972005 -0.88259543802101181 1.4313859975330103 -4.2102661452645629 -1.0174383927525503 1.3480667340146337 -4.4986625055709952 -1.1461026088771105 1.1441283323599889 -3.5456306096325338 -1.0146733755175907 2.2432371991625502 -4.2752887354654581 -1.1921457377177744 2.2805261218631858 -4.8552807324802556 -1.3777685792723755 1.9999751181598331 -3.5547049498798806 -0.50200064203425199 2.1600356585784199 -4.3353515540801251 -0.59873560301602458 2.2005090518265744 -4.9468220083874392 -0.72921857720161831 1.8972820474325414 -3.5637792901272269 0.010672091449086657 2.0768341179942893 -4.3954143726947912 -0.005325468314274627 2.120491981789963 -5.0383632842946238 -0.080668575130861425 1.7945889767052496 -3.133737688944481 -0.013195324180251596 2.8655979520590029 -4.4780053140955278 -0.19177603773920432 3.1777897925181477 -5.5155513698075342 -0.43422270847473798 2.7998638882620592 -2.8900437099392731 -0.9225340615804819 2.9819954444478913 -4.1290984323575417 -1.3034685972980886 3.2677189891655134 -5.0811097849095965 -1.693714405586175 2.9066596331058756 -2.6463497309340638 -1.8318727989807124 3.0983929368367797 -3.780191550619556 -2.4151611568569731 3.357648185812879 -4.6466682000116588 -2.9532061026976115 3.0134553779496924 -2.8947764134081893 -2.2903657858545792 2.3096291027720652 -3.5029998588440137 -2.740368280764633 2.3003503750846943 -3.9635477042201837 -3.1328966861154544 2.0081804663928828 -3.0920118185674346 -1.8241148097481779 2.1600356585784199 -3.776216371414272 -2.2122267822370159 2.2005090518265744 -4.2912077364576291 -2.5667769436724486 1.8972820474325414 -3.2892472237266803 -1.3578638336417759 2.0104422143847742 -4.0494328839845304 -1.6840852837094 2.1006677285684545 -4.6188677686950754 -2.0006572012294432 1.7863836284721999 -3.3505946277543659 -1.8206321286659419 1.1985910127552342 -3.7582934699504111 -1.9497631334195773 1.168208340719902 -4.0769461686176403 -2.1043729227654207 0.93053684267235548 -2.7357951371843163 -2.5949031069090731 1.3149885051441224 -3.0079818124561299 -2.8231542311455824 1.2581375373672679 -3.2237820029519786 -3.0479123066984668 1.0373325875161723 -4.7462793133137602 0.1180244735571568 0.81652763766507663 -5 0.07374051882969053 0.43005606989021922 -5 3.320215232515106e-16 1.508739382800288e-16 -4.7870588658774267 -1.2747668250016706 0.94018993070534407 -5.0048263056714015 -1.3950498392746831 0.5886127725731497 -5 -1.4625972592591148 0.19467496971038228 -5.4352727294950522 -1.5633914208269764 1.7194241144564801 -5.9570848669522292 -1.7812344769064943 1.0386848179837014 -5.938538843445472 -1.9251006988178905 0.19467496971038248 -5.5582924626947534 -0.85970155138721227 1.5940550430385083 -6.1103104279389484 -1.0615466284688073 0.88012811530077095 -6.080868738500028 -1.2095599964999948 3.184784616492628e-16 -5.6813121958944546 -0.15601168194744819 1.4686859716205367 -6.2635359889256668 -0.3418587800311203 0.72157141261784052 -6.2231986335545839 -0.49401929418209928 -0.19467496971038181 -6.5530974255195407 -0.67666937921027159 2.4219379840059707 -7.535335395281848 -1.1046529533785523 1.2248667171871683 -7.4565320529130075 -1.3354710697580914 -0.19467496971038173 -6.0331211374616514 -2.0839602138742612 2.5456002770462383 -6.9274855542166147 -2.6127023020369227 1.383423419870099 -6.8367085405835217 -2.8318573995016636 3.9502081453687136e-16 -5.513144849403762 -3.4912510485382509 2.6692625700865058 -6.3196357131513814 -4.1207516506952935 1.5419801225530296 -6.2168850282540351 -4.3282437292452354 0.19467496971038253 -4.4240955495963536 -3.5254250914662761 1.7160105577010714 -4.8219798585402751 -3.9253237595927719 1.0386848179837014 -4.7497903474104577 -4.0511415615041493 0.19467496971038251 -4.8061991015009866 -2.9213271051078809 1.5940550430385083 -5.2389544342650449 -3.3190557702285726 0.88012811530077106 -5.1551115962757805 -3.4445354447215339 3.6400954689007538e-16 -5.1883026534056214 -2.3172291187494864 1.4720995283759453 -5.6559290099898156 -2.7127877808643719 0.72157141261784052 -5.5604328451411034 -2.8379293279389191 -0.19467496971038178 -4.3955988672848694 -2.2589827121112642 0.69286534462480909 -4.6228552357341197 -2.4413871491947017 0.27149936720728862 -4.5697463460997163 -2.5013214657657574 -0.19467496971038198 -3.4395821934478277 -3.2726703822513512 0.81652763766507663 -3.5876763268454259 -3.4833914850200491 0.43005606989021922 -3.5355339059327378 -3.5355339059327373 1.508739382800288e-16 -1.393381665747619e-08 2.3891934199230358e-09 5 -0.77410093896211007 0.13273293600906877 4.9999999947704303 -1.456575369804747 0.23879699815184532 4.5541657294473969 -1.9124335777598276 0.29388289915620625 3.9241838901962742 -1.3777444353883936e-08 3.3011595875812501e-09 5 -0.76541358861512054 0.18339772398782553 4.9999999947704303 -1.4412339084801546 0.33222779902080629 4.5542552121822473 -1.8926282954478797 0.42276704450417529 3.9240958338115348 -1.3531257310235093e-08 4.1977022582800184e-09 5 -0.7517365303998893 0.23320565100984969 4.9999999947704303 -1.4180925512183746 0.42647213182498278 4.5542332598784592 -1.856696331843787 0.54503155377182211 3.9237978632131192 -1.319997388329281e-08 5.0616385286827233e-09 5 -0.73333189525220166 0.28120211131750383 4.9999999947704303 -1.3845320165618489 0.51928942098023423 4.5540927235145698 -1.8114333977524353 0.65880253358904217 3.9235932029191516 -1.2868690456350528e-08 5.9255747990854266e-09 5 -0.71492726010451402 0.32919857162515787 4.9999999947704303 -1.3509714819053231 0.61210671013548579 4.5539521871506805 -1.7661704636610833 0.77257351340626224 3.923388542625184 -1.2452327029385933e-08 6.7568619441385299e-09 5 -0.69179595820611484 0.37538119160431488 4.9999999947704303 -1.3058671965647468 0.69804226227048871 4.5499065825209621 -1.6966023680393247 0.8791176858427926 3.9418063511561829 -1.1958863515405128e-08 7.5395677309151917e-09 5 -0.6643813180650161 0.41886484718796824 4.9999999947704303 -1.2559020052932015 0.77859391379943133 4.5499960652558125 -1.6299226233399104 0.98901030045929894 3.9417182947714435 -1.1465400001424323e-08 8.3222735176918543e-09 5 -0.63696667792391759 0.46234850277162148 4.9999999947704303 -1.2059368140216566 0.85914556532837405 4.5500855479906637 -1.5632428786404964 1.0989029150758054 3.9416302383867041 -1.0894860804142925e-08 9.0563592383060994e-09 5 -0.60527005530212219 0.50313104352162363 4.9999999947704303 -1.148639658613622 0.93823808004942788 4.554131152620382 -1.5014130522323044 1.2091286301545359 3.9232124298557061 -1.0258180729228352e-08 9.7277555970173531e-09 5 -0.56989893941392789 0.5404308418831113 4.9999999947704303 -1.0804173341964742 1.0095983318105231 4.5540927235145698 -1.42143342588618 1.3018597269021543 3.9235932029191516 -9.6215006543137789e-09 1.0399151955728607e-08 5 -0.53452782352573358 0.57773064024459908 4.9999999947704303 -1.0121950097793266 1.0809585835716184 4.5540542944087576 -1.3414537995400555 1.394590823649773 3.9239739759825976 -8.9187111881050329e-09 1.1007825749340803e-08 5 -0.49548396361222669 0.61154585159553632 4.9999999947704303 -0.93801294878014163 1.1435917964881992 4.5540762467125457 -1.2496274631237831 1.482970938534051 3.9242719465810136 -8.1632818104813583e-09 1.1542111294444791e-08 5 -0.45351566412416955 0.64122838240179436 4.9999999947704303 -0.86109934457807891 1.1988092980184009 4.5541657294473969 -1.1444881605347093 1.5601013422709402 3.9241838901962742 -2.3682917857149079 0.34896880016056714 3.2942020509451519 -2.6092230410694173 0.35440257013029652 2.4930626592556555 -2.7418514601399591 0.32366701737175796 1.7515749127262328 -2.3440226824156047 0.51330628998754413 3.2939364554408233 -2.5820644792650587 0.5495652602417177 2.4926871801890322 -2.7110441325220442 0.56802875516418982 1.7471630864971588 -2.2953001124691994 0.66359097571866121 3.2933624665477801 -2.515421992037485 0.71157850939995682 2.4926321599348364 -2.5994237369097033 0.7279315475098842 1.7520298853594396 -2.2383347789430217 0.79831564619785 3.2930936823237333 -2.4485932979840515 0.84116092395251651 2.4936206142624369 -2.5326228968077213 0.81950335011682651 1.7593940340559813 -2.1813694454168435 0.93304031667703879 3.292824898099687 -2.3817646039306175 0.97074333850507599 2.4946090685900368 -2.4658220567057394 0.91107515272376871 1.7667581827525229 -2.0873375395139027 1.0601931094150965 3.3337061197914029 -2.2705204390977189 1.1046416157343402 2.5858527378715501 -2.3279343401651746 1.0419533435613204 1.9154012332922596 -2.0039432413866196 1.1994266871191666 3.3334405242870746 -2.1745365338988081 1.2679810426661535 2.5854772588049268 -2.2128456728059214 1.2430682032092273 1.9109894070631859 -1.9205489432593366 1.3386602648232364 3.3331749287827455 -2.0785526286998972 1.4313204695979669 2.5851017797383031 -2.0977570054466681 1.4441830628571339 1.9065775808341121 -1.8541864458509869 1.4800191802596434 3.2922937070910292 -2.0196699005113183 1.5904809234459558 2.4938581104567903 -2.0673183296891211 1.617365404068055 1.7579345302943747 -1.7624495175758856 1.5941211219937854 3.2930936823237333 -1.9403068819022362 1.7141674489267049 2.4936206142624369 -2.0262281030727016 1.7263151950341624 1.759394034055981 -1.6707125893007844 1.7082230637279272 3.2938936575564384 -1.8609438632931541 1.837853974407454 2.4933831180680825 -1.9851378764562826 1.8352649860002699 1.7608535378175876 -1.5612419774674247 1.8223500805799027 3.2944676464494806 -1.7516037101908279 1.9768029081841856 2.4934381383222779 -1.9044885297656293 2.0166431317145013 1.7559867389553065 -1.4278769764913399 1.9213933865234794 3.2942020509451515 -1.5943988453592974 2.0955997665774442 2.4930626592556551 -1.7099146176412083 2.1676489033011959 1.7515749127262326 -2.8744798792105009 0.29293146461321939 1.0100871661968105 -2.9119387162937747 0.22746247248711851 0.32804379274938794 -3.0055369055101107 0.15613639887297362 -0.1815293771969344 -2.8400237857790294 0.58649225008666206 1.0016389928052856 -2.8709117504924069 0.59069802723054454 0.31180660564986457 -2.9686808037775378 0.61892871126326066 -0.22366590436094622 -2.6834254817819216 0.74428458561981192 1.011427610784043 -2.6382788666223886 0.73299167128358234 0.34130352212293014 -2.6247693021333358 0.74625089298334302 -0.22969079296653713 -2.6166524956313912 0.7978457762811364 1.0251674538495261 -2.5852492378606096 0.71683672383972563 0.36466121884116542 -2.5942339645234815 0.63966248721335572 -0.18912176411698337 -2.5498795094808617 0.8514069669424611 1.038907296915009 -2.5322196090988296 0.70068177639586915 0.38801891555940082 -2.5636986269136268 0.53307408144336843 -0.14855273526742957 -2.3853482412326303 0.97926507138830066 1.24494972871297 -2.326224973972689 0.81574706706305489 0.66871004740253415 -2.2506495863571852 0.61869615947435053 0.12629319400467279 -2.2511548117130347 1.218155363752301 1.2365015553214453 -2.1635614418005265 1.1068560897159476 0.65247286030301066 -2.0594778141106072 0.9891213481193869 0.084156666840661018 -2.1169613821934394 1.4570456561163012 1.2280533819299206 -2.0008979096283634 1.3979651123688401 0.63623567320348717 -1.8683060418640292 1.3595465367644233 0.042020139676649276 -2.1149667588669239 1.6442498846901541 1.0220109501319594 -2.0522143606805483 1.5977051794353154 0.35554454136035363 -2.0319129502223907 1.6047668795502767 -0.23282578959545333 -2.112149324243167 1.7384629411416199 1.0251674538495259 -2.1141373193754878 1.6516028291716986 0.36466121884116531 -2.1519714262068583 1.5837414375536225 -0.1891217641169835 -2.1093318896194106 1.8326759975930862 1.0283239575670922 -2.1760602780704277 1.7055004789080819 0.373777896321977 -2.2720299021913264 1.5627159955569681 -0.1454177386385137 -2.0573733493404305 2.0564833552448176 1.018535339588335 -2.1840681255866681 1.9920559912545999 0.34428097984891132 -2.3681352023948818 1.934458250516786 -0.13939285003292284 -1.8254303899231192 2.2396980400249475 1.0100871661968103 -1.8982113559298786 2.2198918694520779 0.32804379274938772 -2.0148304205595036 2.2356406334257581 -0.18152937719693465 -3.0991350947264462 0.084810325258828659 -0.69110254714325681 -3.256848601196868 0.0084807141874978231 -1.0312035941324103 -3.5131107390272627 -0.04557249791763357 -1.1730960496382663 -3.0664498570626697 0.64715939529597677 -0.75913841437175689 -3.2678169556429215 0.69648600705520025 -1.1631975583091827 -3.5749766014200612 0.78954072253810592 -1.2972917779210966 -2.6112597376442821 0.75951011468310381 -0.80068510805600435 -2.6180712726214139 0.79076306366068139 -1.3899488237909088 -3.0818509411269739 0.9027182195891359 -1.8165930114767295 -2.6032186911863531 0.56248825058698582 -0.74290474707513221 -2.6200252854547017 0.47891632680356711 -1.2932038013394727 -3.0873651176672912 0.49045848441890944 -1.7266197299589461 -2.5951776447284249 0.36546638649086777 -0.68512438609425996 -2.6219792982879895 0.1670695899464528 -1.1964587788880363 -3.0928792942076084 0.078198749248682947 -1.6366464484411627 -2.1750741987416813 0.42164525188564606 -0.41612365939318857 -1.932471381659022 0.1391903995999883 -1.1171476502217945 -2.5331045353017516 0.07619286189011977 -1.9913728011403986 -1.9553941864206879 0.87138660652282618 -0.48415952662168865 -1.7159403169663547 0.6946078742274483 -1.2491416143985667 -2.3029920134528137 0.80857096790396488 -2.1155685294232289 -1.7357141740996949 1.3211279611600062 -0.55219539385018868 -1.4994092522736873 1.250025348854908 -1.3811355785753394 -2.0728794916038757 1.54094907391781 -2.2397642577060592 -2.0116115397642331 1.6118285796652385 -0.82119612055126034 -2.0391647466935052 1.6673190366197455 -1.460446707241581 -2.4669705800508472 1.9788424112371621 -1.8850379050068236 -2.1898055330382289 1.5158800459355466 -0.74290474707513232 -2.2373143921367706 1.4451012612404315 -1.2932038013394729 -2.6646631053521026 1.6346080354943044 -1.7266197299589463 -2.3679995263122251 1.4199315122058545 -0.66461337359900452 -2.4354640375800356 1.2228834858611182 -1.1259608954373643 -2.8623556306533575 1.2903736597514468 -1.5682015549110691 -2.5522022792030956 1.8768605097789723 -0.62306667991475695 -2.7756803709646687 1.8146874958292594 -0.89920962995563802 -3.0631374993595175 1.8176598122476006 -1.0489003213554362 -2.1314494851891288 2.2513893973994383 -0.69110254714325703 -2.2969429606929421 2.308936501715511 -1.0312035941324105 -2.5163690489386292 2.4519198043122916 -1.1730960496382665 -3.7693728768576573 -0.099625710022764963 -1.3149885051441224 -4.1232358384520671 -0.13069283609499552 -1.2581375373672679 -4.4347575758829132 -0.12435865482607621 -1.0373325875161723 -3.8821362471972005 0.88259543802101159 -1.4313859975330103 -4.2102661452645629 1.0174383927525501 -1.3480667340146339 -4.4986625055709952 1.1461026088771102 -1.1441283323599891 -3.5456306096325338 1.0146733755175905 -2.2432371991625502 -4.2752887354654581 1.1921457377177742 -2.2805261218631858 -4.8552807324802556 1.3777685792723753 -1.9999751181598333 -3.5547049498798806 0.50200064203425177 -2.1600356585784199 -4.3353515540801251 0.59873560301602424 -2.2005090518265744 -4.9468220083874392 0.72921857720161809 -1.8972820474325414 -3.5637792901272269 -0.01067209144908691 -2.0768341179942893 -4.3954143726947912 0.0053254683142743668 -2.120491981789963 -5.0383632842946238 0.080668575130861203 -1.7945889767052496 -3.133737688944481 0.013195324180251246 -2.8655979520590029 -4.4780053140955278 0.19177603773920393 -3.1777897925181477 -5.5155513698075342 0.43422270847473765 -2.7998638882620592 -2.8900437099392731 0.92253406158048157 -2.9819954444478913 -4.1290984323575417 1.3034685972980882 -3.2677189891655134 -5.0811097849095965 1.6937144055861746 -2.9066596331058756 -2.6463497309340638 1.8318727989807122 -3.0983929368367802 -3.780191550619556 2.4151611568569731 -3.3576481858128795 -4.6466682000116588 2.9532061026976115 -3.0134553779496929 -2.8947764134081893 2.2903657858545787 -2.3096291027720657 -3.5029998588440137 2.7403682807646326 -2.3003503750846948 -3.9635477042201837 3.1328966861154544 -2.0081804663928833 -3.0920118185674346 1.8241148097481776 -2.1600356585784204 -3.776216371414272 2.2122267822370159 -2.2005090518265749 -4.2912077364576291 2.5667769436724486 -1.8972820474325416 -3.2892472237266803 1.3578638336417757 -2.0104422143847742 -4.0494328839845304 1.6840852837093998 -2.1006677285684545 -4.6188677686950754 2.0006572012294432 -1.7863836284722001 -3.3505946277543659 1.8206321286659417 -1.1985910127552344 -3.7582934699504111 1.9497631334195771 -1.1682083407199022 -4.0769461686176403 2.1043729227654207 -0.9305368426723557 -2.7357951371843163 2.5949031069090727 -1.3149885051441226 -3.0079818124561299 2.8231542311455819 -1.2581375373672683 -3.2237820029519786 3.0479123066984664 -1.0373325875161727 -4.7462793133137602 -0.11802447355715689 -0.81652763766507663 -5 -0.073740518829690585 -0.43005606989021922 -5 -3.320215232515106e-16 -1.5087393828002875e-16 -4.7870588658774267 1.2747668250016704 -0.94018993070534418 -5.0048263056714015 1.3950498392746828 -0.58861277257314992 -5 1.4625972592591148 -0.19467496971038245 -5.4352727294950522 1.5633914208269761 -1.7194241144564804 -5.9570848669522292 1.7812344769064943 -1.0386848179837016 -5.938538843445472 1.9251006988178905 -0.1946749697103827 -5.5582924626947534 0.85970155138721205 -1.5940550430385083 -6.1103104279389484 1.0615466284688073 -0.88012811530077106 -6.080868738500028 1.2095599964999948 -4.6660194735358936e-16 -5.6813121958944546 0.15601168194744802 -1.4686859716205367 -6.2635359889256668 0.34185878003112019 -0.72157141261784052 -6.2231986335545839 0.49401929418209933 0.19467496971038176 -6.5530974255195407 0.67666937921027137 -2.4219379840059707 -7.535335395281848 1.1046529533785521 -1.2248667171871686 -7.4565320529130075 1.3354710697580914 0.19467496971038156 -6.0331211374616514 2.0839602138742608 -2.5456002770462387 -6.9274855542166147 2.6127023020369227 -1.3834234198700992 -6.8367085405835217 2.8318573995016636 -7.4181187099173648e-16 -5.513144849403762 3.4912510485382509 -2.6692625700865062 -6.3196357131513814 4.1207516506952926 -1.5419801225530301 -6.2168850282540351 4.3282437292452354 -0.19467496971038306 -4.4240955495963536 3.5254250914662761 -1.7160105577010718 -4.8219798585402751 3.9253237595927719 -1.0386848179837018 -4.7497903474104577 4.0511415615041493 -0.19467496971038301 -4.8061991015009866 2.9213271051078809 -1.5940550430385088 -5.2389544342650449 3.3190557702285726 -0.88012811530077151 -5.1551115962757805 3.4445354447215339 -7.8582954604731321e-16 -5.1883026534056214 2.3172291187494864 -1.4720995283759455 -5.6559290099898156 2.7127877808643719 -0.72157141261784086 -5.5604328451411034 2.8379293279389191 0.19467496971038142 -4.3955988672848694 2.2589827121112642 -0.69286534462480931 -4.6228552357341197 2.4413871491947017 -0.2714993672072889 -4.5697463460997163 2.5013214657657574 0.19467496971038167 -3.4395821934478277 3.2726703822513508 -0.81652763766507708 -3.5876763268454259 3.4833914850200487 -0.43005606989021966 -3.5355339059327378 3.5355339059327373 -5.8383766681599652e-16 -8.1632818104813583e-09 -1.1542110682141616e-08 -5 -0.4535156641241696 -0.64122838240179392 -4.9999999947704303 -0.86109934457807891 -1.1988092980184006 -4.5541657294473969 -1.1444881605347093 -1.56010134227094 -3.9241838901962742 -7.4078524328576829e-09 -1.2076396227245603e-08 -5 -0.41154736463611241 -0.67091091320805185 -4.9999999947704303 -0.78418574037601618 -1.2540267995486025 -4.5542552121822473 -1.0393488579456354 -1.6372317460078292 -3.9240958338115348 -6.5998205027791211e-09 -1.2536267101315434e-08 -5 -0.36665670107132126 -0.69645929555149666 -4.9999999947704303 -0.70118152291611602 -1.3043041957171724 -4.5542332598784592 -0.92748705921823471 -1.6982780744836257 -3.9237978632131192 -5.7546725497787473e-09 -1.2912909538944595e-08 -5 -0.31970403619663385 -0.71738387578979568 -4.9999999947704303 -0.61181890670720962 -1.3462050486543278 -4.5540927235145698 -0.81503310025484599 -1.7467205781822253 -3.9235932029191516 -4.9095245967783752e-09 -1.3289551976573755e-08 -5 -0.27275137132194649 -0.73830845602809458 -4.9999999947704303 -0.52245629049830311 -1.3881059015914832 -4.5539521871506805 -0.70257914129145704 -1.7951630818808246 -3.923388542625184 -4.027302416753386e-09 -1.3582947351309275e-08 -5 -0.22373902713169191 -0.7546081993582866 -4.9999999947704303 -0.42979713281373799 -1.4169779672262595 -4.5499065825209621 -0.57804896229729796 -1.8213091165382245 -3.9418063511561829 -3.124914450245687e-09 -1.3787472523809034e-08 -5 -0.17360636145015051 -0.76597070914470833 -4.9999999947704303 -0.33750778821045441 -1.4386058606867578 -4.5499960652558125 -0.45319344965490282 -1.8518652298911324 -3.9417182947714435 -2.2225264837379868e-09 -1.3991997696308794e-08 -5 -0.12347369576860932 -0.77733321893113005 -4.9999999947704303 -0.24521844360717099 -1.4602337541472568 -4.5500855479906637 -0.32833793701250785 -1.8824213432440404 -3.9416302383867041 -1.3000173573890351e-09 -1.4107642551996935e-08 -5 -0.072223187853683646 -0.78375793325289089 -4.9999999947704303 -0.14877638297509627 -1.4756454005158901 -4.554131152620382 -0.20667629688638162 -1.9166424043045276 -3.9232124298557061 -3.7506764086189807e-10 -1.4132190671687164e-08 -5 -0.020837091592707416 -0.78512171770851225 -4.9999999947704303 -0.050076596823972801 -1.4778642502196659 -4.5540927235145698 -0.084551373403164029 -1.9256590554955235 -3.9235932029191516 5.4988207566523903e-10 -1.4156738791377395e-08 -5 0.030549004668268889 -0.78648550216413371 -4.9999999947704303 0.048623189327150665 -1.480083099923442 -4.5540542944087576 0.037573550080053877 -1.9346757066865197 -3.9239739759825976 1.4772266399616424e-09 -1.4090188961068442e-08 -5 0.082068148030311303 -0.78278828930909938 -4.9999999947704303 0.14536619728288369 -1.4719168311293394 -4.5540762467125457 0.16499875380823636 -1.9322388600717753 -3.9242719465810136 2.3891928076198569e-09 -1.3933816657476189e-08 -5 0.13273293600906808 -0.77410093896210996 -4.9999999947704303 0.23879699815184455 -1.4565753698047468 -4.5541657294473969 0.29388289915620541 -1.9124335777598274 -3.9241838901962742 -1.4278769764913395 -1.9213933865234791 -3.2942020509451519 -1.5943988453592972 -2.0955997665774437 -2.4930626592556555 -1.7099146176412079 -2.1676489033011959 -1.7515749127262328 -1.2945119755152545 -2.0204366924670558 -3.2939364554408233 -1.4371939805277665 -2.2143966249707026 -2.4926871801890322 -1.5153407055167871 -2.3186546748878905 -1.7471630864971588 -1.1537925955203534 -2.092251953250079 -3.2933624665477801 -1.2755099587721548 -2.2818339374588041 -2.4926321599348364 -1.3233448180622709 -2.3527954850299837 -1.7520298853594396 -1.0182472938024825 -2.1472361077101225 -3.2930936823237333 -1.1366263319764895 -2.3262075187684217 -2.4936206142624369 -1.2113584484483564 -2.370311200593759 -1.7593940340559813 -0.88270199208461098 -2.2022202621701661 -3.292824898099687 -0.99774270518082409 -2.3705811000780384 -2.4946090685900368 -1.0993720788344419 -2.3878269161575338 -1.7667581827525232 -0.72630079178085794 -2.2256402658501897 -3.3337061197914029 -0.82440082204203846 -2.3865999765752708 -2.5858527378715501 -0.90932588317562002 -2.3828704330000323 -1.9154012332922599 -0.56887911109935141 -2.2651245990955071 -3.3334405242870746 -0.64103153537251212 -2.4342275227429639 -2.5854772588049268 -0.68573622499375353 -2.4437001369269971 -1.9109894070631861 -0.4114574304178451 -2.3046089323408245 -3.3331749287827455 -0.45766224870298572 -2.4818550689106571 -2.5851017797383031 -0.46214656681188709 -2.5045298408539618 -1.9065775808341123 -0.2645762107976673 -2.3576394080931649 -3.2922937070910292 -0.30348243609343584 -2.5527621287263904 -2.4938581104567903 -0.31816476492138229 -2.6054648546674666 -1.757934530294375 -0.1190261499823551 -2.3734538607713809 -3.2930936823237333 -0.1599047265506793 -2.5841035810013144 -2.4936206142624369 -0.2120704510394287 -2.6534488127874956 -1.7593940340559813 0.02652391083295693 -2.3892683134495969 -3.2938936575564384 -0.01632701700792262 -2.6154450332762389 -2.493383118068083 -0.10597613715747524 -2.701432770907525 -1.7608535378175878 0.18463131033358929 -2.3925608890142112 -3.2944676464494811 0.15923988001887493 -2.6363816028737759 -2.4934381383222783 0.079305279579325275 -2.7726587877578739 -1.7559867389553068 0.34896880016056631 -2.3682917857149079 -3.2942020509451519 0.35440257013029608 -2.6092230410694173 -2.4930626592556555 0.3236670173717574 -2.7418514601399591 -1.7515749127262328 -1.8254303899231188 -2.2396980400249475 -1.0100871661968105 -1.8982113559298783 -2.2198918694520779 -0.328043792749388 -2.0148304205595036 -2.2356406334257581 0.18152937719693438 -1.5934874305058073 -2.4229127248050775 -1.0016389928052856 -1.6123545862730886 -2.4477277476495565 -0.31180660564986462 -1.6615256387241253 -2.5368230163347296 0.22366590436094613 -1.3711796773523868 -2.4237570326011637 -1.011427610784043 -1.3472414959319683 -2.3838482585677316 -0.34130352212293025 -1.3283131056937254 -2.3836712394838022 0.22969079296653705 -1.2860905649202232 -2.4144148824190963 -1.0251674538495261 -1.3211671587179725 -2.334927375579209 -0.36466121884116554 -1.3820907459197982 -2.2867101106782322 0.18912176411698328 -1.2010014524880601 -2.4050727322370298 -1.038907296915009 -1.2950928215039759 -2.2860064925906864 -0.38801891555940093 -1.4358683861458705 -2.1897489818726621 0.14855273526742951 -0.99425094430920169 -2.3791408894247934 -1.2449497287129703 -1.068069170808265 -2.2217097365149119 -0.66871004740253426 -1.1539653347294769 -2.0289338344462506 -0.12629319400467287 -0.73044091461499505 -2.4531727511110297 -1.2365015553214456 -0.74720352017512415 -2.3125344138466684 -0.65247286030301077 -0.75685631538926013 -2.1556851407324564 -0.084156666840661143 -0.4666308849207888 -2.5272046127972665 -1.2280533819299209 -0.42633786954198294 -2.4033590911784244 -0.6362356732034874 -0.35974729604904337 -2.2824364470186622 -0.042020139676649443 -0.33284709374932897 -2.6581675806085423 -1.0220109501319596 -0.32138652417004993 -2.5808828576012122 -0.35554454136035385 -0.30203788312944008 -2.5715209686365927 0.23282578959545314 -0.26423617552817824 -2.7227940445736767 -1.0251674538495261 -0.32706127455576223 -2.6627803952241522 -0.36466121884116554 -0.40179927825025807 -2.6415478985308534 0.18912176411698331 -0.19562525730702754 -2.7874205085388115 -1.0283239575670924 -0.33273602494147481 -2.7446779328470927 -0.37377789632197722 -0.50156067337107646 -2.711574828425114 0.14541773863851351 -0.00062932086022406749 -2.9089359726419723 -1.0185353395883352 -0.13577308225630796 -2.9529656820951424 -0.34428097984891154 -0.30665591351731369 -3.0423930072426826 0.13939285003292259 0.29293146461321867 -2.8744798792105009 -1.0100871661968105 0.22746247248711801 -2.9119387162937747 -0.328043792749388 0.15613639887297343 -3.0055369055101107 0.18152937719693438 -2.1314494851891288 -2.2513893973994379 0.69110254714325681 -2.2969429606929426 -2.3089365017155119 1.0312035941324103 -2.5163690489386292 -2.4519198043122925 1.1730960496382663 -1.7106966911751624 -2.6259182850199037 0.75913841437175678 -1.8182055504212156 -2.8031855076017629 1.1631975583091827 -1.9696005985177414 -3.0861797963769839 1.2972917779210966 -1.3093847154554819 -2.3834942203998719 0.80068510805600424 -1.2921020258739786 -2.4104098751266134 1.3899488237909088 -1.5408795245049016 -2.8175158736491519 1.8165930114767295 -1.4430143331216234 -2.2384928457772548 0.7429047470751321 -1.5139926639214845 -2.1912826285289944 1.2932038013394727 -1.8362902904782572 -2.5299033309244323 1.7266197299589461 -1.5766439507877659 -2.0934914711546382 0.68512438609425996 -1.7358833019689901 -1.9721553819313755 1.1964587788880363 -2.1317010564516128 -2.2422907881997132 1.6366464484411627 -1.2398614986506891 -1.8361579323775894 0.41612365939318852 -1.2680411429868141 -1.4648860938532484 1.1171476502217945 -1.737298905045753 -1.8450518836867806 1.9913728011403986 -0.76650911060339622 -1.9988358676182447 0.48415952662168854 -0.72219109610650201 -1.7045149723701045 1.2491416143985667 -1.0567152552554813 -2.2002072842064093 2.1155685294232289 -0.29315672255610387 -2.1615138028589 0.55219539385018857 -0.17634104922618984 -1.9441438508869604 1.3811355785753392 -0.37613160546520963 -2.5553626847260378 2.2397642577060592 -0.28268924208883006 -2.5621590796719733 0.82119612055126012 -0.26293462314828248 -2.6208798175387695 1.4604467072415808 -0.34515873825632853 -3.1436645140270012 1.8850379050068233 -0.47653728194475387 -2.6203154018375541 0.7429047470751321 -0.56017927700182746 -2.6038610796505108 1.2932038013394727 -0.72835892489203191 -3.040043777852119 1.7266197299589461 -0.67038532180067811 -2.6784717240031353 0.6646133735990043 -0.85742393085537161 -2.5868423417622521 1.1259608954373641 -1.111559111527735 -2.9364230416772368 1.5682015549110688 -0.47753874477831942 -3.1318203323902232 0.62306667991475673 -0.6795245786802051 -3.2458802467508132 0.8992096299556378 -0.88068571837337362 -3.4512448766344641 1.048900321355436 0.084810325258828811 -3.0991350947264462 0.69110254714325681 0.0084807141874975577 -3.2568486011968676 1.0312035941324103 -0.045572497917633945 -3.5131107390272622 1.1730960496382663 -2.7357951371843163 -2.5949031069090731 1.3149885051441224 -3.0079818124561299 -2.8231542311455833 1.2581375373672679 -3.2237820029519786 -3.0479123066984672 1.0373325875161723 -2.1209956466142672 -3.3691740851522041 1.4313859975330103 -2.2576701549618483 -3.6965453288715882 1.3480667340146337 -2.3706178372863174 -3.9914516906315134 1.1441283323599889 -1.7896570231358246 -3.2246218721716899 2.2432371991625502 -2.1801113210752074 -3.8660599916809626 2.2805261218631858 -2.4589724251919245 -4.4074314358104285 1.9999751181598331 -2.1585879170350299 -2.8685240333198703 2.1600356585784199 -2.6421864776872463 -3.4889264877481412 2.2005090518265744 -2.9822959865471446 -4.0135667883600847 1.8972820474325414 -2.527518810934235 -2.5124261944680506 2.0768341179942893 -3.1042616342992839 -3.1117929838153193 2.120491981789963 -3.5056195479023651 -3.6197021409097418 1.7945889767052496 -2.2065566671046914 -2.2252176735203131 2.8655979520590029 -3.030821787031865 -3.302034060540822 3.1777897925181477 -3.5930419538659821 -4.2071255972813351 2.7998638882620592 -1.3912394144044609 -2.6958995960427146 2.9819954444478913 -1.9980220174935652 -3.8414049859199562 3.2677189891655134 -2.3952502432795688 -4.7905241264462228 2.9066596331058756 -0.57592216170422905 -3.1665815185651152 3.0983929368367797 -0.96522224795526557 -4.3807759112990912 3.357648185812879 -1.1974585326931559 -5.3739226556111097 3.0134553779496924 -0.4273828533643747 -3.666449210515232 2.3096291027720652 -0.53926196040692842 -4.4147279489613132 2.3003503750846943 -0.58735896770136387 -5.0179439507195651 2.0081804663928828 -0.89653857278223636 -3.4762264760537276 2.1600356585784199 -1.1059076442124005 -4.2344687626969799 2.2005090518265744 -1.2193567072652953 -4.8493274725934343 1.8972820474325414 -1.365694292200099 -3.2860037415922223 2.0104422143847742 -1.6725533280178719 -4.0542095764326467 2.1006677285684545 -1.8513544468292273 -4.6807109944673044 1.7863836284721999 -1.0818468580665417 -3.6566095065181146 1.1985910127552342 -1.2788240649425415 -4.0362055316395704 1.168208340719902 -1.3948199185292633 -4.3708526461948312 0.93053684267235548 -0.099625710022765129 -3.7693728768576573 1.3149885051441224 -0.13069283609499649 -4.1232358384520662 1.2581375373672679 -0.12435865482607689 -4.4347575758829123 1.0373325875161723 -3.4395821934478281 -3.2726703822513521 0.81652763766507663 -3.5876763268454259 -3.4833914850200491 0.43005606989021922 -3.5355339059327378 -3.5355339059327373 1.508739382800288e-16 -2.483565519610786 -4.2863580523914377 0.94018993070534407 -2.5524974179567335 -4.5253958208453966 0.5886127725731497 -2.5013214657657588 -4.5697463460997163 0.19467496971038228 -2.7378335293086407 -4.9488028799398931 1.7194241144564801 -2.9527721280218286 -5.4718180830295386 1.0386848179837014 -2.8379293279389186 -5.5604328451411025 0.19467496971038248 -3.3224054954070423 -4.5382070889720278 1.5940550430385083 -3.5700151192144953 -5.0712687582865161 0.88012811530077095 -3.4445354447215335 -5.1551115962757796 3.184784616492628e-16 -3.9069774615054444 -4.1276112980041635 1.4686859716205367 -4.1872581104071616 -4.6707194335434927 0.72157141261784052 -4.0511415615041484 -4.7497903474104568 -0.19467496971038181 -4.1552621207000993 -5.1122171340218481 2.4219379840059707 -4.5471791623270867 -6.1093943507105299 1.2248667171871683 -4.3282437292452371 -6.2168850282540351 -0.19467496971038173 -2.7924784690655726 -5.7396432669724886 2.5456002770462383 -3.0510124969664054 -6.7459315269504279 1.383423419870099 -2.8318573995016649 -6.8367085405835217 3.9502081453687136e-16 -1.429694817431046 -6.3670693999231291 2.6692625700865058 -1.5548458316057243 -7.3824687031903267 1.5419801225530296 -1.3354710697580927 -7.4565320529130066 0.19467496971038253 -0.63545597499579931 -5.6211599524778162 1.7160105577010714 -0.63403160795805558 -6.1852777054794998 1.0386848179837014 -0.49401929418209961 -6.2231986335545848 0.19467496971038251 -1.332805770318191 -5.4641861824898879 1.5940550430385083 -1.3575733645311829 -6.0514270490611093 0.88012811530077106 -1.2095599964999952 -6.0808687385000288 3.6400954689007538e-16 -2.0301555656405834 -5.3072124125019622 1.4720995283759453 -2.081115121104312 -5.9175763926427178 0.72157141261784052 -1.9251006988178911 -5.9385388434454729 -0.19467496971038178 -1.5108157721159849 -4.7054997607500919 0.69286534462480909 -1.5425308769340649 -4.9951736943285985 0.27149936720728862 -1.4625972592591154 -4.9999999999999991 -0.19467496971038198 -0.11802447355715759 -4.7462793133137593 0.81652763766507663 -0.073740518829690807 -5 0.43005606989021922 -7.0646613559155469e-16 -5 1.508739382800288e-16 -8.1632818104813583e-09 1.1542111294444793e-08 5 -0.4535156641241696 0.64122838240179458 4.9999999947704303 -0.86109934457807891 1.1988092980184013 4.5541657294473969 -1.1444881605347093 1.5601013422709404 3.9241838901962742 -7.4078524328576829e-09 1.207639683954878e-08 5 -0.41154736463611241 0.67091091320805252 4.9999999947704303 -0.78418574037601618 1.2540267995486032 4.5542552121822473 -1.0393488579456354 1.6372317460078296 3.9240958338115348 -6.5998205027791211e-09 1.253626771361861e-08 5 -0.36665670107132126 0.69645929555149733 4.9999999947704303 -0.70118152291611602 1.3043041957171728 4.5542332598784592 -0.92748705921823471 1.6982780744836261 3.9237978632131192 -5.7546725497787473e-09 1.2912910151247772e-08 5 -0.31970403619663385 0.71738387578979634 4.9999999947704303 -0.61181890670720962 1.3462050486543282 4.5540927235145698 -0.81503310025484599 1.7467205781822257 3.9235932029191516 -4.9095245967783752e-09 1.3289552588876932e-08 5 -0.27275137132194649 0.73830845602809525 4.9999999947704303 -0.52245629049830311 1.3881059015914838 4.5539521871506805 -0.70257914129145704 1.7951630818808251 3.923388542625184 -4.027302416753386e-09 1.3582947963612452e-08 5 -0.22373902713169191 0.75460819935828716 4.9999999947704303 -0.42979713281373799 1.4169779672262599 4.5499065825209621 -0.57804896229729796 1.8213091165382249 3.9418063511561825 -3.124914450245687e-09 1.3787473136112211e-08 5 -0.17360636145015051 0.76597070914470888 4.9999999947704303 -0.33750778821045441 1.4386058606867584 4.5499960652558125 -0.45319344965490282 1.8518652298911329 3.9417182947714431 -2.2225264837379868e-09 1.3991998308611971e-08 5 -0.12347369576860932 0.77733321893113072 4.9999999947704303 -0.24521844360717099 1.4602337541472572 4.5500855479906637 -0.32833793701250785 1.8824213432440411 3.9416302383867037 -1.3000173573890351e-09 1.4107643164300112e-08 5 -0.072223187853683646 0.78375793325289145 4.9999999947704303 -0.14877638297509627 1.4756454005158905 4.554131152620382 -0.20667629688638162 1.916642404304528 3.9232124298557056 -3.7506764086189807e-10 1.4132191283990341e-08 5 -0.020837091592707416 0.78512171770851291 4.9999999947704303 -0.050076596823972801 1.4778642502196664 4.5540927235145698 -0.084551373403164029 1.925659055495524 3.9235932029191511 5.4988207566523903e-10 1.4156739403680572e-08 5 0.030549004668268889 0.78648550216413438 4.9999999947704303 0.048623189327150665 1.4800830999234427 4.5540542944087576 0.037573550080053877 1.9346757066865201 3.9239739759825971 1.4772266399616424e-09 1.4090189573371618e-08 5 0.082068148030311303 0.78278828930909994 4.9999999947704303 0.14536619728288369 1.4719168311293398 4.5540762467125457 0.16499875380823636 1.9322388600717759 3.9242719465810132 2.3891928076198569e-09 1.3933817269779366e-08 5 0.13273293600906808 0.77410093896211052 4.9999999947704303 0.23879699815184455 1.4565753698047472 4.5541657294473969 0.29388289915620541 1.9124335777598278 3.9241838901962738 -1.4278769764913395 1.9213933865234796 3.2942020509451515 -1.5943988453592972 2.0955997665774442 2.4930626592556551 -1.7099146176412079 2.1676489033011959 1.7515749127262326 -1.2945119755152545 2.0204366924670563 3.2939364554408228 -1.4371939805277665 2.214396624970703 2.4926871801890318 -1.5153407055167871 2.3186546748878905 1.7471630864971586 -1.1537925955203534 2.0922519532500794 3.2933624665477796 -1.2755099587721548 2.2818339374588046 2.492632159934836 -1.3233448180622709 2.3527954850299841 1.7520298853594394 -1.0182472938024825 2.147236107710123 3.2930936823237329 -1.1366263319764895 2.3262075187684217 2.4936206142624364 -1.2113584484483564 2.370311200593759 1.759394034055981 -0.88270199208461098 2.2022202621701665 3.2928248980996866 -0.99774270518082409 2.3705811000780388 2.4946090685900364 -1.0993720788344419 2.3878269161575343 1.7667581827525229 -0.72630079178085794 2.2256402658501897 3.3337061197914024 -0.82440082204203846 2.3865999765752712 2.5858527378715497 -0.90932588317562002 2.3828704330000323 1.9154012332922596 -0.56887911109935141 2.2651245990955076 3.3334405242870742 -0.64103153537251212 2.4342275227429644 2.5854772588049264 -0.68573622499375353 2.4437001369269971 1.9109894070631859 -0.4114574304178451 2.304608932340825 3.333174928782745 -0.45766224870298572 2.4818550689106575 2.5851017797383027 -0.46214656681188709 2.5045298408539618 1.9065775808341121 -0.2645762107976673 2.3576394080931653 3.2922937070910288 -0.30348243609343584 2.5527621287263904 2.4938581104567898 -0.31816476492138229 2.6054648546674666 1.7579345302943747 -0.1190261499823551 2.3734538607713813 3.2930936823237329 -0.1599047265506793 2.5841035810013149 2.4936206142624364 -0.2120704510394287 2.653448812787496 1.759394034055981 0.02652391083295693 2.3892683134495973 3.2938936575564379 -0.01632701700792262 2.6154450332762389 2.4933831180680825 -0.10597613715747524 2.7014327709075254 1.7608535378175876 0.18463131033358929 2.3925608890142116 3.2944676464494806 0.15923988001887493 2.6363816028737763 2.4934381383222779 0.079305279579325275 2.7726587877578743 1.7559867389553063 0.34896880016056631 2.3682917857149084 3.2942020509451515 0.35440257013029608 2.6092230410694177 2.4930626592556551 0.3236670173717574 2.7418514601399595 1.7515749127262323 -1.8254303899231188 2.239698040024948 1.0100871661968103 -1.8982113559298783 2.2198918694520779 0.32804379274938772 -2.0148304205595036 2.2356406334257581 -0.18152937719693465 -1.5934874305058073 2.4229127248050775 1.0016389928052853 -1.6123545862730886 2.4477277476495565 0.31180660564986434 -1.6615256387241253 2.5368230163347296 -0.22366590436094644 -1.3711796773523868 2.4237570326011637 1.0114276107840428 -1.3472414959319683 2.3838482585677316 0.34130352212292997 -1.3283131056937254 2.3836712394838022 -0.22969079296653735 -1.2860905649202232 2.4144148824190963 1.0251674538495259 -1.3211671587179725 2.334927375579209 0.36466121884116526 -1.3820907459197982 2.2867101106782322 -0.18912176411698356 -1.2010014524880601 2.4050727322370298 1.0389072969150088 -1.2950928215039759 2.2860064925906864 0.38801891555940066 -1.4358683861458705 2.1897489818726621 -0.14855273526742979 -0.99425094430920169 2.3791408894247934 1.24494972871297 -1.068069170808265 2.2217097365149119 0.66871004740253404 -1.1539653347294769 2.0289338344462506 0.12629319400467262 -0.73044091461499505 2.4531727511110302 1.2365015553214453 -0.74720352017512415 2.3125344138466684 0.65247286030301044 -0.75685631538926013 2.1556851407324564 0.084156666840660879 -0.4666308849207888 2.5272046127972665 1.2280533819299206 -0.42633786954198294 2.4033590911784244 0.63623567320348706 -0.35974729604904337 2.2824364470186622 0.042020139676649165 -0.33284709374932897 2.6581675806085423 1.0220109501319594 -0.32138652417004993 2.5808828576012122 0.35554454136035352 -0.30203788312944008 2.5715209686365927 -0.23282578959545344 -0.26423617552817824 2.7227940445736767 1.0251674538495257 -0.32706127455576223 2.6627803952241522 0.3646612188411652 -0.40179927825025807 2.6415478985308534 -0.18912176411698364 -0.19562525730702754 2.7874205085388115 1.0283239575670919 -0.33273602494147481 2.7446779328470927 0.37377789632197689 -0.50156067337107646 2.711574828425114 -0.14541773863851384 -0.00062932086022406749 2.9089359726419728 1.0185353395883348 -0.13577308225630796 2.9529656820951424 0.34428097984891115 -0.30665591351731369 3.0423930072426826 -0.13939285003292295 0.29293146461321867 2.8744798792105013 1.01008716619681 0.22746247248711801 2.9119387162937747 0.32804379274938766 0.15613639887297343 3.0055369055101107 -0.18152937719693474 -2.1314494851891288 2.2513893973994379 -0.69110254714325703 -2.2969429606929426 2.3089365017155119 -1.0312035941324105 -2.5163690489386292 2.4519198043122921 -1.1730960496382665 -1.7106966911751624 2.6259182850199037 -0.75913841437175711 -1.8182055504212156 2.8031855076017629 -1.1631975583091831 -1.9696005985177414 3.0861797963769835 -1.2972917779210971 -1.3093847154554819 2.3834942203998719 -0.80068510805600457 -1.2921020258739786 2.4104098751266134 -1.389948823790909 -1.5408795245049016 2.8175158736491515 -1.8165930114767299 -1.4430143331216234 2.2384928457772548 -0.74290474707513232 -1.5139926639214845 2.1912826285289944 -1.2932038013394729 -1.8362902904782572 2.5299033309244323 -1.7266197299589463 -1.5766439507877659 2.0934914711546382 -0.68512438609426018 -1.7358833019689901 1.9721553819313753 -1.1964587788880365 -2.1317010564516128 2.2422907881997132 -1.6366464484411629 -1.2398614986506891 1.8361579323775894 -0.41612365939318874 -1.2680411429868141 1.4648860938532482 -1.1171476502217947 -1.737298905045753 1.8450518836867804 -1.9913728011403988 -0.76650911060339622 1.9988358676182447 -0.48415952662168876 -0.72219109610650201 1.7045149723701043 -1.249141614398567 -1.0567152552554813 2.2002072842064089 -2.1155685294232294 -0.29315672255610387 2.1615138028589 -0.55219539385018879 -0.17634104922618984 1.9441438508869602 -1.3811355785753394 -0.37613160546520963 2.5553626847260373 -2.2397642577060597 -0.28268924208883006 2.5621590796719729 -0.82119612055126046 -0.26293462314828248 2.6208798175387695 -1.460446707241581 -0.34515873825632853 3.1436645140270008 -1.8850379050068238 -0.47653728194475387 2.6203154018375541 -0.74290474707513243 -0.56017927700182746 2.6038610796505108 -1.2932038013394729 -0.72835892489203191 3.040043777852119 -1.7266197299589465 -0.67038532180067811 2.6784717240031353 -0.66461337359900463 -0.85742393085537161 2.5868423417622517 -1.1259608954373643 -1.111559111527735 2.9364230416772368 -1.5682015549110693 -0.47753874477831942 3.1318203323902232 -0.62306667991475706 -0.6795245786802051 3.2458802467508128 -0.89920962995563825 -0.88068571837337362 3.4512448766344637 -1.0489003213554364 0.084810325258828811 3.0991350947264462 -0.69110254714325714 0.0084807141874975577 3.2568486011968676 -1.0312035941324107 -0.045572497917633945 3.5131107390272622 -1.1730960496382667 -2.7357951371843163 2.5949031069090727 -1.3149885051441226 -3.0079818124561299 2.8231542311455833 -1.2581375373672683 -3.2237820029519786 3.0479123066984672 -1.0373325875161727 -2.1209956466142672 3.3691740851522041 -1.4313859975330108 -2.2576701549618483 3.6965453288715882 -1.3480667340146342 -2.3706178372863174 3.9914516906315134 -1.1441283323599893 -1.7896570231358246 3.2246218721716895 -2.2432371991625506 -2.1801113210752074 3.8660599916809626 -2.2805261218631863 -2.4589724251919245 4.4074314358104276 -1.9999751181598335 -2.1585879170350299 2.8685240333198698 -2.1600356585784204 -2.6421864776872463 3.4889264877481412 -2.2005090518265749 -2.9822959865471446 4.0135667883600847 -1.8972820474325418 -2.527518810934235 2.5124261944680502 -2.0768341179942897 -3.1042616342992839 3.1117929838153189 -2.1204919817899635 -3.5056195479023651 3.6197021409097418 -1.7945889767052501 -2.2065566671046914 2.2252176735203126 -2.8655979520590034 -3.030821787031865 3.3020340605408216 -3.1777897925181482 -3.5930419538659821 4.2071255972813351 -2.7998638882620597 -1.3912394144044609 2.6958995960427141 -2.9819954444478918 -1.9980220174935652 3.8414049859199557 -3.2677189891655138 -2.3952502432795688 4.7905241264462219 -2.9066596331058761 -0.57592216170422905 3.1665815185651147 -3.0983929368367802 -0.96522224795526557 4.3807759112990903 -3.3576481858128795 -1.1974585326931559 5.3739226556111088 -3.0134553779496929 -0.4273828533643747 3.666449210515232 -2.3096291027720657 -0.53926196040692842 4.4147279489613132 -2.3003503750846948 -0.58735896770136387 5.0179439507195642 -2.0081804663928833 -0.89653857278223636 3.4762264760537271 -2.1600356585784204 -1.1059076442124005 4.2344687626969799 -2.2005090518265749 -1.2193567072652953 4.8493274725934334 -1.897282047432542 -1.365694292200099 3.2860037415922223 -2.0104422143847747 -1.6725533280178719 4.0542095764326467 -2.100667728568455 -1.8513544468292273 4.6807109944673044 -1.7863836284722006 -1.0818468580665417 3.6566095065181146 -1.1985910127552346 -1.2788240649425415 4.0362055316395704 -1.1682083407199024 -1.3948199185292633 4.3708526461948312 -0.93053684267235603 -0.099625710022765129 3.7693728768576573 -1.3149885051441228 -0.13069283609499649 4.1232358384520662 -1.2581375373672683 -0.12435865482607689 4.4347575758829123 -1.0373325875161727 -3.4395821934478281 3.2726703822513521 -0.81652763766507708 -3.5876763268454259 3.4833914850200491 -0.43005606989021966 -3.5355339059327378 3.5355339059327373 -5.8383766681599652e-16 -2.483565519610786 4.2863580523914377 -0.94018993070534462 -2.5524974179567335 4.5253958208453966 -0.58861277257315026 -2.5013214657657588 4.5697463460997163 -0.19467496971038284 -2.7378335293086407 4.9488028799398931 -1.7194241144564808 -2.9527721280218286 5.4718180830295386 -1.038684817983702 -2.8379293279389186 5.5604328451411025 -0.19467496971038317 -3.3224054954070423 4.5382070889720278 -1.594055043038509 -3.5700151192144953 5.0712687582865152 -0.88012811530077162 -3.4445354447215335 5.1551115962757796 -9.4977670319553652e-16 -3.9069774615054444 4.1276112980041635 -1.4686859716205372 -4.1872581104071616 4.6707194335434927 -0.72157141261784108 -4.0511415615041484 4.7497903474104568 0.19467496971038123 -4.1552621207000993 5.1122171340218481 -2.4219379840059712 -4.5471791623270867 6.1093943507105299 -1.224866717187169 -4.3282437292452371 6.2168850282540351 0.19467496971038098 -2.7924784690655726 5.7396432669724886 -2.5456002770462391 -3.0510124969664054 6.7459315269504279 -1.3834234198700999 -2.8318573995016649 6.8367085405835217 -1.2322484863399005e-15 -1.429694817431046 6.3670693999231291 -2.6692625700865067 -1.5548458316057243 7.3824687031903258 -1.5419801225530305 -1.3354710697580927 7.4565320529130066 -0.19467496971038345 -0.63545597499579931 5.6211599524778162 -1.716010557701072 -0.63403160795805558 6.1852777054794998 -1.038684817983702 -0.49401929418209961 6.2231986335545848 -0.19467496971038326 -1.332805770318191 5.4641861824898879 -1.594055043038509 -1.3575733645311829 6.0514270490611093 -0.88012811530077184 -1.2095599964999952 6.0808687385000288 -1.1086765962827753e-15 -2.0301555656405834 5.3072124125019622 -1.4720995283759459 -2.081115121104312 5.9175763926427178 -0.7215714126178413 -1.9251006988178911 5.9385388434454729 0.19467496971038106 -1.5108157721159849 4.7054997607500919 -0.69286534462480964 -1.5425308769340649 4.9951736943285985 -0.27149936720728923 -1.4625972592591154 4.9999999999999991 0.19467496971038137 -0.11802447355715759 4.7462793133137593 -0.81652763766507719 -0.073740518829690807 5 -0.43005606989021983 -7.0646613559155469e-16 5 -7.6317711519121735e-16 2.3891928076198581e-09 -1.393381665747619e-08 -5 0.13273293600906813 -0.77410093896211007 -4.9999999947704303 0.23879699815184469 -1.456575369804747 -4.5541657294473969 0.29388289915620563 -1.9124335777598276 -3.9241838901962742 3.3011589752780724e-09 -1.3777444353883936e-08 -5 0.18339772398782489 -0.76541358861512054 -4.9999999947704303 0.33222779902080568 -1.4412339084801546 -4.5542552121822473 0.42276704450417468 -1.8926282954478797 -3.9240958338115348 4.1977016459768406e-09 -1.3531257310235093e-08 -5 0.23320565100984905 -0.7517365303998893 -4.9999999947704303 0.42647213182498217 -1.4180925512183746 -4.5542332598784592 0.54503155377182155 -1.856696331843787 -3.9237978632131192 5.0616379163795456e-09 -1.319997388329281e-08 -5 0.28120211131750317 -0.73333189525220166 -4.9999999947704303 0.51928942098023356 -1.3845320165618489 -4.5540927235145698 0.65880253358904162 -1.8114333977524353 -3.9235932029191516 5.9255741867822489e-09 -1.2868690456350528e-08 -5 0.3291985716251572 -0.71492726010451402 -4.9999999947704303 0.61210671013548523 -1.3509714819053231 -4.5539521871506805 0.77257351340626168 -1.7661704636610833 -3.923388542625184 6.7568613318353522e-09 -1.2452327029385935e-08 -5 0.37538119160431421 -0.69179595820611484 -4.9999999947704303 0.69804226227048816 -1.3058671965647468 -4.5499065825209621 0.87911768584279204 -1.6966023680393247 -3.9418063511561829 7.5395671186120131e-09 -1.195886351540513e-08 -5 0.41886484718796763 -0.6643813180650161 -4.9999999947704303 0.77859391379943077 -1.2559020052932015 -4.5499960652558125 0.98901030045929839 -1.6299226233399107 -3.9417182947714435 8.3222729053886757e-09 -1.1465400001424324e-08 -5 0.46234850277162087 -0.6369666779239177 -4.9999999947704303 0.8591455653283735 -1.2059368140216566 -4.5500855479906637 1.0989029150758047 -1.5632428786404966 -3.9416302383867041 9.0563586260029208e-09 -1.0894860804142927e-08 -5 0.50313104352162297 -0.6052700553021223 -4.9999999947704303 0.93823808004942733 -1.1486396586136223 -4.554131152620382 1.2091286301545352 -1.5014130522323046 -3.9232124298557061 9.7277549847141746e-09 -1.0258180729228354e-08 -5 0.54043084188311064 -0.569898939413928 -4.9999999947704303 1.0095983318105224 -1.0804173341964745 -4.5540927235145698 1.3018597269021537 -1.4214334258861803 -3.9235932029191516 1.0399151343425428e-08 -9.6215006543137805e-09 -5 0.57773064024459841 -0.53452782352573369 -4.9999999947704303 1.0809585835716178 -1.0121950097793269 -4.5540542944087576 1.3945908236497724 -1.3414537995400557 -3.9239739759825976 1.1007825137037625e-08 -8.9187111881050345e-09 -5 0.61154585159553565 -0.49548396361222669 -4.9999999947704303 1.1435917964881985 -0.93801294878014163 -4.5540762467125457 1.4829709385340504 -1.2496274631237834 -3.9242719465810136 1.1542110682141613e-08 -8.1632818104813599e-09 -5 0.6412283824017937 -0.45351566412416955 -4.9999999947704303 1.1988092980184004 -0.86109934457807891 -4.5541657294473969 1.5601013422709396 -1.1444881605347095 -3.9241838901962742 0.34896880016056658 -2.3682917857149079 -3.2942020509451519 0.35440257013029602 -2.6092230410694173 -2.4930626592556555 0.32366701737175757 -2.7418514601399591 -1.7515749127262328 0.51330628998754357 -2.3440226824156047 -3.2939364554408233 0.54956526024171726 -2.5820644792650587 -2.4926871801890322 0.56802875516418949 -2.7110441325220442 -1.7471630864971588 0.66359097571866066 -2.2953001124691994 -3.2933624665477801 0.71157850939995637 -2.515421992037485 -2.4926321599348364 0.72793154750988387 -2.5994237369097033 -1.7520298853594396 0.79831564619784956 -2.2383347789430217 -3.2930936823237333 0.84116092395251607 -2.4485932979840515 -2.4936206142624369 0.81950335011682607 -2.5326228968077213 -1.7593940340559813 0.93304031667703835 -2.1813694454168435 -3.292824898099687 0.97074333850507555 -2.3817646039306175 -2.4946090685900368 0.91107515272376827 -2.4658220567057394 -1.7667581827525232 1.060193109415096 -2.0873375395139027 -3.3337061197914029 1.1046416157343397 -2.2705204390977189 -2.5858527378715501 1.0419533435613202 -2.3279343401651746 -1.9154012332922599 1.1994266871191661 -2.0039432413866196 -3.3334405242870746 1.2679810426661531 -2.1745365338988081 -2.5854772588049268 1.2430682032092271 -2.2128456728059214 -1.9109894070631861 1.338660264823236 -1.9205489432593368 -3.3331749287827455 1.4313204695979664 -2.0785526286998972 -2.5851017797383031 1.4441830628571337 -2.0977570054466681 -1.9065775808341123 1.480019180259643 -1.8541864458509871 -3.2922937070910292 1.5904809234459554 -2.0196699005113183 -2.4938581104567903 1.6173654040680547 -2.0673183296891211 -1.757934530294375 1.594121121993785 -1.7624495175758859 -3.2930936823237333 1.7141674489267045 -1.9403068819022364 -2.4936206142624369 1.7263151950341622 -2.0262281030727016 -1.7593940340559813 1.7082230637279268 -1.6707125893007846 -3.2938936575564384 1.8378539744074536 -1.8609438632931541 -2.493383118068083 1.8352649860002697 -1.9851378764562826 -1.7608535378175878 1.8223500805799022 -1.5612419774674247 -3.2944676464494811 1.9768029081841851 -1.7516037101908279 -2.4934381383222783 2.0166431317145008 -1.9044885297656293 -1.7559867389553068 1.9213933865234789 -1.4278769764913399 -3.2942020509451519 2.0955997665774442 -1.5943988453592974 -2.4930626592556555 2.1676489033011959 -1.7099146176412083 -1.7515749127262328 0.29293146461321912 -2.8744798792105009 -1.0100871661968105 0.22746247248711829 -2.9119387162937747 -0.328043792749388 0.15613639887297345 -3.0055369055101107 0.18152937719693438 0.58649225008666173 -2.8400237857790294 -1.0016389928052856 0.59069802723054432 -2.8709117504924069 -0.31180660564986462 0.61892871126326054 -2.9686808037775378 0.22366590436094613 0.74428458561981159 -2.6834254817819216 -1.011427610784043 0.73299167128358211 -2.6382788666223886 -0.34130352212293025 0.74625089298334291 -2.6247693021333358 0.22969079296653705 0.79784577628113607 -2.6166524956313912 -1.0251674538495261 0.71683672383972541 -2.5852492378606096 -0.36466121884116554 0.63966248721335561 -2.5942339645234815 0.18912176411698328 0.85140696694246076 -2.5498795094808617 -1.038907296915009 0.70068177639586893 -2.5322196090988296 -0.38801891555940093 0.53307408144336832 -2.5636986269136268 0.14855273526742951 0.97926507138830032 -2.3853482412326303 -1.2449497287129703 0.81574706706305466 -2.326224973972689 -0.66871004740253426 0.61869615947435042 -2.2506495863571852 -0.12629319400467287 1.2181553637523008 -2.2511548117130347 -1.2365015553214456 1.1068560897159474 -2.1635614418005265 -0.65247286030301077 0.98912134811938679 -2.0594778141106072 -0.084156666840661143 1.457045656116301 -2.1169613821934394 -1.2280533819299209 1.3979651123688399 -2.0008979096283634 -0.6362356732034874 1.3595465367644231 -1.8683060418640294 -0.042020139676649443 1.6442498846901539 -2.1149667588669239 -1.0220109501319596 1.5977051794353152 -2.0522143606805483 -0.35554454136035385 1.6047668795502767 -2.0319129502223907 0.23282578959545314 1.7384629411416197 -2.112149324243167 -1.0251674538495261 1.6516028291716984 -2.1141373193754878 -0.36466121884116554 1.5837414375536225 -2.1519714262068583 0.18912176411698331 1.832675997593086 -2.1093318896194111 -1.0283239575670924 1.7055004789080817 -2.1760602780704277 -0.37377789632197722 1.5627159955569681 -2.2720299021913264 0.14541773863851351 2.0564833552448172 -2.0573733493404309 -1.0185353395883352 1.9920559912545996 -2.1840681255866685 -0.34428097984891154 1.934458250516786 -2.3681352023948823 0.13939285003292259 2.2396980400249471 -1.8254303899231192 -1.0100871661968105 2.2198918694520775 -1.8982113559298786 -0.328043792749388 2.2356406334257577 -2.014830420559504 0.18152937719693438 0.084810325258828562 -3.0991350947264462 0.69110254714325681 0.0084807141874977503 -3.256848601196868 1.0312035941324103 -0.045572497917633639 -3.5131107390272627 1.1730960496382663 0.64715939529597677 -3.0664498570626697 0.75913841437175678 0.69648600705520014 -3.2678169556429215 1.1631975583091827 0.78954072253810581 -3.5749766014200612 1.2972917779210966 0.7595101146831037 -2.6112597376442821 0.80068510805600424 0.79076306366068139 -2.6180712726214139 1.3899488237909088 0.90271821958913601 -3.0818509411269739 1.8165930114767295 0.56248825058698571 -2.6032186911863531 0.7429047470751321 0.47891632680356711 -2.6200252854547017 1.2932038013394727 0.49045848441890944 -3.0873651176672912 1.7266197299589461 0.36546638649086766 -2.5951776447284249 0.68512438609425996 0.16706958994645277 -2.6219792982879895 1.1964587788880363 0.078198749248682961 -3.0928792942076084 1.6366464484411627 0.42164525188564594 -2.1750741987416813 0.41612365939318852 0.1391903995999883 -1.932471381659022 1.1171476502217945 0.076192861890119867 -2.5331045353017516 1.9913728011403986 0.87138660652282618 -1.9553941864206879 0.48415952662168854 0.6946078742274483 -1.7159403169663547 1.2491416143985667 0.80857096790396499 -2.3029920134528137 2.1155685294232289 1.3211279611600062 -1.7357141740996951 0.55219539385018857 1.250025348854908 -1.4994092522736875 1.3811355785753392 1.5409490739178102 -2.0728794916038757 2.2397642577060592 1.6118285796652385 -2.0116115397642331 0.82119612055126012 1.6673190366197455 -2.0391647466935052 1.4604467072415808 1.9788424112371623 -2.4669705800508477 1.8850379050068233 1.5158800459355466 -2.1898055330382289 0.7429047470751321 1.4451012612404315 -2.2373143921367706 1.2932038013394727 1.6346080354943047 -2.6646631053521026 1.7266197299589461 1.4199315122058545 -2.3679995263122251 0.6646133735990043 1.2228834858611182 -2.4354640375800356 1.1259608954373641 1.2903736597514468 -2.8623556306533575 1.5682015549110688 1.8768605097789723 -2.5522022792030961 0.62306667991475673 1.8146874958292591 -2.7756803709646691 0.8992096299556378 1.8176598122476004 -3.063137499359518 1.048900321355436 2.2513893973994379 -2.1314494851891292 0.69110254714325681 2.308936501715511 -2.2969429606929426 1.0312035941324103 2.4519198043122916 -2.5163690489386297 1.1730960496382663 -0.099625710022765032 -3.7693728768576573 1.3149885051441224 -0.1306928360949956 -4.1232358384520671 1.2581375373672679 -0.12435865482607635 -4.4347575758829132 1.0373325875161723 0.88259543802101159 -3.8821362471972005 1.4313859975330103 1.0174383927525501 -4.2102661452645629 1.3480667340146337 1.1461026088771102 -4.4986625055709952 1.1441283323599889 1.0146733755175905 -3.5456306096325338 2.2432371991625502 1.1921457377177742 -4.2752887354654581 2.2805261218631858 1.3777685792723751 -4.8552807324802556 1.9999751181598331 0.50200064203425177 -3.5547049498798806 2.1600356585784199 0.59873560301602424 -4.3353515540801251 2.2005090518265744 0.72921857720161809 -4.9468220083874392 1.8972820474325414 -0.010672091449086875 -3.5637792901272269 2.0768341179942893 0.0053254683142743573 -4.3954143726947912 2.120491981789963 0.08066857513086112 -5.0383632842946238 1.7945889767052496 0.013195324180251405 -3.133737688944481 2.8655979520590029 0.19177603773920404 -4.4780053140955278 3.1777897925181477 0.43422270847473765 -5.5155513698075342 2.7998638882620592 0.92253406158048179 -2.8900437099392731 2.9819954444478913 1.3034685972980884 -4.1290984323575417 3.2677189891655134 1.6937144055861746 -5.0811097849095965 2.9066596331058756 1.8318727989807124 -2.6463497309340642 3.0983929368367797 2.4151611568569731 -3.7801915506195565 3.357648185812879 2.9532061026976115 -4.6466682000116588 3.0134553779496924 2.2903657858545787 -2.8947764134081897 2.3096291027720652 2.7403682807646326 -3.5029998588440141 2.3003503750846943 3.1328966861154544 -3.9635477042201841 2.0081804663928828 1.8241148097481776 -3.092011818567435 2.1600356585784199 2.2122267822370159 -3.7762163714142725 2.2005090518265744 2.5667769436724486 -4.2912077364576291 1.8972820474325414 1.3578638336417757 -3.2892472237266803 2.0104422143847742 1.6840852837093998 -4.0494328839845304 2.1006677285684545 2.0006572012294432 -4.6188677686950754 1.7863836284721999 1.8206321286659417 -3.3505946277543663 1.1985910127552342 1.9497631334195771 -3.7582934699504116 1.168208340719902 2.1043729227654207 -4.0769461686176403 0.93053684267235548 2.5949031069090727 -2.7357951371843168 1.3149885051441224 2.8231542311455819 -3.0079818124561304 1.2581375373672679 3.0479123066984664 -3.223782002951979 1.0373325875161723 -0.11802447355715709 -4.7462793133137602 0.81652763766507663 -0.073740518829690835 -5 0.43005606989021922 -6.3817311170710487e-16 -5 1.508739382800288e-16 1.2747668250016702 -4.7870588658774267 0.94018993070534407 1.3950498392746826 -5.0048263056714015 0.5886127725731497 1.4625972592591143 -5 0.19467496971038228 1.5633914208269759 -5.4352727294950522 1.7194241144564801 1.7812344769064941 -5.9570848669522292 1.0386848179837014 1.9251006988178903 -5.938538843445472 0.19467496971038248 0.85970155138721194 -5.5582924626947534 1.5940550430385083 1.0615466284688071 -6.1103104279389484 0.88012811530077095 1.2095599964999946 -6.080868738500028 3.184784616492628e-16 0.15601168194744786 -5.6813121958944546 1.4686859716205367 0.34185878003111991 -6.2635359889256668 0.72157141261784052 0.49401929418209889 -6.2231986335545839 -0.19467496971038181 0.67666937921027126 -6.5530974255195407 2.4219379840059707 1.1046529533785518 -7.535335395281848 1.2248667171871683 1.3354710697580909 -7.4565320529130075 -0.19467496971038173 2.0839602138742608 -6.0331211374616514 2.5456002770462383 2.6127023020369222 -6.9274855542166147 1.383423419870099 2.8318573995016632 -6.8367085405835217 3.9502081453687136e-16 3.4912510485382504 -5.513144849403762 2.6692625700865058 4.1207516506952926 -6.3196357131513823 1.5419801225530296 4.3282437292452345 -6.216885028254036 0.19467496971038253 3.5254250914662761 -4.4240955495963536 1.7160105577010714 3.9253237595927719 -4.821979858540276 1.0386848179837014 4.0511415615041484 -4.7497903474104586 0.19467496971038251 2.9213271051078809 -4.8061991015009866 1.5940550430385083 3.3190557702285726 -5.2389544342650449 0.88012811530077106 3.4445354447215339 -5.1551115962757805 3.6400954689007538e-16 2.3172291187494864 -5.1883026534056214 1.4720995283759453 2.7127877808643714 -5.6559290099898156 0.72157141261784052 2.8379293279389186 -5.5604328451411034 -0.19467496971038178 2.2589827121112642 -4.3955988672848694 0.69286534462480909 2.4413871491947017 -4.6228552357341197 0.27149936720728862 2.5013214657657574 -4.5697463460997163 -0.19467496971038198 3.2726703822513508 -3.4395821934478281 0.81652763766507663 3.4833914850200487 -3.5876763268454264 0.43005606989021922 3.5355339059327369 -3.5355339059327382 1.508739382800288e-16 2.3891928076198581e-09 1.3933817269779367e-08 5 0.13273293600906813 0.77410093896211074 4.9999999947704303 0.23879699815184469 1.4565753698047477 4.5541657294473969 0.29388289915620563 1.912433577759828 3.9241838901962738 3.3011589752780724e-09 1.3777444966187113e-08 5 0.18339772398782489 0.76541358861512121 4.9999999947704303 0.33222779902080568 1.4412339084801553 4.5542552121822473 0.42276704450417468 1.8926282954478801 3.9240958338115344 4.1977016459768406e-09 1.353125792253827e-08 5 0.23320565100984905 0.75173653039988997 4.9999999947704303 0.42647213182498217 1.4180925512183753 4.5542332598784592 0.54503155377182155 1.8566963318437875 3.9237978632131187 5.0616379163795456e-09 1.3199974495595987e-08 5 0.28120211131750317 0.73333189525220233 4.9999999947704303 0.51928942098023356 1.3845320165618495 4.5540927235145698 0.65880253358904162 1.8114333977524359 3.9235932029191516 5.9255741867822489e-09 1.2868691068653705e-08 5 0.3291985716251572 0.71492726010451468 4.9999999947704303 0.61210671013548523 1.3509714819053238 4.5539521871506805 0.77257351340626168 1.766170463661084 3.923388542625184 6.7568613318353522e-09 1.2452327641689112e-08 5 0.37538119160431421 0.6917959582061155 4.9999999947704303 0.69804226227048816 1.3058671965647475 4.5499065825209621 0.87911768584279204 1.6966023680393254 3.9418063511561829 7.5395671186120131e-09 1.1958864127708307e-08 5 0.41886484718796763 0.66438131806501677 4.9999999947704303 0.77859391379943077 1.2559020052932022 4.5499960652558125 0.98901030045929839 1.6299226233399111 3.9417182947714435 8.3222729053886757e-09 1.1465400613727501e-08 5 0.46234850277162087 0.63696667792391826 4.9999999947704303 0.8591455653283735 1.2059368140216573 4.5500855479906637 1.0989029150758047 1.563242878640497 3.9416302383867041 9.0563586260029208e-09 1.0894861416446104e-08 5 0.50313104352162297 0.60527005530212286 4.9999999947704303 0.93823808004942733 1.1486396586136227 4.554131152620382 1.2091286301545352 1.501413052232305 3.9232124298557061 9.7277549847141746e-09 1.0258181341531531e-08 5 0.54043084188311064 0.56989893941392855 4.9999999947704303 1.0095983318105224 1.0804173341964749 4.5540927235145698 1.3018597269021537 1.4214334258861807 3.9235932029191516 1.0399151343425428e-08 9.6215012666169574e-09 5 0.57773064024459841 0.53452782352573425 4.9999999947704303 1.0809585835716178 1.0121950097793273 4.5540542944087576 1.3945908236497724 1.3414537995400562 3.9239739759825976 1.1007825137037625e-08 8.9187118004082114e-09 5 0.61154585159553565 0.4954839636122273 4.9999999947704303 1.1435917964881985 0.93801294878014219 4.5540762467125457 1.4829709385340504 1.2496274631237838 3.9242719465810136 1.1542110682141613e-08 8.1632824227845368e-09 5 0.6412283824017937 0.45351566412417016 4.9999999947704303 1.1988092980184004 0.86109934457807946 4.5541657294473969 1.5601013422709396 1.1444881605347099 3.9241838901962742 0.34896880016056658 2.3682917857149084 3.2942020509451515 0.35440257013029602 2.6092230410694177 2.4930626592556551 0.32366701737175757 2.7418514601399595 1.7515749127262323 0.51330628998754357 2.3440226824156052 3.2939364554408228 0.54956526024171726 2.5820644792650591 2.4926871801890318 0.56802875516418949 2.7110441325220447 1.7471630864971586 0.66359097571866066 2.2953001124691998 3.2933624665477796 0.71157850939995637 2.5154219920374854 2.492632159934836 0.72793154750988387 2.5994237369097037 1.7520298853594394 0.79831564619784956 2.2383347789430221 3.2930936823237329 0.84116092395251607 2.4485932979840519 2.4936206142624364 0.81950335011682607 2.5326228968077218 1.759394034055981 0.93304031667703835 2.181369445416844 3.2928248980996866 0.97074333850507555 2.381764603930618 2.4946090685900364 0.91107515272376827 2.4658220567057398 1.7667581827525229 1.060193109415096 2.0873375395139031 3.3337061197914024 1.1046416157343397 2.2705204390977194 2.5858527378715497 1.0419533435613202 2.3279343401651751 1.9154012332922596 1.1994266871191661 2.0039432413866201 3.3334405242870742 1.2679810426661531 2.1745365338988085 2.5854772588049264 1.2430682032092271 2.2128456728059218 1.9109894070631859 1.338660264823236 1.9205489432593372 3.333174928782745 1.4313204695979664 2.0785526286998977 2.5851017797383027 1.4441830628571337 2.0977570054466685 1.9065775808341121 1.480019180259643 1.8541864458509876 3.2922937070910288 1.5904809234459554 2.0196699005113188 2.4938581104567898 1.6173654040680547 2.0673183296891215 1.7579345302943747 1.594121121993785 1.7624495175758863 3.2930936823237333 1.7141674489267045 1.9403068819022367 2.4936206142624364 1.7263151950341622 2.0262281030727021 1.759394034055981 1.7082230637279268 1.670712589300785 3.2938936575564384 1.8378539744074536 1.8609438632931543 2.4933831180680825 1.8352649860002697 1.9851378764562828 1.7608535378175876 1.8223500805799022 1.5612419774674251 3.2944676464494811 1.9768029081841851 1.7516037101908282 2.4934381383222783 2.0166431317145008 1.9044885297656295 1.7559867389553065 1.9213933865234789 1.4278769764913404 3.2942020509451519 2.0955997665774442 1.5943988453592979 2.4930626592556555 2.1676489033011959 1.7099146176412086 1.7515749127262326 0.29293146461321912 2.8744798792105009 1.01008716619681 0.22746247248711829 2.9119387162937747 0.32804379274938766 0.15613639887297345 3.0055369055101107 -0.18152937719693474 0.58649225008666173 2.8400237857790294 1.0016389928052851 0.59069802723054432 2.8709117504924069 0.31180660564986429 0.61892871126326054 2.9686808037775378 -0.22366590436094649 0.74428458561981159 2.6834254817819216 1.0114276107840428 0.73299167128358211 2.6382788666223886 0.34130352212292991 0.74625089298334291 2.6247693021333358 -0.22969079296653738 0.79784577628113607 2.6166524956313917 1.0251674538495259 0.71683672383972541 2.5852492378606096 0.3646612188411652 0.63966248721335561 2.5942339645234815 -0.18912176411698359 0.85140696694246076 2.5498795094808622 1.0389072969150088 0.70068177639586893 2.5322196090988296 0.3880189155594006 0.53307408144336832 2.5636986269136268 -0.14855273526742982 0.97926507138830032 2.3853482412326308 1.24494972871297 0.81574706706305466 2.326224973972689 0.66871004740253392 0.61869615947435042 2.2506495863571852 0.12629319400467259 1.2181553637523008 2.2511548117130351 1.2365015553214453 1.1068560897159474 2.1635614418005265 0.65247286030301055 0.98912134811938679 2.0594778141106072 0.084156666840660893 1.457045656116301 2.1169613821934399 1.2280533819299206 1.3979651123688399 2.0008979096283639 0.63623567320348717 1.3595465367644231 1.8683060418640294 0.042020139676649214 1.6442498846901539 2.1149667588669243 1.0220109501319594 1.5977051794353152 2.0522143606805487 0.35554454136035357 1.6047668795502767 2.0319129502223907 -0.23282578959545339 1.7384629411416197 2.1121493242431675 1.0251674538495259 1.6516028291716984 2.1141373193754882 0.36466121884116526 1.5837414375536225 2.1519714262068583 -0.18912176411698356 1.832675997593086 2.1093318896194111 1.0283239575670922 1.7055004789080817 2.1760602780704281 0.37377789632197694 1.5627159955569681 2.2720299021913264 -0.14541773863851379 2.0564833552448172 2.0573733493404309 1.018535339588335 1.9920559912545996 2.1840681255866685 0.34428097984891126 1.934458250516786 2.3681352023948818 -0.13939285003292287 2.2396980400249471 1.8254303899231195 1.0100871661968103 2.2198918694520775 1.8982113559298786 0.32804379274938777 2.2356406334257577 2.014830420559504 -0.18152937719693463 0.084810325258828562 3.0991350947264462 -0.69110254714325714 0.0084807141874977503 3.256848601196868 -1.0312035941324107 -0.045572497917633639 3.5131107390272627 -1.1730960496382667 0.64715939529597677 3.0664498570626697 -0.75913841437175711 0.69648600705520014 3.2678169556429215 -1.1631975583091831 0.78954072253810581 3.5749766014200612 -1.2972917779210971 0.7595101146831037 2.6112597376442821 -0.80068510805600457 0.79076306366068139 2.6180712726214139 -1.389948823790909 0.90271821958913601 3.0818509411269739 -1.8165930114767299 0.56248825058698571 2.6032186911863531 -0.74290474707513243 0.47891632680356711 2.6200252854547017 -1.2932038013394729 0.49045848441890944 3.0873651176672912 -1.7266197299589465 0.36546638649086766 2.5951776447284249 -0.6851243860942603 0.16706958994645277 2.6219792982879895 -1.1964587788880365 0.078198749248682961 3.0928792942076084 -1.6366464484411631 0.42164525188564594 2.1750741987416813 -0.41612365939318879 0.1391903995999883 1.9324713816590218 -1.1171476502217947 0.076192861890119867 2.5331045353017512 -1.9913728011403988 0.87138660652282618 1.9553941864206879 -0.48415952662168876 0.6946078742274483 1.7159403169663547 -1.249141614398567 0.80857096790396499 2.3029920134528137 -2.1155685294232294 1.3211279611600062 1.7357141740996949 -0.55219539385018879 1.250025348854908 1.4994092522736873 -1.3811355785753394 1.5409490739178102 2.0728794916038757 -2.2397642577060597 1.6118285796652385 2.0116115397642331 -0.82119612055126034 1.6673190366197455 2.0391647466935052 -1.460446707241581 1.9788424112371623 2.4669705800508472 -1.8850379050068236 1.5158800459355466 2.1898055330382289 -0.74290474707513232 1.4451012612404315 2.2373143921367706 -1.2932038013394729 1.6346080354943047 2.6646631053521026 -1.7266197299589463 1.4199315122058545 2.3679995263122251 -0.66461337359900463 1.2228834858611182 2.4354640375800356 -1.1259608954373643 1.2903736597514468 2.8623556306533575 -1.5682015549110693 1.8768605097789723 2.5522022792030956 -0.62306667991475706 1.8146874958292591 2.7756803709646687 -0.89920962995563813 1.8176598122476004 3.0631374993595175 -1.0489003213554364 2.2513893973994379 2.1314494851891288 -0.69110254714325703 2.308936501715511 2.2969429606929421 -1.0312035941324105 2.4519198043122916 2.5163690489386292 -1.1730960496382665 -0.099625710022765032 3.7693728768576573 -1.3149885051441228 -0.1306928360949956 4.1232358384520671 -1.2581375373672683 -0.12435865482607635 4.4347575758829132 -1.0373325875161727 0.88259543802101159 3.8821362471972005 -1.4313859975330108 1.0174383927525501 4.2102661452645629 -1.3480667340146342 1.1461026088771102 4.4986625055709952 -1.1441283323599893 1.0146733755175905 3.5456306096325338 -2.2432371991625506 1.1921457377177742 4.2752887354654581 -2.2805261218631863 1.3777685792723751 4.8552807324802556 -1.9999751181598338 0.50200064203425177 3.5547049498798806 -2.1600356585784204 0.59873560301602424 4.3353515540801251 -2.2005090518265749 0.72921857720161809 4.9468220083874392 -1.897282047432542 -0.010672091449086875 3.5637792901272265 -2.0768341179942897 0.0053254683142743573 4.3954143726947912 -2.1204919817899635 0.08066857513086112 5.0383632842946238 -1.7945889767052503 0.013195324180251405 3.1337376889444806 -2.8655979520590034 0.19177603773920404 4.4780053140955278 -3.1777897925181482 0.43422270847473765 5.5155513698075342 -2.7998638882620601 0.92253406158048179 2.8900437099392726 -2.9819954444478918 1.3034685972980884 4.1290984323575417 -3.2677189891655138 1.6937144055861746 5.0811097849095965 -2.9066596331058761 1.8318727989807124 2.6463497309340638 -3.0983929368367802 2.4151611568569731 3.780191550619556 -3.3576481858128795 2.9532061026976115 4.6466682000116588 -3.0134553779496929 2.2903657858545787 2.8947764134081893 -2.3096291027720657 2.7403682807646326 3.5029998588440137 -2.3003503750846948 3.1328966861154544 3.9635477042201837 -2.0081804663928833 1.8241148097481776 3.0920118185674346 -2.1600356585784204 2.2122267822370159 3.776216371414272 -2.2005090518265749 2.5667769436724486 4.2912077364576291 -1.8972820474325418 1.3578638336417757 3.2892472237266803 -2.0104422143847747 1.6840852837093998 4.0494328839845304 -2.100667728568455 2.0006572012294432 4.6188677686950754 -1.7863836284722006 1.8206321286659417 3.3505946277543659 -1.1985910127552346 1.9497631334195771 3.7582934699504111 -1.1682083407199024 2.1043729227654207 4.0769461686176403 -0.93053684267235592 2.5949031069090727 2.7357951371843163 -1.3149885051441228 2.8231542311455819 3.0079818124561299 -1.2581375373672683 3.0479123066984664 3.223782002951979 -1.0373325875161727 -0.11802447355715709 4.7462793133137602 -0.81652763766507719 -0.073740518829690835 5 -0.43005606989021983 -6.3817311170710487e-16 5 -7.6317711519121745e-16 1.2747668250016702 4.7870588658774267 -0.94018993070534462 1.3950498392746826 5.0048263056714015 -0.58861277257315037 1.4625972592591143 5 -0.19467496971038289 1.5633914208269759 5.4352727294950522 -1.7194241144564808 1.7812344769064941 5.9570848669522292 -1.038684817983702 1.9251006988178903 5.938538843445472 -0.1946749697103832 0.85970155138721194 5.5582924626947534 -1.594055043038509 1.0615466284688071 6.1103104279389484 -0.88012811530077173 1.2095599964999946 6.080868738500028 -1.0631455110419625e-15 0.15601168194744786 5.6813121958944546 -1.4686859716205374 0.34185878003111991 6.2635359889256668 -0.7215714126178413 0.49401929418209889 6.2231986335545839 0.19467496971038106 0.67666937921027126 6.5530974255195407 -2.4219379840059716 1.1046529533785518 7.535335395281848 -1.2248667171871692 1.3354710697580909 7.4565320529130075 0.19467496971038081 2.0839602138742608 6.0331211374616514 -2.5456002770462391 2.6127023020369222 6.9274855542166147 -1.3834234198700999 2.8318573995016632 6.8367085405835217 -1.2322484863399007e-15 3.4912510485382504 5.513144849403762 -2.6692625700865067 4.1207516506952926 6.3196357131513814 -1.5419801225530303 4.3282437292452345 6.216885028254036 -0.19467496971038328 3.5254250914662761 4.4240955495963536 -1.7160105577010718 3.9253237595927719 4.8219798585402751 -1.038684817983702 4.0511415615041484 4.7497903474104586 -0.19467496971038309 2.9213271051078809 4.8061991015009866 -1.594055043038509 3.3190557702285726 5.2389544342650449 -0.88012811530077173 3.4445354447215339 5.1551115962757805 -9.953077884363493e-16 2.3172291187494864 5.1883026534056214 -1.4720995283759459 2.7127877808643714 5.6559290099898156 -0.72157141261784119 2.8379293279389186 5.5604328451411034 0.19467496971038109 2.2589827121112642 4.3955988672848694 -0.69286534462480964 2.4413871491947017 4.6228552357341197 -0.27149936720728918 2.5013214657657574 4.5697463460997163 0.19467496971038142 3.2726703822513508 3.4395821934478281 -0.81652763766507708 3.4833914850200487 3.5876763268454264 -0.43005606989021966 3.5355339059327369 3.5355339059327382 -5.8383766681599662e-16 1.1542110682141616e-08 -8.1632818104813599e-09 -5 0.64122838240179392 -0.45351566412416966 -4.9999999947704303 1.1988092980184006 -0.86109934457807913 -4.5541657294473969 1.56010134227094 -1.1444881605347095 -3.9241838901962742 1.2076396227245603e-08 -7.4078524328576845e-09 -5 0.67091091320805196 -0.41154736463611247 -4.9999999947704303 1.2540267995486025 -0.7841857403760164 -4.5542552121822473 1.6372317460078292 -1.0393488579456356 -3.9240958338115348 1.2536267101315435e-08 -6.5998205027791219e-09 -5 0.69645929555149666 -0.36665670107132131 -4.9999999947704303 1.3043041957171724 -0.70118152291611624 -4.5542332598784592 1.6982780744836257 -0.92748705921823482 -3.9237978632131192 1.2912909538944595e-08 -5.754672549778749e-09 -5 0.71738387578979568 -0.3197040361966339 -4.9999999947704303 1.3462050486543278 -0.61181890670720984 -4.5540927235145698 1.7467205781822253 -0.81503310025484621 -3.9235932029191516 1.3289551976573757e-08 -4.909524596778376e-09 -5 0.7383084560280947 -0.27275137132194655 -4.9999999947704303 1.3881059015914834 -0.52245629049830333 -4.5539521871506805 1.7951630818808246 -0.70257914129145727 -3.923388542625184 1.3582947351309277e-08 -4.0273024167533876e-09 -5 0.7546081993582866 -0.223739027131692 -4.9999999947704303 1.4169779672262595 -0.42979713281373816 -4.5499065825209621 1.8213091165382245 -0.57804896229729819 -3.9418063511561829 1.3787472523809035e-08 -3.1249144502456882e-09 -5 0.76597070914470833 -0.17360636145015057 -4.9999999947704303 1.438605860686758 -0.33750778821045452 -4.5499960652558125 1.8518652298911324 -0.45319344965490299 -3.9417182947714435 1.3991997696308796e-08 -2.222526483737988e-09 -5 0.77733321893113017 -0.12347369576860939 -4.9999999947704303 1.4602337541472568 -0.24521844360717113 -4.5500855479906637 1.8824213432440406 -0.32833793701250802 -3.9416302383867041 1.4107642551996935e-08 -1.3000173573890363e-09 -5 0.78375793325289089 -0.072223187853683715 -4.9999999947704303 1.4756454005158901 -0.14877638297509638 -4.554131152620382 1.9166424043045276 -0.20667629688638178 -3.9232124298557061 1.4132190671687166e-08 -3.750676408618992e-10 -5 0.78512171770851236 -0.020837091592707482 -4.9999999947704303 1.4778642502196659 -0.050076596823972919 -4.5540927235145698 1.9256590554955237 -0.084551373403164182 -3.9235932029191516 1.4156738791377395e-08 5.4988207566523799e-10 -5 0.78648550216413382 0.03054900466826883 -4.9999999947704303 1.4800830999234422 0.048623189327150554 -4.5540542944087576 1.9346757066865199 0.037573550080053732 -3.9239739759825976 1.4090188961068442e-08 1.4772266399616414e-09 -5 0.78278828930909949 0.082068148030311247 -4.9999999947704303 1.4719168311293394 0.14536619728288358 -4.5540762467125457 1.9322388600717755 0.16499875380823623 -3.9242719465810136 1.393381665747619e-08 2.389192807619856e-09 -5 0.77410093896210996 0.13273293600906802 -4.9999999947704303 1.456575369804747 0.23879699815184444 -4.5541657294473969 1.9124335777598276 0.2938828991562053 -3.9241838901962742 1.9213933865234791 -1.4278769764913397 -3.2942020509451519 2.0955997665774442 -1.5943988453592974 -2.4930626592556555 2.1676489033011959 -1.7099146176412083 -1.7515749127262328 2.0204366924670558 -1.294511975515255 -3.2939364554408233 2.214396624970703 -1.4371939805277669 -2.4926871801890322 2.3186546748878905 -1.5153407055167873 -1.7471630864971588 2.092251953250079 -1.1537925955203536 -3.2933624665477801 2.2818339374588041 -1.275509958772155 -2.4926321599348364 2.3527954850299837 -1.3233448180622711 -1.7520298853594396 2.1472361077101225 -1.0182472938024827 -3.2930936823237333 2.3262075187684217 -1.1366263319764898 -2.4936206142624369 2.370311200593759 -1.2113584484483566 -1.7593940340559813 2.2022202621701661 -0.8827019920846112 -3.292824898099687 2.3705811000780384 -0.99774270518082431 -2.4946090685900368 2.3878269161575338 -1.0993720788344421 -1.7667581827525232 2.2256402658501897 -0.72630079178085816 -3.3337061197914029 2.3865999765752708 -0.82440082204203879 -2.5858527378715501 2.3828704330000323 -0.90932588317562035 -1.9154012332922599 2.2651245990955071 -0.56887911109935163 -3.3334405242870746 2.4342275227429639 -0.64103153537251234 -2.5854772588049268 2.4437001369269971 -0.68573622499375375 -1.9109894070631861 2.3046089323408245 -0.41145743041784533 -3.3331749287827455 2.4818550689106575 -0.45766224870298594 -2.5851017797383031 2.5045298408539618 -0.46214656681188732 -1.9065775808341123 2.3576394080931653 -0.26457621079766747 -3.2922937070910292 2.5527621287263904 -0.30348243609343606 -2.4938581104567903 2.6054648546674666 -0.31816476492138257 -1.757934530294375 2.3734538607713813 -0.11902614998235529 -3.2930936823237333 2.5841035810013149 -0.1599047265506795 -2.4936206142624369 2.653448812787496 -0.21207045103942893 -1.7593940340559813 2.3892683134495973 0.026523910832956746 -3.2938936575564384 2.6154450332762389 -0.016327017007922828 -2.493383118068083 2.7014327709075254 -0.10597613715747546 -1.7608535378175878 2.3925608890142112 0.18463131033358912 -3.2944676464494811 2.6363816028737763 0.15923988001887474 -2.4934381383222783 2.7726587877578743 0.079305279579325053 -1.7559867389553068 2.3682917857149084 0.34896880016056614 -3.2942020509451519 2.6092230410694177 0.35440257013029591 -2.4930626592556555 2.7418514601399595 0.32366701737175718 -1.7515749127262328 2.2396980400249475 -1.825430389923119 -1.0100871661968105 2.2198918694520779 -1.8982113559298786 -0.328043792749388 2.2356406334257581 -2.014830420559504 0.18152937719693438 2.4229127248050775 -1.5934874305058078 -1.0016389928052856 2.4477277476495565 -1.612354586273089 -0.31180660564986462 2.5368230163347301 -1.6615256387241255 0.22366590436094613 2.4237570326011637 -1.371179677352387 -1.011427610784043 2.3838482585677316 -1.3472414959319685 -0.34130352212293025 2.3836712394838022 -1.3283131056937256 0.22969079296653705 2.4144148824190963 -1.2860905649202234 -1.0251674538495261 2.3349273755792095 -1.3211671587179727 -0.36466121884116554 2.2867101106782322 -1.3820907459197984 0.18912176411698328 2.4050727322370298 -1.2010014524880603 -1.038907296915009 2.2860064925906864 -1.2950928215039761 -0.38801891555940093 2.1897489818726621 -1.4358683861458708 0.14855273526742951 2.3791408894247934 -0.99425094430920202 -1.2449497287129703 2.2217097365149119 -1.0680691708082652 -0.66871004740253426 2.0289338344462506 -1.1539653347294772 -0.12629319400467287 2.4531727511110302 -0.73044091461499527 -1.2365015553214456 2.3125344138466684 -0.74720352017512437 -0.65247286030301077 2.1556851407324564 -0.75685631538926035 -0.084156666840661143 2.5272046127972665 -0.46663088492078902 -1.2280533819299209 2.4033590911784244 -0.42633786954198316 -0.6362356732034874 2.2824364470186622 -0.3597472960490436 -0.042020139676649443 2.6581675806085423 -0.33284709374932919 -1.0220109501319596 2.5808828576012122 -0.3213865241700502 -0.35554454136035385 2.5715209686365927 -0.3020378831294403 0.23282578959545314 2.7227940445736767 -0.26423617552817852 -1.0251674538495261 2.6627803952241527 -0.32706127455576245 -0.36466121884116554 2.6415478985308534 -0.4017992782502583 0.18912176411698331 2.7874205085388115 -0.19562525730702779 -1.0283239575670924 2.7446779328470927 -0.33273602494147508 -0.37377789632197722 2.7115748284251144 -0.50156067337107668 0.14541773863851351 2.9089359726419728 -0.00062932086022429582 -1.0185353395883352 2.9529656820951429 -0.13577308225630819 -0.34428097984891154 3.042393007242683 -0.30665591351731397 0.13939285003292259 2.8744798792105013 0.29293146461321845 -1.0100871661968105 2.9119387162937747 0.22746247248711782 -0.328043792749388 3.0055369055101107 0.1561363988729732 0.18152937719693438 2.2513893973994379 -2.1314494851891292 0.69110254714325681 2.3089365017155119 -2.2969429606929426 1.0312035941324103 2.4519198043122925 -2.5163690489386297 1.1730960496382663 2.6259182850199041 -1.7106966911751627 0.75913841437175678 2.8031855076017629 -1.8182055504212158 1.1631975583091827 3.0861797963769839 -1.9696005985177418 1.2972917779210966 2.3834942203998719 -1.3093847154554821 0.80068510805600424 2.4104098751266139 -1.292102025873979 1.3899488237909088 2.8175158736491519 -1.5408795245049021 1.8165930114767295 2.2384928457772548 -1.4430143331216239 0.7429047470751321 2.1912826285289948 -1.5139926639214847 1.2932038013394727 2.5299033309244323 -1.8362902904782574 1.7266197299589461 2.0934914711546386 -1.5766439507877661 0.68512438609425996 1.9721553819313755 -1.7358833019689903 1.1964587788880363 2.2422907881997132 -2.1317010564516128 1.6366464484411627 1.8361579323775894 -1.2398614986506893 0.41612365939318852 1.4648860938532484 -1.2680411429868144 1.1171476502217945 1.8450518836867806 -1.7372989050457532 1.9913728011403986 1.9988358676182449 -0.76650911060339644 0.48415952662168854 1.7045149723701045 -0.72219109610650212 1.2491416143985667 2.2002072842064093 -1.0567152552554815 2.1155685294232289 2.1615138028589005 -0.29315672255610403 0.55219539385018857 1.9441438508869604 -0.17634104922619001 1.3811355785753392 2.5553626847260378 -0.37613160546520985 2.2397642577060592 2.5621590796719733 -0.28268924208883028 0.82119612055126012 2.62087981753877 -0.2629346231482827 1.4604467072415808 3.1436645140270012 -0.34515873825632881 1.8850379050068233 2.6203154018375545 -0.47653728194475409 0.7429047470751321 2.6038610796505108 -0.56017927700182768 1.2932038013394727 3.0400437778521194 -0.72835892489203224 1.7266197299589461 2.6784717240031357 -0.67038532180067845 0.6646133735990043 2.5868423417622521 -0.85742393085537194 1.1259608954373641 2.9364230416772372 -1.1115591115277352 1.5682015549110688 3.1318203323902232 -0.47753874477831976 0.62306667991475673 3.2458802467508132 -0.67952457868020544 0.8992096299556378 3.4512448766344641 -0.88068571837337395 1.048900321355436 3.0991350947264467 0.084810325258828576 0.69110254714325681 3.2568486011968676 0.0084807141874973027 1.0312035941324103 3.5131107390272627 -0.045572497917634222 1.1730960496382663 2.5949031069090731 -2.7357951371843168 1.3149885051441224 2.8231542311455833 -3.0079818124561304 1.2581375373672679 3.0479123066984672 -3.223782002951979 1.0373325875161723 3.3691740851522045 -2.1209956466142676 1.4313859975330103 3.6965453288715886 -2.2576701549618488 1.3480667340146337 3.9914516906315138 -2.3706178372863178 1.1441283323599889 3.2246218721716899 -1.7896570231358251 2.2432371991625502 3.8660599916809626 -2.1801113210752083 2.2805261218631858 4.4074314358104285 -2.4589724251919249 1.9999751181598331 2.8685240333198703 -2.1585879170350304 2.1600356585784199 3.4889264877481416 -2.6421864776872468 2.2005090518265744 4.0135667883600847 -2.982295986547145 1.8972820474325414 2.5124261944680506 -2.5275188109342355 2.0768341179942893 3.1117929838153193 -3.1042616342992844 2.120491981789963 3.6197021409097418 -3.5056195479023655 1.7945889767052496 2.2252176735203131 -2.2065566671046919 2.8655979520590029 3.302034060540822 -3.0308217870318654 3.1777897925181477 4.2071255972813351 -3.5930419538659826 2.7998638882620592 2.6958995960427146 -1.3912394144044611 2.9819954444478913 3.8414049859199562 -1.9980220174935657 3.2677189891655134 4.7905241264462228 -2.3952502432795697 2.9066596331058756 3.1665815185651152 -0.57592216170422939 3.0983929368367797 4.3807759112990912 -0.96522224795526601 3.357648185812879 5.3739226556111097 -1.1974585326931566 3.0134553779496924 3.6664492105152324 -0.42738285336437504 2.3096291027720652 4.414727948961314 -0.53926196040692875 2.3003503750846943 5.0179439507195651 -0.58735896770136431 2.0081804663928828 3.4762264760537276 -0.8965385727822367 2.1600356585784199 4.2344687626969799 -1.105907644212401 2.2005090518265744 4.8493274725934343 -1.2193567072652958 1.8972820474325414 3.2860037415922227 -1.3656942922000994 2.0104422143847742 4.0542095764326467 -1.6725533280178724 2.1006677285684545 4.6807109944673044 -1.8513544468292278 1.7863836284721999 3.6566095065181146 -1.0818468580665421 1.1985910127552342 4.0362055316395704 -1.278824064942542 1.168208340719902 4.3708526461948312 -1.3948199185292638 0.93053684267235548 3.7693728768576578 -0.099625710022765435 1.3149885051441224 4.1232358384520671 -0.13069283609499682 1.2581375373672679 4.4347575758829132 -0.12435865482607725 1.0373325875161723 3.2726703822513521 -3.4395821934478286 0.81652763766507663 3.4833914850200491 -3.5876763268454268 0.43005606989021922 3.5355339059327373 -3.5355339059327386 1.508739382800288e-16 4.2863580523914377 -2.4835655196107864 0.94018993070534407 4.5253958208453966 -2.5524974179567339 0.5886127725731497 4.5697463460997163 -2.5013214657657592 0.19467496971038228 4.9488028799398931 -2.7378335293086411 1.7194241144564801 5.4718180830295386 -2.9527721280218295 1.0386848179837014 5.5604328451411025 -2.8379293279389195 0.19467496971038248 4.5382070889720287 -3.3224054954070432 1.5940550430385083 5.0712687582865161 -3.5700151192144962 0.88012811530077095 5.1551115962757796 -3.4445354447215344 3.184784616492628e-16 4.1276112980041635 -3.9069774615054449 1.4686859716205367 4.6707194335434927 -4.1872581104071624 0.72157141261784052 4.7497903474104568 -4.0511415615041493 -0.19467496971038181 5.1122171340218481 -4.1552621207001001 2.4219379840059707 6.1093943507105299 -4.5471791623270876 1.2248667171871683 6.2168850282540351 -4.328243729245238 -0.19467496971038173 5.7396432669724886 -2.7924784690655735 2.5456002770462383 6.7459315269504279 -3.0510124969664063 1.383423419870099 6.8367085405835217 -2.8318573995016654 3.9502081453687136e-16 6.3670693999231291 -1.4296948174310466 2.6692625700865058 7.3824687031903267 -1.554845831605725 1.5419801225530296 7.4565320529130066 -1.3354710697580936 0.19467496971038253 5.6211599524778162 -0.63545597499579975 1.7160105577010714 6.1852777054795007 -0.63403160795805613 1.0386848179837014 6.2231986335545857 -0.49401929418210011 0.19467496971038251 5.4641861824898887 -1.3328057703181915 1.5940550430385083 6.0514270490611093 -1.3575733645311836 0.88012811530077106 6.0808687385000297 -1.2095599964999959 3.6400954689007538e-16 5.3072124125019622 -2.0301555656405839 1.4720995283759453 5.9175763926427187 -2.0811151211043124 0.72157141261784052 5.9385388434454738 -1.9251006988178918 -0.19467496971038178 4.7054997607500919 -1.5108157721159854 0.69286534462480909 4.9951736943285994 -1.5425308769340653 0.27149936720728862 4.9999999999999991 -1.4625972592591159 -0.19467496971038198 4.7462793133137593 -0.11802447355715798 0.81652763766507663 5 -0.07374051882969121 0.43005606989021922 5 -1.0989473220313073e-15 1.508739382800288e-16 1.1542110682141616e-08 8.1632824227845368e-09 5 0.64122838240179392 0.45351566412417027 4.9999999947704303 1.1988092980184006 0.86109934457807968 4.5541657294473969 1.56010134227094 1.1444881605347099 3.9241838901962742 1.2076396227245603e-08 7.4078530451608614e-09 5 0.67091091320805196 0.41154736463611308 4.9999999947704303 1.2540267995486025 0.78418574037601696 4.5542552121822473 1.6372317460078292 1.039348857945636 3.9240958338115348 1.2536267101315435e-08 6.5998211150822989e-09 5 0.69645929555149666 0.36665670107132192 4.9999999947704303 1.3043041957171724 0.7011815229161168 4.5542332598784592 1.6982780744836257 0.92748705921823538 3.9237978632131192 1.2912909538944595e-08 5.7546731620819259e-09 5 0.71738387578979568 0.31970403619663451 4.9999999947704303 1.3462050486543278 0.6118189067072104 4.5540927235145698 1.7467205781822253 0.81503310025484665 3.9235932029191516 1.3289551976573757e-08 4.9095252090815529e-09 5 0.7383084560280947 0.27275137132194721 4.9999999947704303 1.3881059015914834 0.52245629049830389 4.5539521871506805 1.7951630818808246 0.70257914129145782 3.923388542625184 1.3582947351309277e-08 4.0273030290565645e-09 5 0.7546081993582866 0.22373902713169261 4.9999999947704303 1.4169779672262595 0.42979713281373871 4.5499065825209621 1.8213091165382245 0.57804896229729863 3.9418063511561829 1.3787472523809035e-08 3.1249150625488652e-09 5 0.76597070914470833 0.17360636145015118 4.9999999947704303 1.438605860686758 0.33750778821045507 4.5499960652558125 1.8518652298911324 0.45319344965490349 3.9417182947714435 1.3991997696308796e-08 2.222527096041165e-09 5 0.77733321893113017 0.12347369576861 4.9999999947704303 1.4602337541472568 0.24521844360717168 4.5500855479906637 1.8824213432440406 0.32833793701250852 3.9416302383867041 1.4107642551996935e-08 1.3000179696922132e-09 5 0.78375793325289089 0.072223187853684326 4.9999999947704303 1.4756454005158901 0.14877638297509696 4.554131152620382 1.9166424043045276 0.20667629688638225 3.9232124298557061 1.4132190671687166e-08 3.7506825316507611e-10 5 0.78512171770851236 0.020837091592708093 4.9999999947704303 1.4778642502196659 0.050076596823973474 4.5540927235145698 1.9256590554955237 0.084551373403164667 3.9235932029191516 1.4156738791377395e-08 -5.4988146336206108e-10 5 0.78648550216413382 -0.030549004668268216 4.9999999947704303 1.4800830999234422 -0.048623189327149999 4.5540542944087576 1.9346757066865199 -0.037573550080053246 3.9239739759825976 1.4090188961068442e-08 -1.4772260276584644e-09 5 0.78278828930909949 -0.082068148030310636 4.9999999947704303 1.4719168311293394 -0.14536619728288303 4.5540762467125457 1.9322388600717755 -0.16499875380823575 3.9242719465810136 1.393381665747619e-08 -2.3891921953166791e-09 5 0.77410093896210996 -0.13273293600906741 4.9999999947704303 1.456575369804747 -0.23879699815184388 4.5541657294473969 1.9124335777598276 -0.2938828991562048 3.9241838901962742 1.9213933865234791 1.4278769764913402 3.2942020509451519 2.0955997665774442 1.5943988453592977 2.4930626592556555 2.1676489033011959 1.7099146176412083 1.7515749127262326 2.0204366924670558 1.2945119755152552 3.2939364554408233 2.214396624970703 1.4371939805277671 2.4926871801890322 2.3186546748878905 1.5153407055167876 1.7471630864971586 2.092251953250079 1.1537925955203541 3.2933624665477801 2.2818339374588041 1.2755099587721552 2.4926321599348364 2.3527954850299837 1.3233448180622713 1.7520298853594394 2.1472361077101225 1.0182472938024829 3.2930936823237333 2.3262075187684217 1.13662633197649 2.4936206142624369 2.370311200593759 1.2113584484483568 1.759394034055981 2.2022202621701661 0.88270199208461153 3.292824898099687 2.3705811000780384 0.99774270518082464 2.4946090685900368 2.3878269161575338 1.0993720788344423 1.7667581827525229 2.2256402658501897 0.7263007917808586 3.3337061197914029 2.3865999765752708 0.82440082204203913 2.5858527378715501 2.3828704330000323 0.90932588317562058 1.9154012332922596 2.2651245990955071 0.56887911109935207 3.3334405242870746 2.4342275227429639 0.64103153537251267 2.5854772588049268 2.4437001369269971 0.68573622499375397 1.9109894070631861 2.3046089323408245 0.41145743041784572 3.3331749287827455 2.4818550689106575 0.45766224870298627 2.5851017797383031 2.5045298408539618 0.46214656681188754 1.9065775808341123 2.3576394080931653 0.26457621079766791 3.2922937070910292 2.5527621287263904 0.30348243609343634 2.4938581104567903 2.6054648546674666 0.31816476492138274 1.757934530294375 2.3734538607713813 0.11902614998235569 3.2930936823237333 2.5841035810013149 0.1599047265506798 2.4936206142624369 2.653448812787496 0.21207045103942915 1.7593940340559813 2.3892683134495973 -0.026523910832956344 3.2938936575564384 2.6154450332762389 0.016327017007923134 2.493383118068083 2.7014327709075254 0.10597613715747567 1.7608535378175878 2.3925608890142112 -0.18463131033358871 3.2944676464494811 2.6363816028737763 -0.15923988001887443 2.4934381383222783 2.7726587877578743 -0.079305279579324844 1.7559867389553068 2.3682917857149084 -0.34896880016056575 3.2942020509451519 2.6092230410694177 -0.35440257013029558 2.4930626592556555 2.7418514601399595 -0.32366701737175696 1.7515749127262328 2.2396980400249475 1.8254303899231192 1.0100871661968103 2.2198918694520779 1.8982113559298786 0.32804379274938777 2.2356406334257581 2.014830420559504 -0.18152937719693463 2.4229127248050775 1.5934874305058078 1.0016389928052853 2.4477277476495565 1.612354586273089 0.3118066056498644 2.5368230163347301 1.6615256387241255 -0.22366590436094633 2.4237570326011637 1.3711796773523872 1.0114276107840428 2.3838482585677316 1.3472414959319685 0.34130352212293008 2.3836712394838022 1.3283131056937256 -0.22969079296653722 2.4144148824190963 1.2860905649202237 1.0251674538495259 2.3349273755792095 1.3211671587179727 0.36466121884116537 2.2867101106782322 1.3820907459197984 -0.18912176411698345 2.4050727322370298 1.2010014524880606 1.0389072969150088 2.2860064925906864 1.2950928215039761 0.38801891555940077 2.1897489818726621 1.4358683861458708 -0.14855273526742968 2.3791408894247934 0.99425094430920213 1.24494972871297 2.2217097365149119 1.0680691708082655 0.66871004740253415 2.0289338344462506 1.1539653347294772 0.12629319400467273 2.4531727511110302 0.73044091461499538 1.2365015553214456 2.3125344138466684 0.74720352017512448 0.65247286030301066 2.1556851407324564 0.75685631538926035 0.084156666840661046 2.5272046127972665 0.46663088492078919 1.2280533819299209 2.4033590911784244 0.42633786954198327 0.6362356732034874 2.2824364470186622 0.3597472960490436 0.042020139676649401 2.6581675806085423 0.33284709374932936 1.0220109501319596 2.5808828576012122 0.3213865241700502 0.35554454136035379 2.5715209686365927 0.3020378831294403 -0.23282578959545316 2.7227940445736767 0.26423617552817863 1.0251674538495261 2.6627803952241527 0.3270612745557625 0.36466121884116548 2.6415478985308534 0.40179927825025824 -0.18912176411698337 2.7874205085388115 0.1956252573070279 1.0283239575670924 2.7446779328470927 0.33273602494147508 0.37377789632197717 2.7115748284251144 0.50156067337107668 -0.14541773863851357 2.9089359726419728 0.0006293208602244205 1.0185353395883352 2.9529656820951429 0.13577308225630824 0.34428097984891154 3.042393007242683 0.30665591351731397 -0.13939285003292262 2.8744798792105013 -0.29293146461321834 1.0100871661968105 2.9119387162937747 -0.22746247248711776 0.32804379274938805 3.0055369055101107 -0.1561363988729732 -0.18152937719693435 2.2513893973994379 2.1314494851891292 -0.69110254714325703 2.3089365017155119 2.2969429606929426 -1.0312035941324105 2.4519198043122925 2.5163690489386297 -1.1730960496382665 2.6259182850199041 1.7106966911751627 -0.759138414371757 2.8031855076017629 1.8182055504212158 -1.1631975583091829 3.0861797963769839 1.9696005985177416 -1.2972917779210968 2.3834942203998719 1.3093847154554821 -0.80068510805600435 2.4104098751266139 1.2921020258739788 -1.389948823790909 2.8175158736491519 1.5408795245049018 -1.8165930114767297 2.2384928457772548 1.4430143331216236 -0.74290474707513232 2.1912826285289948 1.5139926639214845 -1.2932038013394729 2.5299033309244323 1.8362902904782574 -1.7266197299589463 2.0934914711546386 1.5766439507877661 -0.68512438609426018 1.9721553819313755 1.7358833019689903 -1.1964587788880365 2.2422907881997132 2.1317010564516128 -1.6366464484411629 1.8361579323775894 1.2398614986506893 -0.41612365939318868 1.4648860938532484 1.2680411429868141 -1.1171476502217947 1.8450518836867806 1.737298905045753 -1.9913728011403988 1.9988358676182449 0.76650911060339633 -0.48415952662168865 1.7045149723701045 0.72219109610650201 -1.2491416143985667 2.2002072842064093 1.0567152552554813 -2.1155685294232289 2.1615138028589005 0.29315672255610398 -0.55219539385018857 1.9441438508869604 0.17634104922618984 -1.3811355785753392 2.5553626847260378 0.37613160546520957 -2.2397642577060592 2.5621590796719733 0.28268924208883023 -0.82119612055126012 2.62087981753877 0.26293462314828253 -1.4604467072415808 3.1436645140270012 0.34515873825632859 -1.8850379050068233 2.6203154018375545 0.47653728194475403 -0.74290474707513221 2.6038610796505108 0.56017927700182757 -1.2932038013394727 3.0400437778521194 0.72835892489203202 -1.7266197299589461 2.6784717240031357 0.67038532180067834 -0.66461337359900441 2.5868423417622521 0.85742393085537183 -1.1259608954373641 2.9364230416772372 1.1115591115277352 -1.5682015549110691 3.1318203323902232 0.47753874477831965 -0.62306667991475684 3.2458802467508132 0.67952457868020533 -0.89920962995563791 3.4512448766344641 0.88068571837337384 -1.048900321355436 3.0991350947264467 -0.084810325258828659 -0.69110254714325681 3.2568486011968676 -0.0084807141874974293 -1.0312035941324103 3.5131107390272627 0.045572497917634076 -1.1730960496382663 2.5949031069090731 2.7357951371843163 -1.3149885051441228 2.8231542311455833 3.0079818124561299 -1.2581375373672683 3.0479123066984672 3.223782002951979 -1.0373325875161727 3.3691740851522045 2.1209956466142672 -1.4313859975330105 3.6965453288715886 2.2576701549618483 -1.3480667340146339 3.9914516906315138 2.3706178372863178 -1.1441283323599891 3.2246218721716899 1.7896570231358249 -2.2432371991625502 3.8660599916809626 2.1801113210752079 -2.2805261218631863 4.4074314358104285 2.4589724251919245 -1.9999751181598333 2.8685240333198703 2.1585879170350299 -2.1600356585784204 3.4889264877481416 2.6421864776872463 -2.2005090518265749 4.0135667883600847 2.9822959865471446 -1.8972820474325418 2.5124261944680506 2.527518810934235 -2.0768341179942897 3.1117929838153193 3.1042616342992844 -2.1204919817899635 3.6197021409097418 3.5056195479023651 -1.7945889767052501 2.2252176735203131 2.2065566671046914 -2.8655979520590034 3.302034060540822 3.030821787031865 -3.1777897925181482 4.2071255972813351 3.5930419538659821 -2.7998638882620597 2.6958995960427146 1.3912394144044609 -2.9819954444478913 3.8414049859199562 1.9980220174935652 -3.2677189891655138 4.7905241264462228 2.3952502432795693 -2.9066596331058761 3.1665815185651152 0.57592216170422894 -3.0983929368367797 4.3807759112990912 0.96522224795526557 -3.357648185812879 5.3739226556111097 1.1974585326931562 -3.0134553779496924 3.6664492105152324 0.42738285336437476 -2.3096291027720652 4.414727948961314 0.53926196040692853 -2.3003503750846943 5.0179439507195651 0.58735896770136398 -2.0081804663928828 3.4762264760537276 0.89653857278223648 -2.1600356585784199 4.2344687626969799 1.1059076442124005 -2.2005090518265744 4.8493274725934343 1.2193567072652955 -1.8972820474325416 3.2860037415922227 1.3656942922000992 -2.0104422143847742 4.0542095764326467 1.6725533280178722 -2.1006677285684545 4.6807109944673044 1.8513544468292276 -1.7863836284722001 3.6566095065181146 1.0818468580665419 -1.1985910127552344 4.0362055316395704 1.278824064942542 -1.1682083407199022 4.3708526461948312 1.3948199185292636 -0.9305368426723557 3.7693728768576578 0.099625710022765268 -1.3149885051441224 4.1232358384520671 0.13069283609499666 -1.2581375373672679 4.4347575758829132 0.12435865482607711 -1.0373325875161723 3.2726703822513521 3.4395821934478286 -0.81652763766507708 3.4833914850200491 3.5876763268454268 -0.43005606989021966 3.5355339059327373 3.5355339059327386 -5.8383766681599662e-16 4.2863580523914377 2.4835655196107864 -0.9401899307053444 4.5253958208453966 2.5524974179567339 -0.58861277257315003 4.5697463460997163 2.5013214657657592 -0.19467496971038259 4.9488028799398931 2.7378335293086411 -1.7194241144564806 5.4718180830295386 2.9527721280218291 -1.0386848179837018 5.5604328451411025 2.8379293279389195 -0.19467496971038284 4.5382070889720287 3.3224054954070428 -1.5940550430385088 5.0712687582865161 3.5700151192144958 -0.8801281153007714 5.1551115962757796 3.4445354447215344 -7.4029846080650062e-16 4.1276112980041635 3.9069774615054449 -1.4686859716205372 4.6707194335434927 4.1872581104071624 -0.72157141261784108 4.7497903474104568 4.0511415615041493 0.19467496971038131 5.1122171340218481 4.1552621207001001 -2.4219379840059712 6.1093943507105299 4.5471791623270876 -1.224866717187169 6.2168850282540351 4.328243729245238 0.1946749697103812 5.7396432669724886 2.7924784690655731 -2.5456002770462387 6.7459315269504279 3.0510124969664063 -1.3834234198700994 6.8367085405835217 2.8318573995016654 -7.4181187099173668e-16 6.3670693999231291 1.4296948174310464 -2.6692625700865058 7.3824687031903267 1.5548458316057248 -1.5419801225530299 7.4565320529130066 1.3354710697580934 -0.1946749697103827 5.6211599524778162 0.63545597499579953 -1.7160105577010714 6.1852777054795007 0.63403160795805602 -1.0386848179837014 6.2231986335545857 0.49401929418210011 -0.19467496971038256 5.4641861824898887 1.3328057703181913 -1.5940550430385085 6.0514270490611093 1.3575733645311834 -0.88012811530077117 6.0808687385000297 1.2095599964999959 -5.1213303259440214e-16 5.3072124125019622 2.0301555656405834 -1.4720995283759455 5.9175763926427187 2.0811151211043124 -0.72157141261784075 5.9385388434454738 1.9251006988178918 0.19467496971038156 4.7054997607500919 1.5108157721159854 -0.69286534462480931 4.9951736943285994 1.5425308769340653 -0.27149936720728879 4.9999999999999991 1.4625972592591161 0.19467496971038181 4.7462793133137593 0.11802447355715787 -0.81652763766507663 5 0.073740518829691154 -0.43005606989021922 5 1.0989473220313073e-15 -1.5087393828002892e-16 1.393381665747619e-08 2.3891928076198573e-09 -5 0.77410093896211007 0.13273293600906808 -4.9999999947704303 1.456575369804747 0.23879699815184458 -4.5541657294473969 1.9124335777598276 0.29388289915620552 -3.9241838901962742 1.3777444353883936e-08 3.3011589752780715e-09 -5 0.76541358861512054 0.18339772398782483 -4.9999999947704303 1.4412339084801546 0.33222779902080557 -4.5542552121822473 1.8926282954478797 0.42276704450417457 -3.9240958338115348 1.3531257310235093e-08 4.1977016459768398e-09 -5 0.7517365303998893 0.233205651009849 -4.9999999947704303 1.4180925512183746 0.42647213182498206 -4.5542332598784592 1.856696331843787 0.54503155377182144 -3.9237978632131192 1.3199973883292812e-08 5.0616379163795448e-09 -5 0.73333189525220166 0.28120211131750317 -4.9999999947704303 1.3845320165618489 0.51928942098023356 -4.5540927235145698 1.8114333977524355 0.65880253358904151 -3.9235932029191516 1.2868690456350529e-08 5.9255741867822481e-09 -5 0.71492726010451413 0.3291985716251572 -4.9999999947704303 1.3509714819053233 0.61210671013548512 -4.5539521871506805 1.7661704636610835 0.77257351340626157 -3.923388542625184 1.2452327029385935e-08 6.7568613318353513e-09 -5 0.69179595820611495 0.37538119160431421 -4.9999999947704303 1.305867196564747 0.69804226227048805 -4.5499065825209621 1.696602368039325 0.87911768584279193 -3.9418063511561829 1.195886351540513e-08 7.5395671186120131e-09 -5 0.66438131806501621 0.41886484718796757 -4.9999999947704303 1.2559020052932017 0.77859391379943066 -4.5499960652558125 1.6299226233399107 0.98901030045929827 -3.9417182947714435 1.1465400001424324e-08 8.3222729053886757e-09 -5 0.6369666779239177 0.46234850277162082 -4.9999999947704303 1.2059368140216569 0.85914556532837338 -4.5500855479906637 1.5632428786404966 1.0989029150758047 -3.9416302383867041 1.0894860804142927e-08 9.0563586260029208e-09 -5 0.6052700553021223 0.50313104352162297 -4.9999999947704303 1.1486396586136223 0.93823808004942721 -4.554131152620382 1.5014130522323046 1.2091286301545352 -3.9232124298557061 1.0258180729228354e-08 9.7277549847141746e-09 -5 0.569898939413928 0.54043084188311064 -4.9999999947704303 1.0804173341964745 1.0095983318105224 -4.5540927235145698 1.4214334258861803 1.3018597269021537 -3.9235932029191516 9.6215006543137805e-09 1.0399151343425428e-08 -5 0.53452782352573369 0.57773064024459841 -4.9999999947704303 1.0121950097793269 1.0809585835716178 -4.5540542944087576 1.3414537995400557 1.3945908236497724 -3.9239739759825976 8.9187111881050345e-09 1.1007825137037625e-08 -5 0.49548396361222674 0.61154585159553565 -4.9999999947704303 0.93801294878014174 1.1435917964881985 -4.5540762467125457 1.2496274631237834 1.4829709385340504 -3.9242719465810136 8.1632818104813599e-09 1.1542110682141613e-08 -5 0.4535156641241696 0.6412283824017937 -4.9999999947704303 0.86109934457807902 1.1988092980184002 -4.5541657294473969 1.1444881605347095 1.5601013422709396 -3.9241838901962742 2.3682917857149079 0.34896880016056642 -3.2942020509451519 2.6092230410694173 0.35440257013029586 -2.4930626592556555 2.7418514601399591 0.3236670173717574 -1.7515749127262328 2.3440226824156047 0.51330628998754346 -3.2939364554408233 2.5820644792650587 0.54956526024171715 -2.4926871801890322 2.7110441325220442 0.56802875516418938 -1.7471630864971588 2.2953001124691994 0.66359097571866055 -3.2933624665477801 2.515421992037485 0.71157850939995626 -2.4926321599348364 2.5994237369097033 0.72793154750988376 -1.7520298853594396 2.2383347789430217 0.79831564619784934 -3.2930936823237333 2.4485932979840515 0.84116092395251596 -2.4936206142624369 2.5326228968077213 0.81950335011682596 -1.7593940340559813 2.1813694454168435 0.93304031667703813 -3.292824898099687 2.3817646039306175 0.97074333850507544 -2.4946090685900368 2.4658220567057394 0.91107515272376816 -1.7667581827525232 2.0873375395139027 1.0601931094150958 -3.3337061197914029 2.2705204390977189 1.1046416157343395 -2.5858527378715501 2.3279343401651746 1.04195334356132 -1.9154012332922599 2.0039432413866196 1.1994266871191659 -3.3334405242870746 2.1745365338988085 1.2679810426661529 -2.5854772588049268 2.2128456728059218 1.2430682032092268 -1.9109894070631861 1.9205489432593368 1.3386602648232357 -3.3331749287827455 2.0785526286998977 1.4313204695979662 -2.5851017797383031 2.0977570054466685 1.4441830628571335 -1.9065775808341123 1.8541864458509871 1.4800191802596427 -3.2922937070910292 2.0196699005113188 1.5904809234459552 -2.4938581104567903 2.0673183296891215 1.6173654040680545 -1.757934530294375 1.7624495175758859 1.594121121993785 -3.2930936823237333 1.9403068819022364 1.7141674489267043 -2.4936206142624369 2.0262281030727021 1.726315195034162 -1.7593940340559813 1.6707125893007846 1.7082230637279268 -3.2938936575564384 1.8609438632931543 1.8378539744074534 -2.493383118068083 1.9851378764562828 1.8352649860002694 -1.7608535378175878 1.5612419774674249 1.8223500805799022 -3.2944676464494811 1.7516037101908282 1.9768029081841851 -2.4934381383222783 1.9044885297656295 2.0166431317145008 -1.7559867389553068 1.4278769764913402 1.9213933865234789 -3.2942020509451519 1.5943988453592977 2.0955997665774437 -2.4930626592556555 1.7099146176412086 2.1676489033011954 -1.7515749127262328 2.8744798792105009 0.29293146461321889 -1.0100871661968105 2.9119387162937747 0.22746247248711812 -0.328043792749388 3.0055369055101107 0.15613639887297326 0.18152937719693438 2.8400237857790294 0.5864922500866615 -1.0016389928052856 2.8709117504924069 0.5906980272305441 -0.31180660564986462 2.9686808037775378 0.61892871126326032 0.22366590436094613 2.6834254817819216 0.74428458561981148 -1.011427610784043 2.6382788666223886 0.732991671283582 -0.34130352212293025 2.6247693021333358 0.7462508929833428 0.22969079296653705 2.6166524956313912 0.79784577628113595 -1.0251674538495261 2.5852492378606096 0.7168367238397253 -0.36466121884116554 2.5942339645234815 0.6396624872133555 0.18912176411698328 2.5498795094808617 0.85140696694246065 -1.038907296915009 2.5322196090988296 0.70068177639586882 -0.38801891555940093 2.5636986269136268 0.53307408144336821 0.14855273526742951 2.3853482412326303 0.97926507138830021 -1.2449497287129703 2.326224973972689 0.81574706706305455 -0.66871004740253426 2.2506495863571852 0.61869615947435019 -0.12629319400467287 2.2511548117130351 1.2181553637523006 -1.2365015553214456 2.1635614418005265 1.1068560897159472 -0.65247286030301077 2.0594778141106072 0.98912134811938668 -0.084156666840661143 2.1169613821934399 1.4570456561163008 -1.2280533819299209 2.0008979096283639 1.3979651123688397 -0.6362356732034874 1.8683060418640294 1.3595465367644228 -0.042020139676649443 2.1149667588669243 1.6442498846901537 -1.0220109501319596 2.0522143606805487 1.597705179435315 -0.35554454136035385 2.0319129502223912 1.6047668795502765 0.23282578959545314 2.1121493242431675 1.7384629411416195 -1.0251674538495261 2.1141373193754882 1.6516028291716982 -0.36466121884116554 2.1519714262068588 1.5837414375536223 0.18912176411698331 2.1093318896194111 1.8326759975930857 -1.0283239575670924 2.1760602780704281 1.7055004789080814 -0.37377789632197722 2.2720299021913268 1.5627159955569678 0.14541773863851351 2.0573733493404309 2.0564833552448172 -1.0185353395883352 2.1840681255866685 1.9920559912545994 -0.34428097984891154 2.3681352023948823 1.9344582505167858 0.13939285003292259 1.8254303899231195 2.2396980400249471 -1.0100871661968105 1.8982113559298788 2.2198918694520775 -0.328043792749388 2.014830420559504 2.2356406334257577 0.18152937719693438 3.0991350947264462 0.084810325258828367 0.69110254714325681 3.256848601196868 0.0084807141874975508 1.0312035941324103 3.5131107390272627 -0.045572497917633854 1.1730960496382663 3.0664498570626697 0.64715939529597655 0.75913841437175678 3.2678169556429215 0.69648600705520003 1.1631975583091827 3.5749766014200612 0.78954072253810559 1.2972917779210966 2.6112597376442821 0.75951011468310359 0.80068510805600424 2.6180712726214139 0.79076306366068128 1.3899488237909088 3.0818509411269739 0.90271821958913578 1.8165930114767295 2.6032186911863531 0.56248825058698559 0.7429047470751321 2.6200252854547017 0.47891632680356694 1.2932038013394727 3.0873651176672912 0.49045848441890927 1.7266197299589461 2.5951776447284249 0.36546638649086749 0.68512438609425996 2.6219792982879895 0.16706958994645263 1.1964587788880363 3.0928792942076084 0.078198749248682767 1.6366464484411627 2.1750741987416813 0.42164525188564583 0.41612365939318852 1.932471381659022 0.13919039959998819 1.1171476502217945 2.5331045353017516 0.076192861890119701 1.9913728011403986 1.9553941864206881 0.87138660652282607 0.48415952662168854 1.715940316966355 0.69460787422744819 1.2491416143985667 2.3029920134528137 0.80857096790396488 2.1155685294232289 1.7357141740996951 1.3211279611600062 0.55219539385018857 1.4994092522736875 1.250025348854908 1.3811355785753392 2.0728794916038762 1.54094907391781 2.2397642577060592 2.0116115397642336 1.6118285796652383 0.82119612055126012 2.0391647466935057 1.6673190366197452 1.4604467072415808 2.4669705800508477 1.9788424112371621 1.8850379050068233 2.1898055330382293 1.5158800459355464 0.7429047470751321 2.2373143921367711 1.4451012612404313 1.2932038013394727 2.664663105352103 1.6346080354943044 1.7266197299589461 2.3679995263122255 1.4199315122058542 0.6646133735990043 2.435464037580036 1.2228834858611179 1.1259608954373641 2.862355630653358 1.2903736597514468 1.5682015549110688 2.5522022792030961 1.8768605097789721 0.62306667991475673 2.7756803709646691 1.8146874958292591 0.8992096299556378 3.063137499359518 1.8176598122476002 1.048900321355436 2.1314494851891292 2.2513893973994379 0.69110254714325681 2.2969429606929426 2.308936501715511 1.0312035941324103 2.5163690489386297 2.4519198043122916 1.1730960496382663 3.7693728768576573 -0.099625710022765268 1.3149885051441224 4.1232358384520671 -0.13069283609499585 1.2581375373672679 4.4347575758829132 -0.12435865482607662 1.0373325875161723 3.8821362471972005 0.88259543802101137 1.4313859975330103 4.2102661452645629 1.0174383927525499 1.3480667340146337 4.4986625055709952 1.1461026088771098 1.1441283323599889 3.5456306096325338 1.0146733755175903 2.2432371991625502 4.2752887354654581 1.1921457377177738 2.2805261218631858 4.8552807324802556 1.3777685792723748 1.9999751181598331 3.5547049498798806 0.50200064203425154 2.1600356585784199 4.3353515540801251 0.59873560301602402 2.2005090518265744 4.9468220083874392 0.72921857720161776 1.8972820474325414 3.5637792901272269 -0.010672091449087092 2.0768341179942893 4.3954143726947912 0.0053254683142740884 2.120491981789963 5.0383632842946238 0.080668575130860801 1.7945889767052496 3.133737688944481 0.013195324180251213 2.8655979520590029 4.4780053140955278 0.19177603773920376 3.1777897925181477 5.5155513698075342 0.43422270847473732 2.7998638882620592 2.8900437099392731 0.92253406158048157 2.9819954444478913 4.1290984323575417 1.3034685972980882 3.2677189891655134 5.0811097849095965 1.6937144055861744 2.9066596331058756 2.6463497309340642 1.8318727989807122 3.0983929368367797 3.7801915506195565 2.4151611568569726 3.357648185812879 4.6466682000116597 2.9532061026976111 3.0134553779496924 2.8947764134081897 2.2903657858545787 2.3096291027720652 3.5029998588440141 2.7403682807646326 2.3003503750846943 3.9635477042201841 3.1328966861154539 2.0081804663928828 3.092011818567435 1.8241148097481774 2.1600356585784199 3.7762163714142725 2.2122267822370154 2.2005090518265744 4.29120773645763 2.5667769436724481 1.8972820474325414 3.2892472237266808 1.3578638336417754 2.0104422143847742 4.0494328839845304 1.6840852837093996 2.1006677285684545 4.6188677686950754 2.0006572012294428 1.7863836284721999 3.3505946277543663 1.8206321286659415 1.1985910127552342 3.7582934699504116 1.9497631334195769 1.168208340719902 4.0769461686176403 2.1043729227654202 0.93053684267235548 2.7357951371843168 2.5949031069090727 1.3149885051441224 3.0079818124561304 2.8231542311455819 1.2581375373672679 3.223782002951979 3.0479123066984664 1.0373325875161723 4.7462793133137602 -0.11802447355715738 0.81652763766507663 5 -0.07374051882969114 0.43005606989021922 5 -9.4432470016269928e-16 1.508739382800288e-16 4.7870588658774267 1.2747668250016699 0.94018993070534407 5.0048263056714015 1.3950498392746824 0.5886127725731497 5 1.4625972592591141 0.19467496971038228 5.4352727294950522 1.5633914208269757 1.7194241144564801 5.9570848669522292 1.7812344769064936 1.0386848179837014 5.938538843445472 1.9251006988178898 0.19467496971038248 5.5582924626947534 0.8597015513872116 1.5940550430385083 6.1103104279389484 1.0615466284688067 0.88012811530077095 6.080868738500028 1.2095599964999941 3.184784616492628e-16 5.6813121958944546 0.15601168194744749 1.4686859716205367 6.2635359889256668 0.34185878003111952 0.72157141261784052 6.2231986335545839 0.4940192941820985 -0.19467496971038181 6.5530974255195407 0.67666937921027082 2.4219379840059707 7.535335395281848 1.1046529533785514 1.2248667171871683 7.4565320529130075 1.3354710697580905 -0.19467496971038173 6.0331211374616514 2.0839602138742608 2.5456002770462383 6.9274855542166156 2.6127023020369218 1.383423419870099 6.8367085405835226 2.8318573995016627 3.9502081453687136e-16 5.5131448494037629 3.4912510485382504 2.6692625700865058 6.3196357131513823 4.1207516506952926 1.5419801225530296 6.216885028254036 4.3282437292452345 0.19467496971038253 4.4240955495963545 3.5254250914662757 1.7160105577010714 4.821979858540276 3.9253237595927715 1.0386848179837014 4.7497903474104586 4.0511415615041484 0.19467496971038251 4.8061991015009875 2.9213271051078804 1.5940550430385083 5.2389544342650458 3.3190557702285721 0.88012811530077106 5.1551115962757814 3.4445354447215335 3.6400954689007538e-16 5.1883026534056214 2.317229118749486 1.4720995283759453 5.6559290099898165 2.7127877808643714 0.72157141261784052 5.5604328451411043 2.8379293279389186 -0.19467496971038178 4.3955988672848694 2.2589827121112638 0.69286534462480909 4.6228552357341206 2.4413871491947012 0.27149936720728862 4.5697463460997172 2.501321465765757 -0.19467496971038198 3.4395821934478281 3.2726703822513508 0.81652763766507663 3.5876763268454264 3.4833914850200487 0.43005606989021922 3.5355339059327382 3.5355339059327369 1.508739382800288e-16 1.393381665747619e-08 -2.3891921953166804e-09 5 0.77410093896211007 -0.13273293600906746 4.9999999947704303 1.456575369804747 -0.23879699815184402 4.5541657294473969 1.9124335777598276 -0.29388289915620502 3.9241838901962742 1.3777444353883936e-08 -3.3011583629748946e-09 5 0.76541358861512054 -0.18339772398782422 4.9999999947704303 1.4412339084801546 -0.33222779902080501 4.5542552121822473 1.8926282954478797 -0.42276704450417407 3.9240958338115348 1.3531257310235093e-08 -4.1977010336736629e-09 5 0.7517365303998893 -0.23320565100984839 4.9999999947704303 1.4180925512183746 -0.4264721318249815 4.5542332598784592 1.856696331843787 -0.545031553771821 3.9237978632131192 1.3199973883292812e-08 -5.0616373040763678e-09 5 0.73333189525220166 -0.28120211131750256 4.9999999947704303 1.3845320165618489 -0.51928942098023301 4.5540927235145698 1.8114333977524355 -0.65880253358904106 3.9235932029191516 1.2868690456350529e-08 -5.9255735744790712e-09 5 0.71492726010451413 -0.32919857162515659 4.9999999947704303 1.3509714819053233 -0.61210671013548457 4.5539521871506805 1.7661704636610835 -0.77257351340626113 3.923388542625184 1.2452327029385935e-08 -6.7568607195321744e-09 5 0.69179595820611495 -0.3753811916043136 4.9999999947704303 1.305867196564747 -0.69804226227048749 4.5499065825209621 1.696602368039325 -0.87911768584279149 3.9418063511561829 1.195886351540513e-08 -7.5395665063088362e-09 5 0.66438131806501621 -0.41886484718796696 4.9999999947704303 1.2559020052932017 -0.7785939137994301 4.5499960652558125 1.6299226233399107 -0.98901030045929783 3.9417182947714435 1.1465400001424324e-08 -8.3222722930854988e-09 5 0.6369666779239177 -0.46234850277162021 4.9999999947704303 1.2059368140216569 -0.85914556532837283 4.5500855479906637 1.5632428786404966 -1.0989029150758043 3.9416302383867041 1.0894860804142927e-08 -9.0563580136997439e-09 5 0.6052700553021223 -0.5031310435216223 4.9999999947704303 1.1486396586136223 -0.93823808004942666 4.554131152620382 1.5014130522323046 -1.2091286301545348 3.9232124298557061 1.0258180729228354e-08 -9.7277543724109977e-09 5 0.569898939413928 -0.54043084188311008 4.9999999947704303 1.0804173341964745 -1.0095983318105219 4.5540927235145698 1.4214334258861803 -1.3018597269021532 3.9235932029191516 9.6215006543137805e-09 -1.0399150731122251e-08 5 0.53452782352573369 -0.57773064024459786 4.9999999947704303 1.0121950097793269 -1.0809585835716173 4.5540542944087576 1.3414537995400557 -1.3945908236497719 3.9239739759825976 8.9187111881050345e-09 -1.1007824524734448e-08 5 0.49548396361222674 -0.61154585159553509 4.9999999947704303 0.93801294878014174 -1.1435917964881981 4.5540762467125457 1.2496274631237834 -1.4829709385340499 3.9242719465810136 8.1632818104813599e-09 -1.1542110069838436e-08 5 0.4535156641241696 -0.64122838240179314 4.9999999947704303 0.86109934457807902 -1.1988092980183997 4.5541657294473969 1.1444881605347095 -1.5601013422709391 3.9241838901962742 2.3682917857149079 -0.34896880016056603 3.2942020509451519 2.6092230410694173 -0.35440257013029558 2.4930626592556555 2.7418514601399591 -0.32366701737175718 1.7515749127262328 2.3440226824156047 -0.51330628998754302 3.2939364554408233 2.5820644792650587 -0.54956526024171681 2.4926871801890322 2.7110441325220442 -0.56802875516418916 1.7471630864971588 2.2953001124691994 -0.66359097571866021 3.2933624665477801 2.515421992037485 -0.71157850939995593 2.4926321599348364 2.5994237369097033 -0.72793154750988354 1.7520298853594396 2.2383347789430217 -0.798315646197849 3.2930936823237333 2.4485932979840515 -0.84116092395251563 2.4936206142624369 2.5326228968077213 -0.81950335011682574 1.7593940340559813 2.1813694454168435 -0.9330403166770378 3.292824898099687 2.3817646039306175 -0.9707433385050751 2.4946090685900368 2.4658220567057394 -0.91107515272376793 1.7667581827525234 2.0873375395139027 -1.0601931094150954 3.3337061197914029 2.2705204390977189 -1.1046416157343393 2.5858527378715501 2.3279343401651746 -1.0419533435613197 1.9154012332922601 2.0039432413866196 -1.1994266871191657 3.3334405242870746 2.1745365338988085 -1.2679810426661526 2.5854772588049268 2.2128456728059218 -1.2430682032092266 1.9109894070631863 1.9205489432593368 -1.3386602648232355 3.3331749287827455 2.0785526286998977 -1.431320469597966 2.5851017797383031 2.0977570054466685 -1.4441830628571333 1.9065775808341126 1.8541864458509871 -1.4800191802596425 3.2922937070910292 2.0196699005113188 -1.5904809234459549 2.4938581104567903 2.0673183296891215 -1.6173654040680543 1.7579345302943752 1.7624495175758859 -1.5941211219937845 3.2930936823237333 1.9403068819022364 -1.714167448926704 2.4936206142624369 2.0262281030727021 -1.7263151950341618 1.7593940340559815 1.6707125893007846 -1.7082230637279263 3.2938936575564384 1.8609438632931543 -1.8378539744074531 2.4933831180680834 1.9851378764562828 -1.8352649860002692 1.760853537817588 1.5612419774674249 -1.8223500805799018 3.2944676464494815 1.7516037101908282 -1.9768029081841847 2.4934381383222788 1.9044885297656295 -2.0166431317145008 1.755986738955307 1.4278769764913402 -1.9213933865234785 3.2942020509451524 1.5943988453592977 -2.0955997665774437 2.493062659255656 1.7099146176412086 -2.1676489033011954 1.751574912726233 2.8744798792105009 -0.29293146461321878 1.0100871661968105 2.9119387162937747 -0.22746247248711807 0.32804379274938805 3.0055369055101107 -0.15613639887297329 -0.18152937719693435 2.8400237857790294 -0.58649225008666139 1.0016389928052856 2.8709117504924069 -0.5906980272305441 0.31180660564986468 2.9686808037775378 -0.61892871126326032 -0.22366590436094605 2.6834254817819216 -0.74428458561981126 1.011427610784043 2.6382788666223886 -0.73299167128358189 0.34130352212293036 2.6247693021333358 -0.7462508929833428 -0.22969079296653697 2.6166524956313912 -0.79784577628113584 1.0251674538495261 2.5852492378606096 -0.71683672383972519 0.36466121884116565 2.5942339645234815 -0.6396624872133555 -0.1891217641169832 2.5498795094808617 -0.85140696694246054 1.038907296915009 2.5322196090988296 -0.70068177639586871 0.38801891555940105 2.5636986269136268 -0.53307408144336821 -0.14855273526742946 2.3853482412326303 -0.9792650713883001 1.2449497287129705 2.326224973972689 -0.81574706706305444 0.66871004740253437 2.2506495863571852 -0.61869615947435019 0.12629319400467295 2.2511548117130351 -1.2181553637523004 1.2365015553214458 2.1635614418005265 -1.1068560897159472 0.65247286030301088 2.0594778141106072 -0.98912134811938657 0.084156666840661268 2.1169613821934399 -1.4570456561163008 1.2280533819299211 2.0008979096283639 -1.3979651123688397 0.63623567320348762 1.8683060418640294 -1.3595465367644228 0.042020139676649609 2.1149667588669243 -1.6442498846901537 1.0220109501319599 2.0522143606805487 -1.597705179435315 0.35554454136035407 2.0319129502223912 -1.6047668795502765 -0.23282578959545294 2.1121493242431675 -1.7384629411416195 1.0251674538495263 2.1141373193754882 -1.6516028291716982 0.36466121884116576 2.1519714262068588 -1.5837414375536223 -0.18912176411698312 2.1093318896194111 -1.8326759975930857 1.0283239575670926 2.1760602780704281 -1.7055004789080814 0.37377789632197744 2.2720299021913268 -1.5627159955569678 -0.14541773863851332 2.0573733493404309 -2.0564833552448172 1.0185353395883354 2.1840681255866685 -1.9920559912545994 0.34428097984891176 2.3681352023948823 -1.9344582505167858 -0.13939285003292234 1.8254303899231195 -2.2396980400249471 1.0100871661968107 1.8982113559298788 -2.2198918694520775 0.32804379274938827 2.014830420559504 -2.2356406334257577 -0.1815293771969341 3.0991350947264462 -0.084810325258828451 -0.69110254714325681 3.256848601196868 -0.0084807141874976774 -1.0312035941324103 3.5131107390272627 0.045572497917633709 -1.1730960496382663 3.0664498570626697 -0.64715939529597666 -0.75913841437175666 3.2678169556429215 -0.69648600705520014 -1.1631975583091827 3.5749766014200612 -0.78954072253810581 -1.2972917779210966 2.6112597376442821 -0.7595101146831037 -0.80068510805600412 2.6180712726214139 -0.79076306366068139 -1.3899488237909088 3.0818509411269739 -0.90271821958913601 -1.8165930114767295 2.6032186911863531 -0.56248825058698571 -0.74290474707513199 2.6200252854547017 -0.47891632680356711 -1.2932038013394727 3.0873651176672912 -0.49045848441890949 -1.7266197299589461 2.5951776447284249 -0.3654663864908676 -0.68512438609425996 2.6219792982879895 -0.16706958994645277 -1.1964587788880363 3.0928792942076084 -0.078198749248682975 -1.6366464484411627 2.1750741987416813 -0.42164525188564589 -0.41612365939318846 1.932471381659022 -0.13919039959998833 -1.1171476502217945 2.5331045353017516 -0.076192861890119951 -1.9913728011403986 1.9553941864206881 -0.87138660652282607 -0.48415952662168843 1.715940316966355 -0.69460787422744841 -1.2491416143985667 2.3029920134528137 -0.80857096790396521 -2.1155685294232289 1.7357141740996951 -1.3211279611600062 -0.55219539385018845 1.4994092522736875 -1.2500253488549082 -1.381135578575339 2.0728794916038762 -1.5409490739178104 -2.2397642577060592 2.0116115397642336 -1.6118285796652385 -0.8211961205512599 2.0391647466935057 -1.6673190366197455 -1.4604467072415805 2.4669705800508477 -1.9788424112371623 -1.8850379050068231 2.1898055330382293 -1.5158800459355466 -0.74290474707513188 2.2373143921367711 -1.4451012612404315 -1.2932038013394724 2.664663105352103 -1.6346080354943047 -1.7266197299589459 2.3679995263122255 -1.4199315122058542 -0.66461337359900408 2.435464037580036 -1.2228834858611182 -1.1259608954373639 2.862355630653358 -1.2903736597514468 -1.5682015549110686 2.5522022792030961 -1.8768605097789721 -0.6230666799147565 2.7756803709646691 -1.8146874958292591 -0.89920962995563758 3.063137499359518 -1.8176598122476004 -1.0489003213554358 2.1314494851891292 -2.2513893973994379 -0.69110254714325658 2.2969429606929426 -2.308936501715511 -1.03120359413241 2.5163690489386297 -2.4519198043122916 -1.1730960496382661 3.7693728768576573 0.099625710022765102 -1.3149885051441224 4.1232358384520671 0.13069283609499571 -1.2581375373672679 4.4347575758829132 0.1243586548260765 -1.0373325875161723 3.8821362471972005 -0.88259543802101148 -1.4313859975330103 4.2102661452645629 -1.0174383927525499 -1.3480667340146335 4.4986625055709952 -1.14610260887711 -1.1441283323599887 3.5456306096325338 -1.0146733755175905 -2.2432371991625502 4.2752887354654581 -1.1921457377177742 -2.2805261218631858 4.8552807324802556 -1.3777685792723751 -1.9999751181598329 3.5547049498798806 -0.50200064203425188 -2.1600356585784199 4.3353515540801251 -0.59873560301602424 -2.2005090518265744 4.9468220083874392 -0.72921857720161798 -1.8972820474325414 3.5637792901272269 0.010672091449086839 -2.0768341179942893 4.3954143726947912 -0.0053254683142743486 -2.120491981789963 5.0383632842946238 -0.080668575130861023 -1.7945889767052496 3.133737688944481 -0.013195324180251563 -2.8655979520590029 4.4780053140955278 -0.19177603773920415 -3.1777897925181477 5.5155513698075342 -0.43422270847473765 -2.7998638882620592 2.8900437099392731 -0.92253406158048201 -2.9819954444478913 4.1290984323575417 -1.3034685972980884 -3.2677189891655134 5.0811097849095965 -1.6937144055861746 -2.9066596331058756 2.6463497309340642 -1.8318727989807126 -3.0983929368367793 3.7801915506195565 -2.4151611568569731 -3.3576481858128786 4.6466682000116597 -2.9532061026976115 -3.013455377949692 2.8947764134081897 -2.2903657858545787 -2.3096291027720648 3.5029998588440141 -2.7403682807646326 -2.3003503750846939 3.9635477042201841 -3.1328966861154544 -2.0081804663928824 3.092011818567435 -1.8241148097481779 -2.1600356585784195 3.7762163714142725 -2.2122267822370159 -2.200509051826574 4.29120773645763 -2.5667769436724486 -1.8972820474325411 3.2892472237266808 -1.3578638336417757 -2.0104422143847742 4.0494328839845304 -1.6840852837093998 -2.1006677285684545 4.6188677686950754 -2.0006572012294432 -1.7863836284721997 3.3505946277543663 -1.8206321286659417 -1.1985910127552339 3.7582934699504116 -1.9497631334195771 -1.1682083407199018 4.0769461686176403 -2.1043729227654207 -0.93053684267235526 2.7357951371843168 -2.5949031069090727 -1.3149885051441221 3.0079818124561304 -2.8231542311455819 -1.2581375373672674 3.223782002951979 -3.0479123066984664 -1.0373325875161719 4.7462793133137602 0.11802447355715728 -0.81652763766507663 5 0.073740518829691085 -0.43005606989021922 5 9.4432470016269928e-16 -1.5087393828002892e-16 4.7870588658774267 -1.2747668250016702 -0.94018993070534396 5.0048263056714015 -1.3950498392746824 -0.58861277257314948 5 -1.4625972592591141 -0.19467496971038212 5.4352727294950522 -1.5633914208269757 -1.7194241144564799 5.9570848669522292 -1.7812344769064938 -1.0386848179837012 5.938538843445472 -1.9251006988178898 -0.19467496971038226 5.5582924626947534 -0.85970155138721183 -1.5940550430385083 6.1103104279389484 -1.0615466284688067 -0.88012811530077084 6.080868738500028 -1.2095599964999941 -1.7035497594493628e-16 5.6813121958944546 -0.15601168194744769 -1.4686859716205367 6.2635359889256668 -0.34185878003111964 -0.72157141261784052 6.2231986335545839 -0.4940192941820985 0.19467496971038187 6.5530974255195407 -0.67666937921027115 -2.4219379840059707 7.535335395281848 -1.1046529533785514 -1.2248667171871681 7.4565320529130075 -1.3354710697580905 0.1946749697103819 6.0331211374616514 -2.0839602138742608 -2.5456002770462378 6.9274855542166156 -2.6127023020369222 -1.3834234198700988 6.8367085405835226 -2.8318573995016627 -4.822975808200632e-17 5.5131448494037629 -3.4912510485382504 -2.6692625700865054 6.3196357131513823 -4.1207516506952926 -1.5419801225530292 6.216885028254036 -4.3282437292452345 -0.19467496971038201 4.4240955495963545 -3.5254250914662761 -1.7160105577010709 4.821979858540276 -3.9253237595927715 -1.0386848179837009 4.7497903474104586 -4.0511415615041484 -0.19467496971038201 4.8061991015009875 -2.9213271051078804 -1.5940550430385079 5.2389544342650458 -3.3190557702285721 -0.88012811530077062 5.1551115962757814 -3.4445354447215335 5.7810452267162393e-17 5.1883026534056214 -2.317229118749486 -1.472099528375945 5.6559290099898165 -2.7127877808643714 -0.72157141261784019 5.5604328451411043 -2.8379293279389186 0.19467496971038215 4.3955988672848694 -2.2589827121112638 -0.69286534462480887 4.6228552357341206 -2.4413871491947012 -0.27149936720728834 4.5697463460997172 -2.501321465765757 0.19467496971038228 3.4395821934478281 -3.2726703822513508 -0.81652763766507619 3.5876763268454264 -3.4833914850200487 -0.43005606989021877 3.5355339059327382 -3.5355339059327369 2.8208979025593882e-16 8.1632818104813616e-09 1.1542110682141615e-08 -5 0.45351566412416966 0.64122838240179381 -4.9999999947704303 0.86109934457807913 1.1988092980184004 -4.5541657294473969 1.1444881605347095 1.5601013422709398 -3.9241838901962742 7.4078524328576854e-09 1.2076396227245601e-08 -5 0.41154736463611252 0.67091091320805185 -4.9999999947704303 0.7841857403760164 1.2540267995486025 -4.5542552121822473 1.0393488579456356 1.6372317460078289 -3.9240958338115348 6.5998205027791228e-09 1.2536267101315434e-08 -5 0.36665670107132137 0.69645929555149666 -4.9999999947704303 0.70118152291611624 1.3043041957171722 -4.5542332598784592 0.92748705921823493 1.6982780744836254 -3.9237978632131192 5.754672549778749e-09 1.2912909538944595e-08 -5 0.31970403619663396 0.71738387578979568 -4.9999999947704303 0.61181890670720984 1.3462050486543276 -4.5540927235145698 0.81503310025484621 1.746720578182225 -3.9235932029191516 4.9095245967783768e-09 1.3289551976573755e-08 -5 0.2727513713219466 0.73830845602809458 -4.9999999947704303 0.52245629049830333 1.3881059015914832 -4.5539521871506805 0.70257914129145738 1.7951630818808246 -3.923388542625184 4.0273024167533884e-09 1.3582947351309275e-08 -5 0.22373902713169203 0.75460819935828649 -4.9999999947704303 0.42979713281373821 1.4169779672262592 -4.5499065825209621 0.5780489622972983 1.8213091165382242 -3.9418063511561829 3.1249144502456891e-09 1.3787472523809034e-08 -5 0.17360636145015063 0.76597070914470822 -4.9999999947704303 0.33750778821045463 1.4386058606867578 -4.5499960652558125 0.4531934496549031 1.8518652298911322 -3.9417182947714435 2.2225264837379889e-09 1.3991997696308794e-08 -5 0.12347369576860945 0.77733321893113005 -4.9999999947704303 0.24521844360717121 1.4602337541472568 -4.5500855479906637 0.32833793701250813 1.8824213432440404 -3.9416302383867041 1.3000173573890373e-09 1.4107642551996935e-08 -5 0.072223187853683771 0.78375793325289089 -4.9999999947704303 0.14877638297509649 1.4756454005158899 -4.554131152620382 0.20667629688638192 1.9166424043045274 -3.9232124298557061 3.7506764086190029e-10 1.4132190671687164e-08 -5 0.020837091592707541 0.78512171770851225 -4.9999999947704303 0.05007659682397303 1.4778642502196659 -4.5540927235145698 0.084551373403164334 1.9256590554955235 -3.9235932029191516 -5.4988207566523685e-10 1.4156738791377395e-08 -5 -0.030549004668268764 0.78648550216413371 -4.9999999947704303 -0.048623189327150436 1.480083099923442 -4.5540542944087576 -0.037573550080053572 1.9346757066865197 -3.9239739759825976 -1.4772266399616401e-09 1.4090188961068442e-08 -5 -0.082068148030311178 0.78278828930909938 -4.9999999947704303 -0.14536619728288344 1.4719168311293394 -4.5540762467125457 -0.16499875380823606 1.9322388600717755 -3.9242719465810136 -2.3891928076198548e-09 1.3933816657476189e-08 -5 -0.13273293600906796 0.77410093896210996 -4.9999999947704303 -0.2387969981518443 1.4565753698047468 -4.5541657294473969 -0.29388289915620514 1.9124335777598276 -3.9241838901962742 1.4278769764913397 1.9213933865234789 -3.2942020509451519 1.5943988453592974 2.0955997665774437 -2.4930626592556555 1.7099146176412083 2.1676489033011954 -1.7515749127262328 1.294511975515255 2.0204366924670558 -3.2939364554408233 1.4371939805277669 2.2143966249707026 -2.4926871801890322 1.5153407055167876 2.31865467488789 -1.7471630864971588 1.1537925955203538 2.0922519532500785 -3.2933624665477801 1.275509958772155 2.2818339374588037 -2.4926321599348364 1.3233448180622711 2.3527954850299837 -1.7520298853594396 1.0182472938024827 2.1472361077101225 -3.2930936823237333 1.1366263319764898 2.3262075187684212 -2.4936206142624369 1.2113584484483566 2.3703112005937585 -1.7593940340559813 0.88270199208461131 2.2022202621701661 -3.292824898099687 0.99774270518082442 2.3705811000780384 -2.4946090685900368 1.0993720788344421 2.3878269161575338 -1.7667581827525232 0.72630079178085827 2.2256402658501893 -3.3337061197914029 0.82440082204203891 2.3865999765752703 -2.5858527378715501 0.90932588317562046 2.3828704330000319 -1.9154012332922599 0.56887911109935185 2.2651245990955071 -3.3334405242870746 0.64103153537251245 2.4342275227429639 -2.5854772588049268 0.68573622499375386 2.4437001369269971 -1.9109894070631861 0.41145743041784549 2.3046089323408245 -3.3331749287827455 0.45766224870298611 2.4818550689106571 -2.5851017797383031 0.46214656681188748 2.5045298408539618 -1.9065775808341123 0.26457621079766763 2.3576394080931649 -3.2922937070910292 0.30348243609343623 2.5527621287263904 -2.4938581104567903 0.31816476492138274 2.6054648546674661 -1.757934530294375 0.11902614998235547 2.3734538607713809 -3.2930936823237333 0.15990472655067969 2.5841035810013144 -2.4936206142624369 0.21207045103942912 2.6534488127874956 -1.7593940340559813 -0.026523910832956556 2.3892683134495969 -3.2938936575564384 0.016327017007923033 2.6154450332762389 -2.493383118068083 0.10597613715747567 2.701432770907525 -1.7608535378175878 -0.1846313103335889 2.3925608890142112 -3.2944676464494811 -0.15923988001887451 2.6363816028737759 -2.4934381383222783 -0.079305279579324831 2.7726587877578739 -1.7559867389553068 -0.34896880016056592 2.3682917857149079 -3.2942020509451519 -0.35440257013029569 2.6092230410694177 -2.4930626592556555 -0.32366701737175696 2.7418514601399595 -1.7515749127262328 1.825430389923119 2.2396980400249475 -1.0100871661968105 1.8982113559298786 2.2198918694520779 -0.328043792749388 2.014830420559504 2.2356406334257577 0.18152937719693438 1.5934874305058078 2.4229127248050775 -1.0016389928052856 1.612354586273089 2.447727747649556 -0.31180660564986462 1.6615256387241255 2.5368230163347296 0.22366590436094613 1.3711796773523872 2.4237570326011633 -1.011427610784043 1.3472414959319685 2.3838482585677316 -0.34130352212293025 1.3283131056937256 2.3836712394838018 0.22969079296653705 1.2860905649202237 2.4144148824190959 -1.0251674538495261 1.3211671587179727 2.334927375579209 -0.36466121884116554 1.3820907459197984 2.2867101106782322 0.18912176411698328 1.2010014524880603 2.4050727322370293 -1.038907296915009 1.2950928215039761 2.286006492590686 -0.38801891555940093 1.435868386145871 2.1897489818726616 0.14855273526742951 0.99425094430920213 2.3791408894247934 -1.2449497287129703 1.0680691708082655 2.2217097365149119 -0.66871004740253426 1.1539653347294774 2.0289338344462506 -0.12629319400467287 0.73044091461499538 2.4531727511110297 -1.2365015553214456 0.74720352017512448 2.3125344138466679 -0.65247286030301077 0.75685631538926046 2.1556851407324564 -0.084156666840661143 0.46663088492078919 2.5272046127972665 -1.2280533819299209 0.42633786954198333 2.4033590911784244 -0.6362356732034874 0.35974729604904376 2.2824364470186622 -0.042020139676649443 0.33284709374932941 2.6581675806085423 -1.0220109501319596 0.32138652417005037 2.5808828576012122 -0.35554454136035385 0.30203788312944052 2.5715209686365927 0.23282578959545314 0.26423617552817869 2.7227940445736767 -1.0251674538495261 0.32706127455576267 2.6627803952241522 -0.36466121884116554 0.40179927825025846 2.6415478985308534 0.18912176411698331 0.19562525730702798 2.7874205085388115 -1.0283239575670924 0.33273602494147525 2.7446779328470927 -0.37377789632197722 0.5015606733710769 2.711574828425114 0.14541773863851351 0.00062932086022452404 2.9089359726419723 -1.0185353395883352 0.13577308225630841 2.9529656820951424 -0.34428097984891154 0.30665591351731419 3.0423930072426826 0.13939285003292259 -0.29293146461321823 2.8744798792105009 -1.0100871661968105 -0.22746247248711757 2.9119387162937747 -0.328043792749388 -0.15613639887297295 3.0055369055101107 0.18152937719693438 2.1314494851891292 2.2513893973994374 0.69110254714325681 2.2969429606929426 2.3089365017155115 1.0312035941324103 2.5163690489386297 2.4519198043122921 1.1730960496382663 1.7106966911751629 2.6259182850199037 0.75913841437175678 1.818205550421216 2.8031855076017624 1.1631975583091827 1.9696005985177421 3.0861797963769835 1.2972917779210966 1.3093847154554821 2.3834942203998719 0.80068510805600424 1.292102025873979 2.4104098751266134 1.3899488237909088 1.5408795245049021 2.8175158736491515 1.8165930114767295 1.4430143331216239 2.2384928457772548 0.7429047470751321 1.5139926639214847 2.1912826285289944 1.2932038013394727 1.8362902904782576 2.5299033309244323 1.7266197299589461 1.5766439507877663 2.0934914711546382 0.68512438609425996 1.7358833019689903 1.9721553819313753 1.1964587788880363 2.1317010564516128 2.2422907881997127 1.6366464484411627 1.2398614986506893 1.8361579323775892 0.41612365939318852 1.2680411429868144 1.4648860938532482 1.1171476502217945 1.7372989050457532 1.8450518836867804 1.9913728011403986 0.76650911060339655 1.9988358676182447 0.48415952662168854 0.72219109610650223 1.7045149723701043 1.2491416143985667 1.0567152552554815 2.2002072842064093 2.1155685294232289 0.2931567225561042 2.1615138028589 0.55219539385018857 0.17634104922619015 1.9441438508869602 1.3811355785753392 0.37613160546521002 2.5553626847260378 2.2397642577060592 0.28268924208883051 2.5621590796719733 0.82119612055126012 0.26293462314828292 2.6208798175387695 1.4604467072415808 0.34515873825632903 3.1436645140270008 1.8850379050068233 0.47653728194475431 2.6203154018375541 0.7429047470751321 0.5601792770018279 2.6038610796505108 1.2932038013394727 0.72835892489203236 3.040043777852119 1.7266197299589461 0.67038532180067856 2.6784717240031353 0.6646133735990043 0.85742393085537205 2.5868423417622517 1.1259608954373641 1.1115591115277355 2.9364230416772368 1.5682015549110688 0.47753874477831992 3.1318203323902232 0.62306667991475673 0.67952457868020566 3.2458802467508128 0.8992096299556378 0.88068571837337417 3.4512448766344637 1.048900321355436 -0.084810325258828326 3.0991350947264462 0.69110254714325681 -0.008480714187497046 3.2568486011968676 1.0312035941324103 0.045572497917634493 3.5131107390272622 1.1730960496382663 2.7357951371843168 2.5949031069090727 1.3149885051441224 3.0079818124561304 2.8231542311455828 1.2581375373672679 3.223782002951979 3.0479123066984668 1.0373325875161723 2.1209956466142676 3.3691740851522041 1.4313859975330103 2.2576701549618488 3.6965453288715882 1.3480667340146337 2.3706178372863178 3.9914516906315129 1.1441283323599889 1.7896570231358251 3.2246218721716895 2.2432371991625502 2.1801113210752083 3.8660599916809621 2.2805261218631858 2.4589724251919249 4.4074314358104276 1.9999751181598331 2.1585879170350304 2.8685240333198698 2.1600356585784199 2.6421864776872468 3.4889264877481407 2.2005090518265744 2.982295986547145 4.0135667883600838 1.8972820474325414 2.5275188109342355 2.5124261944680502 2.0768341179942893 3.1042616342992848 3.1117929838153189 2.120491981789963 3.5056195479023655 3.6197021409097414 1.7945889767052496 2.2065566671046919 2.2252176735203126 2.8655979520590029 3.0308217870318654 3.3020340605408216 3.1777897925181477 3.5930419538659826 4.2071255972813342 2.7998638882620592 1.3912394144044613 2.6958995960427141 2.9819954444478913 1.9980220174935659 3.8414049859199557 3.2677189891655134 2.3952502432795697 4.7905241264462219 2.9066596331058756 0.57592216170422961 3.1665815185651147 3.0983929368367797 0.96522224795526623 4.3807759112990912 3.357648185812879 1.1974585326931568 5.3739226556111097 3.0134553779496924 0.42738285336437531 3.666449210515232 2.3096291027720652 0.53926196040692909 4.4147279489613132 2.3003503750846943 0.58735896770136464 5.0179439507195651 2.0081804663928828 0.89653857278223692 3.4762264760537271 2.1600356585784199 1.1059076442124012 4.2344687626969799 2.2005090518265744 1.2193567072652962 4.8493274725934343 1.8972820474325414 1.3656942922000994 3.2860037415922223 2.0104422143847742 1.6725533280178726 4.0542095764326467 2.1006677285684545 1.851354446829228 4.6807109944673044 1.7863836284721999 1.0818468580665423 3.6566095065181146 1.1985910127552342 1.2788240649425422 4.0362055316395695 1.168208340719902 1.394819918529264 4.3708526461948312 0.93053684267235548 0.099625710022765726 3.7693728768576573 1.3149885051441224 0.13069283609499713 4.1232358384520662 1.2581375373672679 0.12435865482607758 4.4347575758829123 1.0373325875161723 3.4395821934478286 3.2726703822513517 0.81652763766507663 3.5876763268454268 3.4833914850200487 0.43005606989021922 3.5355339059327386 3.5355339059327369 1.508739382800288e-16 2.4835655196107864 4.2863580523914377 0.94018993070534407 2.5524974179567339 4.5253958208453957 0.5886127725731497 2.5013214657657596 4.5697463460997163 0.19467496971038228 2.7378335293086415 4.9488028799398931 1.7194241144564801 2.9527721280218295 5.4718180830295378 1.0386848179837014 2.8379293279389195 5.5604328451411016 0.19467496971038248 3.3224054954070432 4.5382070889720278 1.5940550430385083 3.5700151192144962 5.0712687582865152 0.88012811530077095 3.4445354447215344 5.1551115962757788 3.184784616492628e-16 3.9069774615054449 4.1276112980041626 1.4686859716205367 4.1872581104071624 4.6707194335434918 0.72157141261784052 4.0511415615041493 4.7497903474104559 -0.19467496971038181 4.1552621207001001 5.1122171340218472 2.4219379840059707 4.5471791623270876 6.1093943507105291 1.2248667171871683 4.328243729245238 6.2168850282540342 -0.19467496971038173 2.7924784690655735 5.7396432669724886 2.5456002770462383 3.0510124969664068 6.7459315269504279 1.383423419870099 2.8318573995016658 6.8367085405835208 3.9502081453687136e-16 1.4296948174310471 6.3670693999231291 2.6692625700865058 1.5548458316057254 7.3824687031903258 1.5419801225530296 1.335471069758094 7.4565320529130057 0.19467496971038253 0.63545597499580009 5.6211599524778162 1.7160105577010714 0.63403160795805658 6.1852777054794998 1.0386848179837014 0.49401929418210055 6.2231986335545848 0.19467496971038251 1.3328057703181917 5.4641861824898879 1.5940550430385083 1.3575733645311838 6.0514270490611093 0.88012811530077106 1.2095599964999963 6.0808687385000288 3.6400954689007538e-16 2.0301555656405839 5.3072124125019622 1.4720995283759453 2.0811151211043128 5.9175763926427178 0.72157141261784052 1.925100698817892 5.9385388434454729 -0.19467496971038178 1.5108157721159856 4.7054997607500919 0.69286534462480909 1.5425308769340655 4.9951736943285985 0.27149936720728862 1.4625972592591163 4.9999999999999991 -0.19467496971038198 0.11802447355715834 4.7462793133137593 0.81652763766507663 0.073740518829691598 5 0.43005606989021922 1.4914285084710599e-15 5 1.508739382800288e-16 8.1632818104813616e-09 -1.1542110069838438e-08 5 0.45351566412416966 -0.64122838240179325 4.9999999947704303 0.86109934457807913 -1.1988092980184 4.5541657294473969 1.1444881605347095 -1.5601013422709393 3.9241838901962742 7.4078524328576854e-09 -1.2076395614942424e-08 5 0.41154736463611252 -0.67091091320805119 4.9999999947704303 0.7841857403760164 -1.2540267995486019 4.5542552121822473 1.0393488579456356 -1.6372317460078285 3.9240958338115348 6.5998205027791228e-09 -1.2536266489012257e-08 5 0.36665670107132137 -0.69645929555149599 4.9999999947704303 0.70118152291611624 -1.3043041957171717 4.5542332598784592 0.92748705921823493 -1.698278074483625 3.9237978632131192 5.754672549778749e-09 -1.2912908926641418e-08 5 0.31970403619663396 -0.71738387578979501 4.9999999947704303 0.61181890670720984 -1.3462050486543271 4.5540927235145698 0.81503310025484621 -1.7467205781822246 3.9235932029191516 4.9095245967783768e-09 -1.3289551364270578e-08 5 0.2727513713219466 -0.73830845602809392 4.9999999947704303 0.52245629049830333 -1.3881059015914825 4.5539521871506805 0.70257914129145738 -1.795163081880824 3.923388542625184 4.0273024167533884e-09 -1.3582946739006098e-08 5 0.22373902713169203 -0.75460819935828594 4.9999999947704303 0.42979713281373821 -1.4169779672262588 4.5499065825209621 0.5780489622972983 -1.8213091165382238 3.9418063511561834 3.1249144502456891e-09 -1.3787471911505857e-08 5 0.17360636145015063 -0.76597070914470766 4.9999999947704303 0.33750778821045463 -1.4386058606867573 4.5499960652558125 0.4531934496549031 -1.8518652298911318 3.941718294771444 2.2225264837379889e-09 -1.3991997084005617e-08 5 0.12347369576860945 -0.7773332189311295 4.9999999947704303 0.24521844360717121 -1.4602337541472561 4.5500855479906637 0.32833793701250813 -1.88242134324404 3.9416302383867046 1.3000173573890373e-09 -1.4107641939693759e-08 5 0.072223187853683771 -0.78375793325289023 4.9999999947704303 0.14877638297509649 -1.4756454005158894 4.554131152620382 0.20667629688638192 -1.9166424043045269 3.9232124298557065 3.7506764086190029e-10 -1.4132190059383987e-08 5 0.020837091592707541 -0.78512171770851169 4.9999999947704303 0.05007659682397303 -1.4778642502196653 4.5540927235145698 0.084551373403164334 -1.9256590554955231 3.923593202919152 -5.4988207566523685e-10 -1.4156738179074218e-08 5 -0.030549004668268764 -0.78648550216413315 4.9999999947704303 -0.048623189327150436 -1.4800830999234416 4.5540542944087576 -0.037573550080053572 -1.9346757066865192 3.923973975982598 -1.4772266399616401e-09 -1.4090188348765265e-08 5 -0.082068148030311178 -0.78278828930909883 4.9999999947704303 -0.14536619728288344 -1.4719168311293387 4.5540762467125457 -0.16499875380823606 -1.9322388600717748 3.9242719465810141 -2.3891928076198548e-09 -1.3933816045173012e-08 5 -0.13273293600906796 -0.7741009389621093 4.9999999947704303 -0.2387969981518443 -1.4565753698047463 4.5541657294473969 -0.29388289915620514 -1.9124335777598269 3.9241838901962747 1.4278769764913397 -1.9213933865234785 3.2942020509451524 1.5943988453592974 -2.0955997665774433 2.493062659255656 1.7099146176412083 -2.1676489033011954 1.751574912726233 1.294511975515255 -2.0204366924670554 3.2939364554408237 1.4371939805277669 -2.2143966249707021 2.4926871801890327 1.5153407055167876 -2.31865467488789 1.747163086497159 1.1537925955203538 -2.0922519532500781 3.2933624665477805 1.275509958772155 -2.2818339374588037 2.4926321599348369 1.3233448180622711 -2.3527954850299833 1.7520298853594398 1.0182472938024827 -2.1472361077101221 3.2930936823237338 1.1366263319764898 -2.3262075187684208 2.4936206142624373 1.2113584484483566 -2.3703112005937585 1.7593940340559815 0.88270199208461131 -2.2022202621701656 3.2928248980996875 0.99774270518082442 -2.3705811000780379 2.4946090685900373 1.0993720788344421 -2.3878269161575334 1.7667581827525234 0.72630079178085827 -2.2256402658501888 3.3337061197914033 0.82440082204203891 -2.3865999765752703 2.5858527378715506 0.90932588317562046 -2.3828704330000319 1.9154012332922601 0.56887911109935185 -2.2651245990955067 3.333440524287075 0.64103153537251245 -2.4342275227429635 2.5854772588049273 0.68573622499375386 -2.4437001369269966 1.9109894070631863 0.41145743041784549 -2.3046089323408241 3.3331749287827459 0.45766224870298611 -2.4818550689106567 2.5851017797383036 0.46214656681188748 -2.5045298408539614 1.9065775808341126 0.26457621079766763 -2.3576394080931644 3.2922937070910296 0.30348243609343623 -2.55276212872639 2.4938581104567907 0.31816476492138274 -2.6054648546674661 1.7579345302943752 0.11902614998235547 -2.3734538607713809 3.2930936823237338 0.15990472655067969 -2.5841035810013144 2.4936206142624373 0.21207045103942912 -2.6534488127874956 1.7593940340559815 -0.026523910832956556 -2.3892683134495964 3.2938936575564388 0.016327017007923033 -2.6154450332762385 2.4933831180680834 0.10597613715747567 -2.701432770907525 1.760853537817588 -0.1846313103335889 -2.3925608890142107 3.2944676464494815 -0.15923988001887451 -2.6363816028737759 2.4934381383222788 -0.079305279579324831 -2.7726587877578739 1.7559867389553072 -0.34896880016056592 -2.3682917857149079 3.2942020509451524 -0.35440257013029569 -2.6092230410694173 2.493062659255656 -0.32366701737175696 -2.7418514601399591 1.7515749127262332 1.825430389923119 -2.2396980400249471 1.0100871661968107 1.8982113559298786 -2.2198918694520779 0.32804379274938827 2.014830420559504 -2.2356406334257577 -0.1815293771969341 1.5934874305058078 -2.422912724805077 1.0016389928052858 1.612354586273089 -2.447727747649556 0.3118066056498649 1.6615256387241255 -2.5368230163347296 -0.22366590436094583 1.3711796773523872 -2.4237570326011633 1.0114276107840432 1.3472414959319685 -2.3838482585677316 0.34130352212293052 1.3283131056937256 -2.3836712394838022 -0.22969079296653674 1.2860905649202237 -2.4144148824190959 1.0251674538495263 1.3211671587179727 -2.334927375579209 0.36466121884116581 1.3820907459197984 -2.2867101106782322 -0.189121764116983 1.2010014524880603 -2.4050727322370293 1.0389072969150093 1.2950928215039761 -2.286006492590686 0.38801891555940121 1.435868386145871 -2.1897489818726616 -0.14855273526742924 0.99425094430920213 -2.379140889424793 1.2449497287129705 1.0680691708082655 -2.2217097365149114 0.66871004740253448 1.1539653347294774 -2.0289338344462506 0.12629319400467312 0.73044091461499538 -2.4531727511110297 1.2365015553214458 0.74720352017512448 -2.3125344138466679 0.6524728603030111 0.75685631538926046 -2.1556851407324564 0.084156666840661407 0.46663088492078919 -2.527204612797266 1.2280533819299211 0.42633786954198333 -2.4033590911784239 0.63623567320348773 0.35974729604904376 -2.2824364470186622 0.04202013967664972 0.33284709374932941 -2.6581675806085423 1.0220109501319599 0.32138652417005037 -2.5808828576012122 0.35554454136035418 0.30203788312944052 -2.5715209686365927 -0.23282578959545283 0.26423617552817869 -2.7227940445736762 1.0251674538495266 0.32706127455576267 -2.6627803952241522 0.36466121884116587 0.40179927825025846 -2.6415478985308534 -0.18912176411698298 0.19562525730702798 -2.7874205085388115 1.0283239575670928 0.33273602494147525 -2.7446779328470927 0.37377789632197755 0.5015606733710769 -2.711574828425114 -0.14541773863851318 0.00062932086022452404 -2.9089359726419723 1.0185353395883356 0.13577308225630841 -2.9529656820951424 0.34428097984891193 0.30665591351731419 -3.0423930072426826 -0.13939285003292223 -0.29293146461321823 -2.8744798792105009 1.0100871661968109 -0.22746247248711757 -2.9119387162937747 0.32804379274938833 -0.15613639887297295 -3.0055369055101107 -0.18152937719693402 2.1314494851891292 -2.2513893973994379 -0.69110254714325658 2.2969429606929426 -2.3089365017155115 -1.03120359413241 2.5163690489386297 -2.4519198043122921 -1.1730960496382661 1.7106966911751629 -2.6259182850199037 -0.75913841437175644 1.818205550421216 -2.8031855076017629 -1.1631975583091823 1.9696005985177421 -3.0861797963769835 -1.2972917779210962 1.3093847154554821 -2.3834942203998719 -0.8006851080560039 1.292102025873979 -2.4104098751266134 -1.3899488237909086 1.5408795245049021 -2.8175158736491519 -1.816593011476729 1.4430143331216239 -2.2384928457772548 -0.74290474707513188 1.5139926639214847 -2.1912826285289944 -1.2932038013394724 1.8362902904782576 -2.5299033309244323 -1.7266197299589459 1.5766439507877663 -2.0934914711546382 -0.68512438609425974 1.7358833019689903 -1.9721553819313753 -1.1964587788880361 2.1317010564516128 -2.2422907881997132 -1.6366464484411625 1.2398614986506893 -1.8361579323775894 -0.41612365939318829 1.2680411429868144 -1.4648860938532482 -1.1171476502217943 1.7372989050457532 -1.8450518836867806 -1.9913728011403984 0.76650911060339655 -1.9988358676182447 -0.48415952662168832 0.72219109610650223 -1.7045149723701045 -1.2491416143985665 1.0567152552554815 -2.2002072842064093 -2.1155685294232285 0.2931567225561042 -2.1615138028589005 -0.55219539385018834 0.17634104922619015 -1.9441438508869604 -1.381135578575339 0.37613160546521002 -2.5553626847260382 -2.2397642577060588 0.28268924208883051 -2.5621590796719733 -0.82119612055125979 0.26293462314828292 -2.62087981753877 -1.4604467072415805 0.34515873825632903 -3.1436645140270012 -1.8850379050068229 0.47653728194475431 -2.6203154018375541 -0.74290474707513177 0.5601792770018279 -2.6038610796505108 -1.2932038013394724 0.72835892489203236 -3.0400437778521194 -1.7266197299589456 0.67038532180067856 -2.6784717240031353 -0.66461337359900396 0.85742393085537205 -2.5868423417622521 -1.1259608954373639 1.1115591115277355 -2.9364230416772368 -1.5682015549110684 0.47753874477831992 -3.1318203323902232 -0.62306667991475639 0.67952457868020566 -3.2458802467508132 -0.89920962995563736 0.88068571837337417 -3.4512448766344641 -1.0489003213554355 -0.084810325258828326 -3.0991350947264467 -0.69110254714325647 -0.008480714187497046 -3.2568486011968676 -1.0312035941324098 0.045572497917634493 -3.5131107390272622 -1.1730960496382659 2.7357951371843168 -2.5949031069090727 -1.3149885051441221 3.0079818124561304 -2.8231542311455828 -1.2581375373672674 3.223782002951979 -3.0479123066984668 -1.0373325875161719 2.1209956466142676 -3.3691740851522041 -1.4313859975330099 2.2576701549618488 -3.6965453288715882 -1.3480667340146333 2.3706178372863178 -3.9914516906315134 -1.1441283323599885 1.7896570231358251 -3.2246218721716899 -2.2432371991625497 2.1801113210752083 -3.8660599916809626 -2.2805261218631854 2.4589724251919249 -4.4074314358104285 -1.9999751181598326 2.1585879170350304 -2.8685240333198703 -2.1600356585784195 2.6421864776872468 -3.4889264877481412 -2.200509051826574 2.982295986547145 -4.0135667883600847 -1.8972820474325409 2.5275188109342355 -2.5124261944680502 -2.0768341179942889 3.1042616342992848 -3.1117929838153193 -2.1204919817899626 3.5056195479023655 -3.6197021409097418 -1.7945889767052492 2.2065566671046919 -2.2252176735203131 -2.8655979520590025 3.0308217870318654 -3.302034060540822 -3.1777897925181473 3.5930419538659826 -4.2071255972813351 -2.7998638882620588 1.3912394144044613 -2.6958995960427146 -2.9819954444478909 1.9980220174935659 -3.8414049859199562 -3.267718989165513 2.3952502432795697 -4.7905241264462228 -2.9066596331058752 0.57592216170422961 -3.1665815185651152 -3.0983929368367793 0.96522224795526623 -4.3807759112990912 -3.3576481858128786 1.1974585326931568 -5.3739226556111097 -3.013455377949692 0.42738285336437531 -3.6664492105152324 -2.3096291027720648 0.53926196040692909 -4.414727948961314 -2.3003503750846939 0.58735896770136464 -5.0179439507195651 -2.0081804663928824 0.89653857278223692 -3.4762264760537276 -2.1600356585784195 1.1059076442124012 -4.2344687626969799 -2.200509051826574 1.2193567072652962 -4.8493274725934343 -1.8972820474325407 1.3656942922000994 -3.2860037415922223 -2.0104422143847738 1.6725533280178726 -4.0542095764326467 -2.1006677285684541 1.851354446829228 -4.6807109944673044 -1.7863836284721992 1.0818468580665423 -3.6566095065181146 -1.1985910127552337 1.2788240649425422 -4.0362055316395704 -1.1682083407199015 1.394819918529264 -4.3708526461948312 -0.93053684267235492 0.099625710022765726 -3.7693728768576573 -1.3149885051441219 0.13069283609499713 -4.1232358384520662 -1.2581375373672674 0.12435865482607758 -4.4347575758829132 -1.0373325875161719 3.4395821934478286 -3.2726703822513517 -0.81652763766507619 3.5876763268454268 -3.4833914850200487 -0.43005606989021877 3.5355339059327386 -3.5355339059327369 2.8208979025593882e-16 2.4835655196107864 -4.2863580523914377 -0.94018993070534351 2.5524974179567339 -4.5253958208453957 -0.58861277257314915 2.5013214657657596 -4.5697463460997163 -0.19467496971038173 2.7378335293086415 -4.9488028799398931 -1.7194241144564795 2.9527721280218295 -5.4718180830295378 -1.0386848179837007 2.8379293279389195 -5.5604328451411016 -0.19467496971038178 3.3224054954070432 -4.5382070889720278 -1.5940550430385076 3.5700151192144962 -5.0712687582865152 -0.88012811530077029 3.4445354447215344 -5.1551115962757788 3.1281977989701087e-16 3.9069774615054449 -4.1276112980041626 -1.4686859716205363 4.1872581104071624 -4.6707194335434918 -0.72157141261783997 4.0511415615041493 -4.7497903474104559 0.1946749697103824 4.1552621207001001 -5.1122171340218481 -2.4219379840059703 4.5471791623270876 -6.1093943507105291 -1.2248667171871677 4.328243729245238 -6.2168850282540342 0.19467496971038248 2.7924784690655735 -5.7396432669724886 -2.5456002770462374 3.0510124969664068 -6.7459315269504279 -1.3834234198700981 2.8318573995016658 -6.8367085405835208 4.4220685726615778e-16 1.4296948174310471 -6.3670693999231291 -2.6692625700865049 1.5548458316057254 -7.3824687031903258 -1.5419801225530287 1.335471069758094 -7.4565320529130057 -0.19467496971038162 0.63545597499580009 -5.6211599524778162 -1.7160105577010707 0.63403160795805658 -6.1852777054794998 -1.0386848179837007 0.49401929418210055 -6.2231986335545848 -0.19467496971038176 1.3328057703181917 -5.4641861824898879 -1.5940550430385076 1.3575733645311838 -6.0514270490611093 -0.88012811530077029 1.2095599964999963 -6.0808687385000288 3.806575025026245e-16 2.0301555656405839 -5.3072124125019622 -1.4720995283759446 2.0811151211043128 -5.9175763926427178 -0.72157141261783975 1.925100698817892 -5.9385388434454729 0.19467496971038251 1.5108157721159856 -4.7054997607500919 -0.69286534462480853 1.5425308769340655 -4.9951736943285985 -0.27149936720728801 1.4625972592591163 -4.9999999999999991 0.19467496971038259 0.11802447355715834 -4.7462793133137593 -0.81652763766507608 0.073740518829691598 -5 -0.43005606989021861 1.4914285084710599e-15 -5 4.6142923863115981e-16</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<bicubic_patches>\n\t\t\t<patch_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</patch_selection>\n\t\t\t<patch_materials>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</patch_materials>\n\t\t\t<patch_points>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 3 52 53 54 7 55 56 57 11 58 59 60 15 61 62 63 15 61 62 63 19 64 65 66 23 67 68 69 27 70 71 72 27 70 71 72 31 73 74 75 35 76 77 78 39 79 80 81 39 79 80 81 43 82 83 84 47 85 86 87 51 88 89 90 54 91 92 93 57 94 95 96 60 97 98 99 63 100 101 102 63 100 101 102 66 103 104 105 69 106 107 108 72 109 110 111 72 109 110 111 75 112 113 114 78 115 116 117 81 118 119 120 81 118 119 120 84 121 122 123 87 124 125 126 90 127 128 129 93 130 131 132 96 133 134 135 99 136 137 138 102 139 140 141 102 139 140 141 105 142 143 144 108 145 146 147 111 148 149 150 111 148 149 150 114 151 152 153 117 154 155 156 120 157 158 159 120 157 158 159 123 160 161 162 126 163 164 165 129 166 167 168 132 169 170 171 135 172 173 174 138 175 176 177 141 178 179 180 141 178 179 180 144 181 182 183 147 184 185 186 150 187 188 189 150 187 188 189 153 190 191 192 156 193 194 195 159 196 197 198 159 196 197 198 162 199 200 201 165 202 203 204 168 205 206 207 171 208 209 210 174 211 212 213 177 214 215 216 180 217 218 219 180 217 218 219 183 220 221 222 186 223 224 225 189 226 227 228 189 226 227 228 192 229 230 231 195 232 233 234 198 235 236 237 198 235 236 237 201 238 239 240 204 241 242 243 207 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 250 299 300 301 254 302 303 304 258 305 306 307 262 308 309 310 262 308 309 310 266 311 312 313 270 314 315 316 274 317 318 319 274 317 318 319 278 320 321 322 282 323 324 325 286 326 327 328 286 326 327 328 290 329 330 331 294 332 333 334 298 335 336 337 301 338 339 340 304 341 342 343 307 344 345 346 310 347 348 349 310 347 348 349 313 350 351 352 316 353 354 355 319 356 357 358 319 356 357 358 322 359 360 361 325 362 363 364 328 365 366 367 328 365 366 367 331 368 369 370 334 371 372 373 337 374 375 376 340 377 378 379 343 380 381 382 346 383 384 385 349 386 387 388 349 386 387 388 352 389 390 391 355 392 393 394 358 395 396 397 358 395 396 397 361 398 399 400 364 401 402 403 367 404 405 406 367 404 405 406 370 407 408 409 373 410 411 412 376 413 414 415 379 416 417 418 382 419 420 421 385 422 423 424 388 425 426 427 388 425 426 427 391 428 429 430 394 431 432 433 397 434 435 436 397 434 435 436 400 437 438 439 403 440 441 442 406 443 444 445 406 443 444 445 409 446 447 448 412 449 450 451 415 452 453 454 418 455 456 457 421 458 459 460 424 461 462 463 427 464 465 466 427 464 465 466 430 467 468 469 433 470 471 472 436 473 474 475 436 473 474 475 439 476 477 478 442 479 480 481 445 482 483 484 445 482 483 484 448 485 486 487 451 488 489 490 454 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 497 546 547 548 501 549 550 551 505 552 553 554 509 555 556 557 509 555 556 557 513 558 559 560 517 561 562 563 521 564 565 566 521 564 565 566 525 567 568 569 529 570 571 572 533 573 574 575 533 573 574 575 537 576 577 578 541 579 580 581 545 582 583 584 548 585 586 587 551 588 589 590 554 591 592 593 557 594 595 596 557 594 595 596 560 597 598 599 563 600 601 602 566 603 604 605 566 603 604 605 569 606 607 608 572 609 610 611 575 612 613 614 575 612 613 614 578 615 616 617 581 618 619 620 584 621 622 623 587 624 625 626 590 627 628 629 593 630 631 632 596 633 634 635 596 633 634 635 599 636 637 638 602 639 640 641 605 642 643 644 605 642 643 644 608 645 646 647 611 648 649 650 614 651 652 653 614 651 652 653 617 654 655 656 620 657 658 659 623 660 661 662 626 663 664 665 629 666 667 668 632 669 670 671 635 672 673 674 635 672 673 674 638 675 676 677 641 678 679 680 644 681 682 683 644 681 682 683 647 684 685 686 650 687 688 689 653 690 691 692 653 690 691 692 656 693 694 695 659 696 697 698 662 699 700 701 665 702 703 704 668 705 706 707 671 708 709 710 674 711 712 713 674 711 712 713 677 714 715 716 680 717 718 719 683 720 721 722 683 720 721 722 686 723 724 725 689 726 727 728 692 729 730 731 692 729 730 731 695 732 733 734 698 735 736 737 701 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 744 793 794 795 748 796 797 798 752 799 800 801 756 802 803 804 756 802 803 804 760 805 806 807 764 808 809 810 768 811 812 813 768 811 812 813 772 814 815 816 776 817 818 819 780 820 821 822 780 820 821 822 784 823 824 825 788 826 827 828 792 829 830 831 795 832 833 834 798 835 836 837 801 838 839 840 804 841 842 843 804 841 842 843 807 844 845 846 810 847 848 849 813 850 851 852 813 850 851 852 816 853 854 855 819 856 857 858 822 859 860 861 822 859 860 861 825 862 863 864 828 865 866 867 831 868 869 870 834 871 872 873 837 874 875 876 840 877 878 879 843 880 881 882 843 880 881 882 846 883 884 885 849 886 887 888 852 889 890 891 852 889 890 891 855 892 893 894 858 895 896 897 861 898 899 900 861 898 899 900 864 901 902 903 867 904 905 906 870 907 908 909 873 910 911 912 876 913 914 915 879 916 917 918 882 919 920 921 882 919 920 921 885 922 923 924 888 925 926 927 891 928 929 930 891 928 929 930 894 931 932 933 897 934 935 936 900 937 938 939 900 937 938 939 903 940 941 942 906 943 944 945 909 946 947 948 912 949 950 951 915 952 953 954 918 955 956 957 921 958 959 960 921 958 959 960 924 961 962 963 927 964 965 966 930 967 968 969 930 967 968 969 933 970 971 972 936 973 974 975 939 976 977 978 939 976 977 978 942 979 980 981 945 982 983 984 948 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 991 1040 1041 1042 995 1043 1044 1045 999 1046 1047 1048 1003 1049 1050 1051 1003 1049 1050 1051 1007 1052 1053 1054 1011 1055 1056 1057 1015 1058 1059 1060 1015 1058 1059 1060 1019 1061 1062 1063 1023 1064 1065 1066 1027 1067 1068 1069 1027 1067 1068 1069 1031 1070 1071 1072 1035 1073 1074 1075 1039 1076 1077 1078 1042 1079 1080 1081 1045 1082 1083 1084 1048 1085 1086 1087 1051 1088 1089 1090 1051 1088 1089 1090 1054 1091 1092 1093 1057 1094 1095 1096 1060 1097 1098 1099 1060 1097 1098 1099 1063 1100 1101 1102 1066 1103 1104 1105 1069 1106 1107 1108 1069 1106 1107 1108 1072 1109 1110 1111 1075 1112 1113 1114 1078 1115 1116 1117 1081 1118 1119 1120 1084 1121 1122 1123 1087 1124 1125 1126 1090 1127 1128 1129 1090 1127 1128 1129 1093 1130 1131 1132 1096 1133 1134 1135 1099 1136 1137 1138 1099 1136 1137 1138 1102 1139 1140 1141 1105 1142 1143 1144 1108 1145 1146 1147 1108 1145 1146 1147 1111 1148 1149 1150 1114 1151 1152 1153 1117 1154 1155 1156 1120 1157 1158 1159 1123 1160 1161 1162 1126 1163 1164 1165 1129 1166 1167 1168 1129 1166 1167 1168 1132 1169 1170 1171 1135 1172 1173 1174 1138 1175 1176 1177 1138 1175 1176 1177 1141 1178 1179 1180 1144 1181 1182 1183 1147 1184 1185 1186 1147 1184 1185 1186 1150 1187 1188 1189 1153 1190 1191 1192 1156 1193 1194 1195 1159 1196 1197 1198 1162 1199 1200 1201 1165 1202 1203 1204 1168 1205 1206 1207 1168 1205 1206 1207 1171 1208 1209 1210 1174 1211 1212 1213 1177 1214 1215 1216 1177 1214 1215 1216 1180 1217 1218 1219 1183 1220 1221 1222 1186 1223 1224 1225 1186 1223 1224 1225 1189 1226 1227 1228 1192 1229 1230 1231 1195 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1238 1287 1288 1289 1242 1290 1291 1292 1246 1293 1294 1295 1250 1296 1297 1298 1250 1296 1297 1298 1254 1299 1300 1301 1258 1302 1303 1304 1262 1305 1306 1307 1262 1305 1306 1307 1266 1308 1309 1310 1270 1311 1312 1313 1274 1314 1315 1316 1274 1314 1315 1316 1278 1317 1318 1319 1282 1320 1321 1322 1286 1323 1324 1325 1289 1326 1327 1328 1292 1329 1330 1331 1295 1332 1333 1334 1298 1335 1336 1337 1298 1335 1336 1337 1301 1338 1339 1340 1304 1341 1342 1343 1307 1344 1345 1346 1307 1344 1345 1346 1310 1347 1348 1349 1313 1350 1351 1352 1316 1353 1354 1355 1316 1353 1354 1355 1319 1356 1357 1358 1322 1359 1360 1361 1325 1362 1363 1364 1328 1365 1366 1367 1331 1368 1369 1370 1334 1371 1372 1373 1337 1374 1375 1376 1337 1374 1375 1376 1340 1377 1378 1379 1343 1380 1381 1382 1346 1383 1384 1385 1346 1383 1384 1385 1349 1386 1387 1388 1352 1389 1390 1391 1355 1392 1393 1394 1355 1392 1393 1394 1358 1395 1396 1397 1361 1398 1399 1400 1364 1401 1402 1403 1367 1404 1405 1406 1370 1407 1408 1409 1373 1410 1411 1412 1376 1413 1414 1415 1376 1413 1414 1415 1379 1416 1417 1418 1382 1419 1420 1421 1385 1422 1423 1424 1385 1422 1423 1424 1388 1425 1426 1427 1391 1428 1429 1430 1394 1431 1432 1433 1394 1431 1432 1433 1397 1434 1435 1436 1400 1437 1438 1439 1403 1440 1441 1442 1406 1443 1444 1445 1409 1446 1447 1448 1412 1449 1450 1451 1415 1452 1453 1454 1415 1452 1453 1454 1418 1455 1456 1457 1421 1458 1459 1460 1424 1461 1462 1463 1424 1461 1462 1463 1427 1464 1465 1466 1430 1467 1468 1469 1433 1470 1471 1472 1433 1470 1471 1472 1436 1473 1474 1475 1439 1476 1477 1478 1442 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1485 1534 1535 1536 1489 1537 1538 1539 1493 1540 1541 1542 1497 1543 1544 1545 1497 1543 1544 1545 1501 1546 1547 1548 1505 1549 1550 1551 1509 1552 1553 1554 1509 1552 1553 1554 1513 1555 1556 1557 1517 1558 1559 1560 1521 1561 1562 1563 1521 1561 1562 1563 1525 1564 1565 1566 1529 1567 1568 1569 1533 1570 1571 1572 1536 1573 1574 1575 1539 1576 1577 1578 1542 1579 1580 1581 1545 1582 1583 1584 1545 1582 1583 1584 1548 1585 1586 1587 1551 1588 1589 1590 1554 1591 1592 1593 1554 1591 1592 1593 1557 1594 1595 1596 1560 1597 1598 1599 1563 1600 1601 1602 1563 1600 1601 1602 1566 1603 1604 1605 1569 1606 1607 1608 1572 1609 1610 1611 1575 1612 1613 1614 1578 1615 1616 1617 1581 1618 1619 1620 1584 1621 1622 1623 1584 1621 1622 1623 1587 1624 1625 1626 1590 1627 1628 1629 1593 1630 1631 1632 1593 1630 1631 1632 1596 1633 1634 1635 1599 1636 1637 1638 1602 1639 1640 1641 1602 1639 1640 1641 1605 1642 1643 1644 1608 1645 1646 1647 1611 1648 1649 1650 1614 1651 1652 1653 1617 1654 1655 1656 1620 1657 1658 1659 1623 1660 1661 1662 1623 1660 1661 1662 1626 1663 1664 1665 1629 1666 1667 1668 1632 1669 1670 1671 1632 1669 1670 1671 1635 1672 1673 1674 1638 1675 1676 1677 1641 1678 1679 1680 1641 1678 1679 1680 1644 1681 1682 1683 1647 1684 1685 1686 1650 1687 1688 1689 1653 1690 1691 1692 1656 1693 1694 1695 1659 1696 1697 1698 1662 1699 1700 1701 1662 1699 1700 1701 1665 1702 1703 1704 1668 1705 1706 1707 1671 1708 1709 1710 1671 1708 1709 1710 1674 1711 1712 1713 1677 1714 1715 1716 1680 1717 1718 1719 1680 1717 1718 1719 1683 1720 1721 1722 1686 1723 1724 1725 1689 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1732 1781 1782 1783 1736 1784 1785 1786 1740 1787 1788 1789 1744 1790 1791 1792 1744 1790 1791 1792 1748 1793 1794 1795 1752 1796 1797 1798 1756 1799 1800 1801 1756 1799 1800 1801 1760 1802 1803 1804 1764 1805 1806 1807 1768 1808 1809 1810 1768 1808 1809 1810 1772 1811 1812 1813 1776 1814 1815 1816 1780 1817 1818 1819 1783 1820 1821 1822 1786 1823 1824 1825 1789 1826 1827 1828 1792 1829 1830 1831 1792 1829 1830 1831 1795 1832 1833 1834 1798 1835 1836 1837 1801 1838 1839 1840 1801 1838 1839 1840 1804 1841 1842 1843 1807 1844 1845 1846 1810 1847 1848 1849 1810 1847 1848 1849 1813 1850 1851 1852 1816 1853 1854 1855 1819 1856 1857 1858 1822 1859 1860 1861 1825 1862 1863 1864 1828 1865 1866 1867 1831 1868 1869 1870 1831 1868 1869 1870 1834 1871 1872 1873 1837 1874 1875 1876 1840 1877 1878 1879 1840 1877 1878 1879 1843 1880 1881 1882 1846 1883 1884 1885 1849 1886 1887 1888 1849 1886 1887 1888 1852 1889 1890 1891 1855 1892 1893 1894 1858 1895 1896 1897 1861 1898 1899 1900 1864 1901 1902 1903 1867 1904 1905 1906 1870 1907 1908 1909 1870 1907 1908 1909 1873 1910 1911 1912 1876 1913 1914 1915 1879 1916 1917 1918 1879 1916 1917 1918 1882 1919 1920 1921 1885 1922 1923 1924 1888 1925 1926 1927 1888 1925 1926 1927 1891 1928 1929 1930 1894 1931 1932 1933 1897 1934 1935 1936 1900 1937 1938 1939 1903 1940 1941 1942 1906 1943 1944 1945 1909 1946 1947 1948 1909 1946 1947 1948 1912 1949 1950 1951 1915 1952 1953 1954 1918 1955 1956 1957 1918 1955 1956 1957 1921 1958 1959 1960 1924 1961 1962 1963 1927 1964 1965 1966 1927 1964 1965 1966 1930 1967 1968 1969 1933 1970 1971 1972 1936 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 1979 2028 2029 2030 1983 2031 2032 2033 1987 2034 2035 2036 1991 2037 2038 2039 1991 2037 2038 2039 1995 2040 2041 2042 1999 2043 2044 2045 2003 2046 2047 2048 2003 2046 2047 2048 2007 2049 2050 2051 2011 2052 2053 2054 2015 2055 2056 2057 2015 2055 2056 2057 2019 2058 2059 2060 2023 2061 2062 2063 2027 2064 2065 2066 2030 2067 2068 2069 2033 2070 2071 2072 2036 2073 2074 2075 2039 2076 2077 2078 2039 2076 2077 2078 2042 2079 2080 2081 2045 2082 2083 2084 2048 2085 2086 2087 2048 2085 2086 2087 2051 2088 2089 2090 2054 2091 2092 2093 2057 2094 2095 2096 2057 2094 2095 2096 2060 2097 2098 2099 2063 2100 2101 2102 2066 2103 2104 2105 2069 2106 2107 2108 2072 2109 2110 2111 2075 2112 2113 2114 2078 2115 2116 2117 2078 2115 2116 2117 2081 2118 2119 2120 2084 2121 2122 2123 2087 2124 2125 2126 2087 2124 2125 2126 2090 2127 2128 2129 2093 2130 2131 2132 2096 2133 2134 2135 2096 2133 2134 2135 2099 2136 2137 2138 2102 2139 2140 2141 2105 2142 2143 2144 2108 2145 2146 2147 2111 2148 2149 2150 2114 2151 2152 2153 2117 2154 2155 2156 2117 2154 2155 2156 2120 2157 2158 2159 2123 2160 2161 2162 2126 2163 2164 2165 2126 2163 2164 2165 2129 2166 2167 2168 2132 2169 2170 2171 2135 2172 2173 2174 2135 2172 2173 2174 2138 2175 2176 2177 2141 2178 2179 2180 2144 2181 2182 2183 2147 2184 2185 2186 2150 2187 2188 2189 2153 2190 2191 2192 2156 2193 2194 2195 2156 2193 2194 2195 2159 2196 2197 2198 2162 2199 2200 2201 2165 2202 2203 2204 2165 2202 2203 2204 2168 2205 2206 2207 2171 2208 2209 2210 2174 2211 2212 2213 2174 2211 2212 2213 2177 2214 2215 2216 2180 2217 2218 2219 2183 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2226 2275 2276 2277 2230 2278 2279 2280 2234 2281 2282 2283 2238 2284 2285 2286 2238 2284 2285 2286 2242 2287 2288 2289 2246 2290 2291 2292 2250 2293 2294 2295 2250 2293 2294 2295 2254 2296 2297 2298 2258 2299 2300 2301 2262 2302 2303 2304 2262 2302 2303 2304 2266 2305 2306 2307 2270 2308 2309 2310 2274 2311 2312 2313 2277 2314 2315 2316 2280 2317 2318 2319 2283 2320 2321 2322 2286 2323 2324 2325 2286 2323 2324 2325 2289 2326 2327 2328 2292 2329 2330 2331 2295 2332 2333 2334 2295 2332 2333 2334 2298 2335 2336 2337 2301 2338 2339 2340 2304 2341 2342 2343 2304 2341 2342 2343 2307 2344 2345 2346 2310 2347 2348 2349 2313 2350 2351 2352 2316 2353 2354 2355 2319 2356 2357 2358 2322 2359 2360 2361 2325 2362 2363 2364 2325 2362 2363 2364 2328 2365 2366 2367 2331 2368 2369 2370 2334 2371 2372 2373 2334 2371 2372 2373 2337 2374 2375 2376 2340 2377 2378 2379 2343 2380 2381 2382 2343 2380 2381 2382 2346 2383 2384 2385 2349 2386 2387 2388 2352 2389 2390 2391 2355 2392 2393 2394 2358 2395 2396 2397 2361 2398 2399 2400 2364 2401 2402 2403 2364 2401 2402 2403 2367 2404 2405 2406 2370 2407 2408 2409 2373 2410 2411 2412 2373 2410 2411 2412 2376 2413 2414 2415 2379 2416 2417 2418 2382 2419 2420 2421 2382 2419 2420 2421 2385 2422 2423 2424 2388 2425 2426 2427 2391 2428 2429 2430 2394 2431 2432 2433 2397 2434 2435 2436 2400 2437 2438 2439 2403 2440 2441 2442 2403 2440 2441 2442 2406 2443 2444 2445 2409 2446 2447 2448 2412 2449 2450 2451 2412 2449 2450 2451 2415 2452 2453 2454 2418 2455 2456 2457 2421 2458 2459 2460 2421 2458 2459 2460 2424 2461 2462 2463 2427 2464 2465 2466 2430 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2473 2522 2523 2524 2477 2525 2526 2527 2481 2528 2529 2530 2485 2531 2532 2533 2485 2531 2532 2533 2489 2534 2535 2536 2493 2537 2538 2539 2497 2540 2541 2542 2497 2540 2541 2542 2501 2543 2544 2545 2505 2546 2547 2548 2509 2549 2550 2551 2509 2549 2550 2551 2513 2552 2553 2554 2517 2555 2556 2557 2521 2558 2559 2560 2524 2561 2562 2563 2527 2564 2565 2566 2530 2567 2568 2569 2533 2570 2571 2572 2533 2570 2571 2572 2536 2573 2574 2575 2539 2576 2577 2578 2542 2579 2580 2581 2542 2579 2580 2581 2545 2582 2583 2584 2548 2585 2586 2587 2551 2588 2589 2590 2551 2588 2589 2590 2554 2591 2592 2593 2557 2594 2595 2596 2560 2597 2598 2599 2563 2600 2601 2602 2566 2603 2604 2605 2569 2606 2607 2608 2572 2609 2610 2611 2572 2609 2610 2611 2575 2612 2613 2614 2578 2615 2616 2617 2581 2618 2619 2620 2581 2618 2619 2620 2584 2621 2622 2623 2587 2624 2625 2626 2590 2627 2628 2629 2590 2627 2628 2629 2593 2630 2631 2632 2596 2633 2634 2635 2599 2636 2637 2638 2602 2639 2640 2641 2605 2642 2643 2644 2608 2645 2646 2647 2611 2648 2649 2650 2611 2648 2649 2650 2614 2651 2652 2653 2617 2654 2655 2656 2620 2657 2658 2659 2620 2657 2658 2659 2623 2660 2661 2662 2626 2663 2664 2665 2629 2666 2667 2668 2629 2666 2667 2668 2632 2669 2670 2671 2635 2672 2673 2674 2638 2675 2676 2677 2641 2678 2679 2680 2644 2681 2682 2683 2647 2684 2685 2686 2650 2687 2688 2689 2650 2687 2688 2689 2653 2690 2691 2692 2656 2693 2694 2695 2659 2696 2697 2698 2659 2696 2697 2698 2662 2699 2700 2701 2665 2702 2703 2704 2668 2705 2706 2707 2668 2705 2706 2707 2671 2708 2709 2710 2674 2711 2712 2713 2677 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2720 2769 2770 2771 2724 2772 2773 2774 2728 2775 2776 2777 2732 2778 2779 2780 2732 2778 2779 2780 2736 2781 2782 2783 2740 2784 2785 2786 2744 2787 2788 2789 2744 2787 2788 2789 2748 2790 2791 2792 2752 2793 2794 2795 2756 2796 2797 2798 2756 2796 2797 2798 2760 2799 2800 2801 2764 2802 2803 2804 2768 2805 2806 2807 2771 2808 2809 2810 2774 2811 2812 2813 2777 2814 2815 2816 2780 2817 2818 2819 2780 2817 2818 2819 2783 2820 2821 2822 2786 2823 2824 2825 2789 2826 2827 2828 2789 2826 2827 2828 2792 2829 2830 2831 2795 2832 2833 2834 2798 2835 2836 2837 2798 2835 2836 2837 2801 2838 2839 2840 2804 2841 2842 2843 2807 2844 2845 2846 2810 2847 2848 2849 2813 2850 2851 2852 2816 2853 2854 2855 2819 2856 2857 2858 2819 2856 2857 2858 2822 2859 2860 2861 2825 2862 2863 2864 2828 2865 2866 2867 2828 2865 2866 2867 2831 2868 2869 2870 2834 2871 2872 2873 2837 2874 2875 2876 2837 2874 2875 2876 2840 2877 2878 2879 2843 2880 2881 2882 2846 2883 2884 2885 2849 2886 2887 2888 2852 2889 2890 2891 2855 2892 2893 2894 2858 2895 2896 2897 2858 2895 2896 2897 2861 2898 2899 2900 2864 2901 2902 2903 2867 2904 2905 2906 2867 2904 2905 2906 2870 2907 2908 2909 2873 2910 2911 2912 2876 2913 2914 2915 2876 2913 2914 2915 2879 2916 2917 2918 2882 2919 2920 2921 2885 2922 2923 2924 2888 2925 2926 2927 2891 2928 2929 2930 2894 2931 2932 2933 2897 2934 2935 2936 2897 2934 2935 2936 2900 2937 2938 2939 2903 2940 2941 2942 2906 2943 2944 2945 2906 2943 2944 2945 2909 2946 2947 2948 2912 2949 2950 2951 2915 2952 2953 2954 2915 2952 2953 2954 2918 2955 2956 2957 2921 2958 2959 2960 2924 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 2967 3016 3017 3018 2971 3019 3020 3021 2975 3022 3023 3024 2979 3025 3026 3027 2979 3025 3026 3027 2983 3028 3029 3030 2987 3031 3032 3033 2991 3034 3035 3036 2991 3034 3035 3036 2995 3037 3038 3039 2999 3040 3041 3042 3003 3043 3044 3045 3003 3043 3044 3045 3007 3046 3047 3048 3011 3049 3050 3051 3015 3052 3053 3054 3018 3055 3056 3057 3021 3058 3059 3060 3024 3061 3062 3063 3027 3064 3065 3066 3027 3064 3065 3066 3030 3067 3068 3069 3033 3070 3071 3072 3036 3073 3074 3075 3036 3073 3074 3075 3039 3076 3077 3078 3042 3079 3080 3081 3045 3082 3083 3084 3045 3082 3083 3084 3048 3085 3086 3087 3051 3088 3089 3090 3054 3091 3092 3093 3057 3094 3095 3096 3060 3097 3098 3099 3063 3100 3101 3102 3066 3103 3104 3105 3066 3103 3104 3105 3069 3106 3107 3108 3072 3109 3110 3111 3075 3112 3113 3114 3075 3112 3113 3114 3078 3115 3116 3117 3081 3118 3119 3120 3084 3121 3122 3123 3084 3121 3122 3123 3087 3124 3125 3126 3090 3127 3128 3129 3093 3130 3131 3132 3096 3133 3134 3135 3099 3136 3137 3138 3102 3139 3140 3141 3105 3142 3143 3144 3105 3142 3143 3144 3108 3145 3146 3147 3111 3148 3149 3150 3114 3151 3152 3153 3114 3151 3152 3153 3117 3154 3155 3156 3120 3157 3158 3159 3123 3160 3161 3162 3123 3160 3161 3162 3126 3163 3164 3165 3129 3166 3167 3168 3132 3169 3170 3171 3135 3172 3173 3174 3138 3175 3176 3177 3141 3178 3179 3180 3144 3181 3182 3183 3144 3181 3182 3183 3147 3184 3185 3186 3150 3187 3188 3189 3153 3190 3191 3192 3153 3190 3191 3192 3156 3193 3194 3195 3159 3196 3197 3198 3162 3199 3200 3201 3162 3199 3200 3201 3165 3202 3203 3204 3168 3205 3206 3207 3171 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3214 3263 3264 3265 3218 3266 3267 3268 3222 3269 3270 3271 3226 3272 3273 3274 3226 3272 3273 3274 3230 3275 3276 3277 3234 3278 3279 3280 3238 3281 3282 3283 3238 3281 3282 3283 3242 3284 3285 3286 3246 3287 3288 3289 3250 3290 3291 3292 3250 3290 3291 3292 3254 3293 3294 3295 3258 3296 3297 3298 3262 3299 3300 3301 3265 3302 3303 3304 3268 3305 3306 3307 3271 3308 3309 3310 3274 3311 3312 3313 3274 3311 3312 3313 3277 3314 3315 3316 3280 3317 3318 3319 3283 3320 3321 3322 3283 3320 3321 3322 3286 3323 3324 3325 3289 3326 3327 3328 3292 3329 3330 3331 3292 3329 3330 3331 3295 3332 3333 3334 3298 3335 3336 3337 3301 3338 3339 3340 3304 3341 3342 3343 3307 3344 3345 3346 3310 3347 3348 3349 3313 3350 3351 3352 3313 3350 3351 3352 3316 3353 3354 3355 3319 3356 3357 3358 3322 3359 3360 3361 3322 3359 3360 3361 3325 3362 3363 3364 3328 3365 3366 3367 3331 3368 3369 3370 3331 3368 3369 3370 3334 3371 3372 3373 3337 3374 3375 3376 3340 3377 3378 3379 3343 3380 3381 3382 3346 3383 3384 3385 3349 3386 3387 3388 3352 3389 3390 3391 3352 3389 3390 3391 3355 3392 3393 3394 3358 3395 3396 3397 3361 3398 3399 3400 3361 3398 3399 3400 3364 3401 3402 3403 3367 3404 3405 3406 3370 3407 3408 3409 3370 3407 3408 3409 3373 3410 3411 3412 3376 3413 3414 3415 3379 3416 3417 3418 3382 3419 3420 3421 3385 3422 3423 3424 3388 3425 3426 3427 3391 3428 3429 3430 3391 3428 3429 3430 3394 3431 3432 3433 3397 3434 3435 3436 3400 3437 3438 3439 3400 3437 3438 3439 3403 3440 3441 3442 3406 3443 3444 3445 3409 3446 3447 3448 3409 3446 3447 3448 3412 3449 3450 3451 3415 3452 3453 3454 3418 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3461 3510 3511 3512 3465 3513 3514 3515 3469 3516 3517 3518 3473 3519 3520 3521 3473 3519 3520 3521 3477 3522 3523 3524 3481 3525 3526 3527 3485 3528 3529 3530 3485 3528 3529 3530 3489 3531 3532 3533 3493 3534 3535 3536 3497 3537 3538 3539 3497 3537 3538 3539 3501 3540 3541 3542 3505 3543 3544 3545 3509 3546 3547 3548 3512 3549 3550 3551 3515 3552 3553 3554 3518 3555 3556 3557 3521 3558 3559 3560 3521 3558 3559 3560 3524 3561 3562 3563 3527 3564 3565 3566 3530 3567 3568 3569 3530 3567 3568 3569 3533 3570 3571 3572 3536 3573 3574 3575 3539 3576 3577 3578 3539 3576 3577 3578 3542 3579 3580 3581 3545 3582 3583 3584 3548 3585 3586 3587 3551 3588 3589 3590 3554 3591 3592 3593 3557 3594 3595 3596 3560 3597 3598 3599 3560 3597 3598 3599 3563 3600 3601 3602 3566 3603 3604 3605 3569 3606 3607 3608 3569 3606 3607 3608 3572 3609 3610 3611 3575 3612 3613 3614 3578 3615 3616 3617 3578 3615 3616 3617 3581 3618 3619 3620 3584 3621 3622 3623 3587 3624 3625 3626 3590 3627 3628 3629 3593 3630 3631 3632 3596 3633 3634 3635 3599 3636 3637 3638 3599 3636 3637 3638 3602 3639 3640 3641 3605 3642 3643 3644 3608 3645 3646 3647 3608 3645 3646 3647 3611 3648 3649 3650 3614 3651 3652 3653 3617 3654 3655 3656 3617 3654 3655 3656 3620 3657 3658 3659 3623 3660 3661 3662 3626 3663 3664 3665 3629 3666 3667 3668 3632 3669 3670 3671 3635 3672 3673 3674 3638 3675 3676 3677 3638 3675 3676 3677 3641 3678 3679 3680 3644 3681 3682 3683 3647 3684 3685 3686 3647 3684 3685 3686 3650 3687 3688 3689 3653 3690 3691 3692 3656 3693 3694 3695 3656 3693 3694 3695 3659 3696 3697 3698 3662 3699 3700 3701 3665 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3708 3757 3758 3759 3712 3760 3761 3762 3716 3763 3764 3765 3720 3766 3767 3768 3720 3766 3767 3768 3724 3769 3770 3771 3728 3772 3773 3774 3732 3775 3776 3777 3732 3775 3776 3777 3736 3778 3779 3780 3740 3781 3782 3783 3744 3784 3785 3786 3744 3784 3785 3786 3748 3787 3788 3789 3752 3790 3791 3792 3756 3793 3794 3795 3759 3796 3797 3798 3762 3799 3800 3801 3765 3802 3803 3804 3768 3805 3806 3807 3768 3805 3806 3807 3771 3808 3809 3810 3774 3811 3812 3813 3777 3814 3815 3816 3777 3814 3815 3816 3780 3817 3818 3819 3783 3820 3821 3822 3786 3823 3824 3825 3786 3823 3824 3825 3789 3826 3827 3828 3792 3829 3830 3831 3795 3832 3833 3834 3798 3835 3836 3837 3801 3838 3839 3840 3804 3841 3842 3843 3807 3844 3845 3846 3807 3844 3845 3846 3810 3847 3848 3849 3813 3850 3851 3852 3816 3853 3854 3855 3816 3853 3854 3855 3819 3856 3857 3858 3822 3859 3860 3861 3825 3862 3863 3864 3825 3862 3863 3864 3828 3865 3866 3867 3831 3868 3869 3870 3834 3871 3872 3873 3837 3874 3875 3876 3840 3877 3878 3879 3843 3880 3881 3882 3846 3883 3884 3885 3846 3883 3884 3885 3849 3886 3887 3888 3852 3889 3890 3891 3855 3892 3893 3894 3855 3892 3893 3894 3858 3895 3896 3897 3861 3898 3899 3900 3864 3901 3902 3903 3864 3901 3902 3903 3867 3904 3905 3906 3870 3907 3908 3909 3873 3910 3911 3912 3876 3913 3914 3915 3879 3916 3917 3918 3882 3919 3920 3921 3885 3922 3923 3924 3885 3922 3923 3924 3888 3925 3926 3927 3891 3928 3929 3930 3894 3931 3932 3933 3894 3931 3932 3933 3897 3934 3935 3936 3900 3937 3938 3939 3903 3940 3941 3942 3903 3940 3941 3942 3906 3943 3944 3945 3909 3946 3947 3948 3912 3949 3950 3951</patch_points>\n\t\t</bicubic_patches>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.SurfacePlot.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-10 -10 -0.0049686621325942962 -8.6666666666666661 -10 0.7859378326604175 -7.333333333333333 -10 0.9863107581363878 -6 -10 0.61810479460960044 -4.666666666666667 -10 0.039712171795332069 -3.3333333333333339 -10 -0.43914677581341455 -1.9999999999999996 -10 -0.71563671306021792 -0.66666666666666652 -10 -0.82678985504151004 0.66666666666666652 -10 -0.82678985504151004 1.9999999999999996 -10 -0.71563671306021792 3.3333333333333326 -10 -0.43914677581341455 4.6666666666666661 -10 0.039712171795332069 6.0000000000000009 -10 0.61810479460960044 7.3333333333333339 -10 0.9863107581363878 8.6666666666666679 -10 0.78593783266041639 10 -10 -0.0049686621325942962 -10 -8.6666666666666661 0.7859378326604175 -8.6666666666666661 -8.6666666666666661 0.95237838071495518 -7.333333333333333 -8.6666666666666661 0.34979283181478471 -6 -8.6666666666666661 -0.43914677581341455 -4.666666666666667 -8.6666666666666661 -0.91372498661561519 -3.3333333333333339 -8.6666666666666661 -0.9903292873187024 -1.9999999999999996 -8.6666666666666661 -0.86263754129496528 -0.66666666666666652 -8.6666666666666661 -0.74349949316655095 0.66666666666666652 -8.6666666666666661 -0.74349949316655095 1.9999999999999996 -8.6666666666666661 -0.86263754129496528 3.3333333333333326 -8.6666666666666661 -0.9903292873187024 4.6666666666666661 -8.6666666666666661 -0.91372498661561519 6.0000000000000009 -8.6666666666666661 -0.43914677581341455 7.3333333333333339 -8.6666666666666661 0.34979283181478638 8.6666666666666679 -8.6666666666666661 0.95237838071495573 10 -8.6666666666666661 0.7859378326604175 -10 -7.333333333333333 0.9863107581363878 -8.6666666666666661 -7.333333333333333 0.34979283181478471 -7.333333333333333 -7.333333333333333 -0.5848335412658211 -6 -7.333333333333333 -0.99873342904976703 -4.666666666666667 -7.333333333333333 -0.74349949316655206 -3.3333333333333339 -7.333333333333333 -0.20002393403351232 -1.9999999999999996 -7.333333333333333 0.25012768831612076 -0.66666666666666652 -7.333333333333333 0.47098550780256371 0.66666666666666652 -7.333333333333333 0.47098550780256371 1.9999999999999996 -7.333333333333333 0.25012768831612076 3.3333333333333326 -7.333333333333333 -0.20002393403351232 4.6666666666666661 -7.333333333333333 -0.74349949316655095 6.0000000000000009 -7.333333333333333 -0.99873342904976703 7.3333333333333339 -7.333333333333333 -0.5848335412658211 8.6666666666666679 -7.333333333333333 0.34979283181478804 10 -7.333333333333333 0.9863107581363878 -10 -6 0.61810479460960044 -8.6666666666666661 -6 -0.43914677581341455 -7.333333333333333 -6 -0.99873342904976703 -6 -6 -0.59019448590527523 -4.666666666666667 -6 0.25012768831611992 -3.3333333333333339 -6 0.83615117150490958 -1.9999999999999996 -6 0.99914438304692954 -0.66666666666666652 -6 0.96983047525631183 0.66666666666666652 -6 0.96983047525631183 1.9999999999999996 -6 0.99914438304692954 3.3333333333333326 -6 0.83615117150491014 4.6666666666666661 -6 0.25012768831612076 6.0000000000000009 -6 -0.59019448590527668 7.3333333333333339 -6 -0.99873342904976703 8.6666666666666679 -6 -0.43914677581341294 10 -6 0.61810479460960044 -10 -4.666666666666667 0.039712171795332069 -8.6666666666666661 -4.666666666666667 -0.91372498661561519 -7.333333333333333 -4.666666666666667 -0.74349949316655206 -6 -4.666666666666667 0.25012768831611992 -4.666666666666667 -4.666666666666667 0.95033743684901006 -3.3333333333333339 -4.666666666666667 0.85341092197465174 -1.9999999999999996 -4.666666666666667 0.35675600746872033 -0.66666666666666652 -4.666666666666667 0.001656226768430495 0.66666666666666652 -4.666666666666667 0.001656226768430495 1.9999999999999996 -4.666666666666667 0.35675600746872033 3.3333333333333326 -4.666666666666667 0.85341092197465129 4.6666666666666661 -4.666666666666667 0.9503374368490104 6.0000000000000009 -4.666666666666667 0.25012768831611903 7.3333333333333339 -4.666666666666667 -0.74349949316655206 8.6666666666666679 -4.666666666666667 -0.91372498661561452 10 -4.666666666666667 0.039712171795332069 -10 -3.3333333333333339 -0.43914677581341455 -8.6666666666666661 -3.3333333333333339 -0.9903292873187024 -7.333333333333333 -3.3333333333333339 -0.20002393403351232 -6 -3.3333333333333339 0.83615117150490958 -4.666666666666667 -3.3333333333333339 0.85341092197465174 -3.3333333333333339 -3.3333333333333339 0.0016562267684313832 -1.9999999999999996 -3.3333333333333339 -0.73460730050677037 -0.66666666666666652 -3.3333333333333339 -0.96696502241116189 0.66666666666666652 -3.3333333333333339 -0.96696502241116189 1.9999999999999996 -3.3333333333333339 -0.73460730050677037 3.3333333333333326 -3.3333333333333339 0.001656226768430495 4.6666666666666661 -3.3333333333333339 0.85341092197465129 6.0000000000000009 -3.3333333333333339 0.83615117150490914 7.3333333333333339 -3.3333333333333339 -0.20002393403351407 8.6666666666666679 -3.3333333333333339 -0.99032928731870262 10 -3.3333333333333339 -0.43914677581341455 -10 -1.9999999999999996 -0.71563671306021792 -8.6666666666666661 -1.9999999999999996 -0.86263754129496528 -7.333333333333333 -1.9999999999999996 0.25012768831612076 -6 -1.9999999999999996 0.99914438304692954 -4.666666666666667 -1.9999999999999996 0.35675600746872033 -3.3333333333333339 -1.9999999999999996 -0.73460730050677037 -1.9999999999999996 -1.9999999999999996 -0.95136312812584722 -0.66666666666666652 -1.9999999999999996 -0.51189457531222582 0.66666666666666652 -1.9999999999999996 -0.51189457531222582 1.9999999999999996 -1.9999999999999996 -0.95136312812584722 3.3333333333333326 -1.9999999999999996 -0.73460730050677125 4.6666666666666661 -1.9999999999999996 0.35675600746872033 6.0000000000000009 -1.9999999999999996 0.99914438304692954 7.3333333333333339 -1.9999999999999996 0.25012768831611992 8.6666666666666679 -1.9999999999999996 -0.86263754129496617 10 -1.9999999999999996 -0.71563671306021792 -10 -0.66666666666666652 -0.82678985504151004 -8.6666666666666661 -0.66666666666666652 -0.74349949316655095 -7.333333333333333 -0.66666666666666652 0.47098550780256371 -6 -0.66666666666666652 0.96983047525631183 -4.666666666666667 -0.66666666666666652 0.001656226768430495 -3.3333333333333339 -0.66666666666666652 -0.96696502241116189 -1.9999999999999996 -0.66666666666666652 -0.51189457531222582 -0.66666666666666652 -0.66666666666666652 0.58751723680746504 0.66666666666666652 -0.66666666666666652 0.58751723680746504 1.9999999999999996 -0.66666666666666652 -0.51189457531222582 3.3333333333333326 -0.66666666666666652 -0.96696502241116222 4.6666666666666661 -0.66666666666666652 0.0016562267684296068 6.0000000000000009 -0.66666666666666652 0.96983047525631227 7.3333333333333339 -0.66666666666666652 0.4709855078025621 8.6666666666666679 -0.66666666666666652 -0.74349949316655206 10 -0.66666666666666652 -0.82678985504151004 -10 0.66666666666666652 -0.82678985504151004 -8.6666666666666661 0.66666666666666652 -0.74349949316655095 -7.333333333333333 0.66666666666666652 0.47098550780256371 -6 0.66666666666666652 0.96983047525631183 -4.666666666666667 0.66666666666666652 0.001656226768430495 -3.3333333333333339 0.66666666666666652 -0.96696502241116189 -1.9999999999999996 0.66666666666666652 -0.51189457531222582 -0.66666666666666652 0.66666666666666652 0.58751723680746504 0.66666666666666652 0.66666666666666652 0.58751723680746504 1.9999999999999996 0.66666666666666652 -0.51189457531222582 3.3333333333333326 0.66666666666666652 -0.96696502241116222 4.6666666666666661 0.66666666666666652 0.0016562267684296068 6.0000000000000009 0.66666666666666652 0.96983047525631227 7.3333333333333339 0.66666666666666652 0.4709855078025621 8.6666666666666679 0.66666666666666652 -0.74349949316655206 10 0.66666666666666652 -0.82678985504151004 -10 1.9999999999999996 -0.71563671306021792 -8.6666666666666661 1.9999999999999996 -0.86263754129496528 -7.333333333333333 1.9999999999999996 0.25012768831612076 -6 1.9999999999999996 0.99914438304692954 -4.666666666666667 1.9999999999999996 0.35675600746872033 -3.3333333333333339 1.9999999999999996 -0.73460730050677037 -1.9999999999999996 1.9999999999999996 -0.95136312812584722 -0.66666666666666652 1.9999999999999996 -0.51189457531222582 0.66666666666666652 1.9999999999999996 -0.51189457531222582 1.9999999999999996 1.9999999999999996 -0.95136312812584722 3.3333333333333326 1.9999999999999996 -0.73460730050677125 4.6666666666666661 1.9999999999999996 0.35675600746872033 6.0000000000000009 1.9999999999999996 0.99914438304692954 7.3333333333333339 1.9999999999999996 0.25012768831611992 8.6666666666666679 1.9999999999999996 -0.86263754129496617 10 1.9999999999999996 -0.71563671306021792 -10 3.3333333333333326 -0.43914677581341455 -8.6666666666666661 3.3333333333333326 -0.9903292873187024 -7.333333333333333 3.3333333333333326 -0.20002393403351232 -6 3.3333333333333326 0.83615117150491014 -4.666666666666667 3.3333333333333326 0.85341092197465129 -3.3333333333333339 3.3333333333333326 0.001656226768430495 -1.9999999999999996 3.3333333333333326 -0.73460730050677125 -0.66666666666666652 3.3333333333333326 -0.96696502241116222 0.66666666666666652 3.3333333333333326 -0.96696502241116222 1.9999999999999996 3.3333333333333326 -0.73460730050677125 3.3333333333333326 3.3333333333333326 0.0016562267684287187 4.6666666666666661 3.3333333333333326 0.85341092197465085 6.0000000000000009 3.3333333333333326 0.83615117150490958 7.3333333333333339 3.3333333333333326 -0.20002393403351232 8.6666666666666679 3.3333333333333326 -0.99032928731870262 10 3.3333333333333326 -0.43914677581341455 -10 4.6666666666666661 0.039712171795332069 -8.6666666666666661 4.6666666666666661 -0.91372498661561519 -7.333333333333333 4.6666666666666661 -0.74349949316655095 -6 4.6666666666666661 0.25012768831612076 -4.666666666666667 4.6666666666666661 0.9503374368490104 -3.3333333333333339 4.6666666666666661 0.85341092197465129 -1.9999999999999996 4.6666666666666661 0.35675600746872033 -0.66666666666666652 4.6666666666666661 0.0016562267684296068 0.66666666666666652 4.6666666666666661 0.0016562267684296068 1.9999999999999996 4.6666666666666661 0.35675600746872033 3.3333333333333326 4.6666666666666661 0.85341092197465085 4.6666666666666661 4.6666666666666661 0.95033743684901062 6.0000000000000009 4.6666666666666661 0.25012768831611992 7.3333333333333339 4.6666666666666661 -0.74349949316655206 8.6666666666666679 4.6666666666666661 -0.91372498661561452 10 4.6666666666666661 0.039712171795332069 -10 6.0000000000000009 0.61810479460960044 -8.6666666666666661 6.0000000000000009 -0.43914677581341455 -7.333333333333333 6.0000000000000009 -0.99873342904976703 -6 6.0000000000000009 -0.59019448590527668 -4.666666666666667 6.0000000000000009 0.25012768831611903 -3.3333333333333339 6.0000000000000009 0.83615117150490914 -1.9999999999999996 6.0000000000000009 0.99914438304692954 -0.66666666666666652 6.0000000000000009 0.96983047525631227 0.66666666666666652 6.0000000000000009 0.96983047525631227 1.9999999999999996 6.0000000000000009 0.99914438304692954 3.3333333333333326 6.0000000000000009 0.83615117150490958 4.6666666666666661 6.0000000000000009 0.25012768831611992 6.0000000000000009 6.0000000000000009 -0.59019448590527668 7.3333333333333339 6.0000000000000009 -0.99873342904976692 8.6666666666666679 6.0000000000000009 -0.43914677581341294 10 6.0000000000000009 0.61810479460960044 -10 7.3333333333333339 0.9863107581363878 -8.6666666666666661 7.3333333333333339 0.34979283181478638 -7.333333333333333 7.3333333333333339 -0.5848335412658211 -6 7.3333333333333339 -0.99873342904976703 -4.666666666666667 7.3333333333333339 -0.74349949316655206 -3.3333333333333339 7.3333333333333339 -0.20002393403351407 -1.9999999999999996 7.3333333333333339 0.25012768831611992 -0.66666666666666652 7.3333333333333339 0.4709855078025621 0.66666666666666652 7.3333333333333339 0.4709855078025621 1.9999999999999996 7.3333333333333339 0.25012768831611992 3.3333333333333326 7.3333333333333339 -0.20002393403351232 4.6666666666666661 7.3333333333333339 -0.74349949316655206 6.0000000000000009 7.3333333333333339 -0.99873342904976692 7.3333333333333339 7.3333333333333339 -0.58483354126581966 8.6666666666666679 7.3333333333333339 0.34979283181478804 10 7.3333333333333339 0.9863107581363878 -10 8.6666666666666679 0.78593783266041639 -8.6666666666666661 8.6666666666666679 0.95237838071495573 -7.333333333333333 8.6666666666666679 0.34979283181478804 -6 8.6666666666666679 -0.43914677581341294 -4.666666666666667 8.6666666666666679 -0.91372498661561452 -3.3333333333333339 8.6666666666666679 -0.99032928731870262 -1.9999999999999996 8.6666666666666679 -0.86263754129496617 -0.66666666666666652 8.6666666666666679 -0.74349949316655206 0.66666666666666652 8.6666666666666679 -0.74349949316655206 1.9999999999999996 8.6666666666666679 -0.86263754129496617 3.3333333333333326 8.6666666666666679 -0.99032928731870262 4.6666666666666661 8.6666666666666679 -0.91372498661561452 6.0000000000000009 8.6666666666666679 -0.43914677581341294 7.3333333333333339 8.6666666666666679 0.34979283181478804 8.6666666666666679 8.6666666666666679 0.95237838071495629 10 8.6666666666666679 0.78593783266041639 -10 10 -0.0049686621325942962 -8.6666666666666661 10 0.7859378326604175 -7.333333333333333 10 0.9863107581363878 -6 10 0.61810479460960044 -4.666666666666667 10 0.039712171795332069 -3.3333333333333339 10 -0.43914677581341455 -1.9999999999999996 10 -0.71563671306021792 -0.66666666666666652 10 -0.82678985504151004 0.66666666666666652 10 -0.82678985504151004 1.9999999999999996 10 -0.71563671306021792 3.3333333333333326 10 -0.43914677581341455 4.6666666666666661 10 0.039712171795332069 6.0000000000000009 10 0.61810479460960044 7.3333333333333339 10 0.9863107581363878 8.6666666666666679 10 0.78593783266041639 10 10 -0.0049686621325942962</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 76 81 82 83 80 85 86 87 84 89 90 91 88 93 94 95 92 97 98 99 96 101 102 103 100 105 106 107 104 109 110 111 108 113 114 115 112 117 118 119 116 121 122 123 120 125 126 127 124 129 130 131 128 133 134 135 132 137 138 139 136 141 142 143 140 145 146 147 144 149 150 151 148 153 154 155 152 157 158 159 156 161 162 163 160 165 166 167 164 169 170 171 168 173 174 175 172 177 178 179 176 181 182 183 180 185 186 187 184 189 190 191 188 193 194 195 192 197 198 199 196 201 202 203 200 205 206 207 204 209 210 211 208 213 214 215 212 217 218 219 216 221 222 223 220 225 226 227 224 229 230 231 228 233 234 235 232 237 238 239 236 241 242 243 240 245 246 247 244 249 250 251 248 253 254 255 252 257 258 259 256 261 262 263 260 265 266 267 264 269 270 271 268 273 274 275 272 277 278 279 276 281 282 283 280 285 286 287 284 289 290 291 288 293 294 295 292 297 298 299 296 301 302 303 300 305 306 307 304 309 310 311 308 313 314 315 312 317 318 319 316 321 322 323 320 325 326 327 324 329 330 331 328 333 334 335 332 337 338 339 336 341 342 343 340 345 346 347 344 349 350 351 348 353 354 355 352 357 358 359 356 361 362 363 360 365 366 367 364 369 370 371 368 373 374 375 372 377 378 379 376 381 382 383 380 385 386 387 384 389 390 391 388 393 394 395 392 397 398 399 396 401 402 403 400 405 406 407 404 409 410 411 408 413 414 415 412 417 418 419 416 421 422 423 420 425 426 427 424 429 430 431 428 433 434 435 432 437 438 439 436 441 442 443 440 445 446 447 444 449 450 451 448 453 454 455 452 457 458 459 456 461 462 463 460 465 466 467 464 469 470 471 468 473 474 475 472 477 478 479 476 481 482 483 480 485 486 487 484 489 490 491 488 493 494 495 492 497 498 499 496 501 502 503 500 505 506 507 504 509 510 511 508 513 514 515 512 517 518 519 516 521 522 523 520 525 526 527 524 529 530 531 528 533 534 535 532 537 538 539 536 541 542 543 540 545 546 547 544 549 550 551 548 553 554 555 552 557 558 559 556 561 562 563 560 565 566 567 564 569 570 571 568 573 574 575 572 577 578 579 576 581 582 583 580 585 586 587 584 589 590 591 588 593 594 595 592 597 598 599 596 601 602 603 600 605 606 607 604 609 610 611 608 613 614 615 612 617 618 619 616 621 622 623 620 625 626 627 624 629 630 631 628 633 634 635 632 637 638 639 636 641 642 643 640 645 646 647 644 649 650 651 648 653 654 655 652 657 658 659 656 661 662 663 660 665 666 667 664 669 670 671 668 673 674 675 672 677 678 679 676 681 682 683 680 685 686 687 684 689 690 691 688 693 694 695 692 697 698 699 696 701 702 703 700 705 706 707 704 709 710 711 708 713 714 715 712 717 718 719 716 721 722 723 720 725 726 727 724 729 730 731 728 733 734 735 732 737 738 739 736 741 742 743 740 745 746 747 744 749 750 751 748 753 754 755 752 757 758 759 756 761 762 763 760 765 766 767 764 769 770 771 768 773 774 775 772 777 778 779 776 781 782 783 780 785 786 787 784 789 790 791 788 793 794 795 792 797 798 799 796 801 802 803 800 805 806 807 804 809 810 811 808 813 814 815 812 817 818 819 816 821 822 823 820 825 826 827 824 829 830 831 828 833 834 835 832 837 838 839 836 841 842 843 840 845 846 847 844 849 850 851 848 853 854 855 852 857 858 859 856 861 862 863 860 865 866 867 864 869 870 871 868 873 874 875 872 877 878 879 876 881 882 883 880 885 886 887 884 889 890 891 888 893 894 895 892 897 898 899 896</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 532 536 540 544 548 552 556 560 564 568 572 576 580 584 588 592 596 600 604 608 612 616 620 624 628 632 636 640 644 648 652 656 660 664 668 672 676 680 684 688 692 696 700 704 708 712 716 720 724 728 732 736 740 744 748 752 756 760 764 768 772 776 780 784 788 792 796 800 804 808 812 816 820 824 828 832 836 840 844 848 852 856 860 864 868 872 876 880 884 888 892 896</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 17 16 1 2 18 17 2 3 19 18 3 4 20 19 4 5 21 20 5 6 22 21 6 7 23 22 7 8 24 23 8 9 25 24 9 10 26 25 10 11 27 26 11 12 28 27 12 13 29 28 13 14 30 29 14 15 31 30 16 17 33 32 17 18 34 33 18 19 35 34 19 20 36 35 20 21 37 36 21 22 38 37 22 23 39 38 23 24 40 39 24 25 41 40 25 26 42 41 26 27 43 42 27 28 44 43 28 29 45 44 29 30 46 45 30 31 47 46 32 33 49 48 33 34 50 49 34 35 51 50 35 36 52 51 36 37 53 52 37 38 54 53 38 39 55 54 39 40 56 55 40 41 57 56 41 42 58 57 42 43 59 58 43 44 60 59 44 45 61 60 45 46 62 61 46 47 63 62 48 49 65 64 49 50 66 65 50 51 67 66 51 52 68 67 52 53 69 68 53 54 70 69 54 55 71 70 55 56 72 71 56 57 73 72 57 58 74 73 58 59 75 74 59 60 76 75 60 61 77 76 61 62 78 77 62 63 79 78 64 65 81 80 65 66 82 81 66 67 83 82 67 68 84 83 68 69 85 84 69 70 86 85 70 71 87 86 71 72 88 87 72 73 89 88 73 74 90 89 74 75 91 90 75 76 92 91 76 77 93 92 77 78 94 93 78 79 95 94 80 81 97 96 81 82 98 97 82 83 99 98 83 84 100 99 84 85 101 100 85 86 102 101 86 87 103 102 87 88 104 103 88 89 105 104 89 90 106 105 90 91 107 106 91 92 108 107 92 93 109 108 93 94 110 109 94 95 111 110 96 97 113 112 97 98 114 113 98 99 115 114 99 100 116 115 100 101 117 116 101 102 118 117 102 103 119 118 103 104 120 119 104 105 121 120 105 106 122 121 106 107 123 122 107 108 124 123 108 109 125 124 109 110 126 125 110 111 127 126 112 113 129 128 113 114 130 129 114 115 131 130 115 116 132 131 116 117 133 132 117 118 134 133 118 119 135 134 119 120 136 135 120 121 137 136 121 122 138 137 122 123 139 138 123 124 140 139 124 125 141 140 125 126 142 141 126 127 143 142 128 129 145 144 129 130 146 145 130 131 147 146 131 132 148 147 132 133 149 148 133 134 150 149 134 135 151 150 135 136 152 151 136 137 153 152 137 138 154 153 138 139 155 154 139 140 156 155 140 141 157 156 141 142 158 157 142 143 159 158 144 145 161 160 145 146 162 161 146 147 163 162 147 148 164 163 148 149 165 164 149 150 166 165 150 151 167 166 151 152 168 167 152 153 169 168 153 154 170 169 154 155 171 170 155 156 172 171 156 157 173 172 157 158 174 173 158 159 175 174 160 161 177 176 161 162 178 177 162 163 179 178 163 164 180 179 164 165 181 180 165 166 182 181 166 167 183 182 167 168 184 183 168 169 185 184 169 170 186 185 170 171 187 186 171 172 188 187 172 173 189 188 173 174 190 189 174 175 191 190 176 177 193 192 177 178 194 193 178 179 195 194 179 180 196 195 180 181 197 196 181 182 198 197 182 183 199 198 183 184 200 199 184 185 201 200 185 186 202 201 186 187 203 202 187 188 204 203 188 189 205 204 189 190 206 205 190 191 207 206 192 193 209 208 193 194 210 209 194 195 211 210 195 196 212 211 196 197 213 212 197 198 214 213 198 199 215 214 199 200 216 215 200 201 217 216 201 202 218 217 202 203 219 218 203 204 220 219 204 205 221 220 205 206 222 221 206 207 223 222 208 209 225 224 209 210 226 225 210 211 227 226 211 212 228 227 212 213 229 228 213 214 230 229 214 215 231 230 215 216 232 231 216 217 233 232 217 218 234 233 218 219 235 234 219 220 236 235 220 221 237 236 221 222 238 237 222 223 239 238 224 225 241 240 225 226 242 241 226 227 243 242 227 228 244 243 228 229 245 244 229 230 246 245 230 231 247 246 231 232 248 247 232 233 249 248 233 234 250 249 234 235 251 250 235 236 252 251 236 237 253 252 237 238 254 253 238 239 255 254\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/mesh.source.Teapot.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"teapot\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"surface\">\n\t\t\t\t\t\t<array name=\"materials\" type=\"k3d::imaterial*\">0</array>\n\t\t\t\t\t\t<array name=\"matrices\" type=\"k3d::matrix4\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</array>\n\t\t\t\t\t\t<array name=\"selections\" type=\"k3d::double_t\">0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"surface\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/modifier.DissolveFaces.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>5 5 0 3 5 0 1 5 0 -1 5 0 -3 5 0 -5 5 0 5 3 0 3 3 0 1 3 0 -1 3 0 -3 3 0 -5 3 0 5 1 0 3 1 0 1 1 0 -1 1 0 -3 1 0 -5 1 0 5 -1 -0 3 -1 -0 1 -1 -0 -1 -1 0 -3 -1 0 -5 -1 0 5 -3 -0 3 -3 -0 1 -3 -0 -1 -3 0 -3 -3 0 -5 -3 0 5 -5 -0 3 -5 -0 1 -5 -0 -1 -5 0 -3 -5 0 -5 -5 0</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes>\n\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35</array>\n\t\t</point_attributes>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44 49 50 51 48 53 54 55 52 57 58 59 56 61 62 63 60 65 66 67 64 69 70 71 68 73 74 75 72 77 78 79 80 81 76 83 84 85 86 87 88 89 90 91 82</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 82</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">2 3 9 8 3 4 10 9 4 5 11 10 6 7 13 12 7 8 14 13 8 9 15 14 9 10 16 15 10 11 17 16 12 13 19 18 18 19 25 24 19 20 26 25 20 21 27 26 21 22 28 27 22 23 29 28 24 25 31 30 25 26 32 31 26 27 33 32 27 28 34 33 28 29 35 34 2 8 7 6 0 1 17 23 22 21 20 19 13 14 15 16\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 5 6 2 3 0 4 57 58 54 50 46 47 44 48 52 56</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">2 3 4 5 6 7 8 9 10 15 16 17 18 19 20 21 22 23 24 0 11</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"index\" type=\"k3d::uint_t\">8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 5 6 2 3 0 4 57 58 54 50 46 47 44 48 52 56</array>\n\t\t\t\t\t</table>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/ngui.tools.move.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2 2.5 2.5 3 2.5 2.5 3 -2.5 2.5 -2 -2.5 2.5 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">2 2 2 2 2 2</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/ngui.tools.rotate.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-2.5 2.4904867452293065 2.7178893568698008 2.5 2.4904867452293065 2.7178893568698008 2.5 -2.4904867452293065 2.2821106431301992 -2.5 -2.4904867452293065 2.2821106431301992 -2.5 2.5 -2.5 2.5 2.5 -2.5 2.5 -2.5 -2.5 -2.5 -2.5 -2.5</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">2 2 2 2 2 2</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 5 4 1 2 6 5 2 3 7 6 3 0 4 7 1 0 3 2 4 5 6 7\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\"/>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/polyhedron.hole.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-7.5 -2.5 2.5 -2.5 -2.5 2.5 -2.5 -7.5 2.5 -7.5 -7.5 2.5 -7.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -7.5 -2.5 -7.5 -7.5 -2.5 -6.25 -3.75 0 -3.75 -3.75 0 -3.75 -6.25 0 -6.25 -6.25 0 -6.25 -3.75 2.5 -6.25 -6.25 2.5 -3.75 -3.75 2.5 -3.75 -6.25 2.5 0.0050000000000000001 5 7.5 -0.0024999999999999988 4.995669872981078 7.5 -0.0025000000000000022 5.004330127018922 7.5 5 5 -2.5 -2.4999999999999991 0.66987298107780635 -2.5 -2.5000000000000022 9.330127018922191 -2.5 10 -5 5 6.5450849718747373 -9.7552825814757682 5 0.95491502812526363 -7.9389262614623668 5 0.95491502812526186 -2.061073738537635 5 6.5450849718747364 -0.24471741852423179 5 10 -5 0 6.5450849718747373 -9.7552825814757682 0 0.95491502812526363 -7.9389262614623668 0 0.95491502812526186 -2.061073738537635 0 6.5450849718747364 -0.24471741852423179 0 10 -5 -5 6.5450849718747373 -9.7552825814757682 -5 0.95491502812526363 -7.9389262614623668 -5 0.95491502812526186 -2.061073738537635 -5 6.5450849718747364 -0.24471741852423179 -5</points>\n\t\t<point_selection>1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 1</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 40 45 46 47 44</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 2 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 1 0 1 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 44</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">6 7 4 5 4 7 3 0 3 7 6 2 2 6 5 1 5 4 0 1 0 3 2 1 13 12 14 15 8 12 13 11 13 15 10 11 15 14 9 10 9 14 12 8 10 9 8 11\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 12 16 17 15</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">2 2 2 2 2</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 1 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 15</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">16 17 20 19 17 18 21 20 18 16 19 21 16 18 17 19 20 21\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 19 16 21 22 23 20 25 26 27 24 29 30 31 28 33 34 35 32 37 38 39 36 41 42 43 44 40 46 47 48 49 45</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">2 2 2 2 2 2 2 2 2 2 2 2</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 1 0 0 0 0 0 0 0 1\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 4 8 12 16 20 24 28 32 36 40 45</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">22 23 28 27 23 24 29 28 24 25 30 29 25 26 31 30 26 22 27 31 27 28 33 32 28 29 34 33 29 30 35 34 30 31 36 35 31 27 32 36 22 26 25 24 23 32 33 34 35 36\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/meshes/source.UniformPolyhedron.reference.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml>\n\t<mesh_arrays>\n\t\t<points>-3.2127824700650001 -2.9825977726449997 -2.4046079361600001 0.55696649392499997 4.6210429563449997 -1.8264036575199998 1.98483509255 -3.7205305971699998 -2.6866487918749997 -4.0952537954799997 2.17277820309 -1.872947204475 4.3146680813450002 0.97877781158499999 -2.329298895225 -1.984835092545 3.7205305971699998 2.6866487918699997 -0.20194672177549999 0.478281792845 -4.9729733608949998 -4.3146680813450002 -0.9787778115900001 2.329298895235 4.0952537954650001 -2.172778203075 1.872947204475 3.2127824700650001 2.9825977726400001 2.4046079361600001 -0.55696649392000008 -4.6210429563500002 1.8264036575199998 0.20194672177799999 -0.47828179284099998 4.9729733608900002</points>\n\t\t<point_selection>0 0 0 0 0 0 0 0 0 0 0 0</point_selection>\n\t\t<point_attributes/>\n\t\t<primitives>\n\t\t\t<primitive type=\"polyhedron\">\n\t\t\t\t<structure>\n\t\t\t\t\t<table type=\"edge\">\n\t\t\t\t\t\t<array name=\"clockwise_edges\" type=\"k3d::uint_t\">1 2 3 4 0 6 7 8 9 5 11 12 13 14 10 16 17 18 19 15 21 22 23 24 20 26 27 28 29 25 31 32 33 34 30 36 37 38 39 35 41 42 43 44 40 46 47 48 49 45 51 52 53 54 50 56 57 58 59 55</array>\n\t\t\t\t\t\t<array name=\"edge_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"face_first_loops\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7 8 9 10 11</array>\n\t\t\t\t\t\t<array name=\"face_loop_counts\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t<array name=\"face_materials\" type=\"k3d::imaterial*\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t<array name=\"face_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"face_shells\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"loop\">\n\t\t\t\t\t\t<array name=\"loop_first_edges\" type=\"k3d::uint_t\">0 5 10 15 20 25 30 35 40 45 50 55</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"shell\">\n\t\t\t\t\t\t<array name=\"shell_types\" type=\"k3d::int32_t\">0</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\">\n\t\t\t\t\t\t<array name=\"vertex_points\" type=\"k3d::uint_t\">0 1 2 3 4 1 0 5 6 7 2 1 8 6 9 3 2 7 6 10 4 3 9 6 5 0 4 10 6 8 9 7 8 5 10 7 9 3 11 1 8 7 2 11 0 5 8 1 11 4 10 5 0 11 3 9 10 4 11 2\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:domain\">k3d:point-indices</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array name=\"vertex_selections\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\t\t\t\t\t\t\t<metadata>\n\t\t\t\t\t\t\t\t<pair name=\"k3d:role\">k3d:selection</pair>\n\t\t\t\t\t\t\t</metadata>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</table>\n\t\t\t\t</structure>\n\t\t\t\t<attributes>\n\t\t\t\t\t<table type=\"constant\"/>\n\t\t\t\t\t<table type=\"edge\"/>\n\t\t\t\t\t<table type=\"face\">\n\t\t\t\t\t\t<array name=\"Cs\" type=\"k3d::color\">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</array>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table type=\"vertex\"/>\n\t\t\t\t</attributes>\n\t\t\t</primitive>\n\t\t</primitives>\n\t</mesh_arrays>\n</k3dml>\n"
  },
  {
    "path": "tests/ngui/CMakeLists.txt",
    "content": "K3D_TEST(ngui.MoveTool\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/MoveTool.py\n\tNGUI\n\tLABELS ngui tool)\n\nK3D_TEST(ngui.RotateTool\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/RotateTool.py\n\tNGUI\n\tLABELS ngui tool)\n\nK3D_TEST(ngui.icons.missing\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/icons.missing.py\n\tLABELS ngui icons)\n\nK3D_TEST(ngui.icons.unexpected\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/icons.unexpected.py\n\tLABELS ngui icons)\n\nK3D_TEST(ngui.icons.unrasterized\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/icons.unrasterized.py\n\tLABELS ngui icons)\n\n"
  },
  {
    "path": "tests/ngui/MoveTool.py",
    "content": "#python\nimport k3d\nimport testing\n\n#Create a polycube\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").panel(\"NGUIToolbarPanel\").filler(0).panel(0).filler(0).filler(0).page_tab_list(0).page_tab(\"Create\").filler(0).filler(0).push_button(0).click()\n\n# Switch to point selection mode\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").panel(\"NGUIToolbarPanel\").filler(\"vbox\").panel(\"content\").filler(\"vbox\").filler(\"toolbox\").filler(\"main_toolbar\").filler(\"row1\").toggle_button(\"Select Nodes\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").panel(\"NGUIToolbarPanel\").filler(\"vbox\").panel(\"content\").filler(\"vbox\").filler(\"toolbox\").filler(\"main_toolbar\").filler(\"row1\").toggle_button(\"Select Points\").click()\n\ndoc = k3d.documents()[0]\ncube_instance = k3d.node.lookup_one(doc, \"PolyCube Instance\")\n\n# set the selection on the PolyCube instance\nselection = k3d.geometry.selection.create(0)\npoint_selection = k3d.geometry.point_selection.create(selection)\nk3d.geometry.point_selection.append(point_selection, 0, 4, 1)\ncube_instance.mesh_selection = selection\n\n# Switch to move tool\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").panel(\"NGUIToolbarPanel\").filler(\"vbox\").panel(\"content\").filler(\"vbox\").filler(\"toolbox\").filler(\"main_toolbar\").filler(\"row0\").toggle_button(\"selection_tool\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").panel(\"NGUIToolbarPanel\").filler(\"vbox\").panel(\"content\").filler(\"vbox\").filler(\"toolbox\").filler(\"main_toolbar\").filler(\"row0\").toggle_button(\"move_tool\").click()\n\n# Activate the move tool properties and change the parameters\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUINodePropertiesPanel\").filler(\"vbox\").filler(\"decorations\").combo_box(\"panel_type\").menu(0).menu_item(\"NGUIToolPropertiesPanel\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUIToolPropertiesPanel\").filler(\"vbox\").panel(\"content\").filler(0).filler(\"vbox\").scroll_pane(0).viewport(0).filler(\"move_tool\").panel(\"Builtin Properties\").panel(0).panel(\"move_control\").panel(2).push_button(\"up\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUIToolPropertiesPanel\").filler(\"vbox\").panel(\"content\").filler(0).filler(\"vbox\").scroll_pane(0).viewport(0).filler(\"move_tool\").panel(\"Builtin Properties\").panel(0).panel(\"move_control\").panel(2).push_button(\"up\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUIToolPropertiesPanel\").filler(\"vbox\").panel(\"content\").filler(0).filler(\"vbox\").scroll_pane(0).viewport(0).filler(\"move_tool\").panel(\"Builtin Properties\").panel(0).panel(\"move_control\").panel(2).push_button(\"up\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUIToolPropertiesPanel\").filler(\"vbox\").panel(\"content\").filler(0).filler(\"vbox\").scroll_pane(0).viewport(0).filler(\"move_tool\").panel(\"Builtin Properties\").panel(0).panel(\"move_control\").panel(2).push_button(\"up\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUIToolPropertiesPanel\").filler(\"vbox\").panel(\"content\").filler(0).filler(\"vbox\").scroll_pane(0).viewport(0).filler(\"move_tool\").panel(\"Builtin Properties\").panel(0).panel(\"move_control\").panel(2).push_button(\"up\").click()\n\ntweakpoints = k3d.node.lookup_one(doc, \"Move PolyCube Instance components\")\ntesting.require_similar_mesh(doc, tweakpoints.get_property(\"output_mesh\"), \"ngui.tools.move\", 1)\n"
  },
  {
    "path": "tests/ngui/RotateTool.py",
    "content": "#python\nimport k3d\nimport testing\n\n#Create a polycube\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").panel(\"NGUIToolbarPanel\").filler(0).panel(0).filler(0).filler(0).page_tab_list(0).page_tab(\"Create\").filler(0).filler(0).push_button(0).click()\n\n# Switch to point selection mode\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").panel(\"NGUIToolbarPanel\").filler(\"vbox\").panel(\"content\").filler(\"vbox\").filler(\"toolbox\").filler(\"main_toolbar\").filler(\"row1\").toggle_button(\"Select Nodes\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").panel(\"NGUIToolbarPanel\").filler(\"vbox\").panel(\"content\").filler(\"vbox\").filler(\"toolbox\").filler(\"main_toolbar\").filler(\"row1\").toggle_button(\"Select Points\").click()\n\ndoc = k3d.documents()[0]\ncube_instance = k3d.node.lookup_one(doc, \"PolyCube Instance\")\n\n# set the selection on the PolyCube instance\nselection = k3d.geometry.selection.create(0)\npoint_selection = k3d.geometry.point_selection.create(selection)\nk3d.geometry.point_selection.append(point_selection, 0, 4, 1)\ncube_instance.mesh_selection = selection\n\n# Switch to rotate tool\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").panel(\"NGUIToolbarPanel\").filler(\"vbox\").panel(\"content\").filler(\"vbox\").filler(\"toolbox\").filler(\"main_toolbar\").filler(\"row0\").toggle_button(\"selection_tool\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").panel(\"NGUIToolbarPanel\").filler(\"vbox\").panel(\"content\").filler(\"vbox\").filler(\"toolbox\").filler(\"main_toolbar\").filler(\"row0\").toggle_button(\"rotate_tool\").click()\n\n# Activate the move tool properties and change the parameters\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUINodePropertiesPanel\").filler(\"vbox\").filler(\"decorations\").combo_box(\"panel_type\").menu(0).menu_item(\"NGUIToolPropertiesPanel\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUIToolPropertiesPanel\").filler(\"vbox\").panel(\"content\").filler(0).filler(\"vbox\").scroll_pane(0).viewport(0).filler(\"rotate_tool\").panel(\"Builtin Properties\").panel(0).panel(\"rotation_control\").panel(2).push_button(\"up\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUIToolPropertiesPanel\").filler(\"vbox\").panel(\"content\").filler(0).filler(\"vbox\").scroll_pane(0).viewport(0).filler(\"rotate_tool\").panel(\"Builtin Properties\").panel(0).panel(\"rotation_control\").panel(2).push_button(\"up\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUIToolPropertiesPanel\").filler(\"vbox\").panel(\"content\").filler(0).filler(\"vbox\").scroll_pane(0).viewport(0).filler(\"rotate_tool\").panel(\"Builtin Properties\").panel(0).panel(\"rotation_control\").panel(2).push_button(\"up\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUIToolPropertiesPanel\").filler(\"vbox\").panel(\"content\").filler(0).filler(\"vbox\").scroll_pane(0).viewport(0).filler(\"rotate_tool\").panel(\"Builtin Properties\").panel(0).panel(\"rotation_control\").panel(2).push_button(\"up\").click()\nk3d.atk.root().frame(\"Untitled Document 1\").filler(\"vbox\").panel(\"main\").split_pane(\"main\").split_pane(\"bottom\").split_pane(\"top\").split_pane(\"left\").split_pane(\"bottom\").panel(\"NGUIToolPropertiesPanel\").filler(\"vbox\").panel(\"content\").filler(0).filler(\"vbox\").scroll_pane(0).viewport(0).filler(\"rotate_tool\").panel(\"Builtin Properties\").panel(0).panel(\"rotation_control\").panel(2).push_button(\"up\").click()\n\ntweakpoints = k3d.node.lookup_one(doc, \"Rotate PolyCube Instance components\")\ntesting.require_similar_mesh(doc, tweakpoints.get_property(\"output_mesh\"), \"ngui.tools.rotate\", 1)\n"
  },
  {
    "path": "tests/ngui/icons.missing.py",
    "content": "#python\nimport k3d\nimport glob\nimport os\nimport testing\n\nfactories = []\nfor factory in k3d.plugin.factory.lookup():\n\tfactories.append(factory.name())\n\nscalable_icons = []\nfor icon in glob.glob(str(k3d.share_path() / k3d.filesystem.generic_path(\"ngui/scalable/*.svg\"))):\n\tscalable_icons.append(os.path.splitext(os.path.basename(icon))[0])\n\nfactories.sort()\nscalable_icons.sort()\n\nmissing_icons = []\nfor factory in factories:\n\tif factory not in scalable_icons:\n\t\tmissing_icons.append(factory)\n\nif len(missing_icons):\n\tprint \"Factories without icons:\\n\"\n\tprint str(\"\\n\").join(missing_icons)\n\traise Exception(\"Found plugin factories without icons.\")\n\n"
  },
  {
    "path": "tests/ngui/icons.unexpected.py",
    "content": "#python\nimport k3d\nimport glob\nimport os\nimport testing\n\nfactories = []\nfor factory in k3d.plugin.factory.lookup():\n\tfactories.append(factory.name())\n\nscalable_icons = []\nfor icon in glob.glob(str(k3d.share_path() / k3d.filesystem.generic_path(\"ngui/scalable/*.svg\"))):\n\tscalable_icons.append(os.path.splitext(os.path.basename(icon))[0])\n\nfactories.sort()\nscalable_icons.sort()\n\nexceptions = ['BevelFaces', 'BitmapSequenceIn', 'BitmapSequenceOut', 'EXRBitmapExporter', 'ImageMagickBitmapExporter', 'Viewport', 'cant_connect_property_cursor', 'center', 'connect_property_cursor', 'connected_plug', 'convert_selection', 'element', 'keep_selection', 'knife_cursor', 'move_cursor', 'move_cursor_screen_xy', 'move_cursor_x', 'move_cursor_xy', 'move_cursor_xz', 'move_cursor_y', 'move_cursor_yz', 'move_cursor_z', 'move_tool', 'node_history_panel', 'node_list_panel', 'node_properties_panel', 'parent_cursor', 'plug_tool', 'render_animation', 'render_frame', 'render_preview', 'rotate_tool', 'scale_cursor', 'scale_cursor_x', 'scale_cursor_xy', 'scale_cursor_xyz', 'scale_cursor_xz', 'scale_cursor_y', 'scale_cursor_yz', 'scale_cursor_z', 'scale_tool', 'select_add_cursor', 'select_cursor', 'select_curve', 'select_face', 'select_group', 'select_node', 'select_patch', 'select_split_edge', 'select_subtract_cursor', 'select_tool', 'select_uniform', 'select_vertex', 'soft_selection', 'undo_tree_panel', 'unparent', 'viewport_panel']\n\nunexpected_icons = []\nfor icon in scalable_icons:\n\tif icon not in factories:\n\t\tif icon in exceptions:\n\t\t\tcontinue\n\t\tunexpected_icons.append(icon)\n\nif len(unexpected_icons):\n\tprint \"Unexpected icons without factories:\", unexpected_icons\n\traise Exception(\"Found unexpected icons without corresponding factories.\")\n\n"
  },
  {
    "path": "tests/ngui/icons.unrasterized.py",
    "content": "#python\nimport k3d\nimport glob\nimport os\nimport testing\n\nscalable_icons = []\nfor icon in glob.glob(str(k3d.share_path() / k3d.filesystem.generic_path(\"ngui/scalable/*.svg\"))):\n\tscalable_icons.append(os.path.splitext(os.path.basename(icon))[0])\n\nrasterized_icons = []\nfor icon in glob.glob(str(k3d.share_path() / k3d.filesystem.generic_path(\"ngui/rasterized/*.png\"))):\n\trasterized_icons.append(os.path.splitext(os.path.basename(icon))[0])\n\nscalable_icons.sort()\nrasterized_icons.sort()\n\nunrasterized = []\nfor icon in scalable_icons:\n\tif icon not in rasterized_icons:\n\t\tunrasterized.append(icon)\n\nif len(unrasterized):\n\tprint \"\\nScalable icons without corresponding rasterized icons:\\n\"\n\tprint str(\"\\n\").join(unrasterized)\n\traise Exception(\"Found scalable icons without corresponding rasterized icons.\")\n\n"
  },
  {
    "path": "tests/offscreen/CMakeLists.txt",
    "content": "K3D_TEST(offscreen.GLXCameraToBitmap\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/offscreen.GLXCameraToBitmap.py\n\tREQUIRES K3D_BUILD_GLX_MODULE\n\tLABELS offscreen GLXCameraToBitmap)\n\nK3D_TEST(offscreen.VirtualCameraToBitmap\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/offscreen.VirtualCameraToBitmap.py\n\tREQUIRES K3D_BUILD_VIRTUAL_OFFSCREEN_MODULE\n\tLABELS offscreen VirtualCameraToBitmap)\n\nK3D_TEST(offscreen.WGLCameraToBitmap\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/offscreen.WGLCameraToBitmap.py\n\tREQUIRES K3D_BUILD_WGL_MODULE\n\tLABELS offscreen WGLCameraToBitmap)\n"
  },
  {
    "path": "tests/offscreen/offscreen.GLXCameraToBitmap.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndoc = k3d.new_document()\n\naxes = k3d.plugin.create(\"Axes\", doc)\naxes.xyplane = False\n\nmaterial = k3d.plugin.create(\"RenderManMaterial\", doc)\n\ntorus = k3d.plugin.create(\"Torus\", doc)\ntorus.material = material\n\nmesh_instance = k3d.plugin.create(\"MeshInstance\", doc)\nmesh_instance.gl_painter = k3d.plugin.create(\"OpenGLTorusPainter\", doc)\nk3d.property.connect(doc, torus.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n\ncamera = testing.create_camera(doc)\nrender_engine = testing.create_opengl_engine(doc)\n\ncamera_to_bitmap = k3d.plugin.create(\"GLXCameraToBitmap\", doc)\ncamera_to_bitmap.camera = camera\ncamera_to_bitmap.render_engine = render_engine\n\ntesting.require_similar_bitmap(doc, camera_to_bitmap.get_property(\"output_bitmap\"), \"offscreen.GLXCameraToBitmap\", 0.009)\n\n"
  },
  {
    "path": "tests/offscreen/offscreen.OpenGLFramebufferCameraToBitmap.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndoc = k3d.new_document()\n\naxes = k3d.plugin.create(\"Axes\", doc)\naxes.xyplane = False\n\nmaterial = k3d.plugin.create(\"RenderManMaterial\", doc)\n\ntorus = k3d.plugin.create(\"Torus\", doc)\ntorus.material = material\n\ncamera = testing.create_camera(doc)\nrender_engine = testing.create_opengl_engine(doc)\n\ncamera_to_bitmap = k3d.plugin.create(\"OpenGLFramebufferCameraToBitmap\", doc)\ncamera_to_bitmap.camera = camera\ncamera_to_bitmap.render_engine = render_engine\n\ntesting.require_similar_bitmap(doc, camera_to_bitmap.get_property(\"output_bitmap\"), \"offscreen.OpenGLFramebufferCameraToBitmap\", 0.009)\n\n"
  },
  {
    "path": "tests/offscreen/offscreen.VirtualCameraToBitmap.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndoc = k3d.new_document()\n\naxes = k3d.plugin.create(\"Axes\", doc)\naxes.xyplane = False\n\nmaterial = k3d.plugin.create(\"RenderManMaterial\", doc)\n\ntorus = k3d.plugin.create(\"Torus\", doc)\ntorus.material = material\n\nmesh_instance = k3d.plugin.create(\"MeshInstance\", doc)\nmesh_instance.gl_painter = k3d.plugin.create(\"OpenGLTorusPainter\", doc)\nk3d.property.connect(doc, torus.get_property(\"output_mesh\"), mesh_instance.get_property(\"input_mesh\"))\n\ncamera = testing.create_camera(doc)\nrender_engine = testing.create_opengl_engine(doc)\n\ncamera_to_bitmap = k3d.plugin.create(\"VirtualCameraToBitmap\", doc)\ncamera_to_bitmap.camera = camera\ncamera_to_bitmap.render_engine = render_engine\n\ntesting.require_similar_bitmap(doc, camera_to_bitmap.get_property(\"output_bitmap\"), \"offscreen.VirtualCameraToBitmap\", 0.009)\n\n"
  },
  {
    "path": "tests/offscreen/offscreen.WGLCameraToBitmap.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndoc = k3d.new_document()\n\naxes = k3d.plugin.create(\"Axes\", doc)\naxes.xyplane = False\n\nmaterial = k3d.plugin.create(\"RenderManMaterial\", doc)\n\ntorus = k3d.plugin.create(\"Torus\", doc)\ntorus.material = material\n\ncamera = testing.create_camera(doc)\nrender_engine = testing.create_opengl_engine(doc)\n\ncamera_to_bitmap = k3d.plugin.create(\"WGLCameraToBitmap\", doc)\ncamera_to_bitmap.camera = camera\ncamera_to_bitmap.render_engine = render_engine\n\ntesting.require_similar_bitmap(doc, camera_to_bitmap.get_property(\"output_bitmap\"), \"offscreen.WGLCameraToBitmap\", 0.009)\n\n"
  },
  {
    "path": "tests/other/CMakeLists.txt",
    "content": "K3D_TEST(startup.k3d-uuidgen\n\tTARGET k3d-uuidgen\n\tLABELS startup uuid)\n\nK3D_TEST(document.serialization.properties\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/document.serialization.properties.py\n\tLABELS document)\n\nK3D_TEST(document.importer.bogus_input\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/document.importer.bogus_input.py\n\tLABELS document importer)\n\nK3D_TEST(notifier.InotifyFileChangeNotifier\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/notifier.InotifyFileChangeNotifier.py\n\tREQUIRES K3D_BUILD_INOTIFY_MODULE\n\tLABELS notifier InotifyFileChangeNotifier)\n\n"
  },
  {
    "path": "tests/other/document.create.py",
    "content": "#python\n\nimport k3d\ndoc = k3d.new_document();\n\n"
  },
  {
    "path": "tests/other/document.importer.bogus_input.py",
    "content": "#python\n\nimport testing\nimport k3d\n\nfactories = k3d.plugin.factory.lookup()\n\nfor factory in factories :\n\tif factory.is_application_plugin() and (\"DocumentImporter\" in factory.name()):\n\n\t\tprint \"\\n\\nTesting \" + factory.name() + \" with a file containing all zeroes ...\"\n\t\tpath = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/\" + \"zero_bytes\")\n\t\tdocument = k3d.new_document()\n\t\tdocument_importer = k3d.plugin.create(factory.name())\n\t\tdocument_importer.read_file(path, document)\n\t\tk3d.close_document(document)\n\n\t\tprint \"\\n\\nTesting \" + factory.name() + \" with a file containing random data ...\"\n\t\tpath = k3d.filesystem.generic_path(testing.source_path() + \"/meshes/\" + \"random_bytes\")\n\t\tdocument = k3d.new_document()\n\t\tdocument_importer = k3d.plugin.create(factory.name())\n\t\tdocument_importer.read_file(path, document)\n\t\tk3d.close_document(document)\n\n"
  },
  {
    "path": "tests/other/document.serialization.properties.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndef create_property(node, type, value):\n\tproperty = k3d.property.create(node, type, type, \"\", \"\")\n\tproperty.set_value(value)\n\ndocument = k3d.new_document()\ntest_container = k3d.plugin.create(\"Null\", document)\ntest_container.name = \"test_container\"\n\ntest_material = k3d.plugin.create(\"MultiMaterial\", document)\ntest_material.name = \"test_material\"\n\ntest_gl_mesh_painter = k3d.plugin.create(\"OpenGLPointPainter\", document)\ntest_gl_mesh_painter.name = \"test_gl_mesh_painter\"\n\ntest_ri_mesh_painter = k3d.plugin.create(\"RenderManLinearCurvePainter\", document)\ntest_ri_mesh_painter.name = \"test_ri_mesh_painter\"\n\ntest_ri_texture = k3d.plugin.create(\"RenderManTextureMap\", document)\ntest_ri_texture.name = \"test_ri_texture\"\n\ntest_node = k3d.plugin.create(\"Axes\", document)\ntest_node.name = \"test_node\"\n\ncreate_property(test_container, \"k3d::bool_t\", True)\ncreate_property(test_container, \"k3d::color\", k3d.color(1, 2, 3))\ncreate_property(test_container, \"k3d::double_t\", 3.1415)\ncreate_property(test_container, \"k3d::filesystem::path\", k3d.filesystem.generic_path(\"/foo/bar/baz\"))\ncreate_property(test_container, \"k3d::gl::imesh_painter*\", test_gl_mesh_painter)\ncreate_property(test_container, \"k3d::imaterial*\", test_material)\ncreate_property(test_container, \"k3d::inode*\", test_node)\ncreate_property(test_container, \"k3d::int32_t\", 19700827)\ncreate_property(test_container, \"k3d::matrix4\", k3d.scale3(1, 2, 3))\ncreate_property(test_container, \"k3d::normal3\", k3d.normal3(1, 2, 3))\ncreate_property(test_container, \"k3d::point3\", k3d.point3(1, 2, 3))\ncreate_property(test_container, \"k3d::point4\", k3d.point4(1, 2, 3, 4))\ncreate_property(test_container, \"k3d::ri::imesh_painter*\", test_ri_mesh_painter)\ncreate_property(test_container, \"k3d::ri::itexture*\", test_ri_texture)\ncreate_property(test_container, \"k3d::string_t\", \"K-3D Rocks!\")\ncreate_property(test_container, \"k3d::vector3\", k3d.vector3(1, 2, 3))\n\npath = testing.binary_path() + \"/document.serialization.properties.output.k3d\"\ndocument.save(path)\n\ndef test_property(value, expected_value):\n\tif value != expected_value:\n\t\traise \"property value doesn't match: \", value, expected_value\n\ndocument2 = k3d.open_document(k3d.filesystem.native_path(path))\ntest_container2 = k3d.node.lookup_one(document, \"test_container\")\n\ntest_property(test_container2.get_property(\"k3d::bool_t\").internal_value(), True)\ntest_property(test_container2.get_property(\"k3d::color\").internal_value(), k3d.color(1, 2, 3))\ntest_property(test_container2.get_property(\"k3d::double_t\").internal_value(), 3.1415)\ntest_property(test_container2.get_property(\"k3d::filesystem::path\").internal_value(), k3d.filesystem.generic_path(\"/foo/bar/baz\"))\ntest_property(test_container2.get_property(\"k3d::gl::imesh_painter*\").internal_value().name, \"test_gl_mesh_painter\")\ntest_property(test_container2.get_property(\"k3d::imaterial*\").internal_value().name, \"test_material\")\ntest_property(test_container2.get_property(\"k3d::inode*\").internal_value().name, \"test_node\")\ntest_property(test_container2.get_property(\"k3d::int32_t\").internal_value(), 19700827)\ntest_property(test_container2.get_property(\"k3d::matrix4\").internal_value(), k3d.scale3(1, 2, 3))\ntest_property(test_container2.get_property(\"k3d::normal3\").internal_value(), k3d.normal3(1, 2, 3))\ntest_property(test_container2.get_property(\"k3d::point3\").internal_value(), k3d.point3(1, 2, 3))\ntest_property(test_container2.get_property(\"k3d::point4\").internal_value(), k3d.point4(1, 2, 3, 4))\ntest_property(test_container2.get_property(\"k3d::ri::imesh_painter*\").internal_value().name, \"test_ri_mesh_painter\")\ntest_property(test_container2.get_property(\"k3d::ri::itexture*\").internal_value().name, \"test_ri_texture\")\ntest_property(test_container2.get_property(\"k3d::string_t\").internal_value(), \"K-3D Rocks!\")\ntest_property(test_container2.get_property(\"k3d::vector3\").internal_value(), k3d.vector3(1, 2, 3))\n\n"
  },
  {
    "path": "tests/other/notifier.InotifyFileChangeNotifier.py",
    "content": "#python\n\nimport k3d\nimport testing\n\nreceiver = k3d.file_change_receiver()\nnotifier = k3d.plugin.create(\"InotifyFileChangeNotifier\")\n\npath = k3d.filesystem.generic_path(testing.binary_path() + \"/\" + \"notifier.InotifyFileChangeNotifier.test\")\n\nf = file(str(path), \"w\")\nf.write(\"Howdy, \")\nf.close()\n\nid1 = notifier.watch_file(path, receiver)\nif not id1:\n\traise Exception(\"couldn't create 1st watch\")\n\nid2 = notifier.watch_file(path, receiver)\nif not id2:\n\traise Exception(\"couldn't create 2nd watch\")\n\nnotifier.unwatch_file(id1)\nnotifier.unwatch_file(id2)\n\nid3 = notifier.watch_file(path, receiver)\nif not id3:\n\traise Exception(\"couldn't create 3rd watch\")\n\nf = file(str(path), \"w\")\nf.write(\"World!\\n\")\nf.close()\n\nif not notifier.change_count():\n\traise Exception(\"missing changes pending\")\n\nwhile notifier.change_count():\n\tnotifier.signal_change()\n\nchanged = receiver.changed()\nif len(changed) != 1:\n\traise Exception(\"expected one change\")\n\nif changed[0] != path:\n\traise Exception(\"unexpected modification to \" + str(changed[0]))\n\nreceiver.clear()\nchanged = receiver.changed()\nif len(changed) != 0:\n\traise Exception(\"expected zero changes\")\n\n"
  },
  {
    "path": "tests/parallel/CMakeLists.txt",
    "content": "K3D_TEST(parallel.grain_size.ScalePoints\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/grain_size.ScalePoints.py\n\tREQUIRES K3D_ENABLE_PARALLEL\n\tLABELS parallel ScalePoints)\n\nK3D_TEST(parallel.thread_count.ScalePoints\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/thread_count.ScalePoints.py\n\tREQUIRES K3D_ENABLE_PARALLEL\n\tLABELS paralle ScalePoints)\n\n"
  },
  {
    "path": "tests/parallel/grain_size.ScalePoints.py",
    "content": "#python\n\nimport k3d\nimport sys\nimport testing\n\n# Create a mesh source and our test modifier ...\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"ScalePoints\")\nsetup.source.rows = 100\nsetup.source.columns = 100\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\nsetup.modifier.mesh_selection = selection\n\nprofiler = k3d.plugin.create(\"PipelineProfiler\", setup.document)\n\nthread_count = 2\n\ngrain_sizes = []\ntimings = []\n\nfor grain_size in range(5000, 100000, 5000):\n\tk3d.parallel.set_grain_size(grain_size)\n\tk3d.parallel.set_thread_count(thread_count)\n\tsetup.modifier.x = 1.0\n\tsetup.modifier.x = 2.0\n\n\tmesh = setup.modifier.output_mesh\n\n\tfor (node, timing) in profiler.records.items():\n\t\tif node.factory().name() == \"ScalePoints\":\n\t\t\tgrain_sizes.append(grain_size)\n\t\t\ttimings.append(timing[\"Update Mesh\"])\n\nprint \"\"\"<DartMeasurement name=\"Thread Count\" type=\"numeric/integer\">\"\"\", thread_count, \"\"\"</DartMeasurement>\"\"\"\n\nprint \"\"\"<DartMeasurement name=\"Timing\" type=\"text/html\"><![CDATA[\n<table>\n<tr><th>Grain Size</th><th>Time (Seconds)</th></tr>\"\"\"\n\nfor i in range(len(grain_sizes)):\n\tprint \"\"\"<tr><td>\"\"\", grain_sizes[i], \"\"\"</td><td>\"\"\", timings[i], \"\"\"</td></tr>\"\"\"\n\nprint \"\"\"\n</table>\n]]></DartMeasurement>\"\"\"\n\n#chart_string = \"http://chart.apis.google.com/chart?chs=250x250&cht=lxy&chd=t:40,60,80|20,30,70&chds=0,80,0,70&chxt=x,y&chxr=0,0,80|1,0.70&chtt=Grain+Size+vs+Execution+Time\"\n\nchart_string = \"\"\nchart_string += \"http://chart.apis.google.com/chart\"\nchart_string += \"?chs=250x250\"\nchart_string += \"&amp;cht=lxy\"\n\nchart_string += \"&amp;chd=t:\"\nfor i in range(len(grain_sizes)):\n\tif i:\n\t\tchart_string += \",\"\n\tchart_string += str(grain_sizes[i])\nchart_string += \"|\"\nfor i in range(len(timings)):\n\tif i:\n\t\tchart_string += \",\"\n\tchart_string += str(timings[i])\n\nchart_string += \"&amp;chds=0,\"\nchart_string += str(max(grain_sizes))\nchart_string += \",0,\"\nchart_string += str(max(timings))\n\nchart_string += \"&amp;chxt=x,y\"\n\nchart_string += \"&amp;chxr=0,0,\"\nchart_string += str(max(grain_sizes))\nchart_string += \"|1,0,\"\nchart_string += str(max(timings))\n\nchart_string += \"&amp;chtt=Grain+Size+vs+Execution+Time\"\n\nprint \"\"\"<DartMeasurement name=\"Timing Graph\" type=\"text/html\"><![CDATA[<img src=\\\"\"\"\" + chart_string + \"\"\"\"/>]]></DartMeasurement>\"\"\"\n\nsys.stdout.flush()\n\n"
  },
  {
    "path": "tests/parallel/thread_count.ScalePoints.py",
    "content": "#python\n\nimport k3d\nimport testing\n\n# Create a mesh source and our test modifier ...\nsetup = testing.setup_mesh_modifier_test(\"PolyGrid\", \"ScalePoints\")\nsetup.source.rows = 300\nsetup.source.columns = 300\n\nselection = k3d.geometry.selection.create(0)\nselection.points = k3d.geometry.point_selection.create(selection, 1)\nsetup.modifier.mesh_selection = selection\n\n# Force an update of the mesh source output, so it doesn't interfere with our timing\nmesh = setup.source.output_mesh\n\nfor thread_count in range(1, 9):\n\tk3d.parallel.set_grain_size(10000)\n\tk3d.parallel.set_thread_count(thread_count)\n\tsetup.modifier.x = 1.0\n\tsetup.modifier.x = 2.0\n\n\ttimer = testing.timer()\n\tmesh = setup.modifier.output_mesh\n\tprint \"Thread Count:\", thread_count, \"Time:\", timer.elapsed()\n\n"
  },
  {
    "path": "tests/platform/CMakeLists.txt",
    "content": "K3D_TEST(platform.configuration PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/platform_configuration.py LABELS platform)\n\nINCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3d_BINARY_DIR}/k3dsdk)\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\n\nADD_EXECUTABLE(test-platform-types platform_types.cpp)\nK3D_TEST(platform.types TARGET test-platform-types LABELS platform)\n\nADD_EXECUTABLE(test-platform-floating-point platform_floating_point.cpp)\nK3D_TEST(platform.float TARGET test-platform-floating-point LABELS platform)\n\nADD_EXECUTABLE(test-platform-normalized platform_normalized.cpp)\n\nADD_EXECUTABLE(test-platform-statistics platform_statistics.cpp)\n"
  },
  {
    "path": "tests/platform/platform_configuration.py",
    "content": "#python\n\nimport platform\nimport sys\n\nprint \"\"\"<DartMeasurement name=\"architecture\" type=\"text/string\">\"\"\" + str(platform.architecture()) + \"\"\"</DartMeasurement>\"\"\"\nprint \"\"\"<DartMeasurement name=\"machine\" type=\"text/string\">\"\"\" + str(platform.machine()) + \"\"\"</DartMeasurement>\"\"\"\nprint \"\"\"<DartMeasurement name=\"platform\" type=\"text/string\">\"\"\" + str(platform.platform()) + \"\"\"</DartMeasurement>\"\"\"\nprint \"\"\"<DartMeasurement name=\"processor\" type=\"text/string\">\"\"\" + str(platform.processor()) + \"\"\"</DartMeasurement>\"\"\"\nprint \"\"\"<DartMeasurement name=\"release\" type=\"text/string\">\"\"\" + str(platform.release()) + \"\"\"</DartMeasurement>\"\"\"\nprint \"\"\"<DartMeasurement name=\"system\" type=\"text/string\">\"\"\" + str(platform.system()) + \"\"\"</DartMeasurement>\"\"\"\nprint \"\"\"<DartMeasurement name=\"uname\" type=\"text/string\">\"\"\" + str(platform.uname()) + \"\"\"</DartMeasurement>\"\"\"\nprint \"\"\"<DartMeasurement name=\"version\" type=\"text/string\">\"\"\" + str(platform.version()) + \"\"\"</DartMeasurement>\"\"\"\n\nsys.stdout.flush()\n\n"
  },
  {
    "path": "tests/platform/platform_floating_point.cpp",
    "content": "#include <fenv.h>\n#include <iostream>\n\nint main(int, char*[])\n{\n\tstd::cerr << \"<DartMeasurement name=\\\"FE_DOWNWARD\\\" type=\\\"text/string\\\">\" << FE_DOWNWARD << \"</DartMeasurement>\\n\";\n\tstd::cerr << \"<DartMeasurement name=\\\"FE_TONEAREST\\\" type=\\\"text/string\\\">\" << FE_TONEAREST << \"</DartMeasurement>\\n\";\n\tstd::cerr << \"<DartMeasurement name=\\\"FE_TOWARDZERO\\\" type=\\\"text/string\\\">\" << FE_TOWARDZERO << \"</DartMeasurement>\\n\";\n\tstd::cerr << \"<DartMeasurement name=\\\"FE_UPWARD\\\" type=\\\"text/string\\\">\" << FE_UPWARD << \"</DartMeasurement>\\n\";\n\tstd::cerr << \"<DartMeasurement name=\\\"fegetround\\\" type=\\\"text/string\\\">\" << fegetround() << \"</DartMeasurement>\\n\";\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/platform/platform_normalized.cpp",
    "content": "#include <boost/lexical_cast.hpp>\n#include <boost/math/special_functions/fpclassify.hpp>\n#include <iostream>\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\tfor(int i = 1; i < argc; ++i)\n\t\t{\n\t\t\tstd::cerr << \"boost::math::isnormal(\" << argv[i] << \"): \";\n\t\t\tstd::cerr << boost::math::isnormal(boost::lexical_cast<double>(argv[i])) << std::endl;\n\t\t}\n\n\t\treturn 0;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << \"exception: \" << e.what() << std::endl;\n\t\treturn 1;\n\t}\n}\n\n"
  },
  {
    "path": "tests/platform/platform_statistics.cpp",
    "content": "#include <boost/accumulators/accumulators.hpp>\n#include <boost/accumulators/statistics/max.hpp>\n#include <boost/accumulators/statistics/mean.hpp>\n#include <boost/accumulators/statistics/median.hpp>\n#include <boost/accumulators/statistics/min.hpp>\n#include <boost/accumulators/statistics/stats.hpp>\n#include <boost/accumulators/statistics/variance.hpp>\nusing namespace boost::accumulators;\n\n#include <boost/lexical_cast.hpp>\n\n#include <iostream>\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\taccumulator_set<bool, stats<tag::min, tag::mean, tag::max, tag::median, tag::lazy_variance> > model;\n\t\tfor(int i = 1; i < argc; ++i)\n\t\t{\n\t\t\tmodel(boost::lexical_cast<bool>(argv[i]));\n\t\t}\n\n\t\tstd::cerr << \"count: \" << count(model) << std::endl;\n\t\tstd::cerr << \"min: \" << min(model) << std::endl;\n\t\tstd::cerr << \"mean: \" << mean(model) << std::endl;\n\t\tstd::cerr << \"median: \" << median(model) << std::endl;\n\t\tstd::cerr << \"max: \" << max(model) << std::endl;\n\t\tstd::cerr << \"sd: \" << std::sqrt(variance(model)) << std::endl;\n\n\t\treturn 0;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << \"exception: \" << e.what() << std::endl;\n\t\treturn 1;\n\t}\n}\n\n"
  },
  {
    "path": "tests/platform/platform_types.cpp",
    "content": "#include <k3dsdk/types.h>\n\n#include <boost/format.hpp>\n\n#include <iomanip>\n#include <iostream>\n#include <sstream>\n#include <stdexcept>\n#include <vector>\n\n#if defined(__GNUC__) &&  __GNUC__ >= 3\n\n\t#define K3D_HAVE_GCC_DEMANGLE\n\n\t// http://lists.debian.org/debian-gcc/2003/09/msg00055.html notes\n\t// that, in cxxabi.h of gcc-3.x for x < 4, this type is used before it\n\t// is declared.\n\n\t#if __GNUC__ == 3 && __GNUC_MINOR__ < 4\n\t\tclass __class_type_info;\n\t#endif\n\n\t#include <cxxabi.h>\n#endif\n\nconst std::string demangle(const std::string& Type)\n{\n\tstd::string result = Type;\n\n#ifdef K3D_HAVE_GCC_DEMANGLE\n\n\tint status = 0;\n\tchar* const temp = ::abi::__cxa_demangle(Type.c_str(), 0, 0, &status);\n\tif(temp && (status == 0))\n\t\tresult = temp;\n\tif(temp)\n\t\t::free(temp);\n\n#endif // K3D_HAVE_GCC_DEMANGLE\n\n\treturn result;\n}\n\nboost::format format(\"%1% %|30t|%2% %|55t|%3%\");\n\nvoid print_headers()\n{\n\tstd::cout << \"CTEST_FULL_OUTPUT\\n\\n\";\n\n\tstd::cout << format % \"type\" % \"actual type\" % \"size\" << \"\\n\";\n}\n\nvoid print_divider()\n{\n\tstd::cout << format % \"----\" % \"-----------\" % \"----\" << \"\\n\";\n}\n\ntemplate<typename T>\nvoid print_type(const std::string& Type)\n{\n\tstd::ostringstream actual_type;\n\tactual_type << demangle(typeid(T).name());\n\n\tstd::ostringstream actual_size;\n\tactual_size << sizeof(T);\n\n\tstd::cout << format % Type % actual_type.str() % actual_size.str() << \"\\n\";\n}\n\nint main(int, char*[])\n{\n\tprint_headers();\n\tprint_divider();\n\n\tprint_type<bool>(\"bool\");\n\tprint_type<half>(\"half\");\n\tprint_type<float>(\"float\");\n\tprint_type<double>(\"double\");\n\tprint_divider();\n\n\tprint_type<char>(\"char\");\n\tprint_type<unsigned char>(\"unsigned char\");\n\tprint_type<int>(\"int\");\n\tprint_type<unsigned int>(\"unsigned int\");\n\tprint_type<long>(\"long\");\n\tprint_type<unsigned long>(\"unsigned long\");\n\tprint_divider();\n\n\tprint_type<size_t>(\"size_t\");\n\tprint_type<std::vector<int>::size_type>(\"std::vector<int>::size_type\");\n\tprint_divider();\n\n\tprint_type<k3d::bool_t>(\"k3d::bool_t\");\n\tprint_type<k3d::half_t>(\"k3d::half_t\");\n\tprint_type<k3d::float_t>(\"k3d::float_t\");\n\tprint_type<k3d::double_t>(\"k3d::double_t\");\n\tprint_divider();\n\n\tprint_type<k3d::int8_t>(\"k3d::int8_t\");\n\tprint_type<k3d::int16_t>(\"k3d::int16_t\");\n\tprint_type<k3d::int32_t>(\"k3d::int32_t\");\n\tprint_type<k3d::int64_t>(\"k3d::int64_t\");\n\tprint_type<k3d::uint8_t>(\"k3d::uint8_t\");\n\tprint_type<k3d::uint16_t>(\"k3d::uint16_t\");\n\tprint_type<k3d::uint32_t>(\"k3d::uint32_t\");\n\tprint_type<k3d::uint64_t>(\"k3d::uint64_t\");\n\tprint_divider();\n\n\tprint_type<k3d::uint_t>(\"k3d::uint_t\");\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/python/CMakeLists.txt",
    "content": "K3D_TEST(python.module\n  K3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/module.py\n  LABELS python)\n\nK3D_TEST(python.angle_axis\n  K3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/angle_axis.py\n  LABELS python)\n\nK3D_TEST(python.get_dependency\n  K3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/get_dependency.py\n  LABELS python)\n\nK3D_TEST(python.named_arrays\n  K3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/named_arrays.py\n  LABELS python)\n\nK3D_TEST(python.node.selection\n  K3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/node_selection.py\n  LABELS python)\n\nK3D_TEST(python.property_linking\n  K3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/property_linking.py\n  LABELS python)\n\nK3D_TEST(python.property.value\n  K3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/property_value.py\n  LABELS python)\n\nK3D_TEST(python.renderman.attributes\n  K3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/renderman_attributes.py\n  LABELS python)\n\nK3D_TEST(python.renderman.options\n  K3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/renderman_options.py\n  LABELS python)\n\nK3D_TEST(python.user_properties\n  K3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/user_properties.py\n  LABELS python)\n\n# Smoke-test generic share scripts ...\nFILE(GLOB SCRIPT_LIST ${share_SOURCE_DIR}/scripts/*.py)\nLIST(SORT SCRIPT_LIST)\n\nFOREACH(SCRIPT ${SCRIPT_LIST})\n  GET_FILENAME_COMPONENT(SCRIPT_NAME ${SCRIPT} NAME_WE)\n  K3D_TEST(python.share.${SCRIPT_NAME}\n    K3D_PYTHON_SCRIPT ${SCRIPT}\n    ARGUMENTS \"--script-file=${CMAKE_CURRENT_SOURCE_DIR}/document_environment.py\"\n    LABELS python)\nENDFOREACH()\n\n"
  },
  {
    "path": "tests/python/angle_axis.py",
    "content": "#python\n\nimport k3d\nimport math\n\na = k3d.angle_axis(math.radians(90), k3d.vector3(0, 0, 1))\n\nif math.degrees(a.angle) != 90:\n\traise \"angle incorrect\"\n\n"
  },
  {
    "path": "tests/python/document_environment.py",
    "content": "#python\n\n# This script recreates a \"normal\" environment that allows us to perform automated\n# regression-testing on our demo scripts.\n\nimport k3d\n\ncontext.document = k3d.new_document()\n\n"
  },
  {
    "path": "tests/python/get_dependency.py",
    "content": "#python\n\nimport k3d\n\ndoc = k3d.new_document()\n\naxes = k3d.plugin.create(\"Axes\", doc)\nk3d.property.connect(doc, axes.get_property(\"axes\"), axes.get_property(\"xyplane\"));\n\nif k3d.property.connection(doc, axes.get_property(\"xyplane\")).name() != \"axes\":\n\traise \"xyplane dependency should be axes\"\n\nif k3d.property.connection(doc, axes.get_property(\"yzplane\")):\n\traise \"yzplane dependency should be null\"\n\n"
  },
  {
    "path": "tests/python/module.py",
    "content": "#python\n\n# At one point on OSX, I was accidentally linking our Python code against the system\n# Python (2.3), while boost.python was linked against a later version of Python (2.5)\n# provided by MacPorts.  This didn't cause link errors, and the 'k3d' module could be\n# loaded without error at runtime, but the module itself was empty.\n#\n# This test checks the contents of the 'k3d' module to ensure that it isn't empty.\n# You will have to modify this script whenever new symbols are added-to or removed-from\n# the 'k3d' module.\n\nimport k3d\n\nexpected_contents = ['angle_axis', 'atk', 'table', 'batch_mode', 'bezier_triangle_patch', 'bicubic_patch', 'bilinear_patch', 'bitmap', 'blobby', 'bounding_box3', 'check_node_environment', 'close_document', 'color', 'cone', 'const_mesh', 'const_table', 'const_bitmap', 'const_named_arrays', 'const_named_tables', 'const_typed_array_bool_t', 'const_typed_array_color', 'const_typed_array_double_t', 'const_typed_array_imaterial', 'const_typed_array_inode', 'const_typed_array_int16_t', 'const_typed_array_int32_t', 'const_typed_array_int64_t', 'const_typed_array_int8_t', 'const_typed_array_matrix4', 'const_typed_array_normal3', 'const_typed_array_point2', 'const_typed_array_point3', 'const_typed_array_point4', 'const_typed_array_string_t', 'const_typed_array_texture3', 'const_typed_array_uint16_t', 'const_typed_array_uint32_t', 'const_typed_array_uint64_t', 'const_typed_array_uint8_t', 'const_typed_array_vector2', 'const_typed_array_vector3', 'const_uint_t_array', 'create_plugin', 'cubic_curve', 'cylinder', 'difference', 'disk', 'documents', 'euler', 'euler_angles', 'exit', 'file_change_receiver', 'file_signal', 'filesystem', 'geometry', 'get_time', 'hyperboloid', 'identity3', 'idocument', 'intersect_lines', 'inverse', 'iunknown', 'length', 'linear_curve', 'log', 'log_critical', 'log_debug', 'log_error', 'log_info', 'log_warning', 'matrix4', 'mesh', 'mime', 'named_arrays', 'named_tables', 'new_document', 'node', 'normal3', 'nurbs_curve', 'nurbs_patch', 'open_document', 'paraboloid', 'parallel', 'plugin', 'plugins', 'particle', 'point2', 'point3', 'point4', 'polyhedron', 'property', 'resource', 'ri', 'rotate3', 'scale3', 'script', 'selection', 'share_path', 'sphere', 'teapot', 'texture3', 'torus', 'to_vector3', 'translate3', 'typed_array_bool_t', 'typed_array_color', 'typed_array_double_t', 'typed_array_imaterial', 'typed_array_inode', 'typed_array_int16_t', 'typed_array_int32_t', 'typed_array_int64_t', 'typed_array_int8_t', 'typed_array_matrix4', 'typed_array_normal3', 'typed_array_point2', 'typed_array_point3', 'typed_array_point4', 'typed_array_string_t', 'typed_array_texture3', 'typed_array_uint16_t', 'typed_array_uint32_t', 'typed_array_uint64_t', 'typed_array_uint8_t', 'typed_array_vector2', 'typed_array_vector3', 'ui', 'uint_t_array', 'uuid', 'vector2', 'vector3', 'vector4', 'world_position']\n\nactual_contents = dir(k3d)\n\nerror = False\nfor expected in expected_contents:\n\tif expected not in actual_contents:\n\t\terror = True\n\t\tprint \"Missing symbol\", expected\n\nfor actual in actual_contents:\n\tif actual[0:2] == \"__\":\n\t\tcontinue\n\n\tif actual not in expected_contents:\n\t\terror = True\n\t\tprint \"Unexpected symbol\", actual\n\nif error:\n\traise Exception(\"Python module 'k3d' contents changed unexpectedly\")\n\n"
  },
  {
    "path": "tests/python/named_arrays.py",
    "content": "#python\n\nimport k3d\nimport sys\n\ndocument = k3d.new_document()\nfrozen_mesh = k3d.plugin.create(\"FrozenMesh\", document)\nmesh = frozen_mesh.create_mesh()\npolyhedron = k3d.polyhedron.create(mesh)\n\nnamed_array_types = [ \"k3d::bool_t\", \"k3d::color\", \"k3d::double_t\", \"k3d::inode*\", \"k3d::int16_t\", \"k3d::int32_t\", \"k3d::int64_t\", \"k3d::int8_t\", \"k3d::matrix4\", \"k3d::normal3\", \"k3d::point2\", \"k3d::point3\", \"k3d::point4\", \"k3d::string_t\", \"k3d::texture3\", \"k3d::uint16_t\", \"k3d::uint32_t\", \"k3d::uint64_t\", \"k3d::uint8_t\", \"k3d::vector2\", \"k3d::vector3\", \"k3d::uint_t\" ]\n\nfor type in named_array_types:\n\tarray = polyhedron.edge_attributes().create(type, type)\n\nfor type in named_array_types:\n\tarray = polyhedron.edge_attributes()[type]\n\nfor type in named_array_types:\n\tconst_array = polyhedron.edge_attributes()[type]\n\n"
  },
  {
    "path": "tests/python/node_selection.py",
    "content": "#python\n\nimport k3d\n\ndoc = k3d.new_document()\n\nnode_selection = k3d.plugin.create(\"NodeSelection\", doc)\n\nnode1 = k3d.plugin.create(\"FrozenMesh\", doc)\nnode2 = k3d.plugin.create(\"FrozenMesh\", doc)\nnode3 = k3d.plugin.create(\"FrozenMesh\", doc)\n\nnode1.name=\"n1\"\nnode2.name=\"n2\"\nnode3.name=\"n3\"\n\nnode_selection.select(node3, 0.5)\nif node_selection.selection_weight(node3) != 0.5:\n\traise Exception(\"incorrect node selection_weight\")\n\nnode_selection.select(node1, 1.0)\nnode_selection.select(node2, 1.0)\n\nselected_nodes = node_selection.selected_nodes()\n\nif selected_nodes[0].name != node3.name:\n\traise Exception(\"selection order is wrong\")\nif selected_nodes[1].name != node1.name:\n\traise Exception(\"selection order is wrong\")\nif selected_nodes[2].name != node2.name:\n\traise Exception(\"selection order is wrong\")\n\nnode_selection.select(node1, 0.0)\n\nselected_nodes = node_selection.selected_nodes()\n\nif selected_nodes[0].name != node3.name:\n\traise Exception(\"selection order is wrong\")\nif selected_nodes[1].name != node2.name:\n\traise Exception(\"selection order is wrong\")\n\nnode_selection.deselect_all()\nselected_nodes = node_selection.selected_nodes()\nif len(selected_nodes) != 0:\n\traise Exception(\"deselect_all failed\")\n"
  },
  {
    "path": "tests/python/property_linking.py",
    "content": "#python\n\nimport k3d\n\ndoc = k3d.new_document()\n\nnode1 = k3d.plugin.create(\"TwistPoints\", doc)\nnode2 = k3d.plugin.create(\"TwistPoints\", doc)\n\nnode1.axis = \"x\"\nnode2.axis = \"y\"\n\nk3d.property.connect(doc, node1.get_property(\"axis\"), node2.get_property(\"axis\"));\n\nif node1.get_property(\"axis\").internal_value() != \"x\":\n\traise \"incorrect internal value\"\n\nif node2.get_property(\"axis\").internal_value() != \"y\":\n\traise \"incorrect internal value\"\n\nif node1.get_property(\"axis\").pipeline_value() != \"x\":\n\traise \"incorrect pipeline value\"\n\nif node2.get_property(\"axis\").pipeline_value() != \"x\":\n\traise \"incorrect pipeline value\"\n\n"
  },
  {
    "path": "tests/python/property_value.py",
    "content": "#python\n\nimport k3d\n\ndoc = k3d.new_document()\n\naxes = k3d.plugin.create(\"Axes\", doc)\naxes.axes = True\naxes.xyplane = False\n\n# Confirm that setting a property dependency works ...\nk3d.property.connect(doc, axes.get_property(\"axes\"), axes.get_property(\"xyplane\"));\n\nif axes.get_property(\"xyplane\").internal_value() != False:\n\traise \"incorrect internal value\"\n\nif axes.get_property(\"xyplane\").pipeline_value() != True:\n\traise \"incorrect pipeline value\"\n\n# Confirm that removing a property dependency works ...\nk3d.property.disconnect(doc, axes.get_property(\"xyplane\"))\n\nif axes.get_property(\"xyplane\").pipeline_value() != False:\n\traise \"incorrect pipeline value\"\n"
  },
  {
    "path": "tests/python/renderman_attributes.py",
    "content": "#python\n\nimport k3d\nimport sys\n\ndocument = k3d.new_document()\nnode = k3d.plugin.create(\"Null\", document)\n\ntypes = [ \"k3d::color\", \"k3d::point4\", \"k3d::int32_t\", \"k3d::matrix4\", \"k3d::normal3\", \"k3d::point3\", \"k3d::double_t\", \"k3d::string_t\", \"k3d::vector3\" ]\n\nfor type in types:\n\tattribute_name = \"test\"\n\tname = type\n\tlabel = type\n\tdescription = \"\"\n\tk3d.property.ri.create_attribute(node, type, attribute_name, name, label, description)\n\nfor type in types:\n\tname = type\n\tprint type + \" value:\", node.get_property(name).internal_value()\n\n"
  },
  {
    "path": "tests/python/renderman_options.py",
    "content": "#python\n\nimport k3d\nimport sys\n\ndocument = k3d.new_document()\nnode = k3d.plugin.create(\"Null\", document)\n\ntypes = [ \"k3d::color\", \"k3d::point4\", \"k3d::int32_t\", \"k3d::matrix4\", \"k3d::normal3\", \"k3d::point3\", \"k3d::double_t\", \"k3d::string_t\", \"k3d::vector3\" ]\n\nfor type in types:\n\toption_name = \"test\"\n\tname = type\n\tlabel = type\n\tdescription = \"\"\n\tk3d.property.ri.create_option(node, type, option_name, name, label, description)\n\nfor type in types:\n\tname = type\n\tprint type + \" value:\", node.get_property(name).internal_value()\n\n"
  },
  {
    "path": "tests/python/user_properties.py",
    "content": "#python\n\nimport k3d\nimport sys\n\ndocument = k3d.new_document()\nnode = k3d.plugin.create(\"Null\", document)\n\ntypes = [ \"k3d::bool_t\", \"k3d::color\", \"k3d::double_t\", \"k3d::filesystem::path\", \"k3d::gl::imesh_painter*\", \"k3d::imaterial*\", \"k3d::inode*\", \"k3d::int32_t\", \"k3d::matrix4\", \"k3d::mesh*\", \"k3d::normal3\", \"k3d::point3\", \"k3d::point4\", \"k3d::ri::imesh_painter*\", \"k3d::ri::itexture*\", \"k3d::string_t\", \"k3d::vector3\" ]\n\nskip_values = [ ]\n\nfor type in types:\n\tname = type\n\tlabel = type\n\tdescription = \"\"\n\tk3d.property.create(node, type, name, label, description)\n\nfor type in types:\n\tif type not in skip_values:\n\t\tname = type\n\t\tprint type + \" value:\", node.get_property(name).internal_value()\n\n"
  },
  {
    "path": "tests/sdk/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_SIGC_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${K3D_GLIBMM_INCLUDE_DIRS})\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})\n\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nLINK_LIBRARIES(k3dsdk)\n\nADD_EXECUTABLE(test-difference difference.cpp)\nK3D_TEST(sdk.difference TARGET test-difference LABELS sdk)\n\nADD_EXECUTABLE(test-array-metadata array_metadata.cpp)\nK3D_TEST(sdk.array.metadata TARGET test-array-metadata LABELS sdk)\n\nIF(WIN32 AND K3D_COMPILER_GCC)\n\t# For some reason, building with optimizations enabled causes link problems with half::eLut and auto-import\n\tSET_SOURCE_FILES_PROPERTIES(bitmap_conversion.cpp PROPERTIES COMPILE_FLAGS -O0)\nENDIF(WIN32 AND K3D_COMPILER_GCC)\nADD_EXECUTABLE(test-bitmap-conversion bitmap_conversion.cpp)\nK3D_TEST(sdk.bitmap.conversion TARGET test-bitmap-conversion LABELS sdk)\n\nADD_EXECUTABLE(test-circular-signals circular_signals.cpp)\nK3D_TEST(sdk.circular-signals TARGET test-circular-signals LABELS sdk)\n\nADD_EXECUTABLE(test-hint-mapping hint_mapping.cpp)\nK3D_TEST(sdk.hint-mapping TARGET test-hint-mapping LABELS sdk)\n\nADD_EXECUTABLE(test-data-sizes data_sizes.cpp)\nK3D_TEST(sdk.data-sizes TARGET test-data-sizes LABELS sdk)\n\nADD_EXECUTABLE(test-float-to-string float_to_string.cpp)\nK3D_TEST(sdk.float-to-string.001 TARGET test-float-to-string ARGUMENTS 123 LABELS sdk)\nK3D_TEST(sdk.float-to-string.002 TARGET test-float-to-string ARGUMENTS 123.4 LABELS sdk)\nK3D_TEST(sdk.float-to-string.003 TARGET test-float-to-string ARGUMENTS 123.456 LABELS sdk)\nK3D_TEST(sdk.float-to-string.004 TARGET test-float-to-string ARGUMENTS 123.456789012 LABELS sdk)\nK3D_TEST(sdk.float-to-string.005 TARGET test-float-to-string ARGUMENTS 123.4567890123456 LABELS sdk)\n\nADD_EXECUTABLE(test-path-decomposition path_decomposition.cpp)\nK3D_TEST(sdk.path.decomposition TARGET test-path-decomposition LABELS sdk)\n\nADD_EXECUTABLE(test-path-relative relative_path.cpp)\nK3D_TEST(sdk.path.relative.001 TARGET test-path-relative ARGUMENTS \"/home/bubba/k3d/test.k3d\" \"/\" \"home/bubba/k3d/test.k3d\" LABELS sdk)\nK3D_TEST(sdk.path.relative.002 TARGET test-path-relative ARGUMENTS \"/home/bubba/k3d/test.k3d\" \"/home/bubba\" \"k3d/test.k3d\" LABELS sdk)\nK3D_TEST(sdk.path.relative.003 TARGET test-path-relative ARGUMENTS \"/home/bubba/k3d/test.k3d\" \"/var/documents\" \"../../home/bubba/k3d/test.k3d\" LABELS sdk)\n\nADD_EXECUTABLE(test-program-options program_options.cpp)\nK3D_TEST(sdk.program-options TARGET test-program-options LABELS sdk)\n\nADD_EXECUTABLE(test-selection-equality selection_equality.cpp)\nK3D_TEST(sdk.selection-equality TARGET test-selection-equality LABELS sdk)\n\nADD_EXECUTABLE(test-selection-serialization selection_serialization.cpp)\nK3D_TEST(sdk.selection-serialization TARGET test-selection-serialization LABELS sdk)\n\nADD_EXECUTABLE(test-xml-sanity-checks xml_sanity_checks.cpp)\nK3D_TEST(sdk.xml-sanity-checks TARGET test-xml-sanity-checks LABELS sdk)\n\nADD_EXECUTABLE(test-xml-xpath xml_xpath.cpp)\nK3D_TEST(sdk.xml-xpath TARGET test-xml-xpath LABELS sdk)\n\nADD_EXECUTABLE(test-document-upgrade document_upgrade.cpp)\nK3D_TEST(sdk.document-upgrade TARGET test-document-upgrade LABELS sdk)\n\nADD_EXECUTABLE(test-pipeline-data pipeline_data.cpp)\nK3D_TEST(sdk.pipeline-data TARGET test-pipeline-data LABELS sdk)\n\nADD_EXECUTABLE(test-uuid uuid.cpp)\nK3D_TEST(sdk.uuid TARGET test-uuid LABELS sdk)\n\nIF(UNIX)\n\tADD_LIBRARY(shared-dynamic-cast SHARED shared_dynamic_cast_library.cpp)\n\tGET_TARGET_PROPERTY(SHARED_DYNAMIC_CAST_LIBRARY shared-dynamic-cast LOCATION)\n\tCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/shared_dynamic_cast_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/shared_dynamic_cast_config.h)\n\tADD_EXECUTABLE(test-shared-dynamic-cast shared_dynamic_cast.cpp)\n\ttarget_link_libraries(test-shared-dynamic-cast ${CMAKE_DL_LIBS})\n\tIF(NOT APPLE)\n\t\tSET_TARGET_PROPERTIES(test-shared-dynamic-cast PROPERTIES LINK_FLAGS -Wl,-E)\n\tENDIF()\n\tK3D_TEST(sdk.shared-dynamic-cast TARGET test-shared-dynamic-cast LABELS sdk)\nENDIF()\n\n"
  },
  {
    "path": "tests/sdk/array_metadata.cpp",
    "content": "#include <k3dsdk/metadata_keys.h>\n#include <k3dsdk/typed_array.h>\n#include <k3dsdk/uint_t_array.h>\n\n#include <boost/scoped_ptr.hpp>\n\n#include <iostream>\n#include <sstream>\n#include <stdexcept>\n\n#define test_expression(expression) \\\n\tif(!(expression)) \\\n\t{ \\\n\t\tstd::ostringstream buffer; \\\n\t\tbuffer << #expression << \" failed at \" << __FILE__ << \": \" << __LINE__; \\\n\t\tthrow std::runtime_error(buffer.str()); \\\n\t} \\\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\t// Validate the initially-empty state ...\n\t\tk3d::uint_t_array a;\n\t\ttest_expression(a.empty());\n\t\ttest_expression(a.get_metadata().empty());\n\n\t\t// Put some data in the array ...\n\t\ta.push_back(1);\n\t\ta.push_back(2);\n\t\ttest_expression(a.size() == 2);\n\n\t\t// Assign some metadata ...\n\t\ta.set_metadata_value(k3d::metadata::key::domain(), k3d::metadata::value::point_indices_domain());\n\t\ttest_expression(a.get_metadata().size() == 1);\n\t\ttest_expression(a.get_metadata_value(k3d::metadata::key::domain()) == k3d::metadata::value::point_indices_domain());\n\n\t\t// Verify that metadata is copied correctly ...\n\t\tk3d::uint_t_array b = a;\n\t\ttest_expression(b.size() == 2);\n\t\ttest_expression(b.get_metadata().size() == 1);\n\t\ttest_expression(b.get_metadata_value(k3d::metadata::key::domain()) == k3d::metadata::value::point_indices_domain());\n\n\t\tboost::scoped_ptr<k3d::array> c(a.clone());\n\t\ttest_expression(c->size() == 2);\n\t\ttest_expression(c->get_metadata().size() == 1);\n\t\ttest_expression(c->get_metadata_value(k3d::metadata::key::domain()) == k3d::metadata::value::point_indices_domain());\n\n\t\tboost::scoped_ptr<k3d::array> d(a.clone_type());\n\t\ttest_expression(d->empty());\n\t\ttest_expression(d->get_metadata().size() == 1);\n\t\ttest_expression(d->get_metadata_value(k3d::metadata::key::domain()) == k3d::metadata::value::point_indices_domain());\n\n\t\t// Verify that metadata is handled correctly when testing for equality ...\n\t\tk3d::uint_t_array e = a;\n\t\ttest_expression(boost::accumulators::min(k3d::difference::test(e, a).exact) != false);\n\t\t\n\t\te.set_metadata_value(\"foo\", \"bar\");\n\t\ttest_expression(boost::accumulators::min(k3d::difference::test(e, a).exact) != true);\n\n\t\te.erase_metadata_value(\"foo\");\n\t\ttest_expression(boost::accumulators::min(k3d::difference::test(e, a).exact) != false);\n\n\t\te.set_metadata_value(k3d::metadata::key::domain(), \"../array[@name=\\\"clockwise_edges\\\"]/indices()\");\n\t\ttest_expression(boost::accumulators::min(k3d::difference::test(e, a).exact) != true);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << \"uncaught exception: \" << e.what() << std::endl;\n\t\treturn 1;\n\t}\n\tcatch(...)\n\t{\n\t\tstd::cerr << \"unknown exception\" << std::endl;\n\t}\n\t\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/bitmap_conversion.cpp",
    "content": "#include <k3dsdk/bitmap.h>\n\nstruct extract_rgb\n{\n\ttemplate<typename P1, typename P2>\n\tvoid operator()(const P1& src, P2& dst) const\n\t{\n\t\tget_color(dst, boost::gil::red_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::red_t()));\n\t\tget_color(dst, boost::gil::green_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::green_t()));\n\t\tget_color(dst, boost::gil::blue_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::blue_t()));\n\t}\n};\n\nstruct extract_alpha\n{\n\ttemplate<typename P1, typename P2>\n\tvoid operator()(const P1& src, P2& dst) const\n\t{\n\t\tget_color(dst, boost::gil::red_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::alpha_t()));\n\t\tget_color(dst, boost::gil::green_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::alpha_t()));\n\t\tget_color(dst, boost::gil::blue_t()) = boost::gil::channel_convert<boost::gil::bits8>(get_color(src, boost::gil::alpha_t()));\n\t}\n};\n\nnamespace boost\n{\n\nnamespace gil\n{\n\ntypedef pixel<bits8, bgr_layout_t> bgr8_pixel_t;\ntypedef image<bgr8_pixel_t, false> bgr8_image_t;\n\n} // namespace gil\n\n} // namespace boost\n\nint main(int argc, char* argv[])\n{\n\tk3d::bitmap source(2, 2);\n\tconst k3d::bitmap::view_t& source_view = view(source);\n\tstd::fill(source_view.begin(), source_view.end(), k3d::pixel(1.0, 0.5, 0.0, 0.5));\n\n\tassert(boost::gil::get_color(source_view[0], boost::gil::red_t()) == 1.0);\n\tassert(boost::gil::get_color(source_view[0], boost::gil::green_t()) == 0.5);\n\tassert(boost::gil::get_color(source_view[0], boost::gil::blue_t()) == 0.0);\n\tassert(boost::gil::get_color(source_view[0], boost::gil::alpha_t()) == 0.5);\n\n\tboost::gil::bgr8_image_t destination(2, 2);\n\tconst boost::gil::bgr8_image_t::view_t& destination_view = view(destination);\n\n\tcopy_pixels(boost::gil::color_converted_view<boost::gil::bgr8_pixel_t>(source_view, extract_rgb()), destination_view);\n\n\tassert(boost::gil::get_color(destination_view[0], boost::gil::red_t()) == 255);\n\tassert(boost::gil::get_color(destination_view[0], boost::gil::green_t()) == 127);\n\tassert(boost::gil::get_color(destination_view[0], boost::gil::blue_t()) == 0);\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/circular_signals.cpp",
    "content": "#include <k3dsdk/signal_system.h>\n#include <k3dsdk/signal_slots.h>\n\n#include <iostream>\n#include <set>\n#include <stdexcept>\n#include <string>\n\nvoid on_signal(std::string Name)\n{\n\tstd::cerr << Name << std::flush;\n}\n\nclass break_cycles\n{\npublic:\n\ttypedef void result_type;\n\n\ttemplate<typename IteratorT>\n\tresult_type operator()(IteratorT First, IteratorT Last)\n\t{\n\t\t++emissions;\n\n\t\tif(emissions > 10)\n\t\t{\n\t\t\tthrow std::runtime_error(\"detected possible infinite loop\");\n\t\t}\n\n\t\tfor(IteratorT first = First; first != Last; ++first)\n\t\t{\n\t\t\t*first;\n\t\t}\n\n\t\t--emissions;\n\t}\n\nprivate:\n\tstatic unsigned long emissions;\n};\n\nunsigned long break_cycles::emissions = 0;\n\ntypedef sigc::signal0<void, break_cycles> signal_type;\n\nvoid run_test(signal_type& Signal)\n{\n\tstatic unsigned long test_number = 0;\n\n\tstd::cerr << \"running test \" << ++test_number << \" \" << std::flush;\n\tSignal.emit();\n\tstd::cerr << std::endl;\n}\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\t// Test A <--> B\n\t\tsignal_type A;\n\t\tsignal_type B;\n\n\t\tA.connect(sigc::bind(sigc::ptr_fun(on_signal), \"A\"));\n\t\tA.connect(k3d::signal::make_loop_safe_slot(B));\n\n\t\tB.connect(sigc::bind(sigc::ptr_fun(on_signal), \"B\"));\n\t\tB.connect(k3d::signal::make_loop_safe_slot(A));\n\n\t\trun_test(A);\n\t\trun_test(B);\n\n\t\t// Test C <--> C\n\t\tsignal_type C;\n\t\tC.connect(sigc::bind(sigc::ptr_fun(on_signal), \"C\"));\n\t\tC.connect(k3d::signal::make_loop_safe_slot(C));\n\n\t\trun_test(C);\n\n\t\t// Test D --> E <--> F\n\t\tsignal_type D;\n\t\tsignal_type E;\n\t\tsignal_type F;\n\n\t\tD.connect(sigc::bind(sigc::ptr_fun(on_signal), \"D\"));\n\t\tD.connect(k3d::signal::make_loop_safe_slot(E));\n\n\t\tE.connect(sigc::bind(sigc::ptr_fun(on_signal), \"E\"));\n\t\tE.connect(k3d::signal::make_loop_safe_slot(F));\n\n\t\tF.connect(sigc::bind(sigc::ptr_fun(on_signal), \"F\"));\n\t\tF.connect(k3d::signal::make_loop_safe_slot(E));\n\n\t\trun_test(D);\n\t\trun_test(E);\n\t\trun_test(F);\n\n\t\t/** Test G --> H <--> I\n\t\t\t \\\n\t\t\t  \\---J\n\t\t*/\n\t\tsignal_type G;\n\t\tsignal_type H;\n\t\tsignal_type I;\n\t\tsignal_type J;\n\n\t\tG.connect(sigc::bind(sigc::ptr_fun(on_signal), \"G\"));\n\t\tG.connect(k3d::signal::make_loop_safe_slot(H));\n\t\tG.connect(k3d::signal::make_loop_safe_slot(J));\n\n\t\tH.connect(sigc::bind(sigc::ptr_fun(on_signal), \"H\"));\n\t\tH.connect(k3d::signal::make_loop_safe_slot(I));\n\n\t\tI.connect(sigc::bind(sigc::ptr_fun(on_signal), \"I\"));\n\t\tI.connect(k3d::signal::make_loop_safe_slot(H));\n\n\t\tJ.connect(sigc::bind(sigc::ptr_fun(on_signal), \"J\"));\n\n\t\trun_test(G);\n\t\trun_test(H);\n\t\trun_test(I);\n\t\trun_test(J);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << \"caught exception: \" << e.what() << std::endl;\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/data_sizes.cpp",
    "content": "#include <k3dsdk/data.h>\n#include <k3dsdk/vectors.h>\n\n#include <iostream>\n\n#define print_size(type) \\\n\tstd::cout << \"sizeof(\" << #type << \"): \" << sizeof(type) << std::endl;\n\nint main(int argc, char* argv[])\n{\n\tprint_size(sigc::connection);\n\t\t\n\tprint_size(k3d_data(k3d::bool_t, no_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::bool_t, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::bool_t, immutable_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::bool_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\t\n\tprint_size(k3d_data(k3d::int32_t, no_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::int32_t, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::int32_t, immutable_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::int32_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\t\n\tprint_size(k3d_data(k3d::double_t, no_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::double_t, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::double_t, immutable_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::double_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\t\n\tprint_size(k3d_data(std::string, no_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(std::string, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(std::string, immutable_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(std::string, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\t\n\tprint_size(k3d_data(k3d::point3, no_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::point3, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::point3, immutable_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\tprint_size(k3d_data(k3d::point3, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization));\n\n\tk3d_data(k3d::int32_t, no_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) a(init_value(0));\n\tassert(a.internal_value() == 0);\n\n\tk3d_data(k3d::int32_t, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) b(init_value(1));\n\tassert(b.internal_value() == 1);\n\n\tk3d_data(k3d::int32_t, immutable_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) c(init_value(2) + init_name(\"c\"));\n\tassert(c.name() == \"c\" && c.internal_value() == 2);\n\n\tk3d_data(k3d::int32_t, immutable_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) d(init_value(3) + init_name(\"d\"));\n\tassert(d.name() == \"d\" && d.internal_value() == 3);\n\n\tk3d_data(k3d::int32_t, immutable_name, no_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) e(init_value(4) + init_name(\"e\"));\n\te.set_value(5);\n\tassert(e.name() == \"e\" && e.internal_value() == 5);\n\n\tk3d_data(k3d::int32_t, immutable_name, no_signal, no_undo, local_storage, with_constraint, no_property, no_serialization) f(init_value(6) + init_name(\"f\") + init_constraint(constraint::minimum(7)));\n\tassert(f.name() == \"f\" && f.internal_value() == 6);\n\tf.set_value(0);\n\tassert(f.internal_value() == 7);\n\n\tk3d_data(k3d::int32_t, immutable_name, no_signal, no_undo, local_storage, with_constraint, no_property, no_serialization) g(init_value(8) + init_name(\"g\") + init_constraint(constraint::maximum(9)));\n\tassert(g.name() == \"g\" && g.internal_value() == 8);\n\tg.set_value(10);\n\tassert(g.internal_value() == 9);\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/difference.cpp",
    "content": "#include <k3dsdk/difference.h>\n#include <k3dsdk/type_registry.h>\n#include <k3dsdk/vectors.h>\n\n#include <cassert>\n#include <iomanip>\n#include <iostream>\n#include <stdexcept>\n\n#include <limits>\n\ntemplate<typename T>\nvoid test_difference(const T& A, const T& B, const k3d::uint64_t Threshold)\n{\n\tstd::cout << std::setprecision(17) << k3d::demangle(typeid(T)) << \": \" << A << \" == \" << B << std::endl;\n\n\tconst k3d::difference::accumulator result = k3d::difference::test(A, B);\n\n\tif(boost::accumulators::count(result.exact) && boost::accumulators::min(result.exact) == false)\n\t\tthrow std::runtime_error(\"exact value mismatch\");\n\n\tif(boost::accumulators::count(result.ulps) && boost::accumulators::max(result.ulps) > Threshold)\n\t\tthrow std::runtime_error(\"ulps exceed threshold\");\n}\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\ttest_difference(true, true, 0);\n\t\ttest_difference(false, false, 0);\n\n\t\ttest_difference(123, 123, 0);\n\n\t\tconst double a = 1.0;\n\t\tconst double b = a + std::numeric_limits<double>::epsilon();\n\t\tconst double c = b + std::numeric_limits<double>::epsilon();\n\t\tconst double d = c + std::numeric_limits<double>::epsilon();\n\t\tconst double e = a - std::numeric_limits<double>::epsilon();\n\t\tconst double f = e - std::numeric_limits<double>::epsilon();\n\n\t\ttest_difference(a, a, 0);\n\t\ttest_difference(a, b, 1);\n\t\ttest_difference(a, c, 2);\n\t\ttest_difference(a, d, 3);\n\t\ttest_difference(a, e, 2);\n\t\ttest_difference(a, f, 4);\n\n\t\ttest_difference(k3d::point2(a, a), k3d::point2(a, a), 0);\n\t\ttest_difference(k3d::point2(a, a), k3d::point2(b, b), 1);\n\n\t\ttest_difference(k3d::point3(a, a, a), k3d::point3(a, a, a), 0);\n\t\ttest_difference(k3d::point3(a, a, a), k3d::point3(b, b, b), 1);\n\n\t\ttest_difference(k3d::point4(a, a, a, a), k3d::point4(a, a, a, a), 0);\n\t\ttest_difference(k3d::point4(a, a, a, a), k3d::point4(b, b, b, b), 1);\n\n\t\ttest_difference(k3d::vector2(a, a), k3d::vector2(a, a), 0);\n\t\ttest_difference(k3d::vector2(a, a), k3d::vector2(b, b), 1);\n\n\t\ttest_difference(k3d::vector3(a, a, a), k3d::vector3(a, a, a), 0);\n\t\ttest_difference(k3d::vector3(a, a, a), k3d::vector3(b, b, b), 1);\n\n\t\ttest_difference(k3d::normal3(a, a, a), k3d::normal3(a, a, a), 0);\n\t\ttest_difference(k3d::normal3(a, a, a), k3d::normal3(b, b, b), 1);\n\n\t\treturn 0;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cout << e.what() << std::endl;\n\t\treturn 1;\n\t}\n}\n\n"
  },
  {
    "path": "tests/sdk/document_upgrade.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/log_control.h>\n#include <k3dsdk/serialization_xml.h>\n#include <k3dsdk/xml.h>\n#include <k3dsdk/xpath.h>\n\nusing namespace k3d::xml;\n\n#include <iostream>\n#include <stdexcept>\n#include <sstream>\n\n#define test_expression(expression) \\\n{ \\\n  if(!(expression)) \\\n    { \\\n    std::ostringstream buffer; \\\n    buffer << \"Expression failed at line \" << __LINE__ << \": \" << #expression; \\\n    throw std::runtime_error(buffer.str()); \\\n    } \\\n}\n\nint main(int argc, char* argv[])\n{\n\tk3d::log_color_level(true);\n\tk3d::log_show_level(true);\n\tk3d::log_minimum_level(k3d::K3D_LOG_LEVEL_DEBUG);\n\n\ttry\n\t{\n\t\telement document(\"k3d\",\n\t\t\telement(\"objects\",\n\t\t\t\telement(\"object\",\n\t\t\t\t\tattribute(\"class\", \"foo\"),\n\t\t\t\t\telement(\"variables\",\n\t\t\t\t\t\telement(\"object\"),\n\t\t\t\t\t\telement(\"shader\"),\n\t\t\t\t\t\telement(\"variable\")\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\telement(\"object\",\n\t\t\t\t\tattribute(\"class\", \"bar\"),\n\t\t\t\t\telement(\"variables\",\n\t\t\t\t\t\telement(\"object\"),\n\t\t\t\t\t\telement(\"shader\"),\n\t\t\t\t\t\telement(\"property\",\n\t\t\t\t\t\t\tattribute(\"value\", \"12345\")\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\telement(\"property\",\n\t\t\t\t\t\t\tattribute(\"user_property\", \"vanilla\"),\n\t\t\t\t\t\t\tattribute(\"type\", \"double\")\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\telement(\"pipeline\",\n\t\t\t\telement(\"dependency\",\n\t\t\t\t\tattribute(\"from_object\", \"0\"),\n\t\t\t\t\tattribute(\"to_object\", \"1\")\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\n\t\tstd::cerr << \"before:\" << std::endl;\n\t\tstd::cerr << document << std::endl;\n\n\t\tupgrade_document(document);\n\n\t\tstd::cerr << \"after:\" << std::endl;\n\t\tstd::cerr << document << std::endl;\n\n\t\ttest_expression(xpath::match(document, \"/k3d/objects\").size() == 0);\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes\").size() == 1);\n\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes/object\").size() == 0);\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes/node\").size() == 2);\n\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes/node[@class]\").size() == 0);\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes/node[@factory]\").size() == 2);\n\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes/node/variables\").size() == 0);\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes/node/properties\").size() == 2);\n\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes/node/properties/object\").size() == 0);\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes/node/properties/shader\").size() == 0);\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes/node/properties/variable\").size() == 0);\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes/node/properties/property\").size() == 7);\n\n\t\ttest_expression(xpath::match(document, \"/k3d/nodes/node/properties/property[@value]\").size() == 0);\n\n\t\ttest_expression(xpath::match(document, \"/k3d/pipeline\").size() == 0);\n\t\ttest_expression(xpath::match(document, \"/k3d/dependencies\").size() == 1);\n\n\t\ttest_expression(xpath::match(document, \"/k3d/dependencies/dependency[@from_object]\").size() == 0);\n\t\ttest_expression(xpath::match(document, \"/k3d/dependencies/dependency[@to_object]\").size() == 0);\n\t\ttest_expression(xpath::match(document, \"/k3d/dependencies/dependency[@from_node]\").size() == 1);\n\t\ttest_expression(xpath::match(document, \"/k3d/dependencies/dependency[@to_node]\").size() == 1);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << e.what() << std::endl;\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/float_to_string.cpp",
    "content": "#include <k3dsdk/string_cast.h>\n#include <iostream>\n\n/// Tests to ensure that floating-point numbers are converted to strings without loss of precision\nint main(int argc, char* argv[])\n{\n\tfor(int i = 1; i < argc; ++i)\n\t{\n\t\tconst std::string original = argv[i];\n\t\tconst double value = k3d::from_string<double>(original, 0.0);\n\n\t\tstd::ostringstream buffer;\n\t\tbuffer << k3d::string_cast(value);\n\n\t\tif(original != buffer.str())\n\t\t{\n\t\t\tstd::cerr << \"string conversion failure, original: \" << original << \" result: \" << buffer.str() << std::endl;\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/hint_mapping.cpp",
    "content": "#include <k3dsdk/bitmap.h>\n#include <k3dsdk/color.h>\n#include <k3dsdk/data.h>\n#include <k3dsdk/hints.h>\n#include <k3dsdk/pointer_demand_storage.h>\n#include <k3dsdk/types.h>\n\n#include <iostream>\n\nvoid signal_changed(k3d::ihint* Hint, const k3d::string_t& Message)\n{\n\tstd::cerr << Message << \": \" << k3d::hint::print(Hint) << std::endl;\n}\n\nvoid property_executed(const std::vector<k3d::ihint*>& Hints, k3d::bitmap& Bitmap)\n{\n\tfor(size_t i = 0; i != Hints.size(); ++i)\n\t\tstd::cerr << \"executing with: \" << k3d::hint::print(Hints[i]) << std::endl;\n}\n\nint main(int argc, char* arv[])\n{\n\t// Setup some example signals ...\n\tk3d_data(k3d::bitmap*, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) input_bitmap(init_value<k3d::bitmap*>(0));\n\tk3d_data(k3d::uint32_t, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) border(init_value<k3d::uint32_t>(0));\n\tk3d_data(k3d::color, no_name, change_signal, no_undo, local_storage, no_constraint, no_property, no_serialization) color(init_value(k3d::color(0, 0, 0)));\n\tk3d_data(k3d::bitmap*, no_name, change_signal, no_undo, pointer_demand_storage, no_constraint, no_property, no_serialization) output_bitmap(init_value<k3d::bitmap*>(0));\n\n\t// We want to print to the console whenever a signal is emitted ...\n\tinput_bitmap.changed_signal().connect(sigc::bind(sigc::ptr_fun(signal_changed), \"input changed\"));\n\tborder.changed_signal().connect(sigc::bind(sigc::ptr_fun(signal_changed), \"border changed\"));\n\tcolor.changed_signal().connect(sigc::bind(sigc::ptr_fun(signal_changed), \"color changed\"));\n\toutput_bitmap.changed_signal().connect(sigc::bind(sigc::ptr_fun(signal_changed), \"output changed\"));\n\n\t// We want to print whenever the output property is executed ...\n\toutput_bitmap.set_update_slot(sigc::ptr_fun(property_executed));\n\n\t// Setup our \"network\" of mappings from input signals to output signals ...\n\tinput_bitmap.changed_signal().connect(k3d::hint::converter<\n\t\tk3d::hint::convert<k3d::hint::bitmap_dimensions_changed, k3d::hint::unchanged,\n\t\tk3d::hint::convert<k3d::hint::bitmap_pixels_changed, k3d::hint::unchanged,\n\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::none> > > >(output_bitmap.make_slot()));\n\n\tborder.changed_signal().connect(k3d::hint::converter<\n\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_dimensions_changed> >(output_bitmap.make_slot()));\n\n\tcolor.changed_signal().connect(k3d::hint::converter<\n\t\tk3d::hint::convert<k3d::hint::any, k3d::hint::bitmap_pixels_changed> >(output_bitmap.make_slot()));\n\n\t// Exercise the hint-mapping network ...\n\tstd::cerr << \"****************\" << std::endl;\n\tinput_bitmap.changed_signal().emit(k3d::hint::bitmap_dimensions_changed::instance());\n\n\tstd::cerr << \"****************\" << std::endl;\n\tinput_bitmap.changed_signal().emit(k3d::hint::bitmap_pixels_changed::instance());\n\n\tstd::cerr << \"****************\" << std::endl;\n\tinput_bitmap.changed_signal().emit(0);\n\n\tstd::cerr << \"****************\" << std::endl;\n\tborder.changed_signal().emit(0);\n\n\tstd::cerr << \"****************\" << std::endl;\n\tcolor.changed_signal().emit(0);\n\n\tstd::cerr << \"****************\" << std::endl;\n\toutput_bitmap.internal_value();\n\n\tstd::cerr << \"****************\" << std::endl;\n\toutput_bitmap.internal_value();\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/non_blocking_server.cpp",
    "content": "#include <k3dsdk/socket.h>\n#include <k3dsdk/system.h>\n#include <iostream>\n\nint main(int argc, char* argv[])\n{\n\tconst int port = 10000;\n\t\n\ttry\n\t{\n\t\tk3d::socket::endpoint server = k3d::socket::listen(port);\n\t\tserver.set_non_blocking();\n\t\tstd::cerr << \"listening on port \" << port << std::endl;\n\t\t\t\n\t\twhile(true)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tk3d::socket::endpoint connection = server.accept();\n\t\t\t\tstd::cerr << \"client connected\" << std::endl;\n\n\t\t\t\twhile(true)\n\t\t\t\t{\n\t\t\t\t\tstd::string buffer;\n\t\t\t\t\tconnection.read(buffer);\n\t\t\t\t\tconnection.write(buffer);\n\t\t\t\t\tstd::cerr << buffer << std::flush;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch(k3d::socket::would_block& e)\n\t\t\t{\n\t\t\t\tstd::cerr << \"waiting\" << std::endl;\n\t\t\t\tk3d::system::sleep(1);\n\t\t\t}\n\t\t}\n\t}\n\tcatch(k3d::socket::closed& e)\n\t{\n\t\tstd::cerr << \"client disconnected\" << std::endl;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << e.what() << std::endl;\t\n\t}\n}\n\n"
  },
  {
    "path": "tests/sdk/nurbs_deserialize.cpp",
    "content": "#include <k3dsdk/nurbs.h>\n\nint main(int argc, char* argv[])\n{\n\tk3d::nurbs::curve3 curve(0);\n\tstd::cin >> curve;\n\tstd::cout << curve << std::endl;\n\t\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/nurbs_evaluate.cpp",
    "content": "#include <k3dsdk/nurbs.h>\n\nint main(int argc, char* argv[])\n{\n\tk3d::nurbs::curve3 curve(0);\n\tstd::cin >> curve;\n\n\tdouble parameter = 0;\n\tfor(std::cin >> parameter; std::cin; std::cin >> parameter)\n\t\tstd::cout << k3d::nurbs::evaluate(curve, parameter) << \" \";\n\t\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/nurbs_serialize.cpp",
    "content": "#include <k3dsdk/nurbs.h>\n\nint main(int argc, char* argv[])\n{\n\tk3d::nurbs::curve3 curve(4);\n\t\n\tcurve.knots.push_back(0);\n\tcurve.knots.push_back(0);\n\tcurve.knots.push_back(0);\n\tcurve.knots.push_back(0);\n\tcurve.knots.push_back(1);\n\tcurve.knots.push_back(1);\n\tcurve.knots.push_back(1);\n\tcurve.knots.push_back(1);\n\n\tcurve.control_points.push_back(k3d::nurbs::curve3::control_point(k3d::point3(0, 0, 0)));\n\tcurve.control_points.push_back(k3d::nurbs::curve3::control_point(k3d::point3(0, 5, 0)));\n\tcurve.control_points.push_back(k3d::nurbs::curve3::control_point(k3d::point3(5, 5, 0)));\n\tcurve.control_points.push_back(k3d::nurbs::curve3::control_point(k3d::point3(5, 0, 0)));\n\n\tstd::cout << curve << std::endl;\n\t\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/path_decomposition.cpp",
    "content": "#include <k3dsdk/path.h>\n\n#include <iostream>\n#include <sstream>\n#include <stdexcept>\n\nclass quoted_string\n{\npublic:\n\tquoted_string(const Glib::ustring& String) :\n\t\tstring(String)\n\t{\n\t}\n\n\tfriend std::ostream& operator<<(std::ostream& Stream, const quoted_string& String)\n\t{\n\t\tStream << \"[\" << String.string.raw() << \"]\";\n\t\treturn Stream;\n\t}\n\nprivate:\n\tconst Glib::ustring string;\n};\n\nvoid test_native_to_generic(const std::string& Native, const std::string& Generic)\n{\n\tk3d::filesystem::path path = k3d::filesystem::native_path(k3d::ustring::from_utf8(Native));\n\tstd::cout << \"native to generic: \" << Native << \" -> \" << path.generic_utf8_string().raw() << std::endl;\n\n\tif(path.generic_utf8_string() != k3d::ustring::from_utf8(Generic))\n\t\tthrow std::runtime_error(\"results don't match\");\n}\n\nvoid test_iteration(const std::string& Native, const std::string& Generic)\n{\n\tk3d::filesystem::path path = k3d::filesystem::native_path(k3d::ustring::from_utf8(Native));\n\n\tstd::ostringstream buffer;\n\tfor(k3d::filesystem::path::iterator p = path.begin(); p != path.end(); ++p)\n\t\tbuffer << (*p).raw() << \",\";\n//\tstd::copy(path.begin(), path.end(), std::ostream_iterator<Glib::ustring>(buffer, \",\"));\n\n\tstd::cout << \"path iteration: \" << Native << \" -> \" << buffer.str() << std::endl;\n\n\tif(buffer.str() != Generic)\n\t\tthrow std::runtime_error(\"results don't match\");\n}\n\nvoid test_root_name(const std::string& Native, const std::string& Generic)\n{\n\tk3d::filesystem::path path = k3d::filesystem::native_path(k3d::ustring::from_utf8(Native));\n\tstd::cout << \"root name: \" << Native << \" -> \" << path.root_name().raw() << std::endl;\n\n\tif(path.root_name() != k3d::ustring::from_utf8(Generic))\n\t\tthrow std::runtime_error(\"results don't match\");\n}\n\nvoid test_root_directory(const std::string& Native, const std::string& Generic)\n{\n\tk3d::filesystem::path path = k3d::filesystem::native_path(k3d::ustring::from_utf8(Native));\n\tstd::cout << \"root directory: \" << Native << \" -> \" << path.root_directory().raw() << std::endl;\n\n\tif(path.root_directory() != k3d::ustring::from_utf8(Generic))\n\t\tthrow std::runtime_error(\"results don't match\");\n}\n\nvoid test_branch_path(const std::string& Native, const std::string& Generic)\n{\n\tk3d::filesystem::path path = k3d::filesystem::native_path(k3d::ustring::from_utf8(Native));\n\tstd::cout << \"branch path: \" << Native << \" -> \" << path.branch_path().generic_utf8_string().raw() << std::endl;\n\n\tif(path.branch_path().generic_utf8_string() != k3d::ustring::from_utf8(Generic))\n\t\tthrow std::runtime_error(\"results don't match\");\n}\n\nvoid test_leaf(const std::string& Native, const std::string& Generic)\n{\n\tk3d::filesystem::path path = k3d::filesystem::native_path(k3d::ustring::from_utf8(Native));\n\tstd::cout << \"path leaf: \" << Native << \" -> \" << path.leaf().raw() << std::endl;\n\n\tif(path.leaf() != k3d::ustring::from_utf8(Generic))\n\t\tthrow std::runtime_error(\"results don't match\");\n}\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\ttest_native_to_generic(\"/\", \"/\");\n\t\ttest_native_to_generic(\"foo\", \"foo\");\n\t\ttest_native_to_generic(\"/foo\", \"/foo\");\n\t\ttest_native_to_generic(\"foo/bar\", \"foo/bar\");\n\t\ttest_native_to_generic(\"/foo/bar\", \"/foo/bar\");\n\t\ttest_native_to_generic(\".\", \".\");\n\t\ttest_native_to_generic(\"..\", \"..\");\n\t\ttest_native_to_generic(\"../foo\", \"../foo\");\n\t\ttest_native_to_generic(\"c:\", \"c:\");\n\t\ttest_native_to_generic(\"c:\\\\\", \"c:/\");\n\t\ttest_native_to_generic(\"c:..\", \"c:..\");\n\t\ttest_native_to_generic(\"c:foo\", \"c:foo\");\n\t\ttest_native_to_generic(\"c:\\\\foo\", \"c:/foo\");\n\t\ttest_native_to_generic(\"\\\\\\\\shr\", \"//shr\");\n\t\ttest_native_to_generic(\"\\\\\\\\shr\\\\\", \"//shr/\");\n\t\ttest_native_to_generic(\"\\\\\\\\shr\\\\foo\", \"//shr/foo\");\n\t\ttest_native_to_generic(\"prn:\", \"prn:\");\n\n\t\ttest_iteration(\"/\", \"/,\");\n\t\ttest_iteration(\"foo\", \"foo,\");\n\t\ttest_iteration(\"/foo\", \"/,foo,\");\n\t\ttest_iteration(\"foo/bar\", \"foo,bar,\");\n\t\ttest_iteration(\"/foo/bar\", \"/,foo,bar,\");\n\t\ttest_iteration(\"/foo/bar/baz\", \"/,foo,bar,baz,\");\n\t\ttest_iteration(\".\", \".,\");\n\t\ttest_iteration(\"..\", \"..,\");\n\t\ttest_iteration(\"../foo\", \"..,foo,\");\n\t\ttest_iteration(\"c:\", \"c:,\");\n\t\ttest_iteration(\"c:\\\\\", \"c:,/,\");\n\t\ttest_iteration(\"c:..\", \"c:,..,\");\n\t\ttest_iteration(\"c:foo\", \"c:,foo,\");\n\t\ttest_iteration(\"c:\\\\foo\", \"c:,/,foo,\");\n\t\ttest_iteration(\"c:\\\\foo\\\\bar\", \"c:,/,foo,bar,\");\n\t\ttest_iteration(\"\\\\\\\\shr\", \"//shr,\");\n\t\ttest_iteration(\"\\\\\\\\shr\\\\\", \"//shr,/,\");\n\t\ttest_iteration(\"\\\\\\\\shr\\\\foo\", \"//shr,/,foo,\");\n\t\ttest_iteration(\"\\\\\\\\shr\\\\foo\\\\bar\", \"//shr,/,foo,bar,\");\n\t\ttest_iteration(\"prn:\", \"prn:,\");\n\n\t\ttest_root_name(\"/\", \"\");\n\t\ttest_root_name(\"foo\", \"\");\n\t\ttest_root_name(\"/foo\", \"\");\n\t\ttest_root_name(\"foo/bar\", \"\");\n\t\ttest_root_name(\"/foo/bar\", \"\");\n\t\ttest_root_name(\".\", \"\");\n\t\ttest_root_name(\"..\", \"\");\n\t\ttest_root_name(\"../foo\", \"\");\n\t\ttest_root_name(\"c:\", \"c:\");\n\t\ttest_root_name(\"c:\\\\\", \"c:\");\n\t\ttest_root_name(\"c:..\", \"c:\");\n\t\ttest_root_name(\"c:foo\", \"c:\");\n\t\ttest_root_name(\"c:\\\\foo\", \"c:\");\n\t\ttest_root_name(\"\\\\\\\\shr\", \"//shr\");\n\t\ttest_root_name(\"\\\\\\\\shr\\\\\", \"//shr\");\n\t\ttest_root_name(\"\\\\\\\\shr\\\\foo\", \"//shr\");\n\t\ttest_root_name(\"prn:\", \"prn:\");\n\n\t\ttest_root_directory(\"/\", \"/\");\n\t\ttest_root_directory(\"foo\", \"\");\n\t\ttest_root_directory(\"/foo\", \"/\");\n\t\ttest_root_directory(\"foo/bar\", \"\");\n\t\ttest_root_directory(\"/foo/bar\", \"/\");\n\t\ttest_root_directory(\".\", \"\");\n\t\ttest_root_directory(\"..\", \"\");\n\t\ttest_root_directory(\"../foo\", \"\");\n\t\ttest_root_directory(\"c:\", \"\");\n\t\ttest_root_directory(\"c:\\\\\", \"/\");\n\t\ttest_root_directory(\"c:..\", \"\");\n\t\ttest_root_directory(\"c:foo\", \"\");\n\t\ttest_root_directory(\"c:\\\\foo\", \"/\");\n\t\ttest_root_directory(\"\\\\\\\\shr\", \"\");\n\t\ttest_root_directory(\"\\\\\\\\shr\\\\\", \"/\");\n\t\ttest_root_directory(\"\\\\\\\\shr\\\\foo\", \"/\");\n\t\ttest_root_directory(\"prn:\", \"\");\n\n\t\ttest_branch_path(\"/\", \"\");\n\t\ttest_branch_path(\"foo\", \"\");\n\t\ttest_branch_path(\"/foo\", \"/\");\n\t\ttest_branch_path(\"foo/bar\", \"foo\");\n\t\ttest_branch_path(\"/foo/bar\", \"/foo\");\n\t\ttest_branch_path(\".\", \"\");\n\t\ttest_branch_path(\"..\", \"\");\n\t\ttest_branch_path(\"../foo\", \"..\");\n\t\ttest_branch_path(\"c:\", \"\");\n\t\ttest_branch_path(\"c:\\\\\", \"c:\");\n\t\ttest_branch_path(\"c:..\", \"c:\");\n\t\ttest_branch_path(\"c:foo\", \"c:\");\n\t\ttest_branch_path(\"c:\\\\foo\", \"c:/\");\n\t\ttest_branch_path(\"\\\\\\\\shr\", \"\");\n\t\ttest_branch_path(\"\\\\\\\\shr\\\\\", \"//shr\");\n\t\ttest_branch_path(\"\\\\\\\\shr\\\\foo\", \"//shr/\");\n\t\ttest_branch_path(\"prn:\", \"\");\n\n\t\ttest_leaf(\"/\", \"/\");\n\t\ttest_leaf(\"foo\", \"foo\");\n\t\ttest_leaf(\"/foo\", \"foo\");\n\t\ttest_leaf(\"foo/bar\", \"bar\");\n\t\ttest_leaf(\"/foo/bar\", \"bar\");\n\t\ttest_leaf(\".\", \".\");\n\t\ttest_leaf(\"..\", \"..\");\n\t\ttest_leaf(\"../foo\", \"foo\");\n\t\ttest_leaf(\"c:\", \"c:\");\n\t\ttest_leaf(\"c:\\\\\", \"/\");\n\t\ttest_leaf(\"c:..\", \"..\");\n\t\ttest_leaf(\"c:foo\", \"foo\");\n\t\ttest_leaf(\"c:\\\\foo\", \"foo\");\n\t\ttest_leaf(\"\\\\\\\\shr\", \"//shr\");\n\t\ttest_leaf(\"\\\\\\\\shr\\\\\", \"/\");\n\t\ttest_leaf(\"\\\\\\\\shr\\\\foo\", \"foo\");\n\t\ttest_leaf(\"prn:\", \"prn:\");\n\n\t\treturn 0;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << \"exception: \" << e.what() << std::endl;\n\t\treturn 1;\n\t}\n}\n"
  },
  {
    "path": "tests/sdk/pipeline_data.cpp",
    "content": "#include <k3dsdk/pipeline_data.h>\n#include <k3dsdk/typed_array.h>\n\n#include <iostream>\n#include <sstream>\n#include <stdexcept>\n\n#define test_expression(expression) \\\n\tif(!(expression)) \\\n\t{ \\\n\t\tstd::ostringstream buffer; \\\n\t\tbuffer << #expression << \" failed at \" << __FILE__ << \": \" << __LINE__; \\\n\t\tthrow std::runtime_error(buffer.str()); \\\n\t} \\\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\t// Validate the initially-empty state ...\n\t\tk3d::pipeline_data<k3d::typed_array<k3d::int32_t> > source;\n\t\ttest_expression(!source.get());\n\t\ttest_expression(!source);\n\t\ttest_expression(source.use_count() == 0);\n\n\t\t// Validate the state after creating an array ...\n\t\tk3d::typed_array<k3d::int32_t>& source_array = source.create();\n\t\ttest_expression(source.get());\n\t\ttest_expression(source);\n\t\ttest_expression(source.use_count() == 1);\n\n\t\t// Put some data into the array ...\n\t\tsource_array.push_back(1);\n\t\tsource_array.push_back(2);\n\t\tsource_array.push_back(4);\n\n\t\t// Confirm that read-write access to the array doesn't cause reallocation ...\n\t\tconst k3d::typed_array<k3d::int32_t>* before = source.get();\n\t\tk3d::typed_array<k3d::int32_t>& mutable_source = source.writable();\n\t\tconst k3d::typed_array<k3d::int32_t>* after = source.get();\n\t\ttest_expression(before == after);\n\t\ttest_expression(source.use_count() == 1);\n\t\n\t\t// Validate the state after creating a shared instance ...\n\t\tk3d::pipeline_data<k3d::typed_array<k3d::int32_t> > modifier(source);\n\t\ttest_expression(modifier.get());\n\t\ttest_expression(modifier);\n\t\ttest_expression(source.use_count() == 2);\n\t\ttest_expression(modifier.use_count() == 2);\n\t\ttest_expression(source.get() == modifier.get());\n\n\t\t// Validate the state after creating a second shared instance ...\n\t\tk3d::pipeline_data<k3d::typed_array<k3d::int32_t> > sink(modifier);\n\t\ttest_expression(sink.get());\n\t\ttest_expression(sink);\n\t\ttest_expression(source.use_count() == 3);\n\t\ttest_expression(modifier.use_count() == 3);\n\t\ttest_expression(sink.use_count() == 3);\n\t\ttest_expression(source.get() == sink.get());\n\t\ttest_expression(modifier.get() == sink.get());\n\n\t\t// Validate that read-write access from a shared instance reallocates ...\n\t\tk3d::typed_array<k3d::int32_t>& mutable_modifier = modifier.writable();\n\t\ttest_expression(modifier.get());\n\t\ttest_expression(modifier);\n\t\ttest_expression(source.use_count() == 2);\n\t\ttest_expression(modifier.use_count() == 1);\n\t\ttest_expression(sink.use_count() == 2);\n\t\ttest_expression(source.get() != modifier.get());\n\t\ttest_expression(modifier.get() != sink.get());\n\t\ttest_expression(source.get() == sink.get());\n\t\ttest_expression(*source == *modifier);\n\n\t\t// Validate that assignment re-synchronizes the second and third shared instances ...\n\t\tsink = modifier;\n\t\ttest_expression(sink.get());\n\t\ttest_expression(sink);\n\t\ttest_expression(source.use_count() == 1);\n\t\ttest_expression(modifier.use_count() == 2);\n\t\ttest_expression(sink.use_count() == 2);\n\t\ttest_expression(source.get() != modifier.get());\n\t\ttest_expression(modifier.get() == sink.get());\n\t\ttest_expression(source.get() != sink.get());\n\t\ttest_expression(*modifier == *sink);\n\n\t\tstd::vector<k3d::pipeline_data<k3d::int32_t> > a;\n\t\ta.push_back(k3d::pipeline_data<k3d::int32_t>());\n\t\ta[0].create();\n\t\ta[0].writable() = 5;\n\t\ttest_expression(*a[0] == 5);\n\n\t\tconst std::vector<k3d::pipeline_data<k3d::int32_t> >& b = a;\n\t\ttest_expression(*b[0] == 5);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << \"uncaught exception: \" << e.what() << std::endl;\n\t\treturn 1;\n\t}\n\tcatch(...)\n\t{\n\t\tstd::cerr << \"unknown exception\" << std::endl;\n\t}\n\t\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/program_options.cpp",
    "content": "#include <boost/program_options.hpp>\n\n#include <iostream>\n#include <sstream>\n#include <stdexcept>\n\n#define test_expression(expression) \\\n\tif(!(expression)) \\\n\t{ \\\n\t\tstd::ostringstream buffer; \\\n\t\tbuffer << #expression << \" failed at \" << __FILE__ << \": \" << __LINE__; \\\n\t\tthrow std::runtime_error(buffer.str()); \\\n\t} \\\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\tboost::program_options::options_description description(\"test options\");\n\t\tdescription.add_options()\n\t\t\t(\"script,e\", boost::program_options::value<std::string>(), \"\")\n\t\t\t(\"script-file,f\", boost::program_options::value<std::string>(), \"\")\n\t\t\t;\n\n\t\tstd::vector<std::string> raw_arguments;\n\t\traw_arguments.push_back(\"--script\");\n\t\traw_arguments.push_back(\"# python\\nimport k3d\\n\");\n\n\t\ttypedef std::vector<boost::program_options::basic_option<char> > arguments_t;\n\t\tconst arguments_t arguments = boost::program_options::command_line_parser(raw_arguments)\n\t\t\t.style(\n\t\t\t\tboost::program_options::command_line_style::allow_long\n\t\t\t\t| boost::program_options::command_line_style::allow_short\n\t\t\t\t| boost::program_options::command_line_style::allow_dash_for_short\n\t\t\t\t| boost::program_options::command_line_style::long_allow_adjacent\n\t\t\t\t| boost::program_options::command_line_style::long_allow_next\n\t\t\t\t| boost::program_options::command_line_style::short_allow_adjacent\n\t\t\t\t| boost::program_options::command_line_style::short_allow_next\n\t\t\t\t)\n\t\t\t.options(description)\n\t\t\t.allow_unregistered()\n\t\t\t.run()\n\t\t\t.options;\n\n\t\ttest_expression(arguments.size() == 1);\n\t\ttest_expression(arguments[0].string_key == \"script\");\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << \"uncaught exception: \" << e.what() << std::endl;\n\t\treturn 1;\n\t}\n\tcatch(...)\n\t{\n\t\tstd::cerr << \"unknown exception\" << std::endl;\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/relative_path.cpp",
    "content": "#include <k3dsdk/path.h>\n\n#include <iostream>\n#include <sstream>\n#include <stdexcept>\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\tif(argc != 4)\n\t\t\tthrow std::runtime_error(\"Usage: relative_path [ABSOLUTE PATH] [REFERENCE PATH] [EXPECTED RESULT]\");\n\n\t\tconst k3d::filesystem::path absolute_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(argv[1]));\n\t\tconst k3d::filesystem::path reference_path = k3d::filesystem::native_path(k3d::ustring::from_utf8(argv[2]));\n\t\tconst k3d::filesystem::path expected_result = k3d::filesystem::generic_path(k3d::ustring::from_utf8(argv[3]));\n\n\t\tconst k3d::filesystem::path result =  k3d::filesystem::make_relative_path(absolute_path, reference_path);\n\t\tif(result != expected_result)\n\t\t\tthrow std::runtime_error(\"expected [\" + expected_result.native_console_string() + \"] got [\" + result.native_console_string() + \"]\");\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << e.what() << std::endl;\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/selection_equality.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/geometry.h>\n#include <k3dsdk/log_control.h>\n#include <k3dsdk/selection.h>\n\n#include <iostream>\n#include <stdexcept>\n#include <sstream>\n\n#define test_expression(expression) \\\n{ \\\n  if(!(expression)) \\\n    { \\\n    std::ostringstream buffer; \\\n    buffer << \"Expression failed at line \" << __LINE__ << \": \" << #expression; \\\n    throw std::runtime_error(buffer.str()); \\\n    } \\\n}\n\nint main(int argc, char* argv[])\n{\n\tk3d::log_color_level(true);\n\tk3d::log_show_level(true);\n\tk3d::log_minimum_level(k3d::K3D_LOG_LEVEL_DEBUG);\n\n\ttry\n\t{\n\t\tk3d::selection::set a;\n\t\tk3d::selection::set b;\n\n\t\ttest_expression(a == b);\n\n\t\tk3d::geometry::point_selection::create(a);\n\n\t\ttest_expression(a != b);\n\n\t\tk3d::geometry::primitive_selection::create(b);\n\n\t\ttest_expression(a != b);\t\t\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << e.what() << std::endl;\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/selection_serialization.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n/** \\file\n\t\\author Tim Shead (tshead@k-3d.com)\n*/\n\n#include <k3dsdk/dependencies.h>\n#include <k3dsdk/persistent_lookup.h>\n#include <k3dsdk/selection.h>\n#include <k3dsdk/serialization_xml.h>\n#include <k3dsdk/typed_array.h>\n#include <k3dsdk/uint_t_array.h>\n#include <k3dsdk/xml.h>\n\n#include <iostream>\n#include <stdexcept>\n#include <sstream>\n\n#define test_expression(expression) \\\n{ \\\n  if(!(expression)) \\\n    { \\\n    std::ostringstream buffer; \\\n    buffer << \"Expression failed at line \" << __LINE__ << \": \" << #expression; \\\n    throw std::runtime_error(buffer.str()); \\\n    } \\\n}\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\tk3d::selection::set a;\n\t\tk3d::selection::storage& points = a.create(\"points\");\n\t\tk3d::uint_t_array& begin = points.structure.create<k3d::uint_t_array>(\"begin\");\n\t\tk3d::uint_t_array& end = points.structure.create<k3d::uint_t_array>(\"end\");\n\t\tk3d::typed_array<k3d::double_t>& value = points.structure.create<k3d::typed_array<k3d::double_t> >(\"value\");\n\n\t\tbegin.push_back(0);\n\t\tend.push_back(5);\n\t\tvalue.push_back(1);\n\n\t\tk3d::selection::storage& components = a.create(\"components\");\n\n\t\tconst k3d::filesystem::path root_path;\n\t\tk3d::dependencies dependencies;\n\t\tk3d::persistent_lookup lookup;\n\t\tk3d::ipersistent::save_context save_context(root_path, dependencies, lookup);\n\n\t\tk3d::xml::element xml(\"selection\");\n\t\tk3d::xml::save(a, xml, save_context);\n\n\t\tk3d::bool_t equal;\n\t\tk3d::uint64_t ulps;\n\n\t\tk3d::selection::set b;\n\t\ttest_expression(boost::accumulators::max(k3d::difference::test(b, a).exact) != true);\n\n\t\tk3d::ipersistent::load_context load_context(root_path, lookup);\n\t\tk3d::xml::load(b, xml, load_context);\n\n\t\ttest_expression(boost::accumulators::min(k3d::difference::test(b, a).exact) != false);\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << e.what() << std::endl;\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/shared_dynamic_cast.cpp",
    "content": "#include <shared_dynamic_cast_config.h>\n#include <shared_dynamic_cast_library.h>\n\n#include <iostream>\n#include <stdexcept>\n\n#include <dlfcn.h>\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\tvoid* const module = dlopen(SHARED_DYNAMIC_CAST_LIBRARY, RTLD_GLOBAL | RTLD_LAZY);\n\t\tif(!module)\n\t\t\tthrow std::runtime_error(dlerror());\n\n\t\tmake_stuff_entry_point make_stuff = make_stuff_entry_point(dlsym(module, \"make_stuff\"));\n\t\tif(!make_stuff)\n\t\t\tthrow std::runtime_error(\"Missing make_stuff() function.\");\n\n\t\tk3d::iunknown* const unknown = make_stuff();\n\t\tif(!unknown)\n\t\t\tthrow std::runtime_error(\"Missing object instance.\");\n\n\t\tk3d::istuff* const stuff = dynamic_cast<k3d::istuff*>(unknown);\n\t\tif(!stuff)\n\t\t\tthrow std::runtime_error(\"Dynamic casting failed.\");\n\n\t\tstd::cerr << \"Success!\" << std::endl;\n\t\treturn 0;\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << \"Exception: \" << e.what() << std::endl;\n\t\treturn 1;\n\t}\n}\n\n"
  },
  {
    "path": "tests/sdk/shared_dynamic_cast_config.h.in",
    "content": "#ifndef K3DSDK_TESTS_SHARED_DYNAMIC_CAST_CONFIG_H\n#define K3DSDK_TESTS_SHARED_DYNAMIC_CAST_CONFIG_H\n\n#define SHARED_DYNAMIC_CAST_LIBRARY \"@SHARED_DYNAMIC_CAST_LIBRARY@\"\n\n#endif // !K3DSDK_TESTS_SHARED_DYNAMIC_CAST_CONFIG_H\n"
  },
  {
    "path": "tests/sdk/shared_dynamic_cast_library.cpp",
    "content": "#include <shared_dynamic_cast_library.h>\n\nextern \"C\"\n{\n\nclass stuff :\n\tpublic k3d::istuff\n{\npublic:\n};\n\nk3d::iunknown* make_stuff()\n{\n\treturn new stuff();\n}\n\n} // extern \"C\"\n"
  },
  {
    "path": "tests/sdk/shared_dynamic_cast_library.h",
    "content": "#ifndef TESTS_SDK_SHARED_DYNAMIC_CAST_LIBRARY_H\n#define TESTS_SDK_SHARED_DYNAMIC_CAST_LIBRARY_H\n\nnamespace k3d\n{\n\nclass iunknown\n{\npublic:\n\tvirtual ~iunknown() {}\n};\n\nclass istuff :\n\tpublic virtual iunknown\n{\npublic:\n\nprotected:\n\tistuff() {}\n\tistuff(const istuff&) {}\n\tistuff& operator=(const istuff&) { return *this; }\n\tvirtual ~istuff() {}\n};\n\n} // namespace k3d\n\ntypedef k3d::iunknown* (*make_stuff_entry_point)();\n\n#endif // !TESTS_SDK_SHARED_DYNAMIC_CAST_LIBRARY_H\n"
  },
  {
    "path": "tests/sdk/uuid.cpp",
    "content": "#include <k3dsdk/uuid.h>\n\n#include <boost/lexical_cast.hpp>\n\n#include <iostream>\n#include <sstream>\n#include <stdexcept>\n\n#define test_expression(expression) \\\n\tif(!(expression)) \\\n\t{ \\\n\t\tstd::ostringstream buffer; \\\n\t\tbuffer << #expression << \" failed at \" << __FILE__ << \": \" << __LINE__; \\\n\t\tthrow std::runtime_error(buffer.str()); \\\n\t} \\\n\nstatic void test_serialization(const k3d::uuid& Value)\n{\n\tstd::stringstream buffer;\n\tbuffer << Value;\n\n\tk3d::uuid value;\n\tbuffer >> value;\n\n\tif(value != Value)\n\t\tthrow std::runtime_error(\"serialized values differ\");\n}\n\nint main(int argc, char* argv[])\n{\n\ttry\n\t{\n\t\ttest_expression(k3d::uuid::null().is_nil());\n\t\ttest_expression(k3d::uuid::null() == k3d::uuid(0, 0, 0, 0));\n\t\ttest_expression(k3d::uuid(1, 2, 3, 3) != k3d::uuid(1, 2, 3, 4));\n\t\ttest_expression(k3d::uuid(1, 2, 3, 3) < k3d::uuid(1, 2, 3, 4));\n\n\t\ttest_serialization(k3d::uuid::null());\n\t\ttest_serialization(k3d::uuid(1, 2, 3, 4));\n\t\ttest_serialization(k3d::uuid::random());\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << \"uncaught exception: \" << e.what() << std::endl;\n\t\treturn 1;\n\t}\n\tcatch(...)\n\t{\n\t\tstd::cerr << \"unknown exception\" << std::endl;\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/sdk/xml_input.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/xml.h>\nusing namespace k3d::xml;\n\n#include <iostream>\n\nint main()\n{\n\ttry\n\t\t{\n\t\t\telement e(\"empty\");\n\t\t\tstd::cin >> e;\n\t\t\tstd::cout << e;\n\t\t}\n\tcatch(std::exception& e)\n\t\t{\n\t\t\tstd::cerr << \"exception: \" << e.what() << std::endl;\n\t\t}\n\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "tests/sdk/xml_output.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2004, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/xml.h>\nusing namespace k3d::xml;\n\n#include <iostream>\n\nint main()\n{\n\telement a(\"a\");\n\ta.append(attribute(\"b\", \"c\"));\n\ta.append(attribute(\"d\", 1));\n\t\n\telement& e = a.append(element(\"e\", \"g\"));\n\te.append(attribute(\"f\", 2.5));\n\n\t/*element& h =*/ e.append(element(\"h\", \"i\"));\n\n\t/*element& j =*/ e.append(element(\"j\"));\n\n\tstd::cout << a;\n\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "tests/sdk/xml_sanity_checks.cpp",
    "content": "#include <k3dsdk/xml.h>\nusing namespace k3d::xml;\n\n#include <cassert>\n\nint main()\n{\n\t// Test element initialization ...\n\telement e1(\"e1\", \"value2\");\n\tassert(e1.name == \"e1\");\n\tassert(e1.text == \"value2\");\n\tassert(e1.children.empty());\n\tassert(e1.attributes.empty());\n\n\t// Test attribute initialization ...\n\tattribute a1(\"a1\", \"value1\");\n\tassert(a1.name == \"a1\");\n\tassert(a1.value == \"value1\");\n\n\t// Test appending elements ...\n\tassert(!find_element(e1, \"e2\"));\n\tassert(e1.children.empty());\n\te1.append(element(\"e2\", \"value3\"));\n\tassert(e1.children.size() == 1);\n\tassert(find_element(e1, \"e2\"));\n\tassert(find_element(e1, \"e2\")->name == \"e2\");\n\tassert(find_element(e1, \"e2\")->text == \"value3\");\n\n\t// Test appending attributes ...\n\tassert(!find_attribute(e1, \"a2\"));\n\tassert(e1.attributes.empty());\n\te1.append(attribute(\"a2\", \"value4\"));\n\tassert(e1.attributes.size() == 1);\n\tassert(find_attribute(e1, \"a2\"));\n\tassert(find_attribute(e1, \"a2\")->name == \"a2\");\n\tassert(find_attribute(e1, \"a2\")->value == \"value4\");\n\n\t// Test safe element access ...\n\te1.safe_element(\"e3\");\n\tassert(e1.children.size() == 2);\n\tassert(find_element(e1, \"e3\"));\n\tassert(find_element(e1, \"e3\")->name == \"e3\");\n\tassert(find_element(e1, \"e3\")->text.empty());\n\tassert(e1.safe_element(\"e3\").name == \"e3\");\n\tassert(e1.children.size() == 2);\n\n\tassert(e1.safe_element(element(\"e4\"), element(\"e4\", \"value7\")).text == \"value7\");\n\tassert(e1.children.size() == 3);\n\tassert(e1.safe_element(\"e4\").text == \"value7\");\n\tassert(e1.children.size() == 3);\n\n\t// Test setting attributes ...\n\tset_attribute(e1, attribute(\"a3\", \"value5\"));\n\tassert(e1.attributes.size() == 2);\n\tassert(find_attribute(e1, \"a3\"));\n\tassert(find_attribute(e1, \"a3\")->name == \"a3\");\n\tassert(find_attribute(e1, \"a3\")->value == \"value5\");\n\n\tset_attribute(e1, attribute(\"a3\", \"value6\"));\n\tassert(e1.attributes.size() == 2);\n\tassert(find_attribute(e1, \"a3\"));\n\tassert(find_attribute(e1, \"a3\")->name == \"a3\");\n\tassert(find_attribute(e1, \"a3\")->value == \"value6\");\n\t\n\treturn 0;\n}\n"
  },
  {
    "path": "tests/sdk/xml_xpath.cpp",
    "content": "// K-3D\n// Copyright (c) 1995-2009, Timothy M. Shead\n//\n// Contact: tshead@k-3d.com\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 2 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n#include <k3dsdk/log_control.h>\n#include <k3dsdk/xml.h>\n#include <k3dsdk/xpath.h>\n\nusing namespace k3d::xml;\n\n#include <iostream>\n#include <stdexcept>\n#include <sstream>\n\n#define test_expression(expression) \\\n{ \\\n  if(!(expression)) \\\n    { \\\n    std::ostringstream buffer; \\\n    buffer << \"Expression failed at line \" << __LINE__ << \": \" << #expression; \\\n    throw std::runtime_error(buffer.str()); \\\n    } \\\n}\n\nint main(int argc, char* argv[])\n{\n\tk3d::log_color_level(true);\n\tk3d::log_show_level(true);\n\tk3d::log_minimum_level(k3d::K3D_LOG_LEVEL_DEBUG);\n\n\ttry\n\t{\n\t\telement document(\"k3d\",\n\t\t\telement(\"nodes\",\n\t\t\t\telement(\"node\",\n\t\t\t\t\tattribute(\"class\", \"foo\")\n\t\t\t\t\t),\n\t\t\t\telement(\"node\",\n\t\t\t\t\tattribute(\"factory\", \"bar\"),\n\t\t\t\t\telement(\"properties\",\n\t\t\t\t\t\telement(\"property\",\n\t\t\t\t\t\t\tattribute(\"user_property\", \"\"),\n\t\t\t\t\t\t\tattribute(\"type\", \"double\")\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\telement(\"dependencies\"\n\t\t\t\t)\n\t\t\t);\n\n\t\txpath::result_set results;\n\n\t\tresults = xpath::match(document, \"\");\n\t\ttest_expression(results.size() == 0);\n\n\t\tresults = xpath::match(document, \"/\");\n\t\ttest_expression(results.size() == 0);\n\n\t\tresults = xpath::match(document, \"/foo\");\n\t\ttest_expression(results.size() == 0);\n\n\t\tresults = xpath::match(document, \"/k3d\");\n\t\ttest_expression(results.size() == 1);\n\t\ttest_expression(results[0]->name == \"k3d\");\n\n\t\tresults = xpath::match(document, \"/k3d/*\");\n\t\ttest_expression(results.size() == 2);\n\t\ttest_expression(results[0]->name == \"nodes\");\n\t\ttest_expression(results[1]->name == \"dependencies\");\n\n\t\tresults = xpath::match(document, \"/k3d/nodes\");\n\t\ttest_expression(results.size() == 1);\n\t\ttest_expression(results[0]->name == \"nodes\");\n\n\t\tresults = xpath::match(document, \"/k3d/nodes/node\");\n\t\ttest_expression(results.size() == 2);\n\t\ttest_expression(results[0]->name == \"node\");\n\t\ttest_expression(results[1]->name == \"node\");\n\n\t\tresults = xpath::match(document, \"/k3d/nodes/node[@class]\");\n\t\ttest_expression(results.size() == 1);\n\t\ttest_expression(find_attribute(*results[0], \"class\"));\n\t\ttest_expression(!find_attribute(*results[0], \"factory\"));\n\n\t\tresults = xpath::match(document, \"/k3d/nodes/node/properties/property[@user_property][@type='double']\");\n\t\ttest_expression(results.size() == 1);\n\n\t\tresults = xpath::match(document, \"nodes\");\n\t\ttest_expression(results.size() == 1);\n\t\ttest_expression(results[0]->name == \"nodes\");\n\n\t\tresults = xpath::match(document, \"nodes/node\");\n\t\ttest_expression(results.size() == 2);\n\t\ttest_expression(results[0]->name == \"node\");\n\t\ttest_expression(results[1]->name == \"node\");\n\t}\n\tcatch(std::exception& e)\n\t{\n\t\tstd::cerr << e.what() << std::endl;\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tests/shaders/CMakeLists.txt",
    "content": "# Get the set(s) of available shaders ...\nFILE(GLOB_RECURSE DISPLACEMENT_SHADER_LIST ${share_SOURCE_DIR}/shaders/displacement/*.sl)\nLIST(SORT DISPLACEMENT_SHADER_LIST)\n\nFILE(GLOB_RECURSE LIGHT_SHADER_LIST ${share_SOURCE_DIR}/shaders/light/*.sl)\nLIST(SORT LIGHT_SHADER_LIST)\n\nFILE(GLOB_RECURSE SURFACE_SHADER_LIST ${share_SOURCE_DIR}/shaders/surface/*.sl)\nLIST(SORT SURFACE_SHADER_LIST)\n\nFILE(GLOB_RECURSE VOLUME_SHADER_LIST ${share_SOURCE_DIR}/shaders/volume/*.sl)\nLIST(SORT VOLUME_SHADER_LIST)\n\nFILE(GLOB_RECURSE SHADER_LIST ${share_SOURCE_DIR}/shaders/*.sl)\nLIST(SORT SHADER_LIST)\n\n# Figure-out which render engines we have available ...\nFIND_PROGRAM(AQSL_COMMAND aqsl)\nFIND_PROGRAM(AQSIS_COMMAND aqsis)\nFIND_PROGRAM(RNDR_COMMAND rndr)\nFIND_PROGRAM(SDRC_COMMAND sdrc)\n\n# Test shader compilation with Aqsis ...\nIF(AQSL_COMMAND)\n\tFOREACH(SHADER ${SHADER_LIST})\n\t\tGET_FILENAME_COMPONENT(SHADER_NAME ${SHADER} NAME_WE)\n\t\tGET_FILENAME_COMPONENT(SHADER_PATH ${SHADER} PATH)\n\t\tK3D_TEST(shader.compile.${SHADER_NAME}.aqsis\n\t\t\tCOMMAND ${AQSL_COMMAND} -I \"${SHADER_PATH}\" -I \"${share_SOURCE_DIR}/shaders\" -o ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_NAME}.slx ${SHADER}\n\t\t\tLABELS shader aqsis)\n\tENDFOREACH()\nENDIF()\n\n# Test shader compilation with Pixie ...\nIF(SDRC_COMMAND)\n\tFOREACH(SHADER ${SHADER_LIST})\n\t\tGET_FILENAME_COMPONENT(SHADER_NAME ${SHADER} NAME_WE)\n\t\tGET_FILENAME_COMPONENT(SHADER_PATH ${SHADER} PATH)\n\t\tK3D_TEST(shader.compile.${SHADER_NAME}.pixie\n\t\t\tCOMMAND ${SDRC_COMMAND} \"-I${SHADER_PATH}\" \"-I${share_SOURCE_DIR}/shaders\" -o ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_NAME}.sdr ${SHADER}\n\t\t\tLABELS shader pixie)\n\tENDFOREACH()\nENDIF()\n\n# Generate sample shader images with Aqsis ...\nIF(AQSIS_COMMAND)\n\tFOREACH(SHADER ${DISPLACEMENT_SHADER_LIST})\n\tGET_FILENAME_COMPONENT(SHADER_NAME ${SHADER} NAME_WE)\n\tK3D_TEST(shader.displacement.render.${SHADER_NAME}.aqsis\n\t\tK3D_PYTHON_COMMAND_SCRIPT \"#python\\nimport testing\\ntesting.displacement_shader_test(\\\"Aqsis\\\", \\\"${SHADER_NAME}\\\")\"\n\t\tLABELS shader displacement aqsis)\n\tENDFOREACH()\n\n\tFOREACH(SHADER ${LIGHT_SHADER_LIST})\n\tGET_FILENAME_COMPONENT(SHADER_NAME ${SHADER} NAME_WE)\n\tK3D_TEST(shader.light.render.${SHADER_NAME}.aqsis\n\t\tK3D_PYTHON_COMMAND_SCRIPT \"#python\\nimport testing\\ntesting.light_shader_test(\\\"Aqsis\\\", \\\"${SHADER_NAME}\\\")\"\n\t\tLABELS shader light aqsis)\n\tENDFOREACH()\n\n\tFOREACH(SHADER ${SURFACE_SHADER_LIST})\n\tGET_FILENAME_COMPONENT(SHADER_NAME ${SHADER} NAME_WE)\n\tK3D_TEST(shader.surface.render.${SHADER_NAME}.aqsis\n\t\tK3D_PYTHON_COMMAND_SCRIPT \"#python\\nimport testing\\ntesting.surface_shader_test(\\\"Aqsis\\\", \\\"${SHADER_NAME}\\\")\"\n\t\tLABELS shader surface aqsis)\n\tENDFOREACH()\n\n\tFOREACH(SHADER ${VOLUME_SHADER_LIST})\n\tGET_FILENAME_COMPONENT(SHADER_NAME ${SHADER} NAME_WE)\n\tK3D_TEST(shader.volume.render.${SHADER_NAME}.aqsis\n\t\tK3D_PYTHON_COMMAND_SCRIPT \"#python\\nimport testing\\ntesting.volume_shader_test(\\\"Aqsis\\\", \\\"${SHADER_NAME}\\\")\"\n\t\tLABELS shader volume aqsis)\n\tENDFOREACH()\nENDIF()\n\n# Generate sample shader images with Pixie ...\nIF(RNDR_COMMAND)\n\tFOREACH(SHADER ${DISPLACEMENT_SHADER_LIST})\n\tGET_FILENAME_COMPONENT(SHADER_NAME ${SHADER} NAME_WE)\n\tK3D_TEST(shader.displacement.render.${SHADER_NAME}.pixie\n\t\tK3D_PYTHON_COMMAND_SCRIPT \"#python\\nimport testing\\ntesting.displacement_shader_test(\\\"Pixie\\\", \\\"${SHADER_NAME}\\\")\"\n\t\tLABELS shader displacement pixie)\n\tENDFOREACH()\n\n\tFOREACH(SHADER ${LIGHT_SHADER_LIST})\n\tGET_FILENAME_COMPONENT(SHADER_NAME ${SHADER} NAME_WE)\n\tK3D_TEST(shader.light.render.${SHADER_NAME}.pixie\n\t\tK3D_PYTHON_COMMAND_SCRIPT \"#python\\nimport testing\\ntesting.light_shader_test(\\\"Pixie\\\", \\\"${SHADER_NAME}\\\")\"\n\t\tLABELS shader light pixie)\n\tENDFOREACH()\n\n\tFOREACH(SHADER ${SURFACE_SHADER_LIST})\n\tGET_FILENAME_COMPONENT(SHADER_NAME ${SHADER} NAME_WE)\n\tK3D_TEST(shader.surface.render.${SHADER_NAME}.pixie\n\t\tK3D_PYTHON_COMMAND_SCRIPT \"#python\\nimport testing\\ntesting.surface_shader_test(\\\"Pixie\\\", \\\"${SHADER_NAME}\\\")\"\n\t\tLABELS shader surface pixie)\n\tENDFOREACH()\n\n\tFOREACH(SHADER ${VOLUME_SHADER_LIST})\n\tGET_FILENAME_COMPONENT(SHADER_NAME ${SHADER} NAME_WE)\n\tK3D_TEST(shader.volume.render.${SHADER_NAME}.pixie\n\t\tK3D_PYTHON_COMMAND_SCRIPT \"#python\\nimport testing\\ntesting.volume_shader_test(\\\"Pixie\\\", \\\"${SHADER_NAME}\\\")\"\n\t\tLABELS shader volume pixie)\n\tENDFOREACH()\nENDIF()\n\n"
  },
  {
    "path": "tests/shaders/displacement_shader_test.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml package=\"k3d\" version=\"0.8.0.1\" host=\"Linux-2.6.31-14-generic;i686\">\n\t<document>\n\t\t<nodes>\n\t\t\t<node name=\"Axes\" factory=\"00000001 00000000 00000000 00000001\" id=\"2\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"axes\">true</property>\n\t\t\t\t\t<property name=\"xyplane\">true</property>\n\t\t\t\t\t<property name=\"yzplane\">false</property>\n\t\t\t\t\t<property name=\"xzplane\">false</property>\n\t\t\t\t\t<property name=\"gridsize\">2</property>\n\t\t\t\t\t<property name=\"gridcount\">5</property>\n\t\t\t\t\t<property name=\"xcolor\">1 0 0</property>\n\t\t\t\t\t<property name=\"ycolor\">0 0.69999999999999996 0</property>\n\t\t\t\t\t<property name=\"zcolor\">0 0 0.69999999999999996</property>\n\t\t\t\t\t<property name=\"gridcolor\">0.40000000000000002 0.40000000000000002 0.40000000000000002</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/Vera.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"font_size\">12</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Engine\" factory=\"0059ba47 7bf740f3 93fb523d 5899f22c\" id=\"3\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"point_size\">4</property>\n\t\t\t\t\t<property name=\"background_color\">0.80000000000000004 0.80000000000000004 0.80000000000000004</property>\n\t\t\t\t\t<property name=\"fog\">false</property>\n\t\t\t\t\t<property name=\"fog_near\">0</property>\n\t\t\t\t\t<property name=\"fog_far\">100</property>\n\t\t\t\t\t<property name=\"headlight\">true</property>\n\t\t\t\t\t<property name=\"show_lights\">false</property>\n\t\t\t\t\t<property name=\"draw_two_sided\">true</property>\n\t\t\t\t\t<property name=\"draw_safe_zone\">false</property>\n\t\t\t\t\t<property name=\"draw_aimpoint\">true</property>\n\t\t\t\t\t<property name=\"draw_crop_window\">true</property>\n\t\t\t\t\t<property name=\"draw_frustum\">true</property>\n\t\t\t\t\t<property name=\"node_selection\">4</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TimeSource\" factory=\"1978f1f7 4a864c99 8caf7cfc d2591baf\" id=\"5\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"start_time\">0</property>\n\t\t\t\t\t<property name=\"end_time\">4</property>\n\t\t\t\t\t<property name=\"frame_rate\">30</property>\n\t\t\t\t\t<property name=\"time\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera\" factory=\"45ce1872 af184b6d b391e136 0dcfe8b5\" id=\"6\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"navigation_target\">6</property>\n\t\t\t\t\t<property name=\"world_target\">-0.27268858314002625 -2.01660029823329 5.1974089410552162</property>\n\t\t\t\t\t<property name=\"aspect_ratio\"/>\n\t\t\t\t\t<property name=\"show_projection\">false</property>\n\t\t\t\t\t<property name=\"orthographic\">false</property>\n\t\t\t\t\t<property name=\"left\">-0.6666666666666666</property>\n\t\t\t\t\t<property name=\"right\">0.6666666666666666</property>\n\t\t\t\t\t<property name=\"top\">0.5</property>\n\t\t\t\t\t<property name=\"bottom\">-0.5</property>\n\t\t\t\t\t<property name=\"near\">1</property>\n\t\t\t\t\t<property name=\"far\">1000</property>\n\t\t\t\t\t<property name=\"crop_window_left\">0</property>\n\t\t\t\t\t<property name=\"crop_window_right\">1</property>\n\t\t\t\t\t<property name=\"crop_window_top\">0</property>\n\t\t\t\t\t<property name=\"crop_window_bottom\">1</property>\n\t\t\t\t\t<property name=\"show_reference_plane\">false</property>\n\t\t\t\t\t<property name=\"reference_plane\">0</property>\n\t\t\t\t\t<property name=\"reference_plane_color\">0 0 0.69999999999999996</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"7\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">0.9254867468171396 0.11926750754890852 0.35951292481480979 -8.1136358023519968 0.3787799908467025 -0.29141058194678859 -0.87841083284736776 17.141467469950836 9.3107758915994543e-15 0.94913388643146923 -0.3148727768917074 12.064758218264963 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Default Painter\" factory=\"243cba5a 13f342fa 8f1a19cd faf34169\" id=\"8\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"particles\" label=\"Particles\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">9</property>\n\t\t\t\t\t<property name=\"polyhedra\" label=\"Polyhedra\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">10</property>\n\t\t\t\t\t<property name=\"subdivision_surfaces\" label=\"Subdivision Surfaces\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">11</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">12</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">13</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">14</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">15</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">16</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">17</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">18</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">19</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">20</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">21</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">22</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">23</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">24</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">25</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Particle Painter\" factory=\"06fab90b 2f034d69 b4a1cb9f b9864144\" id=\"9\"/>\n\t\t\t<node name=\"RenderMan Polyhedron Painter\" factory=\"0771ea79 6c8c4c6d 8bab8c83 42fc73e9\" id=\"10\"/>\n\t\t\t<node name=\"RenderMan Subdivision Surface Painter\" factory=\"4d6fae39 723e4ed3 bc5735c5 3b75edc0\" id=\"11\"/>\n\t\t\t<node name=\"RenderMan Linear Curve Painter\" factory=\"f8b19206 a0ae4bd1 b3548a15 1209469e\" id=\"12\"/>\n\t\t\t<node name=\"RenderMan Cubic Curve Painter\" factory=\"8c5be7c4 0e8d43c5 a1daace4 a79275d7\" id=\"13\"/>\n\t\t\t<node name=\"RenderMan Bilinear Patch Painter\" factory=\"3f51b275 5a664903 96ed9168 503e30f0\" id=\"14\"/>\n\t\t\t<node name=\"RenderMan Bicubic Patch Painter\" factory=\"64dfefde eedc4047 b59fc8f6 972a9b86\" id=\"15\"/>\n\t\t\t<node name=\"RenderMan NURBS Patch Painter\" factory=\"120d87f0 fe05419f ae2d14ce ea9c32b4\" id=\"16\"/>\n\t\t\t<node name=\"RenderMan Blobby Painter\" factory=\"0221462c c3d44a12 97b39425 29774d3f\" id=\"17\"/>\n\t\t\t<node name=\"RenderMan Cone Painter\" factory=\"6612c455 774ed5d4 5ff0c495 6d920b8e\" id=\"18\"/>\n\t\t\t<node name=\"RenderMan Cylinder Painter\" factory=\"85a1d5ac 224449cf 202911a1 a2434ee8\" id=\"19\"/>\n\t\t\t<node name=\"RenderMan Disk Painter\" factory=\"6c92b34f 57480914 1708dca6 cc8651cc\" id=\"20\"/>\n\t\t\t<node name=\"RenderMan Hyperboloid Painter\" factory=\"8f5ac6bd f84bfac3 8585f08b 953e3df1\" id=\"21\"/>\n\t\t\t<node name=\"RenderMan Paraboloid Painter\" factory=\"49dafd22 d34c22e6 cb8e30b3 0f74f5ef\" id=\"22\"/>\n\t\t\t<node name=\"RenderMan Sphere Painter\" factory=\"a07012c4 ce4b11f4 92d5f48d 8f3751c0\" id=\"23\"/>\n\t\t\t<node name=\"RenderMan Teapot Painter\" factory=\"cf54aa9b 9c4e886c a8cf2fa2 470d44ed\" id=\"24\"/>\n\t\t\t<node name=\"RenderMan Torus Painter\" factory=\"d3865bdb 69469c71 2cc55a8b 420de184\" id=\"25\"/>\n\t\t\t<node name=\"Surface Shader\" factory=\"b553a3bd d1044c6e b3f21e07 87132c31\" id=\"26\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/surface/k3d_matte.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"Ka\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">1</property>\n\t\t\t\t\t<property name=\"Kd\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManMaterial\" factory=\"00000001 00000000 00000000 00000024\" id=\"27\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"surface_shader\">26</property>\n\t\t\t\t\t<property name=\"displacement_shader\">28</property>\n\t\t\t\t\t<property name=\"atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"interior_shader\">0</property>\n\t\t\t\t\t<property name=\"exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"matte\">false</property>\n\t\t\t\t\t<property name=\"displacement_bounds\">1</property>\n\t\t\t\t\t<property name=\"color\">1 1 1</property>\n\t\t\t\t\t<property name=\"opacity\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Shader\" factory=\"830e867b 7bc94c6c 8d5087ee 8aa35db2\" id=\"29\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/light/k3d_pointlight.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"intensity\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">3000</property>\n\t\t\t\t\t<property name=\"lightcolor\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t\t<property name=\"from\" label=\"\" description=\"\" type=\"k3d::point3\" user_property=\"generic\">0 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light\" factory=\"00000001 00000000 00000000 0000001d\" id=\"30\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"shader\">29</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"31\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -20 0 1 0 20 0 0 1 30 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Material\" factory=\"00000001 00000002 00000003 00000004\" id=\"32\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"renderman_material\" label=\"RenderMan Material\" description=\"\" type=\"k3d::imaterial*\" user_property=\"generic\">27</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Aqsis\" factory=\"8d430069 63404829 053361ad fc6abda6\" id=\"33\"/>\n\t\t\t<node name=\"Pixie\" factory=\"7a1d773b a9472dae a80223ab 59d62f9a\" id=\"34\"/>\n\t\t\t<node name=\"RenderMan Engine\" factory=\"0dc5e733 fa684e05 86a3865f 42f7a99d\" id=\"35\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"visible_nodes\"> 36 37</property>\n\t\t\t\t\t<property name=\"enabled_lights\"> 30</property>\n\t\t\t\t\t<property name=\"render_engine\">33</property>\n\t\t\t\t\t<property name=\"resolution\"/>\n\t\t\t\t\t<property name=\"hider\"/>\n\t\t\t\t\t<property name=\"pixel_width\">320</property>\n\t\t\t\t\t<property name=\"pixel_height\">240</property>\n\t\t\t\t\t<property name=\"pixel_aspect_ratio\">1</property>\n\t\t\t\t\t<property name=\"default_atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"default_interior_shader\">0</property>\n\t\t\t\t\t<property name=\"default_exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"imager_shader\">0</property>\n\t\t\t\t\t<property name=\"bucket_width\">16</property>\n\t\t\t\t\t<property name=\"bucket_height\">16</property>\n\t\t\t\t\t<property name=\"grid_size\">256</property>\n\t\t\t\t\t<property name=\"eye_splits\">10</property>\n\t\t\t\t\t<property name=\"texture_memory\">1024</property>\n\t\t\t\t\t<property name=\"render_alpha\">false</property>\n\t\t\t\t\t<property name=\"pixel_xsamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_ysamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_filter\">gaussian</property>\n\t\t\t\t\t<property name=\"pixel_filter_width\">2</property>\n\t\t\t\t\t<property name=\"pixel_filter_height\">2</property>\n\t\t\t\t\t<property name=\"exposure\">1</property>\n\t\t\t\t\t<property name=\"gamma\">1</property>\n\t\t\t\t\t<property name=\"dof\">false</property>\n\t\t\t\t\t<property name=\"fstop\">0.3</property>\n\t\t\t\t\t<property name=\"focal_length\">1.6</property>\n\t\t\t\t\t<property name=\"focus_plane\">30</property>\n\t\t\t\t\t<property name=\"shading_rate\">1</property>\n\t\t\t\t\t<property name=\"shading_interpolation\">constant</property>\n\t\t\t\t\t<property name=\"two_sided\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"render_motion_blur\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Node Selection\" factory=\"5d305922 d2442343 077956b6 b112b9b3\" id=\"4\">\n\t\t\t\t<metadata>\n\t\t\t\t\t<pair name=\"ngui:unique_node\">node_selection</pair>\n\t\t\t\t</metadata>\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"selection_weights\"> 28 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Default Painter\" factory=\"6bc7d8a1 bbe7491f a2405d97 8b136c41\" id=\"38\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"points\" label=\"Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">39</property>\n\t\t\t\t\t<property name=\"edges\" label=\"Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">40</property>\n\t\t\t\t\t<property name=\"faces\" label=\"Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">41</property>\n\t\t\t\t\t<property name=\"sds_points\" label=\"SDS Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">42</property>\n\t\t\t\t\t<property name=\"sds_edges\" label=\"SDS Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">43</property>\n\t\t\t\t\t<property name=\"sds_faces\" label=\"SDS Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">44</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">45</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">46</property>\n\t\t\t\t\t<property name=\"nurbs_curves\" label=\"NURBS Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">47</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">48</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">49</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">50</property>\n\t\t\t\t\t<property name=\"bezier_triangle_patches\" label=\"Bezier Triangle Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">51</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">52</property>\n\t\t\t\t\t<property name=\"face_normals\" label=\"Face Normals\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">53</property>\n\t\t\t\t\t<property name=\"face_orientation\" label=\"Face Orientation\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">54</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">55</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">56</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">57</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">58</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">59</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">60</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">61</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">62</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Point Painter\" factory=\"7e376143 b640c3f4 288543a0 57f83514\" id=\"39\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Edge Painter\" factory=\"172c1208 d24430f5 63f70388 1945866e\" id=\"40\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Painter\" factory=\"7e6e8354 604f05ae 1d4d658b 96538240\" id=\"41\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Point Painter\" factory=\"46db8236 a1408c58 d829ceba ffe78fca\" id=\"42\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Edge Painter\" factory=\"6c827fec d74ffc1c 79ba768f fc8fa4d5\" id=\"43\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Face Painter\" factory=\"9d4043c8 864fe71b 38706d85 8b60af0c\" id=\"44\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Linear Curve Painter\" factory=\"6acd1d8e 954f4b3a bce4c296 523ebacd\" id=\"45\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cubic Curve Painter\" factory=\"cb30d291 47e146a3 b5167d0f 6f56bd61\" id=\"46\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Curve Painter\" factory=\"86705b44 ef534dc4 86d9fc7a 8709ec59\" id=\"47\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bilinear Patch Painter\" factory=\"f172b866 fce74aa8 a9e792ff 630653f3\" id=\"48\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bicubic Patch Painter\" factory=\"e058ab07 44384acd ba321d58 cdb3ef25\" id=\"49\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Patch Painter\" factory=\"8881a190 9d1c4e6f 8b8c0523 2dc43fda\" id=\"50\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bezier Triangle Patch Painter\" factory=\"8d38bda1 df47e212 1e06bfb8 a8f440c5\" id=\"51\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Blobby Point Painter\" factory=\"06148329 b2264760 84b25aab f8401c63\" id=\"52\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Normal Painter\" factory=\"02d092ca 84405ff6 4fe806a9 ab886cb1\" id=\"53\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Orientation Painter\" factory=\"7bc1ee5f 45802906 323984bf cbe858d6\" id=\"54\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cone Painter\" factory=\"ae8f0e12 33403c10 04e4998d 17a8ec8c\" id=\"55\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cylinder Painter\" factory=\"311d3fbd 6a46e7b0 ccf9af8e f2daf44a\" id=\"56\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Disk Painter\" factory=\"e30f4079 8a4a030f 5ce166b6 77f324b4\" id=\"57\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Hyperboloid Painter\" factory=\"8fc78171 3e49ff1a a4b6e69d aa8fafa3\" id=\"58\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Paraboloid Painter\" factory=\"a4e66aa9 c34a22ca c5d3b19e 83c5d0f4\" id=\"59\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Sphere Painter\" factory=\"e22923fa 5146fa44 0b6ff7b2 3f71ad6e\" id=\"60\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Teapot Painter\" factory=\"aa87fdcc fc47c821 87d74dad f1f9f833\" id=\"61\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Torus Painter\" factory=\"271118dd 2a47903b f36b96b8 f6916c27\" id=\"62\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyGrid\" factory=\"acb3b4f8 5cd6471c aed72686 c576987c\" id=\"63\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">32</property>\n\t\t\t\t\t<property name=\"columns\">1</property>\n\t\t\t\t\t<property name=\"rows\">1</property>\n\t\t\t\t\t<property name=\"width\">100</property>\n\t\t\t\t\t<property name=\"height\">100</property>\n\t\t\t\t\t<property name=\"orientation\">+z</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyGrid Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"36\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">38</property>\n\t\t\t\t\t<property name=\"ri_painter\">8</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"QuadricLogo\" factory=\"efc80ecb 9340c5b0 0061109e c97591a3\" id=\"64\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">32</property>\n\t\t\t\t\t<property name=\"radius\">10</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"QuadricLogo Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"37\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">38</property>\n\t\t\t\t\t<property name=\"ri_painter\">8</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Move QuadricLogo Instance\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"65\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -10.372150031167706 0 1 0 0 0 0 1 12.181691980739636 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyToBilinear\" factory=\"e99f3672 6e85457d 9ce1f9dc 6bb71691\" id=\"66\"/>\n\t\t\t<node name=\"RenderManDisplacementShader\" factory=\"62827bb7 4cb64427 a9eadbc8 62e1a3f2\" id=\"28\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/displacement/k3d_dented.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"Km\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">1</property>\n\t\t\t\t\t<property name=\"power\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">3</property>\n\t\t\t\t\t<property name=\"frequency\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">1</property>\n\t\t\t\t\t<property name=\"maxoctaves\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">6</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t</nodes>\n\t\t<dependencies>\n\t\t\t<dependency from_node=\"7\" from_property=\"output_matrix\" to_node=\"6\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"31\" from_property=\"output_matrix\" to_node=\"30\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"66\" from_property=\"output_mesh\" to_node=\"36\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"65\" from_property=\"output_matrix\" to_node=\"37\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"64\" from_property=\"output_mesh\" to_node=\"37\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"63\" from_property=\"output_mesh\" to_node=\"66\" to_property=\"input_mesh\"/>\n\t\t</dependencies>\n\t</document>\n</k3dml>\n\n"
  },
  {
    "path": "tests/shaders/light_shader_test.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml package=\"k3d\" version=\"0.8.0.1\" host=\"Linux-2.6.31-14-generic;i686\">\n\t<document>\n\t\t<nodes>\n\t\t\t<node name=\"Axes\" factory=\"00000001 00000000 00000000 00000001\" id=\"2\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"axes\">true</property>\n\t\t\t\t\t<property name=\"xyplane\">true</property>\n\t\t\t\t\t<property name=\"yzplane\">false</property>\n\t\t\t\t\t<property name=\"xzplane\">false</property>\n\t\t\t\t\t<property name=\"gridsize\">2</property>\n\t\t\t\t\t<property name=\"gridcount\">5</property>\n\t\t\t\t\t<property name=\"xcolor\">1 0 0</property>\n\t\t\t\t\t<property name=\"ycolor\">0 0.69999999999999996 0</property>\n\t\t\t\t\t<property name=\"zcolor\">0 0 0.69999999999999996</property>\n\t\t\t\t\t<property name=\"gridcolor\">0.40000000000000002 0.40000000000000002 0.40000000000000002</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/Vera.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"font_size\">12</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Engine\" factory=\"0059ba47 7bf740f3 93fb523d 5899f22c\" id=\"3\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"point_size\">4</property>\n\t\t\t\t\t<property name=\"background_color\">0.80000000000000004 0.80000000000000004 0.80000000000000004</property>\n\t\t\t\t\t<property name=\"fog\">false</property>\n\t\t\t\t\t<property name=\"fog_near\">0</property>\n\t\t\t\t\t<property name=\"fog_far\">100</property>\n\t\t\t\t\t<property name=\"headlight\">true</property>\n\t\t\t\t\t<property name=\"show_lights\">false</property>\n\t\t\t\t\t<property name=\"draw_two_sided\">true</property>\n\t\t\t\t\t<property name=\"draw_safe_zone\">false</property>\n\t\t\t\t\t<property name=\"draw_aimpoint\">true</property>\n\t\t\t\t\t<property name=\"draw_crop_window\">true</property>\n\t\t\t\t\t<property name=\"draw_frustum\">true</property>\n\t\t\t\t\t<property name=\"node_selection\">4</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TimeSource\" factory=\"1978f1f7 4a864c99 8caf7cfc d2591baf\" id=\"5\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"start_time\">0</property>\n\t\t\t\t\t<property name=\"end_time\">4</property>\n\t\t\t\t\t<property name=\"frame_rate\">30</property>\n\t\t\t\t\t<property name=\"time\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera\" factory=\"45ce1872 af184b6d b391e136 0dcfe8b5\" id=\"6\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"navigation_target\">6</property>\n\t\t\t\t\t<property name=\"world_target\">0.46191217059706069 1.4962293607823032 -2.1441834099610415</property>\n\t\t\t\t\t<property name=\"aspect_ratio\"/>\n\t\t\t\t\t<property name=\"show_projection\">false</property>\n\t\t\t\t\t<property name=\"orthographic\">false</property>\n\t\t\t\t\t<property name=\"left\">-0.6666666666666666</property>\n\t\t\t\t\t<property name=\"right\">0.6666666666666666</property>\n\t\t\t\t\t<property name=\"top\">0.5</property>\n\t\t\t\t\t<property name=\"bottom\">-0.5</property>\n\t\t\t\t\t<property name=\"near\">1</property>\n\t\t\t\t\t<property name=\"far\">1000</property>\n\t\t\t\t\t<property name=\"crop_window_left\">0</property>\n\t\t\t\t\t<property name=\"crop_window_right\">1</property>\n\t\t\t\t\t<property name=\"crop_window_top\">0</property>\n\t\t\t\t\t<property name=\"crop_window_bottom\">1</property>\n\t\t\t\t\t<property name=\"show_reference_plane\">false</property>\n\t\t\t\t\t<property name=\"reference_plane\">0</property>\n\t\t\t\t\t<property name=\"reference_plane_color\">0 0 0.69999999999999996</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"7\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">0.97292123599071689 0.056759042681239408 0.22405954483619972 -16.072652603116637 0.23113690436253523 -0.2389150192669198 -0.94313060867007781 71.094934252052511 -1.0314055924436072e-14 0.96938022707428717 -0.24556460526184021 15.977355999580528 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Default Painter\" factory=\"243cba5a 13f342fa 8f1a19cd faf34169\" id=\"8\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"particles\" label=\"Particles\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">9</property>\n\t\t\t\t\t<property name=\"polyhedra\" label=\"Polyhedra\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">10</property>\n\t\t\t\t\t<property name=\"subdivision_surfaces\" label=\"Subdivision Surfaces\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">11</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">12</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">13</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">14</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">15</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">16</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">17</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">18</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">19</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">20</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">21</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">22</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">23</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">24</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">25</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Particle Painter\" factory=\"06fab90b 2f034d69 b4a1cb9f b9864144\" id=\"9\"/>\n\t\t\t<node name=\"RenderMan Polyhedron Painter\" factory=\"0771ea79 6c8c4c6d 8bab8c83 42fc73e9\" id=\"10\"/>\n\t\t\t<node name=\"RenderMan Subdivision Surface Painter\" factory=\"4d6fae39 723e4ed3 bc5735c5 3b75edc0\" id=\"11\"/>\n\t\t\t<node name=\"RenderMan Linear Curve Painter\" factory=\"f8b19206 a0ae4bd1 b3548a15 1209469e\" id=\"12\"/>\n\t\t\t<node name=\"RenderMan Cubic Curve Painter\" factory=\"8c5be7c4 0e8d43c5 a1daace4 a79275d7\" id=\"13\"/>\n\t\t\t<node name=\"RenderMan Bilinear Patch Painter\" factory=\"3f51b275 5a664903 96ed9168 503e30f0\" id=\"14\"/>\n\t\t\t<node name=\"RenderMan Bicubic Patch Painter\" factory=\"64dfefde eedc4047 b59fc8f6 972a9b86\" id=\"15\"/>\n\t\t\t<node name=\"RenderMan NURBS Patch Painter\" factory=\"120d87f0 fe05419f ae2d14ce ea9c32b4\" id=\"16\"/>\n\t\t\t<node name=\"RenderMan Blobby Painter\" factory=\"0221462c c3d44a12 97b39425 29774d3f\" id=\"17\"/>\n\t\t\t<node name=\"RenderMan Cone Painter\" factory=\"6612c455 774ed5d4 5ff0c495 6d920b8e\" id=\"18\"/>\n\t\t\t<node name=\"RenderMan Cylinder Painter\" factory=\"85a1d5ac 224449cf 202911a1 a2434ee8\" id=\"19\"/>\n\t\t\t<node name=\"RenderMan Disk Painter\" factory=\"6c92b34f 57480914 1708dca6 cc8651cc\" id=\"20\"/>\n\t\t\t<node name=\"RenderMan Hyperboloid Painter\" factory=\"8f5ac6bd f84bfac3 8585f08b 953e3df1\" id=\"21\"/>\n\t\t\t<node name=\"RenderMan Paraboloid Painter\" factory=\"49dafd22 d34c22e6 cb8e30b3 0f74f5ef\" id=\"22\"/>\n\t\t\t<node name=\"RenderMan Sphere Painter\" factory=\"a07012c4 ce4b11f4 92d5f48d 8f3751c0\" id=\"23\"/>\n\t\t\t<node name=\"RenderMan Teapot Painter\" factory=\"cf54aa9b 9c4e886c a8cf2fa2 470d44ed\" id=\"24\"/>\n\t\t\t<node name=\"RenderMan Torus Painter\" factory=\"d3865bdb 69469c71 2cc55a8b 420de184\" id=\"25\"/>\n\t\t\t<node name=\"Surface Shader\" factory=\"b553a3bd d1044c6e b3f21e07 87132c31\" id=\"26\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/surface/k3d_plastic.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"Ka\" label=\"Ambient\" description=\"Ambient Amount\" type=\"k3d::double_t\" user_property=\"generic\">1</property>\n\t\t\t\t\t<property name=\"Kd\" label=\"Diffuse\" description=\"Diffuse Amount\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t\t<property name=\"Ks\" label=\"Specular\" description=\"Specular Amount\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t\t<property name=\"roughness\" label=\"Roughness\" description=\"Surface Roughness (affects specular reflection size)\" type=\"k3d::double_t\" user_property=\"generic\">0.1</property>\n\t\t\t\t\t<property name=\"specularcolor\" label=\"Specular Color\" description=\"Specular Reflection Color\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManMaterial\" factory=\"00000001 00000000 00000000 00000024\" id=\"27\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"surface_shader\">26</property>\n\t\t\t\t\t<property name=\"displacement_shader\">0</property>\n\t\t\t\t\t<property name=\"atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"interior_shader\">0</property>\n\t\t\t\t\t<property name=\"exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"matte\">false</property>\n\t\t\t\t\t<property name=\"displacement_bounds\">1</property>\n\t\t\t\t\t<property name=\"color\">1 1 1</property>\n\t\t\t\t\t<property name=\"opacity\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Shader\" factory=\"830e867b 7bc94c6c 8d5087ee 8aa35db2\" id=\"28\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/light/k3d_pointlight.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"intensity\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">3000</property>\n\t\t\t\t\t<property name=\"lightcolor\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t\t<property name=\"from\" label=\"\" description=\"\" type=\"k3d::point3\" user_property=\"generic\">0 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light\" factory=\"00000001 00000000 00000000 0000001d\" id=\"29\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"shader\">28</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"30\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -20 0 1 0 20 0 0 1 30 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Material\" factory=\"00000001 00000002 00000003 00000004\" id=\"31\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"renderman_material\" label=\"RenderMan Material\" description=\"\" type=\"k3d::imaterial*\" user_property=\"generic\">27</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Aqsis\" factory=\"8d430069 63404829 053361ad fc6abda6\" id=\"32\"/>\n\t\t\t<node name=\"Pixie\" factory=\"7a1d773b a9472dae a80223ab 59d62f9a\" id=\"33\"/>\n\t\t\t<node name=\"RenderMan Engine\" factory=\"0dc5e733 fa684e05 86a3865f 42f7a99d\" id=\"34\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"visible_nodes\"> 35 36</property>\n\t\t\t\t\t<property name=\"enabled_lights\"> 29</property>\n\t\t\t\t\t<property name=\"render_engine\">32</property>\n\t\t\t\t\t<property name=\"resolution\"/>\n\t\t\t\t\t<property name=\"hider\"/>\n\t\t\t\t\t<property name=\"pixel_width\">320</property>\n\t\t\t\t\t<property name=\"pixel_height\">240</property>\n\t\t\t\t\t<property name=\"pixel_aspect_ratio\">1</property>\n\t\t\t\t\t<property name=\"default_atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"default_interior_shader\">0</property>\n\t\t\t\t\t<property name=\"default_exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"imager_shader\">0</property>\n\t\t\t\t\t<property name=\"bucket_width\">16</property>\n\t\t\t\t\t<property name=\"bucket_height\">16</property>\n\t\t\t\t\t<property name=\"grid_size\">256</property>\n\t\t\t\t\t<property name=\"eye_splits\">10</property>\n\t\t\t\t\t<property name=\"texture_memory\">1024</property>\n\t\t\t\t\t<property name=\"render_alpha\">false</property>\n\t\t\t\t\t<property name=\"pixel_xsamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_ysamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_filter\">gaussian</property>\n\t\t\t\t\t<property name=\"pixel_filter_width\">2</property>\n\t\t\t\t\t<property name=\"pixel_filter_height\">2</property>\n\t\t\t\t\t<property name=\"exposure\">1</property>\n\t\t\t\t\t<property name=\"gamma\">1</property>\n\t\t\t\t\t<property name=\"dof\">false</property>\n\t\t\t\t\t<property name=\"fstop\">0.3</property>\n\t\t\t\t\t<property name=\"focal_length\">1.6</property>\n\t\t\t\t\t<property name=\"focus_plane\">30</property>\n\t\t\t\t\t<property name=\"shading_rate\">1</property>\n\t\t\t\t\t<property name=\"shading_interpolation\">constant</property>\n\t\t\t\t\t<property name=\"two_sided\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"render_motion_blur\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Node Selection\" factory=\"5d305922 d2442343 077956b6 b112b9b3\" id=\"4\">\n\t\t\t\t<metadata>\n\t\t\t\t\t<pair name=\"ngui:unique_node\">node_selection</pair>\n\t\t\t\t</metadata>\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"selection_weights\"> 36 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Default Painter\" factory=\"6bc7d8a1 bbe7491f a2405d97 8b136c41\" id=\"37\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"points\" label=\"Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">38</property>\n\t\t\t\t\t<property name=\"edges\" label=\"Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">39</property>\n\t\t\t\t\t<property name=\"faces\" label=\"Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">40</property>\n\t\t\t\t\t<property name=\"sds_points\" label=\"SDS Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">41</property>\n\t\t\t\t\t<property name=\"sds_edges\" label=\"SDS Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">42</property>\n\t\t\t\t\t<property name=\"sds_faces\" label=\"SDS Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">43</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">44</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">45</property>\n\t\t\t\t\t<property name=\"nurbs_curves\" label=\"NURBS Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">46</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">47</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">48</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">49</property>\n\t\t\t\t\t<property name=\"bezier_triangle_patches\" label=\"Bezier Triangle Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">50</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">51</property>\n\t\t\t\t\t<property name=\"face_normals\" label=\"Face Normals\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">52</property>\n\t\t\t\t\t<property name=\"face_orientation\" label=\"Face Orientation\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">53</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">54</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">55</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">56</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">57</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">58</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">59</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">60</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">61</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Point Painter\" factory=\"7e376143 b640c3f4 288543a0 57f83514\" id=\"38\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Edge Painter\" factory=\"172c1208 d24430f5 63f70388 1945866e\" id=\"39\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Painter\" factory=\"7e6e8354 604f05ae 1d4d658b 96538240\" id=\"40\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Point Painter\" factory=\"46db8236 a1408c58 d829ceba ffe78fca\" id=\"41\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Edge Painter\" factory=\"6c827fec d74ffc1c 79ba768f fc8fa4d5\" id=\"42\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Face Painter\" factory=\"9d4043c8 864fe71b 38706d85 8b60af0c\" id=\"43\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Linear Curve Painter\" factory=\"6acd1d8e 954f4b3a bce4c296 523ebacd\" id=\"44\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cubic Curve Painter\" factory=\"cb30d291 47e146a3 b5167d0f 6f56bd61\" id=\"45\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Curve Painter\" factory=\"86705b44 ef534dc4 86d9fc7a 8709ec59\" id=\"46\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bilinear Patch Painter\" factory=\"f172b866 fce74aa8 a9e792ff 630653f3\" id=\"47\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bicubic Patch Painter\" factory=\"e058ab07 44384acd ba321d58 cdb3ef25\" id=\"48\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Patch Painter\" factory=\"8881a190 9d1c4e6f 8b8c0523 2dc43fda\" id=\"49\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bezier Triangle Patch Painter\" factory=\"8d38bda1 df47e212 1e06bfb8 a8f440c5\" id=\"50\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Blobby Point Painter\" factory=\"06148329 b2264760 84b25aab f8401c63\" id=\"51\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Normal Painter\" factory=\"02d092ca 84405ff6 4fe806a9 ab886cb1\" id=\"52\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Orientation Painter\" factory=\"7bc1ee5f 45802906 323984bf cbe858d6\" id=\"53\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cone Painter\" factory=\"ae8f0e12 33403c10 04e4998d 17a8ec8c\" id=\"54\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cylinder Painter\" factory=\"311d3fbd 6a46e7b0 ccf9af8e f2daf44a\" id=\"55\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Disk Painter\" factory=\"e30f4079 8a4a030f 5ce166b6 77f324b4\" id=\"56\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Hyperboloid Painter\" factory=\"8fc78171 3e49ff1a a4b6e69d aa8fafa3\" id=\"57\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Paraboloid Painter\" factory=\"a4e66aa9 c34a22ca c5d3b19e 83c5d0f4\" id=\"58\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Sphere Painter\" factory=\"e22923fa 5146fa44 0b6ff7b2 3f71ad6e\" id=\"59\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Teapot Painter\" factory=\"aa87fdcc fc47c821 87d74dad f1f9f833\" id=\"60\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Torus Painter\" factory=\"271118dd 2a47903b f36b96b8 f6916c27\" id=\"61\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyCube\" factory=\"7ec966d1 d78a445c 8806b8a3 5593f241\" id=\"62\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">31</property>\n\t\t\t\t\t<property name=\"columns\">1</property>\n\t\t\t\t\t<property name=\"rows\">1</property>\n\t\t\t\t\t<property name=\"slices\">1</property>\n\t\t\t\t\t<property name=\"width\">50</property>\n\t\t\t\t\t<property name=\"height\">50</property>\n\t\t\t\t\t<property name=\"depth\">50</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyCube Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"35\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set>\n\t\t\t\t\t\t\t<storage type=\"point\">\n\t\t\t\t\t\t\t\t<structure>\n\t\t\t\t\t\t\t\t\t<array name=\"index_begin\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"index_end\" type=\"k3d::uint_t\">4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"weight\" type=\"k3d::double_t\">0</array>\n\t\t\t\t\t\t\t\t</structure>\n\t\t\t\t\t\t\t</storage>\n\t\t\t\t\t\t\t<storage type=\"primitive\">\n\t\t\t\t\t\t\t\t<structure>\n\t\t\t\t\t\t\t\t\t<array name=\"index_begin\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"index_end\" type=\"k3d::uint_t\">4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_begin\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_end\" type=\"k3d::uint_t\">4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_first_range\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_range_count\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_selection_type\" type=\"k3d::int32_t\">26 32 30 33 28 34 27 35</array>\n\t\t\t\t\t\t\t\t\t<array name=\"weight\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t\t\t</structure>\n\t\t\t\t\t\t\t</storage>\n\t\t\t\t\t\t</set>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">37</property>\n\t\t\t\t\t<property name=\"ri_painter\">8</property>\n\t\t\t\t\t<property name=\"show_component_selection\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"DeleteComponents\" factory=\"2d738b7a 6f473349 53a066ad a857f734\" id=\"63\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set>\n\t\t\t\t\t\t\t<storage type=\"point\">\n\t\t\t\t\t\t\t\t<structure>\n\t\t\t\t\t\t\t\t\t<array name=\"index_begin\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"index_end\" type=\"k3d::uint_t\">4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"weight\" type=\"k3d::double_t\">0</array>\n\t\t\t\t\t\t\t\t</structure>\n\t\t\t\t\t\t\t</storage>\n\t\t\t\t\t\t\t<storage type=\"primitive\">\n\t\t\t\t\t\t\t\t<structure>\n\t\t\t\t\t\t\t\t\t<array name=\"index_begin\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"index_end\" type=\"k3d::uint_t\">4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_begin\" type=\"k3d::uint_t\">0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_end\" type=\"k3d::uint_t\">4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_first_range\" type=\"k3d::uint_t\">0 1 2 3 4 5 6 7</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_range_count\" type=\"k3d::uint_t\">1 1 1 1 1 1 1 1</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_selection_type\" type=\"k3d::int32_t\">26 32 30 33 28 34 27 35</array>\n\t\t\t\t\t\t\t\t\t<array name=\"weight\" type=\"k3d::double_t\">0 0 0 0 0 0 0 0</array>\n\t\t\t\t\t\t\t\t</structure>\n\t\t\t\t\t\t\t</storage>\n\t\t\t\t\t\t\t<storage type=\"primitive\">\n\t\t\t\t\t\t\t\t<structure>\n\t\t\t\t\t\t\t\t\t<array name=\"index_begin\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"index_end\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_begin\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_end\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_first_range\" type=\"k3d::uint_t\">0</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_range_count\" type=\"k3d::uint_t\">1</array>\n\t\t\t\t\t\t\t\t\t<array name=\"primitive_selection_type\" type=\"k3d::int32_t\">33</array>\n\t\t\t\t\t\t\t\t\t<array name=\"weight\" type=\"k3d::double_t\">1</array>\n\t\t\t\t\t\t\t\t</structure>\n\t\t\t\t\t\t\t</storage>\n\t\t\t\t\t\t</set>\n\t\t\t\t\t</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"QuadricLogo\" factory=\"efc80ecb 9340c5b0 0061109e c97591a3\" id=\"64\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">31</property>\n\t\t\t\t\t<property name=\"radius\">10</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"QuadricLogo Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"36\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">37</property>\n\t\t\t\t\t<property name=\"ri_painter\">8</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Rotate QuadricLogo Instance\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"65\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">0.91334166480324963 -0.34439835307360922 -0.21724819385811703 -10.236576045151299 -1.3769367590565906e-17 0.53352495689891433 -0.84578432260595371 9.300286235580657e-16 0.40719406102548744 0.77249006127341058 0.48729057234813639 -17.643869299728394 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t</nodes>\n\t\t<dependencies>\n\t\t\t<dependency from_node=\"7\" from_property=\"output_matrix\" to_node=\"6\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"63\" from_property=\"output_mesh\" to_node=\"35\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"62\" from_property=\"output_mesh\" to_node=\"63\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"65\" from_property=\"output_matrix\" to_node=\"36\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"64\" from_property=\"output_mesh\" to_node=\"36\" to_property=\"input_mesh\"/>\n\t\t</dependencies>\n\t</document>\n</k3dml>\n\n"
  },
  {
    "path": "tests/shaders/surface_shader_test.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml package=\"k3d\" version=\"0.8.0.1\" host=\"Linux-2.6.31-14-generic;i686\">\n\t<document>\n\t\t<nodes>\n\t\t\t<node name=\"Axes\" factory=\"00000001 00000000 00000000 00000001\" id=\"2\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"axes\">true</property>\n\t\t\t\t\t<property name=\"xyplane\">true</property>\n\t\t\t\t\t<property name=\"yzplane\">false</property>\n\t\t\t\t\t<property name=\"xzplane\">false</property>\n\t\t\t\t\t<property name=\"gridsize\">2</property>\n\t\t\t\t\t<property name=\"gridcount\">5</property>\n\t\t\t\t\t<property name=\"xcolor\">1 0 0</property>\n\t\t\t\t\t<property name=\"ycolor\">0 0.69999999999999996 0</property>\n\t\t\t\t\t<property name=\"zcolor\">0 0 0.69999999999999996</property>\n\t\t\t\t\t<property name=\"gridcolor\">0.40000000000000002 0.40000000000000002 0.40000000000000002</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/Vera.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"font_size\">12</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Engine\" factory=\"0059ba47 7bf740f3 93fb523d 5899f22c\" id=\"3\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"point_size\">4</property>\n\t\t\t\t\t<property name=\"background_color\">0.80000000000000004 0.80000000000000004 0.80000000000000004</property>\n\t\t\t\t\t<property name=\"fog\">false</property>\n\t\t\t\t\t<property name=\"fog_near\">0</property>\n\t\t\t\t\t<property name=\"fog_far\">100</property>\n\t\t\t\t\t<property name=\"headlight\">true</property>\n\t\t\t\t\t<property name=\"show_lights\">false</property>\n\t\t\t\t\t<property name=\"draw_two_sided\">true</property>\n\t\t\t\t\t<property name=\"draw_safe_zone\">false</property>\n\t\t\t\t\t<property name=\"draw_aimpoint\">true</property>\n\t\t\t\t\t<property name=\"draw_crop_window\">true</property>\n\t\t\t\t\t<property name=\"draw_frustum\">true</property>\n\t\t\t\t\t<property name=\"node_selection\">4</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TimeSource\" factory=\"1978f1f7 4a864c99 8caf7cfc d2591baf\" id=\"5\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"start_time\">0</property>\n\t\t\t\t\t<property name=\"end_time\">4</property>\n\t\t\t\t\t<property name=\"frame_rate\">30</property>\n\t\t\t\t\t<property name=\"time\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera\" factory=\"45ce1872 af184b6d b391e136 0dcfe8b5\" id=\"6\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"navigation_target\">6</property>\n\t\t\t\t\t<property name=\"world_target\">-0.27268858314002625 -2.01660029823329 5.1974089410552162</property>\n\t\t\t\t\t<property name=\"aspect_ratio\"/>\n\t\t\t\t\t<property name=\"show_projection\">false</property>\n\t\t\t\t\t<property name=\"orthographic\">false</property>\n\t\t\t\t\t<property name=\"left\">-0.6666666666666666</property>\n\t\t\t\t\t<property name=\"right\">0.6666666666666666</property>\n\t\t\t\t\t<property name=\"top\">0.5</property>\n\t\t\t\t\t<property name=\"bottom\">-0.5</property>\n\t\t\t\t\t<property name=\"near\">1</property>\n\t\t\t\t\t<property name=\"far\">1000</property>\n\t\t\t\t\t<property name=\"crop_window_left\">0</property>\n\t\t\t\t\t<property name=\"crop_window_right\">1</property>\n\t\t\t\t\t<property name=\"crop_window_top\">0</property>\n\t\t\t\t\t<property name=\"crop_window_bottom\">1</property>\n\t\t\t\t\t<property name=\"show_reference_plane\">false</property>\n\t\t\t\t\t<property name=\"reference_plane\">0</property>\n\t\t\t\t\t<property name=\"reference_plane_color\">0 0 0.69999999999999996</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"7\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">0.9254867468171396 0.11926750754890852 0.35951292481480979 -8.1136358023519968 0.3787799908467025 -0.29141058194678859 -0.87841083284736776 17.141467469950836 9.3107758915994543e-15 0.94913388643146923 -0.3148727768917074 12.064758218264963 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Default Painter\" factory=\"243cba5a 13f342fa 8f1a19cd faf34169\" id=\"8\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"particles\" label=\"Particles\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">9</property>\n\t\t\t\t\t<property name=\"polyhedra\" label=\"Polyhedra\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">10</property>\n\t\t\t\t\t<property name=\"subdivision_surfaces\" label=\"Subdivision Surfaces\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">11</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">12</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">13</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">14</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">15</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">16</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">17</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">18</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">19</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">20</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">21</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">22</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">23</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">24</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">25</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Particle Painter\" factory=\"06fab90b 2f034d69 b4a1cb9f b9864144\" id=\"9\"/>\n\t\t\t<node name=\"RenderMan Polyhedron Painter\" factory=\"0771ea79 6c8c4c6d 8bab8c83 42fc73e9\" id=\"10\"/>\n\t\t\t<node name=\"RenderMan Subdivision Surface Painter\" factory=\"4d6fae39 723e4ed3 bc5735c5 3b75edc0\" id=\"11\"/>\n\t\t\t<node name=\"RenderMan Linear Curve Painter\" factory=\"f8b19206 a0ae4bd1 b3548a15 1209469e\" id=\"12\"/>\n\t\t\t<node name=\"RenderMan Cubic Curve Painter\" factory=\"8c5be7c4 0e8d43c5 a1daace4 a79275d7\" id=\"13\"/>\n\t\t\t<node name=\"RenderMan Bilinear Patch Painter\" factory=\"3f51b275 5a664903 96ed9168 503e30f0\" id=\"14\"/>\n\t\t\t<node name=\"RenderMan Bicubic Patch Painter\" factory=\"64dfefde eedc4047 b59fc8f6 972a9b86\" id=\"15\"/>\n\t\t\t<node name=\"RenderMan NURBS Patch Painter\" factory=\"120d87f0 fe05419f ae2d14ce ea9c32b4\" id=\"16\"/>\n\t\t\t<node name=\"RenderMan Blobby Painter\" factory=\"0221462c c3d44a12 97b39425 29774d3f\" id=\"17\"/>\n\t\t\t<node name=\"RenderMan Cone Painter\" factory=\"6612c455 774ed5d4 5ff0c495 6d920b8e\" id=\"18\"/>\n\t\t\t<node name=\"RenderMan Cylinder Painter\" factory=\"85a1d5ac 224449cf 202911a1 a2434ee8\" id=\"19\"/>\n\t\t\t<node name=\"RenderMan Disk Painter\" factory=\"6c92b34f 57480914 1708dca6 cc8651cc\" id=\"20\"/>\n\t\t\t<node name=\"RenderMan Hyperboloid Painter\" factory=\"8f5ac6bd f84bfac3 8585f08b 953e3df1\" id=\"21\"/>\n\t\t\t<node name=\"RenderMan Paraboloid Painter\" factory=\"49dafd22 d34c22e6 cb8e30b3 0f74f5ef\" id=\"22\"/>\n\t\t\t<node name=\"RenderMan Sphere Painter\" factory=\"a07012c4 ce4b11f4 92d5f48d 8f3751c0\" id=\"23\"/>\n\t\t\t<node name=\"RenderMan Teapot Painter\" factory=\"cf54aa9b 9c4e886c a8cf2fa2 470d44ed\" id=\"24\"/>\n\t\t\t<node name=\"RenderMan Torus Painter\" factory=\"d3865bdb 69469c71 2cc55a8b 420de184\" id=\"25\"/>\n\t\t\t<node name=\"Surface Shader\" factory=\"b553a3bd d1044c6e b3f21e07 87132c31\" id=\"26\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/surface/k3d_plastic.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"Ka\" label=\"Ambient\" description=\"Ambient Amount\" type=\"k3d::double_t\" user_property=\"generic\">1</property>\n\t\t\t\t\t<property name=\"Kd\" label=\"Diffuse\" description=\"Diffuse Amount\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t\t<property name=\"Ks\" label=\"Specular\" description=\"Specular Amount\" type=\"k3d::double_t\" user_property=\"generic\">0.5</property>\n\t\t\t\t\t<property name=\"roughness\" label=\"Roughness\" description=\"Surface Roughness (affects specular reflection size)\" type=\"k3d::double_t\" user_property=\"generic\">0.1</property>\n\t\t\t\t\t<property name=\"specularcolor\" label=\"Specular Color\" description=\"Specular Reflection Color\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManMaterial\" factory=\"00000001 00000000 00000000 00000024\" id=\"27\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"surface_shader\">26</property>\n\t\t\t\t\t<property name=\"displacement_shader\">0</property>\n\t\t\t\t\t<property name=\"atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"interior_shader\">0</property>\n\t\t\t\t\t<property name=\"exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"matte\">false</property>\n\t\t\t\t\t<property name=\"displacement_bounds\">1</property>\n\t\t\t\t\t<property name=\"color\">1 1 1</property>\n\t\t\t\t\t<property name=\"opacity\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Shader\" factory=\"830e867b 7bc94c6c 8d5087ee 8aa35db2\" id=\"28\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/light/k3d_pointlight.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"intensity\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">3000</property>\n\t\t\t\t\t<property name=\"lightcolor\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t\t<property name=\"from\" label=\"\" description=\"\" type=\"k3d::point3\" user_property=\"generic\">0 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light\" factory=\"00000001 00000000 00000000 0000001d\" id=\"29\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"shader\">28</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"30\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -20 0 1 0 20 0 0 1 30 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Material\" factory=\"00000001 00000002 00000003 00000004\" id=\"31\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"renderman_material\" label=\"RenderMan Material\" description=\"\" type=\"k3d::imaterial*\" user_property=\"generic\">27</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Aqsis\" factory=\"8d430069 63404829 053361ad fc6abda6\" id=\"32\"/>\n\t\t\t<node name=\"Pixie\" factory=\"7a1d773b a9472dae a80223ab 59d62f9a\" id=\"33\"/>\n\t\t\t<node name=\"RenderMan Engine\" factory=\"0dc5e733 fa684e05 86a3865f 42f7a99d\" id=\"34\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"visible_nodes\"> 35 36</property>\n\t\t\t\t\t<property name=\"enabled_lights\"> 29</property>\n\t\t\t\t\t<property name=\"render_engine\">32</property>\n\t\t\t\t\t<property name=\"resolution\"/>\n\t\t\t\t\t<property name=\"hider\"/>\n\t\t\t\t\t<property name=\"pixel_width\">320</property>\n\t\t\t\t\t<property name=\"pixel_height\">240</property>\n\t\t\t\t\t<property name=\"pixel_aspect_ratio\">1</property>\n\t\t\t\t\t<property name=\"default_atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"default_interior_shader\">0</property>\n\t\t\t\t\t<property name=\"default_exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"imager_shader\">0</property>\n\t\t\t\t\t<property name=\"bucket_width\">16</property>\n\t\t\t\t\t<property name=\"bucket_height\">16</property>\n\t\t\t\t\t<property name=\"grid_size\">256</property>\n\t\t\t\t\t<property name=\"eye_splits\">10</property>\n\t\t\t\t\t<property name=\"texture_memory\">1024</property>\n\t\t\t\t\t<property name=\"render_alpha\">false</property>\n\t\t\t\t\t<property name=\"pixel_xsamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_ysamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_filter\">gaussian</property>\n\t\t\t\t\t<property name=\"pixel_filter_width\">2</property>\n\t\t\t\t\t<property name=\"pixel_filter_height\">2</property>\n\t\t\t\t\t<property name=\"exposure\">1</property>\n\t\t\t\t\t<property name=\"gamma\">1</property>\n\t\t\t\t\t<property name=\"dof\">false</property>\n\t\t\t\t\t<property name=\"fstop\">0.3</property>\n\t\t\t\t\t<property name=\"focal_length\">1.6</property>\n\t\t\t\t\t<property name=\"focus_plane\">30</property>\n\t\t\t\t\t<property name=\"shading_rate\">1</property>\n\t\t\t\t\t<property name=\"shading_interpolation\">constant</property>\n\t\t\t\t\t<property name=\"two_sided\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"render_motion_blur\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Node Selection\" factory=\"5d305922 d2442343 077956b6 b112b9b3\" id=\"4\">\n\t\t\t\t<metadata>\n\t\t\t\t\t<pair name=\"ngui:unique_node\">node_selection</pair>\n\t\t\t\t</metadata>\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"selection_weights\"/>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Default Painter\" factory=\"6bc7d8a1 bbe7491f a2405d97 8b136c41\" id=\"37\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"points\" label=\"Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">38</property>\n\t\t\t\t\t<property name=\"edges\" label=\"Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">39</property>\n\t\t\t\t\t<property name=\"faces\" label=\"Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">40</property>\n\t\t\t\t\t<property name=\"sds_points\" label=\"SDS Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">41</property>\n\t\t\t\t\t<property name=\"sds_edges\" label=\"SDS Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">42</property>\n\t\t\t\t\t<property name=\"sds_faces\" label=\"SDS Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">43</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">44</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">45</property>\n\t\t\t\t\t<property name=\"nurbs_curves\" label=\"NURBS Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">46</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">47</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">48</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">49</property>\n\t\t\t\t\t<property name=\"bezier_triangle_patches\" label=\"Bezier Triangle Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">50</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">51</property>\n\t\t\t\t\t<property name=\"face_normals\" label=\"Face Normals\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">52</property>\n\t\t\t\t\t<property name=\"face_orientation\" label=\"Face Orientation\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">53</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">54</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">55</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">56</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">57</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">58</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">59</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">60</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">61</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Point Painter\" factory=\"7e376143 b640c3f4 288543a0 57f83514\" id=\"38\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Edge Painter\" factory=\"172c1208 d24430f5 63f70388 1945866e\" id=\"39\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Painter\" factory=\"7e6e8354 604f05ae 1d4d658b 96538240\" id=\"40\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Point Painter\" factory=\"46db8236 a1408c58 d829ceba ffe78fca\" id=\"41\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Edge Painter\" factory=\"6c827fec d74ffc1c 79ba768f fc8fa4d5\" id=\"42\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Face Painter\" factory=\"9d4043c8 864fe71b 38706d85 8b60af0c\" id=\"43\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Linear Curve Painter\" factory=\"6acd1d8e 954f4b3a bce4c296 523ebacd\" id=\"44\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cubic Curve Painter\" factory=\"cb30d291 47e146a3 b5167d0f 6f56bd61\" id=\"45\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Curve Painter\" factory=\"86705b44 ef534dc4 86d9fc7a 8709ec59\" id=\"46\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bilinear Patch Painter\" factory=\"f172b866 fce74aa8 a9e792ff 630653f3\" id=\"47\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bicubic Patch Painter\" factory=\"e058ab07 44384acd ba321d58 cdb3ef25\" id=\"48\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Patch Painter\" factory=\"8881a190 9d1c4e6f 8b8c0523 2dc43fda\" id=\"49\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bezier Triangle Patch Painter\" factory=\"8d38bda1 df47e212 1e06bfb8 a8f440c5\" id=\"50\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Blobby Point Painter\" factory=\"06148329 b2264760 84b25aab f8401c63\" id=\"51\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Normal Painter\" factory=\"02d092ca 84405ff6 4fe806a9 ab886cb1\" id=\"52\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Orientation Painter\" factory=\"7bc1ee5f 45802906 323984bf cbe858d6\" id=\"53\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cone Painter\" factory=\"ae8f0e12 33403c10 04e4998d 17a8ec8c\" id=\"54\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cylinder Painter\" factory=\"311d3fbd 6a46e7b0 ccf9af8e f2daf44a\" id=\"55\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Disk Painter\" factory=\"e30f4079 8a4a030f 5ce166b6 77f324b4\" id=\"56\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Hyperboloid Painter\" factory=\"8fc78171 3e49ff1a a4b6e69d aa8fafa3\" id=\"57\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Paraboloid Painter\" factory=\"a4e66aa9 c34a22ca c5d3b19e 83c5d0f4\" id=\"58\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Sphere Painter\" factory=\"e22923fa 5146fa44 0b6ff7b2 3f71ad6e\" id=\"59\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Teapot Painter\" factory=\"aa87fdcc fc47c821 87d74dad f1f9f833\" id=\"60\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Torus Painter\" factory=\"271118dd 2a47903b f36b96b8 f6916c27\" id=\"61\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyGrid\" factory=\"acb3b4f8 5cd6471c aed72686 c576987c\" id=\"62\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">31</property>\n\t\t\t\t\t<property name=\"columns\">1</property>\n\t\t\t\t\t<property name=\"rows\">1</property>\n\t\t\t\t\t<property name=\"width\">100</property>\n\t\t\t\t\t<property name=\"height\">100</property>\n\t\t\t\t\t<property name=\"orientation\">+z</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyGrid Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"35\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">37</property>\n\t\t\t\t\t<property name=\"ri_painter\">8</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"QuadricLogo\" factory=\"efc80ecb 9340c5b0 0061109e c97591a3\" id=\"63\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">31</property>\n\t\t\t\t\t<property name=\"radius\">10</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"QuadricLogo Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"36\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">37</property>\n\t\t\t\t\t<property name=\"ri_painter\">8</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Move QuadricLogo Instance\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"64\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -10.372150031167706 0 1 0 0 0 0 1 12.181691980739636 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyToBilinear\" factory=\"e99f3672 6e85457d 9ce1f9dc 6bb71691\" id=\"65\"/>\n\t\t</nodes>\n\t\t<dependencies>\n\t\t\t<dependency from_node=\"30\" from_property=\"output_matrix\" to_node=\"29\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"65\" from_property=\"output_mesh\" to_node=\"35\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"64\" from_property=\"output_matrix\" to_node=\"36\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"63\" from_property=\"output_mesh\" to_node=\"36\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"7\" from_property=\"output_matrix\" to_node=\"6\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"62\" from_property=\"output_mesh\" to_node=\"65\" to_property=\"input_mesh\"/>\n\t\t</dependencies>\n\t</document>\n</k3dml>\n\n"
  },
  {
    "path": "tests/shaders/volume_shader_test.k3d",
    "content": "<?xml version=\"1.0\" ?>\n<k3dml package=\"k3d\" version=\"0.8.0.1\" host=\"Linux-2.6.31-14-generic;i686\">\n\t<document>\n\t\t<nodes>\n\t\t\t<node name=\"Axes\" factory=\"00000001 00000000 00000000 00000001\" id=\"2\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"axes\">true</property>\n\t\t\t\t\t<property name=\"xyplane\">true</property>\n\t\t\t\t\t<property name=\"yzplane\">false</property>\n\t\t\t\t\t<property name=\"xzplane\">false</property>\n\t\t\t\t\t<property name=\"gridsize\">2</property>\n\t\t\t\t\t<property name=\"gridcount\">5</property>\n\t\t\t\t\t<property name=\"xcolor\">1 0 0</property>\n\t\t\t\t\t<property name=\"ycolor\">0 0.69999999999999996 0</property>\n\t\t\t\t\t<property name=\"zcolor\">0 0 0.69999999999999996</property>\n\t\t\t\t\t<property name=\"gridcolor\">0.40000000000000002 0.40000000000000002 0.40000000000000002</property>\n\t\t\t\t\t<property name=\"font\" reference=\"relative\" relative_path=\"fonts/Vera.ttf\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"font_size\">12</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Engine\" factory=\"0059ba47 7bf740f3 93fb523d 5899f22c\" id=\"3\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"point_size\">4</property>\n\t\t\t\t\t<property name=\"background_color\">0.80000000000000004 0.80000000000000004 0.80000000000000004</property>\n\t\t\t\t\t<property name=\"fog\">false</property>\n\t\t\t\t\t<property name=\"fog_near\">0</property>\n\t\t\t\t\t<property name=\"fog_far\">100</property>\n\t\t\t\t\t<property name=\"headlight\">true</property>\n\t\t\t\t\t<property name=\"show_lights\">false</property>\n\t\t\t\t\t<property name=\"draw_two_sided\">true</property>\n\t\t\t\t\t<property name=\"draw_safe_zone\">false</property>\n\t\t\t\t\t<property name=\"draw_aimpoint\">true</property>\n\t\t\t\t\t<property name=\"draw_crop_window\">true</property>\n\t\t\t\t\t<property name=\"draw_frustum\">true</property>\n\t\t\t\t\t<property name=\"node_selection\">4</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TimeSource\" factory=\"1978f1f7 4a864c99 8caf7cfc d2591baf\" id=\"5\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"start_time\">0</property>\n\t\t\t\t\t<property name=\"end_time\">4</property>\n\t\t\t\t\t<property name=\"frame_rate\">30</property>\n\t\t\t\t\t<property name=\"time\">0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera\" factory=\"45ce1872 af184b6d b391e136 0dcfe8b5\" id=\"6\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"navigation_target\">6</property>\n\t\t\t\t\t<property name=\"world_target\">-9.7944083326770226 -6.1011018408262396 -3.0398699616882157</property>\n\t\t\t\t\t<property name=\"aspect_ratio\"/>\n\t\t\t\t\t<property name=\"show_projection\">false</property>\n\t\t\t\t\t<property name=\"orthographic\">false</property>\n\t\t\t\t\t<property name=\"left\">-0.6666666666666666</property>\n\t\t\t\t\t<property name=\"right\">0.6666666666666666</property>\n\t\t\t\t\t<property name=\"top\">0.5</property>\n\t\t\t\t\t<property name=\"bottom\">-0.5</property>\n\t\t\t\t\t<property name=\"near\">1</property>\n\t\t\t\t\t<property name=\"far\">1000</property>\n\t\t\t\t\t<property name=\"crop_window_left\">0</property>\n\t\t\t\t\t<property name=\"crop_window_right\">1</property>\n\t\t\t\t\t<property name=\"crop_window_top\">0</property>\n\t\t\t\t\t<property name=\"crop_window_bottom\">1</property>\n\t\t\t\t\t<property name=\"show_reference_plane\">false</property>\n\t\t\t\t\t<property name=\"reference_plane\">0</property>\n\t\t\t\t\t<property name=\"reference_plane_color\">0 0 0.69999999999999996</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Camera Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"7\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">0.82162454774790217 0.061258379487393044 0.56672790074305845 -32.136011725185696 0.57002903657450243 -0.088296183374362791 -0.81686637919764171 26.101485405681686 -5.0888079286461754e-15 0.99420882863918458 -0.10746536677414056 1.1966403631963338 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Default Painter\" factory=\"243cba5a 13f342fa 8f1a19cd faf34169\" id=\"8\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"particles\" label=\"Particles\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">9</property>\n\t\t\t\t\t<property name=\"polyhedra\" label=\"Polyhedra\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">10</property>\n\t\t\t\t\t<property name=\"subdivision_surfaces\" label=\"Subdivision Surfaces\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">11</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">12</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">13</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">14</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">15</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">16</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">17</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">18</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">19</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">20</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">21</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">22</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">23</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">24</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::ri::imesh_painter*\" user_property=\"generic\">25</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderMan Particle Painter\" factory=\"06fab90b 2f034d69 b4a1cb9f b9864144\" id=\"9\"/>\n\t\t\t<node name=\"RenderMan Polyhedron Painter\" factory=\"0771ea79 6c8c4c6d 8bab8c83 42fc73e9\" id=\"10\"/>\n\t\t\t<node name=\"RenderMan Subdivision Surface Painter\" factory=\"4d6fae39 723e4ed3 bc5735c5 3b75edc0\" id=\"11\"/>\n\t\t\t<node name=\"RenderMan Linear Curve Painter\" factory=\"f8b19206 a0ae4bd1 b3548a15 1209469e\" id=\"12\"/>\n\t\t\t<node name=\"RenderMan Cubic Curve Painter\" factory=\"8c5be7c4 0e8d43c5 a1daace4 a79275d7\" id=\"13\"/>\n\t\t\t<node name=\"RenderMan Bilinear Patch Painter\" factory=\"3f51b275 5a664903 96ed9168 503e30f0\" id=\"14\"/>\n\t\t\t<node name=\"RenderMan Bicubic Patch Painter\" factory=\"64dfefde eedc4047 b59fc8f6 972a9b86\" id=\"15\"/>\n\t\t\t<node name=\"RenderMan NURBS Patch Painter\" factory=\"120d87f0 fe05419f ae2d14ce ea9c32b4\" id=\"16\"/>\n\t\t\t<node name=\"RenderMan Blobby Painter\" factory=\"0221462c c3d44a12 97b39425 29774d3f\" id=\"17\"/>\n\t\t\t<node name=\"RenderMan Cone Painter\" factory=\"6612c455 774ed5d4 5ff0c495 6d920b8e\" id=\"18\"/>\n\t\t\t<node name=\"RenderMan Cylinder Painter\" factory=\"85a1d5ac 224449cf 202911a1 a2434ee8\" id=\"19\"/>\n\t\t\t<node name=\"RenderMan Disk Painter\" factory=\"6c92b34f 57480914 1708dca6 cc8651cc\" id=\"20\"/>\n\t\t\t<node name=\"RenderMan Hyperboloid Painter\" factory=\"8f5ac6bd f84bfac3 8585f08b 953e3df1\" id=\"21\"/>\n\t\t\t<node name=\"RenderMan Paraboloid Painter\" factory=\"49dafd22 d34c22e6 cb8e30b3 0f74f5ef\" id=\"22\"/>\n\t\t\t<node name=\"RenderMan Sphere Painter\" factory=\"a07012c4 ce4b11f4 92d5f48d 8f3751c0\" id=\"23\"/>\n\t\t\t<node name=\"RenderMan Teapot Painter\" factory=\"cf54aa9b 9c4e886c a8cf2fa2 470d44ed\" id=\"24\"/>\n\t\t\t<node name=\"RenderMan Torus Painter\" factory=\"d3865bdb 69469c71 2cc55a8b 420de184\" id=\"25\"/>\n\t\t\t<node name=\"Surface Shader\" factory=\"b553a3bd d1044c6e b3f21e07 87132c31\" id=\"26\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/surface/k3d_easysurface.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"Kd\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0.8</property>\n\t\t\t\t\t<property name=\"Ka\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">0.2</property>\n\t\t\t\t\t<property name=\"falloff\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManMaterial\" factory=\"00000001 00000000 00000000 00000024\" id=\"27\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"surface_shader\">26</property>\n\t\t\t\t\t<property name=\"displacement_shader\">0</property>\n\t\t\t\t\t<property name=\"atmosphere_shader\">28</property>\n\t\t\t\t\t<property name=\"interior_shader\">0</property>\n\t\t\t\t\t<property name=\"exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"matte\">false</property>\n\t\t\t\t\t<property name=\"displacement_bounds\">1</property>\n\t\t\t\t\t<property name=\"color\">1 1 1</property>\n\t\t\t\t\t<property name=\"opacity\">1 1 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Shader\" factory=\"830e867b 7bc94c6c 8d5087ee 8aa35db2\" id=\"29\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/light/k3d_pointlight.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"intensity\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">3000</property>\n\t\t\t\t\t<property name=\"lightcolor\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">1 1 1</property>\n\t\t\t\t\t<property name=\"from\" label=\"\" description=\"\" type=\"k3d::point3\" user_property=\"generic\">0 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light\" factory=\"00000001 00000000 00000000 0000001d\" id=\"30\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"shader\">29</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Light Transformation\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"31\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 -20 0 1 0 20 0 0 1 30 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Material\" factory=\"00000001 00000002 00000003 00000004\" id=\"32\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"renderman_material\" label=\"RenderMan Material\" description=\"\" type=\"k3d::imaterial*\" user_property=\"generic\">27</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Aqsis\" factory=\"8d430069 63404829 053361ad fc6abda6\" id=\"33\"/>\n\t\t\t<node name=\"Pixie\" factory=\"7a1d773b a9472dae a80223ab 59d62f9a\" id=\"34\"/>\n\t\t\t<node name=\"RenderMan Engine\" factory=\"0dc5e733 fa684e05 86a3865f 42f7a99d\" id=\"35\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"visible_nodes\"> 36 37</property>\n\t\t\t\t\t<property name=\"enabled_lights\"> 30</property>\n\t\t\t\t\t<property name=\"render_engine\">33</property>\n\t\t\t\t\t<property name=\"resolution\"/>\n\t\t\t\t\t<property name=\"hider\"/>\n\t\t\t\t\t<property name=\"pixel_width\">320</property>\n\t\t\t\t\t<property name=\"pixel_height\">240</property>\n\t\t\t\t\t<property name=\"pixel_aspect_ratio\">1</property>\n\t\t\t\t\t<property name=\"default_atmosphere_shader\">0</property>\n\t\t\t\t\t<property name=\"default_interior_shader\">0</property>\n\t\t\t\t\t<property name=\"default_exterior_shader\">0</property>\n\t\t\t\t\t<property name=\"imager_shader\">0</property>\n\t\t\t\t\t<property name=\"bucket_width\">16</property>\n\t\t\t\t\t<property name=\"bucket_height\">16</property>\n\t\t\t\t\t<property name=\"grid_size\">256</property>\n\t\t\t\t\t<property name=\"eye_splits\">10</property>\n\t\t\t\t\t<property name=\"texture_memory\">1024</property>\n\t\t\t\t\t<property name=\"render_alpha\">false</property>\n\t\t\t\t\t<property name=\"pixel_xsamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_ysamples\">3</property>\n\t\t\t\t\t<property name=\"pixel_filter\">gaussian</property>\n\t\t\t\t\t<property name=\"pixel_filter_width\">2</property>\n\t\t\t\t\t<property name=\"pixel_filter_height\">2</property>\n\t\t\t\t\t<property name=\"exposure\">1</property>\n\t\t\t\t\t<property name=\"gamma\">1</property>\n\t\t\t\t\t<property name=\"dof\">false</property>\n\t\t\t\t\t<property name=\"fstop\">0.3</property>\n\t\t\t\t\t<property name=\"focal_length\">1.6</property>\n\t\t\t\t\t<property name=\"focus_plane\">30</property>\n\t\t\t\t\t<property name=\"shading_rate\">1</property>\n\t\t\t\t\t<property name=\"shading_interpolation\">constant</property>\n\t\t\t\t\t<property name=\"two_sided\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"render_motion_blur\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Node Selection\" factory=\"5d305922 d2442343 077956b6 b112b9b3\" id=\"4\">\n\t\t\t\t<metadata>\n\t\t\t\t\t<pair name=\"ngui:unique_node\">node_selection</pair>\n\t\t\t\t</metadata>\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"selection_weights\"> 38 1 39 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Default Painter\" factory=\"6bc7d8a1 bbe7491f a2405d97 8b136c41\" id=\"40\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"points\" label=\"Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">41</property>\n\t\t\t\t\t<property name=\"edges\" label=\"Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">42</property>\n\t\t\t\t\t<property name=\"faces\" label=\"Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">43</property>\n\t\t\t\t\t<property name=\"sds_points\" label=\"SDS Points\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">44</property>\n\t\t\t\t\t<property name=\"sds_edges\" label=\"SDS Edges\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">45</property>\n\t\t\t\t\t<property name=\"sds_faces\" label=\"SDS Faces\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">46</property>\n\t\t\t\t\t<property name=\"linear_curves\" label=\"Linear Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">47</property>\n\t\t\t\t\t<property name=\"cubic_curves\" label=\"Cubic Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">48</property>\n\t\t\t\t\t<property name=\"nurbs_curves\" label=\"NURBS Curves\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">49</property>\n\t\t\t\t\t<property name=\"bilinear_patches\" label=\"Bilinear Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">50</property>\n\t\t\t\t\t<property name=\"bicubic_patches\" label=\"Bicubic Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">51</property>\n\t\t\t\t\t<property name=\"nurbs_patches\" label=\"NURBS Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">52</property>\n\t\t\t\t\t<property name=\"bezier_triangle_patches\" label=\"Bezier Triangle Patches\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">53</property>\n\t\t\t\t\t<property name=\"blobbies\" label=\"Blobbies\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">54</property>\n\t\t\t\t\t<property name=\"face_normals\" label=\"Face Normals\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">55</property>\n\t\t\t\t\t<property name=\"face_orientation\" label=\"Face Orientation\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">56</property>\n\t\t\t\t\t<property name=\"cones\" label=\"Cones\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">57</property>\n\t\t\t\t\t<property name=\"cylinders\" label=\"Cylinders\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">58</property>\n\t\t\t\t\t<property name=\"disks\" label=\"Disks\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">59</property>\n\t\t\t\t\t<property name=\"hyperboloids\" label=\"Hyperboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">60</property>\n\t\t\t\t\t<property name=\"paraboloids\" label=\"Paraboloids\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">61</property>\n\t\t\t\t\t<property name=\"spheres\" label=\"Spheres\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">62</property>\n\t\t\t\t\t<property name=\"teapots\" label=\"Teapots\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">63</property>\n\t\t\t\t\t<property name=\"tori\" label=\"Tori\" description=\"\" type=\"k3d::gl::imesh_painter*\" user_property=\"generic\">64</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Point Painter\" factory=\"7e376143 b640c3f4 288543a0 57f83514\" id=\"41\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Edge Painter\" factory=\"172c1208 d24430f5 63f70388 1945866e\" id=\"42\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Painter\" factory=\"7e6e8354 604f05ae 1d4d658b 96538240\" id=\"43\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Point Painter\" factory=\"46db8236 a1408c58 d829ceba ffe78fca\" id=\"44\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Edge Painter\" factory=\"6c827fec d74ffc1c 79ba768f fc8fa4d5\" id=\"45\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0 0 0</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">1 1 1</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"SDS Face Painter\" factory=\"9d4043c8 864fe71b 38706d85 8b60af0c\" id=\"46\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"unselected_mesh_color\">0.20000000000000001 0.20000000000000001 0.20000000000000001</property>\n\t\t\t\t\t<property name=\"child_mesh_color\">0.5 0.5 0.5</property>\n\t\t\t\t\t<property name=\"selected_mesh_color\">0.59999999999999998 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t\t<property name=\"selected_component_color\">1 0 0</property>\n\t\t\t\t\t<property name=\"levels\">2</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Linear Curve Painter\" factory=\"6acd1d8e 954f4b3a bce4c296 523ebacd\" id=\"47\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cubic Curve Painter\" factory=\"cb30d291 47e146a3 b5167d0f 6f56bd61\" id=\"48\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Curve Painter\" factory=\"86705b44 ef534dc4 86d9fc7a 8709ec59\" id=\"49\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bilinear Patch Painter\" factory=\"f172b866 fce74aa8 a9e792ff 630653f3\" id=\"50\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bicubic Patch Painter\" factory=\"e058ab07 44384acd ba321d58 cdb3ef25\" id=\"51\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL NURBS Patch Painter\" factory=\"8881a190 9d1c4e6f 8b8c0523 2dc43fda\" id=\"52\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Bezier Triangle Patch Painter\" factory=\"8d38bda1 df47e212 1e06bfb8 a8f440c5\" id=\"53\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Blobby Point Painter\" factory=\"06148329 b2264760 84b25aab f8401c63\" id=\"54\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Normal Painter\" factory=\"02d092ca 84405ff6 4fe806a9 ab886cb1\" id=\"55\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Face Orientation Painter\" factory=\"7bc1ee5f 45802906 323984bf cbe858d6\" id=\"56\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t\t<property name=\"draw_selected\">true</property>\n\t\t\t\t\t<property name=\"draw_unselected\">false</property>\n\t\t\t\t\t<property name=\"selected_color\">0 1 1</property>\n\t\t\t\t\t<property name=\"unselected_color\">0 0.59999999999999998 0.59999999999999998</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cone Painter\" factory=\"ae8f0e12 33403c10 04e4998d 17a8ec8c\" id=\"57\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Cylinder Painter\" factory=\"311d3fbd 6a46e7b0 ccf9af8e f2daf44a\" id=\"58\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Disk Painter\" factory=\"e30f4079 8a4a030f 5ce166b6 77f324b4\" id=\"59\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Hyperboloid Painter\" factory=\"8fc78171 3e49ff1a a4b6e69d aa8fafa3\" id=\"60\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Paraboloid Painter\" factory=\"a4e66aa9 c34a22ca c5d3b19e 83c5d0f4\" id=\"61\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Sphere Painter\" factory=\"e22923fa 5146fa44 0b6ff7b2 3f71ad6e\" id=\"62\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Teapot Painter\" factory=\"aa87fdcc fc47c821 87d74dad f1f9f833\" id=\"63\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"GL Torus Painter\" factory=\"271118dd 2a47903b f36b96b8 f6916c27\" id=\"64\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"enabled\">true</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"QuadricLogo\" factory=\"efc80ecb 9340c5b0 0061109e c97591a3\" id=\"65\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">32</property>\n\t\t\t\t\t<property name=\"radius\">10</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManArray2D\" factory=\"5a7881eb f8e14075 977fe1fb 2036f517\" id=\"36\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"material\">32</property>\n\t\t\t\t\t<property name=\"source\">0</property>\n\t\t\t\t\t<property name=\"layout\">66</property>\n\t\t\t\t\t<property name=\"count1\">3</property>\n\t\t\t\t\t<property name=\"count2\">50</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TranslateArray2D\" factory=\"a2d1cd67 901e411b 9c624ca6 a02b6a5a\" id=\"66\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"layout\">0</property>\n\t\t\t\t\t<property name=\"offset1\">0 0 10</property>\n\t\t\t\t\t<property name=\"offset2\">0 -20 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"RenderManVolumeShader\" factory=\"fd07a255 9bb84841 87632abe 3ceb9fc7\" id=\"28\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"shader_path\" reference=\"relative\" relative_path=\"shaders/volume/k3d_fog.sl\">\n\t\t\t\t\t\t<root>$K3D_SHARE_PATH</root>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"distance\" label=\"\" description=\"\" type=\"k3d::double_t\" user_property=\"generic\">100</property>\n\t\t\t\t\t<property name=\"background\" label=\"\" description=\"\" type=\"k3d::color\" user_property=\"generic\">0 0 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyCube\" factory=\"7ec966d1 d78a445c 8806b8a3 5593f241\" id=\"38\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"material\">32</property>\n\t\t\t\t\t<property name=\"columns\">1</property>\n\t\t\t\t\t<property name=\"rows\">1</property>\n\t\t\t\t\t<property name=\"slices\">1</property>\n\t\t\t\t\t<property name=\"width\">5</property>\n\t\t\t\t\t<property name=\"height\">4.999999999999999</property>\n\t\t\t\t\t<property name=\"depth\">31.03800000000001</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"PolyCube Instance\" factory=\"2c1d60a6 863541a1 bd649bd1 1ea8ae24\" id=\"37\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"parent\">0</property>\n\t\t\t\t\t<property name=\"mesh_selection\">\n\t\t\t\t\t\t<set/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"render_final\">true</property>\n\t\t\t\t\t<property name=\"render_shadows\">true</property>\n\t\t\t\t\t<property name=\"motion_blur\">false</property>\n\t\t\t\t\t<property name=\"viewport_visible\">true</property>\n\t\t\t\t\t<property name=\"gl_painter\">40</property>\n\t\t\t\t\t<property name=\"ri_painter\">8</property>\n\t\t\t\t\t<property name=\"show_component_selection\">false</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"MeshArray2D\" factory=\"4818d995 f8664006 ba02ded4 8cb9defb\" id=\"67\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"layout\">39</property>\n\t\t\t\t\t<property name=\"count1\">1</property>\n\t\t\t\t\t<property name=\"count2\">100</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"TranslateArray2D 2\" factory=\"a2d1cd67 901e411b 9c624ca6 a02b6a5a\" id=\"39\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"layout\">0</property>\n\t\t\t\t\t<property name=\"offset1\">0 0 7</property>\n\t\t\t\t\t<property name=\"offset2\">0 -10 0</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t\t<node name=\"Move PolyCube Instance\" factory=\"6ea85710 90da4d35 acec30ee a6aacb9d\" id=\"68\">\n\t\t\t\t<properties>\n\t\t\t\t\t<property name=\"input_matrix\">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</property>\n\t\t\t\t\t<property name=\"matrix\">1 0 0 0 0 1 0 8.1858976323968129 0 0 1 -4.4091063975797704 0 0 0 1</property>\n\t\t\t\t</properties>\n\t\t\t</node>\n\t\t</nodes>\n\t\t<dependencies>\n\t\t\t<dependency from_node=\"7\" from_property=\"output_matrix\" to_node=\"6\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"68\" from_property=\"output_matrix\" to_node=\"37\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"67\" from_property=\"output_mesh\" to_node=\"37\" to_property=\"input_mesh\"/>\n\t\t\t<dependency from_node=\"31\" from_property=\"output_matrix\" to_node=\"30\" to_property=\"input_matrix\"/>\n\t\t\t<dependency from_node=\"38\" from_property=\"output_mesh\" to_node=\"67\" to_property=\"input_mesh\"/>\n\t\t</dependencies>\n\t</document>\n</k3dml>\n\n"
  },
  {
    "path": "tests/string/CMakeLists.txt",
    "content": "K3D_TEST(string.source.StringSourceScript\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/source.StringSourceScript.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS string source StringSourceScript)\n\n"
  },
  {
    "path": "tests/string/source.StringSourceScript.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndoc = k3d.new_document()\nsource = k3d.plugin.create(\"StringSourceScript\", doc)\n\nif source.output_string != \"K-3D\":\n\traise \"unexpected output_string: \" + source.output_string\n\n"
  },
  {
    "path": "tests/testing/CMakeLists.txt",
    "content": "K3D_TEST(testing.measurements\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/measurements.py\n\tLABELS testing)\n\nK3D_TEST(testing.detect.language.failure\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/detect_language_failure\n\tLABELS testing\n\tXFAIL)\n\nK3D_TEST(testing.detect.python\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/detect_python.py\n\tLABELS testing)\n\nK3D_TEST(testing.detect.python.failure\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/detect_python_failure.py\n\tLABELS testing XFAIL)\n\nK3D_TEST(testing.detect.python.exception\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/detect_python_exception.py\n\tLABELS testing XFAIL)\n\nK3D_TEST(testing.PipelineProfiler\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/PipelineProfiler.py\n\tREQUIRES K3D_ENABLE_PROFILING\n\tLABELS testing)\n\n"
  },
  {
    "path": "tests/testing/PipelineProfiler.py",
    "content": "#python\n\nimport k3d\n\n# Setup a simple pipeline ...\ndoc = k3d.new_document()\nsource = k3d.plugin.create(\"PolyCube\", doc)\nmodifier = k3d.plugin.create(\"ScalePoints\", doc)\nk3d.property.connect(doc, source.get_property(\"output_mesh\"), modifier.get_property(\"input_mesh\"))\n\n# Create a profiler ...\nprofiler = k3d.plugin.create(\"PipelineProfiler\", doc)\n\n# At this point the profiler should be empty ...\nif len(profiler.records) != 0:\n\traise Exception(\"expected zero profile records\")\n\n# Force execution of the pipeline ...\nmodifier.output_mesh\n\n# At this point we expect the profiler to contain two records (one for the source and one for the modifier) ...\nif len(profiler.records) != 2:\n\traise Exception(\"expected two profile records\")\n\n# See what we've got ...\nprint profiler.records\n\n"
  },
  {
    "path": "tests/testing/detect_language_failure",
    "content": "\n// This script deliberately *doesn't* have a magic cookie - it should fail to execute\n\n"
  },
  {
    "path": "tests/testing/detect_python.py",
    "content": "#python\n\n# This script doesn't do anything at all, but it should still be properly recognized and executed as python\n\n"
  },
  {
    "path": "tests/testing/detect_python_exception.py",
    "content": "#python\n\n# Tests to ensure that an exception explicitly raised in a Python script\n# is recognized by the test framework as a failure\n\nraise Exception\n\n"
  },
  {
    "path": "tests/testing/detect_python_failure.py",
    "content": "#python\n\n# Tests to ensure that a non-existent Python method is recognized by the test framework as a failure\nNonExistentMethod();\n\n"
  },
  {
    "path": "tests/testing/measurements.py",
    "content": "#python\n\nimport sys\nimport testing\n\n# Floating-point measurement\nprint \"\"\"<DartMeasurement name=\"Float\" type=\"numeric/float\">0.12</DartMeasurement>\"\"\"\n\n# Integer measurement\nprint \"\"\"<DartMeasurement name=\"Integer\" type=\"numeric/integer\">12</DartMeasurement>\"\"\"\n\n# String measurement\nprint \"\"\"<DartMeasurement name=\"String\" type=\"text/string\">A simple message</DartMeasurement>\"\"\"\n\n# Longer text measurement\nprint \"\"\"<DartMeasurement name=\"Text\" type=\"text/text\">A longer message</DartMeasurement>\"\"\"\n\n# An HTML table measurement\nprint \"\"\"<DartMeasurement name=\"HTML Table\" type=\"text/html\"><![CDATA[\n<table>\n<tr><th>Time</th><th>Value 1</th><th>Value 2</th></tr>\n<tr><td>1</td><td>1.2</td><td>1.6</td></tr>\n<tr><td>2</td><td>1.3</td><td>2.4</td></tr>\n<tr><td>3</td><td>1.4</td><td>4.5</td></tr>\n<tr><td>4</td><td>1.5</td><td>8.9</td></tr>\n</table>\n]]></DartMeasurement>\"\"\"\n\n# An HTML Google Chart measurement\nprint \"\"\"<DartMeasurement name=\"HTML Chart\" type=\"text/html\"><![CDATA[\n<img src=\"http://chart.apis.google.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World\">\n]]></DartMeasurement>\"\"\"\n\n# An arbitrary XML measurement\nprint \"\"\"<DartMeasurement name=\"XML\" type=\"text/xml\"><![CDATA[\n<foo><bar a=\"b\"><baz c=\"d\"/></bar></foo>\n]]></DartMeasurement>\"\"\"\n\n# JPEG image measurement\nprint \"\"\"<DartMeasurementFile name=\"JPEG Image\" type=\"image/jpeg\">\"\"\" + testing.source_path() + \"\"\"/bitmaps/test_rgb_8.jpg</DartMeasurementFile>\"\"\"\n\n# PNG image measurement\nprint \"\"\"<DartMeasurementFile name=\"PNG Image\" type=\"image/png\">\"\"\" + testing.source_path() + \"\"\"/bitmaps/test_rgb_8.png</DartMeasurementFile>\"\"\"\n\nsys.stdout.flush()\n\n"
  },
  {
    "path": "tests/testing.py",
    "content": "#python\n\nimport k3d\nimport difflib\nimport os\nimport platform\nimport sys\nimport time\n\nclass timer:\n\tdef __init__(self):\n\t\tif sys.platform == \"win32\":\n\t\t\tself.current_time = time.clock\n\t\telse:\n\t\t\tself.current_time = time.time\n\n\t\tself.start_time = self.current_time()\n\n\tdef restart(self):\n\t\tself.start_time = self.current_time()\n\n\tdef elapsed(self):\n\t\treturn self.current_time() - self.start_time\n\ndef source_path():\n\treturn os.environ[\"K3D_TEST_SOURCE_PATH\"]\n\ndef binary_path():\n\treturn os.environ[\"K3D_TEST_BINARY_PATH\"]\n\ndef benchmark_path():\n\tb_path = binary_path() + '/benchmarks'\n\ttry:\n\t\tos.listdir(b_path)\n\texcept:\n\t\tos.makedirs(b_path);\n\t\n\treturn b_path\n\ndef create_camera(document):\n\tcamera_view = k3d.plugin.create(\"ViewMatrix\", document)\n\tcamera_view.position = k3d.translate3(k3d.vector3(-10, -15, 10))\n\tcamera_view.look = k3d.identity3()\n\tcamera_view.up = k3d.translate3(k3d.vector3(0, 0, 20))\n\t\n\tcamera = k3d.plugin.create(\"Camera\", document)\n\tk3d.property.connect(document, camera_view.get_property(\"output_matrix\"), camera.get_property(\"input_matrix\"))\n\n\treturn camera\n\ndef create_opengl_engine(document):\n\trender_engine = k3d.plugin.create(\"OpenGLEngine\", document)\n\trender_engine.draw_aimpoint = False\n\trender_engine.draw_crop_window = False\n\trender_engine.draw_frustum = False\n\n\treturn render_engine\n\ndef dart_measurement(name, value):\n\tif type(value).__name__ == \"str\":\n\t\tvalue_type = \"text/string\"\n\telif type(value).__name__ == \"bool\":\n\t\tvalue_type = \"text/string\"\n\telif type(value).__name__ == \"int\":\n\t\tvalue_type = \"numeric/integer\"\n\telif type(value).__name__ == \"long\":\n\t\tvalue_type = \"numeric/integer\"\n\telif type(value).__name__ == \"float\":\n\t\tvalue_type = \"numeric/float\"\n\telse:\n\t\traise Exception(\"Unknown type: \" + repr(value))\n\n\tprint \"<DartMeasurement name=\\\"\" + name + \"\\\" type=\\\"\" + value_type + \"\\\">\" + str(value) + \"</DartMeasurement>\"\n\tsys.stdout.flush()\n\n#####################################################################################33\n# Bitmap-related testing\n\ndef setup_bitmap_test(nodes):\n\tif len(nodes) < 1:\n\t\traise Exception(\"Bitmap test requires at least one node.\")\n\n\tclass result_object:\n\t\tpass\n\n\tresult = result_object\n\tresult.document = k3d.new_document()\n\tresult.nodes = [] \n\n\tfor node in nodes:\n\t\tresult.nodes.append(k3d.plugin.create(node, result.document))\n\t\tif len(result.nodes) > 1:\n\t\t\tk3d.property.connect(result.document, result.nodes[-2].get_property(\"output_bitmap\"), result.nodes[-1].get_property(\"input_bitmap\"))\n\n\tresult.source = result.nodes[0]\n\n\tif len(nodes) == 3:\n\t\tresult.modifier = result.nodes[1]\n\n\tif len(nodes) > 1:\n\t\tresult.sink = result.nodes[-1]\n\t\n\treturn result\n\ndef setup_bitmap_source_test(source_name):\n\tresult = setup_bitmap_test([source_name])\n\treturn result\n\ndef setup_bitmap_reader_test(reader_name, source_file):\n\tresult = setup_bitmap_test([reader_name])\n\tresult.reader = result.source\n\tresult.reader.file = k3d.filesystem.generic_path(source_path() + \"/bitmaps/\" + source_file)\n\treturn result\n\ndef setup_bitmap_modifier_test(source_name, modifier_name):\n\tresult = setup_bitmap_test([source_name, modifier_name])\n\tresult.modifier = result.sink\n\treturn result\n\ndef require_bitmap_size(bitmap, width, height):\n\tdart_measurement(\"bitmap_width\", bitmap.width())\n\tdart_measurement(\"bitmap_height\", bitmap.height())\n\tdart_measurement(\"expected_width\", width)\n\tdart_measurement(\"expected_height\", height)\n\t\n\tif bitmap.width() != width or bitmap.height() != height:\n\t\traise \"bitmap dimensions incorrect\"\n\ndef require_similar_bitmap(document, image_property, image_name, threshold):\n\toutput_file = k3d.filesystem.generic_path(binary_path() + \"/bitmaps/\" + image_name + \".reference.png\")\n\treference_file = k3d.filesystem.generic_path(source_path() + \"/bitmaps/\" + image_name + \".reference.png\")\n\tdifference_file = k3d.filesystem.generic_path(binary_path() + \"/bitmaps/differences/\" + image_name + \".png\")\n\n\treference = k3d.plugin.create(\"PNGBitmapReader\", document)\n\treference.file = reference_file\n\treference_property = reference.get_property(\"output_bitmap\")\n\n\tdifference = k3d.plugin.create(\"BitmapPerceptualDifference\", document)\n\tdifference.field_of_view = 10.0\n\tdifference.luminance = 100\n\tdifference_property = difference.get_property(\"output_bitmap\")\n\tk3d.property.connect(document, image_property, difference.get_property(\"input_a\"))\n\tk3d.property.connect(document, reference_property, difference.get_property(\"input_b\"))\n\n\timage_writer = k3d.plugin.create(\"PNGBitmapWriter\", document)\n\timage_writer.file = output_file\n\tk3d.property.connect(document, image_property, image_writer.get_property(\"input_bitmap\"))\n\n\tdifference_writer = k3d.plugin.create(\"PNGBitmapWriter\", document)\n\tdifference_writer.file= difference_file\n\tk3d.property.connect(document, difference_property, difference_writer.get_property(\"input_bitmap\"))\n\n\tpixel_count = image_property.pipeline_value().width() * image_property.pipeline_value().height()\n\tpixel_difference = difference.difference\n\tdifference_measurement = float(pixel_difference) / float(pixel_count)\n\n\tprint \"\"\"<DartMeasurement name=\"Source Width\" type=\"numeric/float\">\"\"\" + str(image_property.pipeline_value().width()) + \"\"\"</DartMeasurement>\"\"\"\n\tprint \"\"\"<DartMeasurement name=\"Source Height\" type=\"numeric/float\">\"\"\" + str(image_property.pipeline_value().height()) + \"\"\"</DartMeasurement>\"\"\"\n\tprint \"\"\"<DartMeasurement name=\"Reference Width\" type=\"numeric/float\">\"\"\" + str(reference_property.pipeline_value().width()) + \"\"\"</DartMeasurement>\"\"\"\n\tprint \"\"\"<DartMeasurement name=\"Reference Height\" type=\"numeric/float\">\"\"\" + str(reference_property.pipeline_value().height()) + \"\"\"</DartMeasurement>\"\"\"\n\tprint \"\"\"<DartMeasurement name=\"Difference Width\" type=\"numeric/float\">\"\"\" + str(difference_property.pipeline_value().width()) + \"\"\"</DartMeasurement>\"\"\"\n\tprint \"\"\"<DartMeasurement name=\"Difference Height\" type=\"numeric/float\">\"\"\" + str(difference_property.pipeline_value().height()) + \"\"\"</DartMeasurement>\"\"\"\n\tprint \"\"\"<DartMeasurement name=\"Pixel Difference\" type=\"numeric/float\">\"\"\" + str(pixel_difference) + \"\"\"</DartMeasurement>\"\"\"\n\tprint \"\"\"<DartMeasurement name=\"Pixel Count\" type=\"numeric/float\">\"\"\" + str(pixel_count) + \"\"\"</DartMeasurement>\"\"\"\n\tprint \"\"\"<DartMeasurement name=\"Difference\" type=\"numeric/float\">\"\"\" + str(difference_measurement) + \"\"\"</DartMeasurement>\"\"\"\n\tprint \"\"\"<DartMeasurement name=\"Threshold\" type=\"numeric/float\">\"\"\" + str(threshold) + \"\"\"</DartMeasurement>\"\"\"\n\tprint \"\"\"<DartMeasurementFile name=\"Output Image\" type=\"image/png\">\"\"\" + str(output_file) + \"\"\"</DartMeasurementFile>\"\"\"\n\tprint \"\"\"<DartMeasurementFile name=\"Reference Image\" type=\"image/png\">\"\"\" + str(reference_file) + \"\"\"</DartMeasurementFile>\"\"\"\n\tprint \"\"\"<DartMeasurementFile name=\"Difference Image\" type=\"image/png\">\"\"\" + str(difference_file) + \"\"\"</DartMeasurementFile>\"\"\"\n\tsys.stdout.flush()\n\n\tif not os.path.exists(str(reference_file)):\n\t\traise Exception(\"missing reference file: \" + str(reference_file))\n\n\tif difference_measurement > threshold:\n\t\traise Exception(\"pixel difference exceeds threshold\")\n\n#####################################################################################33\n# Mesh-related testing\n\ndef setup_mesh_test(nodes):\n\tif len(nodes) < 1:\n\t\traise Exception(\"Mesh test requires at least one node.\")\n\n\tclass result_object:\n\t\tpass\n\n\tresult = result_object\n\tresult.document = k3d.new_document()\n\tresult.nodes = [] \n\n\tfor node in nodes:\n\t\tresult.nodes.append(k3d.plugin.create(node, result.document))\n\t\tif len(result.nodes) > 1:\n\t\t\tk3d.property.connect(result.document, result.nodes[-2].get_property(\"output_mesh\"), result.nodes[-1].get_property(\"input_mesh\"))\n\n\tresult.source = result.nodes[0]\n\n\tif len(nodes) == 3:\n\t\tresult.modifier = result.nodes[1]\n\n\tif len(nodes) > 1:\n\t\tresult.sink = result.nodes[-1]\n\t\n\treturn result\n\ndef setup_mesh_source_test(source_name):\n\tresult = setup_mesh_test([source_name])\n\treturn result\n\ndef setup_mesh_reader_test(reader_name, source_file):\n\tresult = setup_mesh_test([reader_name])\n\tresult.reader = result.source\n\tresult.reader.file = k3d.filesystem.generic_path(source_path() + \"/meshes/\" + source_file)\n\tresult.reader.center = False\n\tresult.reader.scale_to_size = False\n\treturn result\n\ndef setup_mesh_modifier_test(source_name, modifier_name):\n\tclass result_object:\n\t\tpass\n\n\tresult = result_object\n\tresult.document = k3d.new_document()\n\tresult.source = k3d.plugin.create(source_name, result.document)\n\tresult.add_index_attributes = k3d.plugin.create(\"AddIndexAttributes\", result.document)\n\tresult.modifier = k3d.plugin.create(modifier_name, result.document)\n\tk3d.property.connect(result.document, result.source.get_property(\"output_mesh\"), result.add_index_attributes.get_property(\"input_mesh\"))\n\tk3d.property.connect(result.document, result.add_index_attributes.get_property(\"output_mesh\"), result.modifier.get_property(\"input_mesh\"))\n\n\treturn result\n\ndef setup_mesh_modifier_test2(source_name, modifier1_name, modifier2_name):\n\tclass result_object:\n\t\tpass\n\n\tresult = result_object\n\tresult.document = k3d.new_document()\n\tresult.source = k3d.plugin.create(source_name, result.document)\n\tresult.add_index_attributes = k3d.plugin.create(\"AddIndexAttributes\", result.document)\n\tresult.modifier1 = k3d.plugin.create(modifier1_name, result.document)\n\tresult.modifier2 = k3d.plugin.create(modifier2_name, result.document)\n\tk3d.property.connect(result.document, result.source.get_property(\"output_mesh\"), result.add_index_attributes.get_property(\"input_mesh\"))\n\tk3d.property.connect(result.document, result.add_index_attributes.get_property(\"output_mesh\"), result.modifier1.get_property(\"input_mesh\"))\n\tk3d.property.connect(result.document, result.modifier1.get_property(\"output_mesh\"), result.modifier2.get_property(\"input_mesh\"))\n\n\treturn result\n\ndef add_point_attributes_test(setup, points, vertices, parameters):\n\tsetup.add_point_attributes = k3d.plugin.create(\"AddPointAttributes\", setup.document)\n\tsetup.add_point_attributes.add_point_attributes = points\n\tsetup.add_point_attributes.add_vertex_attributes = vertices\n\tsetup.add_point_attributes.add_parameter_attributes = parameters\n\tk3d.property.connect(setup.document, setup.add_index_attributes.get_property(\"output_mesh\"), setup.add_point_attributes.get_property(\"input_mesh\"))\n\tk3d.property.connect(setup.document, setup.add_point_attributes.get_property(\"output_mesh\"), setup.modifier.get_property(\"input_mesh\"))\n\ndef setup_mesh_writer_test(nodes, reader, target_file):\n\tif len(nodes) < 2:\n\t\traise Exception(\"Mesh writer test requires at least two nodes.\")\n\n\tresult = setup_mesh_test(nodes)\n\tresult.writer = result.sink\n\tresult.writer.file = k3d.filesystem.generic_path(binary_path() + \"/meshes/\" + target_file)\n\tresult.reader = k3d.plugin.create(reader, result.document)\n\tresult.reader.file = k3d.filesystem.generic_path(binary_path() + \"/meshes/\" + target_file)\n\tresult.reader.center = False\n\tresult.reader.scale_to_size = False\n\n\treturn result\n\ndef require_valid_mesh(document, input_mesh):\n\tprimitives = k3d.plugin.create(\"ValidMeshes\", document)\n\tk3d.property.create(primitives, \"k3d::mesh*\", \"input_mesh\", \"Input Mesh\", \"First input mesh\")\n\tk3d.property.connect(document, input_mesh, primitives.get_property(\"input_mesh\"))\n\tif not primitives.valid:\n\t\traise Exception(\"invalid or unknown primitive type in mesh\")\n\ndef require_mesh_area(calculated_area, expected_area):\n\tdart_measurement(\"calculated_area\", calculated_area)\n\tdart_measurement(\"expected_area\", expected_area)\n\n\tif calculated_area != expected_area:\n\t\traise Exception(\"incorrect mesh area\")\n\ndef require_mesh_volume(calculated_volume, expected_volume):\n\tdart_measurement(\"calculated_volume\", calculated_volume)\n\tdart_measurement(\"expected_volume\", expected_volume)\n\n\tif calculated_volume != expected_volume:\n\t\traise Exception(\"incorrect mesh volume\")\n\ndef require_similar_mesh(document, input_mesh, base_mesh_name, ulps_threshold, custom_platforms = []):\n\tmesh_name = base_mesh_name + \".reference\"\n\n\tplatform_id = str(platform.system()) + \"-\" + str(platform.machine())\n\tfor custom_platform in custom_platforms:\n\t\tif custom_platform == platform_id:\n\t\t\tmesh_name = mesh_name + \".\" + platform_id\n\t\t\tbreak\n\n\toutput_path = k3d.filesystem.generic_path(binary_path() + \"/meshes/\" + mesh_name + \".k3d\")\n\treference_path = k3d.filesystem.generic_path(source_path() + \"/meshes/\" + mesh_name + \".k3d\")\n\tdifference_path = k3d.filesystem.generic_path(binary_path() + \"/meshes/differences/\" + mesh_name + \".html\")\n\n\toutput = k3d.plugin.create(\"K3DMeshWriter\", document)\n\toutput.file = output_path\n\tk3d.property.connect(document, input_mesh, output.get_property(\"input_mesh\"))\n\n\treference = k3d.plugin.create(\"K3DMeshReader\", document)\n\treference.center = False\n\treference.scale_to_size = False\n\treference.material = k3d.node.lookup_one(document, \"Material\")\n\treference.file = reference_path\n\n\tif not os.path.exists(str(reference_path)):\n\t\traise Exception(\"missing reference file: \" + str(reference_path))\n\n\tresult = k3d.difference.accumulator()\n\tk3d.difference.test(input_mesh.internal_value(), reference.output_mesh, result)\n\n\tdart_measurement(\"exact_count\", result.exact_count())\n\tdart_measurement(\"exact_min\", result.exact_min())\n\tdart_measurement(\"exact_max\", result.exact_max())\n\n\tdart_measurement(\"ulps_count\", result.ulps_count())\n\tdart_measurement(\"ulps_min\", result.ulps_min())\n\tdart_measurement(\"ulps_max\", result.ulps_max())\n\tdart_measurement(\"ulps_mean\", result.ulps_mean())\n\tdart_measurement(\"ulps_median\", result.ulps_median())\n\n\tdart_measurement(\"ulps_threshold\", ulps_threshold)\n\n\tif (result.exact_count() and result.exact_min() == 0) or result.ulps_max() > ulps_threshold:\n\t\tprint \"\"\"<DartMeasurement name=\"geometry_difference\" type=\"text/html\"><![CDATA[\\n\"\"\"\n\t\tprint difflib.HtmlDiff().make_file(str(input_mesh.internal_value()).splitlines(1), str(reference.output_mesh).splitlines(1), \"Test Geometry\", \"Reference Geometry\")\n\t\tprint \"\"\"]]></DartMeasurement>\\n\"\"\"\n\t\tprint \"writing diff to file\", str(difference_path)\n\t\tsys.stdout.flush()\n\t\tdifference_file = open(str(difference_path), 'w')\n\t\tdifference_file.write(difflib.HtmlDiff().make_file(str(input_mesh.internal_value()).splitlines(1), str(reference.output_mesh).splitlines(1), \"Test Geometry\", \"Reference Geometry\"))\n\t\tdifference_file.close()\n\n\t\traise Exception(\"output mesh differs from reference\")\n\ndef points_to_string(points):\n\tresult = ''\n\tfor point in points:\n\t\tresult += str(point) + '\\n'\n\treturn result\n\ndef print_difference(accumulator, prefix=\"\"):\n\tdart_measurement(prefix+\"exact_count\", accumulator.exact_count())\n\tdart_measurement(prefix+\"exact_min\", accumulator.exact_min())\n\tdart_measurement(prefix+\"exact_max\", accumulator.exact_max())\n\n\tdart_measurement(prefix+\"ulps_count\", accumulator.ulps_count())\n\tdart_measurement(prefix+\"ulps_min\", accumulator.ulps_min())\n\tdart_measurement(prefix+\"ulps_max\", accumulator.ulps_max())\n\tdart_measurement(prefix+\"ulps_mean\", accumulator.ulps_mean())\n\tdart_measurement(prefix+\"ulps_median\", accumulator.ulps_median())\n\tdart_measurement(prefix+\"ulps_standard_deviation\", accumulator.ulps_standard_deviation())\n\tdart_measurement(prefix+\"ulps_variance\", accumulator.ulps_variance())\n\n\ndef require_valid_point_attributes(document, input_mesh, ulps_threshold = 10):\n\tpoint_attributes = input_mesh.point_attributes()[\"points\"]\n\t\n\tresult = k3d.difference.accumulator()\n\tk3d.difference.test(input_mesh.points(), point_attributes, result)\n\n\tprint_difference(result, \"point_attributes_\")\n\n\tif (result.exact_count() and result.exact_min() == 0) or result.ulps_max() > ulps_threshold:\n\t\tprint \"\"\"<DartMeasurement name=\"geometry_difference\" type=\"text/html\"><![CDATA[\\n\"\"\"\n\t\tprint difflib.HtmlDiff().make_file(points_to_string(point_attributes).splitlines(1), points_to_string(input_mesh.points()).splitlines(1), \"Test Points\", \"Reference Points\")\n\t\tprint \"\"\"]]></DartMeasurement>\\n\"\"\"\n\t\tsys.stdout.flush()\n\t\traise Exception(\"Point attributes don't match points array\")\n\ndef require_valid_vertex_attributes(document, input_mesh, ulps_threshold = 10):\n\tpoints = input_mesh.points()\n\tfor (i, prim) in zip(range(len(input_mesh.primitives())), input_mesh.primitives()):\n\t\tstruc = prim.structure()\n\t\trefpoints = []\n\t\tif struc.keys().count('vertex'):\n\t\t\tvertex_table = struc['vertex']\n\t\t\tfor array in vertex_table:\n\t\t\t\tif array.get_metadata_value('k3d:domain') == 'k3d:point-indices':\n\t\t\t\t\tfor idx in array:\n\t\t\t\t\t\trefpoints.append(points[idx])\n\t\tif len(refpoints):\n\t\t\tattribs = prim.attributes()\n\t\t\tif attribs.keys().count('vertex'):\n\t\t\t\tvertex_attribs = attribs['vertex']\n\t\t\t\tif vertex_attribs.keys().count('points'):\n\t\t\t\t\tvertex_point_attribs = vertex_attribs['points']\n\t\t\t\t\tresult = k3d.difference.accumulator()\n\t\t\t\t\tk3d.difference.test(vertex_point_attribs, refpoints, result)\n\t\t\t\t\tprint_difference(result, \"vertex_attributes_\")\n\t\t\t\t\tif (result.exact_count() and result.exact_min() == 0) or result.ulps_max() > ulps_threshold:\n\t\t\t\t\t\tprint \"\"\"<DartMeasurement name=\"geometry_difference\" type=\"text/html\"><![CDATA[\\n\"\"\"\n\t\t\t\t\t\tprint difflib.HtmlDiff().make_file(points_to_string(vertex_point_attribs).splitlines(1), points_to_string(refpoints).splitlines(1), \"Test Points\", \"Reference Points\")\n\t\t\t\t\t\tprint \"\"\"]]></DartMeasurement>\\n\"\"\"\n\t\t\t\t\t\tsys.stdout.flush()\n\t\t\t\t\t\traise Exception(\"Vertex point attributes don't match points array for primitive {0}\".format(i))\n\ndef require_valid_parameter_attributes(document, input_mesh, ulps_threshold = 10):\n\tpoints = input_mesh.points()\n\tfor (i, prim) in zip(range(len(input_mesh.primitives())), input_mesh.primitives()):\n\t\tcurve_prim = k3d.nurbs_curve.validate(input_mesh, prim)\n\t\tif curve_prim:\n\t\t\trefpoints = []\n\t\t\tfor (first_point, point_count) in zip(curve_prim.curve_first_points(), curve_prim.curve_point_counts()):\n\t\t\t\tlast_point = first_point + point_count - 1\n\t\t\t\trefpoints.append(points[first_point])\n\t\t\t\trefpoints.append(points[last_point])\n\t\t\tif len(refpoints):\n\t\t\t\tif curve_prim.parameter_attributes().keys().count('points'):\n\t\t\t\t\ttestpoints = curve_prim.parameter_attributes()['points']\n\t\t\t\t\tresult = k3d.difference.accumulator()\n\t\t\t\t\tk3d.difference.test(testpoints, refpoints, result)\n\t\t\t\t\tprint_difference(result, \"parameter_attributes_\")\n\t\t\t\t\tif (result.exact_count() and result.exact_min() == 0) or result.ulps_max() > ulps_threshold:\n\t\t\t\t\t\tprint \"\"\"<DartMeasurement name=\"geometry_difference\" type=\"text/html\"><![CDATA[\\n\"\"\"\n\t\t\t\t\t\tprint difflib.HtmlDiff().make_file(points_to_string(testpoints).splitlines(1), points_to_string(refpoints).splitlines(1), \"Test Points\", \"Reference Points\")\n\t\t\t\t\t\tprint \"\"\"]]></DartMeasurement>\\n\"\"\"\n\t\t\t\t\t\tsys.stdout.flush()\n\t\t\t\t\t\traise Exception(\"Parameter point attributes don't match points array for primitive {0}\".format(i))\n\n\t\tpatch_prim = k3d.nurbs_patch.validate(input_mesh, prim)\n\t\tif patch_prim:\n\t\t\trefpoints = []\n\t\t\tfor (c1, u_count, v_count) in zip(patch_prim.patch_first_points(), patch_prim.patch_u_point_counts(), patch_prim.patch_v_point_counts()):\n\t\t\t\tc2 = c1 + u_count-1;\n\t\t\t\tc3 = c1 + u_count*(v_count-1);\n\t\t\t\tc4 = c3 + u_count - 1;\n\t\t\t\trefpoints.append(points[c1]);\n\t\t\t\trefpoints.append(points[c2]);\n\t\t\t\trefpoints.append(points[c3]);\n\t\t\t\trefpoints.append(points[c4]);\n\t\t\tif len(refpoints):\n\t\t\t\tif patch_prim.parameter_attributes().keys().count('points'):\n\t\t\t\t\ttestpoints = patch_prim.parameter_attributes()['points']\n\t\t\t\t\tresult = k3d.difference.accumulator()\n\t\t\t\t\tk3d.difference.test(testpoints, refpoints, result)\n\t\t\t\t\tprint_difference(result, \"parameter_attributes_\")\n\t\t\t\t\tif (result.exact_count() and result.exact_min() == 0) or result.ulps_max() > ulps_threshold:\n\t\t\t\t\t\tprint \"\"\"<DartMeasurement name=\"geometry_difference\" type=\"text/html\"><![CDATA[\\n\"\"\"\n\t\t\t\t\t\tprint difflib.HtmlDiff().make_file(points_to_string(testpoints).splitlines(1), points_to_string(refpoints).splitlines(1), \"Test Points\", \"Reference Points\")\n\t\t\t\t\t\tprint \"\"\"]]></DartMeasurement>\\n\"\"\"\n\t\t\t\t\t\tsys.stdout.flush()\n\t\t\t\t\t\traise Exception(\"Parameter point attributes don't match points array for primitive {0}\".format(i))\n\n#####################################################################################33\n# Scalar-related testing\n\ndef setup_scalar_source_test(source_name):\n\tclass result_object:\n\t\tpass\n\n\tresult = result_object\n\tresult.document = k3d.new_document()\n\tresult.source = k3d.plugin.create(source_name, result.document)\n\n\treturn result\n\ndef require_scalar_value(value, expected_value):\n\tdart_measurement(\"value\", value);\n\tdart_measurement(\"expected_value\", expected_value);\n\tif value != expected_value:\n\t\traise Exception(\"value does not match expected value\")\n\n#####################################################################################33\n# Shader-related testing\n\ndef displacement_shader_test(render_engine_name, shader_name):\n\tclass result_object:\n\t\tdef render(self):\n\t\t\tself.render_engine.render_camera_frame(self.camera, self.output, False)\n\n\tresult = result_object\n\tresult.document = k3d.open_document(k3d.filesystem.generic_path(source_path() + \"/shaders/displacement_shader_test.k3d\"))\n\tresult.camera = k3d.node.lookup_one(result.document, \"Camera\")\n\tresult.render_engine = k3d.node.lookup_one(result.document, \"RenderMan Engine\")\n\tresult.material = k3d.node.lookup_one(result.document, \"RenderManMaterial\")\n\tresult.shader = k3d.node.lookup_one(result.document, \"RenderManDisplacementShader\")\n\n\tresult.shader.shader_path = k3d.share_path() / k3d.filesystem.generic_path(\"shaders/displacement/\" + shader_name + \".sl\")\n\tresult.output = k3d.filesystem.generic_path(binary_path() + \"/shaders/displacement/\" + shader_name + \".\" + render_engine_name + \".tiff\")\n\tresult.render_engine.render_engine = k3d.node.lookup_one(result.document, render_engine_name)\n\n\tresult.render_engine.render_camera_frame(result.camera, result.output, False)\n\n\treturn result\n\ndef light_shader_test(render_engine_name, shader_name):\n\tclass result_object:\n\t\tdef render(self):\n\t\t\tself.render_engine.render_camera_frame(self.camera, self.output, False)\n\n\tresult = result_object\n\tresult.document = k3d.open_document(k3d.filesystem.generic_path(source_path() + \"/shaders/light_shader_test.k3d\"))\n\tresult.camera = k3d.node.lookup_one(result.document, \"Camera\")\n\tresult.render_engine = k3d.node.lookup_one(result.document, \"RenderMan Engine\")\n\tresult.material = k3d.node.lookup_one(result.document, \"RenderManMaterial\")\n\tresult.shader = k3d.node.lookup_one(result.document, \"Light Shader\")\n\n\tresult.shader.shader_path = k3d.share_path() / k3d.filesystem.generic_path(\"shaders/light/\" + shader_name + \".sl\")\n\tresult.output = k3d.filesystem.generic_path(binary_path() + \"/shaders/light/\" + shader_name + \".\" + render_engine_name + \".tiff\")\n\tresult.render_engine.render_engine = k3d.node.lookup_one(result.document, render_engine_name)\n\n\tresult.render_engine.render_camera_frame(result.camera, result.output, False)\n\n\treturn result\n\ndef surface_shader_test(render_engine_name, shader_name):\n\tclass result_object:\n\t\tdef render(self):\n\t\t\tself.render_engine.render_camera_frame(self.camera, self.output, False)\n\n\tresult = result_object\n\tresult.document = k3d.open_document(k3d.filesystem.generic_path(source_path() + \"/shaders/surface_shader_test.k3d\"))\n\tresult.camera = k3d.node.lookup_one(result.document, \"Camera\")\n\tresult.render_engine = k3d.node.lookup_one(result.document, \"RenderMan Engine\")\n\tresult.material = k3d.node.lookup_one(result.document, \"RenderManMaterial\")\n\tresult.shader = k3d.node.lookup_one(result.document, \"Surface Shader\")\n\n\tresult.shader.shader_path = k3d.share_path() / k3d.filesystem.generic_path(\"shaders/surface/\" + shader_name + \".sl\")\n\tresult.output = k3d.filesystem.generic_path(binary_path() + \"/shaders/surface/\" + shader_name + \".\" + render_engine_name + \".tiff\")\n\tresult.render_engine.render_engine = k3d.node.lookup_one(result.document, render_engine_name)\n\n\tresult.render_engine.render_camera_frame(result.camera, result.output, False)\n\n\treturn result\n\ndef volume_shader_test(render_engine_name, shader_name):\n\tclass result_object:\n\t\tdef render(self):\n\t\t\tself.render_engine.render_camera_frame(self.camera, self.output, False)\n\n\tresult = result_object\n\tresult.document = k3d.open_document(k3d.filesystem.generic_path(source_path() + \"/shaders/volume_shader_test.k3d\"))\n\tresult.camera = k3d.node.lookup_one(result.document, \"Camera\")\n\tresult.render_engine = k3d.node.lookup_one(result.document, \"RenderMan Engine\")\n\tresult.material = k3d.node.lookup_one(result.document, \"RenderManMaterial\")\n\tresult.shader = k3d.node.lookup_one(result.document, \"RenderManVolumeShader\")\n\n\tresult.shader.shader_path = k3d.share_path() / k3d.filesystem.generic_path(\"shaders/volume/\" + shader_name + \".sl\")\n\tresult.output = k3d.filesystem.generic_path(binary_path() + \"/shaders/volume/\" + shader_name + \".\" + render_engine_name + \".tiff\")\n\tresult.render_engine.render_engine = k3d.node.lookup_one(result.document, render_engine_name)\n\n\tresult.render_engine.render_camera_frame(result.camera, result.output, False)\n\n\treturn result\n\n#####################################################################################33\n# Deprecated stuff\n\ndef bitmap_perceptual_difference(document, input_image1, input_image2, threshold=1e-8):\n\tdifference = k3d.plugin.create(\"BitmapPerceptualDifference\", document)\n\tdifference.field_of_view = 10.0\n\tdifference.luminance = 100\n\tk3d.property.connect(document, input_image1, difference.get_property(\"input_a\"))\n\tk3d.property.connect(document, input_image2, difference.get_property(\"input_b\"))\n\t\n\tpixel_count = input_image1.internal_value().width() * input_image1.internal_value().height()\n\tpixel_difference = difference.difference\n\tdifference_measurement = float(pixel_difference) / float(pixel_count)\n\n\tdart_measurement(\"pixel_difference\", pixel_difference)\n\tdart_measurement(\"pixel_count\", pixel_count)\n\tdart_measurement(\"difference\", difference_measurement)\n\tdart_measurement(\"threshold\", threshold)\n\t\n\tif difference_measurement > threshold:\n\t\traise \"pixel difference exceeds threshold\"\n   \n# compare the results of two different bitmap plugins applied to the k-3d test image\ndef bitmap_compare_plugin_outputs(referenceName, pluginToTest, pluginPropertyValues = {}):\n\t# load the reference image\n\tinputBitmap = setup_bitmap_reader_test(\"BitmapReader\", \"test_rgb_8.bmp\")\n\tdocument = inputBitmap.document\n\t\n\treferenceNode = k3d.plugin.create(referenceName, document)\n\ttestNode = k3d.plugin.create(pluginToTest, document)\n\t\n\tfor (property, value) in pluginPropertyValues.items():\n\t\treferenceNode.get_property(property).set_value(value)\n\t\ttestNode.get_property(property).set_value(value)\n\t\n\t# set the dependency to the input bitmap so that the errors can be measured\n\tk3d.property.connect(document, inputBitmap.reader.get_property(\"output_bitmap\"), referenceNode.get_property(\"input_bitmap\"))\n\tk3d.property.connect(document, inputBitmap.reader.get_property(\"output_bitmap\"), testNode.get_property(\"input_bitmap\"))\n\t\n\tprint \"\"\"<DartMeasurement name=\"Description\" type=\"text/string\"> Compare \"\"\" + pluginToTest + \" to \" + referenceName + \"\"\"</DartMeasurement>\"\"\"\n\tif len(pluginPropertyValues) > 0:\n\t\tprint \"\"\"<DartMeasurement name=\"Parameters\" type=\"text/string\"> \"\"\" + str(pluginPropertyValues) + \"\"\"</DartMeasurement>\"\"\"\n\n\t# calculate the perceptual difference\n\tbitmap_perceptual_difference(document, referenceNode.get_property(\"output_bitmap\"), testNode.get_property(\"output_bitmap\"))\n\ndef bitmap_modifier_benchmark(BitmapModifier):\n\tsys.stdout.write(\"\"\"<DartMeasurement name=\"Timing\" type=\"text/html\"><![CDATA[\\n\"\"\")\n\tsys.stdout.write(\"\"\"<table>\\n\"\"\")\n\n\tsizes = [(640,480), (800,600), (1024,768), (1280,1024), (1600, 1200)]\n\truns = 3\n\n\tfirst_row = True\n\tfor size in sizes:\n\t\tfor run in range(runs):\n\t\t\tdocument = k3d.new_document()\n\n\t\t\tprofiler = k3d.plugin.create(\"PipelineProfiler\", document)\n\n\t\t\timage = k3d.plugin.create(\"BitmapSolid\", document)\n\t\t\timage.width = size[0];\n\t\t\timage.height = size[1];\n\n\t\t\tmodifier = k3d.plugin.create(BitmapModifier, document)\n\n\t\t\tk3d.property.connect(document, image.get_property(\"output_bitmap\"), modifier.get_property(\"input_bitmap\"))\n\t\t\tmodifier.output_bitmap\n\n\t\t\tif first_row:\n\t\t\t\tfirst_row = False\n\n\t\t\t\tsys.stdout.write(\"\"\"<tr>\"\"\")\n\t\t\t\tsys.stdout.write(\"\"\"<th>Width</th>\"\"\")\n\t\t\t\tsys.stdout.write(\"\"\"<th>Height</th>\"\"\")\n\t\t\t\tsys.stdout.write(\"\"\"<th>Run</th>\"\"\")\n\n\t\t\t\trecords = profiler.records\n\t\t\t\tfor node in records:\n\t\t\t\t\tif node != modifier:\n\t\t\t\t\t\tcontinue\n\n\t\t\t\t\tmeasurements = records[node]\n\t\t\t\t\tfor measurement in measurements:\n\t\t\t\t\t\tsys.stdout.write(\"\"\"<th>\"\"\")\n\t\t\t\t\t\tsys.stdout.write(measurement)\n\t\t\t\t\t\tsys.stdout.write(\"\"\"</th>\"\"\")\n\n\t\t\t\tsys.stdout.write(\"\"\"</tr>\\n\"\"\")\n\n\t\t\tsys.stdout.write(\"\"\"<tr>\"\"\")\n\t\t\tsys.stdout.write(\"\"\"<td>\"\"\" + str(size[0]) + \"\"\"</td>\"\"\")\n\t\t\tsys.stdout.write(\"\"\"<td>\"\"\" + str(size[1]) + \"\"\"</td>\"\"\")\n\t\t\tsys.stdout.write(\"\"\"<td>\"\"\" + str(run) + \"\"\"</td>\"\"\")\n\n\t\t\trecords = profiler.records\n\t\t\tfor node in records:\n\t\t\t\tif node != modifier:\n\t\t\t\t\tcontinue\n\n\t\t\t\tmeasurements = records[node]\n\t\t\t\tfor measurement in measurements:\n\t\t\t\t\tsys.stdout.write(\"\"\"<td>\"\"\")\n\t\t\t\t\tsys.stdout.write(str(measurements[measurement]))\n\t\t\t\t\tsys.stdout.write(\"\"\"</td>\"\"\")\n\n\t\t\tsys.stdout.write(\"\"\"</tr>\\n\"\"\")\n\n\t\t\tk3d.close_document(document)\n\n\tsys.stdout.write(\"\"\"</table>\\n\"\"\")\n\tsys.stdout.write(\"\"\"]]></DartMeasurement>\\n\"\"\")\n\n"
  },
  {
    "path": "tests/vector3/CMakeLists.txt",
    "content": "K3D_TEST(vector3.source.Vector3SourceScript\n\tK3D_PYTHON_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/source.Vector3SourceScript.py\n\tREQUIRES K3D_BUILD_SCRIPTING_MODULE\n\tLABELS vector3 source Vector3SourceScript)\n\n"
  },
  {
    "path": "tests/vector3/source.Vector3SourceScript.py",
    "content": "#python\n\nimport k3d\nimport testing\n\ndoc = k3d.new_document()\nsource = k3d.plugin.create(\"Vector3SourceScript\", doc)\n\nif source.output_vector != k3d.vector3(1, 2, 3):\n\traise \"unexpected output_vector: \" + str(source.output_vector)\n\n"
  },
  {
    "path": "uuidgen/CMakeLists.txt",
    "content": "PROJECT(uuidgen)\n\nINCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})\nINCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})\nINCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})\n\nLINK_DIRECTORIES(${K3D_GLIBMM_LIB_DIRS})\nLINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})\n\nADD_EXECUTABLE(k3d-uuidgen\n  main.cpp\n  )\n\nSET_TARGET_PROPERTIES(k3d-uuidgen PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY ${K3D_RUNTIME_OUTPUT_DIRECTORY}\n  )\n\nTARGET_LINK_LIBRARIES(k3d-uuidgen\n  k3dsdk\n  )\n\nINSTALL(TARGETS k3d-uuidgen DESTINATION bin)\n\n"
  },
  {
    "path": "uuidgen/main.cpp",
    "content": "#include <k3d-version-config.h>\n\n#include <k3dsdk/log.h>\n#include <k3dsdk/uuid.h>\n\n#include <iomanip>\n#include <iostream>\n\nint main(int argc, char* argv[])\n{\n\tk3d::log() << \"k3d-uuidgen version \" << K3D_VERSION << std::endl;\n\tk3d::log() << \"You can paste the following unique ID into your new K-3D plugin:\" << std::endl;\n\n\tconst k3d::uuid result = k3d::uuid::random();\n\n\tstd::cout << std::hex << std::setfill('0');\n\tfor(int i = 0; i != result.size(); ++i)\n\t{\n\t\tif(i && (0 == i % 4))\n\t\t\tstd::cout << \", \";\n\t\tif(0 == i % 4)\n\t\t\tstd::cout << \"0x\";\n\t\tstd::cout << std::setw(2) << static_cast<k3d::uint32_t>(result.data[i]);\n\t}\n\tstd::cout << std::endl;\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "web/CMakeLists.txt",
    "content": "PROJECT(web)\n\nFIND_PROGRAM(MAKO_COMMAND\n\tNAMES mako-render mako-render-2.6\n\t)\n\nSET(web_OUTPUT_DIR \"${web_BINARY_DIR}/site\")\n\nSET(developer_OUTPUT_DIR \"${web_OUTPUT_DIR}/developer\")\nSET(planet_OUTPUT_DIR \"${web_OUTPUT_DIR}/planet\")\nSET(tracker_OUTPUT_DIR \"${web_OUTPUT_DIR}/developer/tracker\")\nSET(www_OUTPUT_DIR \"${web_OUTPUT_DIR}/www\")\n\nADD_CUSTOM_TARGET(www-html\n\tCOMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${web_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${www_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${www_OUTPUT_DIR}/resources\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${www_OUTPUT_DIR}/resources/banners\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/k3d.css\" \"${www_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/k3d.png\" \"${www_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/www/logo.png\" \"${www_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/www/maintenance.html\" \"${www_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/www/resources/banner\" \"${www_OUTPUT_DIR}/resources\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E chdir \"${www_OUTPUT_DIR}/resources\" chmod a+x banner\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/www/resources/banners/moon.jpeg\" \"${www_OUTPUT_DIR}/resources/banners/moon.jpeg\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/www/resources/banners/submarine.jpeg\" \"${www_OUTPUT_DIR}/resources/banners/submarine.jpeg\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/www/resources/banners/town.jpeg\" \"${www_OUTPUT_DIR}/resources/banners/town.jpeg\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E chdir \"${CMAKE_CURRENT_SOURCE_DIR}/www\" ${MAKO_COMMAND} \"donations.html\" > \"${www_OUTPUT_DIR}/donations.html\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E chdir \"${CMAKE_CURRENT_SOURCE_DIR}/www\" ${MAKO_COMMAND} \"downloads.html\" > \"${www_OUTPUT_DIR}/downloads.html\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E chdir \"${CMAKE_CURRENT_SOURCE_DIR}/www\" ${MAKO_COMMAND} \"index.html\" > \"${www_OUTPUT_DIR}/index.html\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E chdir \"${CMAKE_CURRENT_SOURCE_DIR}/www\" ${MAKO_COMMAND} \"video.html\" > \"${www_OUTPUT_DIR}/video.html\"\n\t)\n\nADD_CUSTOM_TARGET(planet-html\n\tCOMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${web_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${planet_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/k3d.css\" \"${planet_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/k3d.png\" \"${planet_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/planet/feed-icon-10x10.png\" \"${planet_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/planet/logo.png\" \"${planet_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/planet/planet.css\" \"${planet_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_CURRENT_SOURCE_DIR}/planet/planet\" --templates \"${CMAKE_CURRENT_SOURCE_DIR}/planet\" --output \"${planet_OUTPUT_DIR}\"\n\t)\n\nADD_CUSTOM_TARGET(developer-html\n\tCOMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${web_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${developer_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/k3d.css\" \"${developer_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/k3d.png\" \"${developer_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/developer/developer.css\" \"${developer_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/developer/logo.png\" \"${developer_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/developer/k3d_universal_storage.pdf\" \"${developer_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E chdir \"${CMAKE_CURRENT_SOURCE_DIR}/developer\" ${MAKO_COMMAND} \"dashboard.html\" > \"${developer_OUTPUT_DIR}/dashboard.html\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E chdir \"${CMAKE_CURRENT_SOURCE_DIR}/developer\" ${MAKO_COMMAND} \"dashboard-index.html\" > \"${developer_OUTPUT_DIR}/dashboard-index.html\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E chdir \"${CMAKE_CURRENT_SOURCE_DIR}/developer\" ${MAKO_COMMAND} \"index.html\" > \"${developer_OUTPUT_DIR}/index.html\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E chdir \"${CMAKE_CURRENT_SOURCE_DIR}/developer\" ${MAKO_COMMAND} \"documentation.html\" > \"${developer_OUTPUT_DIR}/documentation.html\"\n\t)\n\nADD_CUSTOM_TARGET(tracker-html\n\tCOMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${web_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${developer_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${tracker_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/developer/tracker/tracker.css\" \"${tracker_OUTPUT_DIR}\"\n\tCOMMAND \"${CMAKE_COMMAND}\" -E chdir \"${CMAKE_CURRENT_SOURCE_DIR}/developer/tracker\" ${PYTHON_EXECUTABLE} \"${CMAKE_CURRENT_SOURCE_DIR}/developer/tracker/tracker\" --project \"${ditz_SOURCE_DIR}\" --templates \"${CMAKE_CURRENT_SOURCE_DIR}/developer/tracker\" --output \"${tracker_OUTPUT_DIR}\"\n\t)\n\n"
  },
  {
    "path": "web/developer/dashboard-index.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D Developer</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"k3d.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"developer.css\" />\n\t</head>\n\n\t<body>\n<%include file=\"navigation.html\"/>\n\n\t\t<div id=\"main\">\n\t\t<p>The K-3D Dashboard consolidates regression test results run nightly by clients around the world:</p>\n\t\t</div>\n\n\t\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"/>\n\t\t<script type=\"text/javascript\">\n\t\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-5\"); pageTracker._trackPageview(); } catch(err) { }\n\t\t</script>\n\t</body>\n</html>\n\n"
  },
  {
    "path": "web/developer/dashboard.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D Dashboard</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"k3d.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"developer.css\" />\n\t</head>\n\n\t<frameset rows=\"140,*\">\n\t\t<frame frameborder=\"0\" src=\"dashboard-index\" noresize=\"noresize\"/>\n\t\t<frame frameborder=\"0\" src=\"http://www.k-3d.org/cdash/index.php?project=K-3D\"/>\n\t</frameset>\n</html>\n\n"
  },
  {
    "path": "web/developer/developer.css",
    "content": "#nav\n{\n  height: 70px;\n}\n\ndt\n{\n  position: relative;\n  width: 15em;\n  height: 1em;\n  padding: 0.25em 0 0 0;\n}\n\ndd\n{\n  margin: 0 0 0 16em;\n  margin-left: 16em;\n  border-left: 1px solid #cccccc;\n  padding-left: 1em;\n  padding-top: 0.25em;\n  padding-bottom: 0.25em;\n}\n\npre\n{\n  padding-bottom: 1em;\n}\n\n"
  },
  {
    "path": "web/developer/documentation.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D Developer Documentation</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"k3d.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"developer.css\" />\n\t</head>\n\n\t<body>\n<%include file=\"navigation.html\"/>\n\n\t\t<div id=\"main\">\n\t\t\t<div id=\"left\">\n\t\t\t\t<h2>Whitepapers</h2>\n\t\t\t\t<p>\n\t\t\t\t\t<a href=\"k3d_universal_storage.pdf\">Universal Relational Storage for Geometric Primitives</a>\n\t\t\t\t\tprovides a detailed discussion of how K-3D flexibly stores geometric data, and what this\n\t\t\t\t\tflexibility means for researchers and developers.\n\t\t\t\t</p>\n\n\t\t\t\t<h2>Overviews</h2>\n\t\t\t\t<p>\n\t\t\t\t\tThe K-3D <a href=\"http://www.k-3d.org/wiki/Developer_Documentation\">Developers' Wiki</a>\n\t\t\t\t\tcovers a broad range of how-tos, design discussions, and architectural information.\n\t\t\t\t</p>\n\n\t\t\t\t<h2>Reference</h2>\n\t\t\t\t<p>\n\t\t\t\t\tThe <a href=\"docs/doxygen\">C++ Reference Documentation</a>\n\t\t\t\t\tcovers namespaces, classes, methods, and members, and is\n\t\t\t\t\tautomatically generated using <a href=\"http://www.doxygen.org\">Doxygen</a>.\n\t\t\t\t</p>\n\n\t\t\t\t<p>\n\t\t\t\t\tThe <a href=\"docs/epydoc\">Python Reference Documentation</a>\n\t\t\t\t\tis automatically generated using <a href=\"http://epydoc.sourceforge.net/\">Epydoc</a>.\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<div id=\"right\">\n\t\t\t</div>\n\t\t</div>\n\n\t\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"/>\n\t\t<script type=\"text/javascript\">\n\t\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-5\"); pageTracker._trackPageview(); } catch(err) { }\n\t\t</script>\n\t</body>\n</html>\n\n"
  },
  {
    "path": "web/developer/index.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D Developer</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"k3d.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"developer.css\" />\n\t</head>\n\n\t<body>\n<%include file=\"navigation.html\"/>\n\n\t\t<div id=\"main\">\n\t\t\t<div id=\"left\">\n\t\t\t\t<h2>Use The Source!</h2>\n\t\t\t\t<p>K-3D is <a href=\"http://www.gnu.org/philosophy/free-sw.html\">Free Software</a>.  The source code\n\t\t\t\tis licensed using the <a href=\"http://www.gnu.org/licenses/gpl-faq.html\">GNU General Public License</a>.</p>\n\n\t\t\t\t<p>K-3D is written in C++ with platform independence in mind.\n\t\t\t\tAs a result, K-3D can be built on\n\t\t\t\t<a href=\"http://www.linux.org\">GNU/Linux</a>,\n\t\t\t\t<a href=\"http://www.apple.com\">MacOS X</a>,\n\t\t\t\t<a href=\"http://www.freebsd.org/\">FreeBSD</a>,\n\t\t\t\t<a href=\"http://www.microsoft.com/windows\">Microsoft Windows</a>,\n\t\t\t\tand other platforms.</p>\n\n\t\t\t\t<p>We use <a href=\"http://git-scm.com/\">Git</a> for source-code management,\n\t\t\t\t<a href=\"http://cmake.org\">CMake</a> for our build system, and <a href=\"http://gtkmm.org\">gtkmm</a>\n\t\t\t\tfor our user interface toolkit.  Required dependencies include <a href=\"http://boost.org\">Boost</a>,\n\t\t\t\t<a href=\"http://opengl.org\">OpenGL</a>, and <a href=\"http://libsigc.sourceforge.net\">libsigc++</a>.\n\t\t\t\t</p>\n\t\t\t\t<p>K-3D can be optionally built with integration for Collada, DBus, GLX, Gnome VFS, GTS, ImageMagick,\n\t\t\t\tODE, OpenEXR, and more ...\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<div id=\"right\">\n\t\t\t\t<h2>Quick Start</h2>\n\n\t\t\t\t<p><em>Clone the K-3D sources and build:</em>\n<pre>\n$ git clone git://github.com/K-3D/k3d.git\n$ mkdir k3d-build\n$ cd k3d-build\n$ cmake ../k3d\n$ make\n</pre>\n\t\t\t\t</p>\n\n\t\t\t\t<p><em>Run K-3D from the build directory:</em>\n<pre>\n$ cd k3d-build\n$ make run/fast\n</pre>\n\t\t\t\t</p>\n\n\t\t\t\t<p><em>Install K-3D:</em>\n<pre>\n$ cd k3d-build\n$ make install\n</pre>\n\t\t\t\t</p>\n\t\t\t\t<p><em>Make changes to the K-3D sources:</em></p>\n\t\t\t\t<p>\n\t\t\t\t<ol>\n\t\t\t\t\t<li>Create a <a href=\"http://help.github.com/fork-a-repo/\">fork</a> on Github</li>\n\t\t\t\t\t<li><a href=\"http://book.git-scm.com/3_normal_workflow.html\">commit the changes</a></li>\n\t\t\t\t\t<li><a href=\"http://help.github.com/send-pull-requests/\">send a pull request</a></li>\n\t\t\t\t</ol>\n\t\t\t\tYou can also just create a patch, if needed.\n\t\t\t\t</p>\n\n\t\t\t\t<p><em>For more on using Git see the <a href=\"http://book.git-scm.com/\">guide</a>.</em></p>\n\n\t\t\t</div>\n\t\t</div>\n\n\t\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"/>\n\t\t<script type=\"text/javascript\">\n\t\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-5\"); pageTracker._trackPageview(); } catch(err) { }\n\t\t</script>\n\t</body>\n</html>\n"
  },
  {
    "path": "web/developer/navigation.html",
    "content": "\t\t<div id=\"nav\">\n\t\t\t<a id=\"logo\" target=\"_top\" href=\".\"><h1>K-3D Developer</h1></a>\n\n\t\t\t<ul>\n\t\t\t\t<li><a target=\"_top\" href=\"documentation\">Documentation</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"http://www.k-3d.org/wiki/Developer_Documentation\">Wiki</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"http://www.k-3d.org/forums/forum/development\">Forums</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"http://www.k-3d.org/blogs\">Blogs</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"tracker\">Tracker</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"dashboard\">Dashboard</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"http://www.k-3d.org\">User</a></li>\n\t\t\t</ul>\n\t\t</div>\n"
  },
  {
    "path": "web/developer/tracker/issue.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D Issue - ${issue[\"title\"] | h}</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"../k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../k3d.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../developer.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"tracker.css\" />\n\t</head>\n\n<%\nimport datetime\n\nkeywords = { \":unstarted\":\"Unstarted\", \":closed\":\"Closed\", \":bugfix\":\"Bugfix\", \":task\":\"Task\", \":feature\":\"Feature\" }\n\n%>\n\n\t<body>\n<%include file=\"navigation.html\"/>\n\n\t\t<div id=\"main\" class=\"tracker\">\n\t\t\t<h2>Issue - ${issue[\"title\"] | h}</h2>\n\t\t\t<p>${issue[\"desc\"] | h}</p>\t\n\n\t\t\t<h3>Details</h3>\n\t\t\t<dl>\n\t\t\t\t<dt>Id:</dt>\n\t\t\t\t<dd>${issue[\"id\"] | h}</dd>\n\n\t\t\t\t<dt>Type:</dt>\n\t\t\t\t<dd>${keywords[issue[\"type\"]] | h}</dd>\n\n\t\t\t\t<dt>Creation Time:</dt>\n\t\t\t\t<dd>${issue[\"creation_time\"].strftime(\"%Y-%m-%d %H:%M UTC\") | h}</dd>\n\n\t\t\t\t<dt>Reporter:</dt>\n\t\t\t\t<dd>${issue[\"reporter\"] | h}</dd>\n\n\t\t\t\t<dt>Release:</dt>\n\t\t\t\t% if release:\n\t\t\t\t<dd><a href=\"${release['filename'] | h}\">${issue[\"release\"] | h}</a></dd>\n\t\t\t\t% else:\n\t\t\t\t<dd>None</dd>\n\t\t\t\t% endif\n\n\t\t\t\t<dt>Status:</dt>\n\t\t\t\t<dd>${keywords[issue[\"status\"]] | h}</dd>\n\t\t\t</dl>\n\n\t\t\t<h3>Issue Log</h3>\n\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t% for event in issue[\"log_events\"]:\n\t\t\t\t\t<tr><td>${event[0].strftime(\"%Y-%m-%d %H:%M UTC\") | h}</td><td>${event[1] | h}</td><td>${event[2] | h}</td><td>${event[3] | h}</td></tr>\n\t\t\t\t% endfor\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t\t<div id=\"footer\">\n\t\t\t<p class=\"generated\">${datetime.datetime.utcnow().strftime(\"Updated %B %d, %Y %H:%M UTC\") | h}</p>\n\t\t</div>\n\n\t\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"/>\n\t\t<script type=\"text/javascript\">\n\t\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-1\"); pageTracker._trackPageview(); } catch(err) { }\n\t\t</script>\n\t</body>\n</html>\n\n"
  },
  {
    "path": "web/developer/tracker/navigation.html",
    "content": "\t\t<div id=\"nav\">\n\t\t\t<a id=\"logo\" href=\"..\"><h1>K-3D Developer</h1></a>\n\n\t\t\t<ul>\n\t\t\t\t<li><a target=\"_top\" href=\"../documentation\">Documentation</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"http://www.k-3d.org/wiki/Developer_Documentation\">Wiki</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"http://www.k-3d.org/forums/forum/development\">Forums</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"http://www.k-3d.org/blogs\">Blogs</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"../tracker\">Tracker</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"../dashboard\">Dashboard</a></li>\n\t\t\t\t<li><a target=\"_top\" href=\"http://www.k-3d.org\">User</a></li>\n\t\t\t</ul>\n\t\t</div>\n"
  },
  {
    "path": "web/developer/tracker/project.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D Issue Tracker</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"../k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../k3d.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../developer.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"tracker.css\" />\n\t</head>\n\n<%\nimport datetime\n%>\n\n\t<body>\n<%include file=\"navigation.html\"/>\n\n\t\t<div id=\"main\" class=\"tracker\">\n\t\t\t<h2>Issue Tracker</h2>\n\n\t\t\t<h3>Upcoming Releases</h3>\n\t\t\t<% upcoming_releases = filter(lambda release: release[\"status\"] == \":unreleased\", project[\"releases\"]) %>\n\t\t\t% if len(upcoming_releases):\n\t\t\t<ul>\n\t\t\t\t% for release in upcoming_releases:\n\n\t\t\t\t<%\n\n\t\t\t\trelease_issues = filter(lambda issue: issue[\"release\"] == release[\"name\"], issues)\n\t\t\t\tclosed_issues = filter(lambda issue: issue[\"status\"] == \":closed\", release_issues)\n\t\t\t\topen_issues = filter(lambda issue: issue[\"status\"] != \":closed\", release_issues)\n\n\t\t\t\tissue_count = len(release_issues)\n\t\t\t\tclosed_count = len(closed_issues)\n\t\t\t\topen_count = len(open_issues)\n\n\t\t\t\tclosed_percent = closed_count * 100 / issue_count\n\t\t\t\topen_percent = open_count * 100 / issue_count\n\n\t\t\t\t%>\n\n\t\t\t\t<li><dl><dt><a href=\"${release['filename']}\">${release['name'] | h}</a></dt><dd><span class=\"progress-closed-issues\">${\"&nbsp;\" * closed_percent}</span><span class=\"progress-open-issues\">${\"&nbsp;\" * open_percent}</span>${closed_count} / ${issue_count | h} (${closed_percent | h}%)</dd></dl></li>\n\t\t\t\t% endfor\n\t\t\t</ul>\n\t\t\t% else:\n\t\t\t<p>No upcoming releases.</p>\n\t\t\t% endif\n\n\t\t\t<h3>Past Releases</h3>\n\t\t\t<% past_releases = filter(lambda release: release[\"status\"] != \":unreleased\", project[\"releases\"]) %>\n\t\t\t% if len(past_releases):\n\t\t\t<ul>\n\t\t\t\t% for release in past_releases:\n\n\t\t\t\t<li><dl><dt><a href=\"${release['filename']}\">${release['name'] | h}</a></dt><dd>${release[\"release_time\"].strftime(\"Released %B %d, %Y\") | h}</dd></dl></li>\n\t\t\t\t% endfor\n\t\t\t</ul>\n\t\t\t% else:\n\t\t\t<p>No past releases.</p>\n\t\t\t% endif\n\n\t\t\t<h3>Unassigned Issues</h3>\n\t\t\t<% unassigned_issues = filter(lambda issue: issue[\"release\"] == None, issues) %>\n\t\t\t% if len(unassigned_issues):\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t% for issue in sorted(unassigned_issues, lambda lhs, rhs: cmp(lhs[\"creation_time\"], rhs[\"creation_time\"]), reverse=True):\n\t\t\t\t\t<tr><td>${issue['creation_time'].date() | h}</td><td><a href=\"${issue['filename']}\">${issue['title'] | h}</a></td></tr>\n\t\t\t\t% endfor\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t% else:\n\t\t\t<p>No unassigned issues.</p>\n\t\t\t% endif\n\t\t</div>\n\t\t<div id=\"footer\">\n\t\t\t<p class=\"generated\">${datetime.datetime.utcnow().strftime(\"Updated %B %d, %Y %H:%M UTC\") | h}</p>\n\t\t</div>\n\n\t\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"/>\n\t\t<script type=\"text/javascript\">\n\t\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-1\"); pageTracker._trackPageview(); } catch(err) { }\n\t\t</script>\n\t</body>\n</html>\n\n"
  },
  {
    "path": "web/developer/tracker/release.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D Release ${release[\"name\"] | h}</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"../k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../k3d.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../developer.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"tracker.css\" />\n\t</head>\n\n<%\nimport datetime\n%>\n\n\t<body>\n<%include file=\"navigation.html\"/>\n\n\t\t<div id=\"main\" class=\"tracker\">\n\t\t\t<h2>Release ${release[\"name\"] | h}</h2>\n\n<%\n\nclosed_issues = filter(lambda issue: issue[\"status\"] == \":closed\", issues)\nopen_issues = filter(lambda issue: issue[\"status\"] != \":closed\", issues)\n\nissue_count = len(issues)\nclosed_count = len(closed_issues)\nopen_count = len(open_issues)\n\nclosed_percent = closed_count * 100 / issue_count if issue_count else 100\nopen_percent = open_count * 100 / issue_count if issue_count else 100\n\nkeywords = { \":released\":\"Released\", \":unreleased\":\"Unreleased\" }\n\n%>\n\n\t\t\t<h3>Details</h3>\n\t\t\t<dl>\n\t\t\t\t<dt>Status:</dt>\n\t\t\t\t<dd>${keywords[release[\"status\"]] | h}</dd>\n\n\t\t\t\t<dt>Progress:</dt>\n\t\t\t\t% if release[\"status\"] != \":released\":\n\t\t\t\t<dd><span class=\"progress-closed-issues\">${\"&nbsp;\" * closed_percent}</span><span class=\"progress-open-issues\">${\"&nbsp;\" * open_percent}</span>${closed_count} / ${issue_count | h} (${closed_percent | h}%)</dd>\n\t\t\t\t% else:\n\t\t\t\t<dd>${release[\"release_time\"].strftime(\"Released %B %d, %Y\") | h}</dd>\n\t\t\t\t% endif\n\t\t\t</dl>\n\n\t\t\t<h3>Open Issues</h3>\n\t\t\t% if len(open_issues):\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t% for issue in sorted(open_issues, lambda lhs, rhs: cmp(lhs[\"creation_time\"], rhs[\"creation_time\"]), reverse=True):\n\t\t\t\t\t<tr><td>${issue['creation_time'].date() | h}</td><td><a href=\"${issue['filename']}\">${issue['title'] | h}</a></td></tr>\n\t\t\t\t% endfor\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t% else:\n\t\t\t<p>No open issues.</p>\n\t\t\t% endif\t\n\t\t\t\n\t\t\t<h3>Closed Issues</h3>\n\t\t\t% if len(closed_issues):\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t% for issue in sorted(closed_issues, lambda lhs, rhs: cmp(lhs[\"creation_time\"], rhs[\"creation_time\"]), reverse=True):\n\t\t\t\t\t<tr><td>${issue['creation_time'].date() | h}</td><td><a href=\"${issue['filename']}\">${issue['title'] | h}</a></td></tr>\n\t\t\t\t% endfor\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t% else:\n\t\t\t<p>No closed issues.</p>\n\t\t\t% endif\n\n\t\t\t<h3>Release Log</h3>\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t% for event in release[\"log_events\"]:\n\t\t\t\t\t<tr><td>${event[0].strftime(\"%Y-%m-%d %H:%M UTC\") | h}</td><td>${event[1] | h}</td><td>${event[2] | h}</td></tr>\n\t\t\t\t% endfor\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t\t<div id=\"footer\">\n\t\t\t<p class=\"generated\">${datetime.datetime.utcnow().strftime(\"Updated %B %d, %Y %H:%M UTC\") | h}</p>\n\t\t</div>\n\n\t\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"/>\n\t\t<script type=\"text/javascript\">\n\t\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-1\"); pageTracker._trackPageview(); } catch(err) { }\n\t\t</script>\n\t</body>\n</html>\n\n"
  },
  {
    "path": "web/developer/tracker/tracker",
    "content": "#!/usr/bin/python\n\nimport glob\nfrom mako.template import Template\nfrom mako.lookup import TemplateLookup\nimport optparse\nimport sys\nimport yaml\n\nparser = optparse.OptionParser()\nparser.add_option(\"--project\", help=\"Ditz project directory containing project.yaml.\", dest=\"project_directory\", default=\".\")\nparser.add_option(\"--templates\", help=\"Directory containing HTML template files.\", dest=\"template_directory\", default=\".\")\nparser.add_option(\"--output\", help=\"HTML output directory.\", dest=\"output_directory\", default=\".\")\nparser.add_option(\"--html-index\", help=\"HTML index filename.\", dest=\"html_index\", default=\"index.html\")\n(options, args) = parser.parse_args()\n\ndef generic_constructor(loader, node):\n    return loader.construct_mapping(node)\n\nyaml.add_constructor(\"!ditz.rubyforge.org,2008-03-06/project\", generic_constructor)\nyaml.add_constructor(\"!ditz.rubyforge.org,2008-03-06/component\", generic_constructor)\nyaml.add_constructor(\"!ditz.rubyforge.org,2008-03-06/release\", generic_constructor)\nyaml.add_constructor(\"!ditz.rubyforge.org,2008-03-06/issue\", generic_constructor)\n\nproject = yaml.load(file(options.project_directory + \"/project.yaml\", \"r\"))\nproject[\"filename\"] = options.html_index\n\nfor release in project[\"releases\"]:\n\trelease[\"filename\"] = \"release-\" + release[\"name\"] + \".html\"\n\nissues = []\nfor issue in glob.glob(options.project_directory + \"/issue-*.yaml\"):\n\tissue = yaml.load(file(issue, \"r\"))\n\tissue[\"filename\"] = \"issue-\" + issue[\"id\"] + \".html\"\n\tissues.append(issue)\n\t\n\nlookup = TemplateLookup(directories=[options.template_directory])\nproject_template = Template(filename=\"project.html\", output_encoding='utf-8', lookup=lookup)\nfile(options.output_directory + \"/\" + options.html_index, \"w\").write(project_template.render(project=project, issues=issues))\n\nrelease_template = Template(filename=\"release.html\", output_encoding='utf-8', lookup=lookup)\nfor release in project[\"releases\"]:\n\trelease_issues = []\n\tfor issue in issues:\n\t\tif issue[\"release\"] == release[\"name\"]:\n\t\t\trelease_issues.append(issue)\n\n\tfile(options.output_directory + \"/\" + release[\"filename\"], \"w\").write(release_template.render(project=project, release=release, issues=release_issues))\n\nissue_template = Template(filename=\"issue.html\", output_encoding='utf-8', lookup=lookup)\nfor issue in issues:\n\tissue_release = None \n\tfor release in project[\"releases\"]:\n\t\tif issue[\"release\"] == release[\"name\"]:\n\t\t\tissue_release = release\n\n\tfile(options.output_directory + \"/\" + issue[\"filename\"], \"w\").write(issue_template.render(project=project, release=issue_release, issue=issue))\n\n"
  },
  {
    "path": "web/developer/tracker/tracker.css",
    "content": "\n.tracker ul\n{\n  list-style: none;\n  margin-left: 12px;\n}\n\n.progress-closed-issues\n{\n  background-color: #0c0;\n}\n\n.progress-open-issues\n{\n  background-color: #ddd;\n  margin-right: 12px;\n}\n\n"
  },
  {
    "path": "web/k3d.css",
    "content": "body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, textarea, p, blockquote, th, td\n{\n  margin: 0;\n  padding: 0;\n  font-size: 100%;\n}\n\nhtml\n{\n  overflow-y: scroll;\n}\n\nbody\n{\n  font-family: Georgia, Palatino, serif;\n  width: 900px;\n  margin: 0 auto;\n}\n\nh1, h2, h3, h4, h5, h6\n{\n  font-family: Arial, Helvetica, sans-serif;\n}\n\nh1\n{\n  font-size: 170%;\n}\n\nh2\n{\n  font-size: 150%;\n  padding: 8px 0 8px 0;\n}\n\nh3\n{\n  font-size: 120%;\n}\n\np\n{\n  margin-bottom: 12px;\n}\n\ncaption\n{\n  background-color: darkred;\n  color: white;\n  font-family: Arial, Helvetica, sans-serif;\n  font-size: 110%;\n  font-weight: bold;\n  text-align: center;\n  padding: 3px;\n}\n\ntable\n{\n  margin-top: 4px;\n  margin-bottom: 16px;\n}\n\nth\n{\n  padding: 10px 0 10px 10px;\n}\n\ntd\n{\n  border-bottom: 1px solid #dddddd;\n  padding: 5px 0 5px 10px;\n}\n\ndt\n{\n  float: left;\n  width: 10em;\n  text-align: right;\n  font-weight: bold;\n  margin-right: 16px;\n}\n\ndd\n{\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\na\n{\n  color: DarkRed;\n  font-weight: bold;\n  text-decoration: none;\n}\n\na:hover\n{\n  text-decoration: underline;\n}\n\n.generated\n{\n  font-size: 90%;\n  color: #aaaaaa;\n}\n\n.highlighted\n{\n  background-color: DarkRed;\n  color: White;\n  padding: 4px 8px;\n}\n\n.special-message\n{\n  background-color: #eeeeee;\n  border: 1px solid #aaaaaa;\n  font-size: 105%;\n  margin: 2em;\n  padding: 1em;\n  text-align: center;\n  vertical-align: middle;\n}\n\n.special-message h2\n{\n  margin: 0 0 0.5em 0;\n}\n\n#nav\n{\n  float: left;\n  width: 100%;\n  height: 200px;\n  padding-top: 6px;\n  background: transparent url(\"resources/banner\") no-repeat top;\n}\n\n#nav #logo\n{\n  float: left;\n  width: 130px;\n  height: 55px;\n  background: transparent url(\"logo.png\") no-repeat;\n}\n\n#nav #logo h1\n{\n  display: none;\n}\n\n#nav ul\n{\n  float: left;\n  list-style: none;\n  padding-top: 9px;\n  padding-bottom: 2px;\n  border-bottom: 2px solid #dddddd;\n}\n\n#nav li\n{\n  display: inline;\n  padding: 0 20px 0 0;\n  font-family: Arial, Helvetica, sans-serif;\n  font-weight: bold;\n}\n\n#main\n{\n  clear: both;\n}\n\n#top\n{\n  padding-bottom: 40px;\n  border-bottom: 1px solid #ccc;\n  margin-bottom: 10px;\n}\n\n#top #description\n{\n  float: left;\n  width: 500px;\n}\n\n#top #downloads\n{\n  margin-left: 550px;\n  text-align: center;\n}\n\n#left\n{\n  float: left;\n  width: 500px;\n}\n\n#right\n{\n  margin-left: 550px;\n}\n\n#footer\n{\n  clear: both;\n  margin-top: 24px;\n}\n\ndiv#videos\n{\n  float: left;\n  width: 150px;\n  margin-top: 4em;\n}\n\ndiv#player\n{\n  float: left;\n  width: 750px;\n  margin-top: 1em;\n}\n\nimg.thumbnail\n{\n  background: darkred;\n  padding: 1px;\n  margin: 2px;\n}\n\nimg.thumbnail:hover\n{\n  background: darkred;\n  padding: 3px;\n  margin: 0px;\n}\n\n"
  },
  {
    "path": "web/planet/index.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>Planet K-3D</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"k3d.css\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"planet.css\" />\n<!--\n<link rel=\"alternate\" href=\"<TMPL_VAR feed ESCAPE=\"HTML\">\" title=\"<TMPL_VAR channel_title_plain ESCAPE=\"HTML\">\" type=\"application/<TMPL_VAR feedtype>+xml\">\n-->\n\t</head>\n\n<%\nimport datetime\nimport time\n\ndef entry_date(entry):\n\treturn datetime.date(entry.updated_parsed.tm_year, entry.updated_parsed.tm_mon, entry.updated_parsed.tm_mday)\n%>\n\n<%def name=\"generate_feeds(entries)\">\n\t<%\n\tlast_date = None\n\tlast_source = None\n\t%>\n\t% for i in range(len(entries)):\n\t<%\n\tentry = entries[i]\n\tdate = entry_date(entry)\n\tsource = entry.source\n\t%>\n\n\t% if date != last_date:\n\t<div class=\"date\">\n\t\t<h2>${date.strftime(\"%B %d, %Y\") | h}</h2>\n\t% endif\n\n\t% if source != last_source or date != last_date:\n\t\t<div class=\"channel ${source[\"feed_type\"]}_channel\">\n\t\t\t<h3>\n\t\t\t\t<a class=\"feed_link\" href=\"${source.href | h}\"><span>Feed:</span></a>\n\t\t\t\t<a class=\"feed_title\" href=\"${source.feed.link | h}\"><span>${source[\"custom_title\"]}</span></a>\n\t\t\t</h3>\n\t% endif\n\n\t\t\t<div class=\"entry\">\n\t\t\t\t<h4><a href=\"${entry.link | h}\">${entry.title | h}</a></h4>\n\t\t\t\t% if source[\"feed_type\"] not in [\"wiki\", \"commit\"]:\n\t\t\t\t<div class=\"content\">\n\t\t\t\t\t<p>${entry.content[0].value if entry.has_key(\"content\") else entry.summary}</p>\n\t\t\t\t</div>\n\t\t\t\t% endif\n\t\t\t</div> <!-- entry -->\n\n\t<%\n\tlast_source = source\n\tlast_date = date\n\n\tnext_entry = entries[i+1] if i+1 < len(entries) else None\n\tnext_date = entry_date(next_entry) if next_entry else None\n\tnext_source = next_entry.source if next_entry else None\n\t%>\n\n\t% if source != next_source or date != next_date:\n\t\t</div> <!-- channel -->\n\t% endif\n\n\t% if date != next_date:\n\t</div> <!-- date -->\n\t% endif\n\n\t% endfor\n</%def>\n\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<a id=\"logo\" href=\".\"><h1>Planet K-3D</h1></a>\n\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"http://www.k-3d.org/downloads\">Downloads</a></li>\n\t\t\t\t<li><a href=\"http://www.cafepress.com/shopk3d\">Store</a></li>\n\t\t\t\t<li><a href=\"http://www.k-3d.org/donations\">Donations</a></li>\n\t\t\t\t<li><a href=\"http://www.k-3d.org/wiki\">Wiki</a></li>\n\t\t\t\t<li><a href=\"http://www.k-3d.org/forums\">Forums</a></li>\n\t\t\t\t<li><a href=\"http://www.k-3d.org/blogs\">Blogs</a></li>\n\t\t\t\t<li><a href=\"http://developer.k-3d.org\">Developer</a></li>\n\t\t\t\t<li><a href=\"http://www.k-3d.org\">User</a></li>\n\t\t\t</ul>\n\t\t</div>\n\n\t\t<div id=\"main\">\n\t\t\t<div id=\"left\" class=\"feeds\">\n\t\t\t\t${generate_feeds(filter(lambda entry: entry[\"source\"][\"feed_type\"] != \"commit\", entries))}\n\t\t\t</div>\n\t\t\t<div id=\"right\" class=\"feeds\">\n\t\t\t\t${generate_feeds(filter(lambda entry: entry[\"source\"][\"feed_type\"] == \"commit\", entries))}\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"footer\">\n\t\t\t<p class=\"generated\">${datetime.datetime.utcnow().strftime(\"Updated %B %d, %Y %H:%M UTC\") | h}</p>\n\t\t</div>\n\n\t\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"/>\n\t\t<script type=\"text/javascript\">\n\t\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-4\"); pageTracker._trackPageview(); } catch(err) { }\n\t\t</script>\n\t</body>\n</html>\n\n"
  },
  {
    "path": "web/planet/planet",
    "content": "#!/usr/bin/python\n\nimport feedparser\nimport mako.template\nimport optparse\nimport sys\n\nparser = optparse.OptionParser()\nparser.add_option(\"--templates\", help=\"Directory containing HTML template files.\", dest=\"template_directory\", default=\".\")\nparser.add_option(\"--output\", help=\"HTML output directory.\", dest=\"output_directory\", default=\".\")\nparser.add_option(\"--html-index\", help=\"HTML index filename.\", dest=\"html_index\", default=\"index.html\")\n(options, args) = parser.parse_args()\n\ndef define_feed(feed, type, title):\n\tresult = feedparser.parse(feed)\n\tresult[\"feed_type\"] = type\n\tresult[\"custom_title\"] = title\n\treturn result\n\nsources = []\nsources.append(define_feed(\"http://k-3d.org/blogs/feed\", \"blog\", \"K-3D Blogs\"))\nsources.append(define_feed(\"http://k-3d.org/blogs/barche/feed\", \"blog\", \"Bart Janssens' Blog\"))\nsources.append(define_feed(\"http://k-3d.org/blogs/dsmatthews/feed\", \"blog\", \"Dan Matthews' Blog\"))\nsources.append(define_feed(\"http://k-3d.org/blogs/joetainment/feed\", \"blog\", \"Joe Crawford's Blog\"))\nsources.append(define_feed(\"http://k-3d.org/blogs/tshead/feed\", \"blog\", \"Tim Shead's Blog\"))\nsources.append(define_feed(\"http://www.k-3d.org/forums/rss/topics\", \"forum\", \"K-3D Forums\"))\nsources.append(define_feed(\"http://www.k-3d.org/k3d_wiki/index.php?title=News&feed=atom\", \"wiki\", \"K-3D Wiki\"))\nsources.append(define_feed(\"http://k3d.hg.sf.net/hgweb/k3d/k3d/rss-log\", \"commit\", \"K-3D Repository\"))\nsources.append(define_feed(\"http://code.google.com/feeds/p/k3d-bart/hgchanges/basic\", \"commit\", \"Bart Janssens' Repository\"))\nsources.append(define_feed(\"http://bitbucket.org/tshead/k3d-sandbox/rss/\", \"commit\", \"Tim Shead's Sandbox Repository\"))\n\nentries = []\nfor source in sources:\n\tfor entry in source.entries:\n\t\tentry[\"source\"] = source\n\t\tentries.append(entry)\nentries.sort(lambda lhs, rhs: cmp(lhs.updated_parsed, rhs.updated_parsed), reverse=True)\n\nindex_template = mako.template.Template(filename=options.template_directory + \"/index.html\", output_encoding='utf-8')\nfile(options.output_directory + \"/\" + options.html_index, \"w\").write(index_template.render(sources=sources, entries=entries))\n\n"
  },
  {
    "path": "web/planet/planet.css",
    "content": "#nav\n{\n  height: 70px;\n}\n\n.feeds div.date\n{\n  padding-bottom: 0.8em;\n  border-bottom: 1px solid #cccccc;\n  margin-bottom: 0.4em;\n}\n\n.feeds div.date h2\n{\n  margin-bottom: 0.5em;\n}\n\n.feeds div.channel\n{\n  padding-left: 10px;\n}\n\n.feeds a.feed_link\n{\n  float: left;\n  background: transparent url(\"feed-icon-10x10.png\") no-repeat;\n  width: 10px;\n  height: 10px;\n  color: blue;\n  margin-top: 6px;\n  margin-right: 8px;\n}\n\n.feeds a.feed_link span\n{\n  display: none;\n}\n\n.feeds div.blog_channel\n{\n  border-left: 10px solid #ff8888;\n}\n\n.feeds div.forum_channel\n{\n  border-left: 10px solid #88ff88;\n}\n\n.feeds div.wiki_channel\n{\n  border-left: 10px solid #8888ff;\n}\n\n.feeds div.commit_channel\n{\n  border-left: 10px solid #ffff88;\n}\n\n.feeds div.entry\n{\n  margin-top: 2em;\n}\n\n.feeds .content ul\n{\n  margin-left: 1em;\n}"
  },
  {
    "path": "web/www/donations.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D Donations</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"k3d.css\" />\n\t</head>\n\n\t<body>\n<%include file=\"navigation.html\"/>\n\n\t\t<div id=\"main\">\n\t\t\t<div id=\"top\">\n\t\t\t\t<h2>Donations</h2>\n\n\t\t\t\t<p id=\"donations\">K-3D is a member of the nonprofit\n\t\t\t\t<a href=\"http://conservancy.softwarefreedom.org\">Software Freedom Conservancy</a>.\n\t\t\t\tThanks to the Conservancy, donations to support K-3D development are convenient,\n\t\t\t\tand may be tax-exempt in many jursidictions.\n\t\t\t\tThe K-3D project uses donations to further our goal of providing quality Free Software\n\t\t\t\tfor professionals.  Thanks in advance for your interest in supporting K-3D!</p>\n\t\t\t</div>\n\n\t\t\t<div id=\"left\">\n\t\t\t\t<h3>PayPal Donations</h3>\n\n\t\t\t\t<p>Please note: PayPal fees are relatively high, please consider sending a check or wire to\n\t\t\t\tmaximize the benefits of your donation.</p>\n\n\t\t\t\t<p>\n\t\t\t\t<form action=\"https://www.paypal.com/cgi-bin/webscr\" method=\"post\">\n\t\t\t\t<input type=\"hidden\" name=\"cmd\" value=\"_s-xclick\"/>\n\t\t\t\t<input type=\"hidden\" name=\"hosted_button_id\" value=\"5596283\"/>\n\t\t\t\t<input type=\"image\" src=\"https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif\" border=\"0\" name=\"submit\" alt=\"PayPal - The safer, easier way to pay online!\"/>\n\t\t\t\t<img alt=\"\" border=\"0\" src=\"https://www.paypal.com/en_US/i/scr/pixel.gif\" width=\"1\" height=\"1\"/>\n\t\t\t\t</form>\n\t\t\t\t</p>\n\n\t\t\t\t<h3>Check Donations</h3>\n\n\t\t\t\t<p>K-3D can accept check donations drawn in USD from banks in the USA.\n\t\t\t\t(Donations from banks outside of the US or not in USD should be handled\n\t\t\t\tby wire; see <em>Wire Donations</em>).</p>\n\t\t\t\t\t      \n\t\t\t\t<p>Donors should make their check payable to:</p>\n\n\t\t\t\t<pre>\nSoftware Freedom Conservancy, Inc.\n\t\t\t\t</pre>\n\n\t\t\t\t<p>and place</p>\n\n\t\t\t\t<pre>\nDirected donation: K-3D\n\t\t\t\t</pre>\n\n\t\t\t\t<p>in the memo field.  Checks should then be mailed to:</p>\n\n\t\t\t\t<pre>\nSoftware Freedom Conservancy\n1995 BROADWAY FL 17\nNEW YORK NY 10023-5882  USA\n\t\t\t\t</pre>\n\n\n\t\t\t</div>\n\t\t\t<div id=\"right\">\n\t\t\t\t<h3>Google Checkout Donations</h3>\n\n\t\t\t\t<p>Please note: Google Checkout fees are relatively high, please consider sending a check or\n\t\t\t\twire to maximize the benefits of your donation.</p>\n\n\t\t\t\t<p>\n\t\t\t\t<script type=\"text/javascript\"> \n\t\t\t\tfunction validateAmount(amount){\n\t\t\t\t\tif(amount.value.match( /^[0-9]+(\\.([0-9]+))?$/)){\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}else{\n\t\t\t\t\t\talert('You must enter a valid donation.');\n\t\t\t\t\t\tamount.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t</script>\n\t\t\t\t<form action=\"https://checkout.google.com/cws/v2/Donations/622836985124940/checkoutForm\" id=\"BB_BuyButtonForm\" method=\"post\" name=\"BB_BuyButtonForm\" onSubmit=\"return validateAmount(this.item_price_1)\">\n\t\t\t\t    <input name=\"item_name_1\" type=\"hidden\" value=\"K-3D Project via Software Freedom Conservancy, Inc.\"/>\n\t\t\t\t    <input name=\"item_description_1\" type=\"hidden\" value=\"Donation to the Software Freedom Conservancy, Inc. directed for support of the K-3D Project.\"/>\n\t\t\t\t    <input name=\"item_quantity_1\" type=\"hidden\" value=\"1\"/>\n\t\t\t\t    <input name=\"item_currency_1\" type=\"hidden\" value=\"USD\"/>\n\t\t\t\t    <input name=\"item_is_modifiable_1\" type=\"hidden\" value=\"true\"/>\n\t\t\t\t    <input name=\"item_min_price_1\" type=\"hidden\" value=\"5.0\"/>\n\t\t\t\t    <input name=\"item_max_price_1\" type=\"hidden\" value=\"25000.0\"/>\n\t\t\t\t    <input name=\"_charset_\" type=\"hidden\" value=\"utf-8\"/>\n\t\t\t\t    <table cellpadding=\"5\" cellspacing=\"0\" width=\"1%\">\n\t\t\t\t\t<tr>\n\t\t\t\t\t    <td align=\"right\" nowrap=\"nowrap\" width=\"1%\">&#x24; <input id=\"item_price_1\" name=\"item_price_1\" onfocus=\"this.style.color='black'; this.value='';\" size=\"6\" type=\"text\" value=\"50.00\"/>\n\t\t\t\t\t    </td>\n\t\t\t\t\t    <td align=\"left\" width=\"1%\">\n\t\t\t\t\t\t<input alt=\"Donate\" src=\"https://checkout.google.com/buttons/donateNow.gif?merchant_id=622836985124940&amp;w=115&amp;h=50&amp;style=white&amp;variant=text&amp;loc=en_US\" type=\"image\"/>\n\t\t\t\t\t    </td>\n\t\t\t\t\t</tr>\n\t\t\t\t    </table>\n\t\t\t\t</form>\n\t\t\t\t</p>\n\n\t\t\t\t<h3>Wire Donations</h3>\n\n\t\t\t\t<p>K-3D can accept donations via wire, but instructions must be sent on a\n\t\t\t\tcase-by-case basis as they are different depending on the country of origin.\n\t\t\t\tDonors wishing to send a wire should contact:</p>\n\n\t\t\t\t<pre>\nconservancy@softwarefreedom.org\n\t\t\t\t</pre>\n\n\t\t\t\t<p>for instructions.  Please be sure to mention that your donation is for K-3D.</p>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"/>\n\t\t<script type=\"text/javascript\">\n\t\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-1\"); pageTracker._trackPageview(); } catch(err) { }\n\t\t</script>\n\t</body>\n</html>\n\n"
  },
  {
    "path": "web/www/downloads.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D Downloads</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"k3d.css\" />\n\t</head>\n\n\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"/>\n\t<script type=\"text/javascript\">\n\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-1\"); pageTracker._trackPageview(); } catch(err) { }\n\t</script>\n\n\t<body>\n<%include file=\"navigation.html\"/>\n\n\t\t<div id=\"main\">\n\t\t\t<div id=\"left\">\n\t\t\t\t<h2>Getting started</h2>\n\n\t\t\t\t<p>K-3D is written in C++ with platform independence in mind.\n\t\t\t\tAs a result, K-3D is available for\n\t\t\t\t<a href=\"http://www.linux.org\">GNU/Linux</a>,\n\t\t\t\t<a href=\"http://www.apple.com\">MacOS X</a>,\n\t\t\t\t<a href=\"http://www.freebsd.org\">FreeBSD</a>,\n\t\t\t\t<a href=\"http://www.microsoft.com/windows\">Microsoft Windows</a>,\n\t\t\t\tand others.</p>\n\n\t\t\t\t<p>You can either download a binary package for the system of your choice or\n\t\t\t\tbuild K-3D from sources.</p>\n\n\t\t\t\t<p>Packages for common Linux distributions can be\n\t\t\t\tinstalled using the system specific package managers.</p>\n\t\t\t</div>\n\n\t\t\t<div id=\"right\">\n\t\t\t\t<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" class=\"latest\" width=\"100%\">\n\t\t\t\t\t<caption>K-3D Downloads</caption>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr><td>Windows</td><td><a href=\"http://sourceforge.net/projects/k3d/files/K-3D%20Win32%20Binaries/K-3D%200.8.0.1/k3d-setup-0.8.0.1.exe/download\" onClick=\"javascript: pageTracker._trackPageview('/downloads/windows/0.8.0.1.exe');\">Download 0.8.0.1</a></td></tr>\n\t\t\t\t\t\t<tr><td>Mac OS X 10.5</td><td><a href=\"https://sourceforge.net/projects/k3d/files/K-3D%20Mac%20OSX%20Binaries/K-3D%200.8.0.1/k3d-setup-0.8.0.1-i386.dmg/download\" onClick=\"javascript: pageTracker._trackPageview('/downloads/osx/0.8.0.1-i386.dmg');\">Download 0.8.0.1</a></td></tr>\n\t\t\t\t\t\t<tr><td>Debian / Ubuntu</td><td>$ apt-get install k3d</td></tr>\n\t\t\t\t\t\t<tr><td>Fedora</td><td>$ yum install k3d</td></tr>\n\t\t\t\t\t\t<tr><td>Gentoo</td><td>$ emerge k3d</td></tr>\n\t\t\t\t\t\t<tr><td>FreeBSD</td><td>$ pkg_add -r k3d</td></tr>\n\t\t\t\t\t\t<tr><td>Source Code</td><td><a href=\"https://sourceforge.net/projects/k3d/files/K-3D%20Source/K-3D%200.8.0.1/k3d-source-0.8.0.1.tar.bz2/download\" onClick=\"javascript: pageTracker._trackPageview('/downloads/source/0.8.0.1.tar.gz');\">Download 0.8.0.1</a><br/><a href=\"http://developer.k-3d.org\">Build Instructions</a></td></tr>\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n</html>\n\n"
  },
  {
    "path": "web/www/index.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"k3d.css\" />\n\t</head>\n\n\t<body>\n<%include file=\"navigation.html\"/>\n\n\t\t<div id=\"main\">\n\t\t\t<div id=\"top\">\n\t\t\t\t<div>\n\t\t\t\t\t<h2>Seven Degrees of Freedom</h2>\n\n\t\t\t\t\t<p id=\"description\">K-3D is free-as-in-freedom 3D modeling and animation software.\n\t\t\t\t\tIt combines flexible plugins with a visualization pipeline architecture,\n\t\t\t\t\tmaking K-3D a versatile and powerful tool for artists.</p>\n\n\t\t\t\t\t<div id=\"downloads\">\n\t\t\t\t\t\t<p>K-3D 0.8 was released on April 20, 2010. See the <a href=\"wiki/Release_Notes\">Release Notes</a> for details.</p>\n\t\t\t\t\t\t<a href=\"downloads\"><h3 class=\"highlighted\">Download K-3D 0.8 Now!</h3></a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div id=\"left\">\n\t\t\t\t<h2>Easy</h2>\n\t\t\t\t<p>K-3D's interface uses your platform's look-and-feel, and it's consistent with\n\t\t\t\tthe applications you already know.  New artists will find K-3D easy to understand,\n\t\t\t\tand professionals feel right at home. K-3D is intuitive, consistent, and discoverable.</p>\n\n\t\t\t\t<h2>Powerful</h2>\n\t\t\t\t<p>K-3D features procedural and parametric workflows. Properties can be adjusted\n\t\t\t\tinteractively and results appear immediately.  The powerful, node-based visualization\n\t\t\t\tpipeline allows more possibilities than traditional modifier stacks or histories.\n\t\t\t\tSelection flows from one modifier to the next.</p>\n\n\t\t\t\t<p>An advanced undo/redo system ensures you can always go back, and the pioneering undo\n\t\t\t\ttree means you can always go forward, even where other programs lose the ability to redo.</p>\n\n\t\t\t\t<p>Industrial-strength standards form the foundation on which K-3D builds - including\n\t\t\t\tnative RenderMan(TM) support that integrates tightly with the K-3D user interface.</p>\n\t\t\t</div>\n\t\t\t<div id=\"right\">\n\n\t\t\t\t<h2>Flexible</h2>\n\t\t\t\t<p>Get all the power of a node-based visualization pipeline: connect anything to anything else.\n\t\t\t\tK-3D gives you the freedom to create combinations never before seen.</p>\n\n\t\t\t\t<p>Work on one side of a model, show the other side mirrored, and see the end result welded\n\t\t\t\ttogether as a subdivision surface in realtime.  Using K-3D, complex workflows are easy to create\n\t\t\t\tand understand.  Go back, modify the beginning of a workflow, and watch as changes propagate\n\t\t\t\tautomatically to the end.</p>\n\n\t\t\t\t<h2>Free</h2>\n\t\t\t\t<p>K-3D is Free Software. Run it on your choice of platform.  Adapt it for any purpose.\n\t\t\t\tReceive it at no cost.  Share it with your friends.  All of the K-3D source code is\n\t\t\t\tavailable under the <a href=\"http://www.gnu.org/licenses/gpl-faq.html\">GNU General Public License</a>.</p>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"/>\n\t\t<script type=\"text/javascript\">\n\t\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-1\"); pageTracker._trackPageview(); } catch(err) { }\n\t\t</script>\n\t</body>\n</html>\n\n"
  },
  {
    "path": "web/www/maintenance.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"k3d.css\" />\n\t</head>\n\n\t<body>\n\t\t<div class=\"special-message\">\n\t\t<h2>www.k-3d.org is undergoing maintenance</h2>\n\t\tYou may still access K-3D downloads, mailing lists, and more via <a href=\"http://www.sourceforge.net/projects/k3d\">SourceForge K-3D</a>\n\t\t</div>\n\n\t\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"/>\n\t\t<script type=\"text/javascript\">\n\t\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-1\"); pageTracker._trackPageview(); } catch(err) { }\n\t\t</script>\n\t</body>\n</html>\n\n"
  },
  {
    "path": "web/www/navigation.html",
    "content": "\t\t<div id=\"nav\">\n\t\t\t<a id=\"logo\" href=\".\"><h1>K-3D</h1></a>\n\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"downloads\">Downloads</a></li>\n\t\t\t\t<li><a href=\"video\">Video</a></li>\n\t\t\t\t<li><a href=\"http://www.cafepress.com/shopk3d\">Store</a></li>\n\t\t\t\t<li><a href=\"donations\">Donations</a></li>\n\t\t\t\t<li><a href=\"wiki\">Wiki</a></li>\n\t\t\t\t<li><a href=\"forums\">Forums</a></li>\n\t\t\t\t<li><a href=\"blogs\">Blogs</a></li>\n\t\t\t\t<li><a href=\"http://developer.k-3d.org\">Developer</a></li>\n\t\t\t</ul>\n\t\t</div>\n"
  },
  {
    "path": "web/www/resources/banner",
    "content": "#!/usr/bin/python\n\n#import cgitb; cgitb.enable()\n\nimport mimetypes\nimport os\nimport random\n\nimage = random.choice(os.listdir(\"banners\"))\nprint \"Content-Type: %s\" % mimetypes.guess_type(image)[0]\nprint \"Cache-Control: max-age=300\"\nprint \"\"\nprint file(\"banners/\" + image, \"rb\").read()\n\n"
  },
  {
    "path": "web/www/video.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t\t<title>K-3D</title>\n\t\t<link rel=\"icon\" type=\"image/png\" href=\"k3d.png\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"k3d.css\" />\n\t</head>\n\n\t<body>\n<%include file=\"navigation.html\"/>\n\n\t\t<div id=\"main\">\n\t\t\t\t<div>\n\t\t\t\t\t<div id=\"videos\">\n\t\t\t\t\t\t<ul id=\"thumbnails\">\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div id=\"player\">\n\t\t\t\t\t\t<div id=\"video_metadata\">\n\t\t\t\t\t\t\t<h4 id=\"video_name\"></h4>\n\t\t\t\t\t\t\t<p id=\"video_description\"></p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div id=\"video_content\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t</div>\n\n\t\t<script type=\"text/javascript\">\n\t\t\tvar videos = [\n\t\t\t\t{id:\"Jz-vUn0ajk8\",name:\"K-3D Mug Tutorial\",description:\"A simple introduction to K-3D modeling.\"},\n\t\t\t\t{id:\"0o99IJIQZmM\",name:\"K-3D Subdivision Surface Introduction\",description:\"Demonstrates realtime editing of subdivision surfaces.\"},\n\t\t\t\t{id:\"s9b0jj82us4\",name:\"K-3D / Aqsis Integration\",description:\"Shows some experimental work to embed Aqsis into K-3D.\"}\n\t\t\t\t];\n\n\t\t\tfor(i in videos)\n\t\t\t{\n\t\t\t\tvideo = videos[i];\n\t\t\t\tthumbnail = new Image();\n\t\t\t\tthumbnail.className = \"thumbnail\";\n\t\t\t\tthumbnail.video = video;\n\t\t\t\tthumbnail.src = \"http://img.youtube.com/vi/\" + video.id + \"/default.jpg\";\n\t\t\t\tthumbnail.onclick=function() { show_video(this.video); };\n\t\t\t\tdocument.getElementById(\"thumbnails\").appendChild(thumbnail);\n\t\t\t}\n\n\t\t\tshow_video(videos[0]);\n\n\t\t\tfunction show_video(video)\n\t\t\t{\n\t\t\t\tdocument.getElementById(\"video_name\").innerHTML = video.name;\n\t\t\t\tdocument.getElementById(\"video_description\").innerHTML = video.description;\n\t\t\t\tdocument.getElementById(\"video_content\").innerHTML = \"<object width='750' height='440'><param name='movie' value='http://www.youtube-nocookie.com/v/\" + video.id + \"&hl=en_US&fs=1&rel=0&hd=1&showinfo=0'></param><param name='allowFullScreen' value='true'></param><param name='allowscriptaccess' value='always'></param><embed src='http://www.youtube-nocookie.com/v/\" + video.id + \"&hl=en_US&fs=1&rel=0&hd=1&showinfo=0' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' width='750' height='440'></embed></object>\";\n\t\t\t}\n\t\t</script>\n\n\t\t<script type=\"text/javascript\" src=\"http://www.google-analytics.com/ga.js\"></script>\n\t\t<script type=\"text/javascript\">\n\t\t\ttry { var pageTracker = _gat._getTracker(\"UA-3773195-1\"); pageTracker._trackPageview(); } catch(err) { }\n\t\t</script>\n\t</body>\n</html>\n\n"
  }
]